diff --git a/docs/get_started.ipynb b/docs/get_started.ipynb index 8a20736d01..1cfac6fff3 100644 --- a/docs/get_started.ipynb +++ b/docs/get_started.ipynb @@ -4,7 +4,6 @@ "metadata": { "colab": { "name": "get_started.ipynb", - "version": "0.3.2", "provenance": [], "collapsed_sections": [], "toc_visible": true @@ -16,23 +15,23 @@ }, "cells": [ { + "cell_type": "markdown", "metadata": { "id": "SB93Ge748VQs", "colab_type": "text" }, - "cell_type": "markdown", "source": [ "##### Copyright 2019 The TensorFlow Authors." ] }, { + "cell_type": "code", "metadata": { "id": "0sK8X2O9bTlz", "colab_type": "code", "cellView": "form", "colab": {} }, - "cell_type": "code", "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", @@ -50,11 +49,11 @@ "outputs": [] }, { + "cell_type": "markdown", "metadata": { "id": "HEYuO5NFwDK9", "colab_type": "text" }, - "cell_type": "markdown", "source": [ "# Get started with TensorBoard\n", "\n", @@ -72,11 +71,11 @@ ] }, { + "cell_type": "markdown", "metadata": { "id": "56V5oun18ZdZ", "colab_type": "text" }, - "cell_type": "markdown", "source": [ "In machine learning, to improve something you often need to be able to measure it. TensorBoard is a tool for providing the measurements and visualizations needed during the machine learning workflow. It enables tracking experiment metrics like loss and accuracy, visualizing the model graph, projecting embeddings to a lower dimensional space, and much more.\n", "\n", @@ -84,44 +83,26 @@ ] }, { + "cell_type": "code", "metadata": { "id": "6B95Hb6YVgPZ", "colab_type": "code", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 85 - }, - "outputId": "9f27f106-41e8-40bd-f73d-6abbb1314643" + "colab": {} }, - "cell_type": "code", "source": [ - "try:\n", - " # %tensorflow_version only exists in Colab.\n", - " %tensorflow_version 2.x\n", - "except Exception:\n", - " pass\n", - "\n", "# Load the TensorBoard notebook extension\n", "%load_ext tensorboard" ], - "execution_count": 1, - "outputs": [ - { - "output_type": "stream", - "text": [ - "TensorFlow 2.x selected.\n" - ], - "name": "stdout" - } - ] + "execution_count": 0, + "outputs": [] }, { + "cell_type": "code", "metadata": { "id": "_wqSAZExy6xV", "colab_type": "code", "colab": {} }, - "cell_type": "code", "source": [ "import tensorflow as tf\n", "import datetime" @@ -130,12 +111,12 @@ "outputs": [] }, { + "cell_type": "code", "metadata": { "id": "Ao7fJW1Pyiza", "colab_type": "code", "colab": {} }, - "cell_type": "code", "source": [ "# Clear any logs from previous runs\n", "!rm -rf ./logs/ " @@ -144,26 +125,26 @@ "outputs": [] }, { + "cell_type": "markdown", "metadata": { "id": "z5pr9vuHVgXY", "colab_type": "text" }, - "cell_type": "markdown", "source": [ "Using the [MNIST](https://en.wikipedia.org/wiki/MNIST_database) dataset as the example, normalize the data and write a function that creates a simple Keras model for classifying the images into 10 classes." ] }, { + "cell_type": "code", "metadata": { "id": "j-DHsby18cot", "colab_type": "code", + "outputId": "06db07f0-874a-4e99-a46e-8f9e806d6a53", "colab": { "base_uri": "https://localhost:8080/", "height": 51 - }, - "outputId": "4c910ebd-2c93-4138-fec7-0a36ae3d90bf" + } }, - "cell_type": "code", "source": [ "mnist = tf.keras.datasets.mnist\n", "\n", @@ -178,7 +159,7 @@ " tf.keras.layers.Dense(10, activation='softmax')\n", " ])" ], - "execution_count": 5, + "execution_count": 6, "outputs": [ { "output_type": "stream", @@ -191,21 +172,21 @@ ] }, { + "cell_type": "markdown", "metadata": { "id": "XKUjdIoV87um", "colab_type": "text" }, - "cell_type": "markdown", "source": [ "## Using TensorBoard with Keras Model.fit()" ] }, { + "cell_type": "markdown", "metadata": { "id": "8CL_lxdn8-Sv", "colab_type": "text" }, - "cell_type": "markdown", "source": [ "When training with Keras's [Model.fit()](https://www.tensorflow.org/api_docs/python/tf/keras/models/Model#fit), adding the `tf.keras.callbacks.TensorBoard` callback ensures that logs are created and stored. Additionally, enable histogram computation every epoch with `histogram_freq=1` (this is off by default)\n", "\n", @@ -213,16 +194,16 @@ ] }, { + "cell_type": "code", "metadata": { "id": "WAQThq539CEJ", "colab_type": "code", + "outputId": "1b7ae2c2-3fa6-40cd-9843-22f798c0d1c6", "colab": { "base_uri": "https://localhost:8080/", - "height": 221 - }, - "outputId": "73a348aa-504c-48a7-f720-5dd0478e2aa9" + "height": 224 + } }, - "cell_type": "code", "source": [ "model = create_model()\n", "model.compile(optimizer='adam',\n", @@ -238,22 +219,21 @@ " validation_data=(x_test, y_test), \n", " callbacks=[tensorboard_callback])" ], - "execution_count": 6, + "execution_count": 7, "outputs": [ { "output_type": "stream", "text": [ - "Train on 60000 samples, validate on 10000 samples\n", "Epoch 1/5\n", - "60000/60000 [==============================] - 15s 246us/sample - loss: 0.2217 - accuracy: 0.9343 - val_loss: 0.1019 - val_accuracy: 0.9685\n", + "1875/1875 [==============================] - 8s 4ms/step - loss: 0.2187 - accuracy: 0.9348 - val_loss: 0.1051 - val_accuracy: 0.9696\n", "Epoch 2/5\n", - "60000/60000 [==============================] - 14s 229us/sample - loss: 0.0975 - accuracy: 0.9698 - val_loss: 0.0787 - val_accuracy: 0.9758\n", + "1875/1875 [==============================] - 7s 4ms/step - loss: 0.0954 - accuracy: 0.9706 - val_loss: 0.0810 - val_accuracy: 0.9741\n", "Epoch 3/5\n", - "60000/60000 [==============================] - 14s 231us/sample - loss: 0.0718 - accuracy: 0.9771 - val_loss: 0.0698 - val_accuracy: 0.9781\n", + "1875/1875 [==============================] - 8s 4ms/step - loss: 0.0698 - accuracy: 0.9784 - val_loss: 0.0698 - val_accuracy: 0.9783\n", "Epoch 4/5\n", - "60000/60000 [==============================] - 14s 227us/sample - loss: 0.0540 - accuracy: 0.9820 - val_loss: 0.0685 - val_accuracy: 0.9795\n", + "1875/1875 [==============================] - 8s 4ms/step - loss: 0.0532 - accuracy: 0.9828 - val_loss: 0.0689 - val_accuracy: 0.9785\n", "Epoch 5/5\n", - "60000/60000 [==============================] - 14s 228us/sample - loss: 0.0433 - accuracy: 0.9862 - val_loss: 0.0623 - val_accuracy: 0.9823\n" + "1875/1875 [==============================] - 8s 4ms/step - loss: 0.0443 - accuracy: 0.9861 - val_loss: 0.0740 - val_accuracy: 0.9781\n" ], "name": "stdout" }, @@ -261,55 +241,242 @@ "output_type": "execute_result", "data": { "text/plain": [ - "" + "" ] }, "metadata": { "tags": [] }, - "execution_count": 6 + "execution_count": 7 } ] }, { + "cell_type": "markdown", "metadata": { "id": "asjGpmD09dRl", "colab_type": "text" }, - "cell_type": "markdown", "source": [ "Start TensorBoard through the command line or within a notebook experience. The two interfaces are generally the same. In notebooks, use the `%tensorboard` line magic. On the command line, run the same command without \"%\"." ] }, { + "cell_type": "code", "metadata": { "id": "A4UKgTLb9fKI", "colab_type": "code", - "colab": {} + "colab": { + "resources": { + "https://localhost:6006/": { + "data": "PCFkb2N0eXBlIGh0bWw+PCEtLQpAbGljZW5zZQpDb3B5cmlnaHQgMjAxNiBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLT48bWV0YSBjaGFyc2V0PSJ1dGYtOCI+Cjx0aXRsZT5UZW5zb3JCb2FyZDwvdGl0bGU+CjxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNUUFBQURFQ0FNQUFBRDNlSDVaQUFBQUJHZEJUVUVBQUxHUEMveGhCUUFBQUFGelVrZENBSzdPSE9rQUFBRC9VRXhVUmZGbEtmYUVMdkZtS2ZOeUsvNjdOdldBTGY2OE52NjlOdk54Sy8yME5meXlOUDIyTmZOMEsvSnJLdnFoTXYyek5mMjVOZjI0TmYyM05mZU9ML3l6TlB5dk5QSm9LdmlXTVBtZU1mTjFLL1dCTGZlUEwvRm5LZmVNTC9xbE12UjdMUG1jTWZlTEwvYUpMdlI1TFBGb0tmSnVLdlIzTFA2Nk52eXdOUGVOTC9WL0xmYUlMdjIxTmYyNk5mTnpLL052Sy9SNkxQbWFNZnl4TlBxZk12VitMZnVyTS9pU01QbWJNZkp2S3ZtZE1mdW1NL3FpTXZtWk1meXROUEpxS3Z5c05QTjJLL2lZTVBOd0svdXBNL0p0S3ZKc0t2aVZNUGFITHZhR0x2SnBLdlI4TFBhS0x2cWtNdnVxTS9hRkx2UjRMUHVvTS9pVE1QV0RMZmlSTVBtWU1YUzBuZ2tBQUFMb1NVUkJWSGphN2RybmN0cEFGSWJoRlVJU1NLSjNNS1lhMCt5NHhUVzk5MzcvMTVKa0pobFRqaHJTckhSbXZ1Zi9hczZMMFlMRkNnRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1CSjZuamVucXNwemduUHJzckdYOVpwaTJ0Q3JtbmM2K2RZTnRoVlk1V3BNbXhRTFdQZE1zT3VZVnd6TmozZWkydDNtUXdhVjQzQkpQRENTMk5iSjVhRWV1WC8rOXFjalFPdGZGSWtJa3J2WTJnNE1WY21PQnNGV2Jvd0tPL2tOeWo2MmdScEpjRGFQQmx4THIxQjB6ZEcwQy84THpiSmlKcnNodXZ5MWd6bEE5K3JEOG1Ja3V5SUpqRkUzL2Rxbll3b1NtN0lVRVBvRC93dXQ4aUlndVNJRGpsRnhlL3lmWEw1dnVTSTIxQlRaTExoWG9PSUxNTzhIeHdhL0w4YkkwTGZtVWRoR293YjJadlQwZTU3cEZORGdCMDZJbFZ5am1tSUJsMlQvbmw5Unc2U0Q5R2dTRy9RMHVRa2FXM1hobW92S1EzZUZRNE4yVW85T1ExZUZac05lcmY3dlArck80cmhtWTFMZzN2RlZvUDgrOEJYZzFzRm53Ym5DazROVGhXOEd1aUtCRGRrVlZ0VE5Gdk5lbFZzTnFUYnlXbklPTTJvZVRSb3lXdndtcEpIZy91Y1hCcmNKdVhUNER3cnB3WmkydnkwVkN4OFl0WGcvRDJiVTRPZml1UTNlRmZFMktENGJmQ3FpTE5COTkzZ1hzR2x3YTJDVDROekJhY0dJVlE2WXNpcFFkaDB4RWRPRFVLakl4clNwODhvblo4emJiRkxnMURvaUZPNUJYdkRHdjJNeTkvSmhVVDhKVVpUSTB5RGFOSExCeklidnFURE5ZaFVpVncva2RqUTFrTTJDSEZEUGpLVytLenlSVEYwZy9nYTl3OXkrZkFOUXB4dlg4Q1UrTnk3RlVXRGVGM1krZzNsUk9JZjRrMFVEWDllQ3l2TzUzMVB5WWhIZ2E5enZQWkpVNWI3M1kvZVhqOEh2OUQ0OG42SGFGNUxiY2pSdDhUWlR0ZGE1TTFEZlhuYmtYMUMwU0hDRkt6UUI1RmU4b3A0R05HTkhhdnZaRVNiVndUNXI2VzF4eXVDUEJZM1k5WWdEcXprbkgvZTNZZk56enVMMzBsMEllYnJaNWtLdHVESVh0MW44NjhFVDZrZjMvNDl0THZyQ2NaeUY4UHUyMTVkQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFjUEliTnJCaE9hQlh1Y29BQUFBQVNVVk9SSzVDWUlJPSI+CjxsaW5rIHJlbD0iYXBwbGUtdG91Y2gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNUUFBQURFQ0FNQUFBRDNlSDVaQUFBQUJHZEJUVUVBQUxHUEMveGhCUUFBQUFGelVrZENBSzdPSE9rQUFBRC9VRXhVUmZGbEtmYUVMdkZtS2ZOeUsvNjdOdldBTGY2OE52NjlOdk54Sy8yME5meXlOUDIyTmZOMEsvSnJLdnFoTXYyek5mMjVOZjI0TmYyM05mZU9ML3l6TlB5dk5QSm9LdmlXTVBtZU1mTjFLL1dCTGZlUEwvRm5LZmVNTC9xbE12UjdMUG1jTWZlTEwvYUpMdlI1TFBGb0tmSnVLdlIzTFA2Nk52eXdOUGVOTC9WL0xmYUlMdjIxTmYyNk5mTnpLL052Sy9SNkxQbWFNZnl4TlBxZk12VitMZnVyTS9pU01QbWJNZkp2S3ZtZE1mdW1NL3FpTXZtWk1meXROUEpxS3Z5c05QTjJLL2lZTVBOd0svdXBNL0p0S3ZKc0t2aVZNUGFITHZhR0x2SnBLdlI4TFBhS0x2cWtNdnVxTS9hRkx2UjRMUHVvTS9pVE1QV0RMZmlSTVBtWU1YUzBuZ2tBQUFMb1NVUkJWSGphN2RybmN0cEFGSWJoRlVJU1NLSjNNS1lhMCt5NHhUVzk5MzcvMTVKa0pobFRqaHJTckhSbXZ1Zi9hczZMMFlMRkNnRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1CSjZuamVucXNwemduUHJzckdYOVpwaTJ0Q3JtbmM2K2RZTnRoVlk1V3BNbXhRTFdQZE1zT3VZVnd6TmozZWkydDNtUXdhVjQzQkpQRENTMk5iSjVhRWV1WC8rOXFjalFPdGZGSWtJa3J2WTJnNE1WY21PQnNGV2Jvd0tPL2tOeWo2MmdScEpjRGFQQmx4THIxQjB6ZEcwQy84THpiSmlKcnNodXZ5MWd6bEE5K3JEOG1Ja3V5SUpqRkUzL2Rxbll3b1NtN0lVRVBvRC93dXQ4aUlndVNJRGpsRnhlL3lmWEw1dnVTSTIxQlRaTExoWG9PSUxNTzhIeHdhL0w4YkkwTGZtVWRoR293YjJadlQwZTU3cEZORGdCMDZJbFZ5am1tSUJsMlQvbmw5Unc2U0Q5R2dTRy9RMHVRa2FXM1hobW92S1EzZUZRNE4yVW85T1ExZUZac05lcmY3dlArck80cmhtWTFMZzN2RlZvUDgrOEJYZzFzRm53Ym5DazROVGhXOEd1aUtCRGRrVlZ0VE5Gdk5lbFZzTnFUYnlXbklPTTJvZVRSb3lXdndtcEpIZy91Y1hCcmNKdVhUNER3cnB3WmkydnkwVkN4OFl0WGcvRDJiVTRPZml1UTNlRmZFMktENGJmQ3FpTE5COTkzZ1hzR2x3YTJDVDROekJhY0dJVlE2WXNpcFFkaDB4RWRPRFVLakl4clNwODhvblo4emJiRkxnMURvaUZPNUJYdkRHdjJNeTkvSmhVVDhKVVpUSTB5RGFOSExCeklidnFURE5ZaFVpVncva2RqUTFrTTJDSEZEUGpLVytLenlSVEYwZy9nYTl3OXkrZkFOUXB4dlg4Q1UrTnk3RlVXRGVGM1krZzNsUk9JZjRrMFVEWDllQ3l2TzUzMVB5WWhIZ2E5enZQWkpVNWI3M1kvZVhqOEh2OUQ0OG42SGFGNUxiY2pSdDhUWlR0ZGE1TTFEZlhuYmtYMUMwU0hDRkt6UUI1RmU4b3A0R05HTkhhdnZaRVNiVndUNXI2VzF4eXVDUEJZM1k5WWdEcXprbkgvZTNZZk56enVMMzBsMEllYnJaNWtLdHVESVh0MW44NjhFVDZrZjMvNDl0THZyQ2NaeUY4UHUyMTVkQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFjUEliTnJCaE9hQlh1Y29BQUFBQVNVVk9SSzVDWUlJPSI+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8c3R5bGU+CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vdVlFQ01Lb0hjTzl4MXdkbWJ5SEltMy1fa2Y2QnlZTzZDTFlkQjRIUUUtWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL3NUZGFBNmowUHNiOTIwVmp2LW1yekgtX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9fVllGeC1zODI0a1hxX1VsMkJIcVlILV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by90bmo0U0I2RE5iZGFRbnNNOENGcUJYLV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9vTU1nZlpNUXRoT3J5UW85bjIyZGN1dnZEaW4xcEs4YUt0ZUxwZVo1YzBBLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9Lc19jVnhpQ2l3VVdWc0ZXRkEzQmpuLV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL05KNHZ4bGdXd1diRXN2MThkQWhxbm4tX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vaXNaLXdiQ1hOS0FibmpvNl9Ud0hUb1gwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vNzdGWEZqUmJHek40YUNyU0ZobGgzb1gwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8valNOMkNHVkRiY1Z5Q25mSmZqU2RmSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9VWDZpNEp4UURtM2ZWVGMxQ1B1d3FvWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL2QtNklZcGxPRm9jQ2FjS3p4d1hTT0pCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vOTd1YWh4aXFaUm9uY0JhQ0VJM2FXNFgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL1B3WmMtWWJJTDQxNHdCOXJCMUlBUFlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQzE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0NfWnJhUjJUZzh3Mmx6bTdrTE5MMC13LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDd3RfUm02OTFMVGViS2ZZMlprS1NtSS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDMUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDNGdwOVE4Z2JZcmhxR2xSYXZfSVhmay53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDNkU4a000eFdSMV8xYllVUlJvalJHYy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0M5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PcFhVcVRvMFVnUVFoR2pfU0ZkTFdCa0F6NHJZbjQ3WnkycnZpZ1dRZjZ3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vV3hyWEphMEMzS2R0QzdsTWFmRzRkUmtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL2NES2hSYVhuUVRPVmJhb3h3ZE9yOXhrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzFoWmYwMlBPQU5oMzJrMlZrZ0VvVUJrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3ZQY3luU0wwcUhxXzZkWDdsS1ZCeVhZaGpiU3B2YzQ3ZWU2eFJfODBIbncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3ZTenVsZktTSzBMTGpqZmVheGNSRWhrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vSzIzY3hXVlRySUZENkRKc0VWaTA3UmtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL0ZsNHkwUWRPeHl5VEhFR01YWDhrY1lYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vMGVDNmZsMDZsdVhFWVdwQlNKdlhDSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9JM1Mxd3NnU2c5WUN1clY2UFVrVE9ZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vLUwxNEprMDZtNnBVSEItNW1YUVFuWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL0hnbzEzay10ZlNwbjBxaTFTRmRVZlpCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9QcnUzM3FqU2hwWlNtRzN6NlZZd25ZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9OWURXQmRENGdJcTI2RzVYWWJIc0ZJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdF9acmFSMlRnOHcybHptN2tMTkwwLXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdHd0X1JtNjkxTFRlYktmWTJaa0tTbUkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0MUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQ0Z3A5UThnYllyaHFHbFJhdl9JWGZrLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDZFOGtNNHhXUjFfMWJZVVJSb2pSR2Mud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQ5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9vSGkzMGt3UVd2cENXcUFoekhjQ1NJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vWkxxS2VlbFliQVRHNjBFcFpCU0R5NFgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL214OVVjazZ1QjYzVklLRlluRU1YcllYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL3JHdkhkSm5yMmw3NXFiMFlORDlOeUlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL1J4WkpkbnplbzNSNXpTZXhnZThVVVpCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL29PZUZ3Wk5sclRlZnpMWW1sVlYxVUlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vbWJtaHByTUg2OVppNmVFUEJZVkZoWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMFY0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwZlpyYVIyVGc4dzJsem03a0xOTDAtdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBRdF9SbTY5MUxUZWJLZlkyWmtLU21JLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwVkJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMFlncDlROGdiWXJocUdsUmF2X0lYZmsud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBhRThrTTR4V1IxXzFiWVVSUm9qUkdjLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBkRGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWV9acmFSMlRnOHcybHptN2tMTkwwLXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWXd0X1JtNjkxTFRlYktmWTJaa0tTbUkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZMUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFk0Z3A5UThnYllyaHFHbFJhdl9JWGZrLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTZFOGtNNHhXUjFfMWJZVVJSb2pSR2Mud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFk5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6MXgtTTFJMXc1T01pcW5WRjh4QkxoVS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5Rnp3WGFBWHVwNW1abGZLNnhSTHJoc2NvLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGenduNldxeG8teHd4aWxEWFBVOGNoVlUud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5RnoxVDdhSkxLNm5LcG4zNklNd1RjTU1jLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6Xzc5X1p1VXhDaWdNMkRlc3BUbkZhdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGejRnZDlPRVBVQ04zQWRZVzBlOHRhdDQud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGejhiSVFTWVpuV0xhV0M5UU5DcFRLX1Uud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQo8L3N0eWxlPgoKCjxzdHlsZT4KICBodG1sLAogIGJvZHkgewogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGhlaWdodDogMTAwJTsKICAgIGZvbnQtZmFtaWx5OiBSb2JvdG8sIHNhbnMtc2VyaWY7CiAgfQo8L3N0eWxlPgoKCgoKCgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIFtoaWRkZW5dIHsKICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKCiAgICAgIC0tbGF5b3V0OiB7CiAgICAgICAgZGlzcGxheTogLW1zLWZsZXhib3g7CiAgICAgICAgZGlzcGxheTogLXdlYmtpdC1mbGV4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH07CgogICAgICAtLWxheW91dC1pbmxpbmU6IHsKICAgICAgICBkaXNwbGF5OiAtbXMtaW5saW5lLWZsZXhib3g7CiAgICAgICAgZGlzcGxheTogLXdlYmtpdC1pbmxpbmUtZmxleDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWhvcml6b250YWw6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaG9yaXpvbnRhbC1yZXZlcnNlOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXZlcnRpY2FsOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXZlcnRpY2FsLXJldmVyc2U6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtd3JhcDogewogICAgICAgIC1tcy1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtd3JhcC1yZXZlcnNlOiB7CiAgICAgICAgLW1zLWZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LWF1dG86IHsKICAgICAgICAtbXMtZmxleDogMSAxIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDEgYXV0bzsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtbm9uZTogewogICAgICAgIC1tcy1mbGV4OiBub25lOwogICAgICAgIC13ZWJraXQtZmxleDogbm9uZTsKICAgICAgICBmbGV4OiBub25lOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleDogewogICAgICAgIC1tcy1mbGV4OiAxIDEgMC4wMDAwMDAwMDFweDsKICAgICAgICAtd2Via2l0LWZsZXg6IDE7CiAgICAgICAgZmxleDogMTsKICAgICAgICAtd2Via2l0LWZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgICAgZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtMjogewogICAgICAgIC1tcy1mbGV4OiAyOwogICAgICAgIC13ZWJraXQtZmxleDogMjsKICAgICAgICBmbGV4OiAyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC0zOiB7CiAgICAgICAgLW1zLWZsZXg6IDM7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAzOwogICAgICAgIGZsZXg6IDM7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTQ6IHsKICAgICAgICAtbXMtZmxleDogNDsKICAgICAgICAtd2Via2l0LWZsZXg6IDQ7CiAgICAgICAgZmxleDogNDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtNTogewogICAgICAgIC1tcy1mbGV4OiA1OwogICAgICAgIC13ZWJraXQtZmxleDogNTsKICAgICAgICBmbGV4OiA1OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC02OiB7CiAgICAgICAgLW1zLWZsZXg6IDY7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA2OwogICAgICAgIGZsZXg6IDY7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTc6IHsKICAgICAgICAtbXMtZmxleDogNzsKICAgICAgICAtd2Via2l0LWZsZXg6IDc7CiAgICAgICAgZmxleDogNzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtODogewogICAgICAgIC1tcy1mbGV4OiA4OwogICAgICAgIC13ZWJraXQtZmxleDogODsKICAgICAgICBmbGV4OiA4OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC05OiB7CiAgICAgICAgLW1zLWZsZXg6IDk7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA5OwogICAgICAgIGZsZXg6IDk7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTEwOiB7CiAgICAgICAgLW1zLWZsZXg6IDEwOwogICAgICAgIC13ZWJraXQtZmxleDogMTA7CiAgICAgICAgZmxleDogMTA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTExOiB7CiAgICAgICAgLW1zLWZsZXg6IDExOwogICAgICAgIC13ZWJraXQtZmxleDogMTE7CiAgICAgICAgZmxleDogMTE7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTEyOiB7CiAgICAgICAgLW1zLWZsZXg6IDEyOwogICAgICAgIC13ZWJraXQtZmxleDogMTI7CiAgICAgICAgZmxleDogMTI7CiAgICAgIH07CgogICAgICAvKiBhbGlnbm1lbnQgaW4gY3Jvc3MgYXhpcyAqLwoKICAgICAgLS1sYXlvdXQtc3RhcnQ6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlcjogewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIH07CgogICAgICAtLWxheW91dC1lbmQ6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWJhc2VsaW5lOiB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGJhc2VsaW5lOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgfTsKCiAgICAgIC8qIGFsaWdubWVudCBpbiBtYWluIGF4aXMgKi8KCiAgICAgIC0tbGF5b3V0LXN0YXJ0LWp1c3RpZmllZDogewogICAgICAgIC1tcy1mbGV4LXBhY2s6IHN0YXJ0OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlci1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWVuZC1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBlbmQ7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1hcm91bmQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogZGlzdHJpYnV0ZTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazoganVzdGlmeTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXItY2VudGVyOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgfTsKCiAgICAgIC8qIHNlbGYgYWxpZ25tZW50ICovCgogICAgICAtLWxheW91dC1zZWxmLXN0YXJ0OiB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zZWxmLWNlbnRlcjogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1lbmQ6IHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXNlbGYtc3RyZXRjaDogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICBhbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1iYXNlbGluZTogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICB9OwoKICAgICAgLyogbXVsdGktbGluZSBhbGlnbm1lbnQgaW4gbWFpbiBheGlzICovCgogICAgICAtLWxheW91dC1zdGFydC1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBzdGFydDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWVuZC1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBlbmQ7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXItYWxpZ25lZDogewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogY2VudGVyOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYmV0d2Vlbi1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBqdXN0aWZ5OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYXJvdW5kLWFsaWduZWQ6IHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGRpc3RyaWJ1dGU7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH07CgogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgT3RoZXIgTGF5b3V0CiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAtLWxheW91dC1ibG9jazogewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaW52aXNpYmxlOiB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1yZWxhdGl2ZTogewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZpdDogewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zY3JvbGw6IHsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH07CgogICAgICAtLWxheW91dC1mdWxsYmxlZWQ6IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgfTsKCiAgICAgIC8qIGZpeGVkIHBvc2l0aW9uICovCgogICAgICAtLWxheW91dC1maXhlZC10b3A6IHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1maXhlZC1yaWdodDogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml4ZWQtYm90dG9tOiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml4ZWQtbGVmdDogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH07CgogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItcmlwcGxlIj4KCiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CgogICAgICAgIC8qIFNlZSBQb2x5bWVyRWxlbWVudHMvcGFwZXItYmVoYXZpb3JzL2lzc3Vlcy8zNC4gT24gbm9uLUNocm9tZSBicm93c2VycywKICAgICAgICAgKiBjcmVhdGluZyBhIG5vZGUgKHdpdGggYSBwb3NpdGlvbjphYnNvbHV0ZSkgaW4gdGhlIG1pZGRsZSBvZiBhbiBldmVudAogICAgICAgICAqIGhhbmRsZXIgImludGVycnVwdHMiIHRoYXQgZXZlbnQgaGFuZGxlciAod2hpY2ggaGFwcGVucyB3aGVuIHRoZQogICAgICAgICAqIHJpcHBsZSBpcyBjcmVhdGVkIG9uIGRlbWFuZCkgKi8KICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2FuaW1hdGluZ10pIHsKICAgICAgICAvKiBUaGlzIHJlc29sdmVzIGEgcmVuZGVyaW5nIGlzc3VlIGluIENocm9tZSAoYXMgb2YgNDApIHdoZXJlIHRoZQogICAgICAgICAgIHJpcHBsZSBpcyBub3QgcHJvcGVybHkgY2xpcHBlZCBieSBpdHMgcGFyZW50ICh3aGljaCBtYXkgaGF2ZQogICAgICAgICAgIHJvdW5kZWQgY29ybmVycykuIFNlZTogaHR0cDovL2pzYmluLmNvbS90ZW1leGEvNAoKICAgICAgICAgICBOb3RlOiBXZSBvbmx5IGFwcGx5IHRoaXMgc3R5bGUgY29uZGl0aW9uYWxseS4gT3RoZXJ3aXNlLCB0aGUgYnJvd3NlcgogICAgICAgICAgIHdpbGwgY3JlYXRlIGEgbmV3IGNvbXBvc2l0aW5nIGxheWVyIGZvciBldmVyeSByaXBwbGUgZWxlbWVudCBvbiB0aGUKICAgICAgICAgICBwYWdlLCBhbmQgdGhhdCB3b3VsZCBiZSBiYWQuICovCiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOwogICAgICB9CgogICAgICAjYmFja2dyb3VuZCwKICAgICAgI3dhdmVzLAogICAgICAud2F2ZS1jb250YWluZXIsCiAgICAgIC53YXZlIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAjYmFja2dyb3VuZCwKICAgICAgLndhdmUgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgICN3YXZlcywKICAgICAgLndhdmUgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC53YXZlLWNvbnRhaW5lciwKICAgICAgLndhdmUgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNpcmNsZSkgI2JhY2tncm91bmQsCiAgICAgIDpob3N0KC5jaXJjbGUpICN3YXZlcyB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICB9CgogICAgICA6aG9zdCguY2lyY2xlKSAud2F2ZS1jb250YWluZXIgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iYmFja2dyb3VuZCI+PC9kaXY+CiAgICA8ZGl2IGlkPSJ3YXZlcyI+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CgogICAgICAtLXNoYWRvdy10cmFuc2l0aW9uOiB7CiAgICAgICAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjI4cyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctbm9uZTogewogICAgICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICAgIH07CgogICAgICAvKiBmcm9tIGh0dHA6Ly9jb2RlcGVuLmlvL3NoeW5kbWFuL3Blbi9jNTM5NGRkZjJlOGIyYTVjOTE4NTkwNGI1NzQyMWNkYiAqLwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDJweCAwIHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCAxcHggNXB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tM2RwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAzcHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCA4cHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi00ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDRweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgMXB4IDEwcHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi02ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDZweCAxMHB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCAxOHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi0xMmRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAxMnB4IDE2cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCA0cHggMjJweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgIDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgIDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTI0ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLW1hdGVyaWFsLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCwgaHRtbCB7CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbDogewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0xOiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTI6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tNGRwOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi02ZHA7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi00OiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLThkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTU6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDsKICAgICAgICB9OwogICAgICB9CiAgICAgIDpob3N0KC5wYXBlci1tYXRlcmlhbCksIC5wYXBlci1tYXRlcmlhbCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWw7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMSJdKSwgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMSJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIyIl0pLCAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIyIl0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOwogICAgICB9CiAgICAgIDpob3N0KC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjMiXSksIC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjMiXSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTM7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iNCJdKSwgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iNCJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI1Il0pLCAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI1Il0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1idXR0b24iPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLW1hdGVyaWFsLXN0eWxlcyI+CiAgICAgIC8qIE5lZWQgdG8gc3BlY2lmeSB0aGUgc2FtZSBzcGVjaWZpY2l0eSBhcyB0aGUgc3R5bGVzIGltcG9ydGVkIGZyb20gcGFwZXItbWF0ZXJpYWwuICovCiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG1pbi13aWR0aDogNS4xNGVtOwogICAgICAgIG1hcmdpbjogMCAwLjI5ZW07CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgICAgZm9udDogaW5oZXJpdDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIG91dGxpbmUtd2lkdGg6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHotaW5kZXg6IDA7CiAgICAgICAgcGFkZGluZzogMC43ZW0gMC41N2VtOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbjsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMSJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTE7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjIiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIzIl0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iNCJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjUiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgOmhvc3QoW3JhaXNlZF0ua2V5Ym9hcmQtZm9jdXMpIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1idXR0b24tcmFpc2VkLWtleWJvYXJkLWZvY3VzOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtyYWlzZWRdKS5rZXlib2FyZC1mb2N1cykgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1mbGF0LWtleWJvYXJkLWZvY3VzOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgYmFja2dyb3VuZDogI2VhZWFlYTsKICAgICAgICBjb2xvcjogI2E4YThhODsKICAgICAgICBjdXJzb3I6IGF1dG87CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2FuaW1hdGVkXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy10cmFuc2l0aW9uOwogICAgICB9CgogICAgICBwYXBlci1yaXBwbGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1idXR0b24taW5rLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewoKICAgICAgLyogTWF0ZXJpYWwgRGVzaWduIGNvbG9yIHBhbGV0dGUgZm9yIEdvb2dsZSBwcm9kdWN0cyAqLwoKICAgICAgLS1nb29nbGUtcmVkLTEwMDogI2Y0YzdjMzsKICAgICAgLS1nb29nbGUtcmVkLTMwMDogI2U2N2M3MzsKICAgICAgLS1nb29nbGUtcmVkLTUwMDogI2RiNDQzNzsKICAgICAgLS1nb29nbGUtcmVkLTcwMDogI2M1MzkyOTsKCiAgICAgIC0tZ29vZ2xlLWJsdWUtMTAwOiAjYzZkYWZjOwogICAgICAtLWdvb2dsZS1ibHVlLTMwMDogIzdiYWFmNzsKICAgICAgLS1nb29nbGUtYmx1ZS01MDA6ICM0Mjg1ZjQ7CiAgICAgIC0tZ29vZ2xlLWJsdWUtNzAwOiAjMzM2N2Q2OwoKICAgICAgLS1nb29nbGUtZ3JlZW4tMTAwOiAjYjdlMWNkOwogICAgICAtLWdvb2dsZS1ncmVlbi0zMDA6ICM1N2JiOGE7CiAgICAgIC0tZ29vZ2xlLWdyZWVuLTUwMDogIzBmOWQ1ODsKICAgICAgLS1nb29nbGUtZ3JlZW4tNzAwOiAjMGI4MDQzOwoKICAgICAgLS1nb29nbGUteWVsbG93LTEwMDogI2ZjZThiMjsKICAgICAgLS1nb29nbGUteWVsbG93LTMwMDogI2Y3Y2I0ZDsKICAgICAgLS1nb29nbGUteWVsbG93LTUwMDogI2Y0YjQwMDsKICAgICAgLS1nb29nbGUteWVsbG93LTcwMDogI2YwOTMwMDsKCiAgICAgIC0tZ29vZ2xlLWdyZXktMTAwOiAjZjVmNWY1OwogICAgICAtLWdvb2dsZS1ncmV5LTMwMDogI2UwZTBlMDsKICAgICAgLS1nb29nbGUtZ3JleS01MDA6ICM5ZTllOWU7CiAgICAgIC0tZ29vZ2xlLWdyZXktNzAwOiAjNjE2MTYxOwoKICAgICAgLyogTWF0ZXJpYWwgRGVzaWduIGNvbG9yIHBhbGV0dGUgZnJvbSBvbmxpbmUgc3BlYyBkb2N1bWVudCAqLwoKICAgICAgLS1wYXBlci1yZWQtNTA6ICNmZmViZWU7CiAgICAgIC0tcGFwZXItcmVkLTEwMDogI2ZmY2RkMjsKICAgICAgLS1wYXBlci1yZWQtMjAwOiAjZWY5YTlhOwogICAgICAtLXBhcGVyLXJlZC0zMDA6ICNlNTczNzM7CiAgICAgIC0tcGFwZXItcmVkLTQwMDogI2VmNTM1MDsKICAgICAgLS1wYXBlci1yZWQtNTAwOiAjZjQ0MzM2OwogICAgICAtLXBhcGVyLXJlZC02MDA6ICNlNTM5MzU7CiAgICAgIC0tcGFwZXItcmVkLTcwMDogI2QzMmYyZjsKICAgICAgLS1wYXBlci1yZWQtODAwOiAjYzYyODI4OwogICAgICAtLXBhcGVyLXJlZC05MDA6ICNiNzFjMWM7CiAgICAgIC0tcGFwZXItcmVkLWExMDA6ICNmZjhhODA7CiAgICAgIC0tcGFwZXItcmVkLWEyMDA6ICNmZjUyNTI7CiAgICAgIC0tcGFwZXItcmVkLWE0MDA6ICNmZjE3NDQ7CiAgICAgIC0tcGFwZXItcmVkLWE3MDA6ICNkNTAwMDA7CgogICAgICAtLXBhcGVyLXBpbmstNTA6ICNmY2U0ZWM7CiAgICAgIC0tcGFwZXItcGluay0xMDA6ICNmOGJiZDA7CiAgICAgIC0tcGFwZXItcGluay0yMDA6ICNmNDhmYjE7CiAgICAgIC0tcGFwZXItcGluay0zMDA6ICNmMDYyOTI7CiAgICAgIC0tcGFwZXItcGluay00MDA6ICNlYzQwN2E7CiAgICAgIC0tcGFwZXItcGluay01MDA6ICNlOTFlNjM7CiAgICAgIC0tcGFwZXItcGluay02MDA6ICNkODFiNjA7CiAgICAgIC0tcGFwZXItcGluay03MDA6ICNjMjE4NWI7CiAgICAgIC0tcGFwZXItcGluay04MDA6ICNhZDE0NTc7CiAgICAgIC0tcGFwZXItcGluay05MDA6ICM4ODBlNGY7CiAgICAgIC0tcGFwZXItcGluay1hMTAwOiAjZmY4MGFiOwogICAgICAtLXBhcGVyLXBpbmstYTIwMDogI2ZmNDA4MTsKICAgICAgLS1wYXBlci1waW5rLWE0MDA6ICNmNTAwNTc7CiAgICAgIC0tcGFwZXItcGluay1hNzAwOiAjYzUxMTYyOwoKICAgICAgLS1wYXBlci1wdXJwbGUtNTA6ICNmM2U1ZjU7CiAgICAgIC0tcGFwZXItcHVycGxlLTEwMDogI2UxYmVlNzsKICAgICAgLS1wYXBlci1wdXJwbGUtMjAwOiAjY2U5M2Q4OwogICAgICAtLXBhcGVyLXB1cnBsZS0zMDA6ICNiYTY4Yzg7CiAgICAgIC0tcGFwZXItcHVycGxlLTQwMDogI2FiNDdiYzsKICAgICAgLS1wYXBlci1wdXJwbGUtNTAwOiAjOWMyN2IwOwogICAgICAtLXBhcGVyLXB1cnBsZS02MDA6ICM4ZTI0YWE7CiAgICAgIC0tcGFwZXItcHVycGxlLTcwMDogIzdiMWZhMjsKICAgICAgLS1wYXBlci1wdXJwbGUtODAwOiAjNmExYjlhOwogICAgICAtLXBhcGVyLXB1cnBsZS05MDA6ICM0YTE0OGM7CiAgICAgIC0tcGFwZXItcHVycGxlLWExMDA6ICNlYTgwZmM7CiAgICAgIC0tcGFwZXItcHVycGxlLWEyMDA6ICNlMDQwZmI7CiAgICAgIC0tcGFwZXItcHVycGxlLWE0MDA6ICNkNTAwZjk7CiAgICAgIC0tcGFwZXItcHVycGxlLWE3MDA6ICNhYTAwZmY7CgogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTUwOiAjZWRlN2Y2OwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTEwMDogI2QxYzRlOTsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS0yMDA6ICNiMzlkZGI7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtMzAwOiAjOTU3NWNkOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTQwMDogIzdlNTdjMjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS01MDA6ICM2NzNhYjc7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtNjAwOiAjNWUzNWIxOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTcwMDogIzUxMmRhODsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS04MDA6ICM0NTI3YTA7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtOTAwOiAjMzExYjkyOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWExMDA6ICNiMzg4ZmY7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtYTIwMDogIzdjNGRmZjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS1hNDAwOiAjNjUxZmZmOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWE3MDA6ICM2MjAwZWE7CgogICAgICAtLXBhcGVyLWluZGlnby01MDogI2U4ZWFmNjsKICAgICAgLS1wYXBlci1pbmRpZ28tMTAwOiAjYzVjYWU5OwogICAgICAtLXBhcGVyLWluZGlnby0yMDA6ICM5ZmE4ZGE7CiAgICAgIC0tcGFwZXItaW5kaWdvLTMwMDogIzc5ODZjYjsKICAgICAgLS1wYXBlci1pbmRpZ28tNDAwOiAjNWM2YmMwOwogICAgICAtLXBhcGVyLWluZGlnby01MDA6ICMzZjUxYjU7CiAgICAgIC0tcGFwZXItaW5kaWdvLTYwMDogIzM5NDlhYjsKICAgICAgLS1wYXBlci1pbmRpZ28tNzAwOiAjMzAzZjlmOwogICAgICAtLXBhcGVyLWluZGlnby04MDA6ICMyODM1OTM7CiAgICAgIC0tcGFwZXItaW5kaWdvLTkwMDogIzFhMjM3ZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTEwMDogIzhjOWVmZjsKICAgICAgLS1wYXBlci1pbmRpZ28tYTIwMDogIzUzNmRmZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTQwMDogIzNkNWFmZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTcwMDogIzMwNGZmZTsKCiAgICAgIC0tcGFwZXItYmx1ZS01MDogI2UzZjJmZDsKICAgICAgLS1wYXBlci1ibHVlLTEwMDogI2JiZGVmYjsKICAgICAgLS1wYXBlci1ibHVlLTIwMDogIzkwY2FmOTsKICAgICAgLS1wYXBlci1ibHVlLTMwMDogIzY0YjVmNjsKICAgICAgLS1wYXBlci1ibHVlLTQwMDogIzQyYTVmNTsKICAgICAgLS1wYXBlci1ibHVlLTUwMDogIzIxOTZmMzsKICAgICAgLS1wYXBlci1ibHVlLTYwMDogIzFlODhlNTsKICAgICAgLS1wYXBlci1ibHVlLTcwMDogIzE5NzZkMjsKICAgICAgLS1wYXBlci1ibHVlLTgwMDogIzE1NjVjMDsKICAgICAgLS1wYXBlci1ibHVlLTkwMDogIzBkNDdhMTsKICAgICAgLS1wYXBlci1ibHVlLWExMDA6ICM4MmIxZmY7CiAgICAgIC0tcGFwZXItYmx1ZS1hMjAwOiAjNDQ4YWZmOwogICAgICAtLXBhcGVyLWJsdWUtYTQwMDogIzI5NzlmZjsKICAgICAgLS1wYXBlci1ibHVlLWE3MDA6ICMyOTYyZmY7CgogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtNTA6ICNlMWY1ZmU7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0xMDA6ICNiM2U1ZmM7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0yMDA6ICM4MWQ0ZmE7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0zMDA6ICM0ZmMzZjc7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS00MDA6ICMyOWI2ZjY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS01MDA6ICMwM2E5ZjQ7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS02MDA6ICMwMzliZTU7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS03MDA6ICMwMjg4ZDE7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS04MDA6ICMwMjc3YmQ7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS05MDA6ICMwMTU3OWI7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hMTAwOiAjODBkOGZmOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtYTIwMDogIzQwYzRmZjsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLWE0MDA6ICMwMGIwZmY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hNzAwOiAjMDA5MWVhOwoKICAgICAgLS1wYXBlci1jeWFuLTUwOiAjZTBmN2ZhOwogICAgICAtLXBhcGVyLWN5YW4tMTAwOiAjYjJlYmYyOwogICAgICAtLXBhcGVyLWN5YW4tMjAwOiAjODBkZWVhOwogICAgICAtLXBhcGVyLWN5YW4tMzAwOiAjNGRkMGUxOwogICAgICAtLXBhcGVyLWN5YW4tNDAwOiAjMjZjNmRhOwogICAgICAtLXBhcGVyLWN5YW4tNTAwOiAjMDBiY2Q0OwogICAgICAtLXBhcGVyLWN5YW4tNjAwOiAjMDBhY2MxOwogICAgICAtLXBhcGVyLWN5YW4tNzAwOiAjMDA5N2E3OwogICAgICAtLXBhcGVyLWN5YW4tODAwOiAjMDA4MzhmOwogICAgICAtLXBhcGVyLWN5YW4tOTAwOiAjMDA2MDY0OwogICAgICAtLXBhcGVyLWN5YW4tYTEwMDogIzg0ZmZmZjsKICAgICAgLS1wYXBlci1jeWFuLWEyMDA6ICMxOGZmZmY7CiAgICAgIC0tcGFwZXItY3lhbi1hNDAwOiAjMDBlNWZmOwogICAgICAtLXBhcGVyLWN5YW4tYTcwMDogIzAwYjhkNDsKCiAgICAgIC0tcGFwZXItdGVhbC01MDogI2UwZjJmMTsKICAgICAgLS1wYXBlci10ZWFsLTEwMDogI2IyZGZkYjsKICAgICAgLS1wYXBlci10ZWFsLTIwMDogIzgwY2JjNDsKICAgICAgLS1wYXBlci10ZWFsLTMwMDogIzRkYjZhYzsKICAgICAgLS1wYXBlci10ZWFsLTQwMDogIzI2YTY5YTsKICAgICAgLS1wYXBlci10ZWFsLTUwMDogIzAwOTY4ODsKICAgICAgLS1wYXBlci10ZWFsLTYwMDogIzAwODk3YjsKICAgICAgLS1wYXBlci10ZWFsLTcwMDogIzAwNzk2YjsKICAgICAgLS1wYXBlci10ZWFsLTgwMDogIzAwNjk1YzsKICAgICAgLS1wYXBlci10ZWFsLTkwMDogIzAwNGQ0MDsKICAgICAgLS1wYXBlci10ZWFsLWExMDA6ICNhN2ZmZWI7CiAgICAgIC0tcGFwZXItdGVhbC1hMjAwOiAjNjRmZmRhOwogICAgICAtLXBhcGVyLXRlYWwtYTQwMDogIzFkZTliNjsKICAgICAgLS1wYXBlci10ZWFsLWE3MDA6ICMwMGJmYTU7CgogICAgICAtLXBhcGVyLWdyZWVuLTUwOiAjZThmNWU5OwogICAgICAtLXBhcGVyLWdyZWVuLTEwMDogI2M4ZTZjOTsKICAgICAgLS1wYXBlci1ncmVlbi0yMDA6ICNhNWQ2YTc7CiAgICAgIC0tcGFwZXItZ3JlZW4tMzAwOiAjODFjNzg0OwogICAgICAtLXBhcGVyLWdyZWVuLTQwMDogIzY2YmI2YTsKICAgICAgLS1wYXBlci1ncmVlbi01MDA6ICM0Y2FmNTA7CiAgICAgIC0tcGFwZXItZ3JlZW4tNjAwOiAjNDNhMDQ3OwogICAgICAtLXBhcGVyLWdyZWVuLTcwMDogIzM4OGUzYzsKICAgICAgLS1wYXBlci1ncmVlbi04MDA6ICMyZTdkMzI7CiAgICAgIC0tcGFwZXItZ3JlZW4tOTAwOiAjMWI1ZTIwOwogICAgICAtLXBhcGVyLWdyZWVuLWExMDA6ICNiOWY2Y2E7CiAgICAgIC0tcGFwZXItZ3JlZW4tYTIwMDogIzY5ZjBhZTsKICAgICAgLS1wYXBlci1ncmVlbi1hNDAwOiAjMDBlNjc2OwogICAgICAtLXBhcGVyLWdyZWVuLWE3MDA6ICMwMGM4NTM7CgogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTUwOiAjZjFmOGU5OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTEwMDogI2RjZWRjODsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi0yMDA6ICNjNWUxYTU7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tMzAwOiAjYWVkNTgxOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTQwMDogIzljY2M2NTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi01MDA6ICM4YmMzNGE7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tNjAwOiAjN2NiMzQyOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTcwMDogIzY4OWYzODsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi04MDA6ICM1NThiMmY7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tOTAwOiAjMzM2OTFlOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWExMDA6ICNjY2ZmOTA7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tYTIwMDogI2IyZmY1OTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi1hNDAwOiAjNzZmZjAzOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWE3MDA6ICM2NGRkMTc7CgogICAgICAtLXBhcGVyLWxpbWUtNTA6ICNmOWZiZTc7CiAgICAgIC0tcGFwZXItbGltZS0xMDA6ICNmMGY0YzM7CiAgICAgIC0tcGFwZXItbGltZS0yMDA6ICNlNmVlOWM7CiAgICAgIC0tcGFwZXItbGltZS0zMDA6ICNkY2U3NzU7CiAgICAgIC0tcGFwZXItbGltZS00MDA6ICNkNGUxNTc7CiAgICAgIC0tcGFwZXItbGltZS01MDA6ICNjZGRjMzk7CiAgICAgIC0tcGFwZXItbGltZS02MDA6ICNjMGNhMzM7CiAgICAgIC0tcGFwZXItbGltZS03MDA6ICNhZmI0MmI7CiAgICAgIC0tcGFwZXItbGltZS04MDA6ICM5ZTlkMjQ7CiAgICAgIC0tcGFwZXItbGltZS05MDA6ICM4Mjc3MTc7CiAgICAgIC0tcGFwZXItbGltZS1hMTAwOiAjZjRmZjgxOwogICAgICAtLXBhcGVyLWxpbWUtYTIwMDogI2VlZmY0MTsKICAgICAgLS1wYXBlci1saW1lLWE0MDA6ICNjNmZmMDA7CiAgICAgIC0tcGFwZXItbGltZS1hNzAwOiAjYWVlYTAwOwoKICAgICAgLS1wYXBlci15ZWxsb3ctNTA6ICNmZmZkZTc7CiAgICAgIC0tcGFwZXIteWVsbG93LTEwMDogI2ZmZjljNDsKICAgICAgLS1wYXBlci15ZWxsb3ctMjAwOiAjZmZmNTlkOwogICAgICAtLXBhcGVyLXllbGxvdy0zMDA6ICNmZmYxNzY7CiAgICAgIC0tcGFwZXIteWVsbG93LTQwMDogI2ZmZWU1ODsKICAgICAgLS1wYXBlci15ZWxsb3ctNTAwOiAjZmZlYjNiOwogICAgICAtLXBhcGVyLXllbGxvdy02MDA6ICNmZGQ4MzU7CiAgICAgIC0tcGFwZXIteWVsbG93LTcwMDogI2ZiYzAyZDsKICAgICAgLS1wYXBlci15ZWxsb3ctODAwOiAjZjlhODI1OwogICAgICAtLXBhcGVyLXllbGxvdy05MDA6ICNmNTdmMTc7CiAgICAgIC0tcGFwZXIteWVsbG93LWExMDA6ICNmZmZmOGQ7CiAgICAgIC0tcGFwZXIteWVsbG93LWEyMDA6ICNmZmZmMDA7CiAgICAgIC0tcGFwZXIteWVsbG93LWE0MDA6ICNmZmVhMDA7CiAgICAgIC0tcGFwZXIteWVsbG93LWE3MDA6ICNmZmQ2MDA7CgogICAgICAtLXBhcGVyLWFtYmVyLTUwOiAjZmZmOGUxOwogICAgICAtLXBhcGVyLWFtYmVyLTEwMDogI2ZmZWNiMzsKICAgICAgLS1wYXBlci1hbWJlci0yMDA6ICNmZmUwODI7CiAgICAgIC0tcGFwZXItYW1iZXItMzAwOiAjZmZkNTRmOwogICAgICAtLXBhcGVyLWFtYmVyLTQwMDogI2ZmY2EyODsKICAgICAgLS1wYXBlci1hbWJlci01MDA6ICNmZmMxMDc7CiAgICAgIC0tcGFwZXItYW1iZXItNjAwOiAjZmZiMzAwOwogICAgICAtLXBhcGVyLWFtYmVyLTcwMDogI2ZmYTAwMDsKICAgICAgLS1wYXBlci1hbWJlci04MDA6ICNmZjhmMDA7CiAgICAgIC0tcGFwZXItYW1iZXItOTAwOiAjZmY2ZjAwOwogICAgICAtLXBhcGVyLWFtYmVyLWExMDA6ICNmZmU1N2Y7CiAgICAgIC0tcGFwZXItYW1iZXItYTIwMDogI2ZmZDc0MDsKICAgICAgLS1wYXBlci1hbWJlci1hNDAwOiAjZmZjNDAwOwogICAgICAtLXBhcGVyLWFtYmVyLWE3MDA6ICNmZmFiMDA7CgogICAgICAtLXBhcGVyLW9yYW5nZS01MDogI2ZmZjNlMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtMTAwOiAjZmZlMGIyOwogICAgICAtLXBhcGVyLW9yYW5nZS0yMDA6ICNmZmNjODA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTMwMDogI2ZmYjc0ZDsKICAgICAgLS1wYXBlci1vcmFuZ2UtNDAwOiAjZmZhNzI2OwogICAgICAtLXBhcGVyLW9yYW5nZS01MDA6ICNmZjk4MDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTYwMDogI2ZiOGMwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtNzAwOiAjZjU3YzAwOwogICAgICAtLXBhcGVyLW9yYW5nZS04MDA6ICNlZjZjMDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTkwMDogI2U2NTEwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTEwMDogI2ZmZDE4MDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTIwMDogI2ZmYWI0MDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTQwMDogI2ZmOTEwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTcwMDogI2ZmNjUwMDsKCiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNTA6ICNmYmU5ZTc7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtMTAwOiAjZmZjY2JjOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTIwMDogI2ZmYWI5MTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS0zMDA6ICNmZjhhNjU7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNDAwOiAjZmY3MDQzOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTUwMDogI2ZmNTcyMjsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS02MDA6ICNmNDUxMWU7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNzAwOiAjZTY0YTE5OwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTgwMDogI2Q4NDMxNTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS05MDA6ICNiZjM2MGM7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTEwMDogI2ZmOWU4MDsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS1hMjAwOiAjZmY2ZTQwOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLWE0MDA6ICNmZjNkMDA7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTcwMDogI2RkMmMwMDsKCiAgICAgIC0tcGFwZXItYnJvd24tNTA6ICNlZmViZTk7CiAgICAgIC0tcGFwZXItYnJvd24tMTAwOiAjZDdjY2M4OwogICAgICAtLXBhcGVyLWJyb3duLTIwMDogI2JjYWFhNDsKICAgICAgLS1wYXBlci1icm93bi0zMDA6ICNhMTg4N2Y7CiAgICAgIC0tcGFwZXItYnJvd24tNDAwOiAjOGQ2ZTYzOwogICAgICAtLXBhcGVyLWJyb3duLTUwMDogIzc5NTU0ODsKICAgICAgLS1wYXBlci1icm93bi02MDA6ICM2ZDRjNDE7CiAgICAgIC0tcGFwZXItYnJvd24tNzAwOiAjNWQ0MDM3OwogICAgICAtLXBhcGVyLWJyb3duLTgwMDogIzRlMzQyZTsKICAgICAgLS1wYXBlci1icm93bi05MDA6ICMzZTI3MjM7CgogICAgICAtLXBhcGVyLWdyZXktNTA6ICNmYWZhZmE7CiAgICAgIC0tcGFwZXItZ3JleS0xMDA6ICNmNWY1ZjU7CiAgICAgIC0tcGFwZXItZ3JleS0yMDA6ICNlZWVlZWU7CiAgICAgIC0tcGFwZXItZ3JleS0zMDA6ICNlMGUwZTA7CiAgICAgIC0tcGFwZXItZ3JleS00MDA6ICNiZGJkYmQ7CiAgICAgIC0tcGFwZXItZ3JleS01MDA6ICM5ZTllOWU7CiAgICAgIC0tcGFwZXItZ3JleS02MDA6ICM3NTc1NzU7CiAgICAgIC0tcGFwZXItZ3JleS03MDA6ICM2MTYxNjE7CiAgICAgIC0tcGFwZXItZ3JleS04MDA6ICM0MjQyNDI7CiAgICAgIC0tcGFwZXItZ3JleS05MDA6ICMyMTIxMjE7CgogICAgICAtLXBhcGVyLWJsdWUtZ3JleS01MDogI2VjZWZmMTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktMTAwOiAjY2ZkOGRjOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS0yMDA6ICNiMGJlYzU7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTMwMDogIzkwYTRhZTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNDAwOiAjNzg5MDljOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS01MDA6ICM2MDdkOGI7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTYwMDogIzU0NmU3YTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNzAwOiAjNDU1YTY0OwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS04MDA6ICMzNzQ3NGY7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTkwMDogIzI2MzIzODsKCiAgICAgIC8qIG9wYWNpdHkgZm9yIGRhcmsgdGV4dCBvbiBhIGxpZ2h0IGJhY2tncm91bmQgKi8KICAgICAgLS1kYXJrLWRpdmlkZXItb3BhY2l0eTogMC4xMjsKICAgICAgLS1kYXJrLWRpc2FibGVkLW9wYWNpdHk6IDAuMzg7IC8qIG9yIGhpbnQgdGV4dCBvciBpY29uICovCiAgICAgIC0tZGFyay1zZWNvbmRhcnktb3BhY2l0eTogMC41NDsKICAgICAgLS1kYXJrLXByaW1hcnktb3BhY2l0eTogMC44NzsKCiAgICAgIC8qIG9wYWNpdHkgZm9yIGxpZ2h0IHRleHQgb24gYSBkYXJrIGJhY2tncm91bmQgKi8KICAgICAgLS1saWdodC1kaXZpZGVyLW9wYWNpdHk6IDAuMTI7CiAgICAgIC0tbGlnaHQtZGlzYWJsZWQtb3BhY2l0eTogMC4zOyAvKiBvciBoaW50IHRleHQgb3IgaWNvbiAqLwogICAgICAtLWxpZ2h0LXNlY29uZGFyeS1vcGFjaXR5OiAwLjc7CiAgICAgIC0tbGlnaHQtcHJpbWFyeS1vcGFjaXR5OiAxLjA7CgogICAgfQoKICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KCgoKCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CiAgICAgIC8qCiAgICAgICAqIFlvdSBjYW4gdXNlIHRoZXNlIGdlbmVyaWMgdmFyaWFibGVzIGluIHlvdXIgZWxlbWVudHMgZm9yIGVhc3kgdGhlbWluZy4KICAgICAgICogRm9yIGV4YW1wbGUsIGlmIGFsbCB5b3VyIGVsZW1lbnRzIHVzZSBgLS1wcmltYXJ5LXRleHQtY29sb3JgIGFzIGl0cyBtYWluCiAgICAgICAqIGNvbG9yLCB0aGVuIHN3aXRjaGluZyBmcm9tIGEgbGlnaHQgdG8gYSBkYXJrIHRoZW1lIGlzIGp1c3QgYSBtYXR0ZXIgb2YKICAgICAgICogY2hhbmdpbmcgdGhlIHZhbHVlIG9mIGAtLXByaW1hcnktdGV4dC1jb2xvcmAgaW4geW91ciBhcHBsaWNhdGlvbi4KICAgICAgICovCiAgICAgIC0tcHJpbWFyeS10ZXh0LWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS10ZXh0LWNvbG9yKTsKICAgICAgLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLWJhY2tncm91bmQtY29sb3IpOwogICAgICAtLXNlY29uZGFyeS10ZXh0LWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS1zZWNvbmRhcnktY29sb3IpOwogICAgICAtLWRpc2FibGVkLXRleHQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLWRpc2FibGVkLWNvbG9yKTsKICAgICAgLS1kaXZpZGVyLWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS1kaXZpZGVyLWNvbG9yKTsKICAgICAgLS1lcnJvci1jb2xvcjogdmFyKC0tcGFwZXItZGVlcC1vcmFuZ2UtYTcwMCk7CgogICAgICAvKgogICAgICAgKiBQcmltYXJ5IGFuZCBhY2NlbnQgY29sb3JzLiBBbHNvIHNlZSBjb2xvci5odG1sIGZvciBtb3JlIGNvbG9ycy4KICAgICAgICovCiAgICAgIC0tcHJpbWFyeS1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTUwMCk7CiAgICAgIC0tbGlnaHQtcHJpbWFyeS1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTEwMCk7CiAgICAgIC0tZGFyay1wcmltYXJ5LWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNzAwKTsKCiAgICAgIC0tYWNjZW50LWNvbG9yOiB2YXIoLS1wYXBlci1waW5rLWEyMDApOwogICAgICAtLWxpZ2h0LWFjY2VudC1jb2xvcjogdmFyKC0tcGFwZXItcGluay1hMTAwKTsKICAgICAgLS1kYXJrLWFjY2VudC1jb2xvcjogdmFyKC0tcGFwZXItcGluay1hNDAwKTsKCgogICAgICAvKgogICAgICAgKiBNYXRlcmlhbCBEZXNpZ24gTGlnaHQgYmFja2dyb3VuZCB0aGVtZQogICAgICAgKi8KICAgICAgLS1saWdodC10aGVtZS1iYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwogICAgICAtLWxpZ2h0LXRoZW1lLWJhc2UtY29sb3I6ICMwMDAwMDA7CiAgICAgIC0tbGlnaHQtdGhlbWUtdGV4dC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICAtLWxpZ2h0LXRoZW1lLXNlY29uZGFyeS1jb2xvcjogIzczNzM3MzsgIC8qIGZvciBzZWNvbmRhcnkgdGV4dCBhbmQgaWNvbnMgKi8KICAgICAgLS1saWdodC10aGVtZS1kaXNhYmxlZC1jb2xvcjogIzliOWI5YjsgIC8qIGRpc2FibGVkL2hpbnQgdGV4dCAqLwogICAgICAtLWxpZ2h0LXRoZW1lLWRpdmlkZXItY29sb3I6ICNkYmRiZGI7CgogICAgICAvKgogICAgICAgKiBNYXRlcmlhbCBEZXNpZ24gRGFyayBiYWNrZ3JvdW5kIHRoZW1lCiAgICAgICAqLwogICAgICAtLWRhcmstdGhlbWUtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICAtLWRhcmstdGhlbWUtYmFzZS1jb2xvcjogI2ZmZmZmZjsKICAgICAgLS1kYXJrLXRoZW1lLXRleHQtY29sb3I6ICNmZmZmZmY7CiAgICAgIC0tZGFyay10aGVtZS1zZWNvbmRhcnktY29sb3I6ICNiY2JjYmM7ICAvKiBmb3Igc2Vjb25kYXJ5IHRleHQgYW5kIGljb25zICovCiAgICAgIC0tZGFyay10aGVtZS1kaXNhYmxlZC1jb2xvcjogIzY0NjQ2NDsgIC8qIGRpc2FibGVkL2hpbnQgdGV4dCAqLwogICAgICAtLWRhcmstdGhlbWUtZGl2aWRlci1jb2xvcjogIzNjM2MzYzsKCiAgICAgIC8qCiAgICAgICAqIERlcHJlY2F0ZWQgdmFsdWVzIGJlY2F1c2Ugb2YgdGhlaXIgY29uZnVzaW5nIG5hbWVzLgogICAgICAgKi8KICAgICAgLS10ZXh0LXByaW1hcnktY29sb3I6IHZhcigtLWRhcmstdGhlbWUtdGV4dC1jb2xvcik7CiAgICAgIC0tZGVmYXVsdC1wcmltYXJ5LWNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yKTsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItY2hlY2tib3giPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplOiB2YXIoLS1wYXBlci1jaGVja2JveC1zaXplLCAxOHB4KTsKICAgICAgICAvKiAtMXB4IGlzIGEgc2VudGluZWwgZm9yIHRoZSBkZWZhdWx0IGFuZCBpcyByZXBsYWNlZCBpbiBgYXR0YWNoZWRgLiAqLwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZTogdmFyKC0tcGFwZXItY2hlY2tib3gtaW5rLXNpemUsIC0xcHgpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgbGluZS1oZWlnaHQ6IDA7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5oaWRkZW4gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgICNjaGVja2JveENvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKTsKICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSk7CiAgICAgICAgbWluLXdpZHRoOiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpOwogICAgICAgIG1hcmdpbjogdmFyKC0tcGFwZXItY2hlY2tib3gtbWFyZ2luLCBpbml0aWFsKTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdmFyKC0tcGFwZXItY2hlY2tib3gtdmVydGljYWwtYWxpZ24sIG1pZGRsZSk7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWJhY2tncm91bmQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgfQoKICAgICAgI2luayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwoKICAgICAgICAvKiBDZW50ZXIgdGhlIHJpcHBsZSBpbiB0aGUgY2hlY2tib3ggYnkgbmVnYXRpdmUgb2Zmc2V0dGluZyBpdCBieQogICAgICAgICAqIChpbmtXaWR0aCAtIHJpcHBsZVdpZHRoKSAvIDIgKi8KICAgICAgICB0b3A6IGNhbGMoMHB4IC0gKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpIC0gdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKSkgLyAyKTsKICAgICAgICBsZWZ0OiBjYWxjKDBweCAtICh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplKSAtIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpIC8gMik7CiAgICAgICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIG9wYWNpdHk6IDAuNjsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI2luazpkaXIocnRsKSB7CiAgICAgICAgcmlnaHQ6IGNhbGMoMHB4IC0gKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpIC0gdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKSkgLyAyKTsKICAgICAgICBsZWZ0OiBhdXRvOwogICAgICB9CgogICAgICAjaW5rW2NoZWNrZWRdIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgfQoKICAgICAgI2NoZWNrYm94IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYm9yZGVyOiBzb2xpZCAycHg7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMTQwbXMsIGJvcmRlci1jb2xvciAxNDBtczsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDE0MG1zLCBib3JkZXItY29sb3IgMTQwbXM7CiAgICAgIH0KCiAgICAgIC8qIGNoZWNrYm94IGNoZWNrZWQgYW5pbWF0aW9ucyAqLwogICAgICAjY2hlY2tib3guY2hlY2tlZCAjY2hlY2ttYXJrIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogY2hlY2ttYXJrLWV4cGFuZCAxNDBtcyBlYXNlLW91dCBmb3J3YXJkczsKICAgICAgICBhbmltYXRpb246IGNoZWNrbWFyay1leHBhbmQgMTQwbXMgZWFzZS1vdXQgZm9yd2FyZHM7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBjaGVja21hcmstZXhwYW5kIHsKICAgICAgICAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCwgMCkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSwgMSkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgY2hlY2ttYXJrLWV4cGFuZCB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLCAwKSByb3RhdGUoNDVkZWcpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNjaGVja2JveC5jaGVja2VkIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgICNjaGVja21hcmsgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMzYlOwogICAgICAgIGhlaWdodDogNzAlOwogICAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7CiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgICAgICBib3JkZXItbGVmdDogbm9uZTsKICAgICAgICBib3JkZXItcmlnaHQtd2lkdGg6IGNhbGMoMi8xNSAqIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpOwogICAgICAgIGJvcmRlci1ib3R0b20td2lkdGg6IGNhbGMoMi8xNSAqIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpOwogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2ttYXJrLWNvbG9yLCB3aGl0ZSk7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiA5NyUgODYlOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDk3JSA4NiU7CiAgICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7IC8qIHByb3RlY3QgYWdhaW5zdCBwYWdlLWxldmVsIGJveC1zaXppbmcgKi8KICAgICAgfQoKICAgICAgI2NoZWNrbWFyazpkaXIocnRsKSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiA1MCUgMTQlOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDUwJSAxNCU7CiAgICAgIH0KCiAgICAgIC8qIGxhYmVsICovCiAgICAgICNjaGVja2JveExhYmVsIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1wYXBlci1jaGVja2JveC1sYWJlbC1zcGFjaW5nLCA4cHgpOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgICAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWNoZWNrYm94LWxhYmVsOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pICNjaGVja2JveExhYmVsIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY2hlY2tlZC1jb2xvciwgdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1jaGVja2JveC1sYWJlbC1jaGVja2VkOwogICAgICB9CgogICAgICAjY2hlY2tib3hMYWJlbDpkaXIocnRsKSB7CiAgICAgICAgcGFkZGluZy1yaWdodDogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtc3BhY2luZywgOHB4KTsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDA7CiAgICAgIH0KCiAgICAgICNjaGVja2JveExhYmVsW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIGRpc2FibGVkIHN0YXRlICovCgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjY2hlY2tib3ggewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF1bY2hlY2tlZF0pICNjaGVja2JveCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNjaGVja2JveExhYmVsICB7CiAgICAgICAgb3BhY2l0eTogMC42NTsKICAgICAgfQoKICAgICAgLyogaW52YWxpZCBzdGF0ZSAqLwogICAgICAjY2hlY2tib3guaW52YWxpZDpub3QoLmNoZWNrZWQpIHsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWVycm9yLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9ImNoZWNrYm94Q29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0iY2hlY2tib3giIGNsYXNzJD0iW1tfY29tcHV0ZUNoZWNrYm94Q2xhc3MoY2hlY2tlZCwgaW52YWxpZCldXSI+CiAgICAgICAgPGRpdiBpZD0iY2hlY2ttYXJrIiBjbGFzcyQ9IltbX2NvbXB1dGVDaGVja21hcmtDbGFzcyhjaGVja2VkKV1dIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjaGVja2JveExhYmVsIj48c2xvdD48L3Nsb3Q+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24taWNvbiI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWlubGluZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CgogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgogICAgICAgIGZpbGw6IHZhcigtLWlyb24taWNvbi1maWxsLWNvbG9yLCBjdXJyZW50Y29sb3IpOwogICAgICAgIHN0cm9rZTogdmFyKC0taXJvbi1pY29uLXN0cm9rZS1jb2xvciwgbm9uZSk7CgogICAgICAgIHdpZHRoOiB2YXIoLS1pcm9uLWljb24td2lkdGgsIDI0cHgpOwogICAgICAgIGhlaWdodDogdmFyKC0taXJvbi1pY29uLWhlaWdodCwgMjRweCk7CiAgICAgICAgQGFwcGx5IC0taXJvbi1pY29uOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWExMXktYW5ub3VuY2VyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIGNsaXA6IHJlY3QoMHB4LDBweCwwcHgsMHB4KTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgYXJpYS1saXZlJD0iW1ttb2RlXV0iPltbX3RleHRdXTwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24taW5wdXQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzbG90IGlkPSJjb250ZW50Ij48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewoKICAgICAgLyogU2hhcmVkIFN0eWxlcyAqLwogICAgICAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U6IHsKICAgICAgICBmb250LWZhbWlseTogJ1JvYm90bycsICdOb3RvJywgc2Fucy1zZXJpZjsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb21tb24tY29kZTogewogICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCAnQ29uc29sYXMnLCAnTWVubG8nLCBtb25vc3BhY2U7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29tbW9uLWV4cGVuc2l2ZS1rZXJuaW5nOiB7CiAgICAgICAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOiB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9OwoKICAgICAgLyogTWF0ZXJpYWwgRm9udCBTdHlsZXMgKi8KCiAgICAgIC0tcGFwZXItZm9udC1kaXNwbGF5NDogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDExMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiAzMDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDQ0ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDEyMHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWRpc3BsYXkzOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogNTZweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtLjAyNmVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiA2MHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWRpc3BsYXkyOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiA0NXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDE4ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDQ4cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtZGlzcGxheTE6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDM0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLS4wMWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiA0MHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWhlYWRsaW5lOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDEyZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDMycHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtdGl0bGU6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI4cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtc3ViaGVhZDogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWJvZHkyOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtYm9keTE6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jYXB0aW9uOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAxMWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LW1lbnU6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtYnV0dG9uOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAxOGVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29kZTI6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1jb2RlOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb2RlMTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWNvZGU7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9OwoKICAgIH0KCiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWlucHV0LWNoYXItY291bnRlciI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGZsb2F0OiByaWdodDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jYXB0aW9uOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNoYXItY291bnRlcjsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpkaXIocnRsKSkgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzcGFuPltbX2NoYXJDb3VudGVyU3RyXV08L3NwYW4+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItc2hhcmVkLWlucHV0LXN0eWxlOiB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiB0byBtYWtlIGEgc3RhY2tpbmcgY29udGV4dCAqLwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm94LXNoYWRvdzogbm9uZTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgfTsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dC1jb250YWluZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDhweCAwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgOmhvc3QoW2lubGluZV0pIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBvcGFjaXR5OiAwLjMzOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jYXB0aW9uOwogICAgICB9CgogICAgICAudW5kZXJsaW5lIHsKICAgICAgICBoZWlnaHQ6IDJweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5mb2N1c2VkLWxpbmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgwLDEsMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZTNkKDAsMSwxKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1mb2N1czsKICAgICAgfQoKICAgICAgLnVuZGVybGluZS5pcy1oaWdobGlnaHRlZCAuZm9jdXNlZC1saW5lIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAudW5kZXJsaW5lLmlzLWludmFsaWQgLmZvY3VzZWQtbGluZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW52YWxpZC1jb2xvciwgdmFyKC0tZXJyb3ItY29sb3IpKTsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAudW5mb2N1c2VkLWxpbmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItdW5kZXJsaW5lOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudW5mb2N1c2VkLWxpbmUgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBkYXNoZWQ7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgLmlucHV0LXdyYXBwZXIgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtcmVsYXRpdmU7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZvbnQ6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuMjVzLCB3aWR0aCAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXMsIHdpZHRoIDAuMjVzOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7CiAgICAgICAgLyogRml4IGZvciBzYWZhcmkgbm90IGZvY3VzaW5nIDAtaGVpZ2h0IGRhdGUvdGltZSBpbnB1dHMgd2l0aCAtd2Via2l0LWFwcGVyYW5jZTogbm9uZTsgKi8KICAgICAgICBtaW4taGVpZ2h0OiAxcHg7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTc1JSkgc2NhbGUoMC43NSk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC03NSUpIHNjYWxlKDAuNzUpOwoKICAgICAgICAvKiBTaW5jZSB3ZSBzY2FsZSB0byA3NS8xMDAgb2YgdGhlIHNpemUsIHdlIGFjdHVhbGx5IGhhdmUgMTAwLzc1IG9mIHRoZQogICAgICAgIG9yaWdpbmFsIHNwYWNlIG5vdyBhdmFpbGFibGUgKi8KICAgICAgICB3aWR0aDogMTMzJTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsLWZsb2F0aW5nOwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIC5pbnB1dC1jb250ZW50LmxhYmVsLWlzLWZsb2F0aW5nIDo6c2xvdHRlZChsYWJlbCksCiAgICAgIDpob3N0KDpkaXIocnRsKSkgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtZmxvYXRpbmcgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1sYWJlbCkgewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGxlZnQ6IGF1dG87CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWwtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWRkZW4gOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtaGlkZGVuIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtbGFiZWwpIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpcm9uLWlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWlucHV0KSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXNoYXJlZC1pbnB1dC1zdHlsZTsKICAgICAgICAvKiBUaGUgYXBwbHkgc2hpbSBkb2Vzbid0IGFwcGx5IHRoZSBuZXN0ZWQgY29sb3IgY3VzdG9tIHByb3BlcnR5LAogICAgICAgICAgc28gd2UgaGF2ZSB0byByZS1hcHBseSBpdCBoZXJlLiAqLwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24taW5wdXQpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCh0ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtaW5wdXQpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1pbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1pbnB1dCkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1pbnZhbGlkOwogICAgICB9CgogICAgICAucHJlZml4IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1ub25lOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LXByZWZpeDsKICAgICAgfQoKICAgICAgLnN1ZmZpeCA6OnNsb3R0ZWQoKikgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtbm9uZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtc3VmZml4OwogICAgICB9CgogICAgICAvKiBGaXJlZm94IHNldHMgYSBtaW4td2lkdGggb24gdGhlIGlucHV0LCB3aGljaCBjYW4gY2F1c2UgbGF5b3V0IGlzc3VlcyAqLwogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoaW5wdXQpIHsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZCh0ZXh0YXJlYSkgewogICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgfQoKICAgICAgLmFkZC1vbi1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5hZGQtb24tY29udGVudC5pcy1pbnZhbGlkIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuYWRkLW9uLWNvbnRlbnQuaXMtaGlnaGxpZ2h0ZWQgOjpzbG90dGVkKCopIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciIgYXJpYS1oaWRkZW49InRydWUiIGhpZGRlbj0iW1tub0xhYmVsRmxvYXRdXSI+Jm5ic3A7PC9kaXY+CgogICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgIDxzcGFuIGNsYXNzPSJwcmVmaXgiPjxzbG90IG5hbWU9InByZWZpeCI+PC9zbG90Pjwvc3Bhbj4KCiAgICAgIDxkaXYgY2xhc3MkPSJbW19jb21wdXRlSW5wdXRDb250ZW50Q2xhc3Mobm9MYWJlbEZsb2F0LGFsd2F5c0Zsb2F0TGFiZWwsZm9jdXNlZCxpbnZhbGlkLF9pbnB1dEhhc0NvbnRlbnQpXV0iIGlkPSJsYWJlbEFuZElucHV0Q29udGFpbmVyIj4KICAgICAgICA8c2xvdCBuYW1lPSJsYWJlbCI+PC9zbG90PgogICAgICAgIDxzbG90IG5hbWU9ImlucHV0Ij48L3Nsb3Q+CiAgICAgIDwvZGl2PgoKICAgICAgPHNwYW4gY2xhc3M9InN1ZmZpeCI+PHNsb3QgbmFtZT0ic3VmZml4Ij48L3Nsb3Q+PC9zcGFuPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcyQ9IltbX2NvbXB1dGVVbmRlcmxpbmVDbGFzcyhmb2N1c2VkLGludmFsaWQpXV0iPgogICAgICA8ZGl2IGNsYXNzPSJ1bmZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzJD0iW1tfY29tcHV0ZUFkZE9uQ29udGVudENsYXNzKGZvY3VzZWQsaW52YWxpZCldXSI+CiAgICAgIDxzbG90IG5hbWU9ImFkZC1vbiI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWlucHV0LWVycm9yIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWludmFsaWQtY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY2FwdGlvbjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1lcnJvcjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDowOwogICAgICAgIHJpZ2h0OjA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgewogICAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgICAgIH07CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtmb2N1c2VkXSkgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBpbnB1dCB7CiAgICAgICAgLyogRmlyZWZveCBzZXRzIGEgbWluLXdpZHRoIG9uIHRoZSBpbnB1dCwgd2hpY2ggY2FuIGNhdXNlIGxheW91dCBpc3N1ZXMgKi8KICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC8qIEluIDEueCwgdGhlIDxpbnB1dD4gaXMgZGlzdHJpYnV0ZWQgdG8gcGFwZXItaW5wdXQtY29udGFpbmVyLCB3aGljaCBzdHlsZXMgaXQuCiAgICAgIEluIDIueCB0aGUgPGlyb24taW5wdXQ+IGlzIGRpc3RyaWJ1dGVkIHRvIHBhcGVyLWlucHV0LWNvbnRhaW5lciwgd2hpY2ggc3R5bGVzCiAgICAgIGl0LCBidXQgaW4gb3JkZXIgZm9yIHRoaXMgdG8gd29yayBjb3JyZWN0bHksIHdlIG5lZWQgdG8gcmVzZXQgc29tZQogICAgICBvZiB0aGUgbmF0aXZlIGlucHV0J3MgcHJvcGVydGllcyB0byBpbmhlcml0IChmcm9tIHRoZSBpcm9uLWlucHV0KSAqLwogICAgICBpcm9uLWlucHV0ID4gaW5wdXQgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1zaGFyZWQtaW5wdXQtc3R5bGU7CiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7CiAgICAgICAgZm9udC1zaXplOiBpbmhlcml0OwogICAgICAgIGxldHRlci1zcGFjaW5nOiBpbmhlcml0OwogICAgICAgIHdvcmQtc3BhY2luZzogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LXNoYWRvdzogaW5oZXJpdDsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICBjdXJzb3I6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIGlucHV0OmRpc2FibGVkIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLAogICAgICBpbnB1dDo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICBpbnB1dDo6LXdlYmtpdC1jbGVhci1idXR0b24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3IgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvcjsKICAgICAgfQoKICAgICAgaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0Oi1tb3otcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICBpbnB1dDo6LW1zLWNsZWFyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbXMtcmV2ZWFsIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtcmV2ZWFsOwogICAgICB9CgogICAgICBpbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGxhYmVsIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaW5wdXQtY29udGFpbmVyIGlkPSJjb250YWluZXIiIG5vLWxhYmVsLWZsb2F0PSJbW25vTGFiZWxGbG9hdF1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsKGFsd2F5c0Zsb2F0TGFiZWwscGxhY2Vob2xkZXIpXV0iIGF1dG8tdmFsaWRhdGUkPSJbW2F1dG9WYWxpZGF0ZV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaW52YWxpZD0iW1tpbnZhbGlkXV0iPgoKICAgICAgPHNsb3QgbmFtZT0icHJlZml4IiBzbG90PSJwcmVmaXgiPjwvc2xvdD4KCiAgICAgIDxsYWJlbCBoaWRkZW4kPSJbWyFsYWJlbF1dIiBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9yJD0iW1tfaW5wdXRJZF1dIiBzbG90PSJsYWJlbCI+W1tsYWJlbF1dPC9sYWJlbD4KCiAgICAgIDxzcGFuIGlkPSJ0ZW1wbGF0ZS1wbGFjZWhvbGRlciI+PC9zcGFuPgoKICAgICAgPHNsb3QgbmFtZT0ic3VmZml4IiBzbG90PSJzdWZmaXgiPjwvc2xvdD4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlcnJvck1lc3NhZ2VdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWVycm9yIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIiBzbG90PSJhZGQtb24iPltbZXJyb3JNZXNzYWdlXV08L3BhcGVyLWlucHV0LWVycm9yPgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJDb3VudGVyXV0iPgogICAgICAgIDxwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgc2xvdD0iYWRkLW9uIj48L3BhcGVyLWlucHV0LWNoYXItY291bnRlcj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KICA8L3RlbXBsYXRlPgoKICAKICA8dGVtcGxhdGUgaWQ9InYwIj4KICAgIDxpbnB1dCBpcz0iaXJvbi1pbnB1dCIgc2xvdD0iaW5wdXQiIGNsYXNzPSJpbnB1dC1lbGVtZW50IiBpZCQ9IltbX2lucHV0SWRdXSIgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdGl0bGUkPSJbW3RpdGxlXV0iIGJpbmQtdmFsdWU9Int7dmFsdWV9fSIgaW52YWxpZD0ie3tpbnZhbGlkfX0iIHByZXZlbnQtaW52YWxpZC1pbnB1dD0iW1twcmV2ZW50SW52YWxpZElucHV0XV0iIGFsbG93ZWQtcGF0dGVybj0iW1thbGxvd2VkUGF0dGVybl1dIiB2YWxpZGF0b3I9IltbdmFsaWRhdG9yXV0iIHR5cGUkPSJbW3R5cGVdXSIgcGF0dGVybiQ9IltbcGF0dGVybl1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgbWluJD0iW1ttaW5dXSIgbWF4JD0iW1ttYXhdXSIgc3RlcCQ9Iltbc3RlcF1dIiBuYW1lJD0iW1tuYW1lXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgbGlzdCQ9IltbbGlzdF1dIiBzaXplJD0iW1tzaXplXV0iIGF1dG9jYXBpdGFsaXplJD0iW1thdXRvY2FwaXRhbGl6ZV1dIiBhdXRvY29ycmVjdCQ9IltbYXV0b2NvcnJlY3RdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiIHRhYmluZGV4JD0iW1t0YWJJbmRleF1dIiBhdXRvc2F2ZSQ9IltbYXV0b3NhdmVdXSIgcmVzdWx0cyQ9IltbcmVzdWx0c11dIiBhY2NlcHQkPSJbW2FjY2VwdF1dIiBtdWx0aXBsZSQ9IltbbXVsdGlwbGVdXSI+CiAgPC90ZW1wbGF0ZT4KCiAgPHRlbXBsYXRlIGlkPSJ2MSI+CiAgICAKICAgIDxpcm9uLWlucHV0IGJpbmQtdmFsdWU9Int7dmFsdWV9fSIgc2xvdD0iaW5wdXQiIGNsYXNzPSJpbnB1dC1lbGVtZW50IiBpZCQ9IltbX2lucHV0SWRdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgYWxsb3dlZC1wYXR0ZXJuPSJbW2FsbG93ZWRQYXR0ZXJuXV0iIGludmFsaWQ9Int7aW52YWxpZH19IiB2YWxpZGF0b3I9IltbdmFsaWRhdG9yXV0iPgogICAgICA8aW5wdXQgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdGl0bGUkPSJbW3RpdGxlXV0iIHR5cGUkPSJbW3R5cGVdXSIgcGF0dGVybiQ9IltbcGF0dGVybl1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgbWluJD0iW1ttaW5dXSIgbWF4JD0iW1ttYXhdXSIgc3RlcCQ9Iltbc3RlcF1dIiBuYW1lJD0iW1tuYW1lXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgbGlzdCQ9IltbbGlzdF1dIiBzaXplJD0iW1tzaXplXV0iIGF1dG9jYXBpdGFsaXplJD0iW1thdXRvY2FwaXRhbGl6ZV1dIiBhdXRvY29ycmVjdCQ9IltbYXV0b2NvcnJlY3RdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiIHRhYmluZGV4JD0iW1t0YWJJbmRleF1dIiBhdXRvc2F2ZSQ9IltbYXV0b3NhdmVdXSIgcmVzdWx0cyQ9IltbcmVzdWx0c11dIiBhY2NlcHQkPSJbW2FjY2VwdF1dIiBtdWx0aXBsZSQ9IltbbXVsdGlwbGVdXSI+CiAgICA8L2lyb24taW5wdXQ+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1vdmVybGF5LWJhY2tkcm9wIj4KCiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pcm9uLW92ZXJsYXktYmFja2Ryb3AtYmFja2dyb3VuZC1jb2xvciwgIzAwMCk7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnM7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0taXJvbi1vdmVybGF5LWJhY2tkcm9wOwogICAgICB9CgogICAgICA6aG9zdCgub3BlbmVkKSB7CiAgICAgICAgb3BhY2l0eTogdmFyKC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLW9wYWNpdHksIDAuNik7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAgICAgQGFwcGx5IC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLW9wZW5lZDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1kcm9wZG93biI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CgogICAgICAjY29udGVudFdyYXBwZXIgOjpzbG90dGVkKCopIHsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQoKICAgICAgI2NvbnRlbnRXcmFwcGVyLmFuaW1hdGluZyA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iY29udGVudFdyYXBwZXIiPgogICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItbWVudS1idXR0b24iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgY3Vyc29yOiBhdXRvOwogICAgICAgIGNvbG9yOiB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWVudS1idXR0b24tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlyb24tZHJvcGRvd24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWRyb3Bkb3duOwogICAgICB9CgogICAgICAuZHJvcGRvd24tY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CgogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItbWVudS1idXR0b24tZHJvcGRvd24tYmFja2dyb3VuZCwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWNvbnRlbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbC1hbGlnbj0idG9wIl0pIC5kcm9wZG93bi1jb250ZW50IHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICAgIG1hcmdpbi10b3A6IC0xMHB4OwogICAgICAgIHRvcDogMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZlcnRpY2FsLWFsaWduPSJib3R0b20iXSkgLmRyb3Bkb3duLWNvbnRlbnQgewogICAgICAgIGJvdHRvbTogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAtMTBweDsKICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICB9CgogICAgICAjdHJpZ2dlciB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InRyaWdnZXIiIG9uLXRhcD0idG9nZ2xlIj4KICAgICAgPHNsb3QgbmFtZT0iZHJvcGRvd24tdHJpZ2dlciI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGlyb24tZHJvcGRvd24gaWQ9ImRyb3Bkb3duIiBvcGVuZWQ9Int7b3BlbmVkfX0iIGhvcml6b250YWwtYWxpZ249IltbaG9yaXpvbnRhbEFsaWduXV0iIHZlcnRpY2FsLWFsaWduPSJbW3ZlcnRpY2FsQWxpZ25dXSIgZHluYW1pYy1hbGlnbj0iW1tkeW5hbWljQWxpZ25dXSIgaG9yaXpvbnRhbC1vZmZzZXQ9IltbaG9yaXpvbnRhbE9mZnNldF1dIiB2ZXJ0aWNhbC1vZmZzZXQ9IltbdmVydGljYWxPZmZzZXRdXSIgbm8tb3ZlcmxhcD0iW1tub092ZXJsYXBdXSIgb3Blbi1hbmltYXRpb24tY29uZmlnPSJbW29wZW5BbmltYXRpb25Db25maWddXSIgY2xvc2UtYW5pbWF0aW9uLWNvbmZpZz0iW1tjbG9zZUFuaW1hdGlvbkNvbmZpZ11dIiBuby1hbmltYXRpb25zPSJbW25vQW5pbWF0aW9uc11dIiBmb2N1cy10YXJnZXQ9IltbX2Ryb3Bkb3duQ29udGVudF1dIiBhbGxvdy1vdXRzaWRlLXNjcm9sbD0iW1thbGxvd091dHNpZGVTY3JvbGxdXSIgcmVzdG9yZS1mb2N1cy1vbi1jbG9zZT0iW1tyZXN0b3JlRm9jdXNPbkNsb3NlXV0iIG9uLWlyb24tb3ZlcmxheS1jYW5jZWxlZD0iX19vbklyb25PdmVybGF5Q2FuY2VsZWQiPgogICAgICA8ZGl2IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIGNsYXNzPSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgICA8L2Rpdj4KICAgIDwvaXJvbi1kcm9wZG93bj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGlyb24taWNvbnNldC1zdmcgbmFtZT0icGFwZXItZHJvcGRvd24tbWVudSIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iYXJyb3ctZHJvcC1kb3duIj48cGF0aCBkPSJNNyAxMGw1IDUgNS01eiI+PC9wYXRoPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+CgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1kcm9wZG93bi1tZW51LXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKCiAgICAgICAgLyogTk9URShjZGF0YSk6IEJvdGggdmFsdWVzIGFyZSBuZWVkZWQsIHNpbmNlIHNvbWUgcGhvbmVzIHJlcXVpcmUgdGhlCiAgICAgICAgICogdmFsdWUgdG8gYmUgYHRyYW5zcGFyZW50YC4KICAgICAgICAgKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwwLDAsMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIH07CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LWRpc2FibGVkOwogICAgICB9CgogICAgICA6aG9zdChbbm9pbmtdKSBwYXBlci1yaXBwbGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtuby1sYWJlbC1mbG9hdF0pIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgdG9wOiA4cHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgdG9wOiAxMnB4OwogICAgICAgIGxlZnQ6IDBweDsKICAgICAgICBib3R0b206IDhweDsKICAgICAgICByaWdodDogMHB4OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LXJpcHBsZTsKICAgICAgfQoKICAgICAgcGFwZXItbWVudS1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDA7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZHJvcGRvd24tbWVudS1pbnB1dDsKICAgICAgfQoKICAgICAgaXJvbi1pY29uIHsKICAgICAgICBjb2xvcjogdmFyKC0tZGlzYWJsZWQtdGV4dC1jb2xvcik7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtaWNvbjsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItZHJvcGRvd24tbWVudSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLWRyb3Bkb3duLW1lbnUtc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KCiAgICAKICAgIDxzcGFuIHJvbGU9ImJ1dHRvbiI+PC9zcGFuPgogICAgPHBhcGVyLW1lbnUtYnV0dG9uIGlkPSJtZW51QnV0dG9uIiB2ZXJ0aWNhbC1hbGlnbj0iW1t2ZXJ0aWNhbEFsaWduXV0iIGhvcml6b250YWwtYWxpZ249IltbaG9yaXpvbnRhbEFsaWduXV0iIGR5bmFtaWMtYWxpZ249IltbZHluYW1pY0FsaWduXV0iIHZlcnRpY2FsLW9mZnNldD0iW1tfY29tcHV0ZU1lbnVWZXJ0aWNhbE9mZnNldChub0xhYmVsRmxvYXQsIHZlcnRpY2FsT2Zmc2V0KV1dIiBkaXNhYmxlZD0iW1tkaXNhYmxlZF1dIiBuby1hbmltYXRpb25zPSJbW25vQW5pbWF0aW9uc11dIiBvbi1pcm9uLXNlbGVjdD0iX29uSXJvblNlbGVjdCIgb24taXJvbi1kZXNlbGVjdD0iX29uSXJvbkRlc2VsZWN0IiBvcGVuZWQ9Int7b3BlbmVkfX0iIGNsb3NlLW9uLWFjdGl2YXRlIGFsbG93LW91dHNpZGUtc2Nyb2xsPSJbW2FsbG93T3V0c2lkZVNjcm9sbF1dIiByZXN0b3JlLWZvY3VzLW9uLWNsb3NlPSJbW3Jlc3RvcmVGb2N1c09uQ2xvc2VdXSI+CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi10cmlnZ2VyIiBzbG90PSJkcm9wZG93bi10cmlnZ2VyIj4KICAgICAgICA8cGFwZXItcmlwcGxlPjwvcGFwZXItcmlwcGxlPgogICAgICAgIAogICAgICAgIDxwYXBlci1pbnB1dCB0eXBlPSJ0ZXh0IiBpbnZhbGlkPSJbW2ludmFsaWRdXSIgcmVhZG9ubHkgZGlzYWJsZWQ9IltbZGlzYWJsZWRdXSIgdmFsdWU9IltbdmFsdWVdXSIgcGxhY2Vob2xkZXI9IltbcGxhY2Vob2xkZXJdXSIgZXJyb3ItbWVzc2FnZT0iW1tlcnJvck1lc3NhZ2VdXSIgYWx3YXlzLWZsb2F0LWxhYmVsPSJbW2Fsd2F5c0Zsb2F0TGFiZWxdXSIgbm8tbGFiZWwtZmxvYXQ9Iltbbm9MYWJlbEZsb2F0XV0iIGxhYmVsPSJbW2xhYmVsXV0iPgogICAgICAgICAgCiAgICAgICAgICA8aXJvbi1pY29uIGljb249InBhcGVyLWRyb3Bkb3duLW1lbnU6YXJyb3ctZHJvcC1kb3duIiBzdWZmaXggc2xvdD0ic3VmZml4Ij48L2lyb24taWNvbj4KICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8L2Rpdj4KICAgICAgPHNsb3QgaWQ9ImNvbnRlbnQiIG5hbWU9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPjwvc2xvdD4KICAgIDwvcGFwZXItbWVudS1idXR0b24+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItbGlzdGJveCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogOHB4IDA7CgogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLWxpc3Rib3gtYmFja2dyb3VuZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWxpc3Rib3gtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1saXN0Ym94OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pdGVtLXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QsIC5wYXBlci1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tcGFwZXItaXRlbS1taW4taGVpZ2h0LCA0OHB4KTsKICAgICAgICBwYWRkaW5nOiAwcHggMTZweDsKICAgICAgfQoKICAgICAgLnBhcGVyLWl0ZW0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgICBib3JkZXI6bm9uZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSwgLnBhcGVyLWl0ZW1baGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICA6aG9zdCguaXJvbi1zZWxlY3RlZCksIC5wYXBlci1pdGVtLmlyb24tc2VsZWN0ZWQgewogICAgICAgIGZvbnQtd2VpZ2h0OiB2YXIoLS1wYXBlci1pdGVtLXNlbGVjdGVkLXdlaWdodCwgYm9sZCk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0tc2VsZWN0ZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pLCAucGFwZXItaXRlbVtkaXNhYmxlZF0gewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pdGVtLWRpc2FibGVkLWNvbG9yLCB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cyksIC5wYXBlci1pdGVtOmZvY3VzIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3V0bGluZTogMDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1mb2N1c2VkOwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpOmJlZm9yZSwgLnBhcGVyLWl0ZW06Zm9jdXM6YmVmb3JlIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwoKICAgICAgICBiYWNrZ3JvdW5kOiBjdXJyZW50Q29sb3I7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tZGFyay1kaXZpZGVyLW9wYWNpdHkpOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLWZvY3VzZWQtYmVmb3JlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pdGVtIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItaXRlbS1zaGFyZWQtc3R5bGVzIj4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1zdWJoZWFkOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1iYWNrZW5kIj4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1zdG9yYWdlIj4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGFnLWZpbHRlcmVyIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItaW5wdXQgbm8tbGFiZWwtZmxvYXQgbGFiZWw9IkZpbHRlciB0YWdzIChyZWd1bGFyIGV4cHJlc3Npb25zIHN1cHBvcnRlZCkiIHZhbHVlPSJ7e190YWdGaWx0ZXJ9fSIgY2xhc3M9InNlYXJjaC1pbnB1dCI+CiAgICAgIDxpcm9uLWljb24gcHJlZml4IGljb249InNlYXJjaCIgc2xvdD0icHJlZml4Ij48L2lyb24taWNvbj4KICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDEwcHggNXB4IDEwcHggMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmxheW91dC5ob3Jpem9udGFsLAogICAgICAubGF5b3V0LnZlcnRpY2FsIHsKICAgICAgICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmxheW91dC5pbmxpbmUgewogICAgICAgIGRpc3BsYXk6IC1tcy1pbmxpbmUtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWlubGluZS1mbGV4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICB9CgogICAgICAubGF5b3V0Lmhvcml6b250YWwgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CgogICAgICAubGF5b3V0LnZlcnRpY2FsIHsKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgLmxheW91dC53cmFwIHsKICAgICAgICAtbXMtZmxleC13cmFwOiB3cmFwOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwOwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfQoKICAgICAgLmxheW91dC5uby13cmFwIHsKICAgICAgICAtbXMtZmxleC13cmFwOiBub3dyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXIsCiAgICAgIC5sYXlvdXQuY2VudGVyLWNlbnRlciB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItanVzdGlmaWVkLAogICAgICAubGF5b3V0LmNlbnRlci1jZW50ZXIgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAuZmxleCB7CiAgICAgICAgLW1zLWZsZXg6IDEgMSAwLjAwMDAwMDAwMXB4OwogICAgICAgIC13ZWJraXQtZmxleDogMTsKICAgICAgICBmbGV4OiAxOwogICAgICAgIC13ZWJraXQtZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgICBmbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICB9CgogICAgICAuZmxleC1hdXRvIHsKICAgICAgICAtbXMtZmxleDogMSAxIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDEgYXV0bzsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfQoKICAgICAgLmZsZXgtbm9uZSB7CiAgICAgICAgLW1zLWZsZXg6IG5vbmU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiBub25lOwogICAgICAgIGZsZXg6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgtcmV2ZXJzZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAubGF5b3V0Lmhvcml6b250YWwtcmV2ZXJzZSwKICAgICAgLmxheW91dC52ZXJ0aWNhbC1yZXZlcnNlIHsKICAgICAgICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmxheW91dC5ob3Jpem9udGFsLXJldmVyc2UgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICB9CgogICAgICAubGF5b3V0LnZlcnRpY2FsLXJldmVyc2UgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICB9CgogICAgICAubGF5b3V0LndyYXAtcmV2ZXJzZSB7CiAgICAgICAgLW1zLWZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgtYWxpZ25tZW50Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC8qKgogICAgICAgKiBBbGlnbm1lbnQgaW4gY3Jvc3MgYXhpcy4KICAgICAgICovCiAgICAgIC5sYXlvdXQuc3RhcnQgewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBzdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAubGF5b3V0LmNlbnRlciwKICAgICAgLmxheW91dC5jZW50ZXItY2VudGVyIHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmVuZCB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYmFzZWxpbmUgewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBbGlnbm1lbnQgaW4gbWFpbiBheGlzLgogICAgICAgKi8KICAgICAgLmxheW91dC5zdGFydC1qdXN0aWZpZWQgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IHN0YXJ0OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItanVzdGlmaWVkLAogICAgICAubGF5b3V0LmNlbnRlci1jZW50ZXIgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmVuZC1qdXN0aWZpZWQgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGVuZDsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLmxheW91dC5hcm91bmQtanVzdGlmaWVkIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBkaXN0cmlidXRlOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuanVzdGlmaWVkIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBqdXN0aWZ5OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlbGYgYWxpZ25tZW50LgogICAgICAgKi8KICAgICAgLnNlbGYtc3RhcnQgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAuc2VsZi1jZW50ZXIgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICB9CgogICAgICAuc2VsZi1lbmQgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICB9CgogICAgICAuc2VsZi1zdHJldGNoIHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgICAgYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgfQoKICAgICAgLnNlbGYtYmFzZWxpbmUgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICB9CgogICAgICAvKioKICAgICAgICogbXVsdGktbGluZSBhbGlnbm1lbnQgaW4gbWFpbiBheGlzLgogICAgICAgKi8KICAgICAgLmxheW91dC5zdGFydC1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IHN0YXJ0OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAubGF5b3V0LmVuZC1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGVuZDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItYWxpZ25lZCB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBjZW50ZXI7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYmV0d2Vlbi1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGp1c3RpZnk7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYXJvdW5kLWFsaWduZWQgewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogZGlzdHJpYnV0ZTsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Cgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1mbGV4LWZhY3RvcnMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmZsZXgsCiAgICAgIC5mbGV4LTEgewogICAgICAgIC1tcy1mbGV4OiAxIDEgMC4wMDAwMDAwMDFweDsKICAgICAgICAtd2Via2l0LWZsZXg6IDE7CiAgICAgICAgZmxleDogMTsKICAgICAgICAtd2Via2l0LWZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgICAgZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgfQoKICAgICAgLmZsZXgtMiB7CiAgICAgICAgLW1zLWZsZXg6IDI7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAyOwogICAgICAgIGZsZXg6IDI7CiAgICAgIH0KCiAgICAgIC5mbGV4LTMgewogICAgICAgIC1tcy1mbGV4OiAzOwogICAgICAgIC13ZWJraXQtZmxleDogMzsKICAgICAgICBmbGV4OiAzOwogICAgICB9CgogICAgICAuZmxleC00IHsKICAgICAgICAtbXMtZmxleDogNDsKICAgICAgICAtd2Via2l0LWZsZXg6IDQ7CiAgICAgICAgZmxleDogNDsKICAgICAgfQoKICAgICAgLmZsZXgtNSB7CiAgICAgICAgLW1zLWZsZXg6IDU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA1OwogICAgICAgIGZsZXg6IDU7CiAgICAgIH0KCiAgICAgIC5mbGV4LTYgewogICAgICAgIC1tcy1mbGV4OiA2OwogICAgICAgIC13ZWJraXQtZmxleDogNjsKICAgICAgICBmbGV4OiA2OwogICAgICB9CgogICAgICAuZmxleC03IHsKICAgICAgICAtbXMtZmxleDogNzsKICAgICAgICAtd2Via2l0LWZsZXg6IDc7CiAgICAgICAgZmxleDogNzsKICAgICAgfQoKICAgICAgLmZsZXgtOCB7CiAgICAgICAgLW1zLWZsZXg6IDg7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA4OwogICAgICAgIGZsZXg6IDg7CiAgICAgIH0KCiAgICAgIC5mbGV4LTkgewogICAgICAgIC1tcy1mbGV4OiA5OwogICAgICAgIC13ZWJraXQtZmxleDogOTsKICAgICAgICBmbGV4OiA5OwogICAgICB9CgogICAgICAuZmxleC0xMCB7CiAgICAgICAgLW1zLWZsZXg6IDEwOwogICAgICAgIC13ZWJraXQtZmxleDogMTA7CiAgICAgICAgZmxleDogMTA7CiAgICAgIH0KCiAgICAgIC5mbGV4LTExIHsKICAgICAgICAtbXMtZmxleDogMTE7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxMTsKICAgICAgICBmbGV4OiAxMTsKICAgICAgfQoKICAgICAgLmZsZXgtMTIgewogICAgICAgIC1tcy1mbGV4OiAxMjsKICAgICAgICAtd2Via2l0LWZsZXg6IDEyOwogICAgICAgIGZsZXg6IDEyOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1wb3NpdGlvbmluZyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuYmxvY2sgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaW52aXNpYmxlIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLnJlbGF0aXZlIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIGJvZHkuZnVsbGJsZWVkIHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgfQoKICAgICAgLnNjcm9sbCB7CiAgICAgICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAvKiBmaXhlZCBwb3NpdGlvbiAqLwogICAgICAuZml4ZWQtYm90dG9tLAogICAgICAuZml4ZWQtbGVmdCwKICAgICAgLmZpeGVkLXJpZ2h0LAogICAgICAuZml4ZWQtdG9wIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KCiAgICAgIC5maXhlZC10b3AgewogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtcmlnaHQgewogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgIH0KCiAgICAgIC5maXhlZC1ib3R0b20gewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtbGVmdCB7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogIDpyb290IHsKICAgIC0tdGItb3JhbmdlLXdlYWs6ICNmZmE3MjY7CiAgICAtLXRiLW9yYW5nZS1zdHJvbmc6ICNmNTdjMDA7CiAgICAtLXRiLW9yYW5nZS1kYXJrOiAjZGM3MzIwOwogICAgLS10Yi1ncmV5LWRhcmtlcjogI2UyZTJlMjsKICAgIC0tdGItZ3JleS1saWdodGVyOiAjZjNmM2YzOwogICAgLS10Yi11aS1kYXJrLWFjY2VudDogIzc1NzU3NTsKICAgIC0tdGItdWktbGlnaHQtYWNjZW50OiAjZTBlMGUwOwogICAgLS10Yi1ncmFwaC1mYWRlZDogI2UwZDRiMzsKICB9Cjwvc3R5bGU+CgoKPGRvbS1tb2R1bGUgaWQ9ImRhc2hib2FyZC1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9Imlyb24tZmxleCI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIC0tc2lkZWJhci12ZXJ0aWNhbC1wYWRkaW5nOiAxNXB4OwogICAgICAgIC0tc2lkZWJhci1sZWZ0LXBhZGRpbmc6IDMwcHg7CiAgICAgIH0KCiAgICAgIFtzbG90PSdzaWRlYmFyJ10gewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIHBhZGRpbmc6IDVweCAwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CgogICAgICB0Zi1ydW5zLXNlbGVjdG9yIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgbGVmdDogdmFyKC0tc2lkZWJhci1sZWZ0LXBhZGRpbmcpOwogICAgICAgIG1heC1oZWlnaHQ6IGNhbGMoMTAwJSAtIHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgKiAyKTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgfQoKICAgICAgLnNlYXJjaC1pbnB1dCB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDVweCAwIDEwcHg7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gewogICAgICAgIGJvcmRlci10b3A6IHNvbGlkIDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpOwogICAgICAgIHBhZGRpbmc6IHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgMAogICAgICAgICAgdmFyKC0tc2lkZWJhci12ZXJ0aWNhbC1wYWRkaW5nKSB2YXIoLS1zaWRlYmFyLWxlZnQtcGFkZGluZyk7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuc2lkZWJhci1zZWN0aW9uOmZpcnN0LW9mLXR5cGUgewogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbjpsYXN0LW9mLXR5cGUgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAuc2lkZWJhci1zZWN0aW9uIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgbWFyZ2luOiA1cHg7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmZpcnN0LW9mLXR5cGUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmxhc3Qtb2YtdHlwZSB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6Zmlyc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgcGFkZGluZy10b3A6IDA7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMDsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbiBoMyB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktODAwKTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBtYXJnaW46IDEwcHggMCA1cHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTVweDsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJzY3JvbGxiYXItc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICB9CgogICAgICAuc2Nyb2xsYmFyOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMCAycHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICB9CiAgICAgIC5zY3JvbGxiYXIgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRhc2hib2FyZC1sYXlvdXQiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9InNpZGViYXIiPgogICAgICA8c2xvdCBuYW1lPSJzaWRlYmFyIj48L3Nsb3Q+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjZW50ZXIiPgogICAgICA8c2xvdCBuYW1lPSJjZW50ZXIiIGNsYXNzPSJzY29sbGJhciI+PC9zbG90PgogICAgPC9kaXY+CiAgICA8c3R5bGUgaW5jbHVkZT0ic2Nyb2xsYmFyLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgI3NpZGViYXIgewogICAgICAgIGZsZXg6IDAgMCB2YXIoLS10Zi1kYXNoYm9hcmQtbGF5b3V0LXNpZGViYXItYmFzaXMsIDI1JSk7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG1heC13aWR0aDogdmFyKC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1heC13aWR0aCwgMzUwcHgpOwogICAgICAgIG1pbi13aWR0aDogdmFyKC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1pbi13aWR0aCwgMjcwcHgpOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KCiAgICAgICNjZW50ZXIgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgOjpzbG90dGVkKFtzbG90PSdjZW50ZXInXSkgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAudGYtZ3JhcGgtZGFzaGJvYXJkICNjZW50ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1vcHRpb24tc2VsZWN0b3IiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9IndyYXAiPgogICAgICA8aDM+W1tuYW1lXV08L2gzPgogICAgICA8ZGl2IGNsYXNzPSJjb250ZW50LXdyYXBwZXIiPjxzbG90Pjwvc2xvdD48L2Rpdj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCguc2VsZWN0ZWQpIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIGgzIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIG1hcmdpbjogMCAwIDVweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWNvbGxhcHNlIj4KCiAgPHRlbXBsYXRlPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLWlyb24tY29sbGFwc2UtdHJhbnNpdGlvbi1kdXJhdGlvbiwgMzAwbXMpOwogICAgICAgIC8qIFNhZmFyaSAxMCBuZWVkcyB0aGlzIHByb3BlcnR5IHByZWZpeGVkIHRvIGNvcnJlY3RseSBhcHBseSB0aGUgY3VzdG9tIHByb3BlcnR5ICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1pcm9uLWNvbGxhcHNlLXRyYW5zaXRpb24tZHVyYXRpb24sIDMwMG1zKTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmlyb24tY29sbGFwc2UtY2xvc2VkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdCguaXJvbi1jb2xsYXBzZS1vcGVuZWQpKSB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CgogIDwvdGVtcGxhdGU+Cgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3BhbmVSZW5kZXJlZF1dIiBpZD0iaWZSZW5kZXJlZCI+CiAgICAgIDxidXR0b24gY2xhc3M9ImhlYWRpbmciIG9uLXRhcD0iX3RvZ2dsZVBhbmUiIG9wZW4tYnV0dG9uJD0iW1tvcGVuZWRdXSI+CiAgICAgICAgPHNwYW4gY2xhc3M9Im5hbWUiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1NlYXJjaFJlc3VsdHNdXSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNDb21wb3NpdGVTZWFyY2goY2F0ZWdvcnkpXV0iPgogICAgICAgICAgICAgIDxzcGFuPlRhZ3MgbWF0Y2hpbmcgbXVsdGlwbGUgZXhwZXJpbWVudHM8L3NwYW4+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0ludmFsaWRTZWFyY2hSZXN1bHRzXV0iPgogICAgICAgICAgICAgICAgPHNwYW4+Jm5ic3A7PHN0cm9uZz4obWFsZm9ybWVkIHJlZ3VsYXIgZXhwcmVzc2lvbik8L3N0cm9uZz48L3NwYW4+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaXNDb21wb3NpdGVTZWFyY2goY2F0ZWdvcnkpXV0iPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsaWdodCI+VGFncyBtYXRjaGluZyAvPC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS1uYW1lIiB0aXRsZSQ9IltbY2F0ZWdvcnkubmFtZV1dIj5bW2NhdGVnb3J5Lm5hbWVdXTwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGlnaHQiPi88L3NwYW4+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5XV0iPgogICAgICAgICAgICAgICAgPHNwYW4+IChhbGwgdGFncyk8L3NwYW4+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzSW52YWxpZFNlYXJjaFJlc3VsdHNdXSI+CiAgICAgICAgICAgICAgICA8c3Bhbj4gPHN0cm9uZz4obWFsZm9ybWVkIHJlZ3VsYXIgZXhwcmVzc2lvbik8L3N0cm9uZz48L3NwYW4+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9pc1NlYXJjaFJlc3VsdHNdXSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS1uYW1lIiB0aXRsZSQ9IltbY2F0ZWdvcnkubmFtZV1dIj5bW2NhdGVnb3J5Lm5hbWVdXTwvc3Bhbj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJjb3VudCI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlXV0iPgogICAgICAgICAgICA8c3Bhbj5bW19jb3VudF1dPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iZXhwYW5kLW1vcmUiIGNsYXNzPSJleHBhbmQtYXJyb3ciPjwvaXJvbi1pY29uPgogICAgICAgIDwvc3Bhbj4KICAgICAgPC9idXR0b24+CiAgICAgIAogICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9Iltbb3BlbmVkXV0iIG5vLWFuaW1hdGlvbj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgICAgIDxzcGFuIGlkPSJ0b3Atb2YtY29udGFpbmVyIj48L3NwYW4+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX211bHRpcGxlUGFnZXNFeGlzdF1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmlnLXBhZ2UtYnV0dG9ucyIgc3R5bGU9Im1hcmdpbi1ib3R0b206IDEwcHg7Ij4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIG9uLXRhcD0iX3BlcmZvcm1QcmV2aW91c1BhZ2UiIGRpc2FibGVkJD0iW1shX2hhc1ByZXZpb3VzUGFnZV1dIj5QcmV2aW91cyBwYWdlPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBvbi10YXA9Il9wZXJmb3JtTmV4dFBhZ2UiIGRpc2FibGVkJD0iW1shX2hhc05leHRQYWdlXV0iPk5leHQgcGFnZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgICAgPGRpdiBpZD0iaXRlbXMiPgogICAgICAgICAgICA8c2xvdCBuYW1lPSJpdGVtcyI+PC9zbG90PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX211bHRpcGxlUGFnZXNFeGlzdF1dIj4KICAgICAgICAgICAgPGRpdiBpZD0iY29udHJvbHMtY29udGFpbmVyIj4KICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmc6IDAgNXB4Ij4KICAgICAgICAgICAgICAgIFBhZ2UKICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBpZD0icGFnZS1pbnB1dCIgdHlwZT0ibnVtYmVyIiBuby1sYWJlbC1mbG9hdCBtaW49IjEiIG1heD0iW1tfcGFnZUNvdW50XV0iIHZhbHVlPSJbW19wYWdlSW5wdXRWYWx1ZV1dIiBvbi1pbnB1dD0iX2hhbmRsZVBhZ2VJbnB1dEV2ZW50IiBvbi1jaGFuZ2U9Il9oYW5kbGVQYWdlQ2hhbmdlRXZlbnQiIG9uLWZvY3VzPSJfaGFuZGxlUGFnZUZvY3VzRXZlbnQiIG9uLWJsdXI9Il9oYW5kbGVQYWdlQmx1ckV2ZW50Ij48L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgb2YgW1tfcGFnZUNvdW50XV0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJiaWctcGFnZS1idXR0b25zIiBzdHlsZT0ibWFyZ2luLXRvcDogMTBweDsiPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gb24tdGFwPSJfcGVyZm9ybVByZXZpb3VzUGFnZSIgZGlzYWJsZWQkPSJbWyFfaGFzUHJldmlvdXNQYWdlXV0iPlByZXZpb3VzIHBhZ2U8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIG9uLXRhcD0iX3BlcmZvcm1OZXh0UGFnZSIgZGlzYWJsZWQkPSJbWyFfaGFzTmV4dFBhZ2VdXSI+TmV4dCBwYWdlPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbjogMCA1cHggMXB4IDEwcHg7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmaXJzdC1vZi10eXBlKSB7CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoOmxhc3Qtb2YtdHlwZSkgewogICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZvbnQtc2l6ZTogMTVweDsKICAgICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgICBib3gtc2hhZG93OiAwIDFweCA1cHggcmdiYSgwLCAwLCAwLCAwLjIpOwogICAgICAgIHBhZGRpbmc6IDEwcHggMTVweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9CgogICAgICAuaGVhZGluZzo6LW1vei1mb2N1cy1pbm5lciB7CiAgICAgICAgcGFkZGluZzogMTBweCAxNXB4OwogICAgICB9CgogICAgICBbb3Blbi1idXR0b25dIHsKICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDAgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgW29wZW4tYnV0dG9uXSAuZXhwYW5kLWFycm93IHsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZVooMTgwZGVnKTsKICAgICAgfQoKICAgICAgLm5hbWUgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5saWdodCB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgfQoKICAgICAgLmNhdGVnb3J5LW5hbWUgewogICAgICAgIHdoaXRlLXNwYWNlOiBwcmU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBwYWRkaW5nOiAycHggMDsKICAgICAgfQoKICAgICAgLmNvdW50IHsKICAgICAgICBtYXJnaW46IDAgNXB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS01MDApOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBmbGV4OiBub25lOwogICAgICB9CgogICAgICAuaGVhZGluZzo6LW1vei1mb2N1cy1pbm5lciB7CiAgICAgICAgcGFkZGluZzogMTBweCAxNXB4OwogICAgICB9CgogICAgICAuY29udGVudCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDJweDsKICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMnB4OwogICAgICAgIGJvcmRlci10b3A6IG5vbmU7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RlZGVkZTsKICAgICAgICBwYWRkaW5nOiAxNXB4OwogICAgICB9CgogICAgICAubGlnaHQgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTUwMCk7CiAgICAgIH0KCiAgICAgICNjb250cm9scy1jb250YWluZXIgewogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNjb250cm9scy1jb250YWluZXIgcGFwZXItYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIC5iaWctcGFnZS1idXR0b25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAuYmlnLXBhZ2UtYnV0dG9ucyBwYXBlci1idXR0b24gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgZmxleC1iYXNpczogMDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICB9CgogICAgICAuYmlnLXBhZ2UtYnV0dG9ucyBwYXBlci1idXR0b25bZGlzYWJsZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICB9CgogICAgICBzbG90IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CgogICAgICAjcGFnZS1pbnB1dCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiB2YXIoLS10Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldy1wYWdlLWlucHV0LXdpZHRoLCAxMDAlKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWRpYWxvZy1zaGFyZWQtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDI0cHggNDBweDsKCiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItZGlhbG9nLWJhY2tncm91bmQtY29sb3IsIHZhcigtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvcikpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1kaWFsb2ctY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWJvZHkxOwogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kaWFsb2c7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKCopIHsKICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDAgMjRweDsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoLm5vLXBhZGRpbmcpIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKjpmaXJzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi10b3A6IDI0cHg7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKCo6bGFzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgIH0KCiAgICAgIC8qIEluIDEueCwgdGhpcyBzZWxlY3RvciB3YXMgYDpob3N0ID4gOjpjb250ZW50IGgyYC4gSW4gMi54IDxzbG90PiBhbGxvd3MKICAgICAgdG8gc2VsZWN0IGRpcmVjdCBjaGlsZHJlbiBvbmx5LCB3aGljaCBpbmNyZWFzZXMgdGhlIHdlaWdodCBvZiB0aGlzCiAgICAgIHNlbGVjdG9yLCBzbyB3ZSBoYXZlIHRvIHJlLWRlZmluZSBmaXJzdC1jaGlsZC9sYXN0LWNoaWxkIG1hcmdpbnMgYmVsb3cuICovCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKGgyKSB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1hcmdpbjogMDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC10aXRsZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kaWFsb2ctdGl0bGU7CiAgICAgIH0KCiAgICAgIC8qIEFwcGx5IG1peGluIGFnYWluLCBpbiBjYXNlIGl0IHNldHMgbWFyZ2luLXRvcC4gKi8KICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoaDI6Zmlyc3QtY2hpbGQpIHsKICAgICAgICBtYXJnaW4tdG9wOiAyNHB4OwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy10aXRsZTsKICAgICAgfQoKICAgICAgLyogQXBwbHkgbWl4aW4gYWdhaW4sIGluIGNhc2UgaXQgc2V0cyBtYXJnaW4tYm90dG9tLiAqLwogICAgICA6aG9zdCA+IDo6c2xvdHRlZChoMjpsYXN0LWNoaWxkKSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kaWFsb2ctdGl0bGU7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKC5wYXBlci1kaWFsb2ctYnV0dG9ucyksCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKC5idXR0b25zKSB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHBhZGRpbmc6IDhweCA4cHggOHB4IDI0cHg7CiAgICAgICAgbWFyZ2luOiAwOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZGlhbG9nLWJ1dHRvbi1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZW5kLWp1c3RpZmllZDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1kaWFsb2ciPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJwYXBlci1kaWFsb2ctc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWNvbG9yLXNjYWxlIj4KICAKICAKPC9kb20tbW9kdWxlPgoKCgoKPGlyb24taWNvbnNldC1zdmcgbmFtZT0iaWNvbnMiIHNpemU9IjI0Ij4KPHN2Zz48ZGVmcz4KPGcgaWQ9IjNkLXJvdGF0aW9uIj48cGF0aCBkPSJNNy41MiAyMS40OEM0LjI1IDE5Ljk0IDEuOTEgMTYuNzYgMS41NSAxM0guMDVDLjU2IDE5LjE2IDUuNzEgMjQgMTIgMjRsLjY2LS4wMy0zLjgxLTMuODEtMS4zMyAxLjMyem0uODktNi41MmMtLjE5IDAtLjM3LS4wMy0uNTItLjA4LS4xNi0uMDYtLjI5LS4xMy0uNC0uMjQtLjExLS4xLS4yLS4yMi0uMjYtLjM3LS4wNi0uMTQtLjA5LS4zLS4wOS0uNDdoLTEuM2MwIC4zNi4wNy42OC4yMS45NS4xNC4yNy4zMy41LjU2LjY5LjI0LjE4LjUxLjMyLjgyLjQxLjMuMS42Mi4xNS45Ni4xNS4zNyAwIC43Mi0uMDUgMS4wMy0uMTUuMzItLjEuNi0uMjUuODMtLjQ0cy40Mi0uNDMuNTUtLjcyYy4xMy0uMjkuMi0uNjEuMi0uOTcgMC0uMTktLjAyLS4zOC0uMDctLjU2LS4wNS0uMTgtLjEyLS4zNS0uMjMtLjUxLS4xLS4xNi0uMjQtLjMtLjQtLjQzLS4xNy0uMTMtLjM3LS4yMy0uNjEtLjMxLjItLjA5LjM3LS4yLjUyLS4zMy4xNS0uMTMuMjctLjI3LjM3LS40Mi4xLS4xNS4xNy0uMy4yMi0uNDYuMDUtLjE2LjA3LS4zMi4wNy0uNDggMC0uMzYtLjA2LS42OC0uMTgtLjk2LS4xMi0uMjgtLjI5LS41MS0uNTEtLjY5LS4yLS4xOS0uNDctLjMzLS43Ny0uNDNDOS4xIDguMDUgOC43NiA4IDguMzkgOGMtLjM2IDAtLjY5LjA1LTEgLjE2LS4zLjExLS41Ny4yNi0uNzkuNDUtLjIxLjE5LS4zOC40MS0uNTEuNjctLjEyLjI2LS4xOC41NC0uMTguODVoMS4zYzAtLjE3LjAzLS4zMi4wOS0uNDVzLjE0LS4yNS4yNS0uMzRjLjExLS4wOS4yMy0uMTcuMzgtLjIyLjE1LS4wNS4zLS4wOC40OC0uMDguNCAwIC43LjEuODkuMzEuMTkuMi4yOS40OS4yOS44NiAwIC4xOC0uMDMuMzQtLjA4LjQ5LS4wNS4xNS0uMTQuMjctLjI1LjM3LS4xMS4xLS4yNS4xOC0uNDEuMjQtLjE2LjA2LS4zNi4wOS0uNTguMDlINy41djEuMDNoLjc3Yy4yMiAwIC40Mi4wMi42LjA3cy4zMy4xMy40NS4yM2MuMTIuMTEuMjIuMjQuMjkuNC4wNy4xNi4xLjM1LjEuNTcgMCAuNDEtLjEyLjcyLS4zNS45My0uMjMuMjMtLjU1LjMzLS45NS4zM3ptOC41NS01LjkyYy0uMzItLjMzLS43LS41OS0xLjE0LS43Ny0uNDMtLjE4LS45Mi0uMjctMS40Ni0uMjdIMTJ2OGgyLjNjLjU1IDAgMS4wNi0uMDkgMS41MS0uMjcuNDUtLjE4Ljg0LS40MyAxLjE2LS43Ni4zMi0uMzMuNTctLjczLjc0LTEuMTkuMTctLjQ3LjI2LS45OS4yNi0xLjU3di0uNGMwLS41OC0uMDktMS4xLS4yNi0xLjU3LS4xOC0uNDctLjQzLS44Ny0uNzUtMS4yem0tLjM5IDMuMTZjMCAuNDItLjA1Ljc5LS4xNCAxLjEzLS4xLjMzLS4yNC42Mi0uNDMuODUtLjE5LjIzLS40My40MS0uNzEuNTMtLjI5LjEyLS42Mi4xOC0uOTkuMThoLS45MVY5LjEyaC45N2MuNzIgMCAxLjI3LjIzIDEuNjQuNjkuMzguNDYuNTcgMS4xMi41NyAxLjk5di40ek0xMiAwbC0uNjYuMDMgMy44MSAzLjgxIDEuMzMtMS4zM2MzLjI3IDEuNTUgNS42MSA0LjcyIDUuOTYgOC40OGgxLjVDMjMuNDQgNC44NCAxOC4yOSAwIDEyIDB6IiAvPjwvZz4KPGcgaWQ9ImFjY2Vzc2liaWxpdHkiPjxwYXRoIGQ9Ik0xMiAyYzEuMSAwIDIgLjkgMiAycy0uOSAyLTIgMi0yLS45LTItMiAuOS0yIDItMnptOSA3aC02djEzaC0ydi02aC0ydjZIOVY5SDNWN2gxOHYyeiIgLz48L2c+CjxnIGlkPSJhY2Nlc3NpYmxlIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjQiIHI9IjIiIC8+PHBhdGggZD0iTTE5IDEzdi0yYy0xLjU0LjAyLTMuMDktLjc1LTQuMDctMS44M2wtMS4yOS0xLjQzYy0uMTctLjE5LS4zOC0uMzQtLjYxLS40NS0uMDEgMC0uMDEtLjAxLS4wMi0uMDFIMTNjLS4zNS0uMi0uNzUtLjMtMS4xOS0uMjZDMTAuNzYgNy4xMSAxMCA4LjA0IDEwIDkuMDlWMTVjMCAxLjEuOSAyIDIgMmg1djVoMnYtNS41YzAtMS4xLS45LTItMi0yaC0zdi0zLjQ1YzEuMjkgMS4wNyAzLjI1IDEuOTQgNSAxLjk1em0tNi4xNyA1Yy0uNDEgMS4xNi0xLjUyIDItMi44MyAyLTEuNjYgMC0zLTEuMzQtMy0zIDAtMS4zMS44NC0yLjQxIDItMi44M1YxMi4xYy0yLjI4LjQ2LTQgMi40OC00IDQuOSAwIDIuNzYgMi4yNCA1IDUgNSAyLjQyIDAgNC40NC0xLjcyIDQuOS00aC0yLjA3eiIgLz48L2c+CjxnIGlkPSJhY2NvdW50LWJhbGFuY2UiPjxwYXRoIGQ9Ik00IDEwdjdoM3YtN0g0em02IDB2N2gzdi03aC0zek0yIDIyaDE5di0zSDJ2M3ptMTQtMTJ2N2gzdi03aC0zem0tNC41LTlMMiA2djJoMTlWNmwtOS41LTV6IiAvPjwvZz4KPGcgaWQ9ImFjY291bnQtYmFsYW5jZS13YWxsZXQiPjxwYXRoIGQ9Ik0yMSAxOHYxYzAgMS4xLS45IDItMiAySDVjLTEuMTEgMC0yLS45LTItMlY1YzAtMS4xLjg5LTIgMi0yaDE0YzEuMSAwIDIgLjkgMiAydjFoLTljLTEuMTEgMC0yIC45LTIgMnY4YzAgMS4xLjg5IDIgMiAyaDl6bS05LTJoMTBWOEgxMnY4em00LTIuNWMtLjgzIDAtMS41LS42Ny0xLjUtMS41cy42Ny0xLjUgMS41LTEuNSAxLjUuNjcgMS41IDEuNS0uNjcgMS41LTEuNSAxLjV6IiAvPjwvZz4KPGcgaWQ9ImFjY291bnQtYm94Ij48cGF0aCBkPSJNMyA1djE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJINWMtMS4xMSAwLTIgLjktMiAyem0xMiA0YzAgMS42Ni0xLjM0IDMtMyAzcy0zLTEuMzQtMy0zIDEuMzQtMyAzLTMgMyAxLjM0IDMgM3ptLTkgOGMwLTIgNC0zLjEgNi0zLjFzNiAxLjEgNiAzLjF2MUg2di0xeiIgLz48L2c+CjxnIGlkPSJhY2NvdW50LWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgM2MxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgMy0zLTEuMzQtMy0zIDEuMzQtMyAzLTN6bTAgMTQuMmMtMi41IDAtNC43MS0xLjI4LTYtMy4yMi4wMy0xLjk5IDQtMy4wOCA2LTMuMDggMS45OSAwIDUuOTcgMS4wOSA2IDMuMDgtMS4yOSAxLjk0LTMuNSAzLjIyLTYgMy4yMnoiIC8+PC9nPgo8ZyBpZD0iYWRkIj48cGF0aCBkPSJNMTkgMTNoLTZ2NmgtMnYtNkg1di0yaDZWNWgydjZoNnYyeiIgLz48L2c+CjxnIGlkPSJhZGQtYWxlcnQiPjxwYXRoIGQ9Ik0xMC4wMSAyMS4wMWMwIDEuMS44OSAxLjk5IDEuOTkgMS45OXMxLjk5LS44OSAxLjk5LTEuOTloLTMuOTh6bTguODctNC4xOVYxMWMwLTMuMjUtMi4yNS01Ljk3LTUuMjktNi42OXYtLjcyQzEzLjU5IDIuNzEgMTIuODggMiAxMiAycy0xLjU5LjcxLTEuNTkgMS41OXYuNzJDNy4zNyA1LjAzIDUuMTIgNy43NSA1LjEyIDExdjUuODJMMyAxOC45NFYyMGgxOHYtMS4wNmwtMi4xMi0yLjEyek0xNiAxMy4wMWgtM3YzaC0ydi0zSDhWMTFoM1Y4aDJ2M2gzdjIuMDF6IiAvPjwvZz4KPGcgaWQ9ImFkZC1ib3giPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tMiAxMGgtNHY0aC0ydi00SDd2LTJoNFY3aDJ2NGg0djJ6IiAvPjwvZz4KPGcgaWQ9ImFkZC1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem01IDExaC00djRoLTJ2LTRIN3YtMmg0VjdoMnY0aDR2MnoiIC8+PC9nPgo8ZyBpZD0iYWRkLWNpcmNsZS1vdXRsaW5lIj48cGF0aCBkPSJNMTMgN2gtMnY0SDd2Mmg0djRoMnYtNGg0di0yaC00Vjd6bS0xLTVDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJhZGQtc2hvcHBpbmctY2FydCI+PHBhdGggZD0iTTExIDloMlY2aDNWNGgtM1YxaC0ydjNIOHYyaDN2M3ptLTQgOWMtMS4xIDAtMS45OS45LTEuOTkgMlM1LjkgMjIgNyAyMnMyLS45IDItMi0uOS0yLTItMnptMTAgMGMtMS4xIDAtMS45OS45LTEuOTkgMnMuODkgMiAxLjk5IDIgMi0uOSAyLTItLjktMi0yLTJ6bS05LjgzLTMuMjVsLjAzLS4xMi45LTEuNjNoNy40NWMuNzUgMCAxLjQxLS40MSAxLjc1LTEuMDNsMy44Ni03LjAxTDE5LjQyIDRoLS4wMWwtMS4xIDItMi43NiA1SDguNTNsLS4xMy0uMjdMNi4xNiA2bC0uOTUtMi0uOTQtMkgxdjJoMmwzLjYgNy41OS0xLjM1IDIuNDVjLS4xNi4yOC0uMjUuNjEtLjI1Ljk2IDAgMS4xLjkgMiAyIDJoMTJ2LTJINy40MmMtLjEzIDAtLjI1LS4xMS0uMjUtLjI1eiIgLz48L2c+CjxnIGlkPSJhbGFybSI+PHBhdGggZD0iTTIyIDUuNzJsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek03Ljg4IDMuMzlMNi42IDEuODYgMiA1LjcxbDEuMjkgMS41MyA0LjU5LTMuODV6TTEyLjUgOEgxMXY2bDQuNzUgMi44NS43NS0xLjIzLTQtMi4zN1Y4ek0xMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5YzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0wIDE2Yy0zLjg3IDAtNy0zLjEzLTctN3MzLjEzLTcgNy03IDcgMy4xMyA3IDctMy4xMyA3LTcgN3oiIC8+PC9nPgo8ZyBpZD0iYWxhcm0tYWRkIj48cGF0aCBkPSJNNy44OCAzLjM5TDYuNiAxLjg2IDIgNS43MWwxLjI5IDEuNTMgNC41OS0zLjg1ek0yMiA1LjcybC00LjYtMy44Ni0xLjI5IDEuNTMgNC42IDMuODZMMjIgNS43MnpNMTIgNGMtNC45NyAwLTkgNC4wMy05IDlzNC4wMiA5IDkgOWM0Ljk3IDAgOS00LjAzIDktOXMtNC4wMy05LTktOXptMCAxNmMtMy44NyAwLTctMy4xMy03LTdzMy4xMy03IDctNyA3IDMuMTMgNyA3LTMuMTMgNy03IDd6bTEtMTFoLTJ2M0g4djJoM3YzaDJ2LTNoM3YtMmgtM1Y5eiIgLz48L2c+CjxnIGlkPSJhbGFybS1vZmYiPjxwYXRoIGQ9Ik0xMiA2YzMuODcgMCA3IDMuMTMgNyA3IDAgLjg0LS4xNiAxLjY1LS40MyAyLjRsMS41MiAxLjUyYy41OC0xLjE5LjkxLTIuNTEuOTEtMy45MiAwLTQuOTctNC4wMy05LTktOS0xLjQxIDAtMi43My4zMy0zLjkyLjkxTDkuNiA2LjQzQzEwLjM1IDYuMTYgMTEuMTYgNiAxMiA2em0xMC0uMjhsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek0yLjkyIDIuMjlMMS42NSAzLjU3IDIuOTggNC45bC0xLjExLjkzIDEuNDIgMS40MiAxLjExLS45NC44LjhDMy44MyA4LjY5IDMgMTAuNzUgMyAxM2MwIDQuOTcgNC4wMiA5IDkgOSAyLjI1IDAgNC4zMS0uODMgNS44OS0yLjJsMi4yIDIuMiAxLjI3LTEuMjdMMy44OSAzLjI3bC0uOTctLjk4em0xMy41NSAxNi4xQzE1LjI2IDE5LjM5IDEzLjcgMjAgMTIgMjBjLTMuODcgMC03LTMuMTMtNy03IDAtMS43LjYxLTMuMjYgMS42MS00LjQ3bDkuODYgOS44NnpNOC4wMiAzLjI4TDYuNiAxLjg2bC0uODYuNzEgMS40MiAxLjQyLjg2LS43MXoiIC8+PC9nPgo8ZyBpZD0iYWxhcm0tb24iPjxwYXRoIGQ9Ik0yMiA1LjcybC00LjYtMy44Ni0xLjI5IDEuNTMgNC42IDMuODZMMjIgNS43MnpNNy44OCAzLjM5TDYuNiAxLjg2IDIgNS43MWwxLjI5IDEuNTMgNC41OS0zLjg1ek0xMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5YzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0wIDE2Yy0zLjg3IDAtNy0zLjEzLTctN3MzLjEzLTcgNy03IDcgMy4xMyA3IDctMy4xMyA3LTcgN3ptLTEuNDYtNS40N0w4LjQxIDEyLjRsLTEuMDYgMS4wNiAzLjE4IDMuMTggNi02LTEuMDYtMS4wNi00LjkzIDQuOTV6IiAvPjwvZz4KPGcgaWQ9ImFsbC1vdXQiPjxwYXRoIGQ9Ik0xNi4yMSA0LjE2bDQgNHYtNHptNCAxMmwtNCA0aDR6bS0xMiA0bC00LTR2NHptLTQtMTJsNC00aC00em0xMi45NS0uOTVjLTIuNzMtMi43My03LjE3LTIuNzMtOS45IDBzLTIuNzMgNy4xNyAwIDkuOSA3LjE3IDIuNzMgOS45IDAgMi43My03LjE2IDAtOS45em0tMS4xIDguOGMtMi4xMyAyLjEzLTUuNTcgMi4xMy03LjcgMHMtMi4xMy01LjU3IDAtNy43IDUuNTctMi4xMyA3LjcgMCAyLjEzIDUuNTcgMCA3Ljd6IiAvPjwvZz4KPGcgaWQ9ImFuZHJvaWQiPjxwYXRoIGQ9Ik02IDE4YzAgLjU1LjQ1IDEgMSAxaDF2My41YzAgLjgzLjY3IDEuNSAxLjUgMS41czEuNS0uNjcgMS41LTEuNVYxOWgydjMuNWMwIC44My42NyAxLjUgMS41IDEuNXMxLjUtLjY3IDEuNS0xLjVWMTloMWMuNTUgMCAxLS40NSAxLTFWOEg2djEwek0zLjUgOEMyLjY3IDggMiA4LjY3IDIgOS41djdjMCAuODMuNjcgMS41IDEuNSAxLjVTNSAxNy4zMyA1IDE2LjV2LTdDNSA4LjY3IDQuMzMgOCAzLjUgOHptMTcgMGMtLjgzIDAtMS41LjY3LTEuNSAxLjV2N2MwIC44My42NyAxLjUgMS41IDEuNXMxLjUtLjY3IDEuNS0xLjV2LTdjMC0uODMtLjY3LTEuNS0xLjUtMS41em0tNC45Ny01Ljg0bDEuMy0xLjNjLjItLjIuMi0uNTEgMC0uNzEtLjItLjItLjUxLS4yLS43MSAwbC0xLjQ4IDEuNDhDMTMuODUgMS4yMyAxMi45NSAxIDEyIDFjLS45NiAwLTEuODYuMjMtMi42Ni42M0w3Ljg1LjE1Yy0uMi0uMi0uNTEtLjItLjcxIDAtLjIuMi0uMi41MSAwIC43MWwxLjMxIDEuMzFDNi45NyAzLjI2IDYgNS4wMSA2IDdoMTJjMC0xLjk5LS45Ny0zLjc1LTIuNDctNC44NHpNMTAgNUg5VjRoMXYxem01IDBoLTFWNGgxdjF6IiAvPjwvZz4KPGcgaWQ9ImFubm91bmNlbWVudCI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tNyA5aC0yVjVoMnY2em0wIDRoLTJ2LTJoMnYyeiIgLz48L2c+CjxnIGlkPSJhcHBzIj48cGF0aCBkPSJNNCA4aDRWNEg0djR6bTYgMTJoNHYtNGgtNHY0em0tNiAwaDR2LTRINHY0em0wLTZoNHYtNEg0djR6bTYgMGg0di00aC00djR6bTYtMTB2NGg0VjRoLTR6bS02IDRoNFY0aC00djR6bTYgNmg0di00aC00djR6bTAgNmg0di00aC00djR6IiAvPjwvZz4KPGcgaWQ9ImFyY2hpdmUiPjxwYXRoIGQ9Ik0yMC41NCA1LjIzbC0xLjM5LTEuNjhDMTguODggMy4yMSAxOC40NyAzIDE4IDNINmMtLjQ3IDAtLjg4LjIxLTEuMTYuNTVMMy40NiA1LjIzQzMuMTcgNS41NyAzIDYuMDIgMyA2LjVWMTljMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2LjVjMC0uNDgtLjE3LS45My0uNDYtMS4yN3pNMTIgMTcuNUw2LjUgMTJIMTB2LTJoNHYyaDMuNUwxMiAxNy41ek01LjEyIDVsLjgxLTFoMTJsLjk0IDFINS4xMnoiIC8+PC9nPgo8ZyBpZD0iYXJyb3ctYmFjayI+PHBhdGggZD0iTTIwIDExSDcuODNsNS41OS01LjU5TDEyIDRsLTggOCA4IDggMS40MS0xLjQxTDcuODMgMTNIMjB2LTJ6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWRvd253YXJkIj48cGF0aCBkPSJNMjAgMTJsLTEuNDEtMS40MUwxMyAxNi4xN1Y0aC0ydjEyLjE3bC01LjU4LTUuNTlMNCAxMmw4IDggOC04eiIgLz48L2c+CjxnIGlkPSJhcnJvdy1kcm9wLWRvd24iPjxwYXRoIGQ9Ik03IDEwbDUgNSA1LTV6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWRyb3AtZG93bi1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDEybC00LTRoOGwtNCA0eiIgLz48L2c+CjxnIGlkPSJhcnJvdy1kcm9wLXVwIj48cGF0aCBkPSJNNyAxNGw1LTUgNSA1eiIgLz48L2c+CjxnIGlkPSJhcnJvdy1mb3J3YXJkIj48cGF0aCBkPSJNMTIgNGwtMS40MSAxLjQxTDE2LjE3IDExSDR2MmgxMi4xN2wtNS41OCA1LjU5TDEyIDIwbDgtOHoiIC8+PC9nPgo8ZyBpZD0iYXJyb3ctdXB3YXJkIj48cGF0aCBkPSJNNCAxMmwxLjQxIDEuNDFMMTEgNy44M1YyMGgyVjcuODNsNS41OCA1LjU5TDIwIDEybC04LTgtOCA4eiIgLz48L2c+CjxnIGlkPSJhc3BlY3QtcmF0aW8iPjxwYXRoIGQ9Ik0xOSAxMmgtMnYzaC0zdjJoNXYtNXpNNyA5aDNWN0g1djVoMlY5em0xNC02SDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOTloMTh2MTQuMDJ6IiAvPjwvZz4KPGcgaWQ9ImFzc2Vzc21lbnQiPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNOSAxN0g3di03aDJ2N3ptNCAwaC0yVjdoMnYxMHptNCAwaC0ydi00aDJ2NHoiIC8+PC9nPgo8ZyBpZD0iYXNzaWdubWVudCI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0yIDE0SDd2LTJoN3Yyem0zLTRIN3YtMmgxMHYyem0wLTRIN1Y3aDEwdjJ6IiAvPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtaW5kIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTAgNGMxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgMy0zLTEuMzQtMy0zIDEuMzQtMyAzLTN6bTYgMTJINnYtMS40YzAtMiA0LTMuMSA2LTMuMXM2IDEuMSA2IDMuMVYxOXoiIC8+PC9nPgo8ZyBpZD0iYXNzaWdubWVudC1sYXRlIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNiAxNWgtMnYtMmgydjJ6bTAtNGgtMlY4aDJ2NnptLTEtOWMtLjU1IDAtMS0uNDUtMS0xcy40NS0xIDEtMSAxIC40NSAxIDEtLjQ1IDEtMSAxeiIgLz48L2c+CjxnIGlkPSJhc3NpZ25tZW50LXJldHVybiI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem00IDEyaC00djNsLTUtNSA1LTV2M2g0djR6IiAvPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtcmV0dXJuZWQiPjxwYXRoIGQ9Ik0xOSAzaC00LjE4QzE0LjQgMS44NCAxMy4zIDEgMTIgMWMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMCAxNWwtNS01aDNWOWg0djRoM2wtNSA1eiIgLz48L2c+CjxnIGlkPSJhc3NpZ25tZW50LXR1cm5lZC1pbiI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0tMiAxNGwtNC00IDEuNDEtMS40MUwxMCAxNC4xN2w2LjU5LTYuNTlMMTggOWwtOCA4eiIgLz48L2c+CjxnIGlkPSJhdHRhY2htZW50Ij48cGF0aCBkPSJNMiAxMi41QzIgOS40NiA0LjQ2IDcgNy41IDdIMThjMi4yMSAwIDQgMS43OSA0IDRzLTEuNzkgNC00IDRIOS41QzguMTIgMTUgNyAxMy44OCA3IDEyLjVTOC4xMiAxMCA5LjUgMTBIMTd2Mkg5LjQxYy0uNTUgMC0uNTUgMSAwIDFIMThjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0ySDcuNUM1LjU3IDkgNCAxMC41NyA0IDEyLjVTNS41NyAxNiA3LjUgMTZIMTd2Mkg3LjVDNC40NiAxOCAyIDE1LjU0IDIgMTIuNXoiIC8+PC9nPgo8ZyBpZD0iYXV0b3JlbmV3Ij48cGF0aCBkPSJNMTIgNnYzbDQtNC00LTR2M2MtNC40MiAwLTggMy41OC04IDggMCAxLjU3LjQ2IDMuMDMgMS4yNCA0LjI2TDYuNyAxNC44Yy0uNDUtLjgzLS43LTEuNzktLjctMi44IDAtMy4zMSAyLjY5LTYgNi02em02Ljc2IDEuNzRMMTcuMyA5LjJjLjQ0Ljg0LjcgMS43OS43IDIuOCAwIDMuMzEtMi42OSA2LTYgNnYtM2wtNCA0IDQgNHYtM2M0LjQyIDAgOC0zLjU4IDgtOCAwLTEuNTctLjQ2LTMuMDMtMS4yNC00LjI2eiIgLz48L2c+CjxnIGlkPSJiYWNrc3BhY2UiPjxwYXRoIGQ9Ik0yMiAzSDdjLS42OSAwLTEuMjMuMzUtMS41OS44OEwwIDEybDUuNDEgOC4xMWMuMzYuNTMuOS44OSAxLjU5Ljg5aDE1YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS0zIDEyLjU5TDE3LjU5IDE3IDE0IDEzLjQxIDEwLjQxIDE3IDkgMTUuNTkgMTIuNTkgMTIgOSA4LjQxIDEwLjQxIDcgMTQgMTAuNTkgMTcuNTkgNyAxOSA4LjQxIDE1LjQxIDEyIDE5IDE1LjU5eiIgLz48L2c+CjxnIGlkPSJiYWNrdXAiPjxwYXRoIGQ9Ik0xOS4zNSAxMC4wNEMxOC42NyA2LjU5IDE1LjY0IDQgMTIgNCA5LjExIDQgNi42IDUuNjQgNS4zNSA4LjA0IDIuMzQgOC4zNiAwIDEwLjkxIDAgMTRjMCAzLjMxIDIuNjkgNiA2IDZoMTNjMi43NiAwIDUtMi4yNCA1LTUgMC0yLjY0LTIuMDUtNC43OC00LjY1LTQuOTZ6TTE0IDEzdjRoLTR2LTRIN2w1LTUgNSA1aC0zeiIgLz48L2c+CjxnIGlkPSJibG9jayI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6TTQgMTJjMC00LjQyIDMuNTgtOCA4LTggMS44NSAwIDMuNTUuNjMgNC45IDEuNjlMNS42OSAxNi45QzQuNjMgMTUuNTUgNCAxMy44NSA0IDEyem04IDhjLTEuODUgMC0zLjU1LS42My00LjktMS42OUwxOC4zMSA3LjFDMTkuMzcgOC40NSAyMCAxMC4xNSAyMCAxMmMwIDQuNDItMy41OCA4LTggOHoiIC8+PC9nPgo8ZyBpZD0iYm9vayI+PHBhdGggZD0iTTE4IDJINmMtMS4xIDAtMiAuOS0yIDJ2MTZjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek02IDRoNXY4bC0yLjUtMS41TDYgMTJWNHoiIC8+PC9nPgo8ZyBpZD0iYm9va21hcmsiPjxwYXRoIGQ9Ik0xNyAzSDdjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNSAyMWw3LTMgNyAzVjVjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9ImJvb2ttYXJrLWJvcmRlciI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnptMCAxNWwtNS0yLjE4TDcgMThWNWgxMHYxM3oiIC8+PC9nPgo8ZyBpZD0iYnVnLXJlcG9ydCI+PHBhdGggZD0iTTIwIDhoLTIuODFjLS40NS0uNzgtMS4wNy0xLjQ1LTEuODItMS45NkwxNyA0LjQxIDE1LjU5IDNsLTIuMTcgMi4xN0MxMi45NiA1LjA2IDEyLjQ5IDUgMTIgNWMtLjQ5IDAtLjk2LjA2LTEuNDEuMTdMOC40MSAzIDcgNC40MWwxLjYyIDEuNjNDNy44OCA2LjU1IDcuMjYgNy4yMiA2LjgxIDhINHYyaDIuMDljLS4wNS4zMy0uMDkuNjYtLjA5IDF2MUg0djJoMnYxYzAgLjM0LjA0LjY3LjA5IDFINHYyaDIuODFjMS4wNCAxLjc5IDIuOTcgMyA1LjE5IDNzNC4xNS0xLjIxIDUuMTktM0gyMHYtMmgtMi4wOWMuMDUtLjMzLjA5LS42Ni4wOS0xdi0xaDJ2LTJoLTJ2LTFjMC0uMzQtLjA0LS42Ny0uMDktMUgyMFY4em0tNiA4aC00di0yaDR2MnptMC00aC00di0yaDR2MnoiIC8+PC9nPgo8ZyBpZD0iYnVpbGQiPjxwYXRoIGQ9Ik0yMi43IDE5bC05LjEtOS4xYy45LTIuMy40LTUtMS41LTYuOS0yLTItNS0yLjQtNy40LTEuM0w5IDYgNiA5IDEuNiA0LjdDLjQgNy4xLjkgMTAuMSAyLjkgMTIuMWMxLjkgMS45IDQuNiAyLjQgNi45IDEuNWw5LjEgOS4xYy40LjQgMSAuNCAxLjQgMGwyLjMtMi4zYy41LS40LjUtMS4xLjEtMS40eiIgLz48L2c+CjxnIGlkPSJjYWNoZWQiPjxwYXRoIGQ9Ik0xOSA4bC00IDRoM2MwIDMuMzEtMi42OSA2LTYgNi0xLjAxIDAtMS45Ny0uMjUtMi44LS43bC0xLjQ2IDEuNDZDOC45NyAxOS41NCAxMC40MyAyMCAxMiAyMGM0LjQyIDAgOC0zLjU4IDgtOGgzbC00LTR6TTYgMTJjMC0zLjMxIDIuNjktNiA2LTYgMS4wMSAwIDEuOTcuMjUgMi44LjdsMS40Ni0xLjQ2QzE1LjAzIDQuNDYgMTMuNTcgNCAxMiA0Yy00LjQyIDAtOCAzLjU4LTggOEgxbDQgNCA0LTRINnoiIC8+PC9nPgo8ZyBpZD0iY2FtZXJhLWVuaGFuY2UiPjxwYXRoIGQ9Ik05IDNMNy4xNyA1SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMmgtMy4xN0wxNSAzSDl6bTMgMTVjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1em0wLTFsMS4yNS0yLjc1TDE2IDEzbC0yLjc1LTEuMjVMMTIgOWwtMS4yNSAyLjc1TDggMTNsMi43NSAxLjI1eiIgLz48L2c+CjxnIGlkPSJjYW5jZWwiPjxwYXRoIGQ9Ik0xMiAyQzYuNDcgMiAyIDYuNDcgMiAxMnM0LjQ3IDEwIDEwIDEwIDEwLTQuNDcgMTAtMTBTMTcuNTMgMiAxMiAyem01IDEzLjU5TDE1LjU5IDE3IDEyIDEzLjQxIDguNDEgMTcgNyAxNS41OSAxMC41OSAxMiA3IDguNDEgOC40MSA3IDEyIDEwLjU5IDE1LjU5IDcgMTcgOC40MSAxMy40MSAxMiAxNyAxNS41OXoiIC8+PC9nPgo8ZyBpZD0iY2FyZC1naWZ0Y2FyZCI+PHBhdGggZD0iTTIwIDZoLTIuMThjLjExLS4zMS4xOC0uNjUuMTgtMSAwLTEuNjYtMS4zNC0zLTMtMy0xLjA1IDAtMS45Ni41NC0yLjUgMS4zNWwtLjUuNjctLjUtLjY4QzEwLjk2IDIuNTQgMTAuMDUgMiA5IDIgNy4zNCAyIDYgMy4zNCA2IDVjMCAuMzUuMDcuNjkuMTggMUg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS01LTJjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXpNOSA0Yy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTExIDE1SDR2LTJoMTZ2MnptMC01SDRWOGg1LjA4TDcgMTAuODMgOC42MiAxMiAxMSA4Ljc2bDEtMS4zNiAxIDEuMzZMMTUuMzggMTIgMTcgMTAuODMgMTQuOTIgOEgyMHY2eiIgLz48L2c+CjxnIGlkPSJjYXJkLW1lbWJlcnNoaXAiPjxwYXRoIGQ9Ik0yMCAySDRjLTEuMTEgMC0yIC44OS0yIDJ2MTFjMCAxLjExLjg5IDIgMiAyaDR2NWw0LTIgNCAydi01aDRjMS4xMSAwIDItLjg5IDItMlY0YzAtMS4xMS0uODktMi0yLTJ6bTAgMTNINHYtMmgxNnYyem0wLTVINFY0aDE2djZ6IiAvPjwvZz4KPGcgaWQ9ImNhcmQtdHJhdmVsIj48cGF0aCBkPSJNMjAgNmgtM1Y0YzAtMS4xMS0uODktMi0yLTJIOWMtMS4xMSAwLTIgLjg5LTIgMnYySDRjLTEuMTEgMC0yIC44OS0yIDJ2MTFjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWOGMwLTEuMTEtLjg5LTItMi0yek05IDRoNnYySDlWNHptMTEgMTVINHYtMmgxNnYyem0wLTVINFY4aDN2MmgyVjhoNnYyaDJWOGgzdjZ6IiAvPjwvZz4KPGcgaWQ9ImNoYW5nZS1oaXN0b3J5Ij48cGF0aCBkPSJNMTIgNy43N0wxOC4zOSAxOEg1LjYxTDEyIDcuNzdNMTIgNEwyIDIwaDIwTDEyIDR6IiAvPjwvZz4KPGcgaWQ9ImNoZWNrIj48cGF0aCBkPSJNOSAxNi4xN0w0LjgzIDEybC0xLjQyIDEuNDFMOSAxOSAyMSA3bC0xLjQxLTEuNDF6IiAvPjwvZz4KPGcgaWQ9ImNoZWNrLWJveCI+PHBhdGggZD0iTTE5IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS45IDItMlY1YzAtMS4xLS44OS0yLTItMnptLTkgMTRsLTUtNSAxLjQxLTEuNDFMMTAgMTQuMTdsNy41OS03LjU5TDE5IDhsLTkgOXoiIC8+PC9nPgo8ZyBpZD0iY2hlY2stYm94LW91dGxpbmUtYmxhbmsiPjxwYXRoIGQ9Ik0xOSA1djE0SDVWNWgxNG0wLTJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJjaGVjay1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0tMiAxNWwtNS01IDEuNDEtMS40MUwxMCAxNC4xN2w3LjU5LTcuNTlMMTkgOGwtOSA5eiIgLz48L2c+CjxnIGlkPSJjaGV2cm9uLWxlZnQiPjxwYXRoIGQ9Ik0xNS40MSA3LjQxTDE0IDZsLTYgNiA2IDYgMS40MS0xLjQxTDEwLjgzIDEyeiIgLz48L2c+CjxnIGlkPSJjaGV2cm9uLXJpZ2h0Ij48cGF0aCBkPSJNMTAgNkw4LjU5IDcuNDEgMTMuMTcgMTJsLTQuNTggNC41OUwxMCAxOGw2LTZ6IiAvPjwvZz4KPGcgaWQ9ImNocm9tZS1yZWFkZXItbW9kZSI+PHBhdGggZD0iTTEzIDEyaDd2MS41aC03em0wLTIuNWg3VjExaC03em0wIDVoN1YxNmgtN3pNMjEgNEgzYy0xLjEgMC0yIC45LTIgMnYxM2MwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgMTVoLTlWNmg5djEzeiIgLz48L2c+CjxnIGlkPSJjbGFzcyI+PHBhdGggZD0iTTE4IDJINmMtMS4xIDAtMiAuOS0yIDJ2MTZjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek02IDRoNXY4bC0yLjUtMS41TDYgMTJWNHoiIC8+PC9nPgo8ZyBpZD0iY2xlYXIiPjxwYXRoIGQ9Ik0xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6IiAvPjwvZz4KPGcgaWQ9ImNsb3NlIj48cGF0aCBkPSJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyeiIgLz48L2c+CjxnIGlkPSJjbG91ZCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnoiIC8+PC9nPgo8ZyBpZD0iY2xvdWQtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptNC41IDE0SDhjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTNsLjE0LjAxQzguNTggOC4yOCAxMC4xMyA3IDEyIDdjMi4yMSAwIDQgMS43OSA0IDRoLjVjMS4zOCAwIDIuNSAxLjEyIDIuNSAyLjVTMTcuODggMTYgMTYuNSAxNnoiIC8+PC9nPgo8ZyBpZD0iY2xvdWQtZG9uZSI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTAgMTdsLTMuNS0zLjUgMS40MS0xLjQxTDEwIDE0LjE3IDE1LjE4IDlsMS40MSAxLjQxTDEwIDE3eiIgLz48L2c+CjxnIGlkPSJjbG91ZC1kb3dubG9hZCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTcgMTNsLTUgNS01LTVoM1Y5aDR2NGgzeiIgLz48L2c+CjxnIGlkPSJjbG91ZC1vZmYiPjxwYXRoIGQ9Ik0xOS4zNSAxMC4wNEMxOC42NyA2LjU5IDE1LjY0IDQgMTIgNGMtMS40OCAwLTIuODUuNDMtNC4wMSAxLjE3bDEuNDYgMS40NkMxMC4yMSA2LjIzIDExLjA4IDYgMTIgNmMzLjA0IDAgNS41IDIuNDYgNS41IDUuNXYuNUgxOWMxLjY2IDAgMyAxLjM0IDMgMyAwIDEuMTMtLjY0IDIuMTEtMS41NiAyLjYybDEuNDUgMS40NUMyMy4xNiAxOC4xNiAyNCAxNi42OCAyNCAxNWMwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMyA1LjI3bDIuNzUgMi43NEMyLjU2IDguMTUgMCAxMC43NyAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDExLjczbDIgMkwyMSAyMC43MyA0LjI3IDQgMyA1LjI3ek03LjczIDEwbDggOEg2Yy0yLjIxIDAtNC0xLjc5LTQtNHMxLjc5LTQgNC00aDEuNzN6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkLXF1ZXVlIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xOSAxOEg2Yy0yLjIxIDAtNC0xLjc5LTQtNHMxLjc5LTQgNC00aC43MUM3LjM3IDcuNjkgOS40OCA2IDEyIDZjMy4wNCAwIDUuNSAyLjQ2IDUuNSA1LjV2LjVIMTljMS42NiAwIDMgMS4zNCAzIDNzLTEuMzQgMy0zIDN6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkLXVwbG9hZCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTQgMTN2NGgtNHYtNEg3bDUtNSA1IDVoLTN6IiAvPjwvZz4KPGcgaWQ9ImNvZGUiPjxwYXRoIGQ9Ik05LjQgMTYuNkw0LjggMTJsNC42LTQuNkw4IDZsLTYgNiA2IDYgMS40LTEuNHptNS4yIDBsNC42LTQuNi00LjYtNC42TDE2IDZsNiA2LTYgNi0xLjQtMS40eiIgLz48L2c+CjxnIGlkPSJjb21wYXJlLWFycm93cyI+PHBhdGggZD0iTTkuMDEgMTRIMnYyaDcuMDF2M0wxMyAxNWwtMy45OS00djN6bTUuOTgtMXYtM0gyMlY4aC03LjAxVjVMMTEgOWwzLjk5IDR6IiAvPjwvZz4KPGcgaWQ9ImNvbnRlbnQtY29weSI+PHBhdGggZD0iTTE2IDFINGMtMS4xIDAtMiAuOS0yIDJ2MTRoMlYzaDEyVjF6bTMgNEg4Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDExYzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6bTAgMTZIOFY3aDExdjE0eiIgLz48L2c+CjxnIGlkPSJjb250ZW50LWN1dCI+PHBhdGggZD0iTTkuNjQgNy42NGMuMjMtLjUuMzYtMS4wNS4zNi0xLjY0IDAtMi4yMS0xLjc5LTQtNC00UzIgMy43OSAyIDZzMS43OSA0IDQgNGMuNTkgMCAxLjE0LS4xMyAxLjY0LS4zNkwxMCAxMmwtMi4zNiAyLjM2QzcuMTQgMTQuMTMgNi41OSAxNCA2IDE0Yy0yLjIxIDAtNCAxLjc5LTQgNHMxLjc5IDQgNCA0IDQtMS43OSA0LTRjMC0uNTktLjEzLTEuMTQtLjM2LTEuNjRMMTIgMTRsNyA3aDN2LTFMOS42NCA3LjY0ek02IDhjLTEuMSAwLTItLjg5LTItMnMuOS0yIDItMiAyIC44OSAyIDItLjkgMi0yIDJ6bTAgMTJjLTEuMSAwLTItLjg5LTItMnMuOS0yIDItMiAyIC44OSAyIDItLjkgMi0yIDJ6bTYtNy41Yy0uMjggMC0uNS0uMjItLjUtLjVzLjIyLS41LjUtLjUuNS4yMi41LjUtLjIyLjUtLjUuNXpNMTkgM2wtNiA2IDIgMiA3LTdWM3oiIC8+PC9nPgo8ZyBpZD0iY29udGVudC1wYXN0ZSI+PHBhdGggZD0iTTE5IDJoLTQuMThDMTQuNC44NCAxMy4zIDAgMTIgMGMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptNyAxOEg1VjRoMnYzaDEwVjRoMnYxNnoiIC8+PC9nPgo8ZyBpZD0iY29weXJpZ2h0Ij48cGF0aCBkPSJNMTAuMDggMTAuODZjLjA1LS4zMy4xNi0uNjIuMy0uODdzLjM0LS40Ni41OS0uNjJjLjI0LS4xNS41NC0uMjIuOTEtLjIzLjIzLjAxLjQ0LjA1LjYzLjEzLjIuMDkuMzguMjEuNTIuMzZzLjI1LjMzLjM0LjUzLjEzLjQyLjE0LjY0aDEuNzljLS4wMi0uNDctLjExLS45LS4yOC0xLjI5cy0uNC0uNzMtLjctMS4wMS0uNjYtLjUtMS4wOC0uNjYtLjg4LS4yMy0xLjM5LS4yM2MtLjY1IDAtMS4yMi4xMS0xLjcuMzRzLS44OC41My0xLjIuOTItLjU2Ljg0LS43MSAxLjM2UzggMTEuMjkgOCAxMS44N3YuMjdjMCAuNTguMDggMS4xMi4yMyAxLjY0cy4zOS45Ny43MSAxLjM1LjcyLjY5IDEuMi45MSAxLjA1LjM0IDEuNy4zNGMuNDcgMCAuOTEtLjA4IDEuMzItLjIzcy43Ny0uMzYgMS4wOC0uNjMuNTYtLjU4Ljc0LS45NC4yOS0uNzQuMy0xLjE1aC0xLjc5Yy0uMDEuMjEtLjA2LjQtLjE1LjU4cy0uMjEuMzMtLjM2LjQ2LS4zMi4yMy0uNTIuM2MtLjE5LjA3LS4zOS4wOS0uNi4xLS4zNi0uMDEtLjY2LS4wOC0uODktLjIzLS4yNS0uMTYtLjQ1LS4zNy0uNTktLjYycy0uMjUtLjU1LS4zLS44OC0uMDgtLjY3LS4wOC0xdi0uMjdjMC0uMzUuMDMtLjY4LjA4LTEuMDF6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJjcmVhdGUiPjxwYXRoIGQ9Ik0zIDE3LjI1VjIxaDMuNzVMMTcuODEgOS45NGwtMy43NS0zLjc1TDMgMTcuMjV6TTIwLjcxIDcuMDRjLjM5LS4zOS4zOS0xLjAyIDAtMS40MWwtMi4zNC0yLjM0Yy0uMzktLjM5LTEuMDItLjM5LTEuNDEgMGwtMS44MyAxLjgzIDMuNzUgMy43NSAxLjgzLTEuODN6IiAvPjwvZz4KPGcgaWQ9ImNyZWF0ZS1uZXctZm9sZGVyIj48cGF0aCBkPSJNMjAgNmgtOGwtMi0ySDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE4YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjhjMC0xLjExLS44OS0yLTItMnptLTEgOGgtM3YzaC0ydi0zaC0zdi0yaDNWOWgydjNoM3YyeiIgLz48L2c+CjxnIGlkPSJjcmVkaXQtY2FyZCI+PHBhdGggZD0iTTIwIDRINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMThjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWNmMwLTEuMTEtLjg5LTItMi0yem0wIDE0SDR2LTZoMTZ2NnptMC0xMEg0VjZoMTZ2MnoiIC8+PC9nPgo8ZyBpZD0iZGFzaGJvYXJkIj48cGF0aCBkPSJNMyAxM2g4VjNIM3YxMHptMCA4aDh2LTZIM3Y2em0xMCAwaDhWMTFoLTh2MTB6bTAtMTh2Nmg4VjNoLTh6IiAvPjwvZz4KPGcgaWQ9ImRhdGUtcmFuZ2UiPjxwYXRoIGQ9Ik05IDExSDd2Mmgydi0yem00IDBoLTJ2Mmgydi0yem00IDBoLTJ2Mmgydi0yem0yLTdoLTFWMmgtMnYySDhWMkg2djJINWMtMS4xMSAwLTEuOTkuOS0xLjk5IDJMMyAyMGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDE2SDVWOWgxNHYxMXoiIC8+PC9nPgo8ZyBpZD0iZGVsZXRlIj48cGF0aCBkPSJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyek0xOSA0aC0zLjVsLTEtMWgtNWwtMSAxSDV2MmgxNFY0eiIgLz48L2c+CjxnIGlkPSJkZWxldGUtZm9yZXZlciI+PHBhdGggZD0iTTYgMTljMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjdINnYxMnptMi40Ni03LjEybDEuNDEtMS40MUwxMiAxMi41OWwyLjEyLTIuMTIgMS40MSAxLjQxTDEzLjQxIDE0bDIuMTIgMi4xMi0xLjQxIDEuNDFMMTIgMTUuNDFsLTIuMTIgMi4xMi0xLjQxLTEuNDFMMTAuNTkgMTRsLTIuMTMtMi4xMnpNMTUuNSA0bC0xLTFoLTVsLTEgMUg1djJoMTRWNHoiIC8+PC9nPgo8ZyBpZD0iZGVsZXRlLXN3ZWVwIj48cGF0aCBkPSJNMTUgMTZoNHYyaC00em0wLThoN3YyaC03em0wIDRoNnYyaC02ek0zIDE4YzAgMS4xLjkgMiAyIDJoNmMxLjEgMCAyLS45IDItMlY4SDN2MTB6TTE0IDVoLTNsLTEtMUg2TDUgNUgydjJoMTJ6IiAvPjwvZz4KPGcgaWQ9ImRlc2NyaXB0aW9uIj48cGF0aCBkPSJNMTQgMkg2Yy0xLjEgMC0xLjk5LjktMS45OSAyTDQgMjBjMCAxLjEuODkgMiAxLjk5IDJIMThjMS4xIDAgMi0uOSAyLTJWOGwtNi02em0yIDE2SDh2LTJoOHYyem0wLTRIOHYtMmg4djJ6bS0zLTVWMy41TDE4LjUgOUgxM3oiIC8+PC9nPgo8ZyBpZD0iZG5zIj48cGF0aCBkPSJNMjAgMTNINGMtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTZjLjU1IDAgMS0uNDUgMS0xdi02YzAtLjU1LS40NS0xLTEtMXpNNyAxOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6TTIwIDNINGMtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTZjLjU1IDAgMS0uNDUgMS0xVjRjMC0uNTUtLjQ1LTEtMS0xek03IDljLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyeiIgLz48L2c+CjxnIGlkPSJkb25lIj48cGF0aCBkPSJNOSAxNi4yTDQuOCAxMmwtMS40IDEuNEw5IDE5IDIxIDdsLTEuNC0xLjRMOSAxNi4yeiIgLz48L2c+CjxnIGlkPSJkb25lLWFsbCI+PHBhdGggZD0iTTE4IDdsLTEuNDEtMS40MS02LjM0IDYuMzQgMS40MSAxLjQxTDE4IDd6bTQuMjQtMS40MUwxMS42NiAxNi4xNyA3LjQ4IDEybC0xLjQxIDEuNDFMMTEuNjYgMTlsMTItMTItMS40Mi0xLjQxek0uNDEgMTMuNDFMNiAxOWwxLjQxLTEuNDFMMS44MyAxMiAuNDEgMTMuNDF6IiAvPjwvZz4KPGcgaWQ9ImRvbnV0LWxhcmdlIj48cGF0aCBkPSJNMTEgNS4wOFYyYy01IC41LTkgNC44MS05IDEwczQgOS41IDkgMTB2LTMuMDhjLTMtLjQ4LTYtMy40LTYtNi45MnMzLTYuNDQgNi02Ljkyek0xOC45NyAxMUgyMmMtLjQ3LTUtNC04LjUzLTktOXYzLjA4QzE2IDUuNTEgMTguNTQgOCAxOC45NyAxMXpNMTMgMTguOTJWMjJjNS0uNDcgOC41My00IDktOWgtMy4wM2MtLjQzIDMtMi45NyA1LjQ5LTUuOTcgNS45MnoiIC8+PC9nPgo8ZyBpZD0iZG9udXQtc21hbGwiPjxwYXRoIGQ9Ik0xMSA5LjE2VjJjLTUgLjUtOSA0Ljc5LTkgMTBzNCA5LjUgOSAxMHYtNy4xNmMtMS0uNDEtMi0xLjUyLTItMi44NHMxLTIuNDMgMi0yLjg0ek0xNC44NiAxMUgyMmMtLjQ4LTQuNzUtNC04LjUzLTktOXY3LjE2YzEgLjMgMS41Mi45OCAxLjg2IDEuODR6TTEzIDE0Ljg0VjIyYzUtLjQ3IDguNTItNC4yNSA5LTloLTcuMTRjLS4zNC44Ni0uODYgMS41NC0xLjg2IDEuODR6IiAvPjwvZz4KPGcgaWQ9ImRyYWZ0cyI+PHBhdGggZD0iTTIxLjk5IDhjMC0uNzItLjM3LTEuMzUtLjk0LTEuN0wxMiAxIDIuOTUgNi4zQzIuMzggNi42NSAyIDcuMjggMiA4djEwYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJsLS4wMS0xMHpNMTIgMTNMMy43NCA3Ljg0IDEyIDNsOC4yNiA0Ljg0TDEyIDEzeiIgLz48L2c+CjxnIGlkPSJlamVjdCI+PHBhdGggZD0iTTUgMTdoMTR2Mkg1em03LTEyTDUuMzMgMTVoMTMuMzR6IiAvPjwvZz4KPGcgaWQ9ImVycm9yIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMSAxNWgtMnYtMmgydjJ6bTAtNGgtMlY3aDJ2NnoiIC8+PC9nPgo8ZyBpZD0iZXJyb3Itb3V0bGluZSI+PHBhdGggZD0iTTExIDE1aDJ2MmgtMnptMC04aDJ2NmgtMnptLjk5LTVDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6TTEyIDIwYy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiIC8+PC9nPgo8ZyBpZD0iZXVyby1zeW1ib2wiPjxwYXRoIGQ9Ik0xNSAxOC41Yy0yLjUxIDAtNC42OC0xLjQyLTUuNzYtMy41SDE1di0ySDguNThjLS4wNS0uMzMtLjA4LS42Ni0uMDgtMXMuMDMtLjY3LjA4LTFIMTVWOUg5LjI0QzEwLjMyIDYuOTIgMTIuNSA1LjUgMTUgNS41YzEuNjEgMCAzLjA5LjU5IDQuMjMgMS41N0wyMSA1LjNDMTkuNDEgMy44NyAxNy4zIDMgMTUgM2MtMy45MiAwLTcuMjQgMi41MS04LjQ4IDZIM3YyaDMuMDZjLS4wNC4zMy0uMDYuNjYtLjA2IDEgMCAuMzQuMDIuNjcuMDYgMUgzdjJoMy41MmMxLjI0IDMuNDkgNC41NiA2IDguNDggNiAyLjMxIDAgNC40MS0uODcgNi0yLjNsLTEuNzgtMS43N2MtMS4xMy45OC0yLjYgMS41Ny00LjIyIDEuNTd6IiAvPjwvZz4KPGcgaWQ9ImV2ZW50Ij48cGF0aCBkPSJNMTcgMTJoLTV2NWg1di01ek0xNiAxdjJIOFYxSDZ2Mkg1Yy0xLjExIDAtMS45OS45LTEuOTkgMkwzIDE5YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJoLTFWMWgtMnptMyAxOEg1VjhoMTR2MTF6IiAvPjwvZz4KPGcgaWQ9ImV2ZW50LXNlYXQiPjxwYXRoIGQ9Ik00IDE4djNoM3YtM2gxMHYzaDN2LTZINHptMTUtOGgzdjNoLTN6TTIgMTBoM3YzSDJ6bTE1IDNIN1Y1YzAtMS4xLjktMiAyLTJoNmMxLjEgMCAyIC45IDIgMnY4eiIgLz48L2c+CjxnIGlkPSJleGl0LXRvLWFwcCI+PHBhdGggZD0iTTEwLjA5IDE1LjU5TDExLjUgMTdsNS01LTUtNS0xLjQxIDEuNDFMMTIuNjcgMTFIM3YyaDkuNjdsLTIuNTggMi41OXpNMTkgM0g1Yy0xLjExIDAtMiAuOS0yIDJ2NGgyVjVoMTR2MTRINXYtNEgzdjRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0iZXhwYW5kLWxlc3MiPjxwYXRoIGQ9Ik0xMiA4bC02IDYgMS40MSAxLjQxTDEyIDEwLjgzbDQuNTkgNC41OEwxOCAxNHoiIC8+PC9nPgo8ZyBpZD0iZXhwYW5kLW1vcmUiPjxwYXRoIGQ9Ik0xNi41OSA4LjU5TDEyIDEzLjE3IDcuNDEgOC41OSA2IDEwbDYgNiA2LTZ6IiAvPjwvZz4KPGcgaWQ9ImV4cGxvcmUiPjxwYXRoIGQ9Ik0xMiAxMC45Yy0uNjEgMC0xLjEuNDktMS4xIDEuMXMuNDkgMS4xIDEuMSAxLjFjLjYxIDAgMS4xLS40OSAxLjEtMS4xcy0uNDktMS4xLTEuMS0xLjF6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTIuMTkgMTIuMTlMNiAxOGwzLjgxLTguMTlMMTggNmwtMy44MSA4LjE5eiIgLz48L2c+CjxnIGlkPSJleHRlbnNpb24iPjxwYXRoIGQ9Ik0yMC41IDExSDE5VjdjMC0xLjEtLjktMi0yLTJoLTRWMy41QzEzIDIuMTIgMTEuODggMSAxMC41IDFTOCAyLjEyIDggMy41VjVINGMtMS4xIDAtMS45OS45LTEuOTkgMnYzLjhIMy41YzEuNDkgMCAyLjcgMS4yMSAyLjcgMi43cy0xLjIxIDIuNy0yLjcgMi43SDJWMjBjMCAxLjEuOSAyIDIgMmgzLjh2LTEuNWMwLTEuNDkgMS4yMS0yLjcgMi43LTIuNyAxLjQ5IDAgMi43IDEuMjEgMi43IDIuN1YyMkgxN2MxLjEgMCAyLS45IDItMnYtNGgxLjVjMS4zOCAwIDIuNS0xLjEyIDIuNS0yLjVTMjEuODggMTEgMjAuNSAxMXoiIC8+PC9nPgo8ZyBpZD0iZmFjZSI+PHBhdGggZD0iTTkgMTEuNzVjLS42OSAwLTEuMjUuNTYtMS4yNSAxLjI1cy41NiAxLjI1IDEuMjUgMS4yNSAxLjI1LS41NiAxLjI1LTEuMjUtLjU2LTEuMjUtMS4yNS0xLjI1em02IDBjLS42OSAwLTEuMjUuNTYtMS4yNSAxLjI1cy41NiAxLjI1IDEuMjUgMS4yNSAxLjI1LS41NiAxLjI1LTEuMjUtLjU2LTEuMjUtMS4yNS0xLjI1ek0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOCAwLS4yOS4wMi0uNTguMDUtLjg2IDIuMzYtMS4wNSA0LjIzLTIuOTggNS4yMS01LjM3QzExLjA3IDguMzMgMTQuMDUgMTAgMTcuNDIgMTBjLjc4IDAgMS41My0uMDkgMi4yNS0uMjYuMjEuNzEuMzMgMS40Ny4zMyAyLjI2IDAgNC40MS0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJmYXZvcml0ZSI+PHBhdGggZD0iTTEyIDIxLjM1bC0xLjQ1LTEuMzJDNS40IDE1LjM2IDIgMTIuMjggMiA4LjUgMiA1LjQyIDQuNDIgMyA3LjUgM2MxLjc0IDAgMy40MS44MSA0LjUgMi4wOUMxMy4wOSAzLjgxIDE0Ljc2IDMgMTYuNSAzIDE5LjU4IDMgMjIgNS40MiAyMiA4LjVjMCAzLjc4LTMuNCA2Ljg2LTguNTUgMTEuNTRMMTIgMjEuMzV6IiAvPjwvZz4KPGcgaWQ9ImZhdm9yaXRlLWJvcmRlciI+PHBhdGggZD0iTTE2LjUgM2MtMS43NCAwLTMuNDEuODEtNC41IDIuMDlDMTAuOTEgMy44MSA5LjI0IDMgNy41IDMgNC40MiAzIDIgNS40MiAyIDguNWMwIDMuNzggMy40IDYuODYgOC41NSAxMS41NEwxMiAyMS4zNWwxLjQ1LTEuMzJDMTguNiAxNS4zNiAyMiAxMi4yOCAyMiA4LjUgMjIgNS40MiAxOS41OCAzIDE2LjUgM3ptLTQuNCAxNS41NWwtLjEuMS0uMS0uMUM3LjE0IDE0LjI0IDQgMTEuMzkgNCA4LjUgNCA2LjUgNS41IDUgNy41IDVjMS41NCAwIDMuMDQuOTkgMy41NyAyLjM2aDEuODdDMTMuNDYgNS45OSAxNC45NiA1IDE2LjUgNWMyIDAgMy41IDEuNSAzLjUgMy41IDAgMi44OS0zLjE0IDUuNzQtNy45IDEwLjA1eiIgLz48L2c+CjxnIGlkPSJmZWVkYmFjayI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tNyAxMmgtMnYtMmgydjJ6bTAtNGgtMlY2aDJ2NHoiIC8+PC9nPgo8ZyBpZD0iZmlsZS1kb3dubG9hZCI+PHBhdGggZD0iTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXoiIC8+PC9nPgo8ZyBpZD0iZmlsZS11cGxvYWQiPjxwYXRoIGQ9Ik05IDE2aDZ2LTZoNGwtNy03LTcgN2g0em0tNCAyaDE0djJINXoiIC8+PC9nPgo8ZyBpZD0iZmlsdGVyLWxpc3QiPjxwYXRoIGQ9Ik0xMCAxOGg0di0yaC00djJ6TTMgNnYyaDE4VjZIM3ptMyA3aDEydi0ySDZ2MnoiIC8+PC9nPgo8ZyBpZD0iZmluZC1pbi1wYWdlIj48cGF0aCBkPSJNMjAgMTkuNTlWOGwtNi02SDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAyMGMwIDEuMS44OSAyIDEuOTkgMkgxOGMuNDUgMCAuODUtLjE1IDEuMTktLjRsLTQuNDMtNC40M2MtLjguNTItMS43NC44My0yLjc2LjgzLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNWMwIDEuMDItLjMxIDEuOTYtLjgzIDIuNzVMMjAgMTkuNTl6TTkgMTNjMCAxLjY2IDEuMzQgMyAzIDNzMy0xLjM0IDMtMy0xLjM0LTMtMy0zLTMgMS4zNC0zIDN6IiAvPjwvZz4KPGcgaWQ9ImZpbmQtcmVwbGFjZSI+PHBhdGggZD0iTTExIDZjMS4zOCAwIDIuNjMuNTYgMy41NCAxLjQ2TDEyIDEwaDZWNGwtMi4wNSAyLjA1QzE0LjY4IDQuNzggMTIuOTMgNCAxMSA0Yy0zLjUzIDAtNi40MyAyLjYxLTYuOTIgNkg2LjFjLjQ2LTIuMjggMi40OC00IDQuOS00em01LjY0IDkuMTRjLjY2LS45IDEuMTItMS45NyAxLjI4LTMuMTRIMTUuOWMtLjQ2IDIuMjgtMi40OCA0LTQuOSA0LTEuMzggMC0yLjYzLS41Ni0zLjU0LTEuNDZMMTAgMTJINHY2bDIuMDUtMi4wNUM3LjMyIDE3LjIyIDkuMDcgMTggMTEgMThjMS41NSAwIDIuOTgtLjUxIDQuMTQtMS4zNkwyMCAyMS40OSAyMS40OSAyMGwtNC44NS00Ljg2eiIgLz48L2c+CjxnIGlkPSJmaW5nZXJwcmludCI+PHBhdGggZD0iTTE3LjgxIDQuNDdjLS4wOCAwLS4xNi0uMDItLjIzLS4wNkMxNS42NiAzLjQyIDE0IDMgMTIuMDEgM2MtMS45OCAwLTMuODYuNDctNS41NyAxLjQxLS4yNC4xMy0uNTQuMDQtLjY4LS4yLS4xMy0uMjQtLjA0LS41NS4yLS42OEM3LjgyIDIuNTIgOS44NiAyIDEyLjAxIDJjMi4xMyAwIDMuOTkuNDcgNi4wMyAxLjUyLjI1LjEzLjM0LjQzLjIxLjY3LS4wOS4xOC0uMjYuMjgtLjQ0LjI4ek0zLjUgOS43MmMtLjEgMC0uMi0uMDMtLjI5LS4wOS0uMjMtLjE2LS4yOC0uNDctLjEyLS43Ljk5LTEuNCAyLjI1LTIuNSAzLjc1LTMuMjdDOS45OCA0LjA0IDE0IDQuMDMgMTcuMTUgNS42NWMxLjUuNzcgMi43NiAxLjg2IDMuNzUgMy4yNS4xNi4yMi4xMS41NC0uMTIuNy0uMjMuMTYtLjU0LjExLS43LS4xMi0uOS0xLjI2LTIuMDQtMi4yNS0zLjM5LTIuOTQtMi44Ny0xLjQ3LTYuNTQtMS40Ny05LjQuMDEtMS4zNi43LTIuNSAxLjctMy40IDIuOTYtLjA4LjE0LS4yMy4yMS0uMzkuMjF6bTYuMjUgMTIuMDdjLS4xMyAwLS4yNi0uMDUtLjM1LS4xNS0uODctLjg3LTEuMzQtMS40My0yLjAxLTIuNjQtLjY5LTEuMjMtMS4wNS0yLjczLTEuMDUtNC4zNCAwLTIuOTcgMi41NC01LjM5IDUuNjYtNS4zOXM1LjY2IDIuNDIgNS42NiA1LjM5YzAgLjI4LS4yMi41LS41LjVzLS41LS4yMi0uNS0uNWMwLTIuNDItMi4wOS00LjM5LTQuNjYtNC4zOS0yLjU3IDAtNC42NiAxLjk3LTQuNjYgNC4zOSAwIDEuNDQuMzIgMi43Ny45MyAzLjg1LjY0IDEuMTUgMS4wOCAxLjY0IDEuODUgMi40Mi4xOS4yLjE5LjUxIDAgLjcxLS4xMS4xLS4yNC4xNS0uMzcuMTV6bTcuMTctMS44NWMtMS4xOSAwLTIuMjQtLjMtMy4xLS44OS0xLjQ5LTEuMDEtMi4zOC0yLjY1LTIuMzgtNC4zOSAwLS4yOC4yMi0uNS41LS41cy41LjIyLjUuNWMwIDEuNDEuNzIgMi43NCAxLjk0IDMuNTYuNzEuNDggMS41NC43MSAyLjU0LjcxLjI0IDAgLjY0LS4wMyAxLjA0LS4xLjI3LS4wNS41My4xMy41OC40MS4wNS4yNy0uMTMuNTMtLjQxLjU4LS41Ny4xMS0xLjA3LjEyLTEuMjEuMTJ6TTE0LjkxIDIyYy0uMDQgMC0uMDktLjAxLS4xMy0uMDItMS41OS0uNDQtMi42My0xLjAzLTMuNzItMi4xLTEuNC0xLjM5LTIuMTctMy4yNC0yLjE3LTUuMjIgMC0xLjYyIDEuMzgtMi45NCAzLjA4LTIuOTQgMS43IDAgMy4wOCAxLjMyIDMuMDggMi45NCAwIDEuMDcuOTMgMS45NCAyLjA4IDEuOTRzMi4wOC0uODcgMi4wOC0xLjk0YzAtMy43Ny0zLjI1LTYuODMtNy4yNS02LjgzLTIuODQgMC01LjQ0IDEuNTgtNi42MSA0LjAzLS4zOS44MS0uNTkgMS43Ni0uNTkgMi44IDAgLjc4LjA3IDIuMDEuNjcgMy42MS4xLjI2LS4wMy41NS0uMjkuNjQtLjI2LjEtLjU1LS4wNC0uNjQtLjI5LS40OS0xLjMxLS43My0yLjYxLS43My0zLjk2IDAtMS4yLjIzLTIuMjkuNjgtMy4yNCAxLjMzLTIuNzkgNC4yOC00LjYgNy41MS00LjYgNC41NSAwIDguMjUgMy41MSA4LjI1IDcuODMgMCAxLjYyLTEuMzggMi45NC0zLjA4IDIuOTRzLTMuMDgtMS4zMi0zLjA4LTIuOTRjMC0xLjA3LS45My0xLjk0LTIuMDgtMS45NHMtMi4wOC44Ny0yLjA4IDEuOTRjMCAxLjcxLjY2IDMuMzEgMS44NyA0LjUxLjk1Ljk0IDEuODYgMS40NiAzLjI3IDEuODUuMjcuMDcuNDIuMzUuMzUuNjEtLjA1LjIzLS4yNi4zOC0uNDcuMzh6IiAvPjwvZz4KPGcgaWQ9ImZpcnN0LXBhZ2UiPjxwYXRoIGQ9Ik0xOC40MSAxNi41OUwxMy44MiAxMmw0LjU5LTQuNTlMMTcgNmwtNiA2IDYgNnpNNiA2aDJ2MTJINnoiIC8+PC9nPgo8ZyBpZD0iZmxhZyI+PHBhdGggZD0iTTE0LjQgNkwxNCA0SDV2MTdoMnYtN2g1LjZsLjQgMmg3VjZ6IiAvPjwvZz4KPGcgaWQ9ImZsaWdodC1sYW5kIj48cGF0aCBkPSJNMi41IDE5aDE5djJoLTE5em03LjE4LTUuNzNsNC4zNSAxLjE2IDUuMzEgMS40MmMuOC4yMSAxLjYyLS4yNiAxLjg0LTEuMDYuMjEtLjgtLjI2LTEuNjItMS4wNi0xLjg0bC01LjMxLTEuNDItMi43Ni05LjAyTDEwLjEyIDJ2OC4yOEw1LjE1IDguOTVsLS45My0yLjMyLTEuNDUtLjM5djUuMTdsMS42LjQzIDUuMzEgMS40M3oiIC8+PC9nPgo8ZyBpZD0iZmxpZ2h0LXRha2VvZmYiPjxwYXRoIGQ9Ik0yLjUgMTloMTl2MmgtMTl6bTE5LjU3LTkuMzZjLS4yMS0uOC0xLjA0LTEuMjgtMS44NC0xLjA2TDE0LjkyIDEwbC02LjktNi40My0xLjkzLjUxIDQuMTQgNy4xNy00Ljk3IDEuMzMtMS45Ny0xLjU0LTEuNDUuMzkgMS44MiAzLjE2Ljc3IDEuMzMgMS42LS40MyA1LjMxLTEuNDIgNC4zNS0xLjE2TDIxIDExLjQ5Yy44MS0uMjMgMS4yOC0xLjA1IDEuMDctMS44NXoiIC8+PC9nPgo8ZyBpZD0iZmxpcC10by1iYWNrIj48cGF0aCBkPSJNOSA3SDd2MmgyVjd6bTAgNEg3djJoMnYtMnptMC04Yy0xLjExIDAtMiAuOS0yIDJoMlYzem00IDEyaC0ydjJoMnYtMnptNi0xMnYyaDJjMC0xLjEtLjktMi0yLTJ6bS02IDBoLTJ2MmgyVjN6TTkgMTd2LTJIN2MwIDEuMS44OSAyIDIgMnptMTAtNGgydi0yaC0ydjJ6bTAtNGgyVjdoLTJ2MnptMCA4YzEuMSAwIDItLjkgMi0yaC0ydjJ6TTUgN0gzdjEyYzAgMS4xLjg5IDIgMiAyaDEydi0ySDVWN3ptMTAtMmgyVjNoLTJ2MnptMCAxMmgydi0yaC0ydjJ6IiAvPjwvZz4KPGcgaWQ9ImZsaXAtdG8tZnJvbnQiPjxwYXRoIGQ9Ik0zIDEzaDJ2LTJIM3Yyem0wIDRoMnYtMkgzdjJ6bTIgNHYtMkgzYzAgMS4xLjg5IDIgMiAyek0zIDloMlY3SDN2MnptMTIgMTJoMnYtMmgtMnYyem00LTE4SDljLTEuMTEgMC0yIC45LTIgMnYxMGMwIDEuMS44OSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDEySDlWNWgxMHYxMHptLTggNmgydi0yaC0ydjJ6bS00IDBoMnYtMkg3djJ6IiAvPjwvZz4KPGcgaWQ9ImZvbGRlciI+PHBhdGggZD0iTTEwIDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWOGMwLTEuMS0uOS0yLTItMmgtOGwtMi0yeiIgLz48L2c+CjxnIGlkPSJmb2xkZXItb3BlbiI+PHBhdGggZD0iTTIwIDZoLThsLTItMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yem0wIDEySDRWOGgxNnYxMHoiIC8+PC9nPgo8ZyBpZD0iZm9sZGVyLXNoYXJlZCI+PHBhdGggZD0iTTIwIDZoLThsLTItMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yem0tNSAzYzEuMSAwIDIgLjkgMiAycy0uOSAyLTIgMi0yLS45LTItMiAuOS0yIDItMnptNCA4aC04di0xYzAtMS4zMyAyLjY3LTIgNC0yczQgLjY3IDQgMnYxeiIgLz48L2c+CjxnIGlkPSJmb250LWRvd25sb2FkIj48cGF0aCBkPSJNOS45MyAxMy41aDQuMTRMMTIgNy45OHpNMjAgMkg0Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS00LjA1IDE2LjVsLTEuMTQtM0g5LjE3bC0xLjEyIDNINS45Nmw1LjExLTEzaDEuODZsNS4xMSAxM2gtMi4wOXoiIC8+PC9nPgo8ZyBpZD0iZm9yd2FyZCI+PHBhdGggZD0iTTEyIDhWNGw4IDgtOCA4di00SDRWOHoiIC8+PC9nPgo8ZyBpZD0iZnVsbHNjcmVlbiI+PHBhdGggZD0iTTcgMTRINXY1aDV2LTJIN3YtM3ptLTItNGgyVjdoM1Y1SDV2NXptMTIgN2gtM3YyaDV2LTVoLTJ2M3pNMTQgNXYyaDN2M2gyVjVoLTV6IiAvPjwvZz4KPGcgaWQ9ImZ1bGxzY3JlZW4tZXhpdCI+PHBhdGggZD0iTTUgMTZoM3YzaDJ2LTVINXYyem0zLThINXYyaDVWNUg4djN6bTYgMTFoMnYtM2gzdi0yaC01djV6bTItMTFWNWgtMnY1aDVWOGgtM3oiIC8+PC9nPgo8ZyBpZD0iZy10cmFuc2xhdGUiPjxwYXRoIGQ9Ik0yMCA1aC05LjEyTDEwIDJINGMtMS4xIDAtMiAuOS0yIDJ2MTNjMCAxLjEuOSAyIDIgMmg3bDEgM2g4YzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6TTcuMTcgMTQuNTljLTIuMjUgMC00LjA5LTEuODMtNC4wOS00LjA5czEuODMtNC4wOSA0LjA5LTQuMDljMS4wNCAwIDEuOTkuMzcgMi43NCAxLjA3bC4wNy4wNi0xLjIzIDEuMTgtLjA2LS4wNWMtLjI5LS4yNy0uNzgtLjU5LTEuNTItLjU5LTEuMzEgMC0yLjM4IDEuMDktMi4zOCAyLjQyczEuMDcgMi40MiAyLjM4IDIuNDJjMS4zNyAwIDEuOTYtLjg3IDIuMTItMS40Nkg3LjA4VjkuOTFoMy45NWwuMDEuMDdjLjA0LjIxLjA1LjQuMDUuNjEgMCAyLjM1LTEuNjEgNC0zLjkyIDR6bTYuMDMtMS43MWMuMzMuNi43NCAxLjE4IDEuMTkgMS43bC0uNTQuNTMtLjY1LTIuMjN6bS43Ny0uNzZoLS45OWwtLjMxLTEuMDRoMy45OXMtLjM0IDEuMzEtMS41NiAyLjc0Yy0uNTItLjYyLS44OS0xLjIzLTEuMTMtMS43ek0yMSAyMGMwIC41NS0uNDUgMS0xIDFoLTdsMi0yLS44MS0yLjc3LjkyLS45MkwxNy43OSAxOGwuNzMtLjczLTIuNzEtMi42OGMuOS0xLjAzIDEuNi0yLjI1IDEuOTItMy41MUgxOXYtMS4wNGgtMy42NFY5aC0xLjA0djEuMDRoLTEuOTZMMTEuMTggNkgyMGMuNTUgMCAxIC40NSAxIDF2MTN6IiAvPjwvZz4KPGcgaWQ9ImdhdmVsIj48cGF0aCBkPSJNMSAyMWgxMnYySDF6TTUuMjQ1IDguMDdsMi44My0yLjgyNyAxNC4xNCAxNC4xNDItMi44MjggMi44Mjh6TTEyLjMxNyAxbDUuNjU3IDUuNjU2LTIuODMgMi44My01LjY1NC01LjY2ek0zLjgyNSA5LjQ4NWw1LjY1NyA1LjY1Ny0yLjgyOCAyLjgyOC01LjY1Ny01LjY1N3oiIC8+PC9nPgo8ZyBpZD0iZ2VzdHVyZSI+PHBhdGggZD0iTTQuNTkgNi44OWMuNy0uNzEgMS40LTEuMzUgMS43MS0xLjIyLjUuMiAwIDEuMDMtLjMgMS41Mi0uMjUuNDItMi44NiAzLjg5LTIuODYgNi4zMSAwIDEuMjguNDggMi4zNCAxLjM0IDIuOTguNzUuNTYgMS43NC43MyAyLjY0LjQ2IDEuMDctLjMxIDEuOTUtMS40IDMuMDYtMi43NyAxLjIxLTEuNDkgMi44My0zLjQ0IDQuMDgtMy40NCAxLjYzIDAgMS42NSAxLjAxIDEuNzYgMS43OS0zLjc4LjY0LTUuMzggMy42Ny01LjM4IDUuMzcgMCAxLjcgMS40NCAzLjA5IDMuMjEgMy4wOSAxLjYzIDAgNC4yOS0xLjMzIDQuNjktNi4xSDIxdi0yLjVoLTIuNDdjLS4xNS0xLjY1LTEuMDktNC4yLTQuMDMtNC4yLTIuMjUgMC00LjE4IDEuOTEtNC45NCAyLjg0LS41OC43My0yLjA2IDIuNDgtMi4yOSAyLjcyLS4yNS4zLS42OC44NC0xLjExLjg0LS40NSAwLS43Mi0uODMtLjM2LTEuOTIuMzUtMS4wOSAxLjQtMi44NiAxLjg1LTMuNTIuNzgtMS4xNCAxLjMtMS45MiAxLjMtMy4yOEM4Ljk1IDMuNjkgNy4zMSAzIDYuNDQgMyA1LjEyIDMgMy45NyA0IDMuNzIgNC4yNWMtLjM2LjM2LS42Ni42Ni0uODguOTNsMS43NSAxLjcxem05LjI5IDExLjY2Yy0uMzEgMC0uNzQtLjI2LS43NC0uNzIgMC0uNi43My0yLjIgMi44Ny0yLjc2LS4zIDIuNjktMS40MyAzLjQ4LTIuMTMgMy40OHoiIC8+PC9nPgo8ZyBpZD0iZ2V0LWFwcCI+PHBhdGggZD0iTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXoiIC8+PC9nPgo8ZyBpZD0iZ2lmIj48cGF0aCBkPSJNMTEuNSA5SDEzdjZoLTEuNXpNOSA5SDZjLS42IDAtMSAuNS0xIDF2NGMwIC41LjQgMSAxIDFoM2MuNiAwIDEtLjUgMS0xdi0ySDguNXYxLjVoLTJ2LTNIMTBWMTBjMC0uNS0uNC0xLTEtMXptMTAgMS41VjloLTQuNXY2SDE2di0yaDJ2LTEuNWgtMnYtMXoiIC8+PC9nPgo8ZyBpZD0iZ3JhZGUiPjxwYXRoIGQ9Ik0xMiAxNy4yN0wxOC4xOCAyMWwtMS42NC03LjAzTDIyIDkuMjRsLTcuMTktLjYxTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMXoiIC8+PC9nPgo8ZyBpZD0iZ3JvdXAtd29yayI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6TTggMTcuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6TTkuNSA4YzAtMS4zOCAxLjEyLTIuNSAyLjUtMi41czIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNVM5LjUgOS4zOCA5LjUgOHptNi41IDkuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6IiAvPjwvZz4KPGcgaWQ9ImhlbHAiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE3aC0ydi0yaDJ2MnptMi4wNy03Ljc1bC0uOS45MkMxMy40NSAxMi45IDEzIDEzLjUgMTMgMTVoLTJ2LS41YzAtMS4xLjQ1LTIuMSAxLjE3LTIuODNsMS4yNC0xLjI2Yy4zNy0uMzYuNTktLjg2LjU5LTEuNDEgMC0xLjEtLjktMi0yLTJzLTIgLjktMiAySDhjMC0yLjIxIDEuNzktNCA0LTRzNCAxLjc5IDQgNGMwIC44OC0uMzYgMS42OC0uOTMgMi4yNXoiIC8+PC9nPgo8ZyBpZD0iaGVscC1vdXRsaW5lIj48cGF0aCBkPSJNMTEgMThoMnYtMmgtMnYyem0xLTE2QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHptMC0xNGMtMi4yMSAwLTQgMS43OS00IDRoMmMwLTEuMS45LTIgMi0yczIgLjkgMiAyYzAgMi0zIDEuNzUtMyA1aDJjMC0yLjI1IDMtMi41IDMtNSAwLTIuMjEtMS43OS00LTQtNHoiIC8+PC9nPgo8ZyBpZD0iaGlnaGxpZ2h0LW9mZiI+PHBhdGggZD0iTTE0LjU5IDhMMTIgMTAuNTkgOS40MSA4IDggOS40MSAxMC41OSAxMiA4IDE0LjU5IDkuNDEgMTYgMTIgMTMuNDEgMTQuNTkgMTYgMTYgMTQuNTkgMTMuNDEgMTIgMTYgOS40MSAxNC41OSA4ek0xMiAyQzYuNDcgMiAyIDYuNDcgMiAxMnM0LjQ3IDEwIDEwIDEwIDEwLTQuNDcgMTAtMTBTMTcuNTMgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiIC8+PC9nPgo8ZyBpZD0iaGlzdG9yeSI+PHBhdGggZD0iTTEzIDNjLTQuOTcgMC05IDQuMDMtOSA5SDFsMy44OSAzLjg5LjA3LjE0TDkgMTJINmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuOTMgMC0zLjY4LS43OS00Ljk0LTIuMDZsLTEuNDIgMS40MkM4LjI3IDE5Ljk5IDEwLjUxIDIxIDEzIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0tMSA1djVsNC4yOCAyLjU0LjcyLTEuMjEtMy41LTIuMDhWOEgxMnoiIC8+PC9nPgo8ZyBpZD0iaG9tZSI+PHBhdGggZD0iTTEwIDIwdi02aDR2Nmg1di04aDNMMTIgMyAyIDEyaDN2OHoiIC8+PC9nPgo8ZyBpZD0iaG91cmdsYXNzLWVtcHR5Ij48cGF0aCBkPSJNNiAydjZoLjAxTDYgOC4wMSAxMCAxMmwtNCA0IC4wMS4wMUg2VjIyaDEydi01Ljk5aC0uMDFMMTggMTZsLTQtNCA0LTMuOTktLjAxLS4wMUgxOFYySDZ6bTEwIDE0LjVWMjBIOHYtMy41bDQtNCA0IDR6bS00LTVsLTQtNFY0aDh2My41bC00IDR6IiAvPjwvZz4KPGcgaWQ9ImhvdXJnbGFzcy1mdWxsIj48cGF0aCBkPSJNNiAydjZoLjAxTDYgOC4wMSAxMCAxMmwtNCA0IC4wMS4wMUg2VjIyaDEydi01Ljk5aC0uMDFMMTggMTZsLTQtNCA0LTMuOTktLjAxLS4wMUgxOFYySDZ6IiAvPjwvZz4KPGcgaWQ9Imh0dHAiPjxwYXRoIGQ9Ik00LjUgMTFoLTJWOUgxdjZoMS41di0yLjVoMlYxNUg2VjlINC41djJ6bTIuNS0uNWgxLjVWMTVIMTB2LTQuNWgxLjVWOUg3djEuNXptNS41IDBIMTRWMTVoMS41di00LjVIMTdWOWgtNC41djEuNXptOS0xLjVIMTh2NmgxLjV2LTJoMmMuOCAwIDEuNS0uNyAxLjUtMS41di0xYzAtLjgtLjctMS41LTEuNS0xLjV6bTAgMi41aC0ydi0xaDJ2MXoiIC8+PC9nPgo8ZyBpZD0iaHR0cHMiPjxwYXRoIGQ9Ik0xOCA4aC0xVjZjMC0yLjc2LTIuMjQtNS01LTVTNyAzLjI0IDcgNnYySDZjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWMTBjMC0xLjEtLjktMi0yLTJ6bS02IDljLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyem0zLjEtOUg4LjlWNmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMSAxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXYyeiIgLz48L2c+CjxnIGlkPSJpbXBvcnRhbnQtZGV2aWNlcyI+PHBhdGggZD0iTTIzIDExLjAxTDE4IDExYy0uNTUgMC0xIC40NS0xIDF2OWMwIC41NS40NSAxIDEgMWg1Yy41NSAwIDEtLjQ1IDEtMXYtOWMwLS41NS0uNDUtLjk5LTEtLjk5ek0yMyAyMGgtNXYtN2g1djd6TTIwIDJIMkMuODkgMiAwIDIuODkgMCA0djEyYzAgMS4xLjg5IDIgMiAyaDd2Mkg3djJoOHYtMmgtMnYtMmgydi0ySDJWNGgxOHY1aDJWNGMwLTEuMTEtLjktMi0yLTJ6bS04LjAzIDdMMTEgNmwtLjk3IDNIN2wyLjQ3IDEuNzYtLjk0IDIuOTEgMi40Ny0xLjggMi40NyAxLjgtLjk0LTIuOTFMMTUgOWgtMy4wM3oiIC8+PC9nPgo8ZyBpZD0iaW5ib3giPjxwYXRoIGQ9Ik0xOSAzSDQuOTljLTEuMTEgMC0xLjk4Ljg5LTEuOTggMkwzIDE5YzAgMS4xLjg4IDIgMS45OSAySDE5YzEuMSAwIDItLjkgMi0yVjVjMC0xLjExLS45LTItMi0yem0wIDEyaC00YzAgMS42Ni0xLjM1IDMtMyAzcy0zLTEuMzQtMy0zSDQuOTlWNUgxOXYxMHoiIC8+PC9nPgo8ZyBpZD0iaW5kZXRlcm1pbmF0ZS1jaGVjay1ib3giPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTIgMTBIN3YtMmgxMHYyeiIgLz48L2c+CjxnIGlkPSJpbmZvIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMSAxNWgtMnYtNmgydjZ6bTAtOGgtMlY3aDJ2MnoiIC8+PC9nPgo8ZyBpZD0iaW5mby1vdXRsaW5lIj48cGF0aCBkPSJNMTEgMTdoMnYtNmgtMnY2em0xLTE1QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHpNMTEgOWgyVjdoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iaW5wdXQiPjxwYXRoIGQ9Ik0yMSAzLjAxSDNjLTEuMSAwLTIgLjktMiAyVjloMlY0Ljk5aDE4djE0LjAzSDNWMTVIMXY0LjAxYzAgMS4xLjkgMS45OCAyIDEuOThoMThjMS4xIDAgMi0uODggMi0xLjk4di0xNGMwLTEuMTEtLjktMi0yLTJ6TTExIDE2bDQtNC00LTR2M0gxdjJoMTB2M3oiIC8+PC9nPgo8ZyBpZD0iaW52ZXJ0LWNvbG9ycyI+PHBhdGggZD0iTTE3LjY2IDcuOTNMMTIgMi4yNyA2LjM0IDcuOTNjLTMuMTIgMy4xMi0zLjEyIDguMTkgMCAxMS4zMUM3LjkgMjAuOCA5Ljk1IDIxLjU4IDEyIDIxLjU4YzIuMDUgMCA0LjEtLjc4IDUuNjYtMi4zNCAzLjEyLTMuMTIgMy4xMi04LjE5IDAtMTEuMzF6TTEyIDE5LjU5Yy0xLjYgMC0zLjExLS42Mi00LjI0LTEuNzZDNi42MiAxNi42OSA2IDE1LjE5IDYgMTMuNTlzLjYyLTMuMTEgMS43Ni00LjI0TDEyIDUuMXYxNC40OXoiIC8+PC9nPgo8ZyBpZD0ibGFiZWwiPjxwYXRoIGQ9Ik0xNy42MyA1Ljg0QzE3LjI3IDUuMzMgMTYuNjcgNSAxNiA1TDUgNS4wMUMzLjkgNS4wMSAzIDUuOSAzIDd2MTBjMCAxLjEuOSAxLjk5IDIgMS45OUwxNiAxOWMuNjcgMCAxLjI3LS4zMyAxLjYzLS44NEwyMiAxMmwtNC4zNy02LjE2eiIgLz48L2c+CjxnIGlkPSJsYWJlbC1vdXRsaW5lIj48cGF0aCBkPSJNMTcuNjMgNS44NEMxNy4yNyA1LjMzIDE2LjY3IDUgMTYgNUw1IDUuMDFDMy45IDUuMDEgMyA1LjkgMyA3djEwYzAgMS4xLjkgMS45OSAyIDEuOTlMMTYgMTljLjY3IDAgMS4yNy0uMzMgMS42My0uODRMMjIgMTJsLTQuMzctNi4xNnpNMTYgMTdINVY3aDExbDMuNTUgNUwxNiAxN3oiIC8+PC9nPgo8ZyBpZD0ibGFuZ3VhZ2UiPjxwYXRoIGQ9Ik0xMS45OSAyQzYuNDcgMiAyIDYuNDggMiAxMnM0LjQ3IDEwIDkuOTkgMTBDMTcuNTIgMjIgMjIgMTcuNTIgMjIgMTJTMTcuNTIgMiAxMS45OSAyem02LjkzIDZoLTIuOTVjLS4zMi0xLjI1LS43OC0yLjQ1LTEuMzgtMy41NiAxLjg0LjYzIDMuMzcgMS45MSA0LjMzIDMuNTZ6TTEyIDQuMDRjLjgzIDEuMiAxLjQ4IDIuNTMgMS45MSAzLjk2aC0zLjgyYy40My0xLjQzIDEuMDgtMi43NiAxLjkxLTMuOTZ6TTQuMjYgMTRDNC4xIDEzLjM2IDQgMTIuNjkgNCAxMnMuMS0xLjM2LjI2LTJoMy4zOGMtLjA4LjY2LS4xNCAxLjMyLS4xNCAyIDAgLjY4LjA2IDEuMzQuMTQgMkg0LjI2em0uODIgMmgyLjk1Yy4zMiAxLjI1Ljc4IDIuNDUgMS4zOCAzLjU2LTEuODQtLjYzLTMuMzctMS45LTQuMzMtMy41NnptMi45NS04SDUuMDhjLjk2LTEuNjYgMi40OS0yLjkzIDQuMzMtMy41NkM4LjgxIDUuNTUgOC4zNSA2Ljc1IDguMDMgOHpNMTIgMTkuOTZjLS44My0xLjItMS40OC0yLjUzLTEuOTEtMy45NmgzLjgyYy0uNDMgMS40My0xLjA4IDIuNzYtMS45MSAzLjk2ek0xNC4zNCAxNEg5LjY2Yy0uMDktLjY2LS4xNi0xLjMyLS4xNi0yIDAtLjY4LjA3LTEuMzUuMTYtMmg0LjY4Yy4wOS42NS4xNiAxLjMyLjE2IDIgMCAuNjgtLjA3IDEuMzQtLjE2IDJ6bS4yNSA1LjU2Yy42LTEuMTEgMS4wNi0yLjMxIDEuMzgtMy41NmgyLjk1Yy0uOTYgMS42NS0yLjQ5IDIuOTMtNC4zMyAzLjU2ek0xNi4zNiAxNGMuMDgtLjY2LjE0LTEuMzIuMTQtMiAwLS42OC0uMDYtMS4zNC0uMTQtMmgzLjM4Yy4xNi42NC4yNiAxLjMxLjI2IDJzLS4xIDEuMzYtLjI2IDJoLTMuMzh6IiAvPjwvZz4KPGcgaWQ9Imxhc3QtcGFnZSI+PHBhdGggZD0iTTUuNTkgNy40MUwxMC4xOCAxMmwtNC41OSA0LjU5TDcgMThsNi02LTYtNnpNMTYgNmgydjEyaC0yeiIgLz48L2c+CjxnIGlkPSJsYXVuY2giPjxwYXRoIGQ9Ik0xOSAxOUg1VjVoN1YzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnYtN2gtMnY3ek0xNCAzdjJoMy41OWwtOS44MyA5LjgzIDEuNDEgMS40MUwxOSA2LjQxVjEwaDJWM2gtN3oiIC8+PC9nPgo8ZyBpZD0ibGlnaHRidWxiLW91dGxpbmUiPjxwYXRoIGQ9Ik05IDIxYzAgLjU1LjQ1IDEgMSAxaDRjLjU1IDAgMS0uNDUgMS0xdi0xSDl2MXptMy0xOUM4LjE0IDIgNSA1LjE0IDUgOWMwIDIuMzggMS4xOSA0LjQ3IDMgNS43NFYxN2MwIC41NS40NSAxIDEgMWg2Yy41NSAwIDEtLjQ1IDEtMXYtMi4yNmMxLjgxLTEuMjcgMy0zLjM2IDMtNS43NCAwLTMuODYtMy4xNC03LTctN3ptMi44NSAxMS4xbC0uODUuNlYxNmgtNHYtMi4zbC0uODUtLjZDNy44IDEyLjE2IDcgMTAuNjMgNyA5YzAtMi43NiAyLjI0LTUgNS01czUgMi4yNCA1IDVjMCAxLjYzLS44IDMuMTYtMi4xNSA0LjF6IiAvPjwvZz4KPGcgaWQ9ImxpbmUtc3R5bGUiPjxwYXRoIGQ9Ik0zIDE2aDV2LTJIM3Yyem02LjUgMGg1di0yaC01djJ6bTYuNSAwaDV2LTJoLTV2MnpNMyAyMGgydi0ySDN2MnptNCAwaDJ2LTJIN3Yyem00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyek0zIDEyaDh2LTJIM3Yyem0xMCAwaDh2LTJoLTh2MnpNMyA0djRoMThWNEgzeiIgLz48L2c+CjxnIGlkPSJsaW5lLXdlaWdodCI+PHBhdGggZD0iTTMgMTdoMTh2LTJIM3Yyem0wIDNoMTh2LTFIM3Yxem0wLTdoMTh2LTNIM3Yzem0wLTl2NGgxOFY0SDN6IiAvPjwvZz4KPGcgaWQ9ImxpbmsiPjxwYXRoIGQ9Ik0zLjkgMTJjMC0xLjcxIDEuMzktMy4xIDMuMS0zLjFoNFY3SDdjLTIuNzYgMC01IDIuMjQtNSA1czIuMjQgNSA1IDVoNHYtMS45SDdjLTEuNzEgMC0zLjEtMS4zOS0zLjEtMy4xek04IDEzaDh2LTJIOHYyem05LTZoLTR2MS45aDRjMS43MSAwIDMuMSAxLjM5IDMuMSAzLjFzLTEuMzkgMy4xLTMuMSAzLjFoLTRWMTdoNGMyLjc2IDAgNS0yLjI0IDUtNXMtMi4yNC01LTUtNXoiIC8+PC9nPgo8ZyBpZD0ibGlzdCI+PHBhdGggZD0iTTMgMTNoMnYtMkgzdjJ6bTAgNGgydi0ySDN2MnptMC04aDJWN0gzdjJ6bTQgNGgxNHYtMkg3djJ6bTAgNGgxNHYtMkg3djJ6TTcgN3YyaDE0VjdIN3oiIC8+PC9nPgo8ZyBpZD0ibG9jayI+PHBhdGggZD0iTTE4IDhoLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2djJINmMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlYxMGMwLTEuMS0uOS0yLTItMnptLTYgOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6bTMuMS05SDguOVY2YzAtMS43MSAxLjM5LTMuMSAzLjEtMy4xIDEuNzEgMCAzLjEgMS4zOSAzLjEgMy4xdjJ6IiAvPjwvZz4KPGcgaWQ9ImxvY2stb3BlbiI+PHBhdGggZD0iTTEyIDE3YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptNi05aC0xVjZjMC0yLjc2LTIuMjQtNS01LTVTNyAzLjI0IDcgNmgxLjljMC0xLjcxIDEuMzktMy4xIDMuMS0zLjEgMS43MSAwIDMuMSAxLjM5IDMuMSAzLjF2Mkg2Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjEwYzAtMS4xLS45LTItMi0yem0wIDEySDZWMTBoMTJ2MTB6IiAvPjwvZz4KPGcgaWQ9ImxvY2stb3V0bGluZSI+PHBhdGggZD0iTTEyIDE3YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptNi05aC0xVjZjMC0yLjc2LTIuMjQtNS01LTVTNyAzLjI0IDcgNnYySDZjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWMTBjMC0xLjEtLjktMi0yLTJ6TTguOSA2YzAtMS43MSAxLjM5LTMuMSAzLjEtMy4xczMuMSAxLjM5IDMuMSAzLjF2Mkg4LjlWNnpNMTggMjBINlYxMGgxMnYxMHoiIC8+PC9nPgo8ZyBpZD0ibG93LXByaW9yaXR5Ij48cGF0aCBkPSJNMTQgNWg4djJoLTh6bTAgNS41aDh2MmgtOHptMCA1LjVoOHYyaC04ek0yIDExLjVDMiAxNS4wOCA0LjkyIDE4IDguNSAxOEg5djJsMy0zLTMtM3YyaC0uNUM2LjAyIDE2IDQgMTMuOTggNCAxMS41UzYuMDIgNyA4LjUgN0gxMlY1SDguNUM0LjkyIDUgMiA3LjkyIDIgMTEuNXoiIC8+PC9nPgo8ZyBpZD0ibG95YWx0eSI+PHBhdGggZD0iTTIxLjQxIDExLjU4bC05LTlDMTIuMDUgMi4yMiAxMS41NSAyIDExIDJINGMtMS4xIDAtMiAuOS0yIDJ2N2MwIC41NS4yMiAxLjA1LjU5IDEuNDJsOSA5Yy4zNi4zNi44Ni41OCAxLjQxLjU4LjU1IDAgMS4wNS0uMjIgMS40MS0uNTlsNy03Yy4zNy0uMzYuNTktLjg2LjU5LTEuNDEgMC0uNTUtLjIzLTEuMDYtLjU5LTEuNDJ6TTUuNSA3QzQuNjcgNyA0IDYuMzMgNCA1LjVTNC42NyA0IDUuNSA0IDcgNC42NyA3IDUuNSA2LjMzIDcgNS41IDd6bTExLjc3IDguMjdMMTMgMTkuNTRsLTQuMjctNC4yN0M4LjI4IDE0LjgxIDggMTQuMTkgOCAxMy41YzAtMS4zOCAxLjEyLTIuNSAyLjUtMi41LjY5IDAgMS4zMi4yOCAxLjc3Ljc0bC43My43Mi43My0uNzNjLjQ1LS40NSAxLjA4LS43MyAxLjc3LS43MyAxLjM4IDAgMi41IDEuMTIgMi41IDIuNSAwIC42OS0uMjggMS4zMi0uNzMgMS43N3oiIC8+PC9nPgo8ZyBpZD0ibWFpbCI+PHBhdGggZD0iTTIwIDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptMCA0bC04IDUtOC01VjZsOCA1IDgtNXYyeiIgLz48L2c+CjxnIGlkPSJtYXJrdW5yZWFkIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDRsLTggNS04LTVWNmw4IDUgOC01djJ6IiAvPjwvZz4KPGcgaWQ9Im1hcmt1bnJlYWQtbWFpbGJveCI+PHBhdGggZD0iTTIwIDZIMTB2Nkg4VjRoNlYwSDZ2Nkg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9Im1lbnUiPjxwYXRoIGQ9Ik0zIDE4aDE4di0ySDN2MnptMC01aDE4di0ySDN2MnptMC03djJoMThWNkgzeiIgLz48L2c+CjxnIGlkPSJtb3JlLWhvcml6Ij48cGF0aCBkPSJNNiAxMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTEyIDBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0tNiAwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ibW9yZS12ZXJ0Ij48cGF0aCBkPSJNMTIgOGMxLjEgMCAyLS45IDItMnMtLjktMi0yLTItMiAuOS0yIDIgLjkgMiAyIDJ6bTAgMmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAgNmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9Im1vdG9yY3ljbGUiPjxwYXRoIGQ9Ik0xOS40NCA5LjAzTDE1LjQxIDVIMTF2MmgzLjU5bDIgMkg1Yy0yLjggMC01IDIuMi01IDVzMi4yIDUgNSA1YzIuNDYgMCA0LjQ1LTEuNjkgNC45LTRoMS42NWwyLjc3LTIuNzdjLS4yMS41NC0uMzIgMS4xNC0uMzIgMS43NyAwIDIuOCAyLjIgNSA1IDVzNS0yLjIgNS01YzAtMi42NS0xLjk3LTQuNzctNC41Ni00Ljk3ek03LjgyIDE1QzcuNCAxNi4xNSA2LjI4IDE3IDUgMTdjLTEuNjMgMC0zLTEuMzctMy0zczEuMzctMyAzLTNjMS4yOCAwIDIuNC44NSAyLjgyIDJINXYyaDIuODJ6TTE5IDE3Yy0xLjY2IDAtMy0xLjM0LTMtM3MxLjM0LTMgMy0zIDMgMS4zNCAzIDMtMS4zNCAzLTMgM3oiIC8+PC9nPgo8ZyBpZD0ibW92ZS10by1pbmJveCI+PHBhdGggZD0iTTE5IDNINC45OWMtMS4xMSAwLTEuOTguOS0xLjk4IDJMMyAxOWMwIDEuMS44OCAyIDEuOTkgMkgxOWMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDEyaC00YzAgMS42Ni0xLjM1IDMtMyAzcy0zLTEuMzQtMy0zSDQuOTlWNUgxOXYxMHptLTMtNWgtMlY3aC00djNIOGw0IDQgNC00eiIgLz48L2c+CjxnIGlkPSJuZXh0LXdlZWsiPjxwYXRoIGQ9Ik0yMCA3aC00VjVjMC0uNTUtLjIyLTEuMDUtLjU5LTEuNDFDMTUuMDUgMy4yMiAxNC41NSAzIDE0IDNoLTRjLTEuMSAwLTIgLjktMiAydjJINGMtMS4xIDAtMiAuOS0yIDJ2MTFjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY5YzAtMS4xLS45LTItMi0yek0xMCA1aDR2MmgtNFY1em0xIDEzLjVsLTEtMSAzLTMtMy0zIDEtMSA0IDQtNCA0eiIgLz48L2c+CjxnIGlkPSJub3RlLWFkZCI+PHBhdGggZD0iTTE0IDJINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDIwYzAgMS4xLjg5IDIgMS45OSAySDE4YzEuMSAwIDItLjkgMi0yVjhsLTYtNnptMiAxNGgtM3YzaC0ydi0zSDh2LTJoM3YtM2gydjNoM3Yyem0tMy03VjMuNUwxOC41IDlIMTN6IiAvPjwvZz4KPGcgaWQ9Im9mZmxpbmUtcGluIj48cGF0aCBkPSJNMTIgMkM2LjUgMiAyIDYuNSAyIDEyczQuNSAxMCAxMCAxMCAxMC00LjUgMTAtMTBTMTcuNSAyIDEyIDJ6bTUgMTZIN3YtMmgxMHYyem0tNi43LTRMNyAxMC43bDEuNC0xLjQgMS45IDEuOSA1LjMtNS4zTDE3IDcuMyAxMC4zIDE0eiIgLz48L2c+CjxnIGlkPSJvcGFjaXR5Ij48cGF0aCBkPSJNMTcuNjYgOEwxMiAyLjM1IDYuMzQgOEM0Ljc4IDkuNTYgNCAxMS42NCA0IDEzLjY0cy43OCA0LjExIDIuMzQgNS42NyAzLjYxIDIuMzUgNS42NiAyLjM1IDQuMS0uNzkgNS42Ni0yLjM1UzIwIDE1LjY0IDIwIDEzLjY0IDE5LjIyIDkuNTYgMTcuNjYgOHpNNiAxNGMuMDEtMiAuNjItMy4yNyAxLjc2LTQuNEwxMiA1LjI3bDQuMjQgNC4zOEMxNy4zOCAxMC43NyAxNy45OSAxMiAxOCAxNEg2eiIgLz48L2c+CjxnIGlkPSJvcGVuLWluLWJyb3dzZXIiPjxwYXRoIGQ9Ik0xOSA0SDVjLTEuMTEgMC0yIC45LTIgMnYxMmMwIDEuMS44OSAyIDIgMmg0di0ySDVWOGgxNHYxMGgtNHYyaDRjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uODktMi0yLTJ6bS03IDZsLTQgNGgzdjZoMnYtNmgzbC00LTR6IiAvPjwvZz4KPGcgaWQ9Im9wZW4taW4tbmV3Ij48cGF0aCBkPSJNMTkgMTlINVY1aDdWM0g1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJ2LTdoLTJ2N3pNMTQgM3YyaDMuNTlsLTkuODMgOS44MyAxLjQxIDEuNDFMMTkgNi40MVYxMGgyVjNoLTd6IiAvPjwvZz4KPGcgaWQ9Im9wZW4td2l0aCI+PHBhdGggZD0iTTEwIDloNFY2aDNsLTUtNS01IDVoM3Yzem0tMSAxSDZWN2wtNSA1IDUgNXYtM2gzdi00em0xNCAybC01LTV2M2gtM3Y0aDN2M2w1LTV6bS05IDNoLTR2M0g3bDUgNSA1LTVoLTN2LTN6IiAvPjwvZz4KPGcgaWQ9InBhZ2V2aWV3Ij48cGF0aCBkPSJNMTEuNSA5QzEwLjEyIDkgOSAxMC4xMiA5IDExLjVzMS4xMiAyLjUgMi41IDIuNSAyLjUtMS4xMiAyLjUtMi41UzEyLjg4IDkgMTEuNSA5ek0yMCA0SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptLTMuMjEgMTQuMjFsLTIuOTEtMi45MWMtLjY5LjQ0LTEuNTEuNy0yLjM5LjdDOS4wMSAxNiA3IDEzLjk5IDcgMTEuNVM5LjAxIDcgMTEuNSA3IDE2IDkuMDEgMTYgMTEuNWMwIC44OC0uMjYgMS42OS0uNyAyLjM5bDIuOTEgMi45LTEuNDIgMS40MnoiIC8+PC9nPgo8ZyBpZD0icGFuLXRvb2wiPjxwYXRoIGQ9Ik0yMyA1LjVWMjBjMCAyLjItMS44IDQtNCA0aC03LjNjLTEuMDggMC0yLjEtLjQzLTIuODUtMS4xOUwxIDE0LjgzczEuMjYtMS4yMyAxLjMtMS4yNWMuMjItLjE5LjQ5LS4yOS43OS0uMjkuMjIgMCAuNDIuMDYuNi4xNi4wNC4wMSA0LjMxIDIuNDYgNC4zMSAyLjQ2VjRjMC0uODMuNjctMS41IDEuNS0xLjVTMTEgMy4xNyAxMSA0djdoMVYxLjVjMC0uODMuNjctMS41IDEuNS0xLjVTMTUgLjY3IDE1IDEuNVYxMWgxVjIuNWMwLS44My42Ny0xLjUgMS41LTEuNXMxLjUuNjcgMS41IDEuNVYxMWgxVjUuNWMwLS44My42Ny0xLjUgMS41LTEuNXMxLjUuNjcgMS41IDEuNXoiIC8+PC9nPgo8ZyBpZD0icGF5bWVudCI+PHBhdGggZD0iTTIwIDRINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMThjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWNmMwLTEuMTEtLjg5LTItMi0yem0wIDE0SDR2LTZoMTZ2NnptMC0xMEg0VjZoMTZ2MnoiIC8+PC9nPgo8ZyBpZD0icGVybS1jYW1lcmEtbWljIj48cGF0aCBkPSJNMjAgNWgtMy4xN0wxNSAzSDlMNy4xNyA1SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoN3YtMi4wOWMtMi44My0uNDgtNS0yLjk0LTUtNS45MWgyYzAgMi4yMSAxLjc5IDQgNCA0czQtMS43OSA0LTRoMmMwIDIuOTctMi4xNyA1LjQzLTUgNS45MVYyMWg3YzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6bS02IDhjMCAxLjEtLjkgMi0yIDJzLTItLjktMi0yVjljMC0xLjEuOS0yIDItMnMyIC45IDIgMnY0eiIgLz48L2c+CjxnIGlkPSJwZXJtLWNvbnRhY3QtY2FsZW5kYXIiPjxwYXRoIGQ9Ik0xOSAzaC0xVjFoLTJ2Mkg4VjFINnYySDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAzYzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptNiAxMkg2di0xYzAtMiA0LTMuMSA2LTMuMXM2IDEuMSA2IDMuMXYxeiIgLz48L2c+CjxnIGlkPSJwZXJtLWRhdGEtc2V0dGluZyI+PHBhdGggZD0iTTE4Ljk5IDExLjVjLjM0IDAgLjY3LjAzIDEgLjA3TDIwIDAgMCAyMGgxMS41NmMtLjA0LS4zMy0uMDctLjY2LS4wNy0xIDAtNC4xNCAzLjM2LTcuNSA3LjUtNy41em0zLjcxIDcuOTljLjAyLS4xNi4wNC0uMzIuMDQtLjQ5IDAtLjE3LS4wMS0uMzMtLjA0LS40OWwxLjA2LS44M2MuMDktLjA4LjEyLS4yMS4wNi0uMzJsLTEtMS43M2MtLjA2LS4xMS0uMTktLjE1LS4zMS0uMTFsLTEuMjQuNWMtLjI2LS4yLS41NC0uMzctLjg1LS40OWwtLjE5LTEuMzJjLS4wMS0uMTItLjEyLS4yMS0uMjQtLjIxaC0yYy0uMTIgMC0uMjMuMDktLjI1LjIxbC0uMTkgMS4zMmMtLjMuMTMtLjU5LjI5LS44NS40OWwtMS4yNC0uNWMtLjExLS4wNC0uMjQgMC0uMzEuMTFsLTEgMS43M2MtLjA2LjExLS4wNC4yNC4wNi4zMmwxLjA2LjgzYy0uMDIuMTYtLjAzLjMyLS4wMy40OSAwIC4xNy4wMS4zMy4wMy40OWwtMS4wNi44M2MtLjA5LjA4LS4xMi4yMS0uMDYuMzJsMSAxLjczYy4wNi4xMS4xOS4xNS4zMS4xMWwxLjI0LS41Yy4yNi4yLjU0LjM3Ljg1LjQ5bC4xOSAxLjMyYy4wMi4xMi4xMi4yMS4yNS4yMWgyYy4xMiAwIC4yMy0uMDkuMjUtLjIxbC4xOS0xLjMyYy4zLS4xMy41OS0uMjkuODQtLjQ5bDEuMjUuNWMuMTEuMDQuMjQgMCAuMzEtLjExbDEtMS43M2MuMDYtLjExLjAzLS4yNC0uMDYtLjMybC0xLjA3LS44M3ptLTMuNzEgMS4wMWMtLjgzIDAtMS41LS42Ny0xLjUtMS41cy42Ny0xLjUgMS41LTEuNSAxLjUuNjcgMS41IDEuNS0uNjcgMS41LTEuNSAxLjV6IiAvPjwvZz4KPGcgaWQ9InBlcm0tZGV2aWNlLWluZm9ybWF0aW9uIj48cGF0aCBkPSJNMTMgN2gtMnYyaDJWN3ptMCA0aC0ydjZoMnYtNnptNC05Ljk5TDcgMWMtMS4xIDAtMiAuOS0yIDJ2MThjMCAxLjEuOSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTEuOTktMi0xLjk5ek0xNyAxOUg3VjVoMTB2MTR6IiAvPjwvZz4KPGcgaWQ9InBlcm0taWRlbnRpdHkiPjxwYXRoIGQ9Ik0xMiA1LjljMS4xNiAwIDIuMS45NCAyLjEgMi4xcy0uOTQgMi4xLTIuMSAyLjFTOS45IDkuMTYgOS45IDhzLjk0LTIuMSAyLjEtMi4xbTAgOWMyLjk3IDAgNi4xIDEuNDYgNi4xIDIuMXYxLjFINS45VjE3YzAtLjY0IDMuMTMtMi4xIDYuMS0yLjFNMTIgNEM5Ljc5IDQgOCA1Ljc5IDggOHMxLjc5IDQgNCA0IDQtMS43OSA0LTQtMS43OS00LTQtNHptMCA5Yy0yLjY3IDAtOCAxLjM0LTggNHYzaDE2di0zYzAtMi42Ni01LjMzLTQtOC00eiIgLz48L2c+CjxnIGlkPSJwZXJtLW1lZGlhIj48cGF0aCBkPSJNMiA2SDB2NWguMDFMMCAyMGMwIDEuMS45IDIgMiAyaDE4di0ySDJWNnptMjAtMmgtOGwtMi0ySDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAxNmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6TTcgMTVsNC41LTYgMy41IDQuNTEgMi41LTMuMDFMMjEgMTVIN3oiIC8+PC9nPgo8ZyBpZD0icGVybS1waG9uZS1tc2ciPjxwYXRoIGQ9Ik0yMCAxNS41Yy0xLjI1IDAtMi40NS0uMi0zLjU3LS41Ny0uMzUtLjExLS43NC0uMDMtMS4wMi4yNGwtMi4yIDIuMmMtMi44My0xLjQ0LTUuMTUtMy43NS02LjU5LTYuNThsMi4yLTIuMjFjLjI4LS4yNy4zNi0uNjYuMjUtMS4wMUM4LjcgNi40NSA4LjUgNS4yNSA4LjUgNGMwLS41NS0uNDUtMS0xLTFINGMtLjU1IDAtMSAuNDUtMSAxIDAgOS4zOSA3LjYxIDE3IDE3IDE3IC41NSAwIDEtLjQ1IDEtMXYtMy41YzAtLjU1LS40NS0xLTEtMXpNMTIgM3YxMGwzLTNoNlYzaC05eiIgLz48L2c+CjxnIGlkPSJwZXJtLXNjYW4td2lmaSI+PHBhdGggZD0iTTEyIDNDNi45NSAzIDMuMTUgNC44NSAwIDcuMjNMMTIgMjIgMjQgNy4yNUMyMC44NSA0Ljg3IDE3LjA1IDMgMTIgM3ptMSAxM2gtMnYtNmgydjZ6bS0yLThWNmgydjJoLTJ6IiAvPjwvZz4KPGcgaWQ9InBldHMiPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjkuNSIgcj0iMi41IiAvPjxjaXJjbGUgY3g9IjkiIGN5PSI1LjUiIHI9IjIuNSIgLz48Y2lyY2xlIGN4PSIxNSIgY3k9IjUuNSIgcj0iMi41IiAvPjxjaXJjbGUgY3g9IjE5LjUiIGN5PSI5LjUiIHI9IjIuNSIgLz48cGF0aCBkPSJNMTcuMzQgMTQuODZjLS44Ny0xLjAyLTEuNi0xLjg5LTIuNDgtMi45MS0uNDYtLjU0LTEuMDUtMS4wOC0xLjc1LTEuMzItLjExLS4wNC0uMjItLjA3LS4zMy0uMDktLjI1LS4wNC0uNTItLjA0LS43OC0uMDRzLS41MyAwLS43OS4wNWMtLjExLjAyLS4yMi4wNS0uMzMuMDktLjcuMjQtMS4yOC43OC0xLjc1IDEuMzItLjg3IDEuMDItMS42IDEuODktMi40OCAyLjkxLTEuMzEgMS4zMS0yLjkyIDIuNzYtMi42MiA0Ljc5LjI5IDEuMDIgMS4wMiAyLjAzIDIuMzMgMi4zMi43My4xNSAzLjA2LS40NCA1LjU0LS40NGguMThjMi40OCAwIDQuODEuNTggNS41NC40NCAxLjMxLS4yOSAyLjA0LTEuMzEgMi4zMy0yLjMyLjMxLTIuMDQtMS4zLTMuNDktMi42MS00Ljh6IiAvPjwvZz4KPGcgaWQ9InBpY3R1cmUtaW4tcGljdHVyZSI+PHBhdGggZD0iTTE5IDdoLTh2Nmg4Vjd6bTItNEgzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDEuOTggMiAxLjk4aDE4YzEuMSAwIDItLjg4IDItMS45OFY1YzAtMS4xLS45LTItMi0yem0wIDE2LjAxSDNWNC45OGgxOHYxNC4wM3oiIC8+PC9nPgo8ZyBpZD0icGljdHVyZS1pbi1waWN0dXJlLWFsdCI+PHBhdGggZD0iTTE5IDExaC04djZoOHYtNnptNCA4VjQuOThDMjMgMy44OCAyMi4xIDMgMjEgM0gzYy0xLjEgMC0yIC44OC0yIDEuOThWMTljMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMnptLTIgLjAySDNWNC45N2gxOHYxNC4wNXoiIC8+PC9nPgo8ZyBpZD0icGxheS1mb3Itd29yayI+PHBhdGggZD0iTTExIDV2NS41OUg3LjVsNC41IDQuNSA0LjUtNC41SDEzVjVoLTJ6bS01IDljMCAzLjMxIDIuNjkgNiA2IDZzNi0yLjY5IDYtNmgtMmMwIDIuMjEtMS43OSA0LTQgNHMtNC0xLjc5LTQtNEg2eiIgLz48L2c+CjxnIGlkPSJwb2x5bWVyIj48cGF0aCBkPSJNMTkgNGgtNEw3LjExIDE2LjYzIDQuNSAxMiA5IDRINUwuNSAxMiA1IDIwaDRsNy44OS0xMi42M0wxOS41IDEyIDE1IDIwaDRsNC41LTh6IiAvPjwvZz4KPGcgaWQ9InBvd2VyLXNldHRpbmdzLW5ldyI+PHBhdGggZD0iTTEzIDNoLTJ2MTBoMlYzem00LjgzIDIuMTdsLTEuNDIgMS40MkMxNy45OSA3Ljg2IDE5IDkuODEgMTkgMTJjMCAzLjg3LTMuMTMgNy03IDdzLTctMy4xMy03LTdjMC0yLjE5IDEuMDEtNC4xNCAyLjU4LTUuNDJMNi4xNyA1LjE3QzQuMjMgNi44MiAzIDkuMjYgMyAxMmMwIDQuOTcgNC4wMyA5IDkgOXM5LTQuMDMgOS05YzAtMi43NC0xLjIzLTUuMTgtMy4xNy02LjgzeiIgLz48L2c+CjxnIGlkPSJwcmVnbmFudC13b21hbiI+PHBhdGggZD0iTTkgNGMwLTEuMTEuODktMiAyLTJzMiAuODkgMiAyLS44OSAyLTIgMi0yLS44OS0yLTJ6bTcgOWMtLjAxLTEuMzQtLjgzLTIuNTEtMi0zIDAtMS42Ni0xLjM0LTMtMy0zcy0zIDEuMzQtMyAzdjdoMnY1aDN2LTVoM3YtNHoiIC8+PC9nPgo8ZyBpZD0icHJpbnQiPjxwYXRoIGQ9Ik0xOSA4SDVjLTEuNjYgMC0zIDEuMzQtMyAzdjZoNHY0aDEydi00aDR2LTZjMC0xLjY2LTEuMzQtMy0zLTN6bS0zIDExSDh2LTVoOHY1em0zLTdjLS41NSAwLTEtLjQ1LTEtMXMuNDUtMSAxLTEgMSAuNDUgMSAxLS40NSAxLTEgMXptLTEtOUg2djRoMTJWM3oiIC8+PC9nPgo8ZyBpZD0icXVlcnktYnVpbGRlciI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6TTEyIDIwYy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHptLjUtMTNIMTF2Nmw1LjI1IDMuMTUuNzUtMS4yMy00LjUtMi42N3oiIC8+PC9nPgo8ZyBpZD0icXVlc3Rpb24tYW5zd2VyIj48cGF0aCBkPSJNMjEgNmgtMnY5SDZ2MmMwIC41NS40NSAxIDEgMWgxMWw0IDRWN2MwLS41NS0uNDUtMS0xLTF6bS00IDZWM2MwLS41NS0uNDUtMS0xLTFIM2MtLjU1IDAtMSAuNDUtMSAxdjE0bDQtNGgxMGMuNTUgMCAxLS40NSAxLTF6IiAvPjwvZz4KPGcgaWQ9InJhZGlvLWJ1dHRvbi1jaGVja2VkIj48cGF0aCBkPSJNMTIgN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNSA1LTIuMjQgNS01LTIuMjQtNS01LTV6bTAtNUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MiAwLTgtMy41OC04LThzMy41OC04IDgtOCA4IDMuNTggOCA4LTMuNTggOC04IDh6IiAvPjwvZz4KPGcgaWQ9InJhZGlvLWJ1dHRvbi11bmNoZWNrZWQiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiIC8+PC9nPgo8ZyBpZD0icmVjZWlwdCI+PHBhdGggZD0iTTE4IDE3SDZ2LTJoMTJ2MnptMC00SDZ2LTJoMTJ2MnptMC00SDZWN2gxMnYyek0zIDIybDEuNS0xLjVMNiAyMmwxLjUtMS41TDkgMjJsMS41LTEuNUwxMiAyMmwxLjUtMS41TDE1IDIybDEuNS0xLjVMMTggMjJsMS41LTEuNUwyMSAyMlYybC0xLjUgMS41TDE4IDJsLTEuNSAxLjVMMTUgMmwtMS41IDEuNUwxMiAybC0xLjUgMS41TDkgMiA3LjUgMy41IDYgMiA0LjUgMy41IDMgMnYyMHoiIC8+PC9nPgo8ZyBpZD0icmVjb3JkLXZvaWNlLW92ZXIiPjxjaXJjbGUgY3g9IjkiIGN5PSI5IiByPSI0IiAvPjxwYXRoIGQ9Ik05IDE1Yy0yLjY3IDAtOCAxLjM0LTggNHYyaDE2di0yYzAtMi42Ni01LjMzLTQtOC00em03Ljc2LTkuNjRsLTEuNjggMS42OWMuODQgMS4xOC44NCAyLjcxIDAgMy44OWwxLjY4IDEuNjljMi4wMi0yLjAyIDIuMDItNS4wNyAwLTcuMjd6TTIwLjA3IDJsLTEuNjMgMS42M2MyLjc3IDMuMDIgMi43NyA3LjU2IDAgMTAuNzRMMjAuMDcgMTZjMy45LTMuODkgMy45MS05Ljk1IDAtMTR6IiAvPjwvZz4KPGcgaWQ9InJlZGVlbSI+PHBhdGggZD0iTTIwIDZoLTIuMThjLjExLS4zMS4xOC0uNjUuMTgtMSAwLTEuNjYtMS4zNC0zLTMtMy0xLjA1IDAtMS45Ni41NC0yLjUgMS4zNWwtLjUuNjctLjUtLjY4QzEwLjk2IDIuNTQgMTAuMDUgMiA5IDIgNy4zNCAyIDYgMy4zNCA2IDVjMCAuMzUuMDcuNjkuMTggMUg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS01LTJjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXpNOSA0Yy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTExIDE1SDR2LTJoMTZ2MnptMC01SDRWOGg1LjA4TDcgMTAuODMgOC42MiAxMiAxMSA4Ljc2bDEtMS4zNiAxIDEuMzZMMTUuMzggMTIgMTcgMTAuODMgMTQuOTIgOEgyMHY2eiIgLz48L2c+CjxnIGlkPSJyZWRvIj48cGF0aCBkPSJNMTguNCAxMC42QzE2LjU1IDguOTkgMTQuMTUgOCAxMS41IDhjLTQuNjUgMC04LjU4IDMuMDMtOS45NiA3LjIyTDMuOSAxNmMxLjA1LTMuMTkgNC4wNS01LjUgNy42LTUuNSAxLjk1IDAgMy43My43MiA1LjEyIDEuODhMMTMgMTZoOVY3bC0zLjYgMy42eiIgLz48L2c+CjxnIGlkPSJyZWZyZXNoIj48cGF0aCBkPSJNMTcuNjUgNi4zNUMxNi4yIDQuOSAxNC4yMSA0IDEyIDRjLTQuNDIgMC03Ljk5IDMuNTgtNy45OSA4czMuNTcgOCA3Ljk5IDhjMy43MyAwIDYuODQtMi41NSA3LjczLTZoLTIuMDhjLS44MiAyLjMzLTMuMDQgNC01LjY1IDQtMy4zMSAwLTYtMi42OS02LTZzMi42OS02IDYtNmMxLjY2IDAgMy4xNC42OSA0LjIyIDEuNzhMMTMgMTFoN1Y0bC0yLjM1IDIuMzV6IiAvPjwvZz4KPGcgaWQ9InJlbW92ZSI+PHBhdGggZD0iTTE5IDEzSDV2LTJoMTR2MnoiIC8+PC9nPgo8ZyBpZD0icmVtb3ZlLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTUgMTFIN3YtMmgxMHYyeiIgLz48L2c+CjxnIGlkPSJyZW1vdmUtY2lyY2xlLW91dGxpbmUiPjxwYXRoIGQ9Ik03IDExdjJoMTB2LTJIN3ptNS05QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiIC8+PC9nPgo8ZyBpZD0icmVtb3ZlLXNob3BwaW5nLWNhcnQiPjxwYXRoIGQ9Ik0yMi43MyAyMi43M0wyLjc3IDIuNzcgMiAybC0uNzMtLjczTDAgMi41NGw0LjM5IDQuMzkgMi4yMSA0LjY2LTEuMzUgMi40NWMtLjE2LjI4LS4yNS42MS0uMjUuOTYgMCAxLjEuOSAyIDIgMmg3LjQ2bDEuMzggMS4zOGMtLjUuMzYtLjgzLjk1LS44MyAxLjYyIDAgMS4xLjg5IDIgMS45OSAyIC42NyAwIDEuMjYtLjMzIDEuNjItLjg0TDIxLjQ2IDI0bDEuMjctMS4yN3pNNy40MiAxNWMtLjE0IDAtLjI1LS4xMS0uMjUtLjI1bC4wMy0uMTIuOS0xLjYzaDIuMzZsMiAySDcuNDJ6bTguMTMtMmMuNzUgMCAxLjQxLS40MSAxLjc1LTEuMDNsMy41OC02LjQ5Yy4wOC0uMTQuMTItLjMxLjEyLS40OCAwLS41NS0uNDUtMS0xLTFINi41NGw5LjAxIDl6TTcgMThjLTEuMSAwLTEuOTkuOS0xLjk5IDJTNS45IDIyIDcgMjJzMi0uOSAyLTItLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9InJlb3JkZXIiPjxwYXRoIGQ9Ik0zIDE1aDE4di0ySDN2MnptMCA0aDE4di0ySDN2MnptMC04aDE4VjlIM3Yyem0wLTZ2MmgxOFY1SDN6IiAvPjwvZz4KPGcgaWQ9InJlcGx5Ij48cGF0aCBkPSJNMTAgOVY1bC03IDcgNyA3di00LjFjNSAwIDguNSAxLjYgMTEgNS4xLTEtNS00LTEwLTExLTExeiIgLz48L2c+CjxnIGlkPSJyZXBseS1hbGwiPjxwYXRoIGQ9Ik03IDhWNWwtNyA3IDcgN3YtM2wtNC00IDQtNHptNiAxVjVsLTcgNyA3IDd2LTQuMWM1IDAgOC41IDEuNiAxMSA1LjEtMS01LTQtMTAtMTEtMTF6IiAvPjwvZz4KPGcgaWQ9InJlcG9ydCI+PHBhdGggZD0iTTE1LjczIDNIOC4yN0wzIDguMjd2Ny40Nkw4LjI3IDIxaDcuNDZMMjEgMTUuNzNWOC4yN0wxNS43MyAzek0xMiAxNy4zYy0uNzIgMC0xLjMtLjU4LTEuMy0xLjMgMC0uNzIuNTgtMS4zIDEuMy0xLjMuNzIgMCAxLjMuNTggMS4zIDEuMyAwIC43Mi0uNTggMS4zLTEuMyAxLjN6bTEtNC4zaC0yVjdoMnY2eiIgLz48L2c+CjxnIGlkPSJyZXBvcnQtcHJvYmxlbSI+PHBhdGggZD0iTTEgMjFoMjJMMTIgMiAxIDIxem0xMi0zaC0ydi0yaDJ2MnptMC00aC0ydi00aDJ2NHoiIC8+PC9nPgo8ZyBpZD0icmVzdG9yZSI+PHBhdGggZD0iTTEzIDNjLTQuOTcgMC05IDQuMDMtOSA5SDFsMy44OSAzLjg5LjA3LjE0TDkgMTJINmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuOTMgMC0zLjY4LS43OS00Ljk0LTIuMDZsLTEuNDIgMS40MkM4LjI3IDE5Ljk5IDEwLjUxIDIxIDEzIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0tMSA1djVsNC4yOCAyLjU0LjcyLTEuMjEtMy41LTIuMDhWOEgxMnoiIC8+PC9nPgo8ZyBpZD0icmVzdG9yZS1wYWdlIj48cGF0aCBkPSJNMTQgMkg2Yy0xLjEgMC0xLjk5LjktMS45OSAyTDQgMjBjMCAxLjEuODkgMiAxLjk5IDJIMThjMS4xIDAgMi0uOSAyLTJWOGwtNi02em0tMiAxNmMtMi4wNSAwLTMuODEtMS4yNC00LjU4LTNoMS43MWMuNjMuOSAxLjY4IDEuNSAyLjg3IDEuNSAxLjkzIDAgMy41LTEuNTcgMy41LTMuNVMxMy45MyA5LjUgMTIgOS41Yy0xLjM1IDAtMi41Mi43OC0zLjEgMS45bDEuNiAxLjZoLTRWOWwxLjMgMS4zQzguNjkgOC45MiAxMC4yMyA4IDEyIDhjMi43NiAwIDUgMi4yNCA1IDVzLTIuMjQgNS01IDV6IiAvPjwvZz4KPGcgaWQ9InJvb20iPjxwYXRoIGQ9Ik0xMiAyQzguMTMgMiA1IDUuMTMgNSA5YzAgNS4yNSA3IDEzIDcgMTNzNy03Ljc1IDctMTNjMC0zLjg3LTMuMTMtNy03LTd6bTAgOS41Yy0xLjM4IDAtMi41LTEuMTItMi41LTIuNXMxLjEyLTIuNSAyLjUtMi41IDIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNXoiIC8+PC9nPgo8ZyBpZD0icm91bmRlZC1jb3JuZXIiPjxwYXRoIGQ9Ik0xOSAxOWgydjJoLTJ2LTJ6bTAtMmgydi0yaC0ydjJ6TTMgMTNoMnYtMkgzdjJ6bTAgNGgydi0ySDN2MnptMC04aDJWN0gzdjJ6bTAtNGgyVjNIM3Yyem00IDBoMlYzSDd2MnptOCAxNmgydi0yaC0ydjJ6bS00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyem0tOCAwaDJ2LTJIN3Yyem0tNCAwaDJ2LTJIM3Yyek0yMSA4YzAtMi43Ni0yLjI0LTUtNS01aC01djJoNWMxLjY1IDAgMyAxLjM1IDMgM3Y1aDJWOHoiIC8+PC9nPgo8ZyBpZD0icm93aW5nIj48cGF0aCBkPSJNOC41IDE0LjVMNCAxOWwxLjUgMS41TDkgMTdoMmwtMi41LTIuNXpNMTUgMWMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTYgMjAuMDFMMTggMjRsLTIuOTktMy4wMVYxOS41bC03LjEtNy4wOWMtLjMxLjA1LS42MS4wNy0uOTEuMDd2LTIuMTZjMS42Ni4wMyAzLjYxLS44NyA0LjY3LTIuMDRsMS40LTEuNTVjLjE5LS4yMS40My0uMzguNjktLjUuMjktLjE0LjYyLS4yMy45Ni0uMjNoLjAzQzE1Ljk5IDYuMDEgMTcgNy4wMiAxNyA4LjI2djUuNzVjMCAuODQtLjM1IDEuNjEtLjkyIDIuMTZsLTMuNTgtMy41OHYtMi4yN2MtLjYzLjUyLTEuNDMgMS4wMi0yLjI5IDEuMzlMMTYuNSAxOEgxOGwzIDMuMDF6IiAvPjwvZz4KPGcgaWQ9InNhdmUiPjxwYXRoIGQ9Ik0xNyAzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY3bC00LTR6bS01IDE2Yy0xLjY2IDAtMy0xLjM0LTMtM3MxLjM0LTMgMy0zIDMgMS4zNCAzIDMtMS4zNCAzLTMgM3ptMy0xMEg1VjVoMTB2NHoiIC8+PC9nPgo8ZyBpZD0ic2NoZWR1bGUiPjxwYXRoIGQ9Ik0xMS45OSAyQzYuNDcgMiAyIDYuNDggMiAxMnM0LjQ3IDEwIDkuOTkgMTBDMTcuNTIgMjIgMjIgMTcuNTIgMjIgMTJTMTcuNTIgMiAxMS45OSAyek0xMiAyMGMtNC40MiAwLTgtMy41OC04LThzMy41OC04IDgtOCA4IDMuNTggOCA4LTMuNTggOC04IDh6bS41LTEzSDExdjZsNS4yNSAzLjE1Ljc1LTEuMjMtNC41LTIuNjd6IiAvPjwvZz4KPGcgaWQ9InNlYXJjaCI+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6IiAvPjwvZz4KPGcgaWQ9InNlbGVjdC1hbGwiPjxwYXRoIGQ9Ik0zIDVoMlYzYy0xLjEgMC0yIC45LTIgMnptMCA4aDJ2LTJIM3Yyem00IDhoMnYtMkg3djJ6TTMgOWgyVjdIM3Yyem0xMC02aC0ydjJoMlYzem02IDB2MmgyYzAtMS4xLS45LTItMi0yek01IDIxdi0ySDNjMCAxLjEuOSAyIDIgMnptLTItNGgydi0ySDN2MnpNOSAzSDd2MmgyVjN6bTIgMThoMnYtMmgtMnYyem04LThoMnYtMmgtMnYyem0wIDhjMS4xIDAgMi0uOSAyLTJoLTJ2MnptMC0xMmgyVjdoLTJ2MnptMCA4aDJ2LTJoLTJ2MnptLTQgNGgydi0yaC0ydjJ6bTAtMTZoMlYzaC0ydjJ6TTcgMTdoMTBWN0g3djEwem0yLThoNnY2SDlWOXoiIC8+PC9nPgo8ZyBpZD0ic2VuZCI+PHBhdGggZD0iTTIuMDEgMjFMMjMgMTIgMi4wMSAzIDIgMTBsMTUgMi0xNSAyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncyI+PHBhdGggZD0iTTE5LjQzIDEyLjk4Yy4wNC0uMzIuMDctLjY0LjA3LS45OHMtLjAzLS42Ni0uMDctLjk4bDIuMTEtMS42NWMuMTktLjE1LjI0LS40Mi4xMi0uNjRsLTItMy40NmMtLjEyLS4yMi0uMzktLjMtLjYxLS4yMmwtMi40OSAxYy0uNTItLjQtMS4wOC0uNzMtMS42OS0uOThsLS4zOC0yLjY1QzE0LjQ2IDIuMTggMTQuMjUgMiAxNCAyaC00Yy0uMjUgMC0uNDYuMTgtLjQ5LjQybC0uMzggMi42NWMtLjYxLjI1LTEuMTcuNTktMS42OS45OGwtMi40OS0xYy0uMjMtLjA5LS40OSAwLS42MS4yMmwtMiAzLjQ2Yy0uMTMuMjItLjA3LjQ5LjEyLjY0bDIuMTEgMS42NWMtLjA0LjMyLS4wNy42NS0uMDcuOThzLjAzLjY2LjA3Ljk4bC0yLjExIDEuNjVjLS4xOS4xNS0uMjQuNDItLjEyLjY0bDIgMy40NmMuMTIuMjIuMzkuMy42MS4yMmwyLjQ5LTFjLjUyLjQgMS4wOC43MyAxLjY5Ljk4bC4zOCAyLjY1Yy4wMy4yNC4yNC40Mi40OS40Mmg0Yy4yNSAwIC40Ni0uMTguNDktLjQybC4zOC0yLjY1Yy42MS0uMjUgMS4xNy0uNTkgMS42OS0uOThsMi40OSAxYy4yMy4wOS40OSAwIC42MS0uMjJsMi0zLjQ2Yy4xMi0uMjIuMDctLjQ5LS4xMi0uNjRsLTIuMTEtMS42NXpNMTIgMTUuNWMtMS45MyAwLTMuNS0xLjU3LTMuNS0zLjVzMS41Ny0zLjUgMy41LTMuNSAzLjUgMS41NyAzLjUgMy41LTEuNTcgMy41LTMuNSAzLjV6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWFwcGxpY2F0aW9ucyI+PHBhdGggZD0iTTEyIDEwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptNy03SDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uOSAyLTJWNWMwLTEuMS0uODktMi0yLTJ6bS0xLjc1IDljMCAuMjMtLjAyLjQ2LS4wNS42OGwxLjQ4IDEuMTZjLjEzLjExLjE3LjMuMDguNDVsLTEuNCAyLjQyYy0uMDkuMTUtLjI3LjIxLS40My4xNWwtMS43NC0uN2MtLjM2LjI4LS43Ni41MS0xLjE4LjY5bC0uMjYgMS44NWMtLjAzLjE3LS4xOC4zLS4zNS4zaC0yLjhjLS4xNyAwLS4zMi0uMTMtLjM1LS4yOWwtLjI2LTEuODVjLS40My0uMTgtLjgyLS40MS0xLjE4LS42OWwtMS43NC43Yy0uMTYuMDYtLjM0IDAtLjQzLS4xNWwtMS40LTIuNDJjLS4wOS0uMTUtLjA1LS4zNC4wOC0uNDVsMS40OC0xLjE2Yy0uMDMtLjIzLS4wNS0uNDYtLjA1LS42OSAwLS4yMy4wMi0uNDYuMDUtLjY4bC0xLjQ4LTEuMTZjLS4xMy0uMTEtLjE3LS4zLS4wOC0uNDVsMS40LTIuNDJjLjA5LS4xNS4yNy0uMjEuNDMtLjE1bDEuNzQuN2MuMzYtLjI4Ljc2LS41MSAxLjE4LS42OWwuMjYtMS44NWMuMDMtLjE3LjE4LS4zLjM1LS4zaDIuOGMuMTcgMCAuMzIuMTMuMzUuMjlsLjI2IDEuODVjLjQzLjE4LjgyLjQxIDEuMTguNjlsMS43NC0uN2MuMTYtLjA2LjM0IDAgLjQzLjE1bDEuNCAyLjQyYy4wOS4xNS4wNS4zNC0uMDguNDVsLTEuNDggMS4xNmMuMDMuMjMuMDUuNDYuMDUuNjl6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWJhY2t1cC1yZXN0b3JlIj48cGF0aCBkPSJNMTQgMTJjMC0xLjEtLjktMi0yLTJzLTIgLjktMiAyIC45IDIgMiAyIDItLjkgMi0yem0tMi05Yy00Ljk3IDAtOSA0LjAzLTkgOUgwbDQgNCA0LTRINWMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuNTEgMC0yLjkxLS40OS00LjA2LTEuM2wtMS40MiAxLjQ0QzguMDQgMjAuMyA5Ljk0IDIxIDEyIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05eiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1ibHVldG9vdGgiPjxwYXRoIGQ9Ik0xMSAyNGgydi0yaC0ydjJ6bS00IDBoMnYtMkg3djJ6bTggMGgydi0yaC0ydjJ6bTIuNzEtMTguMjlMMTIgMGgtMXY3LjU5TDYuNDEgMyA1IDQuNDEgMTAuNTkgMTAgNSAxNS41OSA2LjQxIDE3IDExIDEyLjQxVjIwaDFsNS43MS01LjcxLTQuMy00LjI5IDQuMy00LjI5ek0xMyAzLjgzbDEuODggMS44OEwxMyA3LjU5VjMuODN6bTEuODggMTAuNDZMMTMgMTYuMTd2LTMuNzZsMS44OCAxLjg4eiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1icmlnaHRuZXNzIj48cGF0aCBkPSJNMjEgM0gzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTYuMDFIM1Y0Ljk5aDE4djE0LjAyek04IDE2aDIuNWwxLjUgMS41IDEuNS0xLjVIMTZ2LTIuNWwxLjUtMS41LTEuNS0xLjVWOGgtMi41TDEyIDYuNSAxMC41IDhIOHYyLjVMNi41IDEyIDggMTMuNVYxNnptNC03YzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzVjl6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWNlbGwiPjxwYXRoIGQ9Ik03IDI0aDJ2LTJIN3Yyem00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyek0xNiAuMDFMOCAwQzYuOSAwIDYgLjkgNiAydjE2YzAgMS4xLjkgMiAyIDJoOGMxLjEgMCAyLS45IDItMlYyYzAtMS4xLS45LTEuOTktMi0xLjk5ek0xNiAxNkg4VjRoOHYxMnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtZXRoZXJuZXQiPjxwYXRoIGQ9Ik03Ljc3IDYuNzZMNi4yMyA1LjQ4LjgyIDEybDUuNDEgNi41MiAxLjU0LTEuMjhMMy40MiAxMmw0LjM1LTUuMjR6TTcgMTNoMnYtMkg3djJ6bTEwLTJoLTJ2Mmgydi0yem0tNiAyaDJ2LTJoLTJ2MnptNi43Ny03LjUybC0xLjU0IDEuMjhMMjAuNTggMTJsLTQuMzUgNS4yNCAxLjU0IDEuMjhMMjMuMTggMTJsLTUuNDEtNi41MnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtaW5wdXQtYW50ZW5uYSI+PHBhdGggZD0iTTEyIDVjLTMuODcgMC03IDMuMTMtNyA3aDJjMC0yLjc2IDIuMjQtNSA1LTVzNSAyLjI0IDUgNWgyYzAtMy44Ny0zLjEzLTctNy03em0xIDkuMjljLjg4LS4zOSAxLjUtMS4yNiAxLjUtMi4yOSAwLTEuMzgtMS4xMi0yLjUtMi41LTIuNVM5LjUgMTAuNjIgOS41IDEyYzAgMS4wMi42MiAxLjkgMS41IDIuMjl2My4zTDcuNTkgMjEgOSAyMi40MWwzLTMgMyAzTDE2LjQxIDIxIDEzIDE3LjU5di0zLjN6TTEyIDFDNS45MyAxIDEgNS45MyAxIDEyaDJjMC00Ljk3IDQuMDMtOSA5LTlzOSA0LjAzIDkgOWgyYzAtNi4wNy00LjkzLTExLTExLTExeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1jb21wb25lbnQiPjxwYXRoIGQ9Ik01IDJjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NEgxdjZoNlY2SDVWMnptNCAxNGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThjMS4xNi0uNDEgMi0xLjUxIDItMi44MnYtMkg5djJ6bS04IDBjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4QzYuMTYgMTguNCA3IDE3LjMgNyAxNnYtMkgxdjJ6TTIxIDZWMmMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0aC0ydjZoNlY2aC0yem0tOC00YzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRIOXY2aDZWNmgtMlYyem00IDE0YzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOGMxLjE2LS40MSAyLTEuNTEgMi0yLjgydi0yaC02djJ6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWlucHV0LWNvbXBvc2l0ZSI+PHBhdGggZD0iTTUgMmMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0SDF2Nmg2VjZINVYyem00IDE0YzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOGMxLjE2LS40MSAyLTEuNTEgMi0yLjgydi0ySDl2MnptLTggMGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThDNi4xNiAxOC40IDcgMTcuMyA3IDE2di0ySDF2MnpNMjEgNlYyYzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRoLTJ2Nmg2VjZoLTJ6bS04LTRjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NEg5djZoNlY2aC0yVjJ6bTQgMTRjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4YzEuMTYtLjQxIDItMS41MSAyLTIuODJ2LTJoLTZ2MnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtaW5wdXQtaGRtaSI+PHBhdGggZD0iTTE4IDdWNGMwLTEuMS0uOS0yLTItMkg4Yy0xLjEgMC0yIC45LTIgMnYzSDV2NmwzIDZ2M2g4di0zbDMtNlY3aC0xek04IDRoOHYzaC0yVjVoLTF2MmgtMlY1aC0xdjJIOFY0eiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1zdmlkZW8iPjxwYXRoIGQ9Ik04IDExLjVjMC0uODMtLjY3LTEuNS0xLjUtMS41UzUgMTAuNjcgNSAxMS41IDUuNjcgMTMgNi41IDEzIDggMTIuMzMgOCAxMS41em03LTVjMC0uODMtLjY3LTEuNS0xLjUtMS41aC0zQzkuNjcgNSA5IDUuNjcgOSA2LjVTOS42NyA4IDEwLjUgOGgzYy44MyAwIDEuNS0uNjcgMS41LTEuNXpNOC41IDE1Yy0uODMgMC0xLjUuNjctMS41IDEuNVM3LjY3IDE4IDguNSAxOHMxLjUtLjY3IDEuNS0xLjVTOS4zMyAxNSA4LjUgMTV6TTEyIDFDNS45MyAxIDEgNS45MyAxIDEyczQuOTMgMTEgMTEgMTEgMTEtNC45MyAxMS0xMVMxOC4wNyAxIDEyIDF6bTAgMjBjLTQuOTYgMC05LTQuMDQtOS05czQuMDQtOSA5LTkgOSA0LjA0IDkgOS00LjA0IDktOSA5em01LjUtMTFjLS44MyAwLTEuNS42Ny0xLjUgMS41cy42NyAxLjUgMS41IDEuNSAxLjUtLjY3IDEuNS0xLjUtLjY3LTEuNS0xLjUtMS41em0tMiA1Yy0uODMgMC0xLjUuNjctMS41IDEuNXMuNjcgMS41IDEuNSAxLjUgMS41LS42NyAxLjUtMS41LS42Ny0xLjUtMS41LTEuNXoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3Mtb3ZlcnNjYW4iPjxwYXRoIGQ9Ik0xMi4wMSA1LjVMMTAgOGg0bC0xLjk5LTIuNXpNMTggMTB2NGwyLjUtMS45OUwxOCAxMHpNNiAxMGwtMi41IDIuMDFMNiAxNHYtNHptOCA2aC00bDIuMDEgMi41TDE0IDE2em03LTEzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOTloMTh2MTQuMDJ6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLXBob25lIj48cGF0aCBkPSJNMTMgOWgtMnYyaDJWOXptNCAwaC0ydjJoMlY5em0zIDYuNWMtMS4yNSAwLTIuNDUtLjItMy41Ny0uNTctLjM1LS4xMS0uNzQtLjAzLTEuMDIuMjRsLTIuMiAyLjJjLTIuODMtMS40NC01LjE1LTMuNzUtNi41OS02LjU4bDIuMi0yLjIxYy4yOC0uMjcuMzYtLjY2LjI1LTEuMDFDOC43IDYuNDUgOC41IDUuMjUgOC41IDRjMC0uNTUtLjQ1LTEtMS0xSDRjLS41NSAwLTEgLjQ1LTEgMSAwIDkuMzkgNy42MSAxNyAxNyAxNyAuNTUgMCAxLS40NSAxLTF2LTMuNWMwLS41NS0uNDUtMS0xLTF6TTE5IDl2MmgyVjloLTJ6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLXBvd2VyIj48cGF0aCBkPSJNNyAyNGgydi0ySDd2MnptNCAwaDJ2LTJoLTJ2MnptMi0yMmgtMnYxMGgyVjJ6bTMuNTYgMi40NGwtMS40NSAxLjQ1QzE2Ljg0IDYuOTQgMTggOC44MyAxOCAxMWMwIDMuMzEtMi42OSA2LTYgNnMtNi0yLjY5LTYtNmMwLTIuMTcgMS4xNi00LjA2IDIuODgtNS4xMkw3LjQ0IDQuNDRDNS4zNiA1Ljg4IDQgOC4yOCA0IDExYzAgNC40MiAzLjU4IDggOCA4czgtMy41OCA4LThjMC0yLjcyLTEuMzYtNS4xMi0zLjQ0LTYuNTZ6TTE1IDI0aDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtcmVtb3RlIj48cGF0aCBkPSJNMTUgOUg5Yy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoNmMuNTUgMCAxLS40NSAxLTFWMTBjMC0uNTUtLjQ1LTEtMS0xem0tMyA2Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnpNNy4wNSA2LjA1bDEuNDEgMS40MUM5LjM3IDYuNTYgMTAuNjIgNiAxMiA2czIuNjMuNTYgMy41NCAxLjQ2bDEuNDEtMS40MUMxNS42OCA0Ljc4IDEzLjkzIDQgMTIgNHMtMy42OC43OC00Ljk1IDIuMDV6TTEyIDBDOC45NiAwIDYuMjEgMS4yMyA0LjIyIDMuMjJsMS40MSAxLjQxQzcuMjYgMy4wMSA5LjUxIDIgMTIgMnM0Ljc0IDEuMDEgNi4zNiAyLjY0bDEuNDEtMS40MUMxNy43OSAxLjIzIDE1LjA0IDAgMTIgMHoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3Mtdm9pY2UiPjxwYXRoIGQ9Ik03IDI0aDJ2LTJIN3Yyem01LTExYzEuNjYgMCAyLjk5LTEuMzQgMi45OS0zTDE1IDRjMC0xLjY2LTEuMzQtMy0zLTNTOSAyLjM0IDkgNHY2YzAgMS42NiAxLjM0IDMgMyAzem0tMSAxMWgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6bTQtMTRoLTEuN2MwIDMtMi41NCA1LjEtNS4zIDUuMVM2LjcgMTMgNi43IDEwSDVjMCAzLjQxIDIuNzIgNi4yMyA2IDYuNzJWMjBoMnYtMy4yOGMzLjI4LS40OSA2LTMuMzEgNi02LjcyeiIgLz48L2c+CjxnIGlkPSJzaG9wIj48cGF0aCBkPSJNMTYgNlY0YzAtMS4xMS0uODktMi0yLTJoLTRjLTEuMTEgMC0yIC44OS0yIDJ2MkgydjEzYzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjZoLTZ6bS02LTJoNHYyaC00VjR6TTkgMThWOWw3LjUgNEw5IDE4eiIgLz48L2c+CjxnIGlkPSJzaG9wLXR3byI+PHBhdGggZD0iTTMgOUgxdjExYzAgMS4xMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uODkgMi0ySDNWOXptMTUtNFYzYzAtMS4xMS0uODktMi0yLTJoLTRjLTEuMTEgMC0yIC44OS0yIDJ2Mkg1djExYzAgMS4xMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uODkgMi0yVjVoLTV6bS02LTJoNHYyaC00VjN6bTAgMTJWOGw1LjUgMy01LjUgNHoiIC8+PC9nPgo8ZyBpZD0ic2hvcHBpbmctYmFza2V0Ij48cGF0aCBkPSJNMTcuMjEgOWwtNC4zOC02LjU2Yy0uMTktLjI4LS41MS0uNDItLjgzLS40Mi0uMzIgMC0uNjQuMTQtLjgzLjQzTDYuNzkgOUgyYy0uNTUgMC0xIC40NS0xIDEgMCAuMDkuMDEuMTguMDQuMjdsMi41NCA5LjI3Yy4yMy44NCAxIDEuNDYgMS45MiAxLjQ2aDEzYy45MiAwIDEuNjktLjYyIDEuOTMtMS40NmwyLjU0LTkuMjdMMjMgMTBjMC0uNTUtLjQ1LTEtMS0xaC00Ljc5ek05IDlsMy00LjRMMTUgOUg5em0zIDhjLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyeiIgLz48L2c+CjxnIGlkPSJzaG9wcGluZy1jYXJ0Ij48cGF0aCBkPSJNNyAxOGMtMS4xIDAtMS45OS45LTEuOTkgMlM1LjkgMjIgNyAyMnMyLS45IDItMi0uOS0yLTItMnpNMSAydjJoMmwzLjYgNy41OS0xLjM1IDIuNDVjLS4xNi4yOC0uMjUuNjEtLjI1Ljk2IDAgMS4xLjkgMiAyIDJoMTJ2LTJINy40MmMtLjE0IDAtLjI1LS4xMS0uMjUtLjI1bC4wMy0uMTIuOS0xLjYzaDcuNDVjLjc1IDAgMS40MS0uNDEgMS43NS0xLjAzbDMuNTgtNi40OWMuMDgtLjE0LjEyLS4zMS4xMi0uNDggMC0uNTUtLjQ1LTEtMS0xSDUuMjFsLS45NC0ySDF6bTE2IDE2Yy0xLjEgMC0xLjk5LjktMS45OSAycy44OSAyIDEuOTkgMiAyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ic29ydCI+PHBhdGggZD0iTTMgMThoNnYtMkgzdjJ6TTMgNnYyaDE4VjZIM3ptMCA3aDEydi0ySDN2MnoiIC8+PC9nPgo8ZyBpZD0ic3BlYWtlci1ub3RlcyI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek04IDE0SDZ2LTJoMnYyem0wLTNINlY5aDJ2MnptMC0zSDZWNmgydjJ6bTcgNmgtNXYtMmg1djJ6bTMtM2gtOFY5aDh2MnptMC0zaC04VjZoOHYyeiIgLz48L2c+CjxnIGlkPSJzcGVha2VyLW5vdGVzLW9mZiI+PHBhdGggZD0iTTEwLjU0IDExbC0uNTQtLjU0TDcuNTQgOCA2IDYuNDYgMi4zOCAyLjg0IDEuMjcgMS43MyAwIDNsMi4wMSAyLjAxTDIgMjJsNC00aDlsNS43MyA1LjczTDIyIDIyLjQ2IDE3LjU0IDE4bC03LTd6TTggMTRINnYtMmgydjJ6bS0yLTNWOWwyIDJINnptMTQtOUg0LjA4TDEwIDcuOTJWNmg4djJoLTcuOTJsMSAxSDE4djJoLTQuOTJsNi45OSA2Ljk5QzIxLjE0IDE3Ljk1IDIyIDE3LjA4IDIyIDE2VjRjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9InNwZWxsY2hlY2siPjxwYXRoIGQ9Ik0xMi40NSAxNmgyLjA5TDkuNDMgM0g3LjU3TDIuNDYgMTZoMi4wOWwxLjEyLTNoNS42NGwxLjE0IDN6bS02LjAyLTVMOC41IDUuNDggMTAuNTcgMTFINi40M3ptMTUuMTYuNTlsLTguMDkgOC4wOUw5LjgzIDE2bC0xLjQxIDEuNDEgNS4wOSA1LjA5TDIzIDEzbC0xLjQxLTEuNDF6IiAvPjwvZz4KPGcgaWQ9InN0YXIiPjxwYXRoIGQ9Ik0xMiAxNy4yN0wxOC4xOCAyMWwtMS42NC03LjAzTDIyIDkuMjRsLTcuMTktLjYxTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMXoiIC8+PC9nPgo8ZyBpZD0ic3Rhci1ib3JkZXIiPjxwYXRoIGQ9Ik0yMiA5LjI0bC03LjE5LS42MkwxMiAyIDkuMTkgOC42MyAyIDkuMjRsNS40NiA0LjczTDUuODIgMjEgMTIgMTcuMjcgMTguMTggMjFsLTEuNjMtNy4wM0wyMiA5LjI0ek0xMiAxNS40bC0zLjc2IDIuMjcgMS00LjI4LTMuMzItMi44OCA0LjM4LS4zOEwxMiA2LjFsMS43MSA0LjA0IDQuMzguMzgtMy4zMiAyLjg4IDEgNC4yOEwxMiAxNS40eiIgLz48L2c+CjxnIGlkPSJzdGFyLWhhbGYiPjxwYXRoIGQ9Ik0yMiA5LjI0bC03LjE5LS42MkwxMiAyIDkuMTkgOC42MyAyIDkuMjRsNS40NiA0LjczTDUuODIgMjEgMTIgMTcuMjcgMTguMTggMjFsLTEuNjMtNy4wM0wyMiA5LjI0ek0xMiAxNS40VjYuMWwxLjcxIDQuMDQgNC4zOC4zOC0zLjMyIDIuODggMSA0LjI4TDEyIDE1LjR6IiAvPjwvZz4KPGcgaWQ9InN0YXJzIj48cGF0aCBkPSJNMTEuOTkgMkM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnptNC4yNCAxNkwxMiAxNS40NSA3Ljc3IDE4bDEuMTItNC44MS0zLjczLTMuMjMgNC45Mi0uNDJMMTIgNWwxLjkyIDQuNTMgNC45Mi40Mi0zLjczIDMuMjNMMTYuMjMgMTh6IiAvPjwvZz4KPGcgaWQ9InN0b3JlIj48cGF0aCBkPSJNMjAgNEg0djJoMTZWNHptMSAxMHYtMmwtMS01SDRsLTEgNXYyaDF2NmgxMHYtNmg0djZoMnYtNmgxem0tOSA0SDZ2LTRoNnY0eiIgLz48L2c+CjxnIGlkPSJzdWJkaXJlY3RvcnktYXJyb3ctbGVmdCI+PHBhdGggZD0iTTExIDlsMS40MiAxLjQyTDguODMgMTRIMThWNGgydjEySDguODNsMy41OSAzLjU4TDExIDIxbC02LTYgNi02eiIgLz48L2c+CjxnIGlkPSJzdWJkaXJlY3RvcnktYXJyb3ctcmlnaHQiPjxwYXRoIGQ9Ik0xOSAxNWwtNiA2LTEuNDItMS40MkwxNS4xNyAxNkg0VjRoMnYxMGg5LjE3bC0zLjU5LTMuNThMMTMgOWw2IDZ6IiAvPjwvZz4KPGcgaWQ9InN1YmplY3QiPjxwYXRoIGQ9Ik0xNCAxN0g0djJoMTB2LTJ6bTYtOEg0djJoMTZWOXpNNCAxNWgxNnYtMkg0djJ6TTQgNXYyaDE2VjVINHoiIC8+PC9nPgo8ZyBpZD0ic3VwZXJ2aXNvci1hY2NvdW50Ij48cGF0aCBkPSJNMTYuNSAxMmMxLjM4IDAgMi40OS0xLjEyIDIuNDktMi41UzE3Ljg4IDcgMTYuNSA3QzE1LjEyIDcgMTQgOC4xMiAxNCA5LjVzMS4xMiAyLjUgMi41IDIuNXpNOSAxMWMxLjY2IDAgMi45OS0xLjM0IDIuOTktM1MxMC42NiA1IDkgNUM3LjM0IDUgNiA2LjM0IDYgOHMxLjM0IDMgMyAzem03LjUgM2MtMS44MyAwLTUuNS45Mi01LjUgMi43NVYxOWgxMXYtMi4yNWMwLTEuODMtMy42Ny0yLjc1LTUuNS0yLjc1ek05IDEzYy0yLjMzIDAtNyAxLjE3LTcgMy41VjE5aDd2LTIuMjVjMC0uODUuMzMtMi4zNCAyLjM3LTMuNDdDMTAuNSAxMy4xIDkuNjYgMTMgOSAxM3oiIC8+PC9nPgo8ZyBpZD0ic3dhcC1ob3JpeiI+PHBhdGggZD0iTTYuOTkgMTFMMyAxNWwzLjk5IDR2LTNIMTR2LTJINi45OXYtM3pNMjEgOWwtMy45OS00djNIMTB2Mmg3LjAxdjNMMjEgOXoiIC8+PC9nPgo8ZyBpZD0ic3dhcC12ZXJ0Ij48cGF0aCBkPSJNMTYgMTcuMDFWMTBoLTJ2Ny4wMWgtM0wxNSAyMWw0LTMuOTloLTN6TTkgM0w1IDYuOTloM1YxNGgyVjYuOTloM0w5IDN6IiAvPjwvZz4KPGcgaWQ9InN3YXAtdmVydGljYWwtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnpNNi41IDlMMTAgNS41IDEzLjUgOUgxMXY0SDlWOUg2LjV6bTExIDZMMTQgMTguNSAxMC41IDE1SDEzdi00aDJ2NGgyLjV6IiAvPjwvZz4KPGcgaWQ9InN5c3RlbS11cGRhdGUtYWx0Ij48cGF0aCBkPSJNMTIgMTYuNWw0LTRoLTN2LTloLTJ2OUg4bDQgNHptOS0xM2gtNnYxLjk5aDZ2MTQuMDNIM1Y1LjQ5aDZWMy41SDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJ2LTE0YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJ0YWIiPjxwYXRoIGQ9Ik0yMSAzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkgzVjVoMTB2NGg4djEweiIgLz48L2c+CjxnIGlkPSJ0YWItdW5zZWxlY3RlZCI+PHBhdGggZD0iTTEgOWgyVjdIMXYyem0wIDRoMnYtMkgxdjJ6bTAtOGgyVjNjLTEuMSAwLTIgLjktMiAyem04IDE2aDJ2LTJIOXYyem0tOC00aDJ2LTJIMXYyem0yIDR2LTJIMWMwIDEuMS45IDIgMiAyek0yMSAzaC04djZoMTBWNWMwLTEuMS0uOS0yLTItMnptMCAxNGgydi0yaC0ydjJ6TTkgNWgyVjNIOXYyek01IDIxaDJ2LTJINXYyek01IDVoMlYzSDV2MnptMTYgMTZjMS4xIDAgMi0uOSAyLTJoLTJ2MnptMC04aDJ2LTJoLTJ2MnptLTggOGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6IiAvPjwvZz4KPGcgaWQ9InRleHQtZm9ybWF0Ij48cGF0aCBkPSJNNSAxN3YyaDE0di0ySDV6bTQuNS00LjJoNWwuOSAyLjJoMi4xTDEyLjc1IDRoLTEuNUw2LjUgMTVoMi4xbC45LTIuMnpNMTIgNS45OEwxMy44NyAxMWgtMy43NEwxMiA1Ljk4eiIgLz48L2c+CjxnIGlkPSJ0aGVhdGVycyI+PHBhdGggZD0iTTE4IDN2MmgtMlYzSDh2Mkg2VjNINHYxOGgydi0yaDJ2Mmg4di0yaDJ2MmgyVjNoLTJ6TTggMTdINnYtMmgydjJ6bTAtNEg2di0yaDJ2MnptMC00SDZWN2gydjJ6bTEwIDhoLTJ2LTJoMnYyem0wLTRoLTJ2LTJoMnYyem0wLTRoLTJWN2gydjJ6IiAvPjwvZz4KPGcgaWQ9InRodW1iLWRvd24iPjxwYXRoIGQ9Ik0xNSAzSDZjLS44MyAwLTEuNTQuNS0xLjg0IDEuMjJsLTMuMDIgNy4wNWMtLjA5LjIzLS4xNC40Ny0uMTQuNzN2MS45MWwuMDEuMDFMMSAxNGMwIDEuMS45IDIgMiAyaDYuMzFsLS45NSA0LjU3LS4wMy4zMmMwIC40MS4xNy43OS40NCAxLjA2TDkuODMgMjNsNi41OS02LjU5Yy4zNi0uMzYuNTgtLjg2LjU4LTEuNDFWNWMwLTEuMS0uOS0yLTItMnptNCAwdjEyaDRWM2gtNHoiIC8+PC9nPgo8ZyBpZD0idGh1bWItdXAiPjxwYXRoIGQ9Ik0xIDIxaDRWOUgxdjEyem0yMi0xMWMwLTEuMS0uOS0yLTItMmgtNi4zMWwuOTUtNC41Ny4wMy0uMzJjMC0uNDEtLjE3LS43OS0uNDQtMS4wNkwxNC4xNyAxIDcuNTkgNy41OUM3LjIyIDcuOTUgNyA4LjQ1IDcgOXYxMGMwIDEuMS45IDIgMiAyaDljLjgzIDAgMS41NC0uNSAxLjg0LTEuMjJsMy4wMi03LjA1Yy4wOS0uMjMuMTQtLjQ3LjE0LS43M3YtMS45MWwtLjAxLS4wMUwyMyAxMHoiIC8+PC9nPgo8ZyBpZD0idGh1bWJzLXVwLWRvd24iPjxwYXRoIGQ9Ik0xMiA2YzAtLjU1LS40NS0xLTEtMUg1LjgybC42Ni0zLjE4LjAyLS4yM2MwLS4zMS0uMTMtLjU5LS4zMy0uOEw1LjM4IDAgLjQ0IDQuOTRDLjE3IDUuMjEgMCA1LjU5IDAgNnY2LjVjMCAuODMuNjcgMS41IDEuNSAxLjVoNi43NWMuNjIgMCAxLjE1LS4zOCAxLjM4LS45MWwyLjI2LTUuMjljLjA3LS4xNy4xMS0uMzYuMTEtLjU1VjZ6bTEwLjUgNGgtNi43NWMtLjYyIDAtMS4xNS4zOC0xLjM4LjkxbC0yLjI2IDUuMjljLS4wNy4xNy0uMTEuMzYtLjExLjU1VjE4YzAgLjU1LjQ1IDEgMSAxaDUuMThsLS42NiAzLjE4LS4wMi4yNGMwIC4zMS4xMy41OS4zMy44bC43OS43OCA0Ljk0LTQuOTRjLjI3LS4yNy40NC0uNjUuNDQtMS4wNnYtNi41YzAtLjgzLS42Ny0xLjUtMS41LTEuNXoiIC8+PC9nPgo8ZyBpZD0idGltZWxpbmUiPjxwYXRoIGQ9Ik0yMyA4YzAgMS4xLS45IDItMiAyLS4xOCAwLS4zNS0uMDItLjUxLS4wN2wtMy41NiAzLjU1Yy4wNS4xNi4wNy4zNC4wNy41MiAwIDEuMS0uOSAyLTIgMnMtMi0uOS0yLTJjMC0uMTguMDItLjM2LjA3LS41MmwtMi41NS0yLjU1Yy0uMTYuMDUtLjM0LjA3LS41Mi4wN3MtLjM2LS4wMi0uNTItLjA3bC00LjU1IDQuNTZjLjA1LjE2LjA3LjMzLjA3LjUxIDAgMS4xLS45IDItMiAycy0yLS45LTItMiAuOS0yIDItMmMuMTggMCAuMzUuMDIuNTEuMDdsNC41Ni00LjU1QzguMDIgOS4zNiA4IDkuMTggOCA5YzAtMS4xLjktMiAyLTJzMiAuOSAyIDJjMCAuMTgtLjAyLjM2LS4wNy41MmwyLjU1IDIuNTVjLjE2LS4wNS4zNC0uMDcuNTItLjA3cy4zNi4wMi41Mi4wN2wzLjU1LTMuNTZDMTkuMDIgOC4zNSAxOSA4LjE4IDE5IDhjMC0xLjEuOS0yIDItMnMyIC45IDIgMnoiIC8+PC9nPgo8ZyBpZD0idG9jIj48cGF0aCBkPSJNMyA5aDE0VjdIM3Yyem0wIDRoMTR2LTJIM3Yyem0wIDRoMTR2LTJIM3Yyem0xNiAwaDJ2LTJoLTJ2MnptMC0xMHYyaDJWN2gtMnptMCA2aDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0idG9kYXkiPjxwYXRoIGQ9Ik0xOSAzaC0xVjFoLTJ2Mkg4VjFINnYySDVjLTEuMTEgMC0xLjk5LjktMS45OSAyTDMgMTljMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkg1VjhoMTR2MTF6TTcgMTBoNXY1SDd6IiAvPjwvZz4KPGcgaWQ9InRvbGwiPjxwYXRoIGQ9Ik0xNSA0Yy00LjQyIDAtOCAzLjU4LTggOHMzLjU4IDggOCA4IDgtMy41OCA4LTgtMy41OC04LTgtOHptMCAxNGMtMy4zMSAwLTYtMi42OS02LTZzMi42OS02IDYtNiA2IDIuNjkgNiA2LTIuNjkgNi02IDZ6TTMgMTJjMC0yLjYxIDEuNjctNC44MyA0LTUuNjVWNC4yNkMzLjU1IDUuMTUgMSA4LjI3IDEgMTJzMi41NSA2Ljg1IDYgNy43NHYtMi4wOWMtMi4zMy0uODItNC0zLjA0LTQtNS42NXoiIC8+PC9nPgo8ZyBpZD0idG91Y2gtYXBwIj48cGF0aCBkPSJNOSAxMS4yNFY3LjVDOSA2LjEyIDEwLjEyIDUgMTEuNSA1UzE0IDYuMTIgMTQgNy41djMuNzRjMS4yMS0uODEgMi0yLjE4IDItMy43NEMxNiA1LjAxIDEzLjk5IDMgMTEuNSAzUzcgNS4wMSA3IDcuNWMwIDEuNTYuNzkgMi45MyAyIDMuNzR6bTkuODQgNC42M2wtNC41NC0yLjI2Yy0uMTctLjA3LS4zNS0uMTEtLjU0LS4xMUgxM3YtNmMwLS44My0uNjctMS41LTEuNS0xLjVTMTAgNi42NyAxMCA3LjV2MTAuNzRsLTMuNDMtLjcyYy0uMDgtLjAxLS4xNS0uMDMtLjI0LS4wMy0uMzEgMC0uNTkuMTMtLjc5LjMzbC0uNzkuOCA0Ljk0IDQuOTRjLjI3LjI3LjY1LjQ0IDEuMDYuNDRoNi43OWMuNzUgMCAxLjMzLS41NSAxLjQ0LTEuMjhsLjc1LTUuMjdjLjAxLS4wNy4wMi0uMTQuMDItLjIgMC0uNjItLjM4LTEuMTYtLjkxLTEuMzh6IiAvPjwvZz4KPGcgaWQ9InRyYWNrLWNoYW5nZXMiPjxwYXRoIGQ9Ik0xOS4wNyA0LjkzbC0xLjQxIDEuNDFDMTkuMSA3Ljc5IDIwIDkuNzkgMjAgMTJjMCA0LjQyLTMuNTggOC04IDhzLTgtMy41OC04LThjMC00LjA4IDMuMDUtNy40NCA3LTcuOTN2Mi4wMkM4LjE2IDYuNTcgNiA5LjAzIDYgMTJjMCAzLjMxIDIuNjkgNiA2IDZzNi0yLjY5IDYtNmMwLTEuNjYtLjY3LTMuMTYtMS43Ni00LjI0bC0xLjQxIDEuNDFDMTUuNTUgOS45IDE2IDEwLjkgMTYgMTJjMCAyLjIxLTEuNzkgNC00IDRzLTQtMS43OS00LTRjMC0xLjg2IDEuMjgtMy40MSAzLTMuODZ2Mi4xNGMtLjYuMzUtMSAuOTgtMSAxLjcyIDAgMS4xLjkgMiAyIDJzMi0uOSAyLTJjMC0uNzQtLjQtMS4zOC0xLTEuNzJWMmgtMUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwYzAtMi43Ni0xLjEyLTUuMjYtMi45My03LjA3eiIgLz48L2c+CjxnIGlkPSJ0cmFuc2xhdGUiPjxwYXRoIGQ9Ik0xMi44NyAxNS4wN2wtMi41NC0yLjUxLjAzLS4wM2MxLjc0LTEuOTQgMi45OC00LjE3IDMuNzEtNi41M0gxN1Y0aC03VjJIOHYySDF2MS45OWgxMS4xN0MxMS41IDcuOTIgMTAuNDQgOS43NSA5IDExLjM1IDguMDcgMTAuMzIgNy4zIDkuMTkgNi42OSA4aC0yYy43MyAxLjYzIDEuNzMgMy4xNyAyLjk4IDQuNTZsLTUuMDkgNS4wMkw0IDE5bDUtNSAzLjExIDMuMTEuNzYtMi4wNHpNMTguNSAxMGgtMkwxMiAyMmgybDEuMTItM2g0Ljc1TDIxIDIyaDJsLTQuNS0xMnptLTIuNjIgN2wxLjYyLTQuMzNMMTkuMTIgMTdoLTMuMjR6IiAvPjwvZz4KPGcgaWQ9InRyZW5kaW5nLWRvd24iPjxwYXRoIGQ9Ik0xNiAxOGwyLjI5LTIuMjktNC44OC00Ljg4LTQgNEwyIDcuNDEgMy40MSA2bDYgNiA0LTQgNi4zIDYuMjlMMjIgMTJ2NnoiIC8+PC9nPgo8ZyBpZD0idHJlbmRpbmctZmxhdCI+PHBhdGggZD0iTTIyIDEybC00LTR2M0gzdjJoMTV2M3oiIC8+PC9nPgo8ZyBpZD0idHJlbmRpbmctdXAiPjxwYXRoIGQ9Ik0xNiA2bDIuMjkgMi4yOS00Ljg4IDQuODgtNC00TDIgMTYuNTkgMy40MSAxOGw2LTYgNCA0IDYuMy02LjI5TDIyIDEyVjZ6IiAvPjwvZz4KPGcgaWQ9InR1cm5lZC1pbiI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0idHVybmVkLWluLW5vdCI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnptMCAxNWwtNS0yLjE4TDcgMThWNWgxMHYxM3oiIC8+PC9nPgo8ZyBpZD0idW5hcmNoaXZlIj48cGF0aCBkPSJNMjAuNTUgNS4yMmwtMS4zOS0xLjY4QzE4Ljg4IDMuMjEgMTguNDcgMyAxOCAzSDZjLS40NyAwLS44OC4yMS0xLjE1LjU1TDMuNDYgNS4yMkMzLjE3IDUuNTcgMyA2LjAxIDMgNi41VjE5YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjYuNWMwLS40OS0uMTctLjkzLS40NS0xLjI4ek0xMiA5LjVsNS41IDUuNUgxNHYyaC00di0ySDYuNUwxMiA5LjV6TTUuMTIgNWwuODItMWgxMmwuOTMgMUg1LjEyeiIgLz48L2c+CjxnIGlkPSJ1bmRvIj48cGF0aCBkPSJNMTIuNSA4Yy0yLjY1IDAtNS4wNS45OS02LjkgMi42TDIgN3Y5aDlsLTMuNjItMy42MmMxLjM5LTEuMTYgMy4xNi0xLjg4IDUuMTItMS44OCAzLjU0IDAgNi41NSAyLjMxIDcuNiA1LjVsMi4zNy0uNzhDMjEuMDggMTEuMDMgMTcuMTUgOCAxMi41IDh6IiAvPjwvZz4KPGcgaWQ9InVuZm9sZC1sZXNzIj48cGF0aCBkPSJNNy40MSAxOC41OUw4LjgzIDIwIDEyIDE2LjgzIDE1LjE3IDIwbDEuNDEtMS40MUwxMiAxNGwtNC41OSA0LjU5em05LjE4LTEzLjE4TDE1LjE3IDQgMTIgNy4xNyA4LjgzIDQgNy40MSA1LjQxIDEyIDEwbDQuNTktNC41OXoiIC8+PC9nPgo8ZyBpZD0idW5mb2xkLW1vcmUiPjxwYXRoIGQ9Ik0xMiA1LjgzTDE1LjE3IDlsMS40MS0xLjQxTDEyIDMgNy40MSA3LjU5IDguODMgOSAxMiA1Ljgzem0wIDEyLjM0TDguODMgMTVsLTEuNDEgMS40MUwxMiAyMWw0LjU5LTQuNTlMMTUuMTcgMTUgMTIgMTguMTd6IiAvPjwvZz4KPGcgaWQ9InVwZGF0ZSI+PHBhdGggZD0iTTIxIDEwLjEyaC02Ljc4bDIuNzQtMi44MmMtMi43My0yLjctNy4xNS0yLjgtOS44OC0uMS0yLjczIDIuNzEtMi43MyA3LjA4IDAgOS43OSAyLjczIDIuNzEgNy4xNSAyLjcxIDkuODggMEMxOC4zMiAxNS42NSAxOSAxNC4wOCAxOSAxMi4xaDJjMCAxLjk4LS44OCA0LjU1LTIuNjQgNi4yOS0zLjUxIDMuNDgtOS4yMSAzLjQ4LTEyLjcyIDAtMy41LTMuNDctMy41My05LjExLS4wMi0xMi41OCAzLjUxLTMuNDcgOS4xNC0zLjQ3IDEyLjY1IDBMMjEgM3Y3LjEyek0xMi41IDh2NC4yNWwzLjUgMi4wOC0uNzIgMS4yMUwxMSAxM1Y4aDEuNXoiIC8+PC9nPgo8ZyBpZD0idmVyaWZpZWQtdXNlciI+PHBhdGggZD0iTTEyIDFMMyA1djZjMCA1LjU1IDMuODQgMTAuNzQgOSAxMiA1LjE2LTEuMjYgOS02LjQ1IDktMTJWNWwtOS00em0tMiAxNmwtNC00IDEuNDEtMS40MUwxMCAxNC4xN2w2LjU5LTYuNTlMMTggOWwtOCA4eiIgLz48L2c+CjxnIGlkPSJ2aWV3LWFnZW5kYSI+PHBhdGggZD0iTTIwIDEzSDNjLS41NSAwLTEgLjQ1LTEgMXY2YzAgLjU1LjQ1IDEgMSAxaDE3Yy41NSAwIDEtLjQ1IDEtMXYtNmMwLS41NS0uNDUtMS0xLTF6bTAtMTBIM2MtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTdjLjU1IDAgMS0uNDUgMS0xVjRjMC0uNTUtLjQ1LTEtMS0xeiIgLz48L2c+CjxnIGlkPSJ2aWV3LWFycmF5Ij48cGF0aCBkPSJNNCAxOGgzVjVINHYxM3pNMTggNXYxM2gzVjVoLTN6TTggMThoOVY1SDh2MTN6IiAvPjwvZz4KPGcgaWQ9InZpZXctY2Fyb3VzZWwiPjxwYXRoIGQ9Ik03IDE5aDEwVjRIN3YxNXptLTUtMmg0VjZIMnYxMXpNMTggNnYxMWg0VjZoLTR6IiAvPjwvZz4KPGcgaWQ9InZpZXctY29sdW1uIj48cGF0aCBkPSJNMTAgMThoNVY1aC01djEzem0tNiAwaDVWNUg0djEzek0xNiA1djEzaDVWNWgtNXoiIC8+PC9nPgo8ZyBpZD0idmlldy1kYXkiPjxwYXRoIGQ9Ik0yIDIxaDE5di0zSDJ2M3pNMjAgOEgzYy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxN2MuNTUgMCAxLS40NSAxLTFWOWMwLS41NS0uNDUtMS0xLTF6TTIgM3YzaDE5VjNIMnoiIC8+PC9nPgo8ZyBpZD0idmlldy1oZWFkbGluZSI+PHBhdGggZD0iTTQgMTVoMTZ2LTJINHYyem0wIDRoMTZ2LTJINHYyem0wLThoMTZWOUg0djJ6bTAtNnYyaDE2VjVINHoiIC8+PC9nPgo8ZyBpZD0idmlldy1saXN0Ij48cGF0aCBkPSJNNCAxNGg0di00SDR2NHptMCA1aDR2LTRINHY0ek00IDloNFY1SDR2NHptNSA1aDEydi00SDl2NHptMCA1aDEydi00SDl2NHpNOSA1djRoMTJWNUg5eiIgLz48L2c+CjxnIGlkPSJ2aWV3LW1vZHVsZSI+PHBhdGggZD0iTTQgMTFoNVY1SDR2NnptMCA3aDV2LTZINHY2em02IDBoNXYtNmgtNXY2em02IDBoNXYtNmgtNXY2em0tNi03aDVWNWgtNXY2em02LTZ2Nmg1VjVoLTV6IiAvPjwvZz4KPGcgaWQ9InZpZXctcXVpbHQiPjxwYXRoIGQ9Ik0xMCAxOGg1di02aC01djZ6bS02IDBoNVY1SDR2MTN6bTEyIDBoNXYtNmgtNXY2ek0xMCA1djZoMTFWNUgxMHoiIC8+PC9nPgo8ZyBpZD0idmlldy1zdHJlYW0iPjxwYXRoIGQ9Ik00IDE4aDE3di02SDR2NnpNNCA1djZoMTdWNUg0eiIgLz48L2c+CjxnIGlkPSJ2aWV3LXdlZWsiPjxwYXRoIGQ9Ik02IDVIM2MtLjU1IDAtMSAuNDUtMSAxdjEyYzAgLjU1LjQ1IDEgMSAxaDNjLjU1IDAgMS0uNDUgMS0xVjZjMC0uNTUtLjQ1LTEtMS0xem0xNCAwaC0zYy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoM2MuNTUgMCAxLS40NSAxLTFWNmMwLS41NS0uNDUtMS0xLTF6bS03IDBoLTNjLS41NSAwLTEgLjQ1LTEgMXYxMmMwIC41NS40NSAxIDEgMWgzYy41NSAwIDEtLjQ1IDEtMVY2YzAtLjU1LS40NS0xLTEtMXoiIC8+PC9nPgo8ZyBpZD0idmlzaWJpbGl0eSI+PHBhdGggZD0iTTEyIDQuNUM3IDQuNSAyLjczIDcuNjEgMSAxMmMxLjczIDQuMzkgNiA3LjUgMTEgNy41czkuMjctMy4xMSAxMS03LjVjLTEuNzMtNC4zOS02LTcuNS0xMS03LjV6TTEyIDE3Yy0yLjc2IDAtNS0yLjI0LTUtNXMyLjI0LTUgNS01IDUgMi4yNCA1IDUtMi4yNCA1LTUgNXptMC04Yy0xLjY2IDAtMyAxLjM0LTMgM3MxLjM0IDMgMyAzIDMtMS4zNCAzLTMtMS4zNC0zLTMtM3oiIC8+PC9nPgo8ZyBpZD0idmlzaWJpbGl0eS1vZmYiPjxwYXRoIGQ9Ik0xMiA3YzIuNzYgMCA1IDIuMjQgNSA1IDAgLjY1LS4xMyAxLjI2LS4zNiAxLjgzbDIuOTIgMi45MmMxLjUxLTEuMjYgMi43LTIuODkgMy40My00Ljc1LTEuNzMtNC4zOS02LTcuNS0xMS03LjUtMS40IDAtMi43NC4yNS0zLjk4LjdsMi4xNiAyLjE2QzEwLjc0IDcuMTMgMTEuMzUgNyAxMiA3ek0yIDQuMjdsMi4yOCAyLjI4LjQ2LjQ2QzMuMDggOC4zIDEuNzggMTAuMDIgMSAxMmMxLjczIDQuMzkgNiA3LjUgMTEgNy41IDEuNTUgMCAzLjAzLS4zIDQuMzgtLjg0bC40Mi40MkwxOS43MyAyMiAyMSAyMC43MyAzLjI3IDMgMiA0LjI3ek03LjUzIDkuOGwxLjU1IDEuNTVjLS4wNS4yMS0uMDguNDMtLjA4LjY1IDAgMS42NiAxLjM0IDMgMyAzIC4yMiAwIC40NC0uMDMuNjUtLjA4bDEuNTUgMS41NWMtLjY3LjMzLTEuNDEuNTMtMi4yLjUzLTIuNzYgMC01LTIuMjQtNS01IDAtLjc5LjItMS41My41My0yLjJ6bTQuMzEtLjc4bDMuMTUgMy4xNS4wMi0uMTZjMC0xLjY2LTEuMzQtMy0zLTNsLS4xNy4wMXoiIC8+PC9nPgo8ZyBpZD0id2FybmluZyI+PHBhdGggZD0iTTEgMjFoMjJMMTIgMiAxIDIxem0xMi0zaC0ydi0yaDJ2MnptMC00aC0ydi00aDJ2NHoiIC8+PC9nPgo8ZyBpZD0id2F0Y2gtbGF0ZXIiPjxwYXRoIGQ9Ik0xMiAyQzYuNSAyIDIgNi41IDIgMTJzNC41IDEwIDEwIDEwIDEwLTQuNSAxMC0xMFMxNy41IDIgMTIgMnptNC4yIDE0LjJMMTEgMTNWN2gxLjV2NS4ybDQuNSAyLjctLjggMS4zeiIgLz48L2c+CjxnIGlkPSJ3ZWVrZW5kIj48cGF0aCBkPSJNMjEgMTBjLTEuMSAwLTIgLjktMiAydjNINXYtM2MwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDJ2NWMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0ydi01YzAtMS4xLS45LTItMi0yem0tMy01SDZjLTEuMSAwLTIgLjktMiAydjIuMTVjMS4xNi40MSAyIDEuNTEgMiAyLjgyVjE0aDEydi0yLjAzYzAtMS4zLjg0LTIuNCAyLTIuODJWN2MwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0id29yayI+PHBhdGggZD0iTTIwIDZoLTRWNGMwLTEuMTEtLjg5LTItMi0yaC00Yy0xLjExIDAtMiAuODktMiAydjJINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMTljMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWOGMwLTEuMTEtLjg5LTItMi0yem0tNiAwaC00VjRoNHYyeiIgLz48L2c+CjxnIGlkPSJ5b3V0dWJlLXNlYXJjaGVkLWZvciI+PHBhdGggZD0iTTE3LjAxIDE0aC0uOGwtLjI3LS4yN2MuOTgtMS4xNCAxLjU3LTIuNjEgMS41Ny00LjIzIDAtMy41OS0yLjkxLTYuNS02LjUtNi41cy02LjUgMy02LjUgNi41SDJsMy44NCA0IDQuMTYtNEg2LjUxQzYuNTEgNyA4LjUzIDUgMTEuMDEgNXM0LjUgMi4wMSA0LjUgNC41YzAgMi40OC0yLjAyIDQuNS00LjUgNC41LS42NSAwLTEuMjYtLjE0LTEuODItLjM4TDcuNzEgMTUuMWMuOTcuNTcgMi4wOS45IDMuMy45IDEuNjEgMCAzLjA4LS41OSA0LjIyLTEuNTdsLjI3LjI3di43OWw1LjAxIDQuOTlMMjIgMTlsLTQuOTktNXoiIC8+PC9nPgo8ZyBpZD0iem9vbS1pbiI+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6bTIuNS00aC0ydjJIOXYtMkg3VjloMlY3aDF2MmgydjF6IiAvPjwvZz4KPGcgaWQ9Inpvb20tb3V0Ij48cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHpNNyA5aDV2MUg3eiIgLz48L2c+CjwvZGVmcz48L3N2Zz4KPC9pcm9uLWljb25zZXQtc3ZnPgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItaWNvbi1idXR0b24iPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB6LWluZGV4OiAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwoKICAgICAgICB3aWR0aDogNDBweDsKICAgICAgICBoZWlnaHQ6IDQwcHg7CgogICAgICAgIC8qIE5PVEU6IEJvdGggdmFsdWVzIGFyZSBuZWVkZWQsIHNpbmNlIHNvbWUgcGhvbmVzIHJlcXVpcmUgdGhlIHZhbHVlIHRvIGJlIGB0cmFuc3BhcmVudGAuICovCiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CgogICAgICAgIC8qIEJlY2F1c2Ugb2YgcG9seW1lci8yNTU4LCB0aGlzIHN0eWxlIGhhcyBsb3dlciBzcGVjaWZpY2l0eSB0aGFuICogKi8KICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94ICFpbXBvcnRhbnQ7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWljb24tYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdCAjaW5rIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaWNvbi1idXR0b24taW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjY7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaWNvbi1idXR0b24tZGlzYWJsZWQtdGV4dCwgdmFyKC0tZGlzYWJsZWQtdGV4dC1jb2xvcikpOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIGN1cnNvcjogYXV0bzsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaWNvbi1idXR0b24tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICA6aG9zdCg6aG92ZXIpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pY29uLWJ1dHRvbi1ob3ZlcjsKICAgICAgfQoKICAgICAgaXJvbi1pY29uIHsKICAgICAgICAtLWlyb24taWNvbi13aWR0aDogMTAwJTsKICAgICAgICAtLWlyb24taWNvbi1oZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGlyb24taWNvbiBpZD0iaWNvbiIgc3JjPSJbW3NyY11dIiBpY29uPSJbW2ljb25dXSIgYWx0JD0iW1thbHRdXSI+PC9pcm9uLWljb24+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icnVuLWNvbG9yLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIFtjb2xvci1jbGFzcz0nbGlnaHQtYmx1ZSddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1saWdodC1ibHVlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtOTAwKTsKICAgICAgfQogICAgICBbY29sb3ItY2xhc3M9J3JlZCddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXJlZC01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXJlZC01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1yZWQtOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXJlZC05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0nZ3JlZW4nXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1ncmVlbi01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWdyZWVuLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWdyZWVuLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1ncmVlbi05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0ncHVycGxlJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXB1cnBsZS05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSd0ZWFsJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXRlYWwtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0ncGluayddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXBpbmstNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1waW5rLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXBpbmstOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXBpbmstOTAwKTsKICAgICAgfQogICAgICBbY29sb3ItY2xhc3M9J29yYW5nZSddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1vcmFuZ2UtOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0nYnJvd24nXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1icm93bi01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWJyb3duLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWJyb3duLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1icm93bi05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0naW5kaWdvJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWluZGlnby05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTkwMCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLW11bHRpLWNoZWNrYm94Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0ic2Nyb2xsYmFyLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InJ1bi1jb2xvci1zdHlsZSI+PC9zdHlsZT4KCiAgICA8cGFwZXItaW5wdXQgaWQ9Im5hbWVzLXJlZ2V4IiBuby1sYWJlbC1mbG9hdCBsYWJlbD0iV3JpdGUgYSByZWdleCB0byBmaWx0ZXIgcnVucyIgdmFsdWU9IltbcmVnZXhdXSIgb24tYmluZC12YWx1ZS1jaGFuZ2VkPSJfZGVib3VuY2VkUmVnZXhDaGFuZ2UiPjwvcGFwZXItaW5wdXQ+CiAgICA8ZGl2IGlkPSJvdXRlci1jb250YWluZXIiIGNsYXNzPSJzY3JvbGxiYXIiPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW25hbWVzTWF0Y2hpbmdSZWdleF1dIiBvbi1kb20tY2hhbmdlPSJzeW5jaHJvbml6ZUNvbG9ycyI+CiAgICAgICAgPGRpdiBjbGFzcz0ibmFtZS1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iaWNvbi1jb250YWluZXIgY2hlY2tib3gtY29udGFpbmVyIHZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciI+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjbGFzcz0iY2hlY2tib3ggdmVydGljYWwtYWxpZ24tY2VudGVyIiBpZCQ9ImNoZWNrYm94LVtbaXRlbV1dIiBuYW1lPSJbW2l0ZW1dXSIgY2hlY2tlZCQ9IltbX2lzQ2hlY2tlZChpdGVtLCBzZWxlY3Rpb25TdGF0ZS4qKV1dIiBvbi1jaGFuZ2U9Il9jaGVja2JveENoYW5nZSI+PC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaWNvbi1jb250YWluZXIgaXNvbGF0b3ItY29udGFpbmVyIHZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciI+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJyYWRpby1idXR0b24tdW5jaGVja2VkIiBjbGFzcz0iaXNvbGF0b3IgdmVydGljYWwtYWxpZ24tY2VudGVyIiBvbi10YXA9Il9pc29sYXRlTmFtZSIgbmFtZT0iW1tpdGVtXV0iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9Iml0ZW0tbGFiZWwtY29udGFpbmVyIj4KICAgICAgICAgICAgPHNwYW4+W1tpdGVtXV08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICB9CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgI291dGVyLWNvbnRhaW5lciB7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgfQogICAgICAubmFtZS1yb3cgewogICAgICAgIHBhZGRpbmctdG9wOiA1cHg7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDVweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgLyogbWFrZXMgd3JhcHBpbmcgb2YgaHlwZXJwYXJhbSBzdHJpbmdzIGJldHRlciAqLwogICAgICB9CiAgICAgIC5pY29uLWNvbnRhaW5lciB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHBhZGRpbmctbGVmdDogMnB4OwogICAgICB9CiAgICAgIC5jaGVja2JveCB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAycHg7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICB9CiAgICAgIC5pc29sYXRvciB7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICAgIHBhZGRpbmc6IDBweDsKICAgICAgfQogICAgICAuaXNvbGF0b3ItY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDZweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgIH0KICAgICAgLmNoZWNrYm94LWNvbnRhaW5lciB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAycHg7CiAgICAgIH0KICAgICAgLml0ZW0tbGFiZWwtY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDVweDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgd2lkdGg6IDBweDsgLyogaGFjayB0byBnZXQgdGhlIGZsZXgtZ3JvdyB0byB3b3JrIHByb3Blcmx5ICovCiAgICAgIH0KICAgICAgLnRvb2x0aXAtdmFsdWUtY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgfQogICAgICAudmVydGljYWwtYWxpZ24tY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CiAgICAgIC52ZXJ0aWNhbC1hbGlnbi1jb250YWluZXIgLnZlcnRpY2FsLWFsaWduLWNlbnRlciB7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICB9CiAgICAgIC52ZXJ0aWNhbC1hbGlnbi1jb250YWluZXIgLnZlcnRpY2FsLWFsaWduLXRvcCB7CiAgICAgICAgYWxpZ24tc2VsZjogc3RhcnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXdici1zdHJpbmciPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfcGFydHNdXSIgYXM9InBhcnQiPltbcGFydF1dPHdicj48L3RlbXBsYXRlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXJ1bnMtc2VsZWN0b3IiPgogIDx0ZW1wbGF0ZT4KICAgIDxwYXBlci1kaWFsb2cgd2l0aC1iYWNrZHJvcCBpZD0iZGF0YS1sb2NhdGlvbi1kaWFsb2ciPgogICAgICA8aDI+RGF0YSBMb2NhdGlvbjwvaDI+CiAgICAgIDx0Zi13YnItc3RyaW5nIHZhbHVlPSJbW2RhdGFMb2NhdGlvbl1dIiAvPgogICAgPC9wYXBlci1kaWFsb2c+CiAgICA8ZGl2IGlkPSJ0b3AtdGV4dCI+CiAgICAgIDxoMyBpZD0idG9vbHRpcC1oZWxwIiBjbGFzcz0idG9vbHRpcC1jb250YWluZXIiPlJ1bnM8L2gzPgogICAgPC9kaXY+CiAgICA8dGYtbXVsdGktY2hlY2tib3ggaWQ9Im11bHRpQ2hlY2tib3giIG5hbWVzPSJbW3J1bnNdXSIgc2VsZWN0aW9uLXN0YXRlPSJ7e3J1blNlbGVjdGlvblN0YXRlfX0iIG91dC1zZWxlY3RlZD0ie3tzZWxlY3RlZFJ1bnN9fSIgcmVnZXg9Int7cmVnZXhJbnB1dH19IiBjb2xvcmluZz0iW1tjb2xvcmluZ11dIj48L3RmLW11bHRpLWNoZWNrYm94PgogICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIGlkPSJ0b2dnbGUtYWxsIiBvbi10YXA9Il90b2dnbGVBbGwiPgogICAgICBUb2dnbGUgQWxsIFJ1bnMKICAgIDwvcGFwZXItYnV0dG9uPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2RhdGFMb2NhdGlvbl1dIj4KICAgICAgPGRpdiBpZD0iZGF0YS1sb2NhdGlvbiI+CiAgICAgICAgPHRmLXdici1zdHJpbmcgdmFsdWU9IltbX2NsaXBwZWREYXRhTG9jYXRpb25dXSIgLz48dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nob3VsZFNob3dFeHBhbmREYXRhTG9jYXRpb25CdXR0b24oZGF0YUxvY2F0aW9uLCBfZGF0YUxvY2F0aW9uQ2xpcExlbmd0aCldXSI+PGEgaHJlZj0iIiBvbi1jbGljaz0iX29wZW5EYXRhTG9jYXRpb25EaWFsb2ciPuKApjwvYT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTBweDsKICAgICAgfQogICAgICAjdG9wLXRleHQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxNnB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktODAwKTsKICAgICAgfQogICAgICB0Zi1tdWx0aS1jaGVja2JveCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAueC1idXR0b24gewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtaGVscCB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktODAwKTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICB9CiAgICAgIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgIH0KICAgICAgI2RhdGEtbG9jYXRpb24gewogICAgICAgIGNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIG1hcmdpbjogNXB4IDAgMCAwOwogICAgICAgIG1heC13aWR0aDogMjg4cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1zcGlubmVyLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAvKgogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgIC8qIFNUWUxFUyBGT1IgVEhFIFNQSU5ORVIgKi8KICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgICAgLyoKICAgICAgICogQ29uc3RhbnRzOgogICAgICAgKiAgICAgIEFSQ1NJWkUgICAgID0gMjcwIGRlZ3JlZXMgKGFtb3VudCBvZiBjaXJjbGUgdGhlIGFyYyB0YWtlcyB1cCkKICAgICAgICogICAgICBBUkNUSU1FICAgICA9IDEzMzNtcyAodGltZSBpdCB0YWtlcyB0byBleHBhbmQgYW5kIGNvbnRyYWN0IGFyYykKICAgICAgICogICAgICBBUkNTVEFSVFJPVCA9IDIxNiBkZWdyZWVzIChob3cgbXVjaCB0aGUgc3RhcnQgbG9jYXRpb24gb2YgdGhlIGFyYwogICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIHJvdGF0ZSBlYWNoIHRpbWUsIDIxNiBnaXZlcyB1cyBhCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1IHBvaW50ZWQgc3RhciBzaGFwZSAoaXQncyAzNjAvNSAqIDMpLgogICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGEgNyBwb2ludGVkIHN0YXIsIHdlIG1pZ2h0IGRvCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNjAvNyAqIDMgPSAxNTQuMjg2KQogICAgICAgKiAgICAgIFNIUklOS19USU1FID0gNDAwbXMKICAgICAgICovCgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMjhweDsKICAgICAgICBoZWlnaHQ6IDI4cHg7CgogICAgICAgIC8qIDM2MCAqIEFSQ1RJTUUgLyAoQVJDU1RBUlRST1QgKyAoMzYwLUFSQ1NJWkUpKSAqLwogICAgICAgIC0tcGFwZXItc3Bpbm5lci1jb250YWluZXItcm90YXRpb24tZHVyYXRpb246IDE1NjhtczsKCiAgICAgICAgLyogQVJDVElNRSAqLwogICAgICAgIC0tcGFwZXItc3Bpbm5lci1leHBhbmQtY29udHJhY3QtZHVyYXRpb246IDEzMzNtczsKCiAgICAgICAgLyogNCAqIEFSQ1RJTUUgKi8KICAgICAgICAtLXBhcGVyLXNwaW5uZXItZnVsbC1jeWNsZS1kdXJhdGlvbjogNTMzMm1zOwoKICAgICAgICAvKiBTSFJJTktfVElNRSAqLwogICAgICAgIC0tcGFwZXItc3Bpbm5lci1jb29sZG93bi1kdXJhdGlvbjogNDAwbXM7CiAgICAgIH0KCiAgICAgICNzcGlubmVyQ29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CgogICAgICAgIC8qIFRoZSBzcGlubmVyIGRvZXMgbm90IGhhdmUgYW55IGNvbnRlbnRzIHRoYXQgd291bGQgaGF2ZSB0byBiZQogICAgICAgICAqIGZsaXBwZWQgaWYgdGhlIGRpcmVjdGlvbiBjaGFuZ2VzLiBBbHdheXMgdXNlIGx0ciBzbyB0aGF0IHRoZQogICAgICAgICAqIHN0eWxlIHdvcmtzIG91dCBjb3JyZWN0bHkgaW4gYm90aCBjYXNlcy4gKi8KICAgICAgICBkaXJlY3Rpb246IGx0cjsKICAgICAgfQoKICAgICAgI3NwaW5uZXJDb250YWluZXIuYWN0aXZlIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogY29udGFpbmVyLXJvdGF0ZSB2YXIoLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbikgbGluZWFyIGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbjogY29udGFpbmVyLXJvdGF0ZSB2YXIoLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbikgbGluZWFyIGluZmluaXRlOwogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgY29udGFpbmVyLXJvdGF0ZSB7CiAgICAgICAgdG8geyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZykgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGNvbnRhaW5lci1yb3RhdGUgewogICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKSB9CiAgICAgIH0KCiAgICAgIC5zcGlubmVyLWxheWVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNTAwKSk7CiAgICAgIH0KCiAgICAgIC5sYXllci0xIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1sYXllci0xLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS01MDApKTsKICAgICAgfQoKICAgICAgLmxheWVyLTIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWxheWVyLTItY29sb3IsIHZhcigtLWdvb2dsZS1yZWQtNTAwKSk7CiAgICAgIH0KCiAgICAgIC5sYXllci0zIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1sYXllci0zLWNvbG9yLCB2YXIoLS1nb29nbGUteWVsbG93LTUwMCkpOwogICAgICB9CgogICAgICAubGF5ZXItNCB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNwaW5uZXItbGF5ZXItNC1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZWVuLTUwMCkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogSU1QT1JUQU5UIE5PVEUgQUJPVVQgQ1NTIEFOSU1BVElPTiBQUk9QRVJUSUVTIChrZWFudWxlZSk6CiAgICAgICAqCiAgICAgICAqIGlPUyBTYWZhcmkgKHRlc3RlZCBvbiBpT1MgOC4xKSBkb2VzIG5vdCBoYW5kbGUgYW5pbWF0aW9uLWRlbGF5IHZlcnkgd2VsbCAtIGl0IGRvZXNuJ3QKICAgICAgICogZ3VhcmFudGVlIHRoYXQgdGhlIGFuaW1hdGlvbiB3aWxsIHN0YXJ0IF9leGFjdGx5XyBhZnRlciB0aGF0IHZhbHVlLiBTbyB3ZSBhdm9pZCB1c2luZwogICAgICAgKiBhbmltYXRpb24tZGVsYXkgYW5kIGluc3RlYWQgc2V0IGN1c3RvbSBrZXlmcmFtZXMgZm9yIGVhY2ggY29sb3IgKGFzIGxheWVyLTJ1bmRhbnQgYXMgaXQKICAgICAgICogc2VlbXMpLgogICAgICAgKi8KICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllciB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci1zcGlubmVyLWZ1bGwtY3ljbGUtZHVyYXRpb24pOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZTsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZnVsbC1jeWNsZS1kdXJhdGlvbik7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpOwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5hY3RpdmUgLnNwaW5uZXItbGF5ZXIubGF5ZXItMSB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlLCBsYXllci0xLWZhZGUtaW4tb3V0OwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTEtZmFkZS1pbi1vdXQ7CiAgICAgIH0KCiAgICAgIC5hY3RpdmUgLnNwaW5uZXItbGF5ZXIubGF5ZXItMiB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlLCBsYXllci0yLWZhZGUtaW4tb3V0OwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTItZmFkZS1pbi1vdXQ7CiAgICAgIH0KCiAgICAgIC5hY3RpdmUgLnNwaW5uZXItbGF5ZXIubGF5ZXItMyB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlLCBsYXllci0zLWZhZGUtaW4tb3V0OwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTMtZmFkZS1pbi1vdXQ7CiAgICAgIH0KCiAgICAgIC5hY3RpdmUgLnNwaW5uZXItbGF5ZXIubGF5ZXItNCB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlLCBsYXllci00LWZhZGUtaW4tb3V0OwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTQtZmFkZS1pbi1vdXQ7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBmaWxsLXVuZmlsbC1yb3RhdGUgewogICAgICAgIDEyLjUlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpIH0gLyogMC41ICogQVJDU0laRSAqLwogICAgICAgIDI1JSAgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpIH0gLyogMSAgICogQVJDU0laRSAqLwogICAgICAgIDM3LjUlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg0MDVkZWcpIH0gLyogMS41ICogQVJDU0laRSAqLwogICAgICAgIDUwJSAgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg1NDBkZWcpIH0gLyogMiAgICogQVJDU0laRSAqLwogICAgICAgIDYyLjUlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg2NzVkZWcpIH0gLyogMi41ICogQVJDU0laRSAqLwogICAgICAgIDc1JSAgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg4MTBkZWcpIH0gLyogMyAgICogQVJDU0laRSAqLwogICAgICAgIDg3LjUlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg5NDVkZWcpIH0gLyogMy41ICogQVJDU0laRSAqLwogICAgICAgIHRvICAgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMDgwZGVnKSB9IC8qIDQgICAqIEFSQ1NJWkUgKi8KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBmaWxsLXVuZmlsbC1yb3RhdGUgewogICAgICAgIDEyLjUlIHsgdHJhbnNmb3JtOiByb3RhdGUoMTM1ZGVnKSB9IC8qIDAuNSAqIEFSQ1NJWkUgKi8KICAgICAgICAyNSUgICB7IHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZykgfSAvKiAxICAgKiBBUkNTSVpFICovCiAgICAgICAgMzcuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSg0MDVkZWcpIH0gLyogMS41ICogQVJDU0laRSAqLwogICAgICAgIDUwJSAgIHsgdHJhbnNmb3JtOiByb3RhdGUoNTQwZGVnKSB9IC8qIDIgICAqIEFSQ1NJWkUgKi8KICAgICAgICA2Mi41JSB7IHRyYW5zZm9ybTogcm90YXRlKDY3NWRlZykgfSAvKiAyLjUgKiBBUkNTSVpFICovCiAgICAgICAgNzUlICAgeyB0cmFuc2Zvcm06IHJvdGF0ZSg4MTBkZWcpIH0gLyogMyAgICogQVJDU0laRSAqLwogICAgICAgIDg3LjUlIHsgdHJhbnNmb3JtOiByb3RhdGUoOTQ1ZGVnKSB9IC8qIDMuNSAqIEFSQ1NJWkUgKi8KICAgICAgICB0byAgICB7IHRyYW5zZm9ybTogcm90YXRlKDEwODBkZWcpIH0gLyogNCAgICogQVJDU0laRSAqLwogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbGF5ZXItMS1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICAyNSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICAyNiUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA4OSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDEgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGxheWVyLTEtZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgMjUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgMjYlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgODklIHsgb3BhY2l0eTogMCB9CiAgICAgICAgOTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAxIH0KICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGxheWVyLTItZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgMTUlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgMjUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNTElIHsgb3BhY2l0eTogMCB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBsYXllci0yLWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDE1JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDI1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDUwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDUxJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci0zLWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDQwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDUwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDc1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDc2JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItMy1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA0MCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA1MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA3NSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA3NiUgeyBvcGFjaXR5OiAwIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbGF5ZXItNC1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA2NSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA3NSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGxheWVyLTQtZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgNjUlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgNzUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgOTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgLmNpcmNsZS1jbGlwcGVyIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiA1MCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXRjaCB0aGUgZ2FwIHRoYXQgYXBwZWFyIGJldHdlZW4gdGhlIHR3byBhZGphY2VudCBkaXYuY2lyY2xlLWNsaXBwZXIgd2hpbGUgdGhlCiAgICAgICAqIHNwaW5uZXIgaXMgcm90YXRpbmcgKGFwcGVhcnMgb24gQ2hyb21lIDUwLCBTYWZhcmkgOS4xLjEsIGFuZCBFZGdlKS4KICAgICAgICovCiAgICAgIC5zcGlubmVyLWxheWVyOjphZnRlciB7CiAgICAgICAgbGVmdDogNDUlOwogICAgICAgIHdpZHRoOiAxMCU7CiAgICAgICAgYm9yZGVyLXRvcC1zdHlsZTogc29saWQ7CiAgICAgIH0KCiAgICAgIC5zcGlubmVyLWxheWVyOjphZnRlciwKICAgICAgLmNpcmNsZS1jbGlwcGVyOjphZnRlciB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvcmRlci13aWR0aDogdmFyKC0tcGFwZXItc3Bpbm5lci1zdHJva2Utd2lkdGgsIDNweCk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICB9CgogICAgICAuY2lyY2xlLWNsaXBwZXI6OmFmdGVyIHsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgd2lkdGg6IDIwMCU7CiAgICAgICAgYm9yZGVyLXN0eWxlOiBzb2xpZDsKICAgICAgICBib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuY2lyY2xlLWNsaXBwZXIubGVmdDo6YWZ0ZXIgewogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTI5ZGVnKTsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMjlkZWcpOwogICAgICB9CgogICAgICAuY2lyY2xlLWNsaXBwZXIucmlnaHQ6OmFmdGVyIHsKICAgICAgICBsZWZ0OiAtMTAwJTsKICAgICAgICBib3JkZXItbGVmdC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC0xMjlkZWcpOwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC0xMjlkZWcpOwogICAgICB9CgogICAgICAuYWN0aXZlIC5nYXAtcGF0Y2g6OmFmdGVyLAogICAgICAuYWN0aXZlIC5jaXJjbGUtY2xpcHBlcjo6YWZ0ZXIgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci1zcGlubmVyLWV4cGFuZC1jb250cmFjdC1kdXJhdGlvbik7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZXhwYW5kLWNvbnRyYWN0LWR1cmF0aW9uKTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIC5hY3RpdmUgLmNpcmNsZS1jbGlwcGVyLmxlZnQ6OmFmdGVyIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBsZWZ0LXNwaW47CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGxlZnQtc3BpbjsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuY2lyY2xlLWNsaXBwZXIucmlnaHQ6OmFmdGVyIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiByaWdodC1zcGluOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiByaWdodC1zcGluOwogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbGVmdC1zcGluIHsKICAgICAgICAwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTMwZGVnKSB9CiAgICAgICAgNTAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNWRlZykgfQogICAgICAgIHRvIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBsZWZ0LXNwaW4gewogICAgICAgIDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMTMwZGVnKSB9CiAgICAgICAgNTAlIHsgdHJhbnNmb3JtOiByb3RhdGUoLTVkZWcpIH0KICAgICAgICB0byB7IHRyYW5zZm9ybTogcm90YXRlKDEzMGRlZykgfQogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgcmlnaHQtc3BpbiB7CiAgICAgICAgMCUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC0xMzBkZWcpIH0KICAgICAgICA1MCUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDVkZWcpIH0KICAgICAgICB0byB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIHJpZ2h0LXNwaW4gewogICAgICAgIDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfQogICAgICAgIDUwJSB7IHRyYW5zZm9ybTogcm90YXRlKDVkZWcpIH0KICAgICAgICB0byB7IHRyYW5zZm9ybTogcm90YXRlKC0xMzBkZWcpIH0KICAgICAgfQoKICAgICAgI3NwaW5uZXJDb250YWluZXIuY29vbGRvd24gewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGUsIGZhZGUtb3V0IHZhcigtLXBhcGVyLXNwaW5uZXItY29vbGRvd24tZHVyYXRpb24pIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTsKICAgICAgICBhbmltYXRpb246IGNvbnRhaW5lci1yb3RhdGUgdmFyKC0tcGFwZXItc3Bpbm5lci1jb250YWluZXItcm90YXRpb24tZHVyYXRpb24pIGxpbmVhciBpbmZpbml0ZSwgZmFkZS1vdXQgdmFyKC0tcGFwZXItc3Bpbm5lci1jb29sZG93bi1kdXJhdGlvbikgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpOwogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgZmFkZS1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBmYWRlLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1zcGlubmVyLWxpdGUiPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLXNwaW5uZXItc3R5bGVzIj48L3N0eWxlPgoKICAgIDxkaXYgaWQ9InNwaW5uZXJDb250YWluZXIiIGNsYXNzLW5hbWU9IltbX19jb21wdXRlQ29udGFpbmVyQ2xhc3NlcyhhY3RpdmUsIF9fY29vbGluZ0Rvd24pXV0iIG9uLWFuaW1hdGlvbmVuZD0iX19yZXNldCIgb24td2Via2l0LWFuaW1hdGlvbi1lbmQ9Il9fcmVzZXQiPgogICAgICA8ZGl2IGNsYXNzPSJzcGlubmVyLWxheWVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciBsZWZ0Ij48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciByaWdodCI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8c3R5bGU+Ci5wbG90dGFibGUtY29sb3JzLTAgewogIGJhY2tncm91bmQtY29sb3I6ICM1Mjc5Yzc7IC8qIElORElHTyAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0xIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmQzNzNlOyAvKiBDT1JBTF9SRUQgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtMiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzYzYzI2MTsgLyogRkVSTiAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0zIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFkNDE5OyAvKiBCUklHSFRfU1VOICovCn0KCi5wbG90dGFibGUtY29sb3JzLTQgewogIGJhY2tncm91bmQtY29sb3I6ICMyYzJiNmY7IC8qIEpBQ0FSVEEgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNSB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNzkzOTsgLyogQlVSTklOR19PUkFOR0UgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNiB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2RiMmU2NTsgLyogQ0VSSVNFX1JFRCAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy03IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTljZTUwOyAvKiBDT05JRkVSICovCn0KCi5wbG90dGFibGUtY29sb3JzLTggewogIGJhY2tncm91bmQtY29sb3I6ICM5NjI1NjU7IC8qIFJPWUFMX0hFQVRIICovCn0KCi5wbG90dGFibGUtY29sb3JzLTkgewogIGJhY2tncm91bmQtY29sb3I6ICMwNmNjY2M7IC8qIFJPQklOU19FR0dfQkxVRSAqLwp9CgovKioKICogVXNlci1zdXBwbGllZCByZW5kZXJUbyBlbGVtZW50LgogKi8KLnBsb3R0YWJsZSB7CiAgZGlzcGxheTogYmxvY2s7IC8qIG11c3QgYmUgYmxvY2sgZWxlbWVudHMgZm9yIHdpZHRoL2hlaWdodCBjYWxjdWxhdGlvbnMgdG8gd29yayBpbiBGaXJlZm94LiAqLwogIHBvaW50ZXItZXZlbnRzOiB2aXNpYmxlRmlsbDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgLyoqCiAgICogUHJlIDMuMCwgdXNlcnMgY291bGQgc2V0IHRoZSBkaW1lbnNpb24gb2YgdGhlIHJvb3QgZWxlbWVudCBpbiB0d28gd2F5czogZWl0aGVyIHVzaW5nIENTUwogICAqIChpbmxpbmUgb3IgdGhyb3VnaCBhIHN0eWxlc2hlZXQpLCBvciB1c2luZyB0aGUgU1ZHIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzLiBCeSBkZWZhdWx0LCB3ZQogICAqIHNldCB0aGUgU1ZHIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzIHRvIDEwMCUuCiAgICoKICAgKiBQb3N0IDMuMCB0aGUgcm9vdCBlbGVtZW50IGlzIGFsd2F5cyBhIG5vcm1hbCBkaXYgYW5kIHRoZSBvbmx5IHdheSB0byBzZXQgdGhlIGRpbWVuc2lvbnMgaXMKICAgKiB0byB1c2UgQ1NTLiBUbyByZXBsaWNhdGUgdGhlICIxMDAlLWJ5LWRlZmF1bHQiIGJlaGF2aW9yLCB3ZSBhcHBseSB3aWR0aC9oZWlnaHQgMTAwJS4KICAgKi8KICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7Cn0KCi8qKgogKiBUaGUgX2VsZW1lbnQgdGhhdCByb290cyBlYWNoIENvbXBvbmVudCdzIERPTS4KICovCi5wbG90dGFibGUgLmNvbXBvbmVudCB7CiAgLyogQWxsb3cgY29tcG9uZW50cyB0byBiZSBwb3NpdGlvbmVkIHdpdGggZXhwbGljaXQgbGVmdC90b3Avd2lkdGgvaGVpZ2h0IHN0eWxlcyAqLwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKfQoKLnBsb3R0YWJsZSAuYmFja2dyb3VuZC1jb250YWluZXIsCi5wbG90dGFibGUgLmNvbnRlbnQsCi5wbG90dGFibGUgLmZvcmVncm91bmQtY29udGFpbmVyIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwp9CgovKioKICogRG9uJ3QgYWxsb3cgc3ZnIGVsZW1lbnRzIGFib3ZlIHRoZSBjb250ZW50IHRvIHN0ZWFsIGV2ZW50cwogKi8KLnBsb3R0YWJsZSAuZm9yZWdyb3VuZC1jb250YWluZXIgewogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoucGxvdHRhYmxlIC5jb21wb25lbnQtb3ZlcmZsb3ctaGlkZGVuIHsKICBvdmVyZmxvdzogaGlkZGVuOwp9CgoucGxvdHRhYmxlIC5jb21wb25lbnQtb3ZlcmZsb3ctdmlzaWJsZSB7CiAgb3ZlcmZsb3c6IHZpc2libGU7Cn0KCi5wbG90dGFibGUgLnBsb3QtY2FudmFzLWNvbnRhaW5lciB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5wbG90dGFibGUgLnBsb3QtY2FudmFzIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgLyoqCiAgICogUGxheSB3ZWxsIHdpdGggZGVmZXJyZWQgcmVuZGVyaW5nLgogICAqLwogIHRyYW5zZm9ybS1vcmlnaW46IDBweCAwcHggMHB4Owp9CgoucGxvdHRhYmxlIHRleHQgewogIHRleHQtcmVuZGVyaW5nOiBnZW9tZXRyaWNQcmVjaXNpb247Cn0KCi5wbG90dGFibGUgLmxhYmVsIHRleHQgewogIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmOwogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLmJhci1sYWJlbC10ZXh0LWFyZWEgdGV4dCB7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4Owp9CgoucGxvdHRhYmxlIC5sYWJlbC1hcmVhIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxNHB4Owp9CgoucGxvdHRhYmxlIC5saWdodC1sYWJlbCB0ZXh0IHsKICBmaWxsOiB3aGl0ZTsKfQoKLnBsb3R0YWJsZSAuZGFyay1sYWJlbCB0ZXh0IHsKICBmaWxsOiAjMzIzMTNGOwp9CgoucGxvdHRhYmxlIC5vZmYtYmFyLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLnN0YWNrZWQtYmFyLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1zdHlsZTogbm9ybWFsOwp9CgoucGxvdHRhYmxlIC5zdGFja2VkLWJhci1wbG90IC5vZmYtYmFyLWxhYmVsIHsKICAvKiBIQUNLSEFDSyAjMjc5NTogY29ycmVjdCBvZmYtYmFyIGxhYmVsIGxvZ2ljIHRvIGJlIGltcGxlbWVudGVkIG9uIFN0YWNrZWRCYXIgKi8KICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKfQoKLnBsb3R0YWJsZSAuYXhpcy1sYWJlbCB0ZXh0IHsKICBmb250LXNpemU6IDEwcHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgbGV0dGVyLXNwYWNpbmc6IDFweDsKICBsaW5lLWhlaWdodDogbm9ybWFsOwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCi5wbG90dGFibGUgLnRpdGxlLWxhYmVsIHRleHQgewogIGZvbnQtc2l6ZTogMjBweDsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnBsb3R0YWJsZSAuYXhpcyBsaW5lLmJhc2VsaW5lIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLmF4aXMgbGluZS50aWNrLW1hcmsgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuYXhpcyB0ZXh0IHsKICBmaWxsOiAjMzIzMTNGOwogIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmOwogIGZvbnQtc2l6ZTogMTJweDsKICBmb250LXdlaWdodDogMjAwOwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tY2lyY2xlIHsKICBmaWxsOiB3aGl0ZTsKICBzdHJva2Utd2lkdGg6IDFweDsKICBzdHJva2U6ICNDQ0M7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tbGluZSB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5heGlzIC5hbm5vdGF0aW9uLXJlY3QgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKICBmaWxsOiB3aGl0ZTsKfQoKLnBsb3R0YWJsZSAuYmFyLXBsb3QgLmJhc2VsaW5lIHsKICBzdHJva2U6ICM5OTk7Cn0KCi5wbG90dGFibGUgLmdyaWRsaW5lcyBsaW5lIHsKICBzdHJva2U6ICMzQzNDM0M7IC8qIGhhY2toYWNrOiBncmlkbGluZXMgc2hvdWxkIGJlIHNvbGlkOyBzZWUgIzgyMCAqLwogIG9wYWNpdHk6IDAuMjU7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLnNlbGVjdGlvbi1ib3gtbGF5ZXIgLnNlbGVjdGlvbi1hcmVhIHsKICBmaWxsOiBibGFjazsKICBmaWxsLW9wYWNpdHk6IDAuMDM7CiAgc3Ryb2tlOiAjQ0NDOwp9Ci8qIERyYWdCb3hMYXllciAqLwoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZSAuZHJhZy1lZGdlLWxyIHsKICBjdXJzb3I6IGV3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci55LXJlc2l6YWJsZSAuZHJhZy1lZGdlLXRiIHsKICBjdXJzb3I6IG5zLXJlc2l6ZTsKfQoKLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLXRsIHsKICBjdXJzb3I6IG53c2UtcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci10ciB7CiAgY3Vyc29yOiBuZXN3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItYmwgewogIGN1cnNvcjogbmVzdy1yZXNpemU7Cn0KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLWJyIHsKICBjdXJzb3I6IG53c2UtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci5tb3ZhYmxlIC5zZWxlY3Rpb24tYXJlYSB7CiAgY3Vyc29yOiBtb3ZlOyAvKiBJRSBmYWxsYmFjayAqLwogIGN1cnNvcjogLW1vei1ncmFiOwogIGN1cnNvcjogLXdlYmtpdC1ncmFiOwogIGN1cnNvcjogZ3JhYjsKfQoKLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIubW92YWJsZSAuc2VsZWN0aW9uLWFyZWE6YWN0aXZlIHsKICBjdXJzb3I6IC1tb3otZ3JhYmJpbmc7CiAgY3Vyc29yOiAtd2Via2l0LWdyYWJiaW5nOwogIGN1cnNvcjogZ3JhYmJpbmc7Cn0KLyogL0RyYWdCb3hMYXllciAqLwoKLnBsb3R0YWJsZSAuZ3VpZGUtbGluZS1sYXllciBsaW5lLmd1aWRlLWxpbmUgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuZHJhZy1saW5lLWxheWVyLmVuYWJsZWQudmVydGljYWwgbGluZS5kcmFnLWVkZ2UgewogIGN1cnNvcjogZXctcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC5ob3Jpem9udGFsIGxpbmUuZHJhZy1lZGdlIHsKICBjdXJzb3I6IG5zLXJlc2l6ZTsKfQoKLnBsb3R0YWJsZSAubGVnZW5kIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLmludGVycG9sYXRlZC1jb2xvci1sZWdlbmQgcmVjdC5zd2F0Y2gtYm91bmRpbmctYm94IHsKICBmaWxsOiBub25lOwogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLnBsb3R0YWJsZSAud2F0ZXJmYWxsLXBsb3QgbGluZS5jb25uZWN0b3IgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAucGllLXBsb3QgLmFyYy5vdXRsaW5lIHsKICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwp9Cjwvc3R5bGU+Cgo8ZG9tLW1vZHVsZSBpZD0icGxvdHRhYmxlLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+Ci5wbG90dGFibGUtY29sb3JzLTAgewogIGJhY2tncm91bmQtY29sb3I6ICM1Mjc5Yzc7IC8qIElORElHTyAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0xIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmQzNzNlOyAvKiBDT1JBTF9SRUQgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtMiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzYzYzI2MTsgLyogRkVSTiAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0zIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFkNDE5OyAvKiBCUklHSFRfU1VOICovCn0KCi5wbG90dGFibGUtY29sb3JzLTQgewogIGJhY2tncm91bmQtY29sb3I6ICMyYzJiNmY7IC8qIEpBQ0FSVEEgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNSB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNzkzOTsgLyogQlVSTklOR19PUkFOR0UgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNiB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2RiMmU2NTsgLyogQ0VSSVNFX1JFRCAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy03IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTljZTUwOyAvKiBDT05JRkVSICovCn0KCi5wbG90dGFibGUtY29sb3JzLTggewogIGJhY2tncm91bmQtY29sb3I6ICM5NjI1NjU7IC8qIFJPWUFMX0hFQVRIICovCn0KCi5wbG90dGFibGUtY29sb3JzLTkgewogIGJhY2tncm91bmQtY29sb3I6ICMwNmNjY2M7IC8qIFJPQklOU19FR0dfQkxVRSAqLwp9CgovKioKICogVXNlci1zdXBwbGllZCByZW5kZXJUbyBlbGVtZW50LgogKi8KLnBsb3R0YWJsZSB7CiAgZGlzcGxheTogYmxvY2s7IC8qIG11c3QgYmUgYmxvY2sgZWxlbWVudHMgZm9yIHdpZHRoL2hlaWdodCBjYWxjdWxhdGlvbnMgdG8gd29yayBpbiBGaXJlZm94LiAqLwogIHBvaW50ZXItZXZlbnRzOiB2aXNpYmxlRmlsbDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgLyoqCiAgICogUHJlIDMuMCwgdXNlcnMgY291bGQgc2V0IHRoZSBkaW1lbnNpb24gb2YgdGhlIHJvb3QgZWxlbWVudCBpbiB0d28gd2F5czogZWl0aGVyIHVzaW5nIENTUwogICAqIChpbmxpbmUgb3IgdGhyb3VnaCBhIHN0eWxlc2hlZXQpLCBvciB1c2luZyB0aGUgU1ZHIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzLiBCeSBkZWZhdWx0LCB3ZQogICAqIHNldCB0aGUgU1ZHIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzIHRvIDEwMCUuCiAgICoKICAgKiBQb3N0IDMuMCB0aGUgcm9vdCBlbGVtZW50IGlzIGFsd2F5cyBhIG5vcm1hbCBkaXYgYW5kIHRoZSBvbmx5IHdheSB0byBzZXQgdGhlIGRpbWVuc2lvbnMgaXMKICAgKiB0byB1c2UgQ1NTLiBUbyByZXBsaWNhdGUgdGhlICIxMDAlLWJ5LWRlZmF1bHQiIGJlaGF2aW9yLCB3ZSBhcHBseSB3aWR0aC9oZWlnaHQgMTAwJS4KICAgKi8KICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7Cn0KCi8qKgogKiBUaGUgX2VsZW1lbnQgdGhhdCByb290cyBlYWNoIENvbXBvbmVudCdzIERPTS4KICovCi5wbG90dGFibGUgLmNvbXBvbmVudCB7CiAgLyogQWxsb3cgY29tcG9uZW50cyB0byBiZSBwb3NpdGlvbmVkIHdpdGggZXhwbGljaXQgbGVmdC90b3Avd2lkdGgvaGVpZ2h0IHN0eWxlcyAqLwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKfQoKLnBsb3R0YWJsZSAuYmFja2dyb3VuZC1jb250YWluZXIsCi5wbG90dGFibGUgLmNvbnRlbnQsCi5wbG90dGFibGUgLmZvcmVncm91bmQtY29udGFpbmVyIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwp9CgovKioKICogRG9uJ3QgYWxsb3cgc3ZnIGVsZW1lbnRzIGFib3ZlIHRoZSBjb250ZW50IHRvIHN0ZWFsIGV2ZW50cwogKi8KLnBsb3R0YWJsZSAuZm9yZWdyb3VuZC1jb250YWluZXIgewogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoucGxvdHRhYmxlIC5jb21wb25lbnQtb3ZlcmZsb3ctaGlkZGVuIHsKICBvdmVyZmxvdzogaGlkZGVuOwp9CgoucGxvdHRhYmxlIC5jb21wb25lbnQtb3ZlcmZsb3ctdmlzaWJsZSB7CiAgb3ZlcmZsb3c6IHZpc2libGU7Cn0KCi5wbG90dGFibGUgLnBsb3QtY2FudmFzLWNvbnRhaW5lciB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5wbG90dGFibGUgLnBsb3QtY2FudmFzIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgLyoqCiAgICogUGxheSB3ZWxsIHdpdGggZGVmZXJyZWQgcmVuZGVyaW5nLgogICAqLwogIHRyYW5zZm9ybS1vcmlnaW46IDBweCAwcHggMHB4Owp9CgoucGxvdHRhYmxlIHRleHQgewogIHRleHQtcmVuZGVyaW5nOiBnZW9tZXRyaWNQcmVjaXNpb247Cn0KCi5wbG90dGFibGUgLmxhYmVsIHRleHQgewogIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmOwogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLmJhci1sYWJlbC10ZXh0LWFyZWEgdGV4dCB7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4Owp9CgoucGxvdHRhYmxlIC5sYWJlbC1hcmVhIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxNHB4Owp9CgoucGxvdHRhYmxlIC5saWdodC1sYWJlbCB0ZXh0IHsKICBmaWxsOiB3aGl0ZTsKfQoKLnBsb3R0YWJsZSAuZGFyay1sYWJlbCB0ZXh0IHsKICBmaWxsOiAjMzIzMTNGOwp9CgoucGxvdHRhYmxlIC5vZmYtYmFyLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLnN0YWNrZWQtYmFyLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1zdHlsZTogbm9ybWFsOwp9CgoucGxvdHRhYmxlIC5zdGFja2VkLWJhci1wbG90IC5vZmYtYmFyLWxhYmVsIHsKICAvKiBIQUNLSEFDSyAjMjc5NTogY29ycmVjdCBvZmYtYmFyIGxhYmVsIGxvZ2ljIHRvIGJlIGltcGxlbWVudGVkIG9uIFN0YWNrZWRCYXIgKi8KICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKfQoKLnBsb3R0YWJsZSAuYXhpcy1sYWJlbCB0ZXh0IHsKICBmb250LXNpemU6IDEwcHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgbGV0dGVyLXNwYWNpbmc6IDFweDsKICBsaW5lLWhlaWdodDogbm9ybWFsOwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCi5wbG90dGFibGUgLnRpdGxlLWxhYmVsIHRleHQgewogIGZvbnQtc2l6ZTogMjBweDsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnBsb3R0YWJsZSAuYXhpcyBsaW5lLmJhc2VsaW5lIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLmF4aXMgbGluZS50aWNrLW1hcmsgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuYXhpcyB0ZXh0IHsKICBmaWxsOiAjMzIzMTNGOwogIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmOwogIGZvbnQtc2l6ZTogMTJweDsKICBmb250LXdlaWdodDogMjAwOwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tY2lyY2xlIHsKICBmaWxsOiB3aGl0ZTsKICBzdHJva2Utd2lkdGg6IDFweDsKICBzdHJva2U6ICNDQ0M7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tbGluZSB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5heGlzIC5hbm5vdGF0aW9uLXJlY3QgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKICBmaWxsOiB3aGl0ZTsKfQoKLnBsb3R0YWJsZSAuYmFyLXBsb3QgLmJhc2VsaW5lIHsKICBzdHJva2U6ICM5OTk7Cn0KCi5wbG90dGFibGUgLmdyaWRsaW5lcyBsaW5lIHsKICBzdHJva2U6ICMzQzNDM0M7IC8qIGhhY2toYWNrOiBncmlkbGluZXMgc2hvdWxkIGJlIHNvbGlkOyBzZWUgIzgyMCAqLwogIG9wYWNpdHk6IDAuMjU7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLnNlbGVjdGlvbi1ib3gtbGF5ZXIgLnNlbGVjdGlvbi1hcmVhIHsKICBmaWxsOiBibGFjazsKICBmaWxsLW9wYWNpdHk6IDAuMDM7CiAgc3Ryb2tlOiAjQ0NDOwp9Ci8qIERyYWdCb3hMYXllciAqLwoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZSAuZHJhZy1lZGdlLWxyIHsKICBjdXJzb3I6IGV3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci55LXJlc2l6YWJsZSAuZHJhZy1lZGdlLXRiIHsKICBjdXJzb3I6IG5zLXJlc2l6ZTsKfQoKLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLXRsIHsKICBjdXJzb3I6IG53c2UtcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci10ciB7CiAgY3Vyc29yOiBuZXN3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItYmwgewogIGN1cnNvcjogbmVzdy1yZXNpemU7Cn0KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLWJyIHsKICBjdXJzb3I6IG53c2UtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci5tb3ZhYmxlIC5zZWxlY3Rpb24tYXJlYSB7CiAgY3Vyc29yOiBtb3ZlOyAvKiBJRSBmYWxsYmFjayAqLwogIGN1cnNvcjogLW1vei1ncmFiOwogIGN1cnNvcjogLXdlYmtpdC1ncmFiOwogIGN1cnNvcjogZ3JhYjsKfQoKLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIubW92YWJsZSAuc2VsZWN0aW9uLWFyZWE6YWN0aXZlIHsKICBjdXJzb3I6IC1tb3otZ3JhYmJpbmc7CiAgY3Vyc29yOiAtd2Via2l0LWdyYWJiaW5nOwogIGN1cnNvcjogZ3JhYmJpbmc7Cn0KLyogL0RyYWdCb3hMYXllciAqLwoKLnBsb3R0YWJsZSAuZ3VpZGUtbGluZS1sYXllciBsaW5lLmd1aWRlLWxpbmUgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuZHJhZy1saW5lLWxheWVyLmVuYWJsZWQudmVydGljYWwgbGluZS5kcmFnLWVkZ2UgewogIGN1cnNvcjogZXctcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC5ob3Jpem9udGFsIGxpbmUuZHJhZy1lZGdlIHsKICBjdXJzb3I6IG5zLXJlc2l6ZTsKfQoKLnBsb3R0YWJsZSAubGVnZW5kIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLmludGVycG9sYXRlZC1jb2xvci1sZWdlbmQgcmVjdC5zd2F0Y2gtYm91bmRpbmctYm94IHsKICBmaWxsOiBub25lOwogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLnBsb3R0YWJsZSAud2F0ZXJmYWxsLXBsb3QgbGluZS5jb25uZWN0b3IgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAucGllLXBsb3QgLmFyYy5vdXRsaW5lIHsKICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwp9Cjwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZ6LWNoYXJ0LXRvb2x0aXAiPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZ6LXBhbi16b29tLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC5oZWxwIHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogMXM7CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAxczsKICAgICAgICBhbmltYXRpb24tbmFtZTogZmFkZS1vdXQ7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgzMCwgMzAsIDMwLCAwLjYpOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgICB0b3A6IDA7CiAgICAgIH0KCiAgICAgIC5oZWxwID4gc3BhbiB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBmYWRlLW91dCB7CiAgICAgICAgMCUgewogICAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB9CgogICAgICAgIDEwMCUgewogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idnotbGluZS1jaGFydDIiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImNoYXJ0ZGl2Ij48L2Rpdj4KICAgIDx2ei1jaGFydC10b29sdGlwIGlkPSJ0b29sdGlwIiBwb3NpdGlvbj0iW1t0b29sdGlwUG9zaXRpb25dXSIgY29udGVudC1jb21wb25lbnQtbmFtZT0idnotbGluZS1jaGFydC10b29sdGlwIj48L3Z6LWNoYXJ0LXRvb2x0aXA+CiAgICA8c3R5bGUgaW5jbHVkZT0icGxvdHRhYmxlLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZ6LXBhbi16b29tLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQogICAgICBkaXYgewogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgIH0KCiAgICAgICNjaGFydGRpdiAubWFpbiB7CiAgICAgICAgY3Vyc29yOiBjcm9zc2hhaXI7CiAgICAgIH0KCiAgICAgIDpob3N0KC5wYW5rZXkpICNjaGFydGRpdiA6bm90KC5kcmFnLXpvb21pbmcpIC5tYWluIHsKICAgICAgICBjdXJzb3I6IC13ZWJraXQtZ3JhYjsKICAgICAgICBjdXJzb3I6IGdyYWI7CiAgICAgIH0KCiAgICAgIDpob3N0KC5tb3VzZWRvd24pICNjaGFydGRpdiAucGFubmluZyAubWFpbiB7CiAgICAgICAgY3Vyc29yOiAtd2Via2l0LWdyYWJiaW5nOwogICAgICAgIGN1cnNvcjogZ3JhYmJpbmc7CiAgICAgIH0KCiAgICAgICNjaGFydGRpdiBsaW5lLmd1aWRlLWxpbmUgewogICAgICAgIHN0cm9rZTogIzk5OTsKICAgICAgICBzdHJva2Utd2lkdGg6IDEuNXB4OwogICAgICB9CiAgICAgICNjaGFydGRpdjpob3ZlciB7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgLmdob3N0IHsKICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKICAKICAKICAKPC9kb20tbW9kdWxlPgoKPGRvbS1tb2R1bGUgaWQ9InZ6LWxpbmUtY2hhcnQtdG9vbHRpcCI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0iY29udGVudCI+CiAgICAgIDx0YWJsZT4KICAgICAgICA8dGhlYWQ+PC90aGVhZD4KICAgICAgICA8dGJvZHk+PC90Ym9keT4KICAgICAgPC90YWJsZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5jb250ZW50IHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuOCk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIHRhYmxlIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNGVtOwogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICB9CgogICAgICB0aGVhZCB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CgogICAgICB0Ym9keSB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMXB4OwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgIHRkIHsKICAgICAgICBwYWRkaW5nOiAwIDVweDsKICAgICAgfQoKICAgICAgLnN3YXRjaCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMThweDsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgfQoKICAgICAgLmNsb3Nlc3QgLnN3YXRjaCB7CiAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMnB4ICNmZmY7CiAgICAgIH0KCiAgICAgIHRoIHsKICAgICAgICBwYWRkaW5nOiAwIDVweDsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CgogICAgICAuZGlzdGFudCB0ZDpub3QoLnN3YXRjaCkgewogICAgICAgIG9wYWNpdHk6IDAuODsKICAgICAgfQoKICAgICAgLmdob3N0IHsKICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0iY2hhcnQtYW5kLXNwaW5uZXItY29udGFpbmVyIj4KICAgICAgPHZ6LWxpbmUtY2hhcnQyIGlkPSJjaGFydCIgZGF0YS1sb2FkaW5nJD0iW1tkYXRhTG9hZGluZ11dIiBjb2xvci1zY2FsZT0iW1tjb2xvclNjYWxlXV0iIGRlZmF1bHQteC1yYW5nZT0iW1tkZWZhdWx0WFJhbmdlXV0iIGRlZmF1bHQteS1yYW5nZT0iW1tkZWZhdWx0WVJhbmdlXV0iIGZpbGwtYXJlYT0iW1tmaWxsQXJlYV1dIiBpZ25vcmUteS1vdXRsaWVycz0iW1tpZ25vcmVZT3V0bGllcnNdXSIgb24tY2hhcnQtYXR0YWNoZWQ9Il9vbkNoYXJ0QXR0YWNoZWQiIHNtb290aGluZy1lbmFibGVkPSJbW3Ntb290aGluZ0VuYWJsZWRdXSIgc21vb3RoaW5nLXdlaWdodD0iW1tzbW9vdGhpbmdXZWlnaHRdXSIgc3ltYm9sLWZ1bmN0aW9uPSJbW3N5bWJvbEZ1bmN0aW9uXV0iIHRvb2x0aXAtY29sdW1ucz0iW1t0b29sdGlwQ29sdW1uc11dIiB0b29sdGlwLXBvc2l0aW9uPSJbW3Rvb2x0aXBQb3NpdGlvbl1dIiB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iIHgtY29tcG9uZW50cy1jcmVhdGlvbi1tZXRob2Q9IltbeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZF1dIiB4LXR5cGU9IltbeFR5cGVdXSIgeS12YWx1ZS1hY2Nlc3Nvcj0iW1t5VmFsdWVBY2Nlc3Nvcl1dIj48L3Z6LWxpbmUtY2hhcnQyPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbZGF0YUxvYWRpbmddXSI+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZy1zcGlubmVyLWNvbnRhaW5lciI+CiAgICAgICAgICA8cGFwZXItc3Bpbm5lci1saXRlIGFjdGl2ZT48L3BhcGVyLXNwaW5uZXItbGl0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgOmhvc3QoW19tYXliZS1yZW5kZXJlZC1pbi1iYWQtc3RhdGVdKSB2ei1saW5lLWNoYXJ0IHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgICNjaGFydC1hbmQtc3Bpbm5lci1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgI2xvYWRpbmctc3Bpbm5lci1jb250YWluZXIgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgICB0b3A6IDA7CiAgICAgIH0KCiAgICAgIHZ6LWxpbmUtY2hhcnQyIHsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIH0KCiAgICAgIHZ6LWxpbmUtY2hhcnQyW2RhdGEtbG9hZGluZ10gewogICAgICAgIG9wYWNpdHk6IDAuMzsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItZGlhbG9nLXNjcm9sbGFibGUiPgoKICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXJlbGF0aXZlOwogICAgICB9CgogICAgICA6aG9zdCguaXMtc2Nyb2xsZWQ6bm90KDpmaXJzdC1jaGlsZCkpOjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBoZWlnaHQ6IDFweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1kaXZpZGVyLWNvbG9yKTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNhbi1zY3JvbGw6bm90KC5zY3JvbGxlZC10by1ib3R0b20pOm5vdCg6bGFzdC1jaGlsZCkpOjphZnRlciB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGhlaWdodDogMXB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRpdmlkZXItY29sb3IpOwogICAgICB9CgogICAgICAuc2Nyb2xsYWJsZSB7CiAgICAgICAgcGFkZGluZzogMCAyNHB4OwoKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtc2Nyb2xsOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy1zY3JvbGxhYmxlOwogICAgICB9CgogICAgICAuZml0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InNjcm9sbGFibGUiIGNsYXNzPSJzY3JvbGxhYmxlIiBvbi1zY3JvbGw9InVwZGF0ZVNjcm9sbFN0YXRlIj4KICAgICAgPHNsb3Q+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT4KCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1tYXJrZG93bi12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJtYXJrZG93biIgaW5uZXItaC10LW0tbD0iW1todG1sXV0iPjwvZGl2PgogICAgPHN0eWxlPgogICAgICAvKgogICAgICAgKiBSZWR1Y2UgdG9wbW9zdCBhbmQgYm90dG9tbW9zdCBtYXJnaW5zIGZyb20gMTZweCB0byAwLjNlbSAocmVuZGVycwogICAgICAgKiBhdCBhYm91dCA0LjhweCkgdG8ga2VlcCB0aGUgbGF5b3V0IGNvbXBhY3QuIFRoaXMgaW1wcm92ZXMgdGhlCiAgICAgICAqIGFwcGVhcmFuY2Ugd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBsaW5lIG9mIHRleHQ7IHN0YW5kYXJkIE1hcmtkb3duCiAgICAgICAqIHJlbmRlcmVycyB3aWxsIHN0aWxsIGluY2x1ZGUgYSBgPHA+YCBlbGVtZW50LgogICAgICAgKgogICAgICAgKiBCeSB0YXJnZXRpbmcgb25seSB0aGUgdG9wLWxldmVsLCBleHRyZW1hbCBlbGVtZW50cywgd2UgcHJlc2VydmUgYW55CiAgICAgICAqIGFjdHVhbCBwYXJhZ3JhcGggYnJlYWtzIGFuZCBvbmx5IGNoYW5nZSB0aGUgcGFkZGluZyBhZ2FpbnN0IHRoZQogICAgICAgKiBjb21wb25lbnQgZWRnZXMuCiAgICAgICAqLwogICAgICAjbWFya2Rvd24gPiBwOmZpcnN0LWNoaWxkIHsKICAgICAgICBtYXJnaW4tdG9wOiAwLjNlbTsKICAgICAgfQogICAgICAjbWFya2Rvd24gPiBwOmxhc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi1ib3R0b206IDAuM2VtOwogICAgICB9CgogICAgICAvKiBQbGVhc2FudCBzdHlsZXMgZm9yIE1hcmtkb3duIHRhYmxlcy4gKi8KICAgICAgI21hcmtkb3duIHRhYmxlIHsKICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgICB9CiAgICAgICNtYXJrZG93biB0YWJsZSB0aCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgfQogICAgICAjbWFya2Rvd24gdGFibGUgdGgsCiAgICAgICNtYXJrZG93biB0YWJsZSB0ZCB7CiAgICAgICAgcGFkZGluZzogNnB4IDEzcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RmZTJlNTsKICAgICAgfQogICAgICAjbWFya2Rvd24gdGFibGUgdHIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjNmNiZDE7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKPGRvbS1tb2R1bGUgaWQ9InRmLWNhcmQtaGVhZGluZy1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICBmaWdjYXB0aW9uIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLyoqIEhvcml6b250YWwgbGluZSBvZiBsYWJlbHMuICovCiAgICAgIC5oZWFkaW5nLXJvdyB7CiAgICAgICAgbWFyZ2luLXRvcDogLTRweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CgogICAgICAvKiogUGllY2Ugb2YgdGV4dCBpbiB0aGUgZmlndXJlIGNhcHRpb24uICovCiAgICAgIC5oZWFkaW5nLWxhYmVsIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KCiAgICAgIC8qKiBNYWtlcyBsYWJlbCBzaG93IG9uIHRoZSByaWdodC4gKi8KICAgICAgLmhlYWRpbmctcmlnaHQgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWNhcmQtaGVhZGluZyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgPGZpZ2NhcHRpb24gY2xhc3M9ImNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbmFtZUxhYmVsXV0iPgogICAgICAgICAgICA8ZGl2IGl0ZW1wcm9wPSJuYW1lIiBjbGFzcz0iaGVhZGluZy1sYWJlbCBuYW1lIj4KICAgICAgICAgICAgICBbW19uYW1lTGFiZWxdXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbcnVuXV0iPgogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIDxzcGFuPgogICAgICAgICAgICAgIDxzcGFuIGl0ZW1wcm9wPSJydW4iIGlkPSJoZWFkaW5nLXJ1biIgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCBydW4iPltbcnVuXV08L3NwYW4+CiAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW190YWdMYWJlbF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCI+CiAgICAgICAgICAgICAgdGFnOiA8c3BhbiBpdGVtcHJvcD0idGFnIj5bW190YWdMYWJlbF1dPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHNsb3Q+PC9zbG90PgogICAgICA8L2ZpZ2NhcHRpb24+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tkZXNjcmlwdGlvbl1dIj4KICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaW5mbyIgb24tdGFwPSJfdG9nZ2xlRGVzY3JpcHRpb25EaWFsb2ciIHRpdGxlPSJTaG93IHN1bW1hcnkgZGVzY3JpcHRpb24iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxwYXBlci1kaWFsb2cgaWQ9ImRlc2NyaXB0aW9uRGlhbG9nIiBuby1vdmVybGFwIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJhdXRvIj4KICAgICAgICA8cGFwZXItZGlhbG9nLXNjcm9sbGFibGU+CiAgICAgICAgICA8dGYtbWFya2Rvd24tdmlldyBodG1sPSJbW2Rlc2NyaXB0aW9uXV0iPjwvdGYtbWFya2Rvd24tdmlldz4KICAgICAgICA8L3BhcGVyLWRpYWxvZy1zY3JvbGxhYmxlPgogICAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDwvZGl2PgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWNhcmQtaGVhZGluZy1zdHlsZSI+CiAgICAgIC5jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KICAgICAgLmNvbnRlbnQgewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLm5hbWUgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQogICAgICAucnVuIHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIHBhZGRpbmc6IDFweCA0cHggMnB4OwogICAgICB9CiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgcGFwZXItZGlhbG9nLXNjcm9sbGFibGUgewogICAgICAgIG1heC13aWR0aDogNjQwcHg7CiAgICAgIH0KICAgICAgI2hlYWRpbmctcnVuIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Zi1jYXJkLWhlYWRpbmctYmFja2dyb3VuZC1jb2xvcik7CiAgICAgICAgY29sb3I6IHZhcigtLXRmLWNhcmQtaGVhZGluZy1jb2xvcik7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZG93bmxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQ9InRydWUiIGxhYmVsPSJydW4gdG8gZG93bmxvYWQiIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X3J1bn19Ij4KICAgICAgPHBhcGVyLWxpc3Rib3ggc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tydW5zXV0iPgogICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPltbaXRlbV1dPC9wYXBlci1pdGVtPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfcnVuXV0iPgogICAgICA8YSBkb3dubG9hZD0iW1tfY3N2TmFtZSh0YWcsIF9ydW4pXV0iIGhyZWY9IltbX2NzdlVybCh0YWcsIF9ydW4sIHVybEZuKV1dIj5DU1Y8L2E+PGEgZG93bmxvYWQ9IltbX2pzb25OYW1lKHRhZywgX3J1bildXSIgaHJlZj0iW1tfanNvblVybCh0YWcsIF9ydW4sIHVybEZuKV1dIj5KU09OPC9hPgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgIH0KICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgd2lkdGg6IDEwMHB4OwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgfQogICAgICB9CiAgICAgIGEgewogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBtYXJnaW46IDAgMC4yZW07CiAgICAgIH0KICAgICAgcGFwZXItaW5wdXQgewogICAgICAgIGZvbnQtc2l6ZTogMjJweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1zY2FsYXItY2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyB0YWc9IltbdGFnXV0iIGRpc3BsYXktbmFtZT0iW1t0YWdNZXRhZGF0YS5kaXNwbGF5TmFtZV1dIiBkZXNjcmlwdGlvbj0iW1t0YWdNZXRhZGF0YS5kZXNjcmlwdGlvbl1dIj48L3RmLWNhcmQtaGVhZGluZz4KICAgIDxkaXYgaWQ9InRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIj4KICAgICAgPHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiBjb2xvci1zY2FsZT0iW1tfZ2V0Q29sb3JTY2FsZShjb2xvclNjYWxlKV1dIiBkYXRhLXNlcmllcz0iW1tfZ2V0RGF0YVNlcmllcyhkYXRhVG9Mb2FkLiopXV0iIGRhdGEtdG8tbG9hZD0iW1tkYXRhVG9Mb2FkXV0iIGdldC1kYXRhLWxvYWQtbmFtZT0iW1tfZ2V0RGF0YUxvYWROYW1lXV0iIGdldC1kYXRhLWxvYWQtdXJsPSJbW2dldERhdGFMb2FkVXJsXV0iIHJlcXVlc3QtZGF0YT0iW1tyZXF1ZXN0RGF0YV1dIiBpZ25vcmUteS1vdXRsaWVycz0iW1tpZ25vcmVZT3V0bGllcnNdXSIgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19sb2FkRGF0YUNhbGxiYWNrXV0iIGxvYWQta2V5PSJbW3RhZ11dIiBsb2ctc2NhbGUtYWN0aXZlPSJbW19sb2dTY2FsZUFjdGl2ZV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIgc21vb3RoaW5nLWVuYWJsZWQ9Iltbc21vb3RoaW5nRW5hYmxlZF1dIiBzbW9vdGhpbmctd2VpZ2h0PSJbW3Ntb290aGluZ1dlaWdodF1dIiB0YWctbWV0YWRhdGE9IltbdGFnTWV0YWRhdGFdXSIgdG9vbHRpcC1jb2x1bW5zPSJbW190b29sdGlwQ29sdW1uc11dIiB0b29sdGlwLXBvc2l0aW9uPSJhdXRvIiB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iIHgtdHlwZT0iW1t4VHlwZV1dIj4KICAgICAgPC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJidXR0b25zIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIgaWNvbj0iZnVsbHNjcmVlbiIgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGljb249ImxpbmUtd2VpZ2h0IiBvbi10YXA9Il90b2dnbGVMb2dTY2FsZSIgdGl0bGU9IlRvZ2dsZSB5LWF4aXMgbG9nIHNjYWxlIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ic2V0dGluZ3Mtb3ZlcnNjYW4iIG9uLXRhcD0iX3Jlc2V0RG9tYWluIiB0aXRsZT0iRml0IGRvbWFpbiB0byBkYXRhIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd0Rvd25sb2FkTGlua3NdXSI+CiAgICAgICAgPHBhcGVyLW1lbnUtYnV0dG9uIG9uLXBhcGVyLWRyb3Bkb3duLW9wZW49Il91cGRhdGVEb3dubG9hZExpbmsiPgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGNsYXNzPSJkcm9wZG93bi10cmlnZ2VyIiBzbG90PSJkcm9wZG93bi10cmlnZ2VyIiBpY29uPSJmaWxlLWRvd25sb2FkIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICA8cGFwZXItaXRlbT4KICAgICAgICAgICAgICA8YSBpZD0ic3ZnTGluayIgZG93bmxvYWQ9IltbdGFnXV0uc3ZnIj4KICAgICAgICAgICAgICAgIERvd25sb2FkIEN1cnJlbnQgQ2hhcnQgYXMgU1ZHCiAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgPC9wYXBlci1tZW51LWJ1dHRvbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHNwYW4gc3R5bGU9ImZsZXgtZ3JvdzogMSI+PC9zcGFuPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd0Rvd25sb2FkTGlua3NdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZG93bmxvYWQtbGlua3MiPgogICAgICAgICAgPHRmLWRvd25sb2FkZXIgcnVucz0iW1tfcnVuc0Zyb21EYXRhKGRhdGFUb0xvYWQpXV0iIHRhZz0iW1t0YWddXSIgdXJsLWZuPSJbW19kb3dubG9hZFVybEZuXV0iPjwvdGYtZG93bmxvYWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgbWFyZ2luOiA1cHg7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDMzMHB4OwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgI3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICB9CgogICAgICAjdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjAwcHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHRmLWNhcmQtaGVhZGluZyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgfQoKICAgICAgI2J1dHRvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgYSB7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBtYXJnaW46IDJweDsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgfQoKICAgICAgcGFwZXItbWVudS1idXR0b24gewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KICAgICAgcGFwZXItaXRlbSBhIHsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXByb2dyZXNzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMjAwcHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSwgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1wcm9ncmVzcy1jb250YWluZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjcHJvZ3Jlc3NDb250YWluZXIsCiAgICAgIC8qIHRoZSBzdHJpcGUgZm9yIHRoZSBpbmRldGVybWluYXRlIGFuaW1hdGlvbiovCiAgICAgIC5pbmRldGVybWluYXRlOjphZnRlciB7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1wYXBlci1wcm9ncmVzcy1oZWlnaHQsIDRweCk7CiAgICAgIH0KCiAgICAgICNwcmltYXJ5UHJvZ3Jlc3MsCiAgICAgICNzZWNvbmRhcnlQcm9ncmVzcywKICAgICAgLmluZGV0ZXJtaW5hdGU6OmFmdGVyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICB9CgogICAgICAjcHJvZ3Jlc3NDb250YWluZXIsCiAgICAgIC5pbmRldGVybWluYXRlOjphZnRlciB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JleS0zMDApKTsKICAgICAgfQoKICAgICAgOmhvc3QoLnRyYW5zaXRpbmcpICNwcmltYXJ5UHJvZ3Jlc3MsCiAgICAgIDpob3N0KC50cmFuc2l0aW5nKSAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm07CiAgICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtOwoKICAgICAgICAvKiBEdXJhdGlvbiAqLwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi1kdXJhdGlvbiwgMC4wOHMpOwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tZHVyYXRpb24sIDAuMDhzKTsKCiAgICAgICAgLyogVGltaW5nIGZ1bmN0aW9uICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24sIGVhc2UpOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbiwgZWFzZSk7CgogICAgICAgIC8qIERlbGF5ICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLWRlbGF5LCAwcyk7CiAgICAgICAgdHJhbnNpdGlvbi1kZWxheTogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi1kZWxheSwgMHMpOwogICAgICB9CgogICAgICAjcHJpbWFyeVByb2dyZXNzLAogICAgICAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDApOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDApOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KCiAgICAgICNwcmltYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWFjdGl2ZS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZWVuLTUwMCkpOwogICAgICB9CgogICAgICAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZWVuLTEwMCkpOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjcHJpbWFyeVByb2dyZXNzIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1wcm9ncmVzcy1kaXNhYmxlZC1hY3RpdmUtY29sb3IsIHZhcigtLWdvb2dsZS1ncmV5LTUwMCkpOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWRpc2FibGVkLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZXktMzAwKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KDpub3QoW2Rpc2FibGVkXSkpICNwcmltYXJ5UHJvZ3Jlc3MuaW5kZXRlcm1pbmF0ZSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgY2VudGVyOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLWJhciB2YXIoLS1wYXBlci1wcm9ncmVzcy1pbmRldGVybWluYXRlLWN5Y2xlLWR1cmF0aW9uLCAycykgbGluZWFyIGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbjogaW5kZXRlcm1pbmF0ZS1iYXIgdmFyKC0tcGFwZXItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZS1jeWNsZS1kdXJhdGlvbiwgMnMpIGxpbmVhciBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdChbZGlzYWJsZWRdKSkgI3ByaW1hcnlQcm9ncmVzcy5pbmRldGVybWluYXRlOjphZnRlciB7CiAgICAgICAgY29udGVudDogIiI7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CgogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLXNwbGl0dGVyIHZhcigtLXBhcGVyLXByb2dyZXNzLWluZGV0ZXJtaW5hdGUtY3ljbGUtZHVyYXRpb24sIDJzKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLXNwbGl0dGVyIHZhcigtLXBhcGVyLXByb2dyZXNzLWluZGV0ZXJtaW5hdGUtY3ljbGUtZHVyYXRpb24sIDJzKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBpbmRldGVybWluYXRlLWJhciB7CiAgICAgICAgMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKC0xMDAlKTsKICAgICAgICB9CiAgICAgICAgNTAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgfQogICAgICAgIDc1JSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoLjI4LC42MiwuMzcsLjkxKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDApIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUtc3BsaXR0ZXIgewogICAgICAgIDAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKC0xMjUlKTsKICAgICAgICB9CiAgICAgICAgMzAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKC0xMjUlKTsKICAgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKC40MiwwLC42LC44KTsKICAgICAgICB9CiAgICAgICAgOTAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKDEyNSUpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKDEyNSUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBpbmRldGVybWluYXRlLWJhciB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgtMTAwJSk7CiAgICAgICAgfQogICAgICAgIDUwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICB9CiAgICAgICAgNzUlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKC4yOCwuNjIsLjM3LC45MSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMCkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUtc3BsaXR0ZXIgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgtMTI1JSk7CiAgICAgICAgfQogICAgICAgIDMwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoLTEyNSUpOwogICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKC40MiwwLC42LC44KTsKICAgICAgICB9CiAgICAgICAgOTAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgxMjUlKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoMTI1JSk7CiAgICAgICAgfQogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InByb2dyZXNzQ29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0ic2Vjb25kYXJ5UHJvZ3Jlc3MiIGhpZGRlbiQ9IltbX2hpZGVTZWNvbmRhcnlQcm9ncmVzcyhzZWNvbmRhcnlSYXRpbyldXSI+PC9kaXY+CiAgICAgIDxkaXYgaWQ9InByaW1hcnlQcm9ncmVzcyI+PC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItc2xpZGVyIj4KICA8dGVtcGxhdGUgc3RyaXAtd2hpdGVzcGFjZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtanVzdGlmaWVkOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgd2lkdGg6IDIwMHB4OwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWFjdGl2ZS1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNzAwKSk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1zZWNvbmRhcnktY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1zZWNvbmRhcnktY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTMwMCkpOwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtZGlzYWJsZWQtYWN0aXZlLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItZGlzYWJsZWQtYWN0aXZlLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtZGlzYWJsZWQtc2Vjb25kYXJ5LWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItZGlzYWJsZWQtc2Vjb25kYXJ5LWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0OiB2YXIoLS1wYXBlci1zbGlkZXItaGVpZ2h0LCAycHgpOwogICAgICB9CgogICAgICAvKiBmb2N1cyBzaG93cyB0aGUgcmlwcGxlICovCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBOT1RFKGtlYW51bGVlKTogVGhvdWdoIDpob3N0LWNvbnRleHQgaXMgbm90IHVuaXZlcnNhbGx5IHN1cHBvcnRlZCwgc29tZSBwYWdlcwogICAgICAgKiBzdGlsbCByZWx5IG9uIHBhcGVyLXNsaWRlciBiZWluZyBmbGlwcGVkIHdoZW4gZGlyPSJydGwiIGlzIHNldCBvbiBib2R5LiBGb3IgZnVsbAogICAgICAgKiBjb21wYXRhYmlsaXR5LCBkaXI9InJ0bCIgbXVzdCBiZSBleHBsaWNpdGx5IHNldCBvbiBwYXBlci1zbGlkZXIuCiAgICAgICAqLwogICAgICA6ZGlyKHJ0bCkgI3NsaWRlckNvbnRhaW5lciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgtMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLTEpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogTk9URShrZWFudWxlZSk6IFRoaXMgaXMgc2VwYXJhdGUgZnJvbSB0aGUgcnVsZSBhYm92ZSBiZWNhdXNlIDpob3N0LWNvbnRleHQgbWF5CiAgICAgICAqIG5vdCBiZSByZWNvZ25pemVkLgogICAgICAgKi8KICAgICAgOmhvc3QoW2Rpcj0icnRsIl0pICNzbGlkZXJDb250YWluZXIgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLTEpOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC0xKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE5PVEUoa2VhbnVsZWUpOiBOZWVkZWQgdG8gb3ZlcnJpZGUgdGhlIDpob3N0LWNvbnRleHQgcnVsZSAod2hlcmUgc3VwcG9ydGVkKQogICAgICAgKiB0byBzdXBwb3J0IExUUiBzbGlkZXJzIGluIFJUTCBwYWdlcy4KICAgICAgICovCiAgICAgIDpob3N0KFtkaXI9Imx0ciJdKSAjc2xpZGVyQ29udGFpbmVyIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDEpOwogICAgICB9CgogICAgICAjc2xpZGVyQ29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDMwcHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpKTsKICAgICAgICBtYXJnaW4tbGVmdDogY2FsYygxNXB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IGNhbGMoMTVweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICAgIH0KCiAgICAgICNzbGlkZXJDb250YWluZXI6Zm9jdXMgewogICAgICAgIG91dGxpbmU6IDA7CiAgICAgIH0KCiAgICAgICNzbGlkZXJDb250YWluZXIuZWRpdGFibGUgewogICAgICAgIG1hcmdpbi10b3A6IDEycHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDsKICAgICAgfQoKICAgICAgLmJhci1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnJpbmcgPiAuYmFyLWNvbnRhaW5lciB7CiAgICAgICAgbGVmdDogY2FsYyg1cHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4xOHMgZWFzZTsKICAgICAgfQoKICAgICAgLnJpbmcuZXhwYW5kLmRyYWdnaW5nID4gLmJhci1jb250YWluZXIgewogICAgICAgIHRyYW5zaXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIC5yaW5nLmV4cGFuZDpub3QoLnBpbikgPiAuYmFyLWNvbnRhaW5lciB7CiAgICAgICAgbGVmdDogY2FsYyg4cHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgICB9CgogICAgICAjc2xpZGVyQmFyIHsKICAgICAgICBwYWRkaW5nOiAxNXB4IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWJhci1jb2xvciwgdHJhbnNwYXJlbnQpOwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtY29udGFpbmVyLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItY29udGFpbmVyLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpOwogICAgICB9CgogICAgICAuc2xpZGVyLW1hcmtlcnMgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IGNhbGMoMTRweCArIHZhcigtLXBhcGVyLXNsaWRlci1oZWlnaHQsMnB4KS8yKTsKICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCk7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogLTFweDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICB9CgogICAgICAuc2xpZGVyLW1hcmtlciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgIH0KICAgICAgLnNsaWRlci1tYXJrZXJzOjphZnRlciwKICAgICAgLnNsaWRlci1tYXJrZXI6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW4tbGVmdDogLTFweDsKICAgICAgICB3aWR0aDogMnB4OwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3IsICMwMDApOwogICAgICB9CgogICAgICAuc2xpZGVyLWtub2IgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgICBtYXJnaW4tbGVmdDogY2FsYygtMTVweCAtIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICAgICAgd2lkdGg6IGNhbGMoMzBweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkpOwogICAgICAgIGhlaWdodDogY2FsYygzMHB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KSk7CiAgICAgIH0KCiAgICAgIC50cmFuc2l0aW5nID4gLnNsaWRlci1rbm9iIHsKICAgICAgICB0cmFuc2l0aW9uOiBsZWZ0IDAuMDhzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYjpmb2N1cyB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgLnNsaWRlci1rbm9iLmRyYWdnaW5nIHsKICAgICAgICB0cmFuc2l0aW9uOiBub25lOwogICAgICB9CgogICAgICAuc25hcHMgPiAuc2xpZGVyLWtub2IuZHJhZ2dpbmcgewogICAgICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuMDhzIGVhc2U7CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMDhzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgICAgbWFyZ2luOiAxMHB4OwogICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgLSAyMHB4KTsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDIwcHgpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNzAwKSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwoKICAgICAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKCiAgICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm0sIGJhY2tncm91bmQtY29sb3IsIGJvcmRlcjsKICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIGJhY2tncm91bmQtY29sb3IsIGJvcmRlcjsKICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjE4czsKICAgICAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsKICAgICAgfQoKICAgICAgLmV4cGFuZDpub3QoLnBpbikgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXIgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLjUpOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS41KTsKICAgICAgfQoKICAgICAgLnJpbmcgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yLCB0cmFuc3BhcmVudCk7CiAgICAgICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICB9CgogICAgICAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNzAwKSk7CiAgICAgIH0KCiAgICAgIC5waW4gPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIiI7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xM3B4OwogICAgICAgIHdpZHRoOiAyNnB4OwogICAgICAgIGhlaWdodDogMjZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCUgNTAlIDUwJSAwOwoKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC00NWRlZykgc2NhbGUoMCkgdHJhbnNsYXRlKDApOwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC00NWRlZykgc2NhbGUoMCkgdHJhbnNsYXRlKDApOwogICAgICB9CgogICAgICAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSwKICAgICAgLnNsaWRlci1rbm9iLWlubmVyOjphZnRlciB7CiAgICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gLjE4cyBlYXNlLCBiYWNrZ3JvdW5kLWNvbG9yIC4xOHMgZWFzZTsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gLjE4cyBlYXNlLCBiYWNrZ3JvdW5kLWNvbG9yIC4xOHMgZWFzZTsKICAgICAgfQoKICAgICAgLnBpbi5yaW5nID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjpiZWZvcmUgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgIH0KCiAgICAgIC5waW4uZXhwYW5kID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjpiZWZvcmUgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgxKSB0cmFuc2xhdGUoMTdweCwgLTE3cHgpOwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC00NWRlZykgc2NhbGUoMSkgdHJhbnNsYXRlKDE3cHgsIC0xN3B4KTsKICAgICAgfQoKICAgICAgLnBpbiA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lcjo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6IGF0dHIodmFsdWUpOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMTZweDsKICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItZm9udC1jb2xvciwgI2ZmZik7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwoKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCkgdHJhbnNsYXRlKDApOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCkgdHJhbnNsYXRlKDApOwogICAgICB9CgogICAgICAucGluLmV4cGFuZCA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lcjo6YWZ0ZXIgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKSB0cmFuc2xhdGUoMCwgLTE3cHgpOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSkgdHJhbnNsYXRlKDAsIC0xN3B4KTsKICAgICAgfQoKICAgICAgLyogcGFwZXItaW5wdXQgKi8KICAgICAgLnNsaWRlci1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDUwcHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgQGFwcGx5IC0tcGFwZXItc2xpZGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDsKICAgICAgICB9OwogICAgICAgIEBhcHBseSAtLXBhcGVyLXNsaWRlci1pbnB1dDsKICAgICAgfQoKICAgICAgLyogZGlzYWJsZWQgc3RhdGUgKi8KICAgICAgI3NsaWRlckNvbnRhaW5lci5kaXNhYmxlZCB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5kaXNhYmxlZCA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWRpc2FibGVkLWtub2ItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tcGFwZXItc2xpZGVyLWRpc2FibGVkLWtub2ItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoMC43NSwgMC43NSwgMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZTNkKDAuNzUsIDAuNzUsIDEpOwogICAgICB9CgogICAgICAuZGlzYWJsZWQucmluZyA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJzbGlkZXJDb250YWluZXIiIGNsYXNzJD0iW1tfZ2V0Q2xhc3NOYW1lcyhkaXNhYmxlZCwgcGluLCBzbmFwcywgaW1tZWRpYXRlVmFsdWUsIG1pbiwgZXhwYW5kLCBkcmFnZ2luZywgdHJhbnNpdGluZywgZWRpdGFibGUpXV0iPgogICAgICA8ZGl2IGNsYXNzPSJiYXItY29udGFpbmVyIj4KICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIGlkPSJzbGlkZXJCYXIiIGFyaWEtaGlkZGVuPSJ0cnVlIiBtaW49IltbbWluXV0iIG1heD0iW1ttYXhdXSIgc3RlcD0iW1tzdGVwXV0iIHZhbHVlPSJbW2ltbWVkaWF0ZVZhbHVlXV0iIHNlY29uZGFyeS1wcm9ncmVzcz0iW1tzZWNvbmRhcnlQcm9ncmVzc11dIiBvbi1kb3duPSJfYmFyZG93biIgb24tdXA9Il9yZXNldEtub2IiIG9uLXRyYWNrPSJfYmFydHJhY2siIG9uLXRhcD0iX2JhcmNsaWNrIj4KICAgICAgICA8L3BhcGVyLXByb2dyZXNzPgogICAgICA8L2Rpdj4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzbmFwc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItbWFya2VycyI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW21hcmtlcnNdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1tYXJrZXIiPjwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgIDxkaXYgaWQ9InNsaWRlcktub2IiIGNsYXNzPSJzbGlkZXIta25vYiIgb24tZG93bj0iX2tub2Jkb3duIiBvbi11cD0iX3Jlc2V0S25vYiIgb24tdHJhY2s9Il9vblRyYWNrIiBvbi10cmFuc2l0aW9uZW5kPSJfa25vYlRyYW5zaXRpb25FbmQiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLWtub2ItaW5uZXIiIHZhbHVlJD0iW1tpbW1lZGlhdGVWYWx1ZV1dIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbZWRpdGFibGVdXSI+CiAgICAgIDxwYXBlci1pbnB1dCBpZD0iaW5wdXQiIHR5cGU9Im51bWJlciIgc3RlcD0iW1tzdGVwXV0iIG1pbj0iW1ttaW5dXSIgbWF4PSJbW21heF1dIiBjbGFzcz0ic2xpZGVyLWlucHV0IiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdmFsdWU9IltbaW1tZWRpYXRlVmFsdWVdXSIgb24tY2hhbmdlPSJfY2hhbmdlVmFsdWUiIG9uLWtleWRvd249Il9pbnB1dEtleURvd24iIG5vLWxhYmVsLWZsb2F0PgogICAgICA8L3BhcGVyLWlucHV0PgogICAgPC90ZW1wbGF0ZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1zbW9vdGhpbmctaW5wdXQiPgogIDx0ZW1wbGF0ZT4KICAgIDxoMyBjbGFzcz0idGl0bGUiPlNtb290aGluZzwvaDM+CiAgICA8ZGl2IGNsYXNzPSJzbW9vdGhpbmctYmxvY2siPgogICAgICA8cGFwZXItc2xpZGVyIGlkPSJzbGlkZXIiIGltbWVkaWF0ZS12YWx1ZT0ie3tfaW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXJ9fSIgbWF4PSJbW21heF1dIiBtaW49IltbbWluXV0iIHBpbiBzdGVwPSJbW3N0ZXBdXSIgdHlwZT0ibnVtYmVyIiB2YWx1ZT0ie3t3ZWlnaHR9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgIDxwYXBlci1pbnB1dCBpZD0iaW5wdXQiIGxhYmVsPSJ3ZWlnaHQiIG5vLWxhYmVsLWZsb2F0IHZhbHVlPSJ7e19pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXR9fSIgdHlwZT0ibnVtYmVyIiBzdGVwPSJbW3N0ZXBdXSIgbWluPSJbW21pbl1dIiBtYXg9IltbbWF4XV0iPjwvcGFwZXItaW5wdXQ+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnRpdGxlIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KCiAgICAgIC5zbW9vdGhpbmctYmxvY2sgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIGZsZXgtZ3JvdzogMjsKICAgICAgfQoKICAgICAgcGFwZXItaW5wdXQgewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIH0KICAgICAgICB3aWR0aDogNjBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1zY2FsYXItZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxpbmUtaXRlbSI+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBpZD0ic2hvdy1kb3dubG9hZC1saW5rcyIgY2hlY2tlZD0ie3tfc2hvd0Rvd25sb2FkTGlua3N9fSI+U2hvdyBkYXRhIGRvd25sb2FkIGxpbmtzPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGlkPSJpZ25vcmUteS1vdXRsaWVyIiBjaGVja2VkPSJ7e19pZ25vcmVZT3V0bGllcnN9fSI+SWdub3JlIG91dGxpZXJzIGluIGNoYXJ0IHNjYWxpbmc8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGlkPSJ0b29sdGlwLXNvcnRpbmciPgogICAgICAgICAgICA8ZGl2PlRvb2x0aXAgc29ydGluZyBtZXRob2Q6PC9kaXY+CiAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0IHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X3Rvb2x0aXBTb3J0aW5nTWV0aG9kfX0iPgogICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0iMCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5kZWZhdWx0PC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+ZGVzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmFzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPm5lYXJlc3Q8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXNtb290aGluZy1pbnB1dCB3ZWlnaHQ9Int7X3Ntb290aGluZ1dlaWdodH19IiBzdGVwPSIwLjAwMSIgbWluPSIwIiBtYXg9IjAuOTk5Ij48L3RmLXNtb290aGluZy1pbnB1dD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLW9wdGlvbi1zZWxlY3RvciBpZD0ieC10eXBlLXNlbGVjdG9yIiBuYW1lPSJIb3Jpem9udGFsIEF4aXMiIHNlbGVjdGVkLWlkPSJ7e194VHlwZX19Ij4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPjxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPjxwYXBlci1idXR0b24gaWQ9IndhbGxfdGltZSI+d2FsbDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPC90Zi1vcHRpb24tc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBzY2FsYXIgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgc2NhbGFyIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICAKICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIiBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSIgZ2V0LWNhdGVnb3J5LWl0ZW0ta2V5PSJbW19nZXRDYXRlZ29yeUl0ZW1LZXldXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLXNjYWxhci1jYXJkIGFjdGl2ZT0iW1thY3RpdmVdXSIgZGF0YS10by1sb2FkPSJbW2l0ZW0uc2VyaWVzXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW19pZ25vcmVZT3V0bGllcnNdXSIgbXVsdGktZXhwZXJpbWVudHM9IltbX2dldE11bHRpRXhwZXJpbWVudHMoZGF0YVNlbGVjdGlvbildXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIiBzaG93LWRvd25sb2FkLWxpbmtzPSJbW19zaG93RG93bmxvYWRMaW5rc11dIiBzbW9vdGhpbmctZW5hYmxlZD0iW1tfc21vb3RoaW5nRW5hYmxlZF1dIiBzbW9vdGhpbmctd2VpZ2h0PSJbW19zbW9vdGhpbmdXZWlnaHRdXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShjYXRlZ29yeSwgX3J1blRvVGFnSW5mbywgaXRlbSldXSIgdGFnPSJbW2l0ZW0udGFnXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbX3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iIHgtdHlwZT0iW1tfeFR5cGVdXSI+PC90Zi1zY2FsYXItY2FyZD4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAjdG9vbHRpcC1zb3J0aW5nIHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi10b3A6IDE1cHg7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CiAgICAgIC5saW5lLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmctdG9wOiA1cHg7CiAgICAgIH0KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgICAgLmNlbnRlciB7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWN1c3RvbS1zY2FsYXItY2FyZC1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgbWFyZ2luOiA1cHggMTBweDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IDMzMHB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0ZXh0LXRvcDsKICAgICAgfQoKICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgOmhvc3QoW19leHBhbmRlZF0pICN0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiA0MDBweDsKICAgICAgfQoKICAgICAgaDEgewogICAgICAgIGZvbnQtc2l6ZTogMTlweDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CgogICAgICAjdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjAwcHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNidXR0b25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uW3NlbGVjdGVkXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIGEgewogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luOiAycHg7CiAgICAgIH0KCiAgICAgIC5kb3dubG9hZC1saW5rcyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICB3aWR0aDogMTAwcHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIGRpc3BsYXktbmFtZT0iW1tfdGl0bGVEaXNwbGF5U3RyaW5nXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgPGRpdiBpZD0idGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIiPgogICAgICA8dGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciBpZD0ibG9hZGVyIiBhY3RpdmU9IltbYWN0aXZlXV0iIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlXV0iIGRhdGEtc2VyaWVzPSJbW19zZXJpZXNOYW1lc11dIiBnZXQtZGF0YS1sb2FkLXVybD0iW1tfZGF0YVVybF1dIiBmaWxsLWFyZWE9IltbX2ZpbGxBcmVhXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBsb2FkLWtleT0iW1tfdGFnRmlsdGVyXV0iIGRhdGEtdG8tbG9hZD0iW1tydW5zXV0iIGxvZy1zY2FsZS1hY3RpdmU9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGxvYWQtZGF0YS1jYWxsYmFjaz0iW1tfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbihtYXJnaW5DaGFydFNlcmllcyldXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW3JlcXVlc3RNYW5hZ2VyXV0iIHN5bWJvbC1mdW5jdGlvbj0iW1tfY3JlYXRlU3ltYm9sRnVuY3Rpb24oKV1dIiB0b29sdGlwLWNvbHVtbnM9IltbX3Rvb2x0aXBDb2x1bW5zXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC10eXBlPSJbW3hUeXBlXV0iPgogICAgICA8L3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXI+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImJ1dHRvbnMiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfbG9nU2NhbGVBY3RpdmVdXSIgaWNvbj0ibGluZS13ZWlnaHQiIG9uLXRhcD0iX3RvZ2dsZUxvZ1NjYWxlIiB0aXRsZT0iVG9nZ2xlIHktYXhpcyBsb2cgc2NhbGUiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncy1vdmVyc2NhbiIgb24tdGFwPSJfcmVzZXREb21haW4iIHRpdGxlPSJGaXQgZG9tYWluIHRvIGRhdGEiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxzcGFuIHN0eWxlPSJmbGV4LWdyb3c6IDEiPjwvc3Bhbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dEb3dubG9hZExpbmtzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImRvd25sb2FkLWxpbmtzIj4KICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0ic2VyaWVzIHRvIGRvd25sb2FkIiBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWR9fSI+CiAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zZXJpZXNOYW1lc11dIiBhcz0iZGF0YVNlcmllc05hbWUiPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPltbZGF0YVNlcmllc05hbWVdXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICA8YSBkb3dubG9hZD0iW1tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkXV0uY3N2IiBocmVmPSJbW19jc3ZVcmwoX25hbWVUb0RhdGFTZXJpZXMsIF9kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWQpXV0iPkNTVjwvYT4KICAgICAgICAgIDxhIGRvd25sb2FkPSJbW19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWRdXS5qc29uIiBocmVmPSJbW19qc29uVXJsKF9uYW1lVG9EYXRhU2VyaWVzLCBfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkKV1dIj5KU09OPC9hPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CgogICAgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX21pc3NpbmdUYWdzLmxlbmd0aF1dIj4KICAgICAgPGRpdiBjbGFzcz0iY29sbGFwc2libGUtbGlzdC10aXRsZSI+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249IltbX2dldFRvZ2dsZUNvbGxhcHNpYmxlSWNvbihfbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZCldXSIgb24tY2xpY2s9Il90b2dnbGVNaXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbiIgY2xhc3M9InRvZ2dsZS1jb2xsYXBzaWJsZS1idXR0b24iPgogICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNvbGxhcHNpYmxlLXRpdGxlLXRleHQiPgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJpY29uczplcnJvciI+PC9pcm9uLWljb24+IE1pc3NpbmcgVGFncwogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZF1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJlcnJvci1jb250ZW50Ij4KICAgICAgICAgIDxpcm9uLWljb24gY2xhc3M9ImVycm9yLWljb24iIGljb249Imljb25zOmVycm9yIj48L2lyb24taWNvbj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX21pc3NpbmdUYWdzXV0iIGFzPSJtaXNzaW5nRW50cnkiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtaXNzaW5nLXRhZ3MtZm9yLXJ1bi1jb250YWluZXIiPgogICAgICAgICAgICAgIFJ1biAiW1ttaXNzaW5nRW50cnkucnVuXV0iIGxhY2tzIGRhdGEgZm9yIHRhZ3MKICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW21pc3NpbmdFbnRyeS50YWdzXV0iIGFzPSJ0YWciPgogICAgICAgICAgICAgICAgICA8bGk+W1t0YWddXTwvbGk+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgPC90ZW1wbGF0ZT4KCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3RhZ0ZpbHRlckludmFsaWRdXSI+CiAgICAgIDxkaXYgY2xhc3M9ImVycm9yLWNvbnRlbnQiPgogICAgICAgIDxpcm9uLWljb24gY2xhc3M9ImVycm9yLWljb24iIGljb249Imljb25zOmVycm9yIj48L2lyb24taWNvbj4KICAgICAgICBUaGlzIHJlZ3VsYXIgZXhwcmVzaW9uIGlzIGludmFsaWQ6PGJyPgogICAgICAgIDxzcGFuIGNsYXNzPSJpbnZhbGlkLXJlZ2V4Ij5bW190YWdGaWx0ZXJdXTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc3RlcHNNaXNtYXRjaF1dIj4KICAgICAgPGRpdiBjbGFzcz0iZXJyb3ItY29udGVudCI+CiAgICAgICAgPGlyb24taWNvbiBjbGFzcz0iZXJyb3ItaWNvbiIgaWNvbj0iaWNvbnM6ZXJyb3IiPjwvaXJvbi1pY29uPgogICAgICAgIFRoZSBzdGVwcyBmb3IgdmFsdWUsIGxvd2VyLCBhbmQgdXBwZXIgdGFncyBkbyBub3QgbWF0Y2g6CiAgICAgICAgPHVsPgogICAgICAgICAgPGxpPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0idGFnLW5hbWUiPltbX3N0ZXBzTWlzbWF0Y2guc2VyaWVzT2JqZWN0LnZhbHVlXV08L3NwYW4+OgogICAgICAgICAgICBbW19zZXBhcmF0ZVdpdGhDb21tYXMoX3N0ZXBzTWlzbWF0Y2gudmFsdWVTdGVwcyldXQogICAgICAgICAgPC9saT4KICAgICAgICAgIDxsaT4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRhZy1uYW1lIj5bW19zdGVwc01pc21hdGNoLnNlcmllc09iamVjdC5sb3dlcl1dPC9zcGFuPjoKICAgICAgICAgICAgW1tfc2VwYXJhdGVXaXRoQ29tbWFzKF9zdGVwc01pc21hdGNoLmxvd2VyU3RlcHMpXV0KICAgICAgICAgIDwvbGk+CiAgICAgICAgICA8bGk+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0YWctbmFtZSI+W1tfc3RlcHNNaXNtYXRjaC5zZXJpZXNPYmplY3QudXBwZXJdXTwvc3Bhbj46CiAgICAgICAgICAgIFtbX3NlcGFyYXRlV2l0aENvbW1hcyhfc3RlcHNNaXNtYXRjaC51cHBlclN0ZXBzKV1dCiAgICAgICAgICA8L2xpPgogICAgICAgIDwvdWw+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KCiAgICA8ZGl2IGlkPSJtYXRjaGVzLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgY2xhc3M9ImNvbGxhcHNpYmxlLWxpc3QtdGl0bGUiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249IltbX2dldFRvZ2dsZUNvbGxhcHNpYmxlSWNvbihfbWF0Y2hlc0xpc3RPcGVuZWQpXV0iIG9uLWNsaWNrPSJfdG9nZ2xlTWF0Y2hlc09wZW4iIGNsYXNzPSJ0b2dnbGUtbWF0Y2hlcy1idXR0b24iPgogICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8c3BhbiBjbGFzcz0iY29sbGFwc2libGUtdGl0bGUtdGV4dCI+CiAgICAgICAgICBNYXRjaGVzIChbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSkKICAgICAgICA8L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nlcmllc05hbWVzLmxlbmd0aF1dIj4KICAgICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9IltbX21hdGNoZXNMaXN0T3BlbmVkXV0iPgogICAgICAgICAgPGRpdiBpZD0ibWF0Y2hlcy1saXN0Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfc2VyaWVzTmFtZXNdXSIgYXM9InNlcmllc05hbWUiIGlkPSJtYXRjaC1saXN0LXJlcGVhdCIgb24tZG9tLWNoYW5nZT0iX21hdGNoTGlzdEVudHJ5Q29sb3JVcGRhdGVkIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYXRjaC1saXN0LWVudHJ5Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtYXRjaC1lbnRyeS1zeW1ib2wiPgogICAgICAgICAgICAgICAgICBbW19kZXRlcm1pbmVTeW1ib2woX25hbWVUb0RhdGFTZXJpZXMsIHNlcmllc05hbWUpXV0KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgIFtbc2VyaWVzTmFtZV1dCiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY3VzdG9tLXNjYWxhci1jYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAuZXJyb3ItY29udGVudCB7CiAgICAgICAgYmFja2dyb3VuZDogI2YwMDsKICAgICAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgMCAwOwogICAgICAgIHBhZGRpbmc6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5lcnJvci1pY29uIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICAgIG1hcmdpbjogMCBhdXRvIDVweCBhdXRvOwogICAgICB9CgogICAgICAuaW52YWxpZC1yZWdleCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5lcnJvci1jb250ZW50IHVsIHsKICAgICAgICBtYXJnaW46IDFweCAwIDAgMDsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAxOXB4OwogICAgICB9CgogICAgICAudGFnLW5hbWUgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CgogICAgICAuY29sbGFwc2libGUtbGlzdC10aXRsZSB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgNXB4IDA7CiAgICAgIH0KCiAgICAgIC5jb2xsYXBzaWJsZS10aXRsZS10ZXh0IHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CgogICAgICAjbWF0Y2hlcy1saXN0IHsKICAgICAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CgogICAgICAubWF0Y2gtbGlzdC1lbnRyeSB7CiAgICAgICAgbWFyZ2luOiAwIDAgNXB4IDA7CiAgICAgIH0KCiAgICAgIC5tYXRjaC1lbnRyeS1zeW1ib2wgewogICAgICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgc2Fucy1zZXJpZjsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5taXNzaW5nLXRhZ3MtZm9yLXJ1bi1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogOHB4IDAgMCAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWN1c3RvbS1zY2FsYXItbXVsdGktbGluZS1jaGFydC1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIGRpc3BsYXktbmFtZT0iW1tfdGl0bGVEaXNwbGF5U3RyaW5nXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgPGRpdiBpZD0idGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIiPgogICAgICA8dGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciBpZD0ibG9hZGVyIiBhY3RpdmU9IltbYWN0aXZlXV0iIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlXV0iIGRhdGEtc2VyaWVzPSJbW19zZXJpZXNOYW1lc11dIiBnZXQtZGF0YS1sb2FkLXVybD0iW1tfZGF0YVVybF1dIiBpZ25vcmUteS1vdXRsaWVycz0iW1tpZ25vcmVZT3V0bGllcnNdXSIgbG9hZC1rZXk9IltbX3RhZ0ZpbHRlcl1dIiBkYXRhLXRvLWxvYWQ9IltbcnVuc11dIiBsb2ctc2NhbGUtYWN0aXZlPSJbW19sb2dTY2FsZUFjdGl2ZV1dIiBsb2FkLWRhdGEtY2FsbGJhY2s9IltbX2NyZWF0ZVByb2Nlc3NEYXRhRnVuY3Rpb24oKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIgc21vb3RoaW5nLWVuYWJsZWQ9Iltbc21vb3RoaW5nRW5hYmxlZF1dIiBzbW9vdGhpbmctd2VpZ2h0PSJbW3Ntb290aGluZ1dlaWdodF1dIiBzeW1ib2wtZnVuY3Rpb249IltbX2NyZWF0ZVN5bWJvbEZ1bmN0aW9uKCldXSIgdG9vbHRpcC1zb3J0aW5nLW1ldGhvZD0iW1t0b29sdGlwU29ydGluZ01ldGhvZF1dIiB4LXR5cGU9IltbeFR5cGVdXSI+CiAgICAgIDwvdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlcj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iYnV0dG9ucyI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2V4cGFuZGVkXV0iIGljb249ImZ1bGxzY3JlZW4iIG9uLXRhcD0iX3RvZ2dsZUV4cGFuZGVkIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19sb2dTY2FsZUFjdGl2ZV1dIiBpY29uPSJsaW5lLXdlaWdodCIgb24tdGFwPSJfdG9nZ2xlTG9nU2NhbGUiIHRpdGxlPSJUb2dnbGUgeS1heGlzIGxvZyBzY2FsZSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InNldHRpbmdzLW92ZXJzY2FuIiBvbi10YXA9Il9yZXNldERvbWFpbiIgdGl0bGU9IkZpdCBkb21haW4gdG8gZGF0YSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHNwYW4gc3R5bGU9ImZsZXgtZ3JvdzogMSI+PC9zcGFuPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd0Rvd25sb2FkTGlua3NdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZG93bmxvYWQtbGlua3MiPgogICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQ9InRydWUiIGxhYmVsPSJzZXJpZXMgdG8gZG93bmxvYWQiIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZH19Ij4KICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3Nlcmllc05hbWVzXV0iIGFzPSJkYXRhU2VyaWVzTmFtZSI+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+W1tkYXRhU2VyaWVzTmFtZV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDxhIGRvd25sb2FkPSJbW19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWRdXS5jc3YiIGhyZWY9IltbX2NzdlVybChfbmFtZVRvRGF0YVNlcmllcywgX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZCldXSI+Q1NWPC9hPgogICAgICAgICAgPGEgZG93bmxvYWQ9IltbX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZF1dLmpzb24iIGhyZWY9IltbX2pzb25VcmwoX25hbWVUb0RhdGFTZXJpZXMsIF9kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWQpXV0iPkpTT048L2E+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9Im1hdGNoZXMtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0ibWF0Y2hlcy1saXN0LXRpdGxlIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nlcmllc05hbWVzLmxlbmd0aF1dIj4KICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJbW19nZXRUb2dnbGVNYXRjaGVzSWNvbihfbWF0Y2hlc0xpc3RPcGVuZWQpXV0iIG9uLWNsaWNrPSJfdG9nZ2xlTWF0Y2hlc09wZW4iIGNsYXNzPSJ0b2dnbGUtbWF0Y2hlcy1idXR0b24iPgogICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8c3BhbiBjbGFzcz0ibWF0Y2hlcy10ZXh0Ij4KICAgICAgICAgIE1hdGNoZXMgKFtbX3Nlcmllc05hbWVzLmxlbmd0aF1dKQogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbWF0Y2hlc0xpc3RPcGVuZWRdXSI+CiAgICAgICAgICA8ZGl2IGlkPSJtYXRjaGVzLWxpc3QiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zZXJpZXNOYW1lc11dIiBhcz0ic2VyaWVzTmFtZSIgaWQ9Im1hdGNoLWxpc3QtcmVwZWF0IiBvbi1kb20tY2hhbmdlPSJfbWF0Y2hMaXN0RW50cnlDb2xvclVwZGF0ZWQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1hdGNoLWxpc3QtZW50cnkiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1hdGNoLWVudHJ5LXN5bWJvbCI+CiAgICAgICAgICAgICAgICAgIFtbX2RldGVybWluZVN5bWJvbChfbmFtZVRvRGF0YVNlcmllcywgc2VyaWVzTmFtZSldXQogICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgW1tzZXJpZXNOYW1lXV0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1jdXN0b20tc2NhbGFyLWNhcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgICNtYXRjaGVzLWxpc3QtdGl0bGUgewogICAgICAgIG1hcmdpbjogMTBweCAwIDVweCAwOwogICAgICB9CgogICAgICAjbWF0Y2hlcy1saXN0IHsKICAgICAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CgogICAgICAubWF0Y2gtbGlzdC1lbnRyeSB7CiAgICAgICAgbWFyZ2luOiAwIDAgNXB4IDA7CiAgICAgIH0KCiAgICAgIC5tYXRjaC1lbnRyeS1zeW1ib2wgewogICAgICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgc2Fucy1zZXJpZjsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5tYXRjaGVzLXRleHQgewogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7X3Nob3dEb3dubG9hZExpbmtzfX0iPlNob3cgZGF0YSBkb3dubG9hZCBsaW5rczwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxpbmUtaXRlbSI+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e19pZ25vcmVZT3V0bGllcnN9fSI+SWdub3JlIG91dGxpZXJzIGluIGNoYXJ0IHNjYWxpbmc8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGlkPSJ0b29sdGlwLXNvcnRpbmciPgogICAgICAgICAgICA8ZGl2IGlkPSJ0b29sdGlwLXNvcnRpbmctbGFiZWwiPlRvb2x0aXAgc29ydGluZyBtZXRob2Q6PC9kaXY+CiAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0IHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X3Rvb2x0aXBTb3J0aW5nTWV0aG9kfX0iPgogICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0iMCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5kZWZhdWx0PC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+ZGVzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmFzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPm5lYXJlc3Q8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXNtb290aGluZy1pbnB1dCB3ZWlnaHQ9Int7X3Ntb290aGluZ1dlaWdodH19IiBzdGVwPSIwLjAwMSIgbWluPSIwIiBtYXg9IjEiPjwvdGYtc21vb3RoaW5nLWlucHV0PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ4LXR5cGUtc2VsZWN0b3IiIG5hbWU9Ikhvcml6b250YWwgQXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3hUeXBlfX0iPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0icmVsYXRpdmUiPnJlbGF0aXZlPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiIGlkPSJjYXRlZ29yaWVzLWNvbnRhaW5lciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+VGhlIGN1c3RvbSBzY2FsYXJzIGRhc2hib2FyZCBpcyBpbmFjdGl2ZS48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDxvbD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVuJ3QgbGFpZCBvdXQgdGhlIGRhc2hib2FyZC48L2xpPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IHNjYWxhciBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC9vbD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIFRvIGxheSBvdXQgdGhlIGRhc2hib2FyZCwgcGFzcyBhIDxjb2RlPkxheW91dDwvY29kZT4gcHJvdG9idWZmZXIKICAgICAgICAgICAgICB0byB0aGUgPGNvZGU+c2V0X2xheW91dDwvY29kZT4gbWV0aG9kLiBGb3IgZXhhbXBsZSwKICAgICAgICAgICAgCiAgICAgICAgICAgIDxwcmU+ZnJvbSB0ZW5zb3Jib2FyZCBpbXBvcnQgc3VtbWFyeQpmcm9tIHRlbnNvcmJvYXJkLnBsdWdpbnMuY3VzdG9tX3NjYWxhciBpbXBvcnQgbGF5b3V0X3BiMgouLi4KIyBUaGlzIGFjdGlvbiBkb2VzIG5vdCBoYXZlIHRvIGJlIHBlcmZvcm1lZCBhdCBldmVyeSBzdGVwLCBzbyB0aGUgYWN0aW9uIGlzIG5vdAojIHRha2VuIGNhcmUgb2YgYnkgYW4gb3AgaW4gdGhlIGdyYXBoLiBXZSBvbmx5IG5lZWQgdG8gc3BlY2lmeSB0aGUgbGF5b3V0IG9uY2UKIyAoaW5zdGVhZCBvZiBwZXIgc3RlcCkuCmxheW91dF9zdW1tYXJ5ID0gc3VtbWFyeV9saWIuY3VzdG9tX3NjYWxhcl9wYihsYXlvdXRfcGIyLkxheW91dCgKICBjYXRlZ29yeT1bCiAgICBsYXlvdXRfcGIyLkNhdGVnb3J5KAogICAgICB0aXRsZT0nbG9zc2VzJywKICAgICAgY2hhcnQ9WwogICAgICAgICAgbGF5b3V0X3BiMi5DaGFydCgKICAgICAgICAgICAgICB0aXRsZT0nbG9zc2VzJywKICAgICAgICAgICAgICBtdWx0aWxpbmU9bGF5b3V0X3BiMi5NdWx0aWxpbmVDaGFydENvbnRlbnQoCiAgICAgICAgICAgICAgICB0YWc9W3InbG9zcy4qJ10sCiAgICAgICAgICAgICAgKSksCiAgICAgICAgICBsYXlvdXRfcGIyLkNoYXJ0KAogICAgICAgICAgICAgIHRpdGxlPSdiYXonLAogICAgICAgICAgICAgIG1hcmdpbj1sYXlvdXRfcGIyLk1hcmdpbkNoYXJ0Q29udGVudCgKICAgICAgICAgICAgICAgIHNlcmllcz1bCiAgICAgICAgICAgICAgICAgIGxheW91dF9wYjIuTWFyZ2luQ2hhcnRDb250ZW50LlNlcmllcygKICAgICAgICAgICAgICAgICAgICB2YWx1ZT0nbG9zcy9iYXovc2NhbGFyX3N1bW1hcnknLAogICAgICAgICAgICAgICAgICAgIGxvd2VyPSdiYXpfbG93ZXIvYmF6L3NjYWxhcl9zdW1tYXJ5JywKICAgICAgICAgICAgICAgICAgICB1cHBlcj0nYmF6X3VwcGVyL2Jhei9zY2FsYXJfc3VtbWFyeScpLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICApKSwKICAgICAgXSksCiAgICBsYXlvdXRfcGIyLkNhdGVnb3J5KAogICAgICB0aXRsZT0ndHJpZyBmdW5jdGlvbnMnLAogICAgICBjaGFydD1bCiAgICAgICAgICBsYXlvdXRfcGIyLkNoYXJ0KAogICAgICAgICAgICAgIHRpdGxlPSd3YXZlIHRyaWcgZnVuY3Rpb25zJywKICAgICAgICAgICAgICBtdWx0aWxpbmU9bGF5b3V0X3BiMi5NdWx0aWxpbmVDaGFydENvbnRlbnQoCiAgICAgICAgICAgICAgICB0YWc9W3IndHJpZ0Z1bmN0aW9ucy9jb3NpbmUnLCByJ3RyaWdGdW5jdGlvbnMvc2luZSddLAogICAgICAgICAgICAgICkpLAogICAgICAgICAgIyBUaGUgcmFuZ2Ugb2YgdGFuZ2VudCBpcyBkaWZmZXJlbnQuIExldCdzIGdpdmUgaXQgaXRzIG93biBjaGFydC4KICAgICAgICAgIGxheW91dF9wYjIuQ2hhcnQoCiAgICAgICAgICAgICAgdGl0bGU9J3RhbicsCiAgICAgICAgICAgICAgbXVsdGlsaW5lPWxheW91dF9wYjIuTXVsdGlsaW5lQ2hhcnRDb250ZW50KAogICAgICAgICAgICAgICAgdGFnPVtyJ3RyaWdGdW5jdGlvbnMvdGFuZ2VudCddLAogICAgICAgICAgICAgICkpLAogICAgICBdLAogICAgICAjIFRoaXMgY2F0ZWdvcnkgd2UgY2FyZSBsZXNzIGFib3V0LiBMZXQncyBtYWtlIGl0IGluaXRpYWxseSBjbG9zZWQuCiAgICAgIGNsb3NlZD1UcnVlKSwKICBdKSkKd3JpdGVyLmFkZF9zdW1tYXJ5KGxheW91dF9zdW1tYXJ5KQo8L3ByZT4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyBhcz0iY2hhcnQiIGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGRpc2FibGUtcGFnaW5hdGlvbiBpbml0aWFsLW9wZW5lZD0iW1tjYXRlZ29yeS5tZXRhZGF0YS5vcGVuZWRdXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJ0Lm11bHRpbGluZV1dIj4KICAgICAgICAgICAgICAgICAgICA8dGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQgYWN0aXZlPSJbW2FjdGl2ZV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIHJ1bnM9IltbX3NlbGVjdGVkUnVuc11dIiB0aXRsZT0iW1tjaGFydC50aXRsZV1dIiB4LXR5cGU9IltbX3hUeXBlXV0iIHNtb290aGluZy1lbmFibGVkPSJbW19zbW9vdGhpbmdFbmFibGVkXV0iIHNtb290aGluZy13ZWlnaHQ9IltbX3Ntb290aGluZ1dlaWdodF1dIiB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW19pZ25vcmVZT3V0bGllcnNdXSIgc2hvdy1kb3dubG9hZC1saW5rcz0iW1tfc2hvd0Rvd25sb2FkTGlua3NdXSIgdGFnLXJlZ2V4ZXM9IltbY2hhcnQubXVsdGlsaW5lLnRhZ11dIj48L3RmLWN1c3RvbS1zY2FsYXItbXVsdGktbGluZS1jaGFydC1jYXJkPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbY2hhcnQubWFyZ2luXV0iPgogICAgICAgICAgICAgICAgICAgIDx0Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkIGFjdGl2ZT0iW1thY3RpdmVdXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIiBydW5zPSJbW19zZWxlY3RlZFJ1bnNdXSIgdGl0bGU9IltbY2hhcnQudGl0bGVdXSIgeC10eXBlPSJbW194VHlwZV1dIiB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW19pZ25vcmVZT3V0bGllcnNdXSIgc2hvdy1kb3dubG9hZC1saW5rcz0iW1tfc2hvd0Rvd25sb2FkTGlua3NdXSIgbWFyZ2luLWNoYXJ0LXNlcmllcz0iW1tjaGFydC5tYXJnaW4uc2VyaWVzXV0iPjwvdGYtY3VzdG9tLXNjYWxhci1tYXJnaW4tY2hhcnQtY2FyZD4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgICN0b29sdGlwLXNvcnRpbmcgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogMTVweDsKICAgICAgfQogICAgICAjdG9vbHRpcC1zb3J0aW5nIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICB3aWR0aDogMTA1cHg7CiAgICAgIH0KICAgICAgLmxpbmUtaXRlbSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1pbWFnZS1sb2FkZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgdGFnPSJbW3RhZ11dIiBydW49IltbcnVuXV0iIGRpc3BsYXktbmFtZT0iW1t0YWdNZXRhZGF0YS5kaXNwbGF5TmFtZV1dIiBkZXNjcmlwdGlvbj0iW1t0YWdNZXRhZGF0YS5kZXNjcmlwdGlvbl1dIiBjb2xvcj0iW1tfcnVuQ29sb3JdXSI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVTYW1wbGVzXV0iPgogICAgICAgIDxkaXY+c2FtcGxlOiBbW19zYW1wbGVUZXh0XV0gb2YgW1tvZlNhbXBsZXNdXTwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc0F0TGVhc3RPbmVTdGVwXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwiPgogICAgICAgICAgICBzdGVwCiAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+W1tfdG9Mb2NhbGVTdHJpbmcoX3N0ZXBWYWx1ZSldXTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCBoZWFkaW5nLXJpZ2h0IGRhdGV0aW1lIj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19jdXJyZW50V2FsbFRpbWVdXSI+CiAgICAgICAgICAgICAgW1tfY3VycmVudFdhbGxUaW1lXV0KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwgcmlnaHQiPgogICAgICAgICAgICA8cGFwZXItc3Bpbm5lci1saXRlIGFjdGl2ZSBoaWRkZW4kPSJbWyFfaXNJbWFnZUxvYWRpbmddXSI+CiAgICAgICAgICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVTdGVwc11dIj4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLXNsaWRlciBpZD0ic3RlcHMiIGltbWVkaWF0ZS12YWx1ZT0ie3tfc3RlcEluZGV4fX0iIG1heD0iW1tfbWF4U3RlcEluZGV4XV0iIG1heC1tYXJrZXJzPSJbW19tYXhTdGVwSW5kZXhdXSIgc25hcHMgc3RlcD0iMSIgdmFsdWU9Int7X3N0ZXBJbmRleH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdGYtY2FyZC1oZWFkaW5nPgoKICAgIAogICAgPGEgaWQ9Im1haW4taW1hZ2UtY29udGFpbmVyIiByb2xlPSJidXR0b24iIGFyaWEtbGFiZWw9IlRvZ2dsZSBhY3R1YWwgc2l6ZSIgYXJpYS1leHBhbmRlZCQ9IltbX2dldEFyaWFFeHBhbmRlZChhY3R1YWxTaXplKV1dIiBvbi10YXA9Il9oYW5kbGVUYXAiPjwvYT4KCiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICAgICAgLyoqIE1ha2UgYnV0dG9uIGEgZGl2LiAqLwogICAgICBidXR0b24gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICAgICAgYm9yZGVyOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC8qKiBGaXJlZm94OiBHZXQgcmlkIG9mIGRvdHRlZCBsaW5lIGluc2lkZSBidXR0b24uICovCiAgICAgIGJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciB7CiAgICAgICAgYm9yZGVyOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC8qKiBGaXJlZm94OiBTaW11bGF0ZSBDaHJvbWUncyBvdXRlciBnbG93IG9uIGJ1dHRvbiB3aGVuIGZvY3VzZWQuICovCiAgICAgIGJ1dHRvbjotbW96LWZvY3VzcmluZyB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3gtc2hhZG93OiAwcHggMHB4IDFweCAycHggSGlnaGxpZ2h0OwogICAgICB9CgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWFyZ2luOiAwIDE1cHggNDBweCAwOwogICAgICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICAgIH0KCiAgICAgIC8qKiBXaGVuIGFjdHVhbCBzaXplIHNob3duIGlzIG9uLCB1c2UgdGhlIGFjdHVhbCBpbWFnZSB3aWR0aC4gKi8KICAgICAgOmhvc3QoW2FjdHVhbC1zaXplXSkgewogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgfQoKICAgICAgOmhvc3QoW2FjdHVhbC1zaXplXSkgI21haW4taW1hZ2UtY29udGFpbmVyIHsKICAgICAgICBtYXgtaGVpZ2h0OiBub25lOwogICAgICAgIHdpZHRoOiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbYWN0dWFsLXNpemVdKSAjbWFpbi1pbWFnZS1jb250YWluZXIgaW1nIHsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgfQoKICAgICAgcGFwZXItc3Bpbm5lci1saXRlIHsKICAgICAgICB3aWR0aDogMTRweDsKICAgICAgICBoZWlnaHQ6IDE0cHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRleHQtYm90dG9tOwogICAgICAgIC0tcGFwZXItc3Bpbm5lci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgIH0KCiAgICAgICNzdGVwcyB7CiAgICAgICAgaGVpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbjogMCAwIDAgLTE1cHg7CiAgICAgICAgLyoKICAgICAgICAgKiAzMSBjb21lcyBmcm9tIGFkZGluZyBhIHBhZGRpbmcgb2YgMTVweCBmcm9tIGJvdGggc2lkZXMgb2YgdGhlCiAgICAgICAgICogcGFwZXItc2xpZGVyLCBzdWJ0cmFjdGluZyAxcHggc28gdGhhdCB0aGUgc2xpZGVyIHdpZHRoIGFsaWducwogICAgICAgICAqIHdpdGggdGhlIGltYWdlICh0aGUgbGFzdCBzbGlkZXIgbWFya2VyIHRha2VzIHVwIDFweCksIGFuZAogICAgICAgICAqIGFkZGluZyAycHggdG8gYWNjb3VudCBmb3IgYSBib3JkZXIgb2YgMXB4IG9uIGJvdGggc2lkZXMgb2YKICAgICAgICAgKiB0aGUgaW1hZ2UuIDMwIC0gMSArIDIuCiAgICAgICAgICovCiAgICAgICAgd2lkdGg6IGNhbGMoMTAwJSArIDMxcHgpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgfQoKICAgICAgI21haW4taW1hZ2UtY29udGFpbmVyIHsKICAgICAgICBtYXgtaGVpZ2h0OiAxMDI0cHg7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgICNtYWluLWltYWdlLWNvbnRhaW5lciBpbWcgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBpbWFnZS1yZW5kZXJpbmc6IC1tb3otY3Jpc3AtZWRnZXM7CiAgICAgICAgaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQ7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgY29sb3I6ICMyMTk2ZjM7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTAwJTsKICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CiAgICAgIHBhcGVyLWljb24tYnV0dG9uW3NlbGVjdGVkXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgfQogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1pbWFnZS1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7X2FjdHVhbFNpemV9fSI+U2hvdyBhY3R1YWwgaW1hZ2Ugc2l6ZTwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGgzIGNsYXNzPSJ0b29sdGlwLWNvbnRhaW5lciI+QnJpZ2h0bmVzcyBhZGp1c3RtZW50PC9oMz4KICAgICAgICAgIDxkaXYgY2xhc3M9InJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciI+CiAgICAgICAgICAgIDxwYXBlci1zbGlkZXIgbWluPSIwIiBtYXg9IjIiIHNuYXBzIHBpbiBzdGVwPSIwLjAxIiB2YWx1ZT0ie3tfYnJpZ2h0bmVzc0FkanVzdG1lbnR9fSIgaW1tZWRpYXRlLXZhbHVlPSJ7e19icmlnaHRuZXNzQWRqdXN0bWVudH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIG9uLXRhcD0iX3Jlc2V0QnJpZ2h0bmVzcyIgZGlzYWJsZWQ9IltbX2JyaWdodG5lc3NJc0RlZmF1bHRdXSI+UmVzZXQ8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8aDMgY2xhc3M9InRvb2x0aXAtY29udGFpbmVyIj5Db250cmFzdCBhZGp1c3RtZW50PC9oMz4KICAgICAgICAgIDxkaXYgY2xhc3M9InJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciI+CiAgICAgICAgICAgIDxwYXBlci1zbGlkZXIgbWluPSIwIiBtYXg9IjUwMCIgc25hcHMgcGluIHN0ZXA9IjEiIHZhbHVlPSJ7e19jb250cmFzdFBlcmNlbnRhZ2V9fSIgaW1tZWRpYXRlLXZhbHVlPSJ7e19jb250cmFzdFBlcmNlbnRhZ2V9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gY2xhc3M9IngtYnV0dG9uIiBvbi10YXA9Il9yZXNldENvbnRyYXN0IiBkaXNhYmxlZD0iW1tfY29udHJhc3RJc0RlZmF1bHRdXSI+UmVzZXQ8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBpZD0icnVucy1zZWxlY3RvciIgc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPjwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBpbWFnZSBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBpbWFnZSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1pbWFnZS1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiBydW49IltbaXRlbS5ydW5dXSIgdGFnPSJbW2l0ZW0udGFnXV0iIHNhbXBsZT0iW1tpdGVtLnNhbXBsZV1dIiBvZi1zYW1wbGVzPSJbW2l0ZW0ub2ZTYW1wbGVzXV0iIHRhZy1tZXRhZGF0YT0iW1tfdGFnTWV0YWRhdGEoX3J1blRvVGFnSW5mbywgaXRlbS5ydW4sIGl0ZW0udGFnKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIGFjdHVhbC1zaXplPSJbW19hY3R1YWxTaXplXV0iIGJyaWdodG5lc3MtYWRqdXN0bWVudD0iW1tfYnJpZ2h0bmVzc0FkanVzdG1lbnRdXSIgY29udHJhc3QtcGVyY2VudGFnZT0iW1tfY29udHJhc3RQZXJjZW50YWdlXV0iPjwvdGYtaW1hZ2UtbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLnJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAucmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIHBhcGVyLXNsaWRlciB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICAgIC5yZXNldHRhYmxlLXNsaWRlci1jb250YWluZXIgcGFwZXItYnV0dG9uIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgLnJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciBwYXBlci1idXR0b25bZGlzYWJsZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB1bnNldDsKICAgICAgfQogICAgICAueC1idXR0b24gewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgIH0KICAgICAgaDMgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTgwMCk7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWF1ZGlvLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyB0YWc9IltbdGFnXV0iIHJ1bj0iW1tydW5dXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iIGNvbG9yPSJbW19ydW5Db2xvcl1dIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVNhbXBsZXNdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCI+CiAgICAgICAgICAgIHNhbXBsZTogW1tfc2FtcGxlVGV4dF1dIG9mIFtbdG90YWxTYW1wbGVzXV0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc0F0TGVhc3RPbmVTdGVwXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwiPgogICAgICAgICAgICBzdGVwIDxzdHJvbmc+W1tfY3VycmVudERhdHVtLnN0ZXBdXTwvc3Ryb25nPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2N1cnJlbnREYXR1bS53YWxsX3RpbWVdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCI+CiAgICAgICAgICAgICAgW1tfY3VycmVudERhdHVtLndhbGxfdGltZV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVN0ZXBzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InN0ZXBzIiBpbW1lZGlhdGUtdmFsdWU9Int7X3N0ZXBJbmRleH19IiBtYXg9IltbX21heFN0ZXBJbmRleF1dIiBtYXgtbWFya2Vycz0iW1tfbWF4U3RlcEluZGV4XV0iIHNuYXBzIHN0ZXA9IjEiIHZhbHVlPSJ7e19zdGVwSW5kZXh9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXBdXSI+CiAgICAgIDxhdWRpbyBjb250cm9scyBzcmMkPSJbW19jdXJyZW50RGF0dW0udXJsXV0iIHR5cGUkPSJbW19jdXJyZW50RGF0dW0uY29udGVudFR5cGVdXSI+PC9hdWRpbz4KICAgICAgPHRmLW1hcmtkb3duLXZpZXcgaHRtbD0iW1tfY3VycmVudERhdHVtLmxhYmVsXV0iPjwvdGYtbWFya2Rvd24tdmlldz4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJtYWluLWF1ZGlvLWNvbnRhaW5lciI+PC9kaXY+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWNhcmQtaGVhZGluZy1zdHlsZSI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMzUwcHg7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3I6ICM0MjQyNDI7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgICNzdGVwcyB7CiAgICAgICAgaGVpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbjogMCAwIDAgLTE1cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBwYWRkaW5nOiAwIDVweDsgLyogc28gdGhlIHNsaWRlciBrbm9iIGRvZXNuJ3QgYnV0dCBvdXQgKi8KICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWF1ZGlvLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBpZD0icnVucy1zZWxlY3RvciIgc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPjwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBhdWRpbyBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBhdWRpbyBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1hdWRpby1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiBydW49IltbaXRlbS5ydW5dXSIgdGFnPSJbW2l0ZW0udGFnXV0iIHNhbXBsZT0iW1tpdGVtLnNhbXBsZV1dIiB0b3RhbC1zYW1wbGVzPSJbW2l0ZW0udG90YWxTYW1wbGVzXV0iIHRhZy1tZXRhZGF0YT0iW1tfdGFnTWV0YWRhdGEoX3J1blRvVGFnSW5mbywgaXRlbS5ydW4sIGl0ZW0udGFnKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iPjwvdGYtYXVkaW8tbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24tYXV0b2dyb3ctdGV4dGFyZWEiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkOwogICAgICAgIHBhZGRpbmc6IDJweDsKICAgICAgICAtbW96LWFwcGVhcmFuY2U6IHRleHRhcmVhOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogdGV4dGFyZWE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLm1pcnJvci10ZXh0IHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgcmVzaXplOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgLyogc2VlIGNvbW1lbnRzIGluIHRlbXBsYXRlICovCiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdDsKICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0OwogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTo6LW1vei1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0taXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYS1wbGFjZWhvbGRlcjsKICAgICAgfQoKICAgICAgdGV4dGFyZWE6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIAogICAgCiAgICA8ZGl2IGlkPSJtaXJyb3IiIGNsYXNzPSJtaXJyb3ItdGV4dCIgYXJpYS1oaWRkZW49InRydWUiPiZuYnNwOzwvZGl2PgoKICAgIAogICAgPGRpdiBjbGFzcz0idGV4dGFyZWEtY29udGFpbmVyIGZpdCI+CiAgICAgIDx0ZXh0YXJlYSBpZD0idGV4dGFyZWEiIG5hbWUkPSJbW25hbWVdXSIgYXJpYS1sYWJlbCQ9IltbbGFiZWxdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgcGxhY2Vob2xkZXIkPSJbW3BsYWNlaG9sZGVyXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIHJvd3MkPSJbW3Jvd3NdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSI+PC90ZXh0YXJlYT4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItdGV4dGFyZWEiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgbGFiZWwgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pbnB1dC1jb250YWluZXIgbm8tbGFiZWwtZmxvYXQkPSJbW25vTGFiZWxGbG9hdF1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsKGFsd2F5c0Zsb2F0TGFiZWwscGxhY2Vob2xkZXIpXV0iIGF1dG8tdmFsaWRhdGUkPSJbW2F1dG9WYWxpZGF0ZV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaW52YWxpZD0iW1tpbnZhbGlkXV0iPgoKICAgICAgPGxhYmVsIGhpZGRlbiQ9IltbIWxhYmVsXV0iIGFyaWEtaGlkZGVuPSJ0cnVlIiBmb3IkPSJbW19pbnB1dElkXV0iIHNsb3Q9ImxhYmVsIj5bW2xhYmVsXV08L2xhYmVsPgoKICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3M9InBhcGVyLWlucHV0LWlucHV0IiBzbG90PSJpbnB1dCIgaWQkPSJbW19pbnB1dElkXV0iIGFyaWEtbGFiZWxsZWRieSQ9IltbX2FyaWFMYWJlbGxlZEJ5XV0iIGFyaWEtZGVzY3JpYmVkYnkkPSJbW19hcmlhRGVzY3JpYmVkQnldXSIgYmluZC12YWx1ZT0ie3t2YWx1ZX19IiBpbnZhbGlkPSJ7e2ludmFsaWR9fSIgdmFsaWRhdG9yJD0iW1t2YWxpZGF0b3JdXSIgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIGF1dG9jb21wbGV0ZSQ9IltbYXV0b2NvbXBsZXRlXV0iIGF1dG9mb2N1cyQ9IltbYXV0b2ZvY3VzXV0iIGlucHV0bW9kZSQ9IltbaW5wdXRtb2RlXV0iIG5hbWUkPSJbW25hbWVdXSIgcGxhY2Vob2xkZXIkPSJbW3BsYWNlaG9sZGVyXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgYXV0b2NhcGl0YWxpemUkPSJbW2F1dG9jYXBpdGFsaXplXV0iIHJvd3MkPSJbW3Jvd3NdXSIgbWF4LXJvd3MkPSJbW21heFJvd3NdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiPjwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlcnJvck1lc3NhZ2VdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWVycm9yIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIiBzbG90PSJhZGQtb24iPltbZXJyb3JNZXNzYWdlXV08L3BhcGVyLWlucHV0LWVycm9yPgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJDb3VudGVyXV0iPgogICAgICAgIDxwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgc2xvdD0iYWRkLW9uIj48L3BhcGVyLWlucHV0LWNoYXItY291bnRlcj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItdG9hc3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2FzdC1iYWNrZ3JvdW5kLWNvbG9yLCAjMzIzMjMyKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9hc3QtY29sb3IsICNmMWYxZjEpOwogICAgICAgIG1pbi1oZWlnaHQ6IDQ4cHg7CiAgICAgICAgbWluLXdpZHRoOiAyODhweDsKICAgICAgICBwYWRkaW5nOiAxNnB4IDI0cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3gtc2hhZG93OiAwIDJweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMjYpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBtYXJnaW46IDEycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuM3MsIG9wYWNpdHkgMC4zczsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcywgb3BhY2l0eSAwLjNzOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwcHgpOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDBweCk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNhcHN1bGUpIHsKICAgICAgICBib3JkZXItcmFkaXVzOiAyNHB4OwogICAgICB9CgogICAgICA6aG9zdCguZml0LWJvdHRvbSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1pbi13aWR0aDogMDsKICAgICAgICBib3JkZXItcmFkaXVzOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQoKICAgICAgOmhvc3QoLnBhcGVyLXRvYXN0LW9wZW4pIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNwYW4gaWQ9ImxhYmVsIj57e3RleHR9fTwvc3Bhbj4KICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10b2dnbGUtYnV0dG9uIj4KICA8dGVtcGxhdGUgc3RyaXAtd2hpdGVzcGFjZT4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6bm9uZTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1iYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIG9wYWNpdHk6IDAuNDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIGxpbmVhciAuMDhzOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhci1jb2xvciwgIzAwMDAwMCk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhcjsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1idXR0b24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IC0zcHg7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC42KTsKICAgICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSBsaW5lYXIgLjA4cywgYmFja2dyb3VuZC1jb2xvciBsaW5lYXIgLjA4czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gbGluZWFyIC4wOHMsIGJhY2tncm91bmQtY29sb3IgbGluZWFyIC4wOHM7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLXVuY2hlY2tlZC1idXR0b24tY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNTApKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi11bmNoZWNrZWQtYnV0dG9uOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbi5kcmFnZ2luZyB7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBub25lOwogICAgICAgIHRyYW5zaXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjaGVja2VkXTpub3QoW2Rpc2FibGVkXSkpIC50b2dnbGUtYmFyIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJhci1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYmFyOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudG9nZ2xlLWJhciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKICAgICAgICBvcGFjaXR5OiAwLjEyOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDE2cHgsIDApOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDE2cHgsIDApOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF06bm90KFtkaXNhYmxlZF0pKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJ1dHRvbi1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2JkYmRiZDsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAudG9nZ2xlLWluayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogLTE0cHg7CiAgICAgICAgbGVmdDogLTE0cHg7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgYm90dG9tOiBhdXRvOwogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluazsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAudG9nZ2xlLWluayB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWluazsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDM2cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICAgIC8qIFRoZSB0b2dnbGUgYnV0dG9uIGhhcyBhbiBhYnNvbHV0ZSBwb3NpdGlvbiBvZiAtM3B4OyBUaGUgZXh0cmEgMXB4CiAgICAgICAgLyogYWNjb3VudHMgZm9yIHRoZSB0b2dnbGUgYnV0dG9uIHNoYWRvdyBib3guICovCiAgICAgICAgbWFyZ2luOiA0cHggMXB4OwogICAgICB9CgogICAgICAudG9nZ2xlLWxhYmVsIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWxhYmVsLXNwYWNpbmcsIDhweCk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICAvKiBpbnZhbGlkIHN0YXRlICovCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1iYXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1iYXItY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1idXR0b24gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1idXR0b24tY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1pbmsgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWludmFsaWQtaW5rLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJ0b2dnbGVCYXIiIGNsYXNzPSJ0b2dnbGUtYmFyIj48L2Rpdj4KICAgICAgPGRpdiBpZD0idG9nZ2xlQnV0dG9uIiBjbGFzcz0idG9nZ2xlLWJ1dHRvbiI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJ0b2dnbGUtbGFiZWwiPjxzbG90Pjwvc2xvdD48L2Rpdj4KCiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1taW5pbWFwIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgbGluZWFyOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdCguaGlkZGVuKSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgY2FudmFzIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OwogICAgICB9CgogICAgICByZWN0IHsKICAgICAgICBmaWxsOiB3aGl0ZTsKICAgICAgICBzdHJva2U6ICMxMTExMTE7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxcHg7CiAgICAgICAgZmlsbC1vcGFjaXR5OiAwOwogICAgICAgIGZpbHRlcjogdXJsKCNtaW5pbWFwRHJvcFNoYWRvdyk7CiAgICAgICAgY3Vyc29yOiBtb3ZlOwogICAgICB9CgogICAgICBzdmcgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzdmc+CiAgICAgIDxkZWZzPgogICAgICAgIDxmaWx0ZXIgaWQ9Im1pbmltYXBEcm9wU2hhZG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTUwJSIgaGVpZ2h0PSIxNTAlIj4KICAgICAgICAgIDxmZW9mZnNldCByZXN1bHQ9Im9mZk91dCIgaW49IlNvdXJjZUdyYXBoaWMiIGR4PSIxIiBkeT0iMSI+PC9mZW9mZnNldD4KICAgICAgICAgIDxmZWNvbG9ybWF0cml4IHJlc3VsdD0ibWF0cml4T3V0IiBpbj0ib2ZmT3V0IiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMC4xIDAgMCAwIDAgMCAwLjEgMCAwIDAgMCAwIDAuMSAwIDAgMCAwIDAgMC41IDAiPjwvZmVjb2xvcm1hdHJpeD4KICAgICAgICAgIDxmZWdhdXNzaWFuYmx1ciByZXN1bHQ9ImJsdXJPdXQiIGluPSJtYXRyaXhPdXQiIHN0ZGRldmlhdGlvbj0iMiI+PC9mZWdhdXNzaWFuYmx1cj4KICAgICAgICAgIDxmZWJsZW5kIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImJsdXJPdXQiIG1vZGU9Im5vcm1hbCI+PC9mZWJsZW5kPgogICAgICAgIDwvZmlsdGVyPgogICAgICA8L2RlZnM+CiAgICAgIDxyZWN0PjwvcmVjdD4KICAgIDwvc3ZnPgogICAgPGNhbnZhcyBjbGFzcz0iZmlyc3QiPjwvY2FudmFzPgogICAgCiAgICA8Y2FudmFzIGNsYXNzPSJzZWNvbmQiPjwvY2FudmFzPgogICAgPGNhbnZhcyBjbGFzcz0iZG93bmxvYWQiPjwvY2FudmFzPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLXNjZW5lIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNzdmcgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgZm9udC1mYW1pbHk6IFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2hpZGRlbiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyogLS0tIE5vZGUgYW5kIGFubm90YXRpb24tbm9kZSBmb3IgTWV0YW5vZGUgLS0tICovCgogICAgICAubWV0YSA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubWV0YSA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogaHNsKDAsIDAlLCA3MCUpOwogICAgICB9CiAgICAgIC5ub2RlLm1ldGEuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgICAgLm5vZGUubWV0YS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLmFubm90YXRpb24ubWV0YS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAuYW5ub3RhdGlvbi5tZXRhLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgfQogICAgICAubWV0YS5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubWV0YS5zZWxlY3RlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubm9kZS5tZXRhLnNlbGVjdGVkLmV4cGFuZGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIHN0cm9rZTogcmVkOwogICAgICAgIHN0cm9rZS13aWR0aDogMzsKICAgICAgfQogICAgICAuYW5ub3RhdGlvbi5tZXRhLnNlbGVjdGVkID4gLm5vZGVzaGFwZSA+IHJlY3QsCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CiAgICAgIC5ub2RlLm1ldGEuc2VsZWN0ZWQuZXhwYW5kZWQuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZC5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCwKICAgICAgLmZhZGVkIHJlY3QsCiAgICAgIC5mYWRlZCBlbGxpcHNlLAogICAgICAuZmFkZWQgcGF0aCwKICAgICAgLmZhZGVkIHVzZSwKICAgICAgI3JlY3RIYXRjaCBsaW5lLAogICAgICAjZWxsaXBzZUhhdGNoIGxpbmUgewogICAgICAgIGNvbG9yOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBwYXRoIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweCAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuZmFkZWQgcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBlbGxpcHNlLAogICAgICAuZmFkZWQgdXNlIHsKICAgICAgICBmaWxsOiB1cmwoI2VsbGlwc2VIYXRjaCkgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLmZhZGVkIHRleHQgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC8qIFJ1bGVzIHVzZWQgZm9yIGlucHV0LXRyYWNpbmcuICovCiAgICAgIC5pbnB1dC1oaWdobGlnaHQgPiAqID4gcmVjdCwKICAgICAgLmlucHV0LWhpZ2hsaWdodCA+ICogPiBlbGxpcHNlLAogICAgICAuaW5wdXQtaGlnaGxpZ2h0ID4gKiA+IHVzZSB7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZmY5ODAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qICAtIEZhZGVkIG5vbi1pbnB1dCBzdHlsaW5nICovCiAgICAgIC5ub24taW5wdXQgPiAqID4gcmVjdCwKLm5vbi1pbnB1dCA+ICogPiBlbGxpcHNlLAoubm9uLWlucHV0ID4gKiA+IHVzZSwKLyogRm9yIENvbnN0IG5vZGVzLiAqLwoubm9uLWlucHV0ID4gKiA+IC5jb25zdGFudDpub3QoW2NsYXNzKj0iaW5wdXQtaGlnaGxpZ2h0Il0pID4KICAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSwKLyogRm9yIHN0eWxpbmcgb2YgYW5ub3RhdGlvbiBub2RlcyBvZiBub24taW5wdXQgbm9kZXMuICovCi5ub24taW5wdXQgPiBnID4gLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiBpbmhlcml0OwogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIC5ub24taW5wdXQgcGF0aCB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAubm9uLWlucHV0ID4gLm5vZGVzaGFwZSA+IHJlY3QsCi5ub24taW5wdXQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCwKLyogRm9yIHN0eWxpbmcgb2YgYW5ub3RhdGlvbiBub2RlcyBvZiBub24taW5wdXQgbm9kZXMuICovCi5ub24taW5wdXQgPiBnID4gLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5ub24taW5wdXQgZWxsaXBzZSwKICAgICAgLm5vbi1pbnB1dCB1c2UgewogICAgICAgIGZpbGw6IHVybCgjZWxsaXBzZUhhdGNoKSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAubm9uLWlucHV0ID4gdGV4dCB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLm5vbi1pbnB1dCAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgICB9CgogICAgICAubm9uLWlucHV0IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZS5yZWZsaW5lIHsKICAgICAgICBtYXJrZXItc3RhcnQ6IHVybCgjcmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgICAgfQoKICAgICAgLyogSW5wdXQgZWRnZXMuICovCiAgICAgIC5pbnB1dC1lZGdlLWhpZ2hsaWdodCA+IHRleHQgewogICAgICAgIGZpbGw6IGJsYWNrICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgLmlucHV0LWhpZ2hsaWdodCA+IC5pbi1hbm5vdGF0aW9ucyA+IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZSwKICAgICAgLmlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZAogICAgICAgID4gLmluLWFubm90YXRpb25zCiAgICAgICAgPiAuYW5ub3RhdGlvbgogICAgICAgID4gLmFubm90YXRpb24tZWRnZSB7CiAgICAgICAgc3Ryb2tlOiAjOTk5ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIE5vbi1pbnB1dCBlZGdlcy4gKi8KICAgICAgLm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCwKLm5vbi1pbnB1dCA+IGcgPiAuYW5ub3RhdGlvbiA+IHBhdGgsCi8qIEFubm90YXRpb24gc3R5bGVzIChsYWJlbCBhbmQgZWRnZXMgcmVzcGVjdGl2ZWx5KS4gKi8KLm5vbi1pbnB1dCA+IGcgPgouYW5ub3RhdGlvbjpub3QoLmlucHV0LWhpZ2hsaWdodCk6bm90KC5pbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQpID4KLmFubm90YXRpb24tbGFiZWwKLyouYW5ub3RhdGlvbi1lZGdlKi8KIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qIC0tLSBPcCBOb2RlIC0tLSAqLwoKICAgICAgLm9wID4gLm5vZGVzaGFwZSA+IC5ub2RlY29sb3J0YXJnZXQsCiAgICAgIC5vcCA+IC5hbm5vdGF0aW9uLW5vZGUgPiAubm9kZWNvbG9ydGFyZ2V0IHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgICBzdHJva2U6ICNjY2M7CiAgICAgIH0KCiAgICAgIC5vcC5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiAubm9kZWNvbG9ydGFyZ2V0LAogICAgICAub3Auc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gLm5vZGVjb2xvcnRhcmdldCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CgogICAgICAub3AuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gLm5vZGVjb2xvcnRhcmdldCwKICAgICAgLm9wLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IC5ub2RlY29sb3J0YXJnZXQgewogICAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgICAgfQoKICAgICAgLyogLS0tIFNlcmllcyBOb2RlIC0tLSAqLwoKICAgICAgLyogQnkgZGVmYXVsdCwgZG9uJ3Qgc2hvdyB0aGUgc2VyaWVzIGJhY2tncm91bmQgPHJlY3Q+LiAqLwogICAgICAuc2VyaWVzID4gLm5vZGVzaGFwZSA+IHJlY3QgewogICAgICAgIGZpbGw6IGhzbCgwLCAwJSwgNzAlKTsKICAgICAgICBmaWxsLW9wYWNpdHk6IDA7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogNSwgNTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC8qIE9uY2UgZXhwYW5kZWQsIHNob3cgdGhlIHNlcmllcyBiYWNrZ3JvdW5kIDxyZWN0PiBhbmQgaGlkZSB0aGUgPHVzZT4uICovCiAgICAgIC5zZXJpZXMuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgICAgZmlsbC1vcGFjaXR5OiAwLjE1OwogICAgICAgIHN0cm9rZTogaHNsKDAsIDAlLCA3MCUpOwogICAgICAgIHN0cm9rZS1vcGFjaXR5OiAxOwogICAgICB9CiAgICAgIC5zZXJpZXMuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gdXNlIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qKgogKiBUT0RPOiBTaW1wbGlmeSB0aGlzIGJ5IGFwcGx5aW5nIGEgc3RhYmxlIGNsYXNzIG5hbWUgdG8gYWxsIDxnPgogKiBlbGVtZW50cyB0aGF0IGN1cnJlbnRseSBoYXZlIGVpdGhlciB0aGUgbm9kZXNoYXBlIG9yIGFubm90YXRpb24tbm9kZSBjbGFzc2VzLgogKi8KICAgICAgLnNlcmllcyA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6ICNjY2M7CiAgICAgIH0KICAgICAgLnNlcmllcy5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMuaGlnaGxpZ2h0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLnNlcmllcy5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KCiAgICAgIC5zZXJpZXMuc2VsZWN0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbi5zZXJpZXMuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBCcmlkZ2UgTm9kZSAtLS0gKi8KICAgICAgLmJyaWRnZSA+IC5ub2Rlc2hhcGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6ICNmMGY7CiAgICAgICAgb3BhY2l0eTogMC4yOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBTdHJ1Y3R1cmFsIEVsZW1lbnRzIC0tLSAqLwogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUuc3RydWN0dXJhbCB7CiAgICAgICAgc3Ryb2tlOiAjZjBmOwogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiBSZWZlcmVuY2UgRWRnZSAqLwogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUucmVmZXJlbmNlZWRnZSB7CiAgICAgICAgc3Ryb2tlOiAjZmZiNzRkOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBTZXJpZXMgTm9kZXMgLS0tICovCgogICAgICAvKiBIaWRlIHRoZSByZWN0IGZvciBhIHNlcmllcycgYW5ub3RhdGlvbi4gKi8KICAgICAgLnNlcmllcyA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiAtLS0gTm9kZSBsYWJlbCAtLS0gKi8KCiAgICAgIC5ub2RlID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmaWxsOiAjNDQ0OwogICAgICB9CgogICAgICAubWV0YS5leHBhbmRlZCA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDlweDsKICAgICAgfQoKICAgICAgLnNlcmllcyA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDhweDsKICAgICAgfQoKICAgICAgLm9wID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogNnB4OwogICAgICB9CgogICAgICAuYnJpZGdlID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5ub2RlLm1ldGEuZXhwYW5kZWQgPiB0ZXh0Lm5vZGVsYWJlbCB7CiAgICAgICAgY3Vyc29yOiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuaGlnaGxpZ2h0ZWQgPiB0ZXh0LmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZpbGw6ICM1MGEzZjc7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiB0ZXh0LmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZpbGw6ICM0Mjg1ZjQ7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBBbm5vdGF0aW9uIC0tLSAqLwoKICAgICAgLyogb25seSBhcHBsaWVkIGZvciBhbm5vdGF0aW9ucyB0aGF0IGFyZSBub3Qgc3VtbWFyeSBvciBjb25zdGFudC4KKC5zdW1tYXJ5LCAuY29uc3RhbnQgZ2V0cyBvdmVycmlkZGVuIGJlbG93KSAqLwogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLW5vZGUgPiAqIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDAuNTsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiAxLCAxOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbi5zdW1tYXJ5ID4gLmFubm90YXRpb24tbm9kZSA+ICosCiAgICAgIC5hbm5vdGF0aW9uLmNvbnN0YW50ID4gLmFubm90YXRpb24tbm9kZSA+ICogewogICAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiBub25lOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjYWFhOwogICAgICAgIHN0cm9rZS13aWR0aDogMC41OwogICAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQpOwogICAgICB9CgogICAgICAuZmFkZWQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlIHsKICAgICAgICBtYXJrZXItZW5kOiB1cmwoI2Fubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgICAgfQoKICAgICAgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICAgIG1hcmtlci1zdGFydDogdXJsKCNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQpOwogICAgICB9CgogICAgICAuZmFkZWQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICAgIG1hcmtlci1zdGFydDogdXJsKCNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWNvbnRyb2wtZWRnZSB7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMSwgMTsKICAgICAgfQoKICAgICAgI2Fubm90YXRpb24tYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjYWFhOwogICAgICB9CgogICAgICAjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQgewogICAgICAgIGZpbGw6ICNlMGQ0YjM7CiAgICAgIH0KCiAgICAgICNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQgewogICAgICAgIGZpbGw6ICNhYWE7CiAgICAgIH0KCiAgICAgICNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQgewogICAgICAgIGZpbGw6ICNlMGQ0YjM7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogNXB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWxhYmVsLmFubm90YXRpb24tZWxsaXBzaXMgewogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgLyogSGlkZSBhbm5vdGF0aW9ucyBvbiBleHBhbmRlZCBtZXRhIG5vZGVzIHNpbmNlIHRoZXkncmUgcmVkdW5kYW50LiAqLwogICAgICAuZXhwYW5kZWQgPiAuaW4tYW5ub3RhdGlvbnMsCiAgICAgIC5leHBhbmRlZCA+IC5vdXQtYW5ub3RhdGlvbnMgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBBbm5vdGF0aW9uOiBDb25zdGFudCAtLS0gKi8KCiAgICAgIC5jb25zdGFudCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjODQ4NDg0OwogICAgICB9CgogICAgICAuY29uc3RhbnQuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSB7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgIH0KCiAgICAgIC5jb25zdGFudC5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgICAgfQoKICAgICAgLyogLS0tIEFubm90YXRpb246IFN1bW1hcnkgLS0tICovCgogICAgICAuc3VtbWFyeSA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogI2RiNDQzNzsKICAgICAgICBzdHJva2U6ICNkYjQ0Mzc7CiAgICAgIH0KCiAgICAgIC5zdW1tYXJ5LnNlbGVjdGVkID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICAgIGZpbGw6ICNhNTI3MTQ7CiAgICAgICAgc3Ryb2tlOiAjYTUyNzE0OwogICAgICB9CgogICAgICAuc3VtbWFyeS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgICAgfQoKICAgICAgLyogLS0tIEVkZ2UgLS0tICovCgogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjYmJiOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDAuNzU7CiAgICAgIH0KCiAgICAgIC5lZGdlIC5zZWxlY3RhYmxlZWRnZSB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAuc2VsZWN0ZWRlZGdlID4gcGF0aC5lZGdlbGluZSB7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIHN0cm9rZTogI2YwMDsKICAgICAgfQoKICAgICAgLmVkZ2Uuc2VsZWN0ZWRlZGdlIHRleHQgewogICAgICAgIGZpbGw6ICMwMDA7CiAgICAgIH0KCiAgICAgIC8qIExhYmVscyBzaG93aW5nIHRlbnNvciBzaGFwZXMgb24gZWRnZXMgKi8KICAgICAgLmVkZ2UgPiB0ZXh0IHsKICAgICAgICBmb250LXNpemU6IDMuNXB4OwogICAgICAgIGZpbGw6ICM2NjY7CiAgICAgIH0KCiAgICAgIC5kYXRhZmxvdy1hcnJvd2hlYWQgewogICAgICAgIGZpbGw6ICNiYmI7CiAgICAgIH0KCiAgICAgIC5yZWZlcmVuY2UtYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjZmZiNzRkOwogICAgICB9CgogICAgICAuc2VsZWN0ZWQtYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjZjAwOwogICAgICB9CgogICAgICAuZWRnZSAuY29udHJvbC1kZXAgewogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDIsIDI7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBHcm91cCBub2RlIGV4cGFuZC9jb2xsYXBzZSBidXR0b24gLS0tICovCgogICAgICAvKiBIaWRlcyBleHBhbmQvY29sbGFwc2UgYnV0dG9ucyB3aGVuIGEgbm9kZSBpc24ndCBleHBhbmRlZCBvciBoaWdobGlnaHRlZC4gVXNpbmcKICAgaW5jcmVkaWJseSBzbWFsbCBvcGFjaXR5IHNvIHRoYXQgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgPGc+IHBhcmVudCBzdGlsbCB0YWtlcwogICB0aGlzIGNvbnRhaW5lciBpbnRvIGFjY291bnQgZXZlbiB3aGVuIGl0IGlzbid0IHZpc2libGUgKi8KICAgICAgLm5vZGU6bm90KC5oaWdobGlnaHRlZCk6bm90KC5leHBhbmRlZCkgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciB7CiAgICAgICAgb3BhY2l0eTogMC4wMTsKICAgICAgfQogICAgICAubm9kZS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgICAgLmJ1dHRvbmNpcmNsZSB7CiAgICAgICAgZmlsbDogI2U3ODExZDsKICAgICAgfQogICAgICAuYnV0dG9uY2lyY2xlOmhvdmVyIHsKICAgICAgICBmaWxsOiAjYjk2NzE3OwogICAgICB9CiAgICAgIC5leHBhbmRidXR0b24sCiAgICAgIC5jb2xsYXBzZWJ1dHRvbiB7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgfQogICAgICAvKiBEbyBub3QgbGV0IHRoZSBwYXRoIGVsZW1lbnRzIGluIHRoZSBidXR0b24gdGFrZSBwb2ludGVyIGZvY3VzICovCiAgICAgIC5ub2RlID4gLm5vZGVzaGFwZSA+IC5idXR0b25jb250YWluZXIgPiAuZXhwYW5kYnV0dG9uLAogICAgICAubm9kZSA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyID4gLmNvbGxhcHNlYnV0dG9uIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgICAvKiBPbmx5IHNob3cgdGhlIGV4cGFuZCBidXR0b24gd2hlbiBhIG5vZGUgaXMgY29sbGFwc2VkIGFuZCBvbmx5IHNob3cgdGhlCiAgIGNvbGxhcHNlIGJ1dHRvbiB3aGVuIGEgbm9kZSBpcyBleHBhbmRlZC4gKi8KICAgICAgLm5vZGUuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5leHBhbmRidXR0b24gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLm5vZGU6bm90KC5leHBhbmRlZCkgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5jb2xsYXBzZWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLXN0YXRzIHsKICAgICAgICBmb250LXNpemU6IDRweDsKICAgICAgICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwgcmVjdCB7CiAgICAgICAgZmlsdGVyOiB1cmwoI2hlYWx0aC1waWxsLXNoYWRvdyk7CiAgICAgICAgcng6IDM7CiAgICAgICAgcnk6IDM7CiAgICAgIH0KCiAgICAgIC50aXRsZUNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHRvcDogMjBweDsKICAgICAgfQoKICAgICAgLnRpdGxlLAogICAgICAuYXV4VGl0bGUsCiAgICAgIC5mdW5jdGlvbkxpYnJhcnlUaXRsZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICAjbWluaW1hcCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAyMHB4OwogICAgICAgIGJvdHRvbTogMjBweDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q0ZDRkNDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB1bCB7CiAgICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB1bCBsaSB7CiAgICAgICAgcGFkZGluZzogNHB4IDE2cHg7CiAgICAgIH0KCiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0idGl0bGVDb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJ0aXRsZSIgY2xhc3M9InRpdGxlIj5NYWluIEdyYXBoPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImF1eFRpdGxlIiBjbGFzcz0iYXV4VGl0bGUiPkF1eGlsaWFyeSBOb2RlczwvZGl2PgogICAgICA8ZGl2IGlkPSJmdW5jdGlvbkxpYnJhcnlUaXRsZSIgY2xhc3M9ImZ1bmN0aW9uTGlicmFyeVRpdGxlIj4KICAgICAgICBGdW5jdGlvbnMKICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdmcgaWQ9InN2ZyI+CiAgICAgIDxkZWZzPgogICAgICAgIAogICAgICAgIDxwYXRoIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXBhdGgiIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIgLz4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1zbWFsbCIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iNSIgbWFya2VyaGVpZ2h0PSI1IiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3JlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1tZWRpdW0iIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjEzIiBtYXJrZXJoZWlnaHQ9IjEzIiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3JlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1sYXJnZSIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iMTYiIG1hcmtlcmhlaWdodD0iMTYiIHJlZng9IjIiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIiBtYXJrZXJ1bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgY2xhc3M9InJlZmVyZW5jZS1hcnJvd2hlYWQiIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXhsYXJnZSIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iMjAiIG1hcmtlcmhlaWdodD0iMjAiIHJlZng9IjIiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIiBtYXJrZXJ1bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgoKICAgICAgICAKICAgICAgICA8cGF0aCBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLXBhdGgiIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIgLz4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtc21hbGwiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iMiIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiIG1hcmtlcnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbWVkaXVtIiB2aWV3Ym94PSIwIDAgMTAgMTAiIG1hcmtlcndpZHRoPSIxMyIgbWFya2VyaGVpZ2h0PSIxMyIgcmVmeD0iMiIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiIG1hcmtlcnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbGFyZ2UiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjE2IiBtYXJrZXJoZWlnaHQ9IjE2IiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgY2xhc3M9ImRhdGFmbG93LWFycm93aGVhZCIgaWQ9ImRhdGFmbG93LWFycm93aGVhZC14bGFyZ2UiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjIwIiBtYXJrZXJoZWlnaHQ9IjIwIiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgoKICAgICAgICAKICAgICAgICA8bWFya2VyIGlkPSJhbm5vdGF0aW9uLWFycm93aGVhZCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iNSIgcmVmeT0iMi41IiBvcmllbnQ9ImF1dG8iPgogICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCA1LDIuNSBMIDAsNSBMIDAsMCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGlkPSJhbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iNSIgcmVmeT0iMi41IiBvcmllbnQ9ImF1dG8iPgogICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCA1LDIuNSBMIDAsNSBMIDAsMCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGlkPSJyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQiIG1hcmtlcndpZHRoPSI1IiBtYXJrZXJoZWlnaHQ9IjUiIHJlZng9IjAiIHJlZnk9IjIuNSIgb3JpZW50PSJhdXRvIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0gNSwwIEwgMCwyLjUgTCA1LDUgTCA1LDAiIC8+CiAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgPG1hcmtlciBpZD0icmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkIiBtYXJrZXJ3aWR0aD0iNSIgbWFya2VyaGVpZ2h0PSI1IiByZWZ4PSIwIiByZWZ5PSIyLjUiIG9yaWVudD0iYXV0byI+CiAgICAgICAgICA8cGF0aCBkPSJNIDUsMCBMIDAsMi41IEwgNSw1IEwgNSwwIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLXN0YW1wIiByeD0iNy41IiByeT0iMyIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHJ4PSI1IiByeT0iMiIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtdmVydGljYWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iOSIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjYiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSIzIiAvPgogICAgICAgIDwvZz4KICAgICAgICAKICAgICAgICA8ZyBpZD0ib3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTYiIHk9IjQiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxMiIgeT0iNCIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjQiIC8+CiAgICAgICAgPC9nPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtYW5ub3RhdGlvbi1zdGFtcCI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjkiIHk9IjIiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjciIHk9IjIiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjUiIHk9IjIiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxzdmcgaWQ9InN1bW1hcnktaWNvbiIgZmlsbD0iIzg0ODQ4NCIgaGVpZ2h0PSIxMiIgdmlld2JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMTIiPgogICAgICAgICAgPHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIgLz4KICAgICAgICA8L3N2Zz4KCiAgICAgICAgCiAgICAgICAgPHBhdHRlcm4gaWQ9InJlY3RIYXRjaCIgcGF0dGVybnRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiIHdpZHRoPSI1IiBoZWlnaHQ9IjUiIHBhdHRlcm51bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiIC8+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIDxwYXR0ZXJuIGlkPSJlbGxpcHNlSGF0Y2giIHBhdHRlcm50cmFuc2Zvcm09InJvdGF0ZSg0NSAwIDApIiB3aWR0aD0iMiIgaGVpZ2h0PSIyIiBwYXR0ZXJudW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDxsaW5lIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIyIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxIiAvPgogICAgICAgIDwvcGF0dGVybj4KCiAgICAgICAgCiAgICAgICAgPGZpbHRlciBpZD0iaGVhbHRoLXBpbGwtc2hhZG93IiB4PSItNDAlIiB5PSItNDAlIiB3aWR0aD0iMTgwJSIgaGVpZ2h0PSIxODAlIj4KICAgICAgICAgIDxmZWdhdXNzaWFuYmx1ciBpbj0iU291cmNlQWxwaGEiIHN0ZERldmlhdGlvbj0iMC44IiAvPgogICAgICAgICAgPGZlb2Zmc2V0IGR4PSIwIiBkeT0iMCIgcmVzdWx0PSJvZmZzZXRibHVyIiAvPgogICAgICAgICAgPGZlZmxvb2QgZmxvb2QtY29sb3I9IiMwMDAwMDAiIC8+CiAgICAgICAgICA8ZmVjb21wb3NpdGUgaW4yPSJvZmZzZXRibHVyIiBvcGVyYXRvcj0iaW4iIC8+CiAgICAgICAgICA8ZmVtZXJnZT4KICAgICAgICAgICAgPGZlbWVyZ2Vub2RlIC8+CiAgICAgICAgICAgIDxmZW1lcmdlbm9kZSBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgICAgICAgIDwvZmVtZXJnZT4KICAgICAgICA8L2ZpbHRlcj4KICAgICAgPC9kZWZzPgogICAgICAKICAgICAgPHJlY3QgZmlsbD0id2hpdGUiIHdpZHRoPSIxMDAwMCIgaGVpZ2h0PSIxMDAwMCI+PC9yZWN0PgogICAgICA8ZyBpZD0icm9vdCI+PC9nPgogICAgPC9zdmc+CiAgICA8dGYtZ3JhcGgtbWluaW1hcCBpZD0ibWluaW1hcCI+PC90Zi1ncmFwaC1taW5pbWFwPgogICAgPGRpdiBpZD0iY29udGV4dE1lbnUiIGNsYXNzPSJjb250ZXh0LW1lbnUiPjwvZGl2PgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgIH0KCiAgICAgIC52ZXJ0aWNhbCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIEBhcHBseSAtLWxheW91dC12ZXJ0aWNhbDsKICAgICAgfQoKICAgICAgLmF1dG8gewogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LWF1dG87CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICBwYXBlci1idXR0b24gewogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgPGRpdiBjbGFzcz0idmVydGljYWwiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1t0aXRsZV1dIj4KICAgICAgICAgIDxoMj5bW3RpdGxlXV08L2gyPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRmLWdyYXBoLXNjZW5lIGlkPSJzY2VuZSIgY2xhc3M9ImF1dG8iIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iIGhpZ2hsaWdodGVkLW5vZGU9IltbX2dldFZpc2libGUoaGlnaGxpZ2h0ZWROb2RlKV1dIiBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiBzZWxlY3RlZC1lZGdlPSJ7e3NlbGVjdGVkRWRnZX19IiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHByb2dyZXNzPSJbW3Byb2dyZXNzXV0iIG5vZGUtY29udGV4dC1tZW51LWl0ZW1zPSJbW25vZGVDb250ZXh0TWVudUl0ZW1zXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0ie3toZWFsdGhQaWxsU3RlcEluZGV4fX0iIGhhbmRsZS1lZGdlLXNlbGVjdGVkPSJbW2hhbmRsZUVkZ2VTZWxlY3RlZF1dIiB0cmFjZS1pbnB1dHM9IltbdHJhY2VJbnB1dHNdXSI+PC90Zi1ncmFwaC1zY2VuZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9ImNvbnRpbnVlLWJ1dHRvbiIgb24tY2xpY2s9Il9jb250aW51ZUJ1dHRvbkNhbGxiYWNrIj4KICAgICAgPHNwYW4+W1tfY29udGludWVCdXR0b25UZXh0XV08L3NwYW4+CiAgICA8L3BhcGVyLWJ1dHRvbj4KICAgIDxwYXBlci1kaWFsb2cgd2l0aC1iYWNrZHJvcCBpZD0iY29udGludWVEaWFsb2ciPgogICAgICA8aDI+Q29udGludWUuLi48L2gyPgogICAgICA8ZGl2IGNsYXNzPSJjb250aW51ZS10by10eXBlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250aW51ZS10by10eXBlLW5hbWUiPgogICAgICAgICAgT3ZlciBTZXNzaW9uIFJ1bnM6CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJjb250aW51ZU51bSIgY2xhc3M9ImlucHV0LWJveCIgbGFiZWw9Ik51bWJlciBvZiBTZXNzaW9uIFJ1bnMgKGluY2x1ZGluZyB0aGUgY3VycmVudCBvbmUpOiIgYWx3YXlzLWZsb2F0LWxhYmVsIHR5cGU9Im51bWJlciIgbWluPSIxIiBzdGVwPSIxIiB2YWx1ZT0ie3tjb250aW51ZU51bX19Ij48L3BhcGVyLWlucHV0PgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0iZ28tYnV0dG9uIiBpY29uPSJhcnJvdy1mb3J3YXJkIiB0aXRsZT0iU2Vzc2lvbiBSdW5zIEdvIiBvbi10YXA9Il9zZXNzaW9uUnVuR29CdXR0b25DYWxsYmFjayI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRpbnVlLXRvLXR5cGUiPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRpbnVlLXRvLXR5cGUtbmFtZSI+CiAgICAgICAgICBUaWxsIENvbmRpdGlvbiBNZXQgYnkgV2F0Y2hlZCBUZW5zb3IKICAgICAgICA8L2Rpdj4KICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBpZD0idGVuc29yQ29uZGl0aW9uRHJvcGRvd24iIGNsYXNzPSJpbnB1dC1ib3giIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0iVGVuc29yIENvbmRpdGlvbiIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfc2VsZWN0ZWRUZW5zb3JDb25kaXRpb259fSI+CiAgICAgICAgICAKICAgICAgICAgIDxwYXBlci1saXN0Ym94IGlkPSJ0ZW5zb3JDb25kaXRpb25NZW51IiBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5Db250YWlucyArLy3iiJ4gb3IgTmFOPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+Q29udGFpbnMgKy8t4oiePC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+Q29udGFpbnMgTmFOPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWF4ICZndDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5NYXggJmx0OzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPk1pbiAmZ3Q7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWluICZsdDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5NYXggLSBNaW4gJmd0OzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPk1heCAtIE1pbiAmbHQ7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWVhbiAmZ3Q7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWVhbiAmbHQ7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+U3RhbmRhcmQgZGV2aWF0aW9uICZndDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5TdGFuZGFyZCBkZXZpYXRpb24gJmx0OzwvcGFwZXItaXRlbT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGNsYXNzPSJnby1idXR0b24iIGljb249ImFycm93LWZvcndhcmQiIHRpdGxlPSJUZW5zb3IgQ29uZGl0aW9uIEdvIiBvbi10YXA9Il90ZW5zb3JDb250aW51ZUdvQnV0dG9uQ2FsbGJhY2siPgogICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJyZWYtdmFsdWUiIGNsYXNzPSJpbnB1dC1ib3giIGxhYmVsPSJSZWZlcmVuY2UgdmFsdWUgdG8gY29tcGFyZSB0byIgdHlwZT0ibnVtYmVyIiB2YWx1ZT0ie3tfdGVuc29yQ29uZGl0aW9uUmVmVmFsdWV9fSIgaGlkZGVuPSJbW19pc1JlZlZhbHVlSW5wdXRIaWRkZW5dXSI+CiAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IC5jb250aW51ZS10by10eXBlLW5hbWUgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIDpob3N0IHBhcGVyLWRpYWxvZyB7CiAgICAgICAgd2lkdGg6IDM2dnc7CiAgICAgIH0KICAgICAgOmhvc3QgLmlucHV0LWJveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogODAlOwogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgfQogICAgICA6aG9zdCAuZ28tYnV0dG9uIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDE1JTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWluaXRpYWwtZGlhbG9nIj4KICA8dGVtcGxhdGU+CiAgICAKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfb3Blbl1dIj4KICAgICAgPGRpdiBpZD0iZGFzaGJvYXJkLWJhY2tkcm9wIj48L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8cGFwZXItZGlhbG9nIGlkPSJkaWFsb2ciIG5vLWNhbmNlbC1vbi1vdXRzaWRlLWNsaWNrIG5vLWNhbmNlbC1vbi1lc2Mta2V5IG9wZW5lZD0ie3tfb3Blbn19Ij4KICAgICAgPGgyIGlkPSJkaWFsb2ctdGl0bGUiPltbX3RpdGxlXV08L2gyPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc0N1c3RvbU1lc3NhZ2VdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iY3VzdG9tLW1lc3NhZ2UiPltbX2N1c3RvbU1lc3NhZ2VdXTwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9oYXNDdXN0b21NZXNzYWdlXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWV4YW1wbGUtc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uLXRpdGxlIj4KICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvU2Vzc2lvbiIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+dGYuU2Vzc2lvbjwvYT46CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlLXNuaXBwZXQiPmltcG9ydCB0ZW5zb3JmbG93IGFzIHRmCmZyb20gdGVuc29yZmxvdy5weXRob24gaW1wb3J0IGRlYnVnIGFzIHRmX2RlYnVnCgpzZXNzID0gdGYuU2Vzc2lvbigpCnNlc3MgPSB0Zl9kZWJ1Zy5UZW5zb3JCb2FyZERlYnVnV3JhcHBlclNlc3Npb24oc2VzcywgIltbX2hvc3RdXTpbW19wb3J0XV0iKQpzZXNzLnJ1bihteV9mZXRjaGVzKQogICAgICAgICAgPC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1leGFtcGxlLXNlY3Rpb24tdGl0bGUiPgogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL3Byb2dyYW1tZXJzX2d1aWRlL2VzdGltYXRvcnMiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPkVzdGltYXRvcjwvYT4KICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL3RyYWluL01vbml0b3JlZFNlc3Npb24iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPk1vbml0b3JlZFNlc3Npb248L2E+OgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZS1zbmlwcGV0Ij5pbXBvcnQgdGVuc29yZmxvdyBhcyB0Zgpmcm9tIHRlbnNvcmZsb3cucHl0aG9uIGltcG9ydCBkZWJ1ZyBhcyB0Zl9kZWJ1ZwoKaG9vayA9IHRmX2RlYnVnLlRlbnNvckJvYXJkRGVidWdIb29rKCJbW19ob3N0XV06W1tfcG9ydF1dIikKbXlfZXN0aW1hdG9yLmZpdCh4PXhfZGF0YSwgeT15X2RhdGEsIHN0ZXBzPTEwMDAsIG1vbml0b3JzPVtob29rXSkKICAgICAgICAgICAgPC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1leGFtcGxlLXNlY3Rpb24tdGl0bGUiPgogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8va2VyYXMuaW8vbW9kZWxzL21vZGVsLyIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+S2VyYXMgTW9kZWw8L2E+OgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZS1zbmlwcGV0Ij5pbXBvcnQgdGVuc29yZmxvdyBhcyB0Zgpmcm9tIHRlbnNvcmZsb3cucHl0aG9uIGltcG9ydCBkZWJ1ZyBhcyB0Zl9kZWJ1ZwppbXBvcnQga2VyYXMKCmtlcmFzLmJhY2tlbmQuc2V0X3Nlc3Npb24oCiAgICB0Zl9kZWJ1Zy5UZW5zb3JCb2FyZERlYnVnV3JhcHBlclNlc3Npb24odGYuU2Vzc2lvbigpLCAiW1tfaG9zdF1dOltbX3BvcnRdXSIpKQojIERlZmluZSB5b3VyIGtlcmFzIG1vZGVsLCBjYWxsZWQgIm1vZGVsIi4KbW9kZWwuZml0KC4uLikKICAgICAgICAgICAgPC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvcGFwZXItZGlhbG9nPgogICAgPHN0eWxlPgogICAgICAvKiogV2UgcmVseSBvbiBhIHNlcGFyYXRlIGBfaGlkZGVuYCBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRpcmVjdGx5IG1ha2luZyB1c2UKICAgICAgICAgIG9mIHRoZSBgX29wZW5gIGF0dHJpYnV0ZSBiZWNhdXNlIHRoaXMgQ1NTIHNwZWNpZmljYXRpb24gbWF5IHN0cmFuZ2VseQogICAgICAgICAgYWZmZWN0IG90aGVyIGVsZW1lbnRzIHRocm91Z2hvdXQgVGVuc29yQm9hcmQuIFNlZSAjODk5LiAqLwogICAgICA6aG9zdChbX2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIDpob3N0LAogICAgICAjZGFzaGJvYXJkLWJhY2tkcm9wIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAjZGFzaGJvYXJkLWJhY2tkcm9wIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICAgIH0KCiAgICAgIC5jb2RlLWV4YW1wbGUgewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICB9CiAgICAgIC5jb2RlLWV4YW1wbGUtc2VjdGlvbiB7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgLmNvZGUtZXhhbXBsZS1zZWN0aW9uLXRpdGxlIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAuY29kZS1zbmlwcGV0IHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDFlbTsKICAgICAgfQoKICAgICAgI2RpYWxvZy10aXRsZSB7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgIC5jdXN0b20tbWVzc2FnZSB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZGVidWdnZXItcmVzaXplciI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0iYmFycyI+CiAgICAgIDxkaXYgY2xhc3M9ImJhcnMtcm90YXRvciI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImJhcnMtdGV4dCI+fCB8PC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdChbX3Jlc2l6ZXItaWRlbnRpZmllcl0pIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYmFja2dyb3VuZDogI2NjYzsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2lzLWhvcml6b250YWxdKSB7CiAgICAgICAgY3Vyc29yOiByb3ctcmVzaXplOwogICAgICAgIGhlaWdodDogMTBweDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICA6aG9zdChbX2lzLXZlcnRpY2FsXSkgewogICAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgICByaWdodDogLTE1cHg7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgfQoKICAgICAgLmJhcnMgewogICAgICAgIHdpZHRoOiA4MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDUwJTsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgZm9udC1zaXplOiA1cHg7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgIH0KCiAgICAgIC8qKiBUaGlzIGJsb2NrIHByZXZlbnRzIHRoZSBiYXJzIHJvdGF0b3IgZnJvbSBoYXZpbmcgYSBoZWlnaHQgdGhhdCBpcwogICAgICAgICAgdGhlIGVudGlyZSB2aWV3cG9ydCwgdGh1cyBvY2NsdWRpbmcgaXQgYW5kIGdpdmluZyBpdCBhbiB1bmRlc2lyZWQgY3Vyc29yCiAgICAgICAgICB2YWx1ZS4gKi8KICAgICAgLmJhcnMtcm90YXRvciB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICA6aG9zdChbaXMtaG9yaXpvbnRhbF0pIC5iYXJzLXJvdGF0b3IgewogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKICAgICAgfQoKICAgICAgLmJhcnMtdGV4dCB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVkoMTUpOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1vcC1zZWxlY3RvciI+CiAgPHRlbXBsYXRlPgogICAgPGRpdj4KICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgaWQ9ImZpbHRlci1tb2RlIiBuby1sYWJlbC1mbG9hdD0idHJ1ZSIgbGFiZWw9IkZpbHRlciBNb2RlIiBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19maWx0ZXJNb2RlfX0iPgogICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5Ob2RlIE5hbWU8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+T3AgVHlwZTwvcGFwZXItaXRlbT4KICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJmaWx0ZXItaW5wdXQiIGxhYmVsPSJGaWx0ZXIgUmVnZXgiIGFsd2F5cy1mbG9hdC1sYWJlbCB2YWx1ZT0ie3tfZmlsdGVySW5wdXR9fSI+PC9wYXBlci1pbnB1dD4KICAgIDwvZGl2PgogICAgPHBhcGVyLXNwaW5uZXItbGl0ZSBhY3RpdmUgY2xhc3M9InNwaW5uZXIiIGlkPSJsb2FkaW5nLXNwaW5uZXIiIGhpZGRlbj0iW1shX2lzTG9hZGluZ11dIj4KICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgPGRpdiBpZD0ic2VsZWN0b3ItaGllcmFyY2h5Ij48L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLmluZGVudGVkLWxldmVsLWNvbnRhaW5lciAuY29udGVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogMCAwIDAgMjBweDsKICAgICAgfQoKICAgICAgLmxldmVsLWNvbnRhaW5lciBpcm9uLWNvbGxhcHNlIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAyMHB4OwogICAgICB9CgogICAgICBwYXBlci1jaGVja2JveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiAxOHB4OwogICAgICAgIGhlaWdodDogMThweDsKICAgICAgICBtYXJnaW46IDAgOHB4IDAgMDsKICAgICAgfQoKICAgICAgLm9wLXR5cGUgewogICAgICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7CiAgICAgICAgY29sb3I6ICM0NDQ7CiAgICAgIH0KCiAgICAgIC5vcC10aXRsZS1sZWFmIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5vcC10aXRsZS1sZWFmOmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQoKICAgICAgLnBhcnRpYWwtY2hlY2tib3ggewogICAgICAgIGJhY2tncm91bmQ6ICNmNTdjMDA7CiAgICAgIH0KCiAgICAgIC5ub2RlLWV4cGFuZC1idXR0b24gewogICAgICAgIG1hcmdpbjogMCAwIDAgLTEzcHg7CiAgICAgIH0KCiAgICAgIC5sZXZlbC10aXRsZS10ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgICAgICBtYXJnaW46IDAgMCAwIC0xcHg7CiAgICAgIH0KCiAgICAgIC5vcC1kZXNjcmlwdGlvbiB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDMwMDsKICAgICAgICBtYXJnaW46IDAgMCAwIDI3cHg7CiAgICAgICAgcGFkZGluZzogMTBweCAwOwogICAgICB9CgogICAgICAuc3Bpbm5lciB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgICNmaWx0ZXItbW9kZSB7CiAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgI2ZpbHRlci1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDI1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmhpZ2hsaWdodGVkIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CiAgICAgIC5oaWdobGlnaHRlZCA+IC5vcC10eXBlIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CgogICAgICAjc2VsZWN0b3ItaGllcmFyY2h5IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1zZXNzaW9uLXJ1bnMtdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0ic2Vzc2lvbi1ydW5zLWRpdiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlNlc3Npb24gUnVuczwvZGl2PgogICAgICA8dGFibGUgaWQ9InNlc3Npb24tcnVucy10YWJsZSIgYWxpZ249ImxlZnQiIGNsYXNzPSJzZXNzaW9uLXJ1bnMtdGFibGUiPgogICAgICAgIDx0ciBhbGlnbj0ibGVmdCI+CiAgICAgICAgICA8dGg+RmVlZHM8L3RoPgogICAgICAgICAgPHRoPkZldGNoZXM8L3RoPgogICAgICAgICAgPHRoPlRhcmdldHM8L3RoPgogICAgICAgICAgPHRoPiMoRGV2aWNlcyk8L3RoPgogICAgICAgICAgPHRoPkNvdW50PC90aD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiAyMHB4IDA7CiAgICAgIH0KCiAgICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDExMCU7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgOmhvc3QgLmluZGVudGVkLWxldmVsLWNvbnRhaW5lciAuY29udGVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogMCAwIDAgMTBweDsKICAgICAgfQoKICAgICAgLyogVE9ETyhjYWlzKTogVGhpcyBuZWVkcyB3b3JrOiB0aGUgdGFibGUgc2hvdWxkbid0IGdldCB0b28gd2lkZSB3aGVuCiAgICAgICAgIHRoZXJlIGFyZSBtYW55IGZlZWRzL2ZldGNoZXMvdGFyZ3RlIG5hbWVzLiAqLwogICAgICAuc2Vzc2lvbi1ydW5zLXRhYmxlIHsKICAgICAgICBhbGlnbi1jb250ZW50OiBsZWZ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBsZWZ0OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgZm9udC1zaXplOiA5MCU7CiAgICAgICAgYm9yZGVyLXN0eWxlOiBzb2xpZCAxcHggYmxhY2s7CiAgICAgICAgdGFibGUtbGF5b3V0OiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgYm94LXNoYWRvdzogM3B4IDNweCAjZGRkOwogICAgICB9CiAgICAgIC5hY3RpdmUtc2Vzc2lvbi1ydW4gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZTA7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLnNvbGUtYWN0aXZlLXNlc3Npb24tcnVuIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTcyLCAyMzIsIDE4OCk7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5ub2RlLW9yLXRlbnNvci1lbGVtZW50IHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub2RlLW9yLXRlbnNvci1lbGVtZW50OmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNvdXJjZS1jb2RlLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImZ1bGxTdGFja0RpYWxvZyIgaGlkZGVuJD0iW1shX2Z1bGxTdGFja1Nob3duXV0iPgogICAgICA8ZGl2IGlkPSJmdWxsLXN0YWNrLXRpdGxlIj4KICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iZmlsdGVyLWxpc3QiIGRpc2FibGVkPSJ0cnVlIj4KICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIEZ1bGwgU3RhY2sgVHJhY2Ugb2YgTm9kZToKICAgICAgICA8ZGl2IGlkPSJmdWxsLXN0YWNrLW5vZGUtbmFtZSI+IltbX2Z1bGxTdGFja05vZGVOYW1lXV0iPC9kaXY+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImNsb3NlIiBpZD0iY2xvc2UtZnVsbC1zdGFjay1idXR0b24iIHRpdGxlPSJDbG9zZSBGdWxsIFN0YWNrIiBvbi10YXA9Il9jbG9zZUZ1bGxTdGFja0RpYWxvZyI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDx1bCBpZD0iZnVsbC1zdGFjay1jb250ZW50Ij48L3VsPgogICAgPC9kaXY+CiAgICA8cGFwZXItdGFicyBpZD0ic291cmNlLWZpbGVzLXRhYnMiIHNlbGVjdGVkPSJ7e19maWxlUGF0aFNlbGVjdGVkfX0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zaG9ydEZpbGVQYXRoc11dIj4KICAgICAgICA8cGFwZXItdGFiIGlkPSJbW2l0ZW0uaWRdXSI+W1tpdGVtLm5hbWVdXTwvcGFwZXItdGFiPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9wYXBlci10YWJzPgogICAgPGRpdiBpZD0ic291cmNlLWZpbGUtY29udGVudCIgY2xhc3M9InNvdXJjZS1jb250ZW50Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfZmlsZUxpbmVzXV0iPgogICAgICAgIDxkaXYgY2xhc3MkPSJ7e2l0ZW0uc291cmNlQ2xhc3N9fSIgaWQ9InNvdXJjZS1saW5lLVtbaXRlbS5saW5lbm9dXSI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic291cmNlLWxpbmUtbnVtYmVyIiBpZD0ic291cmNlLWxpbmVuby1bW2l0ZW0ubGluZW5vXV0iPgogICAgICAgICAgICBbW2l0ZW0ubGluZW5vXV0KICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJzb3VyY2UtbGluZS1ub2RlLXRvZ2dsZSIgaWQ9InNvdXJjZS1saW5lLW5vZGUtdG9nZ2xlLVtbaXRlbS5saW5lbm9dXSI+CiAgICAgICAgICAgIFtbaXRlbS5udW1Ob2Rlc11dCiAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic291cmNlLWxpbmUtdGV4dCIgaWQ9InNvdXJjZS1saW5lLXRleHQtW1tpdGVtLmxpbmVub11dIj4KICAgICAgICAgICAgW1tpdGVtLnRleHRdXQogICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPGRpdiBjbGFzcz0ic291cmNlLWxpbmUtbm9kZXMiIGlkPSJzb3VyY2UtbGluZS1ub2Rlcy1bW2l0ZW0ubGluZW5vXV0iPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgICNzb3VyY2UtZmlsZXMtdGFicyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogOCU7CiAgICAgIH0KICAgICAgLnNvdXJjZS1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiA5MCU7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDkwJTsKICAgICAgICBvdmVyZmxvdy14OiBzY3JvbGw7CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICB9CiAgICAgIC5zb3VyY2UtY29udGVudCA6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmMDA7CiAgICAgIH0KICAgICAgLmhpZ2hsaWdodGVkLXNvdXJjZS1saW5lIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1udW1iZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBjb2xvcjogbGlnaHRibHVlOwogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1ub2RlLXRvZ2dsZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGNvbG9yOiBibHVlOwogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAuc291cmNlLWxpbmUtbm9kZXMgewogICAgICAgIHBhZGRpbmctbGVmdDogNGVtOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgICBtYXJnaW4tdG9wOiAwZW07CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMGVtOwogICAgICAgIG1hcmdpbi1yaWdodDogMWVtOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1ub2RlLWVudHJ5IHsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDFlbTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7CiAgICAgIH0KICAgICAgLnNvdXJjZS1saW5lLW5vZGVzIHNwYW4gewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7CiAgICAgIH0KICAgICAgLnNvdXJjZS1saW5lLXRleHQgewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgICAgI2Z1bGxTdGFja0RpYWxvZyB7CiAgICAgICAgei1pbmRleDogMTAwMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAxMCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIHdpZHRoOiA0NSU7CiAgICAgICAgaGVpZ2h0OiA4NSU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgZ3JheTsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggI2RkZDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICAgICNmdWxsLXN0YWNrLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDExMCU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgICNmdWxsLXN0YWNrLW5vZGUtbmFtZSB7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgIH0KICAgICAgOmhvc3QgI2Z1bGwtc3RhY2stY29udGVudCB7CiAgICAgICAgcGFkZGluZy10b3A6IDFlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTsKICAgICAgICBtYXJnaW4tdG9wOiAwLjVlbTsKICAgICAgICBmb250LXNpemU6IDkwJTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KICAgICAgLnN0YWNrLWZyYW1lLWNsaWNrYWJsZSB7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC5zdGFjay1mcmFtZS1ub25jbGlja2FibGUgewogICAgICAgIGNvbG9yOiAjNTU1OwogICAgICB9CiAgICAgICNjbG9zZS1mdWxsLXN0YWNrLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGVuc29yLWRhdGEtc3VtbWFyeSI+CiAgPHRlbXBsYXRlPgogICAgPHNwYW4gY2xhc3M9InNlY3Rpb24tdGl0bGUiPlRlbnNvciBWYWx1ZSBPdmVydmlldzwvc3Bhbj4KICAgIDxkaXYgaWQ9InRlbnNvci1kYXRhLWRpdiIgY2xhc3M9InRlbnNvci1kYXRhLWRpdiI+CiAgICAgIDx0YWJsZSBpZD0idGVuc29yLWRhdGEtdGFibGUiIGFsaWduPSJsZWZ0IiBjbGFzcz0idGVuc29yLWRhdGEtdGFibGUiPgogICAgICAgIDx0aGVhZD4KICAgICAgICAgIDx0ciBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAgIDx0aD5UZW5zb3I8L3RoPgogICAgICAgICAgICA8dGg+Q291bnQ8L3RoPgogICAgICAgICAgICA8dGg+RFR5cGU8L3RoPgogICAgICAgICAgICA8dGg+U2hhcGU8L3RoPgogICAgICAgICAgICA8dGggd2lkdGg9IjI1JSI+VmFsdWU8L3RoPgogICAgICAgICAgICA8dGggd2lkdGg9IjI1JSI+CiAgICAgICAgICAgICAgSGVhbHRoIFBpbGwKICAgICAgICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBpZD0ic2hvdy1oZWFsdGgtcGlsbHMiIGNoZWNrZWQ9Int7X2hlYWx0aFBpbGxzRW5hYmxlZH19Ij4KICAgICAgICAgICAgICA8L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLWNhcmQ+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFsdGgtcGlsbC1sZWdlbmQiIGlkPSJoZWFsdGgtcGlsbC1sZWdlbmQiPjwvZGl2PgogICAgICAgICAgICAgIDwvcGFwZXItY2FyZD4KICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgPHRoIHdpZHRoPSI1JSI+PC90aD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90aGVhZD4KICAgICAgICA8dGJvZHk+PC90Ym9keT4KICAgICAgPC90YWJsZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCAjdGVuc29yLWRhdGEtZGl2IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMTAlOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIDpob3N0IC5pbmRlbnRlZC1sZXZlbC1jb250YWluZXIgLmNvbnRlbnQtY29udGFpbmVyIHsKICAgICAgICBtYXJnaW46IDAgMCAwIDEwcHg7CiAgICAgIH0KICAgICAgOmhvc3QgLnRlbnNvci1kYXRhLXRhYmxlIHsKICAgICAgICBhbGlnbi1jb250ZW50OiBsZWZ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBsZWZ0OwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwYWRkaW5nLXRvcDogM3B4OwogICAgICAgIHBhZGRpbmctbGVmdDogM3B4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgICBib3gtc2hhZG93OiAzcHggM3B4ICNkZGQ7CiAgICAgIH0KICAgICAgOmhvc3QgI3RlbnNvci1kYXRhLXRhYmxlIHRoIHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CiAgICAgIDpob3N0IC5hY3RpdmUtdGVuc29yIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGJvcmRlcjogc29saWQgMXB4ICM4ODg7CiAgICAgIH0KICAgICAgOmhvc3QgLmhpZ2hsaWdodGVkIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CiAgICAgIDpob3N0IC5oZWFsdGgtcGlsbC1sZWdlbmQgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIDpob3N0ICNzaG93LWhlYWx0aC1waWxscyB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIC52YWx1ZS1leHBhbnNpb24tbGluayB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC52YWx1ZS1leHBhbnNpb24tbGluayA6aG92ZXIgewogICAgICAgIGNvbG9yOiBibHVlOwogICAgICB9CiAgICAgIC5oZWFsdGgtcGlsbCA6aG92ZXIgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAudGVuc29yLW5hbWUgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAudGVuc29yLW5hbWUgOmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxzdHlsZT4vKiBDb3B5cmlnaHQgMjAxOSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLnRlbnNvci13aWRnZXQgewogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxNHB4OwogIG92ZXJmbG93LXg6IGhpZGRlbjsKICBvdmVyZmxvdy15OiBoaWRkZW47CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgoudGVuc29yLXdpZGdldC1kaW0gewogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKICBtYXJnaW4tbGVmdDogMTVweDsKICBtYXJnaW4tcmlnaHQ6IDE1cHg7CiAgcGFkZGluZzogMnB4Owp9CgoudGVuc29yLXdpZGdldC1kaW0tY29tbWEgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMTJweDsKICBoZWlnaHQ6IDE0cHg7CiAgbGluZS1oZWlnaHQ6IDE0cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1oaWdobGlnaHRlZCB7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDEwMCwgMTgwLCAyNTUpOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC1kaW0tYnJhY2tldHMgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0Owp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24gewogIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgYm94LXNoYWRvdzogMnB4IDJweCAycHggI2IwYjBiMDsKICBjdXJzb3I6IHBvaW50ZXI7CiAgd2lkdGg6IDE4MHB4OwogIHotaW5kZXg6IDEwMDA7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0gewogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTgwLCAxODAsIDE4MCk7CiAgZm9udC1zaXplOiAxMnB4OwogIHBhZGRpbmc6IDNweDsKICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUgewogIGJhY2tncm91bmQtY29sb3I6IHJnYigxMDAsIDE4MCwgMjU1KTsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1kaXNhYmxlZCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKfQoKLnRlbnNvci13aWRnZXQtZHR5cGUgewogIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICBjb2xvcjogcmdiKDYwLCA2MCwgNjApOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDhwdDsKICBoZWlnaHQ6IDQ4cHg7CiAgbGluZS1oZWlnaHQ6IDIycHg7CiAgbWF4LWhlaWdodDogMjJweDsKICBwYWRkaW5nLWxlZnQ6IDE0cHg7CiAgcGFkZGluZy1yaWdodDogMTBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLnRlbnNvci13aWRnZXQtZHR5cGUtbGFiZWwgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7Cn0KCi50ZW5zb3Itd2lkZ2V0LWhlYWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MiwgMjUyLCAyNTIpOwogIGJveC1zaGFkb3c6IDJweCAycHggMnB4ICNiMGIwYjA7CiAgaGVpZ2h0OiA0MHB4OwogIGxpbmUtaGVpZ2h0OiA0MHB4OwogIG1heC1oZWlnaHQ6IDQwcHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDEwMCU7Cn0KCi50ZW5zb3Itd2lkZ2V0LWluZm8gewogIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICBjb2xvcjogcmdiKDAsIDAsIDI1NSk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0OwogIGhlaWdodDogMjJweDsKICBsaW5lLWhlaWdodDogMjJweDsKICBtYXJnaW4tbGVmdDogOHB4OwogIG1heC1oZWlnaHQ6IDIycHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KCi50ZW5zb3Itd2lkZ2V0LW1lbnUtdGh1bWIgewogIGNvbG9yOiByZ2IoMzIsIDMzLCAzNik7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXdlaWdodDogYm9sZDsKICBmb250LXNpemU6IDE2cHg7CiAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC1tZW51LXRodW1iOmhvdmVyIHsKICBjb2xvcjogcmdiKDIyNywgMTE2LCAwKTsKfQoKLnRlbnNvci13aWRnZXQtc2hhcGUgewogIGNvbG9yOiByZ2IoNjAsIDYwLCA2MCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIG1hcmdpbi1sZWZ0OiAxMnB4Owp9CgoudGVuc29yLXdpZGdldC1zaGFwZS1sYWJlbCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNoYXBlLXZhbHVlIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNsaWNpbmctZ3JvdXAgewogIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTAsIDI1MCwgMjUwKTsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiKDE5MCwgMTkwLCAxOTApOwogIGRpc3BsYXk6IGJsb2NrOwogIGhlaWdodDogMThweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgcGFkZGluZy1ib3R0b206IDVweDsKICBwYWRkaW5nLXRvcDogNXB4Owp9CgoudGVuc29yLXdpZGdldC10ZW5zb3ItbmFtZSB7CiAgY29sb3I6IGJsYWNrOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnRlbnNvci13aWRnZXQtbGVmdC1ydWxlci10aWNrIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ydWxlci1iYWNrZ3JvdW5kLWNvbG9yKTsKICBib3JkZXItYm90dG9tOiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGJvcmRlci10b3A6IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm94LXNoYWRvdzogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBjb2xvcjogcmdiKDExMCwgMTEwLCAxMTApOwogIGN1cnNvcjogcG9pbnRlcjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMjlweDsKICBsaW5lLWhlaWdodDogMjlweDsKICBtYXJnaW4tbGVmdDogMHB4OwogIG1heC13aWR0aDogNDVweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdG9wLXJ1bGVyIHsKICBoZWlnaHQ6IDI0cHg7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcCB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI0MCwgMjQwLCAyNDApOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICBib3gtc2hhZG93OiAxcHggMXB4IDFweCAjYjBiMGIwOwogIGRpc3BsYXk6IG5vbmU7CiAgZm9udC1zaXplOiAxM3B4OwogIHBhZGRpbmc6IDVweDsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgd2lkdGg6IDI0MHB4Owp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWNvbG9yYmFyIHsKICBoZWlnaHQ6IDI0cHg7CiAgd2lkdGg6IDk1JTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC1pbmRpY2VzIHsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC12YWx1ZSB7CiAgbWFyZ2luLXRvcDogMjBweDsKfQoKLnRlbnNvci13aWRnZXQtdG9wLXJ1bGVyLXRpY2sgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJ1bGVyLWJhY2tncm91bmQtY29sb3IpOwogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXJpZ2h0OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGNvbG9yOiByZ2IoMTEwLCAxMTAsIDExMCk7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAyNHB4OwogIGxpbmUtaGVpZ2h0OiAyNHB4OwogIHBhZGRpbmctcmlnaHQ6IDJweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2IHsKICBib3JkZXItYm90dG9tOiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGJvcmRlci1yaWdodDogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogODAlOwogIGhlaWdodDogMjRweDsKICBsaW5lLWhlaWdodDogMjRweDsKICBtYXgtd2lkdGg6IDQ1cHg7CiAgcGFkZGluZy1yaWdodDogMnB4OwogIHRleHQtYWxpZ246IHJpZ2h0OwogIHVzZXItc2VsZWN0OiBub25lOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDQ1cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24gewogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWJvdHRvbSB7CiAgYm9yZGVyLWJvdHRvbTogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1sZWZ0IHsKICBib3JkZXItbGVmdDogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1yaWdodCB7CiAgYm9yZGVyLXJpZ2h0OiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXRvcCB7CiAgYm9yZGVyLXRvcDogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtc2VjdGlvbiB7CiAgLS1ib3JkZXItc3R5bGU6IDFweCBzb2xpZCByZ2IoMTQwLCAxNDAsIDE0MCk7CiAgLS1ydWxlci1iYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjEwLCAyMTAsIDIxMCk7CiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLWtodG1sLXVzZXItc2VsZWN0OiBub25lOwogIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsKICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1yb3cgewogIGhlaWdodDogMjVweDsKICBsaW5lLWhlaWdodDogMjVweDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Cjwvc3R5bGU+Cgo8ZG9tLW1vZHVsZSBpZD0idGVuc29yLXdpZGdldC1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPi8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoudGVuc29yLXdpZGdldCB7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDE0cHg7CiAgb3ZlcmZsb3cteDogaGlkZGVuOwogIG92ZXJmbG93LXk6IGhpZGRlbjsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbSB7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAxNHB4OwogIGxpbmUtaGVpZ2h0OiAxNHB4OwogIG1hcmdpbi1sZWZ0OiAxNXB4OwogIG1hcmdpbi1yaWdodDogMTVweDsKICBwYWRkaW5nOiAycHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1jb21tYSB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKfQoKLnRlbnNvci13aWRnZXQtZGltLWhpZ2hsaWdodGVkIHsKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTAwLCAxODAsIDI1NSk7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1icmFja2V0cyB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4cHQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93biB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxMjgsIDEyOCwgMTI4KTsKICBib3gtc2hhZG93OiAycHggMnB4IDJweCAjYjBiMGIwOwogIGN1cnNvcjogcG9pbnRlcjsKICB3aWR0aDogMTgwcHg7CiAgei1pbmRleDogMTAwMDsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbSB7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYigxODAsIDE4MCwgMTgwKTsKICBmb250LXNpemU6IDEycHg7CiAgcGFkZGluZzogM3B4OwogIHVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDEwMCwgMTgwLCAyNTUpOwp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWRpc2FibGVkIHsKICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpOwp9CgoudGVuc29yLXdpZGdldC1kdHlwZSB7CiAgYWxpZ24tY29udGVudDogY2VudGVyOwogIGNvbG9yOiByZ2IoNjAsIDYwLCA2MCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0OwogIGhlaWdodDogNDhweDsKICBsaW5lLWhlaWdodDogMjJweDsKICBtYXgtaGVpZ2h0OiAyMnB4OwogIHBhZGRpbmctbGVmdDogMTRweDsKICBwYWRkaW5nLXJpZ2h0OiAxMHB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9CgoudGVuc29yLXdpZGdldC1kdHlwZS1sYWJlbCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKfQoKLnRlbnNvci13aWRnZXQtaGVhZGVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjUyLCAyNTIsIDI1Mik7CiAgYm94LXNoYWRvdzogMnB4IDJweCAycHggI2IwYjBiMDsKICBoZWlnaHQ6IDQwcHg7CiAgbGluZS1oZWlnaHQ6IDQwcHg7CiAgbWF4LWhlaWdodDogNDBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogMTAwJTsKfQoKLnRlbnNvci13aWRnZXQtaW5mbyB7CiAgYWxpZ24tY29udGVudDogY2VudGVyOwogIGNvbG9yOiByZ2IoMCwgMCwgMjU1KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4cHQ7CiAgaGVpZ2h0OiAyMnB4OwogIGxpbmUtaGVpZ2h0OiAyMnB4OwogIG1hcmdpbi1sZWZ0OiA4cHg7CiAgbWF4LWhlaWdodDogMjJweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLnRlbnNvci13aWRnZXQtbWVudS10aHVtYiB7CiAgY29sb3I6IHJnYigzMiwgMzMsIDM2KTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtc2l6ZTogMTZweDsKICBtYXJnaW4tbGVmdDogMTBweDsKICBtYXJnaW4tcmlnaHQ6IDVweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LW1lbnUtdGh1bWI6aG92ZXIgewogIGNvbG9yOiByZ2IoMjI3LCAxMTYsIDApOwp9CgoudGVuc29yLXdpZGdldC1zaGFwZSB7CiAgY29sb3I6IHJnYig2MCwgNjAsIDYwKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgbWFyZ2luLWxlZnQ6IDEycHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNoYXBlLWxhYmVsIHsKICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnRlbnNvci13aWRnZXQtc2hhcGUtdmFsdWUgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnRlbnNvci13aWRnZXQtc2xpY2luZy1ncm91cCB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MCwgMjUwLCAyNTApOwogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTkwLCAxOTAsIDE5MCk7CiAgZGlzcGxheTogYmxvY2s7CiAgaGVpZ2h0OiAxOHB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBwYWRkaW5nLWJvdHRvbTogNXB4OwogIHBhZGRpbmctdG9wOiA1cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXRlbnNvci1uYW1lIHsKICBjb2xvcjogYmxhY2s7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC1sZWZ0LXJ1bGVyLXRpY2sgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJ1bGVyLWJhY2tncm91bmQtY29sb3IpOwogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXRvcDogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBib3gtc2hhZG93OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGNvbG9yOiByZ2IoMTEwLCAxMTAsIDExMCk7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAyOXB4OwogIGxpbmUtaGVpZ2h0OiAyOXB4OwogIG1hcmdpbi1sZWZ0OiAwcHg7CiAgbWF4LXdpZHRoOiA0NXB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiA0NXB4Owp9CgoudGVuc29yLXdpZGdldC10b3AtcnVsZXIgewogIGhlaWdodDogMjRweDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQwLCAyNDAsIDI0MCk7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogIGJveC1zaGFkb3c6IDFweCAxcHggMXB4ICNiMGIwYjA7CiAgZGlzcGxheTogbm9uZTsKICBmb250LXNpemU6IDEzcHg7CiAgcGFkZGluZzogNXB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB3aWR0aDogMjQwcHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLXRvb2x0aXAtY29sb3JiYXIgewogIGhlaWdodDogMjRweDsKICB3aWR0aDogOTUlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWluZGljZXMgewogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLXZhbHVlIHsKICBtYXJnaW4tdG9wOiAyMHB4Owp9CgoudGVuc29yLXdpZGdldC10b3AtcnVsZXItdGljayB7CiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcnVsZXItYmFja2dyb3VuZC1jb2xvcik7CiAgYm9yZGVyLWJvdHRvbTogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBib3JkZXItcmlnaHQ6IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgY29sb3I6IHJnYigxMTAsIDExMCwgMTEwKTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMTJweDsKICBoZWlnaHQ6IDI0cHg7CiAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgcGFkZGluZy1yaWdodDogMnB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiA0NXB4Owp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYgewogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXJpZ2h0OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGN1cnNvcjogcG9pbnRlcjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4MCU7CiAgaGVpZ2h0OiAyNHB4OwogIGxpbmUtaGVpZ2h0OiAyNHB4OwogIG1heC13aWR0aDogNDVweDsKICBwYWRkaW5nLXJpZ2h0OiAycHg7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbiB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tYm90dG9tIHsKICBib3JkZXItYm90dG9tOiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWxlZnQgewogIGJvcmRlci1sZWZ0OiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXJpZ2h0IHsKICBib3JkZXItcmlnaHQ6IDAuNXB4IHNvbGlkIGJsdWU7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tdG9wIHsKICBib3JkZXItdG9wOiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1zZWN0aW9uIHsKICAtLWJvcmRlci1zdHlsZTogMXB4IHNvbGlkIHJnYigxNDAsIDE0MCwgMTQwKTsKICAtLXJ1bGVyLWJhY2tncm91bmQtY29sb3I6IHJnYigyMTAsIDIxMCwgMjEwKTsKICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAta2h0bWwtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lOwogIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLXJvdyB7CiAgaGVpZ2h0OiAyNXB4OwogIGxpbmUtaGVpZ2h0OiAyNXB4OwogIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWxpbmUtY2hhcnQiPgogIDx0ZW1wbGF0ZT4KICAgIDx2ei1saW5lLWNoYXJ0MiB4LWNvbXBvbmVudHMtY3JlYXRpb24tbWV0aG9kPSJbW19saW5lQ2hhcnRYQ29tcG9uZW50c0NyZWF0aW9uTWV0aG9kXV0iIHktdmFsdWUtYWNjZXNzb3I9IltbX2xpbmVDaGFydFlWYWx1ZUFjY2Vzc29yXV0iIHRvb2x0aXAtY29sdW1ucz0iW1tfbGluZUNoYXJ0VG9vbHRpcENvbHVtbnNdXSIgc21vb3RoaW5nLWVuYWJsZWQ9IltbX2xpbmVDaGFydFNtb290aGluZ0VuYWJsZWRdXSI+PC92ei1saW5lLWNoYXJ0Mj4KICAgIDxzdHlsZT4KICAgICAgdnotbGluZS1jaGFydDIgewogICAgICAgIGhlaWdodDogMzAwcHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi10ZW5zb3ItdmFsdWUtdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLXRvYXN0IGlkPSJ0ZW5zb3JWYWx1ZVRvYXN0IiB0ZXh0PSIiIGFsd2F5cy1vbi10b3A+PC9wYXBlci10b2FzdD4KICAgIDx0YWJsZSBjbGFzcz0idGVuc29yLXZhbHVlLXZpZXctdGFibGUiPgogICAgICA8dHI+CiAgICAgICAgPHRkIGNvbHNwYW49IjIiPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gaWQ9InRlbnNvci1uYW1lIiBvbi10YXA9InRlbnNvck5hbWVDYWxsYmFjayI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRlbnNvci1uYW1lLXRleHQiPltbdGVuc29yTmFtZV1dPC9zcGFuPgogICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJjbG9zZSIgY2xhc3M9InZhbHVlLXZpZXctaWNvbi1idXR0b24iIGlkPSJ2YWx1ZS12aWV3LWljb24tYnV0dG9uIiB0aXRsZT0iQ2xvc2UiIG9uLXRhcD0iY2xvc2VCdXR0b25DYWxsYmFjayI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImZvcndhcmQiIGNsYXNzPSJ2YWx1ZS12aWV3LWljb24tYnV0dG9uIiBpZD0idmFsdWUtdmlldy1pY29uLWJ1dHRvbiIgdGl0bGU9IkNvbnRpbnVlIHRvIiBvbi10YXA9ImNvbnRpbnVlVG9CdXR0b25DYWxsYmFjayI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0ciBjbGFzcz0idGVuc29yLXZhbHVlLXZhbHVlLXRyIj4KICAgICAgICA8dGQ+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3VzZVRlbnNvcldpZGdldF1dIj4KICAgICAgICAgICAgPGRpdiBpZD0idGVuc29yLXdpZGdldCI+PC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX3VzZVRlbnNvcldpZGdldF1dIj4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gaWQ9ImRlYnVnLW9wIj48L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGNsYXNzPSJpbmxpbmUgdmFsdWUtY2FyZC1pbnB1dCIgbGFiZWw9IlNsaWNpbmciIGlkPSJzbGljaW5nIiB2YWx1ZT0ie3tzbGljaW5nfX0iIG9uLWNoYW5nZT0icmVmcmVzaCI+CiAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGNsYXNzPSJpbmxpbmUgdmFsdWUtY2FyZC1pbnB1dCIgbGFiZWw9IlRpbWUgSW5kaWNlcyIgaWQ9InRpbWUtaW5kaWNlcyIgdmFsdWU9Int7dGltZUluZGljZXN9fSIgb24tY2hhbmdlPSJyZWZyZXNoIj4KICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBpZD0idGltZS1pbmRpY2VzLXRvZ2dsZS1idXR0b24iIGNsYXNzPSJ0ZW5zb3ItdmFsdWUtYnV0dG9ucyIgb24tY2xpY2s9Il90aW1lSW5kaWNlc1RvZ2dsZUJ1dHRvbkNhbGxiYWNrIj5GdWxsIEhpc3Rvcnk8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgPC9kaXY+PC90ZW1wbGF0ZT48L3RkPjx0ZCBjbGFzcz0idGVuc29yLXZhbHVlLXZpZXctdGQiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1ZhbHVlU2NhbGFyXV0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgY2xhc3M9ImlubGluZSIgbGFiZWw9IlNjYWxhciBWYWx1ZSIgaWQ9InZhbHVlLXNjYWxhciIgdmFsdWU9IltbX2RhdGFTY2FsYXJdXSI+CiAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1ZhbHVlTGluZUNoYXJ0XV0iPgogICAgICAgICAgICAgICAgICA8dGYtZGVidWdnZXItbGluZS1jaGFydCBkYXRhPSJbW19saW5lQ2hhcnREYXRhXV0iPjwvdGYtZGVidWdnZXItbGluZS1jaGFydD4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVmFsdWVJbWFnZV1dIj4KICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz0idmFsdWUtaW1hZ2UiIGhlaWdodD0iMjUwcHgiIHdpZHRoPSIyNTBweCIgc3JjJD0iW1tfZGF0YUltYWdlU3JjXV0iPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAKICAgICAgICAgIAogICAgICAgIAogICAgICA8L3RyPgogICAgPC90YWJsZT4KCiAgICA8c3R5bGUgaW5jbHVkZT0idGVuc29yLXdpZGdldC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLnRlbnNvci12YWx1ZS1idXR0b25zIHsKICAgICAgICBoZWlnaHQ6IDc1JTsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgIH0KICAgICAgLnRlbnNvci12YWx1ZS12aWV3LXRhYmxlIHsKICAgICAgICB3aWR0aDogNTAwcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLXRhYmxlOwogICAgICAgIGJvcmRlci1zcGFjaW5nOiA1cHg7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogM3B4OwogICAgICAgIHBhZGRpbmctbGVmdDogM3B4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4OwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggMXB4IDFweCAjZDhkOGQ4OwogICAgICB9CiAgICAgIC50ZW5zb3ItdmFsdWUtdmlldy10ZCB7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICB9CiAgICAgIC52YWx1ZS1jYXJkLWlucHV0IHsKICAgICAgICB3aWR0aDogMTUwcHg7CiAgICAgIH0KICAgICAgI3RlbnNvci1uYW1lIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiA1MCU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC50ZW5zb3ItbmFtZS10ZXh0IHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQogICAgICAjZGVidWctb3AgewogICAgICAgIGZvbnQtc2l6ZTogOTAlOwogICAgICB9CiAgICAgIC52YWx1ZS1pbWFnZSB7CiAgICAgICAgaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQ7CiAgICAgIH0KICAgICAgLnZhbHVlLXZpZXctaWNvbi1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgd2lkdGg6IDIwJTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiA5MCU7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgIH0KICAgICAgI3RlbnNvci13aWRnZXQgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICAgICAgICAvKiBib3gtc2l6aW5nOiBjb250ZW50LWJveDsKICAgICAgICAtbW96LWJveC1zaXppbmc6IGNvbnRlbnQtYm94OwogICAgICAgIC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3g7ICovCiAgICAgICAgaGVpZ2h0OiAyODBweDsKICAgICAgICB3aWR0aDogNDg0cHg7CiAgICAgIH0KICAgICAgI3NsaWNpbmcsCiAgICAgICN0aW1lLWluZGljZXMgewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLXRlbnNvci12YWx1ZS1tdWx0aS12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJtdWx0aVZpZXciPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5UZW5zb3IgVmFsdWVzPC9kaXY+CiAgICAgIDxkaXYgaWQ9Im11bHRpLXRlbnNvci12aWV3LWNvbnRhaW5lciI+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnNlY3Rpb24tdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAjbXVsdGlWaWV3IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogICAgICAgIHBhZGRpbmctdG9wOiAzcHg7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAzcHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogM3B4OwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggI2VlZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLXRvYXN0IGlkPSJ0b2FzdCIgdGV4dD0iIiBhbHdheXMtb24tdG9wPjwvcGFwZXItdG9hc3Q+CiAgICA8dGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2cgaWQ9ImluaXRpYWxEaWFsb2ciPjwvdGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2c+CiAgICAKICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIiBpZD0ibGVmdC1wYW5lIj4KICAgICAgICA8ZGl2IGlkPSJub2RlLWVudHJpZXMiIGNsYXNzPSJub2RlLWVudHJpZXMiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVidWdnZXItc2VjdGlvbi10aXRsZSI+UnVudGltZSBOb2RlIExpc3Q8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1zb3VyY2UtY29kZSI+CiAgICAgICAgICAgIFNob3cgQ29kZToKICAgICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2xhc3M9InRvZ2dsZS1zb3VyY2UtY29kZSIgaWQ9InNob3ctc291cmNlLWNvZGUiIGNoZWNrZWQ9Int7X3NvdXJjZUNvZGVTaG93bn19Ij48L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0Zi1vcC1zZWxlY3RvciBkZWJ1Zy13YXRjaGVzPSJbW19kZWJ1Z1dhdGNoZXNdXSIgZGVidWctd2F0Y2gtY2hhbmdlPSJbW19jcmVhdGVEZWJ1Z1dhdGNoQ2hhbmdlSGFuZGxlcigpXV0iIG5vZGUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgZm9yY2UtZXhwYW5kLWFuZC1jaGVjay1ub2RlLW5hbWU9IltbX2ZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZV1dIiBmb3JjZS1leHBhbmQtbm9kZS1uYW1lPSJbW19mb3JjZUV4cGFuZE5vZGVOYW1lXV0iPgogICAgICAgICAgPC90Zi1vcC1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJzb3VyY2UtY29kZS12aWV3LWRpdiIgY2xhc3M9InNvdXJjZS1jb2RlLXZpZXctZGl2IiBoaWRkZW4kPSJ7eyFfc291cmNlQ29kZVNob3dufX0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVidWdnZXItc2VjdGlvbi10aXRsZSI+U291cmNlIENvZGU8L2Rpdj4KICAgICAgICAgIDx0Zi1zb3VyY2UtY29kZS12aWV3IGlkPSJzb3VyY2VDb2RlVmlldyIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIiBkZWJ1Zy13YXRjaGVzPSJbW19kZWJ1Z1dhdGNoZXNdXSIgZm9jdXMtbm9kZS1uYW1lPSJbW19zb3VyY2VGb2N1c05vZGVOYW1lXV0iIG5vZGUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgY29udGludWUtdG8tbm9kZT0iW1tfY3JlYXRlQ29udGludWVUb05vZGVIYW5kbGVyKCldXSI+PC90Zi1zb3VyY2UtY29kZS12aWV3PgogICAgICAgIDwvZGl2PgogICAgICAgIDx0Zi1kZWJ1Z2dlci1yZXNpemVyIGN1cnJlbnQtbGVuZ3RoPSJ7e19sZWZ0UGFuZVdpZHRofX0iIG1pbi1sZW5ndGg9IltbX21pbmxlZnRQYW5lV2lkdGhdXSIgbWF4LWxlbmd0aD0iW1tfbWF4bGVmdFBhbmVXaWR0aF1dIj4KICAgICAgICA8L3RmLWRlYnVnZ2VyLXJlc2l6ZXI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDx0Zi1zZXNzaW9uLXJ1bnMtdmlldyBpZD0ic2Vzc2lvblJ1bnNWaWV3IiBsYXRlc3Qtc2Vzc2lvbi1ydW49IltbX2xhdGVzdFNlc3Npb25SdW5dXSIgc2Vzc2lvbi1ydW4ta2V5LXRvLWRldmljZS1uYW1lcz0iW1tfc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc11dIiBzb2xlLWFjdGl2ZT0iW1tfc2Vzc2lvblJ1blNvbGVBY3RpdmVdXSIgbm9kZS1vci10ZW5zb3ItY2xpY2tlZD0iW1tfY3JlYXRlRmVlZEZldGNoVGFyZ2V0Q2xpY2tlZEhhbmRsZXIoKV1dIj4KICAgICAgICAgIDwvdGYtc2Vzc2lvbi1ydW5zLXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9ucy1jb250YWluZXIiPgogICAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9ImNvbnRpbnVlLWJ1dHRvbiIgb24tY2xpY2s9Il9zdGVwIj4KICAgICAgICAgICAgPHNwYW4+W1tfc3RlcEJ1dHRvblRleHRdXTwvc3Bhbj4KICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPHRmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZyBpZD0iY29udGludWVEaWFsb2ciIHNlc3Npb24tcnVuLWdvPSJbW19jcmVhdGVTZXNzaW9uUnVuR28oKV1dIiB0ZW5zb3ItY29uZGl0aW9uLWdvPSJbW19jcmVhdGVUZW5zb3JDb25kaXRpb25HbygpXV0iIGZvcmNlLWNvbnRpbnVhdGlvbi1zdG9wPSJbW19jcmVhdGVGb3JjZUNvbnRpbnVhdGlvblN0b3AoKV1dIj4KICAgICAgICAgIDwvdGYtZGVidWdnZXItY29udGludWUtZGlhbG9nPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgICA8dGYtZ3JhcGgtbG9hZGVyIGlkPSJsb2FkZXIiIG91dC1ncmFwaC1oaWVyYXJjaHk9Int7Z3JhcGhIaWVyYXJjaHl9fSIgb3V0LWdyYXBoPSJ7e2dyYXBofX0iIG91dC1zdGF0cz0ie3tzdGF0c319IiBwcm9ncmVzcz0ie3tfZ3JhcGhQcm9ncmVzc319Ij48L3RmLWdyYXBoLWxvYWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIiBpZD0iY2VudGVyLWNvbnRlbnQiPgogICAgICAgIDxkaXYgaWQ9InRvcC1yaWdodC1xdWFkcmFudCI+CiAgICAgICAgICA8cGFwZXItdGFicyBzZWxlY3RlZD0ie3tfdG9wUmlnaHRTZWxlY3RlZH19Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfdG9wUmlnaHRUYWJzXV0iPgogICAgICAgICAgICAgIDxwYXBlci10YWIgaWQ9IltbaXRlbS5pZF1dIj5bW2l0ZW0ubmFtZV1dPC9wYXBlci10YWI+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3BhcGVyLXRhYnM+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJydW50aW1lLWdyYXBoLWRldmljZSI+CiAgICAgICAgICAgIDxzcGFuIGlkPSJydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIj4gPC9zcGFuPgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBpZD0iYWN0aXZlLXJ1bnRpbWUtZ3JhcGgtZGV2aWNlLW5hbWUiIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0iRGV2aWNlIG5hbWUiIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWV9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfYWN0aXZlU2Vzc2lvblJ1bkRldmljZXNdXSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5bW2l0ZW1dXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgY2xhc3M9InNwaW5uZXIiIGlkPSJ0b3AtcmlnaHQtc3Bpbm5lciIgaGlkZGVuPSJbWyFfYnVzeV1dIiBhY3RpdmU9IltbX2J1c3ldXSI+CiAgICAgICAgICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgaWQ9InRvcC1yaWdodC1wcm9ncmVzcy1iYXIiIHZhbHVlPSIwIj48L3BhcGVyLXByb2dyZXNzPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZV1dIj4KICAgICAgICAgICAgPGRpdiBpZD0iZ3JhcGgtY29udGFpbmVyIj4KICAgICAgICAgICAgICA8dGYtZ3JhcGggaWQ9ImdyYXBoIiBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgYmFzaWMtZ3JhcGg9IltbZ3JhcGhdXSIgc3RhdHM9Iltbc3RhdHNdXSIgcHJvZ3Jlc3M9Int7X2dyYXBoUHJvZ3Jlc3N9fSIgY29sb3ItYnk9InN0cnVjdHVyZSIgY29sb3ItYnktcGFyYW1zPSJ7e2NvbG9yQnlQYXJhbXN9fSIgcmVuZGVyLWhpZXJhcmNoeT0ie3tfcmVuZGVySGllcmFyY2h5fX0iIG5vZGUtY29udGV4dC1tZW51LWl0ZW1zPSJbW19jcmVhdGVOb2RlQ29udGV4dE1lbnVJdGVtcygpXV0iPjwvdGYtZ3JhcGg+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGV4dC1tZW51Ij48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1RvcFJpZ2h0VGVuc29yVmFsdWVzQWN0aXZlXV0iPgogICAgICAgICAgICA8dGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXcgaWQ9InRlbnNvclZhbHVlTXVsdGlWaWV3IiBjb250aW51ZS10by1jYWxsYmFjaz0iW1tfY3JlYXRlQ29udGludWVUb0NhbGxiYWNrKCldXSIgdGVuc29yLW5hbWUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgZ2V0LWhlYWx0aC1waWxsPSJbW19jcmVhdGVHZXRIZWFsdGhQaWxsKCldXSI+CiAgICAgICAgICAgIDwvdGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8dGYtZGVidWdnZXItcmVzaXplciBpcy1ob3Jpem9udGFsPSJ0cnVlIiBjdXJyZW50LWxlbmd0aD0ie3tfdG9wUmlnaHRRdWFkcmFudEhlaWdodH19IiBtaW4tbGVuZ3RoPSJbW19taW5Ub3BSaWdodFF1YWRyYW50SGVpZ2h0XV0iIG1heC1sZW5ndGg9IltbX21heFRvcFJpZ2h0UXVhZHJhbnRIZWlnaHRdXSI+CiAgICAgICAgPC90Zi1kZWJ1Z2dlci1yZXNpemVyPgoKICAgICAgICA8ZGl2IGlkPSJ0ZW5zb3ItZGF0YSIgY2xhc3M9InRlbnNvci1kYXRhIj4KICAgICAgICAgIDx0Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5IGlkPSJ0ZW5zb3JEYXRhU3VtbWFyeSIgbGF0ZXN0LXRlbnNvci1kYXRhPSJbW19sYXRlc3RUZW5zb3JEYXRhXV0iIGV4cGFuZC1oYW5kbGVyPSJbW19jcmVhdGVUZW5zb3JEYXRhRXhwYW5kSGFuZGxlcigpXV0iIGNvbnRpbnVlLXRvLWNhbGxiYWNrPSJbW19jcmVhdGVDb250aW51ZVRvQ2FsbGJhY2soKV1dIiBoaWdobGlnaHRlZC1ub2RlLW5hbWU9IltbX2hpZ2hsaWdodE5vZGVOYW1lXV0iIHRlbnNvci1uYW1lLWNsaWNrZWQ9IltbX2NyZWF0ZU5vZGVDbGlja2VkSGFuZGxlcigpXV0iIGdldC1oZWFsdGgtcGlsbD0iW1tfY3JlYXRlR2V0SGVhbHRoUGlsbCgpXV0iPgogICAgICAgICAgPC90Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIHBhcGVyLXRvYXN0IHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMTAlOwogICAgICAgIHdpZHRoOiA0MHZ3OwogICAgICAgIG1hcmdpbi1sZWZ0OiAzMHZ3OwogICAgICB9CiAgICAgIHRmLWRhc2hib2FyZC1sYXlvdXQgewogICAgICAgIC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLWJhc2lzOiBhdXRvOwogICAgICAgIC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1heC13aWR0aDogbm9uZTsKICAgICAgICAtLXRmLWRhc2hib2FyZC1sYXlvdXQtc2lkZWJhci1taW4td2lkdGg6IG5vbmU7CiAgICAgIH0KICAgICAgLmRlYnVnZ2VyLXNlY3Rpb24tdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICBwYXBlci10YWJzIHsKICAgICAgICBjb2xvcjogIzU1NTsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIHBhcGVyLXRhYi5pcm9uLXNlbGVjdGVkIHsKICAgICAgICBjb2xvcjogYmxhY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgI2luaXRpYWxEaWFsb2cgewogICAgICAgIC8qKiBUaGlzIG1hdGNoZXMgdGhlIGRlZmF1bHQgei1pbmRleCBvZiBwYXBlci1kaWFsb2cgYmFja2Ryb3BzLiAqLwogICAgICAgIHotaW5kZXg6IDEwMjsKICAgICAgfQogICAgICAvKiogUmVzaXplIHRoZSByZWdpb24gZm9yIHRoZSBncmFwaCBhcyB0aGUgdXNlciByZXNpemVzIHRoZSByZWdpb24uICovCiAgICAgICNncmFwaC1jb250YWluZXIgewogICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gMTIwcHgpOwogICAgICAgIC8qKiBDbGlwIHRoZSBtaW5pbWFwIGlmIHRoZSBoZWlnaHQgb2YgdGhlIGdyYXBoIGNvbnRhaW5lciBpcyBzbWFsbC4gKi8KICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAjZ3JhcGggewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICB9CiAgICAgICN0b29sdGlwLXNvcnRpbmctbGFiZWwgewogICAgICAgIG1hcmdpbi10b3A6IDEzcHg7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CiAgICAgICN4LXR5cGUtc2VsZWN0b3IgcGFwZXItYnV0dG9uIHsKICAgICAgICBtYXJnaW46IDVweCAzcHg7CiAgICAgIH0KICAgICAgLnJ1bnRpbWUtZ3JhcGgtZGV2aWNlIHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CiAgICAgICNydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIHsKICAgICAgICBmb250LXNpemU6IDg1JTsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgICNhY3RpdmUtcnVudGltZS1ncmFwaC1kZXZpY2UtbmFtZSB7CiAgICAgICAgZm9udC1zaXplOiA4NSU7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAjdG9wLXJpZ2h0LXByb2dyZXNzLWJhciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KICAgICAgLmxpbmUtaXRlbSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICAuc2lkZWJhciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXg6IHZpc2libGU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIC5jZW50ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgdGYtZGVidWdnZXItcmVzaXplciB7CiAgICAgICAgcmlnaHQ6IC0xMHB4OwogICAgICB9CiAgICAgICNjZW50ZXItY29udGVudCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CiAgICAgIC8qKiBUaGUgcmVzaXplciBzaG91bGQgaGF2ZSBubyBzcGFjZSB0byB0aGUgbGVmdCBvZiBpdC4gKi8KICAgICAgI2NlbnRlci1jb250ZW50IHRmLWRlYnVnZ2VyLXJlc2l6ZXJbaXMtaG9yaXpvbnRhbF0gewogICAgICAgIG1hcmdpbi1sZWZ0OiAtMjNweDsKICAgICAgfQogICAgICAuY29udGV4dC1tZW51IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWluLXdpZHRoOiAxNTBweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZDRkNGQ0OwogICAgICB9CiAgICAgIC5zcGlubmVyIHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgICAubm9kZS1lbnRyaWVzIHsKICAgICAgICBib3gtc2hhZG93OiAzcHggM3B4ICNkZGQ7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBoZWlnaHQ6IDgwJTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuc291cmNlLWNvZGUtdmlldy1kaXYgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDQwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgYm94LXNoYWRvdzogM3B4IDNweCAjZGRkOwogICAgICB9CiAgICAgICNzZXNzaW9uUnVuc1ZpZXcgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiAyNXZoOwogICAgICB9CiAgICAgIC5idXR0b25zLWNvbnRhaW5lciB7CiAgICAgICAgcGFkZGluZzogMjBweCAwOwogICAgICB9CiAgICAgICN0ZW5zb3ItZGF0YSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHBhZGRpbmc6IDIwcHggMDsKICAgICAgICBtYXJnaW46IDAgMCAyMHB4IDA7CiAgICAgIH0KICAgICAgI3RlbnNvckRhdGFTdW1tYXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICB9CiAgICAgICN0b3AtcmlnaHQtcXVhZHJhbnQgewogICAgICAgIGhlaWdodDogNjYlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CiAgICAgIC50b2dnbGUtc291cmNlLWNvZGUgewogICAgICAgIG1hcmdpbi1yaWdodDogMWVtOwogICAgICAgIGZvbnQtc2l6ZTogODAlOwogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQogICAgICAuY29udGV4dC1tZW51IHVsIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGkgewogICAgICAgIHBhZGRpbmc6IDRweCAxNnB4OwogICAgICB9CiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDIwMHB4OwogICAgICB9CiAgICAgIC5pbmxpbmUsCiAgICAgIHBhcGVyLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydCB7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1tYXRlcmlhbC1zaGFyZWQtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjEiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMmRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIyIl0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTRkcDsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMyJdKSB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi02ZHA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjQiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSI1Il0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTE2ZHA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLW1hdGVyaWFsIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItbWF0ZXJpYWwtc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoW2FuaW1hdGVkXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy10cmFuc2l0aW9uOwogICAgICB9CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLWRlYnVnZ2VyLWRhdGEtY2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtbGVnZW5kIHsKICAgICAgICBwYWRkaW5nOiAxNXB4OwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtbGVnZW5kIGgyIHsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgewogICAgICAgIG1hcmdpbjogMTBweCAxMHB4IDEwcHggMDsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLWVudHJ5IC5jb2xvci1wcmV2aWV3IHsKICAgICAgICB3aWR0aDogMjZweDsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtYXJnaW46IDAgMTBweCAwIDA7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAuY29sb3ItbGFiZWwsCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAudGVuc29yLWNvdW50IHsKICAgICAgICBjb2xvcjogIzc3NzsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMjJweDsKICAgICAgICBsaW5lLWhlaWdodDogMjZweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgLnRlbnNvci1jb3VudCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CgogICAgICAjaGVhbHRoLXBpbGwtc3RlcC1zbGlkZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1hcmdpbjogMCAwIDAgLTE1cHg7CiAgICAgICAgLyogMzEgY29tZXMgZnJvbSBhZGRpbmcgYSBwYWRkaW5nIG9mIDE1cHggZnJvbSBib3RoIHNpZGVzIG9mIHRoZSBwYXBlci1zbGlkZXIsIHN1YnRyYWN0aW5nCiAgICogMXB4IHNvIHRoYXQgdGhlIHNsaWRlciB3aWR0aCBhbGlnbnMgd2l0aCB0aGUgaW1hZ2UgKHRoZSBsYXN0IHNsaWRlciBtYXJrZXIgdGFrZXMgdXAgMXB4KSwKICAgKiBhbmQgYWRkaW5nIDJweCB0byBhY2NvdW50IGZvciBhIGJvcmRlciBvZiAxcHggb24gYm90aCBzaWRlcyBvZiB0aGUgaW1hZ2UuIDMwIC0gMSArIDIuCiAgICogQXBwYXJlbnRseSwgdGhlIHBhcGVyLXNsaWRlciBsYWNrcyBhIG1peGluIGZvciB0aG9zZSBwYWRkaW5nIHZhbHVlcy4gKi8KICAgICAgICB3aWR0aDogY2FsYygxMDAlICsgMzFweCk7CiAgICAgIH0KCiAgICAgICNoZWFsdGgtcGlsbHMtbG9hZGluZy1zcGlubmVyIHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQoKICAgICAgI2hlYWx0aC1waWxsLXN0ZXAtbnVtYmVyLWlucHV0IHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlLWNvbnRhaW5lciB7CiAgICAgICAgbWF4LWhlaWdodDogNDAwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgICNudW1lcmljLWFsZXJ0cy10YWJsZSB7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlIHRkIHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAjbnVtZXJpYy1hbGVydHMtdGFibGUgLmZpcnN0LW9mZmVuc2UtdGQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmZpcnN0LW9mZmVuc2UtdGQgewogICAgICAgIHdpZHRoOiA4MHB4OwogICAgICB9CgogICAgICAudGVuc29yLWRldmljZS10ZCB7CiAgICAgICAgbWF4LXdpZHRoOiAxNDBweDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KCiAgICAgIC50ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGUgewogICAgICAgIGNvbG9yOiAjMjY2MjM2OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KCiAgICAgIC50ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGU6aG92ZXIgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5kZXZpY2Utc2VjdGlvbi13aXRoaW4tdGFibGUgewogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAubWluaS1oZWFsdGgtcGlsbCB7CiAgICAgICAgd2lkdGg6IDEzMHB4OwogICAgICB9CgogICAgICAubWluaS1oZWFsdGgtcGlsbCA+IGRpdiB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgfQoKICAgICAgI2V2ZW50LWNvdW50cy10aCB7CiAgICAgICAgcGFkZGluZzogMCAwIDAgMTBweDsKICAgICAgfQoKICAgICAgLm5lZ2F0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24gewogICAgICAgIGJhY2tncm91bmQ6IHJnYigyNTUsIDE0MSwgMCk7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5wb3NpdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMCwgNjIsIDIxMik7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5uYW4tbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMjA0LCA0NywgNDQpOwogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICB9CgogICAgICAubmVnYXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiwKICAgICAgLnBvc2l0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24sCiAgICAgIC5uYW4tbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1hcmdpbjogMCAwIDAgMTBweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5uby1udW1lcmljLWFsZXJ0cy1ub3RpZmljYXRpb24gewogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGNsYXNzPSJjYXJkIGhlYWx0aC1waWxsLWxlZ2VuZCI+CiAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICBFbmFibGUgYWxsIChub3QganVzdCBzYW1wbGVkKSBzdGVwcy4gUmVxdWlyZXMgc2xvdyBkaXNrIHJlYWQuCiAgICAgIDwvZGl2PgogICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBpZD0iZW5hYmxlQWxsU3RlcHNNb2RlVG9nZ2xlIiBjaGVja2VkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSI+CiAgICAgIDwvcGFwZXItdG9nZ2xlLWJ1dHRvbj4KICAgICAgPGgyPgogICAgICAgIFN0ZXAgb2YgSGVhbHRoIFBpbGxzOgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1thbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9ImhlYWx0aC1waWxsLXN0ZXAtbnVtYmVyLWlucHV0IiBtaW49IjAiIG1heD0iW1tfYmlnZ2VzdFN0ZXBFdmVyU2Vlbl1dIiB2YWx1ZT0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwOjppbnB1dH19Ij4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shYWxsU3RlcHNNb2RlRW5hYmxlZF1dIj4KICAgICAgICAgIFtbX2N1cnJlbnRTdGVwRGlzcGxheVZhbHVlXV0KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlIGhpZGRlbiQ9IltbIWFyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBpZD0iaGVhbHRoLXBpbGxzLWxvYWRpbmctc3Bpbm5lciI+PC9wYXBlci1zcGlubmVyLWxpdGU+CiAgICAgIDwvaDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1thbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9ImhlYWx0aC1waWxsLXN0ZXAtc2xpZGVyIiBpbW1lZGlhdGUtdmFsdWU9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19IiBtYXg9IltbX2JpZ2dlc3RTdGVwRXZlclNlZW5dXSIgc25hcHMgc3RlcD0iMSIgdmFsdWU9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFhbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbWF4U3RlcEluZGV4XV0iPgogICAgICAgICAgPHBhcGVyLXNsaWRlciBpZD0iaGVhbHRoLXBpbGwtc3RlcC1zbGlkZXIiIGltbWVkaWF0ZS12YWx1ZT0ie3toZWFsdGhQaWxsU3RlcEluZGV4fX0iIG1heD0iW1tfbWF4U3RlcEluZGV4XV0iIHNuYXBzIHN0ZXA9IjEiIHZhbHVlPSJ7e2hlYWx0aFBpbGxTdGVwSW5kZXh9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGgyPgogICAgICAgIEhlYWx0aCBQaWxsCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hlYWx0aFBpbGxWYWx1ZXNGb3JTZWxlY3RlZE5vZGVdXSI+CiAgICAgICAgICBDb3VudHMgZm9yIFNlbGVjdGVkIE5vZGUKICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shaGVhbHRoUGlsbFZhbHVlc0ZvclNlbGVjdGVkTm9kZV1dIj4KICAgICAgICAgIExlZ2VuZAogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvaDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbaGVhbHRoUGlsbEVudHJpZXNdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhbHRoLXBpbGwtZW50cnkiPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItcHJldmlldyIgc3R5bGU9ImJhY2tncm91bmQ6W1tpdGVtLmJhY2tncm91bmRfY29sb3JdXSI+PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sYWJlbCI+W1tpdGVtLmxhYmVsXV08L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRlbnNvci1jb3VudCI+CiAgICAgICAgICAgIFtbX2NvbXB1dGVUZW5zb3JDb3VudFN0cmluZyhoZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlLAogICAgICAgICAgICBpbmRleCldXQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxkaXYgaGlkZGVuJD0iW1shX2hhc0RlYnVnZ2VyTnVtZXJpY0FsZXJ0cyhkZWJ1Z2dlck51bWVyaWNBbGVydHMpXV0iPgogICAgICAgIDxoMiBpZD0ibnVtZXJpYy1hbGVydHMtaGVhZGVyIj5OdW1lcmljIEFsZXJ0czwvaDI+CiAgICAgICAgPHA+CiAgICAgICAgICBBbGVydHMgYXJlIHNvcnRlZCBmcm9tIHRvcCB0byBib3R0b20gYnkgaW5jcmVhc2luZyB0aW1lc3RhbXAuCiAgICAgICAgCiAgICAgICAgPGRpdiBpZD0ibnVtZXJpYy1hbGVydHMtdGFibGUtY29udGFpbmVyIj4KICAgICAgICAgIDx0YWJsZSBpZD0ibnVtZXJpYy1hbGVydHMtdGFibGUiPgogICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRoPkZpcnN0IE9mZmVuc2U8L3RoPgogICAgICAgICAgICAgICAgPHRoPlRlbnNvciAoRGV2aWNlKTwvdGg+CiAgICAgICAgICAgICAgICA8dGggaWQ9ImV2ZW50LWNvdW50cy10aCI+RXZlbnQgQ291bnRzPC90aD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICA8dGJvZHkgaWQ9Im51bWVyaWMtYWxlcnRzLWJvZHkiPjwvdGJvZHk+CiAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaGFzRGVidWdnZXJOdW1lcmljQWxlcnRzKGRlYnVnZ2VyTnVtZXJpY0FsZXJ0cyldXSI+CiAgICAgICAgPHAgY2xhc3M9Im5vLW51bWVyaWMtYWxlcnRzLW5vdGlmaWNhdGlvbiI+CiAgICAgICAgICBObyBudW1lcmljIGFsZXJ0cyBzbyBmYXIuIFRoYXQgaXMgbGlrZWx5IGdvb2QuIEFsZXJ0cyBpbmRpY2F0ZSB0aGUKICAgICAgICAgIHByZXNlbmNlIG9mIE5hTiBvciAoKy8tKSBJbmZpbml0eSB2YWx1ZXMsIHdoaWNoIG1heSBiZSBjb25jZXJuaW5nLgogICAgICAgIAogICAgICA8L3RlbXBsYXRlPgogICAgPC9wYXBlci1tYXRlcmlhbD4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWxpc3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1heC1kZXZpY2UtcGl4ZWwtcmF0aW86IDEpIHsKICAgICAgICA6aG9zdCB7CiAgICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICAgIH0KICAgICAgfQoKICAgICAgI2l0ZW1zIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWxpc3QtaXRlbXMtY29udGFpbmVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdChbZ3JpZF0pKSAjaXRlbXMgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjaXRlbXMgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8YXJyYXktc2VsZWN0b3IgaWQ9InNlbGVjdG9yIiBpdGVtcz0ie3tpdGVtc319IiBzZWxlY3RlZD0ie3tzZWxlY3RlZEl0ZW1zfX0iIHNlbGVjdGVkLWl0ZW09Int7c2VsZWN0ZWRJdGVtfX0iPjwvYXJyYXktc2VsZWN0b3I+CgogICAgPGRpdiBpZD0iaXRlbXMiPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KCiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWl0ZW0tYm9keSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsgLyogbmVlZGVkIGZvciB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcyB0byB3b3JrIG9uIGZmICovCiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItanVzdGlmaWVkOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgICB9CgogICAgICA6aG9zdChbdHdvLWxpbmVdKSB7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXR3by1saW5lLW1pbi1oZWlnaHQsIDcycHgpOwogICAgICB9CgogICAgICA6aG9zdChbdGhyZWUtbGluZV0pIHsKICAgICAgICBtaW4taGVpZ2h0OiB2YXIoLS1wYXBlci1pdGVtLWJvZHktdGhyZWUtbGluZS1taW4taGVpZ2h0LCA4OHB4KTsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoW3NlY29uZGFyeV0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWJvZHkxOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXNlY29uZGFyeS1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1ib2R5LXNlY29uZGFyeTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtaWNvbiI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAwOwogICAgICB9CgogICAgICAuZmFkZWQtcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpOwogICAgICB9CgogICAgICAuZmFkZWQtZWxsaXBzZSB7CiAgICAgICAgZmlsbDogdXJsKCNlbGxpcHNlSGF0Y2gpOwogICAgICB9CgogICAgICAuZmFkZWQtcmVjdCwKICAgICAgLmZhZGVkLWVsbGlwc2UsCiAgICAgIC5mYWRlZC1zZXJpZXMgewogICAgICAgIHN0cm9rZTogdmFyKC0tdGItZ3JhcGgtZmFkZWQpICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgI3JlY3RIYXRjaCBsaW5lLAogICAgICAjZWxsaXBzZUhhdGNoIGxpbmUgewogICAgICAgIGNvbG9yOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICAKICAgIDxzdmcgaGVpZ2h0PSIwIiB3aWR0aD0iMCIgaWQ9InN2Z0RlZnMiPgogICAgICA8ZGVmcz4KICAgICAgICAKICAgICAgICA8cGF0dGVybiBpZD0icmVjdEhhdGNoIiBwYXR0ZXJudHJhbnNmb3JtPSJyb3RhdGUoNDUgMCAwKSIgd2lkdGg9IjUiIGhlaWdodD0iNSIgcGF0dGVybnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8bGluZSB4MT0iMCIgeTE9IjAiIHgyPSIwIiB5Mj0iNSIgc3R5bGU9InN0cm9rZS13aWR0aDogMSIgLz4KICAgICAgICA8L3BhdHRlcm4+CiAgICAgICAgPHBhdHRlcm4gaWQ9ImVsbGlwc2VIYXRjaCIgcGF0dGVybnRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiIHdpZHRoPSIyIiBoZWlnaHQ9IjIiIHBhdHRlcm51bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjIiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiIC8+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLXN0YW1wIiByeD0iNy41IiByeT0iMyIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHJ4PSI1IiByeT0iMiIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtdmVydGljYWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iOSIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjYiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSIzIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZyBpZD0ib3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTYiIHk9IjQiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxMiIgeT0iNCIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjQiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnIGlkPSJzdW1tYXJ5LWljb24iIGZpbGw9IiM4NDg0ODQiIGhlaWdodD0iMTIiIHZpZXdib3g9IjAgMCAyNCAyNCIgd2lkdGg9IjEyIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNOSAxN0g3di03aDJ2N3ptNCAwaC0yVjdoMnYxMHptNCAwaC0ydi00aDJ2NHoiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2RlZnM+CiAgICA8L3N2Zz4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNUeXBlKHR5cGUsICdDT05TVCcpXV0iPgogICAgICA8c3ZnIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxMCAxMCI+CiAgICAgICAgPGNpcmNsZSBjeD0iNSIgY3k9IjUiIHI9IjMiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiAvPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnU1VNTUFSWScpXV0iPgogICAgICA8c3ZnIHdpZHRoJD0iW1toZWlnaHRdXSIgaGVpZ2h0JD0iW1toZWlnaHRdXSIgdmlld2JveD0iMCAwIDI0IDI0IiBmaWxsPSIjODQ4NDg0Ij4KICAgICAgICA8cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6TTkgMTdIN3YtN2gydjd6bTQgMGgtMlY3aDJ2MTB6bTQgMGgtMnYtNGgydjR6IiAvPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnT1AnKV1dIj4KICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMTYgOCI+CiAgICAgICAgPHVzZSB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdlbGxpcHNlJyl9fSIgeD0iOCIgeT0iNCIgLz4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ01FVEEnKV1dIj4KICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMzcgMTYiPgogICAgICAgIDxyZWN0IHg9IjEiIHk9IjEiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdyZWN0Jyl9fSIgc3Ryb2tlLXdpZHRoPSIycHgiIGhlaWdodD0iMTQiIHdpZHRoPSIzNSIgcng9IjUiIHJ5PSI1IiAvPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnU0VSSUVTJyldXSI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1t2ZXJ0aWNhbF1dIj4KICAgICAgICA8c3ZnIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxNiAxNSI+CiAgICAgICAgICA8dXNlIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bGluazpocmVmPSIjb3Atc2VyaWVzLXZlcnRpY2FsLXN0YW1wIiBmaWxsJD0iW1tfZmlsbF1dIiBzdHJva2UkPSJbW19zdHJva2VdXSIgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGZhZGVkLCAnc2VyaWVzJyl9fSIgeD0iMCIgeT0iMiIgLz4KICAgICAgICA8L3N2Zz4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyF2ZXJ0aWNhbF1dIj4KICAgICAgICA8c3ZnIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAyNCAxMCI+CiAgICAgICAgICA8dXNlIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bGluazpocmVmPSIjb3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdzZXJpZXMnKX19IiB4PSIwIiB5PSIxIiAvPgogICAgICAgIDwvc3ZnPgogICAgICA8L3RlbXBsYXRlPgogICAgPC90ZW1wbGF0ZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ub2RlLWljb24iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgdGYtZ3JhcGgtaWNvbiB7CiAgICAgICAgLS10Yi1ncmFwaC1mYWRlZDogdmFyKC0tdGItZ3JhcGgtZmFkZWQpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHRmLWdyYXBoLWljb24gaWQ9Imljb24iIHR5cGU9IltbX2dldFR5cGUobm9kZSwgc3VtbWFyeSwgY29uc3QsIHR5cGUpXV0iIGhlaWdodD0iW1toZWlnaHRdXSIgZmlsbC1vdmVycmlkZT0iW1tfZmlsbE92ZXJyaWRlXV0iIHN0cm9rZS1vdmVycmlkZT0iW1tfZ2V0U3Ryb2tlT3ZlcnJpZGUoX2ZpbGxPdmVycmlkZSldXSIgZmFkZWQ9IltbX2dldEZhZGVkKHJlbmRlckluZm8pXV0iIHZlcnRpY2FsPSJbW19pc1ZlcnRpY2FsKG5vZGUsIHZlcnRpY2FsKV1dIj48L3RmLWdyYXBoLWljb24+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAjbGlzdC1pdGVtIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBjb2xvcjogIzU2NTY1NjsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICAjbGlzdC1pdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1nb29nbGUteWVsbG93LTEwMCk7CiAgICAgIH0KCiAgICAgIC5jbGlja2FibGUgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuIHsKICAgICAgICBtYXJnaW4tbGVmdDogNDBweDsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbS5leGNsdWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuLmVkZ2UtbGFiZWwgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDNweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgICAgfQoKICAgICAgLm5vZGUtaWNvbiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMXB4OwogICAgICAgIGxlZnQ6IDJweDsKICAgICAgfQoKICAgICAgLmZhZGVkIHNwYW4gewogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1ncmFwaC1mYWRlZCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0ibGlzdC1pdGVtIiBvbi1tb3VzZW92ZXI9Il9ub2RlTGlzdGVuZXIiIG9uLW1vdXNlb3V0PSJfbm9kZUxpc3RlbmVyIiBvbi1jbGljaz0iX25vZGVMaXN0ZW5lciI+CiAgICAgIDxkaXYgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGl0ZW1SZW5kZXJJbmZvKX19Ij4KICAgICAgICA8dGYtbm9kZS1pY29uIGNsYXNzPSJub2RlLWljb24iIGhlaWdodD0iMTIiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIgbm9kZT0iW1tpdGVtTm9kZV1dIiByZW5kZXItaW5mbz0iW1tpdGVtUmVuZGVySW5mb11dIiB0ZW1wbGF0ZS1pbmRleD0iW1t0ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgIDwvdGYtbm9kZS1pY29uPgogICAgICAgIDxzcGFuIHRpdGxlJD0iW1tuYW1lXV0iPltbbmFtZV1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBtYXgtaGVpZ2h0OiA1MDBweDsKICAgICAgfQoKICAgICAgLmluY29tcGF0aWJsZS1vcHMtbGlzdCB7CiAgICAgICAgaGVpZ2h0OiAzNTBweDsKICAgICAgICBtYXgtaGVpZ2h0OiA0MDBweDsKICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICBpcm9uLWxpc3QgewogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICB9CgogICAgICBwYXBlci1pdGVtIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGJhY2tncm91bmQ6ICNlOWU5ZTk7CiAgICAgIH0KCiAgICAgIHBhcGVyLWl0ZW0tYm9keVt0d28tbGluZV0gewogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHggNHB4OwogICAgICB9CgogICAgICAuZXhwYW5kZWRJbmZvIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLm5vZGUtbmFtZSB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgZm9udC1zaXplOiAxNHB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC5zdWJ0aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMnB0OwogICAgICAgIGNvbG9yOiAjNWU1ZTVlOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5ub24tY29udHJvbC1saXN0LWl0ZW0gewogICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKICAgICAgfQoKICAgICAgZGl2Lm9wLWNvbXBhdC1kaXNwbGF5IHsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgc3ZnLm9wLWNvbXBhdCB7CiAgICAgICAgd2lkdGg6IDI1MHB4OwogICAgICAgIGhlaWdodDogMjVweDsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgZGl2Lm9wLWNvbXBhdC12YWx1ZSB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY29sb3I6IGJsYWNrOwogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pdGVtPgogICAgICA8cGFwZXItaXRlbS1ib2R5IHR3by1saW5lPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ie3tfZ2V0VG9nZ2xlSWNvbihfZXhwYW5kZWQpfX0iIG9uLWNsaWNrPSJfdG9nZ2xlRXhwYW5kZWQiIGNsYXNzPSJ0b2dnbGUtYnV0dG9uIj4KICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJub2RlLW5hbWUiIGlkPSJub2RldGl0bGUiPltbbm9kZVRpdGxlXV08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHNlY29uZGFyeT4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1YnRpdGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3AtY29tcGF0LWRpc3BsYXkiPgogICAgICAgICAgICAgIDxzdmcgY2xhc3M9Im9wLWNvbXBhdCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDI1MCAyNSI+CiAgICAgICAgICAgICAgICA8ZGVmcz4KICAgICAgICAgICAgICAgICAgPGxpbmVhcmdyYWRpZW50IGlkPSJvcC1jb21wYXQtZmlsbCI+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yJD0iW1tfb3BDb21wYXRDb2xvcl1dIj48L3N0b3A+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0JD0iW1tfb3BDb21wYXRTY29yZV1dIiBzdG9wLWNvbG9yJD0iW1tfb3BDb21wYXRDb2xvcl1dIj48L3N0b3A+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0JD0iW1tfb3BDb21wYXRTY29yZV1dIiBzdG9wLWNvbG9yJD0iW1tfb3BJbmNvbXBhdENvbG9yXV0iPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3IkPSJbW19vcEluY29tcGF0Q29sb3IgXV0iPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgPC9saW5lYXJncmFkaWVudD4KICAgICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICAgIDxyZWN0IGhlaWdodD0iMjUiIHdpZHRoPSIyNTAiIHJ4PSI1IiByeT0iNSIgc3R5bGU9ImZpbGw6IHVybCgnI29wLWNvbXBhdC1maWxsJyk7IiAvPgogICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wLWNvbXBhdC12YWx1ZSI+W1tfb3BDb21wYXRTY29yZUxhYmVsXV08L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9wYXBlci1pdGVtLWJvZHk+CiAgICA8L3BhcGVyLWl0ZW0+CgogICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19leHBhbmRlZH19Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19leHBhbmRlZH19IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJleHBhbmRlZEluZm8iPgogICAgICAgICAgSW5jb21wYXRpYmxlIE9wZXJhdGlvbnM6ICg8c3Bhbj5bW190b3RhbEluY29tcGF0T3BzXV08L3NwYW4+KQogICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0iaW5jb21wYXRpYmxlLW9wcy1saXN0IiBpZD0iaW5jb21wYXRpYmxlT3BzTGlzdCIgaXRlbXM9IltbX2luY29tcGF0aWJsZU9wTm9kZXNdXSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICA8dGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbSBjbGFzcz0ibm9uLWNvbnRyb2wtbGlzdC1pdGVtIiBpdGVtLW5vZGU9IltbaXRlbV1dIiBpdGVtLXJlbmRlci1pbmZvPSJbW19nZXRSZW5kZXJJbmZvKGl0ZW0ubmFtZSwgcmVuZGVySGllcmFyY2h5KV1dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIGl0ZW0tdHlwZT0iaW5jb21wYXRpYmxlLW9wcyI+CiAgICAgICAgICAgICAgPC90Zi1ncmFwaC1vcC1jb21wYXQtbGlzdC1pdGVtPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2lyb24tY29sbGFwc2U+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtbm9kZS1saXN0LWl0ZW0iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgI2xpc3QtaXRlbSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgY29sb3I6ICM1NjU2NTY7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ29vZ2xlLXllbGxvdy0xMDApOwogICAgICB9CgogICAgICAuY2xpY2thYmxlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3BhbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDQwcHg7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0uZXhjbHVkZWQgc3BhbiB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3Bhbi5lZGdlLWxhYmVsIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiAzcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICAgIH0KCiAgICAgIC5ub2RlLWljb24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDFweDsKICAgICAgICBsZWZ0OiAycHg7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogdmFyKC0tdGItZ3JhcGgtZmFkZWQpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBpZD0ibGlzdC1pdGVtIiBvbi1tb3VzZW92ZXI9Il9ub2RlTGlzdGVuZXIiIG9uLW1vdXNlb3V0PSJfbm9kZUxpc3RlbmVyIiBvbi1jbGljaz0iX25vZGVMaXN0ZW5lciI+CiAgICAgIDxkaXYgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGl0ZW1SZW5kZXJJbmZvKX19Ij4KICAgICAgICA8dGYtbm9kZS1pY29uIGNsYXNzPSJub2RlLWljb24iIGhlaWdodD0iMTIiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIgbm9kZT0iW1tpdGVtTm9kZV1dIiByZW5kZXItaW5mbz0iW1tpdGVtUmVuZGVySW5mb11dIiB0ZW1wbGF0ZS1pbmRleD0iW1t0ZW1wbGF0ZUluZGV4XV0iPjwvdGYtbm9kZS1pY29uPgogICAgICAgIDxzcGFuIHRpdGxlJD0iW1tuYW1lXV0iPltbbmFtZV1dPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJlZGdlLWxhYmVsIj5bW2VkZ2VMYWJlbF1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLW5vZGUtaW5mbyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuc3ViLWxpc3QtZ3JvdXAgewogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgZm9udC1zaXplOiAxMnB0OwogICAgICAgIHBhZGRpbmctYm90dG9tOiA4cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdCB7CiAgICAgICAgbWF4LWhlaWdodDogMzAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICB9CgogICAgICAuYXR0ci1sZWZ0IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICB3aWR0aDogMzAlOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBjb2xvcjogIzU2NTY1NjsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgfQoKICAgICAgLmF0dHItcmlnaHQgewogICAgICAgIG1hcmdpbi1sZWZ0OiAzMCU7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIGNvbG9yOiAjNTY1NjU2OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZSB7CiAgICAgICAgZGlzcGxheTogdGFibGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZS1yb3cgewogICAgICAgIGRpc3BsYXk6IHRhYmxlLXJvdzsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0LXRhYmxlLXJvdyAuc3ViLWxpc3QtdGFibGUtY2VsbDpsYXN0LWNoaWxkIHsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0LXRhYmxlLWNlbGwgewogICAgICAgIGNvbG9yOiAjNTY1NjU2OwogICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbWF4LXdpZHRoOiAyMDBweDsKICAgICAgICBwYWRkaW5nOiAwIDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaXRlbSB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBiYWNrZ3JvdW5kOiAjZTllOWU5OwogICAgICB9CgogICAgICBwYXBlci1pdGVtLWJvZHlbdHdvLWxpbmVdIHsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4IDRweDsKICAgICAgfQoKICAgICAgLmV4cGFuZGVkSW5mbyB7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sRGVwcyB7CiAgICAgICAgcGFkZGluZzogMCAwIDAgOHB4OwogICAgICB9CgogICAgICAubm9kZS1uYW1lIHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBmb250LXNpemU6IDE0cHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQoKICAgICAgLm5vZGUtaWNvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CgogICAgICAuc3VidGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICBjb2xvcjogIzVlNWU1ZTsKICAgICAgfQoKICAgICAgLmNvbnRyb2xMaW5lIHsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1idXR0b24gewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAuY29udHJvbC10b2dnbGUtYnV0dG9uIHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAudG9nZ2xlLWluY2x1ZGUtZ3JvdXAgewogICAgICAgIHBhZGRpbmctdG9wOiA0cHg7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtaW5jbHVkZSB7CiAgICAgICAgbWFyZ2luOiA1cHggNnB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMHB0OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtaW5jbHVkZTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ29vZ2xlLXllbGxvdy0xMDApOwogICAgICB9CgogICAgICAubm9uLWNvbnRyb2wtbGlzdC1pdGVtIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8cGFwZXItaXRlbT4KICAgICAgPHBhcGVyLWl0ZW0tYm9keSB0d28tbGluZT4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Int7X2dldFRvZ2dsZUljb24oX2V4cGFuZGVkKX19IiBvbi1jbGljaz0iX3RvZ2dsZUV4cGFuZGVkIiBjbGFzcz0idG9nZ2xlLWJ1dHRvbiI+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm9kZS1uYW1lIiBpZD0ibm9kZXRpdGxlIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHNlY29uZGFyeT4KICAgICAgICAgIDx0Zi1ub2RlLWljb24gY2xhc3M9Im5vZGUtaWNvbiIgbm9kZT0iW1tfbm9kZV1dIiByZW5kZXItaW5mbz0iW1tfZ2V0UmVuZGVySW5mbyhub2RlTmFtZSwgcmVuZGVySGllcmFyY2h5KV1dIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iPjwvdGYtbm9kZS1pY29uPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19ub2RlLm9wfX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWJ0aXRsZSI+CiAgICAgICAgICAgICAgT3BlcmF0aW9uOgogICAgICAgICAgICAgIDxzcGFuPltbX25vZGUub3BdXTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19ub2RlLm1ldGFncmFwaH19Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3VidGl0bGUiPgogICAgICAgICAgICAgIFN1YmdyYXBoOgogICAgICAgICAgICAgIDxzcGFuPltbX25vZGUuY2FyZGluYWxpdHldXTwvc3Bhbj4gbm9kZXMKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3BhcGVyLWl0ZW0tYm9keT4KICAgIDwvcGFwZXItaXRlbT4KICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0ie3tfZXhwYW5kZWR9fSI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfZXhwYW5kZWR9fSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZXhwYW5kZWRJbmZvIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIGF0dHJpYnV0ZXMiPgogICAgICAgICAgICBBdHRyaWJ1dGVzICg8c3Bhbj5bW19hdHRyaWJ1dGVzLmxlbmd0aF1dPC9zcGFuPikKICAgICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0ic3ViLWxpc3QiIGlkPSJhdHRyaWJ1dGVzTGlzdCIgaXRlbXM9IltbX2F0dHJpYnV0ZXNdXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYXR0ci1sZWZ0Ij5bW2l0ZW0ua2V5XV08L2Rpdj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYXR0ci1yaWdodCI+W1tpdGVtLnZhbHVlXV08L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvaXJvbi1saXN0PgogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19kZXZpY2V9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIGRldmljZSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYXR0ci1sZWZ0Ij5EZXZpY2U8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLXJpZ2h0Ij5bW19kZXZpY2VdXTwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgcHJlZGVjZXNzb3JzIj4KICAgICAgICAgICAgSW5wdXRzICg8c3Bhbj5bW190b3RhbFByZWRlY2Vzc29yc11dPC9zcGFuPikKICAgICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0ic3ViLWxpc3QiIGlkPSJpbnB1dHNMaXN0IiBpdGVtcz0iW1tfcHJlZGVjZXNzb3JzLnJlZ3VsYXJdXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGVkZ2UtbGFiZWw9IltbaXRlbS5lZGdlTGFiZWxdXSIgaXRlbS1yZW5kZXItaW5mbz0iW1tpdGVtLnJlbmRlckluZm9dXSIgbmFtZT0iW1tpdGVtLm5hbWVdXSIgaXRlbS10eXBlPSJwcmVkZWNlc3NvcnMiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSI+CiAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvaXJvbi1saXN0PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3ByZWRlY2Vzc29ycy5jb250cm9sLmxlbmd0aF1dIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sRGVwcyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sTGluZSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJ7e19nZXRUb2dnbGVJY29uKF9vcGVuZWRDb250cm9sUHJlZCl9fSIgb24tY2xpY2s9Il90b2dnbGVDb250cm9sUHJlZCIgY2xhc3M9ImNvbnRyb2wtdG9nZ2xlLWJ1dHRvbiI+CiAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgIENvbnRyb2wgZGVwZW5kZW5jaWVzCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0ie3tfb3BlbmVkQ29udHJvbFByZWR9fSIgbm8tYW5pbWF0aW9uPgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X29wZW5lZENvbnRyb2xQcmVkfX0iIHJlc3RhbXA9InRydWUiPgogICAgICAgICAgICAgICAgICAgIDxpcm9uLWxpc3QgY2xhc3M9InN1Yi1saXN0IiBpdGVtcz0iW1tfcHJlZGVjZXNzb3JzLmNvbnRyb2xdXSI+CiAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0Zi1ub2RlLWxpc3QtaXRlbSBjYXJkLW5vZGU9IltbX25vZGVdXSIgaXRlbS1ub2RlPSJbW2l0ZW0ubm9kZV1dIiBpdGVtLXJlbmRlci1pbmZvPSJbW2l0ZW0ucmVuZGVySW5mb11dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiBpdGVtLXR5cGU9InByZWRlY2Vzc29ycyIgY29sb3ItYnk9IltbY29sb3JCeV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90Zi1ub2RlLWxpc3QtaXRlbT4KICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC1ncm91cCBzdWNjZXNzb3JzIj4KICAgICAgICAgICAgT3V0cHV0cyAoPHNwYW4+W1tfdG90YWxTdWNjZXNzb3JzXV08L3NwYW4+KQogICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaWQ9Im91dHB1dHNMaXN0IiBpdGVtcz0iW1tfc3VjY2Vzc29ycy5yZWd1bGFyXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1ub2RlLWxpc3QtaXRlbSBjbGFzcz0ibm9uLWNvbnRyb2wtbGlzdC1pdGVtIiBjYXJkLW5vZGU9IltbX25vZGVdXSIgaXRlbS1ub2RlPSJbW2l0ZW0ubm9kZV1dIiBlZGdlLWxhYmVsPSJbW2l0ZW0uZWRnZUxhYmVsXV0iIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iIG5hbWU9IltbaXRlbS5uYW1lXV0iIGl0ZW0tdHlwZT0ic3VjY2Vzc29yIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgICAgICAgICAgPC90Zi1ub2RlLWxpc3QtaXRlbT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zdWNjZXNzb3JzLmNvbnRyb2wubGVuZ3RoXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xEZXBzIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xMaW5lIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Int7X2dldFRvZ2dsZUljb24oX29wZW5lZENvbnRyb2xTdWNjKX19IiBvbi1jbGljaz0iX3RvZ2dsZUNvbnRyb2xTdWNjIiBjbGFzcz0iY29udHJvbC10b2dnbGUtYnV0dG9uIj4KICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgQ29udHJvbCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19vcGVuZWRDb250cm9sU3VjY319IiBuby1hbmltYXRpb24+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfb3BlbmVkQ29udHJvbFN1Y2N9fSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0ic3ViLWxpc3QiIGl0ZW1zPSJbW19zdWNjZXNzb3JzLmNvbnRyb2xdXSI+CiAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0Zi1ub2RlLWxpc3QtaXRlbSBjYXJkLW5vZGU9IltbX25vZGVdXSIgaXRlbS1ub2RlPSJbW2l0ZW0ubm9kZV1dIiBpdGVtLXJlbmRlci1pbmZvPSJbW2l0ZW0ucmVuZGVySW5mb11dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiBpdGVtLXR5cGU9InN1Y2Nlc3NvcnMiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGYtbm9kZS1saXN0LWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgIDwvaXJvbi1saXN0PgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2hhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzfX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC1ncm91cCBub2RlLXN0YXRzIj4KICAgICAgICAgICAgICBOb2RlIFN0YXRzCiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19ub2RlU3RhdHMudG90YWxCeXRlc319Ij4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtcm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1jZWxsIj5NZW1vcnk8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1jZWxsIj4KICAgICAgICAgICAgICAgICAgICAgIFtbX25vZGVTdGF0c0Zvcm1hdHRlZEJ5dGVzXV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19nZXRUb3RhbE1pY3Jvcyhfbm9kZVN0YXRzKX19Ij4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtcm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1jZWxsIj5Db21wdXRlIFRpbWU8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1jZWxsIj4KICAgICAgICAgICAgICAgICAgICAgIFtbX25vZGVTdGF0c0Zvcm1hdHRlZENvbXB1dGVUaW1lXV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19ub2RlU3RhdHMub3V0cHV0U2l6ZX19Ij4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtcm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1jZWxsIj5UZW5zb3IgT3V0cHV0IFNpemVzPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e19ub2RlU3RhdHNGb3JtYXR0ZWRPdXRwdXRTaXplc319Ij4KICAgICAgICAgICAgICAgICAgICAgICAgW1tpdGVtXV0gPGJyPgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19mdW5jdGlvblVzYWdlcy5sZW5ndGhdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIHByZWRlY2Vzc29ycyI+CiAgICAgICAgICAgICAgVXNhZ2VzIG9mIHRoZSBGdW5jdGlvbiAoPHNwYW4+W1tfZnVuY3Rpb25Vc2FnZXMubGVuZ3RoXV08L3NwYW4+KQogICAgICAgICAgICAgIDxpcm9uLWxpc3QgY2xhc3M9InN1Yi1saXN0IiBpZD0iZnVuY3Rpb25Vc2FnZXNMaXN0IiBpdGVtcz0iW1tfZnVuY3Rpb25Vc2FnZXNdXSI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDx0Zi1ub2RlLWxpc3QtaXRlbSBjbGFzcz0ibm9uLWNvbnRyb2wtbGlzdC1pdGVtIiBjYXJkLW5vZGU9IltbX25vZGVdXSIgaXRlbS1ub2RlPSJbW2l0ZW1dXSIgbmFtZT0iW1tpdGVtLm5hbWVdXSIgaXRlbS10eXBlPSJmdW5jdGlvblVzYWdlcyIgY29sb3ItYnk9IltbY29sb3JCeV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIj4KICAgICAgICAgICAgICAgICAgPC90Zi1ub2RlLWxpc3QtaXRlbT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9pc0xpYnJhcnlGdW5jdGlvbihfbm9kZSldXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1pbmNsdWRlLWdyb3VwIj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBjbGFzcz0idG9nZ2xlLWluY2x1ZGUiIG9uLWNsaWNrPSJfdG9nZ2xlSW5jbHVkZSI+CiAgICAgICAgICAgICAgICA8c3Bhbj5bW19hdXhCdXR0b25UZXh0XV08L3NwYW4+CiAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2lzSW5TZXJpZXMoX25vZGUpfX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2dnbGUtaW5jbHVkZS1ncm91cCI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9InRvZ2dsZS1pbmNsdWRlIiBvbi1jbGljaz0iX3RvZ2dsZUdyb3VwIj4KICAgICAgICAgICAgICAgIDxzcGFuPltbX2dyb3VwQnV0dG9uVGV4dF1dPC9zcGFuPgogICAgICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2lyb24tY29sbGFwc2U+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtaW5mbyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1heC1oZWlnaHQ6IDY1MHB4OwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e3NlbGVjdGVkTm9kZX19Ij4KICAgICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9ImNhcmQiPgogICAgICAgIDx0Zi1ub2RlLWluZm8gZ3JhcGgtaGllcmFyY2h5PSJbW2dyYXBoSGllcmFyY2h5XV0iIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iIGZsYXQtZ3JhcGg9IltbZ3JhcGhdXSIgbm9kZS1uYW1lPSJbW3NlbGVjdGVkTm9kZV1dIiBub2RlLWluY2x1ZGU9Iltbc2VsZWN0ZWROb2RlSW5jbHVkZV1dIiBoaWdobGlnaHRlZC1ub2RlPSJ7e2hpZ2hsaWdodGVkTm9kZX19IiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iPgogICAgICAgIDwvdGYtbm9kZS1pbmZvPgogICAgICA8L3BhcGVyLW1hdGVyaWFsPgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICdvcF9jb21wYXRpYmlsaXR5JyldXSI+CiAgICAgIDx0Zi1ncmFwaC1vcC1jb21wYXQtY2FyZCBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgaGllcmFyY2h5LXBhcmFtcz0iW1toaWVyYXJjaHlQYXJhbXNdXSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIgY29sb3ItYnk9IltbY29sb3JCeV1dIiBub2RlLXRpdGxlPSJbW2NvbXBhdE5vZGVUaXRsZV1dIj4KICAgICAgPC90Zi1ncmFwaC1vcC1jb21wYXQtY2FyZD4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hlYWx0aFBpbGxzQXZhaWxhYmxlKGRlYnVnZ2VyRGF0YUVuYWJsZWQsIG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMpXV0iPgogICAgICA8dGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iIGRlYnVnZ2VyLW51bWVyaWMtYWxlcnRzPSJbW2RlYnVnZ2VyTnVtZXJpY0FsZXJ0c11dIiBub2RlLW5hbWVzLXRvLWhlYWx0aC1waWxscz0iW1tub2RlTmFtZXNUb0hlYWx0aFBpbGxzXV0iIHNlbGVjdGVkLW5vZGU9Int7c2VsZWN0ZWROb2RlfX0iIGhpZ2hsaWdodGVkLW5vZGU9Int7aGlnaGxpZ2h0ZWROb2RlfX0iIGFyZS1oZWFsdGgtcGlsbHMtbG9hZGluZz0iW1thcmVIZWFsdGhQaWxsc0xvYWRpbmddXSIgYWxsLXN0ZXBzLW1vZGUtZW5hYmxlZD0ie3thbGxTdGVwc01vZGVFbmFibGVkfX0iIHNwZWNpZmljLWhlYWx0aC1waWxsLXN0ZXA9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19IiBoZWFsdGgtcGlsbC1zdGVwLWluZGV4PSJ7e2hlYWx0aFBpbGxTdGVwSW5kZXh9fSI+CiAgICAgIDwvdGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkPgogICAgPC90ZW1wbGF0ZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOjpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgL2RlZXAvIC5jbG9zZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBsZWZ0OiAxNXB4OwogICAgICAgIGJvdHRvbTogMTVweDsKICAgICAgfQoKICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5jb250YWluZXIubG9hZGluZyB7CiAgICAgICAgY3Vyc29yOiBwcm9ncmVzczsKICAgICAgICBvcGFjaXR5OiAwLjE7CiAgICAgIH0KCiAgICAgIC5jb250YWluZXIubG9hZGluZy5lcnJvciB7CiAgICAgICAgY3Vyc29yOiBhdXRvOwogICAgICB9CgogICAgICAjaW5mbyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiA1cHg7CiAgICAgICAgdG9wOiA1cHg7CiAgICAgICAgcGFkZGluZzogMHB4OwogICAgICAgIG1heC13aWR0aDogMzgwcHg7CiAgICAgICAgbWluLXdpZHRoOiAzMjBweDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CiAgICAgIH0KCiAgICAgICNtYWluIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgICNwcm9ncmVzcy1iYXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDQwcHg7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KCiAgICAgICNwcm9ncmVzcy1tc2cgewogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICB9CgogICAgICBwYXBlci1wcm9ncmVzcyB7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtaGVpZ2h0OiA2cHg7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1hY3RpdmUtY29sb3I6ICNmMzkxM2U7CiAgICAgIH0KCiAgICAgIC5jb250ZXh0LW1lbnUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlMmUyZTI7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtaW4td2lkdGg6IDE1MHB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkNGQ0ZDQ7CiAgICAgIH0KCiAgICAgIC9kZWVwLyAuY29udGV4dC1tZW51IHVsIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CgogICAgICAvZGVlcC8gLmNvbnRleHQtbWVudSB1bCBsaSB7CiAgICAgICAgcGFkZGluZzogNHB4IDE2cHg7CiAgICAgIH0KCiAgICAgIC9kZWVwLyAuY29udGV4dC1tZW51IHVsIGxpOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjM5MTNlOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNOb3RDb21wbGV0ZShwcm9ncmVzcyldXSI+CiAgICAgIDxkaXYgaWQ9InByb2dyZXNzLWJhciI+CiAgICAgICAgPGRpdiBpZD0icHJvZ3Jlc3MtbXNnIj5bW3Byb2dyZXNzLm1zZ11dPC9kaXY+CiAgICAgICAgPHBhcGVyLXByb2dyZXNzIHZhbHVlPSJbW3Byb2dyZXNzLnZhbHVlXV0iPjwvcGFwZXItcHJvZ3Jlc3M+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDxkaXYgY2xhc3MkPSJbW19nZXRDb250YWluZXJDbGFzcyhwcm9ncmVzcyldXSI+CiAgICAgIDxkaXYgaWQ9Im1haW4iPgogICAgICAgIDx0Zi1ncmFwaCBpZD0iZ3JhcGgiIGdyYXBoLWhpZXJhcmNoeT0ie3tncmFwaEhpZXJhcmNoeX19IiBiYXNpYy1ncmFwaD0iW1tncmFwaF1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW2hpZXJhcmNoeVBhcmFtc11dIiByZW5kZXItaGllcmFyY2h5PSJ7e3JlbmRlckhpZXJhcmNoeX19IiBkZXZpY2VzLWZvci1zdGF0cz0iW1tkZXZpY2VzRm9yU3RhdHNdXSIgc3RhdHM9Iltbc3RhdHNdXSIgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIgaGlnaGxpZ2h0ZWQtbm9kZT0ie3tfaGlnaGxpZ2h0ZWROb2RlfX0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJ7e2NvbG9yQnlQYXJhbXN9fSIgcHJvZ3Jlc3M9Int7cHJvZ3Jlc3N9fSIgZWRnZS1sYWJlbC1mdW5jdGlvbj0iW1tlZGdlTGFiZWxGdW5jdGlvbl1dIiBlZGdlLXdpZHRoLWZ1bmN0aW9uPSJbW2VkZ2VXaWR0aEZ1bmN0aW9uXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0iW1toZWFsdGhQaWxsU3RlcEluZGV4XV0iIGhhbmRsZS1ub2RlLXNlbGVjdGVkPSJbW2hhbmRsZU5vZGVTZWxlY3RlZF1dIiBoYW5kbGUtZWRnZS1zZWxlY3RlZD0iW1toYW5kbGVFZGdlU2VsZWN0ZWRdXSIgdHJhY2UtaW5wdXRzPSJbW3RyYWNlSW5wdXRzXV0iPjwvdGYtZ3JhcGg+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGlkPSJpbmZvIj4KICAgICAgICA8dGYtZ3JhcGgtaW5mbyBpZD0iZ3JhcGgtaW5mbyIgdGl0bGU9InNlbGVjdGVkIiBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgaGllcmFyY2h5LXBhcmFtcz0iW1toaWVyYXJjaHlQYXJhbXNdXSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIgZ3JhcGg9IltbZ3JhcGhdXSIgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIgc2VsZWN0ZWQtbm9kZS1pbmNsdWRlPSJ7e19zZWxlY3RlZE5vZGVJbmNsdWRlfX0iIGhpZ2hsaWdodGVkLW5vZGU9Int7X2hpZ2hsaWdodGVkTm9kZX19IiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIGNvbG9yLWJ5LXBhcmFtcz0iW1tjb2xvckJ5UGFyYW1zXV0iIGRlYnVnZ2VyLWRhdGEtZW5hYmxlZD0iW1tkZWJ1Z2dlckRhdGFFbmFibGVkXV0iIGFyZS1oZWFsdGgtcGlsbHMtbG9hZGluZz0iW1thcmVIZWFsdGhQaWxsc0xvYWRpbmddXSIgZGVidWdnZXItbnVtZXJpYy1hbGVydHM9IltbZGVidWdnZXJOdW1lcmljQWxlcnRzXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgYWxsLXN0ZXBzLW1vZGUtZW5hYmxlZD0ie3thbGxTdGVwc01vZGVFbmFibGVkfX0iIHNwZWNpZmljLWhlYWx0aC1waWxsLXN0ZXA9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19IiBoZWFsdGgtcGlsbC1zdGVwLWluZGV4PSJ7e2hlYWx0aFBpbGxTdGVwSW5kZXh9fSIgY29tcGF0LW5vZGUtdGl0bGU9IltbY29tcGF0Tm9kZVRpdGxlXV0iIG9uLW5vZGUtdG9nZ2xlLWluY2x1c2lvbj0iX29uTm9kZUluY2x1c2lvblRvZ2dsZWQiIG9uLW5vZGUtdG9nZ2xlLXNlcmllc2dyb3VwPSJfb25Ob2RlU2VyaWVzR3JvdXBUb2dnbGVkIj48L3RmLWdyYXBoLWluZm8+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1yYWRpby1idXR0b24iPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGxpbmUtaGVpZ2h0OiAwOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1zaXplOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tc2l6ZSwgMTZweCk7CiAgICAgICAgLyogLTFweCBpcyBhIHNlbnRpbmVsIGZvciB0aGUgZGVmYXVsdCBhbmQgaXMgcmVwbGFjZSBpbiBgYXR0YWNoZWRgLiAqLwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemU6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZSwgLTFweCk7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgICNyYWRpb0NvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWlubGluZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemUpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24tc2l6ZSk7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItcmFkaW8tYnV0dG9uLXJhZGlvLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgI2luayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICB3aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgb3BhY2l0eTogMC42OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgIH0KCiAgICAgICNpbmtbY2hlY2tlZF0gewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgfQoKICAgICAgI29mZlJhZGlvLCAjb25SYWRpbyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgfQoKICAgICAgI29mZlJhZGlvIHsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWJhY2tncm91bmQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4yOHM7CiAgICAgIH0KCiAgICAgICNvblJhZGlvIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIGVhc2UgMC4yOHM7CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIGVhc2UgMC4yOHM7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAjb2ZmUmFkaW8gewogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAjb25SYWRpbyB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuNSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjUpOwogICAgICB9CgogICAgICAjcmFkaW9MYWJlbCB7CiAgICAgICAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbC1zcGFjaW5nLCAxMHB4KTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWw7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjaGVja2VkXSkgI3JhZGlvTGFiZWwgewogICAgICAgIEBhcHBseSAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbC1jaGVja2VkOwogICAgICB9CgogICAgICAjcmFkaW9MYWJlbDpkaXIocnRsKSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWwtc3BhY2luZywgMTBweCk7CiAgICAgIH0KCiAgICAgICNyYWRpb0xhYmVsW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIGRpc2FibGVkIHN0YXRlICovCgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjb2ZmUmFkaW8gewogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdW2NoZWNrZWRdKSAjb25SYWRpbyB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjcmFkaW9MYWJlbCB7CiAgICAgICAgLyogc2xpZ2h0bHkgZGFya2VyIHRoYW4gdGhlIGJ1dHRvbiwgc28gdGhhdCBpdCdzIHJlYWRhYmxlICovCiAgICAgICAgb3BhY2l0eTogMC42NTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJyYWRpb0NvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9Im9mZlJhZGlvIj48L2Rpdj4KICAgICAgPGRpdiBpZD0ib25SYWRpbyI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJyYWRpb0xhYmVsIj48c2xvdD48L3Nsb3Q+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1yYWRpby1ncm91cCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICA6aG9zdCA6OnNsb3R0ZWQoKikgewogICAgICAgIHBhZGRpbmc6IHZhcigtLXBhcGVyLXJhZGlvLWdyb3VwLWl0ZW0tcGFkZGluZywgMTJweCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXRvb2x0aXAiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIHotaW5kZXg6IDEwMDI7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIH0KCiAgICAgICN0b29sdGlwIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvb2x0aXAtYmFja2dyb3VuZCwgIzYxNjE2MSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvb2x0aXAtdGV4dC1jb2xvciwgd2hpdGUpOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcDsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZVNjYWxlVXAgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC4wKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lU2NhbGVEb3duIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMCk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZUZhZGVJbk9wYWNpdHkgewogICAgICAgIDAlIHsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZUZhZGVPdXRPcGFjaXR5IHsKICAgICAgICAwJSB7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVTbGlkZURvd25JbiB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMDAwcHgpOwogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgICAgMTAlIHsKICAgICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lU2xpZGVEb3duT3V0IHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICAgIDEwJSB7CiAgICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMDAwcHgpOwogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5mYWRlLWluLWFuaW1hdGlvbiB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktaW4sIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVGYWRlSW5PcGFjaXR5OwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24taW4sIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLmZhZGUtb3V0LWFuaW1hdGlvbiB7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQsIDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lRmFkZU91dE9wYWNpdHk7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLnNjYWxlLXVwLWFuaW1hdGlvbiB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LWluLCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lU2NhbGVVcDsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLWluLCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5zY2FsZS1kb3duLWFuaW1hdGlvbiB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZVNjYWxlRG93bjsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuc2xpZGUtZG93bi1hbmltYXRpb24gewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjAwMHB4KTsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVTbGlkZURvd25JbjsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjAsIDAuMCwgMC4yLCAxKTsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24tb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5zbGlkZS1kb3duLWFuaW1hdGlvbi1vdXQgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZVNsaWRlRG93bk91dDsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMSwgMSk7CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuY2FuY2VsLWFuaW1hdGlvbiB7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAtMzBzICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIFRoYW5rcyBJRSAxMC4gKi8KCiAgICAgIC5oaWRkZW4gewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJ0b29sdGlwIiBjbGFzcz0iaGlkZGVuIj4KICAgICAgPHNsb3Q+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1ub2RlLXNlYXJjaCI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0ic2VhcmNoLWNvbnRhaW5lciI+CiAgICAgIDxwYXBlci1pbnB1dCBpZD0icnVucy1yZWdleCIgbGFiZWw9IlNlYXJjaCBub2Rlcy4gUmVnZXhlcyBzdXBwb3J0ZWQuIiB2YWx1ZT0ie3tfcmF3UmVnZXhJbnB1dH19Ij4KICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPGRpdiBpZD0ic2VhcmNoLXJlc3VsdHMtYW5jaG9yIj4KICAgICAgICA8ZGl2IGlkPSJzZWFyY2gtcmVzdWx0cyI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19yZWdleE1hdGNoZXNdXSI+CiAgICAgICAgICAgIDxkaXYgaWQ9InNlYXJjaC1tYXRjaCIgb24tY2xpY2s9Il9tYXRjaENsaWNrZWQiPltbaXRlbV1dPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAjc2VhcmNoLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgIH0KCiAgICAgICNydW5zLXJlZ2V4IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI3NlYXJjaC1yZXN1bHRzLWFuY2hvciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjc2VhcmNoLXJlc3VsdHMgewogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfQoKICAgICAgI3NlYXJjaC1tYXRjaCB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgcGFkZGluZzogM3B4OwogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGRpcmVjdGlvbjogcnRsOwogICAgICB9CgogICAgICAjc2VhcmNoLW1hdGNoOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi1vcmFuZ2Utd2Vhayk7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtY29udHJvbHMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGNvbG9yOiBncmF5OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIC0tcGFwZXItZHJvcGRvd24tbWVudS1pbnB1dDogewogICAgICAgICAgcGFkZGluZzogMDsKICAgICAgICAgIGNvbG9yOiBncmF5OwogICAgICAgIH0KICAgICAgICAtLWlyb24taWNvbi13aWR0aDogMTVweDsKICAgICAgICAtLWlyb24taWNvbi1oZWlnaHQ6IDE1cHg7CiAgICAgICAgLS1wcmltYXJ5LXRleHQtY29sb3I6IGdyYXk7CiAgICAgICAgLS1wYXBlci1pdGVtLW1pbi1oZWlnaHQ6IDMwcHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLWJ1dHRvbltyYWlzZWRdLmtleWJvYXJkLWZvY3VzIHsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CgogICAgICAucnVuLWRyb3Bkb3duIHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lcjogewogICAgICAgICAgcGFkZGluZzogOHB4IDAgOHB4IDEwcHg7CiAgICAgICAgfQogICAgICB9CgogICAgICAuY29sb3ItZHJvcGRvd24gewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyOiB7CiAgICAgICAgICBwYWRkaW5nOiA5cHggMCAwIDEzcHg7CiAgICAgICAgfQogICAgICB9CgogICAgICB0YWJsZSB7CiAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgICAgICBib3JkZXItc3BhY2luZzogMDsKICAgICAgfQoKICAgICAgdGFibGUgdGQgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAuYWxsY29udHJvbHMgewogICAgICAgIHBhZGRpbmc6IDAgMjBweCAyMHB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CgogICAgICAubGVnZW5kLWhvbGRlciB7CiAgICAgICAgYmFja2dyb3VuZDogI2U5ZTllOTsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2NjYzsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGNvbG9yOiAjNTU1OwogICAgICAgIHBhZGRpbmc6IDE1cHggMjBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1sZWdlbmQtYnV0dG9uIHsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAudG9nZ2xlLWxlZ2VuZC10ZXh0IHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CgogICAgICBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDVweDsKICAgICAgfQogICAgICBzdmcuaWNvbiwKICAgICAgdGYtZ3JhcGgtaWNvbiB7CiAgICAgICAgd2lkdGg6IDYwcHg7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICB9CiAgICAgIC5kb21haW5WYWx1ZXMgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgICAgd2lkdGg6IDE2NXB4OwogICAgICB9CiAgICAgIC5kb21haW5TdGFydCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgLmRvbWFpbkVuZCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CiAgICAgIC5jb2xvckJveCB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5pbWFnZS1pY29uIHsKICAgICAgICB3aWR0aDogMjRweDsKICAgICAgICBoZWlnaHQ6IDI0cHg7CiAgICAgIH0KCiAgICAgIC5oZWxwLWljb24gewogICAgICAgIGhlaWdodDogMTVweDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLmdyYXkgewogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAudGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBtYXJnaW46IDhweCA1cHggOHB4IDA7CiAgICAgICAgY29sb3I6IGJsYWNrOwogICAgICB9CiAgICAgIC50aXRsZSBzbWFsbCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgfQogICAgICAuZGV2aWNlTGlzdCwKICAgICAgLnhsYUNsdXN0ZXJMaXN0IHsKICAgICAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CgogICAgICAjZmlsZSB7CiAgICAgICAgcGFkZGluZzogOHB4IDA7CiAgICAgIH0KCiAgICAgIC5jb2xvci1sZWdlbmQtcm93IHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGNsZWFyOiBib3RoOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQoKICAgICAgLmNvbG9yLWxlZ2VuZC1yb3cgLmxhYmVsLAogICAgICAuY29sb3ItbGVnZW5kLXJvdyBzdmcsCiAgICAgIC5jb2xvci1sZWdlbmQtcm93IHRmLWdyYXBoLWljb24gewogICAgICAgIGZsZXg6IDAgMCA0MHB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMjBweDsKICAgICAgfQoKICAgICAgLmRldmljZXMtY2hlY2tib3ggaW5wdXQgewogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQoKICAgICAgLmNvbnRyb2wtaG9sZGVyIC5pY29uLWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbjogMCAtNXB4OwogICAgICAgIHBhZGRpbmc6IDVweDsKICAgICAgfQoKICAgICAgLmJ1dHRvbi10ZXh0IHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgIH0KCiAgICAgIC51cGxvYWQtYnV0dG9uIHsKICAgICAgICB3aWR0aDogMTY1cHg7CiAgICAgICAgaGVpZ2h0OiAyNXB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICAgIG1hcmdpbi10b3A6IDRweDsKICAgICAgfQoKICAgICAgLmJ1dHRvbi1pY29uIHsKICAgICAgICB3aWR0aDogMjZweDsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS01MDApOwogICAgICB9CgogICAgICAuaGlkZGVuLWlucHV0IHsKICAgICAgICBoZWlnaHQ6IDBweDsKICAgICAgICB3aWR0aDogMHB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5hbGxjb250cm9scyAuY29udHJvbC1ob2xkZXIgewogICAgICAgIGNsZWFyOiBib3RoOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9CgogICAgICAuYWxsY29udHJvbHMgLmNvbnRyb2wtaG9sZGVyIHBhcGVyLXJhZGlvLWdyb3VwIHsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KCiAgICAgIHNwYW4uY291bnRlciB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGNvbG9yOiBncmF5OwogICAgICB9CgogICAgICAucnVucyBwYXBlci1pdGVtIHsKICAgICAgICAtLXBhcGVyLWl0ZW06IHsKICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgfQogICAgICB9CgogICAgICB0YWJsZS5jb250cm9sLWhvbGRlciB7CiAgICAgICAgYm9yZGVyOiAwOwogICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICAgIH0KCiAgICAgIHRhYmxlLnRmLWdyYXBoLWNvbnRyb2xzIHRkLmlucHV0LWVsZW1lbnQtdGFibGUtZGF0YSB7CiAgICAgICAgcGFkZGluZzogMCAwIDAgMjBweDsKICAgICAgfQoKICAgICAgLnNwYWNlciB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CgogICAgICAuY29sb3ItdGV4dCB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyoqIE92ZXJyaWRlIGlubGluZSBzdHlsZXMgdGhhdCBzdXBwcmVzcyBwb2ludGVyIGV2ZW50cyBmb3IgZGlzYWJsZWQgYnV0dG9ucy4gT3RoZXJ3aXNlLCB0aGUgKi8KICAgICAgLyogIHRvb2x0aXBzIGRvIG5vdCBhcHBlYXIuICovCiAgICAgIHBhcGVyLXJhZGlvLWdyb3VwIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG8gIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLmxlZ2VuZC1jbGFyaWZpZXIgewogICAgICAgIGNvbG9yOiAjMjY2MjM2OwogICAgICAgIGN1cnNvcjogaGVscDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KCiAgICAgIC5sZWdlbmQtY2xhcmlmaWVyIHBhcGVyLXRvb2x0aXAgewogICAgICAgIHdpZHRoOiAxNTBweDsKICAgICAgfQoKICAgICAgLyoqIE90aGVyd2lzZSwgcG9seW1lciBVSSBjb250cm9scyBhcHBlYXIgYXRvcCBub2RlIHNlYXJjaC4gKi8KICAgICAgdGYtZ3JhcGgtbm9kZS1zZWFyY2ggewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGNsYXNzPSJhbGxjb250cm9scyI+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8dGYtZ3JhcGgtbm9kZS1zZWFyY2ggc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSI+PC90Zi1ncmFwaC1ub2RlLXNlYXJjaD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJpY29uLWJ1dHRvbiIgb24tdGFwPSJfZml0IiBhbHQ9IkZpdCB0byBzY3JlZW4iPgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJhc3BlY3QtcmF0aW8iIGNsYXNzPSJidXR0b24taWNvbiI+PC9pcm9uLWljb24+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iYnV0dG9uLXRleHQiPkZpdCB0byBTY3JlZW48L3NwYW4+CiAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0iaWNvbi1idXR0b24iIG9uLWNsaWNrPSJkb3dubG9hZCIgYWx0PSJEb3dubG9hZCBQTkciPgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJmaWxlLWRvd25sb2FkIiBjbGFzcz0iYnV0dG9uLWljb24iPjwvaXJvbi1pY29uPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImJ1dHRvbi10ZXh0Ij5Eb3dubG9hZCBQTkc8L3NwYW4+CiAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgPGEgaHJlZj0iIyIgaWQ9ImdyYXBoZG93bmxvYWQiIGNsYXNzPSJ0aXRsZSIgZG93bmxvYWQ9ImdyYXBoLnBuZyI+PC9hPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIgcnVucyI+CiAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPgogICAgICAgICAgUnVuIDxzcGFuIGNsYXNzPSJjb3VudGVyIj4oW1tkYXRhc2V0cy5sZW5ndGhdXSk8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQgbm8tYW5pbWF0aW9ucyBub2luayBob3Jpem9udGFsLWFsaWduPSJsZWZ0IiBjbGFzcz0icnVuLWRyb3Bkb3duIj4KICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRSdW5JbmRleH19IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tkYXRhc2V0c11dIj4KICAgICAgICAgICAgICA8cGFwZXItaXRlbT5bW2l0ZW0ubmFtZV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93U2Vzc2lvblJ1bnNEcm9wZG93bl1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+CiAgICAgICAgICAgIFRhZwogICAgICAgICAgICA8c3BhbiBjbGFzcz0iY291bnRlciI+KFtbX251bVRhZ3MoZGF0YXNldHMsIF9zZWxlY3RlZFJ1bkluZGV4KV1dKTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQgbm8tYW5pbWF0aW9ucyBob3Jpem9udGFsLWFsaWduPSJsZWZ0IiBub2luayBjbGFzcz0icnVuLWRyb3Bkb3duIj4KICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e19zZWxlY3RlZFRhZ0luZGV4fX0iIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2dldFRhZ3MoZGF0YXNldHMsIF9zZWxlY3RlZFJ1bkluZGV4KV1dIj4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPltbaXRlbS5kaXNwbGF5TmFtZV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dVcGxvYWRCdXR0b25dXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPlVwbG9hZDwvZGl2PgogICAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9InVwbG9hZC1idXR0b24iIG9uLWNsaWNrPSJfZ2V0RmlsZSIgdGl0bGU9IlVwbG9hZCBhIGdyYXBoIHBidHh0IGZpbGUgdG8gdmlldyB0aGUgZ3JhcGgiPgogICAgICAgICAgICBDaG9vc2UgRmlsZQogICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoaWRkZW4taW5wdXQiPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgaWQ9ImZpbGUiIG5hbWU9ImZpbGUiIG9uLWNoYW5nZT0iX3VwZGF0ZUZpbGVJbnB1dCIgYWNjZXB0PSIucGJ0eHQiPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8cGFwZXItcmFkaW8tZ3JvdXAgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkR3JhcGhUeXBlfX0iPgogICAgICAgICAgCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9Im9wX2dyYXBoIiBkaXNhYmxlZD0iW1tfZ2V0U2VsZWN0aW9uT3BHcmFwaERpc2FibGVkKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCwgX3NlbGVjdGVkVGFnSW5kZXgpXV0iPkdyYXBoPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9ImNvbmNlcHR1YWxfZ3JhcGgiIGRpc2FibGVkPSJbW19nZXRTZWxlY3Rpb25Db25jZXB0dWFsR3JhcGhEaXNhYmxlZChkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4KV1dIj5Db25jZXB0dWFsIEdyYXBoPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9InByb2ZpbGUiIGRpc2FibGVkPSJbW19nZXRTZWxlY3Rpb25Qcm9maWxlRGlzYWJsZWQoZGF0YXNldHMsIF9zZWxlY3RlZFJ1bkluZGV4LCBfc2VsZWN0ZWRUYWdJbmRleCldXSI+UHJvZmlsZTwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxwYXBlci10b2dnbGUtYnV0dG9uIGNoZWNrZWQ9Int7dHJhY2VJbnB1dHN9fSIgY2xhc3M9InRpdGxlIj4KICAgICAgICAgICAgVHJhY2UgaW5wdXRzCiAgICAgICAgICA8L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaGVhbHRoUGlsbHNGZWF0dXJlRW5hYmxlZF1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBjaGVja2VkPSJ7e2hlYWx0aFBpbGxzVG9nZ2xlZE9ufX0iIGNsYXNzPSJ0aXRsZSI+U2hvdyBoZWFsdGggcGlsbHM8L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+Q29sb3I8L2Rpdj4KICAgICAgICA8cGFwZXItcmFkaW8tZ3JvdXAgc2VsZWN0ZWQ9Int7Y29sb3JCeX19Ij4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0ic3RydWN0dXJlIj5TdHJ1Y3R1cmU8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9ImRldmljZSI+RGV2aWNlPC9wYXBlci1yYWRpby1idXR0b24+CgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ieGxhLWNsdXN0ZXItcmFkaW8tYnV0dG9uIiBuYW1lPSJ4bGFfY2x1c3RlciIgZGlzYWJsZWQ9IltbIV94bGFDbHVzdGVyc1Byb3ZpZGVkKHJlbmRlckhpZXJhcmNoeSldXSI+CiAgICAgICAgICAgIFhMQSBDbHVzdGVyCiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgZm9yPSJ4bGEtY2x1c3Rlci1yYWRpby1idXR0b24iIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgQ29sb3JpbmcgYnkgWExBIGNsdXN0ZXIgaXMgb25seSBlbmFibGVkIGlmIGF0IGxlYXN0IDEgb3Agc3BlY2lmaWVzCiAgICAgICAgICAgIGFuIFhMQSBjbHVzdGVyLgogICAgICAgICAgPC9wYXBlci10b29sdGlwPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9ImNvbXB1dGUtdGltZS1yYWRpby1idXR0b24iIG5hbWU9ImNvbXB1dGVfdGltZSIgZGlzYWJsZWQ9IltbIXN0YXRzXV0iPgogICAgICAgICAgICBDb21wdXRlIHRpbWUKICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9ImNvbXB1dGUtdGltZS1yYWRpby1idXR0b24iIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgQ29sb3JpbmcgYnkgY29tcHV0ZSB0aW1lIGlzIG9ubHkgZW5hYmxlZCBpZiB0aGUgUnVuTWV0YWRhdGEgcHJvdG8gaXMKICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSBGaWxlV3JpdGVyIHdoZW4gYSBzcGVjaWZpYyBzZXNzaW9uIGlzIHJ1bi4KICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJtZW1vcnktcmFkaW8tYnV0dG9uIiBuYW1lPSJtZW1vcnkiIGRpc2FibGVkPSJbWyFzdGF0c11dIj4KICAgICAgICAgICAgTWVtb3J5CiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgZm9yPSJtZW1vcnktcmFkaW8tYnV0dG9uIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgIENvbG9yaW5nIGJ5IG1lbW9yeSBpcyBvbmx5IGVuYWJsZWQgaWYgdGhlIFJ1bk1ldGFkYXRhIHByb3RvIGlzCiAgICAgICAgICAgIHBhc3NlZCB0byB0aGUgRmlsZVdyaXRlciB3aGVuIGEgc3BlY2lmaWMgc2Vzc2lvbiBpcyBydW4uCiAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0idHB1LWNvbXBhdGliaWxpdHktcmFkaW8tYnV0dG9uIiBuYW1lPSJvcF9jb21wYXRpYmlsaXR5Ij4KICAgICAgICAgICAgVFBVIENvbXBhdGliaWxpdHkKICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9InRwdS1jb21wYXRpYmlsaXR5LXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICBDb2xvcmluZyBieSB3aGV0aGVyIGFuIG9wZXJhdGlvbiBpcyBjb21wYXRpYmxlIGZvciB0aGUgVFBVIGRldmljZS4KICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgogICAgICAgIDxzcGFuIGNsYXNzPSJzcGFjZXIiPjwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXY+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0dyYWRpZW50Q29sb3Jpbmcoc3RhdHMsIGNvbG9yQnkpXV0iPgogICAgICAgICAgPHN2ZyB3aWR0aD0iMTQwIiBoZWlnaHQ9IjIwIiBzdHlsZT0ibWFyZ2luOiAwIDVweCIgY2xhc3M9ImNvbG9yLXRleHQiPgogICAgICAgICAgICA8ZGVmcz4KICAgICAgICAgICAgICA8bGluZWFyZ3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50IiB4MT0iMCUiIHkxPSIwJSIgeDI9IjEwMCUiIHkyPSIwJSI+CiAgICAgICAgICAgICAgICA8c3RvcCBjbGFzcz0ic3RhcnQiIG9mZnNldD0iMCUiIHN0b3AtY29sb3IkPSJbW19jdXJyZW50R3JhZGllbnRQYXJhbXMuc3RhcnRDb2xvcl1dIiAvPgogICAgICAgICAgICAgICAgPHN0b3AgY2xhc3M9ImVuZCIgb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yJD0iW1tfY3VycmVudEdyYWRpZW50UGFyYW1zLmVuZENvbG9yXV0iIC8+CiAgICAgICAgICAgICAgPC9saW5lYXJncmFkaWVudD4KICAgICAgICAgICAgPC9kZWZzPgogICAgICAgICAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMTM1IiBoZWlnaHQ9IjIwIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50KSIgc3Ryb2tlPSJibGFjayIgLz4KICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgPGRpdiBjbGFzcz0iZG9tYWluVmFsdWVzIGNvbG9yLXRleHQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkb21haW5TdGFydCI+W1tfY3VycmVudEdyYWRpZW50UGFyYW1zLm1pblZhbHVlXV08L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZG9tYWluRW5kIj5bW19jdXJyZW50R3JhZGllbnRQYXJhbXMubWF4VmFsdWVdXTwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8YnIgc3R5bGU9ImNsZWFyOiBib3RoIj4KICAgICAgICAgIDxkaXY+RGV2aWNlcyBpbmNsdWRlZCBpbiBzdGF0czo8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRldmljZUxpc3QiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jdXJyZW50RGV2aWNlc11dIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93IGRldmljZXMtY2hlY2tib3giPgogICAgICAgICAgICAgICAgPHNwYW4+PGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZSQ9IltbaXRlbS5kZXZpY2VdXSIgY2hlY2tlZCQ9IltbaXRlbS51c2VkXV0iIG9uLWNsaWNrPSJfZGV2aWNlQ2hlY2tib3hDbGlja2VkIj48L3NwYW4+CiAgICAgICAgICAgICAgICA8c3Bhbj5bW2l0ZW0uc3VmZml4XV08L3NwYW4+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaXRlbS5pZ25vcmVkTXNnXV0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaGVscCIgY2xhc3M9ImhlbHAtaWNvbiI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiIGFuaW1hdGlvbi1kZWxheT0iMCI+W1tpdGVtLmlnbm9yZWRNc2ddXTwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICdzdHJ1Y3R1cmUnKV1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLXRleHQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGFiZWwiPgogICAgICAgICAgICAgICAgY29sb3JzCiAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPnNhbWUgc3Vic3RydWN0dXJlPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iTUVUQSIgaGVpZ2h0PSIxNiIgZmlsbC1vdmVycmlkZT0iI2VlZSIgc3Ryb2tlLW92ZXJyaWRlPSIjYTZhNmE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+dW5pcXVlIHN1YnN0cnVjdHVyZTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICdkZXZpY2UnKV1dIj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2N1cnJlbnREZXZpY2VQYXJhbXNdXSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJNRVRBIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSJbW2l0ZW0uY29sb3JdXSIgc3Ryb2tlLW92ZXJyaWRlPSIjYTZhNmE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5bW2l0ZW0uZGV2aWNlXV08L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik1FVEEiIGhlaWdodD0iMTYiIGZpbGwtb3ZlcnJpZGU9IiNlZWUiIHN0cm9rZS1vdmVycmlkZT0iI2E2YTZhNiI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPnVua25vd24gZGV2aWNlPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ3hsYV9jbHVzdGVyJyldXSI+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jdXJyZW50WGxhQ2x1c3RlclBhcmFtc11dIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICAgIDxzdmc+CiAgICAgICAgICAgICAgICAgIDx1c2UgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhsaW5rOmhyZWY9IiN1bmZpbGxlZC1yZWN0IiB4PSIwIiB5PSIwIiBzdHlsZT0iZmlsbDpbW2l0ZW0uY29sb3JdXSIgLz4KICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+W1tpdGVtLnhsYV9jbHVzdGVyXV08L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgIDxzdmc+CiAgICAgICAgICAgICAgICA8dXNlIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bGluazpocmVmPSIjZ3JleS1yZWN0IiB4PSIwIiB5PSIwIiAvPgogICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPnVua25vd24gWExBIGNsdXN0ZXI8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2VxdWFscyhjb2xvckJ5LCAnb3BfY29tcGF0aWJpbGl0eScpXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItdGV4dCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik9QIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSIjMGY5ZDU4IiBzdHJva2Utb3ZlcnJpZGU9IiNjY2MiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5WYWxpZCBPcDwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik9QIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSIjZGI0NDM3IiBzdHJva2Utb3ZlcnJpZGU9IiNjY2MiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5JbnZhbGlkIE9wPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zdGF0c05vdE51bGwoc3RhdHMpXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik1FVEEiIGhlaWdodD0iMTYiIGZhZGVkPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+dW51c2VkIHN1YnN0cnVjdHVyZTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtaG9sZGVyIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249IltbX2dldFRvZ2dsZUxlZ2VuZEljb24oX2xlZ2VuZE9wZW5lZCldXSIgb24tY2xpY2s9Il90b2dnbGVMZWdlbmRPcGVuIiBjbGFzcz0idG9nZ2xlLWxlZ2VuZC1idXR0b24iPgogICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8c3BhbiBjbGFzcz0idG9nZ2xlLWxlZ2VuZC10ZXh0Ij4KICAgICAgICBbW19nZXRUb2dnbGVUZXh0KF9sZWdlbmRPcGVuZWQpXV0KICAgICAgPC9zcGFuPgogICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9IltbX2xlZ2VuZE9wZW5lZF1dIj4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHRhYmxlPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkPjxkaXYgY2xhc3M9InRpdGxlIj5HcmFwaDwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgPHRkPigqID0gZXhwYW5kYWJsZSk8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iTUVUQSIgaGVpZ2h0PSIxNiIgZmlsbC1vdmVycmlkZT0iI2Q5ZDlkOSIgc3Ryb2tlLW92ZXJyaWRlPSIjY2NjIj48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBOYW1lc3BhY2U8c3BhbiBjbGFzcz0iZ3JheSI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBFbmNhcHN1bGF0ZXMgYSBzZXQgb2Ygbm9kZXMuIE5hbWVzcGFjZSBpcyBoaWVyYXJjaGljYWwgYW5kCiAgICAgICAgICAgICAgICAgICAgYmFzZWQgb24gc2NvcGUuCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJPUCIgaGVpZ2h0PSIxNiI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgT3BOb2RlCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgTm9kZSB0aGF0IHBlcmZvcm1zIGFuIG9wZXJhdGlvbi4gVGhlc2Ugbm9kZXMgY2Fubm90IGV4cGFuZC4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9IlNFUklFUyIgaGVpZ2h0PSIxNiI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgVW5jb25uZWN0ZWQgc2VyaWVzPHNwYW4gY2xhc3M9ImdyYXkiPio8L3NwYW4+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2Ugb2YgbnVtYmVyZWQgbm9kZXMgdGhhdCBhcmUgbm90IGNvbm5lY3RlZCB0byBlYWNoCiAgICAgICAgICAgICAgICAgICAgb3RoZXIuCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJTRVJJRVMiIGhlaWdodD0iMTYiIHZlcnRpY2FsPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIENvbm5lY3RlZCBzZXJpZXM8c3BhbiBjbGFzcz0iZ3JheSI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBvZiBudW1iZXJlZCBub2RlcyB0aGF0IGFyZSBjb25uZWN0ZWQgdG8gZWFjaCBvdGhlci4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iPgogICAgICAgICAgICAgICAgICA8Y2lyY2xlIGZpbGw9IndoaXRlIiBzdHJva2U9IiM4NDg0ODQiIGN4PSIxMCIgY3k9IjEwIiByPSI1IiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBDb25zdGFudAogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIE5vZGUgdGhhdCBvdXRwdXRzIGEgY29uc3RhbnQgdmFsdWUuCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJTVU1NQVJZIiBoZWlnaHQ9IjIwIj48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBTdW1tYXJ5CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgTm9kZSB0aGF0IGNvbGxlY3RzIGRhdGEgZm9yIHZpc3VhbGl6YXRpb24gd2l0aGluCiAgICAgICAgICAgICAgICAgICAgVGVuc29yQm9hcmQuCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJpY29uIiBoZWlnaHQ9IjE1cHgiIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxNSAxNSI+CiAgICAgICAgICAgICAgICAgIDxkZWZzPgogICAgICAgICAgICAgICAgICAgIDxtYXJrZXIgaWQ9ImRhdGFmbG93LWFycm93aGVhZC1sZWdlbmQiIGZpbGw9IiNiYmIiIG1hcmtlcndpZHRoPSIxMCIgbWFya2VyaGVpZ2h0PSIxMCIgcmVmeD0iOSIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPgogICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCAxMCw1IEwgMCwxMCBDIDMsNyAzLDMgMCwwIiAvPgogICAgICAgICAgICAgICAgICAgIDwvbWFya2VyPgogICAgICAgICAgICAgICAgICA8L2RlZnM+CiAgICAgICAgICAgICAgICAgIDxwYXRoIG1hcmtlci1lbmQ9InVybCgjZGF0YWZsb3ctYXJyb3doZWFkLWxlZ2VuZCkiIHN0cm9rZT0iI2JiYiIgZD0iTTIgOSBsIDI5IDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgLz4KICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgRGF0YWZsb3cgZWRnZQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIEVkZ2Ugc2hvd2luZyB0aGUgZGF0YSBmbG93IGJldHdlZW4gb3BlcmF0aW9ucy4gRWRnZXMgZmxvdwogICAgICAgICAgICAgICAgICAgIHVwd2FyZHMgdW5sZXNzIGFycm93aGVhZHMgc3BlY2lmeSBvdGhlcndpc2UuCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJpY29uIiBoZWlnaHQ9IjE1cHgiIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxNSAxNSI+CiAgICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZT0iI2JiYiIgZD0iTTIgOSBsIDI5IDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWRhc2hhcnJheT0iMiwgMiIgLz4KICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgQ29udHJvbCBkZXBlbmRlbmN5IGVkZ2UKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBFZGdlIHNob3dpbmcgdGhlIGNvbnRyb2wgZGVwZW5kZW5jeSBiZXR3ZWVuIG9wZXJhdGlvbnMuCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJpY29uIiBoZWlnaHQ9IjE1cHgiIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxNSAxNSI+CiAgICAgICAgICAgICAgICAgIDxkZWZzPgogICAgICAgICAgICAgICAgICAgIDxtYXJrZXIgaWQ9InJlZmVyZW5jZS1hcnJvd2hlYWQtbGVnZW5kIiBmaWxsPSIjRkZCNzREIiBtYXJrZXJ3aWR0aD0iMTAiIG1hcmtlcmhlaWdodD0iMTAiIHJlZng9IjkiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIgLz4KICAgICAgICAgICAgICAgICAgICA8L21hcmtlcj4KICAgICAgICAgICAgICAgICAgPC9kZWZzPgogICAgICAgICAgICAgICAgICA8cGF0aCBtYXJrZXItZW5kPSJ1cmwoI3JlZmVyZW5jZS1hcnJvd2hlYWQtbGVnZW5kKSIgc3Ryb2tlPSIjRkZCNzREIiBkPSJNMiA5IGwgMjkgMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBSZWZlcmVuY2UgZWRnZQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIEVkZ2Ugc2hvd2luZyB0aGF0IHRoZSBvdXRnb2luZyBvcGVyYXRpb24gbm9kZSBjYW4gbXV0YXRlIHRoZQogICAgICAgICAgICAgICAgICAgIGluY29taW5nIHRlbnNvci4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWRpYWxvZyBpZD0iZXJyb3ItZGlhbG9nIiB3aXRoLWJhY2tkcm9wPjwvcGFwZXItZGlhbG9nPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhc2V0c1N0YXRlKF9kYXRhc2V0c0ZldGNoZWQsIF9kYXRhc2V0cywgJ0VNUFRZJyldXSI+CiAgICAgIDxkaXYgc3R5bGU9Im1heC13aWR0aDogNTQwcHg7IG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsiPgogICAgICAgIDxoMz5ObyBncmFwaCBkZWZpbml0aW9uIGZpbGVzIHdlcmUgZm91bmQuPC9oMz4KICAgICAgICA8cD4KICAgICAgICAgIFRvIHN0b3JlIGEgZ3JhcGgsIGNyZWF0ZSBhCiAgICAgICAgICA8Y29kZT50Zi5zdW1tYXJ5LkZpbGVXcml0ZXI8L2NvZGU+CiAgICAgICAgICBhbmQgcGFzcyB0aGUgZ3JhcGggZWl0aGVyIHZpYSB0aGUgY29uc3RydWN0b3IsIG9yIGJ5IGNhbGxpbmcgaXRzCiAgICAgICAgICA8Y29kZT5hZGRfZ3JhcGgoKTwvY29kZT4gbWV0aG9kLiBZb3UgbWF5IHdhbnQgdG8gY2hlY2sgb3V0IHRoZQogICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvZ3JhcGhfdml6Ij5ncmFwaCB2aXN1YWxpemVyIHR1dG9yaWFsPC9hPi4KICAgICAgICAKCiAgICAgICAgPHA+CiAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0byBhZGQKICAgICAgICAgIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgIAoKICAgICAgICA8cD4KICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgCiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFzZXRzU3RhdGUoZGF0YXNldHNGZXRjaGVkLCBfZGF0YXNldHMsICdQUkVTRU5UJyldXSI+CiAgICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICAgIDx0Zi1ncmFwaC1jb250cm9scyBpZD0iY29udHJvbHMiIGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIiBkZXZpY2VzLWZvci1zdGF0cz0ie3tfZGV2aWNlc0ZvclN0YXRzfX0iIGNvbG9yLWJ5LXBhcmFtcz0iW1tfY29sb3JCeVBhcmFtc11dIiBzdGF0cz0iW1tfc3RhdHNdXSIgY29sb3ItYnk9Int7X2NvbG9yQnl9fSIgZGF0YXNldHM9IltbX2RhdGFzZXRzXV0iIHJlbmRlci1oaWVyYXJjaHk9IltbX3JlbmRlckhpZXJhcmNoeV1dIiBzZWxlY3Rpb249Int7X3NlbGVjdGlvbn19IiBzZWxlY3RlZC1maWxlPSJ7e19zZWxlY3RlZEZpbGV9fSIgc2VsZWN0ZWQtbm9kZT0ie3tfc2VsZWN0ZWROb2RlfX0iIGhlYWx0aC1waWxscy1mZWF0dXJlLWVuYWJsZWQ9IltbX2RlYnVnZ2VyRGF0YUVuYWJsZWRdXSIgaGVhbHRoLXBpbGxzLXRvZ2dsZWQtb249Int7aGVhbHRoUGlsbHNUb2dnbGVkT259fSIgb24tZml0LXRhcD0iX2ZpdCIgdHJhY2UtaW5wdXRzPSJ7e190cmFjZUlucHV0c319Ij48L3RmLWdyYXBoLWNvbnRyb2xzPgogICAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICAgIDx0Zi1ncmFwaC1kYXNoYm9hcmQtbG9hZGVyIGlkPSJsb2FkZXIiIGRhdGFzZXRzPSJbW19kYXRhc2V0c11dIiBzZWxlY3Rpb249IltbX3NlbGVjdGlvbl1dIiBzZWxlY3RlZC1maWxlPSJbW19zZWxlY3RlZEZpbGVdXSIgb3V0LWdyYXBoLWhpZXJhcmNoeT0ie3tfZ3JhcGhIaWVyYXJjaHl9fSIgb3V0LWdyYXBoPSJ7e19ncmFwaH19IiBvdXQtc3RhdHM9Int7X3N0YXRzfX0iIHByb2dyZXNzPSJ7e19wcm9ncmVzc319IiBoaWVyYXJjaHktcGFyYW1zPSJbW19oaWVyYXJjaHlQYXJhbXNdXSIgY29tcGF0aWJpbGl0eS1wcm92aWRlcj0iW1tfY29tcGF0aWJpbGl0eVByb3ZpZGVyXV0iPjwvdGYtZ3JhcGgtZGFzaGJvYXJkLWxvYWRlcj4KICAgICAgICAgIDx0Zi1ncmFwaC1ib2FyZCBpZD0iZ3JhcGhib2FyZCIgZGV2aWNlcy1mb3Itc3RhdHM9IltbX2RldmljZXNGb3JTdGF0c11dIiBjb2xvci1ieT0iW1tfY29sb3JCeV1dIiBjb2xvci1ieS1wYXJhbXM9Int7X2NvbG9yQnlQYXJhbXN9fSIgZ3JhcGgtaGllcmFyY2h5PSJbW19ncmFwaEhpZXJhcmNoeV1dIiBncmFwaD0iW1tfZ3JhcGhdXSIgaGllcmFyY2h5LXBhcmFtcz0iW1tfaGllcmFyY2h5UGFyYW1zXV0iIHByb2dyZXNzPSJbW19wcm9ncmVzc11dIiBkZWJ1Z2dlci1kYXRhLWVuYWJsZWQ9IltbX2RlYnVnZ2VyRGF0YUVuYWJsZWRdXSIgYXJlLWhlYWx0aC1waWxscy1sb2FkaW5nPSJbW19hcmVIZWFsdGhQaWxsc0xvYWRpbmddXSIgZGVidWdnZXItbnVtZXJpYy1hbGVydHM9IltbX2RlYnVnZ2VyTnVtZXJpY0FsZXJ0c11dIiBub2RlLW5hbWVzLXRvLWhlYWx0aC1waWxscz0iW1tfbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIiBhbGwtc3RlcHMtbW9kZS1lbmFibGVkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSIgc3BlY2lmaWMtaGVhbHRoLXBpbGwtc3RlcD0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9IltbX2hlYWx0aFBpbGxTdGVwSW5kZXhdXSIgcmVuZGVyLWhpZXJhcmNoeT0ie3tfcmVuZGVySGllcmFyY2h5fX0iIHNlbGVjdGVkLW5vZGU9Int7X3NlbGVjdGVkTm9kZX19IiBzdGF0cz0iW1tfc3RhdHNdXSIgdHJhY2UtaW5wdXRzPSJbW190cmFjZUlucHV0c11dIj48L3RmLWdyYXBoLWJvYXJkPgogICAgICAgIDwvZGl2PgogICAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCAvZGVlcC8gewogICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvJywgc2Fucy1zZXJpZjsKICAgICAgfQoKICAgICAgLnNpZGViYXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAuY2VudGVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICBwYXBlci1kaWFsb2cgewogICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idnotZGlzdHJpYnV0aW9uLWNoYXJ0Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGxvdHRhYmxlLXN0eWxlIj48L3N0eWxlPgogICAgPGRpdiBpZD0iY2hhcnRkaXYiPjwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgICNjaGFydGRpdiB7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1kaXN0cmlidXRpb24tbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgcnVuPSJbW3J1bl1dIiBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSIgY29sb3I9IltbX3J1bkNvbG9yXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgCiAgICA8dnotZGlzdHJpYnV0aW9uLWNoYXJ0IGlkPSJjaGFydCIgeC10eXBlPSJbW3hUeXBlXV0iIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlXV0iPjwvdnotZGlzdHJpYnV0aW9uLWNoYXJ0PgogICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IHJvdzsiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHdpZHRoOiAzMzBweDsKICAgICAgICBoZWlnaHQ6IDIzNXB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDcwMHB4OwogICAgICAgIGhlaWdodDogNTAwcHg7CiAgICAgIH0KCiAgICAgIHZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIHsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICB0Zi1jYXJkLWhlYWRpbmcgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ4VHlwZVNlbGVjdG9yIiBuYW1lPSJIb3Jpem9udGFsIGF4aXMiIHNlbGVjdGVkLWlkPSJ7e194VHlwZX19Ij4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBkaXN0cmlidXRpb24gZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgWW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBoaXN0b2dyYW0gZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLgogICAgICAgICAgICAgICAgKEhpc3RvZ3JhbXMgYW5kIGRpc3RyaWJ1dGlvbnMgYm90aCB1c2UgdGhlIGhpc3RvZ3JhbSBzdW1tYXJ5CiAgICAgICAgICAgICAgICBvcGVyYXRpb24uKQogICAgICAgICAgICAgIDwvbGk+CgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICAKICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIiBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLWRpc3RyaWJ1dGlvbi1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiBydW49IltbaXRlbS5ydW5dXSIgdGFnPSJbW2l0ZW0udGFnXV0iIHRhZy1tZXRhZGF0YT0iW1tfdGFnTWV0YWRhdGEoX3J1blRvVGFnSW5mbywgaXRlbS5ydW4sIGl0ZW0udGFnKV1dIiB4LXR5cGU9IltbX3hUeXBlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSI+PC90Zi1kaXN0cmlidXRpb24tbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idnotaGlzdG9ncmFtLXRpbWVzZXJpZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9InRvb2x0aXAiPjxzcGFuPjwvc3Bhbj48L2Rpdj4KICAgIDxzdmcgaWQ9InN2ZyI+CiAgICAgIDxnPgogICAgICAgIDxnIGNsYXNzPSJheGlzIHgiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0iYXhpcyB5Ij48L2c+CiAgICAgICAgPGcgY2xhc3M9ImF4aXMgeSBzbGljZSI+PC9nPgogICAgICAgIDxnIGNsYXNzPSJzdGFnZSI+CiAgICAgICAgICA8cmVjdCBjbGFzcz0iYmFja2dyb3VuZCI+PC9yZWN0PgogICAgICAgIDwvZz4KICAgICAgICA8ZyBjbGFzcz0ieC1heGlzLWhvdmVyIj48L2c+CiAgICAgICAgPGcgY2xhc3M9InktYXhpcy1ob3ZlciI+PC9nPgogICAgICAgIDxnIGNsYXNzPSJ5LXNsaWNlLWF4aXMtaG92ZXIiPjwvZz4KICAgICAgPC9nPgogICAgPC9zdmc+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIHN2ZyB7CiAgICAgICAgZm9udC1mYW1pbHk6IHJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgIH0KCiAgICAgICN0b29sdGlwIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgIH0KCiAgICAgIC5iYWNrZ3JvdW5kIHsKICAgICAgICBmaWxsLW9wYWNpdHk6IDA7CiAgICAgICAgZmlsbDogcmVkOwogICAgICB9CgogICAgICAuaGlzdG9ncmFtIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLmhvdmVyIHsKICAgICAgICBmb250LXNpemU6IDlweDsKICAgICAgICBkb21pbmFudC1iYXNlbGluZTogbWlkZGxlOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC5ob3ZlciBjaXJjbGUgewogICAgICAgIHN0cm9rZTogd2hpdGU7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuNTsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQoKICAgICAgLmhvdmVyIHRleHQgewogICAgICAgIGZpbGw6IGJsYWNrOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC5ob3Zlci5ob3Zlci1jbG9zZXN0IGNpcmNsZSB7CiAgICAgICAgZmlsbDogYmxhY2sgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLmhvdmVyLmhvdmVyLWNsb3Nlc3QgdGV4dCB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmJhc2VsaW5lIHsKICAgICAgICBzdHJva2U6IGJsYWNrOwogICAgICAgIHN0cm9rZS1vcGFjaXR5OiAwLjE7CiAgICAgIH0KCiAgICAgIC5vdXRsaW5lIHsKICAgICAgICBmaWxsOiBub25lOwogICAgICAgIHN0cm9rZTogd2hpdGU7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuNTsKICAgICAgfQoKICAgICAgLm91dGxpbmUub3V0bGluZS1ob3ZlciB7CiAgICAgICAgc3Ryb2tlOiBibGFjayAhaW1wb3J0YW50OwogICAgICAgIHN0cm9rZS1vcGFjaXR5OiAxOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyLAogICAgICAueS1heGlzLWhvdmVyLAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLngtYXhpcy1ob3ZlciAubGFiZWwsCiAgICAgIC55LWF4aXMtaG92ZXIgLmxhYmVsLAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIC5sYWJlbCB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgdGV4dC1hbmNob3I6IGVuZDsKICAgICAgfQoKICAgICAgLngtYXhpcy1ob3ZlciB0ZXh0IHsKICAgICAgICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogICAgICB9CgogICAgICAueS1heGlzLWhvdmVyIHRleHQsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgdGV4dCB7CiAgICAgICAgdGV4dC1hbmNob3I6IHN0YXJ0OwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIGxpbmUsCiAgICAgIC55LWF4aXMtaG92ZXIgbGluZSwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciBsaW5lIHsKICAgICAgICBzdHJva2U6IGJsYWNrOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIHJlY3QsCiAgICAgIC55LWF4aXMtaG92ZXIgcmVjdCwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciByZWN0IHsKICAgICAgICBmaWxsOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLmF4aXMgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgfQoKICAgICAgLmF4aXMgcGF0aC5kb21haW4gewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5heGlzIC50aWNrIGxpbmUgewogICAgICAgIHN0cm9rZTogI2RkZDsKICAgICAgfQoKICAgICAgLmF4aXMuc2xpY2UgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC5heGlzLnNsaWNlIC50aWNrIGxpbmUgewogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDI7CiAgICAgIH0KCiAgICAgIC5zbWFsbCAuYXhpcyB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIC5zbWFsbCAuYXhpcyAudGljazpmaXJzdC1vZi10eXBlIHRleHQgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5zbWFsbCAuYXhpcyAudGljazpsYXN0LW9mLXR5cGUgdGV4dCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLm1lZGl1bSAuYXhpcyB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIC5tZWRpdW0gLmF4aXMgLnRpY2s6bnRoLWNoaWxkKDJuICsgMSkgdGV4dCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLmxhcmdlIC5heGlzIHRleHQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLmxhcmdlIC5heGlzIC50aWNrOm50aC1jaGlsZCgybiArIDEpIHRleHQgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaGlzdG9ncmFtLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyB0YWc9IltbdGFnXV0iIHJ1bj0iW1tydW5dXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iIGNvbG9yPSJbW19ydW5Db2xvcl1dIj48L3RmLWNhcmQtaGVhZGluZz4KICAgIAogICAgPHZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIGlkPSJjaGFydCIgdGltZS1wcm9wZXJ0eT0iW1t0aW1lUHJvcGVydHldXSIgbW9kZT0iW1toaXN0b2dyYW1Nb2RlXV0iIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlRnVuY3Rpb25dXSI+PC92ei1oaXN0b2dyYW0tdGltZXNlcmllcz4KICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiByb3c7Ij4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIgaWNvbj0iZnVsbHNjcmVlbiIgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB3aWR0aDogMzMwcHg7CiAgICAgICAgaGVpZ2h0OiAyMzVweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDsKICAgICAgfQogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgewogICAgICAgIHdpZHRoOiA3MDBweDsKICAgICAgICBoZWlnaHQ6IDUwMHB4OwogICAgICB9CgogICAgICB2ei1oaXN0b2dyYW0tdGltZXNlcmllcyB7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uW3NlbGVjdGVkXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgfQoKICAgICAgdGYtY2FyZC1oZWFkaW5nIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICAgIHdpZHRoOiA5MCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaGlzdG9ncmFtLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9Imhpc3RvZ3JhbU1vZGVTZWxlY3RvciIgbmFtZT0iSGlzdG9ncmFtIG1vZGUiIHNlbGVjdGVkLWlkPSJ7e19oaXN0b2dyYW1Nb2RlfX0iPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJvdmVybGF5Ij5vdmVybGF5PC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9Im9mZnNldCI+b2Zmc2V0PC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLW9wdGlvbi1zZWxlY3RvciBpZD0idGltZVByb3BlcnR5U2VsZWN0b3IiIG5hbWU9Ik9mZnNldCB0aW1lIGF4aXMiIHNlbGVjdGVkLWlkPSJ7e190aW1lUHJvcGVydHl9fSI+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InN0ZXAiPnN0ZXA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0icmVsYXRpdmUiPnJlbGF0aXZlPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9IndhbGxfdGltZSI+d2FsbDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPC90Zi1vcHRpb24tc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBoaXN0b2dyYW0gZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgWW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBoaXN0b2dyYW0gZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLgogICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtaGlzdG9ncmFtLWxvYWRlciBydW49IltbaXRlbS5ydW5dXSIgdGFnPSJbW2l0ZW0udGFnXV0iIGFjdGl2ZT0iW1thY3RpdmVdXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iIHRpbWUtcHJvcGVydHk9IltbX3RpbWVQcm9wZXJ0eV1dIiBoaXN0b2dyYW0tbW9kZT0iW1tfaGlzdG9ncmFtTW9kZV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iPjwvdGYtaGlzdG9ncmFtLWxvYWRlcj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi10ZXh0LWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyBydW49IltbcnVuXV0iIHRhZz0iW1t0YWddXSIgY29sb3I9IltbX3J1bkNvbG9yXV0iPgogICAgPC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8cGFwZXItbWF0ZXJpYWwgZWxldmF0aW9uPSIxIiBpZD0ic3RlcHMtY29udGFpbmVyIiBjbGFzcz0iY29udGFpbmVyIHNjcm9sbGJhciIgc3R5bGU9ImJvcmRlci1jb2xvcjogW1tfcnVuQ29sb3JdXSI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3RleHRzXV0iPgogICAgICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGNsYXNzPSJzdGVwLWNvbnRhaW5lciI+CiAgICAgICAgICBzdGVwIDxzcGFuIGNsYXNzPSJzdGVwLXZhbHVlIj5bW19mb3JtYXRTdGVwKGl0ZW0uc3RlcCldXTwvc3Bhbj4KICAgICAgICA8L3BhcGVyLW1hdGVyaWFsPgogICAgICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGNsYXNzPSJ0ZXh0Ij4KICAgICAgICAgIDx0Zi1tYXJrZG93bi12aWV3IGh0bWw9IltbaXRlbS50ZXh0XV0iPjwvdGYtbWFya2Rvd24tdmlldz4KICAgICAgICA8L3BhcGVyLW1hdGVyaWFsPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9wYXBlci1tYXRlcmlhbD4KICAgIDxzdHlsZSBpbmNsdWRlPSJzY3JvbGxiYXItc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICAgIC5zY3JvbGxiYXIgewogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KICAgICAgI3N0ZXBzLWNvbnRhaW5lciB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIC8qIGNvbG9yIGNvbXB1dGVkIGFuZCBzZXQgYXMgaW5saW5lIHN0eWxlICovOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1heC1oZWlnaHQ6IDUwMHB4OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IDEwcHg7CiAgICAgIH0KICAgICAgLnRleHQgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDAgM3B4IDNweCAzcHg7CiAgICAgICAgcGFkZGluZzogNXB4OwogICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgICAgLnN0ZXAtY29udGFpbmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4IDNweCAwIDA7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgICBtYXJnaW4tbGVmdDogLTFweDsgLyogdG8gY29ycmVjdCBmb3IgYm9yZGVyICovCiAgICAgICAgcGFkZGluZzogM3B4OwogICAgICB9CiAgICAgIC5zdGVwLWNvbnRhaW5lcjpub3QoOmZpcnN0LWNoaWxkKSB7CiAgICAgICAgbWFyZ2luLXRvcDogMTVweDsKICAgICAgfQoKICAgICAgdGYtY2FyZC1oZWFkaW5nIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXRleHQtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyB0ZXh0IGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IHRleHQgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtdGV4dC1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiB0YWc9IltbaXRlbS50YWddXSIgcnVuPSJbW2l0ZW0ucnVuXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSI+PC90Zi10ZXh0LWxvYWRlcj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1wci1jdXJ2ZS1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgoKICAgIDx0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIHgtY29tcG9uZW50cy1jcmVhdGlvbi1tZXRob2Q9IltbX3hDb21wb25lbnRzQ3JlYXRpb25NZXRob2RdXSIgeS12YWx1ZS1hY2Nlc3Nvcj0iW1tfeVZhbHVlQWNjZXNzb3JdXSIgdG9vbHRpcC1jb2x1bW5zPSJbW190b29sdGlwQ29sdW1uc11dIiBjb2xvci1zY2FsZT0iW1tfY29sb3JTY2FsZUZ1bmN0aW9uXV0iIGRlZmF1bHQteC1yYW5nZT0iW1tfZGVmYXVsdFhSYW5nZV1dIiBkZWZhdWx0LXktcmFuZ2U9IltbX2RlZmF1bHRZUmFuZ2VdXSIgc21vb3RoaW5nLWVuYWJsZWQ9IltbX3Ntb290aGluZ0VuYWJsZWRdXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW3JlcXVlc3RNYW5hZ2VyXV0iIGRhdGEtdG8tbG9hZD0iW1tydW5zXV0iIGRhdGEtc2VyaWVzPSJbW3J1bnNdXSIgbG9hZC1rZXk9IltbdGFnXV0iIGdldC1kYXRhLWxvYWQtdXJsPSJbW19kYXRhVXJsXV0iIGxvYWQtZGF0YS1jYWxsYmFjaz0iW1tfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpXV0iIGFjdGl2ZT0iW1thY3RpdmVdXSI+PC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgoKICAgIDxkaXYgaWQ9ImJ1dHRvbnMtcm93Ij4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIgaWNvbj0iZnVsbHNjcmVlbiIgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncy1vdmVyc2NhbiIgb24tdGFwPSJfcmVzZXREb21haW4iIHRpdGxlPSJSZXNldCBheGVzIHRvIFswLCAxXS4iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJzdGVwLWxlZ2VuZCI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3J1bnNXaXRoU3RlcEF2YWlsYWJsZV1dIiBhcz0icnVuIj4KICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWJveCIgc3R5bGU9ImJhY2tncm91bmQ6IFtbX2NvbXB1dGVSdW5Db2xvcihydW4pXV07Ij48L2Rpdj4KICAgICAgICAgIFtbcnVuXV0gaXMgYXQKICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGVwLWxhYmVsLXRleHQiPgogICAgICAgICAgICBzdGVwIFtbX2NvbXB1dGVDdXJyZW50U3RlcEZvclJ1bihfcnVuVG9QckN1cnZlRW50cnksIHJ1bildXSA8L3NwYW4+PGJyPgogICAgICAgICAgPHNwYW4gY2xhc3M9IndhbGwtdGltZS1sYWJlbC10ZXh0Ij4KICAgICAgICAgICAgKFtbX2NvbXB1dGVDdXJyZW50V2FsbFRpbWVGb3JSdW4oX3J1blRvUHJDdXJ2ZUVudHJ5LCBydW4pXV0pCiAgICAgICAgICA8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgd2lkdGg6IDUwMHB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNXB4OwogICAgICB9CiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciB7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIgewogICAgICAgIGhlaWdodDogNjAwcHg7CiAgICAgIH0KICAgICAgI2J1dHRvbnMtcm93IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KICAgICAgI2J1dHRvbnMtcm93IHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KICAgICAgI2J1dHRvbnMtcm93IHBhcGVyLWljb24tYnV0dG9uW3NlbGVjdGVkXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgfQogICAgICAjc3RlcC1sZWdlbmQgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZm9udC1zaXplOiAwLjhlbTsKICAgICAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IDAgMCAwIDEwcHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLmxlZ2VuZC1yb3cgewogICAgICAgIG1hcmdpbjogNXB4IDAgNXB4IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLmNvbG9yLWJveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDFweDsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgICBoZWlnaHQ6IDEwcHg7CiAgICAgIH0KICAgICAgLnN0ZXAtbGFiZWwtdGV4dCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLndhbGwtdGltZS1sYWJlbC10ZXh0IHsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgICBmb250LXNpemU6IDAuOGVtOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3IiPgogIDx0ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3J1bnNXaXRoU2xpZGVyc11dIiBhcz0icnVuIj4KICAgICAgPGRpdiBjbGFzcz0icnVuLXdpZGdldCI+CiAgICAgICAgPGRpdiBjbGFzcz0icnVuLWRpc3BsYXktY29udGFpbmVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InJ1bi1jb2xvci1ib3giIHN0eWxlPSJiYWNrZ3JvdW5kOltbX2NvbXB1dGVDb2xvckZvclJ1bihydW4pXV07Ij48L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InJ1bi10ZXh0Ij4KICAgICAgICAgICAgW1tydW5dXQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic3RlcC1kaXNwbGF5LWNvbnRhaW5lciI+CiAgICAgICAgICBbW19jb21wdXRlVGltZVRleHRGb3JSdW4ocnVuVG9BdmFpbGFibGVUaW1lRW50cmllcywgX3J1blRvU3RlcEluZGV4LAogICAgICAgICAgcnVuLCB0aW1lRGlzcGxheVR5cGUpXV0KICAgICAgICA8L2Rpdj4KICAgICAgICA8cGFwZXItc2xpZGVyIGRhdGEtcnVuJD0iW1tydW5dXSIgc3RlcD0iMSIgdHlwZT0ibnVtYmVyIiBtaW49IjAiIG1heD0iW1tfY29tcHV0ZU1heFN0ZXBJbmRleEZvclJ1bihydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzLCBydW4pXV0iIHZhbHVlPSJbW19nZXRTdGVwKF9ydW5Ub1N0ZXBJbmRleCwgcnVuKV1dIiBvbi1pbW1lZGlhdGUtdmFsdWUtY2hhbmdlZD0iX3NsaWRlclZhbHVlQ2hhbmdlZCI+PC9wYXBlci1zbGlkZXI+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLnJ1bi13aWRnZXQgewogICAgICAgIG1hcmdpbjogMTBweCAwIDAgMDsKICAgICAgfQogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIG1hcmdpbjogLThweCAwIDAgLTE1cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLnN0ZXAtZGlzcGxheS1jb250YWluZXIgewogICAgICAgIGZvbnQtc2l6ZTogMC45ZW07CiAgICAgICAgbWFyZ2luOiAwIDE1cHggMCAwOwogICAgICB9CiAgICAgIC5ydW4tdGV4dCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIC5ydW4tY29sb3ItYm94IHsKICAgICAgICB3aWR0aDogMTJweDsKICAgICAgICBoZWlnaHQ6IDEycHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1wci1jdXJ2ZS1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLW9wdGlvbi1zZWxlY3RvciBpZD0idGltZS10eXBlLXNlbGVjdG9yIiBuYW1lPSJUaW1lIERpc3BsYXkgVHlwZSIgc2VsZWN0ZWQtaWQ9Int7X3RpbWVEaXNwbGF5VHlwZX19Ij4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPjxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPjxwYXBlci1idXR0b24gaWQ9IndhbGxfdGltZSI+d2FsbDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPC90Zi1vcHRpb24tc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19ydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIiBpZD0ic3RlcHMtc2VsZWN0b3ItY29udGFpbmVyIj4KICAgICAgICAgICAgPHRmLXByLWN1cnZlLXN0ZXBzLXNlbGVjdG9yIHJ1bnM9IltbX3JlbGV2YW50U2VsZWN0ZWRSdW5zXV0iIHJ1bi10by1zdGVwPSJ7e19ydW5Ub1N0ZXB9fSIgcnVuLXRvLWF2YWlsYWJsZS10aW1lLWVudHJpZXM9IltbX3J1blRvQXZhaWxhYmxlVGltZUVudHJpZXNdXSIgdGltZS1kaXNwbGF5LXR5cGU9IltbX3RpbWVEaXNwbGF5VHlwZV1dIj48L3RmLXByLWN1cnZlLXN0ZXBzLXNlbGVjdG9yPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHByZWNpc2lvbuKAk3JlY2FsbCBjdXJ2ZSBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IHByZWNpc2lvbuKAk3JlY2FsbCBkYXRhIHRvIHlvdXIgZXZlbnQKICAgICAgICAgICAgICAgIGZpbGVzLgogICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgVGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICAKICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIiBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSIgZ2V0LWNhdGVnb3J5LWl0ZW0ta2V5PSJbW19nZXRDYXRlZ29yeUl0ZW1LZXldXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLXByLWN1cnZlLWNhcmQgYWN0aXZlPSJbW2FjdGl2ZV1dIiBydW5zPSJbW2l0ZW0ucnVuc11dIiB0YWc9IltbaXRlbS50YWddXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1bnMsIGl0ZW0udGFnKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIHJ1bi10by1zdGVwLWNhcD0iW1tfcnVuVG9TdGVwXV0iPjwvdGYtcHItY3VydmUtY2FyZD4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICAvKiogRG8gbm90IGxldCB0aGUgc3RlcHMgc2VsZWN0b3Igb2NjbHVkZSB0aGUgcnVuIHNlbGVjdG9yLiAqLwogICAgICAjc3RlcHMtc2VsZWN0b3ItY29udGFpbmVyIHsKICAgICAgICBtYXgtaGVpZ2h0OiA0MCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItc3Bpbm5lciI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItc3Bpbm5lci1zdHlsZXMiPjwvc3R5bGU+CgogICAgPGRpdiBpZD0ic3Bpbm5lckNvbnRhaW5lciIgY2xhc3MtbmFtZT0iW1tfX2NvbXB1dGVDb250YWluZXJDbGFzc2VzKGFjdGl2ZSwgX19jb29saW5nRG93bildXSIgb24tYW5pbWF0aW9uZW5kPSJfX3Jlc2V0IiBvbi13ZWJraXQtYW5pbWF0aW9uLWVuZD0iX19yZXNldCI+CiAgICAgIDxkaXYgY2xhc3M9InNwaW5uZXItbGF5ZXIgbGF5ZXItMSI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgbGVmdCI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgcmlnaHQiPjwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9InNwaW5uZXItbGF5ZXIgbGF5ZXItMiI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgbGVmdCI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgcmlnaHQiPjwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9InNwaW5uZXItbGF5ZXIgbGF5ZXItMyI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgbGVmdCI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgcmlnaHQiPjwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9InNwaW5uZXItbGF5ZXIgbGF5ZXItNCI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgbGVmdCI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgcmlnaHQiPjwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9ImlucHV0LXBpcGVsaW5lLWFuYWx5emVyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGxvdHRhYmxlLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAuc2VjdGlvbi1oZWFkZXIgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMjAwJTsKICAgICAgfQogICAgICAuc3ViLXNlY3Rpb24taGVhZGVyIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBmb250LXNpemU6IDE1MCU7CiAgICAgIH0KICAgICAgI3N1bW1hcnktaG9zdCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLmhpZ2hsaWdodGVkLXRleHQgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMTIwJTsKICAgICAgfQogICAgICAuc3RkZGV2LXRleHQgewogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgICBvcGFjaXR5OiAwLjc7CiAgICAgIH0KICAgICAgLmxlZnQtcGFuZSB7CiAgICAgICAgd2lkdGg6IDMwJTsKICAgICAgfQogICAgICAucmlnaHQtcGFuZSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgfQogICAgICAudGFibGUtc3R5bGUgewogICAgICAgIHRhYmxlLWxheW91dDogZml4ZWQ7CiAgICAgICAgd2lkdGg6IDk1JTsKICAgICAgfQogICAgICAucGVyZm9ybWFuY2UtdGFibGUgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICAgIC54LWF4aXMtdGl0bGUgewogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTsKICAgICAgfQogICAgICAueS1heGlzLXRpdGxlIHsKICAgICAgICB3cml0aW5nLW1vZGU6IGJ0LXJsOwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7CiAgICAgIH0KICAgICAgI3JlY29tbWVuZGF0aW9uX2RldGFpbHMgewogICAgICAgIGNvbG9yOiBncmVlbjsKICAgICAgfQogICAgICAjcmVjb21tZW5kYXRpb25fZGV0YWlscyBhIHsKICAgICAgICBjb2xvcjogI2ZmMzNjYzsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQogICAgICAjc3VtbWFyeV9jb25jbHVzaW9uIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZGVyOwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgICBjb2xvcjogdmFyKC0tc3VtbWFyeS1jb2xvciwgZ3JlZW4pOwogICAgICB9CiAgICAgICNzdW1tYXJ5X25leHRzdGVwIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZGVyOwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgICBjb2xvcjogZ3JlZW47CiAgICAgIH0KICAgICAgI3JlY29tbWVuZGF0aW9uX3RpdGxlIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZGVyOwogICAgICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKICAgICAgICBjb2xvcjogYmxhY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2PgogICAgICA8ZGl2IGlkPSJzZWN0aW9uX3N1bW1hcnkiPgogICAgICAgIDxkaXYgaWQ9InRpdGxlX3N1bW1hcnkiPgogICAgICAgICAgPHAgY2xhc3M9InNlY3Rpb24taGVhZGVyIj4KICAgICAgICAgICAgU2VjdGlvbiAxOiBTdW1tYXJ5IG9mIGlucHV0LXBpcGVsaW5lIGFuYWx5c2lzCiAgICAgICAgICAKICAgICAgICA8L2Rpdj4KICAgICAgICA8cD48c3BhbiBpZD0ic3VtbWFyeV9jb25jbHVzaW9uIj5bW19zdW1tYXJ5X2NvbmNsdXNpb25dXTwvc3Bhbj4KICAgICAgICA8cD4KICAgICAgICAgIDxzcGFuIGlkPSJyZWNvbW1lbmRhdGlvbl90aXRsZSI+UmVjb21tZW5kYXRpb24gZm9yIG5leHQgc3RlcDogPC9zcGFuPjxzcGFuIGlkPSJzdW1tYXJ5X25leHRzdGVwIj5bW19zdW1tYXJ5X25leHRzdGVwXV08L3NwYW4+CiAgICAgICAgCiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGlkPSJzZWN0aW9uX2RldmljZV9zaWRlX2FuYWx5c2lzIiBoaWRkZW49IltbIV9zaG93X2RldmljZV9zaWRlX2FuYWx5c2lzXV0iPgogICAgICAgIDxkaXYgaWQ9InRpdGxlX2RldmljZV9zaWRlX2FuYWx5c2lzIj4KICAgICAgICAgIDxwIGNsYXNzPSJzZWN0aW9uLWhlYWRlciI+U2VjdGlvbiAyOiBEZXZpY2Utc2lkZSBhbmFseXNpcyBkZXRhaWxzCiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0ic2VjdGlvbl9kZXZpY2Vfc3RlcF90aW1lIj4KICAgICAgICAgIDxkaXYgaWQ9InRpdGxlX2RldmljZV9zdGVwX3RpbWUiPgogICAgICAgICAgICA8cCBjbGFzcz0ic3ViLXNlY3Rpb24taGVhZGVyIj5TZWN0aW9uIDIuMTogRGV2aWNlIHN0ZXAgdGltZQogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8dGFibGUgY2xhc3M9InRhYmxlLXN0eWxlIj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVmdC1wYW5lIj4KICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJoaWdobGlnaHRlZC10ZXh0Ij4KICAgICAgICAgICAgICAgICAgICBEZXZpY2Ugc3RlcC10aW1lIHN0YXRpc3RpY3MgKGluIG1zKQogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgIDxzcGFuPjxiPkF2ZXJhZ2U6PC9iPiA8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxzcGFuPltbX3N0ZXB0aW1lX21zX2F2ZXJhZ2VdXSBtcyA8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGRkZXYtdGV4dCI+KM+DID0gW1tfc3RlcHRpbWVfbXNfc3RkZGV2XV0gbXMpPC9zcGFuPgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgPHNwYW4+PGI+UmFuZ2U6PC9iPiA8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxzcGFuPltbX3N0ZXB0aW1lX21zX21pbmltdW1dXSAtIFtbX3N0ZXB0aW1lX21zX21heGltdW1dXQogICAgICAgICAgICAgICAgICAgIG1zPC9zcGFuPgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz0ieS1heGlzLXRpdGxlIj5taWxsaXNlY29uZHM8L2Rpdj48L3RkPgogICAgICAgICAgICAgIDx0ZCBjbGFzcz0icmlnaHQtcGFuZSI+CiAgICAgICAgICAgICAgICA8dnotbGluZS1jaGFydDIgaWQ9ImRldmljZV9zdGVwX2NoYXJ0IiBzdHlsZT0iaGVpZ2h0OjMwMHB4OyI+PC92ei1saW5lLWNoYXJ0Mj4KICAgICAgICAgICAgICAgIDxkaXY+PHAgY2xhc3M9IngtYXhpcy10aXRsZSI+dHJhaW5pbmcgc3RlcCBudW1iZXI8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJzZWN0aW9uX2RldmljZV9pbmZlZWRkZXFfdGltZSI+CiAgICAgICAgICA8ZGl2IGlkPSJ0aXRsZV9kZXZpY2VfaW5mZWVkZGVxX3RpbWUiPgogICAgICAgICAgICA8cCBjbGFzcz0ic3ViLXNlY3Rpb24taGVhZGVyIj4KICAgICAgICAgICAgICA8c3Bhbj5TZWN0aW9uIDIuMjogUmFuZ2Ugb2YgZGV2aWNlIHRpbWUgd2FpdGluZyBmb3IgaW5wdXQgZGF0YQogICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICA8c3Bhbj48aSBzdHlsZT0ib3BhY2l0eTowLjUiPmFjcm9zcyBjb3JlczwvaT4gYXQgZWFjaCBzdGVwIDwvc3Bhbj4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0YWJsZSBjbGFzcz0idGFibGUtc3R5bGUiPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZWZ0LXBhbmUiPgogICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJoaWdobGlnaHRlZC10ZXh0Ij4lIG9mIGRldmljZSBzdGVwIHRpbWUgd2FpdGluZyBmb3IgaW5wdXQgZGF0YTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHNwYW4+CiAgICAgICAgICAgICAgICAgICAgKGF2ZXJhZ2Ugb3ZlciB0aGUgbWF4aW11bSB3YWl0aW5nIHRpbWUgYWNyb3NzIGNvcmVzIGF0IGVhY2gKICAgICAgICAgICAgICAgICAgICBzdGVwKTwvc3Bhbj4KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgIDxzcGFuPjxiPkF2ZXJhZ2U6PC9iPiA8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxzcGFuPltbX2luZmVlZF9wZXJjZW50X2F2ZXJhZ2VdXSAlIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0ZGRldi10ZXh0Ij4oz4MgPSBbW19pbmZlZWRfcGVyY2VudF9zdGRkZXZdXSAlKTwvc3Bhbj4KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgIDxzcGFuPjxiPlJhbmdlOjwvYj4gPC9zcGFuPgogICAgICAgICAgICAgICAgICA8c3Bhbj5bW19pbmZlZWRfcGVyY2VudF9taW5pbXVtXV0gLSBbW19pbmZlZWRfcGVyY2VudF9tYXhpbXVtXV0KICAgICAgICAgICAgICAgICAgICAlPC9zcGFuPgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ5LWF4aXMtdGl0bGUiPjxwPiUgb2YgZGV2aWNlIHN0ZXAgdGltZTwvZGl2PgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJyaWdodC1wYW5lIj4KICAgICAgICAgICAgICAgIDx2ei1saW5lLWNoYXJ0MiBpZD0iZGV2aWNlX2luZmVlZF9jaGFydCIgc3R5bGU9ImhlaWdodDozMDBweDsiPjwvdnotbGluZS1jaGFydDI+CiAgICAgICAgICAgICAgICA8ZGl2PjxwIGNsYXNzPSJ4LWF4aXMtdGl0bGUiPnRyYWluaW5nIHN0ZXAgbnVtYmVyPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGlkPSJzZWN0aW9uX2hvc3Rfc2lkZV9hbmFseXNpcyI+CiAgICAgICAgPGRpdiBpZD0idGl0bGVfaG9zdF9zaWRlX2FuYWx5c2lzIj4KICAgICAgICAgIDxwIGNsYXNzPSJzZWN0aW9uLWhlYWRlciI+U2VjdGlvbiAzOiBIb3N0LXNpZGUgYW5hbHlzaXMgZGV0YWlscwogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaGlkZGVuJD0iW1shX3Nob3dfaG9zdF9zaWRlX2NoYXJ0XV0iPgogICAgICAgICAgPGRpdiBzdHlsZT0iaGVpZ2h0OjMwMHB4OyIgaWQ9Imhvc3Rfc2lkZV9jaGFydCI+PC9kaXY+CiAgICAgICAgICA8cD4KICAgICAgICAgICAgPHNwYW4+PGI+V2hhdCBjYW4gYmUgZG9uZSB0byByZWR1Y2UgYWJvdmUgY29tcG9uZW50cyBvZiB0aGUgaG9zdCBpbnB1dAogICAgICAgICAgICAgICAgdGltZTo8L2I+PC9zcGFuPgogICAgICAgICAgCiAgICAgICAgICA8ZGl2IGlkPSJyZWNvbW1lbmRhdGlvbl9kZXRhaWxzIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGhpZGRlbiQ9IltbX3Nob3dfaG9zdF9zaWRlX2NoYXJ0XV0iPgogICAgICAgICAgSG9zdCBzaWRlIGFuYWx5c2lzIGNhbiBub3QgYmUgZG9uZSB3aXRob3V0IGluc3RydW1lbnRhdGlvbi4KICAgICAgICA8L2Rpdj4KICAgICAgICA8cD4KICAgICAgICAgIENsaWNrIHRoZSAiU2hvdyIgYnV0dG9uIGJlbG93IHRvIHNlZSB0aGUgc291cmNlIGRhdGEgb2YgdGhlIGJyZWFrZG93bi4KICAgICAgICAKICAgICAgICA8YnV0dG9uIG9uLWNsaWNrPSJvbkNsaWNrIj5bW190b2dnbGVfYnV0dG9uX3RleHRdXTwvYnV0dG9uPgogICAgICAgIDx0YWJsZSBjbGFzcz0icGVyZm9ybWFuY2UtdGFibGUiIGhpZGRlbiQ9IltbIV9zaG93X2hvc3Rfc2lkZV90YWJsZV1dIj4KICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgPHRyPjx0aD5JbnB1dCBPcDwvdGg+CiAgICAgICAgICAgIDx0aD5Db3VudDwvdGg+CiAgICAgICAgICAgIDx0aD5Ub3RhbCBUaW1lIChpbiBtcyk8L3RoPgogICAgICAgICAgICA8dGg+VG90YWwgVGltZSAoYXMgJSBvZiB0b3RhbCBpbnB1dC1wcm9jZXNzaW5nIHRpbWUpPC90aD4KICAgICAgICAgICAgPHRoPlRvdGFsIFNlbGYgVGltZSAoaW4gbXMpPC90aD4KICAgICAgICAgICAgPHRoPlRvdGFsIFNlbGYgVGltZSAoYXMgJSBvZiB0b3RhbCBpbnB1dC1wcm9jZXNzaW5nIHRpbWUpPC90aD4KICAgICAgICAgICAgPHRoPkNhdGVnb3J5PC90aD4KICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICA8dGJvZHkgaWQ9Imhvc3Rfc2lkZV90YWJsZV9jb250ZW50Ij48L3Rib2R5PgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1pbWFnZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjYmFzZVVSSUFuY2hvciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgI3NpemVkSW1nRGl2IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwcHg7CiAgICAgICAgcmlnaHQ6IDBweDsKICAgICAgICBib3R0b206IDBweDsKICAgICAgICBsZWZ0OiAwcHg7CgogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgICNpbWcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiB2YXIoLS1pcm9uLWltYWdlLXdpZHRoLCBhdXRvKTsKICAgICAgICBoZWlnaHQ6IHZhcigtLWlyb24taW1hZ2UtaGVpZ2h0LCBhdXRvKTsKICAgICAgfQoKICAgICAgOmhvc3QoW3NpemluZ10pICNzaXplZEltZ0RpdiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtzaXppbmddKSAjaW1nIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAjcGxhY2Vob2xkZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDBweDsKICAgICAgICByaWdodDogMHB4OwogICAgICAgIGJvdHRvbTogMHB4OwogICAgICAgIGxlZnQ6IDBweDsKCiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDsKICAgICAgICBvcGFjaXR5OiAxOwoKICAgICAgICBAYXBwbHkgLS1pcm9uLWltYWdlLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICAjcGxhY2Vob2xkZXIuZmFkZWQtb3V0IHsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuNXMgbGluZWFyOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGEgaWQ9ImJhc2VVUklBbmNob3IiIGhyZWY9IiMiPjwvYT4KICAgIDxkaXYgaWQ9InNpemVkSW1nRGl2IiByb2xlPSJpbWciIGhpZGRlbiQ9IltbX2NvbXB1dGVJbWdEaXZIaWRkZW4oc2l6aW5nKV1dIiBhcmlhLWhpZGRlbiQ9IltbX2NvbXB1dGVJbWdEaXZBUklBSGlkZGVuKGFsdCldXSIgYXJpYS1sYWJlbCQ9IltbX2NvbXB1dGVJbWdEaXZBUklBTGFiZWwoYWx0LCBzcmMpXV0iPjwvZGl2PgogICAgPGltZyBpZD0iaW1nIiBhbHQkPSJbW2FsdF1dIiBoaWRkZW4kPSJbW19jb21wdXRlSW1nSGlkZGVuKHNpemluZyldXSIgY3Jvc3NvcmlnaW4kPSJbW2Nyb3Nzb3JpZ2luXV0iIG9uLWxvYWQ9Il9pbWdPbkxvYWQiIG9uLWVycm9yPSJfaW1nT25FcnJvciI+CiAgICA8ZGl2IGlkPSJwbGFjZWhvbGRlciIgaGlkZGVuJD0iW1tfY29tcHV0ZVBsYWNlaG9sZGVySGlkZGVuKHByZWxvYWQsIGZhZGUsIGxvYWRpbmcsIGxvYWRlZCldXSIgY2xhc3MkPSJbW19jb21wdXRlUGxhY2Vob2xkZXJDbGFzc05hbWUocHJlbG9hZCwgZmFkZSwgbG9hZGluZywgbG9hZGVkKV1dIj48L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItY2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLW1hdGVyaWFsLXN0eWxlcyI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItY2FyZC1iYWNrZ3JvdW5kLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3IpKTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItY2FyZDsKICAgICAgfQoKICAgICAgLyogSUUgMTAgc3VwcG9ydCBmb3IgSFRNTDUgaGlkZGVuIGF0dHIgKi8KICAgICAgOmhvc3QoW2hpZGRlbl0pLCBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaGVhZGVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogaW5oZXJpdDsKICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogaW5oZXJpdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1jYXJkLWhlYWRlcjsKICAgICAgfQoKICAgICAgLmhlYWRlciBpcm9uLWltYWdlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAtLWlyb24taW1hZ2Utd2lkdGg6IDEwMCU7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWNhcmQtaGVhZGVyLWltYWdlOwogICAgICB9CgogICAgICAuaGVhZGVyIC50aXRsZS10ZXh0IHsKICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMjRweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1jYXJkLWhlYWRlci1jb2xvciwgIzAwMCk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWNhcmQtaGVhZGVyLXRleHQ7CiAgICAgIH0KCiAgICAgIC5oZWFkZXIgLnRpdGxlLXRleHQub3Zlci1pbWFnZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMHB4OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1jYXJkLWhlYWRlci1pbWFnZS10ZXh0OwogICAgICB9CgogICAgICA6aG9zdCA6OnNsb3R0ZWQoLmNhcmQtY29udGVudCkgewogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgcG9zaXRpb246cmVsYXRpdmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWNhcmQtY29udGVudDsKICAgICAgfQoKICAgICAgOmhvc3QgOjpzbG90dGVkKC5jYXJkLWFjdGlvbnMpIHsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2U4ZThlODsKICAgICAgICBwYWRkaW5nOiA1cHggMTZweDsKICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItY2FyZC1hY3Rpb25zOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIxIl0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMiJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTI7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjMiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0zOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSI0Il0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iNSJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iaGVhZGVyIj4KICAgICAgPGlyb24taW1hZ2UgaGlkZGVuJD0iW1shaW1hZ2VdXSIgYXJpYS1oaWRkZW4kPSJbW19pc0hpZGRlbihpbWFnZSldXSIgc3JjPSJbW2ltYWdlXV0iIGFsdD0iW1thbHRdXSIgcGxhY2Vob2xkZXI9IltbcGxhY2Vob2xkZXJJbWFnZV1dIiBwcmVsb2FkPSJbW3ByZWxvYWRJbWFnZV1dIiBmYWRlPSJbW2ZhZGVJbWFnZV1dIj48L2lyb24taW1hZ2U+CiAgICAgIDxkaXYgaGlkZGVuJD0iW1shaGVhZGluZ11dIiBjbGFzcyQ9InRpdGxlLXRleHQgW1tfY29tcHV0ZUhlYWRpbmdDbGFzcyhpbWFnZSldXSI+W1toZWFkaW5nXV08L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJvdmVydmlldy1wYWdlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLWNhcmQgewogICAgICAgIG1hcmdpbjogNXB4OwogICAgICAgIC0tcGFwZXItY2FyZC1oZWFkZXItY29sb3I6ICNmNWY1ZjU7CiAgICAgICAgLS1wYXBlci1jYXJkLWhlYWRlcjogewogICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzQyODVmNDsKICAgICAgICB9CiAgICAgIH0KICAgICAgLmZsZXgtaG9yaXpvbnRhbCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgIH0KICAgICAgLnN0ZXB0aW1lLWF2ZXJhZ2UgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgICBjb2xvcjogdmFyKC0tc3VtbWFyeS1jb2xvciwgZ3JlZW4pOwogICAgICB9CiAgICAgIC50YWJsZS1zdHlsZSB7CiAgICAgICAgdGFibGUtbGF5b3V0OiBhdXRvOwogICAgICAgIHdpZHRoOiA5NSU7CiAgICAgIH0KICAgICAgLnRvcC1vcHMtdGFibGUgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICAgIHZ6LWxpbmUtY2hhcnQyLnN0ZXAtZ3JhcGggewogICAgICAgIHdpZHRoOiA4NjBweDsKICAgICAgICBoZWlnaHQ6IDIwMHB4OwogICAgICB9CiAgICAgIC54LWF4aXMtdGl0bGUgewogICAgICAgIHdpZHRoOiA4MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplOwogICAgICB9CiAgICAgIC55LWF4aXMtdGl0bGUgewogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICAgIHdyaXRpbmctbW9kZTogYnQtcmw7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTsKICAgICAgfQogICAgICBkaXYuYm90dGxlbmVjay1zdGF0ZW1lbnQgewogICAgICAgIGNvbG9yOiB2YXIoLS1zdW1tYXJ5LWNvbG9yLCBncmVlbik7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGRlcjsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgIH0KICAgICAgZGl2LmVycm9yTWVzc2FnZSB7CiAgICAgICAgY29sb3I6IHJlZDsKICAgICAgICBmb250LXNpemU6IDAuNWNtOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkZXI7CiAgICAgICAgbWFyZ2luLXRvcDogMC41Y207CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41Y207CiAgICAgIH0KICAgICAgZGl2LmJvdHRsZW5lY2tUaXBzIHsKICAgICAgICBjb2xvcjogIzAwMDAwMDsKICAgICAgfQogICAgICBkaXYuYm90dGxlbmVja1RpcHMgYSB7CiAgICAgICAgY29sb3I6ICNmZjMzY2M7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KICAgICAgZGl2LmRvY3VtZW50YXRpb25UaXBzIHsKICAgICAgICBjb2xvcjogIzY2NjY5OTsKICAgICAgfQogICAgICBkaXYuZG9jdW1lbnRhdGlvblRpcHMgYSB7CiAgICAgICAgY29sb3I6ICMzM2NjMDA7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGNsYXNzPSJlcnJvck1lc3NhZ2UiIGhpZGRlbj0iW1shX2Vycm9yX21lc3NhZ2VdXSI+CiAgICAgIDxzcGFuPltbX2Vycm9yX21lc3NhZ2VdXTwvc3Bhbj4KICAgIDwvZGl2PgogICAgPGRpdiBoaWRkZW49IltbX2Vycm9yX21lc3NhZ2VdXSI+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciBmbGV4LWhvcml6b250YWwiPgogICAgICAgIDxwYXBlci1jYXJkIGhlYWRpbmc9IlBlcmZvcm1hbmNlIFN1bW1hcnkiPgogICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1jb250ZW50Ij4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgPGI+QXZlcmFnZSBzdGVwIHRpbWU8L2I+IChsb3dlciBpcyBiZXR0ZXIpOgogICAgICAgICAgICAgIDxiPjxzcGFuIGNsYXNzPSJzdGVwdGltZS1hdmVyYWdlIj5bW19zdGVwdGltZV9tc19hdmVyYWdlXV0gbXM8L3NwYW4+CiAgICAgICAgICAgICAgPC9iPgogICAgICAgICAgICAgIDxpIHN0eWxlPSJvcGFjaXR5OjAuNyI+KHN0YW5kYXJkIGRldmlhdGlvbiA9CiAgICAgICAgICAgICAgICA8c3Bhbj5bW19zdGVwdGltZV9tc19zdGRkZXZdXTwvc3Bhbj4gbXMpPC9pPgogICAgICAgICAgICAKICAgICAgICAgICAgPHVsIGhpZGRlbiQ9IltbIV9pbmZlZWRfbXNfYXZlcmFnZV1dIj4KICAgICAgICAgICAgICA8bGk+QXZlcmFnZSBpbmZlZWQ6IDxzcGFuPltbX2luZmVlZF9tc19hdmVyYWdlXV08L3NwYW4+IG1zPC9saT4KICAgICAgICAgICAgICA8bGk+QXZlcmFnZSBjb21wdXRlOiA8c3Bhbj5bW19jb21wdXRlX21zX2F2ZXJhZ2VdXTwvc3Bhbj4gbXM8L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICA8Yj5Ib3N0IGlkbGUgdGltZTwvYj4gKGxvd2VyIGlzIGJldHRlcik6CiAgICAgICAgICAgICAgPHNwYW4+W1tfaG9zdF9pZGxlX3RpbWVfcGVyY2VudF1dPC9zcGFuPgogICAgICAgICAgICAKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgPGI+VFBVIGlkbGUgdGltZTwvYj4gKGxvd2VyIGlzIGJldHRlcik6CiAgICAgICAgICAgICAgPHNwYW4+W1tfZGV2aWNlX2lkbGVfdGltZV9wZXJjZW50XV08L3NwYW4+CiAgICAgICAgICAgIAogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICA8Yj5VdGlsaXphdGlvbiBvZiBUUFUgTWF0cml4IFVuaXRzPC9iPiAoaGlnaGVyIGlzIGJldHRlcik6CiAgICAgICAgICAgICAgPHNwYW4+W1tfbXh1X3V0aWxpemF0aW9uX3BlcmNlbnRdXTwvc3Bhbj4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3BhcGVyLWNhcmQ+CiAgICAgICAgPHBhcGVyLWNhcmQgaGVhZGluZz0iU3RlcC10aW1lIEdyYXBoIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtY29udGVudCIgaGlkZGVuPSJbWyFfc2hvd19zdGVwX3RpbWVfZ3JhcGhdXSI+CiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0idGFibGUtc3R5bGUiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPSJ5LWF4aXMtdGl0bGUiPm1pbGxpc2Vjb25kczwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIDx2ei1saW5lLWNoYXJ0MiBjbGFzcz0ic3RlcC1ncmFwaCIgaWQ9ImRldmljZV9zdGVwX2NoYXJ0Ij4KICAgICAgICAgICAgICAgICAgPC92ei1saW5lLWNoYXJ0Mj4KICAgICAgICAgICAgICAgICAgPGRpdj48cCBjbGFzcz0ieC1heGlzLXRpdGxlIj50cmFpbmluZyBzdGVwIG51bWJlcjwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9wYXBlci1jYXJkPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIGZsZXgtaG9yaXpvbnRhbCI+CiAgICAgICAgPHBhcGVyLWNhcmQgaGVhZGluZyQ9IltbX3RvcF9vcHNfaGVhZGluZ11dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtY29udGVudCI+CiAgICAgICAgICAgIDxidXR0b24gb24tY2xpY2s9Im9uQ2xpY2tUb3BPcHMiPltbX3RvcF9vcHNfYnV0dG9uX3RleHRdXTwvYnV0dG9uPgogICAgICAgICAgICA8dGhyZWFkPgogICAgICAgICAgICAgICAgPC90aHJlYWQ+PHRhYmxlIGNsYXNzPSJ0b3Atb3BzLXRhYmxlIiBoaWRkZW4kPSJbWyFfc2hvd190b3Bfb3BzX3RhYmxlXV0iPgogICAgICAgICAgICAgIDx0cj48dGg+VGltZSAoJSk8L3RoPgogICAgICAgICAgICAgICAgPHRoPkN1bXVsYXRpdmUgdGltZSAoJSk8L3RoPgogICAgICAgICAgICAgICAgPHRoPkNhdGVnb3J5PC90aD4KICAgICAgICAgICAgICAgIDx0aD5PcGVyYXRpb248L3RoPgogICAgICAgICAgICAgICAgPHRoPkdGbG9wcy9zZWM8L3RoPgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIDx0Ym9keSBpZD0idG9wX29wc190YWJsZV9jb250ZW50Ij48L3Rib2R5PgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9wYXBlci1jYXJkPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIGZsZXgtaG9yaXpvbnRhbCI+CiAgICAgICAgPHBhcGVyLWNhcmQgaGVhZGluZz0iUnVuIEVudmlyb25tZW50Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtY29udGVudCI+CiAgICAgICAgICAgIDxwPjxiPk51bWJlciBvZiBIb3N0cyB1c2VkPC9iPjogPHNwYW4+W1tfaG9zdF9jb3VudF1dPC9zcGFuPgogICAgICAgICAgICA8cD48Yj5UUFUgdHlwZTwvYj46IENsb3VkIFRQVQogICAgICAgICAgICA8cD48Yj5OdW1iZXIgb2YgVFBVIGNvcmVzPC9iPjogPHNwYW4+IFtbX3RwdV9jb3JlX2NvdW50XV08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3BhcGVyLWNhcmQ+CiAgICAgICAgPHBhcGVyLWNhcmQgaGVhZGluZz0iUmVjb21tZW5kYXRpb24gZm9yIE5leHQgU3RlcHMiPgogICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1jb250ZW50Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iYm90dGxlbmVjay1zdGF0ZW1lbnQiPjxzcGFuPltbX3N0YXRlbWVudF1dPC9zcGFuPjwvZGl2PgogICAgICAgICAgICA8ZGl2IGlkPSJob3N0X3NpZGVfdGlwcyI+PC9kaXY+CiAgICAgICAgICAgIDxkaXYgaWQ9ImRldmljZV9zaWRlX3RpcHMiPjwvZGl2PgogICAgICAgICAgICA8ZGl2IGlkPSJkb2N1bWVudGF0aW9uX3RpcHMiPjwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9wYXBlci1jYXJkPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtb3AtdGFibGUtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgICN0aW1lLAogICAgICAjd2FzdGVkLAogICAgICAjdXRpbGl6YXRpb24gewogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICB9CiAgICAgICNuYW1lIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiA0MCU7CiAgICAgIH0KICAgICAgI3JvdywKICAgICAgI2hlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CiAgICAgICNyb3cgPiAqLAogICAgICAjaGVhZGVyID4gKiB7CiAgICAgICAgcGFkZGluZzogMC41ZW07CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CiAgICAgICNoZWFkZXIgPiAqIHsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMDsKICAgICAgfQogICAgICAjcHJvdmVuYW5jZSB7CiAgICAgICAgZmxleDogMSAxIDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAjdXRpbGl6YXRpb24gewogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtb3AtdGFibGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1vcC10YWJsZS1zdHlsZXMiPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgIH0KICAgICAgI2hlYWRlciB7CiAgICAgICAgZm9udC1zaXplOiBzbWFsbGVyOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICAgIHBhZGRpbmctYm90dG9tOiAwLjI1ZW07CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM2NjY7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICAgIC8qIE1hdGNoIGluZGVudGVkIG5hbWVzICovCiAgICAgICNoZWFkZXIgPiAjbmFtZSB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAyZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8c3BhbiBpZD0idGltZSI+VGltZTwvc3Bhbj4KICAgICAgPHNwYW4gaWQ9Indhc3RlZCI+V2FzdGVkPC9zcGFuPgogICAgICA8c3BhbiBpZD0ibmFtZSI+TmFtZTwvc3Bhbj4KICAgICAgPHNwYW4gaWQ9InByb3ZlbmFuY2UiPlRlbnNvckZsb3cgT3A8L3NwYW4+CiAgICAgIDxzcGFuIGlkPSJ1dGlsaXphdGlvbiI+RkxPUFM8L3NwYW4+CiAgICA8L2Rpdj4KICAgIDx0Zi1vcC10YWJsZS1lbnRyeSBub2RlPSJbW3Jvb3ROb2RlXV0iIGhlYWRlci1ob3Zlcj0iW1tfb25IZWFkZXJIb3Zlcl1dIiBoZWFkZXItY2xpY2s9IltbX29uSGVhZGVyQ2xpY2tdXSIgY2hpbGRyZW4tY291bnQ9Int7Y2hpbGRyZW5Db3VudH19IiBzaG93LXA5MD0ie3tzaG93UDkwfX0iIGJ5LXdhc3RlPSJ7e2J5V2FzdGV9fSIgZXhwYW5kZWQ9InRydWUiPgogICAgPC90Zi1vcC10YWJsZS1lbnRyeT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1vcC10YWJsZS1lbnRyeSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InRmLW9wLXRhYmxlLXN0eWxlcyI+CiAgICAgICNyb3cgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIDAgcmdiYSgwLCAwLCAwLCAwLjA2KTsKICAgICAgICB6LWluZGV4OiAwOwogICAgICB9CiAgICAgICNiYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgei1pbmRleDogLTE7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2NkZTsKICAgICAgfQogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgOmhvc3QoLnNlbGVjdGVkKSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA0KTsKICAgICAgfQogICAgICA6aG9zdCguc2VsZWN0ZWQpID4gI3JvdyB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgI3Jvdzpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA1KTsKICAgICAgfQogICAgICAjZGlzY2xvc3VyZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiAxZW07CiAgICAgIH0KICAgICAgI25hbWUgewogICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgIH0KICAgICAgI3RpbWUsCiAgICAgICN3YXN0ZWQsCiAgICAgICN1dGlsaXphdGlvbiB7CiAgICAgICAgZm9udC1zaXplOiBzbWFsbGVyOwogICAgICB9CiAgICAgIC8qIFV0aWxpemF0aW9uIGhhcyBhIGJhY2tncm91bmQgY29sb3IsIHNvIGl0IHN0cmV0Y2hlcyB0byBmaWxsIHRoZSByb3cuCiAgICAgICAgIEl0cyB0ZXh0IGlzIGluIGFuIGlubmVyIGRpdiB0aGF0IHJlbWFpbnMgdmVydGljYWxseSBjZW50ZXJlZC4gKi8KICAgICAgI3V0aWxpemF0aW9uIHsKICAgICAgICBhbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICB9CiAgICAgICN1dGlsaXphdGlvbiBkaXYgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB0b3A6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7CiAgICAgIH0KCiAgICAgIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGlkPSJyb3ciIG9uLWNsaWNrPSJfaGFuZGxlSGVhZGVyQ2xpY2siIG9uLW1vdXNlZW50ZXI9Il9oYW5kbGVIZWFkZXJNb3VzZUVudGVyIiBvbi1tb3VzZWxlYXZlPSJfaGFuZGxlSGVhZGVyTW91c2VMZWF2ZSIgaGlkZGVuPSJbWyFsZXZlbF1dIj4KICAgICAgPGRpdiBpZD0iYmFyIiBzdHlsZSQ9IndpZHRoOnt7X2JhcldpZHRoKG5vZGUpfX0iPjwvZGl2PgogICAgICA8c3BhbiBpZD0idGltZSI+e3tfcGVyY2VudChub2RlKX19PC9zcGFuPgogICAgICA8c3BhbiBpZD0id2FzdGVkIj57e190aW1lV2FzdGVkKG5vZGUpfX08L3NwYW4+CiAgICAgIDxzcGFuIGlkPSJuYW1lIiBzdHlsZSQ9InBhZGRpbmctbGVmdDpbW2xldmVsXV1lbTsiPgogICAgICAgIDxzcGFuIGlkPSJkaXNjbG9zdXJlIj4KICAgICAgICAgIDxzcGFuIGhpZGRlbj0iW1shbm9kZS5jaGlsZHJlbi5sZW5ndGhdXSI+CiAgICAgICAgICAgIDxzcGFuIGhpZGRlbj0iW1tleHBhbmRlZF1dIj7ilrY8L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGhpZGRlbj0iW1shZXhwYW5kZWRdXSI+4pa8PC9zcGFuPgogICAgICAgICAgPC9zcGFuPiA8L3NwYW4+e3tub2RlLm5hbWV9fQogICAgICA8L3NwYW4+CiAgICAgIDxzcGFuIGlkPSJwcm92ZW5hbmNlIj57e19wcm92ZW5hbmNlKG5vZGUpfX0mbmJzcDs8L3NwYW4+CiAgICAgIDxzcGFuIGlkPSJ1dGlsaXphdGlvbiIgaGlkZGVuPSJbWyFfaGFzRmxvcHMobm9kZSldXSIgc3R5bGUkPSJiYWNrZ3JvdW5kLWNvbG9yOnt7X2ZsYW1lQ29sb3Iobm9kZSl9fSI+CiAgICAgICAge3tfdXRpbGl6YXRpb24obm9kZSl9fTwvc3Bhbj4KICAgIDwvZGl2PgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2V4cGFuZGVkXV0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e19nZXRLQ2hpbGRyZW4obm9kZSwgY2hpbGRyZW5Db3VudCwgc2hvd1A5MCwgbGV2ZWwpfX0iIHNvcnQ9IltbX3NvcnQoYnlXYXN0ZSldXSI+CiAgICAgICAgPHRmLW9wLXRhYmxlLWVudHJ5IG5vZGU9IltbaXRlbV1dIiBjaGlsZHJlbi1jb3VudD0ie3tjaGlsZHJlbkNvdW50fX0iIHNob3ctcDkwPSJ7e3Nob3dQOTB9fSIgYnktd2FzdGU9Int7YnlXYXN0ZX19IiBsZXZlbD0ie3tfbmV4dExldmVsKGxldmVsKX19IiBoZWFkZXItaG92ZXI9Int7aGVhZGVySG92ZXJ9fSIgaGVhZGVyLWNsaWNrPSJ7e2hlYWRlckNsaWNrfX0iPgogICAgICAgIDwvdGYtb3AtdGFibGUtZW50cnk+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTGVmdG91dChub2RlLCBjaGlsZHJlbkNvdW50LCBsZXZlbCldXSI+CiAgICAgICAgPHNwYW4gaWQ9Im5hbWUiIHN0eWxlJD0icGFkZGluZy1sZWZ0OltbX2dldFBhZGRpbmdMZWZ0KGxldmVsKV1dZW07Ij4KICAgICAgICAgIFtbX251bUxlZnRvdXQobm9kZSwgY2hpbGRyZW5Db3VudCldXSBjYXRlZ29yaWVzIG9yIG9wcyBoYXZlIGJlZW4gbGVmdAogICAgICAgICAgb3V0LgogICAgICAgIDwvc3Bhbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdGVtcGxhdGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtb3AtYmFyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBsaW5lLWhlaWdodDogMS41ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICAmbmJzcDtbW19wZXJjZW50KHZhbHVlKV1dCiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1vcC1kZXRhaWxzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLWNhcmQgewogICAgICAgIC0tcGFwZXItY2FyZC1oZWFkZXItY29sb3I6IHdoaXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICAgIHRmLW9wLWJhciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgI3N1YmhlYWRlciB7CiAgICAgICAgcGFkZGluZzogMCAxNnB4IDZweDsKICAgICAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB0b3A6IC0xMHB4OwogICAgICB9CiAgICAgIC5jYXJkLWNvbnRlbnQgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgIH0KICAgICAgLmNhcmQtY29udGVudCA+IGRpdiB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMWVtOwogICAgICB9CiAgICAgIC5leHByZXNzaW9uIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgICAgLnVuYXZhaWxhYmxlIHsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQgewogICAgICAgIGRpc3BsYXk6IHRhYmxlOwogICAgICAgIHdpZHRoOiA1MCU7CiAgICAgICAgYm9yZGVyLXNwYWNpbmc6IDFlbSAwLjNlbTsKICAgICAgfQogICAgICAubGF5b3V0ID4gKiB7CiAgICAgICAgZGlzcGxheTogdGFibGUtcm93OwogICAgICB9CiAgICAgIC5sYXlvdXQgPiAqID4gKiB7CiAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbDsKICAgICAgfQogICAgICAubGF5b3V0IC5zaXplLAogICAgICAubGF5b3V0IC5zaXplLXggewogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQogICAgICAubGF5b3V0IC5zaXplLXggewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGNvbG9yOiAjODg4OwogICAgICB9CiAgICAgIC5sYXlvdXQgLnNlbWFudGljcyB7CiAgICAgICAgZm9udC1zaXplOiBzbWFsbGVyOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGNvbG9yOiAjNDhjOwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgICAubGF5b3V0IC5hbGlnbm1lbnQgewogICAgICAgIC8qIE1ha2UgdGhlIGJhY2tncm91bmQgZXh0ZW5kIG91dHNpZGUgdGhlIGJveCAqLwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBwYWRkaW5nOiAwLjVlbTsKICAgICAgICBtYXJnaW4tdG9wOiAtMC41ZW07CiAgICAgICAgd2lkdGg6IDUwJTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHBhcGVyLWNhcmQgaWQ9ImNhcmQiIGhlYWRpbmc9Iltbbm9kZS5uYW1lXV0iIGVsZXZhdGlvbj0iMiI+CiAgICAgIDxkaXYgaWQ9InN1YmhlYWRlciI+W1tfc3ViaGVhZGVyKG5vZGUpXV08L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2FyZC1jb250ZW50Ij4KICAgICAgICA8ZGl2IGhpZGRlbj0iW1shX2hhc0Zsb3BzKG5vZGUpXV0iPgogICAgICAgICAgPGI+RkxPUFMgdXRpbGl6YXRpb246IDwvYj4KICAgICAgICAgIDx0Zi1vcC1iYXIgY29sb3I9IltbX2Zsb3BzQ29sb3Iobm9kZSldXSIgdmFsdWU9IltbX3V0aWxpemF0aW9uKG5vZGUpXV0iPjwvdGYtb3AtYmFyPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaGlkZGVuPSJbWyFfaGFzTWVtb3J5VXRpbGl6YXRpb24obm9kZSldXSI+CiAgICAgICAgICA8Yj5NZW1vcnkgYmFuZHdpZHRoIHV0aWxpemF0aW9uOiA8L2I+CiAgICAgICAgICA8dGYtb3AtYmFyIGNvbG9yPSJbW19id0NvbG9yKG5vZGUpXV0iIHZhbHVlPSJbW19tZW1vcnlVdGlsaXphdGlvbihub2RlKV1dIj48L3RmLW9wLWJhcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJ1bmF2YWlsYWJsZSIgaGlkZGVuPSJbWyFfZnVzZWQobm9kZSldXSI+CiAgICAgICAgICBQZXJmb3JtYW5jZSBpbmZvcm1hdGlvbiBmb3IgaW5kaXZpZHVhbCBmdXNlZCBvcGVyYXRpb25zIGlzIG5vdAogICAgICAgICAgYXZhaWxhYmxlLgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InVuYXZhaWxhYmxlIiBoaWRkZW49IltbIW5vZGUuY2F0ZWdvcnldXSI+CiAgICAgICAgICBTZWxlY3QgaXRlbXMgd2l0aGluIHRoaXMgY2F0ZWdvcnkgZm9yIHBlcmZvcm1hbmNlIGRldGFpbHMuCiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBoaWRkZW49IltbIW5vZGUueGxhLmV4cHJlc3Npb25dXSI+CiAgICAgICAgICA8Yj5YTEEgRXhwcmVzc2lvbjogPC9iPgogICAgICAgICAgPGNvZGUgY2xhc3M9ImV4cHJlc3Npb24iPltbbm9kZS54bGEuZXhwcmVzc2lvbl1dPC9jb2RlPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaGlkZGVuPSJbWyFub2RlLnhsYS5wcm92ZW5hbmNlXV0iPgogICAgICAgICAgPGI+VGVuc29yRmxvdyBOYW1lOiA8L2I+CiAgICAgICAgICA8Y29kZSBjbGFzcz0iZXhwcmVzc2lvbiI+W1tub2RlLnhsYS5wcm92ZW5hbmNlXV08L2NvZGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBoaWRkZW49IltbIW5vZGUueGxhLmxheW91dF1dIj4KICAgICAgICAgIDxiPkxheW91dDogPC9iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0IiBoaWRkZW49IltbIW5vZGUueGxhLmxheW91dF1dIj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tub2RlLnhsYS5sYXlvdXQuZGltZW5zaW9uc11dIj4KICAgICAgICAgICAgICA8ZGl2IGhpZGRlbj0iW1shaW5kZXhdXSI+PHNwYW4gY2xhc3M9InNpemUteCI+w5c8L3NwYW4+PC9kaXY+CiAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzaXplIj5bW2l0ZW0uc2l6ZV1dPC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNlbWFudGljcyI+W1tpdGVtLnNlbWFudGljc11dPC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImFsaWdubWVudCIgc3R5bGUkPSJiYWNrZ3JvdW5kLWNvbG9yOltbX2RpbWVuc2lvbkNvbG9yKGl0ZW0pXV0iPltbX2RpbWVuc2lvbkhpbnQoaXRlbSldXTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvcGFwZXItY2FyZD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLW9wLXByb2ZpbGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi1yaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgI2NvbnRyb2wgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1mbG93OiByb3cgbm93cmFwOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207CiAgICAgICAgdGV4dC1hbGlnbjogYm90dG9tOwogICAgICB9CiAgICAgIC5jb250cm9sUm93TGVmdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWZsb3c6IHJvdyBub3dyYXA7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBsaW5lLWhlaWdodDogNTBweDsKICAgICAgICB0ZXh0LWFsaWduOiBib3R0b207CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICB9CiAgICAgIC5jb250cm9sUm93UmlnaHQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1mbG93OiByb3cgbm93cmFwOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgbGluZS1oZWlnaHQ6IDUwcHg7CiAgICAgICAgdGV4dC1hbGlnbjogYm90dG9tOwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgIH0KICAgICAgcGFwZXItc2xpZGVyIHsKICAgICAgICAtLXBhcGVyLXNsaWRlci1pbnB1dDogewogICAgICAgICAgd2lkdGg6IDEwMHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLXNsaWRlci1oZWlnaHQ6IDNweDsKICAgICAgfQogICAgICAjZGVzY3JpcHRpb24gewogICAgICAgIG1hcmdpbi1ib3R0b206IDJlbTsKICAgICAgICB3aWR0aDogNjAwcHg7CiAgICAgIH0KICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGNsYXNzPSJ0Zi1vcC1wcm9maWxlIj4KICAgICAgPGgzPgogICAgICAgIE92ZXJhbGwgVFBVIEZMT1BTIHV0aWxpemF0aW9uIGlzCiAgICAgICAgPHNwYW4gc3R5bGUkPSJjb2xvcjpbW19mbG9wc0NvbG9yKF9yb290KV1dIj4KICAgICAgICAgIFtbX3V0aWxpemF0aW9uUGVyY2VudChfcm9vdCldXTwvc3Bhbj4KICAgICAgICAsIG1lbW9yeSBiYW5kd2lkdGggdXRpbGl6YXRpb24gaXMKICAgICAgICA8c3BhbiBzdHlsZSQ9ImNvbG9yOltbX2J3Q29sb3IoX3Jvb3QpXV0iPgogICAgICAgICAgW1tfbWVtb3J5VXRpbGl6YXRpb25QZXJjZW50KF9yb290KV1dPC9zcGFuPgogICAgICA8L2gzPgogICAgICA8ZGl2IGlkPSJkZXNjcmlwdGlvbiI+CiAgICAgICAgPHA+CiAgICAgICAgICBNb2RpZnlpbmcgeW91ciBtb2RlbCdzIGFyY2hpdGVjdHVyZSwgZGF0YSBkaW1lbnNpb25zLCBhbmQgaW1wcm92aW5nCiAgICAgICAgICB0aGUgZWZmaWNpZW5jeSBvZiBDUFUgb3BlcmF0aW9ucyBtYXkgaGVscCByZWFjaCB0aGUgVFBVJ3MgRkxPUFMKICAgICAgICAgIHBvdGVudGlhbC4KICAgICAgICAKICAgICAgICA8cD4KICAgICAgICAgICJJZGxlIiByZXByZXNlbnRzIHRoZSBwb3J0aW9uIG9mIHRoZSB0b3RhbCBleGVjdXRpb24gdGltZSBvbiBkZXZpY2UKICAgICAgICAgIHRoYXQgaXMgaWRsZS4gV2FzdGVkIHRpbWUgaXMgZGVmaW5lZCBieQogICAgICAgICAgPGNvZGU+UnVudGltZUZyYWN0aW9uICogKDEgLSBtYXgoRmxvcHNVdGlsaXphdGlvbiwKICAgICAgICAgICAgTWVtb3J5VXRpbGl6YXRpb24pKTwvY29kZT4uCiAgICAgICAgCiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGlkPSJjb250cm9sIj4KICAgICAgICA8c3BhbiBjbGFzcz0iY29udHJvbFJvd0xlZnQiIGhpZGRlbiQ9IltbIV9oYXNUd29Qcm9maWxlc11dIj5CeSBQcm9ncmFtCiAgICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBjaGVja2VkPSJ7e2lzQnlDYXRlZ29yeX19Ij4gPC9wYXBlci10b2dnbGUtYnV0dG9uPkJ5IENhdGVnb3J5PC9zcGFuPgogICAgICAgIAogICAgICAgIDxzcGFuIGNsYXNzPSJjb250cm9sUm93TGVmdCI+U2hvdyB0b3AKICAgICAgICAgIDxwYXBlci1zbGlkZXIgbWluPSIxMCIgbWF4PSIxMDAiIHNuYXBzIHN0ZXA9IjEwIiB2YWx1ZT0ie3tjaGlsZHJlbkNvdW50fX0iIGVkaXRhYmxlPgogICAgICAgICAgPC9wYXBlci1zbGlkZXI+b3BzPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJjb250cm9sUm93UmlnaHQiPiZuYnNwOwogICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2hlY2tlZD0ie3tieVdhc3RlfX0iPiA8L3BhcGVyLXRvZ2dsZS1idXR0b24+U29ydAogICAgICAgICAgYnkgd2FzdGVkIHRpbWU8L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNvbnRyb2xSb3dSaWdodCI+b2ZmJm5ic3A7CiAgICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBjaGVja2VkPSJ7e3Nob3dQOTB9fSI+IDwvcGFwZXItdG9nZ2xlLWJ1dHRvbj5Ub3AKICAgICAgICAgIDkwJTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDx0Zi1vcC10YWJsZSByb290LW5vZGU9IltbX3Jvb3RdXSIgYWN0aXZlPSJ7e2FjdGl2ZX19IiBieS13YXN0ZT0ie3tieVdhc3RlfX0iIHNob3ctcDkwPSJ7e3Nob3dQOTB9fSIgY2hpbGRyZW4tY291bnQ9Int7Y2hpbGRyZW5Db3VudH19Ij4KICAgICAgPC90Zi1vcC10YWJsZT4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJtdi1saW5lLWNoYXJ0Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGxvdHRhYmxlLXN0eWxlIj48L3N0eWxlPgogICAgPGRpdiBjbGFzcz0ibXYtbGluZS1jaGFydCI+CiAgICAgIDxoMj5Xb3JraW5nIFNwYWNlIFNpemUgKE1pQikgdnMgUHJvZ3JhbSBPcmRlciAoSExPIFNlcXVlbmNlKTwvaDI+CiAgICAgIDxkaXYgaWQ9ImNoYXJ0ZGl2IiBzdHlsZT0id2lkdGg6MTIwMHB4O2hlaWdodDozODRweCI+PC9kaXY+CiAgICAgIDxkaXYgaWQ9Im1heGhlYXAtZGV0YWlscyI+CiAgICAgICAgPGVtPkhvdmVyIG92ZXIgYSBiYXIgZm9yIGJ1ZmZlciBkZXRhaWxzIHRvIGFwcGVhciBvbiB0aGUgbGVmdC48L2VtPgogICAgICA8L2Rpdj4KICAgICAgPGgzPkJ5IFByb2dyYW0gT3JkZXI8L2gzPgogICAgICA8ZGl2IGlkPSJtYXhoZWFwY2hhcnQiIHN0eWxlPSJ3aWR0aDoxMjAwcHg7aGVpZ2h0OjIwMHB4Ij48L2Rpdj4KICAgICAgPGgzPkJ5IFNpemU8L2gzPgogICAgICA8ZGl2IGlkPSJtYXhoZWFwc2l6ZWNoYXJ0IiBzdHlsZT0id2lkdGg6MTIwMHB4O2hlaWdodDoyMDBweCI+PC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1tdi1iYXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjVlbTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9ImJ1ZmZlci1kZXRhaWxzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLWNhcmQgewogICAgICAgIC0tcGFwZXItY2FyZC1oZWFkZXItY29sb3I6IHdoaXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICAgIHRmLW12LWJhciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgI3N1YmhlYWRlciB7CiAgICAgICAgcGFkZGluZzogMCAxNnB4IDZweDsKICAgICAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB0b3A6IC0xMHB4OwogICAgICB9CiAgICAgIC5jYXJkLWNvbnRlbnQgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgIH0KICAgICAgLmNhcmQtY29udGVudCA+IGRpdiB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMWVtOwogICAgICB9CiAgICAgIC5leHByZXNzaW9uIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8cGFwZXItY2FyZCBpZD0iY2FyZCIgaGVhZGluZz0iW1tub2RlLmluc3RydWN0aW9uTmFtZV1dIiBoaWRkZW49IltbIW5vZGVdXSIgZWxldmF0aW9uPSIyIj4KICAgICAgPGRpdiBpZD0ic3ViaGVhZGVyIj5bW19zdWJoZWFkZXIobm9kZSldXTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjYXJkLWNvbnRlbnQiPgogICAgICAgIDxkaXYgaGlkZGVuPSJbWyFzaXplXV0iPgogICAgICAgICAgPGg0PlNpemU6IDxzcGFuPltbc2l6ZV1dPC9zcGFuPjxiPiBNaUI8L2I+PC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGhpZGRlbj0iW1shdW5wYWRkZWRTaXplXV0iPgogICAgICAgICAgPGI+VW5wYWRkZWQgU2l6ZTogPC9iPjxzcGFuPltbdW5wYWRkZWRTaXplXV08L3NwYW4+PGI+IE1pQjwvYj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGhpZGRlbj0iW1shcGFkZGluZ11dIj4KICAgICAgICAgIDxiPkV4dHJhIG1lbW9yeSBkdWUgdG8gcGFkZGluZzogPC9iPjxzcGFuPltbcGFkZGluZ11dPC9zcGFuPjxiPiBNaUI8L2I+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBoaWRkZW49IltbIWV4cGFuc2lvbl1dIj4KICAgICAgICAgIDxiPkV4cGFuc2lvbjogPC9iPjxzcGFuPltbZXhwYW5zaW9uXV08L3NwYW4+PGI+WDwvYj4KICAgICAgICAgIDx0Zi1tdi1iYXIgdmFsdWU9IltbdXRpbGl6YXRpb25dXSI+PC90Zi1tdi1iYXI+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBoaWRkZW49IltbIW5vZGUuc2hhcGVdXSI+CiAgICAgICAgICA8Yj5TaGFwZSAoYW5kIG1pbm9yLXRvLW1ham9yIG9yZGVyKTogPC9iPgogICAgICAgICAgPGNvZGUgY2xhc3M9ImV4cHJlc3Npb24iPltbbm9kZS5zaGFwZV1dPC9jb2RlPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaGlkZGVuPSJbWyFub2RlLnRmT3BOYW1lXV0iPgogICAgICAgICAgPGI+VGYgT3AgTmFtZTogPC9iPgogICAgICAgICAgPGNvZGUgY2xhc3M9ImV4cHJlc3Npb24iPltbbm9kZS50Zk9wTmFtZV1dPC9jb2RlPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaGlkZGVuPSJbWyFub2RlLmdyb3VwTmFtZV1dIj4KICAgICAgICAgIDxiPkFsbG9jYXRpb24gVHlwZTogPC9iPjxzcGFuPltbbm9kZS5ncm91cE5hbWVdXTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWNhcmQ+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJtZW1vcnktdmlld2VyLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgb3ZlcmZsb3cteDogYXV0bzsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAjZGVzY3JpcHRpb24gewogICAgICAgIG1hcmdpbi1ib3R0b206IDJlbTsKICAgICAgICB3aWR0aDogNjAwcHg7CiAgICAgIH0KICAgICAgbXYtbGluZS1jaGFydCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0ibWVtb3J5LXZpZXdlci1kYXNoYm9hcmQiIHN0eWxlPSJvdmVyZmxvdzphdXRvIj4KICAgICAgPGgzPk1vZHVsZSBuYW1lOiA8c3Bhbj5bW21vZHVsZU5hbWVfXV08L3NwYW4+PC9oMz4KICAgICAgPGgzPgogICAgICAgIFBlYWsgbWVtb3J5IGFsbG9jYXRpb24gaXMgPHNwYW4+e3twZWFrSGVhcFNpemVNaUJffX08L3NwYW4+IE1pQgogICAgICAgIDxzcGFuIHN0eWxlPSJmb250LXNpemU6MjBweCIgaGlkZGVuPSJ7eyF1bnBhZGRlZFBlYWtIZWFwU2l6ZU1pQl99fSI+KCB7e3VucGFkZGVkUGVha0hlYXBTaXplTWlCX319IE1pQiB3aXRob3V0IHBhZGRpbmcpPC9zcGFuPgogICAgICA8L2gzPgogICAgICA8ZGl2IGlkPSJkZXNjcmlwdGlvbiI+CiAgICAgICAgPHA+CiAgICAgICAgICBNb2RpZnlpbmcgeW91ciBtb2RlbCdzIGFyY2hpdGVjdHVyZSwgYmF0Y2ggc2l6ZSBhbmQgZGF0YSBkaW1lbnRpb25zCiAgICAgICAgICBtYXkgaGVscCByZWR1Y2UgdGhlIG1lbW9yeSBmb290cHJpbnQuCiAgICAgICAgCiAgICAgIDwvZGl2PgogICAgICA8bXYtbGluZS1jaGFydCBkYXRhPSJ7e3VzYWdlfX0iIGFjdGl2ZT0ie3thY3RpdmV9fSI+PC9tdi1saW5lLWNoYXJ0PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0iZGV0YWlscy1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLWNhcmQgewogICAgICAgIG1heC1oZWlnaHQ6IDUwdmg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICAtLXBhcGVyLWNhcmQtaGVhZGVyLWNvbG9yOiB3aGl0ZTsKICAgICAgICAtLXBhcGVyLWNhcmQtaGVhZGVyOiB7CiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTc4LCAzNCwgMzQpOwogICAgICAgIH0KICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLmNhcmQtY29udGVudCA+IGRpdiB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMWVtOwogICAgICAgIHRvcDogLTVweDsKICAgICAgfQoKICAgICAgLnZhbHVlIHsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CgogICAgICAuaW5mbyB7CiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CgogICAgICAuY29kZS1zdHlsZSB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8cGFwZXItY2FyZCBpZD0iY2FyZCIgaGVhZGluZz0iW1tfbmFtZV1dIiBoaWRkZW49IltbIV9uYW1lXV0iIGVsZXZhdGlvbj0iMiI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Iltbbm9kZXNdXSIgYXM9Im5vZGUiPgogICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtY29udGVudCBpbmZvIj4KICAgICAgICAgIDxkaXYgaGlkZGVuPSJbW19pc1N0ZXAobm9kZSldXSI+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIERhdGEgVHJhbnNmZXJyZWQ6CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InZhbHVlIj5bW19zaXplTWlCKG5vZGUuZGF0YVNpemUpXV0gTWlCPC9zcGFuPgogICAgICAgICAgICAKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgTGF0ZW5jeToKICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idmFsdWUiPltbX2Zvcm1hdChub2RlLmR1cmF0aW9uVXMpXV0gwrVzPC9zcGFuPgogICAgICAgICAgICAKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgQlc6CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InZhbHVlIj4KICAgICAgICAgICAgICAgIFtbX2JhbmR3aWR0aChub2RlLmRhdGFTaXplLCBub2RlLmR1cmF0aW9uVXMpXV0gR2lCL3M8L3NwYW4+CiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGhpZGRlbj0iW1shX2lzQ2hhbm5lbChub2RlKV1dIj4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgU2VuZCBEZWxheToKICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idmFsdWUiPltbX2Zvcm1hdChub2RlLnNlbmREZWxheVVzKV1dIMK1czwvc3Bhbj4KICAgICAgICAgICAgCiAgICAgICAgICAgIDxwPkhsbyBOYW1lczoKICAgICAgICAgICAgPGNvZGUgY2xhc3M9ImNvZGUtc3R5bGUiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Iltbbm9kZS5obG9OYW1lc11dIj4KICAgICAgICAgICAgICAgICJbW2l0ZW1dXSIKICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2NvZGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgaGlkZGVuPSJbWyFfaGFzUmVwbGljYUdyb3Vwcyhub2RlKV1dIj4KICAgICAgICAgICAgPHA+UmVwbGljYSBHcm91cHMKICAgICAgICAgICAgPGNvZGUgY2xhc3M9ImNvZGUtc3R5bGUiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Iltbbm9kZS5yZXBsaWNhR3JvdXBzXV0iPgogICAgICAgICAgICAgICAge1tbaXRlbS5yZXBsaWNhSWRzXV19PGJyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvY29kZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBoaWRkZW49IltbIV9pc1N0ZXAobm9kZSldXSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Iltbc3RlcEJyZWFrZG93bkxheWVyc11dIj4KICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIFtbaXRlbS5sYWJlbF1dOgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InZhbHVlIj4KICAgICAgICAgICAgICAgICAgW1tfZ2V0U3RlcEJyZWFrZG93blZhbHVlKG5vZGUsIGl0ZW0ua2V5KV1dIMK1cwogICAgICAgICAgICAgICAgICBbW19nZXRTdGVwQnJlYWtkb3duUGN0KG5vZGUsIGl0ZW0ua2V5KV1dPC9zcGFuPgogICAgICAgICAgICAgIAogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3BhcGVyLWNhcmQ+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJzdGFjay1iYXItY2hhcnQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi1yaWdodDogMS41ZW07CiAgICAgIH0KCiAgICAgIC5heGlzIHRleHQgewogICAgICAgIGZvbnQ6IDE0cHggc2Fucy1zZXJpZjsKICAgICAgfQoKICAgICAgLnN2Zy1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogOTAlOyAvKiBhc3BlY3QgcmF0aW8gKi8KICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICB3aWR0aDogOTAlOwogICAgICB9CgogICAgICAuc3ZnLWNvbnRlbnQtcmVzcG9uc2l2ZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9InN0YWNrLWJhci1jaGFydCI+CiAgICAgIDxkaXYgaWQ9ImNoYXJ0Ij48L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRvcG9sb2d5LWdyYXBoIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICAgIC5mbGV4LWhvcml6b250YWwgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICB9CgogICAgICAuZmxleGNoaWxkIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleDsKICAgICAgfQoKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi1yaWdodDogMS41ZW07CiAgICAgIH0KCiAgICAgIC5jZWxscyB7CiAgICAgICAgZmlsbDogI2FhYTsKICAgICAgfQoKICAgICAgLmxhYmVsIHsKICAgICAgICBmb250OiAyNHB4IHNhbnMtc2VyaWY7CiAgICAgICAgdGV4dC1hbmNob3I6IHN0YXJ0OwogICAgICB9CgogICAgICAvKiBkaXNhYmxlIHRleHQgc2VsZWN0aW9uICovCiAgICAgIHN2ZyAqOjpzZWxlY3Rpb24sCiAgICAgIHN2ZyAqOjotbW96LXNlbGVjdGlvbiwKICAgICAgc3ZnICo6Oi13ZWJraXQtc2VsZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgcmVjdC5zZWxlY3Rpb24gewogICAgICAgIGZpbGw6IHRyYW5zcGFyZW50OwogICAgICAgIHN0cm9rZTogIzMzMzsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiA0cHg7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuNTsKICAgICAgfQoKICAgICAgcmVjdC5ib3JkZXJlZCB7CiAgICAgICAgc3Ryb2tlOiAjZTZlNmU2OwogICAgICAgIHN0cm9rZS13aWR0aDogMnB4OwogICAgICB9CgogICAgICByZWN0LmNlbGwtYm9yZGVyIHsKICAgICAgICBzdHJva2U6ICNlZWU7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAwLjNweDsKICAgICAgfQoKICAgICAgcmVjdC5jZWxsLXNlbGVjdGVkIHsKICAgICAgICBzdHJva2U6IHJnYig1MSwgMTAyLCAxNTMpOwogICAgICAgIHN0cm9rZS13aWR0aDogMC41cHg7CiAgICAgIH0KCiAgICAgIHJlY3QuY2VsbC1ob3ZlciB7CiAgICAgICAgc3Ryb2tlOiAjZjAwOwogICAgICAgIHN0cm9rZS13aWR0aDogMC4zcHg7CiAgICAgIH0KCiAgICAgICN0b29sdGlwIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgICAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgICAgLW1vei1ib3JkZXItcmFkaXVzOiAxMHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgICAgLXdlYmtpdC1ib3gtc2hhZG93OiA0cHggNHB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICAgIC1tb3otYm94LXNoYWRvdzogNHB4IDRweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgICBib3gtc2hhZG93OiA0cHggNHB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMjAwcHg7CiAgICAgIH0KCiAgICAgICN0b29sdGlwLmhpZGRlbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgI3Rvb2x0aXAgcCB7CiAgICAgICAgZm9udDogMTJweCBzYW5zLXNlcmlmOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfQoKICAgICAgI292ZXJ2aWV3IHsKICAgICAgICBtYXJnaW4tbGVmdDogMjBweDsKICAgICAgfQoKICAgICAgcGFwZXItaXRlbTpob3Zlci5tZW51LW9wdGlvbiB7CiAgICAgICAgYmFja2dyb3VuZDogI2UwZTBlMDsKICAgICAgfQoKICAgICAgcGFwZXItc2xpZGVyIHsKICAgICAgICAtLXBhcGVyLXNsaWRlci1pbnB1dDogewogICAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICAgIH0KICAgICAgfQoKICAgICAgLm1ldHJpY3MtYnV0dG9uIHsKICAgICAgICBoZWlnaHQ6IDYwcHg7CiAgICAgICAgd2lkdGg6IDYwcHg7CiAgICAgIH0KCiAgICAgIC50b3BvLWhlYWRlciB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLXJvdy1sZWZ0IHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1mbG93OiByb3cgbm93cmFwOwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgICBsaW5lLWhlaWdodDogNTBweDsKICAgICAgICBtYXJnaW4tbGVmdDogMTZweDsKICAgICAgICB0ZXh0LWFsaWduOiBib3R0b207CiAgICAgIH0KCiAgICAgIC5tZXRyaWNzLWxhYmVsIHsKICAgICAgICBwYWRkaW5nOiAwLjVlbTsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICB9CgogICAgICAudG9wby10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGxpbmUtaGVpZ2h0OiAzMnB4OwogICAgICAgIHRleHQtYWxpZ246IGJvdHRvbTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOwogICAgICB9CgogICAgICAjY29udGFpbmVyIHsKICAgICAgICAvKiBUb29sdGlwIHNob3VsZCBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgY29udGFpbmVyLiAqLwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9InRvcG9sb2d5LWdyYXBoIj4KICAgICAgPGRpdiBjbGFzcz0idG9wby1oZWFkZXIgY29udGFpbmVyIGZsZXgtaG9yaXpvbnRhbCI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1yb3ctbGVmdCB0b3BvLXRpdGxlIj4KICAgICAgICAgIHt7X3RwdVR5cGV9fSB7e190b3RhbENvcmVDb3VudH19CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNvbnRyb2wtcm93LWxlZnQgbWV0cmljcy1sYWJlbCI+CiAgICAgICAgICBbW19nZXRTZWxlY3RlZE1ldHJpY0xhYmVsKG1ldHJpY3MsIHNlbGVjdGVkTWV0cmljSWR4KV1dPC9zcGFuPgogICAgICAgIDxwYXBlci1tZW51LWJ1dHRvbiBjbG9zZS1vbi1hY3RpdmF0ZT0idHJ1ZSI+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gcmFpc2VkIGljb249ImFycm93LWRyb3AtZG93biIgc2xvdD0iZHJvcGRvd24tdHJpZ2dlciIgY2xhc3M9ImRyb3Bkb3duLXRyaWdnZXIgbWV0cmljcy1idXR0b24iPgogICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tzZWxlY3RlZE1ldHJpY0lkeH19Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1ttZXRyaWNzXV0iPgogICAgICAgICAgICAgIDxwYXBlci1pdGVtIHZhbHVlPSJbW2l0ZW0ua2V5XV0iPltbaXRlbS5sYWJlbF1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgIDwvcGFwZXItbWVudS1idXR0b24+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICAgIDxkaXYgaWQ9InRwZ3JhcGgiPjwvZGl2PgogICAgICAgIDxkaXYgaWQ9InRvb2x0aXAiIGNsYXNzPSJoaWRkZW4iPgogICAgICAgICAgPHA+PHNwYW4gaWQ9InZhbHVlIj48L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJwb2Qtdmlld2VyLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxLjVlbTsKICAgICAgfQoKICAgICAgI2NvbnRyb2wgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1mbG93OiByb3cgbm93cmFwOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBwYWRkaW5nOiAwLjVlbTsKICAgICAgICB0ZXh0LWFsaWduOiBib3R0b207CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOwogICAgICB9CgogICAgICAuY29udHJvbC1yb3ctbGVmdCB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZmxvdzogcm93IG5vd3JhcDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgbGluZS1oZWlnaHQ6IDUwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDE2cHg7CiAgICAgICAgdGV4dC1hbGlnbjogYm90dG9tOwogICAgICB9CgogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIC0tcGFwZXItc2xpZGVyLWlucHV0OiB7CiAgICAgICAgICB3aWR0aDogMTAwcHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItc2xpZGVyLWhlaWdodDogM3B4OwogICAgICB9CgogICAgICAuc3RlcC1udW0tdGV4dCB7CiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIHBhZGRpbmctbGVmdDogMWVtOwogICAgICB9CgogICAgICAuc3RhY2stdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMjRweDsKICAgICAgICBsaW5lLWhlaWdodDogMzJweDsKICAgICAgfQoKICAgICAgLmJhci1jaGFydCB7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgICN0aXRsZSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5lcnJvci1tZXNzYWdlIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICAgIGZvbnQtc2l6ZTogMzJweDsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBtYXJnaW4tbGVmdDogMTZweDsKICAgICAgICBtYXJnaW4tdG9wOiAzMnB4OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0iZXJyb3ItbWVzc2FnZSIgaGlkZGVuPSJbWyFfZXJyb3JNZXNzYWdlXV0iPgogICAgICA8c3Bhbj5bW19lcnJvck1lc3NhZ2VdXTwvc3Bhbj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iY29udHJvbCIgaGlkZGVuPSJbW19lcnJvck1lc3NhZ2VdXSI+CiAgICAgIAogICAgICA8c3BhbiBjbGFzcz0iY29udHJvbC1yb3ctbGVmdCI+UGxlYXNlIHNlbGVjdCBhIHN0ZXAKICAgICAgICA8cGFwZXItc2xpZGVyIG1pbj0iMCIgbWF4PSJbW19tYXhTdGVwSWRdXSIgc25hcHMgc3RlcD0iMSIgdmFsdWU9Int7Y3VyU3RlcElkfX0iPgogICAgICAgIDwvcGFwZXItc2xpZGVyPgogICAgICAgIDxzcGFuIGNsYXNzPSJzdGVwLW51bS10ZXh0Ij5TdGVwIFtbX2dldFN0ZXBOdW0oX3BvZFN0YXRzTWFwKV1dPC9zcGFuPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9InBvZC12aWV3ZXItZGFzaGJvYXJkIiBoaWRkZW49IltbX2Vycm9yTWVzc2FnZV1dIj4KICAgICAgPGRpdiBpZD0idG9wby1ncmFwaCI+CiAgICAgICAgPHRvcG9sb2d5LWdyYXBoIHJ1bi1lbnZpcm9ubWVudD0iW1tfcnVuRW52aXJvbm1lbnRdXSIgZGF0YT0iW1tfcG9kU3RhdHNNYXBdXSIgbWV0cmljcz0iW1tfc3RlcEJyZWFrZG93bkxheWVyc11dIiBhY3RpdmUtYmFyPSJbW2FjdGl2ZUJhcl1dIj4KICAgICAgICA8L3RvcG9sb2d5LWdyYXBoPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBpZD0iY2hhbm5lbC1iYXJzIiBjbGFzcz0iYmFyLWNoYXJ0IiBoaWRkZW49IltbIV9jaGFubmVsRGJdXSI+CiAgICAgICAgPGRpdiBpZD0idGl0bGUiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3RhY2stdGl0bGUiPkxhdGVuY3kgb2YgU2VuZCBhbmQgUmVjdiBjaGFubmVsczwvZGl2PgogICAgICAgICAgPHA+KHgtYXhpczogY2hhbm5lbCBpZCwgeS1heGlzOiB0aW1lICjCtXMpKQogICAgICAgIDwvZGl2PgogICAgICAgIDxzdGFjay1iYXItY2hhcnQgZGF0YT0iW1tfY2hhbm5lbERiXV0iIHN0YWNrLWxheWVycz0iW1tfY2hhbm5lbExheWVyc11dIiB4LWRvbWFpbi1mdW5jPSJbW19jaGFubmVsRnVuY11dIiBhY3RpdmUtYmFyPSJ7e2FjdGl2ZUJhcn19Ij48L3N0YWNrLWJhci1jaGFydD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImFsbC1yZWR1Y2UtYmFycyIgY2xhc3M9ImJhci1jaGFydCIgaGlkZGVuPSJbWyFfYWxsUmVkdWNlRGJdXSI+CiAgICAgICAgPGRpdiBpZD0idGl0bGUiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3RhY2stdGl0bGUiPgogICAgICAgICAgICBEdXJhdGlvbiBvZiBhbGwtcmVkdWNlIG9wIG9yIGN1c3RvbSBmdXNpb24gZm9yIGFsbC1yZWR1Y2UKICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHA+CiAgICAgICAgICAgICh4LWF4aXM6IHNob3J0IG5hbWVzIGZvciBhbGwtcmVkdWNlcyBvcHMgKGEjKSBvciBmdXNpb24gKGYjKSwKICAgICAgICAgICAgeS1heGlzOiB0aW1lICjCtXMpKQogICAgICAgICAgCiAgICAgICAgPC9kaXY+CiAgICAgICAgPHN0YWNrLWJhci1jaGFydCBkYXRhPSJbW19hbGxSZWR1Y2VEYl1dIiBzdGFjay1sYXllcnM9IltbX2FsbFJlZHVjZUxheWVyc11dIiB4LWRvbWFpbi1mdW5jPSJbW19hbGxSZWR1Y2VGdW5jXV0iIGFjdGl2ZS1iYXI9Int7YWN0aXZlQmFyfX0iPjwvc3RhY2stYmFyLWNoYXJ0PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBpZD0ic3RhY2stYmFycyIgY2xhc3M9ImJhci1jaGFydCIgaGlkZGVuPSJbWyFfc3RlcFN0YXRzXV0iPgogICAgICAgIDxkaXYgaWQ9InRpdGxlIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN0YWNrLXRpdGxlIj5TdGVwIGJyZWFrZG93bjwvZGl2PgogICAgICAgICAgPHA+KHgtYXhpczogZ2xvYmFsIGNoaXAgaWQsIGNvcmUgaWQsIHktYXhpczogdGltZSAowrVzKSkKICAgICAgICA8L2Rpdj4KICAgICAgICA8c3RhY2stYmFyLWNoYXJ0IGRhdGE9IltbX3N0ZXBTdGF0c11dIiBzdGFjay1sYXllcnM9IltbX3N0ZXBCcmVha2Rvd25MYXllcnNdXSIgeC1kb21haW4tZnVuYz0iW1tfc3RlcEJyZWFrZG93bkZ1bmNdXSIgYWN0aXZlLWJhcj0ie3thY3RpdmVCYXJ9fSI+PC9zdGFjay1iYXItY2hhcnQ+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJnb29nbGUtY2hhcnQtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogLW1zLWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogNDAwcHg7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgfQoKICAgICAgOmhvc3QoW3R5cGU9J2dhdWdlJ10pIHsKICAgICAgICB3aWR0aDogMzAwcHg7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgfQoKICAgICAgI2NoYXJ0ZGl2IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJnb29nbGUtY2hhcnQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJnb29nbGUtY2hhcnQtc3R5bGVzIj48L3N0eWxlPgogICAgPGdvb2dsZS1jaGFydC1sb2FkZXIgaWQ9ImxvYWRlciIgdHlwZT0iW1t0eXBlXV0iPjwvZ29vZ2xlLWNoYXJ0LWxvYWRlcj4KICAgIDxkaXYgaWQ9ImNoYXJ0ZGl2Ij48L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0iZ29vZ2xlLWNoYXJ0LWRlbW8iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgY29kZSB7CiAgICAgICAgY29sb3I6ICMwMDcwMDA7CiAgICAgIH0KICAgICAgZ29vZ2xlLWNoYXJ0IHsKICAgICAgICBoZWlnaHQ6IDMwMHB4OwogICAgICAgIHdpZHRoOiA0MDBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgaWQ9ImRlbW8tYm9keSI+CiAgICAgIDxwPgogICAgICAgIFdlYnNpdGUgdHJhZmZpYyBkYXRhIGJ5IGNvdW50cnkgZnJvbSBhbiBleHRlcm5hbCBKU09OIHJlc291cmNlIHdoZXJlIHRoZQogICAgICAgIGRhdGEgaXMgaW4gcmF3IERhdGFUYWJsZSBmb3JtYXQuCiAgICAgIAogICAgICA8Z29vZ2xlLWNoYXJ0IHR5cGU9ImNvbHVtbiIgb3B0aW9ucz0ieyZxdW90O3RpdGxlJnF1b3Q7OiAmcXVvdDtWaXNpdG9ycyBieSBDb3VudHJ5JnF1b3Q7LCAmcXVvdDtsZWdlbmQmcXVvdDs6ICZxdW90O25vbmUmcXVvdDt9IiBkYXRhPSJbW19kYXRhXV0iPgogICAgICA8L2dvb2dsZS1jaGFydD4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXBsdWdpbi1kaWFsb2ciPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19vcGVuXV0iPgogICAgICA8ZGl2IGlkPSJkYXNoYm9hcmQtYmFja2Ryb3AiPjwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDxwYXBlci1kaWFsb2cgaWQ9ImRpYWxvZyIgbW9kYWwgb3BlbmVkPSJ7e19vcGVufX0iIHdpdGgtYmFja2Ryb3A9IltbX3VzZU5hdGl2ZUJhY2tkcm9wXV0iPgogICAgICA8aDIgaWQ9ImRpYWxvZy10aXRsZSI+W1tfdGl0bGVdXTwvaDI+CiAgICAgIDxkaXYgY2xhc3M9ImN1c3RvbS1tZXNzYWdlIj5bW19jdXN0b21NZXNzYWdlXV08L2Rpdj4KICAgIDwvcGFwZXItZGlhbG9nPgogICAgPHN0eWxlPgogICAgICAvKiogV2UgcmVseSBvbiBhIHNlcGFyYXRlIGBfaGlkZGVuYCBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRpcmVjdGx5IG1ha2luZyB1c2UKICAgICAgICAgIG9mIHRoZSBgX29wZW5gIGF0dHJpYnV0ZSBiZWNhdXNlIHRoaXMgQ1NTIHNwZWNpZmljYXRpb24gbWF5IHN0cmFuZ2VseQogICAgICAgICAgYWZmZWN0IG90aGVyIGVsZW1lbnRzIHRocm91Z2hvdXQgVGVuc29yQm9hcmQuIFNlZSAjODk5LiAqLwogICAgICAjZGFzaGJvYXJkLWJhY2tkcm9wIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAjZGlhbG9nLXRpdGxlIHsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTVweDsKICAgICAgfQoKICAgICAgLmN1c3RvbS1tZXNzYWdlIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1wcm9maWxlLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLXRvYXN0IGlkPSJ0b2FzdCIgZHVyYXRpb249IjAiIHRleHQ9IiIgYWx3YXlzLW9uLXRvcD4KICAgICAgPHBhcGVyLWJ1dHRvbiBvbmNsaWNrPSJ0b2FzdC50b2dnbGUoKSIgY2xhc3M9InllbGxvdy1idXR0b24iPkNsb3NlIG5vdyE8L3BhcGVyLWJ1dHRvbj4KICAgIDwvcGFwZXItdG9hc3Q+CiAgICA8dGYtcGx1Z2luLWRpYWxvZyBpZD0iaW5pdGlhbERpYWxvZyI+PC90Zi1wbHVnaW4tZGlhbG9nPgogICAgPHBhcGVyLWRpYWxvZyBpZD0iY2FwdHVyZVByb2ZpbGVEaWFsb2ciIG1vZGFsPgogICAgICA8cGFwZXItaW5wdXQgbGFiZWw9IlByb2ZpbGVyIFNlcnZpY2UgVVJMIG9yIFRQVSBuYW1lIiBhbHdheXMtZmxvYXQtbGFiZWwgcGxhY2Vob2xkZXI9ImxvY2FsaG9zdDo2MDA5IiB2YWx1ZT0ie3tfcHJvZmlsZXJTZXJ2aWNlQWRkcmVzc319IiBhdXRvLXZhbGlkYXRlIHJlcXVpcmVkPjwvcGFwZXItaW5wdXQ+CiAgICAgIDxsYWJlbCBpZD0icHJvZmlsZXItYWRkcmVzcy10eXBlLWxhYmVsIj5BZGRyZXNzIFR5cGU6PC9sYWJlbD4KICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIHNlbGVjdGVkPSJ7e19wcm9maWxlclNlcnZpY2VBZGRyZXNzVHlwZX19IiBhcmlhLWxhYmVsbGVkYnk9InByb2ZpbGVyLWFkZHJlc3MtdHlwZS1sYWJlbCI+CiAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJpcC1hZGRyZXNzIj5JUCBBZGRyZXNzPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJ0cHUtbmFtZSI+VFBVIE5hbWU8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgPHBhcGVyLWlucHV0IGxhYmVsPSJQcm9maWxpbmcgRHVyYXRpb24gKG1pbGxpc2Vjb25kcykiIGFsd2F5cy1mbG9hdC1sYWJlbCB0eXBlPSJudW1iZXIiIG1pbj0iMSIgbWF4PSI2MDAwMDAiIGF1dG8tdmFsaWRhdGUgcGF0dGVybj0iWzAtOV0rIiBlcnJvci1tZXNzYWdlPSJJbnB1dCBpcyBub3QgYW4gaW50ZWdlciBiZXR3ZWVuIDEgdG8gNjAwMDAwIiByZXF1aXJlZCB2YWx1ZT0ie3tfcHJvZmlsZUR1cmF0aW9ufX0iPjwvcGFwZXItaW5wdXQ+CgogICAgICA8cGFwZXItaW5wdXQgbGFiZWw9IkF1dG9tYXRpY2FsbHkgcmV0cnkgTiB0aW1lcyB3aGVuIG5vIHRyYWNlIGV2ZW50IGlzIGNvbGxlY3RlZCIgYWx3YXlzLWZsb2F0LWxhYmVsIHR5cGU9Im51bWJlciIgbWluPSIwIiBtYXg9IjEwMCIgYXV0by12YWxpZGF0ZSBwYXR0ZXJuPSJbMC05XSsiIGVycm9yLW1lc3NhZ2U9IklucHV0IGlzIG5vdCBhbiBpbnRlZ2VyIGJldHdlZW4gMCB0byAxMDAiIHJlcXVpcmVkIHZhbHVlPSJ7e19wcm9maWxlTnVtUmV0cnl9fSI+PC9wYXBlci1pbnB1dD4KCiAgICAgIDxkaXYgaGlkZGVuPSJ7eyFfc2hvdWxkU2hvd1RwdU9wdGlvbnMoX3Byb2ZpbGVyU2VydmljZUFkZHJlc3NUeXBlKX19Ij4KICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tfcHJvZmlsZUluY2x1ZGVEYXRhc2V0T3BzfX0iPlRyYWNlIGRhdGFzZXQgb3BzPC9wYXBlci1jaGVja2JveD4KICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9IlN1YnNldCBvZiB3b3JrZXIgVFBVcyB0byBwcm9maWxlIChvcHRpb25hbCkiIGFsd2F5cy1mbG9hdC1sYWJlbCBwbGFjZWhvbGRlcj0iTGlzdCBvZiBJUHMsIGUuZy4gMTAuNC4xLjIsMTAuNC4xLjMiIHZhbHVlPSJ7e19wcm9maWxlV29ya2VyTGlzdH19Ij48L3BhcGVyLWlucHV0PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iYnV0dG9ucyI+CiAgICAgICAgPHBhcGVyLWJ1dHRvbiBkaWFsb2ctY29uZmlybSByYWlzZWQgb24tdGFwPSJfY2FwdHVyZVByb2ZpbGUiIGRpc2FibGVkJD0iW1tfc2hvdWxkRGlzYWJsZUNhcHR1cmVQcm9maWxlQnV0dG9uKF9wcm9maWxlclNlcnZpY2VBZGRyZXNzLCBfcHJvZmlsZUR1cmF0aW9uLCBfcHJvZmlsZU51bVJldHJ5KV1dIj4KICAgICAgICAgIENhcHR1cmU8L3BhcGVyLWJ1dHRvbj4KICAgICAgICA8cGFwZXItYnV0dG9uIGRpYWxvZy1jb25maXJtPkNsb3NlPC9wYXBlci1idXR0b24+CiAgICAgIDwvZGl2PgogICAgPC9wYXBlci1kaWFsb2c+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzU3RhdGUoX3RvcExldmVsU3RhdGUsICdMT0FESU5HJyldXSI+CiAgICAgIDxkaXYgaWQ9InByb2dyZXNzLWJhciI+CiAgICAgICAgPGRpdiBpZD0icHJvZ3Jlc3MtbXNnIj5bW3Byb2dyZXNzLm1zZ11dPC9kaXY+CiAgICAgICAgPHBhcGVyLXByb2dyZXNzIHZhbHVlPSJbW3Byb2dyZXNzLnZhbHVlXV0iPjwvcGFwZXItcHJvZ3Jlc3M+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNTdGF0ZShfdG9wTGV2ZWxTdGF0ZSwgJ0RBVEFfTk9UX0ZPVU5EJyldXSI+CiAgICAgIDxkaXYgc3R5bGU9Im1heC13aWR0aDogNTQwcHg7IG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsiPgogICAgICAgIDxoMz5ObyBwcm9maWxlIGRhdGEgd2FzIGZvdW5kLjwvaDM+CgogICAgICAgIDxwYXBlci1idXR0b24gcmFpc2VkIG9uLXRhcD0iX29wZW5DYXB0dXJlUHJvZmlsZURpYWxvZyI+Q2FwdHVyZSBQcm9maWxlPC9wYXBlci1idXR0b24+CiAgICAgICAgPHBhcGVyLXNwaW5uZXIgY2xhc3M9ImNhcHR1cmUtc3Bpbm5lciIgYWN0aXZlPSJbW19jYXB0dXJpbmdQcm9maWxlXV0iPjwvcGFwZXItc3Bpbm5lcj4KCiAgICAgICAgPHA+CiAgICAgICAgICBJZiB5b3UgaGF2ZSBhIG1vZGVsIHJ1bm5pbmcgb24gQ1BVLCBHUFUsIG9yIEdvb2dsZSBDbG91ZCBUUFUsIHlvdSBtYXkKICAgICAgICAgIGJlIGFibGUgdG8gdXNlIHRoZSBhYm92ZSBidXR0b24gdG8gY2FwdHVyZSBhIHByb2ZpbGUuCiAgICAgICAgCgogICAgICAgIDxwPgogICAgICAgICAgSWYgeW914oCZcmUgYSBDUFUgb3IgR1BVIHVzZXIsIHBsZWFzZSB1c2UgdGhlIElQIGFkZHJlc3Mgb3B0aW9uLiBZb3UgbWF5CiAgICAgICAgICB3YW50IHRvIGNoZWNrIG91dCB0aGUKICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vY29sYWIucmVzZWFyY2guZ29vZ2xlLmNvbS9naXRodWIvdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9kb2NzL3IyL3RlbnNvcmJvYXJkX3Byb2ZpbGluZ19rZXJhcy5pcHluYiIgcmVsPSJub29wZW5lciIgdGFyZ2V0PSJfYmxhbmsiPnR1dG9yaWFsPC9hPgogICAgICAgICAgb24gaG93IHRvIHN0YXJ0IGEgVGVuc29yRmxvdyBwcm9maWxlciBzZXJ2ZXIgYW5kIHByb2ZpbGUgYSBLZXJhcyBtb2RlbAogICAgICAgICAgb24gYSBHUFUuCiAgICAgICAgCgogICAgICAgIDxwPgogICAgICAgICAgSWYgeW91J3JlIGEgVFBVIHVzZXIsIHBsZWFzZSB1c2UgdGhlIFRQVSBuYW1lIG9wdGlvbiBhbmQgeW91IG1heSB3YW50CiAgICAgICAgICB0byBjaGVjayBvdXQgdGhlCiAgICAgICAgICA8YSBocmVmPSJodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vdHB1L2RvY3MvY2xvdWQtdHB1LXRvb2xzIiByZWw9Im5vb3BlbmVyIiB0YXJnZXQ9Il9ibGFuayI+dHV0b3JpYWw8L2E+CiAgICAgICAgICBvbiBob3cgdG8gaW50ZXJwcmV0aW5nIHRoZSBwcm9maWxpbmcgcmVzdWx0cy4KICAgICAgICAKCiAgICAgICAgPHA+CiAgICAgICAgICBJZiB5b3UgdGhpbmsgcHJvZmlsaW5nIGlzIGRvbmUgcHJvcGVybHksIHBsZWFzZSBzZWUgdGhlIHBhZ2Ugb2YKICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS90cHUvZG9jcy90cm91Ymxlc2hvb3RpbmciIHJlbD0ibm9vcGVuZXIiIHRhcmdldD0iX2JsYW5rIj5Hb29nbGUgQ2xvdWQgVFBVIFRyb3VibGVzaG9vdGluZyBhbmQgRkFRPC9hPgogICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgCiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNTdGF0ZShfdG9wTGV2ZWxTdGF0ZSwgJ0FDVElWRScpXV0iPgogICAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImFsbGNvbnRyb2xzIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBvbi10YXA9Il9vcGVuQ2FwdHVyZVByb2ZpbGVEaWFsb2ciPkNhcHR1cmUgUHJvZmlsZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1zcGlubmVyIGNsYXNzPSJjYXB0dXJlLXNwaW5uZXIiIGFjdGl2ZT0iW1tfY2FwdHVyaW5nUHJvZmlsZV1dIj48L3BhcGVyLXNwaW5uZXI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICAgICAgICAgIFJ1bnMgPHNwYW4gY2xhc3M9ImNvdW50ZXIiPihbW19kYXRhc2V0cy5sZW5ndGhdXSk8L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQgbm8tYW5pbWF0aW9ucyBub2luayBob3Jpem9udGFsLWFsaWduPSJsZWZ0Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGlkPSJsaXN0X2JveF9ydW4iIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e3NlbGVjdGVkRGF0YXNldEluZGV4fX0iPgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWQ9InJ1bl9pdGVtcyIgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19kYXRhc2V0c11dIj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5bW2l0ZW0ubmFtZV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPgogICAgICAgICAgICAgICAgVG9vbHMgPHNwYW4gY2xhc3M9ImNvdW50ZXIiPihbW19hY3RpdmVUb29sc0xpc3QubGVuZ3RoXV0pPC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0IG5vLWFuaW1hdGlvbnMgbm9pbmsgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCI+CiAgICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBpZD0ibGlzdF9ib3hfdG9vbCIgc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7c2VsZWN0ZWRUb29sSW5kZXh9fSI+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZD0idG9vbF9pdGVtcyIgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19hY3RpdmVUb29sc0xpc3RdXSI+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+W1tpdGVtXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2hhc0FjdGl2ZVRvb2xzKCldXSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+Tm9uZTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICAgICAgICAgIEhvc3RzIDxzcGFuIGNsYXNzPSJjb3VudGVyIj4oW1tfYWN0aXZlSG9zdHNMaXN0Lmxlbmd0aF1dKTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdCBuby1hbmltYXRpb25zIG5vaW5rIGhvcml6b250YWwtYWxpZ249ImxlZnQiPgogICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggaWQ9Imxpc3RfYm94X2hvc3QiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e3NlbGVjdGVkSG9zdEluZGV4fX0iPgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWQ9Imhvc3RfaXRlbXMiIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfYWN0aXZlSG9zdHNMaXN0XV0iPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPltbX2dldEhvc3REaXNwbGF5TmFtZShpdGVtKV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBkZXRhaWxzLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0N1cnJlbnRUb29sKF90b29sSW5TY29wZSwgJ29wX3Byb2ZpbGUnKV1dIiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICAgICAgICAgIDx0Zi1vcC1kZXRhaWxzIGhpZGRlbj0iW1shX2FjdGl2ZU9wRGV0YWlsc11dIiBub2RlPSJbW19hY3RpdmVPcERldGFpbHNdXSI+PC90Zi1vcC1kZXRhaWxzPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0N1cnJlbnRUb29sKF90b29sSW5TY29wZSwgJ21lbW9yeV92aWV3ZXInKV1dIiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICAgICAgICAgIDxidWZmZXItZGV0YWlscyBoaWRkZW49IltbIV9hY3RpdmVCdWZmZXJEZXRhaWxzXV0iIG5vZGU9IltbX2FjdGl2ZUJ1ZmZlckRldGFpbHNdXSI+PC9idWZmZXItZGV0YWlscz4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNDdXJyZW50VG9vbChfdG9vbEluU2NvcGUsICdwb2Rfdmlld2VyJyldXSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgICAgICA8ZGV0YWlscy1jYXJkIGhpZGRlbj0iW1shX2FjdGl2ZVBvZERldGFpbHNdXSIgbm9kZXM9IltbX2FjdGl2ZVBvZERldGFpbHNdXSI+PC9kZXRhaWxzLWNhcmQ+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzQ3VycmVudFRvb2woX3Rvb2xJblNjb3BlLCAndHJhY2Vfdmlld2VyJyldXSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgIDxpZnJhbWUgaWQ9InR2X2lmcmFtZSIgaGVpZ2h0PSIxMDAlIiB3aWR0aD0iMTAwJSIgc3JjJD0iW1tfdHJhY2VEYXRhVXJsXV0iPgogICAgICAgICAgICA8L2lmcmFtZT4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzQ3VycmVudFRvb2woX3Rvb2xJblNjb3BlLCAnb3BfcHJvZmlsZScpXV0iIHJlc3RhbXA9InRydWUiPgogICAgICAgICAgICA8dGYtb3AtcHJvZmlsZSBfZGF0YT0iW1tfb3BQcm9maWxlRGF0YV1dIiBhY3RpdmU9Int7X2FjdGl2ZU9wRGV0YWlsc319Ij48L3RmLW9wLXByb2ZpbGU+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0N1cnJlbnRUb29sKF90b29sSW5TY29wZSwgJ2lucHV0X3BpcGVsaW5lX2FuYWx5emVyJyldXSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgIDxpbnB1dC1waXBlbGluZS1hbmFseXplciBfZGF0YT0iW1tfaW5wdXRQaXBlbGluZURhdGFdXSI+PC9pbnB1dC1waXBlbGluZS1hbmFseXplcj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzQ3VycmVudFRvb2woX3Rvb2xJblNjb3BlLCAnb3ZlcnZpZXdfcGFnZScpXV0iIHJlc3RhbXA9InRydWUiPgogICAgICAgICAgICA8b3ZlcnZpZXctcGFnZSBfZGF0YT0iW1tfb3ZlcnZpZXdQYWdlRGF0YV1dIj48L292ZXJ2aWV3LXBhZ2U+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0N1cnJlbnRUb29sKF90b29sSW5TY29wZSwgJ3BvZF92aWV3ZXInKV1dIiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICAgICAgPHBvZC12aWV3ZXItZGFzaGJvYXJkIGRhdGE9IltbX3BvZFZpZXdlckRhdGFdXSIgYWN0aXZlLWRldGFpbHM9Int7X2FjdGl2ZVBvZERldGFpbHN9fSI+PC9wb2Qtdmlld2VyLWRhc2hib2FyZD4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzQ3VycmVudFRvb2woX3Rvb2xJblNjb3BlLCAnbWVtb3J5X3ZpZXdlcicpXV0iIHJlc3RhbXA9InRydWUiPgogICAgICAgICAgICA8bWVtb3J5LXZpZXdlci1kYXNoYm9hcmQgX2RhdGE9IltbX21lbW9yeVZpZXdlckRhdGFdXSIgYWN0aXZlPSJ7e19hY3RpdmVCdWZmZXJEZXRhaWxzfX0iPjwvbWVtb3J5LXZpZXdlci1kYXNoYm9hcmQ+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0N1cnJlbnRUb29sKF90b29sSW5TY29wZSwgJ2dvb2dsZV9jaGFydF9kZW1vJyldXSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgIDxnb29nbGUtY2hhcnQtZGVtbyBfZGF0YT0iW1tfZ29vZ2xlQ2hhcnREZW1vRGF0YV1dIj48L2dvb2dsZS1jaGFydC1kZW1vPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CgogICAgPHN0eWxlPgogICAgICAuY2VudGVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIGlmcmFtZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CiAgICAgICNwcm9ncmVzcy1iYXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDQwcHg7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KICAgICAgI3Byb2dyZXNzLW1zZyB7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgfQogICAgICBwYXBlci1wcm9ncmVzcyB7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtaGVpZ2h0OiA2cHg7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1hY3RpdmUtY29sb3I6ICNmMzkxM2U7CiAgICAgIH0KICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLmRldGFpbHMtY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiA1cHg7CiAgICAgIH0KICAgICAgdGYtb3AtZGV0YWlscywKICAgICAgYnVmZmVyLWRldGFpbHMsCiAgICAgIGRldGFpbHMtY2FyZCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQogICAgICAueWVsbG93LWJ1dHRvbiB7CiAgICAgICAgY29sb3I6ICNlZWZmNDE7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgIH0KICAgICAgLmNhcHR1cmUtc3Bpbm5lciB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiA1cHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1iZWhvbGRlci12aWRlbyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0iY29udGFpbmVyIj4KICAgICAgPGltZyBpZD0idmlkZW8iIHNyYyQ9IltbX2ltYWdlVVJMXV0iPgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICBpbWcgewogICAgICAgIGltYWdlLXJlbmRlcmluZzogcGl4ZWxhdGVkOwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWJlaG9sZGVyLWluZm8iPgogIDx0ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2l0ZW1zXV0iPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWluZm8iIHN0eWxlJD0iaGVpZ2h0OiBbW2l0ZW0uaGVpZ2h0XV1weCI+CiAgICAgICAgPHVsPgogICAgICAgICAgPGxpPltbaXRlbS5uYW1lXV08L2xpPgogICAgICAgICAgPGxpPnNoYXBlOiBbW2l0ZW0uc2hhcGVdXTwvbGk+CiAgICAgICAgICA8bGk+cmFuZ2U6IFsgW1tpdGVtLm1pbl1dLCBbW2l0ZW0ubWF4XV0gXTwvbGk+CiAgICAgICAgICA8bGk+bWVhbjogW1tpdGVtLm1lYW5dXTwvbGk+CiAgICAgICAgPC91bD4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgoKICAgIDxzdHlsZT4KICAgICAgLnNlY3Rpb24taW5mbyB7CiAgICAgICAgbWFyZ2luOiAwIDAgNXB4IDA7CiAgICAgIH0KICAgICAgLnNlY3Rpb24taW5mbyB1bCB7CiAgICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtYmVob2xkZXItZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtcGx1Z2luLWRpYWxvZyBpZD0iaW5pdGlhbERpYWxvZyI+PC90Zi1wbHVnaW4tZGlhbG9nPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8cCBjbGFzcz0iY29udHJvbHMtZGlzYWJsZWQtbWVzc2FnZSI+CiAgICAgICAgICAgICAgQ29udHJvbHMgZGlzYWJsZWQ6IGRpcmVjdG9yeSBpcyBub3Qgd3JpdGVhYmxlLgogICAgICAgICAgICAKICAgICAgICAgICAgPHAgY2xhc3M9ImRpc2NsYWltZXIiPgogICAgICAgICAgICAgIEJlaG9sZGVyIHJlcXVpcmVzIHdyaXRlIGFjY2VzcyB0byB0aGUgbG9nIGRpcmVjdG9yeSBpbiBvcmRlciB0bwogICAgICAgICAgICAgIGNvbW11bmljYXRlIHZpc3VhbGl6YXRpb24gY2hhbmdlcyB0byB0aGUgPGNvZGU+QmVob2xkZXI8L2NvZGU+CiAgICAgICAgICAgICAgaW5zdGFuY2UgaW4geW91ciBtb2RlbC4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8aDM+VmFsdWVzPC9oMz4KICAgICAgICAgIDxwYXBlci1yYWRpby1ncm91cCBpZD0idmFsdWVzU2VsZWN0b3IiIHNlbGVjdGVkPSJ7e192YWx1ZXN9fSI+CiAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0idHJhaW5hYmxlX3ZhcmlhYmxlcyIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgIDxwcmU+dGYudHJhaW5hYmxlX3ZhcmlhYmxlcygpPC9wcmU+CiAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJvcHRpb24tYXJyYXlzIiBuYW1lPSJhcnJheXMiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICA8cHJlPmIudXBkYXRlKGFycmF5cz1bTlBfQVJSQVlTXSk8L3ByZT4KICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9Im9wdGlvbi1mcmFtZXMiIG5hbWU9ImZyYW1lcyIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgIDxwcmU+Yi51cGRhdGUoZnJhbWU9TlBfQVJSQVkpPC9wcmU+CiAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3ZhbHVlc05vdEZyYW1lKF92YWx1ZXMpXV0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tfc2hvd0FsbH19IiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+U2hvdyBhbGwgZGF0YSA8aT4oY2FuIGJlIHJlc291cmNlIGludGVuc2l2ZSk8L2k+PC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdmFsdWVzTm90RnJhbWUoX3ZhbHVlcyldXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8aDM+TW9kZTwvaDM+CiAgICAgICAgICAgIDxwYXBlci1yYWRpby1ncm91cCBpZD0ibW9kZVNlbGVjdG9yIiBzZWxlY3RlZD0ie3tfbW9kZX19Ij4KICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9ImN1cnJlbnQiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICAgIGN1cnJlbnQgdmFsdWVzCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJ2YXJpYW5jZSIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgICAgdmFyaWFuY2Ugb3ZlciB0cmFpbiBzdGVwcwogICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3ZhcmlhbmNlU2VsZWN0ZWQoX21vZGUpXV0iPgogICAgICAgICAgICAgIDxoND5WYXJpYW5jZSB0aW1lc3RlcHM6IHt7X3dpbmRvd1NpemV9fTwvaDQ+CiAgICAgICAgICAgICAgPHBhcGVyLXNsaWRlciBpZD0id2luZG93U2xpZGVyIiB2YWx1ZT0ie3tfd2luZG93U2l6ZX19IiB0eXBlPSJudW1iZXIiIHN0ZXA9IjEiIG1pbj0iMiIgbWF4PSIyMCIgcGluPSJ0cnVlIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgPC9wYXBlci1zbGlkZXI+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8aDM+SW1hZ2Ugc2NhbGluZzwvaDM+CiAgICAgICAgICAgIDxwYXBlci1yYWRpby1ncm91cCBpZD0ic2NhbGluZ1NlbGVjdG9yIiBzZWxlY3RlZD0ie3tfc2NhbGluZ319Ij4KICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJvcHRpb24tbGF5ZXIiIG5hbWU9ImxheWVyIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgICBwZXIgc2VjdGlvbgogICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGZvcj0ib3B0aW9uLWxheWVyIiBwb3NpdGlvbj0icmlnaHQiPgogICAgICAgICAgICAgICAgQmxhY2sgaXMgdGhlIGxvd2VzdCB2YWx1ZSBpbiB0aGF0IHNlY3Rpb24sIHdoaXRlIGlzIHRoYXQgbGFyZ2VzdAogICAgICAgICAgICAgICAgdmFsdWUgaW4gdGhhdCBzZWN0aW9uLgogICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KCiAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ib3B0aW9uLW5ldHdvcmsiIG5hbWU9Im5ldHdvcmsiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICAgIGFsbCBzZWN0aW9ucwogICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGZvcj0ib3B0aW9uLW5ldHdvcmsiIHBvc2l0aW9uPSJyaWdodCI+CiAgICAgICAgICAgICAgICBCbGFjayBpcyB0aGUgc21hbGxlc3QgdmFsdWUgaW4gYWxsIHNlY3Rpb25zLCB3aGl0ZSBpcyB0aGUKICAgICAgICAgICAgICAgIGxhcmdlc3QgdmFsdWUgaW4gYWxsIHNlY3Rpb25zLgogICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KCiAgICAgICAgICAgIDxkaXYgaWQ9ImNvbG9ybWFwLXNlbGVjdGlvbiI+CiAgICAgICAgICAgICAgPGRpdiBpZD0iY29sb3JtYXAtc2VsZWN0aW9uLWxhYmVsIj5Db2xvcm1hcDo8L2Rpdj4KICAgICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdCBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19jb2xvcm1hcH19IiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0iMCI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPm1hZ21hPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5pbmZlcm5vPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5wbGFzbWE8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPnZpcmlkaXM8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmdyYXlzY2FsZTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxoMz5VcGRhdGVzIHBlciBzZWNvbmQ6IHt7X0ZQU319PC9oMz4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9IkZQU1NsaWRlciIgdmFsdWU9Int7X0ZQU319IiB0eXBlPSJudW1iZXIiIHN0ZXA9IjEiIG1pbj0iMCIgbWF4PSIzMCIgcGluPSJ0cnVlIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICA8L3BhcGVyLXNsaWRlcj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gY2xhc3M9IngtYnV0dG9uIiBpZD0icmVjb3JkX2J1dHRvbiIgb24tdGFwPSJfdG9nZ2xlUmVjb3JkIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgW1tfcmVjb3JkVGV4dF1dCiAgICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8cCBjbGFzcz0iZGlzY2xhaW1lciI+CiAgICAgICAgICAgIE5vdGU6IEJlaG9sZGVyIGN1cnJlbnRseSBvbmx5IHdvcmtzIHdlbGwgb24gbG9jYWwgZmlsZSBzeXN0ZW1zLgogICAgICAgICAgCiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaXNfYWN0aXZlXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIEJlaG9sZGVyIGRhdGEgd2FzIGZvdW5kLjwvaDM+CgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91ciBzY3JpcHQgaXNuJ3QgcnVubmluZy48L2xpPgogICAgICAgICAgICAgIDxsaT5Zb3UgYXJlbid0IGNhbGxpbmcgPGNvZGU+YmVob2xkZXIudXBkYXRlKCk8L2NvZGU+LjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBUbyB1c2UgQmVob2xkZXIsIGltcG9ydCBhbmQgaW5zdGFudGlhdGUgdGhlCiAgICAgICAgICAgICAgPGNvZGU+QmVob2xkZXI8L2NvZGU+IGNsYXNzLCBhbmQgY2FsbCBpdHMKICAgICAgICAgICAgICA8Y29kZT51cGRhdGU8L2NvZGU+IG1ldGhvZCB3aXRoIGEgPGNvZGU+U2Vzc2lvbjwvY29kZT4gYXJndW1lbnQKICAgICAgICAgICAgICBhZnRlciBldmVyeSB0cmFpbiBzdGVwOgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwcmU+ZnJvbSB0ZW5zb3Jib2FyZC5wbHVnaW5zLmJlaG9sZGVyIGltcG9ydCBCZWhvbGRlcgpiZWhvbGRlciA9IEJlaG9sZGVyKExPR19ESVJFQ1RPUlkpCgojIGluc2lkZSB0cmFpbiBsb29wCmJlaG9sZGVyLnVwZGF0ZSgKICBzZXNzaW9uPXNlc3MsCiAgYXJyYXlzPWxpc3Rfb2ZfbnBfYXJyYXlzLCAgIyBvcHRpb25hbCBhcmd1bWVudAogIGZyYW1lPXR3b19kaW1lbnNpb25hbF9ucF9hcnJheSwgICMgb3B0aW9uYWwgYXJndW1lbnQKKTwvcHJlPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB1c2luZyA8Y29kZT50Zi50cmFpbi5Nb25pdG9yZWRTZXNzaW9uPC9jb2RlPiwgeW91IGNhbiB1c2UKICAgICAgICAgICAgICA8Y29kZT5CZWhvbGRlckhvb2s8L2NvZGU+OgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwcmU+ZnJvbSB0ZW5zb3Jib2FyZC5wbHVnaW5zLmJlaG9sZGVyIGltcG9ydCBCZWhvbGRlckhvb2sKYmVob2xkZXJfaG9vayA9IEJlaG9sZGVySG9vayhMT0dfRElSRUNUT1JZKQp3aXRoIE1vbml0b3JlZFNlc3Npb24oLi4uLCBob29rcz1bYmVob2xkZXJfaG9va10pIGFzIHNlc3M6CiAgc2Vzcy5ydW4odHJhaW5fb3ApPC9wcmU+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgZXZlcnl0aGluZyBpcyBzZXQgdXAgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci90ZW5zb3Jib2FyZC9wbHVnaW5zL2JlaG9sZGVyL1JFQURNRS5tZCI+dGhlIFJFQURNRTwvYT4KICAgICAgICAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cCBjbGFzcz0iZGlzY2xhaW1lciI+CiAgICAgICAgICAgICAgTm90ZTogQmVob2xkZXIgY3VycmVudGx5IG9ubHkgd29ya3Mgd2VsbCBvbiBsb2NhbCBmaWxlIHN5c3RlbXMuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc19hY3RpdmVdXSI+CiAgICAgICAgICA8dGYtYmVob2xkZXItdmlkZW8gaWQ9InZpZGVvIiBmcHM9IltbX0ZQU11dIj48L3RmLWJlaG9sZGVyLXZpZGVvPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdmFsdWVzTm90RnJhbWUoX3ZhbHVlcyldXSI+CiAgICAgICAgICAgIDx0Zi1iZWhvbGRlci1pbmZvIGlkPSJpbmZvIiBmcHM9IltbX0ZQU11dIj4gPC90Zi1iZWhvbGRlci1pbmZvPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5jZW50ZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMDsKICAgICAgfQoKICAgICAgcGFwZXItY2hlY2tib3ggewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItcmFkaW8tYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIHBhZGRpbmc6IDVweDsKCiAgICAgICAgLS1wYXBlci1yYWRpby1idXR0b24tcmFkaW8tY29udGFpbmVyOiB7CiAgICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB9CgogICAgICAgIC0tcGFwZXItcmFkaW8tYnV0dG9uLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgfQogICAgICB9CgogICAgICBwYXBlci1yYWRpby1ncm91cCB7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICBmbGV4LWdyb3c6IDI7CiAgICAgIH0KCiAgICAgIHByZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lOwogICAgICB9CgogICAgICBwYXBlci1idXR0b24jcmVjb3JkX2J1dHRvbiB7CiAgICAgICAgY29sb3I6ICNkMzJmMmY7CiAgICAgIH0KCiAgICAgIHBhcGVyLWJ1dHRvbiNyZWNvcmRfYnV0dG9uLmlzLXJlY29yZGluZyB7CiAgICAgICAgYmFja2dyb3VuZDogI2QzMmYyZjsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24uYmVob2xkZXItZGFzaGJvYXJkOmxhc3QtY2hpbGQgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQoKICAgICAgI2NvbG9ybWFwLXNlbGVjdGlvbiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KCiAgICAgICNjb2xvcm1hcC1zZWxlY3Rpb24tbGFiZWwgewogICAgICAgIG1hcmdpbi10b3A6IDEzcHg7CiAgICAgIH0KCiAgICAgICNjb2xvcm1hcC1zZWxlY3Rpb24gcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIHdpZHRoOiAxMDVweDsKICAgICAgfQoKICAgICAgaDQgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIG1hcmdpbjogNXB4IDA7CiAgICAgIH0KCiAgICAgIHAuZGlzY2xhaW1lciB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICB9CgogICAgICBwLmNvbnRyb2xzLWRpc2FibGVkLW1lc3NhZ2UgewogICAgICAgIGNvbG9yOiAjYzAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CgogICAgICAuc2lkZWJhciB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGlyb24taWNvbnNldC1zdmcgbmFtZT0iYXYiIHNpemU9IjI0Ij4KPHN2Zz48ZGVmcz4KPGcgaWQ9ImFkZC10by1xdWV1ZSI+PHBhdGggZD0iTTIxIDNIM2MtMS4xMSAwLTIgLjg5LTIgMnYxMmMwIDEuMS44OSAyIDIgMmg1djJoOHYtMmg1YzEuMSAwIDEuOTktLjkgMS45OS0yTDIzIDVjMC0xLjExLS45LTItMi0yem0wIDE0SDNWNWgxOHYxMnptLTUtN3YyaC0zdjNoLTJ2LTNIOHYtMmgzVjdoMnYzaDN6IiAvPjwvZz4KPGcgaWQ9ImFpcnBsYXkiPjxwYXRoIGQ9Ik02IDIyaDEybC02LTZ6TTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmg0di0ySDNWNWgxOHYxMmgtNHYyaDRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0iYWxidW0iPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE0LjVjLTIuNDkgMC00LjUtMi4wMS00LjUtNC41UzkuNTEgNy41IDEyIDcuNXM0LjUgMi4wMSA0LjUgNC41LTIuMDEgNC41LTQuNSA0LjV6bTAtNS41Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6IiAvPjwvZz4KPGcgaWQ9ImFydC10cmFjayI+PHBhdGggZD0iTTIyIDEzaC04di0yaDh2MnptMC02aC04djJoOFY3em0tOCAxMGg4di0yaC04djJ6bS0yLTh2NmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY5YzAtMS4xLjktMiAyLTJoNmMxLjEgMCAyIC45IDIgMnptLTEuNSA2bC0yLjI1LTMtMS43NSAyLjI2LTEuMjUtMS41MUwzLjUgMTVoN3oiIC8+PC9nPgo8ZyBpZD0iYXYtdGltZXIiPjxwYXRoIGQ9Ik0xMSAxN2MwIC41NS40NSAxIDEgMXMxLS40NSAxLTEtLjQ1LTEtMS0xLTEgLjQ1LTEgMXptMC0xNHY0aDJWNS4wOGMzLjM5LjQ5IDYgMy4zOSA2IDYuOTIgMCAzLjg3LTMuMTMgNy03IDdzLTctMy4xMy03LTdjMC0xLjY4LjU5LTMuMjIgMS41OC00LjQyTDEyIDEzbDEuNDEtMS40MS02LjgtNi44di4wMkM0LjQyIDYuNDUgMyA5LjA1IDMgMTJjMCA0Ljk3IDQuMDIgOSA5IDkgNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTloLTF6bTcgOWMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMSAuNDUgMSAxIDEgMS0uNDUgMS0xek02IDEyYzAgLjU1LjQ1IDEgMSAxczEtLjQ1IDEtMS0uNDUtMS0xLTEtMSAuNDUtMSAxeiIgLz48L2c+CjxnIGlkPSJicmFuZGluZy13YXRlcm1hcmsiPjxwYXRoIGQ9Ik0yMSAzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNmgtOXYtNmg5djZ6IiAvPjwvZz4KPGcgaWQ9ImNhbGwtdG8tYWN0aW9uIj48cGF0aCBkPSJNMjEgM0gzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTZIM3YtM2gxOHYzeiIgLz48L2c+CjxnIGlkPSJjbG9zZWQtY2FwdGlvbiI+PHBhdGggZD0iTTE5IDRINWMtMS4xMSAwLTIgLjktMiAydjEyYzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bS04IDdIOS41di0uNWgtMnYzaDJWMTNIMTF2MWMwIC41NS0uNDUgMS0xIDFIN2MtLjU1IDAtMS0uNDUtMS0xdi00YzAtLjU1LjQ1LTEgMS0xaDNjLjU1IDAgMSAuNDUgMSAxdjF6bTcgMGgtMS41di0uNWgtMnYzaDJWMTNIMTh2MWMwIC41NS0uNDUgMS0xIDFoLTNjLS41NSAwLTEtLjQ1LTEtMXYtNGMwLS41NS40NS0xIDEtMWgzYy41NSAwIDEgLjQ1IDEgMXYxeiIgLz48L2c+CjxnIGlkPSJlcXVhbGl6ZXIiPjxwYXRoIGQ9Ik0xMCAyMGg0VjRoLTR2MTZ6bS02IDBoNHYtOEg0djh6TTE2IDl2MTFoNFY5aC00eiIgLz48L2c+CjxnIGlkPSJleHBsaWNpdCI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNCA2aC00djJoNHYyaC00djJoNHYySDlWN2g2djJ6IiAvPjwvZz4KPGcgaWQ9ImZhc3QtZm9yd2FyZCI+PHBhdGggZD0iTTQgMThsOC41LTZMNCA2djEyem05LTEydjEybDguNS02TDEzIDZ6IiAvPjwvZz4KPGcgaWQ9ImZhc3QtcmV3aW5kIj48cGF0aCBkPSJNMTEgMThWNmwtOC41IDYgOC41IDZ6bS41LTZsOC41IDZWNmwtOC41IDZ6IiAvPjwvZz4KPGcgaWQ9ImZlYXR1cmVkLXBsYXktbGlzdCI+PHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tOSA4SDNWOWg5djJ6bTAtNEgzVjVoOXYyeiIgLz48L2c+CjxnIGlkPSJmZWF0dXJlZC12aWRlbyI+PHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tOSA5SDNWNWg5djd6IiAvPjwvZz4KPGcgaWQ9ImZpYmVyLWR2ciI+PHBhdGggZD0iTTE3LjUgMTAuNWgydjFoLTJ6bS0xMyAwaDJ2M2gtMnpNMjEgM0gzYy0xLjExIDAtMiAuODktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE4YzEuMTEgMCAyLS45IDItMlY1YzAtMS4xMS0uODktMi0yLTJ6TTggMTMuNWMwIC44NS0uNjUgMS41LTEuNSAxLjVIM1Y5aDMuNWMuODUgMCAxLjUuNjUgMS41IDEuNXYzem00LjYyIDEuNWgtMS41TDkuMzcgOWgxLjVsMSAzLjQzIDEtMy40M2gxLjVsLTEuNzUgNnpNMjEgMTEuNWMwIC42LS40IDEuMTUtLjkgMS40TDIxIDE1aC0xLjVsLS44NS0ySDE3LjV2MkgxNlY5aDMuNWMuODUgMCAxLjUuNjUgMS41IDEuNXYxeiIgLz48L2c+CjxnIGlkPSJmaWJlci1tYW51YWwtcmVjb3JkIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI4IiAvPjwvZz4KPGcgaWQ9ImZpYmVyLW5ldyI+PHBhdGggZD0iTTIwIDRINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMThjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWNmMwLTEuMTEtLjg5LTItMi0yek04LjUgMTVINy4zbC0yLjU1LTMuNVYxNUgzLjVWOWgxLjI1bDIuNSAzLjVWOUg4LjV2NnptNS00Ljc0SDExdjEuMTJoMi41djEuMjZIMTF2MS4xMWgyLjVWMTVoLTRWOWg0djEuMjZ6bTcgMy43NGMwIC41NS0uNDUgMS0xIDFoLTRjLS41NSAwLTEtLjQ1LTEtMVY5aDEuMjV2NC41MWgxLjEzVjkuOTloMS4yNXYzLjUxaDEuMTJWOWgxLjI1djV6IiAvPjwvZz4KPGcgaWQ9ImZpYmVyLXBpbiI+PHBhdGggZD0iTTUuNSAxMC41aDJ2MWgtMnpNMjAgNEg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY2YzAtMS4xMS0uODktMi0yLTJ6TTkgMTEuNWMwIC44NS0uNjUgMS41LTEuNSAxLjVoLTJ2Mkg0VjloMy41Yy44NSAwIDEuNS42NSAxLjUgMS41djF6bTMuNSAzLjVIMTFWOWgxLjV2NnptNy41IDBoLTEuMmwtMi41NS0zLjVWMTVIMTVWOWgxLjI1bDIuNSAzLjVWOUgyMHY2eiIgLz48L2c+CjxnIGlkPSJmaWJlci1zbWFydC1yZWNvcmQiPjxnPjxjaXJjbGUgY3g9IjkiIGN5PSIxMiIgcj0iOCIgLz48cGF0aCBkPSJNMTcgNC4yNnYyLjA5YzIuMzMuODIgNCAzLjA0IDQgNS42NXMtMS42NyA0LjgzLTQgNS42NXYyLjA5YzMuNDUtLjg5IDYtNC4wMSA2LTcuNzRzLTIuNTUtNi44NS02LTcuNzR6IiAvPjwvZz48L2c+CjxnIGlkPSJmb3J3YXJkLTEwIj48cGF0aCBkPSJNNCAxM2MwIDQuNCAzLjYgOCA4IDhzOC0zLjYgOC04aC0yYzAgMy4zLTIuNyA2LTYgNnMtNi0yLjctNi02IDIuNy02IDYtNnY0bDUtNS01LTV2NGMtNC40IDAtOCAzLjYtOCA4em02LjggM0gxMHYtMy4zTDkgMTN2LS43bDEuOC0uNmguMVYxNnptNC4zLTEuOGMwIC4zIDAgLjYtLjEuOGwtLjMuNnMtLjMuMy0uNS4zLS40LjEtLjYuMS0uNCAwLS42LS4xLS4zLS4yLS41LS4zLS4yLS4zLS4zLS42LS4xLS41LS4xLS44di0uN2MwLS4zIDAtLjYuMS0uOGwuMy0uNnMuMy0uMy41LS4zLjQtLjEuNi0uMS40IDAgLjYuMS4zLjIuNS4zLjIuMy4zLjYuMS41LjEuOHYuN3ptLS44LS44di0uNXMtLjEtLjItLjEtLjMtLjEtLjEtLjItLjItLjItLjEtLjMtLjEtLjIgMC0uMy4xbC0uMi4ycy0uMS4yLS4xLjN2MnMuMS4yLjEuMy4xLjEuMi4yLjIuMS4zLjEuMiAwIC4zLS4xbC4yLS4ycy4xLS4yLjEtLjN2LTEuNXoiIC8+PC9nPgo8ZyBpZD0iZm9yd2FyZC0zMCI+PHBhdGggZD0iTTkuNiAxMy41aC40Yy4yIDAgLjQtLjEuNS0uMnMuMi0uMi4yLS40di0uMnMtLjEtLjEtLjEtLjItLjEtLjEtLjItLjFoLS41cy0uMS4xLS4yLjEtLjEuMS0uMS4ydi4yaC0xYzAtLjIgMC0uMy4xLS41cy4yLS4zLjMtLjQuMy0uMi40LS4yLjQtLjEuNS0uMWMuMiAwIC40IDAgLjYuMXMuMy4xLjUuMi4yLjIuMy40LjEuMy4xLjV2LjNzLS4xLjItLjEuMy0uMS4yLS4yLjItLjIuMS0uMy4yYy4yLjEuNC4yLjUuNHMuMi40LjIuNmMwIC4yIDAgLjQtLjEuNXMtLjIuMy0uMy40LS4zLjItLjUuMi0uNC4xLS42LjFjLS4yIDAtLjQgMC0uNS0uMXMtLjMtLjEtLjUtLjItLjItLjItLjMtLjQtLjEtLjQtLjEtLjZoLjh2LjJzLjEuMS4xLjIuMS4xLjIuMWguNXMuMS0uMS4yLS4xLjEtLjEuMS0uMnYtLjVzLS4xLS4xLS4xLS4yLS4xLS4xLS4yLS4xaC0uNnYtLjd6bTUuNy43YzAgLjMgMCAuNi0uMS44bC0uMy42cy0uMy4zLS41LjMtLjQuMS0uNi4xLS40IDAtLjYtLjEtLjMtLjItLjUtLjMtLjItLjMtLjMtLjYtLjEtLjUtLjEtLjh2LS43YzAtLjMgMC0uNi4xLS44bC4zLS42cy4zLS4zLjUtLjMuNC0uMS42LS4xLjQgMCAuNi4xLjMuMi41LjMuMi4zLjMuNi4xLjUuMS44di43em0tLjktLjh2LS41cy0uMS0uMi0uMS0uMy0uMS0uMS0uMi0uMi0uMi0uMS0uMy0uMS0uMiAwLS4zLjFsLS4yLjJzLS4xLjItLjEuM3Yycy4xLjIuMS4zLjEuMS4yLjIuMi4xLjMuMS4yIDAgLjMtLjFsLjItLjJzLjEtLjIuMS0uM3YtMS41ek00IDEzYzAgNC40IDMuNiA4IDggOHM4LTMuNiA4LThoLTJjMCAzLjMtMi43IDYtNiA2cy02LTIuNy02LTYgMi43LTYgNi02djRsNS01LTUtNXY0Yy00LjQgMC04IDMuNi04IDh6IiAvPjwvZz4KPGcgaWQ9ImZvcndhcmQtNSI+PHBhdGggZD0iTTQgMTNjMCA0LjQgMy42IDggOCA4czgtMy42IDgtOGgtMmMwIDMuMy0yLjcgNi02IDZzLTYtMi43LTYtNiAyLjctNiA2LTZ2NGw1LTUtNS01djRjLTQuNCAwLTggMy42LTggOHptNi43LjlsLjItMi4yaDIuNHYuN2gtMS43bC0uMS45cy4xIDAgLjEtLjEuMSAwIC4xLS4xLjEgMCAuMiAwaC4yYy4yIDAgLjQgMCAuNS4xcy4zLjIuNC4zLjIuMy4zLjUuMS40LjEuNmMwIC4yIDAgLjQtLjEuNXMtLjEuMy0uMy41LS4zLjItLjUuMy0uNC4xLS42LjFjLS4yIDAtLjQgMC0uNS0uMXMtLjMtLjEtLjUtLjItLjItLjItLjMtLjQtLjEtLjMtLjEtLjVoLjhjMCAuMi4xLjMuMi40cy4yLjEuNC4xYy4xIDAgLjIgMCAuMy0uMWwuMi0uMnMuMS0uMi4xLS4zdi0uNmwtLjEtLjItLjItLjJzLS4yLS4xLS4zLS4xaC0uMnMtLjEgMC0uMi4xLS4xIDAtLjEuMS0uMS4xLS4xLjFoLS42eiIgLz48L2c+CjxnIGlkPSJnYW1lcyI+PHBhdGggZD0iTTE1IDcuNVYySDl2NS41bDMgMyAzLTN6TTcuNSA5SDJ2Nmg1LjVsMy0zLTMtM3pNOSAxNi41VjIyaDZ2LTUuNWwtMy0zLTMgM3pNMTYuNSA5bC0zIDMgMyAzSDIyVjloLTUuNXoiIC8+PC9nPgo8ZyBpZD0iaGQiPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tOCAxMkg5LjV2LTJoLTJ2Mkg2VjloMS41djIuNWgyVjlIMTF2NnptMi02aDRjLjU1IDAgMSAuNDUgMSAxdjRjMCAuNTUtLjQ1IDEtMSAxaC00Vjl6bTEuNSA0LjVoMnYtM2gtMnYzeiIgLz48L2c+CjxnIGlkPSJoZWFyaW5nIj48cGF0aCBkPSJNMTcgMjBjLS4yOSAwLS41Ni0uMDYtLjc2LS4xNS0uNzEtLjM3LTEuMjEtLjg4LTEuNzEtMi4zOC0uNTEtMS41Ni0xLjQ3LTIuMjktMi4zOS0zLS43OS0uNjEtMS42MS0xLjI0LTIuMzItMi41M0M5LjI5IDEwLjk4IDkgOS45MyA5IDljMC0yLjggMi4yLTUgNS01czUgMi4yIDUgNWgyYzAtMy45My0zLjA3LTctNy03UzcgNS4wNyA3IDljMCAxLjI2LjM4IDIuNjUgMS4wNyAzLjkuOTEgMS42NSAxLjk4IDIuNDggMi44NSAzLjE1LjgxLjYyIDEuMzkgMS4wNyAxLjcxIDIuMDUuNiAxLjgyIDEuMzcgMi44NCAyLjczIDMuNTUuNTEuMjMgMS4wNy4zNSAxLjY0LjM1IDIuMjEgMCA0LTEuNzkgNC00aC0yYzAgMS4xLS45IDItMiAyek03LjY0IDIuNjRMNi4yMiAxLjIyQzQuMjMgMy4yMSAzIDUuOTYgMyA5czEuMjMgNS43OSAzLjIyIDcuNzhsMS40MS0xLjQxQzYuMDEgMTMuNzQgNSAxMS40OSA1IDlzMS4wMS00Ljc0IDIuNjQtNi4zNnpNMTEuNSA5YzAgMS4zOCAxLjEyIDIuNSAyLjUgMi41czIuNS0xLjEyIDIuNS0yLjUtMS4xMi0yLjUtMi41LTIuNS0yLjUgMS4xMi0yLjUgMi41eiIgLz48L2c+CjxnIGlkPSJoaWdoLXF1YWxpdHkiPjxwYXRoIGQ9Ik0xOSA0SDVjLTEuMTEgMC0yIC45LTIgMnYxMmMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0tOCAxMUg5LjV2LTJoLTJ2Mkg2VjloMS41djIuNWgyVjlIMTF2NnptNy0xYzAgLjU1LS40NSAxLTEgMWgtLjc1djEuNWgtMS41VjE1SDE0Yy0uNTUgMC0xLS40NS0xLTF2LTRjMC0uNTUuNDUtMSAxLTFoM2MuNTUgMCAxIC40NSAxIDF2NHptLTMuNS0uNWgydi0zaC0ydjN6IiAvPjwvZz4KPGcgaWQ9ImxpYnJhcnktYWRkIj48cGF0aCBkPSJNNCA2SDJ2MTRjMCAxLjEuOSAyIDIgMmgxNHYtMkg0VjZ6bTE2LTRIOGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tMSA5aC00djRoLTJ2LTRIOVY5aDRWNWgydjRoNHYyeiIgLz48L2c+CjxnIGlkPSJsaWJyYXJ5LWJvb2tzIj48cGF0aCBkPSJNNCA2SDJ2MTRjMCAxLjEuOSAyIDIgMmgxNHYtMkg0VjZ6bTE2LTRIOGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tMSA5SDlWOWgxMHYyem0tNCA0SDl2LTJoNnYyem00LThIOVY1aDEwdjJ6IiAvPjwvZz4KPGcgaWQ9ImxpYnJhcnktbXVzaWMiPjxwYXRoIGQ9Ik0yMCAySDhjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTIgNWgtM3Y1LjVjMCAxLjM4LTEuMTIgMi41LTIuNSAyLjVTMTAgMTMuODggMTAgMTIuNXMxLjEyLTIuNSAyLjUtMi41Yy41NyAwIDEuMDguMTkgMS41LjUxVjVoNHYyek00IDZIMnYxNGMwIDEuMS45IDIgMiAyaDE0di0ySDRWNnoiIC8+PC9nPgo8ZyBpZD0ibG9vcCI+PHBhdGggZD0iTTEyIDRWMUw4IDVsNCA0VjZjMy4zMSAwIDYgMi42OSA2IDYgMCAxLjAxLS4yNSAxLjk3LS43IDIuOGwxLjQ2IDEuNDZDMTkuNTQgMTUuMDMgMjAgMTMuNTcgMjAgMTJjMC00LjQyLTMuNTgtOC04LTh6bTAgMTRjLTMuMzEgMC02LTIuNjktNi02IDAtMS4wMS4yNS0xLjk3LjctMi44TDUuMjQgNy43NEM0LjQ2IDguOTcgNCAxMC40MyA0IDEyYzAgNC40MiAzLjU4IDggOCA4djNsNC00LTQtNHYzeiIgLz48L2c+CjxnIGlkPSJtaWMiPjxwYXRoIGQ9Ik0xMiAxNGMxLjY2IDAgMi45OS0xLjM0IDIuOTktM0wxNSA1YzAtMS42Ni0xLjM0LTMtMy0zUzkgMy4zNCA5IDV2NmMwIDEuNjYgMS4zNCAzIDMgM3ptNS4zLTNjMCAzLTIuNTQgNS4xLTUuMyA1LjFTNi43IDE0IDYuNyAxMUg1YzAgMy40MSAyLjcyIDYuMjMgNiA2LjcyVjIxaDJ2LTMuMjhjMy4yOC0uNDggNi0zLjMgNi02LjcyaC0xLjd6IiAvPjwvZz4KPGcgaWQ9Im1pYy1ub25lIj48cGF0aCBkPSJNMTIgMTRjMS42NiAwIDIuOTktMS4zNCAyLjk5LTNMMTUgNWMwLTEuNjYtMS4zNC0zLTMtM1M5IDMuMzQgOSA1djZjMCAxLjY2IDEuMzQgMyAzIDN6bS0xLjItOS4xYzAtLjY2LjU0LTEuMiAxLjItMS4yLjY2IDAgMS4yLjU0IDEuMiAxLjJsLS4wMSA2LjJjMCAuNjYtLjUzIDEuMi0xLjE5IDEuMi0uNjYgMC0xLjItLjU0LTEuMi0xLjJWNC45em02LjUgNi4xYzAgMy0yLjU0IDUuMS01LjMgNS4xUzYuNyAxNCA2LjcgMTFINWMwIDMuNDEgMi43MiA2LjIzIDYgNi43MlYyMWgydi0zLjI4YzMuMjgtLjQ4IDYtMy4zIDYtNi43MmgtMS43eiIgLz48L2c+CjxnIGlkPSJtaWMtb2ZmIj48cGF0aCBkPSJNMTkgMTFoLTEuN2MwIC43NC0uMTYgMS40My0uNDMgMi4wNWwxLjIzIDEuMjNjLjU2LS45OC45LTIuMDkuOS0zLjI4em0tNC4wMi4xN2MwLS4wNi4wMi0uMTEuMDItLjE3VjVjMC0xLjY2LTEuMzQtMy0zLTNTOSAzLjM0IDkgNXYuMThsNS45OCA1Ljk5ek00LjI3IDNMMyA0LjI3bDYuMDEgNi4wMVYxMWMwIDEuNjYgMS4zMyAzIDIuOTkgMyAuMjIgMCAuNDQtLjAzLjY1LS4wOGwxLjY2IDEuNjZjLS43MS4zMy0xLjUuNTItMi4zMS41Mi0yLjc2IDAtNS4zLTIuMS01LjMtNS4xSDVjMCAzLjQxIDIuNzIgNi4yMyA2IDYuNzJWMjFoMnYtMy4yOGMuOTEtLjEzIDEuNzctLjQ1IDIuNTQtLjlMMTkuNzMgMjEgMjEgMTkuNzMgNC4yNyAzeiIgLz48L2c+CjxnIGlkPSJtb3ZpZSI+PHBhdGggZD0iTTE4IDRsMiA0aC0zbC0yLTRoLTJsMiA0aC0zbC0yLTRIOGwyIDRIN0w1IDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNGgtNHoiIC8+PC9nPgo8ZyBpZD0ibXVzaWMtdmlkZW8iPjxwYXRoIGQ9Ik0yMSAzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkgzVjVoMTh2MTR6TTggMTVjMC0xLjY2IDEuMzQtMyAzLTMgLjM1IDAgLjY5LjA3IDEgLjE4VjZoNXYyaC0zdjcuMDNjLS4wMiAxLjY0LTEuMzUgMi45Ny0zIDIuOTctMS42NiAwLTMtMS4zNC0zLTN6IiAvPjwvZz4KPGcgaWQ9Im5ldy1yZWxlYXNlcyI+PHBhdGggZD0iTTIzIDEybC0yLjQ0LTIuNzguMzQtMy42OC0zLjYxLS44Mi0xLjg5LTMuMThMMTIgMyA4LjYgMS41NCA2LjcxIDQuNzJsLTMuNjEuODEuMzQgMy42OEwxIDEybDIuNDQgMi43OC0uMzQgMy42OSAzLjYxLjgyIDEuODkgMy4xOEwxMiAyMWwzLjQgMS40NiAxLjg5LTMuMTggMy42MS0uODItLjM0LTMuNjhMMjMgMTJ6bS0xMCA1aC0ydi0yaDJ2MnptMC00aC0yVjdoMnY2eiIgLz48L2c+CjxnIGlkPSJub3QtaW50ZXJlc3RlZCI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDIgMC04LTMuNTgtOC04IDAtMS44NS42My0zLjU1IDEuNjktNC45TDE2LjkgMTguMzFDMTUuNTUgMTkuMzcgMTMuODUgMjAgMTIgMjB6bTYuMzEtMy4xTDcuMSA1LjY5QzguNDUgNC42MyAxMC4xNSA0IDEyIDRjNC40MiAwIDggMy41OCA4IDggMCAxLjg1LS42MyAzLjU1LTEuNjkgNC45eiIgLz48L2c+CjxnIGlkPSJub3RlIj48cGF0aCBkPSJNMjIgMTBsLTYtNkg0Yy0xLjEgMC0yIC45LTIgMnYxMi4wMWMwIDEuMS45IDEuOTkgMiAxLjk5bDE2LS4wMWMxLjEgMCAyLS44OSAyLTEuOTl2LTh6bS03LTQuNWw1LjUgNS41SDE1VjUuNXoiIC8+PC9nPgo8ZyBpZD0icGF1c2UiPjxwYXRoIGQ9Ik02IDE5aDRWNUg2djE0em04LTE0djE0aDRWNWgtNHoiIC8+PC9nPgo8ZyBpZD0icGF1c2UtY2lyY2xlLWZpbGxlZCI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bS0xIDE0SDlWOGgydjh6bTQgMGgtMlY4aDJ2OHoiIC8+PC9nPgo8ZyBpZD0icGF1c2UtY2lyY2xlLW91dGxpbmUiPjxwYXRoIGQ9Ik05IDE2aDJWOEg5djh6bTMtMTRDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4em0xLTRoMlY4aC0ydjh6IiAvPjwvZz4KPGcgaWQ9InBsYXktYXJyb3ciPjxwYXRoIGQ9Ik04IDV2MTRsMTEtN3oiIC8+PC9nPgo8ZyBpZD0icGxheS1jaXJjbGUtZmlsbGVkIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptLTIgMTQuNXYtOWw2IDQuNS02IDQuNXoiIC8+PC9nPgo8ZyBpZD0icGxheS1jaXJjbGUtb3V0bGluZSI+PHBhdGggZD0iTTEwIDE2LjVsNi00LjUtNi00LjV2OXpNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6IiAvPjwvZz4KPGcgaWQ9InBsYXlsaXN0LWFkZCI+PHBhdGggZD0iTTE0IDEwSDJ2MmgxMnYtMnptMC00SDJ2MmgxMlY2em00IDh2LTRoLTJ2NGgtNHYyaDR2NGgydi00aDR2LTJoLTR6TTIgMTZoOHYtMkgydjJ6IiAvPjwvZz4KPGcgaWQ9InBsYXlsaXN0LWFkZC1jaGVjayI+PHBhdGggZD0iTTE0IDEwSDJ2MmgxMnYtMnptMC00SDJ2MmgxMlY2ek0yIDE2aDh2LTJIMnYyem0xOS41LTQuNUwyMyAxM2wtNi45OSA3LTQuNTEtNC41TDEzIDE0bDMuMDEgMyA1LjQ5LTUuNXoiIC8+PC9nPgo8ZyBpZD0icGxheWxpc3QtcGxheSI+PHBhdGggZD0iTTE5IDlIMnYyaDE3Vjl6bTAtNEgydjJoMTdWNXpNMiAxNWgxM3YtMkgydjJ6bTE1LTJ2Nmw1LTMtNS0zeiIgLz48L2c+CjxnIGlkPSJxdWV1ZSI+PHBhdGggZD0iTTQgNkgydjE0YzAgMS4xLjkgMiAyIDJoMTR2LTJINFY2em0xNi00SDhjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTEgOWgtNHY0aC0ydi00SDlWOWg0VjVoMnY0aDR2MnoiIC8+PC9nPgo8ZyBpZD0icXVldWUtbXVzaWMiPjxwYXRoIGQ9Ik0xNSA2SDN2MmgxMlY2em0wIDRIM3YyaDEydi0yek0zIDE2aDh2LTJIM3Yyek0xNyA2djguMThjLS4zMS0uMTEtLjY1LS4xOC0xLS4xOC0xLjY2IDAtMyAxLjM0LTMgM3MxLjM0IDMgMyAzIDMtMS4zNCAzLTNWOGgzVjZoLTV6IiAvPjwvZz4KPGcgaWQ9InF1ZXVlLXBsYXktbmV4dCI+PHBhdGggZD0iTTIxIDNIM2MtMS4xMSAwLTIgLjg5LTIgMnYxMmMwIDEuMS44OSAyIDIgMmg1djJoOHYtMmgydi0ySDNWNWgxOHY4aDJWNWMwLTEuMTEtLjktMi0yLTJ6bS04IDdWN2gtMnYzSDh2MmgzdjNoMnYtM2gzdi0yaC0zem0xMSA4bC00LjUgNC41TDE4IDIxbDMtMy0zLTMgMS41LTEuNUwyNCAxOHoiIC8+PC9nPgo8ZyBpZD0icmFkaW8iPjxwYXRoIGQ9Ik0zLjI0IDYuMTVDMi41MSA2LjQzIDIgNy4xNyAyIDh2MTJjMCAxLjEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjkgMi0yVjhjMC0xLjExLS44OS0yLTItMkg4LjNsOC4yNi0zLjM0TDE1Ljg4IDEgMy4yNCA2LjE1ek03IDIwYy0xLjY2IDAtMy0xLjM0LTMtM3MxLjM0LTMgMy0zIDMgMS4zNCAzIDMtMS4zNCAzLTMgM3ptMTMtOGgtMnYtMmgtMnYySDRWOGgxNnY0eiIgLz48L2c+CjxnIGlkPSJyZWNlbnQtYWN0b3JzIj48cGF0aCBkPSJNMjEgNXYxNGgyVjVoLTJ6bS00IDE0aDJWNWgtMnYxNHpNMTQgNUgyYy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoMTJjLjU1IDAgMS0uNDUgMS0xVjZjMC0uNTUtLjQ1LTEtMS0xek04IDcuNzVjMS4yNCAwIDIuMjUgMS4wMSAyLjI1IDIuMjVTOS4yNCAxMi4yNSA4IDEyLjI1IDUuNzUgMTEuMjQgNS43NSAxMCA2Ljc2IDcuNzUgOCA3Ljc1ek0xMi41IDE3aC05di0uNzVjMC0xLjUgMy0yLjI1IDQuNS0yLjI1czQuNS43NSA0LjUgMi4yNVYxN3oiIC8+PC9nPgo8ZyBpZD0icmVtb3ZlLWZyb20tcXVldWUiPjxwYXRoIGQ9Ik0yMSAzSDNjLTEuMTEgMC0yIC44OS0yIDJ2MTJjMCAxLjEuODkgMiAyIDJoNXYyaDh2LTJoNWMxLjEgMCAxLjk5LS45IDEuOTktMkwyMyA1YzAtMS4xMS0uOS0yLTItMnptMCAxNEgzVjVoMTh2MTJ6bS01LTd2Mkg4di0yaDh6IiAvPjwvZz4KPGcgaWQ9InJlcGVhdCI+PHBhdGggZD0iTTcgN2gxMHYzbDQtNC00LTR2M0g1djZoMlY3em0xMCAxMEg3di0zbC00IDQgNCA0di0zaDEydi02aC0ydjR6IiAvPjwvZz4KPGcgaWQ9InJlcGVhdC1vbmUiPjxwYXRoIGQ9Ik03IDdoMTB2M2w0LTQtNC00djNINXY2aDJWN3ptMTAgMTBIN3YtM2wtNCA0IDQgNHYtM2gxMnYtNmgtMnY0em0tNC0yVjloLTFsLTIgMXYxaDEuNXY0SDEzeiIgLz48L2c+CjxnIGlkPSJyZXBsYXkiPjxwYXRoIGQ9Ik0xMiA1VjFMNyA2bDUgNVY3YzMuMzEgMCA2IDIuNjkgNiA2cy0yLjY5IDYtNiA2LTYtMi42OS02LTZINGMwIDQuNDIgMy41OCA4IDggOHM4LTMuNTggOC04LTMuNTgtOC04LTh6IiAvPjwvZz4KPGcgaWQ9InJlcGxheS0xMCI+PHBhdGggZD0iTTEyIDVWMUw3IDZsNSA1VjdjMy4zIDAgNiAyLjcgNiA2cy0yLjcgNi02IDYtNi0yLjctNi02SDRjMCA0LjQgMy42IDggOCA4czgtMy42IDgtOC0zLjYtOC04LTh6bS0xLjEgMTFIMTB2LTMuM0w5IDEzdi0uN2wxLjgtLjZoLjFWMTZ6bTQuMy0xLjhjMCAuMyAwIC42LS4xLjhsLS4zLjZzLS4zLjMtLjUuMy0uNC4xLS42LjEtLjQgMC0uNi0uMS0uMy0uMi0uNS0uMy0uMi0uMy0uMy0uNi0uMS0uNS0uMS0uOHYtLjdjMC0uMyAwLS42LjEtLjhsLjMtLjZzLjMtLjMuNS0uMy40LS4xLjYtLjEuNCAwIC42LjFjLjIuMS4zLjIuNS4zcy4yLjMuMy42LjEuNS4xLjh2Ljd6bS0uOS0uOHYtLjVzLS4xLS4yLS4xLS4zLS4xLS4xLS4yLS4yLS4yLS4xLS4zLS4xLS4yIDAtLjMuMWwtLjIuMnMtLjEuMi0uMS4zdjJzLjEuMi4xLjMuMS4xLjIuMi4yLjEuMy4xLjIgMCAuMy0uMWwuMi0uMnMuMS0uMi4xLS4zdi0xLjV6IiAvPjwvZz4KPGcgaWQ9InJlcGxheS0zMCI+PHBhdGggZD0iTTEyIDVWMUw3IDZsNSA1VjdjMy4zIDAgNiAyLjcgNiA2cy0yLjcgNi02IDYtNi0yLjctNi02SDRjMCA0LjQgMy42IDggOCA4czgtMy42IDgtOC0zLjYtOC04LTh6bS0yLjQgOC41aC40Yy4yIDAgLjQtLjEuNS0uMnMuMi0uMi4yLS40di0uMnMtLjEtLjEtLjEtLjItLjEtLjEtLjItLjFoLS41cy0uMS4xLS4yLjEtLjEuMS0uMS4ydi4yaC0xYzAtLjIgMC0uMy4xLS41cy4yLS4zLjMtLjQuMy0uMi40LS4yLjQtLjEuNS0uMWMuMiAwIC40IDAgLjYuMXMuMy4xLjUuMi4yLjIuMy40LjEuMy4xLjV2LjNzLS4xLjItLjEuMy0uMS4yLS4yLjItLjIuMS0uMy4yYy4yLjEuNC4yLjUuNHMuMi40LjIuNmMwIC4yIDAgLjQtLjEuNXMtLjIuMy0uMy40LS4zLjItLjUuMi0uNC4xLS42LjFjLS4yIDAtLjQgMC0uNS0uMXMtLjMtLjEtLjUtLjItLjItLjItLjMtLjQtLjEtLjQtLjEtLjZoLjh2LjJzLjEuMS4xLjIuMS4xLjIuMWguNXMuMS0uMS4yLS4xLjEtLjEuMS0uMnYtLjVzLS4xLS4xLS4xLS4yLS4xLS4xLS4yLS4xaC0uNnYtLjd6bTUuNy43YzAgLjMgMCAuNi0uMS44bC0uMy42cy0uMy4zLS41LjMtLjQuMS0uNi4xLS40IDAtLjYtLjEtLjMtLjItLjUtLjMtLjItLjMtLjMtLjYtLjEtLjUtLjEtLjh2LS43YzAtLjMgMC0uNi4xLS44bC4zLS42cy4zLS4zLjUtLjMuNC0uMS42LS4xLjQgMCAuNi4xLjMuMi41LjMuMi4zLjMuNi4xLjUuMS44di43em0tLjgtLjh2LS41YzAtLjEtLjEtLjItLjEtLjNzLS4xLS4xLS4yLS4yLS4yLS4xLS4zLS4xLS4yIDAtLjMuMWwtLjIuMnMtLjEuMi0uMS4zdjJzLjEuMi4xLjMuMS4xLjIuMi4yLjEuMy4xLjIgMCAuMy0uMWwuMi0uMnMuMS0uMi4xLS4zdi0xLjV6IiAvPjwvZz4KPGcgaWQ9InJlcGxheS01Ij48cGF0aCBkPSJNMTIgNVYxTDcgNmw1IDVWN2MzLjMgMCA2IDIuNyA2IDZzLTIuNyA2LTYgNi02LTIuNy02LTZINGMwIDQuNCAzLjYgOCA4IDhzOC0zLjYgOC04LTMuNi04LTgtOHptLTEuMyA4LjlsLjItMi4yaDIuNHYuN2gtMS43bC0uMS45cy4xIDAgLjEtLjEuMSAwIC4xLS4xLjEgMCAuMiAwaC4yYy4yIDAgLjQgMCAuNS4xcy4zLjIuNC4zLjIuMy4zLjUuMS40LjEuNmMwIC4yIDAgLjQtLjEuNXMtLjEuMy0uMy41LS4zLjItLjQuMy0uNC4xLS42LjFjLS4yIDAtLjQgMC0uNS0uMXMtLjMtLjEtLjUtLjItLjItLjItLjMtLjQtLjEtLjMtLjEtLjVoLjhjMCAuMi4xLjMuMi40cy4yLjEuNC4xYy4xIDAgLjIgMCAuMy0uMWwuMi0uMnMuMS0uMi4xLS4zdi0uNmwtLjEtLjItLjItLjJzLS4yLS4xLS4zLS4xaC0uMnMtLjEgMC0uMi4xLS4xIDAtLjEuMS0uMS4xLS4xLjFoLS43eiIgLz48L2c+CjxnIGlkPSJzaHVmZmxlIj48cGF0aCBkPSJNMTAuNTkgOS4xN0w1LjQxIDQgNCA1LjQxbDUuMTcgNS4xNyAxLjQyLTEuNDF6TTE0LjUgNGwyLjA0IDIuMDRMNCAxOC41OSA1LjQxIDIwIDE3Ljk2IDcuNDYgMjAgOS41VjRoLTUuNXptLjMzIDkuNDFsLTEuNDEgMS40MSAzLjEzIDMuMTNMMTQuNSAyMEgyMHYtNS41bC0yLjA0IDIuMDQtMy4xMy0zLjEzeiIgLz48L2c+CjxnIGlkPSJza2lwLW5leHQiPjxwYXRoIGQ9Ik02IDE4bDguNS02TDYgNnYxMnpNMTYgNnYxMmgyVjZoLTJ6IiAvPjwvZz4KPGcgaWQ9InNraXAtcHJldmlvdXMiPjxwYXRoIGQ9Ik02IDZoMnYxMkg2em0zLjUgNmw4LjUgNlY2eiIgLz48L2c+CjxnIGlkPSJzbG93LW1vdGlvbi12aWRlbyI+PHBhdGggZD0iTTEzLjA1IDkuNzlMMTAgNy41djlsMy4wNS0yLjI5TDE2IDEyem0wIDBMMTAgNy41djlsMy4wNS0yLjI5TDE2IDEyem0wIDBMMTAgNy41djlsMy4wNS0yLjI5TDE2IDEyek0xMSA0LjA3VjIuMDVjLTIuMDEuMi0zLjg0IDEtNS4zMiAyLjIxTDcuMSA1LjY5YzEuMTEtLjg2IDIuNDQtMS40NCAzLjktMS42MnpNNS42OSA3LjFMNC4yNiA1LjY4QzMuMDUgNy4xNiAyLjI1IDguOTkgMi4wNSAxMWgyLjAyYy4xOC0xLjQ2Ljc2LTIuNzkgMS42Mi0zLjl6TTQuMDcgMTNIMi4wNWMuMiAyLjAxIDEgMy44NCAyLjIxIDUuMzJsMS40My0xLjQzYy0uODYtMS4xLTEuNDQtMi40My0xLjYyLTMuODl6bTEuNjEgNi43NEM3LjE2IDIwLjk1IDkgMjEuNzUgMTEgMjEuOTV2LTIuMDJjLTEuNDYtLjE4LTIuNzktLjc2LTMuOS0xLjYybC0xLjQyIDEuNDN6TTIyIDEyYzAgNS4xNi0zLjkyIDkuNDItOC45NSA5Ljk1di0yLjAyQzE2Ljk3IDE5LjQxIDIwIDE2LjA1IDIwIDEycy0zLjAzLTcuNDEtNi45NS03LjkzVjIuMDVDMTguMDggMi41OCAyMiA2Ljg0IDIyIDEyeiIgLz48L2c+CjxnIGlkPSJzbm9vemUiPjxwYXRoIGQ9Ik03Ljg4IDMuMzlMNi42IDEuODYgMiA1LjcxbDEuMjkgMS41MyA0LjU5LTMuODV6TTIyIDUuNzJsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek0xMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5YzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0wIDE2Yy0zLjg3IDAtNy0zLjEzLTctN3MzLjEzLTcgNy03IDcgMy4xMyA3IDctMy4xMyA3LTcgN3ptLTMtOWgzLjYzTDkgMTUuMlYxN2g2di0yaC0zLjYzTDE1IDEwLjhWOUg5djJ6IiAvPjwvZz4KPGcgaWQ9InNvcnQtYnktYWxwaGEiPjxwYXRoIGQ9Ik0xNC45NCA0LjY2aC00LjcybDIuMzYtMi4zNnptLTQuNjkgMTQuNzFoNC42NmwtMi4zMyAyLjMzek02LjEgNi4yN0wxLjYgMTcuNzNoMS44NGwuOTItMi40NWg1LjExbC45MiAyLjQ1aDEuODRMNy43NCA2LjI3SDYuMXptLTEuMTMgNy4zN2wxLjk0LTUuMTggMS45NCA1LjE4SDQuOTd6bTEwLjc2IDIuNWg2LjEydjEuNTloLTguNTN2LTEuMjlsNS45Mi04LjU2aC01Ljg4di0xLjZoOC4zdjEuMjZsLTUuOTMgOC42eiIgLz48L2c+CjxnIGlkPSJzdG9wIj48cGF0aCBkPSJNNiA2aDEydjEySDZ6IiAvPjwvZz4KPGcgaWQ9InN1YnNjcmlwdGlvbnMiPjxwYXRoIGQ9Ik0yMCA4SDRWNmgxNnYyem0tMi02SDZ2MmgxMlYyem00IDEwdjhjMCAxLjEtLjkgMi0yIDJINGMtMS4xIDAtMi0uOS0yLTJ2LThjMC0xLjEuOS0yIDItMmgxNmMxLjEgMCAyIC45IDIgMnptLTYgNGwtNi0zLjI3djYuNTNMMTYgMTZ6IiAvPjwvZz4KPGcgaWQ9InN1YnRpdGxlcyI+PHBhdGggZD0iTTIwIDRINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yek00IDEyaDR2Mkg0di0yem0xMCA2SDR2LTJoMTB2MnptNiAwaC00di0yaDR2MnptMC00SDEwdi0yaDEwdjJ6IiAvPjwvZz4KPGcgaWQ9InN1cnJvdW5kLXNvdW5kIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6TTcuNzYgMTYuMjRsLTEuNDEgMS40MUM0Ljc4IDE2LjEgNCAxNC4wNSA0IDEyYzAtMi4wNS43OC00LjEgMi4zNC01LjY2bDEuNDEgMS40MUM2LjU5IDguOTMgNiAxMC40NiA2IDEycy41OSAzLjA3IDEuNzYgNC4yNHpNMTIgMTZjLTIuMjEgMC00LTEuNzktNC00czEuNzktNCA0LTQgNCAxLjc5IDQgNC0xLjc5IDQtNCA0em01LjY2IDEuNjZsLTEuNDEtMS40MUMxNy40MSAxNS4wNyAxOCAxMy41NCAxOCAxMnMtLjU5LTMuMDctMS43Ni00LjI0bDEuNDEtMS40MUMxOS4yMiA3LjkgMjAgOS45NSAyMCAxMmMwIDIuMDUtLjc4IDQuMS0yLjM0IDUuNjZ6TTEyIDEwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0idmlkZW8tY2FsbCI+PHBhdGggZD0iTTE3IDEwLjVWN2MwLS41NS0uNDUtMS0xLTFINGMtLjU1IDAtMSAuNDUtMSAxdjEwYzAgLjU1LjQ1IDEgMSAxaDEyYy41NSAwIDEtLjQ1IDEtMXYtMy41bDQgNHYtMTFsLTQgNHpNMTQgMTNoLTN2M0g5di0zSDZ2LTJoM1Y4aDJ2M2gzdjJ6IiAvPjwvZz4KPGcgaWQ9InZpZGVvLWxhYmVsIj48cGF0aCBkPSJNMjEgM0gzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTNIM1Y1aDE4djExeiIgLz48L2c+CjxnIGlkPSJ2aWRlby1saWJyYXJ5Ij48cGF0aCBkPSJNNCA2SDJ2MTRjMCAxLjEuOSAyIDIgMmgxNHYtMkg0VjZ6bTE2LTRIOGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tOCAxMi41di05bDYgNC41LTYgNC41eiIgLz48L2c+CjxnIGlkPSJ2aWRlb2NhbSI+PHBhdGggZD0iTTE3IDEwLjVWN2MwLS41NS0uNDUtMS0xLTFINGMtLjU1IDAtMSAuNDUtMSAxdjEwYzAgLjU1LjQ1IDEgMSAxaDEyYy41NSAwIDEtLjQ1IDEtMXYtMy41bDQgNHYtMTFsLTQgNHoiIC8+PC9nPgo8ZyBpZD0idmlkZW9jYW0tb2ZmIj48cGF0aCBkPSJNMjEgNi41bC00IDRWN2MwLS41NS0uNDUtMS0xLTFIOS44MkwyMSAxNy4xOFY2LjV6TTMuMjcgMkwyIDMuMjcgNC43MyA2SDRjLS41NSAwLTEgLjQ1LTEgMXYxMGMwIC41NS40NSAxIDEgMWgxMmMuMjEgMCAuMzktLjA4LjU0LS4xOEwxOS43MyAyMSAyMSAxOS43MyAzLjI3IDJ6IiAvPjwvZz4KPGcgaWQ9InZvbHVtZS1kb3duIj48cGF0aCBkPSJNMTguNSAxMmMwLTEuNzctMS4wMi0zLjI5LTIuNS00LjAzdjguMDVjMS40OC0uNzMgMi41LTIuMjUgMi41LTQuMDJ6TTUgOXY2aDRsNSA1VjRMOSA5SDV6IiAvPjwvZz4KPGcgaWQ9InZvbHVtZS1tdXRlIj48cGF0aCBkPSJNNyA5djZoNGw1IDVWNGwtNSA1SDd6IiAvPjwvZz4KPGcgaWQ9InZvbHVtZS1vZmYiPjxwYXRoIGQ9Ik0xNi41IDEyYzAtMS43Ny0xLjAyLTMuMjktMi41LTQuMDN2Mi4yMWwyLjQ1IDIuNDVjLjAzLS4yLjA1LS40MS4wNS0uNjN6bTIuNSAwYzAgLjk0LS4yIDEuODItLjU0IDIuNjRsMS41MSAxLjUxQzIwLjYzIDE0LjkxIDIxIDEzLjUgMjEgMTJjMC00LjI4LTIuOTktNy44Ni03LTguNzd2Mi4wNmMyLjg5Ljg2IDUgMy41NCA1IDYuNzF6TTQuMjcgM0wzIDQuMjcgNy43MyA5SDN2Nmg0bDUgNXYtNi43M2w0LjI1IDQuMjVjLS42Ny41Mi0xLjQyLjkzLTIuMjUgMS4xOHYyLjA2YzEuMzgtLjMxIDIuNjMtLjk1IDMuNjktMS44MUwxOS43MyAyMSAyMSAxOS43M2wtOS05TDQuMjcgM3pNMTIgNEw5LjkxIDYuMDkgMTIgOC4xOFY0eiIgLz48L2c+CjxnIGlkPSJ2b2x1bWUtdXAiPjxwYXRoIGQ9Ik0zIDl2Nmg0bDUgNVY0TDcgOUgzem0xMy41IDNjMC0xLjc3LTEuMDItMy4yOS0yLjUtNC4wM3Y4LjA1YzEuNDgtLjczIDIuNS0yLjI1IDIuNS00LjAyek0xNCAzLjIzdjIuMDZjMi44OS44NiA1IDMuNTQgNSA2Ljcxcy0yLjExIDUuODUtNSA2LjcxdjIuMDZjNC4wMS0uOTEgNy00LjQ5IDctOC43N3MtMi45OS03Ljg2LTctOC43N3oiIC8+PC9nPgo8ZyBpZD0id2ViIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0tNSAxNEg0di00aDExdjR6bTAtNUg0VjloMTF2NHptNSA1aC00VjloNHY5eiIgLz48L2c+CjxnIGlkPSJ3ZWItYXNzZXQiPjxwYXRoIGQ9Ik0xOSA0SDVjLTEuMTEgMC0yIC45LTIgMnYxMmMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS44OS0yLTItMnptMCAxNEg1VjhoMTR2MTB6IiAvPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+CgoKCjxpcm9uLWljb25zZXQtc3ZnIG5hbWU9ImNvbW11bmljYXRpb24iIHNpemU9IjI0Ij4KPHN2Zz48ZGVmcz4KPGcgaWQ9ImJ1c2luZXNzIj48cGF0aCBkPSJNMTIgN1YzSDJ2MThoMjBWN0gxMnpNNiAxOUg0di0yaDJ2MnptMC00SDR2LTJoMnYyem0wLTRINFY5aDJ2MnptMC00SDRWNWgydjJ6bTQgMTJIOHYtMmgydjJ6bTAtNEg4di0yaDJ2MnptMC00SDhWOWgydjJ6bTAtNEg4VjVoMnYyem0xMCAxMmgtOHYtMmgydi0yaC0ydi0yaDJ2LTJoLTJWOWg4djEwem0tMi04aC0ydjJoMnYtMnptMCA0aC0ydjJoMnYtMnoiIC8+PC9nPgo8ZyBpZD0iY2FsbCI+PHBhdGggZD0iTTYuNjIgMTAuNzljMS40NCAyLjgzIDMuNzYgNS4xNCA2LjU5IDYuNTlsMi4yLTIuMmMuMjctLjI3LjY3LS4zNiAxLjAyLS4yNCAxLjEyLjM3IDIuMzMuNTcgMy41Ny41Ny41NSAwIDEgLjQ1IDEgMVYyMGMwIC41NS0uNDUgMS0xIDEtOS4zOSAwLTE3LTcuNjEtMTctMTcgMC0uNTUuNDUtMSAxLTFoMy41Yy41NSAwIDEgLjQ1IDEgMSAwIDEuMjUuMiAyLjQ1LjU3IDMuNTcuMTEuMzUuMDMuNzQtLjI1IDEuMDJsLTIuMiAyLjJ6IiAvPjwvZz4KPGcgaWQ9ImNhbGwtZW5kIj48cGF0aCBkPSJNMTIgOWMtMS42IDAtMy4xNS4yNS00LjYuNzJ2My4xYzAgLjM5LS4yMy43NC0uNTYuOS0uOTguNDktMS44NyAxLjEyLTIuNjYgMS44NS0uMTguMTgtLjQzLjI4LS43LjI4LS4yOCAwLS41My0uMTEtLjcxLS4yOUwuMjkgMTMuMDhjLS4xOC0uMTctLjI5LS40Mi0uMjktLjcgMC0uMjguMTEtLjUzLjI5LS43MUMzLjM0IDguNzggNy40NiA3IDEyIDdzOC42NiAxLjc4IDExLjcxIDQuNjdjLjE4LjE4LjI5LjQzLjI5LjcxIDAgLjI4LS4xMS41My0uMjkuNzFsLTIuNDggMi40OGMtLjE4LjE4LS40My4yOS0uNzEuMjktLjI3IDAtLjUyLS4xMS0uNy0uMjgtLjc5LS43NC0xLjY5LTEuMzYtMi42Ny0xLjg1LS4zMy0uMTYtLjU2LS41LS41Ni0uOXYtMy4xQzE1LjE1IDkuMjUgMTMuNiA5IDEyIDl6IiAvPjwvZz4KPGcgaWQ9ImNhbGwtbWFkZSI+PHBhdGggZD0iTTkgNXYyaDYuNTlMNCAxOC41OSA1LjQxIDIwIDE3IDguNDFWMTVoMlY1eiIgLz48L2c+CjxnIGlkPSJjYWxsLW1lcmdlIj48cGF0aCBkPSJNMTcgMjAuNDFMMTguNDEgMTkgMTUgMTUuNTkgMTMuNTkgMTcgMTcgMjAuNDF6TTcuNSA4SDExdjUuNTlMNS41OSAxOSA3IDIwLjQxbDYtNlY4aDMuNUwxMiAzLjUgNy41IDh6IiAvPjwvZz4KPGcgaWQ9ImNhbGwtbWlzc2VkIj48cGF0aCBkPSJNMTkuNTkgN0wxMiAxNC41OSA2LjQxIDlIMTFWN0gzdjhoMnYtNC41OWw3IDcgOS05eiIgLz48L2c+CjxnIGlkPSJjYWxsLW1pc3NlZC1vdXRnb2luZyI+PHBhdGggZD0iTTMgOC40MWw5IDkgNy03VjE1aDJWN2gtOHYyaDQuNTlMMTIgMTQuNTkgNC40MSA3IDMgOC40MXoiIC8+PC9nPgo8ZyBpZD0iY2FsbC1yZWNlaXZlZCI+PHBhdGggZD0iTTIwIDUuNDFMMTguNTkgNCA3IDE1LjU5VjlINXYxMGgxMHYtMkg4LjQxeiIgLz48L2c+CjxnIGlkPSJjYWxsLXNwbGl0Ij48cGF0aCBkPSJNMTQgNGwyLjI5IDIuMjktMi44OCAyLjg4IDEuNDIgMS40MiAyLjg4LTIuODhMMjAgMTBWNHptLTQgMEg0djZsMi4yOS0yLjI5IDQuNzEgNC43VjIwaDJ2LTguNDFsLTUuMjktNS4zeiIgLz48L2c+CjxnIGlkPSJjaGF0Ij48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTYgOWgxMnYySDZWOXptOCA1SDZ2LTJoOHYyem00LTZINlY2aDEydjJ6IiAvPjwvZz4KPGcgaWQ9ImNoYXQtYnViYmxlIj48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0yIC45LTIgMnYxOGw0LTRoMTRjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0iY2hhdC1idWJibGUtb3V0bGluZSI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMiAuOS0yIDJ2MThsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bTAgMTRINmwtMiAyVjRoMTZ2MTJ6IiAvPjwvZz4KPGcgaWQ9ImNsZWFyLWFsbCI+PHBhdGggZD0iTTUgMTNoMTR2LTJINXYyem0tMiA0aDE0di0ySDN2MnpNNyA3djJoMTRWN0g3eiIgLz48L2c+CjxnIGlkPSJjb21tZW50Ij48cGF0aCBkPSJNMjEuOTkgNGMwLTEuMS0uODktMi0xLjk5LTJINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNGw0IDQtLjAxLTE4ek0xOCAxNEg2di0yaDEydjJ6bTAtM0g2VjloMTJ2MnptMC0zSDZWNmgxMnYyeiIgLz48L2c+CjxnIGlkPSJjb250YWN0LW1haWwiPjxwYXRoIGQ9Ik0yMSA4VjdsLTMgMi0zLTJ2MWwzIDIgMy0yem0xLTVIMkMuOSAzIDAgMy45IDAgNXYxNGMwIDEuMS45IDIgMiAyaDIwYzEuMSAwIDEuOTktLjkgMS45OS0yTDI0IDVjMC0xLjEtLjktMi0yLTJ6TTggNmMxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgMy0zLTEuMzQtMy0zIDEuMzQtMyAzLTN6bTYgMTJIMnYtMWMwLTIgNC0zLjEgNi0zLjFzNiAxLjEgNiAzLjF2MXptOC02aC04VjZoOHY2eiIgLz48L2c+CjxnIGlkPSJjb250YWN0LXBob25lIj48cGF0aCBkPSJNMjIgM0gyQy45IDMgMCAzLjkgMCA1djE0YzAgMS4xLjkgMiAyIDJoMjBjMS4xIDAgMS45OS0uOSAxLjk5LTJMMjQgNWMwLTEuMS0uOS0yLTItMnpNOCA2YzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptNiAxMkgydi0xYzAtMiA0LTMuMSA2LTMuMXM2IDEuMSA2IDMuMXYxem0zLjg1LTRoMS42NEwyMSAxNmwtMS45OSAxLjk5Yy0xLjMxLS45OC0yLjI4LTIuMzgtMi43My0zLjk5LS4xOC0uNjQtLjI4LTEuMzEtLjI4LTJzLjEtMS4zNi4yOC0yYy40NS0xLjYyIDEuNDItMy4wMSAyLjczLTMuOTlMMjEgOGwtMS41MSAyaC0xLjY0Yy0uMjIuNjMtLjM1IDEuMy0uMzUgMnMuMTMgMS4zNy4zNSAyeiIgLz48L2c+CjxnIGlkPSJjb250YWN0cyI+PHBhdGggZD0iTTIwIDBINHYyaDE2VjB6TTQgMjRoMTZ2LTJINHYyek0yMCA0SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptLTggMi43NWMxLjI0IDAgMi4yNSAxLjAxIDIuMjUgMi4yNXMtMS4wMSAyLjI1LTIuMjUgMi4yNVM5Ljc1IDEwLjI0IDkuNzUgOSAxMC43NiA2Ljc1IDEyIDYuNzV6TTE3IDE3SDd2LTEuNWMwLTEuNjcgMy4zMy0yLjUgNS0yLjVzNSAuODMgNSAyLjVWMTd6IiAvPjwvZz4KPGcgaWQ9ImRpYWxlci1zaXAiPjxwYXRoIGQ9Ik0xNyAzaC0xdjVoMVYzem0tMiAyaC0yVjRoMlYzaC0zdjNoMnYxaC0ydjFoM1Y1em0zLTJ2NWgxVjZoMlYzaC0zem0yIDJoLTFWNGgxdjF6bTAgMTAuNWMtMS4yNSAwLTIuNDUtLjItMy41Ny0uNTctLjM1LS4xMS0uNzQtLjAzLTEuMDEuMjRsLTIuMiAyLjJjLTIuODMtMS40NC01LjE1LTMuNzUtNi41OS02LjU5bDIuMi0yLjIxYy4yNy0uMjYuMzUtLjY1LjI0LTFDOC43IDYuNDUgOC41IDUuMjUgOC41IDRjMC0uNTUtLjQ1LTEtMS0xSDRjLS41NSAwLTEgLjQ1LTEgMSAwIDkuMzkgNy42MSAxNyAxNyAxNyAuNTUgMCAxLS40NSAxLTF2LTMuNWMwLS41NS0uNDUtMS0xLTF6IiAvPjwvZz4KPGcgaWQ9ImRpYWxwYWQiPjxwYXRoIGQ9Ik0xMiAxOWMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6TTYgMWMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAgNmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAgNmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTEyLThjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0yLTIgLjktMiAyIC45IDIgMiAyem0tNiA4Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptNiAwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptMC02Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptLTYgMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAtNmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9ImVtYWlsIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDRsLTggNS04LTVWNmw4IDUgOC01djJ6IiAvPjwvZz4KPGcgaWQ9ImZvcnVtIj48cGF0aCBkPSJNMjEgNmgtMnY5SDZ2MmMwIC41NS40NSAxIDEgMWgxMWw0IDRWN2MwLS41NS0uNDUtMS0xLTF6bS00IDZWM2MwLS41NS0uNDUtMS0xLTFIM2MtLjU1IDAtMSAuNDUtMSAxdjE0bDQtNGgxMGMuNTUgMCAxLS40NSAxLTF6IiAvPjwvZz4KPGcgaWQ9ImltcG9ydC1jb250YWN0cyI+PHBhdGggZD0iTTIxIDVjLTEuMTEtLjM1LTIuMzMtLjUtMy41LS41LTEuOTUgMC00LjA1LjQtNS41IDEuNS0xLjQ1LTEuMS0zLjU1LTEuNS01LjUtMS41UzIuNDUgNC45IDEgNnYxNC42NWMwIC4yNS4yNS41LjUuNS4xIDAgLjE1LS4wNS4yNS0uMDVDMy4xIDIwLjQ1IDUuMDUgMjAgNi41IDIwYzEuOTUgMCA0LjA1LjQgNS41IDEuNSAxLjM1LS44NSAzLjgtMS41IDUuNS0xLjUgMS42NSAwIDMuMzUuMyA0Ljc1IDEuMDUuMS4wNS4xNS4wNS4yNS4wNS4yNSAwIC41LS4yNS41LS41VjZjLS42LS40NS0xLjI1LS43NS0yLTF6bTAgMTMuNWMtMS4xLS4zNS0yLjMtLjUtMy41LS41LTEuNyAwLTQuMTUuNjUtNS41IDEuNVY4YzEuMzUtLjg1IDMuOC0xLjUgNS41LTEuNSAxLjIgMCAyLjQuMTUgMy41LjV2MTEuNXoiIC8+PC9nPgo8ZyBpZD0iaW1wb3J0LWV4cG9ydCI+PHBhdGggZD0iTTkgM0w1IDYuOTloM1YxNGgyVjYuOTloM0w5IDN6bTcgMTQuMDFWMTBoLTJ2Ny4wMWgtM0wxNSAyMWw0LTMuOTloLTN6IiAvPjwvZz4KPGcgaWQ9ImludmVydC1jb2xvcnMtb2ZmIj48cGF0aCBkPSJNMjAuNjUgMjAuODdsLTIuMzUtMi4zNS02LjMtNi4yOS0zLjU2LTMuNTctMS40Mi0xLjQxTDQuMjcgNC41IDMgNS43N2wyLjc4IDIuNzhjLTIuNTUgMy4xNC0yLjM2IDcuNzYuNTYgMTAuNjlDNy45IDIwLjggOS45NSAyMS41OCAxMiAyMS41OGMxLjc5IDAgMy41Ny0uNTkgNS4wMy0xLjc4bDIuNyAyLjdMMjEgMjEuMjNsLS4zNS0uMzZ6TTEyIDE5LjU5Yy0xLjYgMC0zLjExLS42Mi00LjI0LTEuNzZDNi42MiAxNi42OSA2IDE1LjE5IDYgMTMuNTljMC0xLjMyLjQzLTIuNTcgMS4yMS0zLjZMMTIgMTQuNzd2NC44MnpNMTIgNS4xdjQuNThsNy4yNSA3LjI2YzEuMzctMi45Ni44NC02LjU3LTEuNi05LjAxTDEyIDIuMjdsLTMuNyAzLjcgMS40MSAxLjQxTDEyIDUuMXoiIC8+PC9nPgo8ZyBpZD0ibGl2ZS1oZWxwIj48cGF0aCBkPSJNMTkgMkg1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoNGwzIDMgMy0zaDRjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTYgMTZoLTJ2LTJoMnYyem0yLjA3LTcuNzVsLS45LjkyQzEzLjQ1IDExLjkgMTMgMTIuNSAxMyAxNGgtMnYtLjVjMC0xLjEuNDUtMi4xIDEuMTctMi44M2wxLjI0LTEuMjZjLjM3LS4zNi41OS0uODYuNTktMS40MSAwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDJIOGMwLTIuMjEgMS43OS00IDQtNHM0IDEuNzkgNCA0YzAgLjg4LS4zNiAxLjY4LS45MyAyLjI1eiIgLz48L2c+CjxnIGlkPSJsb2NhdGlvbi1vZmYiPjxwYXRoIGQ9Ik0xMiA2LjVjMS4zOCAwIDIuNSAxLjEyIDIuNSAyLjUgMCAuNzQtLjMzIDEuMzktLjgzIDEuODVsMy42MyAzLjYzYy45OC0xLjg2IDEuNy0zLjggMS43LTUuNDggMC0zLjg3LTMuMTMtNy03LTctMS45OCAwLTMuNzYuODMtNS4wNCAyLjE1bDMuMTkgMy4xOWMuNDYtLjUyIDEuMTEtLjg0IDEuODUtLjg0em00LjM3IDkuNmwtNC42My00LjYzLS4xMS0uMTFMMy4yNyAzIDIgNC4yN2wzLjE4IDMuMThDNS4wNyA3Ljk1IDUgOC40NyA1IDljMCA1LjI1IDcgMTMgNyAxM3MxLjY3LTEuODUgMy4zOC00LjM1TDE4LjczIDIxIDIwIDE5LjczbC0zLjYzLTMuNjN6IiAvPjwvZz4KPGcgaWQ9ImxvY2F0aW9uLW9uIj48cGF0aCBkPSJNMTIgMkM4LjEzIDIgNSA1LjEzIDUgOWMwIDUuMjUgNyAxMyA3IDEzczctNy43NSA3LTEzYzAtMy44Ny0zLjEzLTctNy03em0wIDkuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6IiAvPjwvZz4KPGcgaWQ9Im1haWwtb3V0bGluZSI+PHBhdGggZD0iTTIwIDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptMCAxNEg0VjhsOCA1IDgtNXYxMHptLTgtN0w0IDZoMTZsLTggNXoiIC8+PC9nPgo8ZyBpZD0ibWVzc2FnZSI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tMiAxMkg2di0yaDEydjJ6bTAtM0g2VjloMTJ2MnptMC0zSDZWNmgxMnYyeiIgLz48L2c+CjxnIGlkPSJuby1zaW0iPjxwYXRoIGQ9Ik0xOC45OSA1YzAtMS4xLS44OS0yLTEuOTktMmgtN0w3LjY2IDUuMzQgMTkgMTYuNjggMTguOTkgNXpNMy42NSAzLjg4TDIuMzggNS4xNSA1IDcuNzdWMTljMCAxLjEuOSAyIDIgMmgxMC4wMWMuMzUgMCAuNjctLjEuOTYtLjI2bDEuODggMS44OCAxLjI3LTEuMjdMMy42NSAzLjg4eiIgLz48L2c+CjxnIGlkPSJwaG9uZSI+PHBhdGggZD0iTTYuNjIgMTAuNzljMS40NCAyLjgzIDMuNzYgNS4xNCA2LjU5IDYuNTlsMi4yLTIuMmMuMjctLjI3LjY3LS4zNiAxLjAyLS4yNCAxLjEyLjM3IDIuMzMuNTcgMy41Ny41Ny41NSAwIDEgLjQ1IDEgMVYyMGMwIC41NS0uNDUgMS0xIDEtOS4zOSAwLTE3LTcuNjEtMTctMTcgMC0uNTUuNDUtMSAxLTFoMy41Yy41NSAwIDEgLjQ1IDEgMSAwIDEuMjUuMiAyLjQ1LjU3IDMuNTcuMTEuMzUuMDMuNzQtLjI1IDEuMDJsLTIuMiAyLjJ6IiAvPjwvZz4KPGcgaWQ9InBob25lbGluay1lcmFzZSI+PHBhdGggZD0iTTEzIDguMmwtMS0xLTQgNC00LTQtMSAxIDQgNC00IDQgMSAxIDQtNCA0IDQgMS0xLTQtNCA0LTR6TTE5IDFIOWMtMS4xIDAtMiAuOS0yIDJ2M2gyVjRoMTB2MTZIOXYtMkg3djNjMCAxLjEuOSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJwaG9uZWxpbmstbG9jayI+PHBhdGggZD0iTTE5IDFIOWMtMS4xIDAtMiAuOS0yIDJ2M2gyVjRoMTB2MTZIOXYtMkg3djNjMCAxLjEuOSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTItMi0yem0tOC4yIDEwVjkuNUMxMC44IDguMSA5LjQgNyA4IDdTNS4yIDguMSA1LjIgOS41VjExYy0uNiAwLTEuMi42LTEuMiAxLjJ2My41YzAgLjcuNiAxLjMgMS4yIDEuM2g1LjVjLjcgMCAxLjMtLjYgMS4zLTEuMnYtMy41YzAtLjctLjYtMS4zLTEuMi0xLjN6bS0xLjMgMGgtM1Y5LjVjMC0uOC43LTEuMyAxLjUtMS4zczEuNS41IDEuNSAxLjNWMTF6IiAvPjwvZz4KPGcgaWQ9InBob25lbGluay1yaW5nIj48cGF0aCBkPSJNMjAuMSA3LjdsLTEgMWMxLjggMS44IDEuOCA0LjYgMCA2LjVsMSAxYzIuNS0yLjMgMi41LTYuMSAwLTguNXpNMTggOS44bC0xIDFjLjUuNy41IDEuNiAwIDIuM2wxIDFjMS4yLTEuMiAxLjItMyAwLTQuM3pNMTQgMUg0Yy0xLjEgMC0yIC45LTIgMnYxOGMwIDEuMS45IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgMTlINFY0aDEwdjE2eiIgLz48L2c+CjxnIGlkPSJwaG9uZWxpbmstc2V0dXAiPjxwYXRoIGQ9Ik0xMS44IDEyLjV2LTFsMS4xLS44Yy4xLS4xLjEtLjIuMS0uM2wtMS0xLjdjLS4xLS4xLS4yLS4yLS4zLS4xbC0xLjMuNGMtLjMtLjItLjYtLjQtLjktLjVsLS4yLTEuM2MwLS4xLS4xLS4yLS4zLS4ySDdjLS4xIDAtLjIuMS0uMy4ybC0uMiAxLjNjLS4zLjEtLjYuMy0uOS41bC0xLjMtLjVjLS4xIDAtLjIgMC0uMy4xbC0xIDEuN2MtLjEuMSAwIC4yLjEuM2wxLjEuOHYxbC0xLjEuOGMtLjEuMi0uMS4zLS4xLjRsMSAxLjdjLjEuMS4yLjIuMy4xbDEuNC0uNGMuMy4yLjYuNC45LjVsLjIgMS4zYy0uMS4xLjEuMi4yLjJoMmMuMSAwIC4yLS4xLjMtLjJsLjItMS4zYy4zLS4xLjYtLjMuOS0uNWwxLjMuNWMuMSAwIC4yIDAgLjMtLjFsMS0xLjdjLjEtLjEgMC0uMi0uMS0uM2wtMS4xLS45ek04IDE0Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnpNMTkgMUg5Yy0xLjEgMC0yIC45LTIgMnYzaDJWNGgxMHYxNkg5di0ySDd2M2MwIDEuMS45IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9InBvcnRhYmxlLXdpZmktb2ZmIj48cGF0aCBkPSJNMTcuNTYgMTQuMjRjLjI4LS42OS40NC0xLjQ1LjQ0LTIuMjQgMC0zLjMxLTIuNjktNi02LTYtLjc5IDAtMS41NS4xNi0yLjI0LjQ0bDEuNjIgMS42MmMuMi0uMDMuNDEtLjA2LjYyLS4wNiAyLjIxIDAgNCAxLjc5IDQgNCAwIC4yMS0uMDIuNDItLjA1LjYzbDEuNjEgMS42MXpNMTIgNGM0LjQyIDAgOCAzLjU4IDggOCAwIDEuMzUtLjM1IDIuNjItLjk1IDMuNzRsMS40NyAxLjQ3QzIxLjQ2IDE1LjY5IDIyIDEzLjkxIDIyIDEyYzAtNS41Mi00LjQ4LTEwLTEwLTEwLTEuOTEgMC0zLjY5LjU1LTUuMjEgMS40N2wxLjQ2IDEuNDZDOS4zNyA0LjM0IDEwLjY1IDQgMTIgNHpNMy4yNyAyLjVMMiAzLjc3bDIuMSAyLjFDMi43OSA3LjU3IDIgOS42OSAyIDEyYzAgMy43IDIuMDEgNi45MiA0Ljk5IDguNjVsMS0xLjczQzUuNjEgMTcuNTMgNCAxNC45NiA0IDEyYzAtMS43Ni41Ny0zLjM4IDEuNTMtNC42OWwxLjQzIDEuNDRDNi4zNiA5LjY4IDYgMTAuOCA2IDEyYzAgMi4yMiAxLjIxIDQuMTUgMyA1LjE5bDEtMS43NGMtMS4xOS0uNy0yLTEuOTctMi0zLjQ1IDAtLjY1LjE3LTEuMjUuNDQtMS43OWwxLjU4IDEuNThMMTAgMTJjMCAxLjEuOSAyIDIgMmwuMjEtLjAyLjAxLjAxIDcuNTEgNy41MUwyMSAyMC4yMyA0LjI3IDMuNWwtMS0xeiIgLz48L2c+CjxnIGlkPSJwcmVzZW50LXRvLWFsbCI+PHBhdGggZD0iTTIxIDNIM2MtMS4xMSAwLTIgLjg5LTIgMnYxNGMwIDEuMTEuODkgMiAyIDJoMThjMS4xMSAwIDItLjg5IDItMlY1YzAtMS4xMS0uODktMi0yLTJ6bTAgMTYuMDJIM1Y0Ljk4aDE4djE0LjA0ek0xMCAxMkg4bDQtNCA0IDRoLTJ2NGgtNHYtNHoiIC8+PC9nPgo8ZyBpZD0icmluZy12b2x1bWUiPjxwYXRoIGQ9Ik0yMy43MSAxNi42N0MyMC42NiAxMy43OCAxNi41NCAxMiAxMiAxMiA3LjQ2IDEyIDMuMzQgMTMuNzguMjkgMTYuNjdjLS4xOC4xOC0uMjkuNDMtLjI5LjcxIDAgLjI4LjExLjUzLjI5LjcxbDIuNDggMi40OGMuMTguMTguNDMuMjkuNzEuMjkuMjcgMCAuNTItLjExLjctLjI4Ljc5LS43NCAxLjY5LTEuMzYgMi42Ni0xLjg1LjMzLS4xNi41Ni0uNS41Ni0uOXYtMy4xYzEuNDUtLjQ4IDMtLjczIDQuNi0uNzNzMy4xNS4yNSA0LjYuNzJ2My4xYzAgLjM5LjIzLjc0LjU2LjkuOTguNDkgMS44NyAxLjEyIDIuNjYgMS44NS4xOC4xOC40My4yOC43LjI4LjI4IDAgLjUzLS4xMS43MS0uMjlsMi40OC0yLjQ4Yy4xOC0uMTguMjktLjQzLjI5LS43MSAwLS4yNy0uMTEtLjUyLS4yOS0uN3pNMjEuMTYgNi4yNmwtMS40MS0xLjQxLTMuNTYgMy41NSAxLjQxIDEuNDFzMy40NS0zLjUyIDMuNTYtMy41NXpNMTMgMmgtMnY1aDJWMnpNNi40IDkuODFMNy44MSA4LjQgNC4yNiA0Ljg0IDIuODQgNi4yNmMuMTEuMDMgMy41NiAzLjU1IDMuNTYgMy41NXoiIC8+PC9nPgo8ZyBpZD0icnNzLWZlZWQiPjxjaXJjbGUgY3g9IjYuMTgiIGN5PSIxNy44MiIgcj0iMi4xOCIgLz48cGF0aCBkPSJNNCA0LjQ0djIuODNjNy4wMyAwIDEyLjczIDUuNyAxMi43MyAxMi43M2gyLjgzYzAtOC41OS02Ljk3LTE1LjU2LTE1LjU2LTE1LjU2em0wIDUuNjZ2Mi44M2MzLjkgMCA3LjA3IDMuMTcgNy4wNyA3LjA3aDIuODNjMC01LjQ3LTQuNDMtOS45LTkuOS05Ljl6IiAvPjwvZz4KPGcgaWQ9InNjcmVlbi1zaGFyZSI+PHBhdGggZD0iTTIwIDE4YzEuMSAwIDEuOTktLjkgMS45OS0yTDIyIDZjMC0xLjExLS45LTItMi0ySDRjLTEuMTEgMC0yIC44OS0yIDJ2MTBjMCAxLjEuODkgMiAyIDJIMHYyaDI0di0yaC00em0tNy0zLjUzdi0yLjE5Yy0yLjc4IDAtNC42MS44NS02IDIuNzIuNTYtMi42NyAyLjExLTUuMzMgNi01Ljg3VjdsNCAzLjczLTQgMy43NHoiIC8+PC9nPgo8ZyBpZD0ic3BlYWtlci1waG9uZSI+PHBhdGggZD0iTTcgNy4wN0w4LjQzIDguNWMuOTEtLjkxIDIuMTgtMS40OCAzLjU3LTEuNDhzMi42Ni41NyAzLjU3IDEuNDhMMTcgNy4wN0MxNS43MiA1Ljc5IDEzLjk1IDUgMTIgNXMtMy43Mi43OS01IDIuMDd6TTEyIDFDOC45OCAxIDYuMjQgMi4yMyA0LjI1IDQuMjFsMS40MSAxLjQxQzcuMjggNCA5LjUzIDMgMTIgM3M0LjcyIDEgNi4zNCAyLjYybDEuNDEtMS40MUMxNy43NiAyLjIzIDE1LjAyIDEgMTIgMXptMi44NiA5LjAxTDkuMTQgMTBDOC41MSAxMCA4IDEwLjUxIDggMTEuMTR2OS43MWMwIC42My41MSAxLjE0IDEuMTQgMS4xNGg1LjcxYy42MyAwIDEuMTQtLjUxIDEuMTQtMS4xNHYtOS43MWMuMDEtLjYzLS41LTEuMTMtMS4xMy0xLjEzek0xNSAyMEg5di04aDZ2OHoiIC8+PC9nPgo8ZyBpZD0ic3RheS1jdXJyZW50LWxhbmRzY2FwZSI+PHBhdGggZD0iTTEuMDEgN0wxIDE3YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMkgzYy0xLjEgMC0xLjk5LjktMS45OSAyek0xOSA3djEwSDVWN2gxNHoiIC8+PC9nPgo8ZyBpZD0ic3RheS1jdXJyZW50LXBvcnRyYWl0Ij48cGF0aCBkPSJNMTcgMS4wMUw3IDFjLTEuMSAwLTEuOTkuOS0xLjk5IDJ2MThjMCAxLjEuODkgMiAxLjk5IDJoMTBjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0xLjk5LTItMS45OXpNMTcgMTlIN1Y1aDEwdjE0eiIgLz48L2c+CjxnIGlkPSJzdGF5LXByaW1hcnktbGFuZHNjYXBlIj48cGF0aCBkPSJNMS4wMSA3TDEgMTdjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0ySDNjLTEuMSAwLTEuOTkuOS0xLjk5IDJ6TTE5IDd2MTBINVY3aDE0eiIgLz48L2c+CjxnIGlkPSJzdGF5LXByaW1hcnktcG9ydHJhaXQiPjxwYXRoIGQ9Ik0xNyAxLjAxTDcgMWMtMS4xIDAtMS45OS45LTEuOTkgMnYxOGMwIDEuMS44OSAyIDEuOTkgMmgxMGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTEuOTktMi0xLjk5ek0xNyAxOUg3VjVoMTB2MTR6IiAvPjwvZz4KPGcgaWQ9InN0b3Atc2NyZWVuLXNoYXJlIj48cGF0aCBkPSJNMjEuMjIgMTguMDJsMiAySDI0di0yaC0yLjc4em0uNzctMmwuMDEtMTBjMC0xLjExLS45LTItMi0ySDcuMjJsNS4yMyA1LjIzYy4xOC0uMDQuMzYtLjA3LjU1LS4xVjcuMDJsNCAzLjczLTEuNTggMS40NyA1LjU0IDUuNTRjLjYxLS4zMyAxLjAzLS45OSAxLjAzLTEuNzR6TTIuMzkgMS43M0wxLjExIDNsMS41NCAxLjU0Yy0uNC4zNi0uNjUuODktLjY1IDEuNDh2MTBjMCAxLjEuODkgMiAyIDJIMHYyaDE4LjEzbDIuNzEgMi43MSAxLjI3LTEuMjdMMi4zOSAxLjczek03IDE1LjAyYy4zMS0xLjQ4LjkyLTIuOTUgMi4wNy00LjA2bDEuNTkgMS41OWMtMS41NC4zOC0yLjcgMS4xOC0zLjY2IDIuNDd6IiAvPjwvZz4KPGcgaWQ9InN3YXAtY2FsbHMiPjxwYXRoIGQ9Ik0xOCA0bC00IDRoM3Y3YzAgMS4xLS45IDItMiAycy0yLS45LTItMlY4YzAtMi4yMS0xLjc5LTQtNC00UzUgNS43OSA1IDh2N0gybDQgNCA0LTRIN1Y4YzAtMS4xLjktMiAyLTJzMiAuOSAyIDJ2N2MwIDIuMjEgMS43OSA0IDQgNHM0LTEuNzkgNC00VjhoM2wtNC00eiIgLz48L2c+CjxnIGlkPSJ0ZXh0c21zIj48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTkgMTFIN1Y5aDJ2MnptNCAwaC0yVjloMnYyem00IDBoLTJWOWgydjJ6IiAvPjwvZz4KPGcgaWQ9InZvaWNlbWFpbCI+PHBhdGggZD0iTTE4LjUgNkMxNS40NiA2IDEzIDguNDYgMTMgMTEuNWMwIDEuMzMuNDcgMi41NSAxLjI2IDMuNUg5Ljc0Yy43OS0uOTUgMS4yNi0yLjE3IDEuMjYtMy41QzExIDguNDYgOC41NCA2IDUuNSA2UzAgOC40NiAwIDExLjUgMi40NiAxNyA1LjUgMTdoMTNjMy4wNCAwIDUuNS0yLjQ2IDUuNS01LjVTMjEuNTQgNiAxOC41IDZ6bS0xMyA5QzMuNTcgMTUgMiAxMy40MyAyIDExLjVTMy41NyA4IDUuNSA4IDkgOS41NyA5IDExLjUgNy40MyAxNSA1LjUgMTV6bTEzIDBjLTEuOTMgMC0zLjUtMS41Ny0zLjUtMy41UzE2LjU3IDggMTguNSA4IDIyIDkuNTcgMjIgMTEuNSAyMC40MyAxNSAxOC41IDE1eiIgLz48L2c+CjxnIGlkPSJ2cG4ta2V5Ij48cGF0aCBkPSJNMTIuNjUgMTBDMTEuODMgNy42NyA5LjYxIDYgNyA2Yy0zLjMxIDAtNiAyLjY5LTYgNnMyLjY5IDYgNiA2YzIuNjEgMCA0LjgzLTEuNjcgNS42NS00SDE3djRoNHYtNGgydi00SDEyLjY1ek03IDE0Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnoiIC8+PC9nPgo8L2RlZnM+PC9zdmc+CjwvaXJvbi1pY29uc2V0LXN2Zz4KCgoKCjxpcm9uLWljb25zZXQtc3ZnIG5hbWU9ImVkaXRvciIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iYXR0YWNoLWZpbGUiPjxwYXRoIGQ9Ik0xNi41IDZ2MTEuNWMwIDIuMjEtMS43OSA0LTQgNHMtNC0xLjc5LTQtNFY1YzAtMS4zOCAxLjEyLTIuNSAyLjUtMi41czIuNSAxLjEyIDIuNSAyLjV2MTAuNWMwIC41NS0uNDUgMS0xIDFzLTEtLjQ1LTEtMVY2SDEwdjkuNWMwIDEuMzggMS4xMiAyLjUgMi41IDIuNXMyLjUtMS4xMiAyLjUtMi41VjVjMC0yLjIxLTEuNzktNC00LTRTNyAyLjc5IDcgNXYxMi41YzAgMy4wNCAyLjQ2IDUuNSA1LjUgNS41czUuNS0yLjQ2IDUuNS01LjVWNmgtMS41eiIgLz48L2c+CjxnIGlkPSJhdHRhY2gtbW9uZXkiPjxwYXRoIGQ9Ik0xMS44IDEwLjljLTIuMjctLjU5LTMtMS4yLTMtMi4xNSAwLTEuMDkgMS4wMS0xLjg1IDIuNy0xLjg1IDEuNzggMCAyLjQ0Ljg1IDIuNSAyLjFoMi4yMWMtLjA3LTEuNzItMS4xMi0zLjMtMy4yMS0zLjgxVjNoLTN2Mi4xNmMtMS45NC40Mi0zLjUgMS42OC0zLjUgMy42MSAwIDIuMzEgMS45MSAzLjQ2IDQuNyA0LjEzIDIuNS42IDMgMS40OCAzIDIuNDEgMCAuNjktLjQ5IDEuNzktMi43IDEuNzktMi4wNiAwLTIuODctLjkyLTIuOTgtMi4xaC0yLjJjLjEyIDIuMTkgMS43NiAzLjQyIDMuNjggMy44M1YyMWgzdi0yLjE1YzEuOTUtLjM3IDMuNS0xLjUgMy41LTMuNTUgMC0yLjg0LTIuNDMtMy44MS00LjctNC40eiIgLz48L2c+CjxnIGlkPSJib3JkZXItYWxsIj48cGF0aCBkPSJNMyAzdjE4aDE4VjNIM3ptOCAxNkg1di02aDZ2NnptMC04SDVWNWg2djZ6bTggOGgtNnYtNmg2djZ6bTAtOGgtNlY1aDZ2NnoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLWJvdHRvbSI+PHBhdGggZD0iTTkgMTFIN3YyaDJ2LTJ6bTQgNGgtMnYyaDJ2LTJ6TTkgM0g3djJoMlYzem00IDhoLTJ2Mmgydi0yek01IDNIM3YyaDJWM3ptOCA0aC0ydjJoMlY3em00IDRoLTJ2Mmgydi0yem0tNC04aC0ydjJoMlYzem00IDBoLTJ2MmgyVjN6bTIgMTBoMnYtMmgtMnYyem0wIDRoMnYtMmgtMnYyek01IDdIM3YyaDJWN3ptMTQtNHYyaDJWM2gtMnptMCA2aDJWN2gtMnYyek01IDExSDN2Mmgydi0yek0zIDIxaDE4di0ySDN2MnptMi02SDN2Mmgydi0yeiIgLz48L2c+CjxnIGlkPSJib3JkZXItY2xlYXIiPjxwYXRoIGQ9Ik03IDVoMlYzSDd2MnptMCA4aDJ2LTJIN3Yyem0wIDhoMnYtMkg3djJ6bTQtNGgydi0yaC0ydjJ6bTAgNGgydi0yaC0ydjJ6bS04IDBoMnYtMkgzdjJ6bTAtNGgydi0ySDN2MnptMC00aDJ2LTJIM3Yyem0wLTRoMlY3SDN2MnptMC00aDJWM0gzdjJ6bTggOGgydi0yaC0ydjJ6bTggNGgydi0yaC0ydjJ6bTAtNGgydi0yaC0ydjJ6bTAgOGgydi0yaC0ydjJ6bTAtMTJoMlY3aC0ydjJ6bS04IDBoMlY3aC0ydjJ6bTgtNnYyaDJWM2gtMnptLTggMmgyVjNoLTJ2MnptNCAxNmgydi0yaC0ydjJ6bTAtOGgydi0yaC0ydjJ6bTAtOGgyVjNoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLWNvbG9yIj48cGF0aCBkPSJNMTcuNzUgN0wxNCAzLjI1bC0xMCAxMFYxN2gzLjc1bDEwLTEwem0yLjk2LTIuOTZjLjM5LS4zOS4zOS0xLjAyIDAtMS40MUwxOC4zNy4yOWMtLjM5LS4zOS0xLjAyLS4zOS0xLjQxIDBMMTUgMi4yNSAxOC43NSA2bDEuOTYtMS45NnoiIC8+PHBhdGggZmlsbC1vcGFjaXR5PSIuMzYiIGQ9Ik0wIDIwaDI0djRIMHoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLWhvcml6b250YWwiPjxwYXRoIGQ9Ik0zIDIxaDJ2LTJIM3Yyek01IDdIM3YyaDJWN3pNMyAxN2gydi0ySDN2MnptNCA0aDJ2LTJIN3Yyek01IDNIM3YyaDJWM3ptNCAwSDd2MmgyVjN6bTggMGgtMnYyaDJWM3ptLTQgNGgtMnYyaDJWN3ptMC00aC0ydjJoMlYzem02IDE0aDJ2LTJoLTJ2MnptLTggNGgydi0yaC0ydjJ6bS04LThoMTh2LTJIM3Yyek0xOSAzdjJoMlYzaC0yem0wIDZoMlY3aC0ydjJ6bS04IDhoMnYtMmgtMnYyem00IDRoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyeiIgLz48L2c+CjxnIGlkPSJib3JkZXItaW5uZXIiPjxwYXRoIGQ9Ik0zIDIxaDJ2LTJIM3Yyem00IDBoMnYtMkg3djJ6TTUgN0gzdjJoMlY3ek0zIDE3aDJ2LTJIM3Yyek05IDNIN3YyaDJWM3pNNSAzSDN2MmgyVjN6bTEyIDBoLTJ2MmgyVjN6bTIgNmgyVjdoLTJ2MnptMC02djJoMlYzaC0yem0tNCAxOGgydi0yaC0ydjJ6TTEzIDNoLTJ2OEgzdjJoOHY4aDJ2LThoOHYtMmgtOFYzem02IDE4aDJ2LTJoLTJ2MnptMC00aDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLWxlZnQiPjxwYXRoIGQ9Ik0xMSAyMWgydi0yaC0ydjJ6bTAtNGgydi0yaC0ydjJ6bTAtMTJoMlYzaC0ydjJ6bTAgNGgyVjdoLTJ2MnptMCA0aDJ2LTJoLTJ2MnptLTQgOGgydi0ySDd2MnpNNyA1aDJWM0g3djJ6bTAgOGgydi0ySDd2MnptLTQgOGgyVjNIM3YxOHpNMTkgOWgyVjdoLTJ2MnptLTQgMTJoMnYtMmgtMnYyem00LTRoMnYtMmgtMnYyem0wLTE0djJoMlYzaC0yem0wIDEwaDJ2LTJoLTJ2MnptMCA4aDJ2LTJoLTJ2MnptLTQtOGgydi0yaC0ydjJ6bTAtOGgyVjNoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLW91dGVyIj48cGF0aCBkPSJNMTMgN2gtMnYyaDJWN3ptMCA0aC0ydjJoMnYtMnptNCAwaC0ydjJoMnYtMnpNMyAzdjE4aDE4VjNIM3ptMTYgMTZINVY1aDE0djE0em0tNi00aC0ydjJoMnYtMnptLTQtNEg3djJoMnYtMnoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLXJpZ2h0Ij48cGF0aCBkPSJNNyAyMWgydi0ySDd2MnpNMyA1aDJWM0gzdjJ6bTQgMGgyVjNIN3Yyem0wIDhoMnYtMkg3djJ6bS00IDhoMnYtMkgzdjJ6bTggMGgydi0yaC0ydjJ6bS04LThoMnYtMkgzdjJ6bTAgNGgydi0ySDN2MnptMC04aDJWN0gzdjJ6bTggOGgydi0yaC0ydjJ6bTQtNGgydi0yaC0ydjJ6bTQtMTB2MThoMlYzaC0yem0tNCAxOGgydi0yaC0ydjJ6bTAtMTZoMlYzaC0ydjJ6bS00IDhoMnYtMmgtMnYyem0wLThoMlYzaC0ydjJ6bTAgNGgyVjdoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLXN0eWxlIj48cGF0aCBkPSJNMTUgMjFoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyek03IDIxaDJ2LTJIN3Yyem00IDBoMnYtMmgtMnYyem04LTRoMnYtMmgtMnYyem0wLTRoMnYtMmgtMnYyek0zIDN2MThoMlY1aDE2VjNIM3ptMTYgNmgyVjdoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLXRvcCI+PHBhdGggZD0iTTcgMjFoMnYtMkg3djJ6bTAtOGgydi0ySDd2MnptNCAwaDJ2LTJoLTJ2MnptMCA4aDJ2LTJoLTJ2MnptLTgtNGgydi0ySDN2MnptMCA0aDJ2LTJIM3Yyem0wLThoMnYtMkgzdjJ6bTAtNGgyVjdIM3Yyem04IDhoMnYtMmgtMnYyem04LThoMlY3aC0ydjJ6bTAgNGgydi0yaC0ydjJ6TTMgM3YyaDE4VjNIM3ptMTYgMTRoMnYtMmgtMnYyem0tNCA0aDJ2LTJoLTJ2MnpNMTEgOWgyVjdoLTJ2MnptOCAxMmgydi0yaC0ydjJ6bS00LThoMnYtMmgtMnYyeiIgLz48L2c+CjxnIGlkPSJib3JkZXItdmVydGljYWwiPjxwYXRoIGQ9Ik0zIDloMlY3SDN2MnptMC00aDJWM0gzdjJ6bTQgMTZoMnYtMkg3djJ6bTAtOGgydi0ySDd2MnptLTQgMGgydi0ySDN2MnptMCA4aDJ2LTJIM3Yyem0wLTRoMnYtMkgzdjJ6TTcgNWgyVjNIN3Yyem0xMiAxMmgydi0yaC0ydjJ6bS04IDRoMlYzaC0ydjE4em04IDBoMnYtMmgtMnYyem0wLThoMnYtMmgtMnYyem0wLTEwdjJoMlYzaC0yem0wIDZoMlY3aC0ydjJ6bS00LTRoMlYzaC0ydjJ6bTAgMTZoMnYtMmgtMnYyem0wLThoMnYtMmgtMnYyeiIgLz48L2c+CjxnIGlkPSJidWJibGUtY2hhcnQiPjxjaXJjbGUgY3g9IjcuMiIgY3k9IjE0LjQiIHI9IjMuMiIgLz48Y2lyY2xlIGN4PSIxNC44IiBjeT0iMTgiIHI9IjIiIC8+PGNpcmNsZSBjeD0iMTUuMiIgY3k9IjguOCIgcj0iNC44IiAvPjwvZz4KPGcgaWQ9ImRyYWctaGFuZGxlIj48cGF0aCBkPSJNMjAgOUg0djJoMTZWOXpNNCAxNWgxNnYtMkg0djJ6IiAvPjwvZz4KPGcgaWQ9ImZvcm1hdC1hbGlnbi1jZW50ZXIiPjxwYXRoIGQ9Ik03IDE1djJoMTB2LTJIN3ptLTQgNmgxOHYtMkgzdjJ6bTAtOGgxOHYtMkgzdjJ6bTQtNnYyaDEwVjdIN3pNMyAzdjJoMThWM0gzeiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtYWxpZ24tanVzdGlmeSI+PHBhdGggZD0iTTMgMjFoMTh2LTJIM3Yyem0wLTRoMTh2LTJIM3Yyem0wLTRoMTh2LTJIM3Yyem0wLTRoMThWN0gzdjJ6bTAtNnYyaDE4VjNIM3oiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LWFsaWduLWxlZnQiPjxwYXRoIGQ9Ik0xNSAxNUgzdjJoMTJ2LTJ6bTAtOEgzdjJoMTJWN3pNMyAxM2gxOHYtMkgzdjJ6bTAgOGgxOHYtMkgzdjJ6TTMgM3YyaDE4VjNIM3oiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LWFsaWduLXJpZ2h0Ij48cGF0aCBkPSJNMyAyMWgxOHYtMkgzdjJ6bTYtNGgxMnYtMkg5djJ6bS02LTRoMTh2LTJIM3Yyem02LTRoMTJWN0g5djJ6TTMgM3YyaDE4VjNIM3oiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LWJvbGQiPjxwYXRoIGQ9Ik0xNS42IDEwLjc5Yy45Ny0uNjcgMS42NS0xLjc3IDEuNjUtMi43OSAwLTIuMjYtMS43NS00LTQtNEg3djE0aDcuMDRjMi4wOSAwIDMuNzEtMS43IDMuNzEtMy43OSAwLTEuNTItLjg2LTIuODItMi4xNS0zLjQyek0xMCA2LjVoM2MuODMgMCAxLjUuNjcgMS41IDEuNXMtLjY3IDEuNS0xLjUgMS41aC0zdi0zem0zLjUgOUgxMHYtM2gzLjVjLjgzIDAgMS41LjY3IDEuNSAxLjVzLS42NyAxLjUtMS41IDEuNXoiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LWNsZWFyIj48cGF0aCBkPSJNMy4yNyA1TDIgNi4yN2w2Ljk3IDYuOTdMNi41IDE5aDNsMS41Ny0zLjY2TDE2LjczIDIxIDE4IDE5LjczIDMuNTUgNS4yNyAzLjI3IDV6TTYgNXYuMThMOC44MiA4aDIuNGwtLjcyIDEuNjggMi4xIDIuMUwxNC4yMSA4SDIwVjVINnoiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LWNvbG9yLWZpbGwiPjxwYXRoIGQ9Ik0xNi41NiA4Ljk0TDcuNjIgMCA2LjIxIDEuNDFsMi4zOCAyLjM4LTUuMTUgNS4xNWMtLjU5LjU5LS41OSAxLjU0IDAgMi4xMmw1LjUgNS41Yy4yOS4yOS42OC40NCAxLjA2LjQ0cy43Ny0uMTUgMS4wNi0uNDRsNS41LTUuNWMuNTktLjU4LjU5LTEuNTMgMC0yLjEyek01LjIxIDEwTDEwIDUuMjEgMTQuNzkgMTBINS4yMXpNMTkgMTEuNXMtMiAyLjE3LTIgMy41YzAgMS4xLjkgMiAyIDJzMi0uOSAyLTJjMC0xLjMzLTItMy41LTItMy41eiIgLz48cGF0aCBmaWxsLW9wYWNpdHk9Ii4zNiIgZD0iTTAgMjBoMjR2NEgweiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtY29sb3ItcmVzZXQiPjxwYXRoIGQ9Ik0xOCAxNGMwLTQtNi0xMC44LTYtMTAuOHMtMS4zMyAxLjUxLTIuNzMgMy41Mmw4LjU5IDguNTljLjA5LS40Mi4xNC0uODYuMTQtMS4zMXptLS44OCAzLjEyTDEyLjUgMTIuNSA1LjI3IDUuMjcgNCA2LjU1bDMuMzIgMy4zMkM2LjU1IDExLjMyIDYgMTIuNzkgNiAxNGMwIDMuMzEgMi42OSA2IDYgNiAxLjUyIDAgMi45LS41NyAzLjk2LTEuNWwyLjYzIDIuNjMgMS4yNy0xLjI3LTIuNzQtMi43NHoiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LWNvbG9yLXRleHQiPjxwYXRoIGZpbGwtb3BhY2l0eT0iLjM2IiBkPSJNMCAyMGgyNHY0SDB6IiAvPjxwYXRoIGQ9Ik0xMSAzTDUuNSAxN2gyLjI1bDEuMTItM2g2LjI1bDEuMTIgM2gyLjI1TDEzIDNoLTJ6bS0xLjM4IDlMMTIgNS42NyAxNC4zOCAxMkg5LjYyeiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtaW5kZW50LWRlY3JlYXNlIj48cGF0aCBkPSJNMTEgMTdoMTB2LTJIMTF2MnptLTgtNWw0IDRWOGwtNCA0em0wIDloMTh2LTJIM3Yyek0zIDN2MmgxOFYzSDN6bTggNmgxMFY3SDExdjJ6bTAgNGgxMHYtMkgxMXYyeiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtaW5kZW50LWluY3JlYXNlIj48cGF0aCBkPSJNMyAyMWgxOHYtMkgzdjJ6TTMgOHY4bDQtNC00LTR6bTggOWgxMHYtMkgxMXYyek0zIDN2MmgxOFYzSDN6bTggNmgxMFY3SDExdjJ6bTAgNGgxMHYtMkgxMXYyeiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtaXRhbGljIj48cGF0aCBkPSJNMTAgNHYzaDIuMjFsLTMuNDIgOEg2djNoOHYtM2gtMi4yMWwzLjQyLThIMThWNHoiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LWxpbmUtc3BhY2luZyI+PHBhdGggZD0iTTYgN2gyLjVMNSAzLjUgMS41IDdINHYxMEgxLjVMNSAyMC41IDguNSAxN0g2Vjd6bTQtMnYyaDEyVjVIMTB6bTAgMTRoMTJ2LTJIMTB2MnptMC02aDEydi0ySDEwdjJ6IiAvPjwvZz4KPGcgaWQ9ImZvcm1hdC1saXN0LWJ1bGxldGVkIj48cGF0aCBkPSJNNCAxMC41Yy0uODMgMC0xLjUuNjctMS41IDEuNXMuNjcgMS41IDEuNSAxLjUgMS41LS42NyAxLjUtMS41LS42Ny0xLjUtMS41LTEuNXptMC02Yy0uODMgMC0xLjUuNjctMS41IDEuNVMzLjE3IDcuNSA0IDcuNSA1LjUgNi44MyA1LjUgNiA0LjgzIDQuNSA0IDQuNXptMCAxMmMtLjgzIDAtMS41LjY4LTEuNSAxLjVzLjY4IDEuNSAxLjUgMS41IDEuNS0uNjggMS41LTEuNS0uNjctMS41LTEuNS0xLjV6TTcgMTloMTR2LTJIN3Yyem0wLTZoMTR2LTJIN3Yyem0wLTh2MmgxNFY1SDd6IiAvPjwvZz4KPGcgaWQ9ImZvcm1hdC1saXN0LW51bWJlcmVkIj48cGF0aCBkPSJNMiAxN2gydi41SDN2MWgxdi41SDJ2MWgzdi00SDJ2MXptMS05aDFWNEgydjFoMXYzem0tMSAzaDEuOEwyIDEzLjF2LjloM3YtMUgzLjJMNSAxMC45VjEwSDJ2MXptNS02djJoMTRWNUg3em0wIDE0aDE0di0ySDd2MnptMC02aDE0di0ySDd2MnoiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LXBhaW50Ij48cGF0aCBkPSJNMTggNFYzYzAtLjU1LS40NS0xLTEtMUg1Yy0uNTUgMC0xIC40NS0xIDF2NGMwIC41NS40NSAxIDEgMWgxMmMuNTUgMCAxLS40NSAxLTFWNmgxdjRIOXYxMWMwIC41NS40NSAxIDEgMWgyYy41NSAwIDEtLjQ1IDEtMXYtOWg4VjRoLTN6IiAvPjwvZz4KPGcgaWQ9ImZvcm1hdC1xdW90ZSI+PHBhdGggZD0iTTYgMTdoM2wyLTRWN0g1djZoM3ptOCAwaDNsMi00VjdoLTZ2NmgzeiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtc2hhcGVzIj48cGF0aCBkPSJNMjMgN1YxaC02djJIN1YxSDF2NmgydjEwSDF2Nmg2di0yaDEwdjJoNnYtNmgtMlY3aDJ6TTMgM2gydjJIM1Yzem0yIDE4SDN2LTJoMnYyem0xMi0ySDd2LTJINVY3aDJWNWgxMHYyaDJ2MTBoLTJ2MnptNCAyaC0ydi0yaDJ2MnpNMTkgNVYzaDJ2MmgtMnptLTUuMjcgOWgtMy40OWwtLjczIDJINy44OWwzLjQtOWgxLjRsMy40MSA5aC0xLjYzbC0uNzQtMnptLTMuMDQtMS4yNmgyLjYxTDEyIDguOTFsLTEuMzEgMy44M3oiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LXNpemUiPjxwYXRoIGQ9Ik05IDR2M2g1djEyaDNWN2g1VjRIOXptLTYgOGgzdjdoM3YtN2gzVjlIM3YzeiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtc3RyaWtldGhyb3VnaCI+PHBhdGggZD0iTTEwIDE5aDR2LTNoLTR2M3pNNSA0djNoNXYzaDRWN2g1VjRINXpNMyAxNGgxOHYtMkgzdjJ6IiAvPjwvZz4KPGcgaWQ9ImZvcm1hdC10ZXh0ZGlyZWN0aW9uLWwtdG8tciI+PHBhdGggZD0iTTkgMTB2NWgyVjRoMnYxMWgyVjRoMlYySDlDNi43OSAyIDUgMy43OSA1IDZzMS43OSA0IDQgNHptMTIgOGwtNC00djNINXYyaDEydjNsNC00eiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtdGV4dGRpcmVjdGlvbi1yLXRvLWwiPjxwYXRoIGQ9Ik0xMCAxMHY1aDJWNGgydjExaDJWNGgyVjJoLThDNy43OSAyIDYgMy43OSA2IDZzMS43OSA0IDQgNHptLTIgN3YtM2wtNCA0IDQgNHYtM2gxMnYtMkg4eiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtdW5kZXJsaW5lZCI+PHBhdGggZD0iTTEyIDE3YzMuMzEgMCA2LTIuNjkgNi02VjNoLTIuNXY4YzAgMS45My0xLjU3IDMuNS0zLjUgMy41UzguNSAxMi45MyA4LjUgMTFWM0g2djhjMCAzLjMxIDIuNjkgNiA2IDZ6bS03IDJ2MmgxNHYtMkg1eiIgLz48L2c+CjxnIGlkPSJmdW5jdGlvbnMiPjxwYXRoIGQ9Ik0xOCA0SDZ2Mmw2LjUgNkw2IDE4djJoMTJ2LTNoLTdsNS01LTUtNWg3eiIgLz48L2c+CjxnIGlkPSJoaWdobGlnaHQiPjxwYXRoIGQ9Ik02IDE0bDMgM3Y1aDZ2LTVsMy0zVjlINnptNS0xMmgydjNoLTJ6TTMuNSA1Ljg3NUw0LjkxNCA0LjQ2bDIuMTIgMi4xMjJMNS42MiA3Ljk5N3ptMTMuNDYuNzFsMi4xMjMtMi4xMiAxLjQxNCAxLjQxNEwxOC4zNzUgOHoiIC8+PC9nPgo8ZyBpZD0iaW5zZXJ0LWNoYXJ0Ij48cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6TTkgMTdIN3YtN2gydjd6bTQgMGgtMlY3aDJ2MTB6bTQgMGgtMnYtNGgydjR6IiAvPjwvZz4KPGcgaWQ9Imluc2VydC1jb21tZW50Ij48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE0bDQgNFY0YzAtMS4xLS45LTItMi0yem0tMiAxMkg2di0yaDEydjJ6bTAtM0g2VjloMTJ2MnptMC0zSDZWNmgxMnYyeiIgLz48L2c+CjxnIGlkPSJpbnNlcnQtZHJpdmUtZmlsZSI+PHBhdGggZD0iTTYgMmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDIwYzAgMS4xLjg5IDIgMS45OSAySDE4YzEuMSAwIDItLjkgMi0yVjhsLTYtNkg2em03IDdWMy41TDE4LjUgOUgxM3oiIC8+PC9nPgo8ZyBpZD0iaW5zZXJ0LWVtb3RpY29uIj48cGF0aCBkPSJNMTEuOTkgMkM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnpNMTIgMjBjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4em0zLjUtOWMuODMgMCAxLjUtLjY3IDEuNS0xLjVTMTYuMzMgOCAxNS41IDggMTQgOC42NyAxNCA5LjVzLjY3IDEuNSAxLjUgMS41em0tNyAwYy44MyAwIDEuNS0uNjcgMS41LTEuNVM5LjMzIDggOC41IDggNyA4LjY3IDcgOS41IDcuNjcgMTEgOC41IDExem0zLjUgNi41YzIuMzMgMCA0LjMxLTEuNDYgNS4xMS0zLjVINi44OWMuOCAyLjA0IDIuNzggMy41IDUuMTEgMy41eiIgLz48L2c+CjxnIGlkPSJpbnNlcnQtaW52aXRhdGlvbiI+PHBhdGggZD0iTTE3IDEyaC01djVoNXYtNXpNMTYgMXYySDhWMUg2djJINWMtMS4xMSAwLTEuOTkuOS0xLjk5IDJMMyAxOWMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yaC0xVjFoLTJ6bTMgMThINVY4aDE0djExeiIgLz48L2c+CjxnIGlkPSJpbnNlcnQtbGluayI+PHBhdGggZD0iTTMuOSAxMmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMWg0VjdIN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNWg0di0xLjlIN2MtMS43MSAwLTMuMS0xLjM5LTMuMS0zLjF6TTggMTNoOHYtMkg4djJ6bTktNmgtNHYxLjloNGMxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXMtMS4zOSAzLjEtMy4xIDMuMWgtNFYxN2g0YzIuNzYgMCA1LTIuMjQgNS01cy0yLjI0LTUtNS01eiIgLz48L2c+CjxnIGlkPSJpbnNlcnQtcGhvdG8iPjxwYXRoIGQ9Ik0yMSAxOVY1YzAtMS4xLS45LTItMi0ySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJ6TTguNSAxMy41bDIuNSAzLjAxTDE0LjUgMTJsNC41IDZINWwzLjUtNC41eiIgLz48L2c+CjxnIGlkPSJsaW5lYXItc2NhbGUiPjxwYXRoIGQ9Ik0xOS41IDkuNWMtMS4wMyAwLTEuOS42Mi0yLjI5IDEuNWgtMi45MmMtLjM5LS44OC0xLjI2LTEuNS0yLjI5LTEuNXMtMS45LjYyLTIuMjkgMS41SDYuNzljLS4zOS0uODgtMS4yNi0xLjUtMi4yOS0xLjVDMy4xMiA5LjUgMiAxMC42MiAyIDEyczEuMTIgMi41IDIuNSAyLjVjMS4wMyAwIDEuOS0uNjIgMi4yOS0xLjVoMi45MmMuMzkuODggMS4yNiAxLjUgMi4yOSAxLjVzMS45LS42MiAyLjI5LTEuNWgyLjkyYy4zOS44OCAxLjI2IDEuNSAyLjI5IDEuNSAxLjM4IDAgMi41LTEuMTIgMi41LTIuNXMtMS4xMi0yLjUtMi41LTIuNXoiIC8+PC9nPgo8ZyBpZD0ibWVyZ2UtdHlwZSI+PHBhdGggZD0iTTE3IDIwLjQxTDE4LjQxIDE5IDE1IDE1LjU5IDEzLjU5IDE3IDE3IDIwLjQxek03LjUgOEgxMXY1LjU5TDUuNTkgMTkgNyAyMC40MWw2LTZWOGgzLjVMMTIgMy41IDcuNSA4eiIgLz48L2c+CjxnIGlkPSJtb2RlLWNvbW1lbnQiPjxwYXRoIGQ9Ik0yMS45OSA0YzAtMS4xLS44OS0yLTEuOTktMkg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE0bDQgNC0uMDEtMTh6IiAvPjwvZz4KPGcgaWQ9Im1vZGUtZWRpdCI+PHBhdGggZD0iTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC0yLjM0LTIuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0xLjgzIDEuODMgMy43NSAzLjc1IDEuODMtMS44M3oiIC8+PC9nPgo8ZyBpZD0ibW9uZXRpemF0aW9uLW9uIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMS40MSAxNi4wOVYyMGgtMi42N3YtMS45M2MtMS43MS0uMzYtMy4xNi0xLjQ2LTMuMjctMy40aDEuOTZjLjEgMS4wNS44MiAxLjg3IDIuNjUgMS44NyAxLjk2IDAgMi40LS45OCAyLjQtMS41OSAwLS44My0uNDQtMS42MS0yLjY3LTIuMTQtMi40OC0uNi00LjE4LTEuNjItNC4xOC0zLjY3IDAtMS43MiAxLjM5LTIuODQgMy4xMS0zLjIxVjRoMi42N3YxLjk1YzEuODYuNDUgMi43OSAxLjg2IDIuODUgMy4zOUgxNC4zYy0uMDUtMS4xMS0uNjQtMS44Ny0yLjIyLTEuODctMS41IDAtMi40LjY4LTIuNCAxLjY0IDAgLjg0LjY1IDEuMzkgMi42NyAxLjkxczQuMTggMS4zOSA0LjE4IDMuOTFjLS4wMSAxLjgzLTEuMzggMi44My0zLjEyIDMuMTZ6IiAvPjwvZz4KPGcgaWQ9Im1vbmV5LW9mZiI+PHBhdGggZD0iTTEyLjUgNi45YzEuNzggMCAyLjQ0Ljg1IDIuNSAyLjFoMi4yMWMtLjA3LTEuNzItMS4xMi0zLjMtMy4yMS0zLjgxVjNoLTN2Mi4xNmMtLjUzLjEyLTEuMDMuMy0xLjQ4LjU0bDEuNDcgMS40N2MuNDEtLjE3LjkxLS4yNyAxLjUxLS4yN3pNNS4zMyA0LjA2TDQuMDYgNS4zMyA3LjUgOC43N2MwIDIuMDggMS41NiAzLjIxIDMuOTEgMy45MWwzLjUxIDMuNTFjLS4zNC40OC0xLjA1LjkxLTIuNDIuOTEtMi4wNiAwLTIuODctLjkyLTIuOTgtMi4xaC0yLjJjLjEyIDIuMTkgMS43NiAzLjQyIDMuNjggMy44M1YyMWgzdi0yLjE1Yy45Ni0uMTggMS44Mi0uNTUgMi40NS0xLjEybDIuMjIgMi4yMiAxLjI3LTEuMjdMNS4zMyA0LjA2eiIgLz48L2c+CjxnIGlkPSJtdWx0aWxpbmUtY2hhcnQiPjxwYXRoIGQ9Ik0yMiA2LjkybC0xLjQxLTEuNDEtMi44NSAzLjIxQzE1LjY4IDYuNCAxMi44MyA1IDkuNjEgNSA2LjcyIDUgNC4wNyA2LjE2IDIgOGwxLjQyIDEuNDJDNS4xMiA3LjkzIDcuMjcgNyA5LjYxIDdjMi43NCAwIDUuMDkgMS4yNiA2Ljc3IDMuMjRsLTIuODggMy4yNC00LTRMMiAxNi45OWwxLjUgMS41IDYtNi4wMSA0IDQgNC4wNS00LjU1Yy43NSAxLjM1IDEuMjUgMi45IDEuNDQgNC41NUgyMWMtLjIyLTIuMy0uOTUtNC4zOS0yLjA0LTYuMTRMMjIgNi45MnoiIC8+PC9nPgo8ZyBpZD0icGllLWNoYXJ0Ij48cGF0aCBkPSJNMTEgMnYyMGMtNS4wNy0uNS05LTQuNzktOS0xMHMzLjkzLTkuNSA5LTEwem0yLjAzIDB2OC45OUgyMmMtLjQ3LTQuNzQtNC4yNC04LjUyLTguOTctOC45OXptMCAxMS4wMVYyMmM0Ljc0LS40NyA4LjUtNC4yNSA4Ljk3LTguOTloLTguOTd6IiAvPjwvZz4KPGcgaWQ9InBpZS1jaGFydC1vdXRsaW5lZCI+PHBhdGggZD0iTTEyIDJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyem0xIDIuMDdjMy42MS40NSA2LjQ4IDMuMzMgNi45MyA2LjkzSDEzVjQuMDd6TTQgMTJjMC00LjA2IDMuMDctNy40NCA3LTcuOTN2MTUuODdjLTMuOTMtLjUtNy0zLjg4LTctNy45NHptOSA3LjkzVjEzaDYuOTNjLS40NSAzLjYxLTMuMzIgNi40OC02LjkzIDYuOTN6IiAvPjwvZz4KPGcgaWQ9InB1Ymxpc2giPjxwYXRoIGQ9Ik01IDR2MmgxNFY0SDV6bTAgMTBoNHY2aDZ2LTZoNGwtNy03LTcgN3oiIC8+PC9nPgo8ZyBpZD0ic2hvcnQtdGV4dCI+PHBhdGggZD0iTTQgOWgxNnYySDR6bTAgNGgxMHYySDR6IiAvPjwvZz4KPGcgaWQ9InNob3ctY2hhcnQiPjxwYXRoIGQ9Ik0zLjUgMTguNDlsNi02LjAxIDQgNEwyMiA2LjkybC0xLjQxLTEuNDEtNy4wOSA3Ljk3LTQtNEwyIDE2Ljk5eiIgLz48L2c+CjxnIGlkPSJzcGFjZS1iYXIiPjxwYXRoIGQ9Ik0xOCA5djRINlY5SDR2NmgxNlY5eiIgLz48L2c+CjxnIGlkPSJzdHJpa2V0aHJvdWdoLXMiPjxwYXRoIGQ9Ik03LjI0IDguNzVjLS4yNi0uNDgtLjM5LTEuMDMtLjM5LTEuNjcgMC0uNjEuMTMtMS4xNi40LTEuNjcuMjYtLjUuNjMtLjkzIDEuMTEtMS4yOS40OC0uMzUgMS4wNS0uNjMgMS43LS44My42Ni0uMTkgMS4zOS0uMjkgMi4xOC0uMjkuODEgMCAxLjU0LjExIDIuMjEuMzQuNjYuMjIgMS4yMy41NCAxLjY5Ljk0LjQ3LjQuODMuODggMS4wOCAxLjQzLjI1LjU1LjM4IDEuMTUuMzggMS44MWgtMy4wMWMwLS4zMS0uMDUtLjU5LS4xNS0uODUtLjA5LS4yNy0uMjQtLjQ5LS40NC0uNjgtLjItLjE5LS40NS0uMzMtLjc1LS40NC0uMy0uMS0uNjYtLjE2LTEuMDYtLjE2LS4zOSAwLS43NC4wNC0xLjAzLjEzLS4yOS4wOS0uNTMuMjEtLjcyLjM2LS4xOS4xNi0uMzQuMzQtLjQ0LjU1LS4xLjIxLS4xNS40My0uMTUuNjYgMCAuNDguMjUuODguNzQgMS4yMS4zOC4yNS43Ny40OCAxLjQxLjdINy4zOWMtLjA1LS4wOC0uMTEtLjE3LS4xNS0uMjV6TTIxIDEydi0ySDN2Mmg5LjYyYy4xOC4wNy40LjE0LjU1LjIuMzcuMTcuNjYuMzQuODcuNTEuMjEuMTcuMzUuMzYuNDMuNTcuMDcuMi4xMS40My4xMS42OSAwIC4yMy0uMDUuNDUtLjE0LjY2LS4wOS4yLS4yMy4zOC0uNDIuNTMtLjE5LjE1LS40Mi4yNi0uNzEuMzUtLjI5LjA4LS42My4xMy0xLjAxLjEzLS40MyAwLS44My0uMDQtMS4xOC0uMTNzLS42Ni0uMjMtLjkxLS40MmMtLjI1LS4xOS0uNDUtLjQ0LS41OS0uNzUtLjE0LS4zMS0uMjUtLjc2LS4yNS0xLjIxSDYuNGMwIC41NS4wOCAxLjEzLjI0IDEuNTguMTYuNDUuMzcuODUuNjUgMS4yMS4yOC4zNS42LjY2Ljk4LjkyLjM3LjI2Ljc4LjQ4IDEuMjIuNjUuNDQuMTcuOS4zIDEuMzguMzkuNDguMDguOTYuMTMgMS40NC4xMy44IDAgMS41My0uMDkgMi4xOC0uMjhzMS4yMS0uNDUgMS42Ny0uNzljLjQ2LS4zNC44Mi0uNzcgMS4wNy0xLjI3cy4zOC0xLjA3LjM4LTEuNzFjMC0uNi0uMS0xLjE0LS4zMS0xLjYxLS4wNS0uMTEtLjExLS4yMy0uMTctLjMzSDIxeiIgLz48L2c+CjxnIGlkPSJ0ZXh0LWZpZWxkcyI+PHBhdGggZD0iTTIuNSA0djNoNXYxMmgzVjdoNVY0aC0xM3ptMTkgNWgtOXYzaDN2N2gzdi03aDNWOXoiIC8+PC9nPgo8ZyBpZD0idGl0bGUiPjxwYXRoIGQ9Ik01IDR2M2g1LjV2MTJoM1Y3SDE5VjR6IiAvPjwvZz4KPGcgaWQ9InZlcnRpY2FsLWFsaWduLWJvdHRvbSI+PHBhdGggZD0iTTE2IDEzaC0zVjNoLTJ2MTBIOGw0IDQgNC00ek00IDE5djJoMTZ2LTJINHoiIC8+PC9nPgo8ZyBpZD0idmVydGljYWwtYWxpZ24tY2VudGVyIj48cGF0aCBkPSJNOCAxOWgzdjRoMnYtNGgzbC00LTQtNCA0em04LTE0aC0zVjFoLTJ2NEg4bDQgNCA0LTR6TTQgMTF2MmgxNnYtMkg0eiIgLz48L2c+CjxnIGlkPSJ2ZXJ0aWNhbC1hbGlnbi10b3AiPjxwYXRoIGQ9Ik04IDExaDN2MTBoMlYxMWgzbC00LTQtNCA0ek00IDN2MmgxNlYzSDR6IiAvPjwvZz4KPGcgaWQ9IndyYXAtdGV4dCI+PHBhdGggZD0iTTQgMTloNnYtMkg0djJ6TTIwIDVINHYyaDE2VjV6bS0zIDZINHYyaDEzLjI1YzEuMSAwIDIgLjkgMiAycy0uOSAyLTIgMkgxNXYtMmwtMyAzIDMgM3YtMmgyYzIuMjEgMCA0LTEuNzkgNC00cy0xLjc5LTQtNC00eiIgLz48L2c+CjwvZGVmcz48L3N2Zz4KPC9pcm9uLWljb25zZXQtc3ZnPgoKCgo8aXJvbi1pY29uc2V0LXN2ZyBuYW1lPSJoYXJkd2FyZSIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iY2FzdCI+PHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2M2gyVjVoMTh2MTRoLTd2Mmg3YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6TTEgMTh2M2gzYzAtMS42Ni0xLjM0LTMtMy0zem0wLTR2MmMyLjc2IDAgNSAyLjI0IDUgNWgyYzAtMy44Ny0zLjEzLTctNy03em0wLTR2MmM0Ljk3IDAgOSA0LjAzIDkgOWgyYzAtNi4wOC00LjkzLTExLTExLTExeiIgLz48L2c+CjxnIGlkPSJjYXN0LWNvbm5lY3RlZCI+PHBhdGggZD0iTTEgMTh2M2gzYzAtMS42Ni0xLjM0LTMtMy0zem0wLTR2MmMyLjc2IDAgNSAyLjI0IDUgNWgyYzAtMy44Ny0zLjEzLTctNy03em0xOC03SDV2MS42M2MzLjk2IDEuMjggNy4wOSA0LjQxIDguMzcgOC4zN0gxOVY3ek0xIDEwdjJjNC45NyAwIDkgNC4wMyA5IDloMmMwLTYuMDgtNC45My0xMS0xMS0xMXptMjAtN0gzYy0xLjEgMC0yIC45LTIgMnYzaDJWNWgxOHYxNGgtN3YyaDdjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0iY29tcHV0ZXIiPjxwYXRoIGQ9Ik0yMCAxOGMxLjEgMCAxLjk5LS45IDEuOTktMkwyMiA2YzAtMS4xLS45LTItMi0ySDRjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJIMHYyaDI0di0yaC00ek00IDZoMTZ2MTBINFY2eiIgLz48L2c+CjxnIGlkPSJkZXNrdG9wLW1hYyI+PHBhdGggZD0iTTIxIDJIM2MtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmg3bC0yIDN2MWg4di0xbC0yLTNoN2MxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0wIDEySDNWNGgxOHYxMHoiIC8+PC9nPgo8ZyBpZD0iZGVza3RvcC13aW5kb3dzIj48cGF0aCBkPSJNMjEgMkgzYy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDd2Mkg4djJoOHYtMmgtMnYtMmg3YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bTAgMTRIM1Y0aDE4djEyeiIgLz48L2c+CjxnIGlkPSJkZXZlbG9wZXItYm9hcmQiPjxwYXRoIGQ9Ik0yMiA5VjdoLTJWNWMwLTEuMS0uOS0yLTItMkg0Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0ydi0yaDJ2LTJoLTJ2LTJoMnYtMmgtMlY5aDJ6bS00IDEwSDRWNWgxNHYxNHpNNiAxM2g1djRINnptNi02aDR2M2gtNHpNNiA3aDV2NUg2em02IDRoNHY2aC00eiIgLz48L2c+CjxnIGlkPSJkZXZpY2UtaHViIj48cGF0aCBkPSJNMTcgMTZsLTQtNFY4LjgyQzE0LjE2IDguNCAxNSA3LjMgMTUgNmMwLTEuNjYtMS4zNC0zLTMtM1M5IDQuMzQgOSA2YzAgMS4zLjg0IDIuNCAyIDIuODJWMTJsLTQgNEgzdjVoNXYtMy4wNWw0LTQuMiA0IDQuMlYyMWg1di01aC00eiIgLz48L2c+CjxnIGlkPSJkZXZpY2VzLW90aGVyIj48cGF0aCBkPSJNMyA2aDE4VjRIM2MtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmg0di0ySDNWNnptMTAgNkg5djEuNzhjLS42MS41NS0xIDEuMzMtMSAyLjIycy4zOSAxLjY3IDEgMi4yMlYyMGg0di0xLjc4Yy42MS0uNTUgMS0xLjM0IDEtMi4yMnMtLjM5LTEuNjctMS0yLjIyVjEyem0tMiA1LjVjLS44MyAwLTEuNS0uNjctMS41LTEuNXMuNjctMS41IDEuNS0xLjUgMS41LjY3IDEuNSAxLjUtLjY3IDEuNS0xLjUgMS41ek0yMiA4aC02Yy0uNSAwLTEgLjUtMSAxdjEwYzAgLjUuNSAxIDEgMWg2Yy41IDAgMS0uNSAxLTFWOWMwLS41LS41LTEtMS0xem0tMSAxMGgtNHYtOGg0djh6IiAvPjwvZz4KPGcgaWQ9ImRvY2siPjxwYXRoIGQ9Ik04IDIzaDh2LTJIOHYyem04LTIxLjk5TDggMWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMS45OS0yLTEuOTl6TTE2IDE1SDhWNWg4djEweiIgLz48L2c+CjxnIGlkPSJnYW1lcGFkIj48cGF0aCBkPSJNMTUgNy41VjJIOXY1LjVsMyAzIDMtM3pNNy41IDlIMnY2aDUuNWwzLTMtMy0zek05IDE2LjVWMjJoNnYtNS41bC0zLTMtMyAzek0xNi41IDlsLTMgMyAzIDNIMjJWOWgtNS41eiIgLz48L2c+CjxnIGlkPSJoZWFkc2V0Ij48cGF0aCBkPSJNMTIgMWMtNC45NyAwLTkgNC4wMy05IDl2N2MwIDEuNjYgMS4zNCAzIDMgM2gzdi04SDV2LTJjMC0zLjg3IDMuMTMtNyA3LTdzNyAzLjEzIDcgN3YyaC00djhoM2MxLjY2IDAgMy0xLjM0IDMtM3YtN2MwLTQuOTctNC4wMy05LTktOXoiIC8+PC9nPgo8ZyBpZD0iaGVhZHNldC1taWMiPjxwYXRoIGQ9Ik0xMiAxYy00Ljk3IDAtOSA0LjAzLTkgOXY3YzAgMS42NiAxLjM0IDMgMyAzaDN2LThINXYtMmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3djJoLTR2OGg0djFoLTd2Mmg2YzEuNjYgMCAzLTEuMzQgMy0zVjEwYzAtNC45Ny00LjAzLTktOS05eiIgLz48L2c+CjxnIGlkPSJrZXlib2FyZCI+PHBhdGggZD0iTTIwIDVINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE3YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnptLTkgM2gydjJoLTJWOHptMCAzaDJ2MmgtMnYtMnpNOCA4aDJ2Mkg4Vjh6bTAgM2gydjJIOHYtMnptLTEgMkg1di0yaDJ2MnptMC0zSDVWOGgydjJ6bTkgN0g4di0yaDh2MnptMC00aC0ydi0yaDJ2MnptMC0zaC0yVjhoMnYyem0zIDNoLTJ2LTJoMnYyem0wLTNoLTJWOGgydjJ6IiAvPjwvZz4KPGcgaWQ9ImtleWJvYXJkLWFycm93LWRvd24iPjxwYXRoIGQ9Ik03LjQxIDcuODRMMTIgMTIuNDJsNC41OS00LjU4TDE4IDkuMjVsLTYgNi02LTZ6IiAvPjwvZz4KPGcgaWQ9ImtleWJvYXJkLWFycm93LWxlZnQiPjxwYXRoIGQ9Ik0xNS40MSAxNi4wOWwtNC41OC00LjU5IDQuNTgtNC41OUwxNCA1LjVsLTYgNiA2IDZ6IiAvPjwvZz4KPGcgaWQ9ImtleWJvYXJkLWFycm93LXJpZ2h0Ij48cGF0aCBkPSJNOC41OSAxNi4zNGw0LjU4LTQuNTktNC41OC00LjU5TDEwIDUuNzVsNiA2LTYgNnoiIC8+PC9nPgo8ZyBpZD0ia2V5Ym9hcmQtYXJyb3ctdXAiPjxwYXRoIGQ9Ik03LjQxIDE1LjQxTDEyIDEwLjgzbDQuNTkgNC41OEwxOCAxNGwtNi02LTYgNnoiIC8+PC9nPgo8ZyBpZD0ia2V5Ym9hcmQtYmFja3NwYWNlIj48cGF0aCBkPSJNMjEgMTFINi44M2wzLjU4LTMuNTlMOSA2bC02IDYgNiA2IDEuNDEtMS40MUw2LjgzIDEzSDIxeiIgLz48L2c+CjxnIGlkPSJrZXlib2FyZC1jYXBzbG9jayI+PHBhdGggZD0iTTEyIDguNDFMMTYuNTkgMTMgMTggMTEuNTlsLTYtNi02IDZMNy40MSAxMyAxMiA4LjQxek02IDE4aDEydi0ySDZ2MnoiIC8+PC9nPgo8ZyBpZD0ia2V5Ym9hcmQtaGlkZSI+PHBhdGggZD0iTTIwIDNINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE1YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTkgM2gydjJoLTJWNnptMCAzaDJ2MmgtMlY5ek04IDZoMnYySDhWNnptMCAzaDJ2Mkg4Vjl6bS0xIDJINVY5aDJ2MnptMC0zSDVWNmgydjJ6bTkgN0g4di0yaDh2MnptMC00aC0yVjloMnYyem0wLTNoLTJWNmgydjJ6bTMgM2gtMlY5aDJ2MnptMC0zaC0yVjZoMnYyem0tNyAxNWw0LTRIOGw0IDR6IiAvPjwvZz4KPGcgaWQ9ImtleWJvYXJkLXJldHVybiI+PHBhdGggZD0iTTE5IDd2NEg1LjgzbDMuNTgtMy41OUw4IDZsLTYgNiA2IDYgMS40MS0xLjQxTDUuODMgMTNIMjFWN3oiIC8+PC9nPgo8ZyBpZD0ia2V5Ym9hcmQtdGFiIj48cGF0aCBkPSJNMTEuNTkgNy40MUwxNS4xNyAxMUgxdjJoMTQuMTdsLTMuNTkgMy41OUwxMyAxOGw2LTYtNi02LTEuNDEgMS40MXpNMjAgNnYxMmgyVjZoLTJ6IiAvPjwvZz4KPGcgaWQ9ImtleWJvYXJkLXZvaWNlIj48cGF0aCBkPSJNMTIgMTVjMS42NiAwIDIuOTktMS4zNCAyLjk5LTNMMTUgNmMwLTEuNjYtMS4zNC0zLTMtM1M5IDQuMzQgOSA2djZjMCAxLjY2IDEuMzQgMyAzIDN6bTUuMy0zYzAgMy0yLjU0IDUuMS01LjMgNS4xUzYuNyAxNSA2LjcgMTJINWMwIDMuNDIgMi43MiA2LjIzIDYgNi43MlYyMmgydi0zLjI4YzMuMjgtLjQ4IDYtMy4zIDYtNi43MmgtMS43eiIgLz48L2c+CjxnIGlkPSJsYXB0b3AiPjxwYXRoIGQ9Ik0yMCAxOGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0ySDRjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJIMHYyaDI0di0yaC00ek00IDZoMTZ2MTBINFY2eiIgLz48L2c+CjxnIGlkPSJsYXB0b3AtY2hyb21lYm9vayI+PHBhdGggZD0iTTIyIDE4VjNIMnYxNUgwdjJoMjR2LTJoLTJ6bS04IDBoLTR2LTFoNHYxem02LTNINFY1aDE2djEweiIgLz48L2c+CjxnIGlkPSJsYXB0b3AtbWFjIj48cGF0aCBkPSJNMjAgMThjMS4xIDAgMS45OS0uOSAxLjk5LTJMMjIgNWMwLTEuMS0uOS0yLTItMkg0Yy0xLjEgMC0yIC45LTIgMnYxMWMwIDEuMS45IDIgMiAySDBjMCAxLjEuOSAyIDIgMmgyMGMxLjEgMCAyLS45IDItMmgtNHpNNCA1aDE2djExSDRWNXptOCAxNGMtLjU1IDAtMS0uNDUtMS0xcy40NS0xIDEtMSAxIC40NSAxIDEtLjQ1IDEtMSAxeiIgLz48L2c+CjxnIGlkPSJsYXB0b3Atd2luZG93cyI+PHBhdGggZD0iTTIwIDE4di0xYzEuMSAwIDEuOTktLjkgMS45OS0yTDIyIDVjMC0xLjEtLjktMi0yLTJINGMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMnYxSDB2MmgyNHYtMmgtNHpNNCA1aDE2djEwSDRWNXoiIC8+PC9nPgo8ZyBpZD0ibWVtb3J5Ij48cGF0aCBkPSJNMTUgOUg5djZoNlY5em0tMiA0aC0ydi0yaDJ2MnptOC0yVjloLTJWN2MwLTEuMS0uOS0yLTItMmgtMlYzaC0ydjJoLTJWM0g5djJIN2MtMS4xIDAtMiAuOS0yIDJ2MkgzdjJoMnYySDN2MmgydjJjMCAxLjEuOSAyIDIgMmgydjJoMnYtMmgydjJoMnYtMmgyYzEuMSAwIDItLjkgMi0ydi0yaDJ2LTJoLTJ2LTJoMnptLTQgNkg3VjdoMTB2MTB6IiAvPjwvZz4KPGcgaWQ9Im1vdXNlIj48cGF0aCBkPSJNMTMgMS4wN1Y5aDdjMC00LjA4LTMuMDUtNy40NC03LTcuOTN6TTQgMTVjMCA0LjQyIDMuNTggOCA4IDhzOC0zLjU4IDgtOHYtNEg0djR6bTctMTMuOTNDNy4wNSAxLjU2IDQgNC45MiA0IDloN1YxLjA3eiIgLz48L2c+CjxnIGlkPSJwaG9uZS1hbmRyb2lkIj48cGF0aCBkPSJNMTYgMUg4QzYuMzQgMSA1IDIuMzQgNSA0djE2YzAgMS42NiAxLjM0IDMgMyAzaDhjMS42NiAwIDMtMS4zNCAzLTNWNGMwLTEuNjYtMS4zNC0zLTMtM3ptLTIgMjBoLTR2LTFoNHYxem0zLjI1LTNINi43NVY0aDEwLjV2MTR6IiAvPjwvZz4KPGcgaWQ9InBob25lLWlwaG9uZSI+PHBhdGggZD0iTTE1LjUgMWgtOEM2LjEyIDEgNSAyLjEyIDUgMy41djE3QzUgMjEuODggNi4xMiAyMyA3LjUgMjNoOGMxLjM4IDAgMi41LTEuMTIgMi41LTIuNXYtMTdDMTggMi4xMiAxNi44OCAxIDE1LjUgMXptLTQgMjFjLS44MyAwLTEuNS0uNjctMS41LTEuNXMuNjctMS41IDEuNS0xLjUgMS41LjY3IDEuNSAxLjUtLjY3IDEuNS0xLjUgMS41em00LjUtNEg3VjRoOXYxNHoiIC8+PC9nPgo8ZyBpZD0icGhvbmVsaW5rIj48cGF0aCBkPSJNNCA2aDE4VjRINGMtMS4xIDAtMiAuOS0yIDJ2MTFIMHYzaDE0di0zSDRWNnptMTkgMmgtNmMtLjU1IDAtMSAuNDUtMSAxdjEwYzAgLjU1LjQ1IDEgMSAxaDZjLjU1IDAgMS0uNDUgMS0xVjljMC0uNTUtLjQ1LTEtMS0xem0tMSA5aC00di03aDR2N3oiIC8+PC9nPgo8ZyBpZD0icGhvbmVsaW5rLW9mZiI+PHBhdGggZD0iTTIyIDZWNEg2LjgybDIgMkgyMnpNMS45MiAxLjY1TC42NSAyLjkybDEuODIgMS44MkMyLjE4IDUuMDggMiA1LjUyIDIgNnYxMUgwdjNoMTcuNzNsMi4zNSAyLjM1IDEuMjctMS4yN0wzLjg5IDMuNjIgMS45MiAxLjY1ek00IDYuMjdMMTQuNzMgMTdINFY2LjI3ek0yMyA4aC02Yy0uNTUgMC0xIC40NS0xIDF2NC4xOGwyIDJWMTBoNHY3aC0yLjE4bDMgM0gyM2MuNTUgMCAxLS40NSAxLTFWOWMwLS41NS0uNDUtMS0xLTF6IiAvPjwvZz4KPGcgaWQ9InBvd2VyLWlucHV0Ij48cGF0aCBkPSJNMiA5djJoMTlWOUgyem0wIDZoNXYtMkgydjJ6bTcgMGg1di0ySDl2MnptNyAwaDV2LTJoLTV2MnoiIC8+PC9nPgo8ZyBpZD0icm91dGVyIj48cGF0aCBkPSJNMjAuMiA1LjlsLjgtLjhDMTkuNiAzLjcgMTcuOCAzIDE2IDNzLTMuNi43LTUgMi4xbC44LjhDMTMgNC44IDE0LjUgNC4yIDE2IDQuMnMzIC42IDQuMiAxLjd6bS0uOS44Yy0uOS0uOS0yLjEtMS40LTMuMy0xLjRzLTIuNC41LTMuMyAxLjRsLjguOGMuNy0uNyAxLjYtMSAyLjUtMSAuOSAwIDEuOC4zIDIuNSAxbC44LS44ek0xOSAxM2gtMlY5aC0ydjRINWMtMS4xIDAtMiAuOS0yIDJ2NGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0ydi00YzAtMS4xLS45LTItMi0yek04IDE4SDZ2LTJoMnYyem0zLjUgMGgtMnYtMmgydjJ6bTMuNSAwaC0ydi0yaDJ2MnoiIC8+PC9nPgo8ZyBpZD0ic2Nhbm5lciI+PHBhdGggZD0iTTE5LjggMTAuN0w0LjIgNWwtLjcgMS45TDE3LjYgMTJINWMtMS4xIDAtMiAuOS0yIDJ2NGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0ydi01LjVjMC0uOC0uNS0xLjYtMS4yLTEuOHpNNyAxN0g1di0yaDJ2MnptMTIgMEg5di0yaDEwdjJ6IiAvPjwvZz4KPGcgaWQ9InNlY3VyaXR5Ij48cGF0aCBkPSJNMTIgMUwzIDV2NmMwIDUuNTUgMy44NCAxMC43NCA5IDEyIDUuMTYtMS4yNiA5LTYuNDUgOS0xMlY1bC05LTR6bTAgMTAuOTloN2MtLjUzIDQuMTItMy4yOCA3Ljc5LTcgOC45NFYxMkg1VjYuM2w3LTMuMTF2OC44eiIgLz48L2c+CjxnIGlkPSJzaW0tY2FyZCI+PHBhdGggZD0iTTE5Ljk5IDRjMC0xLjEtLjg5LTItMS45OS0yaC04TDQgOHYxMmMwIDEuMS45IDIgMiAyaDEyLjAxYzEuMSAwIDEuOTktLjkgMS45OS0ybC0uMDEtMTZ6TTkgMTlIN3YtMmgydjJ6bTggMGgtMnYtMmgydjJ6bS04LTRIN3YtNGgydjR6bTQgNGgtMnYtNGgydjR6bTAtNmgtMnYtMmgydjJ6bTQgMmgtMnYtNGgydjR6IiAvPjwvZz4KPGcgaWQ9InNtYXJ0cGhvbmUiPjxwYXRoIGQ9Ik0xNyAxLjAxTDcgMWMtMS4xIDAtMiAuOS0yIDJ2MThjMCAxLjEuOSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTEuOTktMi0xLjk5ek0xNyAxOUg3VjVoMTB2MTR6IiAvPjwvZz4KPGcgaWQ9InNwZWFrZXIiPjxwYXRoIGQ9Ik0xNyAySDdjLTEuMSAwLTIgLjktMiAydjE2YzAgMS4xLjkgMS45OSAyIDEuOTlMMTcgMjJjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTUgMmMxLjEgMCAyIC45IDIgMnMtLjkgMi0yIDJjLTEuMTEgMC0yLS45LTItMnMuODktMiAyLTJ6bTAgMTZjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1em0wLThjLTEuNjYgMC0zIDEuMzQtMyAzczEuMzQgMyAzIDMgMy0xLjM0IDMtMy0xLjM0LTMtMy0zeiIgLz48L2c+CjxnIGlkPSJzcGVha2VyLWdyb3VwIj48cGF0aCBkPSJNMTguMiAxSDkuOEM4LjgxIDEgOCAxLjgxIDggMi44djE0LjRjMCAuOTkuODEgMS43OSAxLjggMS43OWw4LjQuMDFjLjk5IDAgMS44LS44MSAxLjgtMS44VjIuOGMwLS45OS0uODEtMS44LTEuOC0xLjh6TTE0IDNjMS4xIDAgMiAuODkgMiAycy0uOSAyLTIgMi0yLS44OS0yLTIgLjktMiAyLTJ6bTAgMTMuNWMtMi4yMSAwLTQtMS43OS00LTRzMS43OS00IDQtNCA0IDEuNzkgNCA0LTEuNzkgNC00IDR6IiAvPjxjaXJjbGUgY3g9IjE0IiBjeT0iMTIuNSIgcj0iMi41IiAvPjxwYXRoIGQ9Ik02IDVINHYxNmMwIDEuMS44OSAyIDIgMmgxMHYtMkg2VjV6IiAvPjwvZz4KPGcgaWQ9InRhYmxldCI+PHBhdGggZD0iTTIxIDRIM2MtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAxLjk5LS45IDEuOTktMkwyMyA2YzAtMS4xLS45LTItMi0yem0tMiAxNEg1VjZoMTR2MTJ6IiAvPjwvZz4KPGcgaWQ9InRhYmxldC1hbmRyb2lkIj48cGF0aCBkPSJNMTggMEg2QzQuMzQgMCAzIDEuMzQgMyAzdjE4YzAgMS42NiAxLjM0IDMgMyAzaDEyYzEuNjYgMCAzLTEuMzQgMy0zVjNjMC0xLjY2LTEuMzQtMy0zLTN6bS00IDIyaC00di0xaDR2MXptNS4yNS0zSDQuNzVWM2gxNC41djE2eiIgLz48L2c+CjxnIGlkPSJ0YWJsZXQtbWFjIj48cGF0aCBkPSJNMTguNSAwaC0xNEMzLjEyIDAgMiAxLjEyIDIgMi41djE5QzIgMjIuODggMy4xMiAyNCA0LjUgMjRoMTRjMS4zOCAwIDIuNS0xLjEyIDIuNS0yLjV2LTE5QzIxIDEuMTIgMTkuODggMCAxOC41IDB6bS03IDIzYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVzLjY3LTEuNSAxLjUtMS41IDEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXptNy41LTRINFYzaDE1djE2eiIgLz48L2c+CjxnIGlkPSJ0b3lzIj48cGF0aCBkPSJNMTIgMTJjMC0zIDIuNS01LjUgNS41LTUuNVMyMyA5IDIzIDEySDEyem0wIDBjMCAzLTIuNSA1LjUtNS41IDUuNVMxIDE1IDEgMTJoMTF6bTAgMGMtMyAwLTUuNS0yLjUtNS41LTUuNVM5IDEgMTIgMXYxMXptMCAwYzMgMCA1LjUgMi41IDUuNSA1LjVTMTUgMjMgMTIgMjNWMTJ6IiAvPjwvZz4KPGcgaWQ9InR2Ij48cGF0aCBkPSJNMjEgM0gzYy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDV2Mmg4di0yaDVjMS4xIDAgMS45OS0uOSAxLjk5LTJMMjMgNWMwLTEuMS0uOS0yLTItMnptMCAxNEgzVjVoMTh2MTJ6IiAvPjwvZz4KPGcgaWQ9InZpZGVvZ2FtZS1hc3NldCI+PHBhdGggZD0iTTIxIDZIM2MtMS4xIDAtMiAuOS0yIDJ2OGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bS0xMCA3SDh2M0g2di0zSDN2LTJoM1Y4aDJ2M2gzdjJ6bTQuNSAyYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVzLjY3LTEuNSAxLjUtMS41IDEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXptNC0zYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVTMTguNjcgOSAxOS41IDlzMS41LjY3IDEuNSAxLjUtLjY3IDEuNS0xLjUgMS41eiIgLz48L2c+CjxnIGlkPSJ3YXRjaCI+PHBhdGggZD0iTTIwIDEyYzAtMi41NC0xLjE5LTQuODEtMy4wNC02LjI3TDE2IDBIOGwtLjk1IDUuNzNDNS4xOSA3LjE5IDQgOS40NSA0IDEyczEuMTkgNC44MSAzLjA1IDYuMjdMOCAyNGg4bC45Ni01LjczQzE4LjgxIDE2LjgxIDIwIDE0LjU0IDIwIDEyek02IDEyYzAtMy4zMSAyLjY5LTYgNi02czYgMi42OSA2IDYtMi42OSA2LTYgNi02LTIuNjktNi02eiIgLz48L2c+CjwvZGVmcz48L3N2Zz4KPC9pcm9uLWljb25zZXQtc3ZnPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLXBhZ2VzIj4KCiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKDpub3Qoc2xvdCk6bm90KC5pcm9uLXNlbGVjdGVkKSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXRhYiI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWlubGluZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItanVzdGlmaWVkOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LWF1dG87CgogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBwYWRkaW5nOiAwIDEycHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWI7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtsaW5rXSkgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC50YWItY29udGVudCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xcyBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDEsIDEpOwogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItY2VudGVyOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LWF1dG87CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiLWNvbnRlbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpub3QoLmlyb24tc2VsZWN0ZWQpKSA+IC50YWItY29udGVudCB7CiAgICAgICAgb3BhY2l0eTogMC44OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWItY29udGVudC11bnNlbGVjdGVkOwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpIC50YWItY29udGVudCB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICBmb250LXdlaWdodDogNzAwOwogICAgICB9CgogICAgICBwYXBlci1yaXBwbGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10YWItaW5rLCB2YXIoLS1wYXBlci15ZWxsb3ctYTEwMCkpOwogICAgICB9CgogICAgICAudGFiLWNvbnRlbnQgPiA6OnNsb3R0ZWQoYSkgewogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LWF1dG87CgogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGNsYXNzPSJ0YWItY29udGVudCI+CiAgICAgIDxzbG90Pjwvc2xvdD4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgo8aXJvbi1pY29uc2V0LXN2ZyBuYW1lPSJwYXBlci10YWJzIiBzaXplPSIyNCI+Cjxzdmc+PGRlZnM+CjxnIGlkPSJjaGV2cm9uLWxlZnQiPjxwYXRoIGQ9Ik0xNS40MSA3LjQxTDE0IDZsLTYgNiA2IDYgMS40MS0xLjQxTDEwLjgzIDEyeiIgLz48L2c+CjxnIGlkPSJjaGV2cm9uLXJpZ2h0Ij48cGF0aCBkPSJNMTAgNkw4LjU5IDcuNDEgMTMuMTcgMTJsLTQuNTggNC41OUwxMCAxOGw2LTZ6IiAvPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXRhYnMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwoKICAgICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwoKICAgICAgICAvKiBOT1RFOiBCb3RoIHZhbHVlcyBhcmUgbmVlZGVkLCBzaW5jZSBzb21lIHBob25lcyByZXF1aXJlIHRoZSB2YWx1ZSB0byBiZSBgdHJhbnNwYXJlbnRgLiAqLwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTsKICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWJzOwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbC1yZXZlcnNlOwogICAgICB9CgogICAgICAjdGFic0NvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWJzLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgLW1vei1mbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIC1tcy1mbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFicy1jb250ZW50OwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQuc2Nyb2xsYWJsZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudDpub3QoLnNjcm9sbGFibGUpLAogICAgICAjdGFic0NvbnRlbnQuc2Nyb2xsYWJsZS5maXQtY29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUuZml0LWNvbnRhaW5lciB7CiAgICAgICAgbWluLXdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQuc2Nyb2xsYWJsZS5maXQtY29udGFpbmVyID4gOjpzbG90dGVkKCopIHsKICAgICAgICAvKiBJRSAtIHByZXZlbnQgdGFicyBmcm9tIGNvbXByZXNzaW5nIHdoZW4gdGhleSBzaG91bGQgc2Nyb2xsLiAqLwogICAgICAgIC1tcy1mbGV4OiAxIDAgYXV0bzsKICAgICAgICAtd2Via2l0LWZsZXg6IDEgMCBhdXRvOwogICAgICAgIGZsZXg6IDEgMCBhdXRvOwogICAgICB9CgogICAgICAuaGlkZGVuIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAubm90LXZpc2libGUgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgd2lkdGg6IDQ4cHg7CiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgbWFyZ2luOiAwIDRweDsKICAgICAgfQoKICAgICAgI3NlbGVjdGlvbkJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGhlaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgdmFyKC0tcGFwZXItdGFicy1zZWxlY3Rpb24tYmFyLWNvbG9yLCB2YXIoLS1wYXBlci15ZWxsb3ctYTEwMCkpOwogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm07CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWJzLXNlbGVjdGlvbi1iYXI7CiAgICAgIH0KCiAgICAgICNzZWxlY3Rpb25CYXIuYWxpZ24tYm90dG9tIHsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiBhdXRvOwogICAgICB9CgogICAgICAjc2VsZWN0aW9uQmFyLmV4cGFuZCB7CiAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4xNXM7CiAgICAgICAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMSwgMSk7CiAgICAgIH0KCiAgICAgICNzZWxlY3Rpb25CYXIuY29udHJhY3QgewogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMThzOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wLCAwLjAsIDAuMiwgMSk7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudCA+IDo6c2xvdHRlZCg6bm90KCNzZWxlY3Rpb25CYXIpKSB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJwYXBlci10YWJzOmNoZXZyb24tbGVmdCIgY2xhc3MkPSJbW19jb21wdXRlU2Nyb2xsQnV0dG9uQ2xhc3MoX2xlZnRIaWRkZW4sIHNjcm9sbGFibGUsIGhpZGVTY3JvbGxCdXR0b25zKV1dIiBvbi11cD0iX29uU2Nyb2xsQnV0dG9uVXAiIG9uLWRvd249Il9vbkxlZnRTY3JvbGxCdXR0b25Eb3duIiB0YWJpbmRleD0iLTEiPjwvcGFwZXItaWNvbi1idXR0b24+CgogICAgPGRpdiBpZD0idGFic0NvbnRhaW5lciIgb24tdHJhY2s9Il9zY3JvbGwiIG9uLWRvd249Il9kb3duIj4KICAgICAgPGRpdiBpZD0idGFic0NvbnRlbnQiIGNsYXNzJD0iW1tfY29tcHV0ZVRhYnNDb250ZW50Q2xhc3Moc2Nyb2xsYWJsZSwgZml0Q29udGFpbmVyKV1dIj4KICAgICAgICA8ZGl2IGlkPSJzZWxlY3Rpb25CYXIiIGNsYXNzJD0iW1tfY29tcHV0ZVNlbGVjdGlvbkJhckNsYXNzKG5vQmFyLCBhbGlnbkJvdHRvbSldXSIgb24tdHJhbnNpdGlvbmVuZD0iX29uQmFyVHJhbnNpdGlvbkVuZCI+PC9kaXY+CiAgICAgICAgPHNsb3Q+PC9zbG90PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJwYXBlci10YWJzOmNoZXZyb24tcmlnaHQiIGNsYXNzJD0iW1tfY29tcHV0ZVNjcm9sbEJ1dHRvbkNsYXNzKF9yaWdodEhpZGRlbiwgc2Nyb2xsYWJsZSwgaGlkZVNjcm9sbEJ1dHRvbnMpXV0iIG9uLXVwPSJfb25TY3JvbGxCdXR0b25VcCIgb24tZG93bj0iX29uUmlnaHRTY3JvbGxCdXR0b25Eb3duIiB0YWJpbmRleD0iLTEiPjwvcGFwZXItaWNvbi1idXR0b24+CgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1pbmZlcmVuY2UtcGFuZWwiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpZD0ibGludGVyLXBhcGVyLWJ1dHRvbi1zdHlsZSI+CiAgICAgIC8qKgogICAgICAgKiBUaGlzIHN0eWxlIHByZXNlcnZlcyB0aGUgc3R5bGluZyBwcmV2aW91cyB0bwogICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vUG9seW1lckVsZW1lbnRzL3BhcGVyLWJ1dHRvbi9wdWxsLzExNQogICAgICAgKiBUaGlzIGNoYW5nZSBjYW4gYnJlYWsgdGhlIGxheW91dCBvZiBwYXBlci1idXR0b24gY29udGVudC4KICAgICAgICogUmVtb3ZlIHRoaXMgc3R5bGUgdG8gYXBwbHkgdGhlIGNoYW5nZS4KICAgICAgICovCiAgICAgIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQogICAgICB0Zi1vcHRpb24tc2VsZWN0b3IgLm1vZGVsLXR5cGUtYnV0dG9uIHsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgfQogICAgICAuZmxleC1ob2xkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KICAgICAgLnRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDMycHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsKICAgICAgfQogICAgICAuaGVscC1pY29uIHsKICAgICAgICB3aWR0aDogMTVweDsKICAgICAgICBoZWlnaHQ6IDE1cHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBjb2xvcjogIzc1NzU3NTsKICAgICAgfQogICAgICAudG9vbHRpcCB7CiAgICAgICAgd2lkdGg6IDUwMHB4OwogICAgICB9CiAgICAgIC5pbnB1dC1pbi1yb3cgewogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgfQogICAgICAuZmxleC1ncm93IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLm1vZGVsLXR5cGUtbGFiZWwgewogICAgICAgIHBhZGRpbmctdG9wOiAxMHB4OwogICAgICB9CiAgICAgIC5hZGQtbW9kZWwtYnV0dG9uLWhvbGRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAuY2hlY2tib3ggewogICAgICAgIG1hcmdpbi10b3A6IDMwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgICAgLnByZWRpY3QtY2hlY2tib3ggewogICAgICAgIG1hcmdpbi10b3A6IDQzcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgICAgcGFwZXItaW5wdXQgewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yOiAjZjU3YzAwOwogICAgICB9CiAgICAgIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWNvbG9yOiAjM2M0MDQzOwogICAgICAgIC0tcGFwZXItcmFkaW8tYnV0dG9uLXVuY2hlY2tlZC1pbmstY29sb3I6ICMzYzQwNDM7CiAgICAgICAgLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1jb2xvcjogIzNjNDA0MzsKICAgICAgICAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1jaGVja2VkLWluay1jb2xvcjogIzNjNDA0MzsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9InRpdGxlIj5TZXQgdXAgeW91ciBkYXRhIGFuZCBtb2RlbDwvZGl2PgogICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCBsYWJlbD0iSW5mZXJlbmNlIGFkZHJlc3MiIHBsYWNlaG9sZGVyPSJbW2luZmVyZW5jZUFkZHJlc3MxXV0iIHZhbHVlPSJ7e2luZmVyZW5jZUFkZHJlc3MxfX0iPgogICAgPC9wYXBlci1pbnB1dD4KICAgIDxkaXYgY2xhc3M9ImZsZXgtaG9sZGVyIj4KICAgICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCBsYWJlbD0iTW9kZWwgbmFtZSIgcGxhY2Vob2xkZXI9IltbbW9kZWxOYW1lMV1dIiB2YWx1ZT0ie3ttb2RlbE5hbWUxfX0iIGNsYXNzPSJpbnB1dC1pbi1yb3ciPgogICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8cGFwZXItaW5wdXQgYWx3YXlzLWZsb2F0LWxhYmVsIGxhYmVsPSJNb2RlbCB2ZXJzaW9uIChvcHRpb25hbCkiIHBsYWNlaG9sZGVyPSJbW21vZGVsVmVyc2lvbjFdXSIgdmFsdWU9Int7bW9kZWxWZXJzaW9uMX19IiBjbGFzcz0iaW5wdXQtaW4tcm93Ij4KICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCBsYWJlbD0iTW9kZWwgc2lnbmF0dXJlIChvcHRpb25hbCkiIHBsYWNlaG9sZGVyPSJbW21vZGVsU2lnbmF0dXJlMV1dIiB2YWx1ZT0ie3ttb2RlbFNpZ25hdHVyZTF9fSIgY2xhc3M9ImlucHV0LWluLXJvdyI+CiAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8L2Rpdj4KICAgIDxkaXYgaGlkZGVuJD0ie3toaWRlTW9kZWxQYW5lMn19Ij4KICAgICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCBsYWJlbD0iSW5mZXJlbmNlIGFkZHJlc3MiIHBsYWNlaG9sZGVyPSJbW2luZmVyZW5jZUFkZHJlc3MyXV0iIHZhbHVlPSJ7e2luZmVyZW5jZUFkZHJlc3MyfX0iPgogICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8ZGl2IGNsYXNzPSJmbGV4LWhvbGRlciI+CiAgICAgICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCBsYWJlbD0iTW9kZWwgbmFtZSIgcGxhY2Vob2xkZXI9IltbbW9kZWxOYW1lMl1dIiB2YWx1ZT0ie3ttb2RlbE5hbWUyfX0iIGNsYXNzPSJpbnB1dC1pbi1yb3ciPgogICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCBsYWJlbD0iTW9kZWwgdmVyc2lvbiAob3B0aW9uYWwpIiBwbGFjZWhvbGRlcj0iW1ttb2RlbFZlcnNpb24yXV0iIHZhbHVlPSJ7e21vZGVsVmVyc2lvbjJ9fSIgY2xhc3M9ImlucHV0LWluLXJvdyI+CiAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICA8cGFwZXItaW5wdXQgYWx3YXlzLWZsb2F0LWxhYmVsIGxhYmVsPSJNb2RlbCBzaWduYXR1cmUgKG9wdGlvbmFsKSIgcGxhY2Vob2xkZXI9IltbbW9kZWxTaWduYXR1cmUyXV0iIHZhbHVlPSJ7e21vZGVsU2lnbmF0dXJlMn19IiBjbGFzcz0iaW5wdXQtaW4tcm93Ij4KICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iYWRkLW1vZGVsLWJ1dHRvbi1ob2xkZXIiIGhpZGRlbiQ9Int7IWhpZGVNb2RlbFBhbmUyfX0iPgogICAgICA8cGFwZXItYnV0dG9uIG9uLXRhcD0iYWRkTW9kZWxDbGlja2VkXyIgY2xhc3M9Im1haW4tYnV0dG9uIj4KICAgICAgICBBZGQgYW5vdGhlciBtb2RlbCBmb3IgY29tcGFyaXNvbgogICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iZmxleC1ob2xkZXIiPgogICAgICA8ZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGVsLXR5cGUtbGFiZWwiPk1vZGVsIFR5cGU8L2Rpdj4KICAgICAgICA8cGFwZXItcmFkaW8tZ3JvdXAgc2VsZWN0ZWQ9Int7bW9kZWxUeXBlfX0iPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJjbGFzc2lmaWNhdGlvbiI+Q2xhc3NpZmljYXRpb248L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0icmVncmVzc2lvbiI+UmVncmVzc2lvbjwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgIDwvZGl2PgogICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3t1c2VQcmVkaWN0QXBpfX0iIGNsYXNzPSJwcmVkaWN0LWNoZWNrYm94Ij4KICAgICAgICBVc2VzIFByZWRpY3QgQVBJCiAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImZsZXgtaG9sZGVyIj4KICAgICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCBsYWJlbD0iSW5wdXQgdGVuc29yIG5hbWUiIHBsYWNlaG9sZGVyPSJbW3ByZWRpY3RJbnB1dFRlbnNvcl1dIiB2YWx1ZT0ie3twcmVkaWN0SW5wdXRUZW5zb3J9fSIgY2xhc3M9ImlucHV0LWluLXJvdyIgaGlkZGVuJD0iW1tzaG91bGREaXNhYmxlUHJlZGljdFRlbnNvckNvbnRyb2xzXyh1c2VQcmVkaWN0QXBpKV1dIj4KICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCBsYWJlbD0iT3V0cHV0IHRlbnNvciBuYW1lIiBwbGFjZWhvbGRlcj0iW1twcmVkaWN0T3V0cHV0VGVuc29yXV0iIHZhbHVlPSJ7e3ByZWRpY3RPdXRwdXRUZW5zb3J9fSIgY2xhc3M9ImlucHV0LWluLXJvdyIgaGlkZGVuJD0iW1tzaG91bGREaXNhYmxlUHJlZGljdFRlbnNvckNvbnRyb2xzXyh1c2VQcmVkaWN0QXBpKV1dIj4KICAgICAgPC9wYXBlci1pbnB1dD4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iZmxleC1ob2xkZXIiPgogICAgICA8cGFwZXItaW5wdXQgYWx3YXlzLWZsb2F0LWxhYmVsIGxhYmVsPSJQYXRoIHRvIGV4YW1wbGVzIiB2YWx1ZT0ie3tleGFtcGxlc1BhdGh9fSIgY2xhc3M9ImZsZXgtZ3JvdyI+CiAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e3NlcXVlbmNlRXhhbXBsZXN9fSIgY2xhc3M9ImNoZWNrYm94Ij4KICAgICAgICBTZXF1ZW5jZUV4YW1wbGVzCiAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImZsZXgtaG9sZGVyIj4KICAgICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCB0eXBlPSJudW1iZXIiIGNsYXNzPSJpbnB1dC1pbi1yb3cgZmxleC1ncm93IiBsYWJlbD0iTWF4aW11bSBudW1iZXIgb2YgZXhhbXBsZXMgdG8gbG9hZCIgcGxhY2Vob2xkZXI9IltbbWF4RXhhbXBsZXNdXSIgdmFsdWU9Int7bWF4RXhhbXBsZXN9fSI+CiAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgIDxwYXBlci1pbnB1dCBhbHdheXMtZmxvYXQtbGFiZWwgdHlwZT0ibnVtYmVyIiBjbGFzcz0iaW5wdXQtaW4tcm93IGZsZXgtZ3JvdyIgbGFiZWw9IlNhbXBsaW5nIHJhdGlvICgwLjIgPSBzYW1wbGUgfjIwJSBvZiBleGFtcGxlcykiIHBsYWNlaG9sZGVyPSJbW3NhbXBsaW5nT2Rkc11dIiB2YWx1ZT0ie3tzYW1wbGluZ09kZHN9fSI+CiAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8L2Rpdj4KICAgIDxwYXBlci1pbnB1dCBhbHdheXMtZmxvYXQtbGFiZWwgbGFiZWw9IlBhdGggdG8gbGFiZWwgZGljdGlvbmFyeSAob3B0aW9uYWwpIiBwbGFjZWhvbGRlcj0iW1tsYWJlbFZvY2FiUGF0aF1dIiB2YWx1ZT0ie3tsYWJlbFZvY2FiUGF0aH19IiBkaXNhYmxlZD0iW1tzaG91bGREaXNhYmxlQ2xhc3NpZmljYXRpb25Db250cm9sc18obW9kZWxUeXBlKV1dIj4KICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8ZGl2IGNsYXNzPSJmbGV4LWhvbGRlciI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJoZWxwIiBjbGFzcz0iaGVscC1pY29uIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8ZGl2Pk1hcHMgcHJlZGljdGVkIGNsYXNzIGluZGljZXMgdG8gbGFiZWxzIGZyb20gdGV4dCBmaWxlPC9kaXY+CiAgICAgIDxwYXBlci10b29sdGlwIGNsYXNzPSJ0b29sdGlwIiBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJib3R0b20iIG9mZnNldD0iMCI+CiAgICAgICAgQW4gb3B0aW9uYWwgdGV4dCBmaWxlIGZvciB1c2Ugd2l0aCB0aGUgcmVzdWx0cyBvZiBhIGNsYXNzaWZpY2F0aW9uCiAgICAgICAgbW9kZWwuIENsYXNzaWZpY2F0aW9uIG1vZGVscyByZXR1cm4gcHJlZGljdGVkIGNsYXNzZXMgYXMgaW5kaWNlcy4gSWYgYQogICAgICAgIHZvY2FiIGZpbGUgaXMgcHJvdmlkZWQsIGVhY2ggcHJlZGljdGVkIGNsYXNzIGluZGV4IHdpbGwgYmUgbWFwcGVkIHRvIGEKICAgICAgICBsYWJlbCBmcm9tIHRoaXMgZmlsZSBmb3IgdXNlIGluIHRoZSBkaXNwbGF5LiBFYWNoIGxpbmUgaW4gdGhlIGZpbGUKICAgICAgICBjb3JyZXNwb25kcyB0byBhIGxhYmVsLCB3aXRoIHRoZSBmaXJzdCBsaW5lIGNvcnJlc3BvbmRpbmcgdG8gY2xhc3MgaW5kZXgKICAgICAgICAwLgogICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImZsZXgtaG9sZGVyIj4KICAgICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCB0eXBlPSJudW1iZXIiIGxhYmVsPSJNYXggY2xhc3NlcyB0byBkaXNwbGF5IiBwbGFjZWhvbGRlcj0iW1ttYXhDbGFzc2VzVG9EaXNwbGF5XV0iIHZhbHVlPSJ7e21heENsYXNzZXNUb0Rpc3BsYXl9fSIgY2xhc3M9ImlucHV0LWluLXJvdyIgZGlzYWJsZWQ9Iltbc2hvdWxkRGlzYWJsZU11bHRpQ2xhc3NDb250cm9sc18obXVsdGlDbGFzcyldXSI+CiAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgIDxwYXBlci1jaGVja2JveCBkaXNhYmxlZD0iW1tzaG91bGREaXNhYmxlQ2xhc3NpZmljYXRpb25Db250cm9sc18obW9kZWxUeXBlKV1dIiBjaGVja2VkPSJ7e211bHRpQ2xhc3N9fSIgY2xhc3M9ImNoZWNrYm94Ij4KICAgICAgICBNdWx0aS1jbGFzcyBjbGFzc2lmaWNhdGlvbiBtb2RlbAogICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2ei1iYXItY2hhcnQiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9InRvb2x0aXAiPgogICAgICA8dGFibGU+CiAgICAgICAgPHRoZWFkPgogICAgICAgICAgPHRyIGlkPSJ0b29sdGlwLXRhYmxlLWhlYWRlci1yb3ciPjwvdHI+CiAgICAgICAgPC90aGVhZD4KICAgICAgICA8dGJvZHk+PC90Ym9keT4KICAgICAgPC90YWJsZT4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iY2hhcnRkaXYiPjwvZGl2PgogICAgPHN0eWxlIGluY2x1ZGU9InBsb3R0YWJsZS1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CiAgICAgIGRpdiB7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgfQogICAgICB0ZCB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiA1cHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogNXB4OwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CiAgICAgICN0b29sdGlwIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBib3gtc2hhZG93OiAwIDFweCA0cHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuOCk7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBsaW5lLWhlaWdodDogMS40ZW07CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIHotaW5kZXg6IDU7CiAgICAgICAgY3Vyc29yOiBub25lOwogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgIH0KICAgICAgLnN3YXRjaCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHdpZHRoOiAxNHB4OwogICAgICAgIGhlaWdodDogMTRweDsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDApOwogICAgICB9CiAgICAgIC5jbG9zZXN0IC5zd2F0Y2ggewogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHdoaXRlOwogICAgICB9CiAgICAgIHRoIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDVweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiA1cHg7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWNvbmZ1c2lvbi1tYXRyaXgiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgdGFibGUgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICB0ZCB7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KICAgICAgdGgsCiAgICAgIHRkIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgcGFkZGluZzogM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KICAgICAgLmZsZXggewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICB9CiAgICAgIC5wcmVkLWxhYmVsIHsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgfQogICAgICAudG90YWwtbGFiZWwgewogICAgICAgIGNvbG9yOiAjNWY2MzY4OwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CiAgICAgIC50b3RhbC1jZWxsIHsKICAgICAgICBjb2xvcjogIzVmNjM2ODsKICAgICAgfQogICAgICAuYWN0dWFsLWxhYmVsIHsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgIH0KICAgICAgLm4tbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOwogICAgICB9CiAgICAgIC52YWx1ZS1jZWxsIHsKICAgICAgICBjb2xvcjogIzIwMjEyNDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBsaWdodGdyZXk7CiAgICAgIH0KICAgICAgLnBhcmVudGhldGljYWwgewogICAgICAgIHBhZGRpbmctcmlnaHQ6IDVweDsKICAgICAgICB3aWR0aDogNTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgaWQ9ImhvbGRlciI+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaW5mZXJlbmNlLXZpZXdlciI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLnJ1bnMtaG9sZGVyIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogMjAwcHg7CiAgICAgIH0KICAgICAgLnJvdyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgIH0KICAgICAgLmhlYWRlciB7CiAgICAgICAgY29sb3I6ICM4MDg2OGI7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIHBhZGRpbmc6IDRweCAwOwogICAgICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCAjZGFkY2UwOwogICAgICAgIGJvcmRlci10b3A6IHNvbGlkIDFweCAjZGFkY2UwOwogICAgICB9CiAgICAgIC5kYXJrLXJvdy1vbmUgewogICAgICAgIGJhY2tncm91bmQ6ICNjYmYwZjg7CiAgICAgIH0KICAgICAgLmRhcmstcm93LXR3byB7CiAgICAgICAgYmFja2dyb3VuZDogI2ZmZjNlMDsKICAgICAgfQogICAgICAud2hpdGUtcm93IHsKICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgICAgfQogICAgICAubWFya2VyIHsKICAgICAgICBmbGV4OiAwLjU7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICAgIH0KICAgICAgLm1hcmtlci5tYXJrLW9uZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwN2I4MzsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDFweDsKICAgICAgfQogICAgICAubWFya2VyLm1hcmstdHdvIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmY5ODAwOwogICAgICAgIHBhZGRpbmctbGVmdDogMXB4OwogICAgICB9CiAgICAgIC5ydW4gewogICAgICAgIGZsZXg6IDEwOwogICAgICB9CiAgICAgIC5tdWx0aS1tb2RlbCB7CiAgICAgICAgZmxleDogMTA7CiAgICAgIH0KICAgICAgLm9uZS1tb2RlbCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAuc2hvdy1sYWJlbCB7CiAgICAgICAgZmxleDogMjA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIC5uby1sYWJlbCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAuc2NvcmUgewogICAgICAgIGZsZXg6IDEwOwogICAgICB9CiAgICAgIC5hcnJvdyB7CiAgICAgICAgZmxleDogMjsKICAgICAgfQogICAgICAuZGVsdGEgewogICAgICAgIGZsZXg6IDEwOwogICAgICB9CiAgICAgIC50ZXh0IHsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgIH0KICAgICAgLmdyZWVuIHsKICAgICAgICBjb2xvcjogZ3JlZW47CiAgICAgIH0KICAgICAgLnJlZCB7CiAgICAgICAgY29sb3I6IHJlZDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9InJvdyBoZWFkZXIiPgogICAgICA8ZGl2IGNsYXNzPSJtYXJrZXIiPjwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJydW4iPlJ1bjwvZGl2PgogICAgICA8ZGl2IGNsYXNzJD0iW1tnZXRNb2RlbEhlYWRlckNsYXNzKGluZmVyZW5jZXMpXV0iPk1vZGVsPC9kaXY+CiAgICAgIDxkaXYgY2xhc3MkPSJbW2dldExhYmVsSGVhZGVyQ2xhc3MobW9kZWxUeXBlKV1dIj5MYWJlbDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzY29yZSI+W1tnZXRTY29yZUxhYmVsKG1vZGVsVHlwZSldXTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJhcnJvdyI+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImRlbHRhIj5EZWx0YTwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJydW5zLWhvbGRlciI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbaW5mZXJlbmNlc11dIiBhcz0ibW9kZWxzSW5mZXJlbmNlIiBpbmRleC1hcz0icnVuaW5kZXgiPgogICAgICAgIDxkaXYgY2xhc3M9InJvd3MtZm9yLXJ1biI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW21vZGVsc0luZmVyZW5jZV1dIiBhcz0iaW5mZXJlbmNlIiBpbmRleC1hcz0ibW9kZWxpbmRleCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbZ2V0SW5mZXJlbmNlTGlzdChpbmZlcmVuY2UsIG1heEVudHJpZXNQZXJSdW4pXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3MkPSJbW2dldFJvd0NsYXNzKHJ1bmluZGV4LCBpbmZlcmVuY2VzLCBtb2RlbGluZGV4KV1dIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3MkPSJbW2dldE1hcmtlckNsYXNzKHJ1bmluZGV4LCBpbmZlcmVuY2VzLCBtb2RlbGluZGV4KV1dIj48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJ1biB0ZXh0Ij5bW2dldFJ1bk51bWJlcihydW5pbmRleCldXTwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcyQ9IltbZ2V0TW9kZWxDbGFzcyhpbmZlcmVuY2VzKV1dIj4KICAgICAgICAgICAgICAgICAgPGRpdj5bW2dldE1vZGVsTmFtZShtb2RlbE5hbWVzLCBtb2RlbGluZGV4KV1dPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3MkPSJbW2dldExhYmVsQ2xhc3MobW9kZWxUeXBlKV1dIj4KICAgICAgICAgICAgICAgICAgPGRpdj5bW2dldExhYmVsKGl0ZW0pXV08L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2NvcmUgdGV4dCI+W1tnZXRQcmludGFibGVTY29yZShpdGVtLnNjb3JlKV1dPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhcnJvdyI+CiAgICAgICAgICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iW1tnZXRJY29uKHJ1bmluZGV4LCBpbmRleCwgbW9kZWxpbmRleCldXSIgY2xhc3MkPSJbW2dldEljb25DbGFzcyhydW5pbmRleCwgaW5kZXgsIG1vZGVsaW5kZXgpXV0iPgogICAgICAgICAgICAgICAgICA8L2lyb24taWNvbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVsdGEgdGV4dCI+CiAgICAgICAgICAgICAgICAgIFtbZ2V0UHJpbnRhYmxlRGVsdGEocnVuaW5kZXgsIGluZGV4LCBtb2RlbGluZGV4KV1dCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9ImZhY2V0cy1kaXZlLXZpcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLmxhYmVscyB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWhlYWRsaW5lOwogICAgICB9CiAgICAgIC5yb3RhdGUgewogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDEuNSwgMC41OwogICAgICAgIGFuaW1hdGlvbjogcm90YXRlIDFzIGxpbmVhciBpbmZpbml0ZTsKICAgICAgfQogICAgICBAa2V5ZnJhbWVzIHJvdGF0ZSB7CiAgICAgICAgZnJvbSB7CiAgICAgICAgICBzdHJva2UtZGFzaG9mZnNldDogMDsKICAgICAgICB9CiAgICAgICAgdG8gewogICAgICAgICAgc3Ryb2tlLWRhc2hvZmZzZXQ6IDI7CiAgICAgICAgfQogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBpZD0iaG9sZGVyIj4KICAgICAgCiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0iZmFjZXRzLWRpdmUtY29udHJvbHMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgLm1haW4tY29udHJvbHMgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDYwcHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgIH0KCiAgICAgIC5vdmVyZmxvdy1ob2xkZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgICB9CgogICAgICAjb3ZlcmZsb3dtZW51IHsKICAgICAgICBtYXJnaW46IDAgNDBweDsKICAgICAgfQoKICAgICAgLm92ZXJmbG93LWRpdiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICAub3ZlcmZsb3ctY2hlY2tib3ggewogICAgICAgIG1hcmdpbjogOHB4IDA7CiAgICAgICAgcGFkZGluZwogICAgICB9CgogICAgICAuZHJvcGRvd24taG9sZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIHdpZHRoOiAxNTBweDsKICAgICAgICBtYXJnaW46IDAgMTBweDsKICAgICAgfQoKICAgICAgLmRyb3Bkb3duLXRyaWdnZXIgewogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5leHBhbmQtYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzliOWI5YjsKICAgICAgICAtLXBhcGVyLWljb24tYnV0dG9uLWluay1jb2xvcjogIzliOWI5YjsKICAgICAgfQogICAgICBwYXBlci1tZW51IHBhcGVyLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIGZvbnQtc2l6ZTogMTIuNXB4OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgcGFwZXItaXRlbSB7CiAgICAgICAgcGFkZGluZzogMCAxNHB4OwogICAgICAgIC0tcGFwZXItaXRlbS1taW4taGVpZ2h0OiAzNnB4OwogICAgICB9CiAgICAgIHBhcGVyLWRyb3Bkb3duLW1lbnUgcGFwZXItaXRlbSB7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNjY2M7CiAgICAgIH0KCiAgICAgICN2ZXJ0aWNhbEZhY2V0IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgY29sb3I6IHZhcigtLWdyaWQtZmFjZXRpbmctdmVydGljYWwtbGFiZWwtY29sb3IpOwogICAgICAgIH07CiAgICAgIH0KICAgICAgI2hvcml6b250YWxGYWNldCB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGNvbG9yOiB2YXIoLS1ncmlkLWZhY2V0aW5nLWhvcml6b250YWwtbGFiZWwtY29sb3IpOwogICAgICAgIH07CiAgICAgIH0KICAgICAgI3ZlcnRpY2FsUG9zaXRpb24gewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBjb2xvcjogdmFyKC0taXRlbS1wb3NpdGlvbmluZy12ZXJ0aWNhbC1sYWJlbC1jb2xvcik7CiAgICAgICAgfTsKICAgICAgfQogICAgICAjaG9yaXpvbnRhbFBvc2l0aW9uIHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgY29sb3I6IHZhcigtLWl0ZW0tcG9zaXRpb25pbmctaG9yaXpvbnRhbC1sYWJlbC1jb2xvcik7CiAgICAgICAgfTsKICAgICAgfQogICAgICAudmVydGljYWwtZmFjZXQgewogICAgICAgIGNvbG9yOiB2YXIoLS1ncmlkLWZhY2V0aW5nLXZlcnRpY2FsLWxhYmVsLWNvbG9yKTsKICAgICAgfQogICAgICAuaG9yaXpvbnRhbC1mYWNldCB7CiAgICAgICAgY29sb3I6IHZhcigtLWdyaWQtZmFjZXRpbmctaG9yaXpvbnRhbC1sYWJlbC1jb2xvcik7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLXBvc2l0aW9uIHsKICAgICAgICBjb2xvcjogdmFyKC0taXRlbS1wb3NpdGlvbmluZy12ZXJ0aWNhbC1sYWJlbC1jb2xvcik7CiAgICAgIH0KICAgICAgLmhvcml6b250YWwtcG9zaXRpb24gewogICAgICAgIGNvbG9yOiB2YXIoLS1pdGVtLXBvc2l0aW9uaW5nLWhvcml6b250YWwtbGFiZWwtY29sb3IpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9Im1haW4tY29udHJvbHMiPgogICAgICAgIDxkaXYgY2xhc3M9ImRyb3Bkb3duLWhvbGRlciBob3Jpem9udGFsLWZhY2V0Ij4KICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgaWQ9Imhvcml6b250YWxGYWNldCIgbGFiZWw9IkJpbm5pbmcgfCBYLUF4aXMiIGNsYXNzPSJmYWNldC1zZWxlY3RvciI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e2hvcml6b250YWxGYWNldH19IiBhdHRyLWZvci1zZWxlY3RlZD0idmFsdWUiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IiI+KG5vbmUpPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1trZXlzXV0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSB2YWx1ZT0iW1tpdGVtXV0iPltbX2JyZWFrVXBBbmRUcnVuY2F0ZShpdGVtKV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tob3Jpem9udGFsRmFjZXRdXSI+CiAgICAgICAgICA8cGFwZXItaW5wdXQgdHlwZT0ibnVtYmVyIiBtaW49IjEiIG1heD0iW1tfbWF4QnVja2V0cyhob3Jpem9udGFsRmFjZXQsIGhvcml6b250YWxCYWdPZldvcmRzKV1dIiB2YWx1ZT0ie3tob3Jpem9udGFsQnVja2V0c319IiBsYWJlbD0iQ291bnQiPgogICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgIDxkaXYgY2xhc3M9ImRyb3Bkb3duLWhvbGRlciB2ZXJ0aWNhbC1mYWNldCI+CiAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgaWQ9InZlcnRpY2FsRmFjZXQiIGxhYmVsPSJCaW5uaW5nIHwgWS1BeGlzIiBjbGFzcz0iZmFjZXQtc2VsZWN0b3IiPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e3ZlcnRpY2FsRmFjZXR9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9InZhbHVlIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IiI+KG5vbmUpPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2tleXNdXSI+CiAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IltbaXRlbV1dIj5bW19icmVha1VwQW5kVHJ1bmNhdGUoaXRlbSldXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgIDwvZGl2PgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3ZlcnRpY2FsRmFjZXRdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0IHR5cGU9Im51bWJlciIgbWluPSIxIiBtYXg9IltbX21heEJ1Y2tldHModmVydGljYWxGYWNldCx2ZXJ0aWNhbEJhZ09mV29yZHMpXV0iIHZhbHVlPSJ7e3ZlcnRpY2FsQnVja2V0c319IiBsYWJlbD0iQ291bnQiPgogICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgIDwvdGVtcGxhdGU+CgogICAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi1ob2xkZXIiPgogICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGlkPSJjb2xvckJ5IiBsYWJlbD0iQ29sb3IgQnkiPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e2NvbG9yQnl9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9InZhbHVlIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IiI+KG5vbmUpPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2tleXNdXSI+CiAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IltbaXRlbV1dIj5bW2l0ZW1dXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZHJvcGRvd24taG9sZGVyIj4KICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBpZD0iaW1hZ2VGaWVsZE5hbWUiIGxhYmVsPSJMYWJlbCBCeSI+CiAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7aW1hZ2VGaWVsZE5hbWV9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9InZhbHVlIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IiI+CiAgICAgICAgICAgICAgW1tfZ2V0SW1hZ2VGaWVsZE5hbWVEZWZhdWx0TGFiZWwoYXRsYXNVcmwpXV0KICAgICAgICAgICAgPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2tleXNdXSI+CiAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IltbaXRlbV1dIj5bW2l0ZW1dXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZHJvcGRvd24taG9sZGVyIGhvcml6b250YWwtcG9zaXRpb24iPgogICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGlkPSJob3Jpem9udGFsUG9zaXRpb24iIGxhYmVsPSJTY2F0dGVyIHwgWC1BeGlzIiBjbGFzcz0icG9zaXRpb24tc2VsZWN0b3IiPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e2hvcml6b250YWxQb3NpdGlvbn19IiBhdHRyLWZvci1zZWxlY3RlZD0idmFsdWUiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICA8cGFwZXItaXRlbSB2YWx1ZT0iIj4oZGVmYXVsdCk8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Iltba2V5c11dIiBmaWx0ZXI9Il9pc0tleU51bWVyaWMiPgogICAgICAgICAgICAgIDxwYXBlci1pdGVtIHZhbHVlPSJbW2l0ZW1dXSI+W1tpdGVtXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImRyb3Bkb3duLWhvbGRlciB2ZXJ0aWNhbC1wb3NpdGlvbiI+CiAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgaWQ9InZlcnRpY2FsUG9zaXRpb24iIGxhYmVsPSJTY2F0dGVyIHwgWS1BeGlzIiBjbGFzcz0icG9zaXRpb24tc2VsZWN0b3IiPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e3ZlcnRpY2FsUG9zaXRpb259fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9InZhbHVlIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IiI+KGRlZmF1bHQpPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2tleXNdXSIgZmlsdGVyPSJfaXNLZXlOdW1lcmljIj4KICAgICAgICAgICAgICA8cGFwZXItaXRlbSB2YWx1ZT0iW1tpdGVtXV0iPltbaXRlbV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9Im92ZXJmbG93LWhvbGRlciI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2hvdWxkU2hvd092ZXJmbG93TWVudShjb2xvckJ5LCB2ZXJ0aWNhbEZhY2V0LCBob3Jpem9udGFsRmFjZXQpXV0iPgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0iZHJvcGRvd24tdHJpZ2dlciIgaWNvbj0ibW9yZS12ZXJ0IiBhbHQ9Im1vcmUtdmVydCIgaWQ9Im92ZXJmbG93YnRuIiBvbi1jbGljaz0iX29wZW5PdmVyZmxvdyI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHBhcGVyLWRpYWxvZyBpZD0ib3ZlcmZsb3dtZW51IiBuby1vdmVybGFwIGhvcml6b250YWwtYWxpZ249InJpZ2h0IiB2ZXJ0aWNhbC1hbGlnbj0idG9wIj4KICAgICAgICA8ZGl2IGNsYXNzPSJvdmVyZmxvdy1kaXYiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19pc0tleUNhdGVnb3JpY2FsKGNvbG9yQnkpfX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi1ob2xkZXIiPgogICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGlkPSJwYWxldHRlQ2hvaWNlIiBsYWJlbD0iRGlzcGxheSB8IENvbG9yIFBhbGV0dGUiPgogICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e3BhbGV0dGVDaG9pY2V9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9InZhbHVlIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9InN0YW5kYXJkIj5zdGFuZGFyZDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9Indhcm0iPndhcm08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIHZhbHVlPSJjb29sIj5jb29sPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSB2YWx1ZT0iYXNzaXN0Ij5hc3Npc3Q8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc1dvcmRUcmVlKHZlcnRpY2FsRmFjZXQpXV0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2xhc3M9Im92ZXJmbG93LWNoZWNrYm94IiBjaGVja2VkPSJ7e3ZlcnRpY2FsQmFnT2ZXb3Jkc319Ij4KICAgICAgICAgICAgICBYLUF4aXMgQmFnIG9mIHdvcmRzCiAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzV29yZFRyZWUoaG9yaXpvbnRhbEZhY2V0KV1dIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNsYXNzPSJvdmVyZmxvdy1jaGVja2JveCIgY2hlY2tlZD0ie3tob3Jpem9udGFsQmFnT2ZXb3Jkc319Ij4KICAgICAgICAgICAgICBZLUF4aXMgQmFnIG9mIHdvcmRzCiAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9ImZhY2V0cy1kaXZlLWluZm8tY2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgfQogICAgICBkdCB7CiAgICAgICAgY29sb3I6ICM5ZTdjNjU7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CiAgICAgIGRkIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1jb2RlOwogICAgICAgIGNvbG9yOiAjNTEzNzI2OwogICAgICAgIG1hcmdpbjogMCAwIDE2cHggMDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgaWQ9ImhvbGRlciI+PC9kaXY+CiAgICAKICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJmYWNldHMtZGl2ZS1sZWdlbmQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgIH0KCiAgICAgIC5sZWdlbmQgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNhOWE5YTk7CiAgICAgICAgbWluLXdpZHRoOiAyMDBweDsKICAgICAgfQoKICAgICAgLnRvcGJhciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIGJhY2tncm91bmQ6ICNFNkU2RkE7CiAgICAgIH0KCiAgICAgIC5leHBhbmQtYnV0dG9uIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgfQoKICAgICAgLmxlZ2VuZC1ib2R5IHsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2E5YTlhOTsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgIH0KCiAgICAgIC5sZWdlbmQgLmxheW91dC1yb3cgewogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQogICAgICAubGVnZW5kIC5sYXlvdXQtcm93IHNwYW4gewogICAgICAgIG1hcmdpbjogMnB4IDAgMCA4cHg7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBMZWdlbmQgdGFibGUgc2hpbS4gUG9seW1lcidzIGRvbS1yZXBlYXQgZmVhdHVyZSBoYXMgYSBrbm93biBpc3N1ZSBpbgogICAgICAgKiB3aGljaCBpdCBkb2Vzbid0IHdvcmsgd2l0aCA8dHI+IGVsZW1lbnRzIGluc2lkZSBvZiBhIDx0YWJsZT4uIFNvCiAgICAgICAqIGluc3RlYWQsIHdlIHVzZSBDU1Mgd2l0aCBjbGFzc2VkIGRpdnMgdG8gYWNoaWV2ZSB0YWJsZSBiZWhhdmlvci4KICAgICAgICovCiAgICAgIC5sZWdlbmQtdGFibGUgewogICAgICAgIGRpc3BsYXk6IHRhYmxlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAycHg7CiAgICAgIH0KICAgICAgLmxlZ2VuZC1yb3cgewogICAgICAgIGRpc3BsYXk6IHRhYmxlLXJvdzsKICAgICAgfQogICAgICAubGVnZW5kLWNlbGwgewogICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb2xvciBsZWdlbmQuCiAgICAgICAqLwogICAgICAubGVnZW5kIC5jb2xvciB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CiAgICAgIC5sZWdlbmQgLmNvbG9yIGlyb24taWNvbiB7CiAgICAgICAgLS1pcm9uLWljb24td2lkdGg6IDE2cHg7CiAgICAgICAgLS1pcm9uLWljb24taGVpZ2h0OiAxNnB4OwogICAgICAgIG1hcmdpbjogMCAycHg7CiAgICAgIH0KICAgICAgLmxlZ2VuZCAuY29sb3IgaXJvbi1pY29uW2ZpbGw9IiNmZmZmZmYiXSB7CiAgICAgICAgYmFja2dyb3VuZDogI2RkZGRkZDsKICAgICAgfQogICAgICAubGVnZW5kIC5jb2xvciBzcGFuIHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KICAgICAgLmxlZ2VuZCAuc3BlY2lhbCB7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICB9CgogICAgICAubGVnZW5kIGgyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgY29sb3I6ICM0ZjQyM2U7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CiAgICAgIC5sZWdlbmQgLmNvbG9yLWJ5LWZpZWxkIHsKICAgICAgICBjb2xvcjogIzk2OGU4YzsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXNpemU6IDEyLjVweDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIG1hcmdpbjogMnB4IDAgNHB4IDIwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2FueUNvbG9yKGNvbG9yQnksIHBhbGV0dGUpXV0iPgogICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQiPgogICAgICAgIDxkaXYgY2xhc3M9InRvcGJhciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+TGVnZW5kPC9kaXY+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gY2xhc3M9ImV4cGFuZC1idXR0b24iIG9uLWNsaWNrPSJfdG9nZ2xlT3BlbmVkIiBpY29uPSJbW19nZXRJY29uKF9vcGVuZWQpXV0iPgogICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8aXJvbi1jb2xsYXBzZSBpZD0iY29sbGFwc2UiIG9wZW5lZD0ie3tfb3BlbmVkfX0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWJvZHkiPgogICAgICAgICAgICA8aDI+Q29sb3JzPC9oMj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWJ5LWZpZWxkIj4KICAgICAgICAgICAgICBieSBbW19icmVha1VwQW5kVHJ1bmNhdGUoY29sb3JCeSldXQogICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIHBvc2l0aW9uPSJ0b3AiPltbY29sb3JCeV1dPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICA8L3NwYW4+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtdGFibGUiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbcGFsZXR0ZV1dIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1yb3cgY29sb3IiPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2VsbCI+CiAgICAgICAgICAgICAgICAgICAgPGlyb24taWNvbiBpY29uPSJhdjpmaWJlci1tYW51YWwtcmVjb3JkIiBmaWxsJD0iW1tpdGVtLmNvbG9yXV0iIHN0eWxlJD0iZmlsbDpbW2l0ZW0uY29sb3JdXSI+PC9pcm9uLWljb24+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2VsbCI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3MkPSJbW19zcGVjaWFsQ2xhc3MoaXRlbS5jb250ZW50LnNwZWNpYWwpXV0iPgogICAgICAgICAgICAgICAgICAgICAgW1tfYnJlYWtVcEFuZFRydW5jYXRlKGl0ZW0uY29udGVudC5sYWJlbCldXQogICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBwb3NpdGlvbj0idG9wIj5bW2l0ZW0uY29udGVudC5sYWJlbF1dPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9ImZhY2V0cy1kaXZlIj4KICA8dGVtcGxhdGU+CgogICAgPHN0eWxlPgogICAgICAvKioKICAgICAgICogcGFwZXItaW5wdXQtY29udGFpbmVyIHVzZXMgYW4gZWxlbWVudCBjb250YWluaW5nIG9ubHkgJm5ic3A7IGZvcgogICAgICAgKiBzcGFjaW5nIHB1cnBvc2VzLiBBZ2dyZXNzaXZlIHZ1bGNhbml6ZXJzIHNvbWV0aW1lcyByZW1vdmUgdGhpcyBjb250ZW50LgogICAgICAgKiBUaGlzIENTUyBydWxlIGZvcmNlcyB0aGUgY29udGFpbmluZyBlbGVtZW50IHRvIGhhdmUgdGhlIGNvcnJlY3QgaGVpZ2h0CiAgICAgICAqIGluIGVpdGhlciBjYXNlLgogICAgICAgKi8KICAgICAgOmhvc3QgcGFwZXItaW5wdXQtY29udGFpbmVyID4gLmZsb2F0ZWQtbGFiZWwtcGxhY2Vob2xkZXIgewogICAgICAgIG1pbi1oZWlnaHQ6IDIwcHg7CiAgICAgIH0KCiAgICAgIDpob3N0IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICAgIC5maWxsIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgLm1haW4gewogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIH0KICAgICAgZmFjZXRzLWRpdmUtY29udHJvbHMgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZDNkM2QzOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBoZWlnaHQ6IDYwcHg7CiAgICAgIH0KICAgICAgLnJvdyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CiAgICAgIGZhY2V0cy1kaXZlLWxlZ2VuZCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMTRweDsKICAgICAgICByaWdodDogMjRweDsKICAgICAgfQogICAgICAuem9vbS1jb250cm9scyB7CiAgICAgICAgYm90dG9tOiAxNHB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KICAgICAgLnpvb20tY29udHJvbHMgcGFwZXItYnV0dG9uIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTdlN2U3OwogICAgICAgIGNsZWFyOiBsZWZ0OwogICAgICAgIGNvbG9yOiAjMmIyYjJiOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIG1hcmdpbjogNHB4IDhweDsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICB9CiAgICAgIGZhY2V0cy1kaXZlLWluZm8tY2FyZCB7CiAgICAgICAgYmFja2dyb3VuZDogI2ZmZjhmNDsKICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNjNmM2YzY7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgd2lkdGg6IDI0MHB4OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9ImZpbGwgbWFpbiI+CiAgICAgIDxmYWNldHMtZGl2ZS1jb250cm9scyBpZD0iY29udHJvbHMiIGF0bGFzLXVybD0iW1thdGxhc1VybF1dIiBrZXlzPSJbW19rZXlzXV0iIHN0YXRzPSJbW3N0YXRzXV0iIHZlcnRpY2FsLWZhY2V0PSJ7e3ZlcnRpY2FsRmFjZXR9fSIgdmVydGljYWwtYnVja2V0cz0ie3t2ZXJ0aWNhbEJ1Y2tldHN9fSIgdmVydGljYWwtYmFnLW9mLXdvcmRzPSJ7e3ZlcnRpY2FsQmFnT2ZXb3Jkc319IiBob3Jpem9udGFsLWZhY2V0PSJ7e2hvcml6b250YWxGYWNldH19IiBob3Jpem9udGFsLWJ1Y2tldHM9Int7aG9yaXpvbnRhbEJ1Y2tldHN9fSIgaG9yaXpvbnRhbC1iYWctb2Ytd29yZHM9Int7aG9yaXpvbnRhbEJhZ09mV29yZHN9fSIgcG9zaXRpb24tbW9kZT0ie3twb3NpdGlvbk1vZGV9fSIgdmVydGljYWwtcG9zaXRpb249Int7dmVydGljYWxQb3NpdGlvbn19IiBob3Jpem9udGFsLXBvc2l0aW9uPSJ7e2hvcml6b250YWxQb3NpdGlvbn19IiBjb2xvci1ieT0ie3tjb2xvckJ5fX0iIGltYWdlLWZpZWxkLW5hbWU9Int7aW1hZ2VGaWVsZE5hbWV9fSIgcGFsZXR0ZT0iW1tfcGFsZXR0ZV1dIiBwYWxldHRlLWNob2ljZT0ie3twYWxldHRlQ2hvaWNlfX0iIGdyaWQtZmFjZXRpbmctdmVydGljYWwtbGFiZWwtY29sb3I9IltbZ3JpZEZhY2V0aW5nVmVydGljYWxMYWJlbENvbG9yXV0iIGdyaWQtZmFjZXRpbmctaG9yaXpvbnRhbC1sYWJlbC1jb2xvcj0iW1tncmlkRmFjZXRpbmdIb3Jpem9udGFsTGFiZWxDb2xvcl1dIiBpdGVtLXBvc2l0aW9uaW5nLXZlcnRpY2FsLWxhYmVsLWNvbG9yPSJbW2l0ZW1Qb3NpdGlvbmluZ1ZlcnRpY2FsTGFiZWxDb2xvcl1dIiBpdGVtLXBvc2l0aW9uaW5nLWhvcml6b250YWwtbGFiZWwtY29sb3I9IltbaXRlbVBvc2l0aW9uaW5nSG9yaXpvbnRhbExhYmVsQ29sb3JdXSI+PC9mYWNldHMtZGl2ZS1jb250cm9scz4KCiAgICAgIDxkaXYgY2xhc3M9ImZpbGwgcm93Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJmaWxsIj4KICAgICAgICAgIDxmYWNldHMtZGl2ZS12aXMgaWQ9InZpcyIgY2xhc3M9ImZpbGwiIGRhdGE9IltbZGF0YV1dIiBmaWx0ZXJlZC1kYXRhLWluZGljZXM9IltbZmlsdGVyZWREYXRhSW5kaWNlc11dIiBhdGxhcy11cmw9IltbYXRsYXNVcmxdXSIgc3ByaXRlLXVybD0iW1tzcHJpdGVVcmxdXSIgY3Jvc3Mtb3JpZ2luPSJbW2Nyb3NzT3JpZ2luXV0iIGtleXM9Int7X2tleXN9fSIgc3RhdHM9Int7c3RhdHN9fSIgc3ByaXRlLWltYWdlLXdpZHRoPSJbW3Nwcml0ZUltYWdlV2lkdGhdXSIgc3ByaXRlLWltYWdlLWhlaWdodD0iW1tzcHJpdGVJbWFnZUhlaWdodF1dIiB2ZXJ0aWNhbC1mYWNldD0iW1t2ZXJ0aWNhbEZhY2V0XV0iIHZlcnRpY2FsLWJ1Y2tldHM9IltbdmVydGljYWxCdWNrZXRzXV0iIHZlcnRpY2FsLWJhZy1vZi13b3Jkcz0iW1t2ZXJ0aWNhbEJhZ09mV29yZHNdXSIgaG9yaXpvbnRhbC1mYWNldD0iW1tob3Jpem9udGFsRmFjZXRdXSIgaG9yaXpvbnRhbC1idWNrZXRzPSJbW2hvcml6b250YWxCdWNrZXRzXV0iIGhvcml6b250YWwtYmFnLW9mLXdvcmRzPSJbW2hvcml6b250YWxCYWdPZldvcmRzXV0iIHBvc2l0aW9uLW1vZGU9IltbcG9zaXRpb25Nb2RlXV0iIHZlcnRpY2FsLXBvc2l0aW9uPSJbW3ZlcnRpY2FsUG9zaXRpb25dXSIgaG9yaXpvbnRhbC1wb3NpdGlvbj0iW1tob3Jpem9udGFsUG9zaXRpb25dXSIgY29sb3ItYnk9Int7Y29sb3JCeX19IiBpbWFnZS1maWVsZC1uYW1lPSJ7e2ltYWdlRmllbGROYW1lfX0iIHBhbGV0dGU9Int7X3BhbGV0dGV9fSIgcGFsZXR0ZS1jaG9pY2U9IltbcGFsZXR0ZUNob2ljZV1dIiBncmlkLWZhY2V0aW5nLXZlcnRpY2FsLWxhYmVsLWNvbG9yPSJ7e2dyaWRGYWNldGluZ1ZlcnRpY2FsTGFiZWxDb2xvcn19IiBncmlkLWZhY2V0aW5nLWhvcml6b250YWwtbGFiZWwtY29sb3I9Int7Z3JpZEZhY2V0aW5nSG9yaXpvbnRhbExhYmVsQ29sb3J9fSIgaXRlbS1wb3NpdGlvbmluZy12ZXJ0aWNhbC1sYWJlbC1jb2xvcj0ie3tpdGVtUG9zaXRpb25pbmdWZXJ0aWNhbExhYmVsQ29sb3J9fSIgaXRlbS1wb3NpdGlvbmluZy1ob3Jpem9udGFsLWxhYmVsLWNvbG9yPSJ7e2l0ZW1Qb3NpdGlvbmluZ0hvcml6b250YWxMYWJlbENvbG9yfX0iIGZpdC1ncmlkLWFzcGVjdC1yYXRpby10by12aWV3cG9ydD0iW1tmaXRHcmlkQXNwZWN0UmF0aW9Ub1ZpZXdwb3J0XV0iIHNlbGVjdGVkLWRhdGE9Int7c2VsZWN0ZWREYXRhfX0iIHNlbGVjdGVkLWluZGljZXM9Int7c2VsZWN0ZWRJbmRpY2VzfX0iIGNvbXBhcmVkLWRhdGE9Int7Y29tcGFyZWREYXRhfX0iIGNvbXBhcmVkLWluZGljZXM9Int7Y29tcGFyZWRJbmRpY2VzfX0iIHN0YWJsZS1jb2xvcnM9Iltbc3RhYmxlQ29sb3JzXV0iPjwvZmFjZXRzLWRpdmUtdmlzPgoKICAgICAgICAgIDxkaXYgY2xhc3M9Inpvb20tY29udHJvbHMiPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBpZD0iem9vbUluQnV0dG9uIj4KICAgICAgICAgICAgICA8aXJvbi1pY29uIGljb249Imljb25zOmFkZCI+PC9pcm9uLWljb24+CiAgICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBpZD0iem9vbU91dEJ1dHRvbiI+CiAgICAgICAgICAgICAgPGlyb24taWNvbiBpY29uPSJpY29uczpyZW1vdmUiPjwvaXJvbi1pY29uPgogICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgaWQ9ImZpdEJ1dHRvbiI+CiAgICAgICAgICAgICAgPGlyb24taWNvbiBpY29uPSJpY29uczphc3BlY3QtcmF0aW8iPjwvaXJvbi1pY29uPgogICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxmYWNldHMtZGl2ZS1sZWdlbmQgaWQ9ImxlZ2VuZCIgY29sb3ItYnk9IltbY29sb3JCeV1dIiBwYWxldHRlPSJbW19wYWxldHRlXV0iPgogICAgICAgICAgPC9mYWNldHMtZGl2ZS1sZWdlbmQ+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shaGlkZUluZm9DYXJkXV0iPgogICAgICAgICAgPGZhY2V0cy1kaXZlLWluZm8tY2FyZCBpZD0iaW5mb0NhcmQiIHNlbGVjdGVkLWRhdGE9Iltbc2VsZWN0ZWREYXRhXV0iIGluZm8tcmVuZGVyZXI9IltbaW5mb1JlbmRlcmVyXV0iPgogICAgICAgICAgPC9mYWNldHMtZGl2ZS1pbmZvLWNhcmQ+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9ImZhY2V0cy1vdmVydmlldy1yb3ctc3RhdHMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KICAgICAgLmRhdGEtZXJyb3IgewogICAgICAgIGNvbG9yOiByZWQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLmRhdGEtd2VpZ2h0ZWQgewogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQogICAgICAudGFibGUtcm93IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgICAgfQogICAgICAudGFibGUtY2VsbCB7CiAgICAgICAgbWluLXdpZHRoOiA3MHB4OwogICAgICAgIG1heC13aWR0aDogNzBweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiA0cHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAuZGF0YS1jdXN0b20gewogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAxNTBweDsKICAgICAgICB3aGl0ZS1zcGFjZTogcHJlOzsKICAgICAgfQogICAgICAjbGVnZW5kLWJveCB7CiAgICAgICAgd2lkdGg6IDZweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDRweDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9InRhYmxlLXJvdyI+CiAgICAgIDxkaXYgaWQ9ImxlZ2VuZC1ib3giPjwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19lbnRyaWVzXV0iPgogICAgICAgIDxkaXYgY2xhc3MkPSJbW2l0ZW0uY3NzQ2xhc3NdXSB0YWJsZS1jZWxsIiB0aXRsZT0iW1tpdGVtLmZ1bGxTdHJdXSI+W1tpdGVtLnN0cl1dPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9ImZhY2V0cy1vdmVydmlldy1yb3ctbGVnZW5kIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC50YWJsZS1yb3cgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSg2MSwxNDAsMjA3LDAuMSk7CiAgICAgICAgYm9yZGVyLWxlZnQ6IHNvbGlkIDAuNXB4IHJnYmEoMCwwLDAsMC4xKTsKICAgICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAwLjVweCByZ2JhKDAsMCwwLDAuMSk7CiAgICAgIH0KICAgICAgLnRhYmxlLWNlbGwgewogICAgICAgIHBhZGRpbmc6IDIwcHggNHB4IDhweCAwOwogICAgICAgIG1pbi13aWR0aDogNjlweDsKICAgICAgICBtYXgtd2lkdGg6IDY5cHg7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiAzMDA7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAwLjVweCByZ2JhKDAsMCwwLDAuMSk7CiAgICAgIH0KICAgICAgLmRhdGEtd2VpZ2h0ZWQgewogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQogICAgICAuZGF0YS1jdXN0b20gewogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAxNTBweDsKICAgICAgfQogICAgICAubGVnZW5kLXNwYWNlIHsKICAgICAgICB3aWR0aDogNnB4OwogICAgICAgIGhlaWdodDogOHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiA0cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1yb3ciPgogICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtc3BhY2UiPjwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19lbnRyaWVzXV0iPgogICAgICAgIDxkaXYgY2xhc3MkPSJbW2l0ZW0uY3NzQ2xhc3NdXSB0YWJsZS1jZWxsIj5bW2l0ZW0uc3RyXV08L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9ImZhY2V0cy1vdmVydmlldy1jaGFydCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBsb3R0YWJsZS1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLnBsb3R0YWJsZS5jaGFydC1zbWFsbCB7CiAgICAgICAgaGVpZ2h0OiA0NnB4OwogICAgICAgIHdpZHRoOiAyNTBweDsKICAgICAgfQogICAgICAucGxvdHRhYmxlLnhheGlzLXNtYWxsewogICAgICAgIGhlaWdodDogMzBweDsKICAgICAgICB3aWR0aDogMjUwcHg7CiAgICAgIH0KICAgICAgLnBsb3R0YWJsZS5jaGFydC1iaWcgewogICAgICAgIGhlaWdodDogMjAwcHg7CiAgICAgICAgd2lkdGg6IDU1MHB4OwogICAgICB9CiAgICAgIC5wbG90dGFibGUueGF4aXMtYmlnIHsKICAgICAgICBoZWlnaHQ6IDUwcHg7CiAgICAgICAgd2lkdGg6IDU1MHB4OwogICAgICB9CiAgICAgICNzaG93X3RhYmxlX2J1dHRvbiB7CiAgICAgICAgbWFyZ2luOiAwIDAgMCA1cHg7CiAgICAgICAgcGFkZGluZzogMCAzcHg7CiAgICAgICAgZm9udC1zaXplOiA3cHQ7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2QzZDNkMzsKICAgICAgfQogICAgICAuZGlhbG9nLXJvdy1lbnRyeSB7CiAgICAgICAgcGFkZGluZzogMCAxMHB4IDAgMDsKICAgICAgfQogICAgICAudGFibGUtaGVhZGVyIHsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7CiAgICAgIH0KICAgICAgLmRpYWxvZy1yb3csIC5kaWFsb2ctaGVhZGVyLXJvdyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAuZGlhbG9nLXJvdy5zZWxlY3RlZCB7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2sKICAgICAgfQogICAgICAuZGlhbG9nLXJvdzpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0QwRDBEMDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgICAgLmRpYWxvZy10YWJsZSB7CiAgICAgICAgY2xlYXI6IGxlZnQ7CiAgICAgIH0KICAgICAgLmxhYmVsLWNlbGwgewogICAgICAgIHdpZHRoOiA5MHB4OwogICAgICAgIG1heC13aWR0aDogOTBweDsKICAgICAgICBtaW4td2lkdGg6IDkwcHg7CiAgICAgICAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKICAgICAgfQogICAgICAubm9uLW92ZXJmbG93LWxhYmVsLWNlbGwgewogICAgICAgIHdpZHRoOiA5MHB4OwogICAgICAgIG1heC13aWR0aDogOTBweDsKICAgICAgICBtaW4td2lkdGg6IDkwcHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIC5jb3VudC1jZWxsIHsKICAgICAgICB3aWR0aDogMTAwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAxMDBweDsKICAgICAgICBtaW4td2lkdGg6IDEwMHB4OwogICAgICAgIG92ZXJmbG93LXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgICAgLndlaWdodGVkLWNlbGwgewogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQogICAgICAuZGF0YS1saXN0LXNtYWxsIHsKICAgICAgICBoZWlnaHQ6IDYwcHg7CiAgICAgIH0KICAgICAgLmRhdGEtbGlzdC1iaWcgewogICAgICAgIGhlaWdodDogMTgwcHg7CiAgICAgICAgd2lkdGg6IDU1MHB4OwogICAgICB9CiAgICAgIC5oaWRlY2hhcnQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLnNob3djaGFydCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lOwogICAgICB9CiAgICAgICN0b29sdGlwIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b29sdGlwLWJhY2tncm91bmQsICM2MTYxNjEpOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgIHBvaW50ZXItZXZlbnRzOm5vbmU7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0ZXh0LWFsaWduOmNlbnRlcjsKICAgICAgICBwYWRkaW5nOiA2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgICBtYXJnaW4tbGVmdDogNTBweDsKICAgICAgICB3aGl0ZS1zcGFjZTogcHJlOwogICAgICAgIHRvcDogMHB4OwogICAgICB9CiAgICAgIC50b3BsZXZlbCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgcGFkZGluZy10b3A6IDRweDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9InRvcGxldmVsIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1N0cmluZ0NoYXJ0KF9jaGFydFR5cGUsIGNoYXJ0U2VsZWN0aW9uKV1dIj4KICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzaG93X3RhYmxlX2J1dHRvbiIgb24tY2xpY2s9Il90b2dnbGVTaG93VGFibGUiPltbX2dldFNob3dUYWJsZUJ1dHRvblRleHQoX3Nob3dUYWJsZSldXTwvcGFwZXItYnV0dG9uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8ZGl2IGNsYXNzJD0iW1tfY2hhcnRDbGFzc11dIj4KICAgICAgICA8ZGl2IGlkPSJjaGFydCIgY2xhc3MkPSJbW19jaGFydFN2Z0NsYXNzXV0iPjwvZGl2PgogICAgICAgIDxkaXYgaWQ9InhheGlzIiBjbGFzcyQ9IltbX3hBeGlzU3ZnQ2xhc3NdXSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nob3dUYWJsZV1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGFibGUiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLWhlYWRlci1yb3ciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctcm93LWVudHJ5IHRhYmxlLWhlYWRlciBsYWJlbC1jZWxsIj5WYWx1ZTwvZGl2PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2RhdGFdXSIgYXM9ImRhdGEiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy1yb3ctZW50cnkgdGFibGUtaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5vbi1vdmVyZmxvdy1sYWJlbC1jZWxsIj5bW2RhdGEubmFtZV1dPC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxpcm9uLWxpc3QgaXRlbXM9IltbX3RhYmxlRGF0YV1dIiBhcz0iZW50cnkiIGNsYXNzJD0iW1tfdGFibGVEYXRhQ2xhc3NdXSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzJD0iW1tfZ2V0RW50cnlSb3dDbGFzcyhlbnRyeSwgc2VsZWN0aW9uKV1dIiBvbi10YXA9Il9yb3dDbGljayIgZGF0YS12YWx1ZT0iW1tfZ2V0RW50cnlSb3dWYWx1ZShlbnRyeSldXSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctcm93LWVudHJ5IGxhYmVsLWNlbGwiPltbZW50cnkudmFsdWVdXTwvZGl2PgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tlbnRyeS5jb3VudHNdXSIgYXM9ImNvdW50Ij4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcyQ9IltbX2dldENvdW50Q2VsbENsYXNzKHNob3dXZWlnaHRlZCldXSI+W1tjb3VudF1dPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPGlyb24tbGlzdD4KICAgICAgICA8L2lyb24tbGlzdD48L2lyb24tbGlzdD48L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBpZD0idG9vbHRpcCI+PC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJmYWNldHMtb3ZlcnZpZXctdGFibGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQogICAgICAuZmVhdHVyZS1uYW1lIHsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIG1heC13aWR0aDogNDgwcHg7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIG1hcmdpbjogMCAwIDRweCA0cHg7CiAgICAgIH0KICAgICAgLnRhYmxlLW5hbWUgewogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgd29yZC13cmFwOmJyZWFrLXdvcmQ7CiAgICAgICAgcGFkZGluZzogNHB4IDAgNHB4IDhweDsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDYxLDE0MCwyMDcsMC4zKTsKICAgICAgICBib3JkZXI6IHNvbGlkIDAuNXB4IHJnYmEoMCwwLDAsMC4xKTsKICAgICAgfQogICAgICAuZmVhdHVyZS1pcm9uLWxpc3QgewogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbiAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogODAwcHg7CiAgICAgIH0KICAgICAgLmNoYXJ0LWNvbHVtbiB7CiAgICAgICAgd2lkdGg6IDI4MHB4OwogICAgICAgIG1pbi13aWR0aDogMjgwcHg7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CiAgICAgIC5jaGFydC1jb2x1bW4uaGVhZGVyLWNlbGwgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoNjEsMTQwLDIwNywwLjEpOwogICAgICAgIGJvcmRlci10b3A6IHNvbGlkIDAuNXB4IHJnYmEoMCwwLDAsMC4xKTsKICAgICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAwLjVweCByZ2JhKDAsMCwwLDAuMSk7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAwLjVweCByZ2JhKDAsMCwwLDAuMSk7CiAgICAgICAgcGFkZGluZy1sZWZ0OiA4cHg7CiAgICAgIH0KICAgICAgLm51bWVyaWMtcm93IHsKICAgICAgICBtaW4taGVpZ2h0OiA4MHB4OwogICAgICAgIGRpc3BsYXk6IHRhYmxlLXJvdzsKICAgICAgfQogICAgICAuY2F0ZWdvcmljYWwtcm93IHsKICAgICAgICBtaW4taGVpZ2h0OiA5OHB4OwogICAgICAgIGRpc3BsYXk6IHRhYmxlLXJvdzsKICAgICAgfQogICAgICAudGFibGUtY2VsbCB7CiAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBsaW5lLWhlaWdodDogMS4yZW07CiAgICAgIH0KICAgICAgLmNoYXJ0LWNvbHVtbi50YWJsZS1jZWxsIHsKICAgICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICAgICAgcGFkZGluZzogMTBweCAwIDAgMjBweAogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgfQogICAgICAuaGVhZGVyLWNlbGwgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtaW4taGVpZ2h0OiA2MHB4OwogICAgICB9CiAgICAgIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXNpemU6IDEycHg7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1sYWJlbC1zcGFjaW5nOiAycHg7CiAgICAgIH0KICAgICAgLmNvbnRyb2wtaG9sZGVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICAgIC5jaGVja2JveC1ob2xkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDJweDsKICAgICAgfQogICAgICAuY2hhcnQtY2hlY2tib3ggewogICAgICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgIH0KICAgICAgI3dlaWdodGJveCB7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICB9CiAgICAgIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAxNTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbCAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIH0KICAgICAgfQogICAgICAuaGlkZGVuIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcyQ9IltbX2dldFRhYmxlV3JhcHBlckNsYXNzKGZlYXR1cmVzKV1dIj4KICAgICAgPGRpdiBjbGFzcz0iaGVhZGVyLXJvdyI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGVyLWNlbGwgdGFibGUtY2VsbCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1uYW1lIj5bW19nZXRUaXRsZShudW1lcmljKV1dIEZlYXR1cmVzIChbW19nZXRGZWF0dXJlQ291bnRUZXh0KGRhdGFNb2RlbCwgbnVtZXJpYywgZmVhdHVyZXMpXV0pCiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxmYWNldHMtb3ZlcnZpZXctcm93LWxlZ2VuZCBudW1lcmljPSJbW251bWVyaWNdXSIgc2hvdy13ZWlnaHRlZD0iW1tfc2hvd1dlaWdodGVkXV0iIGhhcy1jdXN0b209IltbX2hhc0N1c3RvbVN0YXRzKGRhdGFNb2RlbCldXSIgZGF0YS1tb2RlbD0iW1tkYXRhTW9kZWxdXSI+CiAgICAgICAgICA8L2ZhY2V0cy1vdmVydmlldy1yb3ctbGVnZW5kPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNlbGwgY2hhcnQtY29sdW1uIGhlYWRlci1jZWxsIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IkNoYXJ0IHRvIHNob3ciPgogICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tfY2hhcnRTZWxlY3Rpb259fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9InZhbHVlIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NoYXJ0U2VsZWN0aW9uVHlwZXNdXSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIHZhbHVlPSJbW2l0ZW1dXSI+W1tpdGVtXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjaGVja2JveC1ob2xkZXIiPgogICAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjbGFzcz0iY2hhcnQtY2hlY2tib3giIGlkPSJsb2dib3giIGNoZWNrZWQ9Int7X2xvZ1NjYWxlfX0iPmxvZzwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNsYXNzPSJjaGFydC1jaGVja2JveCIgaWQ9ImV4cGFuZGJveCIgY2hlY2tlZD0ie3tfZXhwYW5kQ2hhcnRzfX0iPmV4cGFuZDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNXZWlnaHRlZEhpc3RvZ3JhbShmZWF0dXJlcyldXSI+CiAgICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2xhc3M9ImNoYXJ0LWNoZWNrYm94IiBpZD0id2VpZ2h0Ym94IiBjaGVja2VkPSJ7e19zaG93V2VpZ2h0ZWR9fSI+d2VpZ2h0ZWQ8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZURhdGFzZXRzKGRhdGFNb2RlbCldXSI+CiAgICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2xhc3M9ImNoYXJ0LWNoZWNrYm94IiBpZD0icGVyY2VudGJveCIgY2hlY2tlZD0ie3tfc2hvd1BlcmNlbnRhZ2V9fSIgZGlzYWJsZWQ9IltbX2NoYXJ0U2VsZWN0aW9uSGFzUXVhbnRpbGVzKF9jaGFydFNlbGVjdGlvbildXSI+cGVyY2VudGFnZXM8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8aXJvbi1saXN0IGl0ZW1zPSJbW2ZlYXR1cmVzXV0iIGFzPSJmZWF0dXJlIiBjbGFzcz0iZmVhdHVyZS1pcm9uLWxpc3QiPgogICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgIDxkaXYgY2xhc3MkPSJbW19nZXRUYWJsZVJvd0NsYXNzKG51bWVyaWMpXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jZWxsIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLW5hbWUiPltbX2dldEZlYXR1cmVOYW1lKGZlYXR1cmUpXV08L2Rpdj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19nZXREYXRhc2V0cyhkYXRhTW9kZWwpXV0iIGFzPSJkYXRhc2V0IiBpbmRleC1hcz0iZGF0YXNldEluZGV4Ij4KICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgIDxmYWNldHMtb3ZlcnZpZXctcm93LXN0YXRzIHN0YXRzPSJbW19nZXRTdGF0cyhkYXRhTW9kZWwsIGRhdGFzZXQsIGZlYXR1cmUpXV0iIGN1c3RvbS1zdGF0cz0iW1tfZ2V0QWxsQ3VzdG9tU3RhdHMoZGF0YU1vZGVsLCBmZWF0dXJlKV1dIiBzaG93LXdlaWdodGVkPSJbW19zaG93V2VpZ2h0ZWRdXSIgaGFzLWN1c3RvbT0iW1tfaGFzQ3VzdG9tU3RhdHMoZGF0YU1vZGVsKV1dIiBkYXRhLW1vZGVsPSJbW2RhdGFNb2RlbF1dIiBkYXRhc2V0LWluZGV4PSJbW2RhdGFzZXRJbmRleF1dIiBjb21wYXJlLW1vZGU9IltbY29tcGFyZU1vZGVdXSI+CiAgICAgICAgICAgICAgICAgIDwvZmFjZXRzLW92ZXJ2aWV3LXJvdy1zdGF0cz4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzJD0iW1tfZ2V0Q2hhcnRDbGFzcyhfZXhwYW5kQ2hhcnRzKV1dIj4KICAgICAgICAgICAgICA8ZmFjZXRzLW92ZXJ2aWV3LWNoYXJ0IGRhdGE9IltbX2dldENoYXJ0RGF0YShkYXRhTW9kZWwsIGZlYXR1cmUpXV0iIGRhdGEtbW9kZWw9IltbZGF0YU1vZGVsXV0iIGZlYXR1cmU9IltbX2dldEZlYXR1cmVOYW1lKGZlYXR1cmUpXV0iIHNlbGVjdGlvbj0ie3tmZWF0dXJlU2xpY2VTZWxlY3Rpb259fSIgbG9nLXNjYWxlPSJbW19sb2dTY2FsZV1dIiBzaG93LXdlaWdodGVkPSJbW19zaG93V2VpZ2h0ZWRdXSIgc2hvdy1wZXJjZW50YWdlPSJbW19zaG93UGVyY2VudGFnZV1dIiBjaGFydC1zZWxlY3Rpb249IltbX2NoYXJ0U2VsZWN0aW9uXV0iIGV4cGFuZC1jaGFydD0iW1tfZXhwYW5kQ2hhcnRzXV0iPgogICAgICAgICAgICAgIDwvZmFjZXRzLW92ZXJ2aWV3LWNoYXJ0PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvaXJvbi1saXN0PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0iZmFjZXRzLW92ZXJ2aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlCiAgICAgICAgZm9udC1zaXplOiAxMHB0OwogICAgICB9CiAgICAgIC5jb250cm9scyB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyMzQsMjM0LDIzNCwwLjIpOwogICAgICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDAuNXB4IHJnYmEoMCwwLDAsMC4yKTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGhlaWdodDogNjBweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7CgogICAgICB9CiAgICAgIC5mZWF0dXJlLWNoZWNrYm94ZXMgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjM0LDIzNCwyMzQsMC4yKTsKICAgICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAwLjVweCByZ2JhKDAsMCwwLDAuMik7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgcGFkZGluZzogIDhweCAwIDhweCAyMHB4OwogICAgICB9CiAgICAgIC5mZWF0dXJlLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIHBhZGRpbmc6IDAgMCAwIDE2cHg7CiAgICAgIH0KICAgICAgcGFwZXItY2hlY2tib3ggewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQogICAgICAuaW5wdXQtY29udHJvbCB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWwgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9OwogICAgICB9CiAgICAgIC5mZWF0dXJlcy10ZXh0IHsKICAgICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgICBwYWRkaW5nOiAxcHggMCAwIDA7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CiAgICAgIC5sZWZ0LWRyb3Bkb3duIHsKICAgICAgICBwYWRkaW5nOiAwIDEwcHggMCAwOwogICAgICB9CiAgICAgIC5taWRkbGUtY2hlY2tib3ggewogICAgICAgIG1hcmdpbi10b3A6IDMwcHg7CiAgICAgICAgcGFkZGluZzogMCAxMHB4OwogICAgICB9CiAgICAgIC5yaWdodC1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDMwMHB4OwogICAgICAgIHBhZGRpbmc6IDAgMTBweDsKICAgICAgfQogICAgICAuZmVhdHVyZS1pcm9uLWxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDgwMHB4OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CiAgICAgIC5mZWF0dXJlLWNvbHVtbiB7CiAgICAgICAgd2lkdGg6IDIwMHB4OwogICAgICAgIG1heC13aWR0aDogMjAwcHg7CiAgICAgICAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CiAgICAgIC5sZWdlbmQtY29sdW1uIHsKICAgICAgICB3aWR0aDogMTIwcHg7CiAgICAgIH0KICAgICAgLnN0YXRzLWNvbHVtbiB7CiAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICAgIG1heC13aWR0aDogMTUwcHg7CiAgICAgICAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQogICAgICAuY2hhcnQtY29sdW1uIHsKICAgICAgICB3aWR0aDogNTgwcHg7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CiAgICAgIC50YWJsZS1yb3cgewogICAgICAgIGRpc3BsYXk6IHRhYmxlLXJvdzsKICAgICAgfQogICAgICAudGFibGUtY2VsbCB7CiAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgIHBhZGRpbmc6IDEwcHggNXB4IDAKICAgICAgfQogICAgICAuY2hhcnQtY29sdW1uLnRhYmxlLWNlbGwgewogICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICBwYWRkaW5nOiAxMHB4IDAgMCAyMHB4CiAgICAgIH0KICAgICAgLmhlYWRlci1yb3cgewogICAgICAgIGNsZWFyOiBib3RoOwogICAgICB9CiAgICAgIC5oZWFkZXItcm93ID4gLnRhYmxlLWNlbGwgewogICAgICAgIGZvbnQtc2l6ZTogMTRwdDsKICAgICAgICBwYWRkaW5nOiAwIDVweCAwOwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazsKICAgICAgfQogICAgICAuc3RhdHMtaGVhZGVyLXRleHQgewogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CiAgICAgIC5jaGFydC1oZWFkZXItdGV4dCB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CiAgICAgIC50YWJsZS1ob2xkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICAgICAgbWFyZ2luLWxlZnQ6IDMwcHg7CiAgICAgIH0KICAgICAgLnRhYmxlLWxlZnQgewogICAgICAgIG1hcmdpbjogMjBweCAyMHB4IDAgMDsKICAgICAgfQogICAgICAudGFibGUtcmlnaHQgewogICAgICAgIG1hcmdpbjogMjBweCAwIDAgMDsKICAgICAgfQogICAgICAuaGlkZGVuIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIC5sZWdlbmQtaG9sZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG1hcmdpbjogOHB4IDAgMCAzOHB4OwogICAgICB9CiAgICAgIC5sZWdlbmQtYm94IHsKICAgICAgICB3aWR0aDogOHB4OwogICAgICAgIGhlaWdodDogOHB4OwogICAgICAgIG1hcmdpbi10b3A6IDZweDsKICAgICAgfQogICAgICAubGVnZW5kLXJvdyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAubGVnZW5kLW5hbWUgewogICAgICAgIG1hcmdpbjogM3B4IDEwcHggMCA1cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICB9CiAgICAgIC8qIEdpdmUgbWluIGhlaWdodCB0byBwbGFjZWhvbGRlciBpbiBwYXBlci1pbnB1dCB0byBnZXQgYXJvdW5kIGNvbGFiIGVtYmVkZGluZwogICAgICAgKiBhbGlnbm1lbnQgaXNzdWUuCiAgICAgICAqLwogICAgICA6aG9zdCBwYXBlci1pbnB1dC1jb250YWluZXIgPiAuZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciB7CiAgICAgICAgbWluLWhlaWdodDogMjBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU1vZGVsXV0iPgogICAgICA8ZGl2IGNsYXNzJD0iW1tfZ2V0Q29udHJvbHNXcmFwcGVyQ2xhc3MoX2RhdGFNb2RlbCldXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbHMiPgogICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgY2xhc3M9ImxlZnQtZHJvcGRvd24gaW5wdXQtY29udHJvbCIgbGFiZWw9IlNvcnQgYnkiPgogICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7X3NvcnRPcmRlcn19IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zb3J0T3B0aW9uc11dIiBhcz0ib3B0aW9uIj4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPltbb3B0aW9uLm5hbWVdXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICA8cGFwZXItY2hlY2tib3ggbm9pbmsgY2xhc3M9Im1pZGRsZS1jaGVja2JveCIgY2hlY2tlZD0ie3tfcmV2ZXJzZU9yZGVyfX0iPgogICAgICAgICAgICBSZXZlcnNlIG9yZGVyCiAgICAgICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPHBhcGVyLWlucHV0IGNsYXNzPSJyaWdodC1pbnB1dCBpbnB1dC1jb250cm9sIiBsYWJlbD0iRmVhdHVyZSBzZWFyY2ggKHJlZ2V4IGVuYWJsZWQpIiB2YWx1ZT0ie3tzZWFyY2hTdHJpbmd9fSIgYXV0by12YWxpZGF0ZT0idHJ1ZSIgdmFsaWRhdG9yPSJmaWx0ZXItdmFsaWRhdG9yIj4KICAgICAgICAgICAgPGZhY2V0cy1vdmVydmlldy1maWx0ZXItdmFsaWRhdG9yIHZhbGlkYXRvci1uYW1lPSJmaWx0ZXItdmFsaWRhdG9yIj4KICAgICAgICAgICAgPC9mYWNldHMtb3ZlcnZpZXctZmlsdGVyLXZhbGlkYXRvcj4KICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1jaGVja2JveGVzIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImZlYXR1cmVzLXRleHQiPkZlYXR1cmVzOiA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2ZlYXR1cmVTcGVjQXJyYXldXSIgYXM9InNwZWNBbmRMaXN0Ij4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBub2luayBjaGVja2VkPSJ0cnVlIiBjbGFzcz0iZmVhdHVyZS1jaGVja2JveCIgaWQ9IltbX2dldFNwZWNDaGVja2JveElkKHNwZWNBbmRMaXN0KV1dIiBvbi1jaGFuZ2U9Il9mZWF0dXJlU3BlY0NoZWNrIj4KICAgICAgICAgICAgICBbW19nZXRTcGVjQ2hlY2tib3hUZXh0KHNwZWNBbmRMaXN0KV1dCiAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZURhdGFzZXRzKF9kYXRhTW9kZWwpXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1ob2xkZXIiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfZ2V0RGF0YXNldHMoX2RhdGFNb2RlbCldXSIgYXM9ImRhdGFzZXQiIGluZGV4LWFzPSJkYXRhc2V0SW5kZXgiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtYm94IiBzdHlsZT0iW1tfZ2V0TGVnZW5kQm94U3R5bGUoX2RhdGFNb2RlbCwgZGF0YXNldEluZGV4KV1dIj48L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtbmFtZSI+W1tfZ2V0RGF0YXNldE5hbWUoX2RhdGFNb2RlbCwgZGF0YXNldEluZGV4KV1dPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBjbGFzcz0idGFibGUtaG9sZGVyIj4KICAgICAgICA8ZmFjZXRzLW92ZXJ2aWV3LXRhYmxlIGZlYXR1cmVzPSJbW19nZXROdW1lcmljRmVhdHVyZUxpc3RJdGVtcyhfZGF0YU1vZGVsLCBzZWFyY2hTdHJpbmcsIF9zb3J0T3JkZXIsIF9yZXZlcnNlT3JkZXIsIF9mZWF0dXJlU3BlY0NoZWNrYm94ZXMpXV0iIGRhdGEtbW9kZWw9IltbX2RhdGFNb2RlbF1dIiBmZWF0dXJlLXNsaWNlLXNlbGVjdGlvbj0ie3tmZWF0dXJlU2xpY2VTZWxlY3Rpb259fSIgbnVtZXJpYz0idHJ1ZSIgY2xhc3M9InRhYmxlLWxlZnQiIGNvbXBhcmUtbW9kZT0iW1tjb21wYXJlTW9kZV1dIj4KICAgICAgICA8L2ZhY2V0cy1vdmVydmlldy10YWJsZT4KICAgICAgICA8ZmFjZXRzLW92ZXJ2aWV3LXRhYmxlIGZlYXR1cmVzPSJbW19nZXROb25OdW1lcmljRmVhdHVyZUxpc3RJdGVtcyhfZGF0YU1vZGVsLCBzZWFyY2hTdHJpbmcsIF9zb3J0T3JkZXIsIF9yZXZlcnNlT3JkZXIsIF9mZWF0dXJlU3BlY0NoZWNrYm94ZXMpXV0iIGRhdGEtbW9kZWw9IltbX2RhdGFNb2RlbF1dIiBmZWF0dXJlLXNsaWNlLXNlbGVjdGlvbj0ie3tmZWF0dXJlU2xpY2VTZWxlY3Rpb259fSIgY2xhc3M9InRhYmxlLXJpZ2h0IiBjb21wYXJlLW1vZGU9IltbY29tcGFyZU1vZGVdXSI+CiAgICAgICAgPC9mYWNldHMtb3ZlcnZpZXctdGFibGU+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idnotZXhhbXBsZS12aWV3ZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpZD0ibGludGVyLXBhcGVyLWJ1dHRvbi1zdHlsZSI+CiAgICAgIC8qKgogICAgICAgKiBUaGlzIHN0eWxlIHByZXNlcnZlcyB0aGUgc3R5bGluZyBwcmV2aW91cyB0bwogICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vUG9seW1lckVsZW1lbnRzL3BhcGVyLWJ1dHRvbi9wdWxsLzExNQogICAgICAgKiBUaGlzIGNoYW5nZSBjYW4gYnJlYWsgdGhlIGxheW91dCBvZiBwYXBlci1idXR0b24gY29udGVudC4KICAgICAgICogUmVtb3ZlIHRoaXMgc3R5bGUgdG8gYXBwbHkgdGhlIGNoYW5nZSwgbW9yZSBkZXRhaWxzIGF0IGIvNzA1MjgzNTYuCiAgICAgICAqLwogICAgICBwYXBlci1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLnNlcS1mZWF0IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTZweDsKICAgICAgfQoKICAgICAgLnZhbHVlLWxpc3QgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuc2xpZGVyLWhvbGRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLnNsaWRlci1sYWJlbCB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5vdXRlciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgIC5pbWFnZSB7CiAgICAgICAgLyogPGltZz4gZWxlbWVudHMgYXJlIHVzZWQgdG8gbG9hZCB0byBhIGNhbnZhcyBzbyB0aGV5IGFyZW4ndCBkaXNwbGF5ZWQuICovCiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLmZsZXgtY29udHJvbHMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAudmFsdWUtcGlsbHMtaG9sZGVyIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1iYXNpczogMTAwJTsKICAgICAgfQoKICAgICAgaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSB7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZmZmZmZjsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgY29sb3I6ICMzYzQwNDM7CiAgICAgIH0KCiAgICAgIGlyb24tYXV0b2dyb3ctdGV4dGFyZWEudmFsdWUtc2FtZSB7CiAgICAgICAgY29sb3I6ICM1ZjYzNjg7CiAgICAgIH0KCiAgICAgIGlyb24tYXV0b2dyb3ctdGV4dGFyZWEudmFsdWUtZGlmZmVyZW50IHsKICAgICAgICBjb2xvcjogIzM0YTg1MzsKICAgICAgICAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE6IHsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgfQogICAgICB9CgogICAgICAudmFsdWUtcGlsbCB7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgICBtYXJnaW46IDRweDsKICAgICAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgICAgIGNvbG9yOiAjM2M0MDQzOwogICAgICB9CgogICAgICAudmFsdWUtcGlsbDpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogI2Y4ZjlmYTsKICAgICAgfQoKICAgICAgLnZhbHVlLXBpbGxbZm9jdXNlZF0gewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNmZmViM2I7CiAgICAgICAgYmFja2dyb3VuZDogI2Y4ZjlmYTsKICAgICAgfQoKICAgICAgLnZhbHVlLWNvbXBhcmUgewogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgcGFkZGluZzogNHB4IDhweDsKICAgICAgfQoKICAgICAgLnZhbHVlLXBpbGwtc3RhY2tlZCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgbWFyZ2luOiA0cHggNHB4IDRweCAwOwogICAgICAgIHBhZGRpbmc6IDJweDsKICAgICAgfQoKICAgICAgLnZhbHVlLXBpbGwtZ3JpZCB7CiAgICAgICAgd2lkdGg6IDEyMHB4OwogICAgICAgIG1hcmdpbjogNHB4IDhweCA0cHggMDsKICAgICAgfQoKICAgICAgLmZlYXR1cmUtbmFtZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDRweDsKICAgICAgICBtYXJnaW46IDRweCAyMHB4IDRweCA4cHg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGNvbG9yOiAjODA4NjhiOwogICAgICB9CgogICAgICAuZmVhdHVyZS1uYW1lLXRleHQgewogICAgICAgIHdpZHRoOiAzMDBweDsKICAgICAgICBtYXgtd2lkdGg6IDMwMHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi10b3A6IDRweDsKICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgICBsaW5lLWhlaWdodDogMS42ZW07CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7CiAgICAgIH0KCiAgICAgIC5mZWF0dXJlLW5hbWUtaGVhZGVyLXRleHQgewogICAgICAgIHdpZHRoOiAzMDBweDsKICAgICAgICBtYXgtd2lkdGg6IDMwMHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgY29sb3I6ICMyMDIxMjQ7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjhlbTsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICB9CgogICAgICAuZmVhdHVyZS1uYW1lLmZlYXR1cmUtbmFtZS1oZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDRweCA0cHggMHB4IDRweDsKICAgICAgICBiYWNrZ3JvdW5kOiAjZjhmOWZhOwogICAgICAgIG1hcmdpbjogMHB4OwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZThlYWVkOwogICAgICB9CgogICAgICAuc2xpZGVyIHsKICAgICAgICAtLXBhcGVyLXNsaWRlci1pbnB1dDogewogICAgICAgICAgd2lkdGg6IDEwMHB4OwogICAgICAgIH0KICAgICAgfQoKICAgICAgLmhpZGUtY29udHJvbHMgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5pbmRlbnQgewogICAgICAgIG1hcmdpbi1sZWZ0OiAxNnB4OwogICAgICB9CgogICAgICAuc2NhbGUtbGFiZWwgewogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICB9CgogICAgICAud2luZG93aW5nLWxhYmVsIHsKICAgICAgICB3aWR0aDogMTEwcHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLXRvZ2dsZS1idXR0b24gewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5leHBhbmQtYnV0dG9uLWhvbGRlciB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgfQoKICAgICAgLmRlbGV0ZS12YWx1ZS1idXR0b24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZlNjAzOwogICAgICAgIGNvbG9yOiAjNWY2MzY4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICAgICAgbWF4LXdpZHRoOiAyNHB4OwogICAgICAgIG1heC1oZWlnaHQ6IDI0cHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBtYXJnaW4tdG9wOiAycHg7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXM7CiAgICAgIH0KCiAgICAgIC5kZWxldGUtdmFsdWUtYnV0dG9uLmRlbGV0ZS12YWx1ZS1idXR0b24taGlkZGVuIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zLCB2aXNpYmlsaXR5IDIwMG1zOwogICAgICB9CgogICAgICAuZGVsZXRlLWZlYXR1cmUtYnV0dG9uIHsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIG1hcmdpbi1sZWZ0OiA0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogMHB4OwogICAgICB9CgogICAgICAuYWRkLXZhbHVlLWJ1dHRvbiB7CiAgICAgICAgbWFyZ2luLXRvcDogMnB4OwogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIG1pbi1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWluLXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgY29sb3I6ICM4MDg2OGI7CiAgICAgIH0KCiAgICAgIC5hZGQtZmVhdHVyZS1idXR0b24gewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgIH0KCiAgICAgIC51cGxvYWQtaW1hZ2UtYnV0dG9uIHsKICAgICAgICBtYXJnaW46IDAgMCAwIDVweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgIH0KCiAgICAgIC5pbWFnZWNhcmQgewogICAgICAgIG1hcmdpbjogNHB4OwogICAgICB9CgogICAgICAuaW1hZ2Utc2NhbGUtYnV0dG9uIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KCiAgICAgIC5zYWxpZW5jeS1sZWdlbmQtbGFiZWwgewogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgfQoKICAgICAgLmZlYXR1cmUtZGlhbG9nIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIH0KCiAgICAgIC5mZWF0dXJlLWRpYWxvZy1idXR0b24gewogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIC5pbWFnZS1ib3R0b20tYmFyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAjM2M0MDQzOwogICAgICB9CgogICAgICAuaW1hZ2UtdXBsb2FkLWlucHV0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAuc3BhY2UtZm9yLW1vcmUtYnV0dG9uIHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgfQoKICAgICAgLnZhbHVlLWhlYWRlci10ZXh0IHsKICAgICAgICBtaW4td2lkdGg6IDEzMHB4OwogICAgICAgIHdpZHRoOiAxMzBweDsKICAgICAgICBjb2xvcjogIzIwMjEyNDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuOGVtOwogICAgICB9CgogICAgICBwYXBlci1kaWFsb2cgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RhZGNlMDsKICAgICAgICBjb2xvcjogdmFyKC0tdGItb3JhbmdlLWRhcmspOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICAgIG1hcmdpbjogNXB4OwogICAgICB9CgogICAgICAuY29udHJvbC1idXR0b25bZGlzYWJsZWRdIHsKICAgICAgICBjb2xvcjogI2RhZGNlMDsKICAgICAgfQoKICAgICAgLnZhbHVlLXRleHQgewogICAgICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjZmZlYjNiOwogICAgICB9CgogICAgICAuY29tcGFyZS12YWx1ZS10ZXh0IHsKICAgICAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgIzM0YTg1MzsKICAgICAgfQoKICAgICAgLm5vLWNvbXBhcmUtdmFsdWUtdGV4dCB7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9Im91dGVyIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dTZWFyY2hCb3hdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0IHZhbHVlPSJ7e2ZlYXR1cmVTZWFyY2hWYWx1ZX19IiBsYWJlbD0iU2VhcmNoIiBjbGFzcz0iZmlsdGVyLWlucHV0IiBuby1sYWJlbC1mbG9hdD4KICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iaWNvbnM6c2VhcmNoIiBwcmVmaXg+PC9pcm9uLWljb24+CiAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1uYW1lIGZlYXR1cmUtbmFtZS1oZWFkZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImZlYXR1cmUtbmFtZS1oZWFkZXItdGV4dCI+RmVhdHVyZTwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InZhbHVlLXBpbGxzLWhvbGRlciBmbGV4LWNvbnRyb2xzIHZhbHVlLWhlYWRlci10ZXh0Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9InZhbHVlLXRleHQiPlZhbHVlKHMpPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NvbXBhcmVNb2RlXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0idmFsdWUtcGlsbHMtaG9sZGVyIGZsZXgtY29udHJvbHMgdmFsdWUtaGVhZGVyLXRleHQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzJD0iW1tnZXRDb21wYXJlSGVhZGVyQ2xhc3MoaGlnaGxpZ2h0RGlmZmVyZW5jZXMpXV0iPgogICAgICAgICAgICAgIFtbY29tcGFyZVRpdGxlXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDxkaXYgY2xhc3M9InNwYWNlLWZvci1tb3JlLWJ1dHRvbiI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2ZpbHRlcmVkRmVhdHVyZXNMaXN0XV0iIGFzPSJmZWF0Ij4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaXNJbWFnZShmZWF0Lm5hbWUpXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1uYW1lIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1uYW1lLXRleHQiPltbZmVhdC5uYW1lXV08L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idmFsdWUtcGlsbHMtaG9sZGVyIj4KICAgICAgICAgICAgICA8cGFwZXItY2FyZCBpZD0iW1tnZXRJbWFnZUNhcmRJZChmZWF0Lm5hbWUpXV0iIGNsYXNzPSJpbWFnZWNhcmQiPgogICAgICAgICAgICAgICAgPGltZyBjbGFzcz0iaW1hZ2UiIHNyYyQ9IltbZ2V0SW1hZ2VTcmMoZmVhdC5uYW1lKV1dIiBpZD0iW1tnZXRJbWFnZUlkKGZlYXQubmFtZSldXSI+CiAgICAgICAgICAgICAgICA8Y2FudmFzIGlkPSJbW2dldENhbnZhc0lkKGZlYXQubmFtZSldXSIgZGF0YS1mZWF0dXJlPSJbW2ZlYXQubmFtZV1dIj48L2NhbnZhcz4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG91bGRTaG93SW1hZ2VDb250cm9scyhoYXNJbWFnZSwgYWxsb3dJbWFnZUNvbnRyb2xzKV1dIj4KICAgICAgICAgICAgICAgICAgPGRpdj5JbWFnZSB3aW5kb3dpbmcgKGNvbnRyYXN0KTwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItaG9sZGVyIGluZGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLWxhYmVsIHdpbmRvd2luZy1sYWJlbCI+CiAgICAgICAgICAgICAgICAgICAgICBXaW5kb3cgY2VudGVyOgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1zbGlkZXIgY2xhc3M9InNsaWRlciIgZWRpdGFibGU9InRydWUiIG1heD0iMjU1IiBpbW1lZGlhdGUtdmFsdWU9Int7d2luZG93Q2VudGVyfX0iIHZhbHVlPSJbW3dpbmRvd0NlbnRlcl1dIj4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1ob2xkZXIgaW5kZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItbGFiZWwgd2luZG93aW5nLWxhYmVsIj4KICAgICAgICAgICAgICAgICAgICAgIFdpbmRvdyB3aWR0aDoKICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItc2xpZGVyIGNsYXNzPSJzbGlkZXIiIGVkaXRhYmxlPSJ0cnVlIiBtYXg9IjUxMiIgbWluPSIxIiBpbW1lZGlhdGUtdmFsdWU9Int7d2luZG93V2lkdGh9fSIgdmFsdWU9Iltbd2luZG93V2lkdGhdXSI+CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1zbGlkZXI+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4LWNvbnRyb2xzIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzY2FsZS1sYWJlbCI+SW1hZ2Ugc2NhbGUgcGVyY2VudGFnZTo8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbm8tbGFiZWwtZmxvYXQgdHlwZT0ibnVtYmVyIiBtaW49IjEwIiBtYXg9IjUwMCIgdmFsdWU9Int7aW1hZ2VTY2FsZVBlcmNlbnRhZ2V9fSI+CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJpbWFnZS1zY2FsZS1idXR0b24iIG9uLWNsaWNrPSJ1cGRhdGVJbWFnZXMiPgogICAgICAgICAgICAgICAgICAgICAgc2V0CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImltYWdlLWJvdHRvbS1iYXIiPgogICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gY2xhc3MkPSJbW2dldFVwbG9hZEltYWdlQ2xhc3MocmVhZG9ubHkpXV0iIGljb249ImZpbGUtdXBsb2FkIiBvbi1jbGljaz0idXBsb2FkSW1hZ2VDbGlja2VkIiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iIHRpdGxlPSJVcGxvYWQgaW1hZ2UiPgogICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgY2xhc3M9ImltYWdlLXVwbG9hZC1pbnB1dCIgdHlwZT0iZmlsZSIgb24tY2hhbmdlPSJoYW5kbGVJbWFnZVVwbG9hZCIgZGF0YS1mZWF0dXJlPSJbW2ZlYXQubmFtZV1dIiBkYXRhLWluZGV4PSJbW2luZGV4XV0iPgogICAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC9wYXBlci1jYXJkPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NvbXBhcmVNb2RlXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InZhbHVlLXBpbGxzLWhvbGRlciI+CiAgICAgICAgICAgICAgICA8cGFwZXItY2FyZCBpZD0iW1tnZXRDb21wYXJlSW1hZ2VDYXJkSWQoZmVhdC5uYW1lKV1dIiBjbGFzcz0iaW1hZ2VjYXJkIj4KICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz0iaW1hZ2UiIHNyYyQ9IltbZ2V0Q29tcGFyZUltYWdlU3JjKGZlYXQubmFtZSldXSIgaWQ9IltbZ2V0Q29tcGFyZUltYWdlSWQoZmVhdC5uYW1lKV1dIj4KICAgICAgICAgICAgICAgICAgPGNhbnZhcyBpZD0iW1tnZXRDb21wYXJlQ2FudmFzSWQoZmVhdC5uYW1lKV1dIiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iPjwvY2FudmFzPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbWFnZS1ib3R0b20tYmFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvcGFwZXItY2FyZD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Im1vcmUtaG9yaXoiIGNsYXNzJD0iW1tnZXRBZGRWYWx1ZUJ1dHRvbkNsYXNzKHJlYWRvbmx5KV1dIiBvbi1jbGljaz0iZmVhdHVyZU1vcmVDbGlja2VkIiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1kaWFsb2cgaWQ9IltbZ2V0RmVhdHVyZURpYWxvZ0lkKGZlYXQubmFtZSldXSIgaG9yaXpvbnRhbC1hbGlnbj0icmlnaHQiIHZlcnRpY2FsLWFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZlYXR1cmUtZGlhbG9nIj4KICAgICAgICAgICAgICAgIDxwYXBlci1idXR0b24gZGF0YS1mZWF0dXJlPSJbW2ZlYXQubmFtZV1dIiBvbi1jbGljaz0iZGVsZXRlRmVhdHVyZSIgY2xhc3M9ImZlYXR1cmUtZGlhbG9nLWJ1dHRvbiI+CiAgICAgICAgICAgICAgICAgIERlbGV0ZSBmZWF0dXJlCiAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shaXNJbWFnZShmZWF0Lm5hbWUpXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1uYW1lIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1uYW1lLXRleHQiPltbZmVhdC5uYW1lXV08L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleC1jb250cm9scyB2YWx1ZS1waWxscy1ob2xkZXIiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpc0V4cGFuZGVkKGZlYXQubmFtZSwgZXhwYW5kQWxsRmVhdHVyZXMpXV0iPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tnZXRGZWF0dXJlVmFsdWVzKGZlYXQubmFtZSldXSIgYXM9InZhbHVlIj4KICAgICAgICAgICAgICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3MkPSJbW2dldElucHV0UGlsbENsYXNzKGZlYXQubmFtZSwgZGlzcGxheU1vZGUpXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiBvbi1pbnB1dD0ib25WYWx1ZUNoYW5nZWQiIG9uLWZvY3VzPSJvbklucHV0Rm9jdXMiIG9uLWJsdXI9Im9uSW5wdXRCbHVyIiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iIGRhdGEtaW5kZXg9IltbaW5kZXhdXSIgdmFsdWU9IltbdmFsdWVdXSI+CiAgICAgICAgICAgICAgICAgIDwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWlzRXhwYW5kZWQoZmVhdC5uYW1lLCBleHBhbmRBbGxGZWF0dXJlcyldXSI+CiAgICAgICAgICAgICAgICA8aXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSBjbGFzcyQ9IltbZ2V0SW5wdXRQaWxsQ2xhc3MoZmVhdC5uYW1lLCBkaXNwbGF5TW9kZSldXSIgcmVhZG9ubHkkPSJbW3JlYWRvbmx5XV0iIG9uLWlucHV0PSJvblZhbHVlQ2hhbmdlZCIgb24tZm9jdXM9Im9uSW5wdXRGb2N1cyIgb24tYmx1cj0ib25JbnB1dEJsdXIiIGRhdGEtZmVhdHVyZT0iW1tmZWF0Lm5hbWVdXSIgZGF0YS1pbmRleD0iW1t6ZXJvSW5kZXhdXSIgdmFsdWU9IltbZ2V0Rmlyc3RGZWF0dXJlVmFsdWUoZmVhdC5uYW1lKV1dIj4KICAgICAgICAgICAgICAgIDwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tmZWF0dXJlSGFzTXVsdGlwbGVWYWx1ZXMoZmVhdC5uYW1lKV1dIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iIG9uLWNsaWNrPSJleHBhbmRGZWF0dXJlIiBjbGFzcyQ9IltbZ2V0SW5wdXRQaWxsQ2xhc3MoZmVhdC5uYW1lLCBkaXNwbGF5TW9kZSldXSI+CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NvbXBhcmVNb2RlXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgtY29udHJvbHMgdmFsdWUtcGlsbHMtaG9sZGVyIj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpc0V4cGFuZGVkKGZlYXQubmFtZSwgZXhwYW5kQWxsRmVhdHVyZXMpXV0iPgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2dldENvbXBhcmVGZWF0dXJlVmFsdWVzKGZlYXQubmFtZSldXSIgYXM9InZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSBjbGFzcyQ9IltbZ2V0Q29tcGFyZUlucHV0Q2xhc3MoZmVhdC5uYW1lLCBkaXNwbGF5TW9kZSwgaW5kZXgpXV0iIHJlYWRvbmx5IHZhbHVlPSJbW3ZhbHVlXV0iPgogICAgICAgICAgICAgICAgICAgIDwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWlzRXhwYW5kZWQoZmVhdC5uYW1lLCBleHBhbmRBbGxGZWF0dXJlcyldXSI+CiAgICAgICAgICAgICAgICAgIDxpcm9uLWF1dG9ncm93LXRleHRhcmVhIGNsYXNzJD0iW1tnZXRDb21wYXJlSW5wdXRDbGFzcyhmZWF0Lm5hbWUsIGRpc3BsYXlNb2RlLCB6ZXJvSW5kZXgpXV0iIHJlYWRvbmx5IHZhbHVlPSJbW2dldEZpcnN0Q29tcGFyZUZlYXR1cmVWYWx1ZShmZWF0Lm5hbWUpXV0iPgogICAgICAgICAgICAgICAgICA8L2lyb24tYXV0b2dyb3ctdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tjb21wYXJlRmVhdHVyZUhhc011bHRpcGxlVmFsdWVzKGZlYXQubmFtZSldXSI+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iIG9uLWNsaWNrPSJleHBhbmRGZWF0dXJlIiBjbGFzcyQ9IltbZ2V0Q29tcGFyZUlucHV0Q2xhc3MoZmVhdC5uYW1lLCBkaXNwbGF5TW9kZSldXSI+CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ibW9yZS1ob3JpeiIgY2xhc3MkPSJbW2dldEFkZFZhbHVlQnV0dG9uQ2xhc3MocmVhZG9ubHkpXV0iIG9uLWNsaWNrPSJmZWF0dXJlTW9yZUNsaWNrZWQiIGRhdGEtZmVhdHVyZT0iW1tmZWF0Lm5hbWVdXSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBpZD0iW1tnZXRGZWF0dXJlRGlhbG9nSWQoZmVhdC5uYW1lKV1dIiBob3Jpem9udGFsLWFsaWduPSJyaWdodCIgdmVydGljYWwtYWxpZ249ImJvdHRvbSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1kaWFsb2ciPgogICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iIG9uLWNsaWNrPSJkZWxldGVGZWF0dXJlIiBjbGFzcz0iZmVhdHVyZS1kaWFsb2ctYnV0dG9uIj4KICAgICAgICAgICAgICAgICAgRGVsZXRlIGZlYXR1cmUKICAgICAgICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iIG9uLWNsaWNrPSJhZGRWYWx1ZSIgY2xhc3M9ImZlYXR1cmUtZGlhbG9nLWJ1dHRvbiI+CiAgICAgICAgICAgICAgICAgIEFkZCBmZWF0dXJlIHZhbHVlCiAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaXNTZXFFeGFtcGxlKG1heFNlcU51bWJlcildXSI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLWhvbGRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItbGFiZWwiPlNlcXVlbmNlIE51bWJlcjo8L2Rpdj4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgY2xhc3M9InNsaWRlciIgZWRpdGFibGU9InRydWUiIG1heD0iW1ttYXhTZXFOdW1iZXJdXSIgdmFsdWU9Int7c2VxTnVtYmVyfX0iPgogICAgICAgICAgPC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tmaWx0ZXJlZFNlcUZlYXR1cmVzTGlzdF1dIiBhcz0ic2VxZmVhdCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzZXFmZWF0Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2lzSW1hZ2Uoc2VxZmVhdC5uYW1lKV1dIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLW5hbWUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1uYW1lLXRleHQiPltbc2VxZmVhdC5uYW1lXV08L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InZhbHVlLXBpbGxzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1jYXJkIGlkPSJbW2dldEltYWdlQ2FyZElkKHNlcWZlYXQubmFtZSldXSIgY2xhc3M9ImltYWdlY2FyZCI+CiAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz0iaW1hZ2UiIHNyYyQ9IltbZ2V0U2VxSW1hZ2VTcmMoc2VxZmVhdC5uYW1lLCBzZXFOdW1iZXIpXV0iIGlkPSJbW2dldEltYWdlSWQoc2VxZmVhdC5uYW1lKV1dIj4KICAgICAgICAgICAgICAgICAgICA8Y2FudmFzIGlkPSJbW2dldENhbnZhc0lkKHNlcWZlYXQubmFtZSldXSIgZGF0YS1mZWF0dXJlPSJbW3NlcWZlYXQubmFtZV1dIiBkYXRhLXNlcS1udW09Iltbc2VxTnVtYmVyXV0iPjwvY2FudmFzPgogICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG91bGRTaG93SW1hZ2VDb250cm9scyhoYXNJbWFnZSwgYWxsb3dJbWFnZUNvbnRyb2xzKV1dIj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImltYWdlLWNvbnRyb2xzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5JbWFnZSB3aW5kb3dpbmcgKGNvbnRyYXN0KTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItaG9sZGVyIGluZGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLWxhYmVsIHdpbmRvd2luZy1sYWJlbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3cgY2VudGVyOgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1zbGlkZXIgY2xhc3M9InNsaWRlciIgZWRpdGFibGU9InRydWUiIG1heD0iMjU1IiBpbW1lZGlhdGUtdmFsdWU9Int7d2luZG93Q2VudGVyfX0iIHZhbHVlPSJbW3dpbmRvd0NlbnRlcl1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1ob2xkZXIgaW5kZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItbGFiZWwgd2luZG93aW5nLWxhYmVsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvdyB3aWR0aDoKICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItc2xpZGVyIGNsYXNzPSJzbGlkZXIiIGVkaXRhYmxlPSJ0cnVlIiBtYXg9IjUxMiIgbWluPSIxIiBpbW1lZGlhdGUtdmFsdWU9Int7d2luZG93V2lkdGh9fSIgdmFsdWU9Iltbd2luZG93V2lkdGhdXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1zbGlkZXI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4LWNvbnRyb2xzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzY2FsZS1sYWJlbCI+SW1hZ2Ugc2NhbGUgcGVyY2VudGFnZTo8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbm8tbGFiZWwtZmxvYXQgdHlwZT0ibnVtYmVyIiBtaW49IjEwIiBtYXg9IjUwMCIgdmFsdWU9Int7aW1hZ2VTY2FsZVBlcmNlbnRhZ2V9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJpbWFnZS1zY2FsZS1idXR0b24iIG9uLWNsaWNrPSJ1cGRhdGVJbWFnZXMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbWFnZS1ib3R0b20tYmFyIj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcyQ9IltbZ2V0VXBsb2FkSW1hZ2VDbGFzcyhyZWFkb25seSldXSIgaWNvbj0iZmlsZS11cGxvYWQiIG9uLWNsaWNrPSJ1cGxvYWRJbWFnZUNsaWNrZWQiIGRhdGEtZmVhdHVyZT0iW1tzZXFmZWF0Lm5hbWVdXSIgdGl0bGU9IlVwbG9hZCBpbWFnZSI+CiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGNsYXNzPSJpbWFnZS11cGxvYWQtaW5wdXQiIHR5cGU9ImZpbGUiIG9uLWNoYW5nZT0iaGFuZGxlSW1hZ2VVcGxvYWQiIGRhdGEtZmVhdHVyZT0iW1tzZXFmZWF0Lm5hbWVdXSIgZGF0YS1pbmRleD0iW1tpbmRleF1dIiBkYXRhLXNlcS1udW09Iltbc2VxTnVtYmVyXV0iPgogICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9wYXBlci1jYXJkPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbY29tcGFyZU1vZGVdXSI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InZhbHVlLXBpbGxzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWNhcmQgaWQ9IltbZ2V0Q29tcGFyZUltYWdlQ2FyZElkKHNlcWZlYXQubmFtZSldXSIgY2xhc3M9ImltYWdlY2FyZCI+CiAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPSJpbWFnZSIgc3JjJD0iW1tnZXRDb21wYXJlU2VxSW1hZ2VTcmMoc2VxZmVhdC5uYW1lLCBzZXFOdW1iZXIpXV0iIGlkPSJbW2dldENvbXBhcmVJbWFnZUlkKHNlcWZlYXQubmFtZSldXSI+CiAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzIGlkPSJbW2dldENvbXBhcmVDYW52YXNJZChzZXFmZWF0Lm5hbWUpXV0iIGRhdGEtZmVhdHVyZT0iW1tzZXFmZWF0Lm5hbWVdXSIgZGF0YS1zZXEtbnVtPSJbW3NlcU51bWJlcl1dIj48L2NhbnZhcz4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImltYWdlLWJvdHRvbS1iYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItY2FyZD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Im1vcmUtaG9yaXoiIGNsYXNzJD0iW1tnZXRBZGRWYWx1ZUJ1dHRvbkNsYXNzKHJlYWRvbmx5KV1dIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBkYXRhLWZlYXR1cmU9Iltbc2VxZmVhdC5uYW1lXV0iIG9uLWNsaWNrPSJkZWxldGVGZWF0dXJlIj4KICAgICAgICAgICAgICAgICAgICBEZWxldGUgZmVhdHVyZQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWlzSW1hZ2Uoc2VxZmVhdC5uYW1lKV1dIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLW5hbWUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1uYW1lLXRleHQiPltbc2VxZmVhdC5uYW1lXV08L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgtY29udHJvbHMgdmFsdWUtcGlsbHMtaG9sZGVyIj4KICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2lzRXhwYW5kZWQoc2VxZmVhdC5uYW1lLCBleHBhbmRBbGxGZWF0dXJlcyldXSI+CiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tnZXRTZXFGZWF0dXJlVmFsdWVzKHNlcWZlYXQubmFtZSwgc2VxTnVtYmVyKV1dIiBhcz0ic2VxdmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3MkPSJbW2dldElucHV0UGlsbENsYXNzKHNlcWZlYXQubmFtZSwgZGlzcGxheU1vZGUpXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiBvbi1pbnB1dD0ib25WYWx1ZUNoYW5nZWQiIG9uLWZvY3VzPSJvbklucHV0Rm9jdXMiIG9uLWJsdXI9Im9uSW5wdXRCbHVyIiBkYXRhLWZlYXR1cmU9Iltbc2VxZmVhdC5uYW1lXV0iIGRhdGEtaW5kZXg9IltbaW5kZXhdXSIgZGF0YS1zZXEtbnVtPSJbW3NlcU51bWJlcl1dIiB2YWx1ZT0iW1tzZXF2YWx1ZV1dIj4KICAgICAgICAgICAgICAgICAgICAgIDwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWlzRXhwYW5kZWQoc2VxZmVhdC5uYW1lLCBleHBhbmRBbGxGZWF0dXJlcyldXSI+CiAgICAgICAgICAgICAgICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3MkPSJbW2dldElucHV0UGlsbENsYXNzKHNlcWZlYXQubmFtZSwgZGlzcGxheU1vZGUpXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiBvbi1pbnB1dD0ib25WYWx1ZUNoYW5nZWQiIG9uLWZvY3VzPSJvbklucHV0Rm9jdXMiIG9uLWJsdXI9Im9uSW5wdXRCbHVyIiBkYXRhLWZlYXR1cmU9Iltbc2VxZmVhdC5uYW1lXV0iIGRhdGEtaW5kZXg9IltbemVyb0luZGV4XV0iIGRhdGEtc2VxLW51bT0iW1tzZXFOdW1iZXJdXSIgdmFsdWU9IltbZ2V0Rmlyc3RTZXFGZWF0dXJlVmFsdWUoc2VxZmVhdC5uYW1lLCBzZXFOdW1iZXIpXV0iPgogICAgICAgICAgICAgICAgICAgIDwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2VxRmVhdHVyZUhhc011bHRpcGxlVmFsdWVzKHNlcWZlYXQubmFtZSwgc2VxTnVtYmVyKV1dIj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1idXR0b24gZGF0YS1mZWF0dXJlPSJbW3NlcWZlYXQubmFtZV1dIiBvbi1jbGljaz0iZXhwYW5kRmVhdHVyZSIgY2xhc3MkPSJbW2dldElucHV0UGlsbENsYXNzKHNlcWZlYXQubmFtZSwgZGlzcGxheU1vZGUpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tjb21wYXJlTW9kZV1dIj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleC1jb250cm9scyB2YWx1ZS1waWxscy1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpc0V4cGFuZGVkKHNlcWZlYXQubmFtZSwgZXhwYW5kQWxsRmVhdHVyZXMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tnZXRDb21wYXJlU2VxRmVhdHVyZVZhbHVlcyhzZXFmZWF0Lm5hbWUsIHNlcU51bWJlcildXSIgYXM9InNlcXZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3MkPSJbW2dldFNlcUNvbXBhcmVJbnB1dENsYXNzKHNlcWZlYXQubmFtZSwgZGlzcGxheU1vZGUsIHNlcU51bWJlciwgaW5kZXgpXV0iIHJlYWRvbmx5IHZhbHVlPSJbW3NlcXZhbHVlXV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L2lyb24tYXV0b2dyb3ctdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFpc0V4cGFuZGVkKHNlcWZlYXQubmFtZSwgZXhwYW5kQWxsRmVhdHVyZXMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3MkPSJbW2dldFNlcUNvbXBhcmVJbnB1dENsYXNzKHNlcWZlYXQubmFtZSwgZGlzcGxheU1vZGUsIHNlcU51bWJlciwgemVyb0luZGV4KV1dIiByZWFkb25seSB2YWx1ZT0iW1tnZXRGaXJzdENvbXBhcmVTZXFGZWF0dXJlVmFsdWUoc2VxZmVhdC5uYW1lLCBzZXFOdW1iZXIpXV0iPgogICAgICAgICAgICAgICAgICAgICAgPC9pcm9uLWF1dG9ncm93LXRleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NvbXBhcmVTZXFGZWF0dXJlSGFzTXVsdGlwbGVWYWx1ZXMoc2VxZmVhdC5uYW1lLCBzZXFOdW1iZXIpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGRhdGEtZmVhdHVyZT0iW1tzZXFmZWF0Lm5hbWVdXSIgb24tY2xpY2s9ImV4cGFuZEZlYXR1cmUiIGNsYXNzJD0iW1tnZXRTZXFDb21wYXJlSW5wdXRDbGFzcyhzZXFmZWF0Lm5hbWUsIGRpc3BsYXlNb2RlLCBzZXFOdW1iZXIpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Im1vcmUtaG9yaXoiIGNsYXNzJD0iW1tnZXRBZGRWYWx1ZUJ1dHRvbkNsYXNzKHJlYWRvbmx5KV1dIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBkYXRhLWZlYXR1cmU9Iltbc2VxZmVhdC5uYW1lXV0iIG9uLWNsaWNrPSJkZWxldGVGZWF0dXJlIj4KICAgICAgICAgICAgICAgICAgICBEZWxldGUgZmVhdHVyZQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBkYXRhLWZlYXR1cmU9Iltbc2VxZmVhdC5uYW1lXV0iIGRhdGEtc2VxLW51bT0iW1tzZXFOdW1iZXJdXSIgb24tY2xpY2s9ImFkZFZhbHVlIiBjbGFzcz0iZmVhdHVyZS1kaWFsb2ctYnV0dG9uIj4KICAgICAgICAgICAgICAgICAgICBBZGQgZmVhdHVyZSB2YWx1ZQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIG9uLWNsaWNrPSJvcGVuQWRkRmVhdHVyZURpYWxvZyIgaWNvbj0iYWRkIiB0aXRsZT0iQWRkIGZlYXR1cmUiIGNsYXNzJD0iW1tnZXRBZGRWYWx1ZUJ1dHRvbkNsYXNzKHJlYWRvbmx5KV1dIj4KICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgogICAgPHBhcGVyLWljb24tYnV0dG9uIGlkPSJkZWxldGV2YWx1ZSIgaWNvbj0iZGVsZXRlIiBjbGFzcyQ9IltbZ2V0RGVsZXRlVmFsdWVCdXR0b25DbGFzcyhyZWFkb25seSwgc2hvd0RlbGV0ZVZhbHVlQnV0dG9uKV1dIiBkYXRhLWZlYXR1cmU9IltbZm9jdXNlZEZlYXR1cmVOYW1lXV0iIGRhdGEtaW5kZXg9IltbZm9jdXNlZEZlYXR1cmVWYWx1ZUluZGV4XV0iIGRhdGEtc2VxLW51bT0iW1tmb2N1c2VkU2VxTnVtYmVyXV0iIG9uLWNsaWNrPSJkZWxldGVWYWx1ZSIgdGl0bGU9IkRlbGV0ZSB2YWx1ZSI+CiAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgPHBhcGVyLWRpYWxvZyBpZD0iYWRkRmVhdHVyZURpYWxvZyI+CiAgICAgIDxoMj5BZGQgRmVhdHVyZTwvaDI+CiAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iRmVhdHVyZSBuYW1lIiB2YWx1ZT0ie3tuZXdGZWF0dXJlTmFtZX19Ij48L3BhcGVyLWlucHV0PgogICAgICA8cGFwZXItcmFkaW8tZ3JvdXAgc2VsZWN0ZWQ9Int7bmV3RmVhdHVyZVR5cGV9fSI+CiAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJpbnQiPkludDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iZmxvYXQiPkZsb2F0PC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJieXRlcyI+Qnl0ZXM8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgPHBhcGVyLWJ1dHRvbiBkaWFsb2ctZGlzbWlzcyBjbGFzcz0iY29udHJvbC1idXR0b24iIG9uLWNsaWNrPSJhZGRGZWF0dXJlIiBkaXNhYmxlZD0iW1shc2hvdWxkRW5hYmxlQWRkRmVhdHVyZShuZXdGZWF0dXJlTmFtZSldXSI+CiAgICAgICAgQ3JlYXRlCiAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgPC9wYXBlci1kaWFsb2c+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1pbnRlcmFjdGl2ZS1pbmZlcmVuY2UtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaWQ9ImxpbnRlci1wYXBlci1idXR0b24tc3R5bGUiPgogICAgICAvKioKICAgICAgICogVGhpcyBzdHlsZSBwcmVzZXJ2ZXMgdGhlIHN0eWxpbmcgcHJldmlvdXMgdG8KICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL1BvbHltZXJFbGVtZW50cy9wYXBlci1idXR0b24vcHVsbC8xMTUKICAgICAgICogVGhpcyBjaGFuZ2UgY2FuIGJyZWFrIHRoZSBsYXlvdXQgb2YgcGFwZXItYnV0dG9uIGNvbnRlbnQuCiAgICAgICAqIFJlbW92ZSB0aGlzIHN0eWxlIHRvIGFwcGx5IHRoZSBjaGFuZ2UsIG1vcmUgZGV0YWlscyBhdCBiLzcwNTI4MzU2LgogICAgICAgKi8KICAgICAgcGFwZXItYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8nLCAnTm90bycsIHNhbnMtc2VyaWY7CiAgICAgICAgLS1wYXBlci10YWItaW5rOiB2YXIoLS10Yi1vcmFuZ2UtZGFyayk7CiAgICAgICAgLS13aXQtY29sb3ItZ3JheTMwMDogI2RhZGNlMDsKICAgICAgfQoKICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgI2NsYXNzaWZpY2F0aW9uIHsKICAgICAgICB3aWR0aDogNDAlOwogICAgICB9CgogICAgICAuZXhhbXBsZS1ob2xkZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuaW5mZXJlbmNlLXNlY3Rpb24taG9sZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG1hcmdpbi10b3A6IDZweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDZweDsKICAgICAgfQoKICAgICAgLmluZmVyZW5jZS1zZWN0aW9uIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgIH0KCiAgICAgIC5pbmZlcmVuY2Utdmlld2VyIHsKICAgICAgICBtYXgtaGVpZ2h0OiAzNSU7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CgogICAgICAuY29tcGFyZS1pbmZlcmVuY2Utdmlld2VyIHsKICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgfQoKICAgICAgLnRmLW9wdGlvbi1zZWxlY3Rvci0wIC5jb250ZW50LXdyYXBwZXIudGYtb3B0aW9uLXNlbGVjdG9yID4gKiB7CiAgICAgICAgd2lkdGg6IDQwJTsKICAgICAgfQoKICAgICAgcGFwZXItcHJvZ3Jlc3MgewogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtYWN0aXZlLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA2MHB4OwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5wZHBsb3QtcHJvZ3Jlc3MgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAubm9leGFtcGxlcyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNzVweDsKICAgICAgICBsZWZ0OiAzMHB4OwogICAgICB9CgogICAgICAuY2VudGVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5pbmZvLXRleHQgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4yNXB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1hcmdpbjogMTJweCBhdXRvOwogICAgICB9CgogICAgICAucGQtaW5mby10ZXh0IHsKICAgICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgICAgY29sb3I6ICMzYzQwNDM7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgICAgcGFkZGluZy10b3A6IDEycHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogNHB4OwogICAgICAgIHBhZGRpbmctbGVmdDogMTJweDsKICAgICAgfQoKICAgICAgLnBkLW5vLWZlYXR1cmVzLXRleHQgewogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgICBwYWRkaW5nOiAxMnB4IDQ4cHg7CiAgICAgIH0KCiAgICAgIC5hY2NlcHQtYnV0dG9uLWhvbGRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgIH0KCiAgICAgIC5zZXR0aW5ncy1idXR0b24gewogICAgICAgIG1hcmdpbi10b3A6IDRweDsKICAgICAgfQoKICAgICAgLmRhdGFwb2ludC1yaWdodC1jb250cm9scy1ob2xkZXIgLmNvbnRyb2wgewogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAuYnV0dG9uIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgMCAwOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLmJ1dHRvbltkaXNhYmxlZF0gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNjY2M7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1hbmQtdG9vbHRpcCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmxhYmVsLXZvY2FiLXBhdGgtaW5wdXQgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQoKICAgICAgLnRocmVzaG9sZC1kcm9wZG93biB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogMTZweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgY29sb3I6ICMzYzQwNDM7CiAgICAgICAgfQogICAgICB9CgogICAgICAuc2hvcnQtZHJvcGRvd24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMTAwcHg7CiAgICAgICAgbWluLXdpZHRoOiA1MHB4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDVweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgY29sb3I6ICMzYzQwNDM7CiAgICAgICAgfQogICAgICB9CgogICAgICAuc2xpZGVyLWxhYmVsIHsKICAgICAgICBtYXJnaW4tdG9wOiA4cHg7CiAgICAgIH0KCiAgICAgIC5mYWNldC1sYWJlbCB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItdW5kZXJsaW5lOiB7CiAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5zbGlkZXIgewogICAgICAgIHdpZHRoOiAyODBweDsKICAgICAgICAtLXBhcGVyLXNsaWRlci1pbnB1dDogewogICAgICAgICAgd2lkdGg6IDgwcHg7CiAgICAgICAgfQogICAgICB9CgogICAgICAuc2xpZGVyLW1vZGVsLW9uZSB7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogIzEyYjVjZTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3I6ICMxMmI1Y2U7CiAgICAgIH0KCiAgICAgIC5zbGlkZXItbW9kZWwtdHdvIHsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiAjZmE3ODE3OwogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogI2ZhNzgxNzsKICAgICAgfQoKICAgICAgcGFwZXItZGlhbG9nLmluZmVyZW5jZS1zZXR0aW5ncyB7CiAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgICB3aWR0aDogNDAlOwogICAgICAgIG1heC13aWR0aDogNDAlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgfQoKICAgICAgLmRhc2hib2FyZC1sYXlvdXQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAuY2VudGVyIHsKICAgICAgICB3aWR0aDogNjAlOwogICAgICB9CgogICAgICAuc2lkZS1ob2xkZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogNDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIC5zaWRlLWNvbnRlbnQgewogICAgICAgIHBhZGRpbmctbGVmdDogNXB4OwogICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgLSAxMHB4KTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIH0KCiAgICAgIC5zaWRlLXRhYnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA1MHB4KTsKICAgICAgfQoKICAgICAgLmRhdGFwb2ludC10YWIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgIC5jb25maWctdGFiIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAuY29uZmlnLXNpZGUtY29udGVudCB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiA1cHg7CiAgICAgICAgd2lkdGg6IDMwJTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgfQoKICAgICAgLmNvbmZpZy1tYWluLWNvbnRlbnQgewogICAgICAgIHdpZHRoOiA3MCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGJhY2tncm91bmQ6ICNmOGY5ZmE7CiAgICAgIH0KCiAgICAgIC5zdGF0cy10YWIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgIC5wZC10YWIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHBhZGRpbmc6IDVweCAxMHB4OwogICAgICB9CgogICAgICAucGQtcGxvdHMtaGVhZGVyIHsKICAgICAgICBoZWlnaHQ6IDUycHg7CiAgICAgICAgbWluLWhlaWdodDogNTJweDsKICAgICAgICBtYXgtaGVpZ2h0OiA1MnB4OwogICAgICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDJweCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5wZHBsb3RzLWhvbGRlciB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIG92ZXJmbG93LXk6IG92ZXJsYXk7CiAgICAgICAgYmFja2dyb3VuZDogI2Y4ZjlmYTsKICAgICAgfQoKICAgICAgLnBkLXJhbmdlLWh5cGhlbiB7CiAgICAgICAgcGFkZGluZy1yaWdodDogNnB4OwogICAgICAgIHBhZGRpbmctdG9wOiA4cHg7CiAgICAgIH0KCiAgICAgIC5wZC1yYW5nZS1jb250cm9sIHsKICAgICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggI2ZjYzkzNDsKICAgICAgICBib3JkZXItdG9wOiBub25lOwogICAgICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgICAgIGJvcmRlci1yaWdodDogbm9uZTsKICAgICAgICBoZWlnaHQ6IDM2cHg7CiAgICAgICAgd2lkdGg6IDEwNHB4OwogICAgICAgIG1hcmdpbi1yaWdodDogNnB4OwogICAgICB9CgogICAgICAjb3ZlcnZpZXcgewogICAgICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAuaW5mZXJlbmNlLWhlYWRlci5oZWFkaW5nIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZTRmN2ZiOwogICAgICB9CgogICAgICAucmlnaHQtc2lkZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgLnJpZ2h0LXNpZGUtcGVyZm9ybWFuY2UtdGFiIHsKICAgICAgICBtYXJnaW46IDRweDsKICAgICAgfQoKICAgICAgdGYtY29uZnVzaW9uLW1hdHJpeCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIC5kYXRhcG9pbnQtY29udHJvbHMtaG9sZGVyLmRhdGFwb2ludC1jb250cm9sLWJ1dHRvbnMtaG9sZGVyIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgfQoKICAgICAgLmRhdGFwb2ludC1jb250cm9scy1ob2xkZXIuZGF0YXBvaW50LWNvbnRyb2wtc2VhcmNoLWhvbGRlciB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAxMHB4OwogICAgICB9CgogICAgICAuZGF0YXBvaW50LWNvbnRyb2xzLWhvbGRlciB7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgbWFyZ2luLWxlZnQ6IDFweDsKICAgICAgfQoKICAgICAgLmRhdGFwb2ludC1sZWZ0LWNvbnRyb2xzLWhvbGRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KCiAgICAgIC5kYXRhcG9pbnQtcmlnaHQtY29udHJvbHMtaG9sZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAudGYtY2F0ZWdvcnktcGFuZSB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CgogICAgICAudGYtY2F0ZWdvcnktcGFuZS1jb250ZW50IHsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0td2l0LWNvbG9yLWdyYXkzMDApOwogICAgICAgIGJvcmRlci10b3A6IG5vbmU7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMnB4OwogICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAycHg7CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgIH0KCiAgICAgIDpob3N0IHZ6LWxpbmUtY2hhcnQyIHsKICAgICAgICBtYXJnaW46IDEycHggMTJweCAxMnB4IDI0cHg7CiAgICAgICAgaGVpZ2h0OiAxODBweDsKICAgICAgICB3aWR0aDogMzAwcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICA6aG9zdCB2ei1iYXItY2hhcnQgewogICAgICAgIG1hcmdpbjogMTJweCAxMnB4IDEycHggMjRweDsKICAgICAgICBoZWlnaHQ6IDI0MHB4OwogICAgICAgIHdpZHRoOiA0NTBweDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIC5wZC1pbnB1dC1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBwYWRkaW5nOiAxMnB4IDQ4cHggMjRweCAyNHB4OwogICAgICAgIGJhY2tncm91bmQ6ICNmZWY3ZTA7CiAgICAgICAgYm9yZGVyOiBzb2xpZCAxcHggI2ZkZTI5MzsKICAgICAgfQoKICAgICAgLnN0eWxlLWlucHV0IHsKICAgICAgICB3aWR0aDogNTBweDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLmZlYXR1cmUtY29udGFpbmVyLWhvbGRlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgLmRhdGFwb2ludC1jb250cm9sLWZpbHRlci1pbnB1dCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIG1heC13aWR0aDogNjAlOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyOiB7CiAgICAgICAgICBwYWRkaW5nOiA0cHggNnB4IDJweCA0cHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGNvbG9yOiAjODA4NjhiOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLmRhdGFwb2ludC1jb250cm9sLWZpbHRlci1pbnB1dCBpcm9uLWljb24gewogICAgICAgIGNvbG9yOiAjOWJhMGE2OwogICAgICB9CgogICAgICAuZmVhdHVyZS1zZWFyY2gtaW5wdXQgewogICAgICAgIHBhZGRpbmctdG9wOiAzcHg7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIG1heC13aWR0aDogMTUwcHg7CiAgICAgIH0KCiAgICAgIC5udW0tYnVja2V0cy1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDQ1cHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA4cHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0td2l0LWNvbG9yLWdyYXkzMDApOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1vcmFuZ2UtZGFyayk7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgbWFyZ2luOiA1cHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLWJ1dHRvbltkaXNhYmxlZF0gewogICAgICAgIGNvbG9yOiAjNWY2MzY4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmNGY0ZjQ7CiAgICAgIH0KCiAgICAgIC5tYWluLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLWRhcmspOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXRiLW9yYW5nZS1kYXJrKTsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgbWFyZ2luOiA1cHg7CiAgICAgIH0KCiAgICAgIC5tYWluLWJ1dHRvbltkaXNhYmxlZF0gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JheTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBsaWdodGdyYXk7CiAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgIH0KCiAgICAgIC5vcHRpbWl6ZS10aHJlc2hvbGQtYnV0dG9uIHsKICAgICAgICBtYXJnaW46IDVweCAwOwogICAgICAgIHdpZHRoOiAxNTBweDsKICAgICAgICBtaW4td2lkdGg6IDE1MHB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTZweDsKICAgICAgfQoKICAgICAgLmNsb3NlLXBhcnRpYWwtZGVwcy1idXR0b24gewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgfQoKICAgICAgcGFwZXItdGFicyB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAtLXBhcGVyLXRhYnMtc2VsZWN0aW9uLWJhci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLWRhcmspOwogICAgICB9CgogICAgICBwYXBlci10YWIgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIHBhZGRpbmc6IDAgMjRweDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4xcHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXRhYjpub3QoLmlyb24tc2VsZWN0ZWQpIHsKICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgfQoKICAgICAgcGFwZXItdGFiLmlyb24tc2VsZWN0ZWQgewogICAgICAgIGNvbG9yOiAjMjAyMTI0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC5wZXJmcy1ob2xkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIG1hcmdpbjogNHB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLnBlcmYtaG9sZGVyIHsKICAgICAgICBtYXJnaW46IDhweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5wZXJmLWN1cnZlLXgtbGFiZWwgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3R0b206IDJweDsKICAgICAgICBsZWZ0OiAxMzhweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICM1ZjYzNjg7CiAgICAgICAgcGFkZGluZzogMHB4OwogICAgICAgIHdpZHRoOiAxMjBweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5wZXJmLWN1cnZlLXktbGFiZWwgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiA0NHB4OwogICAgICAgIGJvdHRvbTogNTRweDsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgYm90dG9tOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBjb2xvcjogIzVmNjM2ODsKICAgICAgICB3aWR0aDogMTIwcHg7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAuZmxleCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLnNwYWNlLWJldHdlZW4gewogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQoKICAgICAgLmZsZXgtd3JhcCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KCiAgICAgIC5vcHRpbWl6ZS10ZXh0IHsKICAgICAgICBtYXJnaW46IDVweCAwOwogICAgICAgIGNvbG9yOiBncmV5OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQoKICAgICAgLnRocmVzaG9sZC1jb3N0LWlucHV0IHsKICAgICAgICB3aWR0aDogMTUwcHg7CiAgICAgICAgbWluLXdpZHRoOiAxNTBweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDE2cHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGNvbG9yOiAjM2M0MDQzOwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgY29sb3I6ICM4MDg2OGI7CiAgICAgICAgfQogICAgICB9CgogICAgICAuYm9sZCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQoKICAgICAgLmluZGVudCB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5mZWF0dXJlLWJyZWFrZG93biB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEycHg7CiAgICAgIH0KCiAgICAgIC5vcHRpbWl6ZS1zZWxlY3Rpb24tYnV0dG9uIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KCiAgICAgIC5yZWctdGFibGUtY2F0ZWdvcnkgewogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIC5yZWctdGFibGUtdmFsdWUgewogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CgogICAgICAuc3ViZmVhdHVyZS10YWJsZSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5jb3VudGVyZmFjdHVhbC1idXR0b24taW50cm8gewogICAgICAgIHBhZGRpbmc6IDdweCAwIDAgMTBweDsKICAgICAgfQoKICAgICAgLm1haW4tdmVydGljYWwgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAubWFpbi1ib3R0b20tYmFyIHsKICAgICAgICBoZWlnaHQ6IDUycHg7CiAgICAgICAgbWluLWhlaWdodDogNTJweDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAvKiBib3gtc2hhZG93OiAwIDJweCA1cHggZ3JleTsKICAgICAgICBtYXJnaW4tYm90dG9tOiAzcHg7ICovCiAgICAgICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICNkYWRjZTA7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9CgogICAgICAubWFpbi1jb250ZW50IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5kaXN0LXN3aXRjaCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CgogICAgICAuZGlzdGFuY2UtdmlzLWRyb3Bkb3duIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CgogICAgICAjZGlzdGFuY2VkaWFsb2cgewogICAgICAgIHdpZHRoOiAzMCU7CiAgICAgIH0KCiAgICAgICNkaXN0YW5jZWRpYWxvZyAuYnV0dG9ucyB7CiAgICAgICAgY29sb3I6ICNmNTdjMDA7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGNvbG9yOiAjM2M0MDQzOwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtY29sb3I6ICMzYzQwNDM7CiAgICAgICAgLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWluay1jb2xvcjogIzNjNDA0MzsKICAgICAgICAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1jaGVja2VkLWNvbG9yOiAjM2M0MDQzOwogICAgICAgIC0tcGFwZXItcmFkaW8tYnV0dG9uLWNoZWNrZWQtaW5rLWNvbG9yOiAjM2M0MDQzOwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgY29sb3I6ICM1ZjYzNjg7CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uW2Rpc2FibGVkXSB7CiAgICAgICAgY29sb3I6ICM5YWEwYTY7CiAgICAgIH0KCiAgICAgIC5yZXNpemVyIHsKICAgICAgICBkaXNwbGF5OiB0YWJsZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDhweDsKICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAuZXhhbXBsZS1zdGF0dXMgewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBjb2xvcjogIzVmNjM2ODsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgcGFkZGluZy10b3A6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5leGFtcGxlLWlkLWxhYmVsIHsKICAgICAgICBwYWRkaW5nOiA5cHggNXB4IDlweCAwOwogICAgICB9CgogICAgICAuZXhhbXBsZS1pZC1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDcwcHg7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgfQoKICAgICAgLmhlYWRpbmctYW5kLWNhcmQgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGxpZ2h0Z3JheTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgICAgcGFkZGluZy10b3A6IDFweDsKICAgICAgfQoKICAgICAgLmVkaXRvci1oZWFkaW5nLWFuZC1jYXJkIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIG92ZXJmbG93LXk6IG92ZXJsYXk7CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nIHsKICAgICAgICBjb2xvcjogIzVmNjM2ODsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogMTBweCA4cHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZjdlMDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0td2l0LWNvbG9yLWdyYXkzMDApOwogICAgICAgIGJvcmRlci10b3A6IG5vbmU7CiAgICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiBub25lOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQoKICAgICAgLmNhcmQgewogICAgICAgIHBhZGRpbmc6IDAgMTBweCA1cHg7CiAgICAgIH0KCiAgICAgIC5uby1wYWRkaW5nLWNhcmQgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC50b29sdGlwIHsKICAgICAgICAtLXBhcGVyLXRvb2x0aXA6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci10b29sdGlwLWRlbGF5LW91dDogMjAwMG1zOwogICAgICB9CgogICAgICAuY29tbWVudC1pY29uIHsKICAgICAgICB3aWR0aDogMzBweDsKICAgICAgICBoZWlnaHQ6IDMwcHg7CiAgICAgICAgbWluLXdpZHRoOiAzMHB4OwogICAgICAgIG1pbi1oZWlnaHQ6IDMwcHg7CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgICBjb2xvcjogdmFyKC0tdGItb3JhbmdlLWRhcmspOwogICAgICB9CgogICAgICAuYXJyb3ctaWNvbiB7CiAgICAgICAgd2lkdGg6IDUwcHg7CiAgICAgICAgaGVpZ2h0OiA1MHB4OwogICAgICAgIG1pbi13aWR0aDogNTBweDsKICAgICAgICBtaW4taGVpZ2h0OiA1MHB4OwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1vcmFuZ2UtZGFyayk7CiAgICAgIH0KCiAgICAgIC5wZC1hcnJvdy1pY29uIHsKICAgICAgICB3aWR0aDogNDBweDsKICAgICAgICBoZWlnaHQ6IDQwcHg7CiAgICAgICAgbWluLXdpZHRoOiA0MHB4OwogICAgICAgIG1pbi1oZWlnaHQ6IDQwcHg7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICAgIGNvbG9yOiBncmV5OwogICAgICB9CgogICAgICAucGQtdG9nZ2xlIHsKICAgICAgICBtYXJnaW46IDAgOHB4IDAgMjBweDsKICAgICAgfQoKICAgICAgLnBkLWVudHJ5LWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQoKICAgICAgLmluZm8taWNvbiB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIG1pbi13aWR0aDogMjBweDsKICAgICAgICBtaW4taGVpZ2h0OiAyMHB4OwogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgICAgY29sb3I6IGdyZXk7CiAgICAgIH0KCiAgICAgIC5pbmZvLWljb24uY2YtaW5mby1pY29uIHsKICAgICAgICBtYXJnaW4tdG9wOiAxMnB4OwogICAgICB9CgogICAgICAuaW5mby1pY29uLnRocmVzaC1pbmZvLWljb24gewogICAgICAgIG1hcmdpbi10b3A6IC0zcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQoKICAgICAgLmluZm8taWNvbi5wZC1pbmZvLWljb24gewogICAgICAgIG1hcmdpbi10b3A6IDE1cHg7CiAgICAgIH0KCiAgICAgIC5pbmZvLWljb24udGhyZXNob2xkLWluZm8taWNvbiB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiA1cHg7CiAgICAgIH0KCiAgICAgIC5pbmZvLWljb24ucGVyZm9ybWFuY2UtaW5mby1pY29uIHsKICAgICAgICBtYXJnaW4tdG9wOiAxOHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDVweDsKICAgICAgfQoKICAgICAgLm5vLXBhZGRpbmcgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5yZXNpemUtaWNvbiB7CiAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICAgIGNvbG9yOiBncmV5OwogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICAgIGhlaWdodDogMTBweDsKICAgICAgICBtaW4td2lkdGg6IDEwcHg7CiAgICAgICAgbWluLWhlaWdodDogMTBweDsKICAgICAgfQoKICAgICAgLmhlbHAtdGV4dCB7CiAgICAgICAgY29sb3I6ICM1ZjYzNjg7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1heC13aWR0aDogMjAwcHg7CiAgICAgIH0KCiAgICAgIC5oZWxwLXRpdGxlIHsKICAgICAgICBjb2xvcjogIzAwN2I3YzsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICB9CgogICAgICAuaGVscC10aXRsZS1tYXJnaW4gewogICAgICAgIG1hcmdpbi10b3A6IDE0cHg7CiAgICAgIH0KCiAgICAgIC5oZWxwLXRpdGxlLW1hcmdpbi1idXR0b24gewogICAgICAgIG1hcmdpbi10b3A6IDRweDsKICAgICAgfQoKICAgICAgLmhlbHAtdGl0bGUtbWFyZ2luLXRpdGxlIHsKICAgICAgICBtYXJnaW4tdG9wOiA3cHg7CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctbGluayB7CiAgICAgICAgY29sb3I6ICM1ZjYzNjg7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5wZXJmLWN1cnZlLXRleHQgewogICAgICAgIGNvbG9yOiAjM2M0MDQzOwogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBtYXJnaW4tbGVmdDogNDRweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAtMTBweDsKICAgICAgfQoKICAgICAgLmNvbmYtdGV4dCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICAgIGNvbG9yOiAjM2M0MDQzOwogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgfQoKICAgICAgLmRpYWxvZy10ZXh0IHsKICAgICAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQoKICAgICAgLmRpYWxvZy10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC50aXRsZS13aWR0aCB7CiAgICAgICAgd2lkdGg6IDI1MHB4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5kYXRhcG9pbnQtaW5mby1ob2xkZXIgewogICAgICAgIG1hcmdpbjogMjRweCBhdXRvOwogICAgICAgIG1heC13aWR0aDogMzgwcHg7CiAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgfQoKICAgICAgLm9uYm9hcmRpbmctaGVhZGVyIHsKICAgICAgICBjb2xvcjogIzIwMjEyNDsKICAgICAgICBmb250LXNpemU6IDIycHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjhweDsKICAgICAgfQoKICAgICAgLm9uYm9hcmRpbmctdGV4dCB7CiAgICAgICAgY29sb3I6ICMzYzQwNDM7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLWluZm8taGVhZGVyIHsKICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLWluZm8tdGV4dCB7CiAgICAgICAgY29sb3I6ICMzYzQwNDM7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgICAgbWF4LXdpZHRoOiA0NjBweDsKICAgICAgfQoKICAgICAgLmJ1dHRvbi1wcmVmaXgtbGFiZWwgewogICAgICAgIG1hcmdpbjogMTJweCAwIDAgMTJweDsKICAgICAgICBjb2xvcjogZ3JleTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KCiAgICAgIC5ib3JkZXItcmlnaHQgewogICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgfQoKICAgICAgcGFwZXItZGlhbG9nIHsKICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgICAgIG1heC13aWR0aDogNjAwcHg7CiAgICAgIH0KCiAgICAgIC5tYWluLWJ1dHRvbi5ydW4tYnV0dG9uIHsKICAgICAgICBwYWRkaW5nOiA1cHg7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CgogICAgICAuZG9jLWltYWdlIHsKICAgICAgICB3aWR0aDogMTI4cHg7CiAgICAgICAgaGVpZ2h0OiA5NnB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgfQoKICAgICAgLmNvbnRyb2wtZGl2aWRlciB7CiAgICAgICAgbWFyZ2luOiA1cHggMCA1cHggNXB4OwogICAgICAgIHdpZHRoOiA1cHg7CiAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgIH0KCiAgICAgIC5vcHRpbWl6YXRpb24tcmFkaW8gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDdweDsKICAgICAgfQoKICAgICAgLm9wdGltaXphdGlvbi1yYWRpby1ncm91cCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgLmluZmVyLWluZm8gewogICAgICAgIG1hcmdpbi1sZWZ0OiAzMHB4OwogICAgICB9CgogICAgICAuc2Nyb2xsLXggewogICAgICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICAgIH0KCiAgICAgIC5wZXJmLXRhYmxlLWNsaWNrYWJsZSB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAucGVyZi10YWJsZS10aXRsZS1yb3cgewogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgICBtaW4taGVpZ2h0OiA1MnB4OwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQogICAgICAucGVyZi10YWJsZS10aXRsZSB7CiAgICAgICAgY29sb3I6ICMzYzQwNDM7CiAgICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiAxNHB4OwogICAgICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgICAgIH0KICAgICAgLnBlcmYtdGFibGUtc29ydC1tZW51IHsKICAgICAgICBtYXJnaW4tdG9wOiAtMTBweDsKICAgICAgfQogICAgICAucGVyZi10YWJsZS1oZWFkZXIgewogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICM4MDg2OGI7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxNnB4OwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjI1OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgICBtaW4taGVpZ2h0OiBtaW4tY29udGVudDsKICAgICAgICBwYWRkaW5nLXRvcDogMTJweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogNHB4OwogICAgICB9CgogICAgICAucGVyZi10YWJsZS1lbnRyaWVzLWhvbGRlciB7CiAgICAgICAgb3ZlcmZsb3cteTogb3ZlcmxheTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KCiAgICAgIC5wZXJmLXRhYmxlLWVudHJ5IHsKICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4IHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgfQoKICAgICAgLnBlcmYtdGFibGUtZW50cnkucGVyZi10YWJsZS1lbnRyeS10cml2aWFsIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZjRmNGY0OwogICAgICB9CgogICAgICAucGVyZi10YWJsZS1lbnRyeS1leHBhbmRlZCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgbWFyZ2luOiAwIDEycHg7CiAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgIH0KCiAgICAgIC5wZXJmLXRhYmxlLXJvdyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5wZXJmLXRhYmxlLXJvdy1leHBhbmRlZCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0td2l0LWNvbG9yLWdyYXkzMDApOwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDJweCAwIHJnYmEoNjAsIDY0LCA2NywgMC4zKSwKICAgICAgICAgIDAgMXB4IDNweCAxcHggcmdiYSg2MCwgNjQsIDY3LCAwLjE1KTsKICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5wZXJmLXRhYmxlLXRleHQtZW50cnkgewogICAgICAgIGhlaWdodDogNDBweDsKICAgICAgICBwYWRkaW5nLXRvcDogMTZweDsKICAgICAgfQogICAgICAucGVyZi10YWJsZS1udW0tZW50cnkgewogICAgICAgIGhlaWdodDogNDBweDsKICAgICAgICBwYWRkaW5nLXRvcDogMTZweDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQogICAgICAucGVyZi10YWJsZS1hcnJvdyB7CiAgICAgICAgbWluLXdpZHRoOiA0MHB4OwogICAgICAgIHdpZHRoOiA0MHB4OwogICAgICAgIG1hcmdpbi10b3A6IDhweDsKICAgICAgfQogICAgICAucGVyZi10YWJsZS12YWwgewogICAgICAgIHdpZHRoOiAzMCU7CiAgICAgIH0KICAgICAgLnBlcmYtdGFibGUtY291bnQgewogICAgICAgIHdpZHRoOiAxMCU7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyMHB4OwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CiAgICAgIC5wZXJmLXRhYmxlLW1vZGVsIHsKICAgICAgICBtaW4td2lkdGg6IDEwMHB4OwogICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgfQogICAgICAucGVyZi10YWJsZS1tb2RlbC1zaW5nbGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLnBlcmYtdGFibGUtdGhyZXNob2xkIHsKICAgICAgICB3aWR0aDogMjgwcHg7CiAgICAgICAgbWluLXdpZHRoOiAyODBweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnBlcmYtdGFibGUtZXJyb3IgewogICAgICAgIHdpZHRoOiAxNSU7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KICAgICAgLnBlcmYtdGFibGUtc3EtZXJyb3IgewogICAgICAgIHdpZHRoOiAxNSU7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyMHB4OwogICAgICB9CiAgICAgIC5wZXJmLXRhYmxlLWZwIHsKICAgICAgICB3aWR0aDogMTUlOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CiAgICAgIC5wZXJmLXRhYmxlLWZuIHsKICAgICAgICB3aWR0aDogMTUlOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CiAgICAgIC5wZXJmLXRhYmxlLWFjYyB7CiAgICAgICAgd2lkdGg6IDE1JTsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7CiAgICAgIH0KICAgICAgLnBlcmYtdGFibGUtZjEgewogICAgICAgIHdpZHRoOiAxMCU7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyMHB4OwogICAgICB9CiAgICAgIC5wZXJmLWJ1dHRvbiB7CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgfQoKICAgICAgLnBlcmYtc29ydC1ib3ggewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICB9CiAgICAgIC5jb3VudGVyZmFjdHVhbC10b2dnbGUgewogICAgICAgIG1hcmdpbjogNHB4IDRweCA0cHggNnB4OwogICAgICAgIHBhZGRpbmctdG9wOiA0cHg7CiAgICAgICAgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYmFyLWNvbG9yOiAjODFjOTk1OwogICAgICB9CiAgICAgIC5jb3VudGVyZmFjdHVhbC1kZWx0YSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDZweDsKICAgICAgfQogICAgICAuY291bnRlcmZhY3R1YWwtZGVsdGEgbGFiZWwgewogICAgICAgIHBhZGRpbmctdG9wOiAxMnB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiA4cHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA0cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGNvbG9yOiByZ2IoNjAsIDY0LCA2Nyk7CiAgICAgIH0KICAgICAgLmNvdW50ZXJmYWN0dWFsLWRlbHRhIHBhcGVyLXNsaWRlciB7CiAgICAgICAgaGVpZ2h0OiA0MHB4OwogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogIzgxYzk5NTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiAjODFjOTk1OwogICAgICAgIC0tcGFwZXItc2xpZGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgY29sb3I6IHJnYig2MCwgNjQsIDY3KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLmRhdGFwb2ludC1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjAyMTI0OwogICAgICAgIGJhY2tncm91bmQ6ICNmZGUyOTM7CiAgICAgIH0KICAgICAgLmluZmVyLWJ1dHRvbiB7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgIGJhY2tncm91bmQ6ICMxMjhlYWY7CiAgICAgIH0KICAgICAgLmZsZXgtZ3JvdyB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICAgIC5mbGV4LXJvdy1yZXZlcnNlIHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgIH0KICAgICAgLnRocmVzaG9sZC1pbmZvLWhvbGRlciB7CiAgICAgICAgbWFyZ2luLXRvcDogLTJweDsKICAgICAgfQogICAgICAudGFicyB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAzMnB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICB9CiAgICAgIC5yb3RhdGVkLWljb24gewogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7CiAgICAgIH0KICAgICAgLmRhdGFwb2ludC1jb250cm9sLWJ1dHRvbiB7CiAgICAgICAgd2lkdGg6IDI4cHg7CiAgICAgICAgaGVpZ2h0OiAyOHB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgIH0KICAgICAgLnBkLWhvbGRlciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAzMDBweDsKICAgICAgfQogICAgICAucGQteS1sYWJlbCB7CiAgICAgICAgY29sb3I6ICM1ZjYzNjg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGxlZnQ6IC0yMHB4OwogICAgICAgIHBhZGRpbmc6IDBweDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA4MHB4OwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7CiAgICAgIH0KICAgICAgLnBkLXgtbGFiZWwgewogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBjb2xvcjogIzVmNjM2ODsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBwYWRkaW5nOiAwIDAgMCA0MHB4OwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQogICAgICBwYXBlci10b2dnbGUtYnV0dG9uIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYnV0dG9uLWNvbG9yOiB3aGl0ZTsKICAgICAgICAtLXBhcGVyLXRvZ2dsZS1idXR0b24tbGFiZWwtY29sb3I6ICMzYzQwNDM7CiAgICAgIH0KICAgICAgLmJ1dHRvbi1hbmQtcHJvZ3Jlc3MtaG9sZGVyIHsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIC5zb3J0LXByb2dyZXNzIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA4cHg7CiAgICAgICAgbGVmdDogN3B4OwogICAgICAgIHdpZHRoOiAyMjBweDsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWFjdGl2ZS1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgIH0KICAgICAgI2F0dHJpYnV0aW9uTGVnZW5kIHsKICAgICAgICB3aWR0aDogMTYwcHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIG1hcmdpbi10b3A6IDhweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDhweDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDx0Zi1wbHVnaW4tZGlhbG9nIGlkPSJpbml0aWFsRGlhbG9nIj48L3RmLXBsdWdpbi1kaWFsb2c+CiAgICA8cGFwZXItZGlhbG9nIGlkPSJpbmZlcmVuY2VzZXR0aW5ncyIgY2xhc3M9ImluZmVyZW5jZS1zZXR0aW5ncyIgb3BlbmVkPSJbWyFsb2NhbF1dIj4KICAgICAgPHRmLWluZmVyZW5jZS1wYW5lbCBpbmZlcmVuY2UtYWRkcmVzcz0ie3tpbmZlcmVuY2VBZGRyZXNzfX0iIG1vZGVsLW5hbWU9Int7bW9kZWxOYW1lfX0iIGV4YW1wbGVzLXBhdGg9Int7ZXhhbXBsZXNQYXRofX0iIG1vZGVsLXR5cGU9Int7bW9kZWxUeXBlfX0iIG1vZGVsLXZlcnNpb249Int7bW9kZWxWZXJzaW9ufX0iIG1vZGVsLXNpZ25hdHVyZT0ie3ttb2RlbFNpZ25hdHVyZX19IiBtYXgtZXhhbXBsZXM9Int7bWF4RXhhbXBsZXN9fSIgbGFiZWwtdm9jYWItcGF0aD0ie3tsYWJlbFZvY2FiUGF0aH19IiBtdWx0aS1jbGFzcz0ie3ttdWx0aUNsYXNzfX0iIHNhbXBsaW5nLW9kZHM9Int7c2FtcGxpbmdPZGRzfX0iIHNlcXVlbmNlLWV4YW1wbGVzPSJ7e3NlcXVlbmNlRXhhbXBsZXN9fSIgbWF4LWNsYXNzZXMtdG8tZGlzcGxheT0ie3ttYXhJbmZlcmVuY2VFbnRyaWVzUGVyUnVufX0iIHVzZS1wcmVkaWN0LWFwaT0ie3t1c2VQcmVkaWN0QXBpfX0iIHByZWRpY3Qtb3V0cHV0LXRlbnNvcj0ie3twcmVkaWN0T3V0cHV0VGVuc29yfX0iIHByZWRpY3QtaW5wdXQtdGVuc29yPSJ7e3ByZWRpY3RJbnB1dFRlbnNvcn19Ij4KICAgICAgPC90Zi1pbmZlcmVuY2UtcGFuZWw+CiAgICAgIDxkaXYgY2xhc3M9ImFjY2VwdC1idXR0b24taG9sZGVyIj4KICAgICAgICA8cGFwZXItYnV0dG9uIG9uLXRhcD0iZ2V0RXhhbXBsZXNBbmRDbG9zZVNldHRpbmdzXyIgY2xhc3M9Im1haW4tYnV0dG9uIiBkaXNhYmxlZCQ9Iltbc2hvdWxkRGlzYWJsZUdldEV4YW1wbGVzQnV0dG9uXyhleGFtcGxlc1BhdGgsIG1heEV4YW1wbGVzKV1dIj4KICAgICAgICAgIEFjY2VwdAogICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgIDxwYXBlci1idXR0b24gZGlhbG9nLWRpc21pc3MgY2xhc3M9ImNvbnRyb2wtYnV0dG9uIj5DYW5jZWw8L3BhcGVyLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxwYXBlci1kaWFsb2cgaWQ9ImRlbGV0ZWRpYWxvZyI+CiAgICAgIDxwPkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhlIHNlbGVjdGVkIGRhdGFwb2ludD8KICAgICAgPGRpdiBjbGFzcz0iYnV0dG9ucyI+CiAgICAgICAgPHBhcGVyLWJ1dHRvbiBkaWFsb2ctZGlzbWlzcyBjbGFzcz0iY29udHJvbC1idXR0b24iPkNhbmNlbDwvcGFwZXItYnV0dG9uPgogICAgICAgIDxwYXBlci1idXR0b24gZGlhbG9nLWNvbmZpcm0gYXV0b2ZvY3VzIG9uLXRhcD0iZGVsZXRlRGF0YXBvaW50XyIgY2xhc3M9Im1haW4tYnV0dG9uIj5EZWxldGU8L3BhcGVyLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxwYXBlci1kaWFsb2cgaWQ9ImRpc3RhbmNlZGlhbG9nIj4KICAgICAgPGgyPlNob3cgc2ltaWxhcml0eSB0byBzZWxlY3RlZCBkYXRhcG9pbnQ8L2gyPgogICAgICA8cGFwZXItaW5wdXQgdmFsdWU9Int7ZmFjZXREaXN0RmVhdHVyZU5hbWV9fSIgbGFiZWw9Ik1ldHJpYyBuYW1lIiBjbGFzcz0iZGF0YXBvaW50LWNvbnRyb2wtZmlsdGVyLWlucHV0Ij4KICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPGRpdiBjbGFzcz0icmFkaW9sYWJlbCI+RGlzdGFuY2UgdHlwZTwvZGl2PgogICAgICA8cGFwZXItcmFkaW8tZ3JvdXAgY2xhc3M9ImRpc3Qtc3dpdGNoIiBzZWxlY3RlZD0ie3tmYWNldERpc3RTd2l0Y2h9fSI+CiAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBjbGFzcz0iZGlzdC1yYWRpbyIgbmFtZT0iTDEiIGRpc2FibGVkJD0iW1tjdXN0b21EaXN0YW5jZUZ1bmN0aW9uU2V0XV0iPkwxPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBjbGFzcz0iZGlzdC1yYWRpbyIgbmFtZT0iTDIiIGRpc2FibGVkJD0iW1tjdXN0b21EaXN0YW5jZUZ1bmN0aW9uU2V0XV0iPkwyPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBjbGFzcz0iZGlzdC1yYWRpbyIgbmFtZT0iQ3VzdG9tIiBoaWRkZW4kPSJbWyFjdXN0b21EaXN0YW5jZUZ1bmN0aW9uU2V0XV0iPlVzZXItc3BlY2lmaWVkPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGxhYmVsPSJBcHBseSB0byBkYXRhcG9pbnRzIHZpc3VhbGl6YXRpb24iIGNsYXNzPSJ0aHJlc2hvbGQtZHJvcGRvd24gZGlzdGFuY2UtdmlzLWRyb3Bkb3duIj4KICAgICAgICA8cGFwZXItbGlzdGJveCBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tmYWNldERpc3RTZXR0aW5nfX0iIGF0dHItZm9yLXNlbGVjdGVkPSJuYW1lIj4KICAgICAgICAgIDxwYXBlci1pdGVtIG5hbWU9ImNvbG9yQnkiPkNvbG9yIEJ5PC9wYXBlci1pdGVtPgogICAgICAgICAgPHBhcGVyLWl0ZW0gbmFtZT0iaG9yaXpvbnRhbEZhY2V0Ij5YLUF4aXMgQmlubmluZzwvcGFwZXItaXRlbT4KICAgICAgICAgIDxwYXBlci1pdGVtIG5hbWU9InZlcnRpY2FsRmFjZXQiPlktQXhpcyBCaW5uaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgPHBhcGVyLWl0ZW0gbmFtZT0iaG9yaXpvbnRhbFBvc2l0aW9uIj5YLUF4aXMgU2NhdHRlcjwvcGFwZXItaXRlbT4KICAgICAgICAgIDxwYXBlci1pdGVtIG5hbWU9InZlcnRpY2FsUG9zaXRpb24iPlktQXhpcyBTY2F0dGVyPC9wYXBlci1pdGVtPgogICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICA8ZGl2IGNsYXNzPSJidXR0b25zIj4KICAgICAgICA8cGFwZXItYnV0dG9uIGRpYWxvZy1kaXNtaXNzIGNsYXNzPSJjb250cm9sLWJ1dHRvbiI+Q2FuY2VsPC9wYXBlci1idXR0b24+CiAgICAgICAgPHBhcGVyLWJ1dHRvbiBkaWFsb2ctY29uZmlybSBhdXRvZm9jdXMgb24tdGFwPSJyZXF1ZXN0QWRkRGlzdGFuY2VNZXRyaWMiIGNsYXNzPSJtYWluLWJ1dHRvbiI+QXBwbHk8L3BhcGVyLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxkaXYgY2xhc3M9ImRhc2hib2FyZC1sYXlvdXQiPgogICAgICA8ZGl2IGNsYXNzPSJtYWluLXZlcnRpY2FsIj4KICAgICAgICA8ZGl2IGNsYXNzPSJtYWluLWNvbnRlbnQiPgogICAgICAgICAgPGRpdiBjbGFzcz0ibWFpbi1ib3R0b20tYmFyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGF0YXBvaW50LWxlZnQtY29udHJvbHMtaG9sZGVyIj4KICAgICAgICAgICAgICA8cGFwZXItdGFicyBjbGFzcz0idGFicyIgbm9pbmsgc2VsZWN0ZWQ9Int7c2lkZVRhYlNlbGVjdGVkfX0iPgogICAgICAgICAgICAgICAgPHBhcGVyLXRhYj5EYXRhcG9pbnQgZWRpdG9yPC9wYXBlci10YWI+CiAgICAgICAgICAgICAgICA8cGFwZXItdGFiPltbZ2V0UGVyZm9ybWFuY2VUYWJUaXRsZShtb2RlbFR5cGUsIG11bHRpQ2xhc3MpXV08L3BhcGVyLXRhYj4KICAgICAgICAgICAgICAgIDxwYXBlci10YWI+RmVhdHVyZXM8L3BhcGVyLXRhYj4KICAgICAgICAgICAgICA8L3BhcGVyLXRhYnM+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhcG9pbnQtcmlnaHQtY29udHJvbHMtaG9sZGVyIj4KICAgICAgICAgICAgICA8YSB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9ImNvbnRyb2wiIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL3RyZWUvbWFzdGVyL3RlbnNvcmJvYXJkL3BsdWdpbnMvaW50ZXJhY3RpdmVfaW5mZXJlbmNlL1JFQURNRS5tZCIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIj4KICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJoZWxwLW91dGxpbmUiIGNsYXNzPSJzZXR0aW5ncy1idXR0b24iIHRpdGxlPSJXaGF0LUlmIFRvb2wgZG9jdW1lbnRhdGlvbiI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InNldHRpbmdzIiBvbi10YXA9InNldHRpbmdzQ2xpY2tlZF8iIGNsYXNzPSJzZXR0aW5ncy1idXR0b24gY29udHJvbCIgdGl0bGU9IldoYXQtSWYgVG9vbCBzZXR0aW5ncyIgZGlzYWJsZWQkPSJbW2xvY2FsXV0iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZXhhbXBsZS1zdGF0dXMiPltbZXhhbXBsZVN0YXR1c1N0cl1dPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8aXJvbi1wYWdlcyBjbGFzcz0ic2lkZS10YWJzIiBzZWxlY3RlZD0ie3tzaWRlVGFiU2VsZWN0ZWR9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRhdGFwb2ludC10YWIiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGUtaG9sZGVyIiBpZD0ic2lkZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWFuZC1jYXJkIj4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJoZWFkaW5nIiBvbi10YXA9InRvZ2dsZUNvbnRleHRUb29scyI+CiAgICAgICAgICAgICAgICAgICAgICBWaXN1YWxpemUKICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJpZ2h0LXNpZGUgcmlnaHQtc2lkZS1wZXJmb3JtYW5jZS10YWIiPgogICAgICAgICAgICAgICAgICAgICAgICA8aXJvbi1pY29uIGljb249IltbZ2V0RXhwYW5kQ29sbGFwc2VJY29uKG9wZW5lZENvbnRleHRUb29scyldXSIgY2xhc3M9ImV4cGFuZC1jb2xsYXBzZS1idXR0b24iPjwvaXJvbi1pY29uPgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2UgY2xhc3M9Im5vLXBhZGRpbmctY2FyZCIgaWQ9ImNvbGxhcHNlY29udGV4dHRvb2xzIiBvcGVuZWQ9Int7b3BlbmVkQ29udGV4dFRvb2xzfX0iPgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIHNlbGVjdGVkPSJ7e3Zpc01vZGV9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iZGl2ZSI+RGF0YXBvaW50czwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9InBkIj5QYXJ0aWFsIGRlcGVuZGVuY2UgcGxvdHM8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4LXdyYXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJTZWxlY3QgYSBkYXRhcG9pbnQgdG8gdXNlIHRoaXMgZmVhdHVyZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2xhc3M9ImNvdW50ZXJmYWN0dWFsLXRvZ2dsZSIgY2hlY2tlZD0ie3tzaG93TmVhcmVzdENvdW50ZXJmYWN0dWFsfX0iIGRpc2FibGVkJD0iW1shaGFzU2VsZWN0ZWQoc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3cgbmVhcmVzdCBjb3VudGVyZmFjdHVhbCBkYXRhcG9pbnQKICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaW5mby1vdXRsaW5lIiBjbGFzcz0iaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kaWFsb2cgY2xhc3M9ImRpYWxvZy10ZXh0IiBob3Jpem9udGFsLWFsaWduPSJhdXRvIiB2ZXJ0aWNhbC1hbGlnbj0iYXV0byI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lYXJlc3QgY291bnRlcmZhY3R1YWwgKG5laWdoYm9yIG9mIGRpZmZlcmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NpZmljYXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBhcmVzIHRoZSBzZWxlY3RlZCBkYXRhcG9pbnQgd2l0aCBpdHMgbmVhcmVzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVpZ2hib3IgZnJvbSBhIGRpZmZlcmVudCBjbGFzc2lmaWNhdGlvbiB1c2luZyBMMSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgTDIgZGlzdGFuY2UuIElmIGEgY3VzdG9tIGRpc3RhbmNlIGZ1bmN0aW9uIGlzIHNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IHVzZXMgdGhhdCBmdW5jdGlvbiBpbnN0ZWFkLgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIHNlbGVjdGVkPSJ7e25lYXJlc3RDb3VudGVyZmFjdHVhbERpc3R9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJMMSIgZGlzYWJsZWQkPSJbW2N1c3RvbURpc3RhbmNlRnVuY3Rpb25TZXRdXSI+TDE8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9IkwyIiBkaXNhYmxlZCQ9IltbY3VzdG9tRGlzdGFuY2VGdW5jdGlvblNldF1dIj5MMjwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iQ3VzdG9tIiBoaWRkZW4kPSJbWyFjdXN0b21EaXN0YW5jZUZ1bmN0aW9uU2V0XV0iPlVzZXItc3BlY2lmaWVkPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpc1JlZ3Jlc3Npb25fKG1vZGVsVHlwZSldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iTWluaW11bSBkaXN0YW5jZSBpbiBpbmZlcnJlZCB2YWx1ZSB0byBjb25zaWRlciBjb3VudGVyZmFjdHVhbCIgY2xhc3M9ImNvdW50ZXJmYWN0dWFsLWRlbHRhIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5UaHJlc2hvbGQ8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImluZm8tb3V0bGluZSIgY2xhc3M9ImluZm8taWNvbiBuby1wYWRkaW5nIiBvbi10YXA9Im9wZW5EaWFsb2ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kaWFsb2cgY2xhc3M9ImRpYWxvZy10ZXh0IiBob3Jpem9udGFsLWFsaWduPSJhdXRvIiB2ZXJ0aWNhbC1hbGlnbj0iYXV0byI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRlcmZhY3R1YWwgdGhyZXNob2xkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciByZWdyZXNzaW9uLCBhIG5laWdoYm9yIHBvaW50IGlzIGNvbnNpZGVyZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBhIGRpZmZlcmVudCBjbGFzc2lmaWNhdGlvbiBpZiB0aGUgZGlmZmVyZW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGluZmVycmVkIHZhbHVlIGlzIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCB0aHJlc2hvbGQuPGJyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB0aHJlc2hvbGQgaXMgaW5pdGlhbGl6ZWQgdG8gdGhlIHN0YW5kYXJkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWF0aW9uIG9mIHRoZSBpbmZlcnJlZCB2YWx1ZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItc2xpZGVyIGVkaXRhYmxlIHZhbHVlPSJ7e21pbkNvdW50ZXJmYWN0dWFsVmFsdWVEaXN0fX0iIG1heD0iW1ttYXhDb3VudGVyZmFjdHVhbFZhbHVlRGlzdF1dIiBkaXNhYmxlZCQ9IltbIXNob3dOZWFyZXN0Q291bnRlcmZhY3R1YWxdXSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGxhYmVsPSJNb2RlbDoiIG5vLWxhYmVsLWZsb2F0IGNsYXNzPSJzaG9ydC1kcm9wZG93biIgaGlkZGVuJD0iW1tzaG91bGRIaWRlTW9kZWxTZWxlY3Rvcl8ocGFyc2VkTW9kZWxOYW1lcyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e25lYXJlc3RDb3VudGVyZmFjdHVhbE1vZGVsSW5kZXh9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW3BhcnNlZE1vZGVsTmFtZXNdXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPltbZ2V0TGFiZWxlZE1vZGVsTmFtZV8oaXRlbSldXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlNlbGVjdCBhIGRhdGFwb2ludCB0byB1c2UgdGhpcyBmZWF0dXJlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0iY29udHJvbC1idXR0b24gZGF0YXBvaW50LWJ1dHRvbiIgZGlzYWJsZWQkPSJbWyFoYXNTZWxlY3RlZChzZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2UpXV0iIG9uLXRhcD0ic2hvd0Rpc3RhbmNlQ2xpY2tlZF8iIGFsdD0iU2hvdyBzaW1pbGFyaXR5IHRvIHNlbGVjdGVkIGRhdGFwb2ludCIgdGl0bGU9IlNob3cgc2ltaWxhcml0eSB0byBzZWxlY3RlZCBkYXRhcG9pbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvdyBzaW1pbGFyaXR5IHRvIHNlbGVjdGVkIGRhdGFwb2ludAogICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvLW91dGxpbmUiIGNsYXNzPSJpbmZvLWljb24gY2YtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImF1dG8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvdyBzaW1pbGFyaXR5IHRvIHNlbGVjdGVkIGRhdGFwb2ludAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxjdWxhdGVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzZWxlY3RlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhcG9pbnQgYW5kIGFsbCBvdGhlciBkYXRhcG9pbnRzIGFuZCBzaG93cyB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBkYXRhcG9pbnRzIHZpc3VhbGl6YXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWFuZC1jYXJkIGVkaXRvci1oZWFkaW5nLWFuZC1jYXJkIj4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJoZWFkaW5nIj4KICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0RGF0YXBvaW50RWRpdG9yVGl0bGUoc2VsZWN0ZWRFeGFtcGxlTnVtLAogICAgICAgICAgICAgICAgICAgICAgY29tcGFyZWRJbmRpY2VzKV1dCiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibm8tcGFkZGluZy1jYXJkIj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRhdGFwb2ludC1jb250cm9scy1ob2xkZXIgZGF0YXBvaW50LWNvbnRyb2wtYnV0dG9ucy1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhcG9pbnQtbGVmdC1jb250cm9scy1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0iZGF0YXBvaW50LWNvbnRyb2wtYnV0dG9uIiBpY29uPSJjaGV2cm9uLWxlZnQiIGRpc2FibGVkJD0iW1shaGFzU2VsZWN0ZWQoc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlKV1dIiBvbi10YXA9InNlbGVjdFByZXZEYXRhcG9pbnRfIiBhbHQ9InNlbGVjdCBwcmV2aW91cyBkYXRhcG9pbnQiIHRpdGxlPSJTZWxlY3QgcHJldmlvdXMgZGF0YXBvaW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0iZGF0YXBvaW50LWNvbnRyb2wtYnV0dG9uIiBpY29uPSJjaGV2cm9uLXJpZ2h0IiBkaXNhYmxlZCQ9IltbIWhhc1NlbGVjdGVkKHNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZSldXSIgb24tdGFwPSJzZWxlY3ROZXh0RGF0YXBvaW50XyIgYWx0PSJzZWxlY3QgbmV4dCBkYXRhcG9pbnQiIHRpdGxlPSJTZWxlY3QgbmV4dCBkYXRhcG9pbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iRWRpdCBhIGRhdGFwb2ludCB0byB1c2UgdGhpcyBmZWF0dXJlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0iZGF0YXBvaW50LWNvbnRyb2wtYnV0dG9uIiBpY29uPSJoaXN0b3J5IiBvbi10YXA9InJlc2V0RGF0YXBvaW50XyIgYWx0PSJ1bmRvIGNoYW5nZXMiIHRpdGxlPSJVbmRvIGNoYW5nZXMiIGRpc2FibGVkJD0iW1tzaG91bGREaXNhYmxlUmVzZXRfKHNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZS5jaGFuZ2VkKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iU2VsZWN0IGEgZGF0YXBvaW50IHRvIHVzZSB0aGlzIGZlYXR1cmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGNsYXNzPSJkYXRhcG9pbnQtY29udHJvbC1idXR0b24iIGljb249ImNvbnRlbnQtY29weSIgZGlzYWJsZWQkPSJbWyFoYXNTZWxlY3RlZChzZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2UpXV0iIG9uLXRhcD0iY29weURhdGFwb2ludF8iIGFsdD0iZHVwbGljYXRlIGRhdGFwb2ludCIgdGl0bGU9IkR1cGxpY2F0ZSBkYXRhcG9pbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJTZWxlY3QgYSBkYXRhcG9pbnQgdG8gdXNlIHRoaXMgZmVhdHVyZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gY2xhc3M9ImRhdGFwb2ludC1jb250cm9sLWJ1dHRvbiIgaWNvbj0iZGVsZXRlIiBkaXNhYmxlZCQ9IltbIWhhc1NlbGVjdGVkKHNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZSldXSIgb24tdGFwPSJkZWxldGVEYXRhcG9pbnREaWFsb2dfIiBhbHQ9ImRlbGV0ZSBkYXRhcG9pbnQiIHRpdGxlPSJEZWxldGUgZGF0YXBvaW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1kaXZpZGVyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgdmFsdWU9Int7ZmVhdHVyZVNlYXJjaFZhbHVlfX0iIGxhYmVsPSJTZWFyY2ggZmVhdHVyZXMiIGNsYXNzPSJkYXRhcG9pbnQtY29udHJvbC1maWx0ZXItaW5wdXQgZmVhdHVyZS1zZWFyY2gtaW5wdXQiIGRpc2FibGVkJD0iW1shaGFzU2VsZWN0ZWQoc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlKV1dIiBuby1sYWJlbC1mbG9hdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iaWNvbnM6c2VhcmNoIiBzbG90PSJwcmVmaXgiPjwvaXJvbi1pY29uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleCIgaGlkZGVuPSJbWyFoYXNBdHRyaWJ1dGlvbnNfKGF0dHJpYnV0aW9ucyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWRpdmlkZXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IkZlYXR1cmUgc29ydCBvcmRlciIgY2xhc3M9InNob3J0LWRyb3Bkb3duIiBuby1sYWJlbC1mbG9hdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7ZXhhbXBsZUZlYXR1cmVTb3J0T3JkZXJ9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9Im5hbWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5hbWU9ImFscGhhYmV0aWNhbCI+QWxwaGFiZXRpY2FsPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5hbWU9ImF0dHJpYnV0aW9uIj5BdHRyaWJ1dGlvbnM8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbmFtZT0icmV2ZXJzZS1hdHRyaWJ1dGlvbiI+UmV2ZXJzZSBhdHRyaWJ1dGlvbnM8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbmFtZT0iYWJzb2x1dGUtYXR0cmlidXRpb24iPkFic29sdXRlIGF0dHJpYnV0aW9uczwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBpZD0iYXR0cmlidXRpb25MZWdlbmQiPjwvc3ZnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9Ik1vZGVsOiIgbm8tbGFiZWwtZmxvYXQgY2xhc3M9InNob3J0LWRyb3Bkb3duIiBoaWRkZW4kPSJbWyFoYXNNdWx0aXBsZU1vZGVsQXR0cmlidXRpb25zXyhhdHRyaWJ1dGlvbnMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7YXR0cmlidXRpb25Nb2RlbEluZGV4fX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbcGFyc2VkTW9kZWxOYW1lc11dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPltbZ2V0TGFiZWxlZE1vZGVsTmFtZV8oaXRlbSldXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhcG9pbnQtcmlnaHQtY29udHJvbHMtaG9sZGVyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hhc1NlbGVjdGVkKHNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZSldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImV4YW1wbGUtYW5kLWluZmVyZW5jZS1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDx2ei1leGFtcGxlLXZpZXdlciBjbGFzcz0iZXhhbXBsZS1ob2xkZXIiIGpzb249Int7c2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlLmV4YW1wbGV9fSIgY29tcGFyZS1qc29uPSJ7e2NvdW50ZXJmYWN0dWFsRXhhbXBsZUFuZEluZmVyZW5jZS5leGFtcGxlfX0iIG9uLWV4YW1wbGUtY2hhbmdlPSJleGFtcGxlQ2hhbmdlXyIgaWQ9InZpZXdlciIgZGlzcGxheS1tb2RlPSJbW2V4YW1wbGVEaXNwbGF5TW9kZV1dIiBmZWF0dXJlLXNlYXJjaC12YWx1ZT0ie3tmZWF0dXJlU2VhcmNoVmFsdWV9fSIgY29tcGFyZS10aXRsZT0iW1tjb21wYXJlVGl0bGVdXSIgc2FsaWVuY3k9IltbYXR0cmlidXRpb25dXSIgc2hvdy1zYWxpZW5jeSByZWFkb25seT0iW1shYXJlRXhhbXBsZXNFZGl0YWJsZV8obW9kZWxOYW1lLCBpbmZlcmVuY2VBZGRyZXNzKV1dIiBzb3J0LW9yZGVyPSJbW2V4YW1wbGVGZWF0dXJlU29ydE9yZGVyXV0iIG1pbi1zYWw9IltbbWluQXR0cmlidXRpb25dXSIgbWF4LXNhbD0iW1ttYXhBdHRyaWJ1dGlvbl1dIiBjb2xvcnM9IltbYXR0cmlidXRpb25Db2xvclNjYWxlXV0iIGhpZ2hsaWdodC1kaWZmZXJlbmNlcz0iW1tzaG93TmVhcmVzdENvdW50ZXJmYWN0dWFsXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvdnotZXhhbXBsZS12aWV3ZXI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shaGFzU2VsZWN0ZWQoc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGF0YXBvaW50LWluZm8taG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhcG9pbnQtaW5mby1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXggc3BhY2UtYmV0d2VlbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9uYm9hcmRpbmctaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3QgYSBkYXRhcG9pbnQgdG8gYmVnaW4gZXhwbG9yaW5nIG1vZGVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3IgZm9yIHlvdXIgc2VsZWN0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ib25ib2FyZGluZy10ZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJvbGQiPkVkaXQgYW5kIEluZmVyOjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdCB5b3VyIGRhdGFwb2ludCBoZXJlIGFuZCBydW4gaW5mZXJlbmNlIGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZlciB0YWJsZSB0byBzZWUgZGlmZmVyZW5jZXMgaW4gbW9kZWwgYmVoYXZpb3IuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9uYm9hcmRpbmctdGV4dCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJib2xkIj5WaXN1YWxpemU6PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2ggYmV0d2VlbiB2aXN1YWxpemluZyBkYXRhcG9pbnRzIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsb3JpbmcgcGFydGlhbCBkZXBlbmRlbmNlIHBsb3RzIHRvIGdhaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWdodHMgaW50byB5b3VyIG1vZGVsJ3MgYmVoYXZpb3IuIEV4cGxvcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcmZhY3R1YWxzIG9yIHNlZSBob3cgc2ltaWxhciAob3IgZGlmZmVyZW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzdCBvZiB5b3VyIGRhdGFzZXQgaXMgZnJvbSB5b3VyIHNlbGVjdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmZlcmVuY2Utc2VjdGlvbi1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImluZmVyZW5jZS1zZWN0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImluZmVyZW5jZS1oZWFkZXIgaGVhZGluZyIgb24tdGFwPSJ0b2dnbGVJbmZlcmVuY2VSZXN1bHRzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0SW5mZXJUaXRsZShzZWxlY3RlZEV4YW1wbGVOdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlZEluZGljZXMpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyaWdodC1zaWRlIHJpZ2h0LXNpZGUtcGVyZm9ybWFuY2UtdGFiIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iW1tnZXRFeHBhbmRDb2xsYXBzZUljb24ob3BlbmVkSW5mZXJlbmNlUmVzdWx0cyldXSIgY2xhc3M9ImV4cGFuZC1jb2xsYXBzZS1idXR0b24iPjwvaXJvbi1pY29uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2UgY2xhc3M9Im5vLXBhZGRpbmctY2FyZCIgaWQ9ImNvbGxhcHNlaW5mZXJlbmNlIiBvcGVuZWQ9Int7b3BlbmVkSW5mZXJlbmNlUmVzdWx0c319Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iRWRpdCBhIGRhdGFwb2ludCB0byB1c2UgdGhpcyBmZWF0dXJlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIG9uLXRhcD0iaW5mZXJDbGlja2VkXyIgY2xhc3M9ImNvbnRyb2wtYnV0dG9uIGluZmVyLWJ1dHRvbiBmbGV4LWdyb3ciIGRpc2FibGVkJD0iW1tzaG91bGREaXNhYmxlSW5mZXJCdXR0b25fKGV4YW1wbGVzQW5kSW5mZXJlbmNlcywgbW9kZWxOYW1lLCBpbmZlcmVuY2VBZGRyZXNzLCB1cGRhdGVkRXhhbXBsZSldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW4gaW5mZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaGFzU2VsZWN0ZWQoc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Zi1pbmZlcmVuY2Utdmlld2VyIGNsYXNzPSJpbmZlcmVuY2Utdmlld2VyIiBpbmZlcmVuY2VzPSJbW3NlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZS5pbmZlcmVuY2VzXV0iIGlkJD0iW1tnZXRJbmZlcmVuY2VIb2xkZXJJZF8oKV1dIiBtb2RlbC10eXBlPSJbW21vZGVsVHlwZV1dIiBtb2RlbC1uYW1lcz0iW1twYXJzZWRNb2RlbE5hbWVzXV0iIG1heC1lbnRyaWVzLXBlci1ydW49IltbbWF4SW5mZXJlbmNlRW50cmllc1BlclJ1bl1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGYtaW5mZXJlbmNlLXZpZXdlcj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tjb3VudGVyZmFjdHVhbEV4YW1wbGVBbmRJbmZlcmVuY2VdXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGYtaW5mZXJlbmNlLXZpZXdlciBjbGFzcz0iaW5mZXJlbmNlLXZpZXdlciBjb21wYXJlLWluZmVyZW5jZS12aWV3ZXIiIGluZmVyZW5jZXM9IltbY291bnRlcmZhY3R1YWxFeGFtcGxlQW5kSW5mZXJlbmNlLmluZmVyZW5jZXNdXSIgbW9kZWwtdHlwZT0iW1ttb2RlbFR5cGVdXSIgbW9kZWwtbmFtZXM9IltbcGFyc2VkTW9kZWxOYW1lc11dIiBtYXgtZW50cmllcy1wZXItcnVuPSJbW21heEluZmVyZW5jZUVudHJpZXNQZXJSdW5dXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RmLWluZmVyZW5jZS12aWV3ZXI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXNpemVyIiBpZD0icmVzaXplciI+CiAgICAgICAgICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iYXY6cGF1c2UiIGNsYXNzPSJyZXNpemUtaWNvbiI+PC9pcm9uLWljb24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciIgaWQ9ImNlbnRlciI+CiAgICAgICAgICAgICAgICA8ZmFjZXRzLWRpdmUgaWQ9ImRpdmUiIGRhdGE9IltbdmlzZGF0YV1dIiBzZWxlY3RlZC1pbmRpY2VzPSJbW3NlbGVjdGVkXV0iIGNvbXBhcmVkLWluZGljZXM9IltbY29tcGFyZWRJbmRpY2VzXV0iIG9uLXNlbGVjdGVkLWluZGljZXMtY2hhbmdlZD0ic2VsZWN0ZWRJbmRpY2VzQ2hhbmdlZF8iIG9uLXN0YXRzLWNoYW5nZWQ9InN0YXRzQ2hhbmdlZF8iIGhpZGUtaW5mby1jYXJkPSJ0cnVlIiBzcHJpdGUtaW1hZ2Utd2lkdGg9IjMyIiBzcHJpdGUtaW1hZ2UtaGVpZ2h0PSIzMiIgZml0LWdyaWQtYXNwZWN0LXJhdGlvLXRvLXZpZXdwb3J0PSJ0cnVlIiBzdGFibGUtY29sb3JzPSJ0cnVlIj4KICAgICAgICAgICAgICAgIDwvZmFjZXRzLWRpdmU+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJub2V4YW1wbGVzIiBjbGFzcz0ibm9leGFtcGxlcyBpbmZvLXRleHQiPgogICAgICAgICAgICAgICAgICBEYXRhcG9pbnRzIGFuZCB0aGVpciBpbmZlcmVuY2UgcmVzdWx0cyB3aWxsIGJlIGRpc3BsYXllZCBoZXJlLgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgaW5kZXRlcm1pbmF0ZSBpZD0icHJvZ3Jlc3MiIGhpZGRlbj0iW1tsb2FkaW5nQmFySGlkZGVuX11dIj4KICAgICAgICAgICAgICAgIDwvcGFwZXItcHJvZ3Jlc3M+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLWNvbnRhaW5lci1ob2xkZXIiIGlkPSJwYXJ0aWFscGxvdGhvbGRlciI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBkLXBsb3RzLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleCI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZC1pbmZvLXRleHQiPlBhcnRpYWwgRGVwZW5kZW5jZSBQbG90czwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImluZm8tb3V0bGluZSIgY2xhc3M9ImluZm8taWNvbiBwZC1pbmZvLWljb24gbm8tcGFkZGluZyIgb24tdGFwPSJvcGVuRGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImF1dG8iPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPlBhcnRpYWwgRGVwZW5kZW5jZSBQbG90czwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpYWwgZGVwZW5kZW5jZSBwbG90cyB2aXN1YWxpemUgdGhlIGNoYW5nZSBpbgogICAgICAgICAgICAgICAgICAgICAgICAgIGluZmVyZW5jZSByZXN1bHRzIGZvciBldmVyeSBmZWF0dXJlLCBhcyB0aGUgdmFsdWUgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBmZWF0dXJlIGlzIGNoYW5nZWQgdG8gZGlmZmVyZW50IHZhbGlkIHZhbHVlcy4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIG51bWVyaWMgZmVhdHVyZXMsIHlvdSBjYW4gc2V0IHRoZSBtaW5pbXVtIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW0gdmFsdWVzIHRvIHBsb3QuCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBzdHJpbmcgZmVhdHVyZXMsIHRoZSBtb3N0IHBvcHVsYXIgZmVhdHVyZSB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgc2hvd24gYXMgYWx0ZXJuYXRpdmVzIHRvIHRoZSBmZWF0dXJlIHZhbHVlIGZvciB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCBkYXRhcG9pbnQuCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBmZWF0dXJlcyB3aXRoIG11bHRpcGxlIGZlYXR1cmUgdmFsdWVzIHBlcgogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFwb2ludCwgYSBzaW5nbGUgcGxvdCBpcyBzaG93biBmb3IgZm9yIGVhY2ggZmVhdHVyZQogICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGluIHRoZSBzZWxlY3RlZCBkYXRhcG9pbnQuIFlvdSBjYW4gb3ZlcnJpZGUKICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBmZWF0dXJlIHZhbHVlcyBoYXZlIHBsb3RzIGNyZWF0ZWQgZm9yIHRoZW0gYnkKICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5aW5nIHRoZSBpbmRpY2VzIHRvIHNob3duIHBhcnRpYWwgZGVwZW5kZW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzIGZvciwgaWYgdGhlIGRhdGFwb2ludCBjb250YWlucyBtdWx0aXBsZSBmZWF0dXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIGZvciBhIGZlYXR1cmUuCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIFdoZW4gdGhlIGdsb2JhbCB0b2dnbGUgaXMgdHVybmVkIG9uLCB0aGUgcGxvdHMgc2hvdwogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhdmVyYWdlIGVmZmVjdCBvZiByZXBlYXRlZGx5IGNoYW5naW5nIGEgc2luZ2xlCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZSBhY3Jvc3MgYWxsIGRhdGFwb2ludHMuIFdoZW4gaXQgaXMgdHVybmVkIG9mZiwKICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGxvdHMgc2hvdyB0aGUgZWZmZWN0IG9mIGEgcmVwZWF0ZWRseSBjaGFuZ2luZyBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlIGZlYXR1cmUgb24gdGhlIHNlbGVjdGVkIGRhdGFwb2ludC4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b24tYW5kLXByb2dyZXNzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJjb250cm9sLWJ1dHRvbiBkYXRhcG9pbnQtYnV0dG9uIiBkaXNhYmxlZCQ9Iltbc2hvdWxkRGlzYWJsZVNvcnRGZWF0dXJlc0J1dHRvbihwYXJ0aWFsRGVwUGxvdEVsaWdpYmxlRmVhdHVyZXMsIGlzU29ydGluZ0VsaWdpYmxlRmVhdHVyZXMpXV0iIG9uLXRhcD0ic29ydFBkRmVhdHVyZXNfIiBhbHQ9IlNvcnQgZmVhdHVyZXMgYnkgaW50ZXJlc3RpbmduZXNzIiB0aXRsZT0iU29ydCBmZWF0dXJlcyBieSBpbnRlcmVzdGluZ25lc3MiPgogICAgICAgICAgICAgICAgICAgICAgICBTb3J0IGZlYXR1cmVzIGJ5IGludGVyZXN0aW5nbmVzcwogICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgY2xhc3M9InNvcnQtcHJvZ3Jlc3MiIGhpZGRlbj0iW1shaXNTb3J0aW5nRWxpZ2libGVGZWF0dXJlc11dIiBpbmRldGVybWluYXRlPjwvcGFwZXItcHJvZ3Jlc3M+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2xhc3M9InBkLXRvZ2dsZSIgY2hlY2tlZD0ie3tnbG9iYWxQZFBsb3RzfX0iIG9uLWNoYW5nZT0iaGlkZUFsbFBkRWxlbWVudHNfIiBkaXNhYmxlZCQ9IltbIWhhc1NlbGVjdGVkKHNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZSldXSI+CiAgICAgICAgICAgICAgICAgICAgICBHbG9iYWwgcGFydGlhbCBkZXBlbmRlbmNlIHBsb3RzCiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci10b2dnbGUtYnV0dG9uPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFhcmVUaGVyZVBkUGxvdEZlYXR1cmVzXyhwYXJ0aWFsRGVwUGxvdEVsaWdpYmxlRmVhdHVyZXMpXV0iPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBkLW5vLWZlYXR1cmVzLXRleHQiPgogICAgICAgICAgICAgICAgICAgICAgVGhlIGxvYWRlZCBkYXRhc2V0IGhhcyBubyBmZWF0dXJlcyB0byBzaG93IHBhcnRpYWwKICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2UgcGxvdHMgZm9yLgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZHBsb3RzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1twYXJ0aWFsRGVwUGxvdEVsaWdpYmxlRmVhdHVyZXNdXSI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLWNvbnRhaW5lciIgZGF0YS1mZWF0dXJlLW5hbWUkPSJbW2l0ZW0ubmFtZV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcyQ9IltbZ2V0UGVyZlRhYmxlRW50cnlDbGFzcyhpdGVtKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWFycm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0icGQtcm93LWFycm93IHJvdGF0ZWQtaWNvbiIgaWNvbj0iYXJyb3ctZHJvcC1kb3duIiBvbi10YXA9ImNhdGVnb3J5UGFuZUNsaWNrZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS12YWwgcGVyZi10YWJsZS1jbGlja2FibGUgdGYtY2F0ZWdvcnktcGFuZSBwZXJmLXRhYmxlLXRleHQtZW50cnkiIG9uLXRhcD0iY2F0ZWdvcnlQYW5lQ2xpY2tlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2l0ZW0ubmFtZV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZC1lbnRyeS1jb250YWluZXIgcGVyZi10YWJsZS1lbnRyeS1leHBhbmRlZCIgaGlkZGVuPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBkLWlucHV0LWNvbnRhaW5lciIgaGlkZGVuJD0iW1tzaG91bGRIaWRlUGRJbnB1dENvbnRhaW5lcihpdGVtLCBzZWxlY3RlZCldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyYW5nZS1pbnB1dC1jb250YWluZXIiIGhpZGRlbiQ9IltbaXRlbS5zYW1wbGVzXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmZvLXRleHQiIHRpdGxlPSJUaGUgcmFuZ2Ugb2YgdmFsdWVzIHRvIHRlc3QgKGRlZmF1bHQgdmFsdWVzIGFyZSBhdXRvbWF0aWNhbGx5IGluZmVycmVkKS4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCByYW5nZSBvZiB2YWx1ZXMgdG8gdGVzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9InN0eWxlLWlucHV0IHgtbWluIHBkLXJhbmdlLWNvbnRyb2wiIHZhbHVlPSJbW2l0ZW0ub2JzZXJ2ZWRNaW5dXSIgdGl0bGU9IlRoZSBtaW5pbXVtIHZhbHVlIHRvIHRlc3QgKGRlZmF1bHQgdmFsdWUgaXMgYXV0b21hdGljYWxseSBpbmZlcnJlZCkuIiBvbi1pbnB1dD0icGRJbnB1dENoYW5nZWQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBkLXJhbmdlLWh5cGhlbiI+LTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGNsYXNzPSJzdHlsZS1pbnB1dCB4LW1heCBwZC1yYW5nZS1jb250cm9sIiB2YWx1ZT0iW1tpdGVtLm9ic2VydmVkTWF4XV0iIHRpdGxlPSJUaGUgbWF4aW11bSB2YWx1ZSB0byB0ZXN0IChkZWZhdWx0IHZhbHVlIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQpLiIgb24taW5wdXQ9InBkSW5wdXRDaGFuZ2VkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZlYXR1cmUtaW5kZXgtY29udGFpbmVyIiBoaWRkZW4kPSJbW3Nob3VsZEhpZGVGZWF0dXJlSW5kaWNlc1NlbGVjdG9yKGl0ZW0ubmFtZSwgc2VsZWN0ZWQpXV0iIHRpdGxlPSJBbiBvcHRpb25hbCBwcmludGVyLXBhZ2Utc3R5bGUgcGF0dGVybiBsaWtlICcwLDIsNC02JyB0byBzZWxlY3QgdGhlIGluZGljZXMgb2YgdGhlIGZlYXR1cmUgdmFsdWVzIHRvIGdlbmVyYXRlIHBsb3RzIGZvci4gVXNlZnVsIGZvciBmZWF0dXJlcyB3aXRoIG1hbnkgcmVwZWF0ZWQgZmllbGRzLiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImluZm8tdGV4dCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IGZlYXR1cmUgaW5kaWNlcyA8aT4ob3B0aW9uYWwpPC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJzdHlsZS1pbnB1dCBmZWF0dXJlLWluZGV4LXBhdHRlcm4gcGQtcmFuZ2UtY29udHJvbCIgb24taW5wdXQ9InBkSW5wdXRDaGFuZ2VkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRmLWNhdGVnb3J5LXBhbmUtY29udGVudCI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbmZpZy10YWIiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbmZpZy1zaWRlLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1hbmQtY2FyZCI+CiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImluZmVyZW5jZS1oZWFkZXIgaGVhZGluZyIgb24tdGFwPSJ0b2dnbGVUcnVlTGFiZWxTZXR1cCI+CiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJlCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icmlnaHQtc2lkZSByaWdodC1zaWRlLXBlcmZvcm1hbmNlLXRhYiI+CiAgICAgICAgICAgICAgICAgICAgICA8aXJvbi1pY29uIGljb249IltbZ2V0RXhwYW5kQ29sbGFwc2VJY29uKG9wZW5lZFRydWVMYWJlbCldXSIgY2xhc3M9ImV4cGFuZC1jb2xsYXBzZS1idXR0b24iPjwvaXJvbi1pY29uPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2UgY2xhc3M9ImNhcmQiIGlkPSJjb2xsYXBzZXRydWVsYWJlbCIgb3BlbmVkPSJ7e29wZW5lZFRydWVMYWJlbH19Ij4KICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvdWxkU2hvd0xhYmVsRHJvcGRvd25fKHN0YXRzKV1dIj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgiPgogICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iR3JvdW5kIFRydXRoIEZlYXR1cmUiIGNsYXNzPSJ0aHJlc2hvbGQtZHJvcGRvd24iPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e3NlbGVjdGVkTGFiZWxGZWF0dXJlfX0iIGF0dHItZm9yLXNlbGVjdGVkPSJuYW1lIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbZ2V0RmVhdHVyZUxpc3RfKHN0YXRzKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbmFtZT0iW1tpdGVtXV0iPltbZ2V0RmVhdHVyZU5hbWVfKGl0ZW0pXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlbHAtdGl0bGUgaGVscC10aXRsZS1tYXJnaW4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hhdCBpcyBncm91bmQgdHJ1dGg/CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVscC10ZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBmZWF0dXJlIHRoYXQgeW91ciBtb2RlbCBpcyB0cnlpbmcgdG8gcHJlZGljdC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRpYWxvZy1saW5rIiBvbi10YXA9Im9wZW5EaWFsb2ciPk1vcmUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJhdXRvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdW5kIFRydXRoIEZlYXR1cmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGRhdGFwb2ludHMgY29udGFpbiBhIGZlYXR1cmUgdGhhdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50cyB0aGUgZ3JvdW5kIHRydXRoIGZvciB3aGF0IHRoZSBtb2RlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYXR0ZW1wdGluZyB0byBwcmVkaWN0LCB0aGVuIHNlbGVjdGluZyB0aGF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlIGhlcmUgYWxsb3dzIHRoZSB0b29sIHRvIGludmVzdGlnYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIG1vZGVsIGJ5IGNvbXBhcmluZyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsJ3MgcmVzdWx0cyB0byB0aGUgZ3JvdW5kIHRydXRoIGZlYXR1cmUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvdWxkU2hvd0Nvc3RSYXRpb18oc2VsZWN0ZWRMYWJlbEZlYXR1cmUsIG1vZGVsVHlwZSwgbXVsdGlDbGFzcyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCB2YWx1ZT0ie3tpbmNvcnJlY3RQcmVkQ29zdFJhdGlvfX0iIGxhYmVsPSJDb3N0IFJhdGlvIChGUC9GTikiIHR5cGU9Im51bWJlciIgY2xhc3M9InRocmVzaG9sZC1jb3N0LWlucHV0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWxwLXRpdGxlIGhlbHAtdGl0bGUtbWFyZ2luIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hhdCBpcyBjb3N0IHJhdGlvPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWxwLXRleHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBjb3N0IG9mIGZhbHNlIHBvc2l0aXZlcyByZWxhdGl2ZSB0byBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlcy4gUmVxdWlyZWQgZm9yIG9wdGltaXphdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGlhbG9nLWxpbmsiIG9uLXRhcD0ib3BlbkRpYWxvZyI+TW9yZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJhdXRvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoYXQgaXMgY29zdCByYXRpbz8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB0ZWxscyB0aGUgdG9vbCBob3cgdG8gb3B0aW1pemUgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uIHRocmVzaG9sZHMgd2hlbiB5b3UgdXNlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb24gc3RyYXRlZ3kgY29udHJvbHMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDAgPSBmYWxzZSBwb3NpdGl2ZXMgYXJlIGVxdWFsbHkgYXMgY29zdGx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGZhbHNlIG5lZ2F0aXZlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC4wMCA9IGZhbHNlIHBvc2l0aXZlcyBhcmUgNCB0aW1lcyBtb3JlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3RseSB0aGFuIGZhbHNlIG5lZ2F0aXZlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1ID0gZmFsc2UgbmVnYXRpdmVzIGFyZSA0IHRpbWVzIG1vcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdGx5IHRoYW4gZmFsc2UgcG9zaXRpdmVzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG91bGRTaG93RmVhdHVyZURyb3Bkb3duXyhzdGF0cyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGxhYmVsPSJTbGljZSBieSIgY2xhc3M9InRocmVzaG9sZC1kcm9wZG93biI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tzZWxlY3RlZEJyZWFrZG93bkZlYXR1cmV9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9Im5hbWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2dldEZlYXR1cmVMaXN0XyhzdGF0cyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbmFtZT0iW1tpdGVtXV0iPltbZ2V0RmVhdHVyZU5hbWVfKGl0ZW0pXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpc051bWVyaWNGZWF0dXJlXyhzZWxlY3RlZEJyZWFrZG93bkZlYXR1cmUpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IG1pbj0iMiIgdmFsdWU9Int7bnVtUHJpbWFyeUJ1Y2tldHN9fSIgbGFiZWw9IkJ1Y2tldHMiIHR5cGU9Im51bWJlciIgY2xhc3M9Im51bS1idWNrZXRzLWlucHV0Ij48L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlbHAtdGl0bGUgaGVscC10aXRsZS1tYXJnaW4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGF0IGRvZXMgc2xpY2luZyBkbz8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVscC10ZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93cyBwZXJmb3JtYW5jZSBmb3IgZWFjaCB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3VsZFNob3dTZWNvbmRGZWF0dXJlRHJvcGRvd25fKHNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iU2xpY2UgYnkgKHNlY29uZGFyeSkiIGNsYXNzPSJ0aHJlc2hvbGQtZHJvcGRvd24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tzZWxlY3RlZFNlY29uZEJyZWFrZG93bkZlYXR1cmV9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9Im5hbWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbZ2V0RmVhdHVyZUxpc3RfKHN0YXRzKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5hbWU9IltbaXRlbV1dIj5bW2dldEZlYXR1cmVOYW1lXyhpdGVtKV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpc051bWVyaWNGZWF0dXJlXyhzZWxlY3RlZFNlY29uZEJyZWFrZG93bkZlYXR1cmUpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbWluPSIyIiB2YWx1ZT0ie3tudW1TZWNvbmRhcnlCdWNrZXRzfX0iIGxhYmVsPSJCdWNrZXRzIiB0eXBlPSJudW1iZXIiIGNsYXNzPSJudW0tYnVja2V0cy1pbnB1dCI+PC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2lzQmluYXJ5Q2xhc3NpZmljYXRpb25fKG1vZGVsVHlwZSwgbXVsdGlDbGFzcyldXSI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctYW5kLWNhcmQiPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImluZmVyZW5jZS1oZWFkZXIgaGVhZGluZyIgb24tdGFwPSJ0b2dnbGVFeHBsb3JlclNldHVwIj4KICAgICAgICAgICAgICAgICAgICAgIEZhaXJuZXNzCiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyaWdodC1zaWRlIHJpZ2h0LXNpZGUtcGVyZm9ybWFuY2UtdGFiIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlyb24taWNvbiBpY29uPSJbW2dldEV4cGFuZENvbGxhcHNlSWNvbihvcGVuZWRFeHBsb3JlcildXSIgY2xhc3M9ImV4cGFuZC1jb2xsYXBzZS1idXR0b24iPjwvaXJvbi1pY29uPgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2UgY2xhc3M9ImNhcmQiIGlkPSJjb2xsYXBzZWV4cGxvcmVyIiBvcGVuZWQ9Int7b3BlbmVkRXhwbG9yZXJ9fSI+CiAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvdWxkU2hvd0ZlYXR1cmVEcm9wZG93bl8oc3RhdHMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWluZm8taGVhZGVyIGhlbHAtdGl0bGUtbWFyZ2luLWJ1dHRvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwbHkgYW4gb3B0aW1pemF0aW9uIHN0cmF0ZWd5CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWluZm8tdGV4dCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0IGEgc3RyYXRlZ3kgdG8gc2V0IGNsYXNzaWZpY2F0aW9uIHRocmVzaG9sZHMKICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiB0aGUgc2V0IGNvc3QgcmF0aW8gYW5kIGRhdGEgc2xpY2VzLiBNYW51YWxseQogICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVyaW5nIHRocmVzaG9sZHMgb3IgY2hhbmdpbmcgY29zdCByYXRpbyB3aWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBiYWNrIHRvIGN1c3RvbSB0aHJlc2hvbGRzLgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGNsYXNzPSJvcHRpbWl6YXRpb24tcmFkaW8tZ3JvdXAiIHNlbGVjdGVkPSJ7e29wdGltaXphdGlvblNlbGVjdGVkfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iY3VzdG9tIiBjbGFzcz0ib3B0aW1pemF0aW9uLXJhZGlvIiBpZD0iY3VzdG9tdGhyZXNoIj5DdXN0b20gdGhyZXNob2xkcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImluZm8tb3V0bGluZSIgY2xhc3M9ImluZm8taWNvbiB0aHJlc2gtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPkN1c3RvbSB0aHJlc2hvbGRzPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHlvdXIgb3duIHRocmVzaG9sZHMgdXNpbmcgdGhlIHRocmVzaG9sZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWRlcnMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJ1bmF3YXJlIiBjbGFzcz0ib3B0aW1pemF0aW9uLXJhZGlvIj5TaW5nbGUgdGhyZXNob2xkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaW5mby1vdXRsaW5lIiBjbGFzcz0iaW5mby1pY29uIHRocmVzaC1pbmZvLWljb24gbm8tcGFkZGluZyIgb24tdGFwPSJvcGVuRGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImJvdHRvbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+U2luZ2xlIHRocmVzaG9sZDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGltaXplIGEgc2luZ2xlIHRocmVzaG9sZCBmb3IgYWxsIGRhdGFwb2ludHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGNvc3QgcmF0aW8uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJkZW1vcGFyaXR5IiBjbGFzcz0ib3B0aW1pemF0aW9uLXJhZGlvIiBkaXNhYmxlZCQ9IltbIXNob3VsZFNob3dGZWF0dXJlUGVyZkNoYXJ0c18oc2VsZWN0ZWRMYWJlbEZlYXR1cmUsIHNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSwgaW5mZXJlbmNlcyldXSI+RGVtb2dyYXBoaWMgcGFyaXR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaW5mby1vdXRsaW5lIiBjbGFzcz0iaW5mby1pY29uIHRocmVzaC1pbmZvLWljb24gbm8tcGFkZGluZyIgb24tdGFwPSJvcGVuRGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImJvdHRvbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+RGVtb2dyYXBoaWMgcGFyaXR5PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW1pemUgYSB0aHJlc2hvbGQgcGVyIHNsaWNlIGJhc2VkIG9uIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBjb3N0IHJhdGlvLCBlbnN1cmluZyB0aGUgZGlmZmVyZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VzIGFjaGlldmUgZGVtb2dyYXBoaWMgcGFydHkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbW9ncmFwaGljIHBhcml0eSBtZWFucyB0aGF0IHNpbWlsYXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlcyBvZiBkYXRhcG9pbnRzIGZyb20gZWFjaCBzbGljZSBhcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0ZWQgYXMgcG9zaXRpdmUgY2xhc3NpZmljYXRpb25zLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iZXF1YWxvcHAiIGNsYXNzPSJvcHRpbWl6YXRpb24tcmFkaW8iIGRpc2FibGVkJD0iW1shc2hvdWxkU2hvd0ZlYXR1cmVQZXJmQ2hhcnRzXyhzZWxlY3RlZExhYmVsRmVhdHVyZSwgc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlLCBpbmZlcmVuY2VzKV1dIj5FcXVhbCBvcHBvcnR1bml0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImluZm8tb3V0bGluZSIgY2xhc3M9ImluZm8taWNvbiB0aHJlc2gtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPkVxdWFsIG9wcG9ydHVuaXR5PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW1pemUgYSB0aHJlc2hvbGQgcGVyIHNsaWNlIGJhc2VkIG9uIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBjb3N0IHJhdGlvLCBlbnN1cmluZyB0aGUgZGlmZmVyZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VzIGFjaGlldmUgZXF1YWwgb3Bwb3J0dW5pdHkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVxdWFsIG9wcG9ydHVuaXR5IG1lYW5zIHRoYXQgYW1vbmcgdGhvc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhcG9pbnRzIHdpdGggdGhlIHBvc2l0aXZlIGdyb3VuZCB0cnV0aCBsYWJlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBhIHNpbWlsYXIgcGVyY2VudGFnZSBvZiBwb3NpdGl2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3Rpb25zIGluIGVhY2ggc2xpY2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJlcXVhbGFjYyIgY2xhc3M9Im9wdGltaXphdGlvbi1yYWRpbyIgZGlzYWJsZWQkPSJbWyFzaG91bGRTaG93RmVhdHVyZVBlcmZDaGFydHNfKHNlbGVjdGVkTGFiZWxGZWF0dXJlLCBzZWxlY3RlZEJyZWFrZG93bkZlYXR1cmUsIGluZmVyZW5jZXMpXV0iPkVxdWFsIGFjY3VyYWN5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaW5mby1vdXRsaW5lIiBjbGFzcz0iaW5mby1pY29uIHRocmVzaC1pbmZvLWljb24gbm8tcGFkZGluZyIgb24tdGFwPSJvcGVuRGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImJvdHRvbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+RXF1YWwgYWNjdXJhY3k8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpbWl6ZSBhIHRocmVzaG9sZCBwZXIgc2xpY2UgYmFzZWQgb24gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGNvc3QgcmF0aW8sIGVuc3VyaW5nIHRoZSBkaWZmZXJlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZXMgYWNoaWV2ZSBlcXVhbCBhY2N1cmFjeS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXF1YWwgYWNjdXJhY3kgbWVhbnMgdGhhdCB0aGVyZSBpcyBhIHNpbWlsYXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlIG9mIGNvcnJlY3QgcHJlZGljdGlvbnMgaW4gZWFjaCBzbGljZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9Imdyb3VwIiBjbGFzcz0ib3B0aW1pemF0aW9uLXJhZGlvIiBkaXNhYmxlZCQ9IltbIXNob3VsZFNob3dGZWF0dXJlUGVyZkNoYXJ0c18oc2VsZWN0ZWRMYWJlbEZlYXR1cmUsIHNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSwgaW5mZXJlbmNlcyldXSI+R3JvdXAgdGhyZXNob2xkcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImluZm8tb3V0bGluZSIgY2xhc3M9ImluZm8taWNvbiB0aHJlc2gtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPkdyb3VwIHRocmVzaG9sZHM8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpbWl6ZSBhIHNlcGFyYXRlIHRocmVzaG9sZCBmb3IgZWFjaCBzbGljZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgY29zdCByYXRpby4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29uZmlnLW1haW4tY29udGVudCI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaXNCaW5hcnlDbGFzc2lmaWNhdGlvbl8obW9kZWxUeXBlLCBtdWx0aUNsYXNzKV1dIiByZXN0YW1wPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXRpdGxlLXJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleCI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRQZXJmVGFibGVUaXRsZShzZWxlY3RlZEJyZWFrZG93bkZlYXR1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU2Vjb25kQnJlYWtkb3duRmVhdHVyZSwgb3B0aW1pemF0aW9uU2VsZWN0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVWYWx1ZVRocmVzaG9sZHMpXV0KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImluZm8tb3V0bGluZSIgY2xhc3M9ImluZm8taWNvbiBwZXJmb3JtYW5jZS1pbmZvLWljb24gbm8tcGFkZGluZyIgb24tdGFwPSJvcGVuRGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImF1dG8iPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzaWZpY2F0aW9uIFBlcmZvcm1hbmNlIFRhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0aGUgZ3JvdW5kIHRydXRoIGZlYXR1cmUgdG8gZXhwbG9yZSBtb2RlbAogICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlIGluY2x1ZGluZyBST0MgY3VydmVzIGFuZCBjb25mdXNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaWNlcy4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgU2xpY2UgdGhlIGRhdGFzZXQgYnkgZmVhdHVyZXMgYW5kIGV4cGxvcmUgbW9kZWwKICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZSBieSBzbGljZS4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIHRoZSBmYWlybmVzcyBvcHRpbWl6YXRpb24gc3RyYXRlZ2llcyBhbmQgc2VlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgIGltcGFjdCBvbiB0aGUgdGhyZXNob2xkcyBhbmQgcGVyZm9ybWFuY2Ugb2YgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaXZpZHVhbCBzbGljZXMuCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi1zb3J0LWJveCI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0idW5mb2xkLW1vcmUiIGNsYXNzPSJwZXJmLWJ1dHRvbiIgb24tdGFwPSJleHBhbmRBbGxQZXJmb3JtYW5jZSIgYWx0PSJleHBhbmQgYWxsIHNsaWNlcyIgdGl0bGU9IkV4cGFuZCBhbGwgc2xpY2VzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InVuZm9sZC1sZXNzIiBjbGFzcz0icGVyZi1idXR0b24iIG9uLXRhcD0iY29sbGFwc2VBbGxQZXJmb3JtYW5jZSIgYWx0PSJjb2xsYXBzZSBhbGwgc2xpY2VzIiB0aXRsZT0iQ29sbGFwc2UgYWxsIHNsaWNlcyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGxhYmVsPSJTb3J0IGJ5IiBjbGFzcz0idGhyZXNob2xkLWRyb3Bkb3duIHBlcmYtdGFibGUtc29ydC1tZW51Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7c2VsZWN0ZWRGZWF0dXJlU29ydH19IiBhdHRyLWZvci1zZWxlY3RlZD0ibmFtZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tnZXRGZWF0dXJlU29ydEJ5KG1vZGVsVHlwZSwgbXVsdGlDbGFzcyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBuYW1lPSJbW2l0ZW1dXSI+W1tpdGVtXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtYXJyb3ciPgogICAgICAgICAgICAgICAgICAgICAgPGlyb24taWNvbiBjbGFzcz0iZXhwYW5kLWNvbGxhcHNlLWJ1dHRvbiI+PC9pcm9uLWljb24+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS12YWwiPkZlYXR1cmUgVmFsdWU8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWNvdW50Ij5Db3VudDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3MkPSJbW2dldFBlcmZUYWJsZU1vZGVsQ2xhc3MobnVtTW9kZWxzKV1dIj4KICAgICAgICAgICAgICAgICAgICAgIE1vZGVsCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS10aHJlc2hvbGQgZmxleCI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlRocmVzaG9sZDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGhyZXNob2xkLWluZm8taG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImluZm8tb3V0bGluZSIgY2xhc3M9ImluZm8taWNvbiB0aHJlc2hvbGQtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kaWFsb2cgY2xhc3M9ImRpYWxvZy10ZXh0IiBob3Jpem9udGFsLWFsaWduPSJhdXRvIiB2ZXJ0aWNhbC1hbGlnbj0iYXV0byI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvcmluZyBDbGFzc2lmaWNhdGlvbiBQZXJmb3JtYW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgdGhpcyBzbGlkZXIgdG8gYWRqdXN0IHRoZSBjbGFzc2lmaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGlzIHNsaWNlLiBJbmZlcmVuY2UgdmFsdWVzIGF0IG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm92ZSB0aGlzIHRocmVzaG9sZCBhcmUgY29uc2lkZXJlZCBhIHBvc2l0aXZlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbiwgd2hpbGUgaW5mZXJlbmNlIHZhbHVlcyBiZWxvdyB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQgYXJlIGNvbnNpZGVyZWQgYSBuZWdhdGl2ZSBjbGFzc2lmaWNhdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWZwIj5GYWxzZSBQb3NpdGl2ZXMgKCUpPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1mbiI+RmFsc2UgTmVnYXRpdmVzICglKTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtYWNjIj5BY2N1cmFjeSAoJSk8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWYxIj5GMTwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1lbnRyaWVzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tmZWF0dXJlVmFsdWVUaHJlc2hvbGRzXV0iIGFzPSJmZWF0dXJlVmFsdWVUaHJlc2hvbGQiPgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3MkPSJbW2dldFBlcmZUYWJsZVJvd0NsYXNzKGZlYXR1cmVWYWx1ZVRocmVzaG9sZC5vcGVuZWQpXV0iIGRhdGEtaW5kZXgkPSJbW2luZGV4XV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtYXJyb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGNsYXNzJD0iW1tnZXRFeHBhbmRDb2xsYXBzZVBlcmZJY29uQ2xhc3MoZmVhdHVyZVZhbHVlVGhyZXNob2xkLm9wZW5lZCldXSIgaWNvbj0iYXJyb3ctZHJvcC1kb3duIiBvbi10YXA9InRvZ2dsZVBlcmZSb3ciPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS12YWwgcGVyZi10YWJsZS1jbGlja2FibGUgcGVyZi10YWJsZS10ZXh0LWVudHJ5IiBvbi10YXA9InRvZ2dsZVBlcmZSb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRQcmludGFibGVWYWx1ZV8oZmVhdHVyZVZhbHVlVGhyZXNob2xkKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1jb3VudCBwZXJmLXRhYmxlLWNsaWNrYWJsZSBwZXJmLXRhYmxlLW51bS1lbnRyeSIgb24tdGFwPSJ0b2dnbGVQZXJmUm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0RmVhdHVyZVZhbHVlQ291bnQoaW5mZXJlbmNlU3RhdHNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVZhbHVlVGhyZXNob2xkLnRocmVzaG9sZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVWYWx1ZVRocmVzaG9sZCldXQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3MkPSJbW2dldFBlcmZUYWJsZU1vZGVsQ2xhc3MobnVtTW9kZWxzKV1dIiBvbi10YXA9InRvZ2dsZVBlcmZSb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tmZWF0dXJlVmFsdWVUaHJlc2hvbGQudGhyZXNob2xkfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXRleHQtZW50cnkgcGVyZi10YWJsZS1jbGlja2FibGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0TW9kZWxOYW1lXyhpbmRleCldXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS10aHJlc2hvbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tmZWF0dXJlVmFsdWVUaHJlc2hvbGQudGhyZXNob2xkfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItc2xpZGVyIGNsYXNzJD0iW1tnZXRTbGlkZXJDbGFzcyhpbmRleCldXSIgZWRpdGFibGU9InRydWUiIG1pbj0iMCIgbWF4PSIxIiBzdGVwPSIwLjAxIiBpbW1lZGlhdGUtdmFsdWU9Int7aXRlbS50aHJlc2hvbGR9fSIgdmFsdWU9IltbaXRlbS50aHJlc2hvbGRdXSIgb24tdmFsdWUtY2hhbmdlZD0icmVmcmVzaEluZmVyZW5jZXNOb1JlZ2VuXyIgb24taW1tZWRpYXRlLXZhbHVlLWNoYW5nZWQ9InJlZnJlc2hJbmZlcmVuY2VzTm9SZWdlbl8iIG9uLWRvd249InJlc2V0T3B0aW1pemF0aW9uU2VsZWN0ZWRfIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1zbGlkZXI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZnAgcGVyZi10YWJsZS1jbGlja2FibGUiIG9uLXRhcD0idG9nZ2xlUGVyZlJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e2ZlYXR1cmVWYWx1ZVRocmVzaG9sZC50aHJlc2hvbGR9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtbnVtLWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2dldEZQTW9kZWxJbmRleChpbmZlcmVuY2VTdGF0c18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVZhbHVlVGhyZXNob2xkLnRocmVzaG9sZCwgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVZhbHVlVGhyZXNob2xkKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWZuIHBlcmYtdGFibGUtY2xpY2thYmxlIiBvbi10YXA9InRvZ2dsZVBlcmZSb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tmZWF0dXJlVmFsdWVUaHJlc2hvbGQudGhyZXNob2xkfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLW51bS1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRGTk1vZGVsSW5kZXgoaW5mZXJlbmNlU3RhdHNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVWYWx1ZVRocmVzaG9sZC50aHJlc2hvbGQsIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVWYWx1ZVRocmVzaG9sZCldXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1hY2MgcGVyZi10YWJsZS1jbGlja2FibGUiIG9uLXRhcD0idG9nZ2xlUGVyZlJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e2ZlYXR1cmVWYWx1ZVRocmVzaG9sZC50aHJlc2hvbGR9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtbnVtLWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2dldEFjY3VyYWN5TW9kZWxJbmRleChpbmZlcmVuY2VTdGF0c18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVZhbHVlVGhyZXNob2xkLnRocmVzaG9sZCwgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVZhbHVlVGhyZXNob2xkKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWYxIHBlcmYtdGFibGUtY2xpY2thYmxlIiBvbi10YXA9InRvZ2dsZVBlcmZSb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tmZWF0dXJlVmFsdWVUaHJlc2hvbGQudGhyZXNob2xkfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLW51bS1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRGMU1vZGVsSW5kZXgoaW5mZXJlbmNlU3RhdHNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVWYWx1ZVRocmVzaG9sZC50aHJlc2hvbGQsIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVWYWx1ZVRocmVzaG9sZCldXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9Int7ZmVhdHVyZVZhbHVlVGhyZXNob2xkLm9wZW5lZH19Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1lbnRyeS1leHBhbmRlZCBmbGV4LXJvdy1yZXZlcnNlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvdWxkU2hvd0ZlYXR1cmVQZXJmQ2hhcnRzXyhzZWxlY3RlZExhYmVsRmVhdHVyZSwgc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlLCBpbmZlcmVuY2VzKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmZzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtaG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXRleHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9DIGN1cnZlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaW5mby1vdXRsaW5lIiBjbGFzcz0iaW5mby1pY29uIHRocmVzaG9sZC1pbmZvLWljb24gbm8tcGFkZGluZyIgb24tdGFwPSJvcGVuRGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0icmlnaHQiIHZlcnRpY2FsLWFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPlJPQyBjdXJ2ZTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgcmVjZWl2ZXIgb3BlcmF0aW5nIGNoYXJhY3RlcmlzdGljIChST0MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VydmUgcGxvdHMgdGhlIHRydWUgcG9zaXRpdmUgcmF0ZSAoVFBSKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnYWluc3QgdGhlIGZhbHNlIHBvc2l0aXZlIHJhdGUgKEZQUikgYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpb3VzIGNsYXNzaWZpY2F0aW9uIHRocmVzaG9sZHMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi1jdXJ2ZS14LWxhYmVsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlIHBvc2l0aXZlIHJhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXktbGFiZWwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSBwb3NpdGl2ZSByYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZ6LWxpbmUtY2hhcnQyIGlkPSJbW2dldFJvY0NoYXJ0SWQoaW5kZXgpXV0iIHgtYXhpcy1mb3JtYXR0ZXI9IltbZ2V0U2ltcGxlQXhpc0Zvcm1hdHRlcihheGlzUHJlY2lzaW9uKV1dIiB5LWF4aXMtZm9ybWF0dGVyPSJbW2dldFNpbXBsZUF4aXNGb3JtYXR0ZXIoYXhpc1ByZWNpc2lvbildXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC92ei1saW5lLWNoYXJ0Mj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtaG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXRleHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFIgY3VydmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvLW91dGxpbmUiIGNsYXNzPSJpbmZvLWljb24gdGhyZXNob2xkLWluZm8taWNvbiBuby1wYWRkaW5nIiBvbi10YXA9Im9wZW5EaWFsb2ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kaWFsb2cgY2xhc3M9ImRpYWxvZy10ZXh0IiBob3Jpem9udGFsLWFsaWduPSJyaWdodCIgdmVydGljYWwtYWxpZ249ImJvdHRvbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+UFIgY3VydmU8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIHByZWNpc2lvbi1yZWNhbGwgKFBSKSBjdXJ2ZSBwbG90cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbiBhZ2FpbnN0IHJlY2FsbCBhdCB2YXJpb3VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NpZmljYXRpb24gdGhyZXNob2xkcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXgtbGFiZWwiPlJlY2FsbDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtY3VydmUteS1sYWJlbCI+UHJlY2lzaW9uPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZ6LWxpbmUtY2hhcnQyIGlkPSJbW2dldFByQ2hhcnRJZChpbmRleCldXSIgeC1heGlzLWZvcm1hdHRlcj0iW1tnZXRTaW1wbGVBeGlzRm9ybWF0dGVyKGF4aXNQcmVjaXNpb24pXV0iIHktYXhpcy1mb3JtYXR0ZXI9IltbZ2V0U2ltcGxlQXhpc0Zvcm1hdHRlcihheGlzUHJlY2lzaW9uKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Z6LWxpbmUtY2hhcnQyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbmYtdGV4dCI+Q29uZnVzaW9uIG1hdHJpeDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7ZmVhdHVyZVZhbHVlVGhyZXNob2xkLnRocmVzaG9sZH19Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Zi1jb25mdXNpb24tbWF0cml4IGNvdW50cz0iW1tnZXRDb25mdXNpb25Db3VudHNNb2RlbEluZGV4KGluZmVyZW5jZVN0YXRzXywgZmVhdHVyZVZhbHVlVGhyZXNob2xkLnRocmVzaG9sZCwgaW5kZXgsIGZlYXR1cmVWYWx1ZVRocmVzaG9sZCldXSIgbGFiZWw9IltbZ2V0Q29uZnVzaW9uTWF0cml4TGFiZWwoaW5kZXgsIG51bU1vZGVscyldXSIgYmFja2dyb3VuZD0iW1tnZXRDb25mdXNpb25NYXRyaXhDb2xvcihpbmRleCldXSIgYWxsLWl0ZW1zPSJbW2FsbENvbmZNYXRyaXhMYWJlbHNdXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RmLWNvbmZ1c2lvbi1tYXRyaXg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG91bGRTaG93T3ZlcmFsbFRocmVzaG9sZGVyXyhzZWxlY3RlZEJyZWFrZG93bkZlYXR1cmUpXV0iPgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtcm93LWV4cGFuZGVkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWFycm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJhcnJvdy1kcm9wLWRvd24iIG9uLXRhcD0idG9nZ2xlUGVyZlJvdyIgZGlzYWJsZWQ+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXZhbCBwZXJmLXRhYmxlLXRleHQtZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIGRhdGFwb2ludHMKICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWNvdW50IHBlcmYtdGFibGUtbnVtLWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0RmVhdHVyZVZhbHVlQ291bnQoaW5mZXJlbmNlU3RhdHNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmFsbFRocmVzaG9sZHMpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzJD0iW1tnZXRQZXJmVGFibGVNb2RlbENsYXNzKG51bU1vZGVscyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e292ZXJhbGxUaHJlc2hvbGRzfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXRleHQtZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0TW9kZWxOYW1lXyhpbmRleCldXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS10aHJlc2hvbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tvdmVyYWxsVGhyZXNob2xkc319Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXNsaWRlciBjbGFzcyQ9IltbZ2V0U2xpZGVyQ2xhc3MoaW5kZXgpXV0iIGVkaXRhYmxlPSJ0cnVlIiBtaW49IjAiIG1heD0iMSIgc3RlcD0iMC4wMSIgaW1tZWRpYXRlLXZhbHVlPSJ7e2l0ZW0udGhyZXNob2xkfX0iIHZhbHVlPSJbW2l0ZW0udGhyZXNob2xkXV0iIG9uLXZhbHVlLWNoYW5nZWQ9InJlZnJlc2hJbmZlcmVuY2VzTm9SZWdlbl8iIG9uLWltbWVkaWF0ZS12YWx1ZS1jaGFuZ2VkPSJyZWZyZXNoSW5mZXJlbmNlc05vUmVnZW5fIiBvbi1kb3duPSJyZXNldE9wdGltaXphdGlvblNlbGVjdGVkXyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItc2xpZGVyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWZwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7b3ZlcmFsbFRocmVzaG9sZHN9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtbnVtLWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2dldEZQTW9kZWxJbmRleChpbmZlcmVuY2VTdGF0c18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmFsbFRocmVzaG9sZHMsIGluZGV4KV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWZuIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7b3ZlcmFsbFRocmVzaG9sZHN9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtbnVtLWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2dldEZOTW9kZWxJbmRleChpbmZlcmVuY2VTdGF0c18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmFsbFRocmVzaG9sZHMsIGluZGV4KV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWFjYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e292ZXJhbGxUaHJlc2hvbGRzfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLW51bS1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRBY2N1cmFjeU1vZGVsSW5kZXgoaW5mZXJlbmNlU3RhdHNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJhbGxUaHJlc2hvbGRzLCBpbmRleCldXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1mMSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e292ZXJhbGxUaHJlc2hvbGRzfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLW51bS1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRGMU1vZGVsSW5kZXgoaW5mZXJlbmNlU3RhdHNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJhbGxUaHJlc2hvbGRzLCBpbmRleCldXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWVudHJ5LWV4cGFuZGVkIGZsZXgtcm93LXJldmVyc2UiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvdWxkU2hvd092ZXJhbGxQZXJmQ2hhcnRzXyhzZWxlY3RlZExhYmVsRmVhdHVyZSwgc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlLCBpbmZlcmVuY2VzKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmcy1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXRleHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJPQyBjdXJ2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvLW91dGxpbmUiIGNsYXNzPSJpbmZvLWljb24gdGhyZXNob2xkLWluZm8taWNvbiBuby1wYWRkaW5nIiBvbi10YXA9Im9wZW5EaWFsb2ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249InJpZ2h0IiB2ZXJ0aWNhbC1hbGlnbj0iYm90dG9tIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+Uk9DIGN1cnZlPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIHJlY2VpdmVyIG9wZXJhdGluZyBjaGFyYWN0ZXJpc3RpYyAoUk9DKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZSBwbG90cyB0aGUgdHJ1ZSBwb3NpdGl2ZSByYXRlIChUUFIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnYWluc3QgdGhlIGZhbHNlIHBvc2l0aXZlIHJhdGUgKEZQUikgYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaW91cyBjbGFzc2lmaWNhdGlvbiB0aHJlc2hvbGRzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXgtbGFiZWwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlIHBvc2l0aXZlIHJhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtY3VydmUteS1sYWJlbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSBwb3NpdGl2ZSByYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dnotbGluZS1jaGFydDIgaWQ9InJvY2NoYXJ0IiB4LWF4aXMtZm9ybWF0dGVyPSJbW2dldFNpbXBsZUF4aXNGb3JtYXR0ZXIoYXhpc1ByZWNpc2lvbildXSIgeS1heGlzLWZvcm1hdHRlcj0iW1tnZXRTaW1wbGVBeGlzRm9ybWF0dGVyKGF4aXNQcmVjaXNpb24pXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Z6LWxpbmUtY2hhcnQyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtY3VydmUtdGV4dCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFIgY3VydmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaW5mby1vdXRsaW5lIiBjbGFzcz0iaW5mby1pY29uIHRocmVzaG9sZC1pbmZvLWljb24gbm8tcGFkZGluZyIgb24tdGFwPSJvcGVuRGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kaWFsb2cgY2xhc3M9ImRpYWxvZy10ZXh0IiBob3Jpem9udGFsLWFsaWduPSJyaWdodCIgdmVydGljYWwtYWxpZ249ImJvdHRvbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPlBSIGN1cnZlPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIHByZWNpc2lvbi1yZWNhbGwgKFBSKSBjdXJ2ZSBwbG90cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24gYWdhaW5zdCByZWNhbGwgYXQgdmFyaW91cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbiB0aHJlc2hvbGRzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXgtbGFiZWwiPlJlY2FsbDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXktbGFiZWwiPlByZWNpc2lvbjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dnotbGluZS1jaGFydDIgaWQ9InByY2hhcnQiIHgtYXhpcy1mb3JtYXR0ZXI9IltbZ2V0U2ltcGxlQXhpc0Zvcm1hdHRlcihheGlzUHJlY2lzaW9uKV1dIiB5LWF4aXMtZm9ybWF0dGVyPSJbW2dldFNpbXBsZUF4aXNGb3JtYXR0ZXIoYXhpc1ByZWNpc2lvbildXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdnotbGluZS1jaGFydDI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtaG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29uZi10ZXh0Ij5Db25mdXNpb24gbWF0cml4PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7b3ZlcmFsbFRocmVzaG9sZHN9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRmLWNvbmZ1c2lvbi1tYXRyaXggY291bnRzPSJbW2dldENvbmZ1c2lvbkNvdW50c01vZGVsSW5kZXgoaW5mZXJlbmNlU3RhdHNfLCBvdmVyYWxsVGhyZXNob2xkcywgaW5kZXgpXV0iIGxhYmVsPSJbW2dldENvbmZ1c2lvbk1hdHJpeExhYmVsKGluZGV4LCBudW1Nb2RlbHMpXV0iIGJhY2tncm91bmQ9IltbZ2V0Q29uZnVzaW9uTWF0cml4Q29sb3IoaW5kZXgpXV0iIGFsbC1pdGVtcz0iW1thbGxDb25mTWF0cml4TGFiZWxzXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGYtY29uZnVzaW9uLW1hdHJpeD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2lzTXVsdGlDbGFzc18obW9kZWxUeXBlLCBtdWx0aUNsYXNzKV1dIiByZXN0YW1wPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXRpdGxlLXJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleCI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXROb1RocmVzaG9sZFBlcmZUYWJsZVRpdGxlKHNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRTZWNvbmRCcmVha2Rvd25GZWF0dXJlLAogICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlVmFsdWVUaHJlc2hvbGRzKV1dCiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvLW91dGxpbmUiIGNsYXNzPSJpbmZvLWljb24gcGVyZm9ybWFuY2UtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJhdXRvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc2lmaWNhdGlvbiBQZXJmb3JtYW5jZSBUYWJsZQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhlIGdyb3VuZCB0cnV0aCBmZWF0dXJlIHRvIGV4cGxvcmUgbW9kZWwKICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZSBpbmNsdWRpbmcgY29uZnVzaW9uIG1hdHJpY2VzLgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICBTbGljZSB0aGUgZGF0YXNldCBhbmQgZXhwbG9yZSBtb2RlbCBwZXJmb3JtYW5jZSBieQogICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlLgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtc29ydC1ib3giPgogICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InVuZm9sZC1tb3JlIiBjbGFzcz0icGVyZi1idXR0b24iIG9uLXRhcD0iZXhwYW5kQWxsUGVyZm9ybWFuY2UiIGFsdD0iZXhwYW5kIGFsbCBzbGljZXMiIHRpdGxlPSJFeHBhbmQgYWxsIHNsaWNlcyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJ1bmZvbGQtbGVzcyIgY2xhc3M9InBlcmYtYnV0dG9uIiBvbi10YXA9ImNvbGxhcHNlQWxsUGVyZm9ybWFuY2UiIGFsdD0iY29sbGFwc2UgYWxsIHNsaWNlcyIgdGl0bGU9IkNvbGxhcHNlIGFsbCBzbGljZXMiPgogICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iU29ydCBieSIgY2xhc3M9InRocmVzaG9sZC1kcm9wZG93biBwZXJmLXRhYmxlLXNvcnQtbWVudSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e3NlbGVjdGVkRmVhdHVyZVNvcnR9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9Im5hbWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbZ2V0RmVhdHVyZVNvcnRCeShtb2RlbFR5cGUsIG11bHRpQ2xhc3MpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbmFtZT0iW1tpdGVtXV0iPltbaXRlbV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWFycm93Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXZhbCI+RmVhdHVyZSBWYWx1ZTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtY291bnQiPkNvdW50PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcyQ9IltbZ2V0UGVyZlRhYmxlTW9kZWxDbGFzcyhudW1Nb2RlbHMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgTW9kZWwKICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWFjYyI+QWNjdXJhY3k8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZW50cmllcy1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbZmVhdHVyZVZhbHVlVGhyZXNob2xkc11dIiBhcz0iZmVhdHVyZVZhbHVlVGhyZXNob2xkIj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzJD0iW1tnZXRQZXJmVGFibGVSb3dDbGFzcyhmZWF0dXJlVmFsdWVUaHJlc2hvbGQub3BlbmVkKV1dIiBkYXRhLWluZGV4JD0iW1tpbmRleF1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWFycm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcyQ9IltbZ2V0RXhwYW5kQ29sbGFwc2VQZXJmSWNvbkNsYXNzKGZlYXR1cmVWYWx1ZVRocmVzaG9sZC5vcGVuZWQpXV0iIGljb249ImFycm93LWRyb3AtZG93biIgb24tdGFwPSJ0b2dnbGVQZXJmUm93Ij48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtdmFsIHBlcmYtdGFibGUtY2xpY2thYmxlIHBlcmYtdGFibGUtdGV4dC1lbnRyeSIgb24tdGFwPSJ0b2dnbGVQZXJmUm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0UHJpbnRhYmxlVmFsdWVfKGZlYXR1cmVWYWx1ZVRocmVzaG9sZCldXQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtY291bnQgcGVyZi10YWJsZS1udW0tZW50cnkgcGVyZi10YWJsZS1jbGlja2FibGUgcGVyZi10YWJsZS10ZXh0LWVudHJ5IiBvbi10YXA9InRvZ2dsZVBlcmZSb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRNdWx0aUNsYXNzRmVhdHVyZVZhbHVlQ291bnQoaW5mZXJlbmNlU3RhdHNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVZhbHVlVGhyZXNob2xkKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcyQ9IltbZ2V0UGVyZlRhYmxlTW9kZWxDbGFzcyhudW1Nb2RlbHMpXV0iIG9uLXRhcD0idG9nZ2xlUGVyZlJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e2ZlYXR1cmVWYWx1ZVRocmVzaG9sZC50aHJlc2hvbGR9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtdGV4dC1lbnRyeSBwZXJmLXRhYmxlLWNsaWNrYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRNb2RlbE5hbWVfKGluZGV4KV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWFjYyBwZXJmLXRhYmxlLWNsaWNrYWJsZSIgb24tdGFwPSJ0b2dnbGVQZXJmUm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7ZmVhdHVyZVZhbHVlVGhyZXNob2xkLnRocmVzaG9sZH19Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS10ZXh0LWVudHJ5IHBlcmYtdGFibGUtbnVtLWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2dldE11bHRpQ2xhc3NBY2N1cmFjeU1vZGVsSW5kZXgoaW5mZXJlbmNlU3RhdHNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBmZWF0dXJlVmFsdWVUaHJlc2hvbGQpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e2ZlYXR1cmVWYWx1ZVRocmVzaG9sZC5vcGVuZWR9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZW50cnktZXhwYW5kZWQgZmxleC1yb3ctcmV2ZXJzZSBzY3JvbGwteCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3VsZFNob3dGZWF0dXJlUGVyZkNoYXJ0c18oc2VsZWN0ZWRMYWJlbEZlYXR1cmUsIHNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSwgaW5mZXJlbmNlcyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmcy1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29uZi10ZXh0Ij5Db25mdXNpb24gbWF0cml4PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tpbmZlcmVuY2VTdGF0c19dXSIgYXM9ImluZmVyZW5jZVN0YXQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRmLWNvbmZ1c2lvbi1tYXRyaXggY291bnRzPSJbW2dldE11bHRpQ2xhc3NDb25mTWF0cml4KGluZmVyZW5jZVN0YXRzXywgaW5kZXgsIGZlYXR1cmVWYWx1ZVRocmVzaG9sZCldXSIgbGFiZWw9IltbZ2V0Q29uZnVzaW9uTWF0cml4TGFiZWwoaW5kZXgsIG51bU1vZGVscyldXSIgYmFja2dyb3VuZD0iW1tnZXRDb25mdXNpb25NYXRyaXhDb2xvcihpbmRleCldXSIgYWxsLWl0ZW1zPSJbW2FsbENvbmZNYXRyaXhMYWJlbHNdXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RmLWNvbmZ1c2lvbi1tYXRyaXg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbYWxsQ29uZk1hdHJpeExhYmVsc11dIiBhcz0ibGFiZWwiIGluZGV4LWFzPSJsYWJlbEluZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmZzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi1jdXJ2ZS10ZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9DIGN1cnZlIGZvciBbW2dldExhYmVsKGxhYmVsSW5kKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvLW91dGxpbmUiIGNsYXNzPSJpbmZvLWljb24gdGhyZXNob2xkLWluZm8taWNvbiBuby1wYWRkaW5nIiBvbi10YXA9Im9wZW5EaWFsb2ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0icmlnaHQiIHZlcnRpY2FsLWFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST0MgY3VydmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSByZWNlaXZlciBvcGVyYXRpbmcgY2hhcmFjdGVyaXN0aWMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChST0MpIGN1cnZlIHBsb3RzIHRoZSB0cnVlIHBvc2l0aXZlIHJhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUUFIpIGFnYWluc3QgdGhlIGZhbHNlIHBvc2l0aXZlIHJhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGUFIpIGF0IHZhcmlvdXMgY2xhc3NpZmljYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZHMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciB0aGlzIG11bHRpLWNsYXNzIGNsYXNzaWZpY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ibGVtLCB3ZSBwbG90IG9uZSBST0MgY3VydmUgZm9yIGVhY2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzLCBhdCBlYWNoIHRpbWUgY29uc2lkZXJpbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBpbiBxdWVzdGlvbiBhcyB0aGUgcG9zaXRpdmUgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYWxsIHRoZSBvdGhlcnMgYXMgbmVnYXRpdmVzICg8aT5pLmUuPC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGk+YmluYXJpemVkPC9pPiB2ZXJzaW9ucyBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JsZW0pLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi1jdXJ2ZS14LWxhYmVsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UgcG9zaXRpdmUgcmF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXktbGFiZWwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlIHBvc2l0aXZlIHJhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZ6LWxpbmUtY2hhcnQyIGlkPSJbW2dldFJvY0NoYXJ0TGFiZWxJZChsYWJlbEluZCwgaW5kZXgpXV0iIHgtYXhpcy1mb3JtYXR0ZXI9IltbZ2V0U2ltcGxlQXhpc0Zvcm1hdHRlcihheGlzUHJlY2lzaW9uKV1dIiB5LWF4aXMtZm9ybWF0dGVyPSJbW2dldFNpbXBsZUF4aXNGb3JtYXR0ZXIoYXhpc1ByZWNpc2lvbildXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Z6LWxpbmUtY2hhcnQyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtaG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtY3VydmUtdGV4dCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSIGN1cnZlIGZvciBbW2dldExhYmVsKGxhYmVsSW5kKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvLW91dGxpbmUiIGNsYXNzPSJpbmZvLWljb24gdGhyZXNob2xkLWluZm8taWNvbiBuby1wYWRkaW5nIiBvbi10YXA9Im9wZW5EaWFsb2ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0icmlnaHQiIHZlcnRpY2FsLWFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+UFIgY3VydmU8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBwcmVjaXNpb24tcmVjYWxsIChQUikgY3VydmUgcGxvdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbiBhZ2FpbnN0IHJlY2FsbCBhdCB2YXJpb3VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbiB0aHJlc2hvbGRzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdGhpcyBtdWx0aS1jbGFzcyBjbGFzc2lmaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmxlbSwgd2UgcGxvdCBvbmUgUFIgY3VydmUgZm9yIGVhY2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzLCBhdCBlYWNoIHRpbWUgY29uc2lkZXJpbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBpbiBxdWVzdGlvbiBhcyB0aGUgcG9zaXRpdmUgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYWxsIHRoZSBvdGhlcnMgYXMgbmVnYXRpdmVzICg8aT5pLmUuPC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGk+YmluYXJpemVkPC9pPiB2ZXJzaW9ucyBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JsZW0pLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi1jdXJ2ZS14LWxhYmVsIj5SZWNhbGw8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtY3VydmUteS1sYWJlbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWNpc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dnotbGluZS1jaGFydDIgaWQ9IltbZ2V0UHJDaGFydExhYmVsSWQobGFiZWxJbmQsIGluZGV4KV1dIiB4LWF4aXMtZm9ybWF0dGVyPSJbW2dldFNpbXBsZUF4aXNGb3JtYXR0ZXIoYXhpc1ByZWNpc2lvbildXSIgeS1heGlzLWZvcm1hdHRlcj0iW1tnZXRTaW1wbGVBeGlzRm9ybWF0dGVyKGF4aXNQcmVjaXNpb24pXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC92ei1saW5lLWNoYXJ0Mj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3VsZFNob3dPdmVyYWxsVGhyZXNob2xkZXJfKHNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSldXSI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1yb3ctZXhwYW5kZWQiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtYXJyb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImFycm93LWRyb3AtZG93biIgb24tdGFwPSJ0b2dnbGVQZXJmUm93IiBkaXNhYmxlZD48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtdmFsIHBlcmYtdGFibGUtdGV4dC1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgZGF0YXBvaW50cwogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtY291bnQgcGVyZi10YWJsZS1udW0tZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRNdWx0aUNsYXNzRmVhdHVyZVZhbHVlQ291bnQoaW5mZXJlbmNlU3RhdHNfKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcyQ9IltbZ2V0UGVyZlRhYmxlTW9kZWxDbGFzcyhudW1Nb2RlbHMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tvdmVyYWxsVGhyZXNob2xkc319Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS10ZXh0LWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2dldE1vZGVsTmFtZV8oaW5kZXgpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtYWNjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbaW5mZXJlbmNlU3RhdHNfXV0iIGFzPSJpbmZlcmVuY2VTdGF0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS10ZXh0LWVudHJ5IHBlcmYtdGFibGUtbnVtLWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2dldE11bHRpQ2xhc3NBY2N1cmFjeU1vZGVsSW5kZXgoaW5mZXJlbmNlU3RhdHNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZW50cnktZXhwYW5kZWQgZmxleC1yb3ctcmV2ZXJzZSBzY3JvbGwteCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG91bGRTaG93T3ZlcmFsbFBlcmZDaGFydHNfKHNlbGVjdGVkTGFiZWxGZWF0dXJlLCBzZWxlY3RlZEJyZWFrZG93bkZlYXR1cmUsIGluZmVyZW5jZXMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmZzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbmYtdGV4dCI+Q29uZnVzaW9uIG1hdHJpeDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2luZmVyZW5jZVN0YXRzX11dIiBhcz0iaW5mZXJlbmNlU3RhdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRmLWNvbmZ1c2lvbi1tYXRyaXggY291bnRzPSJbW2dldE11bHRpQ2xhc3NDb25mTWF0cml4KGluZmVyZW5jZVN0YXRzXywgaW5kZXgpXV0iIGxhYmVsPSJbW2dldENvbmZ1c2lvbk1hdHJpeExhYmVsKGluZGV4LCBudW1Nb2RlbHMpXV0iIGJhY2tncm91bmQ9IltbZ2V0Q29uZnVzaW9uTWF0cml4Q29sb3IoaW5kZXgpXV0iIGFsbC1pdGVtcz0iW1thbGxDb25mTWF0cml4TGFiZWxzXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGYtY29uZnVzaW9uLW1hdHJpeD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbYWxsQ29uZk1hdHJpeExhYmVsc11dIiBhcz0ibGFiZWwiIGluZGV4LWFzPSJsYWJlbEluZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmcy1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi1jdXJ2ZS10ZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJPQyBjdXJ2ZSBmb3IgW1tnZXRMYWJlbChsYWJlbEluZCldXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImluZm8tb3V0bGluZSIgY2xhc3M9ImluZm8taWNvbiB0aHJlc2hvbGQtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249InJpZ2h0IiB2ZXJ0aWNhbC1hbGlnbj0iYm90dG9tIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj5ST0MgY3VydmU8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIHJlY2VpdmVyIG9wZXJhdGluZyBjaGFyYWN0ZXJpc3RpYyAoUk9DKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlIHBsb3RzIHRoZSB0cnVlIHBvc2l0aXZlIHJhdGUgKFRQUikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2FpbnN0IHRoZSBmYWxzZSBwb3NpdGl2ZSByYXRlIChGUFIpIGF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaW91cyBjbGFzc2lmaWNhdGlvbiB0aHJlc2hvbGRzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdGhpcyBtdWx0aS1jbGFzcyBjbGFzc2lmaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JsZW0sIHdlIHBsb3Qgb25lIFJPQyBjdXJ2ZSBmb3IgZWFjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzLCBhdCBlYWNoIHRpbWUgY29uc2lkZXJpbmcgdGhlIGNsYXNzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gcXVlc3Rpb24gYXMgdGhlIHBvc2l0aXZlIG9uZSBhbmQgYWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG90aGVycyBhcyBuZWdhdGl2ZXMgKDxpPmkuZS48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGk+YmluYXJpemVkPC9pPiB2ZXJzaW9ucyBvZiB0aGUgcHJvYmxlbSkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi1jdXJ2ZS14LWxhYmVsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlIHBvc2l0aXZlIHJhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXktbGFiZWwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSBwb3NpdGl2ZSByYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZ6LWxpbmUtY2hhcnQyIGlkPSJbW2dldFJvY0NoYXJ0TGFiZWxJZChsYWJlbCwgJycpXV0iIHgtYXhpcy1mb3JtYXR0ZXI9IltbZ2V0U2ltcGxlQXhpc0Zvcm1hdHRlcihheGlzUHJlY2lzaW9uKV1dIiB5LWF4aXMtZm9ybWF0dGVyPSJbW2dldFNpbXBsZUF4aXNGb3JtYXR0ZXIoYXhpc1ByZWNpc2lvbildXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC92ei1saW5lLWNoYXJ0Mj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtaG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXRleHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFIgY3VydmUgZm9yIFtbZ2V0TGFiZWwobGFiZWxJbmQpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvLW91dGxpbmUiIGNsYXNzPSJpbmZvLWljb24gdGhyZXNob2xkLWluZm8taWNvbiBuby1wYWRkaW5nIiBvbi10YXA9Im9wZW5EaWFsb2ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kaWFsb2cgY2xhc3M9ImRpYWxvZy10ZXh0IiBob3Jpem9udGFsLWFsaWduPSJyaWdodCIgdmVydGljYWwtYWxpZ249ImJvdHRvbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+UFIgY3VydmU8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIHByZWNpc2lvbi1yZWNhbGwgKFBSKSBjdXJ2ZSBwbG90cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbiBhZ2FpbnN0IHJlY2FsbCBhdCB2YXJpb3VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NpZmljYXRpb24gdGhyZXNob2xkcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIHRoaXMgbXVsdGktY2xhc3MgY2xhc3NpZmljYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ibGVtLCB3ZSBwbG90IG9uZSBQUiBjdXJ2ZSBmb3IgZWFjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzLCBhdCBlYWNoIHRpbWUgY29uc2lkZXJpbmcgdGhlIGNsYXNzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gcXVlc3Rpb24gYXMgdGhlIHBvc2l0aXZlIG9uZSBhbmQgYWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG90aGVycyBhcyBuZWdhdGl2ZXMgKDxpPmkuZS48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGk+YmluYXJpemVkPC9pPiB2ZXJzaW9ucyBvZiB0aGUgcHJvYmxlbSkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi1jdXJ2ZS14LWxhYmVsIj5SZWNhbGw8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXktbGFiZWwiPlByZWNpc2lvbjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ei1saW5lLWNoYXJ0MiBpZD0iW1tnZXRQckNoYXJ0TGFiZWxJZChsYWJlbCwgJycpXV0iIHgtYXhpcy1mb3JtYXR0ZXI9IltbZ2V0U2ltcGxlQXhpc0Zvcm1hdHRlcihheGlzUHJlY2lzaW9uKV1dIiB5LWF4aXMtZm9ybWF0dGVyPSJbW2dldFNpbXBsZUF4aXNGb3JtYXR0ZXIoYXhpc1ByZWNpc2lvbildXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC92ei1saW5lLWNoYXJ0Mj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2lzUmVncmVzc2lvbl8obW9kZWxUeXBlKV1dIiByZXN0YW1wPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXRpdGxlLXJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleCI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXROb1RocmVzaG9sZFBlcmZUYWJsZVRpdGxlKHNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRTZWNvbmRCcmVha2Rvd25GZWF0dXJlLAogICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlVmFsdWVUaHJlc2hvbGRzKV1dCiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvLW91dGxpbmUiIGNsYXNzPSJpbmZvLWljb24gcGVyZm9ybWFuY2UtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJhdXRvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdyZXNzaW9uIFBlcmZvcm1hbmNlIFRhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0aGUgZ3JvdW5kIHRydXRoIGZlYXR1cmUgdG8gZXhwbG9yZSBtb2RlbAogICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlLgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICBTbGljZSB0aGUgZGF0YXNldCBhbmQgZXhwbG9yZSBtb2RlbCBwZXJmb3JtYW5jZSBieQogICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlLgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGxhYmVsPSJTb3J0IGJ5IiBjbGFzcz0idGhyZXNob2xkLWRyb3Bkb3duIHBlcmYtdGFibGUtc29ydC1tZW51Ij4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e3NlbGVjdGVkRmVhdHVyZVNvcnR9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9Im5hbWUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2dldEZlYXR1cmVTb3J0QnkobW9kZWxUeXBlLCBtdWx0aUNsYXNzKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBuYW1lPSJbW2l0ZW1dXSI+W1tpdGVtXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtYXJyb3ciPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtdmFsIj5GZWF0dXJlIFZhbHVlPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1jb3VudCI+Q291bnQ8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWVycm9yIj5NZWFuIGVycm9yPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1lcnJvciI+TWVkaWFuIGVycm9yPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1lcnJvciI+TWVhbiBhYnNvbHV0ZSBlcnJvcjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZXJyb3IiPk1lZGlhbiBhYnNvbHV0ZSBlcnJvcjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtc3EtZXJyb3IiPk1lYW4gc3F1YXJlZCBlcnJvcjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtc3EtZXJyb3IiPk1lZGlhbiBzcXVhcmVkIGVycm9yPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWVudHJpZXMtaG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW3JlZ3Jlc3Npb25FbnRyaWVzX11dIj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1hcnJvdyI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS12YWwgcGVyZi10YWJsZS10ZXh0LWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbaXRlbS5uYW1lXV0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWNvdW50IHBlcmYtdGFibGUtbnVtLWVudHJ5IHBlcmYtdGFibGUtdGV4dC1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2l0ZW0uY291bnRdXQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZXJyb3IgcGVyZi10YWJsZS1udW0tZW50cnkgcGVyZi10YWJsZS10ZXh0LWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZm9ybWF0RXJyb3IoaXRlbS5tZWFuRXJyb3IpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWVycm9yIHBlcmYtdGFibGUtbnVtLWVudHJ5IHBlcmYtdGFibGUtdGV4dC1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2Zvcm1hdEVycm9yKGl0ZW0ubWVkaWFuRXJyb3IpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWVycm9yIHBlcmYtdGFibGUtbnVtLWVudHJ5IHBlcmYtdGFibGUtdGV4dC1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2Zvcm1hdEVycm9yKGl0ZW0ubWVhbkFic0Vycm9yKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1zcS1lcnJvciBwZXJmLXRhYmxlLW51bS1lbnRyeSBwZXJmLXRhYmxlLXRleHQtZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tmb3JtYXRFcnJvcihpdGVtLm1lZGlhbkFic0Vycm9yKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1lcnJvciBwZXJmLXRhYmxlLW51bS1lbnRyeSBwZXJmLXRhYmxlLXRleHQtZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tmb3JtYXRFcnJvcihpdGVtLm1lYW5TcXVhcmVkRXJyb3IpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXNxLWVycm9yIHBlcmYtdGFibGUtbnVtLWVudHJ5IHBlcmYtdGFibGUtdGV4dC1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2Zvcm1hdEVycm9yKGl0ZW0ubWVkaWFuU3F1YXJlZEVycm9yKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdHMtdGFiIj4KICAgICAgICAgICAgICA8ZmFjZXRzLW92ZXJ2aWV3IGlkPSJvdmVydmlldyIgc2VhcmNoLXN0cmluZz0ie3tmZWF0dXJlU2VhcmNoVmFsdWV9fSI+PC9mYWNldHMtb3ZlcnZpZXc+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9pcm9uLXBhZ2VzPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tc3BsaXQtbGF5b3V0Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbF0pIHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICA6aG9zdCA6OnNsb3R0ZWQoKikgewogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdCA+ICNzcGxpdHRlciB7CiAgICAgICAgZmxleDogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgICBtaW4td2lkdGg6IDhweDsKICAgICAgICBtaW4taGVpZ2h0OiA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGl2aWRlci1jb2xvciwgI2NjYyk7CiAgICAgICAgZmlsbDogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yLCAjZmZmKTsKICAgICAgICBAYXBwbHkgLS12YWFkaW4tc3BsaXQtbGF5b3V0LXNwbGl0dGVyOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFt2ZXJ0aWNhbF0pKSA+ICNzcGxpdHRlciB7CiAgICAgICAgY3Vyc29yOiBldy1yZXNpemU7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbF0pID4gI3NwbGl0dGVyIHsKICAgICAgICBjdXJzb3I6IG5zLXJlc2l6ZTsKICAgICAgfQoKICAgICAgI2hhbmRsZSwKICAgICAgI3NwbGl0dGVyIDo6c2xvdHRlZChbc2xvdD1oYW5kbGVdKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZlcnRpY2FsXSkgPiAjc3BsaXR0ZXIgI2hhbmRsZSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgcm90YXRlKDkwZGVnKTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzbG90IGlkPSJwcmltYXJ5IiBuYW1lPSJwcmltYXJ5Ij48L3Nsb3Q+CiAgICA8ZGl2IGlkPSJzcGxpdHRlciIgb24tdHJhY2s9Il9vbkhhbmRsZVRyYWNrIiBvbi1kb3duPSJfcHJldmVudERlZmF1bHQiPgogICAgICA8c2xvdCBuYW1lPSJoYW5kbGUiPgogICAgICAgIDxzdmcgaWQ9ImhhbmRsZSIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIj4KICAgICAgICAgIDxyZWN0IHg9IjE5IiB5PSI4IiB3aWR0aD0iMiIgaGVpZ2h0PSIyNCI+PC9yZWN0PgogICAgICAgIDwvc3ZnPgogICAgICA8L3Nsb3Q+CiAgICA8L2Rpdj4KICAgIDxzbG90IGlkPSJzZWNvbmRhcnkiIG5hbWU9InNlY29uZGFyeSI+PC9zbG90PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1xdWVyeS1wYW5lIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJwYW5lIj4KICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWwgaWQ9Imh5cGVycGFyYW1ldGVycy1tZXRyaWNzLXN0YXR1c2VzIj4KICAgICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsIGlkPSJoeXBlcnBhcmFtZXRlcnMtbWV0cmljcyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24gaHlwZXJwYXJhbWV0ZXJzIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5IeXBlcnBhcmFtZXRlcnM8L2Rpdj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e19ocGFyYW1zfX0iIGFzPSJocGFyYW0iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaHBhcmFtIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7aHBhcmFtLmRpc3BsYXllZH19IiBjbGFzcz0iaHBhcmFtLWNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICBbW19ocGFyYW1OYW1lKGhwYXJhbS5pbmZvKV1dCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hwYXJhbS5maWx0ZXIuZG9tYWluRGlzY3JldGVdXSI+CiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tocGFyYW0uZmlsdGVyLmRvbWFpbkRpc2NyZXRlXV0iPgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7aXRlbS5jaGVja2VkfX0iIGNsYXNzPSJkaXNjcmV0ZS12YWx1ZS1jaGVja2JveCIgb24tY2hhbmdlPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICBbW19wcmV0dHlQcmludChpdGVtLnZhbHVlKV1dCiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaHBhcmFtLmZpbHRlci5pbnRlcnZhbF1dIj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9Ik1pbiIgdmFsdWU9Int7aHBhcmFtLmZpbHRlci5pbnRlcnZhbC5taW4udmFsdWV9fSIgYWxsb3dlZF9wYXR0ZXJuPSJbMC05LmVcLV0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgZXJyb3ItbWVzc2FnZT0iSW52YWxpZCBpbnB1dCIgaW52YWxpZD0iW1tocGFyYW0uZmlsdGVyLmludGVydmFsLm1pbi5pbnZhbGlkXV0iIHBsYWNlaG9sZGVyPSItaW5maW5pdHkiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGxhYmVsPSJNYXgiIHZhbHVlPSJ7e2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWwubWF4LnZhbHVlfX0iIGFsbG93ZWRfcGF0dGVybj0iWzAtOS5lXC1dIiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiIGludmFsaWQ9IltbaHBhcmFtLmZpbHRlci5pbnRlcnZhbC5tYXguaW52YWxpZF1dIiBwbGFjZWhvbGRlcj0iK2luZmluaXR5Ij4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hwYXJhbS5maWx0ZXIucmVnZXhwXV0iPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iUmVndWxhciBleHByZXNzaW9uIiB2YWx1ZT0ie3tocGFyYW0uZmlsdGVyLnJlZ2V4cH19IiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBtZXRyaWNzIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5NZXRyaWNzPC9kaXY+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tfbWV0cmljc319IiBhcz0ibWV0cmljIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1ldHJpYyI+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3ttZXRyaWMuZGlzcGxheWVkfX0iIGNsYXNzPSJtZXRyaWMtY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgIFtbX21ldHJpY05hbWUobWV0cmljLmluZm8pXV0KICAgICAgICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5saW5lLWVsZW1lbnQiPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iTWluIiB2YWx1ZT0ie3ttZXRyaWMuZmlsdGVyLmludGVydmFsLm1pbi52YWx1ZX19IiBhbGxvd2VkLXBhdHRlcm49IlswLTkuZVwtXSIgb24tdmFsdWUtY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIiBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IiBpbnZhbGlkPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWluLmludmFsaWR9fSIgcGxhY2Vob2xkZXI9Ii1pbmZpbml0eSI+CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50Ij4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9Ik1heCIgYWxsb3dlZC1wYXR0ZXJuPSJbMC05LmVcLV0iIHZhbHVlPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWF4LnZhbHVlfX0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgZXJyb3ItbWVzc2FnZT0iSW52YWxpZCBpbnB1dCIgaW52YWxpZD0ie3ttZXRyaWMuZmlsdGVyLmludGVydmFsLm1heC5pbnZhbGlkfX0iIHBsYWNlaG9sZGVyPSIraW5maW5pdHkiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIHN0YXR1cyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlN0YXR1czwvZGl2PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zdGF0dXNlc11dIiBhcz0ic3RhdHVzIj4KICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tzdGF0dXMuYWxsb3dlZH19IiBvbi1jaGFuZ2U9Il9xdWVyeVNlcnZlciI+CiAgICAgICAgICAgICAgICBbW3N0YXR1cy5kaXNwbGF5TmFtZV1dCiAgICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbCBpZD0ic29ydGluZy1wYWdpbmciPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBzb3J0aW5nIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+U29ydGluZzwvZGl2PgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iU29ydCBieSIgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiIGhvcml6b250YWwtYWxpZ249ImxlZnQiPgogICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tfc29ydEJ5SW5kZXh9fSIgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfaHBhcmFtc11dIiBhcz0iaHBhcmFtIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgW1tfaHBhcmFtTmFtZShocGFyYW0uaW5mbyldXQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfbWV0cmljc11dIiBhcz0ibWV0cmljIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgW1tfbWV0cmljTmFtZShtZXRyaWMuaW5mbyldXQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iRGlyZWN0aW9uIiBvbi1zZWxlY3RlZC1pdGVtLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e19zb3J0RGlyZWN0aW9ufX0iPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+QXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+RGVzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBwYWdpbmciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5QYWdpbmc8L2Rpdj4KICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICBOdW1iZXIgb2YgbWF0Y2hpbmcgc2Vzc2lvbiBncm91cHM6IFtbX3RvdGFsU2Vzc2lvbkdyb3Vwc0NvdW50U3RyXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50IHBhZ2UtbnVtYmVyLWlucHV0Ij4KICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9IlBhZ2UgIyIgdmFsdWU9Int7X3BhZ2VOdW1iZXJJbnB1dC52YWx1ZX19IiBhbGxvd2VkLXBhdHRlcm49IlswLTldIiBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IiBpbnZhbGlkPSJbW19wYWdlTnVtYmVySW5wdXQuaW52YWxpZF1dIiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgPGRpdiBzbG90PSJzdWZmaXgiIGNsYXNzPSJwYWdlLXN1ZmZpeCI+LyBbW19wYWdlQ291bnRTdHJdXTwvZGl2PgogICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmxpbmUtZWxlbWVudCBwYWdlLXNpemUtaW5wdXQiPgogICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iTWF4ICMgb2Ygc2Vzc2lvbiBncm91cHMgcGVyIHBhZ2U6IiB2YWx1ZT0ie3tfcGFnZVNpemVJbnB1dC52YWx1ZX19IiBhbGxvd2VkLXBhdHRlcm49IlswLTldIiBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IiBpbnZhbGlkPSJbW19wYWdlU2l6ZUlucHV0LmludmFsaWRdXSIgb24tdmFsdWUtY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIj4KICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgPC92YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIC5wYW5lIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIC5zZWN0aW9uIHsKICAgICAgICBtYXJnaW46IDVweCAxMHB4IDVweCAxMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KICAgICAgLnNlY3Rpb24tdGl0bGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIG1hcmdpbi1ib3R0b206IDdweDsKICAgICAgfQogICAgICAjaHlwZXJwYXJhbWV0ZXJzLW1ldHJpY3Mtc3RhdHVzZXMgewogICAgICAgIGZsZXgtYmFzaXM6IDcwJTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgI2h5cGVycGFyYW1ldGVycy1tZXRyaWNzIHsKICAgICAgICBmbGV4LWJhc2lzOiA5MCU7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICAgIC5oeXBlcnBhcmFtZXRlcnMgewogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICAgIC5tZXRyaWNzIHsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAuc3RhdHVzZXMgewogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CiAgICAgICNzb3J0aW5nLXBhZ2luZyB7CiAgICAgICAgZmxleC1iYXNpczogMzAlOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICAuc29ydGluZyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgLnBhZ2luZyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgLmRpc2NyZXRlLXZhbHVlLWNoZWNrYm94LAogICAgICAubWV0cmljLWNoZWNrYm94LAogICAgICAuaHBhcmFtLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAuZGlzY3JldGUtdmFsdWUtY2hlY2tib3ggewogICAgICAgIG1hcmdpbi1sZWZ0OiAyMHB4OwogICAgICB9CiAgICAgIC5ocGFyYW0sCiAgICAgIC5tZXRyaWMgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5pbmxpbmUtZWxlbWVudCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiA0MCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgICAgLnBhZ2UtbnVtYmVyLWlucHV0IHsKICAgICAgICB3aWR0aDogMjAlOwogICAgICB9CiAgICAgIC5wYWdlLXNpemUtaW5wdXQgewogICAgICAgIHdpZHRoOiA2MCU7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIHBhcGVyLWxpc3Rib3ggewogICAgICAgIG1heC1oZWlnaHQ6IDE1ZW07CiAgICAgIH0KICAgICAgLnBhZ2Utc3VmZml4IHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItaGVhZGVyLXBhbmVsIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtdmVydGljYWw7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWw7CiAgICAgIH0KCiAgICAgICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgICB9CgogICAgICAjbWFpblBhbmVsIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtdmVydGljYWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLWJvZHk7CiAgICAgIH0KCiAgICAgICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtY29udGFpbmVyOwogICAgICB9CgogICAgICAvKgogICAgICAgKiBtb2RlOiBzY3JvbGwKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPXNjcm9sbF0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtc2Nyb2xsLWNvbnRhaW5lcjsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgOmhvc3QoW21vZGU9c2Nyb2xsXSkgewogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogY292ZXIKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPWNvdmVyXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1jb3Zlci1jb250YWluZXI7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQoKICAgICAgOmhvc3QoW21vZGU9Y292ZXJdKSAjbWFpblBhbmVsIHsKICAgICAgICBwb3NpdGlvbjogc3RhdGljOwogICAgICB9CgogICAgICAvKgogICAgICAgKiBtb2RlOiBzdGFuZGFyZAogICAgICAgKi8KICAgICAgOmhvc3QoW21vZGU9c3RhbmRhcmRdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXN0YW5kYXJkLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogc2VhbWVkCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1zZWFtZWRdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXNlYW1lZC1jb250YWluZXI7CiAgICAgIH0KCgogICAgICAvKgogICAgICAgKiBtb2RlOiB3YXRlcmZhbGwKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPXdhdGVyZmFsbF0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtd2F0ZXJmYWxsLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogd2F0ZXJmYWxsLXRhbGwKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPXdhdGVyZmFsbC10YWxsXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC13YXRlcmZhbGwtdGFsbC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgICNkcm9wU2hhZG93IHsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuNXM7CiAgICAgICAgaGVpZ2h0OiA2cHg7CiAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMHB4IDVweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXNoYWRvdzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI2Ryb3BTaGFkb3cuaGFzLXNoYWRvdyB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgI21haW5Db250YWluZXIgPiA6OnNsb3R0ZWQoLmZpdCkgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KCiAgICA8L3N0eWxlPgoKICAgIDxzbG90IGlkPSJoZWFkZXJTbG90IiBuYW1lPSJoZWFkZXIiPjwvc2xvdD4KCiAgICA8ZGl2IGlkPSJtYWluUGFuZWwiPgogICAgICA8ZGl2IGlkPSJtYWluQ29udGFpbmVyIiBjbGFzcyQ9IltbX2NvbXB1dGVNYWluQ29udGFpbmVyQ2xhc3MobW9kZSldXSI+CiAgICAgICAgPHNsb3Q+PC9zbG90PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBpZD0iZHJvcFNoYWRvdyI+PC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10b29sYmFyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQ6IHZhcigtLXBhcGVyLXRvb2xiYXItaGVpZ2h0LCA2NHB4KTsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQ6IHZhcigtLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0LCA1NnB4KTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItaGVpZ2h0KTsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci10b29sYmFyLWJhY2tncm91bmQsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9vbGJhci1jb2xvciwgdmFyKC0tZGFyay10aGVtZS10ZXh0LWNvbG9yKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhcjsKICAgICAgfQoKICAgICAgOmhvc3QoLmFuaW1hdGUpIHsKICAgICAgICB0cmFuc2l0aW9uOiB2YXIoLS1wYXBlci10b29sYmFyLXRyYW5zaXRpb24sIGhlaWdodCAwLjE4cyBlYXNlLWluKTsKICAgICAgfQoKICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQpICogMik7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci1tZWRpdW07CiAgICAgIH0KCiAgICAgIDpob3N0KC50YWxsKSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQpICogMyk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci10YWxsOwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLWhlaWdodCk7CiAgICAgICAgcGFkZGluZzogMCAxNnB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci1jb250ZW50OwogICAgICB9CgogICAgICAvKgogICAgICAgKiBUT0RPOiBXaGVyZSBzaG91bGQgbWVkaWEgcXVlcnkgYnJlYWtwb2ludHMgbGl2ZSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBlbGVtZW50cz8KICAgICAgICovCgogICAgICBAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpIHsKICAgICAgICA6aG9zdCB7CiAgICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQpOwogICAgICAgIH0KCiAgICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSB7CiAgICAgICAgICBoZWlnaHQ6IGNhbGModmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCkgKiAyKTsKICAgICAgICB9CgogICAgICAgIDpob3N0KC50YWxsKSB7CiAgICAgICAgICBoZWlnaHQ6IGNhbGModmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCkgKiAzKTsKICAgICAgICB9CgogICAgICAgIC50b29sYmFyLXRvb2xzIHsKICAgICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAjdG9wQmFyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC8qIG1pZGRsZSBiYXIgKi8KICAgICAgI21pZGRsZUJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICA6aG9zdCgudGFsbCkgI21pZGRsZUJhciwKICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSAjbWlkZGxlQmFyIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDAlKTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwJSk7CiAgICAgIH0KCiAgICAgIC8qIGJvdHRvbSBiYXIgKi8KICAgICAgI2JvdHRvbUJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICAvKgogICAgICAgKiBtYWtlIGVsZW1lbnRzIChlLmcuIGJ1dHRvbnMpIHJlc3BvbmQgdG8gbW91c2UvdG91Y2ggZXZlbnRzCiAgICAgICAqCiAgICAgICAqIGAudG9vbGJhci10b29sc2AgZGlzYWJsZXMgdG91Y2ggZXZlbnRzIHNvIG11bHRpcGxlIHRvb2xiYXJzIGNhbiBzdGFjayBhbmQgbm90CiAgICAgICAqIGFic29yYiBldmVudHMuIEFsbCBjaGlsZHJlbiBtdXN0IGhhdmUgcG9pbnRlciBldmVudHMgcmUtZW5hYmxlZCB0byB3b3JrIGFzCiAgICAgICAqIGV4cGVjdGVkLgogICAgICAgKi8KICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoKjpub3QoW2Rpc2FibGVkXSkpIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLXRvb2xzID4gOjpzbG90dGVkKC50aXRsZSkgewogICAgICAgIG1hcmdpbi1sZWZ0OiA1NnB4OwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZChwYXBlci1pY29uLWJ1dHRvbiArIC50aXRsZSkgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVGhlIC0tcGFwZXItdG9vbGJhci10aXRsZSBtaXhpbiBpcyBhcHBsaWVkIGhlcmUgaW5zdGVhZCBvZiBhYm92ZSB0bwogICAgICAgKiBmaXggdGhlIGlzc3VlIHdpdGggbWFyZ2luLWxlZnQgYmVpbmcgaWdub3JlZCBkdWUgdG8gY3NzIG9yZGVyaW5nLgogICAgICAgKi8KICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci10aXRsZTsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQocGFwZXItaWNvbi1idXR0b25baWNvbj1tZW51XSkgewogICAgICAgIG1hcmdpbi1yaWdodDogMjRweDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLmZpdCkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IGF1dG87CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAvKiBUT0RPKG5vbXMpOiBVbnRpbCB3ZSBoYXZlIGEgYmV0dGVyIHNvbHV0aW9uIGZvciBjbGFzc2VzIHRoYXQgZG9uJ3QgdXNlCiAgICAgICAqIC9kZWVwLyBjcmVhdGUgb3VyIG93bi4KICAgICAgICovCiAgICAgIC5zdGFydC1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1zdGFydC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5jZW50ZXItanVzdGlmaWVkIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgfQoKICAgICAgLmVuZC1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1lbmQtanVzdGlmaWVkOwogICAgICB9CgogICAgICAuYXJvdW5kLWp1c3RpZmllZCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWFyb3VuZC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1qdXN0aWZpZWQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0idG9wQmFyIiBjbGFzcyQ9InRvb2xiYXItdG9vbHMgW1tfY29tcHV0ZUJhckV4dHJhQ2xhc3NlcyhqdXN0aWZ5KV1dIj4KICAgICAgPHNsb3QgbmFtZT0idG9wIj48L3Nsb3Q+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJtaWRkbGVCYXIiIGNsYXNzJD0idG9vbGJhci10b29scyBbW19jb21wdXRlQmFyRXh0cmFDbGFzc2VzKG1pZGRsZUp1c3RpZnkpXV0iPgogICAgICA8c2xvdCBuYW1lPSJtaWRkbGUiPjwvc2xvdD4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9ImJvdHRvbUJhciIgY2xhc3MkPSJ0b29sYmFyLXRvb2xzIFtbX2NvbXB1dGVCYXJFeHRyYUNsYXNzZXMoYm90dG9tSnVzdGlmeSldXSI+CiAgICAgIDxzbG90IG5hbWU9ImJvdHRvbSI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1zY2FsZS1hbmQtY29sb3ItY29udHJvbHMiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtcGFuZWwiPgogICAgICAKICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IkNvbG9yIGJ5IiBpZD0iY29sb3JCeURyb3BEb3duTWVudSIgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCI+CiAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e29wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4fX0iIGlkPSJjb2xvckJ5TGlzdEJveCI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW29wdGlvbnMuY29sdW1uc11dIiBhcz0iY29sdW1uIiBpZD0iY29sb3JCeUNvbHVtblRlbXBsYXRlIj4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gZGlzYWJsZWQ9IltbIV9pc051bWVyaWNDb2x1bW4oY29sdW1uLmluZGV4KV1dIj4KICAgICAgICAgICAgICBbW2NvbHVtbi5uYW1lXV0KICAgICAgICAgICAgPC9wYXBlci1pdGVtPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KCiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJjb2x1bW5zLWNvbnRhaW5lciI+CiAgICAgICAgCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tvcHRpb25zLmNvbHVtbnN9fSIgYXM9ImNvbHVtbiI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzTnVtZXJpY0NvbHVtbihjb2x1bW4uaW5kZXgpXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2x1bW4iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbHVtbi10aXRsZSI+CiAgICAgICAgICAgICAgICBbW2NvbHVtbi5uYW1lXV0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGNsYXNzPSJzY2FsZS1yYWRpby1ncm91cCIgc2VsZWN0ZWQ9Int7Y29sdW1uLnNjYWxlfX0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9IkxJTkVBUiI+CiAgICAgICAgICAgICAgICAgICAgTGluZWFyCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ibG9nU2NhbGVCdXR0b25fW1tjb2x1bW4ubmFtZV1dIiBuYW1lPSJMT0ciIGRpc2FibGVkPSJbWyFfYWxsb3dMb2dTY2FsZShjb2x1bW4sIHNlc3Npb25Hcm91cHMuKildXSI+CiAgICAgICAgICAgICAgICAgICAgTG9nYXJpdGhtaWMKICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iUVVBTlRJTEUiPgogICAgICAgICAgICAgICAgICAgIFF1YW50aWxlCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLmNvbnRyb2wtcGFuZWwgewogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CiAgICAgIC5jb2x1bW4gewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgICAgICBib3JkZXI6IHNvbGlkIDFweCBkYXJrZ3JheTsKICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgIH0KICAgICAgLmNvbHVtbi10aXRsZSB7CiAgICAgICAgLyogRml0IGV2ZXJ5IHRpdGxlIGluIG9uZSBsaW5lIHNvIHRoZSByYWRpbyBib3hlcyBhbGlnbiB2ZXJ0aWNhbGx5LiAqLwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KICAgICAgLmNvbHVtbnMtY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KICAgICAgLnNjYWxlLXJhZGlvLWdyb3VwIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgcGFkZGluZzogMnB4OwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIHBhcGVyLWxpc3Rib3ggewogICAgICAgIG1heC1oZWlnaHQ6IDE1ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWFjdGl2ZS1pdGVtLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tZ3JpZC10YWJsZSAudmFhZGluLWdyaWQtcm93W2FjdGl2ZV0gLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1ib2R5LXJvdy1hY3RpdmUtY2VsbCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS10YWJsZS1zY3JvbGwtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgICN0YWJsZSB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgICAgICB6LWluZGV4OiAtMjsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbaW9zXSAjdGFibGUgewogICAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdICN0YWJsZSB7CiAgICAgICAgdHJhbnNmb3JtOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS1zY3JvbGwtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IHsKICAgICAgICB6LWluZGV4OiAtMTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdIHsKICAgICAgICAvKiBBbnkgdmFsdWUgb3RoZXIgdGhhbiDigJhub25l4oCZIGZvciB0aGUgdHJhbnNmb3JtIHJlc3VsdHMgaW4gdGhlIGNyZWF0aW9uIG9mIGJvdGggYSBzdGFja2luZyBjb250ZXh0IGFuZAogICAgICAgIGEgY29udGFpbmluZyBibG9jay4gVGhlIG9iamVjdCBhY3RzIGFzIGEgY29udGFpbmluZyBibG9jayBmb3IgZml4ZWQgcG9zaXRpb25lZCBkZXNjZW5kYW50cy4gKi8KICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciwKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdIHZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtmaXhlZC1zZWN0aW9uc10gdmFhZGluLWdyaWQtdGFibGUtYm9keSNpdGVtcyB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtY2VsbCI+PC9kb20tbW9kdWxlPgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLWNlbGwiPjwvZG9tLW1vZHVsZT4KPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1jZWxsIj48L2RvbS1tb2R1bGU+Cjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1zaXplci1jZWxsIj48L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtc2l6ZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAuY2VsbCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDA7CiAgICAgICAgZm9udC1zaXplOiAxcHg7CiAgICAgICAgbWFyZ2luLXRvcDogLTFlbTsKICAgICAgfQoKICAgICAgLmNlbGxbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jb2x1bW5zXV0iIGFzPSJjb2x1bW4iPgogICAgICA8dmFhZGluLWdyaWQtc2l6ZXItY2VsbCBjbGFzcz0iY2VsbCIgY29sdW1uPSJbW2NvbHVtbl1dIj4mbmJzcDs8L3ZhYWRpbi1ncmlkLXNpemVyLWNlbGw+CiAgICA8L3RlbXBsYXRlPgoKICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLW91dGVyLXNjcm9sbGVyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbcGFzc3Rocm91Z2hdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpb3NdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGFsbDsKICAgICAgICB6LWluZGV4OiAtMzsKICAgICAgfQoKICAgICAgOmhvc3QoW2lvc11bc2Nyb2xsaW5nXSkgewogICAgICAgIHotaW5kZXg6IDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgoKICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgOmhvc3QgewogICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgei1pbmRleDogLTM7CiAgICAgICBoZWlnaHQ6IDA7CiAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgIH0KCiAgICAgOmhvc3QoOmZvY3VzKSwKICAgICAucHJpbWFyeTpmb2N1cywKICAgICA6OnNsb3R0ZWQoLnByaW1hcnk6Zm9jdXMpLAogICAgIC5zZWNvbmRhcnk6Zm9jdXMsCiAgICAgOjpzbG90dGVkKC5zZWNvbmRhcnk6Zm9jdXMpIHsKICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgfQogICAgPC9zdHlsZT4KCiAgICAKICAgIDxkaXYgY2xhc3M9InByaW1hcnkiIHRhYmluZGV4PSIwIiByb2xlPSJncmlkY2VsbCIgb24tZm9jdXM9Il9vbkJhaXRGb2N1cyIgb24tYmx1cj0iX29uQmFpdEJsdXIiPjxkaXYgYXJpYS1oaWRkZW49InRydWUiPiZuYnNwOzwvZGl2PjwvZGl2PgogICAgPGRpdiBjbGFzcz0ic2Vjb25kYXJ5IiB0YWJpbmRleD0iLTEiIHJvbGU9ImdyaWRjZWxsIiBvbi1mb2N1cz0iX29uQmFpdEZvY3VzIiBvbi1ibHVyPSJfb25CYWl0Qmx1ciI+PGRpdiBhcmlhLWhpZGRlbj0idHJ1ZSI+Jm5ic3A7PC9kaXY+PC9kaXY+CgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXJvdyI+PC9kb20tbW9kdWxlPgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLXJvdyI+PC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1yb3ctZGV0YWlscy1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgW2RldGFpbHNjZWxsXSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXJvdy1kZXRhaWxzLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAudmFhZGluLWdyaWQtY2VsbFtkZXRhaWxzY2VsbF0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtYm9keS1yb3ctZGV0YWlscy1jZWxsKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtZGF0YS1wcm92aWRlci10aGVtYWJpbGl0eS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KCiAgICAgIC8qIEFuaW0gKi8KICAgICAgQGtleWZyYW1lcyB2YWFkaW4tZ3JpZC1zcGluLTM2MCB7CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgIH0KICAgICAgfQogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgdmFhZGluLWdyaWQtc3Bpbi0zNjAgewogICAgICAgIDEwMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNzcGlubmVyIHsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wcmltYXJ5LWNvbG9yLCAjMDNBOUY0KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItdG9wLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtOHB4OwogICAgICAgIG1hcmdpbi10b3A6IC04cHg7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtbG9hZGluZy1zcGlubmVyKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2xvYWRpbmddKSAjc3Bpbm5lciB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogdmFhZGluLWdyaWQtc3Bpbi0zNjAgNDAwbXMgbGluZWFyIGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbjogdmFhZGluLWdyaWQtc3Bpbi0zNjAgNDAwbXMgbGluZWFyIGluZmluaXRlOwogICAgICB9CgogICAgICA6aG9zdChbbG9hZGluZ10pICNpdGVtcyB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tdGhlbWFiaWxpdHktc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3dbc2VsZWN0ZWRdIC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS0xMDAsIHJnYigyNDMsIDI0MywgMjQzKSk7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtYm9keS1yb3ctc2VsZWN0ZWQtY2VsbCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLW5hdmlnYXRpb24tdGhlbWFiaWxpdHktc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0KDpmb2N1cyksCiAgICAgICN0YWJsZTpmb2N1cyB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW25hdmlnYXRpbmddOm5vdChbaW50ZXJhY3RpbmddKSkgW2ZvY3VzZWRdID4gLnZhYWRpbi1ncmlkLXJvd1tmb2N1c2VkXSA+IFtmb2N1c2VkXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgM3B4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1mb2N1c2VkLWNlbGwpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWNvbHVtbi1yZW9yZGVyaW5nLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtyZW9yZGVyaW5nXSAudmFhZGluLWdyaWQtY2VsbCB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQoKICAgICAgOmhvc3QoW3Jlb3JkZXJpbmddKSAudmFhZGluLWdyaWQtY2VsbFtyZW9yZGVyLXN0YXR1cz0iZHJhZ2dpbmciXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcHJpbWFyeS1jb2xvciwgIzAwMCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlW3Jlb3JkZXJpbmddIC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAzMDBtczsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgb3BhY2l0eTogMC44OwogICAgICB9CgogICAgICAjc2Nyb2xsZXIgLnZhYWRpbi1ncmlkLWNlbGxbcmVvcmRlci1zdGF0dXM9ImFsbG93ZWQiXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIC52YWFkaW4tZ3JpZC1jZWxsW3Jlb3JkZXItc3RhdHVzPSJkcmFnZ2luZyJdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LWNvbG9yLCAjMDAwKTsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIC52YWFkaW4tZ3JpZC1jZWxsW3Jlb3JkZXItc3RhdHVzPSJkcmFnZ2luZyJdIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBvcGFjaXR5OiAwLjk1OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgoKICAgICAgQGtleWZyYW1lcyBhcHBlYXIgewogICAgICAgIHRvIHsKICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgfQogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGFuaW1hdGlvbjogMW1zIGFwcGVhcjsKICAgICAgfQoKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1tYXgtZGV2aWNlLXBpeGVsLXJhdGlvOiAxKSB7CiAgICAgICAgOmhvc3QgewogICAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNpdGVtcyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjaXRlbXMgewogICAgICAgIGJvcmRlci10b3A6IDAgc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgI2l0ZW1zID4gLnZhYWRpbi1ncmlkLXJvdyB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIC52YWFkaW4tZ3JpZC1jZWxsLAogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXIgLnZhYWRpbi1ncmlkLWNlbGwgewogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNlbGwgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CgogICAgICAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMzVweDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICAgIH0KCiAgICAgIFtsYXN0Y29sdW1uXSAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSwKICAgICAgW2xhc3QtZnJvemVuXSAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSB7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlb3JkZXJpbmctYWxsb3dlZF0gI2hlYWRlciwKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlc2l6aW5nXSB7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlc2l6aW5nXSB7CiAgICAgICAgY3Vyc29yOiBjb2wtcmVzaXplOwogICAgICB9CgogICAgICAudmFhZGluLWdyaWQtcm93Om5vdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIFtmcm96ZW5dIHsKICAgICAgICB6LWluZGV4OiAyOwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbbm8tY29udGVudC1wb2ludGVyLWV2ZW50c10gLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS10YWJsZS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoW2lvc11bY29sdW1uLXJlc2l6aW5nXSkgI291dGVyc2Nyb2xsZXIgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgICNmaXhlZHNpemVyLAogICAgICAjb3V0ZXJzaXplciB7CiAgICAgICAgYm9yZGVyLXRvcDogMCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItYm90dG9tOiAwIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAjdGFibGUgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CgogICAgICAjdGFibGVbb3ZlcmZsb3ctaGlkZGVuXSwKICAgICAgI291dGVyc2Nyb2xsZXJbb3ZlcmZsb3ctaGlkZGVuXSB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtc2l6ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI3NpemVyd3JhcHBlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IC0xMDA7CiAgICAgIH0KCiAgICAgICNyZW9yZGVyZ2hvc3QgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY29sdW1uKSwKICAgICAgOjpzbG90dGVkKHZhYWRpbi1ncmlkLXNlbGVjdGlvbi1jb2x1bW4pLAogICAgICA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY29sdW1uLWdyb3VwKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgoKICAgICAgLyogRGVmYXVsdCBib3JkZXJzICovCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciAudmFhZGluLWdyaWQtcm93Omxhc3QtY2hpbGQgLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIC52YWFkaW4tZ3JpZC1yb3c6Zmlyc3QtY2hpbGQgLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtYm9keSAudmFhZGluLWdyaWQtcm93Om5vdChbbGFzdHJvd10pIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tZGl2aWRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7CiAgICAgIH0KCiAgICAgIFtsYXN0LWZyb3plbl0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4wOCkpOwogICAgICB9CgogICAgICAvKiBDb2x1bW4gcmVzaXplIGhhbmRsZSAqLwoKICAgICAgLnZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlIHsKICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1jb2x1bW4tcmVzaXplLWhhbmRsZSk7CiAgICAgIH0KCiAgICAgIC8qIENlbGxzICovCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3cgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciAudmFhZGluLWdyaWQtcm93IC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1oZWFkZXItY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciAudmFhZGluLWdyaWQtcm93IC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1mb290ZXItY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWJvZHkgLnZhYWRpbi1ncmlkLXJvdyAudmFhZGluLWdyaWQtY2VsbDpub3QoW2RldGFpbHNjZWxsXSkgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWJvZHktY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWJvZHkgW29kZF0gLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1ib2R5LXJvdy1vZGQtY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3cgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pW2xhc3QtZnJvemVuXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtY2VsbC1sYXN0LWZyb3plbik7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlOm5vdChbc2Nyb2xsaW5nXSkgdmFhZGluLWdyaWQtdGFibGUtYm9keSAudmFhZGluLWdyaWQtcm93OmhvdmVyIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1ib2R5LXJvdy1ob3Zlci1jZWxsKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUgLnZhYWRpbi1ncmlkLXJvdyAudmFhZGluLWdyaWQtY2VsbC52YWFkaW4tZ3JpZC1jZWxsW2xhc3Rjb2x1bW5dIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBib3JkZXItcmlnaHQ6IG5vbmU7CiAgICAgIH0KCiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZSI+CiAgPHRlbXBsYXRlPgogICAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtdGFibGUtdGFibGUtc2Nyb2xsLXN0eWxlcyI+PC9zdHlsZT4KICAgICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXRhYmxlLXN0eWxlcyI+PC9zdHlsZT4KCiAgICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1kYXRhLXByb3ZpZGVyLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KCiAgICAgIDxkaXYgaWQ9InNwaW5uZXIiPjwvZGl2PgogICAgICA8ZGl2IGlkPSJ0YWJsZSIgdGFiaW5kZXg9Ii0xIiBvdmVyZmxvdy1oaWRkZW4kPSJbW19oaWRlVGFibGVPdmVyZmxvdyhzY3JvbGxiYXJXaWR0aCwgc2FmYXJpKV1dIj4KICAgICAgICA8ZGl2IGlkPSJzaXplcndyYXBwZXIiPgogICAgICAgICAgPHZhYWRpbi1ncmlkLXNpemVyIGlkPSJmaXhlZHNpemVyIiB0b3A9IltbX2VzdFNjcm9sbEhlaWdodF1dIiBjb2x1bW4tdHJlZT0iW1tjb2x1bW5UcmVlXV0iPjwvdmFhZGluLWdyaWQtc2l6ZXI+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHNsb3QgbmFtZT0iaGVhZGVyIj48L3Nsb3Q+CiAgICAgICAgPHNsb3QgbmFtZT0iaXRlbXMiPjwvc2xvdD4KICAgICAgICA8c2xvdCBuYW1lPSJmb290ZXIiPjwvc2xvdD4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGlkPSJyZW9yZGVyZ2hvc3QiPjwvZGl2PgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXIgaWQ9Im91dGVyc2Nyb2xsZXIiIHNjcm9sbC10YXJnZXQ9Iltbc2Nyb2xsVGFyZ2V0XV0iIG92ZXJmbG93LWhpZGRlbiQ9IltbX2hpZGVPdXRlclNjcm9sbGVyKHNjcm9sbGJhcldpZHRoLCBzYWZhcmkpXV0iIGlvcyQ9IltbaW9zXV0iIHNjcm9sbGluZyQ9Iltbc2Nyb2xsaW5nXV0iPgogICAgICA8dmFhZGluLWdyaWQtc2l6ZXIgaWQ9Im91dGVyc2l6ZXIiIHRvcD0iW1tfZXN0U2Nyb2xsSGVpZ2h0XV0iIGNvbHVtbi10cmVlPSJbW2NvbHVtblRyZWVdXSI+PC92YWFkaW4tZ3JpZC1zaXplcj4KICAgIDwvdmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXI+CiAgICA8c2xvdD48L3Nsb3Q+CiAgICA8c2xvdCBuYW1lPSJmb290ZXJGb2N1c1RyYXAiPjwvc2xvdD4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWNvbHVtbiI+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvciwgI2ZmZik7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXNjcm9sbC1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtcm93LWRldGFpbHMtc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXN0eWxlcyI+PC9zdHlsZT4KCiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtdGFibGUtdGhlbWFiaWxpdHktc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXNlbGVjdGlvbi10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtbmF2aWdhdGlvbi10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtYWN0aXZlLWl0ZW0tdGhlbWFiaWxpdHktc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXJvdy1kZXRhaWxzLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1jb2x1bW4tcmVvcmRlcmluZy10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CgogICAgPHZhYWRpbi1ncmlkLXRhYmxlIGlkPSJzY3JvbGxlciIgbG9hZGluZyQ9IltbX2xvYWRpbmddXSIgYmluZC1kYXRhPSJbW19iaW5kRGF0YV1dIiBzaXplPSJbW3NpemVdXSIgY29sdW1uLXRyZWU9IltbX2NvbHVtblRyZWVdXSIgcm93LWRldGFpbHMtdGVtcGxhdGU9IltbX3Jvd0RldGFpbHNUZW1wbGF0ZV1dIiBjb2x1bW4tcmVvcmRlcmluZy1hbGxvd2VkPSJbW2NvbHVtblJlb3JkZXJpbmdBbGxvd2VkXV0iPgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIGlkPSJoZWFkZXIiIHNsb3Q9ImhlYWRlciIgdGFyZ2V0PSJbW19nZXRDb250ZW50VGFyZ2V0KCldXSIgY29sdW1uLXRyZWU9IltbX2NvbHVtblRyZWVdXSI+PC92YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXI+CiAgICAgIDx2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IGlkPSJpdGVtcyIgc2xvdD0iaXRlbXMiPjwvdmFhZGluLWdyaWQtdGFibGUtYm9keT4KICAgICAgPHZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciBpZD0iZm9vdGVyIiBzbG90PSJmb290ZXIiIHRhcmdldD0iW1tfZ2V0Q29udGVudFRhcmdldCgpXV0iIGNvbHVtbi10cmVlPSJbW19jb2x1bW5UcmVlXV0iPjwvdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyPgoKICAgICAgCiAgICAgIDxzbG90IG5hbWU9ImZvb3RlckZvY3VzVHJhcCI+PC9zbG90PgoKICAgICAgCiAgICAgIAogICAgICA8c2xvdD48L3Nsb3Q+CgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtZm9jdXMtdHJhcCBpZD0iZm9vdGVyRm9jdXNUcmFwIiBzbG90PSJmb290ZXJGb2N1c1RyYXAiIG9uLWZvY3VzLWdhaW5lZD0iX29uRm9vdGVyRm9jdXMiIG9uLWZvY3VzLWxvc3Q9Il9vbkZvY3Vzb3V0Ij4KICAgICAgPC92YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwPgogICAgPC92YWFkaW4tZ3JpZC10YWJsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgPHRlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFzZXNzaW9uR3JvdXBdXSI+CiAgICAgIDxkaXY+CiAgICAgICAgPGgzPk5vIHNlc3Npb24gZ3JvdXAgc2VsZWN0ZWQ8L2gzPgogICAgICAgIDxwPlBsZWFzZSBzZWxlY3QgYSBzZXNzaW9uIGdyb3VwIHRvIHNlZSBpdHMgbWV0cmljLWdyYXBocyBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9oYXZlTWV0cmljcyh2aXNpYmxlU2NoZW1hLiopXV0iPgogICAgICA8ZGl2PgogICAgICAgIDxoMz5ObyBtZXRyaWNzIGFyZSBlbmFibGVkPC9oMz4KICAgICAgICA8cD5QbGVhc2UgZW5hYmxlIHNvbWUgbWV0cmljcyB0byBzZWUgY29udGVudCBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJsYXlvdXQgaG9yaXpvbnRhbCB3cmFwIHNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGF2ZU1ldHJpY3NBbmRTZXNzaW9uR3JvdXAodmlzaWJsZVNjaGVtYS4qLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25Hcm91cCldXSI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1t2aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zXV0iIGFzPSJtZXRyaWNJbmZvIj4KICAgICAgICAgIAogICAgICAgICAgPHRmLXNjYWxhci1jYXJkIGNsYXNzPSJzY2FsYXItY2FyZCIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIgZGF0YS10by1sb2FkPSJbW19jb21wdXRlU2VyaWVzRm9yU2Vzc2lvbkdyb3VwTWV0cmljKHNlc3Npb25Hcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNJbmZvKV1dIiB0YWc9IltbbWV0cmljSW5mby5uYW1lLnRhZ11dIiB0YWctbWV0YWRhdGE9IltbX2NvbXB1dGVUYWdNZXRhZGF0YShtZXRyaWNJbmZvKV1dIiB4LXR5cGU9IltbX3hUeXBlXV0iIG11bHRpLWV4cGVyaW1lbnRzPSJbW19ub011bHRpRXhwZXJpbWVudHNdXSIgcmVxdWVzdC1kYXRhPSJbW19yZXF1ZXN0RGF0YV1dIiBhY3RpdmU+CiAgICAgICAgICA8L3RmLXNjYWxhci1jYXJkPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KICAgIAogICAgPHN0eWxlIGluY2x1ZGU9Imlyb24tZmxleCI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLXRhYmxlLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDx2YWFkaW4tZ3JpZCBjbGFzcz0ic2Vzc2lvbi1ncm91cC10YWJsZSIgaWQ9InNlc3Npb25Hcm91cHNUYWJsZSIgY29sdW1uLXJlb3JkZXJpbmctYWxsb3dlZCBpdGVtcz0iW1tzZXNzaW9uR3JvdXBzXV0iPgogICAgICA8dmFhZGluLWdyaWQtY29sdW1uIGZsZXgtZ3Jvdz0iMCIgd2lkdGg9IjEwZW0iIHJlc2l6YWJsZT4KICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXIgdGFibGUtY2VsbCI+VHJpYWwgSUQ8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNlbGwiPltbaXRlbS5uYW1lXV08L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2VuYWJsZVNob3dNZXRyaWNzXV0iPgogICAgICAgIDx2YWFkaW4tZ3JpZC1jb2x1bW4gZmxleC1ncm93PSIwIiB3aWR0aD0iNWVtIiByZXNpemFibGU+CiAgICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj5TaG93IE1ldHJpY3M8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjbGFzcz0idGFibGUtY2VsbCIgY2hlY2tlZD0ie3tleHBhbmRlZH19Ij4KICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC92YWFkaW4tZ3JpZC1jb2x1bW4+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbdmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvc11dIiBhcz0iaHBhcmFtSW5mbyIgaW5kZXgtYXM9ImhwYXJhbUluZGV4Ij4KICAgICAgICA8dmFhZGluLWdyaWQtY29sdW1uIGZsZXgtZ3Jvdz0iMiIgd2lkdGg9IjEwZW0iIHJlc2l6YWJsZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBjbGFzcz0iaGVhZGVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIHRhYmxlLWNlbGwiPgogICAgICAgICAgICAgIFtbX2hwYXJhbU5hbWUoaHBhcmFtSW5mbyldXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNlbGwiPgogICAgICAgICAgICAgIFtbX3Nlc3Npb25Hcm91cEhQYXJhbShpdGVtLCBocGFyYW1JbmZvLm5hbWUpXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdmFhZGluLWdyaWQtY29sdW1uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e3Zpc2libGVTY2hlbWEubWV0cmljSW5mb3N9fSIgYXM9Im1ldHJpY0luZm8iIGluZGV4LWFzPSJtZXRyaWNJbmRleCI+CiAgICAgICAgPHZhYWRpbi1ncmlkLWNvbHVtbiBmbGV4LWdyb3c9IjIiIHdpZHRoPSIxMGVtIiByZXNpemFibGU+CiAgICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj4KICAgICAgICAgICAgICBbW19tZXRyaWNOYW1lKG1ldHJpY0luZm8pXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jZWxsIj4KICAgICAgICAgICAgICBbW19zZXNzaW9uR3JvdXBNZXRyaWMoaXRlbSwgbWV0cmljSW5mby5uYW1lKV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGNsYXNzPSJyb3ctZGV0YWlscyI+CiAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgc2Vzc2lvbi1ncm91cD0iW1tpdGVtXV0iIHZpc2libGUtc2NoZW1hPSJbW3Zpc2libGVTY2hlbWFdXSIgY2xhc3M9InNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscz4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdmFhZGluLWdyaWQ+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLnRhYmxlLWNlbGwgewogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAudGFibGUtaGVhZGVyIHsKICAgICAgICAvKiBsaW5lLWJyZWFrIG92ZXJmbG93aW5nIGNvbHVtbiBoZWFkZXJzICovCiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIC5zZXNzaW9uLWdyb3VwLXRhYmxlIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlc3Npb24tZ3JvdXAtZGV0YWlscyB7CiAgICAgICAgaGVpZ2h0OiAzNjBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMiPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19wcm9wZXJ0aWVzQXJlUG9wdWxhdGVkKHZpc2libGVTY2hlbWEsIHNlc3Npb25Hcm91cCldXSI+CiAgICAgIAogICAgICA8dGYtaHBhcmFtcy10YWJsZS12aWV3IHZpc2libGUtc2NoZW1hPSJbW3Zpc2libGVTY2hlbWFdXSIgc2Vzc2lvbi1ncm91cHM9IltbX3NpbmdsZXRvblNlc3Npb25Hcm91cHMoc2Vzc2lvbkdyb3VwKV1dIj4KICAgICAgPC90Zi1ocGFyYW1zLXRhYmxlLXZpZXc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfcHJvcGVydGllc0FyZVBvcHVsYXRlZCh2aXNpYmxlU2NoZW1hLCBzZXNzaW9uR3JvdXApXV0iPgogICAgICA8ZGl2PgogICAgICAgIENsaWNrIG9yIGhvdmVyIG92ZXIgYSBzZXNzaW9uIGdyb3VwIHRvIGRpc3BsYXkgaXRzIHZhbHVlcyBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImNvbnRhaW5lciI+CiAgICAgIDxzdmcgaWQ9InN2ZyI+PC9zdmc+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIHN2ZyB7CiAgICAgICAgZm9udDogMTBweCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAuYmFja2dyb3VuZCBwYXRoIHsKICAgICAgICBmaWxsOiBub25lOwogICAgICAgIHN0cm9rZTogI2RkZDsKICAgICAgICBzaGFwZS1yZW5kZXJpbmc6IGNyaXNwRWRnZXM7CiAgICAgIH0KCiAgICAgIC5mb3JlZ3JvdW5kIHBhdGggewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuNzsKICAgICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIH0KCiAgICAgIC8qIFdpbGwgYmUgc2V0IG9uIGZvcmVncm91bmQgcGF0aHMgdGhhdCBhcmUgbm90ICJjb250YWluZWQiIGluIHRoZSBjdXJyZW50CiAgICAgICAgIGF4ZXMgYnJ1c2hlcy4gSWYgbm8gYnJ1c2hlcyBhcmUgc2V0LCBubyBwYXRoIHdpbGwgaGF2ZSB0aGlzIGNsYXNzLiAqLwogICAgICAuZm9yZWdyb3VuZCAuaW52aXNpYmxlLXBhdGggewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIFN0eWxlIGZvciB0aGUgcGF0aCBjbG9zZXN0IHRvIHRoZSBtb3VzZSBwb2ludGVyICh0eXBpY2FsbHkgd2lsbCBiZWNvbWUKICAgICAgdGhlIHNlbGVjdGVkIHBhdGggd2hlbiB0aGUgdXNlciBjbGlja3MpLiAqLwogICAgICAuZm9yZWdyb3VuZCAucGVha2VkLXBhdGggewogICAgICAgIHN0cm9rZS13aWR0aDogMzsKICAgICAgfQoKICAgICAgLyogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwYXRoIGNsYXNzLiBXZSB1c2UgIWltcG9ydGFudCB0byBvdmVycmlkZSB0aGUKICAgICAgICAgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBjb2xvciBvZiBhIHBhdGguICovCiAgICAgIC5mb3JlZ3JvdW5kIC5zZWxlY3RlZC1wYXRoIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDMgIWltcG9ydGFudDsKICAgICAgICBzdHJva2U6ICMwZjAgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgI2NvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICBzdmcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmF4aXMgdGV4dCB7CiAgICAgICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI2ZmZiwgMXB4IDAgMCAjZmZmLCAwIC0xcHggMCAjZmZmLCAtMXB4IDAgMCAjZmZmOwogICAgICAgIGZpbGw6ICMwMDA7CiAgICAgICAgY3Vyc29yOiBtb3ZlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAogIAogIAogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPGRpdiBjbGFzcz0icGFuZSI+CiAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsPgogICAgICAgIAogICAgICAgIDx0Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scyBpZD0iY29udHJvbHMiIGNsYXNzPSJzZWN0aW9uIiBjb25maWd1cmF0aW9uPSJbW2NvbmZpZ3VyYXRpb25dXSIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBvcHRpb25zPSJ7e19vcHRpb25zfX0iPgogICAgICAgIDwvdGYtaHBhcmFtcy1zY2FsZS1hbmQtY29sb3ItY29udHJvbHM+CiAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgICAKICAgICAgICAgIDx0Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90IGlkPSJwbG90IiBjbGFzcz0ic2VjdGlvbiIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBzZWxlY3RlZC1zZXNzaW9uLWdyb3VwPSJ7e19zZWxlY3RlZEdyb3VwfX0iIGNsb3Nlc3Qtc2Vzc2lvbi1ncm91cD0ie3tfY2xvc2VzdEdyb3VwfX0iIG9wdGlvbnM9IltbX29wdGlvbnNdXSI+CiAgICAgICAgICA8L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3Q+CiAgICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbD4KICAgICAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMgaWQ9InZhbHVlcyIgY2xhc3M9InNlY3Rpb24iIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIiBzZXNzaW9uLWdyb3VwPSJbW19jbG9zZXN0T3JTZWxlY3RlZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xvc2VzdEdyb3VwLCBfc2VsZWN0ZWRHcm91cCldXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcz4KICAgICAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzIGlkPSJkZXRhaWxzIiBjbGFzcz0ic2VjdGlvbiIgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiBzZXNzaW9uLWdyb3VwPSJbW19zZWxlY3RlZEdyb3VwXV0iIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIj4KICAgICAgICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscz4KICAgICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgLnBhbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgfQogICAgICAjY29udHJvbHMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICNwbG90IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgICAjdmFsdWVzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDk1cHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjZGV0YWlscyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICA8c3ZnIGlkPSJzdmciPjwvc3ZnPgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgc3ZnIHsKICAgICAgICBmb250OiAxMHB4IHNhbnMtc2VyaWY7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjbG9zZXN0IGRhdGEgcG9pbnQgbWFya2VyIHRvIHRoZSBtb3VzZSBwb2ludGVyLiBXZSB1c2UgIWltcG9ydGFudAogICAgICAgICB0byBvdmVycmlkZSB0aGUgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBzdHlsZSBvZiBhIG1hcmtlci4KICAgICAgKi8KICAgICAgLmNsb3Nlc3QtbWFya2VyIHsKICAgICAgICByOiA2ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0YSBwb2ludCBtYXJrZXIuIFdlIHVzZSAhaW1wb3J0YW50IHRvCiAgICAgICAgIG92ZXJyaWRlIHRoZSBpbmxpbmUgc3R5bGUgdGhhdCBzZXRzIHRoZSByZWd1bGFyIHN0eWxlIG9mIGEgbWFya2VyLiAqLwogICAgICAuc2VsZWN0ZWQtbWFya2VyIHsKICAgICAgICByOiA2ICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogIzBmMCAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJwYW5lIj4KICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgCiAgICAgICAgPHRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzIGNsYXNzPSJzZWN0aW9uIiBpZD0iY29udHJvbHMiIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iIG9wdGlvbnM9Int7X29wdGlvbnN9fSI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scz4KICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbD4KICAgICAgICAgIAogICAgICAgICAgPHRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90IGNsYXNzPSJzZWN0aW9uIiBpZD0icGxvdCIgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIgc2VsZWN0ZWQtc2Vzc2lvbi1ncm91cD0ie3tfc2VsZWN0ZWRHcm91cH19IiBjbG9zZXN0LXNlc3Npb24tZ3JvdXA9Int7X2Nsb3Nlc3RHcm91cH19IiBvcHRpb25zPSJbW19vcHRpb25zXV0iPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtcGxvdD4KICAgICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsPgogICAgICAgICAgICA8dGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcyBjbGFzcz0ic2VjdGlvbiIgaWQ9InZhbHVlcyIgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iIHNlc3Npb24tZ3JvdXA9IltbX2Nsb3Nlc3RPclNlbGVjdGVkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xvc2VzdEdyb3VwLCBfc2VsZWN0ZWRHcm91cCldXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcz4KICAgICAgICAgICAgCiAgICAgICAgICAgIDx0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyBjbGFzcz0ic2VjdGlvbiIgaWQ9ImRldGFpbHMiIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgc2Vzc2lvbi1ncm91cD0iW1tfc2VsZWN0ZWRHcm91cF1dIiB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHM+CiAgICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgICAgPC92YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnBhbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgfQogICAgICAjY29udHJvbHMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICNwbG90IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjdmFsdWVzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDk1cHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjZGV0YWlscyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItaGVhZGVyLXBhbmVsPgogICAgICA8cGFwZXItdG9vbGJhciBzbG90PSJoZWFkZXIiIGNsYXNzPSJ0YWItYmFyIj4KICAgICAgICA8cGFwZXItdGFicyBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRUYWJ9fSIgc2xvdD0idG9wIj4KICAgICAgICAgIAogICAgICAgICAgPHBhcGVyLXRhYiB2aWV3LWlkPSJ0YWJsZS12aWV3Ij4KICAgICAgICAgICAgVEFCTEUgVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8cGFwZXItdGFiIHZpZXctaWQ9InBhcmFsbGVsLWNvb3Jkcy12aWV3Ij4KICAgICAgICAgICAgUEFSQUxMRUwgQ09PUkRJTkFURVMgVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8cGFwZXItdGFiIHZpZXctaWQ9InNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldyI+CiAgICAgICAgICAgIFNDQVRURVIgUExPVCBNQVRSSVggVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWxwLWFuZC1mZWVkYmFjayI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tidWdSZXBvcnRVcmxdXSI+CiAgICAgICAgICAgICAgPGEgaHJlZiQ9IltbYnVnUmVwb3J0VXJsXV0iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPgogICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0iYnVnLXJlcG9ydCIgcmFpc2VkIHRpdGxlPSJTZW5kIGEgYnVnIHJlcG9ydCBvciBmZWF0dXJlIHJlcXVlc3QiPgogICAgICAgICAgICAgICAgICBCdWcgUmVwb3J0IC8gRmVhdHVyZSBSZXF1ZXN0CiAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1toZWxwVXJsXV0iPgogICAgICAgICAgICAgIDxhIGhyZWYkPSJbW2hlbHBVcmxdXSIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+CiAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaGVscC1vdXRsaW5lIiB0aXRsZT0iVmlldyBkb2N1bWVudGF0aW9uIj4KICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9wYXBlci10YWJzPgogICAgICA8L3BhcGVyLXRvb2xiYXI+CiAgICAgIDxpcm9uLXBhZ2VzIHNlbGVjdGVkPSJbW19zZWxlY3RlZFRhYl1dIiBjbGFzcz0iZml0IHRhYi12aWV3Ij4KICAgICAgICA8ZGl2IGlkPSIwIiBjbGFzcz0idGFiIj4KICAgICAgICAgIDx0Zi1ocGFyYW1zLXRhYmxlLXZpZXcgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBlbmFibGUtc2hvdy1tZXRyaWNzPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXRhYmxlLXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iMSIgY2xhc3M9InRhYiI+CiAgICAgICAgICA8dGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldyBiYWNrZW5kPSJbW2JhY2tlbmRdXSIgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy12aWV3PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaWQ9IjIiIGNsYXNzPSJ0YWIiPgogICAgICAgICAgPHRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3IGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgY29uZmlndXJhdGlvbj0iW1tjb25maWd1cmF0aW9uXV0iIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSI+CiAgICAgICAgICA8L3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3PgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tcGFnZXM+CiAgICA8L3BhcGVyLWhlYWRlci1wYW5lbD4KCiAgICA8c3R5bGU+CiAgICAgIC50YWItdmlldyB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIC50YWItYmFyIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoCiAgICAgICAgICAtLXRiLXRvb2xiYXItYmFja2dyb3VuZC1jb2xvciwKICAgICAgICAgIHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpCiAgICAgICAgKTsKICAgICAgfQogICAgICAudGFiIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgcGFwZXItdGFicyB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAtLXBhcGVyLXRhYnMtc2VsZWN0aW9uLWJhci1jb2xvcjogd2hpdGU7CiAgICAgICAgLS1wYXBlci10YWJzLWNvbnRlbnQ6IHsKICAgICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAgIH0KICAgICAgfQogICAgICB0Zi1ocGFyYW1zLXRhYmxlLXZpZXcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAuaGVscC1hbmQtZmVlZGJhY2sgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyAvKiBFbnN1cmUgdGhhdCBpY29ucyBzdGF5IGFsaWduZWQgKi8KICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICAgICNidWctcmVwb3J0IHsKICAgICAgICBib3JkZXI6IHNvbGlkIGJsYWNrOwogICAgICAgIGJhY2tncm91bmQ6IHJlZDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmRzOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBtYXgtd2lkdGg6IDE1MHB4OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KICAgICAgLmhlbHAtYW5kLWZlZWRiYWNrIGEgewogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLW1haW4iPgogIDx0ZW1wbGF0ZT4KICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8dGYtaHBhcmFtcy1xdWVyeS1wYW5lIGlkPSJxdWVyeS1wYW5lIiBiYWNrZW5kPSJbW2JhY2tlbmRdXSIgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iIGNvbmZpZ3VyYXRpb249Int7X2NvbmZpZ3VyYXRpb259fSIgc2Vzc2lvbi1ncm91cHM9Int7X3Nlc3Npb25Hcm91cHN9fSI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXF1ZXJ5LXBhbmU+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbnMtcGFuZSBpZD0ic2Vzc2lvbnMtcGFuZSIgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGhlbHAtdXJsPSJbW2hlbHBVcmxdXSIgYnVnLXJlcG9ydC11cmw9IltbYnVnUmVwb3J0VXJsXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiBjb25maWd1cmF0aW9uPSJbW19jb25maWd1cmF0aW9uXV0iIHNlc3Npb24tZ3JvdXBzPSJbW19zZXNzaW9uR3JvdXBzXV0iPgogICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lPgogICAgICA8L2Rpdj4KICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgIDx0Zi1ocGFyYW1zLWdvb2dsZS1hbmFseXRpY3MtdHJhY2tlciBpZD0idHJhY2tlciIgdHJhY2tpbmctaWQ9IltbdHJhY2tpbmdJZF1dIiBuYW1lPSJ0Zl9ocGFyYW1zIj4KICAgIDwvdGYtaHBhcmFtcy1nb29nbGUtYW5hbHl0aWNzLXRyYWNrZXI+CgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tc3BsaXQtbGF5b3V0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLnNpZGViYXIgewogICAgICAgIHdpZHRoOiAyMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBtaW4td2lkdGg6IDEwJTsKICAgICAgfQoKICAgICAgLmNlbnRlciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIHdpZHRoOiA4MCU7CiAgICAgIH0KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPHRmLWhwYXJhbXMtbWFpbiBpZD0iaHBhcmFtcy1tYWluIiBiYWNrZW5kPSJbW19iYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iIj4KICAgIDwvdGYtaHBhcmFtcy1tYWluPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtbWVzaC1sb2FkZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgY29sb3I9IltbX3J1bkNvbG9yXV0iIGNsYXNzPSJ0Zi1tZXNoLWxvYWRlci1oZWFkZXIiPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU2FtcGxlcyhvZlNhbXBsZXMpXV0iPgogICAgICAgIDxkaXY+c2FtcGxlOiBbW19nZXRTYW1wbGVUZXh0KHNhbXBsZSldXSBvZiBbW29mU2FtcGxlc11dPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXAoX3N0ZXBzKV1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgc3RlcAogICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPltbdG9Mb2NhbGVTdHJpbmdfKF9zdGVwVmFsdWUpXV08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfY3VycmVudFdhbGxUaW1lXV0iPgogICAgICAgICAgICAgIFtbX2N1cnJlbnRXYWxsVGltZV1dCiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIHJpZ2h0Ij4KICAgICAgICAgICAgPHBhcGVyLXNwaW5uZXItbGl0ZSBhY3RpdmUgaGlkZGVuJD0iW1shX2lzTWVzaExvYWRpbmddXSI+CiAgICAgICAgICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVTdGVwcyhfc3RlcHMpXV0iPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItc2xpZGVyIGlkPSJzdGVwcyIgaW1tZWRpYXRlLXZhbHVlPSJ7e19zdGVwSW5kZXh9fSIgbWF4PSJbW19nZXRNYXhTdGVwSW5kZXgoX3N0ZXBzKV1dIiBtYXgtbWFya2Vycz0iW1tfZ2V0TWF4U3RlcEluZGV4KF9zdGVwcyldXSIgc25hcHMgc3RlcD0iMSIgdmFsdWU9Int7X3N0ZXBJbmRleH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdGYtY2FyZC1oZWFkaW5nPgogICAgPHN0eWxlPgogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAxcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxcHg7CiAgICAgIH0KICAgICAgLnRmLW1lc2gtbG9hZGVyLWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDVweDsKICAgICAgfQogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJtZXNoLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgc2xvdD0ic2lkZWJhciIgY2xhc3M9ImFsbC1jb250cm9scyI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHZpZXctY29udHJvbCI+CiAgICAgICAgICA8aDMgY2xhc3M9InRpdGxlIj5Qb2ludCBvZiB2aWV3PC9oMz4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxwYXBlci1yYWRpby1ncm91cCBpZD0idmlldy1yYWRpby1ncm91cCIgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkVmlld319Ij4KICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJhbGwtcmFkaW8tYnV0dG9uIiBuYW1lPSJhbGwiPgogICAgICAgICAgICAgICAgRGlzcGxheSBhbGwgcG9pbnRzCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9ImFsbC1yYWRpby1idXR0b24iIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgIFpvb20gYW5kIGNlbnRlciBjYW1lcmEgdG8gZGlzcGxheSBhbGwgcG9pbnRzIGF0IG9uY2UuIE5vdGUsIHRoYXQKICAgICAgICAgICAgICAgIHNvbWUgcG9pbnRzIGNvdWxkIGJlIHRvbyBmYXIgKGkuZS4gdG9vIHNtYWxsKSB0byBiZSB2aXNpYmxlLgogICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJ1c2VyLXJhZGlvLWJ1dHRvbiIgbmFtZT0idXNlciI+CiAgICAgICAgICAgICAgICBDdXJyZW50IHZpZXcKICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0idXNlci1yYWRpby1idXR0b24iIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgIEtlZXAgY3VycmVudCBjYW1lcmEgcG9zaXRpb24gYW5kIHpvb20gbGV2ZWwuCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9InNoYXJlLXJhZGlvLWJ1dHRvbiIgbmFtZT0ic2hhcmUiPgogICAgICAgICAgICAgICAgU2hhcmUgdmlld3BvaW50CiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9InNoYXJlLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgU2hhcmUgdmlld3BvaW50IGFtb25nIGFsbCBjYW1lcmFzLgogICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBydW5zLXNlbGVjdG9yIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBwb2ludCBjbG91ZCBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IHBvaW50IGNsb3VkIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy4KICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICAKICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIiBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLW1lc2gtbG9hZGVyIGFjdGl2ZT0iW1thY3RpdmVdXSIgc2VsZWN0ZWQtdmlldz0iW1tfc2VsZWN0ZWRWaWV3XV0iIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgc2FtcGxlPSJbW2l0ZW0uc2FtcGxlXV0iIG9mLXNhbXBsZXM9IltbaXRlbS5vZlNhbXBsZXNdXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIiBjbGFzcz0idGYtbWVzaC1sb2FkZXItY29udGFpbmVyIiBvbi1jYW1lcmEtcG9zaXRpb24tY2hhbmdlPSJfb25DYW1lcmFQb3NpdGlvbkNoYW5nZWQiPgogICAgICAgICAgICAgICAgPC90Zi1tZXNoLWxvYWRlcj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDVweDsKICAgICAgfQogICAgICAuc2lkZWJhci1zZWN0aW9uIGgzLnRpdGxlIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KCiAgICAgIC5ydW5zLXNlbGVjdG9yIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KCiAgICAgIHRmLXJ1bnMtc2VsZWN0b3IgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIC52aWV3LWNvbnRyb2wgewogICAgICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC52aWV3LWNvbnRyb2wgaDMudGl0bGUgewogICAgICAgIHBhZGRpbmctdG9wOiAxNnB4OwogICAgICAgIHBhZGRpbmctYm90dG9tOiAxNnB4OwogICAgICB9CgogICAgICAuYWxsY29udHJvbHMgLnZpZXctY29udHJvbCBwYXBlci1yYWRpby1ncm91cCB7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICB9CiAgICAgIC8qIExheW91dCBtdXN0IGJlIGhvcml6b250YWwsIGkuZS4gaXRlbXMgYXJyYW5nZWQgaW4gYSByb3cuIElmIGl0ZW1zIGNhbm5vdCBmaXQgaW4gYSByb3csCiAgICAgICAqIHRoZXkgc2hvdWxkIGJlIG1vdmVkIHRvIG5leHQgbGluZS4gQWxsIGl0ZW1zIG11c3QgYmUgc3F1YXJlIGF0IGFsbCB0aW1lcy4gTWluaW11bSBzaXplIG9mCiAgICAgICAqIHRoZSBpdGVtIGlzIDQ4MHB4LiBUaGlzIG1lYW5zIHRoYXQgbWF4aW11bSBzaXplIG9mIHRoZSBpdGVtIG11c3QgYmUgNDgwcHggKyA0NzlweCA9IDk1OXB4LgogICAgICAgKiAqLwogICAgICAuaG9yaXpvbnRhbCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfQogICAgICB0Zi1tZXNoLWxvYWRlciB7CiAgICAgICAgd2lkdGg6IDQ4MHB4OwogICAgICAgIGZsZXgtYmFzaXM6IDQ4MHB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi10ZW5zb3Jib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWRpYWxvZyB3aXRoLWJhY2tkcm9wIGlkPSJzZXR0aW5ncyI+CiAgICAgIDxoMj5TZXR0aW5nczwvaDI+CiAgICAgIDxwYXBlci1jaGVja2JveCBpZD0iYXV0by1yZWxvYWQtY2hlY2tib3giIGNoZWNrZWQ9Int7YXV0b1JlbG9hZEVuYWJsZWR9fSI+CiAgICAgICAgUmVsb2FkIGRhdGEgZXZlcnkgPHNwYW4+W1thdXRvUmVsb2FkSW50ZXJ2YWxTZWNzXV08L3NwYW4+cy4KICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJwYWdpbmF0aW9uTGltaXRJbnB1dCIgbGFiZWw9IlBhZ2luYXRpb24gbGltaXQiIGFsd2F5cy1mbG9hdC1sYWJlbCB0eXBlPSJudW1iZXIiIG1pbj0iMSIgc3RlcD0iMSIgb24tY2hhbmdlPSJfcGFnaW5hdGlvbkxpbWl0Q2hhbmdlZCIgb24tdmFsdWUtY2hhbmdlZD0iX3BhZ2luYXRpb25MaW1pdFZhbGlkYXRlIj48L3BhcGVyLWlucHV0PgogICAgPC9wYXBlci1kaWFsb2c+CiAgICA8cGFwZXItaGVhZGVyLXBhbmVsPgogICAgICA8cGFwZXItdG9vbGJhciBpZD0idG9vbGJhciIgc2xvdD0iaGVhZGVyIiBjbGFzcz0iaGVhZGVyIj4KICAgICAgICA8ZGl2IGlkPSJ0b29sYmFyLWNvbnRlbnQiIHNsb3Q9InRvcCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b29sYmFyLXRpdGxlIj5bW2JyYW5kXV08L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfYWN0aXZlRGFzaGJvYXJkc05vdExvYWRlZF1dIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRvb2xiYXItbWVzc2FnZSI+CiAgICAgICAgICAgICAgTG9hZGluZyBhY3RpdmUgZGFzaGJvYXJkc+KApgogICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19hY3RpdmVEYXNoYm9hcmRzTG9hZGVkXV0iPgogICAgICAgICAgICA8cGFwZXItdGFicyBub2luayBzY3JvbGxhYmxlIHNlbGVjdGVkPSJ7e19zZWxlY3RlZERhc2hib2FyZH19IiBhdHRyLWZvci1zZWxlY3RlZD0iZGF0YS1kYXNoYm9hcmQiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2Rhc2hib2FyZERhdGFdXSIgYXM9ImRhc2hib2FyZERhdHVtIj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNEYXNoYm9hcmRBY3RpdmUoZGlzYWJsZWREYXNoYm9hcmRzLCBfYWN0aXZlRGFzaGJvYXJkcywgZGFzaGJvYXJkRGF0dW0pXV0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItdGFiIGRhdGEtZGFzaGJvYXJkJD0iW1tkYXNoYm9hcmREYXR1bS5wbHVnaW5dXSIgdGl0bGU9IltbZGFzaGJvYXJkRGF0dW0udGFiTmFtZV1dIj4KICAgICAgICAgICAgICAgICAgICBbW2Rhc2hib2FyZERhdHVtLnRhYk5hbWVdXQogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRhYj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9wYXBlci10YWJzPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2luYWN0aXZlRGFzaGJvYXJkc0V4aXN0KF9kYXNoYm9hcmREYXRhLCBkaXNhYmxlZERhc2hib2FyZHMsIF9hY3RpdmVEYXNoYm9hcmRzKV1dIj4KICAgICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iSU5BQ1RJVkUiIG5vLWxhYmVsLWZsb2F0IG5vaW5rIHN0eWxlPSJtYXJnaW4tbGVmdDogMTJweCI+CiAgICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBpZD0iaW5hY3RpdmUtZGFzaGJvYXJkcy1tZW51IiBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tfc2VsZWN0ZWREYXNoYm9hcmR9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9ImRhdGEtZGFzaGJvYXJkIj4KICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfZGFzaGJvYXJkRGF0YV1dIiBhcz0iZGFzaGJvYXJkRGF0dW0iPgogICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNEYXNoYm9hcmRJbmFjdGl2ZShkaXNhYmxlZERhc2hib2FyZHMsIF9hY3RpdmVEYXNoYm9hcmRzLCBkYXNoYm9hcmREYXR1bSldXSIgcmVzdGFtcD4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIGRhdGEtZGFzaGJvYXJkJD0iW1tkYXNoYm9hcmREYXR1bS5wbHVnaW5dXSI+W1tkYXNoYm9hcmREYXR1bS50YWJOYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPGRpdiBjbGFzcz0iZ2xvYmFsLWFjdGlvbnMiPgogICAgICAgICAgICA8c2xvdCBuYW1lPSJpbmplY3RlZC1oZWFkZXItaXRlbXMiPjwvc2xvdD4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGlkPSJyZWxvYWQtYnV0dG9uIiBjbGFzcyQ9IltbX2dldERhdGFSZWZyZXNoaW5nQ2xhc3MoX3JlZnJlc2hpbmcpXV0iIGRpc2FibGVkJD0iW1tfaXNSZWxvYWREaXNhYmxlZF1dIiBpY29uPSJyZWZyZXNoIiBvbi10YXA9InJlbG9hZCIgdGl0bGUkPSJMYXN0IHVwZGF0ZWQ6IFtbX2xhc3RSZWxvYWRUaW1lU2hvcnRdXSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InNldHRpbmdzIiBvbi10YXA9Im9wZW5TZXR0aW5ncyIgaWQ9InNldHRpbmdzLWJ1dHRvbiI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiIHRhYmluZGV4PSItMSIgdGFyZ2V0PSJfYmxhbmsiPgogICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJoZWxwLW91dGxpbmUiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3BhcGVyLXRvb2xiYXI+CgogICAgICA8ZGl2IGlkPSJjb250ZW50LXBhbmUiIGNsYXNzPSJmaXQiPgogICAgICAgIDxzbG90IG5hbWU9ImluamVjdGVkLW92ZXJ2aWV3Ij48L3Nsb3Q+CiAgICAgICAgPGRpdiBpZD0iY29udGVudCI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2FjdGl2ZURhc2hib2FyZHNGYWlsZWRUb0xvYWRdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Indhcm5pbmctbWVzc2FnZSI+CiAgICAgICAgICAgICAgPGgzPkZhaWxlZCB0byBsb2FkIHRoZSBzZXQgb2YgYWN0aXZlIGRhc2hib2FyZHMuPC9oMz4KICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIFRoaXMgY2FuIG9jY3VyIGlmIHRoZSBUZW5zb3JCb2FyZCBiYWNrZW5kIGlzIG5vIGxvbmdlciBydW5uaW5nLgogICAgICAgICAgICAgICAgUGVyaGFwcyB0aGlzIHBhZ2UgaXMgY2FjaGVkPwogICAgICAgICAgICAgIAoKICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIElmIHlvdSB0aGluayB0aGF0IHlvdeKAmXZlIGZpeGVkIHRoZSBwcm9ibGVtLCBjbGljayB0aGUgcmVsb2FkCiAgICAgICAgICAgICAgICBidXR0b24gaW4gdGhlIHRvcC1yaWdodC4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1thdXRvUmVsb2FkRW5hYmxlZF1dIj4KICAgICAgICAgICAgICAgICAgV2XigJlsbCB0cnkgdG8gcmVsb2FkIGV2ZXJ5CiAgICAgICAgICAgICAgICAgIFtbYXV0b1JlbG9hZEludGVydmFsU2Vjc11dJm5ic3A7c2Vjb25kcyBhcyB3ZWxsLgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICA8aT5MYXN0IHJlbG9hZDogW1tfbGFzdFJlbG9hZFRpbWVdXTwvaT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YUxvY2F0aW9uXV0iPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPjxwPgogICAgICAgICAgICAgICAgICAgIDxpPkxvZyBkaXJlY3Rvcnk6CiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iZGF0YV9sb2NhdGlvbiI+W1tfZGF0YUxvY2F0aW9uXV08L3NwYW4+PC9pPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nob3dOb0Rhc2hib2FyZHNNZXNzYWdlXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nLW1lc3NhZ2UiPgogICAgICAgICAgICAgIDxoMz5ObyBkYXNoYm9hcmRzIGFyZSBhY3RpdmUgZm9yIHRoZSBjdXJyZW50IGRhdGEgc2V0LjwvaDM+CiAgICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOgogICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICAgIAoKICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIDxpPkxhc3QgcmVsb2FkOiBbW19sYXN0UmVsb2FkVGltZV1dPC9pPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTG9jYXRpb25dXSI+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+PHA+CiAgICAgICAgICAgICAgICAgICAgPGk+RGF0YSBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJkYXRhX2xvY2F0aW9uIj5bW19kYXRhTG9jYXRpb25dXTwvc3Bhbj48L2k+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2hvd05vU3VjaERhc2hib2FyZE1lc3NhZ2VdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Indhcm5pbmctbWVzc2FnZSI+CiAgICAgICAgICAgICAgPGgzPgogICAgICAgICAgICAgICAgVGhlcmXigJlzIG5vIGRhc2hib2FyZCBieSB0aGUgbmFtZSBvZgogICAgICAgICAgICAgICAg4oCcPHR0PltbX3NlbGVjdGVkRGFzaGJvYXJkXV08L3R0Pi7igJ0KICAgICAgICAgICAgICA8L2gzPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZF1dIj4KICAgICAgICAgICAgICAgIDxwPllvdSBjYW4gc2VsZWN0IGEgZGFzaGJvYXJkIGZyb20gdGhlIGxpc3QgYWJvdmUuPC90ZW1wbGF0ZT4KCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICA8aT5MYXN0IHJlbG9hZDogW1tfbGFzdFJlbG9hZFRpbWVdXTwvaT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YUxvY2F0aW9uXV0iPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPjxwPgogICAgICAgICAgICAgICAgICAgIDxpPkRhdGEgbG9jYXRpb246CiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iZGF0YV9sb2NhdGlvbiI+W1tfZGF0YUxvY2F0aW9uXV08L3NwYW4+PC9pPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGlkPSJkYXNoYm9hcmRzLXRlbXBsYXRlIiBpdGVtcz0iW1tfZGFzaGJvYXJkRGF0YV1dIiBhcz0iZGFzaGJvYXJkRGF0dW0iIG9uLWRvbS1jaGFuZ2U9Il9vblRlbXBsYXRlQ2hhbmdlZCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRhc2hib2FyZC1jb250YWluZXIiIGRhdGEtZGFzaGJvYXJkJD0iW1tkYXNoYm9hcmREYXR1bS5wbHVnaW5dXSIgZGF0YS1zZWxlY3RlZCQ9IltbX3NlbGVjdGVkU3RhdHVzKF9zZWxlY3RlZERhc2hib2FyZCwgZGFzaGJvYXJkRGF0dW0ucGx1Z2luKV1dIj4KICAgICAgICAgICAgICAKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvcGFwZXItaGVhZGVyLXBhbmVsPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTEwMCk7CiAgICAgIH0KCiAgICAgICN0b29sYmFyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoCiAgICAgICAgICAtLXRiLXRvb2xiYXItYmFja2dyb3VuZC1jb2xvciwKICAgICAgICAgIHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpCiAgICAgICAgKTsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMjVlbTsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGRpc3BsYXk6IHZhcigtLXRiLXRvb2xiYXItdGl0bGUtZGlzcGxheSwgYmxvY2spOwogICAgICB9CgogICAgICAudG9vbGJhci1tZXNzYWdlIHsKICAgICAgICBvcGFjaXR5OiAwLjc7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIHBhcGVyLXRhYnMgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgLS1wYXBlci10YWJzLXNlbGVjdGlvbi1iYXItY29sb3I6IHdoaXRlOwogICAgICAgIC0tcGFwZXItdGFicy1jb250ZW50OiB7CiAgICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgfQogICAgICB9CgogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yOiB3aGl0ZTsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1jb2xvcjogd2hpdGU7CiAgICAgICAgLS1wYXBlci1kcm9wZG93bi1tZW51LWljb246IHsKICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1kcm9wZG93bi1tZW51LWlucHV0OiB7CiAgICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgfQogICAgICB9CgogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHBhcGVyLWl0ZW0gewogICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgIH0KCiAgICAgICNpbmFjdGl2ZS1kYXNoYm9hcmRzLW1lbnUgewogICAgICAgIC0tcGFwZXItbGlzdGJveC1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoCiAgICAgICAgICAtLXRiLXRvb2xiYXItYmFja2dyb3VuZC1jb2xvciwKICAgICAgICAgIHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpCiAgICAgICAgKTsKICAgICAgICAtLXBhcGVyLWxpc3Rib3gtY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAuZ2xvYmFsLWFjdGlvbnMgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyAvKiBFbnN1cmUgdGhhdCBpY29ucyBzdGF5IGFsaWduZWQgKi8KICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAuZ2xvYmFsLWFjdGlvbnMgYSB7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAjdG9vbGJhci1jb250ZW50IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgICAjY29udGVudC1wYW5lIHsKICAgICAgICBhbGlnbi1pdGVtczogc3RyZXRjaDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3RyZXRjaDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2NvbnRlbnQgewogICAgICAgIGZsZXg6IDEgMTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAuZGFzaGJvYXJkLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAvKiBIaWRlIHVuc2VsZWN0ZWQgZGFzaGJvYXJkcy4gV2Ugc3RpbGwgZGlzcGxheSB0aGVtIHdpdGhpbiBhIGNvbnRhaW5lcgogICAgICAgICBvZiBoZWlnaHQgMCBzaW5jZSBQbG90dGFibGUgcHJvZHVjZXMgZGVnZW5lcmF0ZSBjaGFydHMgd2hlbiBjaGFydHMgYXJlCiAgICAgICAgIHJlbG9hZGVkIHdoaWxlIG5vdCBkaXNwbGF5ZWQuICovCiAgICAgIC5kYXNoYm9hcmQtY29udGFpbmVyOm5vdChbZGF0YS1zZWxlY3RlZF0pIHsKICAgICAgICBtYXgtaGVpZ2h0OiAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIC8qKiBXZSBmdXJ0aGVyIG1ha2UgY29udGFpbmVycyBpbnZpc2libGUuIFNvbWUgZWxlbWVudHMgbWF5IGFuY2hvciB0bwogICAgICAgICAgICB0aGUgdmlld3BvcnQgaW5zdGVhZCBvZiB0aGUgY29udGFpbmVyLCBpbiB3aGljaCBjYXNlIHNldHRpbmcgdGhlIG1heAogICAgICAgICAgICBoZWlnaHQgaGVyZSB0byAwIHdpbGwgbm90IGhpZGUgdGhlbS4gKi8KICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5kYXNoYm9hcmQtY29udGFpbmVyIGlmcmFtZSB7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLndhcm5pbmctbWVzc2FnZSB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KCiAgICAgIFtkaXNhYmxlZF0gewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgIH0KCiAgICAgICNyZWxvYWQtYnV0dG9uLnJlZnJlc2hpbmcgewogICAgICAgIGFuaW1hdGlvbjogcm90YXRlIDJzIGxpbmVhciBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyByb3RhdGUgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOwogICAgICAgIH0KICAgICAgICA1MCUgewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAogIAo8L2RvbS1tb2R1bGU+Cgo8Ym9keT4KICA8dGYtdGVuc29yYm9hcmQgdXNlLWhhc2ggYnJhbmQ9IlRlbnNvckJvYXJkIj48L3RmLXRlbnNvcmJvYXJkPgoKPHNjcmlwdCBzcmM9ImluZGV4LmpzIj48L3NjcmlwdD4=", + "ok": true, + "headers": [ + [ + "content-type", + "text/html; charset=utf-8" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/font-roboto/oMMgfZMQthOryQo9n22dcuvvDin1pK8aKteLpeZ5c0A.woff2": { + "data": "d09GMgABAAAAACn8AA4AAAAAUjgAACmjAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGmQbmUAcg0oGYACGTBEMCu1810YLg14AATYCJAOHNgQgBYJ0ByAbL0RFB2LYOGCA7DduwB2DjQOQz3hJ9n+ZwI0hWB/YxYSYMBRSFENBsWqrAkWbJBHpUKamYBECLd7YUy2OVYvlKX1dMf05+T/7LtU4wMKUW3v6cz1MLF0FGyHJLEG01r/VMHufgpZJIoGKBHQMKsYkFpgU4tsDmtv9xsaIGoiNiIJRtJKSElLSIdGjQuiRIypl0JtBlKISJSqZZnH/Oq0ZWaYZyYoPCFpukb7+N+xuwk6iBRZMI8WdlLQH1F3R7l157zoCyXjA9AD36nWBrP07PZhwgBLSeMnLEQ4VqJsqlv8siGuabsED3LeKFnxrugO3hMah9NJJ/ipRkvNo0bWSH6xvN8TX2qedvrqte1s1/yDEW6dCUB4tkIxQEeoDTSYMiiaAuBEGJLK/dSEgoaIi0Ua4CGXj/7vX2aa3YewLW7L1Fw6EC+fgxB/7NWWpMKZaUyFMhaxEyArLmA7J/62Zdje5MjlgYyvcOTf7ZycwswkX9oD2CklKoSNIzN4VWFXVET5/gKgKaO9USZgKCaxcreurQxDS1KS6SqUxAJqz+B+OtbQOoul9mcsgjITAKKN32318dn4Bhdn5t38EFHq8pCEUmUMECIAIFw4RKRIiRgxEnDiIBEkQpSqgdDmAQKCAVcCaECAgAiDACvyk0ex3gJounDg3gOACJy4k2DnDicusvN3gBBrAILTCpecT3AAH9C0NYpDo+7rNUJuyf/BUQ/cM42KIV0v11FyNhkyiUDj0XDKjjuX1lEnr9K7FjMnEPpZVifqZhCWKr4SbqzTQwLYaKjSBrueqpWpPjRbN9WixjymuFFH/CwqFBhYDRux4XXDRJZfdwE+IMBGibhEnQYq021SoUqPpHm069BkyZsKMhXQZsmTrQkH1yGNPPNWtR68+/Z4b8cJLr0x66515C1atWbdh05Z9BxC3mkNDHAcJeFI4TeKEYI8bP9Y44ePEm77r41+ewEGxRUrtUWZUuIsOetH6bTJql3HbzKjlpPZkximHvICSPiqPeMwTngZTLZpmhlleMxe8ac9b3jHPAmuss8EmW8F2u3bYZS/Yb9vBNIRJvask5+7FELPwimHcaoZ46yTaJ9WCSTY0DsjmwGD82Y7DoWmOfu1MGuY6fi64i8JTF1OyuErRYMJBFtuDaaussAMsMLJnmS0vuQHreu+JDYwyxjgTDXPAYsWQxpkTT6ltykCFu+glcU3S4tKxymCyyA7etO0t75hnoWEGSu1TRoW76JHEG97yjnkWzo2mioUhQSbYYOmYZg2ss8EmWw1jsBYFTyY55CV9Yp999tlnP46GGajhpolWtE5hDEphgsHaYdbBBptsWWTntaOdq59hH5i0BI2pTbJ9tW44FNXel24XIjwwjRl9q3SNYW6MMqPqdvrNMVySVP2Trj0U3CvhlYipV1w9cpuCyIgMoYoJ6uAoNADzvug45Zj7yoBXfrjWup4FNpUP90w83Gjmo+puO/m8JAbcN3D4dUpCw6N96EFl/RgLIB76ETisxR/w6aPfR7D+NjfOfbeHOYYeHrwM6cPqaG0C4EDa+qeN8E9UN/umlSM27Cex9S8bW/9cmENaN4plychcK2z/rnfLbrbSThvtiLBzSrZHuO7Wmpvu9U1ldbZfCTb4hlrtIxcAHO5g65ppXrrnhMPC1kvnK5fWHKkuAKxYS2ygcV0rlvjEtGOxglUm6USA2od7bZ7ZA0zgcMNXu6Vq96DjVnaFuUnt8GvYm+2/bLjrmx9odH8OHtYJcBgN/b8kxzn07RsPkp7oNsv+PxY7vLXhbI0B2O6kbBr78YIaGQ9mNpD/ZDn01If3Bh8OOu7XP4HYqD7kLYGVOfcyTk47aKYl0X7mMjiMDjPg7M42er6j3/abnabFTbZeexnmm/4ZPQMO37lXsuKw1GmniQNWEawkgpUo+P+g8bqExlXC6NwiDU+RkuNUiKeoeU+7RxcXffIw9p5jytx58d4L0uW4KO/t67osuGHVFr1lzLkJFBG7OIqjOKlO+kwUPh53gWwuEnGJGNdJ7wYZ8JOTEBHC5HCLTMRIT5wnSPAYSbKSIiNpslAk1h3SUiqP+NULp2hOtdHQAdF0S1ofe7ErOh/EMyMdczKLF9olnjsqE3JyqeeOygFPyuNJXV4ExVMo3X9j06MfxnOvIEZNoDdJXkZT5mC98R7x1gKc1fs01mxBk9dJBzawOQ5sKDkp7MUhWOFQrjBRrvMoIaKIEOVmyUxYL3rQ4QjYwQIGsIZUnapA3GVBSAIaNA5ND0QYkJFRiSHMgAOcYxIJoiQSJek+IlUaTgrBBg6wgcNx6IRwArCCIg8o0IFB0e4sQGgD2sfstj0Yi/vtsrpEq52XqxUx7wXavU9R5AbVfbV1p6EDtGWnJA/XVOMRsvo8RlPdHad9NxBpoVtpYHLL0QrVHnveFe6uwPf/7jyBq5c52luBaALJx8pX+LgSQAvlHBSU/jQISHSdPDXyK0T8EDNBpjzkeaygcCLzJqgiKV9QtldXCkW9eOkpVFBLmWjZoyokvMYGYuM3q7LDGjTAj7sPXGsYBaVQYdkTHmY1/zyKJHrVqlSqUatOvQaNHgpOvOwmgbx4I2vWolWbdigIDqeB6phIgQHjoSEEYoO3GfWG+xmO9H2b14EtgH09CwceqakEMmDjtbHwH1ywyEvghjwO6F0GGbeagAYru65f6TdFf8NxEZpQA3bCjcYxgDMmoUrc/1DdhozZ9MEhMsFlbnKRv254PFwOt8PD8DLMhvlhdVifRh0CAEy4lSj1fMkew8Zt+fiWtyg/Gs6H67an546+N+CsD3294PDnwOcHM058+/z/7Vt/15TJ8MUb+x/6/XXxtmRzAC4jjHlHw5q/XvcP1+XZL9e/HyHSqDHjJkyKEm3KtBmzXpsTI/YX7U0Txdm2Y9eeffEOMAIAZPHeNcAFkH5MT6DhJhQar4QOSmnAxmukk4d0404Pg1C8IcIZ7jem0m8c6GKCWZ7xmjkieMMCoyyyRBTLbDDlbRLDFh94430klk98Z5Uf/ITIL/6x7f0n3jtUBxqZCCT4yEItBRI1aiOQrFEfAiSN+hJI8bmP1LFAqs99ri4F0n3ua3UrkKW5HwRyNfeLQJ7PPVUzgXzNPRco1NwrgSLNvRYo1jyHQ6BkqJuBg+pwqVfwfijyRYUwvQnHv6TWp0PyKigaNh96H4GBhmyOegPVB40f59xGEvqhc+sAD9WxCKjVXrZAVDdIs68AhHKCotyajCaMMM33GHhE96JFqxBPQEEEoqpC8iJOGGL05OS/t6P7dswwoetDgYYOgzlyg98MT+zFf0ajcoEikxZ3w24atFBdBAG0lP/g72LZuroeHO2D0lGazKLkzmMauyiDCdhr2a5txrOVjSChgd2ova0t77MhhbcusVxATqdNzYG/FtlUbXRQPRO4OeZ3jE2LIpfa374QSXm/jXcJ1RlLGxZ+dBY1t4Brn0S4YIb5A885pd4Nm4nTxHTsncPU/uJFsrvfCo55+xh0RpRwlNVFmRZ5JT0a8vqz7YKjXITu0NETuTeLgWx0wlG1ZKwnE8zEIEPVAl29KW8grf5KvdJSAaHPwFwMFyKZcNGCzUM5o39uRYwWpCG2syOpPpQYJcOaFn+YiakAyoJBWW1PdQ3gky5Lyrv1Qu08YS8gSdFMp6Xw8V//1cwtjV/OeuogqHw10Ysw1TOlp8shZnahTTWfy4ZZH3Bv01/rq0FPiwuORTUH3Rr39SnJaRmeqQkMhbRqn4TlQFNuBzh2XJgnuDqHspyu0HjUXsMzfPUKBo4oQFl/59ra8oQdbCz13uBAOQ+7IIF6czUJA1lU66Bw5NYfWV31oNN7ypngGeWsuTqsEsrhFQEqG1WQZkIcz5vH8rsZjFklUsoKdqUiEv68IaVRHWA1ltQdWoR4IBbvBaMNWXDw7xohT2WjEINN7BucggQF7qiNneY8xhDhaJpbjN+TprJdqRJ68eUpZ5QTOoqiy71R/rGSuGKW/zv5f6bK+V+XqNf9bxu3tMVwufyHCz+PSnKjrh9+fWXoqLsUjumye4LFDWIi7dtumjw+brjklOBI+ScdTjXMTJQ4+jRhyjVAOkeCkt30cx/S2Z8qaXHhEDOrpWN7sCJd6FjeIVEmfARcWahxPLsI1sVRRvQyvF1z0BOqq/mw7dXZ5YiDWzSTRl1gQmV52yFfjGnz20KQxu571VcjSo6/lSSUtDza2mZJtR3ssJefgx5bpVWyM8HDYK/wkP5JPnL6UqVarauNUmfRkTOho3FTlGoP6PIFDRtZeBq6BcMRkGuIiNY4MYmDV0ujHNQz+aSb3NheHTbPCEeU8Mg3wvEIObtW60VLwLt7tL9LwT6HZUmRTfWEN7twFXImIwjFDI64QVhZ3NhBFt8eBbxHMZ8CaIe7H1C8xvXMdyxLPb6VIsSjjQ5Tu6SCqgAr05exOiWSIOmZeqYl2yAKsJ4IfFNStZo5LrDOMVUi2QHIrmqZ8dR/Sd8CWKfN1Wr8Mskb5eGEuUnILSj6pq4YSmagxspkGt6pTX8GqCojM8mUjwKb6kdQiWqQsEttHrQP39bBMb/jp+WMbYfEKRvFj3/DjHhrj/gV5E+5wKkhbQbvSCZBg9oF+S042qt+KCNAGgjS24pSDB1vg0HdlcYmpwORmpccTd0pV+zgEtazSNPfQ0pIHnElz5rKRywGsg04LtCsfnVCrglVCXW2UwSoJrdok1FMXuGCi+3BkEsTB73xIylxRo9pfLYQYxLuUC1A6WAXzk0miNkeiw1OG6sUC1JVAcxx+9QSh5gpb4ljMlXlQ8qQQ3dgkoicYMp93+rZewvB1cgE6qFuCI/w2OaxiJkb+/Jx6REGfgqeugr5MzGoCXlAhbvvgpRRatUGSqa0aT40UTVEIniStK2KkQNSWnadTS44MC0ZcShqn/tNbjSpzhJPWqmVtdIahqMy4JIurfISwFqdDknlN/ZkJWaJOfPmu0hCIViLEiCXeDo1fx31S8zs39RXB2funyM/h/4qJvzk1FE1AlLSBoRckNzDUC2Vie0A3dVydpP2+nlQlXWLmsM6kpxf2qNAnzxXE9I8zbaSdNBbUmBp9qN4v7SdxKEPSQw7OPKYqmGDHU1G25UrXOzQT8UESQ8gg7ZI7KplJNU1l8Ei8eqUd9TGu/Hq7MDh3qFLtVYpmTYB1RVu8jGGn+HIKixbp7pl08klbTB60qEpikY9sjLo9EaglvU96Bz3EvfEcLRjtkf+1rba2RopIJY4orU7uObY3Y9SlGnOR8UZRdWYYRWrEpkS6FgkfdvN4lxqew4RQe5mP6W+wnEkhvXYbXxIZd2qOGV+DxkBE9TT6D3p7Zq2VzJUAseOmluQLiocOOkAKDVWaXR015dYYhhgYrCcD6ml8QGDF/GOWXf4pN3DFIOvh2olo92vyup7stXa0MvaZcUB90LXMpfiqT0HdGwvKlR7KYetkJMa2zJ/eArTc+pPLwuQVoRD7jxII8nWDhElbFkfTa6MUhEyZ1g5yvyhBBlM5pzxUDZLT/37WD/EMrpTwTbt4IhlG7ZotGO0+OI4aZ8Go5MwWJcz21FJpnoSIFY/ccFOPVCPGOEsSkbF/PQIj5jGOrVbVnfwRTqNq6nNasQEQSYH7oLXLiW31UgXpk8J44vqKc0GKe+BUadt3wUGAkJHB7zFtQeGQxccdSieReslSPWf21E+PxPTi3gAyczhLgUOemFaBT28Nb0szb2eFfH0QV74/FTUWTUSxGVUnmvtGSxEF+eUJztVfeYpr5KlNEbYbqQ/w8UBwJAH0HamgKFli1D0/cDgt1aKRsyIiBkajPOqYfpIH2OmzjUXl2DjQBcnYNPzP23nDgeJTLHZjvA3F6eZS+qL+hBHp2CFSjh9r5hEHI5LWf8yYeu+fiXuj2dEpxTy4BSscCAS7mcaFpIjOC3TN15a8XSiiv1d5nw1J3XvVVdSdCXBLyTQ7X6UP791na9WoVPtyKsOfHdGN4V1cnOIkpCaGROZGQLYjJzIqtrI6Io6olJUVVV4RG1VQhxWw8BWVUnfSk9FQ88uQ89O+1zrjciqGmx1dYKSoDTFEzCaH0DKetZ6qpr6NipKhta6Pz/vyl71JjjIgm2Mo3dThbeljyxJqar/UU1W/8NoQ8MMt3tOGvIR8uHF1YdJ9djPRUuCiuyQgv0MsjKrmh7gbl1DWxUY4ZuThDq3YelD8tGWvyGgLy1vY6imbeEGLDOpHO7hsJgJURqr/sUfdMIUeQNS3akvcKdANyLxpG6ttwWvR5SKf+OeDogqLHnnfDSKVObzyPWhfkSuc08aOBScttLk84hUfq/nmw8c5a+vGV3LuuaOM8ilM73oei1b0HiQOciMcqb1WLAxXFpjymrKekl9Wf4AqqVC9FkHJbMIdHx1e6qd9XNg5NrO3gaSJT+J0MR/vZGQBOTgYj7stSKQKXNVXJDY31kSRgv+kF24ebC3cBUl1sW4FzlLSg6fQRYu7hOXE+KiplBr8IY64U2sYRs6DULU6B833EN1i/QIcale8TkFiZTnqB9vXuxNN79muxhd9Q6O2QgmRCCZ0QQ4jJKJnpTGv+v9oztv+iwCmx2v+PFGND0YOBw/gIUOqldmXGhMUkLkg/zYNCQBblntjGSPaFO1s10v9n8avPBleHDEAF69UZnZrVe/kugkTRzewS6vfEa97f0yw/q4iTWYFOobntaUn1ZEjgpQEKYF4W/NhTyv0Yd/jpcJkcNPVxmmV74yjU6gZf4ppenXaNNMkCyKPbn0FNpK3wWEJHdmZqV0gZyeMm+7ch9v5jGOnDmQHhB2JdRa3fDkj3rk9+T/0vjk3+XHvmFPPPktb7jXunTtve7t2X9N52URmJf7Oyv7Z1pSZER6MpvtCdeYGG/3KOJiemfEJYDQapiYQomOZSg1yG6ZmOa28yKIOPdT7qhorWaMNs35ggvr6G+bbL/MCjzP6ah2FK4FBKZTczOTe4A20vPvgNDZoDTV5MABkCq/LlcqJyNXIgcCLfEZqKciVoFpdFmDesA2F/EViFPTiYjRMXd1dPV1vB/kbEJBSleHOp5MjjQ3lda6OCtr5fRIdt1PHpfS7wyfXh9tfyRcLaIbr62anLqFf8lc4Y96mu5478FlTWmhS/jNdM+EJUwrPupOtsbzm0OtfvTfGH6QXPh6JozbrrScJ8y+FHD8bb/cUsVwggG/0BH0/sMvm6XGSpkVD6YkrWxDSTe7c+a4a9+DZXxyDkByItiaGDTEM0iu4ZkhD7Yc//CjBmoBQ54/eN/fc9+rwOayDzexK2zg39L2rRpGqZi8+EBartu5PKFZIS7+CS6kU6AePnpik+v3e5Sop2jiixQhuoqm7aMozvXeY41V+Vld4yx/kg4Gj7aU1KWcbDU7WvOfnqsuEoFnZqNFInyV/QiTCN5nZPE7+yH+3MbPICCNKvWjWSgsBAw5vWhq2g8k+yJtInsAQ44pGvpsA+o93SqOOAdyC3tVlhAy8kBF0JFz/cg210yPCDdP7xAzQPhtibvbpfSGstK9AlbQCoPe0sXS0v49hEVCL/h99hL428m9tBO/9ybefFp41hNCTIjwS8uEGDhR0dy1v7/a8ZixbckIvvJrm+BY0FLoZabrhRNHyKcHKnr6S5R8k83m9Hp++unpHLzlzRK4Kve1aWvrXsVreu2rvX03aKXVzpKkaavJDXQ1abeQV46TqbL0dQ1N9DUkmZmnCHqM41HHOAfqm/OfSS4K9QUz6i84iIkjPTGOf2D+8nwat/5Dv8AorzwlLqI8PxllC1r42qlofn899IsIf8EvSmxaRteT6WtFppluQF5yPm0H5ff4GW+Z9FRNX92p9/Tqd9zSLDHteYSAniPjaOrOBVJNenBsCSkb+ECP+P3O8mhOA355PmvXK+xFQG9UdVZuclGwu1FWoJPdy0Drcvdm9umtLDQhcfhBb1RfTnlOadBspjeo+OCnAYPvBgx+qug+qFaSF+EVYN6xnP1wEkFWlp++LWp8WFre0Fj0DuL/n6Bpnjw7SK47206egNWRk90XG/Don2Vs6T8vNHH1M59b7+U8Qm7CD/ByunG6sXvzNnHWWfcvykeYXlt9MTG7sG530/7m2uuFlxMrYDsd9PbtGZvUMz1npmGdh1sFsoXnUwTWI9iKfiQBd/t2N2CJ3TkBQNsVAKhoMpkPe40M8E5YoCEH5vQGfmL1womKR09WGi7PPrg0Ww9iYdkZ2RlwuuJtMcK7BBcPd0eHRbeWvGxLqAXqTpuelRfB0ybaRol6j5A1YOD7aIqKLv+cyWvA+jXRIN+IR2kxVXfYwMsK5FBsP9eu9rxyT8EF1wEWKFLu8fHLl9BdNE9SX8V1atZO69a2Rae/AqkIm3Q/WqMmGlOf6gEbtwUaPjhT5PVtLjaj4+Mb2sYmWofkGMekvJGec49yn4M576+9691P3cKFKYCFOpyXW+zQ432hn13YruyxGLJW4SftnAZi9gSosc+zc3/mKQ38O58cPrVzBK2+gC5uGYi3jtUUlPUwiB3He414ZJexpXEx0ybG5sFWfT2p3v0h5UmdzDJd5raIsZWDNWGLtFUPFrz/di73Drkl4PxquSd/fvrZZ8lGXN/CzTetITYrO97M7UHP010ByufOzPHYpntF73Xz6mKzJ4BDpzMwa9AAFfGC8hK8HdzdjWMteNXRFMACBfQo4pRhrmuuLiHGQS7OwNEm3nnrpJRAxg9haRk5nUd4rqtuIqKZvwlQvnr5B2uUXmrtq2WzUtE/4/MG9JI3MrBXiNP4+SaMrN1rFFFvsPC1xfjPUEa8HQkh9rGB9Paj1MH9rQ65PE6KOLC3iWNig/KfOSOIf67GfMXB/xbjSAusAv+Zivx/LyekzbMK/KXg2qreJCZVzg+31MwnxlW/AdlVth8r13oHPYLpKIB5W4vz80h43r/Ki+1Cd+ZPEWt0MjDa6fXRBZNgznu4PjDY4xZG61IHmLcUGnc/6sA2/98uWmrBVHSlfireILkspnAaLnllZAl0yOQBRbwNFWycUi36BPjPnrnroX1MokJHw0srermzqWv9SQZVLczV2s7TQEneUZ5Dql5P298gdeshJWLYxKPCkkJjGu9CcAzVhWM+MtgR0kixrIiMLHdQljK7YnBIZnzxIGkQC4Jhzs6hE41tz2Cgh/Lo+7NpxUJ2ijgZPv5e6b/95JiCeNKxKPEnoFBy6JYEhb1NPIvVS5gVLZzFXiHexaRzmaX/ciZ8f/ghfs6K04Vn9lfGr4zXLjxWnLNwwMzSf2XopPCKLdM8jwJjFru5w92zthddj52/PgJiWQHZJkReneNqucKR4OdKFmhZfzz8ZTp1+vM40vFwuUWQlzAud2JkrcqwymhjFIV/JQvyTJmAfZoJ+N8jMli6+a02nbZ7Oy9OjMvxEsgCzcvQNflhOnX6y8jjtpWHAqDxha6IOhen/EC4Jl3l3GUNHSfzEqSk81WCWsLtppJfvWrmXhZQW18D0xx9jJlqUfd4qETYpvvTGjZhQgafkY7vUHZbzg6fnD83/fwUmXuVspTJ2T2FyWx/XN5I63GlfZcnZbwABbhCdX+BCMQCRztfWViCQw9/PXj2dGGquds5NMjdMTw3BIe+XQgKHz2KIifGisKjY8Nj4hPt80dG3cvSssJj0zIL/foHivwzsiOJWbmuZS8G7IqSSZGx4qigIMJUf8Bqf6DHZNCww4C/h2e/370LcLb1uFDWjNsYJkShUiFYQa5XTjpYulI6hJZG+RykMR2lHn1G/U4FpdSmJxRdBX6lWNsa9NC6x7ObirfiPV5RkIjWrAJipbelUZLDuFT7jW430zx3aruBLP+dWNsq+uHFbfTKK0pIdV5CcgnBWvGmZowMl2aNkoelWBhXndFR1ROaeFVbxTsimlGyJ++R1dl1bBUN410Aq2cyj4Fgrmu8HNb/FBQ/6+U2lBQVPp7scCM/ncwvqS/PTLMx1zUxd44L8vR3jjM3NdWx+x/ZUHweXynDVll8vqGu8Cy+qrSEvaLoHKF2hGqkOhSmMkQ1GhlsNVAdHxpUHW03AMeeZr27emF+4UH27lV+DS7CscGKGiJCJQz29eFx0bnJMZJWx7VMAq8YXKAme2iDobSQOUis+FFx0aW3wWgO0UEYcqC8klL2moKzDfUF3Ozpp1v3V+2kexy5NREhQQ9kAgQgV0ofw5o6ReFmsSCgmx4UKCEGsqIq6pK28SC4wVlCKgHc+R6HjHwnh7Q8R6e0TAfHzMz/R0RV7oiJq6iK3lTVcFFVgYvp+i7ZLkXVReHZ4YXVHBxf5HPkoS7PwOXKcRc7RYG/knfv3BUrJFSl43JD3RycnHQ0mlJIwJpxX1dVSZL/2s4dMVXBS4XWZYHBcfn+DjcVjWWPZVwkOdUGE6MqQ5yLrmlIyN9RlhDyzEcMgX0Ilhl4M+GIsHgAlN3P9x6WyuamilfjCKYxdelayjMUwLyFGJzuJu7f7Azd/00mwJAhbe73yGi98ZCQDKdbc06kWRV7kLBOmvpCN67+ssKdiYb3eYVGr2+FWXvjgbbCpuhRX17+o54q1WJqr/CT3soyjK2lp66OOcFOw8bSU+eehStiCXerwfFiqIVPZw+9NYerF8HVNtjDhIKULL/oHJh51tpY/NDFQ1Y9rUcyfuzXrqbD6OMBXsyWwi8tV29iyJ05reyzGtnKR/C9emz+z7jmwVBZRVNJwzdQWUN5mq+koaJpVdXq8iy6yqyPuGeZl0zafNLtoDNDavVsevD9iqSi/0QqwislY/PVKvGcPNHOrWoRVqaAFlPHzQgeHU/j2wGzsc9NTgyZ92j6Owff3tA+2s01vBgVMGTKY54jycVZ/kHFWbEAz1AMxkd3qW0DLcUhD0YUhVTNH5H0YtWKR5o77rVdMbmcxxJzRcTZw0xbWMXicZp+3D2j+FFdc3snw7e8oLHMgYltldFbMUuqftSQXbjauLCk5+wa6OCY4HqvE0/61PbIq0lbQFtao1HfcXILdrzmsE2NTzMz/O++vx1b6H/bI0u5UOXIwbo3kuCqo+5oKoIW9sqoY40/cSYqOg2EFI/8pM01K/L++5oUE/suzH8pJt19ezQ8vNzf80ZfYuKbdGXr7ohI4w7+W0XvRR7GPw5TtsFGMh1ljFc2TS19Wp1Y1R8WkrPSBXKThptdmxZiMZHcSEhC/WAVfhwwcr7SgX+X40luZpeU04PtXvblyhQF/Vsipjjo8ahkBNuMvMzoEu2zdNNvX1KOr35j19ah76bT5CCXUPWWAnKE0fTiaUsooh6RfbKHelRxKnikgFYzB6HsX2YCM9SJNMSz/ssqC65lv/Nj4Uuu0I9mQUnmpKcdU7ILs0tj7zoyKjbVtwuWfCX+/94Sk+OeeUvayNj1EzzGdv7teY9ia8sHYh77OauEECO/xb50l7aRsh7yiJmnvfG/C9dZ/Dohrnh2tKNkLj62dEZufNYms+xIHPOJEGIm8Nu+p8/NrM2ozWX8xuIBPD5hBkHeJqaBPg2BAV2BAap6N+TkBfjlZa3lFAQEZRVBaGPeJTDa9FKrpVTDqUtFAkFYZ/8Es3NeFmJnz1y5JX8NWDfZHZVMQ1FpxC7v+5bDQJfB6aBkGo4ipXRGgI3lECSecFA2DkWl+lJs7ayfQ+JVByVjIiqHQqlwsZ6cv50bQmqFs+U44MppDNzcTU08Xcx4DVxdzc3c3AzhNC+SmMQXyc4XlQTMXu2zkGVMRpKQZChztf9XC2d/bUXwp8PQfa0Tld52Z9mL/U77/zx1HsPQEtwS1xLSQoc5xfXFKYaLvdSFx62CPIJ59CAkLC4MpFsS5LPlYWTu2FLT9tHnTzzqJLnygwU8/RycnM0XSAv1Ko2WUQhjE8Su9mzSeT5JKQc+HL7Q0N3ZbHdZEjBzlLlngRRjHMHL0cV8kbT46iml1KdRxEuEMJrPJpQ6HKgfYi0ferUX0wUKZdmNSQn59VCcXJ7XmJCUXY8UFGB74qPRra19CVHoNsCNDMfvAs3LzhHOtYW1fhg7f0xp0M7SWQZwjxBIXYwyO7JVVStzSjUsmRgQXJwSE1AVgrF9mM76elklVQVpdTVVlTrguZFrzMYI54dKhxF8Y1L8vItyoxKqKrOFflz46uUOuVPolSssPMdp696WUtcIvnMXKp40pVaZpg1GBBC/j6+vaLz42KnYn7Uv2klOxfL31Tv42mf5hISqKoiDwupi0rdVxYRF7oqF4k2b8OHmOv/1LY/vTvvDtz33k7HzTYwLDSgrDo/Lr0Cl7/5RIvvag6xIq8BC80t3JHU0NCUl7urIy6qow/BDX2R/8eCH/sKLD/7dvqB0/Tw9bdbyF/8BbA7/B8ACfv5RXi4s/FISFuuq3TPy/xld+aEw/7/MKFgNXAXhBB65quZ3mSNchXEMzjWjNmffEVy77YdFatbn0cri6o3s6doSBL/VEMh8d5R8AGqv7OXj7Ca4f4GMTaYvg+n0kAfMWAUnGXGbq5WubLETFC6/WIYgF1AL8uFFVasHdK2u0/W6QTfiIbHA5gvygmuF4A/RnOkT3Way54spBkO81cmv3dOk0ApZXJgOiMn5By5dK/gTcmD6RLyZLGPEyQCumQpztelDxEyeZUacZg8r6CL+WCHfqB23tFDzijCT7c2n2ArJAFtxcrcVQzi4EqKJ6RNUM9nAiJOvVkoJxLqiODYDRAJrtvBsknxFNpJyCU2M1VykPk3yDYNVohi3tQoHgVZp6OZCZDnjOkFDskq4nijcegh9PuvE5JKvQ50g+jd1bdeqZ1sdixjTOjCv6diLvkJ1nJdYR4410sawNoJ+zUjOShINpFgzFZyEmXM6HtqB8mpjAeduDMj/r/PZkuf+D7hl/haureDS0u+otzR8X3bZVuu5csq/2umBcedopEW8gHvF349HyjOhk4pHKvnj+bNyaIF8NLGTbM6MmQDumb/1qAmimZ+PBplWJmXh6LqSU9bIxFQDfVc/Ooi7qETTFD9xKpmamfyj8OaZZEJ1OAXGegvRs0KesdMf8OOk8lvar+fGgFrQByzkYE7awz8Q118VeWAeDX/e4QBmRp+xoE2+m7GMlofvvD/oaG9B4fka2H8Se6HrFqJLTH+wgH5KKNfdqN0JIDb2+w0mUSZMl/ar/dZgRnxZN8SfnmUeAnHhOHQfyB3h9xrb8lTF+40BiaA+G/tMsBstPAFki2qMQUS/5tcNCQScSy8XOQVfxRiEALnJ2ldCUowtWCR/bx1fBoCnf+puD8A7of3bP+v8X7X5l3kBy6EAAiwuW1oFsPzgUpZe2gHEfVPfVyJbQ+Pfi3eaa0BJkhD7gF+HchvzHPsXu7Bjn49F5zN8RXCq42hEmtMpgjdPSik1+KfGC9Rhhjki5BGFOh7P2jY+iolml5qNctvK6etiatjdxQ1O45ZT/UftEOE3bqvtRDIu1wZeAkdbRF7T2U5EBo1LadSY/qpN8LQwvoPx7dm69oGa7qbVQwQGv8Rx1KnFcVKDBsR6FEuP0M8z0krZRXo2dGVIpgrQZACxNubaIRKbn2lHsmgpZjlM0jyXZTtIjE+SYmfuBjMu9EnBAg0J7SSxU5jouEQW2Q64r7UQXTsi1rKzExqu1A+X6jlOatkw28nEF02OfXiKPKIS2pJjVzEZbbh3ISyxJ723GZchu0mFSaVLr173282DSdX1rOok5z8RfYdVfiCXH0hnhKAmyqsd8skpPf7wplGBVT7cT4/7Y57eJEJrEuNezyksAufPrcCIunfeVFXdJ2HqpdFkoZ1KqYlMukBm/Ja/KOWwUGBVA2qzUUANCRoyyqbbUiKXJc7FH9nO5zSHfEcye4+oFvHDWEbe54KHMapyEvmBaIey6DQ17eZMJ5Ccps8yPphAoIU0opigjziaqITS2h0IHAZOJg0ztFwK+wTcwrzSCwDrvIzxyBPmHfMMp0JDJH6JwCfgTFgBHAL+5BPz43dD42VNaMz8iDuhIZIjIvBGKEtHgB+QcNKFyZXG6iChNoVd1bfMfWhI0wE4A1wvQzAyX4bCzEmN3qWmgWUYfPyXYZ1S1F1muqjkufMQgMCRPQfeuAniJ9At5KbEXeAZLuxWVeHGxnWjrMG7WLQ1mFfOaLe47BD4atnWdUN2Z13y3lDgbc+HC6sgr7+IwIsjc7PHX98u5CYJ6wVv6hZ2bQUWvb15EHej0/q5rrPikXjbcGDnOhsJmr8hO7LRvBu4V/sNalTIU6RBh6Jrts38i4GTzfts3QMAAAA=", + "ok": true, + "headers": [ + [ + "content-type", + "application/octet-stream" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/index.js": { + "data": "Ly8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvYmFzZS5qcwp2YXIgTjtmdW5jdGlvbiB0YShhKXt2YXIgYz0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBjPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYysrXX06e2RvbmU6ITB9fX1mdW5jdGlvbiBNYShhKXtyZXR1cm57bmV4dDp0YShhKX19ZnVuY3Rpb24gY2IoYSl7dmFyIGM9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBjP2MuY2FsbChhKTpNYShhKX12YXIgZ2I9ZnVuY3Rpb24oYSl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdz09PWE/YToidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbCYmbnVsbCE9Z2xvYmFsP2dsb2JhbDphfSh0aGlzKSxpYj0iZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnRpZXM/T2JqZWN0LmRlZmluZVByb3BlcnR5OmZ1bmN0aW9uKGEsYyxkKXthIT1BcnJheS5wcm90b3R5cGUmJmEhPU9iamVjdC5wcm90b3R5cGUmJihhW2NdPWQudmFsdWUpfTsKZnVuY3Rpb24gcGIoYSxjKXtpZihjKXt2YXIgZD1nYjthPWEuc3BsaXQoIi4iKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoLTE7ZisrKXt2YXIgZz1hW2ZdO2cgaW4gZHx8KGRbZ109e30pO2Q9ZFtnXX1hPWFbYS5sZW5ndGgtMV07Zj1kW2FdO2M9YyhmKTtjIT1mJiZudWxsIT1jJiZpYihkLGEse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpjfSl9fQpwYigiUHJvbWlzZSIsZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhuKXt0aGlzLnN0YXRlXz0wO3RoaXMucmVzdWx0Xz12b2lkIDA7dGhpcy5vblNldHRsZWRDYWxsYmFja3NfPVtdO3ZhciBwPXRoaXMuY3JlYXRlUmVzb2x2ZUFuZFJlamVjdF8oKTt0cnl7bihwLnJlc29sdmUscC5yZWplY3QpfWNhdGNoKHEpe3AucmVqZWN0KHEpfX1mdW5jdGlvbiBkKCl7dGhpcy5iYXRjaF89bnVsbH1mdW5jdGlvbiBmKG4pe3N3aXRjaCh0eXBlb2Ygbil7Y2FzZSAib2JqZWN0IjpyZXR1cm4gbnVsbCE9bjtjYXNlICJmdW5jdGlvbiI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gZyhuKXtyZXR1cm4gbiBpbnN0YW5jZW9mIGM/bjpuZXcgYyhmdW5jdGlvbihwKXtwKG4pfSl9aWYoYSlyZXR1cm4gYTtkLnByb3RvdHlwZS5hc3luY0V4ZWN1dGU9ZnVuY3Rpb24obil7aWYobnVsbD09dGhpcy5iYXRjaF8pe3RoaXMuYmF0Y2hfPVtdO3ZhciBwPXRoaXM7dGhpcy5hc3luY0V4ZWN1dGVGdW5jdGlvbihmdW5jdGlvbigpe3AuZXhlY3V0ZUJhdGNoXygpfSl9dGhpcy5iYXRjaF8ucHVzaChuKX07CnZhciBsPWdiLnNldFRpbWVvdXQ7ZC5wcm90b3R5cGUuYXN5bmNFeGVjdXRlRnVuY3Rpb249ZnVuY3Rpb24obil7bChuLDApfTtkLnByb3RvdHlwZS5leGVjdXRlQmF0Y2hfPWZ1bmN0aW9uKCl7Zm9yKDt0aGlzLmJhdGNoXyYmdGhpcy5iYXRjaF8ubGVuZ3RoOyl7dmFyIG49dGhpcy5iYXRjaF87dGhpcy5iYXRjaF89W107Zm9yKHZhciBwPTA7cDxuLmxlbmd0aDsrK3Ape3ZhciBxPW5bcF07bltwXT1udWxsO3RyeXtxKCl9Y2F0Y2gocil7dGhpcy5hc3luY1Rocm93XyhyKX19fXRoaXMuYmF0Y2hfPW51bGx9O2QucHJvdG90eXBlLmFzeW5jVGhyb3dfPWZ1bmN0aW9uKG4pe3RoaXMuYXN5bmNFeGVjdXRlRnVuY3Rpb24oZnVuY3Rpb24oKXt0aHJvdyBuO30pfTtjLnByb3RvdHlwZS5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0Xz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4ocil7cmV0dXJuIGZ1bmN0aW9uKHQpe3F8fChxPSEwLHIuY2FsbChwLHQpKX19dmFyIHA9dGhpcyxxPSExO3JldHVybntyZXNvbHZlOm4odGhpcy5yZXNvbHZlVG9fKSwKcmVqZWN0Om4odGhpcy5yZWplY3RfKX19O2MucHJvdG90eXBlLnJlc29sdmVUb189ZnVuY3Rpb24obil7bj09PXRoaXM/dGhpcy5yZWplY3RfKG5ldyBUeXBlRXJyb3IoIkEgUHJvbWlzZSBjYW5ub3QgcmVzb2x2ZSB0byBpdHNlbGYiKSk6biBpbnN0YW5jZW9mIGM/dGhpcy5zZXR0bGVTYW1lQXNQcm9taXNlXyhuKTpmKG4pP3RoaXMucmVzb2x2ZVRvTm9uUHJvbWlzZU9ial8obik6dGhpcy5mdWxmaWxsXyhuKX07Yy5wcm90b3R5cGUucmVzb2x2ZVRvTm9uUHJvbWlzZU9ial89ZnVuY3Rpb24obil7dmFyIHA9dm9pZCAwO3RyeXtwPW4udGhlbn1jYXRjaChxKXt0aGlzLnJlamVjdF8ocSk7cmV0dXJufSJmdW5jdGlvbiI9PXR5cGVvZiBwP3RoaXMuc2V0dGxlU2FtZUFzVGhlbmFibGVfKHAsbik6dGhpcy5mdWxmaWxsXyhuKX07Yy5wcm90b3R5cGUucmVqZWN0Xz1mdW5jdGlvbihuKXt0aGlzLnNldHRsZV8oMixuKX07Yy5wcm90b3R5cGUuZnVsZmlsbF89ZnVuY3Rpb24obil7dGhpcy5zZXR0bGVfKDEsCm4pfTtjLnByb3RvdHlwZS5zZXR0bGVfPWZ1bmN0aW9uKG4scCl7aWYoMCE9dGhpcy5zdGF0ZV8pdGhyb3cgRXJyb3IoIkNhbm5vdCBzZXR0bGUoIituKyIsICIrcCsiKTogUHJvbWlzZSBhbHJlYWR5IHNldHRsZWQgaW4gc3RhdGUiK3RoaXMuc3RhdGVfKTt0aGlzLnN0YXRlXz1uO3RoaXMucmVzdWx0Xz1wO3RoaXMuZXhlY3V0ZU9uU2V0dGxlZENhbGxiYWNrc18oKX07Yy5wcm90b3R5cGUuZXhlY3V0ZU9uU2V0dGxlZENhbGxiYWNrc189ZnVuY3Rpb24oKXtpZihudWxsIT10aGlzLm9uU2V0dGxlZENhbGxiYWNrc18pe2Zvcih2YXIgbj0wO248dGhpcy5vblNldHRsZWRDYWxsYmFja3NfLmxlbmd0aDsrK24pay5hc3luY0V4ZWN1dGUodGhpcy5vblNldHRsZWRDYWxsYmFja3NfW25dKTt0aGlzLm9uU2V0dGxlZENhbGxiYWNrc189bnVsbH19O3ZhciBrPW5ldyBkO2MucHJvdG90eXBlLnNldHRsZVNhbWVBc1Byb21pc2VfPWZ1bmN0aW9uKG4pe3ZhciBwPXRoaXMuY3JlYXRlUmVzb2x2ZUFuZFJlamVjdF8oKTsKbi5jYWxsV2hlblNldHRsZWRfKHAucmVzb2x2ZSxwLnJlamVjdCl9O2MucHJvdG90eXBlLnNldHRsZVNhbWVBc1RoZW5hYmxlXz1mdW5jdGlvbihuLHApe3ZhciBxPXRoaXMuY3JlYXRlUmVzb2x2ZUFuZFJlamVjdF8oKTt0cnl7bi5jYWxsKHAscS5yZXNvbHZlLHEucmVqZWN0KX1jYXRjaChyKXtxLnJlamVjdChyKX19O2MucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24obixwKXtmdW5jdGlvbiBxKHkseil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHk/ZnVuY3Rpb24oeCl7dHJ5e3IoeSh4KSl9Y2F0Y2goQyl7dChDKX19Onp9dmFyIHIsdCx2PW5ldyBjKGZ1bmN0aW9uKHkseil7cj15O3Q9en0pO3RoaXMuY2FsbFdoZW5TZXR0bGVkXyhxKG4scikscShwLHQpKTtyZXR1cm4gdn07Yy5wcm90b3R5cGUuY2F0Y2g9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMudGhlbih2b2lkIDAsbil9O2MucHJvdG90eXBlLmNhbGxXaGVuU2V0dGxlZF89ZnVuY3Rpb24obixwKXtmdW5jdGlvbiBxKCl7c3dpdGNoKHIuc3RhdGVfKXtjYXNlIDE6bihyLnJlc3VsdF8pOwpicmVhaztjYXNlIDI6cChyLnJlc3VsdF8pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlVuZXhwZWN0ZWQgc3RhdGU6ICIrci5zdGF0ZV8pO319dmFyIHI9dGhpcztudWxsPT10aGlzLm9uU2V0dGxlZENhbGxiYWNrc18/ay5hc3luY0V4ZWN1dGUocSk6dGhpcy5vblNldHRsZWRDYWxsYmFja3NfLnB1c2gocSl9O2MucmVzb2x2ZT1nO2MucmVqZWN0PWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgYyhmdW5jdGlvbihwLHEpe3Eobil9KX07Yy5yYWNlPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgYyhmdW5jdGlvbihwLHEpe2Zvcih2YXIgcj1jYihuKSx0PXIubmV4dCgpOyF0LmRvbmU7dD1yLm5leHQoKSlnKHQudmFsdWUpLmNhbGxXaGVuU2V0dGxlZF8ocCxxKX0pfTtjLmFsbD1mdW5jdGlvbihuKXt2YXIgcD1jYihuKSxxPXAubmV4dCgpO3JldHVybiBxLmRvbmU/ZyhbXSk6bmV3IGMoZnVuY3Rpb24ocix0KXtmdW5jdGlvbiB2KHgpe3JldHVybiBmdW5jdGlvbihDKXt5W3hdPUM7ei0tOzA9PQp6JiZyKHkpfX12YXIgeT1bXSx6PTA7ZG8geS5wdXNoKHZvaWQgMCkseisrLGcocS52YWx1ZSkuY2FsbFdoZW5TZXR0bGVkXyh2KHkubGVuZ3RoLTEpLHQpLHE9cC5uZXh0KCk7d2hpbGUoIXEuZG9uZSl9KX07cmV0dXJuIGN9KTtwYigiUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseSIsZnVuY3Rpb24oYSl7cmV0dXJuIGE/YTpmdW5jdGlvbihjKXtyZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uKGQpe3JldHVybiBQcm9taXNlLnJlc29sdmUoYygpKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGR9KX0sZnVuY3Rpb24oZCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShjKCkpLnRoZW4oZnVuY3Rpb24oKXt0aHJvdyBkO30pfSl9fSk7CmZ1bmN0aW9uIHZiKGEpe2Z1bmN0aW9uIGMoZil7cmV0dXJuIGEubmV4dChmKX1mdW5jdGlvbiBkKGYpe3JldHVybiBhLnRocm93KGYpfXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihmLGcpe2Z1bmN0aW9uIGwoayl7ay5kb25lP2Yoay52YWx1ZSk6UHJvbWlzZS5yZXNvbHZlKGsudmFsdWUpLnRoZW4oYyxkKS50aGVuKGwsZyl9bChhLm5leHQoKSl9KX1mdW5jdGlvbiBCYihhKXtyZXR1cm4gdmIoYSgpKX1mdW5jdGlvbiBDYihhKXtyZXR1cm4gdm9pZCAwIT09YX1mdW5jdGlvbiBIYihhKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGF9CmZ1bmN0aW9uIExiKGEpe3ZhciBjPXR5cGVvZiBhO2lmKCJvYmplY3QiPT1jKWlmKGEpe2lmKGEgaW5zdGFuY2VvZiBBcnJheSlyZXR1cm4iYXJyYXkiO2lmKGEgaW5zdGFuY2VvZiBPYmplY3QpcmV0dXJuIGM7dmFyIGQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpO2lmKCJbb2JqZWN0IFdpbmRvd10iPT1kKXJldHVybiJvYmplY3QiO2lmKCJbb2JqZWN0IEFycmF5XSI9PWR8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09ZHx8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiOwplbHNlIGlmKCJmdW5jdGlvbiI9PWMmJiJ1bmRlZmluZWQiPT10eXBlb2YgYS5jYWxsKXJldHVybiJvYmplY3QiO3JldHVybiBjfWZ1bmN0aW9uIE1iKGEpe3JldHVybiBudWxsPT09YX1mdW5jdGlvbiBRYihhKXtyZXR1cm4iYXJyYXkiPT1MYihhKX1mdW5jdGlvbiBUYihhLGMpe2Z1bmN0aW9uIGQoKXt9ZC5wcm90b3R5cGU9Yy5wcm90b3R5cGU7YS5zdXBlckNsYXNzXz1jLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgZDthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EuYmFzZT1mdW5jdGlvbihmLGcsbCl7Zm9yKHZhciBrPUFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMiksbj0yO248YXJndW1lbnRzLmxlbmd0aDtuKyspa1tuLTJdPWFyZ3VtZW50c1tuXTtyZXR1cm4gYy5wcm90b3R5cGVbZ10uYXBwbHkoZixrKX19OwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy90cmFuc2l0aW9uYWxmb3J3YXJkZGVjbGFyYXRpb25zLmpzCi8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2RlYnVnL2Vycm9yLmpzCmZ1bmN0aW9uIFZiKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsVmIpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7dGhpcy5yZXBvcnRFcnJvclRvU2VydmVyPSEwfVRiKFZiLEVycm9yKTtWYi5wcm90b3R5cGUubmFtZT0iQ3VzdG9tRXJyb3IiOwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9kb20vbm9kZXR5cGUuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvYXNzZXJ0cy9hc3NlcnRzLmpzCmZ1bmN0aW9uIFhiKGEsYyl7VmIuY2FsbCh0aGlzLFpiKGEsYykpO3RoaXMubWVzc2FnZVBhdHRlcm49YX1UYihYYixWYik7WGIucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiBhYyhhKXt0aHJvdyBhO31mdW5jdGlvbiBaYihhLGMpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGQ9IiIsZj1hLmxlbmd0aC0xLGc9MDtnPGY7ZysrKWQrPWFbZ10rKGc8Yy5sZW5ndGg/Y1tnXToiJXMiKTtyZXR1cm4gZCthW2ZdfWZ1bmN0aW9uIGRjKGEsYyl7YWMobmV3IFhiKCJGYWlsdXJlIisoYT8iOiAiK2E6IiIpLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSkpfTsKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvYXJyYXkvYXJyYXkuanMKdmFyIGdjPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYyl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGMsdm9pZCAwKX06ZnVuY3Rpb24oYSxjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZj1IYihhKT9hLnNwbGl0KCIiKTphLGc9MDtnPGQ7ZysrKWcgaW4gZiYmYy5jYWxsKHZvaWQgMCxmW2ddLGcsYSl9LGhjPUFycmF5LnByb3RvdHlwZS5tYXA/ZnVuY3Rpb24oYSxjKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKGEsYyx2b2lkIDApfTpmdW5jdGlvbihhLGMpe2Zvcih2YXIgZD1hLmxlbmd0aCxmPUFycmF5KGQpLGc9SGIoYSk/YS5zcGxpdCgiIik6YSxsPTA7bDxkO2wrKylsIGluIGcmJihmW2xdPWMuY2FsbCh2b2lkIDAsZ1tsXSxsLGEpKTtyZXR1cm4gZn07CmZ1bmN0aW9uIGtjKGEsYyxkKXtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGMpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYyxkKX07Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2NyeXB0L2NyeXB0LmpzCmZ1bmN0aW9uIGxjKGEpe2lmKDgxOTI+PWEubGVuZ3RoKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsYSk7Zm9yKHZhciBjPSIiLGQ9MDtkPGEubGVuZ3RoO2QrPTgxOTIpYys9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGtjKGEsZCxkKzgxOTIpKTtyZXR1cm4gY307Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2RvbS9hc3NlcnRzLmpzCi8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2Z1bmN0aW9ucy9mdW5jdGlvbnMuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvZG9tL2h0bWxlbGVtZW50LmpzCi8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2RvbS90YWduYW1lLmpzCi8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL29iamVjdC9vYmplY3QuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvZG9tL3RhZ3MuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvaHRtbC90cnVzdGVkdHlwZXMuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvc3RyaW5nL3R5cGVkc3RyaW5nLmpzCi8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL3N0cmluZy9jb25zdC5qcwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9odG1sL3NhZmVzY3JpcHQuanMKZnVuY3Rpb24gcWMoKXt0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVTY3JpcHRXcmFwcGVkVmFsdWVfPSIiO3RoaXMuU0FGRV9TQ1JJUFRfVFlQRV9NQVJLRVJfR09PR19IVE1MX1NFQ1VSSVRZX1BSSVZBVEVfPXJjfXFjLnByb3RvdHlwZS5pbXBsZW1lbnRzR29vZ1N0cmluZ1R5cGVkU3RyaW5nPSEwO3ZhciByYz17fTtxYy5wcm90b3R5cGUuZ2V0VHlwZWRTdHJpbmdWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVTY3JpcHRXcmFwcGVkVmFsdWVfLnRvU3RyaW5nKCl9O3FjLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJTYWZlU2NyaXB0eyIrdGhpcy5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VTYWZlU2NyaXB0V3JhcHBlZFZhbHVlXysifSJ9OwpxYy5wcm90b3R5cGUuaW5pdFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlXz1mdW5jdGlvbihhKXt0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVTY3JpcHRXcmFwcGVkVmFsdWVfPWE7cmV0dXJuIHRoaXN9OyhmdW5jdGlvbihhKXtyZXR1cm4obmV3IHFjKS5pbml0U2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VfKGEpfSkoIiIpOwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9mcy91cmwuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvaTE4bi9iaWRpLmpzCi8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2h0bWwvdHJ1c3RlZHJlc291cmNldXJsLmpzCi8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL3N0cmluZy9pbnRlcm5hbC5qcwpmdW5jdGlvbiBzYyhhKXtyZXR1cm4vXltcc1x4YTBdKiQvLnRlc3QoYSl9ZnVuY3Rpb24gdGMoYSl7cmV0dXJuLTEhPSJceDNkLiIuaW5kZXhPZihhKX07Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2h0bWwvc2FmZXVybC5qcwpmdW5jdGlvbiB3Yygpe3RoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVVybFdyYXBwZWRWYWx1ZV89IiI7dGhpcy5TQUZFX1VSTF9UWVBFX01BUktFUl9HT09HX0hUTUxfU0VDVVJJVFlfUFJJVkFURV89RGN9Tj13Yy5wcm90b3R5cGU7Ti5pbXBsZW1lbnRzR29vZ1N0cmluZ1R5cGVkU3RyaW5nPSEwO04uZ2V0VHlwZWRTdHJpbmdWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVVcmxXcmFwcGVkVmFsdWVfLnRvU3RyaW5nKCl9O04uaW1wbGVtZW50c0dvb2dJMThuQmlkaURpcmVjdGlvbmFsU3RyaW5nPSEwO04uZ2V0RGlyZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIDF9O04udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iU2FmZVVybHsiK3RoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVVybFdyYXBwZWRWYWx1ZV8rIn0ifTt2YXIgRGM9e307CihmdW5jdGlvbihhKXt2YXIgYz1uZXcgd2M7Yy5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VTYWZlVXJsV3JhcHBlZFZhbHVlXz1hO3JldHVybiBjfSkoImFib3V0OmJsYW5rIik7Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2h0bWwvc2FmZXN0eWxlLmpzCmZ1bmN0aW9uIE5jKCl7dGhpcy5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VTYWZlU3R5bGVXcmFwcGVkVmFsdWVfPSIiO3RoaXMuU0FGRV9TVFlMRV9UWVBFX01BUktFUl9HT09HX0hUTUxfU0VDVVJJVFlfUFJJVkFURV89T2N9TmMucHJvdG90eXBlLmltcGxlbWVudHNHb29nU3RyaW5nVHlwZWRTdHJpbmc9ITA7dmFyIE9jPXt9O05jLnByb3RvdHlwZS5nZXRUeXBlZFN0cmluZ1ZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVN0eWxlV3JhcHBlZFZhbHVlX307TmMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlNhZmVTdHlsZXsiK3RoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVN0eWxlV3JhcHBlZFZhbHVlXysifSJ9OwpOYy5wcm90b3R5cGUuaW5pdFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlXz1mdW5jdGlvbihhKXt0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVTdHlsZVdyYXBwZWRWYWx1ZV89YTtyZXR1cm4gdGhpc307KGZ1bmN0aW9uKGEpe3JldHVybihuZXcgTmMpLmluaXRTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZV8oYSl9KSgiIik7Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2h0bWwvc2FmZXN0eWxlc2hlZXQuanMKZnVuY3Rpb24gUGMoKXt0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVTdHlsZVNoZWV0V3JhcHBlZFZhbHVlXz0iIjt0aGlzLlNBRkVfU1RZTEVfU0hFRVRfVFlQRV9NQVJLRVJfR09PR19IVE1MX1NFQ1VSSVRZX1BSSVZBVEVfPVRjfVBjLnByb3RvdHlwZS5pbXBsZW1lbnRzR29vZ1N0cmluZ1R5cGVkU3RyaW5nPSEwO3ZhciBUYz17fTtQYy5wcm90b3R5cGUuZ2V0VHlwZWRTdHJpbmdWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVTdHlsZVNoZWV0V3JhcHBlZFZhbHVlX307UGMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlNhZmVTdHlsZVNoZWV0eyIrdGhpcy5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VTYWZlU3R5bGVTaGVldFdyYXBwZWRWYWx1ZV8rIn0ifTsKUGMucHJvdG90eXBlLmluaXRTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZV89ZnVuY3Rpb24oYSl7dGhpcy5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VTYWZlU3R5bGVTaGVldFdyYXBwZWRWYWx1ZV89YTtyZXR1cm4gdGhpc307KGZ1bmN0aW9uKGEpe3JldHVybihuZXcgUGMpLmluaXRTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZV8oYSl9KSgiIik7Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2xhYnMvdXNlcmFnZW50L3V0aWwuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvbGFicy91c2VyYWdlbnQvYnJvd3Nlci5qcwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9odG1sL3NhZmVodG1sLmpzCmZ1bmN0aW9uIFVjKCl7dGhpcy5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VTYWZlSHRtbFdyYXBwZWRWYWx1ZV89IiI7dGhpcy5TQUZFX0hUTUxfVFlQRV9NQVJLRVJfR09PR19IVE1MX1NFQ1VSSVRZX1BSSVZBVEVfPVZjO3RoaXMuZGlyXz1udWxsfU49VWMucHJvdG90eXBlO04uaW1wbGVtZW50c0dvb2dJMThuQmlkaURpcmVjdGlvbmFsU3RyaW5nPSEwO04uZ2V0RGlyZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlyX307Ti5pbXBsZW1lbnRzR29vZ1N0cmluZ1R5cGVkU3RyaW5nPSEwO04uZ2V0VHlwZWRTdHJpbmdWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVIdG1sV3JhcHBlZFZhbHVlXy50b1N0cmluZygpfTtOLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlNhZmVIdG1seyIrdGhpcy5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VTYWZlSHRtbFdyYXBwZWRWYWx1ZV8rIn0ifTt2YXIgVmM9e307CmZ1bmN0aW9uIFdjKGEpeyhuZXcgVWMpLmluaXRTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZV8oYSwwKX1VYy5wcm90b3R5cGUuaW5pdFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlXz1mdW5jdGlvbihhLGMpe3RoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZUh0bWxXcmFwcGVkVmFsdWVfPWE7dGhpcy5kaXJfPWM7cmV0dXJuIHRoaXN9O1djKCJceDNjIURPQ1RZUEUgaHRtbFx4M2UiKTtXYygiIik7V2MoIlx4M2Niclx4M2UiKTsKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvaHRtbC91bmNoZWNrZWRjb252ZXJzaW9ucy5qcwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9kb20vc2FmZS5qcwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9zdHJpbmcvc3RyaW5nLmpzCi8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2xhYnMvdXNlcmFnZW50L2VuZ2luZS5qcwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9sYWJzL3VzZXJhZ2VudC9wbGF0Zm9ybS5qcwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9yZWZsZWN0L3JlZmxlY3QuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvdXNlcmFnZW50L3VzZXJhZ2VudC5qcwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy91c2VyYWdlbnQvcHJvZHVjdC5qcwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9jcnlwdC9iYXNlNjQuanMKZnVuY3Rpb24gWGMoYSl7cmV0dXJuIHRjKGEpfXZhciBZYz17fSxuZD1udWxsO2Z1bmN0aW9uIG9kKGEsYyl7ITE9PT1jfHx2b2lkIDA9PT1jP2M9MDohMD09PWMmJihjPTMpO3BkKCk7Yz1ZY1tjXTtmb3IodmFyIGQ9W10sZj0wO2Y8YS5sZW5ndGg7Zis9Myl7dmFyIGc9YVtmXSxsPWYrMTxhLmxlbmd0aCxrPWw/YVtmKzFdOjAsbj1mKzI8YS5sZW5ndGgscD1uP2FbZisyXTowLHE9Zz4+MjtnPShnJjMpPDw0fGs+PjQ7az0oayYxNSk8PDJ8cD4+NjtwJj02MztufHwocD02NCxsfHwoaz02NCkpO2QucHVzaChjW3FdLGNbZ10sY1trXXx8IiIsY1twXXx8IiIpfXJldHVybiBkLmpvaW4oIiIpfQpmdW5jdGlvbiBxZChhKXt2YXIgYz1hLmxlbmd0aCxkPTMqYy80O2QlMz9kPU1hdGguZmxvb3IoZCk6WGMoYVtjLTFdKSYmKGQ9WGMoYVtjLTJdKT9kLTI6ZC0xKTt2YXIgZj1uZXcgVWludDhBcnJheShkKSxnPTA7cmQoYSxmdW5jdGlvbihsKXtmW2crK109bH0pO3JldHVybiBmLnN1YmFycmF5KDAsZyl9ZnVuY3Rpb24gcmQoYSxjKXtmdW5jdGlvbiBkKHApe2Zvcig7ZjxhLmxlbmd0aDspe3ZhciBxPWEuY2hhckF0KGYrKykscj1uZFtxXTtpZihudWxsIT1yKXJldHVybiByO2lmKCFzYyhxKSl0aHJvdyBFcnJvcigiVW5rbm93biBiYXNlNjQgZW5jb2RpbmcgYXQgY2hhcjogIitxKTt9cmV0dXJuIHB9cGQoKTtmb3IodmFyIGY9MDs7KXt2YXIgZz1kKC0xKSxsPWQoMCksaz1kKDY0KSxuPWQoNjQpO2lmKDY0PT09biYmLTE9PT1nKWJyZWFrO2MoZzw8MnxsPj40KTs2NCE9ayYmKGMobDw8NCYyNDB8az4+MiksNjQhPW4mJmMoazw8NiYxOTJ8bikpfX0KZnVuY3Rpb24gcGQoKXtpZighbmQpe25kPXt9O2Zvcih2YXIgYT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiLnNwbGl0KCIiKSxjPVsiKy9ceDNkIiwiKy8iLCItX1x4M2QiLCItXy4iLCItXyJdLGQ9MDs1PmQ7ZCsrKXt2YXIgZj1hLmNvbmNhdChjW2RdLnNwbGl0KCIiKSk7WWNbZF09Zjtmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl7dmFyIGw9ZltnXTt2b2lkIDA9PT1uZFtsXSYmKG5kW2xdPWcpfX19fTsKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9wcm90b2J1Zl9qcy9iaW5hcnkvYXJpdGguanMKZnVuY3Rpb24gc2QoYSxjKXt0aGlzLmxvPWE7dGhpcy5oaT1jfU49c2QucHJvdG90eXBlO04uY21wPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmhpPGEuaGl8fHRoaXMuaGk9PWEuaGkmJnRoaXMubG88YS5sbz8tMTp0aGlzLmhpPT1hLmhpJiZ0aGlzLmxvPT1hLmxvPzA6MX07Ti5yaWdodFNoaWZ0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBzZCgodGhpcy5sbz4+PjF8KHRoaXMuaGkmMSk8PDMxKT4+PjAsdGhpcy5oaT4+PjE+Pj4wKX07Ti5sZWZ0U2hpZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHNkKHRoaXMubG88PDE+Pj4wLCh0aGlzLmhpPDwxfHRoaXMubG8+Pj4zMSk+Pj4wKX07Ti5tc2I9ZnVuY3Rpb24oKXtyZXR1cm4hISh0aGlzLmhpJjIxNDc0ODM2NDgpfTtOLmxzYj1mdW5jdGlvbigpe3JldHVybiEhKHRoaXMubG8mMSl9O04uemVybz1mdW5jdGlvbigpe3JldHVybiAwPT10aGlzLmxvJiYwPT10aGlzLmhpfTsKTi5hZGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBzZCgodGhpcy5sbythLmxvJjQyOTQ5NjcyOTUpPj4+MD4+PjAsKCh0aGlzLmhpK2EuaGkmNDI5NDk2NzI5NSk+Pj4wKSsoNDI5NDk2NzI5Njw9dGhpcy5sbythLmxvPzE6MCk+Pj4wKX07Ti5zdWI9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBzZCgodGhpcy5sby1hLmxvJjQyOTQ5NjcyOTUpPj4+MD4+PjAsKCh0aGlzLmhpLWEuaGkmNDI5NDk2NzI5NSk+Pj4wKS0oMD50aGlzLmxvLWEubG8/MTowKT4+PjApfTtmdW5jdGlvbiBJZChhKXt2YXIgYz1hJjY1NTM1LGQ9YT4+PjE2O2E9MTAqYys2NTUzNiooMCpjJjY1NTM1KSs2NTUzNiooMTAqZCY2NTUzNSk7Zm9yKGM9MCpkKygwKmM+Pj4xNikrKDEwKmQ+Pj4xNik7NDI5NDk2NzI5Njw9YTspYS09NDI5NDk2NzI5NixjKz0xO3JldHVybiBuZXcgc2QoYT4+PjAsYz4+PjApfQpOLm11bD1mdW5jdGlvbigpe3ZhciBhPUlkKHRoaXMubG8pLGM9SWQodGhpcy5oaSk7Yy5oaT1jLmxvO2MubG89MDtyZXR1cm4gYS5hZGQoYyl9O04uZGl2PWZ1bmN0aW9uKCl7Zm9yKHZhciBhPW5ldyBzZCgwLDApLGM9bmV3IHNkKHRoaXMubG8sdGhpcy5oaSksZD1uZXcgc2QoMTAsMCksZj1uZXcgc2QoMSwwKTshZC5tc2IoKTspZD1kLmxlZnRTaGlmdCgpLGY9Zi5sZWZ0U2hpZnQoKTtmb3IoOyFmLnplcm8oKTspMD49ZC5jbXAoYykmJihhPWEuYWRkKGYpLGM9Yy5zdWIoZCkpLGQ9ZC5yaWdodFNoaWZ0KCksZj1mLnJpZ2h0U2hpZnQoKTtyZXR1cm5bYSxjXX07Ti50b1N0cmluZz1mdW5jdGlvbigpe2Zvcih2YXIgYT0iIixjPXRoaXM7IWMuemVybygpOyl7Yz1jLmRpdigpO3ZhciBkPWNbMF07YT1jWzFdLmxvK2E7Yz1kfSIiPT1hJiYoYT0iMCIpO3JldHVybiBhfTsKZnVuY3Rpb24gSmQoYSl7Zm9yKHZhciBjPW5ldyBzZCgwLDApLGQ9bmV3IHNkKDAsMCksZj0wO2Y8YS5sZW5ndGg7ZisrKXtpZigiMCI+YVtmXXx8IjkiPGFbZl0pcmV0dXJuIG51bGw7ZC5sbz1wYXJzZUludChhW2ZdLDEwKTtjPWMubXVsKCkuYWRkKGQpfXJldHVybiBjfU4uY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHNkKHRoaXMubG8sdGhpcy5oaSl9O2Z1bmN0aW9uIEtkKGEsYyl7dGhpcy5sbz1hO3RoaXMuaGk9Y31LZC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgS2QoKHRoaXMubG8rYS5sbyY0Mjk0OTY3Mjk1KT4+PjA+Pj4wLCgodGhpcy5oaSthLmhpJjQyOTQ5NjcyOTUpPj4+MCkrKDQyOTQ5NjcyOTY8PXRoaXMubG8rYS5sbz8xOjApPj4+MCl9OwpLZC5wcm90b3R5cGUuc3ViPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgS2QoKHRoaXMubG8tYS5sbyY0Mjk0OTY3Mjk1KT4+PjA+Pj4wLCgodGhpcy5oaS1hLmhpJjQyOTQ5NjcyOTUpPj4+MCktKDA+dGhpcy5sby1hLmxvPzE6MCk+Pj4wKX07S2QucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBLZCh0aGlzLmxvLHRoaXMuaGkpfTtLZC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgYT0wIT0odGhpcy5oaSYyMTQ3NDgzNjQ4KSxjPW5ldyBzZCh0aGlzLmxvLHRoaXMuaGkpO2EmJihjPShuZXcgc2QoMCwwKSkuc3ViKGMpKTtyZXR1cm4oYT8iLSI6IiIpK2MudG9TdHJpbmcoKX07ZnVuY3Rpb24gWmQoYSl7dmFyIGM9MDxhLmxlbmd0aCYmIi0iPT1hWzBdO2MmJihhPWEuc3Vic3RyaW5nKDEpKTthPUpkKGEpO2lmKG51bGw9PT1hKXJldHVybiBudWxsO2MmJihhPShuZXcgc2QoMCwwKSkuc3ViKGEpKTtyZXR1cm4gbmV3IEtkKGEubG8sYS5oaSl9OwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX3Byb3RvYnVmX2pzL2JpbmFyeS9jb25zdGFudHMuanMKZnVuY3Rpb24gJGQoYSl7c3dpdGNoKGEpe2Nhc2UgNTpjYXNlIDM6Y2FzZSAxMzpjYXNlIDQ6Y2FzZSAxNzpjYXNlIDE4OmNhc2UgODpjYXNlIDE0OmNhc2UgMzE6cmV0dXJuIDA7Y2FzZSAxOmNhc2UgNjpjYXNlIDE2OmNhc2UgMzA6cmV0dXJuIDE7Y2FzZSA5OmNhc2UgMTE6Y2FzZSAxMjpyZXR1cm4gMjtjYXNlIDI6Y2FzZSA3OmNhc2UgMTU6cmV0dXJuIDU7ZGVmYXVsdDpyZXR1cm4tMX19OwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX3Byb3RvYnVmX2pzL2JpbmFyeS91dGlscy5qcwp2YXIgYWU9MCxiZT0wO2Z1bmN0aW9uIGNlKGEpe3ZhciBjPWE+Pj4wO2E9TWF0aC5mbG9vcigoYS1jKS80Mjk0OTY3Mjk2KT4+PjA7YWU9YztiZT1hfWZ1bmN0aW9uIGRlKGEpe3ZhciBjPTA+YTthPU1hdGguYWJzKGEpO3ZhciBkPWE+Pj4wO2E9TWF0aC5mbG9vcigoYS1kKS80Mjk0OTY3Mjk2KTthPj4+PTA7YyYmKGE9fmE+Pj4wLGQ9KH5kPj4+MCkrMSw0Mjk0OTY3Mjk1PGQmJihkPTAsYSsrLDQyOTQ5NjcyOTU8YSYmKGE9MCkpKTthZT1kO2JlPWF9ZnVuY3Rpb24gZWUoYSl7dmFyIGM9MD5hO2E9MipNYXRoLmFicyhhKTtjZShhKTthPWFlO3ZhciBkPWJlO2MmJigwPT1hPzA9PWQ/ZD1hPTQyOTQ5NjcyOTU6KGQtLSxhPTQyOTQ5NjcyOTUpOmEtLSk7YWU9YTtiZT1kfQpmdW5jdGlvbiBmZShhKXt2YXIgYz0wPmE/MTowO2E9Yz8tYTphO2lmKDA9PT1hKTA8MS9hP2FlPWJlPTA6KGJlPTAsYWU9MjE0NzQ4MzY0OCk7ZWxzZSBpZihpc05hTihhKSliZT0wLGFlPTIxNDc0ODM2NDc7ZWxzZSBpZigzLjQwMjgyMzQ2NjM4NTI4ODZFMzg8YSliZT0wLGFlPShjPDwzMXwyMTM5MDk1MDQwKT4+PjA7ZWxzZSBpZigxLjE3NTQ5NDM1MDgyMjI4NzVFLTM4PmEpYT1NYXRoLnJvdW5kKGEvTWF0aC5wb3coMiwtMTQ5KSksYmU9MCxhZT0oYzw8MzF8YSk+Pj4wO2Vsc2V7dmFyIGQ9TWF0aC5mbG9vcihNYXRoLmxvZyhhKS9NYXRoLkxOMik7YSo9TWF0aC5wb3coMiwtZCk7YT1NYXRoLnJvdW5kKDgzODg2MDgqYSkmODM4ODYwNztiZT0wO2FlPShjPDwzMXxkKzEyNzw8MjN8YSk+Pj4wfX0KZnVuY3Rpb24gZ2UoYSl7dmFyIGM9MD5hPzE6MDthPWM/LWE6YTtpZigwPT09YSliZT0wPDEvYT8wOjIxNDc0ODM2NDgsYWU9MDtlbHNlIGlmKGlzTmFOKGEpKWJlPTIxNDc0ODM2NDcsYWU9NDI5NDk2NzI5NTtlbHNlIGlmKDEuNzk3NjkzMTM0ODYyMzE1N0UzMDg8YSliZT0oYzw8MzF8MjE0NjQzNTA3Mik+Pj4wLGFlPTA7ZWxzZSBpZigyLjIyNTA3Mzg1ODUwNzIwMTRFLTMwOD5hKWEvPU1hdGgucG93KDIsLTEwNzQpLGJlPShjPDwzMXxhLzQyOTQ5NjcyOTYpPj4+MCxhZT1hPj4+MDtlbHNle3ZhciBkPU1hdGguZmxvb3IoTWF0aC5sb2coYSkvTWF0aC5MTjIpOzEwMjQ9PWQmJihkPTEwMjMpO2EqPU1hdGgucG93KDIsLWQpO2JlPShjPDwzMXxkKzEwMjM8PDIwfDEwNDg1NzYqYSYxMDQ4NTc1KT4+PjA7YWU9NDUwMzU5OTYyNzM3MDQ5NiphPj4+MH19CmZ1bmN0aW9uIGhlKGEpe3ZhciBjPWEuY2hhckNvZGVBdCg0KSxkPWEuY2hhckNvZGVBdCg1KSxmPWEuY2hhckNvZGVBdCg2KSxnPWEuY2hhckNvZGVBdCg3KTthZT1hLmNoYXJDb2RlQXQoMCkrKGEuY2hhckNvZGVBdCgxKTw8OCkrKGEuY2hhckNvZGVBdCgyKTw8MTYpKyhhLmNoYXJDb2RlQXQoMyk8PDI0KT4+PjA7YmU9YysoZDw8OCkrKGY8PDE2KSsoZzw8MjQpPj4+MH1mdW5jdGlvbiBBZShhLGMpe3JldHVybiA0Mjk0OTY3Mjk2KmMrYX1mdW5jdGlvbiBCZShhLGMpe3ZhciBkPWMmMjE0NzQ4MzY0ODtkJiYoYT1+YSsxPj4+MCxjPX5jPj4+MCwwPT1hJiYoYz1jKzE+Pj4wKSk7YT1BZShhLGMpO3JldHVybiBkPy1hOmF9ZnVuY3Rpb24gQ2UoYSxjKXt2YXIgZD1hJjE7YT0oYT4+PjF8Yzw8MzEpPj4+MDtjPj4+PTE7ZCYmKGE9YSsxPj4+MCwwPT1hJiYoYz1jKzE+Pj4wKSk7YT1BZShhLGMpO3JldHVybiBkPy1hOmF9CmZ1bmN0aW9uIERlKGEpe3ZhciBjPTIqKGE+PjMxKSsxLGQ9YT4+PjIzJjI1NTthJj04Mzg4NjA3O3JldHVybiAyNTU9PWQ/YT9OYU46SW5maW5pdHkqYzowPT1kP2MqTWF0aC5wb3coMiwtMTQ5KSphOmMqTWF0aC5wb3coMixkLTE1MCkqKGErTWF0aC5wb3coMiwyMykpfWZ1bmN0aW9uIEVlKGEsYyl7dmFyIGQ9MiooYz4+MzEpKzEsZj1jPj4+MjAmMjA0NzthPTQyOTQ5NjcyOTYqKGMmMTA0ODU3NSkrYTtyZXR1cm4gMjA0Nz09Zj9hP05hTjpJbmZpbml0eSpkOjA9PWY/ZCpNYXRoLnBvdygyLC0xMDc0KSphOmQqTWF0aC5wb3coMixmLTEwNzUpKihhKzQ1MDM1OTk2MjczNzA0OTYpfWZ1bmN0aW9uIEZlKGEsYyl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYT4+PjAmMjU1LGE+Pj44JjI1NSxhPj4+MTYmMjU1LGE+Pj4yNCYyNTUsYz4+PjAmMjU1LGM+Pj44JjI1NSxjPj4+MTYmMjU1LGM+Pj4yNCYyNTUpfXZhciBHZT0iMDEyMzQ1Njc4OWFiY2RlZiIuc3BsaXQoIiIpOwpmdW5jdGlvbiBIZShhLGMpe2Z1bmN0aW9uIGQobil7Zm9yKHZhciBwPTFFNyxxPTA7Nz5xO3ErKyl7cC89MTA7dmFyIHI9bi9wJTEwPj4+MDtpZigwIT1yfHxsKWw9ITAsays9Z1tyXX19aWYoMjA5NzE1MT49YylyZXR1cm4iIisoNDI5NDk2NzI5NipjK2EpO3ZhciBmPShhPj4+MjR8Yzw8OCk+Pj4wJjE2Nzc3MjE1O2M9Yz4+MTYmNjU1MzU7YT0oYSYxNjc3NzIxNSkrNjc3NzIxNipmKzY3MTA2NTYqYztmKz04MTQ3NDk3KmM7Yyo9MjsxRTc8PWEmJihmKz1NYXRoLmZsb29yKGEvMUU3KSxhJT0xRTcpOzFFNzw9ZiYmKGMrPU1hdGguZmxvb3IoZi8xRTcpLGYlPTFFNyk7dmFyIGc9R2UsbD0hMSxrPSIiOyhjfHxsKSYmZChjKTsoZnx8bCkmJmQoZik7KGF8fGwpJiZkKGEpO3JldHVybiBrfWZ1bmN0aW9uIG1mKGEsYyl7dmFyIGQ9YyYyMTQ3NDgzNjQ4O2QmJihhPX5hKzE+Pj4wLGM9fmMrKDA9PWE/MTowKT4+PjApO2E9SGUoYSxjKTtyZXR1cm4gZD8iLSIrYTphfQpmdW5jdGlvbiBuZihhKXtmdW5jdGlvbiBjKGssbil7Zm9yKHZhciBwPTA7OD5wJiYoMSE9PWt8fDA8bik7cCsrKW49aypnW3BdK24sZ1twXT1uJjI1NSxuPj4+PTh9ZnVuY3Rpb24gZCgpe2Zvcih2YXIgaz0wOzg+aztrKyspZ1trXT1+Z1trXSYyNTV9dmFyIGY9ITE7Ii0iPT09YVswXSYmKGY9ITAsYT1hLnNsaWNlKDEpKTtmb3IodmFyIGc9WzAsMCwwLDAsMCwwLDAsMF0sbD0wO2w8YS5sZW5ndGg7bCsrKWMoMTAsR2UuaW5kZXhPZihhW2xdKSk7ZiYmKGQoKSxjKDEsMSkpO3JldHVybiBsYyhnKX0KZnVuY3Rpb24gb2YoYSl7aWYoYS5jb25zdHJ1Y3Rvcj09PVVpbnQ4QXJyYXkpcmV0dXJuIGE7aWYoYS5jb25zdHJ1Y3Rvcj09PUFycmF5QnVmZmVyKXJldHVybiBuZXcgVWludDhBcnJheShhKTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEJ1ZmZlciYmYS5jb25zdHJ1Y3Rvcj09PUJ1ZmZlcilyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYSk7aWYoYS5jb25zdHJ1Y3Rvcj09PUFycmF5KXJldHVybiBuZXcgVWludDhBcnJheShhKTtpZihhLmNvbnN0cnVjdG9yPT09U3RyaW5nKXJldHVybiBxZChhKTtkYygiVHlwZSBub3QgY29udmVydGlibGUgdG8gVWludDhBcnJheS4iKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCl9OwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX3Byb3RvYnVmX2pzL2JpbmFyeS9kZWNvZGVyLmpzCmZ1bmN0aW9uIHBmKGEsYyxkKXt0aGlzLmJ5dGVzXz1udWxsO3RoaXMudGVtcEhpZ2hfPXRoaXMudGVtcExvd189dGhpcy5jdXJzb3JfPXRoaXMuZW5kXz10aGlzLnN0YXJ0Xz0wO3RoaXMuZXJyb3JfPSExO2EmJnRoaXMuc2V0QmxvY2soYSxjLGQpfXZhciBxZj1bXTtmdW5jdGlvbiByZihhLGMsZCl7aWYocWYubGVuZ3RoKXt2YXIgZj1xZi5wb3AoKTthJiZmLnNldEJsb2NrKGEsYyxkKTtyZXR1cm4gZn1yZXR1cm4gbmV3IHBmKGEsYyxkKX1OPXBmLnByb3RvdHlwZTtOLmZyZWU9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCk7MTAwPnFmLmxlbmd0aCYmcWYucHVzaCh0aGlzKX07Ti5jbG9uZT1mdW5jdGlvbigpe3JldHVybiByZih0aGlzLmJ5dGVzXyx0aGlzLnN0YXJ0Xyx0aGlzLmVuZF8tdGhpcy5zdGFydF8pfTtOLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5ieXRlc189bnVsbDt0aGlzLmN1cnNvcl89dGhpcy5lbmRfPXRoaXMuc3RhcnRfPTA7dGhpcy5lcnJvcl89ITF9OwpOLmdldEJ1ZmZlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJ5dGVzX307Ti5zZXRCbG9jaz1mdW5jdGlvbihhLGMsZCl7dGhpcy5ieXRlc189b2YoYSk7dGhpcy5zdGFydF89Q2IoYyk/YzowO3RoaXMuZW5kXz1DYihkKT90aGlzLnN0YXJ0XytkOnRoaXMuYnl0ZXNfLmxlbmd0aDt0aGlzLmN1cnNvcl89dGhpcy5zdGFydF99O04uZ2V0RW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5kX307Ti5zZXRFbmQ9ZnVuY3Rpb24oYSl7dGhpcy5lbmRfPWF9O04ucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmN1cnNvcl89dGhpcy5zdGFydF99O04uZ2V0Q3Vyc29yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3Vyc29yX307Ti5zZXRDdXJzb3I9ZnVuY3Rpb24oYSl7dGhpcy5jdXJzb3JfPWF9O04uYWR2YW5jZT1mdW5jdGlvbihhKXt0aGlzLmN1cnNvcl8rPWF9O04uYXRFbmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJzb3JfPT10aGlzLmVuZF99OwpOLnBhc3RFbmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJzb3JfPnRoaXMuZW5kX307Ti5nZXRFcnJvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yX3x8MD50aGlzLmN1cnNvcl98fHRoaXMuY3Vyc29yXz50aGlzLmVuZF99OwpOLnJlYWRTcGxpdFZhcmludDY0Xz1mdW5jdGlvbigpe2Zvcih2YXIgYSxjPTAsZCxmPTA7ND5mO2YrKylpZihhPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXysrXSxjfD0oYSYxMjcpPDw3KmYsMTI4PmEpe3RoaXMudGVtcExvd189Yz4+PjA7dGhpcy50ZW1wSGlnaF89MDtyZXR1cm59YT10aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rK107Y3w9KGEmMTI3KTw8Mjg7ZD0wfChhJjEyNyk+PjQ7aWYoMTI4PmEpdGhpcy50ZW1wTG93Xz1jPj4+MCx0aGlzLnRlbXBIaWdoXz1kPj4+MDtlbHNle2ZvcihmPTA7NT5mO2YrKylpZihhPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXysrXSxkfD0oYSYxMjcpPDw3KmYrMywxMjg+YSl7dGhpcy50ZW1wTG93Xz1jPj4+MDt0aGlzLnRlbXBIaWdoXz1kPj4+MDtyZXR1cm59ZGMoIkZhaWxlZCB0byByZWFkIHZhcmludCwgZW5jb2RpbmcgaXMgaW52YWxpZC4iKTt0aGlzLmVycm9yXz0hMH19OwpOLnNraXBWYXJpbnQ9ZnVuY3Rpb24oKXtmb3IoO3RoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yX10mMTI4Oyl0aGlzLmN1cnNvcl8rKzt0aGlzLmN1cnNvcl8rK307Ti51bnNraXBWYXJpbnQ9ZnVuY3Rpb24oYSl7Zm9yKDsxMjg8YTspdGhpcy5jdXJzb3JfLS0sYT4+Pj03O3RoaXMuY3Vyc29yXy0tfTsKTi5yZWFkVW5zaWduZWRWYXJpbnQzMj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYnl0ZXNfO3ZhciBjPWFbdGhpcy5jdXJzb3JfKzBdO3ZhciBkPWMmMTI3O2lmKDEyOD5jKXJldHVybiB0aGlzLmN1cnNvcl8rPTEsZDtjPWFbdGhpcy5jdXJzb3JfKzFdO2R8PShjJjEyNyk8PDc7aWYoMTI4PmMpcmV0dXJuIHRoaXMuY3Vyc29yXys9MixkO2M9YVt0aGlzLmN1cnNvcl8rMl07ZHw9KGMmMTI3KTw8MTQ7aWYoMTI4PmMpcmV0dXJuIHRoaXMuY3Vyc29yXys9MyxkO2M9YVt0aGlzLmN1cnNvcl8rM107ZHw9KGMmMTI3KTw8MjE7aWYoMTI4PmMpcmV0dXJuIHRoaXMuY3Vyc29yXys9NCxkO2M9YVt0aGlzLmN1cnNvcl8rNF07ZHw9KGMmMTUpPDwyODtpZigxMjg+YylyZXR1cm4gdGhpcy5jdXJzb3JfKz01LGQ+Pj4wO3RoaXMuY3Vyc29yXys9NTsxMjg8PWFbdGhpcy5jdXJzb3JfKytdJiYxMjg8PWFbdGhpcy5jdXJzb3JfKytdJiYxMjg8PWFbdGhpcy5jdXJzb3JfKytdJiYxMjg8PWFbdGhpcy5jdXJzb3JfKytdJiYKdGhpcy5jdXJzb3JfKys7cmV0dXJuIGR9O04ucmVhZFNpZ25lZFZhcmludDMyPXBmLnByb3RvdHlwZS5yZWFkVW5zaWduZWRWYXJpbnQzMjtOLnJlYWRVbnNpZ25lZFZhcmludDMyU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFVuc2lnbmVkVmFyaW50MzIoKS50b1N0cmluZygpfTtOLnJlYWRTaWduZWRWYXJpbnQzMlN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRTaWduZWRWYXJpbnQzMigpLnRvU3RyaW5nKCl9O04ucmVhZFppZ3phZ1ZhcmludDMyPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5yZWFkVW5zaWduZWRWYXJpbnQzMigpO3JldHVybiBhPj4+MV4tKGEmMSl9O04ucmVhZFVuc2lnbmVkVmFyaW50NjQ9ZnVuY3Rpb24oKXt0aGlzLnJlYWRTcGxpdFZhcmludDY0XygpO3JldHVybiBBZSh0aGlzLnRlbXBMb3dfLHRoaXMudGVtcEhpZ2hfKX07Ck4ucmVhZFVuc2lnbmVkVmFyaW50NjRTdHJpbmc9ZnVuY3Rpb24oKXt0aGlzLnJlYWRTcGxpdFZhcmludDY0XygpO3JldHVybiBIZSh0aGlzLnRlbXBMb3dfLHRoaXMudGVtcEhpZ2hfKX07Ti5yZWFkU2lnbmVkVmFyaW50NjQ9ZnVuY3Rpb24oKXt0aGlzLnJlYWRTcGxpdFZhcmludDY0XygpO3JldHVybiBCZSh0aGlzLnRlbXBMb3dfLHRoaXMudGVtcEhpZ2hfKX07Ti5yZWFkU2lnbmVkVmFyaW50NjRTdHJpbmc9ZnVuY3Rpb24oKXt0aGlzLnJlYWRTcGxpdFZhcmludDY0XygpO3JldHVybiBtZih0aGlzLnRlbXBMb3dfLHRoaXMudGVtcEhpZ2hfKX07Ti5yZWFkWmlnemFnVmFyaW50NjQ9ZnVuY3Rpb24oKXt0aGlzLnJlYWRTcGxpdFZhcmludDY0XygpO3JldHVybiBDZSh0aGlzLnRlbXBMb3dfLHRoaXMudGVtcEhpZ2hfKX07Ti5yZWFkWmlnemFnVmFyaW50NjRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkWmlnemFnVmFyaW50NjQoKS50b1N0cmluZygpfTsKTi5yZWFkVWludDg9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rMF07dGhpcy5jdXJzb3JfKz0xO3JldHVybiBhfTtOLnJlYWRVaW50MTY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rMF0sYz10aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rMV07dGhpcy5jdXJzb3JfKz0yO3JldHVybiBhPDwwfGM8PDh9O04ucmVhZFVpbnQzMj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXyswXSxjPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXysxXSxkPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXysyXSxmPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXyszXTt0aGlzLmN1cnNvcl8rPTQ7cmV0dXJuKGE8PDB8Yzw8OHxkPDwxNnxmPDwyNCk+Pj4wfTtOLnJlYWRVaW50NjQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJlYWRVaW50MzIoKSxjPXRoaXMucmVhZFVpbnQzMigpO3JldHVybiBBZShhLGMpfTsKTi5yZWFkVWludDY0U3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5yZWFkVWludDMyKCksYz10aGlzLnJlYWRVaW50MzIoKTtyZXR1cm4gSGUoYSxjKX07Ti5yZWFkSW50OD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXyswXTt0aGlzLmN1cnNvcl8rPTE7cmV0dXJuIGE8PDI0Pj4yNH07Ti5yZWFkSW50MTY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rMF0sYz10aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rMV07dGhpcy5jdXJzb3JfKz0yO3JldHVybihhPDwwfGM8PDgpPDwxNj4+MTZ9O04ucmVhZEludDMyPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfKzBdLGM9dGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfKzFdLGQ9dGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfKzJdLGY9dGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfKzNdO3RoaXMuY3Vyc29yXys9NDtyZXR1cm4gYTw8MHxjPDw4fGQ8PDE2fGY8PDI0fTsKTi5yZWFkSW50NjQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJlYWRVaW50MzIoKSxjPXRoaXMucmVhZFVpbnQzMigpO3JldHVybiBCZShhLGMpfTtOLnJlYWRJbnQ2NFN0cmluZz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucmVhZFVpbnQzMigpLGM9dGhpcy5yZWFkVWludDMyKCk7cmV0dXJuIG1mKGEsYyl9O04ucmVhZEZsb2F0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5yZWFkVWludDMyKCk7cmV0dXJuIERlKGEpfTtOLnJlYWREb3VibGU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJlYWRVaW50MzIoKSxjPXRoaXMucmVhZFVpbnQzMigpO3JldHVybiBFZShhLGMpfTtOLnJlYWRCb29sPWZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rK119O04ucmVhZEVudW09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkU2lnbmVkVmFyaW50MzIoKX07Ck4ucmVhZFN0cmluZz1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmJ5dGVzXyxkPXRoaXMuY3Vyc29yXzthPWQrYTtmb3IodmFyIGY9W10sZz0iIjtkPGE7KXt2YXIgbD1jW2QrK107aWYoMTI4PmwpZi5wdXNoKGwpO2Vsc2UgaWYoMTkyPmwpY29udGludWU7ZWxzZSBpZigyMjQ+bCl7dmFyIGs9Y1tkKytdO2YucHVzaCgobCYzMSk8PDZ8ayY2Myl9ZWxzZSBpZigyNDA+bCl7az1jW2QrK107dmFyIG49Y1tkKytdO2YucHVzaCgobCYxNSk8PDEyfChrJjYzKTw8NnxuJjYzKX1lbHNlIGlmKDI0OD5sKXtrPWNbZCsrXTtuPWNbZCsrXTt2YXIgcD1jW2QrK107bD0obCY3KTw8MTh8KGsmNjMpPDwxMnwobiY2Myk8PDZ8cCY2MztsLT02NTUzNjtmLnB1c2goKGw+PjEwJjEwMjMpKzU1Mjk2LChsJjEwMjMpKzU2MzIwKX04MTkyPD1mLmxlbmd0aCYmKGcrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxmKSxmLmxlbmd0aD0wKX1nKz1sYyhmKTt0aGlzLmN1cnNvcl89ZDtyZXR1cm4gZ307Ck4ucmVhZFN0cmluZ1dpdGhMZW5ndGg9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJlYWRVbnNpZ25lZFZhcmludDMyKCk7cmV0dXJuIHRoaXMucmVhZFN0cmluZyhhKX07Ti5yZWFkQnl0ZXM9ZnVuY3Rpb24oYSl7aWYoMD5hfHx0aGlzLmN1cnNvcl8rYT50aGlzLmJ5dGVzXy5sZW5ndGgpcmV0dXJuIHRoaXMuZXJyb3JfPSEwLGRjKCJJbnZhbGlkIGJ5dGUgbGVuZ3RoISIpLG5ldyBVaW50OEFycmF5KDApO3ZhciBjPXRoaXMuYnl0ZXNfLnN1YmFycmF5KHRoaXMuY3Vyc29yXyx0aGlzLmN1cnNvcl8rYSk7dGhpcy5jdXJzb3JfKz1hO3JldHVybiBjfTtOLnJlYWRWYXJpbnRIYXNoNjQ9ZnVuY3Rpb24oKXt0aGlzLnJlYWRTcGxpdFZhcmludDY0XygpO3JldHVybiBGZSh0aGlzLnRlbXBMb3dfLHRoaXMudGVtcEhpZ2hfKX07Ck4ucmVhZEZpeGVkSGFzaDY0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ieXRlc18sYz10aGlzLmN1cnNvcl8sZD1hW2MrMF0sZj1hW2MrMV0sZz1hW2MrMl0sbD1hW2MrM10saz1hW2MrNF0sbj1hW2MrNV0scD1hW2MrNl07YT1hW2MrN107dGhpcy5jdXJzb3JfKz04O3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGQsZixnLGwsayxuLHAsYSl9OwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX3Byb3RvYnVmX2pzL2JpbmFyeS9lbmNvZGVyLmpzCmZ1bmN0aW9uIHNmKCl7dGhpcy5idWZmZXJfPVtdfU49c2YucHJvdG90eXBlO04ubGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYnVmZmVyXy5sZW5ndGh9O04uZW5kPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5idWZmZXJfO3RoaXMuYnVmZmVyXz1bXTtyZXR1cm4gYX07Ti53cml0ZVNwbGl0VmFyaW50NjQ9ZnVuY3Rpb24oYSxjKXtmb3IoOzA8Y3x8MTI3PGE7KXRoaXMuYnVmZmVyXy5wdXNoKGEmMTI3fDEyOCksYT0oYT4+Pjd8Yzw8MjUpPj4+MCxjPj4+PTc7dGhpcy5idWZmZXJfLnB1c2goYSl9O04ud3JpdGVTcGxpdEZpeGVkNjQ9ZnVuY3Rpb24oYSxjKXt0aGlzLndyaXRlVWludDMyKGEpO3RoaXMud3JpdGVVaW50MzIoYyl9O04ud3JpdGVVbnNpZ25lZFZhcmludDMyPWZ1bmN0aW9uKGEpe2Zvcig7MTI3PGE7KXRoaXMuYnVmZmVyXy5wdXNoKGEmMTI3fDEyOCksYT4+Pj03O3RoaXMuYnVmZmVyXy5wdXNoKGEpfTsKTi53cml0ZVNpZ25lZFZhcmludDMyPWZ1bmN0aW9uKGEpe2lmKDA8PWEpdGhpcy53cml0ZVVuc2lnbmVkVmFyaW50MzIoYSk7ZWxzZXtmb3IodmFyIGM9MDs5PmM7YysrKXRoaXMuYnVmZmVyXy5wdXNoKGEmMTI3fDEyOCksYT4+PTc7dGhpcy5idWZmZXJfLnB1c2goMSl9fTtOLndyaXRlVW5zaWduZWRWYXJpbnQ2ND1mdW5jdGlvbihhKXtkZShhKTt0aGlzLndyaXRlU3BsaXRWYXJpbnQ2NChhZSxiZSl9O04ud3JpdGVTaWduZWRWYXJpbnQ2ND1mdW5jdGlvbihhKXtkZShhKTt0aGlzLndyaXRlU3BsaXRWYXJpbnQ2NChhZSxiZSl9O04ud3JpdGVaaWd6YWdWYXJpbnQzMj1mdW5jdGlvbihhKXt0aGlzLndyaXRlVW5zaWduZWRWYXJpbnQzMigoYTw8MV5hPj4zMSk+Pj4wKX07Ti53cml0ZVppZ3phZ1ZhcmludDY0PWZ1bmN0aW9uKGEpe2VlKGEpO3RoaXMud3JpdGVTcGxpdFZhcmludDY0KGFlLGJlKX07Ck4ud3JpdGVaaWd6YWdWYXJpbnQ2NFN0cmluZz1mdW5jdGlvbihhKXt0aGlzLndyaXRlWmlnemFnVmFyaW50NjQocGFyc2VJbnQoYSwxMCkpfTtOLndyaXRlVWludDg9ZnVuY3Rpb24oYSl7dGhpcy5idWZmZXJfLnB1c2goYT4+PjAmMjU1KX07Ti53cml0ZVVpbnQxNj1mdW5jdGlvbihhKXt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+MCYyNTUpO3RoaXMuYnVmZmVyXy5wdXNoKGE+Pj44JjI1NSl9O04ud3JpdGVVaW50MzI9ZnVuY3Rpb24oYSl7dGhpcy5idWZmZXJfLnB1c2goYT4+PjAmMjU1KTt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+OCYyNTUpO3RoaXMuYnVmZmVyXy5wdXNoKGE+Pj4xNiYyNTUpO3RoaXMuYnVmZmVyXy5wdXNoKGE+Pj4yNCYyNTUpfTtOLndyaXRlVWludDY0PWZ1bmN0aW9uKGEpe2NlKGEpO3RoaXMud3JpdGVVaW50MzIoYWUpO3RoaXMud3JpdGVVaW50MzIoYmUpfTtOLndyaXRlSW50OD1mdW5jdGlvbihhKXt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+MCYyNTUpfTsKTi53cml0ZUludDE2PWZ1bmN0aW9uKGEpe3RoaXMuYnVmZmVyXy5wdXNoKGE+Pj4wJjI1NSk7dGhpcy5idWZmZXJfLnB1c2goYT4+PjgmMjU1KX07Ti53cml0ZUludDMyPWZ1bmN0aW9uKGEpe3RoaXMuYnVmZmVyXy5wdXNoKGE+Pj4wJjI1NSk7dGhpcy5idWZmZXJfLnB1c2goYT4+PjgmMjU1KTt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+MTYmMjU1KTt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+MjQmMjU1KX07Ti53cml0ZUludDY0PWZ1bmN0aW9uKGEpe2RlKGEpO3RoaXMud3JpdGVTcGxpdEZpeGVkNjQoYWUsYmUpfTtOLndyaXRlSW50NjRTdHJpbmc9ZnVuY3Rpb24oYSl7aGUobmYoYSkpO3RoaXMud3JpdGVTcGxpdEZpeGVkNjQoYWUsYmUpfTtOLndyaXRlRmxvYXQ9ZnVuY3Rpb24oYSl7ZmUoYSk7dGhpcy53cml0ZVVpbnQzMihhZSl9O04ud3JpdGVEb3VibGU9ZnVuY3Rpb24oYSl7Z2UoYSk7dGhpcy53cml0ZVVpbnQzMihhZSk7dGhpcy53cml0ZVVpbnQzMihiZSl9OwpOLndyaXRlQm9vbD1mdW5jdGlvbihhKXt0aGlzLmJ1ZmZlcl8ucHVzaChhPzE6MCl9O04ud3JpdGVFbnVtPWZ1bmN0aW9uKGEpe3RoaXMud3JpdGVTaWduZWRWYXJpbnQzMihhKX07Ti53cml0ZUJ5dGVzPWZ1bmN0aW9uKGEpe3RoaXMuYnVmZmVyXy5wdXNoLmFwcGx5KHRoaXMuYnVmZmVyXyxhKX07Ti53cml0ZVZhcmludEhhc2g2ND1mdW5jdGlvbihhKXtoZShhKTt0aGlzLndyaXRlU3BsaXRWYXJpbnQ2NChhZSxiZSl9O04ud3JpdGVGaXhlZEhhc2g2ND1mdW5jdGlvbihhKXtoZShhKTt0aGlzLndyaXRlVWludDMyKGFlKTt0aGlzLndyaXRlVWludDMyKGJlKX07Ck4ud3JpdGVTdHJpbmc9ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMuYnVmZmVyXy5sZW5ndGgsZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZj1hLmNoYXJDb2RlQXQoZCk7aWYoMTI4PmYpdGhpcy5idWZmZXJfLnB1c2goZik7ZWxzZSBpZigyMDQ4PmYpdGhpcy5idWZmZXJfLnB1c2goZj4+NnwxOTIpLHRoaXMuYnVmZmVyXy5wdXNoKGYmNjN8MTI4KTtlbHNlIGlmKDY1NTM2PmYpaWYoNTUyOTY8PWYmJjU2MzE5Pj1mJiZkKzE8YS5sZW5ndGgpe3ZhciBnPWEuY2hhckNvZGVBdChkKzEpOzU2MzIwPD1nJiY1NzM0Mz49ZyYmKGY9MTAyNCooZi01NTI5NikrZy01NjMyMCs2NTUzNix0aGlzLmJ1ZmZlcl8ucHVzaChmPj4xOHwyNDApLHRoaXMuYnVmZmVyXy5wdXNoKGY+PjEyJjYzfDEyOCksdGhpcy5idWZmZXJfLnB1c2goZj4+NiY2M3wxMjgpLHRoaXMuYnVmZmVyXy5wdXNoKGYmNjN8MTI4KSxkKyspfWVsc2UgdGhpcy5idWZmZXJfLnB1c2goZj4+MTJ8MjI0KSx0aGlzLmJ1ZmZlcl8ucHVzaChmPj4KNiY2M3wxMjgpLHRoaXMuYnVmZmVyXy5wdXNoKGYmNjN8MTI4KX1yZXR1cm4gdGhpcy5idWZmZXJfLmxlbmd0aC1jfTsKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9wcm90b2J1Zl9qcy9iaW5hcnkvcmVhZGVyLmpzCmZ1bmN0aW9uIHVmKGEsYyxkKXt0aGlzLmRlY29kZXJfPXJmKGEsYyxkKTt0aGlzLmZpZWxkQ3Vyc29yXz10aGlzLmRlY29kZXJfLmdldEN1cnNvcigpO3RoaXMubmV4dFdpcmVUeXBlXz10aGlzLm5leHRGaWVsZF89LTE7dGhpcy5lcnJvcl89ITE7dGhpcy5yZWFkQ2FsbGJhY2tzXz1udWxsfXZhciB2Zj1bXTtOPXVmLnByb3RvdHlwZTtOLmFsbG9jPWZ1bmN0aW9uKGEsYyxkKXtpZih2Zi5sZW5ndGgpe3ZhciBmPXZmLnBvcCgpO2EmJmYuZGVjb2Rlcl8uc2V0QmxvY2soYSxjLGQpO3JldHVybiBmfXJldHVybiBuZXcgdWYoYSxjLGQpfTtOLmZyZWU9ZnVuY3Rpb24oKXt0aGlzLmRlY29kZXJfLmNsZWFyKCk7dGhpcy5uZXh0V2lyZVR5cGVfPXRoaXMubmV4dEZpZWxkXz0tMTt0aGlzLmVycm9yXz0hMTt0aGlzLnJlYWRDYWxsYmFja3NfPW51bGw7MTAwPnZmLmxlbmd0aCYmdmYucHVzaCh0aGlzKX07Ti5nZXRGaWVsZEN1cnNvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpZWxkQ3Vyc29yX307Ck4uZ2V0Q3Vyc29yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8uZ2V0Q3Vyc29yKCl9O04uZ2V0QnVmZmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8uZ2V0QnVmZmVyKCl9O04uZ2V0RmllbGROdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uZXh0RmllbGRffTtOLmdldFdpcmVUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmV4dFdpcmVUeXBlX307Ti5pc0VuZEdyb3VwPWZ1bmN0aW9uKCl7cmV0dXJuIDQ9PXRoaXMubmV4dFdpcmVUeXBlX307Ti5nZXRFcnJvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yX3x8dGhpcy5kZWNvZGVyXy5nZXRFcnJvcigpfTtOLnNldEJsb2NrPWZ1bmN0aW9uKGEsYyxkKXt0aGlzLmRlY29kZXJfLnNldEJsb2NrKGEsYyxkKTt0aGlzLm5leHRXaXJlVHlwZV89dGhpcy5uZXh0RmllbGRfPS0xfTsKTi5yZXNldD1mdW5jdGlvbigpe3RoaXMuZGVjb2Rlcl8ucmVzZXQoKTt0aGlzLm5leHRXaXJlVHlwZV89dGhpcy5uZXh0RmllbGRfPS0xfTtOLmFkdmFuY2U9ZnVuY3Rpb24oYSl7dGhpcy5kZWNvZGVyXy5hZHZhbmNlKGEpfTsKTi5uZXh0RmllbGQ9ZnVuY3Rpb24oKXtpZih0aGlzLmRlY29kZXJfLmF0RW5kKCkpcmV0dXJuITE7aWYodGhpcy5nZXRFcnJvcigpKXJldHVybiBkYygiRGVjb2RlciBoaXQgYW4gZXJyb3IiKSwhMTt0aGlzLmZpZWxkQ3Vyc29yXz10aGlzLmRlY29kZXJfLmdldEN1cnNvcigpO3ZhciBhPXRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50MzIoKSxjPWE+Pj4zO2EmPTc7aWYoMCE9YSYmNSE9YSYmMSE9YSYmMiE9YSYmMyE9YSYmNCE9YSlyZXR1cm4gZGMoIkludmFsaWQgd2lyZSB0eXBlOiAlcyAoYXQgcG9zaXRpb24gJXMpIixhLHRoaXMuZmllbGRDdXJzb3JfKSx0aGlzLmVycm9yXz0hMCwhMTt0aGlzLm5leHRGaWVsZF89Yzt0aGlzLm5leHRXaXJlVHlwZV89YTtyZXR1cm4hMH07Ti51bnNraXBIZWFkZXI9ZnVuY3Rpb24oKXt0aGlzLmRlY29kZXJfLnVuc2tpcFZhcmludCh0aGlzLm5leHRGaWVsZF88PDN8dGhpcy5uZXh0V2lyZVR5cGVfKX07Ck4uc2tpcE1hdGNoaW5nRmllbGRzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uZXh0RmllbGRfO2Zvcih0aGlzLnVuc2tpcEhlYWRlcigpO3RoaXMubmV4dEZpZWxkKCkmJnRoaXMuZ2V0RmllbGROdW1iZXIoKT09YTspdGhpcy5za2lwRmllbGQoKTt0aGlzLmRlY29kZXJfLmF0RW5kKCl8fHRoaXMudW5za2lwSGVhZGVyKCl9O04uc2tpcFZhcmludEZpZWxkPWZ1bmN0aW9uKCl7MCE9dGhpcy5uZXh0V2lyZVR5cGVfPyhkYygiSW52YWxpZCB3aXJlIHR5cGUgZm9yIHNraXBWYXJpbnRGaWVsZCIpLHRoaXMuc2tpcEZpZWxkKCkpOnRoaXMuZGVjb2Rlcl8uc2tpcFZhcmludCgpfTtOLnNraXBEZWxpbWl0ZWRGaWVsZD1mdW5jdGlvbigpe2lmKDIhPXRoaXMubmV4dFdpcmVUeXBlXylkYygiSW52YWxpZCB3aXJlIHR5cGUgZm9yIHNraXBEZWxpbWl0ZWRGaWVsZCIpLHRoaXMuc2tpcEZpZWxkKCk7ZWxzZXt2YXIgYT10aGlzLmRlY29kZXJfLnJlYWRVbnNpZ25lZFZhcmludDMyKCk7dGhpcy5kZWNvZGVyXy5hZHZhbmNlKGEpfX07Ck4uc2tpcEZpeGVkMzJGaWVsZD1mdW5jdGlvbigpezUhPXRoaXMubmV4dFdpcmVUeXBlXz8oZGMoIkludmFsaWQgd2lyZSB0eXBlIGZvciBza2lwRml4ZWQzMkZpZWxkIiksdGhpcy5za2lwRmllbGQoKSk6dGhpcy5kZWNvZGVyXy5hZHZhbmNlKDQpfTtOLnNraXBGaXhlZDY0RmllbGQ9ZnVuY3Rpb24oKXsxIT10aGlzLm5leHRXaXJlVHlwZV8/KGRjKCJJbnZhbGlkIHdpcmUgdHlwZSBmb3Igc2tpcEZpeGVkNjRGaWVsZCIpLHRoaXMuc2tpcEZpZWxkKCkpOnRoaXMuZGVjb2Rlcl8uYWR2YW5jZSg4KX07Ck4uc2tpcEdyb3VwPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uZXh0RmllbGRfO2Rve2lmKCF0aGlzLm5leHRGaWVsZCgpKXtkYygiVW5tYXRjaGVkIHN0YXJ0LWdyb3VwIHRhZzogc3RyZWFtIEVPRiIpO3RoaXMuZXJyb3JfPSEwO2JyZWFrfWlmKDQ9PXRoaXMubmV4dFdpcmVUeXBlXyl7dGhpcy5uZXh0RmllbGRfIT1hJiYoZGMoIlVubWF0Y2hlZCBlbmQtZ3JvdXAgdGFnIiksdGhpcy5lcnJvcl89ITApO2JyZWFrfXRoaXMuc2tpcEZpZWxkKCl9d2hpbGUoMSl9O04uc2tpcEZpZWxkPWZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMubmV4dFdpcmVUeXBlXyl7Y2FzZSAwOnRoaXMuc2tpcFZhcmludEZpZWxkKCk7YnJlYWs7Y2FzZSAxOnRoaXMuc2tpcEZpeGVkNjRGaWVsZCgpO2JyZWFrO2Nhc2UgMjp0aGlzLnNraXBEZWxpbWl0ZWRGaWVsZCgpO2JyZWFrO2Nhc2UgNTp0aGlzLnNraXBGaXhlZDMyRmllbGQoKTticmVhaztjYXNlIDM6dGhpcy5za2lwR3JvdXAoKTticmVhaztkZWZhdWx0OmRjKCJJbnZhbGlkIHdpcmUgZW5jb2RpbmcgZm9yIGZpZWxkLiIpfX07Ck4ucmVnaXN0ZXJSZWFkQ2FsbGJhY2s9ZnVuY3Rpb24oYSxjKXtNYih0aGlzLnJlYWRDYWxsYmFja3NfKSYmKHRoaXMucmVhZENhbGxiYWNrc189e30pO3RoaXMucmVhZENhbGxiYWNrc19bYV09Y307Ti5ydW5SZWFkQ2FsbGJhY2s9ZnVuY3Rpb24oYSl7cmV0dXJuKDAsdGhpcy5yZWFkQ2FsbGJhY2tzX1thXSkodGhpcyl9OwpOLnJlYWRBbnk9ZnVuY3Rpb24oYSl7dGhpcy5uZXh0V2lyZVR5cGVfPSRkKGEpO3N3aXRjaChhKXtjYXNlIDE6cmV0dXJuIHRoaXMucmVhZERvdWJsZSgpO2Nhc2UgMjpyZXR1cm4gdGhpcy5yZWFkRmxvYXQoKTtjYXNlIDM6cmV0dXJuIHRoaXMucmVhZEludDY0KCk7Y2FzZSA0OnJldHVybiB0aGlzLnJlYWRVaW50NjQoKTtjYXNlIDU6cmV0dXJuIHRoaXMucmVhZEludDMyKCk7Y2FzZSA2OnJldHVybiB0aGlzLnJlYWRGaXhlZDY0KCk7Y2FzZSA3OnJldHVybiB0aGlzLnJlYWRGaXhlZDMyKCk7Y2FzZSA4OnJldHVybiB0aGlzLnJlYWRCb29sKCk7Y2FzZSA5OnJldHVybiB0aGlzLnJlYWRTdHJpbmcoKTtjYXNlIDEwOmRjKCJHcm91cCBmaWVsZCB0eXBlIG5vdCBzdXBwb3J0ZWQgaW4gcmVhZEFueSgpIik7Y2FzZSAxMTpkYygiTWVzc2FnZSBmaWVsZCB0eXBlIG5vdCBzdXBwb3J0ZWQgaW4gcmVhZEFueSgpIik7Y2FzZSAxMjpyZXR1cm4gdGhpcy5yZWFkQnl0ZXMoKTtjYXNlIDEzOnJldHVybiB0aGlzLnJlYWRVaW50MzIoKTsKY2FzZSAxNDpyZXR1cm4gdGhpcy5yZWFkRW51bSgpO2Nhc2UgMTU6cmV0dXJuIHRoaXMucmVhZFNmaXhlZDMyKCk7Y2FzZSAxNjpyZXR1cm4gdGhpcy5yZWFkU2ZpeGVkNjQoKTtjYXNlIDE3OnJldHVybiB0aGlzLnJlYWRTaW50MzIoKTtjYXNlIDE4OnJldHVybiB0aGlzLnJlYWRTaW50NjQoKTtjYXNlIDMwOnJldHVybiB0aGlzLnJlYWRGaXhlZEhhc2g2NCgpO2Nhc2UgMzE6cmV0dXJuIHRoaXMucmVhZFZhcmludEhhc2g2NCgpO2RlZmF1bHQ6ZGMoIkludmFsaWQgZmllbGQgdHlwZSBpbiByZWFkQW55KCkiKX1yZXR1cm4gMH07Ti5yZWFkTWVzc2FnZT1mdW5jdGlvbihhLGMpe3ZhciBkPXRoaXMuZGVjb2Rlcl8uZ2V0RW5kKCksZj10aGlzLmRlY29kZXJfLnJlYWRVbnNpZ25lZFZhcmludDMyKCk7Zj10aGlzLmRlY29kZXJfLmdldEN1cnNvcigpK2Y7dGhpcy5kZWNvZGVyXy5zZXRFbmQoZik7YyhhLHRoaXMpO3RoaXMuZGVjb2Rlcl8uc2V0Q3Vyc29yKGYpO3RoaXMuZGVjb2Rlcl8uc2V0RW5kKGQpfTsKTi5yZWFkR3JvdXA9ZnVuY3Rpb24oYSxjLGQpe2QoYyx0aGlzKTt0aGlzLmVycm9yX3x8ND09dGhpcy5uZXh0V2lyZVR5cGVffHwoZGMoIkdyb3VwIHN1Ym1lc3NhZ2UgZGlkIG5vdCBlbmQgd2l0aCBhbiBFTkRfR1JPVVAgdGFnIiksdGhpcy5lcnJvcl89ITApfTtOLmdldEZpZWxkRGVjb2Rlcj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50MzIoKSxjPXRoaXMuZGVjb2Rlcl8uZ2V0Q3Vyc29yKCksZD1jK2E7YT1yZih0aGlzLmRlY29kZXJfLmdldEJ1ZmZlcigpLGMsYSk7dGhpcy5kZWNvZGVyXy5zZXRDdXJzb3IoZCk7cmV0dXJuIGF9O04ucmVhZEludDMyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFNpZ25lZFZhcmludDMyKCl9O04ucmVhZEludDMyU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFNpZ25lZFZhcmludDMyU3RyaW5nKCl9O04ucmVhZEludDY0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFNpZ25lZFZhcmludDY0KCl9OwpOLnJlYWRJbnQ2NFN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRTaWduZWRWYXJpbnQ2NFN0cmluZygpfTtOLnJlYWRVaW50MzI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMigpfTtOLnJlYWRVaW50MzJTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMlN0cmluZygpfTtOLnJlYWRVaW50NjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQ2NCgpfTtOLnJlYWRVaW50NjRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQ2NFN0cmluZygpfTtOLnJlYWRTaW50MzI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkWmlnemFnVmFyaW50MzIoKX07Ti5yZWFkU2ludDY0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFppZ3phZ1ZhcmludDY0KCl9OwpOLnJlYWRTaW50NjRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkWmlnemFnVmFyaW50NjRTdHJpbmcoKX07Ti5yZWFkRml4ZWQzMj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRVaW50MzIoKX07Ti5yZWFkRml4ZWQ2ND1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRVaW50NjQoKX07Ti5yZWFkRml4ZWQ2NFN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRVaW50NjRTdHJpbmcoKX07Ti5yZWFkU2ZpeGVkMzI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkSW50MzIoKX07Ti5yZWFkU2ZpeGVkMzJTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkSW50MzIoKS50b1N0cmluZygpfTtOLnJlYWRTZml4ZWQ2ND1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRJbnQ2NCgpfTtOLnJlYWRTZml4ZWQ2NFN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRJbnQ2NFN0cmluZygpfTsKTi5yZWFkRmxvYXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkRmxvYXQoKX07Ti5yZWFkRG91YmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZERvdWJsZSgpfTtOLnJlYWRCb29sPWZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLmRlY29kZXJfLnJlYWRVbnNpZ25lZFZhcmludDMyKCl9O04ucmVhZEVudW09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkU2lnbmVkVmFyaW50NjQoKX07Ti5yZWFkU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMigpO3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRTdHJpbmcoYSl9O04ucmVhZEJ5dGVzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMigpO3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRCeXRlcyhhKX07Ti5yZWFkVmFyaW50SGFzaDY0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFZhcmludEhhc2g2NCgpfTsKTi5yZWFkRml4ZWRIYXNoNjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkRml4ZWRIYXNoNjQoKX07Ti5yZWFkUGFja2VkRmllbGRfPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50MzIoKTtjPXRoaXMuZGVjb2Rlcl8uZ2V0Q3Vyc29yKCkrYztmb3IodmFyIGQ9W107dGhpcy5kZWNvZGVyXy5nZXRDdXJzb3IoKTxjOylkLnB1c2goYS5jYWxsKHRoaXMuZGVjb2Rlcl8pKTtyZXR1cm4gZH07Ti5yZWFkUGFja2VkSW50MzI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFNpZ25lZFZhcmludDMyKX07Ti5yZWFkUGFja2VkSW50MzJTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFNpZ25lZFZhcmludDMyU3RyaW5nKX07Ti5yZWFkUGFja2VkSW50NjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFNpZ25lZFZhcmludDY0KX07Ck4ucmVhZFBhY2tlZEludDY0U3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRTaWduZWRWYXJpbnQ2NFN0cmluZyl9O04ucmVhZFBhY2tlZFVpbnQzMj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMil9O04ucmVhZFBhY2tlZFVpbnQzMlN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMlN0cmluZyl9O04ucmVhZFBhY2tlZFVpbnQ2ND1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQ2NCl9O04ucmVhZFBhY2tlZFVpbnQ2NFN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQ2NFN0cmluZyl9OwpOLnJlYWRQYWNrZWRTaW50MzI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFppZ3phZ1ZhcmludDMyKX07Ti5yZWFkUGFja2VkU2ludDY0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRaaWd6YWdWYXJpbnQ2NCl9O04ucmVhZFBhY2tlZFNpbnQ2NFN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkWmlnemFnVmFyaW50NjRTdHJpbmcpfTtOLnJlYWRQYWNrZWRGaXhlZDMyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRVaW50MzIpfTtOLnJlYWRQYWNrZWRGaXhlZDY0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRVaW50NjQpfTtOLnJlYWRQYWNrZWRGaXhlZDY0U3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRVaW50NjRTdHJpbmcpfTsKTi5yZWFkUGFja2VkU2ZpeGVkMzI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZEludDMyKX07Ti5yZWFkUGFja2VkU2ZpeGVkNjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZEludDY0KX07Ti5yZWFkUGFja2VkU2ZpeGVkNjRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZEludDY0U3RyaW5nKX07Ti5yZWFkUGFja2VkRmxvYXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZEZsb2F0KX07Ti5yZWFkUGFja2VkRG91YmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWREb3VibGUpfTtOLnJlYWRQYWNrZWRCb29sPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRCb29sKX07Ck4ucmVhZFBhY2tlZEVudW09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZEVudW0pfTtOLnJlYWRQYWNrZWRWYXJpbnRIYXNoNjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFZhcmludEhhc2g2NCl9O04ucmVhZFBhY2tlZEZpeGVkSGFzaDY0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRGaXhlZEhhc2g2NCl9OwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX3Byb3RvYnVmX2pzL2JpbmFyeS93cml0ZXIuanMKZnVuY3Rpb24gd2YoKXt0aGlzLmJsb2Nrc189W107dGhpcy50b3RhbExlbmd0aF89MDt0aGlzLmVuY29kZXJfPW5ldyBzZjt0aGlzLmJvb2ttYXJrc189W119Tj13Zi5wcm90b3R5cGU7Ti5hcHBlbmRVaW50OEFycmF5Xz1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmVuY29kZXJfLmVuZCgpO3RoaXMuYmxvY2tzXy5wdXNoKGMpO3RoaXMuYmxvY2tzXy5wdXNoKGEpO3RoaXMudG90YWxMZW5ndGhfKz1jLmxlbmd0aCthLmxlbmd0aH07Ti5iZWdpbkRlbGltaXRlZF89ZnVuY3Rpb24oYSl7dGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDIpO2E9dGhpcy5lbmNvZGVyXy5lbmQoKTt0aGlzLmJsb2Nrc18ucHVzaChhKTt0aGlzLnRvdGFsTGVuZ3RoXys9YS5sZW5ndGg7YS5wdXNoKHRoaXMudG90YWxMZW5ndGhfKTtyZXR1cm4gYX07Ck4uZW5kRGVsaW1pdGVkXz1mdW5jdGlvbihhKXt2YXIgYz1hLnBvcCgpO2ZvcihjPXRoaXMudG90YWxMZW5ndGhfK3RoaXMuZW5jb2Rlcl8ubGVuZ3RoKCktYzsxMjc8YzspYS5wdXNoKGMmMTI3fDEyOCksYz4+Pj03LHRoaXMudG90YWxMZW5ndGhfKys7YS5wdXNoKGMpO3RoaXMudG90YWxMZW5ndGhfKyt9O04ud3JpdGVTZXJpYWxpemVkTWVzc2FnZT1mdW5jdGlvbihhLGMsZCl7dGhpcy5hcHBlbmRVaW50OEFycmF5XyhhLnN1YmFycmF5KGMsZCkpfTtOLm1heWJlV3JpdGVTZXJpYWxpemVkTWVzc2FnZT1mdW5jdGlvbihhLGMsZCl7bnVsbCE9YSYmbnVsbCE9YyYmbnVsbCE9ZCYmdGhpcy53cml0ZVNlcmlhbGl6ZWRNZXNzYWdlKGEsYyxkKX07Ti5yZXNldD1mdW5jdGlvbigpe3RoaXMuYmxvY2tzXz1bXTt0aGlzLmVuY29kZXJfLmVuZCgpO3RoaXMudG90YWxMZW5ndGhfPTA7dGhpcy5ib29rbWFya3NfPVtdfTsKTi5nZXRSZXN1bHRCdWZmZXI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9bmV3IFVpbnQ4QXJyYXkodGhpcy50b3RhbExlbmd0aF8rdGhpcy5lbmNvZGVyXy5sZW5ndGgoKSksYz10aGlzLmJsb2Nrc18sZD1jLmxlbmd0aCxmPTAsZz0wO2c8ZDtnKyspe3ZhciBsPWNbZ107YS5zZXQobCxmKTtmKz1sLmxlbmd0aH1jPXRoaXMuZW5jb2Rlcl8uZW5kKCk7YS5zZXQoYyxmKTt0aGlzLmJsb2Nrc189W2FdO3JldHVybiBhfTtOLmdldFJlc3VsdEJhc2U2NFN0cmluZz1mdW5jdGlvbihhKXtyZXR1cm4gb2QodGhpcy5nZXRSZXN1bHRCdWZmZXIoKSxhKX07Ti5iZWdpblN1Yk1lc3NhZ2U9ZnVuY3Rpb24oYSl7dGhpcy5ib29rbWFya3NfLnB1c2godGhpcy5iZWdpbkRlbGltaXRlZF8oYSkpfTtOLmVuZFN1Yk1lc3NhZ2U9ZnVuY3Rpb24oKXt0aGlzLmVuZERlbGltaXRlZF8odGhpcy5ib29rbWFya3NfLnBvcCgpKX07Ck4ud3JpdGVGaWVsZEhlYWRlcl89ZnVuY3Rpb24oYSxjKXt0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQzMig4KmErYyl9OwpOLndyaXRlQW55PWZ1bmN0aW9uKGEsYyxkKXtzd2l0Y2goYSl7Y2FzZSAxOnRoaXMud3JpdGVEb3VibGUoYyxkKTticmVhaztjYXNlIDI6dGhpcy53cml0ZUZsb2F0KGMsZCk7YnJlYWs7Y2FzZSAzOnRoaXMud3JpdGVJbnQ2NChjLGQpO2JyZWFrO2Nhc2UgNDp0aGlzLndyaXRlVWludDY0KGMsZCk7YnJlYWs7Y2FzZSA1OnRoaXMud3JpdGVJbnQzMihjLGQpO2JyZWFrO2Nhc2UgNjp0aGlzLndyaXRlRml4ZWQ2NChjLGQpO2JyZWFrO2Nhc2UgNzp0aGlzLndyaXRlRml4ZWQzMihjLGQpO2JyZWFrO2Nhc2UgODp0aGlzLndyaXRlQm9vbChjLGQpO2JyZWFrO2Nhc2UgOTp0aGlzLndyaXRlU3RyaW5nKGMsZCk7YnJlYWs7Y2FzZSAxMDpkYygiR3JvdXAgZmllbGQgdHlwZSBub3Qgc3VwcG9ydGVkIGluIHdyaXRlQW55KCkiKTticmVhaztjYXNlIDExOmRjKCJNZXNzYWdlIGZpZWxkIHR5cGUgbm90IHN1cHBvcnRlZCBpbiB3cml0ZUFueSgpIik7YnJlYWs7Y2FzZSAxMjp0aGlzLndyaXRlQnl0ZXMoYywKZCk7YnJlYWs7Y2FzZSAxMzp0aGlzLndyaXRlVWludDMyKGMsZCk7YnJlYWs7Y2FzZSAxNDp0aGlzLndyaXRlRW51bShjLGQpO2JyZWFrO2Nhc2UgMTU6dGhpcy53cml0ZVNmaXhlZDMyKGMsZCk7YnJlYWs7Y2FzZSAxNjp0aGlzLndyaXRlU2ZpeGVkNjQoYyxkKTticmVhaztjYXNlIDE3OnRoaXMud3JpdGVTaW50MzIoYyxkKTticmVhaztjYXNlIDE4OnRoaXMud3JpdGVTaW50NjQoYyxkKTticmVhaztjYXNlIDMwOnRoaXMud3JpdGVGaXhlZEhhc2g2NChjLGQpO2JyZWFrO2Nhc2UgMzE6dGhpcy53cml0ZVZhcmludEhhc2g2NChjLGQpO2JyZWFrO2RlZmF1bHQ6ZGMoIkludmFsaWQgZmllbGQgdHlwZSBpbiB3cml0ZUFueSgpIil9fTtOLndyaXRlVW5zaWduZWRWYXJpbnQzMl89ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiYodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDApLHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKGMpKX07Ck4ud3JpdGVTaWduZWRWYXJpbnQzMl89ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiYodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDApLHRoaXMuZW5jb2Rlcl8ud3JpdGVTaWduZWRWYXJpbnQzMihjKSl9O04ud3JpdGVVbnNpZ25lZFZhcmludDY0Xz1mdW5jdGlvbihhLGMpe251bGwhPWMmJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMCksdGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50NjQoYykpfTtOLndyaXRlU2lnbmVkVmFyaW50NjRfPWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwwKSx0aGlzLmVuY29kZXJfLndyaXRlU2lnbmVkVmFyaW50NjQoYykpfTtOLndyaXRlWmlnemFnVmFyaW50MzJfPWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwwKSx0aGlzLmVuY29kZXJfLndyaXRlWmlnemFnVmFyaW50MzIoYykpfTsKTi53cml0ZVppZ3phZ1ZhcmludDY0Xz1mdW5jdGlvbihhLGMpe251bGwhPWMmJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMCksdGhpcy5lbmNvZGVyXy53cml0ZVppZ3phZ1ZhcmludDY0KGMpKX07Ti53cml0ZVppZ3phZ1ZhcmludDY0U3RyaW5nXz1mdW5jdGlvbihhLGMpe251bGwhPWMmJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMCksdGhpcy5lbmNvZGVyXy53cml0ZVppZ3phZ1ZhcmludDY0U3RyaW5nKGMpKX07Ti53cml0ZUludDMyPWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmdGhpcy53cml0ZVNpZ25lZFZhcmludDMyXyhhLGMpfTtOLndyaXRlSW50MzJTdHJpbmc9ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiZ0aGlzLndyaXRlU2lnbmVkVmFyaW50MzJfKGEscGFyc2VJbnQoYywxMCkpfTtOLndyaXRlSW50NjQ9ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiZ0aGlzLndyaXRlU2lnbmVkVmFyaW50NjRfKGEsYyl9OwpOLndyaXRlSW50NjRTdHJpbmc9ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiYoYz1aZChjKSx0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMCksdGhpcy5lbmNvZGVyXy53cml0ZVNwbGl0VmFyaW50NjQoYy5sbyxjLmhpKSl9O04ud3JpdGVVaW50MzI9ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiZ0aGlzLndyaXRlVW5zaWduZWRWYXJpbnQzMl8oYSxjKX07Ti53cml0ZVVpbnQzMlN0cmluZz1mdW5jdGlvbihhLGMpe251bGwhPWMmJnRoaXMud3JpdGVVbnNpZ25lZFZhcmludDMyXyhhLHBhcnNlSW50KGMsMTApKX07Ti53cml0ZVVpbnQ2ND1mdW5jdGlvbihhLGMpe251bGwhPWMmJnRoaXMud3JpdGVVbnNpZ25lZFZhcmludDY0XyhhLGMpfTtOLndyaXRlVWludDY0U3RyaW5nPWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmKGM9SmQoYyksdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDApLHRoaXMuZW5jb2Rlcl8ud3JpdGVTcGxpdFZhcmludDY0KGMubG8sYy5oaSkpfTsKTi53cml0ZVNpbnQzMj1mdW5jdGlvbihhLGMpe251bGwhPWMmJnRoaXMud3JpdGVaaWd6YWdWYXJpbnQzMl8oYSxjKX07Ti53cml0ZVNpbnQ2ND1mdW5jdGlvbihhLGMpe251bGwhPWMmJnRoaXMud3JpdGVaaWd6YWdWYXJpbnQ2NF8oYSxjKX07Ti53cml0ZVNpbnQ2NFN0cmluZz1mdW5jdGlvbihhLGMpe251bGwhPWMmJnRoaXMud3JpdGVaaWd6YWdWYXJpbnQ2NFN0cmluZ18oYSxjKX07Ti53cml0ZUZpeGVkMzI9ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiYodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDUpLHRoaXMuZW5jb2Rlcl8ud3JpdGVVaW50MzIoYykpfTtOLndyaXRlRml4ZWQ2ND1mdW5jdGlvbihhLGMpe251bGwhPWMmJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMSksdGhpcy5lbmNvZGVyXy53cml0ZVVpbnQ2NChjKSl9OwpOLndyaXRlRml4ZWQ2NFN0cmluZz1mdW5jdGlvbihhLGMpe251bGwhPWMmJihjPUpkKGMpLHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwxKSx0aGlzLmVuY29kZXJfLndyaXRlU3BsaXRGaXhlZDY0KGMubG8sYy5oaSkpfTtOLndyaXRlU2ZpeGVkMzI9ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiYodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDUpLHRoaXMuZW5jb2Rlcl8ud3JpdGVJbnQzMihjKSl9O04ud3JpdGVTZml4ZWQ2ND1mdW5jdGlvbihhLGMpe251bGwhPWMmJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMSksdGhpcy5lbmNvZGVyXy53cml0ZUludDY0KGMpKX07Ti53cml0ZVNmaXhlZDY0U3RyaW5nPWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmKGM9WmQoYyksdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDEpLHRoaXMuZW5jb2Rlcl8ud3JpdGVTcGxpdEZpeGVkNjQoYy5sbyxjLmhpKSl9OwpOLndyaXRlRmxvYXQ9ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiYodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDUpLHRoaXMuZW5jb2Rlcl8ud3JpdGVGbG9hdChjKSl9O04ud3JpdGVEb3VibGU9ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiYodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDEpLHRoaXMuZW5jb2Rlcl8ud3JpdGVEb3VibGUoYykpfTtOLndyaXRlQm9vbD1mdW5jdGlvbihhLGMpe251bGwhPWMmJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMCksdGhpcy5lbmNvZGVyXy53cml0ZUJvb2woYykpfTtOLndyaXRlRW51bT1mdW5jdGlvbihhLGMpe251bGwhPWMmJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMCksdGhpcy5lbmNvZGVyXy53cml0ZVNpZ25lZFZhcmludDMyKGMpKX07Ti53cml0ZVN0cmluZz1mdW5jdGlvbihhLGMpe251bGwhPWMmJihhPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpLHRoaXMuZW5jb2Rlcl8ud3JpdGVTdHJpbmcoYyksdGhpcy5lbmREZWxpbWl0ZWRfKGEpKX07Ck4ud3JpdGVCeXRlcz1mdW5jdGlvbihhLGMpe251bGwhPWMmJihjPW9mKGMpLHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwyKSx0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQzMihjLmxlbmd0aCksdGhpcy5hcHBlbmRVaW50OEFycmF5XyhjKSl9O04ud3JpdGVNZXNzYWdlPWZ1bmN0aW9uKGEsYyxkKXtudWxsIT1jJiYoYT10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKSxkKGMsdGhpcyksdGhpcy5lbmREZWxpbWl0ZWRfKGEpKX07Ti53cml0ZU1lc3NhZ2VTZXQ9ZnVuY3Rpb24oYSxjLGQpe251bGwhPWMmJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKDEsMyksdGhpcy53cml0ZUZpZWxkSGVhZGVyXygyLDApLHRoaXMuZW5jb2Rlcl8ud3JpdGVTaWduZWRWYXJpbnQzMihhKSxhPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKDMpLGQoYyx0aGlzKSx0aGlzLmVuZERlbGltaXRlZF8oYSksdGhpcy53cml0ZUZpZWxkSGVhZGVyXygxLDQpKX07Ck4ud3JpdGVHcm91cD1mdW5jdGlvbihhLGMsZCl7bnVsbCE9YyYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwzKSxkKGMsdGhpcyksdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDQpKX07Ti53cml0ZUZpeGVkSGFzaDY0PWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwxKSx0aGlzLmVuY29kZXJfLndyaXRlRml4ZWRIYXNoNjQoYykpfTtOLndyaXRlVmFyaW50SGFzaDY0PWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwwKSx0aGlzLmVuY29kZXJfLndyaXRlVmFyaW50SGFzaDY0KGMpKX07Ti53cml0ZVJlcGVhdGVkSW50MzI9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMud3JpdGVTaWduZWRWYXJpbnQzMl8oYSxjW2RdKX07Ck4ud3JpdGVSZXBlYXRlZEludDMyU3RyaW5nPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLndyaXRlSW50MzJTdHJpbmcoYSxjW2RdKX07Ti53cml0ZVJlcGVhdGVkSW50NjQ9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMud3JpdGVTaWduZWRWYXJpbnQ2NF8oYSxjW2RdKX07Ti53cml0ZVJlcGVhdGVkSW50NjRTdHJpbmc9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMud3JpdGVJbnQ2NFN0cmluZyhhLGNbZF0pfTtOLndyaXRlUmVwZWF0ZWRVaW50MzI9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMud3JpdGVVbnNpZ25lZFZhcmludDMyXyhhLGNbZF0pfTsKTi53cml0ZVJlcGVhdGVkVWludDMyU3RyaW5nPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLndyaXRlVWludDMyU3RyaW5nKGEsY1tkXSl9O04ud3JpdGVSZXBlYXRlZFVpbnQ2ND1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZVVuc2lnbmVkVmFyaW50NjRfKGEsY1tkXSl9O04ud3JpdGVSZXBlYXRlZFVpbnQ2NFN0cmluZz1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZVVpbnQ2NFN0cmluZyhhLGNbZF0pfTtOLndyaXRlUmVwZWF0ZWRTaW50MzI9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMud3JpdGVaaWd6YWdWYXJpbnQzMl8oYSxjW2RdKX07Ck4ud3JpdGVSZXBlYXRlZFNpbnQ2ND1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZVppZ3phZ1ZhcmludDY0XyhhLGNbZF0pfTtOLndyaXRlUmVwZWF0ZWRTaW50NjRTdHJpbmc9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMud3JpdGVaaWd6YWdWYXJpbnQ2NFN0cmluZ18oYSxjW2RdKX07Ti53cml0ZVJlcGVhdGVkRml4ZWQzMj1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZUZpeGVkMzIoYSxjW2RdKX07Ti53cml0ZVJlcGVhdGVkRml4ZWQ2ND1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZUZpeGVkNjQoYSxjW2RdKX07Ck4ud3JpdGVSZXBlYXRlZEZpeGVkNjRTdHJpbmc9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMud3JpdGVGaXhlZDY0U3RyaW5nKGEsY1tkXSl9O04ud3JpdGVSZXBlYXRlZFNmaXhlZDMyPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLndyaXRlU2ZpeGVkMzIoYSxjW2RdKX07Ti53cml0ZVJlcGVhdGVkU2ZpeGVkNjQ9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMud3JpdGVTZml4ZWQ2NChhLGNbZF0pfTtOLndyaXRlUmVwZWF0ZWRTZml4ZWQ2NFN0cmluZz1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZVNmaXhlZDY0U3RyaW5nKGEsY1tkXSl9OwpOLndyaXRlUmVwZWF0ZWRGbG9hdD1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZUZsb2F0KGEsY1tkXSl9O04ud3JpdGVSZXBlYXRlZERvdWJsZT1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZURvdWJsZShhLGNbZF0pfTtOLndyaXRlUmVwZWF0ZWRCb29sPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLndyaXRlQm9vbChhLGNbZF0pfTtOLndyaXRlUmVwZWF0ZWRFbnVtPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLndyaXRlRW51bShhLGNbZF0pfTtOLndyaXRlUmVwZWF0ZWRTdHJpbmc9ZnVuY3Rpb24oYSl7aWYobnVsbCE9YSlmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyl0aGlzLndyaXRlU3RyaW5nKDEsYVtjXSl9OwpOLndyaXRlUmVwZWF0ZWRCeXRlcz1mdW5jdGlvbihhKXtpZihudWxsIT1hKWZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKXRoaXMud3JpdGVCeXRlcygxLGFbY10pfTtOLndyaXRlUmVwZWF0ZWRNZXNzYWdlPWZ1bmN0aW9uKGEsYyxkKXtpZihudWxsIT1jKWZvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKXt2YXIgZz10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKTtkKGNbZl0sdGhpcyk7dGhpcy5lbmREZWxpbWl0ZWRfKGcpfX07Ti53cml0ZVJlcGVhdGVkR3JvdXA9ZnVuY3Rpb24oYSxjLGQpe2lmKG51bGwhPWMpZm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDMpLGQoY1tmXSx0aGlzKSx0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsNCl9O04ud3JpdGVSZXBlYXRlZEZpeGVkSGFzaDY0PWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLndyaXRlRml4ZWRIYXNoNjQoYSxjW2RdKX07Ck4ud3JpdGVSZXBlYXRlZFZhcmludEhhc2g2ND1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZVZhcmludEhhc2g2NChhLGNbZF0pfTtOLndyaXRlUGFja2VkSW50MzI9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aCl7YT10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLmVuY29kZXJfLndyaXRlU2lnbmVkVmFyaW50MzIoY1tkXSk7dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07Ti53cml0ZVBhY2tlZEludDMyU3RyaW5nPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9YyYmYy5sZW5ndGgpe2E9dGhpcy5iZWdpbkRlbGltaXRlZF8oYSk7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy5lbmNvZGVyXy53cml0ZVNpZ25lZFZhcmludDMyKHBhcnNlSW50KGNbZF0sMTApKTt0aGlzLmVuZERlbGltaXRlZF8oYSl9fTsKTi53cml0ZVBhY2tlZEludDY0PWZ1bmN0aW9uKGEpe2lmKG51bGwhPWEmJmEubGVuZ3RoKXtmb3IodmFyIGM9dGhpcy5iZWdpbkRlbGltaXRlZF8oMSksZD0wO2Q8YS5sZW5ndGg7ZCsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVTaWduZWRWYXJpbnQ2NChhW2RdKTt0aGlzLmVuZERlbGltaXRlZF8oYyl9fTtOLndyaXRlUGFja2VkSW50NjRTdHJpbmc9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aCl7YT10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGY9WmQoY1tkXSk7dGhpcy5lbmNvZGVyXy53cml0ZVNwbGl0VmFyaW50NjQoZi5sbyxmLmhpKX10aGlzLmVuZERlbGltaXRlZF8oYSl9fTsKTi53cml0ZVBhY2tlZFVpbnQzMj1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKGNbZF0pO3RoaXMuZW5kRGVsaW1pdGVkXyhhKX19O04ud3JpdGVQYWNrZWRVaW50MzJTdHJpbmc9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aCl7YT10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQzMihwYXJzZUludChjW2RdLDEwKSk7dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07Ck4ud3JpdGVQYWNrZWRVaW50NjQ9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aCl7YT10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQ2NChjW2RdKTt0aGlzLmVuZERlbGltaXRlZF8oYSl9fTtOLndyaXRlUGFja2VkVWludDY0U3RyaW5nPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9YyYmYy5sZW5ndGgpe2E9dGhpcy5iZWdpbkRlbGltaXRlZF8oYSk7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspe3ZhciBmPUpkKGNbZF0pO3RoaXMuZW5jb2Rlcl8ud3JpdGVTcGxpdFZhcmludDY0KGYubG8sZi5oaSl9dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07Ck4ud3JpdGVQYWNrZWRTaW50MzI9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aCl7YT10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLmVuY29kZXJfLndyaXRlWmlnemFnVmFyaW50MzIoY1tkXSk7dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07Ti53cml0ZVBhY2tlZFNpbnQ2ND1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVaaWd6YWdWYXJpbnQ2NChjW2RdKTt0aGlzLmVuZERlbGltaXRlZF8oYSl9fTsKTi53cml0ZVBhY2tlZFNpbnQ2NFN0cmluZz1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVaaWd6YWdWYXJpbnQ2NChwYXJzZUludChjW2RdLDEwKSk7dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07Ti53cml0ZVBhY2tlZEZpeGVkMzI9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aClmb3IodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDIpLHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKDQqYy5sZW5ndGgpLGE9MDthPGMubGVuZ3RoO2ErKyl0aGlzLmVuY29kZXJfLndyaXRlVWludDMyKGNbYV0pfTsKTi53cml0ZVBhY2tlZEZpeGVkNjQ9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aClmb3IodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDIpLHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKDgqYy5sZW5ndGgpLGE9MDthPGMubGVuZ3RoO2ErKyl0aGlzLmVuY29kZXJfLndyaXRlVWludDY0KGNbYV0pfTtOLndyaXRlUGFja2VkRml4ZWQ2NFN0cmluZz1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKWZvcih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMiksdGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50MzIoOCpjLmxlbmd0aCksYT0wO2E8Yy5sZW5ndGg7YSsrKXt2YXIgZD1KZChjW2FdKTt0aGlzLmVuY29kZXJfLndyaXRlU3BsaXRGaXhlZDY0KGQubG8sZC5oaSl9fTsKTi53cml0ZVBhY2tlZFNmaXhlZDMyPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9YyYmYy5sZW5ndGgpZm9yKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwyKSx0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQzMig0KmMubGVuZ3RoKSxhPTA7YTxjLmxlbmd0aDthKyspdGhpcy5lbmNvZGVyXy53cml0ZUludDMyKGNbYV0pfTtOLndyaXRlUGFja2VkU2ZpeGVkNjQ9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aClmb3IodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDIpLHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKDgqYy5sZW5ndGgpLGE9MDthPGMubGVuZ3RoO2ErKyl0aGlzLmVuY29kZXJfLndyaXRlSW50NjQoY1thXSl9OwpOLndyaXRlUGFja2VkU2ZpeGVkNjRTdHJpbmc9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aClmb3IodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDIpLHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKDgqYy5sZW5ndGgpLGE9MDthPGMubGVuZ3RoO2ErKyl0aGlzLmVuY29kZXJfLndyaXRlSW50NjRTdHJpbmcoY1thXSl9O04ud3JpdGVQYWNrZWRGbG9hdD1mdW5jdGlvbihhKXtpZihudWxsIT1hJiZhLmxlbmd0aCl7dGhpcy53cml0ZUZpZWxkSGVhZGVyXygxLDIpO3RoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKDQqYS5sZW5ndGgpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKXRoaXMuZW5jb2Rlcl8ud3JpdGVGbG9hdChhW2NdKX19OwpOLndyaXRlUGFja2VkRG91YmxlPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9YyYmYy5sZW5ndGgpZm9yKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwyKSx0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQzMig4KmMubGVuZ3RoKSxhPTA7YTxjLmxlbmd0aDthKyspdGhpcy5lbmNvZGVyXy53cml0ZURvdWJsZShjW2FdKX07Ti53cml0ZVBhY2tlZEJvb2w9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aClmb3IodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDIpLHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKGMubGVuZ3RoKSxhPTA7YTxjLmxlbmd0aDthKyspdGhpcy5lbmNvZGVyXy53cml0ZUJvb2woY1thXSl9OwpOLndyaXRlUGFja2VkRW51bT1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVFbnVtKGNbZF0pO3RoaXMuZW5kRGVsaW1pdGVkXyhhKX19O04ud3JpdGVQYWNrZWRGaXhlZEhhc2g2ND1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKWZvcih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMiksdGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50MzIoOCpjLmxlbmd0aCksYT0wO2E8Yy5sZW5ndGg7YSsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVGaXhlZEhhc2g2NChjW2FdKX07Ck4ud3JpdGVQYWNrZWRWYXJpbnRIYXNoNjQ9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aCl7YT10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLmVuY29kZXJfLndyaXRlVmFyaW50SGFzaDY0KGNbZF0pO3RoaXMuZW5kRGVsaW1pdGVkXyhhKX19OwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX3Byb3RvYnVmX2pzL21hcC5qcwpmdW5jdGlvbiB4ZihhLGMpe3RoaXMuYXJyXz1hO3RoaXMudmFsdWVDdG9yXz1jO3RoaXMubWFwXz17fTt0aGlzLmFyckNsZWFuPSEwOzA8dGhpcy5hcnJfLmxlbmd0aCYmdGhpcy5sb2FkRnJvbUFycmF5XygpfXhmLnByb3RvdHlwZS5sb2FkRnJvbUFycmF5Xz1mdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5hcnJfLmxlbmd0aDthKyspe3ZhciBjPXRoaXMuYXJyX1thXSxkPWNbMF07dGhpcy5tYXBfW2QudG9TdHJpbmcoKV09bmV3IHlmKGQsY1sxXSl9dGhpcy5hcnJDbGVhbj0hMH07CnhmLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7aWYodGhpcy5hcnJDbGVhbil7aWYodGhpcy52YWx1ZUN0b3JfKXt2YXIgYT10aGlzLm1hcF8sYztmb3IoYyBpbiBhKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGMpKXt2YXIgZD1hW2NdLnZhbHVlV3JhcHBlcjtkJiZkLnRvQXJyYXkoKX19fWVsc2V7dGhpcy5hcnJfLmxlbmd0aD0wO2E9dGhpcy5zdHJpbmdLZXlzXygpO2Euc29ydCgpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBmPXRoaXMubWFwX1thW2NdXTsoZD1mLnZhbHVlV3JhcHBlcikmJmQudG9BcnJheSgpO3RoaXMuYXJyXy5wdXNoKFtmLmtleSxmLnZhbHVlXSl9dGhpcy5hcnJDbGVhbj0hMH1yZXR1cm4gdGhpcy5hcnJffTsKeGYucHJvdG90eXBlLnRvT2JqZWN0PWZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBkPXRoaXMudG9BcnJheSgpLGY9W10sZz0wO2c8ZC5sZW5ndGg7ZysrKXt2YXIgbD10aGlzLm1hcF9bZFtnXVswXS50b1N0cmluZygpXTt0aGlzLndyYXBFbnRyeV8obCk7dmFyIGs9bC52YWx1ZVdyYXBwZXI7az9mLnB1c2goW2wua2V5LGMoYSxrKV0pOmYucHVzaChbbC5rZXksbC52YWx1ZV0pfXJldHVybiBmfTtmdW5jdGlvbiB6ZyhhKXt0aGlzLmlkeF89MDt0aGlzLmFycl89YX16Zy5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlkeF88dGhpcy5hcnJfLmxlbmd0aD97ZG9uZTohMSx2YWx1ZTp0aGlzLmFycl9bdGhpcy5pZHhfKytdfTp7ZG9uZTohMCx2YWx1ZTp2b2lkIDB9fTsidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmKHpnLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KTtOPXhmLnByb3RvdHlwZTtOLmdldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0cmluZ0tleXNfKCkubGVuZ3RofTsKTi5jbGVhcj1mdW5jdGlvbigpe3RoaXMubWFwXz17fTt0aGlzLmFyckNsZWFuPSExfTtOLmRlbD1mdW5jdGlvbihhKXthPWEudG9TdHJpbmcoKTt2YXIgYz10aGlzLm1hcF8uaGFzT3duUHJvcGVydHkoYSk7ZGVsZXRlIHRoaXMubWFwX1thXTt0aGlzLmFyckNsZWFuPSExO3JldHVybiBjfTtOLmdldEVudHJ5TGlzdD1mdW5jdGlvbigpe3ZhciBhPVtdLGM9dGhpcy5zdHJpbmdLZXlzXygpO2Muc29ydCgpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgZj10aGlzLm1hcF9bY1tkXV07YS5wdXNoKFtmLmtleSxmLnZhbHVlXSl9cmV0dXJuIGF9O04uZW50cmllcz1mdW5jdGlvbigpe3ZhciBhPVtdLGM9dGhpcy5zdHJpbmdLZXlzXygpO2Muc29ydCgpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgZj10aGlzLm1hcF9bY1tkXV07YS5wdXNoKFtmLmtleSx0aGlzLndyYXBFbnRyeV8oZildKX1yZXR1cm4gbmV3IHpnKGEpfTsKTi5rZXlzPWZ1bmN0aW9uKCl7dmFyIGE9W10sYz10aGlzLnN0cmluZ0tleXNfKCk7Yy5zb3J0KCk7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspYS5wdXNoKHRoaXMubWFwX1tjW2RdXS5rZXkpO3JldHVybiBuZXcgemcoYSl9O04udmFsdWVzPWZ1bmN0aW9uKCl7dmFyIGE9W10sYz10aGlzLnN0cmluZ0tleXNfKCk7Yy5zb3J0KCk7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspYS5wdXNoKHRoaXMud3JhcEVudHJ5Xyh0aGlzLm1hcF9bY1tkXV0pKTtyZXR1cm4gbmV3IHpnKGEpfTtOLmZvckVhY2g9ZnVuY3Rpb24oYSxjKXt2YXIgZD10aGlzLnN0cmluZ0tleXNfKCk7ZC5zb3J0KCk7Zm9yKHZhciBmPTA7ZjxkLmxlbmd0aDtmKyspe3ZhciBnPXRoaXMubWFwX1tkW2ZdXTthLmNhbGwoYyx0aGlzLndyYXBFbnRyeV8oZyksZy5rZXksdGhpcyl9fTsKTi5zZXQ9ZnVuY3Rpb24oYSxjKXt2YXIgZD1uZXcgeWYoYSk7dGhpcy52YWx1ZUN0b3JfPyhkLnZhbHVlV3JhcHBlcj1jLGQudmFsdWU9Yy50b0FycmF5KCkpOmQudmFsdWU9Yzt0aGlzLm1hcF9bYS50b1N0cmluZygpXT1kO3RoaXMuYXJyQ2xlYW49ITE7cmV0dXJuIHRoaXN9O04ud3JhcEVudHJ5Xz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy52YWx1ZUN0b3JfPyhhLnZhbHVlV3JhcHBlcnx8KGEudmFsdWVXcmFwcGVyPW5ldyB0aGlzLnZhbHVlQ3Rvcl8oYS52YWx1ZSkpLGEudmFsdWVXcmFwcGVyKTphLnZhbHVlfTtOLmdldD1mdW5jdGlvbihhKXtpZihhPXRoaXMubWFwX1thLnRvU3RyaW5nKCldKXJldHVybiB0aGlzLndyYXBFbnRyeV8oYSl9O04uaGFzPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRvU3RyaW5nKClpbiB0aGlzLm1hcF99OwpOLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbihhLGMsZCxmLGcpe3ZhciBsPXRoaXMuc3RyaW5nS2V5c18oKTtsLnNvcnQoKTtmb3IodmFyIGs9MDtrPGwubGVuZ3RoO2srKyl7dmFyIG49dGhpcy5tYXBfW2xba11dO2MuYmVnaW5TdWJNZXNzYWdlKGEpO2QuY2FsbChjLDEsbi5rZXkpO3RoaXMudmFsdWVDdG9yXz9mLmNhbGwoYywyLHRoaXMud3JhcEVudHJ5XyhuKSxnKTpmLmNhbGwoYywyLG4udmFsdWUpO2MuZW5kU3ViTWVzc2FnZSgpfX07ZnVuY3Rpb24gQWcoYSxjLGQpe2Zvcih2YXIgZj11Zi5wcm90b3R5cGUucmVhZFN0cmluZyxnPXVmLnByb3RvdHlwZS5yZWFkTWVzc2FnZSxsPSIiLGs9dm9pZCAwO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspe3ZhciBuPWMuZ2V0RmllbGROdW1iZXIoKTsxPT1uP2w9Zi5jYWxsKGMpOjI9PW4mJihhLnZhbHVlQ3Rvcl8/KGs9bmV3IGEudmFsdWVDdG9yXyxnLmNhbGwoYyxrLGQpKTprPWcuY2FsbChjKSl9YS5zZXQobCxrKX0KTi5zdHJpbmdLZXlzXz1mdW5jdGlvbigpe3ZhciBhPXRoaXMubWFwXyxjPVtdLGQ7Zm9yKGQgaW4gYSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxkKSYmYy5wdXNoKGQpO3JldHVybiBjfTtmdW5jdGlvbiB5ZihhLGMpe3RoaXMua2V5PWE7dGhpcy52YWx1ZT1jO3RoaXMudmFsdWVXcmFwcGVyPXZvaWQgMH07Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfcHJvdG9idWZfanMvbWVzc2FnZS5qcwpmdW5jdGlvbiBCZygpe312YXIgQ2c9ImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXk7QmcucHJvdG90eXBlLmdldEpzUGJNZXNzYWdlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZXNzYWdlSWRffTtmdW5jdGlvbiBEZyhhLGMpe3JldHVybiBjK2EuYXJyYXlJbmRleE9mZnNldF99ZnVuY3Rpb24gRWcoYSxjKXtyZXR1cm4gYy1hLmFycmF5SW5kZXhPZmZzZXRffQpmdW5jdGlvbiBGZyhhLGMsZCxmKXthLndyYXBwZXJzXz1udWxsO2N8fChjPVtdKTthLm1lc3NhZ2VJZF89dm9pZCAwO2EuYXJyYXlJbmRleE9mZnNldF89LTE7YS5hcnJheT1jO0dnKGEpO2EuY29udmVydGVkUHJpbWl0aXZlRmllbGRzXz17fTtpZihkKWZvcihjPTA7YzxkLmxlbmd0aDtjKyspe3ZhciBnPWRbY107ZzxhLnBpdm90Xz8oZz1EZyhhLGcpLGEuYXJyYXlbZ109YS5hcnJheVtnXXx8SGcpOihJZyhhKSxhLmV4dGVuc2lvbk9iamVjdF9bZ109YS5leHRlbnNpb25PYmplY3RfW2ddfHxIZyl9aWYoZiYmZi5sZW5ndGgpZm9yKGM9MDtjPGYubGVuZ3RoO2MrKylKZyhhLGZbY10pfXZhciBIZz1PYmplY3QuZnJlZXplP09iamVjdC5mcmVlemUoW10pOltdO2Z1bmN0aW9uIEtnKGEpe3JldHVybiBRYihhKX1mdW5jdGlvbiBMZyhhKXtyZXR1cm4gbnVsbCE9PWEmJiJvYmplY3QiPT10eXBlb2YgYSYmIUtnKGEpJiYhKENnJiZhIGluc3RhbmNlb2YgVWludDhBcnJheSl9CmZ1bmN0aW9uIEdnKGEpe3ZhciBjPWEuYXJyYXkubGVuZ3RoO2lmKGMpey0tYzt2YXIgZD1hLmFycmF5W2NdO2lmKExnKGQpKXthLnBpdm90Xz1FZyhhLGMpO2EuZXh0ZW5zaW9uT2JqZWN0Xz1kO3JldHVybn19YS5waXZvdF89TnVtYmVyLk1BWF9WQUxVRX1mdW5jdGlvbiBJZyhhKXt2YXIgYz1EZyhhLGEucGl2b3RfKTthLmFycmF5W2NdfHwoYS5leHRlbnNpb25PYmplY3RfPWEuYXJyYXlbY109e30pfWZ1bmN0aW9uIE1nKGEsYyxkKXtmb3IodmFyIGY9W10sZz0wO2c8YS5sZW5ndGg7ZysrKWZbZ109Yy5jYWxsKGFbZ10sZCxhW2ddKTtyZXR1cm4gZn1mdW5jdGlvbiBOZyhhLGMpe2lmKGM8YS5waXZvdF8pe2M9RGcoYSxjKTt2YXIgZD1hLmFycmF5W2NdO3JldHVybiBkPT09SGc/YS5hcnJheVtjXT1bXTpkfWlmKGEuZXh0ZW5zaW9uT2JqZWN0XylyZXR1cm4gZD1hLmV4dGVuc2lvbk9iamVjdF9bY10sZD09PUhnP2EuZXh0ZW5zaW9uT2JqZWN0X1tjXT1bXTpkfQpmdW5jdGlvbiBPZyhhLGMpe3JldHVybiBOZyhhLGMpfWZ1bmN0aW9uIFBnKGEsYyl7YT1OZyhhLGMpO3JldHVybiBudWxsPT1hP2E6K2F9ZnVuY3Rpb24gUWcoYSl7dmFyIGM9T2coYSwxKTthLmNvbnZlcnRlZFByaW1pdGl2ZUZpZWxkc198fChhLmNvbnZlcnRlZFByaW1pdGl2ZUZpZWxkc189e30pO2lmKCFhLmNvbnZlcnRlZFByaW1pdGl2ZUZpZWxkc19bMV0pe2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKWNbZF09K2NbZF07YS5jb252ZXJ0ZWRQcmltaXRpdmVGaWVsZHNfWzFdPSEwfXJldHVybiBjfWZ1bmN0aW9uIFJnKGEpe2lmKG51bGw9PWF8fEhiKGEpKXJldHVybiBhO2lmKENnJiZhIGluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm4gb2QoYSk7ZGMoIkNhbm5vdCBjb2VyY2UgdG8gYjY0IHN0cmluZzogIitMYihhKSk7cmV0dXJuIG51bGx9CmZ1bmN0aW9uIFNnKGEpe2lmKG51bGw9PWF8fGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBhO2lmKEhiKGEpKXJldHVybiBxZChhKTtkYygiQ2Fubm90IGNvZXJjZSB0byBVaW50OEFycmF5OiAiK0xiKGEpKTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBUZyhhKXtVZyhhKTtyZXR1cm4hYS5sZW5ndGh8fEhiKGFbMF0pP2E6aGMoYSxSZyl9ZnVuY3Rpb24gVmcoYSl7VWcoYSk7cmV0dXJuIWEubGVuZ3RofHxhWzBdaW5zdGFuY2VvZiBVaW50OEFycmF5P2E6aGMoYSxTZyl9ZnVuY3Rpb24gVWcoYSl7aWYoYSYmMTxhLmxlbmd0aCl7dmFyIGM9TGIoYVswXSk7Z2MoYSxmdW5jdGlvbihkKXtMYihkKSE9YyYmZGMoIkluY29uc2lzdGVudCB0eXBlIGluIEpTUEIgcmVwZWF0ZWQgZmllbGQgYXJyYXkuIEdvdCAiK0xiKGQpKyIgZXhwZWN0ZWQgIitjKX0pfX1mdW5jdGlvbiBXZyhhLGMsZCl7YT1OZyhhLGMpO3JldHVybiBudWxsPT1hP2Q6YX0KZnVuY3Rpb24gWGcoYSxjKXthPVBnKGEsYyk7cmV0dXJuIG51bGw9PWE/MDphfWZ1bmN0aW9uIFdoKGEsYyxkKXthLndyYXBwZXJzX3x8KGEud3JhcHBlcnNfPXt9KTtpZigxIGluIGEud3JhcHBlcnNfKXJldHVybiBhLndyYXBwZXJzX1sxXTtpZighYylyZXR1cm4gYz1OZyhhLDEpLGN8fChjPVtdLFhoKGEsMSxjKSksYS53cmFwcGVyc19bMV09bmV3IHhmKGMsZCl9ZnVuY3Rpb24gWGgoYSxjLGQpe2M8YS5waXZvdF8/YS5hcnJheVtEZyhhLGMpXT1kOihJZyhhKSxhLmV4dGVuc2lvbk9iamVjdF9bY109ZCl9ZnVuY3Rpb24gWWgoYSxjLGQpe1poKGEsYyxkLDApfWZ1bmN0aW9uICRoKGEsYyxkKXtaaChhLGMsZCwwKX1mdW5jdGlvbiBhaShhLGMsZCl7WmgoYSxjLGQsIiIpfWZ1bmN0aW9uIGJpKGEsYyxkKXtaaChhLGMsZCwwKX1mdW5jdGlvbiBaaChhLGMsZCxmKXtkIT09Zj9YaChhLGMsZCk6YS5hcnJheVtEZyhhLGMpXT1udWxsfQpmdW5jdGlvbiBjaShhLGMsZCl7YT1PZyhhLDEpO3ZvaWQgMCE9ZD9hLnNwbGljZShkLDAsYyk6YS5wdXNoKGMpfWZ1bmN0aW9uIGRpKGEsYyxkLGYpeyhkPUpnKGEsZCkpJiZkIT09YyYmdm9pZCAwIT09ZiYmKGEud3JhcHBlcnNfJiZkIGluIGEud3JhcHBlcnNfJiYoYS53cmFwcGVyc19bZF09dm9pZCAwKSxYaChhLGQsdm9pZCAwKSk7WGgoYSxjLGYpfWZ1bmN0aW9uIEpnKGEsYyl7Zm9yKHZhciBkLGYsZz0wO2c8Yy5sZW5ndGg7ZysrKXt2YXIgbD1jW2ddLGs9TmcoYSxsKTtudWxsIT1rJiYoZD1sLGY9ayxYaChhLGwsdm9pZCAwKSl9cmV0dXJuIGQ/KFhoKGEsZCxmKSxkKTowfWZ1bmN0aW9uIGVpKGEsYyxkKXthLndyYXBwZXJzX3x8KGEud3JhcHBlcnNfPXt9KTtpZighYS53cmFwcGVyc19bZF0pe3ZhciBmPU5nKGEsZCk7ZiYmKGEud3JhcHBlcnNfW2RdPW5ldyBjKGYpKX1yZXR1cm4gYS53cmFwcGVyc19bZF19CmZ1bmN0aW9uIGZpKGEsYyxkKXtnaShhLGMsZCk7Yz1hLndyYXBwZXJzX1tkXTtjPT1IZyYmKGM9YS53cmFwcGVyc19bZF09W10pO3JldHVybiBjfWZ1bmN0aW9uIGdpKGEsYyxkKXthLndyYXBwZXJzX3x8KGEud3JhcHBlcnNfPXt9KTtpZighYS53cmFwcGVyc19bZF0pe2Zvcih2YXIgZj1PZyhhLGQpLGc9W10sbD0wO2w8Zi5sZW5ndGg7bCsrKWdbbF09bmV3IGMoZltsXSk7YS53cmFwcGVyc19bZF09Z319ZnVuY3Rpb24gaGkoYSxjLGQpe2Eud3JhcHBlcnNffHwoYS53cmFwcGVyc189e30pO3ZhciBmPWQ/ZC50b0FycmF5KCk6ZDthLndyYXBwZXJzX1tjXT1kO1hoKGEsYyxmKX1mdW5jdGlvbiBpaShhLGMsZCxmKXthLndyYXBwZXJzX3x8KGEud3JhcHBlcnNfPXt9KTt2YXIgZz1mP2YudG9BcnJheSgpOmY7YS53cmFwcGVyc19bY109ZjtkaShhLGMsZCxnKX0KZnVuY3Rpb24gamkoYSxjLGQpe2Eud3JhcHBlcnNffHwoYS53cmFwcGVyc189e30pO2Q9ZHx8W107Zm9yKHZhciBmPVtdLGc9MDtnPGQubGVuZ3RoO2crKylmW2ddPWRbZ10udG9BcnJheSgpO2Eud3JhcHBlcnNfW2NdPWQ7WGgoYSxjLGYpfWZ1bmN0aW9uIGtpKGEsYyxkLGYsZyl7Z2koYSxmLGMpO3ZhciBsPWEud3JhcHBlcnNfW2NdO2x8fChsPWEud3JhcHBlcnNfW2NdPVtdKTtkPWQ/ZDpuZXcgZjthPU9nKGEsYyk7dm9pZCAwIT1nPyhsLnNwbGljZShnLDAsZCksYS5zcGxpY2UoZywwLGQudG9BcnJheSgpKSk6KGwucHVzaChkKSxhLnB1c2goZC50b0FycmF5KCkpKTtyZXR1cm4gZH1OPUJnLnByb3RvdHlwZTsKTi5zeW5jTWFwRmllbGRzXz1mdW5jdGlvbigpe2lmKHRoaXMud3JhcHBlcnNfKWZvcih2YXIgYSBpbiB0aGlzLndyYXBwZXJzXyl7dmFyIGM9dGhpcy53cmFwcGVyc19bYV07aWYoUWIoYykpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspY1tkXSYmY1tkXS50b0FycmF5KCk7ZWxzZSBjJiZjLnRvQXJyYXkoKX19O04udG9BcnJheT1mdW5jdGlvbigpe3RoaXMuc3luY01hcEZpZWxkc18oKTtyZXR1cm4gdGhpcy5hcnJheX07Ti50b1N0cmluZz1mdW5jdGlvbigpe3RoaXMuc3luY01hcEZpZWxkc18oKTtyZXR1cm4gdGhpcy5hcnJheS50b1N0cmluZygpfTsKTi5nZXRFeHRlbnNpb249ZnVuY3Rpb24oYSl7aWYodGhpcy5leHRlbnNpb25PYmplY3RfKXt0aGlzLndyYXBwZXJzX3x8KHRoaXMud3JhcHBlcnNfPXt9KTt2YXIgYz1hLmZpZWxkSW5kZXg7aWYoYS5pc1JlcGVhdGVkKXtpZihhLmlzTWVzc2FnZVR5cGUoKSlyZXR1cm4gdGhpcy53cmFwcGVyc19bY118fCh0aGlzLndyYXBwZXJzX1tjXT1oYyh0aGlzLmV4dGVuc2lvbk9iamVjdF9bY118fFtdLGZ1bmN0aW9uKGQpe3JldHVybiBuZXcgYS5jdG9yKGQpfSkpLHRoaXMud3JhcHBlcnNfW2NdfWVsc2UgaWYoYS5pc01lc3NhZ2VUeXBlKCkpcmV0dXJuIXRoaXMud3JhcHBlcnNfW2NdJiZ0aGlzLmV4dGVuc2lvbk9iamVjdF9bY10mJih0aGlzLndyYXBwZXJzX1tjXT1uZXcgYS5jdG9yKHRoaXMuZXh0ZW5zaW9uT2JqZWN0X1tjXSkpLHRoaXMud3JhcHBlcnNfW2NdO3JldHVybiB0aGlzLmV4dGVuc2lvbk9iamVjdF9bY119fTsKTi5zZXRFeHRlbnNpb249ZnVuY3Rpb24oYSxjKXt0aGlzLndyYXBwZXJzX3x8KHRoaXMud3JhcHBlcnNfPXt9KTtJZyh0aGlzKTt2YXIgZD1hLmZpZWxkSW5kZXg7YS5pc1JlcGVhdGVkPyhjPWN8fFtdLGEuaXNNZXNzYWdlVHlwZSgpPyh0aGlzLndyYXBwZXJzX1tkXT1jLHRoaXMuZXh0ZW5zaW9uT2JqZWN0X1tkXT1oYyhjLGZ1bmN0aW9uKGYpe3JldHVybiBmLnRvQXJyYXkoKX0pKTp0aGlzLmV4dGVuc2lvbk9iamVjdF9bZF09Yyk6YS5pc01lc3NhZ2VUeXBlKCk/KHRoaXMud3JhcHBlcnNfW2RdPWMsdGhpcy5leHRlbnNpb25PYmplY3RfW2RdPWM/Yy50b0FycmF5KCk6Yyk6dGhpcy5leHRlbnNpb25PYmplY3RfW2RdPWM7cmV0dXJuIHRoaXN9O04uY2xvbmVNZXNzYWdlPWZ1bmN0aW9uKCl7cmV0dXJuIGxpKHRoaXMpfTtOLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIGxpKHRoaXMpfTsKZnVuY3Rpb24gbGkoYSl7cmV0dXJuIG5ldyBhLmNvbnN0cnVjdG9yKG1pKGEudG9BcnJheSgpKSl9ZnVuY3Rpb24gbWkoYSl7aWYoUWIoYSkpe2Zvcih2YXIgYz1BcnJheShhLmxlbmd0aCksZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZj1hW2RdO251bGwhPWYmJihjW2RdPSJvYmplY3QiPT10eXBlb2YgZj9taShmKTpmKX1yZXR1cm4gY31pZihDZyYmYSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpcmV0dXJuIG5ldyBVaW50OEFycmF5KGEpO2M9e307Zm9yKGQgaW4gYSlmPWFbZF0sbnVsbCE9ZiYmKGNbZF09Im9iamVjdCI9PXR5cGVvZiBmP21pKGYpOmYpO3JldHVybiBjfTsKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9wcm90b2J1Zl9qcy9kZWJ1Zy5qcwovLyMgc291cmNlVVJMPWJ1aWxkOi9iYXplbC1vdXQvaG9zdC9iaW4vZXh0ZXJuYWwvb3JnX3RlbnNvcmZsb3cvdGVuc29yZmxvdy9jb3JlL2V4YW1wbGVfcHJvdG9zLmpzCmZ1bmN0aW9uIG5pKGEpe0ZnKHRoaXMsYSxvaSxudWxsKX1UYihuaSxCZyk7ZnVuY3Rpb24gQmooYSl7RmcodGhpcyxhLENqLG51bGwpfVRiKEJqLEJnKTtmdW5jdGlvbiBEaihhKXtGZyh0aGlzLGEsRWosbnVsbCl9VGIoRGosQmcpO2Z1bmN0aW9uIEZqKGEpe0ZnKHRoaXMsYSxudWxsLEdqKX1UYihGaixCZyk7ZnVuY3Rpb24gSGooYSl7RmcodGhpcyxhLG51bGwsbnVsbCl9VGIoSGosQmcpO2Z1bmN0aW9uIElqKGEpe0ZnKHRoaXMsYSxKaixudWxsKX1UYihJaixCZyk7ZnVuY3Rpb24gS2ooYSl7RmcodGhpcyxhLG51bGwsbnVsbCl9VGIoS2osQmcpO3ZhciBvaT1bMV07Tj1uaS5wcm90b3R5cGU7Ti50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gTGooYSx0aGlzKX07ZnVuY3Rpb24gTGooYSxjKXt2YXIgZD17dmFsdWVMaXN0OmMuZ2V0VmFsdWVMaXN0X2FzQjY0KCl9O2EmJihkLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBkfQpmdW5jdGlvbiBNaihhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9Yy5yZWFkQnl0ZXMoKTthLmFkZFZhbHVlKGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1OLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyB3ZjtOaih0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTtmdW5jdGlvbiBOaihhLGMpe2E9YS5nZXRWYWx1ZUxpc3RfYXNVOCgpOzA8YS5sZW5ndGgmJmMud3JpdGVSZXBlYXRlZEJ5dGVzKGEpfU4uZ2V0VmFsdWVMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIE9nKHRoaXMsMSl9O04uZ2V0VmFsdWVMaXN0X2FzQjY0PWZ1bmN0aW9uKCl7cmV0dXJuIFRnKHRoaXMuZ2V0VmFsdWVMaXN0KCkpfTtOLmdldFZhbHVlTGlzdF9hc1U4PWZ1bmN0aW9uKCl7cmV0dXJuIFZnKHRoaXMuZ2V0VmFsdWVMaXN0KCkpfTsKTi5zZXRWYWx1ZUxpc3Q9ZnVuY3Rpb24oYSl7WGgodGhpcywxLGF8fFtdKX07Ti5hZGRWYWx1ZT1mdW5jdGlvbihhLGMpe2NpKHRoaXMsYSxjKX07Ti5jbGVhclZhbHVlTGlzdD1mdW5jdGlvbigpe3RoaXMuc2V0VmFsdWVMaXN0KFtdKX07dmFyIENqPVsxXTtOPUJqLnByb3RvdHlwZTtOLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBPaihhLHRoaXMpfTtmdW5jdGlvbiBPaihhLGMpe3ZhciBkLGY9e3ZhbHVlTGlzdDpudWxsPT0oZD1RZyhjKSk/dm9pZCAwOmR9O2EmJihmLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBmfWZ1bmN0aW9uIFBqKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1jLnJlYWRQYWNrZWRGbG9hdCgpO2Euc2V0VmFsdWVMaXN0KGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX0KTi5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgd2Y7UWoodGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07ZnVuY3Rpb24gUWooYSxjKXthPWEuZ2V0VmFsdWVMaXN0KCk7MDxhLmxlbmd0aCYmYy53cml0ZVBhY2tlZEZsb2F0KGEpfU4uZ2V0VmFsdWVMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIFFnKHRoaXMpfTtOLnNldFZhbHVlTGlzdD1mdW5jdGlvbihhKXtYaCh0aGlzLDEsYXx8W10pfTtOLmFkZFZhbHVlPWZ1bmN0aW9uKGEsYyl7Y2kodGhpcyxhLGMpfTtOLmNsZWFyVmFsdWVMaXN0PWZ1bmN0aW9uKCl7dGhpcy5zZXRWYWx1ZUxpc3QoW10pfTt2YXIgRWo9WzFdO049RGoucHJvdG90eXBlO04udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIFJqKGEsdGhpcyl9O2Z1bmN0aW9uIFJqKGEsYyl7dmFyIGQsZj17dmFsdWVMaXN0Om51bGw9PShkPU9nKGMsMSkpP3ZvaWQgMDpkfTthJiYoZi4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZn0KZnVuY3Rpb24gU2ooYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPWMucmVhZFBhY2tlZEludDY0KCk7YS5zZXRWYWx1ZUxpc3QoZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfU4uc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IHdmO1RqKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9O2Z1bmN0aW9uIFRqKGEsYyl7YT1hLmdldFZhbHVlTGlzdCgpOzA8YS5sZW5ndGgmJmMud3JpdGVQYWNrZWRJbnQ2NChhKX1OLmdldFZhbHVlTGlzdD1mdW5jdGlvbigpe3JldHVybiBPZyh0aGlzLDEpfTtOLnNldFZhbHVlTGlzdD1mdW5jdGlvbihhKXtYaCh0aGlzLDEsYXx8W10pfTtOLmFkZFZhbHVlPWZ1bmN0aW9uKGEsYyl7Y2kodGhpcyxhLGMpfTtOLmNsZWFyVmFsdWVMaXN0PWZ1bmN0aW9uKCl7dGhpcy5zZXRWYWx1ZUxpc3QoW10pfTsKdmFyIEdqPVtbMSwyLDNdXTtOPUZqLnByb3RvdHlwZTtOLmdldEtpbmRDYXNlPWZ1bmN0aW9uKCl7cmV0dXJuIEpnKHRoaXMsR2pbMF0pfTtOLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBVaihhLHRoaXMpfTtmdW5jdGlvbiBVaihhLGMpe3ZhciBkLGY9e2J5dGVzTGlzdDooZD1jLmdldEJ5dGVzTGlzdCgpKSYmTGooYSxkKSxmbG9hdExpc3Q6KGQ9Yy5nZXRGbG9hdExpc3QoKSkmJk9qKGEsZCksaW50NjRMaXN0OihkPWMuZ2V0SW50NjRMaXN0KCkpJiZSaihhLGQpfTthJiYoZi4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZn0KZnVuY3Rpb24gVmooYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPW5ldyBuaTtjLnJlYWRNZXNzYWdlKGQsTWopO2Euc2V0Qnl0ZXNMaXN0KGQpO2JyZWFrO2Nhc2UgMjpkPW5ldyBCajtjLnJlYWRNZXNzYWdlKGQsUGopO2Euc2V0RmxvYXRMaXN0KGQpO2JyZWFrO2Nhc2UgMzpkPW5ldyBEajtjLnJlYWRNZXNzYWdlKGQsU2opO2Euc2V0SW50NjRMaXN0KGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1OLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyB3ZjtXaih0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTsKZnVuY3Rpb24gV2ooYSxjKXt2YXIgZD1hLmdldEJ5dGVzTGlzdCgpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDEsZCxOaik7ZD1hLmdldEZsb2F0TGlzdCgpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDIsZCxRaik7ZD1hLmdldEludDY0TGlzdCgpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDMsZCxUail9Ti5nZXRCeXRlc0xpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gZWkodGhpcyxuaSwxKX07Ti5zZXRCeXRlc0xpc3Q9ZnVuY3Rpb24oYSl7aWkodGhpcywxLEdqWzBdLGEpfTtOLmNsZWFyQnl0ZXNMaXN0PWZ1bmN0aW9uKCl7dGhpcy5zZXRCeXRlc0xpc3Qodm9pZCAwKX07Ti5oYXNCeXRlc0xpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9TmcodGhpcywxKX07Ti5nZXRGbG9hdExpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gZWkodGhpcyxCaiwyKX07Ti5zZXRGbG9hdExpc3Q9ZnVuY3Rpb24oYSl7aWkodGhpcywyLEdqWzBdLGEpfTtOLmNsZWFyRmxvYXRMaXN0PWZ1bmN0aW9uKCl7dGhpcy5zZXRGbG9hdExpc3Qodm9pZCAwKX07Ck4uaGFzRmxvYXRMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPU5nKHRoaXMsMil9O04uZ2V0SW50NjRMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIGVpKHRoaXMsRGosMyl9O04uc2V0SW50NjRMaXN0PWZ1bmN0aW9uKGEpe2lpKHRoaXMsMyxHalswXSxhKX07Ti5jbGVhckludDY0TGlzdD1mdW5jdGlvbigpe3RoaXMuc2V0SW50NjRMaXN0KHZvaWQgMCl9O04uaGFzSW50NjRMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPU5nKHRoaXMsMyl9O0hqLnByb3RvdHlwZS50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gWGooYSx0aGlzKX07ZnVuY3Rpb24gWGooYSxjKXt2YXIgZCxmPXtmZWF0dXJlTWFwOihkPWMuZ2V0RmVhdHVyZU1hcCgpKT9kLnRvT2JqZWN0KGEsVWopOltdfTthJiYoZi4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZn0KZnVuY3Rpb24gWWooYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPWEuZ2V0RmVhdHVyZU1hcCgpO2MucmVhZE1lc3NhZ2UoZCxmdW5jdGlvbihmLGcpe0FnKGYsZyxWail9KTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9SGoucHJvdG90eXBlLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyB3Zjtaaih0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTtmdW5jdGlvbiBaaihhLGMpeyhhPWEuZ2V0RmVhdHVyZU1hcCghMCkpJiYwPGEuZ2V0TGVuZ3RoKCkmJmEuc2VyaWFsaXplQmluYXJ5KDEsYyx3Zi5wcm90b3R5cGUud3JpdGVTdHJpbmcsd2YucHJvdG90eXBlLndyaXRlTWVzc2FnZSxXail9SGoucHJvdG90eXBlLmdldEZlYXR1cmVNYXA9ZnVuY3Rpb24oYSl7cmV0dXJuIFdoKHRoaXMsYSxGail9OwpIai5wcm90b3R5cGUuY2xlYXJGZWF0dXJlTWFwPWZ1bmN0aW9uKCl7dGhpcy5nZXRGZWF0dXJlTWFwKCkuY2xlYXIoKX07dmFyIEpqPVsxXTtOPUlqLnByb3RvdHlwZTtOLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBhayhhLHRoaXMpfTtmdW5jdGlvbiBhayhhLGMpe3ZhciBkPXtmZWF0dXJlTGlzdDpNZyhjLmdldEZlYXR1cmVMaXN0KCksVWosYSl9O2EmJihkLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBkfWZ1bmN0aW9uIGJrKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1uZXcgRmo7Yy5yZWFkTWVzc2FnZShkLFZqKTthLmFkZEZlYXR1cmUoZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfU4uc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IHdmO2NrKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9OwpmdW5jdGlvbiBjayhhLGMpe2E9YS5nZXRGZWF0dXJlTGlzdCgpOzA8YS5sZW5ndGgmJmMud3JpdGVSZXBlYXRlZE1lc3NhZ2UoMSxhLFdqKX1OLmdldEZlYXR1cmVMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIGZpKHRoaXMsRmosMSl9O04uc2V0RmVhdHVyZUxpc3Q9ZnVuY3Rpb24oYSl7amkodGhpcywxLGEpfTtOLmFkZEZlYXR1cmU9ZnVuY3Rpb24oYSxjKXtyZXR1cm4ga2kodGhpcywxLGEsRmosYyl9O04uY2xlYXJGZWF0dXJlTGlzdD1mdW5jdGlvbigpe3RoaXMuc2V0RmVhdHVyZUxpc3QoW10pfTtLai5wcm90b3R5cGUudG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIGRrKGEsdGhpcyl9O2Z1bmN0aW9uIGRrKGEsYyl7dmFyIGQsZj17ZmVhdHVyZUxpc3RNYXA6KGQ9Yy5nZXRGZWF0dXJlTGlzdE1hcCgpKT9kLnRvT2JqZWN0KGEsYWspOltdfTthJiYoZi4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZn0KZnVuY3Rpb24gZWsoYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPWEuZ2V0RmVhdHVyZUxpc3RNYXAoKTtjLnJlYWRNZXNzYWdlKGQsZnVuY3Rpb24oZixnKXtBZyhmLGcsYmspfSk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfUtqLnByb3RvdHlwZS5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgd2Y7ZmsodGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07ZnVuY3Rpb24gZmsoYSxjKXsoYT1hLmdldEZlYXR1cmVMaXN0TWFwKCEwKSkmJjA8YS5nZXRMZW5ndGgoKSYmYS5zZXJpYWxpemVCaW5hcnkoMSxjLHdmLnByb3RvdHlwZS53cml0ZVN0cmluZyx3Zi5wcm90b3R5cGUud3JpdGVNZXNzYWdlLGNrKX1Lai5wcm90b3R5cGUuZ2V0RmVhdHVyZUxpc3RNYXA9ZnVuY3Rpb24oYSl7cmV0dXJuIFdoKHRoaXMsYSxJail9OwpLai5wcm90b3R5cGUuY2xlYXJGZWF0dXJlTGlzdE1hcD1mdW5jdGlvbigpe3RoaXMuZ2V0RmVhdHVyZUxpc3RNYXAoKS5jbGVhcigpfTtmdW5jdGlvbiBnayhhKXtGZyh0aGlzLGEsbnVsbCxudWxsKX1UYihnayxCZyk7ZnVuY3Rpb24gaGsoYSl7RmcodGhpcyxhLG51bGwsbnVsbCl9VGIoaGssQmcpO049Z2sucHJvdG90eXBlO04udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIGlrKGEsdGhpcyl9O2Z1bmN0aW9uIGlrKGEsYyl7dmFyIGQsZj17ZmVhdHVyZXM6KGQ9Yy5nZXRGZWF0dXJlcygpKSYmWGooYSxkKX07YSYmKGYuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGZ9ZnVuY3Rpb24gamsoYSl7YT1uZXcgdWYoYSk7dmFyIGM9bmV3IGdrO3JldHVybiBrayhjLGEpfQpmdW5jdGlvbiBrayhhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9bmV3IEhqO2MucmVhZE1lc3NhZ2UoZCxZaik7YS5zZXRGZWF0dXJlcyhkKTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9Ti5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgd2Y7d2wodGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07ZnVuY3Rpb24gd2woYSxjKXthPWEuZ2V0RmVhdHVyZXMoKTtudWxsIT1hJiZjLndyaXRlTWVzc2FnZSgxLGEsWmopfU4uZ2V0RmVhdHVyZXM9ZnVuY3Rpb24oKXtyZXR1cm4gZWkodGhpcyxIaiwxKX07Ti5zZXRGZWF0dXJlcz1mdW5jdGlvbihhKXtoaSh0aGlzLDEsYSl9O04uY2xlYXJGZWF0dXJlcz1mdW5jdGlvbigpe3RoaXMuc2V0RmVhdHVyZXModm9pZCAwKX07Ck4uaGFzRmVhdHVyZXM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9TmcodGhpcywxKX07Tj1oay5wcm90b3R5cGU7Ti50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4geGwoYSx0aGlzKX07ZnVuY3Rpb24geGwoYSxjKXt2YXIgZCxmPXtjb250ZXh0OihkPWMuZ2V0Q29udGV4dCgpKSYmWGooYSxkKSxmZWF0dXJlTGlzdHM6KGQ9Yy5nZXRGZWF0dXJlTGlzdHMoKSkmJmRrKGEsZCl9O2EmJihmLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBmfWZ1bmN0aW9uIHlsKGEpe2E9bmV3IHVmKGEpO3ZhciBjPW5ldyBoaztyZXR1cm4gemwoYyxhKX0KZnVuY3Rpb24gemwoYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPW5ldyBIajtjLnJlYWRNZXNzYWdlKGQsWWopO2Euc2V0Q29udGV4dChkKTticmVhaztjYXNlIDI6ZD1uZXcgS2o7Yy5yZWFkTWVzc2FnZShkLGVrKTthLnNldEZlYXR1cmVMaXN0cyhkKTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9Ti5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgd2Y7QWwodGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07ZnVuY3Rpb24gQWwoYSxjKXt2YXIgZD1hLmdldENvbnRleHQoKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSgxLGQsWmopO2Q9YS5nZXRGZWF0dXJlTGlzdHMoKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSgyLGQsZmspfU4uZ2V0Q29udGV4dD1mdW5jdGlvbigpe3JldHVybiBlaSh0aGlzLEhqLDEpfTsKTi5zZXRDb250ZXh0PWZ1bmN0aW9uKGEpe2hpKHRoaXMsMSxhKX07Ti5jbGVhckNvbnRleHQ9ZnVuY3Rpb24oKXt0aGlzLnNldENvbnRleHQodm9pZCAwKX07Ti5oYXNDb250ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPU5nKHRoaXMsMSl9O04uZ2V0RmVhdHVyZUxpc3RzPWZ1bmN0aW9uKCl7cmV0dXJuIGVpKHRoaXMsS2osMil9O04uc2V0RmVhdHVyZUxpc3RzPWZ1bmN0aW9uKGEpe2hpKHRoaXMsMixhKX07Ti5jbGVhckZlYXR1cmVMaXN0cz1mdW5jdGlvbigpe3RoaXMuc2V0RmVhdHVyZUxpc3RzKHZvaWQgMCl9O04uaGFzRmVhdHVyZUxpc3RzPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPU5nKHRoaXMsMil9OwovLyMgc291cmNlVVJMPWJ1aWxkOi9iYXplbC1vdXQvaG9zdC9iaW4vZXh0ZXJuYWwvYWlfZ29vZ2xlX3BhaXJfZmFjZXRzL2ZhY2V0c19vdmVydmlldy9wcm90by9mZWF0dXJlX3N0YXRpc3RpY3NfcHJvdG8uanMKZnVuY3Rpb24gQmwoYSl7RmcodGhpcyxhLENsLG51bGwpfVRiKEJsLEJnKTtmdW5jdGlvbiBEbChhKXtGZyh0aGlzLGEsRWwsbnVsbCl9VGIoRGwsQmcpO2Z1bmN0aW9uIEZsKGEpe0ZnKHRoaXMsYSxHbCxudWxsKX1UYihGbCxCZyk7ZnVuY3Rpb24gSGwoYSl7RmcodGhpcyxhLElsLEpsKX1UYihIbCxCZyk7ZnVuY3Rpb24gS2woYSl7RmcodGhpcyxhLG51bGwsbnVsbCl9VGIoS2wsQmcpO2Z1bmN0aW9uIExsKGEpe0ZnKHRoaXMsYSxudWxsLE1sKX1UYihMbCxCZyk7ZnVuY3Rpb24gTmwoYSl7RmcodGhpcyxhLE9sLG51bGwpfVRiKE5sLEJnKTtmdW5jdGlvbiBQbChhKXtGZyh0aGlzLGEsUWwsbnVsbCl9VGIoUGwsQmcpO2Z1bmN0aW9uIFJsKGEpe0ZnKHRoaXMsYSxudWxsLG51bGwpfVRiKFJsLEJnKTtmdW5jdGlvbiBTbChhKXtGZyh0aGlzLGEsVGwsbnVsbCl9VGIoU2wsQmcpO2Z1bmN0aW9uIFVsKGEpe0ZnKHRoaXMsYSxWbCxudWxsKX1UYihVbCxCZyk7CmZ1bmN0aW9uIFdsKGEpe0ZnKHRoaXMsYSxudWxsLG51bGwpfVRiKFdsLEJnKTtmdW5jdGlvbiBYbChhKXtGZyh0aGlzLGEsbnVsbCxudWxsKX1UYihYbCxCZyk7ZnVuY3Rpb24gWWwoYSl7RmcodGhpcyxhLG51bGwsbnVsbCl9VGIoWWwsQmcpO2Z1bmN0aW9uIFpsKGEpe0ZnKHRoaXMsYSwkbCxudWxsKX1UYihabCxCZyk7ZnVuY3Rpb24gYW0oYSl7RmcodGhpcyxhLG51bGwsbnVsbCl9VGIoYW0sQmcpO2Z1bmN0aW9uIGJtKGEpe0ZnKHRoaXMsYSxjbSxudWxsKX1UYihibSxCZyk7ZnVuY3Rpb24gZG0oYSl7RmcodGhpcyxhLG51bGwsbnVsbCl9VGIoZG0sQmcpO3ZhciBDbD1bMV07Tj1CbC5wcm90b3R5cGU7Ti50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gZW0oYSx0aGlzKX07ZnVuY3Rpb24gZW0oYSxjKXt2YXIgZD17ZGF0YXNldHNMaXN0Ok1nKGMuZ2V0RGF0YXNldHNMaXN0KCksZm0sYSl9O2EmJihkLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBkfQpmdW5jdGlvbiBnbShhKXthPW5ldyB1ZihhKTt2YXIgYz1uZXcgQmw7cmV0dXJuIGhtKGMsYSl9ZnVuY3Rpb24gaG0oYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPW5ldyBGbDtjLnJlYWRNZXNzYWdlKGQsaW0pO2EuYWRkRGF0YXNldHMoZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfU4uc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IHdmO2ptKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9O2Z1bmN0aW9uIGptKGEsYyl7YT1hLmdldERhdGFzZXRzTGlzdCgpOzA8YS5sZW5ndGgmJmMud3JpdGVSZXBlYXRlZE1lc3NhZ2UoMSxhLGttKX1OLmdldERhdGFzZXRzTGlzdD1mdW5jdGlvbigpe3JldHVybiBmaSh0aGlzLEZsLDEpfTtOLnNldERhdGFzZXRzTGlzdD1mdW5jdGlvbigpe2ppKHRoaXMsMSxbXSl9OwpOLmFkZERhdGFzZXRzPWZ1bmN0aW9uKGEpe2tpKHRoaXMsMSxhLEZsLHZvaWQgMCl9O04uY2xlYXJEYXRhc2V0c0xpc3Q9ZnVuY3Rpb24oKXt0aGlzLnNldERhdGFzZXRzTGlzdCgpfTt2YXIgRWw9WzFdO049RGwucHJvdG90eXBlO04udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIGxtKGEsdGhpcyl9O2Z1bmN0aW9uIGxtKGEsYyl7dmFyIGQsZj17c3RlcExpc3Q6bnVsbD09KGQ9T2coYywxKSk/dm9pZCAwOmR9O2EmJihmLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBmfWZ1bmN0aW9uIG1tKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1jLnJlYWRTdHJpbmcoKTthLmFkZFN0ZXAoZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfU4uc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IHdmO25tKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9OwpmdW5jdGlvbiBubShhLGMpe2E9YS5nZXRTdGVwTGlzdCgpOzA8YS5sZW5ndGgmJmMud3JpdGVSZXBlYXRlZFN0cmluZyhhKX1OLmdldFN0ZXBMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIE9nKHRoaXMsMSl9O04uc2V0U3RlcExpc3Q9ZnVuY3Rpb24oKXtYaCh0aGlzLDEsW10pfTtOLmFkZFN0ZXA9ZnVuY3Rpb24oYSl7Y2kodGhpcyxhLHZvaWQgMCl9O04uY2xlYXJTdGVwTGlzdD1mdW5jdGlvbigpe3RoaXMuc2V0U3RlcExpc3QoKX07dmFyIEdsPVszXTtOPUZsLnByb3RvdHlwZTtOLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBmbShhLHRoaXMpfTtmdW5jdGlvbiBmbShhLGMpe3ZhciBkPXtuYW1lOldnKGMsMSwiIiksbnVtRXhhbXBsZXM6V2coYywyLDApLHdlaWdodGVkTnVtRXhhbXBsZXM6WGcoYyw0KSxmZWF0dXJlc0xpc3Q6TWcoYy5nZXRGZWF0dXJlc0xpc3QoKSxvbSxhKX07YSYmKGQuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGR9CmZ1bmN0aW9uIGltKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1jLnJlYWRTdHJpbmcoKTthLnNldE5hbWUoZCk7YnJlYWs7Y2FzZSAyOmQ9Yy5yZWFkVWludDY0KCk7YS5zZXROdW1FeGFtcGxlcyhkKTticmVhaztjYXNlIDQ6ZD1jLnJlYWREb3VibGUoKTthLnNldFdlaWdodGVkTnVtRXhhbXBsZXMoZCk7YnJlYWs7Y2FzZSAzOmQ9bmV3IEhsO2MucmVhZE1lc3NhZ2UoZCxwbSk7YS5hZGRGZWF0dXJlcyhkKTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9Ti5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgd2Y7a20odGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07CmZ1bmN0aW9uIGttKGEsYyl7dmFyIGQ9YS5nZXROYW1lKCk7MDxkLmxlbmd0aCYmYy53cml0ZVN0cmluZygxLGQpO2Q9YS5nZXROdW1FeGFtcGxlcygpOzAhPT1kJiZjLndyaXRlVWludDY0KDIsZCk7ZD1hLmdldFdlaWdodGVkTnVtRXhhbXBsZXMoKTswIT09ZCYmYy53cml0ZURvdWJsZSg0LGQpO2Q9YS5nZXRGZWF0dXJlc0xpc3QoKTswPGQubGVuZ3RoJiZjLndyaXRlUmVwZWF0ZWRNZXNzYWdlKDMsZCxxbSl9Ti5nZXROYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFdnKHRoaXMsMSwiIil9O04uc2V0TmFtZT1mdW5jdGlvbihhKXthaSh0aGlzLDEsYSl9O04uZ2V0TnVtRXhhbXBsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gV2codGhpcywyLDApfTtOLnNldE51bUV4YW1wbGVzPWZ1bmN0aW9uKGEpe1loKHRoaXMsMixhKX07Ti5nZXRXZWlnaHRlZE51bUV4YW1wbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIFhnKHRoaXMsNCl9OwpOLnNldFdlaWdodGVkTnVtRXhhbXBsZXM9ZnVuY3Rpb24oYSl7JGgodGhpcyw0LGEpfTtOLmdldEZlYXR1cmVzTGlzdD1mdW5jdGlvbigpe3JldHVybiBmaSh0aGlzLEhsLDMpfTtOLnNldEZlYXR1cmVzTGlzdD1mdW5jdGlvbigpe2ppKHRoaXMsMyxbXSl9O04uYWRkRmVhdHVyZXM9ZnVuY3Rpb24oYSl7a2kodGhpcywzLGEsSGwsdm9pZCAwKX07Ti5jbGVhckZlYXR1cmVzTGlzdD1mdW5jdGlvbigpe3RoaXMuc2V0RmVhdHVyZXNMaXN0KCl9O3ZhciBJbD1bNl0sSmw9W1sxLDhdLFszLDQsNSw3XV07Tj1IbC5wcm90b3R5cGU7Ti5nZXRGaWVsZElkQ2FzZT1mdW5jdGlvbigpe3JldHVybiBKZyh0aGlzLEpsWzBdKX07Ti5nZXRTdGF0c0Nhc2U9ZnVuY3Rpb24oKXtyZXR1cm4gSmcodGhpcyxKbFsxXSl9O04udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIG9tKGEsdGhpcyl9OwpmdW5jdGlvbiBvbShhLGMpe3ZhciBkLGY9e25hbWU6V2coYywxLCIiKSxwYXRoOihkPWMuZ2V0UGF0aCgpKSYmbG0oYSxkKSx0eXBlOldnKGMsMiwwKSxudW1TdGF0czooZD1jLmdldE51bVN0YXRzKCkpJiZybShhLGQpLHN0cmluZ1N0YXRzOihkPWMuZ2V0U3RyaW5nU3RhdHMoKSkmJnNtKGEsZCksYnl0ZXNTdGF0czooZD1jLmdldEJ5dGVzU3RhdHMoKSkmJnRtKGEsZCksc3RydWN0U3RhdHM6KGQ9Yy5nZXRTdHJ1Y3RTdGF0cygpKSYmdW0oYSxkKSxjdXN0b21TdGF0c0xpc3Q6TWcoYy5nZXRDdXN0b21TdGF0c0xpc3QoKSx2bSxhKX07YSYmKGYuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGZ9CmZ1bmN0aW9uIHBtKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1jLnJlYWRTdHJpbmcoKTthLnNldE5hbWUoZCk7YnJlYWs7Y2FzZSA4OmQ9bmV3IERsO2MucmVhZE1lc3NhZ2UoZCxtbSk7YS5zZXRQYXRoKGQpO2JyZWFrO2Nhc2UgMjpkPWMucmVhZEVudW0oKTthLnNldFR5cGUoZCk7YnJlYWs7Y2FzZSAzOmQ9bmV3IE5sO2MucmVhZE1lc3NhZ2UoZCx3bSk7YS5zZXROdW1TdGF0cyhkKTticmVhaztjYXNlIDQ6ZD1uZXcgUGw7Yy5yZWFkTWVzc2FnZShkLHhtKTthLnNldFN0cmluZ1N0YXRzKGQpO2JyZWFrO2Nhc2UgNTpkPW5ldyBXbDtjLnJlYWRNZXNzYWdlKGQseW0pO2Euc2V0Qnl0ZXNTdGF0cyhkKTticmVhaztjYXNlIDc6ZD1uZXcgWGw7Yy5yZWFkTWVzc2FnZShkLHptKTthLnNldFN0cnVjdFN0YXRzKGQpO2JyZWFrO2Nhc2UgNjpkPW5ldyBMbDtjLnJlYWRNZXNzYWdlKGQsQW0pOwphLmFkZEN1c3RvbVN0YXRzKGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1OLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyB3ZjtxbSh0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTsKZnVuY3Rpb24gcW0oYSxjKXt2YXIgZD1OZyhhLDEpO251bGwhPWQmJmMud3JpdGVTdHJpbmcoMSxkKTtkPWEuZ2V0UGF0aCgpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDgsZCxubSk7ZD1hLmdldFR5cGUoKTswIT09ZCYmYy53cml0ZUVudW0oMixkKTtkPWEuZ2V0TnVtU3RhdHMoKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSgzLGQsQm0pO2Q9YS5nZXRTdHJpbmdTdGF0cygpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDQsZCxDbSk7ZD1hLmdldEJ5dGVzU3RhdHMoKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSg1LGQsRG0pO2Q9YS5nZXRTdHJ1Y3RTdGF0cygpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDcsZCxFbSk7ZD1hLmdldEN1c3RvbVN0YXRzTGlzdCgpOzA8ZC5sZW5ndGgmJmMud3JpdGVSZXBlYXRlZE1lc3NhZ2UoNixkLEZtKX1OLmdldE5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4gV2codGhpcywxLCIiKX07Ti5zZXROYW1lPWZ1bmN0aW9uKGEpe2RpKHRoaXMsMSxKbFswXSxhKX07Ck4uY2xlYXJOYW1lPWZ1bmN0aW9uKCl7ZGkodGhpcywxLEpsWzBdLHZvaWQgMCl9O04uaGFzTmFtZT1mdW5jdGlvbigpe3JldHVybiBudWxsIT1OZyh0aGlzLDEpfTtOLmdldFBhdGg9ZnVuY3Rpb24oKXtyZXR1cm4gZWkodGhpcyxEbCw4KX07Ti5zZXRQYXRoPWZ1bmN0aW9uKGEpe2lpKHRoaXMsOCxKbFswXSxhKX07Ti5jbGVhclBhdGg9ZnVuY3Rpb24oKXt0aGlzLnNldFBhdGgodm9pZCAwKX07Ti5oYXNQYXRoPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPU5nKHRoaXMsOCl9O04uZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiBXZyh0aGlzLDIsMCl9O04uc2V0VHlwZT1mdW5jdGlvbihhKXtiaSh0aGlzLDIsYSl9O04uZ2V0TnVtU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gZWkodGhpcyxObCwzKX07Ti5zZXROdW1TdGF0cz1mdW5jdGlvbihhKXtpaSh0aGlzLDMsSmxbMV0sYSl9O04uY2xlYXJOdW1TdGF0cz1mdW5jdGlvbigpe3RoaXMuc2V0TnVtU3RhdHModm9pZCAwKX07Ck4uaGFzTnVtU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9TmcodGhpcywzKX07Ti5nZXRTdHJpbmdTdGF0cz1mdW5jdGlvbigpe3JldHVybiBlaSh0aGlzLFBsLDQpfTtOLnNldFN0cmluZ1N0YXRzPWZ1bmN0aW9uKGEpe2lpKHRoaXMsNCxKbFsxXSxhKX07Ti5jbGVhclN0cmluZ1N0YXRzPWZ1bmN0aW9uKCl7dGhpcy5zZXRTdHJpbmdTdGF0cyh2b2lkIDApfTtOLmhhc1N0cmluZ1N0YXRzPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPU5nKHRoaXMsNCl9O04uZ2V0Qnl0ZXNTdGF0cz1mdW5jdGlvbigpe3JldHVybiBlaSh0aGlzLFdsLDUpfTtOLnNldEJ5dGVzU3RhdHM9ZnVuY3Rpb24oYSl7aWkodGhpcyw1LEpsWzFdLGEpfTtOLmNsZWFyQnl0ZXNTdGF0cz1mdW5jdGlvbigpe3RoaXMuc2V0Qnl0ZXNTdGF0cyh2b2lkIDApfTtOLmhhc0J5dGVzU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9TmcodGhpcyw1KX07Ck4uZ2V0U3RydWN0U3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gZWkodGhpcyxYbCw3KX07Ti5zZXRTdHJ1Y3RTdGF0cz1mdW5jdGlvbihhKXtpaSh0aGlzLDcsSmxbMV0sYSl9O04uY2xlYXJTdHJ1Y3RTdGF0cz1mdW5jdGlvbigpe3RoaXMuc2V0U3RydWN0U3RhdHModm9pZCAwKX07Ti5oYXNTdHJ1Y3RTdGF0cz1mdW5jdGlvbigpe3JldHVybiBudWxsIT1OZyh0aGlzLDcpfTtOLmdldEN1c3RvbVN0YXRzTGlzdD1mdW5jdGlvbigpe3JldHVybiBmaSh0aGlzLExsLDYpfTtOLnNldEN1c3RvbVN0YXRzTGlzdD1mdW5jdGlvbigpe2ppKHRoaXMsNixbXSl9O04uYWRkQ3VzdG9tU3RhdHM9ZnVuY3Rpb24oYSl7a2kodGhpcyw2LGEsTGwsdm9pZCAwKX07Ti5jbGVhckN1c3RvbVN0YXRzTGlzdD1mdW5jdGlvbigpe3RoaXMuc2V0Q3VzdG9tU3RhdHNMaXN0KCl9O049S2wucHJvdG90eXBlO04udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIEdtKGEsdGhpcyl9OwpmdW5jdGlvbiBHbShhLGMpe3ZhciBkPXtudW1Ob25NaXNzaW5nOlhnKGMsMSksbnVtTWlzc2luZzpYZyhjLDIpLGF2Z051bVZhbHVlczpYZyhjLDMpLHRvdE51bVZhbHVlczpYZyhjLDQpfTthJiYoZC4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZH1mdW5jdGlvbiBIbShhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9Yy5yZWFkRG91YmxlKCk7YS5zZXROdW1Ob25NaXNzaW5nKGQpO2JyZWFrO2Nhc2UgMjpkPWMucmVhZERvdWJsZSgpO2Euc2V0TnVtTWlzc2luZyhkKTticmVhaztjYXNlIDM6ZD1jLnJlYWREb3VibGUoKTthLnNldEF2Z051bVZhbHVlcyhkKTticmVhaztjYXNlIDQ6ZD1jLnJlYWREb3VibGUoKTthLnNldFRvdE51bVZhbHVlcyhkKTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9Ck4uc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IHdmO0ltKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9O2Z1bmN0aW9uIEltKGEsYyl7dmFyIGQ9YS5nZXROdW1Ob25NaXNzaW5nKCk7MCE9PWQmJmMud3JpdGVEb3VibGUoMSxkKTtkPWEuZ2V0TnVtTWlzc2luZygpOzAhPT1kJiZjLndyaXRlRG91YmxlKDIsZCk7ZD1hLmdldEF2Z051bVZhbHVlcygpOzAhPT1kJiZjLndyaXRlRG91YmxlKDMsZCk7ZD1hLmdldFRvdE51bVZhbHVlcygpOzAhPT1kJiZjLndyaXRlRG91YmxlKDQsZCl9Ti5nZXROdW1Ob25NaXNzaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIFhnKHRoaXMsMSl9O04uc2V0TnVtTm9uTWlzc2luZz1mdW5jdGlvbihhKXskaCh0aGlzLDEsYSl9O04uZ2V0TnVtTWlzc2luZz1mdW5jdGlvbigpe3JldHVybiBYZyh0aGlzLDIpfTtOLnNldE51bU1pc3Npbmc9ZnVuY3Rpb24oYSl7JGgodGhpcywyLGEpfTsKTi5nZXRBdmdOdW1WYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gWGcodGhpcywzKX07Ti5zZXRBdmdOdW1WYWx1ZXM9ZnVuY3Rpb24oYSl7JGgodGhpcywzLGEpfTtOLmdldFRvdE51bVZhbHVlcz1mdW5jdGlvbigpe3JldHVybiBYZyh0aGlzLDQpfTtOLnNldFRvdE51bVZhbHVlcz1mdW5jdGlvbihhKXskaCh0aGlzLDQsYSl9O3ZhciBNbD1bWzIsMyw0LDVdXTtOPUxsLnByb3RvdHlwZTtOLmdldFZhbENhc2U9ZnVuY3Rpb24oKXtyZXR1cm4gSmcodGhpcyxNbFswXSl9O04udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIHZtKGEsdGhpcyl9OwpmdW5jdGlvbiB2bShhLGMpe3ZhciBkLGY9e25hbWU6V2coYywxLCIiKSxudW06WGcoYywyKSxzdHI6V2coYywzLCIiKSxoaXN0b2dyYW06KGQ9Yy5nZXRIaXN0b2dyYW0oKSkmJkptKGEsZCkscmFua0hpc3RvZ3JhbTooZD1jLmdldFJhbmtIaXN0b2dyYW0oKSkmJkttKGEsZCl9O2EmJihmLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBmfQpmdW5jdGlvbiBBbShhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9Yy5yZWFkU3RyaW5nKCk7YS5zZXROYW1lKGQpO2JyZWFrO2Nhc2UgMjpkPWMucmVhZERvdWJsZSgpO2Euc2V0TnVtKGQpO2JyZWFrO2Nhc2UgMzpkPWMucmVhZFN0cmluZygpO2Euc2V0U3RyKGQpO2JyZWFrO2Nhc2UgNDpkPW5ldyBabDtjLnJlYWRNZXNzYWdlKGQsTG0pO2Euc2V0SGlzdG9ncmFtKGQpO2JyZWFrO2Nhc2UgNTpkPW5ldyBibTtjLnJlYWRNZXNzYWdlKGQsTW0pO2Euc2V0UmFua0hpc3RvZ3JhbShkKTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9Ti5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgd2Y7Rm0odGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07CmZ1bmN0aW9uIEZtKGEsYyl7dmFyIGQ9YS5nZXROYW1lKCk7MDxkLmxlbmd0aCYmYy53cml0ZVN0cmluZygxLGQpO2Q9TmcoYSwyKTtudWxsIT1kJiZjLndyaXRlRG91YmxlKDIsZCk7ZD1OZyhhLDMpO251bGwhPWQmJmMud3JpdGVTdHJpbmcoMyxkKTtkPWEuZ2V0SGlzdG9ncmFtKCk7bnVsbCE9ZCYmYy53cml0ZU1lc3NhZ2UoNCxkLE5tKTtkPWEuZ2V0UmFua0hpc3RvZ3JhbSgpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDUsZCxPbSl9Ti5nZXROYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFdnKHRoaXMsMSwiIil9O04uc2V0TmFtZT1mdW5jdGlvbihhKXthaSh0aGlzLDEsYSl9O04uZ2V0TnVtPWZ1bmN0aW9uKCl7cmV0dXJuIFhnKHRoaXMsMil9O04uc2V0TnVtPWZ1bmN0aW9uKGEpe2RpKHRoaXMsMixNbFswXSxhKX07Ti5jbGVhck51bT1mdW5jdGlvbigpe2RpKHRoaXMsMixNbFswXSx2b2lkIDApfTtOLmhhc051bT1mdW5jdGlvbigpe3JldHVybiBudWxsIT1OZyh0aGlzLDIpfTsKTi5nZXRTdHI9ZnVuY3Rpb24oKXtyZXR1cm4gV2codGhpcywzLCIiKX07Ti5zZXRTdHI9ZnVuY3Rpb24oYSl7ZGkodGhpcywzLE1sWzBdLGEpfTtOLmNsZWFyU3RyPWZ1bmN0aW9uKCl7ZGkodGhpcywzLE1sWzBdLHZvaWQgMCl9O04uaGFzU3RyPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPU5nKHRoaXMsMyl9O04uZ2V0SGlzdG9ncmFtPWZ1bmN0aW9uKCl7cmV0dXJuIGVpKHRoaXMsWmwsNCl9O04uc2V0SGlzdG9ncmFtPWZ1bmN0aW9uKGEpe2lpKHRoaXMsNCxNbFswXSxhKX07Ti5jbGVhckhpc3RvZ3JhbT1mdW5jdGlvbigpe3RoaXMuc2V0SGlzdG9ncmFtKHZvaWQgMCl9O04uaGFzSGlzdG9ncmFtPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPU5nKHRoaXMsNCl9O04uZ2V0UmFua0hpc3RvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBlaSh0aGlzLGJtLDUpfTtOLnNldFJhbmtIaXN0b2dyYW09ZnVuY3Rpb24oYSl7aWkodGhpcyw1LE1sWzBdLGEpfTtOLmNsZWFyUmFua0hpc3RvZ3JhbT1mdW5jdGlvbigpe3RoaXMuc2V0UmFua0hpc3RvZ3JhbSh2b2lkIDApfTsKTi5oYXNSYW5rSGlzdG9ncmFtPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPU5nKHRoaXMsNSl9O3ZhciBPbD1bOF07Tj1ObC5wcm90b3R5cGU7Ti50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gcm0oYSx0aGlzKX07ZnVuY3Rpb24gcm0oYSxjKXt2YXIgZCxmPXtjb21tb25TdGF0czooZD1jLmdldENvbW1vblN0YXRzKCkpJiZQbShhLGQpLG1lYW46WGcoYywyKSxzdGREZXY6WGcoYywzKSxudW1aZXJvczpXZyhjLDQsMCksbWluOlhnKGMsNSksbWVkaWFuOlhnKGMsNiksbWF4OlhnKGMsNyksaGlzdG9ncmFtc0xpc3Q6TWcoYy5nZXRIaXN0b2dyYW1zTGlzdCgpLEptLGEpLHdlaWdodGVkTnVtZXJpY1N0YXRzOihkPWMuZ2V0V2VpZ2h0ZWROdW1lcmljU3RhdHMoKSkmJlFtKGEsZCl9O2EmJihmLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBmfQpmdW5jdGlvbiB3bShhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9bmV3IFlsO2MucmVhZE1lc3NhZ2UoZCxSbSk7YS5zZXRDb21tb25TdGF0cyhkKTticmVhaztjYXNlIDI6ZD1jLnJlYWREb3VibGUoKTthLnNldE1lYW4oZCk7YnJlYWs7Y2FzZSAzOmQ9Yy5yZWFkRG91YmxlKCk7YS5zZXRTdGREZXYoZCk7YnJlYWs7Y2FzZSA0OmQ9Yy5yZWFkVWludDY0KCk7YS5zZXROdW1aZXJvcyhkKTticmVhaztjYXNlIDU6ZD1jLnJlYWREb3VibGUoKTthLnNldE1pbihkKTticmVhaztjYXNlIDY6ZD1jLnJlYWREb3VibGUoKTthLnNldE1lZGlhbihkKTticmVhaztjYXNlIDc6ZD1jLnJlYWREb3VibGUoKTthLnNldE1heChkKTticmVhaztjYXNlIDg6ZD1uZXcgWmw7Yy5yZWFkTWVzc2FnZShkLExtKTthLmFkZEhpc3RvZ3JhbXMoZCk7YnJlYWs7Y2FzZSA5OmQ9bmV3IFNsO2MucmVhZE1lc3NhZ2UoZCwKU20pO2Euc2V0V2VpZ2h0ZWROdW1lcmljU3RhdHMoZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfU4uc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IHdmO0JtKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9OwpmdW5jdGlvbiBCbShhLGMpe3ZhciBkPWEuZ2V0Q29tbW9uU3RhdHMoKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSgxLGQsVG0pO2Q9YS5nZXRNZWFuKCk7MCE9PWQmJmMud3JpdGVEb3VibGUoMixkKTtkPWEuZ2V0U3RkRGV2KCk7MCE9PWQmJmMud3JpdGVEb3VibGUoMyxkKTtkPWEuZ2V0TnVtWmVyb3MoKTswIT09ZCYmYy53cml0ZVVpbnQ2NCg0LGQpO2Q9YS5nZXRNaW4oKTswIT09ZCYmYy53cml0ZURvdWJsZSg1LGQpO2Q9YS5nZXRNZWRpYW4oKTswIT09ZCYmYy53cml0ZURvdWJsZSg2LGQpO2Q9YS5nZXRNYXgoKTswIT09ZCYmYy53cml0ZURvdWJsZSg3LGQpO2Q9YS5nZXRIaXN0b2dyYW1zTGlzdCgpOzA8ZC5sZW5ndGgmJmMud3JpdGVSZXBlYXRlZE1lc3NhZ2UoOCxkLE5tKTtkPWEuZ2V0V2VpZ2h0ZWROdW1lcmljU3RhdHMoKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSg5LGQsVW0pfU4uZ2V0Q29tbW9uU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gZWkodGhpcyxZbCwxKX07Ck4uc2V0Q29tbW9uU3RhdHM9ZnVuY3Rpb24oYSl7aGkodGhpcywxLGEpfTtOLmNsZWFyQ29tbW9uU3RhdHM9ZnVuY3Rpb24oKXt0aGlzLnNldENvbW1vblN0YXRzKHZvaWQgMCl9O04uaGFzQ29tbW9uU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9TmcodGhpcywxKX07Ti5nZXRNZWFuPWZ1bmN0aW9uKCl7cmV0dXJuIFhnKHRoaXMsMil9O04uc2V0TWVhbj1mdW5jdGlvbihhKXskaCh0aGlzLDIsYSl9O04uZ2V0U3RkRGV2PWZ1bmN0aW9uKCl7cmV0dXJuIFhnKHRoaXMsMyl9O04uc2V0U3RkRGV2PWZ1bmN0aW9uKGEpeyRoKHRoaXMsMyxhKX07Ti5nZXROdW1aZXJvcz1mdW5jdGlvbigpe3JldHVybiBXZyh0aGlzLDQsMCl9O04uc2V0TnVtWmVyb3M9ZnVuY3Rpb24oYSl7WWgodGhpcyw0LGEpfTtOLmdldE1pbj1mdW5jdGlvbigpe3JldHVybiBYZyh0aGlzLDUpfTtOLnNldE1pbj1mdW5jdGlvbihhKXskaCh0aGlzLDUsYSl9OwpOLmdldE1lZGlhbj1mdW5jdGlvbigpe3JldHVybiBYZyh0aGlzLDYpfTtOLnNldE1lZGlhbj1mdW5jdGlvbihhKXskaCh0aGlzLDYsYSl9O04uZ2V0TWF4PWZ1bmN0aW9uKCl7cmV0dXJuIFhnKHRoaXMsNyl9O04uc2V0TWF4PWZ1bmN0aW9uKGEpeyRoKHRoaXMsNyxhKX07Ti5nZXRIaXN0b2dyYW1zTGlzdD1mdW5jdGlvbigpe3JldHVybiBmaSh0aGlzLFpsLDgpfTtOLnNldEhpc3RvZ3JhbXNMaXN0PWZ1bmN0aW9uKGEpe2ppKHRoaXMsOCxhKX07Ti5hZGRIaXN0b2dyYW1zPWZ1bmN0aW9uKGEpe3JldHVybiBraSh0aGlzLDgsYSxabCx2b2lkIDApfTtOLmNsZWFySGlzdG9ncmFtc0xpc3Q9ZnVuY3Rpb24oKXt0aGlzLnNldEhpc3RvZ3JhbXNMaXN0KFtdKX07Ti5nZXRXZWlnaHRlZE51bWVyaWNTdGF0cz1mdW5jdGlvbigpe3JldHVybiBlaSh0aGlzLFNsLDkpfTtOLnNldFdlaWdodGVkTnVtZXJpY1N0YXRzPWZ1bmN0aW9uKGEpe2hpKHRoaXMsOSxhKX07Ck4uY2xlYXJXZWlnaHRlZE51bWVyaWNTdGF0cz1mdW5jdGlvbigpe3RoaXMuc2V0V2VpZ2h0ZWROdW1lcmljU3RhdHModm9pZCAwKX07Ti5oYXNXZWlnaHRlZE51bWVyaWNTdGF0cz1mdW5jdGlvbigpe3JldHVybiBudWxsIT1OZyh0aGlzLDkpfTt2YXIgUWw9WzNdO1BsLnByb3RvdHlwZS50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gc20oYSx0aGlzKX07ZnVuY3Rpb24gc20oYSxjKXt2YXIgZCxmPXtjb21tb25TdGF0czooZD1jLmdldENvbW1vblN0YXRzKCkpJiZQbShhLGQpLHVuaXF1ZTpXZyhjLDIsMCksdG9wVmFsdWVzTGlzdDpNZyhjLmdldFRvcFZhbHVlc0xpc3QoKSxWbSxhKSxhdmdMZW5ndGg6WGcoYyw0KSxyYW5rSGlzdG9ncmFtOihkPWMuZ2V0UmFua0hpc3RvZ3JhbSgpKSYmS20oYSxkKSx3ZWlnaHRlZFN0cmluZ1N0YXRzOihkPWMuZ2V0V2VpZ2h0ZWRTdHJpbmdTdGF0cygpKSYmV20oYSxkKX07YSYmKGYuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGZ9CmZ1bmN0aW9uIHhtKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1uZXcgWWw7Yy5yZWFkTWVzc2FnZShkLFJtKTthLnNldENvbW1vblN0YXRzKGQpO2JyZWFrO2Nhc2UgMjpkPWMucmVhZFVpbnQ2NCgpO2Euc2V0VW5pcXVlKGQpO2JyZWFrO2Nhc2UgMzpkPW5ldyBSbDtjLnJlYWRNZXNzYWdlKGQsWG0pO2EuYWRkVG9wVmFsdWVzKGQpO2JyZWFrO2Nhc2UgNDpkPWMucmVhZEZsb2F0KCk7YS5zZXRBdmdMZW5ndGgoZCk7YnJlYWs7Y2FzZSA1OmQ9bmV3IGJtO2MucmVhZE1lc3NhZ2UoZCxNbSk7YS5zZXRSYW5rSGlzdG9ncmFtKGQpO2JyZWFrO2Nhc2UgNjpkPW5ldyBVbDtjLnJlYWRNZXNzYWdlKGQsWW0pO2Euc2V0V2VpZ2h0ZWRTdHJpbmdTdGF0cyhkKTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9ClBsLnByb3RvdHlwZS5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgd2Y7Q20odGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07ZnVuY3Rpb24gQ20oYSxjKXt2YXIgZD1hLmdldENvbW1vblN0YXRzKCk7bnVsbCE9ZCYmYy53cml0ZU1lc3NhZ2UoMSxkLFRtKTtkPWEuZ2V0VW5pcXVlKCk7MCE9PWQmJmMud3JpdGVVaW50NjQoMixkKTtkPWEuZ2V0VG9wVmFsdWVzTGlzdCgpOzA8ZC5sZW5ndGgmJmMud3JpdGVSZXBlYXRlZE1lc3NhZ2UoMyxkLFptKTtkPWEuZ2V0QXZnTGVuZ3RoKCk7MCE9PWQmJmMud3JpdGVGbG9hdCg0LGQpO2Q9YS5nZXRSYW5rSGlzdG9ncmFtKCk7bnVsbCE9ZCYmYy53cml0ZU1lc3NhZ2UoNSxkLE9tKTtkPWEuZ2V0V2VpZ2h0ZWRTdHJpbmdTdGF0cygpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDYsZCwkbSl9Tj1SbC5wcm90b3R5cGU7Ti50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gVm0oYSx0aGlzKX07CmZ1bmN0aW9uIFZtKGEsYyl7dmFyIGQ9e2RlcHJlY2F0ZWRGcmVxOldnKGMsMSwwKSx2YWx1ZTpXZyhjLDIsIiIpLGZyZXF1ZW5jeTpYZyhjLDMpfTthJiYoZC4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZH1mdW5jdGlvbiBYbShhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9Yy5yZWFkVWludDY0KCk7YS5zZXREZXByZWNhdGVkRnJlcShkKTticmVhaztjYXNlIDI6ZD1jLnJlYWRTdHJpbmcoKTthLnNldFZhbHVlKGQpO2JyZWFrO2Nhc2UgMzpkPWMucmVhZERvdWJsZSgpO2Euc2V0RnJlcXVlbmN5KGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1OLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyB3ZjtabSh0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTsKZnVuY3Rpb24gWm0oYSxjKXt2YXIgZD1hLmdldERlcHJlY2F0ZWRGcmVxKCk7MCE9PWQmJmMud3JpdGVVaW50NjQoMSxkKTtkPWEuZ2V0VmFsdWUoKTswPGQubGVuZ3RoJiZjLndyaXRlU3RyaW5nKDIsZCk7ZD1hLmdldEZyZXF1ZW5jeSgpOzAhPT1kJiZjLndyaXRlRG91YmxlKDMsZCl9Ti5nZXREZXByZWNhdGVkRnJlcT1mdW5jdGlvbigpe3JldHVybiBXZyh0aGlzLDEsMCl9O04uc2V0RGVwcmVjYXRlZEZyZXE9ZnVuY3Rpb24oYSl7WWgodGhpcywxLGEpfTtOLmdldFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIFdnKHRoaXMsMiwiIil9O04uc2V0VmFsdWU9ZnVuY3Rpb24oYSl7YWkodGhpcywyLGEpfTtOLmdldEZyZXF1ZW5jeT1mdW5jdGlvbigpe3JldHVybiBYZyh0aGlzLDMpfTtOLnNldEZyZXF1ZW5jeT1mdW5jdGlvbihhKXskaCh0aGlzLDMsYSl9O049UGwucHJvdG90eXBlO04uZ2V0Q29tbW9uU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gZWkodGhpcyxZbCwxKX07Ck4uc2V0Q29tbW9uU3RhdHM9ZnVuY3Rpb24oYSl7aGkodGhpcywxLGEpfTtOLmNsZWFyQ29tbW9uU3RhdHM9ZnVuY3Rpb24oKXt0aGlzLnNldENvbW1vblN0YXRzKHZvaWQgMCl9O04uaGFzQ29tbW9uU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9TmcodGhpcywxKX07Ti5nZXRVbmlxdWU9ZnVuY3Rpb24oKXtyZXR1cm4gV2codGhpcywyLDApfTtOLnNldFVuaXF1ZT1mdW5jdGlvbihhKXtZaCh0aGlzLDIsYSl9O04uZ2V0VG9wVmFsdWVzTGlzdD1mdW5jdGlvbigpe3JldHVybiBmaSh0aGlzLFJsLDMpfTtOLnNldFRvcFZhbHVlc0xpc3Q9ZnVuY3Rpb24oYSl7amkodGhpcywzLGEpfTtOLmFkZFRvcFZhbHVlcz1mdW5jdGlvbihhKXtyZXR1cm4ga2kodGhpcywzLGEsUmwsdm9pZCAwKX07Ti5jbGVhclRvcFZhbHVlc0xpc3Q9ZnVuY3Rpb24oKXt0aGlzLnNldFRvcFZhbHVlc0xpc3QoW10pfTtOLmdldEF2Z0xlbmd0aD1mdW5jdGlvbigpe3JldHVybiBYZyh0aGlzLDQpfTsKTi5zZXRBdmdMZW5ndGg9ZnVuY3Rpb24oYSl7JGgodGhpcyw0LGEpfTtOLmdldFJhbmtIaXN0b2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gZWkodGhpcyxibSw1KX07Ti5zZXRSYW5rSGlzdG9ncmFtPWZ1bmN0aW9uKGEpe2hpKHRoaXMsNSxhKX07Ti5jbGVhclJhbmtIaXN0b2dyYW09ZnVuY3Rpb24oKXt0aGlzLnNldFJhbmtIaXN0b2dyYW0odm9pZCAwKX07Ti5oYXNSYW5rSGlzdG9ncmFtPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPU5nKHRoaXMsNSl9O04uZ2V0V2VpZ2h0ZWRTdHJpbmdTdGF0cz1mdW5jdGlvbigpe3JldHVybiBlaSh0aGlzLFVsLDYpfTtOLnNldFdlaWdodGVkU3RyaW5nU3RhdHM9ZnVuY3Rpb24oYSl7aGkodGhpcyw2LGEpfTtOLmNsZWFyV2VpZ2h0ZWRTdHJpbmdTdGF0cz1mdW5jdGlvbigpe3RoaXMuc2V0V2VpZ2h0ZWRTdHJpbmdTdGF0cyh2b2lkIDApfTtOLmhhc1dlaWdodGVkU3RyaW5nU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9TmcodGhpcyw2KX07CnZhciBUbD1bNF07Tj1TbC5wcm90b3R5cGU7Ti50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gUW0oYSx0aGlzKX07ZnVuY3Rpb24gUW0oYSxjKXt2YXIgZD17bWVhbjpYZyhjLDEpLHN0ZERldjpYZyhjLDIpLG1lZGlhbjpYZyhjLDMpLGhpc3RvZ3JhbXNMaXN0Ok1nKGMuZ2V0SGlzdG9ncmFtc0xpc3QoKSxKbSxhKX07YSYmKGQuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGR9CmZ1bmN0aW9uIFNtKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1jLnJlYWREb3VibGUoKTthLnNldE1lYW4oZCk7YnJlYWs7Y2FzZSAyOmQ9Yy5yZWFkRG91YmxlKCk7YS5zZXRTdGREZXYoZCk7YnJlYWs7Y2FzZSAzOmQ9Yy5yZWFkRG91YmxlKCk7YS5zZXRNZWRpYW4oZCk7YnJlYWs7Y2FzZSA0OmQ9bmV3IFpsO2MucmVhZE1lc3NhZ2UoZCxMbSk7YS5hZGRIaXN0b2dyYW1zKGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1OLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyB3ZjtVbSh0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTsKZnVuY3Rpb24gVW0oYSxjKXt2YXIgZD1hLmdldE1lYW4oKTswIT09ZCYmYy53cml0ZURvdWJsZSgxLGQpO2Q9YS5nZXRTdGREZXYoKTswIT09ZCYmYy53cml0ZURvdWJsZSgyLGQpO2Q9YS5nZXRNZWRpYW4oKTswIT09ZCYmYy53cml0ZURvdWJsZSgzLGQpO2Q9YS5nZXRIaXN0b2dyYW1zTGlzdCgpOzA8ZC5sZW5ndGgmJmMud3JpdGVSZXBlYXRlZE1lc3NhZ2UoNCxkLE5tKX1OLmdldE1lYW49ZnVuY3Rpb24oKXtyZXR1cm4gWGcodGhpcywxKX07Ti5zZXRNZWFuPWZ1bmN0aW9uKGEpeyRoKHRoaXMsMSxhKX07Ti5nZXRTdGREZXY9ZnVuY3Rpb24oKXtyZXR1cm4gWGcodGhpcywyKX07Ti5zZXRTdGREZXY9ZnVuY3Rpb24oYSl7JGgodGhpcywyLGEpfTtOLmdldE1lZGlhbj1mdW5jdGlvbigpe3JldHVybiBYZyh0aGlzLDMpfTtOLnNldE1lZGlhbj1mdW5jdGlvbihhKXskaCh0aGlzLDMsYSl9O04uZ2V0SGlzdG9ncmFtc0xpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gZmkodGhpcyxabCw0KX07Ck4uc2V0SGlzdG9ncmFtc0xpc3Q9ZnVuY3Rpb24oYSl7amkodGhpcyw0LGEpfTtOLmFkZEhpc3RvZ3JhbXM9ZnVuY3Rpb24oYSl7cmV0dXJuIGtpKHRoaXMsNCxhLFpsLHZvaWQgMCl9O04uY2xlYXJIaXN0b2dyYW1zTGlzdD1mdW5jdGlvbigpe3RoaXMuc2V0SGlzdG9ncmFtc0xpc3QoW10pfTt2YXIgVmw9WzFdO049VWwucHJvdG90eXBlO04udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIFdtKGEsdGhpcyl9O2Z1bmN0aW9uIFdtKGEsYyl7dmFyIGQsZj17dG9wVmFsdWVzTGlzdDpNZyhjLmdldFRvcFZhbHVlc0xpc3QoKSxWbSxhKSxyYW5rSGlzdG9ncmFtOihkPWMuZ2V0UmFua0hpc3RvZ3JhbSgpKSYmS20oYSxkKX07YSYmKGYuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGZ9CmZ1bmN0aW9uIFltKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1uZXcgUmw7Yy5yZWFkTWVzc2FnZShkLFhtKTthLmFkZFRvcFZhbHVlcyhkKTticmVhaztjYXNlIDI6ZD1uZXcgYm07Yy5yZWFkTWVzc2FnZShkLE1tKTthLnNldFJhbmtIaXN0b2dyYW0oZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfU4uc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IHdmOyRtKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9O2Z1bmN0aW9uICRtKGEsYyl7dmFyIGQ9YS5nZXRUb3BWYWx1ZXNMaXN0KCk7MDxkLmxlbmd0aCYmYy53cml0ZVJlcGVhdGVkTWVzc2FnZSgxLGQsWm0pO2Q9YS5nZXRSYW5rSGlzdG9ncmFtKCk7bnVsbCE9ZCYmYy53cml0ZU1lc3NhZ2UoMixkLE9tKX0KTi5nZXRUb3BWYWx1ZXNMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIGZpKHRoaXMsUmwsMSl9O04uc2V0VG9wVmFsdWVzTGlzdD1mdW5jdGlvbihhKXtqaSh0aGlzLDEsYSl9O04uYWRkVG9wVmFsdWVzPWZ1bmN0aW9uKGEpe3JldHVybiBraSh0aGlzLDEsYSxSbCx2b2lkIDApfTtOLmNsZWFyVG9wVmFsdWVzTGlzdD1mdW5jdGlvbigpe3RoaXMuc2V0VG9wVmFsdWVzTGlzdChbXSl9O04uZ2V0UmFua0hpc3RvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBlaSh0aGlzLGJtLDIpfTtOLnNldFJhbmtIaXN0b2dyYW09ZnVuY3Rpb24oYSl7aGkodGhpcywyLGEpfTtOLmNsZWFyUmFua0hpc3RvZ3JhbT1mdW5jdGlvbigpe3RoaXMuc2V0UmFua0hpc3RvZ3JhbSh2b2lkIDApfTtOLmhhc1JhbmtIaXN0b2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9TmcodGhpcywyKX07Tj1XbC5wcm90b3R5cGU7Ti50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gdG0oYSx0aGlzKX07CmZ1bmN0aW9uIHRtKGEsYyl7dmFyIGQsZj17Y29tbW9uU3RhdHM6KGQ9Yy5nZXRDb21tb25TdGF0cygpKSYmUG0oYSxkKSx1bmlxdWU6V2coYywyLDApLGF2Z051bUJ5dGVzOlhnKGMsMyksbWluTnVtQnl0ZXM6WGcoYyw0KSxtYXhOdW1CeXRlczpYZyhjLDUpfTthJiYoZi4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZn0KZnVuY3Rpb24geW0oYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPW5ldyBZbDtjLnJlYWRNZXNzYWdlKGQsUm0pO2Euc2V0Q29tbW9uU3RhdHMoZCk7YnJlYWs7Y2FzZSAyOmQ9Yy5yZWFkVWludDY0KCk7YS5zZXRVbmlxdWUoZCk7YnJlYWs7Y2FzZSAzOmQ9Yy5yZWFkRmxvYXQoKTthLnNldEF2Z051bUJ5dGVzKGQpO2JyZWFrO2Nhc2UgNDpkPWMucmVhZEZsb2F0KCk7YS5zZXRNaW5OdW1CeXRlcyhkKTticmVhaztjYXNlIDU6ZD1jLnJlYWRGbG9hdCgpO2Euc2V0TWF4TnVtQnl0ZXMoZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfU4uc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IHdmO0RtKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9OwpmdW5jdGlvbiBEbShhLGMpe3ZhciBkPWEuZ2V0Q29tbW9uU3RhdHMoKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSgxLGQsVG0pO2Q9YS5nZXRVbmlxdWUoKTswIT09ZCYmYy53cml0ZVVpbnQ2NCgyLGQpO2Q9YS5nZXRBdmdOdW1CeXRlcygpOzAhPT1kJiZjLndyaXRlRmxvYXQoMyxkKTtkPWEuZ2V0TWluTnVtQnl0ZXMoKTswIT09ZCYmYy53cml0ZUZsb2F0KDQsZCk7ZD1hLmdldE1heE51bUJ5dGVzKCk7MCE9PWQmJmMud3JpdGVGbG9hdCg1LGQpfU4uZ2V0Q29tbW9uU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gZWkodGhpcyxZbCwxKX07Ti5zZXRDb21tb25TdGF0cz1mdW5jdGlvbihhKXtoaSh0aGlzLDEsYSl9O04uY2xlYXJDb21tb25TdGF0cz1mdW5jdGlvbigpe3RoaXMuc2V0Q29tbW9uU3RhdHModm9pZCAwKX07Ti5oYXNDb21tb25TdGF0cz1mdW5jdGlvbigpe3JldHVybiBudWxsIT1OZyh0aGlzLDEpfTtOLmdldFVuaXF1ZT1mdW5jdGlvbigpe3JldHVybiBXZyh0aGlzLDIsMCl9OwpOLnNldFVuaXF1ZT1mdW5jdGlvbihhKXtZaCh0aGlzLDIsYSl9O04uZ2V0QXZnTnVtQnl0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gWGcodGhpcywzKX07Ti5zZXRBdmdOdW1CeXRlcz1mdW5jdGlvbihhKXskaCh0aGlzLDMsYSl9O04uZ2V0TWluTnVtQnl0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gWGcodGhpcyw0KX07Ti5zZXRNaW5OdW1CeXRlcz1mdW5jdGlvbihhKXskaCh0aGlzLDQsYSl9O04uZ2V0TWF4TnVtQnl0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gWGcodGhpcyw1KX07Ti5zZXRNYXhOdW1CeXRlcz1mdW5jdGlvbihhKXskaCh0aGlzLDUsYSl9O049WGwucHJvdG90eXBlO04udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIHVtKGEsdGhpcyl9O2Z1bmN0aW9uIHVtKGEsYyl7dmFyIGQsZj17Y29tbW9uU3RhdHM6KGQ9Yy5nZXRDb21tb25TdGF0cygpKSYmUG0oYSxkKX07YSYmKGYuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGZ9CmZ1bmN0aW9uIHptKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1uZXcgWWw7Yy5yZWFkTWVzc2FnZShkLFJtKTthLnNldENvbW1vblN0YXRzKGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1OLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyB3ZjtFbSh0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTtmdW5jdGlvbiBFbShhLGMpe2E9YS5nZXRDb21tb25TdGF0cygpO251bGwhPWEmJmMud3JpdGVNZXNzYWdlKDEsYSxUbSl9Ti5nZXRDb21tb25TdGF0cz1mdW5jdGlvbigpe3JldHVybiBlaSh0aGlzLFlsLDEpfTtOLnNldENvbW1vblN0YXRzPWZ1bmN0aW9uKGEpe2hpKHRoaXMsMSxhKX07Ti5jbGVhckNvbW1vblN0YXRzPWZ1bmN0aW9uKCl7dGhpcy5zZXRDb21tb25TdGF0cyh2b2lkIDApfTsKTi5oYXNDb21tb25TdGF0cz1mdW5jdGlvbigpe3JldHVybiBudWxsIT1OZyh0aGlzLDEpfTtOPVlsLnByb3RvdHlwZTtOLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBQbShhLHRoaXMpfTsKZnVuY3Rpb24gUG0oYSxjKXt2YXIgZCxmPXtudW1Ob25NaXNzaW5nOldnKGMsMSwwKSxudW1NaXNzaW5nOldnKGMsMiwwKSxtaW5OdW1WYWx1ZXM6V2coYywzLDApLG1heE51bVZhbHVlczpXZyhjLDQsMCksYXZnTnVtVmFsdWVzOlhnKGMsNSksdG90TnVtVmFsdWVzOldnKGMsOCwwKSxudW1WYWx1ZXNIaXN0b2dyYW06KGQ9Yy5nZXROdW1WYWx1ZXNIaXN0b2dyYW0oKSkmJkptKGEsZCksd2VpZ2h0ZWRDb21tb25TdGF0czooZD1jLmdldFdlaWdodGVkQ29tbW9uU3RhdHMoKSkmJkdtKGEsZCksZmVhdHVyZUxpc3RMZW5ndGhIaXN0b2dyYW06KGQ9Yy5nZXRGZWF0dXJlTGlzdExlbmd0aEhpc3RvZ3JhbSgpKSYmSm0oYSxkKX07YSYmKGYuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGZ9CmZ1bmN0aW9uIFJtKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1jLnJlYWRVaW50NjQoKTthLnNldE51bU5vbk1pc3NpbmcoZCk7YnJlYWs7Y2FzZSAyOmQ9Yy5yZWFkVWludDY0KCk7YS5zZXROdW1NaXNzaW5nKGQpO2JyZWFrO2Nhc2UgMzpkPWMucmVhZFVpbnQ2NCgpO2Euc2V0TWluTnVtVmFsdWVzKGQpO2JyZWFrO2Nhc2UgNDpkPWMucmVhZFVpbnQ2NCgpO2Euc2V0TWF4TnVtVmFsdWVzKGQpO2JyZWFrO2Nhc2UgNTpkPWMucmVhZEZsb2F0KCk7YS5zZXRBdmdOdW1WYWx1ZXMoZCk7YnJlYWs7Y2FzZSA4OmQ9Yy5yZWFkVWludDY0KCk7YS5zZXRUb3ROdW1WYWx1ZXMoZCk7YnJlYWs7Y2FzZSA2OmQ9bmV3IFpsO2MucmVhZE1lc3NhZ2UoZCxMbSk7YS5zZXROdW1WYWx1ZXNIaXN0b2dyYW0oZCk7YnJlYWs7Y2FzZSA3OmQ9bmV3IEtsO2MucmVhZE1lc3NhZ2UoZCxIbSk7YS5zZXRXZWlnaHRlZENvbW1vblN0YXRzKGQpOwpicmVhaztjYXNlIDk6ZD1uZXcgWmw7Yy5yZWFkTWVzc2FnZShkLExtKTthLnNldEZlYXR1cmVMaXN0TGVuZ3RoSGlzdG9ncmFtKGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1OLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyB3ZjtUbSh0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTsKZnVuY3Rpb24gVG0oYSxjKXt2YXIgZD1hLmdldE51bU5vbk1pc3NpbmcoKTswIT09ZCYmYy53cml0ZVVpbnQ2NCgxLGQpO2Q9YS5nZXROdW1NaXNzaW5nKCk7MCE9PWQmJmMud3JpdGVVaW50NjQoMixkKTtkPWEuZ2V0TWluTnVtVmFsdWVzKCk7MCE9PWQmJmMud3JpdGVVaW50NjQoMyxkKTtkPWEuZ2V0TWF4TnVtVmFsdWVzKCk7MCE9PWQmJmMud3JpdGVVaW50NjQoNCxkKTtkPWEuZ2V0QXZnTnVtVmFsdWVzKCk7MCE9PWQmJmMud3JpdGVGbG9hdCg1LGQpO2Q9YS5nZXRUb3ROdW1WYWx1ZXMoKTswIT09ZCYmYy53cml0ZVVpbnQ2NCg4LGQpO2Q9YS5nZXROdW1WYWx1ZXNIaXN0b2dyYW0oKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSg2LGQsTm0pO2Q9YS5nZXRXZWlnaHRlZENvbW1vblN0YXRzKCk7bnVsbCE9ZCYmYy53cml0ZU1lc3NhZ2UoNyxkLEltKTtkPWEuZ2V0RmVhdHVyZUxpc3RMZW5ndGhIaXN0b2dyYW0oKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSg5LGQsTm0pfQpOLmdldE51bU5vbk1pc3Npbmc9ZnVuY3Rpb24oKXtyZXR1cm4gV2codGhpcywxLDApfTtOLnNldE51bU5vbk1pc3Npbmc9ZnVuY3Rpb24oYSl7WWgodGhpcywxLGEpfTtOLmdldE51bU1pc3Npbmc9ZnVuY3Rpb24oKXtyZXR1cm4gV2codGhpcywyLDApfTtOLnNldE51bU1pc3Npbmc9ZnVuY3Rpb24oYSl7WWgodGhpcywyLGEpfTtOLmdldE1pbk51bVZhbHVlcz1mdW5jdGlvbigpe3JldHVybiBXZyh0aGlzLDMsMCl9O04uc2V0TWluTnVtVmFsdWVzPWZ1bmN0aW9uKGEpe1loKHRoaXMsMyxhKX07Ti5nZXRNYXhOdW1WYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gV2codGhpcyw0LDApfTtOLnNldE1heE51bVZhbHVlcz1mdW5jdGlvbihhKXtZaCh0aGlzLDQsYSl9O04uZ2V0QXZnTnVtVmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIFhnKHRoaXMsNSl9O04uc2V0QXZnTnVtVmFsdWVzPWZ1bmN0aW9uKGEpeyRoKHRoaXMsNSxhKX07Ck4uZ2V0VG90TnVtVmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIFdnKHRoaXMsOCwwKX07Ti5zZXRUb3ROdW1WYWx1ZXM9ZnVuY3Rpb24oYSl7WWgodGhpcyw4LGEpfTtOLmdldE51bVZhbHVlc0hpc3RvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBlaSh0aGlzLFpsLDYpfTtOLnNldE51bVZhbHVlc0hpc3RvZ3JhbT1mdW5jdGlvbihhKXtoaSh0aGlzLDYsYSl9O04uY2xlYXJOdW1WYWx1ZXNIaXN0b2dyYW09ZnVuY3Rpb24oKXt0aGlzLnNldE51bVZhbHVlc0hpc3RvZ3JhbSh2b2lkIDApfTtOLmhhc051bVZhbHVlc0hpc3RvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBudWxsIT1OZyh0aGlzLDYpfTtOLmdldFdlaWdodGVkQ29tbW9uU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gZWkodGhpcyxLbCw3KX07Ti5zZXRXZWlnaHRlZENvbW1vblN0YXRzPWZ1bmN0aW9uKGEpe2hpKHRoaXMsNyxhKX07Ti5jbGVhcldlaWdodGVkQ29tbW9uU3RhdHM9ZnVuY3Rpb24oKXt0aGlzLnNldFdlaWdodGVkQ29tbW9uU3RhdHModm9pZCAwKX07Ck4uaGFzV2VpZ2h0ZWRDb21tb25TdGF0cz1mdW5jdGlvbigpe3JldHVybiBudWxsIT1OZyh0aGlzLDcpfTtOLmdldEZlYXR1cmVMaXN0TGVuZ3RoSGlzdG9ncmFtPWZ1bmN0aW9uKCl7cmV0dXJuIGVpKHRoaXMsWmwsOSl9O04uc2V0RmVhdHVyZUxpc3RMZW5ndGhIaXN0b2dyYW09ZnVuY3Rpb24oYSl7aGkodGhpcyw5LGEpfTtOLmNsZWFyRmVhdHVyZUxpc3RMZW5ndGhIaXN0b2dyYW09ZnVuY3Rpb24oKXt0aGlzLnNldEZlYXR1cmVMaXN0TGVuZ3RoSGlzdG9ncmFtKHZvaWQgMCl9O04uaGFzRmVhdHVyZUxpc3RMZW5ndGhIaXN0b2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9TmcodGhpcyw5KX07dmFyICRsPVszXTtabC5wcm90b3R5cGUudG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIEptKGEsdGhpcyl9OwpmdW5jdGlvbiBKbShhLGMpe3ZhciBkPXtudW1OYW46V2coYywxLDApLG51bVVuZGVmaW5lZDpXZyhjLDIsMCksYnVja2V0c0xpc3Q6TWcoYy5nZXRCdWNrZXRzTGlzdCgpLGFuLGEpLHR5cGU6V2coYyw0LDApLG5hbWU6V2coYyw1LCIiKX07YSYmKGQuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGR9CmZ1bmN0aW9uIExtKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1jLnJlYWRVaW50NjQoKTthLnNldE51bU5hbihkKTticmVhaztjYXNlIDI6ZD1jLnJlYWRVaW50NjQoKTthLnNldE51bVVuZGVmaW5lZChkKTticmVhaztjYXNlIDM6ZD1uZXcgYW07Yy5yZWFkTWVzc2FnZShkLGJuKTthLmFkZEJ1Y2tldHMoZCk7YnJlYWs7Y2FzZSA0OmQ9Yy5yZWFkRW51bSgpO2Euc2V0VHlwZShkKTticmVhaztjYXNlIDU6ZD1jLnJlYWRTdHJpbmcoKTthLnNldE5hbWUoZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfVpsLnByb3RvdHlwZS5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgd2Y7Tm0odGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07CmZ1bmN0aW9uIE5tKGEsYyl7dmFyIGQ9YS5nZXROdW1OYW4oKTswIT09ZCYmYy53cml0ZVVpbnQ2NCgxLGQpO2Q9YS5nZXROdW1VbmRlZmluZWQoKTswIT09ZCYmYy53cml0ZVVpbnQ2NCgyLGQpO2Q9YS5nZXRCdWNrZXRzTGlzdCgpOzA8ZC5sZW5ndGgmJmMud3JpdGVSZXBlYXRlZE1lc3NhZ2UoMyxkLGNuKTtkPWEuZ2V0VHlwZSgpOzAhPT1kJiZjLndyaXRlRW51bSg0LGQpO2Q9YS5nZXROYW1lKCk7MDxkLmxlbmd0aCYmYy53cml0ZVN0cmluZyg1LGQpfU49YW0ucHJvdG90eXBlO04udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIGFuKGEsdGhpcyl9O2Z1bmN0aW9uIGFuKGEsYyl7dmFyIGQ9e2xvd1ZhbHVlOlhnKGMsMSksaGlnaFZhbHVlOlhnKGMsMiksZGVwcmVjYXRlZENvdW50OldnKGMsMywwKSxzYW1wbGVDb3VudDpYZyhjLDQpfTthJiYoZC4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZH0KZnVuY3Rpb24gYm4oYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPWMucmVhZERvdWJsZSgpO2Euc2V0TG93VmFsdWUoZCk7YnJlYWs7Y2FzZSAyOmQ9Yy5yZWFkRG91YmxlKCk7YS5zZXRIaWdoVmFsdWUoZCk7YnJlYWs7Y2FzZSAzOmQ9Yy5yZWFkVWludDY0KCk7YS5zZXREZXByZWNhdGVkQ291bnQoZCk7YnJlYWs7Y2FzZSA0OmQ9Yy5yZWFkRG91YmxlKCk7YS5zZXRTYW1wbGVDb3VudChkKTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9Ti5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgd2Y7Y24odGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07CmZ1bmN0aW9uIGNuKGEsYyl7dmFyIGQ9YS5nZXRMb3dWYWx1ZSgpOzAhPT1kJiZjLndyaXRlRG91YmxlKDEsZCk7ZD1hLmdldEhpZ2hWYWx1ZSgpOzAhPT1kJiZjLndyaXRlRG91YmxlKDIsZCk7ZD1hLmdldERlcHJlY2F0ZWRDb3VudCgpOzAhPT1kJiZjLndyaXRlVWludDY0KDMsZCk7ZD1hLmdldFNhbXBsZUNvdW50KCk7MCE9PWQmJmMud3JpdGVEb3VibGUoNCxkKX1OLmdldExvd1ZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIFhnKHRoaXMsMSl9O04uc2V0TG93VmFsdWU9ZnVuY3Rpb24oYSl7JGgodGhpcywxLGEpfTtOLmdldEhpZ2hWYWx1ZT1mdW5jdGlvbigpe3JldHVybiBYZyh0aGlzLDIpfTtOLnNldEhpZ2hWYWx1ZT1mdW5jdGlvbihhKXskaCh0aGlzLDIsYSl9O04uZ2V0RGVwcmVjYXRlZENvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIFdnKHRoaXMsMywwKX07Ti5zZXREZXByZWNhdGVkQ291bnQ9ZnVuY3Rpb24oYSl7WWgodGhpcywzLGEpfTsKTi5nZXRTYW1wbGVDb3VudD1mdW5jdGlvbigpe3JldHVybiBYZyh0aGlzLDQpfTtOLnNldFNhbXBsZUNvdW50PWZ1bmN0aW9uKGEpeyRoKHRoaXMsNCxhKX07Tj1abC5wcm90b3R5cGU7Ti5nZXROdW1OYW49ZnVuY3Rpb24oKXtyZXR1cm4gV2codGhpcywxLDApfTtOLnNldE51bU5hbj1mdW5jdGlvbihhKXtZaCh0aGlzLDEsYSl9O04uZ2V0TnVtVW5kZWZpbmVkPWZ1bmN0aW9uKCl7cmV0dXJuIFdnKHRoaXMsMiwwKX07Ti5zZXROdW1VbmRlZmluZWQ9ZnVuY3Rpb24oYSl7WWgodGhpcywyLGEpfTtOLmdldEJ1Y2tldHNMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIGZpKHRoaXMsYW0sMyl9O04uc2V0QnVja2V0c0xpc3Q9ZnVuY3Rpb24oYSl7amkodGhpcywzLGEpfTtOLmFkZEJ1Y2tldHM9ZnVuY3Rpb24oYSl7cmV0dXJuIGtpKHRoaXMsMyxhLGFtLHZvaWQgMCl9O04uY2xlYXJCdWNrZXRzTGlzdD1mdW5jdGlvbigpe3RoaXMuc2V0QnVja2V0c0xpc3QoW10pfTsKTi5nZXRUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIFdnKHRoaXMsNCwwKX07Ti5zZXRUeXBlPWZ1bmN0aW9uKGEpe2JpKHRoaXMsNCxhKX07Ti5nZXROYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFdnKHRoaXMsNSwiIil9O04uc2V0TmFtZT1mdW5jdGlvbihhKXthaSh0aGlzLDUsYSl9O3ZhciBjbT1bMV07Ym0ucHJvdG90eXBlLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBLbShhLHRoaXMpfTtmdW5jdGlvbiBLbShhLGMpe3ZhciBkPXtidWNrZXRzTGlzdDpNZyhjLmdldEJ1Y2tldHNMaXN0KCksZG4sYSksbmFtZTpXZyhjLDIsIiIpfTthJiYoZC4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZH0KZnVuY3Rpb24gTW0oYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPW5ldyBkbTtjLnJlYWRNZXNzYWdlKGQsZW4pO2EuYWRkQnVja2V0cyhkKTticmVhaztjYXNlIDI6ZD1jLnJlYWRTdHJpbmcoKTthLnNldE5hbWUoZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfWJtLnByb3RvdHlwZS5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgd2Y7T20odGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07ZnVuY3Rpb24gT20oYSxjKXt2YXIgZD1hLmdldEJ1Y2tldHNMaXN0KCk7MDxkLmxlbmd0aCYmYy53cml0ZVJlcGVhdGVkTWVzc2FnZSgxLGQsZm4pO2Q9YS5nZXROYW1lKCk7MDxkLmxlbmd0aCYmYy53cml0ZVN0cmluZygyLGQpfU49ZG0ucHJvdG90eXBlO04udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIGRuKGEsdGhpcyl9OwpmdW5jdGlvbiBkbihhLGMpe3ZhciBkPXtsb3dSYW5rOldnKGMsMSwwKSxoaWdoUmFuazpXZyhjLDIsMCksZGVwcmVjYXRlZENvdW50OldnKGMsMywwKSxsYWJlbDpXZyhjLDQsIiIpLHNhbXBsZUNvdW50OlhnKGMsNSl9O2EmJihkLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBkfQpmdW5jdGlvbiBlbihhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9Yy5yZWFkVWludDY0KCk7YS5zZXRMb3dSYW5rKGQpO2JyZWFrO2Nhc2UgMjpkPWMucmVhZFVpbnQ2NCgpO2Euc2V0SGlnaFJhbmsoZCk7YnJlYWs7Y2FzZSAzOmQ9Yy5yZWFkVWludDY0KCk7YS5zZXREZXByZWNhdGVkQ291bnQoZCk7YnJlYWs7Y2FzZSA0OmQ9Yy5yZWFkU3RyaW5nKCk7YS5zZXRMYWJlbChkKTticmVhaztjYXNlIDU6ZD1jLnJlYWREb3VibGUoKTthLnNldFNhbXBsZUNvdW50KGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1OLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyB3Zjtmbih0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTsKZnVuY3Rpb24gZm4oYSxjKXt2YXIgZD1hLmdldExvd1JhbmsoKTswIT09ZCYmYy53cml0ZVVpbnQ2NCgxLGQpO2Q9YS5nZXRIaWdoUmFuaygpOzAhPT1kJiZjLndyaXRlVWludDY0KDIsZCk7ZD1hLmdldERlcHJlY2F0ZWRDb3VudCgpOzAhPT1kJiZjLndyaXRlVWludDY0KDMsZCk7ZD1hLmdldExhYmVsKCk7MDxkLmxlbmd0aCYmYy53cml0ZVN0cmluZyg0LGQpO2Q9YS5nZXRTYW1wbGVDb3VudCgpOzAhPT1kJiZjLndyaXRlRG91YmxlKDUsZCl9Ti5nZXRMb3dSYW5rPWZ1bmN0aW9uKCl7cmV0dXJuIFdnKHRoaXMsMSwwKX07Ti5zZXRMb3dSYW5rPWZ1bmN0aW9uKGEpe1loKHRoaXMsMSxhKX07Ti5nZXRIaWdoUmFuaz1mdW5jdGlvbigpe3JldHVybiBXZyh0aGlzLDIsMCl9O04uc2V0SGlnaFJhbms9ZnVuY3Rpb24oYSl7WWgodGhpcywyLGEpfTtOLmdldERlcHJlY2F0ZWRDb3VudD1mdW5jdGlvbigpe3JldHVybiBXZyh0aGlzLDMsMCl9OwpOLnNldERlcHJlY2F0ZWRDb3VudD1mdW5jdGlvbihhKXtZaCh0aGlzLDMsYSl9O04uZ2V0TGFiZWw9ZnVuY3Rpb24oKXtyZXR1cm4gV2codGhpcyw0LCIiKX07Ti5zZXRMYWJlbD1mdW5jdGlvbihhKXthaSh0aGlzLDQsYSl9O04uZ2V0U2FtcGxlQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gWGcodGhpcyw1KX07Ti5zZXRTYW1wbGVDb3VudD1mdW5jdGlvbihhKXskaCh0aGlzLDUsYSl9O049Ym0ucHJvdG90eXBlO04uZ2V0QnVja2V0c0xpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gZmkodGhpcyxkbSwxKX07Ti5zZXRCdWNrZXRzTGlzdD1mdW5jdGlvbihhKXtqaSh0aGlzLDEsYSl9O04uYWRkQnVja2V0cz1mdW5jdGlvbihhKXtyZXR1cm4ga2kodGhpcywxLGEsZG0sdm9pZCAwKX07Ti5jbGVhckJ1Y2tldHNMaXN0PWZ1bmN0aW9uKCl7dGhpcy5zZXRCdWNrZXRzTGlzdChbXSl9O04uZ2V0TmFtZT1mdW5jdGlvbigpe3JldHVybiBXZyh0aGlzLDIsIiIpfTsKTi5zZXROYW1lPWZ1bmN0aW9uKGEpe2FpKHRoaXMsMixhKX07Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2RlcHMuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovL2FuYWx5dGljcy5odG1sLmpzCndpbmRvdy5nYT1mdW5jdGlvbigpe307CgovLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci8vCi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAovLwovLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgovLyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiFmdW5jdGlvbihhLGIpe3ZhciBjPXt9LGQ9e30sZT17fSxmPW51bGw7IWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtpZigibnVtYmVyIj09dHlwZW9mIGEpcmV0dXJuIGE7dmFyIGI9e307Zm9yKHZhciBjIGluIGEpYltjXT1hW2NdO3JldHVybiBifWZ1bmN0aW9uIGQoKXt0aGlzLl9kZWxheT0wLHRoaXMuX2VuZERlbGF5PTAsdGhpcy5fZmlsbD0ibm9uZSIsdGhpcy5faXRlcmF0aW9uU3RhcnQ9MCx0aGlzLl9pdGVyYXRpb25zPTEsdGhpcy5fZHVyYXRpb249MCx0aGlzLl9wbGF5YmFja1JhdGU9MSx0aGlzLl9kaXJlY3Rpb249Im5vcm1hbCIsdGhpcy5fZWFzaW5nPSJsaW5lYXIiLHRoaXMuX2Vhc2luZ0Z1bmN0aW9uPXd9ZnVuY3Rpb24gZSgpe3JldHVybiBhLmlzRGVwcmVjYXRlZCgiSW52YWxpZCB0aW1pbmcgaW5wdXRzIiwiMjAxNi0wMy0wMiIsIlR5cGVFcnJvciBleGNlcHRpb25zIHdpbGwgYmUgdGhyb3duIGluc3RlYWQuIiwhMCl9ZnVuY3Rpb24gZihiLGMsZSl7dmFyIGY9bmV3IGQ7cmV0dXJuIGMmJihmLmZpbGw9ImJvdGgiLGYuZHVyYXRpb249ImF1dG8iKSwibnVtYmVyIiE9dHlwZW9mIGJ8fGlzTmFOKGIpP3ZvaWQgMCE9PWImJk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGIpLmZvckVhY2goZnVuY3Rpb24oYyl7aWYoImF1dG8iIT1iW2NdKXtpZigoIm51bWJlciI9PXR5cGVvZiBmW2NdfHwiZHVyYXRpb24iPT1jKSYmKCJudW1iZXIiIT10eXBlb2YgYltjXXx8aXNOYU4oYltjXSkpKXJldHVybjtpZigiZmlsbCI9PWMmJi0xPT11LmluZGV4T2YoYltjXSkpcmV0dXJuO2lmKCJkaXJlY3Rpb24iPT1jJiYtMT09di5pbmRleE9mKGJbY10pKXJldHVybjtpZigicGxheWJhY2tSYXRlIj09YyYmMSE9PWJbY10mJmEuaXNEZXByZWNhdGVkKCJBbmltYXRpb25FZmZlY3RUaW1pbmcucGxheWJhY2tSYXRlIiwiMjAxNC0xMS0yOCIsIlVzZSBBbmltYXRpb24ucGxheWJhY2tSYXRlIGluc3RlYWQuIikpcmV0dXJuO2ZbY109YltjXX19KTpmLmR1cmF0aW9uPWIsZn1mdW5jdGlvbiBnKGEpe3JldHVybiJudW1iZXIiPT10eXBlb2YgYSYmKGE9aXNOYU4oYSk/e2R1cmF0aW9uOjB9OntkdXJhdGlvbjphfSksYX1mdW5jdGlvbiBoKGIsYyl7cmV0dXJuIGI9YS5udW1lcmljVGltaW5nVG9PYmplY3QoYiksZihiLGMpfWZ1bmN0aW9uIGkoYSxiLGMsZCl7cmV0dXJuIDA+YXx8YT4xfHwwPmN8fGM+MT93OmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGYoYSxiLGMpe3JldHVybiAzKmEqKDEtYykqKDEtYykqYyszKmIqKDEtYykqYypjK2MqYypjfWlmKDA9PWV8fDE9PWUpcmV0dXJuIGU7Zm9yKHZhciBnPTAsaD0xOzspe3ZhciBpPShnK2gpLzIsaj1mKGEsYyxpKTtpZihNYXRoLmFicyhlLWopPDFlLTQpcmV0dXJuIGYoYixkLGkpO2U+aj9nPWk6aD1pfX19ZnVuY3Rpb24gaihhLGIpe3JldHVybiBmdW5jdGlvbihjKXtpZihjPj0xKXJldHVybiAxO3ZhciBkPTEvYTtyZXR1cm4gYys9YipkLGMtYyVkfX1mdW5jdGlvbiBrKGEpe0J8fChCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlKSxCLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uPSIiLEIuYW5pbWF0aW9uVGltaW5nRnVuY3Rpb249YTt2YXIgYj1CLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uO2lmKCIiPT1iJiZlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcihhKyIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIGVhc2luZyIpO3ZhciBjPUQuZXhlYyhiKTtpZihjKXJldHVybiBpLmFwcGx5KHRoaXMsYy5zbGljZSgxKS5tYXAoTnVtYmVyKSk7dmFyIGQ9RS5leGVjKGIpO2lmKGQpcmV0dXJuIGooTnVtYmVyKGRbMV0pLHtzdGFydDp4LG1pZGRsZTp5LGVuZDp6fVtkWzJdXSk7dmFyIGY9QVtiXTtyZXR1cm4gZj9mOnd9ZnVuY3Rpb24gbChhKXtyZXR1cm4gTWF0aC5hYnMobShhKS9hLnBsYXliYWNrUmF0ZSl9ZnVuY3Rpb24gbShhKXtyZXR1cm4gYS5kdXJhdGlvbiphLml0ZXJhdGlvbnN9ZnVuY3Rpb24gbihhLGIsYyl7cmV0dXJuIG51bGw9PWI/RjpiPGMuZGVsYXk/RzpiPj1jLmRlbGF5K2E/SDpJfWZ1bmN0aW9uIG8oYSxiLGMsZCxlKXtzd2l0Y2goZCl7Y2FzZSBHOnJldHVybiJiYWNrd2FyZHMiPT1ifHwiYm90aCI9PWI/MDpudWxsO2Nhc2UgSTpyZXR1cm4gYy1lO2Nhc2UgSDpyZXR1cm4iZm9yd2FyZHMiPT1ifHwiYm90aCI9PWI/YTpudWxsO2Nhc2UgRjpyZXR1cm4gbnVsbH19ZnVuY3Rpb24gcChhLGIsYyxkKXtyZXR1cm4oZC5wbGF5YmFja1JhdGU8MD9iLWE6YikqZC5wbGF5YmFja1JhdGUrY31mdW5jdGlvbiBxKGEsYixjLGQsZSl7cmV0dXJuIGM9PT0xLzB8fGM9PT0tKDEvMCl8fGMtZD09YiYmZS5pdGVyYXRpb25zJiYoZS5pdGVyYXRpb25zK2UuaXRlcmF0aW9uU3RhcnQpJTE9PTA/YTpjJWF9ZnVuY3Rpb24gcihhLGIsYyxkKXtyZXR1cm4gMD09PWM/MDpiPT1hP2QuaXRlcmF0aW9uU3RhcnQrZC5pdGVyYXRpb25zLTE6TWF0aC5mbG9vcihjL2EpfWZ1bmN0aW9uIHMoYSxiLGMsZCl7dmFyIGU9YSUyPj0xLGY9Im5vcm1hbCI9PWQuZGlyZWN0aW9ufHxkLmRpcmVjdGlvbj09KGU/ImFsdGVybmF0ZS1yZXZlcnNlIjoiYWx0ZXJuYXRlIiksZz1mP2M6Yi1jLGg9Zy9iO3JldHVybiBiKmQuX2Vhc2luZ0Z1bmN0aW9uKGgpfWZ1bmN0aW9uIHQoYSxiLGMpe3ZhciBkPW4oYSxiLGMpLGU9byhhLGMuZmlsbCxiLGQsYy5kZWxheSk7aWYobnVsbD09PWUpcmV0dXJuIG51bGw7aWYoMD09PWEpcmV0dXJuIGQ9PT1HPzA6MTt2YXIgZj1jLml0ZXJhdGlvblN0YXJ0KmMuZHVyYXRpb24sZz1wKGEsZSxmLGMpLGg9cShjLmR1cmF0aW9uLG0oYyksZyxmLGMpLGk9cihjLmR1cmF0aW9uLGgsZyxjKTtyZXR1cm4gcyhpLGMuZHVyYXRpb24saCxjKS9jLmR1cmF0aW9ufXZhciB1PSJiYWNrd2FyZHN8Zm9yd2FyZHN8Ym90aHxub25lIi5zcGxpdCgifCIpLHY9InJldmVyc2V8YWx0ZXJuYXRlfGFsdGVybmF0ZS1yZXZlcnNlIi5zcGxpdCgifCIpLHc9ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O2QucHJvdG90eXBlPXtfc2V0TWVtYmVyOmZ1bmN0aW9uKGIsYyl7dGhpc1siXyIrYl09Yyx0aGlzLl9lZmZlY3QmJih0aGlzLl9lZmZlY3QuX3RpbWluZ0lucHV0W2JdPWMsdGhpcy5fZWZmZWN0Ll90aW1pbmc9YS5ub3JtYWxpemVUaW1pbmdJbnB1dCh0aGlzLl9lZmZlY3QuX3RpbWluZ0lucHV0KSx0aGlzLl9lZmZlY3QuYWN0aXZlRHVyYXRpb249YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbih0aGlzLl9lZmZlY3QuX3RpbWluZyksdGhpcy5fZWZmZWN0Ll9hbmltYXRpb24mJnRoaXMuX2VmZmVjdC5fYW5pbWF0aW9uLl9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbigpKX0sZ2V0IHBsYXliYWNrUmF0ZSgpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9LHNldCBkZWxheShhKXt0aGlzLl9zZXRNZW1iZXIoImRlbGF5IixhKX0sZ2V0IGRlbGF5KCl7cmV0dXJuIHRoaXMuX2RlbGF5fSxzZXQgZW5kRGVsYXkoYSl7dGhpcy5fc2V0TWVtYmVyKCJlbmREZWxheSIsYSl9LGdldCBlbmREZWxheSgpe3JldHVybiB0aGlzLl9lbmREZWxheX0sc2V0IGZpbGwoYSl7dGhpcy5fc2V0TWVtYmVyKCJmaWxsIixhKX0sZ2V0IGZpbGwoKXtyZXR1cm4gdGhpcy5fZmlsbH0sc2V0IGl0ZXJhdGlvblN0YXJ0KGEpe2lmKChpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIml0ZXJhdGlvblN0YXJ0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLCByZWNlaXZlZDogIit0aW1pbmcuaXRlcmF0aW9uU3RhcnQpO3RoaXMuX3NldE1lbWJlcigiaXRlcmF0aW9uU3RhcnQiLGEpfSxnZXQgaXRlcmF0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy5faXRlcmF0aW9uU3RhcnR9LHNldCBkdXJhdGlvbihhKXtpZigiYXV0byIhPWEmJihpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoImR1cmF0aW9uIG11c3QgYmUgbm9uLW5lZ2F0aXZlIG9yIGF1dG8sIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiZHVyYXRpb24iLGEpfSxnZXQgZHVyYXRpb24oKXtyZXR1cm4gdGhpcy5fZHVyYXRpb259LHNldCBkaXJlY3Rpb24oYSl7dGhpcy5fc2V0TWVtYmVyKCJkaXJlY3Rpb24iLGEpfSxnZXQgZGlyZWN0aW9uKCl7cmV0dXJuIHRoaXMuX2RpcmVjdGlvbn0sc2V0IGVhc2luZyhhKXt0aGlzLl9lYXNpbmdGdW5jdGlvbj1rKGEpLHRoaXMuX3NldE1lbWJlcigiZWFzaW5nIixhKX0sZ2V0IGVhc2luZygpe3JldHVybiB0aGlzLl9lYXNpbmd9LHNldCBpdGVyYXRpb25zKGEpe2lmKChpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIml0ZXJhdGlvbnMgbXVzdCBiZSBub24tbmVnYXRpdmUsIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiaXRlcmF0aW9ucyIsYSl9LGdldCBpdGVyYXRpb25zKCl7cmV0dXJuIHRoaXMuX2l0ZXJhdGlvbnN9fTt2YXIgeD0xLHk9LjUsej0wLEE9e2Vhc2U6aSguMjUsLjEsLjI1LDEpLCJlYXNlLWluIjppKC40MiwwLDEsMSksImVhc2Utb3V0IjppKDAsMCwuNTgsMSksImVhc2UtaW4tb3V0IjppKC40MiwwLC41OCwxKSwic3RlcC1zdGFydCI6aigxLHgpLCJzdGVwLW1pZGRsZSI6aigxLHkpLCJzdGVwLWVuZCI6aigxLHopfSxCPW51bGwsQz0iXFxzKigtP1xcZCtcXC4/XFxkKnwtP1xcLlxcZCspXFxzKiIsRD1uZXcgUmVnRXhwKCJjdWJpYy1iZXppZXJcXCgiK0MrIiwiK0MrIiwiK0MrIiwiK0MrIlxcKSIpLEU9L3N0ZXBzXChccyooXGQrKVxzKixccyooc3RhcnR8bWlkZGxlfGVuZClccypcKS8sRj0wLEc9MSxIPTIsST0zO2EuY2xvbmVUaW1pbmdJbnB1dD1jLGEubWFrZVRpbWluZz1mLGEubnVtZXJpY1RpbWluZ1RvT2JqZWN0PWcsYS5ub3JtYWxpemVUaW1pbmdJbnB1dD1oLGEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb249bCxhLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbj10LGEuY2FsY3VsYXRlUGhhc2U9bixhLnRvVGltaW5nRnVuY3Rpb249a30oYyxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYSBpbiBqP2pbYV1bYl18fGI6Yn1mdW5jdGlvbiBkKGEsYixkKXt2YXIgZT1nW2FdO2lmKGUpe2guc3R5bGVbYV09Yjtmb3IodmFyIGYgaW4gZSl7dmFyIGk9ZVtmXSxqPWguc3R5bGVbaV07ZFtpXT1jKGksail9fWVsc2UgZFthXT1jKGEsYil9ZnVuY3Rpb24gZShhKXt2YXIgYj1bXTtmb3IodmFyIGMgaW4gYSlpZighKGMgaW5bImVhc2luZyIsIm9mZnNldCIsImNvbXBvc2l0ZSJdKSl7dmFyIGQ9YVtjXTtBcnJheS5pc0FycmF5KGQpfHwoZD1bZF0pO2Zvcih2YXIgZSxmPWQubGVuZ3RoLGc9MDtmPmc7ZysrKWU9e30sIm9mZnNldCJpbiBhP2Uub2Zmc2V0PWEub2Zmc2V0OjE9PWY/ZS5vZmZzZXQ9MTplLm9mZnNldD1nLyhmLTEpLCJlYXNpbmciaW4gYSYmKGUuZWFzaW5nPWEuZWFzaW5nKSwiY29tcG9zaXRlImluIGEmJihlLmNvbXBvc2l0ZT1hLmNvbXBvc2l0ZSksZVtjXT1kW2ddLGIucHVzaChlKX1yZXR1cm4gYi5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEub2Zmc2V0LWIub2Zmc2V0fSksYn1mdW5jdGlvbiBmKGEpe2Z1bmN0aW9uIGIoKXt2YXIgYT1jLmxlbmd0aDtudWxsPT1jW2EtMV0ub2Zmc2V0JiYoY1thLTFdLm9mZnNldD0xKSxhPjEmJm51bGw9PWNbMF0ub2Zmc2V0JiYoY1swXS5vZmZzZXQ9MCk7Zm9yKHZhciBiPTAsZD1jWzBdLm9mZnNldCxlPTE7YT5lO2UrKyl7dmFyIGY9Y1tlXS5vZmZzZXQ7aWYobnVsbCE9Zil7Zm9yKHZhciBnPTE7ZS1iPmc7ZysrKWNbYitnXS5vZmZzZXQ9ZCsoZi1kKSpnLyhlLWIpO2I9ZSxkPWZ9fX1pZihudWxsPT1hKXJldHVybltdO3dpbmRvdy5TeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmQXJyYXkucHJvdG90eXBlLmZyb20mJmFbU3ltYm9sLml0ZXJhdG9yXSYmKGE9QXJyYXkuZnJvbShhKSksQXJyYXkuaXNBcnJheShhKXx8KGE9ZShhKSk7Zm9yKHZhciBjPWEubWFwKGZ1bmN0aW9uKGEpe3ZhciBiPXt9O2Zvcih2YXIgYyBpbiBhKXt2YXIgZT1hW2NdO2lmKCJvZmZzZXQiPT1jKXtpZihudWxsIT1lJiYoZT1OdW1iZXIoZSksIWlzRmluaXRlKGUpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJrZXlmcmFtZSBvZmZzZXRzIG11c3QgYmUgbnVtYmVycy4iKX1lbHNle2lmKCJjb21wb3NpdGUiPT1jKXRocm93e3R5cGU6RE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLG5hbWU6Ik5vdFN1cHBvcnRlZEVycm9yIixtZXNzYWdlOiJhZGQgY29tcG9zaXRpbmcgaXMgbm90IHN1cHBvcnRlZCJ9O2U9IiIrZX1kKGMsZSxiKX1yZXR1cm4gdm9pZCAwPT1iLm9mZnNldCYmKGIub2Zmc2V0PW51bGwpLGJ9KSxmPSEwLGc9LSgxLzApLGg9MDtoPGMubGVuZ3RoO2grKyl7dmFyIGk9Y1toXS5vZmZzZXQ7aWYobnVsbCE9aSl7aWYoZz5pKXRocm93e2NvZGU6RE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUixuYW1lOiJJbnZhbGlkTW9kaWZpY2F0aW9uRXJyb3IiLG1lc3NhZ2U6IktleWZyYW1lcyBhcmUgbm90IGxvb3NlbHkgc29ydGVkIGJ5IG9mZnNldC4gU29ydCBvciBzcGVjaWZ5IG9mZnNldHMuIn07Zz1pfWVsc2UgZj0hMX1yZXR1cm4gYz1jLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXQ+PTAmJmEub2Zmc2V0PD0xfSksZnx8YigpLGN9dmFyIGc9e2JhY2tncm91bmQ6WyJiYWNrZ3JvdW5kSW1hZ2UiLCJiYWNrZ3JvdW5kUG9zaXRpb24iLCJiYWNrZ3JvdW5kU2l6ZSIsImJhY2tncm91bmRSZXBlYXQiLCJiYWNrZ3JvdW5kQXR0YWNobWVudCIsImJhY2tncm91bmRPcmlnaW4iLCJiYWNrZ3JvdW5kQ2xpcCIsImJhY2tncm91bmRDb2xvciJdLGJvcmRlcjpbImJvcmRlclRvcENvbG9yIiwiYm9yZGVyVG9wU3R5bGUiLCJib3JkZXJUb3BXaWR0aCIsImJvcmRlclJpZ2h0Q29sb3IiLCJib3JkZXJSaWdodFN0eWxlIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbUNvbG9yIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21XaWR0aCIsImJvcmRlckxlZnRDb2xvciIsImJvcmRlckxlZnRTdHlsZSIsImJvcmRlckxlZnRXaWR0aCJdLGJvcmRlckJvdHRvbTpbImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21Db2xvciJdLGJvcmRlckNvbG9yOlsiYm9yZGVyVG9wQ29sb3IiLCJib3JkZXJSaWdodENvbG9yIiwiYm9yZGVyQm90dG9tQ29sb3IiLCJib3JkZXJMZWZ0Q29sb3IiXSxib3JkZXJMZWZ0OlsiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyTGVmdFN0eWxlIiwiYm9yZGVyTGVmdENvbG9yIl0sYm9yZGVyUmFkaXVzOlsiYm9yZGVyVG9wTGVmdFJhZGl1cyIsImJvcmRlclRvcFJpZ2h0UmFkaXVzIiwiYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMiLCJib3JkZXJCb3R0b21MZWZ0UmFkaXVzIl0sYm9yZGVyUmlnaHQ6WyJib3JkZXJSaWdodFdpZHRoIiwiYm9yZGVyUmlnaHRTdHlsZSIsImJvcmRlclJpZ2h0Q29sb3IiXSxib3JkZXJUb3A6WyJib3JkZXJUb3BXaWR0aCIsImJvcmRlclRvcFN0eWxlIiwiYm9yZGVyVG9wQ29sb3IiXSxib3JkZXJXaWR0aDpbImJvcmRlclRvcFdpZHRoIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyTGVmdFdpZHRoIl0sZmxleDpbImZsZXhHcm93IiwiZmxleFNocmluayIsImZsZXhCYXNpcyJdLGZvbnQ6WyJmb250RmFtaWx5IiwiZm9udFNpemUiLCJmb250U3R5bGUiLCJmb250VmFyaWFudCIsImZvbnRXZWlnaHQiLCJsaW5lSGVpZ2h0Il0sbWFyZ2luOlsibWFyZ2luVG9wIiwibWFyZ2luUmlnaHQiLCJtYXJnaW5Cb3R0b20iLCJtYXJnaW5MZWZ0Il0sb3V0bGluZTpbIm91dGxpbmVDb2xvciIsIm91dGxpbmVTdHlsZSIsIm91dGxpbmVXaWR0aCJdLHBhZGRpbmc6WyJwYWRkaW5nVG9wIiwicGFkZGluZ1JpZ2h0IiwicGFkZGluZ0JvdHRvbSIsInBhZGRpbmdMZWZ0Il19LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiZGl2IiksaT17dGhpbjoiMXB4IixtZWRpdW06IjNweCIsdGhpY2s6IjVweCJ9LGo9e2JvcmRlckJvdHRvbVdpZHRoOmksYm9yZGVyTGVmdFdpZHRoOmksYm9yZGVyUmlnaHRXaWR0aDppLGJvcmRlclRvcFdpZHRoOmksZm9udFNpemU6eyJ4eC1zbWFsbCI6IjYwJSIsIngtc21hbGwiOiI3NSUiLHNtYWxsOiI4OSUiLG1lZGl1bToiMTAwJSIsbGFyZ2U6IjEyMCUiLCJ4LWxhcmdlIjoiMTUwJSIsInh4LWxhcmdlIjoiMjAwJSJ9LGZvbnRXZWlnaHQ6e25vcm1hbDoiNDAwIixib2xkOiI3MDAifSxvdXRsaW5lV2lkdGg6aSx0ZXh0U2hhZG93Ontub25lOiIwcHggMHB4IDBweCB0cmFuc3BhcmVudCJ9LGJveFNoYWRvdzp7bm9uZToiMHB4IDBweCAwcHggMHB4IHRyYW5zcGFyZW50In19O2EuY29udmVydFRvQXJyYXlGb3JtPWUsYS5ub3JtYWxpemVLZXlmcmFtZXM9Zn0oYyxmKSxmdW5jdGlvbihhKXt2YXIgYj17fTthLmlzRGVwcmVjYXRlZD1mdW5jdGlvbihhLGMsZCxlKXt2YXIgZj1lPyJhcmUiOiJpcyIsZz1uZXcgRGF0ZSxoPW5ldyBEYXRlKGMpO3JldHVybiBoLnNldE1vbnRoKGguZ2V0TW9udGgoKSszKSxoPmc/KGEgaW4gYnx8Y29uc29sZS53YXJuKCJXZWIgQW5pbWF0aW9uczogIithKyIgIitmKyIgZGVwcmVjYXRlZCBhbmQgd2lsbCBzdG9wIHdvcmtpbmcgb24gIitoLnRvRGF0ZVN0cmluZygpKyIuICIrZCksYlthXT0hMCwhMSk6ITB9LGEuZGVwcmVjYXRlZD1mdW5jdGlvbihiLGMsZCxlKXt2YXIgZj1lPyJhcmUiOiJpcyI7aWYoYS5pc0RlcHJlY2F0ZWQoYixjLGQsZSkpdGhyb3cgbmV3IEVycm9yKGIrIiAiK2YrIiBubyBsb25nZXIgc3VwcG9ydGVkLiAiK2QpfX0oYyksZnVuY3Rpb24oKXtpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYW5pbWF0ZSl7dmFyIGE9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFuaW1hdGUoW10sMCksYj0hMDtpZihhJiYoYj0hMSwicGxheXxjdXJyZW50VGltZXxwYXVzZXxyZXZlcnNlfHBsYXliYWNrUmF0ZXxjYW5jZWx8ZmluaXNofHN0YXJ0VGltZXxwbGF5U3RhdGUiLnNwbGl0KCJ8IikuZm9yRWFjaChmdW5jdGlvbihjKXt2b2lkIDA9PT1hW2NdJiYoYj0hMCl9KSksIWIpcmV0dXJufSFmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXtmb3IodmFyIGI9e30sYz0wO2M8YS5sZW5ndGg7YysrKWZvcih2YXIgZCBpbiBhW2NdKWlmKCJvZmZzZXQiIT1kJiYiZWFzaW5nIiE9ZCYmImNvbXBvc2l0ZSIhPWQpe3ZhciBlPXtvZmZzZXQ6YVtjXS5vZmZzZXQsZWFzaW5nOmFbY10uZWFzaW5nLHZhbHVlOmFbY11bZF19O2JbZF09YltkXXx8W10sYltkXS5wdXNoKGUpfWZvcih2YXIgZiBpbiBiKXt2YXIgZz1iW2ZdO2lmKDAhPWdbMF0ub2Zmc2V0fHwxIT1nW2cubGVuZ3RoLTFdLm9mZnNldCl0aHJvd3t0eXBlOkRPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUixuYW1lOiJOb3RTdXBwb3J0ZWRFcnJvciIsbWVzc2FnZToiUGFydGlhbCBrZXlmcmFtZXMgYXJlIG5vdCBzdXBwb3J0ZWQifX1yZXR1cm4gYn1mdW5jdGlvbiBlKGMpe3ZhciBkPVtdO2Zvcih2YXIgZSBpbiBjKWZvcih2YXIgZj1jW2VdLGc9MDtnPGYubGVuZ3RoLTE7ZysrKXt2YXIgaD1mW2ddLm9mZnNldCxpPWZbZysxXS5vZmZzZXQsaj1mW2ddLnZhbHVlLGs9ZltnKzFdLnZhbHVlLGw9ZltnXS5lYXNpbmc7aD09aSYmKDE9PWk/aj1rOms9aiksZC5wdXNoKHtzdGFydFRpbWU6aCxlbmRUaW1lOmksZWFzaW5nOmEudG9UaW1pbmdGdW5jdGlvbihsP2w6ImxpbmVhciIpLHByb3BlcnR5OmUsaW50ZXJwb2xhdGlvbjpiLnByb3BlcnR5SW50ZXJwb2xhdGlvbihlLGosayl9KX1yZXR1cm4gZC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3RhcnRUaW1lLWIuc3RhcnRUaW1lfSksZH1iLmNvbnZlcnRFZmZlY3RJbnB1dD1mdW5jdGlvbihjKXt2YXIgZj1hLm5vcm1hbGl6ZUtleWZyYW1lcyhjKSxnPWQoZiksaD1lKGcpO3JldHVybiBmdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpaC5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIDA+PWMmJjA9PWEuc3RhcnRUaW1lfHxjPj0xJiYxPT1hLmVuZFRpbWV8fGM+PWEuc3RhcnRUaW1lJiZjPD1hLmVuZFRpbWV9KS5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPWMtZC5zdGFydFRpbWUsZj1kLmVuZFRpbWUtZC5zdGFydFRpbWUsZz0wPT1mPzA6ZC5lYXNpbmcoZS9mKTtiLmFwcGx5KGEsZC5wcm9wZXJ0eSxkLmludGVycG9sYXRpb24oZykpfSk7ZWxzZSBmb3IodmFyIGQgaW4gZykib2Zmc2V0IiE9ZCYmImVhc2luZyIhPWQmJiJjb21wb3NpdGUiIT1kJiZiLmNsZWFyKGEsZCl9fX0oYyxkLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3JldHVybiBhLnJlcGxhY2UoLy0oLikvZyxmdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9KX1mdW5jdGlvbiBlKGEsYixjKXtoW2NdPWhbY118fFtdLGhbY10ucHVzaChbYSxiXSl9ZnVuY3Rpb24gZihhLGIsYyl7Zm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspe3ZhciBnPWNbZl07ZShhLGIsZChnKSl9fWZ1bmN0aW9uIGcoYyxlLGYpe3ZhciBnPWM7Ly0vLnRlc3QoYykmJiFhLmlzRGVwcmVjYXRlZCgiSHlwaGVuYXRlZCBwcm9wZXJ0eSBuYW1lcyIsIjIwMTYtMDMtMjIiLCJVc2UgY2FtZWxDYXNlIGluc3RlYWQuIiwhMCkmJihnPWQoYykpLCJpbml0aWFsIiE9ZSYmImluaXRpYWwiIT1mfHwoImluaXRpYWwiPT1lJiYoZT1pW2ddKSwiaW5pdGlhbCI9PWYmJihmPWlbZ10pKTtmb3IodmFyIGo9ZT09Zj9bXTpoW2ddLGs9MDtqJiZrPGoubGVuZ3RoO2srKyl7dmFyIGw9altrXVswXShlKSxtPWpba11bMF0oZik7aWYodm9pZCAwIT09bCYmdm9pZCAwIT09bSl7dmFyIG49altrXVsxXShsLG0pO2lmKG4pe3ZhciBvPWIuSW50ZXJwb2xhdGlvbi5hcHBseShudWxsLG4pO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gMD09YT9lOjE9PWE/ZjpvKGEpfX19fXJldHVybiBiLkludGVycG9sYXRpb24oITEsITAsZnVuY3Rpb24oYSl7cmV0dXJuIGE/ZjplfSl9dmFyIGg9e307Yi5hZGRQcm9wZXJ0aWVzSGFuZGxlcj1mO3ZhciBpPXtiYWNrZ3JvdW5kQ29sb3I6InRyYW5zcGFyZW50IixiYWNrZ3JvdW5kUG9zaXRpb246IjAlIDAlIixib3JkZXJCb3R0b21Db2xvcjoiY3VycmVudENvbG9yIixib3JkZXJCb3R0b21MZWZ0UmFkaXVzOiIwcHgiLGJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzOiIwcHgiLGJvcmRlckJvdHRvbVdpZHRoOiIzcHgiLGJvcmRlckxlZnRDb2xvcjoiY3VycmVudENvbG9yIixib3JkZXJMZWZ0V2lkdGg6IjNweCIsYm9yZGVyUmlnaHRDb2xvcjoiY3VycmVudENvbG9yIixib3JkZXJSaWdodFdpZHRoOiIzcHgiLGJvcmRlclNwYWNpbmc6IjJweCIsYm9yZGVyVG9wQ29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyVG9wTGVmdFJhZGl1czoiMHB4Iixib3JkZXJUb3BSaWdodFJhZGl1czoiMHB4Iixib3JkZXJUb3BXaWR0aDoiM3B4Iixib3R0b206ImF1dG8iLGNsaXA6InJlY3QoMHB4LCAwcHgsIDBweCwgMHB4KSIsY29sb3I6ImJsYWNrIixmb250U2l6ZToiMTAwJSIsZm9udFdlaWdodDoiNDAwIixoZWlnaHQ6ImF1dG8iLGxlZnQ6ImF1dG8iLGxldHRlclNwYWNpbmc6Im5vcm1hbCIsbGluZUhlaWdodDoiMTIwJSIsbWFyZ2luQm90dG9tOiIwcHgiLG1hcmdpbkxlZnQ6IjBweCIsbWFyZ2luUmlnaHQ6IjBweCIsbWFyZ2luVG9wOiIwcHgiLG1heEhlaWdodDoibm9uZSIsbWF4V2lkdGg6Im5vbmUiLG1pbkhlaWdodDoiMHB4IixtaW5XaWR0aDoiMHB4IixvcGFjaXR5OiIxLjAiLG91dGxpbmVDb2xvcjoiaW52ZXJ0IixvdXRsaW5lT2Zmc2V0OiIwcHgiLG91dGxpbmVXaWR0aDoiM3B4IixwYWRkaW5nQm90dG9tOiIwcHgiLHBhZGRpbmdMZWZ0OiIwcHgiLHBhZGRpbmdSaWdodDoiMHB4IixwYWRkaW5nVG9wOiIwcHgiLHJpZ2h0OiJhdXRvIix0ZXh0SW5kZW50OiIwcHgiLHRleHRTaGFkb3c6IjBweCAwcHggMHB4IHRyYW5zcGFyZW50Iix0b3A6ImF1dG8iLHRyYW5zZm9ybToiIix2ZXJ0aWNhbEFsaWduOiIwcHgiLHZpc2liaWxpdHk6InZpc2libGUiLHdpZHRoOiJhdXRvIix3b3JkU3BhY2luZzoibm9ybWFsIix6SW5kZXg6ImF1dG8ifTtiLnByb3BlcnR5SW50ZXJwb2xhdGlvbj1nfShjLGQsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYil7dmFyIGM9YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihiKSxkPWZ1bmN0aW9uKGQpe3JldHVybiBhLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihjLGQsYil9O3JldHVybiBkLl90b3RhbER1cmF0aW9uPWIuZGVsYXkrYytiLmVuZERlbGF5LGQuX2lzQ3VycmVudD1mdW5jdGlvbihkKXt2YXIgZT1hLmNhbGN1bGF0ZVBoYXNlKGMsZCxiKTtyZXR1cm4gZT09PVBoYXNlQWN0aXZlfHxlPT09UGhhc2VCZWZvcmV9LGR9Yi5LZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihjLGUsZixnKXt2YXIgaCxpPWQoYS5ub3JtYWxpemVUaW1pbmdJbnB1dChmKSksaj1iLmNvbnZlcnRFZmZlY3RJbnB1dChlKSxrPWZ1bmN0aW9uKCl7aihjLGgpfTtyZXR1cm4gay5fdXBkYXRlPWZ1bmN0aW9uKGEpe3JldHVybiBoPWkoYSksbnVsbCE9PWh9LGsuX2NsZWFyPWZ1bmN0aW9uKCl7aihjLG51bGwpfSxrLl9oYXNTYW1lVGFyZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBjPT09YX0say5faXNDdXJyZW50PWkuX2lzQ3VycmVudCxrLl90b3RhbER1cmF0aW9uPWkuX3RvdGFsRHVyYXRpb24say5faWQ9ZyxrfSxiLk51bGxFZmZlY3Q9ZnVuY3Rpb24oYSl7dmFyIGI9ZnVuY3Rpb24oKXthJiYoYSgpLGE9bnVsbCl9O3JldHVybiBiLl91cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sYi5fdG90YWxEdXJhdGlvbj0wLGIuX2lzQ3VycmVudD1mdW5jdGlvbigpe3JldHVybiExfSxiLl9oYXNTYW1lVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuITF9LGJ9fShjLGQsZiksZnVuY3Rpb24oYSxiKXthLmFwcGx5PWZ1bmN0aW9uKGIsYyxkKXtiLnN0eWxlW2EucHJvcGVydHlOYW1lKGMpXT1kfSxhLmNsZWFyPWZ1bmN0aW9uKGIsYyl7Yi5zdHlsZVthLnByb3BlcnR5TmFtZShjKV09IiJ9fShkLGYpLGZ1bmN0aW9uKGEpe3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9IiI7cmV0dXJuIGMmJmMuaWQmJihkPWMuaWQpLGEudGltZWxpbmUuX3BsYXkoYS5LZXlmcmFtZUVmZmVjdCh0aGlzLGIsYyxkKSl9fShkKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiLGQpe2lmKCJudW1iZXIiPT10eXBlb2YgYSYmIm51bWJlciI9PXR5cGVvZiBiKXJldHVybiBhKigxLWQpK2IqZDtpZigiYm9vbGVhbiI9PXR5cGVvZiBhJiYiYm9vbGVhbiI9PXR5cGVvZiBiKXJldHVybi41PmQ/YTpiO2lmKGEubGVuZ3RoPT1iLmxlbmd0aCl7Zm9yKHZhciBlPVtdLGY9MDtmPGEubGVuZ3RoO2YrKyllLnB1c2goYyhhW2ZdLGJbZl0sZCkpO3JldHVybiBlfXRocm93Ik1pc21hdGNoZWQgaW50ZXJwb2xhdGlvbiBhcmd1bWVudHMgIithKyI6IitifWEuSW50ZXJwb2xhdGlvbj1mdW5jdGlvbihhLGIsZCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBkKGMoYSxiLGUpKX19fShkLGYpLGZ1bmN0aW9uKGEsYixjKXthLnNlcXVlbmNlTnVtYmVyPTA7dmFyIGQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMudGFyZ2V0PWEsdGhpcy5jdXJyZW50VGltZT1iLHRoaXMudGltZWxpbmVUaW1lPWMsdGhpcy50eXBlPSJmaW5pc2giLHRoaXMuYnViYmxlcz0hMSx0aGlzLmNhbmNlbGFibGU9ITEsdGhpcy5jdXJyZW50VGFyZ2V0PWEsdGhpcy5kZWZhdWx0UHJldmVudGVkPSExLHRoaXMuZXZlbnRQaGFzZT1FdmVudC5BVF9UQVJHRVQsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKX07Yi5BbmltYXRpb249ZnVuY3Rpb24oYil7dGhpcy5pZD0iIixiJiZiLl9pZCYmKHRoaXMuaWQ9Yi5faWQpLHRoaXMuX3NlcXVlbmNlTnVtYmVyPWEuc2VxdWVuY2VOdW1iZXIrKyx0aGlzLl9jdXJyZW50VGltZT0wLHRoaXMuX3N0YXJ0VGltZT1udWxsLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9wbGF5YmFja1JhdGU9MSx0aGlzLl9pblRpbWVsaW5lPSEwLHRoaXMuX2ZpbmlzaGVkRmxhZz0hMCx0aGlzLm9uZmluaXNoPW51bGwsdGhpcy5fZmluaXNoSGFuZGxlcnM9W10sdGhpcy5fZWZmZWN0PWIsdGhpcy5faW5FZmZlY3Q9dGhpcy5fZWZmZWN0Ll91cGRhdGUoMCksdGhpcy5faWRsZT0hMCx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITF9LGIuQW5pbWF0aW9uLnByb3RvdHlwZT17X2Vuc3VyZUFsaXZlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5YmFja1JhdGU8MCYmMD09PXRoaXMuY3VycmVudFRpbWU/dGhpcy5faW5FZmZlY3Q9dGhpcy5fZWZmZWN0Ll91cGRhdGUoLTEpOnRoaXMuX2luRWZmZWN0PXRoaXMuX2VmZmVjdC5fdXBkYXRlKHRoaXMuY3VycmVudFRpbWUpLHRoaXMuX2luVGltZWxpbmV8fCF0aGlzLl9pbkVmZmVjdCYmdGhpcy5fZmluaXNoZWRGbGFnfHwodGhpcy5faW5UaW1lbGluZT0hMCxiLnRpbWVsaW5lLl9hbmltYXRpb25zLnB1c2godGhpcykpfSxfdGlja0N1cnJlbnRUaW1lOmZ1bmN0aW9uKGEsYil7YSE9dGhpcy5fY3VycmVudFRpbWUmJih0aGlzLl9jdXJyZW50VGltZT1hLHRoaXMuX2lzRmluaXNoZWQmJiFiJiYodGhpcy5fY3VycmVudFRpbWU9dGhpcy5fcGxheWJhY2tSYXRlPjA/dGhpcy5fdG90YWxEdXJhdGlvbjowKSx0aGlzLl9lbnN1cmVBbGl2ZSgpKX0sZ2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMuX2lkbGV8fHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz9udWxsOnRoaXMuX2N1cnJlbnRUaW1lfSxzZXQgY3VycmVudFRpbWUoYSl7YT0rYSxpc05hTihhKXx8KGIucmVzdGFydCgpLHRoaXMuX3BhdXNlZHx8bnVsbD09dGhpcy5fc3RhcnRUaW1lfHwodGhpcy5fc3RhcnRUaW1lPXRoaXMuX3RpbWVsaW5lLmN1cnJlbnRUaW1lLWEvdGhpcy5fcGxheWJhY2tSYXRlKSx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITEsdGhpcy5fY3VycmVudFRpbWUhPWEmJih0aGlzLl90aWNrQ3VycmVudFRpbWUoYSwhMCksYi5pbnZhbGlkYXRlRWZmZWN0cygpKSl9LGdldCBzdGFydFRpbWUoKXtyZXR1cm4gdGhpcy5fc3RhcnRUaW1lfSxzZXQgc3RhcnRUaW1lKGEpe2E9K2EsaXNOYU4oYSl8fHRoaXMuX3BhdXNlZHx8dGhpcy5faWRsZXx8KHRoaXMuX3N0YXJ0VGltZT1hLHRoaXMuX3RpY2tDdXJyZW50VGltZSgodGhpcy5fdGltZWxpbmUuY3VycmVudFRpbWUtdGhpcy5fc3RhcnRUaW1lKSp0aGlzLnBsYXliYWNrUmF0ZSksYi5pbnZhbGlkYXRlRWZmZWN0cygpKX0sZ2V0IHBsYXliYWNrUmF0ZSgpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9LHNldCBwbGF5YmFja1JhdGUoYSl7aWYoYSE9dGhpcy5fcGxheWJhY2tSYXRlKXt2YXIgYj10aGlzLmN1cnJlbnRUaW1lO3RoaXMuX3BsYXliYWNrUmF0ZT1hLHRoaXMuX3N0YXJ0VGltZT1udWxsLCJwYXVzZWQiIT10aGlzLnBsYXlTdGF0ZSYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5wbGF5KCksbnVsbCE9YiYmKHRoaXMuY3VycmVudFRpbWU9Yil9fSxnZXQgX2lzRmluaXNoZWQoKXtyZXR1cm4hdGhpcy5faWRsZSYmKHRoaXMuX3BsYXliYWNrUmF0ZT4wJiZ0aGlzLl9jdXJyZW50VGltZT49dGhpcy5fdG90YWxEdXJhdGlvbnx8dGhpcy5fcGxheWJhY2tSYXRlPDAmJnRoaXMuX2N1cnJlbnRUaW1lPD0wKX0sZ2V0IF90b3RhbER1cmF0aW9uKCl7cmV0dXJuIHRoaXMuX2VmZmVjdC5fdG90YWxEdXJhdGlvbn0sZ2V0IHBsYXlTdGF0ZSgpe3JldHVybiB0aGlzLl9pZGxlPyJpZGxlIjpudWxsPT10aGlzLl9zdGFydFRpbWUmJiF0aGlzLl9wYXVzZWQmJjAhPXRoaXMucGxheWJhY2tSYXRlfHx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc/InBlbmRpbmciOnRoaXMuX3BhdXNlZD8icGF1c2VkIjp0aGlzLl9pc0ZpbmlzaGVkPyJmaW5pc2hlZCI6InJ1bm5pbmcifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5fcGF1c2VkPSExLCh0aGlzLl9pc0ZpbmlzaGVkfHx0aGlzLl9pZGxlKSYmKHRoaXMuX2N1cnJlbnRUaW1lPXRoaXMuX3BsYXliYWNrUmF0ZT4wPzA6dGhpcy5fdG90YWxEdXJhdGlvbix0aGlzLl9zdGFydFRpbWU9bnVsbCksdGhpcy5fZmluaXNoZWRGbGFnPSExLHRoaXMuX2lkbGU9ITEsdGhpcy5fZW5zdXJlQWxpdmUoKSxiLmludmFsaWRhdGVFZmZlY3RzKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5faXNGaW5pc2hlZHx8dGhpcy5fcGF1c2VkfHx0aGlzLl9pZGxlfHwodGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSEwKSx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLl9wYXVzZWQ9ITB9LGZpbmlzaDpmdW5jdGlvbigpe3RoaXMuX2lkbGV8fCh0aGlzLmN1cnJlbnRUaW1lPXRoaXMuX3BsYXliYWNrUmF0ZT4wP3RoaXMuX3RvdGFsRHVyYXRpb246MCx0aGlzLl9zdGFydFRpbWU9dGhpcy5fdG90YWxEdXJhdGlvbi10aGlzLmN1cnJlbnRUaW1lLHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz0hMSxiLmludmFsaWRhdGVFZmZlY3RzKCkpfSxjYW5jZWw6ZnVuY3Rpb24oKXt0aGlzLl9pbkVmZmVjdCYmKHRoaXMuX2luRWZmZWN0PSExLHRoaXMuX2lkbGU9ITAsdGhpcy5fZmluaXNoZWRGbGFnPSEwLHRoaXMuY3VycmVudFRpbWU9MCx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLl9lZmZlY3QuX3VwZGF0ZShudWxsKSxiLmludmFsaWRhdGVFZmZlY3RzKCkpfSxyZXZlcnNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5YmFja1JhdGUqPS0xLHRoaXMucGxheSgpfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7ImZ1bmN0aW9uIj09dHlwZW9mIGImJiJmaW5pc2giPT1hJiZ0aGlzLl9maW5pc2hIYW5kbGVycy5wdXNoKGIpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7aWYoImZpbmlzaCI9PWEpe3ZhciBjPXRoaXMuX2ZpbmlzaEhhbmRsZXJzLmluZGV4T2YoYik7Yz49MCYmdGhpcy5fZmluaXNoSGFuZGxlcnMuc3BsaWNlKGMsMSl9fSxfZmlyZUV2ZW50czpmdW5jdGlvbihhKXtpZih0aGlzLl9pc0ZpbmlzaGVkKXtpZighdGhpcy5fZmluaXNoZWRGbGFnKXt2YXIgYj1uZXcgZCh0aGlzLHRoaXMuX2N1cnJlbnRUaW1lLGEpLGM9dGhpcy5fZmluaXNoSGFuZGxlcnMuY29uY2F0KHRoaXMub25maW5pc2g/W3RoaXMub25maW5pc2hdOltdKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY2FsbChiLnRhcmdldCxiKX0pfSwwKSx0aGlzLl9maW5pc2hlZEZsYWc9ITB9fWVsc2UgdGhpcy5fZmluaXNoZWRGbGFnPSExfSxfdGljazpmdW5jdGlvbihhLGIpe3RoaXMuX2lkbGV8fHRoaXMuX3BhdXNlZHx8KG51bGw9PXRoaXMuX3N0YXJ0VGltZT9iJiYodGhpcy5zdGFydFRpbWU9YS10aGlzLl9jdXJyZW50VGltZS90aGlzLnBsYXliYWNrUmF0ZSk6dGhpcy5faXNGaW5pc2hlZHx8dGhpcy5fdGlja0N1cnJlbnRUaW1lKChhLXRoaXMuX3N0YXJ0VGltZSkqdGhpcy5wbGF5YmFja1JhdGUpKSxiJiYodGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSExLHRoaXMuX2ZpcmVFdmVudHMoYSkpfSxnZXQgX25lZWRzVGljaygpe3JldHVybiB0aGlzLnBsYXlTdGF0ZSBpbntwZW5kaW5nOjEscnVubmluZzoxfXx8IXRoaXMuX2ZpbmlzaGVkRmxhZ319fShjLGQsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9ajtqPVtdLGE8cC5jdXJyZW50VGltZSYmKGE9cC5jdXJyZW50VGltZSksaChhLCEwKSxiLmZvckVhY2goZnVuY3Rpb24oYil7YlsxXShhKX0pLGcoKSxsPXZvaWQgMH1mdW5jdGlvbiBlKGEsYil7cmV0dXJuIGEuX3NlcXVlbmNlTnVtYmVyLWIuX3NlcXVlbmNlTnVtYmVyfWZ1bmN0aW9uIGYoKXt0aGlzLl9hbmltYXRpb25zPVtdLHRoaXMuY3VycmVudFRpbWU9d2luZG93LnBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2Uubm93KCk6MH1mdW5jdGlvbiBnKCl7by5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EoKX0pLG8ubGVuZ3RoPTB9ZnVuY3Rpb24gaChhLGMpe249ITE7dmFyIGQ9Yi50aW1lbGluZTtkLmN1cnJlbnRUaW1lPWEsZC5fYW5pbWF0aW9ucy5zb3J0KGUpLG09ITE7dmFyIGY9ZC5fYW5pbWF0aW9ucztkLl9hbmltYXRpb25zPVtdO3ZhciBnPVtdLGg9W107Zj1mLmZpbHRlcihmdW5jdGlvbihiKXtiLl90aWNrKGEsYyksYi5faW5FZmZlY3Q/aC5wdXNoKGIuX2VmZmVjdCk6Zy5wdXNoKGIuX2VmZmVjdCksYi5fbmVlZHNUaWNrJiYobT0hMCk7dmFyIGQ9Yi5faW5FZmZlY3R8fGIuX25lZWRzVGljaztyZXR1cm4gYi5faW5UaW1lbGluZT1kLGR9KSxvLnB1c2guYXBwbHkobyxnKSxvLnB1c2guYXBwbHkobyxoKSxkLl9hbmltYXRpb25zLnB1c2guYXBwbHkoZC5fYW5pbWF0aW9ucyxmKSxtJiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt9KX12YXIgaT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLGo9W10saz0wO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7dmFyIGI9aysrO3JldHVybiAwPT1qLmxlbmd0aCYmaShkKSxqLnB1c2goW2IsYV0pLGJ9LHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZT1mdW5jdGlvbihhKXtqLmZvckVhY2goZnVuY3Rpb24oYil7YlswXT09YSYmKGJbMV09ZnVuY3Rpb24oKXt9KX0pfSxmLnByb3RvdHlwZT17X3BsYXk6ZnVuY3Rpb24oYyl7Yy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYy50aW1pbmcpO3ZhciBkPW5ldyBiLkFuaW1hdGlvbihjKTtyZXR1cm4gZC5faWRsZT0hMSxkLl90aW1lbGluZT10aGlzLHRoaXMuX2FuaW1hdGlvbnMucHVzaChkKSxiLnJlc3RhcnQoKSxiLmludmFsaWRhdGVFZmZlY3RzKCksZH19O3ZhciBsPXZvaWQgMCxtPSExLG49ITE7Yi5yZXN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIG18fChtPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe30pLG49ITApLG59LGIuaW52YWxpZGF0ZUVmZmVjdHM9ZnVuY3Rpb24oKXtoKGIudGltZWxpbmUuY3VycmVudFRpbWUsITEpLGcoKX07dmFyIG89W10scD1uZXcgZjtiLnRpbWVsaW5lPXB9KGMsZCxmKSxmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9YS5leGVjKGIpO3JldHVybiBjPyhjPWEuaWdub3JlQ2FzZT9jWzBdLnRvTG93ZXJDYXNlKCk6Y1swXSxbYyxiLnN1YnN0cihjLmxlbmd0aCldKTp2b2lkIDB9ZnVuY3Rpb24gYyhhLGIpe2I9Yi5yZXBsYWNlKC9eXHMqLywiIik7dmFyIGM9YShiKTtyZXR1cm4gYz9bY1swXSxjWzFdLnJlcGxhY2UoL15ccyovLCIiKV06dm9pZCAwfWZ1bmN0aW9uIGQoYSxkLGUpe2E9Yy5iaW5kKG51bGwsYSk7Zm9yKHZhciBmPVtdOzspe3ZhciBnPWEoZSk7aWYoIWcpcmV0dXJuW2YsZV07aWYoZi5wdXNoKGdbMF0pLGU9Z1sxXSxnPWIoZCxlKSwhZ3x8IiI9PWdbMV0pcmV0dXJuW2YsZV07ZT1nWzFdfX1mdW5jdGlvbiBlKGEsYil7Zm9yKHZhciBjPTAsZD0wO2Q8Yi5sZW5ndGgmJighL1xzfCwvLnRlc3QoYltkXSl8fDAhPWMpO2QrKylpZigiKCI9PWJbZF0pYysrO2Vsc2UgaWYoIikiPT1iW2RdJiYoYy0tLDA9PWMmJmQrKywwPj1jKSlicmVhazt2YXIgZT1hKGIuc3Vic3RyKDAsZCkpO3JldHVybiB2b2lkIDA9PWU/dm9pZCAwOltlLGIuc3Vic3RyKGQpXX1mdW5jdGlvbiBmKGEsYil7Zm9yKHZhciBjPWEsZD1iO2MmJmQ7KWM+ZD9jJT1kOmQlPWM7cmV0dXJuIGM9YSpiLyhjK2QpfWZ1bmN0aW9uIGcoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWEoYik7cmV0dXJuIGMmJihjWzBdPXZvaWQgMCksY319ZnVuY3Rpb24gaChhLGIpe3JldHVybiBmdW5jdGlvbihjKXt2YXIgZD1hKGMpO3JldHVybiBkP2Q6W2IsY119fWZ1bmN0aW9uIGkoYixjKXtmb3IodmFyIGQ9W10sZT0wO2U8Yi5sZW5ndGg7ZSsrKXt2YXIgZj1hLmNvbnN1bWVUcmltbWVkKGJbZV0sYyk7aWYoIWZ8fCIiPT1mWzBdKXJldHVybjt2b2lkIDAhPT1mWzBdJiZkLnB1c2goZlswXSksYz1mWzFdfXJldHVybiIiPT1jP2Q6dm9pZCAwfWZ1bmN0aW9uIGooYSxiLGMsZCxlKXtmb3IodmFyIGc9W10saD1bXSxpPVtdLGo9ZihkLmxlbmd0aCxlLmxlbmd0aCksaz0wO2o+aztrKyspe3ZhciBsPWIoZFtrJWQubGVuZ3RoXSxlW2slZS5sZW5ndGhdKTtpZighbClyZXR1cm47Zy5wdXNoKGxbMF0pLGgucHVzaChsWzFdKSxpLnB1c2gobFsyXSl9cmV0dXJuW2csaCxmdW5jdGlvbihiKXt2YXIgZD1iLm1hcChmdW5jdGlvbihhLGIpe3JldHVybiBpW2JdKGEpfSkuam9pbihjKTtyZXR1cm4gYT9hKGQpOmR9XX1mdW5jdGlvbiBrKGEsYixjKXtmb3IodmFyIGQ9W10sZT1bXSxmPVtdLGc9MCxoPTA7aDxjLmxlbmd0aDtoKyspaWYoImZ1bmN0aW9uIj09dHlwZW9mIGNbaF0pe3ZhciBpPWNbaF0oYVtnXSxiW2crK10pO2QucHVzaChpWzBdKSxlLnB1c2goaVsxXSksZi5wdXNoKGlbMl0pfWVsc2UhZnVuY3Rpb24oYSl7ZC5wdXNoKCExKSxlLnB1c2goITEpLGYucHVzaChmdW5jdGlvbigpe3JldHVybiBjW2FdfSl9KGgpO3JldHVybltkLGUsZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKyliKz1mW2NdKGFbY10pO3JldHVybiBifV19YS5jb25zdW1lVG9rZW49YixhLmNvbnN1bWVUcmltbWVkPWMsYS5jb25zdW1lUmVwZWF0ZWQ9ZCxhLmNvbnN1bWVQYXJlbnRoZXNpc2VkPWUsYS5pZ25vcmU9ZyxhLm9wdGlvbmFsPWgsYS5jb25zdW1lTGlzdD1pLGEubWVyZ2VOZXN0ZWRSZXBlYXRlZD1qLmJpbmQobnVsbCxudWxsKSxhLm1lcmdlV3JhcHBlZE5lc3RlZFJlcGVhdGVkPWosYS5tZXJnZUxpc3Q9a30oZCksZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiKXtmdW5jdGlvbiBjKGIpe3ZhciBjPWEuY29uc3VtZVRva2VuKC9eaW5zZXQvaSxiKTtpZihjKXJldHVybiBkLmluc2V0PSEwLGM7dmFyIGM9YS5jb25zdW1lTGVuZ3RoT3JQZXJjZW50KGIpO2lmKGMpcmV0dXJuIGQubGVuZ3Rocy5wdXNoKGNbMF0pLGM7dmFyIGM9YS5jb25zdW1lQ29sb3IoYik7cmV0dXJuIGM/KGQuY29sb3I9Y1swXSxjKTp2b2lkIDB9dmFyIGQ9e2luc2V0OiExLGxlbmd0aHM6W10sY29sb3I6bnVsbH0sZT1hLmNvbnN1bWVSZXBlYXRlZChjLC9eLyxiKTtyZXR1cm4gZSYmZVswXS5sZW5ndGg/W2QsZVsxXV06dm9pZCAwfWZ1bmN0aW9uIGMoYyl7dmFyIGQ9YS5jb25zdW1lUmVwZWF0ZWQoYiwvXiwvLGMpO3JldHVybiBkJiYiIj09ZFsxXT9kWzBdOnZvaWQgMH1mdW5jdGlvbiBkKGIsYyl7Zm9yKDtiLmxlbmd0aHMubGVuZ3RoPE1hdGgubWF4KGIubGVuZ3Rocy5sZW5ndGgsYy5sZW5ndGhzLmxlbmd0aCk7KWIubGVuZ3Rocy5wdXNoKHtweDowfSk7Zm9yKDtjLmxlbmd0aHMubGVuZ3RoPE1hdGgubWF4KGIubGVuZ3Rocy5sZW5ndGgsYy5sZW5ndGhzLmxlbmd0aCk7KWMubGVuZ3Rocy5wdXNoKHtweDowfSk7aWYoYi5pbnNldD09Yy5pbnNldCYmISFiLmNvbG9yPT0hIWMuY29sb3Ipe2Zvcih2YXIgZCxlPVtdLGY9W1tdLDBdLGc9W1tdLDBdLGg9MDtoPGIubGVuZ3Rocy5sZW5ndGg7aCsrKXt2YXIgaT1hLm1lcmdlRGltZW5zaW9ucyhiLmxlbmd0aHNbaF0sYy5sZW5ndGhzW2hdLDI9PWgpO2ZbMF0ucHVzaChpWzBdKSxnWzBdLnB1c2goaVsxXSksZS5wdXNoKGlbMl0pfWlmKGIuY29sb3ImJmMuY29sb3Ipe3ZhciBqPWEubWVyZ2VDb2xvcnMoYi5jb2xvcixjLmNvbG9yKTtmWzFdPWpbMF0sZ1sxXT1qWzFdLGQ9alsyXX1yZXR1cm5bZixnLGZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1iLmluc2V0PyJpbnNldCAiOiIgIixmPTA7ZjxlLmxlbmd0aDtmKyspYys9ZVtmXShhWzBdW2ZdKSsiICI7cmV0dXJuIGQmJihjKz1kKGFbMV0pKSxjfV19fWZ1bmN0aW9uIGUoYixjLGQsZSl7ZnVuY3Rpb24gZihhKXtyZXR1cm57aW5zZXQ6YSxjb2xvcjpbMCwwLDAsMF0sbGVuZ3Roczpbe3B4OjB9LHtweDowfSx7cHg6MH0se3B4OjB9XX19Zm9yKHZhciBnPVtdLGg9W10saT0wO2k8ZC5sZW5ndGh8fGk8ZS5sZW5ndGg7aSsrKXt2YXIgaj1kW2ldfHxmKGVbaV0uaW5zZXQpLGs9ZVtpXXx8ZihkW2ldLmluc2V0KTtnLnB1c2goaiksaC5wdXNoKGspfXJldHVybiBhLm1lcmdlTmVzdGVkUmVwZWF0ZWQoYixjLGcsaCl9dmFyIGY9ZS5iaW5kKG51bGwsZCwiLCAiKTthLmFkZFByb3BlcnRpZXNIYW5kbGVyKGMsZixbImJveC1zaGFkb3ciLCJ0ZXh0LXNoYWRvdyJdKX0oZCksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe3JldHVybiBhLnRvRml4ZWQoMykucmVwbGFjZSgiLjAwMCIsIiIpfWZ1bmN0aW9uIGQoYSxiLGMpe3JldHVybiBNYXRoLm1pbihiLE1hdGgubWF4KGEsYykpfWZ1bmN0aW9uIGUoYSl7cmV0dXJuL15ccypbLStdPyhcZCpcLik/XGQrXHMqJC8udGVzdChhKT9OdW1iZXIoYSk6dm9pZCAwfWZ1bmN0aW9uIGYoYSxiKXtyZXR1cm5bYSxiLGNdfWZ1bmN0aW9uIGcoYSxiKXtyZXR1cm4gMCE9YT9pKDAsMS8wKShhLGIpOnZvaWQgMH1mdW5jdGlvbiBoKGEsYil7cmV0dXJuW2EsYixmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChkKDEsMS8wLGEpKX1dfWZ1bmN0aW9uIGkoYSxiKXtyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm5bZSxmLGZ1bmN0aW9uKGUpe3JldHVybiBjKGQoYSxiLGUpKX1dfX1mdW5jdGlvbiBqKGEsYil7cmV0dXJuW2EsYixNYXRoLnJvdW5kXX1hLmNsYW1wPWQsYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGkoMCwxLzApLFsiYm9yZGVyLWltYWdlLXdpZHRoIiwibGluZS1oZWlnaHQiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGkoMCwxKSxbIm9wYWNpdHkiLCJzaGFwZS1pbWFnZS10aHJlc2hvbGQiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGcsWyJmbGV4LWdyb3ciLCJmbGV4LXNocmluayJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsaCxbIm9ycGhhbnMiLCJ3aWRvd3MiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGosWyJ6LWluZGV4Il0pLGEucGFyc2VOdW1iZXI9ZSxhLm1lcmdlTnVtYmVycz1mLGEubnVtYmVyVG9TdHJpbmc9Y30oZCxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtyZXR1cm4idmlzaWJsZSI9PWF8fCJ2aXNpYmxlIj09Yj9bMCwxLGZ1bmN0aW9uKGMpe3JldHVybiAwPj1jP2E6Yz49MT9iOiJ2aXNpYmxlIn1dOnZvaWQgMH1hLmFkZFByb3BlcnRpZXNIYW5kbGVyKFN0cmluZyxjLFsidmlzaWJpbGl0eSJdKX0oZCksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe2E9YS50cmltKCksZi5maWxsU3R5bGU9IiMwMDAiLGYuZmlsbFN0eWxlPWE7dmFyIGI9Zi5maWxsU3R5bGU7aWYoZi5maWxsU3R5bGU9IiNmZmYiLGYuZmlsbFN0eWxlPWEsYj09Zi5maWxsU3R5bGUpe2YuZmlsbFJlY3QoMCwwLDEsMSk7dmFyIGM9Zi5nZXRJbWFnZURhdGEoMCwwLDEsMSkuZGF0YTtmLmNsZWFyUmVjdCgwLDAsMSwxKTt2YXIgZD1jWzNdLzI1NTtyZXR1cm5bY1swXSpkLGNbMV0qZCxjWzJdKmQsZF19fWZ1bmN0aW9uIGQoYixjKXtyZXR1cm5bYixjLGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMjU1LGEpKX1pZihiWzNdKWZvcih2YXIgZD0wOzM+ZDtkKyspYltkXT1NYXRoLnJvdW5kKGMoYltkXS9iWzNdKSk7cmV0dXJuIGJbM109YS5udW1iZXJUb1N0cmluZyhhLmNsYW1wKDAsMSxiWzNdKSksInJnYmEoIitiLmpvaW4oIiwiKSsiKSJ9XX12YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJjYW52YXMiKTtlLndpZHRoPWUuaGVpZ2h0PTE7dmFyIGY9ZS5nZXRDb250ZXh0KCIyZCIpO2EuYWRkUHJvcGVydGllc0hhbmRsZXIoYyxkLFsiYmFja2dyb3VuZC1jb2xvciIsImJvcmRlci1ib3R0b20tY29sb3IiLCJib3JkZXItbGVmdC1jb2xvciIsImJvcmRlci1yaWdodC1jb2xvciIsImJvcmRlci10b3AtY29sb3IiLCJjb2xvciIsIm91dGxpbmUtY29sb3IiLCJ0ZXh0LWRlY29yYXRpb24tY29sb3IiXSksYS5jb25zdW1lQ29sb3I9YS5jb25zdW1lUGFyZW50aGVzaXNlZC5iaW5kKG51bGwsYyksYS5tZXJnZUNvbG9ycz1kfShkLGYpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGI9Yi50cmltKCkudG9Mb3dlckNhc2UoKSwiMCI9PWImJiJweCIuc2VhcmNoKGEpPj0wKXJldHVybntweDowfTtpZigvXlteKF0qJHxeY2FsYy8udGVzdChiKSl7Yj1iLnJlcGxhY2UoL2NhbGNcKC9nLCIoIik7dmFyIGM9e307Yj1iLnJlcGxhY2UoYSxmdW5jdGlvbihhKXtyZXR1cm4gY1thXT1udWxsLCJVIithfSk7Zm9yKHZhciBkPSJVKCIrYS5zb3VyY2UrIikiLGU9Yi5yZXBsYWNlKC9bLStdPyhcZCpcLik/XGQrL2csIk4iKS5yZXBsYWNlKG5ldyBSZWdFeHAoIk4iK2QsImciKSwiRCIpLnJlcGxhY2UoL1xzWystXVxzL2csIk8iKS5yZXBsYWNlKC9ccy9nLCIiKSxmPVsvTlwqKEQpL2csLyhOfEQpWypcL11OL2csLyhOfEQpT1wxL2csL1woKE58RClcKS9nXSxnPTA7ZzxmLmxlbmd0aDspZltnXS50ZXN0KGUpPyhlPWUucmVwbGFjZShmW2ddLCIkMSIpLGc9MCk6ZysrO2lmKCJEIj09ZSl7Zm9yKHZhciBoIGluIGMpe3ZhciBpPWV2YWwoYi5yZXBsYWNlKG5ldyBSZWdFeHAoIlUiK2gsImciKSwiIikucmVwbGFjZShuZXcgUmVnRXhwKGQsImciKSwiKjAiKSk7aWYoIWlzRmluaXRlKGkpKXJldHVybjtjW2hdPWl9cmV0dXJuIGN9fX1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGUoYSxiLCEwKX1mdW5jdGlvbiBlKGIsYyxkKXt2YXIgZSxmPVtdO2ZvcihlIGluIGIpZi5wdXNoKGUpO2ZvcihlIGluIGMpZi5pbmRleE9mKGUpPDAmJmYucHVzaChlKTtyZXR1cm4gYj1mLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYlthXXx8MH0pLGM9Zi5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGNbYV18fDB9KSxbYixjLGZ1bmN0aW9uKGIpe3ZhciBjPWIubWFwKGZ1bmN0aW9uKGMsZSl7cmV0dXJuIDE9PWIubGVuZ3RoJiZkJiYoYz1NYXRoLm1heChjLDApKSxhLm51bWJlclRvU3RyaW5nKGMpK2ZbZV19KS5qb2luKCIgKyAiKTtyZXR1cm4gYi5sZW5ndGg+MT8iY2FsYygiK2MrIikiOmN9XX12YXIgZj0icHh8ZW18ZXh8Y2h8cmVtfHZ3fHZofHZtaW58dm1heHxjbXxtbXxpbnxwdHxwYyIsZz1jLmJpbmQobnVsbCxuZXcgUmVnRXhwKGYsImciKSksaD1jLmJpbmQobnVsbCxuZXcgUmVnRXhwKGYrInwlIiwiZyIpKSxpPWMuYmluZChudWxsLC9kZWd8cmFkfGdyYWR8dHVybi9nKTthLnBhcnNlTGVuZ3RoPWcsYS5wYXJzZUxlbmd0aE9yUGVyY2VudD1oLGEuY29uc3VtZUxlbmd0aE9yUGVyY2VudD1hLmNvbnN1bWVQYXJlbnRoZXNpc2VkLmJpbmQobnVsbCxoKSxhLnBhcnNlQW5nbGU9aSxhLm1lcmdlRGltZW5zaW9ucz1lO3ZhciBqPWEuY29uc3VtZVBhcmVudGhlc2lzZWQuYmluZChudWxsLGcpLGs9YS5jb25zdW1lUmVwZWF0ZWQuYmluZCh2b2lkIDAsaiwvXi8pLGw9YS5jb25zdW1lUmVwZWF0ZWQuYmluZCh2b2lkIDAsaywvXiwvKTthLmNvbnN1bWVTaXplUGFpckxpc3Q9bDt2YXIgbT1mdW5jdGlvbihhKXt2YXIgYj1sKGEpO3JldHVybiBiJiYiIj09YlsxXT9iWzBdOnZvaWQgMH0sbj1hLm1lcmdlTmVzdGVkUmVwZWF0ZWQuYmluZCh2b2lkIDAsZCwiICIpLG89YS5tZXJnZU5lc3RlZFJlcGVhdGVkLmJpbmQodm9pZCAwLG4sIiwiKTthLm1lcmdlTm9uTmVnYXRpdmVTaXplUGFpcj1uLGEuYWRkUHJvcGVydGllc0hhbmRsZXIobSxvLFsiYmFja2dyb3VuZC1zaXplIl0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoaCxkLFsiYm9yZGVyLWJvdHRvbS13aWR0aCIsImJvcmRlci1pbWFnZS13aWR0aCIsImJvcmRlci1sZWZ0LXdpZHRoIiwiYm9yZGVyLXJpZ2h0LXdpZHRoIiwiYm9yZGVyLXRvcC13aWR0aCIsImZsZXgtYmFzaXMiLCJmb250LXNpemUiLCJoZWlnaHQiLCJsaW5lLWhlaWdodCIsIm1heC1oZWlnaHQiLCJtYXgtd2lkdGgiLCJvdXRsaW5lLXdpZHRoIiwid2lkdGgiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihoLGUsWyJib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzIiwiYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXMiLCJib3JkZXItdG9wLWxlZnQtcmFkaXVzIiwiYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMiLCJib3R0b20iLCJsZWZ0IiwibGV0dGVyLXNwYWNpbmciLCJtYXJnaW4tYm90dG9tIiwibWFyZ2luLWxlZnQiLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW4tdG9wIiwibWluLWhlaWdodCIsIm1pbi13aWR0aCIsIm91dGxpbmUtb2Zmc2V0IiwicGFkZGluZy1ib3R0b20iLCJwYWRkaW5nLWxlZnQiLCJwYWRkaW5nLXJpZ2h0IiwicGFkZGluZy10b3AiLCJwZXJzcGVjdGl2ZSIsInJpZ2h0Iiwic2hhcGUtbWFyZ2luIiwidGV4dC1pbmRlbnQiLCJ0b3AiLCJ2ZXJ0aWNhbC1hbGlnbiIsIndvcmQtc3BhY2luZyJdKX0oZCxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYil7cmV0dXJuIGEuY29uc3VtZUxlbmd0aE9yUGVyY2VudChiKXx8YS5jb25zdW1lVG9rZW4oL15hdXRvLyxiKX1mdW5jdGlvbiBkKGIpe3ZhciBkPWEuY29uc3VtZUxpc3QoW2EuaWdub3JlKGEuY29uc3VtZVRva2VuLmJpbmQobnVsbCwvXnJlY3QvKSksYS5pZ25vcmUoYS5jb25zdW1lVG9rZW4uYmluZChudWxsLC9eXCgvKSksYS5jb25zdW1lUmVwZWF0ZWQuYmluZChudWxsLGMsL14sLyksYS5pZ25vcmUoYS5jb25zdW1lVG9rZW4uYmluZChudWxsLC9eXCkvKSldLGIpO3JldHVybiBkJiY0PT1kWzBdLmxlbmd0aD9kWzBdOnZvaWQgMH1mdW5jdGlvbiBlKGIsYyl7cmV0dXJuImF1dG8iPT1ifHwiYXV0byI9PWM/WyEwLCExLGZ1bmN0aW9uKGQpe3ZhciBlPWQ/YjpjO2lmKCJhdXRvIj09ZSlyZXR1cm4iYXV0byI7dmFyIGY9YS5tZXJnZURpbWVuc2lvbnMoZSxlKTtyZXR1cm4gZlsyXShmWzBdKX1dOmEubWVyZ2VEaW1lbnNpb25zKGIsYyl9ZnVuY3Rpb24gZihhKXtyZXR1cm4icmVjdCgiK2ErIikifXZhciBnPWEubWVyZ2VXcmFwcGVkTmVzdGVkUmVwZWF0ZWQuYmluZChudWxsLGYsZSwiLCAiKTthLnBhcnNlQm94PWQsYS5tZXJnZUJveGVzPWcsYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihkLGcsWyJjbGlwIl0pfShkLGYpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9MDtyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1rP2JbYysrXTphfSl9fWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGF9ZnVuY3Rpb24gZShiKXtpZihiPWIudG9Mb3dlckNhc2UoKS50cmltKCksIm5vbmUiPT1iKXJldHVybltdO2Zvcih2YXIgYyxkPS9ccyooXHcrKVwoKFteKV0qKVwpL2csZT1bXSxmPTA7Yz1kLmV4ZWMoYik7KXtpZihjLmluZGV4IT1mKXJldHVybjtmPWMuaW5kZXgrY1swXS5sZW5ndGg7dmFyIGc9Y1sxXSxoPW5bZ107aWYoIWgpcmV0dXJuO3ZhciBpPWNbMl0uc3BsaXQoIiwiKSxqPWhbMF07aWYoai5sZW5ndGg8aS5sZW5ndGgpcmV0dXJuO2Zvcih2YXIgaz1bXSxvPTA7bzxqLmxlbmd0aDtvKyspe3ZhciBwLHE9aVtvXSxyPWpbb107aWYocD1xP3tBOmZ1bmN0aW9uKGIpe3JldHVybiIwIj09Yi50cmltKCk/bTphLnBhcnNlQW5nbGUoYil9LE46YS5wYXJzZU51bWJlcixUOmEucGFyc2VMZW5ndGhPclBlcmNlbnQsTDphLnBhcnNlTGVuZ3RofVtyLnRvVXBwZXJDYXNlKCldKHEpOnthOm0sbjprWzBdLHQ6bH1bcl0sdm9pZCAwPT09cClyZXR1cm47ay5wdXNoKHApfWlmKGUucHVzaCh7dDpnLGQ6a30pLGQubGFzdEluZGV4PT1iLmxlbmd0aClyZXR1cm4gZX19ZnVuY3Rpb24gZihhKXtyZXR1cm4gYS50b0ZpeGVkKDYpLnJlcGxhY2UoIi4wMDAwMDAiLCIiKX1mdW5jdGlvbiBnKGIsYyl7aWYoYi5kZWNvbXBvc2l0aW9uUGFpciE9PWMpe2IuZGVjb21wb3NpdGlvblBhaXI9Yzt2YXIgZD1hLm1ha2VNYXRyaXhEZWNvbXBvc2l0aW9uKGIpfWlmKGMuZGVjb21wb3NpdGlvblBhaXIhPT1iKXtjLmRlY29tcG9zaXRpb25QYWlyPWI7dmFyIGU9YS5tYWtlTWF0cml4RGVjb21wb3NpdGlvbihjKX1yZXR1cm4gbnVsbD09ZFswXXx8bnVsbD09ZVswXT9bWyExXSxbITBdLGZ1bmN0aW9uKGEpe3JldHVybiBhP2NbMF0uZDpiWzBdLmR9XTooZFswXS5wdXNoKDApLGVbMF0ucHVzaCgxKSxbZCxlLGZ1bmN0aW9uKGIpe3ZhciBjPWEucXVhdChkWzBdWzNdLGVbMF1bM10sYls1XSksZz1hLmNvbXBvc2VNYXRyaXgoYlswXSxiWzFdLGJbMl0sYyxiWzRdKSxoPWcubWFwKGYpLmpvaW4oIiwiKTtyZXR1cm4gaH1dKX1mdW5jdGlvbiBoKGEpe3JldHVybiBhLnJlcGxhY2UoL1t4eV0vLCIiKX1mdW5jdGlvbiBpKGEpe3JldHVybiBhLnJlcGxhY2UoLyh4fHl8enwzZCk/JC8sIjNkIil9ZnVuY3Rpb24gaihiLGMpe3ZhciBkPWEubWFrZU1hdHJpeERlY29tcG9zaXRpb24mJiEwLGU9ITE7aWYoIWIubGVuZ3RofHwhYy5sZW5ndGgpe2IubGVuZ3RofHwoZT0hMCxiPWMsYz1bXSk7Zm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspe3ZhciBqPWJbZl0udCxrPWJbZl0uZCxsPSJzY2FsZSI9PWouc3Vic3RyKDAsNSk/MTowO2MucHVzaCh7dDpqLGQ6ay5tYXAoZnVuY3Rpb24oYSl7aWYoIm51bWJlciI9PXR5cGVvZiBhKXJldHVybiBsO3ZhciBiPXt9O2Zvcih2YXIgYyBpbiBhKWJbY109bDtyZXR1cm4gYn0pfSl9fXZhciBtPWZ1bmN0aW9uKGEsYil7cmV0dXJuInBlcnNwZWN0aXZlIj09YSYmInBlcnNwZWN0aXZlIj09Ynx8KCJtYXRyaXgiPT1hfHwibWF0cml4M2QiPT1hKSYmKCJtYXRyaXgiPT1ifHwibWF0cml4M2QiPT1iKX0sbz1bXSxwPVtdLHE9W107aWYoYi5sZW5ndGghPWMubGVuZ3RoKXtpZighZClyZXR1cm47dmFyIHI9ZyhiLGMpO289W3JbMF1dLHA9W3JbMV1dLHE9W1sibWF0cml4IixbclsyXV1dXX1lbHNlIGZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKXt2YXIgaixzPWJbZl0udCx0PWNbZl0udCx1PWJbZl0uZCx2PWNbZl0uZCx3PW5bc10seD1uW3RdO2lmKG0ocyx0KSl7aWYoIWQpcmV0dXJuO3ZhciByPWcoW2JbZl1dLFtjW2ZdXSk7by5wdXNoKHJbMF0pLHAucHVzaChyWzFdKSxxLnB1c2goWyJtYXRyaXgiLFtyWzJdXV0pfWVsc2V7aWYocz09dClqPXM7ZWxzZSBpZih3WzJdJiZ4WzJdJiZoKHMpPT1oKHQpKWo9aChzKSx1PXdbMl0odSksdj14WzJdKHYpO2Vsc2V7aWYoIXdbMV18fCF4WzFdfHxpKHMpIT1pKHQpKXtpZighZClyZXR1cm47dmFyIHI9ZyhiLGMpO289W3JbMF1dLHA9W3JbMV1dLHE9W1sibWF0cml4IixbclsyXV1dXTticmVha31qPWkocyksdT13WzFdKHUpLHY9eFsxXSh2KX1mb3IodmFyIHk9W10sej1bXSxBPVtdLEI9MDtCPHUubGVuZ3RoO0IrKyl7dmFyIEM9Im51bWJlciI9PXR5cGVvZiB1W0JdP2EubWVyZ2VOdW1iZXJzOmEubWVyZ2VEaW1lbnNpb25zLHI9Qyh1W0JdLHZbQl0pO3lbQl09clswXSx6W0JdPXJbMV0sQS5wdXNoKHJbMl0pfW8ucHVzaCh5KSxwLnB1c2goeikscS5wdXNoKFtqLEFdKX19aWYoZSl7dmFyIEQ9bztvPXAscD1EfXJldHVybltvLHAsZnVuY3Rpb24oYSl7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS5tYXAoZnVuY3Rpb24oYSxjKXtyZXR1cm4gcVtiXVsxXVtjXShhKX0pLmpvaW4oIiwiKTtyZXR1cm4ibWF0cml4Ij09cVtiXVswXSYmMTY9PWMuc3BsaXQoIiwiKS5sZW5ndGgmJihxW2JdWzBdPSJtYXRyaXgzZCIpLHFbYl1bMF0rIigiK2MrIikifSkuam9pbigiICIpfV19dmFyIGs9bnVsbCxsPXtweDowfSxtPXtkZWc6MH0sbj17bWF0cml4OlsiTk5OTk5OIixbayxrLDAsMCxrLGssMCwwLDAsMCwxLDAsayxrLDAsMV0sZF0sbWF0cml4M2Q6WyJOTk5OTk5OTk5OTk5OTk5OIixkXSxyb3RhdGU6WyJBIl0scm90YXRleDpbIkEiXSxyb3RhdGV5OlsiQSJdLHJvdGF0ZXo6WyJBIl0scm90YXRlM2Q6WyJOTk5BIl0scGVyc3BlY3RpdmU6WyJMIl0sc2NhbGU6WyJObiIsYyhbayxrLDFdKSxkXSxzY2FsZXg6WyJOIixjKFtrLDEsMV0pLGMoW2ssMV0pXSxzY2FsZXk6WyJOIixjKFsxLGssMV0pLGMoWzEsa10pXSxzY2FsZXo6WyJOIixjKFsxLDEsa10pXSxzY2FsZTNkOlsiTk5OIixkXSxza2V3OlsiQWEiLG51bGwsZF0sc2tld3g6WyJBIixudWxsLGMoW2ssbV0pXSxza2V3eTpbIkEiLG51bGwsYyhbbSxrXSldLHRyYW5zbGF0ZTpbIlR0IixjKFtrLGssbF0pLGRdLHRyYW5zbGF0ZXg6WyJUIixjKFtrLGwsbF0pLGMoW2ssbF0pXSx0cmFuc2xhdGV5OlsiVCIsYyhbbCxrLGxdKSxjKFtsLGtdKV0sdHJhbnNsYXRlejpbIkwiLGMoW2wsbCxrXSldLHRyYW5zbGF0ZTNkOlsiVFRMIixkXX07YS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGosWyJ0cmFuc2Zvcm0iXSl9KGQsZiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7Yi5jb25jYXQoW2FdKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlJiYoZFthXT1iKX0pfXZhciBkPXt9O2MoInRyYW5zZm9ybSIsWyJ3ZWJraXRUcmFuc2Zvcm0iLCJtc1RyYW5zZm9ybSJdKSxjKCJ0cmFuc2Zvcm1PcmlnaW4iLFsid2Via2l0VHJhbnNmb3JtT3JpZ2luIl0pLGMoInBlcnNwZWN0aXZlIixbIndlYmtpdFBlcnNwZWN0aXZlIl0pLGMoInBlcnNwZWN0aXZlT3JpZ2luIixbIndlYmtpdFBlcnNwZWN0aXZlT3JpZ2luIl0pLGEucHJvcGVydHlOYW1lPWZ1bmN0aW9uKGEpe3JldHVybiBkW2FdfHxhfX0oZCxmKX0oKSwhZnVuY3Rpb24oKXtpZih2b2lkIDA9PT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5hbmltYXRlKFtdKS5vbmNhbmNlbCl7dmFyIGE7aWYod2luZG93LnBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3cpdmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gcGVyZm9ybWFuY2Uubm93KCl9O2Vsc2UgdmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX07dmFyIGI9ZnVuY3Rpb24oYSxiLGMpe3RoaXMudGFyZ2V0PWEsdGhpcy5jdXJyZW50VGltZT1iLHRoaXMudGltZWxpbmVUaW1lPWMsdGhpcy50eXBlPSJjYW5jZWwiLHRoaXMuYnViYmxlcz0hMSx0aGlzLmNhbmNlbGFibGU9ITEsdGhpcy5jdXJyZW50VGFyZ2V0PWEsdGhpcy5kZWZhdWx0UHJldmVudGVkPSExLHRoaXMuZXZlbnRQaGFzZT1FdmVudC5BVF9UQVJHRVQsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKX0sYz13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZTt3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihkLGUpe3ZhciBmPWMuY2FsbCh0aGlzLGQsZSk7Zi5fY2FuY2VsSGFuZGxlcnM9W10sZi5vbmNhbmNlbD1udWxsO3ZhciBnPWYuY2FuY2VsO2YuY2FuY2VsPWZ1bmN0aW9uKCl7Zy5jYWxsKHRoaXMpO3ZhciBjPW5ldyBiKHRoaXMsbnVsbCxhKCkpLGQ9dGhpcy5fY2FuY2VsSGFuZGxlcnMuY29uY2F0KHRoaXMub25jYW5jZWw/W3RoaXMub25jYW5jZWxdOltdKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZC5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY2FsbChjLnRhcmdldCxjKX0pfSwwKX07dmFyIGg9Zi5hZGRFdmVudExpc3RlbmVyO2YuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIpeyJmdW5jdGlvbiI9PXR5cGVvZiBiJiYiY2FuY2VsIj09YT90aGlzLl9jYW5jZWxIYW5kbGVycy5wdXNoKGIpOmguY2FsbCh0aGlzLGEsYil9O3ZhciBpPWYucmVtb3ZlRXZlbnRMaXN0ZW5lcjtyZXR1cm4gZi5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYil7aWYoImNhbmNlbCI9PWEpe3ZhciBjPXRoaXMuX2NhbmNlbEhhbmRsZXJzLmluZGV4T2YoYik7Yz49MCYmdGhpcy5fY2FuY2VsSGFuZGxlcnMuc3BsaWNlKGMsMSl9ZWxzZSBpLmNhbGwodGhpcyxhLGIpfSxmfX19KCksZnVuY3Rpb24oYSl7dmFyIGI9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGM9bnVsbCxkPSExO3RyeXt2YXIgZT1nZXRDb21wdXRlZFN0eWxlKGIpLmdldFByb3BlcnR5VmFsdWUoIm9wYWNpdHkiKSxmPSIwIj09ZT8iMSI6IjAiO2M9Yi5hbmltYXRlKHtvcGFjaXR5OltmLGZdfSx7ZHVyYXRpb246MX0pLGMuY3VycmVudFRpbWU9MCxkPWdldENvbXB1dGVkU3R5bGUoYikuZ2V0UHJvcGVydHlWYWx1ZSgib3BhY2l0eSIpPT1mfWNhdGNoKGcpe31maW5hbGx5e2MmJmMuY2FuY2VsKCl9aWYoIWQpe3ZhciBoPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlO3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIHdpbmRvdy5TeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmQXJyYXkucHJvdG90eXBlLmZyb20mJmJbU3ltYm9sLml0ZXJhdG9yXSYmKGI9QXJyYXkuZnJvbShiKSksQXJyYXkuaXNBcnJheShiKXx8bnVsbD09PWJ8fChiPWEuY29udmVydFRvQXJyYXlGb3JtKGIpKSxoLmNhbGwodGhpcyxiLGMpfX19KGMpLCFmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXt2YXIgYj13aW5kb3cuZG9jdW1lbnQudGltZWxpbmU7Yi5jdXJyZW50VGltZT1hLGIuX2Rpc2NhcmRBbmltYXRpb25zKCksMD09Yi5fYW5pbWF0aW9ucy5sZW5ndGg/Zj0hMTpyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZCk7Cn12YXIgZT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIGUoZnVuY3Rpb24oYil7d2luZG93LmRvY3VtZW50LnRpbWVsaW5lLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKSxhKGIpLHdpbmRvdy5kb2N1bWVudC50aW1lbGluZS5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCl9KX0sYi5BbmltYXRpb25UaW1lbGluZT1mdW5jdGlvbigpe3RoaXMuX2FuaW1hdGlvbnM9W10sdGhpcy5jdXJyZW50VGltZT12b2lkIDB9LGIuQW5pbWF0aW9uVGltZWxpbmUucHJvdG90eXBlPXtnZXRBbmltYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc2NhcmRBbmltYXRpb25zKCksdGhpcy5fYW5pbWF0aW9ucy5zbGljZSgpfSxfdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzOmZ1bmN0aW9uKCl7Yi5hbmltYXRpb25zV2l0aFByb21pc2VzPWIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuX3VwZGF0ZVByb21pc2VzKCl9KX0sX2Rpc2NhcmRBbmltYXRpb25zOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCksdGhpcy5fYW5pbWF0aW9ucz10aGlzLl9hbmltYXRpb25zLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZmluaXNoZWQiIT1hLnBsYXlTdGF0ZSYmImlkbGUiIT1hLnBsYXlTdGF0ZX0pfSxfcGxheTpmdW5jdGlvbihhKXt2YXIgYz1uZXcgYi5BbmltYXRpb24oYSx0aGlzKTtyZXR1cm4gdGhpcy5fYW5pbWF0aW9ucy5wdXNoKGMpLGIucmVzdGFydFdlYkFuaW1hdGlvbnNOZXh0VGljaygpLGMuX3VwZGF0ZVByb21pc2VzKCksYy5fYW5pbWF0aW9uLnBsYXkoKSxjLl91cGRhdGVQcm9taXNlcygpLGN9LHBsYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEucmVtb3ZlKCksdGhpcy5fcGxheShhKX19O3ZhciBmPSExO2IucmVzdGFydFdlYkFuaW1hdGlvbnNOZXh0VGljaz1mdW5jdGlvbigpe2Z8fChmPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShkKSl9O3ZhciBnPW5ldyBiLkFuaW1hdGlvblRpbWVsaW5lO2IudGltZWxpbmU9Zzt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5kb2N1bWVudCwidGltZWxpbmUiLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGd9fSl9Y2F0Y2goaCl7fXRyeXt3aW5kb3cuZG9jdW1lbnQudGltZWxpbmU9Z31jYXRjaChoKXt9fShjLGUsZiksZnVuY3Rpb24oYSxiLGMpe2IuYW5pbWF0aW9uc1dpdGhQcm9taXNlcz1bXSxiLkFuaW1hdGlvbj1mdW5jdGlvbihiLGMpe2lmKHRoaXMuaWQ9IiIsYiYmYi5faWQmJih0aGlzLmlkPWIuX2lkKSx0aGlzLmVmZmVjdD1iLGImJihiLl9hbmltYXRpb249dGhpcyksIWMpdGhyb3cgbmV3IEVycm9yKCJBbmltYXRpb24gd2l0aCBudWxsIHRpbWVsaW5lIGlzIG5vdCBzdXBwb3J0ZWQiKTt0aGlzLl90aW1lbGluZT1jLHRoaXMuX3NlcXVlbmNlTnVtYmVyPWEuc2VxdWVuY2VOdW1iZXIrKyx0aGlzLl9ob2xkVGltZT0wLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9pc0dyb3VwPSExLHRoaXMuX2FuaW1hdGlvbj1udWxsLHRoaXMuX2NoaWxkQW5pbWF0aW9ucz1bXSx0aGlzLl9jYWxsYmFjaz1udWxsLHRoaXMuX29sZFBsYXlTdGF0ZT0iaWRsZSIsdGhpcy5fcmVidWlsZFVuZGVybHlpbmdBbmltYXRpb24oKSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sYi5BbmltYXRpb24ucHJvdG90eXBlPXtfdXBkYXRlUHJvbWlzZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9vbGRQbGF5U3RhdGUsYj10aGlzLnBsYXlTdGF0ZTtyZXR1cm4gdGhpcy5fcmVhZHlQcm9taXNlJiZiIT09YSYmKCJpZGxlIj09Yj8odGhpcy5fcmVqZWN0UmVhZHlQcm9taXNlKCksdGhpcy5fcmVhZHlQcm9taXNlPXZvaWQgMCk6InBlbmRpbmciPT1hP3RoaXMuX3Jlc29sdmVSZWFkeVByb21pc2UoKToicGVuZGluZyI9PWImJih0aGlzLl9yZWFkeVByb21pc2U9dm9pZCAwKSksdGhpcy5fZmluaXNoZWRQcm9taXNlJiZiIT09YSYmKCJpZGxlIj09Yj8odGhpcy5fcmVqZWN0RmluaXNoZWRQcm9taXNlKCksdGhpcy5fZmluaXNoZWRQcm9taXNlPXZvaWQgMCk6ImZpbmlzaGVkIj09Yj90aGlzLl9yZXNvbHZlRmluaXNoZWRQcm9taXNlKCk6ImZpbmlzaGVkIj09YSYmKHRoaXMuX2ZpbmlzaGVkUHJvbWlzZT12b2lkIDApKSx0aGlzLl9vbGRQbGF5U3RhdGU9dGhpcy5wbGF5U3RhdGUsdGhpcy5fcmVhZHlQcm9taXNlfHx0aGlzLl9maW5pc2hlZFByb21pc2V9LF9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbjpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGEsYyxkLGUsZj0hIXRoaXMuX2FuaW1hdGlvbjtmJiYoYT10aGlzLnBsYXliYWNrUmF0ZSxjPXRoaXMuX3BhdXNlZCxkPXRoaXMuc3RhcnRUaW1lLGU9dGhpcy5jdXJyZW50VGltZSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fYW5pbWF0aW9uLl93cmFwcGVyPW51bGwsdGhpcy5fYW5pbWF0aW9uPW51bGwpLCghdGhpcy5lZmZlY3R8fHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LktleWZyYW1lRWZmZWN0KSYmKHRoaXMuX2FuaW1hdGlvbj1iLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdCh0aGlzLmVmZmVjdCksYi5iaW5kQW5pbWF0aW9uRm9yS2V5ZnJhbWVFZmZlY3QodGhpcykpLCh0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdHx8dGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuR3JvdXBFZmZlY3QpJiYodGhpcy5fYW5pbWF0aW9uPWIubmV3VW5kZXJseWluZ0FuaW1hdGlvbkZvckdyb3VwKHRoaXMuZWZmZWN0KSxiLmJpbmRBbmltYXRpb25Gb3JHcm91cCh0aGlzKSksdGhpcy5lZmZlY3QmJnRoaXMuZWZmZWN0Ll9vbnNhbXBsZSYmYi5iaW5kQW5pbWF0aW9uRm9yQ3VzdG9tRWZmZWN0KHRoaXMpLGYmJigxIT1hJiYodGhpcy5wbGF5YmFja1JhdGU9YSksbnVsbCE9PWQ/dGhpcy5zdGFydFRpbWU9ZDpudWxsIT09ZT90aGlzLmN1cnJlbnRUaW1lPWU6bnVsbCE9PXRoaXMuX2hvbGRUaW1lJiYodGhpcy5jdXJyZW50VGltZT10aGlzLl9ob2xkVGltZSksYyYmdGhpcy5wYXVzZSgpKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxfdXBkYXRlQ2hpbGRyZW46ZnVuY3Rpb24oKXtpZih0aGlzLmVmZmVjdCYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSl7dmFyIGE9dGhpcy5lZmZlY3QuX3RpbWluZy5kZWxheTt0aGlzLl9jaGlsZEFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbihjKXt0aGlzLl9hcnJhbmdlQ2hpbGRyZW4oYyxhKSx0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdCYmKGErPWIuZ3JvdXBDaGlsZER1cmF0aW9uKGMuZWZmZWN0KSl9LmJpbmQodGhpcykpfX0sX3NldEV4dGVybmFsQW5pbWF0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuZWZmZWN0JiZ0aGlzLl9pc0dyb3VwKWZvcih2YXIgYj0wO2I8dGhpcy5lZmZlY3QuY2hpbGRyZW4ubGVuZ3RoO2IrKyl0aGlzLmVmZmVjdC5jaGlsZHJlbltiXS5fYW5pbWF0aW9uPWEsdGhpcy5fY2hpbGRBbmltYXRpb25zW2JdLl9zZXRFeHRlcm5hbEFuaW1hdGlvbihhKX0sX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9uczpmdW5jdGlvbigpe2lmKHRoaXMuZWZmZWN0JiZ0aGlzLl9pc0dyb3VwKXt2YXIgYT10aGlzLmVmZmVjdC5fdGltaW5nLmRlbGF5O3RoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpLHRoaXMuZWZmZWN0LmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9d2luZG93LmRvY3VtZW50LnRpbWVsaW5lLl9wbGF5KGMpO3RoaXMuX2NoaWxkQW5pbWF0aW9ucy5wdXNoKGQpLGQucGxheWJhY2tSYXRlPXRoaXMucGxheWJhY2tSYXRlLHRoaXMuX3BhdXNlZCYmZC5wYXVzZSgpLGMuX2FuaW1hdGlvbj10aGlzLmVmZmVjdC5fYW5pbWF0aW9uLHRoaXMuX2FycmFuZ2VDaGlsZHJlbihkLGEpLHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0JiYoYSs9Yi5ncm91cENoaWxkRHVyYXRpb24oYykpfS5iaW5kKHRoaXMpKX19LF9hcnJhbmdlQ2hpbGRyZW46ZnVuY3Rpb24oYSxiKXtudWxsPT09dGhpcy5zdGFydFRpbWU/YS5jdXJyZW50VGltZT10aGlzLmN1cnJlbnRUaW1lLWIvdGhpcy5wbGF5YmFja1JhdGU6YS5zdGFydFRpbWUhPT10aGlzLnN0YXJ0VGltZStiL3RoaXMucGxheWJhY2tSYXRlJiYoYS5zdGFydFRpbWU9dGhpcy5zdGFydFRpbWUrYi90aGlzLnBsYXliYWNrUmF0ZSl9LGdldCB0aW1lbGluZSgpe3JldHVybiB0aGlzLl90aW1lbGluZX0sZ2V0IHBsYXlTdGF0ZSgpe3JldHVybiB0aGlzLl9hbmltYXRpb24/dGhpcy5fYW5pbWF0aW9uLnBsYXlTdGF0ZToiaWRsZSJ9LGdldCBmaW5pc2hlZCgpe3JldHVybiB3aW5kb3cuUHJvbWlzZT8odGhpcy5fZmluaXNoZWRQcm9taXNlfHwoLTE9PWIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5pbmRleE9mKHRoaXMpJiZiLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMucHVzaCh0aGlzKSx0aGlzLl9maW5pc2hlZFByb21pc2U9bmV3IFByb21pc2UoZnVuY3Rpb24oYSxiKXt0aGlzLl9yZXNvbHZlRmluaXNoZWRQcm9taXNlPWZ1bmN0aW9uKCl7YSh0aGlzKX0sdGhpcy5fcmVqZWN0RmluaXNoZWRQcm9taXNlPWZ1bmN0aW9uKCl7Yih7dHlwZTpET01FeGNlcHRpb24uQUJPUlRfRVJSLG5hbWU6IkFib3J0RXJyb3IifSl9fS5iaW5kKHRoaXMpKSwiZmluaXNoZWQiPT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5fcmVzb2x2ZUZpbmlzaGVkUHJvbWlzZSgpKSx0aGlzLl9maW5pc2hlZFByb21pc2UpOihjb25zb2xlLndhcm4oIkFuaW1hdGlvbiBQcm9taXNlcyByZXF1aXJlIEphdmFTY3JpcHQgUHJvbWlzZSBjb25zdHJ1Y3RvciIpLG51bGwpfSxnZXQgcmVhZHkoKXtyZXR1cm4gd2luZG93LlByb21pc2U/KHRoaXMuX3JlYWR5UHJvbWlzZXx8KC0xPT1iLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMuaW5kZXhPZih0aGlzKSYmYi5hbmltYXRpb25zV2l0aFByb21pc2VzLnB1c2godGhpcyksdGhpcy5fcmVhZHlQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYil7dGhpcy5fcmVzb2x2ZVJlYWR5UHJvbWlzZT1mdW5jdGlvbigpe2EodGhpcyl9LHRoaXMuX3JlamVjdFJlYWR5UHJvbWlzZT1mdW5jdGlvbigpe2Ioe3R5cGU6RE9NRXhjZXB0aW9uLkFCT1JUX0VSUixuYW1lOiJBYm9ydEVycm9yIn0pfX0uYmluZCh0aGlzKSksInBlbmRpbmciIT09dGhpcy5wbGF5U3RhdGUmJnRoaXMuX3Jlc29sdmVSZWFkeVByb21pc2UoKSksdGhpcy5fcmVhZHlQcm9taXNlKTooY29uc29sZS53YXJuKCJBbmltYXRpb24gUHJvbWlzZXMgcmVxdWlyZSBKYXZhU2NyaXB0IFByb21pc2UgY29uc3RydWN0b3IiKSxudWxsKX0sZ2V0IG9uZmluaXNoKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaH0sc2V0IG9uZmluaXNoKGEpeyJmdW5jdGlvbiI9PXR5cGVvZiBhP3RoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaD1mdW5jdGlvbihiKXtiLnRhcmdldD10aGlzLGEuY2FsbCh0aGlzLGIpfS5iaW5kKHRoaXMpOnRoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaD1hfSxnZXQgb25jYW5jZWwoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsfSxzZXQgb25jYW5jZWwoYSl7ImZ1bmN0aW9uIj09dHlwZW9mIGE/dGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsPWZ1bmN0aW9uKGIpe2IudGFyZ2V0PXRoaXMsYS5jYWxsKHRoaXMsYil9LmJpbmQodGhpcyk6dGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsPWF9LGdldCBjdXJyZW50VGltZSgpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGE9dGhpcy5fYW5pbWF0aW9uLmN1cnJlbnRUaW1lO3JldHVybiB0aGlzLl91cGRhdGVQcm9taXNlcygpLGF9LHNldCBjdXJyZW50VGltZShhKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5jdXJyZW50VGltZT1pc0Zpbml0ZShhKT9hOk1hdGguc2lnbihhKSpOdW1iZXIuTUFYX1ZBTFVFLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGIsYyl7Yi5jdXJyZW50VGltZT1hLWN9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxnZXQgc3RhcnRUaW1lKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5zdGFydFRpbWV9LHNldCBzdGFydFRpbWUoYSl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKSx0aGlzLl9hbmltYXRpb24uc3RhcnRUaW1lPWlzRmluaXRlKGEpP2E6TWF0aC5zaWduKGEpKk51bWJlci5NQVhfVkFMVUUsdGhpcy5fcmVnaXN0ZXIoKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYixjKXtiLnN0YXJ0VGltZT1hK2N9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxnZXQgcGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5wbGF5YmFja1JhdGV9LHNldCBwbGF5YmFja1JhdGUoYSl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKTt2YXIgYj10aGlzLmN1cnJlbnRUaW1lO3RoaXMuX2FuaW1hdGlvbi5wbGF5YmFja1JhdGU9YSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYil7Yi5wbGF5YmFja1JhdGU9YX0pLCJwYXVzZWQiIT10aGlzLnBsYXlTdGF0ZSYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5wbGF5KCksbnVsbCE9PWImJih0aGlzLmN1cnJlbnRUaW1lPWIpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9hbmltYXRpb24ucGxheSgpLC0xPT10aGlzLl90aW1lbGluZS5fYW5pbWF0aW9ucy5pbmRleE9mKHRoaXMpJiZ0aGlzLl90aW1lbGluZS5fYW5pbWF0aW9ucy5wdXNoKHRoaXMpLHRoaXMuX3JlZ2lzdGVyKCksYi5hd2FpdFN0YXJ0VGltZSh0aGlzKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYSl7dmFyIGI9YS5jdXJyZW50VGltZTthLnBsYXkoKSxhLmN1cnJlbnRUaW1lPWJ9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5jdXJyZW50VGltZSYmKHRoaXMuX2hvbGRUaW1lPXRoaXMuY3VycmVudFRpbWUpLHRoaXMuX2FuaW1hdGlvbi5wYXVzZSgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pLHRoaXMuX3BhdXNlZD0hMCx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxmaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5maW5pc2goKSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGNhbmNlbDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5fYW5pbWF0aW9uLmNhbmNlbCgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0scmV2ZXJzZTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGE9dGhpcy5jdXJyZW50VGltZTt0aGlzLl9hbmltYXRpb24ucmV2ZXJzZSgpLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihhKXthLnJldmVyc2UoKX0pLG51bGwhPT1hJiYodGhpcy5jdXJyZW50VGltZT1hKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YjsiZnVuY3Rpb24iPT10eXBlb2YgYiYmKGM9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9dGhpcyxiLmNhbGwodGhpcyxhKX0uYmluZCh0aGlzKSxiLl93cmFwcGVyPWMpLHRoaXMuX2FuaW1hdGlvbi5hZGRFdmVudExpc3RlbmVyKGEsYyl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXt0aGlzLl9hbmltYXRpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGImJmIuX3dyYXBwZXJ8fGIpfSxfcmVtb3ZlQ2hpbGRBbmltYXRpb25zOmZ1bmN0aW9uKCl7Zm9yKDt0aGlzLl9jaGlsZEFuaW1hdGlvbnMubGVuZ3RoOyl0aGlzLl9jaGlsZEFuaW1hdGlvbnMucG9wKCkuY2FuY2VsKCl9LF9mb3JFYWNoQ2hpbGQ6ZnVuY3Rpb24oYil7dmFyIGM9MDtpZih0aGlzLmVmZmVjdC5jaGlsZHJlbiYmdGhpcy5fY2hpbGRBbmltYXRpb25zLmxlbmd0aDx0aGlzLmVmZmVjdC5jaGlsZHJlbi5sZW5ndGgmJnRoaXMuX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9ucygpLHRoaXMuX2NoaWxkQW5pbWF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2IuY2FsbCh0aGlzLGEsYyksdGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuU2VxdWVuY2VFZmZlY3QmJihjKz1hLmVmZmVjdC5hY3RpdmVEdXJhdGlvbil9LmJpbmQodGhpcykpLCJwZW5kaW5nIiE9dGhpcy5wbGF5U3RhdGUpe3ZhciBkPXRoaXMuZWZmZWN0Ll90aW1pbmcsZT10aGlzLmN1cnJlbnRUaW1lO251bGwhPT1lJiYoZT1hLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGQpLGUsZCkpLChudWxsPT1lfHxpc05hTihlKSkmJnRoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpfX19LHdpbmRvdy5BbmltYXRpb249Yi5BbmltYXRpb259KGMsZSxmKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChiKXt0aGlzLl9mcmFtZXM9YS5ub3JtYWxpemVLZXlmcmFtZXMoYil9ZnVuY3Rpb24gZSgpe2Zvcih2YXIgYT0hMTtpLmxlbmd0aDspe3ZhciBiPWkuc2hpZnQoKTtiLl91cGRhdGVDaGlsZHJlbigpLGE9ITB9cmV0dXJuIGF9dmFyIGY9ZnVuY3Rpb24oYSl7aWYoYS5fYW5pbWF0aW9uPXZvaWQgMCxhIGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0fHxhIGluc3RhbmNlb2Ygd2luZG93Lkdyb3VwRWZmZWN0KWZvcih2YXIgYj0wO2I8YS5jaGlsZHJlbi5sZW5ndGg7YisrKWYoYS5jaGlsZHJlbltiXSl9O2IucmVtb3ZlTXVsdGk9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtkLl9wYXJlbnQ/KC0xPT1iLmluZGV4T2YoZC5fcGFyZW50KSYmYi5wdXNoKGQuX3BhcmVudCksZC5fcGFyZW50LmNoaWxkcmVuLnNwbGljZShkLl9wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihkKSwxKSxkLl9wYXJlbnQ9bnVsbCxmKGQpKTpkLl9hbmltYXRpb24mJmQuX2FuaW1hdGlvbi5lZmZlY3Q9PWQmJihkLl9hbmltYXRpb24uY2FuY2VsKCksZC5fYW5pbWF0aW9uLmVmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QobnVsbCxbXSksZC5fYW5pbWF0aW9uLl9jYWxsYmFjayYmKGQuX2FuaW1hdGlvbi5fY2FsbGJhY2suX2FuaW1hdGlvbj1udWxsKSxkLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCksZihkKSl9Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLl9yZWJ1aWxkKCl9LGIuS2V5ZnJhbWVFZmZlY3Q9ZnVuY3Rpb24oYixjLGUsZil7cmV0dXJuIHRoaXMudGFyZ2V0PWIsdGhpcy5fcGFyZW50PW51bGwsZT1hLm51bWVyaWNUaW1pbmdUb09iamVjdChlKSx0aGlzLl90aW1pbmdJbnB1dD1hLmNsb25lVGltaW5nSW5wdXQoZSksdGhpcy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoZSksdGhpcy50aW1pbmc9YS5tYWtlVGltaW5nKGUsITEsdGhpcyksdGhpcy50aW1pbmcuX2VmZmVjdD10aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBjPyhhLmRlcHJlY2F0ZWQoIkN1c3RvbSBLZXlmcmFtZUVmZmVjdCIsIjIwMTUtMDYtMjIiLCJVc2UgS2V5ZnJhbWVFZmZlY3Qub25zYW1wbGUgaW5zdGVhZC4iKSx0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzPWMpOnRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM9bmV3IGQoYyksdGhpcy5fa2V5ZnJhbWVzPWMsdGhpcy5hY3RpdmVEdXJhdGlvbj1hLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKHRoaXMuX3RpbWluZyksdGhpcy5faWQ9Zix0aGlzfSxiLktleWZyYW1lRWZmZWN0LnByb3RvdHlwZT17Z2V0RnJhbWVzOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM/dGhpcy5fbm9ybWFsaXplZEtleWZyYW1lczp0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzLl9mcmFtZXN9LHNldCBvbnNhbXBsZShhKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5nZXRGcmFtZXMoKSl0aHJvdyBuZXcgRXJyb3IoIlNldHRpbmcgb25zYW1wbGUgb24gY3VzdG9tIGVmZmVjdCBLZXlmcmFtZUVmZmVjdCBpcyBub3Qgc3VwcG9ydGVkLiIpO3RoaXMuX29uc2FtcGxlPWEsdGhpcy5fYW5pbWF0aW9uJiZ0aGlzLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCl9LGdldCBwYXJlbnQoKXtyZXR1cm4gdGhpcy5fcGFyZW50fSxjbG9uZTpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmdldEZyYW1lcygpKXRocm93IG5ldyBFcnJvcigiQ2xvbmluZyBjdXN0b20gZWZmZWN0cyBpcyBub3Qgc3VwcG9ydGVkLiIpO3ZhciBiPW5ldyBLZXlmcmFtZUVmZmVjdCh0aGlzLnRhcmdldCxbXSxhLmNsb25lVGltaW5nSW5wdXQodGhpcy5fdGltaW5nSW5wdXQpLHRoaXMuX2lkKTtyZXR1cm4gYi5fbm9ybWFsaXplZEtleWZyYW1lcz10aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzLGIuX2tleWZyYW1lcz10aGlzLl9rZXlmcmFtZXMsYn0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVNdWx0aShbdGhpc10pfX07dmFyIGc9RWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZTtFbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9IiI7cmV0dXJuIGMmJmMuaWQmJihkPWMuaWQpLGIudGltZWxpbmUuX3BsYXkobmV3IGIuS2V5ZnJhbWVFZmZlY3QodGhpcyxhLGMsZCkpfTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKTtiLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihhKXtpZihhKXt2YXIgYj1hLnRhcmdldHx8aCxjPWEuX2tleWZyYW1lczsiZnVuY3Rpb24iPT10eXBlb2YgYyYmKGM9W10pO3ZhciBkPWEuX3RpbWluZ0lucHV0O2QuaWQ9YS5faWR9ZWxzZSB2YXIgYj1oLGM9W10sZD0wO3JldHVybiBnLmFwcGx5KGIsW2MsZF0pfSxiLmJpbmRBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihhKXthLmVmZmVjdCYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZWZmZWN0Ll9ub3JtYWxpemVkS2V5ZnJhbWVzJiZiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3QoYSl9O3ZhciBpPVtdO2IuYXdhaXRTdGFydFRpbWU9ZnVuY3Rpb24oYSl7bnVsbD09PWEuc3RhcnRUaW1lJiZhLl9pc0dyb3VwJiYoMD09aS5sZW5ndGgmJnJlcXVlc3RBbmltYXRpb25GcmFtZShlKSxpLnB1c2goYSkpfTt2YXIgaj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZTtPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCJnZXRDb21wdXRlZFN0eWxlIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQudGltZWxpbmUuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpO3ZhciBhPWouYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBlKCkmJihhPWouYXBwbHkodGhpcyxhcmd1bWVudHMpKSx3aW5kb3cuZG9jdW1lbnQudGltZWxpbmUuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpLGF9fSksd2luZG93LktleWZyYW1lRWZmZWN0PWIuS2V5ZnJhbWVFZmZlY3Qsd2luZG93LkVsZW1lbnQucHJvdG90eXBlLmdldEFuaW1hdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQudGltZWxpbmUuZ2V0QW5pbWF0aW9ucygpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9PWEuZWZmZWN0JiZhLmVmZmVjdC50YXJnZXQ9PXRoaXN9LmJpbmQodGhpcykpfX0oYyxlLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe2EuX3JlZ2lzdGVyZWR8fChhLl9yZWdpc3RlcmVkPSEwLGcucHVzaChhKSxofHwoaD0hMCxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZSkpKX1mdW5jdGlvbiBlKGEpe3ZhciBiPWc7Zz1bXSxiLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5fc2VxdWVuY2VOdW1iZXItYi5fc2VxdWVuY2VOdW1iZXJ9KSxiPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe2EoKTt2YXIgYj1hLl9hbmltYXRpb24/YS5fYW5pbWF0aW9uLnBsYXlTdGF0ZToiaWRsZSI7cmV0dXJuInJ1bm5pbmciIT1iJiYicGVuZGluZyIhPWImJihhLl9yZWdpc3RlcmVkPSExKSxhLl9yZWdpc3RlcmVkfSksZy5wdXNoLmFwcGx5KGcsYiksZy5sZW5ndGg/KGg9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpKTpoPSExfXZhciBmPShkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKSwwKTtiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3Q9ZnVuY3Rpb24oYil7dmFyIGMsZT1iLmVmZmVjdC50YXJnZXQsZz0iZnVuY3Rpb24iPT10eXBlb2YgYi5lZmZlY3QuZ2V0RnJhbWVzKCk7Yz1nP2IuZWZmZWN0LmdldEZyYW1lcygpOmIuZWZmZWN0Ll9vbnNhbXBsZTt2YXIgaD1iLmVmZmVjdC50aW1pbmcsaT1udWxsO2g9YS5ub3JtYWxpemVUaW1pbmdJbnB1dChoKTt2YXIgaj1mdW5jdGlvbigpe3ZhciBkPWouX2FuaW1hdGlvbj9qLl9hbmltYXRpb24uY3VycmVudFRpbWU6bnVsbDtudWxsIT09ZCYmKGQ9YS5jYWxjdWxhdGVUaW1lRnJhY3Rpb24oYS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihoKSxkLGgpLGlzTmFOKGQpJiYoZD1udWxsKSksZCE9PWkmJihnP2MoZCxlLGIuZWZmZWN0KTpjKGQsYi5lZmZlY3QsYi5lZmZlY3QuX2FuaW1hdGlvbikpLGk9ZH07ai5fYW5pbWF0aW9uPWIsai5fcmVnaXN0ZXJlZD0hMSxqLl9zZXF1ZW5jZU51bWJlcj1mKyssYi5fY2FsbGJhY2s9aixkKGopfTt2YXIgZz1bXSxoPSExO2IuQW5pbWF0aW9uLnByb3RvdHlwZS5fcmVnaXN0ZXI9ZnVuY3Rpb24oKXt0aGlzLl9jYWxsYmFjayYmZCh0aGlzLl9jYWxsYmFjayl9fShjLGUsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7cmV0dXJuIGEuX3RpbWluZy5kZWxheSthLmFjdGl2ZUR1cmF0aW9uK2EuX3RpbWluZy5lbmREZWxheX1mdW5jdGlvbiBlKGIsYyxkKXt0aGlzLl9pZD1kLHRoaXMuX3BhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49Ynx8W10sdGhpcy5fcmVwYXJlbnQodGhpcy5jaGlsZHJlbiksYz1hLm51bWVyaWNUaW1pbmdUb09iamVjdChjKSx0aGlzLl90aW1pbmdJbnB1dD1hLmNsb25lVGltaW5nSW5wdXQoYyksdGhpcy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYywhMCksdGhpcy50aW1pbmc9YS5tYWtlVGltaW5nKGMsITAsdGhpcyksdGhpcy50aW1pbmcuX2VmZmVjdD10aGlzLCJhdXRvIj09PXRoaXMuX3RpbWluZy5kdXJhdGlvbiYmKHRoaXMuX3RpbWluZy5kdXJhdGlvbj10aGlzLmFjdGl2ZUR1cmF0aW9uKX13aW5kb3cuU2VxdWVuY2VFZmZlY3Q9ZnVuY3Rpb24oKXtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sd2luZG93Lkdyb3VwRWZmZWN0PWZ1bmN0aW9uKCl7ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlPXtfaXNBbmNlc3RvcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcztudWxsIT09Yjspe2lmKGI9PWEpcmV0dXJuITA7Yj1iLl9wYXJlbnR9cmV0dXJuITF9LF9yZWJ1aWxkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXM7YTspImF1dG8iPT09YS50aW1pbmcuZHVyYXRpb24mJihhLl90aW1pbmcuZHVyYXRpb249YS5hY3RpdmVEdXJhdGlvbiksYT1hLl9wYXJlbnQ7dGhpcy5fYW5pbWF0aW9uJiZ0aGlzLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCl9LF9yZXBhcmVudDpmdW5jdGlvbihhKXtiLnJlbW92ZU11bHRpKGEpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWFbY10uX3BhcmVudD10aGlzfSxfcHV0Q2hpbGQ6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9Yj8iQ2Fubm90IGFwcGVuZCBhbiBhbmNlc3RvciBvciBzZWxmIjoiQ2Fubm90IHByZXBlbmQgYW4gYW5jZXN0b3Igb3Igc2VsZiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWlmKHRoaXMuX2lzQW5jZXN0b3IoYVtkXSkpdGhyb3d7dHlwZTpET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLG5hbWU6IkhpZXJhcmNoeVJlcXVlc3RFcnJvciIsbWVzc2FnZTpjfTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyliP3RoaXMuY2hpbGRyZW4ucHVzaChhW2RdKTp0aGlzLmNoaWxkcmVuLnVuc2hpZnQoYVtkXSk7dGhpcy5fcmVwYXJlbnQoYSksdGhpcy5fcmVidWlsZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXt0aGlzLl9wdXRDaGlsZChhcmd1bWVudHMsITApfSxwcmVwZW5kOmZ1bmN0aW9uKCl7dGhpcy5fcHV0Q2hpbGQoYXJndW1lbnRzLCExKX0sZ2V0IHBhcmVudCgpe3JldHVybiB0aGlzLl9wYXJlbnR9LGdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoP3RoaXMuY2hpbGRyZW5bMF06bnVsbH0sZ2V0IGxhc3RDaGlsZCgpe3JldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aD90aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoLTFdOm51bGx9LGNsb25lOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPWEuY2xvbmVUaW1pbmdJbnB1dCh0aGlzLl90aW1pbmdJbnB1dCksYz1bXSxkPTA7ZDx0aGlzLmNoaWxkcmVuLmxlbmd0aDtkKyspYy5wdXNoKHRoaXMuY2hpbGRyZW5bZF0uY2xvbmUoKSk7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBHcm91cEVmZmVjdD9uZXcgR3JvdXBFZmZlY3QoYyxiKTpuZXcgU2VxdWVuY2VFZmZlY3QoYyxiKX0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVNdWx0aShbdGhpc10pfX0sd2luZG93LlNlcXVlbmNlRWZmZWN0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LlNlcXVlbmNlRWZmZWN0LnByb3RvdHlwZSwiYWN0aXZlRHVyYXRpb24iLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYil7YSs9ZChiKX0pLE1hdGgubWF4KGEsMCl9fSksd2luZG93Lkdyb3VwRWZmZWN0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93Lkdyb3VwRWZmZWN0LnByb3RvdHlwZSwiYWN0aXZlRHVyYXRpb24iLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYil7YT1NYXRoLm1heChhLGQoYikpfSksYX19KSxiLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JHcm91cD1mdW5jdGlvbihjKXt2YXIgZCxlPW51bGwsZj1mdW5jdGlvbihiKXt2YXIgYz1kLl93cmFwcGVyO3JldHVybiBjJiYicGVuZGluZyIhPWMucGxheVN0YXRlJiZjLmVmZmVjdD9udWxsPT1iP3ZvaWQgYy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCk6MD09YiYmYy5wbGF5YmFja1JhdGU8MCYmKGV8fChlPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYy5lZmZlY3QudGltaW5nKSksYj1hLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGUpLC0xLGUpLGlzTmFOKGIpfHxudWxsPT1iKT8oYy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe2EuY3VycmVudFRpbWU9LTF9KSx2b2lkIGMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpKTp2b2lkIDA6dm9pZCAwfSxnPW5ldyBLZXlmcmFtZUVmZmVjdChudWxsLFtdLGMuX3RpbWluZyxjLl9pZCk7cmV0dXJuIGcub25zYW1wbGU9ZixkPWIudGltZWxpbmUuX3BsYXkoZyl9LGIuYmluZEFuaW1hdGlvbkZvckdyb3VwPWZ1bmN0aW9uKGEpe2EuX2FuaW1hdGlvbi5fd3JhcHBlcj1hLGEuX2lzR3JvdXA9ITAsYi5hd2FpdFN0YXJ0VGltZShhKSxhLl9jb25zdHJ1Y3RDaGlsZEFuaW1hdGlvbnMoKSxhLl9zZXRFeHRlcm5hbEFuaW1hdGlvbihhKX0sYi5ncm91cENoaWxkRHVyYXRpb249ZH0oYyxlLGYpLGJbInRydWUiXT1hfSh7fSxmdW5jdGlvbigpe3JldHVybiB0aGlzfSgpKTsKCi8qKgpAbGljZW5zZSBAbm9jb21waWxlCkNvcHlyaWdodCAoYykgMjAxOCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CkNvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCnN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiovCihmdW5jdGlvbigpey8qCgogQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwondXNlIHN0cmljdCc7dmFyIG4scD0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93PT09dGhpcz90aGlzOiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOnRoaXMsYWE9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7YSE9QXJyYXkucHJvdG90eXBlJiZhIT1PYmplY3QucHJvdG90eXBlJiYoYVtiXT1jLnZhbHVlKX07ZnVuY3Rpb24gYmEoKXtiYT1mdW5jdGlvbigpe307cC5TeW1ib2x8fChwLlN5bWJvbD1jYSl9dmFyIGNhPWZ1bmN0aW9uKCl7dmFyIGE9MDtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuImpzY29tcF9zeW1ib2xfIisoYnx8IiIpK2ErK319KCk7CmZ1bmN0aW9uIGRhKCl7YmEoKTt2YXIgYT1wLlN5bWJvbC5pdGVyYXRvcjthfHwoYT1wLlN5bWJvbC5pdGVyYXRvcj1wLlN5bWJvbCgiaXRlcmF0b3IiKSk7ImZ1bmN0aW9uIiE9dHlwZW9mIEFycmF5LnByb3RvdHlwZVthXSYmYWEoQXJyYXkucHJvdG90eXBlLGEse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBlYSh0aGlzKX19KTtkYT1mdW5jdGlvbigpe319ZnVuY3Rpb24gZWEoYSl7dmFyIGI9MDtyZXR1cm4gZmEoZnVuY3Rpb24oKXtyZXR1cm4gYjxhLmxlbmd0aD97ZG9uZTohMSx2YWx1ZTphW2IrK119Ontkb25lOiEwfX0pfWZ1bmN0aW9uIGZhKGEpe2RhKCk7YT17bmV4dDphfTthW3AuU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtyZXR1cm4gYX1mdW5jdGlvbiBpYShhKXtkYSgpO3ZhciBiPWFbU3ltYm9sLml0ZXJhdG9yXTtyZXR1cm4gYj9iLmNhbGwoYSk6ZWEoYSl9CmZ1bmN0aW9uIGphKGEpe2Zvcih2YXIgYixjPVtdOyEoYj1hLm5leHQoKSkuZG9uZTspYy5wdXNoKGIudmFsdWUpO3JldHVybiBjfQooZnVuY3Rpb24oKXtpZighZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTthLmluaXRFdmVudCgiZm9vIiwhMCwhMCk7YS5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBhLmRlZmF1bHRQcmV2ZW50ZWR9KCkpe3ZhciBhPUV2ZW50LnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdDtFdmVudC5wcm90b3R5cGUucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbGFibGUmJihhLmNhbGwodGhpcyksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImRlZmF1bHRQcmV2ZW50ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sY29uZmlndXJhYmxlOiEwfSkpfX12YXIgYj0vVHJpZGVudC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZighd2luZG93LkN1c3RvbUV2ZW50fHxiJiYiZnVuY3Rpb24iIT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCl3aW5kb3cuQ3VzdG9tRXZlbnQ9ZnVuY3Rpb24oYSxiKXtiPWJ8fHt9O3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpOwpjLmluaXRDdXN0b21FdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlLGIuZGV0YWlsKTtyZXR1cm4gY30sd2luZG93LkN1c3RvbUV2ZW50LnByb3RvdHlwZT13aW5kb3cuRXZlbnQucHJvdG90eXBlO2lmKCF3aW5kb3cuRXZlbnR8fGImJiJmdW5jdGlvbiIhPT10eXBlb2Ygd2luZG93LkV2ZW50KXt2YXIgYz13aW5kb3cuRXZlbnQ7d2luZG93LkV2ZW50PWZ1bmN0aW9uKGEsYil7Yj1ifHx7fTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtjLmluaXRFdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlKTtyZXR1cm4gY307aWYoYylmb3IodmFyIGQgaW4gYyl3aW5kb3cuRXZlbnRbZF09Y1tkXTt3aW5kb3cuRXZlbnQucHJvdG90eXBlPWMucHJvdG90eXBlfWlmKCF3aW5kb3cuTW91c2VFdmVudHx8YiYmImZ1bmN0aW9uIiE9PXR5cGVvZiB3aW5kb3cuTW91c2VFdmVudCl7Yj13aW5kb3cuTW91c2VFdmVudDt3aW5kb3cuTW91c2VFdmVudD1mdW5jdGlvbihhLApiKXtiPWJ8fHt9O3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50Iik7Yy5pbml0TW91c2VFdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlLGIudmlld3x8d2luZG93LGIuZGV0YWlsLGIuc2NyZWVuWCxiLnNjcmVlblksYi5jbGllbnRYLGIuY2xpZW50WSxiLmN0cmxLZXksYi5hbHRLZXksYi5zaGlmdEtleSxiLm1ldGFLZXksYi5idXR0b24sYi5yZWxhdGVkVGFyZ2V0KTtyZXR1cm4gY307aWYoYilmb3IoZCBpbiBiKXdpbmRvdy5Nb3VzZUV2ZW50W2RdPWJbZF07d2luZG93Lk1vdXNlRXZlbnQucHJvdG90eXBlPWIucHJvdG90eXBlfUFycmF5LmZyb218fChBcnJheS5mcm9tPWZ1bmN0aW9uKGEpe3JldHVybltdLnNsaWNlLmNhbGwoYSl9KTtPYmplY3QuYXNzaWdufHwoT2JqZWN0LmFzc2lnbj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxkPTAsZTtkPGMubGVuZ3RoO2QrKylpZihlPWNbZF0pZm9yKHZhciBmPQphLG09ZSxxPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG0pLHg9MDt4PHEubGVuZ3RoO3grKyllPXFbeF0sZltlXT1tW2VdO3JldHVybiBhfSl9KSh3aW5kb3cuV2ViQ29tcG9uZW50cyk7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe31mdW5jdGlvbiBiKGEsYil7aWYoIWEuY2hpbGROb2Rlcy5sZW5ndGgpcmV0dXJuW107c3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgTm9kZS5ET0NVTUVOVF9OT0RFOnJldHVybiB1YS5jYWxsKGEsYik7Y2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6cmV0dXJuIGxiLmNhbGwoYSxiKTtkZWZhdWx0OnJldHVybiBVLmNhbGwoYSxiKX19dmFyIGM9InVuZGVmaW5lZCI9PT10eXBlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCxkPSEoZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLmNsb25lTm9kZSgpaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSxlPSExOy9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiZmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtpZihhIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClmb3IodmFyIGQ7ZD1hLmZpcnN0Q2hpbGQ7KWMuY2FsbCh0aGlzLGQsYik7ZWxzZSBjLmNhbGwodGhpcywKYSxiKTtyZXR1cm4gYX1lPSEwO3ZhciBiPU5vZGUucHJvdG90eXBlLmNsb25lTm9kZTtOb2RlLnByb3RvdHlwZS5jbG9uZU5vZGU9ZnVuY3Rpb24oYSl7YT1iLmNhbGwodGhpcyxhKTt0aGlzIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCYmKGEuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlKTtyZXR1cm4gYX07RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbD1IVE1MRWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbDtEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yPUhUTUxFbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLHtub2RlVHlwZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERX0sY29uZmlndXJhYmxlOiEwfSxsb2NhbE5hbWU6e2dldDpmdW5jdGlvbigpe30sCmNvbmZpZ3VyYWJsZTohMH0sbm9kZU5hbWU6e2dldDpmdW5jdGlvbigpe3JldHVybiIjZG9jdW1lbnQtZnJhZ21lbnQifSxjb25maWd1cmFibGU6ITB9fSk7dmFyIGM9Tm9kZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlO05vZGUucHJvdG90eXBlLmluc2VydEJlZm9yZT1hO3ZhciBkPU5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkO05vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkPWZ1bmN0aW9uKGIpe2IgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50P2EuY2FsbCh0aGlzLGIsbnVsbCk6ZC5jYWxsKHRoaXMsYik7cmV0dXJuIGJ9O3ZhciBmPU5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLGc9Tm9kZS5wcm90b3R5cGUucmVwbGFjZUNoaWxkO05vZGUucHJvdG90eXBlLnJlcGxhY2VDaGlsZD1mdW5jdGlvbihiLGMpe2IgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50PyhhLmNhbGwodGhpcyxiLGMpLGYuY2FsbCh0aGlzLGMpKTpnLmNhbGwodGhpcyxiLGMpO3JldHVybiBjfTtEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudD0KZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNyZWF0ZUVsZW1lbnQoImRmIik7YS5fX3Byb3RvX189RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGU7cmV0dXJuIGF9O3ZhciBoPURvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlO0RvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlPWZ1bmN0aW9uKGEsYil7Yj1oLmNhbGwodGhpcyxhLGJ8fCExKTthIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCYmKGIuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlKTtyZXR1cm4gYn19KCk7dmFyIGY9Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlLGc9RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQsaD1Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZSxrPU5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLGw9Tm9kZS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQsbT1Ob2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQscT1ET01QYXJzZXIucHJvdG90eXBlLnBhcnNlRnJvbVN0cmluZywKeD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpfHx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5uZXJIVE1MfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5pbm5lckhUTUw9YX19LE09T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuTm9kZS5wcm90b3R5cGUsImNoaWxkTm9kZXMiKXx8e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9fSxVPUVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwsdWE9RG9jdW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwsbGI9RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbCxtYj1mdW5jdGlvbigpe2lmKCFjKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpLGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtiLmNvbnRlbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOwphLmNvbnRlbnQuYXBwZW5kQ2hpbGQoYik7YT1hLmNsb25lTm9kZSghMCk7cmV0dXJuIDA9PT1hLmNvbnRlbnQuY2hpbGROb2Rlcy5sZW5ndGh8fDA9PT1hLmNvbnRlbnQuZmlyc3RDaGlsZC5jb250ZW50LmNoaWxkTm9kZXMubGVuZ3RofHxkfX0oKTtpZihjKXt2YXIgUz1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoInRlbXBsYXRlIiksQz0hMCxWPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7Vi50ZXh0Q29udGVudD0idGVtcGxhdGV7ZGlzcGxheTpub25lO30iO3ZhciBoYT1kb2N1bWVudC5oZWFkO2hhLmluc2VydEJlZm9yZShWLGhhLmZpcnN0RWxlbWVudENoaWxkKTthLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEhUTUxFbGVtZW50LnByb3RvdHlwZSk7dmFyIHZhPSFkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5oYXNPd25Qcm9wZXJ0eSgiaW5uZXJIVE1MIik7YS5HPWZ1bmN0aW9uKGIpe2lmKCFiLmNvbnRlbnQmJmIubmFtZXNwYWNlVVJJPT09CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkpe2IuY29udGVudD1TLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtmb3IodmFyIGM7Yz1iLmZpcnN0Q2hpbGQ7KWwuY2FsbChiLmNvbnRlbnQsYyk7aWYodmEpYi5fX3Byb3RvX189YS5wcm90b3R5cGU7ZWxzZSBpZihiLmNsb25lTm9kZT1mdW5jdGlvbihiKXtyZXR1cm4gYS5hKHRoaXMsYil9LEMpdHJ5e1AoYiksVyhiKX1jYXRjaChUZyl7Qz0hMX1hLkMoYi5jb250ZW50KX19O3ZhciBYPXtvcHRpb246WyJzZWxlY3QiXSx0aGVhZDpbInRhYmxlIl0sY29sOlsiY29sZ3JvdXAiLCJ0YWJsZSJdLHRyOlsidGJvZHkiLCJ0YWJsZSJdLHRoOlsidHIiLCJ0Ym9keSIsInRhYmxlIl0sdGQ6WyJ0ciIsInRib2R5IiwidGFibGUiXX0sUD1mdW5jdGlvbihiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwiaW5uZXJIVE1MIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG5iKHRoaXMpfSxzZXQ6ZnVuY3Rpb24oYil7dmFyIGM9WFsoLzwoW2Etel1bXi9cMD5ceDIwXHRcclxuXGZdKykvaS5leGVjKGIpfHwKWyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV07aWYoYylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyliPSI8IitjW2RdKyI+IitiKyI8LyIrY1tkXSsiPiI7Uy5ib2R5LmlubmVySFRNTD1iO2ZvcihhLkMoUyk7dGhpcy5jb250ZW50LmZpcnN0Q2hpbGQ7KWsuY2FsbCh0aGlzLmNvbnRlbnQsdGhpcy5jb250ZW50LmZpcnN0Q2hpbGQpO2I9Uy5ib2R5O2lmKGMpZm9yKGQ9MDtkPGMubGVuZ3RoO2QrKyliPWIubGFzdENoaWxkO2Zvcig7Yi5maXJzdENoaWxkOylsLmNhbGwodGhpcy5jb250ZW50LGIuZmlyc3RDaGlsZCl9LGNvbmZpZ3VyYWJsZTohMH0pfSxXPWZ1bmN0aW9uKGEpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJvdXRlckhUTUwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iPHRlbXBsYXRlPiIrdGhpcy5pbm5lckhUTUwrIjwvdGVtcGxhdGU+In0sc2V0OmZ1bmN0aW9uKGEpe2lmKHRoaXMucGFyZW50Tm9kZSl7Uy5ib2R5LmlubmVySFRNTD1hO2ZvcihhPXRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Uy5ib2R5LmZpcnN0Q2hpbGQ7KWwuY2FsbChhLApTLmJvZHkuZmlyc3RDaGlsZCk7bS5jYWxsKHRoaXMucGFyZW50Tm9kZSxhLHRoaXMpfWVsc2UgdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBzZXQgdGhlICdvdXRlckhUTUwnIHByb3BlcnR5IG9uICdFbGVtZW50JzogVGhpcyBlbGVtZW50IGhhcyBubyBwYXJlbnQgbm9kZS4iKTt9LGNvbmZpZ3VyYWJsZTohMH0pfTtQKGEucHJvdG90eXBlKTtXKGEucHJvdG90eXBlKTthLkM9ZnVuY3Rpb24oYyl7Yz1iKGMsInRlbXBsYXRlIik7Zm9yKHZhciBkPTAsZT1jLmxlbmd0aCxmO2Q8ZSYmKGY9Y1tkXSk7ZCsrKWEuRyhmKX07ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsZnVuY3Rpb24oKXthLkMoZG9jdW1lbnQpfSk7RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgYj1nLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsidGVtcGxhdGUiPT09Yi5sb2NhbE5hbWUmJmEuRyhiKTtyZXR1cm4gYn07RE9NUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZyb21TdHJpbmc9CmZ1bmN0aW9uKCl7dmFyIGI9cS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7YS5DKGIpO3JldHVybiBifTtPYmplY3QuZGVmaW5lUHJvcGVydHkoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmIodGhpcyl9LHNldDpmdW5jdGlvbihiKXt4LnNldC5jYWxsKHRoaXMsYik7YS5DKHRoaXMpfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pO3ZhciBWZT0vWyZcdTAwQTAiXS9nLHljPS9bJlx1MDBBMDw+XS9nLHpjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICImIjpyZXR1cm4iJmFtcDsiO2Nhc2UgIjwiOnJldHVybiImbHQ7IjtjYXNlICI+IjpyZXR1cm4iJmd0OyI7Y2FzZSAnIic6cmV0dXJuIiZxdW90OyI7Y2FzZSAiXHUwMGEwIjpyZXR1cm4iJm5ic3A7In19O1Y9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGM9MDtjPGEubGVuZ3RoO2MrKyliW2FbY11dPSEwO3JldHVybiBifTt2YXIgV2U9VigiYXJlYSBiYXNlIGJyIGNvbCBjb21tYW5kIGVtYmVkIGhyIGltZyBpbnB1dCBrZXlnZW4gbGluayBtZXRhIHBhcmFtIHNvdXJjZSB0cmFjayB3YnIiLnNwbGl0KCIgIikpLApYZT1WKCJzdHlsZSBzY3JpcHQgeG1wIGlmcmFtZSBub2VtYmVkIG5vZnJhbWVzIHBsYWludGV4dCBub3NjcmlwdCIuc3BsaXQoIiAiKSksbmI9ZnVuY3Rpb24oYSxiKXsidGVtcGxhdGUiPT09YS5sb2NhbE5hbWUmJihhPWEuY29udGVudCk7Zm9yKHZhciBjPSIiLGQ9Yj9iKGEpOk0uZ2V0LmNhbGwoYSksZT0wLGY9ZC5sZW5ndGgsZztlPGYmJihnPWRbZV0pO2UrKyl7YTp7dmFyIGg9Zzt2YXIgaz1hO3ZhciBsPWI7c3dpdGNoKGgubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Zm9yKHZhciBQPWgubG9jYWxOYW1lLG09IjwiK1AsVz1oLmF0dHJpYnV0ZXMscT0wO2s9V1txXTtxKyspbSs9IiAiK2submFtZSsnPSInK2sudmFsdWUucmVwbGFjZShWZSx6YykrJyInO20rPSI+IjtoPVdlW1BdP206bStuYihoLGwpKyI8LyIrUCsiPiI7YnJlYWsgYTtjYXNlIE5vZGUuVEVYVF9OT0RFOmg9aC5kYXRhO2g9ayYmWGVbay5sb2NhbE5hbWVdP2g6aC5yZXBsYWNlKHljLHpjKTticmVhayBhOwpjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOmg9Ilx4M2MhLS0iK2guZGF0YSsiLS1ceDNlIjticmVhayBhO2RlZmF1bHQ6dGhyb3cgd2luZG93LmNvbnNvbGUuZXJyb3IoaCksRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpO319Yys9aH1yZXR1cm4gY319aWYoY3x8bWIpe2EuYT1mdW5jdGlvbihhLGIpe3ZhciBjPWYuY2FsbChhLCExKTt0aGlzLkcmJnRoaXMuRyhjKTtiJiYobC5jYWxsKGMuY29udGVudCxmLmNhbGwoYS5jb250ZW50LCEwKSksb2IoYy5jb250ZW50LGEuY29udGVudCkpO3JldHVybiBjfTt2YXIgb2I9ZnVuY3Rpb24oYyxkKXtpZihkLnF1ZXJ5U2VsZWN0b3JBbGwmJihkPWIoZCwidGVtcGxhdGUiKSwwIT09ZC5sZW5ndGgpKXtjPWIoYywidGVtcGxhdGUiKTtmb3IodmFyIGU9MCxmPWMubGVuZ3RoLGcsaDtlPGY7ZSsrKWg9ZFtlXSxnPWNbZV0sYSYmYS5HJiZhLkcoaCksbS5jYWxsKGcucGFyZW50Tm9kZSxZZS5jYWxsKGgsITApLGcpfX0sWWU9Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlPQpmdW5jdGlvbihiKXtpZighZSYmZCYmdGhpcyBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpaWYoYil2YXIgYz1aZS5jYWxsKHRoaXMub3duZXJEb2N1bWVudCx0aGlzLCEwKTtlbHNlIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2Vsc2UgdGhpcy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiYidGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWUmJnRoaXMubmFtZXNwYWNlVVJJPT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJP2M9YS5hKHRoaXMsYik6Yz1mLmNhbGwodGhpcyxiKTtiJiZvYihjLHRoaXMpO3JldHVybiBjfSxaZT1Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZT1mdW5jdGlvbihjLGQpe2Q9ZHx8ITE7aWYoInRlbXBsYXRlIj09PWMubG9jYWxOYW1lKXJldHVybiBhLmEoYyxkKTt2YXIgZT1oLmNhbGwodGhpcyxjLGQpO2lmKGQpe29iKGUsYyk7Yz1iKGUsJ3NjcmlwdDpub3QoW3R5cGVdKSxzY3JpcHRbdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCJdLHNjcmlwdFt0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiXScpOwpmb3IodmFyIGYsaz0wO2s8Yy5sZW5ndGg7aysrKXtmPWNba107ZD1nLmNhbGwoZG9jdW1lbnQsInNjcmlwdCIpO2QudGV4dENvbnRlbnQ9Zi50ZXh0Q29udGVudDtmb3IodmFyIGw9Zi5hdHRyaWJ1dGVzLFA9MCxXO1A8bC5sZW5ndGg7UCsrKVc9bFtQXSxkLnNldEF0dHJpYnV0ZShXLm5hbWUsVy52YWx1ZSk7bS5jYWxsKGYucGFyZW50Tm9kZSxkLGYpfX1yZXR1cm4gZX19YyYmKHdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50PWEpfSkoKTt2YXIga2E9c2V0VGltZW91dDtmdW5jdGlvbiBsYSgpe31mdW5jdGlvbiBtYShhLGIpe3JldHVybiBmdW5jdGlvbigpe2EuYXBwbHkoYixhcmd1bWVudHMpfX1mdW5jdGlvbiByKGEpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlByb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ldyIpO2lmKCJmdW5jdGlvbiIhPT10eXBlb2YgYSl0aHJvdyBuZXcgVHlwZUVycm9yKCJub3QgYSBmdW5jdGlvbiIpO3RoaXMudT0wO3RoaXMubWE9ITE7dGhpcy5oPXZvaWQgMDt0aGlzLkk9W107bmEoYSx0aGlzKX0KZnVuY3Rpb24gb2EoYSxiKXtmb3IoOzM9PT1hLnU7KWE9YS5oOzA9PT1hLnU/YS5JLnB1c2goYik6KGEubWE9ITAscGEoZnVuY3Rpb24oKXt2YXIgYz0xPT09YS51P2IuTmE6Yi5PYTtpZihudWxsPT09YykoMT09PWEudT9xYTpyYSkoYi5nYSxhLmgpO2Vsc2V7dHJ5e3ZhciBkPWMoYS5oKX1jYXRjaChlKXtyYShiLmdhLGUpO3JldHVybn1xYShiLmdhLGQpfX0pKX1mdW5jdGlvbiBxYShhLGIpe3RyeXtpZihiPT09YSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBIHByb21pc2UgY2Fubm90IGJlIHJlc29sdmVkIHdpdGggaXRzZWxmLiIpO2lmKGImJigib2JqZWN0Ij09PXR5cGVvZiBifHwiZnVuY3Rpb24iPT09dHlwZW9mIGIpKXt2YXIgYz1iLnRoZW47aWYoYiBpbnN0YW5jZW9mIHIpe2EudT0zO2EuaD1iO3NhKGEpO3JldHVybn1pZigiZnVuY3Rpb24iPT09dHlwZW9mIGMpe25hKG1hKGMsYiksYSk7cmV0dXJufX1hLnU9MTthLmg9YjtzYShhKX1jYXRjaChkKXtyYShhLGQpfX0KZnVuY3Rpb24gcmEoYSxiKXthLnU9MjthLmg9YjtzYShhKX1mdW5jdGlvbiBzYShhKXsyPT09YS51JiYwPT09YS5JLmxlbmd0aCYmcGEoZnVuY3Rpb24oKXthLm1hfHwidW5kZWZpbmVkIiE9PXR5cGVvZiBjb25zb2xlJiZjb25zb2xlJiZjb25zb2xlLndhcm4oIlBvc3NpYmxlIFVuaGFuZGxlZCBQcm9taXNlIFJlamVjdGlvbjoiLGEuaCl9KTtmb3IodmFyIGI9MCxjPWEuSS5sZW5ndGg7YjxjO2IrKylvYShhLGEuSVtiXSk7YS5JPW51bGx9ZnVuY3Rpb24gdGEoYSxiLGMpe3RoaXMuTmE9ImZ1bmN0aW9uIj09PXR5cGVvZiBhP2E6bnVsbDt0aGlzLk9hPSJmdW5jdGlvbiI9PT10eXBlb2YgYj9iOm51bGw7dGhpcy5nYT1jfWZ1bmN0aW9uIG5hKGEsYil7dmFyIGM9ITE7dHJ5e2EoZnVuY3Rpb24oYSl7Y3x8KGM9ITAscWEoYixhKSl9LGZ1bmN0aW9uKGEpe2N8fChjPSEwLHJhKGIsYSkpfSl9Y2F0Y2goZCl7Y3x8KGM9ITAscmEoYixkKSl9fQpyLnByb3RvdHlwZVsiY2F0Y2giXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50aGVuKG51bGwsYSl9O3IucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcihsYSk7b2EodGhpcyxuZXcgdGEoYSxiLGMpKTtyZXR1cm4gY307ci5wcm90b3R5cGVbImZpbmFsbHkiXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbnN0cnVjdG9yO3JldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oYyl7cmV0dXJuIGIucmVzb2x2ZShhKCkpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gY30pfSxmdW5jdGlvbihjKXtyZXR1cm4gYi5yZXNvbHZlKGEoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBiLnJlamVjdChjKX0pfSl9OwpmdW5jdGlvbiB3YShhKXtyZXR1cm4gbmV3IHIoZnVuY3Rpb24oYixjKXtmdW5jdGlvbiBkKGEsZyl7dHJ5e2lmKGcmJigib2JqZWN0Ij09PXR5cGVvZiBnfHwiZnVuY3Rpb24iPT09dHlwZW9mIGcpKXt2YXIgaD1nLnRoZW47aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBoKXtoLmNhbGwoZyxmdW5jdGlvbihiKXtkKGEsYil9LGMpO3JldHVybn19ZVthXT1nOzA9PT0tLWYmJmIoZSl9Y2F0Y2gobSl7YyhtKX19aWYoIWF8fCJ1bmRlZmluZWQiPT09dHlwZW9mIGEubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIlByb21pc2UuYWxsIGFjY2VwdHMgYW4gYXJyYXkiKTt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGIoW10pO2Zvcih2YXIgZj1lLmxlbmd0aCxnPTA7ZzxlLmxlbmd0aDtnKyspZChnLGVbZ10pfSl9CmZ1bmN0aW9uIHhhKGEpe3JldHVybiBhJiYib2JqZWN0Ij09PXR5cGVvZiBhJiZhLmNvbnN0cnVjdG9yPT09cj9hOm5ldyByKGZ1bmN0aW9uKGIpe2IoYSl9KX1mdW5jdGlvbiB5YShhKXtyZXR1cm4gbmV3IHIoZnVuY3Rpb24oYixjKXtjKGEpfSl9ZnVuY3Rpb24gemEoYSl7cmV0dXJuIG5ldyByKGZ1bmN0aW9uKGIsYyl7Zm9yKHZhciBkPTAsZT1hLmxlbmd0aDtkPGU7ZCsrKWFbZF0udGhlbihiLGMpfSl9dmFyIHBhPSJmdW5jdGlvbiI9PT10eXBlb2Ygc2V0SW1tZWRpYXRlJiZmdW5jdGlvbihhKXtzZXRJbW1lZGlhdGUoYSl9fHxmdW5jdGlvbihhKXtrYShhLDApfTsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KaWYoIXdpbmRvdy5Qcm9taXNlKXt3aW5kb3cuUHJvbWlzZT1yO3IucHJvdG90eXBlLnRoZW49ci5wcm90b3R5cGUudGhlbjtyLmFsbD13YTtyLnJhY2U9emE7ci5yZXNvbHZlPXhhO3IucmVqZWN0PXlhO3ZhciBBYT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIiksQmE9W107KG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPUJhLmxlbmd0aCxiPTA7YjxhO2IrKylCYVtiXSgpO0JhLnNwbGljZSgwLGEpfSkpLm9ic2VydmUoQWEse2NoYXJhY3RlckRhdGE6ITB9KTtwYT1mdW5jdGlvbihhKXtCYS5wdXNoKGEpO0FhLnRleHRDb250ZW50PTA8QWEudGV4dENvbnRlbnQubGVuZ3RoPyIiOiJhIn19OyhmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQpcmV0dXJuIG5ldyBDdXN0b21FdmVudChhLGIpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpO2MuaW5pdEN1c3RvbUV2ZW50KGEsISFiLmJ1YmJsZXMsISFiLmNhbmNlbGFibGUsYi5kZXRhaWwpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSl7aWYoTSlyZXR1cm4gYS5vd25lckRvY3VtZW50IT09ZG9jdW1lbnQ/YS5vd25lckRvY3VtZW50Om51bGw7dmFyIGI9YS5fX2ltcG9ydERvYztpZighYiYmYS5wYXJlbnROb2RlKXtiPWEucGFyZW50Tm9kZTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGIuY2xvc2VzdCliPWIuY2xvc2VzdCgibGlua1tyZWw9aW1wb3J0XSIpO2Vsc2UgZm9yKDshaChiKSYmKGI9Yi5wYXJlbnROb2RlKTspO2EuX19pbXBvcnREb2M9Yn1yZXR1cm4gYn1mdW5jdGlvbiBkKGEpe3ZhciBiPW0oZG9jdW1lbnQsImxpbmtbcmVsPWltcG9ydF06bm90KFtpbXBvcnQtZGVwZW5kZW5jeV0pIiksCmM9Yi5sZW5ndGg7Yz9xKGIsZnVuY3Rpb24oYil7cmV0dXJuIGcoYixmdW5jdGlvbigpezA9PT0tLWMmJmEoKX0pfSk6YSgpfWZ1bmN0aW9uIGUoYSl7ZnVuY3Rpb24gYigpeyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGUmJmRvY3VtZW50LmJvZHkmJihkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIixiKSxhKCkpfWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGIpO2IoKX1mdW5jdGlvbiBmKGEpe2UoZnVuY3Rpb24oKXtyZXR1cm4gZChmdW5jdGlvbigpe3JldHVybiBhJiZhKCl9KX0pfWZ1bmN0aW9uIGcoYSxiKXtpZihhLl9fbG9hZGVkKWImJmIoKTtlbHNlIGlmKCJzY3JpcHQiPT09YS5sb2NhbE5hbWUmJiFhLnNyY3x8InN0eWxlIj09PWEubG9jYWxOYW1lJiYhYS5maXJzdENoaWxkKWEuX19sb2FkZWQ9ITAsYiYmYigpO2Vsc2V7dmFyIGM9ZnVuY3Rpb24oZCl7YS5yZW1vdmVFdmVudExpc3RlbmVyKGQudHlwZSwKYyk7YS5fX2xvYWRlZD0hMDtiJiZiKCl9O2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsYyk7aGEmJiJzdHlsZSI9PT1hLmxvY2FsTmFtZXx8YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9fWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGEubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmImxpbmsiPT09YS5sb2NhbE5hbWUmJiJpbXBvcnQiPT09YS5yZWx9ZnVuY3Rpb24gaygpe3ZhciBhPXRoaXM7dGhpcy5hPXt9O3RoaXMuYj0wO3RoaXMuYz1uZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihiKXtyZXR1cm4gYS5KYShiKX0pO3RoaXMuYy5vYnNlcnZlKGRvY3VtZW50LmhlYWQse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSk7dGhpcy5sb2FkSW1wb3J0cyhkb2N1bWVudCl9ZnVuY3Rpb24gbChhKXtxKG0oYSwidGVtcGxhdGUiKSxmdW5jdGlvbihhKXtxKG0oYS5jb250ZW50LCdzY3JpcHQ6bm90KFt0eXBlXSksc2NyaXB0W3R5cGU9ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiXSxzY3JpcHRbdHlwZT0idGV4dC9qYXZhc2NyaXB0Il0sc2NyaXB0W3R5cGU9Im1vZHVsZSJdJyksCmZ1bmN0aW9uKGEpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3EoYS5hdHRyaWJ1dGVzLGZ1bmN0aW9uKGEpe3JldHVybiBiLnNldEF0dHJpYnV0ZShhLm5hbWUsYS52YWx1ZSl9KTtiLnRleHRDb250ZW50PWEudGV4dENvbnRlbnQ7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChiLGEpfSk7bChhLmNvbnRlbnQpfSl9ZnVuY3Rpb24gbShhLGIpe3JldHVybiBhLmNoaWxkTm9kZXMubGVuZ3RoP2EucXVlcnlTZWxlY3RvckFsbChiKTpVfWZ1bmN0aW9uIHEoYSxiLGMpe3ZhciBkPWE/YS5sZW5ndGg6MCxlPWM/LTE6MTtmb3IoYz1jP2QtMTowO2M8ZCYmMDw9YztjKz1lKWIoYVtjXSxjKX12YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIiksTT0iaW1wb3J0ImluIHgsVT14LnF1ZXJ5U2VsZWN0b3JBbGwoIioiKSx1YT1udWxsOyExPT09ImN1cnJlbnRTY3JpcHQiaW4gZG9jdW1lbnQmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwiY3VycmVudFNjcmlwdCIsCntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdWF8fCgiY29tcGxldGUiIT09ZG9jdW1lbnQucmVhZHlTdGF0ZT9kb2N1bWVudC5zY3JpcHRzW2RvY3VtZW50LnNjcmlwdHMubGVuZ3RoLTFdOm51bGwpfSxjb25maWd1cmFibGU6ITB9KTt2YXIgbGI9Lyh1cmxcKCkoW14pXSopKFwpKS9nLG1iPS8oQGltcG9ydFtcc10rKD8hdXJsXCgpKShbXjtdKikoOykvZyxTPS8oPGxpbmtbXj5dKikocmVsPVsnfCJdP3N0eWxlc2hlZXRbJ3wiXT9bXj5dKj4pL2csQz17RWE6ZnVuY3Rpb24oYSxiKXthLmhyZWYmJmEuc2V0QXR0cmlidXRlKCJocmVmIixDLlgoYS5nZXRBdHRyaWJ1dGUoImhyZWYiKSxiKSk7YS5zcmMmJmEuc2V0QXR0cmlidXRlKCJzcmMiLEMuWChhLmdldEF0dHJpYnV0ZSgic3JjIiksYikpO2lmKCJzdHlsZSI9PT1hLmxvY2FsTmFtZSl7dmFyIGM9Qy5xYShhLnRleHRDb250ZW50LGIsbGIpO2EudGV4dENvbnRlbnQ9Qy5xYShjLGIsbWIpfX0scWE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLnJlcGxhY2UoYywKZnVuY3Rpb24oYSxjLGQsZSl7YT1kLnJlcGxhY2UoL1siJ10vZywiIik7YiYmKGE9Qy5YKGEsYikpO3JldHVybiBjKyInIithKyInIitlfSl9LFg6ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDA9PT1DLmFhKXtDLmFhPSExO3RyeXt2YXIgYz1uZXcgVVJMKCJiIiwiaHR0cDovL2EiKTtjLnBhdGhuYW1lPSJjJTIwZCI7Qy5hYT0iaHR0cDovL2EvYyUyMGQiPT09Yy5ocmVmfWNhdGNoKHljKXt9fWlmKEMuYWEpcmV0dXJuKG5ldyBVUkwoYSxiKSkuaHJlZjtjPUMueGE7Y3x8KGM9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCJ0ZW1wIiksQy54YT1jLGMuamE9Yy5jcmVhdGVFbGVtZW50KCJiYXNlIiksYy5oZWFkLmFwcGVuZENoaWxkKGMuamEpLGMuaWE9Yy5jcmVhdGVFbGVtZW50KCJhIikpO2MuamEuaHJlZj1iO2MuaWEuaHJlZj1hO3JldHVybiBjLmlhLmhyZWZ8fGF9fSxWPXthc3luYzohMCxsb2FkOmZ1bmN0aW9uKGEsYixjKXtpZihhKWlmKGEubWF0Y2goL15kYXRhOi8pKXthPQphLnNwbGl0KCIsIik7dmFyIGQ9YVsxXTtkPS0xPGFbMF0uaW5kZXhPZigiO2Jhc2U2NCIpP2F0b2IoZCk6ZGVjb2RlVVJJQ29tcG9uZW50KGQpO2IoZCl9ZWxzZXt2YXIgZT1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vcGVuKCJHRVQiLGEsVi5hc3luYyk7ZS5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT1lLnJlc3BvbnNlVVJMfHxlLmdldFJlc3BvbnNlSGVhZGVyKCJMb2NhdGlvbiIpO2EmJjA9PT1hLmluZGV4T2YoIi8iKSYmKGE9KGxvY2F0aW9uLm9yaWdpbnx8bG9jYXRpb24ucHJvdG9jb2wrIi8vIitsb2NhdGlvbi5ob3N0KSthKTt2YXIgZD1lLnJlc3BvbnNlfHxlLnJlc3BvbnNlVGV4dDszMDQ9PT1lLnN0YXR1c3x8MD09PWUuc3RhdHVzfHwyMDA8PWUuc3RhdHVzJiYzMDA+ZS5zdGF0dXM/YihkLGEpOmMoZCl9O2Uuc2VuZCgpfWVsc2UgYygiZXJyb3I6IGhyZWYgbXVzdCBiZSBzcGVjaWZpZWQiKX19LGhhPS9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHwvRWRnZVwvXGQuL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKay5wcm90b3R5cGUubG9hZEltcG9ydHM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczthPW0oYSwibGlua1tyZWw9aW1wb3J0XSIpO3EoYSxmdW5jdGlvbihhKXtyZXR1cm4gYi5nKGEpfSl9O2sucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPWEuaHJlZjtpZih2b2lkIDAhPT10aGlzLmFbY10pe3ZhciBkPXRoaXMuYVtjXTtkJiZkLl9fbG9hZGVkJiYoYS5fX2ltcG9ydD1kLHRoaXMuZihhKSl9ZWxzZSB0aGlzLmIrKyx0aGlzLmFbY109InBlbmRpbmciLFYubG9hZChjLGZ1bmN0aW9uKGEsZCl7YT1iLkthKGEsZHx8Yyk7Yi5hW2NdPWE7Yi5iLS07Yi5sb2FkSW1wb3J0cyhhKTtiLmwoKX0sZnVuY3Rpb24oKXtiLmFbY109bnVsbDtiLmItLTtiLmwoKX0pfTtrLnByb3RvdHlwZS5LYT1mdW5jdGlvbihhLGIpe2lmKCFhKXJldHVybiBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aGEmJihhPWEucmVwbGFjZShTLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4tMT09PQphLmluZGV4T2YoInR5cGU9Iik/YisiIHR5cGU9aW1wb3J0LWRpc2FibGUgIitjOmF9KSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtjLmlubmVySFRNTD1hO2lmKGMuY29udGVudClhPWMuY29udGVudCxsKGEpO2Vsc2UgZm9yKGE9ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2MuZmlyc3RDaGlsZDspYS5hcHBlbmRDaGlsZChjLmZpcnN0Q2hpbGQpO2lmKGM9YS5xdWVyeVNlbGVjdG9yKCJiYXNlIikpYj1DLlgoYy5nZXRBdHRyaWJ1dGUoImhyZWYiKSxiKSxjLnJlbW92ZUF0dHJpYnV0ZSgiaHJlZiIpO2M9bShhLCdsaW5rW3JlbD1pbXBvcnRdLGxpbmtbcmVsPXN0eWxlc2hlZXRdW2hyZWZdW3R5cGU9aW1wb3J0LWRpc2FibGVdLHN0eWxlOm5vdChbdHlwZV0pLGxpbmtbcmVsPXN0eWxlc2hlZXRdW2hyZWZdOm5vdChbdHlwZV0pLHNjcmlwdDpub3QoW3R5cGVdKSxzY3JpcHRbdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCJdLHNjcmlwdFt0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiXSxzY3JpcHRbdHlwZT0ibW9kdWxlIl0nKTsKdmFyIGQ9MDtxKGMsZnVuY3Rpb24oYSl7ZyhhKTtDLkVhKGEsYik7YS5zZXRBdHRyaWJ1dGUoImltcG9ydC1kZXBlbmRlbmN5IiwiIik7aWYoInNjcmlwdCI9PT1hLmxvY2FsTmFtZSYmIWEuc3JjJiZhLnRleHRDb250ZW50KXtpZigibW9kdWxlIj09PWEudHlwZSl0aHJvdyBFcnJvcigiSW5saW5lIG1vZHVsZSBzY3JpcHRzIGFyZSBub3Qgc3VwcG9ydGVkIGluIEhUTUwgSW1wb3J0cy4iKTthLnNldEF0dHJpYnV0ZSgic3JjIiwiZGF0YTp0ZXh0L2phdmFzY3JpcHQ7Y2hhcnNldD11dGYtOCwiK2VuY29kZVVSSUNvbXBvbmVudChhLnRleHRDb250ZW50KygiXG4vLyMgc291cmNlVVJMPSIrYisoZD8iLSIrZDoiIikrIi5qc1xuIikpKTthLnRleHRDb250ZW50PSIiO2QrK319KTtyZXR1cm4gYX07ay5wcm90b3R5cGUubD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7aWYoIXRoaXMuYil7dGhpcy5jLmRpc2Nvbm5lY3QoKTt0aGlzLmZsYXR0ZW4oZG9jdW1lbnQpO3ZhciBiPSExLGM9ITEsZD1mdW5jdGlvbigpe2MmJgpiJiYoYS5sb2FkSW1wb3J0cyhkb2N1bWVudCksYS5ifHwoYS5jLm9ic2VydmUoZG9jdW1lbnQuaGVhZCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxhLmRhKCkpKX07dGhpcy5NYShmdW5jdGlvbigpe2M9ITA7ZCgpfSk7dGhpcy5MYShmdW5jdGlvbigpe2I9ITA7ZCgpfSl9fTtrLnByb3RvdHlwZS5mbGF0dGVuPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7YT1tKGEsImxpbmtbcmVsPWltcG9ydF0iKTtxKGEsZnVuY3Rpb24oYSl7dmFyIGM9Yi5hW2EuaHJlZl07KGEuX19pbXBvcnQ9YykmJmMubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJihiLmFbYS5ocmVmXT1hLGEucmVhZHlTdGF0ZT0ibG9hZGluZyIsYS5fX2ltcG9ydD1hLGIuZmxhdHRlbihjKSxhLmFwcGVuZENoaWxkKGMpKX0pfTtrLnByb3RvdHlwZS5MYT1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGUpe2lmKGU8ZCl7dmFyIGY9Y1tlXSxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2YucmVtb3ZlQXR0cmlidXRlKCJpbXBvcnQtZGVwZW5kZW5jeSIpOwpxKGYuYXR0cmlidXRlcyxmdW5jdGlvbihhKXtyZXR1cm4gaC5zZXRBdHRyaWJ1dGUoYS5uYW1lLGEudmFsdWUpfSk7dWE9aDtmLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsZik7ZyhoLGZ1bmN0aW9uKCl7dWE9bnVsbDtiKGUrMSl9KX1lbHNlIGEoKX12YXIgYz1tKGRvY3VtZW50LCJzY3JpcHRbaW1wb3J0LWRlcGVuZGVuY3ldIiksZD1jLmxlbmd0aDtiKDApfTtrLnByb3RvdHlwZS5NYT1mdW5jdGlvbihhKXt2YXIgYj1tKGRvY3VtZW50LCJzdHlsZVtpbXBvcnQtZGVwZW5kZW5jeV0sbGlua1tyZWw9c3R5bGVzaGVldF1baW1wb3J0LWRlcGVuZGVuY3ldIiksZD1iLmxlbmd0aDtpZihkKXt2YXIgZT1oYSYmISFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJsaW5rW3JlbD1zdHlsZXNoZWV0XVtocmVmXVt0eXBlPWltcG9ydC1kaXNhYmxlXSIpO3EoYixmdW5jdGlvbihiKXtnKGIsZnVuY3Rpb24oKXtiLnJlbW92ZUF0dHJpYnV0ZSgiaW1wb3J0LWRlcGVuZGVuY3kiKTswPT09LS1kJiYKYSgpfSk7aWYoZSYmYi5wYXJlbnROb2RlIT09ZG9jdW1lbnQuaGVhZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChiLmxvY2FsTmFtZSk7Zi5fX2FwcGxpZWRFbGVtZW50PWI7Zi5zZXRBdHRyaWJ1dGUoInR5cGUiLCJpbXBvcnQtcGxhY2Vob2xkZXIiKTtiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGYsYi5uZXh0U2libGluZyk7Zm9yKGY9YyhiKTtmJiZjKGYpOylmPWMoZik7Zi5wYXJlbnROb2RlIT09ZG9jdW1lbnQuaGVhZCYmKGY9bnVsbCk7ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYixmKTtiLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpfX0pfWVsc2UgYSgpfTtrLnByb3RvdHlwZS5kYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1tKGRvY3VtZW50LCJsaW5rW3JlbD1pbXBvcnRdIik7cShiLGZ1bmN0aW9uKGIpe3JldHVybiBhLmYoYil9LCEwKX07ay5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXthLl9fbG9hZGVkfHwoYS5fX2xvYWRlZD0hMCxhLmltcG9ydCYmKGEuaW1wb3J0LnJlYWR5U3RhdGU9CiJjb21wbGV0ZSIpLGEuZGlzcGF0Y2hFdmVudChiKGEuaW1wb3J0PyJsb2FkIjoiZXJyb3IiLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITEsZGV0YWlsOnZvaWQgMH0pKSl9O2sucHJvdG90eXBlLkphPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7cShhLGZ1bmN0aW9uKGEpe3JldHVybiBxKGEuYWRkZWROb2RlcyxmdW5jdGlvbihhKXthJiZhLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJihoKGEpP2IuZyhhKTpiLmxvYWRJbXBvcnRzKGEpKX0pfSl9O3ZhciB2YT1udWxsO2lmKE0peD1tKGRvY3VtZW50LCJsaW5rW3JlbD1pbXBvcnRdIikscSh4LGZ1bmN0aW9uKGEpe2EuaW1wb3J0JiYibG9hZGluZyI9PT1hLmltcG9ydC5yZWFkeVN0YXRlfHwoYS5fX2xvYWRlZD0hMCl9KSx4PWZ1bmN0aW9uKGEpe2E9YS50YXJnZXQ7aChhKSYmKGEuX19sb2FkZWQ9ITApfSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIix4LCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCngsITApO2Vsc2V7dmFyIFg9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihOb2RlLnByb3RvdHlwZSwiYmFzZVVSSSIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSgoIVh8fFguY29uZmlndXJhYmxlP05vZGU6RWxlbWVudCkucHJvdG90eXBlLCJiYXNlVVJJIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIGE9aCh0aGlzKT90aGlzOmModGhpcyk7cmV0dXJuIGE/YS5ocmVmOlgmJlguZ2V0P1guZ2V0LmNhbGwodGhpcyk6KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImJhc2UiKXx8d2luZG93LmxvY2F0aW9uKS5ocmVmfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MTGlua0VsZW1lbnQucHJvdG90eXBlLCJpbXBvcnQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2ltcG9ydHx8bnVsbH0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITB9KTtlKGZ1bmN0aW9uKCl7dmE9bmV3IGt9KX1mKGZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYigiSFRNTEltcG9ydHNMb2FkZWQiLAp7Y2FuY2VsYWJsZTohMCxidWJibGVzOiEwLGRldGFpbDp2b2lkIDB9KSl9KTthLnVzZU5hdGl2ZT1NO2Eud2hlblJlYWR5PWY7YS5pbXBvcnRGb3JFbGVtZW50PWM7YS5sb2FkSW1wb3J0cz1mdW5jdGlvbihhKXt2YSYmdmEubG9hZEltcG9ydHMoYSl9fSkod2luZG93LkhUTUxJbXBvcnRzPXdpbmRvdy5IVE1MSW1wb3J0c3x8e30pOy8qCgogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwp3aW5kb3cuV2ViQ29tcG9uZW50cz13aW5kb3cuV2ViQ29tcG9uZW50c3x8e2ZsYWdzOnt9fTt2YXIgQ2E9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyYyo9IndlYmNvbXBvbmVudHMtbGl0ZS5qcyJdJyksRGE9L3djLSguKykvLHQ9e307aWYoIXQubm9PcHRzKXtsb2NhdGlvbi5zZWFyY2guc2xpY2UoMSkuc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2E9YS5zcGxpdCgiPSIpO3ZhciBiO2FbMF0mJihiPWFbMF0ubWF0Y2goRGEpKSYmKHRbYlsxXV09YVsxXXx8ITApfSk7aWYoQ2EpZm9yKHZhciBFYT0wLEZhPXZvaWQgMDtGYT1DYS5hdHRyaWJ1dGVzW0VhXTtFYSsrKSJzcmMiIT09RmEubmFtZSYmKHRbRmEubmFtZV09RmEudmFsdWV8fCEwKTtpZih0LmxvZyYmdC5sb2cuc3BsaXQpe3ZhciBHYT10LmxvZy5zcGxpdCgiLCIpO3QubG9nPXt9O0dhLmZvckVhY2goZnVuY3Rpb24oYSl7dC5sb2dbYV09ITB9KX1lbHNlIHQubG9nPXt9fQp3aW5kb3cuV2ViQ29tcG9uZW50cy5mbGFncz10O3ZhciBIYT10LnNoYWR5ZG9tO0hhJiYod2luZG93LlNoYWR5RE9NPXdpbmRvdy5TaGFkeURPTXx8e30sd2luZG93LlNoYWR5RE9NLmZvcmNlPUhhKTt2YXIgSWE9dC5yZWdpc3Rlcnx8dC5jZTtJYSYmd2luZG93LmN1c3RvbUVsZW1lbnRzJiYod2luZG93LmN1c3RvbUVsZW1lbnRzLmZvcmNlUG9seWZpbGw9SWEpOy8qCgpDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0ClRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0ClRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dApDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwpzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwpmdW5jdGlvbiBKYSgpe3RoaXMucGE9dGhpcy5yb290PW51bGw7dGhpcy5UPSExO3RoaXMuRD10aGlzLlA9dGhpcy5jYT10aGlzLmFzc2lnbmVkU2xvdD10aGlzLmFzc2lnbmVkTm9kZXM9dGhpcy5IPW51bGw7dGhpcy5jaGlsZE5vZGVzPXRoaXMubmV4dFNpYmxpbmc9dGhpcy5wcmV2aW91c1NpYmxpbmc9dGhpcy5sYXN0Q2hpbGQ9dGhpcy5maXJzdENoaWxkPXRoaXMucGFyZW50Tm9kZT10aGlzLks9dm9pZCAwO3RoaXMua2E9dGhpcy5sYT0hMTt0aGlzLk89e319SmEucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt9fTtmdW5jdGlvbiB1KGEpe2EuX19zaGFkeXx8KGEuX19zaGFkeT1uZXcgSmEpO3JldHVybiBhLl9fc2hhZHl9ZnVuY3Rpb24gdihhKXtyZXR1cm4gYSYmYS5fX3NoYWR5fTt2YXIgdz13aW5kb3cuU2hhZHlET018fHt9O3cuR2E9ISghRWxlbWVudC5wcm90b3R5cGUuYXR0YWNoU2hhZG93fHwhTm9kZS5wcm90b3R5cGUuZ2V0Um9vdE5vZGUpO3ZhciBLYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLCJmaXJzdENoaWxkIik7dy5tPSEhKEthJiZLYS5jb25maWd1cmFibGUmJkthLmdldCk7dy5lYT13LmZvcmNlfHwhdy5HYTt3Lko9dy5ub1BhdGNofHwhMTt3Lm9hPXcucHJlZmVyUGVyZm9ybWFuY2U7ZnVuY3Rpb24geShhKXtyZXR1cm4oYT12KGEpKSYmdm9pZCAwIT09YS5maXJzdENoaWxkfWZ1bmN0aW9uIHooYSl7cmV0dXJuIlNoYWR5Um9vdCI9PT1hLnphfWZ1bmN0aW9uIExhKGEpe3JldHVybihhPShhPXYoYSkpJiZhLnJvb3QpJiZNYShhKX0KdmFyIE5hPUVsZW1lbnQucHJvdG90eXBlLE9hPU5hLm1hdGNoZXN8fE5hLm1hdGNoZXNTZWxlY3Rvcnx8TmEubW96TWF0Y2hlc1NlbGVjdG9yfHxOYS5tc01hdGNoZXNTZWxlY3Rvcnx8TmEub01hdGNoZXNTZWxlY3Rvcnx8TmEud2Via2l0TWF0Y2hlc1NlbGVjdG9yLFBhPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSxRYT0wLFJhPVtdOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbigpe2Zvcig7UmEubGVuZ3RoOyl0cnl7UmEuc2hpZnQoKSgpfWNhdGNoKGEpe3Rocm93IFBhLnRleHRDb250ZW50PVFhKyssYTt9fSkpLm9ic2VydmUoUGEse2NoYXJhY3RlckRhdGE6ITB9KTtmdW5jdGlvbiBTYShhKXtSYS5wdXNoKGEpO1BhLnRleHRDb250ZW50PVFhKyt9dmFyIFRhPSEhZG9jdW1lbnQuY29udGFpbnM7ZnVuY3Rpb24gVWEoYSxiKXtmb3IoO2I7KXtpZihiPT1hKXJldHVybiEwO2I9Yi5fX3NoYWR5X3BhcmVudE5vZGV9cmV0dXJuITF9CmZ1bmN0aW9uIFZhKGEpe2Zvcih2YXIgYj1hLmxlbmd0aC0xOzA8PWI7Yi0tKXt2YXIgYz1hW2JdLGQ9Yy5nZXRBdHRyaWJ1dGUoImlkIil8fGMuZ2V0QXR0cmlidXRlKCJuYW1lIik7ZCYmImxlbmd0aCIhPT1kJiZpc05hTihkKSYmKGFbZF09Yyl9YS5pdGVtPWZ1bmN0aW9uKGIpe3JldHVybiBhW2JdfTthLm5hbWVkSXRlbT1mdW5jdGlvbihiKXtpZigibGVuZ3RoIiE9PWImJmlzTmFOKGIpJiZhW2JdKXJldHVybiBhW2JdO2Zvcih2YXIgYz1pYShhKSxkPWMubmV4dCgpOyFkLmRvbmU7ZD1jLm5leHQoKSlpZihkPWQudmFsdWUsKGQuZ2V0QXR0cmlidXRlKCJpZCIpfHxkLmdldEF0dHJpYnV0ZSgibmFtZSIpKT09YilyZXR1cm4gZDtyZXR1cm4gbnVsbH07cmV0dXJuIGF9CmZ1bmN0aW9uIEEoYSxiLGMsZCl7Yz12b2lkIDA9PT1jPyIiOmM7Zm9yKHZhciBlIGluIGIpe3ZhciBmPWJbZV07aWYoIShkJiYwPD1kLmluZGV4T2YoZSkpKXtmLmNvbmZpZ3VyYWJsZT0hMDt2YXIgZz1jK2U7aWYoZi52YWx1ZSlhW2ddPWYudmFsdWU7ZWxzZSB0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZyxmKX1jYXRjaChoKXt9fX19ZnVuY3Rpb24gQihhKXt2YXIgYj17fTtPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2JbY109T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLGMpfSk7cmV0dXJuIGJ9O3ZhciBXYT1bXSxYYTtmdW5jdGlvbiBZYShhKXtYYXx8KFhhPSEwLFNhKFphKSk7V2EucHVzaChhKX1mdW5jdGlvbiBaYSgpe1hhPSExO2Zvcih2YXIgYT0hIVdhLmxlbmd0aDtXYS5sZW5ndGg7KVdhLnNoaWZ0KCkoKTtyZXR1cm4gYX1aYS5saXN0PVdhO2Z1bmN0aW9uICRhKCl7dGhpcy5hPSExO3RoaXMuYWRkZWROb2Rlcz1bXTt0aGlzLnJlbW92ZWROb2Rlcz1bXTt0aGlzLlM9bmV3IFNldH1mdW5jdGlvbiBhYihhKXthLmF8fChhLmE9ITAsU2EoZnVuY3Rpb24oKXthLmZsdXNoKCl9KSl9JGEucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7aWYodGhpcy5hKXt0aGlzLmE9ITE7dmFyIGE9dGhpcy50YWtlUmVjb3JkcygpO2EubGVuZ3RoJiZ0aGlzLlMuZm9yRWFjaChmdW5jdGlvbihiKXtiKGEpfSl9fTskYS5wcm90b3R5cGUudGFrZVJlY29yZHM9ZnVuY3Rpb24oKXtpZih0aGlzLmFkZGVkTm9kZXMubGVuZ3RofHx0aGlzLnJlbW92ZWROb2Rlcy5sZW5ndGgpe3ZhciBhPVt7YWRkZWROb2Rlczp0aGlzLmFkZGVkTm9kZXMscmVtb3ZlZE5vZGVzOnRoaXMucmVtb3ZlZE5vZGVzfV07dGhpcy5hZGRlZE5vZGVzPVtdO3RoaXMucmVtb3ZlZE5vZGVzPVtdO3JldHVybiBhfXJldHVybltdfTsKZnVuY3Rpb24gYmIoYSxiKXt2YXIgYz11KGEpO2MuSHx8KGMuSD1uZXcgJGEpO2MuSC5TLmFkZChiKTt2YXIgZD1jLkg7cmV0dXJue3lhOmIsRjpkLEFhOmEsdGFrZVJlY29yZHM6ZnVuY3Rpb24oKXtyZXR1cm4gZC50YWtlUmVjb3JkcygpfX19ZnVuY3Rpb24gY2IoYSl7dmFyIGI9YSYmYS5GO2ImJihiLlMuZGVsZXRlKGEueWEpLGIuUy5zaXplfHwodShhLkFhKS5IPW51bGwpKX0KZnVuY3Rpb24gZGIoYSxiKXt2YXIgYz1iLmdldFJvb3ROb2RlKCk7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEpe3ZhciBiPWM9PT1hLnRhcmdldC5nZXRSb290Tm9kZSgpO2lmKGImJmEuYWRkZWROb2Rlcyl7aWYoYj1BcnJheS5mcm9tKGEuYWRkZWROb2RlcykuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBjPT09YS5nZXRSb290Tm9kZSgpfSksYi5sZW5ndGgpcmV0dXJuIGE9T2JqZWN0LmNyZWF0ZShhKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiYWRkZWROb2RlcyIse3ZhbHVlOmIsY29uZmlndXJhYmxlOiEwfSksYX1lbHNlIGlmKGIpcmV0dXJuIGF9KS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGF9KX07dmFyIGViPS9bJlx1MDBBMCJdL2csZmI9L1smXHUwMEEwPD5dL2c7ZnVuY3Rpb24gZ2IoYSl7c3dpdGNoKGEpe2Nhc2UgIiYiOnJldHVybiImYW1wOyI7Y2FzZSAiPCI6cmV0dXJuIiZsdDsiO2Nhc2UgIj4iOnJldHVybiImZ3Q7IjtjYXNlICciJzpyZXR1cm4iJnF1b3Q7IjtjYXNlICJcdTAwYTAiOnJldHVybiImbmJzcDsifX1mdW5jdGlvbiBoYihhKXtmb3IodmFyIGI9e30sYz0wO2M8YS5sZW5ndGg7YysrKWJbYVtjXV09ITA7cmV0dXJuIGJ9dmFyIGliPWhiKCJhcmVhIGJhc2UgYnIgY29sIGNvbW1hbmQgZW1iZWQgaHIgaW1nIGlucHV0IGtleWdlbiBsaW5rIG1ldGEgcGFyYW0gc291cmNlIHRyYWNrIHdiciIuc3BsaXQoIiAiKSksamI9aGIoInN0eWxlIHNjcmlwdCB4bXAgaWZyYW1lIG5vZW1iZWQgbm9mcmFtZXMgcGxhaW50ZXh0IG5vc2NyaXB0Ii5zcGxpdCgiICIpKTsKZnVuY3Rpb24ga2IoYSxiKXsidGVtcGxhdGUiPT09YS5sb2NhbE5hbWUmJihhPWEuY29udGVudCk7Zm9yKHZhciBjPSIiLGQ9Yj9iKGEpOmEuY2hpbGROb2RlcyxlPTAsZj1kLmxlbmd0aCxnPXZvaWQgMDtlPGYmJihnPWRbZV0pO2UrKyl7YTp7dmFyIGg9Zzt2YXIgaz1hLGw9Yjtzd2l0Y2goaC5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTprPWgubG9jYWxOYW1lO2Zvcih2YXIgbT0iPCIrayxxPWguYXR0cmlidXRlcyx4PTAsTTtNPXFbeF07eCsrKW0rPSIgIitNLm5hbWUrJz0iJytNLnZhbHVlLnJlcGxhY2UoZWIsZ2IpKyciJzttKz0iPiI7aD1pYltrXT9tOm0ra2IoaCxsKSsiPC8iK2srIj4iO2JyZWFrIGE7Y2FzZSBOb2RlLlRFWFRfTk9ERTpoPWguZGF0YTtoPWsmJmpiW2subG9jYWxOYW1lXT9oOmgucmVwbGFjZShmYixnYik7YnJlYWsgYTtjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOmg9Ilx4M2MhLS0iK2guZGF0YSsiLS1ceDNlIjticmVhayBhO2RlZmF1bHQ6dGhyb3cgd2luZG93LmNvbnNvbGUuZXJyb3IoaCksCkVycm9yKCJub3QgaW1wbGVtZW50ZWQiKTt9fWMrPWh9cmV0dXJuIGN9O3ZhciBwYj13Lm0scWI9e3F1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfcXVlcnlTZWxlY3RvcihhKX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9xdWVyeVNlbGVjdG9yQWxsKGEpfX0scmI9e307ZnVuY3Rpb24gc2IoYSl7cmJbYV09ZnVuY3Rpb24oYil7cmV0dXJuIGJbIl9fc2hhZHlfbmF0aXZlXyIrYV19fWZ1bmN0aW9uIHRiKGEsYil7QShhLGIsIl9fc2hhZHlfbmF0aXZlXyIpO2Zvcih2YXIgYyBpbiBiKXNiKGMpfWZ1bmN0aW9uIEQoYSxiKXtiPXZvaWQgMD09PWI/W106Yjtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXSxlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYSxkKTtlJiYoT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIl9fc2hhZHlfbmF0aXZlXyIrZCxlKSxlLnZhbHVlP3FiW2RdfHwocWJbZF09ZS52YWx1ZSk6c2IoZCkpfX0KdmFyIEU9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCxOb2RlRmlsdGVyLlNIT1dfQUxMLG51bGwsITEpLEY9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCxOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCxudWxsLCExKSx1Yj1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoImluZXJ0Iik7ZnVuY3Rpb24gdmIoYSl7Zm9yKHZhciBiO2I9YS5fX3NoYWR5X25hdGl2ZV9maXJzdENoaWxkOylhLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGIpfXZhciB3Yj1bImZpcnN0RWxlbWVudENoaWxkIiwibGFzdEVsZW1lbnRDaGlsZCIsImNoaWxkcmVuIiwiY2hpbGRFbGVtZW50Q291bnQiXSx4Yj1bInF1ZXJ5U2VsZWN0b3IiLCJxdWVyeVNlbGVjdG9yQWxsIl07CmZ1bmN0aW9uIHliKCl7dmFyIGE9WyJkaXNwYXRjaEV2ZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiXTt3aW5kb3cuRXZlbnRUYXJnZXQ/RCh3aW5kb3cuRXZlbnRUYXJnZXQucHJvdG90eXBlLGEpOihEKE5vZGUucHJvdG90eXBlLGEpLEQoV2luZG93LnByb3RvdHlwZSxhKSk7cGI/RChOb2RlLnByb3RvdHlwZSwicGFyZW50Tm9kZSBmaXJzdENoaWxkIGxhc3RDaGlsZCBwcmV2aW91c1NpYmxpbmcgbmV4dFNpYmxpbmcgY2hpbGROb2RlcyBwYXJlbnRFbGVtZW50IHRleHRDb250ZW50Ii5zcGxpdCgiICIpKTp0YihOb2RlLnByb3RvdHlwZSx7cGFyZW50Tm9kZTp7Z2V0OmZ1bmN0aW9uKCl7RS5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBFLnBhcmVudE5vZGUoKX19LGZpcnN0Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRS5maXJzdENoaWxkKCl9fSxsYXN0Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9CnRoaXM7cmV0dXJuIEUubGFzdENoaWxkKCl9fSxwcmV2aW91c1NpYmxpbmc6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRS5wcmV2aW91c1NpYmxpbmcoKX19LG5leHRTaWJsaW5nOntnZXQ6ZnVuY3Rpb24oKXtFLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEUubmV4dFNpYmxpbmcoKX19LGNoaWxkTm9kZXM6e2dldDpmdW5jdGlvbigpe3ZhciBhPVtdO0UuY3VycmVudE5vZGU9dGhpcztmb3IodmFyIGM9RS5maXJzdENoaWxkKCk7YzspYS5wdXNoKGMpLGM9RS5uZXh0U2libGluZygpO3JldHVybiBhfX0scGFyZW50RWxlbWVudDp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLnBhcmVudE5vZGUoKX19LHRleHRDb250ZW50OntnZXQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpmb3IodmFyIGE9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcih0aGlzLApOb2RlRmlsdGVyLlNIT1dfVEVYVCxudWxsLCExKSxjPSIiLGQ7ZD1hLm5leHROb2RlKCk7KWMrPWQubm9kZVZhbHVlO3JldHVybiBjO2RlZmF1bHQ6cmV0dXJuIHRoaXMubm9kZVZhbHVlfX0sc2V0OmZ1bmN0aW9uKGEpe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGF8fG51bGw9PT1hKWE9IiI7c3dpdGNoKHRoaXMubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Y2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6dmIodGhpcyk7KDA8YS5sZW5ndGh8fHRoaXMubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSkmJnRoaXMuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGEpLHZvaWQgMCk7YnJlYWs7ZGVmYXVsdDp0aGlzLm5vZGVWYWx1ZT1hfX19fSk7RChOb2RlLnByb3RvdHlwZSwiYXBwZW5kQ2hpbGQgaW5zZXJ0QmVmb3JlIHJlbW92ZUNoaWxkIHJlcGxhY2VDaGlsZCBjbG9uZU5vZGUgY29udGFpbnMiLnNwbGl0KCIgIikpOwphPXtmaXJzdEVsZW1lbnRDaGlsZDp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLmZpcnN0Q2hpbGQoKX19LGxhc3RFbGVtZW50Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0YuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRi5sYXN0Q2hpbGQoKX19LGNoaWxkcmVuOntnZXQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtGLmN1cnJlbnROb2RlPXRoaXM7Zm9yKHZhciBjPUYuZmlyc3RDaGlsZCgpO2M7KWEucHVzaChjKSxjPUYubmV4dFNpYmxpbmcoKTtyZXR1cm4gVmEoYSl9fSxjaGlsZEVsZW1lbnRDb3VudDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4/dGhpcy5jaGlsZHJlbi5sZW5ndGg6MH19fTtwYj8oRChFbGVtZW50LnByb3RvdHlwZSx3YiksRChFbGVtZW50LnByb3RvdHlwZSxbInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJuZXh0RWxlbWVudFNpYmxpbmciLCJpbm5lckhUTUwiXSksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsCiJjaGlsZHJlbiIpJiZEKEhUTUxFbGVtZW50LnByb3RvdHlwZSxbImNoaWxkcmVuIl0pLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiKSYmRChIVE1MRWxlbWVudC5wcm90b3R5cGUsWyJpbm5lckhUTUwiXSkpOih0YihFbGVtZW50LnByb3RvdHlwZSxhKSx0YihFbGVtZW50LnByb3RvdHlwZSx7cHJldmlvdXNFbGVtZW50U2libGluZzp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLnByZXZpb3VzU2libGluZygpfX0sbmV4dEVsZW1lbnRTaWJsaW5nOntnZXQ6ZnVuY3Rpb24oKXtGLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEYubmV4dFNpYmxpbmcoKX19LGlubmVySFRNTDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGtiKHRoaXMsZnVuY3Rpb24oYSl7cmV0dXJuIGEuX19zaGFkeV9uYXRpdmVfY2hpbGROb2Rlc30pfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9InRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lPwp0aGlzLmNvbnRlbnQ6dGhpczt2YihiKTt2YXIgZD10aGlzLmxvY2FsTmFtZXx8ImRpdiI7ZD10aGlzLm5hbWVzcGFjZVVSSSYmdGhpcy5uYW1lc3BhY2VVUkkhPT11Yi5uYW1lc3BhY2VVUkk/dWIuY3JlYXRlRWxlbWVudE5TKHRoaXMubmFtZXNwYWNlVVJJLGQpOnViLmNyZWF0ZUVsZW1lbnQoZCk7ZC5pbm5lckhUTUw9YTtmb3IoYT0idGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWU/ZC5jb250ZW50OmQ7ZD1hLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGQ7KWIuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGQsdm9pZCAwKX19fSkpO0QoRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUgaGFzQXR0cmlidXRlIHJlbW92ZUF0dHJpYnV0ZSBmb2N1cyBibHVyIi5zcGxpdCgiICIpKTtEKEVsZW1lbnQucHJvdG90eXBlLHhiKTtEKEhUTUxFbGVtZW50LnByb3RvdHlwZSxbImZvY3VzIiwiYmx1ciIsImNvbnRhaW5zIl0pO3BiJiZEKEhUTUxFbGVtZW50LnByb3RvdHlwZSwKWyJwYXJlbnRFbGVtZW50IiwiY2hpbGRyZW4iLCJpbm5lckhUTUwiXSk7d2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQmJkQod2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQucHJvdG90eXBlLFsiaW5uZXJIVE1MIl0pO3BiP0QoRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUsd2IpOnRiKERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLGEpO0QoRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUseGIpO3BiPyhEKERvY3VtZW50LnByb3RvdHlwZSx3YiksRChEb2N1bWVudC5wcm90b3R5cGUsWyJhY3RpdmVFbGVtZW50Il0pKTp0YihEb2N1bWVudC5wcm90b3R5cGUsYSk7RChEb2N1bWVudC5wcm90b3R5cGUsWyJpbXBvcnROb2RlIiwiZ2V0RWxlbWVudEJ5SWQiXSk7RChEb2N1bWVudC5wcm90b3R5cGUseGIpfTt2YXIgemI9Qih7Z2V0IGNoaWxkTm9kZXMoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2NoaWxkTm9kZXN9LGdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9maXJzdENoaWxkfSxnZXQgbGFzdENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9sYXN0Q2hpbGR9LGdldCB0ZXh0Q29udGVudCgpe3JldHVybiB0aGlzLl9fc2hhZHlfdGV4dENvbnRlbnR9LHNldCB0ZXh0Q29udGVudChhKXt0aGlzLl9fc2hhZHlfdGV4dENvbnRlbnQ9YX0sZ2V0IGNoaWxkRWxlbWVudENvdW50KCl7cmV0dXJuIHRoaXMuX19zaGFkeV9jaGlsZEVsZW1lbnRDb3VudH0sZ2V0IGNoaWxkcmVuKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9jaGlsZHJlbn0sZ2V0IGZpcnN0RWxlbWVudENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9maXJzdEVsZW1lbnRDaGlsZH0sZ2V0IGxhc3RFbGVtZW50Q2hpbGQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2xhc3RFbGVtZW50Q2hpbGR9LGdldCBpbm5lckhUTUwoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2lubmVySFRNTH0sCnNldCBpbm5lckhUTUwoYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9pbm5lckhUTUw9YX0sZ2V0IHNoYWRvd1Jvb3QoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3NoYWRvd1Jvb3R9fSksQWI9Qih7Z2V0IHBhcmVudEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3BhcmVudEVsZW1lbnR9LGdldCBwYXJlbnROb2RlKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9wYXJlbnROb2RlfSxnZXQgbmV4dFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25leHRTaWJsaW5nfSxnZXQgcHJldmlvdXNTaWJsaW5nKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9wcmV2aW91c1NpYmxpbmd9LGdldCBuZXh0RWxlbWVudFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25leHRFbGVtZW50U2libGluZ30sZ2V0IHByZXZpb3VzRWxlbWVudFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3ByZXZpb3VzRWxlbWVudFNpYmxpbmd9LGdldCBjbGFzc05hbWUoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2NsYXNzTmFtZX0sCnNldCBjbGFzc05hbWUoYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9jbGFzc05hbWU9YX19KSxCYjtmb3IoQmIgaW4gemIpemJbQmJdLmVudW1lcmFibGU9ITE7Zm9yKHZhciBDYiBpbiBBYilBYltDYl0uZW51bWVyYWJsZT0hMTt2YXIgRGI9dy5tfHx3LkosRWI9RGI/ZnVuY3Rpb24oKXt9OmZ1bmN0aW9uKGEpe3ZhciBiPXUoYSk7Yi5sYXx8KGIubGE9ITAsQShhLEFiKSl9LEZiPURiP2Z1bmN0aW9uKCl7fTpmdW5jdGlvbihhKXt2YXIgYj11KGEpO2Iua2F8fChiLmthPSEwLEEoYSx6YikpfTt2YXIgR2I9Il9fZXZlbnRXcmFwcGVycyIrRGF0ZS5ub3coKSxIYj1mdW5jdGlvbigpe3ZhciBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXZlbnQucHJvdG90eXBlLCJjb21wb3NlZCIpO3JldHVybiBhP2Z1bmN0aW9uKGIpe3JldHVybiBhLmdldC5jYWxsKGIpfTpudWxsfSgpLEliPXtibHVyOiEwLGZvY3VzOiEwLGZvY3VzaW46ITAsZm9jdXNvdXQ6ITAsY2xpY2s6ITAsZGJsY2xpY2s6ITAsbW91c2Vkb3duOiEwLG1vdXNlZW50ZXI6ITAsbW91c2VsZWF2ZTohMCxtb3VzZW1vdmU6ITAsbW91c2VvdXQ6ITAsbW91c2VvdmVyOiEwLG1vdXNldXA6ITAsd2hlZWw6ITAsYmVmb3JlaW5wdXQ6ITAsaW5wdXQ6ITAsa2V5ZG93bjohMCxrZXl1cDohMCxjb21wb3NpdGlvbnN0YXJ0OiEwLGNvbXBvc2l0aW9udXBkYXRlOiEwLGNvbXBvc2l0aW9uZW5kOiEwLHRvdWNoc3RhcnQ6ITAsdG91Y2hlbmQ6ITAsdG91Y2htb3ZlOiEwLHRvdWNoY2FuY2VsOiEwLHBvaW50ZXJvdmVyOiEwLApwb2ludGVyZW50ZXI6ITAscG9pbnRlcmRvd246ITAscG9pbnRlcm1vdmU6ITAscG9pbnRlcnVwOiEwLHBvaW50ZXJjYW5jZWw6ITAscG9pbnRlcm91dDohMCxwb2ludGVybGVhdmU6ITAsZ290cG9pbnRlcmNhcHR1cmU6ITAsbG9zdHBvaW50ZXJjYXB0dXJlOiEwLGRyYWdzdGFydDohMCxkcmFnOiEwLGRyYWdlbnRlcjohMCxkcmFnbGVhdmU6ITAsZHJhZ292ZXI6ITAsZHJvcDohMCxkcmFnZW5kOiEwLERPTUFjdGl2YXRlOiEwLERPTUZvY3VzSW46ITAsRE9NRm9jdXNPdXQ6ITAsa2V5cHJlc3M6ITB9LEpiPXtET01BdHRyTW9kaWZpZWQ6ITAsRE9NQXR0cmlidXRlTmFtZUNoYW5nZWQ6ITAsRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkOiEwLERPTUVsZW1lbnROYW1lQ2hhbmdlZDohMCxET01Ob2RlSW5zZXJ0ZWQ6ITAsRE9NTm9kZUluc2VydGVkSW50b0RvY3VtZW50OiEwLERPTU5vZGVSZW1vdmVkOiEwLERPTU5vZGVSZW1vdmVkRnJvbURvY3VtZW50OiEwLERPTVN1YnRyZWVNb2RpZmllZDohMH07CmZ1bmN0aW9uIEtiKGEpe3JldHVybiBhIGluc3RhbmNlb2YgTm9kZT9hLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKTphfWZ1bmN0aW9uIExiKGEsYil7dmFyIGM9W10sZD1hO2ZvcihhPUtiKGEpO2Q7KWMucHVzaChkKSxkLl9fc2hhZHlfYXNzaWduZWRTbG90P2Q9ZC5fX3NoYWR5X2Fzc2lnbmVkU2xvdDpkLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFJiZkLmhvc3QmJihifHxkIT09YSk/ZD1kLmhvc3Q6ZD1kLl9fc2hhZHlfcGFyZW50Tm9kZTtjW2MubGVuZ3RoLTFdPT09ZG9jdW1lbnQmJmMucHVzaCh3aW5kb3cpO3JldHVybiBjfWZ1bmN0aW9uIE1iKGEpe2EuX19jb21wb3NlZFBhdGh8fChhLl9fY29tcG9zZWRQYXRoPUxiKGEudGFyZ2V0LCEwKSk7cmV0dXJuIGEuX19jb21wb3NlZFBhdGh9CmZ1bmN0aW9uIE5iKGEsYil7aWYoIXopcmV0dXJuIGE7YT1MYihhLCEwKTtmb3IodmFyIGM9MCxkLGU9dm9pZCAwLGYsZz12b2lkIDA7YzxiLmxlbmd0aDtjKyspaWYoZD1iW2NdLGY9S2IoZCksZiE9PWUmJihnPWEuaW5kZXhPZihmKSxlPWYpLCF6KGYpfHwtMTxnKXJldHVybiBkfWZ1bmN0aW9uIE9iKGEpe2Z1bmN0aW9uIGIoYixkKXtiPW5ldyBhKGIsZCk7Yi5fX2NvbXBvc2VkPWQmJiEhZC5jb21wb3NlZDtyZXR1cm4gYn1iLl9fcHJvdG9fXz1hO2IucHJvdG90eXBlPWEucHJvdG90eXBlO3JldHVybiBifXZhciBQYj17Zm9jdXM6ITAsYmx1cjohMH07ZnVuY3Rpb24gUWIoYSl7cmV0dXJuIGEuX190YXJnZXQhPT1hLnRhcmdldHx8YS5fX3JlbGF0ZWRUYXJnZXQhPT1hLnJlbGF0ZWRUYXJnZXR9CmZ1bmN0aW9uIFJiKGEsYixjKXtpZihjPWIuX19oYW5kbGVycyYmYi5fX2hhbmRsZXJzW2EudHlwZV0mJmIuX19oYW5kbGVyc1thLnR5cGVdW2NdKWZvcih2YXIgZD0wLGU7KGU9Y1tkXSkmJighUWIoYSl8fGEudGFyZ2V0IT09YS5yZWxhdGVkVGFyZ2V0KSYmKGUuY2FsbChiLGEpLCFhLl9faW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKTtkKyspO30KZnVuY3Rpb24gU2IoYSl7dmFyIGI9YS5jb21wb3NlZFBhdGgoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiY3VycmVudFRhcmdldCIse2dldDpmdW5jdGlvbigpe3JldHVybiBkfSxjb25maWd1cmFibGU6ITB9KTtmb3IodmFyIGM9Yi5sZW5ndGgtMTswPD1jO2MtLSl7dmFyIGQ9YltjXTtSYihhLGQsImNhcHR1cmUiKTtpZihhLlopcmV0dXJufU9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJldmVudFBoYXNlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEV2ZW50LkFUX1RBUkdFVH19KTt2YXIgZTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKXtkPWJbY107dmFyIGY9dihkKTtmPWYmJmYucm9vdDtpZigwPT09Y3x8ZiYmZj09PWUpaWYoUmIoYSxkLCJidWJibGUiKSxkIT09d2luZG93JiYoZT1kLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKSksYS5aKWJyZWFrfX0KZnVuY3Rpb24gVGIoYSxiLGMsZCxlLGYpe2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXt2YXIgaD1hW2ddLGs9aC50eXBlLGw9aC5jYXB0dXJlLG09aC5vbmNlLHE9aC5wYXNzaXZlO2lmKGI9PT1oLm5vZGUmJmM9PT1rJiZkPT09bCYmZT09PW0mJmY9PT1xKXJldHVybiBnfXJldHVybi0xfQpmdW5jdGlvbiBVYihhLGIsYyl7aWYoYil7dmFyIGQ9dHlwZW9mIGI7aWYoImZ1bmN0aW9uIj09PWR8fCJvYmplY3QiPT09ZClpZigib2JqZWN0IiE9PWR8fGIuaGFuZGxlRXZlbnQmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5oYW5kbGVFdmVudCl7aWYoSmJbYV0pcmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfYWRkRXZlbnRMaXN0ZW5lcihhLGIsYyk7aWYoYyYmIm9iamVjdCI9PT10eXBlb2YgYyl7dmFyIGU9ISFjLmNhcHR1cmU7dmFyIGY9ISFjLm9uY2U7dmFyIGc9ISFjLnBhc3NpdmV9ZWxzZSBlPSEhYyxnPWY9ITE7dmFyIGg9YyYmYy4kfHx0aGlzLGs9YltHYl07aWYoayl7aWYoLTE8VGIoayxoLGEsZSxmLGcpKXJldHVybn1lbHNlIGJbR2JdPVtdO2s9ZnVuY3Rpb24oZSl7ZiYmdGhpcy5fX3NoYWR5X3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxiLGMpO2UuX190YXJnZXR8fFZiKGUpO2lmKGghPT10aGlzKXt2YXIgZz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsImN1cnJlbnRUYXJnZXQiKTsKT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImN1cnJlbnRUYXJnZXQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaH0sY29uZmlndXJhYmxlOiEwfSl9ZS5fX3ByZXZpb3VzQ3VycmVudFRhcmdldD1lLmN1cnJlbnRUYXJnZXQ7aWYoIXooaCl8fC0xIT1lLmNvbXBvc2VkUGF0aCgpLmluZGV4T2YoaCkpaWYoZS5jb21wb3NlZHx8LTE8ZS5jb21wb3NlZFBhdGgoKS5pbmRleE9mKGgpKWlmKFFiKGUpJiZlLnRhcmdldD09PWUucmVsYXRlZFRhcmdldCllLmV2ZW50UGhhc2U9PT1FdmVudC5CVUJCTElOR19QSEFTRSYmZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtlbHNlIGlmKGUuZXZlbnRQaGFzZT09PUV2ZW50LkNBUFRVUklOR19QSEFTRXx8ZS5idWJibGVzfHxlLnRhcmdldD09PWh8fGggaW5zdGFuY2VvZiBXaW5kb3cpe3ZhciBrPSJmdW5jdGlvbiI9PT1kP2IuY2FsbChoLGUpOmIuaGFuZGxlRXZlbnQmJmIuaGFuZGxlRXZlbnQoZSk7aCE9PXRoaXMmJihnPyhPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwKImN1cnJlbnRUYXJnZXQiLGcpLGc9bnVsbCk6ZGVsZXRlIGUuY3VycmVudFRhcmdldCk7cmV0dXJuIGt9fTtiW0diXS5wdXNoKHtub2RlOmgsdHlwZTphLGNhcHR1cmU6ZSxvbmNlOmYscGFzc2l2ZTpnLFlhOmt9KTtQYlthXT8odGhpcy5fX2hhbmRsZXJzPXRoaXMuX19oYW5kbGVyc3x8e30sdGhpcy5fX2hhbmRsZXJzW2FdPXRoaXMuX19oYW5kbGVyc1thXXx8e2NhcHR1cmU6W10sYnViYmxlOltdfSx0aGlzLl9faGFuZGxlcnNbYV1bZT8iY2FwdHVyZSI6ImJ1YmJsZSJdLnB1c2goaykpOnRoaXMuX19zaGFkeV9uYXRpdmVfYWRkRXZlbnRMaXN0ZW5lcihhLGssYyl9fX0KZnVuY3Rpb24gV2IoYSxiLGMpe2lmKGIpe2lmKEpiW2FdKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxiLGMpO2lmKGMmJiJvYmplY3QiPT09dHlwZW9mIGMpe3ZhciBkPSEhYy5jYXB0dXJlO3ZhciBlPSEhYy5vbmNlO3ZhciBmPSEhYy5wYXNzaXZlfWVsc2UgZD0hIWMsZj1lPSExO3ZhciBnPWMmJmMuJHx8dGhpcyxoPXZvaWQgMDt2YXIgaz1udWxsO3RyeXtrPWJbR2JdfWNhdGNoKGwpe31rJiYoZT1UYihrLGcsYSxkLGUsZiksLTE8ZSYmKGg9ay5zcGxpY2UoZSwxKVswXS5ZYSxrLmxlbmd0aHx8KGJbR2JdPXZvaWQgMCkpKTt0aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxofHxiLGMpO2gmJlBiW2FdJiZ0aGlzLl9faGFuZGxlcnMmJnRoaXMuX19oYW5kbGVyc1thXSYmKGE9dGhpcy5fX2hhbmRsZXJzW2FdW2Q/ImNhcHR1cmUiOiJidWJibGUiXSxoPWEuaW5kZXhPZihoKSwtMTxoJiZhLnNwbGljZShoLDEpKX19CmZ1bmN0aW9uIFhiKCl7Zm9yKHZhciBhIGluIFBiKXdpbmRvdy5fX3NoYWR5X25hdGl2ZV9hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7YS5fX3RhcmdldHx8KFZiKGEpLFNiKGEpKX0sITApfQp2YXIgWWI9Qih7Z2V0IGNvbXBvc2VkKCl7dm9pZCAwPT09dGhpcy5fX2NvbXBvc2VkJiYoSGI/dGhpcy5fX2NvbXBvc2VkPSJmb2N1c2luIj09PXRoaXMudHlwZXx8ImZvY3Vzb3V0Ij09PXRoaXMudHlwZXx8SGIodGhpcyk6ITEhPT10aGlzLmlzVHJ1c3RlZCYmKHRoaXMuX19jb21wb3NlZD1JYlt0aGlzLnR5cGVdKSk7cmV0dXJuIHRoaXMuX19jb21wb3NlZHx8ITF9LGNvbXBvc2VkUGF0aDpmdW5jdGlvbigpe3RoaXMuX19jb21wb3NlZFBhdGh8fCh0aGlzLl9fY29tcG9zZWRQYXRoPUxiKHRoaXMuX190YXJnZXQsdGhpcy5jb21wb3NlZCkpO3JldHVybiB0aGlzLl9fY29tcG9zZWRQYXRofSxnZXQgdGFyZ2V0KCl7cmV0dXJuIE5iKHRoaXMuY3VycmVudFRhcmdldHx8dGhpcy5fX3ByZXZpb3VzQ3VycmVudFRhcmdldCx0aGlzLmNvbXBvc2VkUGF0aCgpKX0sZ2V0IHJlbGF0ZWRUYXJnZXQoKXtpZighdGhpcy5fX3JlbGF0ZWRUYXJnZXQpcmV0dXJuIG51bGw7dGhpcy5fX3JlbGF0ZWRUYXJnZXRDb21wb3NlZFBhdGh8fAoodGhpcy5fX3JlbGF0ZWRUYXJnZXRDb21wb3NlZFBhdGg9TGIodGhpcy5fX3JlbGF0ZWRUYXJnZXQsITApKTtyZXR1cm4gTmIodGhpcy5jdXJyZW50VGFyZ2V0fHx0aGlzLl9fcHJldmlvdXNDdXJyZW50VGFyZ2V0LHRoaXMuX19yZWxhdGVkVGFyZ2V0Q29tcG9zZWRQYXRoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7RXZlbnQucHJvdG90eXBlLnN0b3BQcm9wYWdhdGlvbi5jYWxsKHRoaXMpO3RoaXMuWj0hMH0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7RXZlbnQucHJvdG90eXBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbi5jYWxsKHRoaXMpO3RoaXMuWj10aGlzLl9faW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPSEwfX0pOwpmdW5jdGlvbiBWYihhKXthLl9fdGFyZ2V0PWEudGFyZ2V0O2EuX19yZWxhdGVkVGFyZ2V0PWEucmVsYXRlZFRhcmdldDtpZih3Lm0pe3ZhciBiPU9iamVjdC5nZXRQcm90b3R5cGVPZihhKTtpZighT2JqZWN0Lmhhc093blByb3BlcnR5KGIsIl9fc2hhZHlfcGF0Y2hlZFByb3RvIikpe3ZhciBjPU9iamVjdC5jcmVhdGUoYik7Yy5fX3NoYWR5X3NvdXJjZVByb3RvPWI7QShjLFliKTtiLl9fc2hhZHlfcGF0Y2hlZFByb3RvPWN9YS5fX3Byb3RvX189Yi5fX3NoYWR5X3BhdGNoZWRQcm90b31lbHNlIEEoYSxZYil9dmFyIFpiPU9iKEV2ZW50KSwkYj1PYihDdXN0b21FdmVudCksYWM9T2IoTW91c2VFdmVudCk7CmZ1bmN0aW9uIGJjKCl7aWYoIUhiJiZPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV2ZW50LnByb3RvdHlwZSwiaXNUcnVzdGVkIikpe3ZhciBhPWZ1bmN0aW9uKCl7dmFyIGE9bmV3IE1vdXNlRXZlbnQoImNsaWNrIix7YnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNvbXBvc2VkOiEwfSk7dGhpcy5fX3NoYWR5X2Rpc3BhdGNoRXZlbnQoYSl9O0VsZW1lbnQucHJvdG90eXBlLmNsaWNrP0VsZW1lbnQucHJvdG90eXBlLmNsaWNrPWE6SFRNTEVsZW1lbnQucHJvdG90eXBlLmNsaWNrJiYoSFRNTEVsZW1lbnQucHJvdG90eXBlLmNsaWNrPWEpfX12YXIgY2M9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoRG9jdW1lbnQucHJvdG90eXBlKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIm9uIj09PWEuc3Vic3RyaW5nKDAsMil9KTtmdW5jdGlvbiBkYyhhLGIpe3JldHVybntpbmRleDphLEw6W10sUjpifX0KZnVuY3Rpb24gZWMoYSxiLGMsZCl7dmFyIGU9MCxmPTAsZz0wLGg9MCxrPU1hdGgubWluKGItZSxkLWYpO2lmKDA9PWUmJjA9PWYpYTp7Zm9yKGc9MDtnPGs7ZysrKWlmKGFbZ10hPT1jW2ddKWJyZWFrIGE7Zz1rfWlmKGI9PWEubGVuZ3RoJiZkPT1jLmxlbmd0aCl7aD1hLmxlbmd0aDtmb3IodmFyIGw9Yy5sZW5ndGgsbT0wO208ay1nJiZmYyhhWy0taF0sY1stLWxdKTspbSsrO2g9bX1lKz1nO2YrPWc7Yi09aDtkLT1oO2lmKDA9PWItZSYmMD09ZC1mKXJldHVybltdO2lmKGU9PWIpe2ZvcihiPWRjKGUsMCk7ZjxkOyliLkwucHVzaChjW2YrK10pO3JldHVybltiXX1pZihmPT1kKXJldHVybltkYyhlLGItZSldO2s9ZTtnPWY7ZD1kLWcrMTtoPWItaysxO2I9QXJyYXkoZCk7Zm9yKGw9MDtsPGQ7bCsrKWJbbF09QXJyYXkoaCksYltsXVswXT1sO2ZvcihsPTA7bDxoO2wrKyliWzBdW2xdPWw7Zm9yKGw9MTtsPGQ7bCsrKWZvcihtPTE7bTxoO20rKylpZihhW2srbS0xXT09PWNbZytsLTFdKWJbbF1bbV09CmJbbC0xXVttLTFdO2Vsc2V7dmFyIHE9YltsLTFdW21dKzEseD1iW2xdW20tMV0rMTtiW2xdW21dPXE8eD9xOnh9az1iLmxlbmd0aC0xO2c9YlswXS5sZW5ndGgtMTtkPWJba11bZ107Zm9yKGE9W107MDxrfHwwPGc7KTA9PWs/KGEucHVzaCgyKSxnLS0pOjA9PWc/KGEucHVzaCgzKSxrLS0pOihoPWJbay0xXVtnLTFdLGw9YltrLTFdW2ddLG09YltrXVtnLTFdLHE9bDxtP2w8aD9sOmg6bTxoP206aCxxPT1oPyhoPT1kP2EucHVzaCgwKTooYS5wdXNoKDEpLGQ9aCksay0tLGctLSk6cT09bD8oYS5wdXNoKDMpLGstLSxkPWwpOihhLnB1c2goMiksZy0tLGQ9bSkpO2EucmV2ZXJzZSgpO2I9dm9pZCAwO2s9W107Zm9yKGc9MDtnPGEubGVuZ3RoO2crKylzd2l0Y2goYVtnXSl7Y2FzZSAwOmImJihrLnB1c2goYiksYj12b2lkIDApO2UrKztmKys7YnJlYWs7Y2FzZSAxOmJ8fChiPWRjKGUsMCkpO2IuUisrO2UrKztiLkwucHVzaChjW2ZdKTtmKys7YnJlYWs7Y2FzZSAyOmJ8fChiPWRjKGUsMCkpOwpiLlIrKztlKys7YnJlYWs7Y2FzZSAzOmJ8fChiPWRjKGUsMCkpLGIuTC5wdXNoKGNbZl0pLGYrK31iJiZrLnB1c2goYik7cmV0dXJuIGt9ZnVuY3Rpb24gZmMoYSxiKXtyZXR1cm4gYT09PWJ9O2Z1bmN0aW9uIGdjKGEsYixjKXtFYihhKTtjPWN8fG51bGw7dmFyIGQ9dShhKSxlPXUoYiksZj1jP3UoYyk6bnVsbDtkLnByZXZpb3VzU2libGluZz1jP2YucHJldmlvdXNTaWJsaW5nOmIuX19zaGFkeV9sYXN0Q2hpbGQ7aWYoZj12KGQucHJldmlvdXNTaWJsaW5nKSlmLm5leHRTaWJsaW5nPWE7aWYoZj12KGQubmV4dFNpYmxpbmc9YykpZi5wcmV2aW91c1NpYmxpbmc9YTtkLnBhcmVudE5vZGU9YjtjP2M9PT1lLmZpcnN0Q2hpbGQmJihlLmZpcnN0Q2hpbGQ9YSk6KGUubGFzdENoaWxkPWEsZS5maXJzdENoaWxkfHwoZS5maXJzdENoaWxkPWEpKTtlLmNoaWxkTm9kZXM9bnVsbH0KZnVuY3Rpb24gaGMoYSxiLGMpe0ZiKGIpO3ZhciBkPXUoYik7dm9pZCAwIT09ZC5maXJzdENoaWxkJiYoZC5jaGlsZE5vZGVzPW51bGwpO2lmKGEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe2Q9YS5fX3NoYWR5X2NoaWxkTm9kZXM7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspZ2MoZFtlXSxiLGMpO2E9dShhKTtiPXZvaWQgMCE9PWEuZmlyc3RDaGlsZD9udWxsOnZvaWQgMDthLmZpcnN0Q2hpbGQ9YS5sYXN0Q2hpbGQ9YjthLmNoaWxkTm9kZXM9Yn1lbHNlIGdjKGEsYixjKX0KZnVuY3Rpb24gaWMoYSxiKXt2YXIgYz11KGEpO2I9dShiKTthPT09Yi5maXJzdENoaWxkJiYoYi5maXJzdENoaWxkPWMubmV4dFNpYmxpbmcpO2E9PT1iLmxhc3RDaGlsZCYmKGIubGFzdENoaWxkPWMucHJldmlvdXNTaWJsaW5nKTthPWMucHJldmlvdXNTaWJsaW5nO3ZhciBkPWMubmV4dFNpYmxpbmc7YSYmKHUoYSkubmV4dFNpYmxpbmc9ZCk7ZCYmKHUoZCkucHJldmlvdXNTaWJsaW5nPWEpO2MucGFyZW50Tm9kZT1jLnByZXZpb3VzU2libGluZz1jLm5leHRTaWJsaW5nPXZvaWQgMDt2b2lkIDAhPT1iLmNoaWxkTm9kZXMmJihiLmNoaWxkTm9kZXM9bnVsbCl9CmZ1bmN0aW9uIGpjKGEpe3ZhciBiPXUoYSk7aWYodm9pZCAwPT09Yi5maXJzdENoaWxkKXtiLmNoaWxkTm9kZXM9bnVsbDt2YXIgYz1iLmZpcnN0Q2hpbGQ9YS5fX3NoYWR5X25hdGl2ZV9maXJzdENoaWxkfHxudWxsO2IubGFzdENoaWxkPWEuX19zaGFkeV9uYXRpdmVfbGFzdENoaWxkfHxudWxsO0ZiKGEpO2I9Yztmb3IoYz12b2lkIDA7YjtiPWIuX19zaGFkeV9uYXRpdmVfbmV4dFNpYmxpbmcpe3ZhciBkPXUoYik7ZC5wYXJlbnROb2RlPWE7ZC5uZXh0U2libGluZz1iLl9fc2hhZHlfbmF0aXZlX25leHRTaWJsaW5nfHxudWxsO2QucHJldmlvdXNTaWJsaW5nPWN8fG51bGw7Yz1iO0ViKGIpfX19O3ZhciBrYz1udWxsO2Z1bmN0aW9uIEcoKXtrY3x8KGtjPXdpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltKTtyZXR1cm4ga2N8fG51bGx9ZnVuY3Rpb24gbGMoYSxiKXt2YXIgYz1HKCk7YyYmYy51bnNjb3BlTm9kZShhLGIpfWZ1bmN0aW9uIG1jKGEsYil7dmFyIGM9RygpO2lmKCFjKXJldHVybiEwO2lmKGEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe2M9ITA7YT1hLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGQ9MDtjJiZkPGEubGVuZ3RoO2QrKyljPWMmJm1jKGFbZF0sYik7cmV0dXJuIGN9cmV0dXJuIGEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERT8hMDpjLmN1cnJlbnRTY29wZUZvck5vZGUoYSk9PT1ifWZ1bmN0aW9uIG5jKGEpe2lmKGEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4iIjt2YXIgYj1HKCk7cmV0dXJuIGI/Yi5jdXJyZW50U2NvcGVGb3JOb2RlKGEpOiIifQpmdW5jdGlvbiBvYyhhLGIpe2lmKGEpe2Eubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmYihhKTthPWEuX19zaGFkeV9jaGlsZE5vZGVzO2Zvcih2YXIgYz0wLGQ7YzxhLmxlbmd0aDtjKyspZD1hW2NdLGQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmb2MoZCxiKX19O3ZhciBwYz13aW5kb3cuZG9jdW1lbnQscWM9dy5vYSxyYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLCJpc0Nvbm5lY3RlZCIpLHNjPXJjJiZyYy5nZXQ7ZnVuY3Rpb24gdGMoYSl7Zm9yKHZhciBiO2I9YS5fX3NoYWR5X2ZpcnN0Q2hpbGQ7KWEuX19zaGFkeV9yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiB1YyhhKXt2YXIgYj12KGEpO2lmKGImJnZvaWQgMCE9PWIuSyl7Yj1hLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGM9MCxkPWIubGVuZ3RoLGU9dm9pZCAwO2M8ZCYmKGU9YltjXSk7YysrKXVjKGUpfWlmKGE9dihhKSlhLks9dm9pZCAwfWZ1bmN0aW9uIHZjKGEpe3ZhciBiPWE7YSYmInNsb3QiPT09YS5sb2NhbE5hbWUmJihiPShiPShiPXYoYSkpJiZiLkQpJiZiLmxlbmd0aD9iWzBdOnZjKGEuX19zaGFkeV9uZXh0U2libGluZykpO3JldHVybiBifQpmdW5jdGlvbiB3YyhhLGIsYyl7aWYoYT0oYT12KGEpKSYmYS5IKWImJmEuYWRkZWROb2Rlcy5wdXNoKGIpLGMmJmEucmVtb3ZlZE5vZGVzLnB1c2goYyksYWIoYSl9CnZhciBDYz1CKHtnZXQgcGFyZW50Tm9kZSgpe3ZhciBhPXYodGhpcyk7YT1hJiZhLnBhcmVudE5vZGU7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGV9LGdldCBmaXJzdENoaWxkKCl7dmFyIGE9dih0aGlzKTthPWEmJmEuZmlyc3RDaGlsZDtyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfZmlyc3RDaGlsZH0sZ2V0IGxhc3RDaGlsZCgpe3ZhciBhPXYodGhpcyk7YT1hJiZhLmxhc3RDaGlsZDtyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfbGFzdENoaWxkfSxnZXQgbmV4dFNpYmxpbmcoKXt2YXIgYT12KHRoaXMpO2E9YSYmYS5uZXh0U2libGluZztyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfbmV4dFNpYmxpbmd9LGdldCBwcmV2aW91c1NpYmxpbmcoKXt2YXIgYT12KHRoaXMpO2E9YSYmYS5wcmV2aW91c1NpYmxpbmc7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3ByZXZpb3VzU2libGluZ30sCmdldCBjaGlsZE5vZGVzKCl7aWYoeSh0aGlzKSl7dmFyIGE9dih0aGlzKTtpZighYS5jaGlsZE5vZGVzKXthLmNoaWxkTm9kZXM9W107Zm9yKHZhciBiPXRoaXMuX19zaGFkeV9maXJzdENoaWxkO2I7Yj1iLl9fc2hhZHlfbmV4dFNpYmxpbmcpYS5jaGlsZE5vZGVzLnB1c2goYil9dmFyIGM9YS5jaGlsZE5vZGVzfWVsc2UgYz10aGlzLl9fc2hhZHlfbmF0aXZlX2NoaWxkTm9kZXM7Yy5pdGVtPWZ1bmN0aW9uKGEpe3JldHVybiBjW2FdfTtyZXR1cm4gY30sZ2V0IHBhcmVudEVsZW1lbnQoKXt2YXIgYT12KHRoaXMpOyhhPWEmJmEucGFyZW50Tm9kZSkmJmEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSYmKGE9bnVsbCk7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3BhcmVudEVsZW1lbnR9LGdldCBpc0Nvbm5lY3RlZCgpe2lmKHNjJiZzYy5jYWxsKHRoaXMpKXJldHVybiEwO2lmKHRoaXMubm9kZVR5cGU9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSlyZXR1cm4hMTsKdmFyIGE9dGhpcy5vd25lckRvY3VtZW50O2lmKFRhKXtpZihhLl9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKHRoaXMpKXJldHVybiEwfWVsc2UgaWYoYS5kb2N1bWVudEVsZW1lbnQmJmEuZG9jdW1lbnRFbGVtZW50Ll9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKHRoaXMpKXJldHVybiEwO2ZvcihhPXRoaXM7YSYmIShhIGluc3RhbmNlb2YgRG9jdW1lbnQpOylhPWEuX19zaGFkeV9wYXJlbnROb2RlfHwoeihhKT9hLmhvc3Q6dm9pZCAwKTtyZXR1cm4hIShhJiZhIGluc3RhbmNlb2YgRG9jdW1lbnQpfSxnZXQgdGV4dENvbnRlbnQoKXtpZih5KHRoaXMpKXtmb3IodmFyIGE9W10sYj0wLGM9dGhpcy5fX3NoYWR5X2NoaWxkTm9kZXMsZDtkPWNbYl07YisrKWQubm9kZVR5cGUhPT1Ob2RlLkNPTU1FTlRfTk9ERSYmYS5wdXNoKGQuX19zaGFkeV90ZXh0Q29udGVudCk7cmV0dXJuIGEuam9pbigiIil9cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfdGV4dENvbnRlbnR9LHNldCB0ZXh0Q29udGVudChhKXtpZigidW5kZWZpbmVkIj09PQp0eXBlb2YgYXx8bnVsbD09PWEpYT0iIjtzd2l0Y2godGhpcy5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTppZigheSh0aGlzKSYmdy5tKXt2YXIgYj10aGlzLl9fc2hhZHlfZmlyc3RDaGlsZDsoYiE9dGhpcy5fX3NoYWR5X2xhc3RDaGlsZHx8YiYmYi5ub2RlVHlwZSE9Tm9kZS5URVhUX05PREUpJiZ0Yyh0aGlzKTt0aGlzLl9fc2hhZHlfbmF0aXZlX3RleHRDb250ZW50PWF9ZWxzZSB0Yyh0aGlzKSwoMDxhLmxlbmd0aHx8dGhpcy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKSYmdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSk7YnJlYWs7ZGVmYXVsdDp0aGlzLm5vZGVWYWx1ZT1hfX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGEsYil7aWYodGhpcy5vd25lckRvY3VtZW50IT09cGMmJmEub3duZXJEb2N1bWVudCE9PXBjKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2luc2VydEJlZm9yZShhLApiKSxhO2lmKGE9PT10aGlzKXRocm93IEVycm9yKCJGYWlsZWQgdG8gZXhlY3V0ZSAnYXBwZW5kQ2hpbGQnIG9uICdOb2RlJzogVGhlIG5ldyBjaGlsZCBlbGVtZW50IGNvbnRhaW5zIHRoZSBwYXJlbnQuIik7aWYoYil7dmFyIGM9dihiKTtjPWMmJmMucGFyZW50Tm9kZTtpZih2b2lkIDAhPT1jJiZjIT09dGhpc3x8dm9pZCAwPT09YyYmYi5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlIT09dGhpcyl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2luc2VydEJlZm9yZScgb24gJ05vZGUnOiBUaGUgbm9kZSBiZWZvcmUgd2hpY2ggdGhlIG5ldyBub2RlIGlzIHRvIGJlIGluc2VydGVkIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgbm9kZS4iKTt9aWYoYj09PWEpcmV0dXJuIGE7dmFyIGQ9W10sZT0oYz14Yyh0aGlzKSk/Yy5ob3N0LmxvY2FsTmFtZTpuYyh0aGlzKSxmPWEuX19zaGFkeV9wYXJlbnROb2RlO2lmKGYpe3ZhciBnPW5jKGEpO2YuX19zaGFkeV9yZW1vdmVDaGlsZChhLCEhY3x8CiF4YyhhKSl9Zj0hMDt2YXIgaD0oIXFjfHx2b2lkIDA9PT1hLl9fbm9JbnNlcnRpb25Qb2ludCkmJiFtYyhhLGUpLGs9YyYmIWEuX19ub0luc2VydGlvblBvaW50JiYoIXFjfHxhLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKTtpZihrfHxoKWgmJihnPWd8fG5jKGEpKSxvYyhhLGZ1bmN0aW9uKGEpe2smJiJzbG90Ij09PWEubG9jYWxOYW1lJiZkLnB1c2goYSk7aWYoaCl7dmFyIGI9ZztHKCkmJihiJiZsYyhhLGIpLChiPUcoKSkmJmIuc2NvcGVOb2RlKGEsZSkpfX0pO2lmKCJzbG90Ij09PXRoaXMubG9jYWxOYW1lfHxkLmxlbmd0aClkLmxlbmd0aCYmKGMuYz1jLmN8fFtdLGMuYT1jLmF8fFtdLGMuYj1jLmJ8fHt9LGMuYy5wdXNoLmFwcGx5KGMuYyxkIGluc3RhbmNlb2YgQXJyYXk/ZDpqYShpYShkKSkpKSxjJiZBYyhjKTt5KHRoaXMpJiYoaGMoYSx0aGlzLGIpLGM9dih0aGlzKSxMYSh0aGlzKT8oQWMoYy5yb290KSxmPSExKTpjLnJvb3QmJihmPSExKSk7Zj8KKGM9eih0aGlzKT90aGlzLmhvc3Q6dGhpcyxiPyhiPXZjKGIpLGMuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGEsYikpOmMuX19zaGFkeV9uYXRpdmVfYXBwZW5kQ2hpbGQoYSkpOmEub3duZXJEb2N1bWVudCE9PXRoaXMub3duZXJEb2N1bWVudCYmdGhpcy5vd25lckRvY3VtZW50LmFkb3B0Tm9kZShhKTt3Yyh0aGlzLGEpO3JldHVybiBhfSxhcHBlbmRDaGlsZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShhKX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oYSxiKXtiPXZvaWQgMD09PWI/ITE6YjtpZih0aGlzLm93bmVyRG9jdW1lbnQhPT1wYylyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChhKTtpZihhLl9fc2hhZHlfcGFyZW50Tm9kZSE9PXRoaXMpdGhyb3cgRXJyb3IoIlRoZSBub2RlIHRvIGJlIHJlbW92ZWQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlOiAiK2EpO3ZhciBjPXhjKGEpLGQ9YyYmQmMoYyxhKSxlPXYodGhpcyk7CmlmKHkodGhpcykmJihpYyhhLHRoaXMpLExhKHRoaXMpKSl7QWMoZS5yb290KTt2YXIgZj0hMH1pZihHKCkmJiFiJiZjKXt2YXIgZz1uYyhhKTtvYyhhLGZ1bmN0aW9uKGEpe2xjKGEsZyl9KX11YyhhKTtjJiYoKGI9dGhpcyYmInNsb3QiPT09dGhpcy5sb2NhbE5hbWUpJiYoZj0hMCksKGR8fGIpJiZBYyhjKSk7Znx8KGY9eih0aGlzKT90aGlzLmhvc3Q6dGhpcywoIWUucm9vdCYmInNsb3QiIT09YS5sb2NhbE5hbWV8fGY9PT1hLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGUpJiZmLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGEpKTt3Yyh0aGlzLG51bGwsYSk7cmV0dXJuIGF9LHJlcGxhY2VDaGlsZDpmdW5jdGlvbihhLGIpe3RoaXMuX19zaGFkeV9pbnNlcnRCZWZvcmUoYSxiKTt0aGlzLl9fc2hhZHlfcmVtb3ZlQ2hpbGQoYik7cmV0dXJuIGF9LGNsb25lTm9kZTpmdW5jdGlvbihhKXtpZigidGVtcGxhdGUiPT10aGlzLmxvY2FsTmFtZSlyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9jbG9uZU5vZGUoYSk7CnZhciBiPXRoaXMuX19zaGFkeV9uYXRpdmVfY2xvbmVOb2RlKCExKTtpZihhJiZiLm5vZGVUeXBlIT09Tm9kZS5BVFRSSUJVVEVfTk9ERSl7YT10aGlzLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGM9MCxkO2M8YS5sZW5ndGg7YysrKWQ9YVtjXS5fX3NoYWR5X2Nsb25lTm9kZSghMCksYi5fX3NoYWR5X2FwcGVuZENoaWxkKGQpfXJldHVybiBifSxnZXRSb290Tm9kZTpmdW5jdGlvbihhKXtpZih0aGlzJiZ0aGlzLm5vZGVUeXBlKXt2YXIgYj11KHRoaXMpLGM9Yi5LO3ZvaWQgMD09PWMmJih6KHRoaXMpPyhjPXRoaXMsYi5LPWMpOihjPShjPXRoaXMuX19zaGFkeV9wYXJlbnROb2RlKT9jLl9fc2hhZHlfZ2V0Um9vdE5vZGUoYSk6dGhpcyxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuX19zaGFkeV9uYXRpdmVfY29udGFpbnModGhpcykmJihiLks9YykpKTtyZXR1cm4gY319LGNvbnRhaW5zOmZ1bmN0aW9uKGEpe3JldHVybiBVYSh0aGlzLGEpfX0pO2Z1bmN0aW9uIERjKGEsYixjKXt2YXIgZD1bXTtFYyhhLl9fc2hhZHlfY2hpbGROb2RlcyxiLGMsZCk7cmV0dXJuIGR9ZnVuY3Rpb24gRWMoYSxiLGMsZCl7Zm9yKHZhciBlPTAsZj1hLmxlbmd0aCxnPXZvaWQgMDtlPGYmJihnPWFbZV0pO2UrKyl7dmFyIGg7aWYoaD1nLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe2g9Zzt2YXIgaz1iLGw9YyxtPWQscT1rKGgpO3EmJm0ucHVzaChoKTtsJiZsKHEpP2g9cTooRWMoaC5fX3NoYWR5X2NoaWxkTm9kZXMsayxsLG0pLGg9dm9pZCAwKX1pZihoKWJyZWFrfX0KdmFyIEZjPUIoe2dldCBmaXJzdEVsZW1lbnRDaGlsZCgpe3ZhciBhPXYodGhpcyk7aWYoYSYmdm9pZCAwIT09YS5maXJzdENoaWxkKXtmb3IoYT10aGlzLl9fc2hhZHlfZmlyc3RDaGlsZDthJiZhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KWE9YS5fX3NoYWR5X25leHRTaWJsaW5nO3JldHVybiBhfXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2ZpcnN0RWxlbWVudENoaWxkfSxnZXQgbGFzdEVsZW1lbnRDaGlsZCgpe3ZhciBhPXYodGhpcyk7aWYoYSYmdm9pZCAwIT09YS5sYXN0Q2hpbGQpe2ZvcihhPXRoaXMuX19zaGFkeV9sYXN0Q2hpbGQ7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEuX19zaGFkeV9wcmV2aW91c1NpYmxpbmc7cmV0dXJuIGF9cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfbGFzdEVsZW1lbnRDaGlsZH0sZ2V0IGNoaWxkcmVuKCl7cmV0dXJuIHkodGhpcyk/VmEoQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHRoaXMuX19zaGFkeV9jaGlsZE5vZGVzLApmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFfSkpOnRoaXMuX19zaGFkeV9uYXRpdmVfY2hpbGRyZW59LGdldCBjaGlsZEVsZW1lbnRDb3VudCgpe3ZhciBhPXRoaXMuX19zaGFkeV9jaGlsZHJlbjtyZXR1cm4gYT9hLmxlbmd0aDowfX0pLEdjPUIoe3F1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIERjKHRoaXMsZnVuY3Rpb24oYil7cmV0dXJuIE9hLmNhbGwoYixhKX0sZnVuY3Rpb24oYSl7cmV0dXJuISFhfSlbMF18fG51bGx9LHF1ZXJ5U2VsZWN0b3JBbGw6ZnVuY3Rpb24oYSxiKXtpZihiKXtiPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX19zaGFkeV9uYXRpdmVfcXVlcnlTZWxlY3RvckFsbChhKSk7dmFyIGM9dGhpcy5fX3NoYWR5X2dldFJvb3ROb2RlKCk7cmV0dXJuIGIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKT09Y30pfXJldHVybiBEYyh0aGlzLGZ1bmN0aW9uKGIpe3JldHVybiBPYS5jYWxsKGIsCmEpfSl9fSksSGM9dy5vYT9PYmplY3QuYXNzaWduKHt9LEZjKTpGYztPYmplY3QuYXNzaWduKEZjLEdjKTt2YXIgSWM9Qih7Z2V0RWxlbWVudEJ5SWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIiI9PT1hP251bGw6RGModGhpcyxmdW5jdGlvbihiKXtyZXR1cm4gYi5pZD09YX0sZnVuY3Rpb24oYSl7cmV0dXJuISFhfSlbMF18fG51bGx9fSk7dmFyIEpjPUIoe2dldCBhY3RpdmVFbGVtZW50KCl7dmFyIGE9dy5tP2RvY3VtZW50Ll9fc2hhZHlfbmF0aXZlX2FjdGl2ZUVsZW1lbnQ6ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZighYXx8IWEubm9kZVR5cGUpcmV0dXJuIG51bGw7dmFyIGI9ISF6KHRoaXMpO2lmKCEodGhpcz09PWRvY3VtZW50fHxiJiZ0aGlzLmhvc3QhPT1hJiZ0aGlzLmhvc3QuX19zaGFkeV9uYXRpdmVfY29udGFpbnMoYSkpKXJldHVybiBudWxsO2ZvcihiPXhjKGEpO2ImJmIhPT10aGlzOylhPWIuaG9zdCxiPXhjKGEpO3JldHVybiB0aGlzPT09ZG9jdW1lbnQ/Yj9udWxsOmE6Yj09PXRoaXM/YTpudWxsfX0pO3ZhciBLYz1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoImluZXJ0IiksTGM9Qih7Z2V0IGlubmVySFRNTCgpe3JldHVybiB5KHRoaXMpP2tiKCJ0ZW1wbGF0ZSI9PT10aGlzLmxvY2FsTmFtZT90aGlzLmNvbnRlbnQ6dGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gYS5fX3NoYWR5X2NoaWxkTm9kZXN9KTp0aGlzLl9fc2hhZHlfbmF0aXZlX2lubmVySFRNTH0sc2V0IGlubmVySFRNTChhKXtpZigidGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWUpdGhpcy5fX3NoYWR5X25hdGl2ZV9pbm5lckhUTUw9YTtlbHNle3RjKHRoaXMpO3ZhciBiPXRoaXMubG9jYWxOYW1lfHwiZGl2IjtiPXRoaXMubmFtZXNwYWNlVVJJJiZ0aGlzLm5hbWVzcGFjZVVSSSE9PUtjLm5hbWVzcGFjZVVSST9LYy5jcmVhdGVFbGVtZW50TlModGhpcy5uYW1lc3BhY2VVUkksYik6S2MuY3JlYXRlRWxlbWVudChiKTtmb3Iody5tP2IuX19zaGFkeV9uYXRpdmVfaW5uZXJIVE1MPWE6Yi5pbm5lckhUTUw9CmE7YT1iLl9fc2hhZHlfZmlyc3RDaGlsZDspdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShhKX19fSk7dmFyIE1jPUIoe2FkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiLGMpeyJvYmplY3QiIT09dHlwZW9mIGMmJihjPXtjYXB0dXJlOiEhY30pO2MuJD10aGlzO3RoaXMuaG9zdC5fX3NoYWR5X2FkZEV2ZW50TGlzdGVuZXIoYSxiLGMpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYixjKXsib2JqZWN0IiE9PXR5cGVvZiBjJiYoYz17Y2FwdHVyZTohIWN9KTtjLiQ9dGhpczt0aGlzLmhvc3QuX19zaGFkeV9yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKX19KTtmdW5jdGlvbiBOYyhhLGIpe0EoYSxNYyxiKTtBKGEsSmMsYik7QShhLExjLGIpO0EoYSxGYyxiKTt3LkomJiFiPyhBKGEsQ2MsYiksQShhLEljLGIpKTp3Lm18fChBKGEsQWIpLEEoYSx6YikpfTt2YXIgT2M9e30sUGM9dy5kZWZlckNvbm5lY3Rpb25DYWxsYmFja3MmJiJsb2FkaW5nIj09PWRvY3VtZW50LnJlYWR5U3RhdGUsUWM7ZnVuY3Rpb24gUmMoYSl7dmFyIGI9W107ZG8gYi51bnNoaWZ0KGEpO3doaWxlKGE9YS5fX3NoYWR5X3BhcmVudE5vZGUpO3JldHVybiBifQpmdW5jdGlvbiBTYyhhLGIsYyl7aWYoYSE9PU9jKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTt0aGlzLnphPSJTaGFkeVJvb3QiO3RoaXMuaG9zdD1iO3RoaXMubW9kZT1jJiZjLm1vZGU7amMoYik7YT11KGIpO2Eucm9vdD10aGlzO2EucGE9ImNsb3NlZCIhPT10aGlzLm1vZGU/dGhpczpudWxsO2E9dSh0aGlzKTthLmZpcnN0Q2hpbGQ9YS5sYXN0Q2hpbGQ9YS5wYXJlbnROb2RlPWEubmV4dFNpYmxpbmc9YS5wcmV2aW91c1NpYmxpbmc9bnVsbDthLmNoaWxkTm9kZXM9W107dGhpcy5iYT10aGlzLkI9ITE7dGhpcy5jPXRoaXMuYj10aGlzLmE9bnVsbDtpZih3LnByZWZlclBlcmZvcm1hbmNlKWZvcig7YT1iLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGQ7KWIuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQ2hpbGQoYSk7ZWxzZSBBYyh0aGlzKX1mdW5jdGlvbiBBYyhhKXthLkJ8fChhLkI9ITAsWWEoZnVuY3Rpb24oKXtyZXR1cm4gVGMoYSl9KSl9CmZ1bmN0aW9uIFRjKGEpe3ZhciBiO2lmKGI9YS5CKXtmb3IodmFyIGM7YTspYTp7YS5CJiYoYz1hKSxiPWE7YT1iLmhvc3QuX19zaGFkeV9nZXRSb290Tm9kZSgpO2lmKHooYSkmJihiPXYoYi5ob3N0KSkmJjA8Yi5OKWJyZWFrIGE7YT12b2lkIDB9Yj1jfShjPWIpJiZjLl9yZW5kZXJTZWxmKCl9ClNjLnByb3RvdHlwZS5fcmVuZGVyU2VsZj1mdW5jdGlvbigpe3ZhciBhPVBjO1BjPSEwO3RoaXMuQj0hMTtpZih0aGlzLmEpe1VjKHRoaXMpO2Zvcih2YXIgYj0wLGM7Yjx0aGlzLmEubGVuZ3RoO2IrKyl7Yz10aGlzLmFbYl07dmFyIGQ9dihjKSxlPWQuYXNzaWduZWROb2RlcztkLmFzc2lnbmVkTm9kZXM9W107ZC5EPVtdO2lmKGQuY2E9ZSlmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCsrKXt2YXIgZj12KGVbZF0pO2YuUD1mLmFzc2lnbmVkU2xvdDtmLmFzc2lnbmVkU2xvdD09PWMmJihmLmFzc2lnbmVkU2xvdD1udWxsKX19Zm9yKGI9dGhpcy5ob3N0Ll9fc2hhZHlfZmlyc3RDaGlsZDtiO2I9Yi5fX3NoYWR5X25leHRTaWJsaW5nKVZjKHRoaXMsYik7Zm9yKGI9MDtiPHRoaXMuYS5sZW5ndGg7YisrKXtjPXRoaXMuYVtiXTtlPXYoYyk7aWYoIWUuYXNzaWduZWROb2Rlcy5sZW5ndGgpZm9yKGQ9Yy5fX3NoYWR5X2ZpcnN0Q2hpbGQ7ZDtkPWQuX19zaGFkeV9uZXh0U2libGluZylWYyh0aGlzLApkLGMpOyhkPShkPXYoYy5fX3NoYWR5X3BhcmVudE5vZGUpKSYmZC5yb290KSYmKE1hKGQpfHxkLkIpJiZkLl9yZW5kZXJTZWxmKCk7V2ModGhpcyxlLkQsZS5hc3NpZ25lZE5vZGVzKTtpZihkPWUuY2Epe2ZvcihmPTA7ZjxkLmxlbmd0aDtmKyspdihkW2ZdKS5QPW51bGw7ZS5jYT1udWxsO2QubGVuZ3RoPmUuYXNzaWduZWROb2Rlcy5sZW5ndGgmJihlLlQ9ITApfWUuVCYmKGUuVD0hMSxYYyh0aGlzLGMpKX1jPXRoaXMuYTtiPVtdO2ZvcihlPTA7ZTxjLmxlbmd0aDtlKyspZD1jW2VdLl9fc2hhZHlfcGFyZW50Tm9kZSwoZj12KGQpKSYmZi5yb290fHwhKDA+Yi5pbmRleE9mKGQpKXx8Yi5wdXNoKGQpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspe2Y9YltjXTtlPWY9PT10aGlzP3RoaXMuaG9zdDpmO2Q9W107Zj1mLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl7dmFyIGg9ZltnXTtpZigic2xvdCI9PWgubG9jYWxOYW1lKXtoPXYoaCkuRDtmb3IodmFyIGs9CjA7azxoLmxlbmd0aDtrKyspZC5wdXNoKGhba10pfWVsc2UgZC5wdXNoKGgpfWY9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5fX3NoYWR5X25hdGl2ZV9jaGlsZE5vZGVzKTtnPWVjKGQsZC5sZW5ndGgsZixmLmxlbmd0aCk7az1oPTA7Zm9yKHZhciBsPXZvaWQgMDtoPGcubGVuZ3RoJiYobD1nW2hdKTtoKyspe2Zvcih2YXIgbT0wLHE9dm9pZCAwO208bC5MLmxlbmd0aCYmKHE9bC5MW21dKTttKyspcS5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlPT09ZSYmZS5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChxKSxmLnNwbGljZShsLmluZGV4K2ssMSk7ay09bC5SfWs9MDtmb3IobD12b2lkIDA7azxnLmxlbmd0aCYmKGw9Z1trXSk7aysrKWZvcihoPWZbbC5pbmRleF0sbT1sLmluZGV4O208bC5pbmRleCtsLlI7bSsrKXE9ZFttXSxlLl9fc2hhZHlfbmF0aXZlX2luc2VydEJlZm9yZShxLGgpLGYuc3BsaWNlKG0sMCxxKX19aWYoIXcucHJlZmVyUGVyZm9ybWFuY2UmJiF0aGlzLmJhKWZvcihiPQp0aGlzLmhvc3QuX19zaGFkeV9jaGlsZE5vZGVzLGM9MCxlPWIubGVuZ3RoO2M8ZTtjKyspZD1iW2NdLGY9dihkKSxkLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGUhPT10aGlzLmhvc3R8fCJzbG90IiE9PWQubG9jYWxOYW1lJiZmLmFzc2lnbmVkU2xvdHx8dGhpcy5ob3N0Ll9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGQpO3RoaXMuYmE9ITA7UGM9YTtRYyYmUWMoKX07ZnVuY3Rpb24gVmMoYSxiLGMpe3ZhciBkPXUoYiksZT1kLlA7ZC5QPW51bGw7Y3x8KGM9KGE9YS5iW2IuX19zaGFkeV9zbG90fHwiX19jYXRjaGFsbCJdKSYmYVswXSk7Yz8odShjKS5hc3NpZ25lZE5vZGVzLnB1c2goYiksZC5hc3NpZ25lZFNsb3Q9Yyk6ZC5hc3NpZ25lZFNsb3Q9dm9pZCAwO2UhPT1kLmFzc2lnbmVkU2xvdCYmZC5hc3NpZ25lZFNsb3QmJih1KGQuYXNzaWduZWRTbG90KS5UPSEwKX0KZnVuY3Rpb24gV2MoYSxiLGMpe2Zvcih2YXIgZD0wLGU9dm9pZCAwO2Q8Yy5sZW5ndGgmJihlPWNbZF0pO2QrKylpZigic2xvdCI9PWUubG9jYWxOYW1lKXt2YXIgZj12KGUpLmFzc2lnbmVkTm9kZXM7ZiYmZi5sZW5ndGgmJldjKGEsYixmKX1lbHNlIGIucHVzaChjW2RdKX1mdW5jdGlvbiBYYyhhLGIpe2IuX19zaGFkeV9uYXRpdmVfZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInNsb3RjaGFuZ2UiKSk7Yj12KGIpO2IuYXNzaWduZWRTbG90JiZYYyhhLGIuYXNzaWduZWRTbG90KX0KZnVuY3Rpb24gVWMoYSl7aWYoYS5jJiZhLmMubGVuZ3RoKXtmb3IodmFyIGI9YS5jLGMsZD0wO2Q8Yi5sZW5ndGg7ZCsrKXt2YXIgZT1iW2RdO2pjKGUpO3ZhciBmPWUuX19zaGFkeV9wYXJlbnROb2RlO2pjKGYpO2Y9dihmKTtmLk49KGYuTnx8MCkrMTtmPVljKGUpO2EuYltmXT8oYz1jfHx7fSxjW2ZdPSEwLGEuYltmXS5wdXNoKGUpKTphLmJbZl09W2VdO2EuYS5wdXNoKGUpfWlmKGMpZm9yKHZhciBnIGluIGMpYS5iW2ddPVpjKGEuYltnXSk7YS5jPVtdfX1mdW5jdGlvbiBZYyhhKXt2YXIgYj1hLm5hbWV8fGEuZ2V0QXR0cmlidXRlKCJuYW1lIil8fCJfX2NhdGNoYWxsIjtyZXR1cm4gYS53YT1ifQpmdW5jdGlvbiBaYyhhKXtyZXR1cm4gYS5zb3J0KGZ1bmN0aW9uKGEsYyl7YT1SYyhhKTtmb3IodmFyIGI9UmMoYyksZT0wO2U8YS5sZW5ndGg7ZSsrKXtjPWFbZV07dmFyIGY9YltlXTtpZihjIT09ZilyZXR1cm4gYT1BcnJheS5mcm9tKGMuX19zaGFkeV9wYXJlbnROb2RlLl9fc2hhZHlfY2hpbGROb2RlcyksYS5pbmRleE9mKGMpLWEuaW5kZXhPZihmKX19KX0KZnVuY3Rpb24gQmMoYSxiKXtpZihhLmEpe1VjKGEpO3ZhciBjPWEuYixkO2ZvcihkIGluIGMpZm9yKHZhciBlPWNbZF0sZj0wO2Y8ZS5sZW5ndGg7ZisrKXt2YXIgZz1lW2ZdO2lmKFVhKGIsZykpe2Uuc3BsaWNlKGYsMSk7dmFyIGg9YS5hLmluZGV4T2YoZyk7MDw9aCYmKGEuYS5zcGxpY2UoaCwxKSwoaD12KGcuX19zaGFkeV9wYXJlbnROb2RlKSkmJmguTiYmaC5OLS0pO2YtLTtnPXYoZyk7aWYoaD1nLkQpZm9yKHZhciBrPTA7azxoLmxlbmd0aDtrKyspe3ZhciBsPWhba10sbT1sLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGU7bSYmbS5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChsKX1nLkQ9W107Zy5hc3NpZ25lZE5vZGVzPVtdO2g9ITB9fXJldHVybiBofX1mdW5jdGlvbiBNYShhKXtVYyhhKTtyZXR1cm4hKCFhLmF8fCFhLmEubGVuZ3RoKX0KKGZ1bmN0aW9uKGEpe2EuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlO05jKGEsIl9fc2hhZHlfIik7TmMoYSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYSx7bm9kZVR5cGU6e3ZhbHVlOk5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSxjb25maWd1cmFibGU6ITB9LG5vZGVOYW1lOnt2YWx1ZToiI2RvY3VtZW50LWZyYWdtZW50Iixjb25maWd1cmFibGU6ITB9LG5vZGVWYWx1ZTp7dmFsdWU6bnVsbCxjb25maWd1cmFibGU6ITB9fSk7WyJsb2NhbE5hbWUiLCJuYW1lc3BhY2VVUkkiLCJwcmVmaXgiXS5mb3JFYWNoKGZ1bmN0aW9uKGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse3ZhbHVlOnZvaWQgMCxjb25maWd1cmFibGU6ITB9KX0pO1sib3duZXJEb2N1bWVudCIsImJhc2VVUkkiLCJpc0Nvbm5lY3RlZCJdLmZvckVhY2goZnVuY3Rpb24oYil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaG9zdFtiXX0sCmNvbmZpZ3VyYWJsZTohMH0pfSl9KShTYy5wcm90b3R5cGUpOwppZih3aW5kb3cuY3VzdG9tRWxlbWVudHMmJncuZWEmJiF3LnByZWZlclBlcmZvcm1hbmNlKXt2YXIgJGM9bmV3IE1hcDtRYz1mdW5jdGlvbigpe3ZhciBhPVtdOyRjLmZvckVhY2goZnVuY3Rpb24oYixjKXthLnB1c2goW2MsYl0pfSk7JGMuY2xlYXIoKTtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXVswXTthW2JdWzFdP2MudWEoKTpjLnZhKCl9fTtQYyYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsZnVuY3Rpb24oKXtQYz0hMTtRYygpfSx7b25jZTohMH0pO3ZhciBhZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9MCxlPSJfX2lzQ29ubmVjdGVkIitkKys7aWYoYnx8YylhLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaz1hLnByb3RvdHlwZS51YT1mdW5jdGlvbigpe1BjPyRjLnNldCh0aGlzLCEwKTp0aGlzW2VdfHwodGhpc1tlXT0hMCxiJiZiLmNhbGwodGhpcykpfSxhLnByb3RvdHlwZS5kaXNjb25uZWN0ZWRDYWxsYmFjaz0KYS5wcm90b3R5cGUudmE9ZnVuY3Rpb24oKXtQYz90aGlzLmlzQ29ubmVjdGVkfHwkYy5zZXQodGhpcywhMSk6dGhpc1tlXSYmKHRoaXNbZV09ITEsYyYmYy5jYWxsKHRoaXMpKX07cmV0dXJuIGF9LGJkPXdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5DdXN0b21FbGVtZW50UmVnaXN0cnkucHJvdG90eXBlLCJkZWZpbmUiLHt2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWIucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrLGQ9Yi5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s7YmQuY2FsbCh3aW5kb3cuY3VzdG9tRWxlbWVudHMsYSxhZChiLGMsZCkpO2IucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrPWM7Yi5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s9ZH19KX1mdW5jdGlvbiB4YyhhKXthPWEuX19zaGFkeV9nZXRSb290Tm9kZSgpO2lmKHooYSkpcmV0dXJuIGF9O2Z1bmN0aW9uIGNkKGEpe3RoaXMubm9kZT1hfW49Y2QucHJvdG90eXBlO24uYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2FkZEV2ZW50TGlzdGVuZXIoYSxiLGMpfTtuLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKX07bi5hcHBlbmRDaGlsZD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXBwZW5kQ2hpbGQoYSl9O24uaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2luc2VydEJlZm9yZShhLGIpfTtuLnJlbW92ZUNoaWxkPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVDaGlsZChhKX07bi5yZXBsYWNlQ2hpbGQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcmVwbGFjZUNoaWxkKGEsYil9OwpuLmNsb25lTm9kZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2xvbmVOb2RlKGEpfTtuLmdldFJvb3ROb2RlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9nZXRSb290Tm9kZShhKX07bi5jb250YWlucz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY29udGFpbnMoYSl9O24uZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZGlzcGF0Y2hFdmVudChhKX07bi5zZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxiKXt0aGlzLm5vZGUuX19zaGFkeV9zZXRBdHRyaWJ1dGUoYSxiKX07bi5nZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X25hdGl2ZV9nZXRBdHRyaWJ1dGUoYSl9O24uaGFzQXR0cmlidXRlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9uYXRpdmVfaGFzQXR0cmlidXRlKGEpfTtuLnJlbW92ZUF0dHJpYnV0ZT1mdW5jdGlvbihhKXt0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVBdHRyaWJ1dGUoYSl9OwpuLmF0dGFjaFNoYWRvdz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXR0YWNoU2hhZG93KGEpfTtuLmZvY3VzPWZ1bmN0aW9uKCl7dGhpcy5ub2RlLl9fc2hhZHlfbmF0aXZlX2ZvY3VzKCl9O24uYmx1cj1mdW5jdGlvbigpe3RoaXMubm9kZS5fX3NoYWR5X2JsdXIoKX07bi5pbXBvcnROb2RlPWZ1bmN0aW9uKGEsYil7aWYodGhpcy5ub2RlLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9pbXBvcnROb2RlKGEsYil9O24uZ2V0RWxlbWVudEJ5SWQ9ZnVuY3Rpb24oYSl7aWYodGhpcy5ub2RlLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9nZXRFbGVtZW50QnlJZChhKX07bi5xdWVyeVNlbGVjdG9yPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9xdWVyeVNlbGVjdG9yKGEpfTsKbi5xdWVyeVNlbGVjdG9yQWxsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3F1ZXJ5U2VsZWN0b3JBbGwoYSxiKX07bi5hc3NpZ25lZE5vZGVzPWZ1bmN0aW9uKGEpe2lmKCJzbG90Ij09PXRoaXMubm9kZS5sb2NhbE5hbWUpcmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2Fzc2lnbmVkTm9kZXMoYSl9OwpwLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNkLnByb3RvdHlwZSx7YWN0aXZlRWxlbWVudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7aWYoeih0aGlzLm5vZGUpfHx0aGlzLm5vZGUubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX05PREUpcmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2FjdGl2ZUVsZW1lbnR9fSxfYWN0aXZlRWxlbWVudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlRWxlbWVudH19LGhvc3Q6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKHoodGhpcy5ub2RlKSlyZXR1cm4gdGhpcy5ub2RlLmhvc3R9fSxwYXJlbnROb2RlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcGFyZW50Tm9kZX19LGZpcnN0Q2hpbGQ6e2NvbmZpZ3VyYWJsZTohMCwKZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZmlyc3RDaGlsZH19LGxhc3RDaGlsZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2xhc3RDaGlsZH19LG5leHRTaWJsaW5nOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfbmV4dFNpYmxpbmd9fSxwcmV2aW91c1NpYmxpbmc6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9wcmV2aW91c1NpYmxpbmd9fSxjaGlsZE5vZGVzOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2hpbGROb2Rlc319LHBhcmVudEVsZW1lbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLApnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcGFyZW50RWxlbWVudH19LGZpcnN0RWxlbWVudENoaWxkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZmlyc3RFbGVtZW50Q2hpbGR9fSxsYXN0RWxlbWVudENoaWxkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfbGFzdEVsZW1lbnRDaGlsZH19LG5leHRFbGVtZW50U2libGluZzp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X25leHRFbGVtZW50U2libGluZ319LHByZXZpb3VzRWxlbWVudFNpYmxpbmc6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9wcmV2aW91c0VsZW1lbnRTaWJsaW5nfX0sCmNoaWxkcmVuOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2hpbGRyZW59fSxjaGlsZEVsZW1lbnRDb3VudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2NoaWxkRWxlbWVudENvdW50fX0sc2hhZG93Um9vdDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3NoYWRvd1Jvb3R9fSxhc3NpZ25lZFNsb3Q6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9hc3NpZ25lZFNsb3R9fSxpc0Nvbm5lY3RlZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2lzQ29ubmVjdGVkfX0saW5uZXJIVE1MOntjb25maWd1cmFibGU6ITAsCmVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2lubmVySFRNTH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X2lubmVySFRNTD1hfX0sdGV4dENvbnRlbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV90ZXh0Q29udGVudH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X3RleHRDb250ZW50PWF9fSxzbG90Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfc2xvdH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X3Nsb3Q9YX19fSk7CmNjLmZvckVhY2goZnVuY3Rpb24oYSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNkLnByb3RvdHlwZSxhLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlWyJfX3NoYWR5XyIrYV19LHNldDpmdW5jdGlvbihiKXt0aGlzLm5vZGVbIl9fc2hhZHlfIithXT1ifSxjb25maWd1cmFibGU6ITB9KX0pO3ZhciBkZD1uZXcgV2Vha01hcDtmdW5jdGlvbiBlZChhKXtpZih6KGEpfHxhIGluc3RhbmNlb2YgY2QpcmV0dXJuIGE7dmFyIGI9ZGQuZ2V0KGEpO2J8fChiPW5ldyBjZChhKSxkZC5zZXQoYSxiKSk7cmV0dXJuIGJ9O3ZhciBmZD1CKHtkaXNwYXRjaEV2ZW50OmZ1bmN0aW9uKGEpe1phKCk7cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfZGlzcGF0Y2hFdmVudChhKX0sYWRkRXZlbnRMaXN0ZW5lcjpVYixyZW1vdmVFdmVudExpc3RlbmVyOldifSk7dmFyIGdkPUIoe2dldCBhc3NpZ25lZFNsb3QoKXt2YXIgYT10aGlzLl9fc2hhZHlfcGFyZW50Tm9kZTsoYT1hJiZhLl9fc2hhZHlfc2hhZG93Um9vdCkmJlRjKGEpO3JldHVybihhPXYodGhpcykpJiZhLmFzc2lnbmVkU2xvdHx8bnVsbH19KTt2YXIgaGQ9d2luZG93LmRvY3VtZW50O2Z1bmN0aW9uIGlkKGEsYil7aWYoInNsb3QiPT09YilhPWEuX19zaGFkeV9wYXJlbnROb2RlLExhKGEpJiZBYyh2KGEpLnJvb3QpO2Vsc2UgaWYoInNsb3QiPT09YS5sb2NhbE5hbWUmJiJuYW1lIj09PWImJihiPXhjKGEpKSl7aWYoYi5hKXtVYyhiKTt2YXIgYz1hLndhLGQ9WWMoYSk7aWYoZCE9PWMpe2M9Yi5iW2NdO3ZhciBlPWMuaW5kZXhPZihhKTswPD1lJiZjLnNwbGljZShlLDEpO2M9Yi5iW2RdfHwoYi5iW2RdPVtdKTtjLnB1c2goYSk7MTxjLmxlbmd0aCYmKGIuYltkXT1aYyhjKSl9fUFjKGIpfX0KdmFyIGpkPUIoe2dldCBwcmV2aW91c0VsZW1lbnRTaWJsaW5nKCl7dmFyIGE9dih0aGlzKTtpZihhJiZ2b2lkIDAhPT1hLnByZXZpb3VzU2libGluZyl7Zm9yKGE9dGhpcy5fX3NoYWR5X3ByZXZpb3VzU2libGluZzthJiZhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KWE9YS5fX3NoYWR5X3ByZXZpb3VzU2libGluZztyZXR1cm4gYX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9wcmV2aW91c0VsZW1lbnRTaWJsaW5nfSxnZXQgbmV4dEVsZW1lbnRTaWJsaW5nKCl7dmFyIGE9dih0aGlzKTtpZihhJiZ2b2lkIDAhPT1hLm5leHRTaWJsaW5nKXtmb3IoYT10aGlzLl9fc2hhZHlfbmV4dFNpYmxpbmc7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEuX19zaGFkeV9uZXh0U2libGluZztyZXR1cm4gYX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9uZXh0RWxlbWVudFNpYmxpbmd9LGdldCBzbG90KCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCJzbG90Iil9LApzZXQgc2xvdChhKXt0aGlzLl9fc2hhZHlfc2V0QXR0cmlidXRlKCJzbG90IixhKX0sZ2V0IHNoYWRvd1Jvb3QoKXt2YXIgYT12KHRoaXMpO3JldHVybiBhJiZhLnBhfHxudWxsfSxnZXQgY2xhc3NOYW1lKCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sc2V0IGNsYXNzTmFtZShhKXt0aGlzLl9fc2hhZHlfc2V0QXR0cmlidXRlKCJjbGFzcyIsYSl9LHNldEF0dHJpYnV0ZTpmdW5jdGlvbihhLGIpe2lmKHRoaXMub3duZXJEb2N1bWVudCE9PWhkKXRoaXMuX19zaGFkeV9uYXRpdmVfc2V0QXR0cmlidXRlKGEsYik7ZWxzZXt2YXIgYzsoYz1HKCkpJiYiY2xhc3MiPT09YT8oYy5zZXRFbGVtZW50Q2xhc3ModGhpcyxiKSxjPSEwKTpjPSExO2N8fCh0aGlzLl9fc2hhZHlfbmF0aXZlX3NldEF0dHJpYnV0ZShhLGIpLGlkKHRoaXMsYSkpfX0scmVtb3ZlQXR0cmlidXRlOmZ1bmN0aW9uKGEpe3RoaXMuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQXR0cmlidXRlKGEpO2lkKHRoaXMsCmEpfSxhdHRhY2hTaGFkb3c6ZnVuY3Rpb24oYSl7aWYoIXRoaXMpdGhyb3cgRXJyb3IoIk11c3QgcHJvdmlkZSBhIGhvc3QuIik7aWYoIWEpdGhyb3cgRXJyb3IoIk5vdCBlbm91Z2ggYXJndW1lbnRzLiIpO3JldHVybiBuZXcgU2MoT2MsdGhpcyxhKX19KTt2YXIga2Q9Qih7Ymx1cjpmdW5jdGlvbigpe3ZhciBhPXYodGhpcyk7KGE9KGE9YSYmYS5yb290KSYmYS5hY3RpdmVFbGVtZW50KT9hLl9fc2hhZHlfYmx1cigpOnRoaXMuX19zaGFkeV9uYXRpdmVfYmx1cigpfX0pO2NjLmZvckVhY2goZnVuY3Rpb24oYSl7a2RbYV09e3NldDpmdW5jdGlvbihiKXt2YXIgYz11KHRoaXMpLGQ9YS5zdWJzdHJpbmcoMik7Yy5PW2FdJiZ0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZCxjLk9bYV0pO3RoaXMuX19zaGFkeV9hZGRFdmVudExpc3RlbmVyKGQsYik7Yy5PW2FdPWJ9LGdldDpmdW5jdGlvbigpe3ZhciBiPXYodGhpcyk7cmV0dXJuIGImJmIuT1thXX0sY29uZmlndXJhYmxlOiEwfX0pO3ZhciBsZD1CKHthc3NpZ25lZE5vZGVzOmZ1bmN0aW9uKGEpe2lmKCJzbG90Ij09PXRoaXMubG9jYWxOYW1lKXt2YXIgYj10aGlzLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKTtiJiZ6KGIpJiZUYyhiKTtyZXR1cm4oYj12KHRoaXMpKT8oYSYmYS5mbGF0dGVuP2IuRDpiLmFzc2lnbmVkTm9kZXMpfHxbXTpbXX19fSk7dmFyIG1kPXdpbmRvdy5kb2N1bWVudCxuZD1CKHtpbXBvcnROb2RlOmZ1bmN0aW9uKGEsYil7aWYoYS5vd25lckRvY3VtZW50IT09bWR8fCJ0ZW1wbGF0ZSI9PT1hLmxvY2FsTmFtZSlyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9pbXBvcnROb2RlKGEsYik7dmFyIGM9dGhpcy5fX3NoYWR5X25hdGl2ZV9pbXBvcnROb2RlKGEsITEpO2lmKGIpe2E9YS5fX3NoYWR5X2NoaWxkTm9kZXM7Yj0wO2Zvcih2YXIgZDtiPGEubGVuZ3RoO2IrKylkPXRoaXMuX19zaGFkeV9pbXBvcnROb2RlKGFbYl0sITApLGMuX19zaGFkeV9hcHBlbmRDaGlsZChkKX1yZXR1cm4gY319KTt2YXIgb2Q9Qih7YWRkRXZlbnRMaXN0ZW5lcjpVYi5iaW5kKHdpbmRvdykscmVtb3ZlRXZlbnRMaXN0ZW5lcjpXYi5iaW5kKHdpbmRvdyl9KTt2YXIgcGQ9e307T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsInBhcmVudEVsZW1lbnQiKSYmKHBkLnBhcmVudEVsZW1lbnQ9Q2MucGFyZW50RWxlbWVudCk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNvbnRhaW5zIikmJihwZC5jb250YWlucz1DYy5jb250YWlucyk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNoaWxkcmVuIikmJihwZC5jaGlsZHJlbj1GYy5jaGlsZHJlbik7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpJiYocGQuaW5uZXJIVE1MPUxjLmlubmVySFRNTCk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNsYXNzTmFtZSIpJiYocGQuY2xhc3NOYW1lPWpkLmNsYXNzTmFtZSk7CnZhciBxZD17RXZlbnRUYXJnZXQ6W2ZkXSxOb2RlOltDYyx3aW5kb3cuRXZlbnRUYXJnZXQ/bnVsbDpmZF0sVGV4dDpbZ2RdLEVsZW1lbnQ6W2pkLEZjLGdkLCF3Lm18fCJpbm5lckhUTUwiaW4gRWxlbWVudC5wcm90b3R5cGU/TGM6bnVsbCx3aW5kb3cuSFRNTFNsb3RFbGVtZW50P251bGw6bGRdLEhUTUxFbGVtZW50OltrZCxwZF0sSFRNTFNsb3RFbGVtZW50OltsZF0sRG9jdW1lbnRGcmFnbWVudDpbSGMsSWNdLERvY3VtZW50OltuZCxIYyxJYyxKY10sV2luZG93OltvZF19LHJkPXcubT9udWxsOlsiaW5uZXJIVE1MIiwidGV4dENvbnRlbnQiXTtmdW5jdGlvbiBzZChhKXt2YXIgYj1hP251bGw6cmQsYz17fSxkO2ZvcihkIGluIHFkKWMuVz13aW5kb3dbZF0mJndpbmRvd1tkXS5wcm90b3R5cGUscWRbZF0uZm9yRWFjaChmdW5jdGlvbihjKXtyZXR1cm4gZnVuY3Rpb24oZCl7cmV0dXJuIGMuVyYmZCYmQShjLlcsZCxhLGIpfX0oYykpLGM9e1c6Yy5XfX07aWYody5lYSl7dmFyIFNoYWR5RE9NPXtpblVzZTp3LmVhLHBhdGNoOmZ1bmN0aW9uKGEpe0ZiKGEpO0ViKGEpO3JldHVybiBhfSxpc1NoYWR5Um9vdDp6LGVucXVldWU6WWEsZmx1c2g6WmEsZmx1c2hJbml0aWFsOmZ1bmN0aW9uKGEpeyFhLmJhJiZhLkImJlRjKGEpfSxzZXR0aW5nczp3LGZpbHRlck11dGF0aW9uczpkYixvYnNlcnZlQ2hpbGRyZW46YmIsdW5vYnNlcnZlQ2hpbGRyZW46Y2IsZGVmZXJDb25uZWN0aW9uQ2FsbGJhY2tzOncuZGVmZXJDb25uZWN0aW9uQ2FsbGJhY2tzLHByZWZlclBlcmZvcm1hbmNlOncucHJlZmVyUGVyZm9ybWFuY2UsaGFuZGxlc0R5bmFtaWNTY29waW5nOiEwLHdyYXA6dy5KP2VkOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxXcmFwcGVyOmNkLGNvbXBvc2VkUGF0aDpNYixub1BhdGNoOncuSixuYXRpdmVNZXRob2RzOnFiLG5hdGl2ZVRyZWU6cmJ9O3dpbmRvdy5TaGFkeURPTT1TaGFkeURPTTt5YigpO3NkKCJfX3NoYWR5XyIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwKIl9hY3RpdmVFbGVtZW50IixKYy5hY3RpdmVFbGVtZW50KTtBKFdpbmRvdy5wcm90b3R5cGUsb2QsIl9fc2hhZHlfIik7dy5KfHwoc2QoKSxiYygpKTtYYigpO3dpbmRvdy5FdmVudD1aYjt3aW5kb3cuQ3VzdG9tRXZlbnQ9JGI7d2luZG93Lk1vdXNlRXZlbnQ9YWM7d2luZG93LlNoYWRvd1Jvb3Q9U2N9O3ZhciB0ZD1uZXcgU2V0KCJhbm5vdGF0aW9uLXhtbCBjb2xvci1wcm9maWxlIGZvbnQtZmFjZSBmb250LWZhY2Utc3JjIGZvbnQtZmFjZS11cmkgZm9udC1mYWNlLWZvcm1hdCBmb250LWZhY2UtbmFtZSBtaXNzaW5nLWdseXBoIi5zcGxpdCgiICIpKTtmdW5jdGlvbiB1ZChhKXt2YXIgYj10ZC5oYXMoYSk7YT0vXlthLXpdWy4wLTlfYS16XSotW1wtLjAtOV9hLXpdKiQvLnRlc3QoYSk7cmV0dXJuIWImJmF9ZnVuY3Rpb24gSChhKXt2YXIgYj1hLmlzQ29ubmVjdGVkO2lmKHZvaWQgMCE9PWIpcmV0dXJuIGI7Zm9yKDthJiYhKGEuX19DRV9pc0ltcG9ydERvY3VtZW50fHxhIGluc3RhbmNlb2YgRG9jdW1lbnQpOylhPWEucGFyZW50Tm9kZXx8KHdpbmRvdy5TaGFkb3dSb290JiZhIGluc3RhbmNlb2YgU2hhZG93Um9vdD9hLmhvc3Q6dm9pZCAwKTtyZXR1cm4hKCFhfHwhKGEuX19DRV9pc0ltcG9ydERvY3VtZW50fHxhIGluc3RhbmNlb2YgRG9jdW1lbnQpKX0KZnVuY3Rpb24gdmQoYSxiKXtmb3IoO2ImJmIhPT1hJiYhYi5uZXh0U2libGluZzspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGImJmIhPT1hP2IubmV4dFNpYmxpbmc6bnVsbH0KZnVuY3Rpb24gd2QoYSxiLGMpe2M9dm9pZCAwPT09Yz9uZXcgU2V0OmM7Zm9yKHZhciBkPWE7ZDspe2lmKGQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSl7dmFyIGU9ZDtiKGUpO3ZhciBmPWUubG9jYWxOYW1lO2lmKCJsaW5rIj09PWYmJiJpbXBvcnQiPT09ZS5nZXRBdHRyaWJ1dGUoInJlbCIpKXtkPWUuaW1wb3J0O2lmKGQgaW5zdGFuY2VvZiBOb2RlJiYhYy5oYXMoZCkpZm9yKGMuYWRkKGQpLGQ9ZC5maXJzdENoaWxkO2Q7ZD1kLm5leHRTaWJsaW5nKXdkKGQsYixjKTtkPXZkKGEsZSk7Y29udGludWV9ZWxzZSBpZigidGVtcGxhdGUiPT09Zil7ZD12ZChhLGUpO2NvbnRpbnVlfWlmKGU9ZS5fX0NFX3NoYWRvd1Jvb3QpZm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKXdkKGUsYixjKX1kPWQuZmlyc3RDaGlsZD9kLmZpcnN0Q2hpbGQ6dmQoYSxkKX19ZnVuY3Rpb24gSShhLGIsYyl7YVtiXT1jfTtmdW5jdGlvbiB4ZCgpe3RoaXMuYT1uZXcgTWFwO3RoaXMuZz1uZXcgTWFwO3RoaXMuZj1bXTt0aGlzLmM9ITF9ZnVuY3Rpb24geWQoYSxiLGMpe2EuYS5zZXQoYixjKTthLmcuc2V0KGMuY29uc3RydWN0b3JGdW5jdGlvbixjKX1mdW5jdGlvbiB6ZChhLGIpe2EuYz0hMDthLmYucHVzaChiKX1mdW5jdGlvbiBBZChhLGIpe2EuYyYmd2QoYixmdW5jdGlvbihiKXtyZXR1cm4gYS5iKGIpfSl9eGQucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7aWYodGhpcy5jJiYhYS5fX0NFX3BhdGNoZWQpe2EuX19DRV9wYXRjaGVkPSEwO2Zvcih2YXIgYj0wO2I8dGhpcy5mLmxlbmd0aDtiKyspdGhpcy5mW2JdKGEpfX07ZnVuY3Rpb24gSihhLGIpe3ZhciBjPVtdO3dkKGIsZnVuY3Rpb24oYSl7cmV0dXJuIGMucHVzaChhKX0pO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspe3ZhciBkPWNbYl07MT09PWQuX19DRV9zdGF0ZT9hLmNvbm5lY3RlZENhbGxiYWNrKGQpOkJkKGEsZCl9fQpmdW5jdGlvbiBLKGEsYil7dmFyIGM9W107d2QoYixmdW5jdGlvbihhKXtyZXR1cm4gYy5wdXNoKGEpfSk7Zm9yKGI9MDtiPGMubGVuZ3RoO2IrKyl7dmFyIGQ9Y1tiXTsxPT09ZC5fX0NFX3N0YXRlJiZhLmRpc2Nvbm5lY3RlZENhbGxiYWNrKGQpfX0KZnVuY3Rpb24gTChhLGIsYyl7Yz12b2lkIDA9PT1jP3t9OmM7dmFyIGQ9Yy5YYXx8bmV3IFNldCxlPWMuWXx8ZnVuY3Rpb24oYil7cmV0dXJuIEJkKGEsYil9LGY9W107d2QoYixmdW5jdGlvbihiKXtpZigibGluayI9PT1iLmxvY2FsTmFtZSYmImltcG9ydCI9PT1iLmdldEF0dHJpYnV0ZSgicmVsIikpe3ZhciBjPWIuaW1wb3J0O2MgaW5zdGFuY2VvZiBOb2RlJiYoYy5fX0NFX2lzSW1wb3J0RG9jdW1lbnQ9ITAsYy5fX0NFX2hhc1JlZ2lzdHJ5PSEwKTtjJiYiY29tcGxldGUiPT09Yy5yZWFkeVN0YXRlP2MuX19DRV9kb2N1bWVudExvYWRIYW5kbGVkPSEwOmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZnVuY3Rpb24oKXt2YXIgYz1iLmltcG9ydDtpZighYy5fX0NFX2RvY3VtZW50TG9hZEhhbmRsZWQpe2MuX19DRV9kb2N1bWVudExvYWRIYW5kbGVkPSEwO3ZhciBmPW5ldyBTZXQoZCk7Zi5kZWxldGUoYyk7TChhLGMse1hhOmYsWTplfSl9fSl9ZWxzZSBmLnB1c2goYil9LGQpO2lmKGEuYylmb3IoYj0KMDtiPGYubGVuZ3RoO2IrKylhLmIoZltiXSk7Zm9yKGI9MDtiPGYubGVuZ3RoO2IrKyllKGZbYl0pfQpmdW5jdGlvbiBCZChhLGIpe2lmKHZvaWQgMD09PWIuX19DRV9zdGF0ZSl7dmFyIGM9Yi5vd25lckRvY3VtZW50O2lmKGMuZGVmYXVsdFZpZXd8fGMuX19DRV9pc0ltcG9ydERvY3VtZW50JiZjLl9fQ0VfaGFzUmVnaXN0cnkpaWYoYz1hLmEuZ2V0KGIubG9jYWxOYW1lKSl7Yy5jb25zdHJ1Y3Rpb25TdGFjay5wdXNoKGIpO3ZhciBkPWMuY29uc3RydWN0b3JGdW5jdGlvbjt0cnl7dHJ5e2lmKG5ldyBkIT09Yil0aHJvdyBFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9yIGRpZCBub3QgcHJvZHVjZSB0aGUgZWxlbWVudCBiZWluZyB1cGdyYWRlZC4iKTt9ZmluYWxseXtjLmNvbnN0cnVjdGlvblN0YWNrLnBvcCgpfX1jYXRjaChnKXt0aHJvdyBiLl9fQ0Vfc3RhdGU9MixnO31iLl9fQ0Vfc3RhdGU9MTtiLl9fQ0VfZGVmaW5pdGlvbj1jO2lmKGMuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKWZvcihjPWMub2JzZXJ2ZWRBdHRyaWJ1dGVzLGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9CmNbZF0sZj1iLmdldEF0dHJpYnV0ZShlKTtudWxsIT09ZiYmYS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soYixlLG51bGwsZixudWxsKX1IKGIpJiZhLmNvbm5lY3RlZENhbGxiYWNrKGIpfX19eGQucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrPWZ1bmN0aW9uKGEpe3ZhciBiPWEuX19DRV9kZWZpbml0aW9uO2IuY29ubmVjdGVkQ2FsbGJhY2smJmIuY29ubmVjdGVkQ2FsbGJhY2suY2FsbChhKX07eGQucHJvdG90eXBlLmRpc2Nvbm5lY3RlZENhbGxiYWNrPWZ1bmN0aW9uKGEpe3ZhciBiPWEuX19DRV9kZWZpbml0aW9uO2IuZGlzY29ubmVjdGVkQ2FsbGJhY2smJmIuZGlzY29ubmVjdGVkQ2FsbGJhY2suY2FsbChhKX07CnhkLnByb3RvdHlwZS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2s9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLl9fQ0VfZGVmaW5pdGlvbjtmLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayYmLTE8Zi5vYnNlcnZlZEF0dHJpYnV0ZXMuaW5kZXhPZihiKSYmZi5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2suY2FsbChhLGIsYyxkLGUpfTtmdW5jdGlvbiBDZChhKXt2YXIgYj1kb2N1bWVudDt0aGlzLmI9YTt0aGlzLmE9Yjt0aGlzLkY9dm9pZCAwO0wodGhpcy5iLHRoaXMuYSk7ImxvYWRpbmciPT09dGhpcy5hLnJlYWR5U3RhdGUmJih0aGlzLkY9bmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5jLmJpbmQodGhpcykpLHRoaXMuRi5vYnNlcnZlKHRoaXMuYSx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSl9ZnVuY3Rpb24gRGQoYSl7YS5GJiZhLkYuZGlzY29ubmVjdCgpfUNkLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYS5yZWFkeVN0YXRlOyJpbnRlcmFjdGl2ZSIhPT1iJiYiY29tcGxldGUiIT09Ynx8RGQodGhpcyk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylmb3IodmFyIGM9YVtiXS5hZGRlZE5vZGVzLGQ9MDtkPGMubGVuZ3RoO2QrKylMKHRoaXMuYixjW2RdKX07ZnVuY3Rpb24gRWQoKXt2YXIgYT10aGlzO3RoaXMuYT10aGlzLmg9dm9pZCAwO3RoaXMuYj1uZXcgUHJvbWlzZShmdW5jdGlvbihiKXthLmE9YjthLmgmJmIoYS5oKX0pfUVkLnByb3RvdHlwZS5yZXNvbHZlPWZ1bmN0aW9uKGEpe2lmKHRoaXMuaCl0aHJvdyBFcnJvcigiQWxyZWFkeSByZXNvbHZlZC4iKTt0aGlzLmg9YTt0aGlzLmEmJnRoaXMuYShhKX07ZnVuY3Rpb24gTihhKXt0aGlzLmM9ITE7dGhpcy5hPWE7dGhpcy5sPW5ldyBNYXA7dGhpcy5mPWZ1bmN0aW9uKGEpe3JldHVybiBhKCl9O3RoaXMuYj0hMTt0aGlzLmc9W107dGhpcy5kYT1uZXcgQ2QoYSl9bj1OLnByb3RvdHlwZTsKbi5zYT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7aWYoIShiIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IG5ldyBUeXBlRXJyb3IoIkN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9ycyBtdXN0IGJlIGZ1bmN0aW9ucy4iKTtpZighdWQoYSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJUaGUgZWxlbWVudCBuYW1lICciK2ErIicgaXMgbm90IHZhbGlkLiIpO2lmKHRoaXMuYS5hLmdldChhKSl0aHJvdyBFcnJvcigiQSBjdXN0b20gZWxlbWVudCB3aXRoIG5hbWUgJyIrYSsiJyBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIik7aWYodGhpcy5jKXRocm93IEVycm9yKCJBIGN1c3RvbSBlbGVtZW50IGlzIGFscmVhZHkgYmVpbmcgZGVmaW5lZC4iKTt0aGlzLmM9ITA7dHJ5e3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWVbYV07aWYodm9pZCAwIT09YiYmIShiIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IEVycm9yKCJUaGUgJyIrYSsiJyBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24uIik7CnJldHVybiBifSxlPWIucHJvdG90eXBlO2lmKCEoZSBpbnN0YW5jZW9mIE9iamVjdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9yJ3MgcHJvdG90eXBlIGlzIG5vdCBhbiBvYmplY3QuIik7dmFyIGY9ZCgiY29ubmVjdGVkQ2FsbGJhY2siKTt2YXIgZz1kKCJkaXNjb25uZWN0ZWRDYWxsYmFjayIpO3ZhciBoPWQoImFkb3B0ZWRDYWxsYmFjayIpO3ZhciBrPWQoImF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayIpO3ZhciBsPWIub2JzZXJ2ZWRBdHRyaWJ1dGVzfHxbXX1jYXRjaChtKXtyZXR1cm59ZmluYWxseXt0aGlzLmM9ITF9Yj17bG9jYWxOYW1lOmEsY29uc3RydWN0b3JGdW5jdGlvbjpiLGNvbm5lY3RlZENhbGxiYWNrOmYsZGlzY29ubmVjdGVkQ2FsbGJhY2s6ZyxhZG9wdGVkQ2FsbGJhY2s6aCxhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2s6ayxvYnNlcnZlZEF0dHJpYnV0ZXM6bCxjb25zdHJ1Y3Rpb25TdGFjazpbXX07eWQodGhpcy5hLAphLGIpO3RoaXMuZy5wdXNoKGIpO3RoaXMuYnx8KHRoaXMuYj0hMCx0aGlzLmYoZnVuY3Rpb24oKXtyZXR1cm4gRmQoYyl9KSl9O24uWT1mdW5jdGlvbihhKXtMKHRoaXMuYSxhKX07CmZ1bmN0aW9uIEZkKGEpe2lmKCExIT09YS5iKXthLmI9ITE7Zm9yKHZhciBiPWEuZyxjPVtdLGQ9bmV3IE1hcCxlPTA7ZTxiLmxlbmd0aDtlKyspZC5zZXQoYltlXS5sb2NhbE5hbWUsW10pO0woYS5hLGRvY3VtZW50LHtZOmZ1bmN0aW9uKGIpe2lmKHZvaWQgMD09PWIuX19DRV9zdGF0ZSl7dmFyIGU9Yi5sb2NhbE5hbWUsZj1kLmdldChlKTtmP2YucHVzaChiKTphLmEuYS5nZXQoZSkmJmMucHVzaChiKX19fSk7Zm9yKGU9MDtlPGMubGVuZ3RoO2UrKylCZChhLmEsY1tlXSk7Zm9yKDswPGIubGVuZ3RoOyl7dmFyIGY9Yi5zaGlmdCgpO2U9Zi5sb2NhbE5hbWU7Zj1kLmdldChmLmxvY2FsTmFtZSk7Zm9yKHZhciBnPTA7ZzxmLmxlbmd0aDtnKyspQmQoYS5hLGZbZ10pOyhlPWEubC5nZXQoZSkpJiZlLnJlc29sdmUodm9pZCAwKX19fW4uZ2V0PWZ1bmN0aW9uKGEpe2lmKGE9dGhpcy5hLmEuZ2V0KGEpKXJldHVybiBhLmNvbnN0cnVjdG9yRnVuY3Rpb259OwpuLnRhPWZ1bmN0aW9uKGEpe2lmKCF1ZChhKSlyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFN5bnRheEVycm9yKCInIithKyInIGlzIG5vdCBhIHZhbGlkIGN1c3RvbSBlbGVtZW50IG5hbWUuIikpO3ZhciBiPXRoaXMubC5nZXQoYSk7aWYoYilyZXR1cm4gYi5iO2I9bmV3IEVkO3RoaXMubC5zZXQoYSxiKTt0aGlzLmEuYS5nZXQoYSkmJiF0aGlzLmcuc29tZShmdW5jdGlvbihiKXtyZXR1cm4gYi5sb2NhbE5hbWU9PT1hfSkmJmIucmVzb2x2ZSh2b2lkIDApO3JldHVybiBiLmJ9O24uUGE9ZnVuY3Rpb24oYSl7RGQodGhpcy5kYSk7dmFyIGI9dGhpcy5mO3RoaXMuZj1mdW5jdGlvbihjKXtyZXR1cm4gYShmdW5jdGlvbigpe3JldHVybiBiKGMpfSl9fTt3aW5kb3cuQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5PU47Ti5wcm90b3R5cGUuZGVmaW5lPU4ucHJvdG90eXBlLnNhO04ucHJvdG90eXBlLnVwZ3JhZGU9Ti5wcm90b3R5cGUuWTtOLnByb3RvdHlwZS5nZXQ9Ti5wcm90b3R5cGUuZ2V0OwpOLnByb3RvdHlwZS53aGVuRGVmaW5lZD1OLnByb3RvdHlwZS50YTtOLnByb3RvdHlwZS5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrPU4ucHJvdG90eXBlLlBhO3ZhciBHZD13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQsSGQ9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVFbGVtZW50TlMsSWQ9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlLEpkPXdpbmRvdy5Eb2N1bWVudC5wcm90b3R5cGUucHJlcGVuZCxLZD13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmFwcGVuZCxMZD13aW5kb3cuRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucHJlcGVuZCxNZD13aW5kb3cuRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUuYXBwZW5kLE5kPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5jbG9uZU5vZGUsT2Q9d2luZG93Lk5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkLFBkPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmUsUWQ9d2luZG93Lk5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLFJkPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQsU2Q9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuTm9kZS5wcm90b3R5cGUsCiJ0ZXh0Q29udGVudCIpLFRkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hdHRhY2hTaGFkb3csVWQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpLFZkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGUsV2Q9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnNldEF0dHJpYnV0ZSxYZD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlLFlkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGVOUyxaZD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuc2V0QXR0cmlidXRlTlMsJGQ9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZU5TLGFlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5pbnNlcnRBZGphY2VudEVsZW1lbnQsYmU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50SFRNTCxjZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucHJlcGVuZCwKZGU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFwcGVuZCxlZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYmVmb3JlLGZlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hZnRlcixnZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVwbGFjZVdpdGgsaGU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZSxpZT13aW5kb3cuSFRNTEVsZW1lbnQsamU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiKSxrZT13aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50RWxlbWVudCxsZT13aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50SFRNTDt2YXIgbWU9bmV3IGZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBuZSgpe3ZhciBhPW9lO3dpbmRvdy5IVE1MRWxlbWVudD1mdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt2YXIgYj10aGlzLmNvbnN0cnVjdG9yLGQ9YS5nLmdldChiKTtpZighZCl0aHJvdyBFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGJlaW5nIGNvbnN0cnVjdGVkIHdhcyBub3QgcmVnaXN0ZXJlZCB3aXRoIGBjdXN0b21FbGVtZW50c2AuIik7dmFyIGU9ZC5jb25zdHJ1Y3Rpb25TdGFjaztpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGU9R2QuY2FsbChkb2N1bWVudCxkLmxvY2FsTmFtZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKGUsYi5wcm90b3R5cGUpLGUuX19DRV9zdGF0ZT0xLGUuX19DRV9kZWZpbml0aW9uPWQsYS5iKGUpLGU7ZD1lLmxlbmd0aC0xO3ZhciBmPWVbZF07aWYoZj09PW1lKXRocm93IEVycm9yKCJUaGUgSFRNTEVsZW1lbnQgY29uc3RydWN0b3Igd2FzIGVpdGhlciBjYWxsZWQgcmVlbnRyYW50bHkgZm9yIHRoaXMgY29uc3RydWN0b3Igb3IgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiIpOwplW2RdPW1lO09iamVjdC5zZXRQcm90b3R5cGVPZihmLGIucHJvdG90eXBlKTthLmIoZik7cmV0dXJuIGZ9Yi5wcm90b3R5cGU9aWUucHJvdG90eXBlO09iamVjdC5kZWZpbmVQcm9wZXJ0eShiLnByb3RvdHlwZSwiY29uc3RydWN0b3IiLHt3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTpifSk7cmV0dXJuIGJ9KCl9O2Z1bmN0aW9uIHBlKGEsYixjKXtmdW5jdGlvbiBkKGIpe3JldHVybiBmdW5jdGlvbihjKXtmb3IodmFyIGQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDsrK2UpZFtlXT1hcmd1bWVudHNbZV07ZT1bXTtmb3IodmFyIGY9W10sbD0wO2w8ZC5sZW5ndGg7bCsrKXt2YXIgbT1kW2xdO20gaW5zdGFuY2VvZiBFbGVtZW50JiZIKG0pJiZmLnB1c2gobSk7aWYobSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpZm9yKG09bS5maXJzdENoaWxkO207bT1tLm5leHRTaWJsaW5nKWUucHVzaChtKTtlbHNlIGUucHVzaChtKX1iLmFwcGx5KHRoaXMsZCk7Zm9yKGQ9MDtkPGYubGVuZ3RoO2QrKylLKGEsZltkXSk7aWYoSCh0aGlzKSlmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCsrKWY9ZVtkXSxmIGluc3RhbmNlb2YgRWxlbWVudCYmSihhLGYpfX12b2lkIDAhPT1jLlYmJihiLnByZXBlbmQ9ZChjLlYpKTt2b2lkIDAhPT1jLmFwcGVuZCYmKGIuYXBwZW5kPWQoYy5hcHBlbmQpKX07ZnVuY3Rpb24gcWUoKXt2YXIgYT1vZTtJKERvY3VtZW50LnByb3RvdHlwZSwiY3JlYXRlRWxlbWVudCIsZnVuY3Rpb24oYil7aWYodGhpcy5fX0NFX2hhc1JlZ2lzdHJ5KXt2YXIgYz1hLmEuZ2V0KGIpO2lmKGMpcmV0dXJuIG5ldyBjLmNvbnN0cnVjdG9yRnVuY3Rpb259Yj1HZC5jYWxsKHRoaXMsYik7YS5iKGIpO3JldHVybiBifSk7SShEb2N1bWVudC5wcm90b3R5cGUsImltcG9ydE5vZGUiLGZ1bmN0aW9uKGIsYyl7Yj1JZC5jYWxsKHRoaXMsYiwhIWMpO3RoaXMuX19DRV9oYXNSZWdpc3RyeT9MKGEsYik6QWQoYSxiKTtyZXR1cm4gYn0pO0koRG9jdW1lbnQucHJvdG90eXBlLCJjcmVhdGVFbGVtZW50TlMiLGZ1bmN0aW9uKGIsYyl7aWYodGhpcy5fX0NFX2hhc1JlZ2lzdHJ5JiYobnVsbD09PWJ8fCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj09PWIpKXt2YXIgZD1hLmEuZ2V0KGMpO2lmKGQpcmV0dXJuIG5ldyBkLmNvbnN0cnVjdG9yRnVuY3Rpb259Yj1IZC5jYWxsKHRoaXMsCmIsYyk7YS5iKGIpO3JldHVybiBifSk7cGUoYSxEb2N1bWVudC5wcm90b3R5cGUse1Y6SmQsYXBwZW5kOktkfSl9O2Z1bmN0aW9uIHJlKCl7ZnVuY3Rpb24gYShhLGQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJ0ZXh0Q29udGVudCIse2VudW1lcmFibGU6ZC5lbnVtZXJhYmxlLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZC5nZXQsc2V0OmZ1bmN0aW9uKGEpe2lmKHRoaXMubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSlkLnNldC5jYWxsKHRoaXMsYSk7ZWxzZXt2YXIgYz12b2lkIDA7aWYodGhpcy5maXJzdENoaWxkKXt2YXIgZT10aGlzLmNoaWxkTm9kZXMsaD1lLmxlbmd0aDtpZigwPGgmJkgodGhpcykpe2M9QXJyYXkoaCk7Zm9yKHZhciBrPTA7azxoO2srKyljW2tdPWVba119fWQuc2V0LmNhbGwodGhpcyxhKTtpZihjKWZvcihhPTA7YTxjLmxlbmd0aDthKyspSyhiLGNbYV0pfX19KX12YXIgYj1vZTtJKE5vZGUucHJvdG90eXBlLCJpbnNlcnRCZWZvcmUiLGZ1bmN0aW9uKGEsZCl7aWYoYSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpe3ZhciBjPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhLmNoaWxkTm9kZXMpOwphPVBkLmNhbGwodGhpcyxhLGQpO2lmKEgodGhpcykpZm9yKGQ9MDtkPGMubGVuZ3RoO2QrKylKKGIsY1tkXSk7cmV0dXJuIGF9Yz1IKGEpO2Q9UGQuY2FsbCh0aGlzLGEsZCk7YyYmSyhiLGEpO0godGhpcykmJkooYixhKTtyZXR1cm4gZH0pO0koTm9kZS5wcm90b3R5cGUsImFwcGVuZENoaWxkIixmdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCl7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGEuY2hpbGROb2Rlcyk7YT1PZC5jYWxsKHRoaXMsYSk7aWYoSCh0aGlzKSlmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKylKKGIsY1tlXSk7cmV0dXJuIGF9Yz1IKGEpO2U9T2QuY2FsbCh0aGlzLGEpO2MmJksoYixhKTtIKHRoaXMpJiZKKGIsYSk7cmV0dXJuIGV9KTtJKE5vZGUucHJvdG90eXBlLCJjbG9uZU5vZGUiLGZ1bmN0aW9uKGEpe2E9TmQuY2FsbCh0aGlzLCEhYSk7dGhpcy5vd25lckRvY3VtZW50Ll9fQ0VfaGFzUmVnaXN0cnk/TChiLGEpOgpBZChiLGEpO3JldHVybiBhfSk7SShOb2RlLnByb3RvdHlwZSwicmVtb3ZlQ2hpbGQiLGZ1bmN0aW9uKGEpe3ZhciBjPUgoYSksZT1RZC5jYWxsKHRoaXMsYSk7YyYmSyhiLGEpO3JldHVybiBlfSk7SShOb2RlLnByb3RvdHlwZSwicmVwbGFjZUNoaWxkIixmdW5jdGlvbihhLGQpe2lmKGEgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KXt2YXIgYz1BcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYS5jaGlsZE5vZGVzKTthPVJkLmNhbGwodGhpcyxhLGQpO2lmKEgodGhpcykpZm9yKEsoYixkKSxkPTA7ZDxjLmxlbmd0aDtkKyspSihiLGNbZF0pO3JldHVybiBhfWM9SChhKTt2YXIgZj1SZC5jYWxsKHRoaXMsYSxkKSxnPUgodGhpcyk7ZyYmSyhiLGQpO2MmJksoYixhKTtnJiZKKGIsYSk7cmV0dXJuIGZ9KTtTZCYmU2QuZ2V0P2EoTm9kZS5wcm90b3R5cGUsU2QpOnpkKGIsZnVuY3Rpb24oYil7YShiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CltdLGI9MDtiPHRoaXMuY2hpbGROb2Rlcy5sZW5ndGg7YisrKWEucHVzaCh0aGlzLmNoaWxkTm9kZXNbYl0udGV4dENvbnRlbnQpO3JldHVybiBhLmpvaW4oIiIpfSxzZXQ6ZnVuY3Rpb24oYSl7Zm9yKDt0aGlzLmZpcnN0Q2hpbGQ7KVFkLmNhbGwodGhpcyx0aGlzLmZpcnN0Q2hpbGQpO09kLmNhbGwodGhpcyxkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSl9fSl9KX07ZnVuY3Rpb24gc2UoYSl7ZnVuY3Rpb24gYihiKXtyZXR1cm4gZnVuY3Rpb24oYyl7Zm9yKHZhciBkPVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7KytlKWRbZV09YXJndW1lbnRzW2VdO2U9W107Zm9yKHZhciBoPVtdLGs9MDtrPGQubGVuZ3RoO2srKyl7dmFyIGw9ZFtrXTtsIGluc3RhbmNlb2YgRWxlbWVudCYmSChsKSYmaC5wdXNoKGwpO2lmKGwgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KWZvcihsPWwuZmlyc3RDaGlsZDtsO2w9bC5uZXh0U2libGluZyllLnB1c2gobCk7ZWxzZSBlLnB1c2gobCl9Yi5hcHBseSh0aGlzLGQpO2ZvcihkPTA7ZDxoLmxlbmd0aDtkKyspSyhhLGhbZF0pO2lmKEgodGhpcykpZm9yKGQ9MDtkPGUubGVuZ3RoO2QrKyloPWVbZF0saCBpbnN0YW5jZW9mIEVsZW1lbnQmJkooYSxoKX19dmFyIGM9RWxlbWVudC5wcm90b3R5cGU7dm9pZCAwIT09ZWUmJihjLmJlZm9yZT1iKGVlKSk7dm9pZCAwIT09ZWUmJihjLmFmdGVyPWIoZmUpKTt2b2lkIDAhPT1nZSYmCkkoYywicmVwbGFjZVdpdGgiLGZ1bmN0aW9uKGIpe2Zvcih2YXIgYz1bXSxkPTA7ZDxhcmd1bWVudHMubGVuZ3RoOysrZCljW2RdPWFyZ3VtZW50c1tkXTtkPVtdO2Zvcih2YXIgZz1bXSxoPTA7aDxjLmxlbmd0aDtoKyspe3ZhciBrPWNbaF07ayBpbnN0YW5jZW9mIEVsZW1lbnQmJkgoaykmJmcucHVzaChrKTtpZihrIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClmb3Ioaz1rLmZpcnN0Q2hpbGQ7aztrPWsubmV4dFNpYmxpbmcpZC5wdXNoKGspO2Vsc2UgZC5wdXNoKGspfWg9SCh0aGlzKTtnZS5hcHBseSh0aGlzLGMpO2ZvcihjPTA7YzxnLmxlbmd0aDtjKyspSyhhLGdbY10pO2lmKGgpZm9yKEsoYSx0aGlzKSxjPTA7YzxkLmxlbmd0aDtjKyspZz1kW2NdLGcgaW5zdGFuY2VvZiBFbGVtZW50JiZKKGEsZyl9KTt2b2lkIDAhPT1oZSYmSShjLCJyZW1vdmUiLGZ1bmN0aW9uKCl7dmFyIGI9SCh0aGlzKTtoZS5jYWxsKHRoaXMpO2ImJksoYSx0aGlzKX0pfTtmdW5jdGlvbiB0ZSgpe2Z1bmN0aW9uIGEoYSxiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiaW5uZXJIVE1MIix7ZW51bWVyYWJsZTpiLmVudW1lcmFibGUsY29uZmlndXJhYmxlOiEwLGdldDpiLmdldCxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxlPXZvaWQgMDtIKHRoaXMpJiYoZT1bXSx3ZCh0aGlzLGZ1bmN0aW9uKGEpe2EhPT1jJiZlLnB1c2goYSl9KSk7Yi5zZXQuY2FsbCh0aGlzLGEpO2lmKGUpZm9yKHZhciBmPTA7ZjxlLmxlbmd0aDtmKyspe3ZhciBnPWVbZl07MT09PWcuX19DRV9zdGF0ZSYmZC5kaXNjb25uZWN0ZWRDYWxsYmFjayhnKX10aGlzLm93bmVyRG9jdW1lbnQuX19DRV9oYXNSZWdpc3RyeT9MKGQsdGhpcyk6QWQoZCx0aGlzKTtyZXR1cm4gYX19KX1mdW5jdGlvbiBiKGEsYil7SShhLCJpbnNlcnRBZGphY2VudEVsZW1lbnQiLGZ1bmN0aW9uKGEsYyl7dmFyIGU9SChjKTthPWIuY2FsbCh0aGlzLGEsYyk7ZSYmSyhkLGMpO0goYSkmJkooZCxjKTtyZXR1cm4gYX0pfQpmdW5jdGlvbiBjKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2Zvcih2YXIgYz1bXTthIT09YjthPWEubmV4dFNpYmxpbmcpYy5wdXNoKGEpO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspTChkLGNbYl0pfUkoYSwiaW5zZXJ0QWRqYWNlbnRIVE1MIixmdW5jdGlvbihhLGQpe2E9YS50b0xvd2VyQ2FzZSgpO2lmKCJiZWZvcmViZWdpbiI9PT1hKXt2YXIgZT10aGlzLnByZXZpb3VzU2libGluZztiLmNhbGwodGhpcyxhLGQpO2MoZXx8dGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsdGhpcyl9ZWxzZSBpZigiYWZ0ZXJiZWdpbiI9PT1hKWU9dGhpcy5maXJzdENoaWxkLGIuY2FsbCh0aGlzLGEsZCksYyh0aGlzLmZpcnN0Q2hpbGQsZSk7ZWxzZSBpZigiYmVmb3JlZW5kIj09PWEpZT10aGlzLmxhc3RDaGlsZCxiLmNhbGwodGhpcyxhLGQpLGMoZXx8dGhpcy5maXJzdENoaWxkLG51bGwpO2Vsc2UgaWYoImFmdGVyZW5kIj09PWEpZT10aGlzLm5leHRTaWJsaW5nLGIuY2FsbCh0aGlzLGEsZCksYyh0aGlzLm5leHRTaWJsaW5nLAplKTtlbHNlIHRocm93IG5ldyBTeW50YXhFcnJvcigiVGhlIHZhbHVlIHByb3ZpZGVkICgiK1N0cmluZyhhKSsiKSBpcyBub3Qgb25lIG9mICdiZWZvcmViZWdpbicsICdhZnRlcmJlZ2luJywgJ2JlZm9yZWVuZCcsIG9yICdhZnRlcmVuZCcuIik7fSl9dmFyIGQ9b2U7VGQmJkkoRWxlbWVudC5wcm90b3R5cGUsImF0dGFjaFNoYWRvdyIsZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX19DRV9zaGFkb3dSb290PWE9VGQuY2FsbCh0aGlzLGEpfSk7VWQmJlVkLmdldD9hKEVsZW1lbnQucHJvdG90eXBlLFVkKTpqZSYmamUuZ2V0P2EoSFRNTEVsZW1lbnQucHJvdG90eXBlLGplKTp6ZChkLGZ1bmN0aW9uKGIpe2EoYix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE5kLmNhbGwodGhpcywhMCkuaW5uZXJIVE1MfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9InRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lLGM9Yj90aGlzLmNvbnRlbnQ6dGhpcyxkPUhkLmNhbGwoZG9jdW1lbnQsCnRoaXMubmFtZXNwYWNlVVJJLHRoaXMubG9jYWxOYW1lKTtmb3IoZC5pbm5lckhUTUw9YTswPGMuY2hpbGROb2Rlcy5sZW5ndGg7KVFkLmNhbGwoYyxjLmNoaWxkTm9kZXNbMF0pO2ZvcihhPWI/ZC5jb250ZW50OmQ7MDxhLmNoaWxkTm9kZXMubGVuZ3RoOylPZC5jYWxsKGMsYS5jaGlsZE5vZGVzWzBdKX19KX0pO0koRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZSIsZnVuY3Rpb24oYSxiKXtpZigxIT09dGhpcy5fX0NFX3N0YXRlKXJldHVybiBXZC5jYWxsKHRoaXMsYSxiKTt2YXIgYz1WZC5jYWxsKHRoaXMsYSk7V2QuY2FsbCh0aGlzLGEsYik7Yj1WZC5jYWxsKHRoaXMsYSk7ZC5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodGhpcyxhLGMsYixudWxsKX0pO0koRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZU5TIixmdW5jdGlvbihhLGIsYyl7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gWmQuY2FsbCh0aGlzLGEsYixjKTt2YXIgZT1ZZC5jYWxsKHRoaXMsYSwKYik7WmQuY2FsbCh0aGlzLGEsYixjKTtjPVlkLmNhbGwodGhpcyxhLGIpO2QuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsYixlLGMsYSl9KTtJKEVsZW1lbnQucHJvdG90eXBlLCJyZW1vdmVBdHRyaWJ1dGUiLGZ1bmN0aW9uKGEpe2lmKDEhPT10aGlzLl9fQ0Vfc3RhdGUpcmV0dXJuIFhkLmNhbGwodGhpcyxhKTt2YXIgYj1WZC5jYWxsKHRoaXMsYSk7WGQuY2FsbCh0aGlzLGEpO251bGwhPT1iJiZkLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0aGlzLGEsYixudWxsLG51bGwpfSk7SShFbGVtZW50LnByb3RvdHlwZSwicmVtb3ZlQXR0cmlidXRlTlMiLGZ1bmN0aW9uKGEsYil7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gJGQuY2FsbCh0aGlzLGEsYik7dmFyIGM9WWQuY2FsbCh0aGlzLGEsYik7JGQuY2FsbCh0aGlzLGEsYik7dmFyIGU9WWQuY2FsbCh0aGlzLGEsYik7YyE9PWUmJmQuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsYixjLGUsYSl9KTtrZT9iKEhUTUxFbGVtZW50LnByb3RvdHlwZSwKa2UpOmFlP2IoRWxlbWVudC5wcm90b3R5cGUsYWUpOmNvbnNvbGUud2FybigiQ3VzdG9tIEVsZW1lbnRzOiBgRWxlbWVudCNpbnNlcnRBZGphY2VudEVsZW1lbnRgIHdhcyBub3QgcGF0Y2hlZC4iKTtsZT9jKEhUTUxFbGVtZW50LnByb3RvdHlwZSxsZSk6YmU/YyhFbGVtZW50LnByb3RvdHlwZSxiZSk6Y29uc29sZS53YXJuKCJDdXN0b20gRWxlbWVudHM6IGBFbGVtZW50I2luc2VydEFkamFjZW50SFRNTGAgd2FzIG5vdCBwYXRjaGVkLiIpO3BlKGQsRWxlbWVudC5wcm90b3R5cGUse1Y6Y2UsYXBwZW5kOmRlfSk7c2UoZCl9O3ZhciB1ZT13aW5kb3cuY3VzdG9tRWxlbWVudHM7aWYoIXVlfHx1ZS5mb3JjZVBvbHlmaWxsfHwiZnVuY3Rpb24iIT10eXBlb2YgdWUuZGVmaW5lfHwiZnVuY3Rpb24iIT10eXBlb2YgdWUuZ2V0KXt2YXIgb2U9bmV3IHhkO25lKCk7cWUoKTtwZShvZSxEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSx7VjpMZCxhcHBlbmQ6TWR9KTtyZSgpO3RlKCk7ZG9jdW1lbnQuX19DRV9oYXNSZWdpc3RyeT0hMDt2YXIgY3VzdG9tRWxlbWVudHM9bmV3IE4ob2UpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImN1c3RvbUVsZW1lbnRzIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6Y3VzdG9tRWxlbWVudHN9KX07ZnVuY3Rpb24gdmUoKXt0aGlzLmVuZD10aGlzLnN0YXJ0PTA7dGhpcy5ydWxlcz10aGlzLnBhcmVudD10aGlzLnByZXZpb3VzPW51bGw7dGhpcy5jc3NUZXh0PXRoaXMucGFyc2VkQ3NzVGV4dD0iIjt0aGlzLmF0UnVsZT0hMTt0aGlzLnR5cGU9MDt0aGlzLnBhcnNlZFNlbGVjdG9yPXRoaXMuc2VsZWN0b3I9dGhpcy5rZXlmcmFtZXNOYW1lPSIifQpmdW5jdGlvbiB3ZShhKXthPWEucmVwbGFjZSh4ZSwiIikucmVwbGFjZSh5ZSwiIik7dmFyIGI9emUsYz1hLGQ9bmV3IHZlO2Quc3RhcnQ9MDtkLmVuZD1jLmxlbmd0aDtmb3IodmFyIGU9ZCxmPTAsZz1jLmxlbmd0aDtmPGc7ZisrKWlmKCJ7Ij09PWNbZl0pe2UucnVsZXN8fChlLnJ1bGVzPVtdKTt2YXIgaD1lLGs9aC5ydWxlc1toLnJ1bGVzLmxlbmd0aC0xXXx8bnVsbDtlPW5ldyB2ZTtlLnN0YXJ0PWYrMTtlLnBhcmVudD1oO2UucHJldmlvdXM9aztoLnJ1bGVzLnB1c2goZSl9ZWxzZSJ9Ij09PWNbZl0mJihlLmVuZD1mKzEsZT1lLnBhcmVudHx8ZCk7cmV0dXJuIGIoZCxhKX0KZnVuY3Rpb24gemUoYSxiKXt2YXIgYz1iLnN1YnN0cmluZyhhLnN0YXJ0LGEuZW5kLTEpO2EucGFyc2VkQ3NzVGV4dD1hLmNzc1RleHQ9Yy50cmltKCk7YS5wYXJlbnQmJihjPWIuc3Vic3RyaW5nKGEucHJldmlvdXM/YS5wcmV2aW91cy5lbmQ6YS5wYXJlbnQuc3RhcnQsYS5zdGFydC0xKSxjPUFlKGMpLGM9Yy5yZXBsYWNlKEJlLCIgIiksYz1jLnN1YnN0cmluZyhjLmxhc3RJbmRleE9mKCI7IikrMSksYz1hLnBhcnNlZFNlbGVjdG9yPWEuc2VsZWN0b3I9Yy50cmltKCksYS5hdFJ1bGU9MD09PWMuaW5kZXhPZigiQCIpLGEuYXRSdWxlPzA9PT1jLmluZGV4T2YoIkBtZWRpYSIpP2EudHlwZT1DZTpjLm1hdGNoKERlKSYmKGEudHlwZT1FZSxhLmtleWZyYW1lc05hbWU9YS5zZWxlY3Rvci5zcGxpdChCZSkucG9wKCkpOmEudHlwZT0wPT09Yy5pbmRleE9mKCItLSIpP0ZlOkdlKTtpZihjPWEucnVsZXMpZm9yKHZhciBkPTAsZT1jLmxlbmd0aCxmPXZvaWQgMDtkPGUmJihmPWNbZF0pO2QrKyl6ZShmLApiKTtyZXR1cm4gYX1mdW5jdGlvbiBBZShhKXtyZXR1cm4gYS5yZXBsYWNlKC9cXChbMC05YS1mXXsxLDZ9KVxzL2dpLGZ1bmN0aW9uKGEsYyl7YT1jO2ZvcihjPTYtYS5sZW5ndGg7Yy0tOylhPSIwIithO3JldHVybiJcXCIrYX0pfQpmdW5jdGlvbiBIZShhLGIsYyl7Yz12b2lkIDA9PT1jPyIiOmM7dmFyIGQ9IiI7aWYoYS5jc3NUZXh0fHxhLnJ1bGVzKXt2YXIgZT1hLnJ1bGVzLGY7aWYoZj1lKWY9ZVswXSxmPSEoZiYmZi5zZWxlY3RvciYmMD09PWYuc2VsZWN0b3IuaW5kZXhPZigiLS0iKSk7aWYoZil7Zj0wO2Zvcih2YXIgZz1lLmxlbmd0aCxoPXZvaWQgMDtmPGcmJihoPWVbZl0pO2YrKylkPUhlKGgsYixkKX1lbHNlIGI/Yj1hLmNzc1RleHQ6KGI9YS5jc3NUZXh0LGI9Yi5yZXBsYWNlKEllLCIiKS5yZXBsYWNlKEplLCIiKSxiPWIucmVwbGFjZShLZSwiIikucmVwbGFjZShMZSwiIikpLChkPWIudHJpbSgpKSYmKGQ9IiAgIitkKyJcbiIpfWQmJihhLnNlbGVjdG9yJiYoYys9YS5zZWxlY3RvcisiIHtcbiIpLGMrPWQsYS5zZWxlY3RvciYmKGMrPSJ9XG5cbiIpKTtyZXR1cm4gY30KdmFyIEdlPTEsRWU9NyxDZT00LEZlPTFFMyx4ZT0vXC9cKlteKl0qXCorKFteLypdW14qXSpcKispKlwvL2dpbSx5ZT0vQGltcG9ydFteO10qOy9naW0sSWU9Lyg/Ol5bXjtcLVxzfV0rKT8tLVteO3t9XSo/Oltee307XSo/KD86Wztcbl18JCkvZ2ltLEplPS8oPzpeW147XC1cc31dKyk/LS1bXjt7fV0qPzpbXnt9O10qP3tbXn1dKj99KD86Wztcbl18JCk/L2dpbSxLZT0vQGFwcGx5XHMqXCg/W14pO10qXCk/XHMqKD86Wztcbl18JCk/L2dpbSxMZT0vW147Ol0qPzpbXjtdKj92YXJcKFteO10qXCkoPzpbO1xuXXwkKT8vZ2ltLERlPS9eQFteXHNdKmtleWZyYW1lcy8sQmU9L1xzKy9nO3ZhciBPPSEod2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaW5Vc2UpLE1lO2Z1bmN0aW9uIE5lKGEpe01lPWEmJmEuc2hpbWNzc3Byb3BlcnRpZXM/ITE6T3x8IShuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFwvNjAxfEVkZ2VcLzE1Lyl8fCF3aW5kb3cuQ1NTfHwhQ1NTLnN1cHBvcnRzfHwhQ1NTLnN1cHBvcnRzKCJib3gtc2hhZG93IiwiMCAwIDAgdmFyKC0tZm9vKSIpKX12YXIgT2U7d2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQmJihPZT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQpO3ZhciBQZT0hKCF3aW5kb3cuU2hhZHlDU1N8fCF3aW5kb3cuU2hhZHlDU1MuZGlzYWJsZVJ1bnRpbWUpOwp3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M/TWU9d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzczp3aW5kb3cuU2hhZHlDU1M/KE5lKHdpbmRvdy5TaGFkeUNTUyksd2luZG93LlNoYWR5Q1NTPXZvaWQgMCk6TmUod2luZG93LldlYkNvbXBvbmVudHMmJndpbmRvdy5XZWJDb21wb25lbnRzLmZsYWdzKTt2YXIgUT1NZSxRZT1PZTt2YXIgUmU9Lyg/Ol58Wztcc3tdXHMqKSgtLVtcdy1dKj8pXHMqOlxzKig/OigoPzonKD86XFwnfC4pKj8nfCIoPzpcXCJ8LikqPyJ8XChbXildKj9cKXxbXn07e10pKyl8XHsoW159XSopXH0oPzooPz1bO1xzfV0pfCQpKS9naSxTZT0vKD86XnxcVyspQGFwcGx5XHMqXCg/KFteKTtcbl0qKVwpPy9naSxUZT0vKC0tW1x3LV0rKVxzKihbOiw7KV18JCkvZ2ksVWU9LyhhbmltYXRpb25ccyo6KXwoYW5pbWF0aW9uLW5hbWVccyo6KS8sJGU9L0BtZWRpYVxzKC4qKS8sYWY9L1x7W159XSpcfS9nO3ZhciBiZj1uZXcgU2V0O2Z1bmN0aW9uIGNmKGEsYil7aWYoIWEpcmV0dXJuIiI7InN0cmluZyI9PT10eXBlb2YgYSYmKGE9d2UoYSkpO2ImJmRmKGEsYik7cmV0dXJuIEhlKGEsUSl9ZnVuY3Rpb24gZWYoYSl7IWEuX19jc3NSdWxlcyYmYS50ZXh0Q29udGVudCYmKGEuX19jc3NSdWxlcz13ZShhLnRleHRDb250ZW50KSk7cmV0dXJuIGEuX19jc3NSdWxlc3x8bnVsbH1mdW5jdGlvbiBmZihhKXtyZXR1cm4hIWEucGFyZW50JiZhLnBhcmVudC50eXBlPT09RWV9ZnVuY3Rpb24gZGYoYSxiLGMsZCl7aWYoYSl7dmFyIGU9ITEsZj1hLnR5cGU7aWYoZCYmZj09PUNlKXt2YXIgZz1hLnNlbGVjdG9yLm1hdGNoKCRlKTtnJiYod2luZG93Lm1hdGNoTWVkaWEoZ1sxXSkubWF0Y2hlc3x8KGU9ITApKX1mPT09R2U/YihhKTpjJiZmPT09RWU/YyhhKTpmPT09RmUmJihlPSEwKTtpZigoYT1hLnJ1bGVzKSYmIWUpZm9yKGU9MCxmPWEubGVuZ3RoLGc9dm9pZCAwO2U8ZiYmKGc9YVtlXSk7ZSsrKWRmKGcsYixjLGQpfX0KZnVuY3Rpb24gZ2YoYSxiLGMsZCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtiJiZlLnNldEF0dHJpYnV0ZSgic2NvcGUiLGIpO2UudGV4dENvbnRlbnQ9YTtoZihlLGMsZCk7cmV0dXJuIGV9dmFyIGpmPW51bGw7ZnVuY3Rpb24ga2YoYSl7YT1kb2N1bWVudC5jcmVhdGVDb21tZW50KCIgU2hhZHkgRE9NIHN0eWxlcyBmb3IgIithKyIgIik7dmFyIGI9ZG9jdW1lbnQuaGVhZDtiLmluc2VydEJlZm9yZShhLChqZj9qZi5uZXh0U2libGluZzpudWxsKXx8Yi5maXJzdENoaWxkKTtyZXR1cm4gamY9YX1mdW5jdGlvbiBoZihhLGIsYyl7Yj1ifHxkb2N1bWVudC5oZWFkO2IuaW5zZXJ0QmVmb3JlKGEsYyYmYy5uZXh0U2libGluZ3x8Yi5maXJzdENoaWxkKTtqZj9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGpmKT09PU5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HJiYoamY9YSk6amY9YX0KZnVuY3Rpb24gbGYoYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2I8ZDtiKyspaWYoIigiPT09YVtiXSljKys7ZWxzZSBpZigiKSI9PT1hW2JdJiYwPT09LS1jKXJldHVybiBiO3JldHVybi0xfWZ1bmN0aW9uIG1mKGEsYil7dmFyIGM9YS5pbmRleE9mKCJ2YXIoIik7aWYoLTE9PT1jKXJldHVybiBiKGEsIiIsIiIsIiIpO3ZhciBkPWxmKGEsYyszKSxlPWEuc3Vic3RyaW5nKGMrNCxkKTtjPWEuc3Vic3RyaW5nKDAsYyk7YT1tZihhLnN1YnN0cmluZyhkKzEpLGIpO2Q9ZS5pbmRleE9mKCIsIik7cmV0dXJuLTE9PT1kP2IoYyxlLnRyaW0oKSwiIixhKTpiKGMsZS5zdWJzdHJpbmcoMCxkKS50cmltKCksZS5zdWJzdHJpbmcoZCsxKS50cmltKCksYSl9ZnVuY3Rpb24gbmYoYSxiKXtPP2Euc2V0QXR0cmlidXRlKCJjbGFzcyIsYik6d2luZG93LlNoYWR5RE9NLm5hdGl2ZU1ldGhvZHMuc2V0QXR0cmlidXRlLmNhbGwoYSwiY2xhc3MiLGIpfQp2YXIgb2Y9d2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00ud3JhcHx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O2Z1bmN0aW9uIHBmKGEpe3ZhciBiPWEubG9jYWxOYW1lLGM9IiI7Yj8tMTxiLmluZGV4T2YoIi0iKXx8KGM9YixiPWEuZ2V0QXR0cmlidXRlJiZhLmdldEF0dHJpYnV0ZSgiaXMiKXx8IiIpOihiPWEuaXMsYz1hLmV4dGVuZHMpO3JldHVybntpczpiLE06Y319ZnVuY3Rpb24gcWYoYSl7Zm9yKHZhciBiPVtdLGM9IiIsZD0wOzA8PWQmJmQ8YS5sZW5ndGg7ZCsrKWlmKCIoIj09PWFbZF0pe3ZhciBlPWxmKGEsZCk7Yys9YS5zbGljZShkLGUrMSk7ZD1lfWVsc2UiLCI9PT1hW2RdPyhiLnB1c2goYyksYz0iIik6Yys9YVtkXTtjJiZiLnB1c2goYyk7cmV0dXJuIGJ9CmZ1bmN0aW9uIHJmKGEpe2lmKHZvaWQgMCE9PVFlKXJldHVybiBRZTtpZih2b2lkIDA9PT1hLl9fY3NzQnVpbGQpe3ZhciBiPWEuZ2V0QXR0cmlidXRlKCJjc3MtYnVpbGQiKTtpZihiKWEuX19jc3NCdWlsZD1iO2Vsc2V7YTp7Yj0idGVtcGxhdGUiPT09YS5sb2NhbE5hbWU/YS5jb250ZW50LmZpcnN0Q2hpbGQ6YS5maXJzdENoaWxkO2lmKGIgaW5zdGFuY2VvZiBDb21tZW50JiYoYj1iLnRleHRDb250ZW50LnRyaW0oKS5zcGxpdCgiOiIpLCJjc3MtYnVpbGQiPT09YlswXSkpe2I9YlsxXTticmVhayBhfWI9IiJ9aWYoIiIhPT1iKXt2YXIgYz0idGVtcGxhdGUiPT09YS5sb2NhbE5hbWU/YS5jb250ZW50LmZpcnN0Q2hpbGQ6YS5maXJzdENoaWxkO2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKX1hLl9fY3NzQnVpbGQ9Yn19cmV0dXJuIGEuX19jc3NCdWlsZHx8IiJ9CmZ1bmN0aW9uIHNmKGEpe2E9dm9pZCAwPT09YT8iIjphO3JldHVybiIiIT09YSYmUT9PPyJzaGFkb3ciPT09YToic2hhZHkiPT09YTohMX07ZnVuY3Rpb24gdGYoKXt9ZnVuY3Rpb24gdWYoYSxiKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxifHwiIil9KX1mdW5jdGlvbiB2ZihhLGIsYyl7Yi5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZjKGIpO3ZhciBkOyJ0ZW1wbGF0ZSI9PT1iLmxvY2FsTmFtZT9kPShiLmNvbnRlbnR8fGIuX2NvbnRlbnR8fGIpLmNoaWxkTm9kZXM6ZD1iLmNoaWxkcmVufHxiLmNoaWxkTm9kZXM7aWYoZClmb3IoYj0wO2I8ZC5sZW5ndGg7YisrKXZmKGEsZFtiXSxjKX0KZnVuY3Rpb24gd2YoYSxiLGMpe2lmKGIpaWYoYS5jbGFzc0xpc3QpYz8oYS5jbGFzc0xpc3QucmVtb3ZlKCJzdHlsZS1zY29wZSIpLGEuY2xhc3NMaXN0LnJlbW92ZShiKSk6KGEuY2xhc3NMaXN0LmFkZCgic3R5bGUtc2NvcGUiKSxhLmNsYXNzTGlzdC5hZGQoYikpO2Vsc2UgaWYoYS5nZXRBdHRyaWJ1dGUpe3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpO2M/ZCYmKGI9ZC5yZXBsYWNlKCJzdHlsZS1zY29wZSIsIiIpLnJlcGxhY2UoYiwiIiksbmYoYSxiKSk6bmYoYSwoZD9kKyIgIjoiIikrInN0eWxlLXNjb3BlICIrYil9fWZ1bmN0aW9uIHhmKGEsYixjKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxiLCEwKTt3ZihhLGMpfSl9ZnVuY3Rpb24geWYoYSxiKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxifHwiIiwhMCl9KX0KZnVuY3Rpb24gemYoYSxiLGMsZCxlKXt2YXIgZj1SO2U9dm9pZCAwPT09ZT8iIjplOyIiPT09ZSYmKE98fCJzaGFkeSI9PT0odm9pZCAwPT09ZD8iIjpkKT9lPWNmKGIsYyk6KGE9cGYoYSksZT1BZihmLGIsYS5pcyxhLk0sYykrIlxuXG4iKSk7cmV0dXJuIGUudHJpbSgpfWZ1bmN0aW9uIEFmKGEsYixjLGQsZSl7dmFyIGY9QmYoYyxkKTtjPWM/Ii4iK2M6IiI7cmV0dXJuIGNmKGIsZnVuY3Rpb24oYil7Yi5jfHwoYi5zZWxlY3Rvcj1iLmo9Q2YoYSxiLGEuYixjLGYpLGIuYz0hMCk7ZSYmZShiLGMsZil9KX1mdW5jdGlvbiBCZihhLGIpe3JldHVybiBiPyJbaXM9IithKyJdIjphfQpmdW5jdGlvbiBDZihhLGIsYyxkLGUpe3ZhciBmPXFmKGIuc2VsZWN0b3IpO2lmKCFmZihiKSl7Yj0wO2Zvcih2YXIgZz1mLmxlbmd0aCxoPXZvaWQgMDtiPGcmJihoPWZbYl0pO2IrKylmW2JdPWMuY2FsbChhLGgsZCxlKX1yZXR1cm4gZi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuISFhfSkuam9pbigiLCIpfWZ1bmN0aW9uIERmKGEpe3JldHVybiBhLnJlcGxhY2UoRWYsZnVuY3Rpb24oYSxjLGQpey0xPGQuaW5kZXhPZigiKyIpP2Q9ZC5yZXBsYWNlKC9cKy9nLCJfX18iKTotMTxkLmluZGV4T2YoIl9fXyIpJiYoZD1kLnJlcGxhY2UoL19fXy9nLCIrIikpO3JldHVybiI6IitjKyIoIitkKyIpIn0pfQpmdW5jdGlvbiBGZihhKXtmb3IodmFyIGI9W10sYztjPWEubWF0Y2goR2YpOyl7dmFyIGQ9Yy5pbmRleCxlPWxmKGEsZCk7aWYoLTE9PT1lKXRocm93IEVycm9yKGMuaW5wdXQrIiBzZWxlY3RvciBtaXNzaW5nICcpJyIpO2M9YS5zbGljZShkLGUrMSk7YT1hLnJlcGxhY2UoYywiXHVlMDAwIik7Yi5wdXNoKGMpfXJldHVybntoYTphLG1hdGNoZXM6Yn19ZnVuY3Rpb24gSGYoYSxiKXt2YXIgYz1hLnNwbGl0KCJcdWUwMDAiKTtyZXR1cm4gYi5yZWR1Y2UoZnVuY3Rpb24oYSxiLGYpe3JldHVybiBhK2IrY1tmKzFdfSxjWzBdKX0KdGYucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSExO2E9YS50cmltKCk7dmFyIGU9RWYudGVzdChhKTtlJiYoYT1hLnJlcGxhY2UoRWYsZnVuY3Rpb24oYSxiLGMpe3JldHVybiI6IitiKyIoIitjLnJlcGxhY2UoL1xzL2csIiIpKyIpIn0pLGE9RGYoYSkpO3ZhciBmPUdmLnRlc3QoYSk7aWYoZil7dmFyIGc9RmYoYSk7YT1nLmhhO2c9Zy5tYXRjaGVzfWE9YS5yZXBsYWNlKElmLCI6aG9zdCAkMSIpO2E9YS5yZXBsYWNlKEpmLGZ1bmN0aW9uKGEsZSxmKXtkfHwoYT1LZihmLGUsYixjKSxkPWR8fGEuc3RvcCxlPWEuQ2EsZj1hLnZhbHVlKTtyZXR1cm4gZStmfSk7ZiYmKGE9SGYoYSxnKSk7ZSYmKGE9RGYoYSkpO3JldHVybiBhfTsKZnVuY3Rpb24gS2YoYSxiLGMsZCl7dmFyIGU9YS5pbmRleE9mKCI6OnNsb3R0ZWQiKTswPD1hLmluZGV4T2YoIjpob3N0Iik/YT1MZihhLGQpOjAhPT1lJiYoYT1jP01mKGEsYyk6YSk7Yz0hMTswPD1lJiYoYj0iIixjPSEwKTtpZihjKXt2YXIgZj0hMDtjJiYoYT1hLnJlcGxhY2UoTmYsZnVuY3Rpb24oYSxiKXtyZXR1cm4iID4gIitifSkpfWE9YS5yZXBsYWNlKE9mLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4nW2Rpcj0iJytjKyciXSAnK2IrIiwgIitiKydbZGlyPSInK2MrJyJdJ30pO3JldHVybnt2YWx1ZTphLENhOmIsc3RvcDpmfX0KZnVuY3Rpb24gTWYoYSxiKXthPWEuc3BsaXQoLyhcWy4rP1xdKS8pO2Zvcih2YXIgYz1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspaWYoMT09PWQlMiljLnB1c2goYVtkXSk7ZWxzZXt2YXIgZT1hW2RdO2lmKCIiIT09ZXx8ZCE9PWEubGVuZ3RoLTEpZT1lLnNwbGl0KCI6IiksZVswXSs9YixjLnB1c2goZS5qb2luKCI6IikpfXJldHVybiBjLmpvaW4oIiIpfWZ1bmN0aW9uIExmKGEsYil7dmFyIGM9YS5tYXRjaChQZik7cmV0dXJuKGM9YyYmY1syXS50cmltKCl8fCIiKT9jWzBdLm1hdGNoKFFmKT9hLnJlcGxhY2UoUGYsZnVuY3Rpb24oYSxjLGYpe3JldHVybiBiK2Z9KTpjLnNwbGl0KFFmKVswXT09PWI/Yzoic2hvdWxkX25vdF9tYXRjaCI6YS5yZXBsYWNlKCI6aG9zdCIsYil9ZnVuY3Rpb24gUmYoYSl7Ijpyb290Ij09PWEuc2VsZWN0b3ImJihhLnNlbGVjdG9yPSJodG1sIil9CnRmLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLm1hdGNoKCI6aG9zdCIpPyIiOmEubWF0Y2goIjo6c2xvdHRlZCIpP3RoaXMuYihhLCI6bm90KC5zdHlsZS1zY29wZSkiKTpNZihhLnRyaW0oKSwiOm5vdCguc3R5bGUtc2NvcGUpIil9O3AuT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGYucHJvdG90eXBlLHthOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4ic3R5bGUtc2NvcGUifX19KTsKdmFyIEVmPS86KG50aFstXHddKylcKChbXildKylcKS8sSmY9LyhefFtccz4rfl0rKSgoPzpcWy4rP1xdfFteXHM+K349W10pKykvZyxRZj0vW1suOiMqXS8sSWY9L14oOjpzbG90dGVkKS8sUGY9Lyg6aG9zdCkoPzpcKCgoPzpcKFteKShdKlwpfFteKShdKikrPylcKSkvLE5mPS8oPzo6OnNsb3R0ZWQpKD86XCgoKD86XChbXikoXSpcKXxbXikoXSopKz8pXCkpLyxPZj0vKC4qKTpkaXJcKCg/OihsdHJ8cnRsKSlcKS8sR2Y9LzooPzptYXRjaGVzfGFueXwtKD86d2Via2l0fG1veiktYW55KS8sUj1uZXcgdGY7ZnVuY3Rpb24gU2YoYSxiLGMsZCxlKXt0aGlzLkE9YXx8bnVsbDt0aGlzLmI9Ynx8bnVsbDt0aGlzLmZhPWN8fFtdO3RoaXMubz1udWxsO3RoaXMuY3NzQnVpbGQ9ZXx8IiI7dGhpcy5NPWR8fCIiO3RoaXMuYT10aGlzLnM9dGhpcy53PW51bGx9ZnVuY3Rpb24gVChhKXtyZXR1cm4gYT9hLl9fc3R5bGVJbmZvOm51bGx9ZnVuY3Rpb24gVGYoYSxiKXtyZXR1cm4gYS5fX3N0eWxlSW5mbz1ifVNmLnByb3RvdHlwZS5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX07U2YucHJvdG90eXBlLl9nZXRTdHlsZVJ1bGVzPVNmLnByb3RvdHlwZS5jO2Z1bmN0aW9uIFVmKGEpe3ZhciBiPXRoaXMubWF0Y2hlc3x8dGhpcy5tYXRjaGVzU2VsZWN0b3J8fHRoaXMubW96TWF0Y2hlc1NlbGVjdG9yfHx0aGlzLm1zTWF0Y2hlc1NlbGVjdG9yfHx0aGlzLm9NYXRjaGVzU2VsZWN0b3J8fHRoaXMud2Via2l0TWF0Y2hlc1NlbGVjdG9yO3JldHVybiBiJiZiLmNhbGwodGhpcyxhKX12YXIgVmY9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgiVHJpZGVudCIpO2Z1bmN0aW9uIFdmKCl7fWZ1bmN0aW9uIFhmKGEpe3ZhciBiPXt9LGM9W10sZD0wO2RmKGEsZnVuY3Rpb24oYSl7WWYoYSk7YS5pbmRleD1kKys7YT1hLmkuY3NzVGV4dDtmb3IodmFyIGM7Yz1UZS5leGVjKGEpOyl7dmFyIGU9Y1sxXTsiOiIhPT1jWzJdJiYoYltlXT0hMCl9fSxmdW5jdGlvbihhKXtjLnB1c2goYSl9KTthLmI9YzthPVtdO2Zvcih2YXIgZSBpbiBiKWEucHVzaChlKTtyZXR1cm4gYX0KZnVuY3Rpb24gWWYoYSl7aWYoIWEuaSl7dmFyIGI9e30sYz17fTtaZihhLGMpJiYoYi52PWMsYS5ydWxlcz1udWxsKTtiLmNzc1RleHQ9YS5wYXJzZWRDc3NUZXh0LnJlcGxhY2UoYWYsIiIpLnJlcGxhY2UoUmUsIiIpO2EuaT1ifX1mdW5jdGlvbiBaZihhLGIpe3ZhciBjPWEuaTtpZihjKXtpZihjLnYpcmV0dXJuIE9iamVjdC5hc3NpZ24oYixjLnYpLCEwfWVsc2V7Yz1hLnBhcnNlZENzc1RleHQ7Zm9yKHZhciBkO2E9UmUuZXhlYyhjKTspe2Q9KGFbMl18fGFbM10pLnRyaW0oKTtpZigiaW5oZXJpdCIhPT1kfHwidW5zZXQiIT09ZCliW2FbMV0udHJpbSgpXT1kO2Q9ITB9cmV0dXJuIGR9fQpmdW5jdGlvbiAkZihhLGIsYyl7YiYmKGI9MDw9Yi5pbmRleE9mKCI7Iik/YWcoYSxiLGMpOm1mKGIsZnVuY3Rpb24oYixlLGYsZyl7aWYoIWUpcmV0dXJuIGIrZzsoZT0kZihhLGNbZV0sYykpJiYiaW5pdGlhbCIhPT1lPyJhcHBseS1zaGltLWluaGVyaXQiPT09ZSYmKGU9ImluaGVyaXQiKTplPSRmKGEsY1tmXXx8ZixjKXx8ZjtyZXR1cm4gYisoZXx8IiIpK2d9KSk7cmV0dXJuIGImJmIudHJpbSgpfHwiIn0KZnVuY3Rpb24gYWcoYSxiLGMpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgZD0wLGUsZjtkPGIubGVuZ3RoO2QrKylpZihlPWJbZF0pe1NlLmxhc3RJbmRleD0wO2lmKGY9U2UuZXhlYyhlKSllPSRmKGEsY1tmWzFdXSxjKTtlbHNlIGlmKGY9ZS5pbmRleE9mKCI6IiksLTEhPT1mKXt2YXIgZz1lLnN1YnN0cmluZyhmKTtnPWcudHJpbSgpO2c9JGYoYSxnLGMpfHxnO2U9ZS5zdWJzdHJpbmcoMCxmKStnfWJbZF09ZSYmZS5sYXN0SW5kZXhPZigiOyIpPT09ZS5sZW5ndGgtMT9lLnNsaWNlKDAsLTEpOmV8fCIifXJldHVybiBiLmpvaW4oIjsiKX0KZnVuY3Rpb24gYmcoYSxiKXt2YXIgYz17fSxkPVtdO2RmKGEsZnVuY3Rpb24oYSl7YS5pfHxZZihhKTt2YXIgZT1hLmp8fGEucGFyc2VkU2VsZWN0b3I7YiYmYS5pLnYmJmUmJlVmLmNhbGwoYixlKSYmKFpmKGEsYyksYT1hLmluZGV4LGU9cGFyc2VJbnQoYS8zMiwxMCksZFtlXT0oZFtlXXx8MCl8MTw8YSUzMil9LG51bGwsITApO3JldHVybnt2OmMsa2V5OmR9fQpmdW5jdGlvbiBjZyhhLGIsYyxkKXtiLml8fFlmKGIpO2lmKGIuaS52KXt2YXIgZT1wZihhKTthPWUuaXM7ZT1lLk07ZT1hP0JmKGEsZSk6Imh0bWwiO3ZhciBmPWIucGFyc2VkU2VsZWN0b3IsZz0iOmhvc3QgPiAqIj09PWZ8fCJodG1sIj09PWYsaD0wPT09Zi5pbmRleE9mKCI6aG9zdCIpJiYhZzsic2hhZHkiPT09YyYmKGc9Zj09PWUrIiA+ICouIitlfHwtMSE9PWYuaW5kZXhPZigiaHRtbCIpLGg9IWcmJjA9PT1mLmluZGV4T2YoZSkpO2lmKGd8fGgpYz1lLGgmJihiLmp8fChiLmo9Q2YoUixiLFIuYixhPyIuIithOiIiLGUpKSxjPWIuanx8ZSksZCh7aGE6YyxJYTpoLFphOmd9KX19ZnVuY3Rpb24gZGcoYSxiLGMpe3ZhciBkPXt9LGU9e307ZGYoYixmdW5jdGlvbihiKXtjZyhhLGIsYyxmdW5jdGlvbihjKXtVZi5jYWxsKGEuX2VsZW1lbnR8fGEsYy5oYSkmJihjLklhP1pmKGIsZCk6WmYoYixlKSl9KX0sbnVsbCwhMCk7cmV0dXJue1JhOmUsSGE6ZH19CmZ1bmN0aW9uIGVnKGEsYixjLGQpe3ZhciBlPXBmKGIpLGY9QmYoZS5pcyxlLk0pLGc9bmV3IFJlZ0V4cCgiKD86XnxbXi4jWzpdKSIrKGIuZXh0ZW5kcz8iXFwiK2Yuc2xpY2UoMCwtMSkrIlxcXSI6ZikrIigkfFsuOltcXHM+K35dKSIpLGg9VChiKTtlPWguQTtoPWguY3NzQnVpbGQ7dmFyIGs9ZmcoZSxkKTtyZXR1cm4gemYoYixlLGZ1bmN0aW9uKGIpe3ZhciBlPSIiO2IuaXx8WWYoYik7Yi5pLmNzc1RleHQmJihlPWFnKGEsYi5pLmNzc1RleHQsYykpO2IuY3NzVGV4dD1lO2lmKCFPJiYhZmYoYikmJmIuY3NzVGV4dCl7dmFyIGg9ZT1iLmNzc1RleHQ7bnVsbD09Yi5uYSYmKGIubmE9VWUudGVzdChlKSk7aWYoYi5uYSlpZihudWxsPT1iLlUpe2IuVT1bXTtmb3IodmFyIGwgaW4gayloPWtbbF0saD1oKGUpLGUhPT1oJiYoZT1oLGIuVS5wdXNoKGwpKX1lbHNle2ZvcihsPTA7bDxiLlUubGVuZ3RoOysrbCloPWtbYi5VW2xdXSxlPWgoZSk7aD1lfWIuY3NzVGV4dD1oO2Iuaj1iLmp8fApiLnNlbGVjdG9yO2U9Ii4iK2Q7bD1xZihiLmopO2g9MDtmb3IodmFyIE09bC5sZW5ndGgsVT12b2lkIDA7aDxNJiYoVT1sW2hdKTtoKyspbFtoXT1VLm1hdGNoKGcpP1UucmVwbGFjZShmLGUpOmUrIiAiK1U7Yi5zZWxlY3Rvcj1sLmpvaW4oIiwiKX19LGgpfWZ1bmN0aW9uIGZnKGEsYil7YT1hLmI7dmFyIGM9e307aWYoIU8mJmEpZm9yKHZhciBkPTAsZT1hW2RdO2Q8YS5sZW5ndGg7ZT1hWysrZF0pe3ZhciBmPWUsZz1iO2YuZj1uZXcgUmVnRXhwKCJcXGIiK2Yua2V5ZnJhbWVzTmFtZSsiKD8hXFxCfC0pIiwiZyIpO2YuYT1mLmtleWZyYW1lc05hbWUrIi0iK2c7Zi5qPWYuanx8Zi5zZWxlY3RvcjtmLnNlbGVjdG9yPWYuai5yZXBsYWNlKGYua2V5ZnJhbWVzTmFtZSxmLmEpO2NbZS5rZXlmcmFtZXNOYW1lXT1nZyhlKX1yZXR1cm4gY31mdW5jdGlvbiBnZyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGIucmVwbGFjZShhLmYsYS5hKX19CmZ1bmN0aW9uIGhnKGEsYil7dmFyIGM9aWcsZD1lZihhKTthLnRleHRDb250ZW50PWNmKGQsZnVuY3Rpb24oYSl7dmFyIGQ9YS5jc3NUZXh0PWEucGFyc2VkQ3NzVGV4dDthLmkmJmEuaS5jc3NUZXh0JiYoZD1kLnJlcGxhY2UoSWUsIiIpLnJlcGxhY2UoSmUsIiIpLGEuY3NzVGV4dD1hZyhjLGQsYikpfSl9cC5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhXZi5wcm90b3R5cGUse2E6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiJ4LXNjb3BlIn19fSk7dmFyIGlnPW5ldyBXZjt2YXIgamc9e30sa2c9d2luZG93LmN1c3RvbUVsZW1lbnRzO2lmKGtnJiYhTyYmIVBlKXt2YXIgbGc9a2cuZGVmaW5lO2tnLmRlZmluZT1mdW5jdGlvbihhLGIsYyl7amdbYV18fChqZ1thXT1rZihhKSk7bGcuY2FsbChrZyxhLGIsYyl9fTtmdW5jdGlvbiBtZygpe3RoaXMuY2FjaGU9e319bWcucHJvdG90eXBlLnN0b3JlPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuY2FjaGVbYV18fFtdO2UucHVzaCh7djpiLHN0eWxlRWxlbWVudDpjLHM6ZH0pOzEwMDxlLmxlbmd0aCYmZS5zaGlmdCgpO3RoaXMuY2FjaGVbYV09ZX07ZnVuY3Rpb24gbmcoKXt9dmFyIG9nPW5ldyBSZWdFeHAoUi5hKyJcXHMqKFteXFxzXSopIik7ZnVuY3Rpb24gcGcoYSl7cmV0dXJuKGE9KGEuY2xhc3NMaXN0JiZhLmNsYXNzTGlzdC52YWx1ZT9hLmNsYXNzTGlzdC52YWx1ZTphLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpLm1hdGNoKG9nKSk/YVsxXToiIn1mdW5jdGlvbiBxZyhhKXt2YXIgYj1vZihhKS5nZXRSb290Tm9kZSgpO3JldHVybiBiPT09YXx8Yj09PWEub3duZXJEb2N1bWVudD8iIjooYT1iLmhvc3QpP3BmKGEpLmlzOiIifQpmdW5jdGlvbiByZyhhKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXTtpZihjLnRhcmdldCE9PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmYy50YXJnZXQhPT1kb2N1bWVudC5oZWFkKWZvcih2YXIgZD0wO2Q8Yy5hZGRlZE5vZGVzLmxlbmd0aDtkKyspe3ZhciBlPWMuYWRkZWROb2Rlc1tkXTtpZihlLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe3ZhciBmPWUuZ2V0Um9vdE5vZGUoKSxnPXBnKGUpO2lmKGcmJmY9PT1lLm93bmVyRG9jdW1lbnQmJigic3R5bGUiIT09ZS5sb2NhbE5hbWUmJiJ0ZW1wbGF0ZSIhPT1lLmxvY2FsTmFtZXx8IiI9PT1yZihlKSkpeWYoZSxnKTtlbHNlIGlmKGYgaW5zdGFuY2VvZiBTaGFkb3dSb290KWZvcihmPXFnKGUpLGYhPT1nJiZ4ZihlLGcsZiksZT13aW5kb3cuU2hhZHlET00ubmF0aXZlTWV0aG9kcy5xdWVyeVNlbGVjdG9yQWxsLmNhbGwoZSwiOm5vdCguIitSLmErIikiKSxnPTA7ZzxlLmxlbmd0aDtnKyspe2Y9ZVtnXTsKdmFyIGg9cWcoZik7aCYmd2YoZixoKX19fX19CmlmKCEoT3x8d2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaGFuZGxlc0R5bmFtaWNTY29waW5nKSl7dmFyIHNnPW5ldyBNdXRhdGlvbk9ic2VydmVyKHJnKSx0Zz1mdW5jdGlvbihhKXtzZy5vYnNlcnZlKGEse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSl9O2lmKHdpbmRvdy5jdXN0b21FbGVtZW50cyYmIXdpbmRvdy5jdXN0b21FbGVtZW50cy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrKXRnKGRvY3VtZW50KTtlbHNle3ZhciB1Zz1mdW5jdGlvbigpe3RnKGRvY3VtZW50LmJvZHkpfTt3aW5kb3cuSFRNTEltcG9ydHM/d2luZG93LkhUTUxJbXBvcnRzLndoZW5SZWFkeSh1Zyk6cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7aWYoImxvYWRpbmciPT09ZG9jdW1lbnQucmVhZHlTdGF0ZSl7dmFyIGE9ZnVuY3Rpb24oKXt1ZygpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGEpfTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIiwKYSl9ZWxzZSB1ZygpfSl9bmc9ZnVuY3Rpb24oKXtyZyhzZy50YWtlUmVjb3JkcygpKX19dmFyIHZnPW5nO3ZhciB3Zz17fTt2YXIgeGc9UHJvbWlzZS5yZXNvbHZlKCk7ZnVuY3Rpb24geWcoYSl7aWYoYT13Z1thXSlhLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj1hLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbnx8MCxhLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbj1hLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbnx8MCxhLl9hcHBseVNoaW1OZXh0VmVyc2lvbj0oYS5fYXBwbHlTaGltTmV4dFZlcnNpb258fDApKzF9ZnVuY3Rpb24gemcoYSl7cmV0dXJuIGEuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPT09YS5fYXBwbHlTaGltTmV4dFZlcnNpb259ZnVuY3Rpb24gQWcoYSl7YS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb249YS5fYXBwbHlTaGltTmV4dFZlcnNpb247YS5fdmFsaWRhdGluZ3x8KGEuX3ZhbGlkYXRpbmc9ITAseGcudGhlbihmdW5jdGlvbigpe2EuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPWEuX2FwcGx5U2hpbU5leHRWZXJzaW9uO2EuX3ZhbGlkYXRpbmc9ITF9KSl9O3ZhciBCZz17fSxDZz1uZXcgbWc7ZnVuY3Rpb24gWSgpe3RoaXMubD17fTt0aGlzLmM9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O3ZhciBhPW5ldyB2ZTthLnJ1bGVzPVtdO3RoaXMuZj1UZih0aGlzLmMsbmV3IFNmKGEpKTt0aGlzLmc9ITE7dGhpcy5iPXRoaXMuYT1udWxsfW49WS5wcm90b3R5cGU7bi5mbHVzaD1mdW5jdGlvbigpe3ZnKCl9O24uRmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGVmKGEpfTtuLlZhPWZ1bmN0aW9uKGEpe3JldHVybiBjZihhKX07bi5wcmVwYXJlVGVtcGxhdGU9ZnVuY3Rpb24oYSxiLGMpe3RoaXMucHJlcGFyZVRlbXBsYXRlRG9tKGEsYik7dGhpcy5wcmVwYXJlVGVtcGxhdGVTdHlsZXMoYSxiLGMpfTsKbi5wcmVwYXJlVGVtcGxhdGVTdHlsZXM9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhLl9wcmVwYXJlZCYmIVBlKXtPfHxqZ1tiXXx8KGpnW2JdPWtmKGIpKTthLl9wcmVwYXJlZD0hMDthLm5hbWU9YjthLmV4dGVuZHM9Yzt3Z1tiXT1hO3ZhciBkPXJmKGEpLGU9c2YoZCk7Yz17aXM6YixleHRlbmRzOmN9O2Zvcih2YXIgZj1bXSxnPWEuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCJzdHlsZSIpLGg9MDtoPGcubGVuZ3RoO2grKyl7dmFyIGs9Z1toXTtpZihrLmhhc0F0dHJpYnV0ZSgic2hhZHktdW5zY29wZWQiKSl7aWYoIU8pe3ZhciBsPWsudGV4dENvbnRlbnQ7YmYuaGFzKGwpfHwoYmYuYWRkKGwpLGw9ay5jbG9uZU5vZGUoITApLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCkpO2sucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChrKX19ZWxzZSBmLnB1c2goay50ZXh0Q29udGVudCksay5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGspfWY9Zi5qb2luKCIiKS50cmltKCkrKEJnW2JdfHwiIik7CkRnKHRoaXMpO2lmKCFlKXtpZihnPSFkKWc9U2UudGVzdChmKXx8UmUudGVzdChmKSxTZS5sYXN0SW5kZXg9MCxSZS5sYXN0SW5kZXg9MDtoPXdlKGYpO2cmJlEmJnRoaXMuYSYmdGhpcy5hLnRyYW5zZm9ybVJ1bGVzKGgsYik7YS5fc3R5bGVBc3Q9aH1nPVtdO1F8fChnPVhmKGEuX3N0eWxlQXN0KSk7aWYoIWcubGVuZ3RofHxRKWg9Tz9hLmNvbnRlbnQ6bnVsbCxiPWpnW2JdfHxudWxsLGQ9emYoYyxhLl9zdHlsZUFzdCxudWxsLGQsZT9mOiIiKSxkPWQubGVuZ3RoP2dmKGQsYy5pcyxoLGIpOm51bGwsYS5fc3R5bGU9ZDthLmE9Z319O24uUWE9ZnVuY3Rpb24oYSxiKXtCZ1tiXT1hLmpvaW4oIiAiKX07bi5wcmVwYXJlVGVtcGxhdGVEb209ZnVuY3Rpb24oYSxiKXtpZighUGUpe3ZhciBjPXJmKGEpO098fCJzaGFkeSI9PT1jfHxhLl9kb21QcmVwYXJlZHx8KGEuX2RvbVByZXBhcmVkPSEwLHVmKGEuY29udGVudCxiKSl9fTsKZnVuY3Rpb24gRWcoYSl7dmFyIGI9cGYoYSksYz1iLmlzO2I9Yi5NO3ZhciBkPWpnW2NdfHxudWxsLGU9d2dbY107aWYoZSl7Yz1lLl9zdHlsZUFzdDt2YXIgZj1lLmE7ZT1yZihlKTtiPW5ldyBTZihjLGQsZixiLGUpO1RmKGEsYik7cmV0dXJuIGJ9fWZ1bmN0aW9uIEZnKGEpeyFhLmImJndpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlJiYoYS5iPXdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSxhLmIudHJhbnNmb3JtQ2FsbGJhY2s9ZnVuY3Rpb24oYil7YS5yYShiKX0sYS5iLnZhbGlkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXsoYS5iLmVucXVldWVkfHxhLmcpJiZhLmZsdXNoQ3VzdG9tU3R5bGVzKCl9KX0pfQpmdW5jdGlvbiBEZyhhKXshYS5hJiZ3aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW0mJihhLmE9d2luZG93LlNoYWR5Q1NTLkFwcGx5U2hpbSxhLmEuaW52YWxpZENhbGxiYWNrPXlnKTtGZyhhKX0Kbi5mbHVzaEN1c3RvbVN0eWxlcz1mdW5jdGlvbigpe2lmKCFQZSYmKERnKHRoaXMpLHRoaXMuYikpe3ZhciBhPXRoaXMuYi5wcm9jZXNzU3R5bGVzKCk7aWYodGhpcy5iLmVucXVldWVkJiYhc2YodGhpcy5mLmNzc0J1aWxkKSl7aWYoUSl7aWYoIXRoaXMuZi5jc3NCdWlsZClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5iLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUoYVtiXSk7aWYoYyYmUSYmdGhpcy5hKXt2YXIgZD1lZihjKTtEZyh0aGlzKTt0aGlzLmEudHJhbnNmb3JtUnVsZXMoZCk7Yy50ZXh0Q29udGVudD1jZihkKX19fWVsc2V7R2codGhpcyx0aGlzLmMsdGhpcy5mKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKShjPXRoaXMuYi5nZXRTdHlsZUZvckN1c3RvbVN0eWxlKGFbYl0pKSYmaGcoYyx0aGlzLmYudyk7dGhpcy5nJiZ0aGlzLnN0eWxlRG9jdW1lbnQoKX10aGlzLmIuZW5xdWV1ZWQ9ITF9fX07Cm4uc3R5bGVFbGVtZW50PWZ1bmN0aW9uKGEsYil7aWYoUGUpe2lmKGIpe1QoYSl8fFRmKGEsbmV3IFNmKG51bGwpKTt2YXIgYz1UKGEpO2Mubz1jLm98fHt9O09iamVjdC5hc3NpZ24oYy5vLGIpO0hnKHRoaXMsYSxjKX19ZWxzZSBpZihjPVQoYSl8fEVnKGEpKWlmKGEhPT10aGlzLmMmJih0aGlzLmc9ITApLGImJihjLm89Yy5vfHx7fSxPYmplY3QuYXNzaWduKGMubyxiKSksUSlIZyh0aGlzLGEsYyk7ZWxzZSBpZih0aGlzLmZsdXNoKCksR2codGhpcyxhLGMpLGMuZmEmJmMuZmEubGVuZ3RoKXtiPXBmKGEpLmlzO3ZhciBkO2E6e2lmKGQ9Q2cuY2FjaGVbYl0pZm9yKHZhciBlPWQubGVuZ3RoLTE7MDw9ZTtlLS0pe3ZhciBmPWRbZV07Yjp7dmFyIGc9Yy5mYTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKyl7dmFyIGs9Z1toXTtpZihmLnZba10hPT1jLndba10pe2c9ITE7YnJlYWsgYn19Zz0hMH1pZihnKXtkPWY7YnJlYWsgYX19ZD12b2lkIDB9Zz1kP2Quc3R5bGVFbGVtZW50Om51bGw7CmU9Yy5zOyhmPWQmJmQucyl8fChmPXRoaXMubFtiXT0odGhpcy5sW2JdfHwwKSsxLGY9YisiLSIrZik7Yy5zPWY7Zj1jLnM7aD1pZztoPWc/Zy50ZXh0Q29udGVudHx8IiI6ZWcoaCxhLGMudyxmKTtrPVQoYSk7dmFyIGw9ay5hO2wmJiFPJiZsIT09ZyYmKGwuX3VzZUNvdW50LS0sMD49bC5fdXNlQ291bnQmJmwucGFyZW50Tm9kZSYmbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGwpKTtPP2suYT8oay5hLnRleHRDb250ZW50PWgsZz1rLmEpOmgmJihnPWdmKGgsZixhLnNoYWRvd1Jvb3Qsay5iKSk6Zz9nLnBhcmVudE5vZGV8fChWZiYmLTE8aC5pbmRleE9mKCJAbWVkaWEiKSYmKGcudGV4dENvbnRlbnQ9aCksaGYoZyxudWxsLGsuYikpOmgmJihnPWdmKGgsZixudWxsLGsuYikpO2cmJihnLl91c2VDb3VudD1nLl91c2VDb3VudHx8MCxrLmEhPWcmJmcuX3VzZUNvdW50Kyssay5hPWcpO2Y9ZztPfHwoZz1jLnMsaz1oPWEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIixlJiYoaz1oLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFxzKngtc2NvcGVcXHMqIisKZSsiXFxzKiIsImciKSwiICIpKSxrKz0oaz8iICI6IiIpKyJ4LXNjb3BlICIrZyxoIT09ayYmbmYoYSxrKSk7ZHx8Q2cuc3RvcmUoYixjLncsZixjLnMpfX07CmZ1bmN0aW9uIEhnKGEsYixjKXt2YXIgZD1wZihiKS5pcztpZihjLm8pe3ZhciBlPWMubyxmO2ZvcihmIGluIGUpbnVsbD09PWY/Yi5zdHlsZS5yZW1vdmVQcm9wZXJ0eShmKTpiLnN0eWxlLnNldFByb3BlcnR5KGYsZVtmXSl9ZT13Z1tkXTtpZighKCFlJiZiIT09YS5jfHxlJiYiIiE9PXJmKGUpKSYmZSYmZS5fc3R5bGUmJiF6ZyhlKSl7aWYoemcoZSl8fGUuX2FwcGx5U2hpbVZhbGlkYXRpbmdWZXJzaW9uIT09ZS5fYXBwbHlTaGltTmV4dFZlcnNpb24pRGcoYSksYS5hJiZhLmEudHJhbnNmb3JtUnVsZXMoZS5fc3R5bGVBc3QsZCksZS5fc3R5bGUudGV4dENvbnRlbnQ9emYoYixjLkEpLEFnKGUpO08mJihhPWIuc2hhZG93Um9vdCkmJihhPWEucXVlcnlTZWxlY3Rvcigic3R5bGUiKSkmJihhLnRleHRDb250ZW50PXpmKGIsYy5BKSk7Yy5BPWUuX3N0eWxlQXN0fX0KZnVuY3Rpb24gSWcoYSxiKXtyZXR1cm4oYj1vZihiKS5nZXRSb290Tm9kZSgpLmhvc3QpP1QoYil8fEVnKGIpP2I6SWcoYSxiKTphLmN9ZnVuY3Rpb24gR2coYSxiLGMpe3ZhciBkPUlnKGEsYiksZT1UKGQpLGY9ZS53O2Q9PT1hLmN8fGZ8fChHZyhhLGQsZSksZj1lLncpO2E9T2JqZWN0LmNyZWF0ZShmfHxudWxsKTtkPWRnKGIsYy5BLGMuY3NzQnVpbGQpO2I9YmcoZS5BLGIpLnY7T2JqZWN0LmFzc2lnbihhLGQuSGEsYixkLlJhKTtiPWMubztmb3IodmFyIGcgaW4gYilpZigoZT1iW2ddKXx8MD09PWUpYVtnXT1lO2c9aWc7Yj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhKTtmb3IoZT0wO2U8Yi5sZW5ndGg7ZSsrKWQ9YltlXSxhW2RdPSRmKGcsYVtkXSxhKTtjLnc9YX1uLnN0eWxlRG9jdW1lbnQ9ZnVuY3Rpb24oYSl7dGhpcy5zdHlsZVN1YnRyZWUodGhpcy5jLGEpfTsKbi5zdHlsZVN1YnRyZWU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1vZihhKSxkPWMuc2hhZG93Um9vdDsoZHx8YT09PXRoaXMuYykmJnRoaXMuc3R5bGVFbGVtZW50KGEsYik7aWYoYT1kJiYoZC5jaGlsZHJlbnx8ZC5jaGlsZE5vZGVzKSlmb3IoYz0wO2M8YS5sZW5ndGg7YysrKXRoaXMuc3R5bGVTdWJ0cmVlKGFbY10pO2Vsc2UgaWYoYz1jLmNoaWxkcmVufHxjLmNoaWxkTm9kZXMpZm9yKGE9MDthPGMubGVuZ3RoO2ErKyl0aGlzLnN0eWxlU3VidHJlZShjW2FdKX07Cm4ucmE9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPXJmKGEpO2MhPT10aGlzLmYuY3NzQnVpbGQmJih0aGlzLmYuY3NzQnVpbGQ9Yyk7aWYoIXNmKGMpKXt2YXIgZD1lZihhKTtkZihkLGZ1bmN0aW9uKGEpe2lmKE8pUmYoYSk7ZWxzZXt2YXIgZD1SO2Euc2VsZWN0b3I9YS5wYXJzZWRTZWxlY3RvcjtSZihhKTthLnNlbGVjdG9yPWEuaj1DZihkLGEsZC5jLHZvaWQgMCx2b2lkIDApfVEmJiIiPT09YyYmKERnKGIpLGIuYSYmYi5hLnRyYW5zZm9ybVJ1bGUoYSkpfSk7UT9hLnRleHRDb250ZW50PWNmKGQpOnRoaXMuZi5BLnJ1bGVzLnB1c2goZCl9fTtuLmdldENvbXB1dGVkU3R5bGVWYWx1ZT1mdW5jdGlvbihhLGIpe3ZhciBjO1F8fChjPShUKGEpfHxUKElnKHRoaXMsYSkpKS53W2JdKTtyZXR1cm4oYz1jfHx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKGIpKT9jLnRyaW0oKToiIn07Cm4uVWE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1vZihhKS5nZXRSb290Tm9kZSgpO2I9Yj9iLnNwbGl0KC9ccy8pOltdO2M9Yy5ob3N0JiZjLmhvc3QubG9jYWxOYW1lO2lmKCFjKXt2YXIgZD1hLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTtpZihkKXtkPWQuc3BsaXQoL1xzLyk7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspaWYoZFtlXT09PVIuYSl7Yz1kW2UrMV07YnJlYWt9fX1jJiZiLnB1c2goUi5hLGMpO1F8fChjPVQoYSkpJiZjLnMmJmIucHVzaChpZy5hLGMucyk7bmYoYSxiLmpvaW4oIiAiKSl9O24uQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIFQoYSl9O24uVGE9ZnVuY3Rpb24oYSxiKXt3ZihhLGIpfTtuLldhPWZ1bmN0aW9uKGEsYil7d2YoYSxiLCEwKX07bi5TYT1mdW5jdGlvbihhKXtyZXR1cm4gcWcoYSl9O24uRGE9ZnVuY3Rpb24oYSl7cmV0dXJuIHBnKGEpfTtZLnByb3RvdHlwZS5mbHVzaD1ZLnByb3RvdHlwZS5mbHVzaDtZLnByb3RvdHlwZS5wcmVwYXJlVGVtcGxhdGU9WS5wcm90b3R5cGUucHJlcGFyZVRlbXBsYXRlOwpZLnByb3RvdHlwZS5zdHlsZUVsZW1lbnQ9WS5wcm90b3R5cGUuc3R5bGVFbGVtZW50O1kucHJvdG90eXBlLnN0eWxlRG9jdW1lbnQ9WS5wcm90b3R5cGUuc3R5bGVEb2N1bWVudDtZLnByb3RvdHlwZS5zdHlsZVN1YnRyZWU9WS5wcm90b3R5cGUuc3R5bGVTdWJ0cmVlO1kucHJvdG90eXBlLmdldENvbXB1dGVkU3R5bGVWYWx1ZT1ZLnByb3RvdHlwZS5nZXRDb21wdXRlZFN0eWxlVmFsdWU7WS5wcm90b3R5cGUuc2V0RWxlbWVudENsYXNzPVkucHJvdG90eXBlLlVhO1kucHJvdG90eXBlLl9zdHlsZUluZm9Gb3JOb2RlPVkucHJvdG90eXBlLkJhO1kucHJvdG90eXBlLnRyYW5zZm9ybUN1c3RvbVN0eWxlRm9yRG9jdW1lbnQ9WS5wcm90b3R5cGUucmE7WS5wcm90b3R5cGUuZ2V0U3R5bGVBc3Q9WS5wcm90b3R5cGUuRmE7WS5wcm90b3R5cGUuc3R5bGVBc3RUb1N0cmluZz1ZLnByb3RvdHlwZS5WYTtZLnByb3RvdHlwZS5mbHVzaEN1c3RvbVN0eWxlcz1ZLnByb3RvdHlwZS5mbHVzaEN1c3RvbVN0eWxlczsKWS5wcm90b3R5cGUuc2NvcGVOb2RlPVkucHJvdG90eXBlLlRhO1kucHJvdG90eXBlLnVuc2NvcGVOb2RlPVkucHJvdG90eXBlLldhO1kucHJvdG90eXBlLnNjb3BlRm9yTm9kZT1ZLnByb3RvdHlwZS5TYTtZLnByb3RvdHlwZS5jdXJyZW50U2NvcGVGb3JOb2RlPVkucHJvdG90eXBlLkRhO1kucHJvdG90eXBlLnByZXBhcmVBZG9wdGVkQ3NzVGV4dD1ZLnByb3RvdHlwZS5RYTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhZLnByb3RvdHlwZSx7bmF0aXZlU2hhZG93OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gT319LG5hdGl2ZUNzczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFF9fX0pO3ZhciBaPW5ldyBZLEpnLEtnO3dpbmRvdy5TaGFkeUNTUyYmKEpnPXdpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW0sS2c9d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlKTsKd2luZG93LlNoYWR5Q1NTPXtTY29waW5nU2hpbTpaLHByZXBhcmVUZW1wbGF0ZTpmdW5jdGlvbihhLGIsYyl7Wi5mbHVzaEN1c3RvbVN0eWxlcygpO1oucHJlcGFyZVRlbXBsYXRlKGEsYixjKX0scHJlcGFyZVRlbXBsYXRlRG9tOmZ1bmN0aW9uKGEsYil7Wi5wcmVwYXJlVGVtcGxhdGVEb20oYSxiKX0scHJlcGFyZVRlbXBsYXRlU3R5bGVzOmZ1bmN0aW9uKGEsYixjKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5wcmVwYXJlVGVtcGxhdGVTdHlsZXMoYSxiLGMpfSxzdHlsZVN1YnRyZWU6ZnVuY3Rpb24oYSxiKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5zdHlsZVN1YnRyZWUoYSxiKX0sc3R5bGVFbGVtZW50OmZ1bmN0aW9uKGEpe1ouZmx1c2hDdXN0b21TdHlsZXMoKTtaLnN0eWxlRWxlbWVudChhKX0sc3R5bGVEb2N1bWVudDpmdW5jdGlvbihhKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5zdHlsZURvY3VtZW50KGEpfSxmbHVzaEN1c3RvbVN0eWxlczpmdW5jdGlvbigpe1ouZmx1c2hDdXN0b21TdHlsZXMoKX0sCmdldENvbXB1dGVkU3R5bGVWYWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBaLmdldENvbXB1dGVkU3R5bGVWYWx1ZShhLGIpfSxuYXRpdmVDc3M6USxuYXRpdmVTaGFkb3c6Tyxjc3NCdWlsZDpRZSxkaXNhYmxlUnVudGltZTpQZX07SmcmJih3aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltPUpnKTtLZyYmKHdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZT1LZyk7dmFyIExnPXdpbmRvdy5jdXN0b21FbGVtZW50cyxNZz13aW5kb3cuSFRNTEltcG9ydHMsTmc9d2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQ7d2luZG93LldlYkNvbXBvbmVudHM9d2luZG93LldlYkNvbXBvbmVudHN8fHt9O2lmKExnJiZMZy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrKXt2YXIgT2csUGc9ZnVuY3Rpb24oKXtpZihPZyl7TmcuQyYmTmcuQyh3aW5kb3cuZG9jdW1lbnQpO3ZhciBhPU9nO09nPW51bGw7YSgpO3JldHVybiEwfX0sUWc9TWcud2hlblJlYWR5O0xnLnBvbHlmaWxsV3JhcEZsdXNoQ2FsbGJhY2soZnVuY3Rpb24oYSl7T2c9YTtRZyhQZyl9KTtNZy53aGVuUmVhZHk9ZnVuY3Rpb24oYSl7UWcoZnVuY3Rpb24oKXtQZygpP01nLndoZW5SZWFkeShhKTphKCl9KX19Ck1nLndoZW5SZWFkeShmdW5jdGlvbigpe3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3dpbmRvdy5XZWJDb21wb25lbnRzLnJlYWR5PSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJXZWJDb21wb25lbnRzUmVhZHkiLHtidWJibGVzOiEwfSkpfSl9KTt2YXIgUmc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtSZy50ZXh0Q29udGVudD0iYm9keSB7dHJhbnNpdGlvbjogb3BhY2l0eSBlYXNlLWluIDAuMnM7IH0gXG5ib2R5W3VucmVzb2x2ZWRdIHtvcGFjaXR5OiAwOyBkaXNwbGF5OiBibG9jazsgb3ZlcmZsb3c6IGhpZGRlbjsgcG9zaXRpb246IHJlbGF0aXZlOyB9IFxuIjt2YXIgU2c9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiaGVhZCIpO1NnLmluc2VydEJlZm9yZShSZyxTZy5maXJzdENoaWxkKTt9KS5jYWxsKHRoaXMpOwoKCgooZnVuY3Rpb24oKXsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KJ3VzZSBzdHJpY3QnO3ZhciBsPSEod2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaW5Vc2UpLHA7ZnVuY3Rpb24gcihhKXtwPWEmJmEuc2hpbWNzc3Byb3BlcnRpZXM/ITE6bHx8IShuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFwvNjAxfEVkZ2VcLzE1Lyl8fCF3aW5kb3cuQ1NTfHwhQ1NTLnN1cHBvcnRzfHwhQ1NTLnN1cHBvcnRzKCJib3gtc2hhZG93IiwiMCAwIDAgdmFyKC0tZm9vKSIpKX12YXIgdDt3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5jc3NCdWlsZCYmKHQ9d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkKTt2YXIgYWE9ISghd2luZG93LlNoYWR5Q1NTfHwhd2luZG93LlNoYWR5Q1NTLmRpc2FibGVSdW50aW1lKTsKd2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MubmF0aXZlQ3NzP3A9d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzczp3aW5kb3cuU2hhZHlDU1M/KHIod2luZG93LlNoYWR5Q1NTKSx3aW5kb3cuU2hhZHlDU1M9dm9pZCAwKTpyKHdpbmRvdy5XZWJDb21wb25lbnRzJiZ3aW5kb3cuV2ViQ29tcG9uZW50cy5mbGFncyk7dmFyIHU9cCx2PXQ7ZnVuY3Rpb24gdygpe3RoaXMuZW5kPXRoaXMuc3RhcnQ9MDt0aGlzLnJ1bGVzPXRoaXMucGFyZW50PXRoaXMucHJldmlvdXM9bnVsbDt0aGlzLmNzc1RleHQ9dGhpcy5wYXJzZWRDc3NUZXh0PSIiO3RoaXMuYXRSdWxlPSExO3RoaXMudHlwZT0wO3RoaXMucGFyc2VkU2VsZWN0b3I9dGhpcy5zZWxlY3Rvcj10aGlzLmtleWZyYW1lc05hbWU9IiJ9CmZ1bmN0aW9uIHgoYSl7YT1hLnJlcGxhY2UoYmEsIiIpLnJlcGxhY2UoY2EsIiIpO3ZhciBiPXksYz1hLGU9bmV3IHc7ZS5zdGFydD0wO2UuZW5kPWMubGVuZ3RoO2Zvcih2YXIgZD1lLGY9MCxnPWMubGVuZ3RoO2Y8ZztmKyspaWYoInsiPT09Y1tmXSl7ZC5ydWxlc3x8KGQucnVsZXM9W10pO3ZhciBoPWQsaz1oLnJ1bGVzW2gucnVsZXMubGVuZ3RoLTFdfHxudWxsO2Q9bmV3IHc7ZC5zdGFydD1mKzE7ZC5wYXJlbnQ9aDtkLnByZXZpb3VzPWs7aC5ydWxlcy5wdXNoKGQpfWVsc2UifSI9PT1jW2ZdJiYoZC5lbmQ9ZisxLGQ9ZC5wYXJlbnR8fGUpO3JldHVybiBiKGUsYSl9CmZ1bmN0aW9uIHkoYSxiKXt2YXIgYz1iLnN1YnN0cmluZyhhLnN0YXJ0LGEuZW5kLTEpO2EucGFyc2VkQ3NzVGV4dD1hLmNzc1RleHQ9Yy50cmltKCk7YS5wYXJlbnQmJihjPWIuc3Vic3RyaW5nKGEucHJldmlvdXM/YS5wcmV2aW91cy5lbmQ6YS5wYXJlbnQuc3RhcnQsYS5zdGFydC0xKSxjPWRhKGMpLGM9Yy5yZXBsYWNlKHosIiAiKSxjPWMuc3Vic3RyaW5nKGMubGFzdEluZGV4T2YoIjsiKSsxKSxjPWEucGFyc2VkU2VsZWN0b3I9YS5zZWxlY3Rvcj1jLnRyaW0oKSxhLmF0UnVsZT0wPT09Yy5pbmRleE9mKCJAIiksYS5hdFJ1bGU/MD09PWMuaW5kZXhPZigiQG1lZGlhIik/YS50eXBlPUE6Yy5tYXRjaChlYSkmJihhLnR5cGU9QixhLmtleWZyYW1lc05hbWU9YS5zZWxlY3Rvci5zcGxpdCh6KS5wb3AoKSk6YS50eXBlPTA9PT1jLmluZGV4T2YoIi0tIik/QzpEKTtpZihjPWEucnVsZXMpZm9yKHZhciBlPTAsZD1jLmxlbmd0aCxmPXZvaWQgMDtlPGQmJihmPWNbZV0pO2UrKyl5KGYsYik7CnJldHVybiBhfWZ1bmN0aW9uIGRhKGEpe3JldHVybiBhLnJlcGxhY2UoL1xcKFswLTlhLWZdezEsNn0pXHMvZ2ksZnVuY3Rpb24oYSxjKXthPWM7Zm9yKGM9Ni1hLmxlbmd0aDtjLS07KWE9IjAiK2E7cmV0dXJuIlxcIithfSl9CmZ1bmN0aW9uIEUoYSxiLGMpe2M9dm9pZCAwPT09Yz8iIjpjO3ZhciBlPSIiO2lmKGEuY3NzVGV4dHx8YS5ydWxlcyl7dmFyIGQ9YS5ydWxlcyxmO2lmKGY9ZClmPWRbMF0sZj0hKGYmJmYuc2VsZWN0b3ImJjA9PT1mLnNlbGVjdG9yLmluZGV4T2YoIi0tIikpO2lmKGYpe2Y9MDtmb3IodmFyIGc9ZC5sZW5ndGgsaD12b2lkIDA7ZjxnJiYoaD1kW2ZdKTtmKyspZT1FKGgsYixlKX1lbHNlIGI/Yj1hLmNzc1RleHQ6KGI9YS5jc3NUZXh0LGI9Yi5yZXBsYWNlKGZhLCIiKS5yZXBsYWNlKGhhLCIiKSxiPWIucmVwbGFjZShpYSwiIikucmVwbGFjZShqYSwiIikpLChlPWIudHJpbSgpKSYmKGU9IiAgIitlKyJcbiIpfWUmJihhLnNlbGVjdG9yJiYoYys9YS5zZWxlY3RvcisiIHtcbiIpLGMrPWUsYS5zZWxlY3RvciYmKGMrPSJ9XG5cbiIpKTtyZXR1cm4gY30KdmFyIEQ9MSxCPTcsQT00LEM9MUUzLGJhPS9cL1wqW14qXSpcKisoW14vKl1bXipdKlwqKykqXC8vZ2ltLGNhPS9AaW1wb3J0W147XSo7L2dpbSxmYT0vKD86XlteO1wtXHN9XSspPy0tW147e31dKj86W157fTtdKj8oPzpbO1xuXXwkKS9naW0saGE9Lyg/Ol5bXjtcLVxzfV0rKT8tLVteO3t9XSo/Oltee307XSo/e1tefV0qP30oPzpbO1xuXXwkKT8vZ2ltLGlhPS9AYXBwbHlccypcKD9bXik7XSpcKT9ccyooPzpbO1xuXXwkKT8vZ2ltLGphPS9bXjs6XSo/OlteO10qP3ZhclwoW147XSpcKSg/Ols7XG5dfCQpPy9naW0sZWE9L15AW15cc10qa2V5ZnJhbWVzLyx6PS9ccysvZzt2YXIgRz0vKD86XnxbO1xze11ccyopKC0tW1x3LV0qPylccyo6XHMqKD86KCg/OicoPzpcXCd8LikqPyd8Iig/OlxcInwuKSo/InxcKFteKV0qP1wpfFtefTt7XSkrKXxceyhbXn1dKilcfSg/Oig/PVs7XHN9XSl8JCkpL2dpLEg9Lyg/Ol58XFcrKUBhcHBseVxzKlwoPyhbXik7XG5dKilcKT8vZ2ksa2E9L0BtZWRpYVxzKC4qKS87dmFyIEk9bmV3IFNldDtmdW5jdGlvbiBKKGEpe2lmKCFhKXJldHVybiIiOyJzdHJpbmciPT09dHlwZW9mIGEmJihhPXgoYSkpO3JldHVybiBFKGEsdSl9ZnVuY3Rpb24gSyhhKXshYS5fX2Nzc1J1bGVzJiZhLnRleHRDb250ZW50JiYoYS5fX2Nzc1J1bGVzPXgoYS50ZXh0Q29udGVudCkpO3JldHVybiBhLl9fY3NzUnVsZXN8fG51bGx9ZnVuY3Rpb24gTChhLGIsYyxlKXtpZihhKXt2YXIgZD0hMSxmPWEudHlwZTtpZihlJiZmPT09QSl7dmFyIGc9YS5zZWxlY3Rvci5tYXRjaChrYSk7ZyYmKHdpbmRvdy5tYXRjaE1lZGlhKGdbMV0pLm1hdGNoZXN8fChkPSEwKSl9Zj09PUQ/YihhKTpjJiZmPT09Qj9jKGEpOmY9PT1DJiYoZD0hMCk7aWYoKGE9YS5ydWxlcykmJiFkKWZvcihkPTAsZj1hLmxlbmd0aCxnPXZvaWQgMDtkPGYmJihnPWFbZF0pO2QrKylMKGcsYixjLGUpfX0KZnVuY3Rpb24gTShhLGIpe3ZhciBjPWEuaW5kZXhPZigidmFyKCIpO2lmKC0xPT09YylyZXR1cm4gYihhLCIiLCIiLCIiKTthOnt2YXIgZT0wO3ZhciBkPWMrMztmb3IodmFyIGY9YS5sZW5ndGg7ZDxmO2QrKylpZigiKCI9PT1hW2RdKWUrKztlbHNlIGlmKCIpIj09PWFbZF0mJjA9PT0tLWUpYnJlYWsgYTtkPS0xfWU9YS5zdWJzdHJpbmcoYys0LGQpO2M9YS5zdWJzdHJpbmcoMCxjKTthPU0oYS5zdWJzdHJpbmcoZCsxKSxiKTtkPWUuaW5kZXhPZigiLCIpO3JldHVybi0xPT09ZD9iKGMsZS50cmltKCksIiIsYSk6YihjLGUuc3Vic3RyaW5nKDAsZCkudHJpbSgpLGUuc3Vic3RyaW5nKGQrMSkudHJpbSgpLGEpfQpmdW5jdGlvbiBOKGEpe2lmKHZvaWQgMCE9PXYpcmV0dXJuIHY7aWYodm9pZCAwPT09YS5fX2Nzc0J1aWxkKXt2YXIgYj1hLmdldEF0dHJpYnV0ZSgiY3NzLWJ1aWxkIik7aWYoYilhLl9fY3NzQnVpbGQ9YjtlbHNle2E6e2I9InRlbXBsYXRlIj09PWEubG9jYWxOYW1lP2EuY29udGVudC5maXJzdENoaWxkOmEuZmlyc3RDaGlsZDtpZihiIGluc3RhbmNlb2YgQ29tbWVudCYmKGI9Yi50ZXh0Q29udGVudC50cmltKCkuc3BsaXQoIjoiKSwiY3NzLWJ1aWxkIj09PWJbMF0pKXtiPWJbMV07YnJlYWsgYX1iPSIifWlmKCIiIT09Yil7dmFyIGM9InRlbXBsYXRlIj09PWEubG9jYWxOYW1lP2EuY29udGVudC5maXJzdENoaWxkOmEuZmlyc3RDaGlsZDtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyl9YS5fX2Nzc0J1aWxkPWJ9fXJldHVybiBhLl9fY3NzQnVpbGR8fCIifTt2YXIgbGE9LztccyovbSxtYT0vXlxzKihpbml0aWFsKXwoaW5oZXJpdClccyokLyxPPS9ccyohaW1wb3J0YW50LztmdW5jdGlvbiBQKCl7dGhpcy5hPXt9fVAucHJvdG90eXBlLnNldD1mdW5jdGlvbihhLGIpe2E9YS50cmltKCk7dGhpcy5hW2FdPXtoOmIsaTp7fX19O1AucHJvdG90eXBlLmdldD1mdW5jdGlvbihhKXthPWEudHJpbSgpO3JldHVybiB0aGlzLmFbYV18fG51bGx9O3ZhciBRPW51bGw7ZnVuY3Rpb24gUigpe3RoaXMuYj10aGlzLmM9bnVsbDt0aGlzLmE9bmV3IFB9Ui5wcm90b3R5cGUubz1mdW5jdGlvbihhKXthPUgudGVzdChhKXx8Ry50ZXN0KGEpO0gubGFzdEluZGV4PTA7Ry5sYXN0SW5kZXg9MDtyZXR1cm4gYX07ClIucHJvdG90eXBlLm09ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDA9PT1hLl9nYXRoZXJlZFN0eWxlKXt2YXIgYz1bXTtmb3IodmFyIGU9YS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlIiksZD0wO2Q8ZS5sZW5ndGg7ZCsrKXt2YXIgZj1lW2RdO2lmKGYuaGFzQXR0cmlidXRlKCJzaGFkeS11bnNjb3BlZCIpKXtpZighbCl7dmFyIGc9Zi50ZXh0Q29udGVudDtJLmhhcyhnKXx8KEkuYWRkKGcpLGc9Zi5jbG9uZU5vZGUoITApLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZykpO2YucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmKX19ZWxzZSBjLnB1c2goZi50ZXh0Q29udGVudCksZi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGYpfShjPWMuam9pbigiIikudHJpbSgpKT8oZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpLGUudGV4dENvbnRlbnQ9YyxhLmNvbnRlbnQuaW5zZXJ0QmVmb3JlKGUsYS5jb250ZW50LmZpcnN0Q2hpbGQpLGM9ZSk6Yz1udWxsO2EuX2dhdGhlcmVkU3R5bGU9CmN9cmV0dXJuKGE9YS5fZ2F0aGVyZWRTdHlsZSk/dGhpcy5qKGEsYik6bnVsbH07Ui5wcm90b3R5cGUuaj1mdW5jdGlvbihhLGIpe2I9dm9pZCAwPT09Yj8iIjpiO3ZhciBjPUsoYSk7dGhpcy5sKGMsYik7YS50ZXh0Q29udGVudD1KKGMpO3JldHVybiBjfTtSLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1LKGEpO0woYyxmdW5jdGlvbihhKXsiOnJvb3QiPT09YS5zZWxlY3RvciYmKGEuc2VsZWN0b3I9Imh0bWwiKTtiLmcoYSl9KTthLnRleHRDb250ZW50PUooYyk7cmV0dXJuIGN9O1IucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO3RoaXMuYz1iO0woYSxmdW5jdGlvbihhKXtjLmcoYSl9KTt0aGlzLmM9bnVsbH07Ui5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXthLmNzc1RleHQ9bmEodGhpcyxhLnBhcnNlZENzc1RleHQsYSk7Ijpyb290Ij09PWEuc2VsZWN0b3ImJihhLnNlbGVjdG9yPSI6aG9zdCA+ICoiKX07CmZ1bmN0aW9uIG5hKGEsYixjKXtiPWIucmVwbGFjZShHLGZ1bmN0aW9uKGIsZCxmLGcpe3JldHVybiBvYShhLGIsZCxmLGcsYyl9KTtyZXR1cm4gUyhhLGIsYyl9ZnVuY3Rpb24gcGEoYSxiKXtmb3IodmFyIGM9YjtjLnBhcmVudDspYz1jLnBhcmVudDt2YXIgZT17fSxkPSExO0woYyxmdW5jdGlvbihjKXsoZD1kfHxjPT09Yil8fGMuc2VsZWN0b3I9PT1iLnNlbGVjdG9yJiZPYmplY3QuYXNzaWduKGUsVChhLGMucGFyc2VkQ3NzVGV4dCkpfSk7cmV0dXJuIGV9CmZ1bmN0aW9uIFMoYSxiLGMpe2Zvcih2YXIgZTtlPUguZXhlYyhiKTspe3ZhciBkPWVbMF0sZj1lWzFdO2U9ZS5pbmRleDt2YXIgZz1iLnNsaWNlKDAsZStkLmluZGV4T2YoIkBhcHBseSIpKTtiPWIuc2xpY2UoZStkLmxlbmd0aCk7dmFyIGg9Yz9wYShhLGMpOnt9O09iamVjdC5hc3NpZ24oaCxUKGEsZykpO2Q9dm9pZCAwO3ZhciBrPWE7Zj1mLnJlcGxhY2UobGEsIiIpO3ZhciBuPVtdO3ZhciBtPWsuYS5nZXQoZik7bXx8KGsuYS5zZXQoZix7fSksbT1rLmEuZ2V0KGYpKTtpZihtKXtrLmMmJihtLmlbay5jXT0hMCk7dmFyIHE9bS5oO2ZvcihkIGluIHEpaz1oJiZoW2RdLG09W2QsIjogdmFyKCIsZiwiXy1fIixkXSxrJiZtLnB1c2goIiwiLGsucmVwbGFjZShPLCIiKSksbS5wdXNoKCIpIiksTy50ZXN0KHFbZF0pJiZtLnB1c2goIiAhaW1wb3J0YW50Iiksbi5wdXNoKG0uam9pbigiIikpfWQ9bi5qb2luKCI7ICIpO2I9ZytkK2I7SC5sYXN0SW5kZXg9ZStkLmxlbmd0aH1yZXR1cm4gYn0KZnVuY3Rpb24gVChhLGIsYyl7Yz12b2lkIDA9PT1jPyExOmM7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBlLGQsZj17fSxnPTAsaDtnPGIubGVuZ3RoO2crKylpZihlPWJbZ10paWYoaD1lLnNwbGl0KCI6IiksMTxoLmxlbmd0aCl7ZT1oWzBdLnRyaW0oKTtkPWguc2xpY2UoMSkuam9pbigiOiIpO2lmKGMpe3ZhciBrPWE7aD1lO3ZhciBuPW1hLmV4ZWMoZCk7biYmKG5bMV0/KGsuYnx8KGsuYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJtZXRhIiksay5iLnNldEF0dHJpYnV0ZSgiYXBwbHktc2hpbS1tZWFzdXJlIiwiIiksay5iLnN0eWxlLmFsbD0iaW5pdGlhbCIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrLmIpKSxoPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGsuYikuZ2V0UHJvcGVydHlWYWx1ZShoKSk6aD0iYXBwbHktc2hpbS1pbmhlcml0IixkPWgpfWZbZV09ZH1yZXR1cm4gZn1mdW5jdGlvbiBxYShhLGIpe2lmKFEpZm9yKHZhciBjIGluIGIuaSljIT09YS5jJiZRKGMpfQpmdW5jdGlvbiBvYShhLGIsYyxlLGQsZil7ZSYmTShlLGZ1bmN0aW9uKGIsYyl7YyYmYS5hLmdldChjKSYmKGQ9IkBhcHBseSAiK2MrIjsiKX0pO2lmKCFkKXJldHVybiBiO3ZhciBnPVMoYSwiIitkLGYpO2Y9Yi5zbGljZSgwLGIuaW5kZXhPZigiLS0iKSk7dmFyIGg9Zz1UKGEsZywhMCksaz1hLmEuZ2V0KGMpLG49ayYmay5oO24/aD1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobiksZyk6YS5hLnNldChjLGgpO3ZhciBtPVtdLHEsWj0hMTtmb3IocSBpbiBoKXt2YXIgRj1nW3FdO3ZvaWQgMD09PUYmJihGPSJpbml0aWFsIik7IW58fHEgaW4gbnx8KFo9ITApO20ucHVzaChjKyJfLV8iK3ErIjogIitGKX1aJiZxYShhLGspO2smJihrLmg9aCk7ZSYmKGY9YisiOyIrZik7cmV0dXJuIGYrbS5qb2luKCI7ICIpKyI7In1SLnByb3RvdHlwZS5kZXRlY3RNaXhpbj1SLnByb3RvdHlwZS5vO1IucHJvdG90eXBlLnRyYW5zZm9ybVN0eWxlPVIucHJvdG90eXBlLmo7ClIucHJvdG90eXBlLnRyYW5zZm9ybUN1c3RvbVN0eWxlPVIucHJvdG90eXBlLmY7Ui5wcm90b3R5cGUudHJhbnNmb3JtUnVsZXM9Ui5wcm90b3R5cGUubDtSLnByb3RvdHlwZS50cmFuc2Zvcm1SdWxlPVIucHJvdG90eXBlLmc7Ui5wcm90b3R5cGUudHJhbnNmb3JtVGVtcGxhdGU9Ui5wcm90b3R5cGUubTtSLnByb3RvdHlwZS5fc2VwYXJhdG9yPSJfLV8iO09iamVjdC5kZWZpbmVQcm9wZXJ0eShSLnByb3RvdHlwZSwiaW52YWxpZENhbGxiYWNrIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFF9LHNldDpmdW5jdGlvbihhKXtRPWF9fSk7dmFyIFU9e307dmFyIHJhPVByb21pc2UucmVzb2x2ZSgpO2Z1bmN0aW9uIHNhKGEpe2lmKGE9VVthXSlhLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj1hLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbnx8MCxhLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbj1hLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbnx8MCxhLl9hcHBseVNoaW1OZXh0VmVyc2lvbj0oYS5fYXBwbHlTaGltTmV4dFZlcnNpb258fDApKzF9ZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPT09YS5fYXBwbHlTaGltTmV4dFZlcnNpb259ZnVuY3Rpb24gdWEoYSl7YS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb249YS5fYXBwbHlTaGltTmV4dFZlcnNpb247YS5fdmFsaWRhdGluZ3x8KGEuX3ZhbGlkYXRpbmc9ITAscmEudGhlbihmdW5jdGlvbigpe2EuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPWEuX2FwcGx5U2hpbU5leHRWZXJzaW9uO2EuX3ZhbGlkYXRpbmc9ITF9KSl9O3ZhciBWPW5ldyBSO2Z1bmN0aW9uIFcoKXt0aGlzLmE9bnVsbDtWLmludmFsaWRDYWxsYmFjaz1zYX1mdW5jdGlvbiBYKGEpeyFhLmEmJndpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSYmKGEuYT13aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2UsYS5hLnRyYW5zZm9ybUNhbGxiYWNrPWZ1bmN0aW9uKGEpe1YuZihhKX0sYS5hLnZhbGlkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXthLmEuZW5xdWV1ZWQmJmEuZmx1c2hDdXN0b21TdHlsZXMoKX0pfSl9Vy5wcm90b3R5cGUucHJlcGFyZVRlbXBsYXRlPWZ1bmN0aW9uKGEsYil7WCh0aGlzKTsiIj09PU4oYSkmJihVW2JdPWEsYj1WLm0oYSxiKSxhLl9zdHlsZUFzdD1iKX07ClcucHJvdG90eXBlLmZsdXNoQ3VzdG9tU3R5bGVzPWZ1bmN0aW9uKCl7WCh0aGlzKTtpZih0aGlzLmEpe3ZhciBhPXRoaXMuYS5wcm9jZXNzU3R5bGVzKCk7aWYodGhpcy5hLmVucXVldWVkKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5hLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUoYVtiXSk7YyYmVi5mKGMpfXRoaXMuYS5lbnF1ZXVlZD0hMX19fTsKVy5wcm90b3R5cGUuc3R5bGVTdWJ0cmVlPWZ1bmN0aW9uKGEsYil7WCh0aGlzKTtpZihiKWZvcih2YXIgYyBpbiBiKW51bGw9PT1jP2Euc3R5bGUucmVtb3ZlUHJvcGVydHkoYyk6YS5zdHlsZS5zZXRQcm9wZXJ0eShjLGJbY10pO2lmKGEuc2hhZG93Um9vdClmb3IodGhpcy5zdHlsZUVsZW1lbnQoYSksYT1hLnNoYWRvd1Jvb3QuY2hpbGRyZW58fGEuc2hhZG93Um9vdC5jaGlsZE5vZGVzLGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLnN0eWxlU3VidHJlZShhW2JdKTtlbHNlIGZvcihhPWEuY2hpbGRyZW58fGEuY2hpbGROb2RlcyxiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5zdHlsZVN1YnRyZWUoYVtiXSl9OwpXLnByb3RvdHlwZS5zdHlsZUVsZW1lbnQ9ZnVuY3Rpb24oYSl7WCh0aGlzKTt2YXIgYj1hLmxvY2FsTmFtZSxjO2I/LTE8Yi5pbmRleE9mKCItIik/Yz1iOmM9YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJpcyIpfHwiIjpjPWEuaXM7Yj1VW2NdO2lmKCEoYiYmIiIhPT1OKGIpfHwhYnx8dGEoYikpKXtpZih0YShiKXx8Yi5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb24hPT1iLl9hcHBseVNoaW1OZXh0VmVyc2lvbil0aGlzLnByZXBhcmVUZW1wbGF0ZShiLGMpLHVhKGIpO2lmKGE9YS5zaGFkb3dSb290KWlmKGE9YS5xdWVyeVNlbGVjdG9yKCJzdHlsZSIpKWEuX19jc3NSdWxlcz1iLl9zdHlsZUFzdCxhLnRleHRDb250ZW50PUooYi5fc3R5bGVBc3QpfX07Vy5wcm90b3R5cGUuc3R5bGVEb2N1bWVudD1mdW5jdGlvbihhKXtYKHRoaXMpO3RoaXMuc3R5bGVTdWJ0cmVlKGRvY3VtZW50LmJvZHksYSl9OwppZighd2luZG93LlNoYWR5Q1NTfHwhd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltKXt2YXIgWT1uZXcgVyx2YT13aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZTt3aW5kb3cuU2hhZHlDU1M9e3ByZXBhcmVUZW1wbGF0ZTpmdW5jdGlvbihhLGIpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTtZLnByZXBhcmVUZW1wbGF0ZShhLGIpfSxwcmVwYXJlVGVtcGxhdGVTdHlsZXM6ZnVuY3Rpb24oYSxiLGMpe3dpbmRvdy5TaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGUoYSxiLGMpfSxwcmVwYXJlVGVtcGxhdGVEb206ZnVuY3Rpb24oKXt9LHN0eWxlU3VidHJlZTpmdW5jdGlvbihhLGIpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTtZLnN0eWxlU3VidHJlZShhLGIpfSxzdHlsZUVsZW1lbnQ6ZnVuY3Rpb24oYSl7WS5mbHVzaEN1c3RvbVN0eWxlcygpO1kuc3R5bGVFbGVtZW50KGEpfSxzdHlsZURvY3VtZW50OmZ1bmN0aW9uKGEpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTsKWS5zdHlsZURvY3VtZW50KGEpfSxnZXRDb21wdXRlZFN0eWxlVmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKGIpKT9hLnRyaW0oKToiIn0sZmx1c2hDdXN0b21TdHlsZXM6ZnVuY3Rpb24oKXtZLmZsdXNoQ3VzdG9tU3R5bGVzKCl9LG5hdGl2ZUNzczp1LG5hdGl2ZVNoYWRvdzpsLGNzc0J1aWxkOnYsZGlzYWJsZVJ1bnRpbWU6YWF9O3ZhJiYod2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlPXZhKX13aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltPVY7fSkuY2FsbCh0aGlzKTsKCgoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGNvbnN0IHVzZXJQb2x5bWVyID0gd2luZG93LlBvbHltZXI7CgogIC8qKgogICAqIEBuYW1lc3BhY2UgUG9seW1lcgogICAqIEBzdW1tYXJ5IFBvbHltZXIgaXMgYSBsaWdodHdlaWdodCBsaWJyYXJ5IGJ1aWx0IG9uIHRvcCBvZiB0aGUgd2ViCiAgICogICBzdGFuZGFyZHMtYmFzZWQgV2ViIENvbXBvbmVudHMgQVBJJ3MsIGFuZCBtYWtlcyBpdCBlYXN5IHRvIGJ1aWxkIHlvdXIKICAgKiAgIG93biBjdXN0b20gSFRNTCBlbGVtZW50cy4KICAgKiBAcGFyYW0geyFQb2x5bWVySW5pdH0gaW5mbyBQcm90b3R5cGUgZm9yIHRoZSBjdXN0b20gZWxlbWVudC4gSXQgbXVzdCBjb250YWluCiAgICogICBhbiBgaXNgIHByb3BlcnR5IHRvIHNwZWNpZnkgdGhlIGVsZW1lbnQgbmFtZS4gT3RoZXIgcHJvcGVydGllcyBwb3B1bGF0ZQogICAqICAgdGhlIGVsZW1lbnQgcHJvdG90eXBlLiBUaGUgYHByb3BlcnRpZXNgLCBgb2JzZXJ2ZXJzYCwgYGhvc3RBdHRyaWJ1dGVzYCwKICAgKiAgIGFuZCBgbGlzdGVuZXJzYCBwcm9wZXJ0aWVzIGFyZSBwcm9jZXNzZWQgdG8gY3JlYXRlIGVsZW1lbnQgZmVhdHVyZXMuCiAgICogQHJldHVybiB7IU9iamVjdH0gUmV0dXJucyBhIGN1c3RvbSBlbGVtZW50IGNsYXNzIGZvciB0aGUgZ2l2ZW4gcHJvdmlkZWQKICAgKiAgIHByb3RvdHlwZSBgaW5mb2Agb2JqZWN0LiBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCBpZiBnaXZlbiBieSBgaW5mby5pc2AuCiAgICovCiAgd2luZG93LlBvbHltZXIgPSBmdW5jdGlvbihpbmZvKSB7CiAgICByZXR1cm4gd2luZG93LlBvbHltZXIuX3BvbHltZXJGbihpbmZvKTsKICB9OwoKICAvLyBzdXBwb3J0IHVzZXIgc2V0dGluZ3Mgb24gdGhlIFBvbHltZXIgb2JqZWN0CiAgaWYgKHVzZXJQb2x5bWVyKSB7CiAgICBPYmplY3QuYXNzaWduKFBvbHltZXIsIHVzZXJQb2x5bWVyKTsKICB9CgogIC8vIFRvIGJlIHBsdWdnZWQgYnkgbGVnYWN5IGltcGxlbWVudGF0aW9uIGlmIGxvYWRlZAogIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgLyoqCiAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gUHJvdG90eXBlIGZvciB0aGUgY3VzdG9tIGVsZW1lbnQuIEl0IG11c3QgY29udGFpbgogICAqICAgYW4gYGlzYCBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBlbGVtZW50IG5hbWUuIE90aGVyIHByb3BlcnRpZXMgcG9wdWxhdGUKICAgKiAgIHRoZSBlbGVtZW50IHByb3RvdHlwZS4gVGhlIGBwcm9wZXJ0aWVzYCwgYG9ic2VydmVyc2AsIGBob3N0QXR0cmlidXRlc2AsCiAgICogICBhbmQgYGxpc3RlbmVyc2AgcHJvcGVydGllcyBhcmUgcHJvY2Vzc2VkIHRvIGNyZWF0ZSBlbGVtZW50IGZlYXR1cmVzLgogICAqIEByZXR1cm4geyFPYmplY3R9IFJldHVybnMgYSBjdXN0b20gZWxlbWVudCBjbGFzcyBmb3IgdGhlIGdpdmVuIHByb3ZpZGVkCiAgICogICBwcm90b3R5cGUgYGluZm9gIG9iamVjdC4gVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgaWYgZ2l2ZW4gYnkgYGluZm8uaXNgLgogICAqLwogIHdpbmRvdy5Qb2x5bWVyLl9wb2x5bWVyRm4gPSBmdW5jdGlvbihpbmZvKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgIHRocm93IG5ldyBFcnJvcignTG9hZCBwb2x5bWVyLmh0bWwgdG8gdXNlIHRoZSBQb2x5bWVyKCkgZnVuY3Rpb24uJyk7CiAgfTsKICAvKiBlc2xpbnQtZW5hYmxlICovCgogIHdpbmRvdy5Qb2x5bWVyLnZlcnNpb24gPSAnMi43LjAnOwoKICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqLwogIC8qCiAgV2hlbiB1c2luZyBDbG9zdXJlIENvbXBpbGVyLCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KHByb3BlcnR5LCBvYmplY3QpIGlzIHJlcGxhY2VkIGJ5IHRoZSBtdW5nZWQgbmFtZSBmb3Igb2JqZWN0W3Byb3BlcnR5XQogIFdlIGNhbm5vdCBhbGlhcyB0aGlzIGZ1bmN0aW9uLCBzbyB3ZSBoYXZlIHRvIHVzZSBhIHNtYWxsIHNoaW0gdGhhdCBoYXMgdGhlIHNhbWUgYmVoYXZpb3Igd2hlbiBub3QgY29tcGlsaW5nLgogICovCiAgd2luZG93LkpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkgPSBmdW5jdGlvbihwcm9wLCBvYmopIHsKICAgIHJldHVybiBwcm9wOwogIH07CiAgLyogZXNsaW50LWVuYWJsZSAqLwoKfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgbGV0IENTU19VUkxfUlggPSAvKHVybFwoKShbXildKikoXCkpL2c7CiAgICBsZXQgQUJTX1VSTCA9IC8oXlwvKXwoXiMpfCheW1x3LVxkXSo6KS87CiAgICBsZXQgd29ya2luZ1VSTDsKICAgIGxldCByZXNvbHZlRG9jOwogICAgLyoqCiAgICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gVVJMIGFnYWluc3QgdGhlIHByb3ZpZGVkIGBiYXNlVXJpJy4KICAgICAqIAogICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbm8gcmVzb2x1dGlvbiBmb3IgVVJMcyB0aGF0IHN0YXJ0CiAgICAgKiB3aXRoIGAvYCAoYWJzb2x1dGUgVVJMcykgb3IgYCNgIChoYXNoIGlkZW50aWZpZXJzKS4gIEZvciBnZW5lcmFsIHB1cnBvc2UKICAgICAqIFVSTCByZXNvbHV0aW9uLCB1c2UgYHdpbmRvdy5VUkxgLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgSW5wdXQgVVJMIHRvIHJlc29sdmUKICAgICAqIEBwYXJhbSB7P3N0cmluZz19IGJhc2VVUkkgQmFzZSBVUkkgdG8gcmVzb2x2ZSB0aGUgVVJMIGFnYWluc3QKICAgICAqIEByZXR1cm4ge3N0cmluZ30gcmVzb2x2ZWQgVVJMCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlc29sdmVVcmwodXJsLCBiYXNlVVJJKSB7CiAgICAgIGlmICh1cmwgJiYgQUJTX1VSTC50ZXN0KHVybCkpIHsKICAgICAgICByZXR1cm4gdXJsOwogICAgICB9CiAgICAgIC8vIExhenkgZmVhdHVyZSBkZXRlY3Rpb24uCiAgICAgIGlmICh3b3JraW5nVVJMID09PSB1bmRlZmluZWQpIHsKICAgICAgICB3b3JraW5nVVJMID0gZmFsc2U7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IHUgPSBuZXcgVVJMKCdiJywgJ2h0dHA6Ly9hJyk7CiAgICAgICAgICB1LnBhdGhuYW1lID0gJ2MlMjBkJzsKICAgICAgICAgIHdvcmtpbmdVUkwgPSAodS5ocmVmID09PSAnaHR0cDovL2EvYyUyMGQnKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAvLyBzaWxlbnRseSBmYWlsCiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghYmFzZVVSSSkgewogICAgICAgIGJhc2VVUkkgPSBkb2N1bWVudC5iYXNlVVJJIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwogICAgICB9CiAgICAgIGlmICh3b3JraW5nVVJMKSB7CiAgICAgICAgcmV0dXJuIChuZXcgVVJMKHVybCwgYmFzZVVSSSkpLmhyZWY7CiAgICAgIH0KICAgICAgLy8gRmFsbGJhY2sgdG8gY3JlYXRpbmcgYW4gYW5jaG9yIGludG8gYSBkaXNjb25uZWN0ZWQgZG9jdW1lbnQuCiAgICAgIGlmICghcmVzb2x2ZURvYykgewogICAgICAgIHJlc29sdmVEb2MgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoJ3RlbXAnKTsKICAgICAgICByZXNvbHZlRG9jLmJhc2UgPSByZXNvbHZlRG9jLmNyZWF0ZUVsZW1lbnQoJ2Jhc2UnKTsKICAgICAgICByZXNvbHZlRG9jLmhlYWQuYXBwZW5kQ2hpbGQocmVzb2x2ZURvYy5iYXNlKTsKICAgICAgICByZXNvbHZlRG9jLmFuY2hvciA9IHJlc29sdmVEb2MuY3JlYXRlRWxlbWVudCgnYScpOwogICAgICAgIHJlc29sdmVEb2MuYm9keS5hcHBlbmRDaGlsZChyZXNvbHZlRG9jLmFuY2hvcik7CiAgICAgIH0KICAgICAgcmVzb2x2ZURvYy5iYXNlLmhyZWYgPSBiYXNlVVJJOwogICAgICByZXNvbHZlRG9jLmFuY2hvci5ocmVmID0gdXJsOwogICAgICByZXR1cm4gcmVzb2x2ZURvYy5hbmNob3IuaHJlZiB8fCB1cmw7CgogICAgfQoKICAgIC8qKgogICAgICogUmVzb2x2ZXMgYW55IHJlbGF0aXZlIFVSTCdzIGluIHRoZSBnaXZlbiBDU1MgdGV4dCBhZ2FpbnN0IHRoZSBwcm92aWRlZAogICAgICogYG93bmVyRG9jdW1lbnRgJ3MgYGJhc2VVUklgLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjc3NUZXh0IENTUyB0ZXh0IHRvIHByb2Nlc3MKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlc29sdmUgdGhlIFVSTCBhZ2FpbnN0CiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFByb2Nlc3NlZCBDU1MgdGV4dCB3aXRoIHJlc29sdmVkIFVSTCdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlc29sdmVDc3MoY3NzVGV4dCwgYmFzZVVSSSkgewogICAgICByZXR1cm4gY3NzVGV4dC5yZXBsYWNlKENTU19VUkxfUlgsIGZ1bmN0aW9uKG0sIHByZSwgdXJsLCBwb3N0KSB7CiAgICAgICAgcmV0dXJuIHByZSArICdcJycgKwogICAgICAgICAgcmVzb2x2ZVVybCh1cmwucmVwbGFjZSgvWyInXS9nLCAnJyksIGJhc2VVUkkpICsKICAgICAgICAgICdcJycgKyBwb3N0OwogICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBwYXRoIGZyb20gYSBnaXZlbiBgdXJsYC4gVGhlIHBhdGggaW5jbHVkZXMgdGhlIHRyYWlsaW5nCiAgICAgKiBgL2AgZnJvbSB0aGUgdXJsLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgSW5wdXQgVVJMIHRvIHRyYW5zZm9ybQogICAgICogQHJldHVybiB7c3RyaW5nfSByZXNvbHZlZCBwYXRoCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhdGhGcm9tVXJsKHVybCkgewogICAgICByZXR1cm4gdXJsLnN1YnN0cmluZygwLCB1cmwubGFzdEluZGV4T2YoJy8nKSArIDEpOwogICAgfQoKICAgIC8qKgogICAgICogTW9kdWxlIHdpdGggdXRpbGl0aWVzIGZvciByZXNvbHZpbmcgcmVsYXRpdmUgVVJMJ3MuCiAgICAgKgogICAgICogQG5hbWVzcGFjZQogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqIEBzdW1tYXJ5IE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgcmVzb2x2aW5nIHJlbGF0aXZlIFVSTCdzLgogICAgICovCiAgICBQb2x5bWVyLlJlc29sdmVVcmwgPSB7CiAgICAgIHJlc29sdmVDc3M6IHJlc29sdmVDc3MsCiAgICAgIHJlc29sdmVVcmw6IHJlc29sdmVVcmwsCiAgICAgIHBhdGhGcm9tVXJsOiBwYXRoRnJvbVVybAogICAgfTsKCiAgfSkoKTsKCgoKLyoqIEBzdXBwcmVzcyB7ZGVwcmVjYXRlZH0gKi8KKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogU2V0cyB0aGUgZ2xvYmFsLCBsZWdhY3kgc2V0dGluZ3MuCiAgICoKICAgKiBAZGVwcmVjYXRlZAogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqLwogIFBvbHltZXIuU2V0dGluZ3MgPSBQb2x5bWVyLlNldHRpbmdzIHx8IHt9OwoKICBQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdyA9ICEod2luZG93LlNoYWR5RE9NKTsKICBQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZUNTU1Byb3BlcnRpZXMgPQogICAgQm9vbGVhbighd2luZG93LlNoYWR5Q1NTIHx8IHdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3MpOwogIFBvbHltZXIuU2V0dGluZ3MudXNlTmF0aXZlQ3VzdG9tRWxlbWVudHMgPQogICAgISh3aW5kb3cuY3VzdG9tRWxlbWVudHMucG9seWZpbGxXcmFwRmx1c2hDYWxsYmFjayk7CgoKICAvKioKICAgKiBHbG9iYWxseSBzZXR0YWJsZSBwcm9wZXJ0eSB0aGF0IGlzIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgdG8KICAgKiBgUG9seW1lci5FbGVtZW50TWl4aW5gIGluc3RhbmNlcywgdXNlZnVsIGZvciBiaW5kaW5nIGluIHRlbXBsYXRlcyB0bwogICAqIG1ha2UgVVJMJ3MgcmVsYXRpdmUgdG8gYW4gYXBwbGljYXRpb24ncyByb290LiAgRGVmYXVsdHMgdG8gdGhlIG1haW4KICAgKiBkb2N1bWVudCBVUkwsIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB1c2Vycy4gIEl0IG1heSBiZSB1c2VmdWwgdG8gc2V0CiAgICogYFBvbHltZXIucm9vdFBhdGhgIHRvIHByb3ZpZGUgYSBzdGFibGUgYXBwbGljYXRpb24gbW91bnQgcGF0aCB3aGVuCiAgICogdXNpbmcgY2xpZW50IHNpZGUgcm91dGluZy4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5yb290UGF0aCA9IFBvbHltZXIucm9vdFBhdGggfHwKICAgIFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybChkb2N1bWVudC5iYXNlVVJJIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsKCiAgLyoqCiAgICogU2V0cyB0aGUgZ2xvYmFsIHJvb3RQYXRoIHByb3BlcnR5IHVzZWQgYnkgYFBvbHltZXIuRWxlbWVudE1peGluYCBhbmQKICAgKiBhdmFpbGFibGUgdmlhIGBQb2x5bWVyLnJvb3RQYXRoYC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIG5ldyByb290IHBhdGgKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqLwogIFBvbHltZXIuc2V0Um9vdFBhdGggPSBmdW5jdGlvbihwYXRoKSB7CiAgICBQb2x5bWVyLnJvb3RQYXRoID0gcGF0aDsKICB9OwoKICAvKioKICAgKiBBIGdsb2JhbCBjYWxsYmFjayB1c2VkIHRvIHNhbml0aXplIGFueSB2YWx1ZSBiZWZvcmUgaW5zZXJ0aW5nIGl0IGludG8gdGhlIERPTS4gVGhlIGNhbGxiYWNrIHNpZ25hdHVyZSBpczoKICAgKgogICAqICAgICBQb2x5bWVyID0gewogICAqICAgICAgIHNhbml0aXplRE9NVmFsdWU6IGZ1bmN0aW9uKHZhbHVlLCBuYW1lLCB0eXBlLCBub2RlKSB7IC4uLiB9CiAgICogICAgIH0KICAgKgogICAqIFdoZXJlOgogICAqCiAgICogYHZhbHVlYCBpcyB0aGUgdmFsdWUgdG8gc2FuaXRpemUuCiAgICogYG5hbWVgIGlzIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSBvciBwcm9wZXJ0eSAoZm9yIGV4YW1wbGUsIGhyZWYpLgogICAqIGB0eXBlYCBpbmRpY2F0ZXMgd2hlcmUgdGhlIHZhbHVlIGlzIGJlaW5nIGluc2VydGVkOiBvbmUgb2YgcHJvcGVydHksIGF0dHJpYnV0ZSwgb3IgdGV4dC4KICAgKiBgbm9kZWAgaXMgdGhlIG5vZGUgd2hlcmUgdGhlIHZhbHVlIGlzIGJlaW5nIGluc2VydGVkLgogICAqCiAgICogQHR5cGUgeyhmdW5jdGlvbigqLHN0cmluZyxzdHJpbmcsTm9kZSk6Kil8dW5kZWZpbmVkfQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlID0gUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlIHx8IG51bGw7CgogIC8qKgogICAqIFNldHMgdGhlIGdsb2JhbCBzYW5pdGl6ZURPTVZhbHVlIGF2YWlsYWJsZSB2aWEgYFBvbHltZXIuc2FuaXRpemVET01WYWx1ZWAuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7KGZ1bmN0aW9uKCosc3RyaW5nLHN0cmluZyxOb2RlKToqKXx1bmRlZmluZWR9IG5ld1Nhbml0aXplRE9NVmFsdWUgdGhlIGdsb2JhbCBzYW5pdGl6ZURPTVZhbHVlIGNhbGxiYWNrCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnNldFNhbml0aXplRE9NVmFsdWUgPSBmdW5jdGlvbihuZXdTYW5pdGl6ZURPTVZhbHVlKSB7CiAgICBQb2x5bWVyLnNhbml0aXplRE9NVmFsdWUgPSBuZXdTYW5pdGl6ZURPTVZhbHVlOwogIH07CgogIC8qKgogICAqIEdsb2JhbGx5IHNldHRhYmxlIHByb3BlcnR5IHRvIG1ha2UgUG9seW1lciBHZXN0dXJlcyB1c2UgcGFzc2l2ZSBUb3VjaEV2ZW50IGxpc3RlbmVycyB3aGVuIHJlY29nbml6aW5nIGdlc3R1cmVzLgogICAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgZ2VzdHVyZXMgbWFkZSBmcm9tIHRvdWNoIHdpbGwgbm90IGJlIGFibGUgdG8gcHJldmVudCBzY3JvbGxpbmcsIGFsbG93aW5nIGZvciBzbW9vdGhlcgogICAqIHNjcm9sbGluZyBwZXJmb3JtYW5jZS4KICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcyA9IFBvbHltZXIucGFzc2l2ZVRvdWNoR2VzdHVyZXMgfHwgZmFsc2U7CgogIC8qKgogICAqIFNldHMgYHBhc3NpdmVUb3VjaEdlc3R1cmVzYCBnbG9iYWxseSBmb3IgYWxsIGVsZW1lbnRzIHVzaW5nIFBvbHltZXIgR2VzdHVyZXMuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gdXNlUGFzc2l2ZSBlbmFibGUgb3IgZGlzYWJsZSBwYXNzaXZlIHRvdWNoIGdlc3R1cmVzIGdsb2JhbGx5CiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnNldFBhc3NpdmVUb3VjaEdlc3R1cmVzID0gZnVuY3Rpb24odXNlUGFzc2l2ZSkgewogICAgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcyA9IHVzZVBhc3NpdmU7CiAgfTsKCiAgUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zID0gUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zIHx8CiAgICAgIHdpbmRvdy5Qb2x5bWVyU2V0dGluZ3MgJiYgd2luZG93LlBvbHltZXJTZXR0aW5ncy5sZWdhY3lPcHRpbWl6YXRpb25zIHx8IGZhbHNlOwoKICAvKioKICAgKiBTZXRzIGBsZWdhY3lPcHRpbWl6YXRpb25zYCBnbG9iYWxseSBmb3IgYWxsIGVsZW1lbnRzLiBFbmFibGVzCiAgICogb3B0aW1pemF0aW9ucyB3aGVuIG9ubHkgbGVnYWN5IFBvbHltZXIoKSBzdHlsZSBlbGVtZW50cyBhcmUgdXNlZC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHBhcmFtIHtib29sZWFufSB1c2VMZWdhY3lPcHRpbWl6YXRpb25zIGVuYWJsZSBvciBkaXNhYmxlIGxlZ2FjeSBvcHRpbWl6YXRpb25zIGdsb2JhbGx5LgogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgUG9seW1lci5zZXRMZWdhY3lPcHRpbWl6YXRpb25zID0gZnVuY3Rpb24odXNlTGVnYWN5T3B0aW1pemF0aW9ucykgewogICAgUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zID0gdXNlTGVnYWN5T3B0aW1pemF0aW9uczsKICB9Owp9KSgpOwoKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgLy8gdW5pcXVlIGdsb2JhbCBpZCBmb3IgZGVkdXBpbmcgbWl4aW5zLgogIGxldCBkZWR1cGVJZCA9IDA7CgogIC8qKgogICAqIEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtGdW5jdGlvbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIE1peGluRnVuY3Rpb24oKXt9CiAgLyoqIEB0eXBlIHsoV2Vha01hcCB8IHVuZGVmaW5lZCl9ICovCiAgTWl4aW5GdW5jdGlvbi5wcm90b3R5cGUuX19taXhpbkFwcGxpY2F0aW9uczsKICAvKiogQHR5cGUgeyhPYmplY3QgfCB1bmRlZmluZWQpfSAqLwogIE1peGluRnVuY3Rpb24ucHJvdG90eXBlLl9fbWl4aW5TZXQ7CgogIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgLyoqCiAgICogV3JhcHMgYW4gRVM2IGNsYXNzIGV4cHJlc3Npb24gbWl4aW4gc3VjaCB0aGF0IHRoZSBtaXhpbiBpcyBvbmx5IGFwcGxpZWQKICAgKiBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhcHBsaWVkIGl0cyBiYXNlIGFyZ3VtZW50LiBBbHNvIG1lbW9pemVzIG1peGluCiAgICogYXBwbGljYXRpb25zLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAdGVtcGxhdGUgVAogICAqIEBwYXJhbSB7VH0gbWl4aW4gRVM2IGNsYXNzIGV4cHJlc3Npb24gbWl4aW4gdG8gd3JhcAogICAqIEByZXR1cm4ge1R9CiAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICovCiAgUG9seW1lci5kZWR1cGluZ01peGluID0gZnVuY3Rpb24obWl4aW4pIHsKICAgIGxldCBtaXhpbkFwcGxpY2F0aW9ucyA9IC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKG1peGluKS5fX21peGluQXBwbGljYXRpb25zOwogICAgaWYgKCFtaXhpbkFwcGxpY2F0aW9ucykgewogICAgICBtaXhpbkFwcGxpY2F0aW9ucyA9IG5ldyBXZWFrTWFwKCk7CiAgICAgIC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKG1peGluKS5fX21peGluQXBwbGljYXRpb25zID0gbWl4aW5BcHBsaWNhdGlvbnM7CiAgICB9CiAgICAvLyBtYWludGFpbiBhIHVuaXF1ZSBpZCBmb3IgZWFjaCBtaXhpbgogICAgbGV0IG1peGluRGVkdXBlSWQgPSBkZWR1cGVJZCsrOwogICAgZnVuY3Rpb24gZGVkdXBpbmdNaXhpbihiYXNlKSB7CiAgICAgIGxldCBiYXNlU2V0ID0gLyoqIEB0eXBlIHshTWl4aW5GdW5jdGlvbn0gKi8oYmFzZSkuX19taXhpblNldDsKICAgICAgaWYgKGJhc2VTZXQgJiYgYmFzZVNldFttaXhpbkRlZHVwZUlkXSkgewogICAgICAgIHJldHVybiBiYXNlOwogICAgICB9CiAgICAgIGxldCBtYXAgPSBtaXhpbkFwcGxpY2F0aW9uczsKICAgICAgbGV0IGV4dGVuZGVkID0gbWFwLmdldChiYXNlKTsKICAgICAgaWYgKCFleHRlbmRlZCkgewogICAgICAgIGV4dGVuZGVkID0gLyoqIEB0eXBlIHshRnVuY3Rpb259ICovKG1peGluKShiYXNlKTsKICAgICAgICBtYXAuc2V0KGJhc2UsIGV4dGVuZGVkKTsKICAgICAgfQogICAgICAvLyBjb3B5IGluaGVyaXRlZCBtaXhpbiBzZXQgZnJvbSB0aGUgZXh0ZW5kZWQgY2xhc3MsIG9yIHRoZSBiYXNlIGNsYXNzCiAgICAgIC8vIE5PVEU6IHdlIGF2b2lkIHVzZSBvZiBTZXQgaGVyZSBiZWNhdXNlIHNvbWUgYnJvd3NlciAoSUUxMSkKICAgICAgLy8gY2Fubm90IGV4dGVuZCBhIGJhc2UgU2V0IHZpYSB0aGUgY29uc3RydWN0b3IuCiAgICAgIGxldCBtaXhpblNldCA9IE9iamVjdC5jcmVhdGUoLyoqIEB0eXBlIHshTWl4aW5GdW5jdGlvbn0gKi8oZXh0ZW5kZWQpLl9fbWl4aW5TZXQgfHwgYmFzZVNldCB8fCBudWxsKTsKICAgICAgbWl4aW5TZXRbbWl4aW5EZWR1cGVJZF0gPSB0cnVlOwogICAgICAvKiogQHR5cGUgeyFNaXhpbkZ1bmN0aW9ufSAqLyhleHRlbmRlZCkuX19taXhpblNldCA9IG1peGluU2V0OwogICAgICByZXR1cm4gZXh0ZW5kZWQ7CiAgICB9CgogICAgcmV0dXJuIC8qKiBAdHlwZSB7VH0gKi8gKGRlZHVwaW5nTWl4aW4pOwogIH07CiAgLyogZXNsaW50LWVuYWJsZSB2YWxpZC1qc2RvYyAqLwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgTU9EVUxFX1NUWUxFX0xJTktfU0VMRUNUT1IgPSAnbGlua1tyZWw9aW1wb3J0XVt0eXBlfj1jc3NdJzsKICBjb25zdCBJTkNMVURFX0FUVFIgPSAnaW5jbHVkZSc7CiAgY29uc3QgU0hBRFlfVU5TQ09QRURfQVRUUiA9ICdzaGFkeS11bnNjb3BlZCc7CgogIGZ1bmN0aW9uIGltcG9ydE1vZHVsZShtb2R1bGVJZCkgewogICAgY29uc3QgLyoqIFBvbHltZXIuRG9tTW9kdWxlICovIFBvbHltZXJEb21Nb2R1bGUgPSBjdXN0b21FbGVtZW50cy5nZXQoJ2RvbS1tb2R1bGUnKTsKICAgIGlmICghUG9seW1lckRvbU1vZHVsZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBQb2x5bWVyRG9tTW9kdWxlLmltcG9ydChtb2R1bGVJZCk7CiAgfQoKICBmdW5jdGlvbiBzdHlsZUZvckltcG9ydChpbXBvcnREb2MpIHsKICAgIC8vIE5PVEU6IHBvbHlmaWxsIGFmZm9yZGFuY2UuCiAgICAvLyB1bmRlciB0aGUgSFRNTEltcG9ydHMgcG9seWZpbGwsIHRoZXJlIHdpbGwgYmUgbm8gJ2JvZHknLAogICAgLy8gYnV0IHRoZSBpbXBvcnQgcHNldWRvLWRvYyBjYW4gYmUgdXNlZCBkaXJlY3RseS4KICAgIGxldCBjb250YWluZXIgPSBpbXBvcnREb2MuYm9keSA/IGltcG9ydERvYy5ib2R5IDogaW1wb3J0RG9jOwogICAgY29uc3QgaW1wb3J0Q3NzID0gUG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVDc3MoY29udGFpbmVyLnRleHRDb250ZW50LAogICAgICBpbXBvcnREb2MuYmFzZVVSSSk7CiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICBzdHlsZS50ZXh0Q29udGVudCA9IGltcG9ydENzczsKICAgIHJldHVybiBzdHlsZTsKICB9CgogIC8qKiBAdHlwZWRlZiB7e2Fzc2V0cGF0aDogc3RyaW5nfX0gKi8KICBsZXQgdGVtcGxhdGVXaXRoQXNzZXRQYXRoOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgY29sbGVjdGlvbiBDU1MgdGV4dCBmcm9tIGA8dGVtcGxhdGVzPmAsIGV4dGVybmFsCiAgICogc3R5bGVzaGVldHMsIGFuZCBgZG9tLW1vZHVsZWBzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIHdpdGggdXRpbGl0aWVzIGZvciBjb2xsZWN0aW9uIENTUyB0ZXh0IGZyb20gdmFyaW91cyBzb3VyY2VzLgogICAqLwogIGNvbnN0IFN0eWxlR2F0aGVyID0gewoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGxpc3Qgb2YgPHN0eWxlPiBlbGVtZW50cyBpbiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGBkb20tbW9kdWxlYHMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZHMgTGlzdCBvZiBkb20tbW9kdWxlIGlkJ3Mgd2l0aGluIHdoaWNoIHRvCiAgICAgKiBzZWFyY2ggZm9yIGNzcy4KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCA8c3R5bGU+IGVsZW1lbnRzCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgICBzdHlsZXNGcm9tTW9kdWxlcyhtb2R1bGVJZHMpIHsKICAgICAgY29uc3QgbW9kdWxlcyA9IG1vZHVsZUlkcy50cmltKCkuc3BsaXQoL1xzKy8pOwogICAgICBjb25zdCBzdHlsZXMgPSBbXTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHN0eWxlcy5wdXNoKC4uLnRoaXMuc3R5bGVzRnJvbU1vZHVsZShtb2R1bGVzW2ldKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0eWxlczsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiA8c3R5bGU+IGVsZW1lbnRzIGluIGEgZ2l2ZW4gYGRvbS1tb2R1bGVgLgogICAgICogU3R5bGVzIGluIGEgYGRvbS1tb2R1bGVgIGNhbiBjb21lIGVpdGhlciBmcm9tIGA8c3R5bGU+YHMgd2l0aGluIHRoZQogICAgICogZmlyc3QgYDx0ZW1wbGF0ZT5gLCBvciBlbHNlIGZyb20gb25lIG9yIG1vcmUKICAgICAqIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIGxpbmtzIG91dHNpZGUgdGhlIHRlbXBsYXRlLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWQgZG9tLW1vZHVsZSBpZCB0byBnYXRoZXIgc3R5bGVzIGZyb20KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCBzdHlsZXMuCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIHN0eWxlc0Zyb21Nb2R1bGUobW9kdWxlSWQpIHsKICAgICAgY29uc3QgbSA9IGltcG9ydE1vZHVsZShtb2R1bGVJZCk7CgogICAgICBpZiAoIW0pIHsKICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBmaW5kIHN0eWxlIGRhdGEgaW4gbW9kdWxlIG5hbWVkJywgbW9kdWxlSWQpOwogICAgICAgIHJldHVybiBbXTsKICAgICAgfQoKICAgICAgaWYgKG0uX3N0eWxlcyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgY29uc3Qgc3R5bGVzID0gW107CiAgICAgICAgLy8gbW9kdWxlIGltcG9ydHM6IDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPgogICAgICAgIHN0eWxlcy5wdXNoKC4uLnRoaXMuX3N0eWxlc0Zyb21Nb2R1bGVJbXBvcnRzKG0pKTsKICAgICAgICAvLyBpbmNsdWRlIGNzcyBmcm9tIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbiB0aGUgbW9kdWxlCiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBtLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJyk7CiAgICAgICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgICAgICBzdHlsZXMucHVzaCguLi50aGlzLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwKICAgICAgICAgICAgLyoqIEB0eXBlIHt0ZW1wbGF0ZVdpdGhBc3NldFBhdGh9ICovKG0pLmFzc2V0cGF0aCkpOwogICAgICAgIH0KCiAgICAgICAgbS5fc3R5bGVzID0gc3R5bGVzOwogICAgICB9CgogICAgICByZXR1cm4gbS5fc3R5bGVzOwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGA8c3R5bGU+YCBlbGVtZW50cyB3aXRoaW4gYSBnaXZlbiB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gZ2F0aGVyIHN0eWxlcyBmcm9tCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBiYXNlVVJJIGZvciBzdHlsZSBjb250ZW50CiAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxTdHlsZUVsZW1lbnQ+fSBBcnJheSBvZiBzdHlsZXMKICAgICAqIEB0aGlzIHtTdHlsZUdhdGhlcn0KICAgICAqLwogICAgc3R5bGVzRnJvbVRlbXBsYXRlKHRlbXBsYXRlLCBiYXNlVVJJKSB7CiAgICAgIGlmICghdGVtcGxhdGUuX3N0eWxlcykgewogICAgICAgIGNvbnN0IHN0eWxlcyA9IFtdOwogICAgICAgIC8vIGlmIGVsZW1lbnQgaXMgYSB0ZW1wbGF0ZSwgZ2V0IGNvbnRlbnQgZnJvbSBpdHMgLmNvbnRlbnQKICAgICAgICBjb25zdCBlJCA9IHRlbXBsYXRlLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnc3R5bGUnKTsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBlJC5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IGUgPSBlJFtpXTsKICAgICAgICAgIC8vIHN1cHBvcnQgc3R5bGUgc2hhcmluZyBieSBhbGxvd2luZyBzdHlsZXMgdG8gImluY2x1ZGUiCiAgICAgICAgICAvLyBvdGhlciBkb20tbW9kdWxlcyB0aGF0IGNvbnRhaW4gc3R5bGluZwogICAgICAgICAgbGV0IGluY2x1ZGUgPSBlLmdldEF0dHJpYnV0ZShJTkNMVURFX0FUVFIpOwogICAgICAgICAgaWYgKGluY2x1ZGUpIHsKICAgICAgICAgICAgc3R5bGVzLnB1c2goLi4udGhpcy5zdHlsZXNGcm9tTW9kdWxlcyhpbmNsdWRlKS5maWx0ZXIoZnVuY3Rpb24oaXRlbSwgaW5kZXgsIHNlbGYpIHsKICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbmRleE9mKGl0ZW0pID09PSBpbmRleDsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGJhc2VVUkkpIHsKICAgICAgICAgICAgZS50ZXh0Q29udGVudCA9IFBvbHltZXIuUmVzb2x2ZVVybC5yZXNvbHZlQ3NzKGUudGV4dENvbnRlbnQsIGJhc2VVUkkpOwogICAgICAgICAgfQogICAgICAgICAgc3R5bGVzLnB1c2goZSk7CiAgICAgICAgfQogICAgICAgIHRlbXBsYXRlLl9zdHlsZXMgPSBzdHlsZXM7CiAgICAgIH0KICAgICAgcmV0dXJuIHRlbXBsYXRlLl9zdHlsZXM7CiAgICB9LAoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGxpc3Qgb2YgPHN0eWxlPiBlbGVtZW50cyAgZnJvbSBzdHlsZXNoZWV0cyBsb2FkZWQgdmlhIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIGxpbmtzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBkb20tbW9kdWxlYC4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkIElkIG9mIGBkb20tbW9kdWxlYCB0byBnYXRoZXIgQ1NTIGZyb20KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCBzdHlsZXMuCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgICBzdHlsZXNGcm9tTW9kdWxlSW1wb3J0cyhtb2R1bGVJZCkgewogICAgICBsZXQgbSA9IGltcG9ydE1vZHVsZShtb2R1bGVJZCk7CiAgICAgIHJldHVybiBtID8gdGhpcy5fc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobSkgOiBbXTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG1vZHVsZSBkb20tbW9kdWxlIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIHN0eWxlcwogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU3R5bGVFbGVtZW50Pn0gQXJyYXkgb2YgY29udGFpbmVkIHN0eWxlcwogICAgICovCiAgICBfc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobW9kdWxlKSB7CiAgICAgIGNvbnN0IHN0eWxlcyA9IFtdOwogICAgICBjb25zdCBwJCA9IG1vZHVsZS5xdWVyeVNlbGVjdG9yQWxsKE1PRFVMRV9TVFlMRV9MSU5LX1NFTEVDVE9SKTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgcCQubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgcCA9IHAkW2ldOwogICAgICAgIGlmIChwLmltcG9ydCkgewogICAgICAgICAgY29uc3QgaW1wb3J0RG9jID0gcC5pbXBvcnQ7CiAgICAgICAgICBjb25zdCB1bnNjb3BlZCA9IHAuaGFzQXR0cmlidXRlKFNIQURZX1VOU0NPUEVEX0FUVFIpOwogICAgICAgICAgaWYgKHVuc2NvcGVkICYmICFpbXBvcnREb2MuX3Vuc2NvcGVkU3R5bGUpIHsKICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBzdHlsZUZvckltcG9ydChpbXBvcnREb2MpOwogICAgICAgICAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoU0hBRFlfVU5TQ09QRURfQVRUUiwgJycpOwogICAgICAgICAgICBpbXBvcnREb2MuX3Vuc2NvcGVkU3R5bGUgPSBzdHlsZTsKICAgICAgICAgIH0gZWxzZSBpZiAoIWltcG9ydERvYy5fc3R5bGUpIHsKICAgICAgICAgICAgaW1wb3J0RG9jLl9zdHlsZSA9IHN0eWxlRm9ySW1wb3J0KGltcG9ydERvYyk7CiAgICAgICAgICB9CiAgICAgICAgICBzdHlsZXMucHVzaCh1bnNjb3BlZCA/IGltcG9ydERvYy5fdW5zY29wZWRTdHlsZSA6IGltcG9ydERvYy5fc3R5bGUpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gc3R5bGVzOwogICAgfSwKCiAgICAvKioKICAgICAqCiAgICAgKiBSZXR1cm5zIENTUyB0ZXh0IG9mIHN0eWxlcyBpbiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGBkb20tbW9kdWxlYHMuCiAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLCB1c2UgYHN0eWxlc0Zyb21Nb2R1bGVzYCBpbnN0ZWFkLgogICAgICoKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkcyBMaXN0IG9mIGRvbS1tb2R1bGUgaWQncyB3aXRoaW4gd2hpY2ggdG8KICAgICAqIHNlYXJjaCBmb3IgY3NzLgogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgcwogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICovCiAgICAgY3NzRnJvbU1vZHVsZXMobW9kdWxlSWRzKSB7CiAgICAgIGxldCBtb2R1bGVzID0gbW9kdWxlSWRzLnRyaW0oKS5zcGxpdCgvXHMrLyk7CiAgICAgIGxldCBjc3NUZXh0ID0gJyc7CiAgICAgIGZvciAobGV0IGk9MDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjc3NUZXh0ICs9IHRoaXMuY3NzRnJvbU1vZHVsZShtb2R1bGVzW2ldKTsKICAgICAgfQogICAgICByZXR1cm4gY3NzVGV4dDsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIENTUyB0ZXh0IG9mIHN0eWxlcyBpbiBhIGdpdmVuIGBkb20tbW9kdWxlYC4gIENTUyBpbiBhIGBkb20tbW9kdWxlYAogICAgICogY2FuIGNvbWUgZWl0aGVyIGZyb20gYDxzdHlsZT5gcyB3aXRoaW4gdGhlIGZpcnN0IGA8dGVtcGxhdGU+YCwgb3IgZWxzZQogICAgICogZnJvbSBvbmUgb3IgbW9yZSBgPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+YCBsaW5rcyBvdXRzaWRlIHRoZQogICAgICogdGVtcGxhdGUuCiAgICAgKgogICAgICogQW55IGA8c3R5bGVzPmAgcHJvY2Vzc2VkIGFyZSByZW1vdmVkIGZyb20gdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24uCiAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLCB1c2UgYHN0eWxlRnJvbU1vZHVsZWAgaW5zdGVhZC4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZCBkb20tbW9kdWxlIGlkIHRvIGdhdGhlciBzdHlsZXMgZnJvbQogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIGNzc0Zyb21Nb2R1bGUobW9kdWxlSWQpIHsKICAgICAgbGV0IG0gPSBpbXBvcnRNb2R1bGUobW9kdWxlSWQpOwogICAgICBpZiAobSAmJiBtLl9jc3NUZXh0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBtb2R1bGUgaW1wb3J0czogPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+CiAgICAgICAgbGV0IGNzc1RleHQgPSB0aGlzLl9jc3NGcm9tTW9kdWxlSW1wb3J0cyhtKTsKICAgICAgICAvLyBpbmNsdWRlIGNzcyBmcm9tIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbiB0aGUgbW9kdWxlCiAgICAgICAgbGV0IHQgPSBtLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJyk7CiAgICAgICAgaWYgKHQpIHsKICAgICAgICAgIGNzc1RleHQgKz0gdGhpcy5jc3NGcm9tVGVtcGxhdGUodCwKICAgICAgICAgICAgLyoqIEB0eXBlIHt0ZW1wbGF0ZVdpdGhBc3NldFBhdGh9ICovKG0pLmFzc2V0cGF0aCk7CiAgICAgICAgfQogICAgICAgIG0uX2Nzc1RleHQgPSBjc3NUZXh0IHx8IG51bGw7CiAgICAgIH0KICAgICAgaWYgKCFtKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZmluZCBzdHlsZSBkYXRhIGluIG1vZHVsZSBuYW1lZCcsIG1vZHVsZUlkKTsKICAgICAgfQogICAgICByZXR1cm4gbSAmJiBtLl9jc3NUZXh0IHx8ICcnOwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgQ1NTIHRleHQgb2YgYDxzdHlsZXM+YCB3aXRoaW4gYSBnaXZlbiB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBBbnkgYDxzdHlsZXM+YCBwcm9jZXNzZWQgYXJlIHJlbW92ZWQgZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbi4KICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQsIHVzZSBgc3R5bGVGcm9tVGVtcGxhdGVgIGluc3RlYWQuCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBnYXRoZXIgc3R5bGVzIGZyb20KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlc29sdmUgdGhlIFVSTCBhZ2FpbnN0CiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IENvbmNhdGVuYXRlZCBDU1MgY29udGVudCBmcm9tIHNwZWNpZmllZCB0ZW1wbGF0ZQogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICovCiAgICBjc3NGcm9tVGVtcGxhdGUodGVtcGxhdGUsIGJhc2VVUkkpIHsKICAgICAgbGV0IGNzc1RleHQgPSAnJzsKICAgICAgY29uc3QgZSQgPSB0aGlzLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwgYmFzZVVSSSk7CiAgICAgIC8vIGlmIGVsZW1lbnQgaXMgYSB0ZW1wbGF0ZSwgZ2V0IGNvbnRlbnQgZnJvbSBpdHMgLmNvbnRlbnQKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZSQubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgZSA9IGUkW2ldOwogICAgICAgIGlmIChlLnBhcmVudE5vZGUpIHsKICAgICAgICAgIGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKTsKICAgICAgICB9CiAgICAgICAgY3NzVGV4dCArPSBlLnRleHRDb250ZW50OwogICAgICB9CiAgICAgIHJldHVybiBjc3NUZXh0OwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgQ1NTIHRleHQgZnJvbSBzdHlsZXNoZWV0cyBsb2FkZWQgdmlhIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gCiAgICAgKiBsaW5rcyB3aXRoaW4gdGhlIHNwZWNpZmllZCBgZG9tLW1vZHVsZWAuCiAgICAgKgogICAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCwgdXNlIGBzdHlsZXNGcm9tTW9kdWxlSW1wb3J0c2AgaW5zdGVhZC4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWQgSWQgb2YgYGRvbS1tb2R1bGVgIHRvIGdhdGhlciBDU1MgZnJvbQogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBsaW5rcyBpbiBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIGNzc0Zyb21Nb2R1bGVJbXBvcnRzKG1vZHVsZUlkKSB7CiAgICAgIGxldCBtID0gaW1wb3J0TW9kdWxlKG1vZHVsZUlkKTsKICAgICAgcmV0dXJuIG0gPyB0aGlzLl9jc3NGcm9tTW9kdWxlSW1wb3J0cyhtKSA6ICcnOwogICAgfSwKCiAgICAvKioKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG1vZHVsZSBkb20tbW9kdWxlIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIHN0eWxlcwogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBsaW5rcyBpbiB0aGUgZG9tLW1vZHVsZQogICAgICovCiAgICAgX2Nzc0Zyb21Nb2R1bGVJbXBvcnRzKG1vZHVsZSkgewogICAgICBsZXQgY3NzVGV4dCA9ICcnOwogICAgICBsZXQgc3R5bGVzID0gdGhpcy5fc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobW9kdWxlKTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY3NzVGV4dCArPSBzdHlsZXNbaV0udGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIGNzc1RleHQ7CiAgICB9CiAgfTsKCiAgUG9seW1lci5TdHlsZUdhdGhlciA9IFN0eWxlR2F0aGVyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGxldCBtb2R1bGVzID0ge307CiAgbGV0IGxjTW9kdWxlcyA9IHt9OwogIGZ1bmN0aW9uIHNldE1vZHVsZShpZCwgbW9kdWxlKSB7CiAgICAvLyBzdG9yZSBpZCBzZXBhcmF0ZSBmcm9tIGxvd2VyY2FzZWQgaWQgc28gdGhhdAogICAgLy8gaW4gYWxsIGNhc2VzIG1peGVkQ2FzZSBpZCB3aWxsIHN0b3JlZCBkaXN0aW5jdGx5CiAgICAvLyBhbmQgbG93ZXJjYXNlIHZlcnNpb24gaXMgYSBmYWxsYmFjawogICAgbW9kdWxlc1tpZF0gPSBsY01vZHVsZXNbaWQudG9Mb3dlckNhc2UoKV0gPSBtb2R1bGU7CiAgfQogIGZ1bmN0aW9uIGZpbmRNb2R1bGUoaWQpIHsKICAgIHJldHVybiBtb2R1bGVzW2lkXSB8fCBsY01vZHVsZXNbaWQudG9Mb3dlckNhc2UoKV07CiAgfQoKICBmdW5jdGlvbiBzdHlsZU91dHNpZGVUZW1wbGF0ZUNoZWNrKGluc3QpIHsKICAgIGlmIChpbnN0LnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlJykpIHsKICAgICAgY29uc29sZS53YXJuKCdkb20tbW9kdWxlICVzIGhhcyBzdHlsZSBvdXRzaWRlIHRlbXBsYXRlJywgaW5zdC5pZCk7CiAgICB9CiAgfQoKICAvKioKICAgKiBUaGUgYGRvbS1tb2R1bGVgIGVsZW1lbnQgcmVnaXN0ZXJzIHRoZSBkb20gaXQgY29udGFpbnMgdG8gdGhlIG5hbWUgZ2l2ZW4KICAgKiBieSB0aGUgbW9kdWxlJ3MgaWQgYXR0cmlidXRlLiBJdCBwcm92aWRlcyBhIHVuaWZpZWQgZGF0YWJhc2Ugb2YgZG9tCiAgICogYWNjZXNzaWJsZSB2aWEgaXRzIHN0YXRpYyBgaW1wb3J0YCBBUEkuCiAgICoKICAgKiBBIGtleSB1c2UgY2FzZSBvZiBgZG9tLW1vZHVsZWAgaXMgZm9yIHByb3ZpZGluZyBjdXN0b20gZWxlbWVudCBgPHRlbXBsYXRlPmBzCiAgICogdmlhIEhUTUwgaW1wb3J0cyB0aGF0IGFyZSBwYXJzZWQgYnkgdGhlIG5hdGl2ZSBIVE1MIHBhcnNlciwgdGhhdCBjYW4gYmUKICAgKiByZWxvY2F0ZWQgZHVyaW5nIGEgYnVuZGxpbmcgcGFzcyBhbmQgc3RpbGwgbG9va2VkIHVwIGJ5IGBpZGAuCiAgICoKICAgKiBFeGFtcGxlOgogICAqCiAgICogICAgIDxkb20tbW9kdWxlIGlkPSJmb28iPgogICAqICAgICAgIDxpbWcgc3JjPSJzdHVmZi5wbmciPgogICAqICAgICA8L2RvbS1tb2R1bGU+CiAgICoKICAgKiBUaGVuIGluIGNvZGUgaW4gc29tZSBvdGhlciBsb2NhdGlvbiB0aGF0IGNhbm5vdCBhY2Nlc3MgdGhlIGRvbS1tb2R1bGUgYWJvdmUKICAgKgogICAqICAgICBsZXQgaW1nID0gY3VzdG9tRWxlbWVudHMuZ2V0KCdkb20tbW9kdWxlJykuaW1wb3J0KCdmb28nLCAnaW1nJyk7CiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIEhUTUxFbGVtZW50CiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0aGF0IHByb3ZpZGVzIGEgcmVnaXN0cnkgb2YgcmVsb2NhdGFibGUgRE9NIGNvbnRlbnQKICAgKiAgIGJ5IGBpZGAgdGhhdCBpcyBhZ25vc3RpYyB0byBidW5kbGluZy4KICAgKiBAdW5yZXN0cmljdGVkCiAgICovCiAgY2xhc3MgRG9tTW9kdWxlIGV4dGVuZHMgSFRNTEVsZW1lbnQgewoKICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgeyByZXR1cm4gWydpZCddOyB9CgogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSBjc3MgYHNlbGVjdG9yYCBpbiB0aGUgbW9kdWxlCiAgICAgKiByZWdpc3RlcmVkIGJ5IGBpZGAuIEZvciBleGFtcGxlLCB0aGlzLmltcG9ydCgnZm9vJywgJ2ltZycpOwogICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBpZCBvZiB0aGUgZG9tLW1vZHVsZSBpbiB3aGljaCB0byBzZWFyY2guCiAgICAgKiBAcGFyYW0ge3N0cmluZz19IHNlbGVjdG9yIFRoZSBjc3Mgc2VsZWN0b3IgYnkgd2hpY2ggdG8gZmluZCB0aGUgZWxlbWVudC4KICAgICAqIEByZXR1cm4ge0VsZW1lbnR9IFJldHVybnMgdGhlIGVsZW1lbnQgd2hpY2ggbWF0Y2hlcyBgc2VsZWN0b3JgIGluIHRoZQogICAgICogbW9kdWxlIHJlZ2lzdGVyZWQgYXQgdGhlIHNwZWNpZmllZCBgaWRgLgogICAgICovCiAgICBzdGF0aWMgaW1wb3J0KGlkLCBzZWxlY3RvcikgewogICAgICBpZiAoaWQpIHsKICAgICAgICBsZXQgbSA9IGZpbmRNb2R1bGUoaWQpOwogICAgICAgIGlmIChtICYmIHNlbGVjdG9yKSB7CiAgICAgICAgICByZXR1cm4gbS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG07CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUuCiAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG9sZCBPbGQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBDdXJyZW50IHZhbHVlIG9mIGF0dHJpYnV0ZS4KICAgICAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZXNwYWNlIEF0dHJpYnV0ZSBuYW1lc3BhY2UuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkLCB2YWx1ZSwgbmFtZXNwYWNlKSB7CiAgICAgIGlmIChvbGQgIT09IHZhbHVlKSB7CiAgICAgICAgdGhpcy5yZWdpc3RlcigpOwogICAgICB9CiAgICB9CiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC1hcmdzICovCgogICAgLyoqCiAgICAgKiBUaGUgYWJzb2x1dGUgVVJMIG9mIHRoZSBvcmlnaW5hbCBsb2NhdGlvbiBvZiB0aGlzIGBkb20tbW9kdWxlYC4KICAgICAqCiAgICAgKiBUaGlzIHZhbHVlIHdpbGwgZGlmZmVyIGZyb20gdGhpcyBlbGVtZW50J3MgYG93bmVyRG9jdW1lbnRgIGluIHRoZQogICAgICogZm9sbG93aW5nIHdheXM6CiAgICAgKiAtIFRha2VzIGludG8gYWNjb3VudCBhbnkgYGFzc2V0cGF0aGAgYXR0cmlidXRlIGFkZGVkIGR1cmluZyBidW5kbGluZwogICAgICogICB0byBpbmRpY2F0ZSB0aGUgb3JpZ2luYWwgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIGJ1bmRsZWQgbG9jYXRpb24KICAgICAqIC0gVXNlcyB0aGUgSFRNTEltcG9ydHMgcG9seWZpbGwncyBgaW1wb3J0Rm9yRWxlbWVudGAgQVBJIHRvIGVuc3VyZQogICAgICogICB0aGUgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgaW1wb3J0IGRvY3VtZW50J3MgbG9jYXRpb24gc2luY2UKICAgICAqICAgYG93bmVyRG9jdW1lbnRgIGlzIG5vdCBjdXJyZW50bHkgcG9seWZpbGxlZAogICAgICovCiAgICBnZXQgYXNzZXRwYXRoKCkgewogICAgICAvLyBEb24ndCBvdmVycmlkZSBleGlzdGluZyBhc3NldHBhdGguCiAgICAgIGlmICghdGhpcy5fX2Fzc2V0cGF0aCkgewogICAgICAgIC8vIG5vdGU6IGFzc2V0cGF0aCBzZXQgdmlhIGFuIGF0dHJpYnV0ZSBtdXN0IGJlIHJlbGF0aXZlIHRvIHRoaXMKICAgICAgICAvLyBlbGVtZW50J3MgbG9jYXRpb247IGFjY29tb2RhdGUgcG9seWZpbGxlZCBIVE1MSW1wb3J0cwogICAgICAgIGNvbnN0IG93bmVyID0gd2luZG93LkhUTUxJbXBvcnRzICYmIEhUTUxJbXBvcnRzLmltcG9ydEZvckVsZW1lbnQgPwogICAgICAgICAgSFRNTEltcG9ydHMuaW1wb3J0Rm9yRWxlbWVudCh0aGlzKSB8fCBkb2N1bWVudCA6IHRoaXMub3duZXJEb2N1bWVudDsKICAgICAgICBjb25zdCB1cmwgPSBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybCgKICAgICAgICAgIHRoaXMuZ2V0QXR0cmlidXRlKCdhc3NldHBhdGgnKSB8fCAnJywgb3duZXIuYmFzZVVSSSk7CiAgICAgICAgdGhpcy5fX2Fzc2V0cGF0aCA9IFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybCh1cmwpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9fYXNzZXRwYXRoOwogICAgfQoKICAgIC8qKgogICAgICogUmVnaXN0ZXJzIHRoZSBkb20tbW9kdWxlIGF0IGEgZ2l2ZW4gaWQuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZAogICAgICogd2hlbiBhIGRvbS1tb2R1bGUgaXMgaW1wZXJhdGl2ZWx5IGNyZWF0ZWQuIEZvcgogICAgICogZXhhbXBsZSwgYGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RvbS1tb2R1bGUnKS5yZWdpc3RlcignZm9vJylgLgogICAgICogQHBhcmFtIHtzdHJpbmc9fSBpZCBUaGUgaWQgYXQgd2hpY2ggdG8gcmVnaXN0ZXIgdGhlIGRvbS1tb2R1bGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZWdpc3RlcihpZCkgewogICAgICBpZCA9IGlkIHx8IHRoaXMuaWQ7CiAgICAgIGlmIChpZCkgewogICAgICAgIC8vIFVuZGVyIHN0cmljdFRlbXBsYXRlUG9saWN5LCByZWplY3QgYW5kIG51bGwgb3V0IGFueSByZS1yZWdpc3RlcmVkCiAgICAgICAgLy8gZG9tLW1vZHVsZSBzaW5jZSBpdCBpcyBhbWJpZ3VvdXMgd2hldGhlciBmaXJzdC1pbiBvciBsYXN0LWluIGlzIHRydXN0ZWQgCiAgICAgICAgaWYgKFBvbHltZXIuc3RyaWN0VGVtcGxhdGVQb2xpY3kgJiYgZmluZE1vZHVsZShpZCkgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgc2V0TW9kdWxlKGlkLCBudWxsKTsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc3RyaWN0VGVtcGxhdGVQb2xpY3k6IGRvbS1tb2R1bGUgJHtpZH0gcmUtcmVnaXN0ZXJlZGApOwogICAgICAgIH0KICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgc2V0TW9kdWxlKGlkLCB0aGlzKTsKICAgICAgICBzdHlsZU91dHNpZGVUZW1wbGF0ZUNoZWNrKHRoaXMpOwogICAgICB9CiAgICB9CiAgfQoKICBEb21Nb2R1bGUucHJvdG90eXBlWydtb2R1bGVzJ10gPSBtb2R1bGVzOwoKICBjdXN0b21FbGVtZW50cy5kZWZpbmUoJ2RvbS1tb2R1bGUnLCBEb21Nb2R1bGUpOwoKICAvKiogQGNvbnN0ICovCiAgUG9seW1lci5Eb21Nb2R1bGUgPSBEb21Nb2R1bGU7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgbWFuaXB1bGF0aW5nIHN0cnVjdHVyZWQgZGF0YSBwYXRoIHN0cmluZ3MuCiAgICoKICAgKiBAbmFtZXNwYWNlCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBNb2R1bGUgd2l0aCB1dGlsaXRpZXMgZm9yIG1hbmlwdWxhdGluZyBzdHJ1Y3R1cmVkIGRhdGEgcGF0aCBzdHJpbmdzLgogICAqLwogIGNvbnN0IFBhdGggPSB7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBhIHN0cnVjdHVyZWQgZGF0YSBwYXRoIChoYXMgZG90cykuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5pc1BhdGgoJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzUGF0aCgnZm9vJykgICAgICAgICAvLyBmYWxzZQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBjb250YWluZWQgb25lIG9yIG1vcmUgZG90cwogICAgICovCiAgICBpc1BhdGg6IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgcmV0dXJuIHBhdGguaW5kZXhPZignLicpID49IDA7CiAgICB9LAoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcm9vdCBwcm9wZXJ0eSBuYW1lIGZvciB0aGUgZ2l2ZW4gcGF0aC4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqIGBgYAogICAgICogUG9seW1lci5QYXRoLnJvb3QoJ2Zvby5iYXIuYmF6JykgLy8gJ2ZvbycKICAgICAqIFBvbHltZXIuUGF0aC5yb290KCdmb28nKSAgICAgICAgIC8vICdmb28nCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5QYXRoCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQYXRoIHN0cmluZwogICAgICogQHJldHVybiB7c3RyaW5nfSBSb290IHByb3BlcnR5IG5hbWUKICAgICAqLwogICAgcm9vdDogZnVuY3Rpb24ocGF0aCkgewogICAgICBsZXQgZG90SW5kZXggPSBwYXRoLmluZGV4T2YoJy4nKTsKICAgICAgaWYgKGRvdEluZGV4ID09PSAtMSkgewogICAgICAgIHJldHVybiBwYXRoOwogICAgICB9CiAgICAgIHJldHVybiBwYXRoLnNsaWNlKDAsIGRvdEluZGV4KTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBHaXZlbiBgYmFzZWAgaXMgYGZvby5iYXJgLCBgZm9vYCBpcyBhbiBhbmNlc3RvciwgYGZvby5iYXJgIGlzIG5vdAogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwYXRoIGlzIGFuIGFuY2VzdG9yIG9mIHRoZSBiYXNlIHBhdGguCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5pc0FuY2VzdG9yKCdmb28uYmFyJywgJ2ZvbycpICAgICAgICAgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzQW5jZXN0b3IoJ2Zvby5iYXInLCAnZm9vLmJhcicpICAgICAvLyBmYWxzZQogICAgICogUG9seW1lci5QYXRoLmlzQW5jZXN0b3IoJ2Zvby5iYXInLCAnZm9vLmJhci5iYXonKSAvLyBmYWxzZQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2UgUGF0aCBzdHJpbmcgdG8gdGVzdCBhZ2FpbnN0LgogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcgdG8gdGVzdC4KICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYHBhdGhgIGlzIGFuIGFuY2VzdG9yIG9mIGBiYXNlYC4KICAgICAqLwogICAgaXNBbmNlc3RvcjogZnVuY3Rpb24oYmFzZSwgcGF0aCkgewogICAgICAvLyAgICAgYmFzZS5zdGFydHNXaXRoKHBhdGggKyAnLicpOwogICAgICByZXR1cm4gYmFzZS5pbmRleE9mKHBhdGggKyAnLicpID09PSAwOwogICAgfSwKCiAgICAvKioKICAgICAqIEdpdmVuIGBiYXNlYCBpcyBgZm9vLmJhcmAsIGBmb28uYmFyLmJhemAgaXMgYW4gZGVzY2VuZGFudAogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KCdmb28uYmFyJywgJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzRGVzY2VuZGFudCgnZm9vLmJhcicsICdmb28uYmFyJykgICAgIC8vIGZhbHNlCiAgICAgKiBQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KCdmb28uYmFyJywgJ2ZvbycpICAgICAgICAgLy8gZmFsc2UKICAgICAqIGBgYAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIFBhdGggc3RyaW5nIHRvIHRlc3QgYWdhaW5zdC4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nIHRvIHRlc3QuCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBwYXRoYCBpcyBhIGRlc2NlbmRhbnQgb2YgYGJhc2VgLgogICAgICovCiAgICBpc0Rlc2NlbmRhbnQ6IGZ1bmN0aW9uKGJhc2UsIHBhdGgpIHsKICAgICAgLy8gICAgIHBhdGguc3RhcnRzV2l0aChiYXNlICsgJy4nKTsKICAgICAgcmV0dXJuIHBhdGguaW5kZXhPZihiYXNlICsgJy4nKSA9PT0gMDsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBhIHByZXZpb3VzIGJhc2UgcGF0aCB3aXRoIGEgbmV3IGJhc2UgcGF0aCwgcHJlc2VydmluZyB0aGUKICAgICAqIHJlbWFpbmRlciBvZiB0aGUgcGF0aC4KICAgICAqCiAgICAgKiBVc2VyIG11c3QgZW5zdXJlIGBwYXRoYCBoYXMgYSBwcmVmaXggb2YgYGJhc2VgLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGgudHJhbnNsYXRlKCdmb28uYmFyJywgJ3pvdCcsICdmb28uYmFyLmJheicpIC8vICd6b3QuYmF6JwogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2UgQ3VycmVudCBiYXNlIHN0cmluZyB0byByZW1vdmUKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdCYXNlIE5ldyBiYXNlIHN0cmluZyB0byByZXBsYWNlIHdpdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggdG8gdHJhbnNsYXRlCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRyYW5zbGF0ZWQgc3RyaW5nCiAgICAgKi8KICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24oYmFzZSwgbmV3QmFzZSwgcGF0aCkgewogICAgICByZXR1cm4gbmV3QmFzZSArIHBhdGguc2xpY2UoYmFzZS5sZW5ndGgpOwogICAgfSwKCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIFBhdGggc3RyaW5nIHRvIHRlc3QgYWdhaW5zdAogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcgdG8gdGVzdAogICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgcGF0aGAgaXMgZXF1YWwgdG8gYGJhc2VgCiAgICAgKiBAdGhpcyB7UGF0aH0KICAgICAqLwogICAgbWF0Y2hlczogZnVuY3Rpb24oYmFzZSwgcGF0aCkgewogICAgICByZXR1cm4gKGJhc2UgPT09IHBhdGgpIHx8CiAgICAgICAgICAgICB0aGlzLmlzQW5jZXN0b3IoYmFzZSwgcGF0aCkgfHwKICAgICAgICAgICAgIHRoaXMuaXNEZXNjZW5kYW50KGJhc2UsIHBhdGgpOwogICAgfSwKCiAgICAvKioKICAgICAqIENvbnZlcnRzIGFycmF5LWJhc2VkIHBhdGhzIHRvIGZsYXR0ZW5lZCBwYXRoLiAgU3RyaW5nLWJhc2VkIHBhdGhzCiAgICAgKiBhcmUgcmV0dXJuZWQgYXMtaXMuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5ub3JtYWxpemUoWydmb28uYmFyJywgMCwgJ2JheiddKSAgLy8gJ2Zvby5iYXIuMC5iYXonCiAgICAgKiBQb2x5bWVyLlBhdGgubm9ybWFsaXplKCdmb28uYmFyLjAuYmF6JykgICAgICAgIC8vICdmb28uYmFyLjAuYmF6JwogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggSW5wdXQgcGF0aAogICAgICogQHJldHVybiB7c3RyaW5nfSBGbGF0dGVuZWQgcGF0aAogICAgICovCiAgICBub3JtYWxpemU6IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHsKICAgICAgICBsZXQgcGFydHMgPSBbXTsKICAgICAgICBmb3IgKGxldCBpPTA7IGk8cGF0aC5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IGFyZ3MgPSBwYXRoW2ldLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTsKICAgICAgICAgIGZvciAobGV0IGo9MDsgajxhcmdzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIHBhcnRzLnB1c2goYXJnc1tqXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJ0cy5qb2luKCcuJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBTcGxpdHMgYSBwYXRoIGludG8gYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuIEFjY2VwdHMgZWl0aGVyIGFycmF5cwogICAgICogb2YgcGF0aCBwYXJ0cyBvciBzdHJpbmdzLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGguc3BsaXQoWydmb28uYmFyJywgMCwgJ2JheiddKSAgLy8gWydmb28nLCAnYmFyJywgJzAnLCAnYmF6J10KICAgICAqIFBvbHltZXIuUGF0aC5zcGxpdCgnZm9vLmJhci4wLmJheicpICAgICAgICAvLyBbJ2ZvbycsICdiYXInLCAnMCcsICdiYXonXQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggSW5wdXQgcGF0aAogICAgICogQHJldHVybiB7IUFycmF5PHN0cmluZz59IEFycmF5IG9mIHBhdGggcGFydHMKICAgICAqIEB0aGlzIHtQYXRofQogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzfQogICAgICovCiAgICBzcGxpdDogZnVuY3Rpb24ocGF0aCkgewogICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkgewogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZShwYXRoKS5zcGxpdCgnLicpOwogICAgICB9CiAgICAgIHJldHVybiBwYXRoLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZWFkcyBhIHZhbHVlIGZyb20gYSBwYXRoLiAgSWYgYW55IHN1Yi1wcm9wZXJ0eSBpbiB0aGUgcGF0aCBpcyBgdW5kZWZpbmVkYCwKICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAgKHdpbGwgbmV2ZXIgdGhyb3cuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtPYmplY3R9IHJvb3QgT2JqZWN0IGZyb20gd2hpY2ggdG8gZGVyZWZlcmVuY2UgcGF0aCBmcm9tCiAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIHJlYWQKICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaW5mbyBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgdG8gYGluZm9gLCB0aGUgbm9ybWFsaXplZAogICAgICogIChmbGF0dGVuZWQpIHBhdGggd2lsbCBiZSBzZXQgdG8gYGluZm8ucGF0aGAuCiAgICAgKiBAcmV0dXJuIHsqfSBWYWx1ZSBhdCBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgcGF0aCBjb3VsZCBub3QgYmUKICAgICAqICBmdWxseSBkZXJlZmVyZW5jZWQuCiAgICAgKiBAdGhpcyB7UGF0aH0KICAgICAqLwogICAgZ2V0OiBmdW5jdGlvbihyb290LCBwYXRoLCBpbmZvKSB7CiAgICAgIGxldCBwcm9wID0gcm9vdDsKICAgICAgbGV0IHBhcnRzID0gdGhpcy5zcGxpdChwYXRoKTsKICAgICAgLy8gTG9vcCBvdmVyIHBhdGggcGFydHNbMC4ubi0xXSBhbmQgZGVyZWZlcmVuY2UKICAgICAgZm9yIChsZXQgaT0wOyBpPHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKCFwcm9wKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGxldCBwYXJ0ID0gcGFydHNbaV07CiAgICAgICAgcHJvcCA9IHByb3BbcGFydF07CiAgICAgIH0KICAgICAgaWYgKGluZm8pIHsKICAgICAgICBpbmZvLnBhdGggPSBwYXJ0cy5qb2luKCcuJyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHByb3A7CiAgICB9LAoKICAgIC8qKgogICAgICogU2V0cyBhIHZhbHVlIHRvIGEgcGF0aC4gIElmIGFueSBzdWItcHJvcGVydHkgaW4gdGhlIHBhdGggaXMgYHVuZGVmaW5lZGAsCiAgICAgKiB0aGlzIG1ldGhvZCB3aWxsIG5vLW9wLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7T2JqZWN0fSByb290IE9iamVjdCBmcm9tIHdoaWNoIHRvIGRlcmVmZXJlbmNlIHBhdGggZnJvbQogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBzZXQKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0IHRvIHBhdGgKICAgICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gVGhlIG5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgaW5wdXQgcGF0aAogICAgICogQHRoaXMge1BhdGh9CiAgICAgKi8KICAgIHNldDogZnVuY3Rpb24ocm9vdCwgcGF0aCwgdmFsdWUpIHsKICAgICAgbGV0IHByb3AgPSByb290OwogICAgICBsZXQgcGFydHMgPSB0aGlzLnNwbGl0KHBhdGgpOwogICAgICBsZXQgbGFzdCA9IHBhcnRzW3BhcnRzLmxlbmd0aC0xXTsKICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAvLyBMb29wIG92ZXIgcGF0aCBwYXJ0c1swLi5uLTJdIGFuZCBkZXJlZmVyZW5jZQogICAgICAgIGZvciAobGV0IGk9MDsgaTxwYXJ0cy5sZW5ndGgtMTsgaSsrKSB7CiAgICAgICAgICBsZXQgcGFydCA9IHBhcnRzW2ldOwogICAgICAgICAgcHJvcCA9IHByb3BbcGFydF07CiAgICAgICAgICBpZiAoIXByb3ApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBTZXQgdmFsdWUgdG8gb2JqZWN0IGF0IGVuZCBvZiBwYXRoCiAgICAgICAgcHJvcFtsYXN0XSA9IHZhbHVlOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFNpbXBsZSBwcm9wZXJ0eSBzZXQKICAgICAgICBwcm9wW3BhdGhdID0gdmFsdWU7CiAgICAgIH0KICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJy4nKTsKICAgIH0KCiAgfTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYSBzdHJ1Y3R1cmVkIGRhdGEgcGF0aCAoaGFzIGRvdHMpLgogICAqCiAgICogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLiAgVXNlIGBQb2x5bWVyLlBhdGguaXNQYXRoYCBpbnN0ZWFkLgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqIGBgYAogICAqIFBvbHltZXIuUGF0aC5pc0RlZXAoJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAqIFBvbHltZXIuUGF0aC5pc0RlZXAoJ2ZvbycpICAgICAgICAgLy8gZmFsc2UKICAgKiBgYGAKICAgKgogICAqIEBkZXByZWNhdGVkCiAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnRhaW5lZCBvbmUgb3IgbW9yZSBkb3RzCiAgICovCiAgUGF0aC5pc0RlZXAgPSBQYXRoLmlzUGF0aDsKCiAgUG9seW1lci5QYXRoID0gUGF0aDsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgY2FzZU1hcCA9IHt9OwogIGNvbnN0IERBU0hfVE9fQ0FNRUwgPSAvLVthLXpdL2c7CiAgY29uc3QgQ0FNRUxfVE9fREFTSCA9IC8oW0EtWl0pL2c7CgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgY29udmVydGluZyBiZXR3ZWVuICJkYXNoLWNhc2UiIGFuZCAiY2FtZWxDYXNlIgogICAqIGlkZW50aWZpZXJzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIHRoYXQgcHJvdmlkZXMgdXRpbGl0aWVzIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gImRhc2gtY2FzZSIKICAgKiAgIGFuZCAiY2FtZWxDYXNlIi4KICAgKi8KICBjb25zdCBDYXNlTWFwID0gewoKICAgIC8qKgogICAgICogQ29udmVydHMgImRhc2gtY2FzZSIgaWRlbnRpZmllciAoZS5nLiBgZm9vLWJhci1iYXpgKSB0byAiY2FtZWxDYXNlIgogICAgICogKGUuZy4gYGZvb0JhckJhemApLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkNhc2VNYXAKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXNoIERhc2gtY2FzZSBpZGVudGlmaWVyCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IENhbWVsLWNhc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlkZW50aWZpZXIKICAgICAqLwogICAgZGFzaFRvQ2FtZWxDYXNlKGRhc2gpIHsKICAgICAgcmV0dXJuIGNhc2VNYXBbZGFzaF0gfHwgKAogICAgICAgIGNhc2VNYXBbZGFzaF0gPSBkYXNoLmluZGV4T2YoJy0nKSA8IDAgPyBkYXNoIDogZGFzaC5yZXBsYWNlKERBU0hfVE9fQ0FNRUwsCiAgICAgICAgICAobSkgPT4gbVsxXS50b1VwcGVyQ2FzZSgpCiAgICAgICAgKQogICAgICApOwogICAgfSwKCiAgICAvKioKICAgICAqIENvbnZlcnRzICJjYW1lbENhc2UiIGlkZW50aWZpZXIgKGUuZy4gYGZvb0JhckJhemApIHRvICJkYXNoLWNhc2UiCiAgICAgKiAoZS5nLiBgZm9vLWJhci1iYXpgKS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5DYXNlTWFwCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2FtZWwgQ2FtZWwtY2FzZSBpZGVudGlmaWVyCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IERhc2gtY2FzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaWRlbnRpZmllcgogICAgICovCiAgICBjYW1lbFRvRGFzaENhc2UoY2FtZWwpIHsKICAgICAgcmV0dXJuIGNhc2VNYXBbY2FtZWxdIHx8ICgKICAgICAgICBjYXNlTWFwW2NhbWVsXSA9IGNhbWVsLnJlcGxhY2UoQ0FNRUxfVE9fREFTSCwgJy0kMScpLnRvTG93ZXJDYXNlKCkKICAgICAgKTsKICAgIH0KCiAgfTsKCiAgUG9seW1lci5DYXNlTWFwID0gQ2FzZU1hcDsKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgLy8gTWljcm90YXNrIGltcGxlbWVudGVkIHVzaW5nIE11dGF0aW9uIE9ic2VydmVyCiAgbGV0IG1pY3JvdGFza0N1cnJIYW5kbGUgPSAwOwogIGxldCBtaWNyb3Rhc2tMYXN0SGFuZGxlID0gMDsKICBsZXQgbWljcm90YXNrQ2FsbGJhY2tzID0gW107CiAgbGV0IG1pY3JvdGFza05vZGVDb250ZW50ID0gMDsKICBsZXQgbWljcm90YXNrTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTsKICBuZXcgd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIobWljcm90YXNrRmx1c2gpLm9ic2VydmUobWljcm90YXNrTm9kZSwge2NoYXJhY3RlckRhdGE6IHRydWV9KTsKCiAgZnVuY3Rpb24gbWljcm90YXNrRmx1c2goKSB7CiAgICBjb25zdCBsZW4gPSBtaWNyb3Rhc2tDYWxsYmFja3MubGVuZ3RoOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBsZXQgY2IgPSBtaWNyb3Rhc2tDYWxsYmFja3NbaV07CiAgICAgIGlmIChjYikgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjYigpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aHJvdyBlOyB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIG1pY3JvdGFza0NhbGxiYWNrcy5zcGxpY2UoMCwgbGVuKTsKICAgIG1pY3JvdGFza0xhc3RIYW5kbGUgKz0gbGVuOwogIH0KCiAgLyoqCiAgICogTW9kdWxlIHRoYXQgcHJvdmlkZXMgYSBudW1iZXIgb2Ygc3RyYXRlZ2llcyBmb3IgZW5xdWV1aW5nIGFzeW5jaHJvbm91cwogICAqIHRhc2tzLiAgRWFjaCBzdWItbW9kdWxlIHByb3ZpZGVzIGEgc3RhbmRhcmQgYHJ1bihmbilgIGludGVyZmFjZSB0aGF0IHJldHVybnMgYQogICAqIGhhbmRsZSwgYW5kIGEgYGNhbmNlbChoYW5kbGUpYCBpbnRlcmZhY2UgZm9yIGNhbmNlbGluZyBhc3luYyB0YXNrcyBiZWZvcmUKICAgKiB0aGV5IHJ1bi4KICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1vZHVsZSB0aGF0IHByb3ZpZGVzIGEgbnVtYmVyIG9mIHN0cmF0ZWdpZXMgZm9yIGVucXVldWluZyBhc3luY2hyb25vdXMKICAgKiB0YXNrcy4KICAgKi8KICBQb2x5bWVyLkFzeW5jID0gewoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGBzZXRUaW1lb3V0YC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGBzZXRUaW1lb3V0YC4KICAgICAqLwogICAgdGltZU91dDogewogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIHN1Yi1tb2R1bGUgd2l0aCB0aGUgYXN5bmMgaW50ZXJmYWNlIHByb3ZpZGluZyB0aGUgcHJvdmlkZWQKICAgICAgICogZGVsYXkuCiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkFzeW5jLnRpbWVPdXQKICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBkZWxheSBUaW1lIHRvIHdhaXQgYmVmb3JlIGNhbGxpbmcgY2FsbGJhY2tzIGluIG1zCiAgICAgICAqIEByZXR1cm4geyFBc3luY0ludGVyZmFjZX0gQW4gYXN5bmMgdGltZW91dCBpbnRlcmZhY2UKICAgICAgICovCiAgICAgIGFmdGVyKGRlbGF5KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHJ1bihmbikgeyByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZm4sIGRlbGF5KTsgfSwKICAgICAgICAgIGNhbmNlbChoYW5kbGUpIHsKICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChoYW5kbGUpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBFbnF1ZXVlcyBhIGZ1bmN0aW9uIGNhbGxlZCBpbiB0aGUgbmV4dCB0YXNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy50aW1lT3V0CiAgICAgICAqIEBwYXJhbSB7IUZ1bmN0aW9ufSBmbiBDYWxsYmFjayB0byBydW4KICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBkZWxheSBEZWxheSBpbiBtaWxsaXNlY29uZHMKICAgICAgICogQHJldHVybiB7bnVtYmVyfSBIYW5kbGUgdXNlZCBmb3IgY2FuY2VsaW5nIHRhc2sKICAgICAgICovCiAgICAgIHJ1bihmbiwgZGVsYXkpIHsKICAgICAgICByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZm4sIGRlbGF5KTsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAqIENhbmNlbHMgYSBwcmV2aW91c2x5IGVucXVldWVkIGB0aW1lT3V0YCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMudGltZU91dAogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKGhhbmRsZSkgewogICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoaGFuZGxlKTsKICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIEFzeW5jIGludGVyZmFjZSB3cmFwcGVyIGFyb3VuZCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLgogICAgICovCiAgICBhbmltYXRpb25GcmFtZTogewogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAgdGltaW5nLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5hbmltYXRpb25GcmFtZQogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6dm9pZH0gZm4gQ2FsbGJhY2sgdG8gcnVuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHVzZWQgZm9yIGNhbmNlbGluZyB0YXNrCiAgICAgICAqLwogICAgICBydW4oZm4pIHsKICAgICAgICByZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIGEgcHJldmlvdXNseSBlbnF1ZXVlZCBgYW5pbWF0aW9uRnJhbWVgIGNhbGxiYWNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5hbmltYXRpb25GcmFtZQogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKGhhbmRsZSkgewogICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShoYW5kbGUpOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4gIEZhbGxzIGJhY2sgdG8KICAgICAqIGBzZXRUaW1lb3V0YCBvbiBicm93c2VycyB0aGF0IGRvIG5vdCBzdXBwb3J0IGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4KICAgICAqLwogICAgaWRsZVBlcmlvZDogewogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgYHJlcXVlc3RJZGxlQ2FsbGJhY2tgIHRpbWluZy4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMuaWRsZVBlcmlvZAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFJZGxlRGVhZGxpbmUpOnZvaWR9IGZuIENhbGxiYWNrIHRvIHJ1bgogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEhhbmRsZSB1c2VkIGZvciBjYW5jZWxpbmcgdGFzawogICAgICAgKi8KICAgICAgcnVuKGZuKSB7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrID8KICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrKGZuKSA6CiAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmbiwgMTYpOwogICAgICB9LAogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhIHByZXZpb3VzbHkgZW5xdWV1ZWQgYGlkbGVQZXJpb2RgIGNhbGxiYWNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5pZGxlUGVyaW9kCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gYHJ1bmAgb2YgY2FsbGJhY2sgdG8gY2FuY2VsCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjYW5jZWwoaGFuZGxlKSB7CiAgICAgICAgd2luZG93LmNhbmNlbElkbGVDYWxsYmFjayA/CiAgICAgICAgICB3aW5kb3cuY2FuY2VsSWRsZUNhbGxiYWNrKGhhbmRsZSkgOgogICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChoYW5kbGUpOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIGZvciBlbnF1ZXVpbmcgY2FsbGJhY2tzIHRoYXQgcnVuIGF0IG1pY3JvdGFzayB0aW1pbmcuCiAgICAgKgogICAgICogTm90ZSB0aGF0IG1pY3JvdGFzayB0aW1pbmcgaXMgYWNoaWV2ZWQgdmlhIGEgc2luZ2xlIGBNdXRhdGlvbk9ic2VydmVyYCwKICAgICAqIGFuZCB0aHVzIGNhbGxiYWNrcyBlbnF1ZXVlZCB3aXRoIHRoaXMgQVBJIHdpbGwgYWxsIHJ1biBpbiBhIHNpbmdsZQogICAgICogYmF0Y2gsIGFuZCBub3QgaW50ZXJsZWF2ZWQgd2l0aCBvdGhlciBtaWNyb3Rhc2tzIHN1Y2ggYXMgcHJvbWlzZXMuCiAgICAgKiBQcm9taXNlcyBhcmUgYXZvaWRlZCBhcyBhbiBpbXBsZW1lbnRhdGlvbiBjaG9pY2UgZm9yIHRoZSB0aW1lIGJlaW5nCiAgICAgKiBkdWUgdG8gU2FmYXJpIGJ1Z3MgdGhhdCBjYXVzZSBQcm9taXNlcyB0byBsYWNrIG1pY3JvdGFzayBndWFyYW50ZWVzLgogICAgICoKICAgICAqIEBuYW1lc3BhY2UKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkFzeW5jCiAgICAgKiBAc3VtbWFyeSBBc3luYyBpbnRlcmZhY2UgZm9yIGVucXVldWluZyBjYWxsYmFja3MgdGhhdCBydW4gYXQgbWljcm90YXNrCiAgICAgKiAgIHRpbWluZy4KICAgICAqLwogICAgbWljcm9UYXNrOiB7CgogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgbWljcm90YXNrIHRpbWluZy4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAqIEBwYXJhbSB7IUZ1bmN0aW9uPX0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gcnVuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHVzZWQgZm9yIGNhbmNlbGluZyB0YXNrCiAgICAgICAqLwogICAgICBydW4oY2FsbGJhY2spIHsKICAgICAgICBtaWNyb3Rhc2tOb2RlLnRleHRDb250ZW50ID0gbWljcm90YXNrTm9kZUNvbnRlbnQrKzsKICAgICAgICBtaWNyb3Rhc2tDYWxsYmFja3MucHVzaChjYWxsYmFjayk7CiAgICAgICAgcmV0dXJuIG1pY3JvdGFza0N1cnJIYW5kbGUrKzsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIGEgcHJldmlvdXNseSBlbnF1ZXVlZCBgbWljcm9UYXNrYCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gYHJ1bmAgb2YgY2FsbGJhY2sgdG8gY2FuY2VsCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjYW5jZWwoaGFuZGxlKSB7CiAgICAgICAgY29uc3QgaWR4ID0gaGFuZGxlIC0gbWljcm90YXNrTGFzdEhhbmRsZTsKICAgICAgICBpZiAoaWR4ID49IDApIHsKICAgICAgICAgIGlmICghbWljcm90YXNrQ2FsbGJhY2tzW2lkeF0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFzeW5jIGhhbmRsZTogJyArIGhhbmRsZSk7CiAgICAgICAgICB9CiAgICAgICAgICBtaWNyb3Rhc2tDYWxsYmFja3NbaWR4XSA9IG51bGw7CiAgICAgICAgfQogICAgICB9CgogICAgfQogIH07Cgp9KSgpOwoKCiAgKGZ1bmN0aW9uICgpIHsKCiAgICAndXNlIHN0cmljdCc7CgogICAgLyoqIEBjb25zdCB7IUFzeW5jSW50ZXJmYWNlfSAqLwogICAgY29uc3QgbWljcm90YXNrID0gUG9seW1lci5Bc3luYy5taWNyb1Rhc2s7CgogICAgLyoqCiAgICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgYmFzaWMgbWV0YS1wcm9ncmFtbWluZyBmb3IgY3JlYXRpbmcgb25lCiAgICAgKiBvciBtb3JlIHByb3BlcnR5IGFjY2Vzc29ycyAoZ2V0dGVyL3NldHRlciBwYWlyKSB0aGF0IGVucXVldWUgYW4gYXN5bmMKICAgICAqIChiYXRjaGVkKSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAqCiAgICAgKiBGb3IgYmFzaWMgdXNhZ2Ugb2YgdGhpcyBtaXhpbiwgY2FsbCBgTXlDbGFzcy5jcmVhdGVQcm9wZXJ0aWVzKHByb3BzKWAKICAgICAqIG9uY2UgYXQgY2xhc3MgZGVmaW5pdGlvbiB0aW1lIHRvIGNyZWF0ZSBwcm9wZXJ0eSBhY2Nlc3NvcnMgZm9yIHByb3BlcnRpZXMKICAgICAqIG5hbWVkIGluIHByb3BzLCBpbXBsZW1lbnQgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgdG8gcmVhY3QgYXMgZGVzaXJlZCB0bwogICAgICogcHJvcGVydHkgY2hhbmdlcywgYW5kIGltcGxlbWVudCBgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKWAgYW5kCiAgICAgKiBpbmNsdWRlIGxvd2VyY2FzZSB2ZXJzaW9ucyBvZiBhbnkgcHJvcGVydHkgbmFtZXMgdGhhdCBzaG91bGQgYmUgc2V0IGZyb20KICAgICAqIGF0dHJpYnV0ZXMuIExhc3QsIGNhbGwgYHRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKWAgaW4gdGhlIGVsZW1lbnQncwogICAgICogYGNvbm5lY3RlZENhbGxiYWNrYCB0byBlbmFibGUgdGhlIGFjY2Vzc29ycy4KICAgICAqCiAgICAgKiBAbWl4aW5GdW5jdGlvbgogICAgICogQHBvbHltZXIKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIGZvciByZWFjdGluZyB0byBwcm9wZXJ0eSBjaGFuZ2VzIGZyb20KICAgICAqICAgZ2VuZXJhdGVkIHByb3BlcnR5IGFjY2Vzc29ycy4KICAgICAqLwogICAgUG9seW1lci5Qcm9wZXJ0aWVzQ2hhbmdlZCA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAgIC8qKgogICAgICAgKiBAcG9seW1lcgogICAgICAgKiBAbWl4aW5DbGFzcwogICAgICAgKiBAZXh0ZW5kcyB7c3VwZXJDbGFzc30KICAgICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydGllc0NoYW5nZWR9CiAgICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAgICovCiAgICAgIGNsYXNzIFByb3BlcnRpZXNDaGFuZ2VkIGV4dGVuZHMgc3VwZXJDbGFzcyB7CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgcHJvcGVydHkgYWNjZXNzb3JzIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZXMuCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBwcm9wcyBPYmplY3Qgd2hvc2Uga2V5cyBhcmUgbmFtZXMgb2YgYWNjZXNzb3JzLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgICAgICBjb25zdCBwcm90byA9IHRoaXMucHJvdG90eXBlOwogICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBwcm9wcykgewogICAgICAgICAgICAvLyBkb24ndCBzdG9tcCBhbiBleGlzdGluZyBhY2Nlc3NvcgogICAgICAgICAgICBpZiAoIShwcm9wIGluIHByb3RvKSkgewogICAgICAgICAgICAgIHByb3RvLl9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKHByb3ApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFuIGF0dHJpYnV0ZSBuYW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIFRoZSBhdHRyaWJ1dGUgbmFtZSBpcyB0aGUgbG93ZXJjYXNlZCBwcm9wZXJ0eSBuYW1lLiBPdmVycmlkZSB0bwogICAgICAgICAqIGN1c3RvbWl6ZSB0aGlzIG1hcHBpbmcuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRvIGNvbnZlcnQKICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEF0dHJpYnV0ZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBhdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiBwcm9wZXJ0eS50b0xvd2VyQ2FzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogT3ZlcnJpZGUgcG9pbnQgdG8gcHJvdmlkZSBhIHR5cGUgdG8gd2hpY2ggdG8gZGVzZXJpYWxpemUgYSB2YWx1ZSB0bwogICAgICAgICAqIGEgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBwcm9wZXJ0eQogICAgICAgICAqCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyB0eXBlRm9yUHJvcGVydHkobmFtZSkgeyB9IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgc2V0dGVyL2dldHRlciBwYWlyIGZvciB0aGUgbmFtZWQgcHJvcGVydHkgd2l0aCBpdHMgb3duCiAgICAgICAgICogbG9jYWwgc3RvcmFnZS4gIFRoZSBnZXR0ZXIgcmV0dXJucyB0aGUgdmFsdWUgaW4gdGhlIGxvY2FsIHN0b3JhZ2UsCiAgICAgICAgICogYW5kIHRoZSBzZXR0ZXIgY2FsbHMgYF9zZXRQcm9wZXJ0eWAsIHdoaWNoIHVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2UKICAgICAgICAgKiBmb3IgdGhlIHByb3BlcnR5IGFuZCBlbnF1ZXVlcyBhIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBvbiBhIHByb3RvdHlwZSBvciBhbiBpbnN0YW5jZS4gIENhbGxpbmcKICAgICAgICAgKiB0aGlzIG1ldGhvZCBtYXkgb3ZlcndyaXRlIGEgcHJvcGVydHkgdmFsdWUgdGhhdCBhbHJlYWR5IGV4aXN0cyBvbgogICAgICAgICAqIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgYnkgY3JlYXRpbmcgdGhlIGFjY2Vzc29yLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gcmVhZE9ubHkgV2hlbiB0cnVlLCBubyBzZXR0ZXIgaXMgY3JlYXRlZDsgdGhlCiAgICAgICAgICogICBwcm90ZWN0ZWQgYF9zZXRQcm9wZXJ0eWAgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIHRvIHNldCB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpIHsKICAgICAgICAgIHRoaXMuX2FkZFByb3BlcnR5VG9BdHRyaWJ1dGVNYXAocHJvcGVydHkpOwogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KCdfX2RhdGFIYXNBY2Nlc3NvcicpKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhSGFzQWNjZXNzb3IgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wZXJ0eV0pIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wZXJ0eV0gPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHByb3BlcnR5LCByZWFkT25seSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIHRoZSBnaXZlbiBgcHJvcGVydHlgIHRvIGEgbWFwIG1hdGNoaW5nIGF0dHJpYnV0ZSBuYW1lcwogICAgICAgICAqIHRvIHByb3BlcnR5IG5hbWVzLCB1c2luZyBgYXR0cmlidXRlTmFtZUZvclByb3BlcnR5YC4gVGhpcyBtYXAgaXMKICAgICAgICAgKiB1c2VkIHdoZW4gZGVzZXJpYWxpemluZyBhdHRyaWJ1dGUgdmFsdWVzIHRvIHByb3BlcnRpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKi8KICAgICAgICBfYWRkUHJvcGVydHlUb0F0dHJpYnV0ZU1hcChwcm9wZXJ0eSkgewogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KCdfX2RhdGFBdHRyaWJ1dGVzJykpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFBdHRyaWJ1dGVzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fX2RhdGFBdHRyaWJ1dGVzKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFBdHRyaWJ1dGVzW3Byb3BlcnR5XSkgewogICAgICAgICAgICBjb25zdCBhdHRyID0gdGhpcy5jb25zdHJ1Y3Rvci5hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpOwogICAgICAgICAgICB0aGlzLl9fZGF0YUF0dHJpYnV0ZXNbYXR0cl0gPSBwcm9wZXJ0eTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIERlZmluZXMgYSBwcm9wZXJ0eSBhY2Nlc3NvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHJlYWRPbmx5IFdoZW4gdHJ1ZSwgbm8gc2V0dGVyIGlzIGNyZWF0ZWQKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgICBfZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpIHsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eSwgewogICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogICAgICAgICAgICAvKiogQHRoaXMge1Byb3BlcnRpZXNDaGFuZ2VkfSAqLwogICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFByb3BlcnR5KHByb3BlcnR5KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLyoqIEB0aGlzIHtQcm9wZXJ0aWVzQ2hhbmdlZH0gKi8KICAgICAgICAgICAgc2V0OiByZWFkT25seSA/IGZ1bmN0aW9uICgpIHt9IDogZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgdGhpcy5fc2V0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovCiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgIHRoaXMuX19kYXRhRW5hYmxlZCA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fX2RhdGFSZWFkeSA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fX2RhdGFJbnZhbGlkID0gZmFsc2U7CiAgICAgICAgICB0aGlzLl9fZGF0YSA9IHt9OwogICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcyA9IG51bGw7CiAgICAgICAgICB0aGlzLl9fc2VyaWFsaXppbmcgPSBmYWxzZTsKICAgICAgICAgIHRoaXMuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBMaWZlY3ljbGUgY2FsbGJhY2sgY2FsbGVkIHdoZW4gcHJvcGVydGllcyBhcmUgZW5hYmxlZCB2aWEKICAgICAgICAgKiBgX2VuYWJsZVByb3BlcnRpZXNgLgogICAgICAgICAqCiAgICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gdG8gaW1wbGVtZW50IGJlaGF2aW9yIHRoYXQgaXMKICAgICAgICAgKiBkZXBlbmRlbnQgb24gdGhlIGVsZW1lbnQgaGF2aW5nIGl0cyBwcm9wZXJ0eSBkYXRhIGluaXRpYWxpemVkLCBlLmcuCiAgICAgICAgICogZnJvbSBkZWZhdWx0cyAoaW5pdGlhbGl6ZWQgZnJvbSBgY29uc3RydWN0b3JgLCBgX2luaXRpYWxpemVQcm9wZXJ0aWVzYCksCiAgICAgICAgICogYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AsIG9yIHZhbHVlcyBwcm9wYWdhdGVkIGZyb20gaG9zdCBlLmcuIHZpYQogICAgICAgICAqIGJpbmRpbmdzLiAgYHN1cGVyLnJlYWR5KClgIG11c3QgYmUgY2FsbGVkIHRvIGVuc3VyZSB0aGUgZGF0YSBzeXN0ZW0KICAgICAgICAgKiBiZWNvbWVzIGVuYWJsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwdWJsaWMKICAgICAgICAgKi8KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgIHRoaXMuX19kYXRhUmVhZHkgPSB0cnVlOwogICAgICAgICAgdGhpcy5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJbml0aWFsaXplcyB0aGUgbG9jYWwgc3RvcmFnZSBmb3IgcHJvcGVydHkgYWNjZXNzb3JzLgogICAgICAgICAqCiAgICAgICAgICogUHJvdmlkZWQgYXMgYW4gb3ZlcnJpZGUgcG9pbnQgZm9yIHBlcmZvcm1pbmcgYW55IHNldHVwIHdvcmsgcHJpb3IKICAgICAgICAgKiB0byBpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5IGFjY2Vzc29yIHN5c3RlbS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICAgIC8vIENhcHR1cmUgaW5zdGFuY2UgcHJvcGVydGllczsgdGhlc2Ugd2lsbCBiZSBzZXQgaW50byBhY2Nlc3NvcnMKICAgICAgICAgIC8vIGR1cmluZyBmaXJzdCBmbHVzaC4gRG9uJ3Qgc2V0IHRoZW0gaGVyZSwgc2luY2Ugd2Ugd2FudAogICAgICAgICAgLy8gdGhlc2UgdG8gb3ZlcndyaXRlIGRlZmF1bHRzL2NvbnN0cnVjdG9yIGFzc2lnbm1lbnRzCiAgICAgICAgICBmb3IgKGxldCBwIGluIHRoaXMuX19kYXRhSGFzQWNjZXNzb3IpIHsKICAgICAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkocCkpIHsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgPSB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgfHwge307CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzW3BdID0gdGhpc1twXTsKICAgICAgICAgICAgICBkZWxldGUgdGhpc1twXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGVkIGF0IHJlYWR5IHRpbWUgd2l0aCBiYWcgb2YgaW5zdGFuY2UgcHJvcGVydGllcyB0aGF0IG92ZXJ3cm90ZQogICAgICAgICAqIGFjY2Vzc29ycyB3aGVuIHRoZSBlbGVtZW50IHVwZ3JhZGVkLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGVzZSBwcm9wZXJ0aWVzIGJhY2sgaW50byB0aGUKICAgICAgICAgKiBzZXR0ZXIgYXQgcmVhZHkgdGltZS4gIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGFuIG92ZXJyaWRlCiAgICAgICAgICogcG9pbnQgZm9yIGN1c3RvbWl6aW5nIG9yIHByb3ZpZGluZyBtb3JlIGVmZmljaWVudCBpbml0aWFsaXphdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgcHJvcGVydHkgdmFsdWVzIHRoYXQgd2VyZSBvdmVyd3JpdHRlbgogICAgICAgICAqICAgd2hlbiBjcmVhdGluZyBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2luaXRpYWxpemVJbnN0YW5jZVByb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgcHJvcHMpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVXBkYXRlcyB0aGUgbG9jYWwgc3RvcmFnZSBmb3IgYSBwcm9wZXJ0eSAodmlhIGBfc2V0UGVuZGluZ1Byb3BlcnR5YCkKICAgICAgICAgKiBhbmQgZW5xdWV1ZXMgYSBgX3Byb2VwcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSkgewogICAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpKSB7CiAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICAgICAgICogQHJldHVybiB7Kn0gVmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfZ2V0UHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9fZGF0YVtwcm9wZXJ0eV07CiAgICAgICAgfQoKICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqLwogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2UgZm9yIGEgcHJvcGVydHksIHJlY29yZHMgdGhlIHByZXZpb3VzIHZhbHVlLAogICAgICAgICAqIGFuZCBhZGRzIGl0IHRvIHRoZSBzZXQgb2YgInBlbmRpbmcgY2hhbmdlcyIgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUKICAgICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4gIFRoaXMgbWV0aG9kIGRvZXMgbm90IGVucXVldWUgdGhlCiAgICAgICAgICogYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGV4dCBOb3QgdXNlZCBoZXJlOyBhZmZvcmRhbmNlIGZvciBjbG9zdXJlCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VkCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9zZXRQZW5kaW5nUHJvcGVydHkocHJvcGVydHksIHZhbHVlLCBleHQpIHsKICAgICAgICAgIGxldCBvbGQgPSB0aGlzLl9fZGF0YVtwcm9wZXJ0eV07CiAgICAgICAgICBsZXQgY2hhbmdlZCA9IHRoaXMuX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHByb3BlcnR5LCB2YWx1ZSwgb2xkKTsKICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFQZW5kaW5nKSB7CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0ge307CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFbnN1cmUgb2xkIGlzIGNhcHR1cmVkIGZyb20gdGhlIGxhc3QgdHVybgogICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFPbGQgJiYgIShwcm9wZXJ0eSBpbiB0aGlzLl9fZGF0YU9sZCkpIHsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YU9sZFtwcm9wZXJ0eV0gPSBvbGQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fX2RhdGFbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ1twcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjaGFuZ2VkOwogICAgICAgIH0KICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovCgogICAgICAgIC8qKgogICAgICAgICAqIE1hcmtzIHRoZSBwcm9wZXJ0aWVzIGFzIGludmFsaWQsIGFuZCBlbnF1ZXVlcyBhbiBhc3luYwogICAgICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCkgewogICAgICAgICAgaWYgKCF0aGlzLl9fZGF0YUludmFsaWQgJiYgdGhpcy5fX2RhdGFSZWFkeSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YUludmFsaWQgPSB0cnVlOwogICAgICAgICAgICBtaWNyb3Rhc2sucnVuKCgpID0+IHsKICAgICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFJbnZhbGlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9fZGF0YUludmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsIHRvIGVuYWJsZSBwcm9wZXJ0eSBhY2Nlc3NvciBwcm9jZXNzaW5nLiBCZWZvcmUgdGhpcyBtZXRob2QgaXMKICAgICAgICAgKiBjYWxsZWQgYWNjZXNzb3IgdmFsdWVzIHdpbGwgYmUgc2V0IGJ1dCBzaWRlIGVmZmVjdHMgYXJlCiAgICAgICAgICogcXVldWVkLiBXaGVuIGNhbGxlZCwgYW55IHBlbmRpbmcgc2lkZSBlZmZlY3RzIG9jY3VyIGltbWVkaWF0ZWx5LgogICAgICAgICAqIEZvciBlbGVtZW50cywgZ2VuZXJhbGx5IGBjb25uZWN0ZWRDYWxsYmFja2AgaXMgYSBub3JtYWwgc3BvdCB0byBkbyBzby4KICAgICAgICAgKiBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBtZXRob2QgbXVsdGlwbGUgdGltZXMgYXMgaXQgb25seSB0dXJucyBvbgogICAgICAgICAqIHByb3BlcnR5IGFjY2Vzc29ycyBvbmNlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2VuYWJsZVByb3BlcnRpZXMoKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhRW5hYmxlZCkgewogICAgICAgICAgICB0aGlzLl9fZGF0YUVuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzKSB7CiAgICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZUluc3RhbmNlUHJvcGVydGllcyh0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMpOwogICAgICAgICAgICAgIHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcyA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZWFkeSgpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbHMgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrIHdpdGggdGhlIGN1cnJlbnQgc2V0IG9mCiAgICAgICAgICogcGVuZGluZyBjaGFuZ2VzIChhbmQgb2xkIHZhbHVlcyByZWNvcmRlZCB3aGVuIHBlbmRpbmcgY2hhbmdlcyB3ZXJlCiAgICAgICAgICogc2V0KSwgYW5kIHJlc2V0cyB0aGUgcGVuZGluZyBzZXQgb2YgY2hhbmdlcy4gR2VuZXJhbGx5LCB0aGlzIG1ldGhvZAogICAgICAgICAqIHNob3VsZCBub3QgYmUgY2FsbGVkIGluIHVzZXIgY29kZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9mbHVzaFByb3BlcnRpZXMoKSB7CiAgICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMuX19kYXRhOwogICAgICAgICAgY29uc3QgY2hhbmdlZFByb3BzID0gdGhpcy5fX2RhdGFQZW5kaW5nOwogICAgICAgICAgY29uc3Qgb2xkID0gdGhpcy5fX2RhdGFPbGQ7CiAgICAgICAgICBpZiAodGhpcy5fc2hvdWxkUHJvcGVydGllc0NoYW5nZShwcm9wcywgY2hhbmdlZFByb3BzLCBvbGQpKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllc0NoYW5nZWQocHJvcHMsIGNoYW5nZWRQcm9wcywgb2xkKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCBpbiBgX2ZsdXNoUHJvcGVydGllc2AgdG8gZGV0ZXJtaW5lIGlmIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAgICogc2hvdWxkIGJlIGNhbGxlZC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGlmCiAgICAgICAgICogcHJvcGVydGllcyBhcmUgcGVuZGluZy4gT3ZlcnJpZGUgdG8gY3VzdG9taXplIHdoZW4KICAgICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBpcyBjYWxsZWQuCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBjdXJyZW50UHJvcHMgQmFnIG9mIGFsbCBjdXJyZW50IGFjY2Vzc29yIHZhbHVlcwogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBwcm9wZXJ0aWVzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QKICAgICAgICAgKiAgIGNhbGwgdG8gYF9wcm9wZXJ0aWVzQ2hhbmdlZGAKICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGVhY2ggcHJvcGVydHkKICAgICAgICAgKiAgIGluIGBjaGFuZ2VkUHJvcHNgCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBjaGFuZ2VkUHJvcHMgaXMgdHJ1dGh5CiAgICAgICAgICovCiAgICAgICAgX3Nob3VsZFByb3BlcnRpZXNDaGFuZ2UoY3VycmVudFByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgICAgIHJldHVybiBCb29sZWFuKGNoYW5nZWRQcm9wcyk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBjYWxsZWQgd2hlbiBhbnkgcHJvcGVydGllcyB3aXRoIGFjY2Vzc29ycyBjcmVhdGVkIHZpYQogICAgICAgICAqIGBfY3JlYXRlUHJvcGVydHlBY2Nlc3NvcmAgaGF2ZSBiZWVuIHNldC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY3VycmVudFByb3BzIEJhZyBvZiBhbGwgY3VycmVudCBhY2Nlc3NvciB2YWx1ZXMKICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgcHJvcGVydGllcyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0CiAgICAgICAgICogICBjYWxsIHRvIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBlYWNoIHByb3BlcnR5CiAgICAgICAgICogICBpbiBgY2hhbmdlZFByb3BzYAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9wcm9wZXJ0aWVzQ2hhbmdlZChjdXJyZW50UHJvcHMsIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogTWV0aG9kIGNhbGxlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIHByb3BlcnR5IHZhbHVlIHNob3VsZCBiZQogICAgICAgICAqIGNvbnNpZGVyZWQgYXMgYSBjaGFuZ2UgYW5kIGNhdXNlIHRoZSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjawogICAgICAgICAqIHRvIGJlIGVucXVldWVkLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBgdHJ1ZWAgaWYgYSBzdHJpY3QgZXF1YWxpdHkKICAgICAgICAgKiBjaGVjayBmYWlscy4gVGhlIG1ldGhvZCBhbHdheXMgcmV0dXJucyBmYWxzZSBmb3IgYE5hTmAuCiAgICAgICAgICoKICAgICAgICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBlLmcuIHByb3ZpZGUgc3RyaWN0ZXIgY2hlY2tpbmcgZm9yCiAgICAgICAgICogT2JqZWN0cy9BcnJheXMgd2hlbiB1c2luZyBpbW11dGFibGUgcGF0dGVybnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgTmV3IHByb3BlcnR5IHZhbHVlCiAgICAgICAgICogQHBhcmFtIHsqfSBvbGQgUHJldmlvdXMgcHJvcGVydHkgdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICAgICAqICAgYW5kIGVucXVldWUgYSBgX3Byb2VwcnRpZXNDaGFuZ2VkYCBjYWxsYmFjawogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIC8vIFN0cmljdCBlcXVhbGl0eSBjaGVjawogICAgICAgICAgICAob2xkICE9PSB2YWx1ZSAmJgogICAgICAgICAgICAgIC8vIFRoaXMgZW5zdXJlcyAob2xkPT1OYU4sIHZhbHVlPT1OYU4pIGFsd2F5cyByZXR1cm5zIGZhbHNlCiAgICAgICAgICAgICAgKG9sZCA9PT0gb2xkIHx8IHZhbHVlID09PSB2YWx1ZSkpCiAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50cyBuYXRpdmUgQ3VzdG9tIEVsZW1lbnRzIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvCiAgICAgICAgICogc2V0IGFuIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIHByb3BlcnR5IHZpYSBgX2F0dHJpYnV0ZVRvUHJvcGVydHlgLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUgdGhhdCBjaGFuZ2VkCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgT2xkIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgTmV3IGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZXNwYWNlIEF0dHJpYnV0ZSBuYW1lc3BhY2UuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBTdXBlciBtYXkgb3IgbWF5IG5vdCBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUsIG5hbWVzcGFjZSkgewogICAgICAgICAgaWYgKG9sZCAhPT0gdmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fYXR0cmlidXRlVG9Qcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKSB7CiAgICAgICAgICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRGVzZXJpYWxpemVzIGFuIGF0dHJpYnV0ZSB0byBpdHMgYXNzb2NpYXRlZCBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGNhbGxzIHRoZSBgX2Rlc2VyaWFsaXplVmFsdWVgIG1ldGhvZCB0byBjb252ZXJ0IHRoZSBzdHJpbmcgdG8KICAgICAgICAgKiBhIHR5cGVkIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBOYW1lIG9mIGF0dHJpYnV0ZSB0byBkZXNlcmlhbGl6ZS4KICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAgICogQHBhcmFtIHsqPX0gdHlwZSB0eXBlIHRvIGRlc2VyaWFsaXplIHRvLCBkZWZhdWx0cyB0byB0aGUgdmFsdWUKICAgICAgICAgKiByZXR1cm5lZCBmcm9tIGB0eXBlRm9yUHJvcGVydHlgCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfYXR0cmlidXRlVG9Qcm9wZXJ0eShhdHRyaWJ1dGUsIHZhbHVlLCB0eXBlKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19zZXJpYWxpemluZykgewogICAgICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9fZGF0YUF0dHJpYnV0ZXM7CiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gbWFwICYmIG1hcFthdHRyaWJ1dGVdIHx8IGF0dHJpYnV0ZTsKICAgICAgICAgICAgdGhpc1twcm9wZXJ0eV0gPSB0aGlzLl9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlIHx8CiAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci50eXBlRm9yUHJvcGVydHkocHJvcGVydHkpKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFNlcmlhbGl6ZXMgYSBwcm9wZXJ0eSB0byBpdHMgYXNzb2NpYXRlZCBhdHRyaWJ1dGUuCiAgICAgICAgICoKICAgICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30gQ2xvc3VyZSBjYW4ndCBmaWd1cmUgb3V0IGB0aGlzYCBpcyBhbiBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUgdG8gcmVmbGVjdC4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZz19IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byByZWZsZWN0IHRvLgogICAgICAgICAqIEBwYXJhbSB7Kj19IHZhbHVlIFByb3BlcnR5IHZhbHVlIHRvIHJlZmVjdC4KICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBhdHRyaWJ1dGUsIHZhbHVlKSB7CiAgICAgICAgICB0aGlzLl9fc2VyaWFsaXppbmcgPSB0cnVlOwogICAgICAgICAgdmFsdWUgPSAoYXJndW1lbnRzLmxlbmd0aCA8IDMpID8gdGhpc1twcm9wZXJ0eV0gOiB2YWx1ZTsKICAgICAgICAgIHRoaXMuX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0aGlzKSwgdmFsdWUsCiAgICAgICAgICAgIGF0dHJpYnV0ZSB8fCB0aGlzLmNvbnN0cnVjdG9yLmF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShwcm9wZXJ0eSkpOwogICAgICAgICAgdGhpcy5fX3NlcmlhbGl6aW5nID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIGEgdHlwZWQgdmFsdWUgdG8gYW4gSFRNTCBhdHRyaWJ1dGUgb24gYSBub2RlLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgY2FsbHMgdGhlIGBfc2VyaWFsaXplVmFsdWVgIG1ldGhvZCB0byBjb252ZXJ0IHRoZSB0eXBlZAogICAgICAgICAqIHZhbHVlIHRvIGEgc3RyaW5nLiAgSWYgdGhlIGBfc2VyaWFsaXplVmFsdWVgIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgLAogICAgICAgICAqIHRoZSBhdHRyaWJ1dGUgd2lsbCBiZSByZW1vdmVkICh0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciBib29sZWFuCiAgICAgICAgICogdHlwZSBgZmFsc2VgKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIHNldCBhdHRyaWJ1dGUgdG8uCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXJpYWxpemUuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byBzZXJpYWxpemUgdG8uCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfdmFsdWVUb05vZGVBdHRyaWJ1dGUobm9kZSwgdmFsdWUsIGF0dHJpYnV0ZSkgewogICAgICAgICAgY29uc3Qgc3RyID0gdGhpcy5fc2VyaWFsaXplVmFsdWUodmFsdWUpOwogICAgICAgICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHN0cik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBhIHR5cGVkIEphdmFTY3JpcHQgdmFsdWUgdG8gYSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBzZXR0aW5nIEpTIHByb3BlcnR5IHZhbHVlcyB0bwogICAgICAgICAqIEhUTUwgYXR0cmlidXRlcy4gIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlCiAgICAgICAgICogc2VyaWFsaXphdGlvbiBmb3IgY3VzdG9tIHR5cGVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSB0byBzZXJpYWxpemUuCiAgICAgICAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTdHJpbmcgc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZAogICAgICAgICAqIHByb3BlcnR5ICB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBfc2VyaWFsaXplVmFsdWUodmFsdWUpIHsKICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7CiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA/ICcnIDogdW5kZWZpbmVkOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6IHVuZGVmaW5lZDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHJlYWRpbmcgSFRNTCBhdHRyaWJ1dGUgdmFsdWVzIHRvCiAgICAgICAgICogSlMgcHJvcGVydGllcy4gIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlCiAgICAgICAgICogZGVzZXJpYWxpemF0aW9uIGZvciBjdXN0b20gYHR5cGVgcy4gVHlwZXMgZm9yIGBCb29sZWFuYCwgYFN0cmluZ2AsCiAgICAgICAgICogYW5kIGBOdW1iZXJgIGNvbnZlcnQgYXR0cmlidXRlcyB0byB0aGUgZXhwZWN0ZWQgdHlwZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIFZhbHVlIHRvIGRlc2VyaWFsaXplLgogICAgICAgICAqIEBwYXJhbSB7Kj19IHR5cGUgVHlwZSB0byBkZXNlcmlhbGl6ZSB0aGUgc3RyaW5nIHRvLgogICAgICAgICAqIEByZXR1cm4geyp9IFR5cGVkIHZhbHVlIGRlc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZCBzdHJpbmcuCiAgICAgICAgICovCiAgICAgICAgX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpIHsKICAgICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAgICBjYXNlIEJvb2xlYW46CiAgICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSAhPT0gbnVsbCk7CiAgICAgICAgICAgIGNhc2UgTnVtYmVyOgogICAgICAgICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICB9CgogICAgICByZXR1cm4gUHJvcGVydGllc0NoYW5nZWQ7CiAgICB9KTsKCgogIH0pKCk7CgoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgY2FzZU1hcCA9IFBvbHltZXIuQ2FzZU1hcDsKCiAgLy8gU2F2ZSBtYXAgb2YgbmF0aXZlIHByb3BlcnRpZXM7IHRoaXMgZm9ybXMgYSBibGFja2xpc3Qgb3IgcHJvcGVydGllcwogIC8vIHRoYXQgd29uJ3QgaGF2ZSB0aGVpciB2YWx1ZXMgInNhdmVkIiBieSBgc2F2ZUFjY2Vzc29yVmFsdWVgLCBzaW5jZQogIC8vIHJlYWRpbmcgZnJvbSBhbiBIVE1MRWxlbWVudCBhY2Nlc3NvciBmcm9tIHRoZSBjb250ZXh0IG9mIGEgcHJvdG90eXBlIHRocm93cwogIGNvbnN0IG5hdGl2ZVByb3BlcnRpZXMgPSB7fTsKICBsZXQgcHJvdG8gPSBIVE1MRWxlbWVudC5wcm90b3R5cGU7CiAgd2hpbGUgKHByb3RvKSB7CiAgICBsZXQgcHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90byk7CiAgICBmb3IgKGxldCBpPTA7IGk8cHJvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgbmF0aXZlUHJvcGVydGllc1twcm9wc1tpXV0gPSB0cnVlOwogICAgfQogICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogIH0KCiAgLyoqCiAgICogVXNlZCB0byBzYXZlIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBvdmVycmlkZGVuIHdpdGgKICAgKiBhbiBhY2Nlc3Nvci4gSWYgdGhlIGBtb2RlbGAgaXMgYSBwcm90b3R5cGUsIHRoZSB2YWx1ZXMgd2lsbCBiZSBzYXZlZAogICAqIGluIGBfX2RhdGFQcm90b2AsIGFuZCBpdCdzIHVwIHRvIHRoZSB1c2VyIChvciBkb3duc3RyZWFtIG1peGluKSB0bwogICAqIGRlY2lkZSBob3cvd2hlbiB0byBzZXQgdGhlc2UgdmFsdWVzIGJhY2sgaW50byB0aGUgYWNjZXNzb3JzLgogICAqIElmIGBtb2RlbGAgaXMgYWxyZWFkeSBhbiBpbnN0YW5jZSAoaXQgaGFzIGEgYF9fZGF0YWAgcHJvcGVydHkpLCB0aGVuCiAgICogdGhlIHZhbHVlIHdpbGwgYmUgc2V0IGFzIGEgcGVuZGluZyBwcm9wZXJ0eSwgbWVhbmluZyB0aGUgdXNlciBzaG91bGQKICAgKiBjYWxsIGBfaW52YWxpZGF0ZVByb3BlcnRpZXNgIG9yIGBfZmx1c2hQcm9wZXJ0aWVzYCB0byB0YWtlIGVmZmVjdAogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IG1vZGVsIFByb3RvdHlwZSBvciBpbnN0YW5jZQogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNhdmVBY2Nlc3NvclZhbHVlKG1vZGVsLCBwcm9wZXJ0eSkgewogICAgLy8gRG9uJ3QgcmVhZC9zdG9yZSB2YWx1ZSBmb3IgYW55IG5hdGl2ZSBwcm9wZXJ0aWVzIHNpbmNlIHRoZXkgY291bGQgdGhyb3cKICAgIGlmICghbmF0aXZlUHJvcGVydGllc1twcm9wZXJ0eV0pIHsKICAgICAgbGV0IHZhbHVlID0gbW9kZWxbcHJvcGVydHldOwogICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIGlmIChtb2RlbC5fX2RhdGEpIHsKICAgICAgICAgIC8vIEFkZGluZyBhY2Nlc3NvciB0byBpbnN0YW5jZTsgdXBkYXRlIHRoZSBwcm9wZXJ0eQogICAgICAgICAgLy8gSXQgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBjYWxsIF9mbHVzaFByb3BlcnRpZXMKICAgICAgICAgIG1vZGVsLl9zZXRQZW5kaW5nUHJvcGVydHkocHJvcGVydHksIHZhbHVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gQWRkaW5nIGFjY2Vzc29yIHRvIHByb3RvOyBzYXZlIHByb3RvJ3MgdmFsdWUgZm9yIGluc3RhbmNlLXRpbWUgdXNlCiAgICAgICAgICBpZiAoIW1vZGVsLl9fZGF0YVByb3RvKSB7CiAgICAgICAgICAgIG1vZGVsLl9fZGF0YVByb3RvID0ge307CiAgICAgICAgICB9IGVsc2UgaWYgKCFtb2RlbC5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX2RhdGFQcm90bycsIG1vZGVsKSkpIHsKICAgICAgICAgICAgbW9kZWwuX19kYXRhUHJvdG8gPSBPYmplY3QuY3JlYXRlKG1vZGVsLl9fZGF0YVByb3RvKTsKICAgICAgICAgIH0KICAgICAgICAgIG1vZGVsLl9fZGF0YVByb3RvW3Byb3BlcnR5XSA9IHZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIGJhc2ljIG1ldGEtcHJvZ3JhbW1pbmcgZm9yIGNyZWF0aW5nIG9uZQogICAqIG9yIG1vcmUgcHJvcGVydHkgYWNjZXNzb3JzIChnZXR0ZXIvc2V0dGVyIHBhaXIpIHRoYXQgZW5xdWV1ZSBhbiBhc3luYwogICAqIChiYXRjaGVkKSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgKgogICAqIEZvciBiYXNpYyB1c2FnZSBvZiB0aGlzIG1peGluOgogICAqIAogICAqIC0gICBEZWNsYXJlIGF0dHJpYnV0ZXMgdG8gb2JzZXJ2ZSB2aWEgdGhlIHN0YW5kYXJkIGBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpYC4gVXNlCiAgICogICAgIGBkYXNoLWNhc2VgIGF0dHJpYnV0ZSBuYW1lcyB0byByZXByZXNlbnQgYGNhbWVsQ2FzZWAgcHJvcGVydHkgbmFtZXMuIAogICAqIC0gICBJbXBsZW1lbnQgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrIG9uIHRoZSBjbGFzcy4KICAgKiAtICAgQ2FsbCBgTXlDbGFzcy5jcmVhdGVQcm9wZXJ0aWVzRm9yQXR0cmlidXRlcygpYCAqKm9uY2UqKiBvbiB0aGUgY2xhc3MgdG8gZ2VuZXJhdGUgCiAgICogICAgIHByb3BlcnR5IGFjY2Vzc29ycyBmb3IgZWFjaCBvYnNlcnZlZCBhdHRyaWJ1dGUuIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCAKICAgKiAgICAgaW5zdGFuY2UgaXMgY3JlYXRlZCwgZm9yIGV4YW1wbGUsIGJ5IGNhbGxpbmcgaXQgYmVmb3JlIGNhbGxpbmcgYGN1c3RvbUVsZW1lbnRzLmRlZmluZWAuCiAgICogICAgIEl0IGNhbiBhbHNvIGJlIGNhbGxlZCBsYXppbHkgZnJvbSB0aGUgZWxlbWVudCdzIGBjb25zdHJ1Y3RvcmAsIGFzIGxvbmcgYXMgaXQncyBndWFyZGVkIHNvCiAgICogICAgIHRoYXQgdGhlIGNhbGwgaXMgb25seSBtYWRlIG9uY2UsIHdoZW4gdGhlIGZpcnN0IGluc3RhbmNlIGlzIGNyZWF0ZWQuCiAgICogLSAgIENhbGwgYHRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKWAgaW4gdGhlIGVsZW1lbnQncyBgY29ubmVjdGVkQ2FsbGJhY2tgIHRvIGVuYWJsZSAKICAgKiAgICAgdGhlIGFjY2Vzc29ycy4KICAgKgogICAqIEFueSBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUKICAgKiBkZXNlcmlhbGl6ZWQgdmlhIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIGFuZCBzZXQgdG8gdGhlIGFzc29jaWF0ZWQKICAgKiBwcm9wZXJ0eSB1c2luZyBgZGFzaC1jYXNlYC10by1gY2FtZWxDYXNlYCBjb252ZW50aW9uLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0aWVzQ2hhbmdlZAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiBmb3IgcmVhY3RpbmcgdG8gcHJvcGVydHkgY2hhbmdlcyBmcm9tCiAgICogICBnZW5lcmF0ZWQgcHJvcGVydHkgYWNjZXNzb3JzLgogICAqLwogIFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtzdXBlckNsYXNzfQogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydGllc0NoYW5nZWR9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICAgY29uc3QgYmFzZSA9IFBvbHltZXIuUHJvcGVydGllc0NoYW5nZWQoc3VwZXJDbGFzcyk7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5QWNjZXNzb3JzfQogICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIFByb3BlcnR5QWNjZXNzb3JzIGV4dGVuZHMgYmFzZSB7CgogICAgICAvKioKICAgICAgICogR2VuZXJhdGVzIHByb3BlcnR5IGFjY2Vzc29ycyBmb3IgYWxsIGF0dHJpYnV0ZXMgaW4gdGhlIHN0YW5kYXJkCiAgICAgICAqIHN0YXRpYyBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBhcnJheS4KICAgICAgICoKICAgICAgICogQXR0cmlidXRlIG5hbWVzIGFyZSBtYXBwZWQgdG8gcHJvcGVydHkgbmFtZXMgdXNpbmcgdGhlIGBkYXNoLWNhc2VgIHRvCiAgICAgICAqIGBjYW1lbENhc2VgIGNvbnZlbnRpb24KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzRm9yQXR0cmlidXRlcygpIHsKICAgICAgICBsZXQgYSQgPSB0aGlzLm9ic2VydmVkQXR0cmlidXRlczsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBhJC5sZW5ndGg7IGkrKykgewogICAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZVByb3BlcnR5QWNjZXNzb3IoY2FzZU1hcC5kYXNoVG9DYW1lbENhc2UoYSRbaV0pKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGFuIGF0dHJpYnV0ZSBuYW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKiBCeSBkZWZhdWx0LCBjb252ZXJ0cyBjYW1lbCB0byBkYXNoIGNhc2UsIGUuZy4gYGZvb0JhcmAgdG8gYGZvby1iYXJgLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgdG8gY29udmVydAogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEF0dHJpYnV0ZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIGNhc2VNYXAuY2FtZWxUb0Rhc2hDYXNlKHByb3BlcnR5KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBQcm9wZXJ0aWVzQ2hhbmdlZCBpbXBsZW1lbnRhdGlvbiB0byBpbml0aWFsaXplIHZhbHVlcyBmb3IKICAgICAgICogYWNjZXNzb3JzIGNyZWF0ZWQgZm9yIHZhbHVlcyB0aGF0IGFscmVhZHkgZXhpc3RlZCBvbiB0aGUgZWxlbWVudAogICAgICAgKiBwcm90b3R5cGUuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICBpZiAodGhpcy5fX2RhdGFQcm90bykgewogICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVByb3RvUHJvcGVydGllcyh0aGlzLl9fZGF0YVByb3RvKTsKICAgICAgICAgIHRoaXMuX19kYXRhUHJvdG8gPSBudWxsOwogICAgICAgIH0KICAgICAgICBzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCBhdCBpbnN0YW5jZSB0aW1lIHdpdGggYmFnIG9mIHByb3BlcnRpZXMgdGhhdCB3ZXJlIG92ZXJ3cml0dGVuCiAgICAgICAqIGJ5IGFjY2Vzc29ycyBvbiB0aGUgcHJvdG90eXBlIHdoZW4gYWNjZXNzb3JzIHdlcmUgY3JlYXRlZC4KICAgICAgICoKICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGVzZSBwcm9wZXJ0aWVzIGJhY2sgaW50byB0aGUKICAgICAgICogc2V0dGVyIGF0IGluc3RhbmNlIHRpbWUuICBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBhbiBvdmVycmlkZQogICAgICAgKiBwb2ludCBmb3IgY3VzdG9taXppbmcgb3IgcHJvdmlkaW5nIG1vcmUgZWZmaWNpZW50IGluaXRpYWxpemF0aW9uLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIHByb3BlcnR5IHZhbHVlcyB0aGF0IHdlcmUgb3ZlcndyaXR0ZW4KICAgICAgICogICB3aGVuIGNyZWF0aW5nIHByb3BlcnR5IGFjY2Vzc29ycy4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm90b1Byb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICBmb3IgKGxldCBwIGluIHByb3BzKSB7CiAgICAgICAgICB0aGlzLl9zZXRQcm9wZXJ0eShwLCBwcm9wc1twXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRW5zdXJlcyB0aGUgZWxlbWVudCBoYXMgdGhlIGdpdmVuIGF0dHJpYnV0ZS4gSWYgaXQgZG9lcyBub3QsCiAgICAgICAqIGFzc2lnbnMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAqCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBDbG9zdXJlIGNhbid0IGZpZ3VyZSBvdXQgYHRoaXNgIGlzIGluZmFjdCBhbiBlbGVtZW50CiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgTmFtZSBvZiBhdHRyaWJ1dGUgdG8gZW5zdXJlIGlzIHNldC4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfZW5zdXJlQXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpIHsKICAgICAgICBjb25zdCBlbCA9IC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0aGlzKTsKICAgICAgICBpZiAoIWVsLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpKSB7CiAgICAgICAgICB0aGlzLl92YWx1ZVRvTm9kZUF0dHJpYnV0ZShlbCwgdmFsdWUsIGF0dHJpYnV0ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIFByb3BlcnRpZXNDaGFuZ2VkIGltcGxlbWVudGlvbiB0byBzZXJpYWxpemUgb2JqZWN0cyBhcyBKU09OLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFByb3BlcnR5IHZhbHVlIHRvIHNlcmlhbGl6ZS4KICAgICAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTdHJpbmcgc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZCBwcm9wZXJ0eSB2YWx1ZS4KICAgICAgICovCiAgICAgIF9zZXJpYWxpemVWYWx1ZSh2YWx1ZSkgewogICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWZhbGx0aHJvdWdoICovCiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHsKICAgICAgICAgIGNhc2UgJ29iamVjdCc6CiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHsKICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpOwogICAgICAgICAgICAgIH0gY2F0Y2goeCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBzdXBlci5fc2VyaWFsaXplVmFsdWUodmFsdWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFBvbHltZXIgd2hlbiByZWFkaW5nIEhUTUwgYXR0cmlidXRlIHZhbHVlcyB0bwogICAgICAgKiBKUyBwcm9wZXJ0aWVzLiAgVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9uIFBvbHltZXIgZWxlbWVudAogICAgICAgKiBwcm90b3R5cGVzIHRvIHByb3ZpZGUgZGVzZXJpYWxpemF0aW9uIGZvciBjdXN0b20gYHR5cGVgcy4gIE5vdGUsCiAgICAgICAqIHRoZSBgdHlwZWAgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBgdHlwZWAgZmllbGQgcHJvdmlkZWQgaW4gdGhlCiAgICAgICAqIGBwcm9wZXJ0aWVzYCBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgYSBnaXZlbiBwcm9wZXJ0eSwgYW5kIGlzCiAgICAgICAqIGJ5IGNvbnZlbnRpb24gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdHlwZSB0byBkZXNlcmlhbGl6ZS4KICAgICAgICoKICAgICAgICoKICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUgdG8gZGVzZXJpYWxpemUuCiAgICAgICAqIEBwYXJhbSB7Kj19IHR5cGUgVHlwZSB0byBkZXNlcmlhbGl6ZSB0aGUgc3RyaW5nIHRvLgogICAgICAgKiBAcmV0dXJuIHsqfSBUeXBlZCB2YWx1ZSBkZXNlcmlhbGl6ZWQgZnJvbSB0aGUgcHJvdmlkZWQgc3RyaW5nLgogICAgICAgKi8KICAgICAgX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpIHsKICAgICAgICAvKioKICAgICAgICAgKiBAdHlwZSB7Kn0KICAgICAgICAgKi8KICAgICAgICBsZXQgb3V0VmFsdWU7CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICBjYXNlIE9iamVjdDoKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBvdXRWYWx1ZSA9IEpTT04ucGFyc2UoLyoqIEB0eXBlIHtzdHJpbmd9ICovKHZhbHVlKSk7CiAgICAgICAgICAgIH0gY2F0Y2goeCkgewogICAgICAgICAgICAgIC8vIGFsbG93IG5vbi1KU09OIGxpdGVyYWxzIGxpa2UgU3RyaW5ncyBhbmQgTnVtYmVycwogICAgICAgICAgICAgIG91dFZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIEFycmF5OgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIG91dFZhbHVlID0gSlNPTi5wYXJzZSgvKiogQHR5cGUge3N0cmluZ30gKi8odmFsdWUpKTsKICAgICAgICAgICAgfSBjYXRjaCh4KSB7CiAgICAgICAgICAgICAgb3V0VmFsdWUgPSBudWxsOwogICAgICAgICAgICAgIGNvbnNvbGUud2FybihgUG9seW1lcjo6QXR0cmlidXRlczogY291bGRuJ3QgZGVjb2RlIEFycmF5IGFzIEpTT046ICR7dmFsdWV9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIERhdGU6CiAgICAgICAgICAgIG91dFZhbHVlID0gaXNOYU4odmFsdWUpID8gU3RyaW5nKHZhbHVlKSA6IE51bWJlcih2YWx1ZSk7CiAgICAgICAgICAgIG91dFZhbHVlID0gbmV3IERhdGUob3V0VmFsdWUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIG91dFZhbHVlID0gc3VwZXIuX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dFZhbHVlOwogICAgICB9CiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tZmFsbHRocm91Z2ggKi8KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgUHJvcGVydGllc0NoYW5nZWQgaW1wbGVtZW50YXRpb24gdG8gc2F2ZSBleGlzdGluZyBwcm90b3R5cGUKICAgICAgICogcHJvcGVydHkgdmFsdWUgc28gdGhhdCBpdCBjYW4gYmUgcmVzZXQuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSByZWFkT25seSBXaGVuIHRydWUsIG5vIHNldHRlciBpcyBjcmVhdGVkCiAgICAgICAqCiAgICAgICAqIFdoZW4gY2FsbGluZyBvbiBhIHByb3RvdHlwZSwgYW55IG92ZXJ3cml0dGVuIHZhbHVlcyBhcmUgc2F2ZWQgaW4KICAgICAgICogYF9fZGF0YVByb3RvYCwgYW5kIGl0IGlzIHVwIHRvIHRoZSBzdWJjbGFzc2VyIHRvIGRlY2lkZSBob3cvd2hlbgogICAgICAgKiB0byBzZXQgdGhvc2UgcHJvcGVydGllcyBiYWNrIGludG8gdGhlIGFjY2Vzc29yLiAgV2hlbiBjYWxsaW5nIG9uIGFuCiAgICAgICAqIGluc3RhbmNlLCB0aGUgb3ZlcndyaXR0ZW4gdmFsdWUgaXMgc2V0IHZpYSBgX3NldFBlbmRpbmdQcm9wZXJ0eWAsCiAgICAgICAqIGFuZCB0aGUgdXNlciBzaG91bGQgY2FsbCBgX2ludmFsaWRhdGVQcm9wZXJ0aWVzYCBvciBgX2ZsdXNoUHJvcGVydGllc2AKICAgICAgICogZm9yIHRoZSB2YWx1ZXMgdG8gdGFrZSBlZmZlY3QuCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHByb3BlcnR5LCByZWFkT25seSkgewogICAgICAgIHNhdmVBY2Nlc3NvclZhbHVlKHRoaXMsIHByb3BlcnR5KTsKICAgICAgICBzdXBlci5fZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbGlicmFyeSBjcmVhdGVkIGFuIGFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYW4gYWNjZXNzb3Igd2FzIGNyZWF0ZWQKICAgICAgICovCiAgICAgIF9oYXNBY2Nlc3Nvcihwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yICYmIHRoaXMuX19kYXRhSGFzQWNjZXNzb3JbcHJvcGVydHldOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaGFzIGEgcGVuZGluZyBjaGFuZ2UuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBwcm9wZXJ0eSBoYXMgYSBwZW5kaW5nIGNoYW5nZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfaXNQcm9wZXJ0eVBlbmRpbmcocHJvcCkgewogICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuX19kYXRhUGVuZGluZyAmJiAocHJvcCBpbiB0aGlzLl9fZGF0YVBlbmRpbmcpKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gUHJvcGVydHlBY2Nlc3NvcnM7CgogIH0pOwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCwgTm9kZUZpbHRlci5TSE9XX0FMTCwKICAgICAgbnVsbCwgZmFsc2UpOwoKICAvLyAxLnggYmFja3dhcmRzLWNvbXBhdGlibGUgYXV0by13cmFwcGVyIGZvciB0ZW1wbGF0ZSB0eXBlIGV4dGVuc2lvbnMKICAvLyBUaGlzIGlzIGEgY2xlYXIgbGF5ZXJpbmcgdmlvbGF0aW9uIGFuZCBnaXZlcyBmYXZvcmVkLW5hdGlvbiBzdGF0dXMgdG8KICAvLyBkb20taWYgYW5kIGRvbS1yZXBlYXQgdGVtcGxhdGVzLiAgVGhpcyBpcyBhIGNvbmNlaXQgd2UncmUgY2hvb3NpbmcgdG8ga2VlcAogIC8vIGEuKSB0byBlYXNlIDEueCBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBkdWUgdG8gbG9zcyBvZiBgaXNgLCBhbmQKICAvLyBiLikgdG8gbWFpbnRhaW4gaWYvcmVwZWF0IGNhcGFiaWxpdHkgaW4gcGFyc2VyLWNvbnN0cmFpbmVkIGVsZW1lbnRzCiAgLy8gICAgIChlLmcuIHRhYmxlLCBzZWxlY3QpIGluIGxpZXUgb2YgbmF0aXZlIENFIHR5cGUgZXh0ZW5zaW9ucyB3aXRob3V0CiAgLy8gICAgIG1hc3NpdmUgbmV3IGludmVudGlvbiBpbiB0aGlzIHNwYWNlIChlLmcuIGRpcmVjdGl2ZSBzeXN0ZW0pCiAgY29uc3QgdGVtcGxhdGVFeHRlbnNpb25zID0gewogICAgJ2RvbS1pZic6IHRydWUsCiAgICAnZG9tLXJlcGVhdCc6IHRydWUKICB9OwogIGZ1bmN0aW9uIHdyYXBUZW1wbGF0ZUV4dGVuc2lvbihub2RlKSB7CiAgICBsZXQgaXMgPSBub2RlLmdldEF0dHJpYnV0ZSgnaXMnKTsKICAgIGlmIChpcyAmJiB0ZW1wbGF0ZUV4dGVuc2lvbnNbaXNdKSB7CiAgICAgIGxldCB0ID0gbm9kZTsKICAgICAgdC5yZW1vdmVBdHRyaWJ1dGUoJ2lzJyk7CiAgICAgIG5vZGUgPSB0Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChpcyk7CiAgICAgIHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobm9kZSwgdCk7CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodCk7CiAgICAgIHdoaWxlKHQuYXR0cmlidXRlcy5sZW5ndGgpIHsKICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSh0LmF0dHJpYnV0ZXNbMF0ubmFtZSwgdC5hdHRyaWJ1dGVzWzBdLnZhbHVlKTsKICAgICAgICB0LnJlbW92ZUF0dHJpYnV0ZSh0LmF0dHJpYnV0ZXNbMF0ubmFtZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gZmluZFRlbXBsYXRlTm9kZShyb290LCBub2RlSW5mbykgewogICAgLy8gcmVjdXJzaXZlbHkgYXNjZW5kIHRyZWUgdW50aWwgd2UgaGl0IHJvb3QKICAgIGxldCBwYXJlbnQgPSBub2RlSW5mby5wYXJlbnRJbmZvICYmIGZpbmRUZW1wbGF0ZU5vZGUocm9vdCwgbm9kZUluZm8ucGFyZW50SW5mbyk7CiAgICAvLyB1bndpbmQgdGhlIHN0YWNrLCByZXR1cm5pbmcgdGhlIGluZGV4ZWQgbm9kZSBhdCBlYWNoIGxldmVsCiAgICBpZiAocGFyZW50KSB7CiAgICAgIC8vIG5vdGU6IG1hcmdpbmFsbHkgZmFzdGVyIHRoYW4gaW5kZXhpbmcgdmlhIGNoaWxkTm9kZXMKICAgICAgLy8gKGh0dHA6Ly9qc3BlcmYuY29tL2NoaWxkbm9kZXMtbG9va3VwKQogICAgICB3YWxrZXIuY3VycmVudE5vZGUgPSBwYXJlbnQ7CiAgICAgIGZvciAobGV0IG49d2Fsa2VyLmZpcnN0Q2hpbGQoKSwgaT0wOyBuOyBuPXdhbGtlci5uZXh0U2libGluZygpKSB7CiAgICAgICAgaWYgKG5vZGVJbmZvLnBhcmVudEluZGV4ID09PSBpKyspIHsKICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgfQoKICAvLyBjb25zdHJ1Y3QgYCRgIG1hcCAoZnJvbSBpZCBhbm5vdGF0aW9ucykKICBmdW5jdGlvbiBhcHBseUlkVG9NYXAoaW5zdCwgbWFwLCBub2RlLCBub2RlSW5mbykgewogICAgaWYgKG5vZGVJbmZvLmlkKSB7CiAgICAgIG1hcFtub2RlSW5mby5pZF0gPSBub2RlOwogICAgfQogIH0KCiAgLy8gaW5zdGFsbCBldmVudCBsaXN0ZW5lcnMgKGZyb20gZXZlbnQgYW5ub3RhdGlvbnMpCiAgZnVuY3Rpb24gYXBwbHlFdmVudExpc3RlbmVyKGluc3QsIG5vZGUsIG5vZGVJbmZvKSB7CiAgICBpZiAobm9kZUluZm8uZXZlbnRzICYmIG5vZGVJbmZvLmV2ZW50cy5sZW5ndGgpIHsKICAgICAgZm9yIChsZXQgaj0wLCBlJD1ub2RlSW5mby5ldmVudHMsIGU7IChqPGUkLmxlbmd0aCkgJiYgKGU9ZSRbal0pOyBqKyspIHsKICAgICAgICBpbnN0Ll9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGUubmFtZSwgZS52YWx1ZSwgaW5zdCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIHB1c2ggY29uZmlndXJhdGlvbiByZWZlcmVuY2VzIGF0IGNvbmZpZ3VyZSB0aW1lCiAgZnVuY3Rpb24gYXBwbHlUZW1wbGF0ZUNvbnRlbnQoaW5zdCwgbm9kZSwgbm9kZUluZm8pIHsKICAgIGlmIChub2RlSW5mby50ZW1wbGF0ZUluZm8pIHsKICAgICAgbm9kZS5fdGVtcGxhdGVJbmZvID0gbm9kZUluZm8udGVtcGxhdGVJbmZvOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlTm9kZUV2ZW50SGFuZGxlcihjb250ZXh0LCBldmVudE5hbWUsIG1ldGhvZE5hbWUpIHsKICAgIC8vIEluc3RhbmNlcyBjYW4gb3B0aW9uYWxseSBoYXZlIGEgX21ldGhvZEhvc3Qgd2hpY2ggYWxsb3dzIHJlZGlyZWN0aW5nIHdoZXJlCiAgICAvLyB0byBmaW5kIG1ldGhvZHMuIEN1cnJlbnRseSB1c2VkIGJ5IGB0ZW1wbGF0aXplYC4KICAgIGNvbnRleHQgPSBjb250ZXh0Ll9tZXRob2RIb3N0IHx8IGNvbnRleHQ7CiAgICBsZXQgaGFuZGxlciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKGNvbnRleHRbbWV0aG9kTmFtZV0pIHsKICAgICAgICBjb250ZXh0W21ldGhvZE5hbWVdKGUsIGUuZGV0YWlsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zb2xlLndhcm4oJ2xpc3RlbmVyIG1ldGhvZCBgJyArIG1ldGhvZE5hbWUgKyAnYCBub3QgZGVmaW5lZCcpOwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIGhhbmRsZXI7CiAgfQoKICAvKioKICAgKiBFbGVtZW50IG1peGluIHRoYXQgcHJvdmlkZXMgYmFzaWMgdGVtcGxhdGUgcGFyc2luZyBhbmQgc3RhbXBpbmcsIGluY2x1ZGluZwogICAqIHRoZSBmb2xsb3dpbmcgdGVtcGxhdGUtcmVsYXRlZCBmZWF0dXJlcyBmb3Igc3RhbXBlZCB0ZW1wbGF0ZXM6CiAgICoKICAgKiAtIERlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycyAoYG9uLWV2ZW50bmFtZT0ibGlzdGVuZXIiYCkKICAgKiAtIE1hcCBvZiBub2RlIGlkJ3MgdG8gc3RhbXBlZCBub2RlIGluc3RhbmNlcyAoYHRoaXMuJC5pZGApCiAgICogLSBOZXN0ZWQgdGVtcGxhdGUgY29udGVudCBjYWNoaW5nL3JlbW92YWwgYW5kIHJlLWluc3RhbGxhdGlvbiAocGVyZm9ybWFuY2UKICAgKiAgIG9wdGltaXphdGlvbikKICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBiYXNpYyB0ZW1wbGF0ZSBwYXJzaW5nIGFuZCBzdGFtcGluZwogICAqLwogIFBvbHltZXIuVGVtcGxhdGVTdGFtcCA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfVGVtcGxhdGVTdGFtcH0KICAgICAqLwogICAgY2xhc3MgVGVtcGxhdGVTdGFtcCBleHRlbmRzIHN1cGVyQ2xhc3MgewoKICAgICAgLyoqCiAgICAgICAqIFNjYW5zIGEgdGVtcGxhdGUgdG8gcHJvZHVjZSB0ZW1wbGF0ZSBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogVGVtcGxhdGUtc3BlY2lmaWMgbWV0YWRhdGEgYXJlIHN0b3JlZCBpbiB0aGUgb2JqZWN0IHJldHVybmVkLCBhbmQgbm9kZS0KICAgICAgICogc3BlY2lmaWMgbWV0YWRhdGEgYXJlIHN0b3JlZCBpbiBvYmplY3RzIGluIGl0cyBmbGF0dGVuZWQgYG5vZGVJbmZvTGlzdGAKICAgICAgICogYXJyYXkuICBPbmx5IG5vZGVzIGluIHRoZSB0ZW1wbGF0ZSB0aGF0IHdlcmUgcGFyc2VkIGFzIG5vZGVzIG9mCiAgICAgICAqIGludGVyZXN0IGNvbnRhaW4gYW4gb2JqZWN0IGluIGBub2RlSW5mb0xpc3RgLiAgRWFjaCBgbm9kZUluZm9gIG9iamVjdAogICAgICAgKiBjb250YWlucyBhbiBgaW5kZXhgIChgY2hpbGROb2Rlc2AgaW5kZXggaW4gcGFyZW50KSBhbmQgb3B0aW9uYWxseQogICAgICAgKiBgcGFyZW50YCwgd2hpY2ggcG9pbnRzIHRvIG5vZGUgaW5mbyBvZiBpdHMgcGFyZW50IChpbmNsdWRpbmcgaXRzIGluZGV4KS4KICAgICAgICoKICAgICAgICogVGhlIHRlbXBsYXRlIG1ldGFkYXRhIG9iamVjdCByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIGhhcyB0aGUgZm9sbG93aW5nCiAgICAgICAqIHN0cnVjdHVyZSAobWFueSBmaWVsZHMgb3B0aW9uYWwpOgogICAgICAgKgogICAgICAgKiBgYGBqcwogICAgICAgKiAgIHsKICAgICAgICogICAgIC8vIEZsYXR0ZW5lZCBsaXN0IG9mIG5vZGUgbWV0YWRhdGEgKGZvciBub2RlcyB0aGF0IGdlbmVyYXRlZCBtZXRhZGF0YSkKICAgICAgICogICAgIG5vZGVJbmZvTGlzdDogWwogICAgICAgKiAgICAgICB7CiAgICAgICAqICAgICAgICAgLy8gYGlkYCBhdHRyaWJ1dGUgZm9yIGFueSBub2RlcyB3aXRoIGlkJ3MgZm9yIGdlbmVyYXRpbmcgYCRgIG1hcAogICAgICAgKiAgICAgICAgIGlkOiB7c3RyaW5nfSwKICAgICAgICogICAgICAgICAvLyBgb24tZXZlbnQ9ImhhbmRsZXIiYCBtZXRhZGF0YQogICAgICAgKiAgICAgICAgIGV2ZW50czogWwogICAgICAgKiAgICAgICAgICAgewogICAgICAgKiAgICAgICAgICAgICBuYW1lOiB7c3RyaW5nfSwgICAvLyBldmVudCBuYW1lCiAgICAgICAqICAgICAgICAgICAgIHZhbHVlOiB7c3RyaW5nfSwgIC8vIGhhbmRsZXIgbWV0aG9kIG5hbWUKICAgICAgICogICAgICAgICAgIH0sIC4uLgogICAgICAgKiAgICAgICAgIF0sCiAgICAgICAqICAgICAgICAgLy8gTm90ZXMgd2hlbiB0aGUgdGVtcGxhdGUgY29udGFpbmVkIGEgYDxzbG90PmAgZm9yIHNoYWR5IERPTQogICAgICAgKiAgICAgICAgIC8vIG9wdGltaXphdGlvbiBwdXJwb3NlcwogICAgICAgKiAgICAgICAgIGhhc0luc2VydGlvblBvaW50OiB7Ym9vbGVhbn0sCiAgICAgICAqICAgICAgICAgLy8gRm9yIG5lc3RlZCBgPHRlbXBsYXRlPmBgIG5vZGVzLCBuZXN0ZWQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogICAgICAgICB0ZW1wbGF0ZUluZm86IHtvYmplY3R9LCAvLyBuZXN0ZWQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogICAgICAgICAvLyBNZXRhZGF0YSB0byBhbGxvdyBlZmZpY2llbnQgcmV0cmlldmFsIG9mIGluc3RhbmNlZCBub2RlCiAgICAgICAqICAgICAgICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGlzIG1ldGFkYXRhCiAgICAgICAqICAgICAgICAgcGFyZW50SW5mbzoge251bWJlcn0sICAgLy8gcmVmZXJlbmNlIHRvIHBhcmVudCBub2RlSW5mbz4KICAgICAgICogICAgICAgICBwYXJlbnRJbmRleDoge251bWJlcn0sICAvLyBpbmRleCBpbiBwYXJlbnQncyBgY2hpbGROb2Rlc2AgY29sbGVjdGlvbgogICAgICAgKiAgICAgICAgIGluZm9JbmRleDoge251bWJlcn0sICAgIC8vIGluZGV4IG9mIHRoaXMgYG5vZGVJbmZvYCBpbiBgdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdGAKICAgICAgICogICAgICAgfSwKICAgICAgICogICAgICAgLi4uCiAgICAgICAqICAgICBdLAogICAgICAgKiAgICAgLy8gV2hlbiB0cnVlLCB0aGUgdGVtcGxhdGUgaGFkIHRoZSBgc3RyaXAtd2hpdGVzcGFjZWAgYXR0cmlidXRlCiAgICAgICAqICAgICAvLyBvciB3YXMgbmVzdGVkIGluIGEgdGVtcGxhdGUgd2l0aCB0aGF0IHNldHRpbmcKICAgICAgICogICAgIHN0cmlwV2hpdGVzcGFjZToge2Jvb2xlYW59LAogICAgICAgKiAgICAgLy8gRm9yIG5lc3RlZCB0ZW1wbGF0ZXMsIG5lc3RlZCB0ZW1wbGF0ZSBjb250ZW50IGlzIG1vdmVkIGludG8KICAgICAgICogICAgIC8vIGEgZG9jdW1lbnQgZnJhZ21lbnQgc3RvcmVkIGhlcmU7IHRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHRvCiAgICAgICAqICAgICAvLyBhdm9pZCB0aGUgY29zdCBvZiBuZXN0ZWQgdGVtcGxhdGUgY2xvbmluZwogICAgICAgKiAgICAgY29udGVudDoge0RvY3VtZW50RnJhZ21lbnR9CiAgICAgICAqICAgfQogICAgICAgKiBgYGAKICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2Qga2lja3Mgb2ZmIGEgcmVjdXJzaXZlIHRyZWV3YWxrIGFzIGZvbGxvd3M6CiAgICAgICAqCiAgICAgICAqIGBgYAogICAgICAgKiAgICBfcGFyc2VUZW1wbGF0ZSA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICAgICAgKiAgICAgIF9wYXJzZVRlbXBsYXRlQ29udGVudCAgICAgICAgICAgICAgfAogICAgICAgKiAgICAgICAgX3BhcnNlVGVtcGxhdGVOb2RlICA8LS0tLS0tLS0tLS0tfC0tKwogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlIC0tKyAgfAogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMgLS0tLS0tLS0tKwogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGVzCiAgICAgICAqICAgICAgICAgICAgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlCiAgICAgICAqCiAgICAgICAqIGBgYAogICAgICAgKgogICAgICAgKiBUaGVzZSBtZXRob2RzIG1heSBiZSBvdmVycmlkZGVuIHRvIGFkZCBjdXN0b20gbWV0YWRhdGEgYWJvdXQgdGVtcGxhdGVzCiAgICAgICAqIHRvIGVpdGhlciBgdGVtcGxhdGVJbmZvYCBvciBgbm9kZUluZm9gLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IGJlIGRlc3RydWN0aXZlIHRvIHRoZSB0ZW1wbGF0ZSwgaW4gdGhhdAogICAgICAgKiBlLmcuIGV2ZW50IGFubm90YXRpb25zIG1heSBiZSByZW1vdmVkIGFmdGVyIGJlaW5nIG5vdGVkIGluIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gcGFyc2UKICAgICAgICogQHBhcmFtIHtUZW1wbGF0ZUluZm89fSBvdXRlclRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmcm9tIHRoZSBvdXRlcgogICAgICAgKiAgIHRlbXBsYXRlLCBmb3IgcGFyc2luZyBuZXN0ZWQgdGVtcGxhdGVzCiAgICAgICAqIEByZXR1cm4geyFUZW1wbGF0ZUluZm99IFBhcnNlZCB0ZW1wbGF0ZSBtZXRhZGF0YQogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlKHRlbXBsYXRlLCBvdXRlclRlbXBsYXRlSW5mbykgewogICAgICAgIC8vIHNpbmNlIGEgdGVtcGxhdGUgbWF5IGJlIHJlLXVzZWQsIG1lbW8taXplIG1ldGFkYXRhCiAgICAgICAgaWYgKCF0ZW1wbGF0ZS5fdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGVtcGxhdGUuX3RlbXBsYXRlSW5mbyA9IHt9OwogICAgICAgICAgdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdCA9IFtdOwogICAgICAgICAgdGVtcGxhdGVJbmZvLnN0cmlwV2hpdGVTcGFjZSA9IFBvbHltZXIubGVnYWN5T3B0aW1pemF0aW9ucyB8fAogICAgICAgICAgICAob3V0ZXJUZW1wbGF0ZUluZm8gJiYgb3V0ZXJUZW1wbGF0ZUluZm8uc3RyaXBXaGl0ZVNwYWNlKSB8fAogICAgICAgICAgICB0ZW1wbGF0ZS5oYXNBdHRyaWJ1dGUoJ3N0cmlwLXdoaXRlc3BhY2UnKTsKICAgICAgICAgIHRoaXMuX3BhcnNlVGVtcGxhdGVDb250ZW50KHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIHtwYXJlbnQ6IG51bGx9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRlbXBsYXRlLl90ZW1wbGF0ZUluZm87CiAgICAgIH0KCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNvbnRlbnQodGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2VUZW1wbGF0ZU5vZGUodGVtcGxhdGUuY29udGVudCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXJzZXMgdGVtcGxhdGUgbm9kZSBhbmQgYWRkcyB0ZW1wbGF0ZSBhbmQgbm9kZSBtZXRhZGF0YSBiYXNlZCBvbgogICAgICAgKiB0aGUgY3VycmVudCBub2RlLCBhbmQgaXRzIGBjaGlsZE5vZGVzYCBhbmQgYGF0dHJpYnV0ZXNgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbiB0byBhZGQgY3VzdG9tIG5vZGUgb3IgdGVtcGxhdGUgc3BlY2lmaWMKICAgICAgICogbWV0YWRhdGEgYmFzZWQgb24gdGhpcyBub2RlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGxldCBub3RlZDsKICAgICAgICBsZXQgZWxlbWVudCA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8obm9kZSk7CiAgICAgICAgaWYgKGVsZW1lbnQubG9jYWxOYW1lID09ICd0ZW1wbGF0ZScgJiYgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdwcmVzZXJ2ZS1jb250ZW50JykpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKGVsZW1lbnQsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHx8IG5vdGVkOwogICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5sb2NhbE5hbWUgPT09ICdzbG90JykgewogICAgICAgICAgLy8gRm9yIFNoYWR5RG9tIG9wdGltaXphdGlvbiwgaW5kaWNhdGluZyB0aGVyZSBpcyBhbiBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgIHRlbXBsYXRlSW5mby5oYXNJbnNlcnRpb25Qb2ludCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IGVsZW1lbnQ7CiAgICAgICAgaWYgKHdhbGtlci5maXJzdENoaWxkKCkpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMoZWxlbWVudCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgfHwgbm90ZWQ7CiAgICAgICAgfQogICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZXMgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGVzKCkpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGVzKGVsZW1lbnQsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHx8IG5vdGVkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbm90ZWQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXJzZXMgdGVtcGxhdGUgY2hpbGQgbm9kZXMgZm9yIHRoZSBnaXZlbiByb290IG5vZGUuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIGFsc28gd3JhcHMgd2hpdGVsaXN0ZWQgbGVnYWN5IHRlbXBsYXRlIGV4dGVuc2lvbnMKICAgICAgICogKGBpcz0iZG9tLWlmImAgYW5kIGBpcz0iZG9tLXJlcGVhdCJgKSB3aXRoIHRoZWlyIGVxdWl2YWxlbnQgZWxlbWVudAogICAgICAgKiB3cmFwcGVycywgY29sbGFwc2VzIHRleHQgbm9kZXMsIGFuZCBzdHJpcHMgd2hpdGVzcGFjZSBmcm9tIHRoZSB0ZW1wbGF0ZQogICAgICAgKiBpZiB0aGUgYHRlbXBsYXRlSW5mby5zdHJpcFdoaXRlc3BhY2VgIHNldHRpbmcgd2FzIHByb3ZpZGVkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge05vZGV9IHJvb3QgUm9vdCBub2RlIHdob3NlIGBjaGlsZE5vZGVzYCB3aWxsIGJlIHBhcnNlZAogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMocm9vdCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGlmIChyb290LmxvY2FsTmFtZSA9PT0gJ3NjcmlwdCcgfHwgcm9vdC5sb2NhbE5hbWUgPT09ICdzdHlsZScpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gcm9vdDsKICAgICAgICBmb3IgKGxldCBub2RlPXdhbGtlci5maXJzdENoaWxkKCksIHBhcmVudEluZGV4PTAsIG5leHQ7IG5vZGU7IG5vZGU9bmV4dCkgewogICAgICAgICAgLy8gV3JhcCB0ZW1wbGF0ZXMKICAgICAgICAgIGlmIChub2RlLmxvY2FsTmFtZSA9PSAndGVtcGxhdGUnKSB7CiAgICAgICAgICAgIG5vZGUgPSB3cmFwVGVtcGxhdGVFeHRlbnNpb24obm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBjb2xsYXBzZSBhZGphY2VudCB0ZXh0Tm9kZXM6IGZpeGVzIGFuIElFIGlzc3VlIHRoYXQgY2FuIGNhdXNlCiAgICAgICAgICAvLyB0ZXh0IG5vZGVzIHRvIGJlIGluZXhwbGljYWJseSBzcGxpdCA9KAogICAgICAgICAgLy8gbm90ZSB0aGF0IHJvb3Qubm9ybWFsaXplKCkgc2hvdWxkIHdvcmsgYnV0IGRvZXMgbm90IHNvIHdlIGRvIHRoaXMKICAgICAgICAgIC8vIG1hbnVhbGx5LgogICAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gbm9kZTsKICAgICAgICAgIG5leHQgPSB3YWxrZXIubmV4dFNpYmxpbmcoKTsKICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgICBsZXQgLyoqIE5vZGUgKi8gbiA9IG5leHQ7CiAgICAgICAgICAgIHdoaWxlIChuICYmIChuLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkpIHsKICAgICAgICAgICAgICBub2RlLnRleHRDb250ZW50ICs9IG4udGV4dENvbnRlbnQ7CiAgICAgICAgICAgICAgbmV4dCA9IHdhbGtlci5uZXh0U2libGluZygpOwogICAgICAgICAgICAgIHJvb3QucmVtb3ZlQ2hpbGQobik7CiAgICAgICAgICAgICAgbiA9IG5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gb3B0aW9uYWxseSBzdHJpcCB3aGl0ZXNwYWNlCiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUluZm8uc3RyaXBXaGl0ZVNwYWNlICYmICFub2RlLnRleHRDb250ZW50LnRyaW0oKSkgewogICAgICAgICAgICAgIHJvb3QucmVtb3ZlQ2hpbGQobm9kZSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGxldCBjaGlsZEluZm8gPSB7IHBhcmVudEluZGV4LCBwYXJlbnRJbmZvOiBub2RlSW5mbyB9OwogICAgICAgICAgaWYgKHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlKG5vZGUsIHRlbXBsYXRlSW5mbywgY2hpbGRJbmZvKSkgewogICAgICAgICAgICBjaGlsZEluZm8uaW5mb0luZGV4ID0gdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdC5wdXNoKC8qKiBAdHlwZSB7IU5vZGVJbmZvfSAqLyhjaGlsZEluZm8pKSAtIDE7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBJbmNyZW1lbnQgaWYgbm90IHJlbW92ZWQKICAgICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IG5vZGU7CiAgICAgICAgICBpZiAod2Fsa2VyLnBhcmVudE5vZGUoKSkgewogICAgICAgICAgICBwYXJlbnRJbmRleCsrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhcnNlcyB0ZW1wbGF0ZSBjb250ZW50IGZvciB0aGUgZ2l2ZW4gbmVzdGVkIGA8dGVtcGxhdGU+YC4KICAgICAgICoKICAgICAgICogTmVzdGVkIHRlbXBsYXRlIGluZm8gaXMgc3RvcmVkIGFzIGB0ZW1wbGF0ZUluZm9gIGluIHRoZSBjdXJyZW50IG5vZGUncwogICAgICAgKiBgbm9kZUluZm9gLiBgdGVtcGxhdGUuY29udGVudGAgaXMgcmVtb3ZlZCBhbmQgc3RvcmVkIGluIGB0ZW1wbGF0ZUluZm9gLgogICAgICAgKiBJdCB3aWxsIHRoZW4gYmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBob3N0IHRvIHNldCBpdCBiYWNrIHRvIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBhbmQgZm9yIHVzZXJzIHN0YW1waW5nIG5lc3RlZCB0ZW1wbGF0ZXMgdG8gdXNlIHRoZQogICAgICAgKiBgX2NvbnRlbnRGb3JUZW1wbGF0ZWAgbWV0aG9kIHRvIHJldHJpZXZlIHRoZSBjb250ZW50IGZvciB0aGlzIHRlbXBsYXRlCiAgICAgICAqIChhbiBvcHRpbWl6YXRpb24gdG8gYXZvaWQgdGhlIGNvc3Qgb2YgY2xvbmluZyBuZXN0ZWQgdGVtcGxhdGUgY29udGVudCkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gbm9kZSBOb2RlIHRvIHBhcnNlIChhIDx0ZW1wbGF0ZT4pCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSBvdXRlclRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiAgIHRoYXQgaW5jbHVkZXMgdGhlIHRlbXBsYXRlIGBub2RlYAogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKG5vZGUsIG91dGVyVGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGxldCB0ZW1wbGF0ZUluZm8gPSB0aGlzLl9wYXJzZVRlbXBsYXRlKG5vZGUsIG91dGVyVGVtcGxhdGVJbmZvKTsKICAgICAgICBsZXQgY29udGVudCA9IHRlbXBsYXRlSW5mby5jb250ZW50ID0KICAgICAgICAgIG5vZGUuY29udGVudC5vd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKG5vZGUuY29udGVudCk7CiAgICAgICAgbm9kZUluZm8udGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUGFyc2VzIHRlbXBsYXRlIG5vZGUgYXR0cmlidXRlcyBhbmQgYWRkcyBub2RlIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICogZm9yIG5vZGVzIG9mIGludGVyZXN0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmlzaXRlZCBub2RlIGFkZGVkIG5vZGUtc3BlY2lmaWMKICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlcyhub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgLy8gTWFrZSBjb3B5IG9mIG9yaWdpbmFsIGF0dHJpYnV0ZSBsaXN0LCBzaW5jZSB0aGUgb3JkZXIgbWF5IGNoYW5nZQogICAgICAgIC8vIGFzIGF0dHJpYnV0ZXMgYXJlIGFkZGVkIGFuZCByZW1vdmVkCiAgICAgICAgbGV0IG5vdGVkID0gZmFsc2U7CiAgICAgICAgbGV0IGF0dHJzID0gQXJyYXkuZnJvbShub2RlLmF0dHJpYnV0ZXMpOwogICAgICAgIGZvciAobGV0IGk9YXR0cnMubGVuZ3RoLTEsIGE7IChhPWF0dHJzW2ldKTsgaS0tKSB7CiAgICAgICAgICBub3RlZCA9IHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8sIGEubmFtZSwgYS52YWx1ZSkgfHwgbm90ZWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBub3RlZDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhcnNlcyBhIHNpbmdsZSB0ZW1wbGF0ZSBub2RlIGF0dHJpYnV0ZSBhbmQgYWRkcyBub2RlIG1ldGFkYXRhIHRvCiAgICAgICAqIGBub2RlSW5mb2AgZm9yIGF0dHJpYnV0ZXMgb2YgaW50ZXJlc3QuCiAgICAgICAqCiAgICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gYWRkcyBtZXRhZGF0YSBmb3IgYG9uLWV2ZW50PSJoYW5kbGVyImAgYXR0cmlidXRlcwogICAgICAgKiBhbmQgYGlkYCBhdHRyaWJ1dGVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgQXR0cmlidXRlIG5hbWUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZUF0dHJpYnV0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCBuYW1lLCB2YWx1ZSkgewogICAgICAgIC8vIGV2ZW50cyAob24tKikKICAgICAgICBpZiAobmFtZS5zbGljZSgwLCAzKSA9PT0gJ29uLScpIHsKICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICAgICAgbm9kZUluZm8uZXZlbnRzID0gbm9kZUluZm8uZXZlbnRzIHx8IFtdOwogICAgICAgICAgbm9kZUluZm8uZXZlbnRzLnB1c2goewogICAgICAgICAgICBuYW1lOiBuYW1lLnNsaWNlKDMpLAogICAgICAgICAgICB2YWx1ZQogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gc3RhdGljIGlkCiAgICAgICAgZWxzZSBpZiAobmFtZSA9PT0gJ2lkJykgewogICAgICAgICAgbm9kZUluZm8uaWQgPSB2YWx1ZTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBgY29udGVudGAgZG9jdW1lbnQgZnJhZ21lbnQgZm9yIGEgZ2l2ZW4gdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIEZvciBuZXN0ZWQgdGVtcGxhdGVzLCBQb2x5bWVyIHBlcmZvcm1zIGFuIG9wdGltaXphdGlvbiB0byBjYWNoZSBuZXN0ZWQKICAgICAgICogdGVtcGxhdGUgY29udGVudCB0byBhdm9pZCB0aGUgY29zdCBvZiBjbG9uaW5nIGRlZXBseSBuZXN0ZWQgdGVtcGxhdGVzLgogICAgICAgKiBUaGlzIG1ldGhvZCByZXRyaWV2ZXMgdGhlIGNhY2hlZCBjb250ZW50IGZvciBhIGdpdmVuIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIHJldHJpZXZlIGBjb250ZW50YCBmb3IKICAgICAgICogQHJldHVybiB7RG9jdW1lbnRGcmFnbWVudH0gQ29udGVudCBmcmFnbWVudAogICAgICAgKi8KICAgICAgc3RhdGljIF9jb250ZW50Rm9yVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50V2l0aEluZm99ICovICh0ZW1wbGF0ZSkuX3RlbXBsYXRlSW5mbzsKICAgICAgICByZXR1cm4gKHRlbXBsYXRlSW5mbyAmJiB0ZW1wbGF0ZUluZm8uY29udGVudCkgfHwgdGVtcGxhdGUuY29udGVudDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENsb25lcyB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgY29udGVudCBhbmQgcmV0dXJucyBhIGRvY3VtZW50IGZyYWdtZW50CiAgICAgICAqIGNvbnRhaW5pbmcgdGhlIGNsb25lZCBkb20uCiAgICAgICAqCiAgICAgICAqIFRoZSB0ZW1wbGF0ZSBpcyBwYXJzZWQgKG9uY2UgYW5kIG1lbW9pemVkKSB1c2luZyB0aGlzIGxpYnJhcnkncwogICAgICAgKiB0ZW1wbGF0ZSBwYXJzaW5nIGZlYXR1cmVzLCBhbmQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS1hZGRlZAogICAgICAgKiBmZWF0dXJlczoKICAgICAgICogKiBBZGRzIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycyBmb3IgYG9uLWV2ZW50PSJoYW5kbGVyImAgYXR0cmlidXRlcwogICAgICAgKiAqIEdlbmVyYXRlcyBhbiAiaWQgbWFwIiBmb3IgYWxsIG5vZGVzIHdpdGggaWQncyB1bmRlciBgJGAgb24gcmV0dXJuZWQKICAgICAgICogICBkb2N1bWVudCBmcmFnbWVudAogICAgICAgKiAqIFBhc3NlcyB0ZW1wbGF0ZSBpbmZvIGluY2x1ZGluZyBgY29udGVudGAgYmFjayB0byB0ZW1wbGF0ZXMgYXMKICAgICAgICogICBgX3RlbXBsYXRlSW5mb2AgKGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRvIGF2b2lkIGRlZXAgdGVtcGxhdGUKICAgICAgICogICBjbG9uaW5nKQogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgdGhlIG1lbW9pemVkIHRlbXBsYXRlIHBhcnNpbmcgcHJvY2VzcyBpcyBkZXN0cnVjdGl2ZSB0byB0aGUKICAgICAgICogdGVtcGxhdGU6IGF0dHJpYnV0ZXMgZm9yIGJpbmRpbmdzIGFuZCBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMgYXJlCiAgICAgICAqIHJlbW92ZWQgYWZ0ZXIgYmVpbmcgbm90ZWQgaW4gbm90ZXMsIGFuZCBhbnkgbmVzdGVkIGA8dGVtcGxhdGU+LmNvbnRlbnRgCiAgICAgICAqIGlzIHJlbW92ZWQgYW5kIHN0b3JlZCBpbiBub3RlcyBhcyB3ZWxsLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBzdGFtcAogICAgICAgKiBAcmV0dXJuIHshU3RhbXBlZFRlbXBsYXRlfSBDbG9uZWQgdGVtcGxhdGUgY29udGVudAogICAgICAgKi8KICAgICAgX3N0YW1wVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICAvLyBQb2x5ZmlsbCBzdXBwb3J0OiBib290c3RyYXAgdGhlIHRlbXBsYXRlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuCiAgICAgICAgaWYgKHRlbXBsYXRlICYmICF0ZW1wbGF0ZS5jb250ZW50ICYmCiAgICAgICAgICAgIHdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50ICYmIEhUTUxUZW1wbGF0ZUVsZW1lbnQuZGVjb3JhdGUpIHsKICAgICAgICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnQuZGVjb3JhdGUodGVtcGxhdGUpOwogICAgICAgIH0KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5jb25zdHJ1Y3Rvci5fcGFyc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgbGV0IG5vZGVJbmZvID0gdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdDsKICAgICAgICBsZXQgY29udGVudCA9IHRlbXBsYXRlSW5mby5jb250ZW50IHx8IHRlbXBsYXRlLmNvbnRlbnQ7CiAgICAgICAgbGV0IGRvbSA9IC8qKiBAdHlwZSB7RG9jdW1lbnRGcmFnbWVudH0gKi8gKGRvY3VtZW50LmltcG9ydE5vZGUoY29udGVudCwgdHJ1ZSkpOwogICAgICAgIC8vIE5PVEU6IFNoYWR5RG9tIG9wdGltaXphdGlvbiBpbmRpY2F0aW5nIHRoZXJlIGlzIGFuIGluc2VydGlvbiBwb2ludAogICAgICAgIGRvbS5fX25vSW5zZXJ0aW9uUG9pbnQgPSAhdGVtcGxhdGVJbmZvLmhhc0luc2VydGlvblBvaW50OwogICAgICAgIGxldCBub2RlcyA9IGRvbS5ub2RlTGlzdCA9IG5ldyBBcnJheShub2RlSW5mby5sZW5ndGgpOwogICAgICAgIGRvbS4kID0ge307CiAgICAgICAgZm9yIChsZXQgaT0wLCBsPW5vZGVJbmZvLmxlbmd0aCwgaW5mbzsgKGk8bCkgJiYgKGluZm89bm9kZUluZm9baV0pOyBpKyspIHsKICAgICAgICAgIGxldCBub2RlID0gbm9kZXNbaV0gPSBmaW5kVGVtcGxhdGVOb2RlKGRvbSwgaW5mbyk7CiAgICAgICAgICBhcHBseUlkVG9NYXAodGhpcywgZG9tLiQsIG5vZGUsIGluZm8pOwogICAgICAgICAgYXBwbHlUZW1wbGF0ZUNvbnRlbnQodGhpcywgbm9kZSwgaW5mbyk7CiAgICAgICAgICBhcHBseUV2ZW50TGlzdGVuZXIodGhpcywgbm9kZSwgaW5mbyk7CiAgICAgICAgfQogICAgICAgIGRvbSA9IC8qKiBAdHlwZSB7IVN0YW1wZWRUZW1wbGF0ZX0gKi8oZG9tKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWFzc2lnbgogICAgICAgIHJldHVybiBkb207CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGJ5IG1ldGhvZCBuYW1lIGZvciB0aGUgZXZlbnQgcHJvdmlkZWQuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyBhIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBsb29rcyB1cCB0aGUgbWV0aG9kCiAgICAgICAqIG5hbWUgYXQgaGFuZGxpbmcgdGltZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBsaXN0ZW5lciBvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTmFtZSBvZiBtZXRob2QKICAgICAgICogQHBhcmFtIHsqPX0gY29udGV4dCBDb250ZXh0IHRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb24gKGRlZmF1bHRzCiAgICAgICAqICAgdG8gYG5vZGVgKQogICAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gR2VuZXJhdGVkIGhhbmRsZXIgZnVuY3Rpb24KICAgICAgICovCiAgICAgIF9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSwgY29udGV4dCkgewogICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IG5vZGU7CiAgICAgICAgbGV0IGhhbmRsZXIgPSBjcmVhdGVOb2RlRXZlbnRIYW5kbGVyKGNvbnRleHQsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSk7CiAgICAgICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIHJldHVybiBoYW5kbGVyOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gb3Igc2ltdWxhdGVkIGV2ZW50IGhhbmRsaW5nLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gYWRkIGV2ZW50IGxpc3RlbmVyIHRvCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBMaXN0ZW5lciBmdW5jdGlvbiB0byBhZGQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gb3Igc2ltdWxhdGVkIGV2ZW50IGhhbmRsaW5nLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVyIGZyb20KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50CiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KTp2b2lkfSBoYW5kbGVyIExpc3RlbmVyIGZ1bmN0aW9uIHRvIHJlbW92ZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3JlbW92ZUV2ZW50TGlzdGVuZXJGcm9tTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gVGVtcGxhdGVTdGFtcDsKCiAgfSk7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvKiogQGNvbnN0IHtPYmplY3R9ICovCiAgY29uc3QgQ2FzZU1hcCA9IFBvbHltZXIuQ2FzZU1hcDsKCiAgLy8gTW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIHVuaXF1ZSBJRCB1c2VkIGZvciBkZS1kdXBpbmcgZWZmZWN0cyB0cmlnZ2VyZWQKICAvLyBmcm9tIG11bHRpcGxlIHByb3BlcnRpZXMgaW4gdGhlIHNhbWUgdHVybgogIGxldCBkZWR1cGVJZCA9IDA7CgogIC8qKgogICAqIFByb3BlcnR5IGVmZmVjdCB0eXBlczsgZWZmZWN0cyBhcmUgc3RvcmVkIG9uIHRoZSBwcm90b3R5cGUgdXNpbmcgdGhlc2Uga2V5cwogICAqIEBlbnVtIHtzdHJpbmd9CiAgICovCiAgY29uc3QgVFlQRVMgPSB7CiAgICBDT01QVVRFOiAnX19jb21wdXRlRWZmZWN0cycsCiAgICBSRUZMRUNUOiAnX19yZWZsZWN0RWZmZWN0cycsCiAgICBOT1RJRlk6ICdfX25vdGlmeUVmZmVjdHMnLAogICAgUFJPUEFHQVRFOiAnX19wcm9wYWdhdGVFZmZlY3RzJywKICAgIE9CU0VSVkU6ICdfX29ic2VydmVFZmZlY3RzJywKICAgIFJFQURfT05MWTogJ19fcmVhZE9ubHknCiAgfTsKCiAgLyoqIEBjb25zdCB7UmVnRXhwfSAqLwogIGNvbnN0IGNhcGl0YWxBdHRyaWJ1dGVSZWdleCA9IC9bQS1aXS87CgogIC8qKgogICAqIEB0eXBlZGVmIHt7CiAgICogbmFtZTogKHN0cmluZyB8IHVuZGVmaW5lZCksCiAgICogc3RydWN0dXJlZDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLAogICAqIHdpbGRjYXJkOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkKICAgKiB9fQogICAqLwogIGxldCBEYXRhVHJpZ2dlcjsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgogIC8qKgogICAqIEB0eXBlZGVmIHt7CiAgICogaW5mbzogPywKICAgKiB0cmlnZ2VyOiAoIURhdGFUcmlnZ2VyIHwgdW5kZWZpbmVkKSwKICAgKiBmbjogKCFGdW5jdGlvbiB8IHVuZGVmaW5lZCkKICAgKiB9fQogICAqLwogIGxldCBEYXRhRWZmZWN0OyAvL2VzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKCiAgbGV0IFByb3BlcnR5RWZmZWN0c1R5cGU7IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAvKioKICAgKiBFbnN1cmVzIHRoYXQgdGhlIG1vZGVsIGhhcyBhbiBvd24tcHJvcGVydHkgbWFwIG9mIGVmZmVjdHMgZm9yIHRoZSBnaXZlbiB0eXBlLgogICAqIFRoZSBtb2RlbCBtYXkgYmUgYSBwcm90b3R5cGUgb3IgYW4gaW5zdGFuY2UuCiAgICoKICAgKiBQcm9wZXJ0eSBlZmZlY3RzIGFyZSBzdG9yZWQgYXMgYXJyYXlzIG9mIGVmZmVjdHMgYnkgcHJvcGVydHkgaW4gYSBtYXAsCiAgICogYnkgbmFtZWQgdHlwZSBvbiB0aGUgbW9kZWwuIGUuZy4KICAgKgogICAqICAgX19jb21wdXRlRWZmZWN0czogewogICAqICAgICBmb286IFsgLi4uIF0sCiAgICogICAgIGJhcjogWyAuLi4gXQogICAqICAgfQogICAqCiAgICogSWYgdGhlIG1vZGVsIGRvZXMgbm90IHlldCBoYXZlIGFuIGVmZmVjdCBtYXAgZm9yIHRoZSB0eXBlLCBvbmUgaXMgY3JlYXRlZAogICAqIGFuZCByZXR1cm5lZC4gIElmIGl0IGRvZXMsIGJ1dCBpdCBpcyBub3QgYW4gb3duIHByb3BlcnR5IChpLmUuIHRoZQogICAqIHByb3RvdHlwZSBoYWQgZWZmZWN0cyksIHRoZSB0aGUgbWFwIGlzIGRlZXBseSBjbG9uZWQgYW5kIHRoZSBjb3B5IGlzCiAgICogc2V0IG9uIHRoZSBtb2RlbCBhbmQgcmV0dXJuZWQsIHJlYWR5IGZvciBuZXcgZWZmZWN0cyB0byBiZSBhZGRlZC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBtb2RlbCBQcm90b3R5cGUgb3IgaW5zdGFuY2UKICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBQcm9wZXJ0eSBlZmZlY3QgdHlwZQogICAqIEByZXR1cm4ge09iamVjdH0gVGhlIG93bi1wcm9wZXJ0eSBtYXAgb2YgZWZmZWN0cyBmb3IgdGhlIGdpdmVuIHR5cGUKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGVuc3VyZU93bkVmZmVjdE1hcChtb2RlbCwgdHlwZSkgewogICAgbGV0IGVmZmVjdHMgPSBtb2RlbFt0eXBlXTsKICAgIGlmICghZWZmZWN0cykgewogICAgICBlZmZlY3RzID0gbW9kZWxbdHlwZV0gPSB7fTsKICAgIH0gZWxzZSBpZiAoIW1vZGVsLmhhc093blByb3BlcnR5KHR5cGUpKSB7CiAgICAgIGVmZmVjdHMgPSBtb2RlbFt0eXBlXSA9IE9iamVjdC5jcmVhdGUobW9kZWxbdHlwZV0pOwogICAgICBmb3IgKGxldCBwIGluIGVmZmVjdHMpIHsKICAgICAgICBsZXQgcHJvdG9GeCA9IGVmZmVjdHNbcF07CiAgICAgICAgbGV0IGluc3RGeCA9IGVmZmVjdHNbcF0gPSBBcnJheShwcm90b0Z4Lmxlbmd0aCk7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPHByb3RvRngubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGluc3RGeFtpXSA9IHByb3RvRnhbaV07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZWZmZWN0czsKICB9CgogIC8vIC0tIGVmZmVjdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvKioKICAgKiBSdW5zIGFsbCBlZmZlY3RzIG9mIGEgZ2l2ZW4gdHlwZSBmb3IgdGhlIGdpdmVuIHNldCBvZiBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogb24gYW4gaW5zdGFuY2UuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB3aXRoIGVmZmVjdHMgdG8gcnVuCiAgICogQHBhcmFtIHtPYmplY3R9IGVmZmVjdHMgT2JqZWN0IG1hcCBvZiBwcm9wZXJ0eS10by1BcnJheSBvZiBlZmZlY3RzCiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEJhZyBvZiBjdXJyZW50IHByb3BlcnR5IGNoYW5nZXMKICAgKiBAcGFyYW0ge09iamVjdD19IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHBhcmFtIHsqPX0gZXh0cmFBcmdzIEFkZGl0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byBlZmZlY3QgZnVuY3Rpb24KICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFuIGVmZmVjdCByYW4gZm9yIHRoaXMgcHJvcGVydHkKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkVmZmVjdHMoaW5zdCwgZWZmZWN0cywgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocywgZXh0cmFBcmdzKSB7CiAgICBpZiAoZWZmZWN0cykgewogICAgICBsZXQgcmFuID0gZmFsc2U7CiAgICAgIGxldCBpZCA9IGRlZHVwZUlkKys7CiAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICBpZiAocnVuRWZmZWN0c0ZvclByb3BlcnR5KGluc3QsIGVmZmVjdHMsIGlkLCBwcm9wLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzLCBleHRyYUFyZ3MpKSB7CiAgICAgICAgICByYW4gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmFuOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLyoqCiAgICogUnVucyBhIGxpc3Qgb2YgZWZmZWN0cyBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHdpdGggZWZmZWN0cyB0byBydW4KICAgKiBAcGFyYW0ge09iamVjdH0gZWZmZWN0cyBPYmplY3QgbWFwIG9mIHByb3BlcnR5LXRvLUFycmF5IG9mIGVmZmVjdHMKICAgKiBAcGFyYW0ge251bWJlcn0gZGVkdXBlSWQgQ291bnRlciB1c2VkIGZvciBkZS1kdXBpbmcgZWZmZWN0cwogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIE5hbWUgb2YgY2hhbmdlZCBwcm9wZXJ0eQogICAqIEBwYXJhbSB7Kn0gcHJvcHMgQ2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHsqfSBvbGRQcm9wcyBPbGQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHBhcmFtIHsqPX0gZXh0cmFBcmdzIEFkZGl0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byBlZmZlY3QgZnVuY3Rpb24KICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFuIGVmZmVjdCByYW4gZm9yIHRoaXMgcHJvcGVydHkKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkVmZmVjdHNGb3JQcm9wZXJ0eShpbnN0LCBlZmZlY3RzLCBkZWR1cGVJZCwgcHJvcCwgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocywgZXh0cmFBcmdzKSB7CiAgICBsZXQgcmFuID0gZmFsc2U7CiAgICBsZXQgcm9vdFByb3BlcnR5ID0gaGFzUGF0aHMgPyBQb2x5bWVyLlBhdGgucm9vdChwcm9wKSA6IHByb3A7CiAgICBsZXQgZnhzID0gZWZmZWN0c1tyb290UHJvcGVydHldOwogICAgaWYgKGZ4cykgewogICAgICBmb3IgKGxldCBpPTAsIGw9ZnhzLmxlbmd0aCwgZng7IChpPGwpICYmIChmeD1meHNbaV0pOyBpKyspIHsKICAgICAgICBpZiAoKCFmeC5pbmZvIHx8IGZ4LmluZm8ubGFzdFJ1biAhPT0gZGVkdXBlSWQpICYmCiAgICAgICAgICAgICghaGFzUGF0aHMgfHwgcGF0aE1hdGNoZXNUcmlnZ2VyKHByb3AsIGZ4LnRyaWdnZXIpKSkgewogICAgICAgICAgaWYgKGZ4LmluZm8pIHsKICAgICAgICAgICAgZnguaW5mby5sYXN0UnVuID0gZGVkdXBlSWQ7CiAgICAgICAgICB9CiAgICAgICAgICBmeC5mbihpbnN0LCBwcm9wLCBwcm9wcywgb2xkUHJvcHMsIGZ4LmluZm8sIGhhc1BhdGhzLCBleHRyYUFyZ3MpOwogICAgICAgICAgcmFuID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByYW47CiAgfQoKICAvKioKICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBwcm9wZXJ0eS9wYXRoIHRoYXQgaGFzIGNoYW5nZWQgbWF0Y2hlcyB0aGUgdHJpZ2dlcgogICAqIGNyaXRlcmlhIGZvciBhbiBlZmZlY3QuICBBIHRyaWdnZXIgaXMgYSBkZXNjcmlwdG9yIHdpdGggdGhlIGZvbGxvd2luZwogICAqIHN0cnVjdHVyZSwgd2hpY2ggbWF0Y2hlcyB0aGUgZGVzY3JpcHRvcnMgcmV0dXJuZWQgZnJvbSBgcGFyc2VBcmdgLgogICAqIGUuZy4gZm9yIGBmb28uYmFyLipgOgogICAqIGBgYAogICAqIHRyaWdnZXI6IHsKICAgKiAgIG5hbWU6ICdhLmInLAogICAqICAgc3RydWN0dXJlZDogdHJ1ZSwKICAgKiAgIHdpbGRjYXJkOiB0cnVlCiAgICogfQogICAqIGBgYAogICAqIElmIG5vIHRyaWdnZXIgaXMgZ2l2ZW4sIHRoZSBwYXRoIGlzIGRlZW1lZCB0byBtYXRjaC4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggb3IgcHJvcGVydHkgdGhhdCBjaGFuZ2VkCiAgICogQHBhcmFtIHtEYXRhVHJpZ2dlcn0gdHJpZ2dlciBEZXNjcmlwdG9yCiAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgcGF0aCBtYXRjaGVkIHRoZSB0cmlnZ2VyCiAgICovCiAgZnVuY3Rpb24gcGF0aE1hdGNoZXNUcmlnZ2VyKHBhdGgsIHRyaWdnZXIpIHsKICAgIGlmICh0cmlnZ2VyKSB7CiAgICAgIGxldCB0cmlnZ2VyUGF0aCA9IHRyaWdnZXIubmFtZTsKICAgICAgcmV0dXJuICh0cmlnZ2VyUGF0aCA9PSBwYXRoKSB8fAogICAgICAgICh0cmlnZ2VyLnN0cnVjdHVyZWQgJiYgUG9seW1lci5QYXRoLmlzQW5jZXN0b3IodHJpZ2dlclBhdGgsIHBhdGgpKSB8fAogICAgICAgICh0cmlnZ2VyLndpbGRjYXJkICYmIFBvbHltZXIuUGF0aC5pc0Rlc2NlbmRhbnQodHJpZ2dlclBhdGgsIHBhdGgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgLyoqCiAgICogSW1wbGVtZW50cyB0aGUgIm9ic2VydmVyIiBlZmZlY3QuCiAgICoKICAgKiBDYWxscyB0aGUgbWV0aG9kIHdpdGggYGluZm8ubWV0aG9kTmFtZWAgb24gdGhlIGluc3RhbmNlLCBwYXNzaW5nIHRoZQogICAqIG5ldyBhbmQgb2xkIHZhbHVlcy4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7P30gaW5mbyBFZmZlY3QgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcnVuT2JzZXJ2ZXJFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbykgewogICAgbGV0IGZuID0gdHlwZW9mIGluZm8ubWV0aG9kID09PSAic3RyaW5nIiA/IGluc3RbaW5mby5tZXRob2RdIDogaW5mby5tZXRob2Q7CiAgICBsZXQgY2hhbmdlZFByb3AgPSBpbmZvLnByb3BlcnR5OwogICAgaWYgKGZuKSB7CiAgICAgIGZuLmNhbGwoaW5zdCwgaW5zdC5fX2RhdGFbY2hhbmdlZFByb3BdLCBvbGRQcm9wc1tjaGFuZ2VkUHJvcF0pOwogICAgfSBlbHNlIGlmICghaW5mby5keW5hbWljRm4pIHsKICAgICAgY29uc29sZS53YXJuKCdvYnNlcnZlciBtZXRob2QgYCcgKyBpbmZvLm1ldGhvZCArICdgIG5vdCBkZWZpbmVkJyk7CiAgICB9CiAgfQoKICAvKioKICAgKiBSdW5zICJub3RpZnkiIGVmZmVjdHMgZm9yIGEgc2V0IG9mIGNoYW5nZWQgcHJvcGVydGllcy4KICAgKgogICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSB0aGUgZ2VuZXJpYyBgcnVuRWZmZWN0c2AgbWV0aG9kIGluIHRoYXQgaXQKICAgKiB3aWxsIGRpc3BhdGNoIHBhdGggbm90aWZpY2F0aW9uIGV2ZW50cyBpbiB0aGUgY2FzZSB0aGF0IHRoZSBwcm9wZXJ0eQogICAqIGNoYW5nZWQgd2FzIGEgcGF0aCBhbmQgdGhlIHJvb3QgcHJvcGVydHkgZm9yIHRoYXQgcGF0aCBkaWRuJ3QgaGF2ZSBhCiAgICogIm5vdGlmeSIgZWZmZWN0LiAgVGhpcyBpcyB0byBtYWludGFpbiAxLjAgYmVoYXZpb3IgdGhhdCBkaWQgbm90IHJlcXVpcmUKICAgKiBgbm90aWZ5OiB0cnVlYCB0byBlbnN1cmUgb2JqZWN0IHN1Yi1wcm9wZXJ0eSBub3RpZmljYXRpb25zIHdlcmUKICAgKiBzZW50LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugd2l0aCBlZmZlY3RzIHRvIHJ1bgogICAqIEBwYXJhbSB7T2JqZWN0fSBub3RpZnlQcm9wcyBCYWcgb2YgcHJvcGVydGllcyB0byBub3RpZnkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bk5vdGlmeUVmZmVjdHMoaW5zdCwgbm90aWZ5UHJvcHMsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpIHsKICAgIC8vIE5vdGlmeQogICAgbGV0IGZ4cyA9IGluc3RbVFlQRVMuTk9USUZZXTsKICAgIGxldCBub3RpZmllZDsKICAgIGxldCBpZCA9IGRlZHVwZUlkKys7CiAgICAvLyBUcnkgbm9ybWFsIG5vdGlmeSBlZmZlY3RzOyBpZiBub25lLCBmYWxsIGJhY2sgdG8gdHJ5IHBhdGggbm90aWZpY2F0aW9uCiAgICBmb3IgKGxldCBwcm9wIGluIG5vdGlmeVByb3BzKSB7CiAgICAgIGlmIChub3RpZnlQcm9wc1twcm9wXSkgewogICAgICAgIGlmIChmeHMgJiYgcnVuRWZmZWN0c0ZvclByb3BlcnR5KGluc3QsIGZ4cywgaWQsIHByb3AsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpKSB7CiAgICAgICAgICBub3RpZmllZCA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChoYXNQYXRocyAmJiBub3RpZnlQYXRoKGluc3QsIHByb3AsIHByb3BzKSkgewogICAgICAgICAgbm90aWZpZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gRmx1c2ggaG9zdCBpZiB3ZSBhY3R1YWxseSBub3RpZmllZCBhbmQgaG9zdCB3YXMgYmF0Y2hpbmcKICAgIC8vIEFuZCB0aGUgaG9zdCBoYXMgYWxyZWFkeSBpbml0aWFsaXplZCBjbGllbnRzOyB0aGlzIHByZXZlbnRzCiAgICAvLyBhbiBpc3N1ZSB3aXRoIGEgaG9zdCBvYnNlcnZpbmcgZGF0YSBjaGFuZ2VzIGJlZm9yZSBjbGllbnRzIGFyZSByZWFkeS4KICAgIGxldCBob3N0OwogICAgaWYgKG5vdGlmaWVkICYmIChob3N0ID0gaW5zdC5fX2RhdGFIb3N0KSAmJiBob3N0Ll9pbnZhbGlkYXRlUHJvcGVydGllcykgewogICAgICBob3N0Ll9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgfQogIH0KCiAgLyoqCiAgICogRGlzcGF0Y2hlcyB7cHJvcGVydHl9LWNoYW5nZWQgZXZlbnRzIHdpdGggcGF0aCBpbmZvcm1hdGlvbiBpbiB0aGUgZGV0YWlsCiAgICogb2JqZWN0IHRvIGluZGljYXRlIGEgc3ViLXBhdGggb2YgdGhlIHByb3BlcnR5IHdhcyBjaGFuZ2VkLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGZpcmUgdGhlIGV2ZW50CiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggdGhhdCB3YXMgY2hhbmdlZAogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwYXRoIHdhcyBub3RpZmllZAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5UGF0aChpbnN0LCBwYXRoLCBwcm9wcykgewogICAgbGV0IHJvb3RQcm9wZXJ0eSA9IFBvbHltZXIuUGF0aC5yb290KHBhdGgpOwogICAgaWYgKHJvb3RQcm9wZXJ0eSAhPT0gcGF0aCkgewogICAgICBsZXQgZXZlbnROYW1lID0gUG9seW1lci5DYXNlTWFwLmNhbWVsVG9EYXNoQ2FzZShyb290UHJvcGVydHkpICsgJy1jaGFuZ2VkJzsKICAgICAgZGlzcGF0Y2hOb3RpZnlFdmVudChpbnN0LCBldmVudE5hbWUsIHByb3BzW3BhdGhdLCBwYXRoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvKioKICAgKiBEaXNwYXRjaGVzIHtwcm9wZXJ0eX0tY2hhbmdlZCBldmVudHMgdG8gaW5kaWNhdGUgYSBwcm9wZXJ0eSAob3IgcGF0aCkKICAgKiBjaGFuZ2VkLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGZpcmUgdGhlIGV2ZW50CiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gc2VuZCAoJ3twcm9wZXJ0eX0tY2hhbmdlZCcpCiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGNoYW5nZWQgcHJvcGVydHkKICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IHBhdGggSWYgYSBzdWItcGF0aCBvZiB0aGlzIHByb3BlcnR5IGNoYW5nZWQsIHRoZSBwYXRoCiAgICogICB0aGF0IGNoYW5nZWQgKG9wdGlvbmFsKS4KICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICovCiAgZnVuY3Rpb24gZGlzcGF0Y2hOb3RpZnlFdmVudChpbnN0LCBldmVudE5hbWUsIHZhbHVlLCBwYXRoKSB7CiAgICBsZXQgZGV0YWlsID0gewogICAgICB2YWx1ZTogdmFsdWUsCiAgICAgIHF1ZXVlUHJvcGVydHk6IHRydWUKICAgIH07CiAgICBpZiAocGF0aCkgewogICAgICBkZXRhaWwucGF0aCA9IHBhdGg7CiAgICB9CiAgICAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8oaW5zdCkuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGRldGFpbCB9KSk7CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAibm90aWZ5IiBlZmZlY3QuCiAgICoKICAgKiBEaXNwYXRjaGVzIGEgbm9uLWJ1YmJsaW5nIGV2ZW50IG5hbWVkIGBpbmZvLmV2ZW50TmFtZWAgb24gdGhlIGluc3RhbmNlCiAgICogd2l0aCBhIGRldGFpbCBvYmplY3QgY29udGFpbmluZyB0aGUgbmV3IGB2YWx1ZWAuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5Ob3RpZnlFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbywgaGFzUGF0aHMpIHsKICAgIGxldCByb290UHJvcGVydHkgPSBoYXNQYXRocyA/IFBvbHltZXIuUGF0aC5yb290KHByb3BlcnR5KSA6IHByb3BlcnR5OwogICAgbGV0IHBhdGggPSByb290UHJvcGVydHkgIT0gcHJvcGVydHkgPyBwcm9wZXJ0eSA6IG51bGw7CiAgICBsZXQgdmFsdWUgPSBwYXRoID8gUG9seW1lci5QYXRoLmdldChpbnN0LCBwYXRoKSA6IGluc3QuX19kYXRhW3Byb3BlcnR5XTsKICAgIGlmIChwYXRoICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgdmFsdWUgPSBwcm9wc1twcm9wZXJ0eV07ICAvLyBzcGVjaWZpY2FsbHkgZm9yIC5zcGxpY2VzCiAgICB9CiAgICBkaXNwYXRjaE5vdGlmeUV2ZW50KGluc3QsIGluZm8uZXZlbnROYW1lLCB2YWx1ZSwgcGF0aCk7CiAgfQoKICAvKioKICAgKiBIYW5kbGVyIGZ1bmN0aW9uIGZvciAyLXdheSBub3RpZmljYXRpb24gZXZlbnRzLiBSZWNlaXZlcyBjb250ZXh0CiAgICogaW5mb3JtYXRpb24gY2FwdHVyZWQgaW4gdGhlIGBhZGROb3RpZnlMaXN0ZW5lcmAgY2xvc3VyZSBmcm9tIHRoZQogICAqIGBfX25vdGlmeUxpc3RlbmVyc2AgbWV0YWRhdGEuCiAgICoKICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbm90aWZpZWQgcHJvcGVydHkgdG8gdGhlIGhvc3QgcHJvcGVydHkgb3IgcGF0aC4gIElmCiAgICogdGhlIGV2ZW50IGNvbnRhaW5lZCBwYXRoIGluZm9ybWF0aW9uLCB0cmFuc2xhdGUgdGhhdCBwYXRoIHRvIHRoZSBob3N0CiAgICogc2NvcGUncyBuYW1lIGZvciB0aGF0IHBhdGggZmlyc3QuCiAgICoKICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCBOb3RpZmljYXRpb24gZXZlbnQgKGUuZy4gJzxwcm9wZXJ0eT4tY2hhbmdlZCcpCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBIb3N0IGVsZW1lbnQgaW5zdGFuY2UgaGFuZGxpbmcgdGhlIG5vdGlmaWNhdGlvbiBldmVudAogICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tUHJvcCBDaGlsZCBlbGVtZW50IHByb3BlcnR5IHRoYXQgd2FzIGJvdW5kCiAgICogQHBhcmFtIHtzdHJpbmd9IHRvUGF0aCBIb3N0IHByb3BlcnR5L3BhdGggdGhhdCB3YXMgYm91bmQKICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5lZ2F0ZSBXaGV0aGVyIHRoZSBiaW5kaW5nIHdhcyBuZWdhdGVkCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGhhbmRsZU5vdGlmaWNhdGlvbihldmVudCwgaW5zdCwgZnJvbVByb3AsIHRvUGF0aCwgbmVnYXRlKSB7CiAgICBsZXQgdmFsdWU7CiAgICBsZXQgZGV0YWlsID0gLyoqIEB0eXBlIHtPYmplY3R9ICovKGV2ZW50LmRldGFpbCk7CiAgICBsZXQgZnJvbVBhdGggPSBkZXRhaWwgJiYgZGV0YWlsLnBhdGg7CiAgICBpZiAoZnJvbVBhdGgpIHsKICAgICAgdG9QYXRoID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShmcm9tUHJvcCwgdG9QYXRoLCBmcm9tUGF0aCk7CiAgICAgIHZhbHVlID0gZGV0YWlsICYmIGRldGFpbC52YWx1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHZhbHVlID0gZXZlbnQuY3VycmVudFRhcmdldFtmcm9tUHJvcF07CiAgICB9CiAgICB2YWx1ZSA9IG5lZ2F0ZSA/ICF2YWx1ZSA6IHZhbHVlOwogICAgaWYgKCFpbnN0W1RZUEVTLlJFQURfT05MWV0gfHwgIWluc3RbVFlQRVMuUkVBRF9PTkxZXVt0b1BhdGhdKSB7CiAgICAgIGlmIChpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgodG9QYXRoLCB2YWx1ZSwgdHJ1ZSwgQm9vbGVhbihmcm9tUGF0aCkpCiAgICAgICAgJiYgKCFkZXRhaWwgfHwgIWRldGFpbC5xdWV1ZVByb3BlcnR5KSkgewogICAgICAgIGluc3QuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qKgogICAqIEltcGxlbWVudHMgdGhlICJyZWZsZWN0IiBlZmZlY3QuCiAgICoKICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgbmFtZWQgYGluZm8uYXR0ck5hbWVgIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eSB2YWx1ZS4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7P30gaW5mbyBFZmZlY3QgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcnVuUmVmbGVjdEVmZmVjdChpbnN0LCBwcm9wZXJ0eSwgcHJvcHMsIG9sZFByb3BzLCBpbmZvKSB7CiAgICBsZXQgdmFsdWUgPSBpbnN0Ll9fZGF0YVtwcm9wZXJ0eV07CiAgICBpZiAoUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlKSB7CiAgICAgIHZhbHVlID0gUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlKHZhbHVlLCBpbmZvLmF0dHJOYW1lLCAnYXR0cmlidXRlJywgLyoqIEB0eXBlIHtOb2RlfSAqLyhpbnN0KSk7CiAgICB9CiAgICBpbnN0Ll9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBpbmZvLmF0dHJOYW1lLCB2YWx1ZSk7CiAgfQoKICAvKioKICAgKiBSdW5zICJjb21wdXRlZCIgZWZmZWN0cyBmb3IgYSBzZXQgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzLgogICAqCiAgICogVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIHRoZSBnZW5lcmljIGBydW5FZmZlY3RzYCBtZXRob2QgaW4gdGhhdCBpdAogICAqIGNvbnRpbnVlcyB0byBydW4gY29tcHV0ZWQgZWZmZWN0cyBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIGVhY2ggcGFzcyB1bnRpbAogICAqIHRoZXJlIGFyZSBubyBtb3JlIG5ld2x5IGNvbXB1dGVkIHByb3BlcnRpZXMuICBUaGlzIGVuc3VyZXMgdGhhdCBhbGwKICAgKiBwcm9wZXJ0aWVzIHRoYXQgd2lsbCBiZSBjb21wdXRlZCBieSB0aGUgaW5pdGlhbCBzZXQgb2YgY2hhbmdlcyBhcmUKICAgKiBjb21wdXRlZCBiZWZvcmUgb3RoZXIgZWZmZWN0cyAoYmluZGluZyBwcm9wYWdhdGlvbiwgb2JzZXJ2ZXJzLCBhbmQgbm90aWZ5KQogICAqIHJ1bi4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0geyFPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHshT2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkNvbXB1dGVkRWZmZWN0cyhpbnN0LCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocykgewogICAgbGV0IGNvbXB1dGVFZmZlY3RzID0gaW5zdFtUWVBFUy5DT01QVVRFXTsKICAgIGlmIChjb21wdXRlRWZmZWN0cykgewogICAgICBsZXQgaW5wdXRQcm9wcyA9IGNoYW5nZWRQcm9wczsKICAgICAgd2hpbGUgKHJ1bkVmZmVjdHMoaW5zdCwgY29tcHV0ZUVmZmVjdHMsIGlucHV0UHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocykpIHsKICAgICAgICBPYmplY3QuYXNzaWduKG9sZFByb3BzLCBpbnN0Ll9fZGF0YU9sZCk7CiAgICAgICAgT2JqZWN0LmFzc2lnbihjaGFuZ2VkUHJvcHMsIGluc3QuX19kYXRhUGVuZGluZyk7CiAgICAgICAgaW5wdXRQcm9wcyA9IGluc3QuX19kYXRhUGVuZGluZzsKICAgICAgICBpbnN0Ll9fZGF0YVBlbmRpbmcgPSBudWxsOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAiY29tcHV0ZWQgcHJvcGVydHkiIGVmZmVjdCBieSBydW5uaW5nIHRoZSBtZXRob2Qgd2l0aCB0aGUKICAgKiB2YWx1ZXMgb2YgdGhlIGFyZ3VtZW50cyBzcGVjaWZpZWQgaW4gdGhlIGBpbmZvYCBvYmplY3QgYW5kIHNldHRpbmcgdGhlCiAgICogcmV0dXJuIHZhbHVlIHRvIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSBzcGVjaWZpZWQuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkNvbXB1dGVkRWZmZWN0KGluc3QsIHByb3BlcnR5LCBwcm9wcywgb2xkUHJvcHMsIGluZm8pIHsKICAgIGxldCByZXN1bHQgPSBydW5NZXRob2RFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbyk7CiAgICBsZXQgY29tcHV0ZWRQcm9wID0gaW5mby5tZXRob2RJbmZvOwogICAgaWYgKGluc3QuX19kYXRhSGFzQWNjZXNzb3IgJiYgaW5zdC5fX2RhdGFIYXNBY2Nlc3Nvcltjb21wdXRlZFByb3BdKSB7CiAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eShjb21wdXRlZFByb3AsIHJlc3VsdCwgdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBpbnN0W2NvbXB1dGVkUHJvcF0gPSByZXN1bHQ7CiAgICB9CiAgfQoKICAvKioKICAgKiBDb21wdXRlcyBwYXRoIGNoYW5nZXMgYmFzZWQgb24gcGF0aCBsaW5rcyBzZXQgdXAgdXNpbmcgdGhlIGBsaW5rUGF0aHNgCiAgICogQVBJLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugd2hvc2UgcHJvcHMgYXJlIGNoYW5naW5nCiAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8KHN0cmluZ3xudW1iZXIpPn0gcGF0aCBQYXRoIHRoYXQgaGFzIGNoYW5nZWQKICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIG9mIGNoYW5nZWQgcGF0aAogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBjb21wdXRlTGlua2VkUGF0aHMoaW5zdCwgcGF0aCwgdmFsdWUpIHsKICAgIGxldCBsaW5rcyA9IGluc3QuX19kYXRhTGlua2VkUGF0aHM7CiAgICBpZiAobGlua3MpIHsKICAgICAgbGV0IGxpbms7CiAgICAgIGZvciAobGV0IGEgaW4gbGlua3MpIHsKICAgICAgICBsZXQgYiA9IGxpbmtzW2FdOwogICAgICAgIGlmIChQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KGEsIHBhdGgpKSB7CiAgICAgICAgICBsaW5rID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShhLCBiLCBwYXRoKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChsaW5rLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgfSBlbHNlIGlmIChQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KGIsIHBhdGgpKSB7CiAgICAgICAgICBsaW5rID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShiLCBhLCBwYXRoKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChsaW5rLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLyAtLSBiaW5kaW5ncyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8qKgogICAqIEFkZHMgYmluZGluZyBtZXRhZGF0YSB0byB0aGUgY3VycmVudCBgbm9kZUluZm9gLCBhbmQgYmluZGluZyBlZmZlY3RzCiAgICogZm9yIGFsbCBwYXJ0IGRlcGVuZGVuY2llcyB0byBgdGVtcGxhdGVJbmZvYC4KICAgKgogICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yIENsYXNzIHRoYXQgYF9wYXJzZVRlbXBsYXRlYCBpcyBjdXJyZW50bHkKICAgKiAgIHJ1bm5pbmcgb24KICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICogQHBhcmFtIHtzdHJpbmd9IGtpbmQgQmluZGluZyBraW5kLCBlaXRoZXIgJ3Byb3BlcnR5JywgJ2F0dHJpYnV0ZScsIG9yICd0ZXh0JwogICAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgVGFyZ2V0IHByb3BlcnR5IG5hbWUKICAgKiBAcGFyYW0geyFBcnJheTwhQmluZGluZ1BhcnQ+fSBwYXJ0cyBBcnJheSBvZiBiaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcGFyYW0ge3N0cmluZz19IGxpdGVyYWwgTGl0ZXJhbCB0ZXh0IHN1cnJvdW5kaW5nIGJpbmRpbmcgcGFydHMgKHNwZWNpZmllZAogICAqICAgb25seSBmb3IgJ3Byb3BlcnR5JyBiaW5kaW5ncywgc2luY2UgdGhlc2UgbXVzdCBiZSBpbml0aWFsaXplZCBhcyBwYXJ0CiAgICogICBvZiBib290LXVwKQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBhZGRCaW5kaW5nKGNvbnN0cnVjdG9yLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCBraW5kLCB0YXJnZXQsIHBhcnRzLCBsaXRlcmFsKSB7CiAgICAvLyBDcmVhdGUgYmluZGluZyBtZXRhZGF0YSBhbmQgYWRkIHRvIG5vZGVJbmZvCiAgICBub2RlSW5mby5iaW5kaW5ncyA9IG5vZGVJbmZvLmJpbmRpbmdzIHx8IFtdOwogICAgbGV0IC8qKiBCaW5kaW5nICovIGJpbmRpbmcgPSB7IGtpbmQsIHRhcmdldCwgcGFydHMsIGxpdGVyYWwsIGlzQ29tcG91bmQ6IChwYXJ0cy5sZW5ndGggIT09IDEpIH07CiAgICBub2RlSW5mby5iaW5kaW5ncy5wdXNoKGJpbmRpbmcpOwogICAgLy8gQWRkIGxpc3RlbmVyIGluZm8gdG8gYmluZGluZyBtZXRhZGF0YQogICAgaWYgKHNob3VsZEFkZExpc3RlbmVyKGJpbmRpbmcpKSB7CiAgICAgIGxldCB7ZXZlbnQsIG5lZ2F0ZX0gPSBiaW5kaW5nLnBhcnRzWzBdOwogICAgICBiaW5kaW5nLmxpc3RlbmVyRXZlbnQgPSBldmVudCB8fCAoQ2FzZU1hcC5jYW1lbFRvRGFzaENhc2UodGFyZ2V0KSArICctY2hhbmdlZCcpOwogICAgICBiaW5kaW5nLmxpc3RlbmVyTmVnYXRlID0gbmVnYXRlOwogICAgfQogICAgLy8gQWRkICJwcm9wYWdhdGUiIHByb3BlcnR5IGVmZmVjdHMgdG8gdGVtcGxhdGVJbmZvCiAgICBsZXQgaW5kZXggPSB0ZW1wbGF0ZUluZm8ubm9kZUluZm9MaXN0Lmxlbmd0aDsKICAgIGZvciAobGV0IGk9MDsgaTxiaW5kaW5nLnBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBwYXJ0ID0gYmluZGluZy5wYXJ0c1tpXTsKICAgICAgcGFydC5jb21wb3VuZEluZGV4ID0gaTsKICAgICAgYWRkRWZmZWN0Rm9yQmluZGluZ1BhcnQoY29uc3RydWN0b3IsIHRlbXBsYXRlSW5mbywgYmluZGluZywgcGFydCwgaW5kZXgpOwogICAgfQogIH0KCiAgLyoqCiAgICogQWRkcyBwcm9wZXJ0eSBlZmZlY3RzIHRvIHRoZSBnaXZlbiBgdGVtcGxhdGVJbmZvYCBmb3IgdGhlIGdpdmVuIGJpbmRpbmcKICAgKiBwYXJ0LgogICAqCiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29uc3RydWN0b3IgQ2xhc3MgdGhhdCBgX3BhcnNlVGVtcGxhdGVgIGlzIGN1cnJlbnRseQogICAqICAgcnVubmluZyBvbgogICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcGFyYW0geyFCaW5kaW5nUGFydH0gcGFydCBCaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggaW50byBgbm9kZUluZm9MaXN0YCBmb3IgdGhpcyBub2RlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBmdW5jdGlvbiBhZGRFZmZlY3RGb3JCaW5kaW5nUGFydChjb25zdHJ1Y3RvciwgdGVtcGxhdGVJbmZvLCBiaW5kaW5nLCBwYXJ0LCBpbmRleCkgewogICAgaWYgKCFwYXJ0LmxpdGVyYWwpIHsKICAgICAgaWYgKGJpbmRpbmcua2luZCA9PT0gJ2F0dHJpYnV0ZScgJiYgYmluZGluZy50YXJnZXRbMF0gPT09ICctJykgewogICAgICAgIGNvbnNvbGUud2FybignQ2Fubm90IHNldCBhdHRyaWJ1dGUgJyArIGJpbmRpbmcudGFyZ2V0ICsKICAgICAgICAgICcgYmVjYXVzZSAiLSIgaXMgbm90IGEgdmFsaWQgYXR0cmlidXRlIHN0YXJ0aW5nIGNoYXJhY3RlcicpOwogICAgICB9IGVsc2UgewogICAgICAgIGxldCBkZXBlbmRlbmNpZXMgPSBwYXJ0LmRlcGVuZGVuY2llczsKICAgICAgICBsZXQgaW5mbyA9IHsgaW5kZXgsIGJpbmRpbmcsIHBhcnQsIGV2YWx1YXRvcjogY29uc3RydWN0b3IgfTsKICAgICAgICBmb3IgKGxldCBqPTA7IGo8ZGVwZW5kZW5jaWVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBsZXQgdHJpZ2dlciA9IGRlcGVuZGVuY2llc1tqXTsKICAgICAgICAgIGlmICh0eXBlb2YgdHJpZ2dlciA9PSAnc3RyaW5nJykgewogICAgICAgICAgICB0cmlnZ2VyID0gcGFyc2VBcmcodHJpZ2dlcik7CiAgICAgICAgICAgIHRyaWdnZXIud2lsZGNhcmQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgY29uc3RydWN0b3IuX2FkZFRlbXBsYXRlUHJvcGVydHlFZmZlY3QodGVtcGxhdGVJbmZvLCB0cmlnZ2VyLnJvb3RQcm9wZXJ0eSwgewogICAgICAgICAgICBmbjogcnVuQmluZGluZ0VmZmVjdCwKICAgICAgICAgICAgaW5mbywgdHJpZ2dlcgogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAiYmluZGluZyIgKHByb3BlcnR5L3BhdGggYmluZGluZykgZWZmZWN0LgogICAqCiAgICogTm90ZSB0aGF0IGJpbmRpbmcgc3ludGF4IGlzIG92ZXJyaWRhYmxlIHZpYSBgX3BhcnNlQmluZGluZ3NgIGFuZAogICAqIGBfZXZhbHVhdGVCaW5kaW5nYC4gIFRoaXMgbWV0aG9kIHdpbGwgY2FsbCBgX2V2YWx1YXRlQmluZGluZ2AgZm9yIGFueQogICAqIG5vbi1saXRlcmFsIHBhcnRzIHJldHVybmVkIGZyb20gYF9wYXJzZUJpbmRpbmdzYC4gIEhvd2V2ZXIsCiAgICogdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgX3BhdGhfIGJpbmRpbmdzIHZpYSBjdXN0b20gYmluZGluZyBwYXJ0cywKICAgKiBhcyB0aGlzIGlzIHNwZWNpZmljIHRvIFBvbHltZXIncyBwYXRoIGJpbmRpbmcgc3ludGF4LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2UgdGhlIGVmZmVjdCB3aWxsIGJlIHJ1biBvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEBwYXJhbSB7QXJyYXl9IG5vZGVMaXN0IExpc3Qgb2Ygbm9kZXMgYXNzb2NpYXRlZCB3aXRoIGBub2RlSW5mb0xpc3RgIHRlbXBsYXRlCiAgICogICBtZXRhZGF0YQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5CaW5kaW5nRWZmZWN0KGluc3QsIHBhdGgsIHByb3BzLCBvbGRQcm9wcywgaW5mbywgaGFzUGF0aHMsIG5vZGVMaXN0KSB7CiAgICBsZXQgbm9kZSA9IG5vZGVMaXN0W2luZm8uaW5kZXhdOwogICAgbGV0IGJpbmRpbmcgPSBpbmZvLmJpbmRpbmc7CiAgICBsZXQgcGFydCA9IGluZm8ucGFydDsKICAgIC8vIFN1YnBhdGggbm90aWZpY2F0aW9uOiB0cmFuc2Zvcm0gcGF0aCBhbmQgc2V0IHRvIGNsaWVudAogICAgLy8gZS5nLjogZm9vPSJ7e29iai5zdWJ9fSIsIHBhdGg6ICdvYmouc3ViLnByb3AnLCBzZXQgJ2Zvby5wcm9wJz1vYmouc3ViLnByb3AKICAgIGlmIChoYXNQYXRocyAmJiBwYXJ0LnNvdXJjZSAmJiAocGF0aC5sZW5ndGggPiBwYXJ0LnNvdXJjZS5sZW5ndGgpICYmCiAgICAgICAgKGJpbmRpbmcua2luZCA9PSAncHJvcGVydHknKSAmJiAhYmluZGluZy5pc0NvbXBvdW5kICYmCiAgICAgICAgbm9kZS5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50ICYmCiAgICAgICAgbm9kZS5fX2RhdGFIYXNBY2Nlc3NvciAmJiBub2RlLl9fZGF0YUhhc0FjY2Vzc29yW2JpbmRpbmcudGFyZ2V0XSkgewogICAgICBsZXQgdmFsdWUgPSBwcm9wc1twYXRoXTsKICAgICAgcGF0aCA9IFBvbHltZXIuUGF0aC50cmFuc2xhdGUocGFydC5zb3VyY2UsIGJpbmRpbmcudGFyZ2V0LCBwYXRoKTsKICAgICAgaWYgKG5vZGUuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChwYXRoLCB2YWx1ZSwgZmFsc2UsIHRydWUpKSB7CiAgICAgICAgaW5zdC5fZW5xdWV1ZUNsaWVudChub2RlKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbGV0IHZhbHVlID0gaW5mby5ldmFsdWF0b3IuX2V2YWx1YXRlQmluZGluZyhpbnN0LCBwYXJ0LCBwYXRoLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgLy8gUHJvcGFnYXRlIHZhbHVlIHRvIGNoaWxkCiAgICAgIGFwcGx5QmluZGluZ1ZhbHVlKGluc3QsIG5vZGUsIGJpbmRpbmcsIHBhcnQsIHZhbHVlKTsKICAgIH0KICB9CgogIC8qKgogICAqIFNldHMgdGhlIHZhbHVlIGZvciBhbiAiYmluZGluZyIgKGJpbmRpbmcpIGVmZmVjdCB0byBhIG5vZGUsCiAgICogZWl0aGVyIGFzIGEgcHJvcGVydHkgb3IgYXR0cmlidXRlLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugb3duaW5nIHRoZSBiaW5kaW5nIGVmZmVjdAogICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBUYXJnZXQgbm9kZSBmb3IgYmluZGluZwogICAqIEBwYXJhbSB7IUJpbmRpbmd9IGJpbmRpbmcgQmluZGluZyBtZXRhZGF0YQogICAqIEBwYXJhbSB7IUJpbmRpbmdQYXJ0fSBwYXJ0IEJpbmRpbmcgcGFydCBtZXRhZGF0YQogICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGFwcGx5QmluZGluZ1ZhbHVlKGluc3QsIG5vZGUsIGJpbmRpbmcsIHBhcnQsIHZhbHVlKSB7CiAgICB2YWx1ZSA9IGNvbXB1dGVCaW5kaW5nVmFsdWUobm9kZSwgdmFsdWUsIGJpbmRpbmcsIHBhcnQpOwogICAgaWYgKFBvbHltZXIuc2FuaXRpemVET01WYWx1ZSkgewogICAgICB2YWx1ZSA9IFBvbHltZXIuc2FuaXRpemVET01WYWx1ZSh2YWx1ZSwgYmluZGluZy50YXJnZXQsIGJpbmRpbmcua2luZCwgbm9kZSk7CiAgICB9CiAgICBpZiAoYmluZGluZy5raW5kID09ICdhdHRyaWJ1dGUnKSB7CiAgICAgIC8vIEF0dHJpYnV0ZSBiaW5kaW5nCiAgICAgIGluc3QuX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKC8qKiBAdHlwZSB7RWxlbWVudH0gKi8obm9kZSksIHZhbHVlLCBiaW5kaW5nLnRhcmdldCk7CiAgICB9IGVsc2UgewogICAgICAvLyBQcm9wZXJ0eSBiaW5kaW5nCiAgICAgIGxldCBwcm9wID0gYmluZGluZy50YXJnZXQ7CiAgICAgIGlmIChub2RlLl9faXNQcm9wZXJ0eUVmZmVjdHNDbGllbnQgJiYKICAgICAgICAgIG5vZGUuX19kYXRhSGFzQWNjZXNzb3IgJiYgbm9kZS5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wXSkgewogICAgICAgIGlmICghbm9kZVtUWVBFUy5SRUFEX09OTFldIHx8ICFub2RlW1RZUEVTLlJFQURfT05MWV1bcHJvcF0pIHsKICAgICAgICAgIGlmIChub2RlLl9zZXRQZW5kaW5nUHJvcGVydHkocHJvcCwgdmFsdWUpKSB7CiAgICAgICAgICAgIGluc3QuX2VucXVldWVDbGllbnQobm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgIHsKICAgICAgICBpbnN0Ll9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZShub2RlLCBwcm9wLCB2YWx1ZSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qKgogICAqIFRyYW5zZm9ybXMgYW4gImJpbmRpbmciIGVmZmVjdCB2YWx1ZSBiYXNlZCBvbiBjb21wb3VuZCAmIG5lZ2F0aW9uCiAgICogZWZmZWN0IG1ldGFkYXRhLCBhcyB3ZWxsIGFzIGhhbmRsaW5nIGZvciBzcGVjaWFsLWNhc2UgcHJvcGVydGllcwogICAqCiAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgdGhlIHZhbHVlIHdpbGwgYmUgc2V0IHRvCiAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcGFyYW0geyFCaW5kaW5nUGFydH0gcGFydCBCaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHsqfSBUcmFuc2Zvcm1lZCB2YWx1ZSB0byBzZXQKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGNvbXB1dGVCaW5kaW5nVmFsdWUobm9kZSwgdmFsdWUsIGJpbmRpbmcsIHBhcnQpIHsKICAgIGlmIChiaW5kaW5nLmlzQ29tcG91bmQpIHsKICAgICAgbGV0IHN0b3JhZ2UgPSBub2RlLl9fZGF0YUNvbXBvdW5kU3RvcmFnZVtiaW5kaW5nLnRhcmdldF07CiAgICAgIHN0b3JhZ2VbcGFydC5jb21wb3VuZEluZGV4XSA9IHZhbHVlOwogICAgICB2YWx1ZSA9IHN0b3JhZ2Uuam9pbignJyk7CiAgICB9CiAgICBpZiAoYmluZGluZy5raW5kICE9PSAnYXR0cmlidXRlJykgewogICAgICAvLyBTb21lIGJyb3dzZXJzIHNlcmlhbGl6ZSBgdW5kZWZpbmVkYCB0byBgInVuZGVmaW5lZCJgCiAgICAgIGlmIChiaW5kaW5nLnRhcmdldCA9PT0gJ3RleHRDb250ZW50JyB8fAogICAgICAgICAgKGJpbmRpbmcudGFyZ2V0ID09PSAndmFsdWUnICYmCiAgICAgICAgICAgIChub2RlLmxvY2FsTmFtZSA9PT0gJ2lucHV0JyB8fCBub2RlLmxvY2FsTmFtZSA9PT0gJ3RleHRhcmVhJykpKSB7CiAgICAgICAgdmFsdWUgPSB2YWx1ZSA9PSB1bmRlZmluZWQgPyAnJyA6IHZhbHVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgYSBiaW5kaW5nJ3MgbWV0YWRhdGEgbWVldHMgYWxsIHRoZSByZXF1aXJlbWVudHMgdG8gYWxsb3cKICAgKiAyLXdheSBiaW5kaW5nLCBhbmQgdGhlcmVmb3JlIGEgYDxwcm9wZXJ0eT4tY2hhbmdlZGAgZXZlbnQgbGlzdGVuZXIgc2hvdWxkIGJlCiAgICogYWRkZWQ6CiAgICogLSB1c2VkIGN1cmx5IGJyYWNlcwogICAqIC0gaXMgYSBwcm9wZXJ0eSAobm90IGF0dHJpYnV0ZSkgYmluZGluZwogICAqIC0gaXMgbm90IGEgdGV4dENvbnRlbnQgYmluZGluZwogICAqIC0gaXMgbm90IGNvbXBvdW5kCiAgICoKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIDItd2F5IGxpc3RlbmVyIHNob3VsZCBiZSBhZGRlZAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gc2hvdWxkQWRkTGlzdGVuZXIoYmluZGluZykgewogICAgcmV0dXJuIEJvb2xlYW4oYmluZGluZy50YXJnZXQpICYmCiAgICAgICAgICAgYmluZGluZy5raW5kICE9ICdhdHRyaWJ1dGUnICYmCiAgICAgICAgICAgYmluZGluZy5raW5kICE9ICd0ZXh0JyAmJgogICAgICAgICAgICFiaW5kaW5nLmlzQ29tcG91bmQgJiYKICAgICAgICAgICBiaW5kaW5nLnBhcnRzWzBdLm1vZGUgPT09ICd7JzsKICB9CgogIC8qKgogICAqIFNldHVwIGNvbXBvdW5kIGJpbmRpbmcgc3RvcmFnZSBzdHJ1Y3R1cmVzLCBub3RpZnkgbGlzdGVuZXJzLCBhbmQgZGF0YUhvc3QKICAgKiByZWZlcmVuY2VzIG9udG8gdGhlIGJvdW5kIG5vZGVMaXN0LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBJbnN0YW5jZSB0aGF0IGJhcyBiZWVuIHByZXZpb3VzbHkgYm91bmQKICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNldHVwQmluZGluZ3MoaW5zdCwgdGVtcGxhdGVJbmZvKSB7CiAgICAvLyBTZXR1cCBjb21wb3VuZCBzdG9yYWdlLCBkYXRhSG9zdCwgYW5kIG5vdGlmeSBsaXN0ZW5lcnMKICAgIGxldCB7bm9kZUxpc3QsIG5vZGVJbmZvTGlzdH0gPSB0ZW1wbGF0ZUluZm87CiAgICBpZiAobm9kZUluZm9MaXN0Lmxlbmd0aCkgewogICAgICBmb3IgKGxldCBpPTA7IGkgPCBub2RlSW5mb0xpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgaW5mbyA9IG5vZGVJbmZvTGlzdFtpXTsKICAgICAgICBsZXQgbm9kZSA9IG5vZGVMaXN0W2ldOwogICAgICAgIGxldCBiaW5kaW5ncyA9IGluZm8uYmluZGluZ3M7CiAgICAgICAgaWYgKGJpbmRpbmdzKSB7CiAgICAgICAgICBmb3IgKGxldCBpPTA7IGk8YmluZGluZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGJpbmRpbmcgPSBiaW5kaW5nc1tpXTsKICAgICAgICAgICAgc2V0dXBDb21wb3VuZFN0b3JhZ2Uobm9kZSwgYmluZGluZyk7CiAgICAgICAgICAgIGFkZE5vdGlmeUxpc3RlbmVyKG5vZGUsIGluc3QsIGJpbmRpbmcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBub2RlLl9fZGF0YUhvc3QgPSBpbnN0OwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbml0aWFsaXplcyBgX19kYXRhQ29tcG91bmRTdG9yYWdlYCBsb2NhbCBzdG9yYWdlIG9uIGEgYm91bmQgbm9kZSB3aXRoCiAgICogaW5pdGlhbCBsaXRlcmFsIGRhdGEgZm9yIGNvbXBvdW5kIGJpbmRpbmdzLCBhbmQgc2V0cyB0aGUgam9pbmVkCiAgICogbGl0ZXJhbCBwYXJ0cyB0byB0aGUgYm91bmQgcHJvcGVydHkuCiAgICoKICAgKiBXaGVuIGNoYW5nZXMgdG8gY29tcG91bmQgcGFydHMgb2NjdXIsIHRoZXkgYXJlIGZpcnN0IHNldCBpbnRvIHRoZSBjb21wb3VuZAogICAqIHN0b3JhZ2UgYXJyYXkgZm9yIHRoYXQgcHJvcGVydHksIGFuZCB0aGVuIHRoZSBhcnJheSBpcyBqb2luZWQgdG8gcmVzdWx0IGluCiAgICogdGhlIGZpbmFsIHZhbHVlIHNldCB0byB0aGUgcHJvcGVydHkvYXR0cmlidXRlLgogICAqCiAgICogQHBhcmFtIHtOb2RlfSBub2RlIEJvdW5kIG5vZGUgdG8gaW5pdGlhbGl6ZQogICAqIEBwYXJhbSB7QmluZGluZ30gYmluZGluZyBCaW5kaW5nIG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNldHVwQ29tcG91bmRTdG9yYWdlKG5vZGUsIGJpbmRpbmcpIHsKICAgIGlmIChiaW5kaW5nLmlzQ29tcG91bmQpIHsKICAgICAgLy8gQ3JlYXRlIGNvbXBvdW5kIHN0b3JhZ2UgbWFwCiAgICAgIGxldCBzdG9yYWdlID0gbm9kZS5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgfHwKICAgICAgICAobm9kZS5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgPSB7fSk7CiAgICAgIGxldCBwYXJ0cyA9IGJpbmRpbmcucGFydHM7CiAgICAgIC8vIENvcHkgbGl0ZXJhbHMgZnJvbSBwYXJ0cyBpbnRvIHN0b3JhZ2UgZm9yIHRoaXMgYmluZGluZwogICAgICBsZXQgbGl0ZXJhbHMgPSBuZXcgQXJyYXkocGFydHMubGVuZ3RoKTsKICAgICAgZm9yIChsZXQgaj0wOyBqPHBhcnRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgbGl0ZXJhbHNbal0gPSBwYXJ0c1tqXS5saXRlcmFsOwogICAgICB9CiAgICAgIGxldCB0YXJnZXQgPSBiaW5kaW5nLnRhcmdldDsKICAgICAgc3RvcmFnZVt0YXJnZXRdID0gbGl0ZXJhbHM7CiAgICAgIC8vIENvbmZpZ3VyZSBwcm9wZXJ0aWVzIHdpdGggdGhlaXIgbGl0ZXJhbCBwYXJ0cwogICAgICBpZiAoYmluZGluZy5saXRlcmFsICYmIGJpbmRpbmcua2luZCA9PSAncHJvcGVydHknKSB7CiAgICAgICAgbm9kZVt0YXJnZXRdID0gYmluZGluZy5saXRlcmFsOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBBZGRzIGEgMi13YXkgYmluZGluZyBub3RpZmljYXRpb24gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG5vZGUgc3BlY2lmaWVkCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gbm9kZSBDaGlsZCBlbGVtZW50IHRvIGFkZCBsaXN0ZW5lciB0bwogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSG9zdCBlbGVtZW50IGluc3RhbmNlIHRvIGhhbmRsZSBub3RpZmljYXRpb24gZXZlbnQKICAgKiBAcGFyYW0ge0JpbmRpbmd9IGJpbmRpbmcgQmluZGluZyBtZXRhZGF0YQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBhZGROb3RpZnlMaXN0ZW5lcihub2RlLCBpbnN0LCBiaW5kaW5nKSB7CiAgICBpZiAoYmluZGluZy5saXN0ZW5lckV2ZW50KSB7CiAgICAgIGxldCBwYXJ0ID0gYmluZGluZy5wYXJ0c1swXTsKICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGJpbmRpbmcubGlzdGVuZXJFdmVudCwgZnVuY3Rpb24oZSkgewogICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihlLCBpbnN0LCBiaW5kaW5nLnRhcmdldCwgcGFydC5zb3VyY2UsIHBhcnQubmVnYXRlKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICAvLyAtLSBmb3IgbWV0aG9kLWJhc2VkIGVmZmVjdHMgKGNvbXBsZXhPYnNlcnZlciAmIGNvbXB1dGVkKSAtLS0tLS0tLS0tLS0tLQoKICAvKioKICAgKiBBZGRzIHByb3BlcnR5IGVmZmVjdHMgZm9yIGVhY2ggYXJndW1lbnQgaW4gdGhlIG1ldGhvZCBzaWduYXR1cmUgKGFuZAogICAqIG9wdGlvbmFsbHksIGZvciB0aGUgbWV0aG9kIG5hbWUgaWYgYGR5bmFtaWNgIGlzIHRydWUpIHRoYXQgY2FsbHMgdGhlCiAgICogcHJvdmlkZWQgZWZmZWN0IGZ1bmN0aW9uLgogICAqCiAgICogQHBhcmFtIHtFbGVtZW50IHwgT2JqZWN0fSBtb2RlbCBQcm90b3R5cGUgb3IgaW5zdGFuY2UKICAgKiBAcGFyYW0geyFNZXRob2RTaWduYXR1cmV9IHNpZyBNZXRob2Qgc2lnbmF0dXJlIG1ldGFkYXRhCiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVHlwZSBvZiBwcm9wZXJ0eSBlZmZlY3QgdG8gYWRkCiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWZmZWN0Rm4gRnVuY3Rpb24gdG8gcnVuIHdoZW4gYXJndW1lbnRzIGNoYW5nZQogICAqIEBwYXJhbSB7Kj19IG1ldGhvZEluZm8gRWZmZWN0LXNwZWNpZmljIGluZm9ybWF0aW9uIHRvIGJlIGluY2x1ZGVkIGluCiAgICogICBtZXRob2QgZWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZyB3aGV0aGVyCiAgICogICBtZXRob2QgbmFtZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LiBOb3RlLAogICAqICAgZGVmYXVsdHMgdG8gdHJ1ZSBpZiB0aGUgc2lnbmF0dXJlIGlzIHN0YXRpYyAoc2lnLnN0YXRpYyBpcyB0cnVlKS4KICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gY3JlYXRlTWV0aG9kRWZmZWN0KG1vZGVsLCBzaWcsIHR5cGUsIGVmZmVjdEZuLCBtZXRob2RJbmZvLCBkeW5hbWljRm4pIHsKICAgIGR5bmFtaWNGbiA9IHNpZy5zdGF0aWMgfHwgKGR5bmFtaWNGbiAmJgogICAgICAodHlwZW9mIGR5bmFtaWNGbiAhPT0gJ29iamVjdCcgfHwgZHluYW1pY0ZuW3NpZy5tZXRob2ROYW1lXSkpOwogICAgbGV0IGluZm8gPSB7CiAgICAgIG1ldGhvZE5hbWU6IHNpZy5tZXRob2ROYW1lLAogICAgICBhcmdzOiBzaWcuYXJncywKICAgICAgbWV0aG9kSW5mbywKICAgICAgZHluYW1pY0ZuCiAgICB9OwogICAgZm9yIChsZXQgaT0wLCBhcmc7IChpPHNpZy5hcmdzLmxlbmd0aCkgJiYgKGFyZz1zaWcuYXJnc1tpXSk7IGkrKykgewogICAgICBpZiAoIWFyZy5saXRlcmFsKSB7CiAgICAgICAgbW9kZWwuX2FkZFByb3BlcnR5RWZmZWN0KGFyZy5yb290UHJvcGVydHksIHR5cGUsIHsKICAgICAgICAgIGZuOiBlZmZlY3RGbiwgaW5mbzogaW5mbywgdHJpZ2dlcjogYXJnCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChkeW5hbWljRm4pIHsKICAgICAgbW9kZWwuX2FkZFByb3BlcnR5RWZmZWN0KHNpZy5tZXRob2ROYW1lLCB0eXBlLCB7CiAgICAgICAgZm46IGVmZmVjdEZuLCBpbmZvOiBpbmZvCiAgICAgIH0pOwogICAgfQogIH0KCiAgLyoqCiAgICogQ2FsbHMgYSBtZXRob2Qgd2l0aCBhcmd1bWVudHMgbWFyc2hhbGVkIGZyb20gcHJvcGVydGllcyBvbiB0aGUgaW5zdGFuY2UKICAgKiBiYXNlZCBvbiB0aGUgbWV0aG9kIHNpZ25hdHVyZSBjb250YWluZWQgaW4gdGhlIGVmZmVjdCBtZXRhZGF0YS4KICAgKgogICAqIE11bHRpLXByb3BlcnR5IG9ic2VydmVycywgY29tcHV0ZWQgcHJvcGVydGllcywgYW5kIGlubGluZSBjb21wdXRpbmcKICAgKiBmdW5jdGlvbnMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGludm9rZSB0aGUgbWV0aG9kLCB0aGVuIHVzZSB0aGUgcmV0dXJuCiAgICogdmFsdWUgYWNjb3JkaW5nbHkuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHJldHVybiB7Kn0gUmV0dXJucyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIG1ldGhvZCBpbnZvY2F0aW9uCiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5NZXRob2RFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbykgewogICAgLy8gSW5zdGFuY2VzIGNhbiBvcHRpb25hbGx5IGhhdmUgYSBfbWV0aG9kSG9zdCB3aGljaCBhbGxvd3MgcmVkaXJlY3Rpbmcgd2hlcmUKICAgIC8vIHRvIGZpbmQgbWV0aG9kcy4gQ3VycmVudGx5IHVzZWQgYnkgYHRlbXBsYXRpemVgLgogICAgbGV0IGNvbnRleHQgPSBpbnN0Ll9tZXRob2RIb3N0IHx8IGluc3Q7CiAgICBsZXQgZm4gPSBjb250ZXh0W2luZm8ubWV0aG9kTmFtZV07CiAgICBpZiAoZm4pIHsKICAgICAgbGV0IGFyZ3MgPSBpbnN0Ll9tYXJzaGFsQXJncyhpbmZvLmFyZ3MsIHByb3BlcnR5LCBwcm9wcyk7CiAgICAgIHJldHVybiBmbi5hcHBseShjb250ZXh0LCBhcmdzKTsKICAgIH0gZWxzZSBpZiAoIWluZm8uZHluYW1pY0ZuKSB7CiAgICAgIGNvbnNvbGUud2FybignbWV0aG9kIGAnICsgaW5mby5tZXRob2ROYW1lICsgJ2Agbm90IGRlZmluZWQnKTsKICAgIH0KICB9CgogIGNvbnN0IGVtcHR5QXJyYXkgPSBbXTsKCiAgLy8gUmVndWxhciBleHByZXNzaW9ucyB1c2VkIGZvciBiaW5kaW5nCiAgY29uc3QgSURFTlQgID0gJyg/OicgKyAnW2EtekEtWl8kXVtcXHcuOiRcXC0qXSonICsgJyknOwogIGNvbnN0IE5VTUJFUiA9ICcoPzonICsgJ1stK10/WzAtOV0qXFwuP1swLTldKyg/OltlRV1bLStdP1swLTldKyk/JyArICcpJzsKICBjb25zdCBTUVVPVEVfU1RSSU5HID0gJyg/OicgKyAnXCcoPzpbXlwnXFxcXF18XFxcXC4pKlwnJyArICcpJzsKICBjb25zdCBEUVVPVEVfU1RSSU5HID0gJyg/OicgKyAnIig/OlteIlxcXFxdfFxcXFwuKSoiJyArICcpJzsKICBjb25zdCBTVFJJTkcgPSAnKD86JyArIFNRVU9URV9TVFJJTkcgKyAnfCcgKyBEUVVPVEVfU1RSSU5HICsgJyknOwogIGNvbnN0IEFSR1VNRU5UID0gJyg/OignICsgSURFTlQgKyAnfCcgKyBOVU1CRVIgKyAnfCcgKyAgU1RSSU5HICsgJylcXHMqJyArICcpJzsKICBjb25zdCBBUkdVTUVOVFMgPSAnKD86JyArIEFSR1VNRU5UICsgJyg/OixcXHMqJyArIEFSR1VNRU5UICsgJykqJyArICcpJzsKICBjb25zdCBBUkdVTUVOVF9MSVNUID0gJyg/OicgKyAnXFwoXFxzKicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoPzonICsgQVJHVU1FTlRTICsgJz8nICsgJyknICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcKVxccyonICsgJyknOwogIGNvbnN0IEJJTkRJTkcgPSAnKCcgKyBJREVOVCArICdcXHMqJyArIEFSR1VNRU5UX0xJU1QgKyAnPycgKyAnKSc7IC8vIEdyb3VwIDMKICBjb25zdCBPUEVOX0JSQUNLRVQgPSAnKFxcW1xcW3x7eyknICsgJ1xccyonOwogIGNvbnN0IENMT1NFX0JSQUNLRVQgPSAnKD86XV18fX0pJzsKICBjb25zdCBORUdBVEUgPSAnKD86KCEpXFxzKik/JzsgLy8gR3JvdXAgMgogIGNvbnN0IEVYUFJFU1NJT04gPSBPUEVOX0JSQUNLRVQgKyBORUdBVEUgKyBCSU5ESU5HICsgQ0xPU0VfQlJBQ0tFVDsKICBjb25zdCBiaW5kaW5nUmVnZXggPSBuZXcgUmVnRXhwKEVYUFJFU1NJT04sICJnIik7CgogIC8qKgogICAqIENyZWF0ZSBhIHN0cmluZyBmcm9tIGJpbmRpbmcgcGFydHMgb2YgYWxsIHRoZSBsaXRlcmFsIHBhcnRzCiAgICoKICAgKiBAcGFyYW0geyFBcnJheTxCaW5kaW5nUGFydD59IHBhcnRzIEFsbCBwYXJ0cyB0byBzdHJpbmdpZnkKICAgKiBAcmV0dXJuIHtzdHJpbmd9IFN0cmluZyBtYWRlIGZyb20gdGhlIGxpdGVyYWwgcGFydHMKICAgKi8KICBmdW5jdGlvbiBsaXRlcmFsRnJvbVBhcnRzKHBhcnRzKSB7CiAgICBsZXQgcyA9ICcnOwogICAgZm9yIChsZXQgaT0wOyBpPHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBsaXRlcmFsID0gcGFydHNbaV0ubGl0ZXJhbDsKICAgICAgcyArPSBsaXRlcmFsIHx8ICcnOwogICAgfQogICAgcmV0dXJuIHM7CiAgfQoKICAvKioKICAgKiBQYXJzZXMgYW4gZXhwcmVzc2lvbiBzdHJpbmcgZm9yIGEgbWV0aG9kIHNpZ25hdHVyZSwgYW5kIHJldHVybnMgYSBtZXRhZGF0YQogICAqIGRlc2NyaWJpbmcgdGhlIG1ldGhvZCBpbiB0ZXJtcyBvZiBgbWV0aG9kTmFtZWAsIGBzdGF0aWNgICh3aGV0aGVyIGFsbCB0aGUKICAgKiBhcmd1bWVudHMgYXJlIGxpdGVyYWxzKSwgYW5kIGFuIGFycmF5IG9mIGBhcmdzYAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdG8gcGFyc2UKICAgKiBAcmV0dXJuIHs/TWV0aG9kU2lnbmF0dXJlfSBUaGUgbWV0aG9kIG1ldGFkYXRhIG9iamVjdCBpZiBhIG1ldGhvZCBleHByZXNzaW9uIHdhcwogICAqICAgZm91bmQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcGFyc2VNZXRob2QoZXhwcmVzc2lvbikgewogICAgLy8gdHJpZXMgdG8gbWF0Y2ggdmFsaWQgamF2YXNjcmlwdCBwcm9wZXJ0eSBuYW1lcwogICAgbGV0IG0gPSBleHByZXNzaW9uLm1hdGNoKC8oW15cc10rPylcKChbXHNcU10qKVwpLyk7CiAgICBpZiAobSkgewogICAgICBsZXQgbWV0aG9kTmFtZSA9IG1bMV07CiAgICAgIGxldCBzaWcgPSB7IG1ldGhvZE5hbWUsIHN0YXRpYzogdHJ1ZSwgYXJnczogZW1wdHlBcnJheSB9OwogICAgICBpZiAobVsyXS50cmltKCkpIHsKICAgICAgICAvLyByZXBsYWNlIGVzY2FwZWQgY29tbWFzIHdpdGggY29tbWEgZW50aXR5LCBzcGxpdCBvbiB1bi1lc2NhcGVkIGNvbW1hcwogICAgICAgIGxldCBhcmdzID0gbVsyXS5yZXBsYWNlKC9cXCwvZywgJyZjb21tYTsnKS5zcGxpdCgnLCcpOwogICAgICAgIHJldHVybiBwYXJzZUFyZ3MoYXJncywgc2lnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gc2lnOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhbiBhcnJheSBvZiBhcmd1bWVudHMgYW5kIHNldHMgdGhlIGBhcmdzYCBwcm9wZXJ0eSBvZiB0aGUgc3VwcGxpZWQKICAgKiBzaWduYXR1cmUgbWV0YWRhdGEgb2JqZWN0LiBTZXRzIHRoZSBgc3RhdGljYCBwcm9wZXJ0eSB0byBmYWxzZSBpZiBhbnkKICAgKiBhcmd1bWVudCBpcyBhIG5vbi1saXRlcmFsLgogICAqCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gYXJnTGlzdCBBcnJheSBvZiBhcmd1bWVudCBuYW1lcwogICAqIEBwYXJhbSB7IU1ldGhvZFNpZ25hdHVyZX0gc2lnIE1ldGhvZCBzaWduYXR1cmUgbWV0YWRhdGEgb2JqZWN0CiAgICogQHJldHVybiB7IU1ldGhvZFNpZ25hdHVyZX0gVGhlIHVwZGF0ZWQgc2lnbmF0dXJlIG1ldGFkYXRhIG9iamVjdAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcGFyc2VBcmdzKGFyZ0xpc3QsIHNpZykgewogICAgc2lnLmFyZ3MgPSBhcmdMaXN0Lm1hcChmdW5jdGlvbihyYXdBcmcpIHsKICAgICAgbGV0IGFyZyA9IHBhcnNlQXJnKHJhd0FyZyk7CiAgICAgIGlmICghYXJnLmxpdGVyYWwpIHsKICAgICAgICBzaWcuc3RhdGljID0gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIGFyZzsKICAgIH0sIHRoaXMpOwogICAgcmV0dXJuIHNpZzsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhbiBpbmRpdmlkdWFsIGFyZ3VtZW50LCBhbmQgcmV0dXJucyBhbiBhcmd1bWVudCBtZXRhZGF0YSBvYmplY3QKICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgZmllbGRzOgogICAqCiAgICogICB7CiAgICogICAgIHZhbHVlOiAncHJvcCcsICAgICAgICAvLyBwcm9wZXJ0eS9wYXRoIG9yIGxpdGVyYWwgdmFsdWUKICAgKiAgICAgbGl0ZXJhbDogZmFsc2UsICAgICAgIC8vIHdoZXRoZXIgYXJndW1lbnQgaXMgYSBsaXRlcmFsCiAgICogICAgIHN0cnVjdHVyZWQ6IGZhbHNlLCAgICAvLyB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyBhIHBhdGgKICAgKiAgICAgcm9vdFByb3BlcnR5OiAncHJvcCcsIC8vIHRoZSByb290IHByb3BlcnR5IG9mIHRoZSBwYXRoCiAgICogICAgIHdpbGRjYXJkOiBmYWxzZSAgICAgICAvLyB3aGV0aGVyIHRoZSBhcmd1bWVudCB3YXMgYSB3aWxkY2FyZCAnLionIHBhdGgKICAgKiAgIH0KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSByYXdBcmcgVGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgYXJndW1lbnQKICAgKiBAcmV0dXJuIHshTWV0aG9kQXJnfSBBcmd1bWVudCBtZXRhZGF0YSBvYmplY3QKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHBhcnNlQXJnKHJhd0FyZykgewogICAgLy8gY2xlYW4gdXAgd2hpdGVzcGFjZQogICAgbGV0IGFyZyA9IHJhd0FyZy50cmltKCkKICAgICAgLy8gcmVwbGFjZSBjb21tYSBlbnRpdHkgd2l0aCBjb21tYQogICAgICAucmVwbGFjZSgvJmNvbW1hOy9nLCAnLCcpCiAgICAgIC8vIHJlcGFpciBleHRyYSBlc2NhcGUgc2VxdWVuY2VzOyBub3RlIG9ubHkgY29tbWFzIHN0cmljdGx5IG5lZWQKICAgICAgLy8gZXNjYXBpbmcsIGJ1dCB3ZSBhbGxvdyBhbnkgb3RoZXIgY2hhciB0byBiZSBlc2NhcGVkIHNpbmNlIGl0cwogICAgICAvLyBsaWtlbHkgdXNlcnMgd2lsbCBkbyB0aGlzCiAgICAgIC5yZXBsYWNlKC9cXCguKS9nLCAnXCQxJykKICAgICAgOwogICAgLy8gYmFzaWMgYXJndW1lbnQgZGVzY3JpcHRvcgogICAgbGV0IGEgPSB7CiAgICAgIG5hbWU6IGFyZywKICAgICAgdmFsdWU6ICcnLAogICAgICBsaXRlcmFsOiBmYWxzZQogICAgfTsKICAgIC8vIGRldGVjdCBsaXRlcmFsIHZhbHVlIChtdXN0IGJlIFN0cmluZyBvciBOdW1iZXIpCiAgICBsZXQgZmMgPSBhcmdbMF07CiAgICBpZiAoZmMgPT09ICctJykgewogICAgICBmYyA9IGFyZ1sxXTsKICAgIH0KICAgIGlmIChmYyA+PSAnMCcgJiYgZmMgPD0gJzknKSB7CiAgICAgIGZjID0gJyMnOwogICAgfQogICAgc3dpdGNoKGZjKSB7CiAgICAgIGNhc2UgIiciOgogICAgICBjYXNlICciJzoKICAgICAgICBhLnZhbHVlID0gYXJnLnNsaWNlKDEsIC0xKTsKICAgICAgICBhLmxpdGVyYWwgPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICcjJzoKICAgICAgICBhLnZhbHVlID0gTnVtYmVyKGFyZyk7CiAgICAgICAgYS5saXRlcmFsID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgIH0KICAgIC8vIGlmIG5vdCBsaXRlcmFsLCBsb29rIGZvciBzdHJ1Y3R1cmVkIHBhdGgKICAgIGlmICghYS5saXRlcmFsKSB7CiAgICAgIGEucm9vdFByb3BlcnR5ID0gUG9seW1lci5QYXRoLnJvb3QoYXJnKTsKICAgICAgLy8gZGV0ZWN0IHN0cnVjdHVyZWQgcGF0aCAoaGFzIGRvdHMpCiAgICAgIGEuc3RydWN0dXJlZCA9IFBvbHltZXIuUGF0aC5pc1BhdGgoYXJnKTsKICAgICAgaWYgKGEuc3RydWN0dXJlZCkgewogICAgICAgIGEud2lsZGNhcmQgPSAoYXJnLnNsaWNlKC0yKSA9PSAnLionKTsKICAgICAgICBpZiAoYS53aWxkY2FyZCkgewogICAgICAgICAgYS5uYW1lID0gYXJnLnNsaWNlKDAsIC0yKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBhOwogIH0KCiAgLy8gZGF0YSBhcGkKCiAgLyoqCiAgICogU2VuZHMgYXJyYXkgc3BsaWNlIG5vdGlmaWNhdGlvbnMgKGAuc3BsaWNlc2AgYW5kIGAubGVuZ3RoYCkKICAgKgogICAqIE5vdGU6IHRoaXMgaW1wbGVtZW50YXRpb24gb25seSBhY2NlcHRzIG5vcm1hbGl6ZWQgcGF0aHMKICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSW5zdGFuY2UgdG8gc2VuZCBub3RpZmljYXRpb25zIHRvCiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRoZSBtdXRhdGlvbnMgb2NjdXJyZWQgb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byB0aGUgYXJyYXkgdGhhdCB3YXMgbXV0YXRlZAogICAqIEBwYXJhbSB7QXJyYXl9IHNwbGljZXMgQXJyYXkgb2Ygc3BsaWNlIHJlY29yZHMKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5U3BsaWNlcyhpbnN0LCBhcnJheSwgcGF0aCwgc3BsaWNlcykgewogICAgbGV0IHNwbGljZXNQYXRoID0gcGF0aCArICcuc3BsaWNlcyc7CiAgICBpbnN0Lm5vdGlmeVBhdGgoc3BsaWNlc1BhdGgsIHsgaW5kZXhTcGxpY2VzOiBzcGxpY2VzIH0pOwogICAgaW5zdC5ub3RpZnlQYXRoKHBhdGggKyAnLmxlbmd0aCcsIGFycmF5Lmxlbmd0aCk7CiAgICAvLyBOdWxsIGhlcmUgdG8gYWxsb3cgcG90ZW50aWFsbHkgbGFyZ2Ugc3BsaWNlIHJlY29yZHMgdG8gYmUgR0MnZWQuCiAgICBpbnN0Ll9fZGF0YVtzcGxpY2VzUGF0aF0gPSB7aW5kZXhTcGxpY2VzOiBudWxsfTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBzcGxpY2UgcmVjb3JkIGFuZCBzZW5kcyBhbiBhcnJheSBzcGxpY2Ugbm90aWZpY2F0aW9uIGZvcgogICAqIHRoZSBkZXNjcmliZWQgbXV0YXRpb24KICAgKgogICAqIE5vdGU6IHRoaXMgaW1wbGVtZW50YXRpb24gb25seSBhY2NlcHRzIG5vcm1hbGl6ZWQgcGF0aHMKICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSW5zdGFuY2UgdG8gc2VuZCBub3RpZmljYXRpb25zIHRvCiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRoZSBtdXRhdGlvbnMgb2NjdXJyZWQgb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byB0aGUgYXJyYXkgdGhhdCB3YXMgbXV0YXRlZAogICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCBhdCB3aGljaCB0aGUgYXJyYXkgbXV0YXRpb24gb2NjdXJyZWQKICAgKiBAcGFyYW0ge251bWJlcn0gYWRkZWRDb3VudCBOdW1iZXIgb2YgYWRkZWQgaXRlbXMKICAgKiBAcGFyYW0ge0FycmF5fSByZW1vdmVkIEFycmF5IG9mIHJlbW92ZWQgaXRlbXMKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5U3BsaWNlKGluc3QsIGFycmF5LCBwYXRoLCBpbmRleCwgYWRkZWRDb3VudCwgcmVtb3ZlZCkgewogICAgbm90aWZ5U3BsaWNlcyhpbnN0LCBhcnJheSwgcGF0aCwgW3sKICAgICAgaW5kZXg6IGluZGV4LAogICAgICBhZGRlZENvdW50OiBhZGRlZENvdW50LAogICAgICByZW1vdmVkOiByZW1vdmVkLAogICAgICBvYmplY3Q6IGFycmF5LAogICAgICB0eXBlOiAnc3BsaWNlJwogICAgfV0pOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhbiB1cHBlci1jYXNlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBTdHJpbmcgdG8gdXBwZXJjYXNlCiAgICogQHJldHVybiB7c3RyaW5nfSBVcHBlcmNhc2VkIHN0cmluZwogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gdXBwZXIobmFtZSkgewogICAgcmV0dXJuIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyaW5nKDEpOwogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIG1ldGEtcHJvZ3JhbW1pbmcgZm9yIFBvbHltZXIncyB0ZW1wbGF0ZQogICAqIGJpbmRpbmcgYW5kIGRhdGEgb2JzZXJ2YXRpb24gKGNvbGxlY3RpdmVseSwgInByb3BlcnR5IGVmZmVjdHMiKSBzeXN0ZW0uCiAgICoKICAgKiBUaGlzIG1peGluIHVzZXMgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBrZXkgc3RhdGljIG1ldGhvZHMgZm9yIGFkZGluZwogICAqIHByb3BlcnR5IGVmZmVjdHMgdG8gYW4gZWxlbWVudCBjbGFzczoKICAgKiAtIGBhZGRQcm9wZXJ0eUVmZmVjdGAKICAgKiAtIGBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyYAogICAqIC0gYGNyZWF0ZU1ldGhvZE9ic2VydmVyYAogICAqIC0gYGNyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5YAogICAqIC0gYGNyZWF0ZVJlYWRPbmx5UHJvcGVydHlgCiAgICogLSBgY3JlYXRlUmVmbGVjdGVkUHJvcGVydHlgCiAgICogLSBgY3JlYXRlQ29tcHV0ZWRQcm9wZXJ0eWAKICAgKiAtIGBiaW5kVGVtcGxhdGVgCiAgICoKICAgKiBFYWNoIG1ldGhvZCBjcmVhdGVzIG9uZSBvciBtb3JlIHByb3BlcnR5IGFjY2Vzc29ycywgYWxvbmcgd2l0aCBtZXRhZGF0YQogICAqIHVzZWQgYnkgdGhpcyBtaXhpbidzIGltcGxlbWVudGF0aW9uIG9mIGBfcHJvcGVydGllc0NoYW5nZWRgIHRvIHBlcmZvcm0KICAgKiB0aGUgcHJvcGVydHkgZWZmZWN0cy4KICAgKgogICAqIFVuZGVyc2NvcmVkIHZlcnNpb25zIG9mIHRoZSBhYm92ZSBtZXRob2RzIGFsc28gZXhpc3Qgb24gdGhlIGVsZW1lbnQKICAgKiBwcm90b3R5cGUgZm9yIGFkZGluZyBwcm9wZXJ0eSBlZmZlY3RzIG9uIGluc3RhbmNlcyBhdCBydW50aW1lLgogICAqCiAgICogTm90ZSB0aGF0IHRoaXMgbWl4aW4gb3ZlcnJpZGVzIHNldmVyYWwgYFByb3BlcnR5QWNjZXNzb3JzYCBtZXRob2RzLCBpbgogICAqIG1hbnkgY2FzZXMgdG8gbWFpbnRhaW4gZ3VhcmFudGVlcyBwcm92aWRlZCBieSB0aGUgUG9seW1lciAxLnggZmVhdHVyZXM7CiAgICogbm90YWJseSBpdCBjaGFuZ2VzIHByb3BlcnR5IGFjY2Vzc29ycyB0byBiZSBzeW5jaHJvbm91cyBieSBkZWZhdWx0CiAgICogd2hlcmVhcyB0aGUgZGVmYXVsdCB3aGVuIHVzaW5nIGBQcm9wZXJ0eUFjY2Vzc29yc2Agc3RhbmRhbG9uZSBpcyB0byBiZQogICAqIGFzeW5jIGJ5IGRlZmF1bHQuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlRlbXBsYXRlU3RhbXAKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBtZXRhLXByb2dyYW1taW5nIGZvciBQb2x5bWVyJ3MKICAgKiB0ZW1wbGF0ZSBiaW5kaW5nIGFuZCBkYXRhIG9ic2VydmF0aW9uIHN5c3RlbS4KICAgKi8KICBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cyA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUFjY2Vzc29yc30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1RlbXBsYXRlU3RhbXB9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBwcm9wZXJ0eUVmZmVjdHNCYXNlID0gUG9seW1lci5UZW1wbGF0ZVN0YW1wKFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMoc3VwZXJDbGFzcykpOwoKICAgIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgKiBAZXh0ZW5kcyB7cHJvcGVydHlFZmZlY3RzQmFzZX0KICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAqLwogICAgY2xhc3MgUHJvcGVydHlFZmZlY3RzIGV4dGVuZHMgcHJvcGVydHlFZmZlY3RzQmFzZSB7CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICAvLyBVc2VkIHRvIGlkZW50aWZ5IHVzZXJzIG9mIHRoaXMgbWl4aW4sIGFsYSBpbnN0YW5jZW9mCiAgICAgICAgdGhpcy5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50ID0gdHJ1ZTsKICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8KICAgICAgICAvLyBOT1RFOiB1c2VkIHRvIHRyYWNrIHJlLWVudHJhbnQgY2FsbHMgdG8gYF9mbHVzaFByb3BlcnRpZXNgCiAgICAgICAgLy8gcGF0aCBjaGFuZ2VzIGRpcnR5IGNoZWNrIGFnYWluc3QgYF9fZGF0YVRlbXBgIG9ubHkgZHVyaW5nIG9uZSAidHVybiIKICAgICAgICAvLyBhbmQgYXJlIGNsZWFyZWQgd2hlbiBgX19kYXRhQ291bnRlcmAgcmV0dXJucyB0byAwLgogICAgICAgIHRoaXMuX19kYXRhQ291bnRlciA9IDA7CiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5OwogICAgICAgIC8qKiBAdHlwZSB7QXJyYXl9ICovCiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50czsKICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5OwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHM7CiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgIHRoaXMuX19kYXRhSGFzUGF0aHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2U7CiAgICAgICAgLyoqIEB0eXBlIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30gKi8KICAgICAgICB0aGlzLl9fZGF0YUhvc3Q7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhVGVtcDsKICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovCiAgICAgICAgdGhpcy5fX2RhdGFDbGllbnRzSW5pdGlhbGl6ZWQ7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhOwogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmc7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhT2xkOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19jb21wdXRlRWZmZWN0czsKICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICB0aGlzLl9fcmVmbGVjdEVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX25vdGlmeUVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX3Byb3BhZ2F0ZUVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX29ic2VydmVFZmZlY3RzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19yZWFkT25seTsKICAgICAgICAvKiogQHR5cGUgeyFUZW1wbGF0ZUluZm99ICovCiAgICAgICAgdGhpcy5fX3RlbXBsYXRlSW5mbzsKICAgICAgfQoKICAgICAgZ2V0IFBST1BFUlRZX0VGRkVDVF9UWVBFUygpIHsKICAgICAgICByZXR1cm4gVFlQRVM7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgIGhvc3RTdGFjay5yZWdpc3Rlckhvc3QodGhpcyk7CiAgICAgICAgdGhpcy5fX2RhdGFDbGllbnRzUmVhZHkgPSBmYWxzZTsKICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5ID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YUhhc1BhdGhzID0gZmFsc2U7CiAgICAgICAgLy8gTWF5IGJlIHNldCBvbiBpbnN0YW5jZSBwcmlvciB0byB1cGdyYWRlCiAgICAgICAgdGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgPSB0aGlzLl9fZGF0YUNvbXBvdW5kU3RvcmFnZSB8fCBudWxsOwogICAgICAgIHRoaXMuX19kYXRhSG9zdCA9IHRoaXMuX19kYXRhSG9zdCB8fCBudWxsOwogICAgICAgIHRoaXMuX19kYXRhVGVtcCA9IHt9OwogICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c0luaXRpYWxpemVkID0gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgIGltcGxlbWVudGF0aW9uIHRvIHByb3ZpZGUgYQogICAgICAgKiBtb3JlIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZiBpbml0aWFsaXppbmcgcHJvcGVydGllcyBmcm9tCiAgICAgICAqIHRoZSBwcm90b3R5cGUgb24gdGhlIGluc3RhbmNlLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFByb3BlcnRpZXMgdG8gaW5pdGlhbGl6ZSBvbiB0aGUgcHJvdG90eXBlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfaW5pdGlhbGl6ZVByb3RvUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIHRoaXMuX19kYXRhID0gT2JqZWN0LmNyZWF0ZShwcm9wcyk7CiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0gT2JqZWN0LmNyZWF0ZShwcm9wcyk7CiAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUG9seW1lci5Qcm9wZXJ0eUFjY2Vzc29yc2AgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgc2V0dGluZwogICAgICAgKiBgX3NldFByb3BlcnR5YCdzIGBzaG91bGROb3RpZnk6IHRydWVgLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFByb3BlcnRpZXMgdG8gaW5pdGlhbGl6ZSBvbiB0aGUgaW5zdGFuY2UKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9pbml0aWFsaXplSW5zdGFuY2VQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgICAgbGV0IHJlYWRPbmx5ID0gdGhpc1tUWVBFUy5SRUFEX09OTFldOwogICAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICAgIGlmICghcmVhZE9ubHkgfHwgIXJlYWRPbmx5W3Byb3BdKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IHRoaXMuX19kYXRhUGVuZGluZyB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB0aGlzLl9fZGF0YU9sZCB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFbcHJvcF0gPSB0aGlzLl9fZGF0YVBlbmRpbmdbcHJvcF0gPSBwcm9wc1twcm9wXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIFByb3RvdHlwZSBzZXR1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGFkZFByb3BlcnR5RWZmZWN0YCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRoYXQgc2hvdWxkIHRyaWdnZXIgdGhlIGVmZmVjdAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFZmZlY3QgdHlwZSwgZnJvbSB0aGlzLlBST1BFUlRZX0VGRkVDVF9UWVBFUwogICAgICAgKiBAcGFyYW0ge09iamVjdD19IGVmZmVjdCBFZmZlY3QgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSwgZWZmZWN0KSB7CiAgICAgICAgdGhpcy5fY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgdHlwZSA9PSBUWVBFUy5SRUFEX09OTFkpOwogICAgICAgIC8vIGVmZmVjdHMgYXJlIGFjY3VtdWxhdGVkIGludG8gYXJyYXlzIHBlciBwcm9wZXJ0eSBiYXNlZCBvbiB0eXBlCiAgICAgICAgbGV0IGVmZmVjdHMgPSBlbnN1cmVPd25FZmZlY3RNYXAodGhpcywgdHlwZSlbcHJvcGVydHldOwogICAgICAgIGlmICghZWZmZWN0cykgewogICAgICAgICAgZWZmZWN0cyA9IHRoaXNbdHlwZV1bcHJvcGVydHldID0gW107CiAgICAgICAgfQogICAgICAgIGVmZmVjdHMucHVzaChlZmZlY3QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcHJvcGVydHkgZWZmZWN0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgdGhlIGVmZmVjdCB3YXMgYXNzb2NpYXRlZCB3aXRoCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIEVmZmVjdCB0eXBlLCBmcm9tIHRoaXMuUFJPUEVSVFlfRUZGRUNUX1RZUEVTCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gZWZmZWN0IEVmZmVjdCBtZXRhZGF0YSBvYmplY3QgdG8gcmVtb3ZlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcmVtb3ZlUHJvcGVydHlFZmZlY3QocHJvcGVydHksIHR5cGUsIGVmZmVjdCkgewogICAgICAgIGxldCBlZmZlY3RzID0gZW5zdXJlT3duRWZmZWN0TWFwKHRoaXMsIHR5cGUpW3Byb3BlcnR5XTsKICAgICAgICBsZXQgaWR4ID0gZWZmZWN0cy5pbmRleE9mKGVmZmVjdCk7CiAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICBlZmZlY3RzLnNwbGljZShpZHgsIDEpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgcHJvcGVydHkgZWZmZWN0CiAgICAgICAqIG9mIGEgY2VydGFpbiB0eXBlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0ge3N0cmluZz19IHR5cGUgRWZmZWN0IHR5cGUsIGZyb20gdGhpcy5QUk9QRVJUWV9FRkZFQ1RfVFlQRVMKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhbiBlZmZlY3Qgb2YgdGhpcyB0eXBlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSkgewogICAgICAgIGxldCBlZmZlY3RzID0gdGhpc1t0eXBlXTsKICAgICAgICByZXR1cm4gQm9vbGVhbihlZmZlY3RzICYmIGVmZmVjdHNbcHJvcGVydHldKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgInJlYWQgb25seSIKICAgICAgICogYWNjZXNzb3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhbiBlZmZlY3Qgb2YgdGhpcyB0eXBlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9oYXNSZWFkT25seUVmZmVjdChwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiB0aGlzLl9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuUkVBRF9PTkxZKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgIm5vdGlmeSIKICAgICAgICogcHJvcGVydHkgZWZmZWN0IGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYW4gZWZmZWN0IG9mIHRoaXMgdHlwZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfaGFzTm90aWZ5RWZmZWN0KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5OT1RJRlkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYSAicmVmbGVjdCB0byBhdHRyaWJ1dGUiCiAgICAgICAqIHByb3BlcnR5IGVmZmVjdCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGFuIGVmZmVjdCBvZiB0aGlzIHR5cGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2hhc1JlZmxlY3RFZmZlY3QocHJvcGVydHkpIHsKICAgICAgICByZXR1cm4gdGhpcy5faGFzUHJvcGVydHlFZmZlY3QocHJvcGVydHksIFRZUEVTLlJFRkxFQ1QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYSAiY29tcHV0ZWQiCiAgICAgICAqIHByb3BlcnR5IGVmZmVjdCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGFuIGVmZmVjdCBvZiB0aGlzIHR5cGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2hhc0NvbXB1dGVkRWZmZWN0KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5DT01QVVRFKTsKICAgICAgfQoKICAgICAgLy8gUnVudGltZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAvKioKICAgICAgICogU2V0cyBhIHBlbmRpbmcgcHJvcGVydHkgb3IgcGF0aC4gIElmIHRoZSByb290IHByb3BlcnR5IG9mIHRoZSBwYXRoIGluCiAgICAgICAqIHF1ZXN0aW9uIGhhZCBubyBhY2Nlc3NvciwgdGhlIHBhdGggaXMgc2V0LCBvdGhlcndpc2UgaXQgaXMgZW5xdWV1ZWQKICAgICAgICogdmlhIGBfc2V0UGVuZGluZ1Byb3BlcnR5YC4KICAgICAgICoKICAgICAgICogVGhpcyBmdW5jdGlvbiBpc29sYXRlcyByZWxhdGl2ZWx5IGV4cGVuc2l2ZSBmdW5jdGlvbmFsaXR5IG5lY2Vzc2FyeQogICAgICAgKiBmb3IgdGhlIHB1YmxpYyBBUEkgKGBzZXRgLCBgc2V0UHJvcGVydGllc2AsIGBub3RpZnlQYXRoYCwgYW5kIHByb3BlcnR5CiAgICAgICAqIGNoYW5nZSBsaXN0ZW5lcnMgdmlhIHt7Li4ufX0gYmluZGluZ3MpLCBzdWNoIHRoYXQgaXQgaXMgb25seSBkb25lCiAgICAgICAqIHdoZW4gcGF0aHMgZW50ZXIgdGhlIHN5c3RlbSwgYW5kIG5vdCBhdCBldmVyeSBwcm9wYWdhdGlvbiBzdGVwLiAgSXQKICAgICAgICogYWxzbyBzZXRzIGEgYF9fZGF0YUhhc1BhdGhzYCBmbGFnIG9uIHRoZSBpbnN0YW5jZSB3aGljaCBpcyB1c2VkIHRvCiAgICAgICAqIGZhc3QtcGF0aCBzbG93ZXIgcGF0aC1tYXRjaGluZyBjb2RlIGluIHRoZSBwcm9wZXJ0eSBlZmZlY3RzIGhvc3QgcGF0aHMuCiAgICAgICAqCiAgICAgICAqIGBwYXRoYCBjYW4gYmUgYSBwYXRoIHN0cmluZyBvciBhcnJheSBvZiBwYXRoIHBhcnRzIGFzIGFjY2VwdGVkIGJ5IHRoZQogICAgICAgKiBwdWJsaWMgQVBJLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxudW1iZXJ8c3RyaW5nPn0gcGF0aCBQYXRoIHRvIHNldAogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzaG91bGROb3RpZnkgU2V0IHRvIHRydWUgaWYgdGhpcyBjaGFuZ2Ugc2hvdWxkCiAgICAgICAqICBjYXVzZSBhIHByb3BlcnR5IG5vdGlmaWNhdGlvbiBldmVudCBkaXNwYXRjaAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBpc1BhdGhOb3RpZmljYXRpb24gSWYgdGhlIHBhdGggYmVpbmcgc2V0IGlzIGEgcGF0aAogICAgICAgKiAgIG5vdGlmaWNhdGlvbiBvZiBhbiBhbHJlYWR5IGNoYW5nZWQgdmFsdWUsIGFzIG9wcG9zZWQgdG8gYSByZXF1ZXN0CiAgICAgICAqICAgdG8gc2V0IGFuZCBub3RpZnkgdGhlIGNoYW5nZS4gIEluIHRoZSBsYXR0ZXIgYGZhbHNlYCBjYXNlLCBhIGRpcnR5CiAgICAgICAqICAgY2hlY2sgaXMgcGVyZm9ybWVkIGFuZCB0aGVuIHRoZSB2YWx1ZSBpcyBzZXQgdG8gdGhlIHBhdGggYmVmb3JlCiAgICAgICAqICAgZW5xdWV1aW5nIHRoZSBwZW5kaW5nIHByb3BlcnR5IGNoYW5nZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eS9wYXRoIHdhcyBlbnF1ZXVlZCBpbgogICAgICAgKiAgIHRoZSBwZW5kaW5nIGNoYW5nZXMgYmFnLgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHZhbHVlLCBzaG91bGROb3RpZnksIGlzUGF0aE5vdGlmaWNhdGlvbikgewogICAgICAgIGlmIChpc1BhdGhOb3RpZmljYXRpb24gfHwKICAgICAgICAgICAgUG9seW1lci5QYXRoLnJvb3QoQXJyYXkuaXNBcnJheShwYXRoKSA/IHBhdGhbMF0gOiBwYXRoKSAhPT0gcGF0aCkgewogICAgICAgICAgLy8gRGlydHkgY2hlY2sgY2hhbmdlcyBiZWluZyBzZXQgdG8gYSBwYXRoIGFnYWluc3QgdGhlIGFjdHVhbCBvYmplY3QsCiAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgcGF0aHMgaW50byB0aGUgc3lzdGVtOyBmcm9tIGhlcmUKICAgICAgICAgIC8vIHRoZSBvbmx5IGRpcnR5IGNoZWNrcyBhcmUgYWdhaW5zdCB0aGUgYF9fZGF0YVRlbXBgIGNhY2hlIHRvIHByZXZlbnQKICAgICAgICAgIC8vIGR1cGxpY2F0ZSB3b3JrIGluIHRoZSBzYW1lIHR1cm4gb25seS4gTm90ZSwgaWYgdGhpcyB3YXMgYSBub3RpZmljYXRpb24KICAgICAgICAgIC8vIG9mIGEgY2hhbmdlIGFscmVhZHkgc2V0IHRvIGEgcGF0aCAoaXNQYXRoTm90aWZpY2F0aW9uOiB0cnVlKSwKICAgICAgICAgIC8vIHdlIGFsd2F5cyBsZXQgdGhlIGNoYW5nZSB0aHJvdWdoIGFuZCBza2lwIHRoZSBgc2V0YCBzaW5jZSBpdCB3YXMKICAgICAgICAgIC8vIGFscmVhZHkgZGlydHkgY2hlY2tlZCBhdCB0aGUgcG9pbnQgb2YgZW50cnkgYW5kIHRoZSB1bmRlcmx5aW5nCiAgICAgICAgICAvLyBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkCiAgICAgICAgICBpZiAoIWlzUGF0aE5vdGlmaWNhdGlvbikgewogICAgICAgICAgICBsZXQgb2xkID0gUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoKTsKICAgICAgICAgICAgcGF0aCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoUG9seW1lci5QYXRoLnNldCh0aGlzLCBwYXRoLCB2YWx1ZSkpOwogICAgICAgICAgICAvLyBVc2UgcHJvcGVydHktYWNjZXNzb3IncyBzaW1wbGVyIGRpcnR5IGNoZWNrCiAgICAgICAgICAgIGlmICghcGF0aCB8fCAhc3VwZXIuX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHBhdGgsIHZhbHVlLCBvbGQpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fZGF0YUhhc1BhdGhzID0gdHJ1ZTsKICAgICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoLyoqQHR5cGV7c3RyaW5nfSovKHBhdGgpLCB2YWx1ZSwgc2hvdWxkTm90aWZ5KSkgewogICAgICAgICAgICBjb21wdXRlTGlua2VkUGF0aHModGhpcywgcGF0aCwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHRoaXMuX19kYXRhSGFzQWNjZXNzb3IgJiYgdGhpcy5fX2RhdGFIYXNBY2Nlc3NvcltwYXRoXSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5KC8qKkB0eXBle3N0cmluZ30qLyhwYXRoKSwgdmFsdWUsIHNob3VsZE5vdGlmeSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzW3BhdGhdID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFwcGxpZXMgYSB2YWx1ZSB0byBhIG5vbi1Qb2x5bWVyIGVsZW1lbnQvbm9kZSdzIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gbWFrZXMgYSBiZXN0LWVmZm9ydCBhdCBiaW5kaW5nIGludGVyb3A6CiAgICAgICAqIFNvbWUgbmF0aXZlIGVsZW1lbnQgcHJvcGVydGllcyBoYXZlIHNpZGUtZWZmZWN0cyB3aGVuCiAgICAgICAqIHJlLXNldHRpbmcgdGhlIHNhbWUgdmFsdWUgKGUuZy4gc2V0dGluZyBgPGlucHV0Pi52YWx1ZWAgcmVzZXRzIHRoZQogICAgICAgKiBjdXJzb3IgcG9zaXRpb24pLCBzbyB3ZSBkbyBhIGRpcnR5LWNoZWNrIGJlZm9yZSBzZXR0aW5nIHRoZSB2YWx1ZS4KICAgICAgICogSG93ZXZlciwgZm9yIGJldHRlciBpbnRlcm9wIHdpdGggbm9uLVBvbHltZXIgY3VzdG9tIGVsZW1lbnRzIHRoYXQKICAgICAgICogYWNjZXB0IG9iamVjdHMsIHdlIGV4cGxpY2l0bHkgcmUtc2V0IG9iamVjdCBjaGFuZ2VzIGNvbWluZyBmcm9tIHRoZQogICAgICAgKiBQb2x5bWVyIHdvcmxkICh3aGljaCBtYXkgaW5jbHVkZSBkZWVwIG9iamVjdCBjaGFuZ2VzIHdpdGhvdXQgdGhlCiAgICAgICAqIHRvcCByZWZlcmVuY2UgY2hhbmdpbmcpLCBlcnJpbmcgb24gdGhlIHNpZGUgb2YgcHJvdmlkaW5nIG1vcmUKICAgICAgICogaW5mb3JtYXRpb24uCiAgICAgICAqCiAgICAgICAqIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGFsdGVybmF0ZSBhcHByb2FjaGVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIFRoZSBub2RlIHRvIHNldCBhIHByb3BlcnR5IG9uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFRoZSBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZShub2RlLCBwcm9wLCB2YWx1ZSkgewogICAgICAgIC8vIEl0IGlzIGEganVkZ21lbnQgY2FsbCB0aGF0IHJlc2V0dGluZyBwcmltaXRpdmVzIGlzCiAgICAgICAgLy8gImJhZCIgYW5kIHJlc2V0dGluZ3Mgb2JqZWN0cyBpcyBhbHNvICJnb29kIjsgYWx0ZXJuYXRpdmVseSB3ZSBjb3VsZAogICAgICAgIC8vIGltcGxlbWVudCBhIHdoaXRlbGlzdCBvZiB0YWcgJiBwcm9wZXJ0eSB2YWx1ZXMgdGhhdCBzaG91bGQgbmV2ZXIKICAgICAgICAvLyBiZSByZXNldCAoZS5nLiA8aW5wdXQ+LnZhbHVlICYmIDxzZWxlY3Q+LnZhbHVlKQogICAgICAgIGlmICh2YWx1ZSAhPT0gbm9kZVtwcm9wXSB8fCB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHsKICAgICAgICAgIG5vZGVbcHJvcF0gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGBQcm9wZXJ0aWVzQ2hhbmdlZGAgaW1wbGVtZW50YXRpb24gdG8gaW50cm9kdWNlIHNwZWNpYWwKICAgICAgICogZGlydHkgY2hlY2sgbG9naWMgZGVwZW5kaW5nIG9uIHRoZSBwcm9wZXJ0eSAmIHZhbHVlIGJlaW5nIHNldDoKICAgICAgICoKICAgICAgICogMS4gQW55IHZhbHVlIHNldCB0byBhIHBhdGggKGUuZy4gJ29iai5wcm9wJzogNDIgb3IgJ29iai5wcm9wJzogey4uLn0pCiAgICAgICAqICAgIFN0b3JlZCBpbiBgX19kYXRhVGVtcGAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBgX19kYXRhVGVtcGAKICAgICAgICogMi4gT2JqZWN0IHNldCB0byBzaW1wbGUgcHJvcGVydHkgKGUuZy4gJ3Byb3AnOiB7Li4ufSkKICAgICAgICogICAgU3RvcmVkIGluIGBfX2RhdGFUZW1wYCBhbmQgYF9fZGF0YWAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdAogICAgICAgKiAgICBgX19kYXRhVGVtcGAgYnkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBgX3Nob3VsZFByb3BlcnR5Q2hhbmdlYAogICAgICAgKiAzLiBQcmltaXRpdmUgdmFsdWUgc2V0IHRvIHNpbXBsZSBwcm9wZXJ0eSAoZS5nLiAncHJvcCc6IDQyKQogICAgICAgKiAgICBTdG9yZWQgaW4gYF9fZGF0YWAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBgX19kYXRhYAogICAgICAgKgogICAgICAgKiBUaGUgZGlydHktY2hlY2sgaXMgaW1wb3J0YW50IHRvIHByZXZlbnQgY3ljbGVzIGR1ZSB0byB0d28td2F5CiAgICAgICAqIG5vdGlmaWNhdGlvbiwgYnV0IHBhdGhzIGFuZCBvYmplY3RzIGFyZSBvbmx5IGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBhbnkKICAgICAgICogcHJldmlvdXMgdmFsdWUgc2V0IGR1cmluZyB0aGlzIHR1cm4gdmlhIGEgInRlbXBvcmFyeSBjYWNoZSIgdGhhdCBpcwogICAgICAgKiBjbGVhcmVkIHdoZW4gdGhlIGxhc3QgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgZXhpdHMuIFRoaXMgaXMgc286CiAgICAgICAqIGEuIGFueSBjYWNoZWQgYXJyYXkgcGF0aHMgKGUuZy4gJ2FycmF5LjMucHJvcCcpIG1heSBiZSBpbnZhbGlkYXRlZAogICAgICAgKiAgICBkdWUgdG8gYXJyYXkgbXV0YXRpb25zIGxpa2Ugc2hpZnQvdW5zaGlmdC9zcGxpY2U7IHRoaXMgaXMgZmluZQogICAgICAgKiAgICBzaW5jZSBwYXRoIGNoYW5nZXMgYXJlIGRpcnR5LWNoZWNrZWQgYXQgdXNlciBlbnRyeSBwb2ludHMgbGlrZSBgc2V0YAogICAgICAgKiBiLiBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBvbmx5IGxhc3RzIG9uZSB0dXJuIHRvIGFsbG93IHRoZSB1c2VyCiAgICAgICAqICAgIHRvIG11dGF0ZSB0aGUgb2JqZWN0IGluLXBsYWNlIGFuZCByZS1zZXQgaXQgd2l0aCB0aGUgc2FtZSBpZGVudGl0eQogICAgICAgKiAgICBhbmQgaGF2ZSBhbGwgc3ViLXByb3BlcnRpZXMgcmUtcHJvcGFnYXRlZCBpbiBhIHN1YnNlcXVlbnQgdHVybi4KICAgICAgICoKICAgICAgICogVGhlIHRlbXAgY2FjaGUgaXMgbm90IG5lY2Vzc2FyaWx5IHN1ZmZpY2llbnQgdG8gcHJldmVudCBpbnZhbGlkIGFycmF5CiAgICAgICAqIHBhdGhzLCBzaW5jZSBhIHNwbGljZSBjYW4gaGFwcGVuIGR1cmluZyB0aGUgc2FtZSB0dXJuICh3aXRoIHBhdGhvbG9naWNhbAogICAgICAgKiB1c2VyIGNvZGUpOyB3ZSBjb3VsZCBpbnRyb2R1Y2UgYSAiZml4dXAiIGZvciB0ZW1wb3JhcmlseSBjYWNoZWQgYXJyYXkKICAgICAgICogcGF0aHMgaWYgbmVlZGVkOiBodHRwczovL2dpdGh1Yi5jb20vUG9seW1lci9wb2x5bWVyL2lzc3Vlcy80MjI3CiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gc2hvdWxkTm90aWZ5IFRydWUgaWYgcHJvcGVydHkgc2hvdWxkIGZpcmUgbm90aWZpY2F0aW9uCiAgICAgICAqICAgZXZlbnQgKGFwcGxpZXMgb25seSBmb3IgYG5vdGlmeTogdHJ1ZWAgcHJvcGVydGllcykKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VkCiAgICAgICAqLwogICAgICBfc2V0UGVuZGluZ1Byb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSwgc2hvdWxkTm90aWZ5KSB7CiAgICAgICAgbGV0IGlzUGF0aCA9IHRoaXMuX19kYXRhSGFzUGF0aHMgJiYgUG9seW1lci5QYXRoLmlzUGF0aChwcm9wZXJ0eSk7CiAgICAgICAgbGV0IHByZXZQcm9wcyA9IGlzUGF0aCA/IHRoaXMuX19kYXRhVGVtcCA6IHRoaXMuX19kYXRhOwogICAgICAgIGlmICh0aGlzLl9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIHByZXZQcm9wc1twcm9wZXJ0eV0pKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhUGVuZGluZykgewogICAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmcgPSB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEVuc3VyZSBvbGQgaXMgY2FwdHVyZWQgZnJvbSB0aGUgbGFzdCB0dXJuCiAgICAgICAgICBpZiAoIShwcm9wZXJ0eSBpbiB0aGlzLl9fZGF0YU9sZCkpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGRbcHJvcGVydHldID0gdGhpcy5fX2RhdGFbcHJvcGVydHldOwogICAgICAgICAgfQogICAgICAgICAgLy8gUGF0aHMgYXJlIHN0b3JlZCBpbiB0ZW1wb3JhcnkgY2FjaGUgKGNsZWFyZWQgYXQgZW5kIG9mIHR1cm4pLAogICAgICAgICAgLy8gd2hpY2ggaXMgdXNlZCBmb3IgZGlydHktY2hlY2tpbmcsIGFsbCBvdGhlcnMgc3RvcmVkIGluIF9fZGF0YQogICAgICAgICAgaWYgKGlzUGF0aCkgewogICAgICAgICAgICB0aGlzLl9fZGF0YVRlbXBbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLl9fZGF0YVtwcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEFsbCBjaGFuZ2VzIGdvIGludG8gcGVuZGluZyBwcm9wZXJ0eSBiYWcsIHBhc3NlZCB0byBfcHJvcGVydGllc0NoYW5nZWQKICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ1twcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIC8vIFRyYWNrIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgbm90aWZ5IHNlcGFyYXRlbHkKICAgICAgICAgIGlmIChpc1BhdGggfHwgKHRoaXNbVFlQRVMuTk9USUZZXSAmJiB0aGlzW1RZUEVTLk5PVElGWV1bcHJvcGVydHldKSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5ID0gdGhpcy5fX2RhdGFUb05vdGlmeSB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFUb05vdGlmeVtwcm9wZXJ0eV0gPSBzaG91bGROb3RpZnk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGJhc2UgaW1wbGVtZW50YXRpb24gdG8gZW5zdXJlIGFsbCBhY2Nlc3NvcnMgc2V0IGBzaG91bGROb3RpZnlgCiAgICAgICAqIHRvIHRydWUsIGZvciBwZXItcHJvcGVydHkgbm90aWZpY2F0aW9uIHRyYWNraW5nLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfc2V0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKSB7CiAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUsIHRydWUpKSB7CiAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUHJvcGVydHlBY2Nlc3NvcmAncyBkZWZhdWx0IGFzeW5jIHF1ZXVpbmcgb2YKICAgICAgICogYF9wcm9wZXJ0aWVzQ2hhbmdlZGA6IGlmIGBfX2RhdGFSZWFkeWAgaXMgZmFsc2UgKGhhcyBub3QgeWV0IGJlZW4KICAgICAgICogbWFudWFsbHkgZmx1c2hlZCksIHRoZSBmdW5jdGlvbiBuby1vcHM7IG90aGVyd2lzZSBmbHVzaGVzCiAgICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgIHN5bmNocm9ub3VzbHkuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCkgewogICAgICAgIGlmICh0aGlzLl9fZGF0YVJlYWR5KSB7CiAgICAgICAgICB0aGlzLl9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFbnF1ZXVlcyB0aGUgZ2l2ZW4gY2xpZW50IG9uIGEgbGlzdCBvZiBwZW5kaW5nIGNsaWVudHMsIHdob3NlCiAgICAgICAqIHBlbmRpbmcgcHJvcGVydHkgY2hhbmdlcyBjYW4gbGF0ZXIgYmUgZmx1c2hlZCB2aWEgYSBjYWxsIHRvCiAgICAgICAqIGBfZmx1c2hDbGllbnRzYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNsaWVudCBQcm9wZXJ0eUVmZmVjdHMgY2xpZW50IHRvIGVucXVldWUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2VucXVldWVDbGllbnQoY2xpZW50KSB7CiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cyA9IHRoaXMuX19kYXRhUGVuZGluZ0NsaWVudHMgfHwgW107CiAgICAgICAgaWYgKGNsaWVudCAhPT0gdGhpcykgewogICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cy5wdXNoKGNsaWVudCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIHN1cGVyY2xhc3MgaW1wbGVtZW50YXRpb24uCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9mbHVzaFByb3BlcnRpZXMoKSB7CiAgICAgICAgdGhpcy5fX2RhdGFDb3VudGVyKys7CiAgICAgICAgc3VwZXIuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIHRoaXMuX19kYXRhQ291bnRlci0tOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRmx1c2hlcyBhbnkgY2xpZW50cyBwcmV2aW91c2x5IGVucXVldWVkIHZpYSBgX2VucXVldWVDbGllbnRgLCBjYXVzaW5nCiAgICAgICAqIHRoZWlyIGBfZmx1c2hQcm9wZXJ0aWVzYCBtZXRob2QgdG8gcnVuLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfZmx1c2hDbGllbnRzKCkgewogICAgICAgIGlmICghdGhpcy5fX2RhdGFDbGllbnRzUmVhZHkpIHsKICAgICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5ID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuX3JlYWR5Q2xpZW50cygpOwogICAgICAgICAgLy8gT3ZlcnJpZGUgcG9pbnQgd2hlcmUgYWNjZXNzb3JzIGFyZSB0dXJuZWQgb247IGltcG9ydGFudGx5LAogICAgICAgICAgLy8gdGhpcyBpcyBhZnRlciBjbGllbnRzIGhhdmUgZnVsbHkgcmVhZGllZCwgcHJvdmlkaW5nIGEgZ3VhcmFudGVlCiAgICAgICAgICAvLyB0aGF0IGFueSBwcm9wZXJ0eSBlZmZlY3RzIG9jY3VyIG9ubHkgYWZ0ZXIgYWxsIGNsaWVudHMgYXJlIHJlYWR5LgogICAgICAgICAgdGhpcy5fX2RhdGFSZWFkeSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX19lbmFibGVPckZsdXNoQ2xpZW50cygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gTk9URTogV2UgZW5zdXJlIGNsaWVudHMgZWl0aGVyIGVuYWJsZSBvciBmbHVzaCBhcyBhcHByb3ByaWF0ZS4gVGhpcwogICAgICAvLyBoYW5kbGVzIHR3byBjb3JuZXIgY2FzZXM6CiAgICAgIC8vICgxKSBjbGllbnRzIGZsdXNoIHByb3Blcmx5IHdoZW4gY29ubmVjdGVkL2VuYWJsZWQgYmVmb3JlIHRoZSBob3N0CiAgICAgIC8vIGVuYWJsZXM7IGUuZy4KICAgICAgLy8gICAoYSkgVGVtcGxhdGl6ZSBzdGFtcHMgd2l0aCBubyBwcm9wZXJ0aWVzIGFuZCBkb2VzIG5vdCBmbHVzaCBhbmQKICAgICAgLy8gICAoYikgdGhlIGluc3RhbmNlIGlzIGluc2VydGVkIGludG8gZG9tIGFuZAogICAgICAvLyAgIChjKSB0aGVuIHRoZSBpbnN0YW5jZSBmbHVzaGVzLgogICAgICAvLyAoMikgY2xpZW50cyBlbmFibGUgcHJvcGVybHkgd2hlbiBub3QgY29ubmVjdGVkL2VuYWJsZWQgd2hlbiB0aGUgaG9zdAogICAgICAvLyBmbHVzaGVzOyBlLmcuCiAgICAgIC8vICAgKGEpIGEgdGVtcGxhdGUgaXMgcnVudGltZSBzdGFtcGVkIGFuZCBub3QgeWV0IGNvbm5lY3RlZC9lbmFibGVkCiAgICAgIC8vICAgKGIpIGEgaG9zdCBzZXRzIGEgcHJvcGVydHksIGNhdXNpbmcgc3RhbXBlZCBkb20gdG8gZmx1c2gKICAgICAgLy8gICAoYykgdGhlIHN0YW1wZWQgZG9tIGVuYWJsZXMuCiAgICAgIF9fZW5hYmxlT3JGbHVzaENsaWVudHMoKSB7CiAgICAgICAgbGV0IGNsaWVudHMgPSB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzOwogICAgICAgIGlmIChjbGllbnRzKSB7CiAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzID0gbnVsbDsKICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGNsaWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGNsaWVudCA9IGNsaWVudHNbaV07CiAgICAgICAgICAgIGlmICghY2xpZW50Ll9fZGF0YUVuYWJsZWQpIHsKICAgICAgICAgICAgICBjbGllbnQuX2VuYWJsZVByb3BlcnRpZXMoKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjbGllbnQuX19kYXRhUGVuZGluZykgewogICAgICAgICAgICAgIGNsaWVudC5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQZXJmb3JtIGFueSBpbml0aWFsIHNldHVwIG9uIGNsaWVudCBkb20uIENhbGxlZCBiZWZvcmUgdGhlIGZpcnN0CiAgICAgICAqIGBfZmx1c2hQcm9wZXJ0aWVzYCBjYWxsIG9uIGNsaWVudCBkb20gYW5kIGJlZm9yZSBhbnkgZWxlbWVudAogICAgICAgKiBvYnNlcnZlcnMgYXJlIGNhbGxlZC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3JlYWR5Q2xpZW50cygpIHsKICAgICAgICB0aGlzLl9fZW5hYmxlT3JGbHVzaENsaWVudHMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNldHMgYSBiYWcgb2YgcHJvcGVydHkgY2hhbmdlcyB0byB0aGlzIGluc3RhbmNlLCBhbmQKICAgICAgICogc3luY2hyb25vdXNseSBwcm9jZXNzZXMgYWxsIGVmZmVjdHMgb2YgdGhlIHByb3BlcnRpZXMgYXMgYSBiYXRjaC4KICAgICAgICoKICAgICAgICogUHJvcGVydHkgbmFtZXMgbXVzdCBiZSBzaW1wbGUgcHJvcGVydGllcywgbm90IHBhdGhzLiAgQmF0Y2hlZAogICAgICAgKiBwYXRoIHByb3BhZ2F0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2Ygb25lIG9yIG1vcmUga2V5LXZhbHVlIHBhaXJzIHdob3NlIGtleSBpcwogICAgICAgKiAgIGEgcHJvcGVydHkgYW5kIHZhbHVlIGlzIHRoZSBuZXcgdmFsdWUgdG8gc2V0IGZvciB0aGF0IHByb3BlcnR5LgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzZXRSZWFkT25seSBXaGVuIHRydWUsIGFueSBwcml2YXRlIHZhbHVlcyBzZXQgaW4KICAgICAgICogICBgcHJvcHNgIHdpbGwgYmUgc2V0LiBCeSBkZWZhdWx0LCBgc2V0UHJvcGVydGllc2Agd2lsbCBub3Qgc2V0CiAgICAgICAqICAgYHJlYWRPbmx5OiB0cnVlYCByb290IHByb3BlcnRpZXMuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHNldFByb3BlcnRpZXMocHJvcHMsIHNldFJlYWRPbmx5KSB7CiAgICAgICAgZm9yIChsZXQgcGF0aCBpbiBwcm9wcykgewogICAgICAgICAgaWYgKHNldFJlYWRPbmx5IHx8ICF0aGlzW1RZUEVTLlJFQURfT05MWV0gfHwgIXRoaXNbVFlQRVMuUkVBRF9PTkxZXVtwYXRoXSkgewogICAgICAgICAgICAvL1RPRE8oa3NjaGFhZik6IGV4cGxpY2l0bHkgZGlzYWxsb3cgcGF0aHMgaW4gc2V0UHJvcGVydHk/CiAgICAgICAgICAgIC8vIHdpbGRjYXJkIG9ic2VydmVycyBjdXJyZW50bHkgb25seSBwYXNzIHRoZSBmaXJzdCBjaGFuZ2VkIHBhdGgKICAgICAgICAgICAgLy8gaW4gdGhlIGBpbmZvYCBvYmplY3QsIGFuZCB5b3UgY291bGQgZG8gc29tZSBvZGQgdGhpbmdzIGJhdGNoaW5nCiAgICAgICAgICAgIC8vIHBhdGhzLCBlLmcuIHsnZm9vLmJhcic6IHsuLi59LCAnZm9vJzogbnVsbH0KICAgICAgICAgICAgdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHByb3BzW3BhdGhdLCB0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUHJvcGVydHlBY2Nlc3NvcnNgIHNvIHRoYXQgcHJvcGVydHkgYWNjZXNzb3IKICAgICAgICogc2lkZSBlZmZlY3RzIGFyZSBub3QgZW5hYmxlZCB1bnRpbCBhZnRlciBjbGllbnQgZG9tIGlzIGZ1bGx5IHJlYWR5LgogICAgICAgKiBBbHNvIGNhbGxzIGBfZmx1c2hDbGllbnRzYCBjYWxsYmFjayB0byBlbnN1cmUgY2xpZW50IGRvbSBpcyBlbmFibGVkCiAgICAgICAqIHRoYXQgd2FzIG5vdCBlbmFibGVkIGFzIGEgcmVzdWx0IG9mIGZsdXNoaW5nIHByb3BlcnRpZXMuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgcmVhZHkoKSB7CiAgICAgICAgLy8gSXQgaXMgaW1wb3J0YW50IHRoYXQgYHN1cGVyLnJlYWR5KClgIGlzIG5vdCBjYWxsZWQgaGVyZSBhcyBpdAogICAgICAgIC8vIGltbWVkaWF0ZWx5IHR1cm5zIG9uIGFjY2Vzc29ycy4gSW5zdGVhZCwgd2Ugd2FpdCB1bnRpbCBgcmVhZHlDbGllbnRzYAogICAgICAgIC8vIHRvIGVuYWJsZSBhY2Nlc3NvcnMgdG8gcHJvdmlkZSBhIGd1YXJhbnRlZSB0aGF0IGNsaWVudHMgYXJlIHJlYWR5CiAgICAgICAgLy8gYmVmb3JlIHByb2Nlc3NpbmcgYW55IGFjY2Vzc29ycyBzaWRlIGVmZmVjdHMuCiAgICAgICAgdGhpcy5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgLy8gSWYgbm8gZGF0YSB3YXMgcGVuZGluZywgYF9mbHVzaFByb3BlcnRpZXNgIHdpbGwgbm90IGBmbHVzaENsaWVudHNgCiAgICAgICAgLy8gc28gZW5zdXJlIHRoaXMgaXMgZG9uZS4KICAgICAgICBpZiAoIXRoaXMuX19kYXRhQ2xpZW50c1JlYWR5KSB7CiAgICAgICAgICB0aGlzLl9mbHVzaENsaWVudHMoKTsKICAgICAgICB9CiAgICAgICAgLy8gQmVmb3JlIHJlYWR5LCBjbGllbnQgbm90aWZpY2F0aW9ucyBkbyBub3QgdHJpZ2dlciBfZmx1c2hQcm9wZXJ0aWVzLgogICAgICAgIC8vIFRoZXJlZm9yZSBhIGZsdXNoIGlzIG5lY2Vzc2FyeSBoZXJlIGlmIGRhdGEgaGFzIGJlZW4gc2V0LgogICAgICAgIGlmICh0aGlzLl9fZGF0YVBlbmRpbmcpIHsKICAgICAgICAgIHRoaXMuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgYFByb3BlcnR5QWNjZXNzb3JzYCdzIHByb3BlcnRpZXMgY2hhbmdlZCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogUnVucyBlYWNoIGNsYXNzIG9mIGVmZmVjdHMgZm9yIHRoZSBiYXRjaCBvZiBjaGFuZ2VkIHByb3BlcnRpZXMgaW4KICAgICAgICogYSBzcGVjaWZpYyBvcmRlciAoY29tcHV0ZSwgcHJvcGFnYXRlLCByZWZsZWN0LCBvYnNlcnZlLCBub3RpZnkpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGN1cnJlbnRQcm9wcyBCYWcgb2YgYWxsIGN1cnJlbnQgYWNjZXNzb3IgdmFsdWVzCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBwcm9wZXJ0aWVzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QKICAgICAgICogICBjYWxsIHRvIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgZWFjaCBwcm9wZXJ0eQogICAgICAgKiAgIGluIGBjaGFuZ2VkUHJvcHNgCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcHJvcGVydGllc0NoYW5nZWQoY3VycmVudFByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzKSB7CiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIC8vIGxldCBjID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY2hhbmdlZFByb3BzIHx8IHt9KTsKICAgICAgICAvLyB3aW5kb3cuZGVidWcgJiYgY29uc29sZS5ncm91cCh0aGlzLmxvY2FsTmFtZSArICcjJyArIHRoaXMuaWQgKyAnOiAnICsgYyk7CiAgICAgICAgLy8gaWYgKHdpbmRvdy5kZWJ1ZykgeyBkZWJ1Z2dlcjsgfQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBsZXQgaGFzUGF0aHMgPSB0aGlzLl9fZGF0YUhhc1BhdGhzOwogICAgICAgIHRoaXMuX19kYXRhSGFzUGF0aHMgPSBmYWxzZTsKICAgICAgICAvLyBDb21wdXRlIHByb3BlcnRpZXMKICAgICAgICBydW5Db21wdXRlZEVmZmVjdHModGhpcywgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIC8vIENsZWFyIG5vdGlmeSBwcm9wZXJ0aWVzIHByaW9yIHRvIHBvc3NpYmxlIHJlZW50cnkgKHByb3BhZ2F0ZSwgb2JzZXJ2ZSksCiAgICAgICAgLy8gYnV0IGFmdGVyIGNvbXB1dGluZyBlZmZlY3RzIGhhdmUgYSBjaGFuY2UgdG8gYWRkIHRvIHRoZW0KICAgICAgICBsZXQgbm90aWZ5UHJvcHMgPSB0aGlzLl9fZGF0YVRvTm90aWZ5OwogICAgICAgIHRoaXMuX19kYXRhVG9Ob3RpZnkgPSBudWxsOwogICAgICAgIC8vIFByb3BhZ2F0ZSBwcm9wZXJ0aWVzIHRvIGNsaWVudHMKICAgICAgICB0aGlzLl9wcm9wYWdhdGVQcm9wZXJ0eUNoYW5nZXMoY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIC8vIEZsdXNoIGNsaWVudHMKICAgICAgICB0aGlzLl9mbHVzaENsaWVudHMoKTsKICAgICAgICAvLyBSZWZsZWN0IHByb3BlcnRpZXMKICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuUkVGTEVDVF0sIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAvLyBPYnNlcnZlIHByb3BlcnRpZXMKICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuT0JTRVJWRV0sIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAvLyBOb3RpZnkgcHJvcGVydGllcyB0byBob3N0CiAgICAgICAgaWYgKG5vdGlmeVByb3BzKSB7CiAgICAgICAgICBydW5Ob3RpZnlFZmZlY3RzKHRoaXMsIG5vdGlmeVByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocyk7CiAgICAgICAgfQogICAgICAgIC8vIENsZWFyIHRlbXBvcmFyeSBjYWNoZSBhdCBlbmQgb2YgdHVybgogICAgICAgIGlmICh0aGlzLl9fZGF0YUNvdW50ZXIgPT0gMSkgewogICAgICAgICAgdGhpcy5fX2RhdGFUZW1wID0ge307CiAgICAgICAgfQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAvLyB3aW5kb3cuZGVidWcgJiYgY29uc29sZS5ncm91cEVuZCh0aGlzLmxvY2FsTmFtZSArICcjJyArIHRoaXMuaWQgKyAnOiAnICsgYyk7CiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIHRvIHByb3BhZ2F0ZSBhbnkgcHJvcGVydHkgY2hhbmdlcyB0byBzdGFtcGVkIHRlbXBsYXRlIG5vZGVzCiAgICAgICAqIG1hbmFnZWQgYnkgdGhpcyBlbGVtZW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBjaGFuZ2VkIHByb3BlcnRpZXMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9wcm9wYWdhdGVQcm9wZXJ0eUNoYW5nZXMoY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpIHsKICAgICAgICBpZiAodGhpc1tUWVBFUy5QUk9QQUdBVEVdKSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuUFJPUEFHQVRFXSwgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIH0KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5fX3RlbXBsYXRlSW5mbzsKICAgICAgICB3aGlsZSAodGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMsIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsCiAgICAgICAgICAgIGhhc1BhdGhzLCB0ZW1wbGF0ZUluZm8ubm9kZUxpc3QpOwogICAgICAgICAgdGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm87CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogQWxpYXNlcyBvbmUgZGF0YSBwYXRoIGFzIGFub3RoZXIsIHN1Y2ggdGhhdCBwYXRoIG5vdGlmaWNhdGlvbnMgZnJvbSBvbmUKICAgICAgICogYXJlIHJvdXRlZCB0byB0aGUgb3RoZXIuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSB0byBUYXJnZXQgcGF0aCB0byBsaW5rLgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gZnJvbSBTb3VyY2UgcGF0aCB0byBsaW5rLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICBsaW5rUGF0aHModG8sIGZyb20pIHsKICAgICAgICB0byA9IFBvbHltZXIuUGF0aC5ub3JtYWxpemUodG8pOwogICAgICAgIGZyb20gPSBQb2x5bWVyLlBhdGgubm9ybWFsaXplKGZyb20pOwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzIHx8IHt9OwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHNbdG9dID0gZnJvbTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYSBkYXRhIHBhdGggYWxpYXMgcHJldmlvdXNseSBlc3RhYmxpc2hlZCB3aXRoIGBfbGlua1BhdGhzYC4KICAgICAgICoKICAgICAgICogTm90ZSwgdGhlIHBhdGggdG8gdW5saW5rIHNob3VsZCBiZSB0aGUgdGFyZ2V0IChgdG9gKSB1c2VkIHdoZW4KICAgICAgICogbGlua2luZyB0aGUgcGF0aHMuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIFRhcmdldCBwYXRoIHRvIHVubGluay4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgdW5saW5rUGF0aHMocGF0aCkgewogICAgICAgIHBhdGggPSBQb2x5bWVyLlBhdGgubm9ybWFsaXplKHBhdGgpOwogICAgICAgIGlmICh0aGlzLl9fZGF0YUxpbmtlZFBhdGhzKSB7CiAgICAgICAgICBkZWxldGUgdGhpcy5fX2RhdGFMaW5rZWRQYXRoc1twYXRoXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBOb3RpZnkgdGhhdCBhbiBhcnJheSBoYXMgY2hhbmdlZC4KICAgICAgICoKICAgICAgICogRXhhbXBsZToKICAgICAgICoKICAgICAgICogICAgIHRoaXMuaXRlbXMgPSBbIHtuYW1lOiAnSmltJ30sIHtuYW1lOiAnVG9kZCd9LCB7bmFtZTogJ0JpbGwnfSBdOwogICAgICAgKiAgICAgLi4uCiAgICAgICAqICAgICB0aGlzLml0ZW1zLnNwbGljZSgxLCAxLCB7bmFtZTogJ1NhbSd9KTsKICAgICAgICogICAgIHRoaXMuaXRlbXMucHVzaCh7bmFtZTogJ0JvYid9KTsKICAgICAgICogICAgIHRoaXMubm90aWZ5U3BsaWNlcygnaXRlbXMnLCBbCiAgICAgICAqICAgICAgIHsgaW5kZXg6IDEsIHJlbW92ZWQ6IFt7bmFtZTogJ1RvZGQnfV0sIGFkZGVkQ291bnQ6IDEsIG9iamVjdDogdGhpcy5pdGVtcywgdHlwZTogJ3NwbGljZScgfSwKICAgICAgICogICAgICAgeyBpbmRleDogMywgcmVtb3ZlZDogW10sIGFkZGVkQ291bnQ6IDEsIG9iamVjdDogdGhpcy5pdGVtcywgdHlwZTogJ3NwbGljZSd9CiAgICAgICAqICAgICBdKTsKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0aGF0IHNob3VsZCBiZSBub3RpZmllZC4KICAgICAgICogQHBhcmFtIHtBcnJheX0gc3BsaWNlcyBBcnJheSBvZiBzcGxpY2UgcmVjb3JkcyBpbmRpY2F0aW5nIG9yZGVyZWQKICAgICAgICogICBjaGFuZ2VzIHRoYXQgb2NjdXJyZWQgdG8gdGhlIGFycmF5LiBFYWNoIHJlY29yZCBzaG91bGQgaGF2ZSB0aGUKICAgICAgICogICBmb2xsb3dpbmcgZmllbGRzOgogICAgICAgKiAgICAqIGluZGV4OiBpbmRleCBhdCB3aGljaCB0aGUgY2hhbmdlIG9jY3VycmVkCiAgICAgICAqICAgICogcmVtb3ZlZDogYXJyYXkgb2YgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQgZnJvbSB0aGlzIGluZGV4CiAgICAgICAqICAgICogYWRkZWRDb3VudDogbnVtYmVyIG9mIG5ldyBpdGVtcyBhZGRlZCBhdCB0aGlzIGluZGV4CiAgICAgICAqICAgICogb2JqZWN0OiBhIHJlZmVyZW5jZSB0byB0aGUgYXJyYXkgaW4gcXVlc3Rpb24KICAgICAgICogICAgKiB0eXBlOiB0aGUgc3RyaW5nIGxpdGVyYWwgJ3NwbGljZScKICAgICAgICoKICAgICAgICogICBOb3RlIHRoYXQgc3BsaWNlIHJlY29yZHMgX211c3RfIGJlIG5vcm1hbGl6ZWQgc3VjaCB0aGF0IHRoZXkgYXJlCiAgICAgICAqICAgcmVwb3J0ZWQgaW4gaW5kZXggb3JkZXIgKHJhdyByZXN1bHRzIGZyb20gYE9iamVjdC5vYnNlcnZlYCBhcmUgbm90CiAgICAgICAqICAgb3JkZXJlZCBhbmQgbXVzdCBiZSBub3JtYWxpemVkL21lcmdlZCBiZWZvcmUgbm90aWZ5aW5nKS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBub3RpZnlTcGxpY2VzKHBhdGgsIHNwbGljZXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbm90aWZ5U3BsaWNlcyh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCBzcGxpY2VzKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgcmVhZGluZyBhIHZhbHVlIGZyb20gYSBwYXRoLgogICAgICAgKgogICAgICAgKiBOb3RlLCBpZiBhbnkgcGFydCBpbiB0aGUgcGF0aCBpcyB1bmRlZmluZWQsIHRoaXMgbWV0aG9kIHJldHVybnMKICAgICAgICogYHVuZGVmaW5lZGAgKHRoaXMgbWV0aG9kIGRvZXMgbm90IHRocm93IHdoZW4gZGVyZWZlcmVuY2luZyB1bmRlZmluZWQKICAgICAgICogcGF0aHMpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyhzdHJpbmd8IUFycmF5PChzdHJpbmd8bnVtYmVyKT4pfSBwYXRoIFBhdGggdG8gdGhlIHZhbHVlCiAgICAgICAqICAgdG8gcmVhZC4gIFRoZSBwYXRoIG1heSBiZSBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgKGUuZy4gYGZvby5iYXIuYmF6YCkKICAgICAgICogICBvciBhbiBhcnJheSBvZiBwYXRoIHBhcnRzIChlLmcuIGBbJ2Zvby5iYXInLCAnYmF6J11gKS4gIE5vdGUgdGhhdAogICAgICAgKiAgIGJyYWNrZXRlZCBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZDsgc3RyaW5nLWJhc2VkIHBhdGggcGFydHMKICAgICAgICogICAqbXVzdCogYmUgc2VwYXJhdGVkIGJ5IGRvdHMuICBOb3RlIHRoYXQgd2hlbiBkZXJlZmVyZW5jaW5nIGFycmF5CiAgICAgICAqICAgaW5kaWNlcywgdGhlIGluZGV4IG1heSBiZSB1c2VkIGFzIGEgZG90dGVkIHBhcnQgZGlyZWN0bHkKICAgICAgICogICAoZS5nLiBgdXNlcnMuMTIubmFtZWAgb3IgYFsndXNlcnMnLCAxMiwgJ25hbWUnXWApLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHJvb3QgUm9vdCBvYmplY3QgZnJvbSB3aGljaCB0aGUgcGF0aCBpcyBldmFsdWF0ZWQuCiAgICAgICAqIEByZXR1cm4geyp9IFZhbHVlIGF0IHRoZSBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiBhbnkgcGFydCBvZiB0aGUgcGF0aAogICAgICAgKiAgIGlzIHVuZGVmaW5lZC4KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgZ2V0KHBhdGgsIHJvb3QpIHsKICAgICAgICByZXR1cm4gUG9seW1lci5QYXRoLmdldChyb290IHx8IHRoaXMsIHBhdGgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIGEgdmFsdWUgdG8gYSBwYXRoIGFuZCBub3RpZnlpbmcgYW55CiAgICAgICAqIGVsZW1lbnRzIGJvdW5kIHRvIHRoZSBzYW1lIHBhdGguCiAgICAgICAqCiAgICAgICAqIE5vdGUsIGlmIGFueSBwYXJ0IGluIHRoZSBwYXRoIGV4Y2VwdCBmb3IgdGhlIGxhc3QgaXMgdW5kZWZpbmVkLAogICAgICAgKiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcgKHRoaXMgbWV0aG9kIGRvZXMgbm90IHRocm93IHdoZW4KICAgICAgICogZGVyZWZlcmVuY2luZyB1bmRlZmluZWQgcGF0aHMpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyhzdHJpbmd8IUFycmF5PChzdHJpbmd8bnVtYmVyKT4pfSBwYXRoIFBhdGggdG8gdGhlIHZhbHVlCiAgICAgICAqICAgdG8gd3JpdGUuICBUaGUgcGF0aCBtYXkgYmUgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIChlLmcuIGAnZm9vLmJhci5iYXonYCkKICAgICAgICogICBvciBhbiBhcnJheSBvZiBwYXRoIHBhcnRzIChlLmcuIGBbJ2Zvby5iYXInLCAnYmF6J11gKS4gIE5vdGUgdGhhdAogICAgICAgKiAgIGJyYWNrZXRlZCBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZDsgc3RyaW5nLWJhc2VkIHBhdGggcGFydHMKICAgICAgICogICAqbXVzdCogYmUgc2VwYXJhdGVkIGJ5IGRvdHMuICBOb3RlIHRoYXQgd2hlbiBkZXJlZmVyZW5jaW5nIGFycmF5CiAgICAgICAqICAgaW5kaWNlcywgdGhlIGluZGV4IG1heSBiZSB1c2VkIGFzIGEgZG90dGVkIHBhcnQgZGlyZWN0bHkKICAgICAgICogICAoZS5nLiBgJ3VzZXJzLjEyLm5hbWUnYCBvciBgWyd1c2VycycsIDEyLCAnbmFtZSddYCkuCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0IGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4KICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSByb290IFJvb3Qgb2JqZWN0IGZyb20gd2hpY2ggdGhlIHBhdGggaXMgZXZhbHVhdGVkLgogICAgICAgKiAgIFdoZW4gc3BlY2lmaWVkLCBubyBub3RpZmljYXRpb24gd2lsbCBvY2N1ci4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBzZXQocGF0aCwgdmFsdWUsIHJvb3QpIHsKICAgICAgICBpZiAocm9vdCkgewogICAgICAgICAgUG9seW1lci5QYXRoLnNldChyb290LCBwYXRoLCB2YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICghdGhpc1tUWVBFUy5SRUFEX09OTFldIHx8ICF0aGlzW1RZUEVTLlJFQURfT05MWV1bLyoqIEB0eXBlIHtzdHJpbmd9ICovKHBhdGgpXSkgewogICAgICAgICAgICBpZiAodGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHZhbHVlLCB0cnVlKSkgewogICAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBZGRzIGl0ZW1zIG9udG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkgYXQgdGhlIHBhdGggc3BlY2lmaWVkLgogICAgICAgKgogICAgICAgKiBUaGUgYXJndW1lbnRzIGFmdGVyIGBwYXRoYCBhbmQgcmV0dXJuIHZhbHVlIG1hdGNoIHRoYXQgb2YKICAgICAgICogYEFycmF5LnByb3RvdHlwZS5wdXNoYC4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2Qgbm90aWZpZXMgb3RoZXIgcGF0aHMgdG8gdGhlIHNhbWUgYXJyYXkgdGhhdCBhCiAgICAgICAqIHNwbGljZSBvY2N1cnJlZCB0byB0aGUgYXJyYXkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIFBhdGggdG8gYXJyYXkuCiAgICAgICAqIEBwYXJhbSB7Li4uKn0gaXRlbXMgSXRlbXMgdG8gcHVzaCBvbnRvIGFycmF5CiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gTmV3IGxlbmd0aCBvZiB0aGUgYXJyYXkuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHB1c2gocGF0aCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0qLyhQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIHBhdGgsIGluZm8pKTsKICAgICAgICBsZXQgbGVuID0gYXJyYXkubGVuZ3RoOwogICAgICAgIGxldCByZXQgPSBhcnJheS5wdXNoKC4uLml0ZW1zKTsKICAgICAgICBpZiAoaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgbGVuLCBpdGVtcy5sZW5ndGgsIFtdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoZSBlbmQgb2YgYXJyYXkgYXQgdGhlIHBhdGggc3BlY2lmaWVkLgogICAgICAgKgogICAgICAgKiBUaGUgYXJndW1lbnRzIGFmdGVyIGBwYXRoYCBhbmQgcmV0dXJuIHZhbHVlIG1hdGNoIHRoYXQgb2YKICAgICAgICogYEFycmF5LnByb3RvdHlwZS5wb3BgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyBvdGhlciBwYXRocyB0byB0aGUgc2FtZSBhcnJheSB0aGF0IGEKICAgICAgICogc3BsaWNlIG9jY3VycmVkIHRvIHRoZSBhcnJheS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBhcnJheS4KICAgICAgICogQHJldHVybiB7Kn0gSXRlbSB0aGF0IHdhcyByZW1vdmVkLgogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICBwb3AocGF0aCkgewogICAgICAgIGxldCBpbmZvID0ge3BhdGg6ICcnfTsKICAgICAgICBsZXQgYXJyYXkgPSAvKiogQHR5cGUge0FycmF5fSAqLyhQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIHBhdGgsIGluZm8pKTsKICAgICAgICBsZXQgaGFkTGVuZ3RoID0gQm9vbGVhbihhcnJheS5sZW5ndGgpOwogICAgICAgIGxldCByZXQgPSBhcnJheS5wb3AoKTsKICAgICAgICBpZiAoaGFkTGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgYXJyYXkubGVuZ3RoLCAwLCBbcmV0XSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTdGFydGluZyBmcm9tIHRoZSBzdGFydCBpbmRleCBzcGVjaWZpZWQsIHJlbW92ZXMgMCBvciBtb3JlIGl0ZW1zCiAgICAgICAqIGZyb20gdGhlIGFycmF5IGFuZCBpbnNlcnRzIDAgb3IgbW9yZSBuZXcgaXRlbXMgaW4gdGhlaXIgcGxhY2UuCiAgICAgICAqCiAgICAgICAqIFRoZSBhcmd1bWVudHMgYWZ0ZXIgYHBhdGhgIGFuZCByZXR1cm4gdmFsdWUgbWF0Y2ggdGhhdCBvZgogICAgICAgKiBgQXJyYXkucHJvdG90eXBlLnNwbGljZWAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgSW5kZXggZnJvbSB3aGljaCB0byBzdGFydCByZW1vdmluZy9pbnNlcnRpbmcuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxldGVDb3VudCBOdW1iZXIgb2YgaXRlbXMgdG8gcmVtb3ZlLgogICAgICAgKiBAcGFyYW0gey4uLip9IGl0ZW1zIEl0ZW1zIHRvIGluc2VydCBpbnRvIGFycmF5LgogICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgb2YgcmVtb3ZlZCBpdGVtcy4KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgc3BsaWNlKHBhdGgsIHN0YXJ0LCBkZWxldGVDb3VudCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoIDogJyd9OwogICAgICAgIGxldCBhcnJheSA9IC8qKiBAdHlwZSB7QXJyYXl9ICovKFBvbHltZXIuUGF0aC5nZXQodGhpcywgcGF0aCwgaW5mbykpOwogICAgICAgIC8vIE5vcm1hbGl6ZSBmYW5jeSBuYXRpdmUgc3BsaWNlIGhhbmRsaW5nIG9mIGNyYXp5IHN0YXJ0IHZhbHVlcwogICAgICAgIGlmIChzdGFydCA8IDApIHsKICAgICAgICAgIHN0YXJ0ID0gYXJyYXkubGVuZ3RoIC0gTWF0aC5mbG9vcigtc3RhcnQpOwogICAgICAgIH0gZWxzZSBpZiAoc3RhcnQpIHsKICAgICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzdGFydCk7CiAgICAgICAgfQogICAgICAgIC8vIGFycmF5LnNwbGljZSBkb2VzIGRpZmZlcmVudCB0aGluZ3MgYmFzZWQgb24gdGhlIG51bWJlciBvZiBhcmd1bWVudHMKICAgICAgICAvLyB5b3UgcGFzcyBpbi4gVGhlcmVmb3JlLCBhcnJheS5zcGxpY2UoMCkgYW5kIGFycmF5LnNwbGljZSgwLCB1bmRlZmluZWQpCiAgICAgICAgLy8gZG8gZGlmZmVyZW50IHRoaW5ncy4gSW4gdGhlIGZvcm1lciwgdGhlIHdob2xlIGFycmF5IGlzIGNsZWFyZWQuIEluIHRoZQogICAgICAgIC8vIGxhdHRlciwgbm8gaXRlbXMgYXJlIHJlbW92ZWQuCiAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHdlIG5lZWQgdG8gZGV0ZWN0IHdoZXRoZXIgMS4gb25lIG9mIHRoZSBhcmd1bWVudHMKICAgICAgICAvLyBpcyBhY3R1YWxseSBwYXNzZWQgaW4gYW5kIHRoZW4gMi4gZGV0ZXJtaW5lIGhvdyBtYW55IGFyZ3VtZW50cwogICAgICAgIC8vIHdlIHNob3VsZCBwYXNzIG9uIHRvIHRoZSBuYXRpdmUgYXJyYXkuc3BsaWNlCiAgICAgICAgLy8KICAgICAgICBsZXQgcmV0OwogICAgICAgIC8vIE9taXQgYW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGlmIHRoZXkgd2VyZSBub3QgcGFzc2VkIGluCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKICAgICAgICAgIHJldCA9IGFycmF5LnNwbGljZShzdGFydCk7CiAgICAgICAgLy8gRWl0aGVyIHN0YXJ0IHdhcyB1bmRlZmluZWQgYW5kIHRoZSBvdGhlcnMgd2VyZSBkZWZpbmVkLCBidXQgaW4gdGhpcwogICAgICAgIC8vIGNhc2Ugd2UgY2FuIHNhZmVseSBwYXNzIG9uIGFsbCBhcmd1bWVudHMKICAgICAgICAvLwogICAgICAgIC8vIE5vdGU6IHRoaXMgaW5jbHVkZXMgdGhlIGNhc2Ugd2hlcmUgbm9uZSBvZiB0aGUgYXJndW1lbnRzIHdlcmUgcGFzc2VkIGluLAogICAgICAgIC8vIGUuZy4gdGhpcy5zcGxpY2UoJ2FycmF5JykuIEhvd2V2ZXIsIGlmIGJvdGggc3RhcnQgYW5kIGRlbGV0ZUNvdW50CiAgICAgICAgLy8gYXJlIHVuZGVmaW5lZCwgYXJyYXkuc3BsaWNlIHdpbGwgbm90IG1vZGlmeSB0aGUgYXJyYXkgKGFzIGV4cGVjdGVkKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXQgPSBhcnJheS5zcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50LCAuLi5pdGVtcyk7CiAgICAgICAgfQogICAgICAgIC8vIEF0IHRoZSBlbmQsIGNoZWNrIHdoZXRoZXIgYW55IGl0ZW1zIHdlcmUgcGFzc2VkIGluIChlLmcuIGluc2VydGlvbnMpCiAgICAgICAgLy8gb3IgaWYgdGhlIHJldHVybiBhcnJheSBjb250YWlucyBpdGVtcyAoZS5nLiBkZWxldGlvbnMpLgogICAgICAgIC8vIE9ubHkgbm90aWZ5IGlmIGl0ZW1zIHdlcmUgYWRkZWQgb3IgZGVsZXRlZC4KICAgICAgICBpZiAoaXRlbXMubGVuZ3RoIHx8IHJldC5sZW5ndGgpIHsKICAgICAgICAgIG5vdGlmeVNwbGljZSh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCBzdGFydCwgaXRlbXMubGVuZ3RoLCByZXQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhcnJheSBhdCB0aGUgcGF0aCBzcGVjaWZpZWQuCiAgICAgICAqCiAgICAgICAqIFRoZSBhcmd1bWVudHMgYWZ0ZXIgYHBhdGhgIGFuZCByZXR1cm4gdmFsdWUgbWF0Y2ggdGhhdCBvZgogICAgICAgKiBgQXJyYXkucHJvdG90eXBlLnBvcGAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcmV0dXJuIHsqfSBJdGVtIHRoYXQgd2FzIHJlbW92ZWQuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHNoaWZ0KHBhdGgpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbGV0IGhhZExlbmd0aCA9IEJvb2xlYW4oYXJyYXkubGVuZ3RoKTsKICAgICAgICBsZXQgcmV0ID0gYXJyYXkuc2hpZnQoKTsKICAgICAgICBpZiAoaGFkTGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgMCwgMCwgW3JldF0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQWRkcyBpdGVtcyBvbnRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5IGF0IHRoZSBwYXRoIHNwZWNpZmllZC4KICAgICAgICoKICAgICAgICogVGhlIGFyZ3VtZW50cyBhZnRlciBgcGF0aGAgYW5kIHJldHVybiB2YWx1ZSBtYXRjaCB0aGF0IG9mCiAgICAgICAqIGBBcnJheS5wcm90b3R5cGUucHVzaGAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcGFyYW0gey4uLip9IGl0ZW1zIEl0ZW1zIHRvIGluc2VydCBpbmZvIGFycmF5CiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gTmV3IGxlbmd0aCBvZiB0aGUgYXJyYXkuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHVuc2hpZnQocGF0aCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbGV0IHJldCA9IGFycmF5LnVuc2hpZnQoLi4uaXRlbXMpOwogICAgICAgIGlmIChpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgIG5vdGlmeVNwbGljZSh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCAwLCBpdGVtcy5sZW5ndGgsIFtdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE5vdGlmeSB0aGF0IGEgcGF0aCBoYXMgY2hhbmdlZC4KICAgICAgICoKICAgICAgICogRXhhbXBsZToKICAgICAgICoKICAgICAgICogICAgIHRoaXMuaXRlbS51c2VyLm5hbWUgPSAnQm9iJzsKICAgICAgICogICAgIHRoaXMubm90aWZ5UGF0aCgnaXRlbS51c2VyLm5hbWUnKTsKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0aGF0IHNob3VsZCBiZSBub3RpZmllZC4KICAgICAgICogQHBhcmFtIHsqPX0gdmFsdWUgVmFsdWUgYXQgdGhlIHBhdGggKG9wdGlvbmFsKS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBub3RpZnlQYXRoKHBhdGgsIHZhbHVlKSB7CiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgbGV0IHByb3BQYXRoOwogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgICAgIC8vIEdldCB2YWx1ZSBpZiBub3Qgc3VwcGxpZWQKICAgICAgICAgIGxldCBpbmZvID0ge3BhdGg6ICcnfTsKICAgICAgICAgIHZhbHVlID0gUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKTsKICAgICAgICAgIHByb3BQYXRoID0gaW5mby5wYXRoOwogICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkgewogICAgICAgICAgLy8gTm9ybWFsaXplIHBhdGggaWYgbmVlZGVkCiAgICAgICAgICBwcm9wUGF0aCA9IFBvbHltZXIuUGF0aC5ub3JtYWxpemUocGF0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHByb3BQYXRoID0gLyoqIEB0eXBle3N0cmluZ30gKi8ocGF0aCk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocHJvcFBhdGgsIHZhbHVlLCB0cnVlLCB0cnVlKSkgewogICAgICAgICAgdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eWAgQVBJIGJ1dCBjYW4gYmUgY2FsbGVkIG9uCiAgICAgICAqIGFuIGluc3RhbmNlIHRvIGFkZCBlZmZlY3RzIGF0IHJ1bnRpbWUuICBTZWUgdGhhdCBtZXRob2QgZm9yCiAgICAgICAqIGZ1bGwgQVBJIGRvY3MuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHByb3RlY3RlZFNldHRlciBDcmVhdGVzIGEgY3VzdG9tIHByb3RlY3RlZCBzZXR0ZXIKICAgICAgICogICB3aGVuIGB0cnVlYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkocHJvcGVydHksIHByb3RlY3RlZFNldHRlcikgewogICAgICAgIHRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5SRUFEX09OTFkpOwogICAgICAgIGlmIChwcm90ZWN0ZWRTZXR0ZXIpIHsKICAgICAgICAgIHRoaXNbJ19zZXQnICsgdXBwZXIocHJvcGVydHkpXSA9IC8qKiBAdGhpcyB7UHJvcGVydHlFZmZlY3RzfSAqL2Z1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSk7CiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyYCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHtzdHJpbmd8ZnVuY3Rpb24oKiwqKX0gbWV0aG9kIEZ1bmN0aW9uIG9yIG5hbWUgb2Ygb2JzZXJ2ZXIgbWV0aG9kIHRvIGNhbGwKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gZHluYW1pY0ZuIFdoZXRoZXIgdGhlIG1ldGhvZCBuYW1lIHNob3VsZCBiZSBpbmNsdWRlZCBhcwogICAgICAgKiAgIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfY3JlYXRlUHJvcGVydHlPYnNlcnZlcihwcm9wZXJ0eSwgbWV0aG9kLCBkeW5hbWljRm4pIHsKICAgICAgICBsZXQgaW5mbyA9IHsgcHJvcGVydHksIG1ldGhvZCwgZHluYW1pY0ZuOiBCb29sZWFuKGR5bmFtaWNGbikgfTsKICAgICAgICB0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuT0JTRVJWRSwgewogICAgICAgICAgZm46IHJ1bk9ic2VydmVyRWZmZWN0LCBpbmZvLCB0cmlnZ2VyOiB7bmFtZTogcHJvcGVydHl9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGR5bmFtaWNGbikgewogICAgICAgICAgdGhpcy5fYWRkUHJvcGVydHlFZmZlY3QoLyoqIEB0eXBlIHtzdHJpbmd9ICovKG1ldGhvZCksIFRZUEVTLk9CU0VSVkUsIHsKICAgICAgICAgICAgZm46IHJ1bk9ic2VydmVyRWZmZWN0LCBpbmZvLCB0cmlnZ2VyOiB7bmFtZTogbWV0aG9kfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZU1ldGhvZE9ic2VydmVyYCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZwogICAgICAgKiAgIHdoZXRoZXIgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZU1ldGhvZE9ic2VydmVyKGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIGxldCBzaWcgPSBwYXJzZU1ldGhvZChleHByZXNzaW9uKTsKICAgICAgICBpZiAoIXNpZykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgb2JzZXJ2ZXIgZXhwcmVzc2lvbiAnIiArIGV4cHJlc3Npb24gKyAiJyIpOwogICAgICAgIH0KICAgICAgICBjcmVhdGVNZXRob2RFZmZlY3QodGhpcywgc2lnLCBUWVBFUy5PQlNFUlZFLCBydW5NZXRob2RFZmZlY3QsIG51bGwsIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgY3JlYXRlTm90aWZ5aW5nUHJvcGVydHlgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfY3JlYXRlTm90aWZ5aW5nUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICB0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuTk9USUZZLCB7CiAgICAgICAgICBmbjogcnVuTm90aWZ5RWZmZWN0LAogICAgICAgICAgaW5mbzogewogICAgICAgICAgICBldmVudE5hbWU6IENhc2VNYXAuY2FtZWxUb0Rhc2hDYXNlKHByb3BlcnR5KSArICctY2hhbmdlZCcsCiAgICAgICAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZVJlZmxlY3RlZFByb3BlcnR5YCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZVJlZmxlY3RlZFByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgbGV0IGF0dHIgPSB0aGlzLmNvbnN0cnVjdG9yLmF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShwcm9wZXJ0eSk7CiAgICAgICAgaWYgKGF0dHJbMF0gPT09ICctJykgewogICAgICAgICAgY29uc29sZS53YXJuKCdQcm9wZXJ0eSAnICsgcHJvcGVydHkgKyAnIGNhbm5vdCBiZSByZWZsZWN0ZWQgdG8gYXR0cmlidXRlICcgKwogICAgICAgICAgICBhdHRyICsgJyBiZWNhdXNlICItIiBpcyBub3QgYSB2YWxpZCBzdGFydGluZyBhdHRyaWJ1dGUgbmFtZS4gVXNlIGEgbG93ZXJjYXNlIGZpcnN0IGxldHRlciBmb3IgdGhlIHByb3BlcnR5IGluc3RlYWQuJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5SRUZMRUNULCB7CiAgICAgICAgICAgIGZuOiBydW5SZWZsZWN0RWZmZWN0LAogICAgICAgICAgICBpbmZvOiB7CiAgICAgICAgICAgICAgYXR0ck5hbWU6IGF0dHIKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZUNvbXB1dGVkUHJvcGVydHlgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBjb21wdXRlZCBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZwogICAgICAgKiAgIHdoZXRoZXIgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZUNvbXB1dGVkUHJvcGVydHkocHJvcGVydHksIGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIGxldCBzaWcgPSBwYXJzZU1ldGhvZChleHByZXNzaW9uKTsKICAgICAgICBpZiAoIXNpZykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgY29tcHV0ZWQgZXhwcmVzc2lvbiAnIiArIGV4cHJlc3Npb24gKyAiJyIpOwogICAgICAgIH0KICAgICAgICBjcmVhdGVNZXRob2RFZmZlY3QodGhpcywgc2lnLCBUWVBFUy5DT01QVVRFLCBydW5Db21wdXRlZEVmZmVjdCwgcHJvcGVydHksIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBHYXRoZXIgdGhlIGFyZ3VtZW50IHZhbHVlcyBmb3IgYSBtZXRob2Qgc3BlY2lmaWVkIGluIHRoZSBwcm92aWRlZCBhcnJheQogICAgICAgKiBvZiBhcmd1bWVudCBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogVGhlIGBwYXRoYCBhbmQgYHZhbHVlYCBhcmd1bWVudHMgYXJlIHVzZWQgdG8gZmlsbCBpbiB3aWxkY2FyZCBkZXNjcmlwdG9yCiAgICAgICAqIHdoZW4gdGhlIG1ldGhvZCBpcyBiZWluZyBjYWxsZWQgYXMgYSByZXN1bHQgb2YgYSBwYXRoIG5vdGlmaWNhdGlvbi4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshQXJyYXk8IU1ldGhvZEFyZz59IGFyZ3MgQXJyYXkgb2YgYXJndW1lbnQgbWV0YWRhdGEKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUHJvcGVydHkvcGF0aCBuYW1lIHRoYXQgdHJpZ2dlcmVkIHRoZSBtZXRob2QgZWZmZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgICAqIEByZXR1cm4ge0FycmF5PCo+fSBBcnJheSBvZiBhcmd1bWVudCB2YWx1ZXMKICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9tYXJzaGFsQXJncyhhcmdzLCBwYXRoLCBwcm9wcykgewogICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9fZGF0YTsKICAgICAgICBsZXQgdmFsdWVzID0gW107CiAgICAgICAgZm9yIChsZXQgaT0wLCBsPWFyZ3MubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgICAgbGV0IGFyZyA9IGFyZ3NbaV07CiAgICAgICAgICBsZXQgbmFtZSA9IGFyZy5uYW1lOwogICAgICAgICAgbGV0IHY7CiAgICAgICAgICBpZiAoYXJnLmxpdGVyYWwpIHsKICAgICAgICAgICAgdiA9IGFyZy52YWx1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChhcmcuc3RydWN0dXJlZCkgewogICAgICAgICAgICAgIHYgPSBQb2x5bWVyLlBhdGguZ2V0KGRhdGEsIG5hbWUpOwogICAgICAgICAgICAgIC8vIHdoZW4gZGF0YSBpcyBub3Qgc3RvcmVkIGUuZy4gYHNwbGljZXNgCiAgICAgICAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgdiA9IHByb3BzW25hbWVdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2ID0gZGF0YVtuYW1lXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGFyZy53aWxkY2FyZCkgewogICAgICAgICAgICAvLyBPbmx5IHNlbmQgdGhlIGFjdHVhbCBwYXRoIGNoYW5nZWQgaW5mbyBpZiB0aGUgY2hhbmdlIHRoYXQKICAgICAgICAgICAgLy8gY2F1c2VkIHRoZSBvYnNlcnZlciB0byBydW4gbWF0Y2hlZCB0aGUgd2lsZGNhcmQKICAgICAgICAgICAgbGV0IGJhc2VDaGFuZ2VkID0gKG5hbWUuaW5kZXhPZihwYXRoICsgJy4nKSA9PT0gMCk7CiAgICAgICAgICAgIGxldCBtYXRjaGVzID0gKHBhdGguaW5kZXhPZihuYW1lKSA9PT0gMCAmJiAhYmFzZUNoYW5nZWQpOwogICAgICAgICAgICB2YWx1ZXNbaV0gPSB7CiAgICAgICAgICAgICAgcGF0aDogbWF0Y2hlcyA/IHBhdGggOiBuYW1lLAogICAgICAgICAgICAgIHZhbHVlOiBtYXRjaGVzID8gcHJvcHNbcGF0aF0gOiB2LAogICAgICAgICAgICAgIGJhc2U6IHYKICAgICAgICAgICAgfTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhbHVlc1tpXSA9IHY7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZXM7CiAgICAgIH0KCiAgICAgIC8vIC0tIHN0YXRpYyBjbGFzcyBtZXRob2RzIC0tLS0tLS0tLS0tLQoKICAgICAgLyoqCiAgICAgICAqIEVuc3VyZXMgYW4gYWNjZXNzb3IgZXhpc3RzIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LCBhbmQgYWRkcwogICAgICAgKiB0byBhIGxpc3Qgb2YgInByb3BlcnR5IGVmZmVjdHMiIHRoYXQgd2lsbCBydW4gd2hlbiB0aGUgYWNjZXNzb3IgZm9yCiAgICAgICAqIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaXMgc2V0LiAgRWZmZWN0cyBhcmUgZ3JvdXBlZCBieSAidHlwZSIsIHdoaWNoCiAgICAgICAqIHJvdWdobHkgY29ycmVzcG9uZHMgdG8gYSBwaGFzZSBpbiBlZmZlY3QgcHJvY2Vzc2luZy4gIFRoZSBlZmZlY3QKICAgICAgICogbWV0YWRhdGEgc2hvdWxkIGJlIGluIHRoZSBmb2xsb3dpbmcgZm9ybToKICAgICAgICoKICAgICAgICogICAgIHsKICAgICAgICogICAgICAgZm46IGVmZmVjdEZ1bmN0aW9uLCAvLyBSZWZlcmVuY2UgdG8gZnVuY3Rpb24gdG8gY2FsbCB0byBwZXJmb3JtIGVmZmVjdAogICAgICAgKiAgICAgICBpbmZvOiB7IC4uLiB9ICAgICAgIC8vIEVmZmVjdCBtZXRhZGF0YSBwYXNzZWQgdG8gZnVuY3Rpb24KICAgICAgICogICAgICAgdHJpZ2dlcjogeyAgICAgICAgICAvLyBPcHRpb25hbCB0cmlnZ2VyaW5nIG1ldGFkYXRhOyBpZiBub3QgcHJvdmlkZWQKICAgICAgICogICAgICAgICBuYW1lOiBzdHJpbmcgICAgICAvLyB0aGUgcHJvcGVydHkgaXMgdHJlYXRlZCBhcyBhIHdpbGRjYXJkCiAgICAgICAqICAgICAgICAgc3RydWN0dXJlZDogYm9vbGVhbgogICAgICAgKiAgICAgICAgIHdpbGRjYXJkOiBib29sZWFuCiAgICAgICAqICAgICAgIH0KICAgICAgICogICAgIH0KICAgICAgICoKICAgICAgICogRWZmZWN0cyBhcmUgY2FsbGVkIGZyb20gYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgaW4gdGhlIGZvbGxvd2luZyBvcmRlciBieQogICAgICAgKiB0eXBlOgogICAgICAgKgogICAgICAgKiAxLiBDT01QVVRFCiAgICAgICAqIDIuIFBST1BBR0FURQogICAgICAgKiAzLiBSRUZMRUNUCiAgICAgICAqIDQuIE9CU0VSVkUKICAgICAgICogNS4gTk9USUZZCiAgICAgICAqCiAgICAgICAqIEVmZmVjdCBmdW5jdGlvbnMgYXJlIGNhbGxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlOgogICAgICAgKgogICAgICAgKiAgICAgZWZmZWN0RnVuY3Rpb24oaW5zdCwgcGF0aCwgcHJvcHMsIG9sZFByb3BzLCBpbmZvLCBoYXNQYXRocykKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRoYXQgc2hvdWxkIHRyaWdnZXIgdGhlIGVmZmVjdAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFZmZlY3QgdHlwZSwgZnJvbSB0aGlzLlBST1BFUlRZX0VGRkVDVF9UWVBFUwogICAgICAgKiBAcGFyYW0ge09iamVjdD19IGVmZmVjdCBFZmZlY3QgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBhZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSwgZWZmZWN0KSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCB0eXBlLCBlZmZlY3QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIHNpbmdsZS1wcm9wZXJ0eSBvYnNlcnZlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ3xmdW5jdGlvbigqLCopfSBtZXRob2QgRnVuY3Rpb24gb3IgbmFtZSBvZiBvYnNlcnZlciBtZXRob2QgdG8gY2FsbAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBkeW5hbWljRm4gV2hldGhlciB0aGUgbWV0aG9kIG5hbWUgc2hvdWxkIGJlIGluY2x1ZGVkIGFzCiAgICAgICAqICAgYSBkZXBlbmRlbmN5IHRvIHRoZSBlZmZlY3QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyKHByb3BlcnR5LCBtZXRob2QsIGR5bmFtaWNGbikgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVQcm9wZXJ0eU9ic2VydmVyKHByb3BlcnR5LCBtZXRob2QsIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIGEgbXVsdGktcHJvcGVydHkgIm1ldGhvZCBvYnNlcnZlciIgYmFzZWQgb24gdGhlIHByb3ZpZGVkCiAgICAgICAqIGV4cHJlc3Npb24sIHdoaWNoIHNob3VsZCBiZSBhIHN0cmluZyBpbiB0aGUgZm9ybSBvZiBhIG5vcm1hbCBKYXZhU2NyaXB0CiAgICAgICAqIGZ1bmN0aW9uIHNpZ25hdHVyZTogYCdtZXRob2ROYW1lKGFyZzEsIFsuLi4sIGFyZ25dKSdgLiAgRWFjaCBhcmd1bWVudAogICAgICAgKiBzaG91bGQgY29ycmVzcG9uZCB0byBhIHByb3BlcnR5IG9yIHBhdGggaW4gdGhlIGNvbnRleHQgb2YgdGhpcwogICAgICAgKiBwcm90b3R5cGUgKG9yIGluc3RhbmNlKSwgb3IgbWF5IGJlIGEgbGl0ZXJhbCBzdHJpbmcgb3IgbnVtYmVyLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBNZXRob2QgZXhwcmVzc2lvbgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW58T2JqZWN0PX0gZHluYW1pY0ZuIEJvb2xlYW4gb3Igb2JqZWN0IG1hcCBpbmRpY2F0aW5nCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqICAgd2hldGhlciBtZXRob2QgbmFtZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlTWV0aG9kT2JzZXJ2ZXIoZXhwcmVzc2lvbiwgZHluYW1pY0ZuKSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZU1ldGhvZE9ic2VydmVyKGV4cHJlc3Npb24sIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYXVzZXMgdGhlIHNldHRlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IHRvIGRpc3BhdGNoIGA8cHJvcGVydHk+LWNoYW5nZWRgCiAgICAgICAqIGV2ZW50cyB0byBub3RpZnkgb2YgY2hhbmdlcyB0byB0aGUgcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eShwcm9wZXJ0eSkgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eShwcm9wZXJ0eSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIGEgcmVhZC1vbmx5IGFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIFRvIHNldCB0aGUgcHJvcGVydHksIHVzZSB0aGUgcHJvdGVjdGVkIGBfc2V0UHJvcGVydHlgIEFQSS4KICAgICAgICogVG8gY3JlYXRlIGEgY3VzdG9tIHByb3RlY3RlZCBzZXR0ZXIgKGUuZy4gYF9zZXRNeVByb3AoKWAgZm9yCiAgICAgICAqIHByb3BlcnR5IGBteVByb3BgKSwgcGFzcyBgdHJ1ZWAgZm9yIGBwcm90ZWN0ZWRTZXR0ZXJgLgogICAgICAgKgogICAgICAgKiBOb3RlLCBpZiB0aGUgcHJvcGVydHkgd2lsbCBoYXZlIG90aGVyIHByb3BlcnR5IGVmZmVjdHMsIHRoaXMgbWV0aG9kCiAgICAgICAqIHNob3VsZCBiZSBjYWxsZWQgZmlyc3QsIGJlZm9yZSBhZGRpbmcgb3RoZXIgZWZmZWN0cy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gcHJvdGVjdGVkU2V0dGVyIENyZWF0ZXMgYSBjdXN0b20gcHJvdGVjdGVkIHNldHRlcgogICAgICAgKiAgIHdoZW4gYHRydWVgLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eShwcm9wZXJ0eSwgcHJvdGVjdGVkU2V0dGVyKSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkocHJvcGVydHksIHByb3RlY3RlZFNldHRlcik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYXVzZXMgdGhlIHNldHRlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IHRvIHJlZmxlY3QgdGhlIHByb3BlcnR5IHZhbHVlCiAgICAgICAqIHRvIGEgKGRhc2gtY2FzZWQpIGF0dHJpYnV0ZSBvZiB0aGUgc2FtZSBuYW1lLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICB0aGlzLnByb3RvdHlwZS5fY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkocHJvcGVydHkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIGNvbXB1dGVkIHByb3BlcnR5IHdob3NlIHZhbHVlIGlzIHNldCB0byB0aGUgcmVzdWx0IG9mIHRoZQogICAgICAgKiBtZXRob2QgZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiBgZXhwcmVzc2lvbmAgZWFjaCB0aW1lIG9uZSBvciBtb3JlCiAgICAgICAqIGFyZ3VtZW50cyB0byB0aGUgbWV0aG9kIGNoYW5nZXMuICBUaGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgYSBzdHJpbmcKICAgICAgICogaW4gdGhlIGZvcm0gb2YgYSBub3JtYWwgSmF2YVNjcmlwdCBmdW5jdGlvbiBzaWduYXR1cmU6CiAgICAgICAqIGAnbWV0aG9kTmFtZShhcmcxLCBbLi4uLCBhcmduXSknYAogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBjb21wdXRlZCBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZyB3aGV0aGVyCiAgICAgICAqICAgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZUNvbXB1dGVkUHJvcGVydHkocHJvcGVydHksIGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVDb21wdXRlZFByb3BlcnR5KHByb3BlcnR5LCBleHByZXNzaW9uLCBkeW5hbWljRm4pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUGFyc2VzIHRoZSBwcm92aWRlZCB0ZW1wbGF0ZSB0byBlbnN1cmUgYmluZGluZyBlZmZlY3RzIGFyZSBjcmVhdGVkCiAgICAgICAqIGZvciB0aGVtLCBhbmQgdGhlbiBlbnN1cmVzIHByb3BlcnR5IGFjY2Vzc29ycyBhcmUgY3JlYXRlZCBmb3IgYW55CiAgICAgICAqIGRlcGVuZGVudCBwcm9wZXJ0aWVzIGluIHRoZSB0ZW1wbGF0ZS4gIEJpbmRpbmcgZWZmZWN0cyBmb3IgYm91bmQKICAgICAgICogdGVtcGxhdGVzIGFyZSBzdG9yZWQgaW4gYSBsaW5rZWQgbGlzdCBvbiB0aGUgaW5zdGFuY2Ugc28gdGhhdAogICAgICAgKiB0ZW1wbGF0ZXMgY2FuIGJlIGVmZmljaWVudGx5IHN0YW1wZWQgYW5kIHVuc3RhbXBlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgY29udGFpbmluZyBiaW5kaW5nCiAgICAgICAqICAgYmluZGluZ3MKICAgICAgICogQHJldHVybiB7IVRlbXBsYXRlSW5mb30gVGVtcGxhdGUgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBiaW5kVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5wcm90b3R5cGUuX2JpbmRUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgIH0KCiAgICAgIC8vIC0tIGJpbmRpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBiaW5kVGVtcGxhdGVgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG9uIHRoZSBwcm90b3R5cGUgKGZvciBwcm90b3R5cGljYWwgdGVtcGxhdGUKICAgICAgICogYmluZGluZywgdG8gYXZvaWQgY3JlYXRpbmcgYWNjZXNzb3JzIGV2ZXJ5IGluc3RhbmNlKSBvbmNlIHBlciBwcm90b3R5cGUsCiAgICAgICAqIGFuZCB3aWxsIGJlIGNhbGxlZCB3aXRoIGBydW50aW1lQmluZGluZzogdHJ1ZWAgYnkgYF9zdGFtcFRlbXBsYXRlYCB0bwogICAgICAgKiBjcmVhdGUgYW5kIGxpbmsgYW4gaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCBhCiAgICAgICAqIHBhcnRpY3VsYXIgc3RhbXBpbmcuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIGNvbnRhaW5pbmcgYmluZGluZwogICAgICAgKiAgIGJpbmRpbmdzCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGluc3RhbmNlQmluZGluZyBXaGVuIGZhbHNlIChkZWZhdWx0KSwgcGVyZm9ybXMKICAgICAgICogICAicHJvdG90eXBpY2FsIiBiaW5kaW5nIG9mIHRoZSB0ZW1wbGF0ZSBhbmQgb3ZlcndyaXRlcyBhbnkgcHJldmlvdXNseQogICAgICAgKiAgIGJvdW5kIHRlbXBsYXRlIGZvciB0aGUgY2xhc3MuIFdoZW4gdHJ1ZSAoYXMgcGFzc2VkIGZyb20KICAgICAgICogICBgX3N0YW1wVGVtcGxhdGVgKSwgdGhlIHRlbXBsYXRlIGluZm8gaXMgaW5zdGFuY2VkIGFuZCBsaW5rZWQgaW50bwogICAgICAgKiAgIHRoZSBsaXN0IG9mIGJvdW5kIHRlbXBsYXRlcy4KICAgICAgICogQHJldHVybiB7IVRlbXBsYXRlSW5mb30gVGVtcGxhdGUgbWV0YWRhdGEgb2JqZWN0OyBmb3IgYHJ1bnRpbWVCaW5kaW5nYCwKICAgICAgICogICB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBwcm90b3R5cGljYWwgdGVtcGxhdGUgaW5mbwogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfYmluZFRlbXBsYXRlKHRlbXBsYXRlLCBpbnN0YW5jZUJpbmRpbmcpIHsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5jb25zdHJ1Y3Rvci5fcGFyc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgbGV0IHdhc1ByZUJvdW5kID0gdGhpcy5fX3RlbXBsYXRlSW5mbyA9PSB0ZW1wbGF0ZUluZm87CiAgICAgICAgLy8gT3B0aW1pemF0aW9uOiBzaW5jZSB0aGlzIGlzIGNhbGxlZCB0d2ljZSBmb3IgcHJvdG8tYm91bmQgdGVtcGxhdGVzLAogICAgICAgIC8vIGRvbid0IGF0dGVtcHQgdG8gcmVjcmVhdGUgYWNjZXNzb3JzIGlmIHRoaXMgdGVtcGxhdGUgd2FzIHByZS1ib3VuZAogICAgICAgIGlmICghd2FzUHJlQm91bmQpIHsKICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gdGVtcGxhdGVJbmZvLnByb3BlcnR5RWZmZWN0cykgewogICAgICAgICAgICB0aGlzLl9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKHByb3ApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaW5zdGFuY2VCaW5kaW5nKSB7CiAgICAgICAgICAvLyBGb3IgaW5zdGFuY2UtdGltZSBiaW5kaW5nLCBjcmVhdGUgaW5zdGFuY2Ugb2YgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICAgIC8vIGFuZCBsaW5rIGludG8gbGlzdCBvZiB0ZW1wbGF0ZXMgaWYgbmVjZXNzYXJ5CiAgICAgICAgICB0ZW1wbGF0ZUluZm8gPSAvKiogQHR5cGUgeyFUZW1wbGF0ZUluZm99ICovKE9iamVjdC5jcmVhdGUodGVtcGxhdGVJbmZvKSk7CiAgICAgICAgICB0ZW1wbGF0ZUluZm8ud2FzUHJlQm91bmQgPSB3YXNQcmVCb3VuZDsKICAgICAgICAgIGlmICghd2FzUHJlQm91bmQgJiYgdGhpcy5fX3RlbXBsYXRlSW5mbykgewogICAgICAgICAgICBsZXQgbGFzdCA9IHRoaXMuX190ZW1wbGF0ZUluZm9MYXN0IHx8IHRoaXMuX190ZW1wbGF0ZUluZm87CiAgICAgICAgICAgIHRoaXMuX190ZW1wbGF0ZUluZm9MYXN0ID0gbGFzdC5uZXh0VGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvOwogICAgICAgICAgICB0ZW1wbGF0ZUluZm8ucHJldmlvdXNUZW1wbGF0ZUluZm8gPSBsYXN0OwogICAgICAgICAgICByZXR1cm4gdGVtcGxhdGVJbmZvOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fX3RlbXBsYXRlSW5mbyA9IHRlbXBsYXRlSW5mbzsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFkZHMgYSBwcm9wZXJ0eSBlZmZlY3QgdG8gdGhlIGdpdmVuIHRlbXBsYXRlIG1ldGFkYXRhLCB3aGljaCBpcyBydW4KICAgICAgICogYXQgdGhlICJwcm9wYWdhdGUiIHN0YWdlIG9mIGBfcHJvcGVydGllc0NoYW5nZWRgIHdoZW4gdGhlIHRlbXBsYXRlCiAgICAgICAqIGhhcyBiZWVuIGJvdW5kIHRvIHRoZSBlbGVtZW50IHZpYSBgX2JpbmRUZW1wbGF0ZWAuCiAgICAgICAqCiAgICAgICAqIFRoZSBgZWZmZWN0YCBvYmplY3Qgc2hvdWxkIG1hdGNoIHRoZSBmb3JtYXQgaW4gYF9hZGRQcm9wZXJ0eUVmZmVjdGAuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgdG8gYWRkIGVmZmVjdCB0bwogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBlZmZlY3QKICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBlZmZlY3QgRWZmZWN0IG1ldGFkYXRhIG9iamVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgX2FkZFRlbXBsYXRlUHJvcGVydHlFZmZlY3QodGVtcGxhdGVJbmZvLCBwcm9wLCBlZmZlY3QpIHsKICAgICAgICBsZXQgaG9zdFByb3BzID0gdGVtcGxhdGVJbmZvLmhvc3RQcm9wcyA9IHRlbXBsYXRlSW5mby5ob3N0UHJvcHMgfHwge307CiAgICAgICAgaG9zdFByb3BzW3Byb3BdID0gdHJ1ZTsKICAgICAgICBsZXQgZWZmZWN0cyA9IHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMgPSB0ZW1wbGF0ZUluZm8ucHJvcGVydHlFZmZlY3RzIHx8IHt9OwogICAgICAgIGxldCBwcm9wRWZmZWN0cyA9IGVmZmVjdHNbcHJvcF0gPSBlZmZlY3RzW3Byb3BdIHx8IFtdOwogICAgICAgIHByb3BFZmZlY3RzLnB1c2goZWZmZWN0KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFN0YW1wcyB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgYW5kIHBlcmZvcm1zIGluc3RhbmNlLXRpbWUgc2V0dXAgZm9yCiAgICAgICAqIFBvbHltZXIgdGVtcGxhdGUgZmVhdHVyZXMsIGluY2x1ZGluZyBkYXRhIGJpbmRpbmdzLCBkZWNsYXJhdGl2ZSBldmVudAogICAgICAgKiBsaXN0ZW5lcnMsIGFuZCB0aGUgYHRoaXMuJGAgbWFwIG9mIGBpZGAncyB0byBub2Rlcy4gIEEgZG9jdW1lbnQgZnJhZ21lbnQKICAgICAgICogaXMgcmV0dXJuZWQgY29udGFpbmluZyB0aGUgc3RhbXBlZCBET00sIHJlYWR5IGZvciBpbnNlcnRpb24gaW50byB0aGUKICAgICAgICogRE9NLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlOyBob3dldmVyIG5vdGUgdGhhdCBkdWUgdG8KICAgICAgICogYHNoYWR5Y3NzYCBwb2x5ZmlsbCBsaW1pdGF0aW9ucywgb25seSBzdHlsZXMgZnJvbSB0ZW1wbGF0ZXMgcHJlcGFyZWQKICAgICAgICogdXNpbmcgYFNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZWAgd2lsbCBiZSBjb3JyZWN0bHkgcG9seWZpbGxlZCAoc2NvcGVkCiAgICAgICAqIHRvIHRoZSBzaGFkb3cgcm9vdCBhbmQgc3VwcG9ydCBDU1MgY3VzdG9tIHByb3BlcnRpZXMpLCBhbmQgbm90ZSB0aGF0CiAgICAgICAqIGBTaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGVgIG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBlbGVtZW50LiBBcyBzdWNoLAogICAgICAgKiBhbnkgc3R5bGVzIHJlcXVpcmVkIGJ5IGluIHJ1bnRpbWUtc3RhbXBlZCB0ZW1wbGF0ZXMgbXVzdCBiZSBpbmNsdWRlZAogICAgICAgKiBpbiB0aGUgbWFpbiBlbGVtZW50IHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBzdGFtcAogICAgICAgKiBAcmV0dXJuIHshU3RhbXBlZFRlbXBsYXRlfSBDbG9uZWQgdGVtcGxhdGUgY29udGVudAogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3N0YW1wVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICAvLyBFbnN1cmVzIHRoYXQgY3JlYXRlZCBkb20gaXMgYF9lbnF1ZXVlQ2xpZW50YCdkIHRvIHRoaXMgZWxlbWVudCBzbwogICAgICAgIC8vIHRoYXQgaXQgY2FuIGJlIGZsdXNoZWQgb24gbmV4dCBjYWxsIHRvIGBfZmx1c2hQcm9wZXJ0aWVzYAogICAgICAgIGhvc3RTdGFjay5iZWdpbkhvc3RpbmcodGhpcyk7CiAgICAgICAgbGV0IGRvbSA9IHN1cGVyLl9zdGFtcFRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICBob3N0U3RhY2suZW5kSG9zdGluZyh0aGlzKTsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gLyoqIEB0eXBlIHshVGVtcGxhdGVJbmZvfSAqLyh0aGlzLl9iaW5kVGVtcGxhdGUodGVtcGxhdGUsIHRydWUpKTsKICAgICAgICAvLyBBZGQgdGVtcGxhdGUtaW5zdGFuY2Utc3BlY2lmaWMgZGF0YSB0byBpbnN0YW5jZWQgdGVtcGxhdGVJbmZvCiAgICAgICAgdGVtcGxhdGVJbmZvLm5vZGVMaXN0ID0gZG9tLm5vZGVMaXN0OwogICAgICAgIC8vIENhcHR1cmUgY2hpbGQgbm9kZXMgdG8gYWxsb3cgdW5zdGFtcGluZyBvZiBub24tcHJvdG90eXBpY2FsIHRlbXBsYXRlcwogICAgICAgIGlmICghdGVtcGxhdGVJbmZvLndhc1ByZUJvdW5kKSB7CiAgICAgICAgICBsZXQgbm9kZXMgPSB0ZW1wbGF0ZUluZm8uY2hpbGROb2RlcyA9IFtdOwogICAgICAgICAgZm9yIChsZXQgbj1kb20uZmlyc3RDaGlsZDsgbjsgbj1uLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgIG5vZGVzLnB1c2gobik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRvbS50ZW1wbGF0ZUluZm8gPSB0ZW1wbGF0ZUluZm87CiAgICAgICAgLy8gU2V0dXAgY29tcG91bmQgc3RvcmFnZSwgMi13YXkgbGlzdGVuZXJzLCBhbmQgZGF0YUhvc3QgZm9yIGJpbmRpbmdzCiAgICAgICAgc2V0dXBCaW5kaW5ncyh0aGlzLCB0ZW1wbGF0ZUluZm8pOwogICAgICAgIC8vIEZsdXNoIHByb3BlcnRpZXMgaW50byB0ZW1wbGF0ZSBub2RlcyBpZiBhbHJlYWR5IGJvb3RlZAogICAgICAgIGlmICh0aGlzLl9fZGF0YVJlYWR5KSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMsIHRoaXMuX19kYXRhLCBudWxsLAogICAgICAgICAgICBmYWxzZSwgdGVtcGxhdGVJbmZvLm5vZGVMaXN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRvbTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYW5kIHVuYmluZHMgdGhlIG5vZGVzIHByZXZpb3VzbHkgY29udGFpbmVkIGluIHRoZSBwcm92aWRlZAogICAgICAgKiBEb2N1bWVudEZyYWdtZW50IHJldHVybmVkIGZyb20gYF9zdGFtcFRlbXBsYXRlYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshU3RhbXBlZFRlbXBsYXRlfSBkb20gRG9jdW1lbnRGcmFnbWVudCBwcmV2aW91c2x5IHJldHVybmVkCiAgICAgICAqICAgZnJvbSBgX3N0YW1wVGVtcGxhdGVgIGFzc29jaWF0ZWQgd2l0aCB0aGUgbm9kZXMgdG8gYmUgcmVtb3ZlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfcmVtb3ZlQm91bmREb20oZG9tKSB7CiAgICAgICAgLy8gVW5saW5rIHRlbXBsYXRlIGluZm8KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gZG9tLnRlbXBsYXRlSW5mbzsKICAgICAgICBpZiAodGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICB0ZW1wbGF0ZUluZm8ucHJldmlvdXNUZW1wbGF0ZUluZm8ubmV4dFRlbXBsYXRlSW5mbyA9CiAgICAgICAgICAgIHRlbXBsYXRlSW5mby5uZXh0VGVtcGxhdGVJbmZvOwogICAgICAgIH0KICAgICAgICBpZiAodGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm8pIHsKICAgICAgICAgIHRlbXBsYXRlSW5mby5uZXh0VGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvID0KICAgICAgICAgICAgdGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fX3RlbXBsYXRlSW5mb0xhc3QgPT0gdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICB0aGlzLl9fdGVtcGxhdGVJbmZvTGFzdCA9IHRlbXBsYXRlSW5mby5wcmV2aW91c1RlbXBsYXRlSW5mbzsKICAgICAgICB9CiAgICAgICAgdGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm8gPSBudWxsOwogICAgICAgIC8vIFJlbW92ZSBzdGFtcGVkIG5vZGVzCiAgICAgICAgbGV0IG5vZGVzID0gdGVtcGxhdGVJbmZvLmNoaWxkTm9kZXM7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgbm9kZSA9IG5vZGVzW2ldOwogICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBkZWZhdWx0IGBUZW1wbGF0ZVN0YW1wYCBpbXBsZW1lbnRhdGlvbiB0byBhZGQgc3VwcG9ydCBmb3IKICAgICAgICogcGFyc2luZyBiaW5kaW5ncyBmcm9tIGBUZXh0Tm9kZWAncycgYHRleHRDb250ZW50YC4gIEEgYGJpbmRpbmdzYAogICAgICAgKiBhcnJheSBpcyBhZGRlZCB0byBgbm9kZUluZm9gIGFuZCBwb3B1bGF0ZWQgd2l0aCBiaW5kaW5nIG1ldGFkYXRhCiAgICAgICAqIHdpdGggaW5mb3JtYXRpb24gY2FwdHVyaW5nIHRoZSBiaW5kaW5nIHRhcmdldCwgYW5kIGEgYHBhcnRzYCBhcnJheQogICAgICAgKiB3aXRoIG9uZSBvciBtb3JlIG1ldGFkYXRhIG9iamVjdHMgY2FwdHVyaW5nIHRoZSBzb3VyY2Uocykgb2YgdGhlCiAgICAgICAqIGJpbmRpbmcuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUgbm9kZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IEludGVyZmFjZXMgaW4gY2xvc3VyZSBkbyBub3QgaW5oZXJpdCBzdGF0aWNzLCBidXQgY2xhc3NlcyBkbwogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgbGV0IG5vdGVkID0gc3VwZXIuX3BhcnNlVGVtcGxhdGVOb2RlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pOwogICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgbGV0IHBhcnRzID0gdGhpcy5fcGFyc2VCaW5kaW5ncyhub2RlLnRleHRDb250ZW50LCB0ZW1wbGF0ZUluZm8pOwogICAgICAgICAgaWYgKHBhcnRzKSB7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHRleHRDb250ZW50IHdpdGggYW55IGxpdGVyYWwgcGFydHMKICAgICAgICAgICAgLy8gTk9URTogZGVmYXVsdCB0byBhIHNwYWNlIGhlcmUgc28gdGhlIHRleHROb2RlIHJlbWFpbnM7IHNvbWUgYnJvd3NlcnMKICAgICAgICAgICAgLy8gKElFKSBvbWl0IGFuIGVtcHR5IHRleHROb2RlIGZvbGxvd2luZyBjbG9uZU5vZGUvaW1wb3J0Tm9kZS4KICAgICAgICAgICAgbm9kZS50ZXh0Q29udGVudCA9IGxpdGVyYWxGcm9tUGFydHMocGFydHMpIHx8ICcgJzsKICAgICAgICAgICAgYWRkQmluZGluZyh0aGlzLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCAndGV4dCcsICd0ZXh0Q29udGVudCcsIHBhcnRzKTsKICAgICAgICAgICAgbm90ZWQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbm90ZWQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgZGVmYXVsdCBgVGVtcGxhdGVTdGFtcGAgaW1wbGVtZW50YXRpb24gdG8gYWRkIHN1cHBvcnQgZm9yCiAgICAgICAqIHBhcnNpbmcgYmluZGluZ3MgZnJvbSBhdHRyaWJ1dGVzLiAgQSBgYmluZGluZ3NgCiAgICAgICAqIGFycmF5IGlzIGFkZGVkIHRvIGBub2RlSW5mb2AgYW5kIHBvcHVsYXRlZCB3aXRoIGJpbmRpbmcgbWV0YWRhdGEKICAgICAgICogd2l0aCBpbmZvcm1hdGlvbiBjYXB0dXJpbmcgdGhlIGJpbmRpbmcgdGFyZ2V0LCBhbmQgYSBgcGFydHNgIGFycmF5CiAgICAgICAqIHdpdGggb25lIG9yIG1vcmUgbWV0YWRhdGEgb2JqZWN0cyBjYXB0dXJpbmcgdGhlIHNvdXJjZShzKSBvZiB0aGUKICAgICAgICogYmluZGluZy4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBOb2RlIHRvIHBhcnNlCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgICAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEF0dHJpYnV0ZSBuYW1lCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgbmFtZSwgdmFsdWUpIHsKICAgICAgICBsZXQgcGFydHMgPSB0aGlzLl9wYXJzZUJpbmRpbmdzKHZhbHVlLCB0ZW1wbGF0ZUluZm8pOwogICAgICAgIGlmIChwYXJ0cykgewogICAgICAgICAgLy8gQXR0cmlidXRlIG9yIHByb3BlcnR5CiAgICAgICAgICBsZXQgb3JpZ05hbWUgPSBuYW1lOwogICAgICAgICAgbGV0IGtpbmQgPSAncHJvcGVydHknOwogICAgICAgICAgLy8gVGhlIG9ubHkgd2F5IHdlIHNlZSBhIGNhcGl0YWwgbGV0dGVyIGhlcmUgaXMgaWYgdGhlIGF0dHIgaGFzCiAgICAgICAgICAvLyBhIGNhcGl0YWwgbGV0dGVyIGluIGl0IHBlciBzcGVjLiBJbiB0aGlzIGNhc2UsIHRvIG1ha2Ugc3VyZQogICAgICAgICAgLy8gdGhpcyBiaW5kaW5nIHdvcmtzLCB3ZSBnbyBhaGVhZCBhbmQgbWFrZSB0aGUgYmluZGluZyB0byB0aGUgYXR0cmlidXRlLgogICAgICAgICAgaWYgKGNhcGl0YWxBdHRyaWJ1dGVSZWdleC50ZXN0KG5hbWUpKSB7CiAgICAgICAgICAgIGtpbmQgPSAnYXR0cmlidXRlJzsKICAgICAgICAgIH0gZWxzZSBpZiAobmFtZVtuYW1lLmxlbmd0aC0xXSA9PSAnJCcpIHsKICAgICAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgLTEpOwogICAgICAgICAgICBraW5kID0gJ2F0dHJpYnV0ZSc7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBJbml0aWFsaXplIGF0dHJpYnV0ZSBiaW5kaW5ncyB3aXRoIGFueSBsaXRlcmFsIHBhcnRzCiAgICAgICAgICBsZXQgbGl0ZXJhbCA9IGxpdGVyYWxGcm9tUGFydHMocGFydHMpOwogICAgICAgICAgaWYgKGxpdGVyYWwgJiYga2luZCA9PSAnYXR0cmlidXRlJykgewogICAgICAgICAgICAvLyBFbnN1cmUgYSBTaGFkeUNTUyB0ZW1wbGF0ZSBzY29wZWQgc3R5bGUgaXMgbm90IHJlbW92ZWQKICAgICAgICAgICAgLy8gd2hlbiBhIGNsYXNzJCBiaW5kaW5nJ3MgaW5pdGlhbCBsaXRlcmFsIHZhbHVlIGlzIHNldC4KICAgICAgICAgICAgaWYgKG5hbWUgPT0gJ2NsYXNzJyAmJiBub2RlLmhhc0F0dHJpYnV0ZSgnY2xhc3MnKSkgewogICAgICAgICAgICAgIGxpdGVyYWwgKz0gJyAnICsgbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgbGl0ZXJhbCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBDbGVhciBhdHRyaWJ1dGUgYmVmb3JlIHJlbW92aW5nLCBzaW5jZSBJRSB3b24ndCBhbGxvdyByZW1vdmluZwogICAgICAgICAgLy8gYHZhbHVlYCBhdHRyaWJ1dGUgaWYgaXQgcHJldmlvdXNseSBoYWQgYSB2YWx1ZSAoY2FuJ3QKICAgICAgICAgIC8vIHVuY29uZGl0aW9uYWxseSBzZXQgJycgYmVmb3JlIHJlbW92aW5nIHNpbmNlIGF0dHJpYnV0ZXMgd2l0aCBgJGAKICAgICAgICAgIC8vIGNhbid0IGJlIHNldCB1c2luZyBzZXRBdHRyaWJ1dGUpCiAgICAgICAgICBpZiAobm9kZS5sb2NhbE5hbWUgPT09ICdpbnB1dCcgJiYgb3JpZ05hbWUgPT09ICd2YWx1ZScpIHsKICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUob3JpZ05hbWUsICcnKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFJlbW92ZSBhbm5vdGF0aW9uCiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShvcmlnTmFtZSk7CiAgICAgICAgICAvLyBDYXNlIGhhY2tlcnk6IGF0dHJpYnV0ZXMgYXJlIGxvd2VyLWNhc2UsIGJ1dCBiaW5kIHRhcmdldHMKICAgICAgICAgIC8vIChwcm9wZXJ0aWVzKSBhcmUgY2FzZSBzZW5zaXRpdmUuIEdhbWJpdCBpcyB0byBtYXAgZGFzaC1jYXNlIHRvCiAgICAgICAgICAvLyBjYW1lbC1jYXNlOiBgZm9vLWJhcmAgYmVjb21lcyBgZm9vQmFyYC4KICAgICAgICAgIC8vIEF0dHJpYnV0ZSBiaW5kaW5ncyBhcmUgZXhjZXB0ZWQuCiAgICAgICAgICBpZiAoa2luZCA9PT0gJ3Byb3BlcnR5JykgewogICAgICAgICAgICBuYW1lID0gUG9seW1lci5DYXNlTWFwLmRhc2hUb0NhbWVsQ2FzZShuYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIGFkZEJpbmRpbmcodGhpcywgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywga2luZCwgbmFtZSwgcGFydHMsIGxpdGVyYWwpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBzdXBlci5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgbmFtZSwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBkZWZhdWx0IGBUZW1wbGF0ZVN0YW1wYCBpbXBsZW1lbnRhdGlvbiB0byBhZGQgc3VwcG9ydCBmb3IKICAgICAgICogYmluZGluZyB0aGUgcHJvcGVydGllcyB0aGF0IGEgbmVzdGVkIHRlbXBsYXRlIGRlcGVuZHMgb24gdG8gdGhlIHRlbXBsYXRlCiAgICAgICAqIGFzIGBfaG9zdF88cHJvcGVydHk+YC4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIHBhcnNlCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgICAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmlzaXRlZCBub2RlIGFkZGVkIG5vZGUtc3BlY2lmaWMKICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gSW50ZXJmYWNlcyBpbiBjbG9zdXJlIGRvIG5vdCBpbmhlcml0IHN0YXRpY3MsIGJ1dCBjbGFzc2VzIGRvCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgbGV0IG5vdGVkID0gc3VwZXIuX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKTsKICAgICAgICAvLyBNZXJnZSBob3N0IHByb3BzIGludG8gb3V0ZXIgdGVtcGxhdGUgYW5kIGFkZCBiaW5kaW5ncwogICAgICAgIGxldCBob3N0UHJvcHMgPSBub2RlSW5mby50ZW1wbGF0ZUluZm8uaG9zdFByb3BzOwogICAgICAgIGxldCBtb2RlID0gJ3snOwogICAgICAgIGZvciAobGV0IHNvdXJjZSBpbiBob3N0UHJvcHMpIHsKICAgICAgICAgIGxldCBwYXJ0cyA9IFt7IG1vZGUsIHNvdXJjZSwgZGVwZW5kZW5jaWVzOiBbc291cmNlXSB9XTsKICAgICAgICAgIGFkZEJpbmRpbmcodGhpcywgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgJ3Byb3BlcnR5JywgJ19ob3N0XycgKyBzb3VyY2UsIHBhcnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vdGVkOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIHRvIHBhcnNlIHRleHQgaW4gYSB0ZW1wbGF0ZSAoZWl0aGVyIGF0dHJpYnV0ZSB2YWx1ZXMgb3IKICAgICAgICogdGV4dENvbnRlbnQpIGludG8gYmluZGluZyBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQW55IG92ZXJyaWRlcyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIGFycmF5IG9mIGJpbmRpbmcgcGFydAogICAgICAgKiBtZXRhZGF0YSAgcmVwcmVzZW50aW5nIG9uZSBvciBtb3JlIGJpbmRpbmdzIGZvdW5kIGluIHRoZSBwcm92aWRlZCB0ZXh0CiAgICAgICAqIGFuZCBhbnkgImxpdGVyYWwiIHRleHQgaW4gYmV0d2Vlbi4gIEFueSBub24tbGl0ZXJhbCBwYXJ0cyB3aWxsIGJlIHBhc3NlZAogICAgICAgKiB0byBgX2V2YWx1YXRlQmluZGluZ2Agd2hlbiBhbnkgZGVwZW5kZW5jaWVzIGNoYW5nZS4gIFRoZSBvbmx5IHJlcXVpcmVkCiAgICAgICAqIGZpZWxkcyBvZiBlYWNoICJwYXJ0IiBpbiB0aGUgcmV0dXJuZWQgYXJyYXkgYXJlIGFzIGZvbGxvd3M6CiAgICAgICAqCiAgICAgICAqIC0gYGRlcGVuZGVuY2llc2AgLSBBcnJheSBjb250YWluaW5nIHRyaWdnZXIgbWV0YWRhdGEgZm9yIGVhY2ggcHJvcGVydHkKICAgICAgICogICB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBiaW5kaW5nIHRvIHVwZGF0ZQogICAgICAgKiAtIGBsaXRlcmFsYCAtIFN0cmluZyBjb250YWluaW5nIHRleHQgaWYgdGhlIHBhcnQgcmVwcmVzZW50cyBhIGxpdGVyYWw7CiAgICAgICAqICAgaW4gdGhpcyBjYXNlIG5vIGBkZXBlbmRlbmNpZXNgIGFyZSBuZWVkZWQKICAgICAgICoKICAgICAgICogQWRkaXRpb25hbCBtZXRhZGF0YSBmb3IgdXNlIGJ5IGBfZXZhbHVhdGVCaW5kaW5nYCBtYXkgYmUgcHJvdmlkZWQgaW4KICAgICAgICogZWFjaCBwYXJ0IG9iamVjdCBhcyBuZWVkZWQuCiAgICAgICAqCiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGhhbmRsZXMgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBiaW5kaW5ncwogICAgICAgKiAob25lIG9yIG1vcmUgbWF5IGJlIGludGVybWl4ZWQgd2l0aCBsaXRlcmFsIHN0cmluZ3MpOgogICAgICAgKiAtIFByb3BlcnR5IGJpbmRpbmc6IGBbW3Byb3BdXWAKICAgICAgICogLSBQYXRoIGJpbmRpbmc6IGBbW29iamVjdC5wcm9wXV1gCiAgICAgICAqIC0gTmVnYXRlZCBwcm9wZXJ0eSBvciBwYXRoIGJpbmRpbmdzOiBgW1shcHJvcF1dYCBvciBgW1shb2JqZWN0LnByb3BdXWAKICAgICAgICogLSBUd28td2F5IHByb3BlcnR5IG9yIHBhdGggYmluZGluZ3MgKHN1cHBvcnRzIG5lZ2F0aW9uKToKICAgICAgICogICBge3twcm9wfX1gLCBge3tvYmplY3QucHJvcH19YCwgYHt7IXByb3B9fWAgb3IgYHt7IW9iamVjdC5wcm9wfX1gCiAgICAgICAqIC0gSW5saW5lIGNvbXB1dGVkIG1ldGhvZCAoc3VwcG9ydHMgbmVnYXRpb24pOgogICAgICAgKiAgIGBbW2NvbXB1dGUoYSwgJ2xpdGVyYWwnLCBiKV1dYCwgYFtbIWNvbXB1dGUoYSwgJ2xpdGVyYWwnLCBiKV1dYAogICAgICAgKgogICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgcmVndWxhciBleHByZXNzaW9uIGZvciBiZXN0CiAgICAgICAqIHBlcmZvcm1hbmNlLiBIb3dldmVyLCB0aGUgcmVndWxhciBleHByZXNzaW9uIHVzZXMgYSB3aGl0ZS1saXN0IG9mCiAgICAgICAqIGFsbG93ZWQgY2hhcmFjdGVycyBpbiBhIGRhdGEtYmluZGluZywgd2hpY2ggY2F1c2VzIHByb2JsZW1zIGZvcgogICAgICAgKiBkYXRhLWJpbmRpbmdzIHRoYXQgZG8gdXNlIGNoYXJhY3RlcnMgbm90IGluIHRoaXMgd2hpdGUtbGlzdC4KICAgICAgICoKICAgICAgICogSW5zdGVhZCBvZiB1cGRhdGluZyB0aGUgd2hpdGUtbGlzdCB3aXRoIGFsbCBhbGxvd2VkIGNoYXJhY3RlcnMsCiAgICAgICAqIHRoZXJlIGlzIGEgU3RyaWN0QmluZGluZ1BhcnNlciAoc2VlIGxpYi9taXhpbnMvc3RyaWN0LWJpbmRpbmctcGFyc2VyKQogICAgICAgKiB0aGF0IHVzZXMgYSBzdGF0ZSBtYWNoaW5lIGluc3RlYWQuIFRoaXMgc3RhdGUgbWFjaGluZSBpcyBhYmxlIHRvIGhhbmRsZQogICAgICAgKiBhbGwgY2hhcmFjdGVycy4gSG93ZXZlciwgaXQgaXMgc2xpZ2h0bHkgbGVzcyBwZXJmb3JtYW50LCB0aGVyZWZvcmUgd2UKICAgICAgICogZXh0cmFjdGVkIGl0IGludG8gYSBzZXBhcmF0ZSBvcHRpb25hbCBtaXhpbi4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGV4dCB0byBwYXJzZSBmcm9tIGF0dHJpYnV0ZSBvciB0ZXh0Q29udGVudAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gdGVtcGxhdGVJbmZvIEN1cnJlbnQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogQHJldHVybiB7QXJyYXk8IUJpbmRpbmdQYXJ0Pn0gQXJyYXkgb2YgYmluZGluZyBwYXJ0IG1ldGFkYXRhCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VCaW5kaW5ncyh0ZXh0LCB0ZW1wbGF0ZUluZm8pIHsKICAgICAgICBsZXQgcGFydHMgPSBbXTsKICAgICAgICBsZXQgbGFzdEluZGV4ID0gMDsKICAgICAgICBsZXQgbTsKICAgICAgICAvLyBFeGFtcGxlOiAibGl0ZXJhbDF7e3Byb3B9fWxpdGVyYWwyW1shY29tcHV0ZShmb28sYmFyKV1dZmluYWwiCiAgICAgICAgLy8gUmVnZXggbWF0Y2hlczoKICAgICAgICAvLyAgICAgICAgSXRlcmF0aW9uIDE6ICBJdGVyYXRpb24gMjoKICAgICAgICAvLyBtWzFdOiAne3snICAgICAgICAgICdbWycKICAgICAgICAvLyBtWzJdOiAnJyAgICAgICAgICAgICchJwogICAgICAgIC8vIG1bM106ICdwcm9wJyAgICAgICAgJ2NvbXB1dGUoZm9vLGJhciknCiAgICAgICAgd2hpbGUgKChtID0gYmluZGluZ1JlZ2V4LmV4ZWModGV4dCkpICE9PSBudWxsKSB7CiAgICAgICAgICAvLyBBZGQgbGl0ZXJhbCBwYXJ0CiAgICAgICAgICBpZiAobS5pbmRleCA+IGxhc3RJbmRleCkgewogICAgICAgICAgICBwYXJ0cy5wdXNoKHtsaXRlcmFsOiB0ZXh0LnNsaWNlKGxhc3RJbmRleCwgbS5pbmRleCl9KTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEFkZCBiaW5kaW5nIHBhcnQKICAgICAgICAgIGxldCBtb2RlID0gbVsxXVswXTsKICAgICAgICAgIGxldCBuZWdhdGUgPSBCb29sZWFuKG1bMl0pOwogICAgICAgICAgbGV0IHNvdXJjZSA9IG1bM10udHJpbSgpOwogICAgICAgICAgbGV0IGN1c3RvbUV2ZW50ID0gZmFsc2UsIG5vdGlmeUV2ZW50ID0gJycsIGNvbG9uID0gLTE7CiAgICAgICAgICBpZiAobW9kZSA9PSAneycgJiYgKGNvbG9uID0gc291cmNlLmluZGV4T2YoJzo6JykpID4gMCkgewogICAgICAgICAgICBub3RpZnlFdmVudCA9IHNvdXJjZS5zdWJzdHJpbmcoY29sb24gKyAyKTsKICAgICAgICAgICAgc291cmNlID0gc291cmNlLnN1YnN0cmluZygwLCBjb2xvbik7CiAgICAgICAgICAgIGN1c3RvbUV2ZW50ID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGxldCBzaWduYXR1cmUgPSBwYXJzZU1ldGhvZChzb3VyY2UpOwogICAgICAgICAgbGV0IGRlcGVuZGVuY2llcyA9IFtdOwogICAgICAgICAgaWYgKHNpZ25hdHVyZSkgewogICAgICAgICAgICAvLyBJbmxpbmUgY29tcHV0ZWQgZnVuY3Rpb24KICAgICAgICAgICAgbGV0IHthcmdzLCBtZXRob2ROYW1lfSA9IHNpZ25hdHVyZTsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpPGFyZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsZXQgYXJnID0gYXJnc1tpXTsKICAgICAgICAgICAgICBpZiAoIWFyZy5saXRlcmFsKSB7CiAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChhcmcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgZHluYW1pY0ZucyA9IHRlbXBsYXRlSW5mby5keW5hbWljRm5zOwogICAgICAgICAgICBpZiAoZHluYW1pY0ZucyAmJiBkeW5hbWljRm5zW21ldGhvZE5hbWVdIHx8IHNpZ25hdHVyZS5zdGF0aWMpIHsKICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChtZXRob2ROYW1lKTsKICAgICAgICAgICAgICBzaWduYXR1cmUuZHluYW1pY0ZuID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gUHJvcGVydHkgb3IgcGF0aAogICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChzb3VyY2UpOwogICAgICAgICAgfQogICAgICAgICAgcGFydHMucHVzaCh7CiAgICAgICAgICAgIHNvdXJjZSwgbW9kZSwgbmVnYXRlLCBjdXN0b21FdmVudCwgc2lnbmF0dXJlLCBkZXBlbmRlbmNpZXMsCiAgICAgICAgICAgIGV2ZW50OiBub3RpZnlFdmVudAogICAgICAgICAgfSk7CiAgICAgICAgICBsYXN0SW5kZXggPSBiaW5kaW5nUmVnZXgubGFzdEluZGV4OwogICAgICAgIH0KICAgICAgICAvLyBBZGQgYSBmaW5hbCBsaXRlcmFsIHBhcnQKICAgICAgICBpZiAobGFzdEluZGV4ICYmIGxhc3RJbmRleCA8IHRleHQubGVuZ3RoKSB7CiAgICAgICAgICBsZXQgbGl0ZXJhbCA9IHRleHQuc3Vic3RyaW5nKGxhc3RJbmRleCk7CiAgICAgICAgICBpZiAobGl0ZXJhbCkgewogICAgICAgICAgICBwYXJ0cy5wdXNoKHsKICAgICAgICAgICAgICBsaXRlcmFsOiBsaXRlcmFsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocGFydHMubGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gcGFydHM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCB0byBldmFsdWF0ZSBhIHByZXZpb3VzbHkgcGFyc2VkIGJpbmRpbmcgcGFydCBiYXNlZCBvbiBhIHNldCBvZgogICAgICAgKiBvbmUgb3IgbW9yZSBjaGFuZ2VkIGRlcGVuZGVuY2llcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHt0aGlzfSBpbnN0IEVsZW1lbnQgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBzY29wZSBmb3IKICAgICAgICogICBiaW5kaW5nIGRlcGVuZGVuY2llcwogICAgICAgKiBAcGFyYW0ge0JpbmRpbmdQYXJ0fSBwYXJ0IEJpbmRpbmcgcGFydCBtZXRhZGF0YQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQcm9wZXJ0eS9wYXRoIHRoYXQgdHJpZ2dlcmVkIHRoaXMgZWZmZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgICAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAgICAgKiBAcmV0dXJuIHsqfSBWYWx1ZSB0aGUgYmluZGluZyBwYXJ0IGV2YWx1YXRlZCB0bwogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgX2V2YWx1YXRlQmluZGluZyhpbnN0LCBwYXJ0LCBwYXRoLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKSB7CiAgICAgICAgbGV0IHZhbHVlOwogICAgICAgIGlmIChwYXJ0LnNpZ25hdHVyZSkgewogICAgICAgICAgdmFsdWUgPSBydW5NZXRob2RFZmZlY3QoaW5zdCwgcGF0aCwgcHJvcHMsIG9sZFByb3BzLCBwYXJ0LnNpZ25hdHVyZSk7CiAgICAgICAgfSBlbHNlIGlmIChwYXRoICE9IHBhcnQuc291cmNlKSB7CiAgICAgICAgICB2YWx1ZSA9IFBvbHltZXIuUGF0aC5nZXQoaW5zdCwgcGFydC5zb3VyY2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaGFzUGF0aHMgJiYgUG9seW1lci5QYXRoLmlzUGF0aChwYXRoKSkgewogICAgICAgICAgICB2YWx1ZSA9IFBvbHltZXIuUGF0aC5nZXQoaW5zdCwgcGF0aCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YWx1ZSA9IGluc3QuX19kYXRhW3BhdGhdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocGFydC5uZWdhdGUpIHsKICAgICAgICAgIHZhbHVlID0gIXZhbHVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0KCiAgICB9CgogICAgLy8gbWFrZSBhIHR5cGluZyBmb3IgY2xvc3VyZSA6UAogICAgUHJvcGVydHlFZmZlY3RzVHlwZSA9IFByb3BlcnR5RWZmZWN0czsKCiAgICByZXR1cm4gUHJvcGVydHlFZmZlY3RzOwogIH0pOwoKICAvKioKICAgKiBIZWxwZXIgYXBpIGZvciBlbnF1ZXVpbmcgY2xpZW50IGRvbSBjcmVhdGVkIGJ5IGEgaG9zdCBlbGVtZW50LgogICAqCiAgICogQnkgZGVmYXVsdCBlbGVtZW50cyBhcmUgZmx1c2hlZCB2aWEgYF9mbHVzaFByb3BlcnRpZXNgIHdoZW4KICAgKiBgY29ubmVjdGVkQ2FsbGJhY2tgIGlzIGNhbGxlZC4gRWxlbWVudHMgYXR0YWNoIHRoZWlyIGNsaWVudCBkb20gdG8KICAgKiB0aGVtc2VsdmVzIGF0IGByZWFkeWAgdGltZSB3aGljaCByZXN1bHRzIGZyb20gdGhpcyBmaXJzdCBmbHVzaC4KICAgKiBUaGlzIHByb3ZpZGVzIGFuIG9yZGVyaW5nIGd1YXJhbnRlZSB0aGF0IHRoZSBjbGllbnQgZG9tIGFuIGVsZW1lbnQKICAgKiBjcmVhdGVzIGlzIGZsdXNoZWQgYmVmb3JlIHRoZSBlbGVtZW50IGl0c2VsZiAoaS5lLiBjbGllbnQgYHJlYWR5YAogICAqIGZpcmVzIGJlZm9yZSBob3N0IGByZWFkeWApLgogICAqCiAgICogSG93ZXZlciwgaWYgYF9mbHVzaFByb3BlcnRpZXNgIGlzIGNhbGxlZCAqYmVmb3JlKiBhbiBlbGVtZW50IGlzIGNvbm5lY3RlZCwKICAgKiBhcyBmb3IgZXhhbXBsZSBgVGVtcGxhdGl6ZWAgZG9lcywgdGhpcyBvcmRlcmluZyBndWFyYW50ZWUgY2Fubm90IGJlCiAgICogc2F0aXNmaWVkIGJlY2F1c2Ugbm8gZWxlbWVudHMgYXJlIGNvbm5lY3RlZC4gKE5vdGU6IEJvdW5kIGVsZW1lbnRzIHRoYXQKICAgKiByZWNlaXZlIGRhdGEgZG8gYmVjb21lIGVucXVldWVkIGNsaWVudHMgYW5kIGFyZSBwcm9wZXJseSBvcmRlcmVkIGJ1dAogICAqIHVuYm91bmQgZWxlbWVudHMgYXJlIG5vdC4pCiAgICoKICAgKiBUbyBtYWludGFpbiB0aGUgZGVzaXJlZCAiY2xpZW50IGJlZm9yZSBob3N0IiBvcmRlcmluZyBndWFyYW50ZWUgZm9yIHRoaXMKICAgKiBjYXNlIHdlIHJlbHkgb24gdGhlICJob3N0IHN0YWNrLiBDbGllbnQgbm9kZXMgcmVnaXN0ZXJzIHRoZW1zZWx2ZXMgd2l0aAogICAqIHRoZSBjcmVhdGluZyBob3N0IGVsZW1lbnQgd2hlbiBjcmVhdGVkLiBUaGlzIGVuc3VyZXMgdGhhdCBhbGwgY2xpZW50IGRvbQogICAqIGlzIHJlYWRpZWQgaW4gdGhlIHByb3BlciBvcmRlciwgbWFpbnRhaW5pbmcgdGhlIGRlc2lyZWQgZ3VhcmFudGVlLgogICAqCiAgICogQHByaXZhdGUKICAgKi8KICBsZXQgaG9zdFN0YWNrID0gewoKICAgIHN0YWNrOiBbXSwKCiAgICAvKioKICAgICAqIEBwYXJhbSB7Kn0gaW5zdCBJbnN0YW5jZSB0byBhZGQgdG8gaG9zdFN0YWNrCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHRoaXMge2hvc3RTdGFja30KICAgICAqLwogICAgcmVnaXN0ZXJIb3N0KGluc3QpIHsKICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoKSB7CiAgICAgICAgbGV0IGhvc3QgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdOwogICAgICAgIGhvc3QuX2VucXVldWVDbGllbnQoaW5zdCk7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IGluc3QgSW5zdGFuY2UgdG8gYmVnaW4gaG9zdGluZwogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEB0aGlzIHtob3N0U3RhY2t9CiAgICAgKi8KICAgIGJlZ2luSG9zdGluZyhpbnN0KSB7CiAgICAgIHRoaXMuc3RhY2sucHVzaChpbnN0KTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IGluc3QgSW5zdGFuY2UgdG8gZW5kIGhvc3RpbmcKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7aG9zdFN0YWNrfQogICAgICovCiAgICBlbmRIb3N0aW5nKGluc3QpIHsKICAgICAgbGV0IHN0YWNrTGVuID0gdGhpcy5zdGFjay5sZW5ndGg7CiAgICAgIGlmIChzdGFja0xlbiAmJiB0aGlzLnN0YWNrW3N0YWNrTGVuLTFdID09IGluc3QpIHsKICAgICAgICB0aGlzLnN0YWNrLnBvcCgpOwogICAgICB9CiAgICB9CgogIH07Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIFByb3ZpZGVzIGJhc2ljIHRyYWNraW5nIG9mIGVsZW1lbnQgZGVmaW5pdGlvbnMgKHJlZ2lzdHJhdGlvbnMpIGFuZAogICAqIGluc3RhbmNlIGNvdW50cy4KICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAc3VtbWFyeSBQcm92aWRlcyBiYXNpYyB0cmFja2luZyBvZiBlbGVtZW50IGRlZmluaXRpb25zIChyZWdpc3RyYXRpb25zKSBhbmQKICAgKiBpbnN0YW5jZSBjb3VudHMuCiAgICovCiAgUG9seW1lci50ZWxlbWV0cnkgPSB7CiAgICAvKioKICAgICAqIFRvdGFsIG51bWJlciBvZiBQb2x5bWVyIGVsZW1lbnQgaW5zdGFuY2VzIGNyZWF0ZWQuCiAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICovCiAgICBpbnN0YW5jZUNvdW50OiAwLAogICAgLyoqCiAgICAgKiBBcnJheSBvZiBQb2x5bWVyIGVsZW1lbnQgY2xhc3NlcyB0aGF0IGhhdmUgYmVlbiBmaW5hbGl6ZWQuCiAgICAgKiBAdHlwZSB7QXJyYXk8UG9seW1lci5FbGVtZW50Pn0KICAgICAqLwogICAgcmVnaXN0cmF0aW9uczogW10sCiAgICAvKioKICAgICAqIEBwYXJhbSB7IVBvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9IHByb3RvdHlwZSBFbGVtZW50IHByb3RvdHlwZSB0byBsb2cKICAgICAqIEB0aGlzIHt0aGlzfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3JlZ0xvZzogZnVuY3Rpb24ocHJvdG90eXBlKSB7CiAgICAgIGNvbnNvbGUubG9nKCdbJyArIHByb3RvdHlwZS5pcyArICddOiByZWdpc3RlcmVkJyk7CiAgICB9LAogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgYSBjbGFzcyBwcm90b3R5cGUgZm9yIHRlbGVtZXRyeSBwdXJwb3Nlcy4KICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHByb3RvdHlwZSBFbGVtZW50IHByb3RvdHlwZSB0byByZWdpc3RlcgogICAgICogQHRoaXMge3RoaXN9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihwcm90b3R5cGUpIHsKICAgICAgdGhpcy5yZWdpc3RyYXRpb25zLnB1c2gocHJvdG90eXBlKTsKICAgICAgUG9seW1lci5sb2cgJiYgdGhpcy5fcmVnTG9nKHByb3RvdHlwZSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBMb2dzIGFsbCBlbGVtZW50cyByZWdpc3RlcmVkIHdpdGggYW4gYGlzYCB0byB0aGUgY29uc29sZS4KICAgICAqIEBwdWJsaWMKICAgICAqIEB0aGlzIHt0aGlzfQogICAgICovCiAgICBkdW1wUmVnaXN0cmF0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMucmVnaXN0cmF0aW9ucy5mb3JFYWNoKHRoaXMuX3JlZ0xvZyk7CiAgICB9CiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGNvcHkgb2YgYHByb3BzYCB3aXRoIGVhY2ggcHJvcGVydHkgbm9ybWFsaXplZCBzdWNoIHRoYXQKICAgKiB1cGdyYWRlZCBpdCBpcyBhbiBvYmplY3Qgd2l0aCBhdCBsZWFzdCBhIHR5cGUgcHJvcGVydHkgeyB0eXBlOiBUeXBlfS4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBQcm9wZXJ0aWVzIHRvIG5vcm1hbGl6ZQogICAqIEByZXR1cm4ge09iamVjdH0gQ29weSBvZiBpbnB1dCBgcHJvcHNgIHdpdGggbm9ybWFsaXplZCBwcm9wZXJ0aWVzIHRoYXQKICAgKiBhcmUgaW4gdGhlIGZvcm0ge3R5cGU6IFR5cGV9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBub3JtYWxpemVQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICBjb25zdCBvdXRwdXQgPSB7fTsKICAgIGZvciAobGV0IHAgaW4gcHJvcHMpIHsKICAgICAgY29uc3QgbyA9IHByb3BzW3BdOwogICAgICBvdXRwdXRbcF0gPSAodHlwZW9mIG8gPT09ICdmdW5jdGlvbicpID8ge3R5cGU6IG99IDogbzsKICAgIH0KICAgIHJldHVybiBvdXRwdXQ7CiAgfQoKICAvKioKICAgKiBNaXhpbiB0aGF0IHByb3ZpZGVzIGEgbWluaW1hbCBzdGFydGluZyBwb2ludCB0byB1c2luZyB0aGUgUHJvcGVydGllc0NoYW5nZWQKICAgKiBtaXhpbiBieSBwcm92aWRpbmcgYSBtZWNoYW5pc20gdG8gZGVjbGFyZSBwcm9wZXJ0aWVzIGluIGEgc3RhdGljCiAgICogZ2V0dGVyIChlLmcuIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsgcmV0dXJuIHsgZm9vOiBTdHJpbmcgfSB9KS4gQ2hhbmdlcwogICAqIGFyZSByZXBvcnRlZCB2aWEgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIG1ldGhvZC4KICAgKgogICAqIFRoaXMgbWl4aW4gcHJvdmlkZXMgbm8gc3BlY2lmaWMgc3VwcG9ydCBmb3IgcmVuZGVyaW5nLiBVc2VycyBhcmUgZXhwZWN0ZWQKICAgKiB0byBjcmVhdGUgYSBTaGFkb3dSb290IGFuZCBwdXQgY29udGVudCBpbnRvIGl0IGFuZCB1cGRhdGUgaXQgaW4gd2hhdGV2ZXIKICAgKiB3YXkgbWFrZXMgc2Vuc2UuIFRoaXMgY2FuIGJlIGRvbmUgaW4gcmVhY3Rpb24gdG8gcHJvcGVydGllcyBjaGFuZ2luZyBieQogICAqIGltcGxlbWVudGluZyBgX3Byb3BlcnRpZXNDaGFuZ2VkYC4KICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydGllc0NoYW5nZWQKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1peGluIHRoYXQgcHJvdmlkZXMgYSBtaW5pbWFsIHN0YXJ0aW5nIHBvaW50IGZvciB1c2luZwogICAqIHRoZSBQcm9wZXJ0aWVzQ2hhbmdlZCBtaXhpbiBieSBwcm92aWRpbmcgYSBkZWNsYXJhdGl2ZSBgcHJvcGVydGllc2Agb2JqZWN0LgogICAqLwogICBQb2x5bWVyLlByb3BlcnRpZXNNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzQ2hhbmdlZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IGJhc2UgPSBQb2x5bWVyLlByb3BlcnRpZXNDaGFuZ2VkKHN1cGVyQ2xhc3MpOwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgc3VwZXIgY2xhc3MgY29uc3RydWN0b3IgZm9yIHRoZSBnaXZlbiBjbGFzcywgaWYgaXQgaXMgYW4KICAgICAqIGluc3RhbmNlIG9mIHRoZSBQcm9wZXJ0aWVzTWl4aW4uCiAgICAgKgogICAgICogQHBhcmFtIHshUHJvcGVydGllc01peGluQ29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIFByb3BlcnRpZXNNaXhpbiBjb25zdHJ1Y3RvcgogICAgICogQHJldHVybiB7UHJvcGVydGllc01peGluQ29uc3RydWN0b3J9IFN1cGVyIGNsYXNzIGNvbnN0cnVjdG9yCiAgICAgKi8KICAgIGZ1bmN0aW9uIHN1cGVyUHJvcGVydGllc0NsYXNzKGNvbnN0cnVjdG9yKSB7CiAgICAgIGNvbnN0IHN1cGVyQ3RvciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjb25zdHJ1Y3Rvcik7CgogICAgICAvLyBOb3RlLCB0aGUgYFByb3BlcnRpZXNNaXhpbmAgY2xhc3MgYmVsb3cgb25seSByZWZlcnMgdG8gdGhlIGNsYXNzCiAgICAgIC8vIGdlbmVyYXRlZCBieSB0aGlzIGNhbGwgdG8gdGhlIG1peGluOyB0aGUgaW5zdGFuY2VvZiB0ZXN0IG9ubHkgd29ya3MKICAgICAgLy8gYmVjYXVzZSB0aGUgbWl4aW4gaXMgZGVkdXBlZCBhbmQgZ3VhcmFudGVlZCBvbmx5IHRvIGFwcGx5IG9uY2UsIGhlbmNlCiAgICAgIC8vIGFsbCBjb25zdHJ1Y3RvcnMgaW4gYSBwcm90byBjaGFpbiB3aWxsIHNlZSB0aGUgc2FtZSBgUHJvcGVydGllc01peGluYAogICAgICByZXR1cm4gKHN1cGVyQ3Rvci5wcm90b3R5cGUgaW5zdGFuY2VvZiBQcm9wZXJ0aWVzTWl4aW4pID8KICAgICAgICAvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyAoc3VwZXJDdG9yKSA6IG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbWVtb2l6ZWQgdmVyc2lvbiBvZiB0aGUgYHByb3BlcnRpZXNgIG9iamVjdCBmb3IgdGhlCiAgICAgKiBnaXZlbiBjbGFzcy4gUHJvcGVydGllcyBub3QgaW4gb2JqZWN0IGZvcm1hdCBhcmUgY29udmVydGVkIHRvIGF0CiAgICAgKiBsZWFzdCB7dHlwZX0uCiAgICAgKgogICAgICogQHBhcmFtIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gY29uc3RydWN0b3IgUHJvcGVydGllc01peGluIGNvbnN0cnVjdG9yCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IE1lbW9pemVkIHByb3BlcnRpZXMgb2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIG93blByb3BlcnRpZXMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX293blByb3BlcnRpZXMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgbGV0IHByb3BzID0gbnVsbDsKCiAgICAgICAgaWYgKGNvbnN0cnVjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ3Byb3BlcnRpZXMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gY29uc3RydWN0b3IucHJvcGVydGllczsKICAgICAgICAgIAogICAgICAgICAgaWYgKHByb3BlcnRpZXMpIHsKICAgICAgICAgICAgcHJvcHMgPSBub3JtYWxpemVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY29uc3RydWN0b3IuX19vd25Qcm9wZXJ0aWVzID0gcHJvcHM7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLl9fb3duUHJvcGVydGllczsKICAgIH0KCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzTWl4aW59CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIFByb3BlcnRpZXNNaXhpbiBleHRlbmRzIGJhc2UgewoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgc3RhbmRhcmQgY3VzdG9tIGVsZW1lbnRzIGdldHRlciB0byBvYnNlcnZlcyB0aGUgYXR0cmlidXRlcwogICAgICAgKiBsaXN0ZWQgaW4gYHByb3BlcnRpZXNgLgogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgewogICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eSgnX19vYnNlcnZlZEF0dHJpYnV0ZXMnKSkgewogICAgICAgICAgUG9seW1lci50ZWxlbWV0cnkucmVnaXN0ZXIodGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLl9wcm9wZXJ0aWVzOwogICAgICAgICAgdGhpcy5fX29ic2VydmVkQXR0cmlidXRlcyA9IHByb3BzID8gT2JqZWN0LmtleXMocHJvcHMpLm1hcChwID0+IHRoaXMuYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHApKSA6IFtdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fX29ic2VydmVkQXR0cmlidXRlczsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZpbmFsaXplcyBhbiBlbGVtZW50IGRlZmluaXRpb24sIGluY2x1ZGluZyBlbnN1cmluZyBhbnkgc3VwZXIgY2xhc3NlcwogICAgICAgKiBhcmUgYWxzbyBmaW5hbGl6ZWQuIFRoaXMgaW5jbHVkZXMgZW5zdXJpbmcgcHJvcGVydHkKICAgICAgICogYWNjZXNzb3JzIGV4aXN0IG9uIHRoZSBlbGVtZW50IHByb3RvdHlwZS4gVGhpcyBtZXRob2QgY2FsbHMKICAgICAgICogYF9maW5hbGl6ZUNsYXNzYCB0byBmaW5hbGl6ZSBlYWNoIGNvbnN0cnVjdG9yIGluIHRoZSBwcm90b3R5cGUgY2hhaW4uCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzdGF0aWMgZmluYWxpemUoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19fZmluYWxpemVkJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBzdXBlckN0b3IgPSBzdXBlclByb3BlcnRpZXNDbGFzcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgICBpZiAoc3VwZXJDdG9yKSB7CiAgICAgICAgICAgIHN1cGVyQ3Rvci5maW5hbGl6ZSgpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fX2ZpbmFsaXplZCA9IHRydWU7CiAgICAgICAgICB0aGlzLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRmluYWxpemUgYW4gZWxlbWVudCBjbGFzcy4gVGhpcyBpbmNsdWRlcyBlbnN1cmluZyBwcm9wZXJ0eQogICAgICAgKiBhY2Nlc3NvcnMgZXhpc3Qgb24gdGhlIGVsZW1lbnQgcHJvdG90eXBlLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkKICAgICAgICogYGZpbmFsaXplYCBhbmQgZmluYWxpemVzIHRoZSBjbGFzcyBjb25zdHJ1Y3Rvci4KICAgICAgICoKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIF9maW5hbGl6ZUNsYXNzKCkgewogICAgICAgIGNvbnN0IHByb3BzID0gb3duUHJvcGVydGllcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnRpZXMocHJvcHMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBtZW1vaXplZCB2ZXJzaW9uIG9mIGFsbCBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcgdGhvc2UgaW5oZXJpdGVkCiAgICAgICAqIGZyb20gc3VwZXIgY2xhc3Nlcy4gUHJvcGVydGllcyBub3QgaW4gb2JqZWN0IGZvcm1hdCBhcmUgY29udmVydGVkIHRvCiAgICAgICAqIGF0IGxlYXN0IHt0eXBlfS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7T2JqZWN0fSBPYmplY3QgY29udGFpbmluZyBwcm9wZXJ0aWVzIGZvciB0aGlzIGNsYXNzCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBnZXQgX3Byb3BlcnRpZXMoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KAogICAgICAgICAgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX19wcm9wZXJ0aWVzJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBzdXBlckN0b3IgPSBzdXBlclByb3BlcnRpZXNDbGFzcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgICB0aGlzLl9fcHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sCiAgICAgICAgICAgIHN1cGVyQ3RvciAmJiBzdXBlckN0b3IuX3Byb3BlcnRpZXMsCiAgICAgICAgICAgIG93blByb3BlcnRpZXMoLyoqIEB0eXBlIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gKi8odGhpcykpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX19wcm9wZXJ0aWVzOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQcm9wZXJ0aWVzQ2hhbmdlZGAgbWV0aG9kIHRvIHJldHVybiB0eXBlIHNwZWNpZmllZCBpbiB0aGUKICAgICAgICogc3RhdGljIGBwcm9wZXJ0aWVzYCBvYmplY3QgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBwcm9wZXJ0eQogICAgICAgKiBAcmV0dXJuIHsqfSBUeXBlIHRvIHdoaWNoIHRvIGRlc2VyaWFsaXplIGF0dHJpYnV0ZQogICAgICAgKgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgdHlwZUZvclByb3BlcnR5KG5hbWUpIHsKICAgICAgICBjb25zdCBpbmZvID0gdGhpcy5fcHJvcGVydGllc1tuYW1lXTsKICAgICAgICByZXR1cm4gaW5mbyAmJiBpbmZvLnR5cGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFByb3BlcnRpZXNDaGFuZ2VkYCBtZXRob2QgYW5kIGFkZHMgYSBjYWxsIHRvCiAgICAgICAqIGBmaW5hbGl6ZWAgd2hpY2ggbGF6aWx5IGNvbmZpZ3VyZXMgdGhlIGVsZW1lbnQncyBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIFBvbHltZXIudGVsZW1ldHJ5Lmluc3RhbmNlQ291bnQrKzsKICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLmZpbmFsaXplKCk7CiAgICAgICAgc3VwZXIuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBhZGRlZCB0byBhIGRvY3VtZW50LgogICAgICAgKiBDYWxscyBgX2VuYWJsZVByb3BlcnRpZXNgIHRvIHR1cm4gb24gcHJvcGVydHkgc3lzdGVtIGZyb20KICAgICAgICogYFByb3BlcnRpZXNDaGFuZ2VkYC4KICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gU3VwZXIgbWF5IG9yIG1heSBub3QgaW1wbGVtZW50IHRoZSBjYWxsYmFjawogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgaWYgKHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKSB7CiAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyByZW1vdmVkIGZyb20gYSBkb2N1bWVudAogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBTdXBlciBtYXkgb3IgbWF5IG5vdCBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICBpZiAoc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2spIHsKICAgICAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgICAgfQogICAgICB9CgogICAgfQoKICAgIHJldHVybiBQcm9wZXJ0aWVzTWl4aW47CgogIH0pOwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgYnVpbHRDU1MgPSB3aW5kb3cuU2hhZHlDU1MgJiYgd2luZG93LlNoYWR5Q1NTWydjc3NCdWlsZCddOwoKICAvKioKICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MgbWV0YS1wcm9ncmFtbWluZwogICAqIGZlYXR1cmVzIGluY2x1ZGluZyB0ZW1wbGF0ZSBzdGFtcGluZywgZGF0YS1iaW5kaW5nLCBhdHRyaWJ1dGUgZGVzZXJpYWxpemF0aW9uLAogICAqIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24uCiAgICoKICAgKiBTdWJjbGFzc2VycyBtYXkgcHJvdmlkZSB0aGUgZm9sbG93aW5nIHN0YXRpYyBnZXR0ZXJzIHRvIHJldHVybiBtZXRhZGF0YQogICAqIHVzZWQgdG8gY29uZmlndXJlIFBvbHltZXIncyBmZWF0dXJlcyBmb3IgdGhlIGNsYXNzOgogICAqCiAgICogLSBgc3RhdGljIGdldCBpcygpYDogV2hlbiB0aGUgdGVtcGxhdGUgaXMgcHJvdmlkZWQgdmlhIGEgYGRvbS1tb2R1bGVgLAogICAqICAgdXNlcnMgc2hvdWxkIHJldHVybiB0aGUgYGRvbS1tb2R1bGVgIGlkIGZyb20gYSBzdGF0aWMgYGlzYCBnZXR0ZXIuICBJZgogICAqICAgbm8gdGVtcGxhdGUgaXMgbmVlZGVkIG9yIHRoZSB0ZW1wbGF0ZSBpcyBwcm92aWRlZCBkaXJlY3RseSB2aWEgdGhlCiAgICogICBgdGVtcGxhdGVgIGdldHRlciwgdGhlcmUgaXMgbm8gbmVlZCB0byBkZWZpbmUgYGlzYCBmb3IgdGhlIGVsZW1lbnQuCiAgICoKICAgKiAtIGBzdGF0aWMgZ2V0IHRlbXBsYXRlKClgOiBVc2VycyBtYXkgcHJvdmlkZSB0aGUgdGVtcGxhdGUgZGlyZWN0bHkgKGFzCiAgICogICBvcHBvc2VkIHRvIHZpYSBgZG9tLW1vZHVsZWApIGJ5IGltcGxlbWVudGluZyBhIHN0YXRpYyBgdGVtcGxhdGVgIGdldHRlci4KICAgKiAgIFRoZSBnZXR0ZXIgbWF5IHJldHVybiBhbiBgSFRNTFRlbXBsYXRlRWxlbWVudGAgb3IgYSBzdHJpbmcsIHdoaWNoIHdpbGwKICAgKiAgIGF1dG9tYXRpY2FsbHkgYmUgcGFyc2VkIGludG8gYSB0ZW1wbGF0ZS4KICAgKgogICAqIC0gYHN0YXRpYyBnZXQgcHJvcGVydGllcygpYDogU2hvdWxkIHJldHVybiBhbiBvYmplY3QgZGVzY3JpYmluZwogICAqICAgcHJvcGVydHktcmVsYXRlZCBtZXRhZGF0YSB1c2VkIGJ5IFBvbHltZXIgZmVhdHVyZXMgKGtleTogcHJvcGVydHkgbmFtZQogICAqICAgdmFsdWU6IG9iamVjdCBjb250YWluaW5nIHByb3BlcnR5IG1ldGFkYXRhKS4gVmFsaWQga2V5cyBpbiBwZXItcHJvcGVydHkKICAgKiAgIG1ldGFkYXRhIGluY2x1ZGU6CiAgICogICAtIGB0eXBlYCAoU3RyaW5nfE51bWJlcnxPYmplY3R8QXJyYXl8Li4uKTogVXNlZCBieQogICAqICAgICBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCB0byBkZXRlcm1pbmUgaG93IHN0cmluZy1iYXNlZCBhdHRyaWJ1dGVzCiAgICogICAgIGFyZSBkZXNlcmlhbGl6ZWQgdG8gSmF2YVNjcmlwdCBwcm9wZXJ0eSB2YWx1ZXMuCiAgICogICAtIGBub3RpZnlgIChib29sZWFuKTogQ2F1c2VzIGEgY2hhbmdlIGluIHRoZSBwcm9wZXJ0eSB0byBmaXJlIGEKICAgKiAgICAgbm9uLWJ1YmJsaW5nIGV2ZW50IGNhbGxlZCBgPHByb3BlcnR5Pi1jaGFuZ2VkYC4gRWxlbWVudHMgdGhhdCBoYXZlCiAgICogICAgIGVuYWJsZWQgdHdvLXdheSBiaW5kaW5nIHRvIHRoZSBwcm9wZXJ0eSB1c2UgdGhpcyBldmVudCB0byBvYnNlcnZlIGNoYW5nZXMuCiAgICogICAtIGByZWFkT25seWAgKGJvb2xlYW4pOiBDcmVhdGVzIGEgZ2V0dGVyIGZvciB0aGUgcHJvcGVydHksIGJ1dCBubyBzZXR0ZXIuCiAgICogICAgIFRvIHNldCBhIHJlYWQtb25seSBwcm9wZXJ0eSwgdXNlIHRoZSBwcml2YXRlIHNldHRlciBtZXRob2QKICAgKiAgICAgYF9zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpYC4KICAgKiAgIC0gYG9ic2VydmVyYCAoc3RyaW5nKTogT2JzZXJ2ZXIgbWV0aG9kIG5hbWUgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuCiAgICogICAgIHRoZSBwcm9wZXJ0eSBjaGFuZ2VzLiBUaGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QgYXJlCiAgICogICAgIGAodmFsdWUsIHByZXZpb3VzVmFsdWUpYC4KICAgKiAgIC0gYGNvbXB1dGVkYCAoc3RyaW5nKTogU3RyaW5nIGRlc2NyaWJpbmcgbWV0aG9kIGFuZCBkZXBlbmRlbnQgcHJvcGVydGllcwogICAqICAgICBmb3IgY29tcHV0aW5nIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IChlLmcuIGAnY29tcHV0ZUZvbyhiYXIsIHpvdCknYCkuCiAgICogICAgIENvbXB1dGVkIHByb3BlcnRpZXMgYXJlIHJlYWQtb25seSBieSBkZWZhdWx0IGFuZCBjYW4gb25seSBiZSBjaGFuZ2VkCiAgICogICAgIHZpYSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBjb21wdXRpbmcgbWV0aG9kLgogICAqCiAgICogLSBgc3RhdGljIGdldCBvYnNlcnZlcnMoKWA6IEFycmF5IG9mIHN0cmluZ3MgZGVzY3JpYmluZyBtdWx0aS1wcm9wZXJ0eQogICAqICAgb2JzZXJ2ZXIgbWV0aG9kcyBhbmQgdGhlaXIgZGVwZW5kZW50IHByb3BlcnRpZXMgKGUuZy4KICAgKiAgIGAnb2JzZXJ2ZUFCQyhhLCBiLCBjKSdgKS4KICAgKgogICAqIFRoZSBiYXNlIGNsYXNzIHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgZm9sbG93aW5nIHN0YW5kYXJkCiAgICogY3VzdG9tIGVsZW1lbnQgbGlmZWN5Y2xlIGNhbGxiYWNrczsgdXNlcnMgbWF5IG92ZXJyaWRlIHRoZXNlLCBidXQgc2hvdWxkCiAgICogY2FsbCB0aGUgc3VwZXIgbWV0aG9kIHRvIGVuc3VyZQogICAqIC0gYGNvbnN0cnVjdG9yYDogUnVuIHdoZW4gdGhlIGVsZW1lbnQgaXMgY3JlYXRlZCBvciB1cGdyYWRlZAogICAqIC0gYGNvbm5lY3RlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlCiAgICogICBkb2N1bWVudAogICAqIC0gYGRpc2Nvbm5lY3RlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSB0aGUgZWxlbWVudCBpcyBkaXNjb25uZWN0ZWQgZnJvbQogICAqICAgdGhlIGRvY3VtZW50CiAgICogLSBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSBhbiBhdHRyaWJ1dGUgaW4KICAgKiAgIGBvYnNlcnZlZEF0dHJpYnV0ZXNgIGlzIHNldCBvciByZW1vdmVkIChub3RlOiB0aGlzIGVsZW1lbnQncyBkZWZhdWx0CiAgICogICBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBpbXBsZW1lbnRhdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgcmV0dXJuIGFuIGFycmF5CiAgICogICBvZiBkYXNoLWNhc2VkIGF0dHJpYnV0ZXMgYmFzZWQgb24gYHByb3BlcnRpZXNgKQogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHMKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydGllc01peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcHJvcGVydHkgcm9vdFBhdGgge3N0cmluZ30gU2V0IHRvIHRoZSB2YWx1ZSBvZiBgUG9seW1lci5yb290UGF0aGAsCiAgICogICB3aGljaCBkZWZhdWx0cyB0byB0aGUgbWFpbiBkb2N1bWVudCBwYXRoCiAgICogQHByb3BlcnR5IGltcG9ydFBhdGgge3N0cmluZ30gU2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUgY2xhc3MncyBzdGF0aWMKICAgKiAgIGBpbXBvcnRQYXRoYCBwcm9wZXJ0eSwgd2hpY2ggZGVmYXVsdHMgdG8gdGhlIHBhdGggb2YgdGhpcyBlbGVtZW50J3MKICAgKiAgIGBkb20tbW9kdWxlYCAod2hlbiBgaXNgIGlzIHVzZWQpLCBidXQgY2FuIGJlIG92ZXJyaWRkZW4gZm9yIG90aGVyCiAgICogICBpbXBvcnQgc3RyYXRlZ2llcy4KICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MKICAgKiBtZXRhLXByb2dyYW1taW5nIGZlYXR1cmVzLgogICAqLwogIFBvbHltZXIuRWxlbWVudE1peGluID0gUG9seW1lci5kZWR1cGluZ01peGluKGJhc2UgPT4gewoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnRpZXNNaXhpbn0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IHBvbHltZXJFbGVtZW50QmFzZSA9IFBvbHltZXIuUHJvcGVydGllc01peGluKFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKGJhc2UpKTsKCiAgICAvKioKICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHByb3BlcnRpZXMgd2l0aCBkZWZhdWx0IHZhbHVlcy4KICAgICAqIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGFzIGFuIG9wdGltaXphdGlvbiBzaW5jZSBpdCBpcyBhIHN1YnNldCBvZgogICAgICogdGhlIGxpc3QgcmV0dXJuZWQgZnJvbSBgX3Byb3BlcnRpZXNgLgogICAgICogVGhpcyBsaXN0IGlzIHVzZWQgaW4gYF9pbml0aWFsaXplUHJvcGVydGllc2AgdG8gc2V0IHByb3BlcnR5IGRlZmF1bHRzLgogICAgICoKICAgICAqIEBwYXJhbSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0gY29uc3RydWN0b3IgRWxlbWVudCBjbGFzcwogICAgICogQHJldHVybiB7UG9seW1lckVsZW1lbnRQcm9wZXJ0aWVzfSBGbGF0dGVuZWQgcHJvcGVydGllcyBmb3IgdGhpcyBjbGFzcwogICAgICogICB0aGF0IGhhdmUgZGVmYXVsdCB2YWx1ZXMKICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByb3BlcnR5RGVmYXVsdHMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eSgKICAgICAgICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX3Byb3BlcnR5RGVmYXVsdHMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgY29uc3RydWN0b3IuX19wcm9wZXJ0eURlZmF1bHRzID0gbnVsbDsKICAgICAgICBsZXQgcHJvcHMgPSBjb25zdHJ1Y3Rvci5fcHJvcGVydGllczsKICAgICAgICBmb3IgKGxldCBwIGluIHByb3BzKSB7CiAgICAgICAgICBsZXQgaW5mbyA9IHByb3BzW3BdOwogICAgICAgICAgaWYgKCd2YWx1ZScgaW4gaW5mbykgewogICAgICAgICAgICBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHMgPSBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHMgfHwge307CiAgICAgICAgICAgIGNvbnN0cnVjdG9yLl9fcHJvcGVydHlEZWZhdWx0c1twXSA9IGluZm87CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbWVtb2l6ZWQgdmVyc2lvbiBvZiB0aGUgYG9ic2VydmVyc2AgYXJyYXkuCiAgICAgKiBAcGFyYW0ge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIEVsZW1lbnQgY2xhc3MKICAgICAqIEByZXR1cm4ge0FycmF5fSBBcnJheSBjb250YWluaW5nIG93biBvYnNlcnZlcnMgZm9yIHRoZSBnaXZlbiBjbGFzcwogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBmdW5jdGlvbiBvd25PYnNlcnZlcnMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eSgKICAgICAgICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX293bk9ic2VydmVycycsIGNvbnN0cnVjdG9yKSkpIHsKICAgICAgICAgIGNvbnN0cnVjdG9yLl9fb3duT2JzZXJ2ZXJzID0KICAgICAgICAgIGNvbnN0cnVjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ29ic2VydmVycycsIGNvbnN0cnVjdG9yKSkgPwogICAgICAgICAgLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSAqLyAoY29uc3RydWN0b3IpLm9ic2VydmVycyA6IG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLl9fb3duT2JzZXJ2ZXJzOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBlZmZlY3RzIGZvciBhIHByb3BlcnR5LgogICAgICoKICAgICAqIE5vdGUsIG9uY2UgYSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQgdG8KICAgICAqIGByZWFkT25seWAsIGBjb21wdXRlZGAsIGByZWZsZWN0VG9BdHRyaWJ1dGVgLCBvciBgbm90aWZ5YAogICAgICogdGhlc2UgdmFsdWVzIG1heSBub3QgYmUgY2hhbmdlZC4gRm9yIGV4YW1wbGUsIGEgc3ViY2xhc3MgY2Fubm90CiAgICAgKiBhbHRlciB0aGVzZSBzZXR0aW5ncy4gSG93ZXZlciwgYWRkaXRpb25hbCBgb2JzZXJ2ZXJzYCBtYXkgYmUgYWRkZWQKICAgICAqIGJ5IHN1YmNsYXNzZXMuCiAgICAgKgogICAgICogVGhlIGluZm8gb2JqZWN0IHNob3VsZCBjb250YWluIHByb3BlcnR5IG1ldGFkYXRhIGFzIGZvbGxvd3M6CiAgICAgKgogICAgICogKiBgdHlwZWA6IHtmdW5jdGlvbn0gdHlwZSB0byB3aGljaCBhbiBhdHRyaWJ1dGUgbWF0Y2hpbmcgdGhlIHByb3BlcnR5CiAgICAgKiBpcyBkZXNlcmlhbGl6ZWQuIE5vdGUgdGhlIHByb3BlcnR5IGlzIGNhbWVsLWNhc2VkIGZyb20gYSBkYXNoLWNhc2VkCiAgICAgKiBhdHRyaWJ1dGUuIEZvciBleGFtcGxlLCAnZm9vLWJhcicgYXR0cmlidXRlIGlzIGRlc2VyaWFsaXplZCB0byBhCiAgICAgKiBwcm9wZXJ0eSBuYW1lZCAnZm9vQmFyJy4KICAgICAqCiAgICAgKiAqIGByZWFkT25seWA6IHtib29sZWFufSBjcmVhdGVzIGEgcmVhZE9ubHkgcHJvcGVydHkgYW5kCiAgICAgKiBtYWtlcyBhIHByaXZhdGUgc2V0dGVyIGZvciB0aGUgcHJpdmF0ZSBvZiB0aGUgZm9ybSAnX3NldEZvbycgZm9yIGEKICAgICAqIHByb3BlcnR5ICdmb28nLAogICAgICoKICAgICAqICogYGNvbXB1dGVkYDoge3N0cmluZ30gY3JlYXRlcyBhIGNvbXB1dGVkIHByb3BlcnR5LiBBIGNvbXB1dGVkIHByb3BlcnR5CiAgICAgKiBpcyBhbHNvIGF1dG9tYXRpY2FsbHkgc2V0IHRvIGByZWFkT25seTogdHJ1ZWAuIFRoZSB2YWx1ZSBpcyBjYWxjdWxhdGVkCiAgICAgKiBieSBydW5uaW5nIGEgbWV0aG9kIGFuZCBhcmd1bWVudHMgcGFyc2VkIGZyb20gdGhlIGdpdmVuIHN0cmluZy4gRm9yCiAgICAgKiBleGFtcGxlICdjb21wdXRlKGZvbyknIHdpbGwgY29tcHV0ZSBhIGdpdmVuIHByb3BlcnR5IHdoZW4gdGhlCiAgICAgKiAnZm9vJyBwcm9wZXJ0eSBjaGFuZ2VzIGJ5IGV4ZWN1dGluZyB0aGUgJ2NvbXB1dGUnIG1ldGhvZC4gVGhpcyBtZXRob2QKICAgICAqIG11c3QgcmV0dXJuIHRoZSBjb21wdXRlZCB2YWx1ZS4KICAgICAqCiAgICAgKiAqIGByZWZsZWN0VG9BdHRyaWJ1dGVgOiB7Ym9vbGVhbn0gSWYgdHJ1ZSwgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHJlZmxlY3RlZAogICAgICogdG8gYW4gYXR0cmlidXRlIG9mIHRoZSBzYW1lIG5hbWUuIE5vdGUsIHRoZSBhdHRyaWJ1dGUgaXMgZGFzaC1jYXNlZAogICAgICogc28gYSBwcm9wZXJ0eSBuYW1lZCAnZm9vQmFyJyBpcyByZWZsZWN0ZWQgYXMgJ2Zvby1iYXInLgogICAgICoKICAgICAqICogYG5vdGlmeWA6IHtib29sZWFufSBzZW5kcyBhIG5vbi1idWJibGluZyBub3RpZmljYXRpb24gZXZlbnQgd2hlbgogICAgICogdGhlIHByb3BlcnR5IGNoYW5nZXMuIEZvciBleGFtcGxlLCBhIHByb3BlcnR5IG5hbWVkICdmb28nIHNlbmRzIGFuCiAgICAgKiBldmVudCBuYW1lZCAnZm9vLWNoYW5nZWQnIHdpdGggYGV2ZW50LmRldGFpbGAgc2V0IHRvIHRoZSB2YWx1ZSBvZgogICAgICogdGhlIHByb3BlcnR5LgogICAgICoKICAgICAqICogb2JzZXJ2ZXI6IHtzdHJpbmd9IG5hbWUgb2YgYSBtZXRob2QgdGhhdCBydW5zIHdoZW4gdGhlIHByb3BlcnR5CiAgICAgKiBjaGFuZ2VzLiBUaGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QgYXJlICh2YWx1ZSwgcHJldmlvdXNWYWx1ZSkuCiAgICAgKgogICAgICogTm90ZTogVXNlcnMgbWF5IHdhbnQgY29udHJvbCBvdmVyIG1vZGlmeWluZyBwcm9wZXJ0eQogICAgICogZWZmZWN0cyB2aWEgc3ViY2xhc3NpbmcuIEZvciBleGFtcGxlLCBhIHVzZXIgbWlnaHQgd2FudCB0byBtYWtlIGEKICAgICAqIHJlZmxlY3RUb0F0dHJpYnV0ZSBwcm9wZXJ0eSBub3QgZG8gc28gaW4gYSBzdWJjbGFzcy4gV2UndmUgY2hvc2VuIHRvCiAgICAgKiBkaXNhYmxlIHRoaXMgYmVjYXVzZSBpdCBsZWFkcyB0byBhZGRpdGlvbmFsIGNvbXBsaWNhdGlvbi4KICAgICAqIEZvciBleGFtcGxlLCBhIHJlYWRPbmx5IGVmZmVjdCBnZW5lcmF0ZXMgYSBzcGVjaWFsIHNldHRlci4gSWYgYSBzdWJjbGFzcwogICAgICogZGlzYWJsZXMgdGhlIGVmZmVjdCwgdGhlIHNldHRlciB3b3VsZCBmYWlsIHVuZXhwZWN0ZWRseS4KICAgICAqIEJhc2VkIG9uIGZlZWRiYWNrLCB3ZSBtYXkgd2FudCB0byB0cnkgdG8gbWFrZSBlZmZlY3RzIG1vcmUgbWFsbGVhYmxlCiAgICAgKiBhbmQvb3IgcHJvdmlkZSBhbiBhZHZhbmNlZCBhcGkgZm9yIG1hbmlwdWxhdGluZyB0aGVtLgogICAgICogQWxzbyBjb25zaWRlciBhZGRpbmcgd2FybmluZ3Mgd2hlbiBhbiBlZmZlY3QgY2Fubm90IGJlIGNoYW5nZWQuCiAgICAgKgogICAgICogQHBhcmFtIHshUG9seW1lckVsZW1lbnR9IHByb3RvIEVsZW1lbnQgY2xhc3MgcHJvdG90eXBlIHRvIGFkZCBhY2Nlc3NvcnMKICAgICAqICAgYW5kIGVmZmVjdHMgdG8KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIHByb3BlcnR5LgogICAgICogQHBhcmFtIHtPYmplY3R9IGluZm8gSW5mbyBvYmplY3QgZnJvbSB3aGljaCB0byBjcmVhdGUgcHJvcGVydHkgZWZmZWN0cy4KICAgICAqIFN1cHBvcnRlZCBrZXlzOgogICAgICogQHBhcmFtIHtPYmplY3R9IGFsbFByb3BzIEZsYXR0ZW5lZCBtYXAgb2YgYWxsIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGlzCiAgICAgKiAgIGVsZW1lbnQgKGluY2x1ZGluZyBpbmhlcml0ZWQgcHJvcGVydGllcykKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eUZyb21Db25maWcocHJvdG8sIG5hbWUsIGluZm8sIGFsbFByb3BzKSB7CiAgICAgIC8vIGNvbXB1dGVkIGZvcmNlcyByZWFkT25seS4uLgogICAgICBpZiAoaW5mby5jb21wdXRlZCkgewogICAgICAgIGluZm8ucmVhZE9ubHkgPSB0cnVlOwogICAgICB9CiAgICAgIC8vIE5vdGUsIHNpbmNlIGFsbCBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSByZWFkT25seSwgdGhpcyBwcmV2ZW50cwogICAgICAvLyBhZGRpbmcgYWRkaXRpb25hbCBjb21wdXRlZCBwcm9wZXJ0eSBlZmZlY3RzICh3aGljaCBsZWFkcyB0byBhIGNvbmZ1c2luZwogICAgICAvLyBzZXR1cCB3aGVyZSBtdWx0aXBsZSB0cmlnZ2VycyBmb3Igc2V0dGluZyBhIHByb3BlcnR5KQogICAgICAvLyBXaGlsZSB3ZSBkbyBoYXZlIGBoYXNDb21wdXRlZEVmZmVjdGAgdGhpcyBpcyBzZXQgb24gdGhlIHByb3BlcnR5J3MKICAgICAgLy8gZGVwZW5kZW5jaWVzIHJhdGhlciB0aGFuIGl0c2VsZi4KICAgICAgaWYgKGluZm8uY29tcHV0ZWQgJiYgIXByb3RvLl9oYXNSZWFkT25seUVmZmVjdChuYW1lKSkgewogICAgICAgIHByb3RvLl9jcmVhdGVDb21wdXRlZFByb3BlcnR5KG5hbWUsIGluZm8uY29tcHV0ZWQsIGFsbFByb3BzKTsKICAgICAgfQogICAgICBpZiAoaW5mby5yZWFkT25seSAmJiAhcHJvdG8uX2hhc1JlYWRPbmx5RWZmZWN0KG5hbWUpKSB7CiAgICAgICAgcHJvdG8uX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkobmFtZSwgIWluZm8uY29tcHV0ZWQpOwogICAgICB9CiAgICAgIGlmIChpbmZvLnJlZmxlY3RUb0F0dHJpYnV0ZSAmJiAhcHJvdG8uX2hhc1JlZmxlY3RFZmZlY3QobmFtZSkpIHsKICAgICAgICBwcm90by5fY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkobmFtZSk7CiAgICAgIH0KICAgICAgaWYgKGluZm8ubm90aWZ5ICYmICFwcm90by5faGFzTm90aWZ5RWZmZWN0KG5hbWUpKSB7CiAgICAgICAgcHJvdG8uX2NyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5KG5hbWUpOwogICAgICB9CiAgICAgIC8vIGFsd2F5cyBhZGQgb2JzZXJ2ZXIKICAgICAgaWYgKGluZm8ub2JzZXJ2ZXIpIHsKICAgICAgICBwcm90by5fY3JlYXRlUHJvcGVydHlPYnNlcnZlcihuYW1lLCBpbmZvLm9ic2VydmVyLCBhbGxQcm9wc1tpbmZvLm9ic2VydmVyXSk7CiAgICAgIH0KICAgICAgLy8gYWx3YXlzIGNyZWF0ZSB0aGUgbWFwcGluZyBmcm9tIGF0dHJpYnV0ZSBiYWNrIHRvIHByb3BlcnR5IGZvciBkZXNlcmlhbGl6YXRpb24uCiAgICAgIHByb3RvLl9hZGRQcm9wZXJ0eVRvQXR0cmlidXRlTWFwKG5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogUHJvY2VzcyBhbGwgc3R5bGUgZWxlbWVudHMgaW4gdGhlIGVsZW1lbnQgdGVtcGxhdGUuIFN0eWxlcyB3aXRoIHRoZQogICAgICogYGluY2x1ZGVgIGF0dHJpYnV0ZSBhcmUgcHJvY2Vzc2VkIHN1Y2ggdGhhdCBhbnkgc3R5bGVzIGluCiAgICAgKiB0aGUgYXNzb2NpYXRlZCAic3R5bGUgbW9kdWxlcyIgYXJlIGluY2x1ZGVkIGluIHRoZSBlbGVtZW50IHRlbXBsYXRlLgogICAgICogQHBhcmFtIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSBrbGFzcyBFbGVtZW50IGNsYXNzCiAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBwcm9jZXNzCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaXMgTmFtZSBvZiBlbGVtZW50CiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBCYXNlIFVSSSBmb3IgZWxlbWVudAogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gcHJvY2Vzc0VsZW1lbnRTdHlsZXMoa2xhc3MsIHRlbXBsYXRlLCBpcywgYmFzZVVSSSkgewogICAgICBpZiAoIWJ1aWx0Q1NTKSB7CiAgICAgICAgY29uc3QgdGVtcGxhdGVTdHlsZXMgPSB0ZW1wbGF0ZS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N0eWxlJyk7CiAgICAgICAgY29uc3Qgc3R5bGVzV2l0aEltcG9ydHMgPSBQb2x5bWVyLlN0eWxlR2F0aGVyLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgLy8gaW5zZXJ0IHN0eWxlcyBmcm9tIDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPiBhdCB0aGUgdG9wIG9mIHRoZSB0ZW1wbGF0ZQogICAgICAgIGNvbnN0IGxpbmtlZFN0eWxlcyA9IFBvbHltZXIuU3R5bGVHYXRoZXIuc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMoaXMpOwogICAgICAgIGNvbnN0IGZpcnN0VGVtcGxhdGVDaGlsZCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7CiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgbGlua2VkU3R5bGVzLmxlbmd0aDsgaWR4KyspIHsKICAgICAgICAgIGxldCBzID0gbGlua2VkU3R5bGVzW2lkeF07CiAgICAgICAgICBzLnRleHRDb250ZW50ID0ga2xhc3MuX3Byb2Nlc3NTdHlsZVRleHQocy50ZXh0Q29udGVudCwgYmFzZVVSSSk7CiAgICAgICAgICB0ZW1wbGF0ZS5jb250ZW50Lmluc2VydEJlZm9yZShzLCBmaXJzdFRlbXBsYXRlQ2hpbGQpOwogICAgICAgIH0KICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0ICJjb25jcmV0ZSIgc3R5bGUgaW4gdGhlIHRlbXBsYXRlIHdlIGhhdmUgZW5jb3VudGVyZWQKICAgICAgICBsZXQgdGVtcGxhdGVTdHlsZUluZGV4ID0gMDsKICAgICAgICAvLyBlbnN1cmUgYWxsIGdhdGhlcmVkIHN0eWxlcyBhcmUgYWN0dWFsbHkgaW4gdGhpcyB0ZW1wbGF0ZS4KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0eWxlc1dpdGhJbXBvcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgcyA9IHN0eWxlc1dpdGhJbXBvcnRzW2ldOwogICAgICAgICAgbGV0IHRlbXBsYXRlU3R5bGUgPSB0ZW1wbGF0ZVN0eWxlc1t0ZW1wbGF0ZVN0eWxlSW5kZXhdOwogICAgICAgICAgLy8gaWYgdGhlIHN0eWxlIGlzIG5vdCBpbiB0aGlzIHRlbXBsYXRlLCBpdCdzIGJlZW4gImluY2x1ZGVkIiBhbmQKICAgICAgICAgIC8vIHdlIHB1dCBhIGNsb25lIG9mIGl0IGluIHRoZSB0ZW1wbGF0ZSBiZWZvcmUgdGhlIHN0eWxlIHRoYXQgaW5jbHVkZWQgaXQKICAgICAgICAgIGlmICh0ZW1wbGF0ZVN0eWxlICE9PSBzKSB7CiAgICAgICAgICAgIHMgPSBzLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgICAgdGVtcGxhdGVTdHlsZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzLCB0ZW1wbGF0ZVN0eWxlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRlbXBsYXRlU3R5bGVJbmRleCsrOwogICAgICAgICAgfQogICAgICAgICAgcy50ZXh0Q29udGVudCA9IGtsYXNzLl9wcm9jZXNzU3R5bGVUZXh0KHMudGV4dENvbnRlbnQsIGJhc2VVUkkpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAod2luZG93LlNoYWR5Q1NTKSB7CiAgICAgICAgd2luZG93LlNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZSh0ZW1wbGF0ZSwgaXMpOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBMb29rIHVwIHRlbXBsYXRlIGZyb20gZG9tLW1vZHVsZSBmb3IgZWxlbWVudAogICAgICoKICAgICAqIEBwYXJhbSB7IXN0cmluZ30gaXMgRWxlbWVudCBuYW1lIHRvIGxvb2sgdXAKICAgICAqIEByZXR1cm4geyFIVE1MVGVtcGxhdGVFbGVtZW50fSBUZW1wbGF0ZSBmb3VuZCBpbiBkb20gbW9kdWxlLCBvcgogICAgICogICB1bmRlZmluZWQgaWYgbm90IGZvdW5kCiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFRlbXBsYXRlRnJvbURvbU1vZHVsZShpcykgewogICAgICBsZXQgdGVtcGxhdGUgPSBudWxsOwogICAgICBpZiAoaXMgJiYgUG9seW1lci5Eb21Nb2R1bGUpIHsKICAgICAgICB0ZW1wbGF0ZSA9IFBvbHltZXIuRG9tTW9kdWxlLmltcG9ydChpcywgJ3RlbXBsYXRlJyk7CiAgICAgICAgLy8gVW5kZXIgc3RyaWN0VGVtcGxhdGVQb2xpY3ksIHJlcXVpcmUgYW55IGVsZW1lbnQgd2l0aCBhbiBgaXNgCiAgICAgICAgLy8gc3BlY2lmaWVkIHRvIGhhdmUgYSBkb20tbW9kdWxlCiAgICAgICAgaWYgKFBvbHltZXIuc3RyaWN0VGVtcGxhdGVQb2xpY3kgJiYgIXRlbXBsYXRlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHN0cmljdFRlbXBsYXRlUG9saWN5OiBleHBlY3RpbmcgZG9tLW1vZHVsZSBvciBudWxsIHRlbXBsYXRlIGZvciAke2lzfWApOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdGVtcGxhdGU7CiAgICB9CgogIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9FbGVtZW50TWl4aW59CiAgICAgKi8KICAgIGNsYXNzIFBvbHltZXJFbGVtZW50IGV4dGVuZHMgcG9seW1lckVsZW1lbnRCYXNlIHsKCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZSBvZiBQcm9wZXJ0aWVzTWl4aW4gX2ZpbmFsaXplQ2xhc3MgdG8gY3JlYXRlIG9ic2VydmVycyBhbmQKICAgICAgICogZmluZCB0aGUgdGVtcGxhdGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IEludGVyZmFjZXMgaW4gY2xvc3VyZSBkbyBub3QgaW5oZXJpdCBzdGF0aWNzLCBidXQgY2xhc3NlcyBkbwogICAgICAgKi8KICAgICAgc3RhdGljIF9maW5hbGl6ZUNsYXNzKCkgewogICAgICAgIHN1cGVyLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgY29uc3Qgb2JzZXJ2ZXJzID0gb3duT2JzZXJ2ZXJzKHRoaXMpOwogICAgICAgIGlmIChvYnNlcnZlcnMpIHsKICAgICAgICAgIHRoaXMuY3JlYXRlT2JzZXJ2ZXJzKG9ic2VydmVycywgdGhpcy5fcHJvcGVydGllcyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3ByZXBhcmVUZW1wbGF0ZSgpOwogICAgICB9CgogICAgICBzdGF0aWMgX3ByZXBhcmVUZW1wbGF0ZSgpIHsKICAgICAgICAvLyBub3RlOiBjcmVhdGUgIndvcmtpbmciIHRlbXBsYXRlIHRoYXQgaXMgZmluYWxpemVkIGF0IGluc3RhbmNlIHRpbWUKICAgICAgICBsZXQgdGVtcGxhdGUgPSAvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9ICovICh0aGlzKS50ZW1wbGF0ZTsKICAgICAgICBpZiAodGVtcGxhdGUpIHsKICAgICAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIGxldCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTsKICAgICAgICAgICAgdC5pbm5lckhUTUwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgdGVtcGxhdGUgPSB0OwogICAgICAgICAgfSBlbHNlIGlmICghUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zKSB7CiAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoaXMucHJvdG90eXBlLl90ZW1wbGF0ZSA9IHRlbXBsYXRlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgb2YgUHJvcGVydGllc0NoYW5nZWQgY3JlYXRlUHJvcGVydGllcyB0byBjcmVhdGUgYWNjZXNzb3JzCiAgICAgICAqIGFuZCBwcm9wZXJ0eSBlZmZlY3RzIGZvciBhbGwgb2YgdGhlIHByb3BlcnRpZXMuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIGZvciAobGV0IHAgaW4gcHJvcHMpIHsKICAgICAgICAgIGNyZWF0ZVByb3BlcnR5RnJvbUNvbmZpZyh0aGlzLnByb3RvdHlwZSwgcCwgcHJvcHNbcF0sIHByb3BzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIG9ic2VydmVycyBmb3IgdGhlIGdpdmVuIGBvYnNlcnZlcnNgIGFycmF5LgogICAgICAgKiBMZXZlcmFnZXMgYFByb3BlcnR5RWZmZWN0c2AgdG8gY3JlYXRlIG9ic2VydmVycy4KICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9ic2VydmVycyBBcnJheSBvZiBvYnNlcnZlciBkZXNjcmlwdG9ycyBmb3IKICAgICAgICogICB0aGlzIGNsYXNzCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkeW5hbWljRm5zIE9iamVjdCBjb250YWluaW5nIGtleXMgZm9yIGFueSBwcm9wZXJ0aWVzCiAgICAgICAqICAgdGhhdCBhcmUgZnVuY3Rpb25zIGFuZCBzaG91bGQgdHJpZ2dlciB0aGUgZWZmZWN0IHdoZW4gdGhlIGZ1bmN0aW9uCiAgICAgICAqICAgcmVmZXJlbmNlIGlzIGNoYW5nZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZU9ic2VydmVycyhvYnNlcnZlcnMsIGR5bmFtaWNGbnMpIHsKICAgICAgICBjb25zdCBwcm90byA9IHRoaXMucHJvdG90eXBlOwogICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG9ic2VydmVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgcHJvdG8uX2NyZWF0ZU1ldGhvZE9ic2VydmVyKG9ic2VydmVyc1tpXSwgZHluYW1pY0Zucyk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgdGhhdCB3aWxsIGJlIHN0YW1wZWQgaW50byB0aGlzIGVsZW1lbnQncyBzaGFkb3cgcm9vdC4KICAgICAgICoKICAgICAgICogSWYgYSBgc3RhdGljIGdldCBpcygpYCBnZXR0ZXIgaXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KICAgICAgICogd2lsbCByZXR1cm4gdGhlIGZpcnN0IGA8dGVtcGxhdGU+YCBpbiBhIGBkb20tbW9kdWxlYCB3aG9zZSBgaWRgCiAgICAgICAqIG1hdGNoZXMgdGhpcyBlbGVtZW50J3MgYGlzYC4KICAgICAgICoKICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgZ2V0dGVyIHRvIHJldHVybiBhbiBhcmJpdHJhcnkgdGVtcGxhdGUKICAgICAgICogKGluIHdoaWNoIGNhc2UgdGhlIGBpc2AgZ2V0dGVyIGlzIHVubmVjZXNzYXJ5KS4gVGhlIHRlbXBsYXRlIHJldHVybmVkCiAgICAgICAqIG1heSBiZSBlaXRoZXIgYW4gYEhUTUxUZW1wbGF0ZUVsZW1lbnRgIG9yIGEgc3RyaW5nIHRoYXQgd2lsbCBiZQogICAgICAgKiBhdXRvbWF0aWNhbGx5IHBhcnNlZCBpbnRvIGEgdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhhdCB3aGVuIHN1YmNsYXNzaW5nLCBpZiB0aGUgc3VwZXIgY2xhc3Mgb3ZlcnJvZGUgdGhlIGRlZmF1bHQKICAgICAgICogaW1wbGVtZW50YXRpb24gYW5kIHRoZSBzdWJjbGFzcyB3b3VsZCBsaWtlIHRvIHByb3ZpZGUgYW4gYWx0ZXJuYXRlCiAgICAgICAqIHRlbXBsYXRlIHZpYSBhIGBkb20tbW9kdWxlYCwgaXQgc2hvdWxkIG92ZXJyaWRlIHRoaXMgZ2V0dGVyIGFuZAogICAgICAgKiByZXR1cm4gYFBvbHltZXIuRG9tTW9kdWxlLmltcG9ydCh0aGlzLmlzLCAndGVtcGxhdGUnKWAuCiAgICAgICAqCiAgICAgICAqIElmIGEgc3ViY2xhc3Mgd291bGQgbGlrZSB0byBtb2RpZnkgdGhlIHN1cGVyIGNsYXNzIHRlbXBsYXRlLCBpdCBzaG91bGQKICAgICAgICogY2xvbmUgaXQgcmF0aGVyIHRoYW4gbW9kaWZ5IGl0IGluIHBsYWNlLiAgSWYgdGhlIGdldHRlciBkb2VzIGV4cGVuc2l2ZQogICAgICAgKiB3b3JrIHN1Y2ggYXMgY2xvbmluZy9tb2RpZnlpbmcgYSB0ZW1wbGF0ZSwgaXQgc2hvdWxkIG1lbW9pemUgdGhlCiAgICAgICAqIHRlbXBsYXRlIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlOgogICAgICAgKgogICAgICAgKiAgIGxldCBtZW1vaXplZFRlbXBsYXRlOwogICAgICAgKiAgIGNsYXNzIE15U3ViQ2xhc3MgZXh0ZW5kcyBNeVN1cGVyQ2xhc3MgewogICAgICAgKiAgICAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHsKICAgICAgICogICAgICAgaWYgKCFtZW1vaXplZFRlbXBsYXRlKSB7CiAgICAgICAqICAgICAgICAgbWVtb2l6ZWRUZW1wbGF0ZSA9IE15U3VwZXJDbGFzcy50ZW1wbGF0ZS5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAqICAgICAgICAgbGV0IHN1YkNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICogICAgICAgICBzdWJDb250ZW50LnRleHRDb250ZW50ID0gJ1RoaXMgY2FtZSBmcm9tIE15U3ViQ2xhc3MnOwogICAgICAgKiAgICAgICAgIG1lbW9pemVkVGVtcGxhdGUuY29udGVudC5hcHBlbmRDaGlsZChzdWJDb250ZW50KTsKICAgICAgICogICAgICAgfQogICAgICAgKiAgICAgICByZXR1cm4gbWVtb2l6ZWRUZW1wbGF0ZTsKICAgICAgICogICAgIH0KICAgICAgICogICB9CiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge0hUTUxUZW1wbGF0ZUVsZW1lbnR8c3RyaW5nfSBUZW1wbGF0ZSB0byBiZSBzdGFtcGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgewogICAgICAgIC8vIEV4cGxhbmF0aW9uIG9mIHRlbXBsYXRlLXJlbGF0ZWQgcHJvcGVydGllczoKICAgICAgICAvLyAtIGNvbnN0cnVjdG9yLnRlbXBsYXRlICh0aGlzIGdldHRlcik6IHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGNsYXNzLgogICAgICAgIC8vICAgICBUaGlzIGNhbiBjb21lIGZyb20gdGhlIHByb3RvdHlwZSAoZm9yIGxlZ2FjeSBlbGVtZW50cyksIGZyb20gYQogICAgICAgIC8vICAgICBkb20tbW9kdWxlLCBvciBmcm9tIHRoZSBzdXBlciBjbGFzcydzIHRlbXBsYXRlIChvciBjYW4gYmUgb3ZlcnJpZGRlbgogICAgICAgIC8vICAgICBhbHRvZ2V0aGVyIGJ5IHRoZSB1c2VyKQogICAgICAgIC8vIC0gY29uc3RydWN0b3IuX3RlbXBsYXRlOiBtZW1vaXplZCB2ZXJzaW9uIG9mIGNvbnN0cnVjdG9yLnRlbXBsYXRlCiAgICAgICAgLy8gLSBwcm90b3R5cGUuX3RlbXBsYXRlOiB3b3JraW5nIHRlbXBsYXRlIGZvciB0aGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZQogICAgICAgIC8vICAgICBwYXJzZWQgYW5kIG1vZGlmaWVkIGluIHBsYWNlLiBJdCBpcyBhIGNsb25lZCB2ZXJzaW9uIG9mCiAgICAgICAgLy8gICAgIGNvbnN0cnVjdG9yLnRlbXBsYXRlLCBzYXZlZCBpbiBfZmluYWxpemVDbGFzcygpLiBOb3RlIHRoYXQgYmVmb3JlCiAgICAgICAgLy8gICAgIHRoaXMgZ2V0dGVyIGlzIGNhbGxlZCwgZm9yIGxlZ2FjeSBlbGVtZW50cyB0aGlzIGNvdWxkIGJlIGZyb20gYQogICAgICAgIC8vICAgICBfdGVtcGxhdGUgZmllbGQgb24gdGhlIGluZm8gb2JqZWN0IHBhc3NlZCB0byBQb2x5bWVyKCksIGEgYmVoYXZpb3IsCiAgICAgICAgLy8gICAgIG9yIHNldCBpbiByZWdpc3RlcmVkKCk7IG9uY2UgdGhlIHN0YXRpYyBnZXR0ZXIgcnVucywgYSBjbG9uZSBvZiBpdAogICAgICAgIC8vICAgICB3aWxsIG92ZXJ3cml0ZSBpdCBvbiB0aGUgcHJvdG90eXBlIGFzIHRoZSB3b3JraW5nIHRlbXBsYXRlLgogICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfdGVtcGxhdGUnLCB0aGlzKSkpIHsKICAgICAgICAgIHRoaXMuX3RlbXBsYXRlID0KICAgICAgICAgICAgLy8gSWYgdXNlciBoYXMgcHV0IHRlbXBsYXRlIG9uIHByb3RvdHlwZSAoZS5nLiBpbiBsZWdhY3kgdmlhIHJlZ2lzdGVyZWQKICAgICAgICAgICAgLy8gY2FsbGJhY2sgb3IgaW5mbyBvYmplY3QpLCBwcmVmZXIgdGhhdCBmaXJzdAogICAgICAgICAgICB0aGlzLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfdGVtcGxhdGUnLCB0aGlzLnByb3RvdHlwZSkpID8KICAgICAgICAgICAgdGhpcy5wcm90b3R5cGUuX3RlbXBsYXRlIDoKICAgICAgICAgICAgLy8gTG9vayBpbiBkb20tbW9kdWxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVsZW1lbnQncyBpcwogICAgICAgICAgICAoZ2V0VGVtcGxhdGVGcm9tRG9tTW9kdWxlKC8qKiBAdHlwZSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0qLyAodGhpcykuaXMpIHx8CiAgICAgICAgICAgIC8vIE5leHQgbG9vayBmb3Igc3VwZXJjbGFzcyB0ZW1wbGF0ZSAoY2FsbCB0aGUgc3VwZXIgaW1wbCB0aGlzCiAgICAgICAgICAgIC8vIHdheSBzbyB0aGF0IGB0aGlzYCBwb2ludHMgdG8gdGhlIHN1cGVyY2xhc3MpCiAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZigvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9Ki8gKHRoaXMpLnByb3RvdHlwZSkuY29uc3RydWN0b3IudGVtcGxhdGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTZXQgdGhlIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fHN0cmluZ30gdmFsdWUgVGVtcGxhdGUgdG8gc2V0LgogICAgICAgKi8KICAgICAgc3RhdGljIHNldCB0ZW1wbGF0ZSh2YWx1ZSkgewogICAgICAgIHRoaXMuX3RlbXBsYXRlID0gdmFsdWU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXRoIG1hdGNoaW5nIHRoZSB1cmwgZnJvbSB3aGljaCB0aGUgZWxlbWVudCB3YXMgaW1wb3J0ZWQuCiAgICAgICAqCiAgICAgICAqIFRoaXMgcGF0aCBpcyB1c2VkIHRvIHJlc29sdmUgdXJsJ3MgaW4gdGVtcGxhdGUgc3R5bGUgY3NzVGV4dC4KICAgICAgICogVGhlIGBpbXBvcnRQYXRoYCBwcm9wZXJ0eSBpcyBhbHNvIHNldCBvbiBlbGVtZW50IGluc3RhbmNlcyBhbmQgY2FuIGJlCiAgICAgICAqIHVzZWQgdG8gY3JlYXRlIGJpbmRpbmdzIHJlbGF0aXZlIHRvIHRoZSBpbXBvcnQgcGF0aC4KICAgICAgICoKICAgICAgICogRm9yIGVsZW1lbnRzIGRlZmluZWQgaW4gRVMgbW9kdWxlcywgdXNlcnMgc2hvdWxkIGltcGxlbWVudAogICAgICAgKiBgc3RhdGljIGdldCBpbXBvcnRNZXRhKCkgeyByZXR1cm4gaW1wb3J0Lm1ldGE7IH1gLCBhbmQgdGhlIGRlZmF1bHQKICAgICAgICogaW1wbGVtZW50YXRpb24gb2YgYGltcG9ydFBhdGhgIHdpbGwgIHJldHVybiBgaW1wb3J0Lm1ldGEudXJsYCdzIHBhdGguCiAgICAgICAqIEZvciBlbGVtZW50cyBkZWZpbmVkIGluIEhUTUwgaW1wb3J0cywgdGhpcyBnZXR0ZXIgd2lsbCByZXR1cm4gdGhlIHBhdGgKICAgICAgICogdG8gdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgYSBgZG9tLW1vZHVsZWAgZWxlbWVudCBtYXRjaGluZyB0aGlzCiAgICAgICAqIGVsZW1lbnQncyBzdGF0aWMgYGlzYCBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogTm90ZSwgdGhpcyBwYXRoIHNob3VsZCBjb250YWluIGEgdHJhaWxpbmcgYC9gLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbXBvcnQgcGF0aCBmb3IgdGhpcyBlbGVtZW50IGNsYXNzCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9CiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IGltcG9ydFBhdGgoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19pbXBvcnRQYXRoJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5pbXBvcnRNZXRhOwogICAgICAgICAgaWYgKG1ldGEpIHsKICAgICAgICAgICAgdGhpcy5faW1wb3J0UGF0aCA9IFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybChtZXRhLnVybCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBQb2x5bWVyLkRvbU1vZHVsZSAmJiBQb2x5bWVyLkRvbU1vZHVsZS5pbXBvcnQoLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSAqLyAodGhpcykuaXMpOwogICAgICAgICAgICB0aGlzLl9pbXBvcnRQYXRoID0gKG1vZHVsZSAmJiBtb2R1bGUuYXNzZXRwYXRoKSB8fAogICAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZigvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9Ki8gKHRoaXMpLnByb3RvdHlwZSkuY29uc3RydWN0b3IuaW1wb3J0UGF0aDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2ltcG9ydFBhdGg7CiAgICAgIH0KCiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50fSAqLwogICAgICAgIHRoaXMuX3RlbXBsYXRlOwogICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLwogICAgICAgIHRoaXMuX2ltcG9ydFBhdGg7CiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgdGhpcy5yb290UGF0aDsKICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgICB0aGlzLmltcG9ydFBhdGg7CiAgICAgICAgLyoqIEB0eXBlIHtTdGFtcGVkVGVtcGxhdGUgfCBIVE1MRWxlbWVudCB8IFNoYWRvd1Jvb3R9ICovCiAgICAgICAgdGhpcy5yb290OwogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdDxzdHJpbmcsICFFbGVtZW50Pn0gKi8KICAgICAgICB0aGlzLiQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgIHRvIGVuc3VyZSBjbGFzcwogICAgICAgKiBtZXRhcHJvZ3JhbW1pbmcgcmVsYXRlZCB0byBwcm9wZXJ0eSBhY2Nlc3NvcnMgYW5kIGVmZmVjdHMgaGFzCiAgICAgICAqIGNvbXBsZXRlZCAoY2FsbHMgYGZpbmFsaXplYCkuCiAgICAgICAqCiAgICAgICAqIEl0IGFsc28gaW5pdGlhbGl6ZXMgYW55IHByb3BlcnR5IGRlZmF1bHRzIHByb3ZpZGVkIHZpYSBgdmFsdWVgIGluCiAgICAgICAqIGBwcm9wZXJ0aWVzYCBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIHRoaXMuY29uc3RydWN0b3IuZmluYWxpemUoKTsKICAgICAgICAvLyBub3RlOiBmaW5hbGl6ZSB0ZW1wbGF0ZSB3aGVuIHdlIGhhdmUgYWNjZXNzIHRvIGBsb2NhbE5hbWVgIHRvCiAgICAgICAgLy8gYXZvaWQgZGVwZW5kZW5jZSBvbiBgaXNgIGZvciBwb2x5ZmlsbGluZyBzdHlsaW5nLgogICAgICAgIHRoaXMuY29uc3RydWN0b3IuX2ZpbmFsaXplVGVtcGxhdGUoLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKHRoaXMpLmxvY2FsTmFtZSk7CiAgICAgICAgc3VwZXIuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgICAgLy8gc2V0IHBhdGggZGVmYXVsdHMKICAgICAgICB0aGlzLnJvb3RQYXRoID0gUG9seW1lci5yb290UGF0aDsKICAgICAgICB0aGlzLmltcG9ydFBhdGggPSB0aGlzLmNvbnN0cnVjdG9yLmltcG9ydFBhdGg7CiAgICAgICAgLy8gYXBwbHkgcHJvcGVydHkgZGVmYXVsdHMuLi4KICAgICAgICBsZXQgcCQgPSBwcm9wZXJ0eURlZmF1bHRzKHRoaXMuY29uc3RydWN0b3IpOwogICAgICAgIGlmICghcCQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgcCBpbiBwJCkgewogICAgICAgICAgbGV0IGluZm8gPSBwJFtwXTsKICAgICAgICAgIC8vIERvbid0IHNldCBkZWZhdWx0IHZhbHVlIGlmIHRoZXJlIGlzIGFscmVhZHkgYW4gb3duIHByb3BlcnR5LCB3aGljaAogICAgICAgICAgLy8gaGFwcGVucyB3aGVuIGEgYHByb3BlcnRpZXNgIHByb3BlcnR5IHdpdGggZGVmYXVsdCBidXQgbm8gZWZmZWN0cyBoYWQKICAgICAgICAgIC8vIGEgcHJvcGVydHkgc2V0IChlLmcuIGJvdW5kKSBieSBpdHMgaG9zdCBiZWZvcmUgdXBncmFkZQogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KHApKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHR5cGVvZiBpbmZvLnZhbHVlID09ICdmdW5jdGlvbicgPwogICAgICAgICAgICAgIGluZm8udmFsdWUuY2FsbCh0aGlzKSA6CiAgICAgICAgICAgICAgaW5mby52YWx1ZTsKICAgICAgICAgICAgLy8gU2V0IHZpYSBgX3NldFByb3BlcnR5YCBpZiB0aGVyZSBpcyBhbiBhY2Nlc3NvciwgdG8gZW5hYmxlCiAgICAgICAgICAgIC8vIGluaXRpYWxpemluZyByZWFkT25seSBwcm9wZXJ0eSBkZWZhdWx0cwogICAgICAgICAgICBpZiAodGhpcy5faGFzQWNjZXNzb3IocCkpIHsKICAgICAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkocCwgdmFsdWUsIHRydWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXNbcF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEdhdGhlciBzdHlsZSB0ZXh0IGZvciBhIHN0eWxlIGVsZW1lbnQgaW4gdGhlIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY3NzVGV4dCBUZXh0IGNvbnRhaW5pbmcgc3R5bGluZyB0byBwcm9jZXNzCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlYmFzZSBDU1MgcGF0aHMgYWdhaW5zdAogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwcm9jZXNzZWQgQ1NTIHRleHQKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIF9wcm9jZXNzU3R5bGVUZXh0KGNzc1RleHQsIGJhc2VVUkkpIHsKICAgICAgICByZXR1cm4gUG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVDc3MoY3NzVGV4dCwgYmFzZVVSSSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAqIENvbmZpZ3VyZXMgYW4gZWxlbWVudCBgcHJvdG9gIHRvIGZ1bmN0aW9uIHdpdGggYSBnaXZlbiBgdGVtcGxhdGVgLgogICAgICAqIFRoZSBlbGVtZW50IG5hbWUgYGlzYCBhbmQgZXh0ZW5kcyBgZXh0YCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgU2hhZHlDU1MKICAgICAgKiBzdHlsZSBzY29waW5nLgogICAgICAqCiAgICAgICogQHBhcmFtIHtzdHJpbmd9IGlzIFRhZyBuYW1lIChvciB0eXBlIGV4dGVuc2lvbiBuYW1lKSBmb3IgdGhpcyBlbGVtZW50CiAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICovCiAgICAgIHN0YXRpYyBfZmluYWxpemVUZW1wbGF0ZShpcykgewogICAgICAgIC8qKiBAY29uc3Qge0hUTUxUZW1wbGF0ZUVsZW1lbnR9ICovCiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLnByb3RvdHlwZS5fdGVtcGxhdGU7CiAgICAgICAgaWYgKHRlbXBsYXRlICYmICF0ZW1wbGF0ZS5fX3BvbHltZXJGaW5hbGl6ZWQpIHsKICAgICAgICAgIHRlbXBsYXRlLl9fcG9seW1lckZpbmFsaXplZCA9IHRydWU7CiAgICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gdGhpcy5pbXBvcnRQYXRoOwogICAgICAgICAgY29uc3QgYmFzZVVSSSA9IGltcG9ydFBhdGggPyBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybChpbXBvcnRQYXRoKSA6ICcnOwogICAgICAgICAgLy8gZS5nLiBzdXBwb3J0IGBpbmNsdWRlPSJtb2R1bGUtbmFtZSJgLCBhbmQgU2hhZHlDU1MKICAgICAgICAgIHByb2Nlc3NFbGVtZW50U3R5bGVzKHRoaXMsIHRlbXBsYXRlLCBpcywgYmFzZVVSSSk7CiAgICAgICAgICB0aGlzLnByb3RvdHlwZS5fYmluZFRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN0YW5kYXJkIEN1c3RvbSBFbGVtZW50cwogICAgICAgKiBgY29ubmVjdGVkQ2FsbGJhY2tgLgogICAgICAgKgogICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBlbmFibGVzIHRoZSBwcm9wZXJ0eSBlZmZlY3RzIHN5c3RlbSBhbmQKICAgICAgICogZmx1c2hlcyBhbnkgcGVuZGluZyBwcm9wZXJ0aWVzLCBhbmQgdXBkYXRlcyBzaGltbWVkIENTUyBwcm9wZXJ0aWVzCiAgICAgICAqIHdoZW4gdXNpbmcgdGhlIFNoYWR5Q1NTIHNjb3BpbmcvY3VzdG9tIHByb3BlcnRpZXMgcG9seWZpbGwuCiAgICAgICAqCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXMsIGludmFsaWRDYXN0c30gU3VwZXIgbWF5IG9yIG1heSBub3QgaW1wbGVtZW50IHRoZSBjYWxsYmFjawogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUyAmJiB0aGlzLl90ZW1wbGF0ZSkgewogICAgICAgICAgd2luZG93LlNoYWR5Q1NTLnN0eWxlRWxlbWVudCgvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcykpOwogICAgICAgIH0KICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU3RhbXBzIHRoZSBlbGVtZW50IHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIHJlYWR5KCkgewogICAgICAgIGlmICh0aGlzLl90ZW1wbGF0ZSkgewogICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5fc3RhbXBUZW1wbGF0ZSh0aGlzLl90ZW1wbGF0ZSk7CiAgICAgICAgICB0aGlzLiQgPSB0aGlzLnJvb3QuJDsKICAgICAgICB9CiAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgYFByb3BlcnR5RWZmZWN0c2AncyBgX3JlYWR5Q2xpZW50c2AgY2FsbC4gQXR0YWNoZXMKICAgICAgICogZWxlbWVudCBkb20gYnkgY2FsbGluZyBgX2F0dGFjaERvbWAgd2l0aCB0aGUgZG9tIHN0YW1wZWQgZnJvbSB0aGUKICAgICAgICogZWxlbWVudCdzIHRlbXBsYXRlIHZpYSBgX3N0YW1wVGVtcGxhdGVgLiBOb3RlIHRoYXQgdGhpcyBhbGxvd3MKICAgICAgICogY2xpZW50IGRvbSB0byBiZSBhdHRhY2hlZCB0byB0aGUgZWxlbWVudCBwcmlvciB0byBhbnkgb2JzZXJ2ZXJzCiAgICAgICAqIHJ1bm5pbmcuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgX3JlYWR5Q2xpZW50cygpIHsKICAgICAgICBpZiAodGhpcy5fdGVtcGxhdGUpIHsKICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMuX2F0dGFjaERvbSgvKiogQHR5cGUge1N0YW1wZWRUZW1wbGF0ZX0gKi8odGhpcy5yb290KSk7CiAgICAgICAgfQogICAgICAgIC8vIFRoZSBzdXBlci5fcmVhZHlDbGllbnRzIGhlcmUgc2V0cyB0aGUgY2xpZW50cyBpbml0aWFsaXplZCBmbGFnLgogICAgICAgIC8vIFdlIG11c3Qgd2FpdCB0byBkbyB0aGlzIHVudGlsIGFmdGVyIGNsaWVudCBkb20gaXMgY3JlYXRlZC9hdHRhY2hlZAogICAgICAgIC8vIHNvIHRoYXQgdGhpcyBmbGFnIGNhbiBiZSBjaGVja2VkIHRvIHByZXZlbnQgbm90aWZpY2F0aW9ucyBmaXJlZAogICAgICAgIC8vIGR1cmluZyB0aGlzIHByb2Nlc3MgZnJvbSBiZWluZyBoYW5kbGVkIGJlZm9yZSBjbGllbnRzIGFyZSByZWFkeS4KICAgICAgICBzdXBlci5fcmVhZHlDbGllbnRzKCk7CiAgICAgIH0KCgogICAgICAvKioKICAgICAgICogQXR0YWNoZXMgYW4gZWxlbWVudCdzIHN0YW1wZWQgZG9tIHRvIGl0c2VsZi4gQnkgZGVmYXVsdCwKICAgICAgICogdGhpcyBtZXRob2QgY3JlYXRlcyBhIGBzaGFkb3dSb290YCBhbmQgYWRkcyB0aGUgZG9tIHRvIGl0LgogICAgICAgKiBIb3dldmVyLCB0aGlzIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbiB0byBhbGxvdyBhbiBlbGVtZW50CiAgICAgICAqIHRvIHB1dCBpdHMgZG9tIGluIGFub3RoZXIgbG9jYXRpb24uCiAgICAgICAqCiAgICAgICAqIEB0aHJvd3Mge0Vycm9yfQogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdSZXR1cm59CiAgICAgICAqIEBwYXJhbSB7U3RhbXBlZFRlbXBsYXRlfSBkb20gdG8gYXR0YWNoIHRvIHRoZSBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHtTaGFkb3dSb290fSBub2RlIHRvIHdoaWNoIHRoZSBkb20gaGFzIGJlZW4gYXR0YWNoZWQuCiAgICAgICAqLwogICAgICBfYXR0YWNoRG9tKGRvbSkgewogICAgICAgIGlmICh0aGlzLmF0dGFjaFNoYWRvdykgewogICAgICAgICAgaWYgKGRvbSkgewogICAgICAgICAgICBpZiAoIXRoaXMuc2hhZG93Um9vdCkgewogICAgICAgICAgICAgIHRoaXMuYXR0YWNoU2hhZG93KHttb2RlOiAnb3Blbid9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoZG9tKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NoYWRvd0RPTSBub3QgYXZhaWxhYmxlLiAnICsKICAgICAgICAgICAgLy8gVE9ETyhzb3J2ZWxsKTogbW92ZSB0byBjb21waWxlLXRpbWUgY29uZGl0aW9uYWwgd2hlbiBzdXBwb3J0ZWQKICAgICAgICAgICdQb2x5bWVyLkVsZW1lbnQgY2FuIGNyZWF0ZSBkb20gYXMgY2hpbGRyZW4gaW5zdGVhZCBvZiBpbiAnICsKICAgICAgICAgICdTaGFkb3dET00gYnkgc2V0dGluZyBgdGhpcy5yb290ID0gdGhpcztcYCBiZWZvcmUgXGByZWFkeVxgLicpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFdoZW4gdXNpbmcgdGhlIFNoYWR5Q1NTIHNjb3BpbmcgYW5kIGN1c3RvbSBwcm9wZXJ0eSBzaGltLCBjYXVzZXMgYWxsCiAgICAgICAqIHNoaW1tZWQgc3R5bGVzIGluIHRoaXMgZWxlbWVudCAoYW5kIGl0cyBzdWJ0cmVlKSB0byBiZSB1cGRhdGVkCiAgICAgICAqIGJhc2VkIG9uIGN1cnJlbnQgY3VzdG9tIHByb3BlcnR5IHZhbHVlcy4KICAgICAgICoKICAgICAgICogVGhlIG9wdGlvbmFsIHBhcmFtZXRlciBvdmVycmlkZXMgaW5saW5lIGN1c3RvbSBwcm9wZXJ0eSBzdHlsZXMgd2l0aCBhbgogICAgICAgKiBvYmplY3Qgb2YgcHJvcGVydGllcyB3aGVyZSB0aGUga2V5cyBhcmUgQ1NTIHByb3BlcnRpZXMsIGFuZCB0aGUgdmFsdWVzCiAgICAgICAqIGFyZSBzdHJpbmdzLgogICAgICAgKgogICAgICAgKiBFeGFtcGxlOiBgdGhpcy51cGRhdGVTdHlsZXMoeyctLWNvbG9yJzogJ2JsdWUnfSlgCiAgICAgICAqCiAgICAgICAqIFRoZXNlIHByb3BlcnRpZXMgYXJlIHJldGFpbmVkIHVubGVzcyBhIHZhbHVlIG9mIGBudWxsYCBpcyBzZXQuCiAgICAgICAqCiAgICAgICAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCB1cGRhdGluZyBDU1MgbWl4aW5zLgogICAgICAgKiBZb3UgY2FuIG5vdCBkeW5hbWljYWxseSBjaGFuZ2UgdGhlIHZhbHVlIG9mIGFuIGBAYXBwbHlgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BlcnRpZXMgQmFnIG9mIGN1c3RvbSBwcm9wZXJ0eSBrZXkvdmFsdWVzIHRvCiAgICAgICAqICAgYXBwbHkgdG8gdGhpcyBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAgICovCiAgICAgIHVwZGF0ZVN0eWxlcyhwcm9wZXJ0aWVzKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUykgewogICAgICAgICAgd2luZG93LlNoYWR5Q1NTLnN0eWxlU3VidHJlZSgvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcyksIHByb3BlcnRpZXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJld3JpdGVzIGEgZ2l2ZW4gVVJMIHJlbGF0aXZlIHRvIGEgYmFzZSBVUkwuIFRoZSBiYXNlIFVSTCBkZWZhdWx0cyB0bwogICAgICAgKiB0aGUgb3JpZ2luYWwgbG9jYXRpb24gb2YgdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhlIGBkb20tbW9kdWxlYCBmb3IKICAgICAgICogdGhpcyBlbGVtZW50LiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgc2FtZSBVUkwgYmVmb3JlIGFuZCBhZnRlcgogICAgICAgKiBidW5kbGluZy4KICAgICAgICoKICAgICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbm8gcmVzb2x1dGlvbiBmb3IgVVJMcyB0aGF0IHN0YXJ0CiAgICAgICAqIHdpdGggYC9gIChhYnNvbHV0ZSBVUkxzKSBvciBgI2AgKGhhc2ggaWRlbnRpZmllcnMpLiAgRm9yIGdlbmVyYWwgcHVycG9zZQogICAgICAgKiBVUkwgcmVzb2x1dGlvbiwgdXNlIGB3aW5kb3cuVVJMYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgdG8gcmVzb2x2ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBiYXNlIE9wdGlvbmFsIGJhc2UgVVJMIHRvIHJlc29sdmUgYWdhaW5zdCwgZGVmYXVsdHMKICAgICAgICogdG8gdGhlIGVsZW1lbnQncyBgaW1wb3J0UGF0aGAKICAgICAgICogQHJldHVybiB7c3RyaW5nfSBSZXdyaXR0ZW4gVVJMIHJlbGF0aXZlIHRvIGJhc2UKICAgICAgICovCiAgICAgIHJlc29sdmVVcmwodXJsLCBiYXNlKSB7CiAgICAgICAgaWYgKCFiYXNlICYmIHRoaXMuaW1wb3J0UGF0aCkgewogICAgICAgICAgYmFzZSA9IFBvbHltZXIuUmVzb2x2ZVVybC5yZXNvbHZlVXJsKHRoaXMuaW1wb3J0UGF0aCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybCh1cmwsIGJhc2UpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQcm9wZXJ0eUFjY2Vzc29yc2AgdG8gYWRkIG1hcCBvZiBkeW5hbWljIGZ1bmN0aW9ucyBvbgogICAgICAgKiB0ZW1wbGF0ZSBpbmZvLCBmb3IgY29uc3VtcHRpb24gYnkgYFByb3BlcnR5RWZmZWN0c2AgdGVtcGxhdGUgYmluZGluZwogICAgICAgKiBjb2RlLiBUaGlzIG1hcCBkZXRlcm1pbmVzIHdoaWNoIG1ldGhvZCB0ZW1wbGF0ZXMgc2hvdWxkIGhhdmUgYWNjZXNzb3JzCiAgICAgICAqIGNyZWF0ZWQgZm9yIHRoZW0uCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNvbnRlbnQodGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICB0ZW1wbGF0ZUluZm8uZHluYW1pY0ZucyA9IHRlbXBsYXRlSW5mby5keW5hbWljRm5zIHx8IHRoaXMuX3Byb3BlcnRpZXM7CiAgICAgICAgcmV0dXJuIHN1cGVyLl9wYXJzZVRlbXBsYXRlQ29udGVudCh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbyk7CiAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIFBvbHltZXJFbGVtZW50OwogIH0pOwoKICAvKioKICAgKiBXaGVuIHVzaW5nIHRoZSBTaGFkeUNTUyBzY29waW5nIGFuZCBjdXN0b20gcHJvcGVydHkgc2hpbSwgY2F1c2VzIGFsbAogICAqIHNoaW1tZWQgYHN0eWxlc2AgKHZpYSBgY3VzdG9tLXN0eWxlYCkgaW4gdGhlIGRvY3VtZW50IChhbmQgaXRzIHN1YnRyZWUpCiAgICogdG8gYmUgdXBkYXRlZCBiYXNlZCBvbiBjdXJyZW50IGN1c3RvbSBwcm9wZXJ0eSB2YWx1ZXMuCiAgICoKICAgKiBUaGUgb3B0aW9uYWwgcGFyYW1ldGVyIG92ZXJyaWRlcyBpbmxpbmUgY3VzdG9tIHByb3BlcnR5IHN0eWxlcyB3aXRoIGFuCiAgICogb2JqZWN0IG9mIHByb3BlcnRpZXMgd2hlcmUgdGhlIGtleXMgYXJlIENTUyBwcm9wZXJ0aWVzLCBhbmQgdGhlIHZhbHVlcwogICAqIGFyZSBzdHJpbmdzLgogICAqCiAgICogRXhhbXBsZTogYFBvbHltZXIudXBkYXRlU3R5bGVzKHsnLS1jb2xvcic6ICdibHVlJ30pYAogICAqCiAgICogVGhlc2UgcHJvcGVydGllcyBhcmUgcmV0YWluZWQgdW5sZXNzIGEgdmFsdWUgb2YgYG51bGxgIGlzIHNldC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0PX0gcHJvcHMgQmFnIG9mIGN1c3RvbSBwcm9wZXJ0eSBrZXkvdmFsdWVzIHRvCiAgICogICBhcHBseSB0byB0aGUgZG9jdW1lbnQuCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnVwZGF0ZVN0eWxlcyA9IGZ1bmN0aW9uKHByb3BzKSB7CiAgICBpZiAod2luZG93LlNoYWR5Q1NTKSB7CiAgICAgIHdpbmRvdy5TaGFkeUNTUy5zdHlsZURvY3VtZW50KHByb3BzKTsKICAgIH0KICB9OwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBAc3VtbWFyeSBDb2xsYXBzZSBtdWx0aXBsZSBjYWxsYmFja3MgaW50byBvbmUgaW52b2NhdGlvbiBhZnRlciBhIHRpbWVyLgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgY2xhc3MgRGVib3VuY2VyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICB0aGlzLl9hc3luY01vZHVsZSA9IG51bGw7CiAgICAgIHRoaXMuX2NhbGxiYWNrID0gbnVsbDsKICAgICAgdGhpcy5fdGltZXIgPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBzY2hlZHVsZXI7IHRoYXQgaXMsIGEgbW9kdWxlIHdpdGggdGhlIEFzeW5jIGludGVyZmFjZSwKICAgICAqIGEgY2FsbGJhY2sgYW5kIG9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIHJ1biBmdW5jdGlvbgogICAgICogZnJvbSB0aGUgYXN5bmMgbW9kdWxlLgogICAgICoKICAgICAqIEBwYXJhbSB7IUFzeW5jSW50ZXJmYWNlfSBhc3luY01vZHVsZSBPYmplY3Qgd2l0aCBBc3luYyBpbnRlcmZhY2UuCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIENhbGxiYWNrIHRvIHJ1bi4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHNldENvbmZpZyhhc3luY01vZHVsZSwgY2FsbGJhY2spIHsKICAgICAgdGhpcy5fYXN5bmNNb2R1bGUgPSBhc3luY01vZHVsZTsKICAgICAgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICAgdGhpcy5fdGltZXIgPSB0aGlzLl9hc3luY01vZHVsZS5ydW4oKCkgPT4gewogICAgICAgIHRoaXMuX3RpbWVyID0gbnVsbDsKICAgICAgICB0aGlzLl9jYWxsYmFjaygpOwogICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQ2FuY2VscyBhbiBhY3RpdmUgZGVib3VuY2VyIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGl0c2VsZi4KICAgICAqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBjYW5jZWwoKSB7CiAgICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHsKICAgICAgICB0aGlzLl9hc3luY01vZHVsZS5jYW5jZWwodGhpcy5fdGltZXIpOwogICAgICAgIHRoaXMuX3RpbWVyID0gbnVsbDsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBGbHVzaGVzIGFuIGFjdGl2ZSBkZWJvdW5jZXIgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gaXRzZWxmLgogICAgICoKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGZsdXNoKCkgewogICAgICBpZiAodGhpcy5pc0FjdGl2ZSgpKSB7CiAgICAgICAgdGhpcy5jYW5jZWwoKTsKICAgICAgICB0aGlzLl9jYWxsYmFjaygpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVib3VuY2VyIGlzIGFjdGl2ZS4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFjdGl2ZS4KICAgICAqLwogICAgaXNBY3RpdmUoKSB7CiAgICAgIHJldHVybiB0aGlzLl90aW1lciAhPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgZGVib3VuY2VyIGlmIG5vIGRlYm91bmNlciBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIKICAgICAqIG9yIGl0IGNhbmNlbHMgYW4gYWN0aXZlIGRlYm91bmNlciBvdGhlcndpc2UuIFRoZSBmb2xsb3dpbmcKICAgICAqIGV4YW1wbGUgc2hvd3MgaG93IGEgZGVib3VuY2VyIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIGEKICAgICAqIG1pY3JvdGFzayBhbmQgImRlYm91bmNlZCIgc3VjaCB0aGF0IHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiBpcwogICAgICogY2FsbGVkIG9uY2UuIEFkZCB0aGlzIG1ldGhvZCB0byBhIGN1c3RvbSBlbGVtZW50OgogICAgICoKICAgICAqIF9kZWJvdW5jZVdvcmsoKSB7CiAgICAgKiAgIHRoaXMuX2RlYm91bmNlSm9iID0gUG9seW1lci5EZWJvdW5jZXIuZGVib3VuY2UodGhpcy5fZGVib3VuY2VKb2IsCiAgICAgKiAgICAgICBQb2x5bWVyLkFzeW5jLm1pY3JvVGFzaywgKCkgPT4gewogICAgICogICAgIHRoaXMuX2RvV29yaygpOwogICAgICogICB9KTsKICAgICAqIH0KICAgICAqCiAgICAgKiBJZiB0aGUgYF9kZWJvdW5jZVdvcmtgIG1ldGhvZCBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lCiAgICAgKiBtaWNyb3Rhc2ssIHRoZSBgX2RvV29ya2AgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlIGF0IHRoZSBuZXh0CiAgICAgKiBtaWNyb3Rhc2sgY2hlY2twb2ludC4KICAgICAqCiAgICAgKiBOb3RlOiBJbiB0ZXN0aW5nIGl0IGlzIG9mdGVuIGNvbnZlbmllbnQgdG8gYXZvaWQgYXN5bmNocm9ueS4gVG8gYWNjb21wbGlzaAogICAgICogdGhpcyB3aXRoIGEgZGVib3VuY2VyLCB5b3UgY2FuIHVzZSBgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyYCBhbmQKICAgICAqIGBQb2x5bWVyLmZsdXNoYC4gRm9yIGV4YW1wbGUsIGV4dGVuZCB0aGUgYWJvdmUgZXhhbXBsZSBieSBhZGRpbmcKICAgICAqIGBQb2x5bWVyLmVucXVldWVEZWJvdW5jZXIodGhpcy5fZGVib3VuY2VKb2IpYCBhdCB0aGUgZW5kIG9mIHRoZQogICAgICogYF9kZWJvdW5jZVdvcmtgIG1ldGhvZC4gVGhlbiBpbiBhIHRlc3QsIGNhbGwgYFBvbHltZXIuZmx1c2hgIHRvIGVuc3VyZQogICAgICogdGhlIGRlYm91bmNlciBoYXMgY29tcGxldGVkLgogICAgICoKICAgICAqIEBwYXJhbSB7RGVib3VuY2VyP30gZGVib3VuY2VyIERlYm91bmNlciBvYmplY3QuCiAgICAgKiBAcGFyYW0geyFBc3luY0ludGVyZmFjZX0gYXN5bmNNb2R1bGUgT2JqZWN0IHdpdGggQXN5bmMgaW50ZXJmYWNlCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIENhbGxiYWNrIHRvIHJ1bi4KICAgICAqIEByZXR1cm4geyFEZWJvdW5jZXJ9IFJldHVybnMgYSBkZWJvdW5jZXIgb2JqZWN0LgogICAgICovCiAgICBzdGF0aWMgZGVib3VuY2UoZGVib3VuY2VyLCBhc3luY01vZHVsZSwgY2FsbGJhY2spIHsKICAgICAgaWYgKGRlYm91bmNlciBpbnN0YW5jZW9mIERlYm91bmNlcikgewogICAgICAgIGRlYm91bmNlci5jYW5jZWwoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkZWJvdW5jZXIgPSBuZXcgRGVib3VuY2VyKCk7CiAgICAgIH0KICAgICAgZGVib3VuY2VyLnNldENvbmZpZyhhc3luY01vZHVsZSwgY2FsbGJhY2spOwogICAgICByZXR1cm4gZGVib3VuY2VyOwogICAgfQogIH0KCiAgLyoqIEBjb25zdCAqLwogIFBvbHltZXIuRGVib3VuY2VyID0gRGVib3VuY2VyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvLyBkZXRlY3QgbmF0aXZlIHRvdWNoIGFjdGlvbiBzdXBwb3J0CiAgbGV0IEhBU19OQVRJVkVfVEEgPSB0eXBlb2YgZG9jdW1lbnQuaGVhZC5zdHlsZS50b3VjaEFjdGlvbiA9PT0gJ3N0cmluZyc7CiAgbGV0IEdFU1RVUkVfS0VZID0gJ19fcG9seW1lckdlc3R1cmVzJzsKICBsZXQgSEFORExFRF9PQkogPSAnX19wb2x5bWVyR2VzdHVyZXNIYW5kbGVkJzsKICBsZXQgVE9VQ0hfQUNUSU9OID0gJ19fcG9seW1lckdlc3R1cmVzVG91Y2hBY3Rpb24nOwogIC8vIHJhZGl1cyBmb3IgdGFwIGFuZCB0cmFjawogIGxldCBUQVBfRElTVEFOQ0UgPSAyNTsKICBsZXQgVFJBQ0tfRElTVEFOQ0UgPSA1OwogIC8vIG51bWJlciBvZiBsYXN0IE4gdHJhY2sgcG9zaXRpb25zIHRvIGtlZXAKICBsZXQgVFJBQ0tfTEVOR1RIID0gMjsKCiAgLy8gRGlzYWJsaW5nICJtb3VzZSIgaGFuZGxlcnMgZm9yIDI1MDBtcyBpcyBlbm91Z2gKICBsZXQgTU9VU0VfVElNRU9VVCA9IDI1MDA7CiAgbGV0IE1PVVNFX0VWRU5UUyA9IFsnbW91c2Vkb3duJywgJ21vdXNlbW92ZScsICdtb3VzZXVwJywgJ2NsaWNrJ107CiAgLy8gYW4gYXJyYXkgb2YgYml0bWFzayB2YWx1ZXMgZm9yIG1hcHBpbmcgTW91c2VFdmVudC53aGljaCB0byBNb3VzZUV2ZW50LmJ1dHRvbnMKICBsZXQgTU9VU0VfV0hJQ0hfVE9fQlVUVE9OUyA9IFswLCAxLCA0LCAyXTsKICBsZXQgTU9VU0VfSEFTX0JVVFRPTlMgPSAoZnVuY3Rpb24oKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gbmV3IE1vdXNlRXZlbnQoJ3Rlc3QnLCB7YnV0dG9uczogMX0pLmJ1dHRvbnMgPT09IDE7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9KSgpOwoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBQb3NzaWJsZSBtb3VzZSBldmVudCBuYW1lCiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBtb3VzZSBldmVudCwgZmFsc2UgaWYgbm90CiAgICovCiAgZnVuY3Rpb24gaXNNb3VzZUV2ZW50KG5hbWUpIHsKICAgIHJldHVybiBNT1VTRV9FVkVOVFMuaW5kZXhPZihuYW1lKSA+IC0xOwogIH0KCiAgLyogZXNsaW50IG5vLWVtcHR5OiBbImVycm9yIiwgeyAiYWxsb3dFbXB0eUNhdGNoIjogdHJ1ZSB9XSAqLwogIC8vIGNoZWNrIGZvciBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycwogIGxldCBTVVBQT1JUU19QQVNTSVZFID0gZmFsc2U7CiAgKGZ1bmN0aW9uKCkgewogICAgdHJ5IHsKICAgICAgbGV0IG9wdHMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywge2dldCgpIHtTVVBQT1JUU19QQVNTSVZFID0gdHJ1ZTt9fSk7CiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7CiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7CiAgICB9IGNhdGNoKGUpIHt9CiAgfSkoKTsKCiAgLyoqCiAgICogR2VuZXJhdGUgc2V0dGluZ3MgZm9yIGV2ZW50IGxpc3RlbmVycywgZGVwZW5kYW50IG9uIGBQb2x5bWVyLnBhc3NpdmVUb3VjaEdlc3R1cmVzYAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBFdmVudCBuYW1lIHRvIGRldGVybWluZSBpZiBge3Bhc3NpdmV9YCBvcHRpb24gaXMgbmVlZGVkCiAgICogQHJldHVybiB7e3Bhc3NpdmU6IGJvb2xlYW59IHwgdW5kZWZpbmVkfSBPcHRpb25zIHRvIHVzZSBmb3IgYWRkRXZlbnRMaXN0ZW5lciBhbmQgcmVtb3ZlRXZlbnRMaXN0ZW5lcgogICAqLwogIGZ1bmN0aW9uIFBBU1NJVkVfVE9VQ0goZXZlbnROYW1lKSB7CiAgICBpZiAoaXNNb3VzZUV2ZW50KGV2ZW50TmFtZSkgfHwgZXZlbnROYW1lID09PSAndG91Y2hlbmQnKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChIQVNfTkFUSVZFX1RBICYmIFNVUFBPUlRTX1BBU1NJVkUgJiYgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcykgewogICAgICByZXR1cm4ge3Bhc3NpdmU6IHRydWV9OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuOwogICAgfQogIH0KCiAgLy8gQ2hlY2sgZm9yIHRvdWNoLW9ubHkgZGV2aWNlcwogIGxldCBJU19UT1VDSF9PTkxZID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpbb2FdZHxob25lKXxBbmRyb2lkLyk7CgogIGxldCBHZXN0dXJlUmVjb2duaXplciA9IGZ1bmN0aW9uKCl7fTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogIC8qKiBAdHlwZSB7ZnVuY3Rpb24oKTogdm9pZH0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUucmVzZXQ7CiAgLyoqIEB0eXBlIHtmdW5jdGlvbihNb3VzZUV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZH0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2Vkb3duOwogIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKE1vdXNlRXZlbnQpOiB2b2lkIHwgdW5kZWZpbmVkKX0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2Vtb3ZlOwogIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKE1vdXNlRXZlbnQpOiB2b2lkIHwgdW5kZWZpbmVkKX0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2V1cDsKICAvKiogQHR5cGUgeyhmdW5jdGlvbihUb3VjaEV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZCl9ICovCiAgR2VzdHVyZVJlY29nbml6ZXIucHJvdG90eXBlLnRvdWNoc3RhcnQ7CiAgLyoqIEB0eXBlIHsoZnVuY3Rpb24oVG91Y2hFdmVudCk6IHZvaWQgfCB1bmRlZmluZWQpfSAqLwogIEdlc3R1cmVSZWNvZ25pemVyLnByb3RvdHlwZS50b3VjaG1vdmU7CiAgLyoqIEB0eXBlIHsoZnVuY3Rpb24oVG91Y2hFdmVudCk6IHZvaWQgfCB1bmRlZmluZWQpfSAqLwogIEdlc3R1cmVSZWNvZ25pemVyLnByb3RvdHlwZS50b3VjaGVuZDsKICAvKiogQHR5cGUgeyhmdW5jdGlvbihNb3VzZUV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZCl9ICovCiAgR2VzdHVyZVJlY29nbml6ZXIucHJvdG90eXBlLmNsaWNrOwoKICAvLyBrZWVwIHRyYWNrIG9mIGFueSBsYWJlbHMgaGl0IGJ5IHRoZSBtb3VzZUNhbmNlbGxlcgogIC8qKiBAdHlwZSB7IUFycmF5PCFIVE1MTGFiZWxFbGVtZW50Pn0gKi8KICBjb25zdCBjbGlja2VkTGFiZWxzID0gW107CgogIC8qKiBAdHlwZSB7IU9iamVjdDxib29sZWFuPn0gKi8KICBjb25zdCBsYWJlbGxhYmxlID0gewogICAgJ2J1dHRvbic6IHRydWUsCiAgICAnaW5wdXQnOiB0cnVlLAogICAgJ2tleWdlbic6IHRydWUsCiAgICAnbWV0ZXInOiB0cnVlLAogICAgJ291dHB1dCc6IHRydWUsCiAgICAndGV4dGFyZWEnOiB0cnVlLAogICAgJ3Byb2dyZXNzJzogdHJ1ZSwKICAgICdzZWxlY3QnOiB0cnVlCiAgfTsKCiAgLy8gRGVmaW5lZCBhdCBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3JtLWNvbnRyb2wtaW5mcmFzdHJ1Y3R1cmUuaHRtbCNlbmFibGluZy1hbmQtZGlzYWJsaW5nLWZvcm0tY29udHJvbHM6LXRoZS1kaXNhYmxlZC1hdHRyaWJ1dGUKICAvKiogQHR5cGUgeyFPYmplY3Q8Ym9vbGVhbj59ICovCiAgY29uc3QgY2FuQmVEaXNhYmxlZCA9IHsKICAgICdidXR0b24nOiB0cnVlLAogICAgJ2NvbW1hbmQnOiB0cnVlLAogICAgJ2ZpZWxkc2V0JzogdHJ1ZSwKICAgICdpbnB1dCc6IHRydWUsCiAgICAna2V5Z2VuJzogdHJ1ZSwKICAgICdvcHRncm91cCc6IHRydWUsCiAgICAnb3B0aW9uJzogdHJ1ZSwKICAgICdzZWxlY3QnOiB0cnVlLAogICAgJ3RleHRhcmVhJzogdHJ1ZQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEVsZW1lbnQgdG8gY2hlY2sgbGFiZWxsaW5nIHN0YXR1cwogICAqIEByZXR1cm4ge2Jvb2xlYW59IGVsZW1lbnQgY2FuIGhhdmUgbGFiZWxzCiAgICovCiAgZnVuY3Rpb24gY2FuQmVMYWJlbGxlZChlbCkgewogICAgcmV0dXJuIGxhYmVsbGFibGVbZWwubG9jYWxOYW1lXSB8fCBmYWxzZTsKICB9CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEVsZW1lbnQgdGhhdCBtYXkgYmUgbGFiZWxsZWQuCiAgICogQHJldHVybiB7IUFycmF5PCFIVE1MTGFiZWxFbGVtZW50Pn0gUmVsZXZhbnQgbGFiZWwgZm9yIGBlbGAKICAgKi8KICBmdW5jdGlvbiBtYXRjaGluZ0xhYmVscyhlbCkgewogICAgbGV0IGxhYmVscyA9IEFycmF5LmZyb20oLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fSAqLyhlbCkubGFiZWxzIHx8IFtdKTsKICAgIC8vIElFIGRvZXNuJ3QgaGF2ZSBgbGFiZWxzYCBhbmQgU2FmYXJpIGRvZXNuJ3QgcG9wdWxhdGUgYGxhYmVsc2AKICAgIC8vIGlmIGVsZW1lbnQgaXMgaW4gYSBzaGFkb3dyb290LgogICAgLy8gSW4gdGhpcyBpbnN0YW5jZSwgZmluZGluZyB0aGUgbm9uLWFuY2VzdG9yIGxhYmVscyBpcyBlbm91Z2gsCiAgICAvLyBhcyB0aGUgbW91c2VDYW5jZWxsb3IgY29kZSB3aWxsIGhhbmRsZSBhbmNzdG9yIGxhYmVscwogICAgaWYgKCFsYWJlbHMubGVuZ3RoKSB7CiAgICAgIGxhYmVscyA9IFtdOwogICAgICBsZXQgcm9vdCA9IGVsLmdldFJvb3ROb2RlKCk7CiAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGlkIG9uIGBlbGAsIGNoZWNrIGZvciBhbGwgbGFiZWxzIHdpdGggYSBtYXRjaGluZyBgZm9yYCBhdHRyaWJ1dGUKICAgICAgaWYgKGVsLmlkKSB7CiAgICAgICAgbGV0IG1hdGNoaW5nID0gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKGBsYWJlbFtmb3IgPSAke2VsLmlkfV1gKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoaW5nLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsYWJlbHMucHVzaCgvKiogQHR5cGUgeyFIVE1MTGFiZWxFbGVtZW50fSAqLyhtYXRjaGluZ1tpXSkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGxhYmVsczsKICB9CgogIC8vIHRvdWNoIHdpbGwgbWFrZSBzeW50aGV0aWMgbW91c2UgZXZlbnRzCiAgLy8gYHByZXZlbnREZWZhdWx0YCBvbiB0b3VjaGVuZCB3aWxsIGNhbmNlbCB0aGVtLAogIC8vIGJ1dCB0aGlzIGJyZWFrcyBgPGlucHV0PmAgZm9jdXMgYW5kIGxpbmsgY2xpY2tzCiAgLy8gZGlzYWJsZSBtb3VzZSBoYW5kbGVycyBmb3IgTU9VU0VfVElNRU9VVCBtcyBhZnRlcgogIC8vIGEgdG91Y2hlbmQgdG8gaWdub3JlIHN5bnRoZXRpYyBtb3VzZSBldmVudHMKICBsZXQgbW91c2VDYW5jZWxsZXIgPSBmdW5jdGlvbihtb3VzZUV2ZW50KSB7CiAgICAvLyBDaGVjayBmb3Igc291cmNlQ2FwYWJpbGl0aWVzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIHN5bnRoZXRpYyBldmVudHMKICAgIC8vIGlmIG1vdXNlRXZlbnQgZGlkIG5vdCBjb21lIGZyb20gYSBkZXZpY2UgdGhhdCBmaXJlcyB0b3VjaCBldmVudHMsCiAgICAvLyBpdCB3YXMgbWFkZSBieSBhIHJlYWwgbW91c2UgYW5kIHNob3VsZCBiZSBjb3VudGVkCiAgICAvLyBodHRwOi8vd2ljZy5naXRodWIuaW8vSW5wdXREZXZpY2VDYXBhYmlsaXRpZXMvI2RvbS1pbnB1dGRldmljZWNhcGFiaWxpdGllcy1maXJlc3RvdWNoZXZlbnRzCiAgICBsZXQgc2MgPSBtb3VzZUV2ZW50LnNvdXJjZUNhcGFiaWxpdGllczsKICAgIGlmIChzYyAmJiAhc2MuZmlyZXNUb3VjaEV2ZW50cykgewogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBza2lwIHN5bnRoZXRpYyBtb3VzZSBldmVudHMKICAgIG1vdXNlRXZlbnRbSEFORExFRF9PQkpdID0ge3NraXA6IHRydWV9OwogICAgLy8gZGlzYWJsZSAiZ2hvc3QgY2xpY2tzIgogICAgaWYgKG1vdXNlRXZlbnQudHlwZSA9PT0gJ2NsaWNrJykgewogICAgICBsZXQgY2xpY2tGcm9tTGFiZWwgPSBmYWxzZTsKICAgICAgbGV0IHBhdGggPSBtb3VzZUV2ZW50LmNvbXBvc2VkUGF0aCAmJiBtb3VzZUV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgICBpZiAocGF0aCkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKHBhdGhbaV0ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAgICAgICAgICAgIGlmIChwYXRoW2ldLmxvY2FsTmFtZSA9PT0gJ2xhYmVsJykgewogICAgICAgICAgICAgIGNsaWNrZWRMYWJlbHMucHVzaChwYXRoW2ldKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjYW5CZUxhYmVsbGVkKHBhdGhbaV0pKSB7CiAgICAgICAgICAgICAgbGV0IG93bmVyTGFiZWxzID0gbWF0Y2hpbmdMYWJlbHMocGF0aFtpXSk7CiAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9mIHRoZSBjbGlja2VkIGxhYmVscyBpcyBsYWJlbGxpbmcgdGhpcyBlbGVtZW50CiAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvd25lckxhYmVscy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgY2xpY2tGcm9tTGFiZWwgPSBjbGlja0Zyb21MYWJlbCB8fCBjbGlja2VkTGFiZWxzLmluZGV4T2Yob3duZXJMYWJlbHNbal0pID4gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocGF0aFtpXSA9PT0gUE9JTlRFUlNUQVRFLm1vdXNlLnRhcmdldCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIGlmIG9uZSBvZiB0aGUgY2xpY2tlZCBsYWJlbHMgd2FzIGxhYmVsbGluZyB0aGUgdGFyZ2V0IGVsZW1lbnQsCiAgICAgIC8vIHRoaXMgaXMgbm90IGEgZ2hvc3QgY2xpY2sKICAgICAgaWYgKGNsaWNrRnJvbUxhYmVsKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIG1vdXNlRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgbW91c2VFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzZXR1cCBUcnVlIHRvIGFkZCwgZmFsc2UgdG8gcmVtb3ZlLgogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgZnVuY3Rpb24gc2V0dXBUZWFyZG93bk1vdXNlQ2FuY2VsbGVyKHNldHVwKSB7CiAgICBsZXQgZXZlbnRzID0gSVNfVE9VQ0hfT05MWSA/IFsnY2xpY2snXSA6IE1PVVNFX0VWRU5UUzsKICAgIGZvciAobGV0IGkgPSAwLCBlbjsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgewogICAgICBlbiA9IGV2ZW50c1tpXTsKICAgICAgaWYgKHNldHVwKSB7CiAgICAgICAgLy8gcmVzZXQgY2xpY2tMYWJlbHMgYXJyYXkKICAgICAgICBjbGlja2VkTGFiZWxzLmxlbmd0aCA9IDA7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihlbiwgbW91c2VDYW5jZWxsZXIsIHRydWUpOwogICAgICB9IGVsc2UgewogICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZW4sIG1vdXNlQ2FuY2VsbGVyLCB0cnVlKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gaWdub3JlTW91c2UoZSkgewogICAgaWYgKCFQT0lOVEVSU1RBVEUubW91c2UubW91c2VJZ25vcmVKb2IpIHsKICAgICAgc2V0dXBUZWFyZG93bk1vdXNlQ2FuY2VsbGVyKHRydWUpOwogICAgfQogICAgbGV0IHVuc2V0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHNldHVwVGVhcmRvd25Nb3VzZUNhbmNlbGxlcigpOwogICAgICBQT0lOVEVSU1RBVEUubW91c2UudGFyZ2V0ID0gbnVsbDsKICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iID0gbnVsbDsKICAgIH07CiAgICBQT0lOVEVSU1RBVEUubW91c2UudGFyZ2V0ID0gZS5jb21wb3NlZFBhdGgoKVswXTsKICAgIFBPSU5URVJTVEFURS5tb3VzZS5tb3VzZUlnbm9yZUpvYiA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iCiAgICAgICAgLCBQb2x5bWVyLkFzeW5jLnRpbWVPdXQuYWZ0ZXIoTU9VU0VfVElNRU9VVCkKICAgICAgICAsIHVuc2V0KTsKICB9CgogIC8qKgogICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXYgZXZlbnQgdG8gdGVzdCBmb3IgbGVmdCBtb3VzZSBidXR0b24gZG93bgogICAqIEByZXR1cm4ge2Jvb2xlYW59IGhhcyBsZWZ0IG1vdXNlIGJ1dHRvbiBkb3duCiAgICovCiAgZnVuY3Rpb24gaGFzTGVmdE1vdXNlQnV0dG9uKGV2KSB7CiAgICBsZXQgdHlwZSA9IGV2LnR5cGU7CiAgICAvLyBleGl0IGVhcmx5IGlmIHRoZSBldmVudCBpcyBub3QgYSBtb3VzZSBldmVudAogICAgaWYgKCFpc01vdXNlRXZlbnQodHlwZSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLy8gZXYuYnV0dG9uIGlzIG5vdCByZWxpYWJsZSBmb3IgbW91c2Vtb3ZlICgwIGlzIG92ZXJsb2FkZWQgYXMgYm90aCBsZWZ0IGJ1dHRvbiBhbmQgbm8gYnV0dG9ucykKICAgIC8vIGluc3RlYWQgd2UgdXNlIGV2LmJ1dHRvbnMgKGJpdG1hc2sgb2YgYnV0dG9ucykgb3IgZmFsbCBiYWNrIHRvIGV2LndoaWNoIChkZXByZWNhdGVkLCAwIGZvciBubyBidXR0b25zLCAxIGZvciBsZWZ0IGJ1dHRvbikKICAgIGlmICh0eXBlID09PSAnbW91c2Vtb3ZlJykgewogICAgICAvLyBhbGxvdyB1bmRlZmluZWQgZm9yIHRlc3RpbmcgZXZlbnRzCiAgICAgIGxldCBidXR0b25zID0gZXYuYnV0dG9ucyA9PT0gdW5kZWZpbmVkID8gMSA6IGV2LmJ1dHRvbnM7CiAgICAgIGlmICgoZXYgaW5zdGFuY2VvZiB3aW5kb3cuTW91c2VFdmVudCkgJiYgIU1PVVNFX0hBU19CVVRUT05TKSB7CiAgICAgICAgYnV0dG9ucyA9IE1PVVNFX1dISUNIX1RPX0JVVFRPTlNbZXYud2hpY2hdIHx8IDA7CiAgICAgIH0KICAgICAgLy8gYnV0dG9ucyBpcyBhIGJpdG1hc2ssIGNoZWNrIHRoYXQgdGhlIGxlZnQgYnV0dG9uIGJpdCBpcyBzZXQgKDEpCiAgICAgIHJldHVybiBCb29sZWFuKGJ1dHRvbnMgJiAxKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIGFsbG93IHVuZGVmaW5lZCBmb3IgdGVzdGluZyBldmVudHMKICAgICAgbGV0IGJ1dHRvbiA9IGV2LmJ1dHRvbiA9PT0gdW5kZWZpbmVkID8gMCA6IGV2LmJ1dHRvbjsKICAgICAgLy8gZXYuYnV0dG9uIGlzIDAgaW4gbW91c2Vkb3duL21vdXNldXAvY2xpY2sgZm9yIGxlZnQgYnV0dG9uIGFjdGl2YXRpb24KICAgICAgcmV0dXJuIGJ1dHRvbiA9PT0gMDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzU3ludGhldGljQ2xpY2soZXYpIHsKICAgIGlmIChldi50eXBlID09PSAnY2xpY2snKSB7CiAgICAgIC8vIGV2LmRldGFpbCBpcyAwIGZvciBIVE1MRWxlbWVudC5jbGljayBpbiBtb3N0IGJyb3dzZXJzCiAgICAgIGlmIChldi5kZXRhaWwgPT09IDApIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICAvLyBpbiB0aGUgd29yc3QgY2FzZSwgY2hlY2sgdGhhdCB0aGUgeC95IHBvc2l0aW9uIG9mIHRoZSBjbGljayBpcyB3aXRoaW4KICAgICAgLy8gdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudAogICAgICAvLyBUaGFua3MgSUUgMTAgPjooCiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChldik7CiAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudCBpcyBhbiBlbGVtZW50IHNvIHdlIGNhbiB1c2UgZ2V0Qm91bmRpbmdDbGllbnRSZWN0LAogICAgICAvLyBpZiBub3QsIGp1c3QgYXNzdW1lIGl0IGlzIGEgc3ludGhldGljIGNsaWNrCiAgICAgIGlmICghdC5ub2RlVHlwZSB8fCAvKiogQHR5cGUge0VsZW1lbnR9ICovKHQpLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGxldCBiY3IgPSAvKiogQHR5cGUge0VsZW1lbnR9ICovKHQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAvLyB1c2UgcGFnZSB4L3kgdG8gYWNjb3VudCBmb3Igc2Nyb2xsaW5nCiAgICAgIGxldCB4ID0gZXYucGFnZVgsIHkgPSBldi5wYWdlWTsKICAgICAgLy8gZXYgaXMgYSBzeW50aGV0aWMgY2xpY2sgaWYgdGhlIHBvc2l0aW9uIGlzIG91dHNpZGUgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgdGFyZ2V0CiAgICAgIHJldHVybiAhKCh4ID49IGJjci5sZWZ0ICYmIHggPD0gYmNyLnJpZ2h0KSAmJiAoeSA+PSBiY3IudG9wICYmIHkgPD0gYmNyLmJvdHRvbSkpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgbGV0IFBPSU5URVJTVEFURSA9IHsKICAgIG1vdXNlOiB7CiAgICAgIHRhcmdldDogbnVsbCwKICAgICAgbW91c2VJZ25vcmVKb2I6IG51bGwKICAgIH0sCiAgICB0b3VjaDogewogICAgICB4OiAwLAogICAgICB5OiAwLAogICAgICBpZDogLTEsCiAgICAgIHNjcm9sbERlY2lkZWQ6IGZhbHNlCiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gZmlyc3RUb3VjaEFjdGlvbihldikgewogICAgbGV0IHRhID0gJ2F1dG8nOwogICAgbGV0IHBhdGggPSBldi5jb21wb3NlZFBhdGggJiYgZXYuY29tcG9zZWRQYXRoKCk7CiAgICBpZiAocGF0aCkgewogICAgICBmb3IgKGxldCBpID0gMCwgbjsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKICAgICAgICBuID0gcGF0aFtpXTsKICAgICAgICBpZiAobltUT1VDSF9BQ1RJT05dKSB7CiAgICAgICAgICB0YSA9IG5bVE9VQ0hfQUNUSU9OXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhOwogIH0KCiAgZnVuY3Rpb24gdHJhY2tEb2N1bWVudChzdGF0ZU9iaiwgbW92ZWZuLCB1cGZuKSB7CiAgICBzdGF0ZU9iai5tb3ZlZm4gPSBtb3ZlZm47CiAgICBzdGF0ZU9iai51cGZuID0gdXBmbjsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdmVmbik7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdXBmbik7CiAgfQoKICBmdW5jdGlvbiB1bnRyYWNrRG9jdW1lbnQoc3RhdGVPYmopIHsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHN0YXRlT2JqLm1vdmVmbik7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgc3RhdGVPYmoudXBmbik7CiAgICBzdGF0ZU9iai5tb3ZlZm4gPSBudWxsOwogICAgc3RhdGVPYmoudXBmbiA9IG51bGw7CiAgfQoKICAvLyB1c2UgYSBkb2N1bWVudC13aWRlIHRvdWNoZW5kIGxpc3RlbmVyIHRvIHN0YXJ0IHRoZSBnaG9zdC1jbGljayBwcmV2ZW50aW9uIG1lY2hhbmlzbQogIC8vIFVzZSBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycywgaWYgc3VwcG9ydGVkLCB0byBub3QgYWZmZWN0IHNjcm9sbGluZyBwZXJmb3JtYW5jZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgaWdub3JlTW91c2UsIFNVUFBPUlRTX1BBU1NJVkUgPyB7cGFzc2l2ZTogdHJ1ZX0gOiBmYWxzZSk7CgogIC8qKgogICAqIE1vZHVsZSBmb3IgYWRkaW5nIGxpc3RlbmVycyB0byBhIG5vZGUgZm9yIHRoZSBmb2xsb3dpbmcgbm9ybWFsaXplZAogICAqIGNyb3NzLXBsYXRmb3JtICJnZXN0dXJlIiBldmVudHM6CiAgICogLSBgZG93bmAgLSBtb3VzZSBvciB0b3VjaCB3ZW50IGRvd24KICAgKiAtIGB1cGAgLSBtb3VzZSBvciB0b3VjaCB3ZW50IHVwCiAgICogLSBgdGFwYCAtIG1vdXNlIGNsaWNrIG9yIGZpbmdlciB0YXAKICAgKiAtIGB0cmFja2AgLSBtb3VzZSBkcmFnIG9yIHRvdWNoIG1vdmUKICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1vZHVsZSBmb3IgYWRkaW5nIGNyb3NzLXBsYXRmb3JtIGdlc3R1cmUgZXZlbnQgbGlzdGVuZXJzLgogICAqLwogIGNvbnN0IEdlc3R1cmVzID0gewogICAgZ2VzdHVyZXM6IHt9LAogICAgcmVjb2duaXplcnM6IFtdLAoKICAgIC8qKgogICAgICogRmluZHMgdGhlIGVsZW1lbnQgcmVuZGVyZWQgb24gdGhlIHNjcmVlbiBhdCB0aGUgcHJvdmlkZWQgY29vcmRpbmF0ZXMuCiAgICAgKgogICAgICogU2ltaWxhciB0byBgZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludGAsIGJ1dCBwaWVyY2VzIHRocm91Z2gKICAgICAqIHNoYWRvdyByb290cy4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5HZXN0dXJlcwogICAgICogQHBhcmFtIHtudW1iZXJ9IHggSG9yaXpvbnRhbCBwaXhlbCBjb29yZGluYXRlCiAgICAgKiBAcGFyYW0ge251bWJlcn0geSBWZXJ0aWNhbCBwaXhlbCBjb29yZGluYXRlCiAgICAgKiBAcmV0dXJuIHtFbGVtZW50fSBSZXR1cm5zIHRoZSBkZWVwZXN0IHNoYWRvd1Jvb3QgaW5jbHVzaXZlIGVsZW1lbnQKICAgICAqIGZvdW5kIGF0IHRoZSBzY3JlZW4gcG9zaXRpb24gZ2l2ZW4uCiAgICAgKi8KICAgIGRlZXBUYXJnZXRGaW5kOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGxldCBub2RlID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KTsKICAgICAgbGV0IG5leHQgPSBub2RlOwogICAgICAvLyB0aGlzIGNvZGUgcGF0aCBpcyBvbmx5IHRha2VuIHdoZW4gbmF0aXZlIFNoYWRvd0RPTSBpcyB1c2VkCiAgICAgIC8vIGlmIHRoZXJlIGlzIGEgc2hhZG93cm9vdCwgaXQgbWF5IGhhdmUgYSBub2RlIGF0IHgveQogICAgICAvLyBpZiB0aGVyZSBpcyBub3QgYSBzaGFkb3dyb290LCBleGl0IHRoZSBsb29wCiAgICAgIHdoaWxlIChuZXh0ICYmIG5leHQuc2hhZG93Um9vdCAmJiAhd2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBub2RlIGF0IHgveSBpbiB0aGUgc2hhZG93cm9vdCwgbG9vayBkZWVwZXIKICAgICAgICBsZXQgb2xkTmV4dCA9IG5leHQ7CiAgICAgICAgbmV4dCA9IG5leHQuc2hhZG93Um9vdC5lbGVtZW50RnJvbVBvaW50KHgsIHkpOwogICAgICAgIC8vIG9uIFNhZmFyaSwgZWxlbWVudEZyb21Qb2ludCBtYXkgcmV0dXJuIHRoZSBzaGFkb3dSb290IGhvc3QKICAgICAgICBpZiAob2xkTmV4dCA9PT0gbmV4dCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICBub2RlID0gbmV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGU7CiAgICB9LAogICAgLyoqCiAgICAgKiBhIGNoZWFwZXIgY2hlY2sgdGhhbiBldi5jb21wb3NlZFBhdGgoKVswXTsKICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtFdmVudH0gZXYgRXZlbnQuCiAgICAgKiBAcmV0dXJuIHtFdmVudFRhcmdldH0gUmV0dXJucyB0aGUgZXZlbnQgdGFyZ2V0LgogICAgICovCiAgICBfZmluZE9yaWdpbmFsVGFyZ2V0OiBmdW5jdGlvbihldikgewogICAgICAvLyBzaGFkb3dkb20KICAgICAgaWYgKGV2LmNvbXBvc2VkUGF0aCkgewogICAgICAgIGNvbnN0IHRhcmdldHMgPSAvKiogQHR5cGUgeyFBcnJheTwhRXZlbnRUYXJnZXQ+fSAqLyhldi5jb21wb3NlZFBhdGgoKSk7CiAgICAgICAgLy8gSXQgc2hvdWxkbid0IGJlLCBidXQgc29tZXRpbWVzIHRhcmdldHMgaXMgZW1wdHkgKHdpbmRvdyBvbiBTYWZhcmkpLgogICAgICAgIHJldHVybiB0YXJnZXRzLmxlbmd0aCA+IDAgPyB0YXJnZXRzWzBdIDogZXYudGFyZ2V0OwogICAgICB9CiAgICAgIC8vIHNoYWR5ZG9tCiAgICAgIHJldHVybiBldi50YXJnZXQ7CiAgICB9LAoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2IEV2ZW50LgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgX2hhbmRsZU5hdGl2ZTogZnVuY3Rpb24oZXYpIHsKICAgICAgbGV0IGhhbmRsZWQ7CiAgICAgIGxldCB0eXBlID0gZXYudHlwZTsKICAgICAgbGV0IG5vZGUgPSBldi5jdXJyZW50VGFyZ2V0OwogICAgICBsZXQgZ29iaiA9IG5vZGVbR0VTVFVSRV9LRVldOwogICAgICBpZiAoIWdvYmopIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IGdzID0gZ29ialt0eXBlXTsKICAgICAgaWYgKCFncykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoIWV2W0hBTkRMRURfT0JKXSkgewogICAgICAgIGV2W0hBTkRMRURfT0JKXSA9IHt9OwogICAgICAgIGlmICh0eXBlLnNsaWNlKDAsIDUpID09PSAndG91Y2gnKSB7CiAgICAgICAgICBldiA9IC8qKiBAdHlwZSB7VG91Y2hFdmVudH0gKi8oZXYpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgICBsZXQgdCA9IGV2LmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICAgICAgaWYgKHR5cGUgPT09ICd0b3VjaHN0YXJ0JykgewogICAgICAgICAgICAvLyBvbmx5IGhhbmRsZSB0aGUgZmlyc3QgZmluZ2VyCiAgICAgICAgICAgIGlmIChldi50b3VjaGVzLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgIFBPSU5URVJTVEFURS50b3VjaC5pZCA9IHQuaWRlbnRpZmllcjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKFBPSU5URVJTVEFURS50b3VjaC5pZCAhPT0gdC5pZGVudGlmaWVyKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghSEFTX05BVElWRV9UQSkgewogICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3RvdWNoc3RhcnQnIHx8IHR5cGUgPT09ICd0b3VjaG1vdmUnKSB7CiAgICAgICAgICAgICAgR2VzdHVyZXMuX2hhbmRsZVRvdWNoQWN0aW9uKGV2KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBoYW5kbGVkID0gZXZbSEFORExFRF9PQkpdOwogICAgICAvLyB1c2VkIHRvIGlnbm9yZSBzeW50aGV0aWMgbW91c2UgZXZlbnRzCiAgICAgIGlmIChoYW5kbGVkLnNraXApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgLy8gcmVzZXQgcmVjb2duaXplciBzdGF0ZQogICAgICBmb3IgKGxldCBpID0gMCwgcjsgaSA8IEdlc3R1cmVzLnJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgciA9IEdlc3R1cmVzLnJlY29nbml6ZXJzW2ldOwogICAgICAgIGlmIChnc1tyLm5hbWVdICYmICFoYW5kbGVkW3IubmFtZV0pIHsKICAgICAgICAgIGlmIChyLmZsb3cgJiYgci5mbG93LnN0YXJ0LmluZGV4T2YoZXYudHlwZSkgPiAtMSAmJiByLnJlc2V0KSB7CiAgICAgICAgICAgIHIucmVzZXQoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gZW5mb3JjZSBnZXN0dXJlIHJlY29nbml6ZXIgb3JkZXIKICAgICAgZm9yIChsZXQgaSA9IDAsIHI7IGkgPCBHZXN0dXJlcy5yZWNvZ25pemVycy5sZW5ndGg7IGkrKykgewogICAgICAgIHIgPSBHZXN0dXJlcy5yZWNvZ25pemVyc1tpXTsKICAgICAgICBpZiAoZ3Nbci5uYW1lXSAmJiAhaGFuZGxlZFtyLm5hbWVdKSB7CiAgICAgICAgICBoYW5kbGVkW3IubmFtZV0gPSB0cnVlOwogICAgICAgICAgclt0eXBlXShldik7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZXYgRXZlbnQuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfaGFuZGxlVG91Y2hBY3Rpb246IGZ1bmN0aW9uKGV2KSB7CiAgICAgIGxldCB0ID0gZXYuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgIGxldCB0eXBlID0gZXYudHlwZTsKICAgICAgaWYgKHR5cGUgPT09ICd0b3VjaHN0YXJ0JykgewogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC54ID0gdC5jbGllbnRYOwogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC55ID0gdC5jbGllbnRZOwogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC5zY3JvbGxEZWNpZGVkID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3RvdWNobW92ZScpIHsKICAgICAgICBpZiAoUE9JTlRFUlNUQVRFLnRvdWNoLnNjcm9sbERlY2lkZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgUE9JTlRFUlNUQVRFLnRvdWNoLnNjcm9sbERlY2lkZWQgPSB0cnVlOwogICAgICAgIGxldCB0YSA9IGZpcnN0VG91Y2hBY3Rpb24oZXYpOwogICAgICAgIGxldCBwcmV2ZW50ID0gZmFsc2U7CiAgICAgICAgbGV0IGR4ID0gTWF0aC5hYnMoUE9JTlRFUlNUQVRFLnRvdWNoLnggLSB0LmNsaWVudFgpOwogICAgICAgIGxldCBkeSA9IE1hdGguYWJzKFBPSU5URVJTVEFURS50b3VjaC55IC0gdC5jbGllbnRZKTsKICAgICAgICBpZiAoIWV2LmNhbmNlbGFibGUpIHsKICAgICAgICAgIC8vIHNjcm9sbGluZyBpcyBoYXBwZW5pbmcKICAgICAgICB9IGVsc2UgaWYgKHRhID09PSAnbm9uZScpIHsKICAgICAgICAgIHByZXZlbnQgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAodGEgPT09ICdwYW4teCcpIHsKICAgICAgICAgIHByZXZlbnQgPSBkeSA+IGR4OwogICAgICAgIH0gZWxzZSBpZiAodGEgPT09ICdwYW4teScpIHsKICAgICAgICAgIHByZXZlbnQgPSBkeCA+IGR5OwogICAgICAgIH0KICAgICAgICBpZiAocHJldmVudCkgewogICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgR2VzdHVyZXMucHJldmVudCgndHJhY2snKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGEgbm9kZSBmb3IgdGhlIGdpdmVuIGdlc3R1cmUgdHlwZS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5HZXN0dXJlcwogICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBsaXN0ZW5lciBvbgogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBHZXN0dXJlIHR5cGU6IGBkb3duYCwgYHVwYCwgYHRyYWNrYCwgb3IgYHRhcGAKICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBFdmVudCBsaXN0ZW5lciBmdW5jdGlvbiB0byBjYWxsCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVyIHdhcyBhZGRlZC4KICAgICAqIEB0aGlzIHtHZXN0dXJlc30KICAgICAqLwogICAgYWRkTGlzdGVuZXI6IGZ1bmN0aW9uKG5vZGUsIGV2VHlwZSwgaGFuZGxlcikgewogICAgICBpZiAodGhpcy5nZXN0dXJlc1tldlR5cGVdKSB7CiAgICAgICAgdGhpcy5fYWRkKG5vZGUsIGV2VHlwZSwgaGFuZGxlcik7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKCiAgICAvKioKICAgICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSBhIG5vZGUgZm9yIHRoZSBnaXZlbiBnZXN0dXJlIHR5cGUuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byByZW1vdmUgbGlzdGVuZXIgZnJvbQogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBHZXN0dXJlIHR5cGU6IGBkb3duYCwgYHVwYCwgYHRyYWNrYCwgb3IgYHRhcGAKICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBFdmVudCBsaXN0ZW5lciBmdW5jdGlvbiBwcmV2aW91c2x5IHBhc3NlZCB0bwogICAgICogIGBhZGRMaXN0ZW5lcmAuCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVyIHdhcyByZW1vdmVkLgogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24obm9kZSwgZXZUeXBlLCBoYW5kbGVyKSB7CiAgICAgIGlmICh0aGlzLmdlc3R1cmVzW2V2VHlwZV0pIHsKICAgICAgICB0aGlzLl9yZW1vdmUobm9kZSwgZXZUeXBlLCBoYW5kbGVyKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9LAoKICAgIC8qKgogICAgICogYXV0b21hdGUgdGhlIGV2ZW50IGxpc3RlbmVycyBmb3IgdGhlIG5hdGl2ZSBldmVudHMKICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG5vZGUgTm9kZSBvbiB3aGljaCB0byBhZGQgdGhlIGV2ZW50LgogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBFdmVudCB0eXBlIHRvIGFkZC4KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KX0gaGFuZGxlciBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEB0aGlzIHtHZXN0dXJlc30KICAgICAqLwogICAgX2FkZDogZnVuY3Rpb24obm9kZSwgZXZUeXBlLCBoYW5kbGVyKSB7CiAgICAgIGxldCByZWNvZ25pemVyID0gdGhpcy5nZXN0dXJlc1tldlR5cGVdOwogICAgICBsZXQgZGVwcyA9IHJlY29nbml6ZXIuZGVwczsKICAgICAgbGV0IG5hbWUgPSByZWNvZ25pemVyLm5hbWU7CiAgICAgIGxldCBnb2JqID0gbm9kZVtHRVNUVVJFX0tFWV07CiAgICAgIGlmICghZ29iaikgewogICAgICAgIG5vZGVbR0VTVFVSRV9LRVldID0gZ29iaiA9IHt9OwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSAwLCBkZXAsIGdkOyBpIDwgZGVwcy5sZW5ndGg7IGkrKykgewogICAgICAgIGRlcCA9IGRlcHNbaV07CiAgICAgICAgLy8gZG9uJ3QgYWRkIG1vdXNlIGhhbmRsZXJzIG9uIGlPUyBiZWNhdXNlIHRoZXkgY2F1c2UgZ3JheSBzZWxlY3Rpb24gb3ZlcmxheXMKICAgICAgICBpZiAoSVNfVE9VQ0hfT05MWSAmJiBpc01vdXNlRXZlbnQoZGVwKSAmJiBkZXAgIT09ICdjbGljaycpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBnZCA9IGdvYmpbZGVwXTsKICAgICAgICBpZiAoIWdkKSB7CiAgICAgICAgICBnb2JqW2RlcF0gPSBnZCA9IHtfY291bnQ6IDB9OwogICAgICAgIH0KICAgICAgICBpZiAoZ2QuX2NvdW50ID09PSAwKSB7CiAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZGVwLCB0aGlzLl9oYW5kbGVOYXRpdmUsIFBBU1NJVkVfVE9VQ0goZGVwKSk7CiAgICAgICAgfQogICAgICAgIGdkW25hbWVdID0gKGdkW25hbWVdIHx8IDApICsgMTsKICAgICAgICBnZC5fY291bnQgPSAoZ2QuX2NvdW50IHx8IDApICsgMTsKICAgICAgfQogICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZUeXBlLCBoYW5kbGVyKTsKICAgICAgaWYgKHJlY29nbml6ZXIudG91Y2hBY3Rpb24pIHsKICAgICAgICB0aGlzLnNldFRvdWNoQWN0aW9uKG5vZGUsIHJlY29nbml6ZXIudG91Y2hBY3Rpb24pOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogYXV0b21hdGUgZXZlbnQgbGlzdGVuZXIgcmVtb3ZhbCBmb3IgbmF0aXZlIGV2ZW50cwogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gbm9kZSBOb2RlIG9uIHdoaWNoIHRvIHJlbW92ZSB0aGUgZXZlbnQuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZUeXBlIEV2ZW50IHR5cGUgdG8gcmVtb3ZlLgogICAgICogQHBhcmFtIHtmdW5jdGlvbihFdmVudD8pfSBoYW5kbGVyIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb24uCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICBfcmVtb3ZlOiBmdW5jdGlvbihub2RlLCBldlR5cGUsIGhhbmRsZXIpIHsKICAgICAgbGV0IHJlY29nbml6ZXIgPSB0aGlzLmdlc3R1cmVzW2V2VHlwZV07CiAgICAgIGxldCBkZXBzID0gcmVjb2duaXplci5kZXBzOwogICAgICBsZXQgbmFtZSA9IHJlY29nbml6ZXIubmFtZTsKICAgICAgbGV0IGdvYmogPSBub2RlW0dFU1RVUkVfS0VZXTsKICAgICAgaWYgKGdvYmopIHsKICAgICAgICBmb3IgKGxldCBpID0gMCwgZGVwLCBnZDsgaSA8IGRlcHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGRlcCA9IGRlcHNbaV07CiAgICAgICAgICBnZCA9IGdvYmpbZGVwXTsKICAgICAgICAgIGlmIChnZCAmJiBnZFtuYW1lXSkgewogICAgICAgICAgICBnZFtuYW1lXSA9IChnZFtuYW1lXSB8fCAxKSAtIDE7CiAgICAgICAgICAgIGdkLl9jb3VudCA9IChnZC5fY291bnQgfHwgMSkgLSAxOwogICAgICAgICAgICBpZiAoZ2QuX2NvdW50ID09PSAwKSB7CiAgICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGRlcCwgdGhpcy5faGFuZGxlTmF0aXZlLCBQQVNTSVZFX1RPVUNIKGRlcCkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldlR5cGUsIGhhbmRsZXIpOwogICAgfSwKCiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIG5ldyBnZXN0dXJlIGV2ZW50IHJlY29nbml6ZXIgZm9yIGFkZGluZyBuZXcgY3VzdG9tCiAgICAgKiBnZXN0dXJlIGV2ZW50IHR5cGVzLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkdlc3R1cmVzCiAgICAgKiBAcGFyYW0geyFHZXN0dXJlUmVjb2duaXplcn0gcmVjb2cgR2VzdHVyZSByZWNvZ25pemVyIGRlc2NyaXB0b3IKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7R2VzdHVyZXN9CiAgICAgKi8KICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihyZWNvZykgewogICAgICB0aGlzLnJlY29nbml6ZXJzLnB1c2gocmVjb2cpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY29nLmVtaXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGhpcy5nZXN0dXJlc1tyZWNvZy5lbWl0c1tpXV0gPSByZWNvZzsKICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZOYW1lIEV2ZW50IG5hbWUuCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgdGhlIGdlc3R1cmUgZm9yIHRoZSBnaXZlbiBldmVudCBuYW1lLgogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICBfZmluZFJlY29nbml6ZXJCeUV2ZW50OiBmdW5jdGlvbihldk5hbWUpIHsKICAgICAgZm9yIChsZXQgaSA9IDAsIHI7IGkgPCB0aGlzLnJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgciA9IHRoaXMucmVjb2duaXplcnNbaV07CiAgICAgICAgZm9yIChsZXQgaiA9IDAsIG47IGogPCByLmVtaXRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBuID0gci5lbWl0c1tqXTsKICAgICAgICAgIGlmIChuID09PSBldk5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfSwKCiAgICAvKioKICAgICAqIFNldHMgc2Nyb2xsaW5nIGRpcmVjdGlvbiBvbiBub2RlLgogICAgICoKICAgICAqIFRoaXMgdmFsdWUgaXMgY2hlY2tlZCBvbiBmaXJzdCBtb3ZlLCB0aHVzIGl0IHNob3VsZCBiZSBjYWxsZWQgcHJpb3IgdG8KICAgICAqIGFkZGluZyBldmVudCBsaXN0ZW5lcnMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7IUVsZW1lbnR9IG5vZGUgTm9kZSB0byBzZXQgdG91Y2ggYWN0aW9uIHNldHRpbmcgb24KICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBUb3VjaCBhY3Rpb24gdmFsdWUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHNldFRvdWNoQWN0aW9uOiBmdW5jdGlvbihub2RlLCB2YWx1ZSkgewogICAgICBpZiAoSEFTX05BVElWRV9UQSkgewogICAgICAgIC8vIE5PVEU6IGFkZCB0b3VjaEFjdGlvbiBhc3luYyBzbyB0aGF0IGV2ZW50cyBjYW4gYmUgYWRkZWQgaW4KICAgICAgICAvLyBjdXN0b20gZWxlbWVudCBjb25zdHJ1Y3RvcnMuIE90aGVyd2lzZSB3ZSBydW4gYWZvdWwgb2YgY3VzdG9tCiAgICAgICAgLy8gZWxlbWVudHMgcmVzdHJpY3Rpb24gYWdhaW5zdCBzZXR0aW5ncyBhdHRyaWJ1dGVzIChzdHlsZSkgaW4gdGhlCiAgICAgICAgLy8gY29uc3RydWN0b3IuCiAgICAgICAgUG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKCgpID0+IHsKICAgICAgICAgIG5vZGUuc3R5bGUudG91Y2hBY3Rpb24gPSB2YWx1ZTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBub2RlW1RPVUNIX0FDVElPTl0gPSB2YWx1ZTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IG9uIHRoZSBgdGFyZ2V0YCBlbGVtZW50IG9mIGB0eXBlYCB3aXRoIHRoZSBnaXZlbgogICAgICogYGRldGFpbGAuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHshRXZlbnRUYXJnZXR9IHRhcmdldCBUaGUgZWxlbWVudCBvbiB3aGljaCB0byBmaXJlIGFuIGV2ZW50LgogICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIHR5cGUgb2YgZXZlbnQgdG8gZmlyZS4KICAgICAqIEBwYXJhbSB7IU9iamVjdD19IGRldGFpbCBUaGUgZGV0YWlsIG9iamVjdCB0byBwb3B1bGF0ZSBvbiB0aGUgZXZlbnQuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfZmlyZTogZnVuY3Rpb24odGFyZ2V0LCB0eXBlLCBkZXRhaWwpIHsKICAgICAgbGV0IGV2ID0gbmV3IEV2ZW50KHR5cGUsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSk7CiAgICAgIGV2LmRldGFpbCA9IGRldGFpbDsKICAgICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXYpOwogICAgICAvLyBmb3J3YXJkIGBwcmV2ZW50RGVmYXVsdGAgaW4gYSBjbGVhbiB3YXkKICAgICAgaWYgKGV2LmRlZmF1bHRQcmV2ZW50ZWQpIHsKICAgICAgICBsZXQgcHJldmVudGVyID0gZGV0YWlsLnByZXZlbnRlciB8fCBkZXRhaWwuc291cmNlRXZlbnQ7CiAgICAgICAgaWYgKHByZXZlbnRlciAmJiBwcmV2ZW50ZXIucHJldmVudERlZmF1bHQpIHsKICAgICAgICAgIHByZXZlbnRlci5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIFByZXZlbnRzIHRoZSBkaXNwYXRjaCBhbmQgZGVmYXVsdCBhY3Rpb24gb2YgdGhlIGdpdmVuIGV2ZW50IG5hbWUuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldk5hbWUgRXZlbnQgbmFtZS4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7R2VzdHVyZXN9CiAgICAgKi8KICAgIHByZXZlbnQ6IGZ1bmN0aW9uKGV2TmFtZSkgewogICAgICBsZXQgcmVjb2duaXplciA9IHRoaXMuX2ZpbmRSZWNvZ25pemVyQnlFdmVudChldk5hbWUpOwogICAgICBpZiAocmVjb2duaXplci5pbmZvKSB7CiAgICAgICAgcmVjb2duaXplci5pbmZvLnByZXZlbnQgPSB0cnVlOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogUmVzZXQgdGhlIDI1MDBtcyB0aW1lb3V0IG9uIHByb2Nlc3NpbmcgbW91c2UgaW5wdXQgYWZ0ZXIgZGV0ZWN0aW5nIHRvdWNoIGlucHV0LgogICAgICoKICAgICAqIFRvdWNoIGlucHV0cyBjcmVhdGUgc3ludGhlc2l6ZWQgbW91c2UgaW5wdXRzIGFueXdoZXJlIGZyb20gMCB0byAyMDAwbXMgYWZ0ZXIgdGhlIHRvdWNoLgogICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyB0ZXN0aW5nIHdpdGggc2ltdWxhdGVkIHRvdWNoIGlucHV0cy4KICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaW4gcHJvZHVjdGlvbiBtYXkgY2F1c2UgZHVwbGljYXRlIHRhcHMgb3Igb3RoZXIgR2VzdHVyZXMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0TW91c2VDYW5jZWxsZXI6IGZ1bmN0aW9uKCkgewogICAgICBpZiAoUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iKSB7CiAgICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iLmZsdXNoKCk7CiAgICAgIH0KICAgIH0KICB9OwoKICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwoKICBHZXN0dXJlcy5yZWdpc3Rlcih7CiAgICBuYW1lOiAnZG93bnVwJywKICAgIGRlcHM6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnXSwKICAgIGZsb3c6IHsKICAgICAgc3RhcnQ6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSwKICAgICAgZW5kOiBbJ21vdXNldXAnLCAndG91Y2hlbmQnXQogICAgfSwKICAgIGVtaXRzOiBbJ2Rvd24nLCAndXAnXSwKCiAgICBpbmZvOiB7CiAgICAgIG1vdmVmbjogbnVsbCwKICAgICAgdXBmbjogbnVsbAogICAgfSwKCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgdW50cmFja0RvY3VtZW50KHRoaXMuaW5mbyk7CiAgICB9LAoKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBtb3VzZWRvd246IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKCFoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IHQgPSBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpOwogICAgICBsZXQgc2VsZiA9IHRoaXM7CiAgICAgIGxldCBtb3ZlZm4gPSBmdW5jdGlvbiBtb3ZlZm4oZSkgewogICAgICAgIGlmICghaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgICBzZWxmLl9maXJlKCd1cCcsIHQsIGUpOwogICAgICAgICAgdW50cmFja0RvY3VtZW50KHNlbGYuaW5mbyk7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZXQgdXBmbiA9IGZ1bmN0aW9uIHVwZm4oZSkgewogICAgICAgIGlmIChoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICAgIHNlbGYuX2ZpcmUoJ3VwJywgdCwgZSk7CiAgICAgICAgfQogICAgICAgIHVudHJhY2tEb2N1bWVudChzZWxmLmluZm8pOwogICAgICB9OwogICAgICB0cmFja0RvY3VtZW50KHRoaXMuaW5mbywgbW92ZWZuLCB1cGZuKTsKICAgICAgdGhpcy5fZmlyZSgnZG93bicsIHQsIGUpOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaHN0YXJ0OiBmdW5jdGlvbihlKSB7CiAgICAgIHRoaXMuX2ZpcmUoJ2Rvd24nLCBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpLCBlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgdG91Y2hlbmQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgdGhpcy5fZmlyZSgndXAnLCBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpLCBlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlCiAgICAgKiBAcGFyYW0geyFFdmVudFRhcmdldH0gdGFyZ2V0CiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudAogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJldmVudGVyCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfZmlyZTogZnVuY3Rpb24odHlwZSwgdGFyZ2V0LCBldmVudCwgcHJldmVudGVyKSB7CiAgICAgIEdlc3R1cmVzLl9maXJlKHRhcmdldCwgdHlwZSwgewogICAgICAgIHg6IGV2ZW50LmNsaWVudFgsCiAgICAgICAgeTogZXZlbnQuY2xpZW50WSwKICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsCiAgICAgICAgcHJldmVudGVyOiBwcmV2ZW50ZXIsCiAgICAgICAgcHJldmVudDogZnVuY3Rpb24oZSkgewogICAgICAgICAgcmV0dXJuIEdlc3R1cmVzLnByZXZlbnQoZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9KTsKCiAgR2VzdHVyZXMucmVnaXN0ZXIoewogICAgbmFtZTogJ3RyYWNrJywKICAgIHRvdWNoQWN0aW9uOiAnbm9uZScsCiAgICBkZXBzOiBbJ21vdXNlZG93bicsICd0b3VjaHN0YXJ0JywgJ3RvdWNobW92ZScsICd0b3VjaGVuZCddLAogICAgZmxvdzogewogICAgICBzdGFydDogWydtb3VzZWRvd24nLCAndG91Y2hzdGFydCddLAogICAgICBlbmQ6IFsnbW91c2V1cCcsICd0b3VjaGVuZCddCiAgICB9LAogICAgZW1pdHM6IFsndHJhY2snXSwKCiAgICBpbmZvOiB7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHN0YXRlOiAnc3RhcnQnLAogICAgICBzdGFydGVkOiBmYWxzZSwKICAgICAgbW92ZXM6IFtdLAogICAgICAvKiogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfSAqLwogICAgICBhZGRNb3ZlOiBmdW5jdGlvbihtb3ZlKSB7CiAgICAgICAgaWYgKHRoaXMubW92ZXMubGVuZ3RoID4gVFJBQ0tfTEVOR1RIKSB7CiAgICAgICAgICB0aGlzLm1vdmVzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIHRoaXMubW92ZXMucHVzaChtb3ZlKTsKICAgICAgfSwKICAgICAgbW92ZWZuOiBudWxsLAogICAgICB1cGZuOiBudWxsLAogICAgICBwcmV2ZW50OiBmYWxzZQogICAgfSwKCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5pbmZvLnN0YXRlID0gJ3N0YXJ0JzsKICAgICAgdGhpcy5pbmZvLnN0YXJ0ZWQgPSBmYWxzZTsKICAgICAgdGhpcy5pbmZvLm1vdmVzID0gW107CiAgICAgIHRoaXMuaW5mby54ID0gMDsKICAgICAgdGhpcy5pbmZvLnkgPSAwOwogICAgICB0aGlzLmluZm8ucHJldmVudCA9IGZhbHNlOwogICAgICB1bnRyYWNrRG9jdW1lbnQodGhpcy5pbmZvKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge251bWJlcn0geAogICAgICogQHBhcmFtIHtudW1iZXJ9IHkKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICAgKi8KICAgIGhhc01vdmVkRW5vdWdoOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGlmICh0aGlzLmluZm8ucHJldmVudCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAodGhpcy5pbmZvLnN0YXJ0ZWQpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgZHggPSBNYXRoLmFicyh0aGlzLmluZm8ueCAtIHgpOwogICAgICBsZXQgZHkgPSBNYXRoLmFicyh0aGlzLmluZm8ueSAtIHkpOwogICAgICByZXR1cm4gKGR4ID49IFRSQUNLX0RJU1RBTkNFIHx8IGR5ID49IFRSQUNLX0RJU1RBTkNFKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgbW91c2Vkb3duOiBmdW5jdGlvbihlKSB7CiAgICAgIGlmICghaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChlKTsKICAgICAgbGV0IHNlbGYgPSB0aGlzOwogICAgICBsZXQgbW92ZWZuID0gZnVuY3Rpb24gbW92ZWZuKGUpIHsKICAgICAgICBsZXQgeCA9IGUuY2xpZW50WCwgeSA9IGUuY2xpZW50WTsKICAgICAgICBpZiAoc2VsZi5oYXNNb3ZlZEVub3VnaCh4LCB5KSkgewogICAgICAgICAgLy8gZmlyc3QgbW92ZSBpcyAnc3RhcnQnLCBzdWJzZXF1ZW50IG1vdmVzIGFyZSAnbW92ZScsIG1vdXNldXAgaXMgJ2VuZCcKICAgICAgICAgIHNlbGYuaW5mby5zdGF0ZSA9IHNlbGYuaW5mby5zdGFydGVkID8gKGUudHlwZSA9PT0gJ21vdXNldXAnID8gJ2VuZCcgOiAndHJhY2snKSA6ICdzdGFydCc7CiAgICAgICAgICBpZiAoc2VsZi5pbmZvLnN0YXRlID09PSAnc3RhcnQnKSB7CiAgICAgICAgICAgIC8vIGlmIGFuZCBvbmx5IGlmIHRyYWNraW5nLCBhbHdheXMgcHJldmVudCB0YXAKICAgICAgICAgICAgR2VzdHVyZXMucHJldmVudCgndGFwJyk7CiAgICAgICAgICB9CiAgICAgICAgICBzZWxmLmluZm8uYWRkTW92ZSh7eDogeCwgeTogeX0pOwogICAgICAgICAgaWYgKCFoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICAgICAgLy8gYWx3YXlzIF9maXJlICJlbmQiCiAgICAgICAgICAgIHNlbGYuaW5mby5zdGF0ZSA9ICdlbmQnOwogICAgICAgICAgICB1bnRyYWNrRG9jdW1lbnQoc2VsZi5pbmZvKTsKICAgICAgICAgIH0KICAgICAgICAgIHNlbGYuX2ZpcmUodCwgZSk7CiAgICAgICAgICBzZWxmLmluZm8uc3RhcnRlZCA9IHRydWU7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZXQgdXBmbiA9IGZ1bmN0aW9uIHVwZm4oZSkgewogICAgICAgIGlmIChzZWxmLmluZm8uc3RhcnRlZCkgewogICAgICAgICAgbW92ZWZuKGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gcmVtb3ZlIHRoZSB0ZW1wb3JhcnkgbGlzdGVuZXJzCiAgICAgICAgdW50cmFja0RvY3VtZW50KHNlbGYuaW5mbyk7CiAgICAgIH07CiAgICAgIC8vIGFkZCB0ZW1wb3JhcnkgZG9jdW1lbnQgbGlzdGVuZXJzIGFzIG1vdXNlIHJldGFyZ2V0cwogICAgICB0cmFja0RvY3VtZW50KHRoaXMuaW5mbywgbW92ZWZuLCB1cGZuKTsKICAgICAgdGhpcy5pbmZvLnggPSBlLmNsaWVudFg7CiAgICAgIHRoaXMuaW5mby55ID0gZS5jbGllbnRZOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaHN0YXJ0OiBmdW5jdGlvbihlKSB7CiAgICAgIGxldCBjdCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgIHRoaXMuaW5mby54ID0gY3QuY2xpZW50WDsKICAgICAgdGhpcy5pbmZvLnkgPSBjdC5jbGllbnRZOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaG1vdmU6IGZ1bmN0aW9uKGUpIHsKICAgICAgbGV0IHQgPSBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpOwogICAgICBsZXQgY3QgPSBlLmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICBsZXQgeCA9IGN0LmNsaWVudFgsIHkgPSBjdC5jbGllbnRZOwogICAgICBpZiAodGhpcy5oYXNNb3ZlZEVub3VnaCh4LCB5KSkgewogICAgICAgIGlmICh0aGlzLmluZm8uc3RhdGUgPT09ICdzdGFydCcpIHsKICAgICAgICAgIC8vIGlmIGFuZCBvbmx5IGlmIHRyYWNraW5nLCBhbHdheXMgcHJldmVudCB0YXAKICAgICAgICAgIEdlc3R1cmVzLnByZXZlbnQoJ3RhcCcpOwogICAgICAgIH0KICAgICAgICB0aGlzLmluZm8uYWRkTW92ZSh7eDogeCwgeTogeX0pOwogICAgICAgIHRoaXMuX2ZpcmUodCwgY3QpOwogICAgICAgIHRoaXMuaW5mby5zdGF0ZSA9ICd0cmFjayc7CiAgICAgICAgdGhpcy5pbmZvLnN0YXJ0ZWQgPSB0cnVlOwogICAgICB9CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHRvdWNoZW5kOiBmdW5jdGlvbihlKSB7CiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChlKTsKICAgICAgbGV0IGN0ID0gZS5jaGFuZ2VkVG91Y2hlc1swXTsKICAgICAgLy8gb25seSB0cmFja2VuZCBpZiB0cmFjayB3YXMgc3RhcnRlZCBhbmQgbm90IGFib3J0ZWQKICAgICAgaWYgKHRoaXMuaW5mby5zdGFydGVkKSB7CiAgICAgICAgLy8gcmVzZXQgc3RhcnRlZCBzdGF0ZSBvbiB1cAogICAgICAgIHRoaXMuaW5mby5zdGF0ZSA9ICdlbmQnOwogICAgICAgIHRoaXMuaW5mby5hZGRNb3ZlKHt4OiBjdC5jbGllbnRYLCB5OiBjdC5jbGllbnRZfSk7CiAgICAgICAgdGhpcy5fZmlyZSh0LCBjdCwgZSk7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0geyFFdmVudFRhcmdldH0gdGFyZ2V0CiAgICAgKiBAcGFyYW0ge1RvdWNofSB0b3VjaAogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgX2ZpcmU6IGZ1bmN0aW9uKHRhcmdldCwgdG91Y2gpIHsKICAgICAgbGV0IHNlY29uZGxhc3QgPSB0aGlzLmluZm8ubW92ZXNbdGhpcy5pbmZvLm1vdmVzLmxlbmd0aCAtIDJdOwogICAgICBsZXQgbGFzdG1vdmUgPSB0aGlzLmluZm8ubW92ZXNbdGhpcy5pbmZvLm1vdmVzLmxlbmd0aCAtIDFdOwogICAgICBsZXQgZHggPSBsYXN0bW92ZS54IC0gdGhpcy5pbmZvLng7CiAgICAgIGxldCBkeSA9IGxhc3Rtb3ZlLnkgLSB0aGlzLmluZm8ueTsKICAgICAgbGV0IGRkeCwgZGR5ID0gMDsKICAgICAgaWYgKHNlY29uZGxhc3QpIHsKICAgICAgICBkZHggPSBsYXN0bW92ZS54IC0gc2Vjb25kbGFzdC54OwogICAgICAgIGRkeSA9IGxhc3Rtb3ZlLnkgLSBzZWNvbmRsYXN0Lnk7CiAgICAgIH0KICAgICAgR2VzdHVyZXMuX2ZpcmUodGFyZ2V0LCAndHJhY2snLCB7CiAgICAgICAgc3RhdGU6IHRoaXMuaW5mby5zdGF0ZSwKICAgICAgICB4OiB0b3VjaC5jbGllbnRYLAogICAgICAgIHk6IHRvdWNoLmNsaWVudFksCiAgICAgICAgZHg6IGR4LAogICAgICAgIGR5OiBkeSwKICAgICAgICBkZHg6IGRkeCwKICAgICAgICBkZHk6IGRkeSwKICAgICAgICBzb3VyY2VFdmVudDogdG91Y2gsCiAgICAgICAgaG92ZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIEdlc3R1cmVzLmRlZXBUYXJnZXRGaW5kKHRvdWNoLmNsaWVudFgsIHRvdWNoLmNsaWVudFkpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogIH0pOwoKICBHZXN0dXJlcy5yZWdpc3Rlcih7CiAgICBuYW1lOiAndGFwJywKICAgIGRlcHM6IFsnbW91c2Vkb3duJywgJ2NsaWNrJywgJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnXSwKICAgIGZsb3c6IHsKICAgICAgc3RhcnQ6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSwKICAgICAgZW5kOiBbJ2NsaWNrJywgJ3RvdWNoZW5kJ10KICAgIH0sCiAgICBlbWl0czogWyd0YXAnXSwKICAgIGluZm86IHsKICAgICAgeDogTmFOLAogICAgICB5OiBOYU4sCiAgICAgIHByZXZlbnQ6IGZhbHNlCiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuaW5mby54ID0gTmFOOwogICAgICB0aGlzLmluZm8ueSA9IE5hTjsKICAgICAgdGhpcy5pbmZvLnByZXZlbnQgPSBmYWxzZTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgc2F2ZTogZnVuY3Rpb24oZSkgewogICAgICB0aGlzLmluZm8ueCA9IGUuY2xpZW50WDsKICAgICAgdGhpcy5pbmZvLnkgPSBlLmNsaWVudFk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIG1vdXNlZG93bjogZnVuY3Rpb24oZSkgewogICAgICBpZiAoaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgdGhpcy5zYXZlKGUpOwogICAgICB9CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgIGlmIChoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICB0aGlzLmZvcndhcmQoZSk7CiAgICAgIH0KICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgdG91Y2hzdGFydDogZnVuY3Rpb24oZSkgewogICAgICB0aGlzLnNhdmUoZS5jaGFuZ2VkVG91Y2hlc1swXSwgZSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHRvdWNoZW5kOiBmdW5jdGlvbihlKSB7CiAgICAgIHRoaXMuZm9yd2FyZChlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7RXZlbnQgfCBUb3VjaH0gZQogICAgICogQHBhcmFtIHtFdmVudD19IHByZXZlbnRlcgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZm9yd2FyZDogZnVuY3Rpb24oZSwgcHJldmVudGVyKSB7CiAgICAgIGxldCBkeCA9IE1hdGguYWJzKGUuY2xpZW50WCAtIHRoaXMuaW5mby54KTsKICAgICAgbGV0IGR5ID0gTWF0aC5hYnMoZS5jbGllbnRZIC0gdGhpcy5pbmZvLnkpOwogICAgICAvLyBmaW5kIG9yaWdpbmFsIHRhcmdldCBmcm9tIGBwcmV2ZW50ZXJgIGZvciBUb3VjaEV2ZW50cywgb3IgYGVgIGZvciBNb3VzZUV2ZW50cwogICAgICBsZXQgdCA9IEdlc3R1cmVzLl9maW5kT3JpZ2luYWxUYXJnZXQoLyoqIEB0eXBlIHtFdmVudH0gKi8ocHJldmVudGVyIHx8IGUpKTsKICAgICAgaWYgKCF0IHx8IChjYW5CZURpc2FibGVkWy8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0KS5sb2NhbE5hbWVdICYmIHQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBkeCxkeSBjYW4gYmUgTmFOIGlmIGBjbGlja2AgaGFzIGJlZW4gc2ltdWxhdGVkIGFuZCB0aGVyZSB3YXMgbm8gYGRvd25gIGZvciBgc3RhcnRgCiAgICAgIGlmIChpc05hTihkeCkgfHwgaXNOYU4oZHkpIHx8IChkeCA8PSBUQVBfRElTVEFOQ0UgJiYgZHkgPD0gVEFQX0RJU1RBTkNFKSB8fCBpc1N5bnRoZXRpY0NsaWNrKGUpKSB7CiAgICAgICAgLy8gcHJldmVudCB0YXBzIGZyb20gYmVpbmcgZ2VuZXJhdGVkIGlmIGFuIGV2ZW50IGhhcyBjYW5jZWxlZCB0aGVtCiAgICAgICAgaWYgKCF0aGlzLmluZm8ucHJldmVudCkgewogICAgICAgICAgR2VzdHVyZXMuX2ZpcmUodCwgJ3RhcCcsIHsKICAgICAgICAgICAgeDogZS5jbGllbnRYLAogICAgICAgICAgICB5OiBlLmNsaWVudFksCiAgICAgICAgICAgIHNvdXJjZUV2ZW50OiBlLAogICAgICAgICAgICBwcmV2ZW50ZXI6IHByZXZlbnRlcgogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfSk7CgogIC8qIGVzbGludC1lbmFibGUgdmFsaWQtanNkb2MgKi8KCiAgLyoqIEBkZXByZWNhdGVkICovCiAgR2VzdHVyZXMuZmluZE9yaWdpbmFsVGFyZ2V0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldDsKCiAgLyoqIEBkZXByZWNhdGVkICovCiAgR2VzdHVyZXMuYWRkID0gR2VzdHVyZXMuYWRkTGlzdGVuZXI7CgogIC8qKiBAZGVwcmVjYXRlZCAqLwogIEdlc3R1cmVzLnJlbW92ZSA9IEdlc3R1cmVzLnJlbW92ZUxpc3RlbmVyOwoKICBQb2x5bWVyLkdlc3R1cmVzID0gR2VzdHVyZXM7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBAY29uc3Qge1BvbHltZXIuR2VzdHVyZXN9CiAgICovCiAgY29uc3QgZ2VzdHVyZXMgPSBQb2x5bWVyLkdlc3R1cmVzOwoKICAvKioKICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgQVBJIGZvciBhZGRpbmcgUG9seW1lcidzIGNyb3NzLXBsYXRmb3JtCiAgICogZ2VzdHVyZSBldmVudHMgdG8gbm9kZXMuCiAgICoKICAgKiBUaGUgQVBJIGlzIGRlc2lnbmVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvdmVycmlkZSBwb2ludHMgaW1wbGVtZW50ZWQKICAgKiBpbiBgUG9seW1lci5UZW1wbGF0ZVN0YW1wYCBzdWNoIHRoYXQgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzIGluCiAgICogdGVtcGxhdGVzIHdpbGwgc3VwcG9ydCBnZXN0dXJlIGV2ZW50cyB3aGVuIHRoaXMgbWl4aW4gaXMgYXBwbGllZCBhbG9uZyB3aXRoCiAgICogYFBvbHltZXIuVGVtcGxhdGVTdGFtcGAuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgQVBJIGZvciBhZGRpbmcgUG9seW1lcidzIGNyb3NzLXBsYXRmb3JtCiAgICogZ2VzdHVyZSBldmVudHMgdG8gbm9kZXMKICAgKi8KICBQb2x5bWVyLkdlc3R1cmVFdmVudExpc3RlbmVycyA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfR2VzdHVyZUV2ZW50TGlzdGVuZXJzfQogICAgICovCiAgICBjbGFzcyBHZXN0dXJlRXZlbnRMaXN0ZW5lcnMgZXh0ZW5kcyBzdXBlckNsYXNzIHsKCiAgICAgIC8qKgogICAgICAgKiBBZGQgdGhlIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBub2RlIGlmIGl0IGlzIGEgZ2VzdHVyZXMgZXZlbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBhZGQgZXZlbnQgbGlzdGVuZXIgdG8KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50CiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KTp2b2lkfSBoYW5kbGVyIExpc3RlbmVyIGZ1bmN0aW9uIHRvIGFkZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgaWYgKCFnZXN0dXJlcy5hZGRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpKSB7CiAgICAgICAgICBzdXBlci5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZSB0aGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG5vZGUgaWYgaXQgaXMgYSBnZXN0dXJlcyBldmVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lciBmcm9tCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBMaXN0ZW5lciBmdW5jdGlvbiB0byByZW1vdmUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgaWYgKCFnZXN0dXJlcy5yZW1vdmVMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpKSB7CiAgICAgICAgICBzdXBlci5fcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgICAgfQogICAgICB9CgogICAgfQoKICAgIHJldHVybiBHZXN0dXJlRXZlbnRMaXN0ZW5lcnM7CgogIH0pOwoKfSkoKTsKCgogIChmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICBjb25zdCBIT1NUX0RJUiA9IC86aG9zdFwoOmRpclwoKGx0cnxydGwpXClcKS9nOwogICAgY29uc3QgSE9TVF9ESVJfUkVQTEFDTUVOVCA9ICc6aG9zdChbZGlyPSIkMSJdKSc7CgogICAgY29uc3QgRUxfRElSID0gLyhbXHNcdy0jXC5cW1xdXCpdKik6ZGlyXCgobHRyfHJ0bClcKS9nOwogICAgY29uc3QgRUxfRElSX1JFUExBQ01FTlQgPSAnOmhvc3QoW2Rpcj0iJDIiXSkgJDEnOwoKICAgIGNvbnN0IERJUl9DSEVDSyA9IC86ZGlyXCgoPzpsdHJ8cnRsKVwpLzsKICAgIAogICAgY29uc3QgU0hJTV9TSEFET1cgPSBCb29sZWFuKHdpbmRvd1snU2hhZHlET00nXSAmJiB3aW5kb3dbJ1NoYWR5RE9NJ11bJ2luVXNlJ10pOwoKICAgIC8qKgogICAgICogQHR5cGUgeyFBcnJheTwhUG9seW1lcl9EaXJNaXhpbj59CiAgICAgKi8KICAgIGNvbnN0IERJUl9JTlNUQU5DRVMgPSBbXTsKCiAgICAvKiogQHR5cGUge011dGF0aW9uT2JzZXJ2ZXJ9ICovCiAgICBsZXQgb2JzZXJ2ZXIgPSBudWxsOwoKICAgIGxldCBET0NVTUVOVF9ESVIgPSAnJzsKCiAgICBmdW5jdGlvbiBnZXRSVEwoKSB7CiAgICAgIERPQ1VNRU5UX0RJUiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpcicpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHshUG9seW1lcl9EaXJNaXhpbn0gaW5zdGFuY2UgSW5zdGFuY2UgdG8gc2V0IFJUTCBzdGF0dXMgb24KICAgICAqLwogICAgZnVuY3Rpb24gc2V0UlRMKGluc3RhbmNlKSB7CiAgICAgIGlmICghaW5zdGFuY2UuX19hdXRvRGlyT3B0T3V0KSB7CiAgICAgICAgY29uc3QgZWwgPSAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8oaW5zdGFuY2UpOwogICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGlyJywgRE9DVU1FTlRfRElSKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZURpcmVjdGlvbigpIHsKICAgICAgZ2V0UlRMKCk7CiAgICAgIERPQ1VNRU5UX0RJUiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpcicpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IERJUl9JTlNUQU5DRVMubGVuZ3RoOyBpKyspIHsKICAgICAgICBzZXRSVEwoRElSX0lOU1RBTkNFU1tpXSk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB0YWtlUmVjb3JkcygpIHsKICAgICAgaWYgKG9ic2VydmVyICYmIG9ic2VydmVyLnRha2VSZWNvcmRzKCkubGVuZ3RoKSB7CiAgICAgICAgdXBkYXRlRGlyZWN0aW9uKCk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBhbGxvd3MgZWxlbWVudHMgdG8gdXNlIHRoZSBgOmRpcmAgQ1NTIFNlbGVjdG9yIHRvIGhhdmUKICAgICAqIHRleHQgZGlyZWN0aW9uIHNwZWNpZmljIHN0eWxpbmcuCiAgICAgKgogICAgICogV2l0aCB0aGlzIG1peGluLCBhbnkgc3R5bGVzaGVldCBwcm92aWRlZCBpbiB0aGUgdGVtcGxhdGUgd2lsbCB0cmFuc2Zvcm0gYDpkaXJgIGludG8KICAgICAqIGA6aG9zdChbZGlyXSlgIGFuZCBzeW5jIGRpcmVjdGlvbiB3aXRoIHRoZSBwYWdlIHZpYSB0aGUgZWxlbWVudCdzIGBkaXJgIGF0dHJpYnV0ZS4KICAgICAqCiAgICAgKiBFbGVtZW50cyBjYW4gb3B0IG91dCBvZiB0aGUgZ2xvYmFsIHBhZ2UgdGV4dCBkaXJlY3Rpb24gYnkgc2V0dGluZyB0aGUgYGRpcmAgYXR0cmlidXRlCiAgICAgKiBkaXJlY3RseSBpbiBgcmVhZHkoKWAgb3IgaW4gSFRNTC4KICAgICAqCiAgICAgKiBDYXZlYXRzOgogICAgICogLSBBcHBsaWNhdGlvbnMgbXVzdCBzZXQgYDxodG1sIGRpcj0ibHRyIj5gIG9yIGA8aHRtbCBkaXI9InJ0bCI+YCB0byBzeW5jIGRpcmVjdGlvbgogICAgICogLSBBdXRvbWF0aWMgbGVmdC10by1yaWdodCBvciByaWdodC10by1sZWZ0IHN0eWxpbmcgaXMgc3luYydkIHdpdGggdGhlIGA8aHRtbD5gIGVsZW1lbnQgb25seS4KICAgICAqIC0gQ2hhbmdpbmcgYGRpcmAgYXQgcnVudGltZSBpcyBzdXBwb3J0ZWQuCiAgICAgKiAtIE9wdGluZyBvdXQgb2YgdGhlIGdsb2JhbCBkaXJlY3Rpb24gc3R5bGluZyBpcyBwZXJtYW5lbnQKICAgICAqCiAgICAgKiBAbWl4aW5GdW5jdGlvbgogICAgICogQHBvbHltZXIKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUFjY2Vzc29ycwogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqLwogICAgUG9seW1lci5EaXJNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbigoYmFzZSkgPT4gewoKICAgICAgaWYgKCFTSElNX1NIQURPVykgewogICAgICAgIGlmICghb2JzZXJ2ZXIpIHsKICAgICAgICAgIGdldFJUTCgpOwogICAgICAgICAgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcih1cGRhdGVEaXJlY3Rpb24pOwogICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHthdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsnZGlyJ119KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5QWNjZXNzb3JzfQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgY29uc3QgZWxlbWVudEJhc2UgPSBQb2x5bWVyLlByb3BlcnR5QWNjZXNzb3JzKGJhc2UpOwoKICAgICAgLyoqCiAgICAgICAqIEBwb2x5bWVyCiAgICAgICAqIEBtaXhpbkNsYXNzCiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0Rpck1peGlufQogICAgICAgKi8KICAgICAgY2xhc3MgRGlyIGV4dGVuZHMgZWxlbWVudEJhc2UgewoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgX3Byb2Nlc3NTdHlsZVRleHQoY3NzVGV4dCwgYmFzZVVSSSkgewogICAgICAgICAgY3NzVGV4dCA9IHN1cGVyLl9wcm9jZXNzU3R5bGVUZXh0KGNzc1RleHQsIGJhc2VVUkkpOwogICAgICAgICAgaWYgKCFTSElNX1NIQURPVyAmJiBESVJfQ0hFQ0sudGVzdChjc3NUZXh0KSkgewogICAgICAgICAgICBjc3NUZXh0ID0gdGhpcy5fcmVwbGFjZURpckluQ3NzVGV4dChjc3NUZXh0KTsKICAgICAgICAgICAgdGhpcy5fX2FjdGl2YXRlRGlyID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjc3NUZXh0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmVwbGFjZSBgOmRpcmAgaW4gdGhlIGdpdmVuIENTUyB0ZXh0CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBDU1MgdGV4dCB0byByZXBsYWNlIERJUgogICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gTW9kaWZpZWQgQ1NTCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIF9yZXBsYWNlRGlySW5Dc3NUZXh0KHRleHQpIHsKICAgICAgICAgIGxldCByZXBsYWNlZFRleHQgPSB0ZXh0OwogICAgICAgICAgcmVwbGFjZWRUZXh0ID0gcmVwbGFjZWRUZXh0LnJlcGxhY2UoSE9TVF9ESVIsIEhPU1RfRElSX1JFUExBQ01FTlQpOwogICAgICAgICAgcmVwbGFjZWRUZXh0ID0gcmVwbGFjZWRUZXh0LnJlcGxhY2UoRUxfRElSLCBFTF9ESVJfUkVQTEFDTUVOVCk7CiAgICAgICAgICByZXR1cm4gcmVwbGFjZWRUZXh0OwogICAgICAgIH0KCiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgICAgdGhpcy5fX2F1dG9EaXJPcHRPdXQgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBDbG9zdXJlIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGF0IGB0aGlzYCBpcyBhbiBIVE1MRWxlbWVudAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgcmVhZHkoKSB7CiAgICAgICAgICBzdXBlci5yZWFkeSgpOwogICAgICAgICAgdGhpcy5fX2F1dG9EaXJPcHRPdXQgPSAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcykuaGFzQXR0cmlidXRlKCdkaXInKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IElmIGl0IGV4aXN0cyBvbiBlbGVtZW50QmFzZSwgaXQgY2FuIGJlIHN1cGVyJ2QKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgaWYgKGVsZW1lbnRCYXNlLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaykgewogICAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuX19hY3RpdmF0ZURpcikgewogICAgICAgICAgICB0YWtlUmVjb3JkcygpOwogICAgICAgICAgICBESVJfSU5TVEFOQ0VTLnB1c2godGhpcyk7CiAgICAgICAgICAgIHNldFJUTCh0aGlzKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IElmIGl0IGV4aXN0cyBvbiBlbGVtZW50QmFzZSwgaXQgY2FuIGJlIHN1cGVyJ2QKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgaWYgKGVsZW1lbnRCYXNlLnByb3RvdHlwZS5kaXNjb25uZWN0ZWRDYWxsYmFjaykgewogICAgICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuX19hY3RpdmF0ZURpcikgewogICAgICAgICAgICBjb25zdCBpZHggPSBESVJfSU5TVEFOQ0VTLmluZGV4T2YodGhpcyk7CiAgICAgICAgICAgIGlmIChpZHggPiAtMSkgewogICAgICAgICAgICAgIERJUl9JTlNUQU5DRVMuc3BsaWNlKGlkeCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIERpci5fX2FjdGl2YXRlRGlyID0gZmFsc2U7CgogICAgICByZXR1cm4gRGlyOwogICAgfSk7CiAgfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewoKICAndXNlIHN0cmljdCc7CgogIC8vIHJ1biBhIGNhbGxiYWNrIHdoZW4gSFRNTEltcG9ydHMgYXJlIHJlYWR5IG9yIGltbWVkaWF0ZWx5IGlmCiAgLy8gdGhpcyBhcGkgaXMgbm90IGF2YWlsYWJsZS4KICBmdW5jdGlvbiB3aGVuSW1wb3J0c1JlYWR5KGNiKSB7CiAgICBpZiAod2luZG93LkhUTUxJbXBvcnRzKSB7CiAgICAgIEhUTUxJbXBvcnRzLndoZW5SZWFkeShjYik7CiAgICB9IGVsc2UgewogICAgICBjYigpOwogICAgfQogIH0KCiAgLyoqCiAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBpbXBvcnRpbmcgYW4gSFRNTCBkb2N1bWVudCBpbXBlcmF0aXZlbHkuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IGA8bGluayByZWw9ImltcG9ydCI+YCBlbGVtZW50IHdpdGgKICAgKiB0aGUgcHJvdmlkZWQgVVJMIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBkb2N1bWVudCB0byBzdGFydCBsb2FkaW5nLgogICAqIEluIHRoZSBgb25sb2FkYCBjYWxsYmFjaywgdGhlIGBpbXBvcnRgIHByb3BlcnR5IG9mIHRoZSBgbGlua2AKICAgKiBlbGVtZW50IHdpbGwgY29udGFpbiB0aGUgaW1wb3J0ZWQgZG9jdW1lbnQgY29udGVudHMuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7c3RyaW5nfSBocmVmIFVSTCB0byBkb2N1bWVudCB0byBsb2FkLgogICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFdmVudCk6dm9pZD19IG9ubG9hZCBDYWxsYmFjayB0byBub3RpZnkgd2hlbiBhbiBpbXBvcnQgc3VjY2Vzc2Z1bGx5CiAgICogICBsb2FkZWQuCiAgICogQHBhcmFtIHs/ZnVuY3Rpb24oIUVycm9yRXZlbnQpOnZvaWQ9fSBvbmVycm9yIENhbGxiYWNrIHRvIG5vdGlmeSB3aGVuIGFuIGltcG9ydAogICAqICAgdW5zdWNjZXNzZnVsbHkgbG9hZGVkLgogICAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdEFzeW5jIFRydWUgaWYgdGhlIGltcG9ydCBzaG91bGQgYmUgbG9hZGVkIGBhc3luY2AuCiAgICogICBEZWZhdWx0cyB0byBgZmFsc2VgLgogICAqIEByZXR1cm4geyFIVE1MTGlua0VsZW1lbnR9IFRoZSBsaW5rIGVsZW1lbnQgZm9yIHRoZSBVUkwgdG8gYmUgbG9hZGVkLgogICAqLwogIFBvbHltZXIuaW1wb3J0SHJlZiA9IGZ1bmN0aW9uKGhyZWYsIG9ubG9hZCwgb25lcnJvciwgb3B0QXN5bmMpIHsKICAgIGxldCBsaW5rID0gLyoqIEB0eXBlIHtIVE1MTGlua0VsZW1lbnR9ICovCiAgICAgIChkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZj0iJyArIGhyZWYgKyAnIl1baW1wb3J0LWhyZWZdJykpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIGxpbmsgPSAvKiogQHR5cGUge0hUTUxMaW5rRWxlbWVudH0gKi8gKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKSk7CiAgICAgIGxpbmsucmVsID0gJ2ltcG9ydCc7CiAgICAgIGxpbmsuaHJlZiA9IGhyZWY7CiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdpbXBvcnQtaHJlZicsICcnKTsKICAgIH0KICAgIC8vIGFsd2F5cyBlbnN1cmUgbGluayBoYXMgYGFzeW5jYCBhdHRyaWJ1dGUgaWYgdXNlciBzcGVjaWZpZWQgb25lLAogICAgLy8gZXZlbiBpZiBpdCB3YXMgcHJldmlvdXNseSBub3QgYXN5bmMuIFRoaXMgaXMgY29uc2lkZXJlZCBsZXNzIGNvbmZ1c2luZy4KICAgIGlmIChvcHRBc3luYykgewogICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnYXN5bmMnLCAnJyk7CiAgICB9CiAgICAvLyBOT1RFOiB0aGUgbGluayBtYXkgbm93IGJlIGluIDMgc3RhdGVzOiAoMSkgcGVuZGluZyBpbnNlcnRpb24sCiAgICAvLyAoMikgaW5mbGlnaHQsICgzKSBhbHJlYWR5IGxvYWRlZC4gSW4gZWFjaCBjYXNlLCB3ZSBuZWVkIHRvIGFkZAogICAgLy8gZXZlbnQgbGlzdGVuZXJzIHRvIHByb2Nlc3MgY2FsbGJhY2tzLgogICAgbGV0IGNsZWFudXAgPSBmdW5jdGlvbigpIHsKICAgICAgbGluay5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgbG9hZExpc3RlbmVyKTsKICAgICAgbGluay5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpOwogICAgfTsKICAgIGxldCBsb2FkTGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCkgewogICAgICBjbGVhbnVwKCk7CiAgICAgIC8vIEluIGNhc2Ugb2YgYSBzdWNjZXNzZnVsIGxvYWQsIGNhY2hlIHRoZSBsb2FkIGV2ZW50IG9uIHRoZSBsaW5rIHNvCiAgICAgIC8vIHRoYXQgaXQgY2FuIGJlIHVzZWQgdG8gc2hvcnQtY2lyY3VpdCB0aGlzIG1ldGhvZCBpbiB0aGUgZnV0dXJlIHdoZW4KICAgICAgLy8gaXQgaXMgY2FsbGVkIHdpdGggdGhlIHNhbWUgaHJlZiBwYXJhbS4KICAgICAgbGluay5fX2R5bmFtaWNJbXBvcnRMb2FkZWQgPSB0cnVlOwogICAgICBpZiAob25sb2FkKSB7CiAgICAgICAgd2hlbkltcG9ydHNSZWFkeSgoKSA9PiB7CiAgICAgICAgICBvbmxvYWQoZXZlbnQpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgbGV0IGVycm9yTGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCkgewogICAgICBjbGVhbnVwKCk7CiAgICAgIC8vIEluIGNhc2Ugb2YgYW4gZXJyb3IsIHJlbW92ZSB0aGUgbGluayBmcm9tIHRoZSBkb2N1bWVudCBzbyB0aGF0IGl0CiAgICAgIC8vIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGFnYWluIHRoZSBuZXh0IHRpbWUgYGltcG9ydEhyZWZgIGlzCiAgICAgIC8vIGNhbGxlZC4KICAgICAgaWYgKGxpbmsucGFyZW50Tm9kZSkgewogICAgICAgIGxpbmsucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsaW5rKTsKICAgICAgfQogICAgICBpZiAob25lcnJvcikgewogICAgICAgIHdoZW5JbXBvcnRzUmVhZHkoKCkgPT4gewogICAgICAgICAgb25lcnJvcihldmVudCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBsb2FkTGlzdGVuZXIpOwogICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpOwogICAgaWYgKGxpbmsucGFyZW50Tm9kZSA9PSBudWxsKSB7CiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7CiAgICAvLyBpZiB0aGUgbGluayBhbHJlYWR5IGxvYWRlZCwgZGlzcGF0Y2ggYSBmYWtlIGxvYWQgZXZlbnQKICAgIC8vIHNvIHRoYXQgbGlzdGVuZXJzIGFyZSBjYWxsZWQgYW5kIGdldCBhIHByb3BlciBldmVudCBhcmd1bWVudC4KICAgIH0gZWxzZSBpZiAobGluay5fX2R5bmFtaWNJbXBvcnRMb2FkZWQpIHsKICAgICAgbGluay5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnbG9hZCcpKTsKICAgIH0KICAgIHJldHVybiBsaW5rOwogIH07Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgc2NoZWR1bGVkID0gZmFsc2U7CiAgbGV0IGJlZm9yZVJlbmRlclF1ZXVlID0gW107CiAgbGV0IGFmdGVyUmVuZGVyUXVldWUgPSBbXTsKCiAgZnVuY3Rpb24gc2NoZWR1bGUoKSB7CiAgICBzY2hlZHVsZWQgPSB0cnVlOwogICAgLy8gYmVmb3JlIG5leHQgcmVuZGVyCiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7CiAgICAgIHNjaGVkdWxlZCA9IGZhbHNlOwogICAgICBmbHVzaFF1ZXVlKGJlZm9yZVJlbmRlclF1ZXVlKTsKICAgICAgLy8gYWZ0ZXIgdGhlIHJlbmRlcgogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHJ1blF1ZXVlKGFmdGVyUmVuZGVyUXVldWUpOwogICAgICB9KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZmx1c2hRdWV1ZShxdWV1ZSkgewogICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkgewogICAgICBjYWxsTWV0aG9kKHF1ZXVlLnNoaWZ0KCkpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcnVuUXVldWUocXVldWUpIHsKICAgIGZvciAobGV0IGk9MCwgbD1xdWV1ZS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgY2FsbE1ldGhvZChxdWV1ZS5zaGlmdCgpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNhbGxNZXRob2QoaW5mbykgewogICAgY29uc3QgY29udGV4dCA9IGluZm9bMF07CiAgICBjb25zdCBjYWxsYmFjayA9IGluZm9bMV07CiAgICBjb25zdCBhcmdzID0gaW5mb1syXTsKICAgIHRyeSB7CiAgICAgIGNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIGFyZ3MpOwogICAgfSBjYXRjaChlKSB7CiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIHRocm93IGU7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZmx1c2goKSB7CiAgICB3aGlsZSAoYmVmb3JlUmVuZGVyUXVldWUubGVuZ3RoIHx8IGFmdGVyUmVuZGVyUXVldWUubGVuZ3RoKSB7CiAgICAgIGZsdXNoUXVldWUoYmVmb3JlUmVuZGVyUXVldWUpOwogICAgICBmbHVzaFF1ZXVlKGFmdGVyUmVuZGVyUXVldWUpOwogICAgfQogICAgc2NoZWR1bGVkID0gZmFsc2U7CiAgfQoKICAvKioKICAgKiBNb2R1bGUgZm9yIHNjaGVkdWxpbmcgZmx1c2hhYmxlIHByZS1yZW5kZXIgYW5kIHBvc3QtcmVuZGVyIHRhc2tzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIGZvciBzY2hlZHVsaW5nIGZsdXNoYWJsZSBwcmUtcmVuZGVyIGFuZCBwb3N0LXJlbmRlciB0YXNrcy4KICAgKi8KICBQb2x5bWVyLlJlbmRlclN0YXR1cyA9IHsKCiAgICAvKioKICAgICAqIEVucXVldWVzIGEgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBydW4gYmVmb3JlIHRoZSBuZXh0IHJlbmRlciwgYXQKICAgICAqIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIHRpbWluZy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIGVucXVldWluZyB3b3JrIHRoYXQgcmVxdWlyZXMgRE9NIG1lYXN1cmVtZW50LAogICAgICogc2luY2UgbWVhc3VyZW1lbnQgbWF5IG5vdCBiZSByZWxpYWJsZSBpbiBjdXN0b20gZWxlbWVudCBjYWxsYmFja3MgYmVmb3JlCiAgICAgKiB0aGUgZmlyc3QgcmVuZGVyLCBhcyB3ZWxsIGFzIGZvciBiYXRjaGluZyBtZWFzdXJlbWVudCB0YXNrcyBpbiBnZW5lcmFsLgogICAgICoKICAgICAqIFRhc2tzIGluIHRoaXMgcXVldWUgbWF5IGJlIGZsdXNoZWQgYnkgY2FsbGluZyBgUG9seW1lci5SZW5kZXJTdGF0dXMuZmx1c2goKWAuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUmVuZGVyU3RhdHVzCiAgICAgKiBAcGFyYW0geyp9IGNvbnRleHQgQ29udGV4dCBvYmplY3QgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgYm91bmQgdG8KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oLi4uKik6dm9pZH0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7IUFycmF5PX0gYXJncyBBbiBhcnJheSBvZiBhcmd1bWVudHMgdG8gY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aAogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgYmVmb3JlTmV4dFJlbmRlcjogZnVuY3Rpb24oY29udGV4dCwgY2FsbGJhY2ssIGFyZ3MpIHsKICAgICAgaWYgKCFzY2hlZHVsZWQpIHsKICAgICAgICBzY2hlZHVsZSgpOwogICAgICB9CiAgICAgIGJlZm9yZVJlbmRlclF1ZXVlLnB1c2goW2NvbnRleHQsIGNhbGxiYWNrLCBhcmdzXSk7CiAgICB9LAoKICAgIC8qKgogICAgICogRW5xdWV1ZXMgYSBjYWxsYmFjayB3aGljaCB3aWxsIGJlIHJ1biBhZnRlciB0aGUgbmV4dCByZW5kZXIsIGVxdWl2YWxlbnQKICAgICAqIHRvIG9uZSB0YXNrIChgc2V0VGltZW91dGApIGFmdGVyIHRoZSBuZXh0IGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgdHVuaW5nIHRoZSBmaXJzdC1yZW5kZXIgcGVyZm9ybWFuY2Ugb2YgYW4KICAgICAqIGVsZW1lbnQgb3IgYXBwbGljYXRpb24gYnkgZGVmZXJyaW5nIG5vbi1jcml0aWNhbCB3b3JrIHVudGlsIGFmdGVyIHRoZQogICAgICogZmlyc3QgcGFpbnQuICBUeXBpY2FsIG5vbi1yZW5kZXItY3JpdGljYWwgd29yayBtYXkgaW5jbHVkZSBhZGRpbmcgVUkKICAgICAqIGV2ZW50IGxpc3RlbmVycyBhbmQgYXJpYSBhdHRyaWJ1dGVzLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlbmRlclN0YXR1cwogICAgICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgb2JqZWN0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGJvdW5kIHRvCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKC4uLiopOnZvaWR9IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0geyFBcnJheT19IGFyZ3MgQW4gYXJyYXkgb2YgYXJndW1lbnRzIHRvIGNhbGwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGgKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGFmdGVyTmV4dFJlbmRlcjogZnVuY3Rpb24oY29udGV4dCwgY2FsbGJhY2ssIGFyZ3MpIHsKICAgICAgaWYgKCFzY2hlZHVsZWQpIHsKICAgICAgICBzY2hlZHVsZSgpOwogICAgICB9CiAgICAgIGFmdGVyUmVuZGVyUXVldWUucHVzaChbY29udGV4dCwgY2FsbGJhY2ssIGFyZ3NdKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBGbHVzaGVzIGFsbCBgYmVmb3JlTmV4dFJlbmRlcmAgdGFza3MsIGZvbGxvd2VkIGJ5IGFsbCBgYWZ0ZXJOZXh0UmVuZGVyYAogICAgICogdGFza3MuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUmVuZGVyU3RhdHVzCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBmbHVzaDogZmx1c2gKCiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLy8gdW5yZXNvbHZlZAoKICBmdW5jdGlvbiByZXNvbHZlKCkgewogICAgZG9jdW1lbnQuYm9keS5yZW1vdmVBdHRyaWJ1dGUoJ3VucmVzb2x2ZWQnKTsKICB9CgogIGlmICh3aW5kb3cuV2ViQ29tcG9uZW50cykgewogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ1dlYkNvbXBvbmVudHNSZWFkeScsIHJlc29sdmUpOwogIH0gZWxzZSB7CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2ludGVyYWN0aXZlJyB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7CiAgICAgIHJlc29sdmUoKTsKICAgIH0gZWxzZSB7CiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgcmVzb2x2ZSk7CiAgICB9CiAgfQoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gbmV3U3BsaWNlKGluZGV4LCByZW1vdmVkLCBhZGRlZENvdW50KSB7CiAgICByZXR1cm4gewogICAgICBpbmRleDogaW5kZXgsCiAgICAgIHJlbW92ZWQ6IHJlbW92ZWQsCiAgICAgIGFkZGVkQ291bnQ6IGFkZGVkQ291bnQKICAgIH07CiAgfQoKICBjb25zdCBFRElUX0xFQVZFID0gMDsKICBjb25zdCBFRElUX1VQREFURSA9IDE7CiAgY29uc3QgRURJVF9BREQgPSAyOwogIGNvbnN0IEVESVRfREVMRVRFID0gMzsKCiAgLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBpcyAqYmFzZWQqIG9uIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgTGV2ZW5zaHRlaW4KICAvLyAiZWRpdCIgZGlzdGFuY2UuIFRoZSBvbmUgY2hhbmdlIGlzIHRoYXQgInVwZGF0ZXMiIGFyZSB0cmVhdGVkIGFzIHR3bwogIC8vIGVkaXRzIC0gbm90IG9uZS4gV2l0aCBBcnJheSBzcGxpY2VzLCBhbiB1cGRhdGUgaXMgcmVhbGx5IGEgZGVsZXRlCiAgLy8gZm9sbG93ZWQgYnkgYW4gYWRkLiBCeSByZXRhaW5pbmcgdGhpcywgd2Ugb3B0aW1pemUgZm9yICJrZWVwaW5nIiB0aGUKICAvLyBtYXhpbXVtIGFycmF5IGl0ZW1zIGluIHRoZSBvcmlnaW5hbCBhcnJheS4gRm9yIGV4YW1wbGU6CiAgLy8KICAvLyAgICd4eHh4MTIzJyAtPiAnMTIzeXl5eScKICAvLwogIC8vIFdpdGggMS1lZGl0IHVwZGF0ZXMsIHRoZSBzaG9ydGVzdCBwYXRoIHdvdWxkIGJlIGp1c3QgdG8gdXBkYXRlIGFsbCBzZXZlbgogIC8vIGNoYXJhY3RlcnMuIFdpdGggMi1lZGl0IHVwZGF0ZXMsIHdlIGRlbGV0ZSA0LCBsZWF2ZSAzLCBhbmQgYWRkIDQuIFRoaXMKICAvLyBsZWF2ZXMgdGhlIHN1YnN0cmluZyAnMTIzJyBpbnRhY3QuCiAgZnVuY3Rpb24gY2FsY0VkaXREaXN0YW5jZXMoY3VycmVudCwgY3VycmVudFN0YXJ0LCBjdXJyZW50RW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQsIG9sZFN0YXJ0LCBvbGRFbmQpIHsKICAgIC8vICJEZWxldGlvbiIgY29sdW1ucwogICAgbGV0IHJvd0NvdW50ID0gb2xkRW5kIC0gb2xkU3RhcnQgKyAxOwogICAgbGV0IGNvbHVtbkNvdW50ID0gY3VycmVudEVuZCAtIGN1cnJlbnRTdGFydCArIDE7CiAgICBsZXQgZGlzdGFuY2VzID0gbmV3IEFycmF5KHJvd0NvdW50KTsKCiAgICAvLyAiQWRkaXRpb24iIHJvd3MuIEluaXRpYWxpemUgbnVsbCBjb2x1bW4uCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd0NvdW50OyBpKyspIHsKICAgICAgZGlzdGFuY2VzW2ldID0gbmV3IEFycmF5KGNvbHVtbkNvdW50KTsKICAgICAgZGlzdGFuY2VzW2ldWzBdID0gaTsKICAgIH0KCiAgICAvLyBJbml0aWFsaXplIG51bGwgcm93CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHVtbkNvdW50OyBqKyspCiAgICAgIGRpc3RhbmNlc1swXVtqXSA9IGo7CgogICAgZm9yIChsZXQgaSA9IDE7IGkgPCByb3dDb3VudDsgaSsrKSB7CiAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgY29sdW1uQ291bnQ7IGorKykgewogICAgICAgIGlmIChlcXVhbHMoY3VycmVudFtjdXJyZW50U3RhcnQgKyBqIC0gMV0sIG9sZFtvbGRTdGFydCArIGkgLSAxXSkpCiAgICAgICAgICBkaXN0YW5jZXNbaV1bal0gPSBkaXN0YW5jZXNbaSAtIDFdW2ogLSAxXTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGxldCBub3J0aCA9IGRpc3RhbmNlc1tpIC0gMV1bal0gKyAxOwogICAgICAgICAgbGV0IHdlc3QgPSBkaXN0YW5jZXNbaV1baiAtIDFdICsgMTsKICAgICAgICAgIGRpc3RhbmNlc1tpXVtqXSA9IG5vcnRoIDwgd2VzdCA/IG5vcnRoIDogd2VzdDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZGlzdGFuY2VzOwogIH0KCiAgLy8gVGhpcyBzdGFydHMgYXQgdGhlIGZpbmFsIHdlaWdodCwgYW5kIHdhbGtzICJiYWNrd2FyZCIgYnkgZmluZGluZwogIC8vIHRoZSBtaW5pbXVtIHByZXZpb3VzIHdlaWdodCByZWN1cnNpdmVseSB1bnRpbCB0aGUgb3JpZ2luIG9mIHRoZSB3ZWlnaHQKICAvLyBtYXRyaXguCiAgZnVuY3Rpb24gc3BsaWNlT3BlcmF0aW9uc0Zyb21FZGl0RGlzdGFuY2VzKGRpc3RhbmNlcykgewogICAgbGV0IGkgPSBkaXN0YW5jZXMubGVuZ3RoIC0gMTsKICAgIGxldCBqID0gZGlzdGFuY2VzWzBdLmxlbmd0aCAtIDE7CiAgICBsZXQgY3VycmVudCA9IGRpc3RhbmNlc1tpXVtqXTsKICAgIGxldCBlZGl0cyA9IFtdOwogICAgd2hpbGUgKGkgPiAwIHx8IGogPiAwKSB7CiAgICAgIGlmIChpID09IDApIHsKICAgICAgICBlZGl0cy5wdXNoKEVESVRfQUREKTsKICAgICAgICBqLS07CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGogPT0gMCkgewogICAgICAgIGVkaXRzLnB1c2goRURJVF9ERUxFVEUpOwogICAgICAgIGktLTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgbm9ydGhXZXN0ID0gZGlzdGFuY2VzW2kgLSAxXVtqIC0gMV07CiAgICAgIGxldCB3ZXN0ID0gZGlzdGFuY2VzW2kgLSAxXVtqXTsKICAgICAgbGV0IG5vcnRoID0gZGlzdGFuY2VzW2ldW2ogLSAxXTsKCiAgICAgIGxldCBtaW47CiAgICAgIGlmICh3ZXN0IDwgbm9ydGgpCiAgICAgICAgbWluID0gd2VzdCA8IG5vcnRoV2VzdCA/IHdlc3QgOiBub3J0aFdlc3Q7CiAgICAgIGVsc2UKICAgICAgICBtaW4gPSBub3J0aCA8IG5vcnRoV2VzdCA/IG5vcnRoIDogbm9ydGhXZXN0OwoKICAgICAgaWYgKG1pbiA9PSBub3J0aFdlc3QpIHsKICAgICAgICBpZiAobm9ydGhXZXN0ID09IGN1cnJlbnQpIHsKICAgICAgICAgIGVkaXRzLnB1c2goRURJVF9MRUFWRSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVkaXRzLnB1c2goRURJVF9VUERBVEUpOwogICAgICAgICAgY3VycmVudCA9IG5vcnRoV2VzdDsKICAgICAgICB9CiAgICAgICAgaS0tOwogICAgICAgIGotLTsKICAgICAgfSBlbHNlIGlmIChtaW4gPT0gd2VzdCkgewogICAgICAgIGVkaXRzLnB1c2goRURJVF9ERUxFVEUpOwogICAgICAgIGktLTsKICAgICAgICBjdXJyZW50ID0gd2VzdDsKICAgICAgfSBlbHNlIHsKICAgICAgICBlZGl0cy5wdXNoKEVESVRfQUREKTsKICAgICAgICBqLS07CiAgICAgICAgY3VycmVudCA9IG5vcnRoOwogICAgICB9CiAgICB9CgogICAgZWRpdHMucmV2ZXJzZSgpOwogICAgcmV0dXJuIGVkaXRzOwogIH0KCiAgLyoqCiAgICogU3BsaWNlIFByb2plY3Rpb24gZnVuY3Rpb25zOgogICAqCiAgICogQSBzcGxpY2UgbWFwIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgaG93IGEgcHJldmlvdXMgYXJyYXkgb2YgaXRlbXMKICAgKiB3YXMgdHJhbnNmb3JtZWQgaW50byBhIG5ldyBhcnJheSBvZiBpdGVtcy4gQ29uY2VwdHVhbGx5IGl0IGlzIGEgbGlzdCBvZgogICAqIHR1cGxlcyBvZgogICAqCiAgICogICA8aW5kZXgsIHJlbW92ZWQsIGFkZGVkQ291bnQ+CiAgICoKICAgKiB3aGljaCBhcmUga2VwdCBpbiBhc2NlbmRpbmcgaW5kZXggb3JkZXIgb2YuIFRoZSB0dXBsZSByZXByZXNlbnRzIHRoYXQgYXQKICAgKiB0aGUgfGluZGV4fCwgfHJlbW92ZWR8IHNlcXVlbmNlIG9mIGl0ZW1zIHdlcmUgcmVtb3ZlZCwgYW5kIGNvdW50aW5nIGZvcndhcmQKICAgKiBmcm9tIHxpbmRleHwsIHxhZGRlZENvdW50fCBpdGVtcyB3ZXJlIGFkZGVkLgogICAqLwoKICAvKioKICAgKiBMYWNraW5nIGluZGl2aWR1YWwgc3BsaWNlIG11dGF0aW9uIGluZm9ybWF0aW9uLCB0aGUgbWluaW1hbCBzZXQgb2YKICAgKiBzcGxpY2VzIGNhbiBiZSBzeW50aGVzaXplZCBnaXZlbiB0aGUgcHJldmlvdXMgc3RhdGUgYW5kIGZpbmFsIHN0YXRlIG9mIGFuCiAgICogYXJyYXkuIFRoZSBiYXNpYyBhcHByb2FjaCBpcyB0byBjYWxjdWxhdGUgdGhlIGVkaXQgZGlzdGFuY2UgbWF0cml4IGFuZAogICAqIGNob29zZSB0aGUgc2hvcnRlc3QgcGF0aCB0aHJvdWdoIGl0LgogICAqCiAgICogQ29tcGxleGl0eTogTyhsICogcCkKICAgKiAgIGw6IFRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgYXJyYXkKICAgKiAgIHA6IFRoZSBsZW5ndGggb2YgdGhlIG9sZCBhcnJheQogICAqCiAgICogQHBhcmFtIHshQXJyYXl9IGN1cnJlbnQgVGhlIGN1cnJlbnQgImNoYW5nZWQiIGFycmF5IGZvciB3aGljaCB0bwogICAqIGNhbGN1bGF0ZSBzcGxpY2VzLgogICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50U3RhcnQgU3RhcnRpbmcgaW5kZXggaW4gdGhlIGBjdXJyZW50YCBhcnJheSBmb3IKICAgKiB3aGljaCBzcGxpY2VzIGFyZSBjYWxjdWxhdGVkLgogICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50RW5kIEVuZGluZyBpbmRleCBpbiB0aGUgYGN1cnJlbnRgIGFycmF5IGZvcgogICAqIHdoaWNoIHNwbGljZXMgYXJlIGNhbGN1bGF0ZWQuCiAgICogQHBhcmFtIHshQXJyYXl9IG9sZCBUaGUgb3JpZ2luYWwgInVuY2hhbmdlZCIgYXJyYXkgdG8gY29tcGFyZSBgY3VycmVudGAKICAgKiBhZ2FpbnN0IHRvIGRldGVybWluZSBzcGxpY2VzLgogICAqIEBwYXJhbSB7bnVtYmVyfSBvbGRTdGFydCBTdGFydGluZyBpbmRleCBpbiB0aGUgYG9sZGAgYXJyYXkgZm9yCiAgICogd2hpY2ggc3BsaWNlcyBhcmUgY2FsY3VsYXRlZC4KICAgKiBAcGFyYW0ge251bWJlcn0gb2xkRW5kIEVuZGluZyBpbmRleCBpbiB0aGUgYG9sZGAgYXJyYXkgZm9yCiAgICogd2hpY2ggc3BsaWNlcyBhcmUgY2FsY3VsYXRlZC4KICAgKiBAcmV0dXJuIHshQXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZCBvYmplY3RzLiBFYWNoIG9mIHRoZXNlCiAgICogY29udGFpbnM6IGBpbmRleGAgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBzcGxpY2Ugb2NjdXJyZWQ7IGByZW1vdmVkYAogICAqIHRoZSBhcnJheSBvZiByZW1vdmVkIGl0ZW1zIGZyb20gdGhpcyBsb2NhdGlvbjsgYGFkZGVkQ291bnRgIHRoZSBudW1iZXIKICAgKiBvZiBpdGVtcyBhZGRlZCBhdCB0aGlzIGxvY2F0aW9uLgogICAqLwogIGZ1bmN0aW9uIGNhbGNTcGxpY2VzKGN1cnJlbnQsIGN1cnJlbnRTdGFydCwgY3VycmVudEVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgb2xkLCBvbGRTdGFydCwgb2xkRW5kKSB7CiAgICBsZXQgcHJlZml4Q291bnQgPSAwOwogICAgbGV0IHN1ZmZpeENvdW50ID0gMDsKICAgIGxldCBzcGxpY2U7CgogICAgbGV0IG1pbkxlbmd0aCA9IE1hdGgubWluKGN1cnJlbnRFbmQgLSBjdXJyZW50U3RhcnQsIG9sZEVuZCAtIG9sZFN0YXJ0KTsKICAgIGlmIChjdXJyZW50U3RhcnQgPT0gMCAmJiBvbGRTdGFydCA9PSAwKQogICAgICBwcmVmaXhDb3VudCA9IHNoYXJlZFByZWZpeChjdXJyZW50LCBvbGQsIG1pbkxlbmd0aCk7CgogICAgaWYgKGN1cnJlbnRFbmQgPT0gY3VycmVudC5sZW5ndGggJiYgb2xkRW5kID09IG9sZC5sZW5ndGgpCiAgICAgIHN1ZmZpeENvdW50ID0gc2hhcmVkU3VmZml4KGN1cnJlbnQsIG9sZCwgbWluTGVuZ3RoIC0gcHJlZml4Q291bnQpOwoKICAgIGN1cnJlbnRTdGFydCArPSBwcmVmaXhDb3VudDsKICAgIG9sZFN0YXJ0ICs9IHByZWZpeENvdW50OwogICAgY3VycmVudEVuZCAtPSBzdWZmaXhDb3VudDsKICAgIG9sZEVuZCAtPSBzdWZmaXhDb3VudDsKCiAgICBpZiAoY3VycmVudEVuZCAtIGN1cnJlbnRTdGFydCA9PSAwICYmIG9sZEVuZCAtIG9sZFN0YXJ0ID09IDApCiAgICAgIHJldHVybiBbXTsKCiAgICBpZiAoY3VycmVudFN0YXJ0ID09IGN1cnJlbnRFbmQpIHsKICAgICAgc3BsaWNlID0gbmV3U3BsaWNlKGN1cnJlbnRTdGFydCwgW10sIDApOwogICAgICB3aGlsZSAob2xkU3RhcnQgPCBvbGRFbmQpCiAgICAgICAgc3BsaWNlLnJlbW92ZWQucHVzaChvbGRbb2xkU3RhcnQrK10pOwoKICAgICAgcmV0dXJuIFsgc3BsaWNlIF07CiAgICB9IGVsc2UgaWYgKG9sZFN0YXJ0ID09IG9sZEVuZCkKICAgICAgcmV0dXJuIFsgbmV3U3BsaWNlKGN1cnJlbnRTdGFydCwgW10sIGN1cnJlbnRFbmQgLSBjdXJyZW50U3RhcnQpIF07CgogICAgbGV0IG9wcyA9IHNwbGljZU9wZXJhdGlvbnNGcm9tRWRpdERpc3RhbmNlcygKICAgICAgICBjYWxjRWRpdERpc3RhbmNlcyhjdXJyZW50LCBjdXJyZW50U3RhcnQsIGN1cnJlbnRFbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQsIG9sZFN0YXJ0LCBvbGRFbmQpKTsKCiAgICBzcGxpY2UgPSB1bmRlZmluZWQ7CiAgICBsZXQgc3BsaWNlcyA9IFtdOwogICAgbGV0IGluZGV4ID0gY3VycmVudFN0YXJ0OwogICAgbGV0IG9sZEluZGV4ID0gb2xkU3RhcnQ7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykgewogICAgICBzd2l0Y2gob3BzW2ldKSB7CiAgICAgICAgY2FzZSBFRElUX0xFQVZFOgogICAgICAgICAgaWYgKHNwbGljZSkgewogICAgICAgICAgICBzcGxpY2VzLnB1c2goc3BsaWNlKTsKICAgICAgICAgICAgc3BsaWNlID0gdW5kZWZpbmVkOwogICAgICAgICAgfQoKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICBvbGRJbmRleCsrOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBFRElUX1VQREFURToKICAgICAgICAgIGlmICghc3BsaWNlKQogICAgICAgICAgICBzcGxpY2UgPSBuZXdTcGxpY2UoaW5kZXgsIFtdLCAwKTsKCiAgICAgICAgICBzcGxpY2UuYWRkZWRDb3VudCsrOwogICAgICAgICAgaW5kZXgrKzsKCiAgICAgICAgICBzcGxpY2UucmVtb3ZlZC5wdXNoKG9sZFtvbGRJbmRleF0pOwogICAgICAgICAgb2xkSW5kZXgrKzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRURJVF9BREQ6CiAgICAgICAgICBpZiAoIXNwbGljZSkKICAgICAgICAgICAgc3BsaWNlID0gbmV3U3BsaWNlKGluZGV4LCBbXSwgMCk7CgogICAgICAgICAgc3BsaWNlLmFkZGVkQ291bnQrKzsKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEVESVRfREVMRVRFOgogICAgICAgICAgaWYgKCFzcGxpY2UpCiAgICAgICAgICAgIHNwbGljZSA9IG5ld1NwbGljZShpbmRleCwgW10sIDApOwoKICAgICAgICAgIHNwbGljZS5yZW1vdmVkLnB1c2gob2xkW29sZEluZGV4XSk7CiAgICAgICAgICBvbGRJbmRleCsrOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoc3BsaWNlKSB7CiAgICAgIHNwbGljZXMucHVzaChzcGxpY2UpOwogICAgfQogICAgcmV0dXJuIHNwbGljZXM7CiAgfQoKICBmdW5jdGlvbiBzaGFyZWRQcmVmaXgoY3VycmVudCwgb2xkLCBzZWFyY2hMZW5ndGgpIHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VhcmNoTGVuZ3RoOyBpKyspCiAgICAgIGlmICghZXF1YWxzKGN1cnJlbnRbaV0sIG9sZFtpXSkpCiAgICAgICAgcmV0dXJuIGk7CiAgICByZXR1cm4gc2VhcmNoTGVuZ3RoOwogIH0KCiAgZnVuY3Rpb24gc2hhcmVkU3VmZml4KGN1cnJlbnQsIG9sZCwgc2VhcmNoTGVuZ3RoKSB7CiAgICBsZXQgaW5kZXgxID0gY3VycmVudC5sZW5ndGg7CiAgICBsZXQgaW5kZXgyID0gb2xkLmxlbmd0aDsKICAgIGxldCBjb3VudCA9IDA7CiAgICB3aGlsZSAoY291bnQgPCBzZWFyY2hMZW5ndGggJiYgZXF1YWxzKGN1cnJlbnRbLS1pbmRleDFdLCBvbGRbLS1pbmRleDJdKSkKICAgICAgY291bnQrKzsKCiAgICByZXR1cm4gY291bnQ7CiAgfQoKICBmdW5jdGlvbiBjYWxjdWxhdGVTcGxpY2VzKGN1cnJlbnQsIHByZXZpb3VzKSB7CiAgICByZXR1cm4gY2FsY1NwbGljZXMoY3VycmVudCwgMCwgY3VycmVudC5sZW5ndGgsIHByZXZpb3VzLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMubGVuZ3RoKTsKICB9CgogIGZ1bmN0aW9uIGVxdWFscyhjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUpIHsKICAgIHJldHVybiBjdXJyZW50VmFsdWUgPT09IHByZXZpb3VzVmFsdWU7CiAgfQoKICAvKioKICAgKiBAbmFtZXNwYWNlCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBNb2R1bGUgdGhhdCBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGRpZmZpbmcgYXJyYXlzLgogICAqLwogIFBvbHltZXIuQXJyYXlTcGxpY2UgPSB7CiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZHMgaW5kaWNhdGluZyB0aGUgbWluaW11bSBlZGl0cyByZXF1aXJlZAogICAgICogdG8gdHJhbnNmb3JtIHRoZSBgcHJldmlvdXNgIGFycmF5IGludG8gdGhlIGBjdXJyZW50YCBhcnJheS4KICAgICAqCiAgICAgKiBTcGxpY2UgcmVjb3JkcyBhcmUgb3JkZXJlZCBieSBpbmRleCBhbmQgY29udGFpbiB0aGUgZm9sbG93aW5nIGZpZWxkczoKICAgICAqIC0gYGluZGV4YDogaW5kZXggd2hlcmUgZWRpdCBzdGFydGVkCiAgICAgKiAtIGByZW1vdmVkYDogYXJyYXkgb2YgcmVtb3ZlZCBpdGVtcyBmcm9tIHRoaXMgaW5kZXgKICAgICAqIC0gYGFkZGVkQ291bnRgOiBudW1iZXIgb2YgaXRlbXMgYWRkZWQgYXQgdGhpcyBpbmRleAogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYmFzZWQgb24gdGhlIExldmVuc2h0ZWluICJtaW5pbXVtIGVkaXQgZGlzdGFuY2UiCiAgICAgKiBhbGdvcml0aG0uIE5vdGUgdGhhdCB1cGRhdGVzIGFyZSB0cmVhdGVkIGFzIHJlbW92YWwgZm9sbG93ZWQgYnkgYWRkaXRpb24uCiAgICAgKgogICAgICogVGhlIHdvcnN0LWNhc2UgdGltZSBjb21wbGV4aXR5IG9mIHRoaXMgYWxnb3JpdGhtIGlzIGBPKGwgKiBwKWAKICAgICAqICAgbDogVGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCBhcnJheQogICAgICogICBwOiBUaGUgbGVuZ3RoIG9mIHRoZSBwcmV2aW91cyBhcnJheQogICAgICoKICAgICAqIEhvd2V2ZXIsIHRoZSB3b3JzdC1jYXNlIGNvbXBsZXhpdHkgaXMgcmVkdWNlZCBieSBhbiBgTyhuKWAgb3B0aW1pemF0aW9uCiAgICAgKiB0byBkZXRlY3QgYW55IHNoYXJlZCBwcmVmaXggJiBzdWZmaXggYmV0d2VlbiB0aGUgdHdvIGFycmF5cyBhbmQgb25seQogICAgICogcGVyZm9ybSB0aGUgbW9yZSBleHBlbnNpdmUgbWluaW11bSBlZGl0IGRpc3RhbmNlIGNhbGN1bGF0aW9uIG92ZXIgdGhlCiAgICAgKiBub24tc2hhcmVkIHBvcnRpb25zIG9mIHRoZSBhcnJheXMuCiAgICAgKgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5BcnJheVNwbGljZQogICAgICogQHBhcmFtIHshQXJyYXl9IGN1cnJlbnQgVGhlICJjaGFuZ2VkIiBhcnJheSBmb3Igd2hpY2ggc3BsaWNlcyB3aWxsIGJlCiAgICAgKiBjYWxjdWxhdGVkLgogICAgICogQHBhcmFtIHshQXJyYXl9IHByZXZpb3VzIFRoZSAidW5jaGFuZ2VkIiBvcmlnaW5hbCBhcnJheSB0byBjb21wYXJlCiAgICAgKiBgY3VycmVudGAgYWdhaW5zdCB0byBkZXRlcm1pbmUgdGhlIHNwbGljZXMuCiAgICAgKiBAcmV0dXJuIHshQXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZCBvYmplY3RzLiBFYWNoIG9mIHRoZXNlCiAgICAgKiBjb250YWluczogYGluZGV4YCB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHNwbGljZSBvY2N1cnJlZDsgYHJlbW92ZWRgCiAgICAgKiB0aGUgYXJyYXkgb2YgcmVtb3ZlZCBpdGVtcyBmcm9tIHRoaXMgbG9jYXRpb247IGBhZGRlZENvdW50YCB0aGUgbnVtYmVyCiAgICAgKiBvZiBpdGVtcyBhZGRlZCBhdCB0aGlzIGxvY2F0aW9uLgogICAgICovCiAgICBjYWxjdWxhdGVTcGxpY2VzCiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIGBub2RlYCBpcyBhIHNsb3QgZWxlbWVudAogICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIHRlc3QuCiAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBgbm9kZWAgaXMgYSBzbG90CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBpc1Nsb3Qobm9kZSkgewogICAgcmV0dXJuIChub2RlLmxvY2FsTmFtZSA9PT0gJ3Nsb3QnKTsKICB9CgogIC8qKgogICAqIENsYXNzIHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyAoYWRkaXRpb25zIG9yIHJlbW92YWxzKSB0bwogICAqICJmbGF0dGVuZWQgbm9kZXMiIG9uIGEgZ2l2ZW4gYG5vZGVgLiBUaGUgbGlzdCBvZiBmbGF0dGVuZWQgbm9kZXMgY29uc2lzdHMKICAgKiBvZiBhIG5vZGUncyBjaGlsZHJlbiBhbmQsIGZvciBhbnkgY2hpbGRyZW4gdGhhdCBhcmUgYDxzbG90PmAgZWxlbWVudHMsCiAgICogdGhlIGV4cGFuZGVkIGZsYXR0ZW5lZCBsaXN0IG9mIGBhc3NpZ25lZE5vZGVzYC4KICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIG9ic2VydmVkIG5vZGUgaGFzIGNoaWxkcmVuIGA8YT48L2E+PHNsb3Q+PC9zbG90PjxiPjwvYj5gCiAgICogYW5kIHRoZSBgPHNsb3Q+YCBoYXMgb25lIGA8ZGl2PmAgYXNzaWduZWQgdG8gaXQsIHRoZW4gdGhlIGZsYXR0ZW5lZAogICAqIG5vZGVzIGxpc3QgaXMgYDxhPjwvYT48ZGl2PjwvZGl2PjxiPjwvYj5gLiBJZiB0aGUgYDxzbG90PmAgaGFzIG90aGVyCiAgICogYDxzbG90PmAgZWxlbWVudHMgYXNzaWduZWQgdG8gaXQsIHRoZXNlIGFyZSBmbGF0dGVuZWQgYXMgd2VsbC4KICAgKgogICAqIFRoZSBwcm92aWRlZCBgY2FsbGJhY2tgIGlzIGNhbGxlZCB3aGVuZXZlciBhbnkgY2hhbmdlIHRvIHRoaXMgbGlzdAogICAqIG9mIGZsYXR0ZW5lZCBub2RlcyBvY2N1cnMsIHdoZXJlIGFuIGFkZGl0aW9uIG9yIHJlbW92YWwgb2YgYSBub2RlIGlzCiAgICogY29uc2lkZXJlZCBhIGNoYW5nZS4gVGhlIGBjYWxsYmFja2AgaXMgY2FsbGVkIHdpdGggb25lIGFyZ3VtZW50LCBhbiBvYmplY3QKICAgKiBjb250YWluaW5nIGFuIGFycmF5IG9mIGFueSBgYWRkZWROb2Rlc2AgYW5kIGByZW1vdmVkTm9kZXNgLgogICAqCiAgICogTm90ZTogdGhlIGNhbGxiYWNrIGlzIGNhbGxlZCBhc3luY2hyb25vdXMgdG8gYW55IGNoYW5nZXMKICAgKiBhdCBhIG1pY3JvdGFzayBjaGVja3BvaW50LiBUaGlzIGlzIGJlY2F1c2Ugb2JzZXJ2YXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nCiAgICogYE11dGF0aW9uT2JzZXJ2ZXJgIGFuZCB0aGUgYDxzbG90PmAgZWxlbWVudCdzIGBzbG90Y2hhbmdlYCBldmVudCB3aGljaAogICAqIGFyZSBhc3luY2hyb25vdXMuCiAgICoKICAgKiBBbiBleGFtcGxlOgogICAqIGBgYGpzCiAgICogY2xhc3MgVGVzdFNlbGZPYnNlcnZlIGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAndGVzdC1zZWxmLW9ic2VydmUnO30KICAgKiAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAqICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAqICAgICB0aGlzLl9vYnNlcnZlciA9IG5ldyBQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIodGhpcywgKGluZm8pID0+IHsKICAgKiAgICAgICB0aGlzLmluZm8gPSBpbmZvOwogICAqICAgICB9KTsKICAgKiAgIH0KICAgKiAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAqICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAqICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICogICB9CiAgICogfQogICAqIGN1c3RvbUVsZW1lbnRzLmRlZmluZShUZXN0U2VsZk9ic2VydmUuaXMsIFRlc3RTZWxmT2JzZXJ2ZSk7CiAgICogYGBgCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IENsYXNzIHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyAoYWRkaXRpb25zIG9yIHJlbW92YWxzKSB0bwogICAqICJmbGF0dGVuZWQgbm9kZXMiIG9uIGEgZ2l2ZW4gYG5vZGVgLgogICAqLwogIGNsYXNzIEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIgewoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBmbGF0dGVuZWQgbm9kZXMgZm9yIHRoZSBnaXZlbiBgbm9kZWAuCiAgICAgKiBUaGlzIGxpc3QgY29uc2lzdHMgb2YgYSBub2RlJ3MgY2hpbGRyZW4gYW5kLCBmb3IgYW55IGNoaWxkcmVuCiAgICAgKiB0aGF0IGFyZSBgPHNsb3Q+YCBlbGVtZW50cywgdGhlIGV4cGFuZGVkIGZsYXR0ZW5lZCBsaXN0IG9mIGBhc3NpZ25lZE5vZGVzYC4KICAgICAqIEZvciBleGFtcGxlLCBpZiB0aGUgb2JzZXJ2ZWQgbm9kZSBoYXMgY2hpbGRyZW4gYDxhPjwvYT48c2xvdD48L3Nsb3Q+PGI+PC9iPmAKICAgICAqIGFuZCB0aGUgYDxzbG90PmAgaGFzIG9uZSBgPGRpdj5gIGFzc2lnbmVkIHRvIGl0LCB0aGVuIHRoZSBmbGF0dGVuZWQKICAgICAqIG5vZGVzIGxpc3QgaXMgYDxhPjwvYT48ZGl2PjwvZGl2PjxiPjwvYj5gLiBJZiB0aGUgYDxzbG90PmAgaGFzIG90aGVyCiAgICAgKiBgPHNsb3Q+YCBlbGVtZW50cyBhc3NpZ25lZCB0byBpdCwgdGhlc2UgYXJlIGZsYXR0ZW5lZCBhcyB3ZWxsLgogICAgICoKICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8SFRNTFNsb3RFbGVtZW50fSBub2RlIFRoZSBub2RlIGZvciB3aGljaCB0byByZXR1cm4gdGhlIGxpc3Qgb2YgZmxhdHRlbmVkIG5vZGVzLgogICAgICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIGZsYXR0ZW5lZCBub2RlcyBmb3IgdGhlIGdpdmVuIGBub2RlYC4KICAgICovCiAgICBzdGF0aWMgZ2V0RmxhdHRlbmVkTm9kZXMobm9kZSkgewogICAgICBpZiAoaXNTbG90KG5vZGUpKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7SFRNTFNsb3RFbGVtZW50fSAqLyhub2RlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWFzc2lnbgogICAgICAgIHJldHVybiBub2RlLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46IHRydWV9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShub2RlLmNoaWxkTm9kZXMpLm1hcCgobm9kZSkgPT4gewogICAgICAgICAgaWYgKGlzU2xvdChub2RlKSkgewogICAgICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtIVE1MU2xvdEVsZW1lbnR9ICovKG5vZGUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgICAgIHJldHVybiBub2RlLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46IHRydWV9KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBbbm9kZV07CiAgICAgICAgICB9CiAgICAgICAgfSkucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCBOb2RlIG9uIHdoaWNoIHRvIGxpc3RlbiBmb3IgY2hhbmdlcy4KICAgICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFbGVtZW50LCB7IHRhcmdldDogIUVsZW1lbnQsIGFkZGVkTm9kZXM6ICFBcnJheTwhRWxlbWVudD4sIHJlbW92ZWROb2RlczogIUFycmF5PCFFbGVtZW50PiB9KTp2b2lkfSBjYWxsYmFjayBGdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGVyZSBhcmUgYWRkaXRpb25zCiAgICAgKiBvciByZW1vdmFscyBmcm9tIHRoZSB0YXJnZXQncyBsaXN0IG9mIGZsYXR0ZW5lZCBub2Rlcy4KICAgICovCiAgICBjb25zdHJ1Y3Rvcih0YXJnZXQsIGNhbGxiYWNrKSB7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7TXV0YXRpb25PYnNlcnZlcn0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlciA9IG51bGw7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7TXV0YXRpb25PYnNlcnZlcn0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIgPSBudWxsOwogICAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTsKICAgICAgLyoqCiAgICAgICAqIEB0eXBlIHtFbGVtZW50fQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgdGhpcy5fdGFyZ2V0ID0gdGFyZ2V0OwogICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgIHRoaXMuX2VmZmVjdGl2ZU5vZGVzID0gW107CiAgICAgIHRoaXMuX29ic2VydmVyID0gbnVsbDsKICAgICAgdGhpcy5fc2NoZWR1bGVkID0gZmFsc2U7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oKX0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX2JvdW5kU2NoZWR1bGUgPSAoKSA9PiB7CiAgICAgICAgdGhpcy5fc2NoZWR1bGUoKTsKICAgICAgfTsKICAgICAgdGhpcy5jb25uZWN0KCk7CiAgICAgIHRoaXMuX3NjaGVkdWxlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBY3RpdmF0ZXMgYW4gb2JzZXJ2ZXIuIFRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkIHdoZW4KICAgICAqIGEgYEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJgIGlzIGNyZWF0ZWQuIEl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCB0bwogICAgICogcmUtYWN0aXZhdGUgYW4gb2JzZXJ2ZXIgdGhhdCBoYXMgYmVlbiBkZWFjdGl2YXRlZCB2aWEgdGhlIGBkaXNjb25uZWN0YCBtZXRob2QuCiAgICAgKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgY29ubmVjdCgpIHsKICAgICAgaWYgKGlzU2xvdCh0aGlzLl90YXJnZXQpKSB7CiAgICAgICAgdGhpcy5fbGlzdGVuU2xvdHMoW3RoaXMuX3RhcmdldF0pOwogICAgICB9IGVsc2UgaWYgKHRoaXMuX3RhcmdldC5jaGlsZHJlbikgewogICAgICAgIHRoaXMuX2xpc3RlblNsb3RzKHRoaXMuX3RhcmdldC5jaGlsZHJlbik7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSkgewogICAgICAgICAgdGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyID0KICAgICAgICAgICAgU2hhZHlET00ub2JzZXJ2ZUNoaWxkcmVuKHRoaXMuX3RhcmdldCwgKG11dGF0aW9ucykgPT4gewogICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NNdXRhdGlvbnMobXV0YXRpb25zKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIgPQogICAgICAgICAgICBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7CiAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc011dGF0aW9ucyhtdXRhdGlvbnMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl90YXJnZXQsIHtjaGlsZExpc3Q6IHRydWV9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5fY29ubmVjdGVkID0gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIERlYWN0aXZhdGVzIHRoZSBmbGF0dGVuZWQgbm9kZXMgb2JzZXJ2ZXIuIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QKICAgICAqIHRoZSBvYnNlcnZlciBjYWxsYmFjayB3aWxsIG5vdCBiZSBjYWxsZWQgd2hlbiBjaGFuZ2VzIHRvIGZsYXR0ZW5lZCBub2RlcwogICAgICogb2NjdXIuIFRoZSBgY29ubmVjdGAgbWV0aG9kIG1heSBiZSBzdWJzZXF1ZW50bHkgY2FsbGVkIHRvIHJlYWN0aXZhdGUKICAgICAqIHRoZSBvYnNlcnZlci4KICAgICAqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBkaXNjb25uZWN0KCkgewogICAgICBpZiAoaXNTbG90KHRoaXMuX3RhcmdldCkpIHsKICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKFt0aGlzLl90YXJnZXRdKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLl90YXJnZXQuY2hpbGRyZW4pIHsKICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKHRoaXMuX3RhcmdldC5jaGlsZHJlbik7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSAmJiB0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIpIHsKICAgICAgICAgIFNoYWR5RE9NLnVub2JzZXJ2ZUNoaWxkcmVuKHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlcik7CiAgICAgICAgICB0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIgPSBudWxsOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlcikgewogICAgICAgICAgdGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICB0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3NjaGVkdWxlKCkgewogICAgICBpZiAoIXRoaXMuX3NjaGVkdWxlZCkgewogICAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IHRydWU7CiAgICAgICAgUG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKCgpID0+IHRoaXMuZmx1c2goKSk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7QXJyYXk8TXV0YXRpb25SZWNvcmQ+fSBtdXRhdGlvbnMgTXV0YXRpb25zIHNpZ25hbGVkIGJ5IHRoZSBtdXRhdGlvbiBvYnNlcnZlcgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIF9wcm9jZXNzTXV0YXRpb25zKG11dGF0aW9ucykgewogICAgICB0aGlzLl9wcm9jZXNzU2xvdE11dGF0aW9ucyhtdXRhdGlvbnMpOwogICAgICB0aGlzLmZsdXNoKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge0FycmF5PE11dGF0aW9uUmVjb3JkPn0gbXV0YXRpb25zIE11dGF0aW9ucyBzaWduYWxlZCBieSB0aGUgbXV0YXRpb24gb2JzZXJ2ZXIKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBfcHJvY2Vzc1Nsb3RNdXRhdGlvbnMobXV0YXRpb25zKSB7CiAgICAgIGlmIChtdXRhdGlvbnMpIHsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBtdXRhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGxldCBtdXRhdGlvbiA9IG11dGF0aW9uc1tpXTsKICAgICAgICAgIGlmIChtdXRhdGlvbi5hZGRlZE5vZGVzKSB7CiAgICAgICAgICAgIHRoaXMuX2xpc3RlblNsb3RzKG11dGF0aW9uLmFkZGVkTm9kZXMpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG11dGF0aW9uLnJlbW92ZWROb2RlcykgewogICAgICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBGbHVzaGVzIHRoZSBvYnNlcnZlciBjYXVzaW5nIGFueSBwZW5kaW5nIGNoYW5nZXMgdG8gYmUgaW1tZWRpYXRlbHkKICAgICAqIGRlbGl2ZXJlZCB0aGUgb2JzZXJ2ZXIgY2FsbGJhY2suIEJ5IGRlZmF1bHQgdGhlc2UgY2hhbmdlcyBhcmUgZGVsaXZlcmVkCiAgICAgKiBhc3luY2hyb25vdXNseSBhdCB0aGUgbmV4dCBtaWNyb3Rhc2sgY2hlY2twb2ludC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IHBlbmRpbmcgY2hhbmdlcyBjYXVzZWQgdGhlIG9ic2VydmVyCiAgICAgKiBjYWxsYmFjayB0byBydW4uCiAgICAgKi8KICAgIGZsdXNoKCkgewogICAgICBpZiAoIXRoaXMuX2Nvbm5lY3RlZCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAod2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgU2hhZHlET00uZmx1c2goKTsKICAgICAgfQogICAgICBpZiAodGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlcikgewogICAgICAgIHRoaXMuX3Byb2Nlc3NTbG90TXV0YXRpb25zKHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIudGFrZVJlY29yZHMoKSk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyKSB7CiAgICAgICAgdGhpcy5fcHJvY2Vzc1Nsb3RNdXRhdGlvbnModGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyLnRha2VSZWNvcmRzKCkpOwogICAgICB9CiAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IGZhbHNlOwogICAgICBsZXQgaW5mbyA9IHsKICAgICAgICB0YXJnZXQ6IHRoaXMuX3RhcmdldCwKICAgICAgICBhZGRlZE5vZGVzOiBbXSwKICAgICAgICByZW1vdmVkTm9kZXM6IFtdCiAgICAgIH07CiAgICAgIGxldCBuZXdOb2RlcyA9IHRoaXMuY29uc3RydWN0b3IuZ2V0RmxhdHRlbmVkTm9kZXModGhpcy5fdGFyZ2V0KTsKICAgICAgbGV0IHNwbGljZXMgPSBQb2x5bWVyLkFycmF5U3BsaWNlLmNhbGN1bGF0ZVNwbGljZXMobmV3Tm9kZXMsCiAgICAgICAgdGhpcy5fZWZmZWN0aXZlTm9kZXMpOwogICAgICAvLyBwcm9jZXNzIHJlbW92YWxzCiAgICAgIGZvciAobGV0IGk9MCwgczsgKGk8c3BsaWNlcy5sZW5ndGgpICYmIChzPXNwbGljZXNbaV0pOyBpKyspIHsKICAgICAgICBmb3IgKGxldCBqPTAsIG47IChqIDwgcy5yZW1vdmVkLmxlbmd0aCkgJiYgKG49cy5yZW1vdmVkW2pdKTsgaisrKSB7CiAgICAgICAgICBpbmZvLnJlbW92ZWROb2Rlcy5wdXNoKG4pOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBwcm9jZXNzIGFkZHMKICAgICAgZm9yIChsZXQgaT0wLCBzOyAoaTxzcGxpY2VzLmxlbmd0aCkgJiYgKHM9c3BsaWNlc1tpXSk7IGkrKykgewogICAgICAgIGZvciAobGV0IGo9cy5pbmRleDsgaiA8IHMuaW5kZXggKyBzLmFkZGVkQ291bnQ7IGorKykgewogICAgICAgICAgaW5mby5hZGRlZE5vZGVzLnB1c2gobmV3Tm9kZXNbal0pOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyB1cGRhdGUgY2FjaGUKICAgICAgdGhpcy5fZWZmZWN0aXZlTm9kZXMgPSBuZXdOb2RlczsKICAgICAgbGV0IGRpZEZsdXNoID0gZmFsc2U7CiAgICAgIGlmIChpbmZvLmFkZGVkTm9kZXMubGVuZ3RoIHx8IGluZm8ucmVtb3ZlZE5vZGVzLmxlbmd0aCkgewogICAgICAgIGRpZEZsdXNoID0gdHJ1ZTsKICAgICAgICB0aGlzLmNhbGxiYWNrLmNhbGwodGhpcy5fdGFyZ2V0LCBpbmZvKTsKICAgICAgfQogICAgICByZXR1cm4gZGlkRmx1c2g7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyFBcnJheTxFbGVtZW50fE5vZGU+fCFOb2RlTGlzdDxOb2RlPn0gbm9kZUxpc3QgTm9kZXMgdGhhdCBjb3VsZCBjaGFuZ2UKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBfbGlzdGVuU2xvdHMobm9kZUxpc3QpIHsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbm9kZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgbiA9IG5vZGVMaXN0W2ldOwogICAgICAgIGlmIChpc1Nsb3QobikpIHsKICAgICAgICAgIG4uYWRkRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHRoaXMuX2JvdW5kU2NoZWR1bGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHshQXJyYXk8RWxlbWVudHxOb2RlPnwhTm9kZUxpc3Q8Tm9kZT59IG5vZGVMaXN0IE5vZGVzIHRoYXQgY291bGQgY2hhbmdlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3VubGlzdGVuU2xvdHMobm9kZUxpc3QpIHsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbm9kZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgbiA9IG5vZGVMaXN0W2ldOwogICAgICAgIGlmIChpc1Nsb3QobikpIHsKICAgICAgICAgIG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHRoaXMuX2JvdW5kU2NoZWR1bGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICB9CgogIFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlciA9IEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXI7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGxldCBkZWJvdW5jZXJRdWV1ZSA9IFtdOwoKICAvKioKICAgKiBBZGRzIGEgYFBvbHltZXIuRGVib3VuY2VyYCB0byBhIGxpc3Qgb2YgZ2xvYmFsbHkgZmx1c2hhYmxlIHRhc2tzLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcGFyYW0geyFQb2x5bWVyLkRlYm91bmNlcn0gZGVib3VuY2VyIERlYm91bmNlciB0byBlbnF1ZXVlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLmVucXVldWVEZWJvdW5jZXIgPSBmdW5jdGlvbihkZWJvdW5jZXIpIHsKICAgIGRlYm91bmNlclF1ZXVlLnB1c2goZGVib3VuY2VyKTsKICB9OwoKICBmdW5jdGlvbiBmbHVzaERlYm91bmNlcnMoKSB7CiAgICBjb25zdCBkaWRGbHVzaCA9IEJvb2xlYW4oZGVib3VuY2VyUXVldWUubGVuZ3RoKTsKICAgIHdoaWxlIChkZWJvdW5jZXJRdWV1ZS5sZW5ndGgpIHsKICAgICAgdHJ5IHsKICAgICAgICBkZWJvdW5jZXJRdWV1ZS5zaGlmdCgpLmZsdXNoKCk7CiAgICAgIH0gY2F0Y2goZSkgewogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRpZEZsdXNoOwogIH0KCiAgLyoqCiAgICogRm9yY2VzIHNldmVyYWwgY2xhc3NlcyBvZiBhc3luY2hyb25vdXNseSBxdWV1ZWQgdGFza3MgdG8gZmx1c2g6CiAgICogLSBEZWJvdW5jZXJzIGFkZGVkIHZpYSBgZW5xdWV1ZURlYm91bmNlcmAKICAgKiAtIFNoYWR5RE9NIGRpc3RyaWJ1dGlvbgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqLwogIFBvbHltZXIuZmx1c2ggPSBmdW5jdGlvbigpIHsKICAgIGxldCBzaGFkeURPTSwgZGVib3VuY2VyczsKICAgIGRvIHsKICAgICAgc2hhZHlET00gPSB3aW5kb3cuU2hhZHlET00gJiYgU2hhZHlET00uZmx1c2goKTsKICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUyAmJiB3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0pIHsKICAgICAgICB3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0uZmx1c2goKTsKICAgICAgfQogICAgICBkZWJvdW5jZXJzID0gZmx1c2hEZWJvdW5jZXJzKCk7CiAgICB9IHdoaWxlIChzaGFkeURPTSB8fCBkZWJvdW5jZXJzKTsKICB9OwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICBjb25zdCBwID0gRWxlbWVudC5wcm90b3R5cGU7CiAgLyoqCiAgICogQGNvbnN0IHtmdW5jdGlvbih0aGlzOk5vZGUsIHN0cmluZyk6IGJvb2xlYW59CiAgICovCiAgY29uc3Qgbm9ybWFsaXplZE1hdGNoZXNTZWxlY3RvciA9IHAubWF0Y2hlcyB8fCBwLm1hdGNoZXNTZWxlY3RvciB8fAogICAgcC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgcC5tc01hdGNoZXNTZWxlY3RvciB8fAogICAgcC5vTWF0Y2hlc1NlbGVjdG9yIHx8IHAud2Via2l0TWF0Y2hlc1NlbGVjdG9yOwoKICAvKioKICAgKiBDcm9zcy1wbGF0Zm9ybSBgZWxlbWVudC5tYXRjaGVzYCBzaGltLgogICAqCiAgICogQGZ1bmN0aW9uIG1hdGNoZXNTZWxlY3RvcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyLmRvbQogICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBjaGVjayBzZWxlY3RvciBhZ2FpbnN0CiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIG1hdGNoCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBub2RlIG1hdGNoZWQgc2VsZWN0b3IKICAgKi8KICBjb25zdCBtYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbihub2RlLCBzZWxlY3RvcikgewogICAgcmV0dXJuIG5vcm1hbGl6ZWRNYXRjaGVzU2VsZWN0b3IuY2FsbChub2RlLCBzZWxlY3Rvcik7CiAgfTsKCiAgLyoqCiAgICogTm9kZSBBUEkgd3JhcHBlciBjbGFzcyByZXR1cm5lZCBmcm9tIGBQb2x5bWVyLmRvbS4odGFyZ2V0KWAgd2hlbgogICAqIGB0YXJnZXRgIGlzIGEgYE5vZGVgLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKi8KICBjbGFzcyBEb21BcGkgewoKICAgIC8qKgogICAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgZm9yIHdoaWNoIHRvIGNyZWF0ZSBhIFBvbHltZXIuZG9tIGhlbHBlciBvYmplY3QuCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKG5vZGUpIHsKICAgICAgdGhpcy5ub2RlID0gbm9kZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlcmAgdGhhdAogICAgICogbGlzdGVucyBmb3Igbm9kZSBjaGFuZ2VzIG9uIHRoaXMgZWxlbWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFbGVtZW50LCB7IHRhcmdldDogIUVsZW1lbnQsIGFkZGVkTm9kZXM6ICFBcnJheTwhRWxlbWVudD4sIHJlbW92ZWROb2RlczogIUFycmF5PCFFbGVtZW50PiB9KTp2b2lkfSBjYWxsYmFjayBDYWxsZWQgd2hlbiBkaXJlY3Qgb3IgZGlzdHJpYnV0ZWQgY2hpbGRyZW4KICAgICAqICAgb2YgdGhpcyBlbGVtZW50IGNoYW5nZXMKICAgICAqIEByZXR1cm4geyFQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJ9IE9ic2VydmVyIGluc3RhbmNlCiAgICAgKi8KICAgIG9ic2VydmVOb2RlcyhjYWxsYmFjaykgewogICAgICByZXR1cm4gbmV3IFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlcih0aGlzLm5vZGUsIGNhbGxiYWNrKTsKICAgIH0KCiAgICAvKioKICAgICAqIERpc2Nvbm5lY3RzIGFuIG9ic2VydmVyIHByZXZpb3VzbHkgY3JlYXRlZCB2aWEgYG9ic2VydmVOb2Rlc2AKICAgICAqCiAgICAgKiBAcGFyYW0geyFQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJ9IG9ic2VydmVySGFuZGxlIE9ic2VydmVyIGluc3RhbmNlCiAgICAgKiAgIHRvIGRpc2Nvbm5lY3QuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB1bm9ic2VydmVOb2RlcyhvYnNlcnZlckhhbmRsZSkgewogICAgICBvYnNlcnZlckhhbmRsZS5kaXNjb25uZWN0KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQcm92aWRlZCBhcyBhIGJhY2t3YXJkcy1jb21wYXRpYmxlIEFQSSBvbmx5LiAgVGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgbm90aWZ5T2JzZXJ2ZXIoKSB7fQoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBub2RlIGlzIGNvbnRhaW5lZCB3aXRoIHRoaXMgZWxlbWVudCdzCiAgICAgKiBsaWdodC1ET00gY2hpbGRyZW4gb3Igc2hhZG93IHJvb3QsIGluY2x1ZGluZyBhbnkgbmVzdGVkIHNoYWRvdyByb290cwogICAgICogb2YgY2hpbGRyZW4gdGhlcmVpbi4KICAgICAqCiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byB0ZXN0CiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGBub2RlYCBpcyBjb250YWluZWQgd2l0aGluCiAgICAgKiAgIHRoaXMgZWxlbWVudCdzIGxpZ2h0IG9yIHNoYWRvdyBET00uCiAgICAgKi8KICAgIGRlZXBDb250YWlucyhub2RlKSB7CiAgICAgIGlmICh0aGlzLm5vZGUuY29udGFpbnMobm9kZSkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgbiA9IG5vZGU7CiAgICAgIGxldCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7CiAgICAgIC8vIHdhbGsgZnJvbSBub2RlIHRvIGB0aGlzYCBvciBgZG9jdW1lbnRgCiAgICAgIHdoaWxlIChuICYmIG4gIT09IGRvYyAmJiBuICE9PSB0aGlzLm5vZGUpIHsKICAgICAgICAvLyB1c2UgbG9naWNhbCBwYXJlbnRub2RlLCBvciBuYXRpdmUgU2hhZG93Um9vdCBob3N0CiAgICAgICAgbiA9IG4ucGFyZW50Tm9kZSB8fCBuLmhvc3Q7CiAgICAgIH0KICAgICAgcmV0dXJuIG4gPT09IHRoaXMubm9kZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGlzIG5vZGUuICBFcXVpdmFsZW50IHRvIGBnZXRSb29kTm9kZSgpYC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtOb2RlfSBUb3AgbW9zdCBlbGVtZW50IGluIHRoZSBkb20gdHJlZSBpbiB3aGljaCB0aGUgbm9kZQogICAgICogZXhpc3RzLiBJZiB0aGUgbm9kZSBpcyBjb25uZWN0ZWQgdG8gYSBkb2N1bWVudCB0aGlzIGlzIGVpdGhlciBhCiAgICAgKiBzaGFkb3dSb290IG9yIHRoZSBkb2N1bWVudDsgb3RoZXJ3aXNlLCBpdCBtYXkgYmUgdGhlIG5vZGUKICAgICAqIGl0c2VsZiBvciBhIG5vZGUgb3IgZG9jdW1lbnQgZnJhZ21lbnQgY29udGFpbmluZyBpdC4KICAgICAqLwogICAgZ2V0T3duZXJSb290KCkgewogICAgICByZXR1cm4gdGhpcy5ub2RlLmdldFJvb3ROb2RlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3Igc2xvdCBlbGVtZW50cywgcmV0dXJucyB0aGUgbm9kZXMgYXNzaWduZWQgdG8gdGhlIHNsb3Q7IG90aGVyd2lzZQogICAgICogYW4gZW1wdHkgYXJyYXkuIEl0IGlzIGVxdWl2YWxlbnQgdG8gYDxzbG90Pi5hZGRpZ25lZE5vZGVzKHtmbGF0dGVuOnRydWV9KWAuCiAgICAgKgogICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gQXJyYXkgb2YgYXNzaWduZWQgbm9kZXMKICAgICAqLwogICAgZ2V0RGlzdHJpYnV0ZWROb2RlcygpIHsKICAgICAgcmV0dXJuICh0aGlzLm5vZGUubG9jYWxOYW1lID09PSAnc2xvdCcpID8KICAgICAgICB0aGlzLm5vZGUuYXNzaWduZWROb2Rlcyh7ZmxhdHRlbjogdHJ1ZX0pIDoKICAgICAgICBbXTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHNsb3RzIHRoaXMgZWxlbWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uCiAgICAgKgogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU2xvdEVsZW1lbnQ+fSBEZXNjcmlwdGlvbgogICAgICovCiAgICBnZXREZXN0aW5hdGlvbkluc2VydGlvblBvaW50cygpIHsKICAgICAgbGV0IGlwJCA9IFtdOwogICAgICBsZXQgbiA9IHRoaXMubm9kZS5hc3NpZ25lZFNsb3Q7CiAgICAgIHdoaWxlIChuKSB7CiAgICAgICAgaXAkLnB1c2gobik7CiAgICAgICAgbiA9IG4uYXNzaWduZWRTbG90OwogICAgICB9CiAgICAgIHJldHVybiBpcCQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDYWxscyBgaW1wb3J0Tm9kZWAgb24gdGhlIGBvd25lckRvY3VtZW50YCBmb3IgdGhpcyBub2RlLgogICAgICoKICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBpbXBvcnQKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGVlcCBUcnVlIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbG9uZWQgZGVlcGx5IGR1cmluZwogICAgICogICBpbXBvcnQKICAgICAqIEByZXR1cm4ge05vZGV9IENsb25lIG9mIGdpdmVuIG5vZGUgaW1wb3J0ZWQgdG8gdGhpcyBvd25lciBkb2N1bWVudAogICAgICovCiAgICBpbXBvcnROb2RlKG5vZGUsIGRlZXApIHsKICAgICAgbGV0IGRvYyA9IHRoaXMubm9kZSBpbnN0YW5jZW9mIERvY3VtZW50ID8gdGhpcy5ub2RlIDoKICAgICAgICB0aGlzLm5vZGUub3duZXJEb2N1bWVudDsKICAgICAgcmV0dXJuIGRvYy5pbXBvcnROb2RlKG5vZGUsIGRlZXApOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gUmV0dXJucyBhIGZsYXR0ZW5lZCBsaXN0IG9mIGFsbCBjaGlsZCBub2RlcyBhbmQKICAgICAqIG5vZGVzIGFzc2lnbmVkIHRvIGNoaWxkIHNsb3RzLgogICAgICovCiAgICBnZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCkgewogICAgICByZXR1cm4gUG9seW1lci5GbGF0dGVuZWROb2Rlc09ic2VydmVyLmdldEZsYXR0ZW5lZE5vZGVzKHRoaXMubm9kZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBmbGF0dGVuZWQgY2hpbGQgZWxlbWVudHMgZm9yIHRoaXMgZWxlbWVudCBiYXNlZAogICAgICogb24gdGhlIGdpdmVuIHNlbGVjdG9yLgogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBTZWxlY3RvciB0byBmaWx0ZXIgbm9kZXMgYWdhaW5zdAogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MRWxlbWVudD59IExpc3Qgb2YgZmxhdHRlbmVkIGNoaWxkIGVsZW1lbnRzCiAgICAgKi8KICAgIHF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3RvcikgewogICAgICBsZXQgYyQgPSB0aGlzLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKTsKICAgICAgbGV0IGxpc3QgPSBbXTsKICAgICAgZm9yIChsZXQgaT0wLCBsPWMkLmxlbmd0aCwgYzsgKGk8bCkgJiYgKGM9YyRbaV0pOyBpKyspIHsKICAgICAgICBpZiAoKGMubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSAmJgogICAgICAgICAgICBtYXRjaGVzU2VsZWN0b3IoYywgc2VsZWN0b3IpKSB7CiAgICAgICAgICBsaXN0LnB1c2goYyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBsaXN0OwogICAgfQoKICAgIC8qKgogICAgICogRm9yIHNoYWRvdyByb290cywgcmV0dXJucyB0aGUgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudCB3aXRoaW4gdGhpcwogICAgICogc2hhZG93IHJvb3QuCiAgICAgKgogICAgICogQHJldHVybiB7Tm9kZXx1bmRlZmluZWR9IEN1cnJlbnRseSBmb2N1c2VkIGVsZW1lbnQKICAgICAqLwogICAgZ2V0IGFjdGl2ZUVsZW1lbnQoKSB7CiAgICAgIGxldCBub2RlID0gdGhpcy5ub2RlOwogICAgICByZXR1cm4gbm9kZS5fYWN0aXZlRWxlbWVudCAhPT0gdW5kZWZpbmVkID8gbm9kZS5fYWN0aXZlRWxlbWVudCA6IG5vZGUuYWN0aXZlRWxlbWVudDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGZvcndhcmRNZXRob2RzKHByb3RvLCBtZXRob2RzKSB7CiAgICBmb3IgKGxldCBpPTA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBtZXRob2QgPSBtZXRob2RzW2ldOwogICAgICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogICAgICBwcm90b1ttZXRob2RdID0gLyoqIEB0aGlzIHtEb21BcGl9ICovIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm5vZGVbbWV0aG9kXS5hcHBseSh0aGlzLm5vZGUsIGFyZ3VtZW50cyk7CiAgICAgIH07CiAgICAgIC8qIGVzbGludC1lbmFibGUgKi8KICAgIH0KICB9CgogIGZ1bmN0aW9uIGZvcndhcmRSZWFkT25seVByb3BlcnRpZXMocHJvdG8sIHByb3BlcnRpZXMpIHsKICAgIGZvciAobGV0IGk9MDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IG5hbWUgPSBwcm9wZXJ0aWVzW2ldOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sIG5hbWUsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtEb21BcGl9ICovKHRoaXMpOwogICAgICAgICAgcmV0dXJuIGRvbUFwaS5ub2RlW25hbWVdOwogICAgICAgIH0sCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZm9yd2FyZFByb3BlcnRpZXMocHJvdG8sIHByb3BlcnRpZXMpIHsKICAgIGZvciAobGV0IGk9MDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IG5hbWUgPSBwcm9wZXJ0aWVzW2ldOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sIG5hbWUsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtEb21BcGl9ICovKHRoaXMpOwogICAgICAgICAgcmV0dXJuIGRvbUFwaS5ub2RlW25hbWVdOwogICAgICAgIH0sCiAgICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgLyoqIEB0eXBlIHtEb21BcGl9ICovICh0aGlzKS5ub2RlW25hbWVdID0gdmFsdWU7CiAgICAgICAgfSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfSk7CiAgICB9CiAgfQoKICBmb3J3YXJkTWV0aG9kcyhEb21BcGkucHJvdG90eXBlLCBbCiAgICAnY2xvbmVOb2RlJywgJ2FwcGVuZENoaWxkJywgJ2luc2VydEJlZm9yZScsICdyZW1vdmVDaGlsZCcsCiAgICAncmVwbGFjZUNoaWxkJywgJ3NldEF0dHJpYnV0ZScsICdyZW1vdmVBdHRyaWJ1dGUnLAogICAgJ3F1ZXJ5U2VsZWN0b3InLCAncXVlcnlTZWxlY3RvckFsbCcKICBdKTsKCiAgZm9yd2FyZFJlYWRPbmx5UHJvcGVydGllcyhEb21BcGkucHJvdG90eXBlLCBbCiAgICAncGFyZW50Tm9kZScsICdmaXJzdENoaWxkJywgJ2xhc3RDaGlsZCcsCiAgICAnbmV4dFNpYmxpbmcnLCAncHJldmlvdXNTaWJsaW5nJywgJ2ZpcnN0RWxlbWVudENoaWxkJywKICAgICdsYXN0RWxlbWVudENoaWxkJywgJ25leHRFbGVtZW50U2libGluZycsICdwcmV2aW91c0VsZW1lbnRTaWJsaW5nJywKICAgICdjaGlsZE5vZGVzJywgJ2NoaWxkcmVuJywgJ2NsYXNzTGlzdCcKICBdKTsKCiAgZm9yd2FyZFByb3BlcnRpZXMoRG9tQXBpLnByb3RvdHlwZSwgWwogICAgJ3RleHRDb250ZW50JywgJ2lubmVySFRNTCcKICBdKTsKCgogIC8qKgogICAqIEV2ZW50IEFQSSB3cmFwcGVyIGNsYXNzIHJldHVybmVkIGZyb20gYFBvbHltZXIuZG9tLih0YXJnZXQpYCB3aGVuCiAgICogYHRhcmdldGAgaXMgYW4gYEV2ZW50YC4KICAgKi8KICBjbGFzcyBFdmVudEFwaSB7CiAgICBjb25zdHJ1Y3RvcihldmVudCkgewogICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBub2RlIG9uIHRoZSBgY29tcG9zZWRQYXRoYCBvZiB0aGlzIGV2ZW50LgogICAgICoKICAgICAqIEByZXR1cm4geyFFdmVudFRhcmdldH0gVGhlIG5vZGUgdGhpcyBldmVudCB3YXMgZGlzcGF0Y2hlZCB0bwogICAgICovCiAgICBnZXQgcm9vdFRhcmdldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuZXZlbnQuY29tcG9zZWRQYXRoKClbMF07CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBsb2NhbCAocmUtdGFyZ2V0ZWQpIHRhcmdldCBmb3IgdGhpcyBldmVudC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHshRXZlbnRUYXJnZXR9IFRoZSBsb2NhbCAocmUtdGFyZ2V0ZWQpIHRhcmdldCBmb3IgdGhpcyBldmVudC4KICAgICAqLwogICAgZ2V0IGxvY2FsVGFyZ2V0KCkgewogICAgICByZXR1cm4gdGhpcy5ldmVudC50YXJnZXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBgY29tcG9zZWRQYXRoYCBmb3IgdGhpcyBldmVudC4KICAgICAqIEByZXR1cm4geyFBcnJheTwhRXZlbnRUYXJnZXQ+fSBUaGUgbm9kZXMgdGhpcyBldmVudCBwcm9wYWdhdGVkIHRocm91Z2gKICAgICAqLwogICAgZ2V0IHBhdGgoKSB7CiAgICAgIHJldHVybiB0aGlzLmV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgfQogIH0KCiAgUG9seW1lci5Eb21BcGkgPSBEb21BcGk7CgogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGRlZXAKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuY2xvbmVOb2RlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQ7CiAgLyoqCiAgICogQGZ1bmN0aW9uCiAgICogQHBhcmFtIHshTm9kZX0gbmV3Q2hpbGQKICAgKiBAcGFyYW0ge05vZGV9IHJlZkNoaWxkCiAgICogQHJldHVybiB7IU5vZGV9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLmluc2VydEJlZm9yZTsKICAvKioKICAgKiBAZnVuY3Rpb24KICAgKiBAcGFyYW0geyFOb2RlfSBub2RlCiAgICogQHJldHVybiB7IU5vZGV9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLnJlbW92ZUNoaWxkOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7IU5vZGV9IG9sZENoaWxkCiAgICogQHBhcmFtIHshTm9kZX0gbmV3Q2hpbGQKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUucmVwbGFjZUNoaWxkOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuc2V0QXR0cmlidXRlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcgogICAqIEByZXR1cm4gez9FbGVtZW50fQogICAqLwogIFBvbHltZXIuRG9tQXBpLnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcgogICAqIEByZXR1cm4geyFOb2RlTGlzdDwhRWxlbWVudD59CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGw7CgogIC8qKgogICAqIExlZ2FjeSBET00gYW5kIEV2ZW50IG1hbmlwdWxhdGlvbiBBUEkgd3JhcHBlciBmYWN0b3J5IHVzZWQgdG8gYWJzdHJhY3QKICAgKiBkaWZmZXJlbmNlcyBiZXR3ZWVuIG5hdGl2ZSBTaGFkb3cgRE9NIGFuZCAiU2hhZHkgRE9NIiB3aGVuIHBvbHlmaWxsaW5nIG9uCiAgICogb2xkZXIgYnJvd3NlcnMuCiAgICoKICAgKiBOb3RlIHRoYXQgaW4gUG9seW1lciAyLnggdXNlIG9mIGBQb2x5bWVyLmRvbWAgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGFuZAogICAqIGluIHRoZSBtYWpvcml0eSBvZiBjYXNlcyBzaW1wbHkgZmFjYWRlcyBkaXJlY3RseSB0byB0aGUgc3RhbmRhcmQgbmF0aXZlCiAgICogQVBJLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBzdW1tYXJ5IExlZ2FjeSBET00gYW5kIEV2ZW50IG1hbmlwdWxhdGlvbiBBUEkgd3JhcHBlciBmYWN0b3J5IHVzZWQgdG8KICAgKiBhYnN0cmFjdCBkaWZmZXJlbmNlcyBiZXR3ZWVuIG5hdGl2ZSBTaGFkb3cgRE9NIGFuZCAiU2hhZHkgRE9NLiIKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7KE5vZGV8RXZlbnQpPX0gb2JqIE5vZGUgb3IgZXZlbnQgdG8gb3BlcmF0ZSBvbgogICAqIEByZXR1cm4geyFEb21BcGl8IUV2ZW50QXBpfSBXcmFwcGVyIHByb3ZpZGluZyBlaXRoZXIgbm9kZSBBUEkgb3IgZXZlbnQgQVBJCiAgICovCiAgUG9seW1lci5kb20gPSBmdW5jdGlvbihvYmopIHsKICAgIG9iaiA9IG9iaiB8fCBkb2N1bWVudDsKICAgIGlmICghb2JqLl9fZG9tQXBpKSB7CiAgICAgIGxldCBoZWxwZXI7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFdmVudCkgewogICAgICAgIGhlbHBlciA9IG5ldyBFdmVudEFwaShvYmopOwogICAgICB9IGVsc2UgewogICAgICAgIGhlbHBlciA9IG5ldyBEb21BcGkob2JqKTsKICAgICAgfQogICAgICBvYmouX19kb21BcGkgPSBoZWxwZXI7CiAgICB9CiAgICByZXR1cm4gb2JqLl9fZG9tQXBpOwogIH07CgogIFBvbHltZXIuZG9tLm1hdGNoZXNTZWxlY3RvciA9IG1hdGNoZXNTZWxlY3RvcjsKCiAgLyoqCiAgICogRm9yY2VzIHNldmVyYWwgY2xhc3NlcyBvZiBhc3luY2hyb25vdXNseSBxdWV1ZWQgdGFza3MgdG8gZmx1c2g6CiAgICogLSBEZWJvdW5jZXJzIGFkZGVkIHZpYSBgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyYAogICAqIC0gU2hhZHlET00gZGlzdHJpYnV0aW9uCiAgICoKICAgKiBUaGlzIG1ldGhvZCBmYWNhZGVzIHRvIGBQb2x5bWVyLmZsdXNoYC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyLmRvbQogICAqLwogIFBvbHltZXIuZG9tLmZsdXNoID0gUG9seW1lci5mbHVzaDsKCiAgLyoqCiAgICogQWRkcyBhIGBQb2x5bWVyLkRlYm91bmNlcmAgdG8gYSBsaXN0IG9mIGdsb2JhbGx5IGZsdXNoYWJsZSB0YXNrcy4KICAgKgogICAqIFRoaXMgbWV0aG9kIGZhY2FkZXMgdG8gYFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcmAuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lci5kb20KICAgKiBAcGFyYW0geyFQb2x5bWVyLkRlYm91bmNlcn0gZGVib3VuY2VyIERlYm91bmNlciB0byBlbnF1ZXVlCiAgICovCiAgUG9seW1lci5kb20uYWRkRGVib3VuY2VyID0gUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgc3R5bGVJbnRlcmZhY2UgPSB3aW5kb3cuU2hhZHlDU1M7CgogIC8qKgogICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBQb2x5bWVyJ3MgImxlZ2FjeSIgQVBJIGludGVuZGVkIHRvIGJlCiAgICogYmFja3dhcmQtY29tcGF0aWJsZSB0byB0aGUgZ3JlYXRlc3QgZXh0ZW50IHBvc3NpYmxlIHdpdGggdGhlIEFQSQogICAqIGZvdW5kIG9uIHRoZSBQb2x5bWVyIDEueCBgUG9seW1lci5CYXNlYCBwcm90b3R5cGUgYXBwbGllZCB0byBhbGwgZWxlbWVudHMKICAgKiBkZWZpbmVkIHVzaW5nIHRoZSBgUG9seW1lcih7Li4ufSlgIGZ1bmN0aW9uLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5FbGVtZW50TWl4aW4KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzCiAgICogQHByb3BlcnR5IGlzQXR0YWNoZWQge2Jvb2xlYW59IFNldCB0byBgdHJ1ZWAgaW4gdGhpcyBlbGVtZW50J3MKICAgKiAgIGBjb25uZWN0ZWRDYWxsYmFja2AgYW5kIGBmYWxzZWAgaW4gYGRpc2Nvbm5lY3RlZENhbGxiYWNrYAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIFBvbHltZXIncyAibGVnYWN5IiBBUEkKICAgKi8KICBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbigoYmFzZSkgPT4gewoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0VsZW1lbnRNaXhpbn0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0dlc3R1cmVFdmVudExpc3RlbmVyc30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0Rpck1peGlufQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgbGVnYWN5RWxlbWVudEJhc2UgPSBQb2x5bWVyLkRpck1peGluKFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzKFBvbHltZXIuRWxlbWVudE1peGluKGJhc2UpKSk7CgogICAgLyoqCiAgICAgKiBNYXAgb2Ygc2ltcGxlIG5hbWVzIHRvIHRvdWNoIGFjdGlvbiBuYW1lcwogICAgICogQGRpY3QKICAgICAqLwogICAgY29uc3QgRElSRUNUSU9OX01BUCA9IHsKICAgICAgJ3gnOiAncGFuLXgnLAogICAgICAneSc6ICdwYW4teScsCiAgICAgICdub25lJzogJ25vbmUnLAogICAgICAnYWxsJzogJ2F1dG8nCiAgICB9OwoKICAgIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAZXh0ZW5kcyB7bGVnYWN5RWxlbWVudEJhc2V9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9MZWdhY3lFbGVtZW50TWl4aW59CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIExlZ2FjeUVsZW1lbnQgZXh0ZW5kcyBsZWdhY3lFbGVtZW50QmFzZSB7CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICB0aGlzLmlzQXR0YWNoZWQ7CiAgICAgICAgLyoqIEB0eXBlIHtXZWFrTWFwPCFFbGVtZW50LCAhT2JqZWN0PHN0cmluZywgIUZ1bmN0aW9uPj59ICovCiAgICAgICAgdGhpcy5fX2JvdW5kTGlzdGVuZXJzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgRnVuY3Rpb24+fSAqLwogICAgICAgIHRoaXMuX2RlYm91bmNlcnM7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGb3J3YXJkcyBgaW1wb3J0TWV0YWAgZnJvbSB0aGUgcHJvdG90eXBlIChpLmUuIGZyb20gdGhlIGluZm8gb2JqZWN0CiAgICAgICAqIHBhc3NlZCB0byBgUG9seW1lcih7Li4ufSlgKSB0byB0aGUgc3RhdGljIEFQSS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IU9iamVjdH0gVGhlIGBpbXBvcnQubWV0YWAgb2JqZWN0IHNldCBvbiB0aGUgcHJvdG90eXBlCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IGB0aGlzYCBpcyBhbHdheXMgaW4gdGhlIGluc3RhbmNlIGluCiAgICAgICAqICBjbG9zdXJlIGZvciBzb21lIHJlYXNvbiBldmVuIGluIGEgc3RhdGljIG1ldGhvZCwgcmF0aGVyIHRoYW4gdGhlIGNsYXNzCiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IGltcG9ydE1ldGEoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucHJvdG90eXBlLmltcG9ydE1ldGE7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBMZWdhY3kgY2FsbGJhY2sgY2FsbGVkIGR1cmluZyB0aGUgYGNvbnN0cnVjdG9yYCwgZm9yIG92ZXJyaWRpbmcKICAgICAgICogYnkgdGhlIHVzZXIuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjcmVhdGVkKCkge30KCiAgICAgIC8qKgogICAgICAgKiBQcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBgY29ubmVjdGVkQ2FsbGJhY2tgCiAgICAgICAqIHdoaWNoIGFkZHMgUG9seW1lciBsZWdhY3kgQVBJJ3MgYGF0dGFjaGVkYCBtZXRob2QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICB0aGlzLmlzQXR0YWNoZWQgPSB0cnVlOwogICAgICAgIHRoaXMuYXR0YWNoZWQoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIExlZ2FjeSBjYWxsYmFjayBjYWxsZWQgZHVyaW5nIGBjb25uZWN0ZWRDYWxsYmFja2AsIGZvciBvdmVycmlkaW5nCiAgICAgICAqIGJ5IHRoZSB1c2VyLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgYXR0YWNoZWQoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIFByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AKICAgICAgICogd2hpY2ggYWRkcyBQb2x5bWVyIGxlZ2FjeSBBUEkncyBgZGV0YWNoZWRgIG1ldGhvZC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgIHRoaXMuaXNBdHRhY2hlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuZGV0YWNoZWQoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIExlZ2FjeSBjYWxsYmFjayBjYWxsZWQgZHVyaW5nIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AsIGZvciBvdmVycmlkaW5nCiAgICAgICAqIGJ5IHRoZSB1c2VyLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGV0YWNoZWQoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIFByb3ZpZGVzIGFuIG92ZXJyaWRlIGltcGxlbWVudGF0aW9uIG9mIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgCiAgICAgICAqIHdoaWNoIGFkZHMgdGhlIFBvbHltZXIgbGVnYWN5IEFQSSdzIGBhdHRyaWJ1dGVDaGFuZ2VkYCBtZXRob2QuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG9sZCBPbGQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIEN1cnJlbnQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG5hbWVzcGFjZSBBdHRyaWJ1dGUgbmFtZXNwYWNlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpIHsKICAgICAgICBpZiAob2xkICE9PSB2YWx1ZSkgewogICAgICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUsIG5hbWVzcGFjZSk7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZUNoYW5nZWQobmFtZSwgb2xkLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogTGVnYWN5IGNhbGxiYWNrIGNhbGxlZCBkdXJpbmcgYGF0dHJpYnV0ZUNoYW5nZWRDaGFsbGJhY2tgLCBmb3Igb3ZlcnJpZGluZwogICAgICAgKiBieSB0aGUgdXNlci4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gb2xkIE9sZCB2YWx1ZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgQ3VycmVudCB2YWx1ZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBhdHRyaWJ1dGVDaGFuZ2VkKG5hbWUsIG9sZCwgdmFsdWUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCBpbXBsZW1lbnRhdGlvbiB0bwogICAgICAgKiBhZGQgc3VwcG9ydCBmb3IgY2xhc3MgaW5pdGlhbGl6YXRpb24gdmlhIHRoZSBgX3JlZ2lzdGVyZWRgIGNhbGxiYWNrLgogICAgICAgKiBUaGlzIGlzIGNhbGxlZCBvbmx5IHdoZW4gdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBlbGVtZW50IGlzIGNyZWF0ZWQuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAgICovCiAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICBsZXQgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7CiAgICAgICAgaWYgKCFwcm90by5oYXNPd25Qcm9wZXJ0eSgnX19oYXNSZWdpc3RlckZpbmlzaGVkJykpIHsKICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyZWQoKTsKICAgICAgICAgIC8vIGJhY2tzdG9wIGluIGNhc2UgdGhlIGBfcmVnaXN0ZXJlZGAgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc2V0IHRoaXMKICAgICAgICAgIHByb3RvLl9faGFzUmVnaXN0ZXJGaW5pc2hlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgIHRoaXMucm9vdCA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovKHRoaXMpOwogICAgICAgIHRoaXMuY3JlYXRlZCgpOwogICAgICAgIC8vIEVuc3VyZSBsaXN0ZW5lcnMgYXJlIGFwcGxpZWQgaW1tZWRpYXRlbHkgc28gdGhhdCB0aGV5IGFyZQogICAgICAgIC8vIGFkZGVkIGJlZm9yZSBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMuIFRoaXMgYWxsb3dzIGFuIGVsZW1lbnQgdG8KICAgICAgICAvLyBkZWNvcmF0ZSBpdHNlbGYgdmlhIGFuIGV2ZW50IHByaW9yIHRvIGFueSBkZWNsYXJhdGl2ZSBsaXN0ZW5lcnMKICAgICAgICAvLyBzZWVpbmcgdGhlIGV2ZW50LiBOb3RlLCB0aGlzIGVuc3VyZXMgY29tcGF0aWJpbGl0eSB3aXRoIDEueCBvcmRlcmluZy4KICAgICAgICB0aGlzLl9hcHBseUxpc3RlbmVycygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhbiBlbGVtZW50IGlzIGluaXRpYWxpemluZy4KICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gY2xhc3MgcmVnaXN0cmF0aW9uIHRpbWUKICAgICAgICogd29yay4gVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBlbnN1cmUgdGhlIHdvcmsgaXMgcGVyZm9ybWVkCiAgICAgICAqIG9ubHkgb25jZSBmb3IgdGhlIGNsYXNzLgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcmVnaXN0ZXJlZCgpIHt9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgaW1wbGVtZW50YXRpb24gdG8KICAgICAgICogYWRkIHN1cHBvcnQgZm9yIGluc3RhbGxpbmcgYGhvc3RBdHRyaWJ1dGVzYCBhbmQgYGxpc3RlbmVyc2AuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgcmVhZHkoKSB7CiAgICAgICAgdGhpcy5fZW5zdXJlQXR0cmlidXRlcygpOwogICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFbnN1cmVzIGFuIGVsZW1lbnQgaGFzIHJlcXVpcmVkIGF0dHJpYnV0ZXMuIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50CiAgICAgICAqIGlzIGJlaW5nIHJlYWRpZWQgdmlhIGByZWFkeWAuIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0byBzZXQgdGhlCiAgICAgICAqIGVsZW1lbnQncyByZXF1aXJlZCBhdHRyaWJ1dGVzLiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIHN1cmUKICAgICAgICogdG8gY2hlY2sgYW5kIG5vdCBvdmVycmlkZSBleGlzdGluZyBhdHRyaWJ1dGVzIGFkZGVkIGJ5CiAgICAgICAqIHRoZSB1c2VyIG9mIHRoZSBlbGVtZW50LiBUeXBpY2FsbHksIHNldHRpbmcgYXR0cmlidXRlcyBzaG91bGQgYmUgbGVmdAogICAgICAgKiB0byB0aGUgZWxlbWVudCB1c2VyIGFuZCBub3QgZG9uZSBoZXJlOyByZWFzb25hYmxlIGV4Y2VwdGlvbnMgaW5jbHVkZQogICAgICAgKiBzZXR0aW5nIGFyaWEgcm9sZXMgYW5kIGZvY3VzYWJpbGl0eS4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2Vuc3VyZUF0dHJpYnV0ZXMoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIEFkZHMgZWxlbWVudCBldmVudCBsaXN0ZW5lcnMuIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50CiAgICAgICAqIGlzIGJlaW5nIHJlYWRpZWQgdmlhIGByZWFkeWAuIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0bwogICAgICAgKiBhZGQgYW55IHJlcXVpcmVkIGVsZW1lbnQgZXZlbnQgbGlzdGVuZXJzLgogICAgICAgKiBJbiBwZXJmb3JtYW5jZSBjcml0aWNhbCBlbGVtZW50cywgdGhlIHdvcmsgZG9uZSBoZXJlIHNob3VsZCBiZSBrZXB0CiAgICAgICAqIHRvIGEgbWluaW11bSBzaW5jZSBpdCBpcyBkb25lIGJlZm9yZSB0aGUgZWxlbWVudCBpcyByZW5kZXJlZC4gSW4KICAgICAgICogdGhlc2UgZWxlbWVudHMsIGNvbnNpZGVyIGFkZGluZyBsaXN0ZW5lcnMgYXN5bmNocm9ub3VzbHkgc28gYXMgbm90IHRvCiAgICAgICAqIGJsb2NrIHJlbmRlci4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2FwcGx5TGlzdGVuZXJzKCkge30KCiAgICAgIC8qKgogICAgICAgKiBDb252ZXJ0cyBhIHR5cGVkIEphdmFTY3JpcHQgdmFsdWUgdG8gYSBzdHJpbmcuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLiBUbyBjdXN0b21pemUKICAgICAgICogaG93IHByb3BlcnRpZXMgYXJlIHNlcmlhbGl6ZWQgdG8gYXR0cmlidXRlcyBmb3IgYXR0cmlidXRlIGJpbmRpbmdzIGFuZAogICAgICAgKiBgcmVmbGVjdFRvQXR0cmlidXRlOiB0cnVlYCBwcm9wZXJ0aWVzIGFzIHdlbGwgYXMgdGhpcyBtZXRob2QsIG92ZXJyaWRlCiAgICAgICAqIHRoZSBgX3NlcmlhbGl6ZVZhbHVlYCBtZXRob2QgcHJvdmlkZWQgYnkgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIGRlc2VyaWFsaXplCiAgICAgICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gU2VyaWFsaXplZCB2YWx1ZQogICAgICAgKi8KICAgICAgc2VyaWFsaXplKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3NlcmlhbGl6ZVZhbHVlKHZhbHVlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICoKICAgICAgICogTm90ZSB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBiYWNrd2FyZC1jb21wYXRpYmxlIGxlZ2FjeSBBUEkKICAgICAgICogb25seS4gIEl0IGlzIG5vdCBkaXJlY3RseSBjYWxsZWQgYnkgYW55IFBvbHltZXIgZmVhdHVyZXMuICBUbyBjdXN0b21pemUKICAgICAgICogaG93IGF0dHJpYnV0ZXMgYXJlIGRlc2VyaWFsaXplZCB0byBwcm9wZXJ0aWVzIGZvciBpbgogICAgICAgKiBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCwgb3ZlcnJpZGUgYF9kZXNlcmlhbGl6ZVZhbHVlYCBtZXRob2QKICAgICAgICogcHJvdmlkZWQgYnkgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgU3RyaW5nIHRvIGRlc2VyaWFsaXplCiAgICAgICAqIEBwYXJhbSB7Kn0gdHlwZSBUeXBlIHRvIGRlc2VyaWFsaXplIHRoZSBzdHJpbmcgdG8KICAgICAgICogQHJldHVybiB7Kn0gUmV0dXJucyB0aGUgZGVzZXJpYWxpemVkIHZhbHVlIGluIHRoZSBgdHlwZWAgZ2l2ZW4uCiAgICAgICAqLwogICAgICBkZXNlcmlhbGl6ZSh2YWx1ZSwgdHlwZSkgewogICAgICAgIHJldHVybiB0aGlzLl9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlcmlhbGl6ZXMgYSBwcm9wZXJ0eSB0byBpdHMgYXNzb2NpYXRlZCBhdHRyaWJ1dGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZSB0byByZWZsZWN0LgogICAgICAgKiBAcGFyYW0ge3N0cmluZz19IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byByZWZsZWN0LgogICAgICAgKiBAcGFyYW0geyo9fSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSB0byByZWZsZWN0LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgcmVmbGVjdFByb3BlcnR5VG9BdHRyaWJ1dGUocHJvcGVydHksIGF0dHJpYnV0ZSwgdmFsdWUpIHsKICAgICAgICB0aGlzLl9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBhdHRyaWJ1dGUsIHZhbHVlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNldHMgYSB0eXBlZCB2YWx1ZSB0byBhbiBIVE1MIGF0dHJpYnV0ZSBvbiBhIG5vZGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNlcmlhbGl6ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byBzZXJpYWxpemUgdG8uCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIHNldCBhdHRyaWJ1dGUgdG8uCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzZXJpYWxpemVWYWx1ZVRvQXR0cmlidXRlKHZhbHVlLCBhdHRyaWJ1dGUsIG5vZGUpIHsKICAgICAgICB0aGlzLl92YWx1ZVRvTm9kZUF0dHJpYnV0ZSgvKiogQHR5cGUge0VsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpLCB2YWx1ZSwgYXR0cmlidXRlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvcGllcyBvd24gcHJvcGVydGllcyAoaW5jbHVkaW5nIGFjY2Vzc29yIGRlc2NyaXB0b3JzKSBmcm9tIGEgc291cmNlCiAgICAgICAqIG9iamVjdCB0byBhIHRhcmdldCBvYmplY3QuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGUgVGFyZ2V0IG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhcGkgU291cmNlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS4KICAgICAgICogQHJldHVybiB7T2JqZWN0fSBwcm90b3R5cGUgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCBhcyBmaXJzdCBhcmd1bWVudC4KICAgICAgICovCiAgICAgIGV4dGVuZChwcm90b3R5cGUsIGFwaSkgewogICAgICAgIGlmICghKHByb3RvdHlwZSAmJiBhcGkpKSB7CiAgICAgICAgICByZXR1cm4gcHJvdG90eXBlIHx8IGFwaTsKICAgICAgICB9CiAgICAgICAgbGV0IG4kID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXBpKTsKICAgICAgICBmb3IgKGxldCBpPTAsIG47IChpPG4kLmxlbmd0aCkgJiYgKG49biRbaV0pOyBpKyspIHsKICAgICAgICAgIGxldCBwZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYXBpLCBuKTsKICAgICAgICAgIGlmIChwZCkgewogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCBuLCBwZCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcm90b3R5cGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb3BpZXMgcHJvcHMgZnJvbSBhIHNvdXJjZSBvYmplY3QgdG8gYSB0YXJnZXQgb2JqZWN0LgogICAgICAgKgogICAgICAgKiBOb3RlLCB0aGlzIG1ldGhvZCB1c2VzIGEgc2ltcGxlIGBmb3IuLi5pbmAgc3RyYXRlZ3kgZm9yIGVudW1lcmF0aW5nCiAgICAgICAqIHByb3BlcnRpZXMuICBUbyBlbnN1cmUgb25seSBgb3duUHJvcGVydGllc2AgYXJlIGNvcGllZCBmcm9tIHNvdXJjZQogICAgICAgKiB0byB0YXJnZXQgYW5kIHRoYXQgYWNjZXNzb3IgaW1wbGVtZW50YXRpb25zIGFyZSBjb3BpZWQsIHVzZSBgZXh0ZW5kYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshT2JqZWN0fSB0YXJnZXQgVGFyZ2V0IG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gc291cmNlIFNvdXJjZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20uCiAgICAgICAqIEByZXR1cm4geyFPYmplY3R9IFRhcmdldCBvYmplY3QgdGhhdCB3YXMgcGFzc2VkIGFzIGZpcnN0IGFyZ3VtZW50LgogICAgICAgKi8KICAgICAgbWl4aW4odGFyZ2V0LCBzb3VyY2UpIHsKICAgICAgICBmb3IgKGxldCBpIGluIHNvdXJjZSkgewogICAgICAgICAgdGFyZ2V0W2ldID0gc291cmNlW2ldOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2V0cyB0aGUgcHJvdG90eXBlIG9mIGFuIG9iamVjdC4KICAgICAgICoKICAgICAgICogTm90ZSB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBiYWNrd2FyZC1jb21wYXRpYmxlIGxlZ2FjeSBBUEkKICAgICAgICogb25seS4gIEl0IGlzIG5vdCBkaXJlY3RseSBjYWxsZWQgYnkgYW55IFBvbHltZXIgZmVhdHVyZXMuCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCBvbiB3aGljaCB0byBzZXQgdGhlIHByb3RvdHlwZS4KICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZSBUaGUgcHJvdG90eXBlIHRoYXQgd2lsbCBiZSBzZXQgb24gdGhlIGdpdmVuCiAgICAgICAqIGBvYmplY3RgLgogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgdGhlIGdpdmVuIGBvYmplY3RgIHdpdGggaXRzIHByb3RvdHlwZSBzZXQKICAgICAgICogdG8gdGhlIGdpdmVuIGBwcm90b3R5cGVgIG9iamVjdC4KICAgICAgICovCiAgICAgIGNoYWluT2JqZWN0KG9iamVjdCwgcHJvdG90eXBlKSB7CiAgICAgICAgaWYgKG9iamVjdCAmJiBwcm90b3R5cGUgJiYgb2JqZWN0ICE9PSBwcm90b3R5cGUpIHsKICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgIH0KCiAgICAgIC8qICoqKiogQmVnaW4gVGVtcGxhdGUgKioqKiAqLwoKICAgICAgLyoqCiAgICAgICAqIENhbGxzIGBpbXBvcnROb2RlYCBvbiB0aGUgYGNvbnRlbnRgIG9mIHRoZSBgdGVtcGxhdGVgIHNwZWNpZmllZCBhbmQKICAgICAgICogcmV0dXJucyBhIGRvY3VtZW50IGZyYWdtZW50IGNvbnRhaW5pbmcgdGhlIGltcG9ydGVkIGNvbnRlbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgSFRNTCB0ZW1wbGF0ZSBlbGVtZW50IHRvIGluc3RhbmNlLgogICAgICAgKiBAcmV0dXJuIHshRG9jdW1lbnRGcmFnbWVudH0gRG9jdW1lbnQgZnJhZ21lbnQgY29udGFpbmluZyB0aGUgaW1wb3J0ZWQKICAgICAgICogICB0ZW1wbGF0ZSBjb250ZW50LgogICAgICAqLwogICAgICBpbnN0YW5jZVRlbXBsYXRlKHRlbXBsYXRlKSB7CiAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLmNvbnN0cnVjdG9yLl9jb250ZW50Rm9yVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgIGxldCBkb20gPSAvKiogQHR5cGUgeyFEb2N1bWVudEZyYWdtZW50fSAqLwogICAgICAgICAgKGRvY3VtZW50LmltcG9ydE5vZGUoY29udGVudCwgdHJ1ZSkpOwogICAgICAgIHJldHVybiBkb207CiAgICAgIH0KCiAgICAgIC8qICoqKiogQmVnaW4gRXZlbnRzICoqKiogKi8KCgoKICAgICAgLyoqCiAgICAgICAqIERpc3BhdGNoZXMgYSBjdXN0b20gZXZlbnQgd2l0aCBhbiBvcHRpb25hbCBkZXRhaWwgdmFsdWUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIE5hbWUgb2YgZXZlbnQgdHlwZS4KICAgICAgICogQHBhcmFtIHsqPX0gZGV0YWlsIERldGFpbCB2YWx1ZSBjb250YWluaW5nIGV2ZW50LXNwZWNpZmljCiAgICAgICAqICAgcGF5bG9hZC4KICAgICAgICogQHBhcmFtIHt7IGJ1YmJsZXM6IChib29sZWFufHVuZGVmaW5lZCksIGNhbmNlbGFibGU6IChib29sZWFufHVuZGVmaW5lZCksIGNvbXBvc2VkOiAoYm9vbGVhbnx1bmRlZmluZWQpIH09fQogICAgICAgKiAgb3B0aW9ucyBPYmplY3Qgc3BlY2lmeWluZyBvcHRpb25zLiAgVGhlc2UgbWF5IGluY2x1ZGU6CiAgICAgICAqICBgYnViYmxlc2AgKGJvb2xlYW4sIGRlZmF1bHRzIHRvIGB0cnVlYCksCiAgICAgICAqICBgY2FuY2VsYWJsZWAgKGJvb2xlYW4sIGRlZmF1bHRzIHRvIGZhbHNlKSwgYW5kCiAgICAgICAqICBgbm9kZWAgb24gd2hpY2ggdG8gZmlyZSB0aGUgZXZlbnQgKEhUTUxFbGVtZW50LCBkZWZhdWx0cyB0byBgdGhpc2ApLgogICAgICAgKiBAcmV0dXJuIHshRXZlbnR9IFRoZSBuZXcgZXZlbnQgdGhhdCB3YXMgZmlyZWQuCiAgICAgICAqLwogICAgICBmaXJlKHR5cGUsIGRldGFpbCwgb3B0aW9ucykgewogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICAgIGRldGFpbCA9IChkZXRhaWwgPT09IG51bGwgfHwgZGV0YWlsID09PSB1bmRlZmluZWQpID8ge30gOiBkZXRhaWw7CiAgICAgICAgbGV0IGV2ZW50ID0gbmV3IEV2ZW50KHR5cGUsIHsKICAgICAgICAgIGJ1YmJsZXM6IG9wdGlvbnMuYnViYmxlcyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IG9wdGlvbnMuYnViYmxlcywKICAgICAgICAgIGNhbmNlbGFibGU6IEJvb2xlYW4ob3B0aW9ucy5jYW5jZWxhYmxlKSwKICAgICAgICAgIGNvbXBvc2VkOiBvcHRpb25zLmNvbXBvc2VkID09PSB1bmRlZmluZWQgPyB0cnVlOiBvcHRpb25zLmNvbXBvc2VkCiAgICAgICAgfSk7CiAgICAgICAgZXZlbnQuZGV0YWlsID0gZGV0YWlsOwogICAgICAgIGxldCBub2RlID0gb3B0aW9ucy5ub2RlIHx8IHRoaXM7CiAgICAgICAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgICAgICByZXR1cm4gZXZlbnQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gYWRkIGFuIGV2ZW50IGxpc3RlbmVyIG9uIGEgZ2l2ZW4gZWxlbWVudCwKICAgICAgICogbGF0ZSBib3VuZCB0byBhIG5hbWVkIG1ldGhvZCBvbiB0aGlzIGVsZW1lbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIGFkZCBldmVudCBsaXN0ZW5lciB0by4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50IHRvIGxpc3RlbiBmb3IuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE5hbWUgb2YgaGFuZGxlciBtZXRob2Qgb24gYHRoaXNgIHRvIGNhbGwuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBsaXN0ZW4obm9kZSwgZXZlbnROYW1lLCBtZXRob2ROYW1lKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7IUVsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpOwogICAgICAgIGxldCBoYmwgPSB0aGlzLl9fYm91bmRMaXN0ZW5lcnMgfHwKICAgICAgICAgICh0aGlzLl9fYm91bmRMaXN0ZW5lcnMgPSBuZXcgV2Vha01hcCgpKTsKICAgICAgICBsZXQgYmwgPSBoYmwuZ2V0KG5vZGUpOwogICAgICAgIGlmICghYmwpIHsKICAgICAgICAgIGJsID0ge307CiAgICAgICAgICBoYmwuc2V0KG5vZGUsIGJsKTsKICAgICAgICB9CiAgICAgICAgbGV0IGtleSA9IGV2ZW50TmFtZSArIG1ldGhvZE5hbWU7CiAgICAgICAgaWYgKCFibFtrZXldKSB7CiAgICAgICAgICBibFtrZXldID0gdGhpcy5fYWRkTWV0aG9kRXZlbnRMaXN0ZW5lclRvTm9kZSgKICAgICAgICAgICAgbm9kZSwgZXZlbnROYW1lLCBtZXRob2ROYW1lLCB0aGlzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gYSBnaXZlbiBlbGVtZW50LAogICAgICAgKiBsYXRlIGJvdW5kIHRvIGEgbmFtZWQgbWV0aG9kIG9uIHRoaXMgZWxlbWVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBub2RlIEVsZW1lbnQgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVyIGZyb20uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudCB0byBzdG9wIGxpc3RlbmluZyB0by4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTmFtZSBvZiBoYW5kbGVyIG1ldGhvZCBvbiBgdGhpc2AgdG8gbm90IGNhbGwKICAgICAgIGFueW1vcmUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICB1bmxpc3Rlbihub2RlLCBldmVudE5hbWUsIG1ldGhvZE5hbWUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHshRWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgbGV0IGJsID0gdGhpcy5fX2JvdW5kTGlzdGVuZXJzICYmIHRoaXMuX19ib3VuZExpc3RlbmVycy5nZXQobm9kZSk7CiAgICAgICAgbGV0IGtleSA9IGV2ZW50TmFtZSArIG1ldGhvZE5hbWU7CiAgICAgICAgbGV0IGhhbmRsZXIgPSBibCAmJiBibFtrZXldOwogICAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgICB0aGlzLl9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICAgIGJsW2tleV0gPSBudWxsOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlIHNjcm9sbGluZyBiZWhhdmlvciB0byBhbGwgZGlyZWN0aW9uLCBvbmUgZGlyZWN0aW9uLCBvciBub25lLgogICAgICAgKgogICAgICAgKiBWYWxpZCBzY3JvbGwgZGlyZWN0aW9uczoKICAgICAgICogICAtICdhbGwnOiBzY3JvbGwgaW4gYW55IGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ3gnOiBzY3JvbGwgb25seSBpbiB0aGUgJ3gnIGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ3knOiBzY3JvbGwgb25seSBpbiB0aGUgJ3knIGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ25vbmUnOiBkaXNhYmxlIHNjcm9sbGluZyBmb3IgdGhpcyBub2RlCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gZGlyZWN0aW9uIERpcmVjdGlvbiB0byBhbGxvdyBzY3JvbGxpbmcKICAgICAgICogRGVmYXVsdHMgdG8gYGFsbGAuCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG5vZGUgRWxlbWVudCB0byBhcHBseSBzY3JvbGwgZGlyZWN0aW9uIHNldHRpbmcuCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHNldFNjcm9sbERpcmVjdGlvbihkaXJlY3Rpb24sIG5vZGUpIHsKICAgICAgICBQb2x5bWVyLkdlc3R1cmVzLnNldFRvdWNoQWN0aW9uKC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyksIERJUkVDVElPTl9NQVBbZGlyZWN0aW9uXSB8fCAnYXV0bycpOwogICAgICB9CiAgICAgIC8qICoqKiogRW5kIEV2ZW50cyAqKioqICovCgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHJ1biBgcXVlcnlTZWxlY3RvcmAgb24gdGhpcyBsb2NhbCBET00gc2NvcGUuCiAgICAgICAqCiAgICAgICAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgYFBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvcihzbGN0cilgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2xjdHIgU2VsZWN0b3IgdG8gcnVuIG9uIHRoaXMgbG9jYWwgRE9NIHNjb3BlCiAgICAgICAqIEByZXR1cm4ge0VsZW1lbnR9IEVsZW1lbnQgZm91bmQgYnkgdGhlIHNlbGVjdG9yLCBvciBudWxsIGlmIG5vdCBmb3VuZC4KICAgICAgICovCiAgICAgICQkKHNsY3RyKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKHNsY3RyKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybiB0aGUgZWxlbWVudCB3aG9zZSBsb2NhbCBkb20gd2l0aGluIHdoaWNoIHRoaXMgZWxlbWVudAogICAgICAgKiBpcyBjb250YWluZWQuIFRoaXMgaXMgYSBzaG9ydGhhbmQgZm9yCiAgICAgICAqIGB0aGlzLmdldFJvb3ROb2RlKCkuaG9zdGAuCiAgICAgICAqIEB0aGlzIHtFbGVtZW50fQogICAgICAgKi8KICAgICAgZ2V0IGRvbUhvc3QoKSB7CiAgICAgICAgbGV0IHJvb3QgPSB0aGlzLmdldFJvb3ROb2RlKCk7CiAgICAgICAgcmV0dXJuIChyb290IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkgPyAvKiogQHR5cGUge1NoYWRvd1Jvb3R9ICovIChyb290KS5ob3N0IDogcm9vdDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZvcmNlIHRoaXMgZWxlbWVudCB0byBkaXN0cmlidXRlIGl0cyBjaGlsZHJlbiB0byBpdHMgbG9jYWwgZG9tLgogICAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGFzIG9mIFBvbHltZXIgMi4wLjIgYW5kIGlzIHByb3ZpZGVkIG9ubHkKICAgICAgICogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGlzdHJpYnV0ZUNvbnRlbnQoKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSAmJiB0aGlzLnNoYWRvd1Jvb3QpIHsKICAgICAgICAgIFNoYWR5RE9NLmZsdXNoKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2Ygbm9kZXMgdGhhdCBhcmUgdGhlIGVmZmVjdGl2ZSBjaGlsZE5vZGVzLiBUaGUgZWZmZWN0aXZlCiAgICAgICAqIGNoaWxkTm9kZXMgbGlzdCBpcyB0aGUgc2FtZSBhcyB0aGUgZWxlbWVudCdzIGNoaWxkTm9kZXMgZXhjZXB0IHRoYXQKICAgICAgICogYW55IGA8Y29udGVudD5gIGVsZW1lbnRzIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBsaXN0IG9mIG5vZGVzIGRpc3RyaWJ1dGVkCiAgICAgICAqIHRvIHRoZSBgPGNvbnRlbnQ+YCwgdGhlIHJlc3VsdCBvZiBpdHMgYGdldERpc3RyaWJ1dGVkTm9kZXNgIG1ldGhvZC4KICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBlZmZlY3RpdmUgY2hpbGQgbm9kZXMuCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBMZWdhY3lFbGVtZW50TWl4aW4gbXVzdCBiZSBhcHBsaWVkIHRvIGFuIEhUTUxFbGVtZW50CiAgICAgICAqLwogICAgICBnZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCkgewogICAgICAgIGNvbnN0IHRoaXNFbCA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKHRoaXMpOwogICAgICAgIGNvbnN0IGRvbUFwaSA9IC8qKiBAdHlwZSB7UG9seW1lci5Eb21BcGl9ICovKFBvbHltZXIuZG9tKHRoaXNFbCkpOwogICAgICAgIHJldHVybiBkb21BcGkuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2Ygbm9kZXMgZGlzdHJpYnV0ZWQgd2l0aGluIHRoaXMgZWxlbWVudCB0aGF0IG1hdGNoCiAgICAgICAqIGBzZWxlY3RvcmAuIFRoZXNlIGNhbiBiZSBkb20gY2hpbGRyZW4gb3IgZWxlbWVudHMgZGlzdHJpYnV0ZWQgdG8KICAgICAgICogY2hpbGRyZW4gdGhhdCBhcmUgaW5zZXJ0aW9uIHBvaW50cy4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHJ1bi4KICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBkaXN0cmlidXRlZCBlbGVtZW50cyB0aGF0IG1hdGNoIHNlbGVjdG9yLgogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30gTGVnYWN5RWxlbWVudE1peGluIG11c3QgYmUgYXBwbGllZCB0byBhbiBIVE1MRWxlbWVudAogICAgICAgKi8KICAgICAgcXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHNlbGVjdG9yKSB7CiAgICAgICAgY29uc3QgdGhpc0VsID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAodGhpcyk7CiAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtQb2x5bWVyLkRvbUFwaX0gKi8oUG9seW1lci5kb20odGhpc0VsKSk7CiAgICAgICAgcmV0dXJuIGRvbUFwaS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHMoc2VsZWN0b3IpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBhcmUgdGhlIGVmZmVjdGl2ZSBjaGlsZHJlbi4gVGhlIGVmZmVjdGl2ZQogICAgICAgKiBjaGlsZHJlbiBsaXN0IGlzIHRoZSBzYW1lIGFzIHRoZSBlbGVtZW50J3MgY2hpbGRyZW4gZXhjZXB0IHRoYXQKICAgICAgICogYW55IGA8Y29udGVudD5gIGVsZW1lbnRzIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBsaXN0IG9mIGVsZW1lbnRzCiAgICAgICAqIGRpc3RyaWJ1dGVkIHRvIHRoZSBgPGNvbnRlbnQ+YC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBlZmZlY3RpdmUgY2hpbGRyZW4uCiAgICAgICAqLwogICAgICBnZXRFZmZlY3RpdmVDaGlsZHJlbigpIHsKICAgICAgICBsZXQgbGlzdCA9IHRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICAgIHJldHVybiBsaXN0LmZpbHRlcihmdW5jdGlvbigvKiogQHR5cGUgeyFOb2RlfSAqLyBuKSB7CiAgICAgICAgICByZXR1cm4gKG4ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKTsKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgb2YgdGV4dCBjb250ZW50IHRoYXQgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlCiAgICAgICAqIHRleHQgY29udGVudCdzIG9mIHRoZSBlbGVtZW50J3MgZWZmZWN0aXZlIGNoaWxkTm9kZXMgKHRoZSBlbGVtZW50cwogICAgICAgKiByZXR1cm5lZCBieSA8YSBocmVmPSIjZ2V0RWZmZWN0aXZlQ2hpbGROb2Rlcz5nZXRFZmZlY3RpdmVDaGlsZE5vZGVzPC9hPi4KICAgICAgICoKICAgICAgICogQHJldHVybiB7c3RyaW5nfSBMaXN0IG9mIGVmZmVjdGl2ZSBjaGlsZHJlbi4KICAgICAgICovCiAgICAgIGdldEVmZmVjdGl2ZVRleHRDb250ZW50KCkgewogICAgICAgIGxldCBjbiA9IHRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICAgIGxldCB0YyA9IFtdOwogICAgICAgIGZvciAobGV0IGk9MCwgYzsgKGMgPSBjbltpXSk7IGkrKykgewogICAgICAgICAgaWYgKGMubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7CiAgICAgICAgICAgIHRjLnB1c2goYy50ZXh0Q29udGVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0Yy5qb2luKCcnKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGVmZmVjdGl2ZSBjaGlsZE5vZGUgd2l0aGluIHRoaXMgZWxlbWVudCB0aGF0CiAgICAgICAqIG1hdGNoIGBzZWxlY3RvcmAuIFRoZXNlIGNhbiBiZSBkb20gY2hpbGQgbm9kZXMgb3IgZWxlbWVudHMgZGlzdHJpYnV0ZWQKICAgICAgICogdG8gY2hpbGRyZW4gdGhhdCBhcmUgaW5zZXJ0aW9uIHBvaW50cy4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHJ1bi4KICAgICAgICogQHJldHVybiB7Tm9kZX0gRmlyc3QgZWZmZWN0aXZlIGNoaWxkIG5vZGUgdGhhdCBtYXRjaGVzIHNlbGVjdG9yLgogICAgICAgKi8KICAgICAgcXVlcnlFZmZlY3RpdmVDaGlsZHJlbihzZWxlY3RvcikgewogICAgICAgIGxldCBlJCA9IHRoaXMucXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHNlbGVjdG9yKTsKICAgICAgICByZXR1cm4gZSQgJiYgZSRbMF07CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBlZmZlY3RpdmUgY2hpbGROb2RlcyB3aXRoaW4gdGhpcyBlbGVtZW50IHRoYXQKICAgICAgICogbWF0Y2ggYHNlbGVjdG9yYC4gVGhlc2UgY2FuIGJlIGRvbSBjaGlsZCBub2RlcyBvciBlbGVtZW50cyBkaXN0cmlidXRlZAogICAgICAgKiB0byBjaGlsZHJlbiB0aGF0IGFyZSBpbnNlcnRpb24gcG9pbnRzLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgU2VsZWN0b3IgdG8gcnVuLgogICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IU5vZGU+fSBMaXN0IG9mIGVmZmVjdGl2ZSBjaGlsZCBub2RlcyB0aGF0IG1hdGNoIHNlbGVjdG9yLgogICAgICAgKi8KICAgICAgcXVlcnlBbGxFZmZlY3RpdmVDaGlsZHJlbihzZWxlY3RvcikgewogICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3Rvcik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBub2RlcyBkaXN0cmlidXRlZCB0byB0aGlzIGVsZW1lbnQncyBgPHNsb3Q+YC4KICAgICAgICoKICAgICAgICogSWYgdGhpcyBlbGVtZW50IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYDxzbG90PmAgaW4gaXRzIGxvY2FsIERPTSwKICAgICAgICogYW4gb3B0aW9uYWwgc2VsZWN0b3IgbWF5IGJlIHBhc3NlZCB0byBjaG9vc2UgdGhlIGRlc2lyZWQgY29udGVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBzbGN0ciBDU1Mgc2VsZWN0b3IgdG8gY2hvb3NlIHRoZSBkZXNpcmVkCiAgICAgICAqICAgYDxzbG90PmAuICBEZWZhdWx0cyB0byBgY29udGVudGAuCiAgICAgICAqIEByZXR1cm4geyFBcnJheTwhTm9kZT59IExpc3Qgb2YgZGlzdHJpYnV0ZWQgbm9kZXMgZm9yIHRoZSBgPHNsb3Q+YC4KICAgICAgICovCiAgICAgIGdldENvbnRlbnRDaGlsZE5vZGVzKHNsY3RyKSB7CiAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcihzbGN0ciB8fCAnc2xvdCcpOwogICAgICAgIHJldHVybiBjb250ZW50ID8gLyoqIEB0eXBlIHtQb2x5bWVyLkRvbUFwaX0gKi8oUG9seW1lci5kb20oY29udGVudCkpLmdldERpc3RyaWJ1dGVkTm9kZXMoKSA6IFtdOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZWxlbWVudCBjaGlsZHJlbiBkaXN0cmlidXRlZCB0byB0aGlzIGVsZW1lbnQncwogICAgICAgKiBgPHNsb3Q+YC4KICAgICAgICoKICAgICAgICogSWYgdGhpcyBlbGVtZW50IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYDxzbG90PmAgaW4gaXRzCiAgICAgICAqIGxvY2FsIERPTSwgYW4gb3B0aW9uYWwgc2VsZWN0b3IgbWF5IGJlIHBhc3NlZCB0byBjaG9vc2UgdGhlIGRlc2lyZWQKICAgICAgICogY29udGVudC4gIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBgZ2V0Q29udGVudENoaWxkTm9kZXNgIGluIHRoYXQgb25seQogICAgICAgKiBlbGVtZW50cyBhcmUgcmV0dXJuZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gc2xjdHIgQ1NTIHNlbGVjdG9yIHRvIGNob29zZSB0aGUgZGVzaXJlZAogICAgICAgKiAgIGA8Y29udGVudD5gLiAgRGVmYXVsdHMgdG8gYGNvbnRlbnRgLgogICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxFbGVtZW50Pn0gTGlzdCBvZiBkaXN0cmlidXRlZCBub2RlcyBmb3IgdGhlCiAgICAgICAqICAgYDxzbG90PmAuCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgZ2V0Q29udGVudENoaWxkcmVuKHNsY3RyKSB7CiAgICAgICAgbGV0IGNoaWxkcmVuID0gLyoqIEB0eXBlIHshQXJyYXk8IUhUTUxFbGVtZW50Pn0gKi8odGhpcy5nZXRDb250ZW50Q2hpbGROb2RlcyhzbGN0cikuZmlsdGVyKGZ1bmN0aW9uKG4pIHsKICAgICAgICAgIHJldHVybiAobi5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpOwogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gY2hpbGRyZW47CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDaGVja3Mgd2hldGhlciBhbiBlbGVtZW50IGlzIGluIHRoaXMgZWxlbWVudCdzIGxpZ2h0IERPTSB0cmVlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0gez9Ob2RlfSBub2RlIFRoZSBlbGVtZW50IHRvIGJlIGNoZWNrZWQuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgbm9kZSBpcyBpbiB0aGlzIGVsZW1lbnQncyBsaWdodCBET00gdHJlZS4KICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IExlZ2FjeUVsZW1lbnRNaXhpbiBtdXN0IGJlIGFwcGxpZWQgdG8gYW4gSFRNTEVsZW1lbnQKICAgICAgICovCiAgICAgIGlzTGlnaHREZXNjZW5kYW50KG5vZGUpIHsKICAgICAgICBjb25zdCB0aGlzTm9kZSA9IC8qKiBAdHlwZSB7Tm9kZX0gKi8gKHRoaXMpOwogICAgICAgIHJldHVybiB0aGlzTm9kZSAhPT0gbm9kZSAmJiB0aGlzTm9kZS5jb250YWlucyhub2RlKSAmJgogICAgICAgICAgdGhpc05vZGUuZ2V0Um9vdE5vZGUoKSA9PT0gbm9kZS5nZXRSb290Tm9kZSgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2hlY2tzIHdoZXRoZXIgYW4gZWxlbWVudCBpcyBpbiB0aGlzIGVsZW1lbnQncyBsb2NhbCBET00gdHJlZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshRWxlbWVudH0gbm9kZSBUaGUgZWxlbWVudCB0byBiZSBjaGVja2VkLgogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIG5vZGUgaXMgaW4gdGhpcyBlbGVtZW50J3MgbG9jYWwgRE9NIHRyZWUuCiAgICAgICAqLwogICAgICBpc0xvY2FsRGVzY2VuZGFudChub2RlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucm9vdCA9PT0gbm9kZS5nZXRSb290Tm9kZSgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogTm8tb3AgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBUaGlzIHNob3VsZCBub3cgYmUgaGFuZGxlZCBieQogICAgICAgKiBTaGFkeUNzcyBsaWJyYXJ5LgogICAgICAgKiBAcGFyYW0gIHsqfSBjb250YWluZXIgVW51c2VkCiAgICAgICAqIEBwYXJhbSAgeyp9IHNob3VsZE9ic2VydmUgVW51c2VkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzY29wZVN1YnRyZWUoY29udGFpbmVyLCBzaG91bGRPYnNlcnZlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGNvbXB1dGVkIHN0eWxlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBUaGUgY3NzIHByb3BlcnR5IG5hbWUuCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gUmV0dXJucyB0aGUgY29tcHV0ZWQgY3NzIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgZ2l2ZW4KICAgICAgICogYHByb3BlcnR5YC4KICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IExlZ2FjeUVsZW1lbnRNaXhpbiBtdXN0IGJlIGFwcGxpZWQgdG8gYW4gSFRNTEVsZW1lbnQKICAgICAgICovCiAgICAgIGdldENvbXB1dGVkU3R5bGVWYWx1ZShwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiBzdHlsZUludGVyZmFjZS5nZXRDb21wdXRlZFN0eWxlVmFsdWUoLyoqIEB0eXBlIHshRWxlbWVudH0gKi8odGhpcyksIHByb3BlcnR5KTsKICAgICAgfQoKICAgICAgLy8gZGVib3VuY2UKCiAgICAgIC8qKgogICAgICAgKiBDYWxsIGBkZWJvdW5jZWAgdG8gY29sbGFwc2UgbXVsdGlwbGUgcmVxdWVzdHMgZm9yIGEgbmFtZWQgdGFzayBpbnRvCiAgICAgICAqIG9uZSBpbnZvY2F0aW9uIHdoaWNoIGlzIG1hZGUgYWZ0ZXIgdGhlIHdhaXQgdGltZSBoYXMgZWxhcHNlZCB3aXRoCiAgICAgICAqIG5vIG5ldyByZXF1ZXN0LiAgSWYgbm8gd2FpdCB0aW1lIGlzIGdpdmVuLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQKICAgICAgICogYXQgbWljcm90YXNrIHRpbWluZyAoZ3VhcmFudGVlZCBiZWZvcmUgcGFpbnQpLgogICAgICAgKgogICAgICAgKiAgICAgZGVib3VuY2VkQ2xpY2tBY3Rpb24oZSkgewogICAgICAgKiAgICAgICAvLyB3aWxsIG5vdCBjYWxsIGBwcm9jZXNzQ2xpY2tgIG1vcmUgdGhhbiBvbmNlIHBlciAxMDBtcwogICAgICAgKiAgICAgICB0aGlzLmRlYm91bmNlKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgKiAgICAgICAgdGhpcy5wcm9jZXNzQ2xpY2soKTsKICAgICAgICogICAgICAgfSAxMDApOwogICAgICAgKiAgICAgfQogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gam9iTmFtZSBTdHJpbmcgdG8gaWRlbnRpZnkgdGhlIGRlYm91bmNlIGpvYi4KICAgICAgICogQHBhcmFtIHtmdW5jdGlvbigpOnZvaWR9IGNhbGxiYWNrIEZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkICh3aXRoIGB0aGlzYAogICAgICAgKiAgIGNvbnRleHQpIHdoZW4gdGhlIHdhaXQgdGltZSBlbGFwc2VzLgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBPcHRpb25hbCB3YWl0IHRpbWUgaW4gbWlsbGlzZWNvbmRzIChtcykgYWZ0ZXIgdGhlCiAgICAgICAqICAgbGFzdCBzaWduYWwgdGhhdCBtdXN0IGVsYXBzZSBiZWZvcmUgaW52b2tpbmcgYGNhbGxiYWNrYAogICAgICAgKiBAcmV0dXJuIHshT2JqZWN0fSBSZXR1cm5zIGEgZGVib3VuY2VyIG9iamVjdCBvbiB3aGljaCBleGlzdHMgdGhlCiAgICAgICAqIGZvbGxvd2luZyBtZXRob2RzOiBgaXNBY3RpdmUoKWAgcmV0dXJucyB0cnVlIGlmIHRoZSBkZWJvdW5jZXIgaXMKICAgICAgICogYWN0aXZlOyBgY2FuY2VsKClgIGNhbmNlbHMgdGhlIGRlYm91bmNlciBpZiBpdCBpcyBhY3RpdmU7CiAgICAgICAqIGBmbHVzaCgpYCBpbW1lZGlhdGVseSBpbnZva2VzIHRoZSBkZWJvdW5jZWQgY2FsbGJhY2sgaWYgdGhlIGRlYm91bmNlcgogICAgICAgKiBpcyBhY3RpdmUuCiAgICAgICAqLwogICAgICBkZWJvdW5jZShqb2JOYW1lLCBjYWxsYmFjaywgd2FpdCkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIHJldHVybiB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdID0gUG9seW1lci5EZWJvdW5jZXIuZGVib3VuY2UoCiAgICAgICAgICAgICAgdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXQogICAgICAgICAgICAsIHdhaXQgPiAwID8gUG9seW1lci5Bc3luYy50aW1lT3V0LmFmdGVyKHdhaXQpIDogUG9seW1lci5Bc3luYy5taWNyb1Rhc2sKICAgICAgICAgICAgLCBjYWxsYmFjay5iaW5kKHRoaXMpKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciBhIG5hbWVkIGRlYm91bmNlciBpcyBhY3RpdmUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBqb2JOYW1lIFRoZSBuYW1lIG9mIHRoZSBkZWJvdW5jZXIgc3RhcnRlZCB3aXRoIGBkZWJvdW5jZWAKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZGVib3VuY2VyIGlzIGFjdGl2ZSAoaGFzIG5vdCB5ZXQgZmlyZWQpLgogICAgICAgKi8KICAgICAgaXNEZWJvdW5jZXJBY3RpdmUoam9iTmFtZSkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIGxldCBkZWJvdW5jZXIgPSB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdOwogICAgICAgIHJldHVybiAhIShkZWJvdW5jZXIgJiYgZGVib3VuY2VyLmlzQWN0aXZlKCkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogSW1tZWRpYXRlbHkgY2FsbHMgdGhlIGRlYm91bmNlciBgY2FsbGJhY2tgIGFuZCBpbmFjdGl2YXRlcyBpdC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGpvYk5hbWUgVGhlIG5hbWUgb2YgdGhlIGRlYm91bmNlciBzdGFydGVkIHdpdGggYGRlYm91bmNlYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZmx1c2hEZWJvdW5jZXIoam9iTmFtZSkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIGxldCBkZWJvdW5jZXIgPSB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdOwogICAgICAgIGlmIChkZWJvdW5jZXIpIHsKICAgICAgICAgIGRlYm91bmNlci5mbHVzaCgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbmNlbHMgYW4gYWN0aXZlIGRlYm91bmNlci4gIFRoZSBgY2FsbGJhY2tgIHdpbGwgbm90IGJlIGNhbGxlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGpvYk5hbWUgVGhlIG5hbWUgb2YgdGhlIGRlYm91bmNlciBzdGFydGVkIHdpdGggYGRlYm91bmNlYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsRGVib3VuY2VyKGpvYk5hbWUpIHsKICAgICAgICB0aGlzLl9kZWJvdW5jZXJzID0gdGhpcy5fZGVib3VuY2VycyB8fCB7fTsKICAgICAgICBsZXQgZGVib3VuY2VyID0gdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXTsKICAgICAgICBpZiAoZGVib3VuY2VyKSB7CiAgICAgICAgICBkZWJvdW5jZXIuY2FuY2VsKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUnVucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGFzeW5jaHJvbm91c2x5LgogICAgICAgKgogICAgICAgKiBCeSBkZWZhdWx0IChpZiBubyB3YWl0VGltZSBpcyBzcGVjaWZpZWQpLCBhc3luYyBjYWxsYmFja3MgYXJlIHJ1biBhdAogICAgICAgKiBtaWNyb3Rhc2sgdGltaW5nLCB3aGljaCB3aWxsIG9jY3VyIGJlZm9yZSBwYWludC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshRnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBydW4sIGJvdW5kIHRvIGB0aGlzYC4KICAgICAgICogQHBhcmFtIHtudW1iZXI9fSB3YWl0VGltZSBUaW1lIHRvIHdhaXQgYmVmb3JlIGNhbGxpbmcgdGhlCiAgICAgICAqICAgYGNhbGxiYWNrYC4gIElmIHVuc3BlY2lmaWVkIG9yIDAsIHRoZSBjYWxsYmFjayB3aWxsIGJlIHJ1biBhdCBtaWNyb3Rhc2sKICAgICAgICogICB0aW1pbmcgKGJlZm9yZSBwYWludCkuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHRoYXQgbWF5IGJlIHVzZWQgdG8gY2FuY2VsIHRoZSBhc3luYyBqb2IuCiAgICAgICAqLwogICAgICBhc3luYyhjYWxsYmFjaywgd2FpdFRpbWUpIHsKICAgICAgICByZXR1cm4gd2FpdFRpbWUgPiAwID8gUG9seW1lci5Bc3luYy50aW1lT3V0LnJ1bihjYWxsYmFjay5iaW5kKHRoaXMpLCB3YWl0VGltZSkgOgogICAgICAgICAgICB+UG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKGNhbGxiYWNrLmJpbmQodGhpcykpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhbiBhc3luYyBvcGVyYXRpb24gc3RhcnRlZCB3aXRoIGBhc3luY2AuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gb3JpZ2luYWwgYGFzeW5jYCBjYWxsIHRvCiAgICAgICAqICAgY2FuY2VsLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsQXN5bmMoaGFuZGxlKSB7CiAgICAgICAgaGFuZGxlIDwgMCA/IFBvbHltZXIuQXN5bmMubWljcm9UYXNrLmNhbmNlbCh+aGFuZGxlKSA6CiAgICAgICAgICAgIFBvbHltZXIuQXN5bmMudGltZU91dC5jYW5jZWwoaGFuZGxlKTsKICAgICAgfQoKICAgICAgLy8gb3RoZXIKCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGVsZW1lbnQgYW5kIGNvbmZpZ3VyaW5nIGl0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIEhUTUwgZWxlbWVudCB0YWcgdG8gY3JlYXRlLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BzIE9iamVjdCBvZiBwcm9wZXJ0aWVzIHRvIGNvbmZpZ3VyZSBvbiB0aGUKICAgICAgICogICAgaW5zdGFuY2UuCiAgICAgICAqIEByZXR1cm4geyFFbGVtZW50fSBOZXdseSBjcmVhdGVkIGFuZCBjb25maWd1cmVkIGVsZW1lbnQuCiAgICAgICAqLwogICAgICBjcmVhdGUodGFnLCBwcm9wcykgewogICAgICAgIGxldCBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgICBpZiAoZWx0LnNldFByb3BlcnRpZXMpIHsKICAgICAgICAgICAgZWx0LnNldFByb3BlcnRpZXMocHJvcHMpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChsZXQgbiBpbiBwcm9wcykgewogICAgICAgICAgICAgIGVsdFtuXSA9IHByb3BzW25dOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBlbHQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGltcG9ydGluZyBhbiBIVE1MIGRvY3VtZW50IGltcGVyYXRpdmVseS4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBgPGxpbmsgcmVsPSJpbXBvcnQiPmAgZWxlbWVudCB3aXRoCiAgICAgICAqIHRoZSBwcm92aWRlZCBVUkwgYW5kIGFwcGVuZHMgaXQgdG8gdGhlIGRvY3VtZW50IHRvIHN0YXJ0IGxvYWRpbmcuCiAgICAgICAqIEluIHRoZSBgb25sb2FkYCBjYWxsYmFjaywgdGhlIGBpbXBvcnRgIHByb3BlcnR5IG9mIHRoZSBgbGlua2AKICAgICAgICogZWxlbWVudCB3aWxsIGNvbnRhaW4gdGhlIGltcG9ydGVkIGRvY3VtZW50IGNvbnRlbnRzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHJlZiBVUkwgdG8gZG9jdW1lbnQgdG8gbG9hZC4KICAgICAgICogQHBhcmFtIHs/ZnVuY3Rpb24oIUV2ZW50KTp2b2lkPX0gb25sb2FkIENhbGxiYWNrIHRvIG5vdGlmeSB3aGVuIGFuIGltcG9ydCBzdWNjZXNzZnVsbHkKICAgICAgICogICBsb2FkZWQuCiAgICAgICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFcnJvckV2ZW50KTp2b2lkPX0gb25lcnJvciBDYWxsYmFjayB0byBub3RpZnkgd2hlbiBhbiBpbXBvcnQKICAgICAgICogICB1bnN1Y2Nlc3NmdWxseSBsb2FkZWQuCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdEFzeW5jIFRydWUgaWYgdGhlIGltcG9ydCBzaG91bGQgYmUgbG9hZGVkIGBhc3luY2AuCiAgICAgICAqICAgRGVmYXVsdHMgdG8gYGZhbHNlYC4KICAgICAgICogQHJldHVybiB7IUhUTUxMaW5rRWxlbWVudH0gVGhlIGxpbmsgZWxlbWVudCBmb3IgdGhlIFVSTCB0byBiZSBsb2FkZWQuCiAgICAgICAqLwogICAgICBpbXBvcnRIcmVmKGhyZWYsIG9ubG9hZCwgb25lcnJvciwgb3B0QXN5bmMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgICAgIGxldCBsb2FkRm4gPSBvbmxvYWQgPyBvbmxvYWQuYmluZCh0aGlzKSA6IG51bGw7CiAgICAgICAgbGV0IGVycm9yRm4gPSBvbmVycm9yID8gb25lcnJvci5iaW5kKHRoaXMpIDogbnVsbDsKICAgICAgICByZXR1cm4gUG9seW1lci5pbXBvcnRIcmVmKGhyZWYsIGxvYWRGbiwgZXJyb3JGbiwgb3B0QXN5bmMpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUG9seWZpbGwgZm9yIEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMsIHdoaWNoIGlzIHNvbWV0aW1lcyBzdGlsbAogICAgICAgKiBwcmVmaXhlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHRlc3QuCiAgICAgICAqIEBwYXJhbSB7IUVsZW1lbnQ9fSBub2RlIEVsZW1lbnQgdG8gdGVzdCB0aGUgc2VsZWN0b3IgYWdhaW5zdC4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZWxlbWVudCBtYXRjaGVzIHRoZSBzZWxlY3Rvci4KICAgICAgICovCiAgICAgIGVsZW1lbnRNYXRjaGVzKHNlbGVjdG9yLCBub2RlKSB7CiAgICAgICAgcmV0dXJuIFBvbHltZXIuZG9tLm1hdGNoZXNTZWxlY3RvcigvKiogQHR5cGUgeyFFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKSwgc2VsZWN0b3IpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVG9nZ2xlcyBhbiBIVE1MIGF0dHJpYnV0ZSBvbiBvciBvZmYuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEhUTUwgYXR0cmlidXRlIG5hbWUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gYm9vbCBCb29sZWFuIHRvIGZvcmNlIHRoZSBhdHRyaWJ1dGUgb24gb3Igb2ZmLgogICAgICAgKiAgICBXaGVuIHVuc3BlY2lmaWVkLCB0aGUgc3RhdGUgb2YgdGhlIGF0dHJpYnV0ZSB3aWxsIGJlIHJldmVyc2VkLgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnQ9fSBub2RlIE5vZGUgdG8gdGFyZ2V0LiAgRGVmYXVsdHMgdG8gYHRoaXNgLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdG9nZ2xlQXR0cmlidXRlKG5hbWUsIGJvb2wsIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICBib29sID0gIW5vZGUuaGFzQXR0cmlidXRlKG5hbWUpOwogICAgICAgIH0KICAgICAgICBpZiAoYm9vbCkgewogICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgJycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgICAgICB9CiAgICAgIH0KCgogICAgICAvKioKICAgICAgICogVG9nZ2xlcyBhIENTUyBjbGFzcyBvbiBvciBvZmYuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENTUyBjbGFzcyBuYW1lCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGJvb2wgQm9vbGVhbiB0byBmb3JjZSB0aGUgY2xhc3Mgb24gb3Igb2ZmLgogICAgICAgKiAgICBXaGVuIHVuc3BlY2lmaWVkLCB0aGUgc3RhdGUgb2YgdGhlIGNsYXNzIHdpbGwgYmUgcmV2ZXJzZWQuCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG5vZGUgTm9kZSB0byB0YXJnZXQuICBEZWZhdWx0cyB0byBgdGhpc2AuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICB0b2dnbGVDbGFzcyhuYW1lLCBib29sLCBub2RlKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICAgICAgYm9vbCA9ICFub2RlLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKTsKICAgICAgICB9CiAgICAgICAgaWYgKGJvb2wpIHsKICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZChuYW1lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKG5hbWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENyb3NzLXBsYXRmb3JtIGhlbHBlciBmb3Igc2V0dGluZyBhbiBlbGVtZW50J3MgQ1NTIGB0cmFuc2Zvcm1gIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNmb3JtVGV4dCBUcmFuc2Zvcm0gc2V0dGluZy4KICAgICAgICogQHBhcmFtIHtFbGVtZW50PX0gbm9kZSBFbGVtZW50IHRvIGFwcGx5IHRoZSB0cmFuc2Zvcm0gdG8uCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdHJhbnNmb3JtKHRyYW5zZm9ybVRleHQsIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICBub2RlLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHRyYW5zZm9ybVRleHQ7CiAgICAgICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1UZXh0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3Jvc3MtcGxhdGZvcm0gaGVscGVyIGZvciBzZXR0aW5nIGFuIGVsZW1lbnQncyBDU1MgYHRyYW5zbGF0ZTNkYAogICAgICAgKiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHggWCBvZmZzZXQuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IFkgb2Zmc2V0LgogICAgICAgKiBAcGFyYW0ge251bWJlcn0geiBaIG9mZnNldC4KICAgICAgICogQHBhcmFtIHtFbGVtZW50PX0gbm9kZSBFbGVtZW50IHRvIGFwcGx5IHRoZSB0cmFuc2Zvcm0gdG8uCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHRyYW5zbGF0ZTNkKHgsIHksIHosIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICB0aGlzLnRyYW5zZm9ybSgndHJhbnNsYXRlM2QoJyArIHggKyAnLCcgKyB5ICsgJywnICsgeiArICcpJywgbm9kZSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSBhbiBhcnJheSwgaWYgaXQgZXhpc3RzLgogICAgICAgKgogICAgICAgKiBJZiB0aGUgYXJyYXkgaXMgc3BlY2lmaWVkIGJ5IHBhdGgsIGEgY2hhbmdlIG5vdGlmaWNhdGlvbiBpcwogICAgICAgKiBnZW5lcmF0ZWQsIHNvIHRoYXQgb2JzZXJ2ZXJzLCBkYXRhIGJpbmRpbmdzIGFuZCBjb21wdXRlZAogICAgICAgKiBwcm9wZXJ0aWVzIHdhdGNoaW5nIHRoYXQgcGF0aCBjYW4gdXBkYXRlLgogICAgICAgKgogICAgICAgKiBJZiB0aGUgYXJyYXkgaXMgcGFzc2VkIGRpcmVjdGx5LCAqKm5vIGNoYW5nZQogICAgICAgKiBub3RpZmljYXRpb24gaXMgZ2VuZXJhdGVkKiouCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PG51bWJlcnxzdHJpbmc+fSBhcnJheU9yUGF0aCBQYXRoIHRvIGFycmF5IGZyb20gd2hpY2ggdG8gcmVtb3ZlIHRoZSBpdGVtCiAgICAgICAqICAgKG9yIHRoZSBhcnJheSBpdHNlbGYpLgogICAgICAgKiBAcGFyYW0geyp9IGl0ZW0gSXRlbSB0byByZW1vdmUuCiAgICAgICAqIEByZXR1cm4ge0FycmF5fSBBcnJheSBjb250YWluaW5nIGl0ZW0gcmVtb3ZlZC4KICAgICAgICovCiAgICAgIGFycmF5RGVsZXRlKGFycmF5T3JQYXRoLCBpdGVtKSB7CiAgICAgICAgbGV0IGluZGV4OwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFycmF5T3JQYXRoKSkgewogICAgICAgICAgaW5kZXggPSBhcnJheU9yUGF0aC5pbmRleE9mKGl0ZW0pOwogICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5T3JQYXRoLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxldCBhcnIgPSBQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIGFycmF5T3JQYXRoKTsKICAgICAgICAgIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7CiAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zcGxpY2UoYXJyYXlPclBhdGgsIGluZGV4LCAxKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIC8vIGxvZ2dpbmcKCiAgICAgIC8qKgogICAgICAgKiBGYWNhZGVzIGBjb25zb2xlLmxvZ2AvYHdhcm5gL2BlcnJvcmAgYXMgb3ZlcnJpZGUgcG9pbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsZXZlbCBPbmUgb2YgJ2xvZycsICd3YXJuJywgJ2Vycm9yJwogICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIEFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB0byBsb2cKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9sb2dnZXIobGV2ZWwsIGFyZ3MpIHsKICAgICAgICAvLyBhY2NlcHQgWydmb28nLCAnYmFyJ10gYW5kIFtbJ2ZvbycsICdiYXInXV0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzKSAmJiBhcmdzLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KGFyZ3NbMF0pKSB7CiAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICB9CiAgICAgICAgc3dpdGNoKGxldmVsKSB7CiAgICAgICAgICBjYXNlICdsb2cnOgogICAgICAgICAgY2FzZSAnd2Fybic6CiAgICAgICAgICBjYXNlICdlcnJvcic6CiAgICAgICAgICAgIGNvbnNvbGVbbGV2ZWxdKC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZhY2FkZXMgYGNvbnNvbGUubG9nYCBhcyBhbiBvdmVycmlkZSBwb2ludC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHsuLi4qfSBhcmdzIEFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB0byBsb2cKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9sb2coLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignbG9nJywgYXJncyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGYWNhZGVzIGBjb25zb2xlLndhcm5gIGFzIGFuIG92ZXJyaWRlIHBvaW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHRvIGxvZwogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3dhcm4oLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignd2FybicsIGFyZ3MpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRmFjYWRlcyBgY29uc29sZS5lcnJvcmAgYXMgYW4gb3ZlcnJpZGUgcG9pbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgdG8gbG9nCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfZXJyb3IoLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignZXJyb3InLCBhcmdzKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZvcm1hdHMgYSBtZXNzYWdlIHVzaW5nIHRoZSBlbGVtZW50IHR5cGUgYW4gYSBtZXRob2QgbmFtZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUgdG8gYXNzb2NpYXRlIHdpdGggbWVzc2FnZQogICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHRvIGxvZwogICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgd2l0aCBmb3JtYXR0aW5nIGluZm9ybWF0aW9uIGZvciBgY29uc29sZWAKICAgICAgICogICBsb2dnaW5nLgogICAgICAgKi8KICAgICAgX2xvZ2YobWV0aG9kTmFtZSwgLi4uYXJncykgewogICAgICAgIHJldHVybiBbJ1slczo6JXNdJywgdGhpcy5pcywgbWV0aG9kTmFtZSwgLi4uYXJnc107CiAgICAgIH0KCiAgICB9CgogICAgTGVnYWN5RWxlbWVudC5wcm90b3R5cGUuaXMgPSAnJzsKCiAgICByZXR1cm4gTGVnYWN5RWxlbWVudDsKCiAgfSk7Cgp9KSgpOwoKCgogIChmdW5jdGlvbigpIHsKCiAgICAndXNlIHN0cmljdCc7CgogICAgY29uc3QgbGlmZWN5Y2xlUHJvcHMgPSB7CiAgICAgIGF0dGFjaGVkOiB0cnVlLAogICAgICBkZXRhY2hlZDogdHJ1ZSwKICAgICAgcmVhZHk6IHRydWUsCiAgICAgIGNyZWF0ZWQ6IHRydWUsCiAgICAgIGJlZm9yZVJlZ2lzdGVyOiB0cnVlLAogICAgICByZWdpc3RlcmVkOiB0cnVlLAogICAgICBhdHRyaWJ1dGVDaGFuZ2VkOiB0cnVlLAogICAgICBsaXN0ZW5lcnM6IHRydWUsCiAgICAgIGhvc3RBdHRyaWJ1dGVzOiB0cnVlCiAgICB9OwoKICAgIGNvbnN0IGV4Y2x1ZGVPbkluZm8gPSB7CiAgICAgIGF0dGFjaGVkOiB0cnVlLAogICAgICBkZXRhY2hlZDogdHJ1ZSwKICAgICAgcmVhZHk6IHRydWUsCiAgICAgIGNyZWF0ZWQ6IHRydWUsCiAgICAgIGJlZm9yZVJlZ2lzdGVyOiB0cnVlLAogICAgICByZWdpc3RlcmVkOiB0cnVlLAogICAgICBhdHRyaWJ1dGVDaGFuZ2VkOiB0cnVlLAogICAgICBiZWhhdmlvcnM6IHRydWUsCiAgICAgIF9ub0FjY2Vzc29yczogdHJ1ZQogICAgfTsKCiAgICBjb25zdCBleGNsdWRlT25CZWhhdmlvcnMgPSBPYmplY3QuYXNzaWduKHsKICAgICAgbGlzdGVuZXJzOiB0cnVlLAogICAgICBob3N0QXR0cmlidXRlczogdHJ1ZSwKICAgICAgcHJvcGVydGllczogdHJ1ZSwKICAgICAgb2JzZXJ2ZXJzOiB0cnVlLAogICAgfSwgZXhjbHVkZU9uSW5mbyk7CgogICAgZnVuY3Rpb24gY29weVByb3BlcnRpZXMoc291cmNlLCB0YXJnZXQsIGV4Y2x1ZGVQcm9wcykgewogICAgICBjb25zdCBub0FjY2Vzc29ycyA9IHNvdXJjZS5fbm9BY2Nlc3NvcnM7CiAgICAgIGZvciAobGV0IHAgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKCEocCBpbiBleGNsdWRlUHJvcHMpKSB7CiAgICAgICAgICBpZiAobm9BY2Nlc3NvcnMpIHsKICAgICAgICAgICAgdGFyZ2V0W3BdID0gc291cmNlW3BdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGV0IHBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHApOwogICAgICAgICAgICBpZiAocGQpIHsKICAgICAgICAgICAgICAvLyBlbnN1cmUgcHJvcGVydHkgaXMgY29uZmlndXJhYmxlIHNvIHRoYXQgYSBsYXRlciBiZWhhdmlvciBjYW4KICAgICAgICAgICAgICAvLyByZS1jb25maWd1cmUgaXQuCiAgICAgICAgICAgICAgcGQuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwLCBwZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEFwcGxpZXMgYSAibGVnYWN5IiBiZWhhdmlvciBvciBhcnJheSBvZiBiZWhhdmlvcnMgdG8gdGhlIHByb3ZpZGVkIGNsYXNzLgogICAgICoKICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIHdpbGwgYXV0b21hdGljYWxseSBhbHNvIGFwcGx5IHRoZSBgUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW5gCiAgICAgKiB0byBlbnN1cmUgdGhhdCBhbnkgbGVnYWN5IGJlaGF2aW9ycyBjYW4gcmVseSBvbiBsZWdhY3kgUG9seW1lciBBUEkgb24KICAgICAqIHRoZSB1bmRlcmx5aW5nIGVsZW1lbnQuCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7IU9iamVjdHwhQXJyYXk8IU9iamVjdD59IGJlaGF2aW9ycyBCZWhhdmlvciBvYmplY3Qgb3IgYXJyYXkgb2YgYmVoYXZpb3JzLgogICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6VCl9IGtsYXNzIEVsZW1lbnQgY2xhc3MuCiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6VCl9IFJldHVybnMgYSBuZXcgRWxlbWVudCBjbGFzcyBleHRlbmRlZCBieSB0aGUKICAgICAqIHBhc3NlZCBpbiBgYmVoYXZpb3JzYCBhbmQgYWxzbyBieSBgUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW5gLgogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzLCBjaGVja1R5cGVzfQogICAgICovCiAgICBmdW5jdGlvbiBtaXhpbkJlaGF2aW9ycyhiZWhhdmlvcnMsIGtsYXNzKSB7CiAgICAgIHJldHVybiBHZW5lcmF0ZUNsYXNzRnJvbUluZm8oe30sIFBvbHltZXIuTGVnYWN5RWxlbWVudE1peGluKGtsYXNzKSwgYmVoYXZpb3JzKTsKICAgIH0KCiAgICAvLyBOT1RFOgogICAgLy8gMS54CiAgICAvLyBCZWhhdmlvcnMgd2VyZSBtaXhlZCBpbiAqaW4gcmV2ZXJzZSBvcmRlciogYW5kIGRlLWR1cGVkIG9uIHRoZSBmbHkuCiAgICAvLyBUaGUgcnVsZSB3YXMgdGhhdCBiZWhhdmlvciBwcm9wZXJ0aWVzIHdlcmUgY29waWVkIG9udG8gdGhlIGVsZW1lbnQKICAgIC8vIHByb3RvdHlwZSBpZiBhbmQgb25seSBpZiB0aGUgcHJvcGVydHkgZGlkIG5vdCBhbHJlYWR5IGV4aXN0LgogICAgLy8gR2l2ZW46IFBvbHltZXJ7IGJlaGF2aW9yczogW0EsIEIsIEMsIEEsIEJdfSwgcHJvcGVydHkgY29weSBvcmRlciB3YXM6CiAgICAvLyAoMSksIEIsICgyKSwgQSwgKDMpIEMuIFRoaXMgbWVhbnMgcHJvdG90eXBlIHByb3BlcnRpZXMgd2luIG92ZXIKICAgIC8vIEIgcHJvcGVydGllcyB3aW4gb3ZlciBBIHdpbiBvdmVyIEMuIFRoaXMgbWlycm9ycyB3aGF0IHdvdWxkIGhhcHBlbgogICAgLy8gd2l0aCBpbmhlcml0YW5jZSBpZiBlbGVtZW50IGV4dGVuZGVkIEIgZXh0ZW5kZWQgQSBleHRlbmRlZCBDLgogICAgLy8KICAgIC8vIEFnYWluIGdpdmVuLCBQb2x5bWVyeyBiZWhhdmlvcnM6IFtBLCBCLCBDLCBBLCBCXX0sIHRoZSByZXN1bHRpbmcKICAgIC8vIGBiZWhhdmlvcnNgIGFycmF5IHdhcyBbQywgQSwgQl0uCiAgICAvLyBCZWhhdmlvciBsaWZlY3ljbGUgbWV0aG9kcyB3ZXJlIGNhbGxlZCBpbiBiZWhhdmlvciBhcnJheSBvcmRlcgogICAgLy8gZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnQsIGUuZy4gKDEpIEMuY3JlYXRlZCwgKDIpIEEuY3JlYXRlZCwKICAgIC8vICgzKSBCLmNyZWF0ZWQsICg0KSBlbGVtZW50LmNyZWF0ZWQuIFRoZXJlIHdhcyBubyBzdXBwb3J0IGZvcgogICAgLy8gc3VwZXIsIGFuZCAic3VwZXItYmVoYXZpb3IiIG1ldGhvZHMgd2VyZSBjYWxsYWJsZSBvbmx5IGJ5IG5hbWUpLgogICAgLy8KICAgIC8vIDIueAogICAgLy8gQmVoYXZpb3JzIGFyZSBtYWRlIGludG8gcHJvcGVyIG1peGlucyB3aGljaCBsaXZlIGluIHRoZQogICAgLy8gZWxlbWVudCdzIHByb3RvdHlwZSBjaGFpbi4gQmVoYXZpb3JzIGFyZSBwbGFjZWQgaW4gdGhlIGVsZW1lbnQgcHJvdG90eXBlCiAgICAvLyBlbGRlc3QgdG8geW91bmdlc3QgYW5kIGRlLWR1cGVkIHlvdW5nZXN0IHRvIG9sZGVzdDoKICAgIC8vIFNvLCBmaXJzdCBbQSwgQiwgQywgQSwgQl0gYmVjb21lcyBbQywgQSwgQl0gdGhlbiwKICAgIC8vIHRoZSBlbGVtZW50IHByb3RvdHlwZSBiZWNvbWVzIChvbGRlc3QpICgxKSBQb2x5bWVyLkVsZW1lbnQsICgyKSBjbGFzcyhDKSwKICAgIC8vICgzKSBjbGFzcyhBKSwgKDQpIGNsYXNzKEIpLCAoNSkgY2xhc3MoUG9seW1lcih7Li4ufSkpLgogICAgLy8gUmVzdWx0OgogICAgLy8gVGhpcyBtZWFucyBlbGVtZW50IHByb3BlcnRpZXMgd2luIG92ZXIgQiBwcm9wZXJ0aWVzIHdpbiBvdmVyIEEgd2luCiAgICAvLyBvdmVyIEMuIChzYW1lIGFzIDEueCkKICAgIC8vIElmIGxpZmVjeWNsZSBpcyBjYWxsZWQgKHN1cGVyIHRoZW4gbWUpLCBvcmRlciBpcwogICAgLy8gKDEpIEMuY3JlYXRlZCwgKDIpIEEuY3JlYXRlZCwgKDMpIEIuY3JlYXRlZCwgKDQpIGVsZW1lbnQuY3JlYXRlZAogICAgLy8gKGFnYWluIHNhbWUgYXMgMS54KQogICAgZnVuY3Rpb24gYXBwbHlCZWhhdmlvcnMocHJvdG8sIGJlaGF2aW9ycywgbGlmZWN5Y2xlKSB7CiAgICAgIGZvciAobGV0IGk9MDsgaTxiZWhhdmlvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBhcHBseUluZm8ocHJvdG8sIGJlaGF2aW9yc1tpXSwgbGlmZWN5Y2xlLCBleGNsdWRlT25CZWhhdmlvcnMpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYXBwbHlJbmZvKHByb3RvLCBpbmZvLCBsaWZlY3ljbGUsIGV4Y2x1ZGVQcm9wcykgewogICAgICBjb3B5UHJvcGVydGllcyhpbmZvLCBwcm90bywgZXhjbHVkZVByb3BzKTsKICAgICAgZm9yIChsZXQgcCBpbiBsaWZlY3ljbGVQcm9wcykgewogICAgICAgIGlmIChpbmZvW3BdKSB7CiAgICAgICAgICBsaWZlY3ljbGVbcF0gPSBsaWZlY3ljbGVbcF0gfHwgW107CiAgICAgICAgICBsaWZlY3ljbGVbcF0ucHVzaChpbmZvW3BdKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7QXJyYXl9IGJlaGF2aW9ycyBMaXN0IG9mIGJlaGF2aW9ycyB0byBmbGF0dGVuLgogICAgICogQHBhcmFtIHtBcnJheT19IGxpc3QgVGFyZ2V0IGxpc3QgdG8gZmxhdHRlbiBiZWhhdmlvcnMgaW50by4KICAgICAqIEBwYXJhbSB7QXJyYXk9fSBleGNsdWRlIExpc3Qgb2YgYmVoYXZpb3JzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgbGlzdC4KICAgICAqIEByZXR1cm4geyFBcnJheX0gUmV0dXJucyB0aGUgbGlzdCBvZiBmbGF0dGVuZWQgYmVoYXZpb3JzLgogICAgICovCiAgICBmdW5jdGlvbiBmbGF0dGVuQmVoYXZpb3JzKGJlaGF2aW9ycywgbGlzdCwgZXhjbHVkZSkgewogICAgICBsaXN0ID0gbGlzdCB8fCBbXTsKICAgICAgZm9yIChsZXQgaT1iZWhhdmlvcnMubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgbGV0IGIgPSBiZWhhdmlvcnNbaV07CiAgICAgICAgaWYgKGIpIHsKICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGIpKSB7CiAgICAgICAgICAgIGZsYXR0ZW5CZWhhdmlvcnMoYiwgbGlzdCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBkZWR1cAogICAgICAgICAgICBpZiAobGlzdC5pbmRleE9mKGIpIDwgMCAmJiAoIWV4Y2x1ZGUgfHwgZXhjbHVkZS5pbmRleE9mKGIpIDwgMCkpIHsKICAgICAgICAgICAgICBsaXN0LnVuc2hpZnQoYik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc29sZS53YXJuKCdiZWhhdmlvciBpcyBudWxsLCBjaGVjayBmb3IgbWlzc2luZyBvciA0MDQgaW1wb3J0Jyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBsaXN0OwogICAgfQoKICAgIC8qIE5vdGUgYWJvdXQgY29uc3RydWN0aW9uIGFuZCBleHRlbnNpb24gb2YgbGVnYWN5IGNsYXNzZXMuCiAgICAgIFtDaGFuZ2VkIGluIFE0IDIwMTggdG8gb3B0aW1pemUgcGVyZm9ybWFuY2UuXQoKICAgICAgV2hlbiBjYWxsaW5nIGBQb2x5bWVyYCBvciBgbWl4aW5CZWhhdmlvcnNgLCB0aGUgZ2VuZXJhdGVkIGNsYXNzIGJlbG93IGlzCiAgICAgIG1hZGUuIFRoZSBsaXN0IG9mIGJlaGF2aW9ycyB3YXMgcHJldmlvdXNseSBtYWRlIGludG8gb25lIGdlbmVyYXRlZCBjbGFzcyBwZXIKICAgICAgYmVoYXZpb3IsIGJ1dCB0aGlzIGlzIG5vIGxvbmdlciB0aGUgY2FzZSBhcyBiZWhhdmlvcnMgYXJlIG5vdyBjYWxsZWQKICAgICAgbWFudWFsbHkuIE5vdGUsIHRoZXJlIG1heSAqc3RpbGwqIGJlIG11bHRpcGxlIGdlbmVyYXRlZCBjbGFzc2VzIGluIHRoZQogICAgICBlbGVtZW50J3MgcHJvdG90eXBlIGNoYWluIGlmIGV4dGVuc2lvbiBpcyB1c2VkIHdpdGggYG1peGluQmVoYXZpb3JzYC4KCiAgICAgIFRoZSBnZW5lcmF0ZWQgY2xhc3MgaXMgZGlyZWN0bHkgdGllZCB0byB0aGUgaW5mbyBvYmplY3QgYW5kIGJlaGF2aW9ycwogICAgICB1c2VkIHRvIGNyZWF0ZSBpdC4gVGhhdCBsaXN0IG9mIGJlaGF2aW9ycyBpcyBmaWx0ZXJlZCBzbyBpdCdzIG9ubHkgdGhlCiAgICAgIGJlaGF2aW9ycyBub3QgYWN0aXZlIG9uIHRoZSBzdXBlcmNsYXNzLiBJbiBvcmRlciB0byBjYWxsIHRocm91Z2ggdG8gdGhlCiAgICAgIGVudGlyZSBsaXN0IG9mIGxpZmVjeWNsZSBtZXRob2RzLCBpdCdzIGltcG9ydGFudCB0byBjYWxsIGBzdXBlcmAuCgogICAgICBUaGUgZWxlbWVudCdzIGBwcm9wZXJ0aWVzYCBhbmQgYG9ic2VydmVyc2AgYXJlIGNvbnRyb2xsZWQgdmlhIHRoZSBmaW5hbGl6YXRpb24KICAgICAgbWVjaGFuaXNtIHByb3ZpZGVkIGJ5IGBQcm9wZXJ0aWVzTWl4aW5gLiBgUHJvcGVydGllc2AgYW5kIGBvYnNlcnZlcnNgIGFyZQogICAgICBjb2xsZWN0ZWQgYnkgbWFudWFsbHkgdHJhdmVyc2luZyB0aGUgcHJvdG90eXBlIGNoYWluIGFuZCBtZXJnaW5nLgoKICAgICAgVG8gbGltaXQgY2hhbmdlcywgdGhlIGBfcmVnaXN0ZXJlZGAgbWV0aG9kIGlzIGNhbGxlZCB2aWEgYF9pbml0aWFsaXplUHJvcGVydGllc2AKICAgICAgYW5kIG5vdCBgX2ZpbmFsaXplQ2xhc3NgLgogICAgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gUG9seW1lciBpbmZvIG9iamVjdAogICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6SFRNTEVsZW1lbnQpfSBCYXNlIGJhc2UgY2xhc3MgdG8gZXh0ZW5kIHdpdGggaW5mbyBvYmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBiZWhhdmlvcnMgYmVoYXZpb3JzIHRvIGNvcHkgaW50byB0aGUgZWxlbWVudAogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OkhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXN9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBHZW5lcmF0ZUNsYXNzRnJvbUluZm8oaW5mbywgQmFzZSwgYmVoYXZpb3JzKSB7CgogICAgICAvLyBtYW5hZ2VzIGJlaGF2aW9yIGFuZCBsaWZlY3ljbGUgcHJvY2Vzc2luZyAoZmlsbGVkIGluIGFmdGVyIGNsYXNzIGRlZmluaXRpb24pCiAgICAgIGxldCBiZWhhdmlvckxpc3Q7CiAgICAgIGNvbnN0IGxpZmVjeWNsZSA9IHt9OwoKICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgIGNsYXNzIFBvbHltZXJHZW5lcmF0ZWQgZXh0ZW5kcyBCYXNlIHsKCiAgICAgICAgLy8gZXhwbGljaXRseSBub3QgY2FsbGluZyBzdXBlci5fZmluYWxpemVDbGFzcwogICAgICAgIHN0YXRpYyBfZmluYWxpemVDbGFzcygpIHsKICAgICAgICAgIC8vIGlmIGNhbGxpbmcgdmlhIGEgc3ViY2xhc3MgdGhhdCBoYXNuJ3QgYmVlbiBnZW5lcmF0ZWQsIHBhc3MgdGhyb3VnaCB0byBzdXBlcgogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KHdpbmRvdy5KU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdnZW5lcmF0ZWRGcm9tJywgdGhpcykpKSB7CiAgICAgICAgICAgIHN1cGVyLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBpbnRlcmxlYXZlIHByb3BlcnRpZXMgYW5kIG9ic2VydmVycyBwZXIgYmVoYXZpb3IgYW5kIGBpbmZvYAogICAgICAgICAgICBpZiAoYmVoYXZpb3JMaXN0KSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBiOyBpIDwgYmVoYXZpb3JMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBiID0gYmVoYXZpb3JMaXN0W2ldOwogICAgICAgICAgICAgICAgaWYgKGIucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnRpZXMoYi5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChiLm9ic2VydmVycykgewogICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU9ic2VydmVycyhiLm9ic2VydmVycywgYi5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGluZm8ucHJvcGVydGllcykgewogICAgICAgICAgICAgIHRoaXMuY3JlYXRlUHJvcGVydGllcyhpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpbmZvLm9ic2VydmVycykgewogICAgICAgICAgICAgIHRoaXMuY3JlYXRlT2JzZXJ2ZXJzKGluZm8ub2JzZXJ2ZXJzLCBpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0byBwcmVwYXJlIHRoZSBlbGVtZW50IHRlbXBsYXRlCiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVUZW1wbGF0ZSgpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewogICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHt9OwogICAgICAgICAgaWYgKGJlaGF2aW9yTGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBiZWhhdmlvckxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMsIGJlaGF2aW9yTGlzdFtpXS5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzLCBpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7CiAgICAgICAgfQoKICAgICAgICBzdGF0aWMgZ2V0IG9ic2VydmVycygpIHsKICAgICAgICAgIGxldCBvYnNlcnZlcnMgPSBbXTsKICAgICAgICAgIGlmIChiZWhhdmlvckxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBiOyBpIDwgYmVoYXZpb3JMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgYiA9IGJlaGF2aW9yTGlzdFtpXTsKICAgICAgICAgICAgICBpZiAoYi5vYnNlcnZlcnMpIHsKICAgICAgICAgICAgICAgIG9ic2VydmVycyA9IG9ic2VydmVycy5jb25jYXQoYi5vYnNlcnZlcnMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGluZm8ub2JzZXJ2ZXJzKSB7CiAgICAgICAgICAgIG9ic2VydmVycyA9IG9ic2VydmVycy5jb25jYXQoaW5mby5vYnNlcnZlcnMpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG9ic2VydmVyczsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgY3JlYXRlZCgpIHsKICAgICAgICAgIHN1cGVyLmNyZWF0ZWQoKTsKICAgICAgICAgIGNvbnN0IGxpc3QgPSBsaWZlY3ljbGUuY3JlYXRlZDsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgX3JlZ2lzdGVyZWQoKSB7CiAgICAgICAgICAvKiBOT1RFOiBgYmVmb3JlUmVnaXN0ZXJgIGlzIGNhbGxlZCBoZXJlIGZvciBiYywgYnV0IHRoZSBiZWhhdmlvcgogICAgICAgICAgICBpcyBkaWZmZXJlbnQgdGhhbiBpbiAxLnguIEluIDEuMCwgdGhlIG1ldGhvZCB3YXMgY2FsbGVkICphZnRlcioKICAgICAgICAgICAgbWl4aW5nIHByb3RvdHlwZXMgdG9nZXRoZXIgYnV0ICpiZWZvcmUqIHByb2Nlc3Npbmcgb2YgbWV0YS1vYmplY3RzLgogICAgICAgICAgICBIb3dldmVyLCBkeW5hbWljIGVmZmVjdHMgY2FuIHN0aWxsIGJlIHNldCBoZXJlIGFuZCBjYW4gYmUgZG9uZSBlaXRoZXIKICAgICAgICAgICAgaW4gYGJlZm9yZVJlZ2lzdGVyYCBvciBgcmVnaXN0ZXJlZGAuIEl0IGlzIG5vIGxvbmdlciBwb3NzaWJsZSB0byBzZXQKICAgICAgICAgICAgYGlzYCBpbiBgYmVmb3JlUmVnaXN0ZXJgIGFzIHlvdSBjb3VsZCBpbiAxLnguCiAgICAgICAgICAqLwogICAgICAgICAgLy8gb25seSBwcm9jZWVkIGlmIHRoZSBnZW5lcmF0ZWQgY2xhc3MnIHByb3RvdHlwZSBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZC4KICAgICAgICAgIGNvbnN0IGdlbmVyYXRlZFByb3RvID0gUG9seW1lckdlbmVyYXRlZC5wcm90b3R5cGU7CiAgICAgICAgICBpZiAoIWdlbmVyYXRlZFByb3RvLmhhc093blByb3BlcnR5KCdfX2hhc1JlZ2lzdGVyRmluaXNoZWQnKSkgewogICAgICAgICAgICBnZW5lcmF0ZWRQcm90by5fX2hhc1JlZ2lzdGVyRmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAvLyBlbnN1cmUgc3VwZXJjbGFzcyBpcyByZWdpc3RlcmVkIGZpcnN0LgogICAgICAgICAgICBzdXBlci5fcmVnaXN0ZXJlZCgpOwogICAgICAgICAgICAvLyBjb3B5IHByb3BlcnRpZXMgb250byB0aGUgZ2VuZXJhdGVkIGNsYXNzIGxhemlseSBpZiB3ZSdyZSBvcHRpbWl6aW5nLAogICAgICAgICAgICBpZiAoUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zKSB7CiAgICAgICAgICAgICAgY29weVByb3BlcnRpZXNUb1Byb3RvKGdlbmVyYXRlZFByb3RvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBtYWtlIHN1cmUgbGVnYWN5IGxpZmVjeWNsZSBpcyBjYWxsZWQgb24gdGhlICplbGVtZW50KidzIHByb3RvdHlwZQogICAgICAgICAgICAvLyBhbmQgbm90IHRoZSBnZW5lcmF0ZWQgY2xhc3MgcHJvdG90eXBlOyBpZiB0aGUgZWxlbWVudCBoYXMgYmVlbgogICAgICAgICAgICAvLyBleHRlbmRlZCwgdGhlc2UgYXJlICpub3QqIHRoZSBzYW1lLgogICAgICAgICAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTsKICAgICAgICAgICAgbGV0IGxpc3QgPSBsaWZlY3ljbGUuYmVmb3JlUmVnaXN0ZXI7CiAgICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgbGlzdFtpXS5jYWxsKHByb3RvKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGlzdCA9IGxpZmVjeWNsZS5yZWdpc3RlcmVkOwogICAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGxpc3RbaV0uY2FsbChwcm90byk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9hcHBseUxpc3RlbmVycygpIHsKICAgICAgICAgIHN1cGVyLl9hcHBseUxpc3RlbmVycygpOwogICAgICAgICAgY29uc3QgbGlzdCA9IGxpZmVjeWNsZS5saXN0ZW5lcnM7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gbGlzdFtpXTsKICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBsIGluIGxpc3RlbmVycykgewogICAgICAgICAgICAgICAgICB0aGlzLl9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKHRoaXMsIGwsIGxpc3RlbmVyc1tsXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBub3RlOiBleGNlcHRpb24gdG8gInN1cGVyIHRoZW4gbWUiIHJ1bGU7CiAgICAgICAgLy8gZG8gd29yayBiZWZvcmUgY2FsbGluZyBzdXBlciBzbyB0aGF0IHN1cGVyIGF0dHJpYnV0ZXMKICAgICAgICAvLyBvbmx5IGFwcGx5IGlmIG5vdCBhbHJlYWR5IHNldC4KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9lbnN1cmVBdHRyaWJ1dGVzKCkgewogICAgICAgICAgY29uc3QgbGlzdCA9IGxpZmVjeWNsZS5ob3N0QXR0cmlidXRlczsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9bGlzdC5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICBjb25zdCBob3N0QXR0cmlidXRlcyA9IGxpc3RbaV07CiAgICAgICAgICAgICAgZm9yIChsZXQgYSBpbiBob3N0QXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgICB0aGlzLl9lbnN1cmVBdHRyaWJ1dGUoYSwgaG9zdEF0dHJpYnV0ZXNbYV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBzdXBlci5fZW5zdXJlQXR0cmlidXRlcygpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgICAgICBsZXQgbGlzdCA9IGxpZmVjeWNsZS5yZWFkeTsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgYXR0YWNoZWQoKSB7CiAgICAgICAgICBzdXBlci5hdHRhY2hlZCgpOwogICAgICAgICAgbGV0IGxpc3QgPSBsaWZlY3ljbGUuYXR0YWNoZWQ7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbGlzdFtpXS5jYWxsKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGRldGFjaGVkKCkgewogICAgICAgICAgc3VwZXIuZGV0YWNoZWQoKTsKICAgICAgICAgIGxldCBsaXN0ID0gbGlmZWN5Y2xlLmRldGFjaGVkOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGxpc3RbaV0uY2FsbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50cyBuYXRpdmUgQ3VzdG9tIEVsZW1lbnRzIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvCiAgICAgICAgICogc2V0IGFuIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIHByb3BlcnR5IHZpYSBgX2F0dHJpYnV0ZVRvUHJvcGVydHlgLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUgdGhhdCBjaGFuZ2VkCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgT2xkIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgTmV3IGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZChuYW1lLCBvbGQsIHZhbHVlKSB7CiAgICAgICAgICBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkKCk7CiAgICAgICAgICBsZXQgbGlzdCA9IGxpZmVjeWNsZS5hdHRyaWJ1dGVDaGFuZ2VkOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGxpc3RbaV0uY2FsbCh0aGlzLCBuYW1lLCBvbGQsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gYXBwbHkgYmVoYXZpb3JzLCBub3RlIGFjdHVhbCBjb3B5aW5nIGlzIGRvbmUgbGF6aWx5IGF0IGZpcnN0IGluc3RhbmNlIGNyZWF0aW9uCiAgICAgIGlmIChiZWhhdmlvcnMpIHsKICAgICAgICAvLyBOT1RFOiBlbnN1cmUgdGhlIGJlaGF2aW9yIGlzIGV4dGVuZGluZyBhIGNsYXNzIHdpdGgKICAgICAgICAvLyBsZWdhY3kgZWxlbWVudCBhcGkuIFRoaXMgaXMgbmVjZXNzYXJ5IHNpbmNlIGJlaGF2aW9ycyBleHBlY3QgdG8gYmUgYWJsZQogICAgICAgIC8vIHRvIGFjY2VzcyAxLnggbGVnYWN5IGFwaS4KICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYmVoYXZpb3JzKSkgewogICAgICAgICAgYmVoYXZpb3JzID0gW2JlaGF2aW9yc107CiAgICAgICAgfQogICAgICAgIGxldCBzdXBlckJlaGF2aW9ycyA9IEJhc2UucHJvdG90eXBlLmJlaGF2aW9yczsKICAgICAgICAvLyBnZXQgZmxhdHRlbmVkLCBkZWR1cGVkIGxpc3Qgb2YgYmVoYXZpb3JzICpub3QqIGFscmVhZHkgb24gc3VwZXIgY2xhc3MKICAgICAgICBiZWhhdmlvckxpc3QgPSBmbGF0dGVuQmVoYXZpb3JzKGJlaGF2aW9ycywgbnVsbCwgc3VwZXJCZWhhdmlvcnMpOwogICAgICAgIFBvbHltZXJHZW5lcmF0ZWQucHJvdG90eXBlLmJlaGF2aW9ycyA9IHN1cGVyQmVoYXZpb3JzID8KICAgICAgICAgIHN1cGVyQmVoYXZpb3JzLmNvbmNhdChiZWhhdmlvcnMpIDogYmVoYXZpb3JMaXN0OwogICAgICB9CgogICAgICBjb25zdCBjb3B5UHJvcGVydGllc1RvUHJvdG8gPSAocHJvdG8pID0+IHsKICAgICAgICBpZiAoYmVoYXZpb3JMaXN0KSB7CiAgICAgICAgICBhcHBseUJlaGF2aW9ycyhwcm90bywgYmVoYXZpb3JMaXN0LCBsaWZlY3ljbGUpOwogICAgICAgIH0KICAgICAgICBhcHBseUluZm8ocHJvdG8sIGluZm8sIGxpZmVjeWNsZSwgZXhjbHVkZU9uSW5mbyk7CiAgICAgIH07CgogICAgICAvLyBjb3B5IHByb3BlcnRpZXMgaWYgd2UncmUgbm90IG9wdGltaXppbmcKICAgICAgaWYgKCFQb2x5bWVyLmxlZ2FjeU9wdGltaXphdGlvbnMpIHsKICAgICAgICBjb3B5UHJvcGVydGllc1RvUHJvdG8oUG9seW1lckdlbmVyYXRlZC5wcm90b3R5cGUpOwogICAgICB9CgogICAgICBQb2x5bWVyR2VuZXJhdGVkLmdlbmVyYXRlZEZyb20gPSBpbmZvOwoKICAgICAgcmV0dXJuIFBvbHltZXJHZW5lcmF0ZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGV4dGVuZHMgYFBvbHltZXIuTGVnYWN5RWxlbWVudGAgYmFzZWQgb24gdGhlCiAgICAgKiBwcm92aWRlZCBpbmZvIG9iamVjdC4gIE1ldGFkYXRhIG9iamVjdHMgb24gdGhlIGBpbmZvYCBvYmplY3QKICAgICAqIChgcHJvcGVydGllc2AsIGBvYnNlcnZlcnNgLCBgbGlzdGVuZXJzYCwgYGJlaGF2aW9yc2AsIGBpc2ApIGFyZSB1c2VkCiAgICAgKiBmb3IgUG9seW1lcidzIG1ldGEtcHJvZ3JhbW1pbmcgc3lzdGVtcywgYW5kIGFueSBmdW5jdGlvbnMgYXJlIGNvcGllZAogICAgICogdG8gdGhlIGdlbmVyYXRlZCBjbGFzcy4KICAgICAqCiAgICAgKiBWYWxpZCAibWV0YWRhdGEiIHZhbHVlcyBhcmUgYXMgZm9sbG93czoKICAgICAqCiAgICAgKiBgaXNgOiBTdHJpbmcgcHJvdmlkaW5nIHRoZSB0YWcgbmFtZSB0byByZWdpc3RlciB0aGUgZWxlbWVudCB1bmRlci4gSW4KICAgICAqIGFkZGl0aW9uLCBpZiBhIGBkb20tbW9kdWxlYCB3aXRoIHRoZSBzYW1lIGlkIGV4aXN0cywgdGhlIGZpcnN0IHRlbXBsYXRlCiAgICAgKiBpbiB0aGF0IGBkb20tbW9kdWxlYCB3aWxsIGJlIHN0YW1wZWQgaW50byB0aGUgc2hhZG93IHJvb3Qgb2YgdGhpcyBlbGVtZW50LAogICAgICogd2l0aCBzdXBwb3J0IGZvciBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMgKGBvbi0uLi5gKSwgUG9seW1lciBkYXRhCiAgICAgKiBiaW5kaW5ncyAoYFtbLi4uXV1gIGFuZCBge3suLi59fWApLCBhbmQgaWQtYmFzZWQgbm9kZSBmaW5kaW5nIGludG8KICAgICAqIGB0aGlzLiRgLgogICAgICoKICAgICAqIGBwcm9wZXJ0aWVzYDogT2JqZWN0IGRlc2NyaWJpbmcgcHJvcGVydHktcmVsYXRlZCBtZXRhZGF0YSB1c2VkIGJ5IFBvbHltZXIKICAgICAqIGZlYXR1cmVzIChrZXk6IHByb3BlcnR5IG5hbWVzLCB2YWx1ZTogb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydHkgbWV0YWRhdGEpLgogICAgICogVmFsaWQga2V5cyBpbiBwZXItcHJvcGVydHkgbWV0YWRhdGEgaW5jbHVkZToKICAgICAqIC0gYHR5cGVgIChTdHJpbmd8TnVtYmVyfE9iamVjdHxBcnJheXwuLi4pOiBVc2VkIGJ5CiAgICAgKiAgIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvIGRldGVybWluZSBob3cgc3RyaW5nLWJhc2VkIGF0dHJpYnV0ZXMKICAgICAqICAgYXJlIGRlc2VyaWFsaXplZCB0byBKYXZhU2NyaXB0IHByb3BlcnR5IHZhbHVlcy4KICAgICAqIC0gYG5vdGlmeWAgKGJvb2xlYW4pOiBDYXVzZXMgYSBjaGFuZ2UgaW4gdGhlIHByb3BlcnR5IHRvIGZpcmUgYQogICAgICogICBub24tYnViYmxpbmcgZXZlbnQgY2FsbGVkIGA8cHJvcGVydHk+LWNoYW5nZWRgLiBFbGVtZW50cyB0aGF0IGhhdmUKICAgICAqICAgZW5hYmxlZCB0d28td2F5IGJpbmRpbmcgdG8gdGhlIHByb3BlcnR5IHVzZSB0aGlzIGV2ZW50IHRvIG9ic2VydmUgY2hhbmdlcy4KICAgICAqIC0gYHJlYWRPbmx5YCAoYm9vbGVhbik6IENyZWF0ZXMgYSBnZXR0ZXIgZm9yIHRoZSBwcm9wZXJ0eSwgYnV0IG5vIHNldHRlci4KICAgICAqICAgVG8gc2V0IGEgcmVhZC1vbmx5IHByb3BlcnR5LCB1c2UgdGhlIHByaXZhdGUgc2V0dGVyIG1ldGhvZAogICAgICogICBgX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSlgLgogICAgICogLSBgb2JzZXJ2ZXJgIChzdHJpbmcpOiBPYnNlcnZlciBtZXRob2QgbmFtZSB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4KICAgICAqICAgdGhlIHByb3BlcnR5IGNoYW5nZXMuIFRoZSBhcmd1bWVudHMgb2YgdGhlIG1ldGhvZCBhcmUKICAgICAqICAgYCh2YWx1ZSwgcHJldmlvdXNWYWx1ZSlgLgogICAgICogLSBgY29tcHV0ZWRgIChzdHJpbmcpOiBTdHJpbmcgZGVzY3JpYmluZyBtZXRob2QgYW5kIGRlcGVuZGVudCBwcm9wZXJ0aWVzCiAgICAgKiAgIGZvciBjb21wdXRpbmcgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgKGUuZy4gYCdjb21wdXRlRm9vKGJhciwgem90KSdgKS4KICAgICAqICAgQ29tcHV0ZWQgcHJvcGVydGllcyBhcmUgcmVhZC1vbmx5IGJ5IGRlZmF1bHQgYW5kIGNhbiBvbmx5IGJlIGNoYW5nZWQKICAgICAqICAgdmlhIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGNvbXB1dGluZyBtZXRob2QuCiAgICAgKgogICAgICogYG9ic2VydmVyc2A6IEFycmF5IG9mIHN0cmluZ3MgZGVzY3JpYmluZyBtdWx0aS1wcm9wZXJ0eSBvYnNlcnZlciBtZXRob2RzCiAgICAgKiAgYW5kIHRoZWlyIGRlcGVuZGVudCBwcm9wZXJ0aWVzIChlLmcuIGAnb2JzZXJ2ZUFCQyhhLCBiLCBjKSdgKS4KICAgICAqCiAgICAgKiBgbGlzdGVuZXJzYDogT2JqZWN0IGRlc2NyaWJpbmcgZXZlbnQgbGlzdGVuZXJzIHRvIGJlIGFkZGVkIHRvIGVhY2gKICAgICAqICBpbnN0YW5jZSBvZiB0aGlzIGVsZW1lbnQgKGtleTogZXZlbnQgbmFtZSwgdmFsdWU6IG1ldGhvZCBuYW1lKS4KICAgICAqCiAgICAgKiBgYmVoYXZpb3JzYDogQXJyYXkgb2YgYWRkaXRpb25hbCBgaW5mb2Agb2JqZWN0cyBjb250YWluaW5nIG1ldGFkYXRhCiAgICAgKiBhbmQgY2FsbGJhY2tzIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgYGluZm9gIG9iamVjdCBoZXJlIHdoaWNoIGFyZQogICAgICogbWVyZ2VkIGludG8gdGhpcyBlbGVtZW50LgogICAgICoKICAgICAqIGBob3N0QXR0cmlidXRlc2A6IE9iamVjdCBsaXN0aW5nIGF0dHJpYnV0ZXMgdG8gYmUgYXBwbGllZCB0byB0aGUgaG9zdAogICAgICogIG9uY2UgY3JlYXRlZCAoa2V5OiBhdHRyaWJ1dGUgbmFtZSwgdmFsdWU6IGF0dHJpYnV0ZSB2YWx1ZSkuICBWYWx1ZXMKICAgICAqICBhcmUgc2VyaWFsaXplZCBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0aGUgdmFsdWUuICBIb3N0IGF0dHJpYnV0ZXMgc2hvdWxkCiAgICAgKiAgZ2VuZXJhbGx5IGJlIGxpbWl0ZWQgdG8gYXR0cmlidXRlcyBzdWNoIGFzIGB0YWJJbmRleGAgYW5kIGBhcmlhLS4uLmAuCiAgICAgKiAgQXR0cmlidXRlcyBpbiBgaG9zdEF0dHJpYnV0ZXNgIGFyZSBvbmx5IGFwcGxpZWQgaWYgYSB1c2VyLXN1cHBsaWVkCiAgICAgKiAgYXR0cmlidXRlIGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgKGF0dHJpYnV0ZXMgaW4gbWFya3VwIG92ZXJyaWRlCiAgICAgKiAgYGhvc3RBdHRyaWJ1dGVzYCkuCiAgICAgKgogICAgICogSW4gYWRkaXRpb24sIHRoZSBmb2xsb3dpbmcgUG9seW1lci1zcGVjaWZpYyBjYWxsYmFja3MgbWF5IGJlIHByb3ZpZGVkOgogICAgICogLSBgcmVnaXN0ZXJlZGA6IGNhbGxlZCBhZnRlciBmaXJzdCBpbnN0YW5jZSBvZiB0aGlzIGVsZW1lbnQsCiAgICAgKiAtIGBjcmVhdGVkYDogY2FsbGVkIGR1cmluZyBgY29uc3RydWN0b3JgCiAgICAgKiAtIGBhdHRhY2hlZGA6IGNhbGxlZCBkdXJpbmcgYGNvbm5lY3RlZENhbGxiYWNrYAogICAgICogLSBgZGV0YWNoZWRgOiBjYWxsZWQgZHVyaW5nIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AKICAgICAqIC0gYHJlYWR5YDogY2FsbGVkIGJlZm9yZSBmaXJzdCBgYXR0YWNoZWRgLCBhZnRlciBhbGwgcHJvcGVydGllcyBvZgogICAgICogICB0aGlzIGVsZW1lbnQgaGF2ZSBiZWVuIHByb3BhZ2F0ZWQgdG8gaXRzIHRlbXBsYXRlIGFuZCBhbGwgb2JzZXJ2ZXJzCiAgICAgKiAgIGhhdmUgcnVuCiAgICAgKgogICAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gT2JqZWN0IGNvbnRhaW5pbmcgUG9seW1lciBtZXRhZGF0YSBhbmQgZnVuY3Rpb25zCiAgICAgKiAgIHRvIGJlY29tZSBjbGFzcyBtZXRob2RzLgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oVCk6VH0gbWl4aW4gT3B0aW9uYWwgbWl4aW4gdG8gYXBwbHkgdG8gbGVnYWN5IGJhc2UgY2xhc3MKICAgICAqICAgYmVmb3JlIGV4dGVuZGluZyB3aXRoIFBvbHltZXIgbWV0YXByb2dyYW1taW5nLgogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OkhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICovCiAgICBQb2x5bWVyLkNsYXNzID0gZnVuY3Rpb24oaW5mbywgbWl4aW4pIHsKICAgICAgaWYgKCFpbmZvKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdQb2x5bWVyLkNsYXNzIHJlcXVpcmVzIGBpbmZvYCBhcmd1bWVudCcpOwogICAgICB9CiAgICAgIGxldCBrbGFzcyA9IG1peGluID8gbWl4aW4oUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW4oSFRNTEVsZW1lbnQpKSA6CiAgICAgICAgICBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhpbihIVE1MRWxlbWVudCk7CiAgICAgIGtsYXNzID0gR2VuZXJhdGVDbGFzc0Zyb21JbmZvKGluZm8sIGtsYXNzLCBpbmZvLmJlaGF2aW9ycyk7CiAgICAgIGlmIChpbmZvLl9lbmFibGVEaXNhYmxlVXBncmFkZSkgewogICAgICAgIGtsYXNzID0gUG9seW1lci5EaXNhYmxlVXBncmFkZU1peGluKGtsYXNzKTsKICAgICAgfQogICAgICAvLyBkZWNvcmF0ZSBrbGFzcyB3aXRoIHJlZ2lzdHJhdGlvbiBpbmZvCiAgICAgIGtsYXNzLmlzID0ga2xhc3MucHJvdG90eXBlLmlzID0gaW5mby5pczsKICAgICAgcmV0dXJuIGtsYXNzOwogICAgfTsKCiAgICBQb2x5bWVyLm1peGluQmVoYXZpb3JzID0gbWl4aW5CZWhhdmlvcnM7CgogIH0pKCk7CgoKCgogIChmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvKioKICAgICAqIExlZ2FjeSBjbGFzcyBmYWN0b3J5IGFuZCByZWdpc3RyYXRpb24gaGVscGVyIGZvciBkZWZpbmluZyBQb2x5bWVyCiAgICAgKiBlbGVtZW50cy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvCiAgICAgKiBgY3VzdG9tRWxlbWVudHMuZGVmaW5lKGluZm8uaXMsIFBvbHltZXIuQ2xhc3MoaW5mbykpO2AKICAgICAqCiAgICAgKiBTZWUgYFBvbHltZXIuQ2xhc3NgIGZvciBkZXRhaWxzIG9uIHZhbGlkIGxlZ2FjeSBtZXRhZGF0YSBmb3JtYXQgZm9yIGBpbmZvYC4KICAgICAqCiAgICAgKiBAZ2xvYmFsCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEBmdW5jdGlvbiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFQb2x5bWVySW5pdH0gaW5mbyBPYmplY3QgY29udGFpbmluZyBQb2x5bWVyIG1ldGFkYXRhIGFuZCBmdW5jdGlvbnMKICAgICAqICAgdG8gYmVjb21lIGNsYXNzIG1ldGhvZHMuCiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6IEhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAc3VwcHJlc3Mge2R1cGxpY2F0ZSwgaW52YWxpZENhc3RzLCBjaGVja1R5cGVzfQogICAgICovCiAgICB3aW5kb3cuUG9seW1lci5fcG9seW1lckZuID0gZnVuY3Rpb24oaW5mbykgewogICAgICAvLyBpZiBpbnB1dCBpcyBhIGBjbGFzc2AgKGFrYSBhIGZ1bmN0aW9uIHdpdGggYSBwcm90b3R5cGUpLCB1c2UgdGhlIHByb3RvdHlwZQogICAgICAvLyByZW1lbWJlciB0aGF0IHRoZSBgY29uc3RydWN0b3JgIHdpbGwgbmV2ZXIgYmUgY2FsbGVkCiAgICAgIGxldCBrbGFzczsKICAgICAgaWYgKHR5cGVvZiBpbmZvID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAga2xhc3MgPSBpbmZvOwogICAgICB9IGVsc2UgewogICAgICAgIGtsYXNzID0gUG9seW1lci5DbGFzcyhpbmZvKTsKICAgICAgfQogICAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoa2xhc3MuaXMsIC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyhrbGFzcykpOwogICAgICByZXR1cm4ga2xhc3M7CiAgICB9OwoKICB9KSgpOwoKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvLyBDb21tb24gaW1wbGVtZW50YXRpb24gZm9yIG1peGluICYgYmVoYXZpb3IKICBmdW5jdGlvbiBtdXRhYmxlUHJvcGVydHlDaGFuZ2UoaW5zdCwgcHJvcGVydHksIHZhbHVlLCBvbGQsIG11dGFibGVEYXRhKSB7CiAgICBsZXQgaXNPYmplY3Q7CiAgICBpZiAobXV0YWJsZURhdGEpIHsKICAgICAgaXNPYmplY3QgPSAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCk7CiAgICAgIC8vIFB1bGwgYG9sZGAgZm9yIE9iamVjdHMgZnJvbSB0ZW1wIGNhY2hlLCBidXQgdHJlYXQgYG51bGxgIGFzIGEgcHJpbWl0aXZlCiAgICAgIGlmIChpc09iamVjdCkgewogICAgICAgIG9sZCA9IGluc3QuX19kYXRhVGVtcFtwcm9wZXJ0eV07CiAgICAgIH0KICAgIH0KICAgIC8vIFN0cmljdCBlcXVhbGl0eSBjaGVjaywgYnV0IHJldHVybiBmYWxzZSBmb3IgTmFOPT09TmFOCiAgICBsZXQgc2hvdWxkQ2hhbmdlID0gKG9sZCAhPT0gdmFsdWUgJiYgKG9sZCA9PT0gb2xkIHx8IHZhbHVlID09PSB2YWx1ZSkpOwogICAgLy8gT2JqZWN0cyBhcmUgc3RvcmVkIGluIHRlbXBvcmFyeSBjYWNoZSAoY2xlYXJlZCBhdCBlbmQgb2YKICAgIC8vIHR1cm4pLCB3aGljaCBpcyB1c2VkIGZvciBkaXJ0eS1jaGVja2luZwogICAgaWYgKGlzT2JqZWN0ICYmIHNob3VsZENoYW5nZSkgewogICAgICBpbnN0Ll9fZGF0YVRlbXBbcHJvcGVydHldID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gc2hvdWxkQ2hhbmdlOwogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0byBza2lwIHN0cmljdCBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzCiAgICogKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpLCBmb3IgdXNlIG9uIGVsZW1lbnRzIHV0aWxpemluZwogICAqIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AKICAgKgogICAqIEJ5IGRlZmF1bHQsIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgcGVyZm9ybXMgc3RyaWN0IGRpcnR5IGNoZWNraW5nIG9uCiAgICogb2JqZWN0cywgd2hpY2ggbWVhbnMgdGhhdCBhbnkgZGVlcCBtb2RpZmljYXRpb25zIHRvIGFuIG9iamVjdCBvciBhcnJheSB3aWxsCiAgICogbm90IGJlIHByb3BhZ2F0ZWQgdW5sZXNzICJpbW11dGFibGUiIGRhdGEgcGF0dGVybnMgYXJlIHVzZWQgKGkuZS4gYWxsIG9iamVjdAogICAqIHJlZmVyZW5jZXMgZnJvbSB0aGUgcm9vdCB0byB0aGUgbXV0YXRpb24gd2VyZSBjaGFuZ2VkKS4KICAgKgogICAqIFBvbHltZXIgYWxzbyBwcm92aWRlcyBhIHByb3ByaWV0YXJ5IGRhdGEgbXV0YXRpb24gYW5kIHBhdGggbm90aWZpY2F0aW9uIEFQSQogICAqIChlLmcuIGBub3RpZnlQYXRoYCwgYHNldGAsIGFuZCBhcnJheSBtdXRhdGlvbiBBUEkncykgdGhhdCBhbGxvdyBlZmZpY2llbnQKICAgKiBtdXRhdGlvbiBhbmQgbm90aWZpY2F0aW9uIG9mIGRlZXAgY2hhbmdlcyBpbiBhbiBvYmplY3QgZ3JhcGggdG8gYWxsIGVsZW1lbnRzCiAgICogYm91bmQgdG8gdGhlIHNhbWUgb2JqZWN0IGdyYXBoLgogICAqCiAgICogSW4gY2FzZXMgd2hlcmUgbmVpdGhlciBpbW11dGFibGUgcGF0dGVybnMgbm9yIHRoZSBkYXRhIG11dGF0aW9uIEFQSSBjYW4gYmUKICAgKiB1c2VkLCBhcHBseWluZyB0aGlzIG1peGluIHdpbGwgY2F1c2UgUG9seW1lciB0byBza2lwIGRpcnR5IGNoZWNraW5nIGZvcgogICAqIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUgImRpcnR5IikuICBUaGlzIGFsbG93cyBhCiAgICogdXNlciB0byBtYWtlIGEgZGVlcCBtb2RpZmljYXRpb24gdG8gYSBib3VuZCBvYmplY3QgZ3JhcGgsIGFuZCB0aGVuIGVpdGhlcgogICAqIHNpbXBseSByZS1zZXQgdGhlIG9iamVjdCAoZS5nLiBgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXNgKSBvciBjYWxsIGBub3RpZnlQYXRoYAogICAqIChlLmcuIGB0aGlzLm5vdGlmeVBhdGgoJ2l0ZW1zJylgKSB0byB1cGRhdGUgdGhlIHRyZWUuICBOb3RlIHRoYXQgYWxsCiAgICogZWxlbWVudHMgdGhhdCB3aXNoIHRvIGJlIHVwZGF0ZWQgYmFzZWQgb24gZGVlcCBtdXRhdGlvbnMgbXVzdCBhcHBseSB0aGlzCiAgICogbWl4aW4gb3Igb3RoZXJ3aXNlIHNraXAgc3RyaWN0IGRpcnR5IGNoZWNraW5nIGZvciBvYmplY3RzL2FycmF5cy4KICAgKiBTcGVjaWZpY2FsbHksIGFueSBlbGVtZW50cyBpbiB0aGUgYmluZGluZyB0cmVlIGJldHdlZW4gdGhlIHNvdXJjZSBvZiBhCiAgICogbXV0YXRpb24gYW5kIHRoZSBjb25zdW1wdGlvbiBvZiBpdCBtdXN0IGFwcGx5IHRoaXMgbWl4aW4gb3IgZW5hYmxlIHRoZQogICAqIGBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFgIG1peGluLgogICAqCiAgICogSW4gb3JkZXIgdG8gbWFrZSB0aGUgZGlydHkgY2hlY2sgc3RyYXRlZ3kgY29uZmlndXJhYmxlLCBzZWUKICAgKiBgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhYC4KICAgKgogICAqIE5vdGUsIHRoZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcHJvcGFnYXRpbmcgbGFyZ2Ugb2JqZWN0IGdyYXBocwogICAqIHdpbGwgYmUgd29yc2UgYXMgb3Bwb3NlZCB0byB1c2luZyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgd2l0aCBpbW11dGFibGUKICAgKiBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24gQVBJLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0byBza2lwIHN0cmljdCBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cwogICAqICAgYW5kIGFycmF5cwogICAqLwogIFBvbHltZXIuTXV0YWJsZURhdGEgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX011dGFibGVEYXRhfQogICAgICovCiAgICBjbGFzcyBNdXRhYmxlRGF0YSBleHRlbmRzIHN1cGVyQ2xhc3MgewogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgdG8gcHJvdmlkZSBvcHRpb24gZm9yIHNraXBwaW5nCiAgICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBwdWxscyB0aGUgdmFsdWUgdG8gZGlydHkgY2hlY2sgYWdhaW5zdCBmcm9tIHRoZSBgX19kYXRhVGVtcGAKICAgICAgICogY2FjaGUgKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAgICogY2FjaGUgaXMgY2xlYXJlZCBhdCB0aGUgZW5kIG9mIGEgdHVybiwgdGhpcyBpbXBsZW1lbnRhdGlvbiBhbGxvd3MKICAgICAgICogc2lkZS1lZmZlY3RzIG9mIGRlZXAgb2JqZWN0IGNoYW5nZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHJlLXNldHRpbmcgdGhlCiAgICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAgICogY3ljbGVzIGR1ZSB0byAyLXdheSBub3RpZmljYXRpb24pLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIE5ldyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgKiBAcGFyYW0geyp9IG9sZCBQcmV2aW91cyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgICByZXR1cm4gbXV0YWJsZVByb3BlcnR5Q2hhbmdlKHRoaXMsIHByb3BlcnR5LCB2YWx1ZSwgb2xkLCB0cnVlKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gTXV0YWJsZURhdGE7CgogIH0pOwoKCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0byBhZGQgdGhlIG9wdGlvbmFsIGFiaWxpdHkgdG8gc2tpcCBzdHJpY3QKICAgKiBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZQogICAqICJkaXJ0eSIpIGJ5IHNldHRpbmcgYSBgbXV0YWJsZS1kYXRhYCBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudCBpbnN0YW5jZS4KICAgKgogICAqIEJ5IGRlZmF1bHQsIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgcGVyZm9ybXMgc3RyaWN0IGRpcnR5IGNoZWNraW5nIG9uCiAgICogb2JqZWN0cywgd2hpY2ggbWVhbnMgdGhhdCBhbnkgZGVlcCBtb2RpZmljYXRpb25zIHRvIGFuIG9iamVjdCBvciBhcnJheSB3aWxsCiAgICogbm90IGJlIHByb3BhZ2F0ZWQgdW5sZXNzICJpbW11dGFibGUiIGRhdGEgcGF0dGVybnMgYXJlIHVzZWQgKGkuZS4gYWxsIG9iamVjdAogICAqIHJlZmVyZW5jZXMgZnJvbSB0aGUgcm9vdCB0byB0aGUgbXV0YXRpb24gd2VyZSBjaGFuZ2VkKS4KICAgKgogICAqIFBvbHltZXIgYWxzbyBwcm92aWRlcyBhIHByb3ByaWV0YXJ5IGRhdGEgbXV0YXRpb24gYW5kIHBhdGggbm90aWZpY2F0aW9uIEFQSQogICAqIChlLmcuIGBub3RpZnlQYXRoYCwgYHNldGAsIGFuZCBhcnJheSBtdXRhdGlvbiBBUEkncykgdGhhdCBhbGxvdyBlZmZpY2llbnQKICAgKiBtdXRhdGlvbiBhbmQgbm90aWZpY2F0aW9uIG9mIGRlZXAgY2hhbmdlcyBpbiBhbiBvYmplY3QgZ3JhcGggdG8gYWxsIGVsZW1lbnRzCiAgICogYm91bmQgdG8gdGhlIHNhbWUgb2JqZWN0IGdyYXBoLgogICAqCiAgICogSW4gY2FzZXMgd2hlcmUgbmVpdGhlciBpbW11dGFibGUgcGF0dGVybnMgbm9yIHRoZSBkYXRhIG11dGF0aW9uIEFQSSBjYW4gYmUKICAgKiB1c2VkLCBhcHBseWluZyB0aGlzIG1peGluIHdpbGwgYWxsb3cgUG9seW1lciB0byBza2lwIGRpcnR5IGNoZWNraW5nIGZvcgogICAqIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUgImRpcnR5IikuICBUaGlzIGFsbG93cyBhCiAgICogdXNlciB0byBtYWtlIGEgZGVlcCBtb2RpZmljYXRpb24gdG8gYSBib3VuZCBvYmplY3QgZ3JhcGgsIGFuZCB0aGVuIGVpdGhlcgogICAqIHNpbXBseSByZS1zZXQgdGhlIG9iamVjdCAoZS5nLiBgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXNgKSBvciBjYWxsIGBub3RpZnlQYXRoYAogICAqIChlLmcuIGB0aGlzLm5vdGlmeVBhdGgoJ2l0ZW1zJylgKSB0byB1cGRhdGUgdGhlIHRyZWUuICBOb3RlIHRoYXQgYWxsCiAgICogZWxlbWVudHMgdGhhdCB3aXNoIHRvIGJlIHVwZGF0ZWQgYmFzZWQgb24gZGVlcCBtdXRhdGlvbnMgbXVzdCBhcHBseSB0aGlzCiAgICogbWl4aW4gb3Igb3RoZXJ3aXNlIHNraXAgc3RyaWN0IGRpcnR5IGNoZWNraW5nIGZvciBvYmplY3RzL2FycmF5cy4KICAgKiBTcGVjaWZpY2FsbHksIGFueSBlbGVtZW50cyBpbiB0aGUgYmluZGluZyB0cmVlIGJldHdlZW4gdGhlIHNvdXJjZSBvZiBhCiAgICogbXV0YXRpb24gYW5kIHRoZSBjb25zdW1wdGlvbiBvZiBpdCBtdXN0IGVuYWJsZSB0aGlzIG1peGluIG9yIGFwcGx5IHRoZQogICAqIGBQb2x5bWVyLk11dGFibGVEYXRhYCBtaXhpbi4KICAgKgogICAqIFdoaWxlIHRoaXMgbWl4aW4gYWRkcyB0aGUgYWJpbGl0eSB0byBmb3JnbyBPYmplY3QvQXJyYXkgZGlydHkgY2hlY2tpbmcsCiAgICogdGhlIGBtdXRhYmxlRGF0YWAgZmxhZyBkZWZhdWx0cyB0byBmYWxzZSBhbmQgbXVzdCBiZSBzZXQgb24gdGhlIGluc3RhbmNlLgogICAqCiAgICogTm90ZSwgdGhlIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcyBvZiBwcm9wYWdhdGluZyBsYXJnZSBvYmplY3QgZ3JhcGhzCiAgICogd2lsbCBiZSB3b3JzZSBieSByZWx5aW5nIG9uIGBtdXRhYmxlRGF0YTogdHJ1ZWAgYXMgb3Bwb3NlZCB0byB1c2luZwogICAqIHN0cmljdCBkaXJ0eSBjaGVja2luZyB3aXRoIGltbXV0YWJsZSBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24KICAgKiBBUEkuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRvIG9wdGlvbmFsbHkgc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcKICAgKiAgIGZvciBvYmplY3RzIGFuZCBhcnJheXMKICAgKi8KICBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQHBvbHltZXIKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX09wdGlvbmFsTXV0YWJsZURhdGF9CiAgICAgKi8KICAgIGNsYXNzIE9wdGlvbmFsTXV0YWJsZURhdGEgZXh0ZW5kcyBzdXBlckNsYXNzIHsKCiAgICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBJbnN0YW5jZS1sZXZlbCBmbGFnIGZvciBjb25maWd1cmluZyB0aGUgZGlydHktY2hlY2tpbmcgc3RyYXRlZ3kKICAgICAgICAgICAqIGZvciB0aGlzIGVsZW1lbnQuICBXaGVuIHRydWUsIE9iamVjdHMgYW5kIEFycmF5cyB3aWxsIHNraXAgZGlydHkKICAgICAgICAgICAqIGNoZWNraW5nLCBvdGhlcndpc2Ugc3RyaWN0IGVxdWFsaXR5IGNoZWNraW5nIHdpbGwgYmUgdXNlZC4KICAgICAgICAgICAqLwogICAgICAgICAgbXV0YWJsZURhdGE6IEJvb2xlYW4KICAgICAgICB9OwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgdG8gcHJvdmlkZSBvcHRpb24gZm9yIHNraXBwaW5nCiAgICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICAgKgogICAgICAgKiBXaGVuIGB0aGlzLm11dGFibGVEYXRhYCBpcyB0cnVlIG9uIHRoaXMgaW5zdGFuY2UsIHRoaXMgbWV0aG9kCiAgICAgICAqIHB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYCBjYWNoZQogICAgICAgKiAocmF0aGVyIHRoYW4gdGhlIG5vcm1hbCBgX19kYXRhYCBjYWNoZSkgZm9yIE9iamVjdHMuICBTaW5jZSB0aGUgdGVtcAogICAgICAgKiBjYWNoZSBpcyBjbGVhcmVkIGF0IHRoZSBlbmQgb2YgYSB0dXJuLCB0aGlzIGltcGxlbWVudGF0aW9uIGFsbG93cwogICAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAgICogc2FtZSBvYmplY3QgKHVzaW5nIHRoZSB0ZW1wIGNhY2hlIGFzIGFuIGluLXR1cm4gYmFja3N0b3AgdG8gcHJldmVudAogICAgICAgKiBjeWNsZXMgZHVlIHRvIDItd2F5IG5vdGlmaWNhdGlvbikuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgTmV3IHByb3BlcnR5IHZhbHVlCiAgICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBjb25zaWRlcmVkIGEgY2hhbmdlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCkgewogICAgICAgIHJldHVybiBtdXRhYmxlUHJvcGVydHlDaGFuZ2UodGhpcywgcHJvcGVydHksIHZhbHVlLCBvbGQsIHRoaXMubXV0YWJsZURhdGEpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIE9wdGlvbmFsTXV0YWJsZURhdGE7CgogIH0pOwoKICAvLyBFeHBvcnQgZm9yIHVzZSBieSBsZWdhY3kgYmVoYXZpb3IKICBQb2x5bWVyLk11dGFibGVEYXRhLl9tdXRhYmxlUHJvcGVydHlDaGFuZ2UgPSBtdXRhYmxlUHJvcGVydHlDaGFuZ2U7Cgp9KSgpOwoKCiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEJhc2UgY2xhc3MgZm9yIEhUTUxUZW1wbGF0ZUVsZW1lbnQgZXh0ZW5zaW9uIHRoYXQgaGFzIHByb3BlcnR5IGVmZmVjdHMKICAgIC8vIG1hY2hpbmVyeSBmb3IgcHJvcGFnYXRpbmcgaG9zdCBwcm9wZXJ0aWVzIHRvIGNoaWxkcmVuLiBUaGlzIGlzIGFuIEVTNQogICAgLy8gY2xhc3Mgb25seSBiZWNhdXNlIEJhYmVsIChpbmNvcnJlY3RseSkgcmVxdWlyZXMgc3VwZXIoKSBpbiB0aGUgY2xhc3MKICAgIC8vIGNvbnN0cnVjdG9yIGV2ZW4gdGhvdWdoIG5vIGB0aGlzYCBpcyB1c2VkIGFuZCBpdCByZXR1cm5zIGFuIGluc3RhbmNlLgogICAgbGV0IG5ld0luc3RhbmNlID0gbnVsbDsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge0hUTUxUZW1wbGF0ZUVsZW1lbnR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBIVE1MVGVtcGxhdGVFbGVtZW50RXh0ZW5zaW9uKCkgeyByZXR1cm4gbmV3SW5zdGFuY2U7IH0KICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnRFeHRlbnNpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShIVE1MVGVtcGxhdGVFbGVtZW50LnByb3RvdHlwZSwgewogICAgICBjb25zdHJ1Y3RvcjogewogICAgICAgIHZhbHVlOiBIVE1MVGVtcGxhdGVFbGVtZW50RXh0ZW5zaW9uLAogICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgIH0KICAgIH0pOwoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgKiBAZXh0ZW5kcyB7SFRNTFRlbXBsYXRlRWxlbWVudEV4dGVuc2lvbn0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IERhdGFUZW1wbGF0ZSA9IFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKEhUTUxUZW1wbGF0ZUVsZW1lbnRFeHRlbnNpb24pOwoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9NdXRhYmxlRGF0YX0KICAgICAqIEBleHRlbmRzIHtEYXRhVGVtcGxhdGV9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBNdXRhYmxlRGF0YVRlbXBsYXRlID0gUG9seW1lci5NdXRhYmxlRGF0YShEYXRhVGVtcGxhdGUpOwoKICAgIC8vIEFwcGxpZXMgYSBEYXRhVGVtcGxhdGUgc3ViY2xhc3MgdG8gYSA8dGVtcGxhdGU+IGluc3RhbmNlCiAgICBmdW5jdGlvbiB1cGdyYWRlVGVtcGxhdGUodGVtcGxhdGUsIGNvbnN0cnVjdG9yKSB7CiAgICAgIG5ld0luc3RhbmNlID0gdGVtcGxhdGU7CiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0ZW1wbGF0ZSwgY29uc3RydWN0b3IucHJvdG90eXBlKTsKICAgICAgbmV3IGNvbnN0cnVjdG9yKCk7CiAgICAgIG5ld0luc3RhbmNlID0gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIEJhc2UgY2xhc3MgZm9yIFRlbXBsYXRlSW5zdGFuY2UuCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IGJhc2UgPSBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cyhjbGFzcyB7fSk7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQGN1c3RvbUVsZW1lbnQKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHMKICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAqLwogICAgY2xhc3MgVGVtcGxhdGVJbnN0YW5jZUJhc2UgZXh0ZW5kcyBiYXNlIHsKICAgICAgY29uc3RydWN0b3IocHJvcHMpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX2NvbmZpZ3VyZVByb3BlcnRpZXMocHJvcHMpOwogICAgICAgIHRoaXMucm9vdCA9IHRoaXMuX3N0YW1wVGVtcGxhdGUodGhpcy5fX2RhdGFIb3N0KTsKICAgICAgICAvLyBTYXZlIGxpc3Qgb2Ygc3RhbXBlZCBjaGlsZHJlbgogICAgICAgIGxldCBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4gPSBbXTsKICAgICAgICBmb3IgKGxldCBuID0gdGhpcy5yb290LmZpcnN0Q2hpbGQ7IG47IG49bi5uZXh0U2libGluZykgewogICAgICAgICAgY2hpbGRyZW4ucHVzaChuKTsKICAgICAgICAgIG4uX190ZW1wbGF0aXplSW5zdGFuY2UgPSB0aGlzOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fX3RlbXBsYXRpemVPd25lciAmJgogICAgICAgICAgdGhpcy5fX3RlbXBsYXRpemVPd25lci5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18pIHsKICAgICAgICAgIHRoaXMuX3Nob3dIaWRlQ2hpbGRyZW4odHJ1ZSk7CiAgICAgICAgfQogICAgICAgIC8vIEZsdXNoIHByb3BzIG9ubHkgd2hlbiBwcm9wcyBhcmUgcGFzc2VkIGlmIGluc3RhbmNlIHByb3BzIGV4aXN0CiAgICAgICAgLy8gb3Igd2hlbiB0aGVyZSBpc24ndCBpbnN0YW5jZSBwcm9wcy4KICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMuX190ZW1wbGF0aXplT3B0aW9uczsKICAgICAgICBpZiAoKHByb3BzICYmIG9wdGlvbnMuaW5zdGFuY2VQcm9wcykgfHwgIW9wdGlvbnMuaW5zdGFuY2VQcm9wcykgewogICAgICAgICAgdGhpcy5fZW5hYmxlUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogQ29uZmlndXJlIHRoZSBnaXZlbiBgcHJvcHNgIGJ5IGNhbGxpbmcgYF9zZXRQZW5kaW5nUHJvcGVydHlgLiBBbHNvCiAgICAgICAqIHNldHMgYW55IHByb3BlcnRpZXMgc3RvcmVkIGluIGBfX2hvc3RQcm9wc2AuCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBPYmplY3Qgb2YgcHJvcGVydHkgbmFtZS12YWx1ZSBwYWlycyB0byBzZXQuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfY29uZmlndXJlUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5fX3RlbXBsYXRpemVPcHRpb25zOwogICAgICAgIGlmIChvcHRpb25zLmZvcndhcmRIb3N0UHJvcCkgewogICAgICAgICAgZm9yIChsZXQgaHByb3AgaW4gdGhpcy5fX2hvc3RQcm9wcykgewogICAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoaHByb3AsIHRoaXMuX19kYXRhSG9zdFsnX2hvc3RfJyArIGhwcm9wXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIEFueSBpbnN0YW5jZSBwcm9wcyBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIHdpbGwgb3ZlcndyaXRlIGhvc3QgcHJvcHM7CiAgICAgICAgLy8gbm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBhIHVzZXIgZXJyb3IgYnV0IHdlIGRvbid0IHNwZWNpZmljYWxseSBmaWx0ZXIgdGhlbQogICAgICAgIGZvciAobGV0IGlwcm9wIGluIHByb3BzKSB7CiAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoaXByb3AsIHByb3BzW2lwcm9wXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBGb3J3YXJkcyBhIGhvc3QgcHJvcGVydHkgdG8gdGhpcyBpbnN0YW5jZS4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZQogICAgICAgKiBjYWxsZWQgb24gaW5zdGFuY2VzIGZyb20gdGhlIGBvcHRpb25zLmZvcndhcmRIb3N0UHJvcGAgY2FsbGJhY2sKICAgICAgICogdG8gcHJvcGFnYXRlIGNoYW5nZXMgb2YgaG9zdCBwcm9wZXJ0aWVzIHRvIGVhY2ggaW5zdGFuY2UuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgZW5xdWV1ZXMgdGhlIGNoYW5nZSwgd2hpY2ggYXJlIGZsdXNoZWQgYXMgYSBiYXRjaC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgb3IgcGF0aCBuYW1lCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgb2YgdGhlIHByb3BlcnR5IHRvIGZvcndhcmQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGZvcndhcmRIb3N0UHJvcChwcm9wLCB2YWx1ZSkgewogICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocHJvcCwgdmFsdWUsIGZhbHNlLCB0cnVlKSkgewogICAgICAgICAgdGhpcy5fX2RhdGFIb3N0Ll9lbnF1ZXVlQ2xpZW50KHRoaXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlIHBvaW50IGZvciBhZGRpbmcgY3VzdG9tIG9yIHNpbXVsYXRlZCBldmVudCBoYW5kbGluZy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBldmVudCBsaXN0ZW5lciB0bwogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQKICAgICAgICogQHBhcmFtIHtmdW5jdGlvbighRXZlbnQpOnZvaWR9IGhhbmRsZXIgTGlzdGVuZXIgZnVuY3Rpb24gdG8gYWRkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICBpZiAodGhpcy5fbWV0aG9kSG9zdCAmJiB0aGlzLl9fdGVtcGxhdGl6ZU9wdGlvbnMucGFyZW50TW9kZWwpIHsKICAgICAgICAgIC8vIElmIHRoaXMgaW5zdGFuY2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBwYXJlbnQgbW9kZWwsIGRlY29yYXRlCiAgICAgICAgICAvLyBldmVudHMgdGhpcyB0ZW1wbGF0ZSBpbnN0YW5jZSBhcyBgbW9kZWxgCiAgICAgICAgICB0aGlzLl9tZXRob2RIb3N0Ll9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgKGUpID0+IHsKICAgICAgICAgICAgZS5tb2RlbCA9IHRoaXM7CiAgICAgICAgICAgIGhhbmRsZXIoZSk7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gT3RoZXJ3aXNlIGRlbGVnYXRlIHRvIHRoZSB0ZW1wbGF0ZSdzIGhvc3QgKHdoaWNoIGNvdWxkIGJlKQogICAgICAgICAgLy8gYW5vdGhlciB0ZW1wbGF0ZSBpbnN0YW5jZQogICAgICAgICAgbGV0IHRlbXBsYXRlSG9zdCA9IHRoaXMuX19kYXRhSG9zdC5fX2RhdGFIb3N0OwogICAgICAgICAgaWYgKHRlbXBsYXRlSG9zdCkgewogICAgICAgICAgICB0ZW1wbGF0ZUhvc3QuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFNob3dzIG9yIGhpZGVzIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSB0b3AgbGV2ZWwgY2hpbGQgZWxlbWVudHMuIEZvcgogICAgICAgKiB0ZXh0IG5vZGVzLCBgdGV4dENvbnRlbnRgIGlzIHJlbW92ZWQgd2hpbGUgImhpZGRlbiIgYW5kIHJlcGxhY2VkIHdoZW4KICAgICAgICogInNob3duLiIKICAgICAgICogQHBhcmFtIHtib29sZWFufSBoaWRlIFNldCB0byB0cnVlIHRvIGhpZGUgdGhlIGNoaWxkcmVuOwogICAgICAgKiBzZXQgdG8gZmFsc2UgdG8gc2hvdyB0aGVtLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2hvd0hpZGVDaGlsZHJlbihoaWRlKSB7CiAgICAgICAgbGV0IGMgPSB0aGlzLmNoaWxkcmVuOwogICAgICAgIGZvciAobGV0IGk9MDsgaTxjLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgbiA9IGNbaV07CiAgICAgICAgICAvLyBJZ25vcmUgbm9uLWNoYW5nZXMKICAgICAgICAgIGlmIChCb29sZWFuKGhpZGUpICE9IEJvb2xlYW4obi5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18pKSB7CiAgICAgICAgICAgIGlmIChuLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgICAgIGlmIChoaWRlKSB7CiAgICAgICAgICAgICAgICBuLl9fcG9seW1lclRleHRDb250ZW50X18gPSBuLnRleHRDb250ZW50OwogICAgICAgICAgICAgICAgbi50ZXh0Q29udGVudCA9ICcnOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBuLnRleHRDb250ZW50ID0gbi5fX3BvbHltZXJUZXh0Q29udGVudF9fOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gcmVtb3ZlIGFuZCByZXBsYWNlIHNsb3QKICAgICAgICAgICAgfSBlbHNlIGlmIChuLmxvY2FsTmFtZSA9PT0gJ3Nsb3QnKSB7CiAgICAgICAgICAgICAgaWYgKGhpZGUpIHsKICAgICAgICAgICAgICAgIG4uX19wb2x5bWVyUmVwbGFjZWRfXyA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJ2hpZGRlbi1zbG90Jyk7CiAgICAgICAgICAgICAgICBuLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG4uX19wb2x5bWVyUmVwbGFjZWRfXywgbik7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2UgPSBuLl9fcG9seW1lclJlcGxhY2VkX187CiAgICAgICAgICAgICAgICBpZiAocmVwbGFjZSkgewogICAgICAgICAgICAgICAgICByZXBsYWNlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG4sIHJlcGxhY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZWxzZSBpZiAobi5zdHlsZSkgewogICAgICAgICAgICAgIGlmIChoaWRlKSB7CiAgICAgICAgICAgICAgICBuLl9fcG9seW1lckRpc3BsYXlfXyA9IG4uc3R5bGUuZGlzcGxheTsKICAgICAgICAgICAgICAgIG4uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbi5zdHlsZS5kaXNwbGF5ID0gbi5fX3BvbHltZXJEaXNwbGF5X187CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBuLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXyA9IGhpZGU7CiAgICAgICAgICBpZiAobi5fc2hvd0hpZGVDaGlsZHJlbikgewogICAgICAgICAgICBuLl9zaG93SGlkZUNoaWxkcmVuKGhpZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGRlZmF1bHQgcHJvcGVydHktZWZmZWN0cyBpbXBsZW1lbnRhdGlvbiB0byBpbnRlcmNlcHQKICAgICAgICogdGV4dENvbnRlbnQgYmluZGluZ3Mgd2hpbGUgY2hpbGRyZW4gYXJlICJoaWRkZW4iIGFuZCBjYWNoZSBpbgogICAgICAgKiBwcml2YXRlIHN0b3JhZ2UgZm9yIGxhdGVyIHJldHJpZXZhbC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBUaGUgbm9kZSB0byBzZXQgYSBwcm9wZXJ0eSBvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBUaGUgcHJvcGVydHkgdG8gc2V0CiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUobm9kZSwgcHJvcCwgdmFsdWUpIHsKICAgICAgICBpZiAobm9kZS5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18gJiYKICAgICAgICAgICAgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBwcm9wID09ICd0ZXh0Q29udGVudCcpIHsKICAgICAgICAgIG5vZGUuX19wb2x5bWVyVGV4dENvbnRlbnRfXyA9IHZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdXBlci5fc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUobm9kZSwgcHJvcCwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogRmluZCB0aGUgcGFyZW50IG1vZGVsIG9mIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuICBUaGUgcGFyZW50IG1vZGVsCiAgICAgICAqIGlzIGVpdGhlciBhbm90aGVyIHRlbXBsYXRpemUgaW5zdGFuY2UgdGhhdCBoYWQgb3B0aW9uIGBwYXJlbnRNb2RlbDogdHJ1ZWAsCiAgICAgICAqIG9yIGVsc2UgdGhlIGhvc3QgZWxlbWVudC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IVBvbHltZXJfUHJvcGVydHlFZmZlY3RzfSBUaGUgcGFyZW50IG1vZGVsIG9mIHRoaXMgaW5zdGFuY2UKICAgICAgICovCiAgICAgIGdldCBwYXJlbnRNb2RlbCgpIHsKICAgICAgICBsZXQgbW9kZWwgPSB0aGlzLl9fcGFyZW50TW9kZWw7CiAgICAgICAgaWYgKCFtb2RlbCkgewogICAgICAgICAgbGV0IG9wdGlvbnM7CiAgICAgICAgICBtb2RlbCA9IHRoaXM7CiAgICAgICAgICBkbyB7CiAgICAgICAgICAgIC8vIEEgdGVtcGxhdGUgaW5zdGFuY2UncyBgX19kYXRhSG9zdGAgaXMgYSA8dGVtcGxhdGU+CiAgICAgICAgICAgIC8vIGBtb2RlbC5fX2RhdGFIb3N0Ll9fZGF0YUhvc3RgIGlzIHRoZSB0ZW1wbGF0ZSdzIGhvc3QKICAgICAgICAgICAgbW9kZWwgPSBtb2RlbC5fX2RhdGFIb3N0Ll9fZGF0YUhvc3Q7CiAgICAgICAgICB9IHdoaWxlICgob3B0aW9ucyA9IG1vZGVsLl9fdGVtcGxhdGl6ZU9wdGlvbnMpICYmICFvcHRpb25zLnBhcmVudE1vZGVsKTsKICAgICAgICAgIHRoaXMuX19wYXJlbnRNb2RlbCA9IG1vZGVsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbW9kZWw7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTdHViIG9mIEhUTUxFbGVtZW50J3MgYGRpc3BhdGNoRXZlbnRgLCBzbyB0aGF0IGVmZmVjdHMgdGhhdCBtYXkKICAgICAgICogZGlzcGF0Y2ggZXZlbnRzIHNhZmVseSBuby1vcC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQgRXZlbnQgdG8gZGlzcGF0Y2gKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gQWx3YXlzIHRydWUuCiAgICAgICAqLwogICAgICAgZGlzcGF0Y2hFdmVudChldmVudCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CgogICAgLyoqIEB0eXBlIHshRGF0YVRlbXBsYXRlfSAqLwogICAgVGVtcGxhdGVJbnN0YW5jZUJhc2UucHJvdG90eXBlLl9fZGF0YUhvc3Q7CiAgICAvKiogQHR5cGUgeyFUZW1wbGF0aXplT3B0aW9uc30gKi8KICAgIFRlbXBsYXRlSW5zdGFuY2VCYXNlLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPcHRpb25zOwogICAgLyoqIEB0eXBlIHshUG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX21ldGhvZEhvc3Q7CiAgICAvKiogQHR5cGUgeyFPYmplY3R9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX190ZW1wbGF0aXplT3duZXI7CiAgICAvKiogQHR5cGUgeyFPYmplY3R9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX19ob3N0UHJvcHM7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtUZW1wbGF0ZUluc3RhbmNlQmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX011dGFibGVEYXRhfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgTXV0YWJsZVRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5NdXRhYmxlRGF0YShUZW1wbGF0ZUluc3RhbmNlQmFzZSk7CgogICAgZnVuY3Rpb24gZmluZE1ldGhvZEhvc3QodGVtcGxhdGUpIHsKICAgICAgLy8gVGVjaG5pY2FsbHkgdGhpcyBzaG91bGQgYmUgdGhlIG93bmVyIG9mIHRoZSBvdXRlcm1vc3QgdGVtcGxhdGUuCiAgICAgIC8vIEluIHNoYWRvdyBkb20sIHRoaXMgaXMgYWx3YXlzIGdldFJvb3ROb2RlKCkuaG9zdCwgYnV0IHdlIGNhbgogICAgICAvLyBhcHByb3hpbWF0ZSB0aGlzIHZpYSBjb29wZXJhdGlvbiB3aXRoIG91ciBkYXRhSG9zdCBhbHdheXMgc2V0dGluZwogICAgICAvLyBgX21ldGhvZEhvc3RgIGFzIGxvbmcgYXMgdGhlcmUgd2VyZSBiaW5kaW5ncyAob3IgaWQncykgb24gdGhpcwogICAgICAvLyBpbnN0YW5jZSBjYXVzaW5nIGl0IHRvIGdldCBhIGRhdGFIb3N0LgogICAgICBsZXQgdGVtcGxhdGVIb3N0ID0gdGVtcGxhdGUuX19kYXRhSG9zdDsKICAgICAgcmV0dXJuIHRlbXBsYXRlSG9zdCAmJiB0ZW1wbGF0ZUhvc3QuX21ldGhvZEhvc3QgfHwgdGVtcGxhdGVIb3N0OwogICAgfQoKICAgIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgICAvKioKICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IGNsYXNzLnByb3RvdHlwZSBpcyBub3QgZGVmaW5lZCBmb3Igc29tZSByZWFzb24KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlVGVtcGxhdGl6ZXJDbGFzcyh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKSB7CiAgICAgIC8vIEFub255bW91cyBjbGFzcyBjcmVhdGVkIGJ5IHRoZSB0ZW1wbGF0aXplCiAgICAgIGxldCBiYXNlID0gb3B0aW9ucy5tdXRhYmxlRGF0YSA/CiAgICAgICAgTXV0YWJsZVRlbXBsYXRlSW5zdGFuY2VCYXNlIDogVGVtcGxhdGVJbnN0YW5jZUJhc2U7CiAgICAgIC8vIEFmZm9yZGFuY2UgZm9yIGdsb2JhbCBtaXhpbnMgb250byBUZW1wbGF0aXplSW5zdGFuY2UKICAgICAgaWYgKFBvbHltZXIuVGVtcGxhdGl6ZS5taXhpbikgewogICAgICAgIGJhc2UgPSBQb2x5bWVyLlRlbXBsYXRpemUubWl4aW4oYmFzZSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIGxldCBrbGFzcyA9IGNsYXNzIGV4dGVuZHMgYmFzZSB7IH07CiAgICAgIGtsYXNzLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPcHRpb25zID0gb3B0aW9uczsKICAgICAga2xhc3MucHJvdG90eXBlLl9iaW5kVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICBhZGROb3RpZnlFZmZlY3RzKGtsYXNzLCB0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKTsKICAgICAgcmV0dXJuIGtsYXNzOwogICAgfQoKICAgIC8qKgogICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gY2xhc3MucHJvdG90eXBlIGlzIG5vdCBkZWZpbmVkIGZvciBzb21lIHJlYXNvbgogICAgICovCiAgICBmdW5jdGlvbiBhZGRQcm9wYWdhdGVFZmZlY3RzKHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG9wdGlvbnMpIHsKICAgICAgbGV0IHVzZXJGb3J3YXJkSG9zdFByb3AgPSBvcHRpb25zLmZvcndhcmRIb3N0UHJvcDsKICAgICAgaWYgKHVzZXJGb3J3YXJkSG9zdFByb3ApIHsKICAgICAgICAvLyBQcm92aWRlIGRhdGEgQVBJIGFuZCBwcm9wZXJ0eSBlZmZlY3RzIG9uIG1lbW9pemVkIHRlbXBsYXRlIGNsYXNzCiAgICAgICAgbGV0IGtsYXNzID0gdGVtcGxhdGVJbmZvLnRlbXBsYXRpemVUZW1wbGF0ZUNsYXNzOwogICAgICAgIGlmICgha2xhc3MpIHsKICAgICAgICAgIGxldCBiYXNlID0gb3B0aW9ucy5tdXRhYmxlRGF0YSA/IE11dGFibGVEYXRhVGVtcGxhdGUgOiBEYXRhVGVtcGxhdGU7CiAgICAgICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgICAgIGtsYXNzID0gdGVtcGxhdGVJbmZvLnRlbXBsYXRpemVUZW1wbGF0ZUNsYXNzID0KICAgICAgICAgICAgY2xhc3MgVGVtcGxhdGl6ZWRUZW1wbGF0ZSBleHRlbmRzIGJhc2Uge307CiAgICAgICAgICAvLyBBZGQgdGVtcGxhdGUgLSA+aW5zdGFuY2VzIGVmZmVjdHMKICAgICAgICAgIC8vIGFuZCBob3N0IDwtIHRlbXBsYXRlIGVmZmVjdHMKICAgICAgICAgIGxldCBob3N0UHJvcHMgPSB0ZW1wbGF0ZUluZm8uaG9zdFByb3BzOwogICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBob3N0UHJvcHMpIHsKICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLl9hZGRQcm9wZXJ0eUVmZmVjdCgnX2hvc3RfJyArIHByb3AsCiAgICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLlBST1BFUlRZX0VGRkVDVF9UWVBFUy5QUk9QQUdBVEUsCiAgICAgICAgICAgICAge2ZuOiBjcmVhdGVGb3J3YXJkSG9zdFByb3BFZmZlY3QocHJvcCwgdXNlckZvcndhcmRIb3N0UHJvcCl9KTsKICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLl9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eSgnX2hvc3RfJyArIHByb3ApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB1cGdyYWRlVGVtcGxhdGUodGVtcGxhdGUsIGtsYXNzKTsKICAgICAgICAvLyBNaXggYW55IHByZS1ib3VuZCBkYXRhIGludG8gX19kYXRhOyBubyBuZWVkIHRvIGZsdXNoIHRoaXMgdG8KICAgICAgICAvLyBpbnN0YW5jZXMgc2luY2UgdGhleSBwdWxsIGZyb20gdGhlIHRlbXBsYXRlIGF0IGluc3RhbmNlLXRpbWUKICAgICAgICBpZiAodGVtcGxhdGUuX19kYXRhUHJvdG8pIHsKICAgICAgICAgIC8vIE5vdGUsIGdlbmVyYWxseSBgX19kYXRhUHJvdG9gIGNvdWxkIGJlIGNoYWluZWQsIGJ1dCBpdCdzIGd1YXJhbnRlZWQKICAgICAgICAgIC8vIHRvIG5vdCBiZSBzaW5jZSB0aGlzIGlzIGEgdmFuaWxsYSB0ZW1wbGF0ZSB3ZSBqdXN0IGFkZGVkIGVmZmVjdHMgdG8KICAgICAgICAgIE9iamVjdC5hc3NpZ24odGVtcGxhdGUuX19kYXRhLCB0ZW1wbGF0ZS5fX2RhdGFQcm90byk7CiAgICAgICAgfQogICAgICAgIC8vIENsZWFyIGFueSBwZW5kaW5nIGRhdGEgZm9yIHBlcmZvcm1hbmNlCiAgICAgICAgdGVtcGxhdGUuX19kYXRhVGVtcCA9IHt9OwogICAgICAgIHRlbXBsYXRlLl9fZGF0YVBlbmRpbmcgPSBudWxsOwogICAgICAgIHRlbXBsYXRlLl9fZGF0YU9sZCA9IG51bGw7CiAgICAgICAgdGVtcGxhdGUuX2VuYWJsZVByb3BlcnRpZXMoKTsKICAgICAgfQogICAgfQogICAgLyogZXNsaW50LWVuYWJsZSB2YWxpZC1qc2RvYyAqLwoKICAgIGZ1bmN0aW9uIGNyZWF0ZUZvcndhcmRIb3N0UHJvcEVmZmVjdChob3N0UHJvcCwgdXNlckZvcndhcmRIb3N0UHJvcCkgewogICAgICByZXR1cm4gZnVuY3Rpb24gZm9yd2FyZEhvc3RQcm9wKHRlbXBsYXRlLCBwcm9wLCBwcm9wcykgewogICAgICAgIHVzZXJGb3J3YXJkSG9zdFByb3AuY2FsbCh0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lciwKICAgICAgICAgIHByb3Auc3Vic3RyaW5nKCdfaG9zdF8nLmxlbmd0aCksIHByb3BzW3Byb3BdKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGROb3RpZnlFZmZlY3RzKGtsYXNzLCB0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKSB7CiAgICAgIGxldCBob3N0UHJvcHMgPSB0ZW1wbGF0ZUluZm8uaG9zdFByb3BzIHx8IHt9OwogICAgICBmb3IgKGxldCBpcHJvcCBpbiBvcHRpb25zLmluc3RhbmNlUHJvcHMpIHsKICAgICAgICBkZWxldGUgaG9zdFByb3BzW2lwcm9wXTsKICAgICAgICBsZXQgdXNlck5vdGlmeUluc3RhbmNlUHJvcCA9IG9wdGlvbnMubm90aWZ5SW5zdGFuY2VQcm9wOwogICAgICAgIGlmICh1c2VyTm90aWZ5SW5zdGFuY2VQcm9wKSB7CiAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KGlwcm9wLAogICAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuUFJPUEVSVFlfRUZGRUNUX1RZUEVTLk5PVElGWSwKICAgICAgICAgICAge2ZuOiBjcmVhdGVOb3RpZnlJbnN0YW5jZVByb3BFZmZlY3QoaXByb3AsIHVzZXJOb3RpZnlJbnN0YW5jZVByb3ApfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvcHRpb25zLmZvcndhcmRIb3N0UHJvcCAmJiB0ZW1wbGF0ZS5fX2RhdGFIb3N0KSB7CiAgICAgICAgZm9yIChsZXQgaHByb3AgaW4gaG9zdFByb3BzKSB7CiAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KGhwcm9wLAogICAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuUFJPUEVSVFlfRUZGRUNUX1RZUEVTLk5PVElGWSwKICAgICAgICAgICAge2ZuOiBjcmVhdGVOb3RpZnlIb3N0UHJvcEVmZmVjdCgpfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlTm90aWZ5SW5zdGFuY2VQcm9wRWZmZWN0KGluc3RQcm9wLCB1c2VyTm90aWZ5SW5zdGFuY2VQcm9wKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiBub3RpZnlJbnN0YW5jZVByb3AoaW5zdCwgcHJvcCwgcHJvcHMpIHsKICAgICAgICB1c2VyTm90aWZ5SW5zdGFuY2VQcm9wLmNhbGwoaW5zdC5fX3RlbXBsYXRpemVPd25lciwKICAgICAgICAgIGluc3QsIHByb3AsIHByb3BzW3Byb3BdKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVOb3RpZnlIb3N0UHJvcEVmZmVjdCgpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5vdGlmeUhvc3RQcm9wKGluc3QsIHByb3AsIHByb3BzKSB7CiAgICAgICAgaW5zdC5fX2RhdGFIb3N0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoJ19ob3N0XycgKyBwcm9wLCBwcm9wc1twcm9wXSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBNb2R1bGUgZm9yIHByZXBhcmluZyBhbmQgc3RhbXBpbmcgaW5zdGFuY2VzIG9mIHRlbXBsYXRlcyB0aGF0IHV0aWxpemUKICAgICAqIFBvbHltZXIncyBkYXRhLWJpbmRpbmcgYW5kIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVyIGZlYXR1cmVzLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogICAgIC8vIEdldCBhIHRlbXBsYXRlIGZyb20gc29tZXdoZXJlLCBlLmcuIGxpZ2h0IERPTQogICAgICogICAgIGxldCB0ZW1wbGF0ZSA9IHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKTsKICAgICAqICAgICAvLyBQcmVwYXJlIHRoZSB0ZW1wbGF0ZQogICAgICogICAgIGxldCBUZW1wbGF0ZUNsYXNzID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUpOwogICAgICogICAgIC8vIEluc3RhbmNlIHRoZSB0ZW1wbGF0ZSB3aXRoIGFuIGluaXRpYWwgZGF0YSBtb2RlbAogICAgICogICAgIGxldCBpbnN0YW5jZSA9IG5ldyBUZW1wbGF0ZUNsYXNzKHtteVByb3A6ICdpbml0aWFsJ30pOwogICAgICogICAgIC8vIEluc2VydCB0aGUgaW5zdGFuY2UncyBET00gc29tZXdoZXJlLCBlLmcuIGVsZW1lbnQncyBzaGFkb3cgRE9NCiAgICAgKiAgICAgdGhpcy5zaGFkb3dSb290LmFwcGVuZENoaWxkKGluc3RhbmNlLnJvb3QpOwogICAgICogICAgIC8vIENoYW5naW5nIGEgcHJvcGVydHkgb24gdGhlIGluc3RhbmNlIHdpbGwgcHJvcGFnYXRlIHRvIGJpbmRpbmdzCiAgICAgKiAgICAgLy8gaW4gdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgaW5zdGFuY2UubXlQcm9wID0gJ25ldyB2YWx1ZSc7CiAgICAgKgogICAgICogVGhlIGBvcHRpb25zYCBkaWN0aW9uYXJ5IHBhc3NlZCB0byBgdGVtcGxhdGl6ZWAgYWxsb3dzIGZvciBjdXN0b21pemluZwogICAgICogZmVhdHVyZXMgb2YgdGhlIGdlbmVyYXRlZCB0ZW1wbGF0ZSBjbGFzcywgaW5jbHVkaW5nIGhvdyBvdXRlci1zY29wZSBob3N0CiAgICAgKiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBmb3J3YXJkZWQgaW50byB0ZW1wbGF0ZSBpbnN0YW5jZXMsIGhvdyBhbnkgaW5zdGFuY2UKICAgICAqIHByb3BlcnRpZXMgYWRkZWQgaW50byB0aGUgdGVtcGxhdGUncyBzY29wZSBzaG91bGQgYmUgbm90aWZpZWQgb3V0IHRvCiAgICAgKiB0aGUgaG9zdCwgYW5kIHdoZXRoZXIgdGhlIGluc3RhbmNlIHNob3VsZCBiZSBkZWNvcmF0ZWQgYXMgYSAicGFyZW50IG1vZGVsIgogICAgICogb2YgYW55IGV2ZW50IGhhbmRsZXJzLgogICAgICoKICAgICAqICAgICAvLyBDdXN0b21pemUgcHJvcGVydHkgZm9yd2FyZGluZyBhbmQgZXZlbnQgbW9kZWwgZGVjb3JhdGlvbgogICAgICogICAgIGxldCBUZW1wbGF0ZUNsYXNzID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUsIHRoaXMsIHsKICAgICAqICAgICAgIHBhcmVudE1vZGVsOiB0cnVlLAogICAgICogICAgICAgZm9yd2FyZEhvc3RQcm9wKHByb3BlcnR5LCB2YWx1ZSkgey4uLn0sCiAgICAgKiAgICAgICBpbnN0YW5jZVByb3BzOiB7Li4ufSwKICAgICAqICAgICAgIG5vdGlmeUluc3RhbmNlUHJvcChpbnN0YW5jZSwgcHJvcGVydHksIHZhbHVlKSB7Li4ufSwKICAgICAqICAgICB9KTsKICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICogQHN1bW1hcnkgTW9kdWxlIGZvciBwcmVwYXJpbmcgYW5kIHN0YW1waW5nIGluc3RhbmNlcyBvZiB0ZW1wbGF0ZXMKICAgICAqICAgdXRpbGl6aW5nIFBvbHltZXIgdGVtcGxhdGluZyBmZWF0dXJlcy4KICAgICAqLwogICAgUG9seW1lci5UZW1wbGF0aXplID0gewoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYW4gYW5vbnltb3VzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgY2xhc3MgYm91bmQgdG8gdGhlCiAgICAgICAqIGA8dGVtcGxhdGU+YCBwcm92aWRlZC4gIEluc3RhbmNpbmcgdGhlIGNsYXNzIHdpbGwgcmVzdWx0IGluIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBiZWluZyBzdGFtcGVkIGludG8gYSBkb2N1bWVudCBmcmFnbWVudCBzdG9yZWQgYXMgdGhlIGluc3RhbmNlJ3MKICAgICAgICogYHJvb3RgIHByb3BlcnR5LCBhZnRlciB3aGljaCBpdCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIERPTS4KICAgICAgICoKICAgICAgICogVGVtcGxhdGVzIG1heSB1dGlsaXplIGFsbCBQb2x5bWVyIGRhdGEtYmluZGluZyBmZWF0dXJlcyBhcyB3ZWxsIGFzCiAgICAgICAqIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycy4gIEV2ZW50IGxpc3RlbmVycyBhbmQgaW5saW5lIGNvbXB1dGluZwogICAgICAgKiBmdW5jdGlvbnMgaW4gdGhlIHRlbXBsYXRlIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBob3N0IG9mIHRoZSB0ZW1wbGF0ZS4KICAgICAgICoKICAgICAgICogVGhlIGNvbnN0cnVjdG9yIHJldHVybmVkIHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IGRpY3Rpb25hcnkgb2YgaW5pdGlhbAogICAgICAgKiBwcm9wZXJ0eSB2YWx1ZXMgdG8gcHJvcGFnYXRlIGludG8gdGVtcGxhdGUgYmluZGluZ3MuICBBZGRpdGlvbmFsbHkKICAgICAgICogaG9zdCBwcm9wZXJ0aWVzIGNhbiBiZSBmb3J3YXJkZWQgaW4sIGFuZCBpbnN0YW5jZSBwcm9wZXJ0aWVzIGNhbiBiZQogICAgICAgKiBub3RpZmllZCBvdXQgYnkgcHJvdmlkaW5nIG9wdGlvbmFsIGNhbGxiYWNrcyBpbiB0aGUgYG9wdGlvbnNgIGRpY3Rpb25hcnkuCiAgICAgICAqCiAgICAgICAqIFZhbGlkIGNvbmZpZ3VyYXRpb24gaW4gYG9wdGlvbnNgIGFyZSBhcyBmb2xsb3dzOgogICAgICAgKgogICAgICAgKiAtIGBmb3J3YXJkSG9zdFByb3AocHJvcGVydHksIHZhbHVlKWA6IENhbGxlZCB3aGVuIGEgcHJvcGVydHkgcmVmZXJlbmNlZAogICAgICAgKiAgIGluIHRoZSB0ZW1wbGF0ZSBjaGFuZ2VkIG9uIHRoZSB0ZW1wbGF0ZSdzIGhvc3QuIEFzIHRoaXMgbGlicmFyeSBkb2VzCiAgICAgICAqICAgbm90IHJldGFpbiByZWZlcmVuY2VzIHRvIHRlbXBsYXRlcyBpbnN0YW5jZWQgYnkgdGhlIHVzZXIsIGl0IGlzIHRoZQogICAgICAgKiAgIHRlbXBsYXRpemUgb3duZXIncyByZXNwb25zaWJpbGl0eSB0byBmb3J3YXJkIGhvc3QgcHJvcGVydHkgY2hhbmdlcyBpbnRvCiAgICAgICAqICAgdXNlci1zdGFtcGVkIGluc3RhbmNlcy4gIFRoZSBgaW5zdGFuY2UuZm9yd2FyZEhvc3RQcm9wKHByb3BlcnR5LCB2YWx1ZSlgCiAgICAgICAqICAgIG1ldGhvZCBvbiB0aGUgZ2VuZXJhdGVkIGNsYXNzIHNob3VsZCBiZSBjYWxsZWQgdG8gZm9yd2FyZCBob3N0CiAgICAgICAqICAgcHJvcGVydGllcyBpbnRvIHRoZSB0ZW1wbGF0ZSB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHByb3BlcnR5LWNoYW5nZWQKICAgICAgICogICBub3RpZmljYXRpb25zLiBBbnkgcHJvcGVydGllcyByZWZlcmVuY2VkIGluIHRoZSB0ZW1wbGF0ZSB0aGF0IGFyZSBub3QKICAgICAgICogICBkZWZpbmVkIGluIGBpbnN0YW5jZVByb3BzYCB3aWxsIGJlIG5vdGlmaWVkIHVwIHRvIHRoZSB0ZW1wbGF0ZSdzIGhvc3QKICAgICAgICogICBhdXRvbWF0aWNhbGx5LgogICAgICAgKiAtIGBpbnN0YW5jZVByb3BzYDogRGljdGlvbmFyeSBvZiBwcm9wZXJ0eSBuYW1lcyB0aGF0IHdpbGwgYmUgYWRkZWQKICAgICAgICogICB0byB0aGUgaW5zdGFuY2UgYnkgdGhlIHRlbXBsYXRpemUgb3duZXIuICBUaGVzZSBwcm9wZXJ0aWVzIHNoYWRvdyBhbnkKICAgICAgICogICBob3N0IHByb3BlcnRpZXMsIGFuZCBjaGFuZ2VzIHdpdGhpbiB0aGUgdGVtcGxhdGUgdG8gdGhlc2UgcHJvcGVydGllcwogICAgICAgKiAgIHdpbGwgcmVzdWx0IGluIGBub3RpZnlJbnN0YW5jZVByb3BgIGJlaW5nIGNhbGxlZC4KICAgICAgICogLSBgbXV0YWJsZURhdGFgOiBXaGVuIGB0cnVlYCwgdGhlIGdlbmVyYXRlZCBjbGFzcyB3aWxsIHNraXAgc3RyaWN0CiAgICAgICAqICAgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUKICAgICAgICogICAiZGlydHkiKS4KICAgICAgICogLSBgbm90aWZ5SW5zdGFuY2VQcm9wKGluc3RhbmNlLCBwcm9wZXJ0eSwgdmFsdWUpYDogQ2FsbGVkIHdoZW4KICAgICAgICogICBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBjaGFuZ2VzLiAgVXNlcnMgbWF5IGNob29zZSB0byBjYWxsIGBub3RpZnlQYXRoYAogICAgICAgKiAgIG9uIGUuZy4gdGhlIG93bmVyIHRvIG5vdGlmeSB0aGUgY2hhbmdlLgogICAgICAgKiAtIGBwYXJlbnRNb2RlbGA6IFdoZW4gYHRydWVgLCBldmVudHMgaGFuZGxlZCBieSBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMKICAgICAgICogICAoYG9uLWV2ZW50PSJoYW5kbGVyImApIHdpbGwgYmUgZGVjb3JhdGVkIHdpdGggYSBgbW9kZWxgIHByb3BlcnR5IHBvaW50aW5nCiAgICAgICAqICAgdG8gdGhlIHRlbXBsYXRlIGluc3RhbmNlIHRoYXQgc3RhbXBlZCBpdC4gIEl0IHdpbGwgYWxzbyBiZSByZXR1cm5lZAogICAgICAgKiAgIGZyb20gYGluc3RhbmNlLnBhcmVudE1vZGVsYCBpbiBjYXNlcyB3aGVyZSB0ZW1wbGF0ZSBpbnN0YW5jZSBuZXN0aW5nCiAgICAgICAqICAgY2F1c2VzIGFuIGlubmVyIG1vZGVsIHRvIHNoYWRvdyBhbiBvdXRlciBtb2RlbC4KICAgICAgICoKICAgICAgICogQWxsIGNhbGxiYWNrcyBhcmUgY2FsbGVkIGJvdW5kIHRvIHRoZSBgb3duZXJgLiBBbnkgY29udGV4dAogICAgICAgKiBuZWVkZWQgZm9yIHRoZSBjYWxsYmFja3MgKHN1Y2ggYXMgcmVmZXJlbmNlcyB0byBgaW5zdGFuY2VzYCBzdGFtcGVkKQogICAgICAgKiBzaG91bGQgYmUgc3RvcmVkIG9uIHRoZSBgb3duZXJgIHN1Y2ggdGhhdCB0aGV5IGNhbiBiZSByZXRyaWV2ZWQgdmlhCiAgICAgICAqIGB0aGlzYC4KICAgICAgICoKICAgICAgICogV2hlbiBgb3B0aW9ucy5mb3J3YXJkSG9zdFByb3BgIGlzIGRlY2xhcmVkIGFzIGFuIG9wdGlvbiwgYW55IHByb3BlcnRpZXMKICAgICAgICogcmVmZXJlbmNlZCBpbiB0aGUgdGVtcGxhdGUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGZvcndhcmRlZCBmcm9tIHRoZSBob3N0IG9mCiAgICAgICAqIHRoZSBgPHRlbXBsYXRlPmAgdG8gaW5zdGFuY2VzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgYW55IHByb3BlcnRpZXMgbGlzdGVkIGluCiAgICAgICAqIHRoZSBgb3B0aW9ucy5pbnN0YW5jZVByb3BzYCBvYmplY3QuICBgaW5zdGFuY2VQcm9wc2AgYXJlIGFzc3VtZWQgdG8gYmUKICAgICAgICogbWFuYWdlZCBieSB0aGUgb3duZXIgb2YgdGhlIGluc3RhbmNlcywgZWl0aGVyIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvcgogICAgICAgKiBvciBzZXQgYWZ0ZXIgdGhlIGZhY3QuICBOb3RlLCBhbnkgcHJvcGVydGllcyBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3Igd2lsbAogICAgICAgKiBhbHdheXMgYmUgc2V0IHRvIHRoZSBpbnN0YW5jZSAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgd291bGQgbm9ybWFsbHkKICAgICAgICogYmUgZm9yd2FyZGVkIGZyb20gdGhlIGhvc3QpLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgYHRlbXBsYXRpemUoKWAgY2FuIGJlIHJ1biBvbmx5IG9uY2UgZm9yIGEgZ2l2ZW4gYDx0ZW1wbGF0ZT5gLgogICAgICAgKiBGdXJ0aGVyIGNhbGxzIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiBBbHNvLCB0aGVyZSBpcyBhIHNwZWNpYWwKICAgICAgICogYmVoYXZpb3IgaWYgdGhlIHRlbXBsYXRlIHdhcyBkdXBsaWNhdGVkIHRocm91Z2ggYSBtZWNoYW5pc20gc3VjaCBhcwogICAgICAgKiBgPGRvbS1yZXBlYXQ+YCBvciBgPHRlc3QtZml4dHVyZT5gLiBJbiB0aGlzIGNhc2UsIGFsbCBjYWxscyB0bwogICAgICAgKiBgdGVtcGxhdGl6ZSgpYCByZXR1cm4gdGhlIHNhbWUgY2xhc3MgZm9yIGFsbCBkdXBsaWNhdGVzIG9mIGEgdGVtcGxhdGUuCiAgICAgICAqIFRoZSBjbGFzcyByZXR1cm5lZCBmcm9tIGB0ZW1wbGF0aXplKClgIGlzIGdlbmVyYXRlZCBvbmx5IG9uY2UgdXNpbmcKICAgICAgICogdGhlIGBvcHRpb25zYCBmcm9tIHRoZSBmaXJzdCBjYWxsLiBUaGlzIG1lYW5zIHRoYXQgYW55IGBvcHRpb25zYAogICAgICAgKiBwcm92aWRlZCB0byBzdWJzZXF1ZW50IGNhbGxzIHdpbGwgYmUgaWdub3JlZC4gVGhlcmVmb3JlLCBpdCBpcyB2ZXJ5CiAgICAgICAqIGltcG9ydGFudCBub3QgdG8gY2xvc2Ugb3ZlciBhbnkgdmFyaWFibGVzIGluc2lkZSB0aGUgY2FsbGJhY2tzLiBBbHNvLAogICAgICAgKiBhcnJvdyBmdW5jdGlvbnMgbXVzdCBiZSBhdm9pZGVkIGJlY2F1c2UgdGhleSBiaW5kIHRoZSBvdXRlciBgdGhpc2AuCiAgICAgICAqIEluc2lkZSB0aGUgY2FsbGJhY2tzLCBhbnkgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBjYW4gYmUgYWNjZXNzZWQKICAgICAgICogdGhyb3VnaCBgdGhpc2AsIHdoaWNoIHBvaW50cyB0byB0aGUgYG93bmVyYC4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuVGVtcGxhdGl6ZQogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byB0ZW1wbGF0aXplCiAgICAgICAqIEBwYXJhbSB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHM9fSBvd25lciBPd25lciBvZiB0aGUgdGVtcGxhdGUgaW5zdGFuY2VzOwogICAgICAgKiAgIGFueSBvcHRpb25hbCBjYWxsYmFja3Mgd2lsbCBiZSBib3VuZCB0byB0aGlzIG93bmVyLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgT3B0aW9ucyBkaWN0aW9uYXJ5IChzZWUgc3VtbWFyeSBmb3IgZGV0YWlscykKICAgICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OlRlbXBsYXRlSW5zdGFuY2VCYXNlKX0gR2VuZXJhdGVkIGNsYXNzIGJvdW5kIHRvIHRoZSB0ZW1wbGF0ZQogICAgICAgKiAgIHByb3ZpZGVkCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgdGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgb3duZXIsIG9wdGlvbnMpIHsKICAgICAgICAvLyBVbmRlciBzdHJpY3RUZW1wbGF0ZVBvbGljeSwgdGhlIHRlbXBsYXRpemVkIGVsZW1lbnQgbXVzdCBiZSBvd25lZAogICAgICAgIC8vIGJ5IGEgKHRydXN0ZWQpIFBvbHltZXIgZWxlbWVudCwgaW5kaWNhdGVkIGJ5IGV4aXN0ZW5jZSBvZiBfbWV0aG9kSG9zdDsKICAgICAgICAvLyBlLmcuIGZvciBkb20taWYgJiBkb20tcmVwZWF0IGluIG1haW4gZG9jdW1lbnQsIF9tZXRob2RIb3N0IGlzIG51bGwKICAgICAgICBpZiAoUG9seW1lci5zdHJpY3RUZW1wbGF0ZVBvbGljeSAmJiAhZmluZE1ldGhvZEhvc3QodGVtcGxhdGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0cmljdFRlbXBsYXRlUG9saWN5OiB0ZW1wbGF0ZSBvd25lciBub3QgdHJ1c3RlZCcpOwogICAgICAgIH0KICAgICAgICBvcHRpb25zID0gLyoqIEB0eXBlIHshVGVtcGxhdGl6ZU9wdGlvbnN9ICovKG9wdGlvbnMgfHwge30pOwogICAgICAgIGlmICh0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lcikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIDx0ZW1wbGF0ZT4gY2FuIG9ubHkgYmUgdGVtcGxhdGl6ZWQgb25jZScpOwogICAgICAgIH0KICAgICAgICB0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lciA9IG93bmVyOwogICAgICAgIGNvbnN0IGN0b3IgPSBvd25lciA/IG93bmVyLmNvbnN0cnVjdG9yIDogVGVtcGxhdGVJbnN0YW5jZUJhc2U7CiAgICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IGN0b3IuX3BhcnNlVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgIC8vIEdldCBtZW1vaXplZCBiYXNlIGNsYXNzIGZvciB0aGUgcHJvdG90eXBpY2FsIHRlbXBsYXRlLCB3aGljaAogICAgICAgIC8vIGluY2x1ZGVzIHByb3BlcnR5IGVmZmVjdHMgZm9yIGJpbmRpbmcgdGVtcGxhdGUgJiBmb3J3YXJkaW5nCiAgICAgICAgbGV0IGJhc2VDbGFzcyA9IHRlbXBsYXRlSW5mby50ZW1wbGF0aXplSW5zdGFuY2VDbGFzczsKICAgICAgICBpZiAoIWJhc2VDbGFzcykgewogICAgICAgICAgYmFzZUNsYXNzID0gY3JlYXRlVGVtcGxhdGl6ZXJDbGFzcyh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKTsKICAgICAgICAgIHRlbXBsYXRlSW5mby50ZW1wbGF0aXplSW5zdGFuY2VDbGFzcyA9IGJhc2VDbGFzczsKICAgICAgICB9CiAgICAgICAgLy8gSG9zdCBwcm9wZXJ0eSBmb3J3YXJkaW5nIG11c3QgYmUgaW5zdGFsbGVkIG9udG8gdGVtcGxhdGUgaW5zdGFuY2UKICAgICAgICBhZGRQcm9wYWdhdGVFZmZlY3RzKHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG9wdGlvbnMpOwogICAgICAgIC8vIFN1YmNsYXNzIGJhc2UgY2xhc3MgYW5kIGFkZCByZWZlcmVuY2UgZm9yIHRoaXMgc3BlY2lmaWMgdGVtcGxhdGUKICAgICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgICBsZXQga2xhc3MgPSBjbGFzcyBUZW1wbGF0ZUluc3RhbmNlIGV4dGVuZHMgYmFzZUNsYXNzIHt9OwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fbWV0aG9kSG9zdCA9IGZpbmRNZXRob2RIb3N0KHRlbXBsYXRlKTsKICAgICAgICBrbGFzcy5wcm90b3R5cGUuX19kYXRhSG9zdCA9IHRlbXBsYXRlOwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPd25lciA9IG93bmVyOwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fX2hvc3RQcm9wcyA9IHRlbXBsYXRlSW5mby5ob3N0UHJvcHM7CiAgICAgICAga2xhc3MgPSAvKiogQHR5cGUge2Z1bmN0aW9uKG5ldzpUZW1wbGF0ZUluc3RhbmNlQmFzZSl9ICovKGtsYXNzKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgcmV0dXJuIGtsYXNzOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIHRlbXBsYXRlICJtb2RlbCIgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZWxlbWVudCwgd2hpY2gKICAgICAgICogc2VydmVzIGFzIHRoZSBiaW5kaW5nIHNjb3BlIGZvciB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdGhlIGVsZW1lbnQgaXMKICAgICAgICogY29udGFpbmVkIGluLiBBIHRlbXBsYXRlIG1vZGVsIGlzIGFuIGluc3RhbmNlIG9mCiAgICAgICAqIGBUZW1wbGF0ZUluc3RhbmNlQmFzZWAsIGFuZCBzaG91bGQgYmUgdXNlZCB0byBtYW5pcHVsYXRlIGRhdGEKICAgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgICAqCiAgICAgICAqIEV4YW1wbGU6CiAgICAgICAqCiAgICAgICAqICAgbGV0IG1vZGVsID0gbW9kZWxGb3JFbGVtZW50KGVsKTsKICAgICAgICogICBpZiAobW9kZWwuaW5kZXggPCAxMCkgewogICAgICAgKiAgICAgbW9kZWwuc2V0KCdpdGVtLmNoZWNrZWQnLCB0cnVlKTsKICAgICAgICogICB9CiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlRlbXBsYXRpemUKICAgICAgICogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUaGUgbW9kZWwgd2lsbCBiZSByZXR1cm5lZCBmb3IKICAgICAgICogICBlbGVtZW50cyBzdGFtcGVkIGZyb20gdGhpcyB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0ge05vZGU9fSBub2RlIE5vZGUgZm9yIHdoaWNoIHRvIHJldHVybiBhIHRlbXBsYXRlIG1vZGVsLgogICAgICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUluc3RhbmNlQmFzZX0gVGVtcGxhdGUgaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZQogICAgICAgKiAgIGJpbmRpbmcgc2NvcGUgZm9yIHRoZSBlbGVtZW50CiAgICAgICAqLwogICAgICBtb2RlbEZvckVsZW1lbnQodGVtcGxhdGUsIG5vZGUpIHsKICAgICAgICBsZXQgbW9kZWw7CiAgICAgICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICAgIC8vIEFuIGVsZW1lbnQgd2l0aCBhIF9fdGVtcGxhdGl6ZUluc3RhbmNlIG1hcmtzIHRoZSB0b3AgYm91bmRhcnkKICAgICAgICAgIC8vIG9mIGEgc2NvcGU7IHdhbGsgdXAgdW50aWwgd2UgZmluZCBvbmUsIGFuZCB0aGVuIGVuc3VyZSB0aGF0CiAgICAgICAgICAvLyBpdHMgX19kYXRhSG9zdCBtYXRjaGVzIGB0aGlzYCwgbWVhbmluZyB0aGlzIGRvbS1yZXBlYXQgc3RhbXBlZCBpdAogICAgICAgICAgaWYgKChtb2RlbCA9IG5vZGUuX190ZW1wbGF0aXplSW5zdGFuY2UpKSB7CiAgICAgICAgICAgIC8vIEZvdW5kIGFuIGVsZW1lbnQgc3RhbXBlZCBieSBhbm90aGVyIHRlbXBsYXRlOyBrZWVwIHdhbGtpbmcgdXAKICAgICAgICAgICAgLy8gZnJvbSBpdHMgX19kYXRhSG9zdAogICAgICAgICAgICBpZiAobW9kZWwuX19kYXRhSG9zdCAhPSB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgIG5vZGUgPSBtb2RlbC5fX2RhdGFIb3N0OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJldHVybiBtb2RlbDsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gU3RpbGwgaW4gYSB0ZW1wbGF0ZSBzY29wZSwga2VlcCBnb2luZyB1cCB1bnRpbAogICAgICAgICAgICAvLyBhIF9fdGVtcGxhdGl6ZUluc3RhbmNlIGlzIGZvdW5kCiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9OwoKICAgIFBvbHltZXIuVGVtcGxhdGVJbnN0YW5jZUJhc2UgPSBUZW1wbGF0ZUluc3RhbmNlQmFzZTsKCiAgfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgbGV0IFRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5UZW1wbGF0ZUluc3RhbmNlQmFzZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZQoKICAgIC8qKgogICAgICogQHR5cGVkZWYge3sKICAgICAqICAgX3RlbXBsYXRpemVyVGVtcGxhdGU6IEhUTUxUZW1wbGF0ZUVsZW1lbnQsCiAgICAgKiAgIF9wYXJlbnRNb2RlbDogYm9vbGVhbiwKICAgICAqICAgX2luc3RhbmNlUHJvcHM6IE9iamVjdCwKICAgICAqICAgX2ZvcndhcmRIb3N0UHJvcFYyOiBGdW5jdGlvbiwKICAgICAqICAgX25vdGlmeUluc3RhbmNlUHJvcFYyOiBGdW5jdGlvbiwKICAgICAqICAgY3RvcjogVGVtcGxhdGVJbnN0YW5jZUJhc2UKICAgICAqIH19CiAgICAgKi8KICAgIGxldCBUZW1wbGF0aXplclVzZXI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUKCiAgICAvKioKICAgICAqIFRoZSBgUG9seW1lci5UZW1wbGF0aXplcmAgYmVoYXZpb3IgYWRkcyBtZXRob2RzIHRvIGdlbmVyYXRlIGluc3RhbmNlcyBvZgogICAgICogdGVtcGxhdGVzIHRoYXQgYXJlIGVhY2ggbWFuYWdlZCBieSBhbiBhbm9ueW1vdXMgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYAogICAgICogaW5zdGFuY2Ugd2hlcmUgZGF0YS1iaW5kaW5ncyBpbiB0aGUgc3RhbXBlZCB0ZW1wbGF0ZSBjb250ZW50IGFyZSBib3VuZCB0bwogICAgICogYWNjZXNzb3JzIG9uIGl0c2VsZi4KICAgICAqCiAgICAgKiBUaGlzIGJlaGF2aW9yIGlzIHByb3ZpZGVkIGluIFBvbHltZXIgMi54IGFzIGEgaHlicmlkLWVsZW1lbnQgY29udmVuaWVuY2UKICAgICAqIG9ubHkuICBGb3Igbm9uLWh5YnJpZCB1c2FnZSwgdGhlIGBQb2x5bWVyLlRlbXBsYXRpemVgIGxpYnJhcnkKICAgICAqIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgICAgLy8gR2V0IGEgdGVtcGxhdGUgZnJvbSBzb21ld2hlcmUsIGUuZy4gbGlnaHQgRE9NCiAgICAgKiAgICAgbGV0IHRlbXBsYXRlID0gdGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpOwogICAgICogICAgIC8vIFByZXBhcmUgdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgdGhpcy50ZW1wbGF0aXplKHRlbXBsYXRlKTsKICAgICAqICAgICAvLyBJbnN0YW5jZSB0aGUgdGVtcGxhdGUgd2l0aCBhbiBpbml0aWFsIGRhdGEgbW9kZWwKICAgICAqICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLnN0YW1wKHtteVByb3A6ICdpbml0aWFsJ30pOwogICAgICogICAgIC8vIEluc2VydCB0aGUgaW5zdGFuY2UncyBET00gc29tZXdoZXJlLCBlLmcuIGxpZ2h0IERPTQogICAgICogICAgIFBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGluc3RhbmNlLnJvb3QpOwogICAgICogICAgIC8vIENoYW5naW5nIGEgcHJvcGVydHkgb24gdGhlIGluc3RhbmNlIHdpbGwgcHJvcGFnYXRlIHRvIGJpbmRpbmdzCiAgICAgKiAgICAgLy8gaW4gdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgaW5zdGFuY2UubXlQcm9wID0gJ25ldyB2YWx1ZSc7CiAgICAgKgogICAgICogVXNlcnMgb2YgYFRlbXBsYXRpemVyYCBtYXkgbmVlZCB0byBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBhYnN0cmFjdAogICAgICogQVBJJ3MgdG8gZGV0ZXJtaW5lIGhvdyBwcm9wZXJ0aWVzIGFuZCBwYXRocyBmcm9tIHRoZSBob3N0IHNob3VsZCBiZQogICAgICogZm9yd2FyZGVkIGludG8gdG8gaW5zdGFuY2VzOgogICAgICoKICAgICAqICAgICBfZm9yd2FyZEhvc3RQcm9wVjI6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKQogICAgICoKICAgICAqIExpa2V3aXNlLCB1c2VycyBtYXkgaW1wbGVtZW50IHRoZXNlIGFkZGl0aW9uYWwgYWJzdHJhY3QgQVBJJ3MgdG8gZGV0ZXJtaW5lCiAgICAgKiBob3cgaW5zdGFuY2Utc3BlY2lmaWMgcHJvcGVydGllcyB0aGF0IGNoYW5nZSBvbiB0aGUgaW5zdGFuY2Ugc2hvdWxkIGJlCiAgICAgKiBmb3J3YXJkZWQgb3V0IHRvIHRoZSBob3N0LCBpZiBuZWNlc3NhcnkuCiAgICAgKgogICAgICogICAgIF9ub3RpZnlJbnN0YW5jZVByb3BWMjogZnVuY3Rpb24oaW5zdCwgcHJvcCwgdmFsdWUpCiAgICAgKgogICAgICogSW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIHByb3BlcnRpZXMgYXJlIGluc3RhbmNlLXNwZWNpZmljIGFuZCByZXF1aXJlCiAgICAgKiBjdXN0b20gbm90aWZpY2F0aW9uIHZpYSBgX25vdGlmeUluc3RhbmNlUHJvcGAsIGRlZmluZSBhbiBgX2luc3RhbmNlUHJvcHNgCiAgICAgKiBvYmplY3QgY29udGFpbmluZyBrZXlzIGZvciBlYWNoIGluc3RhbmNlIHByb3AsIGZvciBleGFtcGxlOgogICAgICoKICAgICAqICAgICBfaW5zdGFuY2VQcm9wczogewogICAgICogICAgICAgaXRlbTogdHJ1ZSwKICAgICAqICAgICAgIGluZGV4OiB0cnVlCiAgICAgKiAgICAgfQogICAgICoKICAgICAqIEFueSBwcm9wZXJ0aWVzIHVzZWQgaW4gdGhlIHRlbXBsYXRlIHRoYXQgYXJlIG5vdCBkZWZpbmVkIGluIF9pbnN0YW5jZVByb3AKICAgICAqIHdpbGwgYmUgZm9yd2FyZGVkIG91dCB0byB0aGUgVGVtcGxhdGl6ZSBgb3duZXJgIGF1dG9tYXRpY2FsbHkuCiAgICAgKgogICAgICogVXNlcnMgbWF5IGFsc28gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgYWJzdHJhY3QgZnVuY3Rpb24gdG8gc2hvdyBvcgogICAgICogaGlkZSBhbnkgRE9NIGdlbmVyYXRlZCB1c2luZyBgc3RhbXBgOgogICAgICoKICAgICAqICAgICBfc2hvd0hpZGVDaGlsZHJlbjogZnVuY3Rpb24oc2hvdWxkSGlkZSkKICAgICAqCiAgICAgKiBOb3RlIHRoYXQgc29tZSBjYWxsYmFja3MgYXJlIHN1ZmZpeGVkIHdpdGggYFYyYCBpbiB0aGUgUG9seW1lciAyLnggYmVoYXZpb3IKICAgICAqIGFzIHRoZSBpbXBsZW1lbnRhdGlvbnMgd2lsbCBuZWVkIHRvIGRpZmZlciBmcm9tIHRoZSBjYWxsYmFja3MgcmVxdWlyZWQKICAgICAqIGJ5IHRoZSAxLnggVGVtcGxhdGl6ZXIgQVBJIGR1ZSB0byBjaGFuZ2VzIGluIHRoZSBgVGVtcGxhdGVJbnN0YW5jZWAgQVBJCiAgICAgKiBiZXR3ZWVuIHZlcnNpb25zIDEueCBhbmQgMi54LgogICAgICoKICAgICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgICAqLwogICAgUG9seW1lci5UZW1wbGF0aXplciA9IHsKCiAgICAgIC8qKgogICAgICAgKiBHZW5lcmF0ZXMgYW4gYW5vbnltb3VzIGBUZW1wbGF0ZUluc3RhbmNlYCBjbGFzcyAoc3RvcmVkIGFzIGB0aGlzLmN0b3JgKQogICAgICAgKiBmb3IgdGhlIHByb3ZpZGVkIHRlbXBsYXRlLiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIHBlcgogICAgICAgKiB0ZW1wbGF0ZSB0byBwcmVwYXJlIGFuIGVsZW1lbnQgZm9yIHN0YW1waW5nIHRoZSB0ZW1wbGF0ZSwgZm9sbG93ZWQKICAgICAgICogYnkgYHN0YW1wYCB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiB0aGUgdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIHByZXBhcmUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gbXV0YWJsZURhdGEgV2hlbiBgdHJ1ZWAsIHRoZSBnZW5lcmF0ZWQgY2xhc3Mgd2lsbCBza2lwCiAgICAgICAqICAgc3RyaWN0IGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvCiAgICAgICAqICAgYmUgImRpcnR5IikuIERlZmF1bHRzIHRvIGZhbHNlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAdGhpcyB7VGVtcGxhdGl6ZXJVc2VyfQogICAgICAgKi8KICAgICAgdGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgbXV0YWJsZURhdGEpIHsKICAgICAgICB0aGlzLl90ZW1wbGF0aXplclRlbXBsYXRlID0gdGVtcGxhdGU7CiAgICAgICAgdGhpcy5jdG9yID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUsIHRoaXMsIHsKICAgICAgICAgIG11dGFibGVEYXRhOiBCb29sZWFuKG11dGFibGVEYXRhKSwKICAgICAgICAgIHBhcmVudE1vZGVsOiB0aGlzLl9wYXJlbnRNb2RlbCwKICAgICAgICAgIGluc3RhbmNlUHJvcHM6IHRoaXMuX2luc3RhbmNlUHJvcHMsCiAgICAgICAgICBmb3J3YXJkSG9zdFByb3A6IHRoaXMuX2ZvcndhcmRIb3N0UHJvcFYyLAogICAgICAgICAgbm90aWZ5SW5zdGFuY2VQcm9wOiB0aGlzLl9ub3RpZnlJbnN0YW5jZVByb3BWMgogICAgICAgIH0pOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlIHByZXBhcmVkIGJ5IGB0ZW1wbGF0aXplYC4gIFRoZSBvYmplY3QKICAgICAgICogcmV0dXJuZWQgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFub255bW91cyBjbGFzcyBnZW5lcmF0ZWQgYnkgYHRlbXBsYXRpemVgCiAgICAgICAqIHdob3NlIGByb290YCBwcm9wZXJ0eSBpcyBhIGRvY3VtZW50IGZyYWdtZW50IGNvbnRhaW5pbmcgbmV3bHkgY2xvbmVkCiAgICAgICAqIHRlbXBsYXRlIGNvbnRlbnQsIGFuZCB3aGljaCBoYXMgcHJvcGVydHkgYWNjZXNzb3JzIGNvcnJlc3BvbmRpbmcgdG8KICAgICAgICogcHJvcGVydGllcyByZWZlcmVuY2VkIGluIHRlbXBsYXRlIGJpbmRpbmdzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IG1vZGVsIE9iamVjdCBjb250YWluaW5nIGluaXRpYWwgcHJvcGVydHkgdmFsdWVzIHRvCiAgICAgICAqICAgcG9wdWxhdGUgaW50byB0aGUgdGVtcGxhdGUgYmluZGluZ3MuCiAgICAgICAqIEByZXR1cm4ge1RlbXBsYXRlSW5zdGFuY2VCYXNlfSBSZXR1cm5zIHRoZSBjcmVhdGVkIGluc3RhbmNlIG9mCiAgICAgICAqIHRoZSB0ZW1wbGF0ZSBwcmVwYXJlZCBieSBgdGVtcGxhdGl6ZWAuCiAgICAgICAqIEB0aGlzIHtUZW1wbGF0aXplclVzZXJ9CiAgICAgICAqLwogICAgICBzdGFtcChtb2RlbCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jdG9yKG1vZGVsKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSAibW9kZWwiIChgVGVtcGxhdGVJbnN0YW5jZWApIGFzc29jaWF0ZWQgd2l0aAogICAgICAgKiBhIGdpdmVuIGVsZW1lbnQsIHdoaWNoIHNlcnZlcyBhcyB0aGUgYmluZGluZyBzY29wZSBmb3IgdGhlIHRlbXBsYXRlCiAgICAgICAqIGluc3RhbmNlIHRoZSBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbi4gIEEgdGVtcGxhdGUgbW9kZWwgc2hvdWxkIGJlIHVzZWQKICAgICAgICogdG8gbWFuaXB1bGF0ZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlbXBsYXRlIGluc3RhbmNlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gYSB0ZW1wbGF0ZSBtb2RlbC4KICAgICAgICogQHJldHVybiB7VGVtcGxhdGVJbnN0YW5jZUJhc2V9IE1vZGVsIHJlcHJlc2VudGluZyB0aGUgYmluZGluZyBzY29wZSBmb3IKICAgICAgICogICB0aGUgZWxlbWVudC4KICAgICAgICogQHRoaXMge1RlbXBsYXRpemVyVXNlcn0KICAgICAgICovCiAgICAgIG1vZGVsRm9yRWxlbWVudChlbCkgewogICAgICAgIHJldHVybiBQb2x5bWVyLlRlbXBsYXRpemUubW9kZWxGb3JFbGVtZW50KHRoaXMuX3RlbXBsYXRpemVyVGVtcGxhdGUsIGVsKTsKICAgICAgfQogICAgfTsKCiAgfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtIVE1MRWxlbWVudH0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX09wdGlvbmFsTXV0YWJsZURhdGF9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9HZXN0dXJlRXZlbnRMaXN0ZW5lcnN9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBkb21CaW5kQmFzZSA9CiAgICAgIFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzKAogICAgICAgIFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YSgKICAgICAgICAgIFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKEhUTUxFbGVtZW50KSkpOwoKICAgIC8qKgogICAgICogQ3VzdG9tIGVsZW1lbnQgdG8gYWxsb3cgdXNpbmcgUG9seW1lcidzIHRlbXBsYXRlIGZlYXR1cmVzIChkYXRhIGJpbmRpbmcsCiAgICAgKiBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMsIGV0Yy4pIGluIHRoZSBtYWluIGRvY3VtZW50IHdpdGhvdXQgZGVmaW5pbmcKICAgICAqIGEgbmV3IGN1c3RvbSBlbGVtZW50LgogICAgICoKICAgICAqIGA8dGVtcGxhdGU+YCB0YWdzIHV0aWxpemluZyBiaW5kaW5ncyBtYXkgYmUgd3JhcHBlZCB3aXRoIHRoZSBgPGRvbS1iaW5kPmAKICAgICAqIGVsZW1lbnQsIHdoaWNoIHdpbGwgaW1tZWRpYXRlbHkgc3RhbXAgdGhlIHdyYXBwZWQgdGVtcGxhdGUgaW50byB0aGUgbWFpbgogICAgICogZG9jdW1lbnQgYW5kIGJpbmQgZWxlbWVudHMgdG8gdGhlIGBkb20tYmluZGAgZWxlbWVudCBpdHNlbGYgYXMgdGhlCiAgICAgKiBiaW5kaW5nIHNjb3BlLgogICAgICoKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAY3VzdG9tRWxlbWVudAogICAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cwogICAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5HZXN0dXJlRXZlbnRMaXN0ZW5lcnMKICAgICAqIEBleHRlbmRzIHtkb21CaW5kQmFzZX0KICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0byBhbGxvdyB1c2luZyBQb2x5bWVyJ3MgdGVtcGxhdGUgZmVhdHVyZXMgKGRhdGEKICAgICAqICAgYmluZGluZywgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzLCBldGMuKSBpbiB0aGUgbWFpbiBkb2N1bWVudC4KICAgICAqLwogICAgY2xhc3MgRG9tQmluZCBleHRlbmRzIGRvbUJpbmRCYXNlIHsKCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgeyByZXR1cm4gWydtdXRhYmxlLWRhdGEnXTsgfQoKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICBpZiAoUG9seW1lci5zdHJpY3RUZW1wbGF0ZVBvbGljeSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzdHJpY3RUZW1wbGF0ZVBvbGljeTogZG9tLWJpbmQgbm90IGFsbG93ZWRgKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5yb290ID0gbnVsbDsKICAgICAgICB0aGlzLiQgPSBudWxsOwogICAgICAgIHRoaXMuX19jaGlsZHJlbiA9IG51bGw7CiAgICAgIH0KCiAgICAgIC8qKiBAcmV0dXJuIHt2b2lkfSAqLwogICAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soKSB7CiAgICAgICAgLy8gYXNzdW1lcyBvbmx5IG9uZSBvYnNlcnZlZCBhdHRyaWJ1dGUKICAgICAgICB0aGlzLm11dGFibGVEYXRhID0gdHJ1ZTsKICAgICAgfQoKICAgICAgLyoqIEByZXR1cm4ge3ZvaWR9ICovCiAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICB9CgogICAgICAvKiogQHJldHVybiB7dm9pZH0gKi8KICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgdGhpcy5fX3JlbW92ZUNoaWxkcmVuKCk7CiAgICAgIH0KCiAgICAgIF9faW5zZXJ0Q2hpbGRyZW4oKSB7CiAgICAgICAgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnJvb3QsIHRoaXMpOwogICAgICB9CgogICAgICBfX3JlbW92ZUNoaWxkcmVuKCkgewogICAgICAgIGlmICh0aGlzLl9fY2hpbGRyZW4pIHsKICAgICAgICAgIGZvciAobGV0IGk9MDsgaTx0aGlzLl9fY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5yb290LmFwcGVuZENoaWxkKHRoaXMuX19jaGlsZHJlbltpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gVGhpcyBpcyB0eXBpY2FsbHkgb25seQogICAgICAgKiBuZWNlc3NhcnkgdG8gY2FsbCBpZiBIVE1MSW1wb3J0cyB3aXRoIHRoZSBhc3luYyBhdHRyaWJ1dGUgYXJlIHVzZWQuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICByZW5kZXIoKSB7CiAgICAgICAgbGV0IHRlbXBsYXRlOwogICAgICAgIGlmICghdGhpcy5fX2NoaWxkcmVuKSB7CiAgICAgICAgICB0ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8odGVtcGxhdGUgfHwgdGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKTsKICAgICAgICAgIGlmICghdGVtcGxhdGUpIHsKICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCBjaGlsZExpc3QgY2hhbmdlcyBhbmQgdGVtcGxhdGUgc2hvdWxkIGJlIHRoZXJlIGJ5IHRoZW4KICAgICAgICAgICAgbGV0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgICAgIHRlbXBsYXRlID0gLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50fSAqLyh0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykpOwogICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkb20tYmluZCByZXF1aXJlcyBhIDx0ZW1wbGF0ZT4gY2hpbGQnKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMsIHtjaGlsZExpc3Q6IHRydWV9KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5fc3RhbXBUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgICB0aGlzLiQgPSB0aGlzLnJvb3QuJDsKICAgICAgICAgIHRoaXMuX19jaGlsZHJlbiA9IFtdOwogICAgICAgICAgZm9yIChsZXQgbj10aGlzLnJvb3QuZmlyc3RDaGlsZDsgbjsgbj1uLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgIHRoaXMuX19jaGlsZHJlblt0aGlzLl9fY2hpbGRyZW4ubGVuZ3RoXSA9IG47CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnNlcnRDaGlsZHJlbigpOwogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgIH0KCiAgICB9CgogICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdkb20tYmluZCcsIERvbUJpbmQpOwoKICAgIC8qKiBAY29uc3QgKi8KICAgIFBvbHltZXIuRG9tQmluZCA9IERvbUJpbmQ7CgogIH0pKCk7CgoKCiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qKgogICAgICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgc3RhdGljIHN0cmluZyB2YWx1ZSB3aGljaCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIKICAgICAqIHN0cmluZ3MgYnkgYXNzZXRpbmcgdGhhdCB0aGV5IGhhdmUgYmVlbiBjcmVhdGVkIHZpYSB0aGlzIGNsYXNzLiBUaGUKICAgICAqIGB2YWx1ZWAgcHJvcGVydHkgcmV0dXJucyB0aGUgc3RyaW5nIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCiAgICAgKi8KICAgIGNsYXNzIExpdGVyYWxTdHJpbmcgewogICAgICBjb25zdHJ1Y3RvcihzdHJpbmcpIHsKICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgICB0aGlzLnZhbHVlID0gc3RyaW5nLnRvU3RyaW5nKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gTGl0ZXJhbFN0cmluZyBzdHJpbmcgdmFsdWUKICAgICAgICovCiAgICAgIHRvU3RyaW5nKCkgewogICAgICAgIHJldHVybiB0aGlzLnZhbHVlOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIE9iamVjdCB0byBzdHJpbmdpZnkgaW50byBIVE1MCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEhUTUwgc3RyaW5naWZpZWQgZm9ybSBvZiBgb2JqYAogICAgICovCiAgICBmdW5jdGlvbiBsaXRlcmFsVmFsdWUodmFsdWUpIHsKICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGl0ZXJhbFN0cmluZykgewogICAgICAgIHJldHVybiAvKiogQHR5cGUgeyFMaXRlcmFsU3RyaW5nfSAqLyh2YWx1ZSkudmFsdWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub24tbGl0ZXJhbCB2YWx1ZSBwYXNzZWQgdG8gUG9seW1lci5odG1sTGl0ZXJhbDogJHt2YWx1ZX1gKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBPYmplY3QgdG8gc3RyaW5naWZ5IGludG8gSFRNTAogICAgICogQHJldHVybiB7c3RyaW5nfSBIVE1MIHN0cmluZ2lmaWVkIGZvcm0gb2YgYG9iamAKICAgICAqLwogICAgZnVuY3Rpb24gaHRtbFZhbHVlKHZhbHVlKSB7CiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQpIHsKICAgICAgICByZXR1cm4gLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudCB9ICovKHZhbHVlKS5pbm5lckhUTUw7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXRlcmFsU3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIGxpdGVyYWxWYWx1ZSh2YWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub24tdGVtcGxhdGUgdmFsdWUgcGFzc2VkIHRvIFBvbHltZXIuaHRtbDogJHt2YWx1ZX1gKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB0aGF0IGNyZWF0ZXMgYW4gSFRNTCA8dGVtcGxhdGU+IGVsZW1lbnQgZnJvbSB0aGUKICAgICAqIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcuCiAgICAgKgogICAgICogVGhpcyBhbGxvd3MgeW91IHRvIHdyaXRlIGEgUG9seW1lciBUZW1wbGF0ZSBpbiBKYXZhU2NyaXB0LgogICAgICoKICAgICAqIFRlbXBsYXRlcyBjYW4gYmUgY29tcG9zZWQgYnkgaW50ZXJwb2xhdGluZyBgSFRNTFRlbXBsYXRlRWxlbWVudGBzIGluCiAgICAgKiBleHByZXNzaW9ucyBpbiB0aGUgSmF2YVNjcmlwdCB0ZW1wbGF0ZSBsaXRlcmFsLiBUaGUgbmVzdGVkIHRlbXBsYXRlJ3MKICAgICAqIGBpbm5lckhUTUxgIGlzIGluY2x1ZGVkIGluIHRoZSBjb250YWluaW5nIHRlbXBsYXRlLiAgVGhlIG9ubHkgb3RoZXIKICAgICAqIHZhbHVlcyBhbGxvd2VkIGluIGV4cHJlc3Npb25zIGFyZSB0aG9zZSByZXR1cm5lZCBmcm9tIGBQb2x5bWVyLmh0bWxMaXRlcmFsYAogICAgICogd2hpY2ggZW5zdXJlcyBvbmx5IGxpdGVyYWwgdmFsdWVzIGZyb20gSlMgc291cmNlIGV2ZXIgcmVhY2ggdGhlIEhUTUwsIHRvCiAgICAgKiBndWFyZCBhZ2FpbnN0IFhTUyByaXNrcy4KICAgICAqCiAgICAgKiBBbGwgb3RoZXIgdmFsdWVzIGFyZSBkaXNhbGxvd2VkIGluIGV4cHJlc3Npb25zIHRvIGhlbHAgcHJldmVudCBYU1MKICAgICAqIGF0dGFja3M7IGhvd2V2ZXIsIGBQb2x5bWVyLmh0bWxMaXRlcmFsYCBjYW4gYmUgdXNlZCB0byBjb21wb3NlIHN0YXRpYwogICAgICogc3RyaW5nIHZhbHVlcyBpbnRvIHRlbXBsYXRlcy4gVGhpcyBpcyB1c2VmdWwgdG8gY29tcG9zZSBzdHJpbmdzIGludG8KICAgICAqIHBsYWNlcyB0aGF0IGRvIG5vdCBhY2NlcHQgaHRtbCwgbGlrZSB0aGUgY3NzIHRleHQgb2YgYSBgc3R5bGVgCiAgICAgKiBlbGVtZW50LgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7CiAgICAgKiAgICAgICByZXR1cm4gUG9seW1lci5odG1sYAogICAgICogICAgICAgICA8c3R5bGU+Omhvc3R7IGNvbnRlbnQ6Ii4uLiIgfTwvc3R5bGU+CiAgICAgKiAgICAgICAgIDxkaXYgY2xhc3M9InNoYWRvd2VkIj4ke3RoaXMucGFydGlhbFRlbXBsYXRlfTwvZGl2PgogICAgICogICAgICAgICAke3N1cGVyLnRlbXBsYXRlfQogICAgICogICAgICAgYDsKICAgICAqICAgICB9CiAgICAgKiAgICAgc3RhdGljIGdldCBwYXJ0aWFsVGVtcGxhdGUoKSB7IHJldHVybiBQb2x5bWVyLmh0bWxgPHNwYW4+UGFydGlhbCE8L3NwYW4+YDsgfQogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFJVGVtcGxhdGVBcnJheX0gc3RyaW5ncyBDb25zdGFudCBwYXJ0cyBvZiB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbAogICAgICogQHBhcmFtIHsuLi4qfSB2YWx1ZXMgVmFyaWFibGUgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwKICAgICAqIEByZXR1cm4geyFIVE1MVGVtcGxhdGVFbGVtZW50fSBDb25zdHJ1Y3RlZCBIVE1MVGVtcGxhdGVFbGVtZW50CiAgICAgKi8KICAgIFBvbHltZXIuaHRtbCA9IGZ1bmN0aW9uIGh0bWwoc3RyaW5ncywgLi4udmFsdWVzKSB7CiAgICAgIGNvbnN0IHRlbXBsYXRlID0gLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gKi8oZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKSk7CiAgICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IHZhbHVlcy5yZWR1Y2UoKGFjYywgdiwgaWR4KSA9PgogICAgICAgICAgYWNjICsgaHRtbFZhbHVlKHYpICsgc3RyaW5nc1tpZHggKyAxXSwgc3RyaW5nc1swXSk7CiAgICAgIHJldHVybiB0ZW1wbGF0ZTsKICAgIH07CgogICAgLyoqCiAgICAgKiBBbiBodG1sIGxpdGVyYWwgdGFnIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBgUG9seW1lci5odG1sYCB0byBjb21wb3NlLgogICAgICogYSBsaXRlcmFsIHN0cmluZy4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqICAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgewogICAgICogICAgICAgcmV0dXJuIFBvbHltZXIuaHRtbGAKICAgICAqICAgICAgICAgPHN0eWxlPgogICAgICogICAgICAgICAgIDpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0KICAgICAqICAgICAgICAgICAke3N0eWxlVGVtcGxhdGV9CiAgICAgKiAgICAgICAgIDwvc3R5bGU+CiAgICAgKiAgICAgICAgIDxkaXYgY2xhc3M9InNoYWRvd2VkIj4ke3N0YXRpY1ZhbHVlfTwvZGl2PgogICAgICogICAgICAgICAke3N1cGVyLnRlbXBsYXRlfQogICAgICogICAgICAgYDsKICAgICAqICAgICB9CiAgICAgKiAgICAgc3RhdGljIGdldCBzdHlsZVRlbXBsYXRlKCkgeyByZXR1cm4gUG9seW1lci5odG1sTGl0ZXJhbGAuc2hhZG93ZWQgeyBiYWNrZ3JvdW5kOiBncmF5OyB9YDsgfQogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFJVGVtcGxhdGVBcnJheX0gc3RyaW5ncyBDb25zdGFudCBwYXJ0cyBvZiB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbAogICAgICogQHBhcmFtIHsuLi4qfSB2YWx1ZXMgVmFyaWFibGUgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwKICAgICAqIEByZXR1cm4geyFMaXRlcmFsU3RyaW5nfSBDb25zdHJ1Y3RlZCBsaXRlcmFsIHN0cmluZwogICAgICovCiAgICBQb2x5bWVyLmh0bWxMaXRlcmFsID0gZnVuY3Rpb24oc3RyaW5ncywgLi4udmFsdWVzKSB7CiAgICAgIHJldHVybiBuZXcgTGl0ZXJhbFN0cmluZyh2YWx1ZXMucmVkdWNlKChhY2MsIHYsIGlkeCkgPT4KICAgICAgICAgIGFjYyArIGxpdGVyYWxWYWx1ZSh2KSArIHN0cmluZ3NbaWR4ICsgMV0sIHN0cmluZ3NbMF0pKTsKICAgIH07CiAgfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBCYXNlIGNsYXNzIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MgbWV0YS1wcm9ncmFtbWluZwogICAqIGZlYXR1cmVzIGluY2x1ZGluZyB0ZW1wbGF0ZSBzdGFtcGluZywgZGF0YS1iaW5kaW5nLCBhdHRyaWJ1dGUgZGVzZXJpYWxpemF0aW9uLAogICAqIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24uCiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQGNvbnN0cnVjdG9yCiAgICogQGltcGxlbWVudHMge1BvbHltZXJfRWxlbWVudE1peGlufQogICAqIEBleHRlbmRzIHtIVE1MRWxlbWVudH0KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuRWxlbWVudE1peGluCiAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgYmFzZSBjbGFzcyB0aGF0IHByb3ZpZGVzIHRoZSBjb3JlIEFQSSBmb3IgUG9seW1lcidzCiAgICogICBrZXkgbWV0YS1wcm9ncmFtbWluZyBmZWF0dXJlcyBpbmNsdWRpbmcgdGVtcGxhdGUgc3RhbXBpbmcsIGRhdGEtYmluZGluZywKICAgKiAgIGF0dHJpYnV0ZSBkZXNlcmlhbGl6YXRpb24sIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24KICAgKi8KICBQb2x5bWVyLkVsZW1lbnQgPSBQb2x5bWVyLkVsZW1lbnRNaXhpbihIVE1MRWxlbWVudCk7CgogIC8vIE5PVEU6IHRoaXMgaXMgaGVyZSBmb3IgbW9kdWxpemVyIHRvIGV4cG9ydCBgaHRtbGAgZm9yIHRoZSBtb2R1bGUgdmVyc2lvbiBvZiB0aGlzIGZpbGUKICBQb2x5bWVyLmh0bWwgPSBQb2x5bWVyLmh0bWw7Cn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IFRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5UZW1wbGF0ZUluc3RhbmNlQmFzZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZQoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9PcHRpb25hbE11dGFibGVEYXRhfQogICAqIEBleHRlbmRzIHtQb2x5bWVyLkVsZW1lbnR9CiAgICogQHByaXZhdGUKICAgKi8KICBjb25zdCBkb21SZXBlYXRCYXNlID0gUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhKFBvbHltZXIuRWxlbWVudCk7CgogIC8qKgogICAqIFRoZSBgPGRvbS1yZXBlYXQ+YCBlbGVtZW50IHdpbGwgYXV0b21hdGljYWxseSBzdGFtcCBhbmQgYmluZHMgb25lIGluc3RhbmNlCiAgICogb2YgdGVtcGxhdGUgY29udGVudCB0byBlYWNoIG9iamVjdCBpbiBhIHVzZXItcHJvdmlkZWQgYXJyYXkuCiAgICogYGRvbS1yZXBlYXRgIGFjY2VwdHMgYW4gYGl0ZW1zYCBwcm9wZXJ0eSwgYW5kIG9uZSBpbnN0YW5jZSBvZiB0aGUgdGVtcGxhdGUKICAgKiBpcyBzdGFtcGVkIGZvciBlYWNoIGl0ZW0gaW50byB0aGUgRE9NIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgYGRvbS1yZXBlYXRgCiAgICogZWxlbWVudC4gIFRoZSBgaXRlbWAgcHJvcGVydHkgd2lsbCBiZSBzZXQgb24gZWFjaCBpbnN0YW5jZSdzIGJpbmRpbmcKICAgKiBzY29wZSwgdGh1cyB0ZW1wbGF0ZXMgc2hvdWxkIGJpbmQgdG8gc3ViLXByb3BlcnRpZXMgb2YgYGl0ZW1gLgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqIGBgYGh0bWwKICAgKiA8ZG9tLW1vZHVsZSBpZD0iZW1wbG95ZWUtbGlzdCI+CiAgICoKICAgKiAgIDx0ZW1wbGF0ZT4KICAgKgogICAqICAgICA8ZGl2PiBFbXBsb3llZSBsaXN0OiA8L2Rpdj4KICAgKiAgICAgPGRvbS1yZXBlYXQgaXRlbXM9Int7ZW1wbG95ZWVzfX0iPgogICAqICAgICAgIDx0ZW1wbGF0ZT4KICAgKiAgICAgICAgIDxkaXY+Rmlyc3QgbmFtZTogPHNwYW4+e3tpdGVtLmZpcnN0fX08L3NwYW4+PC9kaXY+CiAgICogICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgIDwvdGVtcGxhdGU+CiAgICoKICAgKiA8L2RvbS1tb2R1bGU+CiAgICogYGBgCiAgICoKICAgKiBXaXRoIHRoZSBmb2xsb3dpbmcgY3VzdG9tIGVsZW1lbnQgZGVmaW5pdGlvbjoKICAgKgogICAqIGBgYGpzCiAgICogY2xhc3MgRW1wbG95ZWVMaXN0IGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZW1wbG95ZWUtbGlzdCc7IH0KICAgKiAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgKiAgICAgcmV0dXJuIHsKICAgKiAgICAgICBlbXBsb3llZXM6IHsKICAgKiAgICAgICAgIHZhbHVlKCkgewogICAqICAgICAgICAgICByZXR1cm4gWwogICAqICAgICAgICAgICAgIHtmaXJzdDogJ0JvYicsIGxhc3Q6ICdTbWl0aCd9LAogICAqICAgICAgICAgICAgIHtmaXJzdDogJ1NhbGx5JywgbGFzdDogJ0pvaG5zb24nfSwKICAgKiAgICAgICAgICAgICAuLi4KICAgKiAgICAgICAgICAgXTsKICAgKiAgICAgICAgIH0KICAgKiAgICAgICB9CiAgICogICAgIH07CiAgICogICB9CiAgICogfQogICAqIGBgYAogICAqCiAgICogTm90aWZpY2F0aW9ucyBmb3IgY2hhbmdlcyB0byBpdGVtcyBzdWItcHJvcGVydGllcyB3aWxsIGJlIGZvcndhcmRlZCB0byB0ZW1wbGF0ZQogICAqIGluc3RhbmNlcywgd2hpY2ggd2lsbCB1cGRhdGUgdmlhIHRoZSBub3JtYWwgc3RydWN0dXJlZCBkYXRhIG5vdGlmaWNhdGlvbiBzeXN0ZW0uCiAgICoKICAgKiBNdXRhdGlvbnMgdG8gdGhlIGBpdGVtc2AgYXJyYXkgaXRzZWxmIHNob3VsZCBiZSBtYWRlIHVzaW5nIHRoZSBBcnJheQogICAqIG11dGF0aW9uIEFQSSdzIG9uIGBQb2x5bWVyLkJhc2VgIChgcHVzaGAsIGBwb3BgLCBgc3BsaWNlYCwgYHNoaWZ0YCwKICAgKiBgdW5zaGlmdGApLCBhbmQgdGVtcGxhdGUgaW5zdGFuY2VzIHdpbGwgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGRhdGEgaW4gdGhlCiAgICogYXJyYXkuCiAgICoKICAgKiBFdmVudHMgY2F1Z2h0IGJ5IGV2ZW50IGhhbmRsZXJzIHdpdGhpbiB0aGUgYGRvbS1yZXBlYXRgIHRlbXBsYXRlIHdpbGwgYmUKICAgKiBkZWNvcmF0ZWQgd2l0aCBhIGBtb2RlbGAgcHJvcGVydHksIHdoaWNoIHJlcHJlc2VudHMgdGhlIGJpbmRpbmcgc2NvcGUgZm9yCiAgICogZWFjaCB0ZW1wbGF0ZSBpbnN0YW5jZS4gIFRoZSBtb2RlbCBpcyBhbiBpbnN0YW5jZSBvZiBQb2x5bWVyLkJhc2UsIGFuZCBzaG91bGQKICAgKiBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgZGF0YSBvbiB0aGUgaW5zdGFuY2UsIGZvciBleGFtcGxlCiAgICogYGV2ZW50Lm1vZGVsLnNldCgnaXRlbS5jaGVja2VkJywgdHJ1ZSk7YC4KICAgKgogICAqIEFsdGVybmF0aXZlbHksIHRoZSBtb2RlbCBmb3IgYSB0ZW1wbGF0ZSBpbnN0YW5jZSBmb3IgYW4gZWxlbWVudCBzdGFtcGVkIGJ5CiAgICogYSBgZG9tLXJlcGVhdGAgY2FuIGJlIG9idGFpbmVkIHVzaW5nIHRoZSBgbW9kZWxGb3JFbGVtZW50YCBBUEkgb24gdGhlCiAgICogYGRvbS1yZXBlYXRgIHRoYXQgc3RhbXBlZCBpdCwgZm9yIGV4YW1wbGUKICAgKiBgdGhpcy4kLmRvbVJlcGVhdC5tb2RlbEZvckVsZW1lbnQoZXZlbnQudGFyZ2V0KS5zZXQoJ2l0ZW0uY2hlY2tlZCcsIHRydWUpO2AuCiAgICogVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBtYW5pcHVsYXRpbmcgaW5zdGFuY2UgZGF0YSBvZiBldmVudCB0YXJnZXRzIG9idGFpbmVkCiAgICogYnkgZXZlbnQgaGFuZGxlcnMgb24gcGFyZW50cyBvZiB0aGUgYGRvbS1yZXBlYXRgIChldmVudCBkZWxlZ2F0aW9uKS4KICAgKgogICAqIEEgdmlldy1zcGVjaWZpYyBmaWx0ZXIvc29ydCBtYXkgYmUgYXBwbGllZCB0byBlYWNoIGBkb20tcmVwZWF0YCBieSBzdXBwbHlpbmcgYQogICAqIGBmaWx0ZXJgIGFuZC9vciBgc29ydGAgcHJvcGVydHkuICBUaGlzIG1heSBiZSBhIHN0cmluZyB0aGF0IG5hbWVzIGEgZnVuY3Rpb24gb24KICAgKiB0aGUgaG9zdCwgb3IgYSBmdW5jdGlvbiBtYXkgYmUgYXNzaWduZWQgdG8gdGhlIHByb3BlcnR5IGRpcmVjdGx5LiAgVGhlIGZ1bmN0aW9ucwogICAqIHNob3VsZCBpbXBsZW1lbnRlZCBmb2xsb3dpbmcgdGhlIHN0YW5kYXJkIGBBcnJheWAgZmlsdGVyL3NvcnQgQVBJLgogICAqCiAgICogSW4gb3JkZXIgdG8gcmUtcnVuIHRoZSBmaWx0ZXIgb3Igc29ydCBmdW5jdGlvbnMgYmFzZWQgb24gY2hhbmdlcyB0byBzdWItZmllbGRzCiAgICogb2YgYGl0ZW1zYCwgdGhlIGBvYnNlcnZlYCBwcm9wZXJ0eSBtYXkgYmUgc2V0IGFzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YKICAgKiBgaXRlbWAgc3ViLWZpZWxkcyB0aGF0IHNob3VsZCBjYXVzZSBhIHJlLWZpbHRlci9zb3J0IHdoZW4gbW9kaWZpZWQuICBJZgogICAqIHRoZSBmaWx0ZXIgb3Igc29ydCBmdW5jdGlvbiBkZXBlbmRzIG9uIHByb3BlcnRpZXMgbm90IGNvbnRhaW5lZCBpbiBgaXRlbXNgLAogICAqIHRoZSB1c2VyIHNob3VsZCBvYnNlcnZlIGNoYW5nZXMgdG8gdGhvc2UgcHJvcGVydGllcyBhbmQgY2FsbCBgcmVuZGVyYCB0byB1cGRhdGUKICAgKiB0aGUgdmlldyBiYXNlZCBvbiB0aGUgZGVwZW5kZW5jeSBjaGFuZ2UuCiAgICoKICAgKiBGb3IgZXhhbXBsZSwgZm9yIGFuIGBkb20tcmVwZWF0YCB3aXRoIGEgZmlsdGVyIG9mIHRoZSBmb2xsb3dpbmc6CiAgICoKICAgKiBgYGBqcwogICAqIGlzRW5naW5lZXIoaXRlbSkgewogICAqICAgcmV0dXJuIGl0ZW0udHlwZSA9PSAnZW5naW5lZXInIHx8IGl0ZW0ubWFuYWdlci50eXBlID09ICdlbmdpbmVlcic7CiAgICogfQogICAqIGBgYAogICAqCiAgICogVGhlbiB0aGUgYG9ic2VydmVgIHByb3BlcnR5IHNob3VsZCBiZSBjb25maWd1cmVkIGFzIGZvbGxvd3M6CiAgICoKICAgKiBgYGBodG1sCiAgICogPGRvbS1yZXBlYXQgaXRlbXM9Int7ZW1wbG95ZWVzfX0iIGZpbHRlcj0iaXNFbmdpbmVlciIgb2JzZXJ2ZT0idHlwZSBtYW5hZ2VyLnR5cGUiPgogICAqIGBgYAogICAqCiAgICogQGN1c3RvbUVsZW1lbnQKICAgKiBAcG9seW1lcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQGV4dGVuZHMge2RvbVJlcGVhdEJhc2V9CiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCBmb3Igc3RhbXBpbmcgaW5zdGFuY2Ugb2YgYSB0ZW1wbGF0ZSBib3VuZCB0bwogICAqICAgaXRlbXMgaW4gYW4gYXJyYXkuCiAgICovCiAgY2xhc3MgRG9tUmVwZWF0IGV4dGVuZHMgZG9tUmVwZWF0QmFzZSB7CgogICAgLy8gTm90IG5lZWRlZCB0byBmaW5kIHRlbXBsYXRlOyBjYW4gYmUgcmVtb3ZlZCBvbmNlIHRoZSBhbmFseXplcgogICAgLy8gY2FuIGZpbmQgdGhlIHRhZyBuYW1lIGZyb20gY3VzdG9tRWxlbWVudHMuZGVmaW5lIGNhbGwKICAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZG9tLXJlcGVhdCc7IH0KCiAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgeyByZXR1cm4gbnVsbDsgfQoKICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKCiAgICAgIC8qKgogICAgICAgKiBGaXJlZCB3aGVuZXZlciBET00gaXMgYWRkZWQgb3IgcmVtb3ZlZCBieSB0aGlzIHRlbXBsYXRlIChieQogICAgICAgKiBkZWZhdWx0LCByZW5kZXJpbmcgb2NjdXJzIGxhemlseSkuICBUbyBmb3JjZSBpbW1lZGlhdGUgcmVuZGVyaW5nLCBjYWxsCiAgICAgICAqIGByZW5kZXJgLgogICAgICAgKgogICAgICAgKiBAZXZlbnQgZG9tLWNoYW5nZQogICAgICAgKi8KICAgICAgcmV0dXJuIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQW4gYXJyYXkgY29udGFpbmluZyBpdGVtcyBkZXRlcm1pbmluZyBob3cgbWFueSBpbnN0YW5jZXMgb2YgdGhlIHRlbXBsYXRlCiAgICAgICAgICogdG8gc3RhbXAgYW5kIHRoYXQgdGhhdCBlYWNoIHRlbXBsYXRlIGluc3RhbmNlIHNob3VsZCBiaW5kIHRvLgogICAgICAgICAqLwogICAgICAgIGl0ZW1zOiB7CiAgICAgICAgICB0eXBlOiBBcnJheQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBhZGQgdG8gdGhlIGJpbmRpbmcgc2NvcGUgZm9yIHRoZSBhcnJheQogICAgICAgICAqIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgYXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaXRlbScKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gYWRkIHRvIHRoZSBiaW5kaW5nIHNjb3BlIHdpdGggdGhlIGluZGV4CiAgICAgICAgICogb2YgdGhlIGluc3RhbmNlIGluIHRoZSBzb3J0ZWQgYW5kIGZpbHRlcmVkIGxpc3Qgb2YgcmVuZGVyZWQgaXRlbXMuCiAgICAgICAgICogTm90ZSwgZm9yIHRoZSBpbmRleCBpbiB0aGUgYHRoaXMuaXRlbXNgIGFycmF5LCB1c2UgdGhlIHZhbHVlIG9mIHRoZQogICAgICAgICAqIGBpdGVtc0luZGV4QXNgIHByb3BlcnR5LgogICAgICAgICAqLwogICAgICAgIGluZGV4QXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaW5kZXgnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGFkZCB0byB0aGUgYmluZGluZyBzY29wZSB3aXRoIHRoZSBpbmRleAogICAgICAgICAqIG9mIHRoZSBpbnN0YW5jZSBpbiB0aGUgYHRoaXMuaXRlbXNgIGFycmF5LiBOb3RlLCBmb3IgdGhlIGluZGV4IG9mCiAgICAgICAgICogdGhpcyBpbnN0YW5jZSBpbiB0aGUgc29ydGVkIGFuZCBmaWx0ZXJlZCBsaXN0IG9mIHJlbmRlcmVkIGl0ZW1zLAogICAgICAgICAqIHVzZSB0aGUgdmFsdWUgb2YgdGhlIGBpbmRleEFzYCBwcm9wZXJ0eS4KICAgICAgICAgKi8KICAgICAgICBpdGVtc0luZGV4QXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaXRlbXNJbmRleCcKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGRldGVybWluZSB0aGUgc29ydCBvcmRlciBvZiB0aGUgaXRlbXMuICBUaGlzCiAgICAgICAgICogcHJvcGVydHkgc2hvdWxkIGVpdGhlciBiZSBwcm92aWRlZCBhcyBhIHN0cmluZywgaW5kaWNhdGluZyBhIG1ldGhvZAogICAgICAgICAqIG5hbWUgb24gdGhlIGVsZW1lbnQncyBob3N0LCBvciBlbHNlIGJlIGFuIGFjdHVhbCBmdW5jdGlvbi4gIFRoZQogICAgICAgICAqIGZ1bmN0aW9uIHNob3VsZCBtYXRjaCB0aGUgc29ydCBmdW5jdGlvbiBwYXNzZWQgdG8gYEFycmF5LnNvcnRgLgogICAgICAgICAqIFVzaW5nIGEgc29ydCBmdW5jdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSB1bmRlcmx5aW5nIGBpdGVtc2AgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgc29ydDogewogICAgICAgICAgdHlwZTogRnVuY3Rpb24sCiAgICAgICAgICBvYnNlcnZlcjogJ19fc29ydENoYW5nZWQnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGZpbHRlciBpdGVtcyBvdXQgb2YgdGhlIHZpZXcuICBUaGlzCiAgICAgICAgICogcHJvcGVydHkgc2hvdWxkIGVpdGhlciBiZSBwcm92aWRlZCBhcyBhIHN0cmluZywgaW5kaWNhdGluZyBhIG1ldGhvZAogICAgICAgICAqIG5hbWUgb24gdGhlIGVsZW1lbnQncyBob3N0LCBvciBlbHNlIGJlIGFuIGFjdHVhbCBmdW5jdGlvbi4gIFRoZQogICAgICAgICAqIGZ1bmN0aW9uIHNob3VsZCBtYXRjaCB0aGUgc29ydCBmdW5jdGlvbiBwYXNzZWQgdG8gYEFycmF5LmZpbHRlcmAuCiAgICAgICAgICogVXNpbmcgYSBmaWx0ZXIgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgdW5kZXJseWluZyBgaXRlbXNgIGFycmF5LgogICAgICAgICAqLwogICAgICAgIGZpbHRlcjogewogICAgICAgICAgdHlwZTogRnVuY3Rpb24sCiAgICAgICAgICBvYnNlcnZlcjogJ19fZmlsdGVyQ2hhbmdlZCcKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIHVzaW5nIGEgYGZpbHRlcmAgb3IgYHNvcnRgIGZ1bmN0aW9uLCB0aGUgYG9ic2VydmVgIHByb3BlcnR5CiAgICAgICAgICogc2hvdWxkIGJlIHNldCB0byBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBuYW1lcyBvZiBpdGVtCiAgICAgICAgICogc3ViLWZpZWxkcyB0aGF0IHNob3VsZCB0cmlnZ2VyIGEgcmUtc29ydCBvciByZS1maWx0ZXIgd2hlbiBjaGFuZ2VkLgogICAgICAgICAqIFRoZXNlIHNob3VsZCBnZW5lcmFsbHkgYmUgZmllbGRzIG9mIGBpdGVtYCB0aGF0IHRoZSBzb3J0IG9yIGZpbHRlcgogICAgICAgICAqIGZ1bmN0aW9uIGRlcGVuZHMgb24uCiAgICAgICAgICovCiAgICAgICAgb2JzZXJ2ZTogewogICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgb2JzZXJ2ZXI6ICdfX29ic2VydmVDaGFuZ2VkJwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZW4gdXNpbmcgYSBgZmlsdGVyYCBvciBgc29ydGAgZnVuY3Rpb24sIHRoZSBgZGVsYXlgIHByb3BlcnR5CiAgICAgICAgICogZGV0ZXJtaW5lcyBhIGRlYm91bmNlIHRpbWUgaW4gbXMgYWZ0ZXIgYSBjaGFuZ2UgdG8gb2JzZXJ2ZWQgaXRlbQogICAgICAgICAqIHByb3BlcnRpZXMgdGhhdCBtdXN0IHBhc3MgYmVmb3JlIHRoZSBmaWx0ZXIgb3Igc29ydCBpcyByZS1ydW4uCiAgICAgICAgICogVGhpcyBpcyB1c2VmdWwgaW4gcmF0ZS1saW1pdGluZyBzaHVmZmxpbmcgb2YgdGhlIHZpZXcgd2hlbgogICAgICAgICAqIGl0ZW0gY2hhbmdlcyBtYXkgYmUgZnJlcXVlbnQuCiAgICAgICAgICovCiAgICAgICAgZGVsYXk6IE51bWJlciwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ291bnQgb2YgY3VycmVudGx5IHJlbmRlcmVkIGl0ZW1zIGFmdGVyIGBmaWx0ZXJgIChpZiBhbnkpIGhhcyBiZWVuIGFwcGxpZWQuCiAgICAgICAgICogSWYgImNodW5raW5nIG1vZGUiIGlzIGVuYWJsZWQsIGByZW5kZXJlZEl0ZW1Db3VudGAgaXMgdXBkYXRlZCBlYWNoIHRpbWUgYQogICAgICAgICAqIHNldCBvZiB0ZW1wbGF0ZSBpbnN0YW5jZXMgaXMgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKi8KICAgICAgICByZW5kZXJlZEl0ZW1Db3VudDogewogICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgICAgcmVhZE9ubHk6IHRydWUKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZpbmVzIGFuIGluaXRpYWwgY291bnQgb2YgdGVtcGxhdGUgaW5zdGFuY2VzIHRvIHJlbmRlciBhZnRlciBzZXR0aW5nCiAgICAgICAgICogdGhlIGBpdGVtc2AgYXJyYXksIGJlZm9yZSB0aGUgbmV4dCBwYWludCwgYW5kIHB1dHMgdGhlIGBkb20tcmVwZWF0YAogICAgICAgICAqIGludG8gImNodW5raW5nIG1vZGUiLiAgVGhlIHJlbWFpbmluZyBpdGVtcyB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJlbmRlcmVkCiAgICAgICAgICogaW5jcmVtZW50YWxseSBhdCBlYWNoIGFuaW1hdGlvbiBmcmFtZSB0aGVyb2YgdW50aWwgYWxsIGluc3RhbmNlcyBoYXZlCiAgICAgICAgICogYmVlbiByZW5kZXJlZC4KICAgICAgICAgKi8KICAgICAgICBpbml0aWFsQ291bnQ6IHsKICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICAgIG9ic2VydmVyOiAnX19pbml0aWFsaXplQ2h1bmtpbmcnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV2hlbiBgaW5pdGlhbENvdW50YCBpcyB1c2VkLCB0aGlzIHByb3BlcnR5IGRlZmluZXMgYSBmcmFtZSByYXRlIChpbgogICAgICAgICAqIGZwcykgdG8gdGFyZ2V0IGJ5IHRocm90dGxpbmcgdGhlIG51bWJlciBvZiBpbnN0YW5jZXMgcmVuZGVyZWQgZWFjaAogICAgICAgICAqIGZyYW1lIHRvIG5vdCBleGNlZWQgdGhlIGJ1ZGdldCBmb3IgdGhlIHRhcmdldCBmcmFtZSByYXRlLiAgVGhlCiAgICAgICAgICogZnJhbWVyYXRlIGlzIGVmZmVjdGl2ZWx5IHRoZSBudW1iZXIgb2YgYHJlcXVlc3RBbmltYXRpb25GcmFtZWBzIHRoYXQKICAgICAgICAgKiBpdCB0cmllcyB0byBhbGxvdyB0byBhY3R1YWxseSBmaXJlIGluIGEgZ2l2ZW4gc2Vjb25kLiBJdCBkb2VzIHRoaXMKICAgICAgICAgKiBieSBtZWFzdXJpbmcgdGhlIHRpbWUgYmV0d2VlbiBgckFGYHMgYW5kIGNvbnRpbnVvdXNseSBhZGp1c3RpbmcgdGhlCiAgICAgICAgICogbnVtYmVyIG9mIGl0ZW1zIGNyZWF0ZWQgZWFjaCBgckFGYCB0byBtYWludGFpbiB0aGUgdGFyZ2V0IGZyYW1lcmF0ZS4KICAgICAgICAgKiBTZXR0aW5nIHRoaXMgdG8gYSBoaWdoZXIgbnVtYmVyIGFsbG93cyBsb3dlciBsYXRlbmN5IGFuZCBoaWdoZXIKICAgICAgICAgKiB0aHJvdWdocHV0IGZvciBldmVudCBoYW5kbGVycyBhbmQgb3RoZXIgdGFza3MsIGJ1dCByZXN1bHRzIGluIGEKICAgICAgICAgKiBsb25nZXIgdGltZSBmb3IgdGhlIHJlbWFpbmluZyBpdGVtcyB0byBjb21wbGV0ZSByZW5kZXJpbmcuCiAgICAgICAgICovCiAgICAgICAgdGFyZ2V0RnJhbWVyYXRlOiB7CiAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICB2YWx1ZTogMjAKICAgICAgICB9LAoKICAgICAgICBfdGFyZ2V0RnJhbWVUaW1lOiB7CiAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICBjb21wdXRlZDogJ19fY29tcHV0ZUZyYW1lVGltZSh0YXJnZXRGcmFtZXJhdGUpJwogICAgICAgIH0KCiAgICAgIH07CgogICAgfQoKICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICByZXR1cm4gWyAnX19pdGVtc0NoYW5nZWQoaXRlbXMuKiknIF07CiAgICB9CgogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuX19pbnN0YW5jZXMgPSBbXTsKICAgICAgdGhpcy5fX2xpbWl0ID0gSW5maW5pdHk7CiAgICAgIHRoaXMuX19wb29sID0gW107CiAgICAgIHRoaXMuX19yZW5kZXJEZWJvdW5jZXIgPSBudWxsOwogICAgICB0aGlzLl9faXRlbXNJZHhUb0luc3RJZHggPSB7fTsKICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSBudWxsOwogICAgICB0aGlzLl9fbGFzdENodW5rVGltZSA9IG51bGw7CiAgICAgIHRoaXMuX19zb3J0Rm4gPSBudWxsOwogICAgICB0aGlzLl9fZmlsdGVyRm4gPSBudWxsOwogICAgICB0aGlzLl9fb2JzZXJ2ZVBhdGhzID0gbnVsbDsKICAgICAgdGhpcy5fX2N0b3IgPSBudWxsOwogICAgICB0aGlzLl9faXNEZXRhY2hlZCA9IHRydWU7CiAgICAgIHRoaXMudGVtcGxhdGUgPSBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuX19pc0RldGFjaGVkID0gdHJ1ZTsKICAgICAgZm9yIChsZXQgaT0wOyBpPHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0aGlzLl9fZGV0YWNoSW5zdGFuY2UoaSk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgIC8vIG9ubHkgcGVyZm9ybSBhdHRhY2htZW50IGlmIHRoZSBlbGVtZW50IHdhcyBwcmV2aW91c2x5IGRldGFjaGVkLgogICAgICBpZiAodGhpcy5fX2lzRGV0YWNoZWQpIHsKICAgICAgICB0aGlzLl9faXNEZXRhY2hlZCA9IGZhbHNlOwogICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRoaXMuX19hdHRhY2hJbnN0YW5jZShpLCBwYXJlbnQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIF9fZW5zdXJlVGVtcGxhdGl6ZWQoKSB7CiAgICAgIC8vIFRlbXBsYXRpemluZyAoZ2VuZXJhdGluZyB0aGUgaW5zdGFuY2UgY29uc3RydWN0b3IpIG5lZWRzIHRvIHdhaXQKICAgICAgLy8gdW50aWwgcmVhZHksIHNpbmNlIHdvbid0IGhhdmUgaXRzIHRlbXBsYXRlIGNvbnRlbnQgaGFuZGVkIGJhY2sgdG8KICAgICAgLy8gaXQgdW50aWwgdGhlbgogICAgICBpZiAoIXRoaXMuX19jdG9yKSB7CiAgICAgICAgbGV0IHRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8odGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKTsKICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAvLyAvLyBXYWl0IHVudGlsIGNoaWxkTGlzdCBjaGFuZ2VzIGFuZCB0ZW1wbGF0ZSBzaG91bGQgYmUgdGhlcmUgYnkgdGhlbgogICAgICAgICAgbGV0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgICBpZiAodGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKSB7CiAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgIHRoaXMuX19yZW5kZXIoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RvbS1yZXBlYXQgcmVxdWlyZXMgYSA8dGVtcGxhdGU+IGNoaWxkJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7Y2hpbGRMaXN0OiB0cnVlfSk7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIFRlbXBsYXRlIGluc3RhbmNlIHByb3BzIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gZm9yd2FyZGluZwogICAgICAgIGxldCBpbnN0YW5jZVByb3BzID0ge307CiAgICAgICAgaW5zdGFuY2VQcm9wc1t0aGlzLmFzXSA9IHRydWU7CiAgICAgICAgaW5zdGFuY2VQcm9wc1t0aGlzLmluZGV4QXNdID0gdHJ1ZTsKICAgICAgICBpbnN0YW5jZVByb3BzW3RoaXMuaXRlbXNJbmRleEFzXSA9IHRydWU7CiAgICAgICAgdGhpcy5fX2N0b3IgPSBQb2x5bWVyLlRlbXBsYXRpemUudGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgdGhpcywgewogICAgICAgICAgbXV0YWJsZURhdGE6IHRoaXMubXV0YWJsZURhdGEsCiAgICAgICAgICBwYXJlbnRNb2RlbDogdHJ1ZSwKICAgICAgICAgIGluc3RhbmNlUHJvcHM6IGluc3RhbmNlUHJvcHMsCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEB0aGlzIHt0aGlzfQogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgdG8gc2V0CiAgICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldCBwcm9wZXJ0eSB0bwogICAgICAgICAgICovCiAgICAgICAgICBmb3J3YXJkSG9zdFByb3A6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKSB7CiAgICAgICAgICAgIGxldCBpJCA9IHRoaXMuX19pbnN0YW5jZXM7CiAgICAgICAgICAgIGZvciAobGV0IGk9MCwgaW5zdDsgKGk8aSQubGVuZ3RoKSAmJiAoaW5zdD1pJFtpXSk7IGkrKykgewogICAgICAgICAgICAgIGluc3QuZm9yd2FyZEhvc3RQcm9wKHByb3AsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIC8qKgogICAgICAgICAgICogQHRoaXMge3RoaXN9CiAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5zdCBJbnN0YW5jZSB0byBub3RpZnkKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IHRvIG5vdGlmeQogICAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBub3RpZnkKICAgICAgICAgICAqLwogICAgICAgICAgbm90aWZ5SW5zdGFuY2VQcm9wOiBmdW5jdGlvbihpbnN0LCBwcm9wLCB2YWx1ZSkgewogICAgICAgICAgICBpZiAoUG9seW1lci5QYXRoLm1hdGNoZXModGhpcy5hcywgcHJvcCkpIHsKICAgICAgICAgICAgICBsZXQgaWR4ID0gaW5zdFt0aGlzLml0ZW1zSW5kZXhBc107CiAgICAgICAgICAgICAgaWYgKHByb3AgPT0gdGhpcy5hcykgewogICAgICAgICAgICAgICAgdGhpcy5pdGVtc1tpZHhdID0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGxldCBwYXRoID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZSh0aGlzLmFzLCAnaXRlbXMuJyArIGlkeCwgcHJvcCk7CiAgICAgICAgICAgICAgdGhpcy5ub3RpZnlQYXRoKHBhdGgsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIF9fZ2V0TWV0aG9kSG9zdCgpIHsKICAgICAgLy8gVGVjaG5pY2FsbHkgdGhpcyBzaG91bGQgYmUgdGhlIG93bmVyIG9mIHRoZSBvdXRlcm1vc3QgdGVtcGxhdGUuCiAgICAgIC8vIEluIHNoYWRvdyBkb20sIHRoaXMgaXMgYWx3YXlzIGdldFJvb3ROb2RlKCkuaG9zdCwgYnV0IHdlIGNhbgogICAgICAvLyBhcHByb3hpbWF0ZSB0aGlzIHZpYSBjb29wZXJhdGlvbiB3aXRoIG91ciBkYXRhSG9zdCBhbHdheXMgc2V0dGluZwogICAgICAvLyBgX21ldGhvZEhvc3RgIGFzIGxvbmcgYXMgdGhlcmUgd2VyZSBiaW5kaW5ncyAob3IgaWQncykgb24gdGhpcwogICAgICAvLyBpbnN0YW5jZSBjYXVzaW5nIGl0IHRvIGdldCBhIGRhdGFIb3N0LgogICAgICByZXR1cm4gdGhpcy5fX2RhdGFIb3N0Ll9tZXRob2RIb3N0IHx8IHRoaXMuX19kYXRhSG9zdDsKICAgIH0KCiAgICBfX2Z1bmN0aW9uRnJvbVByb3BlcnR5VmFsdWUoZnVuY3Rpb25Pck1ldGhvZE5hbWUpIHsKICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbk9yTWV0aG9kTmFtZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICBsZXQgbWV0aG9kTmFtZSA9IGZ1bmN0aW9uT3JNZXRob2ROYW1lOwogICAgICAgIGxldCBvYmogPSB0aGlzLl9fZ2V0TWV0aG9kSG9zdCgpOwogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIG9ialttZXRob2ROYW1lXS5hcHBseShvYmosIGFyZ3VtZW50cyk7IH07CiAgICAgIH0KCiAgICAgIHJldHVybiBmdW5jdGlvbk9yTWV0aG9kTmFtZTsKICAgIH0KCiAgICBfX3NvcnRDaGFuZ2VkKHNvcnQpIHsKICAgICAgdGhpcy5fX3NvcnRGbiA9IHRoaXMuX19mdW5jdGlvbkZyb21Qcm9wZXJ0eVZhbHVlKHNvcnQpOwogICAgICBpZiAodGhpcy5pdGVtcykgeyB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcik7IH0KICAgIH0KCiAgICBfX2ZpbHRlckNoYW5nZWQoZmlsdGVyKSB7CiAgICAgIHRoaXMuX19maWx0ZXJGbiA9IHRoaXMuX19mdW5jdGlvbkZyb21Qcm9wZXJ0eVZhbHVlKGZpbHRlcik7CiAgICAgIGlmICh0aGlzLml0ZW1zKSB7IHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyKTsgfQogICAgfQoKICAgIF9fY29tcHV0ZUZyYW1lVGltZShyYXRlKSB7CiAgICAgIHJldHVybiBNYXRoLmNlaWwoMTAwMC9yYXRlKTsKICAgIH0KCiAgICBfX2luaXRpYWxpemVDaHVua2luZygpIHsKICAgICAgaWYgKHRoaXMuaW5pdGlhbENvdW50KSB7CiAgICAgICAgdGhpcy5fX2xpbWl0ID0gdGhpcy5pbml0aWFsQ291bnQ7CiAgICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSB0aGlzLmluaXRpYWxDb3VudDsKICAgICAgICB0aGlzLl9fbGFzdENodW5rVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICB9CiAgICB9CgogICAgX190cnlSZW5kZXJDaHVuaygpIHsKICAgICAgLy8gRGVib3VuY2VkIHNvIHRoYXQgbXVsdGlwbGUgY2FsbHMgdGhyb3VnaCBgX3JlbmRlcmAgYmV0d2VlbiBhbmltYXRpb24KICAgICAgLy8gZnJhbWVzIG9ubHkgcXVldWUgb25lIG5ldyByQUYgKGUuZy4gYXJyYXkgbXV0YXRpb24gJiBjaHVua2VkIHJlbmRlcikKICAgICAgaWYgKHRoaXMuaXRlbXMgJiYgdGhpcy5fX2xpbWl0IDwgdGhpcy5pdGVtcy5sZW5ndGgpIHsKICAgICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlcXVlc3RSZW5kZXJDaHVuayk7CiAgICAgIH0KICAgIH0KCiAgICBfX3JlcXVlc3RSZW5kZXJDaHVuaygpIHsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLl9fcmVuZGVyQ2h1bmsoKSk7CiAgICB9CgogICAgX19yZW5kZXJDaHVuaygpIHsKICAgICAgLy8gU2ltcGxlIGF1dG8gY2h1bmtTaXplIHRocm90dGxpbmcgYWxnb3JpdGhtIGJhc2VkIG9uIGZlZWRiYWNrIGxvb3A6CiAgICAgIC8vIG1lYXN1cmUgYWN0dWFsIHRpbWUgYmV0d2VlbiBmcmFtZXMgYW5kIHNjYWxlIGNodW5rIGNvdW50IGJ5IHJhdGlvCiAgICAgIC8vIG9mIHRhcmdldC9hY3R1YWwgZnJhbWUgdGltZQogICAgICBsZXQgY3VyckNodW5rVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICBsZXQgcmF0aW8gPSB0aGlzLl90YXJnZXRGcmFtZVRpbWUgLyAoY3VyckNodW5rVGltZSAtIHRoaXMuX19sYXN0Q2h1bmtUaW1lKTsKICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSBNYXRoLnJvdW5kKHRoaXMuX19jaHVua0NvdW50ICogcmF0aW8pIHx8IDE7CiAgICAgIHRoaXMuX19saW1pdCArPSB0aGlzLl9fY2h1bmtDb3VudDsKICAgICAgdGhpcy5fX2xhc3RDaHVua1RpbWUgPSBjdXJyQ2h1bmtUaW1lOwogICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcik7CiAgICB9CgogICAgX19vYnNlcnZlQ2hhbmdlZCgpIHsKICAgICAgdGhpcy5fX29ic2VydmVQYXRocyA9IHRoaXMub2JzZXJ2ZSAmJgogICAgICAgIHRoaXMub2JzZXJ2ZS5yZXBsYWNlKCcuKicsICcuJykuc3BsaXQoJyAnKTsKICAgIH0KCiAgICBfX2l0ZW1zQ2hhbmdlZChjaGFuZ2UpIHsKICAgICAgaWYgKHRoaXMuaXRlbXMgJiYgIUFycmF5LmlzQXJyYXkodGhpcy5pdGVtcykpIHsKICAgICAgICBjb25zb2xlLndhcm4oJ2RvbS1yZXBlYXQgZXhwZWN0ZWQgYXJyYXkgZm9yIGBpdGVtc2AsIGZvdW5kJywgdGhpcy5pdGVtcyk7CiAgICAgIH0KICAgICAgLy8gSWYgcGF0aCB3YXMgdG8gYW4gaXRlbSAoZS5nLiAnaXRlbXMuMycgb3IgJ2l0ZW1zLjMuZm9vJyksIGZvcndhcmQgdGhlCiAgICAgIC8vIHBhdGggdG8gdGhhdCBpbnN0YW5jZSBzeW5jaHJvbm91c2x5IChyZXR1cm5zIGZhbHNlIGZvciBub24taXRlbSBwYXRocykKICAgICAgaWYgKCF0aGlzLl9faGFuZGxlSXRlbVBhdGgoY2hhbmdlLnBhdGgsIGNoYW5nZS52YWx1ZSkpIHsKICAgICAgICAvLyBPdGhlcndpc2UsIHRoZSBhcnJheSB3YXMgcmVzZXQgKCdpdGVtcycpIG9yIHNwbGljZWQgKCdpdGVtcy5zcGxpY2VzJyksCiAgICAgICAgLy8gc28gcXVldWUgYSBmdWxsIHJlZnJlc2gKICAgICAgICB0aGlzLl9faW5pdGlhbGl6ZUNodW5raW5nKCk7CiAgICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIpOwogICAgICB9CiAgICB9CgogICAgX19oYW5kbGVPYnNlcnZlZFBhdGhzKHBhdGgpIHsKICAgICAgLy8gSGFuZGxlIGNhc2VzIHdoZXJlIHBhdGggY2hhbmdlcyBzaG91bGQgY2F1c2UgYSByZS1zb3J0L2ZpbHRlcgogICAgICBpZiAodGhpcy5fX3NvcnRGbiB8fCB0aGlzLl9fZmlsdGVyRm4pIHsKICAgICAgICBpZiAoIXBhdGgpIHsKICAgICAgICAgIC8vIEFsd2F5cyByZS1yZW5kZXIgaWYgdGhlIGl0ZW0gaXRzZWxmIGNoYW5nZWQKICAgICAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyLCB0aGlzLmRlbGF5KTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX19vYnNlcnZlUGF0aHMpIHsKICAgICAgICAgIC8vIE90aGVyd2lzZSwgcmUtcmVuZGVyIGlmIHRoZSBwYXRoIGNoYW5nZWQgbWF0Y2hlcyBhbiBvYnNlcnZlZCBwYXRoCiAgICAgICAgICBsZXQgcGF0aHMgPSB0aGlzLl9fb2JzZXJ2ZVBhdGhzOwogICAgICAgICAgZm9yIChsZXQgaT0wOyBpPHBhdGhzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YocGF0aHNbaV0pID09PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIsIHRoaXMuZGVsYXkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHRoaXM6RG9tUmVwZWF0KX0gZm4gRnVuY3Rpb24gdG8gZGVib3VuY2UuCiAgICAgKiBAcGFyYW0ge251bWJlcj19IGRlbGF5IERlbGF5IGluIG1zIHRvIGRlYm91bmNlIGJ5LgogICAgICovCiAgICBfX2RlYm91bmNlUmVuZGVyKGZuLCBkZWxheSA9IDApIHsKICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgICB0aGlzLl9fcmVuZGVyRGVib3VuY2VyCiAgICAgICAgICAsIGRlbGF5ID4gMCA/IFBvbHltZXIuQXN5bmMudGltZU91dC5hZnRlcihkZWxheSkgOiBQb2x5bWVyLkFzeW5jLm1pY3JvVGFzawogICAgICAgICAgLCBmbi5iaW5kKHRoaXMpKTsKICAgICAgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyKHRoaXMuX19yZW5kZXJEZWJvdW5jZXIpOwogICAgfQoKICAgIC8qKgogICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gTm9ybWFsbHkgcmVuZGVyaW5nIGlzCiAgICAgKiBhc3luY2hyb25vdXMgdG8gYSBwcm92b2tpbmcgY2hhbmdlLiBUaGlzIGlzIGRvbmUgZm9yIGVmZmljaWVuY3kgc28KICAgICAqIHRoYXQgbXVsdGlwbGUgY2hhbmdlcyB0cmlnZ2VyIG9ubHkgYSBzaW5nbGUgcmVuZGVyLiBUaGUgcmVuZGVyIG1ldGhvZAogICAgICogc2hvdWxkIGJlIGNhbGxlZCBpZiwgZm9yIGV4YW1wbGUsIHRlbXBsYXRlIHJlbmRlcmluZyBpcyByZXF1aXJlZCB0bwogICAgICogdmFsaWRhdGUgYXBwbGljYXRpb24gc3RhdGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZW5kZXIoKSB7CiAgICAgIC8vIFF1ZXVlIHRoaXMgcmVwZWF0ZXIsIHRoZW4gZmx1c2ggYWxsIGluIG9yZGVyCiAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyKTsKICAgICAgUG9seW1lci5mbHVzaCgpOwogICAgfQoKICAgIF9fcmVuZGVyKCkgewogICAgICBpZiAoIXRoaXMuX19lbnN1cmVUZW1wbGF0aXplZCgpKSB7CiAgICAgICAgLy8gTm8gdGVtcGxhdGUgZm91bmQgeWV0CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuX19hcHBseUZ1bGxSZWZyZXNoKCk7CiAgICAgIC8vIFJlc2V0IHRoZSBwb29sCiAgICAgIC8vIFRPRE8oa3NjaGFhZik6IFJldXNlIHBvb2wgYWNyb3NzIHR1cm5zIGFuZCBuZXN0ZWQgdGVtcGxhdGVzCiAgICAgIC8vIE5vdyB0aGF0IG9iamVjdHMvYXJyYXlzIGFyZSByZS1ldmFsdWF0ZWQgd2hlbiBzZXQsIHdlIGNhbiBzYWZlbHkKICAgICAgLy8gcmV1c2UgcG9vbGVkIGluc3RhbmNlcyBhY3Jvc3MgdHVybnMsIGhvd2V2ZXIgd2Ugc3RpbGwgbmVlZCB0byBkZWNpZGUKICAgICAgLy8gc2VtYW50aWNzIHJlZ2FyZGluZyBob3cgbG9uZyB0byBob2xkLCBob3cgbWFueSB0byBob2xkLCBldGMuCiAgICAgIHRoaXMuX19wb29sLmxlbmd0aCA9IDA7CiAgICAgIC8vIFNldCByZW5kZXJlZCBpdGVtIGNvdW50CiAgICAgIHRoaXMuX3NldFJlbmRlcmVkSXRlbUNvdW50KHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoKTsKICAgICAgLy8gTm90aWZ5IHVzZXJzCiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHJlbmRlciBtb3JlIGl0ZW1zCiAgICAgIHRoaXMuX190cnlSZW5kZXJDaHVuaygpOwogICAgfQoKICAgIF9fYXBwbHlGdWxsUmVmcmVzaCgpIHsKICAgICAgbGV0IGl0ZW1zID0gdGhpcy5pdGVtcyB8fCBbXTsKICAgICAgbGV0IGlzbnRJZHhUb0l0ZW1zSWR4ID0gbmV3IEFycmF5KGl0ZW1zLmxlbmd0aCk7CiAgICAgIGZvciAobGV0IGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgIGlzbnRJZHhUb0l0ZW1zSWR4W2ldID0gaTsKICAgICAgfQogICAgICAvLyBBcHBseSB1c2VyIGZpbHRlcgogICAgICBpZiAodGhpcy5fX2ZpbHRlckZuKSB7CiAgICAgICAgaXNudElkeFRvSXRlbXNJZHggPSBpc250SWR4VG9JdGVtc0lkeC5maWx0ZXIoKGksIGlkeCwgYXJyYXkpID0+CiAgICAgICAgICB0aGlzLl9fZmlsdGVyRm4oaXRlbXNbaV0sIGlkeCwgYXJyYXkpKTsKICAgICAgfQogICAgICAvLyBBcHBseSB1c2VyIHNvcnQKICAgICAgaWYgKHRoaXMuX19zb3J0Rm4pIHsKICAgICAgICBpc250SWR4VG9JdGVtc0lkeC5zb3J0KChhLCBiKSA9PiB0aGlzLl9fc29ydEZuKGl0ZW1zW2FdLCBpdGVtc1tiXSkpOwogICAgICB9CiAgICAgIC8vIGl0ZW1zLT5pbnN0IG1hcCBrZXB0IGZvciBpdGVtIHBhdGggZm9yd2FyZGluZwogICAgICBjb25zdCBpdGVtc0lkeFRvSW5zdElkeCA9IHRoaXMuX19pdGVtc0lkeFRvSW5zdElkeCA9IHt9OwogICAgICBsZXQgaW5zdElkeCA9IDA7CiAgICAgIC8vIEdlbmVyYXRlIGluc3RhbmNlcyBhbmQgYXNzaWduIGl0ZW1zCiAgICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4oaXNudElkeFRvSXRlbXNJZHgubGVuZ3RoLCB0aGlzLl9fbGltaXQpOwogICAgICBmb3IgKDsgaW5zdElkeDxsaW1pdDsgaW5zdElkeCsrKSB7CiAgICAgICAgbGV0IGluc3QgPSB0aGlzLl9faW5zdGFuY2VzW2luc3RJZHhdOwogICAgICAgIGxldCBpdGVtSWR4ID0gaXNudElkeFRvSXRlbXNJZHhbaW5zdElkeF07CiAgICAgICAgbGV0IGl0ZW0gPSBpdGVtc1tpdGVtSWR4XTsKICAgICAgICBpdGVtc0lkeFRvSW5zdElkeFtpdGVtSWR4XSA9IGluc3RJZHg7CiAgICAgICAgaWYgKGluc3QpIHsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLmFzLCBpdGVtKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLmluZGV4QXMsIGluc3RJZHgpOwogICAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaXRlbXNJbmRleEFzLCBpdGVtSWR4KTsKICAgICAgICAgIGluc3QuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9faW5zZXJ0SW5zdGFuY2UoaXRlbSwgaW5zdElkeCwgaXRlbUlkeCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIFJlbW92ZSBhbnkgZXh0cmEgaW5zdGFuY2VzIGZyb20gcHJldmlvdXMgc3RhdGUKICAgICAgZm9yIChsZXQgaT10aGlzLl9faW5zdGFuY2VzLmxlbmd0aC0xOyBpPj1pbnN0SWR4OyBpLS0pIHsKICAgICAgICB0aGlzLl9fZGV0YWNoQW5kUmVtb3ZlSW5zdGFuY2UoaSk7CiAgICAgIH0KICAgIH0KCiAgICBfX2RldGFjaEluc3RhbmNlKGlkeCkgewogICAgICBsZXQgaW5zdCA9IHRoaXMuX19pbnN0YW5jZXNbaWR4XTsKICAgICAgZm9yIChsZXQgaT0wOyBpPGluc3QuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgZWwgPSBpbnN0LmNoaWxkcmVuW2ldOwogICAgICAgIGluc3Qucm9vdC5hcHBlbmRDaGlsZChlbCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGluc3Q7CiAgICB9CgogICAgX19hdHRhY2hJbnN0YW5jZShpZHgsIHBhcmVudCkgewogICAgICBsZXQgaW5zdCA9IHRoaXMuX19pbnN0YW5jZXNbaWR4XTsKICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShpbnN0LnJvb3QsIHRoaXMpOwogICAgfQoKICAgIF9fZGV0YWNoQW5kUmVtb3ZlSW5zdGFuY2UoaWR4KSB7CiAgICAgIGxldCBpbnN0ID0gdGhpcy5fX2RldGFjaEluc3RhbmNlKGlkeCk7CiAgICAgIGlmIChpbnN0KSB7CiAgICAgICAgdGhpcy5fX3Bvb2wucHVzaChpbnN0KTsKICAgICAgfQogICAgICB0aGlzLl9faW5zdGFuY2VzLnNwbGljZShpZHgsIDEpOwogICAgfQoKICAgIF9fc3RhbXBJbnN0YW5jZShpdGVtLCBpbnN0SWR4LCBpdGVtSWR4KSB7CiAgICAgIGxldCBtb2RlbCA9IHt9OwogICAgICBtb2RlbFt0aGlzLmFzXSA9IGl0ZW07CiAgICAgIG1vZGVsW3RoaXMuaW5kZXhBc10gPSBpbnN0SWR4OwogICAgICBtb2RlbFt0aGlzLml0ZW1zSW5kZXhBc10gPSBpdGVtSWR4OwogICAgICByZXR1cm4gbmV3IHRoaXMuX19jdG9yKG1vZGVsKTsKICAgIH0KCiAgICBfX2luc2VydEluc3RhbmNlKGl0ZW0sIGluc3RJZHgsIGl0ZW1JZHgpIHsKICAgICAgbGV0IGluc3QgPSB0aGlzLl9fcG9vbC5wb3AoKTsKICAgICAgaWYgKGluc3QpIHsKICAgICAgICAvLyBUT0RPKGtzY2hhYWYpOiBJZiB0aGUgcG9vbCBpcyBzaGFyZWQgYWNyb3NzIHR1cm5zLCBob3N0UHJvcHMKICAgICAgICAvLyBuZWVkIHRvIGJlIHJlLXNldCB0byByZXVzZWQgaW5zdGFuY2VzIGluIGFkZGl0aW9uIHRvIGl0ZW0KICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHkodGhpcy5hcywgaXRlbSk7CiAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaW5kZXhBcywgaW5zdElkeCk7CiAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaXRlbXNJbmRleEFzLCBpdGVtSWR4KTsKICAgICAgICBpbnN0Ll9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbnN0ID0gdGhpcy5fX3N0YW1wSW5zdGFuY2UoaXRlbSwgaW5zdElkeCwgaXRlbUlkeCk7CiAgICAgIH0KICAgICAgbGV0IGJlZm9yZVJvdyA9IHRoaXMuX19pbnN0YW5jZXNbaW5zdElkeCArIDFdOwogICAgICBsZXQgYmVmb3JlTm9kZSA9IGJlZm9yZVJvdyA/IGJlZm9yZVJvdy5jaGlsZHJlblswXSA6IHRoaXM7CiAgICAgIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaW5zdC5yb290LCBiZWZvcmVOb2RlKTsKICAgICAgdGhpcy5fX2luc3RhbmNlc1tpbnN0SWR4XSA9IGluc3Q7CiAgICAgIHJldHVybiBpbnN0OwogICAgfQoKICAgIC8vIEltcGxlbWVudHMgZXh0ZW5zaW9uIHBvaW50IGZyb20gVGVtcGxhdGl6ZSBtaXhpbgogICAgLyoqCiAgICAgKiBTaG93cyBvciBoaWRlcyB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdG9wIGxldmVsIGNoaWxkIGVsZW1lbnRzLiBGb3IKICAgICAqIHRleHQgbm9kZXMsIGB0ZXh0Q29udGVudGAgaXMgcmVtb3ZlZCB3aGlsZSAiaGlkZGVuIiBhbmQgcmVwbGFjZWQgd2hlbgogICAgICogInNob3duLiIKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGlkZGVuIFNldCB0byB0cnVlIHRvIGhpZGUgdGhlIGNoaWxkcmVuOwogICAgICogc2V0IHRvIGZhbHNlIHRvIHNob3cgdGhlbS4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIF9zaG93SGlkZUNoaWxkcmVuKGhpZGRlbikgewogICAgICBmb3IgKGxldCBpPTA7IGk8dGhpcy5fX2luc3RhbmNlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHRoaXMuX19pbnN0YW5jZXNbaV0uX3Nob3dIaWRlQ2hpbGRyZW4oaGlkZGVuKTsKICAgICAgfQogICAgfQoKICAgIC8vIENhbGxlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIGEgaG9zdCBpdGVtcy48a2V5Pi48cGF0aD4gcGF0aCBjaGFuZ2UsCiAgICAvLyByZXNwb25zaWJsZSBmb3Igbm90aWZ5aW5nIGl0ZW0uPHBhdGg+IGNoYW5nZXMgdG8gaW5zdCBmb3Iga2V5CiAgICBfX2hhbmRsZUl0ZW1QYXRoKHBhdGgsIHZhbHVlKSB7CiAgICAgIGxldCBpdGVtc1BhdGggPSBwYXRoLnNsaWNlKDYpOyAvLyAnaXRlbXMuJy5sZW5ndGggPT0gNgogICAgICBsZXQgZG90ID0gaXRlbXNQYXRoLmluZGV4T2YoJy4nKTsKICAgICAgbGV0IGl0ZW1zSWR4ID0gZG90IDwgMCA/IGl0ZW1zUGF0aCA6IGl0ZW1zUGF0aC5zdWJzdHJpbmcoMCwgZG90KTsKICAgICAgLy8gSWYgcGF0aCB3YXMgaW5kZXggaW50byBhcnJheS4uLgogICAgICBpZiAoaXRlbXNJZHggPT0gcGFyc2VJbnQoaXRlbXNJZHgsIDEwKSkgewogICAgICAgIGxldCBpdGVtU3ViUGF0aCA9IGRvdCA8IDAgPyAnJyA6IGl0ZW1zUGF0aC5zdWJzdHJpbmcoZG90KzEpOwogICAgICAgIC8vIElmIHRoZSBwYXRoIGlzIG9ic2VydmVkLCBpdCB3aWxsIHRyaWdnZXIgYSBmdWxsIHJlZnJlc2gKICAgICAgICB0aGlzLl9faGFuZGxlT2JzZXJ2ZWRQYXRocyhpdGVtU3ViUGF0aCk7CiAgICAgICAgLy8gTm90ZSwgZXZlbiBpZiBhIHJ1bGwgcmVmcmVzaCBpcyB0cmlnZ2VyZWQsIGFsd2F5cyBkbyB0aGUgcGF0aAogICAgICAgIC8vIG5vdGlmaWNhdGlvbiBiZWNhdXNlIHVubGVzcyBtdXRhYmxlRGF0YSBpcyB1c2VkIGZvciBkb20tcmVwZWF0CiAgICAgICAgLy8gYW5kIGFsbCBlbGVtZW50cyBpbiB0aGUgaW5zdGFuY2Ugc3VidHJlZSwgYSBmdWxsIHJlZnJlc2ggbWF5CiAgICAgICAgLy8gbm90IHRyaWdnZXIgdGhlIHByb3BlciB1cGRhdGUuCiAgICAgICAgbGV0IGluc3RJZHggPSB0aGlzLl9faXRlbXNJZHhUb0luc3RJZHhbaXRlbXNJZHhdOwogICAgICAgIGxldCBpbnN0ID0gdGhpcy5fX2luc3RhbmNlc1tpbnN0SWR4XTsKICAgICAgICBpZiAoaW5zdCkgewogICAgICAgICAgbGV0IGl0ZW1QYXRoID0gdGhpcy5hcyArIChpdGVtU3ViUGF0aCA/ICcuJyArIGl0ZW1TdWJQYXRoIDogJycpOwogICAgICAgICAgLy8gVGhpcyBpcyBlZmZlY3RpdmVseSBgbm90aWZ5UGF0aGAsIGJ1dCBhdm9pZHMgc29tZSBvZiB0aGUgb3ZlcmhlYWQKICAgICAgICAgIC8vIG9mIHRoZSBwdWJsaWMgQVBJCiAgICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoaXRlbVBhdGgsIHZhbHVlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICBpbnN0Ll9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGl0ZW0gYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZWxlbWVudCBzdGFtcGVkIGJ5CiAgICAgKiB0aGlzIGBkb20tcmVwZWF0YC4KICAgICAqCiAgICAgKiBOb3RlLCB0byBtb2RpZnkgc3ViLXByb3BlcnRpZXMgb2YgdGhlIGl0ZW0sCiAgICAgKiBgbW9kZWxGb3JFbGVtZW50KGVsKS5zZXQoJ2l0ZW0uPHN1Yi1wcm9wPicsIHZhbHVlKWAKICAgICAqIHNob3VsZCBiZSB1c2VkLgogICAgICoKICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gdGhlIGl0ZW0uCiAgICAgKiBAcmV0dXJuIHsqfSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudC4KICAgICAqLwogICAgaXRlbUZvckVsZW1lbnQoZWwpIHsKICAgICAgbGV0IGluc3RhbmNlID0gdGhpcy5tb2RlbEZvckVsZW1lbnQoZWwpOwogICAgICByZXR1cm4gaW5zdGFuY2UgJiYgaW5zdGFuY2VbdGhpcy5hc107CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBpbnN0IGluZGV4IGZvciBhIGdpdmVuIGVsZW1lbnQgc3RhbXBlZCBieSB0aGlzIGBkb20tcmVwZWF0YC4KICAgICAqIElmIGBzb3J0YCBpcyBwcm92aWRlZCwgdGhlIGluZGV4IHdpbGwgcmVmbGVjdCB0aGUgc29ydGVkIG9yZGVyIChyYXRoZXIKICAgICAqIHRoYW4gdGhlIG9yaWdpbmFsIGFycmF5IG9yZGVyKS4KICAgICAqCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gZWwgRWxlbWVudCBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZSBpbmRleC4KICAgICAqIEByZXR1cm4gez9udW1iZXJ9IFJvdyBpbmRleCBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQgKG5vdGUgdGhpcyBtYXkKICAgICAqICAgbm90IGNvcnJlc3BvbmQgdG8gdGhlIGFycmF5IGluZGV4IGlmIGEgdXNlciBgc29ydGAgaXMgYXBwbGllZCkuCiAgICAgKi8KICAgIGluZGV4Rm9yRWxlbWVudChlbCkgewogICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLm1vZGVsRm9yRWxlbWVudChlbCk7CiAgICAgIHJldHVybiBpbnN0YW5jZSAmJiBpbnN0YW5jZVt0aGlzLmluZGV4QXNdOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgIm1vZGVsIiBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBlbGVtZW50LCB3aGljaAogICAgICogc2VydmVzIGFzIHRoZSBiaW5kaW5nIHNjb3BlIGZvciB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdGhlIGVsZW1lbnQgaXMKICAgICAqIGNvbnRhaW5lZCBpbi4gQSB0ZW1wbGF0ZSBtb2RlbCBpcyBhbiBpbnN0YW5jZSBvZiBgUG9seW1lci5CYXNlYCwgYW5kCiAgICAgKiBzaG91bGQgYmUgdXNlZCB0byBtYW5pcHVsYXRlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgIGxldCBtb2RlbCA9IG1vZGVsRm9yRWxlbWVudChlbCk7CiAgICAgKiAgIGlmIChtb2RlbC5pbmRleCA8IDEwKSB7CiAgICAgKiAgICAgbW9kZWwuc2V0KCdpdGVtLmNoZWNrZWQnLCB0cnVlKTsKICAgICAqICAgfQogICAgICoKICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gYSB0ZW1wbGF0ZSBtb2RlbC4KICAgICAqIEByZXR1cm4ge1RlbXBsYXRlSW5zdGFuY2VCYXNlfSBNb2RlbCByZXByZXNlbnRpbmcgdGhlIGJpbmRpbmcgc2NvcGUgZm9yCiAgICAgKiAgIHRoZSBlbGVtZW50LgogICAgICovCiAgICBtb2RlbEZvckVsZW1lbnQoZWwpIHsKICAgICAgcmV0dXJuIFBvbHltZXIuVGVtcGxhdGl6ZS5tb2RlbEZvckVsZW1lbnQodGhpcy50ZW1wbGF0ZSwgZWwpOwogICAgfQoKICB9CgogIGN1c3RvbUVsZW1lbnRzLmRlZmluZShEb21SZXBlYXQuaXMsIERvbVJlcGVhdCk7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkRvbVJlcGVhdCA9IERvbVJlcGVhdDsKCn0pKCk7CgoKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBUaGUgYDxkb20taWY+YCBlbGVtZW50IHdpbGwgc3RhbXAgYSBsaWdodC1kb20gYDx0ZW1wbGF0ZT5gIGNoaWxkIHdoZW4KICAgKiB0aGUgYGlmYCBwcm9wZXJ0eSBiZWNvbWVzIHRydXRoeSwgYW5kIHRoZSB0ZW1wbGF0ZSBjYW4gdXNlIFBvbHltZXIKICAgKiBkYXRhLWJpbmRpbmcgYW5kIGRlY2xhcmF0aXZlIGV2ZW50IGZlYXR1cmVzIHdoZW4gdXNlZCBpbiB0aGUgY29udGV4dCBvZgogICAqIGEgUG9seW1lciBlbGVtZW50J3MgdGVtcGxhdGUuCiAgICoKICAgKiBXaGVuIGBpZmAgYmVjb21lcyBmYWxzeSwgdGhlIHN0YW1wZWQgY29udGVudCBpcyBoaWRkZW4gYnV0IG5vdAogICAqIHJlbW92ZWQgZnJvbSBkb20uIFdoZW4gYGlmYCBzdWJzZXF1ZW50bHkgYmVjb21lcyB0cnV0aHkgYWdhaW4sIHRoZSBjb250ZW50CiAgICogaXMgc2ltcGx5IHJlLXNob3duLiBUaGlzIGFwcHJvYWNoIGlzIHVzZWQgZHVlIHRvIGl0cyBmYXZvcmFibGUgcGVyZm9ybWFuY2UKICAgKiBjaGFyYWN0ZXJpc3RpY3M6IHRoZSBleHBlbnNlIG9mIGNyZWF0aW5nIHRlbXBsYXRlIGNvbnRlbnQgaXMgcGFpZCBvbmx5CiAgICogb25jZSBhbmQgbGF6aWx5LgogICAqCiAgICogU2V0IHRoZSBgcmVzdGFtcGAgcHJvcGVydHkgdG8gdHJ1ZSB0byBmb3JjZSB0aGUgc3RhbXBlZCBjb250ZW50IHRvIGJlCiAgICogY3JlYXRlZCAvIGRlc3Ryb3llZCB3aGVuIHRoZSBgaWZgIGNvbmRpdGlvbiBjaGFuZ2VzLgogICAqCiAgICogQGN1c3RvbUVsZW1lbnQKICAgKiBAcG9seW1lcgogICAqIEBleHRlbmRzIFBvbHltZXIuRWxlbWVudAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgdGhhdCBjb25kaXRpb25hbGx5IHN0YW1wcyBhbmQgaGlkZXMgb3IgcmVtb3ZlcwogICAqICAgdGVtcGxhdGUgY29udGVudCBiYXNlZCBvbiBhIGJvb2xlYW4gZmxhZy4KICAgKi8KICBjbGFzcyBEb21JZiBleHRlbmRzIFBvbHltZXIuRWxlbWVudCB7CgogICAgLy8gTm90IG5lZWRlZCB0byBmaW5kIHRlbXBsYXRlOyBjYW4gYmUgcmVtb3ZlZCBvbmNlIHRoZSBhbmFseXplcgogICAgLy8gY2FuIGZpbmQgdGhlIHRhZyBuYW1lIGZyb20gY3VzdG9tRWxlbWVudHMuZGVmaW5lIGNhbGwKICAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZG9tLWlmJzsgfQoKICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7IHJldHVybiBudWxsOyB9CgogICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewoKICAgICAgcmV0dXJuIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZWQgd2hlbmV2ZXIgRE9NIGlzIGFkZGVkIG9yIHJlbW92ZWQvaGlkZGVuIGJ5IHRoaXMgdGVtcGxhdGUgKGJ5CiAgICAgICAgICogZGVmYXVsdCwgcmVuZGVyaW5nIG9jY3VycyBsYXppbHkpLiAgVG8gZm9yY2UgaW1tZWRpYXRlIHJlbmRlcmluZywgY2FsbAogICAgICAgICAqIGByZW5kZXJgLgogICAgICAgICAqCiAgICAgICAgICogQGV2ZW50IGRvbS1jaGFuZ2UKICAgICAgICAgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHRlbXBsYXRlIHNob3VsZCBzdGFtcC4KICAgICAgICAgKi8KICAgICAgICBpZjogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIG9ic2VydmVyOiAnX19kZWJvdW5jZVJlbmRlcicKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIHRydWUsIGVsZW1lbnRzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIERPTSBhbmQgZGlzY2FyZGVkIHdoZW4gYGlmYAogICAgICAgICAqIGJlY29tZXMgZmFsc2UgYW5kIHJlLWNyZWF0ZWQgYW5kIGFkZGVkIGJhY2sgdG8gdGhlIERPTSB3aGVuIGBpZmAKICAgICAgICAgKiBiZWNvbWVzIHRydWUuICBCeSBkZWZhdWx0LCBzdGFtcGVkIGVsZW1lbnRzIHdpbGwgYmUgaGlkZGVuIGJ1dCBsZWZ0CiAgICAgICAgICogaW4gdGhlIERPTSB3aGVuIGBpZmAgYmVjb21lcyBmYWxzZSwgd2hpY2ggaXMgZ2VuZXJhbGx5IHJlc3VsdHMKICAgICAgICAgKiBpbiBiZXR0ZXIgcGVyZm9ybWFuY2UuCiAgICAgICAgICovCiAgICAgICAgcmVzdGFtcDogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIG9ic2VydmVyOiAnX19kZWJvdW5jZVJlbmRlcicKICAgICAgICB9CgogICAgICB9OwoKICAgIH0KCiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IG51bGw7CiAgICAgIHRoaXMuX19pbnZhbGlkUHJvcHMgPSBudWxsOwogICAgICB0aGlzLl9faW5zdGFuY2UgPSBudWxsOwogICAgICB0aGlzLl9sYXN0SWYgPSBmYWxzZTsKICAgICAgdGhpcy5fX2N0b3IgPSBudWxsOwogICAgfQoKICAgIF9fZGVib3VuY2VSZW5kZXIoKSB7CiAgICAgIC8vIFJlbmRlciBpcyBhc3luYyBmb3IgMiByZWFzb25zOgogICAgICAvLyAxLiBUbyBlbGltaW5hdGUgZG9tIGNyZWF0aW9uIHRyYXNoaW5nIGlmIHVzZXIgY29kZSB0aHJhc2hlcyBgaWZgIGluIHRoZQogICAgICAvLyAgICBzYW1lIHR1cm4uIFRoaXMgd2FzIG1vcmUgY29tbW9uIGluIDEueCB3aGVyZSBhIGNvbXBvdW5kIGNvbXB1dGVkCiAgICAgIC8vICAgIHByb3BlcnR5IGNvdWxkIHJlc3VsdCBpbiB0aGUgcmVzdWx0IGNoYW5naW5nIG11bHRpcGxlIHRpbWVzLCBidXQgaXMKICAgICAgLy8gICAgbWl0aWdhdGVkIHRvIGEgbGFyZ2UgZXh0ZW50IGJ5IGJhdGNoZWQgcHJvcGVydHkgcHJvY2Vzc2luZyBpbiAyLnguCiAgICAgIC8vIDIuIFRvIGF2b2lkIGRvdWJsZSBvYmplY3QgcHJvcGFnYXRpb24gd2hlbiBhIGJhZyBpbmNsdWRpbmcgdmFsdWVzIGJvdW5kCiAgICAgIC8vICAgIHRvIHRoZSBgaWZgIHByb3BlcnR5IGFzIHdlbGwgYXMgb25lIG9yIG1vcmUgaG9zdFByb3BzIGNvdWxkIGVucXVldWUKICAgICAgLy8gICAgdGhlIDxkb20taWY+IHRvIGZsdXNoIGJlZm9yZSB0aGUgPHRlbXBsYXRlPidzIGhvc3QgcHJvcGVydHkKICAgICAgLy8gICAgZm9yd2FyZGluZy4gSW4gdGhhdCBzY2VuYXJpbyBjcmVhdGluZyBhbiBpbnN0YW5jZSB3b3VsZCByZXN1bHQgaW4KICAgICAgLy8gICAgdGhlIGhvc3QgcHJvcHMgYmVpbmcgc2V0IG9uY2UsIGFuZCB0aGVuIHRoZSBlbnF1ZXVlZCBjaGFuZ2VzIG9uIHRoZQogICAgICAvLyAgICB0ZW1wbGF0ZSB3b3VsZCBzZXQgcHJvcGVydGllcyBhIHNlY29uZCB0aW1lLCBwb3RlbnRpYWxseSBjYXVzaW5nIGFuCiAgICAgIC8vICAgIG9iamVjdCB0byBiZSBzZXQgdG8gYW4gaW5zdGFuY2UgbW9yZSB0aGFuIG9uY2UuICBDcmVhdGluZyB0aGUKICAgICAgLy8gICAgaW5zdGFuY2UgYXN5bmMgZnJvbSBmbHVzaGluZyBkYXRhIGVuc3VyZXMgdGhpcyBkb2Vzbid0IGhhcHBlbi4gSWYKICAgICAgLy8gICAgd2Ugd2FudGVkIGEgc3luYyBvcHRpb24gaW4gdGhlIGZ1dHVyZSwgc2ltcGx5IGhhdmluZyA8ZG9tLWlmPiBmbHVzaAogICAgICAvLyAgICAob3IgY2xlYXIpIGl0cyB0ZW1wbGF0ZSdzIHBlbmRpbmcgaG9zdCBwcm9wZXJ0aWVzIGJlZm9yZSBjcmVhdGluZwogICAgICAvLyAgICB0aGUgaW5zdGFuY2Ugd291bGQgYWxzbyBhdm9pZCB0aGUgcHJvYmxlbS4KICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgICB0aGlzLl9fcmVuZGVyRGVib3VuY2VyCiAgICAgICAgICAsIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAgICAsICgpID0+IHRoaXMuX19yZW5kZXIoKSk7CiAgICAgIFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcih0aGlzLl9fcmVuZGVyRGVib3VuY2VyKTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICBpZiAoIXRoaXMucGFyZW50Tm9kZSB8fAogICAgICAgICAgKHRoaXMucGFyZW50Tm9kZS5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgJiYKICAgICAgICAgICAhdGhpcy5wYXJlbnROb2RlLmhvc3QpKSB7CiAgICAgICAgdGhpcy5fX3RlYXJkb3duSW5zdGFuY2UoKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgaWYgKHRoaXMuaWYpIHsKICAgICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIoKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gTm9ybWFsbHkgcmVuZGVyaW5nIGlzCiAgICAgKiBhc3luY2hyb25vdXMgdG8gYSBwcm92b2tpbmcgY2hhbmdlLiBUaGlzIGlzIGRvbmUgZm9yIGVmZmljaWVuY3kgc28KICAgICAqIHRoYXQgbXVsdGlwbGUgY2hhbmdlcyB0cmlnZ2VyIG9ubHkgYSBzaW5nbGUgcmVuZGVyLiBUaGUgcmVuZGVyIG1ldGhvZAogICAgICogc2hvdWxkIGJlIGNhbGxlZCBpZiwgZm9yIGV4YW1wbGUsIHRlbXBsYXRlIHJlbmRlcmluZyBpcyByZXF1aXJlZCB0bwogICAgICogdmFsaWRhdGUgYXBwbGljYXRpb24gc3RhdGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZW5kZXIoKSB7CiAgICAgIFBvbHltZXIuZmx1c2goKTsKICAgIH0KCiAgICBfX3JlbmRlcigpIHsKICAgICAgaWYgKHRoaXMuaWYpIHsKICAgICAgICBpZiAoIXRoaXMuX19lbnN1cmVJbnN0YW5jZSgpKSB7CiAgICAgICAgICAvLyBObyB0ZW1wbGF0ZSBmb3VuZCB5ZXQKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5fc2hvd0hpZGVDaGlsZHJlbigpOwogICAgICB9IGVsc2UgaWYgKHRoaXMucmVzdGFtcCkgewogICAgICAgIHRoaXMuX190ZWFyZG93bkluc3RhbmNlKCk7CiAgICAgIH0KICAgICAgaWYgKCF0aGlzLnJlc3RhbXAgJiYgdGhpcy5fX2luc3RhbmNlKSB7CiAgICAgICAgdGhpcy5fc2hvd0hpZGVDaGlsZHJlbigpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmlmICE9IHRoaXMuX2xhc3RJZikgewogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgICAgdGhpcy5fbGFzdElmID0gdGhpcy5pZjsKICAgICAgfQogICAgfQoKICAgIF9fZW5zdXJlSW5zdGFuY2UoKSB7CiAgICAgIGxldCBwYXJlbnROb2RlID0gdGhpcy5wYXJlbnROb2RlOwogICAgICAvLyBHdWFyZCBhZ2FpbnN0IGVsZW1lbnQgYmVpbmcgZGV0YWNoZWQgd2hpbGUgcmVuZGVyIHdhcyBxdWV1ZWQKICAgICAgaWYgKHBhcmVudE5vZGUpIHsKICAgICAgICBpZiAoIXRoaXMuX19jdG9yKSB7CiAgICAgICAgICBsZXQgdGVtcGxhdGUgPSAvKiogQHR5cGUge0hUTUxUZW1wbGF0ZUVsZW1lbnR9ICovKHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKSk7CiAgICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgY2hpbGRMaXN0IGNoYW5nZXMgYW5kIHRlbXBsYXRlIHNob3VsZCBiZSB0aGVyZSBieSB0aGVuCiAgICAgICAgICAgIGxldCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKICAgICAgICAgICAgICBpZiAodGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKSB7CiAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9fcmVuZGVyKCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZG9tLWlmIHJlcXVpcmVzIGEgPHRlbXBsYXRlPiBjaGlsZCcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUodGhpcywge2NoaWxkTGlzdDogdHJ1ZX0pOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fY3RvciA9IFBvbHltZXIuVGVtcGxhdGl6ZS50ZW1wbGF0aXplKHRlbXBsYXRlLCB0aGlzLCB7CiAgICAgICAgICAgIC8vIGRvbS1pZiB0ZW1wbGF0aXplciBpbnN0YW5jZXMgcmVxdWlyZSBgbXV0YWJsZTogdHJ1ZWAsIGFzCiAgICAgICAgICAgIC8vIGBfX3N5bmNIb3N0UHJvcGVydGllc2AgcmVsaWVzIG9uIHRoYXQgYmVoYXZpb3IgdG8gc3luYyBvYmplY3RzCiAgICAgICAgICAgIG11dGFibGVEYXRhOiB0cnVlLAogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgdG8gZm9yd2FyZAogICAgICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIG9mIHByb3BlcnR5CiAgICAgICAgICAgICAqIEB0aGlzIHt0aGlzfQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZm9yd2FyZEhvc3RQcm9wOiBmdW5jdGlvbihwcm9wLCB2YWx1ZSkgewogICAgICAgICAgICAgIGlmICh0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlmKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuX19pbnN0YW5jZS5mb3J3YXJkSG9zdFByb3AocHJvcCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbnN0YW5jZSBidXQgYXJlIHNxdWVsY2hpbmcgaG9zdCBwcm9wZXJ0eQogICAgICAgICAgICAgICAgICAvLyBmb3J3YXJkaW5nIGR1ZSB0byBpZiBiZWluZyBmYWxzZSwgbm90ZSB0aGUgaW52YWxpZGF0ZWQKICAgICAgICAgICAgICAgICAgLy8gcHJvcGVydGllcyBzbyBgX19zeW5jSG9zdFByb3BlcnRpZXNgIGNhbiBzeW5jIHRoZW0gdGhlIG5leHQKICAgICAgICAgICAgICAgICAgLy8gdGltZSBgaWZgIGJlY29tZXMgdHJ1ZQogICAgICAgICAgICAgICAgICB0aGlzLl9faW52YWxpZFByb3BzID0gdGhpcy5fX2ludmFsaWRQcm9wcyB8fCBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICAgICAgICB0aGlzLl9faW52YWxpZFByb3BzW1BvbHltZXIuUGF0aC5yb290KHByb3ApXSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKCF0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG5ldyB0aGlzLl9fY3RvcigpOwogICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5fX2luc3RhbmNlLnJvb3QsIHRoaXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9fc3luY0hvc3RQcm9wZXJ0aWVzKCk7CiAgICAgICAgICBsZXQgYyQgPSB0aGlzLl9faW5zdGFuY2UuY2hpbGRyZW47CiAgICAgICAgICBpZiAoYyQgJiYgYyQubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIERldGVjdCBjYXNlIHdoZXJlIGRvbS1pZiB3YXMgcmUtYXR0YWNoZWQgaW4gbmV3IHBvc2l0aW9uCiAgICAgICAgICAgIGxldCBsYXN0Q2hpbGQgPSB0aGlzLnByZXZpb3VzU2libGluZzsKICAgICAgICAgICAgaWYgKGxhc3RDaGlsZCAhPT0gYyRbYyQubGVuZ3RoLTFdKSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBuOyAoaTxjJC5sZW5ndGgpICYmIChuPWMkW2ldKTsgaSsrKSB7CiAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShuLCB0aGlzKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgX19zeW5jSG9zdFByb3BlcnRpZXMoKSB7CiAgICAgIGxldCBwcm9wcyA9IHRoaXMuX19pbnZhbGlkUHJvcHM7CiAgICAgIGlmIChwcm9wcykgewogICAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICAgIHRoaXMuX19pbnN0YW5jZS5fc2V0UGVuZGluZ1Byb3BlcnR5KHByb3AsIHRoaXMuX19kYXRhSG9zdFtwcm9wXSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnZhbGlkUHJvcHMgPSBudWxsOwogICAgICAgIHRoaXMuX19pbnN0YW5jZS5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgIH0KICAgIH0KCiAgICBfX3RlYXJkb3duSW5zdGFuY2UoKSB7CiAgICAgIGlmICh0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICBsZXQgYyQgPSB0aGlzLl9faW5zdGFuY2UuY2hpbGRyZW47CiAgICAgICAgaWYgKGMkICYmIGMkLmxlbmd0aCkgewogICAgICAgICAgLy8gdXNlIGZpcnN0IGNoaWxkIHBhcmVudCwgZm9yIGNhc2Ugd2hlbiBkb20taWYgbWF5IGhhdmUgYmVlbiBkZXRhY2hlZAogICAgICAgICAgbGV0IHBhcmVudCA9IGMkWzBdLnBhcmVudE5vZGU7CiAgICAgICAgICAvLyBJbnN0YW5jZSBjaGlsZHJlbiBtYXkgYmUgZGlzY29ubmVjdGVkIGZyb20gcGFyZW50cyB3aGVuIGRvbS1pZgogICAgICAgICAgLy8gZGV0YWNoZXMgaWYgYSB0cmVlIHdhcyBpbm5lckhUTUwnZWQKICAgICAgICAgIGlmIChwYXJlbnQpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBuOyAoaTxjJC5sZW5ndGgpICYmIChuPWMkW2ldKTsgaSsrKSB7CiAgICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKG4pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG51bGw7CiAgICAgICAgdGhpcy5fX2ludmFsaWRQcm9wcyA9IG51bGw7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNob3dzIG9yIGhpZGVzIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSB0b3AgbGV2ZWwgY2hpbGQgZWxlbWVudHMuIEZvcgogICAgICogdGV4dCBub2RlcywgYHRleHRDb250ZW50YCBpcyByZW1vdmVkIHdoaWxlICJoaWRkZW4iIGFuZCByZXBsYWNlZCB3aGVuCiAgICAgKiAic2hvd24uIgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcm90ZWN0ZWQKICAgICAqLwogICAgX3Nob3dIaWRlQ2hpbGRyZW4oKSB7CiAgICAgIGxldCBoaWRkZW4gPSB0aGlzLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXyB8fCAhdGhpcy5pZjsKICAgICAgaWYgKHRoaXMuX19pbnN0YW5jZSkgewogICAgICAgIHRoaXMuX19pbnN0YW5jZS5fc2hvd0hpZGVDaGlsZHJlbihoaWRkZW4pOwogICAgICB9CiAgICB9CgogIH0KCiAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKERvbUlmLmlzLCBEb21JZik7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkRvbUlmID0gRG9tSWY7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIEVsZW1lbnQgbWl4aW4gZm9yIHJlY29yZGluZyBkeW5hbWljIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGl0ZW0gcGF0aHMgaW4gYQogICAqIG1hc3RlciBgaXRlbXNgIGFycmF5IGFuZCBhIGBzZWxlY3RlZGAgYXJyYXkgc3VjaCB0aGF0IHBhdGggY2hhbmdlcyB0byB0aGUKICAgKiBtYXN0ZXIgYXJyYXkgKGF0IHRoZSBob3N0KSBlbGVtZW50IG9yIGVsc2V3aGVyZSB2aWEgZGF0YS1iaW5kaW5nKSBhcmUKICAgKiBjb3JyZWN0bHkgcHJvcGFnYXRlZCB0byBpdGVtcyBpbiB0aGUgc2VsZWN0ZWQgYXJyYXkgYW5kIHZpY2UtdmVyc2EuCiAgICoKICAgKiBUaGUgYGl0ZW1zYCBwcm9wZXJ0eSBhY2NlcHRzIGFuIGFycmF5IG9mIHVzZXIgZGF0YSwgYW5kIHZpYSB0aGUKICAgKiBgc2VsZWN0KGl0ZW0pYCBhbmQgYGRlc2VsZWN0KGl0ZW0pYCBBUEksIHVwZGF0ZXMgdGhlIGBzZWxlY3RlZGAgcHJvcGVydHkKICAgKiB3aGljaCBtYXkgYmUgYm91bmQgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGFwcGxpY2F0aW9uLCBhbmQgYW55IGNoYW5nZXMgdG8KICAgKiBzdWItZmllbGRzIG9mIGBzZWxlY3RlZGAgaXRlbShzKSB3aWxsIGJlIGtlcHQgaW4gc3luYyB3aXRoIGl0ZW1zIGluIHRoZQogICAqIGBpdGVtc2AgYXJyYXkuICBXaGVuIGBtdWx0aWAgaXMgZmFsc2UsIGBzZWxlY3RlZGAgaXMgYSBwcm9wZXJ0eQogICAqIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLiAgV2hlbiBgbXVsdGlgIGlzIHRydWUsIGBzZWxlY3RlZGAKICAgKiBpcyBhbiBhcnJheSBvZiBtdWx0aXBseSBzZWxlY3RlZCBpdGVtcy4KICAgKgogICAqIEBwb2x5bWVyCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuRWxlbWVudE1peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IG1peGluIGZvciByZWNvcmRpbmcgZHluYW1pYyBhc3NvY2lhdGlvbnMgYmV0d2VlbiBpdGVtIHBhdGhzIGluIGEKICAgKiBtYXN0ZXIgYGl0ZW1zYCBhcnJheSBhbmQgYSBgc2VsZWN0ZWRgIGFycmF5CiAgICovCiAgbGV0IEFycmF5U2VsZWN0b3JNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9FbGVtZW50TWl4aW59CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBsZXQgZWxlbWVudEJhc2UgPSBQb2x5bWVyLkVsZW1lbnRNaXhpbihzdXBlckNsYXNzKTsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfQXJyYXlTZWxlY3Rvck1peGlufQogICAgICogQHVucmVzdHJpY3RlZAogICAgICovCiAgICBjbGFzcyBBcnJheVNlbGVjdG9yTWl4aW4gZXh0ZW5kcyBlbGVtZW50QmFzZSB7CgogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CgogICAgICAgIHJldHVybiB7CgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIGl0ZW1zIGZyb20gd2hpY2ggc2VsZWN0aW9uIHdpbGwgYmUgbWFkZS4KICAgICAgICAgICAqLwogICAgICAgICAgaXRlbXM6IHsKICAgICAgICAgICAgdHlwZTogQXJyYXksCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogV2hlbiBgdHJ1ZWAsIG11bHRpcGxlIGl0ZW1zIG1heSBiZSBzZWxlY3RlZCBhdCBvbmNlIChpbiB0aGlzIGNhc2UsCiAgICAgICAgICAgKiBgc2VsZWN0ZWRgIGlzIGFuIGFycmF5IG9mIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtcykuICBXaGVuIGBmYWxzZWAsCiAgICAgICAgICAgKiBvbmx5IG9uZSBpdGVtIG1heSBiZSBzZWxlY3RlZCBhdCBhIHRpbWUuCiAgICAgICAgICAgKi8KICAgICAgICAgIG11bHRpOiB7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICAgIH0sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBXaGVuIGBtdWx0aWAgaXMgdHJ1ZSwgdGhpcyBpcyBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIGFueSBzZWxlY3RlZC4KICAgICAgICAgICAqIFdoZW4gYG11bHRpYCBpcyBmYWxzZSwgdGhpcyBpcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0sIG9yIGBudWxsYAogICAgICAgICAgICogaWYgbm8gaXRlbSBpcyBzZWxlY3RlZC4KICAgICAgICAgICAqIEB0eXBlIHs/KE9iamVjdHxBcnJheTwhT2JqZWN0Pil9CiAgICAgICAgICAgKi8KICAgICAgICAgIHNlbGVjdGVkOiB7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogV2hlbiBgbXVsdGlgIGlzIGZhbHNlLCB0aGlzIGlzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSwgb3IgYG51bGxgCiAgICAgICAgICAgKiBpZiBubyBpdGVtIGlzIHNlbGVjdGVkLgogICAgICAgICAgICogQHR5cGUgez9PYmplY3R9CiAgICAgICAgICAgKi8KICAgICAgICAgIHNlbGVjdGVkSXRlbTogewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZQogICAgICAgICAgfSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFdoZW4gYHRydWVgLCBjYWxsaW5nIGBzZWxlY3RgIG9uIGFuIGl0ZW0gdGhhdCBpcyBhbHJlYWR5IHNlbGVjdGVkCiAgICAgICAgICAgKiB3aWxsIGRlc2VsZWN0IHRoZSBpdGVtLgogICAgICAgICAgICovCiAgICAgICAgICB0b2dnbGU6IHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgdmFsdWU6IGZhbHNlCiAgICAgICAgICB9CgogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICAgIHJldHVybiBbJ19fdXBkYXRlU2VsZWN0aW9uKG11bHRpLCBpdGVtcy4qKSddOwogICAgICB9CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX19sYXN0SXRlbXMgPSBudWxsOwogICAgICAgIHRoaXMuX19sYXN0TXVsdGkgPSBudWxsOwogICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcCA9IG51bGw7CiAgICAgIH0KCiAgICAgIF9fdXBkYXRlU2VsZWN0aW9uKG11bHRpLCBpdGVtc0luZm8pIHsKICAgICAgICBsZXQgcGF0aCA9IGl0ZW1zSW5mby5wYXRoOwogICAgICAgIGlmIChwYXRoID09ICdpdGVtcycpIHsKICAgICAgICAgIC8vIENhc2UgMSAtIGl0ZW1zIGFycmF5IGNoYW5nZWQsIHNvIGRpZmYgYWdhaW5zdCBwcmV2aW91cyBhcnJheSBhbmQKICAgICAgICAgIC8vIGRlc2VsZWN0IGFueSByZW1vdmVkIGl0ZW1zIGFuZCBhZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcwogICAgICAgICAgbGV0IG5ld0l0ZW1zID0gaXRlbXNJbmZvLmJhc2UgfHwgW107CiAgICAgICAgICBsZXQgbGFzdEl0ZW1zID0gdGhpcy5fX2xhc3RJdGVtczsKICAgICAgICAgIGxldCBsYXN0TXVsdGkgPSB0aGlzLl9fbGFzdE11bHRpOwogICAgICAgICAgaWYgKG11bHRpICE9PSBsYXN0TXVsdGkpIHsKICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGxhc3RJdGVtcykgewogICAgICAgICAgICBsZXQgc3BsaWNlcyA9IFBvbHltZXIuQXJyYXlTcGxpY2UuY2FsY3VsYXRlU3BsaWNlcyhuZXdJdGVtcywgbGFzdEl0ZW1zKTsKICAgICAgICAgICAgdGhpcy5fX2FwcGx5U3BsaWNlcyhzcGxpY2VzKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19sYXN0SXRlbXMgPSBuZXdJdGVtczsKICAgICAgICAgIHRoaXMuX19sYXN0TXVsdGkgPSBtdWx0aTsKICAgICAgICB9IGVsc2UgaWYgKGl0ZW1zSW5mby5wYXRoID09ICdpdGVtcy5zcGxpY2VzJykgewogICAgICAgICAgLy8gQ2FzZSAyIC0gZ290IHNwZWNpZmljIHNwbGljZSBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBhcnJheSBtdXRhdGlvbjoKICAgICAgICAgIC8vIGRlc2VsZWN0IGFueSByZW1vdmVkIGl0ZW1zIGFuZCBhZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcwogICAgICAgICAgdGhpcy5fX2FwcGx5U3BsaWNlcyhpdGVtc0luZm8udmFsdWUuaW5kZXhTcGxpY2VzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gQ2FzZSAzIC0gYW4gYXJyYXkgZWxlbWVudCB3YXMgY2hhbmdlZCwgc28gZGVzZWxlY3QgdGhlIHByZXZpb3VzCiAgICAgICAgICAvLyBpdGVtIGZvciB0aGF0IGluZGV4IGlmIGl0IHdhcyBwcmV2aW91c2x5IHNlbGVjdGVkCiAgICAgICAgICBsZXQgcGFydCA9IHBhdGguc2xpY2UoJ2l0ZW1zLicubGVuZ3RoKTsKICAgICAgICAgIGxldCBpZHggPSBwYXJzZUludChwYXJ0LCAxMCk7CiAgICAgICAgICBpZiAoKHBhcnQuaW5kZXhPZignLicpIDwgMCkgJiYgcGFydCA9PSBpZHgpIHsKICAgICAgICAgICAgdGhpcy5fX2Rlc2VsZWN0Q2hhbmdlZElkeChpZHgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgX19hcHBseVNwbGljZXMoc3BsaWNlcykgewogICAgICAgIGxldCBzZWxlY3RlZCA9IHRoaXMuX19zZWxlY3RlZE1hcDsKICAgICAgICAvLyBBZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcyBhbmQgbWFyayByZW1vdmFscwogICAgICAgIGZvciAobGV0IGk9MDsgaTxzcGxpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgcyA9IHNwbGljZXNbaV07CiAgICAgICAgICBzZWxlY3RlZC5mb3JFYWNoKChpZHgsIGl0ZW0pID0+IHsKICAgICAgICAgICAgaWYgKGlkeCA8IHMuaW5kZXgpIHsKICAgICAgICAgICAgICAvLyBubyBjaGFuZ2UKICAgICAgICAgICAgfSBlbHNlIGlmIChpZHggPj0gcy5pbmRleCArIHMucmVtb3ZlZC5sZW5ndGgpIHsKICAgICAgICAgICAgICAvLyBhZGp1c3QgaW5kZXgKICAgICAgICAgICAgICBzZWxlY3RlZC5zZXQoaXRlbSwgaWR4ICsgcy5hZGRlZENvdW50IC0gcy5yZW1vdmVkLmxlbmd0aCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gcmVtb3ZlIGluZGV4CiAgICAgICAgICAgICAgc2VsZWN0ZWQuc2V0KGl0ZW0sIC0xKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBmb3IgKGxldCBqPTA7IGo8cy5hZGRlZENvdW50OyBqKyspIHsKICAgICAgICAgICAgbGV0IGlkeCA9IHMuaW5kZXggKyBqOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQuaGFzKHRoaXMuaXRlbXNbaWR4XSkpIHsKICAgICAgICAgICAgICBzZWxlY3RlZC5zZXQodGhpcy5pdGVtc1tpZHhdLCBpZHgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFVwZGF0ZSBsaW5rZWQgcGF0aHMKICAgICAgICB0aGlzLl9fdXBkYXRlTGlua3MoKTsKICAgICAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgaXRlbXMgYXJyYXkKICAgICAgICBsZXQgc2lkeCA9IDA7CiAgICAgICAgc2VsZWN0ZWQuZm9yRWFjaCgoaWR4LCBpdGVtKSA9PiB7CiAgICAgICAgICBpZiAoaWR4IDwgMCkgewogICAgICAgICAgICBpZiAodGhpcy5tdWx0aSkgewogICAgICAgICAgICAgIHRoaXMuc3BsaWNlKCdzZWxlY3RlZCcsIHNpZHgsIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VsZWN0ZWQuZGVsZXRlKGl0ZW0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2lkeCsrOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICBfX3VwZGF0ZUxpbmtzKCkgewogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB7fTsKICAgICAgICBpZiAodGhpcy5tdWx0aSkgewogICAgICAgICAgbGV0IHNpZHggPSAwOwogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goaWR4ID0+IHsKICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5saW5rUGF0aHMoJ2l0ZW1zLicgKyBpZHgsICdzZWxlY3RlZC4nICsgc2lkeCsrKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5mb3JFYWNoKGlkeCA9PiB7CiAgICAgICAgICAgIHRoaXMubGlua1BhdGhzKCdzZWxlY3RlZCcsICdpdGVtcy4nICsgaWR4KTsKICAgICAgICAgICAgdGhpcy5saW5rUGF0aHMoJ3NlbGVjdGVkSXRlbScsICdpdGVtcy4nICsgaWR4KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENsZWFycyB0aGUgc2VsZWN0aW9uIHN0YXRlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2xlYXJTZWxlY3Rpb24oKSB7CiAgICAgICAgLy8gVW5iaW5kIHByZXZpb3VzIHNlbGVjdGlvbgogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB7fTsKICAgICAgICAvLyBUaGUgc2VsZWN0ZWQgbWFwIHN0b3JlcyAzIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjoKICAgICAgICAvLyBrZXk6IGl0ZW1zIGFycmF5IG9iamVjdAogICAgICAgIC8vIHZhbHVlOiBpdGVtcyBhcnJheSBpbmRleAogICAgICAgIC8vIG9yZGVyOiBzZWxlY3RlZCBhcnJheSBpbmRleAogICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAvLyBJbml0aWFsaXplIHNlbGVjdGlvbgogICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLm11bHRpID8gW10gOiBudWxsOwogICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgaXRlbSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byB0ZXN0CiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGl0ZW0gaXMgc2VsZWN0ZWQKICAgICAgICovCiAgICAgIGlzU2VsZWN0ZWQoaXRlbSkgewogICAgICAgIHJldHVybiB0aGlzLl9fc2VsZWN0ZWRNYXAuaGFzKGl0ZW0pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBpdGVtIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGlkeCBJbmRleCBmcm9tIGBpdGVtc2AgYXJyYXkgdG8gdGVzdAogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBpdGVtIGlzIHNlbGVjdGVkCiAgICAgICAqLwogICAgICBpc0luZGV4U2VsZWN0ZWQoaWR4KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZCh0aGlzLml0ZW1zW2lkeF0pOwogICAgICB9CgogICAgICBfX2Rlc2VsZWN0Q2hhbmdlZElkeChpZHgpIHsKICAgICAgICBsZXQgc2lkeCA9IHRoaXMuX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KGlkeCk7CiAgICAgICAgaWYgKHNpZHggPj0gMCkgewogICAgICAgICAgbGV0IGkgPSAwOwogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goKGlkeCwgaXRlbSkgPT4gewogICAgICAgICAgICBpZiAoc2lkeCA9PSBpKyspIHsKICAgICAgICAgICAgICB0aGlzLmRlc2VsZWN0KGl0ZW0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9fc2VsZWN0ZWRJbmRleEZvckl0ZW1JbmRleChpZHgpIHsKICAgICAgICBsZXQgc2VsZWN0ZWQgPSB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzWydpdGVtcy4nICsgaWR4XTsKICAgICAgICBpZiAoc2VsZWN0ZWQpIHsKICAgICAgICAgIHJldHVybiBwYXJzZUludChzZWxlY3RlZC5zbGljZSgnc2VsZWN0ZWQuJy5sZW5ndGgpLCAxMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRGVzZWxlY3RzIHRoZSBnaXZlbiBpdGVtIGlmIGl0IGlzIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byBkZXNlbGVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGVzZWxlY3QoaXRlbSkgewogICAgICAgIGxldCBpZHggPSB0aGlzLl9fc2VsZWN0ZWRNYXAuZ2V0KGl0ZW0pOwogICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmRlbGV0ZShpdGVtKTsKICAgICAgICAgIGxldCBzaWR4OwogICAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgICAgc2lkeCA9IHRoaXMuX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KGlkeCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fdXBkYXRlTGlua3MoKTsKICAgICAgICAgIGlmICh0aGlzLm11bHRpKSB7CiAgICAgICAgICAgIHRoaXMuc3BsaWNlKCdzZWxlY3RlZCcsIHNpZHgsIDEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBEZXNlbGVjdHMgdGhlIGdpdmVuIGluZGV4IGlmIGl0IGlzIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggSW5kZXggZnJvbSBgaXRlbXNgIGFycmF5IHRvIGRlc2VsZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBkZXNlbGVjdEluZGV4KGlkeCkgewogICAgICAgIHRoaXMuZGVzZWxlY3QodGhpcy5pdGVtc1tpZHhdKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlbGVjdHMgdGhlIGdpdmVuIGl0ZW0uICBXaGVuIGB0b2dnbGVgIGlzIHRydWUsIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgICAqIGRlc2VsZWN0IHRoZSBpdGVtIGlmIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byBzZWxlY3QKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHNlbGVjdChpdGVtKSB7CiAgICAgICAgdGhpcy5zZWxlY3RJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2VsZWN0cyB0aGUgZ2l2ZW4gaW5kZXguICBXaGVuIGB0b2dnbGVgIGlzIHRydWUsIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgICAqIGRlc2VsZWN0IHRoZSBpdGVtIGlmIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggSW5kZXggZnJvbSBgaXRlbXNgIGFycmF5IHRvIHNlbGVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgc2VsZWN0SW5kZXgoaWR4KSB7CiAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLml0ZW1zW2lkeF07CiAgICAgICAgaWYgKCF0aGlzLmlzU2VsZWN0ZWQoaXRlbSkpIHsKICAgICAgICAgIGlmICghdGhpcy5tdWx0aSkgewogICAgICAgICAgICB0aGlzLl9fc2VsZWN0ZWRNYXAuY2xlYXIoKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5zZXQoaXRlbSwgaWR4KTsKICAgICAgICAgIHRoaXMuX191cGRhdGVMaW5rcygpOwogICAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgICAgdGhpcy5wdXNoKCdzZWxlY3RlZCcsIGl0ZW0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRoaXMudG9nZ2xlKSB7CiAgICAgICAgICB0aGlzLmRlc2VsZWN0SW5kZXgoaWR4KTsKICAgICAgICB9CiAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIEFycmF5U2VsZWN0b3JNaXhpbjsKCiAgfSk7CgogIC8vIGV4cG9ydCBtaXhpbgogIFBvbHltZXIuQXJyYXlTZWxlY3Rvck1peGluID0gQXJyYXlTZWxlY3Rvck1peGluOwoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKiBAZXh0ZW5kcyB7UG9seW1lci5FbGVtZW50fQogICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0FycmF5U2VsZWN0b3JNaXhpbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGxldCBiYXNlQXJyYXlTZWxlY3RvciA9IEFycmF5U2VsZWN0b3JNaXhpbihQb2x5bWVyLkVsZW1lbnQpOwoKICAvKioKICAgKiBFbGVtZW50IGltcGxlbWVudGluZyB0aGUgYFBvbHltZXIuQXJyYXlTZWxlY3RvcmAgbWl4aW4sIHdoaWNoIHJlY29yZHMKICAgKiBkeW5hbWljIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGl0ZW0gcGF0aHMgaW4gYSBtYXN0ZXIgYGl0ZW1zYCBhcnJheSBhbmQgYQogICAqIGBzZWxlY3RlZGAgYXJyYXkgc3VjaCB0aGF0IHBhdGggY2hhbmdlcyB0byB0aGUgbWFzdGVyIGFycmF5IChhdCB0aGUgaG9zdCkKICAgKiBlbGVtZW50IG9yIGVsc2V3aGVyZSB2aWEgZGF0YS1iaW5kaW5nKSBhcmUgY29ycmVjdGx5IHByb3BhZ2F0ZWQgdG8gaXRlbXMKICAgKiBpbiB0aGUgc2VsZWN0ZWQgYXJyYXkgYW5kIHZpY2UtdmVyc2EuCiAgICoKICAgKiBUaGUgYGl0ZW1zYCBwcm9wZXJ0eSBhY2NlcHRzIGFuIGFycmF5IG9mIHVzZXIgZGF0YSwgYW5kIHZpYSB0aGUKICAgKiBgc2VsZWN0KGl0ZW0pYCBhbmQgYGRlc2VsZWN0KGl0ZW0pYCBBUEksIHVwZGF0ZXMgdGhlIGBzZWxlY3RlZGAgcHJvcGVydHkKICAgKiB3aGljaCBtYXkgYmUgYm91bmQgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGFwcGxpY2F0aW9uLCBhbmQgYW55IGNoYW5nZXMgdG8KICAgKiBzdWItZmllbGRzIG9mIGBzZWxlY3RlZGAgaXRlbShzKSB3aWxsIGJlIGtlcHQgaW4gc3luYyB3aXRoIGl0ZW1zIGluIHRoZQogICAqIGBpdGVtc2AgYXJyYXkuICBXaGVuIGBtdWx0aWAgaXMgZmFsc2UsIGBzZWxlY3RlZGAgaXMgYSBwcm9wZXJ0eQogICAqIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLiAgV2hlbiBgbXVsdGlgIGlzIHRydWUsIGBzZWxlY3RlZGAKICAgKiBpcyBhbiBhcnJheSBvZiBtdWx0aXBseSBzZWxlY3RlZCBpdGVtcy4KICAgKgogICAqIEV4YW1wbGU6CiAgICoKICAgKiBgYGBodG1sCiAgICogPGRvbS1tb2R1bGUgaWQ9ImVtcGxveWVlLWxpc3QiPgogICAqCiAgICogICA8dGVtcGxhdGU+CiAgICoKICAgKiAgICAgPGRpdj4gRW1wbG95ZWUgbGlzdDogPC9kaXY+CiAgICogICAgIDxkb20tcmVwZWF0IGlkPSJlbXBsb3llZUxpc3QiIGl0ZW1zPSJ7e2VtcGxveWVlc319Ij4KICAgKiAgICAgICA8dGVtcGxhdGU+CiAgICogICAgICAgICA8ZGl2PkZpcnN0IG5hbWU6IDxzcGFuPnt7aXRlbS5maXJzdH19PC9zcGFuPjwvZGl2PgogICAqICAgICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICAgICAgPGJ1dHRvbiBvbi1jbGljaz0idG9nZ2xlU2VsZWN0aW9uIj5TZWxlY3Q8L2J1dHRvbj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgICAgPGFycmF5LXNlbGVjdG9yIGlkPSJzZWxlY3RvciIgaXRlbXM9Int7ZW1wbG95ZWVzfX0iIHNlbGVjdGVkPSJ7e3NlbGVjdGVkfX0iIG11bHRpIHRvZ2dsZT48L2FycmF5LXNlbGVjdG9yPgogICAqCiAgICogICAgIDxkaXY+IFNlbGVjdGVkIGVtcGxveWVlczogPC9kaXY+CiAgICogICAgIDxkb20tcmVwZWF0IGl0ZW1zPSJ7e3NlbGVjdGVkfX0iPgogICAqICAgICAgIDx0ZW1wbGF0ZT4KICAgKiAgICAgICAgIDxkaXY+Rmlyc3QgbmFtZTogPHNwYW4+e3tpdGVtLmZpcnN0fX08L3NwYW4+PC9kaXY+CiAgICogICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgIDwvdGVtcGxhdGU+CiAgICoKICAgKiA8L2RvbS1tb2R1bGU+CiAgICogYGBgCiAgICoKICAgKiBgYGBqcwogICAqY2xhc3MgRW1wbG95ZWVMaXN0IGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgc3RhdGljIGdldCBpcygpIHsgcmV0dXJuICdlbXBsb3llZS1saXN0JzsgfQogICAqICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICogICAgcmV0dXJuIHsKICAgKiAgICAgIGVtcGxveWVlczogewogICAqICAgICAgICB2YWx1ZSgpIHsKICAgKiAgICAgICAgICByZXR1cm4gWwogICAqICAgICAgICAgICAge2ZpcnN0OiAnQm9iJywgbGFzdDogJ1NtaXRoJ30sCiAgICogICAgICAgICAgICB7Zmlyc3Q6ICdTYWxseScsIGxhc3Q6ICdKb2huc29uJ30sCiAgICogICAgICAgICAgICAuLi4KICAgKiAgICAgICAgICBdOwogICAqICAgICAgICB9CiAgICogICAgICB9CiAgICogICAgfTsKICAgKiAgfQogICAqICB0b2dnbGVTZWxlY3Rpb24oZSkgewogICAqICAgIGxldCBpdGVtID0gdGhpcy4kLmVtcGxveWVlTGlzdC5pdGVtRm9yRWxlbWVudChlLnRhcmdldCk7CiAgICogICAgdGhpcy4kLnNlbGVjdG9yLnNlbGVjdChpdGVtKTsKICAgKiAgfQogICAqfQogICAqIGBgYAogICAqCiAgICogQHBvbHltZXIKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIHtiYXNlQXJyYXlTZWxlY3Rvcn0KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuQXJyYXlTZWxlY3Rvck1peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0aGF0IGxpbmtzIHBhdGhzIGJldHdlZW4gYW4gaW5wdXQgYGl0ZW1zYCBhcnJheSBhbmQKICAgKiAgIGFuIG91dHB1dCBgc2VsZWN0ZWRgIGl0ZW0gb3IgYXJyYXkgYmFzZWQgb24gY2FsbHMgdG8gaXRzIHNlbGVjdGlvbiBBUEkuCiAgICovCiAgY2xhc3MgQXJyYXlTZWxlY3RvciBleHRlbmRzIGJhc2VBcnJheVNlbGVjdG9yIHsKICAgIC8vIE5vdCBuZWVkZWQgdG8gZmluZCB0ZW1wbGF0ZTsgY2FuIGJlIHJlbW92ZWQgb25jZSB0aGUgYW5hbHl6ZXIKICAgIC8vIGNhbiBmaW5kIHRoZSB0YWcgbmFtZSBmcm9tIGN1c3RvbUVsZW1lbnRzLmRlZmluZSBjYWxsCiAgICBzdGF0aWMgZ2V0IGlzKCkgeyByZXR1cm4gJ2FycmF5LXNlbGVjdG9yJzsgfQogIH0KICBjdXN0b21FbGVtZW50cy5kZWZpbmUoQXJyYXlTZWxlY3Rvci5pcywgQXJyYXlTZWxlY3Rvcik7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkFycmF5U2VsZWN0b3IgPSBBcnJheVNlbGVjdG9yOwoKfSkoKTsKCgooZnVuY3Rpb24oKXsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KJ3VzZSBzdHJpY3QnO3ZhciBjPW51bGwsZj13aW5kb3cuSFRNTEltcG9ydHMmJndpbmRvdy5IVE1MSW1wb3J0cy53aGVuUmVhZHl8fG51bGwsZztmdW5jdGlvbiBoKGEpe3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2Y/ZihhKTooY3x8KGM9bmV3IFByb21pc2UoZnVuY3Rpb24oYSl7Zz1hfSksImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGU/ZygpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGZ1bmN0aW9uKCl7ImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGUmJmcoKX0pKSxjLnRoZW4oZnVuY3Rpb24oKXthJiZhKCl9KSl9KX07dmFyIGs9bnVsbCxsPW51bGw7ZnVuY3Rpb24gbSgpe3RoaXMuY3VzdG9tU3R5bGVzPVtdO3RoaXMuZW5xdWV1ZWQ9ITE7aChmdW5jdGlvbigpe3dpbmRvdy5TaGFkeUNTUy5mbHVzaEN1c3RvbVN0eWxlcyYmd2luZG93LlNoYWR5Q1NTLmZsdXNoQ3VzdG9tU3R5bGVzKCl9KX1mdW5jdGlvbiBuKGEpeyFhLmVucXVldWVkJiZsJiYoYS5lbnF1ZXVlZD0hMCxoKGwpKX1tLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe2EuX19zZWVuQnlTaGFkeUNTU3x8KGEuX19zZWVuQnlTaGFkeUNTUz0hMCx0aGlzLmN1c3RvbVN0eWxlcy5wdXNoKGEpLG4odGhpcykpfTttLnByb3RvdHlwZS5iPWZ1bmN0aW9uKGEpe2lmKGEuX19zaGFkeUNTU0NhY2hlZFN0eWxlKXJldHVybiBhLl9fc2hhZHlDU1NDYWNoZWRTdHlsZTt2YXIgYjthLmdldFN0eWxlP2I9YS5nZXRTdHlsZSgpOmI9YTtyZXR1cm4gYn07Cm0ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5jdXN0b21TdHlsZXMsYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdO2lmKCFkLl9fc2hhZHlDU1NDYWNoZWRTdHlsZSl7dmFyIGU9dGhpcy5iKGQpO2UmJihlPWUuX19hcHBsaWVkRWxlbWVudHx8ZSxrJiZrKGUpLGQuX19zaGFkeUNTU0NhY2hlZFN0eWxlPWUpfX1yZXR1cm4gYX07bS5wcm90b3R5cGUuYWRkQ3VzdG9tU3R5bGU9bS5wcm90b3R5cGUuYzttLnByb3RvdHlwZS5nZXRTdHlsZUZvckN1c3RvbVN0eWxlPW0ucHJvdG90eXBlLmI7bS5wcm90b3R5cGUucHJvY2Vzc1N0eWxlcz1tLnByb3RvdHlwZS5hOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyhtLnByb3RvdHlwZSx7dHJhbnNmb3JtQ2FsbGJhY2s6e2dldDpmdW5jdGlvbigpe3JldHVybiBrfSxzZXQ6ZnVuY3Rpb24oYSl7az1hfX0sdmFsaWRhdGVDYWxsYmFjazp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGx9LHNldDpmdW5jdGlvbihhKXt2YXIgYj0hMTtsfHwoYj0hMCk7bD1hO2ImJm4odGhpcyl9fX0pO2Z1bmN0aW9uIHAoYSxiKXtmb3IodmFyIGQgaW4gYiludWxsPT09ZD9hLnN0eWxlLnJlbW92ZVByb3BlcnR5KGQpOmEuc3R5bGUuc2V0UHJvcGVydHkoZCxiW2RdKX07dmFyIHE9ISh3aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS5pblVzZSkscjtmdW5jdGlvbiB0KGEpe3I9YSYmYS5zaGltY3NzcHJvcGVydGllcz8hMTpxfHwhKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FwcGxlV2ViS2l0XC82MDF8RWRnZVwvMTUvKXx8IXdpbmRvdy5DU1N8fCFDU1Muc3VwcG9ydHN8fCFDU1Muc3VwcG9ydHMoImJveC1zaGFkb3ciLCIwIDAgMCB2YXIoLS1mb28pIikpfXZhciB1O3dpbmRvdy5TaGFkeUNTUyYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkJiYodT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQpO3ZhciB2PSEoIXdpbmRvdy5TaGFkeUNTU3x8IXdpbmRvdy5TaGFkeUNTUy5kaXNhYmxlUnVudGltZSk7CndpbmRvdy5TaGFkeUNTUyYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzcz9yPXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M6d2luZG93LlNoYWR5Q1NTPyh0KHdpbmRvdy5TaGFkeUNTUyksd2luZG93LlNoYWR5Q1NTPXZvaWQgMCk6dCh3aW5kb3cuV2ViQ29tcG9uZW50cyYmd2luZG93LldlYkNvbXBvbmVudHMuZmxhZ3MpO3ZhciB3PXIseD11O3ZhciB5PW5ldyBtO3dpbmRvdy5TaGFkeUNTU3x8KHdpbmRvdy5TaGFkeUNTUz17cHJlcGFyZVRlbXBsYXRlOmZ1bmN0aW9uKCl7fSxwcmVwYXJlVGVtcGxhdGVEb206ZnVuY3Rpb24oKXt9LHByZXBhcmVUZW1wbGF0ZVN0eWxlczpmdW5jdGlvbigpe30sc3R5bGVTdWJ0cmVlOmZ1bmN0aW9uKGEsYil7eS5hKCk7cChhLGIpfSxzdHlsZUVsZW1lbnQ6ZnVuY3Rpb24oKXt5LmEoKX0sc3R5bGVEb2N1bWVudDpmdW5jdGlvbihhKXt5LmEoKTtwKGRvY3VtZW50LmJvZHksYSl9LGdldENvbXB1dGVkU3R5bGVWYWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybihhPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLmdldFByb3BlcnR5VmFsdWUoYikpP2EudHJpbSgpOiIifSxmbHVzaEN1c3RvbVN0eWxlczpmdW5jdGlvbigpe30sbmF0aXZlQ3NzOncsbmF0aXZlU2hhZG93OnEsY3NzQnVpbGQ6eCxkaXNhYmxlUnVudGltZTp2fSk7d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlPXk7fSkuY2FsbCh0aGlzKTsKCgoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGNvbnN0IGF0dHIgPSAnaW5jbHVkZSc7CgogIGNvbnN0IEN1c3RvbVN0eWxlSW50ZXJmYWNlID0gd2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlOwoKICAvKioKICAgKiBDdXN0b20gZWxlbWVudCBmb3IgZGVmaW5pbmcgc3R5bGVzIGluIHRoZSBtYWluIGRvY3VtZW50IHRoYXQgY2FuIHRha2UKICAgKiBhZHZhbnRhZ2Ugb2YgW3NoYWR5IERPTV0oaHR0cHM6Ly9naXRodWIuY29tL3dlYmNvbXBvbmVudHMvc2hhZHljc3MpIHNoaW1zCiAgICogZm9yIHN0eWxlIGVuY2Fwc3VsYXRpb24sIGN1c3RvbSBwcm9wZXJ0aWVzLCBhbmQgY3VzdG9tIG1peGlucy4KICAgKgogICAqIC0gRG9jdW1lbnQgc3R5bGVzIGRlZmluZWQgaW4gYSBgPGN1c3RvbS1zdHlsZT5gIGFyZSBzaGltbWVkIHRvIGVuc3VyZSB0aGV5CiAgICogICBkbyBub3QgbGVhayBpbnRvIGxvY2FsIERPTSB3aGVuIHJ1bm5pbmcgb24gYnJvd3NlcnMgd2l0aG91dCBuYXRpdmUKICAgKiAgIFNoYWRvdyBET00uCiAgICogLSBDdXN0b20gcHJvcGVydGllcyBjYW4gYmUgZGVmaW5lZCBpbiBhIGA8Y3VzdG9tLXN0eWxlPmAuIFVzZSB0aGUgYGh0bWxgIHNlbGVjdG9yCiAgICogICB0byBkZWZpbmUgY3VzdG9tIHByb3BlcnRpZXMgdGhhdCBhcHBseSB0byBhbGwgY3VzdG9tIGVsZW1lbnRzLgogICAqIC0gQ3VzdG9tIG1peGlucyBjYW4gYmUgZGVmaW5lZCBpbiBhIGA8Y3VzdG9tLXN0eWxlPmAsIGlmIHlvdSBpbXBvcnQgdGhlIG9wdGlvbmFsCiAgICogICBbYXBwbHkgc2hpbV0oaHR0cHM6Ly9naXRodWIuY29tL3dlYmNvbXBvbmVudHMvc2hhZHljc3MjYWJvdXQtYXBwbHlzaGltKQogICAqICAgKGBzaGFkeWNzcy9hcHBseS1zaGltLmh0bWxgKS4KICAgKgogICAqIFRvIHVzZToKICAgKgogICAqIC0gSW1wb3J0IGBjdXN0b20tc3R5bGUuaHRtbGAuCiAgICogLSBQbGFjZSBhIGA8Y3VzdG9tLXN0eWxlPmAgZWxlbWVudCBpbiB0aGUgbWFpbiBkb2N1bWVudCwgd3JhcHBpbmcgYW4gaW5saW5lIGA8c3R5bGU+YCB0YWcgdGhhdAogICAqICAgY29udGFpbnMgdGhlIENTUyBydWxlcyB5b3Ugd2FudCB0byBzaGltLgogICAqCiAgICogRm9yIGV4YW1wbGU6CiAgICoKICAgKiBgYGBodG1sCiAgICogPCEtLSBpbXBvcnQgYXBwbHkgc2hpbS0tb25seSByZXF1aXJlZCBpZiB1c2luZyBtaXhpbnMgLS0+CiAgICogPGxpbmsgcmVsPSJpbXBvcnQiIGhyZWY9ImJvd2VyX2NvbXBvbmVudHMvc2hhZHljc3MvYXBwbHktc2hpbS5odG1sIj4KICAgKiA8IS0tIGltcG9ydCBjdXN0b20tc3R5bGUgZWxlbWVudCAtLT4KICAgKiA8bGluayByZWw9ImltcG9ydCIgaHJlZj0iYm93ZXJfY29tcG9uZW50cy9wb2x5bWVyL2xpYi9lbGVtZW50cy9jdXN0b20tc3R5bGUuaHRtbCI+CiAgICoKICAgKiA8Y3VzdG9tLXN0eWxlPgogICAqICAgPHN0eWxlPgogICAqICAgICBodG1sIHsKICAgKiAgICAgICAtLWN1c3RvbS1jb2xvcjogYmx1ZTsKICAgKiAgICAgICAtLWN1c3RvbS1taXhpbjogewogICAqICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICogICAgICAgICBjb2xvcjogcmVkOwogICAqICAgICAgIH07CiAgICogICAgIH0KICAgKiAgIDwvc3R5bGU+CiAgICogPC9jdXN0b20tc3R5bGU+CiAgICogYGBgCiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIEhUTUxFbGVtZW50CiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCBmb3IgZGVmaW5pbmcgc3R5bGVzIGluIHRoZSBtYWluIGRvY3VtZW50IHRoYXQgY2FuCiAgICogICB0YWtlIGFkdmFudGFnZSBvZiBQb2x5bWVyJ3Mgc3R5bGUgc2NvcGluZyBhbmQgY3VzdG9tIHByb3BlcnRpZXMgc2hpbXMuCiAgICovCiAgY2xhc3MgQ3VzdG9tU3R5bGUgZXh0ZW5kcyBIVE1MRWxlbWVudCB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5fc3R5bGUgPSBudWxsOwogICAgICBDdXN0b21TdHlsZUludGVyZmFjZS5hZGRDdXN0b21TdHlsZSh0aGlzKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbGlnaHQtRE9NIGA8c3R5bGU+YCBjaGlsZCB0aGlzIGVsZW1lbnQgd3JhcHMuICBVcG9uIGZpcnN0CiAgICAgKiBjYWxsIGFueSBzdHlsZSBtb2R1bGVzIHJlZmVyZW5jZWQgdmlhIHRoZSBgaW5jbHVkZWAgYXR0cmlidXRlIHdpbGwgYmUKICAgICAqIGNvbmNhdGVuYXRlZCB0byB0aGlzIGVsZW1lbnQncyBgPHN0eWxlPmAuCiAgICAgKgogICAgICogQHJldHVybiB7SFRNTFN0eWxlRWxlbWVudH0gVGhpcyBlbGVtZW50J3MgbGlnaHQtRE9NIGA8c3R5bGU+YAogICAgICovCiAgICBnZXRTdHlsZSgpIHsKICAgICAgaWYgKHRoaXMuX3N0eWxlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlOwogICAgICB9CiAgICAgIGNvbnN0IHN0eWxlID0gLyoqIEB0eXBlIHtIVE1MU3R5bGVFbGVtZW50fSAqLyh0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlJykpOwogICAgICBpZiAoIXN0eWxlKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgdGhpcy5fc3R5bGUgPSBzdHlsZTsKICAgICAgY29uc3QgaW5jbHVkZSA9IHN0eWxlLmdldEF0dHJpYnV0ZShhdHRyKTsKICAgICAgaWYgKGluY2x1ZGUpIHsKICAgICAgICBzdHlsZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7CiAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSBQb2x5bWVyLlN0eWxlR2F0aGVyLmNzc0Zyb21Nb2R1bGVzKGluY2x1ZGUpICsgc3R5bGUudGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgLyoKICAgICAgSFRNTCBJbXBvcnRzIHN0eWxpbmcgdGhlIG1haW4gZG9jdW1lbnQgYXJlIGRlcHJlY2F0ZWQgaW4gQ2hyb21lCiAgICAgIGh0dHBzOi8vY3JidWcuY29tLzUyMzk1MgoKICAgICAgSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBpbiB0aGUgbWFpbiBkb2N1bWVudCwgdGhlbiBpdCBtdXN0IGJlIGluIGFuIEhUTUwgSW1wb3J0IGRvY3VtZW50LgogICAgICBJbiB0aGF0IGNhc2UsIG1vdmUgdGhlIGN1c3RvbSBzdHlsZSB0byB0aGUgbWFpbiBkb2N1bWVudC4KCiAgICAgIFRoZSBvcmRlcmluZyBvZiBgPGN1c3RvbS1zdHlsZT5gIHNob3VsZCBzdGF5IHRoZSBzYW1lIGFzIHdoZW4gbG9hZGVkIGJ5IEhUTUwgSW1wb3J0cywgYnV0IHRoZXJlIG1heSBiZSBvZGQKICAgICAgY2FzZXMgb2Ygb3JkZXJpbmcgdy5yLnQgdGhlIG1haW4gZG9jdW1lbnQgc3R5bGVzLgogICAgICAqLwogICAgICBpZiAodGhpcy5vd25lckRvY3VtZW50ICE9PSB3aW5kb3cuZG9jdW1lbnQpIHsKICAgICAgICB3aW5kb3cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0aGlzKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5fc3R5bGU7CiAgICB9CiAgfQoKICB3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdjdXN0b20tc3R5bGUnLCBDdXN0b21TdHlsZSk7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkN1c3RvbVN0eWxlID0gQ3VzdG9tU3R5bGU7Cn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IG11dGFibGVQcm9wZXJ0eUNoYW5nZTsKICAvKiogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gKi8KICAoKCkgPT4gewogICAgbXV0YWJsZVByb3BlcnR5Q2hhbmdlID0gUG9seW1lci5NdXRhYmxlRGF0YS5fbXV0YWJsZVByb3BlcnR5Q2hhbmdlOwogIH0pKCk7CgogIC8qKgogICAqIExlZ2FjeSBlbGVtZW50IGJlaGF2aW9yIHRvIHNraXAgc3RyaWN0IGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZCBhcnJheXMsCiAgICogKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpIGZvciB1c2Ugb24gbGVnYWN5IEFQSSBQb2x5bWVyIGVsZW1lbnRzLgogICAqCiAgICogQnkgZGVmYXVsdCwgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCBwZXJmb3JtcyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgb24KICAgKiBvYmplY3RzLCB3aGljaCBtZWFucyB0aGF0IGFueSBkZWVwIG1vZGlmaWNhdGlvbnMgdG8gYW4gb2JqZWN0IG9yIGFycmF5IHdpbGwKICAgKiBub3QgYmUgcHJvcGFnYXRlZCB1bmxlc3MgImltbXV0YWJsZSIgZGF0YSBwYXR0ZXJucyBhcmUgdXNlZCAoaS5lLiBhbGwgb2JqZWN0CiAgICogcmVmZXJlbmNlcyBmcm9tIHRoZSByb290IHRvIHRoZSBtdXRhdGlvbiB3ZXJlIGNoYW5nZWQpLgogICAqCiAgICogUG9seW1lciBhbHNvIHByb3ZpZGVzIGEgcHJvcHJpZXRhcnkgZGF0YSBtdXRhdGlvbiBhbmQgcGF0aCBub3RpZmljYXRpb24gQVBJCiAgICogKGUuZy4gYG5vdGlmeVBhdGhgLCBgc2V0YCwgYW5kIGFycmF5IG11dGF0aW9uIEFQSSdzKSB0aGF0IGFsbG93IGVmZmljaWVudAogICAqIG11dGF0aW9uIGFuZCBub3RpZmljYXRpb24gb2YgZGVlcCBjaGFuZ2VzIGluIGFuIG9iamVjdCBncmFwaCB0byBhbGwgZWxlbWVudHMKICAgKiBib3VuZCB0byB0aGUgc2FtZSBvYmplY3QgZ3JhcGguCiAgICoKICAgKiBJbiBjYXNlcyB3aGVyZSBuZWl0aGVyIGltbXV0YWJsZSBwYXR0ZXJucyBub3IgdGhlIGRhdGEgbXV0YXRpb24gQVBJIGNhbiBiZQogICAqIHVzZWQsIGFwcGx5aW5nIHRoaXMgbWl4aW4gd2lsbCBjYXVzZSBQb2x5bWVyIHRvIHNraXAgZGlydHkgY2hlY2tpbmcgZm9yCiAgICogb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZSAiZGlydHkiKS4gIFRoaXMgYWxsb3dzIGEKICAgKiB1c2VyIHRvIG1ha2UgYSBkZWVwIG1vZGlmaWNhdGlvbiB0byBhIGJvdW5kIG9iamVjdCBncmFwaCwgYW5kIHRoZW4gZWl0aGVyCiAgICogc2ltcGx5IHJlLXNldCB0aGUgb2JqZWN0IChlLmcuIGB0aGlzLml0ZW1zID0gdGhpcy5pdGVtc2ApIG9yIGNhbGwgYG5vdGlmeVBhdGhgCiAgICogKGUuZy4gYHRoaXMubm90aWZ5UGF0aCgnaXRlbXMnKWApIHRvIHVwZGF0ZSB0aGUgdHJlZS4gIE5vdGUgdGhhdCBhbGwKICAgKiBlbGVtZW50cyB0aGF0IHdpc2ggdG8gYmUgdXBkYXRlZCBiYXNlZCBvbiBkZWVwIG11dGF0aW9ucyBtdXN0IGFwcGx5IHRoaXMKICAgKiBtaXhpbiBvciBvdGhlcndpc2Ugc2tpcCBzdHJpY3QgZGlydHkgY2hlY2tpbmcgZm9yIG9iamVjdHMvYXJyYXlzLgogICAqIFNwZWNpZmljYWxseSwgYW55IGVsZW1lbnRzIGluIHRoZSBiaW5kaW5nIHRyZWUgYmV0d2VlbiB0aGUgc291cmNlIG9mIGEKICAgKiBtdXRhdGlvbiBhbmQgdGhlIGNvbnN1bXB0aW9uIG9mIGl0IG11c3QgYXBwbHkgdGhpcyBiZWhhdmlvciBvciBlbmFibGUgdGhlCiAgICogYFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yYC4KICAgKgogICAqIEluIG9yZGVyIHRvIG1ha2UgdGhlIGRpcnR5IGNoZWNrIHN0cmF0ZWd5IGNvbmZpZ3VyYWJsZSwgc2VlCiAgICogYFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yYC4KICAgKgogICAqIE5vdGUsIHRoZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcHJvcGFnYXRpbmcgbGFyZ2Ugb2JqZWN0IGdyYXBocwogICAqIHdpbGwgYmUgd29yc2UgYXMgb3Bwb3NlZCB0byB1c2luZyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgd2l0aCBpbW11dGFibGUKICAgKiBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24gQVBJLgogICAqCiAgICogQHBvbHltZXJCZWhhdmlvcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgQmVoYXZpb3IgdG8gc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kCiAgICogICBhcnJheXMKICAgKi8KICBQb2x5bWVyLk11dGFibGVEYXRhQmVoYXZpb3IgPSB7CgogICAgLyoqCiAgICAgKiBPdmVycmlkZXMgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCB0byBwcm92aWRlIG9wdGlvbiBmb3Igc2tpcHBpbmcKICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIHB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYAogICAgICogY2FjaGUgKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAqIGNhY2hlIGlzIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHR1cm4sIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzCiAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAqIGN5Y2xlcyBkdWUgdG8gMi13YXkgbm90aWZpY2F0aW9uKS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgcmV0dXJuIG11dGFibGVQcm9wZXJ0eUNoYW5nZSh0aGlzLCBwcm9wZXJ0eSwgdmFsdWUsIG9sZCwgdHJ1ZSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogTGVnYWN5IGVsZW1lbnQgYmVoYXZpb3IgdG8gYWRkIHRoZSBvcHRpb25hbCBhYmlsaXR5IHRvIHNraXAgc3RyaWN0CiAgICogZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUKICAgKiAiZGlydHkiKSBieSBzZXR0aW5nIGEgYG11dGFibGUtZGF0YWAgYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgaW5zdGFuY2UuCiAgICoKICAgKiBCeSBkZWZhdWx0LCBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHBlcmZvcm1zIHN0cmljdCBkaXJ0eSBjaGVja2luZyBvbgogICAqIG9iamVjdHMsIHdoaWNoIG1lYW5zIHRoYXQgYW55IGRlZXAgbW9kaWZpY2F0aW9ucyB0byBhbiBvYmplY3Qgb3IgYXJyYXkgd2lsbAogICAqIG5vdCBiZSBwcm9wYWdhdGVkIHVubGVzcyAiaW1tdXRhYmxlIiBkYXRhIHBhdHRlcm5zIGFyZSB1c2VkIChpLmUuIGFsbCBvYmplY3QKICAgKiByZWZlcmVuY2VzIGZyb20gdGhlIHJvb3QgdG8gdGhlIG11dGF0aW9uIHdlcmUgY2hhbmdlZCkuCiAgICoKICAgKiBQb2x5bWVyIGFsc28gcHJvdmlkZXMgYSBwcm9wcmlldGFyeSBkYXRhIG11dGF0aW9uIGFuZCBwYXRoIG5vdGlmaWNhdGlvbiBBUEkKICAgKiAoZS5nLiBgbm90aWZ5UGF0aGAsIGBzZXRgLCBhbmQgYXJyYXkgbXV0YXRpb24gQVBJJ3MpIHRoYXQgYWxsb3cgZWZmaWNpZW50CiAgICogbXV0YXRpb24gYW5kIG5vdGlmaWNhdGlvbiBvZiBkZWVwIGNoYW5nZXMgaW4gYW4gb2JqZWN0IGdyYXBoIHRvIGFsbCBlbGVtZW50cwogICAqIGJvdW5kIHRvIHRoZSBzYW1lIG9iamVjdCBncmFwaC4KICAgKgogICAqIEluIGNhc2VzIHdoZXJlIG5laXRoZXIgaW1tdXRhYmxlIHBhdHRlcm5zIG5vciB0aGUgZGF0YSBtdXRhdGlvbiBBUEkgY2FuIGJlCiAgICogdXNlZCwgYXBwbHlpbmcgdGhpcyBtaXhpbiB3aWxsIGFsbG93IFBvbHltZXIgdG8gc2tpcCBkaXJ0eSBjaGVja2luZyBmb3IKICAgKiBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpLiAgVGhpcyBhbGxvd3MgYQogICAqIHVzZXIgdG8gbWFrZSBhIGRlZXAgbW9kaWZpY2F0aW9uIHRvIGEgYm91bmQgb2JqZWN0IGdyYXBoLCBhbmQgdGhlbiBlaXRoZXIKICAgKiBzaW1wbHkgcmUtc2V0IHRoZSBvYmplY3QgKGUuZy4gYHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zYCkgb3IgY2FsbCBgbm90aWZ5UGF0aGAKICAgKiAoZS5nLiBgdGhpcy5ub3RpZnlQYXRoKCdpdGVtcycpYCkgdG8gdXBkYXRlIHRoZSB0cmVlLiAgTm90ZSB0aGF0IGFsbAogICAqIGVsZW1lbnRzIHRoYXQgd2lzaCB0byBiZSB1cGRhdGVkIGJhc2VkIG9uIGRlZXAgbXV0YXRpb25zIG11c3QgYXBwbHkgdGhpcwogICAqIG1peGluIG9yIG90aGVyd2lzZSBza2lwIHN0cmljdCBkaXJ0eSBjaGVja2luZyBmb3Igb2JqZWN0cy9hcnJheXMuCiAgICogU3BlY2lmaWNhbGx5LCBhbnkgZWxlbWVudHMgaW4gdGhlIGJpbmRpbmcgdHJlZSBiZXR3ZWVuIHRoZSBzb3VyY2Ugb2YgYQogICAqIG11dGF0aW9uIGFuZCB0aGUgY29uc3VtcHRpb24gb2YgaXQgbXVzdCBlbmFibGUgdGhpcyBiZWhhdmlvciBvciBhcHBseSB0aGUKICAgKiBgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3JgLgogICAqCiAgICogV2hpbGUgdGhpcyBiZWhhdmlvciBhZGRzIHRoZSBhYmlsaXR5IHRvIGZvcmdvIE9iamVjdC9BcnJheSBkaXJ0eSBjaGVja2luZywKICAgKiB0aGUgYG11dGFibGVEYXRhYCBmbGFnIGRlZmF1bHRzIHRvIGZhbHNlIGFuZCBtdXN0IGJlIHNldCBvbiB0aGUgaW5zdGFuY2UuCiAgICoKICAgKiBOb3RlLCB0aGUgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIG9mIHByb3BhZ2F0aW5nIGxhcmdlIG9iamVjdCBncmFwaHMKICAgKiB3aWxsIGJlIHdvcnNlIGJ5IHJlbHlpbmcgb24gYG11dGFibGVEYXRhOiB0cnVlYCBhcyBvcHBvc2VkIHRvIHVzaW5nCiAgICogc3RyaWN0IGRpcnR5IGNoZWNraW5nIHdpdGggaW1tdXRhYmxlIHBhdHRlcm5zIG9yIFBvbHltZXIncyBwYXRoIG5vdGlmaWNhdGlvbgogICAqIEFQSS4KICAgKgogICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEJlaGF2aW9yIHRvIG9wdGlvbmFsbHkgc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kCiAgICogICBhcnJheXMKICAgKi8KICBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvciA9IHsKCiAgICBwcm9wZXJ0aWVzOiB7CiAgICAgIC8qKgogICAgICAgKiBJbnN0YW5jZS1sZXZlbCBmbGFnIGZvciBjb25maWd1cmluZyB0aGUgZGlydHktY2hlY2tpbmcgc3RyYXRlZ3kKICAgICAgICogZm9yIHRoaXMgZWxlbWVudC4gIFdoZW4gdHJ1ZSwgT2JqZWN0cyBhbmQgQXJyYXlzIHdpbGwgc2tpcCBkaXJ0eQogICAgICAgKiBjaGVja2luZywgb3RoZXJ3aXNlIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyB3aWxsIGJlIHVzZWQuCiAgICAgICAqLwogICAgICBtdXRhYmxlRGF0YTogQm9vbGVhbgogICAgfSwKCiAgICAvKioKICAgICAqIE92ZXJyaWRlcyBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHRvIHNraXAgc3RyaWN0IGVxdWFsaXR5IGNoZWNraW5nCiAgICAgKiBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICoKICAgICAqIFB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYCBjYWNoZQogICAgICogKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAqIGNhY2hlIGlzIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHR1cm4sIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzCiAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAqIGN5Y2xlcyBkdWUgdG8gMi13YXkgbm90aWZpY2F0aW9uKS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICogQHRoaXMge3RoaXN9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCkgewogICAgICByZXR1cm4gbXV0YWJsZVByb3BlcnR5Q2hhbmdlKHRoaXMsIHByb3BlcnR5LCB2YWx1ZSwgb2xkLCB0aGlzLm11dGFibGVEYXRhKTsKICAgIH0KICB9OwoKfSkoKTsKCgoKICAvLyBiYwogIFBvbHltZXIuQmFzZSA9IFBvbHltZXIuTGVnYWN5RWxlbWVudE1peGluKEhUTUxFbGVtZW50KS5wcm90b3R5cGU7CgogIC8vIE5PVEU6IHRoaXMgaXMgaGVyZSBmb3IgbW9kdWxpemVyIHRvIGV4cG9ydCBgaHRtbGAgZm9yIHRoZSBtb2R1bGUgdmVyc2lvbiBvZiB0aGlzIGZpbGUKICBQb2x5bWVyLmh0bWwgPSBQb2x5bWVyLmh0bWw7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1mbGV4LWxheW91dC9pcm9uLWZsZXgtbGF5b3V0Lmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTthLnRleHRDb250ZW50PSJbaGlkZGVuXSB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSI7ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChhKX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1hMTF5LWtleXMtYmVoYXZpb3IvaXJvbi1hMTF5LWtleXMtYmVoYXZpb3IuaHRtbC5qcwooZnVuY3Rpb24oKXtmdW5jdGlvbiBhKHgsQyl7dmFyIEY9IiI7aWYoeClpZih4PXgudG9Mb3dlckNhc2UoKSwiICI9PT14fHx5LnRlc3QoeCkpRj0ic3BhY2UiO2Vsc2UgaWYoei50ZXN0KHgpKUY9ImVzYyI7ZWxzZSBpZigxPT14Lmxlbmd0aCl7aWYoIUN8fHIudGVzdCh4KSlGPXh9ZWxzZSBGPXYudGVzdCh4KT94LnJlcGxhY2UoImFycm93IiwiIik6Im11bHRpcGx5Ij09eD8iKiI6eDtyZXR1cm4gRn1mdW5jdGlvbiBjKHgpe3ZhciBDPSIiO3gmJih4IGluIG4/Qz1uW3hdOnQudGVzdCh4KT8oeD1wYXJzZUludCh4LnJlcGxhY2UoIlUrIiwiMHgiKSwxNiksQz1TdHJpbmcuZnJvbUNoYXJDb2RlKHgpLnRvTG93ZXJDYXNlKCkpOkM9eC50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gQ31mdW5jdGlvbiBkKHgpe3ZhciBDPSIiO051bWJlcih4KSYmKEM9NjU8PXgmJjkwPj14P1N0cmluZy5mcm9tQ2hhckNvZGUoMzIreCk6MTEyPD14JiYxMjM+PXg/ImYiKyh4LTExMisxKTo0ODw9eCYmNTc+PXg/ClN0cmluZyh4LTQ4KTo5Njw9eCYmMTA1Pj14P1N0cmluZyh4LTk2KTpwW3hdKTtyZXR1cm4gQ31mdW5jdGlvbiBmKHgsQyl7cmV0dXJuIHgua2V5P2EoeC5rZXksQyk6eC5kZXRhaWwmJnguZGV0YWlsLmtleT9hKHguZGV0YWlsLmtleSxDKTpjKHgua2V5SWRlbnRpZmllcil8fGQoeC5rZXlDb2RlKXx8IiJ9ZnVuY3Rpb24gZyh4LEMpe3JldHVybiBmKEMseC5oYXNNb2RpZmllcnMpPT09eC5rZXkmJigheC5oYXNNb2RpZmllcnN8fCEhQy5zaGlmdEtleT09PSEheC5zaGlmdEtleSYmISFDLmN0cmxLZXk9PT0hIXguY3RybEtleSYmISFDLmFsdEtleT09PSEheC5hbHRLZXkmJiEhQy5tZXRhS2V5PT09ISF4Lm1ldGFLZXkpfWZ1bmN0aW9uIGwoeCl7cmV0dXJuIDE9PT14Lmxlbmd0aD97Y29tYm86eCxrZXk6eCxldmVudDoia2V5ZG93biJ9Onguc3BsaXQoIisiKS5yZWR1Y2UoZnVuY3Rpb24oQyxGKXt2YXIgRD1GLnNwbGl0KCI6Iik7Rj1EWzBdO0Q9RFsxXTtGIGluIHE/KENbcVtGXV09ITAsCkMuaGFzTW9kaWZpZXJzPSEwKTooQy5rZXk9RixDLmV2ZW50PUR8fCJrZXlkb3duIik7cmV0dXJuIEN9LHtjb21ibzp4LnNwbGl0KCI6Iikuc2hpZnQoKX0pfWZ1bmN0aW9uIGsoeCl7cmV0dXJuIHgudHJpbSgpLnNwbGl0KCIgIikubWFwKGZ1bmN0aW9uKEMpe3JldHVybiBsKEMpfSl9dmFyIG49eyJVKzAwMDgiOiJiYWNrc3BhY2UiLCJVKzAwMDkiOiJ0YWIiLCJVKzAwMUIiOiJlc2MiLCJVKzAwMjAiOiJzcGFjZSIsIlUrMDA3RiI6ImRlbCJ9LHA9ezg6ImJhY2tzcGFjZSIsOToidGFiIiwxMzoiZW50ZXIiLDI3OiJlc2MiLDMzOiJwYWdldXAiLDM0OiJwYWdlZG93biIsMzU6ImVuZCIsMzY6ImhvbWUiLDMyOiJzcGFjZSIsMzc6ImxlZnQiLDM4OiJ1cCIsMzk6InJpZ2h0Iiw0MDoiZG93biIsNDY6ImRlbCIsMTA2OiIqIn0scT17c2hpZnQ6InNoaWZ0S2V5IixjdHJsOiJjdHJsS2V5IixhbHQ6ImFsdEtleSIsbWV0YToibWV0YUtleSJ9LHI9L1thLXowLTkqXS8sdD0vVVwrLyx2PS9eYXJyb3cvLAp5PS9ec3BhY2UoYmFyKT8vLHo9L15lc2NhcGUkLztQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yPXtwcm9wZXJ0aWVzOntrZXlFdmVudFRhcmdldDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319LHN0b3BLZXlib2FyZEV2ZW50UHJvcGFnYXRpb246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2JvdW5kS2V5SGFuZGxlcnM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LF9pbXBlcmF0aXZlS2V5QmluZGluZ3M6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fX0sb2JzZXJ2ZXJzOlsiX3Jlc2V0S2V5RXZlbnRMaXN0ZW5lcnMoa2V5RXZlbnRUYXJnZXQsIF9ib3VuZEtleUhhbmRsZXJzKSJdLGtleUJpbmRpbmdzOnt9LHJlZ2lzdGVyZWQ6ZnVuY3Rpb24oKXt0aGlzLl9wcmVwS2V5QmluZGluZ3MoKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9saXN0ZW5LZXlFdmVudExpc3RlbmVycygpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VubGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKX0sCmFkZE93bktleUJpbmRpbmc6ZnVuY3Rpb24oeCxDKXt0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3NbeF09Qzt0aGlzLl9wcmVwS2V5QmluZGluZ3MoKTt0aGlzLl9yZXNldEtleUV2ZW50TGlzdGVuZXJzKCl9LHJlbW92ZU93bktleUJpbmRpbmdzOmZ1bmN0aW9uKCl7dGhpcy5faW1wZXJhdGl2ZUtleUJpbmRpbmdzPXt9O3RoaXMuX3ByZXBLZXlCaW5kaW5ncygpO3RoaXMuX3Jlc2V0S2V5RXZlbnRMaXN0ZW5lcnMoKX0sa2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzOmZ1bmN0aW9uKHgsQyl7Qz1rKEMpO2Zvcih2YXIgRj0wO0Y8Qy5sZW5ndGg7KytGKWlmKGcoQ1tGXSx4KSlyZXR1cm4hMDtyZXR1cm4hMX0sX2NvbGxlY3RLZXlCaW5kaW5nczpmdW5jdGlvbigpe3ZhciB4PXRoaXMuYmVoYXZpb3JzLm1hcChmdW5jdGlvbihDKXtyZXR1cm4gQy5rZXlCaW5kaW5nc30pOy0xPT09eC5pbmRleE9mKHRoaXMua2V5QmluZGluZ3MpJiZ4LnB1c2godGhpcy5rZXlCaW5kaW5ncyk7cmV0dXJuIHh9LApfcHJlcEtleUJpbmRpbmdzOmZ1bmN0aW9uKCl7dGhpcy5fa2V5QmluZGluZ3M9e307dGhpcy5fY29sbGVjdEtleUJpbmRpbmdzKCkuZm9yRWFjaChmdW5jdGlvbihGKXtmb3IodmFyIEQgaW4gRil0aGlzLl9hZGRLZXlCaW5kaW5nKEQsRltEXSl9LHRoaXMpO2Zvcih2YXIgeCBpbiB0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3MpdGhpcy5fYWRkS2V5QmluZGluZyh4LHRoaXMuX2ltcGVyYXRpdmVLZXlCaW5kaW5nc1t4XSk7Zm9yKHZhciBDIGluIHRoaXMuX2tleUJpbmRpbmdzKXRoaXMuX2tleUJpbmRpbmdzW0NdLnNvcnQoZnVuY3Rpb24oRixEKXtGPUZbMF0uaGFzTW9kaWZpZXJzO3JldHVybiBGPT09RFswXS5oYXNNb2RpZmllcnM/MDpGPy0xOjF9KX0sX2FkZEtleUJpbmRpbmc6ZnVuY3Rpb24oeCxDKXtrKHgpLmZvckVhY2goZnVuY3Rpb24oRil7dGhpcy5fa2V5QmluZGluZ3NbRi5ldmVudF09dGhpcy5fa2V5QmluZGluZ3NbRi5ldmVudF18fFtdO3RoaXMuX2tleUJpbmRpbmdzW0YuZXZlbnRdLnB1c2goW0YsCkNdKX0sdGhpcyl9LF9yZXNldEtleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fdW5saXN0ZW5LZXlFdmVudExpc3RlbmVycygpO3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKX0sX2xpc3RlbktleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5rZXlFdmVudFRhcmdldCYmT2JqZWN0LmtleXModGhpcy5fa2V5QmluZGluZ3MpLmZvckVhY2goZnVuY3Rpb24oeCl7dmFyIEM9dGhpcy5fb25LZXlCaW5kaW5nRXZlbnQuYmluZCh0aGlzLHRoaXMuX2tleUJpbmRpbmdzW3hdKTt0aGlzLl9ib3VuZEtleUhhbmRsZXJzLnB1c2goW3RoaXMua2V5RXZlbnRUYXJnZXQseCxDXSk7dGhpcy5rZXlFdmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKHgsQyl9LHRoaXMpfSxfdW5saXN0ZW5LZXlFdmVudExpc3RlbmVyczpmdW5jdGlvbigpe2Zvcih2YXIgeCxDLEY7dGhpcy5fYm91bmRLZXlIYW5kbGVycy5sZW5ndGg7KXg9dGhpcy5fYm91bmRLZXlIYW5kbGVycy5wb3AoKSwKQz14WzBdLEY9eFsxXSx4PXhbMl0sQy5yZW1vdmVFdmVudExpc3RlbmVyKEYseCl9LF9vbktleUJpbmRpbmdFdmVudDpmdW5jdGlvbih4LEMpe3RoaXMuc3RvcEtleWJvYXJkRXZlbnRQcm9wYWdhdGlvbiYmQy5zdG9wUHJvcGFnYXRpb24oKTtpZighQy5kZWZhdWx0UHJldmVudGVkKWZvcih2YXIgRj0wO0Y8eC5sZW5ndGg7RisrKXt2YXIgRD14W0ZdWzBdLEI9eFtGXVsxXTtpZihnKEQsQykmJih0aGlzLl90cmlnZ2VyS2V5SGFuZGxlcihELEIsQyksQy5kZWZhdWx0UHJldmVudGVkKSlicmVha319LF90cmlnZ2VyS2V5SGFuZGxlcjpmdW5jdGlvbih4LEMsRil7dmFyIEQ9T2JqZWN0LmNyZWF0ZSh4KTtELmtleWJvYXJkRXZlbnQ9Rjt4PW5ldyBDdXN0b21FdmVudCh4LmV2ZW50LHtkZXRhaWw6RCxjYW5jZWxhYmxlOiEwfSk7dGhpc1tDXS5jYWxsKHRoaXMseCk7eC5kZWZhdWx0UHJldmVudGVkJiZGLnByZXZlbnREZWZhdWx0KCl9fX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1iZWhhdmlvcnMvaXJvbi1jb250cm9sLXN0YXRlLmh0bWwuanMKUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlPXtwcm9wZXJ0aWVzOntmb2N1c2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9kaXNhYmxlZENoYW5nZWQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX29sZFRhYkluZGV4Ont0eXBlOlN0cmluZ30sX2JvdW5kRm9jdXNCbHVySGFuZGxlcjp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9mb2N1c0JsdXJIYW5kbGVyLmJpbmQodGhpcyl9fSxfX2hhbmRsZUV2ZW50UmV0YXJnZXRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiF0aGlzLnNoYWRvd1Jvb3QmJiFQb2x5bWVyLkVsZW1lbnR9fX0sb2JzZXJ2ZXJzOlsiX2NoYW5nZWRDb250cm9sU3RhdGUoZm9jdXNlZCwgZGlzYWJsZWQpIl0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwKdGhpcy5fYm91bmRGb2N1c0JsdXJIYW5kbGVyLCEwKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLHRoaXMuX2JvdW5kRm9jdXNCbHVySGFuZGxlciwhMCl9LF9mb2N1c0JsdXJIYW5kbGVyOmZ1bmN0aW9uKGEpe2lmKFBvbHltZXIuRWxlbWVudCl0aGlzLl9zZXRGb2N1c2VkKCJmb2N1cyI9PT1hLnR5cGUpO2Vsc2UgaWYoYS50YXJnZXQ9PT10aGlzKXRoaXMuX3NldEZvY3VzZWQoImZvY3VzIj09PWEudHlwZSk7ZWxzZSBpZih0aGlzLl9faGFuZGxlRXZlbnRSZXRhcmdldGluZyl7dmFyIGM9UG9seW1lci5kb20oYSkubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChjKXx8dGhpcy5maXJlKGEudHlwZSx7c291cmNlRXZlbnQ6YX0se25vZGU6dGhpcyxidWJibGVzOmEuYnViYmxlcyxjYW5jZWxhYmxlOmEuY2FuY2VsYWJsZX0pfX0sX2Rpc2FibGVkQ2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1kaXNhYmxlZCIsYT8idHJ1ZSI6ImZhbHNlIik7CnRoaXMuc3R5bGUucG9pbnRlckV2ZW50cz1hPyJub25lIjoiIjthPyh0aGlzLl9vbGRUYWJJbmRleD10aGlzLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSx0aGlzLl9zZXRGb2N1c2VkKCExKSx0aGlzLnRhYkluZGV4PS0xLHRoaXMuYmx1cigpKTp2b2lkIDAhPT10aGlzLl9vbGRUYWJJbmRleCYmKG51bGw9PT10aGlzLl9vbGRUYWJJbmRleD90aGlzLnJlbW92ZUF0dHJpYnV0ZSgidGFiaW5kZXgiKTp0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLHRoaXMuX29sZFRhYkluZGV4KSl9LF9jaGFuZ2VkQ29udHJvbFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCYmdGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCgpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1iZWhhdmlvcnMvaXJvbi1idXR0b24tc3RhdGUuaHRtbC5qcwpQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGw9e3Byb3BlcnRpZXM6e3ByZXNzZWQ6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMCx2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsb2JzZXJ2ZXI6Il9wcmVzc2VkQ2hhbmdlZCJ9LHRvZ2dsZXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHBvaW50ZXJEb3duOnt0eXBlOkJvb2xlYW4scmVhZE9ubHk6ITAsdmFsdWU6ITF9LHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQ6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMH0sYXJpYUFjdGl2ZUF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImFyaWEtcHJlc3NlZCIsb2JzZXJ2ZXI6Il9hcmlhQWN0aXZlQXR0cmlidXRlQ2hhbmdlZCJ9fSxsaXN0ZW5lcnM6e2Rvd246Il9kb3duSGFuZGxlciIsdXA6Il91cEhhbmRsZXIiLHRhcDoiX3RhcEhhbmRsZXIifSwKb2JzZXJ2ZXJzOlsiX2ZvY3VzQ2hhbmdlZChmb2N1c2VkKSIsIl9hY3RpdmVDaGFuZ2VkKGFjdGl2ZSwgYXJpYUFjdGl2ZUF0dHJpYnV0ZSkiXSxrZXlCaW5kaW5nczp7ImVudGVyOmtleWRvd24iOiJfYXN5bmNDbGljayIsInNwYWNlOmtleWRvd24iOiJfc3BhY2VLZXlEb3duSGFuZGxlciIsInNwYWNlOmtleXVwIjoiX3NwYWNlS2V5VXBIYW5kbGVyIn0sX21vdXNlRXZlbnRSZTovXm1vdXNlLyxfdGFwSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMudG9nZ2xlcz90aGlzLl91c2VyQWN0aXZhdGUoIXRoaXMuYWN0aXZlKTp0aGlzLmFjdGl2ZT0hMX0sX2ZvY3VzQ2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLl9kZXRlY3RLZXlib2FyZEZvY3VzKGEpO2F8fHRoaXMuX3NldFByZXNzZWQoITEpfSxfZGV0ZWN0S2V5Ym9hcmRGb2N1czpmdW5jdGlvbihhKXt0aGlzLl9zZXRSZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKCF0aGlzLnBvaW50ZXJEb3duJiZhKX0sX3VzZXJBY3RpdmF0ZTpmdW5jdGlvbihhKXt0aGlzLmFjdGl2ZSE9PQphJiYodGhpcy5hY3RpdmU9YSx0aGlzLmZpcmUoImNoYW5nZSIpKX0sX2Rvd25IYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0UG9pbnRlckRvd24oITApO3RoaXMuX3NldFByZXNzZWQoITApO3RoaXMuX3NldFJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQoITEpfSxfdXBIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0UG9pbnRlckRvd24oITEpO3RoaXMuX3NldFByZXNzZWQoITEpfSxfc3BhY2VLZXlEb3duSGFuZGxlcjpmdW5jdGlvbihhKXthPWEuZGV0YWlsLmtleWJvYXJkRXZlbnQ7dmFyIGM9UG9seW1lci5kb20oYSkubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChjKXx8KGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuX3NldFByZXNzZWQoITApKX0sX3NwYWNlS2V5VXBIYW5kbGVyOmZ1bmN0aW9uKGEpe2E9UG9seW1lci5kb20oYS5kZXRhaWwua2V5Ym9hcmRFdmVudCkubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChhKXx8Cih0aGlzLnByZXNzZWQmJnRoaXMuX2FzeW5jQ2xpY2soKSx0aGlzLl9zZXRQcmVzc2VkKCExKSl9LF9hc3luY0NsaWNrOmZ1bmN0aW9uKCl7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuY2xpY2soKX0sMSl9LF9wcmVzc2VkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2NoYW5nZWRCdXR0b25TdGF0ZSgpfSxfYXJpYUFjdGl2ZUF0dHJpYnV0ZUNoYW5nZWQ6ZnVuY3Rpb24oYSxjKXtjJiZjIT1hJiZ0aGlzLmhhc0F0dHJpYnV0ZShjKSYmdGhpcy5yZW1vdmVBdHRyaWJ1dGUoYyl9LF9hY3RpdmVDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMudG9nZ2xlcz90aGlzLnNldEF0dHJpYnV0ZSh0aGlzLmFyaWFBY3RpdmVBdHRyaWJ1dGUsYT8idHJ1ZSI6ImZhbHNlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUodGhpcy5hcmlhQWN0aXZlQXR0cmlidXRlKTt0aGlzLl9jaGFuZ2VkQnV0dG9uU3RhdGUoKX0sX2NvbnRyb2xTdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkP3RoaXMuX3NldFByZXNzZWQoITEpOgp0aGlzLl9jaGFuZ2VkQnV0dG9uU3RhdGUoKX0sX2NoYW5nZWRCdXR0b25TdGF0ZTpmdW5jdGlvbigpe3RoaXMuX2J1dHRvblN0YXRlQ2hhbmdlZCYmdGhpcy5fYnV0dG9uU3RhdGVDaGFuZ2VkKCl9fTtQb2x5bWVyLklyb25CdXR0b25TdGF0ZT1bUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcixQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXJpcHBsZS9wYXBlci1yaXBwbGUuaHRtbC5qcwooZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGYpe3RoaXMuZWxlbWVudD1mO3RoaXMud2lkdGg9dGhpcy5ib3VuZGluZ1JlY3Qud2lkdGg7dGhpcy5oZWlnaHQ9dGhpcy5ib3VuZGluZ1JlY3QuaGVpZ2h0O3RoaXMuc2l6ZT1NYXRoLm1heCh0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KX1mdW5jdGlvbiBjKGYpe3RoaXMuZWxlbWVudD1mO3RoaXMuY29sb3I9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZikuY29sb3I7dGhpcy53YXZlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMud2F2ZUNvbnRhaW5lcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLndhdmUuc3R5bGUuYmFja2dyb3VuZENvbG9yPXRoaXMuY29sb3I7dGhpcy53YXZlLmNsYXNzTGlzdC5hZGQoIndhdmUiKTt0aGlzLndhdmVDb250YWluZXIuY2xhc3NMaXN0LmFkZCgid2F2ZS1jb250YWluZXIiKTtQb2x5bWVyLmRvbSh0aGlzLndhdmVDb250YWluZXIpLmFwcGVuZENoaWxkKHRoaXMud2F2ZSk7dGhpcy5yZXNldEludGVyYWN0aW9uU3RhdGUoKX0KdmFyIGQ9e2Rpc3RhbmNlOmZ1bmN0aW9uKGYsZyxsLGspe2YtPWw7Zy09aztyZXR1cm4gTWF0aC5zcXJ0KGYqZitnKmcpfSxub3c6d2luZG93LnBlcmZvcm1hbmNlJiZ3aW5kb3cucGVyZm9ybWFuY2Uubm93P3dpbmRvdy5wZXJmb3JtYW5jZS5ub3cuYmluZCh3aW5kb3cucGVyZm9ybWFuY2UpOkRhdGUubm93fTthLnByb3RvdHlwZT17Z2V0IGJvdW5kaW5nUmVjdCgpe3JldHVybiB0aGlzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9LGZ1cnRoZXN0Q29ybmVyRGlzdGFuY2VGcm9tOmZ1bmN0aW9uKGYsZyl7dmFyIGw9ZC5kaXN0YW5jZShmLGcsMCwwKSxrPWQuZGlzdGFuY2UoZixnLHRoaXMud2lkdGgsMCksbj1kLmRpc3RhbmNlKGYsZywwLHRoaXMuaGVpZ2h0KTtmPWQuZGlzdGFuY2UoZixnLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpO3JldHVybiBNYXRoLm1heChsLGssbixmKX19O2MuTUFYX1JBRElVUz0zMDA7Yy5wcm90b3R5cGU9e2dldCByZWNlbnRlcnMoKXtyZXR1cm4gdGhpcy5lbGVtZW50LnJlY2VudGVyc30sCmdldCBjZW50ZXIoKXtyZXR1cm4gdGhpcy5lbGVtZW50LmNlbnRlcn0sZ2V0IG1vdXNlRG93bkVsYXBzZWQoKXtpZighdGhpcy5tb3VzZURvd25TdGFydClyZXR1cm4gMDt2YXIgZj1kLm5vdygpLXRoaXMubW91c2VEb3duU3RhcnQ7dGhpcy5tb3VzZVVwU3RhcnQmJihmLT10aGlzLm1vdXNlVXBFbGFwc2VkKTtyZXR1cm4gZn0sZ2V0IG1vdXNlVXBFbGFwc2VkKCl7cmV0dXJuIHRoaXMubW91c2VVcFN0YXJ0P2Qubm93KCktdGhpcy5tb3VzZVVwU3RhcnQ6MH0sZ2V0IG1vdXNlRG93bkVsYXBzZWRTZWNvbmRzKCl7cmV0dXJuIHRoaXMubW91c2VEb3duRWxhcHNlZC8xRTN9LGdldCBtb3VzZVVwRWxhcHNlZFNlY29uZHMoKXtyZXR1cm4gdGhpcy5tb3VzZVVwRWxhcHNlZC8xRTN9LGdldCBtb3VzZUludGVyYWN0aW9uU2Vjb25kcygpe3JldHVybiB0aGlzLm1vdXNlRG93bkVsYXBzZWRTZWNvbmRzK3RoaXMubW91c2VVcEVsYXBzZWRTZWNvbmRzfSxnZXQgaW5pdGlhbE9wYWNpdHkoKXtyZXR1cm4gdGhpcy5lbGVtZW50LmluaXRpYWxPcGFjaXR5fSwKZ2V0IG9wYWNpdHlEZWNheVZlbG9jaXR5KCl7cmV0dXJuIHRoaXMuZWxlbWVudC5vcGFjaXR5RGVjYXlWZWxvY2l0eX0sZ2V0IHJhZGl1cygpe3ZhciBmPTEuMSpNYXRoLm1pbihNYXRoLnNxcnQodGhpcy5jb250YWluZXJNZXRyaWNzLndpZHRoKnRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aCt0aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0KnRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQpLGMuTUFYX1JBRElVUykrNTtyZXR1cm4gTWF0aC5hYnMoZiooMS1NYXRoLnBvdyg4MCwtKHRoaXMubW91c2VJbnRlcmFjdGlvblNlY29uZHMvKDEuMS1mL2MuTUFYX1JBRElVUyouMikpKSkpfSxnZXQgb3BhY2l0eSgpe3JldHVybiB0aGlzLm1vdXNlVXBTdGFydD9NYXRoLm1heCgwLHRoaXMuaW5pdGlhbE9wYWNpdHktdGhpcy5tb3VzZVVwRWxhcHNlZFNlY29uZHMqdGhpcy5vcGFjaXR5RGVjYXlWZWxvY2l0eSk6dGhpcy5pbml0aWFsT3BhY2l0eX0sZ2V0IG91dGVyT3BhY2l0eSgpe3JldHVybiBNYXRoLm1heCgwLApNYXRoLm1pbiguMyp0aGlzLm1vdXNlVXBFbGFwc2VkU2Vjb25kcyx0aGlzLm9wYWNpdHkpKX0sZ2V0IGlzT3BhY2l0eUZ1bGx5RGVjYXllZCgpe3JldHVybi4wMT50aGlzLm9wYWNpdHkmJnRoaXMucmFkaXVzPj1NYXRoLm1pbih0aGlzLm1heFJhZGl1cyxjLk1BWF9SQURJVVMpfSxnZXQgaXNSZXN0aW5nQXRNYXhSYWRpdXMoKXtyZXR1cm4gdGhpcy5vcGFjaXR5Pj10aGlzLmluaXRpYWxPcGFjaXR5JiZ0aGlzLnJhZGl1cz49TWF0aC5taW4odGhpcy5tYXhSYWRpdXMsYy5NQVhfUkFESVVTKX0sZ2V0IGlzQW5pbWF0aW9uQ29tcGxldGUoKXtyZXR1cm4gdGhpcy5tb3VzZVVwU3RhcnQ/dGhpcy5pc09wYWNpdHlGdWxseURlY2F5ZWQ6dGhpcy5pc1Jlc3RpbmdBdE1heFJhZGl1c30sZ2V0IHRyYW5zbGF0aW9uRnJhY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4oMSx0aGlzLnJhZGl1cy90aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSoyL01hdGguc3FydCgyKSl9LGdldCB4Tm93KCl7cmV0dXJuIHRoaXMueEVuZD8KdGhpcy54U3RhcnQrdGhpcy50cmFuc2xhdGlvbkZyYWN0aW9uKih0aGlzLnhFbmQtdGhpcy54U3RhcnQpOnRoaXMueFN0YXJ0fSxnZXQgeU5vdygpe3JldHVybiB0aGlzLnlFbmQ/dGhpcy55U3RhcnQrdGhpcy50cmFuc2xhdGlvbkZyYWN0aW9uKih0aGlzLnlFbmQtdGhpcy55U3RhcnQpOnRoaXMueVN0YXJ0fSxnZXQgaXNNb3VzZURvd24oKXtyZXR1cm4gdGhpcy5tb3VzZURvd25TdGFydCYmIXRoaXMubW91c2VVcFN0YXJ0fSxyZXNldEludGVyYWN0aW9uU3RhdGU6ZnVuY3Rpb24oKXt0aGlzLnNsaWRlRGlzdGFuY2U9dGhpcy55RW5kPXRoaXMueEVuZD10aGlzLnlTdGFydD10aGlzLnhTdGFydD10aGlzLm1vdXNlVXBTdGFydD10aGlzLm1vdXNlRG93blN0YXJ0PXRoaXMubWF4UmFkaXVzPTA7dGhpcy5jb250YWluZXJNZXRyaWNzPW5ldyBhKHRoaXMuZWxlbWVudCl9LGRyYXc6ZnVuY3Rpb24oKXt0aGlzLndhdmUuc3R5bGUub3BhY2l0eT10aGlzLm9wYWNpdHk7dmFyIGY9dGhpcy5yYWRpdXMvCih0aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZS8yKTt2YXIgZz10aGlzLnhOb3ctdGhpcy5jb250YWluZXJNZXRyaWNzLndpZHRoLzI7dmFyIGw9dGhpcy55Tm93LXRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQvMjt0aGlzLndhdmVDb250YWluZXIuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJ0cmFuc2xhdGUoIitnKyJweCwgIitsKyJweCkiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKCIrZysicHgsICIrbCsicHgsIDApIjt0aGlzLndhdmUuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJzY2FsZSgiK2YrIiwiK2YrIikiO3RoaXMud2F2ZS5zdHlsZS50cmFuc2Zvcm09InNjYWxlM2QoIitmKyIsIitmKyIsMSkifSxkb3duQWN0aW9uOmZ1bmN0aW9uKGYpe3ZhciBnPXRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aC8yLGw9dGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodC8yO3RoaXMucmVzZXRJbnRlcmFjdGlvblN0YXRlKCk7dGhpcy5tb3VzZURvd25TdGFydD0KZC5ub3coKTt0aGlzLmNlbnRlcj8odGhpcy54U3RhcnQ9Zyx0aGlzLnlTdGFydD1sLHRoaXMuc2xpZGVEaXN0YW5jZT1kLmRpc3RhbmNlKHRoaXMueFN0YXJ0LHRoaXMueVN0YXJ0LHRoaXMueEVuZCx0aGlzLnlFbmQpKToodGhpcy54U3RhcnQ9Zj9mLmRldGFpbC54LXRoaXMuY29udGFpbmVyTWV0cmljcy5ib3VuZGluZ1JlY3QubGVmdDp0aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgvMix0aGlzLnlTdGFydD1mP2YuZGV0YWlsLnktdGhpcy5jb250YWluZXJNZXRyaWNzLmJvdW5kaW5nUmVjdC50b3A6dGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodC8yKTt0aGlzLnJlY2VudGVycyYmKHRoaXMueEVuZD1nLHRoaXMueUVuZD1sLHRoaXMuc2xpZGVEaXN0YW5jZT1kLmRpc3RhbmNlKHRoaXMueFN0YXJ0LHRoaXMueVN0YXJ0LHRoaXMueEVuZCx0aGlzLnlFbmQpKTt0aGlzLm1heFJhZGl1cz10aGlzLmNvbnRhaW5lck1ldHJpY3MuZnVydGhlc3RDb3JuZXJEaXN0YW5jZUZyb20odGhpcy54U3RhcnQsCnRoaXMueVN0YXJ0KTt0aGlzLndhdmVDb250YWluZXIuc3R5bGUudG9wPSh0aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0LXRoaXMuY29udGFpbmVyTWV0cmljcy5zaXplKS8yKyJweCI7dGhpcy53YXZlQ29udGFpbmVyLnN0eWxlLmxlZnQ9KHRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aC10aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSkvMisicHgiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS53aWR0aD10aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSsicHgiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS5oZWlnaHQ9dGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUrInB4In0sdXBBY3Rpb246ZnVuY3Rpb24oKXt0aGlzLmlzTW91c2VEb3duJiYodGhpcy5tb3VzZVVwU3RhcnQ9ZC5ub3coKSl9LHJlbW92ZTpmdW5jdGlvbigpe1BvbHltZXIuZG9tKHRoaXMud2F2ZUNvbnRhaW5lci5wYXJlbnROb2RlKS5yZW1vdmVDaGlsZCh0aGlzLndhdmVDb250YWluZXIpfX07UG9seW1lcih7aXM6InBhcGVyLXJpcHBsZSIsCmJlaGF2aW9yczpbUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcl0scHJvcGVydGllczp7aW5pdGlhbE9wYWNpdHk6e3R5cGU6TnVtYmVyLHZhbHVlOi4yNX0sb3BhY2l0eURlY2F5VmVsb2NpdHk6e3R5cGU6TnVtYmVyLHZhbHVlOi44fSxyZWNlbnRlcnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sY2VudGVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHJpcHBsZXM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LGFuaW1hdGluZzp7dHlwZTpCb29sZWFuLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMX0saG9sZERvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2hvbGREb3duQ2hhbmdlZCJ9LG5vaW5rOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9hbmltYXRpbmc6e3R5cGU6Qm9vbGVhbn0sX2JvdW5kQW5pbWF0ZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFuaW1hdGUuYmluZCh0aGlzKX19fSwKZ2V0IHRhcmdldCgpe3JldHVybiB0aGlzLmtleUV2ZW50VGFyZ2V0fSxrZXlCaW5kaW5nczp7ImVudGVyOmtleWRvd24iOiJfb25FbnRlcktleWRvd24iLCJzcGFjZTprZXlkb3duIjoiX29uU3BhY2VLZXlkb3duIiwic3BhY2U6a2V5dXAiOiJfb25TcGFjZUtleXVwIn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt2YXIgZj10aGlzLmtleUV2ZW50VGFyZ2V0PTExPT10aGlzLnBhcmVudE5vZGUubm9kZVR5cGU/UG9seW1lci5kb20odGhpcykuZ2V0T3duZXJSb290KCkuaG9zdDp0aGlzLnBhcmVudE5vZGU7dGhpcy5saXN0ZW4oZiwidXAiLCJ1aVVwQWN0aW9uIik7dGhpcy5saXN0ZW4oZiwiZG93biIsInVpRG93bkFjdGlvbiIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMudW5saXN0ZW4odGhpcy5rZXlFdmVudFRhcmdldCwidXAiLCJ1aVVwQWN0aW9uIik7dGhpcy51bmxpc3Rlbih0aGlzLmtleUV2ZW50VGFyZ2V0LCJkb3duIiwidWlEb3duQWN0aW9uIik7dGhpcy5rZXlFdmVudFRhcmdldD0KbnVsbH0sZ2V0IHNob3VsZEtlZXBBbmltYXRpbmcoKXtmb3IodmFyIGY9MDtmPHRoaXMucmlwcGxlcy5sZW5ndGg7KytmKWlmKCF0aGlzLnJpcHBsZXNbZl0uaXNBbmltYXRpb25Db21wbGV0ZSlyZXR1cm4hMDtyZXR1cm4hMX0sc2ltdWxhdGVkUmlwcGxlOmZ1bmN0aW9uKCl7dGhpcy5kb3duQWN0aW9uKG51bGwpO3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLnVwQWN0aW9uKCl9LDEpfSx1aURvd25BY3Rpb246ZnVuY3Rpb24oZil7dGhpcy5ub2lua3x8dGhpcy5kb3duQWN0aW9uKGYpfSxkb3duQWN0aW9uOmZ1bmN0aW9uKGYpe3RoaXMuaG9sZERvd24mJjA8dGhpcy5yaXBwbGVzLmxlbmd0aHx8KHRoaXMuYWRkUmlwcGxlKCkuZG93bkFjdGlvbihmKSx0aGlzLl9hbmltYXRpbmd8fCh0aGlzLl9hbmltYXRpbmc9ITAsdGhpcy5hbmltYXRlKCkpKX0sdWlVcEFjdGlvbjpmdW5jdGlvbihmKXt0aGlzLm5vaW5rfHx0aGlzLnVwQWN0aW9uKGYpfSx1cEFjdGlvbjpmdW5jdGlvbihmKXt0aGlzLmhvbGREb3dufHwKKHRoaXMucmlwcGxlcy5mb3JFYWNoKGZ1bmN0aW9uKGcpe2cudXBBY3Rpb24oZil9KSx0aGlzLl9hbmltYXRpbmc9ITAsdGhpcy5hbmltYXRlKCkpfSxvbkFuaW1hdGlvbkNvbXBsZXRlOmZ1bmN0aW9uKCl7dGhpcy5fYW5pbWF0aW5nPSExO3RoaXMuJC5iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmRDb2xvcj1udWxsO3RoaXMuZmlyZSgidHJhbnNpdGlvbmVuZCIpfSxhZGRSaXBwbGU6ZnVuY3Rpb24oKXt2YXIgZj1uZXcgYyh0aGlzKTtQb2x5bWVyLmRvbSh0aGlzLiQud2F2ZXMpLmFwcGVuZENoaWxkKGYud2F2ZUNvbnRhaW5lcik7dGhpcy4kLmJhY2tncm91bmQuc3R5bGUuYmFja2dyb3VuZENvbG9yPWYuY29sb3I7dGhpcy5yaXBwbGVzLnB1c2goZik7dGhpcy5fc2V0QW5pbWF0aW5nKCEwKTtyZXR1cm4gZn0scmVtb3ZlUmlwcGxlOmZ1bmN0aW9uKGYpe3ZhciBnPXRoaXMucmlwcGxlcy5pbmRleE9mKGYpOzA+Z3x8KHRoaXMucmlwcGxlcy5zcGxpY2UoZywxKSxmLnJlbW92ZSgpLAp0aGlzLnJpcHBsZXMubGVuZ3RofHx0aGlzLl9zZXRBbmltYXRpbmcoITEpKX0sYW5pbWF0ZTpmdW5jdGlvbigpe2lmKHRoaXMuX2FuaW1hdGluZyl7dmFyIGY7Zm9yKGY9MDtmPHRoaXMucmlwcGxlcy5sZW5ndGg7KytmKXt2YXIgZz10aGlzLnJpcHBsZXNbZl07Zy5kcmF3KCk7dGhpcy4kLmJhY2tncm91bmQuc3R5bGUub3BhY2l0eT1nLm91dGVyT3BhY2l0eTtnLmlzT3BhY2l0eUZ1bGx5RGVjYXllZCYmIWcuaXNSZXN0aW5nQXRNYXhSYWRpdXMmJnRoaXMucmVtb3ZlUmlwcGxlKGcpfWlmKHRoaXMuc2hvdWxkS2VlcEFuaW1hdGluZ3x8MCE9PXRoaXMucmlwcGxlcy5sZW5ndGgpd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9ib3VuZEFuaW1hdGUpO2Vsc2UgdGhpcy5vbkFuaW1hdGlvbkNvbXBsZXRlKCl9fSxfb25FbnRlcktleWRvd246ZnVuY3Rpb24oKXt0aGlzLnVpRG93bkFjdGlvbigpO3RoaXMuYXN5bmModGhpcy51aVVwQWN0aW9uLDEpfSxfb25TcGFjZUtleWRvd246ZnVuY3Rpb24oKXt0aGlzLnVpRG93bkFjdGlvbigpfSwKX29uU3BhY2VLZXl1cDpmdW5jdGlvbigpe3RoaXMudWlVcEFjdGlvbigpfSxfaG9sZERvd25DaGFuZ2VkOmZ1bmN0aW9uKGYsZyl7dm9pZCAwIT09ZyYmKGY/dGhpcy5kb3duQWN0aW9uKCk6dGhpcy51cEFjdGlvbigpKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItYmVoYXZpb3JzL3BhcGVyLXJpcHBsZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvcj17cHJvcGVydGllczp7bm9pbms6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX25vaW5rQ2hhbmdlZCJ9LF9yaXBwbGVDb250YWluZXI6e3R5cGU6T2JqZWN0fX0sX2J1dHRvblN0YXRlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZm9jdXNlZCYmdGhpcy5lbnN1cmVSaXBwbGUoKX0sX2Rvd25IYW5kbGVyOmZ1bmN0aW9uKGEpe1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlSW1wbC5fZG93bkhhbmRsZXIuY2FsbCh0aGlzLGEpO3RoaXMucHJlc3NlZCYmdGhpcy5lbnN1cmVSaXBwbGUoYSl9LGVuc3VyZVJpcHBsZTpmdW5jdGlvbihhKXtpZighdGhpcy5oYXNSaXBwbGUoKSl7dGhpcy5fcmlwcGxlPXRoaXMuX2NyZWF0ZVJpcHBsZSgpO3RoaXMuX3JpcHBsZS5ub2luaz10aGlzLm5vaW5rO3ZhciBjPXRoaXMuX3JpcHBsZUNvbnRhaW5lcnx8dGhpcy5yb290O2MmJlBvbHltZXIuZG9tKGMpLmFwcGVuZENoaWxkKHRoaXMuX3JpcHBsZSk7aWYoYSl7Yz0KUG9seW1lci5kb20odGhpcy5fcmlwcGxlQ29udGFpbmVyfHx0aGlzKTt2YXIgZD1Qb2x5bWVyLmRvbShhKS5yb290VGFyZ2V0O2MuZGVlcENvbnRhaW5zKGQpJiZ0aGlzLl9yaXBwbGUudWlEb3duQWN0aW9uKGEpfX19LGdldFJpcHBsZTpmdW5jdGlvbigpe3RoaXMuZW5zdXJlUmlwcGxlKCk7cmV0dXJuIHRoaXMuX3JpcHBsZX0saGFzUmlwcGxlOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl9yaXBwbGV9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItcmlwcGxlIil9LF9ub2lua0NoYW5nZWQ6ZnVuY3Rpb24oYSl7dGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuX3JpcHBsZS5ub2luaz1hKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWJlaGF2aW9ycy9wYXBlci1idXR0b24tYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVyQnV0dG9uQmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOntlbGV2YXRpb246e3R5cGU6TnVtYmVyLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxyZWFkT25seTohMH19LG9ic2VydmVyczpbIl9jYWxjdWxhdGVFbGV2YXRpb24oZm9jdXNlZCwgZGlzYWJsZWQsIGFjdGl2ZSwgcHJlc3NlZCwgcmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCkiLCJfY29tcHV0ZUtleWJvYXJkQ2xhc3MocmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCkiXSxob3N0QXR0cmlidXRlczp7cm9sZToiYnV0dG9uIix0YWJpbmRleDoiMCIsYW5pbWF0ZWQ6ITB9LF9jYWxjdWxhdGVFbGV2YXRpb246ZnVuY3Rpb24oKXt2YXIgYT0xO3RoaXMuZGlzYWJsZWQ/YT0wOnRoaXMuYWN0aXZlfHx0aGlzLnByZXNzZWQ/YT00OnRoaXMucmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCYmKGE9Myk7dGhpcy5fc2V0RWxldmF0aW9uKGEpfSxfY29tcHV0ZUtleWJvYXJkQ2xhc3M6ZnVuY3Rpb24oYSl7dGhpcy50b2dnbGVDbGFzcygia2V5Ym9hcmQtZm9jdXMiLAphKX0sX3NwYWNlS2V5RG93bkhhbmRsZXI6ZnVuY3Rpb24oYSl7UG9seW1lci5Jcm9uQnV0dG9uU3RhdGVJbXBsLl9zcGFjZUtleURvd25IYW5kbGVyLmNhbGwodGhpcyxhKTt0aGlzLmhhc1JpcHBsZSgpJiYxPnRoaXMuZ2V0UmlwcGxlKCkucmlwcGxlcy5sZW5ndGgmJnRoaXMuX3JpcHBsZS51aURvd25BY3Rpb24oKX0sX3NwYWNlS2V5VXBIYW5kbGVyOmZ1bmN0aW9uKGEpe1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlSW1wbC5fc3BhY2VLZXlVcEhhbmRsZXIuY2FsbCh0aGlzLGEpO3RoaXMuaGFzUmlwcGxlKCkmJnRoaXMuX3JpcHBsZS51aVVwQWN0aW9uKCl9fTtQb2x5bWVyLlBhcGVyQnV0dG9uQmVoYXZpb3I9W1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IsUG9seW1lci5QYXBlckJ1dHRvbkJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItYnV0dG9uL3BhcGVyLWJ1dHRvbi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1idXR0b24iLGJlaGF2aW9yczpbUG9seW1lci5QYXBlckJ1dHRvbkJlaGF2aW9yXSxwcm9wZXJ0aWVzOntyYWlzZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITEsb2JzZXJ2ZXI6Il9jYWxjdWxhdGVFbGV2YXRpb24ifX0sX2NhbGN1bGF0ZUVsZXZhdGlvbjpmdW5jdGlvbigpe3RoaXMucmFpc2VkP1BvbHltZXIuUGFwZXJCdXR0b25CZWhhdmlvckltcGwuX2NhbGN1bGF0ZUVsZXZhdGlvbi5hcHBseSh0aGlzKTp0aGlzLl9zZXRFbGV2YXRpb24oMCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1tZXRhL2lyb24tbWV0YS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbk1ldGE9ZnVuY3Rpb24oYyl7UG9seW1lci5Jcm9uTWV0YVsiICJdKGMpO3RoaXMudHlwZT1jJiZjLnR5cGV8fCJkZWZhdWx0Ijt0aGlzLmtleT1jJiZjLmtleTtjJiYidmFsdWUiaW4gYyYmKHRoaXMudmFsdWU9Yy52YWx1ZSl9O1BvbHltZXIuSXJvbk1ldGFbIiAiXT1mdW5jdGlvbigpe307UG9seW1lci5Jcm9uTWV0YS50eXBlcz17fTtQb2x5bWVyLklyb25NZXRhLnByb3RvdHlwZT17Z2V0IHZhbHVlKCl7dmFyIGM9dGhpcy50eXBlLGQ9dGhpcy5rZXk7aWYoYyYmZClyZXR1cm4gUG9seW1lci5Jcm9uTWV0YS50eXBlc1tjXSYmUG9seW1lci5Jcm9uTWV0YS50eXBlc1tjXVtkXX0sc2V0IHZhbHVlKGMpe3ZhciBkPXRoaXMudHlwZSxmPXRoaXMua2V5O2QmJmYmJihkPVBvbHltZXIuSXJvbk1ldGEudHlwZXNbZF09UG9seW1lci5Jcm9uTWV0YS50eXBlc1tkXXx8e30sbnVsbD09Yz9kZWxldGUgZFtmXTpkW2ZdPWMpfSxnZXQgbGlzdCgpe2lmKHRoaXMudHlwZSl7dmFyIGM9ClBvbHltZXIuSXJvbk1ldGEudHlwZXNbdGhpcy50eXBlXTtyZXR1cm4gYz9PYmplY3Qua2V5cyhjKS5tYXAoZnVuY3Rpb24oZCl7cmV0dXJuIGFbdGhpcy50eXBlXVtkXX0sdGhpcyk6W119fSxieUtleTpmdW5jdGlvbihjKXt0aGlzLmtleT1jO3JldHVybiB0aGlzLnZhbHVlfX07dmFyIGE9UG9seW1lci5Jcm9uTWV0YS50eXBlcztQb2x5bWVyKHtpczoiaXJvbi1tZXRhIixwcm9wZXJ0aWVzOnt0eXBlOnt0eXBlOlN0cmluZyx2YWx1ZToiZGVmYXVsdCJ9LGtleTp7dHlwZTpTdHJpbmd9LHZhbHVlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGY6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX3NlbGZDaGFuZ2VkIn0sX19tZXRhOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9fY29tcHV0ZU1ldGEodHlwZSwga2V5LCB2YWx1ZSkifX0saG9zdEF0dHJpYnV0ZXM6e2hpZGRlbjohMH0sX19jb21wdXRlTWV0YTpmdW5jdGlvbihjLGQsZil7Yz1uZXcgUG9seW1lci5Jcm9uTWV0YSh7dHlwZTpjLAprZXk6ZH0pO3ZvaWQgMCE9PWYmJmYhPT1jLnZhbHVlP2MudmFsdWU9Zjp0aGlzLnZhbHVlIT09Yy52YWx1ZSYmKHRoaXMudmFsdWU9Yy52YWx1ZSk7cmV0dXJuIGN9LGdldCBsaXN0KCl7cmV0dXJuIHRoaXMuX19tZXRhJiZ0aGlzLl9fbWV0YS5saXN0fSxfc2VsZkNoYW5nZWQ6ZnVuY3Rpb24oYyl7YyYmKHRoaXMudmFsdWU9dGhpcyl9LGJ5S2V5OmZ1bmN0aW9uKGMpe3JldHVybihuZXcgUG9seW1lci5Jcm9uTWV0YSh7dHlwZTp0aGlzLnR5cGUsa2V5OmN9KSkudmFsdWV9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tdmFsaWRhdGFibGUtYmVoYXZpb3IvaXJvbi12YWxpZGF0YWJsZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhPW51bGw7ClBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3I9e3Byb3BlcnRpZXM6e3ZhbGlkYXRvcjp7dHlwZTpTdHJpbmd9LGludmFsaWQ6e25vdGlmeTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfaW52YWxpZENoYW5nZWQifX0scmVnaXN0ZXJlZDpmdW5jdGlvbigpe1BvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhPW5ldyBQb2x5bWVyLklyb25NZXRhKHt0eXBlOiJ2YWxpZGF0b3IifSl9LF9pbnZhbGlkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuaW52YWxpZD90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1pbnZhbGlkIiwidHJ1ZSIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWludmFsaWQiKX0sZ2V0IF92YWxpZGF0b3IoKXtyZXR1cm4gUG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvck1ldGEmJlBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhLmJ5S2V5KHRoaXMudmFsaWRhdG9yKX0saGFzVmFsaWRhdG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPQp0aGlzLl92YWxpZGF0b3J9LHZhbGlkYXRlOmZ1bmN0aW9uKGEpe3RoaXMuaW52YWxpZD12b2lkIDA9PT1hJiZ2b2lkIDAhPT10aGlzLnZhbHVlPyF0aGlzLl9nZXRWYWxpZGl0eSh0aGlzLnZhbHVlKTohdGhpcy5fZ2V0VmFsaWRpdHkoYSk7cmV0dXJuIXRoaXMuaW52YWxpZH0sX2dldFZhbGlkaXR5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmhhc1ZhbGlkYXRvcigpP3RoaXMuX3ZhbGlkYXRvci52YWxpZGF0ZShhKTohMH19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tZm9ybS1lbGVtZW50LWJlaGF2aW9yL2lyb24tZm9ybS1lbGVtZW50LWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcj17cHJvcGVydGllczp7bmFtZTp7dHlwZTpTdHJpbmd9LHZhbHVlOntub3RpZnk6ITAsdHlwZTpTdHJpbmd9LHJlcXVpcmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9wYXJlbnRGb3JtOnt0eXBlOk9iamVjdH19LGF0dGFjaGVkOmZ1bmN0aW9uKCl7UG9seW1lci5FbGVtZW50fHx0aGlzLmZpcmUoImlyb24tZm9ybS1lbGVtZW50LXJlZ2lzdGVyIil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7IVBvbHltZXIuRWxlbWVudCYmdGhpcy5fcGFyZW50Rm9ybSYmdGhpcy5fcGFyZW50Rm9ybS5maXJlKCJpcm9uLWZvcm0tZWxlbWVudC11bnJlZ2lzdGVyIix7dGFyZ2V0OnRoaXN9KX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tY2hlY2tlZC1lbGVtZW50LWJlaGF2aW9yL2lyb24tY2hlY2tlZC1lbGVtZW50LWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGw9e3Byb3BlcnRpZXM6e2NoZWNrZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsbm90aWZ5OiEwLG9ic2VydmVyOiJfY2hlY2tlZENoYW5nZWQifSx0b2dnbGVzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfSx2YWx1ZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im9uIixvYnNlcnZlcjoiX3ZhbHVlQ2hhbmdlZCJ9fSxvYnNlcnZlcnM6WyJfcmVxdWlyZWRDaGFuZ2VkKHJlcXVpcmVkKSJdLGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNJcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcj0hMH0sX2dldFZhbGlkaXR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWR8fCF0aGlzLnJlcXVpcmVkfHx0aGlzLmNoZWNrZWR9LF9yZXF1aXJlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLnJlcXVpcmVkP3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXJlcXVpcmVkIiwKInRydWUiKTp0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1yZXF1aXJlZCIpfSxfY2hlY2tlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmFjdGl2ZT10aGlzLmNoZWNrZWQ7dGhpcy5maXJlKCJpcm9uLWNoYW5nZSIpfSxfdmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKCl7aWYodm9pZCAwPT09dGhpcy52YWx1ZXx8bnVsbD09PXRoaXMudmFsdWUpdGhpcy52YWx1ZT0ib24ifX07UG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcj1bUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcixQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3JJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1iZWhhdmlvcnMvcGFwZXItaW5reS1mb2N1cy1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvckltcGw9e29ic2VydmVyczpbIl9mb2N1c2VkQ2hhbmdlZChyZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKSJdLF9mb2N1c2VkQ2hhbmdlZDpmdW5jdGlvbihhKXthJiZ0aGlzLmVuc3VyZVJpcHBsZSgpO3RoaXMuaGFzUmlwcGxlKCkmJih0aGlzLl9yaXBwbGUuaG9sZERvd249YSl9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXt2YXIgYT1Qb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IuX2NyZWF0ZVJpcHBsZSgpO2EuaWQ9ImluayI7YS5zZXRBdHRyaWJ1dGUoImNlbnRlciIsIiIpO2EuY2xhc3NMaXN0LmFkZCgiY2lyY2xlIik7cmV0dXJuIGF9fTtQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3I9W1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IsUG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItYmVoYXZpb3JzL3BhcGVyLWNoZWNrZWQtZWxlbWVudC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9ySW1wbD17X2NoZWNrZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGwuX2NoZWNrZWRDaGFuZ2VkLmNhbGwodGhpcyk7dGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuY2hlY2tlZD90aGlzLl9yaXBwbGUuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiIik6dGhpcy5fcmlwcGxlLnJlbW92ZUF0dHJpYnV0ZSgiY2hlY2tlZCIpKX0sX2J1dHRvblN0YXRlQ2hhbmdlZDpmdW5jdGlvbigpe1BvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvci5fYnV0dG9uU3RhdGVDaGFuZ2VkLmNhbGwodGhpcyk7IXRoaXMuZGlzYWJsZWQmJnRoaXMuaXNBdHRhY2hlZCYmKHRoaXMuY2hlY2tlZD10aGlzLmFjdGl2ZSl9fTsKUG9seW1lci5QYXBlckNoZWNrZWRFbGVtZW50QmVoYXZpb3I9W1BvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvcixQb2x5bWVyLklyb25DaGVja2VkRWxlbWVudEJlaGF2aW9yLFBvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItY2hlY2tib3gvcGFwZXItY2hlY2tib3guaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItY2hlY2tib3giLGJlaGF2aW9yczpbUG9seW1lci5QYXBlckNoZWNrZWRFbGVtZW50QmVoYXZpb3JdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJjaGVja2JveCIsImFyaWEtY2hlY2tlZCI6ITEsdGFiaW5kZXg6MH0scHJvcGVydGllczp7YXJpYUFjdGl2ZUF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImFyaWEtY2hlY2tlZCJ9fSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLGZ1bmN0aW9uKCl7aWYoIi0xcHgiPT09dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSIpLnRyaW0oKSl7dmFyIGE9dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplIikudHJpbSgpLGM9InB4IixkPWEubWF0Y2goL1tBLVphLXpdKyQvKTtudWxsIT09ZCYmKGM9ZFswXSk7YT1wYXJzZUZsb2F0KGEpOwpkPTgvMyphOyJweCI9PT1jJiYoZD1NYXRoLmZsb29yKGQpLGQlMiE9PWElMiYmZCsrKTt0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItY2hlY2tib3gtaW5rLXNpemUiOmQrY30pfX0pfSxfY29tcHV0ZUNoZWNrYm94Q2xhc3M6ZnVuY3Rpb24oYSxjKXt2YXIgZD0iIjthJiYoZCs9ImNoZWNrZWQgIik7YyYmKGQrPSJpbnZhbGlkIik7cmV0dXJuIGR9LF9jb21wdXRlQ2hlY2ttYXJrQ2xhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IiI6ImhpZGRlbiJ9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXt0aGlzLl9yaXBwbGVDb250YWluZXI9dGhpcy4kLmNoZWNrYm94Q29udGFpbmVyO3JldHVybiBQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3JJbXBsLl9jcmVhdGVSaXBwbGUuY2FsbCh0aGlzKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWljb24vaXJvbi1pY29uLmh0bWwuanMKUG9seW1lcih7aXM6Imlyb24taWNvbiIscHJvcGVydGllczp7aWNvbjp7dHlwZTpTdHJpbmd9LHRoZW1lOnt0eXBlOlN0cmluZ30sc3JjOnt0eXBlOlN0cmluZ30sX21ldGE6e3ZhbHVlOlBvbHltZXIuQmFzZS5jcmVhdGUoImlyb24tbWV0YSIse3R5cGU6Imljb25zZXQifSl9fSxvYnNlcnZlcnM6WyJfdXBkYXRlSWNvbihfbWV0YSwgaXNBdHRhY2hlZCkiLCJfdXBkYXRlSWNvbih0aGVtZSwgaXNBdHRhY2hlZCkiLCJfc3JjQ2hhbmdlZChzcmMsIGlzQXR0YWNoZWQpIiwiX2ljb25DaGFuZ2VkKGljb24sIGlzQXR0YWNoZWQpIl0sX0RFRkFVTFRfSUNPTlNFVDoiaWNvbnMiLF9pY29uQ2hhbmdlZDpmdW5jdGlvbihhKXthPShhfHwiIikuc3BsaXQoIjoiKTt0aGlzLl9pY29uTmFtZT1hLnBvcCgpO3RoaXMuX2ljb25zZXROYW1lPWEucG9wKCl8fHRoaXMuX0RFRkFVTFRfSUNPTlNFVDt0aGlzLl91cGRhdGVJY29uKCl9LF9zcmNDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSWNvbigpfSwKX3VzZXNJY29uc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWNvbnx8IXRoaXMuc3JjfSxfdXBkYXRlSWNvbjpmdW5jdGlvbigpe3RoaXMuX3VzZXNJY29uc2V0KCk/KHRoaXMuX2ltZyYmdGhpcy5faW1nLnBhcmVudE5vZGUmJlBvbHltZXIuZG9tKHRoaXMucm9vdCkucmVtb3ZlQ2hpbGQodGhpcy5faW1nKSwiIj09PXRoaXMuX2ljb25OYW1lP3RoaXMuX2ljb25zZXQmJnRoaXMuX2ljb25zZXQucmVtb3ZlSWNvbih0aGlzKTp0aGlzLl9pY29uc2V0TmFtZSYmdGhpcy5fbWV0YSYmKCh0aGlzLl9pY29uc2V0PXRoaXMuX21ldGEuYnlLZXkodGhpcy5faWNvbnNldE5hbWUpKT8odGhpcy5faWNvbnNldC5hcHBseUljb24odGhpcyx0aGlzLl9pY29uTmFtZSx0aGlzLnRoZW1lKSx0aGlzLnVubGlzdGVuKHdpbmRvdywiaXJvbi1pY29uc2V0LWFkZGVkIiwiX3VwZGF0ZUljb24iKSk6dGhpcy5saXN0ZW4od2luZG93LCJpcm9uLWljb25zZXQtYWRkZWQiLCJfdXBkYXRlSWNvbiIpKSk6KHRoaXMuX2ljb25zZXQmJgp0aGlzLl9pY29uc2V0LnJlbW92ZUljb24odGhpcyksdGhpcy5faW1nfHwodGhpcy5faW1nPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLHRoaXMuX2ltZy5zdHlsZS53aWR0aD0iMTAwJSIsdGhpcy5faW1nLnN0eWxlLmhlaWdodD0iMTAwJSIsdGhpcy5faW1nLmRyYWdnYWJsZT0hMSksdGhpcy5faW1nLnNyYz10aGlzLnNyYyxQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLmFwcGVuZENoaWxkKHRoaXMuX2ltZykpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tYTExeS1hbm5vdW5jZXIvaXJvbi1hMTF5LWFubm91bmNlci5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXI9ZnVuY3Rpb24oKXt9O1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXI9UG9seW1lcih7aXM6Imlyb24tYTExeS1hbm5vdW5jZXIiLHByb3BlcnRpZXM6e21vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJwb2xpdGUifSxfdGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZXx8KFBvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2U9dGhpcyk7ZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJpcm9uLWFubm91bmNlIix0aGlzLl9vbklyb25Bbm5vdW5jZS5iaW5kKHRoaXMpKX0sYW5ub3VuY2U6ZnVuY3Rpb24oYSl7dGhpcy5fdGV4dD0iIjt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fdGV4dD1hfSwxMDApfSxfb25Jcm9uQW5ub3VuY2U6ZnVuY3Rpb24oYSl7YS5kZXRhaWwmJmEuZGV0YWlsLnRleHQmJnRoaXMuYW5ub3VuY2UoYS5kZXRhaWwudGV4dCl9fSk7ClBvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2U9bnVsbDtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLnJlcXVlc3RBdmFpbGFiaWxpdHk9ZnVuY3Rpb24oKXtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLmluc3RhbmNlfHwoUG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpcm9uLWExMXktYW5ub3VuY2VyIikpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoUG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZSl9fSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWlucHV0L2lyb24taW5wdXQuaHRtbC5qcwpQb2x5bWVyKHtpczoiaXJvbi1pbnB1dCIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntiaW5kVmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSx2YWx1ZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlVmFsdWUoYmluZFZhbHVlKSJ9LGFsbG93ZWRQYXR0ZXJuOnt0eXBlOlN0cmluZ30sYXV0b1ZhbGlkYXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9pbnB1dEVsZW1lbnQ6T2JqZWN0fSxvYnNlcnZlcnM6WyJfYmluZFZhbHVlQ2hhbmdlZChiaW5kVmFsdWUsIF9pbnB1dEVsZW1lbnQpIl0sbGlzdGVuZXJzOntpbnB1dDoiX29uSW5wdXQiLGtleXByZXNzOiJfb25LZXlwcmVzcyJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLnJlcXVlc3RBdmFpbGFiaWxpdHkoKTt0aGlzLl9wcmV2aW91c1ZhbGlkSW5wdXQ9IiI7dGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkPSExfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPQpQb2x5bWVyLmRvbSh0aGlzKS5vYnNlcnZlTm9kZXMoZnVuY3Rpb24oKXt0aGlzLl9pbml0U2xvdHRlZElucHV0KCl9LmJpbmQodGhpcykpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiYoUG9seW1lci5kb20odGhpcykudW5vYnNlcnZlTm9kZXModGhpcy5fb2JzZXJ2ZXIpLHRoaXMuX29ic2VydmVyPW51bGwpfSxnZXQgaW5wdXRFbGVtZW50KCl7cmV0dXJuIHRoaXMuX2lucHV0RWxlbWVudH0sX2luaXRTbG90dGVkSW5wdXQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dEVsZW1lbnQ9dGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpWzBdO3RoaXMuaW5wdXRFbGVtZW50JiZ0aGlzLmlucHV0RWxlbWVudC52YWx1ZSYmKHRoaXMuYmluZFZhbHVlPXRoaXMuaW5wdXRFbGVtZW50LnZhbHVlKTt0aGlzLmZpcmUoImlyb24taW5wdXQtcmVhZHkiKX0sZ2V0IF9wYXR0ZXJuUmVnRXhwKCl7aWYodGhpcy5hbGxvd2VkUGF0dGVybil2YXIgYT1uZXcgUmVnRXhwKHRoaXMuYWxsb3dlZFBhdHRlcm4pOwplbHNlIHN3aXRjaCh0aGlzLmlucHV0RWxlbWVudC50eXBlKXtjYXNlICJudW1iZXIiOmE9L1swLTkuLGUtXS99cmV0dXJuIGF9LF9iaW5kVmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7YyYmKHZvaWQgMD09PWE/Yy52YWx1ZT1udWxsOmEhPT1jLnZhbHVlJiYodGhpcy5pbnB1dEVsZW1lbnQudmFsdWU9YSksdGhpcy5hdXRvVmFsaWRhdGUmJnRoaXMudmFsaWRhdGUoKSx0aGlzLmZpcmUoImJpbmQtdmFsdWUtY2hhbmdlZCIse3ZhbHVlOmF9KSl9LF9vbklucHV0OmZ1bmN0aW9uKCl7IXRoaXMuYWxsb3dlZFBhdHRlcm58fHRoaXMuX3BhdHRlcm5BbHJlYWR5Q2hlY2tlZHx8dGhpcy5fY2hlY2tQYXR0ZXJuVmFsaWRpdHkoKXx8KHRoaXMuX2Fubm91bmNlSW52YWxpZENoYXJhY3RlcigiSW52YWxpZCBzdHJpbmcgb2YgY2hhcmFjdGVycyBub3QgZW50ZXJlZC4iKSx0aGlzLmlucHV0RWxlbWVudC52YWx1ZT10aGlzLl9wcmV2aW91c1ZhbGlkSW5wdXQpO3RoaXMuYmluZFZhbHVlPXRoaXMuX3ByZXZpb3VzVmFsaWRJbnB1dD0KdGhpcy5pbnB1dEVsZW1lbnQudmFsdWU7dGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkPSExfSxfaXNQcmludGFibGU6ZnVuY3Rpb24oYSl7dmFyIGM9MTk9PWEua2V5Q29kZXx8MjA9PWEua2V5Q29kZXx8NDU9PWEua2V5Q29kZXx8NDY9PWEua2V5Q29kZXx8MTQ0PT1hLmtleUNvZGV8fDE0NT09YS5rZXlDb2RlfHwzMjxhLmtleUNvZGUmJjQxPmEua2V5Q29kZXx8MTExPGEua2V5Q29kZSYmMTI0PmEua2V5Q29kZTtyZXR1cm4hKDg9PWEua2V5Q29kZXx8OT09YS5rZXlDb2RlfHwxMz09YS5rZXlDb2RlfHwyNz09YS5rZXlDb2RlKSYmISgwPT1hLmNoYXJDb2RlJiZjKX0sX29uS2V5cHJlc3M6ZnVuY3Rpb24oYSl7aWYodGhpcy5hbGxvd2VkUGF0dGVybnx8Im51bWJlciI9PT10aGlzLmlucHV0RWxlbWVudC50eXBlKXt2YXIgYz10aGlzLl9wYXR0ZXJuUmVnRXhwO2lmKGMmJiEoYS5tZXRhS2V5fHxhLmN0cmxLZXl8fGEuYWx0S2V5KSl7dGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkPQohMDt2YXIgZD1TdHJpbmcuZnJvbUNoYXJDb2RlKGEuY2hhckNvZGUpO3RoaXMuX2lzUHJpbnRhYmxlKGEpJiYhYy50ZXN0KGQpJiYoYS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2Fubm91bmNlSW52YWxpZENoYXJhY3RlcigiSW52YWxpZCBjaGFyYWN0ZXIgIitkKyIgbm90IGVudGVyZWQuIikpfX19LF9jaGVja1BhdHRlcm5WYWxpZGl0eTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX3BhdHRlcm5SZWdFeHA7aWYoIWEpcmV0dXJuITA7Zm9yKHZhciBjPTA7Yzx0aGlzLmlucHV0RWxlbWVudC52YWx1ZS5sZW5ndGg7YysrKWlmKCFhLnRlc3QodGhpcy5pbnB1dEVsZW1lbnQudmFsdWVbY10pKXJldHVybiExO3JldHVybiEwfSx2YWxpZGF0ZTpmdW5jdGlvbigpe2lmKCF0aGlzLmlucHV0RWxlbWVudClyZXR1cm4gdGhpcy5pbnZhbGlkPSExLCEwO3ZhciBhPXRoaXMuaW5wdXRFbGVtZW50LmNoZWNrVmFsaWRpdHkoKTthJiYodGhpcy5yZXF1aXJlZCYmIiI9PT10aGlzLmJpbmRWYWx1ZT9hPSExOgp0aGlzLmhhc1ZhbGlkYXRvcigpJiYoYT1Qb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yLnZhbGlkYXRlLmNhbGwodGhpcyx0aGlzLmJpbmRWYWx1ZSkpKTt0aGlzLmludmFsaWQ9IWE7dGhpcy5maXJlKCJpcm9uLWlucHV0LXZhbGlkYXRlIik7cmV0dXJuIGF9LF9hbm5vdW5jZUludmFsaWRDaGFyYWN0ZXI6ZnVuY3Rpb24oYSl7dGhpcy5maXJlKCJpcm9uLWFubm91bmNlIix7dGV4dDphfSl9LF9jb21wdXRlVmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVySW5wdXRIZWxwZXI9e307UG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRMYWJlbElEPTE7UG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRBZGRvbklEPTE7UG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRJbnB1dElEPTE7ClBvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7bGFiZWw6e3R5cGU6U3RyaW5nfSx2YWx1ZTp7bm90aWZ5OiEwLHR5cGU6U3RyaW5nfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbnZhbGlkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxhbGxvd2VkUGF0dGVybjp7dHlwZTpTdHJpbmd9LHR5cGU6e3R5cGU6U3RyaW5nfSxsaXN0Ont0eXBlOlN0cmluZ30scGF0dGVybjp7dHlwZTpTdHJpbmd9LHJlcXVpcmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGVycm9yTWVzc2FnZTp7dHlwZTpTdHJpbmd9LGNoYXJDb3VudGVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vTGFiZWxGbG9hdDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbHdheXNGbG9hdExhYmVsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGF1dG9WYWxpZGF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx2YWxpZGF0b3I6e3R5cGU6U3RyaW5nfSxhdXRvY29tcGxldGU6e3R5cGU6U3RyaW5nLAp2YWx1ZToib2ZmIn0sYXV0b2ZvY3VzOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9hdXRvZm9jdXNDaGFuZ2VkIn0saW5wdXRtb2RlOnt0eXBlOlN0cmluZ30sbWlubGVuZ3RoOnt0eXBlOk51bWJlcn0sbWF4bGVuZ3RoOnt0eXBlOk51bWJlcn0sbWluOnt0eXBlOlN0cmluZ30sbWF4Ont0eXBlOlN0cmluZ30sc3RlcDp7dHlwZTpTdHJpbmd9LG5hbWU6e3R5cGU6U3RyaW5nfSxwbGFjZWhvbGRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LHJlYWRvbmx5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNpemU6e3R5cGU6TnVtYmVyfSxhdXRvY2FwaXRhbGl6ZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im5vbmUifSxhdXRvY29ycmVjdDp7dHlwZTpTdHJpbmcsdmFsdWU6Im9mZiJ9LGF1dG9zYXZlOnt0eXBlOlN0cmluZ30scmVzdWx0czp7dHlwZTpOdW1iZXJ9LGFjY2VwdDp7dHlwZTpTdHJpbmd9LG11bHRpcGxlOnt0eXBlOkJvb2xlYW59LF9hcmlhRGVzY3JpYmVkQnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSwKX2FyaWFMYWJlbGxlZEJ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2lucHV0SWQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sbGlzdGVuZXJzOnsiYWRkb24tYXR0YWNoZWQiOiJfb25BZGRvbkF0dGFjaGVkIn0sa2V5QmluZGluZ3M6eyJzaGlmdCt0YWI6a2V5ZG93biI6Il9vblNoaWZ0VGFiRG93biJ9LGhvc3RBdHRyaWJ1dGVzOnt0YWJpbmRleDowfSxnZXQgaW5wdXRFbGVtZW50KCl7dGhpcy4kfHwodGhpcy4kPXt9KTt0aGlzLiQuaW5wdXR8fCh0aGlzLl9nZW5lcmF0ZUlucHV0SWQoKSx0aGlzLiQuaW5wdXQ9dGhpcy4kJCgiIyIrdGhpcy5faW5wdXRJZCkpO3JldHVybiB0aGlzLiQuaW5wdXR9LGdldCBfZm9jdXNhYmxlRWxlbWVudCgpe3JldHVybiB0aGlzLmlucHV0RWxlbWVudH0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX3R5cGVzVGhhdEhhdmVUZXh0PSJkYXRlIGRhdGV0aW1lIGRhdGV0aW1lLWxvY2FsIG1vbnRoIHRpbWUgd2VlayBmaWxlIi5zcGxpdCgiICIpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUFyaWFMYWJlbGxlZEJ5KCk7CiFQb2x5bWVyLkVsZW1lbnQmJnRoaXMuaW5wdXRFbGVtZW50JiYtMSE9PXRoaXMuX3R5cGVzVGhhdEhhdmVUZXh0LmluZGV4T2YodGhpcy5pbnB1dEVsZW1lbnQudHlwZSkmJih0aGlzLmFsd2F5c0Zsb2F0TGFiZWw9ITApfSxfYXBwZW5kU3RyaW5nV2l0aFNwYWNlOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGE/YSsiICIrYzpjfSxfb25BZGRvbkF0dGFjaGVkOmZ1bmN0aW9uKGEpe2E9UG9seW1lci5kb20oYSkucm9vdFRhcmdldDtpZihhLmlkKXRoaXMuX2FyaWFEZXNjcmliZWRCeT10aGlzLl9hcHBlbmRTdHJpbmdXaXRoU3BhY2UodGhpcy5fYXJpYURlc2NyaWJlZEJ5LGEuaWQpO2Vsc2V7dmFyIGM9InBhcGVyLWlucHV0LWFkZC1vbi0iK1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0QWRkb25JRCsrO2EuaWQ9Yzt0aGlzLl9hcmlhRGVzY3JpYmVkQnk9dGhpcy5fYXBwZW5kU3RyaW5nV2l0aFNwYWNlKHRoaXMuX2FyaWFEZXNjcmliZWRCeSxjKX19LHZhbGlkYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5wdXRFbGVtZW50LnZhbGlkYXRlKCl9LApfZm9jdXNCbHVySGFuZGxlcjpmdW5jdGlvbihhKXtQb2x5bWVyLklyb25Db250cm9sU3RhdGUuX2ZvY3VzQmx1ckhhbmRsZXIuY2FsbCh0aGlzLGEpO3RoaXMuZm9jdXNlZCYmIXRoaXMuX3NoaWZ0VGFiUHJlc3NlZCYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudCYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudC5mb2N1cygpfSxfb25TaGlmdFRhYkRvd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKTt0aGlzLl9zaGlmdFRhYlByZXNzZWQ9ITA7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKTt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IixhKTt0aGlzLl9zaGlmdFRhYlByZXNzZWQ9ITF9LDEpfSxfaGFuZGxlQXV0b1ZhbGlkYXRlOmZ1bmN0aW9uKCl7dGhpcy5hdXRvVmFsaWRhdGUmJnRoaXMudmFsaWRhdGUoKX0sdXBkYXRlVmFsdWVBbmRQcmVzZXJ2ZUNhcmV0OmZ1bmN0aW9uKGEpe3RyeXt2YXIgYz0KdGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uU3RhcnQ7dGhpcy52YWx1ZT1hO3RoaXMuaW5wdXRFbGVtZW50LnNlbGVjdGlvblN0YXJ0PWM7dGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uRW5kPWN9Y2F0Y2goZCl7dGhpcy52YWx1ZT1hfX0sX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGN8fGF9LF91cGRhdGVBcmlhTGFiZWxsZWRCeTpmdW5jdGlvbigpe3ZhciBhPVBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvcigibGFiZWwiKTtpZihhKXtpZihhLmlkKXZhciBjPWEuaWQ7ZWxzZSBjPSJwYXBlci1pbnB1dC1sYWJlbC0iK1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0TGFiZWxJRCsrLGEuaWQ9Yzt0aGlzLl9hcmlhTGFiZWxsZWRCeT1jfWVsc2UgdGhpcy5fYXJpYUxhYmVsbGVkQnk9IiJ9LF9nZW5lcmF0ZUlucHV0SWQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dElkJiYiIiE9PXRoaXMuX2lucHV0SWR8fCh0aGlzLl9pbnB1dElkPQoiaW5wdXQtIitQb2x5bWVyLlBhcGVySW5wdXRIZWxwZXIuTmV4dElucHV0SUQrKyl9LF9vbkNoYW5nZTpmdW5jdGlvbihhKXt0aGlzLnNoYWRvd1Jvb3QmJnRoaXMuZmlyZShhLnR5cGUse3NvdXJjZUV2ZW50OmF9LHtub2RlOnRoaXMsYnViYmxlczphLmJ1YmJsZXMsY2FuY2VsYWJsZTphLmNhbmNlbGFibGV9KX0sX2F1dG9mb2N1c0NoYW5nZWQ6ZnVuY3Rpb24oKXtpZih0aGlzLmF1dG9mb2N1cyYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudCl7dmFyIGE9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDthIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJmEhPT1kb2N1bWVudC5ib2R5JiZhIT09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx0aGlzLl9mb2N1c2FibGVFbGVtZW50LmZvY3VzKCl9fX07UG9seW1lci5QYXBlcklucHV0QmVoYXZpb3I9W1BvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLFBvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtYWRkb24tYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVySW5wdXRBZGRvbkJlaGF2aW9yPXthdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuZmlyZSgiYWRkb24tYXR0YWNoZWQiKX0sdXBkYXRlOmZ1bmN0aW9uKCl7fX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtY2hhci1jb3VudGVyLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWlucHV0LWNoYXItY291bnRlciIsYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVySW5wdXRBZGRvbkJlaGF2aW9yXSxwcm9wZXJ0aWVzOntfY2hhckNvdW50ZXJTdHI6e3R5cGU6U3RyaW5nLHZhbHVlOiIwIn19LHVwZGF0ZTpmdW5jdGlvbihhKXtpZihhLmlucHV0RWxlbWVudCl7YS52YWx1ZT1hLnZhbHVlfHwiIjt2YXIgYz1hLnZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoLnRvU3RyaW5nKCk7YS5pbnB1dEVsZW1lbnQuaGFzQXR0cmlidXRlKCJtYXhsZW5ndGgiKSYmKGMrPSIvIithLmlucHV0RWxlbWVudC5nZXRBdHRyaWJ1dGUoIm1heGxlbmd0aCIpKTt0aGlzLl9jaGFyQ291bnRlclN0cj1jfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1pbnB1dC9wYXBlci1pbnB1dC1jb250YWluZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaW5wdXQtY29udGFpbmVyIixwcm9wZXJ0aWVzOntub0xhYmVsRmxvYXQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYWx3YXlzRmxvYXRMYWJlbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhdHRyRm9yVmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiJiaW5kLXZhbHVlIn0sYXV0b1ZhbGlkYXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGludmFsaWQ6e29ic2VydmVyOiJfaW52YWxpZENoYW5nZWQiLHR5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZm9jdXNlZDp7cmVhZE9ubHk6ITAsdHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sX2FkZG9uczp7dHlwZTpBcnJheX0sX2lucHV0SGFzQ29udGVudDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaW5wdXRTZWxlY3Rvcjp7dHlwZTpTdHJpbmcsdmFsdWU6ImlucHV0LGlyb24taW5wdXQsdGV4dGFyZWEsLnBhcGVyLWlucHV0LWlucHV0In0sX2JvdW5kT25Gb2N1czp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbkZvY3VzLmJpbmQodGhpcyl9fSwKX2JvdW5kT25CbHVyOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uQmx1ci5iaW5kKHRoaXMpfX0sX2JvdW5kT25JbnB1dDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbklucHV0LmJpbmQodGhpcyl9fSxfYm91bmRWYWx1ZUNoYW5nZWQ6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25WYWx1ZUNoYW5nZWQuYmluZCh0aGlzKX19fSxsaXN0ZW5lcnM6eyJhZGRvbi1hdHRhY2hlZCI6Il9vbkFkZG9uQXR0YWNoZWQiLCJpcm9uLWlucHV0LXZhbGlkYXRlIjoiX29uSXJvbklucHV0VmFsaWRhdGUifSxnZXQgX3ZhbHVlQ2hhbmdlZEV2ZW50KCl7cmV0dXJuIHRoaXMuYXR0ckZvclZhbHVlKyItY2hhbmdlZCJ9LGdldCBfcHJvcGVydHlGb3JWYWx1ZSgpe3JldHVybiBQb2x5bWVyLkNhc2VNYXAuZGFzaFRvQ2FtZWxDYXNlKHRoaXMuYXR0ckZvclZhbHVlKX0sZ2V0IF9pbnB1dEVsZW1lbnQoKXtyZXR1cm4gUG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3Rvcih0aGlzLl9pbnB1dFNlbGVjdG9yKX0sCmdldCBfaW5wdXRFbGVtZW50VmFsdWUoKXtyZXR1cm4gdGhpcy5faW5wdXRFbGVtZW50W3RoaXMuX3Byb3BlcnR5Rm9yVmFsdWVdfHx0aGlzLl9pbnB1dEVsZW1lbnQudmFsdWV9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fX2lzRmlyc3RWYWx1ZVVwZGF0ZT0hMDt0aGlzLl9hZGRvbnN8fCh0aGlzLl9hZGRvbnM9W10pO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2JvdW5kT25Gb2N1cywhMCk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9ib3VuZE9uQmx1ciwhMCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5hdHRyRm9yVmFsdWU/dGhpcy5faW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5fdmFsdWVDaGFuZ2VkRXZlbnQsdGhpcy5fYm91bmRWYWx1ZUNoYW5nZWQpOnRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLHRoaXMuX29uSW5wdXQpO3RoaXMuX2lucHV0RWxlbWVudFZhbHVlJiYiIiE9dGhpcy5faW5wdXRFbGVtZW50VmFsdWU/CnRoaXMuX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlKHRoaXMuX2lucHV0RWxlbWVudCk6dGhpcy5faGFuZGxlVmFsdWUodGhpcy5faW5wdXRFbGVtZW50KX0sX29uQWRkb25BdHRhY2hlZDpmdW5jdGlvbihhKXt0aGlzLl9hZGRvbnN8fCh0aGlzLl9hZGRvbnM9W10pO2E9YS50YXJnZXQ7LTE9PT10aGlzLl9hZGRvbnMuaW5kZXhPZihhKSYmKHRoaXMuX2FkZG9ucy5wdXNoKGEpLHRoaXMuaXNBdHRhY2hlZCYmdGhpcy5faGFuZGxlVmFsdWUodGhpcy5faW5wdXRFbGVtZW50KSl9LF9vbkZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Rm9jdXNlZCghMCl9LF9vbkJsdXI6ZnVuY3Rpb24oKXt0aGlzLl9zZXRGb2N1c2VkKCExKTt0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZSh0aGlzLl9pbnB1dEVsZW1lbnQpfSxfb25JbnB1dDpmdW5jdGlvbihhKXt0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZShhLnRhcmdldCl9LF9vblZhbHVlQ2hhbmdlZDpmdW5jdGlvbihhKXt2YXIgYz0KYS50YXJnZXQ7aWYodGhpcy5fX2lzRmlyc3RWYWx1ZVVwZGF0ZSYmKHRoaXMuX19pc0ZpcnN0VmFsdWVVcGRhdGU9ITEsdm9pZCAwPT09Yy52YWx1ZXx8IiI9PT1jLnZhbHVlKSlyZXR1cm47dGhpcy5faGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGUoYS50YXJnZXQpfSxfaGFuZGxlVmFsdWU6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5faW5wdXRFbGVtZW50VmFsdWU7Y3x8MD09PWN8fCJudW1iZXIiPT09YS50eXBlJiYhYS5jaGVja1ZhbGlkaXR5KCk/dGhpcy5faW5wdXRIYXNDb250ZW50PSEwOnRoaXMuX2lucHV0SGFzQ29udGVudD0hMTt0aGlzLnVwZGF0ZUFkZG9ucyh7aW5wdXRFbGVtZW50OmEsdmFsdWU6YyxpbnZhbGlkOnRoaXMuaW52YWxpZH0pfSxfaGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGU6ZnVuY3Rpb24oYSl7dGhpcy5hdXRvVmFsaWRhdGUmJmEmJih0aGlzLmludmFsaWQ9IShhLnZhbGlkYXRlP2EudmFsaWRhdGUodGhpcy5faW5wdXRFbGVtZW50VmFsdWUpOmEuY2hlY2tWYWxpZGl0eSgpKSk7CnRoaXMuX2hhbmRsZVZhbHVlKGEpfSxfb25Jcm9uSW5wdXRWYWxpZGF0ZTpmdW5jdGlvbigpe3RoaXMuaW52YWxpZD10aGlzLl9pbnB1dEVsZW1lbnQuaW52YWxpZH0sX2ludmFsaWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fYWRkb25zJiZ0aGlzLnVwZGF0ZUFkZG9ucyh7aW52YWxpZDp0aGlzLmludmFsaWR9KX0sdXBkYXRlQWRkb25zOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPTA7Yz10aGlzLl9hZGRvbnNbZF07ZCsrKWMudXBkYXRlKGEpfSxfY29tcHV0ZUlucHV0Q29udGVudENsYXNzOmZ1bmN0aW9uKGEsYyxkLGYsZyl7dmFyIGw9ImlucHV0LWNvbnRlbnQiO2E/KGcmJihsKz0iIGxhYmVsLWlzLWhpZGRlbiIpLGYmJihsKz0iIGlzLWludmFsaWQiKSk6KGE9dGhpcy5xdWVyeVNlbGVjdG9yKCJsYWJlbCIpLGN8fGc/KGwrPSIgbGFiZWwtaXMtZmxvYXRpbmciLHRoaXMuJC5sYWJlbEFuZElucHV0Q29udGFpbmVyLnN0eWxlLnBvc2l0aW9uPSJzdGF0aWMiLGY/bCs9IiBpcy1pbnZhbGlkIjoKZCYmKGwrPSIgbGFiZWwtaXMtaGlnaGxpZ2h0ZWQiKSk6KGEmJih0aGlzLiQubGFiZWxBbmRJbnB1dENvbnRhaW5lci5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxmJiYobCs9IiBpcy1pbnZhbGlkIikpKTtkJiYobCs9IiBmb2N1c2VkIik7cmV0dXJuIGx9LF9jb21wdXRlVW5kZXJsaW5lQ2xhc3M6ZnVuY3Rpb24oYSxjKXt2YXIgZD0idW5kZXJsaW5lIjtjP2QrPSIgaXMtaW52YWxpZCI6YSYmKGQrPSIgaXMtaGlnaGxpZ2h0ZWQiKTtyZXR1cm4gZH0sX2NvbXB1dGVBZGRPbkNvbnRlbnRDbGFzczpmdW5jdGlvbihhLGMpe3ZhciBkPSJhZGQtb24tY29udGVudCI7Yz9kKz0iIGlzLWludmFsaWQiOmEmJihkKz0iIGlzLWhpZ2hsaWdodGVkIik7cmV0dXJuIGR9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtZXJyb3IuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaW5wdXQtZXJyb3IiLGJlaGF2aW9yczpbUG9seW1lci5QYXBlcklucHV0QWRkb25CZWhhdmlvcl0scHJvcGVydGllczp7aW52YWxpZDp7cmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbn19LHVwZGF0ZTpmdW5jdGlvbihhKXt0aGlzLl9zZXRJbnZhbGlkKGEuaW52YWxpZCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaW5wdXQiLGJlaGF2aW9yczpbUG9seW1lci5QYXBlcklucHV0QmVoYXZpb3IsUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcl0scHJvcGVydGllczp7dmFsdWU6e3R5cGU6U3RyaW5nfX0sYmVmb3JlUmVnaXN0ZXI6ZnVuY3Rpb24oKXt2YXIgYT0iZnVuY3Rpb24iPT10eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaXJvbi1pbnB1dCIpLl9pbml0U2xvdHRlZElucHV0PyJ2MSI6InYwIixjPVBvbHltZXIuRG9tTW9kdWxlLmltcG9ydCgicGFwZXItaW5wdXQiLCJ0ZW1wbGF0ZSIpO2E9UG9seW1lci5Eb21Nb2R1bGUuaW1wb3J0KCJwYXBlci1pbnB1dCIsInRlbXBsYXRlIyIrYSk7KGM9Yy5jb250ZW50LnF1ZXJ5U2VsZWN0b3IoIiN0ZW1wbGF0ZS1wbGFjZWhvbGRlciIpKSYmYy5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChhLmNvbnRlbnQsYyl9LGdldCBfZm9jdXNhYmxlRWxlbWVudCgpe3JldHVybiBQb2x5bWVyLkVsZW1lbnQ/dGhpcy5pbnB1dEVsZW1lbnQuX2lucHV0RWxlbWVudDoKdGhpcy5pbnB1dEVsZW1lbnR9LGxpc3RlbmVyczp7Imlyb24taW5wdXQtcmVhZHkiOiJfb25Jcm9uSW5wdXRSZWFkeSJ9LF9vbklyb25JbnB1dFJlYWR5OmZ1bmN0aW9uKCl7dGhpcy4kLm5hdGl2ZUlucHV0fHwodGhpcy4kLm5hdGl2ZUlucHV0PXRoaXMuJCQoImlucHV0IikpO3RoaXMuaW5wdXRFbGVtZW50JiYtMSE9PXRoaXMuX3R5cGVzVGhhdEhhdmVUZXh0LmluZGV4T2YodGhpcy4kLm5hdGl2ZUlucHV0LnR5cGUpJiYodGhpcy5hbHdheXNGbG9hdExhYmVsPSEwKTt0aGlzLmlucHV0RWxlbWVudC5iaW5kVmFsdWUmJnRoaXMuJC5jb250YWluZXIuX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlKHRoaXMuaW5wdXRFbGVtZW50KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWZpdC1iZWhhdmlvci9pcm9uLWZpdC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvbkZpdEJlaGF2aW9yPXtwcm9wZXJ0aWVzOntzaXppbmdUYXJnZXQ6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSxmaXRJbnRvOnt0eXBlOk9iamVjdCx2YWx1ZTp3aW5kb3d9LG5vT3ZlcmxhcDp7dHlwZTpCb29sZWFufSxwb3NpdGlvblRhcmdldDp7dHlwZTpFbGVtZW50fSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nfSx2ZXJ0aWNhbEFsaWduOnt0eXBlOlN0cmluZ30sZHluYW1pY0FsaWduOnt0eXBlOkJvb2xlYW59LGhvcml6b250YWxPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSx2ZXJ0aWNhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LGF1dG9GaXRPbkF0dGFjaDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfZml0SW5mbzp7dHlwZTpPYmplY3R9fSxnZXQgX2ZpdFdpZHRoKCl7cmV0dXJuIHRoaXMuZml0SW50bz09PXdpbmRvdz90aGlzLmZpdEludG8uaW5uZXJXaWR0aDp0aGlzLmZpdEludG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGh9LApnZXQgX2ZpdEhlaWdodCgpe3JldHVybiB0aGlzLmZpdEludG89PT13aW5kb3c/dGhpcy5maXRJbnRvLmlubmVySGVpZ2h0OnRoaXMuZml0SW50by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHR9LGdldCBfZml0TGVmdCgpe3JldHVybiB0aGlzLmZpdEludG89PT13aW5kb3c/MDp0aGlzLmZpdEludG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0sZ2V0IF9maXRUb3AoKXtyZXR1cm4gdGhpcy5maXRJbnRvPT09d2luZG93PzA6dGhpcy5maXRJbnRvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcH0sZ2V0IF9kZWZhdWx0UG9zaXRpb25UYXJnZXQoKXt2YXIgYT1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlO2EmJmEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJihhPWEuaG9zdCk7cmV0dXJuIGF9LGdldCBfbG9jYWxlSG9yaXpvbnRhbEFsaWduKCl7aWYodGhpcy5faXNSVEwpe2lmKCJyaWdodCI9PT10aGlzLmhvcml6b250YWxBbGlnbilyZXR1cm4ibGVmdCI7CmlmKCJsZWZ0Ij09PXRoaXMuaG9yaXpvbnRhbEFsaWduKXJldHVybiJyaWdodCJ9cmV0dXJuIHRoaXMuaG9yaXpvbnRhbEFsaWdufSxnZXQgX19zaG91bGRQb3NpdGlvbigpe3JldHVybih0aGlzLmhvcml6b250YWxBbGlnbnx8dGhpcy52ZXJ0aWNhbEFsaWduKSYmdGhpcy5wb3NpdGlvblRhcmdldH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXsidW5kZWZpbmVkIj09PXR5cGVvZiB0aGlzLl9pc1JUTCYmKHRoaXMuX2lzUlRMPSJydGwiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKS5kaXJlY3Rpb24pO3RoaXMucG9zaXRpb25UYXJnZXQ9dGhpcy5wb3NpdGlvblRhcmdldHx8dGhpcy5fZGVmYXVsdFBvc2l0aW9uVGFyZ2V0O3RoaXMuYXV0b0ZpdE9uQXR0YWNoJiYoIm5vbmUiPT09d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcykuZGlzcGxheT9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5maXQoKX0uYmluZCh0aGlzKSk6KHdpbmRvdy5TaGFkeURPTSYmU2hhZHlET00uZmx1c2goKSwKdGhpcy5maXQoKSkpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX19kZWZlcnJlZEZpdCYmKGNsZWFyVGltZW91dCh0aGlzLl9fZGVmZXJyZWRGaXQpLHRoaXMuX19kZWZlcnJlZEZpdD1udWxsKX0sZml0OmZ1bmN0aW9uKCl7dGhpcy5wb3NpdGlvbigpO3RoaXMuY29uc3RyYWluKCk7dGhpcy5jZW50ZXIoKX0sX2Rpc2NvdmVySW5mbzpmdW5jdGlvbigpe2lmKCF0aGlzLl9maXRJbmZvKXt2YXIgYT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKSxjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuc2l6aW5nVGFyZ2V0KTt0aGlzLl9maXRJbmZvPXtpbmxpbmVTdHlsZTp7dG9wOnRoaXMuc3R5bGUudG9wfHwiIixsZWZ0OnRoaXMuc3R5bGUubGVmdHx8IiIscG9zaXRpb246dGhpcy5zdHlsZS5wb3NpdGlvbnx8IiJ9LHNpemVySW5saW5lU3R5bGU6e21heFdpZHRoOnRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLm1heFdpZHRofHwiIixtYXhIZWlnaHQ6dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUubWF4SGVpZ2h0fHwKIiIsYm94U2l6aW5nOnRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLmJveFNpemluZ3x8IiJ9LHBvc2l0aW9uZWRCeTp7dmVydGljYWxseToiYXV0byIhPT1hLnRvcD8idG9wIjoiYXV0byIhPT1hLmJvdHRvbT8iYm90dG9tIjpudWxsLGhvcml6b250YWxseToiYXV0byIhPT1hLmxlZnQ/ImxlZnQiOiJhdXRvIiE9PWEucmlnaHQ/InJpZ2h0IjpudWxsfSxzaXplZEJ5OntoZWlnaHQ6Im5vbmUiIT09Yy5tYXhIZWlnaHQsd2lkdGg6Im5vbmUiIT09Yy5tYXhXaWR0aCxtaW5XaWR0aDpwYXJzZUludChjLm1pbldpZHRoLDEwKXx8MCxtaW5IZWlnaHQ6cGFyc2VJbnQoYy5taW5IZWlnaHQsMTApfHwwfSxtYXJnaW46e3RvcDpwYXJzZUludChhLm1hcmdpblRvcCwxMCl8fDAscmlnaHQ6cGFyc2VJbnQoYS5tYXJnaW5SaWdodCwxMCl8fDAsYm90dG9tOnBhcnNlSW50KGEubWFyZ2luQm90dG9tLDEwKXx8MCxsZWZ0OnBhcnNlSW50KGEubWFyZ2luTGVmdCwxMCl8fDB9fX19LHJlc2V0Rml0OmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuX2ZpdEluZm98fHt9LGM7Zm9yKGMgaW4gYS5zaXplcklubGluZVN0eWxlKXRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlW2NdPWEuc2l6ZXJJbmxpbmVTdHlsZVtjXTtmb3IoYyBpbiBhLmlubGluZVN0eWxlKXRoaXMuc3R5bGVbY109YS5pbmxpbmVTdHlsZVtjXTt0aGlzLl9maXRJbmZvPW51bGx9LHJlZml0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsTGVmdCxjPXRoaXMuc2l6aW5nVGFyZ2V0LnNjcm9sbFRvcDt0aGlzLnJlc2V0Rml0KCk7dGhpcy5maXQoKTt0aGlzLnNpemluZ1RhcmdldC5zY3JvbGxMZWZ0PWE7dGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsVG9wPWN9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpcy5fX3Nob3VsZFBvc2l0aW9uKXt0aGlzLl9kaXNjb3ZlckluZm8oKTt0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCI7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Ijt0aGlzLnN0eWxlLmxlZnQ9IjBweCI7CnRoaXMuc3R5bGUudG9wPSIwcHgiO3ZhciBhPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz10aGlzLl9fZ2V0Tm9ybWFsaXplZFJlY3QodGhpcy5wb3NpdGlvblRhcmdldCksZD10aGlzLl9fZ2V0Tm9ybWFsaXplZFJlY3QodGhpcy5maXRJbnRvKSxmPXRoaXMuX2ZpdEluZm8ubWFyZ2luLGc9dGhpcy5fX2dldFBvc2l0aW9uKHRoaXMuX2xvY2FsZUhvcml6b250YWxBbGlnbix0aGlzLnZlcnRpY2FsQWxpZ24se3dpZHRoOmEud2lkdGgrZi5sZWZ0K2YucmlnaHQsaGVpZ2h0OmEuaGVpZ2h0K2YudG9wK2YuYm90dG9tfSxhLGMsZCk7Yz1nLmxlZnQrZi5sZWZ0O2c9Zy50b3ArZi50b3A7dmFyIGw9TWF0aC5taW4oZC5yaWdodC1mLnJpZ2h0LGMrYS53aWR0aCksaz1NYXRoLm1pbihkLmJvdHRvbS1mLmJvdHRvbSxnK2EuaGVpZ2h0KTtjPU1hdGgubWF4KGQubGVmdCtmLmxlZnQsTWF0aC5taW4oYyxsLXRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5XaWR0aCkpO2c9TWF0aC5tYXgoZC50b3ArCmYudG9wLE1hdGgubWluKGcsay10aGlzLl9maXRJbmZvLnNpemVkQnkubWluSGVpZ2h0KSk7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUubWF4V2lkdGg9TWF0aC5tYXgobC1jLHRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5XaWR0aCkrInB4Ijt0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5tYXhIZWlnaHQ9TWF0aC5tYXgoay1nLHRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5IZWlnaHQpKyJweCI7dGhpcy5zdHlsZS5sZWZ0PWMtYS5sZWZ0KyJweCI7dGhpcy5zdHlsZS50b3A9Zy1hLnRvcCsicHgifX0sY29uc3RyYWluOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19zaG91bGRQb3NpdGlvbil7dGhpcy5fZGlzY292ZXJJbmZvKCk7dmFyIGE9dGhpcy5fZml0SW5mbzthLnBvc2l0aW9uZWRCeS52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLHRoaXMuc3R5bGUudG9wPSIwcHgiKTthLnBvc2l0aW9uZWRCeS5ob3Jpem9udGFsbHl8fCh0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsCnRoaXMuc3R5bGUubGVmdD0iMHB4Iik7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Ijt2YXIgYz10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Euc2l6ZWRCeS5oZWlnaHR8fHRoaXMuX19zaXplRGltZW5zaW9uKGMsYS5wb3NpdGlvbmVkQnkudmVydGljYWxseSwidG9wIiwiYm90dG9tIiwiSGVpZ2h0Iik7YS5zaXplZEJ5LndpZHRofHx0aGlzLl9fc2l6ZURpbWVuc2lvbihjLGEucG9zaXRpb25lZEJ5Lmhvcml6b250YWxseSwibGVmdCIsInJpZ2h0IiwiV2lkdGgiKX19LF9zaXplRGltZW5zaW9uOmZ1bmN0aW9uKGEsYyxkLGYsZyl7dGhpcy5fX3NpemVEaW1lbnNpb24oYSxjLGQsZixnKX0sX19zaXplRGltZW5zaW9uOmZ1bmN0aW9uKGEsYyxkLGYsZyl7dmFyIGw9dGhpcy5fZml0SW5mbyxrPXRoaXMuX19nZXROb3JtYWxpemVkUmVjdCh0aGlzLmZpdEludG8pO2s9IldpZHRoIj09PWc/ay53aWR0aDprLmhlaWdodDtjPWM9PT1mO3ZhciBuPQoib2Zmc2V0IitnO3RoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlWyJtYXgiK2ddPWstbC5tYXJnaW5bYz9kOmZdLShjP2stYVtmXTphW2RdKS0odGhpc1tuXS10aGlzLnNpemluZ1RhcmdldFtuXSkrInB4In0sY2VudGVyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19zaG91bGRQb3NpdGlvbil7dGhpcy5fZGlzY292ZXJJbmZvKCk7dmFyIGE9dGhpcy5fZml0SW5mby5wb3NpdGlvbmVkQnk7aWYoIWEudmVydGljYWxseXx8IWEuaG9yaXpvbnRhbGx5KXt0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCI7YS52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS50b3A9IjBweCIpO2EuaG9yaXpvbnRhbGx5fHwodGhpcy5zdHlsZS5sZWZ0PSIwcHgiKTt2YXIgYz10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9dGhpcy5fX2dldE5vcm1hbGl6ZWRSZWN0KHRoaXMuZml0SW50byk7YS52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS50b3A9ZC50b3AtYy50b3ArKGQuaGVpZ2h0LWMuaGVpZ2h0KS8yKyJweCIpO2EuaG9yaXpvbnRhbGx5fHwKKHRoaXMuc3R5bGUubGVmdD1kLmxlZnQtYy5sZWZ0KyhkLndpZHRoLWMud2lkdGgpLzIrInB4Iil9fX0sX19nZXROb3JtYWxpemVkUmVjdDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8YT09PXdpbmRvdz97dG9wOjAsbGVmdDowLHdpZHRoOndpbmRvdy5pbm5lcldpZHRoLGhlaWdodDp3aW5kb3cuaW5uZXJIZWlnaHQscmlnaHQ6d2luZG93LmlubmVyV2lkdGgsYm90dG9tOndpbmRvdy5pbm5lckhlaWdodH06YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0sX19nZXRPZmZzY3JlZW5BcmVhOmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gTWF0aC5hYnMoTWF0aC5taW4oMCxhLnRvcCkrTWF0aC5taW4oMCxkLmJvdHRvbS0oYS50b3ArYy5oZWlnaHQpKSkqYy53aWR0aCtNYXRoLmFicyhNYXRoLm1pbigwLGEubGVmdCkrTWF0aC5taW4oMCxkLnJpZ2h0LShhLmxlZnQrYy53aWR0aCkpKSpjLmhlaWdodH0sX19nZXRQb3NpdGlvbjpmdW5jdGlvbihhLGMsCmQsZixnLGwpe3ZhciBrPVt7dmVydGljYWxBbGlnbjoidG9wIixob3Jpem9udGFsQWxpZ246ImxlZnQiLHRvcDpnLnRvcCt0aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6Zy5sZWZ0K3RoaXMuaG9yaXpvbnRhbE9mZnNldH0se3ZlcnRpY2FsQWxpZ246InRvcCIsaG9yaXpvbnRhbEFsaWduOiJyaWdodCIsdG9wOmcudG9wK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDpnLnJpZ2h0LWQud2lkdGgtdGhpcy5ob3Jpem9udGFsT2Zmc2V0fSx7dmVydGljYWxBbGlnbjoiYm90dG9tIixob3Jpem9udGFsQWxpZ246ImxlZnQiLHRvcDpnLmJvdHRvbS1kLmhlaWdodC10aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6Zy5sZWZ0K3RoaXMuaG9yaXpvbnRhbE9mZnNldH0se3ZlcnRpY2FsQWxpZ246ImJvdHRvbSIsaG9yaXpvbnRhbEFsaWduOiJyaWdodCIsdG9wOmcuYm90dG9tLWQuaGVpZ2h0LXRoaXMudmVydGljYWxPZmZzZXQsbGVmdDpnLnJpZ2h0LWQud2lkdGgtdGhpcy5ob3Jpem9udGFsT2Zmc2V0fV07CmlmKHRoaXMubm9PdmVybGFwKXtmb3IodmFyIG49MCxwPWsubGVuZ3RoO248cDtuKyspe3ZhciBxPXt9LHI7Zm9yKHIgaW4ga1tuXSlxW3JdPWtbbl1bcl07ay5wdXNoKHEpfWtbMF0udG9wPWtbMV0udG9wKz1nLmhlaWdodDtrWzJdLnRvcD1rWzNdLnRvcC09Zy5oZWlnaHQ7a1s0XS5sZWZ0PWtbNl0ubGVmdCs9Zy53aWR0aDtrWzVdLmxlZnQ9a1s3XS5sZWZ0LT1nLndpZHRofWM9ImF1dG8iPT09Yz9udWxsOmM7YT0iYXV0byI9PT1hP251bGw6YTthJiYiY2VudGVyIiE9PWF8fChrLnB1c2goe3ZlcnRpY2FsQWxpZ246InRvcCIsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLHRvcDpnLnRvcCt0aGlzLnZlcnRpY2FsT2Zmc2V0Kyh0aGlzLm5vT3ZlcmxhcD9nLmhlaWdodDowKSxsZWZ0OmcubGVmdC1mLndpZHRoLzIrZy53aWR0aC8yK3RoaXMuaG9yaXpvbnRhbE9mZnNldH0pLGsucHVzaCh7dmVydGljYWxBbGlnbjoiYm90dG9tIixob3Jpem9udGFsQWxpZ246ImNlbnRlciIsdG9wOmcuYm90dG9tLQpkLmhlaWdodC10aGlzLnZlcnRpY2FsT2Zmc2V0LSh0aGlzLm5vT3ZlcmxhcD9nLmhlaWdodDowKSxsZWZ0OmcubGVmdC1mLndpZHRoLzIrZy53aWR0aC8yK3RoaXMuaG9yaXpvbnRhbE9mZnNldH0pKTtjJiYibWlkZGxlIiE9PWN8fChrLnB1c2goe3ZlcnRpY2FsQWxpZ246Im1pZGRsZSIsaG9yaXpvbnRhbEFsaWduOiJsZWZ0Iix0b3A6Zy50b3AtZi5oZWlnaHQvMitnLmhlaWdodC8yK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDpnLmxlZnQrdGhpcy5ob3Jpem9udGFsT2Zmc2V0Kyh0aGlzLm5vT3ZlcmxhcD9nLndpZHRoOjApfSksay5wdXNoKHt2ZXJ0aWNhbEFsaWduOiJtaWRkbGUiLGhvcml6b250YWxBbGlnbjoicmlnaHQiLHRvcDpnLnRvcC1mLmhlaWdodC8yK2cuaGVpZ2h0LzIrdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OmcucmlnaHQtZC53aWR0aC10aGlzLmhvcml6b250YWxPZmZzZXQtKHRoaXMubm9PdmVybGFwP2cud2lkdGg6MCl9KSk7Im1pZGRsZSI9PT1jJiYiY2VudGVyIj09PQphJiZrLnB1c2goe3ZlcnRpY2FsQWxpZ246Im1pZGRsZSIsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLHRvcDpnLnRvcC1mLmhlaWdodC8yK2cuaGVpZ2h0LzIrdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OmcubGVmdC1mLndpZHRoLzIrZy53aWR0aC8yK3RoaXMuaG9yaXpvbnRhbE9mZnNldH0pO2ZvcihuPTA7bjxrLmxlbmd0aDtuKyspe2Y9a1tuXTtnPWYudmVydGljYWxBbGlnbj09PWM7cD1mLmhvcml6b250YWxBbGlnbj09PWE7aWYoIXRoaXMuZHluYW1pY0FsaWduJiYhdGhpcy5ub092ZXJsYXAmJmcmJnApe3ZhciB0PWY7YnJlYWt9cT0oIWN8fGcpJiYoIWF8fHApO2lmKHRoaXMuZHluYW1pY0FsaWdufHxxKXtmLm9mZnNjcmVlbkFyZWE9dGhpcy5fX2dldE9mZnNjcmVlbkFyZWEoZixkLGwpO2lmKDA9PT1mLm9mZnNjcmVlbkFyZWEmJnEpe3Q9ZjticmVha310PXR8fGY7cT1mLm9mZnNjcmVlbkFyZWEtdC5vZmZzY3JlZW5BcmVhO2lmKDA+cXx8MD09PXEmJihnfHxwKSl0PWZ9fXJldHVybiB0fX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1yZXNpemFibGUtYmVoYXZpb3IvaXJvbi1yZXNpemFibGUtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcj17cHJvcGVydGllczp7X3BhcmVudFJlc2l6YWJsZTp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9wYXJlbnRSZXNpemFibGVDaGFuZ2VkIn0sX25vdGlmeWluZ0Rlc2NlbmRhbnQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LGxpc3RlbmVyczp7Imlyb24tcmVxdWVzdC1yZXNpemUtbm90aWZpY2F0aW9ucyI6Il9vbklyb25SZXF1ZXN0UmVzaXplTm90aWZpY2F0aW9ucyJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcz1bXTt0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZT10aGlzLm5vdGlmeVJlc2l6ZS5iaW5kKHRoaXMpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zKCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcGFyZW50UmVzaXphYmxlP3RoaXMuX3BhcmVudFJlc2l6YWJsZS5zdG9wUmVzaXplTm90aWZpY2F0aW9uc0Zvcih0aGlzKTp3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIiwKdGhpcy5fYm91bmROb3RpZnlSZXNpemUpO3RoaXMuX3BhcmVudFJlc2l6YWJsZT1udWxsfSxub3RpZnlSZXNpemU6ZnVuY3Rpb24oKXt0aGlzLmlzQXR0YWNoZWQmJih0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RoaXMucmVzaXplclNob3VsZE5vdGlmeShhKSYmdGhpcy5fbm90aWZ5RGVzY2VuZGFudChhKX0sdGhpcyksdGhpcy5fZmlyZVJlc2l6ZSgpKX0sYXNzaWduUGFyZW50UmVzaXphYmxlOmZ1bmN0aW9uKGEpe3RoaXMuX3BhcmVudFJlc2l6YWJsZT1hfSxzdG9wUmVzaXplTm90aWZpY2F0aW9uc0ZvcjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5pbmRleE9mKGEpOy0xPGMmJih0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5zcGxpY2UoYywxKSx0aGlzLnVubGlzdGVuKGEsImlyb24tcmVzaXplIiwiX29uRGVzY2VuZGFudElyb25SZXNpemUiKSl9LHJlc2l6ZXJTaG91bGROb3RpZnk6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCl9vbkRlc2NlbmRhbnRJcm9uUmVzaXplOmZ1bmN0aW9uKGEpe3RoaXMuX25vdGlmeWluZ0Rlc2NlbmRhbnQ/YS5zdG9wUHJvcGFnYXRpb24oKTpQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvd3x8dGhpcy5fZmlyZVJlc2l6ZSgpfSxfZmlyZVJlc2l6ZTpmdW5jdGlvbigpe3RoaXMuZmlyZSgiaXJvbi1yZXNpemUiLG51bGwse25vZGU6dGhpcyxidWJibGVzOiExfSl9LF9vbklyb25SZXF1ZXN0UmVzaXplTm90aWZpY2F0aW9uczpmdW5jdGlvbihhKXt2YXIgYz1Qb2x5bWVyLmRvbShhKS5yb290VGFyZ2V0O2MhPT10aGlzJiYoLTE9PT10aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5pbmRleE9mKGMpJiYodGhpcy5faW50ZXJlc3RlZFJlc2l6YWJsZXMucHVzaChjKSx0aGlzLmxpc3RlbihjLCJpcm9uLXJlc2l6ZSIsIl9vbkRlc2NlbmRhbnRJcm9uUmVzaXplIikpLGMuYXNzaWduUGFyZW50UmVzaXphYmxlKHRoaXMpLHRoaXMuX25vdGlmeURlc2NlbmRhbnQoYyksYS5zdG9wUHJvcGFnYXRpb24oKSl9LApfcGFyZW50UmVzaXphYmxlQ2hhbmdlZDpmdW5jdGlvbihhKXthJiZ3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIix0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZSl9LF9ub3RpZnlEZXNjZW5kYW50OmZ1bmN0aW9uKGEpe3RoaXMuaXNBdHRhY2hlZCYmKHRoaXMuX25vdGlmeWluZ0Rlc2NlbmRhbnQ9ITAsYS5ub3RpZnlSZXNpemUoKSx0aGlzLl9ub3RpZnlpbmdEZXNjZW5kYW50PSExKX0sX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0F0dGFjaGVkKWlmKCJsb2FkaW5nIj09PWRvY3VtZW50LnJlYWR5U3RhdGUpe3ZhciBhPXRoaXMuX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zLmJpbmQodGhpcyk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsZnVuY3Rpb24gZCgpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGQpO2EoKX0pfWVsc2UgdGhpcy5maXJlKCJpcm9uLXJlcXVlc3QtcmVzaXplLW5vdGlmaWNhdGlvbnMiLApudWxsLHtub2RlOnRoaXMsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwfSksdGhpcy5fcGFyZW50UmVzaXphYmxlfHwod2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdGhpcy5fYm91bmROb3RpZnlSZXNpemUpLHRoaXMubm90aWZ5UmVzaXplKCkpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tb3ZlcmxheS1iYWNrZHJvcC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJpcm9uLW92ZXJsYXktYmFja2Ryb3AiLHByb3BlcnRpZXM6e29wZW5lZDp7cmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifX0sbGlzdGVuZXJzOnt0cmFuc2l0aW9uZW5kOiJfb25UcmFuc2l0aW9uZW5kIn0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX19vcGVuZWRSYWY9bnVsbH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5fb3BlbmVkQ2hhbmdlZCh0aGlzLm9wZW5lZCl9LHByZXBhcmU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmIXRoaXMucGFyZW50Tm9kZSYmUG9seW1lci5kb20oZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQodGhpcyl9LG9wZW46ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMH0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMX0sY29tcGxldGU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZHx8dGhpcy5wYXJlbnROb2RlIT09CmRvY3VtZW50LmJvZHl8fFBvbHltZXIuZG9tKHRoaXMucGFyZW50Tm9kZSkucmVtb3ZlQ2hpbGQodGhpcyl9LF9vblRyYW5zaXRpb25lbmQ6ZnVuY3Rpb24oYSl7YSYmYS50YXJnZXQ9PT10aGlzJiZ0aGlzLmNvbXBsZXRlKCl9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKGEpe2E/dGhpcy5wcmVwYXJlKCk6KGE9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcyksIjBzIiE9PWEudHJhbnNpdGlvbkR1cmF0aW9uJiYwIT1hLm9wYWNpdHl8fHRoaXMuY29tcGxldGUoKSk7dGhpcy5pc0F0dGFjaGVkJiYodGhpcy5fX29wZW5lZFJhZiYmKHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fb3BlbmVkUmFmKSx0aGlzLl9fb3BlbmVkUmFmPW51bGwpLHRoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wLHRoaXMuX19vcGVuZWRSYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3RoaXMuX19vcGVuZWRSYWY9bnVsbDt0aGlzLnRvZ2dsZUNsYXNzKCJvcGVuZWQiLAp0aGlzLm9wZW5lZCl9LmJpbmQodGhpcykpKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tb3ZlcmxheS1tYW5hZ2VyLmh0bWwuanMKUG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJDbGFzcz1mdW5jdGlvbigpe3RoaXMuX292ZXJsYXlzPVtdO3RoaXMuX21pbmltdW1aPTEwMTt0aGlzLl9iYWNrZHJvcEVsZW1lbnQ9bnVsbDtQb2x5bWVyLkdlc3R1cmVzLmFkZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsInRhcCIsZnVuY3Rpb24oKXt9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLHRoaXMuX29uQ2FwdHVyZUNsaWNrLmJpbmQodGhpcyksITApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9vbkNhcHR1cmVGb2N1cy5iaW5kKHRoaXMpLCEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLl9vbkNhcHR1cmVLZXlEb3duLmJpbmQodGhpcyksITApfTsKUG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJDbGFzcy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlBvbHltZXIuSXJvbk92ZXJsYXlNYW5hZ2VyQ2xhc3MsZ2V0IGJhY2tkcm9wRWxlbWVudCgpe3RoaXMuX2JhY2tkcm9wRWxlbWVudHx8KHRoaXMuX2JhY2tkcm9wRWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpcm9uLW92ZXJsYXktYmFja2Ryb3AiKSk7cmV0dXJuIHRoaXMuX2JhY2tkcm9wRWxlbWVudH0sZ2V0IGRlZXBBY3RpdmVFbGVtZW50KCl7dmFyIGE9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDthJiYhMSE9PWEgaW5zdGFuY2VvZiBFbGVtZW50fHwoYT1kb2N1bWVudC5ib2R5KTtmb3IoO2Eucm9vdCYmUG9seW1lci5kb20oYS5yb290KS5hY3RpdmVFbGVtZW50OylhPVBvbHltZXIuZG9tKGEucm9vdCkuYWN0aXZlRWxlbWVudDtyZXR1cm4gYX0sX2JyaW5nT3ZlcmxheUF0SW5kZXhUb0Zyb250OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX292ZXJsYXlzW2FdO2lmKGMpe3ZhciBkPQp0aGlzLl9vdmVybGF5cy5sZW5ndGgtMSxmPXRoaXMuX292ZXJsYXlzW2RdO2YmJnRoaXMuX3Nob3VsZEJlQmVoaW5kT3ZlcmxheShjLGYpJiZkLS07aWYoIShhPj1kKSl7Zj1NYXRoLm1heCh0aGlzLmN1cnJlbnRPdmVybGF5WigpLHRoaXMuX21pbmltdW1aKTtmb3IodGhpcy5fZ2V0WihjKTw9ZiYmdGhpcy5fYXBwbHlPdmVybGF5WihjLGYpO2E8ZDspdGhpcy5fb3ZlcmxheXNbYV09dGhpcy5fb3ZlcmxheXNbYSsxXSxhKys7dGhpcy5fb3ZlcmxheXNbZF09Y319fSxhZGRPclJlbW92ZU92ZXJsYXk6ZnVuY3Rpb24oYSl7YS5vcGVuZWQ/dGhpcy5hZGRPdmVybGF5KGEpOnRoaXMucmVtb3ZlT3ZlcmxheShhKX0sYWRkT3ZlcmxheTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9vdmVybGF5cy5pbmRleE9mKGEpO2lmKDA8PWMpdGhpcy5fYnJpbmdPdmVybGF5QXRJbmRleFRvRnJvbnQoYyk7ZWxzZXtjPXRoaXMuX292ZXJsYXlzLmxlbmd0aDt2YXIgZD10aGlzLl9vdmVybGF5c1tjLTFdLGY9Ck1hdGgubWF4KHRoaXMuX2dldFooZCksdGhpcy5fbWluaW11bVopLGc9dGhpcy5fZ2V0WihhKTtkJiZ0aGlzLl9zaG91bGRCZUJlaGluZE92ZXJsYXkoYSxkKSYmKHRoaXMuX2FwcGx5T3ZlcmxheVooZCxmKSxjLS0sZj1NYXRoLm1heCh0aGlzLl9nZXRaKHRoaXMuX292ZXJsYXlzW2MtMV0pLHRoaXMuX21pbmltdW1aKSk7Zzw9ZiYmdGhpcy5fYXBwbHlPdmVybGF5WihhLGYpO3RoaXMuX292ZXJsYXlzLnNwbGljZShjLDAsYSl9dGhpcy50cmFja0JhY2tkcm9wKCl9LHJlbW92ZU92ZXJsYXk6ZnVuY3Rpb24oYSl7YT10aGlzLl9vdmVybGF5cy5pbmRleE9mKGEpOy0xIT09YSYmKHRoaXMuX292ZXJsYXlzLnNwbGljZShhLDEpLHRoaXMudHJhY2tCYWNrZHJvcCgpKX0sY3VycmVudE92ZXJsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3ZlcmxheXNbdGhpcy5fb3ZlcmxheXMubGVuZ3RoLTFdfSxjdXJyZW50T3ZlcmxheVo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0Wih0aGlzLmN1cnJlbnRPdmVybGF5KCkpfSwKZW5zdXJlTWluaW11bVo6ZnVuY3Rpb24oYSl7dGhpcy5fbWluaW11bVo9TWF0aC5tYXgodGhpcy5fbWluaW11bVosYSl9LGZvY3VzT3ZlcmxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY3VycmVudE92ZXJsYXkoKTthJiZhLl9hcHBseUZvY3VzKCl9LHRyYWNrQmFja2Ryb3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9vdmVybGF5V2l0aEJhY2tkcm9wKCk7aWYoYXx8dGhpcy5fYmFja2Ryb3BFbGVtZW50KXRoaXMuYmFja2Ryb3BFbGVtZW50LnN0eWxlLnpJbmRleD10aGlzLl9nZXRaKGEpLTEsdGhpcy5iYWNrZHJvcEVsZW1lbnQub3BlbmVkPSEhYSx0aGlzLmJhY2tkcm9wRWxlbWVudC5wcmVwYXJlKCl9LGdldEJhY2tkcm9wczpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxjPTA7Yzx0aGlzLl9vdmVybGF5cy5sZW5ndGg7YysrKXRoaXMuX292ZXJsYXlzW2NdLndpdGhCYWNrZHJvcCYmYS5wdXNoKHRoaXMuX292ZXJsYXlzW2NdKTtyZXR1cm4gYX0sYmFja2Ryb3BaOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFoodGhpcy5fb3ZlcmxheVdpdGhCYWNrZHJvcCgpKS0KMX0sX292ZXJsYXlXaXRoQmFja2Ryb3A6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5fb3ZlcmxheXMubGVuZ3RoLTE7MDw9YTthLS0paWYodGhpcy5fb3ZlcmxheXNbYV0ud2l0aEJhY2tkcm9wKXJldHVybiB0aGlzLl9vdmVybGF5c1thXX0sX2dldFo6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fbWluaW11bVo7YSYmKGE9TnVtYmVyKGEuc3R5bGUuekluZGV4fHx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS56SW5kZXgpLGE9PT1hJiYoYz1hKSk7cmV0dXJuIGN9LF9zZXRaOmZ1bmN0aW9uKGEsYyl7YS5zdHlsZS56SW5kZXg9Y30sX2FwcGx5T3ZlcmxheVo6ZnVuY3Rpb24oYSxjKXt0aGlzLl9zZXRaKGEsYysyKX0sX292ZXJsYXlJblBhdGg6ZnVuY3Rpb24oYSl7YT1hfHxbXTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylpZihhW2NdLl9tYW5hZ2VyPT09dGhpcylyZXR1cm4gYVtjXX0sX29uQ2FwdHVyZUNsaWNrOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX292ZXJsYXlzLmxlbmd0aC0KMTtpZigtMSE9PWMpZm9yKHZhciBkPVBvbHltZXIuZG9tKGEpLnBhdGgsZjsoZj10aGlzLl9vdmVybGF5c1tjXSkmJnRoaXMuX292ZXJsYXlJblBhdGgoZCkhPT1mOylpZihmLl9vbkNhcHR1cmVDbGljayhhKSxmLmFsbG93Q2xpY2tUaHJvdWdoKWMtLTtlbHNlIGJyZWFrfSxfb25DYXB0dXJlRm9jdXM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jdXJyZW50T3ZlcmxheSgpO2MmJmMuX29uQ2FwdHVyZUZvY3VzKGEpfSxfb25DYXB0dXJlS2V5RG93bjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmN1cnJlbnRPdmVybGF5KCk7YyYmKFBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3Iua2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzKGEsImVzYyIpP2MuX29uQ2FwdHVyZUVzYyhhKTpQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhhLCJ0YWIiKSYmYy5fb25DYXB0dXJlVGFiKGEpKX0sX3Nob3VsZEJlQmVoaW5kT3ZlcmxheTpmdW5jdGlvbihhLGMpe3JldHVybiFhLmFsd2F5c09uVG9wJiYKYy5hbHdheXNPblRvcH19O1BvbHltZXIuSXJvbk92ZXJsYXlNYW5hZ2VyPW5ldyBQb2x5bWVyLklyb25PdmVybGF5TWFuYWdlckNsYXNzOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tb3ZlcmxheS1iZWhhdmlvci9pcm9uLXNjcm9sbC1tYW5hZ2VyLmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGE9MCxjPTAsZD1udWxsLGY9W10sZz1bIndoZWVsIiwibW91c2V3aGVlbCIsIkRPTU1vdXNlU2Nyb2xsIiwidG91Y2hzdGFydCIsInRvdWNobW92ZSJdO1BvbHltZXIuSXJvblNjcm9sbE1hbmFnZXI9e2dldCBjdXJyZW50TG9ja2luZ0VsZW1lbnQoKXtyZXR1cm4gdGhpcy5fbG9ja2luZ0VsZW1lbnRzW3RoaXMuX2xvY2tpbmdFbGVtZW50cy5sZW5ndGgtMV19LGVsZW1lbnRJc1Njcm9sbExvY2tlZDpmdW5jdGlvbihsKXt2YXIgaz10aGlzLmN1cnJlbnRMb2NraW5nRWxlbWVudDtpZih2b2lkIDA9PT1rKXJldHVybiExO2lmKHRoaXMuX2hhc0NhY2hlZExvY2tlZEVsZW1lbnQobCkpcmV0dXJuITA7aWYodGhpcy5faGFzQ2FjaGVkVW5sb2NrZWRFbGVtZW50KGwpKXJldHVybiExOyhrPSEhayYmayE9PWwmJiF0aGlzLl9jb21wb3NlZFRyZWVDb250YWlucyhrLGwpKT90aGlzLl9sb2NrZWRFbGVtZW50Q2FjaGUucHVzaChsKTp0aGlzLl91bmxvY2tlZEVsZW1lbnRDYWNoZS5wdXNoKGwpOwpyZXR1cm4ga30scHVzaFNjcm9sbExvY2s6ZnVuY3Rpb24obCl7MDw9dGhpcy5fbG9ja2luZ0VsZW1lbnRzLmluZGV4T2YobCl8fCgwPT09dGhpcy5fbG9ja2luZ0VsZW1lbnRzLmxlbmd0aCYmdGhpcy5fbG9ja1Njcm9sbEludGVyYWN0aW9ucygpLHRoaXMuX2xvY2tpbmdFbGVtZW50cy5wdXNoKGwpLHRoaXMuX2xvY2tlZEVsZW1lbnRDYWNoZT1bXSx0aGlzLl91bmxvY2tlZEVsZW1lbnRDYWNoZT1bXSl9LHJlbW92ZVNjcm9sbExvY2s6ZnVuY3Rpb24obCl7bD10aGlzLl9sb2NraW5nRWxlbWVudHMuaW5kZXhPZihsKTstMSE9PWwmJih0aGlzLl9sb2NraW5nRWxlbWVudHMuc3BsaWNlKGwsMSksdGhpcy5fbG9ja2VkRWxlbWVudENhY2hlPVtdLHRoaXMuX3VubG9ja2VkRWxlbWVudENhY2hlPVtdLDA9PT10aGlzLl9sb2NraW5nRWxlbWVudHMubGVuZ3RoJiZ0aGlzLl91bmxvY2tTY3JvbGxJbnRlcmFjdGlvbnMoKSl9LF9sb2NraW5nRWxlbWVudHM6W10sX2xvY2tlZEVsZW1lbnRDYWNoZTpudWxsLApfdW5sb2NrZWRFbGVtZW50Q2FjaGU6bnVsbCxfaGFzQ2FjaGVkTG9ja2VkRWxlbWVudDpmdW5jdGlvbihsKXtyZXR1cm4tMTx0aGlzLl9sb2NrZWRFbGVtZW50Q2FjaGUuaW5kZXhPZihsKX0sX2hhc0NhY2hlZFVubG9ja2VkRWxlbWVudDpmdW5jdGlvbihsKXtyZXR1cm4tMTx0aGlzLl91bmxvY2tlZEVsZW1lbnRDYWNoZS5pbmRleE9mKGwpfSxfY29tcG9zZWRUcmVlQ29udGFpbnM6ZnVuY3Rpb24obCxrKXt2YXIgbixwO2lmKGwuY29udGFpbnMoaykpcmV0dXJuITA7bD1Qb2x5bWVyLmRvbShsKS5xdWVyeVNlbGVjdG9yQWxsKCJjb250ZW50LHNsb3QiKTtmb3Iobj0wO248bC5sZW5ndGg7KytuKXt2YXIgcT1Qb2x5bWVyLmRvbShsW25dKS5nZXREaXN0cmlidXRlZE5vZGVzKCk7Zm9yKHA9MDtwPHEubGVuZ3RoOysrcClpZihxW3BdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJnRoaXMuX2NvbXBvc2VkVHJlZUNvbnRhaW5zKHFbcF0saykpcmV0dXJuITB9cmV0dXJuITF9LF9zY3JvbGxJbnRlcmFjdGlvbkhhbmRsZXI6ZnVuY3Rpb24obCl7bC5jYW5jZWxhYmxlJiYKdGhpcy5fc2hvdWxkUHJldmVudFNjcm9sbGluZyhsKSYmbC5wcmV2ZW50RGVmYXVsdCgpO2wudGFyZ2V0VG91Y2hlcyYmKGw9bC50YXJnZXRUb3VjaGVzWzBdLGE9bC5wYWdlWCxjPWwucGFnZVkpfSxfbG9ja1Njcm9sbEludGVyYWN0aW9uczpmdW5jdGlvbigpe3RoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcj10aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXJ8fHRoaXMuX3Njcm9sbEludGVyYWN0aW9uSGFuZGxlci5iaW5kKHRoaXMpO2Zvcih2YXIgbD0wLGs9Zy5sZW5ndGg7bDxrO2wrKylkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGdbbF0sdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITF9KX0sX3VubG9ja1Njcm9sbEludGVyYWN0aW9uczpmdW5jdGlvbigpe2Zvcih2YXIgbD0wLGs9Zy5sZW5ndGg7bDxrO2wrKylkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGdbbF0sdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITF9KX0sCl9zaG91bGRQcmV2ZW50U2Nyb2xsaW5nOmZ1bmN0aW9uKGwpe3ZhciBrPVBvbHltZXIuZG9tKGwpLnJvb3RUYXJnZXQ7InRvdWNobW92ZSIhPT1sLnR5cGUmJmQhPT1rJiYoZD1rLGY9dGhpcy5fZ2V0U2Nyb2xsYWJsZU5vZGVzKFBvbHltZXIuZG9tKGwpLnBhdGgpKTtpZighZi5sZW5ndGgpcmV0dXJuITA7aWYoInRvdWNoc3RhcnQiPT09bC50eXBlKXJldHVybiExO2w9dGhpcy5fZ2V0U2Nyb2xsSW5mbyhsKTtyZXR1cm4hdGhpcy5fZ2V0U2Nyb2xsaW5nTm9kZShmLGwuZGVsdGFYLGwuZGVsdGFZKX0sX2dldFNjcm9sbGFibGVOb2RlczpmdW5jdGlvbihsKXtmb3IodmFyIGs9W10sbj1sLmluZGV4T2YodGhpcy5jdXJyZW50TG9ja2luZ0VsZW1lbnQpLHA9MDtwPD1uO3ArKylpZihsW3BdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe3ZhciBxPWxbcF0scj1xLnN0eWxlOyJzY3JvbGwiIT09ci5vdmVyZmxvdyYmImF1dG8iIT09ci5vdmVyZmxvdyYmKHI9d2luZG93LmdldENvbXB1dGVkU3R5bGUocSkpOwoic2Nyb2xsIiE9PXIub3ZlcmZsb3cmJiJhdXRvIiE9PXIub3ZlcmZsb3d8fGsucHVzaChxKX1yZXR1cm4ga30sX2dldFNjcm9sbGluZ05vZGU6ZnVuY3Rpb24obCxrLG4pe2lmKGt8fG4pZm9yKHZhciBwPU1hdGguYWJzKG4pPj1NYXRoLmFicyhrKSxxPTA7cTxsLmxlbmd0aDtxKyspe3ZhciByPWxbcV07aWYocD8wPm4/MDxyLnNjcm9sbFRvcDpyLnNjcm9sbFRvcDxyLnNjcm9sbEhlaWdodC1yLmNsaWVudEhlaWdodDowPms/MDxyLnNjcm9sbExlZnQ6ci5zY3JvbGxMZWZ0PHIuc2Nyb2xsV2lkdGgtci5jbGllbnRXaWR0aClyZXR1cm4gcn19LF9nZXRTY3JvbGxJbmZvOmZ1bmN0aW9uKGwpe3ZhciBrPXtkZWx0YVg6bC5kZWx0YVgsZGVsdGFZOmwuZGVsdGFZfTsiZGVsdGFYImluIGx8fCgid2hlZWxEZWx0YVgiaW4gbCYmIndoZWVsRGVsdGFZImluIGw/KGsuZGVsdGFYPS1sLndoZWVsRGVsdGFYLGsuZGVsdGFZPS1sLndoZWVsRGVsdGFZKToid2hlZWxEZWx0YSJpbiBsPyhrLmRlbHRhWD0KMCxrLmRlbHRhWT0tbC53aGVlbERlbHRhKToiYXhpcyJpbiBsPyhrLmRlbHRhWD0xPT09bC5heGlzP2wuZGV0YWlsOjAsay5kZWx0YVk9Mj09PWwuYXhpcz9sLmRldGFpbDowKTpsLnRhcmdldFRvdWNoZXMmJihsPWwudGFyZ2V0VG91Y2hlc1swXSxrLmRlbHRhWD1hLWwucGFnZVgsay5kZWx0YVk9Yy1sLnBhZ2VZKSk7cmV0dXJuIGt9fX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tZm9jdXNhYmxlcy1oZWxwZXIuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYT1FbGVtZW50LnByb3RvdHlwZSxjPWEubWF0Y2hlc3x8YS5tYXRjaGVzU2VsZWN0b3J8fGEubW96TWF0Y2hlc1NlbGVjdG9yfHxhLm1zTWF0Y2hlc1NlbGVjdG9yfHxhLm9NYXRjaGVzU2VsZWN0b3J8fGEud2Via2l0TWF0Y2hlc1NlbGVjdG9yO1BvbHltZXIuSXJvbkZvY3VzYWJsZXNIZWxwZXI9e2dldFRhYmJhYmxlTm9kZXM6ZnVuY3Rpb24oZCl7dmFyIGY9W107cmV0dXJuIHRoaXMuX2NvbGxlY3RUYWJiYWJsZU5vZGVzKGQsZik/dGhpcy5fc29ydEJ5VGFiSW5kZXgoZik6Zn0saXNGb2N1c2FibGU6ZnVuY3Rpb24oZCl7cmV0dXJuIGMuY2FsbChkLCJpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYnV0dG9uLCBvYmplY3QiKT9jLmNhbGwoZCwiOm5vdChbZGlzYWJsZWRdKSIpOmMuY2FsbChkLCJhW2hyZWZdLCBhcmVhW2hyZWZdLCBpZnJhbWUsIFt0YWJpbmRleF0sIFtjb250ZW50RWRpdGFibGVdIil9LGlzVGFiYmFibGU6ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMuaXNGb2N1c2FibGUoZCkmJgpjLmNhbGwoZCwnOm5vdChbdGFiaW5kZXhceDNkIi0xIl0pJykmJnRoaXMuX2lzVmlzaWJsZShkKX0sX25vcm1hbGl6ZWRUYWJJbmRleDpmdW5jdGlvbihkKXtyZXR1cm4gdGhpcy5pc0ZvY3VzYWJsZShkKT8oZD1kLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKXx8MCxOdW1iZXIoZCkpOi0xfSxfY29sbGVjdFRhYmJhYmxlTm9kZXM6ZnVuY3Rpb24oZCxmKXtpZihkLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREV8fCF0aGlzLl9pc1Zpc2libGUoZCkpcmV0dXJuITE7dmFyIGc9dGhpcy5fbm9ybWFsaXplZFRhYkluZGV4KGQpLGw9MDxnOzA8PWcmJmYucHVzaChkKTtkPSJjb250ZW50Ij09PWQubG9jYWxOYW1lfHwic2xvdCI9PT1kLmxvY2FsTmFtZT9Qb2x5bWVyLmRvbShkKS5nZXREaXN0cmlidXRlZE5vZGVzKCk6UG9seW1lci5kb20oZC5yb290fHxkKS5jaGlsZHJlbjtmb3IoZz0wO2c8ZC5sZW5ndGg7ZysrKWw9dGhpcy5fY29sbGVjdFRhYmJhYmxlTm9kZXMoZFtnXSxmKXx8bDsKcmV0dXJuIGx9LF9pc1Zpc2libGU6ZnVuY3Rpb24oZCl7dmFyIGY9ZC5zdHlsZTtyZXR1cm4iaGlkZGVuIiE9PWYudmlzaWJpbGl0eSYmIm5vbmUiIT09Zi5kaXNwbGF5PyhmPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGQpLCJoaWRkZW4iIT09Zi52aXNpYmlsaXR5JiYibm9uZSIhPT1mLmRpc3BsYXkpOiExfSxfc29ydEJ5VGFiSW5kZXg6ZnVuY3Rpb24oZCl7dmFyIGY9ZC5sZW5ndGg7aWYoMj5mKXJldHVybiBkO3ZhciBnPU1hdGguY2VpbChmLzIpO2Y9dGhpcy5fc29ydEJ5VGFiSW5kZXgoZC5zbGljZSgwLGcpKTtkPXRoaXMuX3NvcnRCeVRhYkluZGV4KGQuc2xpY2UoZykpO3JldHVybiB0aGlzLl9tZXJnZVNvcnRCeVRhYkluZGV4KGYsZCl9LF9tZXJnZVNvcnRCeVRhYkluZGV4OmZ1bmN0aW9uKGQsZil7Zm9yKHZhciBnPVtdOzA8ZC5sZW5ndGgmJjA8Zi5sZW5ndGg7KXRoaXMuX2hhc0xvd2VyVGFiT3JkZXIoZFswXSxmWzBdKT9nLnB1c2goZi5zaGlmdCgpKTpnLnB1c2goZC5zaGlmdCgpKTsKcmV0dXJuIGcuY29uY2F0KGQsZil9LF9oYXNMb3dlclRhYk9yZGVyOmZ1bmN0aW9uKGQsZil7ZD1NYXRoLm1heChkLnRhYkluZGV4LDApO2Y9TWF0aC5tYXgoZi50YWJJbmRleCwwKTtyZXR1cm4gMD09PWR8fDA9PT1mP2Y+ZDpkPmZ9fX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tb3ZlcmxheS1iZWhhdmlvci5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGw9e3Byb3BlcnRpZXM6e29wZW5lZDp7b2JzZXJ2ZXI6Il9vcGVuZWRDaGFuZ2VkIix0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxjYW5jZWxlZDp7b2JzZXJ2ZXI6Il9jYW5jZWxlZENoYW5nZWQiLHJlYWRPbmx5OiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMX0sd2l0aEJhY2tkcm9wOntvYnNlcnZlcjoiX3dpdGhCYWNrZHJvcENoYW5nZWQiLHR5cGU6Qm9vbGVhbn0sbm9BdXRvRm9jdXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sbm9DYW5jZWxPbkVzY0tleTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0NhbmNlbE9uT3V0c2lkZUNsaWNrOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGNsb3NpbmdSZWFzb246e3R5cGU6T2JqZWN0fSxyZXN0b3JlRm9jdXNPbkNsb3NlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGFsbG93Q2xpY2tUaHJvdWdoOnt0eXBlOkJvb2xlYW59LGFsd2F5c09uVG9wOnt0eXBlOkJvb2xlYW59LApzY3JvbGxBY3Rpb246e3R5cGU6U3RyaW5nfSxfbWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6UG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJ9LF9mb2N1c2VkQ2hpbGQ6e3R5cGU6T2JqZWN0fX0sbGlzdGVuZXJzOnsiaXJvbi1yZXNpemUiOiJfb25Jcm9uUmVzaXplIn0sb2JzZXJ2ZXJzOlsiX191cGRhdGVTY3JvbGxPYnNlcnZlcnMoaXNBdHRhY2hlZCwgb3BlbmVkLCBzY3JvbGxBY3Rpb24pIl0sZ2V0IGJhY2tkcm9wRWxlbWVudCgpe3JldHVybiB0aGlzLl9tYW5hZ2VyLmJhY2tkcm9wRWxlbWVudH0sZ2V0IF9mb2N1c05vZGUoKXtyZXR1cm4gdGhpcy5fZm9jdXNlZENoaWxkfHxQb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yKCJbYXV0b2ZvY3VzXSIpfHx0aGlzfSxnZXQgX2ZvY3VzYWJsZU5vZGVzKCl7cmV0dXJuIFBvbHltZXIuSXJvbkZvY3VzYWJsZXNIZWxwZXIuZ2V0VGFiYmFibGVOb2Rlcyh0aGlzKX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9fc2hvdWxkUmVtb3ZlVGFiSW5kZXg9CnRoaXMuX19pc0FuaW1hdGluZz0hMTt0aGlzLl9fZmlyc3RGb2N1c2FibGVOb2RlPXRoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZT1udWxsO3RoaXMuX19yYWZzPXt9O3RoaXMuX19zY3JvbGxUb3A9dGhpcy5fX3Njcm9sbExlZnQ9dGhpcy5fX3Jlc3RvcmVGb2N1c05vZGU9bnVsbDt0aGlzLl9fb25DYXB0dXJlU2Nyb2xsPXRoaXMuX19vbkNhcHR1cmVTY3JvbGwuYmluZCh0aGlzKTt0aGlzLl9fcm9vdE5vZGVzPW51bGw7dGhpcy5fZW5zdXJlU2V0dXAoKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5fb3BlbmVkQ2hhbmdlZCh0aGlzLm9wZW5lZCk7dGhpcy5fb2JzZXJ2ZXI9UG9seW1lci5kb20odGhpcykub2JzZXJ2ZU5vZGVzKHRoaXMuX29uTm9kZXNDaGFuZ2UpfSxkZXRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuZG9tKHRoaXMpLnVub2JzZXJ2ZU5vZGVzKHRoaXMuX29ic2VydmVyKTt0aGlzLl9vYnNlcnZlcj1udWxsO2Zvcih2YXIgYSBpbiB0aGlzLl9fcmFmcyludWxsIT09CnRoaXMuX19yYWZzW2FdJiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fcmFmc1thXSk7dGhpcy5fX3JhZnM9e307dGhpcy5fbWFuYWdlci5yZW1vdmVPdmVybGF5KHRoaXMpO3RoaXMuX19pc0FuaW1hdGluZyYmKHRoaXMub3BlbmVkP3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOih0aGlzLl9hcHBseUZvY3VzKCksdGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCkpKX0sdG9nZ2xlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Q2FuY2VsZWQoITEpO3RoaXMub3BlbmVkPSF0aGlzLm9wZW5lZH0sb3BlbjpmdW5jdGlvbigpe3RoaXMuX3NldENhbmNlbGVkKCExKTt0aGlzLm9wZW5lZD0hMH0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLl9zZXRDYW5jZWxlZCghMSk7dGhpcy5vcGVuZWQ9ITF9LGNhbmNlbDpmdW5jdGlvbihhKXt0aGlzLmZpcmUoImlyb24tb3ZlcmxheS1jYW5jZWxlZCIsYSx7Y2FuY2VsYWJsZTohMH0pLmRlZmF1bHRQcmV2ZW50ZWR8fCh0aGlzLl9zZXRDYW5jZWxlZCghMCksdGhpcy5vcGVuZWQ9CiExKX0saW52YWxpZGF0ZVRhYmJhYmxlczpmdW5jdGlvbigpe3RoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU9dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlPW51bGx9LF9lbnN1cmVTZXR1cDpmdW5jdGlvbigpe3RoaXMuX292ZXJsYXlTZXR1cHx8KHRoaXMuX292ZXJsYXlTZXR1cD0hMCx0aGlzLnN0eWxlLm91dGxpbmU9Im5vbmUiLHRoaXMuc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbihhKXthP3RoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpOnRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsInRydWUiKTt0aGlzLmlzQXR0YWNoZWQmJih0aGlzLl9faXNBbmltYXRpbmc9ITAsdGhpcy5fX2RlcmFmKCJfX29wZW5lZENoYW5nZWQiLHRoaXMuX19vcGVuZWRDaGFuZ2VkKSl9LF9jYW5jZWxlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmNsb3NpbmdSZWFzb249dGhpcy5jbG9zaW5nUmVhc29ufHx7fTt0aGlzLmNsb3NpbmdSZWFzb24uY2FuY2VsZWQ9CnRoaXMuY2FuY2VsZWR9LF93aXRoQmFja2Ryb3BDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy53aXRoQmFja2Ryb3AmJiF0aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKT8odGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKSx0aGlzLl9fc2hvdWxkUmVtb3ZlVGFiSW5kZXg9ITApOnRoaXMuX19zaG91bGRSZW1vdmVUYWJJbmRleCYmKHRoaXMucmVtb3ZlQXR0cmlidXRlKCJ0YWJpbmRleCIpLHRoaXMuX19zaG91bGRSZW1vdmVUYWJJbmRleD0hMSk7dGhpcy5vcGVuZWQmJnRoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbWFuYWdlci50cmFja0JhY2tkcm9wKCl9LF9wcmVwYXJlUmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5fX3Jlc3RvcmVGb2N1c05vZGU9dGhpcy5fbWFuYWdlci5kZWVwQWN0aXZlRWxlbWVudDt0aGlzLl9wcmVwYXJlUG9zaXRpb25pbmcoKTt0aGlzLnJlZml0KCk7dGhpcy5fZmluaXNoUG9zaXRpb25pbmcoKTt0aGlzLm5vQXV0b0ZvY3VzJiZkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09CnRoaXMuX2ZvY3VzTm9kZSYmKHRoaXMuX2ZvY3VzTm9kZS5ibHVyKCksdGhpcy5fX3Jlc3RvcmVGb2N1c05vZGUuZm9jdXMoKSl9LF9yZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLl9maW5pc2hSZW5kZXJPcGVuZWQoKX0sX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpe3RoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpfSxfZmluaXNoUmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5ub3RpZnlSZXNpemUoKTt0aGlzLl9faXNBbmltYXRpbmc9ITE7dGhpcy5maXJlKCJpcm9uLW92ZXJsYXktb3BlbmVkIil9LF9maW5pc2hSZW5kZXJDbG9zZWQ6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuc3R5bGUuekluZGV4PSIiO3RoaXMubm90aWZ5UmVzaXplKCk7dGhpcy5fX2lzQW5pbWF0aW5nPSExO3RoaXMuZmlyZSgiaXJvbi1vdmVybGF5LWNsb3NlZCIsdGhpcy5jbG9zaW5nUmVhc29uKX0sX3ByZXBhcmVQb3NpdGlvbmluZzpmdW5jdGlvbigpe3RoaXMuc3R5bGUudHJhbnNpdGlvbj0KdGhpcy5zdHlsZS53ZWJraXRUcmFuc2l0aW9uPSJub25lIjt0aGlzLnN0eWxlLnRyYW5zZm9ybT10aGlzLnN0eWxlLndlYmtpdFRyYW5zZm9ybT0ibm9uZSI7dGhpcy5zdHlsZS5kaXNwbGF5PSIifSxfZmluaXNoUG9zaXRpb25pbmc6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wO3RoaXMuc3R5bGUudHJhbnNpdGlvbj10aGlzLnN0eWxlLndlYmtpdFRyYW5zaXRpb249IiI7dGhpcy5zdHlsZS50cmFuc2Zvcm09dGhpcy5zdHlsZS53ZWJraXRUcmFuc2Zvcm09IiI7dGhpcy5zdHlsZS5kaXNwbGF5PSIiO3RoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wfSxfYXBwbHlGb2N1czpmdW5jdGlvbigpe2lmKHRoaXMub3BlbmVkKXRoaXMubm9BdXRvRm9jdXN8fHRoaXMuX2ZvY3VzTm9kZS5mb2N1cygpO2Vsc2V7dGhpcy5fZm9jdXNOb2RlLmJsdXIoKTt0aGlzLl9mb2N1c2VkQ2hpbGQ9bnVsbDtpZih0aGlzLnJlc3RvcmVGb2N1c09uQ2xvc2UmJgp0aGlzLl9fcmVzdG9yZUZvY3VzTm9kZSl7dmFyIGE9dGhpcy5fbWFuYWdlci5kZWVwQWN0aXZlRWxlbWVudDsoYT09PWRvY3VtZW50LmJvZHl8fFBvbHltZXIuZG9tKHRoaXMpLmRlZXBDb250YWlucyhhKSkmJnRoaXMuX19yZXN0b3JlRm9jdXNOb2RlLmZvY3VzKCl9dGhpcy5fX3Jlc3RvcmVGb2N1c05vZGU9bnVsbDsoYT10aGlzLl9tYW5hZ2VyLmN1cnJlbnRPdmVybGF5KCkpJiZ0aGlzIT09YSYmYS5fYXBwbHlGb2N1cygpfX0sX29uQ2FwdHVyZUNsaWNrOmZ1bmN0aW9uKGEpe3RoaXMubm9DYW5jZWxPbk91dHNpZGVDbGlja3x8dGhpcy5jYW5jZWwoYSl9LF9vbkNhcHR1cmVGb2N1czpmdW5jdGlvbihhKXtpZih0aGlzLndpdGhCYWNrZHJvcCl7dmFyIGM9UG9seW1lci5kb20oYSkucGF0aDstMT09PWMuaW5kZXhPZih0aGlzKT8oYS5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLl9hcHBseUZvY3VzKCkpOnRoaXMuX2ZvY3VzZWRDaGlsZD1jWzBdfX0sX29uQ2FwdHVyZUVzYzpmdW5jdGlvbihhKXt0aGlzLm5vQ2FuY2VsT25Fc2NLZXl8fAp0aGlzLmNhbmNlbChhKX0sX29uQ2FwdHVyZVRhYjpmdW5jdGlvbihhKXtpZih0aGlzLndpdGhCYWNrZHJvcCl7dGhpcy5fX2Vuc3VyZUZpcnN0TGFzdEZvY3VzYWJsZXMoKTt2YXIgYz1hLnNoaWZ0S2V5LGQ9Yz90aGlzLl9fZmlyc3RGb2N1c2FibGVOb2RlOnRoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZTtjPWM/dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlOnRoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU7aWYoZD09PWMpZD0hMDtlbHNle3ZhciBmPXRoaXMuX21hbmFnZXIuZGVlcEFjdGl2ZUVsZW1lbnQ7ZD1mPT09ZHx8Zj09PXRoaXN9ZCYmKGEucHJldmVudERlZmF1bHQoKSx0aGlzLl9mb2N1c2VkQ2hpbGQ9Yyx0aGlzLl9hcHBseUZvY3VzKCkpfX0sX29uSXJvblJlc2l6ZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkJiYhdGhpcy5fX2lzQW5pbWF0aW5nJiZ0aGlzLl9fZGVyYWYoInJlZml0Iix0aGlzLnJlZml0KX0sX29uTm9kZXNDaGFuZ2U6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmIXRoaXMuX19pc0FuaW1hdGluZyYmCih0aGlzLmludmFsaWRhdGVUYWJiYWJsZXMoKSx0aGlzLm5vdGlmeVJlc2l6ZSgpKX0sX19lbnN1cmVGaXJzdExhc3RGb2N1c2FibGVzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19maXJzdEZvY3VzYWJsZU5vZGV8fCF0aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGUpe3ZhciBhPXRoaXMuX2ZvY3VzYWJsZU5vZGVzO3RoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU9YVswXTt0aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGU9YVthLmxlbmd0aC0xXX19LF9fb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMub3BlbmVkPyh0aGlzLl9wcmVwYXJlUmVuZGVyT3BlbmVkKCksdGhpcy5fbWFuYWdlci5hZGRPdmVybGF5KHRoaXMpLHRoaXMuX2FwcGx5Rm9jdXMoKSx0aGlzLl9yZW5kZXJPcGVuZWQoKSk6KHRoaXMuX21hbmFnZXIucmVtb3ZlT3ZlcmxheSh0aGlzKSx0aGlzLl9hcHBseUZvY3VzKCksdGhpcy5fcmVuZGVyQ2xvc2VkKCkpfSxfX2RlcmFmOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9dGhpcy5fX3JhZnM7Cm51bGwhPT1kW2FdJiZjYW5jZWxBbmltYXRpb25GcmFtZShkW2FdKTtkW2FdPXJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2RbYV09bnVsbDtjLmNhbGwodGhpcyl9LmJpbmQodGhpcykpfSxfX3VwZGF0ZVNjcm9sbE9ic2VydmVyczpmdW5jdGlvbihhLGMsZCl7YSYmYyYmdGhpcy5fX2lzVmFsaWRTY3JvbGxBY3Rpb24oZCk/KCJsb2NrIj09PWQmJih0aGlzLl9fc2F2ZVNjcm9sbFBvc2l0aW9uKCksUG9seW1lci5Jcm9uU2Nyb2xsTWFuYWdlci5wdXNoU2Nyb2xsTG9jayh0aGlzKSksdGhpcy5fX2FkZFNjcm9sbExpc3RlbmVycygpKTooUG9seW1lci5Jcm9uU2Nyb2xsTWFuYWdlci5yZW1vdmVTY3JvbGxMb2NrKHRoaXMpLHRoaXMuX19yZW1vdmVTY3JvbGxMaXN0ZW5lcnMoKSl9LF9fYWRkU2Nyb2xsTGlzdGVuZXJzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19yb290Tm9kZXMpe3RoaXMuX19yb290Tm9kZXM9W107aWYoUG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cpZm9yKHZhciBhPQp0aGlzO2E7KWEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJmEuaG9zdCYmdGhpcy5fX3Jvb3ROb2Rlcy5wdXNoKGEpLGE9YS5ob3N0fHxhLmFzc2lnbmVkU2xvdHx8YS5wYXJlbnROb2RlO3RoaXMuX19yb290Tm9kZXMucHVzaChkb2N1bWVudCl9dGhpcy5fX3Jvb3ROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGMpe2MuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9fb25DYXB0dXJlU2Nyb2xsLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITB9KX0sdGhpcyl9LF9fcmVtb3ZlU2Nyb2xsTGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fX3Jvb3ROb2RlcyYmdGhpcy5fX3Jvb3ROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9fb25DYXB0dXJlU2Nyb2xsLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITB9KX0sdGhpcyk7dGhpcy5pc0F0dGFjaGVkfHwodGhpcy5fX3Jvb3ROb2Rlcz1udWxsKX0sX19pc1ZhbGlkU2Nyb2xsQWN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiJsb2NrIj09PQphfHwicmVmaXQiPT09YXx8ImNhbmNlbCI9PT1hfSxfX29uQ2FwdHVyZVNjcm9sbDpmdW5jdGlvbihhKXtpZighKHRoaXMuX19pc0FuaW1hdGluZ3x8MDw9UG9seW1lci5kb20oYSkucGF0aC5pbmRleE9mKHRoaXMpKSlzd2l0Y2godGhpcy5zY3JvbGxBY3Rpb24pe2Nhc2UgImxvY2siOnRoaXMuX19yZXN0b3JlU2Nyb2xsUG9zaXRpb24oKTticmVhaztjYXNlICJyZWZpdCI6dGhpcy5fX2RlcmFmKCJyZWZpdCIsdGhpcy5yZWZpdCk7YnJlYWs7Y2FzZSAiY2FuY2VsIjp0aGlzLmNhbmNlbChhKX19LF9fc2F2ZVNjcm9sbFBvc2l0aW9uOmZ1bmN0aW9uKCl7ZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudD8odGhpcy5fX3Njcm9sbFRvcD1kb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbFRvcCx0aGlzLl9fc2Nyb2xsTGVmdD1kb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbExlZnQpOih0aGlzLl9fc2Nyb2xsVG9wPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AsCmRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wKSx0aGlzLl9fc2Nyb2xsTGVmdD1NYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCxkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQpKX0sX19yZXN0b3JlU2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXtkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50Pyhkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbFRvcD10aGlzLl9fc2Nyb2xsVG9wLGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsTGVmdD10aGlzLl9fc2Nyb2xsTGVmdCk6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A9ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A9dGhpcy5fX3Njcm9sbFRvcCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdD1kb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ9dGhpcy5fX3Njcm9sbExlZnQpfX07UG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9yPVtQb2x5bWVyLklyb25GaXRCZWhhdmlvcixQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvciwKUG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9ySW1wbF19KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL25lb24tYW5pbWF0aW9uL25lb24tYW5pbWF0YWJsZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuTmVvbkFuaW1hdGFibGVCZWhhdmlvcj17cHJvcGVydGllczp7YW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdH0sZW50cnlBbmltYXRpb246e29ic2VydmVyOiJfZW50cnlBbmltYXRpb25DaGFuZ2VkIix0eXBlOlN0cmluZ30sZXhpdEFuaW1hdGlvbjp7b2JzZXJ2ZXI6Il9leGl0QW5pbWF0aW9uQ2hhbmdlZCIsdHlwZTpTdHJpbmd9fSxfZW50cnlBbmltYXRpb25DaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5hbmltYXRpb25Db25maWc9dGhpcy5hbmltYXRpb25Db25maWd8fHt9O3RoaXMuYW5pbWF0aW9uQ29uZmlnLmVudHJ5PVt7bmFtZTp0aGlzLmVudHJ5QW5pbWF0aW9uLG5vZGU6dGhpc31dfSxfZXhpdEFuaW1hdGlvbkNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmFuaW1hdGlvbkNvbmZpZz10aGlzLmFuaW1hdGlvbkNvbmZpZ3x8e307dGhpcy5hbmltYXRpb25Db25maWcuZXhpdD1be25hbWU6dGhpcy5leGl0QW5pbWF0aW9uLG5vZGU6dGhpc31dfSxfY29weVByb3BlcnRpZXM6ZnVuY3Rpb24oYSwKYyl7Zm9yKHZhciBkIGluIGMpYVtkXT1jW2RdfSxfY2xvbmVDb25maWc6ZnVuY3Rpb24oYSl7dmFyIGM9e2lzQ2xvbmU6ITB9O3RoaXMuX2NvcHlQcm9wZXJ0aWVzKGMsYSk7cmV0dXJuIGN9LF9nZXRBbmltYXRpb25Db25maWdSZWN1cnNpdmU6ZnVuY3Rpb24oYSxjLGQpe2lmKHRoaXMuYW5pbWF0aW9uQ29uZmlnKWlmKHRoaXMuYW5pbWF0aW9uQ29uZmlnLnZhbHVlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuYW5pbWF0aW9uQ29uZmlnLnZhbHVlKXRoaXMuX3dhcm4odGhpcy5fbG9nZigicGxheUFuaW1hdGlvbiIsIlBsZWFzZSBwdXQgJ2FuaW1hdGlvbkNvbmZpZycgaW5zaWRlIG9mIHlvdXIgY29tcG9uZW50cyAncHJvcGVydGllcycgb2JqZWN0IGluc3RlYWQgb2Ygb3V0c2lkZSBvZiBpdC4iKSk7ZWxzZXt2YXIgZj1hP3RoaXMuYW5pbWF0aW9uQ29uZmlnW2FdOnRoaXMuYW5pbWF0aW9uQ29uZmlnO0FycmF5LmlzQXJyYXkoZil8fChmPVtmXSk7aWYoZilmb3IodmFyIGcsbD0wO2c9CmZbbF07bCsrKWlmKGcuYW5pbWF0YWJsZSlnLmFuaW1hdGFibGUuX2dldEFuaW1hdGlvbkNvbmZpZ1JlY3Vyc2l2ZShnLnR5cGV8fGEsYyxkKTtlbHNlIGlmKGcuaWQpe3ZhciBrPWNbZy5pZF07az8oay5pc0Nsb25lfHwoY1tnLmlkXT10aGlzLl9jbG9uZUNvbmZpZyhrKSxrPWNbZy5pZF0pLHRoaXMuX2NvcHlQcm9wZXJ0aWVzKGssZykpOmNbZy5pZF09Z31lbHNlIGQucHVzaChnKX19LGdldEFuaW1hdGlvbkNvbmZpZzpmdW5jdGlvbihhKXt2YXIgYz17fSxkPVtdO3RoaXMuX2dldEFuaW1hdGlvbkNvbmZpZ1JlY3Vyc2l2ZShhLGMsZCk7Zm9yKHZhciBmIGluIGMpZC5wdXNoKGNbZl0pO3JldHVybiBkfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vbmVvbi1hbmltYXRpb24vbmVvbi1hbmltYXRpb24tcnVubmVyLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5OZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3JJbXBsPXtfY29uZmlndXJlQW5pbWF0aW9uczpmdW5jdGlvbihhKXt2YXIgYz1bXSxkPVtdO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBmLGc9MDtmPWFbZ107ZysrKXt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGYubmFtZSk7aWYobC5pc05lb25BbmltYXRpb24pe3ZhciBrPW51bGw7bC5jb25maWd1cmV8fChsLmNvbmZpZ3VyZT1mdW5jdGlvbigpe3JldHVybiBudWxsfSk7az1sLmNvbmZpZ3VyZShmKTtkLnB1c2goe3Jlc3VsdDprLGNvbmZpZzpmfSl9ZWxzZSBjb25zb2xlLndhcm4odGhpcy5pcysiOiIsZi5uYW1lLCJub3QgZm91bmQhIil9Zm9yKGE9MDthPGQubGVuZ3RoO2ErKyl7az1kW2FdLnJlc3VsdDtmPWRbYV0uY29uZmlnO3RyeXsiZnVuY3Rpb24iIT10eXBlb2Ygay5jYW5jZWwmJihrPWRvY3VtZW50LnRpbWVsaW5lLnBsYXkoaykpfWNhdGNoKG4pe2s9bnVsbCxjb25zb2xlLndhcm4oIkNvdWxkbnQgcGxheSIsCiIoIixmLm5hbWUsIikuIixuKX1rJiZjLnB1c2goe25lb25BbmltYXRpb246bCxjb25maWc6ZixhbmltYXRpb246a30pfXJldHVybiBjfSxfc2hvdWxkQ29tcGxldGU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPSEwLGQ9MDtkPGEubGVuZ3RoO2QrKylpZigiZmluaXNoZWQiIT1hW2RdLmFuaW1hdGlvbi5wbGF5U3RhdGUpe2M9ITE7YnJlYWt9cmV0dXJuIGN9LF9jb21wbGV0ZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylhW2NdLm5lb25BbmltYXRpb24uY29tcGxldGUoYVtjXS5jb25maWcpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYVtjXS5hbmltYXRpb24uY2FuY2VsKCl9LHBsYXlBbmltYXRpb246ZnVuY3Rpb24oYSxjKXt2YXIgZD10aGlzLmdldEFuaW1hdGlvbkNvbmZpZyhhKTtpZihkKXt0aGlzLl9hY3RpdmU9dGhpcy5fYWN0aXZlfHx7fTt0aGlzLl9hY3RpdmVbYV0mJih0aGlzLl9jb21wbGV0ZSh0aGlzLl9hY3RpdmVbYV0pLGRlbGV0ZSB0aGlzLl9hY3RpdmVbYV0pOwp2YXIgZj10aGlzLl9jb25maWd1cmVBbmltYXRpb25zKGQpO2lmKDA9PWYubGVuZ3RoKXRoaXMuZmlyZSgibmVvbi1hbmltYXRpb24tZmluaXNoIixjLHtidWJibGVzOiExfSk7ZWxzZSBmb3IodGhpcy5fYWN0aXZlW2FdPWYsZD0wO2Q8Zi5sZW5ndGg7ZCsrKWZbZF0uYW5pbWF0aW9uLm9uZmluaXNoPWZ1bmN0aW9uKCl7dGhpcy5fc2hvdWxkQ29tcGxldGUoZikmJih0aGlzLl9jb21wbGV0ZShmKSxkZWxldGUgdGhpcy5fYWN0aXZlW2FdLHRoaXMuZmlyZSgibmVvbi1hbmltYXRpb24tZmluaXNoIixjLHtidWJibGVzOiExfSkpfS5iaW5kKHRoaXMpfX0sY2FuY2VsQW5pbWF0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIHRoaXMuX2FjdGl2ZSl7dmFyIGM9dGhpcy5fYWN0aXZlW2FdLGQ7Zm9yKGQgaW4gYyljW2RdLmFuaW1hdGlvbi5jYW5jZWwoKX10aGlzLl9hY3RpdmU9e319fTsKUG9seW1lci5OZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3I9W1BvbHltZXIuTmVvbkFuaW1hdGFibGVCZWhhdmlvcixQb2x5bWVyLk5lb25BbmltYXRpb25SdW5uZXJCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tZHJvcGRvd24vaXJvbi1kcm9wZG93bi1zY3JvbGwtbWFuYWdlci5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbkRyb3Bkb3duU2Nyb2xsTWFuYWdlcj1Qb2x5bWVyLklyb25TY3JvbGxNYW5hZ2VyfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWRyb3Bkb3duL2lyb24tZHJvcGRvd24uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoiaXJvbi1kcm9wZG93biIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcixQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3IsUG9seW1lci5OZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3JdLHByb3BlcnRpZXM6e2hvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sdmVydGljYWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6InRvcCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxvcGVuQW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdH0sY2xvc2VBbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0fSxmb2N1c1RhcmdldDp7dHlwZTpPYmplY3R9LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbGxvd091dHNpZGVTY3JvbGw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2FsbG93T3V0c2lkZVNjcm9sbENoYW5nZWQifX0sCmxpc3RlbmVyczp7Im5lb24tYW5pbWF0aW9uLWZpbmlzaCI6Il9vbk5lb25BbmltYXRpb25GaW5pc2gifSxvYnNlcnZlcnM6WyJfdXBkYXRlT3ZlcmxheVBvc2l0aW9uKHBvc2l0aW9uVGFyZ2V0LCB2ZXJ0aWNhbEFsaWduLCBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsT2Zmc2V0LCBob3Jpem9udGFsT2Zmc2V0KSJdLGdldCBjb250YWluZWRFbGVtZW50KCl7Zm9yKHZhciBhPVBvbHltZXIuZG9tKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCksYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKylpZihhW2NdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIGFbY119LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxBY3Rpb258fCh0aGlzLnNjcm9sbEFjdGlvbj10aGlzLmFsbG93T3V0c2lkZVNjcm9sbD8icmVmaXQiOiJsb2NrIik7dGhpcy5fcmVhZGllZD0hMH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnNpemluZ1RhcmdldCYmdGhpcy5zaXppbmdUYXJnZXQhPT0KdGhpc3x8KHRoaXMuc2l6aW5nVGFyZ2V0PXRoaXMuY29udGFpbmVkRWxlbWVudHx8dGhpcyl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxBbmltYXRpb24oKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5kaXNhYmxlZD90aGlzLmNhbmNlbCgpOih0aGlzLmNhbmNlbEFuaW1hdGlvbigpLHRoaXMuX3VwZGF0ZUFuaW1hdGlvbkNvbmZpZygpLFBvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX29wZW5lZENoYW5nZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sX3JlbmRlck9wZW5lZDpmdW5jdGlvbigpeyF0aGlzLm5vQW5pbWF0aW9ucyYmdGhpcy5hbmltYXRpb25Db25maWcub3Blbj8odGhpcy4kLmNvbnRlbnRXcmFwcGVyLmNsYXNzTGlzdC5hZGQoImFuaW1hdGluZyIpLHRoaXMucGxheUFuaW1hdGlvbigib3BlbiIpKTpQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JJbXBsLl9yZW5kZXJPcGVuZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSwKX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpeyF0aGlzLm5vQW5pbWF0aW9ucyYmdGhpcy5hbmltYXRpb25Db25maWcuY2xvc2U/KHRoaXMuJC5jb250ZW50V3JhcHBlci5jbGFzc0xpc3QuYWRkKCJhbmltYXRpbmciKSx0aGlzLnBsYXlBbmltYXRpb24oImNsb3NlIikpOlBvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX3JlbmRlckNsb3NlZC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9vbk5lb25BbmltYXRpb25GaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLiQuY29udGVudFdyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSgiYW5pbWF0aW5nIik7dGhpcy5vcGVuZWQ/dGhpcy5fZmluaXNoUmVuZGVyT3BlbmVkKCk6dGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCl9LF91cGRhdGVBbmltYXRpb25Db25maWc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5jb250YWluZWRFbGVtZW50LGM9W10uY29uY2F0KHRoaXMub3BlbkFuaW1hdGlvbkNvbmZpZ3x8W10pLmNvbmNhdCh0aGlzLmNsb3NlQW5pbWF0aW9uQ29uZmlnfHwKW10pLGQ9MDtkPGMubGVuZ3RoO2QrKyljW2RdLm5vZGU9YTt0aGlzLmFuaW1hdGlvbkNvbmZpZz17b3Blbjp0aGlzLm9wZW5BbmltYXRpb25Db25maWcsY2xvc2U6dGhpcy5jbG9zZUFuaW1hdGlvbkNvbmZpZ319LF91cGRhdGVPdmVybGF5UG9zaXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzQXR0YWNoZWQmJnRoaXMubm90aWZ5UmVzaXplKCl9LF9hbGxvd091dHNpZGVTY3JvbGxDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuX3JlYWRpZWQmJihhP3RoaXMuc2Nyb2xsQWN0aW9uJiYibG9jayIhPT10aGlzLnNjcm9sbEFjdGlvbnx8KHRoaXMuc2Nyb2xsQWN0aW9uPSJyZWZpdCIpOnRoaXMuc2Nyb2xsQWN0aW9uPSJsb2NrIil9LF9hcHBseUZvY3VzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5mb2N1c1RhcmdldHx8dGhpcy5jb250YWluZWRFbGVtZW50O2EmJnRoaXMub3BlbmVkJiYhdGhpcy5ub0F1dG9Gb2N1cz9hLmZvY3VzKCk6UG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9ySW1wbC5fYXBwbHlGb2N1cy5hcHBseSh0aGlzLAphcmd1bWVudHMpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9uZW9uLWFuaW1hdGlvbi9uZW9uLWFuaW1hdGlvbi1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthbmltYXRpb25UaW1pbmc6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue2R1cmF0aW9uOjUwMCxlYXNpbmc6ImN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSkiLGZpbGw6ImJvdGgifX19fSxpc05lb25BbmltYXRpb246ITAsY3JlYXRlZDpmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuYW5pbWF0ZXx8Y29uc29sZS53YXJuKCJObyB3ZWIgYW5pbWF0aW9ucyBkZXRlY3RlZC4gVGhpcyBlbGVtZW50IHdpbGwgbm90IGZ1bmN0aW9uIHdpdGhvdXQgYSB3ZWIgYW5pbWF0aW9ucyBwb2x5ZmlsbC4iKX0sdGltaW5nRnJvbUNvbmZpZzpmdW5jdGlvbihhKXtpZihhLnRpbWluZylmb3IodmFyIGMgaW4gYS50aW1pbmcpdGhpcy5hbmltYXRpb25UaW1pbmdbY109YS50aW1pbmdbY107cmV0dXJuIHRoaXMuYW5pbWF0aW9uVGltaW5nfSxzZXRQcmVmaXhlZFByb3BlcnR5OmZ1bmN0aW9uKGEsYyxkKXtmb3IodmFyIGY9Cnt0cmFuc2Zvcm06WyJ3ZWJraXRUcmFuc2Zvcm0iXSx0cmFuc2Zvcm1PcmlnaW46WyJtb3pUcmFuc2Zvcm1PcmlnaW4iLCJ3ZWJraXRUcmFuc2Zvcm1PcmlnaW4iXX1bY10sZyxsPTA7Zz1mW2xdO2wrKylhLnN0eWxlW2ddPWQ7YS5zdHlsZVtjXT1kfSxjb21wbGV0ZTpmdW5jdGlvbigpe319OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL25lb24tYW5pbWF0aW9uL2FuaW1hdGlvbnMvZmFkZS1pbi1hbmltYXRpb24uaHRtbC5qcwpQb2x5bWVyKHtpczoiZmFkZS1pbi1hbmltYXRpb24iLGJlaGF2aW9yczpbUG9seW1lci5OZW9uQW5pbWF0aW9uQmVoYXZpb3JdLGNvbmZpZ3VyZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChhLm5vZGUsW3tvcGFjaXR5OiIwIn0se29wYWNpdHk6IjEifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGEpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9uZW9uLWFuaW1hdGlvbi9hbmltYXRpb25zL2ZhZGUtb3V0LWFuaW1hdGlvbi5odG1sLmpzClBvbHltZXIoe2lzOiJmYWRlLW91dC1hbmltYXRpb24iLGJlaGF2aW9yczpbUG9seW1lci5OZW9uQW5pbWF0aW9uQmVoYXZpb3JdLGNvbmZpZ3VyZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChhLm5vZGUsW3tvcGFjaXR5OiIxIn0se29wYWNpdHk6IjAifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGEpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1tZW51LWJ1dHRvbi9wYXBlci1tZW51LWJ1dHRvbi1hbmltYXRpb25zLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLW1lbnUtZ3Jvdy1oZWlnaHQtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1BvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSxjb25maWd1cmU6ZnVuY3Rpb24oYSl7dmFyIGM9YS5ub2RlLGQ9Yy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7cmV0dXJuIHRoaXMuX2VmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QoYyxbe2hlaWdodDpkLzIrInB4In0se2hlaWdodDpkKyJweCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYSkpfX0pO1BvbHltZXIoe2lzOiJwYXBlci1tZW51LWdyb3ctd2lkdGgtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1BvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSxjb25maWd1cmU6ZnVuY3Rpb24oYSl7dmFyIGM9YS5ub2RlLGQ9Yy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChjLFt7d2lkdGg6ZC8yKyJweCJ9LHt3aWR0aDpkKyJweCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYSkpfX0pOwpQb2x5bWVyKHtpczoicGFwZXItbWVudS1zaHJpbmstd2lkdGgtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1BvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSxjb25maWd1cmU6ZnVuY3Rpb24oYSl7dmFyIGM9YS5ub2RlLGQ9Yy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChjLFt7d2lkdGg6ZCsicHgifSx7d2lkdGg6ZC1kLzIwKyJweCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYSkpfX0pOwpQb2x5bWVyKHtpczoicGFwZXItbWVudS1zaHJpbmstaGVpZ2h0LWFuaW1hdGlvbiIsYmVoYXZpb3JzOltQb2x5bWVyLk5lb25BbmltYXRpb25CZWhhdmlvcl0sY29uZmlndXJlOmZ1bmN0aW9uKGEpe3ZhciBjPWEubm9kZSxkPWMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O3RoaXMuc2V0UHJlZml4ZWRQcm9wZXJ0eShjLCJ0cmFuc2Zvcm1PcmlnaW4iLCIwIDAiKTtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChjLFt7aGVpZ2h0OmQrInB4Iix0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMCkifSx7aGVpZ2h0OmQvMisicHgiLHRyYW5zZm9ybToidHJhbnNsYXRlWSgtMjBweCkifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGEpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1tZW51LWJ1dHRvbi9wYXBlci1tZW51LWJ1dHRvbi5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBhPXtBTklNQVRJT05fQ1VCSUNfQkVaSUVSOiJjdWJpYy1iZXppZXIoLjMsLjk1LC41LDEpIixNQVhfQU5JTUFUSU9OX1RJTUVfTVM6NDAwfTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbj1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLnJlZ2lzdGVyZWQ9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5hZGRPd25LZXlCaW5kaW5nPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUucmVtb3ZlT3duS2V5QmluZGluZ3M9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5rZXlib2FyZEV2ZW50TWF0Y2hlc0tleXM9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fY29sbGVjdEtleUJpbmRpbmdzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX3ByZXBLZXlCaW5kaW5ncz0KZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fYWRkS2V5QmluZGluZz1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLl9yZXNldEtleUV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2xpc3RlbktleUV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX3VubGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fb25LZXlCaW5kaW5nRXZlbnQ9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fdHJpZ2dlcktleUhhbmRsZXI9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fZm9jdXNCbHVySGFuZGxlcj1mdW5jdGlvbihjKXtpZihQb2x5bWVyLkVsZW1lbnQpdGhpcy5fc2V0Rm9jdXNlZCgiZm9jdXMiPT09CmMudHlwZSk7ZWxzZSBpZihjLnRhcmdldD09PXRoaXMpdGhpcy5fc2V0Rm9jdXNlZCgiZm9jdXMiPT09Yy50eXBlKTtlbHNlIGlmKHRoaXMuX19oYW5kbGVFdmVudFJldGFyZ2V0aW5nKXt2YXIgZD1Qb2x5bWVyLmRvbShjKS5sb2NhbFRhcmdldDt0aGlzLmlzTGlnaHREZXNjZW5kYW50KGQpfHx0aGlzLmZpcmUoYy50eXBlLHtzb3VyY2VFdmVudDpjfSx7bm9kZTp0aGlzLGJ1YmJsZXM6Yy5idWJibGVzLGNhbmNlbGFibGU6Yy5jYW5jZWxhYmxlfSl9fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2NoYW5nZWRDb250cm9sU3RhdGU9ZnVuY3Rpb24oKXt0aGlzLl9jb250cm9sU3RhdGVDaGFuZ2VkJiZ0aGlzLl9jb250cm9sU3RhdGVDaGFuZ2VkKCl9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fc2V0Rm9jdXNlZD1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b249UG9seW1lcih7aXM6InBhcGVyLW1lbnUtYnV0dG9uIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsClBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZV0scHJvcGVydGllczp7b3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwLG9ic2VydmVyOiJfb3BlbmVkQ2hhbmdlZCJ9LGhvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sdmVydGljYWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6InRvcCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxkeW5hbWljQWxpZ246e3R5cGU6Qm9vbGVhbn0saG9yaXpvbnRhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LHZlcnRpY2FsT2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sbm9PdmVybGFwOnt0eXBlOkJvb2xlYW59LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpZ25vcmVTZWxlY3Q6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sY2xvc2VPbkFjdGl2YXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG9wZW5BbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0LAp2YWx1ZTpmdW5jdGlvbigpe3JldHVyblt7bmFtZToiZmFkZS1pbi1hbmltYXRpb24iLHRpbWluZzp7ZGVsYXk6MTAwLGR1cmF0aW9uOjIwMH19LHtuYW1lOiJwYXBlci1tZW51LWdyb3ctd2lkdGgtYW5pbWF0aW9uIix0aW1pbmc6e2RlbGF5OjEwMCxkdXJhdGlvbjoxNTAsZWFzaW5nOmEuQU5JTUFUSU9OX0NVQklDX0JFWklFUn19LHtuYW1lOiJwYXBlci1tZW51LWdyb3ctaGVpZ2h0LWFuaW1hdGlvbiIsdGltaW5nOntkZWxheToxMDAsZHVyYXRpb246Mjc1LGVhc2luZzphLkFOSU1BVElPTl9DVUJJQ19CRVpJRVJ9fV19fSxjbG9zZUFuaW1hdGlvbkNvbmZpZzp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5be25hbWU6ImZhZGUtb3V0LWFuaW1hdGlvbiIsdGltaW5nOntkdXJhdGlvbjoxNTB9fSx7bmFtZToicGFwZXItbWVudS1zaHJpbmstd2lkdGgtYW5pbWF0aW9uIix0aW1pbmc6e2RlbGF5OjEwMCxkdXJhdGlvbjo1MCxlYXNpbmc6YS5BTklNQVRJT05fQ1VCSUNfQkVaSUVSfX0sCntuYW1lOiJwYXBlci1tZW51LXNocmluay1oZWlnaHQtYW5pbWF0aW9uIix0aW1pbmc6e2R1cmF0aW9uOjIwMCxlYXNpbmc6ImVhc2UtaW4ifX1dfX0sYWxsb3dPdXRzaWRlU2Nyb2xsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHJlc3RvcmVGb2N1c09uQ2xvc2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX2Ryb3Bkb3duQ29udGVudDp7dHlwZTpPYmplY3R9fSxob3N0QXR0cmlidXRlczp7cm9sZToiZ3JvdXAiLCJhcmlhLWhhc3BvcHVwIjoidHJ1ZSJ9LGxpc3RlbmVyczp7Imlyb24tYWN0aXZhdGUiOiJfb25Jcm9uQWN0aXZhdGUiLCJpcm9uLXNlbGVjdCI6Il9vbklyb25TZWxlY3QifSxnZXQgY29udGVudEVsZW1lbnQoKXtmb3IodmFyIGM9UG9seW1lci5kb20odGhpcy4kLmNvbnRlbnQpLmdldERpc3RyaWJ1dGVkTm9kZXMoKSxkPTAsZj1jLmxlbmd0aDtkPGY7ZCsrKWlmKGNbZF0ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4gY1tkXX0sdG9nZ2xlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ/CnRoaXMuY2xvc2UoKTp0aGlzLm9wZW4oKX0sb3BlbjpmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWR8fHRoaXMuJC5kcm9wZG93bi5vcGVuKCl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy4kLmRyb3Bkb3duLmNsb3NlKCl9LF9vbklyb25TZWxlY3Q6ZnVuY3Rpb24oKXt0aGlzLmlnbm9yZVNlbGVjdHx8dGhpcy5jbG9zZSgpfSxfb25Jcm9uQWN0aXZhdGU6ZnVuY3Rpb24oKXt0aGlzLmNsb3NlT25BY3RpdmF0ZSYmdGhpcy5jbG9zZSgpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbihjLGQpe2M/KHRoaXMuX2Ryb3Bkb3duQ29udGVudD10aGlzLmNvbnRlbnRFbGVtZW50LHRoaXMuZmlyZSgicGFwZXItZHJvcGRvd24tb3BlbiIpKTpudWxsIT1kJiZ0aGlzLmZpcmUoInBhcGVyLWRyb3Bkb3duLWNsb3NlIil9LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24oYyl7UG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLl9kaXNhYmxlZENoYW5nZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpO2MmJnRoaXMub3BlbmVkJiYKdGhpcy5jbG9zZSgpfSxfX29uSXJvbk92ZXJsYXlDYW5jZWxlZDpmdW5jdGlvbihjKXt2YXIgZD10aGlzLiQudHJpZ2dlcjstMTxQb2x5bWVyLmRvbShjLmRldGFpbCkucGF0aC5pbmRleE9mKGQpJiZjLnByZXZlbnREZWZhdWx0KCl9fSk7T2JqZWN0LmtleXMoYSkuZm9yRWFjaChmdW5jdGlvbihjKXtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbltjXT1hW2NdfSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24taWNvbnNldC1zdmcvaXJvbi1pY29uc2V0LXN2Zy5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLWljb25zZXQtc3ZnIixwcm9wZXJ0aWVzOntuYW1lOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX25hbWVDaGFuZ2VkIn0sc2l6ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MjR9LHJ0bE1pcnJvcmluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx1c2VHbG9iYWxSdGxBdHRyaWJ1dGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9tZXRhPW5ldyBQb2x5bWVyLklyb25NZXRhKHt0eXBlOiJpY29uc2V0IixrZXk6bnVsbCx2YWx1ZTpudWxsfSl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZ2V0SWNvbk5hbWVzOmZ1bmN0aW9uKCl7dGhpcy5faWNvbnM9dGhpcy5fY3JlYXRlSWNvbk1hcCgpO3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9pY29ucykubWFwKGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5hbWUrIjoiK2F9LHRoaXMpfSxhcHBseUljb246ZnVuY3Rpb24oYSxjKXt0aGlzLnJlbW92ZUljb24oYSk7CmlmKGM9dGhpcy5fY2xvbmVJY29uKGMsdGhpcy5ydGxNaXJyb3JpbmcmJnRoaXMuX3RhcmdldElzUlRMKGEpKSl7dmFyIGQ9UG9seW1lci5kb20oYS5yb290fHxhKTtkLmluc2VydEJlZm9yZShjLGQuY2hpbGROb2Rlc1swXSk7cmV0dXJuIGEuX3N2Z0ljb249Y31yZXR1cm4gbnVsbH0scmVtb3ZlSWNvbjpmdW5jdGlvbihhKXthLl9zdmdJY29uJiYoUG9seW1lci5kb20oYS5yb290fHxhKS5yZW1vdmVDaGlsZChhLl9zdmdJY29uKSxhLl9zdmdJY29uPW51bGwpfSxfdGFyZ2V0SXNSVEw6ZnVuY3Rpb24oYSl7bnVsbD09dGhpcy5fX3RhcmdldElzUlRMJiYodGhpcy51c2VHbG9iYWxSdGxBdHRyaWJ1dGU/dGhpcy5fX3RhcmdldElzUlRMPSJydGwiPT09KGRvY3VtZW50LmJvZHkmJmRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKCJkaXIiKT9kb2N1bWVudC5ib2R5OmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0QXR0cmlidXRlKCJkaXIiKTooYSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFJiYKKGE9YS5ob3N0KSx0aGlzLl9fdGFyZ2V0SXNSVEw9YSYmInJ0bCI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5kaXJlY3Rpb24pKTtyZXR1cm4gdGhpcy5fX3RhcmdldElzUlRMfSxfbmFtZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9tZXRhLnZhbHVlPW51bGw7dGhpcy5fbWV0YS5rZXk9dGhpcy5uYW1lO3RoaXMuX21ldGEudmFsdWU9dGhpczt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5maXJlKCJpcm9uLWljb25zZXQtYWRkZWQiLHRoaXMse25vZGU6d2luZG93fSl9KX0sX2NyZWF0ZUljb25NYXA6ZnVuY3Rpb24oKXt2YXIgYT1PYmplY3QuY3JlYXRlKG51bGwpO1BvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZF0iKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2FbYy5pZF09Y30pO3JldHVybiBhfSxfY2xvbmVJY29uOmZ1bmN0aW9uKGEsYyl7dGhpcy5faWNvbnM9dGhpcy5faWNvbnN8fHRoaXMuX2NyZWF0ZUljb25NYXAoKTtyZXR1cm4gdGhpcy5fcHJlcGFyZVN2Z0Nsb25lKHRoaXMuX2ljb25zW2FdLAp0aGlzLnNpemUsYyl9LF9wcmVwYXJlU3ZnQ2xvbmU6ZnVuY3Rpb24oYSxjLGQpe2lmKGEpe2E9YS5jbG9uZU5vZGUoITApO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJzdmciKTtjPWEuZ2V0QXR0cmlidXRlKCJ2aWV3Qm94Iil8fCIwIDAgIitjKyIgIitjO3ZhciBnPSJwb2ludGVyLWV2ZW50czogbm9uZTsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IjtkJiZhLmhhc0F0dHJpYnV0ZSgibWlycm9yLWluLXJ0bCIpJiYoZys9Ii13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC0xLDEpO3RyYW5zZm9ybTpzY2FsZSgtMSwxKTt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjsiKTtmLnNldEF0dHJpYnV0ZSgidmlld0JveCIsYyk7Zi5zZXRBdHRyaWJ1dGUoInByZXNlcnZlQXNwZWN0UmF0aW8iLCJ4TWlkWU1pZCBtZWV0Iik7Zi5zZXRBdHRyaWJ1dGUoImZvY3VzYWJsZSIsImZhbHNlIik7Zi5zdHlsZS5jc3NUZXh0PQpnO2YuYXBwZW5kQ2hpbGQoYSkucmVtb3ZlQXR0cmlidXRlKCJpZCIpO3JldHVybiBmfXJldHVybiBudWxsfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWRyb3Bkb3duLW1lbnUvcGFwZXItZHJvcGRvd24tbWVudS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJwYXBlci1kcm9wZG93bi1tZW51IixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLklyb25Gb3JtRWxlbWVudEJlaGF2aW9yLFBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3NlbGVjdGVkSXRlbUxhYmVsOnt0eXBlOlN0cmluZyxub3RpZnk6ITAscmVhZE9ubHk6ITB9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSx2YWx1ZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxsYWJlbDp7dHlwZTpTdHJpbmd9LHBsYWNlaG9sZGVyOnt0eXBlOlN0cmluZ30sZXJyb3JNZXNzYWdlOnt0eXBlOlN0cmluZ30sb3BlbmVkOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExLG9ic2VydmVyOiJfb3BlbmVkQ2hhbmdlZCJ9LGFsbG93T3V0c2lkZVNjcm9sbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0xhYmVsRmxvYXQ6e3R5cGU6Qm9vbGVhbiwKdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxhbHdheXNGbG9hdExhYmVsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJyaWdodCJ9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJ0b3AifSx2ZXJ0aWNhbE9mZnNldDpOdW1iZXIsZHluYW1pY0FsaWduOnt0eXBlOkJvb2xlYW59LHJlc3RvcmVGb2N1c09uQ2xvc2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LGxpc3RlbmVyczp7dGFwOiJfb25UYXAifSxrZXlCaW5kaW5nczp7InVwIGRvd24iOiJvcGVuIixlc2M6ImNsb3NlIn0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImNvbWJvYm94IiwiYXJpYS1hdXRvY29tcGxldGUiOiJub25lIiwiYXJpYS1oYXNwb3B1cCI6InRydWUifSxvYnNlcnZlcnM6WyJfc2VsZWN0ZWRJdGVtQ2hhbmdlZChzZWxlY3RlZEl0ZW0pIl0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5jb250ZW50RWxlbWVudDthJiZhLnNlbGVjdGVkSXRlbSYmdGhpcy5fc2V0U2VsZWN0ZWRJdGVtKGEuc2VsZWN0ZWRJdGVtKX0sZ2V0IGNvbnRlbnRFbGVtZW50KCl7Zm9yKHZhciBhPVBvbHltZXIuZG9tKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCksYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKylpZihhW2NdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIGFbY119LG9wZW46ZnVuY3Rpb24oKXt0aGlzLiQubWVudUJ1dHRvbi5vcGVuKCl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy4kLm1lbnVCdXR0b24uY2xvc2UoKX0sX29uSXJvblNlbGVjdDpmdW5jdGlvbihhKXt0aGlzLl9zZXRTZWxlY3RlZEl0ZW0oYS5kZXRhaWwuaXRlbSl9LF9vbklyb25EZXNlbGVjdDpmdW5jdGlvbigpe3RoaXMuX3NldFNlbGVjdGVkSXRlbShudWxsKX0sX29uVGFwOmZ1bmN0aW9uKGEpe1BvbHltZXIuR2VzdHVyZXMuZmluZE9yaWdpbmFsVGFyZ2V0KGEpPT09dGhpcyYmCnRoaXMub3BlbigpfSxfc2VsZWN0ZWRJdGVtQ2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLnZhbHVlPWE9YT9hLmxhYmVsfHxhLmdldEF0dHJpYnV0ZSgibGFiZWwiKXx8YS50ZXh0Q29udGVudC50cmltKCk6IiI7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtTGFiZWwoYSl9LF9jb21wdXRlTWVudVZlcnRpY2FsT2Zmc2V0OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGM/YzphPy00Ojh9LF9nZXRWYWxpZGl0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc2FibGVkfHwhdGhpcy5yZXF1aXJlZHx8dGhpcy5yZXF1aXJlZCYmISF0aGlzLnZhbHVlfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3BlbmVkPyJ0cnVlIjoiZmFsc2UiLGM9dGhpcy5jb250ZW50RWxlbWVudDtjJiZjLnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsYSl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1zZWxlY3Rpb24uaHRtbC5qcwpQb2x5bWVyLklyb25TZWxlY3Rpb249ZnVuY3Rpb24oYSl7dGhpcy5zZWxlY3Rpb249W107dGhpcy5zZWxlY3RDYWxsYmFjaz1hfTsKUG9seW1lci5Jcm9uU2VsZWN0aW9uLnByb3RvdHlwZT17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXVsdGk/dGhpcy5zZWxlY3Rpb24uc2xpY2UoKTp0aGlzLnNlbGVjdGlvblswXX0sY2xlYXI6ZnVuY3Rpb24oYSl7dGhpcy5zZWxlY3Rpb24uc2xpY2UoKS5mb3JFYWNoKGZ1bmN0aW9uKGMpeyghYXx8MD5hLmluZGV4T2YoYykpJiZ0aGlzLnNldEl0ZW1TZWxlY3RlZChjLCExKX0sdGhpcyl9LGlzU2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8PXRoaXMuc2VsZWN0aW9uLmluZGV4T2YoYSl9LHNldEl0ZW1TZWxlY3RlZDpmdW5jdGlvbihhLGMpe2lmKG51bGwhPWEmJmMhPT10aGlzLmlzU2VsZWN0ZWQoYSkpe2lmKGMpdGhpcy5zZWxlY3Rpb24ucHVzaChhKTtlbHNle3ZhciBkPXRoaXMuc2VsZWN0aW9uLmluZGV4T2YoYSk7MDw9ZCYmdGhpcy5zZWxlY3Rpb24uc3BsaWNlKGQsMSl9dGhpcy5zZWxlY3RDYWxsYmFjayYmdGhpcy5zZWxlY3RDYWxsYmFjayhhLGMpfX0sc2VsZWN0OmZ1bmN0aW9uKGEpe3RoaXMubXVsdGk/CnRoaXMudG9nZ2xlKGEpOnRoaXMuZ2V0KCkhPT1hJiYodGhpcy5zZXRJdGVtU2VsZWN0ZWQodGhpcy5nZXQoKSwhMSksdGhpcy5zZXRJdGVtU2VsZWN0ZWQoYSwhMCkpfSx0b2dnbGU6ZnVuY3Rpb24oYSl7dGhpcy5zZXRJdGVtU2VsZWN0ZWQoYSwhdGhpcy5pc1NlbGVjdGVkKGEpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1zZWxlY3RhYmxlLmh0bWwuanMKUG9seW1lci5Jcm9uU2VsZWN0YWJsZUJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthdHRyRm9yU2VsZWN0ZWQ6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHNlbGVjdGVkOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxhY3RpdmF0ZUV2ZW50Ont0eXBlOlN0cmluZyx2YWx1ZToidGFwIixvYnNlcnZlcjoiX2FjdGl2YXRlRXZlbnRDaGFuZ2VkIn0sc2VsZWN0YWJsZTpTdHJpbmcsc2VsZWN0ZWRDbGFzczp7dHlwZTpTdHJpbmcsdmFsdWU6Imlyb24tc2VsZWN0ZWQifSxzZWxlY3RlZEF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sZmFsbGJhY2tTZWxlY3Rpb246e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGl0ZW1zOnt0eXBlOkFycmF5LHJlYWRPbmx5OiEwLG5vdGlmeTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX2V4Y2x1ZGVkTG9jYWxOYW1lczp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57dGVtcGxhdGU6MSwKImRvbS1iaW5kIjoxLCJkb20taWYiOjEsImRvbS1yZXBlYXQiOjF9fX19LG9ic2VydmVyczpbIl91cGRhdGVBdHRyRm9yU2VsZWN0ZWQoYXR0ckZvclNlbGVjdGVkKSIsIl91cGRhdGVTZWxlY3RlZChzZWxlY3RlZCkiLCJfY2hlY2tGYWxsYmFjayhmYWxsYmFja1NlbGVjdGlvbikiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fYmluZEZpbHRlckl0ZW09dGhpcy5fZmlsdGVySXRlbS5iaW5kKHRoaXMpO3RoaXMuX3NlbGVjdGlvbj1uZXcgUG9seW1lci5Jcm9uU2VsZWN0aW9uKHRoaXMuX2FwcGx5U2VsZWN0aW9uLmJpbmQodGhpcykpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPXRoaXMuX29ic2VydmVJdGVtcyh0aGlzKTt0aGlzLl9hZGRMaXN0ZW5lcih0aGlzLmFjdGl2YXRlRXZlbnQpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiZQb2x5bWVyLmRvbSh0aGlzKS51bm9ic2VydmVOb2Rlcyh0aGlzLl9vYnNlcnZlcik7dGhpcy5fcmVtb3ZlTGlzdGVuZXIodGhpcy5hY3RpdmF0ZUV2ZW50KX0sCmluZGV4T2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXRlbXM/dGhpcy5pdGVtcy5pbmRleE9mKGEpOi0xfSxzZWxlY3Q6ZnVuY3Rpb24oYSl7dGhpcy5zZWxlY3RlZD1hfSxzZWxlY3RQcmV2aW91czpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaXRlbXMubGVuZ3RoO2E9KE51bWJlcih0aGlzLl92YWx1ZVRvSW5kZXgodGhpcy5zZWxlY3RlZCkpLTErYSklYTt0aGlzLnNlbGVjdGVkPXRoaXMuX2luZGV4VG9WYWx1ZShhKX0sc2VsZWN0TmV4dDpmdW5jdGlvbigpe3ZhciBhPShOdW1iZXIodGhpcy5fdmFsdWVUb0luZGV4KHRoaXMuc2VsZWN0ZWQpKSsxKSV0aGlzLml0ZW1zLmxlbmd0aDt0aGlzLnNlbGVjdGVkPXRoaXMuX2luZGV4VG9WYWx1ZShhKX0sc2VsZWN0SW5kZXg6ZnVuY3Rpb24oYSl7dGhpcy5zZWxlY3QodGhpcy5faW5kZXhUb1ZhbHVlKGEpKX0sZm9yY2VTeW5jaHJvbm91c0l0ZW1VcGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlciYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLl9vYnNlcnZlci5mbHVzaD8KdGhpcy5fb2JzZXJ2ZXIuZmx1c2goKTp0aGlzLl91cGRhdGVJdGVtcygpfSxnZXQgX3Nob3VsZFVwZGF0ZVNlbGVjdGlvbigpe3JldHVybiBudWxsIT10aGlzLnNlbGVjdGVkfSxfY2hlY2tGYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVNlbGVjdGVkKCl9LF9hZGRMaXN0ZW5lcjpmdW5jdGlvbihhKXt0aGlzLmxpc3Rlbih0aGlzLGEsIl9hY3RpdmF0ZUhhbmRsZXIiKX0sX3JlbW92ZUxpc3RlbmVyOmZ1bmN0aW9uKGEpe3RoaXMudW5saXN0ZW4odGhpcyxhLCJfYWN0aXZhdGVIYW5kbGVyIil9LF9hY3RpdmF0ZUV2ZW50Q2hhbmdlZDpmdW5jdGlvbihhLGMpe3RoaXMuX3JlbW92ZUxpc3RlbmVyKGMpO3RoaXMuX2FkZExpc3RlbmVyKGEpfSxfdXBkYXRlSXRlbXM6ZnVuY3Rpb24oKXt2YXIgYT1Qb2x5bWVyLmRvbSh0aGlzKS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHModGhpcy5zZWxlY3RhYmxlfHwiKiIpO2E9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGEsdGhpcy5fYmluZEZpbHRlckl0ZW0pOwp0aGlzLl9zZXRJdGVtcyhhKX0sX3VwZGF0ZUF0dHJGb3JTZWxlY3RlZDpmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWRJdGVtJiYodGhpcy5zZWxlY3RlZD10aGlzLl92YWx1ZUZvckl0ZW0odGhpcy5zZWxlY3RlZEl0ZW0pKX0sX3VwZGF0ZVNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5fc2VsZWN0U2VsZWN0ZWQodGhpcy5zZWxlY3RlZCl9LF9zZWxlY3RTZWxlY3RlZDpmdW5jdGlvbigpe2lmKHRoaXMuaXRlbXMpe3ZhciBhPXRoaXMuX3ZhbHVlVG9JdGVtKHRoaXMuc2VsZWN0ZWQpO2E/dGhpcy5fc2VsZWN0aW9uLnNlbGVjdChhKTp0aGlzLl9zZWxlY3Rpb24uY2xlYXIoKTt0aGlzLmZhbGxiYWNrU2VsZWN0aW9uJiZ0aGlzLml0ZW1zLmxlbmd0aCYmdm9pZCAwPT09dGhpcy5fc2VsZWN0aW9uLmdldCgpJiYodGhpcy5zZWxlY3RlZD10aGlzLmZhbGxiYWNrU2VsZWN0aW9uKX19LF9maWx0ZXJJdGVtOmZ1bmN0aW9uKGEpe3JldHVybiF0aGlzLl9leGNsdWRlZExvY2FsTmFtZXNbYS5sb2NhbE5hbWVdfSwKX3ZhbHVlVG9JdGVtOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hP251bGw6dGhpcy5pdGVtc1t0aGlzLl92YWx1ZVRvSW5kZXgoYSldfSxfdmFsdWVUb0luZGV4OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYXR0ckZvclNlbGVjdGVkKWZvcih2YXIgYz0wLGQ7ZD10aGlzLml0ZW1zW2NdO2MrKyl7aWYodGhpcy5fdmFsdWVGb3JJdGVtKGQpPT1hKXJldHVybiBjfWVsc2UgcmV0dXJuIE51bWJlcihhKX0sX2luZGV4VG9WYWx1ZTpmdW5jdGlvbihhKXtpZih0aGlzLmF0dHJGb3JTZWxlY3RlZCl7aWYoYT10aGlzLml0ZW1zW2FdKXJldHVybiB0aGlzLl92YWx1ZUZvckl0ZW0oYSl9ZWxzZSByZXR1cm4gYX0sX3ZhbHVlRm9ySXRlbTpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4gbnVsbDtpZighdGhpcy5hdHRyRm9yU2VsZWN0ZWQpcmV0dXJuIGE9dGhpcy5pbmRleE9mKGEpLC0xPT09YT9udWxsOmE7dmFyIGM9YVtQb2x5bWVyLkNhc2VNYXAuZGFzaFRvQ2FtZWxDYXNlKHRoaXMuYXR0ckZvclNlbGVjdGVkKV07CnJldHVybiB2b2lkIDAhPWM/YzphLmdldEF0dHJpYnV0ZSh0aGlzLmF0dHJGb3JTZWxlY3RlZCl9LF9hcHBseVNlbGVjdGlvbjpmdW5jdGlvbihhLGMpe3RoaXMuc2VsZWN0ZWRDbGFzcyYmdGhpcy50b2dnbGVDbGFzcyh0aGlzLnNlbGVjdGVkQ2xhc3MsYyxhKTt0aGlzLnNlbGVjdGVkQXR0cmlidXRlJiZ0aGlzLnRvZ2dsZUF0dHJpYnV0ZSh0aGlzLnNlbGVjdGVkQXR0cmlidXRlLGMsYSk7dGhpcy5fc2VsZWN0aW9uQ2hhbmdlKCk7dGhpcy5maXJlKCJpcm9uLSIrKGM/InNlbGVjdCI6ImRlc2VsZWN0Iikse2l0ZW06YX0pfSxfc2VsZWN0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtKHRoaXMuX3NlbGVjdGlvbi5nZXQoKSl9LF9vYnNlcnZlSXRlbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIFBvbHltZXIuZG9tKGEpLm9ic2VydmVOb2RlcyhmdW5jdGlvbihjKXt0aGlzLl91cGRhdGVJdGVtcygpO3RoaXMuX3VwZGF0ZVNlbGVjdGVkKCk7dGhpcy5maXJlKCJpcm9uLWl0ZW1zLWNoYW5nZWQiLApjLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITF9KX0pfSxfYWN0aXZhdGVIYW5kbGVyOmZ1bmN0aW9uKGEpe2E9YS50YXJnZXQ7Zm9yKHZhciBjPXRoaXMuaXRlbXM7YSYmYSE9dGhpczspe3ZhciBkPWMuaW5kZXhPZihhKTtpZigwPD1kKXtjPXRoaXMuX2luZGV4VG9WYWx1ZShkKTt0aGlzLl9pdGVtQWN0aXZhdGUoYyxhKTticmVha31hPWEucGFyZW50Tm9kZX19LF9pdGVtQWN0aXZhdGU6ZnVuY3Rpb24oYSxjKXt0aGlzLmZpcmUoImlyb24tYWN0aXZhdGUiLHtzZWxlY3RlZDphLGl0ZW06Y30se2NhbmNlbGFibGU6ITB9KS5kZWZhdWx0UHJldmVudGVkfHx0aGlzLnNlbGVjdChhKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1tdWx0aS1zZWxlY3RhYmxlLmh0bWwuanMKUG9seW1lci5Jcm9uTXVsdGlTZWxlY3RhYmxlQmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOnttdWx0aTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJtdWx0aUNoYW5nZWQifSxzZWxlY3RlZFZhbHVlczp7dHlwZTpBcnJheSxub3RpZnk6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LHNlbGVjdGVkSXRlbXM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZVNlbGVjdGVkKHNlbGVjdGVkVmFsdWVzLnNwbGljZXMpIl0sc2VsZWN0OmZ1bmN0aW9uKGEpe3RoaXMubXVsdGk/dGhpcy5fdG9nZ2xlU2VsZWN0ZWQoYSk6dGhpcy5zZWxlY3RlZD1hfSxtdWx0aUNoYW5nZWQ6ZnVuY3Rpb24oYSl7dGhpcy5fc2VsZWN0aW9uLm11bHRpPWE7dGhpcy5fdXBkYXRlU2VsZWN0ZWQoKX0sZ2V0IF9zaG91bGRVcGRhdGVTZWxlY3Rpb24oKXtyZXR1cm4gbnVsbCE9dGhpcy5zZWxlY3RlZHx8Cm51bGwhPXRoaXMuc2VsZWN0ZWRWYWx1ZXMmJnRoaXMuc2VsZWN0ZWRWYWx1ZXMubGVuZ3RofSxfdXBkYXRlQXR0ckZvclNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5tdWx0aT90aGlzLnNlbGVjdGVkSXRlbXMmJjA8dGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCYmKHRoaXMuc2VsZWN0ZWRWYWx1ZXM9dGhpcy5zZWxlY3RlZEl0ZW1zLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5faW5kZXhUb1ZhbHVlKHRoaXMuaW5kZXhPZihhKSl9LHRoaXMpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YX0sdGhpcykpOlBvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5fdXBkYXRlQXR0ckZvclNlbGVjdGVkLmFwcGx5KHRoaXMpfSxfdXBkYXRlU2VsZWN0ZWQ6ZnVuY3Rpb24oKXt0aGlzLm11bHRpP3RoaXMuX3NlbGVjdE11bHRpKHRoaXMuc2VsZWN0ZWRWYWx1ZXMpOnRoaXMuX3NlbGVjdFNlbGVjdGVkKHRoaXMuc2VsZWN0ZWQpfSxfc2VsZWN0TXVsdGk6ZnVuY3Rpb24oYSl7YT0KYXx8W107YT0odGhpcy5fdmFsdWVzVG9JdGVtcyhhKXx8W10pLmZpbHRlcihmdW5jdGlvbihkKXtyZXR1cm4gbnVsbCE9PWQmJnZvaWQgMCE9PWR9KTt0aGlzLl9zZWxlY3Rpb24uY2xlYXIoYSk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspdGhpcy5fc2VsZWN0aW9uLnNldEl0ZW1TZWxlY3RlZChhW2NdLCEwKTt0aGlzLmZhbGxiYWNrU2VsZWN0aW9uJiYhdGhpcy5fc2VsZWN0aW9uLmdldCgpLmxlbmd0aCYmdGhpcy5fdmFsdWVUb0l0ZW0odGhpcy5mYWxsYmFja1NlbGVjdGlvbikmJnRoaXMuc2VsZWN0KHRoaXMuZmFsbGJhY2tTZWxlY3Rpb24pfSxfc2VsZWN0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fc2VsZWN0aW9uLmdldCgpO3RoaXMubXVsdGk/KHRoaXMuX3NldFNlbGVjdGVkSXRlbXMoYSksdGhpcy5fc2V0U2VsZWN0ZWRJdGVtKGEubGVuZ3RoP2FbMF06bnVsbCkpOm51bGwhPT1hJiZ2b2lkIDAhPT1hPyh0aGlzLl9zZXRTZWxlY3RlZEl0ZW1zKFthXSksCnRoaXMuX3NldFNlbGVjdGVkSXRlbShhKSk6KHRoaXMuX3NldFNlbGVjdGVkSXRlbXMoW10pLHRoaXMuX3NldFNlbGVjdGVkSXRlbShudWxsKSl9LF90b2dnbGVTZWxlY3RlZDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnNlbGVjdGVkVmFsdWVzLmluZGV4T2YoYSk7MD5jP3RoaXMucHVzaCgic2VsZWN0ZWRWYWx1ZXMiLGEpOnRoaXMuc3BsaWNlKCJzZWxlY3RlZFZhbHVlcyIsYywxKX0sX3ZhbHVlc1RvSXRlbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/bnVsbDphLm1hcChmdW5jdGlvbihjKXtyZXR1cm4gdGhpcy5fdmFsdWVUb0l0ZW0oYyl9LHRoaXMpfX07UG9seW1lci5Jcm9uTXVsdGlTZWxlY3RhYmxlQmVoYXZpb3I9W1BvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvcixQb2x5bWVyLklyb25NdWx0aVNlbGVjdGFibGVCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tbWVudS1iZWhhdmlvci9pcm9uLW1lbnUtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25NZW51QmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOntmb2N1c2VkSXRlbTp7b2JzZXJ2ZXI6Il9mb2N1c2VkSXRlbUNoYW5nZWQiLHJlYWRPbmx5OiEwLHR5cGU6T2JqZWN0fSxhdHRyRm9ySXRlbVRpdGxlOnt0eXBlOlN0cmluZ30sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2Rpc2FibGVkQ2hhbmdlZCJ9fSxfTU9ESUZJRVJfS0VZUzoiQWx0IEFsdEdyYXBoIENhcHNMb2NrIENvbnRyb2wgRm4gRm5Mb2NrIEh5cGVyIE1ldGEgTnVtTG9jayBPUyBTY3JvbGxMb2NrIFNoaWZ0IFN1cGVyIFN5bWJvbCBTeW1ib2xMb2NrIi5zcGxpdCgiICIpLF9TRUFSQ0hfUkVTRVRfVElNRU9VVF9NUzoxRTMsX3ByZXZpb3VzVGFiSW5kZXg6MCxob3N0QXR0cmlidXRlczp7cm9sZToibWVudSJ9LG9ic2VydmVyczpbIl91cGRhdGVNdWx0aXNlbGVjdGFibGUobXVsdGkpIl0sbGlzdGVuZXJzOntmb2N1czoiX29uRm9jdXMiLGtleWRvd246Il9vbktleWRvd24iLAoiaXJvbi1pdGVtcy1jaGFuZ2VkIjoiX29uSXJvbkl0ZW1zQ2hhbmdlZCJ9LGtleUJpbmRpbmdzOnt1cDoiX29uVXBLZXkiLGRvd246Il9vbkRvd25LZXkiLGVzYzoiX29uRXNjS2V5Iiwic2hpZnQrdGFiOmtleWRvd24iOiJfb25TaGlmdFRhYkRvd24ifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3Jlc2V0VGFiaW5kaWNlcygpfSxzZWxlY3Q6ZnVuY3Rpb24oYSl7dGhpcy5fZGVmYXVsdEZvY3VzQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jKSx0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYz1udWxsKTt2YXIgYz10aGlzLl92YWx1ZVRvSXRlbShhKTtjJiZjLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKXx8KHRoaXMuX3NldEZvY3VzZWRJdGVtKGMpLFBvbHltZXIuSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9ySW1wbC5zZWxlY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sX3Jlc2V0VGFiaW5kaWNlczpmdW5jdGlvbigpe3ZhciBhPXRoaXMubXVsdGk/CnRoaXMuc2VsZWN0ZWRJdGVtcyYmdGhpcy5zZWxlY3RlZEl0ZW1zWzBdOnRoaXMuc2VsZWN0ZWRJdGVtO3RoaXMuaXRlbXMuZm9yRWFjaChmdW5jdGlvbihjKXtjLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLGM9PT1hPyIwIjoiLTEiKX0sdGhpcyl9LF91cGRhdGVNdWx0aXNlbGVjdGFibGU6ZnVuY3Rpb24oYSl7YT90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1tdWx0aXNlbGVjdGFibGUiLCJ0cnVlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtbXVsdGlzZWxlY3RhYmxlIil9LF9mb2N1c1dpdGhLZXlib2FyZEV2ZW50OmZ1bmN0aW9uKGEpe2lmKC0xPT09dGhpcy5fTU9ESUZJRVJfS0VZUy5pbmRleE9mKGEua2V5KSl7dGhpcy5jYW5jZWxEZWJvdW5jZXIoIl9jbGVhclNlYXJjaFRleHQiKTt2YXIgYz10aGlzLl9zZWFyY2hUZXh0fHwiIjtjKz0oYS5rZXkmJjE9PWEua2V5Lmxlbmd0aD9hLmtleTpTdHJpbmcuZnJvbUNoYXJDb2RlKGEua2V5Q29kZSkpLnRvTG9jYWxlTG93ZXJDYXNlKCk7CmE9Yy5sZW5ndGg7Zm9yKHZhciBkPTAsZjtmPXRoaXMuaXRlbXNbZF07ZCsrKWlmKCFmLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIGc9dGhpcy5hdHRyRm9ySXRlbVRpdGxlfHwidGV4dENvbnRlbnQiO2c9KGZbZ118fGYuZ2V0QXR0cmlidXRlKGcpfHwiIikudHJpbSgpO2lmKCEoZy5sZW5ndGg8YSkmJmcuc2xpY2UoMCxhKS50b0xvY2FsZUxvd2VyQ2FzZSgpPT1jKXt0aGlzLl9zZXRGb2N1c2VkSXRlbShmKTticmVha319dGhpcy5fc2VhcmNoVGV4dD1jO3RoaXMuZGVib3VuY2UoIl9jbGVhclNlYXJjaFRleHQiLHRoaXMuX2NsZWFyU2VhcmNoVGV4dCx0aGlzLl9TRUFSQ0hfUkVTRVRfVElNRU9VVF9NUyl9fSxfY2xlYXJTZWFyY2hUZXh0OmZ1bmN0aW9uKCl7dGhpcy5fc2VhcmNoVGV4dD0iIn0sX2ZvY3VzUHJldmlvdXM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5pdGVtcy5sZW5ndGgsYz1OdW1iZXIodGhpcy5pbmRleE9mKHRoaXMuZm9jdXNlZEl0ZW0pKSxkPTE7ZDwKYSsxO2QrKyl7dmFyIGY9dGhpcy5pdGVtc1soYy1kK2EpJWFdO2lmKCFmLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIGc9UG9seW1lci5kb20oZikuZ2V0T3duZXJSb290KCl8fGRvY3VtZW50O3RoaXMuX3NldEZvY3VzZWRJdGVtKGYpO2lmKFBvbHltZXIuZG9tKGcpLmFjdGl2ZUVsZW1lbnQ9PWYpYnJlYWt9fX0sX2ZvY3VzTmV4dDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLml0ZW1zLmxlbmd0aCxjPU51bWJlcih0aGlzLmluZGV4T2YodGhpcy5mb2N1c2VkSXRlbSkpLGQ9MTtkPGErMTtkKyspe3ZhciBmPXRoaXMuaXRlbXNbKGMrZCklYV07aWYoIWYuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKXt2YXIgZz1Qb2x5bWVyLmRvbShmKS5nZXRPd25lclJvb3QoKXx8ZG9jdW1lbnQ7dGhpcy5fc2V0Rm9jdXNlZEl0ZW0oZik7aWYoUG9seW1lci5kb20oZykuYWN0aXZlRWxlbWVudD09ZilicmVha319fSxfYXBwbHlTZWxlY3Rpb246ZnVuY3Rpb24oYSxjKXtjP2Euc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIiwKInRydWUiKTphLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIpO1BvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5fYXBwbHlTZWxlY3Rpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfZm9jdXNlZEl0ZW1DaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7YyYmYy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKTshYXx8YS5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIil8fHRoaXMuZGlzYWJsZWR8fChhLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCIwIiksYS5mb2N1cygpKX0sX29uSXJvbkl0ZW1zQ2hhbmdlZDpmdW5jdGlvbihhKXthLmRldGFpbC5hZGRlZE5vZGVzLmxlbmd0aCYmdGhpcy5fcmVzZXRUYWJpbmRpY2VzKCl9LF9vblNoaWZ0VGFiRG93bjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpO1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX3NoaWZ0VGFiUHJlc3NlZD0hMDt0aGlzLl9zZXRGb2N1c2VkSXRlbShudWxsKTt0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLAoiLTEiKTt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IixhKTtQb2x5bWVyLklyb25NZW51QmVoYXZpb3JJbXBsLl9zaGlmdFRhYlByZXNzZWQ9ITF9LDEpfSxfb25Gb2N1czpmdW5jdGlvbihhKXshUG9seW1lci5Jcm9uTWVudUJlaGF2aW9ySW1wbC5fc2hpZnRUYWJQcmVzc2VkJiYoYT1Qb2x5bWVyLmRvbShhKS5yb290VGFyZ2V0LGE9PT10aGlzfHwidW5kZWZpbmVkIj09PXR5cGVvZiBhLnRhYkluZGV4fHx0aGlzLmlzTGlnaHREZXNjZW5kYW50KGEpKSYmKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jPXRoaXMuYXN5bmMoZnVuY3Rpb24oKXt2YXIgYz10aGlzLm11bHRpP3RoaXMuc2VsZWN0ZWRJdGVtcyYmdGhpcy5zZWxlY3RlZEl0ZW1zWzBdOnRoaXMuc2VsZWN0ZWRJdGVtO3RoaXMuX3NldEZvY3VzZWRJdGVtKG51bGwpO2M/dGhpcy5fc2V0Rm9jdXNlZEl0ZW0oYyk6dGhpcy5pdGVtc1swXSYmdGhpcy5fZm9jdXNOZXh0KCl9KSl9LF9vblVwS2V5OmZ1bmN0aW9uKGEpe3RoaXMuX2ZvY3VzUHJldmlvdXMoKTsKYS5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25Eb3duS2V5OmZ1bmN0aW9uKGEpe3RoaXMuX2ZvY3VzTmV4dCgpO2EuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sX29uRXNjS2V5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5mb2N1c2VkSXRlbTthJiZhLmJsdXIoKX0sX29uS2V5ZG93bjpmdW5jdGlvbihhKXt0aGlzLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhhLCJ1cCBkb3duIGVzYyIpfHx0aGlzLl9mb2N1c1dpdGhLZXlib2FyZEV2ZW50KGEpO2Euc3RvcFByb3BhZ2F0aW9uKCl9LF9hY3RpdmF0ZUhhbmRsZXI6ZnVuY3Rpb24oYSl7UG9seW1lci5Jcm9uU2VsZWN0YWJsZUJlaGF2aW9yLl9hY3RpdmF0ZUhhbmRsZXIuY2FsbCh0aGlzLGEpO2Euc3RvcFByb3BhZ2F0aW9uKCl9LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24oYSl7YT8odGhpcy5fcHJldmlvdXNUYWJJbmRleD10aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKT90aGlzLnRhYkluZGV4OgowLHRoaXMucmVtb3ZlQXR0cmlidXRlKCJ0YWJpbmRleCIpKTp0aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKXx8dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4Iix0aGlzLl9wcmV2aW91c1RhYkluZGV4KX19O1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX3NoaWZ0VGFiUHJlc3NlZD0hMTtQb2x5bWVyLklyb25NZW51QmVoYXZpb3I9W1BvbHltZXIuSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsUG9seW1lci5Jcm9uTWVudUJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItbGlzdGJveC9wYXBlci1saXN0Ym94Lmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InBhcGVyLWxpc3Rib3giLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uTWVudUJlaGF2aW9yXSxob3N0QXR0cmlidXRlczp7cm9sZToibGlzdGJveCJ9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWl0ZW0vcGFwZXItaXRlbS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJJdGVtQmVoYXZpb3JJbXBsPXtob3N0QXR0cmlidXRlczp7cm9sZToib3B0aW9uIix0YWJpbmRleDoiMCJ9fTtQb2x5bWVyLlBhcGVySXRlbUJlaGF2aW9yPVtQb2x5bWVyLklyb25CdXR0b25TdGF0ZSxQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5QYXBlckl0ZW1CZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWl0ZW0vcGFwZXItaXRlbS5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1pdGVtIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJdGVtQmVoYXZpb3JdfSk7CgovKgoKIExvZGFzaCA8aHR0cHM6Ly9sb2Rhc2guY29tLz4KIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanMuZm91bmRhdGlvbi8+CiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+CiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPgogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzCiovCihmdW5jdGlvbigpe3ZhciB1bmRlZmluZWQ7dmFyIFZFUlNJT049IjQuMTcuNSI7dmFyIExBUkdFX0FSUkFZX1NJWkU9MjAwO3ZhciBDT1JFX0VSUk9SX1RFWFQ9IlVuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xXHgzZHBvbnlmaWxsLiIsRlVOQ19FUlJPUl9URVhUPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIjt2YXIgSEFTSF9VTkRFRklORUQ9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iO3ZhciBNQVhfTUVNT0laRV9TSVpFPTUwMDt2YXIgUExBQ0VIT0xERVI9Il9fbG9kYXNoX3BsYWNlaG9sZGVyX18iO3ZhciBDTE9ORV9ERUVQX0ZMQUc9MSxDTE9ORV9GTEFUX0ZMQUc9MixDTE9ORV9TWU1CT0xTX0ZMQUc9NDt2YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUc9MSxDT01QQVJFX1VOT1JERVJFRF9GTEFHPTI7dmFyIFdSQVBfQklORF9GTEFHPTEsV1JBUF9CSU5EX0tFWV9GTEFHPTIsV1JBUF9DVVJSWV9CT1VORF9GTEFHPTQsV1JBUF9DVVJSWV9GTEFHPQo4LFdSQVBfQ1VSUllfUklHSFRfRkxBRz0xNixXUkFQX1BBUlRJQUxfRkxBRz0zMixXUkFQX1BBUlRJQUxfUklHSFRfRkxBRz02NCxXUkFQX0FSWV9GTEFHPTEyOCxXUkFQX1JFQVJHX0ZMQUc9MjU2LFdSQVBfRkxJUF9GTEFHPTUxMjt2YXIgREVGQVVMVF9UUlVOQ19MRU5HVEg9MzAsREVGQVVMVF9UUlVOQ19PTUlTU0lPTj0iLi4uIjt2YXIgSE9UX0NPVU5UPTgwMCxIT1RfU1BBTj0xNjt2YXIgTEFaWV9GSUxURVJfRkxBRz0xLExBWllfTUFQX0ZMQUc9MixMQVpZX1dISUxFX0ZMQUc9Mzt2YXIgSU5GSU5JVFk9MS8wLE1BWF9TQUZFX0lOVEVHRVI9OTAwNzE5OTI1NDc0MDk5MSxNQVhfSU5URUdFUj0xLjc5NzY5MzEzNDg2MjMxNTdFMzA4LE5BTj0wLzA7dmFyIE1BWF9BUlJBWV9MRU5HVEg9NDI5NDk2NzI5NSxNQVhfQVJSQVlfSU5ERVg9TUFYX0FSUkFZX0xFTkdUSC0xLEhBTEZfTUFYX0FSUkFZX0xFTkdUSD1NQVhfQVJSQVlfTEVOR1RIPj4+MTt2YXIgd3JhcEZsYWdzPVtbImFyeSIsCldSQVBfQVJZX0ZMQUddLFsiYmluZCIsV1JBUF9CSU5EX0ZMQUddLFsiYmluZEtleSIsV1JBUF9CSU5EX0tFWV9GTEFHXSxbImN1cnJ5IixXUkFQX0NVUlJZX0ZMQUddLFsiY3VycnlSaWdodCIsV1JBUF9DVVJSWV9SSUdIVF9GTEFHXSxbImZsaXAiLFdSQVBfRkxJUF9GTEFHXSxbInBhcnRpYWwiLFdSQVBfUEFSVElBTF9GTEFHXSxbInBhcnRpYWxSaWdodCIsV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUddLFsicmVhcmciLFdSQVBfUkVBUkdfRkxBR11dO3ZhciBhcmdzVGFnPSJbb2JqZWN0IEFyZ3VtZW50c10iLGFycmF5VGFnPSJbb2JqZWN0IEFycmF5XSIsYXN5bmNUYWc9IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLGJvb2xUYWc9IltvYmplY3QgQm9vbGVhbl0iLGRhdGVUYWc9IltvYmplY3QgRGF0ZV0iLGRvbUV4Y1RhZz0iW29iamVjdCBET01FeGNlcHRpb25dIixlcnJvclRhZz0iW29iamVjdCBFcnJvcl0iLGZ1bmNUYWc9IltvYmplY3QgRnVuY3Rpb25dIixnZW5UYWc9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIiwKbWFwVGFnPSJbb2JqZWN0IE1hcF0iLG51bWJlclRhZz0iW29iamVjdCBOdW1iZXJdIixudWxsVGFnPSJbb2JqZWN0IE51bGxdIixvYmplY3RUYWc9IltvYmplY3QgT2JqZWN0XSIscHJvbWlzZVRhZz0iW29iamVjdCBQcm9taXNlXSIscHJveHlUYWc9IltvYmplY3QgUHJveHldIixyZWdleHBUYWc9IltvYmplY3QgUmVnRXhwXSIsc2V0VGFnPSJbb2JqZWN0IFNldF0iLHN0cmluZ1RhZz0iW29iamVjdCBTdHJpbmddIixzeW1ib2xUYWc9IltvYmplY3QgU3ltYm9sXSIsdW5kZWZpbmVkVGFnPSJbb2JqZWN0IFVuZGVmaW5lZF0iLHdlYWtNYXBUYWc9IltvYmplY3QgV2Vha01hcF0iLHdlYWtTZXRUYWc9IltvYmplY3QgV2Vha1NldF0iO3ZhciBhcnJheUJ1ZmZlclRhZz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLGRhdGFWaWV3VGFnPSJbb2JqZWN0IERhdGFWaWV3XSIsZmxvYXQzMlRhZz0iW29iamVjdCBGbG9hdDMyQXJyYXldIixmbG9hdDY0VGFnPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLAppbnQ4VGFnPSJbb2JqZWN0IEludDhBcnJheV0iLGludDE2VGFnPSJbb2JqZWN0IEludDE2QXJyYXldIixpbnQzMlRhZz0iW29iamVjdCBJbnQzMkFycmF5XSIsdWludDhUYWc9IltvYmplY3QgVWludDhBcnJheV0iLHVpbnQ4Q2xhbXBlZFRhZz0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLHVpbnQxNlRhZz0iW29iamVjdCBVaW50MTZBcnJheV0iLHVpbnQzMlRhZz0iW29iamVjdCBVaW50MzJBcnJheV0iO3ZhciByZUVtcHR5U3RyaW5nTGVhZGluZz0vXGJfX3AgXCs9ICcnOy9nLHJlRW1wdHlTdHJpbmdNaWRkbGU9L1xiKF9fcCBcKz0pICcnIFwrL2cscmVFbXB0eVN0cmluZ1RyYWlsaW5nPS8oX19lXCguKj9cKXxcYl9fdFwpKSBcK1xuJyc7L2c7dmFyIHJlRXNjYXBlZEh0bWw9LyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLHJlVW5lc2NhcGVkSHRtbD0vWyY8PiInXS9nLHJlSGFzRXNjYXBlZEh0bWw9UmVnRXhwKHJlRXNjYXBlZEh0bWwuc291cmNlKSxyZUhhc1VuZXNjYXBlZEh0bWw9ClJlZ0V4cChyZVVuZXNjYXBlZEh0bWwuc291cmNlKTt2YXIgcmVFc2NhcGU9LzwlLShbXHNcU10rPyklPi9nLHJlRXZhbHVhdGU9LzwlKFtcc1xTXSs/KSU+L2cscmVJbnRlcnBvbGF0ZT0vPCU9KFtcc1xTXSs/KSU+L2c7dmFyIHJlSXNEZWVwUHJvcD0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxyZUlzUGxhaW5Qcm9wPS9eXHcqJC8scmVQcm9wTmFtZT0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZzt2YXIgcmVSZWdFeHBDaGFyPS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxyZUhhc1JlZ0V4cENoYXI9UmVnRXhwKHJlUmVnRXhwQ2hhci5zb3VyY2UpO3ZhciByZVRyaW09L15ccyt8XHMrJC9nLHJlVHJpbVN0YXJ0PS9eXHMrLyxyZVRyaW1FbmQ9L1xzKyQvO3ZhciByZVdyYXBDb21tZW50PS9ceyg/OlxuXC9cKiBcW3dyYXBwZWQgd2l0aCAuK1xdIFwqXC8pP1xuPy8sCnJlV3JhcERldGFpbHM9L1x7XG5cL1wqIFxbd3JhcHBlZCB3aXRoICguKylcXSBcKi8scmVTcGxpdERldGFpbHM9Lyw/ICYgLzt2YXIgcmVBc2NpaVdvcmQ9L1teXHgwMC1ceDJmXHgzYS1ceDQwXHg1Yi1ceDYwXHg3Yi1ceDdmXSsvZzt2YXIgcmVFc2NhcGVDaGFyPS9cXChcXCk/L2c7dmFyIHJlRXNUZW1wbGF0ZT0vXCRceyhbXlxcfV0qKD86XFwuW15cXH1dKikqKVx9L2c7dmFyIHJlRmxhZ3M9L1x3KiQvO3ZhciByZUlzQmFkSGV4PS9eWy0rXTB4WzAtOWEtZl0rJC9pO3ZhciByZUlzQmluYXJ5PS9eMGJbMDFdKyQvaTt2YXIgcmVJc0hvc3RDdG9yPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvO3ZhciByZUlzT2N0YWw9L14wb1swLTddKyQvaTt2YXIgcmVJc1VpbnQ9L14oPzowfFsxLTldXGQqKSQvO3ZhciByZUxhdGluPS9bXHhjMC1ceGQ2XHhkOC1ceGY2XHhmOC1ceGZmXHUwMTAwLVx1MDE3Zl0vZzt2YXIgcmVOb01hdGNoPS8oJF4pLzt2YXIgcmVVbmVzY2FwZWRTdHJpbmc9Ci9bJ1xuXHJcdTIwMjhcdTIwMjlcXF0vZzt2YXIgcnNBc3RyYWxSYW5nZT0iXFx1ZDgwMC1cXHVkZmZmIixyc0NvbWJvTWFya3NSYW5nZT0iXFx1MDMwMC1cXHUwMzZmIixyZUNvbWJvSGFsZk1hcmtzUmFuZ2U9IlxcdWZlMjAtXFx1ZmUyZiIscnNDb21ib1N5bWJvbHNSYW5nZT0iXFx1MjBkMC1cXHUyMGZmIixyc0NvbWJvUmFuZ2U9cnNDb21ib01hcmtzUmFuZ2UrcmVDb21ib0hhbGZNYXJrc1JhbmdlK3JzQ29tYm9TeW1ib2xzUmFuZ2UscnNEaW5nYmF0UmFuZ2U9IlxcdTI3MDAtXFx1MjdiZiIscnNMb3dlclJhbmdlPSJhLXpcXHhkZi1cXHhmNlxceGY4LVxceGZmIixyc01hdGhPcFJhbmdlPSJcXHhhY1xceGIxXFx4ZDdcXHhmNyIscnNOb25DaGFyUmFuZ2U9IlxceDAwLVxceDJmXFx4M2EtXFx4NDBcXHg1Yi1cXHg2MFxceDdiLVxceGJmIixyc1B1bmN0dWF0aW9uUmFuZ2U9IlxcdTIwMDAtXFx1MjA2ZiIscnNTcGFjZVJhbmdlPSIgXFx0XFx4MGJcXGZcXHhhMFxcdWZlZmZcXG5cXHJcXHUyMDI4XFx1MjAyOVxcdTE2ODBcXHUxODBlXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDAiLApyc1VwcGVyUmFuZ2U9IkEtWlxceGMwLVxceGQ2XFx4ZDgtXFx4ZGUiLHJzVmFyUmFuZ2U9IlxcdWZlMGVcXHVmZTBmIixyc0JyZWFrUmFuZ2U9cnNNYXRoT3BSYW5nZStyc05vbkNoYXJSYW5nZStyc1B1bmN0dWF0aW9uUmFuZ2UrcnNTcGFjZVJhbmdlO3ZhciByc0Fwb3M9IlsnXHUyMDE5XSIscnNBc3RyYWw9IlsiK3JzQXN0cmFsUmFuZ2UrIl0iLHJzQnJlYWs9IlsiK3JzQnJlYWtSYW5nZSsiXSIscnNDb21ibz0iWyIrcnNDb21ib1JhbmdlKyJdIixyc0RpZ2l0cz0iXFxkKyIscnNEaW5nYmF0PSJbIityc0RpbmdiYXRSYW5nZSsiXSIscnNMb3dlcj0iWyIrcnNMb3dlclJhbmdlKyJdIixyc01pc2M9IlteIityc0FzdHJhbFJhbmdlK3JzQnJlYWtSYW5nZStyc0RpZ2l0cytyc0RpbmdiYXRSYW5nZStyc0xvd2VyUmFuZ2UrcnNVcHBlclJhbmdlKyJdIixyc0ZpdHo9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIscnNNb2RpZmllcj0iKD86Iityc0NvbWJvKyJ8Iityc0ZpdHorIikiLHJzTm9uQXN0cmFsPQoiW14iK3JzQXN0cmFsUmFuZ2UrIl0iLHJzUmVnaW9uYWw9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLHJzU3VyclBhaXI9IltcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0iLHJzVXBwZXI9IlsiK3JzVXBwZXJSYW5nZSsiXSIscnNaV0o9IlxcdTIwMGQiO3ZhciByc01pc2NMb3dlcj0iKD86Iityc0xvd2VyKyJ8Iityc01pc2MrIikiLHJzTWlzY1VwcGVyPSIoPzoiK3JzVXBwZXIrInwiK3JzTWlzYysiKSIscnNPcHRDb250ckxvd2VyPSIoPzoiK3JzQXBvcysiKD86ZHxsbHxtfHJlfHN8dHx2ZSkpPyIscnNPcHRDb250clVwcGVyPSIoPzoiK3JzQXBvcysiKD86RHxMTHxNfFJFfFN8VHxWRSkpPyIscmVPcHRNb2Q9cnNNb2RpZmllcisiPyIscnNPcHRWYXI9IlsiK3JzVmFyUmFuZ2UrIl0/Iixyc09wdEpvaW49Iig/OiIrcnNaV0orIig/OiIrW3JzTm9uQXN0cmFsLHJzUmVnaW9uYWwscnNTdXJyUGFpcl0uam9pbigifCIpKyIpIityc09wdFZhcityZU9wdE1vZCsKIikqIixyc09yZExvd2VyPSJcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxkdGgpKD9ceDNkXFxifFtBLVpfXSkiLHJzT3JkVXBwZXI9IlxcZCooPzoxU1R8Mk5EfDNSRHwoPyFbMTIzXSlcXGRUSCkoP1x4M2RcXGJ8W2Etel9dKSIscnNTZXE9cnNPcHRWYXIrcmVPcHRNb2QrcnNPcHRKb2luLHJzRW1vamk9Iig/OiIrW3JzRGluZ2JhdCxyc1JlZ2lvbmFsLHJzU3VyclBhaXJdLmpvaW4oInwiKSsiKSIrcnNTZXEscnNTeW1ib2w9Iig/OiIrW3JzTm9uQXN0cmFsK3JzQ29tYm8rIj8iLHJzQ29tYm8scnNSZWdpb25hbCxyc1N1cnJQYWlyLHJzQXN0cmFsXS5qb2luKCJ8IikrIikiO3ZhciByZUFwb3M9UmVnRXhwKHJzQXBvcywiZyIpO3ZhciByZUNvbWJvTWFyaz1SZWdFeHAocnNDb21ibywiZyIpO3ZhciByZVVuaWNvZGU9UmVnRXhwKHJzRml0eisiKD9ceDNkIityc0ZpdHorIil8Iityc1N5bWJvbCtyc1NlcSwiZyIpO3ZhciByZVVuaWNvZGVXb3JkPVJlZ0V4cChbcnNVcHBlcisiPyIrCnJzTG93ZXIrIisiK3JzT3B0Q29udHJMb3dlcisiKD9ceDNkIitbcnNCcmVhayxyc1VwcGVyLCIkIl0uam9pbigifCIpKyIpIixyc01pc2NVcHBlcisiKyIrcnNPcHRDb250clVwcGVyKyIoP1x4M2QiK1tyc0JyZWFrLHJzVXBwZXIrcnNNaXNjTG93ZXIsIiQiXS5qb2luKCJ8IikrIikiLHJzVXBwZXIrIj8iK3JzTWlzY0xvd2VyKyIrIityc09wdENvbnRyTG93ZXIscnNVcHBlcisiKyIrcnNPcHRDb250clVwcGVyLHJzT3JkVXBwZXIscnNPcmRMb3dlcixyc0RpZ2l0cyxyc0Vtb2ppXS5qb2luKCJ8IiksImciKTt2YXIgcmVIYXNVbmljb2RlPVJlZ0V4cCgiWyIrcnNaV0orcnNBc3RyYWxSYW5nZStyc0NvbWJvUmFuZ2UrcnNWYXJSYW5nZSsiXSIpO3ZhciByZUhhc1VuaWNvZGVXb3JkPS9bYS16XVtBLVpdfFtBLVpdezIsfVthLXpdfFswLTldW2EtekEtWl18W2EtekEtWl1bMC05XXxbXmEtekEtWjAtOSBdLzt2YXIgY29udGV4dFByb3BzPVsiQXJyYXkiLCJCdWZmZXIiLCJEYXRhVmlldyIsCiJEYXRlIiwiRXJyb3IiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJGdW5jdGlvbiIsIkludDhBcnJheSIsIkludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiTWFwIiwiTWF0aCIsIk9iamVjdCIsIlByb21pc2UiLCJSZWdFeHAiLCJTZXQiLCJTdHJpbmciLCJTeW1ib2wiLCJUeXBlRXJyb3IiLCJVaW50OEFycmF5IiwiVWludDhDbGFtcGVkQXJyYXkiLCJVaW50MTZBcnJheSIsIlVpbnQzMkFycmF5IiwiV2Vha01hcCIsIl8iLCJjbGVhclRpbWVvdXQiLCJpc0Zpbml0ZSIsInBhcnNlSW50Iiwic2V0VGltZW91dCJdO3ZhciB0ZW1wbGF0ZUNvdW50ZXI9LTE7dmFyIHR5cGVkQXJyYXlUYWdzPXt9O3R5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddPXR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddPXR5cGVkQXJyYXlUYWdzW2ludDhUYWddPXR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXT10eXBlZEFycmF5VGFnc1tpbnQzMlRhZ109dHlwZWRBcnJheVRhZ3NbdWludDhUYWddPXR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ109CnR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ109dHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXT10cnVlO3R5cGVkQXJyYXlUYWdzW2FyZ3NUYWddPXR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXT10eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ109dHlwZWRBcnJheVRhZ3NbYm9vbFRhZ109dHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddPXR5cGVkQXJyYXlUYWdzW2RhdGVUYWddPXR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXT10eXBlZEFycmF5VGFnc1tmdW5jVGFnXT10eXBlZEFycmF5VGFnc1ttYXBUYWddPXR5cGVkQXJyYXlUYWdzW251bWJlclRhZ109dHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXT10eXBlZEFycmF5VGFnc1tyZWdleHBUYWddPXR5cGVkQXJyYXlUYWdzW3NldFRhZ109dHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXT10eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXT1mYWxzZTt2YXIgY2xvbmVhYmxlVGFncz17fTtjbG9uZWFibGVUYWdzW2FyZ3NUYWddPWNsb25lYWJsZVRhZ3NbYXJyYXlUYWddPQpjbG9uZWFibGVUYWdzW2FycmF5QnVmZmVyVGFnXT1jbG9uZWFibGVUYWdzW2RhdGFWaWV3VGFnXT1jbG9uZWFibGVUYWdzW2Jvb2xUYWddPWNsb25lYWJsZVRhZ3NbZGF0ZVRhZ109Y2xvbmVhYmxlVGFnc1tmbG9hdDMyVGFnXT1jbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddPWNsb25lYWJsZVRhZ3NbaW50OFRhZ109Y2xvbmVhYmxlVGFnc1tpbnQxNlRhZ109Y2xvbmVhYmxlVGFnc1tpbnQzMlRhZ109Y2xvbmVhYmxlVGFnc1ttYXBUYWddPWNsb25lYWJsZVRhZ3NbbnVtYmVyVGFnXT1jbG9uZWFibGVUYWdzW29iamVjdFRhZ109Y2xvbmVhYmxlVGFnc1tyZWdleHBUYWddPWNsb25lYWJsZVRhZ3Nbc2V0VGFnXT1jbG9uZWFibGVUYWdzW3N0cmluZ1RhZ109Y2xvbmVhYmxlVGFnc1tzeW1ib2xUYWddPWNsb25lYWJsZVRhZ3NbdWludDhUYWddPWNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXT1jbG9uZWFibGVUYWdzW3VpbnQxNlRhZ109Y2xvbmVhYmxlVGFnc1t1aW50MzJUYWddPXRydWU7CmNsb25lYWJsZVRhZ3NbZXJyb3JUYWddPWNsb25lYWJsZVRhZ3NbZnVuY1RhZ109Y2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXT1mYWxzZTt2YXIgZGVidXJyZWRMZXR0ZXJzPXsiXHUwMGMwIjoiQSIsIlx1MDBjMSI6IkEiLCJcdTAwYzIiOiJBIiwiXHUwMGMzIjoiQSIsIlx1MDBjNCI6IkEiLCJcdTAwYzUiOiJBIiwiXHUwMGUwIjoiYSIsIlx1MDBlMSI6ImEiLCJcdTAwZTIiOiJhIiwiXHUwMGUzIjoiYSIsIlx1MDBlNCI6ImEiLCJcdTAwZTUiOiJhIiwiXHUwMGM3IjoiQyIsIlx1MDBlNyI6ImMiLCJcdTAwZDAiOiJEIiwiXHUwMGYwIjoiZCIsIlx1MDBjOCI6IkUiLCJcdTAwYzkiOiJFIiwiXHUwMGNhIjoiRSIsIlx1MDBjYiI6IkUiLCJcdTAwZTgiOiJlIiwiXHUwMGU5IjoiZSIsIlx1MDBlYSI6ImUiLCJcdTAwZWIiOiJlIiwiXHUwMGNjIjoiSSIsIlx1MDBjZCI6IkkiLCJcdTAwY2UiOiJJIiwiXHUwMGNmIjoiSSIsIlx1MDBlYyI6ImkiLCJcdTAwZWQiOiJpIiwiXHUwMGVlIjoiaSIsCiJcdTAwZWYiOiJpIiwiXHUwMGQxIjoiTiIsIlx1MDBmMSI6Im4iLCJcdTAwZDIiOiJPIiwiXHUwMGQzIjoiTyIsIlx1MDBkNCI6Ik8iLCJcdTAwZDUiOiJPIiwiXHUwMGQ2IjoiTyIsIlx1MDBkOCI6Ik8iLCJcdTAwZjIiOiJvIiwiXHUwMGYzIjoibyIsIlx1MDBmNCI6Im8iLCJcdTAwZjUiOiJvIiwiXHUwMGY2IjoibyIsIlx1MDBmOCI6Im8iLCJcdTAwZDkiOiJVIiwiXHUwMGRhIjoiVSIsIlx1MDBkYiI6IlUiLCJcdTAwZGMiOiJVIiwiXHUwMGY5IjoidSIsIlx1MDBmYSI6InUiLCJcdTAwZmIiOiJ1IiwiXHUwMGZjIjoidSIsIlx1MDBkZCI6IlkiLCJcdTAwZmQiOiJ5IiwiXHUwMGZmIjoieSIsIlx1MDBjNiI6IkFlIiwiXHUwMGU2IjoiYWUiLCJcdTAwZGUiOiJUaCIsIlx1MDBmZSI6InRoIiwiXHUwMGRmIjoic3MiLCJcdTAxMDAiOiJBIiwiXHUwMTAyIjoiQSIsIlx1MDEwNCI6IkEiLCJcdTAxMDEiOiJhIiwiXHUwMTAzIjoiYSIsIlx1MDEwNSI6ImEiLCJcdTAxMDYiOiJDIiwiXHUwMTA4IjoiQyIsCiJcdTAxMGEiOiJDIiwiXHUwMTBjIjoiQyIsIlx1MDEwNyI6ImMiLCJcdTAxMDkiOiJjIiwiXHUwMTBiIjoiYyIsIlx1MDEwZCI6ImMiLCJcdTAxMGUiOiJEIiwiXHUwMTEwIjoiRCIsIlx1MDEwZiI6ImQiLCJcdTAxMTEiOiJkIiwiXHUwMTEyIjoiRSIsIlx1MDExNCI6IkUiLCJcdTAxMTYiOiJFIiwiXHUwMTE4IjoiRSIsIlx1MDExYSI6IkUiLCJcdTAxMTMiOiJlIiwiXHUwMTE1IjoiZSIsIlx1MDExNyI6ImUiLCJcdTAxMTkiOiJlIiwiXHUwMTFiIjoiZSIsIlx1MDExYyI6IkciLCJcdTAxMWUiOiJHIiwiXHUwMTIwIjoiRyIsIlx1MDEyMiI6IkciLCJcdTAxMWQiOiJnIiwiXHUwMTFmIjoiZyIsIlx1MDEyMSI6ImciLCJcdTAxMjMiOiJnIiwiXHUwMTI0IjoiSCIsIlx1MDEyNiI6IkgiLCJcdTAxMjUiOiJoIiwiXHUwMTI3IjoiaCIsIlx1MDEyOCI6IkkiLCJcdTAxMmEiOiJJIiwiXHUwMTJjIjoiSSIsIlx1MDEyZSI6IkkiLCJcdTAxMzAiOiJJIiwiXHUwMTI5IjoiaSIsIlx1MDEyYiI6ImkiLAoiXHUwMTJkIjoiaSIsIlx1MDEyZiI6ImkiLCJcdTAxMzEiOiJpIiwiXHUwMTM0IjoiSiIsIlx1MDEzNSI6ImoiLCJcdTAxMzYiOiJLIiwiXHUwMTM3IjoiayIsIlx1MDEzOCI6ImsiLCJcdTAxMzkiOiJMIiwiXHUwMTNiIjoiTCIsIlx1MDEzZCI6IkwiLCJcdTAxM2YiOiJMIiwiXHUwMTQxIjoiTCIsIlx1MDEzYSI6ImwiLCJcdTAxM2MiOiJsIiwiXHUwMTNlIjoibCIsIlx1MDE0MCI6ImwiLCJcdTAxNDIiOiJsIiwiXHUwMTQzIjoiTiIsIlx1MDE0NSI6Ik4iLCJcdTAxNDciOiJOIiwiXHUwMTRhIjoiTiIsIlx1MDE0NCI6Im4iLCJcdTAxNDYiOiJuIiwiXHUwMTQ4IjoibiIsIlx1MDE0YiI6Im4iLCJcdTAxNGMiOiJPIiwiXHUwMTRlIjoiTyIsIlx1MDE1MCI6Ik8iLCJcdTAxNGQiOiJvIiwiXHUwMTRmIjoibyIsIlx1MDE1MSI6Im8iLCJcdTAxNTQiOiJSIiwiXHUwMTU2IjoiUiIsIlx1MDE1OCI6IlIiLCJcdTAxNTUiOiJyIiwiXHUwMTU3IjoiciIsIlx1MDE1OSI6InIiLCJcdTAxNWEiOiJTIiwKIlx1MDE1YyI6IlMiLCJcdTAxNWUiOiJTIiwiXHUwMTYwIjoiUyIsIlx1MDE1YiI6InMiLCJcdTAxNWQiOiJzIiwiXHUwMTVmIjoicyIsIlx1MDE2MSI6InMiLCJcdTAxNjIiOiJUIiwiXHUwMTY0IjoiVCIsIlx1MDE2NiI6IlQiLCJcdTAxNjMiOiJ0IiwiXHUwMTY1IjoidCIsIlx1MDE2NyI6InQiLCJcdTAxNjgiOiJVIiwiXHUwMTZhIjoiVSIsIlx1MDE2YyI6IlUiLCJcdTAxNmUiOiJVIiwiXHUwMTcwIjoiVSIsIlx1MDE3MiI6IlUiLCJcdTAxNjkiOiJ1IiwiXHUwMTZiIjoidSIsIlx1MDE2ZCI6InUiLCJcdTAxNmYiOiJ1IiwiXHUwMTcxIjoidSIsIlx1MDE3MyI6InUiLCJcdTAxNzQiOiJXIiwiXHUwMTc1IjoidyIsIlx1MDE3NiI6IlkiLCJcdTAxNzciOiJ5IiwiXHUwMTc4IjoiWSIsIlx1MDE3OSI6IloiLCJcdTAxN2IiOiJaIiwiXHUwMTdkIjoiWiIsIlx1MDE3YSI6InoiLCJcdTAxN2MiOiJ6IiwiXHUwMTdlIjoieiIsIlx1MDEzMiI6IklKIiwiXHUwMTMzIjoiaWoiLCJcdTAxNTIiOiJPZSIsCiJcdTAxNTMiOiJvZSIsIlx1MDE0OSI6IiduIiwiXHUwMTdmIjoicyJ9O3ZhciBodG1sRXNjYXBlcz17Ilx4MjYiOiJceDI2YW1wOyIsIlx4M2MiOiJceDI2bHQ7IiwiXHgzZSI6Ilx4MjZndDsiLCciJzoiXHgyNnF1b3Q7IiwiJyI6Ilx4MjYjMzk7In07dmFyIGh0bWxVbmVzY2FwZXM9eyJceDI2YW1wOyI6Ilx4MjYiLCJceDI2bHQ7IjoiXHgzYyIsIlx4MjZndDsiOiJceDNlIiwiXHgyNnF1b3Q7IjonIicsIlx4MjYjMzk7IjoiJyJ9O3ZhciBzdHJpbmdFc2NhcGVzPXsiXFwiOiJcXCIsIiciOiInIiwiXG4iOiJuIiwiXHIiOiJyIiwiXHUyMDI4IjoidTIwMjgiLCJcdTIwMjkiOiJ1MjAyOSJ9O3ZhciBmcmVlUGFyc2VGbG9hdD1wYXJzZUZsb2F0LGZyZWVQYXJzZUludD1wYXJzZUludDt2YXIgZnJlZUdsb2JhbD10eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWw7dmFyIGZyZWVTZWxmPXR5cGVvZiBzZWxmPT0ib2JqZWN0IiYmCnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmO3ZhciByb290PWZyZWVHbG9iYWx8fGZyZWVTZWxmfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpO3ZhciBmcmVlRXhwb3J0cz10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzO3ZhciBmcmVlTW9kdWxlPWZyZWVFeHBvcnRzJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGU7dmFyIG1vZHVsZUV4cG9ydHM9ZnJlZU1vZHVsZSYmZnJlZU1vZHVsZS5leHBvcnRzPT09ZnJlZUV4cG9ydHM7dmFyIGZyZWVQcm9jZXNzPW1vZHVsZUV4cG9ydHMmJmZyZWVHbG9iYWwucHJvY2Vzczt2YXIgbm9kZVV0aWw9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGZyZWVQcm9jZXNzJiZmcmVlUHJvY2Vzcy5iaW5kaW5nJiZmcmVlUHJvY2Vzcy5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2goZSl7fX0oKTt2YXIgbm9kZUlzQXJyYXlCdWZmZXI9bm9kZVV0aWwmJgpub2RlVXRpbC5pc0FycmF5QnVmZmVyLG5vZGVJc0RhdGU9bm9kZVV0aWwmJm5vZGVVdGlsLmlzRGF0ZSxub2RlSXNNYXA9bm9kZVV0aWwmJm5vZGVVdGlsLmlzTWFwLG5vZGVJc1JlZ0V4cD1ub2RlVXRpbCYmbm9kZVV0aWwuaXNSZWdFeHAsbm9kZUlzU2V0PW5vZGVVdGlsJiZub2RlVXRpbC5pc1NldCxub2RlSXNUeXBlZEFycmF5PW5vZGVVdGlsJiZub2RlVXRpbC5pc1R5cGVkQXJyYXk7ZnVuY3Rpb24gYXBwbHkoZnVuYyx0aGlzQXJnLGFyZ3Mpe3N3aXRjaChhcmdzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7Y2FzZSAxOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyxhcmdzWzBdKTtjYXNlIDI6cmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLGFyZ3NbMF0sYXJnc1sxXSk7Y2FzZSAzOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyxhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSl9cmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZyxhcmdzKX1mdW5jdGlvbiBhcnJheUFnZ3JlZ2F0b3IoYXJyYXksCnNldHRlcixpdGVyYXRlZSxhY2N1bXVsYXRvcil7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtzZXR0ZXIoYWNjdW11bGF0b3IsdmFsdWUsaXRlcmF0ZWUodmFsdWUpLGFycmF5KX1yZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LGl0ZXJhdGVlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKGl0ZXJhdGVlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSk9PT1mYWxzZSlicmVhaztyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYXJyYXlFYWNoUmlnaHQoYXJyYXksaXRlcmF0ZWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7d2hpbGUobGVuZ3RoLS0paWYoaXRlcmF0ZWUoYXJyYXlbbGVuZ3RoXSxsZW5ndGgsYXJyYXkpPT09ZmFsc2UpYnJlYWs7CnJldHVybiBhcnJheX1mdW5jdGlvbiBhcnJheUV2ZXJ5KGFycmF5LHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aClpZighcHJlZGljYXRlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSkpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfWZ1bmN0aW9uIGFycmF5RmlsdGVyKGFycmF5LHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aCxyZXNJbmRleD0wLHJlc3VsdD1bXTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihwcmVkaWNhdGUodmFsdWUsaW5kZXgsYXJyYXkpKXJlc3VsdFtyZXNJbmRleCsrXT12YWx1ZX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksdmFsdWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuISFsZW5ndGgmJmJhc2VJbmRleE9mKGFycmF5LAp2YWx1ZSwwKT4tMX1mdW5jdGlvbiBhcnJheUluY2x1ZGVzV2l0aChhcnJheSx2YWx1ZSxjb21wYXJhdG9yKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKGNvbXBhcmF0b3IodmFsdWUsYXJyYXlbaW5kZXhdKSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZmFsc2V9ZnVuY3Rpb24gYXJyYXlNYXAoYXJyYXksaXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGgscmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0W2luZGV4XT1pdGVyYXRlZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LHZhbHVlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD12YWx1ZXMubGVuZ3RoLG9mZnNldD1hcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpYXJyYXlbb2Zmc2V0K2luZGV4XT0KdmFsdWVzW2luZGV4XTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksaXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGluaXRBY2N1bSYmbGVuZ3RoKWFjY3VtdWxhdG9yPWFycmF5WysraW5kZXhdO3doaWxlKCsraW5kZXg8bGVuZ3RoKWFjY3VtdWxhdG9yPWl0ZXJhdGVlKGFjY3VtdWxhdG9yLGFycmF5W2luZGV4XSxpbmRleCxhcnJheSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGFycmF5UmVkdWNlUmlnaHQoYXJyYXksaXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGluaXRBY2N1bSYmbGVuZ3RoKWFjY3VtdWxhdG9yPWFycmF5Wy0tbGVuZ3RoXTt3aGlsZShsZW5ndGgtLSlhY2N1bXVsYXRvcj1pdGVyYXRlZShhY2N1bXVsYXRvcixhcnJheVtsZW5ndGhdLGxlbmd0aCxhcnJheSk7CnJldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiBhcnJheVNvbWUoYXJyYXkscHJlZGljYXRlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKHByZWRpY2F0ZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpKXJldHVybiB0cnVlO3JldHVybiBmYWxzZX12YXIgYXNjaWlTaXplPWJhc2VQcm9wZXJ0eSgibGVuZ3RoIik7ZnVuY3Rpb24gYXNjaWlUb0FycmF5KHN0cmluZyl7cmV0dXJuIHN0cmluZy5zcGxpdCgiIil9ZnVuY3Rpb24gYXNjaWlXb3JkcyhzdHJpbmcpe3JldHVybiBzdHJpbmcubWF0Y2gocmVBc2NpaVdvcmQpfHxbXX1mdW5jdGlvbiBiYXNlRmluZEtleShjb2xsZWN0aW9uLHByZWRpY2F0ZSxlYWNoRnVuYyl7dmFyIHJlc3VsdDtlYWNoRnVuYyhjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGtleSxjb2xsZWN0aW9uKXtpZihwcmVkaWNhdGUodmFsdWUsa2V5LGNvbGxlY3Rpb24pKXtyZXN1bHQ9a2V5OwpyZXR1cm4gZmFsc2V9fSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LHByZWRpY2F0ZSxmcm9tSW5kZXgsZnJvbVJpZ2h0KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxpbmRleD1mcm9tSW5kZXgrKGZyb21SaWdodD8xOi0xKTt3aGlsZShmcm9tUmlnaHQ/aW5kZXgtLTorK2luZGV4PGxlbmd0aClpZihwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLGluZGV4LGFycmF5KSlyZXR1cm4gaW5kZXg7cmV0dXJuLTF9ZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXtyZXR1cm4gdmFsdWU9PT12YWx1ZT9zdHJpY3RJbmRleE9mKGFycmF5LHZhbHVlLGZyb21JbmRleCk6YmFzZUZpbmRJbmRleChhcnJheSxiYXNlSXNOYU4sZnJvbUluZGV4KX1mdW5jdGlvbiBiYXNlSW5kZXhPZldpdGgoYXJyYXksdmFsdWUsZnJvbUluZGV4LGNvbXBhcmF0b3Ipe3ZhciBpbmRleD1mcm9tSW5kZXgtMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8Cmxlbmd0aClpZihjb21wYXJhdG9yKGFycmF5W2luZGV4XSx2YWx1ZSkpcmV0dXJuIGluZGV4O3JldHVybi0xfWZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSl7cmV0dXJuIHZhbHVlIT09dmFsdWV9ZnVuY3Rpb24gYmFzZU1lYW4oYXJyYXksaXRlcmF0ZWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU3VtKGFycmF5LGl0ZXJhdGVlKS9sZW5ndGg6TkFOfWZ1bmN0aW9uIGJhc2VQcm9wZXJ0eShrZXkpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfX1mdW5jdGlvbiBiYXNlUHJvcGVydHlPZihvYmplY3Qpe3JldHVybiBmdW5jdGlvbihrZXkpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfX1mdW5jdGlvbiBiYXNlUmVkdWNlKGNvbGxlY3Rpb24saXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtLGVhY2hGdW5jKXtlYWNoRnVuYyhjb2xsZWN0aW9uLApmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXthY2N1bXVsYXRvcj1pbml0QWNjdW0/KGluaXRBY2N1bT1mYWxzZSx2YWx1ZSk6aXRlcmF0ZWUoYWNjdW11bGF0b3IsdmFsdWUsaW5kZXgsY29sbGVjdGlvbil9KTtyZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYmFzZVNvcnRCeShhcnJheSxjb21wYXJlcil7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7YXJyYXkuc29ydChjb21wYXJlcik7d2hpbGUobGVuZ3RoLS0pYXJyYXlbbGVuZ3RoXT1hcnJheVtsZW5ndGhdLnZhbHVlO3JldHVybiBhcnJheX1mdW5jdGlvbiBiYXNlU3VtKGFycmF5LGl0ZXJhdGVlKXt2YXIgcmVzdWx0LGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBjdXJyZW50PWl0ZXJhdGVlKGFycmF5W2luZGV4XSk7aWYoY3VycmVudCE9PXVuZGVmaW5lZClyZXN1bHQ9cmVzdWx0PT09dW5kZWZpbmVkP2N1cnJlbnQ6cmVzdWx0K2N1cnJlbnR9cmV0dXJuIHJlc3VsdH0KZnVuY3Rpb24gYmFzZVRpbWVzKG4saXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobik7d2hpbGUoKytpbmRleDxuKXJlc3VsdFtpbmRleF09aXRlcmF0ZWUoaW5kZXgpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVRvUGFpcnMob2JqZWN0LHByb3BzKXtyZXR1cm4gYXJyYXlNYXAocHJvcHMsZnVuY3Rpb24oa2V5KXtyZXR1cm5ba2V5LG9iamVjdFtrZXldXX0pfWZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKXtyZXR1cm4gZnVuY3Rpb24odmFsdWUpe3JldHVybiBmdW5jKHZhbHVlKX19ZnVuY3Rpb24gYmFzZVZhbHVlcyhvYmplY3QscHJvcHMpe3JldHVybiBhcnJheU1hcChwcm9wcyxmdW5jdGlvbihrZXkpe3JldHVybiBvYmplY3Rba2V5XX0pfWZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLGtleSl7cmV0dXJuIGNhY2hlLmhhcyhrZXkpfWZ1bmN0aW9uIGNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpe3ZhciBpbmRleD0tMSxsZW5ndGg9c3RyU3ltYm9scy5sZW5ndGg7CndoaWxlKCsraW5kZXg8bGVuZ3RoJiZiYXNlSW5kZXhPZihjaHJTeW1ib2xzLHN0clN5bWJvbHNbaW5kZXhdLDApPi0xKTtyZXR1cm4gaW5kZXh9ZnVuY3Rpb24gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpe3ZhciBpbmRleD1zdHJTeW1ib2xzLmxlbmd0aDt3aGlsZShpbmRleC0tJiZiYXNlSW5kZXhPZihjaHJTeW1ib2xzLHN0clN5bWJvbHNbaW5kZXhdLDApPi0xKTtyZXR1cm4gaW5kZXh9ZnVuY3Rpb24gY291bnRIb2xkZXJzKGFycmF5LHBsYWNlaG9sZGVyKXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxyZXN1bHQ9MDt3aGlsZShsZW5ndGgtLSlpZihhcnJheVtsZW5ndGhdPT09cGxhY2Vob2xkZXIpKytyZXN1bHQ7cmV0dXJuIHJlc3VsdH12YXIgZGVidXJyTGV0dGVyPWJhc2VQcm9wZXJ0eU9mKGRlYnVycmVkTGV0dGVycyk7dmFyIGVzY2FwZUh0bWxDaGFyPWJhc2VQcm9wZXJ0eU9mKGh0bWxFc2NhcGVzKTtmdW5jdGlvbiBlc2NhcGVTdHJpbmdDaGFyKGNocil7cmV0dXJuIlxcIisKc3RyaW5nRXNjYXBlc1tjaHJdfWZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCxrZXkpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfWZ1bmN0aW9uIGhhc1VuaWNvZGUoc3RyaW5nKXtyZXR1cm4gcmVIYXNVbmljb2RlLnRlc3Qoc3RyaW5nKX1mdW5jdGlvbiBoYXNVbmljb2RlV29yZChzdHJpbmcpe3JldHVybiByZUhhc1VuaWNvZGVXb3JkLnRlc3Qoc3RyaW5nKX1mdW5jdGlvbiBpdGVyYXRvclRvQXJyYXkoaXRlcmF0b3Ipe3ZhciBkYXRhLHJlc3VsdD1bXTt3aGlsZSghKGRhdGE9aXRlcmF0b3IubmV4dCgpKS5kb25lKXJlc3VsdC5wdXNoKGRhdGEudmFsdWUpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gbWFwVG9BcnJheShtYXApe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobWFwLnNpemUpO21hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLGtleSl7cmVzdWx0WysraW5kZXhdPVtrZXksdmFsdWVdfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsCnRyYW5zZm9ybSl7cmV0dXJuIGZ1bmN0aW9uKGFyZyl7cmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpfX1mdW5jdGlvbiByZXBsYWNlSG9sZGVycyhhcnJheSxwbGFjZWhvbGRlcil7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGgscmVzSW5kZXg9MCxyZXN1bHQ9W107d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF07aWYodmFsdWU9PT1wbGFjZWhvbGRlcnx8dmFsdWU9PT1QTEFDRUhPTERFUil7YXJyYXlbaW5kZXhdPVBMQUNFSE9MREVSO3Jlc3VsdFtyZXNJbmRleCsrXT1pbmRleH19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBzYWZlR2V0KG9iamVjdCxrZXkpe3JldHVybiBrZXk9PSJfX3Byb3RvX18iP3VuZGVmaW5lZDpvYmplY3Rba2V5XX1mdW5jdGlvbiBzZXRUb0FycmF5KHNldCl7dmFyIGluZGV4PS0xLHJlc3VsdD1BcnJheShzZXQuc2l6ZSk7c2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpe3Jlc3VsdFsrK2luZGV4XT12YWx1ZX0pOwpyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHNldFRvUGFpcnMoc2V0KXt2YXIgaW5kZXg9LTEscmVzdWx0PUFycmF5KHNldC5zaXplKTtzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSl7cmVzdWx0WysraW5kZXhdPVt2YWx1ZSx2YWx1ZV19KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHN0cmljdEluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXt2YXIgaW5kZXg9ZnJvbUluZGV4LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aClpZihhcnJheVtpbmRleF09PT12YWx1ZSlyZXR1cm4gaW5kZXg7cmV0dXJuLTF9ZnVuY3Rpb24gc3RyaWN0TGFzdEluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXt2YXIgaW5kZXg9ZnJvbUluZGV4KzE7d2hpbGUoaW5kZXgtLSlpZihhcnJheVtpbmRleF09PT12YWx1ZSlyZXR1cm4gaW5kZXg7cmV0dXJuIGluZGV4fWZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKXtyZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpP3VuaWNvZGVTaXplKHN0cmluZyk6CmFzY2lpU2l6ZShzdHJpbmcpfWZ1bmN0aW9uIHN0cmluZ1RvQXJyYXkoc3RyaW5nKXtyZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpP3VuaWNvZGVUb0FycmF5KHN0cmluZyk6YXNjaWlUb0FycmF5KHN0cmluZyl9dmFyIHVuZXNjYXBlSHRtbENoYXI9YmFzZVByb3BlcnR5T2YoaHRtbFVuZXNjYXBlcyk7ZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKXt2YXIgcmVzdWx0PXJlVW5pY29kZS5sYXN0SW5kZXg9MDt3aGlsZShyZVVuaWNvZGUudGVzdChzdHJpbmcpKSsrcmVzdWx0O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdW5pY29kZVRvQXJyYXkoc3RyaW5nKXtyZXR1cm4gc3RyaW5nLm1hdGNoKHJlVW5pY29kZSl8fFtdfWZ1bmN0aW9uIHVuaWNvZGVXb3JkcyhzdHJpbmcpe3JldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlV29yZCl8fFtdfXZhciBydW5JbkNvbnRleHQ9ZnVuY3Rpb24gcnVuSW5Db250ZXh0KGNvbnRleHQpe2NvbnRleHQ9Y29udGV4dD09bnVsbD9yb290Ol8uZGVmYXVsdHMocm9vdC5PYmplY3QoKSwKY29udGV4dCxfLnBpY2socm9vdCxjb250ZXh0UHJvcHMpKTt2YXIgQXJyYXk9Y29udGV4dC5BcnJheSxEYXRlPWNvbnRleHQuRGF0ZSxFcnJvcj1jb250ZXh0LkVycm9yLEZ1bmN0aW9uPWNvbnRleHQuRnVuY3Rpb24sTWF0aD1jb250ZXh0Lk1hdGgsT2JqZWN0PWNvbnRleHQuT2JqZWN0LFJlZ0V4cD1jb250ZXh0LlJlZ0V4cCxTdHJpbmc9Y29udGV4dC5TdHJpbmcsVHlwZUVycm9yPWNvbnRleHQuVHlwZUVycm9yO3ZhciBhcnJheVByb3RvPUFycmF5LnByb3RvdHlwZSxmdW5jUHJvdG89RnVuY3Rpb24ucHJvdG90eXBlLG9iamVjdFByb3RvPU9iamVjdC5wcm90b3R5cGU7dmFyIGNvcmVKc0RhdGE9Y29udGV4dFsiX19jb3JlLWpzX3NoYXJlZF9fIl07dmFyIGZ1bmNUb1N0cmluZz1mdW5jUHJvdG8udG9TdHJpbmc7dmFyIGhhc093blByb3BlcnR5PW9iamVjdFByb3RvLmhhc093blByb3BlcnR5O3ZhciBpZENvdW50ZXI9MDt2YXIgbWFza1NyY0tleT1mdW5jdGlvbigpe3ZhciB1aWQ9Ci9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSYmY29yZUpzRGF0YS5rZXlzJiZjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE98fCIiKTtyZXR1cm4gdWlkPyJTeW1ib2woc3JjKV8xLiIrdWlkOiIifSgpO3ZhciBuYXRpdmVPYmplY3RUb1N0cmluZz1vYmplY3RQcm90by50b1N0cmluZzt2YXIgb2JqZWN0Q3RvclN0cmluZz1mdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO3ZhciBvbGREYXNoPXJvb3QuXzt2YXIgcmVJc05hdGl2ZT1SZWdFeHAoIl4iK2Z1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwiXFwkXHgyNiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTt2YXIgQnVmZmVyPW1vZHVsZUV4cG9ydHM/Y29udGV4dC5CdWZmZXI6dW5kZWZpbmVkLFN5bWJvbD1jb250ZXh0LlN5bWJvbCxVaW50OEFycmF5PWNvbnRleHQuVWludDhBcnJheSxhbGxvY1Vuc2FmZT0KQnVmZmVyP0J1ZmZlci5hbGxvY1Vuc2FmZTp1bmRlZmluZWQsZ2V0UHJvdG90eXBlPW92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCksb2JqZWN0Q3JlYXRlPU9iamVjdC5jcmVhdGUscHJvcGVydHlJc0VudW1lcmFibGU9b2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGUsc3BsaWNlPWFycmF5UHJvdG8uc3BsaWNlLHNwcmVhZGFibGVTeW1ib2w9U3ltYm9sP1N5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGU6dW5kZWZpbmVkLHN5bUl0ZXJhdG9yPVN5bWJvbD9TeW1ib2wuaXRlcmF0b3I6dW5kZWZpbmVkLHN5bVRvU3RyaW5nVGFnPVN5bWJvbD9TeW1ib2wudG9TdHJpbmdUYWc6dW5kZWZpbmVkO3ZhciBkZWZpbmVQcm9wZXJ0eT1mdW5jdGlvbigpe3RyeXt2YXIgZnVuYz1nZXROYXRpdmUoT2JqZWN0LCJkZWZpbmVQcm9wZXJ0eSIpO2Z1bmMoe30sIiIse30pO3JldHVybiBmdW5jfWNhdGNoKGUpe319KCk7dmFyIGN0eENsZWFyVGltZW91dD1jb250ZXh0LmNsZWFyVGltZW91dCE9PQpyb290LmNsZWFyVGltZW91dCYmY29udGV4dC5jbGVhclRpbWVvdXQsY3R4Tm93PURhdGUmJkRhdGUubm93IT09cm9vdC5EYXRlLm5vdyYmRGF0ZS5ub3csY3R4U2V0VGltZW91dD1jb250ZXh0LnNldFRpbWVvdXQhPT1yb290LnNldFRpbWVvdXQmJmNvbnRleHQuc2V0VGltZW91dDt2YXIgbmF0aXZlQ2VpbD1NYXRoLmNlaWwsbmF0aXZlRmxvb3I9TWF0aC5mbG9vcixuYXRpdmVHZXRTeW1ib2xzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsbmF0aXZlSXNCdWZmZXI9QnVmZmVyP0J1ZmZlci5pc0J1ZmZlcjp1bmRlZmluZWQsbmF0aXZlSXNGaW5pdGU9Y29udGV4dC5pc0Zpbml0ZSxuYXRpdmVKb2luPWFycmF5UHJvdG8uam9pbixuYXRpdmVLZXlzPW92ZXJBcmcoT2JqZWN0LmtleXMsT2JqZWN0KSxuYXRpdmVNYXg9TWF0aC5tYXgsbmF0aXZlTWluPU1hdGgubWluLG5hdGl2ZU5vdz1EYXRlLm5vdyxuYXRpdmVQYXJzZUludD1jb250ZXh0LnBhcnNlSW50LG5hdGl2ZVJhbmRvbT0KTWF0aC5yYW5kb20sbmF0aXZlUmV2ZXJzZT1hcnJheVByb3RvLnJldmVyc2U7dmFyIERhdGFWaWV3PWdldE5hdGl2ZShjb250ZXh0LCJEYXRhVmlldyIpLE1hcD1nZXROYXRpdmUoY29udGV4dCwiTWFwIiksUHJvbWlzZT1nZXROYXRpdmUoY29udGV4dCwiUHJvbWlzZSIpLFNldD1nZXROYXRpdmUoY29udGV4dCwiU2V0IiksV2Vha01hcD1nZXROYXRpdmUoY29udGV4dCwiV2Vha01hcCIpLG5hdGl2ZUNyZWF0ZT1nZXROYXRpdmUoT2JqZWN0LCJjcmVhdGUiKTt2YXIgbWV0YU1hcD1XZWFrTWFwJiZuZXcgV2Vha01hcDt2YXIgcmVhbE5hbWVzPXt9O3ZhciBkYXRhVmlld0N0b3JTdHJpbmc9dG9Tb3VyY2UoRGF0YVZpZXcpLG1hcEN0b3JTdHJpbmc9dG9Tb3VyY2UoTWFwKSxwcm9taXNlQ3RvclN0cmluZz10b1NvdXJjZShQcm9taXNlKSxzZXRDdG9yU3RyaW5nPXRvU291cmNlKFNldCksd2Vha01hcEN0b3JTdHJpbmc9dG9Tb3VyY2UoV2Vha01hcCk7dmFyIHN5bWJvbFByb3RvPVN5bWJvbD8KU3ltYm9sLnByb3RvdHlwZTp1bmRlZmluZWQsc3ltYm9sVmFsdWVPZj1zeW1ib2xQcm90bz9zeW1ib2xQcm90by52YWx1ZU9mOnVuZGVmaW5lZCxzeW1ib2xUb1N0cmluZz1zeW1ib2xQcm90bz9zeW1ib2xQcm90by50b1N0cmluZzp1bmRlZmluZWQ7ZnVuY3Rpb24gbG9kYXNoKHZhbHVlKXtpZihpc09iamVjdExpa2UodmFsdWUpJiYhaXNBcnJheSh2YWx1ZSkmJiEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikpe2lmKHZhbHVlIGluc3RhbmNlb2YgTG9kYXNoV3JhcHBlcilyZXR1cm4gdmFsdWU7aWYoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwiX193cmFwcGVkX18iKSlyZXR1cm4gd3JhcHBlckNsb25lKHZhbHVlKX1yZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodmFsdWUpfXZhciBiYXNlQ3JlYXRlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gb2JqZWN0KCl7fXJldHVybiBmdW5jdGlvbihwcm90byl7aWYoIWlzT2JqZWN0KHByb3RvKSlyZXR1cm57fTtpZihvYmplY3RDcmVhdGUpcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7Cm9iamVjdC5wcm90b3R5cGU9cHJvdG87dmFyIHJlc3VsdD1uZXcgb2JqZWN0O29iamVjdC5wcm90b3R5cGU9dW5kZWZpbmVkO3JldHVybiByZXN1bHR9fSgpO2Z1bmN0aW9uIGJhc2VMb2Rhc2goKXt9ZnVuY3Rpb24gTG9kYXNoV3JhcHBlcih2YWx1ZSxjaGFpbkFsbCl7dGhpcy5fX3dyYXBwZWRfXz12YWx1ZTt0aGlzLl9fYWN0aW9uc19fPVtdO3RoaXMuX19jaGFpbl9fPSEhY2hhaW5BbGw7dGhpcy5fX2luZGV4X189MDt0aGlzLl9fdmFsdWVzX189dW5kZWZpbmVkfWxvZGFzaC50ZW1wbGF0ZVNldHRpbmdzPXsiZXNjYXBlIjpyZUVzY2FwZSwiZXZhbHVhdGUiOnJlRXZhbHVhdGUsImludGVycG9sYXRlIjpyZUludGVycG9sYXRlLCJ2YXJpYWJsZSI6IiIsImltcG9ydHMiOnsiXyI6bG9kYXNofX07bG9kYXNoLnByb3RvdHlwZT1iYXNlTG9kYXNoLnByb3RvdHlwZTtsb2Rhc2gucHJvdG90eXBlLmNvbnN0cnVjdG9yPWxvZGFzaDtMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZT1iYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTsKTG9kYXNoV3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3I9TG9kYXNoV3JhcHBlcjtmdW5jdGlvbiBMYXp5V3JhcHBlcih2YWx1ZSl7dGhpcy5fX3dyYXBwZWRfXz12YWx1ZTt0aGlzLl9fYWN0aW9uc19fPVtdO3RoaXMuX19kaXJfXz0xO3RoaXMuX19maWx0ZXJlZF9fPWZhbHNlO3RoaXMuX19pdGVyYXRlZXNfXz1bXTt0aGlzLl9fdGFrZUNvdW50X189TUFYX0FSUkFZX0xFTkdUSDt0aGlzLl9fdmlld3NfXz1bXX1mdW5jdGlvbiBsYXp5Q2xvbmUoKXt2YXIgcmVzdWx0PW5ldyBMYXp5V3JhcHBlcih0aGlzLl9fd3JhcHBlZF9fKTtyZXN1bHQuX19hY3Rpb25zX189Y29weUFycmF5KHRoaXMuX19hY3Rpb25zX18pO3Jlc3VsdC5fX2Rpcl9fPXRoaXMuX19kaXJfXztyZXN1bHQuX19maWx0ZXJlZF9fPXRoaXMuX19maWx0ZXJlZF9fO3Jlc3VsdC5fX2l0ZXJhdGVlc19fPWNvcHlBcnJheSh0aGlzLl9faXRlcmF0ZWVzX18pO3Jlc3VsdC5fX3Rha2VDb3VudF9fPXRoaXMuX190YWtlQ291bnRfXzsKcmVzdWx0Ll9fdmlld3NfXz1jb3B5QXJyYXkodGhpcy5fX3ZpZXdzX18pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gbGF6eVJldmVyc2UoKXtpZih0aGlzLl9fZmlsdGVyZWRfXyl7dmFyIHJlc3VsdD1uZXcgTGF6eVdyYXBwZXIodGhpcyk7cmVzdWx0Ll9fZGlyX189LTE7cmVzdWx0Ll9fZmlsdGVyZWRfXz10cnVlfWVsc2V7cmVzdWx0PXRoaXMuY2xvbmUoKTtyZXN1bHQuX19kaXJfXyo9LTF9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBsYXp5VmFsdWUoKXt2YXIgYXJyYXk9dGhpcy5fX3dyYXBwZWRfXy52YWx1ZSgpLGRpcj10aGlzLl9fZGlyX18saXNBcnI9aXNBcnJheShhcnJheSksaXNSaWdodD1kaXI8MCxhcnJMZW5ndGg9aXNBcnI/YXJyYXkubGVuZ3RoOjAsdmlldz1nZXRWaWV3KDAsYXJyTGVuZ3RoLHRoaXMuX192aWV3c19fKSxzdGFydD12aWV3LnN0YXJ0LGVuZD12aWV3LmVuZCxsZW5ndGg9ZW5kLXN0YXJ0LGluZGV4PWlzUmlnaHQ/ZW5kOnN0YXJ0LTEsaXRlcmF0ZWVzPXRoaXMuX19pdGVyYXRlZXNfXywKaXRlckxlbmd0aD1pdGVyYXRlZXMubGVuZ3RoLHJlc0luZGV4PTAsdGFrZUNvdW50PW5hdGl2ZU1pbihsZW5ndGgsdGhpcy5fX3Rha2VDb3VudF9fKTtpZighaXNBcnJ8fCFpc1JpZ2h0JiZhcnJMZW5ndGg9PWxlbmd0aCYmdGFrZUNvdW50PT1sZW5ndGgpcmV0dXJuIGJhc2VXcmFwcGVyVmFsdWUoYXJyYXksdGhpcy5fX2FjdGlvbnNfXyk7dmFyIHJlc3VsdD1bXTtvdXRlcjp3aGlsZShsZW5ndGgtLSYmcmVzSW5kZXg8dGFrZUNvdW50KXtpbmRleCs9ZGlyO3ZhciBpdGVySW5kZXg9LTEsdmFsdWU9YXJyYXlbaW5kZXhdO3doaWxlKCsraXRlckluZGV4PGl0ZXJMZW5ndGgpe3ZhciBkYXRhPWl0ZXJhdGVlc1tpdGVySW5kZXhdLGl0ZXJhdGVlPWRhdGEuaXRlcmF0ZWUsdHlwZT1kYXRhLnR5cGUsY29tcHV0ZWQ9aXRlcmF0ZWUodmFsdWUpO2lmKHR5cGU9PUxBWllfTUFQX0ZMQUcpdmFsdWU9Y29tcHV0ZWQ7ZWxzZSBpZighY29tcHV0ZWQpaWYodHlwZT09TEFaWV9GSUxURVJfRkxBRyljb250aW51ZSBvdXRlcjsKZWxzZSBicmVhayBvdXRlcn1yZXN1bHRbcmVzSW5kZXgrK109dmFsdWV9cmV0dXJuIHJlc3VsdH1MYXp5V3JhcHBlci5wcm90b3R5cGU9YmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7TGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPUxhenlXcmFwcGVyO2Z1bmN0aW9uIEhhc2goZW50cmllcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1lbnRyaWVzPT1udWxsPzA6ZW50cmllcy5sZW5ndGg7dGhpcy5jbGVhcigpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZW50cnk9ZW50cmllc1tpbmRleF07dGhpcy5zZXQoZW50cnlbMF0sZW50cnlbMV0pfX1mdW5jdGlvbiBoYXNoQ2xlYXIoKXt0aGlzLl9fZGF0YV9fPW5hdGl2ZUNyZWF0ZT9uYXRpdmVDcmVhdGUobnVsbCk6e307dGhpcy5zaXplPTB9ZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpe3ZhciByZXN1bHQ9dGhpcy5oYXMoa2V5KSYmZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTt0aGlzLnNpemUtPXJlc3VsdD8xOjA7CnJldHVybiByZXN1bHR9ZnVuY3Rpb24gaGFzaEdldChrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187aWYobmF0aXZlQ3JlYXRlKXt2YXIgcmVzdWx0PWRhdGFba2V5XTtyZXR1cm4gcmVzdWx0PT09SEFTSF9VTkRFRklORUQ/dW5kZWZpbmVkOnJlc3VsdH1yZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLGtleSk/ZGF0YVtrZXldOnVuZGVmaW5lZH1mdW5jdGlvbiBoYXNoSGFzKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXztyZXR1cm4gbmF0aXZlQ3JlYXRlP2RhdGFba2V5XSE9PXVuZGVmaW5lZDpoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsa2V5KX1mdW5jdGlvbiBoYXNoU2V0KGtleSx2YWx1ZSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXzt0aGlzLnNpemUrPXRoaXMuaGFzKGtleSk/MDoxO2RhdGFba2V5XT1uYXRpdmVDcmVhdGUmJnZhbHVlPT09dW5kZWZpbmVkP0hBU0hfVU5ERUZJTkVEOnZhbHVlO3JldHVybiB0aGlzfUhhc2gucHJvdG90eXBlLmNsZWFyPWhhc2hDbGVhcjsKSGFzaC5wcm90b3R5cGVbImRlbGV0ZSJdPWhhc2hEZWxldGU7SGFzaC5wcm90b3R5cGUuZ2V0PWhhc2hHZXQ7SGFzaC5wcm90b3R5cGUuaGFzPWhhc2hIYXM7SGFzaC5wcm90b3R5cGUuc2V0PWhhc2hTZXQ7ZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9ZW50cmllcz09bnVsbD8wOmVudHJpZXMubGVuZ3RoO3RoaXMuY2xlYXIoKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGVudHJ5PWVudHJpZXNbaW5kZXhdO3RoaXMuc2V0KGVudHJ5WzBdLGVudHJ5WzFdKX19ZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKXt0aGlzLl9fZGF0YV9fPVtdO3RoaXMuc2l6ZT0wfWZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX18saW5kZXg9YXNzb2NJbmRleE9mKGRhdGEsa2V5KTtpZihpbmRleDwwKXJldHVybiBmYWxzZTt2YXIgbGFzdEluZGV4PWRhdGEubGVuZ3RoLTE7aWYoaW5kZXg9PWxhc3RJbmRleClkYXRhLnBvcCgpOwplbHNlIHNwbGljZS5jYWxsKGRhdGEsaW5kZXgsMSk7LS10aGlzLnNpemU7cmV0dXJuIHRydWV9ZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxpbmRleD1hc3NvY0luZGV4T2YoZGF0YSxrZXkpO3JldHVybiBpbmRleDwwP3VuZGVmaW5lZDpkYXRhW2luZGV4XVsxXX1mdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KXtyZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sa2V5KT4tMX1mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LHZhbHVlKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fLGluZGV4PWFzc29jSW5kZXhPZihkYXRhLGtleSk7aWYoaW5kZXg8MCl7Kyt0aGlzLnNpemU7ZGF0YS5wdXNoKFtrZXksdmFsdWVdKX1lbHNlIGRhdGFbaW5kZXhdWzFdPXZhbHVlO3JldHVybiB0aGlzfUxpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXI9bGlzdENhY2hlQ2xlYXI7TGlzdENhY2hlLnByb3RvdHlwZVsiZGVsZXRlIl09bGlzdENhY2hlRGVsZXRlO0xpc3RDYWNoZS5wcm90b3R5cGUuZ2V0PQpsaXN0Q2FjaGVHZXQ7TGlzdENhY2hlLnByb3RvdHlwZS5oYXM9bGlzdENhY2hlSGFzO0xpc3RDYWNoZS5wcm90b3R5cGUuc2V0PWxpc3RDYWNoZVNldDtmdW5jdGlvbiBNYXBDYWNoZShlbnRyaWVzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWVudHJpZXM9PW51bGw/MDplbnRyaWVzLmxlbmd0aDt0aGlzLmNsZWFyKCk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBlbnRyeT1lbnRyaWVzW2luZGV4XTt0aGlzLnNldChlbnRyeVswXSxlbnRyeVsxXSl9fWZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKXt0aGlzLnNpemU9MDt0aGlzLl9fZGF0YV9fPXsiaGFzaCI6bmV3IEhhc2gsIm1hcCI6bmV3IChNYXB8fExpc3RDYWNoZSksInN0cmluZyI6bmV3IEhhc2h9fWZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleSl7dmFyIHJlc3VsdD1nZXRNYXBEYXRhKHRoaXMsa2V5KVsiZGVsZXRlIl0oa2V5KTt0aGlzLnNpemUtPXJlc3VsdD8xOjA7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpe3JldHVybiBnZXRNYXBEYXRhKHRoaXMsCmtleSkuZ2V0KGtleSl9ZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KXtyZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLGtleSkuaGFzKGtleSl9ZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LHZhbHVlKXt2YXIgZGF0YT1nZXRNYXBEYXRhKHRoaXMsa2V5KSxzaXplPWRhdGEuc2l6ZTtkYXRhLnNldChrZXksdmFsdWUpO3RoaXMuc2l6ZSs9ZGF0YS5zaXplPT1zaXplPzA6MTtyZXR1cm4gdGhpc31NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXI9bWFwQ2FjaGVDbGVhcjtNYXBDYWNoZS5wcm90b3R5cGVbImRlbGV0ZSJdPW1hcENhY2hlRGVsZXRlO01hcENhY2hlLnByb3RvdHlwZS5nZXQ9bWFwQ2FjaGVHZXQ7TWFwQ2FjaGUucHJvdG90eXBlLmhhcz1tYXBDYWNoZUhhcztNYXBDYWNoZS5wcm90b3R5cGUuc2V0PW1hcENhY2hlU2V0O2Z1bmN0aW9uIFNldENhY2hlKHZhbHVlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD12YWx1ZXM9PW51bGw/MDp2YWx1ZXMubGVuZ3RoO3RoaXMuX19kYXRhX189bmV3IE1hcENhY2hlOwp3aGlsZSgrK2luZGV4PGxlbmd0aCl0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKX1mdW5jdGlvbiBzZXRDYWNoZUFkZCh2YWx1ZSl7dGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsSEFTSF9VTkRFRklORUQpO3JldHVybiB0aGlzfWZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpfVNldENhY2hlLnByb3RvdHlwZS5hZGQ9U2V0Q2FjaGUucHJvdG90eXBlLnB1c2g9c2V0Q2FjaGVBZGQ7U2V0Q2FjaGUucHJvdG90eXBlLmhhcz1zZXRDYWNoZUhhcztmdW5jdGlvbiBTdGFjayhlbnRyaWVzKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fPW5ldyBMaXN0Q2FjaGUoZW50cmllcyk7dGhpcy5zaXplPWRhdGEuc2l6ZX1mdW5jdGlvbiBzdGFja0NsZWFyKCl7dGhpcy5fX2RhdGFfXz1uZXcgTGlzdENhY2hlO3RoaXMuc2l6ZT0wfWZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxyZXN1bHQ9ZGF0YVsiZGVsZXRlIl0oa2V5KTsKdGhpcy5zaXplPWRhdGEuc2l6ZTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHN0YWNrR2V0KGtleSl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSl9ZnVuY3Rpb24gc3RhY2tIYXMoa2V5KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KX1mdW5jdGlvbiBzdGFja1NldChrZXksdmFsdWUpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187aWYoZGF0YSBpbnN0YW5jZW9mIExpc3RDYWNoZSl7dmFyIHBhaXJzPWRhdGEuX19kYXRhX187aWYoIU1hcHx8cGFpcnMubGVuZ3RoPExBUkdFX0FSUkFZX1NJWkUtMSl7cGFpcnMucHVzaChba2V5LHZhbHVlXSk7dGhpcy5zaXplPSsrZGF0YS5zaXplO3JldHVybiB0aGlzfWRhdGE9dGhpcy5fX2RhdGFfXz1uZXcgTWFwQ2FjaGUocGFpcnMpfWRhdGEuc2V0KGtleSx2YWx1ZSk7dGhpcy5zaXplPWRhdGEuc2l6ZTtyZXR1cm4gdGhpc31TdGFjay5wcm90b3R5cGUuY2xlYXI9c3RhY2tDbGVhcjtTdGFjay5wcm90b3R5cGVbImRlbGV0ZSJdPXN0YWNrRGVsZXRlOwpTdGFjay5wcm90b3R5cGUuZ2V0PXN0YWNrR2V0O1N0YWNrLnByb3RvdHlwZS5oYXM9c3RhY2tIYXM7U3RhY2sucHJvdG90eXBlLnNldD1zdGFja1NldDtmdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLGluaGVyaXRlZCl7dmFyIGlzQXJyPWlzQXJyYXkodmFsdWUpLGlzQXJnPSFpc0FyciYmaXNBcmd1bWVudHModmFsdWUpLGlzQnVmZj0haXNBcnImJiFpc0FyZyYmaXNCdWZmZXIodmFsdWUpLGlzVHlwZT0haXNBcnImJiFpc0FyZyYmIWlzQnVmZiYmaXNUeXBlZEFycmF5KHZhbHVlKSxza2lwSW5kZXhlcz1pc0Fycnx8aXNBcmd8fGlzQnVmZnx8aXNUeXBlLHJlc3VsdD1za2lwSW5kZXhlcz9iYXNlVGltZXModmFsdWUubGVuZ3RoLFN0cmluZyk6W10sbGVuZ3RoPXJlc3VsdC5sZW5ndGg7Zm9yKHZhciBrZXkgaW4gdmFsdWUpaWYoKGluaGVyaXRlZHx8aGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSxrZXkpKSYmIShza2lwSW5kZXhlcyYmKGtleT09Imxlbmd0aCJ8fGlzQnVmZiYmKGtleT09CiJvZmZzZXQifHxrZXk9PSJwYXJlbnQiKXx8aXNUeXBlJiYoa2V5PT0iYnVmZmVyInx8a2V5PT0iYnl0ZUxlbmd0aCJ8fGtleT09ImJ5dGVPZmZzZXQiKXx8aXNJbmRleChrZXksbGVuZ3RoKSkpKXJlc3VsdC5wdXNoKGtleSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBhcnJheVNhbXBsZShhcnJheSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9hcnJheVtiYXNlUmFuZG9tKDAsbGVuZ3RoLTEpXTp1bmRlZmluZWR9ZnVuY3Rpb24gYXJyYXlTYW1wbGVTaXplKGFycmF5LG4pe3JldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpLGJhc2VDbGFtcChuLDAsYXJyYXkubGVuZ3RoKSl9ZnVuY3Rpb24gYXJyYXlTaHVmZmxlKGFycmF5KXtyZXR1cm4gc2h1ZmZsZVNlbGYoY29weUFycmF5KGFycmF5KSl9ZnVuY3Rpb24gYXNzaWduTWVyZ2VWYWx1ZShvYmplY3Qsa2V5LHZhbHVlKXtpZih2YWx1ZSE9PXVuZGVmaW5lZCYmIWVxKG9iamVjdFtrZXldLHZhbHVlKXx8CnZhbHVlPT09dW5kZWZpbmVkJiYhKGtleSBpbiBvYmplY3QpKWJhc2VBc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHZhbHVlKX1mdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHZhbHVlKXt2YXIgb2JqVmFsdWU9b2JqZWN0W2tleV07aWYoIShoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpJiZlcShvYmpWYWx1ZSx2YWx1ZSkpfHx2YWx1ZT09PXVuZGVmaW5lZCYmIShrZXkgaW4gb2JqZWN0KSliYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSx2YWx1ZSl9ZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LGtleSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUobGVuZ3RoLS0paWYoZXEoYXJyYXlbbGVuZ3RoXVswXSxrZXkpKXJldHVybiBsZW5ndGg7cmV0dXJuLTF9ZnVuY3Rpb24gYmFzZUFnZ3JlZ2F0b3IoY29sbGVjdGlvbixzZXR0ZXIsaXRlcmF0ZWUsYWNjdW11bGF0b3Ipe2Jhc2VFYWNoKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUsa2V5LGNvbGxlY3Rpb24pe3NldHRlcihhY2N1bXVsYXRvciwKdmFsdWUsaXRlcmF0ZWUodmFsdWUpLGNvbGxlY3Rpb24pfSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LHNvdXJjZSl7cmV0dXJuIG9iamVjdCYmY29weU9iamVjdChzb3VyY2Usa2V5cyhzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gYmFzZUFzc2lnbkluKG9iamVjdCxzb3VyY2Upe3JldHVybiBvYmplY3QmJmNvcHlPYmplY3Qoc291cmNlLGtleXNJbihzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCxrZXksdmFsdWUpe2lmKGtleT09Il9fcHJvdG9fXyImJmRlZmluZVByb3BlcnR5KWRlZmluZVByb3BlcnR5KG9iamVjdCxrZXkseyJjb25maWd1cmFibGUiOnRydWUsImVudW1lcmFibGUiOnRydWUsInZhbHVlIjp2YWx1ZSwid3JpdGFibGUiOnRydWV9KTtlbHNlIG9iamVjdFtrZXldPXZhbHVlfWZ1bmN0aW9uIGJhc2VBdChvYmplY3QscGF0aHMpe3ZhciBpbmRleD0tMSxsZW5ndGg9cGF0aHMubGVuZ3RoLHJlc3VsdD0KQXJyYXkobGVuZ3RoKSxza2lwPW9iamVjdD09bnVsbDt3aGlsZSgrK2luZGV4PGxlbmd0aClyZXN1bHRbaW5kZXhdPXNraXA/dW5kZWZpbmVkOmdldChvYmplY3QscGF0aHNbaW5kZXhdKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VDbGFtcChudW1iZXIsbG93ZXIsdXBwZXIpe2lmKG51bWJlcj09PW51bWJlcil7aWYodXBwZXIhPT11bmRlZmluZWQpbnVtYmVyPW51bWJlcjw9dXBwZXI/bnVtYmVyOnVwcGVyO2lmKGxvd2VyIT09dW5kZWZpbmVkKW51bWJlcj1udW1iZXI+PWxvd2VyP251bWJlcjpsb3dlcn1yZXR1cm4gbnVtYmVyfWZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsa2V5LG9iamVjdCxzdGFjayl7dmFyIHJlc3VsdCxpc0RlZXA9Yml0bWFzayZDTE9ORV9ERUVQX0ZMQUcsaXNGbGF0PWJpdG1hc2smQ0xPTkVfRkxBVF9GTEFHLGlzRnVsbD1iaXRtYXNrJkNMT05FX1NZTUJPTFNfRkxBRztpZihjdXN0b21pemVyKXJlc3VsdD1vYmplY3Q/CmN1c3RvbWl6ZXIodmFsdWUsa2V5LG9iamVjdCxzdGFjayk6Y3VzdG9taXplcih2YWx1ZSk7aWYocmVzdWx0IT09dW5kZWZpbmVkKXJldHVybiByZXN1bHQ7aWYoIWlzT2JqZWN0KHZhbHVlKSlyZXR1cm4gdmFsdWU7dmFyIGlzQXJyPWlzQXJyYXkodmFsdWUpO2lmKGlzQXJyKXtyZXN1bHQ9aW5pdENsb25lQXJyYXkodmFsdWUpO2lmKCFpc0RlZXApcmV0dXJuIGNvcHlBcnJheSh2YWx1ZSxyZXN1bHQpfWVsc2V7dmFyIHRhZz1nZXRUYWcodmFsdWUpLGlzRnVuYz10YWc9PWZ1bmNUYWd8fHRhZz09Z2VuVGFnO2lmKGlzQnVmZmVyKHZhbHVlKSlyZXR1cm4gY2xvbmVCdWZmZXIodmFsdWUsaXNEZWVwKTtpZih0YWc9PW9iamVjdFRhZ3x8dGFnPT1hcmdzVGFnfHxpc0Z1bmMmJiFvYmplY3Qpe3Jlc3VsdD1pc0ZsYXR8fGlzRnVuYz97fTppbml0Q2xvbmVPYmplY3QodmFsdWUpO2lmKCFpc0RlZXApcmV0dXJuIGlzRmxhdD9jb3B5U3ltYm9sc0luKHZhbHVlLGJhc2VBc3NpZ25JbihyZXN1bHQsCnZhbHVlKSk6Y29weVN5bWJvbHModmFsdWUsYmFzZUFzc2lnbihyZXN1bHQsdmFsdWUpKX1lbHNle2lmKCFjbG9uZWFibGVUYWdzW3RhZ10pcmV0dXJuIG9iamVjdD92YWx1ZTp7fTtyZXN1bHQ9aW5pdENsb25lQnlUYWcodmFsdWUsdGFnLGlzRGVlcCl9fXN0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTt2YXIgc3RhY2tlZD1zdGFjay5nZXQodmFsdWUpO2lmKHN0YWNrZWQpcmV0dXJuIHN0YWNrZWQ7c3RhY2suc2V0KHZhbHVlLHJlc3VsdCk7aWYoaXNTZXQodmFsdWUpKXt2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlKXtyZXN1bHQuYWRkKGJhc2VDbG9uZShzdWJWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3ViVmFsdWUsdmFsdWUsc3RhY2spKX0pO3JldHVybiByZXN1bHR9aWYoaXNNYXAodmFsdWUpKXt2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlLGtleSl7cmVzdWx0LnNldChrZXksYmFzZUNsb25lKHN1YlZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixrZXksdmFsdWUsCnN0YWNrKSl9KTtyZXR1cm4gcmVzdWx0fXZhciBrZXlzRnVuYz1pc0Z1bGw/aXNGbGF0P2dldEFsbEtleXNJbjpnZXRBbGxLZXlzOmlzRmxhdD9rZXlzSW46a2V5czt2YXIgcHJvcHM9aXNBcnI/dW5kZWZpbmVkOmtleXNGdW5jKHZhbHVlKTthcnJheUVhY2gocHJvcHN8fHZhbHVlLGZ1bmN0aW9uKHN1YlZhbHVlLGtleSl7aWYocHJvcHMpe2tleT1zdWJWYWx1ZTtzdWJWYWx1ZT12YWx1ZVtrZXldfWFzc2lnblZhbHVlKHJlc3VsdCxrZXksYmFzZUNsb25lKHN1YlZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixrZXksdmFsdWUsc3RhY2spKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUNvbmZvcm1zKHNvdXJjZSl7dmFyIHByb3BzPWtleXMoc291cmNlKTtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtyZXR1cm4gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LHNvdXJjZSxwcm9wcyl9fWZ1bmN0aW9uIGJhc2VDb25mb3Jtc1RvKG9iamVjdCxzb3VyY2UscHJvcHMpe3ZhciBsZW5ndGg9cHJvcHMubGVuZ3RoOwppZihvYmplY3Q9PW51bGwpcmV0dXJuIWxlbmd0aDtvYmplY3Q9T2JqZWN0KG9iamVjdCk7d2hpbGUobGVuZ3RoLS0pe3ZhciBrZXk9cHJvcHNbbGVuZ3RoXSxwcmVkaWNhdGU9c291cmNlW2tleV0sdmFsdWU9b2JqZWN0W2tleV07aWYodmFsdWU9PT11bmRlZmluZWQmJiEoa2V5IGluIG9iamVjdCl8fCFwcmVkaWNhdGUodmFsdWUpKXJldHVybiBmYWxzZX1yZXR1cm4gdHJ1ZX1mdW5jdGlvbiBiYXNlRGVsYXkoZnVuYyx3YWl0LGFyZ3Mpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe2Z1bmMuYXBwbHkodW5kZWZpbmVkLGFyZ3MpfSx3YWl0KX1mdW5jdGlvbiBiYXNlRGlmZmVyZW5jZShhcnJheSx2YWx1ZXMsaXRlcmF0ZWUsY29tcGFyYXRvcil7dmFyIGluZGV4PS0xLGluY2x1ZGVzPWFycmF5SW5jbHVkZXMsaXNDb21tb249dHJ1ZSxsZW5ndGg9YXJyYXkubGVuZ3RoLApyZXN1bHQ9W10sdmFsdWVzTGVuZ3RoPXZhbHVlcy5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4gcmVzdWx0O2lmKGl0ZXJhdGVlKXZhbHVlcz1hcnJheU1hcCh2YWx1ZXMsYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7aWYoY29tcGFyYXRvcil7aW5jbHVkZXM9YXJyYXlJbmNsdWRlc1dpdGg7aXNDb21tb249ZmFsc2V9ZWxzZSBpZih2YWx1ZXMubGVuZ3RoPj1MQVJHRV9BUlJBWV9TSVpFKXtpbmNsdWRlcz1jYWNoZUhhcztpc0NvbW1vbj1mYWxzZTt2YWx1ZXM9bmV3IFNldENhY2hlKHZhbHVlcyl9b3V0ZXI6d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF0sY29tcHV0ZWQ9aXRlcmF0ZWU9PW51bGw/dmFsdWU6aXRlcmF0ZWUodmFsdWUpO3ZhbHVlPWNvbXBhcmF0b3J8fHZhbHVlIT09MD92YWx1ZTowO2lmKGlzQ29tbW9uJiZjb21wdXRlZD09PWNvbXB1dGVkKXt2YXIgdmFsdWVzSW5kZXg9dmFsdWVzTGVuZ3RoO3doaWxlKHZhbHVlc0luZGV4LS0paWYodmFsdWVzW3ZhbHVlc0luZGV4XT09PQpjb21wdXRlZCljb250aW51ZSBvdXRlcjtyZXN1bHQucHVzaCh2YWx1ZSl9ZWxzZSBpZighaW5jbHVkZXModmFsdWVzLGNvbXB1dGVkLGNvbXBhcmF0b3IpKXJlc3VsdC5wdXNoKHZhbHVlKX1yZXR1cm4gcmVzdWx0fXZhciBiYXNlRWFjaD1jcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTt2YXIgYmFzZUVhY2hSaWdodD1jcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duUmlnaHQsdHJ1ZSk7ZnVuY3Rpb24gYmFzZUV2ZXJ5KGNvbGxlY3Rpb24scHJlZGljYXRlKXt2YXIgcmVzdWx0PXRydWU7YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXtyZXN1bHQ9ISFwcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbik7cmV0dXJuIHJlc3VsdH0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUV4dHJlbXVtKGFycmF5LGl0ZXJhdGVlLGNvbXBhcmF0b3Ipe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9CmFycmF5W2luZGV4XSxjdXJyZW50PWl0ZXJhdGVlKHZhbHVlKTtpZihjdXJyZW50IT1udWxsJiYoY29tcHV0ZWQ9PT11bmRlZmluZWQ/Y3VycmVudD09PWN1cnJlbnQmJiFpc1N5bWJvbChjdXJyZW50KTpjb21wYXJhdG9yKGN1cnJlbnQsY29tcHV0ZWQpKSl2YXIgY29tcHV0ZWQ9Y3VycmVudCxyZXN1bHQ9dmFsdWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmlsbChhcnJheSx2YWx1ZSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO3N0YXJ0PXRvSW50ZWdlcihzdGFydCk7aWYoc3RhcnQ8MClzdGFydD0tc3RhcnQ+bGVuZ3RoPzA6bGVuZ3RoK3N0YXJ0O2VuZD1lbmQ9PT11bmRlZmluZWR8fGVuZD5sZW5ndGg/bGVuZ3RoOnRvSW50ZWdlcihlbmQpO2lmKGVuZDwwKWVuZCs9bGVuZ3RoO2VuZD1zdGFydD5lbmQ/MDp0b0xlbmd0aChlbmQpO3doaWxlKHN0YXJ0PGVuZClhcnJheVtzdGFydCsrXT12YWx1ZTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYmFzZUZpbHRlcihjb2xsZWN0aW9uLApwcmVkaWNhdGUpe3ZhciByZXN1bHQ9W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXtpZihwcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbikpcmVzdWx0LnB1c2godmFsdWUpfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSxkZXB0aCxwcmVkaWNhdGUsaXNTdHJpY3QscmVzdWx0KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDtwcmVkaWNhdGV8fChwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZSk7cmVzdWx0fHwocmVzdWx0PVtdKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihkZXB0aD4wJiZwcmVkaWNhdGUodmFsdWUpKWlmKGRlcHRoPjEpYmFzZUZsYXR0ZW4odmFsdWUsZGVwdGgtMSxwcmVkaWNhdGUsaXNTdHJpY3QscmVzdWx0KTtlbHNlIGFycmF5UHVzaChyZXN1bHQsdmFsdWUpO2Vsc2UgaWYoIWlzU3RyaWN0KXJlc3VsdFtyZXN1bHQubGVuZ3RoXT0KdmFsdWV9cmV0dXJuIHJlc3VsdH12YXIgYmFzZUZvcj1jcmVhdGVCYXNlRm9yKCk7dmFyIGJhc2VGb3JSaWdodD1jcmVhdGVCYXNlRm9yKHRydWUpO2Z1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yKG9iamVjdCxpdGVyYXRlZSxrZXlzKX1mdW5jdGlvbiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yUmlnaHQob2JqZWN0LGl0ZXJhdGVlLGtleXMpfWZ1bmN0aW9uIGJhc2VGdW5jdGlvbnMob2JqZWN0LHByb3BzKXtyZXR1cm4gYXJyYXlGaWx0ZXIocHJvcHMsZnVuY3Rpb24oa2V5KXtyZXR1cm4gaXNGdW5jdGlvbihvYmplY3Rba2V5XSl9KX1mdW5jdGlvbiBiYXNlR2V0KG9iamVjdCxwYXRoKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9MCxsZW5ndGg9cGF0aC5sZW5ndGg7d2hpbGUob2JqZWN0IT1udWxsJiZpbmRleDxsZW5ndGgpb2JqZWN0PW9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07CnJldHVybiBpbmRleCYmaW5kZXg9PWxlbmd0aD9vYmplY3Q6dW5kZWZpbmVkfWZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCxrZXlzRnVuYyxzeW1ib2xzRnVuYyl7dmFyIHJlc3VsdD1rZXlzRnVuYyhvYmplY3QpO3JldHVybiBpc0FycmF5KG9iamVjdCk/cmVzdWx0OmFycmF5UHVzaChyZXN1bHQsc3ltYm9sc0Z1bmMob2JqZWN0KSl9ZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSl7aWYodmFsdWU9PW51bGwpcmV0dXJuIHZhbHVlPT09dW5kZWZpbmVkP3VuZGVmaW5lZFRhZzpudWxsVGFnO3JldHVybiBzeW1Ub1N0cmluZ1RhZyYmc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKT9nZXRSYXdUYWcodmFsdWUpOm9iamVjdFRvU3RyaW5nKHZhbHVlKX1mdW5jdGlvbiBiYXNlR3QodmFsdWUsb3RoZXIpe3JldHVybiB2YWx1ZT5vdGhlcn1mdW5jdGlvbiBiYXNlSGFzKG9iamVjdCxrZXkpe3JldHVybiBvYmplY3QhPW51bGwmJmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LAprZXkpfWZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3Qsa2V5KXtyZXR1cm4gb2JqZWN0IT1udWxsJiZrZXkgaW4gT2JqZWN0KG9iamVjdCl9ZnVuY3Rpb24gYmFzZUluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl7cmV0dXJuIG51bWJlcj49bmF0aXZlTWluKHN0YXJ0LGVuZCkmJm51bWJlcjxuYXRpdmVNYXgoc3RhcnQsZW5kKX1mdW5jdGlvbiBiYXNlSW50ZXJzZWN0aW9uKGFycmF5cyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5jbHVkZXM9Y29tcGFyYXRvcj9hcnJheUluY2x1ZGVzV2l0aDphcnJheUluY2x1ZGVzLGxlbmd0aD1hcnJheXNbMF0ubGVuZ3RoLG90aExlbmd0aD1hcnJheXMubGVuZ3RoLG90aEluZGV4PW90aExlbmd0aCxjYWNoZXM9QXJyYXkob3RoTGVuZ3RoKSxtYXhMZW5ndGg9SW5maW5pdHkscmVzdWx0PVtdO3doaWxlKG90aEluZGV4LS0pe3ZhciBhcnJheT1hcnJheXNbb3RoSW5kZXhdO2lmKG90aEluZGV4JiZpdGVyYXRlZSlhcnJheT1hcnJheU1hcChhcnJheSwKYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7bWF4TGVuZ3RoPW5hdGl2ZU1pbihhcnJheS5sZW5ndGgsbWF4TGVuZ3RoKTtjYWNoZXNbb3RoSW5kZXhdPSFjb21wYXJhdG9yJiYoaXRlcmF0ZWV8fGxlbmd0aD49MTIwJiZhcnJheS5sZW5ndGg+PTEyMCk/bmV3IFNldENhY2hlKG90aEluZGV4JiZhcnJheSk6dW5kZWZpbmVkfWFycmF5PWFycmF5c1swXTt2YXIgaW5kZXg9LTEsc2Vlbj1jYWNoZXNbMF07b3V0ZXI6d2hpbGUoKytpbmRleDxsZW5ndGgmJnJlc3VsdC5sZW5ndGg8bWF4TGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlP2l0ZXJhdGVlKHZhbHVlKTp2YWx1ZTt2YWx1ZT1jb21wYXJhdG9yfHx2YWx1ZSE9PTA/dmFsdWU6MDtpZighKHNlZW4/Y2FjaGVIYXMoc2Vlbixjb21wdXRlZCk6aW5jbHVkZXMocmVzdWx0LGNvbXB1dGVkLGNvbXBhcmF0b3IpKSl7b3RoSW5kZXg9b3RoTGVuZ3RoO3doaWxlKC0tb3RoSW5kZXgpe3ZhciBjYWNoZT1jYWNoZXNbb3RoSW5kZXhdOwppZighKGNhY2hlP2NhY2hlSGFzKGNhY2hlLGNvbXB1dGVkKTppbmNsdWRlcyhhcnJheXNbb3RoSW5kZXhdLGNvbXB1dGVkLGNvbXBhcmF0b3IpKSljb250aW51ZSBvdXRlcn1pZihzZWVuKXNlZW4ucHVzaChjb21wdXRlZCk7cmVzdWx0LnB1c2godmFsdWUpfX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VJbnZlcnRlcihvYmplY3Qsc2V0dGVyLGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXtiYXNlRm9yT3duKG9iamVjdCxmdW5jdGlvbih2YWx1ZSxrZXksb2JqZWN0KXtzZXR0ZXIoYWNjdW11bGF0b3IsaXRlcmF0ZWUodmFsdWUpLGtleSxvYmplY3QpfSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGJhc2VJbnZva2Uob2JqZWN0LHBhdGgsYXJncyl7cGF0aD1jYXN0UGF0aChwYXRoLG9iamVjdCk7b2JqZWN0PXBhcmVudChvYmplY3QscGF0aCk7dmFyIGZ1bmM9b2JqZWN0PT1udWxsP29iamVjdDpvYmplY3RbdG9LZXkobGFzdChwYXRoKSldO3JldHVybiBmdW5jPT1udWxsP3VuZGVmaW5lZDoKYXBwbHkoZnVuYyxvYmplY3QsYXJncyl9ZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PWFyZ3NUYWd9ZnVuY3Rpb24gYmFzZUlzQXJyYXlCdWZmZXIodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09YXJyYXlCdWZmZXJUYWd9ZnVuY3Rpb24gYmFzZUlzRGF0ZSh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1kYXRlVGFnfWZ1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixzdGFjayl7aWYodmFsdWU9PT1vdGhlcilyZXR1cm4gdHJ1ZTtpZih2YWx1ZT09bnVsbHx8b3RoZXI9PW51bGx8fCFpc09iamVjdExpa2UodmFsdWUpJiYhaXNPYmplY3RMaWtlKG90aGVyKSlyZXR1cm4gdmFsdWUhPT12YWx1ZSYmb3RoZXIhPT1vdGhlcjtyZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLApvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsYmFzZUlzRXF1YWwsc3RhY2spfWZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3Qsb3RoZXIsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl7dmFyIG9iaklzQXJyPWlzQXJyYXkob2JqZWN0KSxvdGhJc0Fycj1pc0FycmF5KG90aGVyKSxvYmpUYWc9b2JqSXNBcnI/YXJyYXlUYWc6Z2V0VGFnKG9iamVjdCksb3RoVGFnPW90aElzQXJyP2FycmF5VGFnOmdldFRhZyhvdGhlcik7b2JqVGFnPW9ialRhZz09YXJnc1RhZz9vYmplY3RUYWc6b2JqVGFnO290aFRhZz1vdGhUYWc9PWFyZ3NUYWc/b2JqZWN0VGFnOm90aFRhZzt2YXIgb2JqSXNPYmo9b2JqVGFnPT1vYmplY3RUYWcsb3RoSXNPYmo9b3RoVGFnPT1vYmplY3RUYWcsaXNTYW1lVGFnPW9ialRhZz09b3RoVGFnO2lmKGlzU2FtZVRhZyYmaXNCdWZmZXIob2JqZWN0KSl7aWYoIWlzQnVmZmVyKG90aGVyKSlyZXR1cm4gZmFsc2U7b2JqSXNBcnI9dHJ1ZTtvYmpJc09iaj0KZmFsc2V9aWYoaXNTYW1lVGFnJiYhb2JqSXNPYmope3N0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTtyZXR1cm4gb2JqSXNBcnJ8fGlzVHlwZWRBcnJheShvYmplY3QpP2VxdWFsQXJyYXlzKG9iamVjdCxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKTplcXVhbEJ5VGFnKG9iamVjdCxvdGhlcixvYmpUYWcsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl9aWYoIShiaXRtYXNrJkNPTVBBUkVfUEFSVElBTF9GTEFHKSl7dmFyIG9iaklzV3JhcHBlZD1vYmpJc09iaiYmaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIl9fd3JhcHBlZF9fIiksb3RoSXNXcmFwcGVkPW90aElzT2JqJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCJfX3dyYXBwZWRfXyIpO2lmKG9iaklzV3JhcHBlZHx8b3RoSXNXcmFwcGVkKXt2YXIgb2JqVW53cmFwcGVkPW9iaklzV3JhcHBlZD9vYmplY3QudmFsdWUoKTpvYmplY3Qsb3RoVW53cmFwcGVkPW90aElzV3JhcHBlZD9vdGhlci52YWx1ZSgpOgpvdGhlcjtzdGFja3x8KHN0YWNrPW5ldyBTdGFjayk7cmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsb3RoVW53cmFwcGVkLGJpdG1hc2ssY3VzdG9taXplcixzdGFjayl9fWlmKCFpc1NhbWVUYWcpcmV0dXJuIGZhbHNlO3N0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTtyZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKX1mdW5jdGlvbiBiYXNlSXNNYXAodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZnZXRUYWcodmFsdWUpPT1tYXBUYWd9ZnVuY3Rpb24gYmFzZUlzTWF0Y2gob2JqZWN0LHNvdXJjZSxtYXRjaERhdGEsY3VzdG9taXplcil7dmFyIGluZGV4PW1hdGNoRGF0YS5sZW5ndGgsbGVuZ3RoPWluZGV4LG5vQ3VzdG9taXplcj0hY3VzdG9taXplcjtpZihvYmplY3Q9PW51bGwpcmV0dXJuIWxlbmd0aDtvYmplY3Q9T2JqZWN0KG9iamVjdCk7d2hpbGUoaW5kZXgtLSl7dmFyIGRhdGE9bWF0Y2hEYXRhW2luZGV4XTsKaWYobm9DdXN0b21pemVyJiZkYXRhWzJdP2RhdGFbMV0hPT1vYmplY3RbZGF0YVswXV06IShkYXRhWzBdaW4gb2JqZWN0KSlyZXR1cm4gZmFsc2V9d2hpbGUoKytpbmRleDxsZW5ndGgpe2RhdGE9bWF0Y2hEYXRhW2luZGV4XTt2YXIga2V5PWRhdGFbMF0sb2JqVmFsdWU9b2JqZWN0W2tleV0sc3JjVmFsdWU9ZGF0YVsxXTtpZihub0N1c3RvbWl6ZXImJmRhdGFbMl0pe2lmKG9ialZhbHVlPT09dW5kZWZpbmVkJiYhKGtleSBpbiBvYmplY3QpKXJldHVybiBmYWxzZX1lbHNle3ZhciBzdGFjaz1uZXcgU3RhY2s7aWYoY3VzdG9taXplcil2YXIgcmVzdWx0PWN1c3RvbWl6ZXIob2JqVmFsdWUsc3JjVmFsdWUsa2V5LG9iamVjdCxzb3VyY2Usc3RhY2spO2lmKCEocmVzdWx0PT09dW5kZWZpbmVkP2Jhc2VJc0VxdWFsKHNyY1ZhbHVlLG9ialZhbHVlLENPTVBBUkVfUEFSVElBTF9GTEFHfENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsY3VzdG9taXplcixzdGFjayk6cmVzdWx0KSlyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfQpmdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpe2lmKCFpc09iamVjdCh2YWx1ZSl8fGlzTWFza2VkKHZhbHVlKSlyZXR1cm4gZmFsc2U7dmFyIHBhdHRlcm49aXNGdW5jdGlvbih2YWx1ZSk/cmVJc05hdGl2ZTpyZUlzSG9zdEN0b3I7cmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpfWZ1bmN0aW9uIGJhc2VJc1JlZ0V4cCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1yZWdleHBUYWd9ZnVuY3Rpb24gYmFzZUlzU2V0KHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmZ2V0VGFnKHZhbHVlKT09c2V0VGFnfWZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpJiYhIXR5cGVkQXJyYXlUYWdzW2Jhc2VHZXRUYWcodmFsdWUpXX1mdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09ImZ1bmN0aW9uIilyZXR1cm4gdmFsdWU7CmlmKHZhbHVlPT1udWxsKXJldHVybiBpZGVudGl0eTtpZih0eXBlb2YgdmFsdWU9PSJvYmplY3QiKXJldHVybiBpc0FycmF5KHZhbHVlKT9iYXNlTWF0Y2hlc1Byb3BlcnR5KHZhbHVlWzBdLHZhbHVlWzFdKTpiYXNlTWF0Y2hlcyh2YWx1ZSk7cmV0dXJuIHByb3BlcnR5KHZhbHVlKX1mdW5jdGlvbiBiYXNlS2V5cyhvYmplY3Qpe2lmKCFpc1Byb3RvdHlwZShvYmplY3QpKXJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7dmFyIHJlc3VsdD1bXTtmb3IodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSlpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpJiZrZXkhPSJjb25zdHJ1Y3RvciIpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VLZXlzSW4ob2JqZWN0KXtpZighaXNPYmplY3Qob2JqZWN0KSlyZXR1cm4gbmF0aXZlS2V5c0luKG9iamVjdCk7dmFyIGlzUHJvdG89aXNQcm90b3R5cGUob2JqZWN0KSxyZXN1bHQ9W107Zm9yKHZhciBrZXkgaW4gb2JqZWN0KWlmKCEoa2V5PT0KImNvbnN0cnVjdG9yIiYmKGlzUHJvdG98fCFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpKSkpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VMdCh2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPG90aGVyfWZ1bmN0aW9uIGJhc2VNYXAoY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGluZGV4PS0xLHJlc3VsdD1pc0FycmF5TGlrZShjb2xsZWN0aW9uKT9BcnJheShjb2xsZWN0aW9uLmxlbmd0aCk6W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxrZXksY29sbGVjdGlvbil7cmVzdWx0WysraW5kZXhdPWl0ZXJhdGVlKHZhbHVlLGtleSxjb2xsZWN0aW9uKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKXt2YXIgbWF0Y2hEYXRhPWdldE1hdGNoRGF0YShzb3VyY2UpO2lmKG1hdGNoRGF0YS5sZW5ndGg9PTEmJm1hdGNoRGF0YVswXVsyXSlyZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUobWF0Y2hEYXRhWzBdWzBdLAptYXRjaERhdGFbMF1bMV0pO3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBvYmplY3Q9PT1zb3VyY2V8fGJhc2VJc01hdGNoKG9iamVjdCxzb3VyY2UsbWF0Y2hEYXRhKX19ZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLHNyY1ZhbHVlKXtpZihpc0tleShwYXRoKSYmaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSlyZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUodG9LZXkocGF0aCksc3JjVmFsdWUpO3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3ZhciBvYmpWYWx1ZT1nZXQob2JqZWN0LHBhdGgpO3JldHVybiBvYmpWYWx1ZT09PXVuZGVmaW5lZCYmb2JqVmFsdWU9PT1zcmNWYWx1ZT9oYXNJbihvYmplY3QscGF0aCk6YmFzZUlzRXF1YWwoc3JjVmFsdWUsb2JqVmFsdWUsQ09NUEFSRV9QQVJUSUFMX0ZMQUd8Q09NUEFSRV9VTk9SREVSRURfRkxBRyl9fWZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3Qsc291cmNlLHNyY0luZGV4LGN1c3RvbWl6ZXIsc3RhY2spe2lmKG9iamVjdD09PQpzb3VyY2UpcmV0dXJuO2Jhc2VGb3Ioc291cmNlLGZ1bmN0aW9uKHNyY1ZhbHVlLGtleSl7aWYoaXNPYmplY3Qoc3JjVmFsdWUpKXtzdGFja3x8KHN0YWNrPW5ldyBTdGFjayk7YmFzZU1lcmdlRGVlcChvYmplY3Qsc291cmNlLGtleSxzcmNJbmRleCxiYXNlTWVyZ2UsY3VzdG9taXplcixzdGFjayl9ZWxzZXt2YXIgbmV3VmFsdWU9Y3VzdG9taXplcj9jdXN0b21pemVyKHNhZmVHZXQob2JqZWN0LGtleSksc3JjVmFsdWUsa2V5KyIiLG9iamVjdCxzb3VyY2Usc3RhY2spOnVuZGVmaW5lZDtpZihuZXdWYWx1ZT09PXVuZGVmaW5lZCluZXdWYWx1ZT1zcmNWYWx1ZTthc3NpZ25NZXJnZVZhbHVlKG9iamVjdCxrZXksbmV3VmFsdWUpfX0sa2V5c0luKX1mdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCxzb3VyY2Usa2V5LHNyY0luZGV4LG1lcmdlRnVuYyxjdXN0b21pemVyLHN0YWNrKXt2YXIgb2JqVmFsdWU9c2FmZUdldChvYmplY3Qsa2V5KSxzcmNWYWx1ZT1zYWZlR2V0KHNvdXJjZSwKa2V5KSxzdGFja2VkPXN0YWNrLmdldChzcmNWYWx1ZSk7aWYoc3RhY2tlZCl7YXNzaWduTWVyZ2VWYWx1ZShvYmplY3Qsa2V5LHN0YWNrZWQpO3JldHVybn12YXIgbmV3VmFsdWU9Y3VzdG9taXplcj9jdXN0b21pemVyKG9ialZhbHVlLHNyY1ZhbHVlLGtleSsiIixvYmplY3Qsc291cmNlLHN0YWNrKTp1bmRlZmluZWQ7dmFyIGlzQ29tbW9uPW5ld1ZhbHVlPT09dW5kZWZpbmVkO2lmKGlzQ29tbW9uKXt2YXIgaXNBcnI9aXNBcnJheShzcmNWYWx1ZSksaXNCdWZmPSFpc0FyciYmaXNCdWZmZXIoc3JjVmFsdWUpLGlzVHlwZWQ9IWlzQXJyJiYhaXNCdWZmJiZpc1R5cGVkQXJyYXkoc3JjVmFsdWUpO25ld1ZhbHVlPXNyY1ZhbHVlO2lmKGlzQXJyfHxpc0J1ZmZ8fGlzVHlwZWQpaWYoaXNBcnJheShvYmpWYWx1ZSkpbmV3VmFsdWU9b2JqVmFsdWU7ZWxzZSBpZihpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpbmV3VmFsdWU9Y29weUFycmF5KG9ialZhbHVlKTtlbHNlIGlmKGlzQnVmZil7aXNDb21tb249CmZhbHNlO25ld1ZhbHVlPWNsb25lQnVmZmVyKHNyY1ZhbHVlLHRydWUpfWVsc2UgaWYoaXNUeXBlZCl7aXNDb21tb249ZmFsc2U7bmV3VmFsdWU9Y2xvbmVUeXBlZEFycmF5KHNyY1ZhbHVlLHRydWUpfWVsc2UgbmV3VmFsdWU9W107ZWxzZSBpZihpc1BsYWluT2JqZWN0KHNyY1ZhbHVlKXx8aXNBcmd1bWVudHMoc3JjVmFsdWUpKXtuZXdWYWx1ZT1vYmpWYWx1ZTtpZihpc0FyZ3VtZW50cyhvYmpWYWx1ZSkpbmV3VmFsdWU9dG9QbGFpbk9iamVjdChvYmpWYWx1ZSk7ZWxzZSBpZighaXNPYmplY3Qob2JqVmFsdWUpfHxzcmNJbmRleCYmaXNGdW5jdGlvbihvYmpWYWx1ZSkpbmV3VmFsdWU9aW5pdENsb25lT2JqZWN0KHNyY1ZhbHVlKX1lbHNlIGlzQ29tbW9uPWZhbHNlfWlmKGlzQ29tbW9uKXtzdGFjay5zZXQoc3JjVmFsdWUsbmV3VmFsdWUpO21lcmdlRnVuYyhuZXdWYWx1ZSxzcmNWYWx1ZSxzcmNJbmRleCxjdXN0b21pemVyLHN0YWNrKTtzdGFja1siZGVsZXRlIl0oc3JjVmFsdWUpfWFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LAprZXksbmV3VmFsdWUpfWZ1bmN0aW9uIGJhc2VOdGgoYXJyYXksbil7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm47bis9bjwwP2xlbmd0aDowO3JldHVybiBpc0luZGV4KG4sbGVuZ3RoKT9hcnJheVtuXTp1bmRlZmluZWR9ZnVuY3Rpb24gYmFzZU9yZGVyQnkoY29sbGVjdGlvbixpdGVyYXRlZXMsb3JkZXJzKXt2YXIgaW5kZXg9LTE7aXRlcmF0ZWVzPWFycmF5TWFwKGl0ZXJhdGVlcy5sZW5ndGg/aXRlcmF0ZWVzOltpZGVudGl0eV0sYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTt2YXIgcmVzdWx0PWJhc2VNYXAoY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxrZXksY29sbGVjdGlvbil7dmFyIGNyaXRlcmlhPWFycmF5TWFwKGl0ZXJhdGVlcyxmdW5jdGlvbihpdGVyYXRlZSl7cmV0dXJuIGl0ZXJhdGVlKHZhbHVlKX0pO3JldHVybnsiY3JpdGVyaWEiOmNyaXRlcmlhLCJpbmRleCI6KytpbmRleCwidmFsdWUiOnZhbHVlfX0pO3JldHVybiBiYXNlU29ydEJ5KHJlc3VsdCwKZnVuY3Rpb24ob2JqZWN0LG90aGVyKXtyZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCxvdGhlcixvcmRlcnMpfSl9ZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LHBhdGhzKXtyZXR1cm4gYmFzZVBpY2tCeShvYmplY3QscGF0aHMsZnVuY3Rpb24odmFsdWUscGF0aCl7cmV0dXJuIGhhc0luKG9iamVjdCxwYXRoKX0pfWZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LHBhdGhzLHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1wYXRocy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcGF0aD1wYXRoc1tpbmRleF0sdmFsdWU9YmFzZUdldChvYmplY3QscGF0aCk7aWYocHJlZGljYXRlKHZhbHVlLHBhdGgpKWJhc2VTZXQocmVzdWx0LGNhc3RQYXRoKHBhdGgsb2JqZWN0KSx2YWx1ZSl9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlR2V0KG9iamVjdCxwYXRoKX19CmZ1bmN0aW9uIGJhc2VQdWxsQWxsKGFycmF5LHZhbHVlcyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5kZXhPZj1jb21wYXJhdG9yP2Jhc2VJbmRleE9mV2l0aDpiYXNlSW5kZXhPZixpbmRleD0tMSxsZW5ndGg9dmFsdWVzLmxlbmd0aCxzZWVuPWFycmF5O2lmKGFycmF5PT09dmFsdWVzKXZhbHVlcz1jb3B5QXJyYXkodmFsdWVzKTtpZihpdGVyYXRlZSlzZWVuPWFycmF5TWFwKGFycmF5LGJhc2VVbmFyeShpdGVyYXRlZSkpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZnJvbUluZGV4PTAsdmFsdWU9dmFsdWVzW2luZGV4XSxjb21wdXRlZD1pdGVyYXRlZT9pdGVyYXRlZSh2YWx1ZSk6dmFsdWU7d2hpbGUoKGZyb21JbmRleD1pbmRleE9mKHNlZW4sY29tcHV0ZWQsZnJvbUluZGV4LGNvbXBhcmF0b3IpKT4tMSl7aWYoc2VlbiE9PWFycmF5KXNwbGljZS5jYWxsKHNlZW4sZnJvbUluZGV4LDEpO3NwbGljZS5jYWxsKGFycmF5LGZyb21JbmRleCwxKX19cmV0dXJuIGFycmF5fWZ1bmN0aW9uIGJhc2VQdWxsQXQoYXJyYXksCmluZGV4ZXMpe3ZhciBsZW5ndGg9YXJyYXk/aW5kZXhlcy5sZW5ndGg6MCxsYXN0SW5kZXg9bGVuZ3RoLTE7d2hpbGUobGVuZ3RoLS0pe3ZhciBpbmRleD1pbmRleGVzW2xlbmd0aF07aWYobGVuZ3RoPT1sYXN0SW5kZXh8fGluZGV4IT09cHJldmlvdXMpe3ZhciBwcmV2aW91cz1pbmRleDtpZihpc0luZGV4KGluZGV4KSlzcGxpY2UuY2FsbChhcnJheSxpbmRleCwxKTtlbHNlIGJhc2VVbnNldChhcnJheSxpbmRleCl9fXJldHVybiBhcnJheX1mdW5jdGlvbiBiYXNlUmFuZG9tKGxvd2VyLHVwcGVyKXtyZXR1cm4gbG93ZXIrbmF0aXZlRmxvb3IobmF0aXZlUmFuZG9tKCkqKHVwcGVyLWxvd2VyKzEpKX1mdW5jdGlvbiBiYXNlUmFuZ2Uoc3RhcnQsZW5kLHN0ZXAsZnJvbVJpZ2h0KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQtc3RhcnQpLyhzdGVwfHwxKSksMCkscmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUobGVuZ3RoLS0pe3Jlc3VsdFtmcm9tUmlnaHQ/Cmxlbmd0aDorK2luZGV4XT1zdGFydDtzdGFydCs9c3RlcH1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VSZXBlYXQoc3RyaW5nLG4pe3ZhciByZXN1bHQ9IiI7aWYoIXN0cmluZ3x8bjwxfHxuPk1BWF9TQUZFX0lOVEVHRVIpcmV0dXJuIHJlc3VsdDtkb3tpZihuJTIpcmVzdWx0Kz1zdHJpbmc7bj1uYXRpdmVGbG9vcihuLzIpO2lmKG4pc3RyaW5nKz1zdHJpbmd9d2hpbGUobik7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlUmVzdChmdW5jLHN0YXJ0KXtyZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYyxzdGFydCxpZGVudGl0eSksZnVuYysiIil9ZnVuY3Rpb24gYmFzZVNhbXBsZShjb2xsZWN0aW9uKXtyZXR1cm4gYXJyYXlTYW1wbGUodmFsdWVzKGNvbGxlY3Rpb24pKX1mdW5jdGlvbiBiYXNlU2FtcGxlU2l6ZShjb2xsZWN0aW9uLG4pe3ZhciBhcnJheT12YWx1ZXMoY29sbGVjdGlvbik7cmV0dXJuIHNodWZmbGVTZWxmKGFycmF5LGJhc2VDbGFtcChuLDAsYXJyYXkubGVuZ3RoKSl9CmZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LHBhdGgsdmFsdWUsY3VzdG9taXplcil7aWYoIWlzT2JqZWN0KG9iamVjdCkpcmV0dXJuIG9iamVjdDtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhdGgubGVuZ3RoLGxhc3RJbmRleD1sZW5ndGgtMSxuZXN0ZWQ9b2JqZWN0O3doaWxlKG5lc3RlZCE9bnVsbCYmKytpbmRleDxsZW5ndGgpe3ZhciBrZXk9dG9LZXkocGF0aFtpbmRleF0pLG5ld1ZhbHVlPXZhbHVlO2lmKGluZGV4IT1sYXN0SW5kZXgpe3ZhciBvYmpWYWx1ZT1uZXN0ZWRba2V5XTtuZXdWYWx1ZT1jdXN0b21pemVyP2N1c3RvbWl6ZXIob2JqVmFsdWUsa2V5LG5lc3RlZCk6dW5kZWZpbmVkO2lmKG5ld1ZhbHVlPT09dW5kZWZpbmVkKW5ld1ZhbHVlPWlzT2JqZWN0KG9ialZhbHVlKT9vYmpWYWx1ZTppc0luZGV4KHBhdGhbaW5kZXgrMV0pP1tdOnt9fWFzc2lnblZhbHVlKG5lc3RlZCxrZXksbmV3VmFsdWUpO25lc3RlZD1uZXN0ZWRba2V5XX1yZXR1cm4gb2JqZWN0fQp2YXIgYmFzZVNldERhdGE9IW1ldGFNYXA/aWRlbnRpdHk6ZnVuY3Rpb24oZnVuYyxkYXRhKXttZXRhTWFwLnNldChmdW5jLGRhdGEpO3JldHVybiBmdW5jfTt2YXIgYmFzZVNldFRvU3RyaW5nPSFkZWZpbmVQcm9wZXJ0eT9pZGVudGl0eTpmdW5jdGlvbihmdW5jLHN0cmluZyl7cmV0dXJuIGRlZmluZVByb3BlcnR5KGZ1bmMsInRvU3RyaW5nIix7ImNvbmZpZ3VyYWJsZSI6dHJ1ZSwiZW51bWVyYWJsZSI6ZmFsc2UsInZhbHVlIjpjb25zdGFudChzdHJpbmcpLCJ3cml0YWJsZSI6dHJ1ZX0pfTtmdW5jdGlvbiBiYXNlU2h1ZmZsZShjb2xsZWN0aW9uKXtyZXR1cm4gc2h1ZmZsZVNlbGYodmFsdWVzKGNvbGxlY3Rpb24pKX1mdW5jdGlvbiBiYXNlU2xpY2UoYXJyYXksc3RhcnQsZW5kKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDtpZihzdGFydDwwKXN0YXJ0PS1zdGFydD5sZW5ndGg/MDpsZW5ndGgrc3RhcnQ7ZW5kPWVuZD5sZW5ndGg/bGVuZ3RoOmVuZDtpZihlbmQ8MCllbmQrPQpsZW5ndGg7bGVuZ3RoPXN0YXJ0PmVuZD8wOmVuZC1zdGFydD4+PjA7c3RhcnQ+Pj49MDt2YXIgcmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0W2luZGV4XT1hcnJheVtpbmRleCtzdGFydF07cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlU29tZShjb2xsZWN0aW9uLHByZWRpY2F0ZSl7dmFyIHJlc3VsdDtiYXNlRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGluZGV4LGNvbGxlY3Rpb24pe3Jlc3VsdD1wcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbik7cmV0dXJuIXJlc3VsdH0pO3JldHVybiEhcmVzdWx0fWZ1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleChhcnJheSx2YWx1ZSxyZXRIaWdoZXN0KXt2YXIgbG93PTAsaGlnaD1hcnJheT09bnVsbD9sb3c6YXJyYXkubGVuZ3RoO2lmKHR5cGVvZiB2YWx1ZT09Im51bWJlciImJnZhbHVlPT09dmFsdWUmJmhpZ2g8PUhBTEZfTUFYX0FSUkFZX0xFTkdUSCl7d2hpbGUobG93PGhpZ2gpe3ZhciBtaWQ9CmxvdytoaWdoPj4+MSxjb21wdXRlZD1hcnJheVttaWRdO2lmKGNvbXB1dGVkIT09bnVsbCYmIWlzU3ltYm9sKGNvbXB1dGVkKSYmKHJldEhpZ2hlc3Q/Y29tcHV0ZWQ8PXZhbHVlOmNvbXB1dGVkPHZhbHVlKSlsb3c9bWlkKzE7ZWxzZSBoaWdoPW1pZH1yZXR1cm4gaGlnaH1yZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksdmFsdWUsaWRlbnRpdHkscmV0SGlnaGVzdCl9ZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksdmFsdWUsaXRlcmF0ZWUscmV0SGlnaGVzdCl7dmFsdWU9aXRlcmF0ZWUodmFsdWUpO3ZhciBsb3c9MCxoaWdoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoLHZhbElzTmFOPXZhbHVlIT09dmFsdWUsdmFsSXNOdWxsPXZhbHVlPT09bnVsbCx2YWxJc1N5bWJvbD1pc1N5bWJvbCh2YWx1ZSksdmFsSXNVbmRlZmluZWQ9dmFsdWU9PT11bmRlZmluZWQ7d2hpbGUobG93PGhpZ2gpe3ZhciBtaWQ9bmF0aXZlRmxvb3IoKGxvdytoaWdoKS8yKSxjb21wdXRlZD0KaXRlcmF0ZWUoYXJyYXlbbWlkXSksb3RoSXNEZWZpbmVkPWNvbXB1dGVkIT09dW5kZWZpbmVkLG90aElzTnVsbD1jb21wdXRlZD09PW51bGwsb3RoSXNSZWZsZXhpdmU9Y29tcHV0ZWQ9PT1jb21wdXRlZCxvdGhJc1N5bWJvbD1pc1N5bWJvbChjb21wdXRlZCk7aWYodmFsSXNOYU4pdmFyIHNldExvdz1yZXRIaWdoZXN0fHxvdGhJc1JlZmxleGl2ZTtlbHNlIGlmKHZhbElzVW5kZWZpbmVkKXNldExvdz1vdGhJc1JlZmxleGl2ZSYmKHJldEhpZ2hlc3R8fG90aElzRGVmaW5lZCk7ZWxzZSBpZih2YWxJc051bGwpc2V0TG93PW90aElzUmVmbGV4aXZlJiZvdGhJc0RlZmluZWQmJihyZXRIaWdoZXN0fHwhb3RoSXNOdWxsKTtlbHNlIGlmKHZhbElzU3ltYm9sKXNldExvdz1vdGhJc1JlZmxleGl2ZSYmb3RoSXNEZWZpbmVkJiYhb3RoSXNOdWxsJiYocmV0SGlnaGVzdHx8IW90aElzU3ltYm9sKTtlbHNlIGlmKG90aElzTnVsbHx8b3RoSXNTeW1ib2wpc2V0TG93PWZhbHNlO2Vsc2Ugc2V0TG93PQpyZXRIaWdoZXN0P2NvbXB1dGVkPD12YWx1ZTpjb21wdXRlZDx2YWx1ZTtpZihzZXRMb3cpbG93PW1pZCsxO2Vsc2UgaGlnaD1taWR9cmV0dXJuIG5hdGl2ZU1pbihoaWdoLE1BWF9BUlJBWV9JTkRFWCl9ZnVuY3Rpb24gYmFzZVNvcnRlZFVuaXEoYXJyYXksaXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoLHJlc0luZGV4PTAscmVzdWx0PVtdO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlP2l0ZXJhdGVlKHZhbHVlKTp2YWx1ZTtpZighaW5kZXh8fCFlcShjb21wdXRlZCxzZWVuKSl7dmFyIHNlZW49Y29tcHV0ZWQ7cmVzdWx0W3Jlc0luZGV4KytdPXZhbHVlPT09MD8wOnZhbHVlfX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VUb051bWJlcih2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT0ibnVtYmVyIilyZXR1cm4gdmFsdWU7aWYoaXNTeW1ib2wodmFsdWUpKXJldHVybiBOQU47cmV0dXJuK3ZhbHVlfQpmdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09InN0cmluZyIpcmV0dXJuIHZhbHVlO2lmKGlzQXJyYXkodmFsdWUpKXJldHVybiBhcnJheU1hcCh2YWx1ZSxiYXNlVG9TdHJpbmcpKyIiO2lmKGlzU3ltYm9sKHZhbHVlKSlyZXR1cm4gc3ltYm9sVG9TdHJpbmc/c3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSk6IiI7dmFyIHJlc3VsdD12YWx1ZSsiIjtyZXR1cm4gcmVzdWx0PT0iMCImJjEvdmFsdWU9PS1JTkZJTklUWT8iLTAiOnJlc3VsdH1mdW5jdGlvbiBiYXNlVW5pcShhcnJheSxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5kZXg9LTEsaW5jbHVkZXM9YXJyYXlJbmNsdWRlcyxsZW5ndGg9YXJyYXkubGVuZ3RoLGlzQ29tbW9uPXRydWUscmVzdWx0PVtdLHNlZW49cmVzdWx0O2lmKGNvbXBhcmF0b3Ipe2lzQ29tbW9uPWZhbHNlO2luY2x1ZGVzPWFycmF5SW5jbHVkZXNXaXRofWVsc2UgaWYobGVuZ3RoPj1MQVJHRV9BUlJBWV9TSVpFKXt2YXIgc2V0PQppdGVyYXRlZT9udWxsOmNyZWF0ZVNldChhcnJheSk7aWYoc2V0KXJldHVybiBzZXRUb0FycmF5KHNldCk7aXNDb21tb249ZmFsc2U7aW5jbHVkZXM9Y2FjaGVIYXM7c2Vlbj1uZXcgU2V0Q2FjaGV9ZWxzZSBzZWVuPWl0ZXJhdGVlP1tdOnJlc3VsdDtvdXRlcjp3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XSxjb21wdXRlZD1pdGVyYXRlZT9pdGVyYXRlZSh2YWx1ZSk6dmFsdWU7dmFsdWU9Y29tcGFyYXRvcnx8dmFsdWUhPT0wP3ZhbHVlOjA7aWYoaXNDb21tb24mJmNvbXB1dGVkPT09Y29tcHV0ZWQpe3ZhciBzZWVuSW5kZXg9c2Vlbi5sZW5ndGg7d2hpbGUoc2VlbkluZGV4LS0paWYoc2VlbltzZWVuSW5kZXhdPT09Y29tcHV0ZWQpY29udGludWUgb3V0ZXI7aWYoaXRlcmF0ZWUpc2Vlbi5wdXNoKGNvbXB1dGVkKTtyZXN1bHQucHVzaCh2YWx1ZSl9ZWxzZSBpZighaW5jbHVkZXMoc2Vlbixjb21wdXRlZCxjb21wYXJhdG9yKSl7aWYoc2VlbiE9PXJlc3VsdClzZWVuLnB1c2goY29tcHV0ZWQpOwpyZXN1bHQucHVzaCh2YWx1ZSl9fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVVuc2V0KG9iamVjdCxwYXRoKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTtvYmplY3Q9cGFyZW50KG9iamVjdCxwYXRoKTtyZXR1cm4gb2JqZWN0PT1udWxsfHxkZWxldGUgb2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXX1mdW5jdGlvbiBiYXNlVXBkYXRlKG9iamVjdCxwYXRoLHVwZGF0ZXIsY3VzdG9taXplcil7cmV0dXJuIGJhc2VTZXQob2JqZWN0LHBhdGgsdXBkYXRlcihiYXNlR2V0KG9iamVjdCxwYXRoKSksY3VzdG9taXplcil9ZnVuY3Rpb24gYmFzZVdoaWxlKGFycmF5LHByZWRpY2F0ZSxpc0Ryb3AsZnJvbVJpZ2h0KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxpbmRleD1mcm9tUmlnaHQ/bGVuZ3RoOi0xO3doaWxlKChmcm9tUmlnaHQ/aW5kZXgtLTorK2luZGV4PGxlbmd0aCkmJnByZWRpY2F0ZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpKTtyZXR1cm4gaXNEcm9wP2Jhc2VTbGljZShhcnJheSwKZnJvbVJpZ2h0PzA6aW5kZXgsZnJvbVJpZ2h0P2luZGV4KzE6bGVuZ3RoKTpiYXNlU2xpY2UoYXJyYXksZnJvbVJpZ2h0P2luZGV4KzE6MCxmcm9tUmlnaHQ/bGVuZ3RoOmluZGV4KX1mdW5jdGlvbiBiYXNlV3JhcHBlclZhbHVlKHZhbHVlLGFjdGlvbnMpe3ZhciByZXN1bHQ9dmFsdWU7aWYocmVzdWx0IGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpcmVzdWx0PXJlc3VsdC52YWx1ZSgpO3JldHVybiBhcnJheVJlZHVjZShhY3Rpb25zLGZ1bmN0aW9uKHJlc3VsdCxhY3Rpb24pe3JldHVybiBhY3Rpb24uZnVuYy5hcHBseShhY3Rpb24udGhpc0FyZyxhcnJheVB1c2goW3Jlc3VsdF0sYWN0aW9uLmFyZ3MpKX0scmVzdWx0KX1mdW5jdGlvbiBiYXNlWG9yKGFycmF5cyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgbGVuZ3RoPWFycmF5cy5sZW5ndGg7aWYobGVuZ3RoPDIpcmV0dXJuIGxlbmd0aD9iYXNlVW5pcShhcnJheXNbMF0pOltdO3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobGVuZ3RoKTsKd2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBhcnJheT1hcnJheXNbaW5kZXhdLG90aEluZGV4PS0xO3doaWxlKCsrb3RoSW5kZXg8bGVuZ3RoKWlmKG90aEluZGV4IT1pbmRleClyZXN1bHRbaW5kZXhdPWJhc2VEaWZmZXJlbmNlKHJlc3VsdFtpbmRleF18fGFycmF5LGFycmF5c1tvdGhJbmRleF0saXRlcmF0ZWUsY29tcGFyYXRvcil9cmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKHJlc3VsdCwxKSxpdGVyYXRlZSxjb21wYXJhdG9yKX1mdW5jdGlvbiBiYXNlWmlwT2JqZWN0KHByb3BzLHZhbHVlcyxhc3NpZ25GdW5jKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXByb3BzLmxlbmd0aCx2YWxzTGVuZ3RoPXZhbHVlcy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9aW5kZXg8dmFsc0xlbmd0aD92YWx1ZXNbaW5kZXhdOnVuZGVmaW5lZDthc3NpZ25GdW5jKHJlc3VsdCxwcm9wc1tpbmRleF0sdmFsdWUpfXJldHVybiByZXN1bHR9ZnVuY3Rpb24gY2FzdEFycmF5TGlrZU9iamVjdCh2YWx1ZSl7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKT8KdmFsdWU6W119ZnVuY3Rpb24gY2FzdEZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0iZnVuY3Rpb24iP3ZhbHVlOmlkZW50aXR5fWZ1bmN0aW9uIGNhc3RQYXRoKHZhbHVlLG9iamVjdCl7aWYoaXNBcnJheSh2YWx1ZSkpcmV0dXJuIHZhbHVlO3JldHVybiBpc0tleSh2YWx1ZSxvYmplY3QpP1t2YWx1ZV06c3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSl9dmFyIGNhc3RSZXN0PWJhc2VSZXN0O2Z1bmN0aW9uIGNhc3RTbGljZShhcnJheSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO2VuZD1lbmQ9PT11bmRlZmluZWQ/bGVuZ3RoOmVuZDtyZXR1cm4hc3RhcnQmJmVuZD49bGVuZ3RoP2FycmF5OmJhc2VTbGljZShhcnJheSxzdGFydCxlbmQpfXZhciBjbGVhclRpbWVvdXQ9Y3R4Q2xlYXJUaW1lb3V0fHxmdW5jdGlvbihpZCl7cmV0dXJuIHJvb3QuY2xlYXJUaW1lb3V0KGlkKX07ZnVuY3Rpb24gY2xvbmVCdWZmZXIoYnVmZmVyLGlzRGVlcCl7aWYoaXNEZWVwKXJldHVybiBidWZmZXIuc2xpY2UoKTsKdmFyIGxlbmd0aD1idWZmZXIubGVuZ3RoLHJlc3VsdD1hbGxvY1Vuc2FmZT9hbGxvY1Vuc2FmZShsZW5ndGgpOm5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTtidWZmZXIuY29weShyZXN1bHQpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcil7dmFyIHJlc3VsdD1uZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7KG5ldyBVaW50OEFycmF5KHJlc3VsdCkpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldyxpc0RlZXApe3ZhciBidWZmZXI9aXNEZWVwP2Nsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKTpkYXRhVmlldy5idWZmZXI7cmV0dXJuIG5ldyBkYXRhVmlldy5jb25zdHJ1Y3RvcihidWZmZXIsZGF0YVZpZXcuYnl0ZU9mZnNldCxkYXRhVmlldy5ieXRlTGVuZ3RoKX1mdW5jdGlvbiBjbG9uZVJlZ0V4cChyZWdleHApe3ZhciByZXN1bHQ9Cm5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSxyZUZsYWdzLmV4ZWMocmVnZXhwKSk7cmVzdWx0Lmxhc3RJbmRleD1yZWdleHAubGFzdEluZGV4O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKXtyZXR1cm4gc3ltYm9sVmFsdWVPZj9PYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpOnt9fWZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LGlzRGVlcCl7dmFyIGJ1ZmZlcj1pc0RlZXA/Y2xvbmVBcnJheUJ1ZmZlcih0eXBlZEFycmF5LmJ1ZmZlcik6dHlwZWRBcnJheS5idWZmZXI7cmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlcix0eXBlZEFycmF5LmJ5dGVPZmZzZXQsdHlwZWRBcnJheS5sZW5ndGgpfWZ1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcodmFsdWUsb3RoZXIpe2lmKHZhbHVlIT09b3RoZXIpe3ZhciB2YWxJc0RlZmluZWQ9dmFsdWUhPT11bmRlZmluZWQsdmFsSXNOdWxsPXZhbHVlPT09Cm51bGwsdmFsSXNSZWZsZXhpdmU9dmFsdWU9PT12YWx1ZSx2YWxJc1N5bWJvbD1pc1N5bWJvbCh2YWx1ZSk7dmFyIG90aElzRGVmaW5lZD1vdGhlciE9PXVuZGVmaW5lZCxvdGhJc051bGw9b3RoZXI9PT1udWxsLG90aElzUmVmbGV4aXZlPW90aGVyPT09b3RoZXIsb3RoSXNTeW1ib2w9aXNTeW1ib2wob3RoZXIpO2lmKCFvdGhJc051bGwmJiFvdGhJc1N5bWJvbCYmIXZhbElzU3ltYm9sJiZ2YWx1ZT5vdGhlcnx8dmFsSXNTeW1ib2wmJm90aElzRGVmaW5lZCYmb3RoSXNSZWZsZXhpdmUmJiFvdGhJc051bGwmJiFvdGhJc1N5bWJvbHx8dmFsSXNOdWxsJiZvdGhJc0RlZmluZWQmJm90aElzUmVmbGV4aXZlfHwhdmFsSXNEZWZpbmVkJiZvdGhJc1JlZmxleGl2ZXx8IXZhbElzUmVmbGV4aXZlKXJldHVybiAxO2lmKCF2YWxJc051bGwmJiF2YWxJc1N5bWJvbCYmIW90aElzU3ltYm9sJiZ2YWx1ZTxvdGhlcnx8b3RoSXNTeW1ib2wmJnZhbElzRGVmaW5lZCYmdmFsSXNSZWZsZXhpdmUmJiF2YWxJc051bGwmJgohdmFsSXNTeW1ib2x8fG90aElzTnVsbCYmdmFsSXNEZWZpbmVkJiZ2YWxJc1JlZmxleGl2ZXx8IW90aElzRGVmaW5lZCYmdmFsSXNSZWZsZXhpdmV8fCFvdGhJc1JlZmxleGl2ZSlyZXR1cm4tMX1yZXR1cm4gMH1mdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LG90aGVyLG9yZGVycyl7dmFyIGluZGV4PS0xLG9iakNyaXRlcmlhPW9iamVjdC5jcml0ZXJpYSxvdGhDcml0ZXJpYT1vdGhlci5jcml0ZXJpYSxsZW5ndGg9b2JqQ3JpdGVyaWEubGVuZ3RoLG9yZGVyc0xlbmd0aD1vcmRlcnMubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcmVzdWx0PWNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLG90aENyaXRlcmlhW2luZGV4XSk7aWYocmVzdWx0KXtpZihpbmRleD49b3JkZXJzTGVuZ3RoKXJldHVybiByZXN1bHQ7dmFyIG9yZGVyPW9yZGVyc1tpbmRleF07cmV0dXJuIHJlc3VsdCoob3JkZXI9PSJkZXNjIj8tMToxKX19cmV0dXJuIG9iamVjdC5pbmRleC0Kb3RoZXIuaW5kZXh9ZnVuY3Rpb24gY29tcG9zZUFyZ3MoYXJncyxwYXJ0aWFscyxob2xkZXJzLGlzQ3VycmllZCl7dmFyIGFyZ3NJbmRleD0tMSxhcmdzTGVuZ3RoPWFyZ3MubGVuZ3RoLGhvbGRlcnNMZW5ndGg9aG9sZGVycy5sZW5ndGgsbGVmdEluZGV4PS0xLGxlZnRMZW5ndGg9cGFydGlhbHMubGVuZ3RoLHJhbmdlTGVuZ3RoPW5hdGl2ZU1heChhcmdzTGVuZ3RoLWhvbGRlcnNMZW5ndGgsMCkscmVzdWx0PUFycmF5KGxlZnRMZW5ndGgrcmFuZ2VMZW5ndGgpLGlzVW5jdXJyaWVkPSFpc0N1cnJpZWQ7d2hpbGUoKytsZWZ0SW5kZXg8bGVmdExlbmd0aClyZXN1bHRbbGVmdEluZGV4XT1wYXJ0aWFsc1tsZWZ0SW5kZXhdO3doaWxlKCsrYXJnc0luZGV4PGhvbGRlcnNMZW5ndGgpaWYoaXNVbmN1cnJpZWR8fGFyZ3NJbmRleDxhcmdzTGVuZ3RoKXJlc3VsdFtob2xkZXJzW2FyZ3NJbmRleF1dPWFyZ3NbYXJnc0luZGV4XTt3aGlsZShyYW5nZUxlbmd0aC0tKXJlc3VsdFtsZWZ0SW5kZXgrK109CmFyZ3NbYXJnc0luZGV4KytdO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY29tcG9zZUFyZ3NSaWdodChhcmdzLHBhcnRpYWxzLGhvbGRlcnMsaXNDdXJyaWVkKXt2YXIgYXJnc0luZGV4PS0xLGFyZ3NMZW5ndGg9YXJncy5sZW5ndGgsaG9sZGVyc0luZGV4PS0xLGhvbGRlcnNMZW5ndGg9aG9sZGVycy5sZW5ndGgscmlnaHRJbmRleD0tMSxyaWdodExlbmd0aD1wYXJ0aWFscy5sZW5ndGgscmFuZ2VMZW5ndGg9bmF0aXZlTWF4KGFyZ3NMZW5ndGgtaG9sZGVyc0xlbmd0aCwwKSxyZXN1bHQ9QXJyYXkocmFuZ2VMZW5ndGgrcmlnaHRMZW5ndGgpLGlzVW5jdXJyaWVkPSFpc0N1cnJpZWQ7d2hpbGUoKythcmdzSW5kZXg8cmFuZ2VMZW5ndGgpcmVzdWx0W2FyZ3NJbmRleF09YXJnc1thcmdzSW5kZXhdO3ZhciBvZmZzZXQ9YXJnc0luZGV4O3doaWxlKCsrcmlnaHRJbmRleDxyaWdodExlbmd0aClyZXN1bHRbb2Zmc2V0K3JpZ2h0SW5kZXhdPXBhcnRpYWxzW3JpZ2h0SW5kZXhdO3doaWxlKCsraG9sZGVyc0luZGV4PApob2xkZXJzTGVuZ3RoKWlmKGlzVW5jdXJyaWVkfHxhcmdzSW5kZXg8YXJnc0xlbmd0aClyZXN1bHRbb2Zmc2V0K2hvbGRlcnNbaG9sZGVyc0luZGV4XV09YXJnc1thcmdzSW5kZXgrK107cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLGFycmF5KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXNvdXJjZS5sZW5ndGg7YXJyYXl8fChhcnJheT1BcnJheShsZW5ndGgpKTt3aGlsZSgrK2luZGV4PGxlbmd0aClhcnJheVtpbmRleF09c291cmNlW2luZGV4XTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UscHJvcHMsb2JqZWN0LGN1c3RvbWl6ZXIpe3ZhciBpc05ldz0hb2JqZWN0O29iamVjdHx8KG9iamVjdD17fSk7dmFyIGluZGV4PS0xLGxlbmd0aD1wcm9wcy5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBrZXk9cHJvcHNbaW5kZXhdO3ZhciBuZXdWYWx1ZT1jdXN0b21pemVyP2N1c3RvbWl6ZXIob2JqZWN0W2tleV0sc291cmNlW2tleV0sCmtleSxvYmplY3Qsc291cmNlKTp1bmRlZmluZWQ7aWYobmV3VmFsdWU9PT11bmRlZmluZWQpbmV3VmFsdWU9c291cmNlW2tleV07aWYoaXNOZXcpYmFzZUFzc2lnblZhbHVlKG9iamVjdCxrZXksbmV3VmFsdWUpO2Vsc2UgYXNzaWduVmFsdWUob2JqZWN0LGtleSxuZXdWYWx1ZSl9cmV0dXJuIG9iamVjdH1mdW5jdGlvbiBjb3B5U3ltYm9scyhzb3VyY2Usb2JqZWN0KXtyZXR1cm4gY29weU9iamVjdChzb3VyY2UsZ2V0U3ltYm9scyhzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gY29weVN5bWJvbHNJbihzb3VyY2Usb2JqZWN0KXtyZXR1cm4gY29weU9iamVjdChzb3VyY2UsZ2V0U3ltYm9sc0luKHNvdXJjZSksb2JqZWN0KX1mdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlcixpbml0aWFsaXplcil7cmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlBZ2dyZWdhdG9yOmJhc2VBZ2dyZWdhdG9yLGFjY3VtdWxhdG9yPQppbml0aWFsaXplcj9pbml0aWFsaXplcigpOnt9O3JldHVybiBmdW5jKGNvbGxlY3Rpb24sc2V0dGVyLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpLGFjY3VtdWxhdG9yKX19ZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpe3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihvYmplY3Qsc291cmNlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1zb3VyY2VzLmxlbmd0aCxjdXN0b21pemVyPWxlbmd0aD4xP3NvdXJjZXNbbGVuZ3RoLTFdOnVuZGVmaW5lZCxndWFyZD1sZW5ndGg+Mj9zb3VyY2VzWzJdOnVuZGVmaW5lZDtjdXN0b21pemVyPWFzc2lnbmVyLmxlbmd0aD4zJiZ0eXBlb2YgY3VzdG9taXplcj09ImZ1bmN0aW9uIj8obGVuZ3RoLS0sY3VzdG9taXplcik6dW5kZWZpbmVkO2lmKGd1YXJkJiZpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLHNvdXJjZXNbMV0sZ3VhcmQpKXtjdXN0b21pemVyPWxlbmd0aDwzP3VuZGVmaW5lZDpjdXN0b21pemVyO2xlbmd0aD0xfW9iamVjdD1PYmplY3Qob2JqZWN0KTsKd2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBzb3VyY2U9c291cmNlc1tpbmRleF07aWYoc291cmNlKWFzc2lnbmVyKG9iamVjdCxzb3VyY2UsaW5kZXgsY3VzdG9taXplcil9cmV0dXJuIG9iamVjdH0pfWZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLGZyb21SaWdodCl7cmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24saXRlcmF0ZWUpe2lmKGNvbGxlY3Rpb249PW51bGwpcmV0dXJuIGNvbGxlY3Rpb247aWYoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKXJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLGl0ZXJhdGVlKTt2YXIgbGVuZ3RoPWNvbGxlY3Rpb24ubGVuZ3RoLGluZGV4PWZyb21SaWdodD9sZW5ndGg6LTEsaXRlcmFibGU9T2JqZWN0KGNvbGxlY3Rpb24pO3doaWxlKGZyb21SaWdodD9pbmRleC0tOisraW5kZXg8bGVuZ3RoKWlmKGl0ZXJhdGVlKGl0ZXJhYmxlW2luZGV4XSxpbmRleCxpdGVyYWJsZSk9PT1mYWxzZSlicmVhaztyZXR1cm4gY29sbGVjdGlvbn19ZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpe3JldHVybiBmdW5jdGlvbihvYmplY3QsCml0ZXJhdGVlLGtleXNGdW5jKXt2YXIgaW5kZXg9LTEsaXRlcmFibGU9T2JqZWN0KG9iamVjdCkscHJvcHM9a2V5c0Z1bmMob2JqZWN0KSxsZW5ndGg9cHJvcHMubGVuZ3RoO3doaWxlKGxlbmd0aC0tKXt2YXIga2V5PXByb3BzW2Zyb21SaWdodD9sZW5ndGg6KytpbmRleF07aWYoaXRlcmF0ZWUoaXRlcmFibGVba2V5XSxrZXksaXRlcmFibGUpPT09ZmFsc2UpYnJlYWt9cmV0dXJuIG9iamVjdH19ZnVuY3Rpb24gY3JlYXRlQmluZChmdW5jLGJpdG1hc2ssdGhpc0FyZyl7dmFyIGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGZuPXRoaXMmJnRoaXMhPT1yb290JiZ0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcj9DdG9yOmZ1bmM7cmV0dXJuIGZuLmFwcGx5KGlzQmluZD90aGlzQXJnOnRoaXMsYXJndW1lbnRzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSl7cmV0dXJuIGZ1bmN0aW9uKHN0cmluZyl7c3RyaW5nPQp0b1N0cmluZyhzdHJpbmcpO3ZhciBzdHJTeW1ib2xzPWhhc1VuaWNvZGUoc3RyaW5nKT9zdHJpbmdUb0FycmF5KHN0cmluZyk6dW5kZWZpbmVkO3ZhciBjaHI9c3RyU3ltYm9scz9zdHJTeW1ib2xzWzBdOnN0cmluZy5jaGFyQXQoMCk7dmFyIHRyYWlsaW5nPXN0clN5bWJvbHM/Y2FzdFNsaWNlKHN0clN5bWJvbHMsMSkuam9pbigiIik6c3RyaW5nLnNsaWNlKDEpO3JldHVybiBjaHJbbWV0aG9kTmFtZV0oKSt0cmFpbGluZ319ZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjayl7cmV0dXJuIGZ1bmN0aW9uKHN0cmluZyl7cmV0dXJuIGFycmF5UmVkdWNlKHdvcmRzKGRlYnVycihzdHJpbmcpLnJlcGxhY2UocmVBcG9zLCIiKSksY2FsbGJhY2ssIiIpfX1mdW5jdGlvbiBjcmVhdGVDdG9yKEN0b3Ipe3JldHVybiBmdW5jdGlvbigpe3ZhciBhcmdzPWFyZ3VtZW50cztzd2l0Y2goYXJncy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IEN0b3I7Y2FzZSAxOnJldHVybiBuZXcgQ3RvcihhcmdzWzBdKTsKY2FzZSAyOnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0pO2Nhc2UgMzpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0pO2Nhc2UgNDpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSk7Y2FzZSA1OnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0pO2Nhc2UgNjpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0pO2Nhc2UgNzpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSl9dmFyIHRoaXNCaW5kaW5nPWJhc2VDcmVhdGUoQ3Rvci5wcm90b3R5cGUpLHJlc3VsdD1DdG9yLmFwcGx5KHRoaXNCaW5kaW5nLGFyZ3MpO3JldHVybiBpc09iamVjdChyZXN1bHQpP3Jlc3VsdDp0aGlzQmluZGluZ319ZnVuY3Rpb24gY3JlYXRlQ3VycnkoZnVuYywKYml0bWFzayxhcml0eSl7dmFyIEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGxlbmd0aD1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkobGVuZ3RoKSxpbmRleD1sZW5ndGgscGxhY2Vob2xkZXI9Z2V0SG9sZGVyKHdyYXBwZXIpO3doaWxlKGluZGV4LS0pYXJnc1tpbmRleF09YXJndW1lbnRzW2luZGV4XTt2YXIgaG9sZGVycz1sZW5ndGg8MyYmYXJnc1swXSE9PXBsYWNlaG9sZGVyJiZhcmdzW2xlbmd0aC0xXSE9PXBsYWNlaG9sZGVyP1tdOnJlcGxhY2VIb2xkZXJzKGFyZ3MscGxhY2Vob2xkZXIpO2xlbmd0aC09aG9sZGVycy5sZW5ndGg7aWYobGVuZ3RoPGFyaXR5KXJldHVybiBjcmVhdGVSZWN1cnJ5KGZ1bmMsYml0bWFzayxjcmVhdGVIeWJyaWQsd3JhcHBlci5wbGFjZWhvbGRlcix1bmRlZmluZWQsYXJncyxob2xkZXJzLHVuZGVmaW5lZCx1bmRlZmluZWQsYXJpdHktbGVuZ3RoKTt2YXIgZm49dGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZgp3cmFwcGVyP0N0b3I6ZnVuYztyZXR1cm4gYXBwbHkoZm4sdGhpcyxhcmdzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVGaW5kKGZpbmRJbmRleEZ1bmMpe3JldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLHByZWRpY2F0ZSxmcm9tSW5kZXgpe3ZhciBpdGVyYWJsZT1PYmplY3QoY29sbGVjdGlvbik7aWYoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKXt2YXIgaXRlcmF0ZWU9Z2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpO2NvbGxlY3Rpb249a2V5cyhjb2xsZWN0aW9uKTtwcmVkaWNhdGU9ZnVuY3Rpb24oa2V5KXtyZXR1cm4gaXRlcmF0ZWUoaXRlcmFibGVba2V5XSxrZXksaXRlcmFibGUpfX12YXIgaW5kZXg9ZmluZEluZGV4RnVuYyhjb2xsZWN0aW9uLHByZWRpY2F0ZSxmcm9tSW5kZXgpO3JldHVybiBpbmRleD4tMT9pdGVyYWJsZVtpdGVyYXRlZT9jb2xsZWN0aW9uW2luZGV4XTppbmRleF06dW5kZWZpbmVkfX1mdW5jdGlvbiBjcmVhdGVGbG93KGZyb21SaWdodCl7cmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmNzKXt2YXIgbGVuZ3RoPQpmdW5jcy5sZW5ndGgsaW5kZXg9bGVuZ3RoLHByZXJlcT1Mb2Rhc2hXcmFwcGVyLnByb3RvdHlwZS50aHJ1O2lmKGZyb21SaWdodClmdW5jcy5yZXZlcnNlKCk7d2hpbGUoaW5kZXgtLSl7dmFyIGZ1bmM9ZnVuY3NbaW5kZXhdO2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtpZihwcmVyZXEmJiF3cmFwcGVyJiZnZXRGdW5jTmFtZShmdW5jKT09IndyYXBwZXIiKXZhciB3cmFwcGVyPW5ldyBMb2Rhc2hXcmFwcGVyKFtdLHRydWUpfWluZGV4PXdyYXBwZXI/aW5kZXg6bGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXtmdW5jPWZ1bmNzW2luZGV4XTt2YXIgZnVuY05hbWU9Z2V0RnVuY05hbWUoZnVuYyksZGF0YT1mdW5jTmFtZT09IndyYXBwZXIiP2dldERhdGEoZnVuYyk6dW5kZWZpbmVkO2lmKGRhdGEmJmlzTGF6aWFibGUoZGF0YVswXSkmJmRhdGFbMV09PShXUkFQX0FSWV9GTEFHfFdSQVBfQ1VSUllfRkxBR3xXUkFQX1BBUlRJQUxfRkxBR3wKV1JBUF9SRUFSR19GTEFHKSYmIWRhdGFbNF0ubGVuZ3RoJiZkYXRhWzldPT0xKXdyYXBwZXI9d3JhcHBlcltnZXRGdW5jTmFtZShkYXRhWzBdKV0uYXBwbHkod3JhcHBlcixkYXRhWzNdKTtlbHNlIHdyYXBwZXI9ZnVuYy5sZW5ndGg9PTEmJmlzTGF6aWFibGUoZnVuYyk/d3JhcHBlcltmdW5jTmFtZV0oKTp3cmFwcGVyLnRocnUoZnVuYyl9cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGFyZ3M9YXJndW1lbnRzLHZhbHVlPWFyZ3NbMF07aWYod3JhcHBlciYmYXJncy5sZW5ndGg9PTEmJmlzQXJyYXkodmFsdWUpKXJldHVybiB3cmFwcGVyLnBsYW50KHZhbHVlKS52YWx1ZSgpO3ZhciBpbmRleD0wLHJlc3VsdD1sZW5ndGg/ZnVuY3NbaW5kZXhdLmFwcGx5KHRoaXMsYXJncyk6dmFsdWU7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0PWZ1bmNzW2luZGV4XS5jYWxsKHRoaXMscmVzdWx0KTtyZXR1cm4gcmVzdWx0fX0pfWZ1bmN0aW9uIGNyZWF0ZUh5YnJpZChmdW5jLGJpdG1hc2ssdGhpc0FyZywKcGFydGlhbHMsaG9sZGVycyxwYXJ0aWFsc1JpZ2h0LGhvbGRlcnNSaWdodCxhcmdQb3MsYXJ5LGFyaXR5KXt2YXIgaXNBcnk9Yml0bWFzayZXUkFQX0FSWV9GTEFHLGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLGlzQmluZEtleT1iaXRtYXNrJldSQVBfQklORF9LRVlfRkxBRyxpc0N1cnJpZWQ9Yml0bWFzayYoV1JBUF9DVVJSWV9GTEFHfFdSQVBfQ1VSUllfUklHSFRfRkxBRyksaXNGbGlwPWJpdG1hc2smV1JBUF9GTElQX0ZMQUcsQ3Rvcj1pc0JpbmRLZXk/dW5kZWZpbmVkOmNyZWF0ZUN0b3IoZnVuYyk7ZnVuY3Rpb24gd3JhcHBlcigpe3ZhciBsZW5ndGg9YXJndW1lbnRzLmxlbmd0aCxhcmdzPUFycmF5KGxlbmd0aCksaW5kZXg9bGVuZ3RoO3doaWxlKGluZGV4LS0pYXJnc1tpbmRleF09YXJndW1lbnRzW2luZGV4XTtpZihpc0N1cnJpZWQpdmFyIHBsYWNlaG9sZGVyPWdldEhvbGRlcih3cmFwcGVyKSxob2xkZXJzQ291bnQ9Y291bnRIb2xkZXJzKGFyZ3MscGxhY2Vob2xkZXIpOwppZihwYXJ0aWFscylhcmdzPWNvbXBvc2VBcmdzKGFyZ3MscGFydGlhbHMsaG9sZGVycyxpc0N1cnJpZWQpO2lmKHBhcnRpYWxzUmlnaHQpYXJncz1jb21wb3NlQXJnc1JpZ2h0KGFyZ3MscGFydGlhbHNSaWdodCxob2xkZXJzUmlnaHQsaXNDdXJyaWVkKTtsZW5ndGgtPWhvbGRlcnNDb3VudDtpZihpc0N1cnJpZWQmJmxlbmd0aDxhcml0eSl7dmFyIG5ld0hvbGRlcnM9cmVwbGFjZUhvbGRlcnMoYXJncyxwbGFjZWhvbGRlcik7cmV0dXJuIGNyZWF0ZVJlY3VycnkoZnVuYyxiaXRtYXNrLGNyZWF0ZUh5YnJpZCx3cmFwcGVyLnBsYWNlaG9sZGVyLHRoaXNBcmcsYXJncyxuZXdIb2xkZXJzLGFyZ1BvcyxhcnksYXJpdHktbGVuZ3RoKX12YXIgdGhpc0JpbmRpbmc9aXNCaW5kP3RoaXNBcmc6dGhpcyxmbj1pc0JpbmRLZXk/dGhpc0JpbmRpbmdbZnVuY106ZnVuYztsZW5ndGg9YXJncy5sZW5ndGg7aWYoYXJnUG9zKWFyZ3M9cmVvcmRlcihhcmdzLGFyZ1Bvcyk7ZWxzZSBpZihpc0ZsaXAmJmxlbmd0aD4KMSlhcmdzLnJldmVyc2UoKTtpZihpc0FyeSYmYXJ5PGxlbmd0aClhcmdzLmxlbmd0aD1hcnk7aWYodGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKWZuPUN0b3J8fGNyZWF0ZUN0b3IoZm4pO3JldHVybiBmbi5hcHBseSh0aGlzQmluZGluZyxhcmdzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVJbnZlcnRlcihzZXR0ZXIsdG9JdGVyYXRlZSl7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIGJhc2VJbnZlcnRlcihvYmplY3Qsc2V0dGVyLHRvSXRlcmF0ZWUoaXRlcmF0ZWUpLHt9KX19ZnVuY3Rpb24gY3JlYXRlTWF0aE9wZXJhdGlvbihvcGVyYXRvcixkZWZhdWx0VmFsdWUpe3JldHVybiBmdW5jdGlvbih2YWx1ZSxvdGhlcil7dmFyIHJlc3VsdDtpZih2YWx1ZT09PXVuZGVmaW5lZCYmb3RoZXI9PT11bmRlZmluZWQpcmV0dXJuIGRlZmF1bHRWYWx1ZTtpZih2YWx1ZSE9PXVuZGVmaW5lZClyZXN1bHQ9dmFsdWU7aWYob3RoZXIhPT0KdW5kZWZpbmVkKXtpZihyZXN1bHQ9PT11bmRlZmluZWQpcmV0dXJuIG90aGVyO2lmKHR5cGVvZiB2YWx1ZT09InN0cmluZyJ8fHR5cGVvZiBvdGhlcj09InN0cmluZyIpe3ZhbHVlPWJhc2VUb1N0cmluZyh2YWx1ZSk7b3RoZXI9YmFzZVRvU3RyaW5nKG90aGVyKX1lbHNle3ZhbHVlPWJhc2VUb051bWJlcih2YWx1ZSk7b3RoZXI9YmFzZVRvTnVtYmVyKG90aGVyKX1yZXN1bHQ9b3BlcmF0b3IodmFsdWUsb3RoZXIpfXJldHVybiByZXN1bHR9fWZ1bmN0aW9uIGNyZWF0ZU92ZXIoYXJyYXlGdW5jKXtyZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oaXRlcmF0ZWVzKXtpdGVyYXRlZXM9YXJyYXlNYXAoaXRlcmF0ZWVzLGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7cmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe3ZhciB0aGlzQXJnPXRoaXM7cmV0dXJuIGFycmF5RnVuYyhpdGVyYXRlZXMsZnVuY3Rpb24oaXRlcmF0ZWUpe3JldHVybiBhcHBseShpdGVyYXRlZSx0aGlzQXJnLGFyZ3MpfSl9KX0pfQpmdW5jdGlvbiBjcmVhdGVQYWRkaW5nKGxlbmd0aCxjaGFycyl7Y2hhcnM9Y2hhcnM9PT11bmRlZmluZWQ/IiAiOmJhc2VUb1N0cmluZyhjaGFycyk7dmFyIGNoYXJzTGVuZ3RoPWNoYXJzLmxlbmd0aDtpZihjaGFyc0xlbmd0aDwyKXJldHVybiBjaGFyc0xlbmd0aD9iYXNlUmVwZWF0KGNoYXJzLGxlbmd0aCk6Y2hhcnM7dmFyIHJlc3VsdD1iYXNlUmVwZWF0KGNoYXJzLG5hdGl2ZUNlaWwobGVuZ3RoL3N0cmluZ1NpemUoY2hhcnMpKSk7cmV0dXJuIGhhc1VuaWNvZGUoY2hhcnMpP2Nhc3RTbGljZShzdHJpbmdUb0FycmF5KHJlc3VsdCksMCxsZW5ndGgpLmpvaW4oIiIpOnJlc3VsdC5zbGljZSgwLGxlbmd0aCl9ZnVuY3Rpb24gY3JlYXRlUGFydGlhbChmdW5jLGJpdG1hc2ssdGhpc0FyZyxwYXJ0aWFscyl7dmFyIGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGFyZ3NJbmRleD0tMSxhcmdzTGVuZ3RoPQphcmd1bWVudHMubGVuZ3RoLGxlZnRJbmRleD0tMSxsZWZ0TGVuZ3RoPXBhcnRpYWxzLmxlbmd0aCxhcmdzPUFycmF5KGxlZnRMZW5ndGgrYXJnc0xlbmd0aCksZm49dGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyP0N0b3I6ZnVuYzt3aGlsZSgrK2xlZnRJbmRleDxsZWZ0TGVuZ3RoKWFyZ3NbbGVmdEluZGV4XT1wYXJ0aWFsc1tsZWZ0SW5kZXhdO3doaWxlKGFyZ3NMZW5ndGgtLSlhcmdzW2xlZnRJbmRleCsrXT1hcmd1bWVudHNbKythcmdzSW5kZXhdO3JldHVybiBhcHBseShmbixpc0JpbmQ/dGhpc0FyZzp0aGlzLGFyZ3MpfXJldHVybiB3cmFwcGVyfWZ1bmN0aW9uIGNyZWF0ZVJhbmdlKGZyb21SaWdodCl7cmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LGVuZCxzdGVwKXtpZihzdGVwJiZ0eXBlb2Ygc3RlcCE9Im51bWJlciImJmlzSXRlcmF0ZWVDYWxsKHN0YXJ0LGVuZCxzdGVwKSllbmQ9c3RlcD11bmRlZmluZWQ7c3RhcnQ9dG9GaW5pdGUoc3RhcnQpO2lmKGVuZD09PQp1bmRlZmluZWQpe2VuZD1zdGFydDtzdGFydD0wfWVsc2UgZW5kPXRvRmluaXRlKGVuZCk7c3RlcD1zdGVwPT09dW5kZWZpbmVkP3N0YXJ0PGVuZD8xOi0xOnRvRmluaXRlKHN0ZXApO3JldHVybiBiYXNlUmFuZ2Uoc3RhcnQsZW5kLHN0ZXAsZnJvbVJpZ2h0KX19ZnVuY3Rpb24gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihvcGVyYXRvcil7cmV0dXJuIGZ1bmN0aW9uKHZhbHVlLG90aGVyKXtpZighKHR5cGVvZiB2YWx1ZT09InN0cmluZyImJnR5cGVvZiBvdGhlcj09InN0cmluZyIpKXt2YWx1ZT10b051bWJlcih2YWx1ZSk7b3RoZXI9dG9OdW1iZXIob3RoZXIpfXJldHVybiBvcGVyYXRvcih2YWx1ZSxvdGhlcil9fWZ1bmN0aW9uIGNyZWF0ZVJlY3VycnkoZnVuYyxiaXRtYXNrLHdyYXBGdW5jLHBsYWNlaG9sZGVyLHRoaXNBcmcscGFydGlhbHMsaG9sZGVycyxhcmdQb3MsYXJ5LGFyaXR5KXt2YXIgaXNDdXJyeT1iaXRtYXNrJldSQVBfQ1VSUllfRkxBRyxuZXdIb2xkZXJzPWlzQ3Vycnk/CmhvbGRlcnM6dW5kZWZpbmVkLG5ld0hvbGRlcnNSaWdodD1pc0N1cnJ5P3VuZGVmaW5lZDpob2xkZXJzLG5ld1BhcnRpYWxzPWlzQ3Vycnk/cGFydGlhbHM6dW5kZWZpbmVkLG5ld1BhcnRpYWxzUmlnaHQ9aXNDdXJyeT91bmRlZmluZWQ6cGFydGlhbHM7Yml0bWFza3w9aXNDdXJyeT9XUkFQX1BBUlRJQUxfRkxBRzpXUkFQX1BBUlRJQUxfUklHSFRfRkxBRztiaXRtYXNrJj1+KGlzQ3Vycnk/V1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUc6V1JBUF9QQVJUSUFMX0ZMQUcpO2lmKCEoYml0bWFzayZXUkFQX0NVUlJZX0JPVU5EX0ZMQUcpKWJpdG1hc2smPX4oV1JBUF9CSU5EX0ZMQUd8V1JBUF9CSU5EX0tFWV9GTEFHKTt2YXIgbmV3RGF0YT1bZnVuYyxiaXRtYXNrLHRoaXNBcmcsbmV3UGFydGlhbHMsbmV3SG9sZGVycyxuZXdQYXJ0aWFsc1JpZ2h0LG5ld0hvbGRlcnNSaWdodCxhcmdQb3MsYXJ5LGFyaXR5XTt2YXIgcmVzdWx0PXdyYXBGdW5jLmFwcGx5KHVuZGVmaW5lZCxuZXdEYXRhKTtpZihpc0xhemlhYmxlKGZ1bmMpKXNldERhdGEocmVzdWx0LApuZXdEYXRhKTtyZXN1bHQucGxhY2Vob2xkZXI9cGxhY2Vob2xkZXI7cmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsZnVuYyxiaXRtYXNrKX1mdW5jdGlvbiBjcmVhdGVSb3VuZChtZXRob2ROYW1lKXt2YXIgZnVuYz1NYXRoW21ldGhvZE5hbWVdO3JldHVybiBmdW5jdGlvbihudW1iZXIscHJlY2lzaW9uKXtudW1iZXI9dG9OdW1iZXIobnVtYmVyKTtwcmVjaXNpb249cHJlY2lzaW9uPT1udWxsPzA6bmF0aXZlTWluKHRvSW50ZWdlcihwcmVjaXNpb24pLDI5Mik7aWYocHJlY2lzaW9uKXt2YXIgcGFpcj0odG9TdHJpbmcobnVtYmVyKSsiZSIpLnNwbGl0KCJlIiksdmFsdWU9ZnVuYyhwYWlyWzBdKyJlIisoK3BhaXJbMV0rcHJlY2lzaW9uKSk7cGFpcj0odG9TdHJpbmcodmFsdWUpKyJlIikuc3BsaXQoImUiKTtyZXR1cm4rKHBhaXJbMF0rImUiKygrcGFpclsxXS1wcmVjaXNpb24pKX1yZXR1cm4gZnVuYyhudW1iZXIpfX12YXIgY3JlYXRlU2V0PSEoU2V0JiYxL3NldFRvQXJyYXkobmV3IFNldChbLAotMF0pKVsxXT09SU5GSU5JVFkpP25vb3A6ZnVuY3Rpb24odmFsdWVzKXtyZXR1cm4gbmV3IFNldCh2YWx1ZXMpfTtmdW5jdGlvbiBjcmVhdGVUb1BhaXJzKGtleXNGdW5jKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXt2YXIgdGFnPWdldFRhZyhvYmplY3QpO2lmKHRhZz09bWFwVGFnKXJldHVybiBtYXBUb0FycmF5KG9iamVjdCk7aWYodGFnPT1zZXRUYWcpcmV0dXJuIHNldFRvUGFpcnMob2JqZWN0KTtyZXR1cm4gYmFzZVRvUGFpcnMob2JqZWN0LGtleXNGdW5jKG9iamVjdCkpfX1mdW5jdGlvbiBjcmVhdGVXcmFwKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzLGhvbGRlcnMsYXJnUG9zLGFyeSxhcml0eSl7dmFyIGlzQmluZEtleT1iaXRtYXNrJldSQVBfQklORF9LRVlfRkxBRztpZighaXNCaW5kS2V5JiZ0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7dmFyIGxlbmd0aD1wYXJ0aWFscz9wYXJ0aWFscy5sZW5ndGg6CjA7aWYoIWxlbmd0aCl7Yml0bWFzayY9fihXUkFQX1BBUlRJQUxfRkxBR3xXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7cGFydGlhbHM9aG9sZGVycz11bmRlZmluZWR9YXJ5PWFyeT09PXVuZGVmaW5lZD9hcnk6bmF0aXZlTWF4KHRvSW50ZWdlcihhcnkpLDApO2FyaXR5PWFyaXR5PT09dW5kZWZpbmVkP2FyaXR5OnRvSW50ZWdlcihhcml0eSk7bGVuZ3RoLT1ob2xkZXJzP2hvbGRlcnMubGVuZ3RoOjA7aWYoYml0bWFzayZXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyl7dmFyIHBhcnRpYWxzUmlnaHQ9cGFydGlhbHMsaG9sZGVyc1JpZ2h0PWhvbGRlcnM7cGFydGlhbHM9aG9sZGVycz11bmRlZmluZWR9dmFyIGRhdGE9aXNCaW5kS2V5P3VuZGVmaW5lZDpnZXREYXRhKGZ1bmMpO3ZhciBuZXdEYXRhPVtmdW5jLGJpdG1hc2ssdGhpc0FyZyxwYXJ0aWFscyxob2xkZXJzLHBhcnRpYWxzUmlnaHQsaG9sZGVyc1JpZ2h0LGFyZ1BvcyxhcnksYXJpdHldO2lmKGRhdGEpbWVyZ2VEYXRhKG5ld0RhdGEsCmRhdGEpO2Z1bmM9bmV3RGF0YVswXTtiaXRtYXNrPW5ld0RhdGFbMV07dGhpc0FyZz1uZXdEYXRhWzJdO3BhcnRpYWxzPW5ld0RhdGFbM107aG9sZGVycz1uZXdEYXRhWzRdO2FyaXR5PW5ld0RhdGFbOV09bmV3RGF0YVs5XT09PXVuZGVmaW5lZD9pc0JpbmRLZXk/MDpmdW5jLmxlbmd0aDpuYXRpdmVNYXgobmV3RGF0YVs5XS1sZW5ndGgsMCk7aWYoIWFyaXR5JiZiaXRtYXNrJihXUkFQX0NVUlJZX0ZMQUd8V1JBUF9DVVJSWV9SSUdIVF9GTEFHKSliaXRtYXNrJj1+KFdSQVBfQ1VSUllfRkxBR3xXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpO2lmKCFiaXRtYXNrfHxiaXRtYXNrPT1XUkFQX0JJTkRfRkxBRyl2YXIgcmVzdWx0PWNyZWF0ZUJpbmQoZnVuYyxiaXRtYXNrLHRoaXNBcmcpO2Vsc2UgaWYoYml0bWFzaz09V1JBUF9DVVJSWV9GTEFHfHxiaXRtYXNrPT1XUkFQX0NVUlJZX1JJR0hUX0ZMQUcpcmVzdWx0PWNyZWF0ZUN1cnJ5KGZ1bmMsYml0bWFzayxhcml0eSk7ZWxzZSBpZigoYml0bWFzaz09CldSQVBfUEFSVElBTF9GTEFHfHxiaXRtYXNrPT0oV1JBUF9CSU5EX0ZMQUd8V1JBUF9QQVJUSUFMX0ZMQUcpKSYmIWhvbGRlcnMubGVuZ3RoKXJlc3VsdD1jcmVhdGVQYXJ0aWFsKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzKTtlbHNlIHJlc3VsdD1jcmVhdGVIeWJyaWQuYXBwbHkodW5kZWZpbmVkLG5ld0RhdGEpO3ZhciBzZXR0ZXI9ZGF0YT9iYXNlU2V0RGF0YTpzZXREYXRhO3JldHVybiBzZXRXcmFwVG9TdHJpbmcoc2V0dGVyKHJlc3VsdCxuZXdEYXRhKSxmdW5jLGJpdG1hc2spfWZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzQXNzaWduSW4ob2JqVmFsdWUsc3JjVmFsdWUsa2V5LG9iamVjdCl7aWYob2JqVmFsdWU9PT11bmRlZmluZWR8fGVxKG9ialZhbHVlLG9iamVjdFByb3RvW2tleV0pJiYhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3Qsa2V5KSlyZXR1cm4gc3JjVmFsdWU7cmV0dXJuIG9ialZhbHVlfWZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzTWVyZ2Uob2JqVmFsdWUsc3JjVmFsdWUsCmtleSxvYmplY3Qsc291cmNlLHN0YWNrKXtpZihpc09iamVjdChvYmpWYWx1ZSkmJmlzT2JqZWN0KHNyY1ZhbHVlKSl7c3RhY2suc2V0KHNyY1ZhbHVlLG9ialZhbHVlKTtiYXNlTWVyZ2Uob2JqVmFsdWUsc3JjVmFsdWUsdW5kZWZpbmVkLGN1c3RvbURlZmF1bHRzTWVyZ2Usc3RhY2spO3N0YWNrWyJkZWxldGUiXShzcmNWYWx1ZSl9cmV0dXJuIG9ialZhbHVlfWZ1bmN0aW9uIGN1c3RvbU9taXRDbG9uZSh2YWx1ZSl7cmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpP3VuZGVmaW5lZDp2YWx1ZX1mdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKXt2YXIgaXNQYXJ0aWFsPWJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUcsYXJyTGVuZ3RoPWFycmF5Lmxlbmd0aCxvdGhMZW5ndGg9b3RoZXIubGVuZ3RoO2lmKGFyckxlbmd0aCE9b3RoTGVuZ3RoJiYhKGlzUGFydGlhbCYmb3RoTGVuZ3RoPmFyckxlbmd0aCkpcmV0dXJuIGZhbHNlOwp2YXIgc3RhY2tlZD1zdGFjay5nZXQoYXJyYXkpO2lmKHN0YWNrZWQmJnN0YWNrLmdldChvdGhlcikpcmV0dXJuIHN0YWNrZWQ9PW90aGVyO3ZhciBpbmRleD0tMSxyZXN1bHQ9dHJ1ZSxzZWVuPWJpdG1hc2smQ09NUEFSRV9VTk9SREVSRURfRkxBRz9uZXcgU2V0Q2FjaGU6dW5kZWZpbmVkO3N0YWNrLnNldChhcnJheSxvdGhlcik7c3RhY2suc2V0KG90aGVyLGFycmF5KTt3aGlsZSgrK2luZGV4PGFyckxlbmd0aCl7dmFyIGFyclZhbHVlPWFycmF5W2luZGV4XSxvdGhWYWx1ZT1vdGhlcltpbmRleF07aWYoY3VzdG9taXplcil2YXIgY29tcGFyZWQ9aXNQYXJ0aWFsP2N1c3RvbWl6ZXIob3RoVmFsdWUsYXJyVmFsdWUsaW5kZXgsb3RoZXIsYXJyYXksc3RhY2spOmN1c3RvbWl6ZXIoYXJyVmFsdWUsb3RoVmFsdWUsaW5kZXgsYXJyYXksb3RoZXIsc3RhY2spO2lmKGNvbXBhcmVkIT09dW5kZWZpbmVkKXtpZihjb21wYXJlZCljb250aW51ZTtyZXN1bHQ9ZmFsc2U7YnJlYWt9aWYoc2Vlbil7aWYoIWFycmF5U29tZShvdGhlciwKZnVuY3Rpb24ob3RoVmFsdWUsb3RoSW5kZXgpe2lmKCFjYWNoZUhhcyhzZWVuLG90aEluZGV4KSYmKGFyclZhbHVlPT09b3RoVmFsdWV8fGVxdWFsRnVuYyhhcnJWYWx1ZSxvdGhWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3RhY2spKSlyZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KX0pKXtyZXN1bHQ9ZmFsc2U7YnJlYWt9fWVsc2UgaWYoIShhcnJWYWx1ZT09PW90aFZhbHVlfHxlcXVhbEZ1bmMoYXJyVmFsdWUsb3RoVmFsdWUsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKSkpe3Jlc3VsdD1mYWxzZTticmVha319c3RhY2tbImRlbGV0ZSJdKGFycmF5KTtzdGFja1siZGVsZXRlIl0ob3RoZXIpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3Qsb3RoZXIsdGFnLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spe3N3aXRjaCh0YWcpe2Nhc2UgZGF0YVZpZXdUYWc6aWYob2JqZWN0LmJ5dGVMZW5ndGghPW90aGVyLmJ5dGVMZW5ndGh8fG9iamVjdC5ieXRlT2Zmc2V0IT0Kb3RoZXIuYnl0ZU9mZnNldClyZXR1cm4gZmFsc2U7b2JqZWN0PW9iamVjdC5idWZmZXI7b3RoZXI9b3RoZXIuYnVmZmVyO2Nhc2UgYXJyYXlCdWZmZXJUYWc6aWYob2JqZWN0LmJ5dGVMZW5ndGghPW90aGVyLmJ5dGVMZW5ndGh8fCFlcXVhbEZ1bmMobmV3IFVpbnQ4QXJyYXkob2JqZWN0KSxuZXcgVWludDhBcnJheShvdGhlcikpKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTtjYXNlIGJvb2xUYWc6Y2FzZSBkYXRlVGFnOmNhc2UgbnVtYmVyVGFnOnJldHVybiBlcSgrb2JqZWN0LCtvdGhlcik7Y2FzZSBlcnJvclRhZzpyZXR1cm4gb2JqZWN0Lm5hbWU9PW90aGVyLm5hbWUmJm9iamVjdC5tZXNzYWdlPT1vdGhlci5tZXNzYWdlO2Nhc2UgcmVnZXhwVGFnOmNhc2Ugc3RyaW5nVGFnOnJldHVybiBvYmplY3Q9PW90aGVyKyIiO2Nhc2UgbWFwVGFnOnZhciBjb252ZXJ0PW1hcFRvQXJyYXk7Y2FzZSBzZXRUYWc6dmFyIGlzUGFydGlhbD1iaXRtYXNrJkNPTVBBUkVfUEFSVElBTF9GTEFHO2NvbnZlcnR8fAooY29udmVydD1zZXRUb0FycmF5KTtpZihvYmplY3Quc2l6ZSE9b3RoZXIuc2l6ZSYmIWlzUGFydGlhbClyZXR1cm4gZmFsc2U7dmFyIHN0YWNrZWQ9c3RhY2suZ2V0KG9iamVjdCk7aWYoc3RhY2tlZClyZXR1cm4gc3RhY2tlZD09b3RoZXI7Yml0bWFza3w9Q09NUEFSRV9VTk9SREVSRURfRkxBRztzdGFjay5zZXQob2JqZWN0LG90aGVyKTt2YXIgcmVzdWx0PWVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSxjb252ZXJ0KG90aGVyKSxiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKTtzdGFja1siZGVsZXRlIl0ob2JqZWN0KTtyZXR1cm4gcmVzdWx0O2Nhc2Ugc3ltYm9sVGFnOmlmKHN5bWJvbFZhbHVlT2YpcmV0dXJuIHN5bWJvbFZhbHVlT2YuY2FsbChvYmplY3QpPT1zeW1ib2xWYWx1ZU9mLmNhbGwob3RoZXIpfXJldHVybiBmYWxzZX1mdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spe3ZhciBpc1BhcnRpYWw9CmJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUcsb2JqUHJvcHM9Z2V0QWxsS2V5cyhvYmplY3QpLG9iakxlbmd0aD1vYmpQcm9wcy5sZW5ndGgsb3RoUHJvcHM9Z2V0QWxsS2V5cyhvdGhlciksb3RoTGVuZ3RoPW90aFByb3BzLmxlbmd0aDtpZihvYmpMZW5ndGghPW90aExlbmd0aCYmIWlzUGFydGlhbClyZXR1cm4gZmFsc2U7dmFyIGluZGV4PW9iakxlbmd0aDt3aGlsZShpbmRleC0tKXt2YXIga2V5PW9ialByb3BzW2luZGV4XTtpZighKGlzUGFydGlhbD9rZXkgaW4gb3RoZXI6aGFzT3duUHJvcGVydHkuY2FsbChvdGhlcixrZXkpKSlyZXR1cm4gZmFsc2V9dmFyIHN0YWNrZWQ9c3RhY2suZ2V0KG9iamVjdCk7aWYoc3RhY2tlZCYmc3RhY2suZ2V0KG90aGVyKSlyZXR1cm4gc3RhY2tlZD09b3RoZXI7dmFyIHJlc3VsdD10cnVlO3N0YWNrLnNldChvYmplY3Qsb3RoZXIpO3N0YWNrLnNldChvdGhlcixvYmplY3QpO3ZhciBza2lwQ3Rvcj1pc1BhcnRpYWw7d2hpbGUoKytpbmRleDxvYmpMZW5ndGgpe2tleT0Kb2JqUHJvcHNbaW5kZXhdO3ZhciBvYmpWYWx1ZT1vYmplY3Rba2V5XSxvdGhWYWx1ZT1vdGhlcltrZXldO2lmKGN1c3RvbWl6ZXIpdmFyIGNvbXBhcmVkPWlzUGFydGlhbD9jdXN0b21pemVyKG90aFZhbHVlLG9ialZhbHVlLGtleSxvdGhlcixvYmplY3Qsc3RhY2spOmN1c3RvbWl6ZXIob2JqVmFsdWUsb3RoVmFsdWUsa2V5LG9iamVjdCxvdGhlcixzdGFjayk7aWYoIShjb21wYXJlZD09PXVuZGVmaW5lZD9vYmpWYWx1ZT09PW90aFZhbHVlfHxlcXVhbEZ1bmMob2JqVmFsdWUsb3RoVmFsdWUsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKTpjb21wYXJlZCkpe3Jlc3VsdD1mYWxzZTticmVha31za2lwQ3Rvcnx8KHNraXBDdG9yPWtleT09ImNvbnN0cnVjdG9yIil9aWYocmVzdWx0JiYhc2tpcEN0b3Ipe3ZhciBvYmpDdG9yPW9iamVjdC5jb25zdHJ1Y3RvcixvdGhDdG9yPW90aGVyLmNvbnN0cnVjdG9yO2lmKG9iakN0b3IhPW90aEN0b3ImJigiY29uc3RydWN0b3IiaW4gb2JqZWN0JiYiY29uc3RydWN0b3IiaW4Kb3RoZXIpJiYhKHR5cGVvZiBvYmpDdG9yPT0iZnVuY3Rpb24iJiZvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciYmdHlwZW9mIG90aEN0b3I9PSJmdW5jdGlvbiImJm90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yKSlyZXN1bHQ9ZmFsc2V9c3RhY2tbImRlbGV0ZSJdKG9iamVjdCk7c3RhY2tbImRlbGV0ZSJdKG90aGVyKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpe3JldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLHVuZGVmaW5lZCxmbGF0dGVuKSxmdW5jKyIiKX1mdW5jdGlvbiBnZXRBbGxLZXlzKG9iamVjdCl7cmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCxrZXlzLGdldFN5bWJvbHMpfWZ1bmN0aW9uIGdldEFsbEtleXNJbihvYmplY3Qpe3JldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3Qsa2V5c0luLGdldFN5bWJvbHNJbil9dmFyIGdldERhdGE9IW1ldGFNYXA/bm9vcDpmdW5jdGlvbihmdW5jKXtyZXR1cm4gbWV0YU1hcC5nZXQoZnVuYyl9OwpmdW5jdGlvbiBnZXRGdW5jTmFtZShmdW5jKXt2YXIgcmVzdWx0PWZ1bmMubmFtZSsiIixhcnJheT1yZWFsTmFtZXNbcmVzdWx0XSxsZW5ndGg9aGFzT3duUHJvcGVydHkuY2FsbChyZWFsTmFtZXMscmVzdWx0KT9hcnJheS5sZW5ndGg6MDt3aGlsZShsZW5ndGgtLSl7dmFyIGRhdGE9YXJyYXlbbGVuZ3RoXSxvdGhlckZ1bmM9ZGF0YS5mdW5jO2lmKG90aGVyRnVuYz09bnVsbHx8b3RoZXJGdW5jPT1mdW5jKXJldHVybiBkYXRhLm5hbWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBnZXRIb2xkZXIoZnVuYyl7dmFyIG9iamVjdD1oYXNPd25Qcm9wZXJ0eS5jYWxsKGxvZGFzaCwicGxhY2Vob2xkZXIiKT9sb2Rhc2g6ZnVuYztyZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyfWZ1bmN0aW9uIGdldEl0ZXJhdGVlKCl7dmFyIHJlc3VsdD1sb2Rhc2guaXRlcmF0ZWV8fGl0ZXJhdGVlO3Jlc3VsdD1yZXN1bHQ9PT1pdGVyYXRlZT9iYXNlSXRlcmF0ZWU6cmVzdWx0O3JldHVybiBhcmd1bWVudHMubGVuZ3RoPwpyZXN1bHQoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSk6cmVzdWx0fWZ1bmN0aW9uIGdldE1hcERhdGEobWFwLGtleSl7dmFyIGRhdGE9bWFwLl9fZGF0YV9fO3JldHVybiBpc0tleWFibGUoa2V5KT9kYXRhW3R5cGVvZiBrZXk9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06ZGF0YS5tYXB9ZnVuY3Rpb24gZ2V0TWF0Y2hEYXRhKG9iamVjdCl7dmFyIHJlc3VsdD1rZXlzKG9iamVjdCksbGVuZ3RoPXJlc3VsdC5sZW5ndGg7d2hpbGUobGVuZ3RoLS0pe3ZhciBrZXk9cmVzdWx0W2xlbmd0aF0sdmFsdWU9b2JqZWN0W2tleV07cmVzdWx0W2xlbmd0aF09W2tleSx2YWx1ZSxpc1N0cmljdENvbXBhcmFibGUodmFsdWUpXX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3Qsa2V5KXt2YXIgdmFsdWU9Z2V0VmFsdWUob2JqZWN0LGtleSk7cmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSk/dmFsdWU6dW5kZWZpbmVkfWZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSl7dmFyIGlzT3duPQpoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLHN5bVRvU3RyaW5nVGFnKSx0YWc9dmFsdWVbc3ltVG9TdHJpbmdUYWddO3RyeXt2YWx1ZVtzeW1Ub1N0cmluZ1RhZ109dW5kZWZpbmVkO3ZhciB1bm1hc2tlZD10cnVlfWNhdGNoKGUpe312YXIgcmVzdWx0PW5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO2lmKHVubWFza2VkKWlmKGlzT3duKXZhbHVlW3N5bVRvU3RyaW5nVGFnXT10YWc7ZWxzZSBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO3JldHVybiByZXN1bHR9dmFyIGdldFN5bWJvbHM9IW5hdGl2ZUdldFN5bWJvbHM/c3R1YkFycmF5OmZ1bmN0aW9uKG9iamVjdCl7aWYob2JqZWN0PT1udWxsKXJldHVybltdO29iamVjdD1PYmplY3Qob2JqZWN0KTtyZXR1cm4gYXJyYXlGaWx0ZXIobmF0aXZlR2V0U3ltYm9scyhvYmplY3QpLGZ1bmN0aW9uKHN5bWJvbCl7cmV0dXJuIHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqZWN0LHN5bWJvbCl9KX07dmFyIGdldFN5bWJvbHNJbj0KIW5hdGl2ZUdldFN5bWJvbHM/c3R1YkFycmF5OmZ1bmN0aW9uKG9iamVjdCl7dmFyIHJlc3VsdD1bXTt3aGlsZShvYmplY3Qpe2FycmF5UHVzaChyZXN1bHQsZ2V0U3ltYm9scyhvYmplY3QpKTtvYmplY3Q9Z2V0UHJvdG90eXBlKG9iamVjdCl9cmV0dXJuIHJlc3VsdH07dmFyIGdldFRhZz1iYXNlR2V0VGFnO2lmKERhdGFWaWV3JiZnZXRUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpIT1kYXRhVmlld1RhZ3x8TWFwJiZnZXRUYWcobmV3IE1hcCkhPW1hcFRhZ3x8UHJvbWlzZSYmZ2V0VGFnKFByb21pc2UucmVzb2x2ZSgpKSE9cHJvbWlzZVRhZ3x8U2V0JiZnZXRUYWcobmV3IFNldCkhPXNldFRhZ3x8V2Vha01hcCYmZ2V0VGFnKG5ldyBXZWFrTWFwKSE9d2Vha01hcFRhZylnZXRUYWc9ZnVuY3Rpb24odmFsdWUpe3ZhciByZXN1bHQ9YmFzZUdldFRhZyh2YWx1ZSksQ3Rvcj1yZXN1bHQ9PW9iamVjdFRhZz92YWx1ZS5jb25zdHJ1Y3Rvcjp1bmRlZmluZWQsY3RvclN0cmluZz0KQ3Rvcj90b1NvdXJjZShDdG9yKToiIjtpZihjdG9yU3RyaW5nKXN3aXRjaChjdG9yU3RyaW5nKXtjYXNlIGRhdGFWaWV3Q3RvclN0cmluZzpyZXR1cm4gZGF0YVZpZXdUYWc7Y2FzZSBtYXBDdG9yU3RyaW5nOnJldHVybiBtYXBUYWc7Y2FzZSBwcm9taXNlQ3RvclN0cmluZzpyZXR1cm4gcHJvbWlzZVRhZztjYXNlIHNldEN0b3JTdHJpbmc6cmV0dXJuIHNldFRhZztjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOnJldHVybiB3ZWFrTWFwVGFnfXJldHVybiByZXN1bHR9O2Z1bmN0aW9uIGdldFZpZXcoc3RhcnQsZW5kLHRyYW5zZm9ybXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9dHJhbnNmb3Jtcy5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBkYXRhPXRyYW5zZm9ybXNbaW5kZXhdLHNpemU9ZGF0YS5zaXplO3N3aXRjaChkYXRhLnR5cGUpe2Nhc2UgImRyb3AiOnN0YXJ0Kz1zaXplO2JyZWFrO2Nhc2UgImRyb3BSaWdodCI6ZW5kLT1zaXplO2JyZWFrO2Nhc2UgInRha2UiOmVuZD1uYXRpdmVNaW4oZW5kLApzdGFydCtzaXplKTticmVhaztjYXNlICJ0YWtlUmlnaHQiOnN0YXJ0PW5hdGl2ZU1heChzdGFydCxlbmQtc2l6ZSk7YnJlYWt9fXJldHVybnsic3RhcnQiOnN0YXJ0LCJlbmQiOmVuZH19ZnVuY3Rpb24gZ2V0V3JhcERldGFpbHMoc291cmNlKXt2YXIgbWF0Y2g9c291cmNlLm1hdGNoKHJlV3JhcERldGFpbHMpO3JldHVybiBtYXRjaD9tYXRjaFsxXS5zcGxpdChyZVNwbGl0RGV0YWlscyk6W119ZnVuY3Rpb24gaGFzUGF0aChvYmplY3QscGF0aCxoYXNGdW5jKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhdGgubGVuZ3RoLHJlc3VsdD1mYWxzZTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGtleT10b0tleShwYXRoW2luZGV4XSk7aWYoIShyZXN1bHQ9b2JqZWN0IT1udWxsJiZoYXNGdW5jKG9iamVjdCxrZXkpKSlicmVhaztvYmplY3Q9b2JqZWN0W2tleV19aWYocmVzdWx0fHwrK2luZGV4IT1sZW5ndGgpcmV0dXJuIHJlc3VsdDtsZW5ndGg9Cm9iamVjdD09bnVsbD8wOm9iamVjdC5sZW5ndGg7cmV0dXJuISFsZW5ndGgmJmlzTGVuZ3RoKGxlbmd0aCkmJmlzSW5kZXgoa2V5LGxlbmd0aCkmJihpc0FycmF5KG9iamVjdCl8fGlzQXJndW1lbnRzKG9iamVjdCkpfWZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxyZXN1bHQ9bmV3IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7aWYobGVuZ3RoJiZ0eXBlb2YgYXJyYXlbMF09PSJzdHJpbmciJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCJpbmRleCIpKXtyZXN1bHQuaW5kZXg9YXJyYXkuaW5kZXg7cmVzdWx0LmlucHV0PWFycmF5LmlucHV0fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gaW5pdENsb25lT2JqZWN0KG9iamVjdCl7cmV0dXJuIHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3I9PSJmdW5jdGlvbiImJiFpc1Byb3RvdHlwZShvYmplY3QpP2Jhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpOnt9fWZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwKdGFnLGlzRGVlcCl7dmFyIEN0b3I9b2JqZWN0LmNvbnN0cnVjdG9yO3N3aXRjaCh0YWcpe2Nhc2UgYXJyYXlCdWZmZXJUYWc6cmV0dXJuIGNsb25lQXJyYXlCdWZmZXIob2JqZWN0KTtjYXNlIGJvb2xUYWc6Y2FzZSBkYXRlVGFnOnJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtjYXNlIGRhdGFWaWV3VGFnOnJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCxpc0RlZXApO2Nhc2UgZmxvYXQzMlRhZzpjYXNlIGZsb2F0NjRUYWc6Y2FzZSBpbnQ4VGFnOmNhc2UgaW50MTZUYWc6Y2FzZSBpbnQzMlRhZzpjYXNlIHVpbnQ4VGFnOmNhc2UgdWludDhDbGFtcGVkVGFnOmNhc2UgdWludDE2VGFnOmNhc2UgdWludDMyVGFnOnJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LGlzRGVlcCk7Y2FzZSBtYXBUYWc6cmV0dXJuIG5ldyBDdG9yO2Nhc2UgbnVtYmVyVGFnOmNhc2Ugc3RyaW5nVGFnOnJldHVybiBuZXcgQ3RvcihvYmplY3QpO2Nhc2UgcmVnZXhwVGFnOnJldHVybiBjbG9uZVJlZ0V4cChvYmplY3QpOwpjYXNlIHNldFRhZzpyZXR1cm4gbmV3IEN0b3I7Y2FzZSBzeW1ib2xUYWc6cmV0dXJuIGNsb25lU3ltYm9sKG9iamVjdCl9fWZ1bmN0aW9uIGluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSxkZXRhaWxzKXt2YXIgbGVuZ3RoPWRldGFpbHMubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuIHNvdXJjZTt2YXIgbGFzdEluZGV4PWxlbmd0aC0xO2RldGFpbHNbbGFzdEluZGV4XT0obGVuZ3RoPjE/Ilx4MjYgIjoiIikrZGV0YWlsc1tsYXN0SW5kZXhdO2RldGFpbHM9ZGV0YWlscy5qb2luKGxlbmd0aD4yPyIsICI6IiAiKTtyZXR1cm4gc291cmNlLnJlcGxhY2UocmVXcmFwQ29tbWVudCwie1xuLyogW3dyYXBwZWQgd2l0aCAiK2RldGFpbHMrIl0gKi9cbiIpfWZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpe3JldHVybiBpc0FycmF5KHZhbHVlKXx8aXNBcmd1bWVudHModmFsdWUpfHwhIShzcHJlYWRhYmxlU3ltYm9sJiZ2YWx1ZSYmdmFsdWVbc3ByZWFkYWJsZVN5bWJvbF0pfWZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsCmxlbmd0aCl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO2xlbmd0aD1sZW5ndGg9PW51bGw/TUFYX1NBRkVfSU5URUdFUjpsZW5ndGg7cmV0dXJuISFsZW5ndGgmJih0eXBlPT0ibnVtYmVyInx8dHlwZSE9InN5bWJvbCImJnJlSXNVaW50LnRlc3QodmFsdWUpKSYmKHZhbHVlPi0xJiZ2YWx1ZSUxPT0wJiZ2YWx1ZTxsZW5ndGgpfWZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLGluZGV4LG9iamVjdCl7aWYoIWlzT2JqZWN0KG9iamVjdCkpcmV0dXJuIGZhbHNlO3ZhciB0eXBlPXR5cGVvZiBpbmRleDtpZih0eXBlPT0ibnVtYmVyIj9pc0FycmF5TGlrZShvYmplY3QpJiZpc0luZGV4KGluZGV4LG9iamVjdC5sZW5ndGgpOnR5cGU9PSJzdHJpbmciJiZpbmRleCBpbiBvYmplY3QpcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sdmFsdWUpO3JldHVybiBmYWxzZX1mdW5jdGlvbiBpc0tleSh2YWx1ZSxvYmplY3Qpe2lmKGlzQXJyYXkodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdHlwZT10eXBlb2YgdmFsdWU7CmlmKHR5cGU9PSJudW1iZXIifHx0eXBlPT0ic3ltYm9sInx8dHlwZT09ImJvb2xlYW4ifHx2YWx1ZT09bnVsbHx8aXNTeW1ib2wodmFsdWUpKXJldHVybiB0cnVlO3JldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpfHwhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpfHxvYmplY3QhPW51bGwmJnZhbHVlIGluIE9iamVjdChvYmplY3QpfWZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO3JldHVybiB0eXBlPT0ic3RyaW5nInx8dHlwZT09Im51bWJlciJ8fHR5cGU9PSJzeW1ib2wifHx0eXBlPT0iYm9vbGVhbiI/dmFsdWUhPT0iX19wcm90b19fIjp2YWx1ZT09PW51bGx9ZnVuY3Rpb24gaXNMYXppYWJsZShmdW5jKXt2YXIgZnVuY05hbWU9Z2V0RnVuY05hbWUoZnVuYyksb3RoZXI9bG9kYXNoW2Z1bmNOYW1lXTtpZih0eXBlb2Ygb3RoZXIhPSJmdW5jdGlvbiJ8fCEoZnVuY05hbWUgaW4gTGF6eVdyYXBwZXIucHJvdG90eXBlKSlyZXR1cm4gZmFsc2U7CmlmKGZ1bmM9PT1vdGhlcilyZXR1cm4gdHJ1ZTt2YXIgZGF0YT1nZXREYXRhKG90aGVyKTtyZXR1cm4hIWRhdGEmJmZ1bmM9PT1kYXRhWzBdfWZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpe3JldHVybiEhbWFza1NyY0tleSYmbWFza1NyY0tleSBpbiBmdW5jfXZhciBpc01hc2thYmxlPWNvcmVKc0RhdGE/aXNGdW5jdGlvbjpzdHViRmFsc2U7ZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpe3ZhciBDdG9yPXZhbHVlJiZ2YWx1ZS5jb25zdHJ1Y3Rvcixwcm90bz10eXBlb2YgQ3Rvcj09ImZ1bmN0aW9uIiYmQ3Rvci5wcm90b3R5cGV8fG9iamVjdFByb3RvO3JldHVybiB2YWx1ZT09PXByb3RvfWZ1bmN0aW9uIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09dmFsdWUmJiFpc09iamVjdCh2YWx1ZSl9ZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LHNyY1ZhbHVlKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtpZihvYmplY3Q9PW51bGwpcmV0dXJuIGZhbHNlOwpyZXR1cm4gb2JqZWN0W2tleV09PT1zcmNWYWx1ZSYmKHNyY1ZhbHVlIT09dW5kZWZpbmVkfHxrZXkgaW4gT2JqZWN0KG9iamVjdCkpfX1mdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpe3ZhciByZXN1bHQ9bWVtb2l6ZShmdW5jLGZ1bmN0aW9uKGtleSl7aWYoY2FjaGUuc2l6ZT09PU1BWF9NRU1PSVpFX1NJWkUpY2FjaGUuY2xlYXIoKTtyZXR1cm4ga2V5fSk7dmFyIGNhY2hlPXJlc3VsdC5jYWNoZTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG1lcmdlRGF0YShkYXRhLHNvdXJjZSl7dmFyIGJpdG1hc2s9ZGF0YVsxXSxzcmNCaXRtYXNrPXNvdXJjZVsxXSxuZXdCaXRtYXNrPWJpdG1hc2t8c3JjQml0bWFzayxpc0NvbW1vbj1uZXdCaXRtYXNrPChXUkFQX0JJTkRfRkxBR3xXUkFQX0JJTkRfS0VZX0ZMQUd8V1JBUF9BUllfRkxBRyk7dmFyIGlzQ29tYm89c3JjQml0bWFzaz09V1JBUF9BUllfRkxBRyYmYml0bWFzaz09V1JBUF9DVVJSWV9GTEFHfHxzcmNCaXRtYXNrPT1XUkFQX0FSWV9GTEFHJiYKYml0bWFzaz09V1JBUF9SRUFSR19GTEFHJiZkYXRhWzddLmxlbmd0aDw9c291cmNlWzhdfHxzcmNCaXRtYXNrPT0oV1JBUF9BUllfRkxBR3xXUkFQX1JFQVJHX0ZMQUcpJiZzb3VyY2VbN10ubGVuZ3RoPD1zb3VyY2VbOF0mJmJpdG1hc2s9PVdSQVBfQ1VSUllfRkxBRztpZighKGlzQ29tbW9ufHxpc0NvbWJvKSlyZXR1cm4gZGF0YTtpZihzcmNCaXRtYXNrJldSQVBfQklORF9GTEFHKXtkYXRhWzJdPXNvdXJjZVsyXTtuZXdCaXRtYXNrfD1iaXRtYXNrJldSQVBfQklORF9GTEFHPzA6V1JBUF9DVVJSWV9CT1VORF9GTEFHfXZhciB2YWx1ZT1zb3VyY2VbM107aWYodmFsdWUpe3ZhciBwYXJ0aWFscz1kYXRhWzNdO2RhdGFbM109cGFydGlhbHM/Y29tcG9zZUFyZ3MocGFydGlhbHMsdmFsdWUsc291cmNlWzRdKTp2YWx1ZTtkYXRhWzRdPXBhcnRpYWxzP3JlcGxhY2VIb2xkZXJzKGRhdGFbM10sUExBQ0VIT0xERVIpOnNvdXJjZVs0XX12YWx1ZT1zb3VyY2VbNV07aWYodmFsdWUpe3BhcnRpYWxzPQpkYXRhWzVdO2RhdGFbNV09cGFydGlhbHM/Y29tcG9zZUFyZ3NSaWdodChwYXJ0aWFscyx2YWx1ZSxzb3VyY2VbNl0pOnZhbHVlO2RhdGFbNl09cGFydGlhbHM/cmVwbGFjZUhvbGRlcnMoZGF0YVs1XSxQTEFDRUhPTERFUik6c291cmNlWzZdfXZhbHVlPXNvdXJjZVs3XTtpZih2YWx1ZSlkYXRhWzddPXZhbHVlO2lmKHNyY0JpdG1hc2smV1JBUF9BUllfRkxBRylkYXRhWzhdPWRhdGFbOF09PW51bGw/c291cmNlWzhdOm5hdGl2ZU1pbihkYXRhWzhdLHNvdXJjZVs4XSk7aWYoZGF0YVs5XT09bnVsbClkYXRhWzldPXNvdXJjZVs5XTtkYXRhWzBdPXNvdXJjZVswXTtkYXRhWzFdPW5ld0JpdG1hc2s7cmV0dXJuIGRhdGF9ZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCl7dmFyIHJlc3VsdD1bXTtpZihvYmplY3QhPW51bGwpZm9yKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKXtyZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSl9CmZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsc3RhcnQsdHJhbnNmb3JtKXtzdGFydD1uYXRpdmVNYXgoc3RhcnQ9PT11bmRlZmluZWQ/ZnVuYy5sZW5ndGgtMTpzdGFydCwwKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHMsaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1heChhcmdzLmxlbmd0aC1zdGFydCwwKSxhcnJheT1BcnJheShsZW5ndGgpO3doaWxlKCsraW5kZXg8bGVuZ3RoKWFycmF5W2luZGV4XT1hcmdzW3N0YXJ0K2luZGV4XTtpbmRleD0tMTt2YXIgb3RoZXJBcmdzPUFycmF5KHN0YXJ0KzEpO3doaWxlKCsraW5kZXg8c3RhcnQpb3RoZXJBcmdzW2luZGV4XT1hcmdzW2luZGV4XTtvdGhlckFyZ3Nbc3RhcnRdPXRyYW5zZm9ybShhcnJheSk7cmV0dXJuIGFwcGx5KGZ1bmMsdGhpcyxvdGhlckFyZ3MpfX1mdW5jdGlvbiBwYXJlbnQob2JqZWN0LHBhdGgpe3JldHVybiBwYXRoLmxlbmd0aDwyP29iamVjdDpiYXNlR2V0KG9iamVjdCxiYXNlU2xpY2UocGF0aCwwLC0xKSl9CmZ1bmN0aW9uIHJlb3JkZXIoYXJyYXksaW5kZXhlcyl7dmFyIGFyckxlbmd0aD1hcnJheS5sZW5ndGgsbGVuZ3RoPW5hdGl2ZU1pbihpbmRleGVzLmxlbmd0aCxhcnJMZW5ndGgpLG9sZEFycmF5PWNvcHlBcnJheShhcnJheSk7d2hpbGUobGVuZ3RoLS0pe3ZhciBpbmRleD1pbmRleGVzW2xlbmd0aF07YXJyYXlbbGVuZ3RoXT1pc0luZGV4KGluZGV4LGFyckxlbmd0aCk/b2xkQXJyYXlbaW5kZXhdOnVuZGVmaW5lZH1yZXR1cm4gYXJyYXl9dmFyIHNldERhdGE9c2hvcnRPdXQoYmFzZVNldERhdGEpO3ZhciBzZXRUaW1lb3V0PWN0eFNldFRpbWVvdXR8fGZ1bmN0aW9uKGZ1bmMsd2FpdCl7cmV0dXJuIHJvb3Quc2V0VGltZW91dChmdW5jLHdhaXQpfTt2YXIgc2V0VG9TdHJpbmc9c2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtmdW5jdGlvbiBzZXRXcmFwVG9TdHJpbmcod3JhcHBlcixyZWZlcmVuY2UsYml0bWFzayl7dmFyIHNvdXJjZT1yZWZlcmVuY2UrIiI7cmV0dXJuIHNldFRvU3RyaW5nKHdyYXBwZXIsCmluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSx1cGRhdGVXcmFwRGV0YWlscyhnZXRXcmFwRGV0YWlscyhzb3VyY2UpLGJpdG1hc2spKSl9ZnVuY3Rpb24gc2hvcnRPdXQoZnVuYyl7dmFyIGNvdW50PTAsbGFzdENhbGxlZD0wO3JldHVybiBmdW5jdGlvbigpe3ZhciBzdGFtcD1uYXRpdmVOb3coKSxyZW1haW5pbmc9SE9UX1NQQU4tKHN0YW1wLWxhc3RDYWxsZWQpO2xhc3RDYWxsZWQ9c3RhbXA7aWYocmVtYWluaW5nPjApe2lmKCsrY291bnQ+PUhPVF9DT1VOVClyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgY291bnQ9MDtyZXR1cm4gZnVuYy5hcHBseSh1bmRlZmluZWQsYXJndW1lbnRzKX19ZnVuY3Rpb24gc2h1ZmZsZVNlbGYoYXJyYXksc2l6ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGgsbGFzdEluZGV4PWxlbmd0aC0xO3NpemU9c2l6ZT09PXVuZGVmaW5lZD9sZW5ndGg6c2l6ZTt3aGlsZSgrK2luZGV4PHNpemUpe3ZhciByYW5kPWJhc2VSYW5kb20oaW5kZXgsbGFzdEluZGV4KSwKdmFsdWU9YXJyYXlbcmFuZF07YXJyYXlbcmFuZF09YXJyYXlbaW5kZXhdO2FycmF5W2luZGV4XT12YWx1ZX1hcnJheS5sZW5ndGg9c2l6ZTtyZXR1cm4gYXJyYXl9dmFyIHN0cmluZ1RvUGF0aD1tZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZyl7dmFyIHJlc3VsdD1bXTtpZihzdHJpbmcuY2hhckNvZGVBdCgwKT09PTQ2KXJlc3VsdC5wdXNoKCIiKTtzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLGZ1bmN0aW9uKG1hdGNoLG51bWJlcixxdW90ZSxzdWJTdHJpbmcpe3Jlc3VsdC5wdXNoKHF1b3RlP3N1YlN0cmluZy5yZXBsYWNlKHJlRXNjYXBlQ2hhciwiJDEiKTpudW1iZXJ8fG1hdGNoKX0pO3JldHVybiByZXN1bHR9KTtmdW5jdGlvbiB0b0tleSh2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT0ic3RyaW5nInx8aXNTeW1ib2wodmFsdWUpKXJldHVybiB2YWx1ZTt2YXIgcmVzdWx0PXZhbHVlKyIiO3JldHVybiByZXN1bHQ9PSIwIiYmMS92YWx1ZT09LUlORklOSVRZPyItMCI6cmVzdWx0fQpmdW5jdGlvbiB0b1NvdXJjZShmdW5jKXtpZihmdW5jIT1udWxsKXt0cnl7cmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpfWNhdGNoKGUpe310cnl7cmV0dXJuIGZ1bmMrIiJ9Y2F0Y2goZSQwKXt9fXJldHVybiIifWZ1bmN0aW9uIHVwZGF0ZVdyYXBEZXRhaWxzKGRldGFpbHMsYml0bWFzayl7YXJyYXlFYWNoKHdyYXBGbGFncyxmdW5jdGlvbihwYWlyKXt2YXIgdmFsdWU9Il8uIitwYWlyWzBdO2lmKGJpdG1hc2smcGFpclsxXSYmIWFycmF5SW5jbHVkZXMoZGV0YWlscyx2YWx1ZSkpZGV0YWlscy5wdXNoKHZhbHVlKX0pO3JldHVybiBkZXRhaWxzLnNvcnQoKX1mdW5jdGlvbiB3cmFwcGVyQ2xvbmUod3JhcHBlcil7aWYod3JhcHBlciBpbnN0YW5jZW9mIExhenlXcmFwcGVyKXJldHVybiB3cmFwcGVyLmNsb25lKCk7dmFyIHJlc3VsdD1uZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVyLl9fd3JhcHBlZF9fLHdyYXBwZXIuX19jaGFpbl9fKTtyZXN1bHQuX19hY3Rpb25zX189Y29weUFycmF5KHdyYXBwZXIuX19hY3Rpb25zX18pOwpyZXN1bHQuX19pbmRleF9fPXdyYXBwZXIuX19pbmRleF9fO3Jlc3VsdC5fX3ZhbHVlc19fPXdyYXBwZXIuX192YWx1ZXNfXztyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNodW5rKGFycmF5LHNpemUsZ3VhcmQpe2lmKGd1YXJkP2lzSXRlcmF0ZWVDYWxsKGFycmF5LHNpemUsZ3VhcmQpOnNpemU9PT11bmRlZmluZWQpc2l6ZT0xO2Vsc2Ugc2l6ZT1uYXRpdmVNYXgodG9JbnRlZ2VyKHNpemUpLDApO3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aHx8c2l6ZTwxKXJldHVybltdO3ZhciBpbmRleD0wLHJlc0luZGV4PTAscmVzdWx0PUFycmF5KG5hdGl2ZUNlaWwobGVuZ3RoL3NpemUpKTt3aGlsZShpbmRleDxsZW5ndGgpcmVzdWx0W3Jlc0luZGV4KytdPWJhc2VTbGljZShhcnJheSxpbmRleCxpbmRleCs9c2l6ZSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb21wYWN0KGFycmF5KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoLApyZXNJbmRleD0wLHJlc3VsdD1bXTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZih2YWx1ZSlyZXN1bHRbcmVzSW5kZXgrK109dmFsdWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb25jYXQoKXt2YXIgbGVuZ3RoPWFyZ3VtZW50cy5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTt2YXIgYXJncz1BcnJheShsZW5ndGgtMSksYXJyYXk9YXJndW1lbnRzWzBdLGluZGV4PWxlbmd0aDt3aGlsZShpbmRleC0tKWFyZ3NbaW5kZXgtMV09YXJndW1lbnRzW2luZGV4XTtyZXR1cm4gYXJyYXlQdXNoKGlzQXJyYXkoYXJyYXkpP2NvcHlBcnJheShhcnJheSk6W2FycmF5XSxiYXNlRmxhdHRlbihhcmdzLDEpKX12YXIgZGlmZmVyZW5jZT1iYXNlUmVzdChmdW5jdGlvbihhcnJheSx2YWx1ZXMpe3JldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSk/YmFzZURpZmZlcmVuY2UoYXJyYXksYmFzZUZsYXR0ZW4odmFsdWVzLDEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSkpOgpbXX0pO3ZhciBkaWZmZXJlbmNlQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXt2YXIgaXRlcmF0ZWU9bGFzdCh2YWx1ZXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT11bmRlZmluZWQ7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KT9iYXNlRGlmZmVyZW5jZShhcnJheSxiYXNlRmxhdHRlbih2YWx1ZXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6W119KTt2YXIgZGlmZmVyZW5jZVdpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXt2YXIgY29tcGFyYXRvcj1sYXN0KHZhbHVlcyk7aWYoaXNBcnJheUxpa2VPYmplY3QoY29tcGFyYXRvcikpY29tcGFyYXRvcj11bmRlZmluZWQ7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KT9iYXNlRGlmZmVyZW5jZShhcnJheSxiYXNlRmxhdHRlbih2YWx1ZXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSx1bmRlZmluZWQsY29tcGFyYXRvcik6CltdfSk7ZnVuY3Rpb24gZHJvcChhcnJheSxuLGd1YXJkKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuW107bj1ndWFyZHx8bj09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihuKTtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LG48MD8wOm4sbGVuZ3RoKX1mdW5jdGlvbiBkcm9wUmlnaHQoYXJyYXksbixndWFyZCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybltdO249Z3VhcmR8fG49PT11bmRlZmluZWQ/MTp0b0ludGVnZXIobik7bj1sZW5ndGgtbjtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LDAsbjwwPzA6bil9ZnVuY3Rpb24gZHJvcFJpZ2h0V2hpbGUoYXJyYXkscHJlZGljYXRlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlV2hpbGUoYXJyYXksZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLHRydWUsdHJ1ZSk6W119ZnVuY3Rpb24gZHJvcFdoaWxlKGFycmF5LHByZWRpY2F0ZSl7cmV0dXJuIGFycmF5JiYKYXJyYXkubGVuZ3RoP2Jhc2VXaGlsZShhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksdHJ1ZSk6W119ZnVuY3Rpb24gZmlsbChhcnJheSx2YWx1ZSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtpZihzdGFydCYmdHlwZW9mIHN0YXJ0IT0ibnVtYmVyIiYmaXNJdGVyYXRlZUNhbGwoYXJyYXksdmFsdWUsc3RhcnQpKXtzdGFydD0wO2VuZD1sZW5ndGh9cmV0dXJuIGJhc2VGaWxsKGFycmF5LHZhbHVlLHN0YXJ0LGVuZCl9ZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LHByZWRpY2F0ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4tMTt2YXIgaW5kZXg9ZnJvbUluZGV4PT1udWxsPzA6dG9JbnRlZ2VyKGZyb21JbmRleCk7aWYoaW5kZXg8MClpbmRleD1uYXRpdmVNYXgobGVuZ3RoK2luZGV4LDApO3JldHVybiBiYXNlRmluZEluZGV4KGFycmF5LApnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksaW5kZXgpfWZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgoYXJyYXkscHJlZGljYXRlLGZyb21JbmRleCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybi0xO3ZhciBpbmRleD1sZW5ndGgtMTtpZihmcm9tSW5kZXghPT11bmRlZmluZWQpe2luZGV4PXRvSW50ZWdlcihmcm9tSW5kZXgpO2luZGV4PWZyb21JbmRleDwwP25hdGl2ZU1heChsZW5ndGgraW5kZXgsMCk6bmF0aXZlTWluKGluZGV4LGxlbmd0aC0xKX1yZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksaW5kZXgsdHJ1ZSl9ZnVuY3Rpb24gZmxhdHRlbihhcnJheSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtyZXR1cm4gbGVuZ3RoP2Jhc2VGbGF0dGVuKGFycmF5LDEpOltdfWZ1bmN0aW9uIGZsYXR0ZW5EZWVwKGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoOwpyZXR1cm4gbGVuZ3RoP2Jhc2VGbGF0dGVuKGFycmF5LElORklOSVRZKTpbXX1mdW5jdGlvbiBmbGF0dGVuRGVwdGgoYXJyYXksZGVwdGgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtkZXB0aD1kZXB0aD09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihkZXB0aCk7cmV0dXJuIGJhc2VGbGF0dGVuKGFycmF5LGRlcHRoKX1mdW5jdGlvbiBmcm9tUGFpcnMocGFpcnMpe3ZhciBpbmRleD0tMSxsZW5ndGg9cGFpcnM9PW51bGw/MDpwYWlycy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcGFpcj1wYWlyc1tpbmRleF07cmVzdWx0W3BhaXJbMF1dPXBhaXJbMV19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBoZWFkKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9hcnJheVswXTp1bmRlZmluZWR9ZnVuY3Rpb24gaW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PQpudWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuLTE7dmFyIGluZGV4PWZyb21JbmRleD09bnVsbD8wOnRvSW50ZWdlcihmcm9tSW5kZXgpO2lmKGluZGV4PDApaW5kZXg9bmF0aXZlTWF4KGxlbmd0aCtpbmRleCwwKTtyZXR1cm4gYmFzZUluZGV4T2YoYXJyYXksdmFsdWUsaW5kZXgpfWZ1bmN0aW9uIGluaXRpYWwoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU2xpY2UoYXJyYXksMCwtMSk6W119dmFyIGludGVyc2VjdGlvbj1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBtYXBwZWQ9YXJyYXlNYXAoYXJyYXlzLGNhc3RBcnJheUxpa2VPYmplY3QpO3JldHVybiBtYXBwZWQubGVuZ3RoJiZtYXBwZWRbMF09PT1hcnJheXNbMF0/YmFzZUludGVyc2VjdGlvbihtYXBwZWQpOltdfSk7dmFyIGludGVyc2VjdGlvbkJ5PWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGl0ZXJhdGVlPWxhc3QoYXJyYXlzKSwKbWFwcGVkPWFycmF5TWFwKGFycmF5cyxjYXN0QXJyYXlMaWtlT2JqZWN0KTtpZihpdGVyYXRlZT09PWxhc3QobWFwcGVkKSlpdGVyYXRlZT11bmRlZmluZWQ7ZWxzZSBtYXBwZWQucG9wKCk7cmV0dXJuIG1hcHBlZC5sZW5ndGgmJm1hcHBlZFswXT09PWFycmF5c1swXT9iYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6W119KTt2YXIgaW50ZXJzZWN0aW9uV2l0aD1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBjb21wYXJhdG9yPWxhc3QoYXJyYXlzKSxtYXBwZWQ9YXJyYXlNYXAoYXJyYXlzLGNhc3RBcnJheUxpa2VPYmplY3QpO2NvbXBhcmF0b3I9dHlwZW9mIGNvbXBhcmF0b3I9PSJmdW5jdGlvbiI/Y29tcGFyYXRvcjp1bmRlZmluZWQ7aWYoY29tcGFyYXRvciltYXBwZWQucG9wKCk7cmV0dXJuIG1hcHBlZC5sZW5ndGgmJm1hcHBlZFswXT09PWFycmF5c1swXT9iYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCx1bmRlZmluZWQsY29tcGFyYXRvcik6CltdfSk7ZnVuY3Rpb24gam9pbihhcnJheSxzZXBhcmF0b3Ipe3JldHVybiBhcnJheT09bnVsbD8iIjpuYXRpdmVKb2luLmNhbGwoYXJyYXksc2VwYXJhdG9yKX1mdW5jdGlvbiBsYXN0KGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3JldHVybiBsZW5ndGg/YXJyYXlbbGVuZ3RoLTFdOnVuZGVmaW5lZH1mdW5jdGlvbiBsYXN0SW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4tMTt2YXIgaW5kZXg9bGVuZ3RoO2lmKGZyb21JbmRleCE9PXVuZGVmaW5lZCl7aW5kZXg9dG9JbnRlZ2VyKGZyb21JbmRleCk7aW5kZXg9aW5kZXg8MD9uYXRpdmVNYXgobGVuZ3RoK2luZGV4LDApOm5hdGl2ZU1pbihpbmRleCxsZW5ndGgtMSl9cmV0dXJuIHZhbHVlPT09dmFsdWU/c3RyaWN0TGFzdEluZGV4T2YoYXJyYXksdmFsdWUsaW5kZXgpOmJhc2VGaW5kSW5kZXgoYXJyYXksCmJhc2VJc05hTixpbmRleCx0cnVlKX1mdW5jdGlvbiBudGgoYXJyYXksbil7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZU50aChhcnJheSx0b0ludGVnZXIobikpOnVuZGVmaW5lZH12YXIgcHVsbD1iYXNlUmVzdChwdWxsQWxsKTtmdW5jdGlvbiBwdWxsQWxsKGFycmF5LHZhbHVlcyl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGgmJnZhbHVlcyYmdmFsdWVzLmxlbmd0aD9iYXNlUHVsbEFsbChhcnJheSx2YWx1ZXMpOmFycmF5fWZ1bmN0aW9uIHB1bGxBbGxCeShhcnJheSx2YWx1ZXMsaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoJiZ2YWx1ZXMmJnZhbHVlcy5sZW5ndGg/YmFzZVB1bGxBbGwoYXJyYXksdmFsdWVzLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTphcnJheX1mdW5jdGlvbiBwdWxsQWxsV2l0aChhcnJheSx2YWx1ZXMsY29tcGFyYXRvcil7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGgmJnZhbHVlcyYmdmFsdWVzLmxlbmd0aD9iYXNlUHVsbEFsbChhcnJheSwKdmFsdWVzLHVuZGVmaW5lZCxjb21wYXJhdG9yKTphcnJheX12YXIgcHVsbEF0PWZsYXRSZXN0KGZ1bmN0aW9uKGFycmF5LGluZGV4ZXMpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGgscmVzdWx0PWJhc2VBdChhcnJheSxpbmRleGVzKTtiYXNlUHVsbEF0KGFycmF5LGFycmF5TWFwKGluZGV4ZXMsZnVuY3Rpb24oaW5kZXgpe3JldHVybiBpc0luZGV4KGluZGV4LGxlbmd0aCk/K2luZGV4OmluZGV4fSkuc29ydChjb21wYXJlQXNjZW5kaW5nKSk7cmV0dXJuIHJlc3VsdH0pO2Z1bmN0aW9uIHJlbW92ZShhcnJheSxwcmVkaWNhdGUpe3ZhciByZXN1bHQ9W107aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm4gcmVzdWx0O3ZhciBpbmRleD0tMSxpbmRleGVzPVtdLGxlbmd0aD1hcnJheS5sZW5ndGg7cHJlZGljYXRlPWdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihwcmVkaWNhdGUodmFsdWUsCmluZGV4LGFycmF5KSl7cmVzdWx0LnB1c2godmFsdWUpO2luZGV4ZXMucHVzaChpbmRleCl9fWJhc2VQdWxsQXQoYXJyYXksaW5kZXhlcyk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiByZXZlcnNlKGFycmF5KXtyZXR1cm4gYXJyYXk9PW51bGw/YXJyYXk6bmF0aXZlUmV2ZXJzZS5jYWxsKGFycmF5KX1mdW5jdGlvbiBzbGljZShhcnJheSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtpZihlbmQmJnR5cGVvZiBlbmQhPSJudW1iZXIiJiZpc0l0ZXJhdGVlQ2FsbChhcnJheSxzdGFydCxlbmQpKXtzdGFydD0wO2VuZD1sZW5ndGh9ZWxzZXtzdGFydD1zdGFydD09bnVsbD8wOnRvSW50ZWdlcihzdGFydCk7ZW5kPWVuZD09PXVuZGVmaW5lZD9sZW5ndGg6dG9JbnRlZ2VyKGVuZCl9cmV0dXJuIGJhc2VTbGljZShhcnJheSxzdGFydCxlbmQpfWZ1bmN0aW9uIHNvcnRlZEluZGV4KGFycmF5LHZhbHVlKXtyZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LAp2YWx1ZSl9ZnVuY3Rpb24gc29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxpdGVyYXRlZSl7cmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LHZhbHVlLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKX1mdW5jdGlvbiBzb3J0ZWRJbmRleE9mKGFycmF5LHZhbHVlKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGxlbmd0aCl7dmFyIGluZGV4PWJhc2VTb3J0ZWRJbmRleChhcnJheSx2YWx1ZSk7aWYoaW5kZXg8bGVuZ3RoJiZlcShhcnJheVtpbmRleF0sdmFsdWUpKXJldHVybiBpbmRleH1yZXR1cm4tMX1mdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXgoYXJyYXksdmFsdWUpe3JldHVybiBiYXNlU29ydGVkSW5kZXgoYXJyYXksdmFsdWUsdHJ1ZSl9ZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4QnkoYXJyYXksdmFsdWUsaXRlcmF0ZWUpe3JldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSx0cnVlKX1mdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhPZihhcnJheSwKdmFsdWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYobGVuZ3RoKXt2YXIgaW5kZXg9YmFzZVNvcnRlZEluZGV4KGFycmF5LHZhbHVlLHRydWUpLTE7aWYoZXEoYXJyYXlbaW5kZXhdLHZhbHVlKSlyZXR1cm4gaW5kZXh9cmV0dXJuLTF9ZnVuY3Rpb24gc29ydGVkVW5pcShhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVNvcnRlZFVuaXEoYXJyYXkpOltdfWZ1bmN0aW9uIHNvcnRlZFVuaXFCeShhcnJheSxpdGVyYXRlZSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVNvcnRlZFVuaXEoYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpOltdfWZ1bmN0aW9uIHRhaWwoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU2xpY2UoYXJyYXksMSxsZW5ndGgpOltdfWZ1bmN0aW9uIHRha2UoYXJyYXksbixndWFyZCl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTsKbj1ndWFyZHx8bj09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihuKTtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LDAsbjwwPzA6bil9ZnVuY3Rpb24gdGFrZVJpZ2h0KGFycmF5LG4sZ3VhcmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtuPWd1YXJkfHxuPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKG4pO249bGVuZ3RoLW47cmV0dXJuIGJhc2VTbGljZShhcnJheSxuPDA/MDpuLGxlbmd0aCl9ZnVuY3Rpb24gdGFrZVJpZ2h0V2hpbGUoYXJyYXkscHJlZGljYXRlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlV2hpbGUoYXJyYXksZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLGZhbHNlLHRydWUpOltdfWZ1bmN0aW9uIHRha2VXaGlsZShhcnJheSxwcmVkaWNhdGUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VXaGlsZShhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMykpOltdfXZhciB1bmlvbj1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3JldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsCjEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSkpfSk7dmFyIHVuaW9uQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgaXRlcmF0ZWU9bGFzdChhcnJheXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT11bmRlZmluZWQ7cmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywxLGlzQXJyYXlMaWtlT2JqZWN0LHRydWUpLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKX0pO3ZhciB1bmlvbldpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgY29tcGFyYXRvcj1sYXN0KGFycmF5cyk7Y29tcGFyYXRvcj10eXBlb2YgY29tcGFyYXRvcj09ImZ1bmN0aW9uIj9jb21wYXJhdG9yOnVuZGVmaW5lZDtyZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLDEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSksdW5kZWZpbmVkLGNvbXBhcmF0b3IpfSk7ZnVuY3Rpb24gdW5pcShhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVVuaXEoYXJyYXkpOgpbXX1mdW5jdGlvbiB1bmlxQnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VVbmlxKGFycmF5LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTpbXX1mdW5jdGlvbiB1bmlxV2l0aChhcnJheSxjb21wYXJhdG9yKXtjb21wYXJhdG9yPXR5cGVvZiBjb21wYXJhdG9yPT0iZnVuY3Rpb24iP2NvbXBhcmF0b3I6dW5kZWZpbmVkO3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VVbmlxKGFycmF5LHVuZGVmaW5lZCxjb21wYXJhdG9yKTpbXX1mdW5jdGlvbiB1bnppcChhcnJheSl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTt2YXIgbGVuZ3RoPTA7YXJyYXk9YXJyYXlGaWx0ZXIoYXJyYXksZnVuY3Rpb24oZ3JvdXApe2lmKGlzQXJyYXlMaWtlT2JqZWN0KGdyb3VwKSl7bGVuZ3RoPW5hdGl2ZU1heChncm91cC5sZW5ndGgsbGVuZ3RoKTtyZXR1cm4gdHJ1ZX19KTtyZXR1cm4gYmFzZVRpbWVzKGxlbmd0aCxmdW5jdGlvbihpbmRleCl7cmV0dXJuIGFycmF5TWFwKGFycmF5LApiYXNlUHJvcGVydHkoaW5kZXgpKX0pfWZ1bmN0aW9uIHVuemlwV2l0aChhcnJheSxpdGVyYXRlZSl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTt2YXIgcmVzdWx0PXVuemlwKGFycmF5KTtpZihpdGVyYXRlZT09bnVsbClyZXR1cm4gcmVzdWx0O3JldHVybiBhcnJheU1hcChyZXN1bHQsZnVuY3Rpb24oZ3JvdXApe3JldHVybiBhcHBseShpdGVyYXRlZSx1bmRlZmluZWQsZ3JvdXApfSl9dmFyIHdpdGhvdXQ9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXtyZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpP2Jhc2VEaWZmZXJlbmNlKGFycmF5LHZhbHVlcyk6W119KTt2YXIgeG9yPWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7cmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLGlzQXJyYXlMaWtlT2JqZWN0KSl9KTt2YXIgeG9yQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgaXRlcmF0ZWU9bGFzdChhcnJheXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT0KdW5kZWZpbmVkO3JldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cyxpc0FycmF5TGlrZU9iamVjdCksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpfSk7dmFyIHhvcldpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgY29tcGFyYXRvcj1sYXN0KGFycmF5cyk7Y29tcGFyYXRvcj10eXBlb2YgY29tcGFyYXRvcj09ImZ1bmN0aW9uIj9jb21wYXJhdG9yOnVuZGVmaW5lZDtyZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsaXNBcnJheUxpa2VPYmplY3QpLHVuZGVmaW5lZCxjb21wYXJhdG9yKX0pO3ZhciB6aXA9YmFzZVJlc3QodW56aXApO2Z1bmN0aW9uIHppcE9iamVjdChwcm9wcyx2YWx1ZXMpe3JldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzfHxbXSx2YWx1ZXN8fFtdLGFzc2lnblZhbHVlKX1mdW5jdGlvbiB6aXBPYmplY3REZWVwKHByb3BzLHZhbHVlcyl7cmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHN8fFtdLHZhbHVlc3x8W10sYmFzZVNldCl9dmFyIHppcFdpdGg9CmJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGxlbmd0aD1hcnJheXMubGVuZ3RoLGl0ZXJhdGVlPWxlbmd0aD4xP2FycmF5c1tsZW5ndGgtMV06dW5kZWZpbmVkO2l0ZXJhdGVlPXR5cGVvZiBpdGVyYXRlZT09ImZ1bmN0aW9uIj8oYXJyYXlzLnBvcCgpLGl0ZXJhdGVlKTp1bmRlZmluZWQ7cmV0dXJuIHVuemlwV2l0aChhcnJheXMsaXRlcmF0ZWUpfSk7ZnVuY3Rpb24gY2hhaW4odmFsdWUpe3ZhciByZXN1bHQ9bG9kYXNoKHZhbHVlKTtyZXN1bHQuX19jaGFpbl9fPXRydWU7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB0YXAodmFsdWUsaW50ZXJjZXB0b3Ipe2ludGVyY2VwdG9yKHZhbHVlKTtyZXR1cm4gdmFsdWV9ZnVuY3Rpb24gdGhydSh2YWx1ZSxpbnRlcmNlcHRvcil7cmV0dXJuIGludGVyY2VwdG9yKHZhbHVlKX12YXIgd3JhcHBlckF0PWZsYXRSZXN0KGZ1bmN0aW9uKHBhdGhzKXt2YXIgbGVuZ3RoPXBhdGhzLmxlbmd0aCxzdGFydD1sZW5ndGg/cGF0aHNbMF06MCx2YWx1ZT0KdGhpcy5fX3dyYXBwZWRfXyxpbnRlcmNlcHRvcj1mdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlQXQob2JqZWN0LHBhdGhzKX07aWYobGVuZ3RoPjF8fHRoaXMuX19hY3Rpb25zX18ubGVuZ3RofHwhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpfHwhaXNJbmRleChzdGFydCkpcmV0dXJuIHRoaXMudGhydShpbnRlcmNlcHRvcik7dmFsdWU9dmFsdWUuc2xpY2Uoc3RhcnQsK3N0YXJ0KyhsZW5ndGg/MTowKSk7dmFsdWUuX19hY3Rpb25zX18ucHVzaCh7ImZ1bmMiOnRocnUsImFyZ3MiOltpbnRlcmNlcHRvcl0sInRoaXNBcmciOnVuZGVmaW5lZH0pO3JldHVybihuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSx0aGlzLl9fY2hhaW5fXykpLnRocnUoZnVuY3Rpb24oYXJyYXkpe2lmKGxlbmd0aCYmIWFycmF5Lmxlbmd0aClhcnJheS5wdXNoKHVuZGVmaW5lZCk7cmV0dXJuIGFycmF5fSl9KTtmdW5jdGlvbiB3cmFwcGVyQ2hhaW4oKXtyZXR1cm4gY2hhaW4odGhpcyl9ZnVuY3Rpb24gd3JhcHBlckNvbW1pdCgpe3JldHVybiBuZXcgTG9kYXNoV3JhcHBlcih0aGlzLnZhbHVlKCksCnRoaXMuX19jaGFpbl9fKX1mdW5jdGlvbiB3cmFwcGVyTmV4dCgpe2lmKHRoaXMuX192YWx1ZXNfXz09PXVuZGVmaW5lZCl0aGlzLl9fdmFsdWVzX189dG9BcnJheSh0aGlzLnZhbHVlKCkpO3ZhciBkb25lPXRoaXMuX19pbmRleF9fPj10aGlzLl9fdmFsdWVzX18ubGVuZ3RoLHZhbHVlPWRvbmU/dW5kZWZpbmVkOnRoaXMuX192YWx1ZXNfX1t0aGlzLl9faW5kZXhfXysrXTtyZXR1cm57ImRvbmUiOmRvbmUsInZhbHVlIjp2YWx1ZX19ZnVuY3Rpb24gd3JhcHBlclRvSXRlcmF0b3IoKXtyZXR1cm4gdGhpc31mdW5jdGlvbiB3cmFwcGVyUGxhbnQodmFsdWUpe3ZhciByZXN1bHQscGFyZW50PXRoaXM7d2hpbGUocGFyZW50IGluc3RhbmNlb2YgYmFzZUxvZGFzaCl7dmFyIGNsb25lPXdyYXBwZXJDbG9uZShwYXJlbnQpO2Nsb25lLl9faW5kZXhfXz0wO2Nsb25lLl9fdmFsdWVzX189dW5kZWZpbmVkO2lmKHJlc3VsdClwcmV2aW91cy5fX3dyYXBwZWRfXz1jbG9uZTtlbHNlIHJlc3VsdD1jbG9uZTsKdmFyIHByZXZpb3VzPWNsb25lO3BhcmVudD1wYXJlbnQuX193cmFwcGVkX199cHJldmlvdXMuX193cmFwcGVkX189dmFsdWU7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB3cmFwcGVyUmV2ZXJzZSgpe3ZhciB2YWx1ZT10aGlzLl9fd3JhcHBlZF9fO2lmKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpe3ZhciB3cmFwcGVkPXZhbHVlO2lmKHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoKXdyYXBwZWQ9bmV3IExhenlXcmFwcGVyKHRoaXMpO3dyYXBwZWQ9d3JhcHBlZC5yZXZlcnNlKCk7d3JhcHBlZC5fX2FjdGlvbnNfXy5wdXNoKHsiZnVuYyI6dGhydSwiYXJncyI6W3JldmVyc2VdLCJ0aGlzQXJnIjp1bmRlZmluZWR9KTtyZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlZCx0aGlzLl9fY2hhaW5fXyl9cmV0dXJuIHRoaXMudGhydShyZXZlcnNlKX1mdW5jdGlvbiB3cmFwcGVyVmFsdWUoKXtyZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZSh0aGlzLl9fd3JhcHBlZF9fLHRoaXMuX19hY3Rpb25zX18pfQp2YXIgY291bnRCeT1jcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LGtleSkpKytyZXN1bHRba2V5XTtlbHNlIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LDEpfSk7ZnVuY3Rpb24gZXZlcnkoY29sbGVjdGlvbixwcmVkaWNhdGUsZ3VhcmQpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlFdmVyeTpiYXNlRXZlcnk7aWYoZ3VhcmQmJmlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24scHJlZGljYXRlLGd1YXJkKSlwcmVkaWNhdGU9dW5kZWZpbmVkO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpKX1mdW5jdGlvbiBmaWx0ZXIoY29sbGVjdGlvbixwcmVkaWNhdGUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlGaWx0ZXI6YmFzZUZpbHRlcjtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSl9dmFyIGZpbmQ9CmNyZWF0ZUZpbmQoZmluZEluZGV4KTt2YXIgZmluZExhc3Q9Y3JlYXRlRmluZChmaW5kTGFzdEluZGV4KTtmdW5jdGlvbiBmbGF0TWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3JldHVybiBiYXNlRmxhdHRlbihtYXAoY29sbGVjdGlvbixpdGVyYXRlZSksMSl9ZnVuY3Rpb24gZmxhdE1hcERlZXAoY29sbGVjdGlvbixpdGVyYXRlZSl7cmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLGl0ZXJhdGVlKSxJTkZJTklUWSl9ZnVuY3Rpb24gZmxhdE1hcERlcHRoKGNvbGxlY3Rpb24saXRlcmF0ZWUsZGVwdGgpe2RlcHRoPWRlcHRoPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKGRlcHRoKTtyZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpLGRlcHRoKX1mdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlFYWNoOmJhc2VFYWNoO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjMpKX1mdW5jdGlvbiBmb3JFYWNoUmlnaHQoY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUVhY2hSaWdodDpiYXNlRWFjaFJpZ2h0O3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMykpfXZhciBncm91cEJ5PWNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LHZhbHVlLGtleSl7aWYoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsa2V5KSlyZXN1bHRba2V5XS5wdXNoKHZhbHVlKTtlbHNlIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LFt2YWx1ZV0pfSk7ZnVuY3Rpb24gaW5jbHVkZXMoY29sbGVjdGlvbix2YWx1ZSxmcm9tSW5kZXgsZ3VhcmQpe2NvbGxlY3Rpb249aXNBcnJheUxpa2UoY29sbGVjdGlvbik/Y29sbGVjdGlvbjp2YWx1ZXMoY29sbGVjdGlvbik7ZnJvbUluZGV4PWZyb21JbmRleCYmIWd1YXJkP3RvSW50ZWdlcihmcm9tSW5kZXgpOjA7dmFyIGxlbmd0aD1jb2xsZWN0aW9uLmxlbmd0aDsKaWYoZnJvbUluZGV4PDApZnJvbUluZGV4PW5hdGl2ZU1heChsZW5ndGgrZnJvbUluZGV4LDApO3JldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKT9mcm9tSW5kZXg8PWxlbmd0aCYmY29sbGVjdGlvbi5pbmRleE9mKHZhbHVlLGZyb21JbmRleCk+LTE6ISFsZW5ndGgmJmJhc2VJbmRleE9mKGNvbGxlY3Rpb24sdmFsdWUsZnJvbUluZGV4KT4tMX12YXIgaW52b2tlTWFwPWJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24scGF0aCxhcmdzKXt2YXIgaW5kZXg9LTEsaXNGdW5jPXR5cGVvZiBwYXRoPT0iZnVuY3Rpb24iLHJlc3VsdD1pc0FycmF5TGlrZShjb2xsZWN0aW9uKT9BcnJheShjb2xsZWN0aW9uLmxlbmd0aCk6W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSl7cmVzdWx0WysraW5kZXhdPWlzRnVuYz9hcHBseShwYXRoLHZhbHVlLGFyZ3MpOmJhc2VJbnZva2UodmFsdWUscGF0aCxhcmdzKX0pO3JldHVybiByZXN1bHR9KTt2YXIga2V5Qnk9Y3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsCnZhbHVlLGtleSl7YmFzZUFzc2lnblZhbHVlKHJlc3VsdCxrZXksdmFsdWUpfSk7ZnVuY3Rpb24gbWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlNYXA6YmFzZU1hcDtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpKX1mdW5jdGlvbiBvcmRlckJ5KGNvbGxlY3Rpb24saXRlcmF0ZWVzLG9yZGVycyxndWFyZCl7aWYoY29sbGVjdGlvbj09bnVsbClyZXR1cm5bXTtpZighaXNBcnJheShpdGVyYXRlZXMpKWl0ZXJhdGVlcz1pdGVyYXRlZXM9PW51bGw/W106W2l0ZXJhdGVlc107b3JkZXJzPWd1YXJkP3VuZGVmaW5lZDpvcmRlcnM7aWYoIWlzQXJyYXkob3JkZXJzKSlvcmRlcnM9b3JkZXJzPT1udWxsP1tdOltvcmRlcnNdO3JldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLGl0ZXJhdGVlcyxvcmRlcnMpfXZhciBwYXJ0aXRpb249Y3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsdmFsdWUsCmtleSl7cmVzdWx0W2tleT8wOjFdLnB1c2godmFsdWUpfSxmdW5jdGlvbigpe3JldHVybltbXSxbXV19KTtmdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbixpdGVyYXRlZSxhY2N1bXVsYXRvcil7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVJlZHVjZTpiYXNlUmVkdWNlLGluaXRBY2N1bT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSw0KSxhY2N1bXVsYXRvcixpbml0QWNjdW0sYmFzZUVhY2gpfWZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNvbGxlY3Rpb24saXRlcmF0ZWUsYWNjdW11bGF0b3Ipe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlSZWR1Y2VSaWdodDpiYXNlUmVkdWNlLGluaXRBY2N1bT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSw0KSxhY2N1bXVsYXRvcixpbml0QWNjdW0sYmFzZUVhY2hSaWdodCl9ZnVuY3Rpb24gcmVqZWN0KGNvbGxlY3Rpb24sCnByZWRpY2F0ZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUZpbHRlcjpiYXNlRmlsdGVyO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sbmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSkpfWZ1bmN0aW9uIHNhbXBsZShjb2xsZWN0aW9uKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5U2FtcGxlOmJhc2VTYW1wbGU7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbil9ZnVuY3Rpb24gc2FtcGxlU2l6ZShjb2xsZWN0aW9uLG4sZ3VhcmQpe2lmKGd1YXJkP2lzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sbixndWFyZCk6bj09PXVuZGVmaW5lZCluPTE7ZWxzZSBuPXRvSW50ZWdlcihuKTt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5U2FtcGxlU2l6ZTpiYXNlU2FtcGxlU2l6ZTtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLG4pfWZ1bmN0aW9uIHNodWZmbGUoY29sbGVjdGlvbil7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVNodWZmbGU6CmJhc2VTaHVmZmxlO3JldHVybiBmdW5jKGNvbGxlY3Rpb24pfWZ1bmN0aW9uIHNpemUoY29sbGVjdGlvbil7aWYoY29sbGVjdGlvbj09bnVsbClyZXR1cm4gMDtpZihpc0FycmF5TGlrZShjb2xsZWN0aW9uKSlyZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbik/c3RyaW5nU2l6ZShjb2xsZWN0aW9uKTpjb2xsZWN0aW9uLmxlbmd0aDt2YXIgdGFnPWdldFRhZyhjb2xsZWN0aW9uKTtpZih0YWc9PW1hcFRhZ3x8dGFnPT1zZXRUYWcpcmV0dXJuIGNvbGxlY3Rpb24uc2l6ZTtyZXR1cm4gYmFzZUtleXMoY29sbGVjdGlvbikubGVuZ3RofWZ1bmN0aW9uIHNvbWUoY29sbGVjdGlvbixwcmVkaWNhdGUsZ3VhcmQpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlTb21lOmJhc2VTb21lO2lmKGd1YXJkJiZpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLHByZWRpY2F0ZSxndWFyZCkpcHJlZGljYXRlPXVuZGVmaW5lZDtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwKMykpfXZhciBzb3J0Qnk9YmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbixpdGVyYXRlZXMpe2lmKGNvbGxlY3Rpb249PW51bGwpcmV0dXJuW107dmFyIGxlbmd0aD1pdGVyYXRlZXMubGVuZ3RoO2lmKGxlbmd0aD4xJiZpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLGl0ZXJhdGVlc1swXSxpdGVyYXRlZXNbMV0pKWl0ZXJhdGVlcz1bXTtlbHNlIGlmKGxlbmd0aD4yJiZpc0l0ZXJhdGVlQ2FsbChpdGVyYXRlZXNbMF0saXRlcmF0ZWVzWzFdLGl0ZXJhdGVlc1syXSkpaXRlcmF0ZWVzPVtpdGVyYXRlZXNbMF1dO3JldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLGJhc2VGbGF0dGVuKGl0ZXJhdGVlcywxKSxbXSl9KTt2YXIgbm93PWN0eE5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4gcm9vdC5EYXRlLm5vdygpfTtmdW5jdGlvbiBhZnRlcihuLGZ1bmMpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtuPXRvSW50ZWdlcihuKTsKcmV0dXJuIGZ1bmN0aW9uKCl7aWYoLS1uPDEpcmV0dXJuIGZ1bmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBhcnkoZnVuYyxuLGd1YXJkKXtuPWd1YXJkP3VuZGVmaW5lZDpuO249ZnVuYyYmbj09bnVsbD9mdW5jLmxlbmd0aDpuO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9BUllfRkxBRyx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsbil9ZnVuY3Rpb24gYmVmb3JlKG4sZnVuYyl7dmFyIHJlc3VsdDtpZih0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7bj10b0ludGVnZXIobik7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoLS1uPjApcmVzdWx0PWZ1bmMuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKG48PTEpZnVuYz11bmRlZmluZWQ7cmV0dXJuIHJlc3VsdH19dmFyIGJpbmQ9YmFzZVJlc3QoZnVuY3Rpb24oZnVuYyx0aGlzQXJnLHBhcnRpYWxzKXt2YXIgYml0bWFzaz1XUkFQX0JJTkRfRkxBRzsKaWYocGFydGlhbHMubGVuZ3RoKXt2YXIgaG9sZGVycz1yZXBsYWNlSG9sZGVycyhwYXJ0aWFscyxnZXRIb2xkZXIoYmluZCkpO2JpdG1hc2t8PVdSQVBfUEFSVElBTF9GTEFHfXJldHVybiBjcmVhdGVXcmFwKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzLGhvbGRlcnMpfSk7dmFyIGJpbmRLZXk9YmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LGtleSxwYXJ0aWFscyl7dmFyIGJpdG1hc2s9V1JBUF9CSU5EX0ZMQUd8V1JBUF9CSU5EX0tFWV9GTEFHO2lmKHBhcnRpYWxzLmxlbmd0aCl7dmFyIGhvbGRlcnM9cmVwbGFjZUhvbGRlcnMocGFydGlhbHMsZ2V0SG9sZGVyKGJpbmRLZXkpKTtiaXRtYXNrfD1XUkFQX1BBUlRJQUxfRkxBR31yZXR1cm4gY3JlYXRlV3JhcChrZXksYml0bWFzayxvYmplY3QscGFydGlhbHMsaG9sZGVycyl9KTtmdW5jdGlvbiBjdXJyeShmdW5jLGFyaXR5LGd1YXJkKXthcml0eT1ndWFyZD91bmRlZmluZWQ6YXJpdHk7dmFyIHJlc3VsdD1jcmVhdGVXcmFwKGZ1bmMsCldSQVBfQ1VSUllfRkxBRyx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLGFyaXR5KTtyZXN1bHQucGxhY2Vob2xkZXI9Y3VycnkucGxhY2Vob2xkZXI7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjdXJyeVJpZ2h0KGZ1bmMsYXJpdHksZ3VhcmQpe2FyaXR5PWd1YXJkP3VuZGVmaW5lZDphcml0eTt2YXIgcmVzdWx0PWNyZWF0ZVdyYXAoZnVuYyxXUkFQX0NVUlJZX1JJR0hUX0ZMQUcsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCxhcml0eSk7cmVzdWx0LnBsYWNlaG9sZGVyPWN1cnJ5UmlnaHQucGxhY2Vob2xkZXI7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBkZWJvdW5jZShmdW5jLHdhaXQsb3B0aW9ucyl7dmFyIGxhc3RBcmdzLGxhc3RUaGlzLG1heFdhaXQscmVzdWx0LHRpbWVySWQsbGFzdENhbGxUaW1lLGxhc3RJbnZva2VUaW1lPTAsbGVhZGluZz1mYWxzZSxtYXhpbmc9ZmFsc2UsdHJhaWxpbmc9dHJ1ZTsKaWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3dhaXQ9dG9OdW1iZXIod2FpdCl8fDA7aWYoaXNPYmplY3Qob3B0aW9ucykpe2xlYWRpbmc9ISFvcHRpb25zLmxlYWRpbmc7bWF4aW5nPSJtYXhXYWl0ImluIG9wdGlvbnM7bWF4V2FpdD1tYXhpbmc/bmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCl8fDAsd2FpdCk6bWF4V2FpdDt0cmFpbGluZz0idHJhaWxpbmciaW4gb3B0aW9ucz8hIW9wdGlvbnMudHJhaWxpbmc6dHJhaWxpbmd9ZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKXt2YXIgYXJncz1sYXN0QXJncyx0aGlzQXJnPWxhc3RUaGlzO2xhc3RBcmdzPWxhc3RUaGlzPXVuZGVmaW5lZDtsYXN0SW52b2tlVGltZT10aW1lO3Jlc3VsdD1mdW5jLmFwcGx5KHRoaXNBcmcsYXJncyk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKXtsYXN0SW52b2tlVGltZT10aW1lO3RpbWVySWQ9c2V0VGltZW91dCh0aW1lckV4cGlyZWQsCndhaXQpO3JldHVybiBsZWFkaW5nP2ludm9rZUZ1bmModGltZSk6cmVzdWx0fWZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSl7dmFyIHRpbWVTaW5jZUxhc3RDYWxsPXRpbWUtbGFzdENhbGxUaW1lLHRpbWVTaW5jZUxhc3RJbnZva2U9dGltZS1sYXN0SW52b2tlVGltZSx0aW1lV2FpdGluZz13YWl0LXRpbWVTaW5jZUxhc3RDYWxsO3JldHVybiBtYXhpbmc/bmF0aXZlTWluKHRpbWVXYWl0aW5nLG1heFdhaXQtdGltZVNpbmNlTGFzdEludm9rZSk6dGltZVdhaXRpbmd9ZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpe3ZhciB0aW1lU2luY2VMYXN0Q2FsbD10aW1lLWxhc3RDYWxsVGltZSx0aW1lU2luY2VMYXN0SW52b2tlPXRpbWUtbGFzdEludm9rZVRpbWU7cmV0dXJuIGxhc3RDYWxsVGltZT09PXVuZGVmaW5lZHx8dGltZVNpbmNlTGFzdENhbGw+PXdhaXR8fHRpbWVTaW5jZUxhc3RDYWxsPDB8fG1heGluZyYmdGltZVNpbmNlTGFzdEludm9rZT49bWF4V2FpdH1mdW5jdGlvbiB0aW1lckV4cGlyZWQoKXt2YXIgdGltZT0Kbm93KCk7aWYoc2hvdWxkSW52b2tlKHRpbWUpKXJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7dGltZXJJZD1zZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCxyZW1haW5pbmdXYWl0KHRpbWUpKX1mdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSl7dGltZXJJZD11bmRlZmluZWQ7aWYodHJhaWxpbmcmJmxhc3RBcmdzKXJldHVybiBpbnZva2VGdW5jKHRpbWUpO2xhc3RBcmdzPWxhc3RUaGlzPXVuZGVmaW5lZDtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNhbmNlbCgpe2lmKHRpbWVySWQhPT11bmRlZmluZWQpY2xlYXJUaW1lb3V0KHRpbWVySWQpO2xhc3RJbnZva2VUaW1lPTA7bGFzdEFyZ3M9bGFzdENhbGxUaW1lPWxhc3RUaGlzPXRpbWVySWQ9dW5kZWZpbmVkfWZ1bmN0aW9uIGZsdXNoKCl7cmV0dXJuIHRpbWVySWQ9PT11bmRlZmluZWQ/cmVzdWx0OnRyYWlsaW5nRWRnZShub3coKSl9ZnVuY3Rpb24gZGVib3VuY2VkKCl7dmFyIHRpbWU9bm93KCksaXNJbnZva2luZz1zaG91bGRJbnZva2UodGltZSk7Cmxhc3RBcmdzPWFyZ3VtZW50cztsYXN0VGhpcz10aGlzO2xhc3RDYWxsVGltZT10aW1lO2lmKGlzSW52b2tpbmcpe2lmKHRpbWVySWQ9PT11bmRlZmluZWQpcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7aWYobWF4aW5nKXt0aW1lcklkPXNldFRpbWVvdXQodGltZXJFeHBpcmVkLHdhaXQpO3JldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSl9fWlmKHRpbWVySWQ9PT11bmRlZmluZWQpdGltZXJJZD1zZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCx3YWl0KTtyZXR1cm4gcmVzdWx0fWRlYm91bmNlZC5jYW5jZWw9Y2FuY2VsO2RlYm91bmNlZC5mbHVzaD1mbHVzaDtyZXR1cm4gZGVib3VuY2VkfXZhciBkZWZlcj1iYXNlUmVzdChmdW5jdGlvbihmdW5jLGFyZ3Mpe3JldHVybiBiYXNlRGVsYXkoZnVuYywxLGFyZ3MpfSk7dmFyIGRlbGF5PWJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsd2FpdCxhcmdzKXtyZXR1cm4gYmFzZURlbGF5KGZ1bmMsdG9OdW1iZXIod2FpdCl8fDAsYXJncyl9KTsKZnVuY3Rpb24gZmxpcChmdW5jKXtyZXR1cm4gY3JlYXRlV3JhcChmdW5jLFdSQVBfRkxJUF9GTEFHKX1mdW5jdGlvbiBtZW1vaXplKGZ1bmMscmVzb2x2ZXIpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24ifHxyZXNvbHZlciE9bnVsbCYmdHlwZW9mIHJlc29sdmVyIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTt2YXIgbWVtb2l6ZWQ9ZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHMsa2V5PXJlc29sdmVyP3Jlc29sdmVyLmFwcGx5KHRoaXMsYXJncyk6YXJnc1swXSxjYWNoZT1tZW1vaXplZC5jYWNoZTtpZihjYWNoZS5oYXMoa2V5KSlyZXR1cm4gY2FjaGUuZ2V0KGtleSk7dmFyIHJlc3VsdD1mdW5jLmFwcGx5KHRoaXMsYXJncyk7bWVtb2l6ZWQuY2FjaGU9Y2FjaGUuc2V0KGtleSxyZXN1bHQpfHxjYWNoZTtyZXR1cm4gcmVzdWx0fTttZW1vaXplZC5jYWNoZT1uZXcgKG1lbW9pemUuQ2FjaGV8fE1hcENhY2hlKTtyZXR1cm4gbWVtb2l6ZWR9Cm1lbW9pemUuQ2FjaGU9TWFwQ2FjaGU7ZnVuY3Rpb24gbmVnYXRlKHByZWRpY2F0ZSl7aWYodHlwZW9mIHByZWRpY2F0ZSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGFyZ3M9YXJndW1lbnRzO3N3aXRjaChhcmdzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzKTtjYXNlIDE6cmV0dXJuIXByZWRpY2F0ZS5jYWxsKHRoaXMsYXJnc1swXSk7Y2FzZSAyOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzLGFyZ3NbMF0sYXJnc1sxXSk7Y2FzZSAzOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdKX1yZXR1cm4hcHJlZGljYXRlLmFwcGx5KHRoaXMsYXJncyl9fWZ1bmN0aW9uIG9uY2UoZnVuYyl7cmV0dXJuIGJlZm9yZSgyLGZ1bmMpfXZhciBvdmVyQXJncz1jYXN0UmVzdChmdW5jdGlvbihmdW5jLHRyYW5zZm9ybXMpe3RyYW5zZm9ybXM9dHJhbnNmb3Jtcy5sZW5ndGg9PQoxJiZpc0FycmF5KHRyYW5zZm9ybXNbMF0pP2FycmF5TWFwKHRyYW5zZm9ybXNbMF0sYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTphcnJheU1hcChiYXNlRmxhdHRlbih0cmFuc2Zvcm1zLDEpLGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7dmFyIGZ1bmNzTGVuZ3RoPXRyYW5zZm9ybXMubGVuZ3RoO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1pbihhcmdzLmxlbmd0aCxmdW5jc0xlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpYXJnc1tpbmRleF09dHJhbnNmb3Jtc1tpbmRleF0uY2FsbCh0aGlzLGFyZ3NbaW5kZXhdKTtyZXR1cm4gYXBwbHkoZnVuYyx0aGlzLGFyZ3MpfSl9KTt2YXIgcGFydGlhbD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLHBhcnRpYWxzKXt2YXIgaG9sZGVycz1yZXBsYWNlSG9sZGVycyhwYXJ0aWFscyxnZXRIb2xkZXIocGFydGlhbCkpO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9QQVJUSUFMX0ZMQUcsCnVuZGVmaW5lZCxwYXJ0aWFscyxob2xkZXJzKX0pO3ZhciBwYXJ0aWFsUmlnaHQ9YmFzZVJlc3QoZnVuY3Rpb24oZnVuYyxwYXJ0aWFscyl7dmFyIGhvbGRlcnM9cmVwbGFjZUhvbGRlcnMocGFydGlhbHMsZ2V0SG9sZGVyKHBhcnRpYWxSaWdodCkpO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcsdW5kZWZpbmVkLHBhcnRpYWxzLGhvbGRlcnMpfSk7dmFyIHJlYXJnPWZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmMsaW5kZXhlcyl7cmV0dXJuIGNyZWF0ZVdyYXAoZnVuYyxXUkFQX1JFQVJHX0ZMQUcsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsaW5kZXhlcyl9KTtmdW5jdGlvbiByZXN0KGZ1bmMsc3RhcnQpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtzdGFydD1zdGFydD09PXVuZGVmaW5lZD9zdGFydDp0b0ludGVnZXIoc3RhcnQpO3JldHVybiBiYXNlUmVzdChmdW5jLHN0YXJ0KX0KZnVuY3Rpb24gc3ByZWFkKGZ1bmMsc3RhcnQpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtzdGFydD1zdGFydD09bnVsbD8wOm5hdGl2ZU1heCh0b0ludGVnZXIoc3RhcnQpLDApO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgYXJyYXk9YXJnc1tzdGFydF0sb3RoZXJBcmdzPWNhc3RTbGljZShhcmdzLDAsc3RhcnQpO2lmKGFycmF5KWFycmF5UHVzaChvdGhlckFyZ3MsYXJyYXkpO3JldHVybiBhcHBseShmdW5jLHRoaXMsb3RoZXJBcmdzKX0pfWZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsd2FpdCxvcHRpb25zKXt2YXIgbGVhZGluZz10cnVlLHRyYWlsaW5nPXRydWU7aWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO2lmKGlzT2JqZWN0KG9wdGlvbnMpKXtsZWFkaW5nPSJsZWFkaW5nImluIG9wdGlvbnM/ISFvcHRpb25zLmxlYWRpbmc6CmxlYWRpbmc7dHJhaWxpbmc9InRyYWlsaW5nImluIG9wdGlvbnM/ISFvcHRpb25zLnRyYWlsaW5nOnRyYWlsaW5nfXJldHVybiBkZWJvdW5jZShmdW5jLHdhaXQseyJsZWFkaW5nIjpsZWFkaW5nLCJtYXhXYWl0Ijp3YWl0LCJ0cmFpbGluZyI6dHJhaWxpbmd9KX1mdW5jdGlvbiB1bmFyeShmdW5jKXtyZXR1cm4gYXJ5KGZ1bmMsMSl9ZnVuY3Rpb24gd3JhcCh2YWx1ZSx3cmFwcGVyKXtyZXR1cm4gcGFydGlhbChjYXN0RnVuY3Rpb24od3JhcHBlciksdmFsdWUpfWZ1bmN0aW9uIGNhc3RBcnJheSgpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybltdO3ZhciB2YWx1ZT1hcmd1bWVudHNbMF07cmV0dXJuIGlzQXJyYXkodmFsdWUpP3ZhbHVlOlt2YWx1ZV19ZnVuY3Rpb24gY2xvbmUodmFsdWUpe3JldHVybiBiYXNlQ2xvbmUodmFsdWUsQ0xPTkVfU1lNQk9MU19GTEFHKX1mdW5jdGlvbiBjbG9uZVdpdGgodmFsdWUsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09CiJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSxDTE9ORV9TWU1CT0xTX0ZMQUcsY3VzdG9taXplcil9ZnVuY3Rpb24gY2xvbmVEZWVwKHZhbHVlKXtyZXR1cm4gYmFzZUNsb25lKHZhbHVlLENMT05FX0RFRVBfRkxBR3xDTE9ORV9TWU1CT0xTX0ZMQUcpfWZ1bmN0aW9uIGNsb25lRGVlcFdpdGgodmFsdWUsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09ImZ1bmN0aW9uIj9jdXN0b21pemVyOnVuZGVmaW5lZDtyZXR1cm4gYmFzZUNsb25lKHZhbHVlLENMT05FX0RFRVBfRkxBR3xDTE9ORV9TWU1CT0xTX0ZMQUcsY3VzdG9taXplcil9ZnVuY3Rpb24gY29uZm9ybXNUbyhvYmplY3Qsc291cmNlKXtyZXR1cm4gc291cmNlPT1udWxsfHxiYXNlQ29uZm9ybXNUbyhvYmplY3Qsc291cmNlLGtleXMoc291cmNlKSl9ZnVuY3Rpb24gZXEodmFsdWUsb3RoZXIpe3JldHVybiB2YWx1ZT09PW90aGVyfHx2YWx1ZSE9PXZhbHVlJiYKb3RoZXIhPT1vdGhlcn12YXIgZ3Q9Y3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlR3QpO3ZhciBndGU9Y3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPj1vdGhlcn0pO3ZhciBpc0FyZ3VtZW50cz1iYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9iYXNlSXNBcmd1bWVudHM6ZnVuY3Rpb24odmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCJjYWxsZWUiKSYmIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsImNhbGxlZSIpfTt2YXIgaXNBcnJheT1BcnJheS5pc0FycmF5O3ZhciBpc0FycmF5QnVmZmVyPW5vZGVJc0FycmF5QnVmZmVyP2Jhc2VVbmFyeShub2RlSXNBcnJheUJ1ZmZlcik6YmFzZUlzQXJyYXlCdWZmZXI7ZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpe3JldHVybiB2YWx1ZSE9bnVsbCYmaXNMZW5ndGgodmFsdWUubGVuZ3RoKSYmCiFpc0Z1bmN0aW9uKHZhbHVlKX1mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmlzQXJyYXlMaWtlKHZhbHVlKX1mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpe3JldHVybiB2YWx1ZT09PXRydWV8fHZhbHVlPT09ZmFsc2V8fGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1ib29sVGFnfXZhciBpc0J1ZmZlcj1uYXRpdmVJc0J1ZmZlcnx8c3R1YkZhbHNlO3ZhciBpc0RhdGU9bm9kZUlzRGF0ZT9iYXNlVW5hcnkobm9kZUlzRGF0ZSk6YmFzZUlzRGF0ZTtmdW5jdGlvbiBpc0VsZW1lbnQodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZ2YWx1ZS5ub2RlVHlwZT09PTEmJiFpc1BsYWluT2JqZWN0KHZhbHVlKX1mdW5jdGlvbiBpc0VtcHR5KHZhbHVlKXtpZih2YWx1ZT09bnVsbClyZXR1cm4gdHJ1ZTtpZihpc0FycmF5TGlrZSh2YWx1ZSkmJihpc0FycmF5KHZhbHVlKXx8dHlwZW9mIHZhbHVlPT0KInN0cmluZyJ8fHR5cGVvZiB2YWx1ZS5zcGxpY2U9PSJmdW5jdGlvbiJ8fGlzQnVmZmVyKHZhbHVlKXx8aXNUeXBlZEFycmF5KHZhbHVlKXx8aXNBcmd1bWVudHModmFsdWUpKSlyZXR1cm4hdmFsdWUubGVuZ3RoO3ZhciB0YWc9Z2V0VGFnKHZhbHVlKTtpZih0YWc9PW1hcFRhZ3x8dGFnPT1zZXRUYWcpcmV0dXJuIXZhbHVlLnNpemU7aWYoaXNQcm90b3R5cGUodmFsdWUpKXJldHVybiFiYXNlS2V5cyh2YWx1ZSkubGVuZ3RoO2Zvcih2YXIga2V5IGluIHZhbHVlKWlmKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsa2V5KSlyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWV9ZnVuY3Rpb24gaXNFcXVhbCh2YWx1ZSxvdGhlcil7cmV0dXJuIGJhc2VJc0VxdWFsKHZhbHVlLG90aGVyKX1mdW5jdGlvbiBpc0VxdWFsV2l0aCh2YWx1ZSxvdGhlcixjdXN0b21pemVyKXtjdXN0b21pemVyPXR5cGVvZiBjdXN0b21pemVyPT0iZnVuY3Rpb24iP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3ZhciByZXN1bHQ9CmN1c3RvbWl6ZXI/Y3VzdG9taXplcih2YWx1ZSxvdGhlcik6dW5kZWZpbmVkO3JldHVybiByZXN1bHQ9PT11bmRlZmluZWQ/YmFzZUlzRXF1YWwodmFsdWUsb3RoZXIsdW5kZWZpbmVkLGN1c3RvbWl6ZXIpOiEhcmVzdWx0fWZ1bmN0aW9uIGlzRXJyb3IodmFsdWUpe2lmKCFpc09iamVjdExpa2UodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdGFnPWJhc2VHZXRUYWcodmFsdWUpO3JldHVybiB0YWc9PWVycm9yVGFnfHx0YWc9PWRvbUV4Y1RhZ3x8dHlwZW9mIHZhbHVlLm1lc3NhZ2U9PSJzdHJpbmciJiZ0eXBlb2YgdmFsdWUubmFtZT09InN0cmluZyImJiFpc1BsYWluT2JqZWN0KHZhbHVlKX1mdW5jdGlvbiBpc0Zpbml0ZSh2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09Im51bWJlciImJm5hdGl2ZUlzRmluaXRlKHZhbHVlKX1mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKXtpZighaXNPYmplY3QodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdGFnPWJhc2VHZXRUYWcodmFsdWUpO3JldHVybiB0YWc9PQpmdW5jVGFnfHx0YWc9PWdlblRhZ3x8dGFnPT1hc3luY1RhZ3x8dGFnPT1wcm94eVRhZ31mdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJudW1iZXIiJiZ2YWx1ZT09dG9JbnRlZ2VyKHZhbHVlKX1mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09Im51bWJlciImJnZhbHVlPi0xJiZ2YWx1ZSUxPT0wJiZ2YWx1ZTw9TUFYX1NBRkVfSU5URUdFUn1mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO3JldHVybiB2YWx1ZSE9bnVsbCYmKHR5cGU9PSJvYmplY3QifHx0eXBlPT0iZnVuY3Rpb24iKX1mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpe3JldHVybiB2YWx1ZSE9bnVsbCYmdHlwZW9mIHZhbHVlPT0ib2JqZWN0In12YXIgaXNNYXA9bm9kZUlzTWFwP2Jhc2VVbmFyeShub2RlSXNNYXApOmJhc2VJc01hcDtmdW5jdGlvbiBpc01hdGNoKG9iamVjdCxzb3VyY2Upe3JldHVybiBvYmplY3Q9PT0Kc291cmNlfHxiYXNlSXNNYXRjaChvYmplY3Qsc291cmNlLGdldE1hdGNoRGF0YShzb3VyY2UpKX1mdW5jdGlvbiBpc01hdGNoV2l0aChvYmplY3Qsc291cmNlLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PSJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIGJhc2VJc01hdGNoKG9iamVjdCxzb3VyY2UsZ2V0TWF0Y2hEYXRhKHNvdXJjZSksY3VzdG9taXplcil9ZnVuY3Rpb24gaXNOYU4odmFsdWUpe3JldHVybiBpc051bWJlcih2YWx1ZSkmJnZhbHVlIT0rdmFsdWV9ZnVuY3Rpb24gaXNOYXRpdmUodmFsdWUpe2lmKGlzTWFza2FibGUodmFsdWUpKXRocm93IG5ldyBFcnJvcihDT1JFX0VSUk9SX1RFWFQpO3JldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpfWZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09bnVsbH1mdW5jdGlvbiBpc05pbCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT1udWxsfWZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0KIm51bWJlciJ8fGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1udW1iZXJUYWd9ZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSl7aWYoIWlzT2JqZWN0TGlrZSh2YWx1ZSl8fGJhc2VHZXRUYWcodmFsdWUpIT1vYmplY3RUYWcpcmV0dXJuIGZhbHNlO3ZhciBwcm90bz1nZXRQcm90b3R5cGUodmFsdWUpO2lmKHByb3RvPT09bnVsbClyZXR1cm4gdHJ1ZTt2YXIgQ3Rvcj1oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCJjb25zdHJ1Y3RvciIpJiZwcm90by5jb25zdHJ1Y3RvcjtyZXR1cm4gdHlwZW9mIEN0b3I9PSJmdW5jdGlvbiImJkN0b3IgaW5zdGFuY2VvZiBDdG9yJiZmdW5jVG9TdHJpbmcuY2FsbChDdG9yKT09b2JqZWN0Q3RvclN0cmluZ312YXIgaXNSZWdFeHA9bm9kZUlzUmVnRXhwP2Jhc2VVbmFyeShub2RlSXNSZWdFeHApOmJhc2VJc1JlZ0V4cDtmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKXtyZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSYmdmFsdWU+PQotTUFYX1NBRkVfSU5URUdFUiYmdmFsdWU8PU1BWF9TQUZFX0lOVEVHRVJ9dmFyIGlzU2V0PW5vZGVJc1NldD9iYXNlVW5hcnkobm9kZUlzU2V0KTpiYXNlSXNTZXQ7ZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJzdHJpbmcifHwhaXNBcnJheSh2YWx1ZSkmJmlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1zdHJpbmdUYWd9ZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJzeW1ib2wifHxpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09c3ltYm9sVGFnfXZhciBpc1R5cGVkQXJyYXk9bm9kZUlzVHlwZWRBcnJheT9iYXNlVW5hcnkobm9kZUlzVHlwZWRBcnJheSk6YmFzZUlzVHlwZWRBcnJheTtmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09dW5kZWZpbmVkfWZ1bmN0aW9uIGlzV2Vha01hcCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJgpnZXRUYWcodmFsdWUpPT13ZWFrTWFwVGFnfWZ1bmN0aW9uIGlzV2Vha1NldCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT13ZWFrU2V0VGFnfXZhciBsdD1jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VMdCk7dmFyIGx0ZT1jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLG90aGVyKXtyZXR1cm4gdmFsdWU8PW90aGVyfSk7ZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSl7aWYoIXZhbHVlKXJldHVybltdO2lmKGlzQXJyYXlMaWtlKHZhbHVlKSlyZXR1cm4gaXNTdHJpbmcodmFsdWUpP3N0cmluZ1RvQXJyYXkodmFsdWUpOmNvcHlBcnJheSh2YWx1ZSk7aWYoc3ltSXRlcmF0b3ImJnZhbHVlW3N5bUl0ZXJhdG9yXSlyZXR1cm4gaXRlcmF0b3JUb0FycmF5KHZhbHVlW3N5bUl0ZXJhdG9yXSgpKTt2YXIgdGFnPWdldFRhZyh2YWx1ZSksZnVuYz10YWc9PW1hcFRhZz9tYXBUb0FycmF5OnRhZz09c2V0VGFnP3NldFRvQXJyYXk6CnZhbHVlcztyZXR1cm4gZnVuYyh2YWx1ZSl9ZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpe2lmKCF2YWx1ZSlyZXR1cm4gdmFsdWU9PT0wP3ZhbHVlOjA7dmFsdWU9dG9OdW1iZXIodmFsdWUpO2lmKHZhbHVlPT09SU5GSU5JVFl8fHZhbHVlPT09LUlORklOSVRZKXt2YXIgc2lnbj12YWx1ZTwwPy0xOjE7cmV0dXJuIHNpZ24qTUFYX0lOVEVHRVJ9cmV0dXJuIHZhbHVlPT09dmFsdWU/dmFsdWU6MH1mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpe3ZhciByZXN1bHQ9dG9GaW5pdGUodmFsdWUpLHJlbWFpbmRlcj1yZXN1bHQlMTtyZXR1cm4gcmVzdWx0PT09cmVzdWx0P3JlbWFpbmRlcj9yZXN1bHQtcmVtYWluZGVyOnJlc3VsdDowfWZ1bmN0aW9uIHRvTGVuZ3RoKHZhbHVlKXtyZXR1cm4gdmFsdWU/YmFzZUNsYW1wKHRvSW50ZWdlcih2YWx1ZSksMCxNQVhfQVJSQVlfTEVOR1RIKTowfWZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKXtpZih0eXBlb2YgdmFsdWU9PSJudW1iZXIiKXJldHVybiB2YWx1ZTsKaWYoaXNTeW1ib2wodmFsdWUpKXJldHVybiBOQU47aWYoaXNPYmplY3QodmFsdWUpKXt2YXIgb3RoZXI9dHlwZW9mIHZhbHVlLnZhbHVlT2Y9PSJmdW5jdGlvbiI/dmFsdWUudmFsdWVPZigpOnZhbHVlO3ZhbHVlPWlzT2JqZWN0KG90aGVyKT9vdGhlcisiIjpvdGhlcn1pZih0eXBlb2YgdmFsdWUhPSJzdHJpbmciKXJldHVybiB2YWx1ZT09PTA/dmFsdWU6K3ZhbHVlO3ZhbHVlPXZhbHVlLnJlcGxhY2UocmVUcmltLCIiKTt2YXIgaXNCaW5hcnk9cmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtyZXR1cm4gaXNCaW5hcnl8fHJlSXNPY3RhbC50ZXN0KHZhbHVlKT9mcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksaXNCaW5hcnk/Mjo4KTpyZUlzQmFkSGV4LnRlc3QodmFsdWUpP05BTjordmFsdWV9ZnVuY3Rpb24gdG9QbGFpbk9iamVjdCh2YWx1ZSl7cmV0dXJuIGNvcHlPYmplY3QodmFsdWUsa2V5c0luKHZhbHVlKSl9ZnVuY3Rpb24gdG9TYWZlSW50ZWdlcih2YWx1ZSl7cmV0dXJuIHZhbHVlPwpiYXNlQ2xhbXAodG9JbnRlZ2VyKHZhbHVlKSwtTUFYX1NBRkVfSU5URUdFUixNQVhfU0FGRV9JTlRFR0VSKTp2YWx1ZT09PTA/dmFsdWU6MH1mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSl7cmV0dXJuIHZhbHVlPT1udWxsPyIiOmJhc2VUb1N0cmluZyh2YWx1ZSl9dmFyIGFzc2lnbj1jcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3Qsc291cmNlKXtpZihpc1Byb3RvdHlwZShzb3VyY2UpfHxpc0FycmF5TGlrZShzb3VyY2UpKXtjb3B5T2JqZWN0KHNvdXJjZSxrZXlzKHNvdXJjZSksb2JqZWN0KTtyZXR1cm59Zm9yKHZhciBrZXkgaW4gc291cmNlKWlmKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpYXNzaWduVmFsdWUob2JqZWN0LGtleSxzb3VyY2Vba2V5XSl9KTt2YXIgYXNzaWduSW49Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSl7Y29weU9iamVjdChzb3VyY2Usa2V5c0luKHNvdXJjZSksb2JqZWN0KX0pO3ZhciBhc3NpZ25JbldpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LApzb3VyY2Usc3JjSW5kZXgsY3VzdG9taXplcil7Y29weU9iamVjdChzb3VyY2Usa2V5c0luKHNvdXJjZSksb2JqZWN0LGN1c3RvbWl6ZXIpfSk7dmFyIGFzc2lnbldpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKXtjb3B5T2JqZWN0KHNvdXJjZSxrZXlzKHNvdXJjZSksb2JqZWN0LGN1c3RvbWl6ZXIpfSk7dmFyIGF0PWZsYXRSZXN0KGJhc2VBdCk7ZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSxwcm9wZXJ0aWVzKXt2YXIgcmVzdWx0PWJhc2VDcmVhdGUocHJvdG90eXBlKTtyZXR1cm4gcHJvcGVydGllcz09bnVsbD9yZXN1bHQ6YmFzZUFzc2lnbihyZXN1bHQscHJvcGVydGllcyl9dmFyIGRlZmF1bHRzPWJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCxzb3VyY2VzKXtvYmplY3Q9T2JqZWN0KG9iamVjdCk7dmFyIGluZGV4PS0xO3ZhciBsZW5ndGg9c291cmNlcy5sZW5ndGg7dmFyIGd1YXJkPWxlbmd0aD4yP3NvdXJjZXNbMl06CnVuZGVmaW5lZDtpZihndWFyZCYmaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSxzb3VyY2VzWzFdLGd1YXJkKSlsZW5ndGg9MTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHNvdXJjZT1zb3VyY2VzW2luZGV4XTt2YXIgcHJvcHM9a2V5c0luKHNvdXJjZSk7dmFyIHByb3BzSW5kZXg9LTE7dmFyIHByb3BzTGVuZ3RoPXByb3BzLmxlbmd0aDt3aGlsZSgrK3Byb3BzSW5kZXg8cHJvcHNMZW5ndGgpe3ZhciBrZXk9cHJvcHNbcHJvcHNJbmRleF07dmFyIHZhbHVlPW9iamVjdFtrZXldO2lmKHZhbHVlPT09dW5kZWZpbmVkfHxlcSh2YWx1ZSxvYmplY3RQcm90b1trZXldKSYmIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LGtleSkpb2JqZWN0W2tleV09c291cmNlW2tleV19fXJldHVybiBvYmplY3R9KTt2YXIgZGVmYXVsdHNEZWVwPWJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe2FyZ3MucHVzaCh1bmRlZmluZWQsY3VzdG9tRGVmYXVsdHNNZXJnZSk7cmV0dXJuIGFwcGx5KG1lcmdlV2l0aCwKdW5kZWZpbmVkLGFyZ3MpfSk7ZnVuY3Rpb24gZmluZEtleShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxiYXNlRm9yT3duKX1mdW5jdGlvbiBmaW5kTGFzdEtleShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxiYXNlRm9yT3duUmlnaHQpfWZ1bmN0aW9uIGZvckluKG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZUZvcihvYmplY3QsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyksa2V5c0luKX1mdW5jdGlvbiBmb3JJblJpZ2h0KG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZUZvclJpZ2h0KG9iamVjdCxnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSxrZXlzSW4pfWZ1bmN0aW9uIGZvck93bihvYmplY3QsaXRlcmF0ZWUpe3JldHVybiBvYmplY3QmJmJhc2VGb3JPd24ob2JqZWN0LApnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSl9ZnVuY3Rpb24gZm9yT3duUmlnaHQob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yT3duUmlnaHQob2JqZWN0LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpKX1mdW5jdGlvbiBmdW5jdGlvbnMob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP1tdOmJhc2VGdW5jdGlvbnMob2JqZWN0LGtleXMob2JqZWN0KSl9ZnVuY3Rpb24gZnVuY3Rpb25zSW4ob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP1tdOmJhc2VGdW5jdGlvbnMob2JqZWN0LGtleXNJbihvYmplY3QpKX1mdW5jdGlvbiBnZXQob2JqZWN0LHBhdGgsZGVmYXVsdFZhbHVlKXt2YXIgcmVzdWx0PW9iamVjdD09bnVsbD91bmRlZmluZWQ6YmFzZUdldChvYmplY3QscGF0aCk7cmV0dXJuIHJlc3VsdD09PXVuZGVmaW5lZD9kZWZhdWx0VmFsdWU6cmVzdWx0fWZ1bmN0aW9uIGhhcyhvYmplY3QscGF0aCl7cmV0dXJuIG9iamVjdCE9bnVsbCYmaGFzUGF0aChvYmplY3QsCnBhdGgsYmFzZUhhcyl9ZnVuY3Rpb24gaGFzSW4ob2JqZWN0LHBhdGgpe3JldHVybiBvYmplY3QhPW51bGwmJmhhc1BhdGgob2JqZWN0LHBhdGgsYmFzZUhhc0luKX12YXIgaW52ZXJ0PWNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKHZhbHVlIT1udWxsJiZ0eXBlb2YgdmFsdWUudG9TdHJpbmchPSJmdW5jdGlvbiIpdmFsdWU9bmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7cmVzdWx0W3ZhbHVlXT1rZXl9LGNvbnN0YW50KGlkZW50aXR5KSk7dmFyIGludmVydEJ5PWNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKHZhbHVlIT1udWxsJiZ0eXBlb2YgdmFsdWUudG9TdHJpbmchPSJmdW5jdGlvbiIpdmFsdWU9bmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7aWYoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsdmFsdWUpKXJlc3VsdFt2YWx1ZV0ucHVzaChrZXkpO2Vsc2UgcmVzdWx0W3ZhbHVlXT1ba2V5XX0sCmdldEl0ZXJhdGVlKTt2YXIgaW52b2tlPWJhc2VSZXN0KGJhc2VJbnZva2UpO2Z1bmN0aW9uIGtleXMob2JqZWN0KXtyZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KT9hcnJheUxpa2VLZXlzKG9iamVjdCk6YmFzZUtleXMob2JqZWN0KX1mdW5jdGlvbiBrZXlzSW4ob2JqZWN0KXtyZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KT9hcnJheUxpa2VLZXlzKG9iamVjdCx0cnVlKTpiYXNlS2V5c0luKG9iamVjdCl9ZnVuY3Rpb24gbWFwS2V5cyhvYmplY3QsaXRlcmF0ZWUpe3ZhciByZXN1bHQ9e307aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyk7YmFzZUZvck93bihvYmplY3QsZnVuY3Rpb24odmFsdWUsa2V5LG9iamVjdCl7YmFzZUFzc2lnblZhbHVlKHJlc3VsdCxpdGVyYXRlZSh2YWx1ZSxrZXksb2JqZWN0KSx2YWx1ZSl9KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG1hcFZhbHVlcyhvYmplY3QsaXRlcmF0ZWUpe3ZhciByZXN1bHQ9e307aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjMpO2Jhc2VGb3JPd24ob2JqZWN0LGZ1bmN0aW9uKHZhbHVlLGtleSxvYmplY3Qpe2Jhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LGl0ZXJhdGVlKHZhbHVlLGtleSxvYmplY3QpKX0pO3JldHVybiByZXN1bHR9dmFyIG1lcmdlPWNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCxzb3VyY2Usc3JjSW5kZXgpe2Jhc2VNZXJnZShvYmplY3Qsc291cmNlLHNyY0luZGV4KX0pO3ZhciBtZXJnZVdpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKXtiYXNlTWVyZ2Uob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKX0pO3ZhciBvbWl0PWZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCxwYXRocyl7dmFyIHJlc3VsdD17fTtpZihvYmplY3Q9PW51bGwpcmV0dXJuIHJlc3VsdDt2YXIgaXNEZWVwPWZhbHNlO3BhdGhzPWFycmF5TWFwKHBhdGhzLGZ1bmN0aW9uKHBhdGgpe3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO2lzRGVlcHx8Cihpc0RlZXA9cGF0aC5sZW5ndGg+MSk7cmV0dXJuIHBhdGh9KTtjb3B5T2JqZWN0KG9iamVjdCxnZXRBbGxLZXlzSW4ob2JqZWN0KSxyZXN1bHQpO2lmKGlzRGVlcClyZXN1bHQ9YmFzZUNsb25lKHJlc3VsdCxDTE9ORV9ERUVQX0ZMQUd8Q0xPTkVfRkxBVF9GTEFHfENMT05FX1NZTUJPTFNfRkxBRyxjdXN0b21PbWl0Q2xvbmUpO3ZhciBsZW5ndGg9cGF0aHMubGVuZ3RoO3doaWxlKGxlbmd0aC0tKWJhc2VVbnNldChyZXN1bHQscGF0aHNbbGVuZ3RoXSk7cmV0dXJuIHJlc3VsdH0pO2Z1bmN0aW9uIG9taXRCeShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gcGlja0J5KG9iamVjdCxuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpfXZhciBwaWNrPWZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCxwYXRocyl7cmV0dXJuIG9iamVjdD09bnVsbD97fTpiYXNlUGljayhvYmplY3QscGF0aHMpfSk7ZnVuY3Rpb24gcGlja0J5KG9iamVjdCxwcmVkaWNhdGUpe2lmKG9iamVjdD09bnVsbClyZXR1cm57fTsKdmFyIHByb3BzPWFycmF5TWFwKGdldEFsbEtleXNJbihvYmplY3QpLGZ1bmN0aW9uKHByb3Ape3JldHVybltwcm9wXX0pO3ByZWRpY2F0ZT1nZXRJdGVyYXRlZShwcmVkaWNhdGUpO3JldHVybiBiYXNlUGlja0J5KG9iamVjdCxwcm9wcyxmdW5jdGlvbih2YWx1ZSxwYXRoKXtyZXR1cm4gcHJlZGljYXRlKHZhbHVlLHBhdGhbMF0pfSl9ZnVuY3Rpb24gcmVzdWx0KG9iamVjdCxwYXRoLGRlZmF1bHRWYWx1ZSl7cGF0aD1jYXN0UGF0aChwYXRoLG9iamVjdCk7dmFyIGluZGV4PS0xLGxlbmd0aD1wYXRoLmxlbmd0aDtpZighbGVuZ3RoKXtsZW5ndGg9MTtvYmplY3Q9dW5kZWZpbmVkfXdoaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9b2JqZWN0PT1udWxsP3VuZGVmaW5lZDpvYmplY3RbdG9LZXkocGF0aFtpbmRleF0pXTtpZih2YWx1ZT09PXVuZGVmaW5lZCl7aW5kZXg9bGVuZ3RoO3ZhbHVlPWRlZmF1bHRWYWx1ZX1vYmplY3Q9aXNGdW5jdGlvbih2YWx1ZSk/dmFsdWUuY2FsbChvYmplY3QpOgp2YWx1ZX1yZXR1cm4gb2JqZWN0fWZ1bmN0aW9uIHNldChvYmplY3QscGF0aCx2YWx1ZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZVNldChvYmplY3QscGF0aCx2YWx1ZSl9ZnVuY3Rpb24gc2V0V2l0aChvYmplY3QscGF0aCx2YWx1ZSxjdXN0b21pemVyKXtjdXN0b21pemVyPXR5cGVvZiBjdXN0b21pemVyPT0iZnVuY3Rpb24iP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VTZXQob2JqZWN0LHBhdGgsdmFsdWUsY3VzdG9taXplcil9dmFyIHRvUGFpcnM9Y3JlYXRlVG9QYWlycyhrZXlzKTt2YXIgdG9QYWlyc0luPWNyZWF0ZVRvUGFpcnMoa2V5c0luKTtmdW5jdGlvbiB0cmFuc2Zvcm0ob2JqZWN0LGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXt2YXIgaXNBcnI9aXNBcnJheShvYmplY3QpLGlzQXJyTGlrZT1pc0Fycnx8aXNCdWZmZXIob2JqZWN0KXx8aXNUeXBlZEFycmF5KG9iamVjdCk7aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjQpO2lmKGFjY3VtdWxhdG9yPT1udWxsKXt2YXIgQ3Rvcj1vYmplY3QmJm9iamVjdC5jb25zdHJ1Y3RvcjtpZihpc0Fyckxpa2UpYWNjdW11bGF0b3I9aXNBcnI/bmV3IEN0b3I6W107ZWxzZSBpZihpc09iamVjdChvYmplY3QpKWFjY3VtdWxhdG9yPWlzRnVuY3Rpb24oQ3Rvcik/YmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSk6e307ZWxzZSBhY2N1bXVsYXRvcj17fX0oaXNBcnJMaWtlP2FycmF5RWFjaDpiYXNlRm9yT3duKShvYmplY3QsZnVuY3Rpb24odmFsdWUsaW5kZXgsb2JqZWN0KXtyZXR1cm4gaXRlcmF0ZWUoYWNjdW11bGF0b3IsdmFsdWUsaW5kZXgsb2JqZWN0KX0pO3JldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiB1bnNldChvYmplY3QscGF0aCl7cmV0dXJuIG9iamVjdD09bnVsbD90cnVlOmJhc2VVbnNldChvYmplY3QscGF0aCl9ZnVuY3Rpb24gdXBkYXRlKG9iamVjdCxwYXRoLHVwZGF0ZXIpe3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VVcGRhdGUob2JqZWN0LApwYXRoLGNhc3RGdW5jdGlvbih1cGRhdGVyKSl9ZnVuY3Rpb24gdXBkYXRlV2l0aChvYmplY3QscGF0aCx1cGRhdGVyLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PSJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZVVwZGF0ZShvYmplY3QscGF0aCxjYXN0RnVuY3Rpb24odXBkYXRlciksY3VzdG9taXplcil9ZnVuY3Rpb24gdmFsdWVzKG9iamVjdCl7cmV0dXJuIG9iamVjdD09bnVsbD9bXTpiYXNlVmFsdWVzKG9iamVjdCxrZXlzKG9iamVjdCkpfWZ1bmN0aW9uIHZhbHVlc0luKG9iamVjdCl7cmV0dXJuIG9iamVjdD09bnVsbD9bXTpiYXNlVmFsdWVzKG9iamVjdCxrZXlzSW4ob2JqZWN0KSl9ZnVuY3Rpb24gY2xhbXAobnVtYmVyLGxvd2VyLHVwcGVyKXtpZih1cHBlcj09PXVuZGVmaW5lZCl7dXBwZXI9bG93ZXI7bG93ZXI9dW5kZWZpbmVkfWlmKHVwcGVyIT09dW5kZWZpbmVkKXt1cHBlcj0KdG9OdW1iZXIodXBwZXIpO3VwcGVyPXVwcGVyPT09dXBwZXI/dXBwZXI6MH1pZihsb3dlciE9PXVuZGVmaW5lZCl7bG93ZXI9dG9OdW1iZXIobG93ZXIpO2xvd2VyPWxvd2VyPT09bG93ZXI/bG93ZXI6MH1yZXR1cm4gYmFzZUNsYW1wKHRvTnVtYmVyKG51bWJlciksbG93ZXIsdXBwZXIpfWZ1bmN0aW9uIGluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl7c3RhcnQ9dG9GaW5pdGUoc3RhcnQpO2lmKGVuZD09PXVuZGVmaW5lZCl7ZW5kPXN0YXJ0O3N0YXJ0PTB9ZWxzZSBlbmQ9dG9GaW5pdGUoZW5kKTtudW1iZXI9dG9OdW1iZXIobnVtYmVyKTtyZXR1cm4gYmFzZUluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl9ZnVuY3Rpb24gcmFuZG9tKGxvd2VyLHVwcGVyLGZsb2F0aW5nKXtpZihmbG9hdGluZyYmdHlwZW9mIGZsb2F0aW5nIT0iYm9vbGVhbiImJmlzSXRlcmF0ZWVDYWxsKGxvd2VyLHVwcGVyLGZsb2F0aW5nKSl1cHBlcj1mbG9hdGluZz11bmRlZmluZWQ7aWYoZmxvYXRpbmc9PT11bmRlZmluZWQpaWYodHlwZW9mIHVwcGVyPT0KImJvb2xlYW4iKXtmbG9hdGluZz11cHBlcjt1cHBlcj11bmRlZmluZWR9ZWxzZSBpZih0eXBlb2YgbG93ZXI9PSJib29sZWFuIil7ZmxvYXRpbmc9bG93ZXI7bG93ZXI9dW5kZWZpbmVkfWlmKGxvd2VyPT09dW5kZWZpbmVkJiZ1cHBlcj09PXVuZGVmaW5lZCl7bG93ZXI9MDt1cHBlcj0xfWVsc2V7bG93ZXI9dG9GaW5pdGUobG93ZXIpO2lmKHVwcGVyPT09dW5kZWZpbmVkKXt1cHBlcj1sb3dlcjtsb3dlcj0wfWVsc2UgdXBwZXI9dG9GaW5pdGUodXBwZXIpfWlmKGxvd2VyPnVwcGVyKXt2YXIgdGVtcD1sb3dlcjtsb3dlcj11cHBlcjt1cHBlcj10ZW1wfWlmKGZsb2F0aW5nfHxsb3dlciUxfHx1cHBlciUxKXt2YXIgcmFuZD1uYXRpdmVSYW5kb20oKTtyZXR1cm4gbmF0aXZlTWluKGxvd2VyK3JhbmQqKHVwcGVyLWxvd2VyK2ZyZWVQYXJzZUZsb2F0KCIxZS0iKygocmFuZCsiIikubGVuZ3RoLTEpKSksdXBwZXIpfXJldHVybiBiYXNlUmFuZG9tKGxvd2VyLHVwcGVyKX12YXIgY2FtZWxDYXNlPQpjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCx3b3JkLGluZGV4KXt3b3JkPXdvcmQudG9Mb3dlckNhc2UoKTtyZXR1cm4gcmVzdWx0KyhpbmRleD9jYXBpdGFsaXplKHdvcmQpOndvcmQpfSk7ZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHJpbmcpe3JldHVybiB1cHBlckZpcnN0KHRvU3RyaW5nKHN0cmluZykudG9Mb3dlckNhc2UoKSl9ZnVuY3Rpb24gZGVidXJyKHN0cmluZyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7cmV0dXJuIHN0cmluZyYmc3RyaW5nLnJlcGxhY2UocmVMYXRpbixkZWJ1cnJMZXR0ZXIpLnJlcGxhY2UocmVDb21ib01hcmssIiIpfWZ1bmN0aW9uIGVuZHNXaXRoKHN0cmluZyx0YXJnZXQscG9zaXRpb24pe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO3RhcmdldD1iYXNlVG9TdHJpbmcodGFyZ2V0KTt2YXIgbGVuZ3RoPXN0cmluZy5sZW5ndGg7cG9zaXRpb249cG9zaXRpb249PT11bmRlZmluZWQ/bGVuZ3RoOmJhc2VDbGFtcCh0b0ludGVnZXIocG9zaXRpb24pLAowLGxlbmd0aCk7dmFyIGVuZD1wb3NpdGlvbjtwb3NpdGlvbi09dGFyZ2V0Lmxlbmd0aDtyZXR1cm4gcG9zaXRpb24+PTAmJnN0cmluZy5zbGljZShwb3NpdGlvbixlbmQpPT10YXJnZXR9ZnVuY3Rpb24gZXNjYXBlKHN0cmluZyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7cmV0dXJuIHN0cmluZyYmcmVIYXNVbmVzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKT9zdHJpbmcucmVwbGFjZShyZVVuZXNjYXBlZEh0bWwsZXNjYXBlSHRtbENoYXIpOnN0cmluZ31mdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtyZXR1cm4gc3RyaW5nJiZyZUhhc1JlZ0V4cENoYXIudGVzdChzdHJpbmcpP3N0cmluZy5yZXBsYWNlKHJlUmVnRXhwQ2hhciwiXFwkXHgyNiIpOnN0cmluZ312YXIga2ViYWJDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyItIjoiIikrd29yZC50b0xvd2VyQ2FzZSgpfSk7CnZhciBsb3dlckNhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/IiAiOiIiKSt3b3JkLnRvTG93ZXJDYXNlKCl9KTt2YXIgbG93ZXJGaXJzdD1jcmVhdGVDYXNlRmlyc3QoInRvTG93ZXJDYXNlIik7ZnVuY3Rpb24gcGFkKHN0cmluZyxsZW5ndGgsY2hhcnMpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO2xlbmd0aD10b0ludGVnZXIobGVuZ3RoKTt2YXIgc3RyTGVuZ3RoPWxlbmd0aD9zdHJpbmdTaXplKHN0cmluZyk6MDtpZighbGVuZ3RofHxzdHJMZW5ndGg+PWxlbmd0aClyZXR1cm4gc3RyaW5nO3ZhciBtaWQ9KGxlbmd0aC1zdHJMZW5ndGgpLzI7cmV0dXJuIGNyZWF0ZVBhZGRpbmcobmF0aXZlRmxvb3IobWlkKSxjaGFycykrc3RyaW5nK2NyZWF0ZVBhZGRpbmcobmF0aXZlQ2VpbChtaWQpLGNoYXJzKX1mdW5jdGlvbiBwYWRFbmQoc3RyaW5nLGxlbmd0aCxjaGFycyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7Cmxlbmd0aD10b0ludGVnZXIobGVuZ3RoKTt2YXIgc3RyTGVuZ3RoPWxlbmd0aD9zdHJpbmdTaXplKHN0cmluZyk6MDtyZXR1cm4gbGVuZ3RoJiZzdHJMZW5ndGg8bGVuZ3RoP3N0cmluZytjcmVhdGVQYWRkaW5nKGxlbmd0aC1zdHJMZW5ndGgsY2hhcnMpOnN0cmluZ31mdW5jdGlvbiBwYWRTdGFydChzdHJpbmcsbGVuZ3RoLGNoYXJzKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtsZW5ndGg9dG9JbnRlZ2VyKGxlbmd0aCk7dmFyIHN0ckxlbmd0aD1sZW5ndGg/c3RyaW5nU2l6ZShzdHJpbmcpOjA7cmV0dXJuIGxlbmd0aCYmc3RyTGVuZ3RoPGxlbmd0aD9jcmVhdGVQYWRkaW5nKGxlbmd0aC1zdHJMZW5ndGgsY2hhcnMpK3N0cmluZzpzdHJpbmd9ZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLHJhZGl4LGd1YXJkKXtpZihndWFyZHx8cmFkaXg9PW51bGwpcmFkaXg9MDtlbHNlIGlmKHJhZGl4KXJhZGl4PStyYWRpeDtyZXR1cm4gbmF0aXZlUGFyc2VJbnQodG9TdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LAoiIikscmFkaXh8fDApfWZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsbixndWFyZCl7aWYoZ3VhcmQ/aXNJdGVyYXRlZUNhbGwoc3RyaW5nLG4sZ3VhcmQpOm49PT11bmRlZmluZWQpbj0xO2Vsc2Ugbj10b0ludGVnZXIobik7cmV0dXJuIGJhc2VSZXBlYXQodG9TdHJpbmcoc3RyaW5nKSxuKX1mdW5jdGlvbiByZXBsYWNlKCl7dmFyIGFyZ3M9YXJndW1lbnRzLHN0cmluZz10b1N0cmluZyhhcmdzWzBdKTtyZXR1cm4gYXJncy5sZW5ndGg8Mz9zdHJpbmc6c3RyaW5nLnJlcGxhY2UoYXJnc1sxXSxhcmdzWzJdKX12YXIgc25ha2VDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyJfIjoiIikrd29yZC50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gc3BsaXQoc3RyaW5nLHNlcGFyYXRvcixsaW1pdCl7aWYobGltaXQmJnR5cGVvZiBsaW1pdCE9Im51bWJlciImJmlzSXRlcmF0ZWVDYWxsKHN0cmluZyxzZXBhcmF0b3IsbGltaXQpKXNlcGFyYXRvcj0KbGltaXQ9dW5kZWZpbmVkO2xpbWl0PWxpbWl0PT09dW5kZWZpbmVkP01BWF9BUlJBWV9MRU5HVEg6bGltaXQ+Pj4wO2lmKCFsaW1pdClyZXR1cm5bXTtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtpZihzdHJpbmcmJih0eXBlb2Ygc2VwYXJhdG9yPT0ic3RyaW5nInx8c2VwYXJhdG9yIT1udWxsJiYhaXNSZWdFeHAoc2VwYXJhdG9yKSkpe3NlcGFyYXRvcj1iYXNlVG9TdHJpbmcoc2VwYXJhdG9yKTtpZighc2VwYXJhdG9yJiZoYXNVbmljb2RlKHN0cmluZykpcmV0dXJuIGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHN0cmluZyksMCxsaW1pdCl9cmV0dXJuIHN0cmluZy5zcGxpdChzZXBhcmF0b3IsbGltaXQpfXZhciBzdGFydENhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/IiAiOiIiKSt1cHBlckZpcnN0KHdvcmQpfSk7ZnVuY3Rpb24gc3RhcnRzV2l0aChzdHJpbmcsdGFyZ2V0LHBvc2l0aW9uKXtzdHJpbmc9CnRvU3RyaW5nKHN0cmluZyk7cG9zaXRpb249cG9zaXRpb249PW51bGw/MDpiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwwLHN0cmluZy5sZW5ndGgpO3RhcmdldD1iYXNlVG9TdHJpbmcodGFyZ2V0KTtyZXR1cm4gc3RyaW5nLnNsaWNlKHBvc2l0aW9uLHBvc2l0aW9uK3RhcmdldC5sZW5ndGgpPT10YXJnZXR9ZnVuY3Rpb24gdGVtcGxhdGUoc3RyaW5nLG9wdGlvbnMsZ3VhcmQpe3ZhciBzZXR0aW5ncz1sb2Rhc2gudGVtcGxhdGVTZXR0aW5ncztpZihndWFyZCYmaXNJdGVyYXRlZUNhbGwoc3RyaW5nLG9wdGlvbnMsZ3VhcmQpKW9wdGlvbnM9dW5kZWZpbmVkO3N0cmluZz10b1N0cmluZyhzdHJpbmcpO29wdGlvbnM9YXNzaWduSW5XaXRoKHt9LG9wdGlvbnMsc2V0dGluZ3MsY3VzdG9tRGVmYXVsdHNBc3NpZ25Jbik7dmFyIGltcG9ydHM9YXNzaWduSW5XaXRoKHt9LG9wdGlvbnMuaW1wb3J0cyxzZXR0aW5ncy5pbXBvcnRzLGN1c3RvbURlZmF1bHRzQXNzaWduSW4pLGltcG9ydHNLZXlzPQprZXlzKGltcG9ydHMpLGltcG9ydHNWYWx1ZXM9YmFzZVZhbHVlcyhpbXBvcnRzLGltcG9ydHNLZXlzKTt2YXIgaXNFc2NhcGluZyxpc0V2YWx1YXRpbmcsaW5kZXg9MCxpbnRlcnBvbGF0ZT1vcHRpb25zLmludGVycG9sYXRlfHxyZU5vTWF0Y2gsc291cmNlPSJfX3AgK1x4M2QgJyI7dmFyIHJlRGVsaW1pdGVycz1SZWdFeHAoKG9wdGlvbnMuZXNjYXBlfHxyZU5vTWF0Y2gpLnNvdXJjZSsifCIraW50ZXJwb2xhdGUuc291cmNlKyJ8IisoaW50ZXJwb2xhdGU9PT1yZUludGVycG9sYXRlP3JlRXNUZW1wbGF0ZTpyZU5vTWF0Y2gpLnNvdXJjZSsifCIrKG9wdGlvbnMuZXZhbHVhdGV8fHJlTm9NYXRjaCkuc291cmNlKyJ8JCIsImciKTt2YXIgc291cmNlVVJMPSIvLyMgc291cmNlVVJMXHgzZCIrKCJzb3VyY2VVUkwiaW4gb3B0aW9ucz9vcHRpb25zLnNvdXJjZVVSTDoibG9kYXNoLnRlbXBsYXRlU291cmNlc1siKyArK3RlbXBsYXRlQ291bnRlcisiXSIpKyJcbiI7c3RyaW5nLnJlcGxhY2UocmVEZWxpbWl0ZXJzLApmdW5jdGlvbihtYXRjaCxlc2NhcGVWYWx1ZSxpbnRlcnBvbGF0ZVZhbHVlLGVzVGVtcGxhdGVWYWx1ZSxldmFsdWF0ZVZhbHVlLG9mZnNldCl7aW50ZXJwb2xhdGVWYWx1ZXx8KGludGVycG9sYXRlVmFsdWU9ZXNUZW1wbGF0ZVZhbHVlKTtzb3VyY2UrPXN0cmluZy5zbGljZShpbmRleCxvZmZzZXQpLnJlcGxhY2UocmVVbmVzY2FwZWRTdHJpbmcsZXNjYXBlU3RyaW5nQ2hhcik7aWYoZXNjYXBlVmFsdWUpe2lzRXNjYXBpbmc9dHJ1ZTtzb3VyY2UrPSInICtcbl9fZSgiK2VzY2FwZVZhbHVlKyIpICtcbicifWlmKGV2YWx1YXRlVmFsdWUpe2lzRXZhbHVhdGluZz10cnVlO3NvdXJjZSs9Iic7XG4iK2V2YWx1YXRlVmFsdWUrIjtcbl9fcCArXHgzZCAnIn1pZihpbnRlcnBvbGF0ZVZhbHVlKXNvdXJjZSs9IicgK1xuKChfX3QgXHgzZCAoIitpbnRlcnBvbGF0ZVZhbHVlKyIpKSBceDNkXHgzZCBudWxsID8gJycgOiBfX3QpICtcbiciO2luZGV4PW9mZnNldCttYXRjaC5sZW5ndGg7cmV0dXJuIG1hdGNofSk7CnNvdXJjZSs9Iic7XG4iO3ZhciB2YXJpYWJsZT1vcHRpb25zLnZhcmlhYmxlO2lmKCF2YXJpYWJsZSlzb3VyY2U9IndpdGggKG9iaikge1xuIitzb3VyY2UrIlxufVxuIjtzb3VyY2U9KGlzRXZhbHVhdGluZz9zb3VyY2UucmVwbGFjZShyZUVtcHR5U3RyaW5nTGVhZGluZywiIik6c291cmNlKS5yZXBsYWNlKHJlRW1wdHlTdHJpbmdNaWRkbGUsIiQxIikucmVwbGFjZShyZUVtcHR5U3RyaW5nVHJhaWxpbmcsIiQxOyIpO3NvdXJjZT0iZnVuY3Rpb24oIisodmFyaWFibGV8fCJvYmoiKSsiKSB7XG4iKyh2YXJpYWJsZT8iIjoib2JqIHx8IChvYmogXHgzZCB7fSk7XG4iKSsidmFyIF9fdCwgX19wIFx4M2QgJyciKyhpc0VzY2FwaW5nPyIsIF9fZSBceDNkIF8uZXNjYXBlIjoiIikrKGlzRXZhbHVhdGluZz8iLCBfX2ogXHgzZCBBcnJheS5wcm90b3R5cGUuam9pbjtcbiIrImZ1bmN0aW9uIHByaW50KCkgeyBfX3AgK1x4M2QgX19qLmNhbGwoYXJndW1lbnRzLCAnJykgfVxuIjoiO1xuIikrc291cmNlKwoicmV0dXJuIF9fcFxufSI7dmFyIHJlc3VsdD1hdHRlbXB0KGZ1bmN0aW9uKCl7cmV0dXJuIEZ1bmN0aW9uKGltcG9ydHNLZXlzLHNvdXJjZVVSTCsicmV0dXJuICIrc291cmNlKS5hcHBseSh1bmRlZmluZWQsaW1wb3J0c1ZhbHVlcyl9KTtyZXN1bHQuc291cmNlPXNvdXJjZTtpZihpc0Vycm9yKHJlc3VsdCkpdGhyb3cgcmVzdWx0O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdG9Mb3dlcih2YWx1ZSl7cmV0dXJuIHRvU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIHRvVXBwZXIodmFsdWUpe3JldHVybiB0b1N0cmluZyh2YWx1ZSkudG9VcHBlckNhc2UoKX1mdW5jdGlvbiB0cmltKHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltLCIiKTtpZighc3RyaW5nfHwhKGNoYXJzPWJhc2VUb1N0cmluZyhjaGFycykpKXJldHVybiBzdHJpbmc7CnZhciBzdHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoc3RyaW5nKSxjaHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoY2hhcnMpLHN0YXJ0PWNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpLGVuZD1jaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsY2hyU3ltYm9scykrMTtyZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsc3RhcnQsZW5kKS5qb2luKCIiKX1mdW5jdGlvbiB0cmltRW5kKHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltRW5kLCIiKTtpZighc3RyaW5nfHwhKGNoYXJzPWJhc2VUb1N0cmluZyhjaGFycykpKXJldHVybiBzdHJpbmc7dmFyIHN0clN5bWJvbHM9c3RyaW5nVG9BcnJheShzdHJpbmcpLGVuZD1jaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsc3RyaW5nVG9BcnJheShjaGFycykpKzE7cmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLAowLGVuZCkuam9pbigiIil9ZnVuY3Rpb24gdHJpbVN0YXJ0KHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltU3RhcnQsIiIpO2lmKCFzdHJpbmd8fCEoY2hhcnM9YmFzZVRvU3RyaW5nKGNoYXJzKSkpcmV0dXJuIHN0cmluZzt2YXIgc3RyU3ltYm9scz1zdHJpbmdUb0FycmF5KHN0cmluZyksc3RhcnQ9Y2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsc3RyaW5nVG9BcnJheShjaGFycykpO3JldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scyxzdGFydCkuam9pbigiIil9ZnVuY3Rpb24gdHJ1bmNhdGUoc3RyaW5nLG9wdGlvbnMpe3ZhciBsZW5ndGg9REVGQVVMVF9UUlVOQ19MRU5HVEgsb21pc3Npb249REVGQVVMVF9UUlVOQ19PTUlTU0lPTjtpZihpc09iamVjdChvcHRpb25zKSl7dmFyIHNlcGFyYXRvcj0ic2VwYXJhdG9yImluIG9wdGlvbnM/Cm9wdGlvbnMuc2VwYXJhdG9yOnNlcGFyYXRvcjtsZW5ndGg9Imxlbmd0aCJpbiBvcHRpb25zP3RvSW50ZWdlcihvcHRpb25zLmxlbmd0aCk6bGVuZ3RoO29taXNzaW9uPSJvbWlzc2lvbiJpbiBvcHRpb25zP2Jhc2VUb1N0cmluZyhvcHRpb25zLm9taXNzaW9uKTpvbWlzc2lvbn1zdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTt2YXIgc3RyTGVuZ3RoPXN0cmluZy5sZW5ndGg7aWYoaGFzVW5pY29kZShzdHJpbmcpKXt2YXIgc3RyU3ltYm9scz1zdHJpbmdUb0FycmF5KHN0cmluZyk7c3RyTGVuZ3RoPXN0clN5bWJvbHMubGVuZ3RofWlmKGxlbmd0aD49c3RyTGVuZ3RoKXJldHVybiBzdHJpbmc7dmFyIGVuZD1sZW5ndGgtc3RyaW5nU2l6ZShvbWlzc2lvbik7aWYoZW5kPDEpcmV0dXJuIG9taXNzaW9uO3ZhciByZXN1bHQ9c3RyU3ltYm9scz9jYXN0U2xpY2Uoc3RyU3ltYm9scywwLGVuZCkuam9pbigiIik6c3RyaW5nLnNsaWNlKDAsZW5kKTtpZihzZXBhcmF0b3I9PT11bmRlZmluZWQpcmV0dXJuIHJlc3VsdCsKb21pc3Npb247aWYoc3RyU3ltYm9scyllbmQrPXJlc3VsdC5sZW5ndGgtZW5kO2lmKGlzUmVnRXhwKHNlcGFyYXRvcikpe2lmKHN0cmluZy5zbGljZShlbmQpLnNlYXJjaChzZXBhcmF0b3IpKXt2YXIgbWF0Y2gsc3Vic3RyaW5nPXJlc3VsdDtpZighc2VwYXJhdG9yLmdsb2JhbClzZXBhcmF0b3I9UmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsdG9TdHJpbmcocmVGbGFncy5leGVjKHNlcGFyYXRvcikpKyJnIik7c2VwYXJhdG9yLmxhc3RJbmRleD0wO3doaWxlKG1hdGNoPXNlcGFyYXRvci5leGVjKHN1YnN0cmluZykpdmFyIG5ld0VuZD1tYXRjaC5pbmRleDtyZXN1bHQ9cmVzdWx0LnNsaWNlKDAsbmV3RW5kPT09dW5kZWZpbmVkP2VuZDpuZXdFbmQpfX1lbHNlIGlmKHN0cmluZy5pbmRleE9mKGJhc2VUb1N0cmluZyhzZXBhcmF0b3IpLGVuZCkhPWVuZCl7dmFyIGluZGV4PXJlc3VsdC5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO2lmKGluZGV4Pi0xKXJlc3VsdD1yZXN1bHQuc2xpY2UoMCxpbmRleCl9cmV0dXJuIHJlc3VsdCsKb21pc3Npb259ZnVuY3Rpb24gdW5lc2NhcGUoc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtyZXR1cm4gc3RyaW5nJiZyZUhhc0VzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKT9zdHJpbmcucmVwbGFjZShyZUVzY2FwZWRIdG1sLHVuZXNjYXBlSHRtbENoYXIpOnN0cmluZ312YXIgdXBwZXJDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyIgIjoiIikrd29yZC50b1VwcGVyQ2FzZSgpfSk7dmFyIHVwcGVyRmlyc3Q9Y3JlYXRlQ2FzZUZpcnN0KCJ0b1VwcGVyQ2FzZSIpO2Z1bmN0aW9uIHdvcmRzKHN0cmluZyxwYXR0ZXJuLGd1YXJkKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtwYXR0ZXJuPWd1YXJkP3VuZGVmaW5lZDpwYXR0ZXJuO2lmKHBhdHRlcm49PT11bmRlZmluZWQpcmV0dXJuIGhhc1VuaWNvZGVXb3JkKHN0cmluZyk/dW5pY29kZVdvcmRzKHN0cmluZyk6YXNjaWlXb3JkcyhzdHJpbmcpO3JldHVybiBzdHJpbmcubWF0Y2gocGF0dGVybil8fApbXX12YXIgYXR0ZW1wdD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLGFyZ3Mpe3RyeXtyZXR1cm4gYXBwbHkoZnVuYyx1bmRlZmluZWQsYXJncyl9Y2F0Y2goZSl7cmV0dXJuIGlzRXJyb3IoZSk/ZTpuZXcgRXJyb3IoZSl9fSk7dmFyIGJpbmRBbGw9ZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LG1ldGhvZE5hbWVzKXthcnJheUVhY2gobWV0aG9kTmFtZXMsZnVuY3Rpb24oa2V5KXtrZXk9dG9LZXkoa2V5KTtiYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSxiaW5kKG9iamVjdFtrZXldLG9iamVjdCkpfSk7cmV0dXJuIG9iamVjdH0pO2Z1bmN0aW9uIGNvbmQocGFpcnMpe3ZhciBsZW5ndGg9cGFpcnM9PW51bGw/MDpwYWlycy5sZW5ndGgsdG9JdGVyYXRlZT1nZXRJdGVyYXRlZSgpO3BhaXJzPSFsZW5ndGg/W106YXJyYXlNYXAocGFpcnMsZnVuY3Rpb24ocGFpcil7aWYodHlwZW9mIHBhaXJbMV0hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3JldHVyblt0b0l0ZXJhdGVlKHBhaXJbMF0pLApwYWlyWzFdXX0pO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgaW5kZXg9LTE7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBwYWlyPXBhaXJzW2luZGV4XTtpZihhcHBseShwYWlyWzBdLHRoaXMsYXJncykpcmV0dXJuIGFwcGx5KHBhaXJbMV0sdGhpcyxhcmdzKX19KX1mdW5jdGlvbiBjb25mb3Jtcyhzb3VyY2Upe3JldHVybiBiYXNlQ29uZm9ybXMoYmFzZUNsb25lKHNvdXJjZSxDTE9ORV9ERUVQX0ZMQUcpKX1mdW5jdGlvbiBjb25zdGFudCh2YWx1ZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHZhbHVlfX1mdW5jdGlvbiBkZWZhdWx0VG8odmFsdWUsZGVmYXVsdFZhbHVlKXtyZXR1cm4gdmFsdWU9PW51bGx8fHZhbHVlIT09dmFsdWU/ZGVmYXVsdFZhbHVlOnZhbHVlfXZhciBmbG93PWNyZWF0ZUZsb3coKTt2YXIgZmxvd1JpZ2h0PWNyZWF0ZUZsb3codHJ1ZSk7ZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpe3JldHVybiB2YWx1ZX1mdW5jdGlvbiBpdGVyYXRlZShmdW5jKXtyZXR1cm4gYmFzZUl0ZXJhdGVlKHR5cGVvZiBmdW5jPT0KImZ1bmN0aW9uIj9mdW5jOmJhc2VDbG9uZShmdW5jLENMT05FX0RFRVBfRkxBRykpfWZ1bmN0aW9uIG1hdGNoZXMoc291cmNlKXtyZXR1cm4gYmFzZU1hdGNoZXMoYmFzZUNsb25lKHNvdXJjZSxDTE9ORV9ERUVQX0ZMQUcpKX1mdW5jdGlvbiBtYXRjaGVzUHJvcGVydHkocGF0aCxzcmNWYWx1ZSl7cmV0dXJuIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCxiYXNlQ2xvbmUoc3JjVmFsdWUsQ0xPTkVfREVFUF9GTEFHKSl9dmFyIG1ldGhvZD1iYXNlUmVzdChmdW5jdGlvbihwYXRoLGFyZ3Mpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlSW52b2tlKG9iamVjdCxwYXRoLGFyZ3MpfX0pO3ZhciBtZXRob2RPZj1iYXNlUmVzdChmdW5jdGlvbihvYmplY3QsYXJncyl7cmV0dXJuIGZ1bmN0aW9uKHBhdGgpe3JldHVybiBiYXNlSW52b2tlKG9iamVjdCxwYXRoLGFyZ3MpfX0pO2Z1bmN0aW9uIG1peGluKG9iamVjdCxzb3VyY2Usb3B0aW9ucyl7dmFyIHByb3BzPWtleXMoc291cmNlKSwKbWV0aG9kTmFtZXM9YmFzZUZ1bmN0aW9ucyhzb3VyY2UscHJvcHMpO2lmKG9wdGlvbnM9PW51bGwmJiEoaXNPYmplY3Qoc291cmNlKSYmKG1ldGhvZE5hbWVzLmxlbmd0aHx8IXByb3BzLmxlbmd0aCkpKXtvcHRpb25zPXNvdXJjZTtzb3VyY2U9b2JqZWN0O29iamVjdD10aGlzO21ldGhvZE5hbWVzPWJhc2VGdW5jdGlvbnMoc291cmNlLGtleXMoc291cmNlKSl9dmFyIGNoYWluPSEoaXNPYmplY3Qob3B0aW9ucykmJiJjaGFpbiJpbiBvcHRpb25zKXx8ISFvcHRpb25zLmNoYWluLGlzRnVuYz1pc0Z1bmN0aW9uKG9iamVjdCk7YXJyYXlFYWNoKG1ldGhvZE5hbWVzLGZ1bmN0aW9uKG1ldGhvZE5hbWUpe3ZhciBmdW5jPXNvdXJjZVttZXRob2ROYW1lXTtvYmplY3RbbWV0aG9kTmFtZV09ZnVuYztpZihpc0Z1bmMpb2JqZWN0LnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbigpe3ZhciBjaGFpbkFsbD10aGlzLl9fY2hhaW5fXztpZihjaGFpbnx8Y2hhaW5BbGwpe3ZhciByZXN1bHQ9Cm9iamVjdCh0aGlzLl9fd3JhcHBlZF9fKSxhY3Rpb25zPXJlc3VsdC5fX2FjdGlvbnNfXz1jb3B5QXJyYXkodGhpcy5fX2FjdGlvbnNfXyk7YWN0aW9ucy5wdXNoKHsiZnVuYyI6ZnVuYywiYXJncyI6YXJndW1lbnRzLCJ0aGlzQXJnIjpvYmplY3R9KTtyZXN1bHQuX19jaGFpbl9fPWNoYWluQWxsO3JldHVybiByZXN1bHR9cmV0dXJuIGZ1bmMuYXBwbHkob2JqZWN0LGFycmF5UHVzaChbdGhpcy52YWx1ZSgpXSxhcmd1bWVudHMpKX19KTtyZXR1cm4gb2JqZWN0fWZ1bmN0aW9uIG5vQ29uZmxpY3QoKXtpZihyb290Ll89PT10aGlzKXJvb3QuXz1vbGREYXNoO3JldHVybiB0aGlzfWZ1bmN0aW9uIG5vb3AoKXt9ZnVuY3Rpb24gbnRoQXJnKG4pe249dG9JbnRlZ2VyKG4pO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXtyZXR1cm4gYmFzZU50aChhcmdzLG4pfSl9dmFyIG92ZXI9Y3JlYXRlT3ZlcihhcnJheU1hcCk7dmFyIG92ZXJFdmVyeT1jcmVhdGVPdmVyKGFycmF5RXZlcnkpOwp2YXIgb3ZlclNvbWU9Y3JlYXRlT3ZlcihhcnJheVNvbWUpO2Z1bmN0aW9uIHByb3BlcnR5KHBhdGgpe3JldHVybiBpc0tleShwYXRoKT9iYXNlUHJvcGVydHkodG9LZXkocGF0aCkpOmJhc2VQcm9wZXJ0eURlZXAocGF0aCl9ZnVuY3Rpb24gcHJvcGVydHlPZihvYmplY3Qpe3JldHVybiBmdW5jdGlvbihwYXRoKXtyZXR1cm4gb2JqZWN0PT1udWxsP3VuZGVmaW5lZDpiYXNlR2V0KG9iamVjdCxwYXRoKX19dmFyIHJhbmdlPWNyZWF0ZVJhbmdlKCk7dmFyIHJhbmdlUmlnaHQ9Y3JlYXRlUmFuZ2UodHJ1ZSk7ZnVuY3Rpb24gc3R1YkFycmF5KCl7cmV0dXJuW119ZnVuY3Rpb24gc3R1YkZhbHNlKCl7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIHN0dWJPYmplY3QoKXtyZXR1cm57fX1mdW5jdGlvbiBzdHViU3RyaW5nKCl7cmV0dXJuIiJ9ZnVuY3Rpb24gc3R1YlRydWUoKXtyZXR1cm4gdHJ1ZX1mdW5jdGlvbiB0aW1lcyhuLGl0ZXJhdGVlKXtuPXRvSW50ZWdlcihuKTtpZihuPDF8fG4+TUFYX1NBRkVfSU5URUdFUilyZXR1cm5bXTsKdmFyIGluZGV4PU1BWF9BUlJBWV9MRU5HVEgsbGVuZ3RoPW5hdGl2ZU1pbihuLE1BWF9BUlJBWV9MRU5HVEgpO2l0ZXJhdGVlPWdldEl0ZXJhdGVlKGl0ZXJhdGVlKTtuLT1NQVhfQVJSQVlfTEVOR1RIO3ZhciByZXN1bHQ9YmFzZVRpbWVzKGxlbmd0aCxpdGVyYXRlZSk7d2hpbGUoKytpbmRleDxuKWl0ZXJhdGVlKGluZGV4KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHRvUGF0aCh2YWx1ZSl7aWYoaXNBcnJheSh2YWx1ZSkpcmV0dXJuIGFycmF5TWFwKHZhbHVlLHRvS2V5KTtyZXR1cm4gaXNTeW1ib2wodmFsdWUpP1t2YWx1ZV06Y29weUFycmF5KHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpKX1mdW5jdGlvbiB1bmlxdWVJZChwcmVmaXgpe3ZhciBpZD0rK2lkQ291bnRlcjtyZXR1cm4gdG9TdHJpbmcocHJlZml4KStpZH12YXIgYWRkPWNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24oYXVnZW5kLGFkZGVuZCl7cmV0dXJuIGF1Z2VuZCthZGRlbmR9LDApO3ZhciBjZWlsPWNyZWF0ZVJvdW5kKCJjZWlsIik7CnZhciBkaXZpZGU9Y3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihkaXZpZGVuZCxkaXZpc29yKXtyZXR1cm4gZGl2aWRlbmQvZGl2aXNvcn0sMSk7dmFyIGZsb29yPWNyZWF0ZVJvdW5kKCJmbG9vciIpO2Z1bmN0aW9uIG1heChhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZUV4dHJlbXVtKGFycmF5LGlkZW50aXR5LGJhc2VHdCk6dW5kZWZpbmVkfWZ1bmN0aW9uIG1heEJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlRXh0cmVtdW0oYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMiksYmFzZUd0KTp1bmRlZmluZWR9ZnVuY3Rpb24gbWVhbihhcnJheSl7cmV0dXJuIGJhc2VNZWFuKGFycmF5LGlkZW50aXR5KX1mdW5jdGlvbiBtZWFuQnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBiYXNlTWVhbihhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSl9ZnVuY3Rpb24gbWluKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD8KYmFzZUV4dHJlbXVtKGFycmF5LGlkZW50aXR5LGJhc2VMdCk6dW5kZWZpbmVkfWZ1bmN0aW9uIG1pbkJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlRXh0cmVtdW0oYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMiksYmFzZUx0KTp1bmRlZmluZWR9dmFyIG11bHRpcGx5PWNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24obXVsdGlwbGllcixtdWx0aXBsaWNhbmQpe3JldHVybiBtdWx0aXBsaWVyKm11bHRpcGxpY2FuZH0sMSk7dmFyIHJvdW5kPWNyZWF0ZVJvdW5kKCJyb3VuZCIpO3ZhciBzdWJ0cmFjdD1jcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG1pbnVlbmQsc3VidHJhaGVuZCl7cmV0dXJuIG1pbnVlbmQtc3VidHJhaGVuZH0sMCk7ZnVuY3Rpb24gc3VtKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlU3VtKGFycmF5LGlkZW50aXR5KTowfWZ1bmN0aW9uIHN1bUJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJgphcnJheS5sZW5ndGg/YmFzZVN1bShhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6MH1sb2Rhc2guYWZ0ZXI9YWZ0ZXI7bG9kYXNoLmFyeT1hcnk7bG9kYXNoLmFzc2lnbj1hc3NpZ247bG9kYXNoLmFzc2lnbkluPWFzc2lnbkluO2xvZGFzaC5hc3NpZ25JbldpdGg9YXNzaWduSW5XaXRoO2xvZGFzaC5hc3NpZ25XaXRoPWFzc2lnbldpdGg7bG9kYXNoLmF0PWF0O2xvZGFzaC5iZWZvcmU9YmVmb3JlO2xvZGFzaC5iaW5kPWJpbmQ7bG9kYXNoLmJpbmRBbGw9YmluZEFsbDtsb2Rhc2guYmluZEtleT1iaW5kS2V5O2xvZGFzaC5jYXN0QXJyYXk9Y2FzdEFycmF5O2xvZGFzaC5jaGFpbj1jaGFpbjtsb2Rhc2guY2h1bms9Y2h1bms7bG9kYXNoLmNvbXBhY3Q9Y29tcGFjdDtsb2Rhc2guY29uY2F0PWNvbmNhdDtsb2Rhc2guY29uZD1jb25kO2xvZGFzaC5jb25mb3Jtcz1jb25mb3Jtcztsb2Rhc2guY29uc3RhbnQ9Y29uc3RhbnQ7bG9kYXNoLmNvdW50Qnk9Y291bnRCeTtsb2Rhc2guY3JlYXRlPQpjcmVhdGU7bG9kYXNoLmN1cnJ5PWN1cnJ5O2xvZGFzaC5jdXJyeVJpZ2h0PWN1cnJ5UmlnaHQ7bG9kYXNoLmRlYm91bmNlPWRlYm91bmNlO2xvZGFzaC5kZWZhdWx0cz1kZWZhdWx0cztsb2Rhc2guZGVmYXVsdHNEZWVwPWRlZmF1bHRzRGVlcDtsb2Rhc2guZGVmZXI9ZGVmZXI7bG9kYXNoLmRlbGF5PWRlbGF5O2xvZGFzaC5kaWZmZXJlbmNlPWRpZmZlcmVuY2U7bG9kYXNoLmRpZmZlcmVuY2VCeT1kaWZmZXJlbmNlQnk7bG9kYXNoLmRpZmZlcmVuY2VXaXRoPWRpZmZlcmVuY2VXaXRoO2xvZGFzaC5kcm9wPWRyb3A7bG9kYXNoLmRyb3BSaWdodD1kcm9wUmlnaHQ7bG9kYXNoLmRyb3BSaWdodFdoaWxlPWRyb3BSaWdodFdoaWxlO2xvZGFzaC5kcm9wV2hpbGU9ZHJvcFdoaWxlO2xvZGFzaC5maWxsPWZpbGw7bG9kYXNoLmZpbHRlcj1maWx0ZXI7bG9kYXNoLmZsYXRNYXA9ZmxhdE1hcDtsb2Rhc2guZmxhdE1hcERlZXA9ZmxhdE1hcERlZXA7bG9kYXNoLmZsYXRNYXBEZXB0aD1mbGF0TWFwRGVwdGg7CmxvZGFzaC5mbGF0dGVuPWZsYXR0ZW47bG9kYXNoLmZsYXR0ZW5EZWVwPWZsYXR0ZW5EZWVwO2xvZGFzaC5mbGF0dGVuRGVwdGg9ZmxhdHRlbkRlcHRoO2xvZGFzaC5mbGlwPWZsaXA7bG9kYXNoLmZsb3c9Zmxvdztsb2Rhc2guZmxvd1JpZ2h0PWZsb3dSaWdodDtsb2Rhc2guZnJvbVBhaXJzPWZyb21QYWlycztsb2Rhc2guZnVuY3Rpb25zPWZ1bmN0aW9ucztsb2Rhc2guZnVuY3Rpb25zSW49ZnVuY3Rpb25zSW47bG9kYXNoLmdyb3VwQnk9Z3JvdXBCeTtsb2Rhc2guaW5pdGlhbD1pbml0aWFsO2xvZGFzaC5pbnRlcnNlY3Rpb249aW50ZXJzZWN0aW9uO2xvZGFzaC5pbnRlcnNlY3Rpb25CeT1pbnRlcnNlY3Rpb25CeTtsb2Rhc2guaW50ZXJzZWN0aW9uV2l0aD1pbnRlcnNlY3Rpb25XaXRoO2xvZGFzaC5pbnZlcnQ9aW52ZXJ0O2xvZGFzaC5pbnZlcnRCeT1pbnZlcnRCeTtsb2Rhc2guaW52b2tlTWFwPWludm9rZU1hcDtsb2Rhc2guaXRlcmF0ZWU9aXRlcmF0ZWU7bG9kYXNoLmtleUJ5PQprZXlCeTtsb2Rhc2gua2V5cz1rZXlzO2xvZGFzaC5rZXlzSW49a2V5c0luO2xvZGFzaC5tYXA9bWFwO2xvZGFzaC5tYXBLZXlzPW1hcEtleXM7bG9kYXNoLm1hcFZhbHVlcz1tYXBWYWx1ZXM7bG9kYXNoLm1hdGNoZXM9bWF0Y2hlcztsb2Rhc2gubWF0Y2hlc1Byb3BlcnR5PW1hdGNoZXNQcm9wZXJ0eTtsb2Rhc2gubWVtb2l6ZT1tZW1vaXplO2xvZGFzaC5tZXJnZT1tZXJnZTtsb2Rhc2gubWVyZ2VXaXRoPW1lcmdlV2l0aDtsb2Rhc2gubWV0aG9kPW1ldGhvZDtsb2Rhc2gubWV0aG9kT2Y9bWV0aG9kT2Y7bG9kYXNoLm1peGluPW1peGluO2xvZGFzaC5uZWdhdGU9bmVnYXRlO2xvZGFzaC5udGhBcmc9bnRoQXJnO2xvZGFzaC5vbWl0PW9taXQ7bG9kYXNoLm9taXRCeT1vbWl0Qnk7bG9kYXNoLm9uY2U9b25jZTtsb2Rhc2gub3JkZXJCeT1vcmRlckJ5O2xvZGFzaC5vdmVyPW92ZXI7bG9kYXNoLm92ZXJBcmdzPW92ZXJBcmdzO2xvZGFzaC5vdmVyRXZlcnk9b3ZlckV2ZXJ5O2xvZGFzaC5vdmVyU29tZT0Kb3ZlclNvbWU7bG9kYXNoLnBhcnRpYWw9cGFydGlhbDtsb2Rhc2gucGFydGlhbFJpZ2h0PXBhcnRpYWxSaWdodDtsb2Rhc2gucGFydGl0aW9uPXBhcnRpdGlvbjtsb2Rhc2gucGljaz1waWNrO2xvZGFzaC5waWNrQnk9cGlja0J5O2xvZGFzaC5wcm9wZXJ0eT1wcm9wZXJ0eTtsb2Rhc2gucHJvcGVydHlPZj1wcm9wZXJ0eU9mO2xvZGFzaC5wdWxsPXB1bGw7bG9kYXNoLnB1bGxBbGw9cHVsbEFsbDtsb2Rhc2gucHVsbEFsbEJ5PXB1bGxBbGxCeTtsb2Rhc2gucHVsbEFsbFdpdGg9cHVsbEFsbFdpdGg7bG9kYXNoLnB1bGxBdD1wdWxsQXQ7bG9kYXNoLnJhbmdlPXJhbmdlO2xvZGFzaC5yYW5nZVJpZ2h0PXJhbmdlUmlnaHQ7bG9kYXNoLnJlYXJnPXJlYXJnO2xvZGFzaC5yZWplY3Q9cmVqZWN0O2xvZGFzaC5yZW1vdmU9cmVtb3ZlO2xvZGFzaC5yZXN0PXJlc3Q7bG9kYXNoLnJldmVyc2U9cmV2ZXJzZTtsb2Rhc2guc2FtcGxlU2l6ZT1zYW1wbGVTaXplO2xvZGFzaC5zZXQ9c2V0O2xvZGFzaC5zZXRXaXRoPQpzZXRXaXRoO2xvZGFzaC5zaHVmZmxlPXNodWZmbGU7bG9kYXNoLnNsaWNlPXNsaWNlO2xvZGFzaC5zb3J0Qnk9c29ydEJ5O2xvZGFzaC5zb3J0ZWRVbmlxPXNvcnRlZFVuaXE7bG9kYXNoLnNvcnRlZFVuaXFCeT1zb3J0ZWRVbmlxQnk7bG9kYXNoLnNwbGl0PXNwbGl0O2xvZGFzaC5zcHJlYWQ9c3ByZWFkO2xvZGFzaC50YWlsPXRhaWw7bG9kYXNoLnRha2U9dGFrZTtsb2Rhc2gudGFrZVJpZ2h0PXRha2VSaWdodDtsb2Rhc2gudGFrZVJpZ2h0V2hpbGU9dGFrZVJpZ2h0V2hpbGU7bG9kYXNoLnRha2VXaGlsZT10YWtlV2hpbGU7bG9kYXNoLnRhcD10YXA7bG9kYXNoLnRocm90dGxlPXRocm90dGxlO2xvZGFzaC50aHJ1PXRocnU7bG9kYXNoLnRvQXJyYXk9dG9BcnJheTtsb2Rhc2gudG9QYWlycz10b1BhaXJzO2xvZGFzaC50b1BhaXJzSW49dG9QYWlyc0luO2xvZGFzaC50b1BhdGg9dG9QYXRoO2xvZGFzaC50b1BsYWluT2JqZWN0PXRvUGxhaW5PYmplY3Q7bG9kYXNoLnRyYW5zZm9ybT0KdHJhbnNmb3JtO2xvZGFzaC51bmFyeT11bmFyeTtsb2Rhc2gudW5pb249dW5pb247bG9kYXNoLnVuaW9uQnk9dW5pb25CeTtsb2Rhc2gudW5pb25XaXRoPXVuaW9uV2l0aDtsb2Rhc2gudW5pcT11bmlxO2xvZGFzaC51bmlxQnk9dW5pcUJ5O2xvZGFzaC51bmlxV2l0aD11bmlxV2l0aDtsb2Rhc2gudW5zZXQ9dW5zZXQ7bG9kYXNoLnVuemlwPXVuemlwO2xvZGFzaC51bnppcFdpdGg9dW56aXBXaXRoO2xvZGFzaC51cGRhdGU9dXBkYXRlO2xvZGFzaC51cGRhdGVXaXRoPXVwZGF0ZVdpdGg7bG9kYXNoLnZhbHVlcz12YWx1ZXM7bG9kYXNoLnZhbHVlc0luPXZhbHVlc0luO2xvZGFzaC53aXRob3V0PXdpdGhvdXQ7bG9kYXNoLndvcmRzPXdvcmRzO2xvZGFzaC53cmFwPXdyYXA7bG9kYXNoLnhvcj14b3I7bG9kYXNoLnhvckJ5PXhvckJ5O2xvZGFzaC54b3JXaXRoPXhvcldpdGg7bG9kYXNoLnppcD16aXA7bG9kYXNoLnppcE9iamVjdD16aXBPYmplY3Q7bG9kYXNoLnppcE9iamVjdERlZXA9CnppcE9iamVjdERlZXA7bG9kYXNoLnppcFdpdGg9emlwV2l0aDtsb2Rhc2guZW50cmllcz10b1BhaXJzO2xvZGFzaC5lbnRyaWVzSW49dG9QYWlyc0luO2xvZGFzaC5leHRlbmQ9YXNzaWduSW47bG9kYXNoLmV4dGVuZFdpdGg9YXNzaWduSW5XaXRoO21peGluKGxvZGFzaCxsb2Rhc2gpO2xvZGFzaC5hZGQ9YWRkO2xvZGFzaC5hdHRlbXB0PWF0dGVtcHQ7bG9kYXNoLmNhbWVsQ2FzZT1jYW1lbENhc2U7bG9kYXNoLmNhcGl0YWxpemU9Y2FwaXRhbGl6ZTtsb2Rhc2guY2VpbD1jZWlsO2xvZGFzaC5jbGFtcD1jbGFtcDtsb2Rhc2guY2xvbmU9Y2xvbmU7bG9kYXNoLmNsb25lRGVlcD1jbG9uZURlZXA7bG9kYXNoLmNsb25lRGVlcFdpdGg9Y2xvbmVEZWVwV2l0aDtsb2Rhc2guY2xvbmVXaXRoPWNsb25lV2l0aDtsb2Rhc2guY29uZm9ybXNUbz1jb25mb3Jtc1RvO2xvZGFzaC5kZWJ1cnI9ZGVidXJyO2xvZGFzaC5kZWZhdWx0VG89ZGVmYXVsdFRvO2xvZGFzaC5kaXZpZGU9ZGl2aWRlO2xvZGFzaC5lbmRzV2l0aD0KZW5kc1dpdGg7bG9kYXNoLmVxPWVxO2xvZGFzaC5lc2NhcGU9ZXNjYXBlO2xvZGFzaC5lc2NhcGVSZWdFeHA9ZXNjYXBlUmVnRXhwO2xvZGFzaC5ldmVyeT1ldmVyeTtsb2Rhc2guZmluZD1maW5kO2xvZGFzaC5maW5kSW5kZXg9ZmluZEluZGV4O2xvZGFzaC5maW5kS2V5PWZpbmRLZXk7bG9kYXNoLmZpbmRMYXN0PWZpbmRMYXN0O2xvZGFzaC5maW5kTGFzdEluZGV4PWZpbmRMYXN0SW5kZXg7bG9kYXNoLmZpbmRMYXN0S2V5PWZpbmRMYXN0S2V5O2xvZGFzaC5mbG9vcj1mbG9vcjtsb2Rhc2guZm9yRWFjaD1mb3JFYWNoO2xvZGFzaC5mb3JFYWNoUmlnaHQ9Zm9yRWFjaFJpZ2h0O2xvZGFzaC5mb3JJbj1mb3JJbjtsb2Rhc2guZm9ySW5SaWdodD1mb3JJblJpZ2h0O2xvZGFzaC5mb3JPd249Zm9yT3duO2xvZGFzaC5mb3JPd25SaWdodD1mb3JPd25SaWdodDtsb2Rhc2guZ2V0PWdldDtsb2Rhc2guZ3Q9Z3Q7bG9kYXNoLmd0ZT1ndGU7bG9kYXNoLmhhcz1oYXM7bG9kYXNoLmhhc0luPWhhc0luOwpsb2Rhc2guaGVhZD1oZWFkO2xvZGFzaC5pZGVudGl0eT1pZGVudGl0eTtsb2Rhc2guaW5jbHVkZXM9aW5jbHVkZXM7bG9kYXNoLmluZGV4T2Y9aW5kZXhPZjtsb2Rhc2guaW5SYW5nZT1pblJhbmdlO2xvZGFzaC5pbnZva2U9aW52b2tlO2xvZGFzaC5pc0FyZ3VtZW50cz1pc0FyZ3VtZW50cztsb2Rhc2guaXNBcnJheT1pc0FycmF5O2xvZGFzaC5pc0FycmF5QnVmZmVyPWlzQXJyYXlCdWZmZXI7bG9kYXNoLmlzQXJyYXlMaWtlPWlzQXJyYXlMaWtlO2xvZGFzaC5pc0FycmF5TGlrZU9iamVjdD1pc0FycmF5TGlrZU9iamVjdDtsb2Rhc2guaXNCb29sZWFuPWlzQm9vbGVhbjtsb2Rhc2guaXNCdWZmZXI9aXNCdWZmZXI7bG9kYXNoLmlzRGF0ZT1pc0RhdGU7bG9kYXNoLmlzRWxlbWVudD1pc0VsZW1lbnQ7bG9kYXNoLmlzRW1wdHk9aXNFbXB0eTtsb2Rhc2guaXNFcXVhbD1pc0VxdWFsO2xvZGFzaC5pc0VxdWFsV2l0aD1pc0VxdWFsV2l0aDtsb2Rhc2guaXNFcnJvcj1pc0Vycm9yO2xvZGFzaC5pc0Zpbml0ZT0KaXNGaW5pdGU7bG9kYXNoLmlzRnVuY3Rpb249aXNGdW5jdGlvbjtsb2Rhc2guaXNJbnRlZ2VyPWlzSW50ZWdlcjtsb2Rhc2guaXNMZW5ndGg9aXNMZW5ndGg7bG9kYXNoLmlzTWFwPWlzTWFwO2xvZGFzaC5pc01hdGNoPWlzTWF0Y2g7bG9kYXNoLmlzTWF0Y2hXaXRoPWlzTWF0Y2hXaXRoO2xvZGFzaC5pc05hTj1pc05hTjtsb2Rhc2guaXNOYXRpdmU9aXNOYXRpdmU7bG9kYXNoLmlzTmlsPWlzTmlsO2xvZGFzaC5pc051bGw9aXNOdWxsO2xvZGFzaC5pc051bWJlcj1pc051bWJlcjtsb2Rhc2guaXNPYmplY3Q9aXNPYmplY3Q7bG9kYXNoLmlzT2JqZWN0TGlrZT1pc09iamVjdExpa2U7bG9kYXNoLmlzUGxhaW5PYmplY3Q9aXNQbGFpbk9iamVjdDtsb2Rhc2guaXNSZWdFeHA9aXNSZWdFeHA7bG9kYXNoLmlzU2FmZUludGVnZXI9aXNTYWZlSW50ZWdlcjtsb2Rhc2guaXNTZXQ9aXNTZXQ7bG9kYXNoLmlzU3RyaW5nPWlzU3RyaW5nO2xvZGFzaC5pc1N5bWJvbD1pc1N5bWJvbDtsb2Rhc2guaXNUeXBlZEFycmF5PQppc1R5cGVkQXJyYXk7bG9kYXNoLmlzVW5kZWZpbmVkPWlzVW5kZWZpbmVkO2xvZGFzaC5pc1dlYWtNYXA9aXNXZWFrTWFwO2xvZGFzaC5pc1dlYWtTZXQ9aXNXZWFrU2V0O2xvZGFzaC5qb2luPWpvaW47bG9kYXNoLmtlYmFiQ2FzZT1rZWJhYkNhc2U7bG9kYXNoLmxhc3Q9bGFzdDtsb2Rhc2gubGFzdEluZGV4T2Y9bGFzdEluZGV4T2Y7bG9kYXNoLmxvd2VyQ2FzZT1sb3dlckNhc2U7bG9kYXNoLmxvd2VyRmlyc3Q9bG93ZXJGaXJzdDtsb2Rhc2gubHQ9bHQ7bG9kYXNoLmx0ZT1sdGU7bG9kYXNoLm1heD1tYXg7bG9kYXNoLm1heEJ5PW1heEJ5O2xvZGFzaC5tZWFuPW1lYW47bG9kYXNoLm1lYW5CeT1tZWFuQnk7bG9kYXNoLm1pbj1taW47bG9kYXNoLm1pbkJ5PW1pbkJ5O2xvZGFzaC5zdHViQXJyYXk9c3R1YkFycmF5O2xvZGFzaC5zdHViRmFsc2U9c3R1YkZhbHNlO2xvZGFzaC5zdHViT2JqZWN0PXN0dWJPYmplY3Q7bG9kYXNoLnN0dWJTdHJpbmc9c3R1YlN0cmluZztsb2Rhc2guc3R1YlRydWU9CnN0dWJUcnVlO2xvZGFzaC5tdWx0aXBseT1tdWx0aXBseTtsb2Rhc2gubnRoPW50aDtsb2Rhc2gubm9Db25mbGljdD1ub0NvbmZsaWN0O2xvZGFzaC5ub29wPW5vb3A7bG9kYXNoLm5vdz1ub3c7bG9kYXNoLnBhZD1wYWQ7bG9kYXNoLnBhZEVuZD1wYWRFbmQ7bG9kYXNoLnBhZFN0YXJ0PXBhZFN0YXJ0O2xvZGFzaC5wYXJzZUludD1wYXJzZUludDtsb2Rhc2gucmFuZG9tPXJhbmRvbTtsb2Rhc2gucmVkdWNlPXJlZHVjZTtsb2Rhc2gucmVkdWNlUmlnaHQ9cmVkdWNlUmlnaHQ7bG9kYXNoLnJlcGVhdD1yZXBlYXQ7bG9kYXNoLnJlcGxhY2U9cmVwbGFjZTtsb2Rhc2gucmVzdWx0PXJlc3VsdDtsb2Rhc2gucm91bmQ9cm91bmQ7bG9kYXNoLnJ1bkluQ29udGV4dD1ydW5JbkNvbnRleHQ7bG9kYXNoLnNhbXBsZT1zYW1wbGU7bG9kYXNoLnNpemU9c2l6ZTtsb2Rhc2guc25ha2VDYXNlPXNuYWtlQ2FzZTtsb2Rhc2guc29tZT1zb21lO2xvZGFzaC5zb3J0ZWRJbmRleD1zb3J0ZWRJbmRleDtsb2Rhc2guc29ydGVkSW5kZXhCeT0Kc29ydGVkSW5kZXhCeTtsb2Rhc2guc29ydGVkSW5kZXhPZj1zb3J0ZWRJbmRleE9mO2xvZGFzaC5zb3J0ZWRMYXN0SW5kZXg9c29ydGVkTGFzdEluZGV4O2xvZGFzaC5zb3J0ZWRMYXN0SW5kZXhCeT1zb3J0ZWRMYXN0SW5kZXhCeTtsb2Rhc2guc29ydGVkTGFzdEluZGV4T2Y9c29ydGVkTGFzdEluZGV4T2Y7bG9kYXNoLnN0YXJ0Q2FzZT1zdGFydENhc2U7bG9kYXNoLnN0YXJ0c1dpdGg9c3RhcnRzV2l0aDtsb2Rhc2guc3VidHJhY3Q9c3VidHJhY3Q7bG9kYXNoLnN1bT1zdW07bG9kYXNoLnN1bUJ5PXN1bUJ5O2xvZGFzaC50ZW1wbGF0ZT10ZW1wbGF0ZTtsb2Rhc2gudGltZXM9dGltZXM7bG9kYXNoLnRvRmluaXRlPXRvRmluaXRlO2xvZGFzaC50b0ludGVnZXI9dG9JbnRlZ2VyO2xvZGFzaC50b0xlbmd0aD10b0xlbmd0aDtsb2Rhc2gudG9Mb3dlcj10b0xvd2VyO2xvZGFzaC50b051bWJlcj10b051bWJlcjtsb2Rhc2gudG9TYWZlSW50ZWdlcj10b1NhZmVJbnRlZ2VyO2xvZGFzaC50b1N0cmluZz0KdG9TdHJpbmc7bG9kYXNoLnRvVXBwZXI9dG9VcHBlcjtsb2Rhc2gudHJpbT10cmltO2xvZGFzaC50cmltRW5kPXRyaW1FbmQ7bG9kYXNoLnRyaW1TdGFydD10cmltU3RhcnQ7bG9kYXNoLnRydW5jYXRlPXRydW5jYXRlO2xvZGFzaC51bmVzY2FwZT11bmVzY2FwZTtsb2Rhc2gudW5pcXVlSWQ9dW5pcXVlSWQ7bG9kYXNoLnVwcGVyQ2FzZT11cHBlckNhc2U7bG9kYXNoLnVwcGVyRmlyc3Q9dXBwZXJGaXJzdDtsb2Rhc2guZWFjaD1mb3JFYWNoO2xvZGFzaC5lYWNoUmlnaHQ9Zm9yRWFjaFJpZ2h0O2xvZGFzaC5maXJzdD1oZWFkO21peGluKGxvZGFzaCxmdW5jdGlvbigpe3ZhciBzb3VyY2U9e307YmFzZUZvck93bihsb2Rhc2gsZnVuY3Rpb24oZnVuYyxtZXRob2ROYW1lKXtpZighaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gucHJvdG90eXBlLG1ldGhvZE5hbWUpKXNvdXJjZVttZXRob2ROYW1lXT1mdW5jfSk7cmV0dXJuIHNvdXJjZX0oKSx7ImNoYWluIjpmYWxzZX0pO2xvZGFzaC5WRVJTSU9OPQpWRVJTSU9OO2FycmF5RWFjaChbImJpbmQiLCJiaW5kS2V5IiwiY3VycnkiLCJjdXJyeVJpZ2h0IiwicGFydGlhbCIsInBhcnRpYWxSaWdodCJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUpe2xvZGFzaFttZXRob2ROYW1lXS5wbGFjZWhvbGRlcj1sb2Rhc2h9KTthcnJheUVhY2goWyJkcm9wIiwidGFrZSJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUsaW5kZXgpe0xhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbihuKXtuPW49PT11bmRlZmluZWQ/MTpuYXRpdmVNYXgodG9JbnRlZ2VyKG4pLDApO3ZhciByZXN1bHQ9dGhpcy5fX2ZpbHRlcmVkX18mJiFpbmRleD9uZXcgTGF6eVdyYXBwZXIodGhpcyk6dGhpcy5jbG9uZSgpO2lmKHJlc3VsdC5fX2ZpbHRlcmVkX18pcmVzdWx0Ll9fdGFrZUNvdW50X189bmF0aXZlTWluKG4scmVzdWx0Ll9fdGFrZUNvdW50X18pO2Vsc2UgcmVzdWx0Ll9fdmlld3NfXy5wdXNoKHsic2l6ZSI6bmF0aXZlTWluKG4sTUFYX0FSUkFZX0xFTkdUSCksCiJ0eXBlIjptZXRob2ROYW1lKyhyZXN1bHQuX19kaXJfXzwwPyJSaWdodCI6IiIpfSk7cmV0dXJuIHJlc3VsdH07TGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWUrIlJpZ2h0Il09ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMucmV2ZXJzZSgpW21ldGhvZE5hbWVdKG4pLnJldmVyc2UoKX19KTthcnJheUVhY2goWyJmaWx0ZXIiLCJtYXAiLCJ0YWtlV2hpbGUiXSxmdW5jdGlvbihtZXRob2ROYW1lLGluZGV4KXt2YXIgdHlwZT1pbmRleCsxLGlzRmlsdGVyPXR5cGU9PUxBWllfRklMVEVSX0ZMQUd8fHR5cGU9PUxBWllfV0hJTEVfRkxBRztMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oaXRlcmF0ZWUpe3ZhciByZXN1bHQ9dGhpcy5jbG9uZSgpO3Jlc3VsdC5fX2l0ZXJhdGVlc19fLnB1c2goeyJpdGVyYXRlZSI6Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyksInR5cGUiOnR5cGV9KTtyZXN1bHQuX19maWx0ZXJlZF9fPXJlc3VsdC5fX2ZpbHRlcmVkX198fAppc0ZpbHRlcjtyZXR1cm4gcmVzdWx0fX0pO2FycmF5RWFjaChbImhlYWQiLCJsYXN0Il0sZnVuY3Rpb24obWV0aG9kTmFtZSxpbmRleCl7dmFyIHRha2VOYW1lPSJ0YWtlIisoaW5kZXg/IlJpZ2h0IjoiIik7TGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdGFrZU5hbWVdKDEpLnZhbHVlKClbMF19fSk7YXJyYXlFYWNoKFsiaW5pdGlhbCIsInRhaWwiXSxmdW5jdGlvbihtZXRob2ROYW1lLGluZGV4KXt2YXIgZHJvcE5hbWU9ImRyb3AiKyhpbmRleD8iIjoiUmlnaHQiKTtMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2ZpbHRlcmVkX18/bmV3IExhenlXcmFwcGVyKHRoaXMpOnRoaXNbZHJvcE5hbWVdKDEpfX0pO0xhenlXcmFwcGVyLnByb3RvdHlwZS5jb21wYWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsdGVyKGlkZW50aXR5KX07TGF6eVdyYXBwZXIucHJvdG90eXBlLmZpbmQ9CmZ1bmN0aW9uKHByZWRpY2F0ZSl7cmV0dXJuIHRoaXMuZmlsdGVyKHByZWRpY2F0ZSkuaGVhZCgpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZExhc3Q9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkuZmluZChwcmVkaWNhdGUpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUuaW52b2tlTWFwPWJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsYXJncyl7aWYodHlwZW9mIHBhdGg9PSJmdW5jdGlvbiIpcmV0dXJuIG5ldyBMYXp5V3JhcHBlcih0aGlzKTtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUpe3JldHVybiBiYXNlSW52b2tlKHZhbHVlLHBhdGgsYXJncyl9KX0pO0xhenlXcmFwcGVyLnByb3RvdHlwZS5yZWplY3Q9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5maWx0ZXIobmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSkpKX07TGF6eVdyYXBwZXIucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHN0YXJ0LGVuZCl7c3RhcnQ9dG9JbnRlZ2VyKHN0YXJ0KTsKdmFyIHJlc3VsdD10aGlzO2lmKHJlc3VsdC5fX2ZpbHRlcmVkX18mJihzdGFydD4wfHxlbmQ8MCkpcmV0dXJuIG5ldyBMYXp5V3JhcHBlcihyZXN1bHQpO2lmKHN0YXJ0PDApcmVzdWx0PXJlc3VsdC50YWtlUmlnaHQoLXN0YXJ0KTtlbHNlIGlmKHN0YXJ0KXJlc3VsdD1yZXN1bHQuZHJvcChzdGFydCk7aWYoZW5kIT09dW5kZWZpbmVkKXtlbmQ9dG9JbnRlZ2VyKGVuZCk7cmVzdWx0PWVuZDwwP3Jlc3VsdC5kcm9wUmlnaHQoLWVuZCk6cmVzdWx0LnRha2UoZW5kLXN0YXJ0KX1yZXR1cm4gcmVzdWx0fTtMYXp5V3JhcHBlci5wcm90b3R5cGUudGFrZVJpZ2h0V2hpbGU9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkudGFrZVdoaWxlKHByZWRpY2F0ZSkucmV2ZXJzZSgpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRha2UoTUFYX0FSUkFZX0xFTkdUSCl9O2Jhc2VGb3JPd24oTGF6eVdyYXBwZXIucHJvdG90eXBlLApmdW5jdGlvbihmdW5jLG1ldGhvZE5hbWUpe3ZhciBjaGVja0l0ZXJhdGVlPS9eKD86ZmlsdGVyfGZpbmR8bWFwfHJlamVjdCl8V2hpbGUkLy50ZXN0KG1ldGhvZE5hbWUpLGlzVGFrZXI9L14oPzpoZWFkfGxhc3QpJC8udGVzdChtZXRob2ROYW1lKSxsb2Rhc2hGdW5jPWxvZGFzaFtpc1Rha2VyPyJ0YWtlIisobWV0aG9kTmFtZT09Imxhc3QiPyJSaWdodCI6IiIpOm1ldGhvZE5hbWVdLHJldFVud3JhcHBlZD1pc1Rha2VyfHwvXmZpbmQvLnRlc3QobWV0aG9kTmFtZSk7aWYoIWxvZGFzaEZ1bmMpcmV0dXJuO2xvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXt2YXIgdmFsdWU9dGhpcy5fX3dyYXBwZWRfXyxhcmdzPWlzVGFrZXI/WzFdOmFyZ3VtZW50cyxpc0xhenk9dmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcixpdGVyYXRlZT1hcmdzWzBdLHVzZUxhenk9aXNMYXp5fHxpc0FycmF5KHZhbHVlKTt2YXIgaW50ZXJjZXB0b3I9ZnVuY3Rpb24odmFsdWUpe3ZhciByZXN1bHQ9CmxvZGFzaEZ1bmMuYXBwbHkobG9kYXNoLGFycmF5UHVzaChbdmFsdWVdLGFyZ3MpKTtyZXR1cm4gaXNUYWtlciYmY2hhaW5BbGw/cmVzdWx0WzBdOnJlc3VsdH07aWYodXNlTGF6eSYmY2hlY2tJdGVyYXRlZSYmdHlwZW9mIGl0ZXJhdGVlPT0iZnVuY3Rpb24iJiZpdGVyYXRlZS5sZW5ndGghPTEpaXNMYXp5PXVzZUxhenk9ZmFsc2U7dmFyIGNoYWluQWxsPXRoaXMuX19jaGFpbl9fLGlzSHlicmlkPSEhdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgsaXNVbndyYXBwZWQ9cmV0VW53cmFwcGVkJiYhY2hhaW5BbGwsb25seUxhenk9aXNMYXp5JiYhaXNIeWJyaWQ7aWYoIXJldFVud3JhcHBlZCYmdXNlTGF6eSl7dmFsdWU9b25seUxhenk/dmFsdWU6bmV3IExhenlXcmFwcGVyKHRoaXMpO3ZhciByZXN1bHQ9ZnVuYy5hcHBseSh2YWx1ZSxhcmdzKTtyZXN1bHQuX19hY3Rpb25zX18ucHVzaCh7ImZ1bmMiOnRocnUsImFyZ3MiOltpbnRlcmNlcHRvcl0sInRoaXNBcmciOnVuZGVmaW5lZH0pO3JldHVybiBuZXcgTG9kYXNoV3JhcHBlcihyZXN1bHQsCmNoYWluQWxsKX1pZihpc1Vud3JhcHBlZCYmb25seUxhenkpcmV0dXJuIGZ1bmMuYXBwbHkodGhpcyxhcmdzKTtyZXN1bHQ9dGhpcy50aHJ1KGludGVyY2VwdG9yKTtyZXR1cm4gaXNVbndyYXBwZWQ/aXNUYWtlcj9yZXN1bHQudmFsdWUoKVswXTpyZXN1bHQudmFsdWUoKTpyZXN1bHR9fSk7YXJyYXlFYWNoKFsicG9wIiwicHVzaCIsInNoaWZ0Iiwic29ydCIsInNwbGljZSIsInVuc2hpZnQiXSxmdW5jdGlvbihtZXRob2ROYW1lKXt2YXIgZnVuYz1hcnJheVByb3RvW21ldGhvZE5hbWVdLGNoYWluTmFtZT0vXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSk/InRhcCI6InRocnUiLHJldFVud3JhcHBlZD0vXig/OnBvcHxzaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpO2xvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHM7aWYocmV0VW53cmFwcGVkJiYhdGhpcy5fX2NoYWluX18pe3ZhciB2YWx1ZT10aGlzLnZhbHVlKCk7CnJldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpP3ZhbHVlOltdLGFyZ3MpfXJldHVybiB0aGlzW2NoYWluTmFtZV0oZnVuY3Rpb24odmFsdWUpe3JldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpP3ZhbHVlOltdLGFyZ3MpfSl9fSk7YmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsZnVuY3Rpb24oZnVuYyxtZXRob2ROYW1lKXt2YXIgbG9kYXNoRnVuYz1sb2Rhc2hbbWV0aG9kTmFtZV07aWYobG9kYXNoRnVuYyl7dmFyIGtleT1sb2Rhc2hGdW5jLm5hbWUrIiIsbmFtZXM9cmVhbE5hbWVzW2tleV18fChyZWFsTmFtZXNba2V5XT1bXSk7bmFtZXMucHVzaCh7Im5hbWUiOm1ldGhvZE5hbWUsImZ1bmMiOmxvZGFzaEZ1bmN9KX19KTtyZWFsTmFtZXNbY3JlYXRlSHlicmlkKHVuZGVmaW5lZCxXUkFQX0JJTkRfS0VZX0ZMQUcpLm5hbWVdPVt7Im5hbWUiOiJ3cmFwcGVyIiwiZnVuYyI6dW5kZWZpbmVkfV07TGF6eVdyYXBwZXIucHJvdG90eXBlLmNsb25lPWxhenlDbG9uZTsKTGF6eVdyYXBwZXIucHJvdG90eXBlLnJldmVyc2U9bGF6eVJldmVyc2U7TGF6eVdyYXBwZXIucHJvdG90eXBlLnZhbHVlPWxhenlWYWx1ZTtsb2Rhc2gucHJvdG90eXBlLmF0PXdyYXBwZXJBdDtsb2Rhc2gucHJvdG90eXBlLmNoYWluPXdyYXBwZXJDaGFpbjtsb2Rhc2gucHJvdG90eXBlLmNvbW1pdD13cmFwcGVyQ29tbWl0O2xvZGFzaC5wcm90b3R5cGUubmV4dD13cmFwcGVyTmV4dDtsb2Rhc2gucHJvdG90eXBlLnBsYW50PXdyYXBwZXJQbGFudDtsb2Rhc2gucHJvdG90eXBlLnJldmVyc2U9d3JhcHBlclJldmVyc2U7bG9kYXNoLnByb3RvdHlwZS50b0pTT049bG9kYXNoLnByb3RvdHlwZS52YWx1ZU9mPWxvZGFzaC5wcm90b3R5cGUudmFsdWU9d3JhcHBlclZhbHVlO2xvZGFzaC5wcm90b3R5cGUuZmlyc3Q9bG9kYXNoLnByb3RvdHlwZS5oZWFkO2lmKHN5bUl0ZXJhdG9yKWxvZGFzaC5wcm90b3R5cGVbc3ltSXRlcmF0b3JdPXdyYXBwZXJUb0l0ZXJhdG9yO3JldHVybiBsb2Rhc2h9Owp2YXIgXz1ydW5JbkNvbnRleHQoKTtpZih0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZ0eXBlb2YgZGVmaW5lLmFtZD09Im9iamVjdCImJmRlZmluZS5hbWQpe3Jvb3QuXz1fO2RlZmluZShmdW5jdGlvbigpe3JldHVybiBffSl9ZWxzZSBpZihmcmVlTW9kdWxlKXsoZnJlZU1vZHVsZS5leHBvcnRzPV8pLl89XztmcmVlRXhwb3J0cy5fPV99ZWxzZSByb290Ll89X30pLmNhbGwodGhpcyk7Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1zb3J0aW5nL3NvcnRpbmcuanMKdmFyIGduOwooZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhnLGwpe2xldCBrOyhmdW5jdGlvbihwKXtwW3AuTkFUVVJBTD0wXT0iTkFUVVJBTCI7cFtwLlJFQUw9MV09IlJFQUwiO3BbcC5FWFBPTkVOVF9TSUdOPTJdPSJFWFBPTkVOVF9TSUdOIjtwW3AuRVhQT05FTlQ9M109IkVYUE9ORU5UIn0pKGt8fChrPXt9KSk7bGV0IG49ay5OQVRVUkFMO2Zvcig7bDxnLmxlbmd0aDtsKyspaWYobj09PWsuTkFUVVJBTClpZigiLiI9PT1nW2xdKW49ay5SRUFMO2Vsc2UgaWYoImUiPT09Z1tsXXx8IkUiPT09Z1tsXSluPWsuRVhQT05FTlRfU0lHTjtlbHNle2lmKCFkKGdbbF0pKWJyZWFrfWVsc2UgaWYobj09PWsuUkVBTClpZigiZSI9PT1nW2xdfHwiRSI9PT1nW2xdKW49ay5FWFBPTkVOVF9TSUdOO2Vsc2V7aWYoIWQoZ1tsXSkpYnJlYWt9ZWxzZSBpZihuPT09ay5FWFBPTkVOVF9TSUdOKWlmKGQoZ1tsXSl8fCIrIj09PWdbbF18fCItIj09PWdbbF0pbj1rLkVYUE9ORU5UO2Vsc2UgYnJlYWs7ZWxzZSBpZihuPT09ay5FWFBPTkVOVCYmCiFkKGdbbF0pKWJyZWFrO3JldHVybiBsfWZ1bmN0aW9uIGQoZyl7cmV0dXJuIjAiPD1nJiYiOSI+PWd9ZnVuY3Rpb24gZihnKXtyZXR1cm4iLyI9PT1nfHwiXyI9PT1nfHxkKGcpfWEuY29tcGFyZVRhZ05hbWVzPWZ1bmN0aW9uKGcsbCl7bGV0IGs9MCxuPTA7Zm9yKDs7KXtpZihrPT09Zy5sZW5ndGgpcmV0dXJuIG49PT1sLmxlbmd0aD8wOi0xO2lmKG49PT1sLmxlbmd0aClyZXR1cm4gMTtpZihkKGdba10pJiZkKGxbbl0pKXt2YXIgcD1rLHE9bjtrPWMoZyxrKzEpO249YyhsLG4rMSk7cD1wYXJzZUZsb2F0KGcuc2xpY2UocCxrKSk7cT1wYXJzZUZsb2F0KGwuc2xpY2UocSxuKSk7aWYocDxxKXJldHVybi0xO2lmKHA+cSlyZXR1cm4gMX1lbHNle2lmKGYoZ1trXSkpe2lmKCFmKGxbbl0pKXJldHVybi0xfWVsc2V7aWYoZihsW25dKSlyZXR1cm4gMTtpZihnW2tdPGxbbl0pcmV0dXJuLTE7aWYoZ1trXT5sW25dKXJldHVybiAxfWsrKztuKyt9fX19KShnbnx8KGduPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9yZXF1ZXN0TWFuYWdlci5qcwp2YXIgUW87CihmdW5jdGlvbihhKXtmdW5jdGlvbiBjKHIsdCx2LHkpe2NvbnN0IHo9bmV3IFhNTEh0dHBSZXF1ZXN0O3oub3BlbihyLHQpO3YmJih6LndpdGhDcmVkZW50aWFscz12KTt5JiZ6LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIseSk7cmV0dXJuIHp9ZnVuY3Rpb24gZChyKXtjb25zdCB0PW5ldyBwO2lmKCFyKXJldHVybiB0Lm1ldGhvZFR5cGU9bi5HRVQsdDt0Lm1ldGhvZFR5cGU9bi5QT1NUO3QuYm9keT1mKHIpO3JldHVybiB0fWZ1bmN0aW9uIGYocil7Y29uc3QgdD1uZXcgRm9ybURhdGE7Zm9yKGxldCB2IGluIHIpdiYmdC5hcHBlbmQodixyW3ZdKTtyZXR1cm4gdH1jbGFzcyBnIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3RoaXMubmFtZT0iUmVxdWVzdENhbmNlbGxhdGlvbkVycm9yIn19YS5SZXF1ZXN0Q2FuY2VsbGF0aW9uRXJyb3I9ZztjbGFzcyBsIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3Iocil7c3VwZXIocik7dGhpcy5uYW1lPQoiSW52YWxpZFJlcXVlc3RPcHRpb25zRXJyb3IiO09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLGwucHJvdG90eXBlKX19YS5JbnZhbGlkUmVxdWVzdE9wdGlvbnNFcnJvcj1sO2NsYXNzIGsgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihyLHQpe3N1cGVyKCk7dGhpcy5tZXNzYWdlPWBSZXF1ZXN0TmV0d29ya0Vycm9yOiAke3Iuc3RhdHVzfSBhdCAke3R9YDt0aGlzLm5hbWU9IlJlcXVlc3ROZXR3b3JrRXJyb3IiO3RoaXMucmVxPXI7dGhpcy51cmw9dH19YS5SZXF1ZXN0TmV0d29ya0Vycm9yPWs7bGV0IG47KGZ1bmN0aW9uKHIpe3IuR0VUPSJHRVQiO3IuUE9TVD0iUE9TVCJ9KShuPWEuSHR0cE1ldGhvZFR5cGV8fChhLkh0dHBNZXRob2RUeXBlPXt9KSk7Y2xhc3MgcHt2YWxpZGF0ZSgpe2lmKHRoaXMubWV0aG9kVHlwZT09PW4uR0VUJiZ0aGlzLmJvZHkpdGhyb3cgbmV3IGwoImJvZHkgbXVzdCBiZSBtaXNzaW5nIGZvciBhIEdFVCByZXF1ZXN0LiIpO319YS5SZXF1ZXN0T3B0aW9ucz0KcDtjbGFzcyBxe2NvbnN0cnVjdG9yKHI9MUUzLHQ9Myl7dGhpcy5fcXVldWU9W107dGhpcy5fbkFjdGl2ZVJlcXVlc3RzPTA7dGhpcy5fblNpbXVsdGFuZW91c1JlcXVlc3RzPXI7dGhpcy5fbWF4UmV0cmllcz10fXJlcXVlc3Qocix0KXt0PWQodCk7cmV0dXJuIHRoaXMucmVxdWVzdFdpdGhPcHRpb25zKHIsdCl9cmVxdWVzdFdpdGhPcHRpb25zKHIsdCl7dC52YWxpZGF0ZSgpO3JldHVybihuZXcgUHJvbWlzZSgodix5KT0+e3RoaXMuX3F1ZXVlLnB1c2goe3Jlc29sdmU6dixyZWplY3Q6eX0pO3RoaXMubGF1bmNoUmVxdWVzdHMoKX0pKS50aGVuKCgpPT50aGlzLnByb21pc2VXaXRoUmV0cmllcyhyLHRoaXMuX21heFJldHJpZXMsdCkpLnRoZW4odj0+e3RoaXMuX25BY3RpdmVSZXF1ZXN0cy0tO3RoaXMubGF1bmNoUmVxdWVzdHMoKTtyZXR1cm4gdn0sdj0+eyJSZXF1ZXN0TmV0d29ya0Vycm9yIj09PXYubmFtZSYmKHRoaXMuX25BY3RpdmVSZXF1ZXN0cy0tLHRoaXMubGF1bmNoUmVxdWVzdHMoKSk7CnJldHVybiBQcm9taXNlLnJlamVjdCh2KX0pfWZldGNoKHIsdCl7cmV0dXJuKG5ldyBQcm9taXNlKCh2LHkpPT57dGhpcy5fcXVldWUucHVzaCh7cmVzb2x2ZTp2LHJlamVjdDp5fSk7dGhpcy5sYXVuY2hSZXF1ZXN0cygpfSkpLnRoZW4oKCk9PntsZXQgdj0xO3JldHVybiBuZXcgUHJvbWlzZSh5PT57Y29uc3Qgej0oKT0+e2ZldGNoKHIsdCkudGhlbih4PT57IXgub2smJnRoaXMuX21heFJldHJpZXM+dj8odisrLHooKSk6KHkoeCksdGhpcy5fbkFjdGl2ZVJlcXVlc3RzLS0sdGhpcy5sYXVuY2hSZXF1ZXN0cygpKX0pfTt6KCl9KX0pfWNsZWFyUXVldWUoKXtmb3IoOzA8dGhpcy5fcXVldWUubGVuZ3RoOyl0aGlzLl9xdWV1ZS5wb3AoKS5yZWplY3QobmV3IGcoIlJlcXVlc3QgY2FuY2VsbGVkIGJ5IGNsZWFyUXVldWUiKSl9YWN0aXZlUmVxdWVzdHMoKXtyZXR1cm4gdGhpcy5fbkFjdGl2ZVJlcXVlc3RzfW91dHN0YW5kaW5nUmVxdWVzdHMoKXtyZXR1cm4gdGhpcy5fbkFjdGl2ZVJlcXVlc3RzKwp0aGlzLl9xdWV1ZS5sZW5ndGh9bGF1bmNoUmVxdWVzdHMoKXtmb3IoO3RoaXMuX25BY3RpdmVSZXF1ZXN0czx0aGlzLl9uU2ltdWx0YW5lb3VzUmVxdWVzdHMmJjA8dGhpcy5fcXVldWUubGVuZ3RoOyl0aGlzLl9uQWN0aXZlUmVxdWVzdHMrKyx0aGlzLl9xdWV1ZS5wb3AoKS5yZXNvbHZlKCl9cHJvbWlzZVdpdGhSZXRyaWVzKHIsdCx2KXtyZXR1cm4gdGhpcy5fcHJvbWlzZUZyb21Vcmwocix2KS50aGVuKHk9PnkseT0+MDx0P3RoaXMucHJvbWlzZVdpdGhSZXRyaWVzKHIsdC0xLHYpOlByb21pc2UucmVqZWN0KHkpKX1fcHJvbWlzZUZyb21Vcmwocix0KXtyZXR1cm4gbmV3IFByb21pc2UoKHYseSk9Pntjb25zdCB6PWModC5tZXRob2RUeXBlLHIsdC53aXRoQ3JlZGVudGlhbHMsdC5jb250ZW50VHlwZSk7ei5vbmxvYWQ9ZnVuY3Rpb24oKXsyMDA9PT16LnN0YXR1cz92KEpTT04ucGFyc2Uoei5yZXNwb25zZVRleHQpKTp5KG5ldyBrKHoscikpfTt6Lm9uZXJyb3I9ZnVuY3Rpb24oKXt5KG5ldyBrKHosCnIpKX07dC5ib2R5P3ouc2VuZCh0LmJvZHkpOnouc2VuZCgpfSl9fWEuUmVxdWVzdE1hbmFnZXI9cX0pKFFvfHwoUW89e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL3VybFBhdGhIZWxwZXJzLmpzCihmdW5jdGlvbihhKXtmdW5jdGlvbiBjKGQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoZCkucmVwbGFjZSgvXCgvZywiJTI4IikucmVwbGFjZSgvXCkvZywiJTI5Iil9YS5hZGRQYXJhbXM9ZnVuY3Rpb24oZCxmKXt2YXIgZz1PYmplY3Qua2V5cyhmKS5zb3J0KCkuZmlsdGVyKGs9PnZvaWQgMCE9PWZba10pO2lmKCFnLmxlbmd0aClyZXR1cm4gZDtjb25zdCBsPS0xIT09ZC5pbmRleE9mKCI/Iik/Ilx4MjYiOiI/IjtnPVtdLmNvbmNhdCguLi5nLm1hcChrPT57Y29uc3Qgbj1mW2tdO3JldHVybihBcnJheS5pc0FycmF5KG4pP246W25dKS5tYXAocD0+YCR7a309JHtjKHApfWApfSkpLmpvaW4oIlx4MjYiKTtyZXR1cm4gZCtsK2d9fSkoUW98fChRbz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJhY2tlbmQvcm91dGVyLmpzCihmdW5jdGlvbihhKXtmdW5jdGlvbiBjKGw9ImRhdGEiKXsiLyI9PT1sW2wubGVuZ3RoLTFdJiYobD1sLnNsaWNlKDAsbC5sZW5ndGgtMSkpO3JldHVybntlbnZpcm9ubWVudDooKT0+ZChsLCIvZW52aXJvbm1lbnQiKSxleHBlcmltZW50czooKT0+ZChsLCIvZXhwZXJpbWVudHMiKSxwbHVnaW5Sb3V0ZTooayxuLHApPT5kKGwrIi9wbHVnaW4iLGAvJHtrfSR7bn1gLHApLHBsdWdpbnNMaXN0aW5nOigpPT5kKGwsIi9wbHVnaW5zX2xpc3RpbmciKSxydW5zOigpPT5kKGwsIi9ydW5zIikscnVuc0ZvckV4cGVyaW1lbnQ6az0+ZChsLCIvZXhwZXJpbWVudF9ydW5zIixmKHtleHBlcmltZW50OlN0cmluZyhrKX0pKX19ZnVuY3Rpb24gZChsLGssbj1uZXcgVVJMU2VhcmNoUGFyYW1zKXtsKz1rO1N0cmluZyhuKSYmKGs9ay5pbmNsdWRlcygiPyIpPyJceDI2IjoiPyIsbCs9aytTdHJpbmcobikpO3JldHVybiBsfWZ1bmN0aW9uIGYobD17fSl7Y29uc3Qgaz1PYmplY3Qua2V5cyhsKS5zb3J0KCkuZmlsdGVyKHA9PgpsW3BdKSxuPW5ldyBVUkxTZWFyY2hQYXJhbXM7ay5mb3JFYWNoKHA9Pntjb25zdCBxPWxbcF07KEFycmF5LmlzQXJyYXkocSk/cTpbcV0pLmZvckVhY2gocj0+bi5hcHBlbmQocCxyKSl9KTtyZXR1cm4gbn1sZXQgZz1jKCk7YS5jcmVhdGVSb3V0ZXI9YzthLmdldFJvdXRlcj1mdW5jdGlvbigpe3JldHVybiBnfTthLnNldFJvdXRlcj1mdW5jdGlvbihsKXtpZihudWxsPT1sKXRocm93IEVycm9yKCJSb3V0ZXIgcmVxdWlyZWQsIGJ1dCBnb3Q6ICIrbCk7Zz1sfTthLmNyZWF0ZVNlYXJjaFBhcmFtPWZ9KShRb3x8KFFvPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9iYXNlU3RvcmUuanMKKGZ1bmN0aW9uKGEpe2NsYXNzIGN7Y29uc3RydWN0b3IoZil7dGhpcy5saXN0ZW5lcj1mfX1hLkxpc3RlbktleT1jO2NsYXNzIGR7Y29uc3RydWN0b3IoKXt0aGlzLnJlcXVlc3RNYW5hZ2VyPW5ldyBhLlJlcXVlc3RNYW5hZ2VyKDEpO3RoaXMuX2xpc3RlbmVycz1uZXcgU2V0O3RoaXMuaW5pdGlhbGl6ZWQ9ITF9cmVmcmVzaCgpe3JldHVybiB0aGlzLmxvYWQoKS50aGVuKCgpPT57dGhpcy5pbml0aWFsaXplZD0hMH0pfWFkZExpc3RlbmVyKGYpe2Y9bmV3IGMoZik7dGhpcy5fbGlzdGVuZXJzLmFkZChmKTtyZXR1cm4gZn1yZW1vdmVMaXN0ZW5lckJ5S2V5KGYpe3RoaXMuX2xpc3RlbmVycy5kZWxldGUoZil9ZW1pdENoYW5nZSgpe3RoaXMuX2xpc3RlbmVycy5mb3JFYWNoKGY9Pnt0cnl7Zi5saXN0ZW5lcigpfWNhdGNoKGcpe319KX19YS5CYXNlU3RvcmU9ZH0pKFFvfHwoUW89e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL2Vudmlyb25tZW50U3RvcmUuanMKKGZ1bmN0aW9uKGEpe2NsYXNzIGMgZXh0ZW5kcyBhLkJhc2VTdG9yZXtsb2FkKCl7Y29uc3QgZD1hLmdldFJvdXRlcigpLmVudmlyb25tZW50KCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChkKS50aGVuKGY9PntmPXtkYXRhTG9jYXRpb246Zi5kYXRhX2xvY2F0aW9uLHdpbmRvd1RpdGxlOmYud2luZG93X3RpdGxlfTtfLmlzRXF1YWwodGhpcy5lbnZpcm9ubWVudCxmKXx8KHRoaXMuZW52aXJvbm1lbnQ9Zix0aGlzLmVtaXRDaGFuZ2UoKSl9KX1nZXREYXRhTG9jYXRpb24oKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LmRhdGFMb2NhdGlvbjoiIn1nZXRXaW5kb3dUaXRsZSgpe3JldHVybiB0aGlzLmVudmlyb25tZW50P3RoaXMuZW52aXJvbm1lbnQud2luZG93VGl0bGU6IiJ9fWEuRW52aXJvbm1lbnRTdG9yZT1jO2EuZW52aXJvbm1lbnRTdG9yZT1uZXcgY30pKFFvfHwoUW89e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL2V4cGVyaW1lbnRzU3RvcmUuanMKKGZ1bmN0aW9uKGEpe2NsYXNzIGMgZXh0ZW5kcyBhLkJhc2VTdG9yZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7dGhpcy5fZXhwZXJpbWVudHM9W119bG9hZCgpe2NvbnN0IGQ9YS5nZXRSb3V0ZXIoKS5leHBlcmltZW50cygpO3JldHVybiB0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZCkudGhlbihmPT57Xy5pc0VxdWFsKHRoaXMuX2V4cGVyaW1lbnRzLGYpfHwodGhpcy5fZXhwZXJpbWVudHM9Zix0aGlzLmVtaXRDaGFuZ2UoKSl9KX1nZXRFeHBlcmltZW50cygpe3JldHVybiB0aGlzLl9leHBlcmltZW50cy5zbGljZSgpfX1hLkV4cGVyaW1lbnRzU3RvcmU9YzthLmV4cGVyaW1lbnRzU3RvcmU9bmV3IGN9KShRb3x8KFFvPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9ydW5zU3RvcmUuanMKKGZ1bmN0aW9uKGEpe2NsYXNzIGMgZXh0ZW5kcyBhLkJhc2VTdG9yZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7dGhpcy5fcnVucz1bXX1sb2FkKCl7Y29uc3QgZD1hLmdldFJvdXRlcigpLnJ1bnMoKTtyZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGQpLnRoZW4oZj0+e18uaXNFcXVhbCh0aGlzLl9ydW5zLGYpfHwodGhpcy5fcnVucz1mLHRoaXMuZW1pdENoYW5nZSgpKX0pfWdldFJ1bnMoKXtyZXR1cm4gdGhpcy5fcnVucy5zbGljZSgpfX1hLlJ1bnNTdG9yZT1jO2EucnVuc1N0b3JlPW5ldyBjfSkoUW98fChRbz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJhY2tlbmQvYmFja2VuZC5qcwooZnVuY3Rpb24oYSl7YS5UWVBFUz1bXTthLmdldFJ1bnNOYW1lZD1mdW5jdGlvbihjKXtyZXR1cm4gXy5rZXlzKGMpLnNvcnQoZ24uY29tcGFyZVRhZ05hbWVzKX07YS5nZXRUYWdzPWZ1bmN0aW9uKGMpe3JldHVybiBfLnVuaW9uLmFwcGx5KG51bGwsXy52YWx1ZXMoYykpLnNvcnQoZ24uY29tcGFyZVRhZ05hbWVzKX07YS5maWx0ZXJUYWdzPWZ1bmN0aW9uKGMsZCl7bGV0IGY9W107ZC5mb3JFYWNoKGc9PmY9Zi5jb25jYXQoY1tnXSkpO3JldHVybiBfLnVuaXEoZikuc29ydChnbi5jb21wYXJlVGFnTmFtZXMpfX0pKFFvfHwoUW89e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL2NhbmNlbGxlci5qcwooZnVuY3Rpb24oYSl7Y2xhc3MgY3tjb25zdHJ1Y3Rvcigpe3RoaXMuY2FuY2VsbGF0aW9uQ291bnQ9MH1jYW5jZWxsYWJsZShkKXtjb25zdCBmPXRoaXMuY2FuY2VsbGF0aW9uQ291bnQ7cmV0dXJuIGc9PmQoe3ZhbHVlOmcsY2FuY2VsbGVkOnRoaXMuY2FuY2VsbGF0aW9uQ291bnQhPT1mfSl9Y2FuY2VsQWxsKCl7dGhpcy5jYW5jZWxsYXRpb25Db3VudCsrfX1hLkNhbmNlbGxlcj1jfSkoUW98fChRbz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJhY2tlbmQvdGYtYmFja2VuZC1wb2x5bWVyLmpzCihmdW5jdGlvbihhKXtQb2x5bWVyKHtpczoidGYtYmFja2VuZCIsX3RlbXBsYXRlOm51bGwsdGZfYmFja2VuZDphfSl9KShRb3x8KFFvPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY2F0ZWdvcml6YXRpb24tdXRpbHMvY2F0ZWdvcml6YXRpb25VdGlscy5qcwp2YXIgUm87CihmdW5jdGlvbihhKXtmdW5jdGlvbiBjKHAscSl7Y29uc3Qgcj0oKCk9Pnt0cnl7cmV0dXJuIG5ldyBSZWdFeHAocSl9Y2F0Y2godCl7cmV0dXJuIG51bGx9fSkoKTtyZXR1cm57bmFtZTpxLG1ldGFkYXRhOnt0eXBlOm4uU0VBUkNIX1JFU1VMVFMsdmFsaWRSZWdleDohIXIsdW5pdmVyc2FsUmVnZXg6Ii4qIj09PXF9LGl0ZW1zOnI/cC5maWx0ZXIodD0+dC5tYXRjaChyKSk6W119fWZ1bmN0aW9uIGQocCxxPSIvIil7Y29uc3Qgcj1bXSx0PXt9O3AuZm9yRWFjaCh2PT57dmFyIHk9di5pbmRleE9mKHEpO3k9MDw9eT92LnNsaWNlKDAseSk6djtpZighdFt5XSl7Y29uc3Qgej17bmFtZTp5LG1ldGFkYXRhOnt0eXBlOm4uUFJFRklYX0dST1VQfSxpdGVtczpbXX07dFt5XT16O3IucHVzaCh6KX10W3ldLml0ZW1zLnB1c2godil9KTtyZXR1cm4gcn1mdW5jdGlvbiBmKHAscT0iIil7cT1bYyhwLHEpXTtwPWQocCk7cmV0dXJuW10uY29uY2F0KHEscCl9ZnVuY3Rpb24gZyhwLHEscil7Y29uc3QgdD0KUW8uZ2V0VGFncyhwKTtyPWYodCxyKTtjb25zdCB2PWwoXy5waWNrKHAscSkpO3JldHVybiByLm1hcCgoe25hbWU6eSxtZXRhZGF0YTp6LGl0ZW1zOnh9KT0+KHtuYW1lOnksbWV0YWRhdGE6eixpdGVtczp4Lm1hcChDPT4oe3RhZzpDLHJ1bnM6KHYuZ2V0KEMpfHxbXSkuc2xpY2UoKX0pKX0pKX1mdW5jdGlvbiBsKHApe2NvbnN0IHE9bmV3IE1hcDtPYmplY3Qua2V5cyhwKS5mb3JFYWNoKHI9PntwW3JdLmZvckVhY2godD0+e2NvbnN0IHY9cS5nZXQodCl8fFtdO3YucHVzaChyKTtxLnNldCh0LHYpfSl9KTtyZXR1cm4gcX1mdW5jdGlvbiBrKHAscSl7Y29uc3Qgcj1nbi5jb21wYXJlVGFnTmFtZXMocC50YWcscS50YWcpO3JldHVybiAwIT1yP3I6Z24uY29tcGFyZVRhZ05hbWVzKHAucnVuLHEucnVuKX1sZXQgbjsoZnVuY3Rpb24ocCl7cFtwLlNFQVJDSF9SRVNVTFRTPTBdPSJTRUFSQ0hfUkVTVUxUUyI7cFtwLlBSRUZJWF9HUk9VUD0xXT0iUFJFRklYX0dST1VQIn0pKG49YS5DYXRlZ29yeVR5cGV8fAooYS5DYXRlZ29yeVR5cGU9e30pKTthLmNhdGVnb3JpemVCeVNlYXJjaFF1ZXJ5PWM7YS5jYXRlZ29yaXplQnlQcmVmaXg9ZDthLmNhdGVnb3JpemU9ZjthLmNhdGVnb3JpemVUYWdzPWc7YS5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zPWZ1bmN0aW9uKHAscSxyKXtyZXR1cm4gZyhwLHEscikubWFwKGZ1bmN0aW9uKHQpe2NvbnN0IHY9Xy5mbGF0dGVuKHQuaXRlbXMubWFwKCh7dGFnOnkscnVuczp6fSk9PnoubWFwKHg9Pih7dGFnOnkscnVuOnh9KSkpKTt2LnNvcnQoayk7cmV0dXJue25hbWU6dC5uYW1lLG1ldGFkYXRhOnQubWV0YWRhdGEsaXRlbXM6dn19KX19KShSb3x8KFJvPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ2xvYmFscy9nbG9iYWxzLmpzCnZhciBTbzsoZnVuY3Rpb24oYSl7bGV0IGM9ITE7YS5zZXRVc2VIYXNoPWZ1bmN0aW9uKGYpe2M9Zn07YS51c2VIYXNoPWZ1bmN0aW9uKCl7cmV0dXJuIGN9O2xldCBkPSIiO2Euc2V0RmFrZUhhc2g9ZnVuY3Rpb24oZil7ZD1mfTthLmdldEZha2VIYXNoPWZ1bmN0aW9uKCl7cmV0dXJuIGR9fSkoU298fChTbz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXN0b3JhZ2UvbGlzdGVuZXJzLmpzCnZhciBUbzsKKGZ1bmN0aW9uKGEpe2NsYXNzIGN7Y29uc3RydWN0b3IoZyl7dGhpcy5saXN0ZW5lcj1nfX1hLkxpc3RlbktleT1jO2NvbnN0IGQ9bmV3IFNldCxmPW5ldyBTZXQ7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhhc2hjaGFuZ2UiLCgpPT57ZC5mb3JFYWNoKGc9PmcubGlzdGVuZXIoKSl9KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic3RvcmFnZSIsKCk9PntmLmZvckVhY2goZz0+Zy5saXN0ZW5lcigpKX0pO2EuYWRkSGFzaExpc3RlbmVyPWZ1bmN0aW9uKGcpe2c9bmV3IGMoZyk7ZC5hZGQoZyk7cmV0dXJuIGd9O2EuYWRkU3RvcmFnZUxpc3RlbmVyPWZ1bmN0aW9uKGcpe2c9bmV3IGMoZyk7Zi5hZGQoZyk7cmV0dXJuIGd9O2EuZmlyZVN0b3JhZ2VDaGFuZ2VkPWZ1bmN0aW9uKCl7Zi5mb3JFYWNoKGc9PmcubGlzdGVuZXIoKSl9O2EucmVtb3ZlSGFzaExpc3RlbmVyQnlLZXk9ZnVuY3Rpb24oZyl7ZC5kZWxldGUoZyl9O2EucmVtb3ZlU3RvcmFnZUxpc3RlbmVyQnlLZXk9ZnVuY3Rpb24oZyl7Zi5kZWxldGUoZyl9fSkoVG98fAooVG89e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zdG9yYWdlL3N0b3JhZ2UuanMKKGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMocSxyKXtmdW5jdGlvbiB0KHgsQz17fSl7Y29uc3Qge2RlZmF1bHRWYWx1ZTpGLHVzZUxvY2FsU3RvcmFnZTpEPSExfT1DO3g9RD93aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oeCk6ayhmKCkpW3hdO3JldHVybiB2b2lkIDA9PXg/Xy5jbG9uZURlZXAoRik6cSh4KX1mdW5jdGlvbiB2KHgsQyxGPXt9KXtjb25zdCB7ZGVmYXVsdFZhbHVlOkQsdXNlTG9jYWxTdG9yYWdlOkI9ITEsdXNlTG9jYXRpb25SZXBsYWNlOkk9ITF9PUY7Rj1yKEMpO0I/KHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh4LEYpLGEuZmlyZVN0b3JhZ2VDaGFuZ2VkKCkpOl8uaXNFcXVhbChDLHQoeCx7dXNlTG9jYWxTdG9yYWdlOkJ9KSl8fChfLmlzRXF1YWwoQyxEKT9uKHgpOihDPWsoZigpKSxDW3hdPUYsZyhsKEMpLEkpKSl9Y29uc3QgeT1bXSx6PVtdO3JldHVybntnZXQ6dCxzZXQ6dixnZXRJbml0aWFsaXplcjpmdW5jdGlvbih4LEMpe2NvbnN0IEY9T2JqZWN0LmFzc2lnbih7ZGVmYXVsdFZhbHVlOkMuZGVmYXVsdFZhbHVlLApwb2x5bWVyUHJvcGVydHk6eCx1c2VMb2NhbFN0b3JhZ2U6ITF9LEMpO3JldHVybiBmdW5jdGlvbigpe2NvbnN0IEQ9ZCh0aGlzLHgpLEI9KCk9Pntjb25zdCBPPXQoRCxGKTtfLmlzRXF1YWwoTyx0aGlzW0YucG9seW1lclByb3BlcnR5XSl8fCh0aGlzW0YucG9seW1lclByb3BlcnR5XT1PKX0sST0oRi51c2VMb2NhbFN0b3JhZ2U/YS5hZGRTdG9yYWdlTGlzdGVuZXI6YS5hZGRIYXNoTGlzdGVuZXIpKCgpPT5CKCkpO0YudXNlTG9jYWxTdG9yYWdlP3oucHVzaChJKTp5LnB1c2goSSk7QigpO3JldHVybiB0aGlzW0YucG9seW1lclByb3BlcnR5XX19LGdldE9ic2VydmVyOmZ1bmN0aW9uKHgsQyl7Y29uc3QgRj1PYmplY3QuYXNzaWduKHtkZWZhdWx0VmFsdWU6Qy5kZWZhdWx0VmFsdWUscG9seW1lclByb3BlcnR5OngsdXNlTG9jYWxTdG9yYWdlOiExfSxDKTtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBEPWQodGhpcyx4KTt2KEQsdGhpc1tGLnBvbHltZXJQcm9wZXJ0eV0sRil9fSxkaXNwb3NlQmluZGluZzpmdW5jdGlvbigpe3kuZm9yRWFjaCh4PT4KYS5yZW1vdmVIYXNoTGlzdGVuZXJCeUtleSh4KSk7ei5mb3JFYWNoKHg9PmEucmVtb3ZlU3RvcmFnZUxpc3RlbmVyQnlLZXkoeCkpfX19ZnVuY3Rpb24gZChxLHIpe3E9cVthLkRJU0FNQklHVUFUT1JdO3JldHVybihudWxsPT1xP1tyXTpbcSxyXSkuam9pbigiLiIpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gU28udXNlSGFzaCgpP3dpbmRvdy5sb2NhdGlvbi5oYXNoLnNsaWNlKDEpOlNvLmdldEZha2VIYXNoKCl9ZnVuY3Rpb24gZyhxLHI9ITEpe1NvLnVzZUhhc2goKT9yP3dpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKCIjIitxKTp3aW5kb3cubG9jYXRpb24uaGFzaD1xOlNvLnNldEZha2VIYXNoKHEpfWZ1bmN0aW9uIGwocSl7bGV0IHI9IiI7dm9pZCAwIT09cVthLlRBQl0mJihyKz1xW2EuVEFCXSk7Y29uc3QgdD1PYmplY3Qua2V5cyhxKS5tYXAodj0+W3YscVt2XV0pLmZpbHRlcih2PT52WzBdIT09YS5UQUIpLm1hcCh2PT5lbmNvZGVVUklDb21wb25lbnQodlswXSkrIlx4M2QiK2VuY29kZVVSSUNvbXBvbmVudCh2WzFdKSkuam9pbigiXHgyNiIpOwpyZXR1cm4gMDx0Lmxlbmd0aD9yKyJceDI2Iit0OnJ9ZnVuY3Rpb24gayhxKXtjb25zdCByPXt9O3Euc3BsaXQoIlx4MjYiKS5mb3JFYWNoKHQ9Pnt0PXQuc3BsaXQoIlx4M2QiKTsxPT09dC5sZW5ndGg/clthLlRBQl09dFswXToyPT09dC5sZW5ndGgmJihyW2RlY29kZVVSSUNvbXBvbmVudCh0WzBdKV09ZGVjb2RlVVJJQ29tcG9uZW50KHRbMV0pKX0pO3JldHVybiByfWZ1bmN0aW9uIG4ocSl7Y29uc3Qgcj1rKGYoKSk7ZGVsZXRlIHJbcV07ZyhsKHIpKX1hLlRBQj0iX190YWJfXyI7YS5ESVNBTUJJR1VBVE9SPSJkaXNhbWJpZ3VhdG9yIjt2YXIgcD1jKHE9PnEscT0+cSk7YS5nZXRTdHJpbmc9cC5nZXQ7YS5zZXRTdHJpbmc9cC5zZXQ7YS5nZXRTdHJpbmdJbml0aWFsaXplcj1wLmdldEluaXRpYWxpemVyO2EuZ2V0U3RyaW5nT2JzZXJ2ZXI9cC5nZXRPYnNlcnZlcjthLmRpc3Bvc2VTdHJpbmdCaW5kaW5nPXAuZGlzcG9zZUJpbmRpbmc7cD1jKHE9PiJ0cnVlIj09PXE/ITA6ImZhbHNlIj09PQpxPyExOnZvaWQgMCxxPT5xLnRvU3RyaW5nKCkpO2EuZ2V0Qm9vbGVhbj1wLmdldDthLnNldEJvb2xlYW49cC5zZXQ7YS5nZXRCb29sZWFuSW5pdGlhbGl6ZXI9cC5nZXRJbml0aWFsaXplcjthLmdldEJvb2xlYW5PYnNlcnZlcj1wLmdldE9ic2VydmVyO2EuZGlzcG9zZUJvb2xlYW5CaW5kaW5nPXAuZGlzcG9zZUJpbmRpbmc7cD1jKHE9PitxLHE9PnEudG9TdHJpbmcoKSk7YS5nZXROdW1iZXI9cC5nZXQ7YS5zZXROdW1iZXI9cC5zZXQ7YS5nZXROdW1iZXJJbml0aWFsaXplcj1wLmdldEluaXRpYWxpemVyO2EuZ2V0TnVtYmVyT2JzZXJ2ZXI9cC5nZXRPYnNlcnZlcjthLmRpc3Bvc2VOdW1iZXJCaW5kaW5nPXAuZGlzcG9zZUJpbmRpbmc7cD1jKHE9PkpTT04ucGFyc2UoYXRvYihxKSkscT0+YnRvYShKU09OLnN0cmluZ2lmeShxKSkpO2EuZ2V0T2JqZWN0PXAuZ2V0O2Euc2V0T2JqZWN0PXAuc2V0O2EuZ2V0T2JqZWN0SW5pdGlhbGl6ZXI9cC5nZXRJbml0aWFsaXplcjthLmdldE9iamVjdE9ic2VydmVyPQpwLmdldE9ic2VydmVyO2EuZGlzcG9zZU9iamVjdEJpbmRpbmc9cC5kaXNwb3NlQmluZGluZzthLm1ha2VCaW5kaW5ncz1jfSkoVG98fChUbz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXN0b3JhZ2UvdGYtc3RvcmFnZS1wb2x5bWVyLmpzCihmdW5jdGlvbihhKXtQb2x5bWVyKHtpczoidGYtc3RvcmFnZSIsX3RlbXBsYXRlOm51bGwsdGZfc3RvcmFnZTphfSl9KShUb3x8KFRvPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY2F0ZWdvcml6YXRpb24tdXRpbHMvdGYtdGFnLWZpbHRlcmVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRhZy1maWx0ZXJlciIscHJvcGVydGllczp7dGFnRmlsdGVyOnt0eXBlOlN0cmluZyxub3RpZnk6ITAsY29tcHV0ZWQ6Il9jb21wdXRlVGFnRmlsdGVyKF90YWdGaWx0ZXIpIn0sX3RhZ0ZpbHRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6VG8uZ2V0U3RyaW5nSW5pdGlhbGl6ZXIoInRhZ0ZpbHRlciIse2RlZmF1bHRWYWx1ZToiIix1c2VMb2NhbFN0b3JhZ2U6ITEscG9seW1lclByb3BlcnR5OiJfdGFnRmlsdGVyIn0pLG9ic2VydmVyOiJfdGFnRmlsdGVyT2JzZXJ2ZXIifX0sX3RhZ0ZpbHRlck9ic2VydmVyOlRvLmdldFN0cmluZ09ic2VydmVyKCJ0YWdGaWx0ZXIiLHtkZWZhdWx0VmFsdWU6IiIsdXNlTG9jYWxTdG9yYWdlOiExLHBvbHltZXJQcm9wZXJ0eToiX3RhZ0ZpbHRlciJ9KSxfY29tcHV0ZVRhZ0ZpbHRlcigpe3JldHVybiB0aGlzLl90YWdGaWx0ZXJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi9hcnJheS11cGRhdGUtaGVscGVyLmpzCnZhciBVbzsoZnVuY3Rpb24oYSl7YS5BcnJheVVwZGF0ZUhlbHBlcj17dXBkYXRlQXJyYXlQcm9wKGMsZCxmKXtsZXQgZz10aGlzLmdldChjKTtpZighQXJyYXkuaXNBcnJheShkKSl0aHJvdyBSYW5nZUVycm9yKGBFeHBlY3RlZCBuZXcgdmFsdWUgdG8gJyR7Y30nIHRvIGJlIGFuIGFycmF5LmApO0FycmF5LmlzQXJyYXkoZyl8fChnPVtdLHRoaXMuc2V0KGMsZykpO2NvbnN0IGw9bmV3IFNldChkLm1hcCgocCxxKT0+ZihwLHEpKSk7bGV0IGs9MCxuPTA7Zm9yKDtrPGcubGVuZ3RoJiZuPGQubGVuZ3RoOylsLmhhcyhmKGdba10saykpPyhmKGdba10sayk9PWYoZFtuXSxuKT90aGlzLnNldChgJHtjfS4ke2t9YCxkW25dKTp0aGlzLnNwbGljZShjLGssMCxkW25dKSxuKyssaysrKTp0aGlzLnNwbGljZShjLGssMSk7azxnLmxlbmd0aCYmdGhpcy5zcGxpY2UoYyxrKTtuPGQubGVuZ3RoJiZ0aGlzLnB1c2goYywuLi5kLnNsaWNlKG4pKX19fSkoVW98fChVbz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRhc2hib2FyZC1jb21tb24vdGYtZGFzaGJvYXJkLWxheW91dC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1kYXNoYm9hcmQtbGF5b3V0In0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRhc2hib2FyZC1jb21tb24vdGYtb3B0aW9uLXNlbGVjdG9yLmh0bWwuanMKUG9seW1lcih7aXM6InRmLW9wdGlvbi1zZWxlY3RvciIscHJvcGVydGllczp7bmFtZTpTdHJpbmcsc2VsZWN0ZWRJZDp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLG9ic2VydmVyOiJfc2VsZWN0ZWRJZENoYW5nZWQifX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpLmZvckVhY2goZnVuY3Rpb24oYSl7dGhpcy5saXN0ZW4oYSwidGFwIiwiX3NlbGVjdFRhcmdldCIpfS5iaW5kKHRoaXMpKX0pfSxfc2VsZWN0VGFyZ2V0OmZ1bmN0aW9uKGEpe3RoaXMuc2VsZWN0ZWRJZD1hLmN1cnJlbnRUYXJnZXQuaWR9LF9zZWxlY3RlZElkQ2hhbmdlZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMucXVlcnlFZmZlY3RpdmVDaGlsZHJlbigiIyIrdGhpcy5zZWxlY3RlZElkKTthJiYodGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpLmZvckVhY2goZnVuY3Rpb24oYyl7Yy5jbGFzc0xpc3QucmVtb3ZlKCJzZWxlY3RlZCIpfSksYS5jbGFzc0xpc3QuYWRkKCJzZWxlY3RlZCIpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWNvbGxhcHNlL2lyb24tY29sbGFwc2UuaHRtbC5qcwpQb2x5bWVyKHtpczoiaXJvbi1jb2xsYXBzZSIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcl0scHJvcGVydGllczp7aG9yaXpvbnRhbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfaG9yaXpvbnRhbENoYW5nZWQifSxvcGVuZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9vcGVuZWRDaGFuZ2VkIn0sdHJhbnNpdGlvbmluZzp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCxyZWFkT25seTohMH0sbm9BbmltYXRpb246e3R5cGU6Qm9vbGVhbn0sX2Rlc2lyZWRTaXplOnt0eXBlOlN0cmluZyx2YWx1ZToiIn19LGdldCBkaW1lbnNpb24oKXtyZXR1cm4gdGhpcy5ob3Jpem9udGFsPyJ3aWR0aCI6ImhlaWdodCJ9LGdldCBfZGltZW5zaW9uTWF4KCl7cmV0dXJuIHRoaXMuaG9yaXpvbnRhbD8ibWF4V2lkdGgiOiJtYXhIZWlnaHQifSxnZXQgX2RpbWVuc2lvbk1heENzcygpe3JldHVybiB0aGlzLmhvcml6b250YWw/Im1heC13aWR0aCI6CiJtYXgtaGVpZ2h0In0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6Imdyb3VwIiwiYXJpYS1oaWRkZW4iOiJ0cnVlIn0sbGlzdGVuZXJzOnt0cmFuc2l0aW9uZW5kOiJfb25UcmFuc2l0aW9uRW5kIn0sdG9nZ2xlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ9IXRoaXMub3BlbmVkfSxzaG93OmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ9ITB9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMX0sdXBkYXRlU2l6ZTpmdW5jdGlvbihhLGMpe2E9ImF1dG8iPT09YT8iIjphO2M9YyYmIXRoaXMubm9BbmltYXRpb24mJnRoaXMuaXNBdHRhY2hlZCYmdGhpcy5fZGVzaXJlZFNpemUhPT1hO3RoaXMuX2Rlc2lyZWRTaXplPWE7dGhpcy5fdXBkYXRlVHJhbnNpdGlvbighMSk7YyYmKGM9dGhpcy5fY2FsY1NpemUoKSwiIj09PWEmJih0aGlzLnN0eWxlW3RoaXMuX2RpbWVuc2lvbk1heF09IiIsYT10aGlzLl9jYWxjU2l6ZSgpKSx0aGlzLnN0eWxlW3RoaXMuX2RpbWVuc2lvbk1heF09Yyx0aGlzLnNjcm9sbFRvcD0KdGhpcy5zY3JvbGxUb3AsdGhpcy5fdXBkYXRlVHJhbnNpdGlvbighMCksYz1hIT09Yyk7dGhpcy5zdHlsZVt0aGlzLl9kaW1lbnNpb25NYXhdPWE7Y3x8dGhpcy5fdHJhbnNpdGlvbkVuZCgpfSxlbmFibGVUcmFuc2l0aW9uOmZ1bmN0aW9uKGEpe1BvbHltZXIuQmFzZS5fd2FybigiYGVuYWJsZVRyYW5zaXRpb24oKWAgaXMgZGVwcmVjYXRlZCwgdXNlIGBub0FuaW1hdGlvbmAgaW5zdGVhZC4iKTt0aGlzLm5vQW5pbWF0aW9uPSFhfSxfdXBkYXRlVHJhbnNpdGlvbjpmdW5jdGlvbihhKXt0aGlzLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj1hJiYhdGhpcy5ub0FuaW1hdGlvbj8iIjoiMHMifSxfaG9yaXpvbnRhbENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnRyYW5zaXRpb25Qcm9wZXJ0eT10aGlzLl9kaW1lbnNpb25NYXhDc3M7dGhpcy5zdHlsZVsibWF4V2lkdGgiPT09dGhpcy5fZGltZW5zaW9uTWF4PyJtYXhIZWlnaHQiOiJtYXhXaWR0aCJdPSIiO3RoaXMudXBkYXRlU2l6ZSh0aGlzLm9wZW5lZD8KImF1dG8iOiIwcHgiLCExKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCF0aGlzLm9wZW5lZCk7dGhpcy5fc2V0VHJhbnNpdGlvbmluZyghMCk7dGhpcy50b2dnbGVDbGFzcygiaXJvbi1jb2xsYXBzZS1jbG9zZWQiLCExKTt0aGlzLnRvZ2dsZUNsYXNzKCJpcm9uLWNvbGxhcHNlLW9wZW5lZCIsITEpO3RoaXMudXBkYXRlU2l6ZSh0aGlzLm9wZW5lZD8iYXV0byI6IjBweCIsITApO3RoaXMub3BlbmVkJiZ0aGlzLmZvY3VzKCl9LF90cmFuc2l0aW9uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZVt0aGlzLl9kaW1lbnNpb25NYXhdPXRoaXMuX2Rlc2lyZWRTaXplO3RoaXMudG9nZ2xlQ2xhc3MoImlyb24tY29sbGFwc2UtY2xvc2VkIiwhdGhpcy5vcGVuZWQpO3RoaXMudG9nZ2xlQ2xhc3MoImlyb24tY29sbGFwc2Utb3BlbmVkIix0aGlzLm9wZW5lZCk7dGhpcy5fdXBkYXRlVHJhbnNpdGlvbighMSk7dGhpcy5ub3RpZnlSZXNpemUoKTsKdGhpcy5fc2V0VHJhbnNpdGlvbmluZyghMSl9LF9vblRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oYSl7UG9seW1lci5kb20oYSkucm9vdFRhcmdldD09PXRoaXMmJnRoaXMuX3RyYW5zaXRpb25FbmQoKX0sX2NhbGNTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbdGhpcy5kaW1lbnNpb25dKyJweCJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcGFnaW5hdGVkLXZpZXcvdGYtZG9tLXJlcGVhdC5odG1sLmpzCnZhciBWbzsKKGZ1bmN0aW9uKGEpe2EuVGZEb21SZXBlYXRCZWhhdmlvcj1bVW8uQXJyYXlVcGRhdGVIZWxwZXIse3Byb3BlcnRpZXM6e2FzOnt0eXBlOlN0cmluZyx2YWx1ZToiaXRlbSJ9LF9jb250ZW50QWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF9kb21Cb290c3RyYXBwZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2N0b3I6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pm51bGx9LF9yZW5kZXJlZEl0ZW1zOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX3JlbmRlcmVkVGVtcGxhdGVJbnN0Ont0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IE1hcH0sX2xydUNhY2hlZEl0ZW1zOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IE1hcH0sX2NhY2hlU2l6ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MTB9LF9nZXRJdGVtS2V5Ont0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT5jPT5KU09OLnN0cmluZ2lmeShjKX19LG9ic2VydmVyczpbIl9ib290c3RyYXBEb20oX2l0ZW1zUmVuZGVyZWQsIGlzQXR0YWNoZWQpIiwiX3VwZGF0ZURvbShfcmVuZGVyZWRJdGVtcy4qLCBfZG9tQm9vdHN0cmFwcGVkKSIsCiJfdXBkYXRlQWN0aXZlKF9jb250ZW50QWN0aXZlKSIsIl90cmltQ2FjaGUoX2NhY2hlU2l6ZSkiXSxzZXRDYWNoZVNpemUoYyl7dGhpcy5fY2FjaGVTaXplPWN9LHNldEdldEl0ZW1LZXkoYyl7dGhpcy5fZ2V0SXRlbUtleT1jfSx1cGRhdGVEb20oYyl7dGhpcy51cGRhdGVBcnJheVByb3AoIl9yZW5kZXJlZEl0ZW1zIixjLHRoaXMuX2dldEl0ZW1LZXkpfSxfZW5zdXJlVGVtcGxhdGl6ZWQoKXtpZighdGhpcy5pc0F0dGFjaGVkKXJldHVybiExO3RoaXMuX2N0b3J8fCh0aGlzLl9jdG9yPVBvbHltZXIuVGVtcGxhdGl6ZS50ZW1wbGF0aXplKHRoaXMucXVlcnlTZWxlY3RvcigidGVtcGxhdGUiKSx0aGlzLHtwYXJlbnRNb2RlbDohMCxpbnN0YW5jZVByb3BzOntbdGhpcy5hc106ITAsYWN0aXZlOnRoaXMuX2NvbnRlbnRBY3RpdmV9LGZvcndhcmRIb3N0UHJvcDpmdW5jdGlvbihjLGQpe3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmZvckVhY2goZj0+e2YuZm9yd2FyZEhvc3RQcm9wKGMsCmQpfSl9fSkpO3JldHVybiEwfSxfYm9vdHN0cmFwRG9tKCl7dGhpcy5faXRlbXNSZW5kZXJlZCYmdGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKSYmIXRoaXMuX2RvbUJvb3RzdHJhcHBlZCYmKEFycmF5LmZyb20odGhpcy5jaGlsZHJlbikuZm9yRWFjaChjPT57UG9seW1lci5kb20odGhpcykucmVtb3ZlQ2hpbGQoYyl9KSx0aGlzLl9scnVDYWNoZWRJdGVtcy5jbGVhcigpLHRoaXMuX3JlbmRlcmVkSXRlbXMuZm9yRWFjaCgoYyxkKT0+dGhpcy5faW5zZXJ0SXRlbShjLGQpKSx0aGlzLl9kb21Cb290c3RyYXBwZWQ9ITApfSxfdXBkYXRlQWN0aXZlKCl7dGhpcy5fZG9tQm9vdHN0cmFwcGVkJiZBcnJheS5mcm9tKHRoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LnZhbHVlcygpKS5mb3JFYWNoKGM9PntjLm5vdGlmeVBhdGgoImFjdGl2ZSIsdGhpcy5fY29udGVudEFjdGl2ZSl9KX0sX3VwZGF0ZURvbShjKXtpZih0aGlzLl9kb21Cb290c3RyYXBwZWQmJiJfcmVuZGVyZWRJdGVtcyIhPWMucGF0aCYmCiJfcmVuZGVyZWRJdGVtcy5sZW5ndGgiIT1jLnBhdGgpaWYoIl9yZW5kZXJlZEl0ZW1zLnNwbGljZXMiPT09Yy5wYXRoKWMudmFsdWUuaW5kZXhTcGxpY2VzLmZvckVhY2goZD0+e2NvbnN0IHtpbmRleDpmLGFkZGVkQ291bnQ6ZyxvYmplY3Q6bCxyZW1vdmVkOmt9PWQ7ay5mb3JFYWNoKG49Pnt0aGlzLl9yZW1vdmVJdGVtKG4sdGhpcy5jaGlsZHJlbltmXSl9KTtsLnNsaWNlKGYsZitnKS5mb3JFYWNoKChuLHApPT50aGlzLl9pbnNlcnRJdGVtKG4sZitwKSk7dGhpcy5fdHJpbUNhY2hlKCl9KTtlbHNle2NvbnN0IGQ9dGhpcy5fZ2V0SXRlbUtleShjLnZhbHVlKTt0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5oYXMoZCk/dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZ2V0KGQpLm5vdGlmeVBhdGgodGhpcy5hcyxjLnZhbHVlKTpjb25zb2xlLndhcm4oYEV4cGVjdGVkICcke2R9JyB0byBleGlzdCBpbiB0aGUgRE9NIGJ1dCBgKyJjb3VsZCBub3QgZmluZCBvbmUuIil9fSxfaW5zZXJ0SXRlbShjLApkKXtpZighdGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKSl0aHJvdyBFcnJvcigiRXhwZWN0ZWQgdGVtcGxhdGl6ZWQgYmVmb3JlIGluc2VydGluZyBhbiBpdGVtIik7Y29uc3QgZj10aGlzLl9nZXRJdGVtS2V5KGMpO2lmKHRoaXMuX2xydUNhY2hlZEl0ZW1zLmhhcyhmKSljPXRoaXMuX2xydUNhY2hlZEl0ZW1zLmdldChmKSx0aGlzLl9scnVDYWNoZWRJdGVtcy5kZWxldGUoZiksdGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZ2V0KGYpLm5vdGlmeVBhdGgoImFjdGl2ZSIsdGhpcy5fY29udGVudEFjdGl2ZSk7ZWxzZXtjb25zdCBnPW5ldyB0aGlzLl9jdG9yKHtbdGhpcy5hc106YyxhY3RpdmU6dGhpcy5fY29udGVudEFjdGl2ZX0pO2M9Zy5yb290O3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LnNldChmLGcpfXRoaXMuY2hpbGRyZW5bZF0/UG9seW1lci5kb20odGhpcykuaW5zZXJ0QmVmb3JlKGMsdGhpcy5jaGlsZHJlbltkXSk6KChjLm5vZGVUeXBlPT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU/CkFycmF5LmZyb20oYy5jaGlsZHJlbik6W2NdKS5mb3JFYWNoKGc9Pmcuc2V0QXR0cmlidXRlKCJzbG90IiwiaXRlbXMiKSksUG9seW1lci5kb20odGhpcykuYXBwZW5kQ2hpbGQoYykpfSxfcmVtb3ZlSXRlbShjLGQpe1BvbHltZXIuZG9tKGQucGFyZW50Tm9kZSkucmVtb3ZlQ2hpbGQoZCk7Yz10aGlzLl9nZXRJdGVtS2V5KGMpO3RoaXMuX2xydUNhY2hlZEl0ZW1zLnNldChjLGQpO3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmdldChjKS5ub3RpZnlQYXRoKCJhY3RpdmUiLCExKX0sX3RyaW1DYWNoZSgpe2Zvcig7dGhpcy5fbHJ1Q2FjaGVkSXRlbXMuc2l6ZT50aGlzLl9jYWNoZVNpemU7KXtjb25zdCBbY109dGhpcy5fbHJ1Q2FjaGVkSXRlbXMua2V5cygpO3RoaXMuX2xydUNhY2hlZEl0ZW1zLmRlbGV0ZShjKTt0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5kZWxldGUoYyl9fX1dfSkoVm98fChWbz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBhZ2luYXRlZC12aWV3L3BhZ2luYXRlZFZpZXdTdG9yZS5qcwp2YXIgV287CihmdW5jdGlvbihhKXtsZXQgYz1udWxsO2NvbnN0IGQ9bmV3IFNldDthLmFkZExpbWl0TGlzdGVuZXI9ZnVuY3Rpb24oZil7ZC5hZGQoZil9O2EucmVtb3ZlTGltaXRMaXN0ZW5lcj1mdW5jdGlvbihmKXtkLmRlbGV0ZShmKX07YS5nZXRMaW1pdD1mdW5jdGlvbigpe251bGw9PWMmJihjPVRvLmdldE51bWJlcigiVEYuVGVuc29yQm9hcmQuUGFnaW5hdGVkVmlldy5saW1pdCIse3VzZUxvY2FsU3RvcmFnZTohMH0pLG51bGw9PWN8fCFpc0Zpbml0ZShjKXx8MD49YykmJihjPTEyKTtyZXR1cm4gY307YS5zZXRMaW1pdD1mdW5jdGlvbihmKXtpZihmIT09TWF0aC5mbG9vcihmKSl0aHJvdyBFcnJvcihgbGltaXQgbXVzdCBiZSBhbiBpbnRlZ2VyLCBidXQgZ290OiAke2Z9YCk7aWYoMD49Zil0aHJvdyBFcnJvcihgbGltaXQgbXVzdCBiZSBwb3NpdGl2ZSwgYnV0IGdvdDogJHtmfWApO2YhPT1jJiYoYz1mLFRvLnNldE51bWJlcigiVEYuVGVuc29yQm9hcmQuUGFnaW5hdGVkVmlldy5saW1pdCIsYywKe3VzZUxvY2FsU3RvcmFnZTohMH0pLGQuZm9yRWFjaChnPT57ZygpfSkpfX0pKFdvfHwoV289e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wYWdpbmF0ZWQtdmlldy90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyIscHJvcGVydGllczp7Y2F0ZWdvcnk6T2JqZWN0LGluaXRpYWxPcGVuZWQ6Qm9vbGVhbixvcGVuZWQ6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAscmVhZE9ubHk6ITB9LF9jb250ZW50QWN0aXZlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQ29udGVudEFjdGl2ZShvcGVuZWQpIn0sZGlzYWJsZVBhZ2luYXRpb246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NvdW50Ont0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVDb3VudChjYXRlZ29yeS5pdGVtcy4qKSJ9LF9oYXNNdWx0aXBsZTp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlKF9jb3VudCkifSxfcGFuZVJlbmRlcmVkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlUGFuZVJlbmRlcmVkKGNhdGVnb3J5KSIsb2JzZXJ2ZXI6Il9vblBhbmVSZW5kZXJlZENoYW5nZWQifSxfaXRlbXNSZW5kZXJlZDp7dHlwZTpCb29sZWFuLApjb21wdXRlZDoiX2NvbXB1dGVJdGVtc1JlbmRlcmVkKG9wZW5lZCwgX3BhbmVSZW5kZXJlZCkifSxfaXNTZWFyY2hSZXN1bHRzOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSXNTZWFyY2hSZXN1bHRzKGNhdGVnb3J5Lm1ldGFkYXRhLnR5cGUpIn0sX2lzSW52YWxpZFNlYXJjaFJlc3VsdHM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVJc0ludmFsaWRTZWFyY2hSZXN1bHRzKGNhdGVnb3J5Lm1ldGFkYXRhKSJ9LF9pc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5Ont0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSXNVbml2ZXJzYWxTZWFyY2hRdWVyeShjYXRlZ29yeS5tZXRhZGF0YSkifSxnZXRDYXRlZ29yeUl0ZW1LZXk6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9PmE9PkpTT04uc3RyaW5naWZ5KGEpLG9ic2VydmVyOiJfZ2V0Q2F0ZWdvcnlJdGVtS2V5Q2hhbmdlZCJ9LF9saW1pdDp7dHlwZTpOdW1iZXIsdmFsdWU6MTIsb2JzZXJ2ZXI6Il9saW1pdENoYW5nZWQifSwKX2FjdGl2ZUluZGV4Ont0eXBlOk51bWJlcix2YWx1ZTowfSxfY3VycmVudFBhZ2U6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRQYWdlKF9saW1pdCwgX2FjdGl2ZUluZGV4KSJ9LF9wYWdlQ291bnQ6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZVBhZ2VDb3VudChjYXRlZ29yeS5pdGVtcy4qLCBfbGltaXQpIn0sX211bHRpcGxlUGFnZXNFeGlzdDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZU11bHRpcGxlUGFnZXNFeGlzdChfcGFnZUNvdW50LCBkaXNhYmxlUGFnaW5hdGlvbikifSxfaGFzUHJldmlvdXNQYWdlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzUHJldmlvdXNQYWdlKF9jdXJyZW50UGFnZSkifSxfaGFzTmV4dFBhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNOZXh0UGFnZShfY3VycmVudFBhZ2UsIF9wYWdlQ291bnQpIn0sX2lucHV0V2lkdGg6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUlucHV0V2lkdGgoX3BhZ2VDb3VudCkiLApvYnNlcnZlcjoiX3VwZGF0ZUlucHV0V2lkdGgifSxfcGFnZUlucHV0VmFsdWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVBhZ2VJbnB1dFZhbHVlKF9wYWdlSW5wdXRGb2N1c2VkLCBfcGFnZUlucHV0UmF3VmFsdWUsIF9jdXJyZW50UGFnZSkiLG9ic2VydmVyOiJfdXBkYXRlUGFnZUlucHV0VmFsdWUifSxfcGFnZUlucHV0UmF3VmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfcGFnZUlucHV0Rm9jdXNlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sb2JzZXJ2ZXJzOlsiX2NsYW1wQWN0aXZlSW5kZXgoY2F0ZWdvcnkuaXRlbXMuKikiLCJfdXBkYXRlUmVuZGVyZWRJdGVtcyhfaXRlbXNSZW5kZXJlZCwgY2F0ZWdvcnkuaXRlbXMuKiwgX2xpbWl0LCBfYWN0aXZlSW5kZXgsIF9wYWdlQ291bnQsIGRpc2FibGVQYWdpbmF0aW9uKSJdLGJlaGF2aW9yczpbVm8uVGZEb21SZXBlYXRCZWhhdmlvcl0sX2NvbXB1dGVDb3VudCgpe3JldHVybiB0aGlzLmNhdGVnb3J5Lml0ZW1zLmxlbmd0aH0sCl9jb21wdXRlSGFzTXVsdGlwbGUoKXtyZXR1cm4gMTx0aGlzLl9jb3VudH0sX3RvZ2dsZVBhbmUoKXt0aGlzLl9zZXRPcGVuZWQoIXRoaXMub3BlbmVkKX0sX2NvbXB1dGVDb250ZW50QWN0aXZlKCl7cmV0dXJuIHRoaXMub3BlbmVkfSxfb25QYW5lUmVuZGVyZWRDaGFuZ2VkKGEsYyl7YSYmYSE9PWMmJnRoaXMuJC5pZlJlbmRlcmVkLnJlbmRlcigpfSxfY29tcHV0ZVBhbmVSZW5kZXJlZChhKXtyZXR1cm4hKGEubWV0YWRhdGEudHlwZT09PVJvLkNhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUUyYmIiI9PT1hLm5hbWUpfSxfY29tcHV0ZUl0ZW1zUmVuZGVyZWQoKXtyZXR1cm4gdGhpcy5fcGFuZVJlbmRlcmVkJiZ0aGlzLm9wZW5lZH0sX2NvbXB1dGVJc1NlYXJjaFJlc3VsdHMoYSl7cmV0dXJuIGE9PT1Sby5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFN9LF9jb21wdXRlSXNJbnZhbGlkU2VhcmNoUmVzdWx0cyhhKXtyZXR1cm4gYS50eXBlPT09Um8uQ2F0ZWdvcnlUeXBlLlNFQVJDSF9SRVNVTFRTJiYKIWEudmFsaWRSZWdleH0sX2NvbXB1dGVJc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5KGEpe3JldHVybiBhLnR5cGU9PT1Sby5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFMmJmEudW5pdmVyc2FsUmVnZXh9LF9pc0NvbXBvc2l0ZVNlYXJjaCgpe2NvbnN0IHt0eXBlOmEsY29tcG9zaXRlU2VhcmNoOmN9PXRoaXMuY2F0ZWdvcnkubWV0YWRhdGE7cmV0dXJuIGMmJmE9PT1Sby5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFN9LHJlYWR5KCl7dGhpcy5fc2V0T3BlbmVkKG51bGw9PXRoaXMuaW5pdGlhbE9wZW5lZD8hMDp0aGlzLmluaXRpYWxPcGVuZWQpO3RoaXMuX2xpbWl0TGlzdGVuZXI9KCk9Pnt0aGlzLnNldCgiX2xpbWl0IixXby5nZXRMaW1pdCgpKX07V28uYWRkTGltaXRMaXN0ZW5lcih0aGlzLl9saW1pdExpc3RlbmVyKTt0aGlzLl9saW1pdExpc3RlbmVyKCl9LGRldGFjaGVkKCl7V28ucmVtb3ZlTGltaXRMaXN0ZW5lcih0aGlzLl9saW1pdExpc3RlbmVyKX0sX3VwZGF0ZVJlbmRlcmVkSXRlbXMoYSwKYyxkLGYsZyxsKXthJiYoYT1NYXRoLmZsb29yKGYvZCksYz10aGlzLmNhdGVnb3J5Lml0ZW1zfHxbXSx0aGlzLnVwZGF0ZURvbShsP2M6Yy5zbGljZShhKmQsKGErMSkqZCksdGhpcy5nZXRDYXRlZ29yeUl0ZW1LZXkpKX0sX2xpbWl0Q2hhbmdlZChhKXt0aGlzLnNldENhY2hlU2l6ZSgyKmEpfSxfZ2V0Q2F0ZWdvcnlJdGVtS2V5Q2hhbmdlZCgpe3RoaXMuc2V0R2V0SXRlbUtleSh0aGlzLmdldENhdGVnb3J5SXRlbUtleSl9LF9jb21wdXRlQ3VycmVudFBhZ2UoYSxjKXtyZXR1cm4gTWF0aC5mbG9vcihjL2EpKzF9LF9jb21wdXRlUGFnZUNvdW50KGEsYyl7cmV0dXJuIHRoaXMuY2F0ZWdvcnk/TWF0aC5jZWlsKHRoaXMuY2F0ZWdvcnkuaXRlbXMubGVuZ3RoL2MpOjB9LF9jb21wdXRlTXVsdGlwbGVQYWdlc0V4aXN0KGEsYyl7cmV0dXJuIWMmJjE8YX0sX2NvbXB1dGVIYXNQcmV2aW91c1BhZ2UoYSl7cmV0dXJuIDE8YX0sX2NvbXB1dGVIYXNOZXh0UGFnZShhLGMpe3JldHVybiBhPGN9LApfY29tcHV0ZUlucHV0V2lkdGgoYSl7cmV0dXJuYGNhbGMoJHthLnRvU3RyaW5nKCkubGVuZ3RofWVtICsgMjBweClgfSxfc2V0QWN0aXZlSW5kZXgoYSl7Y29uc3QgYz0odGhpcy5jYXRlZ29yeS5pdGVtc3x8W10pLmxlbmd0aC0xO2E+YyYmKGE9Yyk7MD5hJiYoYT0wKTt0aGlzLnNldCgiX2FjdGl2ZUluZGV4IixhKX0sX2NsYW1wQWN0aXZlSW5kZXgoKXt0aGlzLl9zZXRBY3RpdmVJbmRleCh0aGlzLl9hY3RpdmVJbmRleCl9LF9wZXJmb3JtUHJldmlvdXNQYWdlKCl7dGhpcy5fc2V0QWN0aXZlSW5kZXgodGhpcy5fYWN0aXZlSW5kZXgtdGhpcy5fbGltaXQpfSxfcGVyZm9ybU5leHRQYWdlKCl7dGhpcy5fc2V0QWN0aXZlSW5kZXgodGhpcy5fYWN0aXZlSW5kZXgrdGhpcy5fbGltaXQpfSxfY29tcHV0ZVBhZ2VJbnB1dFZhbHVlKGEsYyxkKXtyZXR1cm4gYT9jOmQudG9TdHJpbmcoKX0sX2hhbmRsZVBhZ2VJbnB1dEV2ZW50KGEpe3RoaXMuc2V0KCJfcGFnZUlucHV0UmF3VmFsdWUiLGEudGFyZ2V0LnZhbHVlKTsKYT1hLnRhcmdldC52YWx1ZUFzTnVtYmVyO2lzTmFOKGEpfHx0aGlzLl9zZXRBY3RpdmVJbmRleCh0aGlzLl9saW1pdCooTWF0aC5tYXgoMSxNYXRoLm1pbihhLHRoaXMuX3BhZ2VDb3VudCkpLTEpKX0sX2hhbmRsZVBhZ2VDaGFuZ2VFdmVudCgpe3RoaXMuc2V0KCJfcGFnZUlucHV0UmF3VmFsdWUiLHRoaXMuX2N1cnJlbnRQYWdlLnRvU3RyaW5nKCkpfSxfaGFuZGxlUGFnZUZvY3VzRXZlbnQoKXt0aGlzLnNldCgiX3BhZ2VJbnB1dFJhd1ZhbHVlIix0aGlzLl9wYWdlSW5wdXRWYWx1ZSk7dGhpcy5zZXQoIl9wYWdlSW5wdXRGb2N1c2VkIiwhMCl9LF9oYW5kbGVQYWdlQmx1ckV2ZW50KCl7dGhpcy5zZXQoIl9wYWdlSW5wdXRGb2N1c2VkIiwhMSl9LF91cGRhdGVQYWdlSW5wdXRWYWx1ZShhKXtjb25zdCBjPXRoaXMuJCQoIiNwYWdlLWlucHV0IGlucHV0Iik7YyYmKGMudmFsdWU9YSl9LF91cGRhdGVJbnB1dFdpZHRoKCl7dGhpcy51cGRhdGVTdHlsZXMoeyItLXRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3LXBhZ2UtaW5wdXQtd2lkdGgiOnRoaXMuX2lucHV0V2lkdGh9KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1kaWFsb2ctYmVoYXZpb3IvcGFwZXItZGlhbG9nLWJlaGF2aW9yLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9ySW1wbD17aG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImRpYWxvZyIsdGFiaW5kZXg6Ii0xIn0scHJvcGVydGllczp7bW9kYWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX19yZWFkaWVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJfbW9kYWxDaGFuZ2VkKG1vZGFsLCBfX3JlYWRpZWQpIl0sbGlzdGVuZXJzOnt0YXA6Il9vbkRpYWxvZ0NsaWNrIn0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9fcHJldk5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s9dGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrO3RoaXMuX19wcmV2Tm9DYW5jZWxPbkVzY0tleT10aGlzLm5vQ2FuY2VsT25Fc2NLZXk7dGhpcy5fX3ByZXZXaXRoQmFja2Ryb3A9dGhpcy53aXRoQmFja2Ryb3A7dGhpcy5fX3JlYWRpZWQ9ITB9LF9tb2RhbENoYW5nZWQ6ZnVuY3Rpb24oYSxjKXtjJiYoYT8odGhpcy5fX3ByZXZOb0NhbmNlbE9uT3V0c2lkZUNsaWNrPQp0aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2ssdGhpcy5fX3ByZXZOb0NhbmNlbE9uRXNjS2V5PXRoaXMubm9DYW5jZWxPbkVzY0tleSx0aGlzLl9fcHJldldpdGhCYWNrZHJvcD10aGlzLndpdGhCYWNrZHJvcCx0aGlzLndpdGhCYWNrZHJvcD10aGlzLm5vQ2FuY2VsT25Fc2NLZXk9dGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrPSEwKToodGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrPXRoaXMubm9DYW5jZWxPbk91dHNpZGVDbGljayYmdGhpcy5fX3ByZXZOb0NhbmNlbE9uT3V0c2lkZUNsaWNrLHRoaXMubm9DYW5jZWxPbkVzY0tleT10aGlzLm5vQ2FuY2VsT25Fc2NLZXkmJnRoaXMuX19wcmV2Tm9DYW5jZWxPbkVzY0tleSx0aGlzLndpdGhCYWNrZHJvcD10aGlzLndpdGhCYWNrZHJvcCYmdGhpcy5fX3ByZXZXaXRoQmFja2Ryb3ApKX0sX3VwZGF0ZUNsb3NpbmdSZWFzb25Db25maXJtZWQ6ZnVuY3Rpb24oYSl7dGhpcy5jbG9zaW5nUmVhc29uPXRoaXMuY2xvc2luZ1JlYXNvbnx8Cnt9O3RoaXMuY2xvc2luZ1JlYXNvbi5jb25maXJtZWQ9YX0sX29uRGlhbG9nQ2xpY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPVBvbHltZXIuZG9tKGEpLnBhdGgsZD0wLGY9Yy5pbmRleE9mKHRoaXMpO2Q8ZjtkKyspe3ZhciBnPWNbZF07aWYoZy5oYXNBdHRyaWJ1dGUmJihnLmhhc0F0dHJpYnV0ZSgiZGlhbG9nLWRpc21pc3MiKXx8Zy5oYXNBdHRyaWJ1dGUoImRpYWxvZy1jb25maXJtIikpKXt0aGlzLl91cGRhdGVDbG9zaW5nUmVhc29uQ29uZmlybWVkKGcuaGFzQXR0cmlidXRlKCJkaWFsb2ctY29uZmlybSIpKTt0aGlzLmNsb3NlKCk7YS5zdG9wUHJvcGFnYXRpb24oKTticmVha319fX07UG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9yPVtQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3IsUG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9ySW1wbF19KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWRpYWxvZy9wYXBlci1kaWFsb2cuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItZGlhbG9nIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJEaWFsb2dCZWhhdmlvcixQb2x5bWVyLk5lb25BbmltYXRpb25SdW5uZXJCZWhhdmlvcl0sbGlzdGVuZXJzOnsibmVvbi1hbmltYXRpb24tZmluaXNoIjoiX29uTmVvbkFuaW1hdGlvbkZpbmlzaCJ9LF9yZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbEFuaW1hdGlvbigpO3RoaXMucGxheUFuaW1hdGlvbigiZW50cnkiKX0sX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpe3RoaXMuY2FuY2VsQW5pbWF0aW9uKCk7dGhpcy5wbGF5QW5pbWF0aW9uKCJleGl0Iil9LF9vbk5lb25BbmltYXRpb25GaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD90aGlzLl9maW5pc2hSZW5kZXJPcGVuZWQoKTp0aGlzLl9maW5pc2hSZW5kZXJDbG9zZWQoKX19KTsKCi8vIGh0dHBzOi8vZDNqcy5vcmcgdjUuNy4wIENvcHlyaWdodCAyMDE4IE1pa2UgQm9zdG9jawohZnVuY3Rpb24odCxuKXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP24oZXhwb3J0cyk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIl0sbik6bih0LmQzPXQuZDN8fHt9KX0odGhpcyxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LG4pe3JldHVybiB0PG4/LTE6dD5uPzE6dD49bj8wOk5hTn1mdW5jdGlvbiBlKHQpe3ZhciBlO3JldHVybiAxPT09dC5sZW5ndGgmJihlPXQsdD1mdW5jdGlvbih0LHIpe3JldHVybiBuKGUodCkscil9KSx7bGVmdDpmdW5jdGlvbihuLGUscixpKXtmb3IobnVsbD09ciYmKHI9MCksbnVsbD09aSYmKGk9bi5sZW5ndGgpO3I8aTspe3ZhciBvPXIraT4+PjE7dChuW29dLGUpPDA/cj1vKzE6aT1vfXJldHVybiByfSxyaWdodDpmdW5jdGlvbihuLGUscixpKXtmb3IobnVsbD09ciYmKHI9MCksbnVsbD09aSYmKGk9bi5sZW5ndGgpO3I8aTspe3ZhciBvPXIraT4+PjE7dChuW29dLGUpPjA/aT1vOnI9bysxfXJldHVybiByfX19dmFyIHI9ZShuKSxpPXIucmlnaHQsbz1yLmxlZnQ7ZnVuY3Rpb24gYSh0LG4pe3JldHVyblt0LG5dfWZ1bmN0aW9uIHUodCl7cmV0dXJuIG51bGw9PT10P05hTjordH1mdW5jdGlvbiBmKHQsbil7dmFyIGUscixpPXQubGVuZ3RoLG89MCxhPS0xLGY9MCxjPTA7aWYobnVsbD09bilmb3IoOysrYTxpOylpc05hTihlPXUodFthXSkpfHwoYys9KHI9ZS1mKSooZS0oZis9ci8rK28pKSk7ZWxzZSBmb3IoOysrYTxpOylpc05hTihlPXUobih0W2FdLGEsdCkpKXx8KGMrPShyPWUtZikqKGUtKGYrPXIvKytvKSkpO2lmKG8+MSlyZXR1cm4gYy8oby0xKX1mdW5jdGlvbiBjKHQsbil7dmFyIGU9Zih0LG4pO3JldHVybiBlP01hdGguc3FydChlKTplfWZ1bmN0aW9uIHModCxuKXt2YXIgZSxyLGksbz10Lmxlbmd0aCxhPS0xO2lmKG51bGw9PW4pe2Zvcig7KythPG87KWlmKG51bGwhPShlPXRbYV0pJiZlPj1lKWZvcihyPWk9ZTsrK2E8bzspbnVsbCE9KGU9dFthXSkmJihyPmUmJihyPWUpLGk8ZSYmKGk9ZSkpfWVsc2UgZm9yKDsrK2E8bzspaWYobnVsbCE9KGU9bih0W2FdLGEsdCkpJiZlPj1lKWZvcihyPWk9ZTsrK2E8bzspbnVsbCE9KGU9bih0W2FdLGEsdCkpJiYocj5lJiYocj1lKSxpPGUmJihpPWUpKTtyZXR1cm5bcixpXX12YXIgbD1BcnJheS5wcm90b3R5cGUsaD1sLnNsaWNlLGQ9bC5tYXA7ZnVuY3Rpb24gcCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gdih0KXtyZXR1cm4gdH1mdW5jdGlvbiBnKHQsbixlKXt0PSt0LG49K24sZT0oaT1hcmd1bWVudHMubGVuZ3RoKTwyPyhuPXQsdD0wLDEpOmk8Mz8xOitlO2Zvcih2YXIgcj0tMSxpPTB8TWF0aC5tYXgoMCxNYXRoLmNlaWwoKG4tdCkvZSkpLG89bmV3IEFycmF5KGkpOysrcjxpOylvW3JdPXQrciplO3JldHVybiBvfXZhciB5PU1hdGguc3FydCg1MCksXz1NYXRoLnNxcnQoMTApLGI9TWF0aC5zcXJ0KDIpO2Z1bmN0aW9uIG0odCxuLGUpe3ZhciByLGksbyxhLHU9LTE7aWYoZT0rZSwodD0rdCk9PT0obj0rbikmJmU+MClyZXR1cm5bdF07aWYoKHI9bjx0KSYmKGk9dCx0PW4sbj1pKSwwPT09KGE9eCh0LG4sZSkpfHwhaXNGaW5pdGUoYSkpcmV0dXJuW107aWYoYT4wKWZvcih0PU1hdGguY2VpbCh0L2EpLG49TWF0aC5mbG9vcihuL2EpLG89bmV3IEFycmF5KGk9TWF0aC5jZWlsKG4tdCsxKSk7Kyt1PGk7KW9bdV09KHQrdSkqYTtlbHNlIGZvcih0PU1hdGguZmxvb3IodCphKSxuPU1hdGguY2VpbChuKmEpLG89bmV3IEFycmF5KGk9TWF0aC5jZWlsKHQtbisxKSk7Kyt1PGk7KW9bdV09KHQtdSkvYTtyZXR1cm4gciYmby5yZXZlcnNlKCksb31mdW5jdGlvbiB4KHQsbixlKXt2YXIgcj0obi10KS9NYXRoLm1heCgwLGUpLGk9TWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMTApLG89ci9NYXRoLnBvdygxMCxpKTtyZXR1cm4gaT49MD8obz49eT8xMDpvPj1fPzU6bz49Yj8yOjEpKk1hdGgucG93KDEwLGkpOi1NYXRoLnBvdygxMCwtaSkvKG8+PXk/MTA6bz49Xz81Om8+PWI/MjoxKX1mdW5jdGlvbiB3KHQsbixlKXt2YXIgcj1NYXRoLmFicyhuLXQpL01hdGgubWF4KDAsZSksaT1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKHIpL01hdGguTE4xMCkpLG89ci9pO3JldHVybiBvPj15P2kqPTEwOm8+PV8/aSo9NTpvPj1iJiYoaSo9Miksbjx0Py1pOml9ZnVuY3Rpb24gTSh0KXtyZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nKHQubGVuZ3RoKS9NYXRoLkxOMikrMX1mdW5jdGlvbiBBKHQsbixlKXtpZihudWxsPT1lJiYoZT11KSxyPXQubGVuZ3RoKXtpZigobj0rbik8PTB8fHI8MilyZXR1cm4rZSh0WzBdLDAsdCk7aWYobj49MSlyZXR1cm4rZSh0W3ItMV0sci0xLHQpO3ZhciByLGk9KHItMSkqbixvPU1hdGguZmxvb3IoaSksYT0rZSh0W29dLG8sdCk7cmV0dXJuIGErKCtlKHRbbysxXSxvKzEsdCktYSkqKGktbyl9fWZ1bmN0aW9uIFQodCxuKXt2YXIgZSxyLGk9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1uKXtmb3IoOysrbzxpOylpZihudWxsIT0oZT10W29dKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT10W29dKSYmZT5yJiYocj1lKX1lbHNlIGZvcig7KytvPGk7KWlmKG51bGwhPShlPW4odFtvXSxvLHQpKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT1uKHRbb10sbyx0KSkmJmU+ciYmKHI9ZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gTih0KXtmb3IodmFyIG4sZSxyLGk9dC5sZW5ndGgsbz0tMSxhPTA7KytvPGk7KWErPXRbb10ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShhKTstLWk+PTA7KWZvcihuPShyPXRbaV0pLmxlbmd0aDstLW4+PTA7KWVbLS1hXT1yW25dO3JldHVybiBlfWZ1bmN0aW9uIFModCxuKXt2YXIgZSxyLGk9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1uKXtmb3IoOysrbzxpOylpZihudWxsIT0oZT10W29dKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT10W29dKSYmcj5lJiYocj1lKX1lbHNlIGZvcig7KytvPGk7KWlmKG51bGwhPShlPW4odFtvXSxvLHQpKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT1uKHRbb10sbyx0KSkmJnI+ZSYmKHI9ZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gRSh0KXtpZighKGk9dC5sZW5ndGgpKXJldHVybltdO2Zvcih2YXIgbj0tMSxlPVModCxrKSxyPW5ldyBBcnJheShlKTsrK248ZTspZm9yKHZhciBpLG89LTEsYT1yW25dPW5ldyBBcnJheShpKTsrK288aTspYVtvXT10W29dW25dO3JldHVybiByfWZ1bmN0aW9uIGsodCl7cmV0dXJuIHQubGVuZ3RofXZhciBDPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBQKHQpe3JldHVybiB0fXZhciB6PTEsUj0yLEw9MyxEPTQsVT0xZS02O2Z1bmN0aW9uIHEodCl7cmV0dXJuInRyYW5zbGF0ZSgiKyh0Ky41KSsiLDApIn1mdW5jdGlvbiBPKHQpe3JldHVybiJ0cmFuc2xhdGUoMCwiKyh0Ky41KSsiKSJ9ZnVuY3Rpb24gWSgpe3JldHVybiF0aGlzLl9fYXhpc31mdW5jdGlvbiBCKHQsbil7dmFyIGU9W10scj1udWxsLGk9bnVsbCxvPTYsYT02LHU9MyxmPXQ9PT16fHx0PT09RD8tMToxLGM9dD09PUR8fHQ9PT1SPyJ4IjoieSIscz10PT09enx8dD09PUw/cTpPO2Z1bmN0aW9uIGwobCl7dmFyIGg9bnVsbD09cj9uLnRpY2tzP24udGlja3MuYXBwbHkobixlKTpuLmRvbWFpbigpOnIsZD1udWxsPT1pP24udGlja0Zvcm1hdD9uLnRpY2tGb3JtYXQuYXBwbHkobixlKTpQOmkscD1NYXRoLm1heChvLDApK3Usdj1uLnJhbmdlKCksZz0rdlswXSsuNSx5PSt2W3YubGVuZ3RoLTFdKy41LF89KG4uYmFuZHdpZHRoP2Z1bmN0aW9uKHQpe3ZhciBuPU1hdGgubWF4KDAsdC5iYW5kd2lkdGgoKS0xKS8yO3JldHVybiB0LnJvdW5kKCkmJihuPU1hdGgucm91bmQobikpLGZ1bmN0aW9uKGUpe3JldHVybit0KGUpK259fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuK3Qobil9fSkobi5jb3B5KCkpLGI9bC5zZWxlY3Rpb24/bC5zZWxlY3Rpb24oKTpsLG09Yi5zZWxlY3RBbGwoIi5kb21haW4iKS5kYXRhKFtudWxsXSkseD1iLnNlbGVjdEFsbCgiLnRpY2siKS5kYXRhKGgsbikub3JkZXIoKSx3PXguZXhpdCgpLE09eC5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwidGljayIpLEE9eC5zZWxlY3QoImxpbmUiKSxUPXguc2VsZWN0KCJ0ZXh0Iik7bT1tLm1lcmdlKG0uZW50ZXIoKS5pbnNlcnQoInBhdGgiLCIudGljayIpLmF0dHIoImNsYXNzIiwiZG9tYWluIikuYXR0cigic3Ryb2tlIiwiY3VycmVudENvbG9yIikpLHg9eC5tZXJnZShNKSxBPUEubWVyZ2UoTS5hcHBlbmQoImxpbmUiKS5hdHRyKCJzdHJva2UiLCJjdXJyZW50Q29sb3IiKS5hdHRyKGMrIjIiLGYqbykpLFQ9VC5tZXJnZShNLmFwcGVuZCgidGV4dCIpLmF0dHIoImZpbGwiLCJjdXJyZW50Q29sb3IiKS5hdHRyKGMsZipwKS5hdHRyKCJkeSIsdD09PXo/IjBlbSI6dD09PUw/IjAuNzFlbSI6IjAuMzJlbSIpKSxsIT09YiYmKG09bS50cmFuc2l0aW9uKGwpLHg9eC50cmFuc2l0aW9uKGwpLEE9QS50cmFuc2l0aW9uKGwpLFQ9VC50cmFuc2l0aW9uKGwpLHc9dy50cmFuc2l0aW9uKGwpLmF0dHIoIm9wYWNpdHkiLFUpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9Xyh0KSk/cyh0KTp0aGlzLmdldEF0dHJpYnV0ZSgidHJhbnNmb3JtIil9KSxNLmF0dHIoIm9wYWNpdHkiLFUpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7dmFyIG49dGhpcy5wYXJlbnROb2RlLl9fYXhpcztyZXR1cm4gcyhuJiZpc0Zpbml0ZShuPW4odCkpP246Xyh0KSl9KSksdy5yZW1vdmUoKSxtLmF0dHIoImQiLHQ9PT1EfHx0PT1SP2E/Ik0iK2YqYSsiLCIrZysiSDAuNVYiK3krIkgiK2YqYToiTTAuNSwiK2crIlYiK3k6YT8iTSIrZysiLCIrZiphKyJWMC41SCIreSsiViIrZiphOiJNIitnKyIsMC41SCIreSkseC5hdHRyKCJvcGFjaXR5IiwxKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybiBzKF8odCkpfSksQS5hdHRyKGMrIjIiLGYqbyksVC5hdHRyKGMsZipwKS50ZXh0KGQpLGIuZmlsdGVyKFkpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigiZm9udC1zaXplIiwxMCkuYXR0cigiZm9udC1mYW1pbHkiLCJzYW5zLXNlcmlmIikuYXR0cigidGV4dC1hbmNob3IiLHQ9PT1SPyJzdGFydCI6dD09PUQ/ImVuZCI6Im1pZGRsZSIpLGIuZWFjaChmdW5jdGlvbigpe3RoaXMuX19heGlzPV99KX1yZXR1cm4gbC5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGwpOm59LGwudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gZT1DLmNhbGwoYXJndW1lbnRzKSxsfSxsLnRpY2tBcmd1bWVudHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9bXTpDLmNhbGwodCksbCk6ZS5zbGljZSgpfSxsLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09dD9udWxsOkMuY2FsbCh0KSxsKTpyJiZyLnNsaWNlKCl9LGwudGlja0Zvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LGwpOml9LGwudGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89YT0rdCxsKTpvfSxsLnRpY2tTaXplSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3QsbCk6b30sbC50aWNrU2l6ZU91dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSt0LGwpOmF9LGwudGlja1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9K3QsbCk6dX0sbH12YXIgRj17dmFsdWU6ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBJKCl7Zm9yKHZhciB0LG49MCxlPWFyZ3VtZW50cy5sZW5ndGgscj17fTtuPGU7KytuKXtpZighKHQ9YXJndW1lbnRzW25dKyIiKXx8dCBpbiByKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO3JbdF09W119cmV0dXJuIG5ldyBIKHIpfWZ1bmN0aW9uIEgodCl7dGhpcy5fPXR9ZnVuY3Rpb24gaih0LG4pe2Zvcih2YXIgZSxyPTAsaT10Lmxlbmd0aDtyPGk7KytyKWlmKChlPXRbcl0pLm5hbWU9PT1uKXJldHVybiBlLnZhbHVlfWZ1bmN0aW9uIFgodCxuLGUpe2Zvcih2YXIgcj0wLGk9dC5sZW5ndGg7cjxpOysrcilpZih0W3JdLm5hbWU9PT1uKXt0W3JdPUYsdD10LnNsaWNlKDAscikuY29uY2F0KHQuc2xpY2UocisxKSk7YnJlYWt9cmV0dXJuIG51bGwhPWUmJnQucHVzaCh7bmFtZTpuLHZhbHVlOmV9KSx0fUgucHJvdG90eXBlPUkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpILG9uOmZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXRoaXMuXyxvPShyPWksKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIG49IiIsZT10LmluZGV4T2YoIi4iKTtpZihlPj0wJiYobj10LnNsaWNlKGUrMSksdD10LnNsaWNlKDAsZSkpLHQmJiFyLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO3JldHVybnt0eXBlOnQsbmFtZTpufX0pKSxhPS0xLHU9by5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1uJiYiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrbik7Zm9yKDsrK2E8dTspaWYoZT0odD1vW2FdKS50eXBlKWlbZV09WChpW2VdLHQubmFtZSxuKTtlbHNlIGlmKG51bGw9PW4pZm9yKGUgaW4gaSlpW2VdPVgoaVtlXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK2E8dTspaWYoKGU9KHQ9b1thXSkudHlwZSkmJihlPWooaVtlXSx0Lm5hbWUpKSlyZXR1cm4gZX0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LG49dGhpcy5fO2Zvcih2YXIgZSBpbiBuKXRbZV09bltlXS5zbGljZSgpO3JldHVybiBuZXcgSCh0KX0sY2FsbDpmdW5jdGlvbih0LG4pe2lmKChlPWFyZ3VtZW50cy5sZW5ndGgtMik+MClmb3IodmFyIGUscixpPW5ldyBBcnJheShlKSxvPTA7bzxlOysrbylpW29dPWFyZ3VtZW50c1tvKzJdO2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKG89MCxlPShyPXRoaXMuX1t0XSkubGVuZ3RoO288ZTsrK28pcltvXS52YWx1ZS5hcHBseShuLGkpfSxhcHBseTpmdW5jdGlvbih0LG4sZSl7aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3IodmFyIHI9dGhpcy5fW3RdLGk9MCxvPXIubGVuZ3RoO2k8bzsrK2kpcltpXS52YWx1ZS5hcHBseShuLGUpfX07dmFyIEc9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLFY9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOkcseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTtmdW5jdGlvbiAkKHQpe3ZhciBuPXQrPSIiLGU9bi5pbmRleE9mKCI6Iik7cmV0dXJuIGU+PTAmJiJ4bWxucyIhPT0obj10LnNsaWNlKDAsZSkpJiYodD10LnNsaWNlKGUrMSkpLFYuaGFzT3duUHJvcGVydHkobik/e3NwYWNlOlZbbl0sbG9jYWw6dH06dH1mdW5jdGlvbiBXKHQpe3ZhciBuPSQodCk7cmV0dXJuKG4ubG9jYWw/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlModC5zcGFjZSx0LmxvY2FsKX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMub3duZXJEb2N1bWVudCxlPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBlPT09RyYmbi5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJPT09Rz9uLmNyZWF0ZUVsZW1lbnQodCk6bi5jcmVhdGVFbGVtZW50TlMoZSx0KX19KShuKX1mdW5jdGlvbiBaKCl7fWZ1bmN0aW9uIFEodCl7cmV0dXJuIG51bGw9PXQ/WjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IodCl9fWZ1bmN0aW9uIEooKXtyZXR1cm5bXX1mdW5jdGlvbiBLKHQpe3JldHVybiBudWxsPT10P0o6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHQpfX12YXIgdHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2hlcyh0KX19O2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpe3ZhciBudD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7aWYoIW50Lm1hdGNoZXMpe3ZhciBldD1udC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG50Lm1zTWF0Y2hlc1NlbGVjdG9yfHxudC5tb3pNYXRjaGVzU2VsZWN0b3J8fG50Lm9NYXRjaGVzU2VsZWN0b3I7dHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGV0LmNhbGwodGhpcyx0KX19fX12YXIgcnQ9dHQ7ZnVuY3Rpb24gaXQodCl7cmV0dXJuIG5ldyBBcnJheSh0Lmxlbmd0aCl9ZnVuY3Rpb24gb3QodCxuKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPW59b3QucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpvdCxhcHBlbmRDaGlsZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LHRoaXMuX25leHQpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LG4pfSxxdWVyeVNlbGVjdG9yOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3Rvcih0KX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCl9fTt2YXIgYXQ9IiQiO2Z1bmN0aW9uIHV0KHQsbixlLHIsaSxvKXtmb3IodmFyIGEsdT0wLGY9bi5sZW5ndGgsYz1vLmxlbmd0aDt1PGM7Kyt1KShhPW5bdV0pPyhhLl9fZGF0YV9fPW9bdV0sclt1XT1hKTplW3VdPW5ldyBvdCh0LG9bdV0pO2Zvcig7dTxmOysrdSkoYT1uW3VdKSYmKGlbdV09YSl9ZnVuY3Rpb24gZnQodCxuLGUscixpLG8sYSl7dmFyIHUsZixjLHM9e30sbD1uLmxlbmd0aCxoPW8ubGVuZ3RoLGQ9bmV3IEFycmF5KGwpO2Zvcih1PTA7dTxsOysrdSkoZj1uW3VdKSYmKGRbdV09Yz1hdCthLmNhbGwoZixmLl9fZGF0YV9fLHUsbiksYyBpbiBzP2lbdV09ZjpzW2NdPWYpO2Zvcih1PTA7dTxoOysrdSkoZj1zW2M9YXQrYS5jYWxsKHQsb1t1XSx1LG8pXSk/KHJbdV09ZixmLl9fZGF0YV9fPW9bdV0sc1tjXT1udWxsKTplW3VdPW5ldyBvdCh0LG9bdV0pO2Zvcih1PTA7dTxsOysrdSkoZj1uW3VdKSYmc1tkW3VdXT09PWYmJihpW3VdPWYpfWZ1bmN0aW9uIGN0KHQsbil7cmV0dXJuIHQ8bj8tMTp0Pm4/MTp0Pj1uPzA6TmFOfWZ1bmN0aW9uIHN0KHQpe3JldHVybiB0Lm93bmVyRG9jdW1lbnQmJnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8dC5kb2N1bWVudCYmdHx8dC5kZWZhdWx0Vmlld31mdW5jdGlvbiBsdCh0LG4pe3JldHVybiB0LnN0eWxlLmdldFByb3BlcnR5VmFsdWUobil8fHN0KHQpLmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pfWZ1bmN0aW9uIGh0KHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiBkdCh0KXtyZXR1cm4gdC5jbGFzc0xpc3R8fG5ldyBwdCh0KX1mdW5jdGlvbiBwdCh0KXt0aGlzLl9ub2RlPXQsdGhpcy5fbmFtZXM9aHQodC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX1mdW5jdGlvbiB2dCh0LG4pe2Zvcih2YXIgZT1kdCh0KSxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KWUuYWRkKG5bcl0pfWZ1bmN0aW9uIGd0KHQsbil7Zm9yKHZhciBlPWR0KHQpLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspZS5yZW1vdmUobltyXSl9ZnVuY3Rpb24geXQoKXt0aGlzLnRleHRDb250ZW50PSIifWZ1bmN0aW9uIF90KCl7dGhpcy5pbm5lckhUTUw9IiJ9ZnVuY3Rpb24gYnQoKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gbXQoKXt0aGlzLnByZXZpb3VzU2libGluZyYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKX1mdW5jdGlvbiB4dCgpe3JldHVybiBudWxsfWZ1bmN0aW9uIHd0KCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gTXQoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZSghMSksdGhpcy5uZXh0U2libGluZyl9ZnVuY3Rpb24gQXQoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZSghMCksdGhpcy5uZXh0U2libGluZyl9cHQucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtuPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKG4sMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgVHQ9e307KHQuZXZlbnQ9bnVsbCwidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KSYmKCJvbm1vdXNlZW50ZXIiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHwoVHQ9e21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSkpO2Z1bmN0aW9uIE50KHQsbixlKXtyZXR1cm4gdD1TdCh0LG4sZSksZnVuY3Rpb24obil7dmFyIGU9bi5yZWxhdGVkVGFyZ2V0O2UmJihlPT09dGhpc3x8OCZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpKXx8dC5jYWxsKHRoaXMsbil9fWZ1bmN0aW9uIFN0KG4sZSxyKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIG89dC5ldmVudDt0LmV2ZW50PWk7dHJ5e24uY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZSxyKX1maW5hbGx5e3QuZXZlbnQ9b319fWZ1bmN0aW9uIEV0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMuX19vbjtpZihuKXtmb3IodmFyIGUscj0wLGk9LTEsbz1uLmxlbmd0aDtyPG87KytyKWU9bltyXSx0LnR5cGUmJmUudHlwZSE9PXQudHlwZXx8ZS5uYW1lIT09dC5uYW1lP25bKytpXT1lOnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLnR5cGUsZS5saXN0ZW5lcixlLmNhcHR1cmUpOysraT9uLmxlbmd0aD1pOmRlbGV0ZSB0aGlzLl9fb259fX1mdW5jdGlvbiBrdCh0LG4sZSl7dmFyIHI9VHQuaGFzT3duUHJvcGVydHkodC50eXBlKT9OdDpTdDtyZXR1cm4gZnVuY3Rpb24oaSxvLGEpe3ZhciB1LGY9dGhpcy5fX29uLGM9cihuLG8sYSk7aWYoZilmb3IodmFyIHM9MCxsPWYubGVuZ3RoO3M8bDsrK3MpaWYoKHU9ZltzXSkudHlwZT09PXQudHlwZSYmdS5uYW1lPT09dC5uYW1lKXJldHVybiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodS50eXBlLHUubGlzdGVuZXIsdS5jYXB0dXJlKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIodS50eXBlLHUubGlzdGVuZXI9Yyx1LmNhcHR1cmU9ZSksdm9pZCh1LnZhbHVlPW4pO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LnR5cGUsYyxlKSx1PXt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSx2YWx1ZTpuLGxpc3RlbmVyOmMsY2FwdHVyZTplfSxmP2YucHVzaCh1KTp0aGlzLl9fb249W3VdfX1mdW5jdGlvbiBDdChuLGUscixpKXt2YXIgbz10LmV2ZW50O24uc291cmNlRXZlbnQ9dC5ldmVudCx0LmV2ZW50PW47dHJ5e3JldHVybiBlLmFwcGx5KHIsaSl9ZmluYWxseXt0LmV2ZW50PW99fWZ1bmN0aW9uIFB0KHQsbixlKXt2YXIgcj1zdCh0KSxpPXIuQ3VzdG9tRXZlbnQ7ImZ1bmN0aW9uIj09dHlwZW9mIGk/aT1uZXcgaShuLGUpOihpPXIuZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZT8oaS5pbml0RXZlbnQobixlLmJ1YmJsZXMsZS5jYW5jZWxhYmxlKSxpLmRldGFpbD1lLmRldGFpbCk6aS5pbml0RXZlbnQobiwhMSwhMSkpLHQuZGlzcGF0Y2hFdmVudChpKX12YXIgenQ9W251bGxdO2Z1bmN0aW9uIFJ0KHQsbil7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1ufWZ1bmN0aW9uIEx0KCl7cmV0dXJuIG5ldyBSdChbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLHp0KX1mdW5jdGlvbiBEdCh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFJ0KFtbZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0KV1dLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgUnQoW1t0XV0senQpfVJ0LnByb3RvdHlwZT1MdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlJ0LHNlbGVjdDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9USh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyxhLHU9bltpXSxmPXUubGVuZ3RoLGM9cltpXT1uZXcgQXJyYXkoZikscz0wO3M8ZjsrK3MpKG89dVtzXSkmJihhPXQuY2FsbChvLG8uX19kYXRhX18scyx1KSkmJigiX19kYXRhX18iaW4gbyYmKGEuX19kYXRhX189by5fX2RhdGFfXyksY1tzXT1hKTtyZXR1cm4gbmV3IFJ0KHIsdGhpcy5fcGFyZW50cyl9LHNlbGVjdEFsbDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9Syh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9W10saT1bXSxvPTA7bzxlOysrbylmb3IodmFyIGEsdT1uW29dLGY9dS5sZW5ndGgsYz0wO2M8ZjsrK2MpKGE9dVtjXSkmJihyLnB1c2godC5jYWxsKGEsYS5fX2RhdGFfXyxjLHUpKSxpLnB1c2goYSkpO3JldHVybiBuZXcgUnQocixpKX0sZmlsdGVyOmZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1ydCh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyxhPW5baV0sdT1hLmxlbmd0aCxmPXJbaV09W10sYz0wO2M8dTsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmZi5wdXNoKG8pO3JldHVybiBuZXcgUnQocix0aGlzLl9wYXJlbnRzKX0sZGF0YTpmdW5jdGlvbih0LG4pe2lmKCF0KXJldHVybiBwPW5ldyBBcnJheSh0aGlzLnNpemUoKSkscz0tMSx0aGlzLmVhY2goZnVuY3Rpb24odCl7cFsrK3NdPXR9KSxwO3ZhciBlLHI9bj9mdDp1dCxpPXRoaXMuX3BhcmVudHMsbz10aGlzLl9ncm91cHM7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJihlPXQsdD1mdW5jdGlvbigpe3JldHVybiBlfSk7Zm9yKHZhciBhPW8ubGVuZ3RoLHU9bmV3IEFycmF5KGEpLGY9bmV3IEFycmF5KGEpLGM9bmV3IEFycmF5KGEpLHM9MDtzPGE7KytzKXt2YXIgbD1pW3NdLGg9b1tzXSxkPWgubGVuZ3RoLHA9dC5jYWxsKGwsbCYmbC5fX2RhdGFfXyxzLGkpLHY9cC5sZW5ndGgsZz1mW3NdPW5ldyBBcnJheSh2KSx5PXVbc109bmV3IEFycmF5KHYpO3IobCxoLGcseSxjW3NdPW5ldyBBcnJheShkKSxwLG4pO2Zvcih2YXIgXyxiLG09MCx4PTA7bTx2OysrbSlpZihfPWdbbV0pe2ZvcihtPj14JiYoeD1tKzEpOyEoYj15W3hdKSYmKyt4PHY7KTtfLl9uZXh0PWJ8fG51bGx9fXJldHVybih1PW5ldyBSdCh1LGkpKS5fZW50ZXI9Zix1Ll9leGl0PWMsdX0sZW50ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFJ0KHRoaXMuX2VudGVyfHx0aGlzLl9ncm91cHMubWFwKGl0KSx0aGlzLl9wYXJlbnRzKX0sZXhpdDpmdW5jdGlvbigpe3JldHVybiBuZXcgUnQodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChpdCksdGhpcy5fcGFyZW50cyl9LG1lcmdlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT10Ll9ncm91cHMscj1uLmxlbmd0aCxpPWUubGVuZ3RoLG89TWF0aC5taW4ocixpKSxhPW5ldyBBcnJheShyKSx1PTA7dTxvOysrdSlmb3IodmFyIGYsYz1uW3VdLHM9ZVt1XSxsPWMubGVuZ3RoLGg9YVt1XT1uZXcgQXJyYXkobCksZD0wO2Q8bDsrK2QpKGY9Y1tkXXx8c1tkXSkmJihoW2RdPWYpO2Zvcig7dTxyOysrdSlhW3VdPW5bdV07cmV0dXJuIG5ldyBSdChhLHRoaXMuX3BhcmVudHMpfSxvcmRlcjpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsbj0tMSxlPXQubGVuZ3RoOysrbjxlOylmb3IodmFyIHIsaT10W25dLG89aS5sZW5ndGgtMSxhPWlbb107LS1vPj0wOykocj1pW29dKSYmKGEmJmEhPT1yLm5leHRTaWJsaW5nJiZhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHIsYSksYT1yKTtyZXR1cm4gdGhpc30sc29ydDpmdW5jdGlvbih0KXtmdW5jdGlvbiBuKG4sZSl7cmV0dXJuIG4mJmU/dChuLl9fZGF0YV9fLGUuX19kYXRhX18pOiFuLSFlfXR8fCh0PWN0KTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLHI9ZS5sZW5ndGgsaT1uZXcgQXJyYXkociksbz0wO288cjsrK28pe2Zvcih2YXIgYSx1PWVbb10sZj11Lmxlbmd0aCxjPWlbb109bmV3IEFycmF5KGYpLHM9MDtzPGY7KytzKShhPXVbc10pJiYoY1tzXT1hKTtjLnNvcnQobil9cmV0dXJuIG5ldyBSdChpLHRoaXMuX3BhcmVudHMpLm9yZGVyKCl9LGNhbGw6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGFyZ3VtZW50c1swXT10aGlzLHQuYXBwbHkobnVsbCxhcmd1bWVudHMpLHRoaXN9LG5vZGVzOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSxuPS0xO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0Wysrbl09dGhpc30pLHR9LG5vZGU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLG49MCxlPXQubGVuZ3RoO248ZTsrK24pZm9yKHZhciByPXRbbl0saT0wLG89ci5sZW5ndGg7aTxvOysraSl7dmFyIGE9cltpXTtpZihhKXJldHVybiBhfXJldHVybiBudWxsfSxzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Kyt0fSksdH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5ub2RlKCl9LGVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPTAscj1uLmxlbmd0aDtlPHI7KytlKWZvcih2YXIgaSxvPW5bZV0sYT0wLHU9by5sZW5ndGg7YTx1OysrYSkoaT1vW2FdKSYmdC5jYWxsKGksaS5fX2RhdGFfXyxhLG8pO3JldHVybiB0aGlzfSxhdHRyOmZ1bmN0aW9uKHQsbil7dmFyIGU9JCh0KTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciByPXRoaXMubm9kZSgpO3JldHVybiBlLmxvY2FsP3IuZ2V0QXR0cmlidXRlTlMoZS5zcGFjZSxlLmxvY2FsKTpyLmdldEF0dHJpYnV0ZShlKX1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1uP2UubG9jYWw/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fToiZnVuY3Rpb24iPT10eXBlb2Ygbj9lLmxvY2FsP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk6dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsZSl9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCk6dGhpcy5zZXRBdHRyaWJ1dGUodCxlKX19OmUubG9jYWw/ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxuKX19OmZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUodCxuKX19KShlLG4pKX0sc3R5bGU6ZnVuY3Rpb24odCxuLGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKChudWxsPT1uP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fToiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0LG4sZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09cj90aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpOnRoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxyLGUpfX06ZnVuY3Rpb24odCxuLGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxuLGUpfX0pKHQsbixudWxsPT1lPyIiOmUpKTpsdCh0aGlzLm5vZGUoKSx0KX0scHJvcGVydHk6ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t0XX19OiJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT9kZWxldGUgdGhpc1t0XTp0aGlzW3RdPWV9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXNbdF09bn19KSh0LG4pKTp0aGlzLm5vZGUoKVt0XX0sY2xhc3NlZDpmdW5jdGlvbih0LG4pe3ZhciBlPWh0KHQrIiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciByPWR0KHRoaXMubm9kZSgpKSxpPS0xLG89ZS5sZW5ndGg7KytpPG87KWlmKCFyLmNvbnRhaW5zKGVbaV0pKXJldHVybiExO3JldHVybiEwfXJldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7KG4uYXBwbHkodGhpcyxhcmd1bWVudHMpP3Z0Omd0KSh0aGlzLHQpfX06bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2dCh0aGlzLHQpfX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7Z3QodGhpcyx0KX19KShlLG4pKX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD95dDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT1uPyIiOm59fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fSkodCkpOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxodG1sOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P190OigiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT1uPyIiOm59fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD10fX0pKHQpKTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LHJhaXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChidCl9LGxvd2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChtdCl9LGFwcGVuZDpmdW5jdGlvbih0KXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlcodCk7cmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LGluc2VydDpmdW5jdGlvbih0LG4pe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Vyh0KSxyPW51bGw9PW4/eHQ6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRKG4pO3JldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8bnVsbCl9KX0scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaCh3dCl9LGNsb25lOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNlbGVjdCh0P0F0Ok10KX0sZGF0dW06ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLHQpOnRoaXMubm9kZSgpLl9fZGF0YV9ffSxvbjpmdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvPWZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIG49IiIsZT10LmluZGV4T2YoIi4iKTtyZXR1cm4gZT49MCYmKG49dC5zbGljZShlKzEpLHQ9dC5zbGljZSgwLGUpKSx7dHlwZTp0LG5hbWU6bn19KX0odCsiIiksYT1vLmxlbmd0aDtpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2Zvcih1PW4/a3Q6RXQsbnVsbD09ZSYmKGU9ITEpLHI9MDtyPGE7KytyKXRoaXMuZWFjaCh1KG9bcl0sbixlKSk7cmV0dXJuIHRoaXN9dmFyIHU9dGhpcy5ub2RlKCkuX19vbjtpZih1KWZvcih2YXIgZixjPTAscz11Lmxlbmd0aDtjPHM7KytjKWZvcihyPTAsZj11W2NdO3I8YTsrK3IpaWYoKGk9b1tyXSkudHlwZT09PWYudHlwZSYmaS5uYW1lPT09Zi5uYW1lKXJldHVybiBmLnZhbHVlfSxkaXNwYXRjaDpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIFB0KHRoaXMsdCxuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBQdCh0aGlzLHQsbil9fSkodCxuKSl9fTt2YXIgVXQ9MDtmdW5jdGlvbiBxdCgpe3JldHVybiBuZXcgT3R9ZnVuY3Rpb24gT3QoKXt0aGlzLl89IkAiKygrK1V0KS50b1N0cmluZygzNil9ZnVuY3Rpb24gWXQoKXtmb3IodmFyIG4sZT10LmV2ZW50O249ZS5zb3VyY2VFdmVudDspZT1uO3JldHVybiBlfWZ1bmN0aW9uIEJ0KHQsbil7dmFyIGU9dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYoZS5jcmVhdGVTVkdQb2ludCl7dmFyIHI9ZS5jcmVhdGVTVkdQb2ludCgpO3JldHVybiByLng9bi5jbGllbnRYLHIueT1uLmNsaWVudFksWyhyPXIubWF0cml4VHJhbnNmb3JtKHQuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSkueCxyLnldfXZhciBpPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW24uY2xpZW50WC1pLmxlZnQtdC5jbGllbnRMZWZ0LG4uY2xpZW50WS1pLnRvcC10LmNsaWVudFRvcF19ZnVuY3Rpb24gRnQodCl7dmFyIG49WXQoKTtyZXR1cm4gbi5jaGFuZ2VkVG91Y2hlcyYmKG49bi5jaGFuZ2VkVG91Y2hlc1swXSksQnQodCxuKX1mdW5jdGlvbiBJdCh0LG4sZSl7YXJndW1lbnRzLmxlbmd0aDwzJiYoZT1uLG49WXQoKS5jaGFuZ2VkVG91Y2hlcyk7Zm9yKHZhciByLGk9MCxvPW4/bi5sZW5ndGg6MDtpPG87KytpKWlmKChyPW5baV0pLmlkZW50aWZpZXI9PT1lKXJldHVybiBCdCh0LHIpO3JldHVybiBudWxsfWZ1bmN0aW9uIEh0KCl7dC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBqdCgpe3QuZXZlbnQucHJldmVudERlZmF1bHQoKSx0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIFh0KHQpe3ZhciBuPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGU9RHQodCkub24oImRyYWdzdGFydC5kcmFnIixqdCwhMCk7Im9uc2VsZWN0c3RhcnQiaW4gbj9lLm9uKCJzZWxlY3RzdGFydC5kcmFnIixqdCwhMCk6KG4uX19ub3NlbGVjdD1uLnN0eWxlLk1velVzZXJTZWxlY3Qsbi5zdHlsZS5Nb3pVc2VyU2VsZWN0PSJub25lIil9ZnVuY3Rpb24gR3QodCxuKXt2YXIgZT10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxyPUR0KHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIsbnVsbCk7biYmKHIub24oImNsaWNrLmRyYWciLGp0LCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5vbigiY2xpY2suZHJhZyIsbnVsbCl9LDApKSwib25zZWxlY3RzdGFydCJpbiBlP3Iub24oInNlbGVjdHN0YXJ0LmRyYWciLG51bGwpOihlLnN0eWxlLk1velVzZXJTZWxlY3Q9ZS5fX25vc2VsZWN0LGRlbGV0ZSBlLl9fbm9zZWxlY3QpfWZ1bmN0aW9uIFZ0KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiAkdCh0LG4sZSxyLGksbyxhLHUsZixjKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMuc3ViamVjdD1lLHRoaXMuaWRlbnRpZmllcj1yLHRoaXMuYWN0aXZlPWksdGhpcy54PW8sdGhpcy55PWEsdGhpcy5keD11LHRoaXMuZHk9Zix0aGlzLl89Y31mdW5jdGlvbiBXdCgpe3JldHVybiF0LmV2ZW50LmJ1dHRvbn1mdW5jdGlvbiBadCgpe3JldHVybiB0aGlzLnBhcmVudE5vZGV9ZnVuY3Rpb24gUXQobil7cmV0dXJuIG51bGw9PW4/e3g6dC5ldmVudC54LHk6dC5ldmVudC55fTpufWZ1bmN0aW9uIEp0KCl7cmV0dXJuIm9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIEt0KHQsbixlKXt0LnByb3RvdHlwZT1uLnByb3RvdHlwZT1lLGUuY29uc3RydWN0b3I9dH1mdW5jdGlvbiB0bih0LG4pe3ZhciBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpO2Zvcih2YXIgciBpbiBuKWVbcl09bltyXTtyZXR1cm4gZX1mdW5jdGlvbiBubigpe31PdC5wcm90b3R5cGU9cXQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpPdCxnZXQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuXzshKG4gaW4gdCk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybjtyZXR1cm4gdFtuXX0sc2V0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbdGhpcy5fXT1ufSxyZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuXyBpbiB0JiZkZWxldGUgdFt0aGlzLl9dfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl99fSwkdC5wcm90b3R5cGUub249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl8ub24uYXBwbHkodGhpcy5fLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT10aGlzLl8/dGhpczp0fTt2YXIgZW49IlxccyooWystXT9cXGQrKVxccyoiLHJuPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLG9uPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixhbj0vXiMoWzAtOWEtZl17M30pJC8sdW49L14jKFswLTlhLWZdezZ9KSQvLGZuPW5ldyBSZWdFeHAoIl5yZ2JcXCgiK1tlbixlbixlbl0rIlxcKSQiKSxjbj1uZXcgUmVnRXhwKCJecmdiXFwoIitbb24sb24sb25dKyJcXCkkIiksc249bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tlbixlbixlbixybl0rIlxcKSQiKSxsbj1uZXcgUmVnRXhwKCJecmdiYVxcKCIrW29uLG9uLG9uLHJuXSsiXFwpJCIpLGhuPW5ldyBSZWdFeHAoIl5oc2xcXCgiK1tybixvbixvbl0rIlxcKSQiKSxkbj1uZXcgUmVnRXhwKCJeaHNsYVxcKCIrW3JuLG9uLG9uLHJuXSsiXFwpJCIpLHBuPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O2Z1bmN0aW9uIHZuKHQpe3ZhciBuO3JldHVybiB0PSh0KyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwobj1hbi5leGVjKHQpKT9uZXcgbW4oKG49cGFyc2VJbnQoblsxXSwxNikpPj44JjE1fG4+PjQmMjQwLG4+PjQmMTV8MjQwJm4sKDE1Jm4pPDw0fDE1Jm4sMSk6KG49dW4uZXhlYyh0KSk/Z24ocGFyc2VJbnQoblsxXSwxNikpOihuPWZuLmV4ZWModCkpP25ldyBtbihuWzFdLG5bMl0sblszXSwxKToobj1jbi5leGVjKHQpKT9uZXcgbW4oMjU1Km5bMV0vMTAwLDI1NSpuWzJdLzEwMCwyNTUqblszXS8xMDAsMSk6KG49c24uZXhlYyh0KSk/eW4oblsxXSxuWzJdLG5bM10sbls0XSk6KG49bG4uZXhlYyh0KSk/eW4oMjU1Km5bMV0vMTAwLDI1NSpuWzJdLzEwMCwyNTUqblszXS8xMDAsbls0XSk6KG49aG4uZXhlYyh0KSk/d24oblsxXSxuWzJdLzEwMCxuWzNdLzEwMCwxKToobj1kbi5leGVjKHQpKT93bihuWzFdLG5bMl0vMTAwLG5bM10vMTAwLG5bNF0pOnBuLmhhc093blByb3BlcnR5KHQpP2duKHBuW3RdKToidHJhbnNwYXJlbnQiPT09dD9uZXcgbW4oTmFOLE5hTixOYU4sMCk6bnVsbH1mdW5jdGlvbiBnbih0KXtyZXR1cm4gbmV3IG1uKHQ+PjE2JjI1NSx0Pj44JjI1NSwyNTUmdCwxKX1mdW5jdGlvbiB5bih0LG4sZSxyKXtyZXR1cm4gcjw9MCYmKHQ9bj1lPU5hTiksbmV3IG1uKHQsbixlLHIpfWZ1bmN0aW9uIF9uKHQpe3JldHVybiB0IGluc3RhbmNlb2Ygbm58fCh0PXZuKHQpKSx0P25ldyBtbigodD10LnJnYigpKS5yLHQuZyx0LmIsdC5vcGFjaXR5KTpuZXcgbW59ZnVuY3Rpb24gYm4odCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP19uKHQpOm5ldyBtbih0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gbW4odCxuLGUscil7dGhpcy5yPSt0LHRoaXMuZz0rbix0aGlzLmI9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIHhuKHQpe3JldHVybigodD1NYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHQpfHwwKSkpPDE2PyIwIjoiIikrdC50b1N0cmluZygxNil9ZnVuY3Rpb24gd24odCxuLGUscil7cmV0dXJuIHI8PTA/dD1uPWU9TmFOOmU8PTB8fGU+PTE/dD1uPU5hTjpuPD0wJiYodD1OYU4pLG5ldyBBbih0LG4sZSxyKX1mdW5jdGlvbiBNbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIEFuKXJldHVybiBuZXcgQW4odC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2Ygbm58fCh0PXZuKHQpKSwhdClyZXR1cm4gbmV3IEFuO2lmKHQgaW5zdGFuY2VvZiBBbilyZXR1cm4gdDt2YXIgbj0odD10LnJnYigpKS5yLzI1NSxlPXQuZy8yNTUscj10LmIvMjU1LGk9TWF0aC5taW4obixlLHIpLG89TWF0aC5tYXgobixlLHIpLGE9TmFOLHU9by1pLGY9KG8raSkvMjtyZXR1cm4gdT8oYT1uPT09bz8oZS1yKS91KzYqKGU8cik6ZT09PW8/KHItbikvdSsyOihuLWUpL3UrNCx1Lz1mPC41P28raToyLW8taSxhKj02MCk6dT1mPjAmJmY8MT8wOmEsbmV3IEFuKGEsdSxmLHQub3BhY2l0eSl9KHQpOm5ldyBBbih0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gQW4odCxuLGUscil7dGhpcy5oPSt0LHRoaXMucz0rbix0aGlzLmw9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIFRuKHQsbixlKXtyZXR1cm4gMjU1Kih0PDYwP24rKGUtbikqdC82MDp0PDE4MD9lOnQ8MjQwP24rKGUtbikqKDI0MC10KS82MDpuKX1LdChubix2bix7ZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSxoZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5oZXgoKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKSsiIn19KSxLdChtbixibix0bihubix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8xLy43Ok1hdGgucG93KDEvLjcsdCksbmV3IG1uKHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyBtbih0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9dGhpcy5yJiZ0aGlzLnI8PTI1NSYmMDw9dGhpcy5nJiZ0aGlzLmc8PTI1NSYmMDw9dGhpcy5iJiZ0aGlzLmI8PTI1NSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGhleDpmdW5jdGlvbigpe3JldHVybiIjIit4bih0aGlzLnIpK3huKHRoaXMuZykreG4odGhpcy5iKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX19KSksS3QoQW4sTW4sdG4obm4se2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/MS8uNzpNYXRoLnBvdygxLy43LHQpLG5ldyBBbih0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyBBbih0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaCUzNjArMzYwKih0aGlzLmg8MCksbj1pc05hTih0KXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxlPXRoaXMubCxyPWUrKGU8LjU/ZToxLWUpKm4saT0yKmUtcjtyZXR1cm4gbmV3IG1uKFRuKHQ+PTI0MD90LTI0MDp0KzEyMCxpLHIpLFRuKHQsaSxyKSxUbih0PDEyMD90KzI0MDp0LTEyMCxpLHIpLHRoaXMub3BhY2l0eSl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfX0pKTt2YXIgTm49TWF0aC5QSS8xODAsU249MTgwL01hdGguUEksRW49Ljk2NDIyLGtuPTEsQ249LjgyNTIxLFBuPTQvMjksem49Ni8yOSxSbj0zKnpuKnpuLExuPXpuKnpuKnpuO2Z1bmN0aW9uIERuKHQpe2lmKHQgaW5zdGFuY2VvZiBxbilyZXR1cm4gbmV3IHFuKHQubCx0LmEsdC5iLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIGpuKXtpZihpc05hTih0LmgpKXJldHVybiBuZXcgcW4odC5sLDAsMCx0Lm9wYWNpdHkpO3ZhciBuPXQuaCpObjtyZXR1cm4gbmV3IHFuKHQubCxNYXRoLmNvcyhuKSp0LmMsTWF0aC5zaW4obikqdC5jLHQub3BhY2l0eSl9dCBpbnN0YW5jZW9mIG1ufHwodD1fbih0KSk7dmFyIGUscixpPUZuKHQuciksbz1Gbih0LmcpLGE9Rm4odC5iKSx1PU9uKCguMjIyNTA0NSppKy43MTY4Nzg2Km8rLjA2MDYxNjkqYSkva24pO3JldHVybiBpPT09byYmbz09PWE/ZT1yPXU6KGU9T24oKC40MzYwNzQ3KmkrLjM4NTA2NDkqbysuMTQzMDgwNCphKS9Fbikscj1PbigoLjAxMzkzMjIqaSsuMDk3MTA0NSpvKy43MTQxNzMzKmEpL0NuKSksbmV3IHFuKDExNip1LTE2LDUwMCooZS11KSwyMDAqKHUtciksdC5vcGFjaXR5KX1mdW5jdGlvbiBVbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/RG4odCk6bmV3IHFuKHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBxbih0LG4sZSxyKXt0aGlzLmw9K3QsdGhpcy5hPStuLHRoaXMuYj0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gT24odCl7cmV0dXJuIHQ+TG4/TWF0aC5wb3codCwxLzMpOnQvUm4rUG59ZnVuY3Rpb24gWW4odCl7cmV0dXJuIHQ+em4/dCp0KnQ6Um4qKHQtUG4pfWZ1bmN0aW9uIEJuKHQpe3JldHVybiAyNTUqKHQ8PS4wMDMxMzA4PzEyLjkyKnQ6MS4wNTUqTWF0aC5wb3codCwxLzIuNCktLjA1NSl9ZnVuY3Rpb24gRm4odCl7cmV0dXJuKHQvPTI1NSk8PS4wNDA0NT90LzEyLjkyOk1hdGgucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gSW4odCl7aWYodCBpbnN0YW5jZW9mIGpuKXJldHVybiBuZXcgam4odC5oLHQuYyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YgcW58fCh0PURuKHQpKSwwPT09dC5hJiYwPT09dC5iKXJldHVybiBuZXcgam4oTmFOLDAsdC5sLHQub3BhY2l0eSk7dmFyIG49TWF0aC5hdGFuMih0LmIsdC5hKSpTbjtyZXR1cm4gbmV3IGpuKG48MD9uKzM2MDpuLE1hdGguc3FydCh0LmEqdC5hK3QuYip0LmIpLHQubCx0Lm9wYWNpdHkpfWZ1bmN0aW9uIEhuKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Jbih0KTpuZXcgam4odCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIGpuKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLmM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1LdChxbixVbix0bihubix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBxbih0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IHFuKHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9KHRoaXMubCsxNikvMTE2LG49aXNOYU4odGhpcy5hKT90OnQrdGhpcy5hLzUwMCxlPWlzTmFOKHRoaXMuYik/dDp0LXRoaXMuYi8yMDA7cmV0dXJuIG5ldyBtbihCbigzLjEzMzg1NjEqKG49RW4qWW4obikpLTEuNjE2ODY2NyoodD1rbipZbih0KSktLjQ5MDYxNDYqKGU9Q24qWW4oZSkpKSxCbigtLjk3ODc2ODQqbisxLjkxNjE0MTUqdCsuMDMzNDU0KmUpLEJuKC4wNzE5NDUzKm4tLjIyODk5MTQqdCsxLjQwNTI0MjcqZSksdGhpcy5vcGFjaXR5KX19KSksS3Qoam4sSG4sdG4obm4se2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgam4odGhpcy5oLHRoaXMuYyx0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBqbih0aGlzLmgsdGhpcy5jLHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiBEbih0aGlzKS5yZ2IoKX19KSk7dmFyIFhuPS0uMTQ4NjEsR249MS43ODI3NyxWbj0tLjI5MjI3LCRuPS0uOTA2NDksV249MS45NzI5NCxabj1XbiokbixRbj1XbipHbixKbj1HbipWbi0kbipYbjtmdW5jdGlvbiBLbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIHRlKXJldHVybiBuZXcgdGUodC5oLHQucyx0LmwsdC5vcGFjaXR5KTt0IGluc3RhbmNlb2YgbW58fCh0PV9uKHQpKTt2YXIgbj10LnIvMjU1LGU9dC5nLzI1NSxyPXQuYi8yNTUsaT0oSm4qcitabipuLVFuKmUpLyhKbitabi1Rbiksbz1yLWksYT0oV24qKGUtaSktVm4qbykvJG4sdT1NYXRoLnNxcnQoYSphK28qbykvKFduKmkqKDEtaSkpLGY9dT9NYXRoLmF0YW4yKGEsbykqU24tMTIwOk5hTjtyZXR1cm4gbmV3IHRlKGY8MD9mKzM2MDpmLHUsaSx0Lm9wYWNpdHkpfSh0KTpuZXcgdGUodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIHRlKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLnM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBuZSh0LG4sZSxyLGkpe3ZhciBvPXQqdCxhPW8qdDtyZXR1cm4oKDEtMyp0KzMqby1hKSpuKyg0LTYqbyszKmEpKmUrKDErMyp0KzMqby0zKmEpKnIrYSppKS82fWZ1bmN0aW9uIGVlKHQpe3ZhciBuPXQubGVuZ3RoLTE7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPWU8PTA/ZT0wOmU+PTE/KGU9MSxuLTEpOk1hdGguZmxvb3IoZSpuKSxpPXRbcl0sbz10W3IrMV0sYT1yPjA/dFtyLTFdOjIqaS1vLHU9cjxuLTE/dFtyKzJdOjIqby1pO3JldHVybiBuZSgoZS1yL24pKm4sYSxpLG8sdSl9fWZ1bmN0aW9uIHJlKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1NYXRoLmZsb29yKCgoZSU9MSk8MD8rK2U6ZSkqbiksaT10WyhyK24tMSklbl0sbz10W3Ilbl0sYT10WyhyKzEpJW5dLHU9dFsocisyKSVuXTtyZXR1cm4gbmUoKGUtci9uKSpuLGksbyxhLHUpfX1mdW5jdGlvbiBpZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gb2UodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQrZSpufX1mdW5jdGlvbiBhZSh0LG4pe3ZhciBlPW4tdDtyZXR1cm4gZT9vZSh0LGU+MTgwfHxlPC0xODA/ZS0zNjAqTWF0aC5yb3VuZChlLzM2MCk6ZSk6aWUoaXNOYU4odCk/bjp0KX1mdW5jdGlvbiB1ZSh0KXtyZXR1cm4gMT09KHQ9K3QpP2ZlOmZ1bmN0aW9uKG4sZSl7cmV0dXJuIGUtbj9mdW5jdGlvbih0LG4sZSl7cmV0dXJuIHQ9TWF0aC5wb3codCxlKSxuPU1hdGgucG93KG4sZSktdCxlPTEvZSxmdW5jdGlvbihyKXtyZXR1cm4gTWF0aC5wb3codCtyKm4sZSl9fShuLGUsdCk6aWUoaXNOYU4obik/ZTpuKX19ZnVuY3Rpb24gZmUodCxuKXt2YXIgZT1uLXQ7cmV0dXJuIGU/b2UodCxlKTppZShpc05hTih0KT9uOnQpfUt0KHRlLEtuLHRuKG5uLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10PzEvLjc6TWF0aC5wb3coMS8uNyx0KSxuZXcgdGUodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8uNzpNYXRoLnBvdyguNyx0KSxuZXcgdGUodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD1pc05hTih0aGlzLmgpPzA6KHRoaXMuaCsxMjApKk5uLG49K3RoaXMubCxlPWlzTmFOKHRoaXMucyk/MDp0aGlzLnMqbiooMS1uKSxyPU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCk7cmV0dXJuIG5ldyBtbigyNTUqKG4rZSooWG4qcitHbippKSksMjU1KihuK2UqKFZuKnIrJG4qaSkpLDI1NSoobitlKihXbipyKSksdGhpcy5vcGFjaXR5KX19KSk7dmFyIGNlPWZ1bmN0aW9uIHQobil7dmFyIGU9dWUobik7ZnVuY3Rpb24gcih0LG4pe3ZhciByPWUoKHQ9Ym4odCkpLnIsKG49Ym4obikpLnIpLGk9ZSh0Lmcsbi5nKSxvPWUodC5iLG4uYiksYT1mZSh0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQucj1yKG4pLHQuZz1pKG4pLHQuYj1vKG4pLHQub3BhY2l0eT1hKG4pLHQrIiJ9fXJldHVybiByLmdhbW1hPXQscn0oMSk7ZnVuY3Rpb24gc2UodCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlLHIsaT1uLmxlbmd0aCxvPW5ldyBBcnJheShpKSxhPW5ldyBBcnJheShpKSx1PW5ldyBBcnJheShpKTtmb3IoZT0wO2U8aTsrK2Upcj1ibihuW2VdKSxvW2VdPXIucnx8MCxhW2VdPXIuZ3x8MCx1W2VdPXIuYnx8MDtyZXR1cm4gbz10KG8pLGE9dChhKSx1PXQodSksci5vcGFjaXR5PTEsZnVuY3Rpb24odCl7cmV0dXJuIHIucj1vKHQpLHIuZz1hKHQpLHIuYj11KHQpLHIrIiJ9fX12YXIgbGU9c2UoZWUpLGhlPXNlKHJlKTtmdW5jdGlvbiBkZSh0LG4pe3ZhciBlLHI9bj9uLmxlbmd0aDowLGk9dD9NYXRoLm1pbihyLHQubGVuZ3RoKTowLG89bmV3IEFycmF5KGkpLGE9bmV3IEFycmF5KHIpO2ZvcihlPTA7ZTxpOysrZSlvW2VdPW1lKHRbZV0sbltlXSk7Zm9yKDtlPHI7KytlKWFbZV09bltlXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGU9MDtlPGk7KytlKWFbZV09b1tlXSh0KTtyZXR1cm4gYX19ZnVuY3Rpb24gcGUodCxuKXt2YXIgZT1uZXcgRGF0ZTtyZXR1cm4gbi09dD0rdCxmdW5jdGlvbihyKXtyZXR1cm4gZS5zZXRUaW1lKHQrbipyKSxlfX1mdW5jdGlvbiB2ZSh0LG4pe3JldHVybiBuLT10PSt0LGZ1bmN0aW9uKGUpe3JldHVybiB0K24qZX19ZnVuY3Rpb24gZ2UodCxuKXt2YXIgZSxyPXt9LGk9e307Zm9yKGUgaW4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdHx8KHQ9e30pLG51bGwhPT1uJiYib2JqZWN0Ij09dHlwZW9mIG58fChuPXt9KSxuKWUgaW4gdD9yW2VdPW1lKHRbZV0sbltlXSk6aVtlXT1uW2VdO3JldHVybiBmdW5jdGlvbih0KXtmb3IoZSBpbiByKWlbZV09cltlXSh0KTtyZXR1cm4gaX19dmFyIHllPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxfZT1uZXcgUmVnRXhwKHllLnNvdXJjZSwiZyIpO2Z1bmN0aW9uIGJlKHQsbil7dmFyIGUscixpLG89eWUubGFzdEluZGV4PV9lLmxhc3RJbmRleD0wLGE9LTEsdT1bXSxmPVtdO2Zvcih0Kz0iIixuKz0iIjsoZT15ZS5leGVjKHQpKSYmKHI9X2UuZXhlYyhuKSk7KShpPXIuaW5kZXgpPm8mJihpPW4uc2xpY2UobyxpKSx1W2FdP3VbYV0rPWk6dVsrK2FdPWkpLChlPWVbMF0pPT09KHI9clswXSk/dVthXT91W2FdKz1yOnVbKythXT1yOih1WysrYV09bnVsbCxmLnB1c2goe2k6YSx4OnZlKGUscil9KSksbz1fZS5sYXN0SW5kZXg7cmV0dXJuIG88bi5sZW5ndGgmJihpPW4uc2xpY2UobyksdVthXT91W2FdKz1pOnVbKythXT1pKSx1Lmxlbmd0aDwyP2ZbMF0/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0KG4pKyIifX0oZlswXS54KTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KG4pOihuPWYubGVuZ3RoLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyPTA7cjxuOysrcil1WyhlPWZbcl0pLmldPWUueCh0KTtyZXR1cm4gdS5qb2luKCIiKX0pfWZ1bmN0aW9uIG1lKHQsbil7dmFyIGUscj10eXBlb2YgbjtyZXR1cm4gbnVsbD09bnx8ImJvb2xlYW4iPT09cj9pZShuKTooIm51bWJlciI9PT1yP3ZlOiJzdHJpbmciPT09cj8oZT12bihuKSk/KG49ZSxjZSk6YmU6biBpbnN0YW5jZW9mIHZuP2NlOm4gaW5zdGFuY2VvZiBEYXRlP3BlOkFycmF5LmlzQXJyYXkobik/ZGU6ImZ1bmN0aW9uIiE9dHlwZW9mIG4udmFsdWVPZiYmImZ1bmN0aW9uIiE9dHlwZW9mIG4udG9TdHJpbmd8fGlzTmFOKG4pP2dlOnZlKSh0LG4pfWZ1bmN0aW9uIHhlKHQsbil7cmV0dXJuIG4tPXQ9K3QsZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQodCtuKmUpfX12YXIgd2UsTWUsQWUsVGUsTmU9MTgwL01hdGguUEksU2U9e3RyYW5zbGF0ZVg6MCx0cmFuc2xhdGVZOjAscm90YXRlOjAsc2tld1g6MCxzY2FsZVg6MSxzY2FsZVk6MX07ZnVuY3Rpb24gRWUodCxuLGUscixpLG8pe3ZhciBhLHUsZjtyZXR1cm4oYT1NYXRoLnNxcnQodCp0K24qbikpJiYodC89YSxuLz1hKSwoZj10KmUrbipyKSYmKGUtPXQqZixyLT1uKmYpLCh1PU1hdGguc3FydChlKmUrcipyKSkmJihlLz11LHIvPXUsZi89dSksdCpyPG4qZSYmKHQ9LXQsbj0tbixmPS1mLGE9LWEpLHt0cmFuc2xhdGVYOmksdHJhbnNsYXRlWTpvLHJvdGF0ZTpNYXRoLmF0YW4yKG4sdCkqTmUsc2tld1g6TWF0aC5hdGFuKGYpKk5lLHNjYWxlWDphLHNjYWxlWTp1fX1mdW5jdGlvbiBrZSh0LG4sZSxyKXtmdW5jdGlvbiBpKHQpe3JldHVybiB0Lmxlbmd0aD90LnBvcCgpKyIgIjoiIn1yZXR1cm4gZnVuY3Rpb24obyxhKXt2YXIgdT1bXSxmPVtdO3JldHVybiBvPXQobyksYT10KGEpLGZ1bmN0aW9uKHQscixpLG8sYSx1KXtpZih0IT09aXx8ciE9PW8pe3ZhciBmPWEucHVzaCgidHJhbnNsYXRlKCIsbnVsbCxuLG51bGwsZSk7dS5wdXNoKHtpOmYtNCx4OnZlKHQsaSl9LHtpOmYtMix4OnZlKHIsbyl9KX1lbHNlKGl8fG8pJiZhLnB1c2goInRyYW5zbGF0ZSgiK2krbitvK2UpfShvLnRyYW5zbGF0ZVgsby50cmFuc2xhdGVZLGEudHJhbnNsYXRlWCxhLnRyYW5zbGF0ZVksdSxmKSxmdW5jdGlvbih0LG4sZSxvKXt0IT09bj8odC1uPjE4MD9uKz0zNjA6bi10PjE4MCYmKHQrPTM2MCksby5wdXNoKHtpOmUucHVzaChpKGUpKyJyb3RhdGUoIixudWxsLHIpLTIseDp2ZSh0LG4pfSkpOm4mJmUucHVzaChpKGUpKyJyb3RhdGUoIituK3IpfShvLnJvdGF0ZSxhLnJvdGF0ZSx1LGYpLGZ1bmN0aW9uKHQsbixlLG8pe3QhPT1uP28ucHVzaCh7aTplLnB1c2goaShlKSsic2tld1goIixudWxsLHIpLTIseDp2ZSh0LG4pfSk6biYmZS5wdXNoKGkoZSkrInNrZXdYKCIrbityKX0oby5za2V3WCxhLnNrZXdYLHUsZiksZnVuY3Rpb24odCxuLGUscixvLGEpe2lmKHQhPT1lfHxuIT09cil7dmFyIHU9by5wdXNoKGkobykrInNjYWxlKCIsbnVsbCwiLCIsbnVsbCwiKSIpO2EucHVzaCh7aTp1LTQseDp2ZSh0LGUpfSx7aTp1LTIseDp2ZShuLHIpfSl9ZWxzZSAxPT09ZSYmMT09PXJ8fG8ucHVzaChpKG8pKyJzY2FsZSgiK2UrIiwiK3IrIikiKX0oby5zY2FsZVgsby5zY2FsZVksYS5zY2FsZVgsYS5zY2FsZVksdSxmKSxvPWE9bnVsbCxmdW5jdGlvbih0KXtmb3IodmFyIG4sZT0tMSxyPWYubGVuZ3RoOysrZTxyOyl1WyhuPWZbZV0pLmldPW4ueCh0KTtyZXR1cm4gdS5qb2luKCIiKX19fXZhciBDZT1rZShmdW5jdGlvbih0KXtyZXR1cm4ibm9uZSI9PT10P1NlOih3ZXx8KHdlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLE1lPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxBZT1kb2N1bWVudC5kZWZhdWx0Vmlldyksd2Uuc3R5bGUudHJhbnNmb3JtPXQsdD1BZS5nZXRDb21wdXRlZFN0eWxlKE1lLmFwcGVuZENoaWxkKHdlKSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKSxNZS5yZW1vdmVDaGlsZCh3ZSksRWUoKyh0PXQuc2xpY2UoNywtMSkuc3BsaXQoIiwiKSlbMF0sK3RbMV0sK3RbMl0sK3RbM10sK3RbNF0sK3RbNV0pKX0sInB4LCAiLCJweCkiLCJkZWcpIiksUGU9a2UoZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/U2U6KFRlfHwoVGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsImciKSksVGUuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLHQpLCh0PVRlLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpP0VlKCh0PXQubWF0cml4KS5hLHQuYix0LmMsdC5kLHQuZSx0LmYpOlNlKX0sIiwgIiwiKSIsIikiKSx6ZT1NYXRoLlNRUlQyLFJlPTIsTGU9NCxEZT0xZS0xMjtmdW5jdGlvbiBVZSh0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpKzEvdCkvMn1mdW5jdGlvbiBxZSh0LG4pe3ZhciBlLHIsaT10WzBdLG89dFsxXSxhPXRbMl0sdT1uWzBdLGY9blsxXSxjPW5bMl0scz11LWksbD1mLW8saD1zKnMrbCpsO2lmKGg8RGUpcj1NYXRoLmxvZyhjL2EpL3plLGU9ZnVuY3Rpb24odCl7cmV0dXJuW2krdCpzLG8rdCpsLGEqTWF0aC5leHAoemUqdCpyKV19O2Vsc2V7dmFyIGQ9TWF0aC5zcXJ0KGgpLHA9KGMqYy1hKmErTGUqaCkvKDIqYSpSZSpkKSx2PShjKmMtYSphLUxlKmgpLygyKmMqUmUqZCksZz1NYXRoLmxvZyhNYXRoLnNxcnQocCpwKzEpLXApLHk9TWF0aC5sb2coTWF0aC5zcXJ0KHYqdisxKS12KTtyPSh5LWcpL3plLGU9ZnVuY3Rpb24odCl7dmFyIG4sZT10KnIsdT1VZShnKSxmPWEvKFJlKmQpKih1KihuPXplKmUrZywoKG49TWF0aC5leHAoMipuKSktMSkvKG4rMSkpLWZ1bmN0aW9uKHQpe3JldHVybigodD1NYXRoLmV4cCh0KSktMS90KS8yfShnKSk7cmV0dXJuW2krZipzLG8rZipsLGEqdS9VZSh6ZSplK2cpXX19cmV0dXJuIGUuZHVyYXRpb249MWUzKnIsZX1mdW5jdGlvbiBPZSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPU1uKG4pKS5oLChlPU1uKGUpKS5oKSxpPWZlKG4ucyxlLnMpLG89ZmUobi5sLGUubCksYT1mZShuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4ucz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fX12YXIgWWU9T2UoYWUpLEJlPU9lKGZlKTtmdW5jdGlvbiBGZSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPUhuKG4pKS5oLChlPUhuKGUpKS5oKSxpPWZlKG4uYyxlLmMpLG89ZmUobi5sLGUubCksYT1mZShuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4uYz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fX12YXIgSWU9RmUoYWUpLEhlPUZlKGZlKTtmdW5jdGlvbiBqZSh0KXtyZXR1cm4gZnVuY3Rpb24gbihlKXtmdW5jdGlvbiByKG4scil7dmFyIGk9dCgobj1LbihuKSkuaCwocj1LbihyKSkuaCksbz1mZShuLnMsci5zKSxhPWZlKG4ubCxyLmwpLHU9ZmUobi5vcGFjaXR5LHIub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9aSh0KSxuLnM9byh0KSxuLmw9YShNYXRoLnBvdyh0LGUpKSxuLm9wYWNpdHk9dSh0KSxuKyIifX1yZXR1cm4gZT0rZSxyLmdhbW1hPW4scn0oMSl9dmFyIFhlPWplKGFlKSxHZT1qZShmZSk7dmFyIFZlLCRlLFdlPTAsWmU9MCxRZT0wLEplPTFlMyxLZT0wLHRyPTAsbnI9MCxlcj0ib2JqZWN0Ij09dHlwZW9mIHBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2U6RGF0ZSxycj0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTcpfTtmdW5jdGlvbiBpcigpe3JldHVybiB0cnx8KHJyKG9yKSx0cj1lci5ub3coKStucil9ZnVuY3Rpb24gb3IoKXt0cj0wfWZ1bmN0aW9uIGFyKCl7dGhpcy5fY2FsbD10aGlzLl90aW1lPXRoaXMuX25leHQ9bnVsbH1mdW5jdGlvbiB1cih0LG4sZSl7dmFyIHI9bmV3IGFyO3JldHVybiByLnJlc3RhcnQodCxuLGUpLHJ9ZnVuY3Rpb24gZnIoKXtpcigpLCsrV2U7Zm9yKHZhciB0LG49VmU7bjspKHQ9dHItbi5fdGltZSk+PTAmJm4uX2NhbGwuY2FsbChudWxsLHQpLG49bi5fbmV4dDstLVdlfWZ1bmN0aW9uIGNyKCl7dHI9KEtlPWVyLm5vdygpKStucixXZT1aZT0wO3RyeXtmcigpfWZpbmFsbHl7V2U9MCxmdW5jdGlvbigpe3ZhciB0LG4sZT1WZSxyPTEvMDtmb3IoO2U7KWUuX2NhbGw/KHI+ZS5fdGltZSYmKHI9ZS5fdGltZSksdD1lLGU9ZS5fbmV4dCk6KG49ZS5fbmV4dCxlLl9uZXh0PW51bGwsZT10P3QuX25leHQ9bjpWZT1uKTskZT10LGxyKHIpfSgpLHRyPTB9fWZ1bmN0aW9uIHNyKCl7dmFyIHQ9ZXIubm93KCksbj10LUtlO24+SmUmJihuci09bixLZT10KX1mdW5jdGlvbiBscih0KXtXZXx8KFplJiYoWmU9Y2xlYXJUaW1lb3V0KFplKSksdC10cj4yND8odDwxLzAmJihaZT1zZXRUaW1lb3V0KGNyLHQtZXIubm93KCktbnIpKSxRZSYmKFFlPWNsZWFySW50ZXJ2YWwoUWUpKSk6KFFlfHwoS2U9ZXIubm93KCksUWU9c2V0SW50ZXJ2YWwoc3IsSmUpKSxXZT0xLHJyKGNyKSkpfWZ1bmN0aW9uIGhyKHQsbixlKXt2YXIgcj1uZXcgYXI7cmV0dXJuIG49bnVsbD09bj8wOituLHIucmVzdGFydChmdW5jdGlvbihlKXtyLnN0b3AoKSx0KGUrbil9LG4sZSkscn1hci5wcm90b3R5cGU9dXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjphcixyZXN0YXJ0OmZ1bmN0aW9uKHQsbixlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbiIpO2U9KG51bGw9PWU/aXIoKTorZSkrKG51bGw9PW4/MDorbiksdGhpcy5fbmV4dHx8JGU9PT10aGlzfHwoJGU/JGUuX25leHQ9dGhpczpWZT10aGlzLCRlPXRoaXMpLHRoaXMuX2NhbGw9dCx0aGlzLl90aW1lPWUsbHIoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2NhbGwmJih0aGlzLl9jYWxsPW51bGwsdGhpcy5fdGltZT0xLzAsbHIoKSl9fTt2YXIgZHI9SSgic3RhcnQiLCJlbmQiLCJpbnRlcnJ1cHQiKSxwcj1bXSx2cj0wLGdyPTEseXI9Mixfcj0zLGJyPTQsbXI9NSx4cj02O2Z1bmN0aW9uIHdyKHQsbixlLHIsaSxvKXt2YXIgYT10Ll9fdHJhbnNpdGlvbjtpZihhKXtpZihlIGluIGEpcmV0dXJufWVsc2UgdC5fX3RyYW5zaXRpb249e307IWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpPXQuX190cmFuc2l0aW9uO2Z1bmN0aW9uIG8oZil7dmFyIGMscyxsLGg7aWYoZS5zdGF0ZSE9PWdyKXJldHVybiB1KCk7Zm9yKGMgaW4gaSlpZigoaD1pW2NdKS5uYW1lPT09ZS5uYW1lKXtpZihoLnN0YXRlPT09X3IpcmV0dXJuIGhyKG8pO2guc3RhdGU9PT1icj8oaC5zdGF0ZT14cixoLnRpbWVyLnN0b3AoKSxoLm9uLmNhbGwoImludGVycnVwdCIsdCx0Ll9fZGF0YV9fLGguaW5kZXgsaC5ncm91cCksZGVsZXRlIGlbY10pOitjPG4mJihoLnN0YXRlPXhyLGgudGltZXIuc3RvcCgpLGRlbGV0ZSBpW2NdKX1pZihocihmdW5jdGlvbigpe2Uuc3RhdGU9PT1fciYmKGUuc3RhdGU9YnIsZS50aW1lci5yZXN0YXJ0KGEsZS5kZWxheSxlLnRpbWUpLGEoZikpfSksZS5zdGF0ZT15cixlLm9uLmNhbGwoInN0YXJ0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxlLnN0YXRlPT09eXIpe2ZvcihlLnN0YXRlPV9yLHI9bmV3IEFycmF5KGw9ZS50d2Vlbi5sZW5ndGgpLGM9MCxzPS0xO2M8bDsrK2MpKGg9ZS50d2VlbltjXS52YWx1ZS5jYWxsKHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApKSYmKHJbKytzXT1oKTtyLmxlbmd0aD1zKzF9fWZ1bmN0aW9uIGEobil7Zm9yKHZhciBpPW48ZS5kdXJhdGlvbj9lLmVhc2UuY2FsbChudWxsLG4vZS5kdXJhdGlvbik6KGUudGltZXIucmVzdGFydCh1KSxlLnN0YXRlPW1yLDEpLG89LTEsYT1yLmxlbmd0aDsrK288YTspcltvXS5jYWxsKG51bGwsaSk7ZS5zdGF0ZT09PW1yJiYoZS5vbi5jYWxsKCJlbmQiLHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApLHUoKSl9ZnVuY3Rpb24gdSgpe2Zvcih2YXIgciBpbiBlLnN0YXRlPXhyLGUudGltZXIuc3RvcCgpLGRlbGV0ZSBpW25dLGkpcmV0dXJuO2RlbGV0ZSB0Ll9fdHJhbnNpdGlvbn1pW25dPWUsZS50aW1lcj11cihmdW5jdGlvbih0KXtlLnN0YXRlPWdyLGUudGltZXIucmVzdGFydChvLGUuZGVsYXksZS50aW1lKSxlLmRlbGF5PD10JiZvKHQtZS5kZWxheSl9LDAsZS50aW1lKX0odCxlLHtuYW1lOm4saW5kZXg6cixncm91cDppLG9uOmRyLHR3ZWVuOnByLHRpbWU6by50aW1lLGRlbGF5Om8uZGVsYXksZHVyYXRpb246by5kdXJhdGlvbixlYXNlOm8uZWFzZSx0aW1lcjpudWxsLHN0YXRlOnZyfSl9ZnVuY3Rpb24gTXIodCxuKXt2YXIgZT1Ucih0LG4pO2lmKGUuc3RhdGU+dnIpdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFkeSBzY2hlZHVsZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBBcih0LG4pe3ZhciBlPVRyKHQsbik7aWYoZS5zdGF0ZT55cil0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHN0YXJ0ZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBUcih0LG4pe3ZhciBlPXQuX190cmFuc2l0aW9uO2lmKCFlfHwhKGU9ZVtuXSkpdGhyb3cgbmV3IEVycm9yKCJ0cmFuc2l0aW9uIG5vdCBmb3VuZCIpO3JldHVybiBlfWZ1bmN0aW9uIE5yKHQsbil7dmFyIGUscixpLG89dC5fX3RyYW5zaXRpb24sYT0hMDtpZihvKXtmb3IoaSBpbiBuPW51bGw9PW4/bnVsbDpuKyIiLG8pKGU9b1tpXSkubmFtZT09PW4/KHI9ZS5zdGF0ZT55ciYmZS5zdGF0ZTxtcixlLnN0YXRlPXhyLGUudGltZXIuc3RvcCgpLHImJmUub24uY2FsbCgiaW50ZXJydXB0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxkZWxldGUgb1tpXSk6YT0hMTthJiZkZWxldGUgdC5fX3RyYW5zaXRpb259fWZ1bmN0aW9uIFNyKHQsbixlKXt2YXIgcj10Ll9pZDtyZXR1cm4gdC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9QXIodGhpcyxyKTsodC52YWx1ZXx8KHQudmFsdWU9e30pKVtuXT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLGZ1bmN0aW9uKHQpe3JldHVybiBUcih0LHIpLnZhbHVlW25dfX1mdW5jdGlvbiBFcih0LG4pe3ZhciBlO3JldHVybigibnVtYmVyIj09dHlwZW9mIG4/dmU6biBpbnN0YW5jZW9mIHZuP2NlOihlPXZuKG4pKT8obj1lLGNlKTpiZSkodCxuKX12YXIga3I9THQucHJvdG90eXBlLmNvbnN0cnVjdG9yO3ZhciBDcj0wO2Z1bmN0aW9uIFByKHQsbixlLHIpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9bix0aGlzLl9uYW1lPWUsdGhpcy5faWQ9cn1mdW5jdGlvbiB6cih0KXtyZXR1cm4gTHQoKS50cmFuc2l0aW9uKHQpfWZ1bmN0aW9uIFJyKCl7cmV0dXJuKytDcn12YXIgTHI9THQucHJvdG90eXBlO2Z1bmN0aW9uIERyKHQpe3JldHVybigodCo9Mik8PTE/dCp0Oi0tdCooMi10KSsxKS8yfWZ1bmN0aW9uIFVyKHQpe3JldHVybigodCo9Mik8PTE/dCp0KnQ6KHQtPTIpKnQqdCsyKS8yfVByLnByb3RvdHlwZT16ci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlByLHNlbGVjdDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVEodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPW5ldyBBcnJheShpKSxhPTA7YTxpOysrYSlmb3IodmFyIHUsZixjPXJbYV0scz1jLmxlbmd0aCxsPW9bYV09bmV3IEFycmF5KHMpLGg9MDtoPHM7KytoKSh1PWNbaF0pJiYoZj10LmNhbGwodSx1Ll9fZGF0YV9fLGgsYykpJiYoIl9fZGF0YV9fImluIHUmJihmLl9fZGF0YV9fPXUuX19kYXRhX18pLGxbaF09Zix3cihsW2hdLG4sZSxoLGwsVHIodSxlKSkpO3JldHVybiBuZXcgUHIobyx0aGlzLl9wYXJlbnRzLG4sZSl9LHNlbGVjdEFsbDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUsodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPVtdLGE9W10sdT0wO3U8aTsrK3UpZm9yKHZhciBmLGM9clt1XSxzPWMubGVuZ3RoLGw9MDtsPHM7KytsKWlmKGY9Y1tsXSl7Zm9yKHZhciBoLGQ9dC5jYWxsKGYsZi5fX2RhdGFfXyxsLGMpLHA9VHIoZixlKSx2PTAsZz1kLmxlbmd0aDt2PGc7Kyt2KShoPWRbdl0pJiZ3cihoLG4sZSx2LGQscCk7by5wdXNoKGQpLGEucHVzaChmKX1yZXR1cm4gbmV3IFByKG8sYSxuLGUpfSxmaWx0ZXI6ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXJ0KHQpKTtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9bi5sZW5ndGgscj1uZXcgQXJyYXkoZSksaT0wO2k8ZTsrK2kpZm9yKHZhciBvLGE9bltpXSx1PWEubGVuZ3RoLGY9cltpXT1bXSxjPTA7Yzx1OysrYykobz1hW2NdKSYmdC5jYWxsKG8sby5fX2RhdGFfXyxjLGEpJiZmLnB1c2gobyk7cmV0dXJuIG5ldyBQcihyLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LG1lcmdlOmZ1bmN0aW9uKHQpe2lmKHQuX2lkIT09dGhpcy5faWQpdGhyb3cgbmV3IEVycm9yO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT10Ll9ncm91cHMscj1uLmxlbmd0aCxpPWUubGVuZ3RoLG89TWF0aC5taW4ocixpKSxhPW5ldyBBcnJheShyKSx1PTA7dTxvOysrdSlmb3IodmFyIGYsYz1uW3VdLHM9ZVt1XSxsPWMubGVuZ3RoLGg9YVt1XT1uZXcgQXJyYXkobCksZD0wO2Q8bDsrK2QpKGY9Y1tkXXx8c1tkXSkmJihoW2RdPWYpO2Zvcig7dTxyOysrdSlhW3VdPW5bdV07cmV0dXJuIG5ldyBQcihhLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LHNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiBuZXcga3IodGhpcy5fZ3JvdXBzLHRoaXMuX3BhcmVudHMpfSx0cmFuc2l0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX25hbWUsbj10aGlzLl9pZCxlPVJyKCkscj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPTA7bzxpOysrbylmb3IodmFyIGEsdT1yW29dLGY9dS5sZW5ndGgsYz0wO2M8ZjsrK2MpaWYoYT11W2NdKXt2YXIgcz1UcihhLG4pO3dyKGEsdCxlLGMsdSx7dGltZTpzLnRpbWUrcy5kZWxheStzLmR1cmF0aW9uLGRlbGF5OjAsZHVyYXRpb246cy5kdXJhdGlvbixlYXNlOnMuZWFzZX0pfXJldHVybiBuZXcgUHIocix0aGlzLl9wYXJlbnRzLHQsZSl9LGNhbGw6THIuY2FsbCxub2RlczpMci5ub2Rlcyxub2RlOkxyLm5vZGUsc2l6ZTpMci5zaXplLGVtcHR5OkxyLmVtcHR5LGVhY2g6THIuZWFjaCxvbjpmdW5jdGlvbih0LG4pe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/VHIodGhpcy5ub2RlKCksZSkub24ub24odCk6dGhpcy5lYWNoKGZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG89ZnVuY3Rpb24odCl7cmV0dXJuKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5ldmVyeShmdW5jdGlvbih0KXt2YXIgbj10LmluZGV4T2YoIi4iKTtyZXR1cm4gbj49MCYmKHQ9dC5zbGljZSgwLG4pKSwhdHx8InN0YXJ0Ij09PXR9KX0obik/TXI6QXI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9byh0aGlzLHQpLHU9YS5vbjt1IT09ciYmKGk9KHI9dSkuY29weSgpKS5vbihuLGUpLGEub249aX19KGUsdCxuKSl9LGF0dHI6ZnVuY3Rpb24odCxuKXt2YXIgZT0kKHQpLHI9InRyYW5zZm9ybSI9PT1lP1BlOkVyO3JldHVybiB0aGlzLmF0dHJUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBuPyhlLmxvY2FsP2Z1bmN0aW9uKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEsdT1lKHRoaXMpO2lmKG51bGwhPXUpcmV0dXJuKGE9dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpKT09PXU/bnVsbDphPT09ciYmdT09PWk/bzpvPW4ocj1hLGk9dSk7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYSx1PWUodGhpcyk7aWYobnVsbCE9dSlyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZSh0KSk9PT11P251bGw6YT09PXImJnU9PT1pP286bz1uKHI9YSxpPXUpO3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX0pKGUscixTcih0aGlzLCJhdHRyLiIrdCxuKSk6bnVsbD09bj8oZS5sb2NhbD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19KShlKTooZS5sb2NhbD9mdW5jdGlvbih0LG4sZSl7dmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcy5nZXRBdHRyaWJ1dGUodCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX0pKGUscixuKyIiKSl9LGF0dHJUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciBlPSJhdHRyLiIrdDtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKGU9dGhpcy50d2VlbihlKSkmJmUuX3ZhbHVlO2lmKG51bGw9PW4pcmV0dXJuIHRoaXMudHdlZW4oZSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7dmFyIHI9JCh0KTtyZXR1cm4gdGhpcy50d2VlbihlLChyLmxvY2FsP2Z1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXMscj1uLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gciYmZnVuY3Rpb24obil7ZS5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwscihuKSl9fXJldHVybiBlLl92YWx1ZT1uLGV9OmZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXMscj1uLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gciYmZnVuY3Rpb24obil7ZS5zZXRBdHRyaWJ1dGUodCxyKG4pKX19cmV0dXJuIGUuX3ZhbHVlPW4sZX0pKHIsbikpfSxzdHlsZTpmdW5jdGlvbih0LG4sZSl7dmFyIHI9InRyYW5zZm9ybSI9PSh0Kz0iIik/Q2U6RXI7cmV0dXJuIG51bGw9PW4/dGhpcy5zdHlsZVR3ZWVuKHQsZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89bHQodGhpcyx0KSxhPSh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLGx0KHRoaXMsdCkpO3JldHVybiBvPT09YT9udWxsOm89PT1lJiZhPT09cj9pOmk9bihlPW8scj1hKX19KHQscikpLm9uKCJlbmQuc3R5bGUuIit0LGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fSh0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1sdCh0aGlzLHQpLHU9ZSh0aGlzKTtyZXR1cm4gbnVsbD09dSYmKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCksdT1sdCh0aGlzLHQpKSxhPT09dT9udWxsOmE9PT1yJiZ1PT09aT9vOm89bihyPWEsaT11KX19KHQscixTcih0aGlzLCJzdHlsZS4iK3QsbikpOmZ1bmN0aW9uKHQsbixlKXt2YXIgcixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPWx0KHRoaXMsdCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX0odCxyLG4rIiIpLGUpfSxzdHlsZVR3ZWVuOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj0ic3R5bGUuIisodCs9IiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4ocj10aGlzLnR3ZWVuKHIpKSYmci5fdmFsdWU7aWYobnVsbD09bilyZXR1cm4gdGhpcy50d2VlbihyLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy50d2VlbihyLGZ1bmN0aW9uKHQsbixlKXtmdW5jdGlvbiByKCl7dmFyIHI9dGhpcyxpPW4uYXBwbHkocixhcmd1bWVudHMpO3JldHVybiBpJiZmdW5jdGlvbihuKXtyLnN0eWxlLnNldFByb3BlcnR5KHQsaShuKSxlKX19cmV0dXJuIHIuX3ZhbHVlPW4scn0odCxuLG51bGw9PWU/IiI6ZSkpfSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnR3ZWVuKCJ0ZXh0IiwiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10KHRoaXMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09bj8iIjpufX0oU3IodGhpcywidGV4dCIsdCkpOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KG51bGw9PXQ/IiI6dCsiIikpfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vbigiZW5kLnJlbW92ZSIsKHQ9dGhpcy5faWQsZnVuY3Rpb24oKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7Zm9yKHZhciBlIGluIHRoaXMuX190cmFuc2l0aW9uKWlmKCtlIT09dClyZXR1cm47biYmbi5yZW1vdmVDaGlsZCh0aGlzKX0pKTt2YXIgdH0sdHdlZW46ZnVuY3Rpb24odCxuKXt2YXIgZT10aGlzLl9pZDtpZih0Kz0iIixhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgcixpPVRyKHRoaXMubm9kZSgpLGUpLnR3ZWVuLG89MCxhPWkubGVuZ3RoO288YTsrK28paWYoKHI9aVtvXSkubmFtZT09PXQpcmV0dXJuIHIudmFsdWU7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0LG4pe3ZhciBlLHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9QXIodGhpcyx0KSxvPWkudHdlZW47aWYobyE9PWUpZm9yKHZhciBhPTAsdT0ocj1lPW8pLmxlbmd0aDthPHU7KythKWlmKHJbYV0ubmFtZT09PW4peyhyPXIuc2xpY2UoKSkuc3BsaWNlKGEsMSk7YnJlYWt9aS50d2Vlbj1yfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPUFyKHRoaXMsdCksYT1vLnR3ZWVuO2lmKGEhPT1yKXtpPShyPWEpLnNsaWNlKCk7Zm9yKHZhciB1PXtuYW1lOm4sdmFsdWU6ZX0sZj0wLGM9aS5sZW5ndGg7ZjxjOysrZilpZihpW2ZdLm5hbWU9PT1uKXtpW2ZdPXU7YnJlYWt9Zj09PWMmJmkucHVzaCh1KX1vLnR3ZWVuPWl9fSkoZSx0LG4pKX0sZGVsYXk6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe01yKHRoaXMsdCkuZGVsYXk9K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gbj0rbixmdW5jdGlvbigpe01yKHRoaXMsdCkuZGVsYXk9bn19KShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5kZWxheX0sZHVyYXRpb246ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe0FyKHRoaXMsdCkuZHVyYXRpb249K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gbj0rbixmdW5jdGlvbigpe0FyKHRoaXMsdCkuZHVyYXRpb249bn19KShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5kdXJhdGlvbn0sZWFzZTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goZnVuY3Rpb24odCxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7QXIodGhpcyx0KS5lYXNlPW59fShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5lYXNlfX07dmFyIHFyPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gTWF0aC5wb3codCxuKX1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksT3I9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiAxLU1hdGgucG93KDEtdCxuKX1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksWXI9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybigodCo9Mik8PTE/TWF0aC5wb3codCxuKToyLU1hdGgucG93KDItdCxuKSkvMn1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksQnI9TWF0aC5QSSxGcj1Cci8yO2Z1bmN0aW9uIElyKHQpe3JldHVybigxLU1hdGguY29zKEJyKnQpKS8yfWZ1bmN0aW9uIEhyKHQpe3JldHVybigodCo9Mik8PTE/TWF0aC5wb3coMiwxMCp0LTEwKToyLU1hdGgucG93KDIsMTAtMTAqdCkpLzJ9ZnVuY3Rpb24ganIodCl7cmV0dXJuKCh0Kj0yKTw9MT8xLU1hdGguc3FydCgxLXQqdCk6TWF0aC5zcXJ0KDEtKHQtPTIpKnQpKzEpLzJ9dmFyIFhyPTQvMTEsR3I9Ni8xMSxWcj04LzExLCRyPS43NSxXcj05LzExLFpyPTEwLzExLFFyPS45Mzc1LEpyPTIxLzIyLEtyPTYzLzY0LHRpPTEvWHIvWHI7ZnVuY3Rpb24gbmkodCl7cmV0dXJuKHQ9K3QpPFhyP3RpKnQqdDp0PFZyP3RpKih0LT1HcikqdCskcjp0PFpyP3RpKih0LT1XcikqdCtRcjp0aSoodC09SnIpKnQrS3J9dmFyIGVpPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCp0KigobisxKSp0LW4pfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCkscmk9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybi0tdCp0KigobisxKSp0K24pKzF9cmV0dXJuIG49K24sZS5vdmVyc2hvb3Q9dCxlfSgxLjcwMTU4KSxpaT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuKCh0Kj0yKTwxP3QqdCooKG4rMSkqdC1uKToodC09MikqdCooKG4rMSkqdCtuKSsyKS8yfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCksb2k9MipNYXRoLlBJLGFpPWZ1bmN0aW9uIHQobixlKXt2YXIgcj1NYXRoLmFzaW4oMS8obj1NYXRoLm1heCgxLG4pKSkqKGUvPW9pKTtmdW5jdGlvbiBpKHQpe3JldHVybiBuKk1hdGgucG93KDIsMTAqLS10KSpNYXRoLnNpbigoci10KS9lKX1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKm9pKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksdWk9ZnVuY3Rpb24gdChuLGUpe3ZhciByPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89b2kpO2Z1bmN0aW9uIGkodCl7cmV0dXJuIDEtbipNYXRoLnBvdygyLC0xMCoodD0rdCkpKk1hdGguc2luKCh0K3IpL2UpfXJldHVybiBpLmFtcGxpdHVkZT1mdW5jdGlvbihuKXtyZXR1cm4gdChuLGUqb2kpfSxpLnBlcmlvZD1mdW5jdGlvbihlKXtyZXR1cm4gdChuLGUpfSxpfSgxLC4zKSxmaT1mdW5jdGlvbiB0KG4sZSl7dmFyIHI9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihlLz1vaSk7ZnVuY3Rpb24gaSh0KXtyZXR1cm4oKHQ9Mip0LTEpPDA/bipNYXRoLnBvdygyLDEwKnQpKk1hdGguc2luKChyLXQpL2UpOjItbipNYXRoLnBvdygyLC0xMCp0KSpNYXRoLnNpbigocit0KS9lKSkvMn1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKm9pKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksY2k9e3RpbWU6bnVsbCxkZWxheTowLGR1cmF0aW9uOjI1MCxlYXNlOlVyfTtmdW5jdGlvbiBzaSh0LG4pe2Zvcih2YXIgZTshKGU9dC5fX3RyYW5zaXRpb24pfHwhKGU9ZVtuXSk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybiBjaS50aW1lPWlyKCksY2k7cmV0dXJuIGV9THQucHJvdG90eXBlLmludGVycnVwdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7TnIodGhpcyx0KX0pfSxMdC5wcm90b3R5cGUudHJhbnNpdGlvbj1mdW5jdGlvbih0KXt2YXIgbixlO3QgaW5zdGFuY2VvZiBQcj8obj10Ll9pZCx0PXQuX25hbWUpOihuPVJyKCksKGU9Y2kpLnRpbWU9aXIoKSx0PW51bGw9PXQ/bnVsbDp0KyIiKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz0wO288aTsrK28pZm9yKHZhciBhLHU9cltvXSxmPXUubGVuZ3RoLGM9MDtjPGY7KytjKShhPXVbY10pJiZ3cihhLHQsbixjLHUsZXx8c2koYSxuKSk7cmV0dXJuIG5ldyBQcihyLHRoaXMuX3BhcmVudHMsdCxuKX07dmFyIGxpPVtudWxsXTtmdW5jdGlvbiBoaSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gZGkodCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy5zZWxlY3Rpb249ZX1mdW5jdGlvbiBwaSgpe3QuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gdmkoKXt0LmV2ZW50LnByZXZlbnREZWZhdWx0KCksdC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX12YXIgZ2k9e25hbWU6ImRyYWcifSx5aT17bmFtZToic3BhY2UifSxfaT17bmFtZToiaGFuZGxlIn0sYmk9e25hbWU6ImNlbnRlciJ9LG1pPXtuYW1lOiJ4IixoYW5kbGVzOlsiZSIsInciXS5tYXAoRWkpLGlucHV0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQmJltbdFswXSxuWzBdWzFdXSxbdFsxXSxuWzFdWzFdXV19LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmW3RbMF1bMF0sdFsxXVswXV19fSx4aT17bmFtZToieSIsaGFuZGxlczpbIm4iLCJzIl0ubWFwKEVpKSxpbnB1dDpmdW5jdGlvbih0LG4pe3JldHVybiB0JiZbW25bMF1bMF0sdFswXV0sW25bMV1bMF0sdFsxXV1dfSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlt0WzBdWzFdLHRbMV1bMV1dfX0sd2k9e25hbWU6Inh5IixoYW5kbGVzOlsibiIsImUiLCJzIiwidyIsIm53IiwibmUiLCJzZSIsInN3Il0ubWFwKEVpKSxpbnB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdH0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0fX0sTWk9e292ZXJsYXk6ImNyb3NzaGFpciIsc2VsZWN0aW9uOiJtb3ZlIixuOiJucy1yZXNpemUiLGU6ImV3LXJlc2l6ZSIsczoibnMtcmVzaXplIix3OiJldy1yZXNpemUiLG53OiJud3NlLXJlc2l6ZSIsbmU6Im5lc3ctcmVzaXplIixzZToibndzZS1yZXNpemUiLHN3OiJuZXN3LXJlc2l6ZSJ9LEFpPXtlOiJ3Iix3OiJlIixudzoibmUiLG5lOiJudyIsc2U6InN3Iixzdzoic2UifSxUaT17bjoicyIsczoibiIsbnc6InN3IixuZToic2UiLHNlOiJuZSIsc3c6Im53In0sTmk9e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOm51bGwsZToxLHM6bnVsbCx3Oi0xLG53Oi0xLG5lOjEsc2U6MSxzdzotMX0sU2k9e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOi0xLGU6bnVsbCxzOjEsdzpudWxsLG53Oi0xLG5lOi0xLHNlOjEsc3c6MX07ZnVuY3Rpb24gRWkodCl7cmV0dXJue3R5cGU6dH19ZnVuY3Rpb24ga2koKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gQ2koKXt2YXIgdD10aGlzLm93bmVyU1ZHRWxlbWVudHx8dGhpcztyZXR1cm5bWzAsMF0sW3Qud2lkdGguYmFzZVZhbC52YWx1ZSx0LmhlaWdodC5iYXNlVmFsLnZhbHVlXV19ZnVuY3Rpb24gUGkodCl7Zm9yKDshdC5fX2JydXNoOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHQuX19icnVzaH1mdW5jdGlvbiB6aSh0KXtyZXR1cm4gdFswXVswXT09PXRbMV1bMF18fHRbMF1bMV09PT10WzFdWzFdfWZ1bmN0aW9uIFJpKG4pe3ZhciBlLHI9Q2ksaT1raSxvPUkodSwic3RhcnQiLCJicnVzaCIsImVuZCIpLGE9NjtmdW5jdGlvbiB1KHQpe3ZhciBlPXQucHJvcGVydHkoIl9fYnJ1c2giLGgpLnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5kYXRhKFtFaSgib3ZlcmxheSIpXSk7ZS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwib3ZlcmxheSIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuYXR0cigiY3Vyc29yIixNaS5vdmVybGF5KS5tZXJnZShlKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9UGkodGhpcykuZXh0ZW50O0R0KHRoaXMpLmF0dHIoIngiLHRbMF1bMF0pLmF0dHIoInkiLHRbMF1bMV0pLmF0dHIoIndpZHRoIix0WzFdWzBdLXRbMF1bMF0pLmF0dHIoImhlaWdodCIsdFsxXVsxXS10WzBdWzFdKX0pLHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuZGF0YShbRWkoInNlbGVjdGlvbiIpXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsInNlbGVjdGlvbiIpLmF0dHIoImN1cnNvciIsTWkuc2VsZWN0aW9uKS5hdHRyKCJmaWxsIiwiIzc3NyIpLmF0dHIoImZpbGwtb3BhY2l0eSIsLjMpLmF0dHIoInN0cm9rZSIsIiNmZmYiKS5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIik7dmFyIHI9dC5zZWxlY3RBbGwoIi5oYW5kbGUiKS5kYXRhKG4uaGFuZGxlcyxmdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlfSk7ci5leGl0KCkucmVtb3ZlKCksci5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIixmdW5jdGlvbih0KXtyZXR1cm4iaGFuZGxlIGhhbmRsZS0tIit0LnR5cGV9KS5hdHRyKCJjdXJzb3IiLGZ1bmN0aW9uKHQpe3JldHVybiBNaVt0LnR5cGVdfSksdC5lYWNoKGYpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2ggdG91Y2hzdGFydC5icnVzaCIsbCl9ZnVuY3Rpb24gZigpe3ZhciB0PUR0KHRoaXMpLG49UGkodGhpcykuc2VsZWN0aW9uO24/KHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLG5bMF1bMF0pLmF0dHIoInkiLG5bMF1bMV0pLmF0dHIoIndpZHRoIixuWzFdWzBdLW5bMF1bMF0pLmF0dHIoImhlaWdodCIsblsxXVsxXS1uWzBdWzFdKSx0LnNlbGVjdEFsbCgiLmhhbmRsZSIpLnN0eWxlKCJkaXNwbGF5IixudWxsKS5hdHRyKCJ4IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGVbdC50eXBlLmxlbmd0aC0xXT9uWzFdWzBdLWEvMjpuWzBdWzBdLWEvMn0pLmF0dHIoInkiLGZ1bmN0aW9uKHQpe3JldHVybiJzIj09PXQudHlwZVswXT9uWzFdWzFdLWEvMjpuWzBdWzFdLWEvMn0pLmF0dHIoIndpZHRoIixmdW5jdGlvbih0KXtyZXR1cm4ibiI9PT10LnR5cGV8fCJzIj09PXQudHlwZT9uWzFdWzBdLW5bMF1bMF0rYTphfSkuYXR0cigiaGVpZ2h0IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGV8fCJ3Ij09PXQudHlwZT9uWzFdWzFdLW5bMF1bMV0rYTphfSkpOnQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uLC5oYW5kbGUiKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKS5hdHRyKCJ4IixudWxsKS5hdHRyKCJ5IixudWxsKS5hdHRyKCJ3aWR0aCIsbnVsbCkuYXR0cigiaGVpZ2h0IixudWxsKX1mdW5jdGlvbiBjKHQsbil7cmV0dXJuIHQuX19icnVzaC5lbWl0dGVyfHxuZXcgcyh0LG4pfWZ1bmN0aW9uIHModCxuKXt0aGlzLnRoYXQ9dCx0aGlzLmFyZ3M9bix0aGlzLnN0YXRlPXQuX19icnVzaCx0aGlzLmFjdGl2ZT0wfWZ1bmN0aW9uIGwoKXtpZih0LmV2ZW50LnRvdWNoZXMpe2lmKHQuZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoPHQuZXZlbnQudG91Y2hlcy5sZW5ndGgpcmV0dXJuIHZpKCl9ZWxzZSBpZihlKXJldHVybjtpZihpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIHIsbyxhLHUscyxsLGgsZCxwLHYsZyx5LF8sYj10aGlzLG09dC5ldmVudC50YXJnZXQuX19kYXRhX18udHlwZSx4PSJzZWxlY3Rpb24iPT09KHQuZXZlbnQubWV0YUtleT9tPSJvdmVybGF5IjptKT9naTp0LmV2ZW50LmFsdEtleT9iaTpfaSx3PW49PT14aT9udWxsOk5pW21dLE09bj09PW1pP251bGw6U2lbbV0sQT1QaShiKSxUPUEuZXh0ZW50LE49QS5zZWxlY3Rpb24sUz1UWzBdWzBdLEU9VFswXVsxXSxrPVRbMV1bMF0sQz1UWzFdWzFdLFA9dyYmTSYmdC5ldmVudC5zaGlmdEtleSx6PUZ0KGIpLFI9eixMPWMoYixhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCk7Im92ZXJsYXkiPT09bT9BLnNlbGVjdGlvbj1OPVtbcj1uPT09eGk/Uzp6WzBdLGE9bj09PW1pP0U6elsxXV0sW3M9bj09PXhpP2s6cixoPW49PT1taT9DOmFdXToocj1OWzBdWzBdLGE9TlswXVsxXSxzPU5bMV1bMF0saD1OWzFdWzFdKSxvPXIsdT1hLGw9cyxkPWg7dmFyIEQ9RHQoYikuYXR0cigicG9pbnRlci1ldmVudHMiLCJub25lIiksVT1ELnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5hdHRyKCJjdXJzb3IiLE1pW21dKTtpZih0LmV2ZW50LnRvdWNoZXMpRC5vbigidG91Y2htb3ZlLmJydXNoIixPLCEwKS5vbigidG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLEIsITApO2Vsc2V7dmFyIHE9RHQodC5ldmVudC52aWV3KS5vbigia2V5ZG93bi5icnVzaCIsZnVuY3Rpb24oKXtzd2l0Y2godC5ldmVudC5rZXlDb2RlKXtjYXNlIDE2OlA9dyYmTTticmVhaztjYXNlIDE4Ong9PT1faSYmKHcmJihzPWwtcCp3LHI9bytwKncpLE0mJihoPWQtdipNLGE9dSt2Kk0pLHg9YmksWSgpKTticmVhaztjYXNlIDMyOnghPT1faSYmeCE9PWJpfHwodzwwP3M9bC1wOnc+MCYmKHI9by1wKSxNPDA/aD1kLXY6TT4wJiYoYT11LXYpLHg9eWksVS5hdHRyKCJjdXJzb3IiLE1pLnNlbGVjdGlvbiksWSgpKTticmVhaztkZWZhdWx0OnJldHVybn12aSgpfSwhMCkub24oImtleXVwLmJydXNoIixmdW5jdGlvbigpe3N3aXRjaCh0LmV2ZW50LmtleUNvZGUpe2Nhc2UgMTY6UCYmKHk9Xz1QPSExLFkoKSk7YnJlYWs7Y2FzZSAxODp4PT09YmkmJih3PDA/cz1sOnc+MCYmKHI9byksTTwwP2g9ZDpNPjAmJihhPXUpLHg9X2ksWSgpKTticmVhaztjYXNlIDMyOng9PT15aSYmKHQuZXZlbnQuYWx0S2V5Pyh3JiYocz1sLXAqdyxyPW8rcCp3KSxNJiYoaD1kLXYqTSxhPXUrdipNKSx4PWJpKToodzwwP3M9bDp3PjAmJihyPW8pLE08MD9oPWQ6TT4wJiYoYT11KSx4PV9pKSxVLmF0dHIoImN1cnNvciIsTWlbbV0pLFkoKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59dmkoKX0sITApLm9uKCJtb3VzZW1vdmUuYnJ1c2giLE8sITApLm9uKCJtb3VzZXVwLmJydXNoIixCLCEwKTtYdCh0LmV2ZW50LnZpZXcpfXBpKCksTnIoYiksZi5jYWxsKGIpLEwuc3RhcnQoKX1mdW5jdGlvbiBPKCl7dmFyIHQ9RnQoYik7IVB8fHl8fF98fChNYXRoLmFicyh0WzBdLVJbMF0pPk1hdGguYWJzKHRbMV0tUlsxXSk/Xz0hMDp5PSEwKSxSPXQsZz0hMCx2aSgpLFkoKX1mdW5jdGlvbiBZKCl7dmFyIHQ7c3dpdGNoKHA9UlswXS16WzBdLHY9UlsxXS16WzFdLHgpe2Nhc2UgeWk6Y2FzZSBnaTp3JiYocD1NYXRoLm1heChTLXIsTWF0aC5taW4oay1zLHApKSxvPXIrcCxsPXMrcCksTSYmKHY9TWF0aC5tYXgoRS1hLE1hdGgubWluKEMtaCx2KSksdT1hK3YsZD1oK3YpO2JyZWFrO2Nhc2UgX2k6dzwwPyhwPU1hdGgubWF4KFMtcixNYXRoLm1pbihrLXIscCkpLG89citwLGw9cyk6dz4wJiYocD1NYXRoLm1heChTLXMsTWF0aC5taW4oay1zLHApKSxvPXIsbD1zK3ApLE08MD8odj1NYXRoLm1heChFLWEsTWF0aC5taW4oQy1hLHYpKSx1PWErdixkPWgpOk0+MCYmKHY9TWF0aC5tYXgoRS1oLE1hdGgubWluKEMtaCx2KSksdT1hLGQ9aCt2KTticmVhaztjYXNlIGJpOncmJihvPU1hdGgubWF4KFMsTWF0aC5taW4oayxyLXAqdykpLGw9TWF0aC5tYXgoUyxNYXRoLm1pbihrLHMrcCp3KSkpLE0mJih1PU1hdGgubWF4KEUsTWF0aC5taW4oQyxhLXYqTSkpLGQ9TWF0aC5tYXgoRSxNYXRoLm1pbihDLGgrdipNKSkpfWw8byYmKHcqPS0xLHQ9cixyPXMscz10LHQ9byxvPWwsbD10LG0gaW4gQWkmJlUuYXR0cigiY3Vyc29yIixNaVttPUFpW21dXSkpLGQ8dSYmKE0qPS0xLHQ9YSxhPWgsaD10LHQ9dSx1PWQsZD10LG0gaW4gVGkmJlUuYXR0cigiY3Vyc29yIixNaVttPVRpW21dXSkpLEEuc2VsZWN0aW9uJiYoTj1BLnNlbGVjdGlvbikseSYmKG89TlswXVswXSxsPU5bMV1bMF0pLF8mJih1PU5bMF1bMV0sZD1OWzFdWzFdKSxOWzBdWzBdPT09byYmTlswXVsxXT09PXUmJk5bMV1bMF09PT1sJiZOWzFdWzFdPT09ZHx8KEEuc2VsZWN0aW9uPVtbbyx1XSxbbCxkXV0sZi5jYWxsKGIpLEwuYnJ1c2goKSl9ZnVuY3Rpb24gQigpe2lmKHBpKCksdC5ldmVudC50b3VjaGVzKXtpZih0LmV2ZW50LnRvdWNoZXMubGVuZ3RoKXJldHVybjtlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZT1udWxsfSw1MDApLEQub24oInRvdWNobW92ZS5icnVzaCB0b3VjaGVuZC5icnVzaCB0b3VjaGNhbmNlbC5icnVzaCIsbnVsbCl9ZWxzZSBHdCh0LmV2ZW50LnZpZXcsZykscS5vbigia2V5ZG93bi5icnVzaCBrZXl1cC5icnVzaCBtb3VzZW1vdmUuYnJ1c2ggbW91c2V1cC5icnVzaCIsbnVsbCk7RC5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLFUuYXR0cigiY3Vyc29yIixNaS5vdmVybGF5KSxBLnNlbGVjdGlvbiYmKE49QS5zZWxlY3Rpb24pLHppKE4pJiYoQS5zZWxlY3Rpb249bnVsbCxmLmNhbGwoYikpLEwuZW5kKCl9fWZ1bmN0aW9uIGgoKXt2YXIgdD10aGlzLl9fYnJ1c2h8fHtzZWxlY3Rpb246bnVsbH07cmV0dXJuIHQuZXh0ZW50PXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuZGltPW4sdH1yZXR1cm4gdS5tb3ZlPWZ1bmN0aW9uKHQsZSl7dC5zZWxlY3Rpb24/dC5vbigic3RhcnQuYnJ1c2giLGZ1bmN0aW9uKCl7Yyh0aGlzLGFyZ3VtZW50cykuYmVmb3Jlc3RhcnQoKS5zdGFydCgpfSkub24oImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2giLGZ1bmN0aW9uKCl7Yyh0aGlzLGFyZ3VtZW50cykuZW5kKCl9KS50d2VlbigiYnJ1c2giLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxyPXQuX19icnVzaCxpPWModCxhcmd1bWVudHMpLG89ci5zZWxlY3Rpb24sYT1uLmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUsci5leHRlbnQpLHU9bWUobyxhKTtmdW5jdGlvbiBzKG4pe3Iuc2VsZWN0aW9uPTE9PT1uJiZ6aShhKT9udWxsOnUobiksZi5jYWxsKHQpLGkuYnJ1c2goKX1yZXR1cm4gbyYmYT9zOnMoMSl9KTp0LmVhY2goZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMscj10aGlzLl9fYnJ1c2gsaT1uLmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyx0KTplLHIuZXh0ZW50KSxvPWModGhpcyx0KS5iZWZvcmVzdGFydCgpO05yKHRoaXMpLHIuc2VsZWN0aW9uPW51bGw9PWl8fHppKGkpP251bGw6aSxmLmNhbGwodGhpcyksby5zdGFydCgpLmJydXNoKCkuZW5kKCl9KX0scy5wcm90b3R5cGU9e2JlZm9yZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLnN0YXRlLmVtaXR0ZXI9dGhpcyx0aGlzLnN0YXJ0aW5nPSEwKSx0aGlzfSxzdGFydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0aW5nJiYodGhpcy5zdGFydGluZz0hMSx0aGlzLmVtaXQoInN0YXJ0IikpLHRoaXN9LGJydXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW1pdCgiYnJ1c2giKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09LS10aGlzLmFjdGl2ZSYmKGRlbGV0ZSB0aGlzLnN0YXRlLmVtaXR0ZXIsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXtDdChuZXcgZGkodSx0LG4ub3V0cHV0KHRoaXMuc3RhdGUuc2VsZWN0aW9uKSksby5hcHBseSxvLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LHUuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6aGkoW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLHUpOnJ9LHUuZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6aGkoISF0KSx1KTppfSx1LmhhbmRsZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9K3QsdSk6YX0sdS5vbj1mdW5jdGlvbigpe3ZhciB0PW8ub24uYXBwbHkobyxhcmd1bWVudHMpO3JldHVybiB0PT09bz91OnR9LHV9dmFyIExpPU1hdGguY29zLERpPU1hdGguc2luLFVpPU1hdGguUEkscWk9VWkvMixPaT0yKlVpLFlpPU1hdGgubWF4O3ZhciBCaT1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gRmkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBJaT1NYXRoLlBJLEhpPTIqSWksamk9SGktMWUtNjtmdW5jdGlvbiBYaSgpe3RoaXMuX3gwPXRoaXMuX3kwPXRoaXMuX3gxPXRoaXMuX3kxPW51bGwsdGhpcy5fPSIifWZ1bmN0aW9uIEdpKCl7cmV0dXJuIG5ldyBYaX1mdW5jdGlvbiBWaSh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gJGkodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIFdpKHQpe3JldHVybiB0LnJhZGl1c31mdW5jdGlvbiBaaSh0KXtyZXR1cm4gdC5zdGFydEFuZ2xlfWZ1bmN0aW9uIFFpKHQpe3JldHVybiB0LmVuZEFuZ2xlfVhpLnByb3RvdHlwZT1HaS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlhpLG1vdmVUbzpmdW5jdGlvbih0LG4pe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rbil9LGNsb3NlUGF0aDpmdW5jdGlvbigpe251bGwhPT10aGlzLl94MSYmKHRoaXMuX3gxPXRoaXMuX3gwLHRoaXMuX3kxPXRoaXMuX3kwLHRoaXMuXys9IloiKX0sbGluZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fKz0iTCIrKHRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kxPStuKX0scXVhZHJhdGljQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyKXt0aGlzLl8rPSJRIisgK3QrIiwiKyArbisiLCIrKHRoaXMuX3gxPStlKSsiLCIrKHRoaXMuX3kxPStyKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyLGksbyl7dGhpcy5fKz0iQyIrICt0KyIsIisgK24rIiwiKyArZSsiLCIrICtyKyIsIisodGhpcy5feDE9K2kpKyIsIisodGhpcy5feTE9K28pfSxhcmNUbzpmdW5jdGlvbih0LG4sZSxyLGkpe3Q9K3Qsbj0rbixlPStlLHI9K3IsaT0raTt2YXIgbz10aGlzLl94MSxhPXRoaXMuX3kxLHU9ZS10LGY9ci1uLGM9by10LHM9YS1uLGw9YypjK3MqcztpZihpPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIraSk7aWYobnVsbD09PXRoaXMuX3gxKXRoaXMuXys9Ik0iKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPW4pO2Vsc2UgaWYobD4xZS02KWlmKE1hdGguYWJzKHMqdS1mKmMpPjFlLTYmJmkpe3ZhciBoPWUtbyxkPXItYSxwPXUqdStmKmYsdj1oKmgrZCpkLGc9TWF0aC5zcXJ0KHApLHk9TWF0aC5zcXJ0KGwpLF89aSpNYXRoLnRhbigoSWktTWF0aC5hY29zKChwK2wtdikvKDIqZyp5KSkpLzIpLGI9Xy95LG09Xy9nO01hdGguYWJzKGItMSk+MWUtNiYmKHRoaXMuXys9IkwiKyh0K2IqYykrIiwiKyhuK2IqcykpLHRoaXMuXys9IkEiK2krIiwiK2krIiwwLDAsIisgKyhzKmg+YypkKSsiLCIrKHRoaXMuX3gxPXQrbSp1KSsiLCIrKHRoaXMuX3kxPW4rbSpmKX1lbHNlIHRoaXMuXys9IkwiKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPW4pO2Vsc2U7fSxhcmM6ZnVuY3Rpb24odCxuLGUscixpLG8pe3Q9K3Qsbj0rbjt2YXIgYT0oZT0rZSkqTWF0aC5jb3MociksdT1lKk1hdGguc2luKHIpLGY9dCthLGM9bit1LHM9MV5vLGw9bz9yLWk6aS1yO2lmKGU8MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIitlKTtudWxsPT09dGhpcy5feDE/dGhpcy5fKz0iTSIrZisiLCIrYzooTWF0aC5hYnModGhpcy5feDEtZik+MWUtNnx8TWF0aC5hYnModGhpcy5feTEtYyk+MWUtNikmJih0aGlzLl8rPSJMIitmKyIsIitjKSxlJiYobDwwJiYobD1sJUhpK0hpKSxsPmppP3RoaXMuXys9IkEiK2UrIiwiK2UrIiwwLDEsIitzKyIsIisodC1hKSsiLCIrKG4tdSkrIkEiK2UrIiwiK2UrIiwwLDEsIitzKyIsIisodGhpcy5feDE9ZikrIiwiKyh0aGlzLl95MT1jKTpsPjFlLTYmJih0aGlzLl8rPSJBIitlKyIsIitlKyIsMCwiKyArKGw+PUlpKSsiLCIrcysiLCIrKHRoaXMuX3gxPXQrZSpNYXRoLmNvcyhpKSkrIiwiKyh0aGlzLl95MT1uK2UqTWF0aC5zaW4oaSkpKSl9LHJlY3Q6ZnVuY3Rpb24odCxuLGUscil7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStuKSsiaCIrICtlKyJ2IisgK3IrImgiKy1lKyJaIn0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX07ZnVuY3Rpb24gSmkoKXt9ZnVuY3Rpb24gS2kodCxuKXt2YXIgZT1uZXcgSmk7aWYodCBpbnN0YW5jZW9mIEppKXQuZWFjaChmdW5jdGlvbih0LG4pe2Uuc2V0KG4sdCl9KTtlbHNlIGlmKEFycmF5LmlzQXJyYXkodCkpe3ZhciByLGk9LTEsbz10Lmxlbmd0aDtpZihudWxsPT1uKWZvcig7KytpPG87KWUuc2V0KGksdFtpXSk7ZWxzZSBmb3IoOysraTxvOyllLnNldChuKHI9dFtpXSxpLHQpLHIpfWVsc2UgaWYodClmb3IodmFyIGEgaW4gdCllLnNldChhLHRbYV0pO3JldHVybiBlfWZ1bmN0aW9uIHRvKCl7cmV0dXJue319ZnVuY3Rpb24gbm8odCxuLGUpe3Rbbl09ZX1mdW5jdGlvbiBlbygpe3JldHVybiBLaSgpfWZ1bmN0aW9uIHJvKHQsbixlKXt0LnNldChuLGUpfWZ1bmN0aW9uIGlvKCl7fUppLnByb3RvdHlwZT1LaS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkppLGhhczpmdW5jdGlvbih0KXtyZXR1cm4iJCIrdCBpbiB0aGlzfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbIiQiK3RdfSxzZXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpc1siJCIrdF09bix0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49IiQiK3Q7cmV0dXJuIG4gaW4gdGhpcyYmZGVsZXRlIHRoaXNbbl19LGNsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpIiQiPT09dFswXSYmZGVsZXRlIHRoaXNbdF19LGtleXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0LnB1c2gobi5zbGljZSgxKSk7cmV0dXJuIHR9LHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKSIkIj09PW5bMF0mJnQucHVzaCh0aGlzW25dKTtyZXR1cm4gdH0sZW50cmllczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKSIkIj09PW5bMF0mJnQucHVzaCh7a2V5Om4uc2xpY2UoMSksdmFsdWU6dGhpc1tuXX0pO3JldHVybiB0fSxzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9MDtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiYrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpaWYoIiQiPT09dFswXSlyZXR1cm4hMTtyZXR1cm4hMH0sZWFjaDpmdW5jdGlvbih0KXtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0KHRoaXNbbl0sbi5zbGljZSgxKSx0aGlzKX19O3ZhciBvbz1LaS5wcm90b3R5cGU7ZnVuY3Rpb24gYW8odCxuKXt2YXIgZT1uZXcgaW87aWYodCBpbnN0YW5jZW9mIGlvKXQuZWFjaChmdW5jdGlvbih0KXtlLmFkZCh0KX0pO2Vsc2UgaWYodCl7dmFyIHI9LTEsaT10Lmxlbmd0aDtpZihudWxsPT1uKWZvcig7KytyPGk7KWUuYWRkKHRbcl0pO2Vsc2UgZm9yKDsrK3I8aTspZS5hZGQobih0W3JdLHIsdCkpfXJldHVybiBlfWlvLnByb3RvdHlwZT1hby5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmlvLGhhczpvby5oYXMsYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzWyIkIisodCs9IiIpXT10LHRoaXN9LHJlbW92ZTpvby5yZW1vdmUsY2xlYXI6b28uY2xlYXIsdmFsdWVzOm9vLmtleXMsc2l6ZTpvby5zaXplLGVtcHR5Om9vLmVtcHR5LGVhY2g6b28uZWFjaH07dmFyIHVvPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBmbyh0LG4pe3JldHVybiB0LW59ZnVuY3Rpb24gY28odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIHNvKHQsbil7Zm9yKHZhciBlLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspaWYoZT1sbyh0LG5bcl0pKXJldHVybiBlO3JldHVybiAwfWZ1bmN0aW9uIGxvKHQsbil7Zm9yKHZhciBlPW5bMF0scj1uWzFdLGk9LTEsbz0wLGE9dC5sZW5ndGgsdT1hLTE7bzxhO3U9bysrKXt2YXIgZj10W29dLGM9ZlswXSxzPWZbMV0sbD10W3VdLGg9bFswXSxkPWxbMV07aWYoaG8oZixsLG4pKXJldHVybiAwO3M+ciE9ZD5yJiZlPChoLWMpKihyLXMpLyhkLXMpK2MmJihpPS1pKX1yZXR1cm4gaX1mdW5jdGlvbiBobyh0LG4sZSl7dmFyIHIsaSxvLGE7cmV0dXJuIGZ1bmN0aW9uKHQsbixlKXtyZXR1cm4oblswXS10WzBdKSooZVsxXS10WzFdKT09KGVbMF0tdFswXSkqKG5bMV0tdFsxXSl9KHQsbixlKSYmKGk9dFtyPSsodFswXT09PW5bMF0pXSxvPWVbcl0sYT1uW3JdLGk8PW8mJm88PWF8fGE8PW8mJm88PWkpfWZ1bmN0aW9uIHBvKCl7fXZhciB2bz1bW10sW1tbMSwxLjVdLFsuNSwxXV1dLFtbWzEuNSwxXSxbMSwxLjVdXV0sW1tbMS41LDFdLFsuNSwxXV1dLFtbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLDEuNV0sWy41LDFdXSxbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLC41XSxbMSwxLjVdXV0sW1tbMSwuNV0sWy41LDFdXV0sW1tbLjUsMV0sWzEsLjVdXV0sW1tbMSwxLjVdLFsxLC41XV1dLFtbWy41LDFdLFsxLC41XV0sW1sxLjUsMV0sWzEsMS41XV1dLFtbWzEuNSwxXSxbMSwuNV1dXSxbW1suNSwxXSxbMS41LDFdXV0sW1tbMSwxLjVdLFsxLjUsMV1dXSxbW1suNSwxXSxbMSwxLjVdXV0sW11dO2Z1bmN0aW9uIGdvKCl7dmFyIHQ9MSxuPTEsZT1NLHI9dTtmdW5jdGlvbiBpKHQpe3ZhciBuPWUodCk7aWYoQXJyYXkuaXNBcnJheShuKSluPW4uc2xpY2UoKS5zb3J0KGZvKTtlbHNle3ZhciByPXModCksaT1yWzBdLGE9clsxXTtuPXcoaSxhLG4pLG49ZyhNYXRoLmZsb29yKGkvbikqbixNYXRoLmZsb29yKGEvbikqbixuKX1yZXR1cm4gbi5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG8odCxuKX0pfWZ1bmN0aW9uIG8oZSxpKXt2YXIgbz1bXSx1PVtdO3JldHVybiBmdW5jdGlvbihlLHIsaSl7dmFyIG8sdSxmLGMscyxsLGg9bmV3IEFycmF5LGQ9bmV3IEFycmF5O289dT0tMSxjPWVbMF0+PXIsdm9bYzw8MV0uZm9yRWFjaChwKTtmb3IoOysrbzx0LTE7KWY9YyxjPWVbbysxXT49cix2b1tmfGM8PDFdLmZvckVhY2gocCk7dm9bYzw8MF0uZm9yRWFjaChwKTtmb3IoOysrdTxuLTE7KXtmb3Iobz0tMSxjPWVbdSp0K3RdPj1yLHM9ZVt1KnRdPj1yLHZvW2M8PDF8czw8Ml0uZm9yRWFjaChwKTsrK288dC0xOylmPWMsYz1lW3UqdCt0K28rMV0+PXIsbD1zLHM9ZVt1KnQrbysxXT49cix2b1tmfGM8PDF8czw8MnxsPDwzXS5mb3JFYWNoKHApO3ZvW2N8czw8M10uZm9yRWFjaChwKX1vPS0xLHM9ZVt1KnRdPj1yLHZvW3M8PDJdLmZvckVhY2gocCk7Zm9yKDsrK288dC0xOylsPXMscz1lW3UqdCtvKzFdPj1yLHZvW3M8PDJ8bDw8M10uZm9yRWFjaChwKTtmdW5jdGlvbiBwKHQpe3ZhciBuLGUscj1bdFswXVswXStvLHRbMF1bMV0rdV0sZj1bdFsxXVswXStvLHRbMV1bMV0rdV0sYz1hKHIpLHM9YShmKTsobj1kW2NdKT8oZT1oW3NdKT8oZGVsZXRlIGRbbi5lbmRdLGRlbGV0ZSBoW2Uuc3RhcnRdLG49PT1lPyhuLnJpbmcucHVzaChmKSxpKG4ucmluZykpOmhbbi5zdGFydF09ZFtlLmVuZF09e3N0YXJ0Om4uc3RhcnQsZW5kOmUuZW5kLHJpbmc6bi5yaW5nLmNvbmNhdChlLnJpbmcpfSk6KGRlbGV0ZSBkW24uZW5kXSxuLnJpbmcucHVzaChmKSxkW24uZW5kPXNdPW4pOihuPWhbc10pPyhlPWRbY10pPyhkZWxldGUgaFtuLnN0YXJ0XSxkZWxldGUgZFtlLmVuZF0sbj09PWU/KG4ucmluZy5wdXNoKGYpLGkobi5yaW5nKSk6aFtlLnN0YXJ0XT1kW24uZW5kXT17c3RhcnQ6ZS5zdGFydCxlbmQ6bi5lbmQscmluZzplLnJpbmcuY29uY2F0KG4ucmluZyl9KTooZGVsZXRlIGhbbi5zdGFydF0sbi5yaW5nLnVuc2hpZnQociksaFtuLnN0YXJ0PWNdPW4pOmhbY109ZFtzXT17c3RhcnQ6YyxlbmQ6cyxyaW5nOltyLGZdfX12b1tzPDwzXS5mb3JFYWNoKHApfShlLGksZnVuY3Rpb24odCl7cih0LGUsaSksZnVuY3Rpb24odCl7Zm9yKHZhciBuPTAsZT10Lmxlbmd0aCxyPXRbZS0xXVsxXSp0WzBdWzBdLXRbZS0xXVswXSp0WzBdWzFdOysrbjxlOylyKz10W24tMV1bMV0qdFtuXVswXS10W24tMV1bMF0qdFtuXVsxXTtyZXR1cm4gcn0odCk+MD9vLnB1c2goW3RdKTp1LnB1c2godCl9KSx1LmZvckVhY2goZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9MCxyPW8ubGVuZ3RoO2U8cjsrK2UpaWYoLTEhPT1zbygobj1vW2VdKVswXSx0KSlyZXR1cm4gdm9pZCBuLnB1c2godCl9KSx7dHlwZToiTXVsdGlQb2x5Z29uIix2YWx1ZTppLGNvb3JkaW5hdGVzOm99fWZ1bmN0aW9uIGEobil7cmV0dXJuIDIqblswXStuWzFdKih0KzEpKjR9ZnVuY3Rpb24gdShlLHIsaSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBvLGE9ZVswXSx1PWVbMV0sZj0wfGEsYz0wfHUscz1yW2MqdCtmXTthPjAmJmE8dCYmZj09PWEmJihvPXJbYyp0K2YtMV0sZVswXT1hKyhpLW8pLyhzLW8pLS41KSx1PjAmJnU8biYmYz09PXUmJihvPXJbKGMtMSkqdCtmXSxlWzFdPXUrKGktbykvKHMtbyktLjUpfSl9cmV0dXJuIGkuY29udG91cj1vLGkuc2l6ZT1mdW5jdGlvbihlKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm5bdCxuXTt2YXIgcj1NYXRoLmNlaWwoZVswXSksbz1NYXRoLmNlaWwoZVsxXSk7aWYoIShyPjAmJm8+MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNpemUiKTtyZXR1cm4gdD1yLG49byxpfSxpLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP2NvKHVvLmNhbGwodCkpOmNvKHQpLGkpOmV9LGkuc21vb3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQ/dTpwbyxpKTpyPT09dX0saX1mdW5jdGlvbiB5byh0LG4sZSl7Zm9yKHZhciByPXQud2lkdGgsaT10LmhlaWdodCxvPTErKGU8PDEpLGE9MDthPGk7KythKWZvcih2YXIgdT0wLGY9MDt1PHIrZTsrK3UpdTxyJiYoZis9dC5kYXRhW3UrYSpyXSksdT49ZSYmKHU+PW8mJihmLT10LmRhdGFbdS1vK2Eqcl0pLG4uZGF0YVt1LWUrYSpyXT1mL01hdGgubWluKHUrMSxyLTErby11LG8pKX1mdW5jdGlvbiBfbyh0LG4sZSl7Zm9yKHZhciByPXQud2lkdGgsaT10LmhlaWdodCxvPTErKGU8PDEpLGE9MDthPHI7KythKWZvcih2YXIgdT0wLGY9MDt1PGkrZTsrK3UpdTxpJiYoZis9dC5kYXRhW2ErdSpyXSksdT49ZSYmKHU+PW8mJihmLT10LmRhdGFbYSsodS1vKSpyXSksbi5kYXRhW2ErKHUtZSkqcl09Zi9NYXRoLm1pbih1KzEsaS0xK28tdSxvKSl9ZnVuY3Rpb24gYm8odCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gbW8odCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24geG8oKXtyZXR1cm4gMX12YXIgd289e30sTW89e30sQW89MzQsVG89MTAsTm89MTM7ZnVuY3Rpb24gU28odCl7cmV0dXJuIG5ldyBGdW5jdGlvbigiZCIsInJldHVybiB7Iit0Lm1hcChmdW5jdGlvbih0LG4pe3JldHVybiBKU09OLnN0cmluZ2lmeSh0KSsiOiBkWyIrbisiXSJ9KS5qb2luKCIsIikrIn0iKX1mdW5jdGlvbiBFbyh0KXt2YXIgbj1uZXcgUmVnRXhwKCdbIicrdCsiXG5ccl0iKSxlPXQuY2hhckNvZGVBdCgwKTtmdW5jdGlvbiByKHQsbil7dmFyIHIsaT1bXSxvPXQubGVuZ3RoLGE9MCx1PTAsZj1vPD0wLGM9ITE7ZnVuY3Rpb24gcygpe2lmKGYpcmV0dXJuIE1vO2lmKGMpcmV0dXJuIGM9ITEsd287dmFyIG4scixpPWE7aWYodC5jaGFyQ29kZUF0KGkpPT09QW8pe2Zvcig7YSsrPG8mJnQuY2hhckNvZGVBdChhKSE9PUFvfHx0LmNoYXJDb2RlQXQoKythKT09PUFvOyk7cmV0dXJuKG49YSk+PW8/Zj0hMDoocj10LmNoYXJDb2RlQXQoYSsrKSk9PT1Ubz9jPSEwOnI9PT1ObyYmKGM9ITAsdC5jaGFyQ29kZUF0KGEpPT09VG8mJisrYSksdC5zbGljZShpKzEsbi0xKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDthPG87KXtpZigocj10LmNoYXJDb2RlQXQobj1hKyspKT09PVRvKWM9ITA7ZWxzZSBpZihyPT09Tm8pYz0hMCx0LmNoYXJDb2RlQXQoYSk9PT1UbyYmKythO2Vsc2UgaWYociE9PWUpY29udGludWU7cmV0dXJuIHQuc2xpY2UoaSxuKX1yZXR1cm4gZj0hMCx0LnNsaWNlKGksbyl9Zm9yKHQuY2hhckNvZGVBdChvLTEpPT09VG8mJi0tbyx0LmNoYXJDb2RlQXQoby0xKT09PU5vJiYtLW87KHI9cygpKSE9PU1vOyl7Zm9yKHZhciBsPVtdO3IhPT13byYmciE9PU1vOylsLnB1c2gocikscj1zKCk7biYmbnVsbD09KGw9bihsLHUrKykpfHxpLnB1c2gobCl9cmV0dXJuIGl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gbi5tYXAobykuam9pbih0KX1mdW5jdGlvbiBvKHQpe3JldHVybiBudWxsPT10PyIiOm4udGVzdCh0Kz0iIik/JyInK3QucmVwbGFjZSgvIi9nLCciIicpKyciJzp0fXJldHVybntwYXJzZTpmdW5jdGlvbih0LG4pe3ZhciBlLGksbz1yKHQsZnVuY3Rpb24odCxyKXtpZihlKXJldHVybiBlKHQsci0xKTtpPXQsZT1uP2Z1bmN0aW9uKHQsbil7dmFyIGU9U28odCk7cmV0dXJuIGZ1bmN0aW9uKHIsaSl7cmV0dXJuIG4oZShyKSxpLHQpfX0odCxuKTpTbyh0KX0pO3JldHVybiBvLmNvbHVtbnM9aXx8W10sb30scGFyc2VSb3dzOnIsZm9ybWF0OmZ1bmN0aW9uKG4sZSl7cmV0dXJuIG51bGw9PWUmJihlPWZ1bmN0aW9uKHQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCksZT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgciBpbiB0KXIgaW4gbnx8ZS5wdXNoKG5bcl09cil9KSxlfShuKSksW2UubWFwKG8pLmpvaW4odCldLmNvbmNhdChuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIG8oblt0XSl9KS5qb2luKHQpfSkpLmpvaW4oIlxuIil9LGZvcm1hdFJvd3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKGkpLmpvaW4oIlxuIil9fX12YXIga289RW8oIiwiKSxDbz1rby5wYXJzZSxQbz1rby5wYXJzZVJvd3Msem89a28uZm9ybWF0LFJvPWtvLmZvcm1hdFJvd3MsTG89RW8oIlx0IiksRG89TG8ucGFyc2UsVW89TG8ucGFyc2VSb3dzLHFvPUxvLmZvcm1hdCxPbz1Mby5mb3JtYXRSb3dzO2Z1bmN0aW9uIFlvKHQpe2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcih0LnN0YXR1cysiICIrdC5zdGF0dXNUZXh0KTtyZXR1cm4gdC5ibG9iKCl9ZnVuY3Rpb24gQm8odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LmFycmF5QnVmZmVyKCl9ZnVuY3Rpb24gRm8odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LnRleHQoKX1mdW5jdGlvbiBJbyh0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oRm8pfWZ1bmN0aW9uIEhvKHQpe3JldHVybiBmdW5jdGlvbihuLGUscil7cmV0dXJuIDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPXZvaWQgMCksSW8obixlKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybiB0KG4scil9KX19dmFyIGpvPUhvKENvKSxYbz1IbyhEbyk7ZnVuY3Rpb24gR28odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0Lmpzb24oKX1mdW5jdGlvbiBWbyh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXtyZXR1cm4gSW8obixlKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybihuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcobix0KX0pfX12YXIgJG89Vm8oImFwcGxpY2F0aW9uL3htbCIpLFdvPVZvKCJ0ZXh0L2h0bWwiKSxabz1WbygiaW1hZ2Uvc3ZnK3htbCIpO2Z1bmN0aW9uIFFvKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBKbygpe3JldHVybiAxZS02KihNYXRoLnJhbmRvbSgpLS41KX1mdW5jdGlvbiBLbyh0LG4sZSxyKXtpZihpc05hTihuKXx8aXNOYU4oZSkpcmV0dXJuIHQ7dmFyIGksbyxhLHUsZixjLHMsbCxoLGQ9dC5fcm9vdCxwPXtkYXRhOnJ9LHY9dC5feDAsZz10Ll95MCx5PXQuX3gxLF89dC5feTE7aWYoIWQpcmV0dXJuIHQuX3Jvb3Q9cCx0O2Zvcig7ZC5sZW5ndGg7KWlmKChjPW4+PShvPSh2K3kpLzIpKT92PW86eT1vLChzPWU+PShhPShnK18pLzIpKT9nPWE6Xz1hLGk9ZCwhKGQ9ZFtsPXM8PDF8Y10pKXJldHVybiBpW2xdPXAsdDtpZih1PSt0Ll94LmNhbGwobnVsbCxkLmRhdGEpLGY9K3QuX3kuY2FsbChudWxsLGQuZGF0YSksbj09PXUmJmU9PT1mKXJldHVybiBwLm5leHQ9ZCxpP2lbbF09cDp0Ll9yb290PXAsdDtkb3tpPWk/aVtsXT1uZXcgQXJyYXkoNCk6dC5fcm9vdD1uZXcgQXJyYXkoNCksKGM9bj49KG89KHYreSkvMikpP3Y9bzp5PW8sKHM9ZT49KGE9KGcrXykvMikpP2c9YTpfPWF9d2hpbGUoKGw9czw8MXxjKT09KGg9KGY+PWEpPDwxfHU+PW8pKTtyZXR1cm4gaVtoXT1kLGlbbF09cCx0fWZ1bmN0aW9uIHRhKHQsbixlLHIsaSl7dGhpcy5ub2RlPXQsdGhpcy54MD1uLHRoaXMueTA9ZSx0aGlzLngxPXIsdGhpcy55MT1pfWZ1bmN0aW9uIG5hKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIGVhKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIHJhKHQsbixlKXt2YXIgcj1uZXcgaWEobnVsbD09bj9uYTpuLG51bGw9PWU/ZWE6ZSxOYU4sTmFOLE5hTixOYU4pO3JldHVybiBudWxsPT10P3I6ci5hZGRBbGwodCl9ZnVuY3Rpb24gaWEodCxuLGUscixpLG8pe3RoaXMuX3g9dCx0aGlzLl95PW4sdGhpcy5feDA9ZSx0aGlzLl95MD1yLHRoaXMuX3gxPWksdGhpcy5feTE9byx0aGlzLl9yb290PXZvaWQgMH1mdW5jdGlvbiBvYSh0KXtmb3IodmFyIG49e2RhdGE6dC5kYXRhfSxlPW47dD10Lm5leHQ7KWU9ZS5uZXh0PXtkYXRhOnQuZGF0YX07cmV0dXJuIG59dmFyIGFhPXJhLnByb3RvdHlwZT1pYS5wcm90b3R5cGU7ZnVuY3Rpb24gdWEodCl7cmV0dXJuIHQueCt0LnZ4fWZ1bmN0aW9uIGZhKHQpe3JldHVybiB0LnkrdC52eX1mdW5jdGlvbiBjYSh0KXtyZXR1cm4gdC5pbmRleH1mdW5jdGlvbiBzYSh0LG4pe3ZhciBlPXQuZ2V0KG4pO2lmKCFlKXRocm93IG5ldyBFcnJvcigibWlzc2luZzogIituKTtyZXR1cm4gZX1mdW5jdGlvbiBsYSh0KXtyZXR1cm4gdC54fWZ1bmN0aW9uIGhhKHQpe3JldHVybiB0Lnl9YWEuY29weT1mdW5jdGlvbigpe3ZhciB0LG4sZT1uZXcgaWEodGhpcy5feCx0aGlzLl95LHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSxyPXRoaXMuX3Jvb3Q7aWYoIXIpcmV0dXJuIGU7aWYoIXIubGVuZ3RoKXJldHVybiBlLl9yb290PW9hKHIpLGU7Zm9yKHQ9W3tzb3VyY2U6cix0YXJnZXQ6ZS5fcm9vdD1uZXcgQXJyYXkoNCl9XTtyPXQucG9wKCk7KWZvcih2YXIgaT0wO2k8NDsrK2kpKG49ci5zb3VyY2VbaV0pJiYobi5sZW5ndGg/dC5wdXNoKHtzb3VyY2U6bix0YXJnZXQ6ci50YXJnZXRbaV09bmV3IEFycmF5KDQpfSk6ci50YXJnZXRbaV09b2EobikpO3JldHVybiBlfSxhYS5hZGQ9ZnVuY3Rpb24odCl7dmFyIG49K3RoaXMuX3guY2FsbChudWxsLHQpLGU9K3RoaXMuX3kuY2FsbChudWxsLHQpO3JldHVybiBLbyh0aGlzLmNvdmVyKG4sZSksbixlLHQpfSxhYS5hZGRBbGw9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbz10Lmxlbmd0aCxhPW5ldyBBcnJheShvKSx1PW5ldyBBcnJheShvKSxmPTEvMCxjPTEvMCxzPS0xLzAsbD0tMS8wO2ZvcihlPTA7ZTxvOysrZSlpc05hTihyPSt0aGlzLl94LmNhbGwobnVsbCxuPXRbZV0pKXx8aXNOYU4oaT0rdGhpcy5feS5jYWxsKG51bGwsbikpfHwoYVtlXT1yLHVbZV09aSxyPGYmJihmPXIpLHI+cyYmKHM9ciksaTxjJiYoYz1pKSxpPmwmJihsPWkpKTtmb3IoczxmJiYoZj10aGlzLl94MCxzPXRoaXMuX3gxKSxsPGMmJihjPXRoaXMuX3kwLGw9dGhpcy5feTEpLHRoaXMuY292ZXIoZixjKS5jb3ZlcihzLGwpLGU9MDtlPG87KytlKUtvKHRoaXMsYVtlXSx1W2VdLHRbZV0pO3JldHVybiB0aGlzfSxhYS5jb3Zlcj1mdW5jdGlvbih0LG4pe2lmKGlzTmFOKHQ9K3QpfHxpc05hTihuPStuKSlyZXR1cm4gdGhpczt2YXIgZT10aGlzLl94MCxyPXRoaXMuX3kwLGk9dGhpcy5feDEsbz10aGlzLl95MTtpZihpc05hTihlKSlpPShlPU1hdGguZmxvb3IodCkpKzEsbz0ocj1NYXRoLmZsb29yKG4pKSsxO2Vsc2V7aWYoIShlPnR8fHQ+aXx8cj5ufHxuPm8pKXJldHVybiB0aGlzO3ZhciBhLHUsZj1pLWUsYz10aGlzLl9yb290O3N3aXRjaCh1PShuPChyK28pLzIpPDwxfHQ8KGUraSkvMil7Y2FzZSAwOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUobz1yKyhmKj0yKSx0PihpPWUrZil8fG4+byk7YnJlYWs7Y2FzZSAxOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUobz1yKyhmKj0yKSwoZT1pLWYpPnR8fG4+byk7YnJlYWs7Y2FzZSAyOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUocj1vLShmKj0yKSx0PihpPWUrZil8fHI+bik7YnJlYWs7Y2FzZSAzOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUocj1vLShmKj0yKSwoZT1pLWYpPnR8fHI+bil9dGhpcy5fcm9vdCYmdGhpcy5fcm9vdC5sZW5ndGgmJih0aGlzLl9yb290PWMpfXJldHVybiB0aGlzLl94MD1lLHRoaXMuX3kwPXIsdGhpcy5feDE9aSx0aGlzLl95MT1vLHRoaXN9LGFhLmRhdGE9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy52aXNpdChmdW5jdGlvbihuKXtpZighbi5sZW5ndGgpZG97dC5wdXNoKG4uZGF0YSl9d2hpbGUobj1uLm5leHQpfSksdH0sYWEuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuY292ZXIoK3RbMF1bMF0sK3RbMF1bMV0pLmNvdmVyKCt0WzFdWzBdLCt0WzFdWzFdKTppc05hTih0aGlzLl94MCk/dm9pZCAwOltbdGhpcy5feDAsdGhpcy5feTBdLFt0aGlzLl94MSx0aGlzLl95MV1dfSxhYS5maW5kPWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG8sYSx1LGYsYyxzPXRoaXMuX3gwLGw9dGhpcy5feTAsaD10aGlzLl94MSxkPXRoaXMuX3kxLHA9W10sdj10aGlzLl9yb290O2Zvcih2JiZwLnB1c2gobmV3IHRhKHYscyxsLGgsZCkpLG51bGw9PWU/ZT0xLzA6KHM9dC1lLGw9bi1lLGg9dCtlLGQ9bitlLGUqPWUpO2Y9cC5wb3AoKTspaWYoISghKHY9Zi5ub2RlKXx8KGk9Zi54MCk+aHx8KG89Zi55MCk+ZHx8KGE9Zi54MSk8c3x8KHU9Zi55MSk8bCkpaWYodi5sZW5ndGgpe3ZhciBnPShpK2EpLzIseT0obyt1KS8yO3AucHVzaChuZXcgdGEodlszXSxnLHksYSx1KSxuZXcgdGEodlsyXSxpLHksZyx1KSxuZXcgdGEodlsxXSxnLG8sYSx5KSxuZXcgdGEodlswXSxpLG8sZyx5KSksKGM9KG4+PXkpPDwxfHQ+PWcpJiYoZj1wW3AubGVuZ3RoLTFdLHBbcC5sZW5ndGgtMV09cFtwLmxlbmd0aC0xLWNdLHBbcC5sZW5ndGgtMS1jXT1mKX1lbHNle3ZhciBfPXQtK3RoaXMuX3guY2FsbChudWxsLHYuZGF0YSksYj1uLSt0aGlzLl95LmNhbGwobnVsbCx2LmRhdGEpLG09XypfK2IqYjtpZihtPGUpe3ZhciB4PU1hdGguc3FydChlPW0pO3M9dC14LGw9bi14LGg9dCt4LGQ9bit4LHI9di5kYXRhfX1yZXR1cm4gcn0sYWEucmVtb3ZlPWZ1bmN0aW9uKHQpe2lmKGlzTmFOKG89K3RoaXMuX3guY2FsbChudWxsLHQpKXx8aXNOYU4oYT0rdGhpcy5feS5jYWxsKG51bGwsdCkpKXJldHVybiB0aGlzO3ZhciBuLGUscixpLG8sYSx1LGYsYyxzLGwsaCxkPXRoaXMuX3Jvb3QscD10aGlzLl94MCx2PXRoaXMuX3kwLGc9dGhpcy5feDEseT10aGlzLl95MTtpZighZClyZXR1cm4gdGhpcztpZihkLmxlbmd0aClmb3IoOzspe2lmKChjPW8+PSh1PShwK2cpLzIpKT9wPXU6Zz11LChzPWE+PShmPSh2K3kpLzIpKT92PWY6eT1mLG49ZCwhKGQ9ZFtsPXM8PDF8Y10pKXJldHVybiB0aGlzO2lmKCFkLmxlbmd0aClicmVhazsobltsKzEmM118fG5bbCsyJjNdfHxuW2wrMyYzXSkmJihlPW4saD1sKX1mb3IoO2QuZGF0YSE9PXQ7KWlmKHI9ZCwhKGQ9ZC5uZXh0KSlyZXR1cm4gdGhpcztyZXR1cm4oaT1kLm5leHQpJiZkZWxldGUgZC5uZXh0LHI/KGk/ci5uZXh0PWk6ZGVsZXRlIHIubmV4dCx0aGlzKTpuPyhpP25bbF09aTpkZWxldGUgbltsXSwoZD1uWzBdfHxuWzFdfHxuWzJdfHxuWzNdKSYmZD09PShuWzNdfHxuWzJdfHxuWzFdfHxuWzBdKSYmIWQubGVuZ3RoJiYoZT9lW2hdPWQ6dGhpcy5fcm9vdD1kKSx0aGlzKToodGhpcy5fcm9vdD1pLHRoaXMpfSxhYS5yZW1vdmVBbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBuPTAsZT10Lmxlbmd0aDtuPGU7KytuKXRoaXMucmVtb3ZlKHRbbl0pO3JldHVybiB0aGlzfSxhYS5yb290PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jvb3R9LGFhLnNpemU9ZnVuY3Rpb24oKXt2YXIgdD0wO3JldHVybiB0aGlzLnZpc2l0KGZ1bmN0aW9uKG4pe2lmKCFuLmxlbmd0aClkb3srK3R9d2hpbGUobj1uLm5leHQpfSksdH0sYWEudmlzaXQ9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbyxhLHU9W10sZj10aGlzLl9yb290O2ZvcihmJiZ1LnB1c2gobmV3IHRhKGYsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtuPXUucG9wKCk7KWlmKCF0KGY9bi5ub2RlLHI9bi54MCxpPW4ueTAsbz1uLngxLGE9bi55MSkmJmYubGVuZ3RoKXt2YXIgYz0ocitvKS8yLHM9KGkrYSkvMjsoZT1mWzNdKSYmdS5wdXNoKG5ldyB0YShlLGMscyxvLGEpKSwoZT1mWzJdKSYmdS5wdXNoKG5ldyB0YShlLHIscyxjLGEpKSwoZT1mWzFdKSYmdS5wdXNoKG5ldyB0YShlLGMsaSxvLHMpKSwoZT1mWzBdKSYmdS5wdXNoKG5ldyB0YShlLHIsaSxjLHMpKX1yZXR1cm4gdGhpc30sYWEudmlzaXRBZnRlcj1mdW5jdGlvbih0KXt2YXIgbixlPVtdLHI9W107Zm9yKHRoaXMuX3Jvb3QmJmUucHVzaChuZXcgdGEodGhpcy5fcm9vdCx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkpO249ZS5wb3AoKTspe3ZhciBpPW4ubm9kZTtpZihpLmxlbmd0aCl7dmFyIG8sYT1uLngwLHU9bi55MCxmPW4ueDEsYz1uLnkxLHM9KGErZikvMixsPSh1K2MpLzI7KG89aVswXSkmJmUucHVzaChuZXcgdGEobyxhLHUscyxsKSksKG89aVsxXSkmJmUucHVzaChuZXcgdGEobyxzLHUsZixsKSksKG89aVsyXSkmJmUucHVzaChuZXcgdGEobyxhLGwscyxjKSksKG89aVszXSkmJmUucHVzaChuZXcgdGEobyxzLGwsZixjKSl9ci5wdXNoKG4pfWZvcig7bj1yLnBvcCgpOyl0KG4ubm9kZSxuLngwLG4ueTAsbi54MSxuLnkxKTtyZXR1cm4gdGhpc30sYWEueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5feD10LHRoaXMpOnRoaXMuX3h9LGFhLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3k9dCx0aGlzKTp0aGlzLl95fTt2YXIgZGE9MTAscGE9TWF0aC5QSSooMy1NYXRoLnNxcnQoNSkpO2Z1bmN0aW9uIHZhKHQsbil7aWYoKGU9KHQ9bj90LnRvRXhwb25lbnRpYWwobi0xKTp0LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKTwwKXJldHVybiBudWxsO3ZhciBlLHI9dC5zbGljZSgwLGUpO3JldHVybltyLmxlbmd0aD4xP3JbMF0rci5zbGljZSgyKTpyLCt0LnNsaWNlKGUrMSldfWZ1bmN0aW9uIGdhKHQpe3JldHVybih0PXZhKE1hdGguYWJzKHQpKSk/dFsxXTpOYU59dmFyIHlhLF9hPS9eKD86KC4pPyhbPD49Xl0pKT8oWytcLSggXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuXGQrKT8ofik/KFthLXolXSk/JC9pO2Z1bmN0aW9uIGJhKHQpe3JldHVybiBuZXcgbWEodCl9ZnVuY3Rpb24gbWEodCl7aWYoIShuPV9hLmV4ZWModCkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIrdCk7dmFyIG47dGhpcy5maWxsPW5bMV18fCIgIix0aGlzLmFsaWduPW5bMl18fCI+Iix0aGlzLnNpZ249blszXXx8Ii0iLHRoaXMuc3ltYm9sPW5bNF18fCIiLHRoaXMuemVybz0hIW5bNV0sdGhpcy53aWR0aD1uWzZdJiYrbls2XSx0aGlzLmNvbW1hPSEhbls3XSx0aGlzLnByZWNpc2lvbj1uWzhdJiYrbls4XS5zbGljZSgxKSx0aGlzLnRyaW09ISFuWzldLHRoaXMudHlwZT1uWzEwXXx8IiJ9ZnVuY3Rpb24geGEodCxuKXt2YXIgZT12YSh0LG4pO2lmKCFlKXJldHVybiB0KyIiO3ZhciByPWVbMF0saT1lWzFdO3JldHVybiBpPDA/IjAuIituZXcgQXJyYXkoLWkpLmpvaW4oIjAiKStyOnIubGVuZ3RoPmkrMT9yLnNsaWNlKDAsaSsxKSsiLiIrci5zbGljZShpKzEpOnIrbmV3IEFycmF5KGktci5sZW5ndGgrMikuam9pbigiMCIpfWJhLnByb3RvdHlwZT1tYS5wcm90b3R5cGUsbWEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbCt0aGlzLmFsaWduK3RoaXMuc2lnbit0aGlzLnN5bWJvbCsodGhpcy56ZXJvPyIwIjoiIikrKG51bGw9PXRoaXMud2lkdGg/IiI6TWF0aC5tYXgoMSwwfHRoaXMud2lkdGgpKSsodGhpcy5jb21tYT8iLCI6IiIpKyhudWxsPT10aGlzLnByZWNpc2lvbj8iIjoiLiIrTWF0aC5tYXgoMCwwfHRoaXMucHJlY2lzaW9uKSkrKHRoaXMudHJpbT8ifiI6IiIpK3RoaXMudHlwZX07dmFyIHdhPXsiJSI6ZnVuY3Rpb24odCxuKXtyZXR1cm4oMTAwKnQpLnRvRml4ZWQobil9LGI6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMil9LGM6ZnVuY3Rpb24odCl7cmV0dXJuIHQrIiJ9LGQ6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTApfSxlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQudG9FeHBvbmVudGlhbChuKX0sZjpmdW5jdGlvbih0LG4pe3JldHVybiB0LnRvRml4ZWQobil9LGc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdC50b1ByZWNpc2lvbihuKX0sbzpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZyg4KX0scDpmdW5jdGlvbih0LG4pe3JldHVybiB4YSgxMDAqdCxuKX0scjp4YSxzOmZ1bmN0aW9uKHQsbil7dmFyIGU9dmEodCxuKTtpZighZSlyZXR1cm4gdCsiIjt2YXIgcj1lWzBdLGk9ZVsxXSxvPWktKHlhPTMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKGkvMykpKSkrMSxhPXIubGVuZ3RoO3JldHVybiBvPT09YT9yOm8+YT9yK25ldyBBcnJheShvLWErMSkuam9pbigiMCIpOm8+MD9yLnNsaWNlKDAsbykrIi4iK3Iuc2xpY2Uobyk6IjAuIituZXcgQXJyYXkoMS1vKS5qb2luKCIwIikrdmEodCxNYXRoLm1heCgwLG4rby0xKSlbMF19LFg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LHg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpfX07ZnVuY3Rpb24gTWEodCl7cmV0dXJuIHR9dmFyIEFhLFRhPVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTtmdW5jdGlvbiBOYSh0KXt2YXIgbixlLHI9dC5ncm91cGluZyYmdC50aG91c2FuZHM/KG49dC5ncm91cGluZyxlPXQudGhvdXNhbmRzLGZ1bmN0aW9uKHQscil7Zm9yKHZhciBpPXQubGVuZ3RoLG89W10sYT0wLHU9blswXSxmPTA7aT4wJiZ1PjAmJihmK3UrMT5yJiYodT1NYXRoLm1heCgxLHItZikpLG8ucHVzaCh0LnN1YnN0cmluZyhpLT11LGkrdSkpLCEoKGYrPXUrMSk+cikpOyl1PW5bYT0oYSsxKSVuLmxlbmd0aF07cmV0dXJuIG8ucmV2ZXJzZSgpLmpvaW4oZSl9KTpNYSxpPXQuY3VycmVuY3ksbz10LmRlY2ltYWwsYT10Lm51bWVyYWxzP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXBsYWNlKC9bMC05XS9nLGZ1bmN0aW9uKG4pe3JldHVybiB0WytuXX0pfX0odC5udW1lcmFscyk6TWEsdT10LnBlcmNlbnR8fCIlIjtmdW5jdGlvbiBmKHQpe3ZhciBuPSh0PWJhKHQpKS5maWxsLGU9dC5hbGlnbixmPXQuc2lnbixjPXQuc3ltYm9sLHM9dC56ZXJvLGw9dC53aWR0aCxoPXQuY29tbWEsZD10LnByZWNpc2lvbixwPXQudHJpbSx2PXQudHlwZTsibiI9PT12PyhoPSEwLHY9ImciKTp3YVt2XXx8KG51bGw9PWQmJihkPTEyKSxwPSEwLHY9ImciKSwoc3x8IjAiPT09biYmIj0iPT09ZSkmJihzPSEwLG49IjAiLGU9Ij0iKTt2YXIgZz0iJCI9PT1jP2lbMF06IiMiPT09YyYmL1tib3hYXS8udGVzdCh2KT8iMCIrdi50b0xvd2VyQ2FzZSgpOiIiLHk9IiQiPT09Yz9pWzFdOi9bJXBdLy50ZXN0KHYpP3U6IiIsXz13YVt2XSxiPS9bZGVmZ3BycyVdLy50ZXN0KHYpO2Z1bmN0aW9uIG0odCl7dmFyIGksdSxjLG09Zyx4PXk7aWYoImMiPT09dil4PV8odCkreCx0PSIiO2Vsc2V7dmFyIHc9KHQ9K3QpPDA7aWYodD1fKE1hdGguYWJzKHQpLGQpLHAmJih0PWZ1bmN0aW9uKHQpe3Q6Zm9yKHZhciBuLGU9dC5sZW5ndGgscj0xLGk9LTE7cjxlOysrcilzd2l0Y2godFtyXSl7Y2FzZSIuIjppPW49cjticmVhaztjYXNlIjAiOjA9PT1pJiYoaT1yKSxuPXI7YnJlYWs7ZGVmYXVsdDppZihpPjApe2lmKCErdFtyXSlicmVhayB0O2k9MH19cmV0dXJuIGk+MD90LnNsaWNlKDAsaSkrdC5zbGljZShuKzEpOnR9KHQpKSx3JiYwPT0rdCYmKHc9ITEpLG09KHc/IigiPT09Zj9mOiItIjoiLSI9PT1mfHwiKCI9PT1mPyIiOmYpK20seD0oInMiPT09dj9UYVs4K3lhLzNdOiIiKSt4Kyh3JiYiKCI9PT1mPyIpIjoiIiksYilmb3IoaT0tMSx1PXQubGVuZ3RoOysraTx1OylpZig0OD4oYz10LmNoYXJDb2RlQXQoaSkpfHxjPjU3KXt4PSg0Nj09PWM/byt0LnNsaWNlKGkrMSk6dC5zbGljZShpKSkreCx0PXQuc2xpY2UoMCxpKTticmVha319aCYmIXMmJih0PXIodCwxLzApKTt2YXIgTT1tLmxlbmd0aCt0Lmxlbmd0aCt4Lmxlbmd0aCxBPU08bD9uZXcgQXJyYXkobC1NKzEpLmpvaW4obik6IiI7c3dpdGNoKGgmJnMmJih0PXIoQSt0LEEubGVuZ3RoP2wteC5sZW5ndGg6MS8wKSxBPSIiKSxlKXtjYXNlIjwiOnQ9bSt0K3grQTticmVhaztjYXNlIj0iOnQ9bStBK3QreDticmVhaztjYXNlIl4iOnQ9QS5zbGljZSgwLE09QS5sZW5ndGg+PjEpK20rdCt4K0Euc2xpY2UoTSk7YnJlYWs7ZGVmYXVsdDp0PUErbSt0K3h9cmV0dXJuIGEodCl9cmV0dXJuIGQ9bnVsbD09ZD82Oi9bZ3Byc10vLnRlc3Qodik/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxkKSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxkKSksbS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0KyIifSxtfXJldHVybntmb3JtYXQ6Zixmb3JtYXRQcmVmaXg6ZnVuY3Rpb24odCxuKXt2YXIgZT1mKCgodD1iYSh0KSkudHlwZT0iZiIsdCkpLHI9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoZ2EobikvMykpKSxpPU1hdGgucG93KDEwLC1yKSxvPVRhWzgrci8zXTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUoaSp0KStvfX19fWZ1bmN0aW9uIFNhKG4pe3JldHVybiBBYT1OYShuKSx0LmZvcm1hdD1BYS5mb3JtYXQsdC5mb3JtYXRQcmVmaXg9QWEuZm9ybWF0UHJlZml4LEFhfWZ1bmN0aW9uIEVhKHQpe3JldHVybiBNYXRoLm1heCgwLC1nYShNYXRoLmFicyh0KSkpfWZ1bmN0aW9uIGthKHQsbil7cmV0dXJuIE1hdGgubWF4KDAsMypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoZ2EobikvMykpKS1nYShNYXRoLmFicyh0KSkpfWZ1bmN0aW9uIENhKHQsbil7cmV0dXJuIHQ9TWF0aC5hYnModCksbj1NYXRoLmFicyhuKS10LE1hdGgubWF4KDAsZ2EobiktZ2EodCkpKzF9ZnVuY3Rpb24gUGEoKXtyZXR1cm4gbmV3IHphfWZ1bmN0aW9uIHphKCl7dGhpcy5yZXNldCgpfVNhKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXX0pLHphLnByb3RvdHlwZT17Y29uc3RydWN0b3I6emEscmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LGFkZDpmdW5jdGlvbih0KXtMYShSYSx0LHRoaXMudCksTGEodGhpcyxSYS5zLHRoaXMucyksdGhpcy5zP3RoaXMudCs9UmEudDp0aGlzLnM9UmEudH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN9fTt2YXIgUmE9bmV3IHphO2Z1bmN0aW9uIExhKHQsbixlKXt2YXIgcj10LnM9bitlLGk9ci1uLG89ci1pO3QudD1uLW8rKGUtaSl9dmFyIERhPTFlLTYsVWE9MWUtMTIscWE9TWF0aC5QSSxPYT1xYS8yLFlhPXFhLzQsQmE9MipxYSxGYT0xODAvcWEsSWE9cWEvMTgwLEhhPU1hdGguYWJzLGphPU1hdGguYXRhbixYYT1NYXRoLmF0YW4yLEdhPU1hdGguY29zLFZhPU1hdGguY2VpbCwkYT1NYXRoLmV4cCxXYT1NYXRoLmxvZyxaYT1NYXRoLnBvdyxRYT1NYXRoLnNpbixKYT1NYXRoLnNpZ258fGZ1bmN0aW9uKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH0sS2E9TWF0aC5zcXJ0LHR1PU1hdGgudGFuO2Z1bmN0aW9uIG51KHQpe3JldHVybiB0PjE/MDp0PC0xP3FhOk1hdGguYWNvcyh0KX1mdW5jdGlvbiBldSh0KXtyZXR1cm4gdD4xP09hOnQ8LTE/LU9hOk1hdGguYXNpbih0KX1mdW5jdGlvbiBydSh0KXtyZXR1cm4odD1RYSh0LzIpKSp0fWZ1bmN0aW9uIGl1KCl7fWZ1bmN0aW9uIG91KHQsbil7dCYmdXUuaGFzT3duUHJvcGVydHkodC50eXBlKSYmdXVbdC50eXBlXSh0LG4pfXZhciBhdT17RmVhdHVyZTpmdW5jdGlvbih0LG4pe291KHQuZ2VvbWV0cnksbil9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZmVhdHVyZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylvdShlW3JdLmdlb21ldHJ5LG4pfX0sdXU9e1NwaGVyZTpmdW5jdGlvbih0LG4pe24uc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKHQsbil7dD10LmNvb3JkaW5hdGVzLG4ucG9pbnQodFswXSx0WzFdLHRbMl0pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyl0PWVbcl0sbi5wb2ludCh0WzBdLHRbMV0sdFsyXSl9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtmdSh0LmNvb3JkaW5hdGVzLG4sMCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspZnUoZVtyXSxuLDApfSxQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Y3UodC5jb29yZGluYXRlcyxuKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyljdShlW3JdLG4pfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5nZW9tZXRyaWVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspb3UoZVtyXSxuKX19O2Z1bmN0aW9uIGZ1KHQsbixlKXt2YXIgcixpPS0xLG89dC5sZW5ndGgtZTtmb3Iobi5saW5lU3RhcnQoKTsrK2k8bzspcj10W2ldLG4ucG9pbnQoclswXSxyWzFdLHJbMl0pO24ubGluZUVuZCgpfWZ1bmN0aW9uIGN1KHQsbil7dmFyIGU9LTEscj10Lmxlbmd0aDtmb3Iobi5wb2x5Z29uU3RhcnQoKTsrK2U8cjspZnUodFtlXSxuLDEpO24ucG9seWdvbkVuZCgpfWZ1bmN0aW9uIHN1KHQsbil7dCYmYXUuaGFzT3duUHJvcGVydHkodC50eXBlKT9hdVt0LnR5cGVdKHQsbik6b3UodCxuKX12YXIgbHUsaHUsZHUscHUsdnUsZ3U9UGEoKSx5dT1QYSgpLF91PXtwb2ludDppdSxsaW5lU3RhcnQ6aXUsbGluZUVuZDppdSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtndS5yZXNldCgpLF91LmxpbmVTdGFydD1idSxfdS5saW5lRW5kPW11fSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9K2d1O3l1LmFkZCh0PDA/QmErdDp0KSx0aGlzLmxpbmVTdGFydD10aGlzLmxpbmVFbmQ9dGhpcy5wb2ludD1pdX0sc3BoZXJlOmZ1bmN0aW9uKCl7eXUuYWRkKEJhKX19O2Z1bmN0aW9uIGJ1KCl7X3UucG9pbnQ9eHV9ZnVuY3Rpb24gbXUoKXt3dShsdSxodSl9ZnVuY3Rpb24geHUodCxuKXtfdS5wb2ludD13dSxsdT10LGh1PW4sZHU9dCo9SWEscHU9R2Eobj0obio9SWEpLzIrWWEpLHZ1PVFhKG4pfWZ1bmN0aW9uIHd1KHQsbil7dmFyIGU9KHQqPUlhKS1kdSxyPWU+PTA/MTotMSxpPXIqZSxvPUdhKG49KG4qPUlhKS8yK1lhKSxhPVFhKG4pLHU9dnUqYSxmPXB1Km8rdSpHYShpKSxjPXUqcipRYShpKTtndS5hZGQoWGEoYyxmKSksZHU9dCxwdT1vLHZ1PWF9ZnVuY3Rpb24gTXUodCl7cmV0dXJuW1hhKHRbMV0sdFswXSksZXUodFsyXSldfWZ1bmN0aW9uIEF1KHQpe3ZhciBuPXRbMF0sZT10WzFdLHI9R2EoZSk7cmV0dXJuW3IqR2EobikscipRYShuKSxRYShlKV19ZnVuY3Rpb24gVHUodCxuKXtyZXR1cm4gdFswXSpuWzBdK3RbMV0qblsxXSt0WzJdKm5bMl19ZnVuY3Rpb24gTnUodCxuKXtyZXR1cm5bdFsxXSpuWzJdLXRbMl0qblsxXSx0WzJdKm5bMF0tdFswXSpuWzJdLHRbMF0qblsxXS10WzFdKm5bMF1dfWZ1bmN0aW9uIFN1KHQsbil7dFswXSs9blswXSx0WzFdKz1uWzFdLHRbMl0rPW5bMl19ZnVuY3Rpb24gRXUodCxuKXtyZXR1cm5bdFswXSpuLHRbMV0qbix0WzJdKm5dfWZ1bmN0aW9uIGt1KHQpe3ZhciBuPUthKHRbMF0qdFswXSt0WzFdKnRbMV0rdFsyXSp0WzJdKTt0WzBdLz1uLHRbMV0vPW4sdFsyXS89bn12YXIgQ3UsUHUsenUsUnUsTHUsRHUsVXUscXUsT3UsWXUsQnUsRnUsSXUsSHUsanUsWHUsR3UsVnUsJHUsV3UsWnUsUXUsSnUsS3UsdGYsbmYsZWY9UGEoKSxyZj17cG9pbnQ6b2YsbGluZVN0YXJ0OnVmLGxpbmVFbmQ6ZmYscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7cmYucG9pbnQ9Y2YscmYubGluZVN0YXJ0PXNmLHJmLmxpbmVFbmQ9bGYsZWYucmVzZXQoKSxfdS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe191LnBvbHlnb25FbmQoKSxyZi5wb2ludD1vZixyZi5saW5lU3RhcnQ9dWYscmYubGluZUVuZD1mZixndTwwPyhDdT0tKHp1PTE4MCksUHU9LShSdT05MCkpOmVmPkRhP1J1PTkwOmVmPC1EYSYmKFB1PS05MCksWXVbMF09Q3UsWXVbMV09enV9fTtmdW5jdGlvbiBvZih0LG4pe091LnB1c2goWXU9W0N1PXQsenU9dF0pLG48UHUmJihQdT1uKSxuPlJ1JiYoUnU9bil9ZnVuY3Rpb24gYWYodCxuKXt2YXIgZT1BdShbdCpJYSxuKklhXSk7aWYocXUpe3ZhciByPU51KHF1LGUpLGk9TnUoW3JbMV0sLXJbMF0sMF0scik7a3UoaSksaT1NdShpKTt2YXIgbyxhPXQtTHUsdT1hPjA/MTotMSxmPWlbMF0qRmEqdSxjPUhhKGEpPjE4MDtjXih1Kkx1PGYmJmY8dSp0KT8obz1pWzFdKkZhKT5SdSYmKFJ1PW8pOmNeKHUqTHU8KGY9KGYrMzYwKSUzNjAtMTgwKSYmZjx1KnQpPyhvPS1pWzFdKkZhKTxQdSYmKFB1PW8pOihuPFB1JiYoUHU9biksbj5SdSYmKFJ1PW4pKSxjP3Q8THU/aGYoQ3UsdCk+aGYoQ3UsenUpJiYoenU9dCk6aGYodCx6dSk+aGYoQ3UsenUpJiYoQ3U9dCk6enU+PUN1Pyh0PEN1JiYoQ3U9dCksdD56dSYmKHp1PXQpKTp0Pkx1P2hmKEN1LHQpPmhmKEN1LHp1KSYmKHp1PXQpOmhmKHQsenUpPmhmKEN1LHp1KSYmKEN1PXQpfWVsc2UgT3UucHVzaChZdT1bQ3U9dCx6dT10XSk7bjxQdSYmKFB1PW4pLG4+UnUmJihSdT1uKSxxdT1lLEx1PXR9ZnVuY3Rpb24gdWYoKXtyZi5wb2ludD1hZn1mdW5jdGlvbiBmZigpe1l1WzBdPUN1LFl1WzFdPXp1LHJmLnBvaW50PW9mLHF1PW51bGx9ZnVuY3Rpb24gY2YodCxuKXtpZihxdSl7dmFyIGU9dC1MdTtlZi5hZGQoSGEoZSk+MTgwP2UrKGU+MD8zNjA6LTM2MCk6ZSl9ZWxzZSBEdT10LFV1PW47X3UucG9pbnQodCxuKSxhZih0LG4pfWZ1bmN0aW9uIHNmKCl7X3UubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbGYoKXtjZihEdSxVdSksX3UubGluZUVuZCgpLEhhKGVmKT5EYSYmKEN1PS0oenU9MTgwKSksWXVbMF09Q3UsWXVbMV09enUscXU9bnVsbH1mdW5jdGlvbiBoZih0LG4pe3JldHVybihuLT10KTwwP24rMzYwOm59ZnVuY3Rpb24gZGYodCxuKXtyZXR1cm4gdFswXS1uWzBdfWZ1bmN0aW9uIHBmKHQsbil7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9biYmbjw9dFsxXTpuPHRbMF18fHRbMV08bn12YXIgdmY9e3NwaGVyZTppdSxwb2ludDpnZixsaW5lU3RhcnQ6X2YsbGluZUVuZDp4Zixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt2Zi5saW5lU3RhcnQ9d2YsdmYubGluZUVuZD1NZn0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZmLmxpbmVTdGFydD1fZix2Zi5saW5lRW5kPXhmfX07ZnVuY3Rpb24gZ2YodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSk7eWYoZSpHYSh0KSxlKlFhKHQpLFFhKG4pKX1mdW5jdGlvbiB5Zih0LG4sZSl7SXUrPSh0LUl1KS8rK0J1LEh1Kz0obi1IdSkvQnUsanUrPShlLWp1KS9CdX1mdW5jdGlvbiBfZigpe3ZmLnBvaW50PWJmfWZ1bmN0aW9uIGJmKHQsbil7dCo9SWE7dmFyIGU9R2Eobio9SWEpO0t1PWUqR2EodCksdGY9ZSpRYSh0KSxuZj1RYShuKSx2Zi5wb2ludD1tZix5ZihLdSx0ZixuZil9ZnVuY3Rpb24gbWYodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSkscj1lKkdhKHQpLGk9ZSpRYSh0KSxvPVFhKG4pLGE9WGEoS2EoKGE9dGYqby1uZippKSphKyhhPW5mKnItS3UqbykqYSsoYT1LdSppLXRmKnIpKmEpLEt1KnIrdGYqaStuZipvKTtGdSs9YSxYdSs9YSooS3UrKEt1PXIpKSxHdSs9YSoodGYrKHRmPWkpKSxWdSs9YSoobmYrKG5mPW8pKSx5ZihLdSx0ZixuZil9ZnVuY3Rpb24geGYoKXt2Zi5wb2ludD1nZn1mdW5jdGlvbiB3Zigpe3ZmLnBvaW50PUFmfWZ1bmN0aW9uIE1mKCl7VGYoUXUsSnUpLHZmLnBvaW50PWdmfWZ1bmN0aW9uIEFmKHQsbil7UXU9dCxKdT1uLHQqPUlhLG4qPUlhLHZmLnBvaW50PVRmO3ZhciBlPUdhKG4pO0t1PWUqR2EodCksdGY9ZSpRYSh0KSxuZj1RYShuKSx5ZihLdSx0ZixuZil9ZnVuY3Rpb24gVGYodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSkscj1lKkdhKHQpLGk9ZSpRYSh0KSxvPVFhKG4pLGE9dGYqby1uZippLHU9bmYqci1LdSpvLGY9S3UqaS10ZipyLGM9S2EoYSphK3UqdStmKmYpLHM9ZXUoYyksbD1jJiYtcy9jOyR1Kz1sKmEsV3UrPWwqdSxadSs9bCpmLEZ1Kz1zLFh1Kz1zKihLdSsoS3U9cikpLEd1Kz1zKih0ZisodGY9aSkpLFZ1Kz1zKihuZisobmY9bykpLHlmKEt1LHRmLG5mKX1mdW5jdGlvbiBOZih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gU2YodCxuKXtmdW5jdGlvbiBlKGUscil7cmV0dXJuIGU9dChlLHIpLG4oZVswXSxlWzFdKX1yZXR1cm4gdC5pbnZlcnQmJm4uaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4oZT1uLmludmVydChlLHIpKSYmdC5pbnZlcnQoZVswXSxlWzFdKX0pLGV9ZnVuY3Rpb24gRWYodCxuKXtyZXR1cm5bdD5xYT90LUJhOnQ8LXFhP3QrQmE6dCxuXX1mdW5jdGlvbiBrZih0LG4sZSl7cmV0dXJuKHQlPUJhKT9ufHxlP1NmKFBmKHQpLHpmKG4sZSkpOlBmKHQpOm58fGU/emYobixlKTpFZn1mdW5jdGlvbiBDZih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXtyZXR1cm5bKG4rPXQpPnFhP24tQmE6bjwtcWE/bitCYTpuLGVdfX1mdW5jdGlvbiBQZih0KXt2YXIgbj1DZih0KTtyZXR1cm4gbi5pbnZlcnQ9Q2YoLXQpLG59ZnVuY3Rpb24gemYodCxuKXt2YXIgZT1HYSh0KSxyPVFhKHQpLGk9R2Eobiksbz1RYShuKTtmdW5jdGlvbiBhKHQsbil7dmFyIGE9R2EobiksdT1HYSh0KSphLGY9UWEodCkqYSxjPVFhKG4pLHM9YyplK3UqcjtyZXR1cm5bWGEoZippLXMqbyx1KmUtYypyKSxldShzKmkrZipvKV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGE9R2EobiksdT1HYSh0KSphLGY9UWEodCkqYSxjPVFhKG4pLHM9YyppLWYqbztyZXR1cm5bWGEoZippK2Mqbyx1KmUrcypyKSxldShzKmUtdSpyKV19LGF9ZnVuY3Rpb24gUmYodCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4obj10KG5bMF0qSWEsblsxXSpJYSkpWzBdKj1GYSxuWzFdKj1GYSxufXJldHVybiB0PWtmKHRbMF0qSWEsdFsxXSpJYSx0Lmxlbmd0aD4yP3RbMl0qSWE6MCksbi5pbnZlcnQ9ZnVuY3Rpb24obil7cmV0dXJuKG49dC5pbnZlcnQoblswXSpJYSxuWzFdKklhKSlbMF0qPUZhLG5bMV0qPUZhLG59LG59ZnVuY3Rpb24gTGYodCxuLGUscixpLG8pe2lmKGUpe3ZhciBhPUdhKG4pLHU9UWEobiksZj1yKmU7bnVsbD09aT8oaT1uK3IqQmEsbz1uLWYvMik6KGk9RGYoYSxpKSxvPURmKGEsbyksKHI+MD9pPG86aT5vKSYmKGkrPXIqQmEpKTtmb3IodmFyIGMscz1pO3I+MD9zPm86czxvO3MtPWYpYz1NdShbYSwtdSpHYShzKSwtdSpRYShzKV0pLHQucG9pbnQoY1swXSxjWzFdKX19ZnVuY3Rpb24gRGYodCxuKXsobj1BdShuKSlbMF0tPXQsa3Uobik7dmFyIGU9bnUoLW5bMV0pO3JldHVybigoLW5bMl08MD8tZTplKStCYS1EYSklQmF9ZnVuY3Rpb24gVWYoKXt2YXIgdCxuPVtdO3JldHVybntwb2ludDpmdW5jdGlvbihuLGUpe3QucHVzaChbbixlXSl9LGxpbmVTdGFydDpmdW5jdGlvbigpe24ucHVzaCh0PVtdKX0sbGluZUVuZDppdSxyZWpvaW46ZnVuY3Rpb24oKXtuLmxlbmd0aD4xJiZuLnB1c2gobi5wb3AoKS5jb25jYXQobi5zaGlmdCgpKSl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciBlPW47cmV0dXJuIG49W10sdD1udWxsLGV9fX1mdW5jdGlvbiBxZih0LG4pe3JldHVybiBIYSh0WzBdLW5bMF0pPERhJiZIYSh0WzFdLW5bMV0pPERhfWZ1bmN0aW9uIE9mKHQsbixlLHIpe3RoaXMueD10LHRoaXMuej1uLHRoaXMubz1lLHRoaXMuZT1yLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gWWYodCxuLGUscixpKXt2YXIgbyxhLHU9W10sZj1bXTtpZih0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoISgobj10Lmxlbmd0aC0xKTw9MCkpe3ZhciBuLGUscj10WzBdLGE9dFtuXTtpZihxZihyLGEpKXtmb3IoaS5saW5lU3RhcnQoKSxvPTA7bzxuOysrbylpLnBvaW50KChyPXRbb10pWzBdLHJbMV0pO2kubGluZUVuZCgpfWVsc2UgdS5wdXNoKGU9bmV3IE9mKHIsdCxudWxsLCEwKSksZi5wdXNoKGUubz1uZXcgT2YocixudWxsLGUsITEpKSx1LnB1c2goZT1uZXcgT2YoYSx0LG51bGwsITEpKSxmLnB1c2goZS5vPW5ldyBPZihhLG51bGwsZSwhMCkpfX0pLHUubGVuZ3RoKXtmb3IoZi5zb3J0KG4pLEJmKHUpLEJmKGYpLG89MCxhPWYubGVuZ3RoO288YTsrK28pZltvXS5lPWU9IWU7Zm9yKHZhciBjLHMsbD11WzBdOzspe2Zvcih2YXIgaD1sLGQ9ITA7aC52OylpZigoaD1oLm4pPT09bClyZXR1cm47Yz1oLnosaS5saW5lU3RhcnQoKTtkb3tpZihoLnY9aC5vLnY9ITAsaC5lKXtpZihkKWZvcihvPTAsYT1jLmxlbmd0aDtvPGE7KytvKWkucG9pbnQoKHM9Y1tvXSlbMF0sc1sxXSk7ZWxzZSByKGgueCxoLm4ueCwxLGkpO2g9aC5ufWVsc2V7aWYoZClmb3IoYz1oLnAueixvPWMubGVuZ3RoLTE7bz49MDstLW8paS5wb2ludCgocz1jW29dKVswXSxzWzFdKTtlbHNlIHIoaC54LGgucC54LC0xLGkpO2g9aC5wfWM9KGg9aC5vKS56LGQ9IWR9d2hpbGUoIWgudik7aS5saW5lRW5kKCl9fX1mdW5jdGlvbiBCZih0KXtpZihuPXQubGVuZ3RoKXtmb3IodmFyIG4sZSxyPTAsaT10WzBdOysrcjxuOylpLm49ZT10W3JdLGUucD1pLGk9ZTtpLm49ZT10WzBdLGUucD1pfX1FZi5pbnZlcnQ9RWY7dmFyIEZmPVBhKCk7ZnVuY3Rpb24gSWYodCxuKXt2YXIgZT1uWzBdLHI9blsxXSxpPVFhKHIpLG89W1FhKGUpLC1HYShlKSwwXSxhPTAsdT0wO0ZmLnJlc2V0KCksMT09PWk/cj1PYStEYTotMT09PWkmJihyPS1PYS1EYSk7Zm9yKHZhciBmPTAsYz10Lmxlbmd0aDtmPGM7KytmKWlmKGw9KHM9dFtmXSkubGVuZ3RoKWZvcih2YXIgcyxsLGg9c1tsLTFdLGQ9aFswXSxwPWhbMV0vMitZYSx2PVFhKHApLGc9R2EocCkseT0wO3k8bDsrK3ksZD1iLHY9eCxnPXcsaD1fKXt2YXIgXz1zW3ldLGI9X1swXSxtPV9bMV0vMitZYSx4PVFhKG0pLHc9R2EobSksTT1iLWQsQT1NPj0wPzE6LTEsVD1BKk0sTj1UPnFhLFM9dip4O2lmKEZmLmFkZChYYShTKkEqUWEoVCksZyp3K1MqR2EoVCkpKSxhKz1OP00rQSpCYTpNLE5eZD49ZV5iPj1lKXt2YXIgRT1OdShBdShoKSxBdShfKSk7a3UoRSk7dmFyIGs9TnUobyxFKTtrdShrKTt2YXIgQz0oTl5NPj0wPy0xOjEpKmV1KGtbMl0pOyhyPkN8fHI9PT1DJiYoRVswXXx8RVsxXSkpJiYodSs9Tl5NPj0wPzE6LTEpfX1yZXR1cm4oYTwtRGF8fGE8RGEmJkZmPC1EYSleMSZ1fWZ1bmN0aW9uIEhmKHQsbixlLHIpe3JldHVybiBmdW5jdGlvbihpKXt2YXIgbyxhLHUsZj1uKGkpLGM9VWYoKSxzPW4oYyksbD0hMSxoPXtwb2ludDpkLGxpbmVTdGFydDp2LGxpbmVFbmQ6Zyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtoLnBvaW50PXksaC5saW5lU3RhcnQ9XyxoLmxpbmVFbmQ9YixhPVtdLG89W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtoLnBvaW50PWQsaC5saW5lU3RhcnQ9dixoLmxpbmVFbmQ9ZyxhPU4oYSk7dmFyIHQ9SWYobyxyKTthLmxlbmd0aD8obHx8KGkucG9seWdvblN0YXJ0KCksbD0hMCksWWYoYSxYZix0LGUsaSkpOnQmJihsfHwoaS5wb2x5Z29uU3RhcnQoKSxsPSEwKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCkpLGwmJihpLnBvbHlnb25FbmQoKSxsPSExKSxhPW89bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7aS5wb2x5Z29uU3RhcnQoKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCksaS5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBkKG4sZSl7dChuLGUpJiZpLnBvaW50KG4sZSl9ZnVuY3Rpb24gcCh0LG4pe2YucG9pbnQodCxuKX1mdW5jdGlvbiB2KCl7aC5wb2ludD1wLGYubGluZVN0YXJ0KCl9ZnVuY3Rpb24gZygpe2gucG9pbnQ9ZCxmLmxpbmVFbmQoKX1mdW5jdGlvbiB5KHQsbil7dS5wdXNoKFt0LG5dKSxzLnBvaW50KHQsbil9ZnVuY3Rpb24gXygpe3MubGluZVN0YXJ0KCksdT1bXX1mdW5jdGlvbiBiKCl7eSh1WzBdWzBdLHVbMF1bMV0pLHMubGluZUVuZCgpO3ZhciB0LG4sZSxyLGY9cy5jbGVhbigpLGg9Yy5yZXN1bHQoKSxkPWgubGVuZ3RoO2lmKHUucG9wKCksby5wdXNoKHUpLHU9bnVsbCxkKWlmKDEmZil7aWYoKG49KGU9aFswXSkubGVuZ3RoLTEpPjApe2ZvcihsfHwoaS5wb2x5Z29uU3RhcnQoKSxsPSEwKSxpLmxpbmVTdGFydCgpLHQ9MDt0PG47Kyt0KWkucG9pbnQoKHI9ZVt0XSlbMF0sclsxXSk7aS5saW5lRW5kKCl9fWVsc2UgZD4xJiYyJmYmJmgucHVzaChoLnBvcCgpLmNvbmNhdChoLnNoaWZ0KCkpKSxhLnB1c2goaC5maWx0ZXIoamYpKX1yZXR1cm4gaH19ZnVuY3Rpb24gamYodCl7cmV0dXJuIHQubGVuZ3RoPjF9ZnVuY3Rpb24gWGYodCxuKXtyZXR1cm4oKHQ9dC54KVswXTwwP3RbMV0tT2EtRGE6T2EtdFsxXSktKChuPW4ueClbMF08MD9uWzFdLU9hLURhOk9hLW5bMV0pfXZhciBHZj1IZihmdW5jdGlvbigpe3JldHVybiEwfSxmdW5jdGlvbih0KXt2YXIgbixlPU5hTixyPU5hTixpPU5hTjtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5saW5lU3RhcnQoKSxuPTF9LHBvaW50OmZ1bmN0aW9uKG8sYSl7dmFyIHU9bz4wP3FhOi1xYSxmPUhhKG8tZSk7SGEoZi1xYSk8RGE/KHQucG9pbnQoZSxyPShyK2EpLzI+MD9PYTotT2EpLHQucG9pbnQoaSxyKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQodSxyKSx0LnBvaW50KG8sciksbj0wKTppIT09dSYmZj49cWEmJihIYShlLWkpPERhJiYoZS09aSpEYSksSGEoby11KTxEYSYmKG8tPXUqRGEpLHI9ZnVuY3Rpb24odCxuLGUscil7dmFyIGksbyxhPVFhKHQtZSk7cmV0dXJuIEhhKGEpPkRhP2phKChRYShuKSoobz1HYShyKSkqUWEoZSktUWEocikqKGk9R2EobikpKlFhKHQpKS8oaSpvKmEpKToobityKS8yfShlLHIsbyxhKSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHUsciksbj0wKSx0LnBvaW50KGU9byxyPWEpLGk9dX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLGU9cj1OYU59LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItbn19fSxmdW5jdGlvbih0LG4sZSxyKXt2YXIgaTtpZihudWxsPT10KWk9ZSpPYSxyLnBvaW50KC1xYSxpKSxyLnBvaW50KDAsaSksci5wb2ludChxYSxpKSxyLnBvaW50KHFhLDApLHIucG9pbnQocWEsLWkpLHIucG9pbnQoMCwtaSksci5wb2ludCgtcWEsLWkpLHIucG9pbnQoLXFhLDApLHIucG9pbnQoLXFhLGkpO2Vsc2UgaWYoSGEodFswXS1uWzBdKT5EYSl7dmFyIG89dFswXTxuWzBdP3FhOi1xYTtpPWUqby8yLHIucG9pbnQoLW8saSksci5wb2ludCgwLGkpLHIucG9pbnQobyxpKX1lbHNlIHIucG9pbnQoblswXSxuWzFdKX0sWy1xYSwtT2FdKTtmdW5jdGlvbiBWZih0KXt2YXIgbj1HYSh0KSxlPTYqSWEscj1uPjAsaT1IYShuKT5EYTtmdW5jdGlvbiBvKHQsZSl7cmV0dXJuIEdhKHQpKkdhKGUpPm59ZnVuY3Rpb24gYSh0LGUscil7dmFyIGk9WzEsMCwwXSxvPU51KEF1KHQpLEF1KGUpKSxhPVR1KG8sbyksdT1vWzBdLGY9YS11KnU7aWYoIWYpcmV0dXJuIXImJnQ7dmFyIGM9biphL2Yscz0tbip1L2YsbD1OdShpLG8pLGg9RXUoaSxjKTtTdShoLEV1KG8scykpO3ZhciBkPWwscD1UdShoLGQpLHY9VHUoZCxkKSxnPXAqcC12KihUdShoLGgpLTEpO2lmKCEoZzwwKSl7dmFyIHk9S2EoZyksXz1FdShkLCgtcC15KS92KTtpZihTdShfLGgpLF89TXUoXyksIXIpcmV0dXJuIF87dmFyIGIsbT10WzBdLHg9ZVswXSx3PXRbMV0sTT1lWzFdO3g8bSYmKGI9bSxtPXgseD1iKTt2YXIgQT14LW0sVD1IYShBLXFhKTxEYTtpZighVCYmTTx3JiYoYj13LHc9TSxNPWIpLFR8fEE8RGE/VD93K00+MF5fWzFdPChIYShfWzBdLW0pPERhP3c6TSk6dzw9X1sxXSYmX1sxXTw9TTpBPnFhXihtPD1fWzBdJiZfWzBdPD14KSl7dmFyIE49RXUoZCwoLXAreSkvdik7cmV0dXJuIFN1KE4saCksW18sTXUoTildfX19ZnVuY3Rpb24gdShuLGUpe3ZhciBpPXI/dDpxYS10LG89MDtyZXR1cm4gbjwtaT9vfD0xOm4+aSYmKG98PTIpLGU8LWk/b3w9NDplPmkmJihvfD04KSxvfXJldHVybiBIZihvLGZ1bmN0aW9uKHQpe3ZhciBuLGUsZixjLHM7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2M9Zj0hMSxzPTF9LHBvaW50OmZ1bmN0aW9uKGwsaCl7dmFyIGQscD1bbCxoXSx2PW8obCxoKSxnPXI/dj8wOnUobCxoKTp2P3UobCsobDwwP3FhOi1xYSksaCk6MDtpZighbiYmKGM9Zj12KSYmdC5saW5lU3RhcnQoKSx2IT09ZiYmKCEoZD1hKG4scCkpfHxxZihuLGQpfHxxZihwLGQpKSYmKHBbMF0rPURhLHBbMV0rPURhLHY9byhwWzBdLHBbMV0pKSx2IT09ZilzPTAsdj8odC5saW5lU3RhcnQoKSxkPWEocCxuKSx0LnBvaW50KGRbMF0sZFsxXSkpOihkPWEobixwKSx0LnBvaW50KGRbMF0sZFsxXSksdC5saW5lRW5kKCkpLG49ZDtlbHNlIGlmKGkmJm4mJnJedil7dmFyIHk7ZyZlfHwhKHk9YShwLG4sITApKXx8KHM9MCxyPyh0LmxpbmVTdGFydCgpLHQucG9pbnQoeVswXVswXSx5WzBdWzFdKSx0LnBvaW50KHlbMV1bMF0seVsxXVsxXSksdC5saW5lRW5kKCkpOih0LnBvaW50KHlbMV1bMF0seVsxXVsxXSksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHlbMF1bMF0seVswXVsxXSkpKX0hdnx8biYmcWYobixwKXx8dC5wb2ludChwWzBdLHBbMV0pLG49cCxmPXYsZT1nfSxsaW5lRW5kOmZ1bmN0aW9uKCl7ZiYmdC5saW5lRW5kKCksbj1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiBzfChjJiZmKTw8MX19fSxmdW5jdGlvbihuLHIsaSxvKXtMZihvLHQsZSxpLG4scil9LHI/WzAsLXRdOlstcWEsdC1xYV0pfXZhciAkZj0xZTksV2Y9LSRmO2Z1bmN0aW9uIFpmKHQsbixlLHIpe2Z1bmN0aW9uIGkoaSxvKXtyZXR1cm4gdDw9aSYmaTw9ZSYmbjw9byYmbzw9cn1mdW5jdGlvbiBvKGksbyx1LGMpe3ZhciBzPTAsbD0wO2lmKG51bGw9PWl8fChzPWEoaSx1KSkhPT0obD1hKG8sdSkpfHxmKGksbyk8MF51PjApZG97Yy5wb2ludCgwPT09c3x8Mz09PXM/dDplLHM+MT9yOm4pfXdoaWxlKChzPShzK3UrNCklNCkhPT1sKTtlbHNlIGMucG9pbnQob1swXSxvWzFdKX1mdW5jdGlvbiBhKHIsaSl7cmV0dXJuIEhhKHJbMF0tdCk8RGE/aT4wPzA6MzpIYShyWzBdLWUpPERhP2k+MD8yOjE6SGEoclsxXS1uKTxEYT9pPjA/MTowOmk+MD8zOjJ9ZnVuY3Rpb24gdSh0LG4pe3JldHVybiBmKHQueCxuLngpfWZ1bmN0aW9uIGYodCxuKXt2YXIgZT1hKHQsMSkscj1hKG4sMSk7cmV0dXJuIGUhPT1yP2UtcjowPT09ZT9uWzFdLXRbMV06MT09PWU/dFswXS1uWzBdOjI9PT1lP3RbMV0tblsxXTpuWzBdLXRbMF19cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBmLGMscyxsLGgsZCxwLHYsZyx5LF8sYj1hLG09VWYoKSx4PXtwb2ludDp3LGxpbmVTdGFydDpmdW5jdGlvbigpe3gucG9pbnQ9TSxjJiZjLnB1c2gocz1bXSk7eT0hMCxnPSExLHA9dj1OYU59LGxpbmVFbmQ6ZnVuY3Rpb24oKXtmJiYoTShsLGgpLGQmJmcmJm0ucmVqb2luKCksZi5wdXNoKG0ucmVzdWx0KCkpKTt4LnBvaW50PXcsZyYmYi5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2I9bSxmPVtdLGM9W10sXz0hMH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciBuPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPTAsZT0wLGk9Yy5sZW5ndGg7ZTxpOysrZSlmb3IodmFyIG8sYSx1PWNbZV0sZj0xLHM9dS5sZW5ndGgsbD11WzBdLGg9bFswXSxkPWxbMV07ZjxzOysrZilvPWgsYT1kLGw9dVtmXSxoPWxbMF0sZD1sWzFdLGE8PXI/ZD5yJiYoaC1vKSooci1hKT4oZC1hKSoodC1vKSYmKytuOmQ8PXImJihoLW8pKihyLWEpPChkLWEpKih0LW8pJiYtLW47cmV0dXJuIG59KCksZT1fJiZuLGk9KGY9TihmKSkubGVuZ3RoOyhlfHxpKSYmKGEucG9seWdvblN0YXJ0KCksZSYmKGEubGluZVN0YXJ0KCksbyhudWxsLG51bGwsMSxhKSxhLmxpbmVFbmQoKSksaSYmWWYoZix1LG4sbyxhKSxhLnBvbHlnb25FbmQoKSk7Yj1hLGY9Yz1zPW51bGx9fTtmdW5jdGlvbiB3KHQsbil7aSh0LG4pJiZiLnBvaW50KHQsbil9ZnVuY3Rpb24gTShvLGEpe3ZhciB1PWkobyxhKTtpZihjJiZzLnB1c2goW28sYV0pLHkpbD1vLGg9YSxkPXUseT0hMSx1JiYoYi5saW5lU3RhcnQoKSxiLnBvaW50KG8sYSkpO2Vsc2UgaWYodSYmZyliLnBvaW50KG8sYSk7ZWxzZXt2YXIgZj1bcD1NYXRoLm1heChXZixNYXRoLm1pbigkZixwKSksdj1NYXRoLm1heChXZixNYXRoLm1pbigkZix2KSldLG09W289TWF0aC5tYXgoV2YsTWF0aC5taW4oJGYsbykpLGE9TWF0aC5tYXgoV2YsTWF0aC5taW4oJGYsYSkpXTshZnVuY3Rpb24odCxuLGUscixpLG8pe3ZhciBhLHU9dFswXSxmPXRbMV0sYz0wLHM9MSxsPW5bMF0tdSxoPW5bMV0tZjtpZihhPWUtdSxsfHwhKGE+MCkpe2lmKGEvPWwsbDwwKXtpZihhPGMpcmV0dXJuO2E8cyYmKHM9YSl9ZWxzZSBpZihsPjApe2lmKGE+cylyZXR1cm47YT5jJiYoYz1hKX1pZihhPWktdSxsfHwhKGE8MCkpe2lmKGEvPWwsbDwwKXtpZihhPnMpcmV0dXJuO2E+YyYmKGM9YSl9ZWxzZSBpZihsPjApe2lmKGE8YylyZXR1cm47YTxzJiYocz1hKX1pZihhPXItZixofHwhKGE+MCkpe2lmKGEvPWgsaDwwKXtpZihhPGMpcmV0dXJuO2E8cyYmKHM9YSl9ZWxzZSBpZihoPjApe2lmKGE+cylyZXR1cm47YT5jJiYoYz1hKX1pZihhPW8tZixofHwhKGE8MCkpe2lmKGEvPWgsaDwwKXtpZihhPnMpcmV0dXJuO2E+YyYmKGM9YSl9ZWxzZSBpZihoPjApe2lmKGE8YylyZXR1cm47YTxzJiYocz1hKX1yZXR1cm4gYz4wJiYodFswXT11K2MqbCx0WzFdPWYrYypoKSxzPDEmJihuWzBdPXUrcypsLG5bMV09ZitzKmgpLCEwfX19fX0oZixtLHQsbixlLHIpP3UmJihiLmxpbmVTdGFydCgpLGIucG9pbnQobyxhKSxfPSExKTooZ3x8KGIubGluZVN0YXJ0KCksYi5wb2ludChmWzBdLGZbMV0pKSxiLnBvaW50KG1bMF0sbVsxXSksdXx8Yi5saW5lRW5kKCksXz0hMSl9cD1vLHY9YSxnPXV9cmV0dXJuIHh9fXZhciBRZixKZixLZix0Yz1QYSgpLG5jPXtzcGhlcmU6aXUscG9pbnQ6aXUsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7bmMucG9pbnQ9cmMsbmMubGluZUVuZD1lY30sbGluZUVuZDppdSxwb2x5Z29uU3RhcnQ6aXUscG9seWdvbkVuZDppdX07ZnVuY3Rpb24gZWMoKXtuYy5wb2ludD1uYy5saW5lRW5kPWl1fWZ1bmN0aW9uIHJjKHQsbil7UWY9dCo9SWEsSmY9UWEobio9SWEpLEtmPUdhKG4pLG5jLnBvaW50PWljfWZ1bmN0aW9uIGljKHQsbil7dCo9SWE7dmFyIGU9UWEobio9SWEpLHI9R2EobiksaT1IYSh0LVFmKSxvPUdhKGkpLGE9cipRYShpKSx1PUtmKmUtSmYqcipvLGY9SmYqZStLZipyKm87dGMuYWRkKFhhKEthKGEqYSt1KnUpLGYpKSxRZj10LEpmPWUsS2Y9cn1mdW5jdGlvbiBvYyh0KXtyZXR1cm4gdGMucmVzZXQoKSxzdSh0LG5jKSwrdGN9dmFyIGFjPVtudWxsLG51bGxdLHVjPXt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczphY307ZnVuY3Rpb24gZmModCxuKXtyZXR1cm4gYWNbMF09dCxhY1sxXT1uLG9jKHVjKX12YXIgY2M9e0ZlYXR1cmU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gbGModC5nZW9tZXRyeSxuKX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5mZWF0dXJlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGxjKGVbcl0uZ2VvbWV0cnksbikpcmV0dXJuITA7cmV0dXJuITF9fSxzYz17U3BoZXJlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBvaW50OmZ1bmN0aW9uKHQsbil7cmV0dXJuIGhjKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGhjKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gZGModC5jb29yZGluYXRlcyxuKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihkYyhlW3JdLG4pKXJldHVybiEwO3JldHVybiExfSxQb2x5Z29uOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHBjKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYocGMoZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZ2VvbWV0cmllcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGxjKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9fTtmdW5jdGlvbiBsYyh0LG4pe3JldHVybiEoIXR8fCFzYy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpKSYmc2NbdC50eXBlXSh0LG4pfWZ1bmN0aW9uIGhjKHQsbil7cmV0dXJuIDA9PT1mYyh0LG4pfWZ1bmN0aW9uIGRjKHQsbil7dmFyIGU9ZmModFswXSx0WzFdKTtyZXR1cm4gZmModFswXSxuKStmYyhuLHRbMV0pPD1lK0RhfWZ1bmN0aW9uIHBjKHQsbil7cmV0dXJuISFJZih0Lm1hcCh2YyksZ2MobikpfWZ1bmN0aW9uIHZjKHQpe3JldHVybih0PXQubWFwKGdjKSkucG9wKCksdH1mdW5jdGlvbiBnYyh0KXtyZXR1cm5bdFswXSpJYSx0WzFdKklhXX1mdW5jdGlvbiB5Yyh0LG4sZSl7dmFyIHI9Zyh0LG4tRGEsZSkuY29uY2F0KG4pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gci5tYXAoZnVuY3Rpb24obil7cmV0dXJuW3Qsbl19KX19ZnVuY3Rpb24gX2ModCxuLGUpe3ZhciByPWcodCxuLURhLGUpLmNvbmNhdChuKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKG4pe3JldHVybltuLHRdfSl9fWZ1bmN0aW9uIGJjKCl7dmFyIHQsbixlLHIsaSxvLGEsdSxmLGMscyxsLGg9MTAsZD1oLHA9OTAsdj0zNjAseT0yLjU7ZnVuY3Rpb24gXygpe3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOmIoKX19ZnVuY3Rpb24gYigpe3JldHVybiBnKFZhKHIvcCkqcCxlLHApLm1hcChzKS5jb25jYXQoZyhWYSh1L3YpKnYsYSx2KS5tYXAobCkpLmNvbmNhdChnKFZhKG4vaCkqaCx0LGgpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gSGEodCVwKT5EYX0pLm1hcChmKSkuY29uY2F0KGcoVmEoby9kKSpkLGksZCkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBIYSh0JXYpPkRhfSkubWFwKGMpKX1yZXR1cm4gXy5saW5lcz1mdW5jdGlvbigpe3JldHVybiBiKCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybnt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczp0fX0pfSxfLm91dGxpbmU9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3MocikuY29uY2F0KGwoYSkuc2xpY2UoMSkscyhlKS5yZXZlcnNlKCkuc2xpY2UoMSksbCh1KS5yZXZlcnNlKCkuc2xpY2UoMSkpXX19LF8uZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP18uZXh0ZW50TWFqb3IodCkuZXh0ZW50TWlub3IodCk6Xy5leHRlbnRNaW5vcigpfSxfLmV4dGVudE1ham9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0WzBdWzBdLGU9K3RbMV1bMF0sdT0rdFswXVsxXSxhPSt0WzFdWzFdLHI+ZSYmKHQ9cixyPWUsZT10KSx1PmEmJih0PXUsdT1hLGE9dCksXy5wcmVjaXNpb24oeSkpOltbcix1XSxbZSxhXV19LF8uZXh0ZW50TWlub3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K2VbMF1bMF0sdD0rZVsxXVswXSxvPStlWzBdWzFdLGk9K2VbMV1bMV0sbj50JiYoZT1uLG49dCx0PWUpLG8+aSYmKGU9byxvPWksaT1lKSxfLnByZWNpc2lvbih5KSk6W1tuLG9dLFt0LGldXX0sXy5zdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP18uc3RlcE1ham9yKHQpLnN0ZXBNaW5vcih0KTpfLnN0ZXBNaW5vcigpfSxfLnN0ZXBNYWpvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0rdFswXSx2PSt0WzFdLF8pOltwLHZdfSxfLnN0ZXBNaW5vcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdFswXSxkPSt0WzFdLF8pOltoLGRdfSxfLnByZWNpc2lvbj1mdW5jdGlvbihoKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT0raCxmPXljKG8saSw5MCksYz1fYyhuLHQseSkscz15Yyh1LGEsOTApLGw9X2MocixlLHkpLF8pOnl9LF8uZXh0ZW50TWFqb3IoW1stMTgwLC05MCtEYV0sWzE4MCw5MC1EYV1dKS5leHRlbnRNaW5vcihbWy0xODAsLTgwLURhXSxbMTgwLDgwK0RhXV0pfWZ1bmN0aW9uIG1jKHQpe3JldHVybiB0fXZhciB4Yyx3YyxNYyxBYyxUYz1QYSgpLE5jPVBhKCksU2M9e3BvaW50Oml1LGxpbmVTdGFydDppdSxsaW5lRW5kOml1LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1NjLmxpbmVTdGFydD1FYyxTYy5saW5lRW5kPVBjfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7U2MubGluZVN0YXJ0PVNjLmxpbmVFbmQ9U2MucG9pbnQ9aXUsVGMuYWRkKEhhKE5jKSksTmMucmVzZXQoKX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9VGMvMjtyZXR1cm4gVGMucmVzZXQoKSx0fX07ZnVuY3Rpb24gRWMoKXtTYy5wb2ludD1rY31mdW5jdGlvbiBrYyh0LG4pe1NjLnBvaW50PUNjLHhjPU1jPXQsd2M9QWM9bn1mdW5jdGlvbiBDYyh0LG4pe05jLmFkZChBYyp0LU1jKm4pLE1jPXQsQWM9bn1mdW5jdGlvbiBQYygpe0NjKHhjLHdjKX12YXIgemM9MS8wLFJjPXpjLExjPS16YyxEYz1MYyxVYz17cG9pbnQ6ZnVuY3Rpb24odCxuKXt0PHpjJiYoemM9dCk7dD5MYyYmKExjPXQpO248UmMmJihSYz1uKTtuPkRjJiYoRGM9bil9LGxpbmVTdGFydDppdSxsaW5lRW5kOml1LHBvbHlnb25TdGFydDppdSxwb2x5Z29uRW5kOml1LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVtbemMsUmNdLFtMYyxEY11dO3JldHVybiBMYz1EYz0tKFJjPXpjPTEvMCksdH19O3ZhciBxYyxPYyxZYyxCYyxGYz0wLEljPTAsSGM9MCxqYz0wLFhjPTAsR2M9MCxWYz0wLCRjPTAsV2M9MCxaYz17cG9pbnQ6UWMsbGluZVN0YXJ0OkpjLGxpbmVFbmQ6bnMscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7WmMubGluZVN0YXJ0PWVzLFpjLmxpbmVFbmQ9cnN9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtaYy5wb2ludD1RYyxaYy5saW5lU3RhcnQ9SmMsWmMubGluZUVuZD1uc30scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9V2M/W1ZjL1djLCRjL1djXTpHYz9bamMvR2MsWGMvR2NdOkhjP1tGYy9IYyxJYy9IY106W05hTixOYU5dO3JldHVybiBGYz1JYz1IYz1qYz1YYz1HYz1WYz0kYz1XYz0wLHR9fTtmdW5jdGlvbiBRYyh0LG4pe0ZjKz10LEljKz1uLCsrSGN9ZnVuY3Rpb24gSmMoKXtaYy5wb2ludD1LY31mdW5jdGlvbiBLYyh0LG4pe1pjLnBvaW50PXRzLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gdHModCxuKXt2YXIgZT10LVljLHI9bi1CYyxpPUthKGUqZStyKnIpO2pjKz1pKihZYyt0KS8yLFhjKz1pKihCYytuKS8yLEdjKz1pLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gbnMoKXtaYy5wb2ludD1RY31mdW5jdGlvbiBlcygpe1pjLnBvaW50PWlzfWZ1bmN0aW9uIHJzKCl7b3MocWMsT2MpfWZ1bmN0aW9uIGlzKHQsbil7WmMucG9pbnQ9b3MsUWMocWM9WWM9dCxPYz1CYz1uKX1mdW5jdGlvbiBvcyh0LG4pe3ZhciBlPXQtWWMscj1uLUJjLGk9S2EoZSplK3Iqcik7amMrPWkqKFljK3QpLzIsWGMrPWkqKEJjK24pLzIsR2MrPWksVmMrPShpPUJjKnQtWWMqbikqKFljK3QpLCRjKz1pKihCYytuKSxXYys9MyppLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gYXModCl7dGhpcy5fY29udGV4dD10fWFzLnByb3RvdHlwZT17X3JhZGl1czo0LjUscG9pbnRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JhZGl1cz10LHRoaXN9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MD09PXRoaXMuX2xpbmUmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fcG9pbnQ9TmFOfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbiksdGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTticmVhaztkZWZhdWx0OnRoaXMuX2NvbnRleHQubW92ZVRvKHQrdGhpcy5fcmFkaXVzLG4pLHRoaXMuX2NvbnRleHQuYXJjKHQsbix0aGlzLl9yYWRpdXMsMCxCYSl9fSxyZXN1bHQ6aXV9O3ZhciB1cyxmcyxjcyxzcyxscyxocz1QYSgpLGRzPXtwb2ludDppdSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtkcy5wb2ludD1wc30sbGluZUVuZDpmdW5jdGlvbigpe3VzJiZ2cyhmcyxjcyksZHMucG9pbnQ9aXV9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3VzPSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dXM9bnVsbH0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9K2hzO3JldHVybiBocy5yZXNldCgpLHR9fTtmdW5jdGlvbiBwcyh0LG4pe2RzLnBvaW50PXZzLGZzPXNzPXQsY3M9bHM9bn1mdW5jdGlvbiB2cyh0LG4pe3NzLT10LGxzLT1uLGhzLmFkZChLYShzcypzcytscypscykpLHNzPXQsbHM9bn1mdW5jdGlvbiBncygpe3RoaXMuX3N0cmluZz1bXX1mdW5jdGlvbiB5cyh0KXtyZXR1cm4ibTAsIit0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKy0yKnQrImEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrMip0KyJ6In1mdW5jdGlvbiBfcyh0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bmV3IGJzO2Zvcih2YXIgciBpbiB0KWVbcl09dFtyXTtyZXR1cm4gZS5zdHJlYW09bixlfX1mdW5jdGlvbiBicygpe31mdW5jdGlvbiBtcyh0LG4sZSl7dmFyIHI9dC5jbGlwRXh0ZW50JiZ0LmNsaXBFeHRlbnQoKTtyZXR1cm4gdC5zY2FsZSgxNTApLnRyYW5zbGF0ZShbMCwwXSksbnVsbCE9ciYmdC5jbGlwRXh0ZW50KG51bGwpLHN1KGUsdC5zdHJlYW0oVWMpKSxuKFVjLnJlc3VsdCgpKSxudWxsIT1yJiZ0LmNsaXBFeHRlbnQociksdH1mdW5jdGlvbiB4cyh0LG4sZSl7cmV0dXJuIG1zKHQsZnVuY3Rpb24oZSl7dmFyIHI9blsxXVswXS1uWzBdWzBdLGk9blsxXVsxXS1uWzBdWzFdLG89TWF0aC5taW4oci8oZVsxXVswXS1lWzBdWzBdKSxpLyhlWzFdWzFdLWVbMF1bMV0pKSxhPStuWzBdWzBdKyhyLW8qKGVbMV1bMF0rZVswXVswXSkpLzIsdT0rblswXVsxXSsoaS1vKihlWzFdWzFdK2VbMF1bMV0pKS8yO3Quc2NhbGUoMTUwKm8pLnRyYW5zbGF0ZShbYSx1XSl9LGUpfWZ1bmN0aW9uIHdzKHQsbixlKXtyZXR1cm4geHModCxbWzAsMF0sbl0sZSl9ZnVuY3Rpb24gTXModCxuLGUpe3JldHVybiBtcyh0LGZ1bmN0aW9uKGUpe3ZhciByPStuLGk9ci8oZVsxXVswXS1lWzBdWzBdKSxvPShyLWkqKGVbMV1bMF0rZVswXVswXSkpLzIsYT0taSplWzBdWzFdO3Quc2NhbGUoMTUwKmkpLnRyYW5zbGF0ZShbbyxhXSl9LGUpfWZ1bmN0aW9uIEFzKHQsbixlKXtyZXR1cm4gbXModCxmdW5jdGlvbihlKXt2YXIgcj0rbixpPXIvKGVbMV1bMV0tZVswXVsxXSksbz0taSplWzBdWzBdLGE9KHItaSooZVsxXVsxXStlWzBdWzFdKSkvMjt0LnNjYWxlKDE1MCppKS50cmFuc2xhdGUoW28sYV0pfSxlKX1ncy5wcm90b3R5cGU9e19yYWRpdXM6NC41LF9jaXJjbGU6eXMoNC41KSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4odD0rdCkhPT10aGlzLl9yYWRpdXMmJih0aGlzLl9yYWRpdXM9dCx0aGlzLl9jaXJjbGU9bnVsbCksdGhpc30scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPT09dGhpcy5fbGluZSYmdGhpcy5fc3RyaW5nLnB1c2goIloiKSx0aGlzLl9wb2ludD1OYU59LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fc3RyaW5nLnB1c2goIk0iLHQsIiwiLG4pLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3N0cmluZy5wdXNoKCJMIix0LCIsIixuKTticmVhaztkZWZhdWx0Om51bGw9PXRoaXMuX2NpcmNsZSYmKHRoaXMuX2NpcmNsZT15cyh0aGlzLl9yYWRpdXMpKSx0aGlzLl9zdHJpbmcucHVzaCgiTSIsdCwiLCIsbix0aGlzLl9jaXJjbGUpfX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYodGhpcy5fc3RyaW5nLmxlbmd0aCl7dmFyIHQ9dGhpcy5fc3RyaW5nLmpvaW4oIiIpO3JldHVybiB0aGlzLl9zdHJpbmc9W10sdH1yZXR1cm4gbnVsbH19LGJzLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YnMscG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0LG4pfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX07dmFyIFRzPTE2LE5zPUdhKDMwKklhKTtmdW5jdGlvbiBTcyh0LG4pe3JldHVybituP2Z1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZShyLGksbyxhLHUsZixjLHMsbCxoLGQscCx2LGcpe3ZhciB5PWMtcixfPXMtaSxiPXkqeStfKl87aWYoYj40Km4mJnYtLSl7dmFyIG09YStoLHg9dStkLHc9ZitwLE09S2EobSptK3gqeCt3KncpLEE9ZXUody89TSksVD1IYShIYSh3KS0xKTxEYXx8SGEoby1sKTxEYT8obytsKS8yOlhhKHgsbSksTj10KFQsQSksUz1OWzBdLEU9TlsxXSxrPVMtcixDPUUtaSxQPV8qay15KkM7KFAqUC9iPm58fEhhKCh5KmsrXypDKS9iLS41KT4uM3x8YSpoK3UqZCtmKnA8TnMpJiYoZShyLGksbyxhLHUsZixTLEUsVCxtLz1NLHgvPU0sdyx2LGcpLGcucG9pbnQoUyxFKSxlKFMsRSxULG0seCx3LGMscyxsLGgsZCxwLHYsZykpfX1yZXR1cm4gZnVuY3Rpb24obil7dmFyIHIsaSxvLGEsdSxmLGMscyxsLGgsZCxwLHY9e3BvaW50OmcsbGluZVN0YXJ0OnksbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe24ucG9seWdvblN0YXJ0KCksdi5saW5lU3RhcnQ9bX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpLHYubGluZVN0YXJ0PXl9fTtmdW5jdGlvbiBnKGUscil7ZT10KGUsciksbi5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIHkoKXtzPU5hTix2LnBvaW50PV8sbi5saW5lU3RhcnQoKX1mdW5jdGlvbiBfKHIsaSl7dmFyIG89QXUoW3IsaV0pLGE9dChyLGkpO2UocyxsLGMsaCxkLHAscz1hWzBdLGw9YVsxXSxjPXIsaD1vWzBdLGQ9b1sxXSxwPW9bMl0sVHMsbiksbi5wb2ludChzLGwpfWZ1bmN0aW9uIGIoKXt2LnBvaW50PWcsbi5saW5lRW5kKCl9ZnVuY3Rpb24gbSgpe3koKSx2LnBvaW50PXgsdi5saW5lRW5kPXd9ZnVuY3Rpb24geCh0LG4pe18ocj10LG4pLGk9cyxvPWwsYT1oLHU9ZCxmPXAsdi5wb2ludD1ffWZ1bmN0aW9uIHcoKXtlKHMsbCxjLGgsZCxwLGksbyxyLGEsdSxmLFRzLG4pLHYubGluZUVuZD1iLGIoKX1yZXR1cm4gdn19KHQsbik6ZnVuY3Rpb24odCl7cmV0dXJuIF9zKHtwb2ludDpmdW5jdGlvbihuLGUpe249dChuLGUpLHRoaXMuc3RyZWFtLnBvaW50KG5bMF0sblsxXSl9fSl9KHQpfXZhciBFcz1fcyh7cG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0KklhLG4qSWEpfX0pO2Z1bmN0aW9uIGtzKHQsbixlLHIpe3ZhciBpPUdhKHIpLG89UWEociksYT1pKnQsdT1vKnQsZj1pL3QsYz1vL3Qscz0obyplLWkqbikvdCxsPShvKm4raSplKS90O2Z1bmN0aW9uIGgodCxyKXtyZXR1cm5bYSp0LXUqcituLGUtdSp0LWEqcl19cmV0dXJuIGguaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuW2YqdC1jKm4rcyxsLWMqdC1mKm5dfSxofWZ1bmN0aW9uIENzKHQpe3JldHVybiBQcyhmdW5jdGlvbigpe3JldHVybiB0fSkoKX1mdW5jdGlvbiBQcyh0KXt2YXIgbixlLHIsaSxvLGEsdSxmLGMscyxsPTE1MCxoPTQ4MCxkPTI1MCxwPTAsdj0wLGc9MCx5PTAsXz0wLGI9MCxtPW51bGwseD1HZix3PW51bGwsTT1tYyxBPS41O2Z1bmN0aW9uIFQodCl7cmV0dXJuIGYodFswXSpJYSx0WzFdKklhKX1mdW5jdGlvbiBOKHQpe3JldHVybih0PWYuaW52ZXJ0KHRbMF0sdFsxXSkpJiZbdFswXSpGYSx0WzFdKkZhXX1mdW5jdGlvbiBTKCl7dmFyIHQ9a3MobCwwLDAsYikuYXBwbHkobnVsbCxuKHAsdikpLHI9KGI/a3M6ZnVuY3Rpb24odCxuLGUpe2Z1bmN0aW9uIHIocixpKXtyZXR1cm5bbit0KnIsZS10KmldfXJldHVybiByLmludmVydD1mdW5jdGlvbihyLGkpe3JldHVyblsoci1uKS90LChlLWkpL3RdfSxyfSkobCxoLXRbMF0sZC10WzFdLGIpO3JldHVybiBlPWtmKGcseSxfKSx1PVNmKG4sciksZj1TZihlLHUpLGE9U3ModSxBKSxFKCl9ZnVuY3Rpb24gRSgpe3JldHVybiBjPXM9bnVsbCxUfXJldHVybiBULnN0cmVhbT1mdW5jdGlvbih0KXtyZXR1cm4gYyYmcz09PXQ/YzpjPUVzKGZ1bmN0aW9uKHQpe3JldHVybiBfcyh7cG9pbnQ6ZnVuY3Rpb24obixlKXt2YXIgcj10KG4sZSk7cmV0dXJuIHRoaXMuc3RyZWFtLnBvaW50KHJbMF0sclsxXSl9fSl9KGUpKHgoYShNKHM9dCkpKSkpfSxULnByZWNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9dCxtPXZvaWQgMCxFKCkpOnh9LFQucG9zdGNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE09dCx3PXI9aT1vPW51bGwsRSgpKTpNfSxULmNsaXBBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD0rdD9WZihtPXQqSWEpOihtPW51bGwsR2YpLEUoKSk6bSpGYX0sVC5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhNPW51bGw9PXQ/KHc9cj1pPW89bnVsbCxtYyk6WmYodz0rdFswXVswXSxyPSt0WzBdWzFdLGk9K3RbMV1bMF0sbz0rdFsxXVsxXSksRSgpKTpudWxsPT13P251bGw6W1t3LHJdLFtpLG9dXX0sVC5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD0rdCxTKCkpOmx9LFQudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSt0WzBdLGQ9K3RbMV0sUygpKTpbaCxkXX0sVC5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9dFswXSUzNjAqSWEsdj10WzFdJTM2MCpJYSxTKCkpOltwKkZhLHYqRmFdfSxULnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz10WzBdJTM2MCpJYSx5PXRbMV0lMzYwKklhLF89dC5sZW5ndGg+Mj90WzJdJTM2MCpJYTowLFMoKSk6W2cqRmEseSpGYSxfKkZhXX0sVC5hbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj10JTM2MCpJYSxTKCkpOmIqRmF9LFQucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPVNzKHUsQT10KnQpLEUoKSk6S2EoQSl9LFQuZml0RXh0ZW50PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHhzKFQsdCxuKX0sVC5maXRTaXplPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHdzKFQsdCxuKX0sVC5maXRXaWR0aD1mdW5jdGlvbih0LG4pe3JldHVybiBNcyhULHQsbil9LFQuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIEFzKFQsdCxuKX0sZnVuY3Rpb24oKXtyZXR1cm4gbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxULmludmVydD1uLmludmVydCYmTixTKCl9fWZ1bmN0aW9uIHpzKHQpe3ZhciBuPTAsZT1xYS8zLHI9UHModCksaT1yKG4sZSk7cmV0dXJuIGkucGFyYWxsZWxzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Iobj10WzBdKklhLGU9dFsxXSpJYSk6W24qRmEsZSpGYV19LGl9ZnVuY3Rpb24gUnModCxuKXt2YXIgZT1RYSh0KSxyPShlK1FhKG4pKS8yO2lmKEhhKHIpPERhKXJldHVybiBmdW5jdGlvbih0KXt2YXIgbj1HYSh0KTtmdW5jdGlvbiBlKHQsZSl7cmV0dXJuW3QqbixRYShlKS9uXX1yZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm5bdC9uLGV1KGUqbildfSxlfSh0KTt2YXIgaT0xK2UqKDIqci1lKSxvPUthKGkpL3I7ZnVuY3Rpb24gYSh0LG4pe3ZhciBlPUthKGktMipyKlFhKG4pKS9yO3JldHVybltlKlFhKHQqPXIpLG8tZSpHYSh0KV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9by1uO3JldHVybltYYSh0LEhhKGUpKS9yKkphKGUpLGV1KChpLSh0KnQrZSplKSpyKnIpLygyKnIpKV19LGF9ZnVuY3Rpb24gTHMoKXtyZXR1cm4genMoUnMpLnNjYWxlKDE1NS40MjQpLmNlbnRlcihbMCwzMy42NDQyXSl9ZnVuY3Rpb24gRHMoKXtyZXR1cm4gTHMoKS5wYXJhbGxlbHMoWzI5LjUsNDUuNV0pLnNjYWxlKDEwNzApLnRyYW5zbGF0ZShbNDgwLDI1MF0pLnJvdGF0ZShbOTYsMF0pLmNlbnRlcihbLS42LDM4LjddKX1mdW5jdGlvbiBVcyh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj1HYShuKSxpPUdhKGUpLG89dChyKmkpO3JldHVybltvKmkqUWEobiksbypRYShlKV19fWZ1bmN0aW9uIHFzKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPUthKG4qbitlKmUpLGk9dChyKSxvPVFhKGkpLGE9R2EoaSk7cmV0dXJuW1hhKG4qbyxyKmEpLGV1KHImJmUqby9yKV19fXZhciBPcz1VcyhmdW5jdGlvbih0KXtyZXR1cm4gS2EoMi8oMSt0KSl9KTtPcy5pbnZlcnQ9cXMoZnVuY3Rpb24odCl7cmV0dXJuIDIqZXUodC8yKX0pO3ZhciBZcz1VcyhmdW5jdGlvbih0KXtyZXR1cm4odD1udSh0KSkmJnQvUWEodCl9KTtmdW5jdGlvbiBCcyh0LG4pe3JldHVyblt0LFdhKHR1KChPYStuKS8yKSldfWZ1bmN0aW9uIEZzKHQpe3ZhciBuLGUscixpPUNzKHQpLG89aS5jZW50ZXIsYT1pLnNjYWxlLHU9aS50cmFuc2xhdGUsZj1pLmNsaXBFeHRlbnQsYz1udWxsO2Z1bmN0aW9uIHMoKXt2YXIgbz1xYSphKCksdT1pKFJmKGkucm90YXRlKCkpLmludmVydChbMCwwXSkpO3JldHVybiBmKG51bGw9PWM/W1t1WzBdLW8sdVsxXS1vXSxbdVswXStvLHVbMV0rb11dOnQ9PT1Ccz9bW01hdGgubWF4KHVbMF0tbyxjKSxuXSxbTWF0aC5taW4odVswXStvLGUpLHJdXTpbW2MsTWF0aC5tYXgodVsxXS1vLG4pXSxbZSxNYXRoLm1pbih1WzFdK28scildXSl9cmV0dXJuIGkuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGEodCkscygpKTphKCl9LGkudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1KHQpLHMoKSk6dSgpfSxpLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obyh0KSxzKCkpOm8oKX0saS5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P2M9bj1lPXI9bnVsbDooYz0rdFswXVswXSxuPSt0WzBdWzFdLGU9K3RbMV1bMF0scj0rdFsxXVsxXSkscygpKTpudWxsPT1jP251bGw6W1tjLG5dLFtlLHJdXX0scygpfWZ1bmN0aW9uIElzKHQpe3JldHVybiB0dSgoT2ErdCkvMil9ZnVuY3Rpb24gSHModCxuKXt2YXIgZT1HYSh0KSxyPXQ9PT1uP1FhKHQpOldhKGUvR2EobikpL1dhKElzKG4pL0lzKHQpKSxpPWUqWmEoSXModCkscikvcjtpZighcilyZXR1cm4gQnM7ZnVuY3Rpb24gbyh0LG4pe2k+MD9uPC1PYStEYSYmKG49LU9hK0RhKTpuPk9hLURhJiYobj1PYS1EYSk7dmFyIGU9aS9aYShJcyhuKSxyKTtyZXR1cm5bZSpRYShyKnQpLGktZSpHYShyKnQpXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1pLW4sbz1KYShyKSpLYSh0KnQrZSplKTtyZXR1cm5bWGEodCxIYShlKSkvcipKYShlKSwyKmphKFphKGkvbywxL3IpKS1PYV19LG99ZnVuY3Rpb24ganModCxuKXtyZXR1cm5bdCxuXX1mdW5jdGlvbiBYcyh0LG4pe3ZhciBlPUdhKHQpLHI9dD09PW4/UWEodCk6KGUtR2EobikpLyhuLXQpLGk9ZS9yK3Q7aWYoSGEocik8RGEpcmV0dXJuIGpzO2Z1bmN0aW9uIG8odCxuKXt2YXIgZT1pLW4sbz1yKnQ7cmV0dXJuW2UqUWEobyksaS1lKkdhKG8pXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1pLW47cmV0dXJuW1hhKHQsSGEoZSkpL3IqSmEoZSksaS1KYShyKSpLYSh0KnQrZSplKV19LG99WXMuaW52ZXJ0PXFzKGZ1bmN0aW9uKHQpe3JldHVybiB0fSksQnMuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuW3QsMipqYSgkYShuKSktT2FdfSxqcy5pbnZlcnQ9anM7dmFyIEdzPTEuMzQwMjY0LFZzPS0uMDgxMTA2LCRzPTg5M2UtNixXcz0uMDAzNzk2LFpzPUthKDMpLzI7ZnVuY3Rpb24gUXModCxuKXt2YXIgZT1ldShacypRYShuKSkscj1lKmUsaT1yKnIqcjtyZXR1cm5bdCpHYShlKS8oWnMqKEdzKzMqVnMqcitpKig3KiRzKzkqV3MqcikpKSxlKihHcytWcypyK2kqKCRzK1dzKnIpKV19ZnVuY3Rpb24gSnModCxuKXt2YXIgZT1HYShuKSxyPUdhKHQpKmU7cmV0dXJuW2UqUWEodCkvcixRYShuKS9yXX1mdW5jdGlvbiBLcyh0LG4sZSxyKXtyZXR1cm4gMT09PXQmJjE9PT1uJiYwPT09ZSYmMD09PXI/bWM6X3Moe3BvaW50OmZ1bmN0aW9uKGksbyl7dGhpcy5zdHJlYW0ucG9pbnQoaSp0K2UsbypuK3IpfX0pfWZ1bmN0aW9uIHRsKHQsbil7dmFyIGU9bipuLHI9ZSplO3JldHVyblt0KiguODcwNy0uMTMxOTc5KmUrcioociooLjAwMzk3MSplLS4wMDE1MjkqciktLjAxMzc5MSkpLG4qKDEuMDA3MjI2K2UqKC4wMTUwODUrciooLjAyODg3NCplLS4wNDQ0NzUtLjAwNTkxNipyKSkpXX1mdW5jdGlvbiBubCh0LG4pe3JldHVybltHYShuKSpRYSh0KSxRYShuKV19ZnVuY3Rpb24gZWwodCxuKXt2YXIgZT1HYShuKSxyPTErR2EodCkqZTtyZXR1cm5bZSpRYSh0KS9yLFFhKG4pL3JdfWZ1bmN0aW9uIHJsKHQsbil7cmV0dXJuW1dhKHR1KChPYStuKS8yKSksLXRdfWZ1bmN0aW9uIGlsKHQsbil7cmV0dXJuIHQucGFyZW50PT09bi5wYXJlbnQ/MToyfWZ1bmN0aW9uIG9sKHQsbil7cmV0dXJuIHQrbi54fWZ1bmN0aW9uIGFsKHQsbil7cmV0dXJuIE1hdGgubWF4KHQsbi55KX1mdW5jdGlvbiB1bCh0KXt2YXIgbj0wLGU9dC5jaGlsZHJlbixyPWUmJmUubGVuZ3RoO2lmKHIpZm9yKDstLXI+PTA7KW4rPWVbcl0udmFsdWU7ZWxzZSBuPTE7dC52YWx1ZT1ufWZ1bmN0aW9uIGZsKHQsbil7dmFyIGUscixpLG8sYSx1PW5ldyBobCh0KSxmPSt0LnZhbHVlJiYodS52YWx1ZT10LnZhbHVlKSxjPVt1XTtmb3IobnVsbD09biYmKG49Y2wpO2U9Yy5wb3AoKTspaWYoZiYmKGUudmFsdWU9K2UuZGF0YS52YWx1ZSksKGk9bihlLmRhdGEpKSYmKGE9aS5sZW5ndGgpKWZvcihlLmNoaWxkcmVuPW5ldyBBcnJheShhKSxvPWEtMTtvPj0wOy0tbyljLnB1c2gocj1lLmNoaWxkcmVuW29dPW5ldyBobChpW29dKSksci5wYXJlbnQ9ZSxyLmRlcHRoPWUuZGVwdGgrMTtyZXR1cm4gdS5lYWNoQmVmb3JlKGxsKX1mdW5jdGlvbiBjbCh0KXtyZXR1cm4gdC5jaGlsZHJlbn1mdW5jdGlvbiBzbCh0KXt0LmRhdGE9dC5kYXRhLmRhdGF9ZnVuY3Rpb24gbGwodCl7dmFyIG49MDtkb3t0LmhlaWdodD1ufXdoaWxlKCh0PXQucGFyZW50KSYmdC5oZWlnaHQ8KytuKX1mdW5jdGlvbiBobCh0KXt0aGlzLmRhdGE9dCx0aGlzLmRlcHRoPXRoaXMuaGVpZ2h0PTAsdGhpcy5wYXJlbnQ9bnVsbH1Rcy5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGUscj1uLGk9cipyLG89aSppKmksYT0wO2E8MTImJihvPShpPShyLT1lPShyKihHcytWcyppK28qKCRzK1dzKmkpKS1uKS8oR3MrMypWcyppK28qKDcqJHMrOSpXcyppKSkpKnIpKmkqaSwhKEhhKGUpPFVhKSk7KythKTtyZXR1cm5bWnMqdCooR3MrMypWcyppK28qKDcqJHMrOSpXcyppKSkvR2EociksZXUoUWEocikvWnMpXX0sSnMuaW52ZXJ0PXFzKGphKSx0bC5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPW4saT0yNTtkb3t2YXIgbz1yKnIsYT1vKm87ci09ZT0ociooMS4wMDcyMjYrbyooLjAxNTA4NSthKiguMDI4ODc0Km8tLjA0NDQ3NS0uMDA1OTE2KmEpKSktbikvKDEuMDA3MjI2K28qKC4wNDUyNTUrYSooLjI1OTg2NipvLS4zMTEzMjUtLjAwNTkxNioxMSphKSkpfXdoaWxlKEhhKGUpPkRhJiYtLWk+MCk7cmV0dXJuW3QvKC44NzA3KyhvPXIqcikqKG8qKG8qbypvKiguMDAzOTcxLS4wMDE1MjkqbyktLjAxMzc5MSktLjEzMTk3OSkpLHJdfSxubC5pbnZlcnQ9cXMoZXUpLGVsLmludmVydD1xcyhmdW5jdGlvbih0KXtyZXR1cm4gMipqYSh0KX0pLHJsLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblstbiwyKmphKCRhKHQpKS1PYV19LGhsLnByb3RvdHlwZT1mbC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmhsLGNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKHVsKX0sZWFjaDpmdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvPXRoaXMsYT1bb107ZG97Zm9yKG49YS5yZXZlcnNlKCksYT1bXTtvPW4ucG9wKCk7KWlmKHQobyksZT1vLmNoaWxkcmVuKWZvcihyPTAsaT1lLmxlbmd0aDtyPGk7KytyKWEucHVzaChlW3JdKX13aGlsZShhLmxlbmd0aCk7cmV0dXJuIHRoaXN9LGVhY2hBZnRlcjpmdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyLGk9dGhpcyxvPVtpXSxhPVtdO2k9by5wb3AoKTspaWYoYS5wdXNoKGkpLG49aS5jaGlsZHJlbilmb3IoZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlvLnB1c2gobltlXSk7Zm9yKDtpPWEucG9wKCk7KXQoaSk7cmV0dXJuIHRoaXN9LGVhY2hCZWZvcmU6ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj10aGlzLGk9W3JdO3I9aS5wb3AoKTspaWYodChyKSxuPXIuY2hpbGRyZW4pZm9yKGU9bi5sZW5ndGgtMTtlPj0wOy0tZSlpLnB1c2gobltlXSk7cmV0dXJuIHRoaXN9LHN1bTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoZnVuY3Rpb24obil7Zm9yKHZhciBlPSt0KG4uZGF0YSl8fDAscj1uLmNoaWxkcmVuLGk9ciYmci5sZW5ndGg7LS1pPj0wOyllKz1yW2ldLnZhbHVlO24udmFsdWU9ZX0pfSxzb3J0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbiYmbi5jaGlsZHJlbi5zb3J0KHQpfSl9LHBhdGg6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMsZT1mdW5jdGlvbih0LG4pe2lmKHQ9PT1uKXJldHVybiB0O3ZhciBlPXQuYW5jZXN0b3JzKCkscj1uLmFuY2VzdG9ycygpLGk9bnVsbDtmb3IodD1lLnBvcCgpLG49ci5wb3AoKTt0PT09bjspaT10LHQ9ZS5wb3AoKSxuPXIucG9wKCk7cmV0dXJuIGl9KG4sdCkscj1bbl07biE9PWU7KW49bi5wYXJlbnQsci5wdXNoKG4pO2Zvcih2YXIgaT1yLmxlbmd0aDt0IT09ZTspci5zcGxpY2UoaSwwLHQpLHQ9dC5wYXJlbnQ7cmV0dXJuIHJ9LGFuY2VzdG9yczpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLG49W3RdO3Q9dC5wYXJlbnQ7KW4ucHVzaCh0KTtyZXR1cm4gbn0sZGVzY2VuZGFudHM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3QucHVzaChuKX0pLHR9LGxlYXZlczpmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbnx8dC5wdXNoKG4pfSksdH0sbGlua3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49W107cmV0dXJuIHQuZWFjaChmdW5jdGlvbihlKXtlIT09dCYmbi5wdXNoKHtzb3VyY2U6ZS5wYXJlbnQsdGFyZ2V0OmV9KX0pLG59LGNvcHk6ZnVuY3Rpb24oKXtyZXR1cm4gZmwodGhpcykuZWFjaEJlZm9yZShzbCl9fTt2YXIgZGw9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIHBsKHQpe2Zvcih2YXIgbixlLHI9MCxpPSh0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9dC5sZW5ndGg7cjspZT1NYXRoLnJhbmRvbSgpKnItLXwwLG49dFtyXSx0W3JdPXRbZV0sdFtlXT1uO3JldHVybiB0fShkbC5jYWxsKHQpKSkubGVuZ3RoLG89W107cjxpOyluPXRbcl0sZSYmeWwoZSxuKT8rK3I6KGU9Ymwobz12bChvLG4pKSxyPTApO3JldHVybiBlfWZ1bmN0aW9uIHZsKHQsbil7dmFyIGUscjtpZihfbChuLHQpKXJldHVybltuXTtmb3IoZT0wO2U8dC5sZW5ndGg7KytlKWlmKGdsKG4sdFtlXSkmJl9sKG1sKHRbZV0sbiksdCkpcmV0dXJuW3RbZV0sbl07Zm9yKGU9MDtlPHQubGVuZ3RoLTE7KytlKWZvcihyPWUrMTtyPHQubGVuZ3RoOysrcilpZihnbChtbCh0W2VdLHRbcl0pLG4pJiZnbChtbCh0W2VdLG4pLHRbcl0pJiZnbChtbCh0W3JdLG4pLHRbZV0pJiZfbCh4bCh0W2VdLHRbcl0sbiksdCkpcmV0dXJuW3RbZV0sdFtyXSxuXTt0aHJvdyBuZXcgRXJyb3J9ZnVuY3Rpb24gZ2wodCxuKXt2YXIgZT10LnItbi5yLHI9bi54LXQueCxpPW4ueS10Lnk7cmV0dXJuIGU8MHx8ZSplPHIqcitpKml9ZnVuY3Rpb24geWwodCxuKXt2YXIgZT10LnItbi5yKzFlLTYscj1uLngtdC54LGk9bi55LXQueTtyZXR1cm4gZT4wJiZlKmU+cipyK2kqaX1mdW5jdGlvbiBfbCh0LG4pe2Zvcih2YXIgZT0wO2U8bi5sZW5ndGg7KytlKWlmKCF5bCh0LG5bZV0pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGJsKHQpe3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAxOnJldHVybnt4OihuPXRbMF0pLngseTpuLnkscjpuLnJ9O2Nhc2UgMjpyZXR1cm4gbWwodFswXSx0WzFdKTtjYXNlIDM6cmV0dXJuIHhsKHRbMF0sdFsxXSx0WzJdKX12YXIgbn1mdW5jdGlvbiBtbCh0LG4pe3ZhciBlPXQueCxyPXQueSxpPXQucixvPW4ueCxhPW4ueSx1PW4ucixmPW8tZSxjPWEtcixzPXUtaSxsPU1hdGguc3FydChmKmYrYypjKTtyZXR1cm57eDooZStvK2YvbCpzKS8yLHk6KHIrYStjL2wqcykvMixyOihsK2krdSkvMn19ZnVuY3Rpb24geGwodCxuLGUpe3ZhciByPXQueCxpPXQueSxvPXQucixhPW4ueCx1PW4ueSxmPW4ucixjPWUueCxzPWUueSxsPWUucixoPXItYSxkPXItYyxwPWktdSx2PWktcyxnPWYtbyx5PWwtbyxfPXIqcitpKmktbypvLGI9Xy1hKmEtdSp1K2YqZixtPV8tYypjLXMqcytsKmwseD1kKnAtaCp2LHc9KHAqbS12KmIpLygyKngpLXIsTT0odipnLXAqeSkveCxBPShkKmItaCptKS8oMip4KS1pLFQ9KGgqeS1kKmcpL3gsTj1NKk0rVCpULTEsUz0yKihvK3cqTStBKlQpLEU9dyp3K0EqQS1vKm8saz0tKE4/KFMrTWF0aC5zcXJ0KFMqUy00Kk4qRSkpLygyKk4pOkUvUyk7cmV0dXJue3g6cit3K00qayx5OmkrQStUKmsscjprfX1mdW5jdGlvbiB3bCh0LG4sZSl7dmFyIHIsaSxvLGEsdT10Lngtbi54LGY9dC55LW4ueSxjPXUqdStmKmY7Yz8oaT1uLnIrZS5yLGkqPWksYT10LnIrZS5yLGk+KGEqPWEpPyhyPShjK2EtaSkvKDIqYyksbz1NYXRoLnNxcnQoTWF0aC5tYXgoMCxhL2MtcipyKSksZS54PXQueC1yKnUtbypmLGUueT10LnktcipmK28qdSk6KHI9KGMraS1hKS8oMipjKSxvPU1hdGguc3FydChNYXRoLm1heCgwLGkvYy1yKnIpKSxlLng9bi54K3IqdS1vKmYsZS55PW4ueStyKmYrbyp1KSk6KGUueD1uLngrZS5yLGUueT1uLnkpfWZ1bmN0aW9uIE1sKHQsbil7dmFyIGU9dC5yK24uci0xZS02LHI9bi54LXQueCxpPW4ueS10Lnk7cmV0dXJuIGU+MCYmZSplPnIqcitpKml9ZnVuY3Rpb24gQWwodCl7dmFyIG49dC5fLGU9dC5uZXh0Ll8scj1uLnIrZS5yLGk9KG4ueCplLnIrZS54Km4ucikvcixvPShuLnkqZS5yK2UueSpuLnIpL3I7cmV0dXJuIGkqaStvKm99ZnVuY3Rpb24gVGwodCl7dGhpcy5fPXQsdGhpcy5uZXh0PW51bGwsdGhpcy5wcmV2aW91cz1udWxsfWZ1bmN0aW9uIE5sKHQpe2lmKCEoaT10Lmxlbmd0aCkpcmV0dXJuIDA7dmFyIG4sZSxyLGksbyxhLHUsZixjLHMsbDtpZigobj10WzBdKS54PTAsbi55PTAsIShpPjEpKXJldHVybiBuLnI7aWYoZT10WzFdLG4ueD0tZS5yLGUueD1uLnIsZS55PTAsIShpPjIpKXJldHVybiBuLnIrZS5yO3dsKGUsbixyPXRbMl0pLG49bmV3IFRsKG4pLGU9bmV3IFRsKGUpLHI9bmV3IFRsKHIpLG4ubmV4dD1yLnByZXZpb3VzPWUsZS5uZXh0PW4ucHJldmlvdXM9cixyLm5leHQ9ZS5wcmV2aW91cz1uO3Q6Zm9yKHU9Mzt1PGk7Kyt1KXt3bChuLl8sZS5fLHI9dFt1XSkscj1uZXcgVGwociksZj1lLm5leHQsYz1uLnByZXZpb3VzLHM9ZS5fLnIsbD1uLl8ucjtkb3tpZihzPD1sKXtpZihNbChmLl8sci5fKSl7ZT1mLG4ubmV4dD1lLGUucHJldmlvdXM9biwtLXU7Y29udGludWUgdH1zKz1mLl8ucixmPWYubmV4dH1lbHNle2lmKE1sKGMuXyxyLl8pKXsobj1jKS5uZXh0PWUsZS5wcmV2aW91cz1uLC0tdTtjb250aW51ZSB0fWwrPWMuXy5yLGM9Yy5wcmV2aW91c319d2hpbGUoZiE9PWMubmV4dCk7Zm9yKHIucHJldmlvdXM9bixyLm5leHQ9ZSxuLm5leHQ9ZS5wcmV2aW91cz1lPXIsbz1BbChuKTsocj1yLm5leHQpIT09ZTspKGE9QWwocikpPG8mJihuPXIsbz1hKTtlPW4ubmV4dH1mb3Iobj1bZS5fXSxyPWU7KHI9ci5uZXh0KSE9PWU7KW4ucHVzaChyLl8pO2ZvcihyPXBsKG4pLHU9MDt1PGk7Kyt1KShuPXRbdV0pLngtPXIueCxuLnktPXIueTtyZXR1cm4gci5yfWZ1bmN0aW9uIFNsKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdH1mdW5jdGlvbiBFbCgpe3JldHVybiAwfWZ1bmN0aW9uIGtsKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBDbCh0KXtyZXR1cm4gTWF0aC5zcXJ0KHQudmFsdWUpfWZ1bmN0aW9uIFBsKHQpe3JldHVybiBmdW5jdGlvbihuKXtuLmNoaWxkcmVufHwobi5yPU1hdGgubWF4KDAsK3Qobil8fDApKX19ZnVuY3Rpb24gemwodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYocj1lLmNoaWxkcmVuKXt2YXIgcixpLG8sYT1yLmxlbmd0aCx1PXQoZSkqbnx8MDtpZih1KWZvcihpPTA7aTxhOysraSlyW2ldLnIrPXU7aWYobz1ObChyKSx1KWZvcihpPTA7aTxhOysraSlyW2ldLnItPXU7ZS5yPW8rdX19fWZ1bmN0aW9uIFJsKHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1uLnBhcmVudDtuLnIqPXQsZSYmKG4ueD1lLngrdCpuLngsbi55PWUueSt0Km4ueSl9fWZ1bmN0aW9uIExsKHQpe3QueDA9TWF0aC5yb3VuZCh0LngwKSx0LnkwPU1hdGgucm91bmQodC55MCksdC54MT1NYXRoLnJvdW5kKHQueDEpLHQueTE9TWF0aC5yb3VuZCh0LnkxKX1mdW5jdGlvbiBEbCh0LG4sZSxyLGkpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4sdT0tMSxmPWEubGVuZ3RoLGM9dC52YWx1ZSYmKHItbikvdC52YWx1ZTsrK3U8ZjspKG89YVt1XSkueTA9ZSxvLnkxPWksby54MD1uLG8ueDE9bis9by52YWx1ZSpjfXZhciBVbD0iJCIscWw9e2RlcHRoOi0xfSxPbD17fTtmdW5jdGlvbiBZbCh0KXtyZXR1cm4gdC5pZH1mdW5jdGlvbiBCbCh0KXtyZXR1cm4gdC5wYXJlbnRJZH1mdW5jdGlvbiBGbCh0LG4pe3JldHVybiB0LnBhcmVudD09PW4ucGFyZW50PzE6Mn1mdW5jdGlvbiBJbCh0KXt2YXIgbj10LmNoaWxkcmVuO3JldHVybiBuP25bMF06dC50fWZ1bmN0aW9uIEhsKHQpe3ZhciBuPXQuY2hpbGRyZW47cmV0dXJuIG4/bltuLmxlbmd0aC0xXTp0LnR9ZnVuY3Rpb24gamwodCxuLGUpe3ZhciByPWUvKG4uaS10LmkpO24uYy09cixuLnMrPWUsdC5jKz1yLG4ueis9ZSxuLm0rPWV9ZnVuY3Rpb24gWGwodCxuLGUpe3JldHVybiB0LmEucGFyZW50PT09bi5wYXJlbnQ/dC5hOmV9ZnVuY3Rpb24gR2wodCxuKXt0aGlzLl89dCx0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49bnVsbCx0aGlzLkE9bnVsbCx0aGlzLmE9dGhpcyx0aGlzLno9MCx0aGlzLm09MCx0aGlzLmM9MCx0aGlzLnM9MCx0aGlzLnQ9bnVsbCx0aGlzLmk9bn1mdW5jdGlvbiBWbCh0LG4sZSxyLGkpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4sdT0tMSxmPWEubGVuZ3RoLGM9dC52YWx1ZSYmKGktZSkvdC52YWx1ZTsrK3U8ZjspKG89YVt1XSkueDA9bixvLngxPXIsby55MD1lLG8ueTE9ZSs9by52YWx1ZSpjfUdsLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGhsLnByb3RvdHlwZSk7dmFyICRsPSgxK01hdGguc3FydCg1KSkvMjtmdW5jdGlvbiBXbCh0LG4sZSxyLGksbyl7Zm9yKHZhciBhLHUsZixjLHMsbCxoLGQscCx2LGcseT1bXSxfPW4uY2hpbGRyZW4sYj0wLG09MCx4PV8ubGVuZ3RoLHc9bi52YWx1ZTtiPHg7KXtmPWktZSxjPW8tcjtkb3tzPV9bbSsrXS52YWx1ZX13aGlsZSghcyYmbTx4KTtmb3IobD1oPXMsZz1zKnMqKHY9TWF0aC5tYXgoYy9mLGYvYykvKHcqdCkpLHA9TWF0aC5tYXgoaC9nLGcvbCk7bTx4OysrbSl7aWYocys9dT1fW21dLnZhbHVlLHU8bCYmKGw9dSksdT5oJiYoaD11KSxnPXMqcyp2LChkPU1hdGgubWF4KGgvZyxnL2wpKT5wKXtzLT11O2JyZWFrfXA9ZH15LnB1c2goYT17dmFsdWU6cyxkaWNlOmY8YyxjaGlsZHJlbjpfLnNsaWNlKGIsbSl9KSxhLmRpY2U/RGwoYSxlLHIsaSx3P3IrPWMqcy93Om8pOlZsKGEsZSxyLHc/ZSs9ZipzL3c6aSxvKSx3LT1zLGI9bX1yZXR1cm4geX12YXIgWmw9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSxyLGksbyl7V2wobix0LGUscixpLG8pfXJldHVybiBlLnJhdGlvPWZ1bmN0aW9uKG4pe3JldHVybiB0KChuPStuKT4xP246MSl9LGV9KCRsKTt2YXIgUWw9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSxyLGksbyl7aWYoKGE9dC5fc3F1YXJpZnkpJiZhLnJhdGlvPT09bilmb3IodmFyIGEsdSxmLGMscyxsPS0xLGg9YS5sZW5ndGgsZD10LnZhbHVlOysrbDxoOyl7Zm9yKGY9KHU9YVtsXSkuY2hpbGRyZW4sYz11LnZhbHVlPTAscz1mLmxlbmd0aDtjPHM7KytjKXUudmFsdWUrPWZbY10udmFsdWU7dS5kaWNlP0RsKHUsZSxyLGkscis9KG8tcikqdS52YWx1ZS9kKTpWbCh1LGUscixlKz0oaS1lKSp1LnZhbHVlL2QsbyksZC09dS52YWx1ZX1lbHNlIHQuX3NxdWFyaWZ5PWE9V2wobix0LGUscixpLG8pLGEucmF0aW89bn1yZXR1cm4gZS5yYXRpbz1mdW5jdGlvbihuKXtyZXR1cm4gdCgobj0rbik+MT9uOjEpfSxlfSgkbCk7ZnVuY3Rpb24gSmwodCxuKXtyZXR1cm4gdFswXS1uWzBdfHx0WzFdLW5bMV19ZnVuY3Rpb24gS2wodCl7Zm9yKHZhciBuLGUscixpPXQubGVuZ3RoLG89WzAsMV0sYT0yLHU9Mjt1PGk7Kyt1KXtmb3IoO2E+MSYmKG49dFtvW2EtMl1dLGU9dFtvW2EtMV1dLHI9dFt1XSwoZVswXS1uWzBdKSooclsxXS1uWzFdKS0oZVsxXS1uWzFdKSooclswXS1uWzBdKTw9MCk7KS0tYTtvW2ErK109dX1yZXR1cm4gby5zbGljZSgwLGEpfWZ1bmN0aW9uIHRoKCl7cmV0dXJuIE1hdGgucmFuZG9tKCl9dmFyIG5oPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUpe3JldHVybiB0PW51bGw9PXQ/MDordCxlPW51bGw9PWU/MTorZSwxPT09YXJndW1lbnRzLmxlbmd0aD8oZT10LHQ9MCk6ZS09dCxmdW5jdGlvbigpe3JldHVybiBuKCkqZSt0fX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0aCksZWg9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSl7dmFyIHIsaTtyZXR1cm4gdD1udWxsPT10PzA6K3QsZT1udWxsPT1lPzE6K2UsZnVuY3Rpb24oKXt2YXIgbztpZihudWxsIT1yKW89cixyPW51bGw7ZWxzZSBkb3tyPTIqbigpLTEsbz0yKm4oKS0xLGk9cipyK28qb313aGlsZSghaXx8aT4xKTtyZXR1cm4gdCtlKm8qTWF0aC5zcXJ0KC0yKk1hdGgubG9nKGkpL2kpfX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0aCkscmg9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKCl7dmFyIHQ9ZWguc291cmNlKG4pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5leHAodCgpKX19cmV0dXJuIGUuc291cmNlPXQsZX0odGgpLGloPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9MCxyPTA7cjx0OysrcillKz1uKCk7cmV0dXJuIGV9fXJldHVybiBlLnNvdXJjZT10LGV9KHRoKSxvaD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7dmFyIGU9aWguc291cmNlKG4pKHQpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlKCkvdH19cmV0dXJuIGUuc291cmNlPXQsZX0odGgpLGFoPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4tTWF0aC5sb2coMS1uKCkpL3R9fXJldHVybiBlLnNvdXJjZT10LGV9KHRoKSx1aD1BcnJheS5wcm90b3R5cGUsZmg9dWgubWFwLGNoPXVoLnNsaWNlLHNoPXtuYW1lOiJpbXBsaWNpdCJ9O2Z1bmN0aW9uIGxoKHQpe3ZhciBuPUtpKCksZT1bXSxyPXNoO2Z1bmN0aW9uIGkoaSl7dmFyIG89aSsiIixhPW4uZ2V0KG8pO2lmKCFhKXtpZihyIT09c2gpcmV0dXJuIHI7bi5zZXQobyxhPWUucHVzaChpKSl9cmV0dXJuIHRbKGEtMSkldC5sZW5ndGhdfXJldHVybiB0PW51bGw9PXQ/W106Y2guY2FsbCh0KSxpLmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZS5zbGljZSgpO2U9W10sbj1LaSgpO2Zvcih2YXIgcixvLGE9LTEsdT10Lmxlbmd0aDsrK2E8dTspbi5oYXMobz0ocj10W2FdKSsiIil8fG4uc2V0KG8sZS5wdXNoKHIpKTtyZXR1cm4gaX0saS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1jaC5jYWxsKG4pLGkpOnQuc2xpY2UoKX0saS51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsaSk6cn0saS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGxoKCkuZG9tYWluKGUpLnJhbmdlKHQpLnVua25vd24ocil9LGl9ZnVuY3Rpb24gaGgoKXt2YXIgdCxuLGU9bGgoKS51bmtub3duKHZvaWQgMCkscj1lLmRvbWFpbixpPWUucmFuZ2Usbz1bMCwxXSxhPSExLHU9MCxmPTAsYz0uNTtmdW5jdGlvbiBzKCl7dmFyIGU9cigpLmxlbmd0aCxzPW9bMV08b1swXSxsPW9bcy0wXSxoPW9bMS1zXTt0PShoLWwpL01hdGgubWF4KDEsZS11KzIqZiksYSYmKHQ9TWF0aC5mbG9vcih0KSksbCs9KGgtbC10KihlLXUpKSpjLG49dCooMS11KSxhJiYobD1NYXRoLnJvdW5kKGwpLG49TWF0aC5yb3VuZChuKSk7dmFyIGQ9ZyhlKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIGwrdCpufSk7cmV0dXJuIGkocz9kLnJldmVyc2UoKTpkKX1yZXR1cm4gZGVsZXRlIGUudW5rbm93bixlLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocih0KSxzKCkpOnIoKX0sZS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1bK3RbMF0sK3RbMV1dLHMoKSk6by5zbGljZSgpfSxlLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG89Wyt0WzBdLCt0WzFdXSxhPSEwLHMoKX0sZS5iYW5kd2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gbn0sZS5zdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGUucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ISF0LHMoKSk6YX0sZS5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWY9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSxzKCkpOnV9LGUucGFkZGluZ0lubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkscygpKTp1fSxlLnBhZGRpbmdPdXRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHMoKSk6Zn0sZS5hbGlnbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHMoKSk6Y30sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGhoKCkuZG9tYWluKHIoKSkucmFuZ2Uobykucm91bmQoYSkucGFkZGluZ0lubmVyKHUpLnBhZGRpbmdPdXRlcihmKS5hbGlnbihjKX0scygpfWZ1bmN0aW9uIGRoKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBwaCh0KXtyZXR1cm4rdH12YXIgdmg9WzAsMV07ZnVuY3Rpb24gZ2godCxuKXtyZXR1cm4obi09dD0rdCk/ZnVuY3Rpb24oZSl7cmV0dXJuKGUtdCkvbn06ZGgobil9ZnVuY3Rpb24geWgodCxuLGUscil7dmFyIGk9dFswXSxvPXRbMV0sYT1uWzBdLHU9blsxXTtyZXR1cm4gbzxpPyhpPWUobyxpKSxhPXIodSxhKSk6KGk9ZShpLG8pLGE9cihhLHUpKSxmdW5jdGlvbih0KXtyZXR1cm4gYShpKHQpKX19ZnVuY3Rpb24gX2godCxuLGUscil7dmFyIG89TWF0aC5taW4odC5sZW5ndGgsbi5sZW5ndGgpLTEsYT1uZXcgQXJyYXkobyksdT1uZXcgQXJyYXkobyksZj0tMTtmb3IodFtvXTx0WzBdJiYodD10LnNsaWNlKCkucmV2ZXJzZSgpLG49bi5zbGljZSgpLnJldmVyc2UoKSk7KytmPG87KWFbZl09ZSh0W2ZdLHRbZisxXSksdVtmXT1yKG5bZl0sbltmKzFdKTtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9aSh0LG4sMSxvKS0xO3JldHVybiB1W2VdKGFbZV0obikpfX1mdW5jdGlvbiBiaCh0LG4pe3JldHVybiBuLmRvbWFpbih0LmRvbWFpbigpKS5yYW5nZSh0LnJhbmdlKCkpLmludGVycG9sYXRlKHQuaW50ZXJwb2xhdGUoKSkuY2xhbXAodC5jbGFtcCgpKX1mdW5jdGlvbiBtaCh0LG4pe3ZhciBlLHIsaSxvPXZoLGE9dmgsdT1tZSxmPSExO2Z1bmN0aW9uIGMoKXtyZXR1cm4gZT1NYXRoLm1pbihvLmxlbmd0aCxhLmxlbmd0aCk+Mj9faDp5aCxyPWk9bnVsbCxzfWZ1bmN0aW9uIHMobil7cmV0dXJuKHJ8fChyPWUobyxhLGY/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9dChuPStuLGU9K2UpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdDw9bj8wOnQ+PWU/MTpyKHQpfX19KHQpOnQsdSkpKSgrbil9cmV0dXJuIHMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybihpfHwoaT1lKGEsbyxnaCxmP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXQobj0rbixlPStlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ8PTA/bjp0Pj0xP2U6cih0KX19fShuKTpuKSkpKCt0KX0scy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ZmguY2FsbCh0LHBoKSxjKCkpOm8uc2xpY2UoKX0scy5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1jaC5jYWxsKHQpLGMoKSk6YS5zbGljZSgpfSxzLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGE9Y2guY2FsbCh0KSx1PXhlLGMoKX0scy5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0hIXQsYygpKTpmfSxzLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsYygpKTp1fSxjKCl9ZnVuY3Rpb24geGgobil7dmFyIGU9bi5kb21haW47cmV0dXJuIG4udGlja3M9ZnVuY3Rpb24odCl7dmFyIG49ZSgpO3JldHVybiBtKG5bMF0sbltuLmxlbmd0aC0xXSxudWxsPT10PzEwOnQpfSxuLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obixyKXtyZXR1cm4gZnVuY3Rpb24obixlLHIpe3ZhciBpLG89blswXSxhPW5bbi5sZW5ndGgtMV0sdT13KG8sYSxudWxsPT1lPzEwOmUpO3N3aXRjaCgocj1iYShudWxsPT1yPyIsZiI6cikpLnR5cGUpe2Nhc2UicyI6dmFyIGY9TWF0aC5tYXgoTWF0aC5hYnMobyksTWF0aC5hYnMoYSkpO3JldHVybiBudWxsIT1yLnByZWNpc2lvbnx8aXNOYU4oaT1rYSh1LGYpKXx8KHIucHJlY2lzaW9uPWkpLHQuZm9ybWF0UHJlZml4KHIsZik7Y2FzZSIiOmNhc2UiZSI6Y2FzZSJnIjpjYXNlInAiOmNhc2UiciI6bnVsbCE9ci5wcmVjaXNpb258fGlzTmFOKGk9Q2EodSxNYXRoLm1heChNYXRoLmFicyhvKSxNYXRoLmFicyhhKSkpKXx8KHIucHJlY2lzaW9uPWktKCJlIj09PXIudHlwZSkpO2JyZWFrO2Nhc2UiZiI6Y2FzZSIlIjpudWxsIT1yLnByZWNpc2lvbnx8aXNOYU4oaT1FYSh1KSl8fChyLnByZWNpc2lvbj1pLTIqKCIlIj09PXIudHlwZSkpfXJldHVybiB0LmZvcm1hdChyKX0oZSgpLG4scil9LG4ubmljZT1mdW5jdGlvbih0KXtudWxsPT10JiYodD0xMCk7dmFyIHIsaT1lKCksbz0wLGE9aS5sZW5ndGgtMSx1PWlbb10sZj1pW2FdO3JldHVybiBmPHUmJihyPXUsdT1mLGY9cixyPW8sbz1hLGE9ciksKHI9eCh1LGYsdCkpPjA/cj14KHU9TWF0aC5mbG9vcih1L3IpKnIsZj1NYXRoLmNlaWwoZi9yKSpyLHQpOnI8MCYmKHI9eCh1PU1hdGguY2VpbCh1KnIpL3IsZj1NYXRoLmZsb29yKGYqcikvcix0KSkscj4wPyhpW29dPU1hdGguZmxvb3IodS9yKSpyLGlbYV09TWF0aC5jZWlsKGYvcikqcixlKGkpKTpyPDAmJihpW29dPU1hdGguY2VpbCh1KnIpL3IsaVthXT1NYXRoLmZsb29yKGYqcikvcixlKGkpKSxufSxufWZ1bmN0aW9uIHdoKHQsbil7dmFyIGUscj0wLGk9KHQ9dC5zbGljZSgpKS5sZW5ndGgtMSxvPXRbcl0sYT10W2ldO3JldHVybiBhPG8mJihlPXIscj1pLGk9ZSxlPW8sbz1hLGE9ZSksdFtyXT1uLmZsb29yKG8pLHRbaV09bi5jZWlsKGEpLHR9ZnVuY3Rpb24gTWgodCxuKXtyZXR1cm4obj1NYXRoLmxvZyhuL3QpKT9mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5sb2coZS90KS9ufTpkaChuKX1mdW5jdGlvbiBBaCh0LG4pe3JldHVybiB0PDA/ZnVuY3Rpb24oZSl7cmV0dXJuLU1hdGgucG93KC1uLGUpKk1hdGgucG93KC10LDEtZSl9OmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnBvdyhuLGUpKk1hdGgucG93KHQsMS1lKX19ZnVuY3Rpb24gVGgodCl7cmV0dXJuIGlzRmluaXRlKHQpPysoIjFlIit0KTp0PDA/MDp0fWZ1bmN0aW9uIE5oKHQpe3JldHVybiAxMD09PXQ/VGg6dD09PU1hdGguRT9NYXRoLmV4cDpmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5wb3codCxuKX19ZnVuY3Rpb24gU2godCl7cmV0dXJuIHQ9PT1NYXRoLkU/TWF0aC5sb2c6MTA9PT10JiZNYXRoLmxvZzEwfHwyPT09dCYmTWF0aC5sb2cyfHwodD1NYXRoLmxvZyh0KSxmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5sb2cobikvdH0pfWZ1bmN0aW9uIEVoKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4tdCgtbil9fWZ1bmN0aW9uIGtoKHQsbil7cmV0dXJuIHQ8MD8tTWF0aC5wb3coLXQsbik6TWF0aC5wb3codCxuKX1mdW5jdGlvbiBDaCgpe3ZhciB0PTEsbj1taChmdW5jdGlvbihuLGUpe3JldHVybihlPWtoKGUsdCktKG49a2gobix0KSkpP2Z1bmN0aW9uKHIpe3JldHVybihraChyLHQpLW4pL2V9OmRoKGUpfSxmdW5jdGlvbihuLGUpe3JldHVybiBlPWtoKGUsdCktKG49a2gobix0KSksZnVuY3Rpb24ocil7cmV0dXJuIGtoKG4rZSpyLDEvdCl9fSksZT1uLmRvbWFpbjtyZXR1cm4gbi5leHBvbmVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rbixlKGUoKSkpOnR9LG4uY29weT1mdW5jdGlvbigpe3JldHVybiBiaChuLENoKCkuZXhwb25lbnQodCkpfSx4aChuKX12YXIgUGg9bmV3IERhdGUsemg9bmV3IERhdGU7ZnVuY3Rpb24gUmgodCxuLGUscil7ZnVuY3Rpb24gaShuKXtyZXR1cm4gdChuPW5ldyBEYXRlKCtuKSksbn1yZXR1cm4gaS5mbG9vcj1pLGkuY2VpbD1mdW5jdGlvbihlKXtyZXR1cm4gdChlPW5ldyBEYXRlKGUtMSkpLG4oZSwxKSx0KGUpLGV9LGkucm91bmQ9ZnVuY3Rpb24odCl7dmFyIG49aSh0KSxlPWkuY2VpbCh0KTtyZXR1cm4gdC1uPGUtdD9uOmV9LGkub2Zmc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odD1uZXcgRGF0ZSgrdCksbnVsbD09ZT8xOk1hdGguZmxvb3IoZSkpLHR9LGkucmFuZ2U9ZnVuY3Rpb24oZSxyLG8pe3ZhciBhLHU9W107aWYoZT1pLmNlaWwoZSksbz1udWxsPT1vPzE6TWF0aC5mbG9vcihvKSwhKGU8ciYmbz4wKSlyZXR1cm4gdTtkb3t1LnB1c2goYT1uZXcgRGF0ZSgrZSkpLG4oZSxvKSx0KGUpfXdoaWxlKGE8ZSYmZTxyKTtyZXR1cm4gdX0saS5maWx0ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIFJoKGZ1bmN0aW9uKG4pe2lmKG4+PW4pZm9yKDt0KG4pLCFlKG4pOyluLnNldFRpbWUobi0xKX0sZnVuY3Rpb24odCxyKXtpZih0Pj10KWlmKHI8MClmb3IoOysrcjw9MDspZm9yKDtuKHQsLTEpLCFlKHQpOyk7ZWxzZSBmb3IoOy0tcj49MDspZm9yKDtuKHQsMSksIWUodCk7KTt9KX0sZSYmKGkuY291bnQ9ZnVuY3Rpb24obixyKXtyZXR1cm4gUGguc2V0VGltZSgrbiksemguc2V0VGltZSgrciksdChQaCksdCh6aCksTWF0aC5mbG9vcihlKFBoLHpoKSl9LGkuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9pLmZpbHRlcihyP2Z1bmN0aW9uKG4pe3JldHVybiByKG4pJXQ9PTB9OmZ1bmN0aW9uKG4pe3JldHVybiBpLmNvdW50KDAsbikldD09MH0pOmk6bnVsbH0pLGl9dmFyIExoPVJoKGZ1bmN0aW9uKCl7fSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4gbi10fSk7TGguZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9SaChmdW5jdGlvbihuKXtuLnNldFRpbWUoTWF0aC5mbG9vcihuL3QpKnQpfSxmdW5jdGlvbihuLGUpe24uc2V0VGltZSgrbitlKnQpfSxmdW5jdGlvbihuLGUpe3JldHVybihlLW4pL3R9KTpMaDpudWxsfTt2YXIgRGg9TGgucmFuZ2UsVWg9NmU0LHFoPTYwNDhlNSxPaD1SaChmdW5jdGlvbih0KXt0LnNldFRpbWUoMWUzKk1hdGguZmxvb3IodC8xZTMpKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrMWUzKm4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzFlM30sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDU2Vjb25kcygpfSksWWg9T2gucmFuZ2UsQmg9UmgoZnVuY3Rpb24odCl7dC5zZXRUaW1lKE1hdGguZmxvb3IodC9VaCkqVWgpfSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKlVoKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS9VaH0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TWludXRlcygpfSksRmg9QmgucmFuZ2UsSWg9UmgoZnVuY3Rpb24odCl7dmFyIG49dC5nZXRUaW1lem9uZU9mZnNldCgpKlVoJTM2ZTU7bjwwJiYobis9MzZlNSksdC5zZXRUaW1lKDM2ZTUqTWF0aC5mbG9vcigoK3QtbikvMzZlNSkrbil9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzM2ZTUqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvMzZlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0SG91cnMoKX0pLEhoPUloLnJhbmdlLGpoPVJoKGZ1bmN0aW9uKHQpe3Quc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQtKG4uZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKlVoKS84NjRlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RGF0ZSgpLTF9KSxYaD1qaC5yYW5nZTtmdW5jdGlvbiBHaCh0KXtyZXR1cm4gUmgoZnVuY3Rpb24obil7bi5zZXREYXRlKG4uZ2V0RGF0ZSgpLShuLmdldERheSgpKzctdCklNyksbi5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldERhdGUodC5nZXREYXRlKCkrNypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10LShuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSpVaCkvcWh9KX12YXIgVmg9R2goMCksJGg9R2goMSksV2g9R2goMiksWmg9R2goMyksUWg9R2goNCksSmg9R2goNSksS2g9R2goNiksdGQ9VmgucmFuZ2UsbmQ9JGgucmFuZ2UsZWQ9V2gucmFuZ2UscmQ9WmgucmFuZ2UsaWQ9UWgucmFuZ2Usb2Q9SmgucmFuZ2UsYWQ9S2gucmFuZ2UsdWQ9UmgoZnVuY3Rpb24odCl7dC5zZXREYXRlKDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRNb250aCh0LmdldE1vbnRoKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0TW9udGgoKS10LmdldE1vbnRoKCkrMTIqKG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCkpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNb250aCgpfSksZmQ9dWQucmFuZ2UsY2Q9UmgoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRGdWxsWWVhcih0LmdldEZ1bGxZZWFyKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KTtjZC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP1JoKGZ1bmN0aW9uKG4pe24uc2V0RnVsbFllYXIoTWF0aC5mbG9vcihuLmdldEZ1bGxZZWFyKCkvdCkqdCksbi5zZXRNb250aCgwLDEpLG4uc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKG4sZSl7bi5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCkrZSp0KX0pOm51bGx9O3ZhciBzZD1jZC5yYW5nZSxsZD1SaChmdW5jdGlvbih0KXt0LnNldFVUQ1NlY29uZHMoMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipVaCl9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvVWh9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01pbnV0ZXMoKX0pLGhkPWxkLnJhbmdlLGRkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTWludXRlcygwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzM2ZTUqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvMzZlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDSG91cnMoKX0pLHBkPWRkLnJhbmdlLHZkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzg2NGU1fSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENEYXRlKCktMX0pLGdkPXZkLnJhbmdlO2Z1bmN0aW9uIHlkKHQpe3JldHVybiBSaChmdW5jdGlvbihuKXtuLnNldFVUQ0RhdGUobi5nZXRVVENEYXRlKCktKG4uZ2V0VVRDRGF5KCkrNy10KSU3KSxuLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRGF0ZSh0LmdldFVUQ0RhdGUoKSs3Km4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL3FofSl9dmFyIF9kPXlkKDApLGJkPXlkKDEpLG1kPXlkKDIpLHhkPXlkKDMpLHdkPXlkKDQpLE1kPXlkKDUpLEFkPXlkKDYpLFRkPV9kLnJhbmdlLE5kPWJkLnJhbmdlLFNkPW1kLnJhbmdlLEVkPXhkLnJhbmdlLGtkPXdkLnJhbmdlLENkPU1kLnJhbmdlLFBkPUFkLnJhbmdlLHpkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDRGF0ZSgxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDTW9udGgodC5nZXRVVENNb250aCgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ01vbnRoKCktdC5nZXRVVENNb250aCgpKzEyKihuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTW9udGgoKX0pLFJkPXpkLnJhbmdlLExkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTW9udGgoMCwxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRnVsbFllYXIodC5nZXRVVENGdWxsWWVhcigpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENGdWxsWWVhcigpfSk7TGQuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9SaChmdW5jdGlvbihuKXtuLnNldFVUQ0Z1bGxZZWFyKE1hdGguZmxvb3Iobi5nZXRVVENGdWxsWWVhcigpL3QpKnQpLG4uc2V0VVRDTW9udGgoMCwxKSxuLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihuLGUpe24uc2V0VVRDRnVsbFllYXIobi5nZXRVVENGdWxsWWVhcigpK2UqdCl9KTpudWxsfTt2YXIgRGQ9TGQucmFuZ2U7ZnVuY3Rpb24gVWQodCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgbj1uZXcgRGF0ZSgtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCk7cmV0dXJuIG4uc2V0RnVsbFllYXIodC55KSxufXJldHVybiBuZXcgRGF0ZSh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpfWZ1bmN0aW9uIHFkKHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIG49bmV3IERhdGUoRGF0ZS5VVEMoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKTtyZXR1cm4gbi5zZXRVVENGdWxsWWVhcih0LnkpLG59cmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHQueSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpfWZ1bmN0aW9uIE9kKHQpe3JldHVybnt5OnQsbTowLGQ6MSxIOjAsTTowLFM6MCxMOjB9fWZ1bmN0aW9uIFlkKHQpe3ZhciBuPXQuZGF0ZVRpbWUsZT10LmRhdGUscj10LnRpbWUsaT10LnBlcmlvZHMsbz10LmRheXMsYT10LnNob3J0RGF5cyx1PXQubW9udGhzLGY9dC5zaG9ydE1vbnRocyxjPVZkKGkpLHM9JGQoaSksbD1WZChvKSxoPSRkKG8pLGQ9VmQoYSkscD0kZChhKSx2PVZkKHUpLGc9JGQodSkseT1WZChmKSxfPSRkKGYpLGI9e2E6ZnVuY3Rpb24odCl7cmV0dXJuIGFbdC5nZXREYXkoKV19LEE6ZnVuY3Rpb24odCl7cmV0dXJuIG9bdC5nZXREYXkoKV19LGI6ZnVuY3Rpb24odCl7cmV0dXJuIGZbdC5nZXRNb250aCgpXX0sQjpmdW5jdGlvbih0KXtyZXR1cm4gdVt0LmdldE1vbnRoKCldfSxjOm51bGwsZDpwcCxlOnBwLGY6YnAsSDp2cCxJOmdwLGo6eXAsTDpfcCxtOm1wLE06eHAscDpmdW5jdGlvbih0KXtyZXR1cm4gaVsrKHQuZ2V0SG91cnMoKT49MTIpXX0sUTpXcCxzOlpwLFM6d3AsdTpNcCxVOkFwLFY6VHAsdzpOcCxXOlNwLHg6bnVsbCxYOm51bGwseTpFcCxZOmtwLFo6Q3AsIiUiOiRwfSxtPXthOmZ1bmN0aW9uKHQpe3JldHVybiBhW3QuZ2V0VVRDRGF5KCldfSxBOmZ1bmN0aW9uKHQpe3JldHVybiBvW3QuZ2V0VVRDRGF5KCldfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBmW3QuZ2V0VVRDTW9udGgoKV19LEI6ZnVuY3Rpb24odCl7cmV0dXJuIHVbdC5nZXRVVENNb250aCgpXX0sYzpudWxsLGQ6UHAsZTpQcCxmOlVwLEg6enAsSTpScCxqOkxwLEw6RHAsbTpxcCxNOk9wLHA6ZnVuY3Rpb24odCl7cmV0dXJuIGlbKyh0LmdldFVUQ0hvdXJzKCk+PTEyKV19LFE6V3AsczpacCxTOllwLHU6QnAsVTpGcCxWOklwLHc6SHAsVzpqcCx4Om51bGwsWDpudWxsLHk6WHAsWTpHcCxaOlZwLCIlIjokcH0seD17YTpmdW5jdGlvbih0LG4sZSl7dmFyIHI9ZC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lnc9cFtyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxBOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj1sLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQudz1oW3JbMF0udG9Mb3dlckNhc2UoKV0sZStyWzBdLmxlbmd0aCk6LTF9LGI6ZnVuY3Rpb24odCxuLGUpe3ZhciByPXkuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5tPV9bclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX0sQjpmdW5jdGlvbih0LG4sZSl7dmFyIHI9di5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lm09Z1tyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxjOmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gQSh0LG4sZSxyKX0sZDppcCxlOmlwLGY6c3AsSDphcCxJOmFwLGo6b3AsTDpjcCxtOnJwLE06dXAscDpmdW5jdGlvbih0LG4sZSl7dmFyIHI9Yy5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LnA9c1tyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxROmhwLHM6ZHAsUzpmcCx1OlpkLFU6UWQsVjpKZCx3OldkLFc6S2QseDpmdW5jdGlvbih0LG4scil7cmV0dXJuIEEodCxlLG4scil9LFg6ZnVuY3Rpb24odCxuLGUpe3JldHVybiBBKHQscixuLGUpfSx5Om5wLFk6dHAsWjplcCwiJSI6bHB9O2Z1bmN0aW9uIHcodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHIsaSxvLGE9W10sdT0tMSxmPTAsYz10Lmxlbmd0aDtmb3IoZSBpbnN0YW5jZW9mIERhdGV8fChlPW5ldyBEYXRlKCtlKSk7Kyt1PGM7KTM3PT09dC5jaGFyQ29kZUF0KHUpJiYoYS5wdXNoKHQuc2xpY2UoZix1KSksbnVsbCE9KGk9RmRbcj10LmNoYXJBdCgrK3UpXSk/cj10LmNoYXJBdCgrK3UpOmk9ImUiPT09cj8iICI6IjAiLChvPW5bcl0pJiYocj1vKGUsaSkpLGEucHVzaChyKSxmPXUrMSk7cmV0dXJuIGEucHVzaCh0LnNsaWNlKGYsdSkpLGEuam9pbigiIil9fWZ1bmN0aW9uIE0odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHIsaSxvPU9kKDE5MDApO2lmKEEobyx0LGUrPSIiLDApIT1lLmxlbmd0aClyZXR1cm4gbnVsbDtpZigiUSJpbiBvKXJldHVybiBuZXcgRGF0ZShvLlEpO2lmKCJwImluIG8mJihvLkg9by5IJTEyKzEyKm8ucCksIlYiaW4gbyl7aWYoby5WPDF8fG8uVj41MylyZXR1cm4gbnVsbDsidyJpbiBvfHwoby53PTEpLCJaImluIG8/KGk9KHI9cWQoT2Qoby55KSkpLmdldFVUQ0RheSgpLHI9aT40fHwwPT09aT9iZC5jZWlsKHIpOmJkKHIpLHI9dmQub2Zmc2V0KHIsNyooby5WLTEpKSxvLnk9ci5nZXRVVENGdWxsWWVhcigpLG8ubT1yLmdldFVUQ01vbnRoKCksby5kPXIuZ2V0VVRDRGF0ZSgpKyhvLncrNiklNyk6KGk9KHI9bihPZChvLnkpKSkuZ2V0RGF5KCkscj1pPjR8fDA9PT1pPyRoLmNlaWwocik6JGgocikscj1qaC5vZmZzZXQociw3KihvLlYtMSkpLG8ueT1yLmdldEZ1bGxZZWFyKCksby5tPXIuZ2V0TW9udGgoKSxvLmQ9ci5nZXREYXRlKCkrKG8udys2KSU3KX1lbHNlKCJXImluIG98fCJVImluIG8pJiYoInciaW4gb3x8KG8udz0idSJpbiBvP28udSU3OiJXImluIG8/MTowKSxpPSJaImluIG8/cWQoT2Qoby55KSkuZ2V0VVRDRGF5KCk6bihPZChvLnkpKS5nZXREYXkoKSxvLm09MCxvLmQ9IlciaW4gbz8oby53KzYpJTcrNypvLlctKGkrNSklNzpvLncrNypvLlUtKGkrNiklNyk7cmV0dXJuIloiaW4gbz8oby5IKz1vLlovMTAwfDAsby5NKz1vLlolMTAwLHFkKG8pKTpuKG8pfX1mdW5jdGlvbiBBKHQsbixlLHIpe2Zvcih2YXIgaSxvLGE9MCx1PW4ubGVuZ3RoLGY9ZS5sZW5ndGg7YTx1Oyl7aWYocj49ZilyZXR1cm4tMTtpZigzNz09PShpPW4uY2hhckNvZGVBdChhKyspKSl7aWYoaT1uLmNoYXJBdChhKyspLCEobz14W2kgaW4gRmQ/bi5jaGFyQXQoYSsrKTppXSl8fChyPW8odCxlLHIpKTwwKXJldHVybi0xfWVsc2UgaWYoaSE9ZS5jaGFyQ29kZUF0KHIrKykpcmV0dXJuLTF9cmV0dXJuIHJ9cmV0dXJuIGIueD13KGUsYiksYi5YPXcocixiKSxiLmM9dyhuLGIpLG0ueD13KGUsbSksbS5YPXcocixtKSxtLmM9dyhuLG0pLHtmb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIG49dyh0Kz0iIixiKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSxwYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1NKHQrPSIiLFVkKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNGb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIG49dyh0Kz0iIixtKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNQYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1NKHQscWQpO3JldHVybiBuLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LG59fX12YXIgQmQsRmQ9eyItIjoiIixfOiIgIiwwOiIwIn0sSWQ9L15ccypcZCsvLEhkPS9eJS8samQ9L1tcXF4kKis/fFtcXSgpLnt9XS9nO2Z1bmN0aW9uIFhkKHQsbixlKXt2YXIgcj10PDA/Ii0iOiIiLGk9KHI/LXQ6dCkrIiIsbz1pLmxlbmd0aDtyZXR1cm4gcisobzxlP25ldyBBcnJheShlLW8rMSkuam9pbihuKStpOmkpfWZ1bmN0aW9uIEdkKHQpe3JldHVybiB0LnJlcGxhY2UoamQsIlxcJCYiKX1mdW5jdGlvbiBWZCh0KXtyZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIrdC5tYXAoR2QpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiAkZCh0KXtmb3IodmFyIG49e30sZT0tMSxyPXQubGVuZ3RoOysrZTxyOyluW3RbZV0udG9Mb3dlckNhc2UoKV09ZTtyZXR1cm4gbn1mdW5jdGlvbiBXZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/KHQudz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBaZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/KHQudT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBRZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVj0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBLZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB0cCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSs0KSk7cmV0dXJuIHI/KHQueT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBucCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQueT0rclswXSsoK3JbMF0+Njg/MTkwMDoyZTMpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGVwKHQsbixlKXt2YXIgcj0vXihaKXwoWystXVxkXGQpKD86Oj8oXGRcZCkpPy8uZXhlYyhuLnNsaWNlKGUsZSs2KSk7cmV0dXJuIHI/KHQuWj1yWzFdPzA6LShyWzJdKyhyWzNdfHwiMDAiKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcnAodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lm09clswXS0xLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGlwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG9wKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8odC5tPTAsdC5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGFwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5IPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHVwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5NPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGZwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5TPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGNwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8odC5MPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHNwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzYpKTtyZXR1cm4gcj8odC5MPU1hdGguZmxvb3IoclswXS8xZTMpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGxwKHQsbixlKXt2YXIgcj1IZC5leGVjKG4uc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj9lK3JbMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGhwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LlE9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gZHAodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQuUT0xZTMqK3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcHAodCxuKXtyZXR1cm4gWGQodC5nZXREYXRlKCksbiwyKX1mdW5jdGlvbiB2cCh0LG4pe3JldHVybiBYZCh0LmdldEhvdXJzKCksbiwyKX1mdW5jdGlvbiBncCh0LG4pe3JldHVybiBYZCh0LmdldEhvdXJzKCklMTJ8fDEyLG4sMil9ZnVuY3Rpb24geXAodCxuKXtyZXR1cm4gWGQoMStqaC5jb3VudChjZCh0KSx0KSxuLDMpfWZ1bmN0aW9uIF9wKHQsbil7cmV0dXJuIFhkKHQuZ2V0TWlsbGlzZWNvbmRzKCksbiwzKX1mdW5jdGlvbiBicCh0LG4pe3JldHVybiBfcCh0LG4pKyIwMDAifWZ1bmN0aW9uIG1wKHQsbil7cmV0dXJuIFhkKHQuZ2V0TW9udGgoKSsxLG4sMil9ZnVuY3Rpb24geHAodCxuKXtyZXR1cm4gWGQodC5nZXRNaW51dGVzKCksbiwyKX1mdW5jdGlvbiB3cCh0LG4pe3JldHVybiBYZCh0LmdldFNlY29uZHMoKSxuLDIpfWZ1bmN0aW9uIE1wKHQpe3ZhciBuPXQuZ2V0RGF5KCk7cmV0dXJuIDA9PT1uPzc6bn1mdW5jdGlvbiBBcCh0LG4pe3JldHVybiBYZChWaC5jb3VudChjZCh0KSx0KSxuLDIpfWZ1bmN0aW9uIFRwKHQsbil7dmFyIGU9dC5nZXREYXkoKTtyZXR1cm4gdD1lPj00fHwwPT09ZT9RaCh0KTpRaC5jZWlsKHQpLFhkKFFoLmNvdW50KGNkKHQpLHQpKyg0PT09Y2QodCkuZ2V0RGF5KCkpLG4sMil9ZnVuY3Rpb24gTnAodCl7cmV0dXJuIHQuZ2V0RGF5KCl9ZnVuY3Rpb24gU3AodCxuKXtyZXR1cm4gWGQoJGguY291bnQoY2QodCksdCksbiwyKX1mdW5jdGlvbiBFcCh0LG4pe3JldHVybiBYZCh0LmdldEZ1bGxZZWFyKCklMTAwLG4sMil9ZnVuY3Rpb24ga3AodCxuKXtyZXR1cm4gWGQodC5nZXRGdWxsWWVhcigpJTFlNCxuLDQpfWZ1bmN0aW9uIENwKHQpe3ZhciBuPXQuZ2V0VGltZXpvbmVPZmZzZXQoKTtyZXR1cm4obj4wPyItIjoobio9LTEsIisiKSkrWGQobi82MHwwLCIwIiwyKStYZChuJTYwLCIwIiwyKX1mdW5jdGlvbiBQcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0RhdGUoKSxuLDIpfWZ1bmN0aW9uIHpwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDSG91cnMoKSxuLDIpfWZ1bmN0aW9uIFJwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDSG91cnMoKSUxMnx8MTIsbiwyKX1mdW5jdGlvbiBMcCh0LG4pe3JldHVybiBYZCgxK3ZkLmNvdW50KExkKHQpLHQpLG4sMyl9ZnVuY3Rpb24gRHAodCxuKXtyZXR1cm4gWGQodC5nZXRVVENNaWxsaXNlY29uZHMoKSxuLDMpfWZ1bmN0aW9uIFVwKHQsbil7cmV0dXJuIERwKHQsbikrIjAwMCJ9ZnVuY3Rpb24gcXAodCxuKXtyZXR1cm4gWGQodC5nZXRVVENNb250aCgpKzEsbiwyKX1mdW5jdGlvbiBPcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ01pbnV0ZXMoKSxuLDIpfWZ1bmN0aW9uIFlwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDU2Vjb25kcygpLG4sMil9ZnVuY3Rpb24gQnAodCl7dmFyIG49dC5nZXRVVENEYXkoKTtyZXR1cm4gMD09PW4/NzpufWZ1bmN0aW9uIEZwKHQsbil7cmV0dXJuIFhkKF9kLmNvdW50KExkKHQpLHQpLG4sMil9ZnVuY3Rpb24gSXAodCxuKXt2YXIgZT10LmdldFVUQ0RheSgpO3JldHVybiB0PWU+PTR8fDA9PT1lP3dkKHQpOndkLmNlaWwodCksWGQod2QuY291bnQoTGQodCksdCkrKDQ9PT1MZCh0KS5nZXRVVENEYXkoKSksbiwyKX1mdW5jdGlvbiBIcCh0KXtyZXR1cm4gdC5nZXRVVENEYXkoKX1mdW5jdGlvbiBqcCh0LG4pe3JldHVybiBYZChiZC5jb3VudChMZCh0KSx0KSxuLDIpfWZ1bmN0aW9uIFhwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDRnVsbFllYXIoKSUxMDAsbiwyKX1mdW5jdGlvbiBHcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0Z1bGxZZWFyKCklMWU0LG4sNCl9ZnVuY3Rpb24gVnAoKXtyZXR1cm4iKzAwMDAifWZ1bmN0aW9uICRwKCl7cmV0dXJuIiUifWZ1bmN0aW9uIFdwKHQpe3JldHVybit0fWZ1bmN0aW9uIFpwKHQpe3JldHVybiBNYXRoLmZsb29yKCt0LzFlMyl9ZnVuY3Rpb24gUXAobil7cmV0dXJuIEJkPVlkKG4pLHQudGltZUZvcm1hdD1CZC5mb3JtYXQsdC50aW1lUGFyc2U9QmQucGFyc2UsdC51dGNGb3JtYXQ9QmQudXRjRm9ybWF0LHQudXRjUGFyc2U9QmQudXRjUGFyc2UsQmR9UXAoe2RhdGVUaW1lOiIleCwgJVgiLGRhdGU6IiUtbS8lLWQvJVkiLHRpbWU6IiUtSTolTTolUyAlcCIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTt2YXIgSnA9RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc/ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9JU09TdHJpbmcoKX06dC51dGNGb3JtYXQoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpO3ZhciBLcD0rbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP2Z1bmN0aW9uKHQpe3ZhciBuPW5ldyBEYXRlKHQpO3JldHVybiBpc05hTihuKT9udWxsOm59OnQudXRjUGFyc2UoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpLHR2PTFlMyxudj02MCp0dixldj02MCpudixydj0yNCpldixpdj03KnJ2LG92PTMwKnJ2LGF2PTM2NSpydjtmdW5jdGlvbiB1dih0KXtyZXR1cm4gbmV3IERhdGUodCl9ZnVuY3Rpb24gZnYodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlPyt0OituZXcgRGF0ZSgrdCl9ZnVuY3Rpb24gY3YodCxuLHIsaSxvLGEsdSxmLGMpe3ZhciBzPW1oKGdoLHZlKSxsPXMuaW52ZXJ0LGg9cy5kb21haW4sZD1jKCIuJUwiKSxwPWMoIjolUyIpLHY9YygiJUk6JU0iKSxnPWMoIiVJICVwIikseT1jKCIlYSAlZCIpLF89YygiJWIgJWQiKSxiPWMoIiVCIiksbT1jKCIlWSIpLHg9W1t1LDEsdHZdLFt1LDUsNSp0dl0sW3UsMTUsMTUqdHZdLFt1LDMwLDMwKnR2XSxbYSwxLG52XSxbYSw1LDUqbnZdLFthLDE1LDE1Km52XSxbYSwzMCwzMCpudl0sW28sMSxldl0sW28sMywzKmV2XSxbbyw2LDYqZXZdLFtvLDEyLDEyKmV2XSxbaSwxLHJ2XSxbaSwyLDIqcnZdLFtyLDEsaXZdLFtuLDEsb3ZdLFtuLDMsMypvdl0sW3QsMSxhdl1dO2Z1bmN0aW9uIE0oZSl7cmV0dXJuKHUoZSk8ZT9kOmEoZSk8ZT9wOm8oZSk8ZT92OmkoZSk8ZT9nOm4oZSk8ZT9yKGUpPGU/eTpfOnQoZSk8ZT9iOm0pKGUpfWZ1bmN0aW9uIEEobixyLGksbyl7aWYobnVsbD09biYmKG49MTApLCJudW1iZXIiPT10eXBlb2Ygbil7dmFyIGE9TWF0aC5hYnMoaS1yKS9uLHU9ZShmdW5jdGlvbih0KXtyZXR1cm4gdFsyXX0pLnJpZ2h0KHgsYSk7dT09PXgubGVuZ3RoPyhvPXcoci9hdixpL2F2LG4pLG49dCk6dT8obz0odT14W2EveFt1LTFdWzJdPHhbdV1bMl0vYT91LTE6dV0pWzFdLG49dVswXSk6KG89TWF0aC5tYXgodyhyLGksbiksMSksbj1mKX1yZXR1cm4gbnVsbD09bz9uOm4uZXZlcnkobyl9cmV0dXJuIHMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRGF0ZShsKHQpKX0scy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/aChmaC5jYWxsKHQsZnYpKTpoKCkubWFwKHV2KX0scy50aWNrcz1mdW5jdGlvbih0LG4pe3ZhciBlLHI9aCgpLGk9clswXSxvPXJbci5sZW5ndGgtMV0sYT1vPGk7cmV0dXJuIGEmJihlPWksaT1vLG89ZSksZT0oZT1BKHQsaSxvLG4pKT9lLnJhbmdlKGksbysxKTpbXSxhP2UucmV2ZXJzZSgpOmV9LHMudGlja0Zvcm1hdD1mdW5jdGlvbih0LG4pe3JldHVybiBudWxsPT1uP006YyhuKX0scy5uaWNlPWZ1bmN0aW9uKHQsbil7dmFyIGU9aCgpO3JldHVybih0PUEodCxlWzBdLGVbZS5sZW5ndGgtMV0sbikpP2god2goZSx0KSk6c30scy5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKHMsY3YodCxuLHIsaSxvLGEsdSxmLGMpKX0sc31mdW5jdGlvbiBzdih0KXtmb3IodmFyIG49dC5sZW5ndGgvNnwwLGU9bmV3IEFycmF5KG4pLHI9MDtyPG47KWVbcl09IiMiK3Quc2xpY2UoNipyLDYqKytyKTtyZXR1cm4gZX12YXIgbHY9c3YoIjFmNzdiNGZmN2YwZTJjYTAyY2Q2MjcyODk0NjdiZDhjNTY0YmUzNzdjMjdmN2Y3ZmJjYmQyMjE3YmVjZiIpLGh2PXN2KCI3ZmM5N2ZiZWFlZDRmZGMwODZmZmZmOTkzODZjYjBmMDAyN2ZiZjViMTc2NjY2NjYiKSxkdj1zdigiMWI5ZTc3ZDk1ZjAyNzU3MGIzZTcyOThhNjZhNjFlZTZhYjAyYTY3NjFkNjY2NjY2IikscHY9c3YoImE2Y2VlMzFmNzhiNGIyZGY4YTMzYTAyY2ZiOWE5OWUzMWExY2ZkYmY2ZmZmN2YwMGNhYjJkNjZhM2Q5YWZmZmY5OWIxNTkyOCIpLHZ2PXN2KCJmYmI0YWViM2NkZTNjY2ViYzVkZWNiZTRmZWQ5YTZmZmZmY2NlNWQ4YmRmZGRhZWNmMmYyZjIiKSxndj1zdigiYjNlMmNkZmRjZGFjY2JkNWU4ZjRjYWU0ZTZmNWM5ZmZmMmFlZjFlMmNjY2NjY2NjIikseXY9c3YoImU0MWExYzM3N2ViODRkYWY0YTk4NGVhM2ZmN2YwMGZmZmYzM2E2NTYyOGY3ODFiZjk5OTk5OSIpLF92PXN2KCI2NmMyYTVmYzhkNjI4ZGEwY2JlNzhhYzNhNmQ4NTRmZmQ5MmZlNWM0OTRiM2IzYjMiKSxidj1zdigiOGRkM2M3ZmZmZmIzYmViYWRhZmI4MDcyODBiMWQzZmRiNDYyYjNkZTY5ZmNjZGU1ZDlkOWQ5YmM4MGJkY2NlYmM1ZmZlZDZmIik7ZnVuY3Rpb24gbXYodCl7cmV0dXJuIGxlKHRbdC5sZW5ndGgtMV0pfXZhciB4dj1uZXcgQXJyYXkoMykuY29uY2F0KCJkOGIzNjVmNWY1ZjU1YWI0YWMiLCJhNjYxMWFkZmMyN2Q4MGNkYzEwMTg1NzEiLCJhNjYxMWFkZmMyN2RmNWY1ZjU4MGNkYzEwMTg1NzEiLCI4YzUxMGFkOGIzNjVmNmU4YzNjN2VhZTU1YWI0YWMwMTY2NWUiLCI4YzUxMGFkOGIzNjVmNmU4YzNmNWY1ZjVjN2VhZTU1YWI0YWMwMTY2NWUiLCI4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUiLCI4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNmNWY1ZjVjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUiLCI1NDMwMDU4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUwMDNjMzAiLCI1NDMwMDU4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNmNWY1ZjVjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUwMDNjMzAiKS5tYXAoc3YpLHd2PW12KHh2KSxNdj1uZXcgQXJyYXkoMykuY29uY2F0KCJhZjhkYzNmN2Y3Zjc3ZmJmN2IiLCI3YjMyOTRjMmE1Y2ZhNmRiYTAwMDg4MzciLCI3YjMyOTRjMmE1Y2ZmN2Y3ZjdhNmRiYTAwMDg4MzciLCI3NjJhODNhZjhkYzNlN2Q0ZThkOWYwZDM3ZmJmN2IxYjc4MzciLCI3NjJhODNhZjhkYzNlN2Q0ZThmN2Y3ZjdkOWYwZDM3ZmJmN2IxYjc4MzciLCI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzciLCI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzciLCI0MDAwNGI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzcwMDQ0MWIiLCI0MDAwNGI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzcwMDQ0MWIiKS5tYXAoc3YpLEF2PW12KE12KSxUdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlOWEzYzlmN2Y3ZjdhMWQ3NmEiLCJkMDFjOGJmMWI2ZGFiOGUxODY0ZGFjMjYiLCJkMDFjOGJmMWI2ZGFmN2Y3ZjdiOGUxODY0ZGFjMjYiLCJjNTFiN2RlOWEzYzlmZGUwZWZlNmY1ZDBhMWQ3NmE0ZDkyMjEiLCJjNTFiN2RlOWEzYzlmZGUwZWZmN2Y3ZjdlNmY1ZDBhMWQ3NmE0ZDkyMjEiLCJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEiLCJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZmN2Y3ZjdlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEiLCI4ZTAxNTJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEyNzY0MTkiLCI4ZTAxNTJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZmN2Y3ZjdlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEyNzY0MTkiKS5tYXAoc3YpLE52PW12KFR2KSxTdj1uZXcgQXJyYXkoMykuY29uY2F0KCI5OThlYzNmN2Y3ZjdmMWEzNDAiLCI1ZTNjOTliMmFiZDJmZGI4NjNlNjYxMDEiLCI1ZTNjOTliMmFiZDJmN2Y3ZjdmZGI4NjNlNjYxMDEiLCI1NDI3ODg5OThlYzNkOGRhZWJmZWUwYjZmMWEzNDBiMzU4MDYiLCI1NDI3ODg5OThlYzNkOGRhZWJmN2Y3ZjdmZWUwYjZmMWEzNDBiMzU4MDYiLCI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDYiLCI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmN2Y3ZjdmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDYiLCIyZDAwNGI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDY3ZjNiMDgiLCIyZDAwNGI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmN2Y3ZjdmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDY3ZjNiMDgiKS5tYXAoc3YpLEV2PW12KFN2KSxrdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlZjhhNjJmN2Y3Zjc2N2E5Y2YiLCJjYTAwMjBmNGE1ODI5MmM1ZGUwNTcxYjAiLCJjYTAwMjBmNGE1ODJmN2Y3Zjc5MmM1ZGUwNTcxYjAiLCJiMjE4MmJlZjhhNjJmZGRiYzdkMWU1ZjA2N2E5Y2YyMTY2YWMiLCJiMjE4MmJlZjhhNjJmZGRiYzdmN2Y3ZjdkMWU1ZjA2N2E5Y2YyMTY2YWMiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmN2Y3ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMwNTMwNjEiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmN2Y3ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMwNTMwNjEiKS5tYXAoc3YpLEN2PW12KGt2KSxQdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlZjhhNjJmZmZmZmY5OTk5OTkiLCJjYTAwMjBmNGE1ODJiYWJhYmE0MDQwNDAiLCJjYTAwMjBmNGE1ODJmZmZmZmZiYWJhYmE0MDQwNDAiLCJiMjE4MmJlZjhhNjJmZGRiYzdlMGUwZTA5OTk5OTk0ZDRkNGQiLCJiMjE4MmJlZjhhNjJmZGRiYzdmZmZmZmZlMGUwZTA5OTk5OTk0ZDRkNGQiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmZmZmZmZlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQxYTFhMWEiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmZmZmZmZlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQxYTFhMWEiKS5tYXAoc3YpLHp2PW12KFB2KSxSdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5MWJmZGIiLCJkNzE5MWNmZGFlNjFhYmQ5ZTkyYzdiYjYiLCJkNzE5MWNmZGFlNjFmZmZmYmZhYmQ5ZTkyYzdiYjYiLCJkNzMwMjdmYzhkNTlmZWUwOTBlMGYzZjg5MWJmZGI0NTc1YjQiLCJkNzMwMjdmYzhkNTlmZWUwOTBmZmZmYmZlMGYzZjg5MWJmZGI0NTc1YjQiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBmZmZmYmZlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQzMTM2OTUiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBmZmZmYmZlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQzMTM2OTUiKS5tYXAoc3YpLEx2PW12KFJ2KSxEdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5MWNmNjAiLCJkNzE5MWNmZGFlNjFhNmQ5NmExYTk2NDEiLCJkNzE5MWNmZGFlNjFmZmZmYmZhNmQ5NmExYTk2NDEiLCJkNzMwMjdmYzhkNTlmZWUwOGJkOWVmOGI5MWNmNjAxYTk4NTAiLCJkNzMwMjdmYzhkNTlmZWUwOGJmZmZmYmZkOWVmOGI5MWNmNjAxYTk4NTAiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAwMDY4MzciLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAwMDY4MzciKS5tYXAoc3YpLFV2PW12KER2KSxxdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5OWQ1OTQiLCJkNzE5MWNmZGFlNjFhYmRkYTQyYjgzYmEiLCJkNzE5MWNmZGFlNjFmZmZmYmZhYmRkYTQyYjgzYmEiLCJkNTNlNGZmYzhkNTlmZWUwOGJlNmY1OTg5OWQ1OTQzMjg4YmQiLCJkNTNlNGZmYzhkNTlmZWUwOGJmZmZmYmZlNmY1OTg5OWQ1OTQzMjg4YmQiLCJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQiLCJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQiLCI5ZTAxNDJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQ1ZTRmYTIiLCI5ZTAxNDJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQ1ZTRmYTIiKS5tYXAoc3YpLE92PW12KHF2KSxZdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlNWY1Zjk5OWQ4YzkyY2EyNWYiLCJlZGY4ZmJiMmUyZTI2NmMyYTQyMzhiNDUiLCJlZGY4ZmJiMmUyZTI2NmMyYTQyY2EyNWYwMDZkMmMiLCJlZGY4ZmJjY2VjZTY5OWQ4Yzk2NmMyYTQyY2EyNWYwMDZkMmMiLCJlZGY4ZmJjY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDU4MjQiLCJmN2ZjZmRlNWY1ZjljY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDU4MjQiLCJmN2ZjZmRlNWY1ZjljY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDZkMmMwMDQ0MWIiKS5tYXAoc3YpLEJ2PW12KFl2KSxGdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlMGVjZjQ5ZWJjZGE4ODU2YTciLCJlZGY4ZmJiM2NkZTM4Yzk2YzY4ODQxOWQiLCJlZGY4ZmJiM2NkZTM4Yzk2YzY4ODU2YTc4MTBmN2MiLCJlZGY4ZmJiZmQzZTY5ZWJjZGE4Yzk2YzY4ODU2YTc4MTBmN2MiLCJlZGY4ZmJiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ2ZTAxNmIiLCJmN2ZjZmRlMGVjZjRiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ2ZTAxNmIiLCJmN2ZjZmRlMGVjZjRiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ4MTBmN2M0ZDAwNGIiKS5tYXAoc3YpLEl2PW12KEZ2KSxIdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlMGYzZGJhOGRkYjU0M2EyY2EiLCJmMGY5ZThiYWU0YmM3YmNjYzQyYjhjYmUiLCJmMGY5ZThiYWU0YmM3YmNjYzQ0M2EyY2EwODY4YWMiLCJmMGY5ZThjY2ViYzVhOGRkYjU3YmNjYzQ0M2EyY2EwODY4YWMiLCJmMGY5ZThjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODU4OWUiLCJmN2ZjZjBlMGYzZGJjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODU4OWUiLCJmN2ZjZjBlMGYzZGJjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODY4YWMwODQwODEiKS5tYXAoc3YpLGp2PW12KEh2KSxYdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWU4YzhmZGJiODRlMzRhMzMiLCJmZWYwZDlmZGNjOGFmYzhkNTlkNzMwMWYiLCJmZWYwZDlmZGNjOGFmYzhkNTllMzRhMzNiMzAwMDAiLCJmZWYwZDlmZGQ0OWVmZGJiODRmYzhkNTllMzRhMzNiMzAwMDAiLCJmZWYwZDlmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWY5OTAwMDAiLCJmZmY3ZWNmZWU4YzhmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWY5OTAwMDAiLCJmZmY3ZWNmZWU4YzhmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWZiMzAwMDA3ZjAwMDAiKS5tYXAoc3YpLEd2PW12KFh2KSxWdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlY2UyZjBhNmJkZGIxYzkwOTkiLCJmNmVmZjdiZGM5ZTE2N2E5Y2YwMjgxOGEiLCJmNmVmZjdiZGM5ZTE2N2E5Y2YxYzkwOTkwMTZjNTkiLCJmNmVmZjdkMGQxZTZhNmJkZGI2N2E5Y2YxYzkwOTkwMTZjNTkiLCJmNmVmZjdkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTY0NTAiLCJmZmY3ZmJlY2UyZjBkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTY0NTAiLCJmZmY3ZmJlY2UyZjBkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTZjNTkwMTQ2MzYiKS5tYXAoc3YpLCR2PW12KFZ2KSxXdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlY2U3ZjJhNmJkZGIyYjhjYmUiLCJmMWVlZjZiZGM5ZTE3NGE5Y2YwNTcwYjAiLCJmMWVlZjZiZGM5ZTE3NGE5Y2YyYjhjYmUwNDVhOGQiLCJmMWVlZjZkMGQxZTZhNmJkZGI3NGE5Y2YyYjhjYmUwNDVhOGQiLCJmMWVlZjZkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwMzRlN2IiLCJmZmY3ZmJlY2U3ZjJkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwMzRlN2IiLCJmZmY3ZmJlY2U3ZjJkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwNDVhOGQwMjM4NTgiKS5tYXAoc3YpLFp2PW12KFd2KSxRdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlN2UxZWZjOTk0YzdkZDFjNzciLCJmMWVlZjZkN2I1ZDhkZjY1YjBjZTEyNTYiLCJmMWVlZjZkN2I1ZDhkZjY1YjBkZDFjNzc5ODAwNDMiLCJmMWVlZjZkNGI5ZGFjOTk0YzdkZjY1YjBkZDFjNzc5ODAwNDMiLCJmMWVlZjZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5MTAwM2YiLCJmN2Y0ZjllN2UxZWZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5MTAwM2YiLCJmN2Y0ZjllN2UxZWZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5ODAwNDM2NzAwMWYiKS5tYXAoc3YpLEp2PW12KFF2KSxLdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmZGUwZGRmYTlmYjVjNTFiOGEiLCJmZWViZTJmYmI0YjlmNzY4YTFhZTAxN2UiLCJmZWViZTJmYmI0YjlmNzY4YTFjNTFiOGE3YTAxNzciLCJmZWViZTJmY2M1YzBmYTlmYjVmNzY4YTFjNTFiOGE3YTAxNzciLCJmZWViZTJmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzciLCJmZmY3ZjNmZGUwZGRmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzciLCJmZmY3ZjNmZGUwZGRmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzc0OTAwNmEiKS5tYXAoc3YpLHRnPW12KEt2KSxuZz1uZXcgQXJyYXkoMykuY29uY2F0KCJlZGY4YjE3ZmNkYmIyYzdmYjgiLCJmZmZmY2NhMWRhYjQ0MWI2YzQyMjVlYTgiLCJmZmZmY2NhMWRhYjQ0MWI2YzQyYzdmYjgyNTM0OTQiLCJmZmZmY2NjN2U5YjQ3ZmNkYmI0MWI2YzQyYzdmYjgyNTM0OTQiLCJmZmZmY2NjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgwYzJjODQiLCJmZmZmZDllZGY4YjFjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgwYzJjODQiLCJmZmZmZDllZGY4YjFjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgyNTM0OTQwODFkNTgiKS5tYXAoc3YpLGVnPW12KG5nKSxyZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmN2ZjYjlhZGRkOGUzMWEzNTQiLCJmZmZmY2NjMmU2OTk3OGM2NzkyMzg0NDMiLCJmZmZmY2NjMmU2OTk3OGM2NzkzMWEzNTQwMDY4MzciLCJmZmZmY2NkOWYwYTNhZGRkOGU3OGM2NzkzMWEzNTQwMDY4MzciLCJmZmZmY2NkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDVhMzIiLCJmZmZmZTVmN2ZjYjlkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDVhMzIiLCJmZmZmZTVmN2ZjYjlkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDY4MzcwMDQ1MjkiKS5tYXAoc3YpLGlnPW12KHJnKSxvZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZmY3YmNmZWM0NGZkOTVmMGUiLCJmZmZmZDRmZWQ5OGVmZTk5MjljYzRjMDIiLCJmZmZmZDRmZWQ5OGVmZTk5MjlkOTVmMGU5OTM0MDQiLCJmZmZmZDRmZWUzOTFmZWM0NGZmZTk5MjlkOTVmMGU5OTM0MDQiLCJmZmZmZDRmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDQiLCJmZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDQiLCJmZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI5OTM0MDQ2NjI1MDYiKS5tYXAoc3YpLGFnPW12KG9nKSx1Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZmVkYTBmZWIyNGNmMDNiMjAiLCJmZmZmYjJmZWNjNWNmZDhkM2NlMzFhMWMiLCJmZmZmYjJmZWNjNWNmZDhkM2NmMDNiMjBiZDAwMjYiLCJmZmZmYjJmZWQ5NzZmZWIyNGNmZDhkM2NmMDNiMjBiZDAwMjYiLCJmZmZmYjJmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiMTAwMjYiLCJmZmZmY2NmZmVkYTBmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiMTAwMjYiLCJmZmZmY2NmZmVkYTBmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiZDAwMjY4MDAwMjYiKS5tYXAoc3YpLGZnPW12KHVnKSxjZz1uZXcgQXJyYXkoMykuY29uY2F0KCJkZWViZjc5ZWNhZTEzMTgyYmQiLCJlZmYzZmZiZGQ3ZTc2YmFlZDYyMTcxYjUiLCJlZmYzZmZiZGQ3ZTc2YmFlZDYzMTgyYmQwODUxOWMiLCJlZmYzZmZjNmRiZWY5ZWNhZTE2YmFlZDYzMTgyYmQwODUxOWMiLCJlZmYzZmZjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODQ1OTQiLCJmN2ZiZmZkZWViZjdjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODQ1OTQiLCJmN2ZiZmZkZWViZjdjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODUxOWMwODMwNmIiKS5tYXAoc3YpLHNnPW12KGNnKSxsZz1uZXcgQXJyYXkoMykuY29uY2F0KCJlNWY1ZTBhMWQ5OWIzMWEzNTQiLCJlZGY4ZTliYWU0YjM3NGM0NzYyMzhiNDUiLCJlZGY4ZTliYWU0YjM3NGM0NzYzMWEzNTQwMDZkMmMiLCJlZGY4ZTljN2U5YzBhMWQ5OWI3NGM0NzYzMWEzNTQwMDZkMmMiLCJlZGY4ZTljN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDVhMzIiLCJmN2ZjZjVlNWY1ZTBjN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDVhMzIiLCJmN2ZjZjVlNWY1ZTBjN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDZkMmMwMDQ0MWIiKS5tYXAoc3YpLGhnPW12KGxnKSxkZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmMGYwZjBiZGJkYmQ2MzYzNjMiLCJmN2Y3ZjdjY2NjY2M5Njk2OTY1MjUyNTIiLCJmN2Y3ZjdjY2NjY2M5Njk2OTY2MzYzNjMyNTI1MjUiLCJmN2Y3ZjdkOWQ5ZDliZGJkYmQ5Njk2OTY2MzYzNjMyNTI1MjUiLCJmN2Y3ZjdkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUiLCJmZmZmZmZmMGYwZjBkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUiLCJmZmZmZmZmMGYwZjBkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUwMDAwMDAiKS5tYXAoc3YpLHBnPW12KGRnKSx2Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJlZmVkZjViY2JkZGM3NTZiYjEiLCJmMmYwZjdjYmM5ZTI5ZTlhYzg2YTUxYTMiLCJmMmYwZjdjYmM5ZTI5ZTlhYzg3NTZiYjE1NDI3OGYiLCJmMmYwZjdkYWRhZWJiY2JkZGM5ZTlhYzg3NTZiYjE1NDI3OGYiLCJmMmYwZjdkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM0YTE0ODYiLCJmY2ZiZmRlZmVkZjVkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM0YTE0ODYiLCJmY2ZiZmRlZmVkZjVkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM1NDI3OGYzZjAwN2QiKS5tYXAoc3YpLGdnPW12KHZnKSx5Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWUwZDJmYzkyNzJkZTJkMjYiLCJmZWU1ZDlmY2FlOTFmYjZhNGFjYjE4MWQiLCJmZWU1ZDlmY2FlOTFmYjZhNGFkZTJkMjZhNTBmMTUiLCJmZWU1ZDlmY2JiYTFmYzkyNzJmYjZhNGFkZTJkMjZhNTBmMTUiLCJmZWU1ZDlmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWQ5OTAwMGQiLCJmZmY1ZjBmZWUwZDJmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWQ5OTAwMGQiLCJmZmY1ZjBmZWUwZDJmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWRhNTBmMTU2NzAwMGQiKS5tYXAoc3YpLF9nPW12KHlnKSxiZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWU2Y2VmZGFlNmJlNjU1MGQiLCJmZWVkZGVmZGJlODVmZDhkM2NkOTQ3MDEiLCJmZWVkZGVmZGJlODVmZDhkM2NlNjU1MGRhNjM2MDMiLCJmZWVkZGVmZGQwYTJmZGFlNmJmZDhkM2NlNjU1MGRhNjM2MDMiLCJmZWVkZGVmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDE4YzJkMDQiLCJmZmY1ZWJmZWU2Y2VmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDE4YzJkMDQiLCJmZmY1ZWJmZWU2Y2VmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDFhNjM2MDM3ZjI3MDQiKS5tYXAoc3YpLG1nPW12KGJnKSx4Zz1HZShLbigzMDAsLjUsMCksS24oLTI0MCwuNSwxKSksd2c9R2UoS24oLTEwMCwuNzUsLjM1KSxLbig4MCwxLjUsLjgpKSxNZz1HZShLbigyNjAsLjc1LC4zNSksS24oODAsMS41LC44KSksQWc9S24oKTt2YXIgVGc9Ym4oKSxOZz1NYXRoLlBJLzMsU2c9MipNYXRoLlBJLzM7ZnVuY3Rpb24gRWcodCl7dmFyIG49dC5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0W01hdGgubWF4KDAsTWF0aC5taW4obi0xLE1hdGguZmxvb3IoZSpuKSkpXX19dmFyIGtnPUVnKHN2KCI0NDAxNTQ0NDAyNTY0NTA0NTc0NTA1NTk0NjA3NWE0NjA4NWM0NjBhNWQ0NjBiNWU0NzBkNjA0NzBlNjE0NzEwNjM0NzExNjQ0NzEzNjU0ODE0Njc0ODE2Njg0ODE3Njk0ODE4NmE0ODFhNmM0ODFiNmQ0ODFjNmU0ODFkNmY0ODFmNzA0ODIwNzE0ODIxNzM0ODIzNzQ0ODI0NzU0ODI1NzY0ODI2Nzc0ODI4Nzg0ODI5Nzk0NzJhN2E0NzJjN2E0NzJkN2I0NzJlN2M0NzJmN2Q0NjMwN2U0NjMyN2U0NjMzN2Y0NjM0ODA0NTM1ODE0NTM3ODE0NTM4ODI0NDM5ODM0NDNhODM0NDNiODQ0MzNkODQ0MzNlODU0MjNmODU0MjQwODY0MjQxODY0MTQyODc0MTQ0ODc0MDQ1ODg0MDQ2ODgzZjQ3ODgzZjQ4ODkzZTQ5ODkzZTRhODkzZTRjOGEzZDRkOGEzZDRlOGEzYzRmOGEzYzUwOGIzYjUxOGIzYjUyOGIzYTUzOGIzYTU0OGMzOTU1OGMzOTU2OGMzODU4OGMzODU5OGMzNzVhOGMzNzViOGQzNjVjOGQzNjVkOGQzNTVlOGQzNTVmOGQzNDYwOGQzNDYxOGQzMzYyOGQzMzYzOGQzMjY0OGUzMjY1OGUzMTY2OGUzMTY3OGUzMTY4OGUzMDY5OGUzMDZhOGUyZjZiOGUyZjZjOGUyZTZkOGUyZTZlOGUyZTZmOGUyZDcwOGUyZDcxOGUyYzcxOGUyYzcyOGUyYzczOGUyYjc0OGUyYjc1OGUyYTc2OGUyYTc3OGUyYTc4OGUyOTc5OGUyOTdhOGUyOTdiOGUyODdjOGUyODdkOGUyNzdlOGUyNzdmOGUyNzgwOGUyNjgxOGUyNjgyOGUyNjgyOGUyNTgzOGUyNTg0OGUyNTg1OGUyNDg2OGUyNDg3OGUyMzg4OGUyMzg5OGUyMzhhOGQyMjhiOGQyMjhjOGQyMjhkOGQyMThlOGQyMThmOGQyMTkwOGQyMTkxOGMyMDkyOGMyMDkyOGMyMDkzOGMxZjk0OGMxZjk1OGIxZjk2OGIxZjk3OGIxZjk4OGIxZjk5OGExZjlhOGExZTliOGExZTljODkxZTlkODkxZjllODkxZjlmODgxZmEwODgxZmExODgxZmExODcxZmEyODcyMGEzODYyMGE0ODYyMWE1ODUyMWE2ODUyMmE3ODUyMmE4ODQyM2E5ODMyNGFhODMyNWFiODIyNWFjODIyNmFkODEyN2FkODEyOGFlODAyOWFmN2YyYWIwN2YyY2IxN2UyZGIyN2QyZWIzN2MyZmI0N2MzMWI1N2IzMmI2N2EzNGI2NzkzNWI3NzkzN2I4NzgzOGI5NzczYWJhNzYzYmJiNzUzZGJjNzQzZmJjNzM0MGJkNzI0MmJlNzE0NGJmNzA0NmMwNmY0OGMxNmU0YWMxNmQ0Y2MyNmM0ZWMzNmI1MGM0NmE1MmM1Njk1NGM1Njg1NmM2Njc1OGM3NjU1YWM4NjQ1Y2M4NjM1ZWM5NjI2MGNhNjA2M2NiNWY2NWNiNWU2N2NjNWM2OWNkNWI2Y2NkNWE2ZWNlNTg3MGNmNTc3M2QwNTY3NWQwNTQ3N2QxNTM3YWQxNTE3Y2QyNTA3ZmQzNGU4MWQzNGQ4NGQ0NGI4NmQ1NDk4OWQ1NDg4YmQ2NDY4ZWQ2NDU5MGQ3NDM5M2Q3NDE5NWQ4NDA5OGQ4M2U5YmQ5M2M5ZGQ5M2JhMGRhMzlhMmRhMzdhNWRiMzZhOGRiMzRhYWRjMzJhZGRjMzBiMGRkMmZiMmRkMmRiNWRlMmJiOGRlMjliYWRlMjhiZGRmMjZjMGRmMjVjMmRmMjNjNWUwMjFjOGUwMjBjYWUxMWZjZGUxMWRkMGUxMWNkMmUyMWJkNWUyMWFkOGUyMTlkYWUzMTlkZGUzMThkZmUzMThlMmU0MThlNWU0MTllN2U0MTllYWU1MWFlY2U1MWJlZmU1MWNmMWU1MWRmNGU2MWVmNmU2MjBmOGU2MjFmYmU3MjNmZGU3MjUiKSksQ2c9RWcoc3YoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwOTAyMDIwYjAyMDIwZDAzMDMwZjAzMDMxMjA0MDQxNDA1MDQxNjA2MDUxODA2MDUxYTA3MDYxYzA4MDcxZTA5MDcyMDBhMDgyMjBiMDkyNDBjMDkyNjBkMGEyOTBlMGIyYjEwMGIyZDExMGMyZjEyMGQzMTEzMGQzNDE0MGUzNjE1MGUzODE2MGYzYjE4MGYzZDE5MTAzZjFhMTA0MjFjMTA0NDFkMTE0NzFlMTE0OTIwMTE0YjIxMTE0ZTIyMTE1MDI0MTI1MzI1MTI1NTI3MTI1ODI5MTE1YTJhMTE1YzJjMTE1ZjJkMTE2MTJmMTE2MzMxMTE2NTMzMTA2NzM0MTA2OTM2MTA2YjM4MTA2YzM5MGY2ZTNiMGY3MDNkMGY3MTNmMGY3MjQwMGY3NDQyMGY3NTQ0MGY3NjQ1MTA3NzQ3MTA3ODQ5MTA3ODRhMTA3OTRjMTE3YTRlMTE3YjRmMTI3YjUxMTI3YzUyMTM3YzU0MTM3ZDU2MTQ3ZDU3MTU3ZTU5MTU3ZTVhMTY3ZTVjMTY3ZjVkMTc3ZjVmMTg3ZjYwMTg4MDYyMTk4MDY0MWE4MDY1MWE4MDY3MWI4MDY4MWM4MTZhMWM4MTZiMWQ4MTZkMWQ4MTZlMWU4MTcwMWY4MTcyMWY4MTczMjA4MTc1MjE4MTc2MjE4MTc4MjI4MTc5MjI4MjdiMjM4MjdjMjM4MjdlMjQ4MjgwMjU4MjgxMjU4MTgzMjY4MTg0MjY4MTg2Mjc4MTg4Mjc4MTg5Mjg4MThiMjk4MThjMjk4MThlMmE4MTkwMmE4MTkxMmI4MTkzMmI4MDk0MmM4MDk2MmM4MDk4MmQ4MDk5MmQ4MDliMmU3ZjljMmU3ZjllMmY3ZmEwMmY3ZmExMzA3ZWEzMzA3ZWE1MzE3ZWE2MzE3ZGE4MzI3ZGFhMzM3ZGFiMzM3Y2FkMzQ3Y2FlMzQ3YmIwMzU3YmIyMzU3YmIzMzY3YWI1MzY3YWI3Mzc3OWI4Mzc3OWJhMzg3OGJjMzk3OGJkMzk3N2JmM2E3N2MwM2E3NmMyM2I3NWM0M2M3NWM1M2M3NGM3M2Q3M2M4M2U3M2NhM2U3MmNjM2Y3MWNkNDA3MWNmNDA3MGQwNDE2ZmQyNDI2ZmQzNDM2ZWQ1NDQ2ZGQ2NDU2Y2Q4NDU2Y2Q5NDY2YmRiNDc2YWRjNDg2OWRlNDk2OGRmNGE2OGUwNGM2N2UyNGQ2NmUzNGU2NWU0NGY2NGU1NTA2NGU3NTI2M2U4NTM2MmU5NTQ2MmVhNTY2MWViNTc2MGVjNTg2MGVkNWE1ZmVlNWI1ZWVmNWQ1ZWYwNWY1ZWYxNjA1ZGYyNjI1ZGYyNjQ1Y2YzNjU1Y2Y0Njc1Y2Y0Njk1Y2Y1NmI1Y2Y2NmM1Y2Y2NmU1Y2Y3NzA1Y2Y3NzI1Y2Y4NzQ1Y2Y4NzY1Y2Y5Nzg1ZGY5Nzk1ZGY5N2I1ZGZhN2Q1ZWZhN2Y1ZWZhODE1ZmZiODM1ZmZiODU2MGZiODc2MWZjODk2MWZjOGE2MmZjOGM2M2ZjOGU2NGZjOTA2NWZkOTI2NmZkOTQ2N2ZkOTY2OGZkOTg2OWZkOWE2YWZkOWI2YmZlOWQ2Y2ZlOWY2ZGZlYTE2ZWZlYTM2ZmZlYTU3MWZlYTc3MmZlYTk3M2ZlYWE3NGZlYWM3NmZlYWU3N2ZlYjA3OGZlYjI3YWZlYjQ3YmZlYjY3Y2ZlYjc3ZWZlYjk3ZmZlYmI4MWZlYmQ4MmZlYmY4NGZlYzE4NWZlYzI4N2ZlYzQ4OGZlYzY4YWZlYzg4Y2ZlY2E4ZGZlY2M4ZmZlY2Q5MGZlY2Y5MmZlZDE5NGZlZDM5NWZlZDU5N2ZlZDc5OWZlZDg5YWZkZGE5Y2ZkZGM5ZWZkZGVhMGZkZTBhMWZkZTJhM2ZkZTNhNWZkZTVhN2ZkZTdhOWZkZTlhYWZkZWJhY2ZjZWNhZWZjZWViMGZjZjBiMmZjZjJiNGZjZjRiNmZjZjZiOGZjZjdiOWZjZjliYmZjZmJiZGZjZmRiZiIpKSxQZz1FZyhzdigiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTBhMDIwMjBjMDIwMjBlMDMwMjEwMDQwMzEyMDQwMzE0MDUwNDE3MDYwNDE5MDcwNTFiMDgwNTFkMDkwNjFmMGEwNzIyMGIwNzI0MGMwODI2MGQwODI5MGUwOTJiMTAwOTJkMTEwYTMwMTIwYTMyMTQwYjM0MTUwYjM3MTYwYjM5MTgwYzNjMTkwYzNlMWIwYzQxMWMwYzQzMWUwYzQ1MWYwYzQ4MjEwYzRhMjMwYzRjMjQwYzRmMjYwYzUxMjgwYjUzMjkwYjU1MmIwYjU3MmQwYjU5MmYwYTViMzEwYTVjMzIwYTVlMzQwYTVmMzYwOTYxMzgwOTYyMzkwOTYzM2IwOTY0M2QwOTY1M2UwOTY2NDAwYTY3NDIwYTY4NDQwYTY4NDUwYTY5NDcwYjZhNDkwYjZhNGEwYzZiNGMwYzZiNGQwZDZjNGYwZDZjNTEwZTZjNTIwZTZkNTQwZjZkNTUwZjZkNTcxMDZlNTkxMDZlNWExMTZlNWMxMjZlNWQxMjZlNWYxMzZlNjExMzZlNjIxNDZlNjQxNTZlNjUxNTZlNjcxNjZlNjkxNjZlNmExNzZlNmMxODZlNmQxODZlNmYxOTZlNzExOTZlNzIxYTZlNzQxYTZlNzUxYjZlNzcxYzZkNzgxYzZkN2ExZDZkN2MxZDZkN2QxZTZkN2YxZTZjODAxZjZjODIyMDZjODQyMDZiODUyMTZiODcyMTZiODgyMjZhOGEyMjZhOGMyMzY5OGQyMzY5OGYyNDY5OTAyNTY4OTIyNTY4OTMyNjY3OTUyNjY3OTcyNzY2OTgyNzY2OWEyODY1OWIyOTY0OWQyOTY0OWYyYTYzYTAyYTYzYTIyYjYyYTMyYzYxYTUyYzYwYTYyZDYwYTgyZTVmYTkyZTVlYWIyZjVlYWQzMDVkYWUzMDVjYjAzMTViYjEzMjVhYjMzMjVhYjQzMzU5YjYzNDU4YjczNTU3YjkzNTU2YmEzNjU1YmMzNzU0YmQzODUzYmYzOTUyYzAzYTUxYzEzYTUwYzMzYjRmYzQzYzRlYzYzZDRkYzczZTRjYzgzZjRiY2E0MDRhY2I0MTQ5Y2M0MjQ4Y2U0MzQ3Y2Y0NDQ2ZDA0NTQ1ZDI0NjQ0ZDM0NzQzZDQ0ODQyZDU0YTQxZDc0YjNmZDg0YzNlZDk0ZDNkZGE0ZTNjZGI1MDNiZGQ1MTNhZGU1MjM4ZGY1MzM3ZTA1NTM2ZTE1NjM1ZTI1NzM0ZTM1OTMzZTQ1YTMxZTU1YzMwZTY1ZDJmZTc1ZTJlZTg2MDJkZTk2MTJiZWE2MzJhZWI2NDI5ZWI2NjI4ZWM2NzI2ZWQ2OTI1ZWU2YTI0ZWY2YzIzZWY2ZTIxZjA2ZjIwZjE3MTFmZjE3MzFkZjI3NDFjZjM3NjFiZjM3ODE5ZjQ3OTE4ZjU3YjE3ZjU3ZDE1ZjY3ZTE0ZjY4MDEzZjc4MjEyZjc4NDEwZjg4NTBmZjg4NzBlZjg4OTBjZjk4YjBiZjk4YzBhZjk4ZTA5ZmE5MDA4ZmE5MjA3ZmE5NDA3ZmI5NjA2ZmI5NzA2ZmI5OTA2ZmI5YjA2ZmI5ZDA3ZmM5ZjA3ZmNhMTA4ZmNhMzA5ZmNhNTBhZmNhNjBjZmNhODBkZmNhYTBmZmNhYzExZmNhZTEyZmNiMDE0ZmNiMjE2ZmNiNDE4ZmJiNjFhZmJiODFkZmJiYTFmZmJiYzIxZmJiZTIzZmFjMDI2ZmFjMjI4ZmFjNDJhZmFjNjJkZjljNzJmZjljOTMyZjljYjM1ZjhjZDM3ZjhjZjNhZjdkMTNkZjdkMzQwZjZkNTQzZjZkNzQ2ZjVkOTQ5ZjVkYjRjZjRkZDRmZjRkZjUzZjRlMTU2ZjNlMzVhZjNlNTVkZjJlNjYxZjJlODY1ZjJlYTY5ZjFlYzZkZjFlZDcxZjFlZjc1ZjFmMTc5ZjJmMjdkZjJmNDgyZjNmNTg2ZjNmNjhhZjRmODhlZjVmOTkyZjZmYTk2ZjhmYjlhZjlmYzlkZmFmZGExZmNmZmE0IikpLHpnPUVnKHN2KCIwZDA4ODcxMDA3ODgxMzA3ODkxNjA3OGExOTA2OGMxYjA2OGQxZDA2OGUyMDA2OGYyMjA2OTAyNDA2OTEyNjA1OTEyODA1OTIyYTA1OTMyYzA1OTQyZTA1OTUyZjA1OTYzMTA1OTczMzA1OTczNTA0OTgzNzA0OTkzODA0OWEzYTA0OWEzYzA0OWIzZTA0OWMzZjA0OWM0MTA0OWQ0MzAzOWU0NDAzOWU0NjAzOWY0ODAzOWY0OTAzYTA0YjAzYTE0YzAyYTE0ZTAyYTI1MDAyYTI1MTAyYTM1MzAyYTM1NTAyYTQ1NjAxYTQ1ODAxYTQ1OTAxYTU1YjAxYTU1YzAxYTY1ZTAxYTY2MDAxYTY2MTAwYTc2MzAwYTc2NDAwYTc2NjAwYTc2NzAwYTg2OTAwYTg2YTAwYTg2YzAwYTg2ZTAwYTg2ZjAwYTg3MTAwYTg3MjAxYTg3NDAxYTg3NTAxYTg3NzAxYTg3ODAxYTg3YTAyYTg3YjAyYTg3ZDAzYTg3ZTAzYTg4MDA0YTg4MTA0YTc4MzA1YTc4NDA1YTc4NjA2YTY4NzA3YTY4ODA4YTY4YTA5YTU4YjBhYTU4ZDBiYTU4ZTBjYTQ4ZjBkYTQ5MTBlYTM5MjBmYTM5NDEwYTI5NTExYTE5NjEzYTE5ODE0YTA5OTE1OWY5YTE2OWY5YzE3OWU5ZDE4OWQ5ZTE5OWRhMDFhOWNhMTFiOWJhMjFkOWFhMzFlOWFhNTFmOTlhNjIwOThhNzIxOTdhODIyOTZhYTIzOTVhYjI0OTRhYzI2OTRhZDI3OTNhZTI4OTJiMDI5OTFiMTJhOTBiMjJiOGZiMzJjOGViNDJlOGRiNTJmOGNiNjMwOGJiNzMxOGFiODMyODliYTMzODhiYjM0ODhiYzM1ODdiZDM3ODZiZTM4ODViZjM5ODRjMDNhODNjMTNiODJjMjNjODFjMzNkODBjNDNlN2ZjNTQwN2VjNjQxN2RjNzQyN2NjODQzN2JjOTQ0N2FjYTQ1N2FjYjQ2NzljYzQ3NzhjYzQ5NzdjZDRhNzZjZTRiNzVjZjRjNzRkMDRkNzNkMTRlNzJkMjRmNzFkMzUxNzFkNDUyNzBkNTUzNmZkNTU0NmVkNjU1NmRkNzU2NmNkODU3NmJkOTU4NmFkYTVhNmFkYTViNjlkYjVjNjhkYzVkNjdkZDVlNjZkZTVmNjVkZTYxNjRkZjYyNjNlMDYzNjNlMTY0NjJlMjY1NjFlMjY2NjBlMzY4NWZlNDY5NWVlNTZhNWRlNTZiNWRlNjZjNWNlNzZlNWJlNzZmNWFlODcwNTllOTcxNThlOTcyNTdlYTc0NTdlYjc1NTZlYjc2NTVlYzc3NTRlZDc5NTNlZDdhNTJlZTdiNTFlZjdjNTFlZjdlNTBmMDdmNGZmMDgwNGVmMTgxNGRmMTgzNGNmMjg0NGJmMzg1NGJmMzg3NGFmNDg4NDlmNDg5NDhmNThiNDdmNThjNDZmNjhkNDVmNjhmNDRmNzkwNDRmNzkxNDNmNzkzNDJmODk0NDFmODk1NDBmOTk3M2ZmOTk4M2VmOTlhM2VmYTliM2RmYTljM2NmYTllM2JmYjlmM2FmYmExMzlmYmEyMzhmY2EzMzhmY2E1MzdmY2E2MzZmY2E4MzVmY2E5MzRmZGFiMzNmZGFjMzNmZGFlMzJmZGFmMzFmZGIxMzBmZGIyMmZmZGI0MmZmZGI1MmVmZWI3MmRmZWI4MmNmZWJhMmNmZWJiMmJmZWJkMmFmZWJlMmFmZWMwMjlmZGMyMjlmZGMzMjhmZGM1MjdmZGM2MjdmZGM4MjdmZGNhMjZmZGNiMjZmY2NkMjVmY2NlMjVmY2QwMjVmY2QyMjVmYmQzMjRmYmQ1MjRmYmQ3MjRmYWQ4MjRmYWRhMjRmOWRjMjRmOWRkMjVmOGRmMjVmOGUxMjVmN2UyMjVmN2U0MjVmNmU2MjZmNmU4MjZmNWU5MjZmNWViMjdmNGVkMjdmM2VlMjdmM2YwMjdmMmYyMjdmMWY0MjZmMWY1MjVmMGY3MjRmMGY5MjEiKSk7ZnVuY3Rpb24gUmcodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBMZz1NYXRoLmFicyxEZz1NYXRoLmF0YW4yLFVnPU1hdGguY29zLHFnPU1hdGgubWF4LE9nPU1hdGgubWluLFlnPU1hdGguc2luLEJnPU1hdGguc3FydCxGZz0xZS0xMixJZz1NYXRoLlBJLEhnPUlnLzIsamc9MipJZztmdW5jdGlvbiBYZyh0KXtyZXR1cm4gdD49MT9IZzp0PD0tMT8tSGc6TWF0aC5hc2luKHQpfWZ1bmN0aW9uIEdnKHQpe3JldHVybiB0LmlubmVyUmFkaXVzfWZ1bmN0aW9uIFZnKHQpe3JldHVybiB0Lm91dGVyUmFkaXVzfWZ1bmN0aW9uICRnKHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gV2codCl7cmV0dXJuIHQuZW5kQW5nbGV9ZnVuY3Rpb24gWmcodCl7cmV0dXJuIHQmJnQucGFkQW5nbGV9ZnVuY3Rpb24gUWcodCxuLGUscixpLG8sYSl7dmFyIHU9dC1lLGY9bi1yLGM9KGE/bzotbykvQmcodSp1K2YqZikscz1jKmYsbD0tYyp1LGg9dCtzLGQ9bitsLHA9ZStzLHY9citsLGc9KGgrcCkvMix5PShkK3YpLzIsXz1wLWgsYj12LWQsbT1fKl8rYipiLHg9aS1vLHc9aCp2LXAqZCxNPShiPDA/LTE6MSkqQmcocWcoMCx4KngqbS13KncpKSxBPSh3KmItXypNKS9tLFQ9KC13Kl8tYipNKS9tLE49KHcqYitfKk0pL20sUz0oLXcqXytiKk0pL20sRT1BLWcsaz1ULXksQz1OLWcsUD1TLXk7cmV0dXJuIEUqRStrKms+QypDK1AqUCYmKEE9TixUPVMpLHtjeDpBLGN5OlQseDAxOi1zLHkwMTotbCx4MTE6QSooaS94LTEpLHkxMTpUKihpL3gtMSl9fWZ1bmN0aW9uIEpnKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBLZyh0KXtyZXR1cm4gbmV3IEpnKHQpfWZ1bmN0aW9uIHR5KHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIG55KHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIGV5KCl7dmFyIHQ9dHksbj1ueSxlPVJnKCEwKSxyPW51bGwsaT1LZyxvPW51bGw7ZnVuY3Rpb24gYShhKXt2YXIgdSxmLGMscz1hLmxlbmd0aCxsPSExO2ZvcihudWxsPT1yJiYobz1pKGM9R2koKSkpLHU9MDt1PD1zOysrdSkhKHU8cyYmZShmPWFbdV0sdSxhKSk9PT1sJiYoKGw9IWwpP28ubGluZVN0YXJ0KCk6by5saW5lRW5kKCkpLGwmJm8ucG9pbnQoK3QoZix1LGEpLCtuKGYsdSxhKSk7aWYoYylyZXR1cm4gbz1udWxsLGMrIiJ8fG51bGx9cmV0dXJuIGEueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKCtuKSxhKTp0fSxhLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6bn0sYS5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoISF0KSxhKTplfSxhLmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbnVsbCE9ciYmKG89aShyKSksYSk6aX0sYS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P3I9bz1udWxsOm89aShyPXQpLGEpOnJ9LGF9ZnVuY3Rpb24gcnkoKXt2YXIgdD10eSxuPW51bGwsZT1SZygwKSxyPW55LGk9UmcoITApLG89bnVsbCxhPUtnLHU9bnVsbDtmdW5jdGlvbiBmKGYpe3ZhciBjLHMsbCxoLGQscD1mLmxlbmd0aCx2PSExLGc9bmV3IEFycmF5KHApLHk9bmV3IEFycmF5KHApO2ZvcihudWxsPT1vJiYodT1hKGQ9R2koKSkpLGM9MDtjPD1wOysrYyl7aWYoIShjPHAmJmkoaD1mW2NdLGMsZikpPT09dilpZih2PSF2KXM9Yyx1LmFyZWFTdGFydCgpLHUubGluZVN0YXJ0KCk7ZWxzZXtmb3IodS5saW5lRW5kKCksdS5saW5lU3RhcnQoKSxsPWMtMTtsPj1zOy0tbCl1LnBvaW50KGdbbF0seVtsXSk7dS5saW5lRW5kKCksdS5hcmVhRW5kKCl9diYmKGdbY109K3QoaCxjLGYpLHlbY109K2UoaCxjLGYpLHUucG9pbnQobj8rbihoLGMsZik6Z1tjXSxyPytyKGgsYyxmKTp5W2NdKSl9aWYoZClyZXR1cm4gdT1udWxsLGQrIiJ8fG51bGx9ZnVuY3Rpb24gYygpe3JldHVybiBleSgpLmRlZmluZWQoaSkuY3VydmUoYSkuY29udGV4dChvKX1yZXR1cm4gZi54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6UmcoK2UpLG49bnVsbCxmKTp0fSxmLngwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UmcoK24pLGYpOnR9LGYueDE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOm59LGYueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxyPW51bGwsZik6ZX0sZi55MD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTplfSxmLnkxPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTpyfSxmLmxpbmVYMD1mLmxpbmVZMD1mdW5jdGlvbigpe3JldHVybiBjKCkueCh0KS55KGUpfSxmLmxpbmVZMT1mdW5jdGlvbigpe3JldHVybiBjKCkueCh0KS55KHIpfSxmLmxpbmVYMT1mdW5jdGlvbigpe3JldHVybiBjKCkueChuKS55KGUpfSxmLmRlZmluZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZyghIXQpLGYpOml9LGYuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCxudWxsIT1vJiYodT1hKG8pKSxmKTphfSxmLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/bz11PW51bGw6dT1hKG89dCksZik6b30sZn1mdW5jdGlvbiBpeSh0LG4pe3JldHVybiBuPHQ/LTE6bj50PzE6bj49dD8wOk5hTn1mdW5jdGlvbiBveSh0KXtyZXR1cm4gdH1KZy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5saW5lVG8odCxuKX19fTt2YXIgYXk9ZnkoS2cpO2Z1bmN0aW9uIHV5KHQpe3RoaXMuX2N1cnZlPXR9ZnVuY3Rpb24gZnkodCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbmV3IHV5KHQobikpfXJldHVybiBuLl9jdXJ2ZT10LG59ZnVuY3Rpb24gY3kodCl7dmFyIG49dC5jdXJ2ZTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oZnkodCkpOm4oKS5fY3VydmV9LHR9ZnVuY3Rpb24gc3koKXtyZXR1cm4gY3koZXkoKS5jdXJ2ZShheSkpfWZ1bmN0aW9uIGx5KCl7dmFyIHQ9cnkoKS5jdXJ2ZShheSksbj10LmN1cnZlLGU9dC5saW5lWDAscj10LmxpbmVYMSxpPXQubGluZVkwLG89dC5saW5lWTE7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5zdGFydEFuZ2xlPXQueDAsZGVsZXRlIHQueDAsdC5lbmRBbmdsZT10LngxLGRlbGV0ZSB0LngxLHQucmFkaXVzPXQueSxkZWxldGUgdC55LHQuaW5uZXJSYWRpdXM9dC55MCxkZWxldGUgdC55MCx0Lm91dGVyUmFkaXVzPXQueTEsZGVsZXRlIHQueTEsdC5saW5lU3RhcnRBbmdsZT1mdW5jdGlvbigpe3JldHVybiBjeShlKCkpfSxkZWxldGUgdC5saW5lWDAsdC5saW5lRW5kQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gY3kocigpKX0sZGVsZXRlIHQubGluZVgxLHQubGluZUlubmVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIGN5KGkoKSl9LGRlbGV0ZSB0LmxpbmVZMCx0LmxpbmVPdXRlclJhZGl1cz1mdW5jdGlvbigpe3JldHVybiBjeShvKCkpfSxkZWxldGUgdC5saW5lWTEsdC5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKGZ5KHQpKTpuKCkuX2N1cnZlfSx0fWZ1bmN0aW9uIGh5KHQsbil7cmV0dXJuWyhuPStuKSpNYXRoLmNvcyh0LT1NYXRoLlBJLzIpLG4qTWF0aC5zaW4odCldfXV5LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYVN0YXJ0KCl9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5hcmVhRW5kKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX2N1cnZlLnBvaW50KG4qTWF0aC5zaW4odCksbiotTWF0aC5jb3ModCkpfX07dmFyIGR5PUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBweSh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gdnkodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIGd5KHQpe3ZhciBuPXB5LGU9dnkscj10eSxpPW55LG89bnVsbDtmdW5jdGlvbiBhKCl7dmFyIGEsdT1keS5jYWxsKGFyZ3VtZW50cyksZj1uLmFwcGx5KHRoaXMsdSksYz1lLmFwcGx5KHRoaXMsdSk7aWYob3x8KG89YT1HaSgpKSx0KG8sK3IuYXBwbHkodGhpcywodVswXT1mLHUpKSwraS5hcHBseSh0aGlzLHUpLCtyLmFwcGx5KHRoaXMsKHVbMF09Yyx1KSksK2kuYXBwbHkodGhpcyx1KSksYSlyZXR1cm4gbz1udWxsLGErIiJ8fG51bGx9cmV0dXJuIGEuc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsYSk6bn0sYS50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxhKTplfSxhLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6cn0sYS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOml9LGEuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1udWxsPT10P251bGw6dCxhKTpvfSxhfWZ1bmN0aW9uIHl5KHQsbixlLHIsaSl7dC5tb3ZlVG8obixlKSx0LmJlemllckN1cnZlVG8obj0obityKS8yLGUsbixpLHIsaSl9ZnVuY3Rpb24gX3kodCxuLGUscixpKXt0Lm1vdmVUbyhuLGUpLHQuYmV6aWVyQ3VydmVUbyhuLGU9KGUraSkvMixyLGUscixpKX1mdW5jdGlvbiBieSh0LG4sZSxyLGkpe3ZhciBvPWh5KG4sZSksYT1oeShuLGU9KGUraSkvMiksdT1oeShyLGUpLGY9aHkocixpKTt0Lm1vdmVUbyhvWzBdLG9bMV0pLHQuYmV6aWVyQ3VydmVUbyhhWzBdLGFbMV0sdVswXSx1WzFdLGZbMF0sZlsxXSl9dmFyIG15PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vSWcpO3QubW92ZVRvKGUsMCksdC5hcmMoMCwwLGUsMCxqZyl9fSx4eT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuLzUpLzI7dC5tb3ZlVG8oLTMqZSwtZSksdC5saW5lVG8oLWUsLWUpLHQubGluZVRvKC1lLC0zKmUpLHQubGluZVRvKGUsLTMqZSksdC5saW5lVG8oZSwtZSksdC5saW5lVG8oMyplLC1lKSx0LmxpbmVUbygzKmUsZSksdC5saW5lVG8oZSxlKSx0LmxpbmVUbyhlLDMqZSksdC5saW5lVG8oLWUsMyplKSx0LmxpbmVUbygtZSxlKSx0LmxpbmVUbygtMyplLGUpLHQuY2xvc2VQYXRoKCl9fSx3eT1NYXRoLnNxcnQoMS8zKSxNeT0yKnd5LEF5PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vTXkpLHI9ZSp3eTt0Lm1vdmVUbygwLC1lKSx0LmxpbmVUbyhyLDApLHQubGluZVRvKDAsZSksdC5saW5lVG8oLXIsMCksdC5jbG9zZVBhdGgoKX19LFR5PU1hdGguc2luKElnLzEwKS9NYXRoLnNpbig3KklnLzEwKSxOeT1NYXRoLnNpbihqZy8xMCkqVHksU3k9LU1hdGguY29zKGpnLzEwKSpUeSxFeT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydCguODkwODEzMDkxNTI5Mjg1MipuKSxyPU55KmUsaT1TeSplO3QubW92ZVRvKDAsLWUpLHQubGluZVRvKHIsaSk7Zm9yKHZhciBvPTE7bzw1Oysrbyl7dmFyIGE9amcqby81LHU9TWF0aC5jb3MoYSksZj1NYXRoLnNpbihhKTt0LmxpbmVUbyhmKmUsLXUqZSksdC5saW5lVG8odSpyLWYqaSxmKnIrdSppKX10LmNsb3NlUGF0aCgpfX0sa3k9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobikscj0tZS8yO3QucmVjdChyLHIsZSxlKX19LEN5PU1hdGguc3FydCgzKSxQeT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPS1NYXRoLnNxcnQobi8oMypDeSkpO3QubW92ZVRvKDAsMiplKSx0LmxpbmVUbygtQ3kqZSwtZSksdC5saW5lVG8oQ3kqZSwtZSksdC5jbG9zZVBhdGgoKX19LHp5PU1hdGguc3FydCgzKS8yLFJ5PTEvTWF0aC5zcXJ0KDEyKSxMeT0zKihSeS8yKzEpLER5PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vTHkpLHI9ZS8yLGk9ZSpSeSxvPXIsYT1lKlJ5K2UsdT0tbyxmPWE7dC5tb3ZlVG8ocixpKSx0LmxpbmVUbyhvLGEpLHQubGluZVRvKHUsZiksdC5saW5lVG8oLS41KnItenkqaSx6eSpyKy0uNSppKSx0LmxpbmVUbygtLjUqby16eSphLHp5Km8rLS41KmEpLHQubGluZVRvKC0uNSp1LXp5KmYsenkqdSstLjUqZiksdC5saW5lVG8oLS41KnIrenkqaSwtLjUqaS16eSpyKSx0LmxpbmVUbygtLjUqbyt6eSphLC0uNSphLXp5Km8pLHQubGluZVRvKC0uNSp1K3p5KmYsLS41KmYtenkqdSksdC5jbG9zZVBhdGgoKX19LFV5PVtteSx4eSxBeSxreSxFeSxQeSxEeV07ZnVuY3Rpb24gcXkoKXt9ZnVuY3Rpb24gT3kodCxuLGUpe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbygoMip0Ll94MCt0Ll94MSkvMywoMip0Ll95MCt0Ll95MSkvMywodC5feDArMip0Ll94MSkvMywodC5feTArMip0Ll95MSkvMywodC5feDArNCp0Ll94MStuKS82LCh0Ll95MCs0KnQuX3kxK2UpLzYpfWZ1bmN0aW9uIFl5KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBCeSh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gRnkodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEl5KHQsbil7dGhpcy5fYmFzaXM9bmV3IFl5KHQpLHRoaXMuX2JldGE9bn1ZeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAzOk95KHRoaXMsdGhpcy5feDEsdGhpcy5feTEpO2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2NvbnRleHQubGluZVRvKCg1KnRoaXMuX3gwK3RoaXMuX3gxKS82LCg1KnRoaXMuX3kwK3RoaXMuX3kxKS82KTtkZWZhdWx0Ok95KHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW59fSxCeS5wcm90b3R5cGU9e2FyZWFTdGFydDpxeSxhcmVhRW5kOnF5LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MisyKnRoaXMuX3gzKS8zLCh0aGlzLl95MisyKnRoaXMuX3kzKS8zKSx0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMrMip0aGlzLl94MikvMywodGhpcy5feTMrMip0aGlzLl95MikvMyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95MiksdGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCl9fSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gyPXQsdGhpcy5feTI9bjticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDQ9dCx0aGlzLl95ND1uLHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYsKHRoaXMuX3kwKzQqdGhpcy5feTErbikvNik7YnJlYWs7ZGVmYXVsdDpPeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sRnkucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7dmFyIGU9KHRoaXMuX3gwKzQqdGhpcy5feDErdCkvNixyPSh0aGlzLl95MCs0KnRoaXMuX3kxK24pLzY7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyhlLHIpOnRoaXMuX2NvbnRleHQubW92ZVRvKGUscik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpPeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sSXkucHJvdG90eXBlPXtsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PVtdLHRoaXMuX3k9W10sdGhpcy5fYmFzaXMubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl94LG49dGhpcy5feSxlPXQubGVuZ3RoLTE7aWYoZT4wKWZvcih2YXIgcixpPXRbMF0sbz1uWzBdLGE9dFtlXS1pLHU9bltlXS1vLGY9LTE7KytmPD1lOylyPWYvZSx0aGlzLl9iYXNpcy5wb2ludCh0aGlzLl9iZXRhKnRbZl0rKDEtdGhpcy5fYmV0YSkqKGkrciphKSx0aGlzLl9iZXRhKm5bZl0rKDEtdGhpcy5fYmV0YSkqKG8rcip1KSk7dGhpcy5feD10aGlzLl95PW51bGwsdGhpcy5fYmFzaXMubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtuKX19O3ZhciBIeT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIDE9PT1uP25ldyBZeSh0KTpuZXcgSXkodCxuKX1yZXR1cm4gZS5iZXRhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjg1KTtmdW5jdGlvbiBqeSh0LG4sZSl7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHQuX3gxK3QuX2sqKHQuX3gyLXQuX3gwKSx0Ll95MSt0Ll9rKih0Ll95Mi10Ll95MCksdC5feDIrdC5fayoodC5feDEtbiksdC5feTIrdC5fayoodC5feTEtZSksdC5feDIsdC5feTIpfWZ1bmN0aW9uIFh5KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1YeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6ankodGhpcyx0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX3gxPXQsdGhpcy5feTE9bjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0Omp5KHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgR3k9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuZXcgWHkodCxuKX1yZXR1cm4gZS50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oMCk7ZnVuY3Rpb24gVnkodCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1uKS82fVZ5LnByb3RvdHlwZT17YXJlYVN0YXJ0OnF5LGFyZWFFbmQ6cXksbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQ9dCx0aGlzLl95ND1uKTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl94NT10LHRoaXMuX3k1PW47YnJlYWs7ZGVmYXVsdDpqeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyICR5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFZ5KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFd5KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1XeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpqeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIFp5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFd5KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFF5KHQsbixlKXt2YXIgcj10Ll94MSxpPXQuX3kxLG89dC5feDIsYT10Ll95MjtpZih0Ll9sMDFfYT5GZyl7dmFyIHU9Mip0Ll9sMDFfMmErMyp0Ll9sMDFfYSp0Ll9sMTJfYSt0Ll9sMTJfMmEsZj0zKnQuX2wwMV9hKih0Ll9sMDFfYSt0Ll9sMTJfYSk7cj0ocip1LXQuX3gwKnQuX2wxMl8yYSt0Ll94Mip0Ll9sMDFfMmEpL2YsaT0oaSp1LXQuX3kwKnQuX2wxMl8yYSt0Ll95Mip0Ll9sMDFfMmEpL2Z9aWYodC5fbDIzX2E+Rmcpe3ZhciBjPTIqdC5fbDIzXzJhKzMqdC5fbDIzX2EqdC5fbDEyX2ErdC5fbDEyXzJhLHM9Myp0Ll9sMjNfYSoodC5fbDIzX2ErdC5fbDEyX2EpO289KG8qYyt0Ll94MSp0Ll9sMjNfMmEtbip0Ll9sMTJfMmEpL3MsYT0oYSpjK3QuX3kxKnQuX2wyM18yYS1lKnQuX2wxMl8yYSkvc310Ll9jb250ZXh0LmJlemllckN1cnZlVG8ocixpLG8sYSx0Ll94Mix0Ll95Mil9ZnVuY3Rpb24gSnkodCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9bn1KeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95Mil9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe2lmKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7dmFyIGU9dGhpcy5feDItdCxyPXRoaXMuX3kyLW47dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhlKmUrcipyLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0OlF5KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIEt5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgSnkodCxuKTpuZXcgWHkodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiB0Xyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1ufXRfLnByb3RvdHlwZT17YXJlYVN0YXJ0OnF5LGFyZWFFbmQ6cXksbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtpZih0PSt0LG49K24sdGhpcy5fcG9pbnQpe3ZhciBlPXRoaXMuX3gyLXQscj10aGlzLl95Mi1uO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coZSplK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9bik7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1uO2JyZWFrO2RlZmF1bHQ6UXkodGhpcyx0LG4pfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgbl89ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuP25ldyB0Xyh0LG4pOm5ldyBWeSh0LDApfXJldHVybiBlLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjUpO2Z1bmN0aW9uIGVfKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPW59ZV8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7aWYodD0rdCxuPStuLHRoaXMuX3BvaW50KXt2YXIgZT10aGlzLl94Mi10LHI9dGhpcy5feTItbjt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KGUqZStyKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0OlF5KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIHJfPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgZV8odCxuKTpuZXcgV3kodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiBpXyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gb18odCl7cmV0dXJuIHQ8MD8tMToxfWZ1bmN0aW9uIGFfKHQsbixlKXt2YXIgcj10Ll94MS10Ll94MCxpPW4tdC5feDEsbz0odC5feTEtdC5feTApLyhyfHxpPDAmJi0wKSxhPShlLXQuX3kxKS8oaXx8cjwwJiYtMCksdT0obyppK2EqcikvKHIraSk7cmV0dXJuKG9fKG8pK29fKGEpKSpNYXRoLm1pbihNYXRoLmFicyhvKSxNYXRoLmFicyhhKSwuNSpNYXRoLmFicyh1KSl8fDB9ZnVuY3Rpb24gdV8odCxuKXt2YXIgZT10Ll94MS10Ll94MDtyZXR1cm4gZT8oMyoodC5feTEtdC5feTApL2UtbikvMjpufWZ1bmN0aW9uIGZfKHQsbixlKXt2YXIgcj10Ll94MCxpPXQuX3kwLG89dC5feDEsYT10Ll95MSx1PShvLXIpLzM7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHIrdSxpK3UqbixvLXUsYS11KmUsbyxhKX1mdW5jdGlvbiBjXyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gc18odCl7dGhpcy5fY29udGV4dD1uZXcgbF8odCl9ZnVuY3Rpb24gbF8odCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIGhfKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBkXyh0KXt2YXIgbixlLHI9dC5sZW5ndGgtMSxpPW5ldyBBcnJheShyKSxvPW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShyKTtmb3IoaVswXT0wLG9bMF09MixhWzBdPXRbMF0rMip0WzFdLG49MTtuPHItMTsrK24paVtuXT0xLG9bbl09NCxhW25dPTQqdFtuXSsyKnRbbisxXTtmb3IoaVtyLTFdPTIsb1tyLTFdPTcsYVtyLTFdPTgqdFtyLTFdK3Rbcl0sbj0xO248cjsrK24pZT1pW25dL29bbi0xXSxvW25dLT1lLGFbbl0tPWUqYVtuLTFdO2ZvcihpW3ItMV09YVtyLTFdL29bci0xXSxuPXItMjtuPj0wOy0tbilpW25dPShhW25dLWlbbisxXSkvb1tuXTtmb3Iob1tyLTFdPSh0W3JdK2lbci0xXSkvMixuPTA7bjxyLTE7KytuKW9bbl09Mip0W24rMV0taVtuKzFdO3JldHVybltpLG9dfWZ1bmN0aW9uIHBfKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX3Q9bn1mdW5jdGlvbiB2Xyh0LG4pe2lmKChpPXQubGVuZ3RoKT4xKWZvcih2YXIgZSxyLGksbz0xLGE9dFtuWzBdXSx1PWEubGVuZ3RoO288aTsrK28pZm9yKHI9YSxhPXRbbltvXV0sZT0wO2U8dTsrK2UpYVtlXVsxXSs9YVtlXVswXT1pc05hTihyW2VdWzFdKT9yW2VdWzBdOnJbZV1bMV19ZnVuY3Rpb24gZ18odCl7Zm9yKHZhciBuPXQubGVuZ3RoLGU9bmV3IEFycmF5KG4pOy0tbj49MDspZVtuXT1uO3JldHVybiBlfWZ1bmN0aW9uIHlfKHQsbil7cmV0dXJuIHRbbl19ZnVuY3Rpb24gX18odCl7dmFyIG49dC5tYXAoYl8pO3JldHVybiBnXyh0KS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5bdF0tbltlXX0pfWZ1bmN0aW9uIGJfKHQpe2Zvcih2YXIgbixlPTAscj0tMSxpPXQubGVuZ3RoOysrcjxpOykobj0rdFtyXVsxXSkmJihlKz1uKTtyZXR1cm4gZX1mdW5jdGlvbiBtXyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24geF8odCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gd18odCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gTV8oKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBBXyh0KXt0LlU9dC5DPXQuTD10LlI9dC5QPXQuTj1udWxsfWZ1bmN0aW9uIFRfKHQsbil7dmFyIGU9bixyPW4uUixpPWUuVTtpP2kuTD09PWU/aS5MPXI6aS5SPXI6dC5fPXIsci5VPWksZS5VPXIsZS5SPXIuTCxlLlImJihlLlIuVT1lKSxyLkw9ZX1mdW5jdGlvbiBOXyh0LG4pe3ZhciBlPW4scj1uLkwsaT1lLlU7aT9pLkw9PT1lP2kuTD1yOmkuUj1yOnQuXz1yLHIuVT1pLGUuVT1yLGUuTD1yLlIsZS5MJiYoZS5MLlU9ZSksci5SPWV9ZnVuY3Rpb24gU18odCl7Zm9yKDt0Lkw7KXQ9dC5MO3JldHVybiB0fWZ1bmN0aW9uIEVfKHQsbixlLHIpe3ZhciBpPVtudWxsLG51bGxdLG89Sl8ucHVzaChpKS0xO3JldHVybiBpLmxlZnQ9dCxpLnJpZ2h0PW4sZSYmQ18oaSx0LG4sZSksciYmQ18oaSxuLHQsciksWl9bdC5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksWl9bbi5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksaX1mdW5jdGlvbiBrXyh0LG4sZSl7dmFyIHI9W24sZV07cmV0dXJuIHIubGVmdD10LHJ9ZnVuY3Rpb24gQ18odCxuLGUscil7dFswXXx8dFsxXT90LmxlZnQ9PT1lP3RbMV09cjp0WzBdPXI6KHRbMF09cix0LmxlZnQ9bix0LnJpZ2h0PWUpfWZ1bmN0aW9uIFBfKHQsbixlLHIsaSl7dmFyIG8sYT10WzBdLHU9dFsxXSxmPWFbMF0sYz1hWzFdLHM9MCxsPTEsaD11WzBdLWYsZD11WzFdLWM7aWYobz1uLWYsaHx8IShvPjApKXtpZihvLz1oLGg8MCl7aWYobzxzKXJldHVybjtvPGwmJihsPW8pfWVsc2UgaWYoaD4wKXtpZihvPmwpcmV0dXJuO28+cyYmKHM9byl9aWYobz1yLWYsaHx8IShvPDApKXtpZihvLz1oLGg8MCl7aWYobz5sKXJldHVybjtvPnMmJihzPW8pfWVsc2UgaWYoaD4wKXtpZihvPHMpcmV0dXJuO288bCYmKGw9byl9aWYobz1lLWMsZHx8IShvPjApKXtpZihvLz1kLGQ8MCl7aWYobzxzKXJldHVybjtvPGwmJihsPW8pfWVsc2UgaWYoZD4wKXtpZihvPmwpcmV0dXJuO28+cyYmKHM9byl9aWYobz1pLWMsZHx8IShvPDApKXtpZihvLz1kLGQ8MCl7aWYobz5sKXJldHVybjtvPnMmJihzPW8pfWVsc2UgaWYoZD4wKXtpZihvPHMpcmV0dXJuO288bCYmKGw9byl9cmV0dXJuIShzPjB8fGw8MSl8fChzPjAmJih0WzBdPVtmK3MqaCxjK3MqZF0pLGw8MSYmKHRbMV09W2YrbCpoLGMrbCpkXSksITApfX19fX1mdW5jdGlvbiB6Xyh0LG4sZSxyLGkpe3ZhciBvPXRbMV07aWYobylyZXR1cm4hMDt2YXIgYSx1LGY9dFswXSxjPXQubGVmdCxzPXQucmlnaHQsbD1jWzBdLGg9Y1sxXSxkPXNbMF0scD1zWzFdLHY9KGwrZCkvMixnPShoK3ApLzI7aWYocD09PWgpe2lmKHY8bnx8dj49cilyZXR1cm47aWYobD5kKXtpZihmKXtpZihmWzFdPj1pKXJldHVybn1lbHNlIGY9W3YsZV07bz1bdixpXX1lbHNle2lmKGYpe2lmKGZbMV08ZSlyZXR1cm59ZWxzZSBmPVt2LGldO289W3YsZV19fWVsc2UgaWYodT1nLShhPShsLWQpLyhwLWgpKSp2LGE8LTF8fGE+MSlpZihsPmQpe2lmKGYpe2lmKGZbMV0+PWkpcmV0dXJufWVsc2UgZj1bKGUtdSkvYSxlXTtvPVsoaS11KS9hLGldfWVsc2V7aWYoZil7aWYoZlsxXTxlKXJldHVybn1lbHNlIGY9WyhpLXUpL2EsaV07bz1bKGUtdSkvYSxlXX1lbHNlIGlmKGg8cCl7aWYoZil7aWYoZlswXT49cilyZXR1cm59ZWxzZSBmPVtuLGEqbit1XTtvPVtyLGEqcit1XX1lbHNle2lmKGYpe2lmKGZbMF08bilyZXR1cm59ZWxzZSBmPVtyLGEqcit1XTtvPVtuLGEqbit1XX1yZXR1cm4gdFswXT1mLHRbMV09bywhMH1mdW5jdGlvbiBSXyh0LG4pe3ZhciBlPXQuc2l0ZSxyPW4ubGVmdCxpPW4ucmlnaHQ7cmV0dXJuIGU9PT1pJiYoaT1yLHI9ZSksaT9NYXRoLmF0YW4yKGlbMV0tclsxXSxpWzBdLXJbMF0pOihlPT09cj8ocj1uWzFdLGk9blswXSk6KHI9blswXSxpPW5bMV0pLE1hdGguYXRhbjIoclswXS1pWzBdLGlbMV0tclsxXSkpfWZ1bmN0aW9uIExfKHQsbil7cmV0dXJuIG5bKyhuLmxlZnQhPT10LnNpdGUpXX1mdW5jdGlvbiBEXyh0LG4pe3JldHVybiBuWysobi5sZWZ0PT09dC5zaXRlKV19aV8ucHJvdG90eXBlPXthcmVhU3RhcnQ6cXksYXJlYUVuZDpxeSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCl9LHBvaW50OmZ1bmN0aW9uKHQsbil7dD0rdCxuPStuLHRoaXMuX3BvaW50P3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6KHRoaXMuX3BvaW50PTEsdGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKSl9fSxjXy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT10aGlzLl90MD1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLHRoaXMuX3kxKTticmVhaztjYXNlIDM6Zl8odGhpcyx0aGlzLl90MCx1Xyh0aGlzLHRoaXMuX3QwKSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3ZhciBlPU5hTjtpZihuPStuLCh0PSt0KSE9PXRoaXMuX3gxfHxuIT09dGhpcy5feTEpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsZl8odGhpcyx1Xyh0aGlzLGU9YV8odGhpcyx0LG4pKSxlKTticmVhaztkZWZhdWx0OmZfKHRoaXMsdGhpcy5fdDAsZT1hXyh0aGlzLHQsbikpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bix0aGlzLl90MD1lfX19LChzXy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShjXy5wcm90b3R5cGUpKS5wb2ludD1mdW5jdGlvbih0LG4pe2NfLnByb3RvdHlwZS5wb2ludC5jYWxsKHRoaXMsbix0KX0sbF8ucHJvdG90eXBlPXttb3ZlVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0Lm1vdmVUbyhuLHQpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxsaW5lVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0LmxpbmVUbyhuLHQpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8obix0LHIsZSxvLGkpfX0saF8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxuPXRoaXMuX3ksZT10Lmxlbmd0aDtpZihlKWlmKHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odFswXSxuWzBdKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0WzBdLG5bMF0pLDI9PT1lKXRoaXMuX2NvbnRleHQubGluZVRvKHRbMV0sblsxXSk7ZWxzZSBmb3IodmFyIHI9ZF8odCksaT1kXyhuKSxvPTAsYT0xO2E8ZTsrK28sKythKXRoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhyWzBdW29dLGlbMF1bb10sclsxXVtvXSxpWzFdW29dLHRbYV0sblthXSk7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09ZSkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmUsdGhpcy5feD10aGlzLl95PW51bGx9LHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5feC5wdXNoKCt0KSx0aGlzLl95LnB1c2goK24pfX0scF8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD10aGlzLl95PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MDx0aGlzLl90JiZ0aGlzLl90PDEmJjI9PT10aGlzLl9wb2ludCYmdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCx0aGlzLl95KSwodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT49MCYmKHRoaXMuX3Q9MS10aGlzLl90LHRoaXMuX2xpbmU9MS10aGlzLl9saW5lKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OmlmKHRoaXMuX3Q8PTApdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCxuKSx0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pO2Vsc2V7dmFyIGU9dGhpcy5feCooMS10aGlzLl90KSt0KnRoaXMuX3Q7dGhpcy5fY29udGV4dC5saW5lVG8oZSx0aGlzLl95KSx0aGlzLl9jb250ZXh0LmxpbmVUbyhlLG4pfX10aGlzLl94PXQsdGhpcy5feT1ufX0sTV8ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNXyxpbnNlcnQ6ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk7aWYodCl7aWYobi5QPXQsbi5OPXQuTix0Lk4mJih0Lk4uUD1uKSx0Lk49bix0LlIpe2Zvcih0PXQuUjt0Lkw7KXQ9dC5MO3QuTD1ufWVsc2UgdC5SPW47ZT10fWVsc2UgdGhpcy5fPyh0PVNfKHRoaXMuXyksbi5QPW51bGwsbi5OPXQsdC5QPXQuTD1uLGU9dCk6KG4uUD1uLk49bnVsbCx0aGlzLl89bixlPW51bGwpO2ZvcihuLkw9bi5SPW51bGwsbi5VPWUsbi5DPSEwLHQ9bjtlJiZlLkM7KWU9PT0ocj1lLlUpLkw/KGk9ci5SKSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5SJiYoVF8odGhpcyxlKSxlPSh0PWUpLlUpLGUuQz0hMSxyLkM9ITAsTl8odGhpcyxyKSk6KGk9ci5MKSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5MJiYoTl8odGhpcyxlKSxlPSh0PWUpLlUpLGUuQz0hMSxyLkM9ITAsVF8odGhpcyxyKSksZT10LlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbih0KXt0Lk4mJih0Lk4uUD10LlApLHQuUCYmKHQuUC5OPXQuTiksdC5OPXQuUD1udWxsO3ZhciBuLGUscixpPXQuVSxvPXQuTCxhPXQuUjtpZihlPW8/YT9TXyhhKTpvOmEsaT9pLkw9PT10P2kuTD1lOmkuUj1lOnRoaXMuXz1lLG8mJmE/KHI9ZS5DLGUuQz10LkMsZS5MPW8sby5VPWUsZSE9PWE/KGk9ZS5VLGUuVT10LlUsdD1lLlIsaS5MPXQsZS5SPWEsYS5VPWUpOihlLlU9aSxpPWUsdD1lLlIpKToocj10LkMsdD1lKSx0JiYodC5VPWkpLCFyKWlmKHQmJnQuQyl0LkM9ITE7ZWxzZXtkb3tpZih0PT09dGhpcy5fKWJyZWFrO2lmKHQ9PT1pLkwpe2lmKChuPWkuUikuQyYmKG4uQz0hMSxpLkM9ITAsVF8odGhpcyxpKSxuPWkuUiksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5SJiZuLlIuQ3x8KG4uTC5DPSExLG4uQz0hMCxOXyh0aGlzLG4pLG49aS5SKSxuLkM9aS5DLGkuQz1uLlIuQz0hMSxUXyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfX1lbHNlIGlmKChuPWkuTCkuQyYmKG4uQz0hMSxpLkM9ITAsTl8odGhpcyxpKSxuPWkuTCksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5MJiZuLkwuQ3x8KG4uUi5DPSExLG4uQz0hMCxUXyh0aGlzLG4pLG49aS5MKSxuLkM9aS5DLGkuQz1uLkwuQz0hMSxOXyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfW4uQz0hMCx0PWksaT1pLlV9d2hpbGUoIXQuQyk7dCYmKHQuQz0hMSl9fX07dmFyIFVfLHFfPVtdO2Z1bmN0aW9uIE9fKCl7QV8odGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uIFlfKHQpe3ZhciBuPXQuUCxlPXQuTjtpZihuJiZlKXt2YXIgcj1uLnNpdGUsaT10LnNpdGUsbz1lLnNpdGU7aWYociE9PW8pe3ZhciBhPWlbMF0sdT1pWzFdLGY9clswXS1hLGM9clsxXS11LHM9b1swXS1hLGw9b1sxXS11LGg9MiooZipsLWMqcyk7aWYoIShoPj0tdGIpKXt2YXIgZD1mKmYrYypjLHA9cypzK2wqbCx2PShsKmQtYypwKS9oLGc9KGYqcC1zKmQpL2gseT1xXy5wb3AoKXx8bmV3IE9fO3kuYXJjPXQseS5zaXRlPWkseS54PXYrYSx5Lnk9KHkuY3k9Zyt1KStNYXRoLnNxcnQodip2K2cqZyksdC5jaXJjbGU9eTtmb3IodmFyIF89bnVsbCxiPVFfLl87YjspaWYoeS55PGIueXx8eS55PT09Yi55JiZ5Lng8PWIueCl7aWYoIWIuTCl7Xz1iLlA7YnJlYWt9Yj1iLkx9ZWxzZXtpZighYi5SKXtfPWI7YnJlYWt9Yj1iLlJ9UV8uaW5zZXJ0KF8seSksX3x8KFVfPXkpfX19fWZ1bmN0aW9uIEJfKHQpe3ZhciBuPXQuY2lyY2xlO24mJihuLlB8fChVXz1uLk4pLFFfLnJlbW92ZShuKSxxXy5wdXNoKG4pLEFfKG4pLHQuY2lyY2xlPW51bGwpfXZhciBGXz1bXTtmdW5jdGlvbiBJXygpe0FfKHRoaXMpLHRoaXMuZWRnZT10aGlzLnNpdGU9dGhpcy5jaXJjbGU9bnVsbH1mdW5jdGlvbiBIXyh0KXt2YXIgbj1GXy5wb3AoKXx8bmV3IElfO3JldHVybiBuLnNpdGU9dCxufWZ1bmN0aW9uIGpfKHQpe0JfKHQpLFdfLnJlbW92ZSh0KSxGXy5wdXNoKHQpLEFfKHQpfWZ1bmN0aW9uIFhfKHQpe3ZhciBuPXQuY2lyY2xlLGU9bi54LHI9bi5jeSxpPVtlLHJdLG89dC5QLGE9dC5OLHU9W3RdO2pfKHQpO2Zvcih2YXIgZj1vO2YuY2lyY2xlJiZNYXRoLmFicyhlLWYuY2lyY2xlLngpPEtfJiZNYXRoLmFicyhyLWYuY2lyY2xlLmN5KTxLXzspbz1mLlAsdS51bnNoaWZ0KGYpLGpfKGYpLGY9bzt1LnVuc2hpZnQoZiksQl8oZik7Zm9yKHZhciBjPWE7Yy5jaXJjbGUmJk1hdGguYWJzKGUtYy5jaXJjbGUueCk8S18mJk1hdGguYWJzKHItYy5jaXJjbGUuY3kpPEtfOylhPWMuTix1LnB1c2goYyksal8oYyksYz1hO3UucHVzaChjKSxCXyhjKTt2YXIgcyxsPXUubGVuZ3RoO2ZvcihzPTE7czxsOysrcyljPXVbc10sZj11W3MtMV0sQ18oYy5lZGdlLGYuc2l0ZSxjLnNpdGUsaSk7Zj11WzBdLChjPXVbbC0xXSkuZWRnZT1FXyhmLnNpdGUsYy5zaXRlLG51bGwsaSksWV8oZiksWV8oYyl9ZnVuY3Rpb24gR18odCl7Zm9yKHZhciBuLGUscixpLG89dFswXSxhPXRbMV0sdT1XXy5fO3U7KWlmKChyPVZfKHUsYSktbyk+S18pdT11Lkw7ZWxzZXtpZighKChpPW8tJF8odSxhKSk+S18pKXtyPi1LXz8obj11LlAsZT11KTppPi1LXz8obj11LGU9dS5OKTpuPWU9dTticmVha31pZighdS5SKXtuPXU7YnJlYWt9dT11LlJ9IWZ1bmN0aW9uKHQpe1pfW3QuaW5kZXhdPXtzaXRlOnQsaGFsZmVkZ2VzOltdfX0odCk7dmFyIGY9SF8odCk7aWYoV18uaW5zZXJ0KG4sZiksbnx8ZSl7aWYobj09PWUpcmV0dXJuIEJfKG4pLGU9SF8obi5zaXRlKSxXXy5pbnNlcnQoZixlKSxmLmVkZ2U9ZS5lZGdlPUVfKG4uc2l0ZSxmLnNpdGUpLFlfKG4pLHZvaWQgWV8oZSk7aWYoZSl7Ql8obiksQl8oZSk7dmFyIGM9bi5zaXRlLHM9Y1swXSxsPWNbMV0saD10WzBdLXMsZD10WzFdLWwscD1lLnNpdGUsdj1wWzBdLXMsZz1wWzFdLWwseT0yKihoKmctZCp2KSxfPWgqaCtkKmQsYj12KnYrZypnLG09WyhnKl8tZCpiKS95K3MsKGgqYi12Kl8pL3krbF07Q18oZS5lZGdlLGMscCxtKSxmLmVkZ2U9RV8oYyx0LG51bGwsbSksZS5lZGdlPUVfKHQscCxudWxsLG0pLFlfKG4pLFlfKGUpfWVsc2UgZi5lZGdlPUVfKG4uc2l0ZSxmLnNpdGUpfX1mdW5jdGlvbiBWXyh0LG4pe3ZhciBlPXQuc2l0ZSxyPWVbMF0saT1lWzFdLG89aS1uO2lmKCFvKXJldHVybiByO3ZhciBhPXQuUDtpZighYSlyZXR1cm4tMS8wO3ZhciB1PShlPWEuc2l0ZSlbMF0sZj1lWzFdLGM9Zi1uO2lmKCFjKXJldHVybiB1O3ZhciBzPXUtcixsPTEvby0xL2MsaD1zL2M7cmV0dXJuIGw/KC1oK01hdGguc3FydChoKmgtMipsKihzKnMvKC0yKmMpLWYrYy8yK2ktby8yKSkpL2wrcjoocit1KS8yfWZ1bmN0aW9uICRfKHQsbil7dmFyIGU9dC5OO2lmKGUpcmV0dXJuIFZfKGUsbik7dmFyIHI9dC5zaXRlO3JldHVybiByWzFdPT09bj9yWzBdOjEvMH12YXIgV18sWl8sUV8sSl8sS189MWUtNix0Yj0xZS0xMjtmdW5jdGlvbiBuYih0LG4pe3JldHVybiBuWzFdLXRbMV18fG5bMF0tdFswXX1mdW5jdGlvbiBlYih0LG4pe3ZhciBlLHIsaSxvPXQuc29ydChuYikucG9wKCk7Zm9yKEpfPVtdLFpfPW5ldyBBcnJheSh0Lmxlbmd0aCksV189bmV3IE1fLFFfPW5ldyBNXzs7KWlmKGk9VV8sbyYmKCFpfHxvWzFdPGkueXx8b1sxXT09PWkueSYmb1swXTxpLngpKW9bMF09PT1lJiZvWzFdPT09cnx8KEdfKG8pLGU9b1swXSxyPW9bMV0pLG89dC5wb3AoKTtlbHNle2lmKCFpKWJyZWFrO1hfKGkuYXJjKX1pZihmdW5jdGlvbigpe2Zvcih2YXIgdCxuLGUscixpPTAsbz1aXy5sZW5ndGg7aTxvOysraSlpZigodD1aX1tpXSkmJihyPShuPXQuaGFsZmVkZ2VzKS5sZW5ndGgpKXt2YXIgYT1uZXcgQXJyYXkociksdT1uZXcgQXJyYXkocik7Zm9yKGU9MDtlPHI7KytlKWFbZV09ZSx1W2VdPVJfKHQsSl9bbltlXV0pO2ZvcihhLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gdVtuXS11W3RdfSksZT0wO2U8cjsrK2UpdVtlXT1uW2FbZV1dO2ZvcihlPTA7ZTxyOysrZSluW2VdPXVbZV19fSgpLG4pe3ZhciBhPStuWzBdWzBdLHU9K25bMF1bMV0sZj0rblsxXVswXSxjPStuWzFdWzFdOyFmdW5jdGlvbih0LG4sZSxyKXtmb3IodmFyIGksbz1KXy5sZW5ndGg7by0tOyl6XyhpPUpfW29dLHQsbixlLHIpJiZQXyhpLHQsbixlLHIpJiYoTWF0aC5hYnMoaVswXVswXS1pWzFdWzBdKT5LX3x8TWF0aC5hYnMoaVswXVsxXS1pWzFdWzFdKT5LXyl8fGRlbGV0ZSBKX1tvXX0oYSx1LGYsYyksZnVuY3Rpb24odCxuLGUscil7dmFyIGksbyxhLHUsZixjLHMsbCxoLGQscCx2LGc9Wl8ubGVuZ3RoLHk9ITA7Zm9yKGk9MDtpPGc7KytpKWlmKG89Wl9baV0pe2ZvcihhPW8uc2l0ZSx1PShmPW8uaGFsZmVkZ2VzKS5sZW5ndGg7dS0tOylKX1tmW3VdXXx8Zi5zcGxpY2UodSwxKTtmb3IodT0wLGM9Zi5sZW5ndGg7dTxjOylwPShkPURfKG8sSl9bZlt1XV0pKVswXSx2PWRbMV0sbD0ocz1MXyhvLEpfW2ZbKyt1JWNdXSkpWzBdLGg9c1sxXSwoTWF0aC5hYnMocC1sKT5LX3x8TWF0aC5hYnModi1oKT5LXykmJihmLnNwbGljZSh1LDAsSl8ucHVzaChrXyhhLGQsTWF0aC5hYnMocC10KTxLXyYmci12PktfP1t0LE1hdGguYWJzKGwtdCk8S18/aDpyXTpNYXRoLmFicyh2LXIpPEtfJiZlLXA+S18/W01hdGguYWJzKGgtcik8S18/bDplLHJdOk1hdGguYWJzKHAtZSk8S18mJnYtbj5LXz9bZSxNYXRoLmFicyhsLWUpPEtfP2g6bl06TWF0aC5hYnModi1uKTxLXyYmcC10PktfP1tNYXRoLmFicyhoLW4pPEtfP2w6dCxuXTpudWxsKSktMSksKytjKTtjJiYoeT0hMSl9aWYoeSl7dmFyIF8sYixtLHg9MS8wO2ZvcihpPTAseT1udWxsO2k8ZzsrK2kpKG89Wl9baV0pJiYobT0oXz0oYT1vLnNpdGUpWzBdLXQpKl8rKGI9YVsxXS1uKSpiKTx4JiYoeD1tLHk9byk7aWYoeSl7dmFyIHc9W3Qsbl0sTT1bdCxyXSxBPVtlLHJdLFQ9W2Usbl07eS5oYWxmZWRnZXMucHVzaChKXy5wdXNoKGtfKGE9eS5zaXRlLHcsTSkpLTEsSl8ucHVzaChrXyhhLE0sQSkpLTEsSl8ucHVzaChrXyhhLEEsVCkpLTEsSl8ucHVzaChrXyhhLFQsdykpLTEpfX1mb3IoaT0wO2k8ZzsrK2kpKG89Wl9baV0pJiYoby5oYWxmZWRnZXMubGVuZ3RofHxkZWxldGUgWl9baV0pfShhLHUsZixjKX10aGlzLmVkZ2VzPUpfLHRoaXMuY2VsbHM9Wl8sV189UV89Sl89Wl89bnVsbH1mdW5jdGlvbiByYih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gaWIodCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy50cmFuc2Zvcm09ZX1mdW5jdGlvbiBvYih0LG4sZSl7dGhpcy5rPXQsdGhpcy54PW4sdGhpcy55PWV9ZWIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjplYixwb2x5Z29uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMubWFwKGZ1bmN0aW9uKG4pe3ZhciBlPW4uaGFsZmVkZ2VzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gTF8obix0W2VdKX0pO3JldHVybiBlLmRhdGE9bi5zaXRlLmRhdGEsZX0pfSx0cmlhbmdsZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXSxuPXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLHIpe2lmKG89KGk9ZS5oYWxmZWRnZXMpLmxlbmd0aClmb3IodmFyIGksbyxhLHUsZixjLHM9ZS5zaXRlLGw9LTEsaD1uW2lbby0xXV0sZD1oLmxlZnQ9PT1zP2gucmlnaHQ6aC5sZWZ0OysrbDxvOylhPWQsZD0oaD1uW2lbbF1dKS5sZWZ0PT09cz9oLnJpZ2h0OmgubGVmdCxhJiZkJiZyPGEuaW5kZXgmJnI8ZC5pbmRleCYmKGY9YSxjPWQsKCh1PXMpWzBdLWNbMF0pKihmWzFdLXVbMV0pLSh1WzBdLWZbMF0pKihjWzFdLXVbMV0pPDApJiZ0LnB1c2goW3MuZGF0YSxhLmRhdGEsZC5kYXRhXSl9KSx0fSxsaW5rczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2VzLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdC5yaWdodH0pLm1hcChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOnQubGVmdC5kYXRhLHRhcmdldDp0LnJpZ2h0LmRhdGF9fSl9LGZpbmQ6ZnVuY3Rpb24odCxuLGUpe2Zvcih2YXIgcixpLG89dGhpcyxhPW8uX2ZvdW5kfHwwLHU9by5jZWxscy5sZW5ndGg7IShpPW8uY2VsbHNbYV0pOylpZigrK2E+PXUpcmV0dXJuIG51bGw7dmFyIGY9dC1pLnNpdGVbMF0sYz1uLWkuc2l0ZVsxXSxzPWYqZitjKmM7ZG97aT1vLmNlbGxzW3I9YV0sYT1udWxsLGkuaGFsZmVkZ2VzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHI9by5lZGdlc1tlXSx1PXIubGVmdDtpZih1IT09aS5zaXRlJiZ1fHwodT1yLnJpZ2h0KSl7dmFyIGY9dC11WzBdLGM9bi11WzFdLGw9ZipmK2MqYztsPHMmJihzPWwsYT11LmluZGV4KX19KX13aGlsZShudWxsIT09YSk7cmV0dXJuIG8uX2ZvdW5kPXIsbnVsbD09ZXx8czw9ZSplP2kuc2l0ZTpudWxsfX0sb2IucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpvYixzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQ/dGhpczpuZXcgb2IodGhpcy5rKnQsdGhpcy54LHRoaXMueSl9LHRyYW5zbGF0ZTpmdW5jdGlvbih0LG4pe3JldHVybiAwPT09dCYwPT09bj90aGlzOm5ldyBvYih0aGlzLmssdGhpcy54K3RoaXMuayp0LHRoaXMueSt0aGlzLmsqbil9LGFwcGx5OmZ1bmN0aW9uKHQpe3JldHVyblt0WzBdKnRoaXMuayt0aGlzLngsdFsxXSp0aGlzLmsrdGhpcy55XX0sYXBwbHlYOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuayt0aGlzLnh9LGFwcGx5WTpmdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLmsrdGhpcy55fSxpbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuWyh0WzBdLXRoaXMueCkvdGhpcy5rLCh0WzFdLXRoaXMueSkvdGhpcy5rXX0saW52ZXJ0WDpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLngpL3RoaXMua30saW52ZXJ0WTpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLnkpL3RoaXMua30scmVzY2FsZVg6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weSgpLmRvbWFpbih0LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCx0aGlzKS5tYXAodC5pbnZlcnQsdCkpfSxyZXNjYWxlWTpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCkuZG9tYWluKHQucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLHRoaXMpLm1hcCh0LmludmVydCx0KSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMueCsiLCIrdGhpcy55KyIpIHNjYWxlKCIrdGhpcy5rKyIpIn19O3ZhciBhYj1uZXcgb2IoMSwwLDApO2Z1bmN0aW9uIHViKHQpe3JldHVybiB0Ll9fem9vbXx8YWJ9ZnVuY3Rpb24gZmIoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIGNiKCl7dC5ldmVudC5wcmV2ZW50RGVmYXVsdCgpLHQuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gc2IoKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gbGIoKXt2YXIgdCxuLGU9dGhpcztyZXR1cm4gZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ/KHQ9KGU9ZS5vd25lclNWR0VsZW1lbnR8fGUpLndpZHRoLmJhc2VWYWwudmFsdWUsbj1lLmhlaWdodC5iYXNlVmFsLnZhbHVlKToodD1lLmNsaWVudFdpZHRoLG49ZS5jbGllbnRIZWlnaHQpLFtbMCwwXSxbdCxuXV19ZnVuY3Rpb24gaGIoKXtyZXR1cm4gdGhpcy5fX3pvb218fGFifWZ1bmN0aW9uIGRiKCl7cmV0dXJuLXQuZXZlbnQuZGVsdGFZKih0LmV2ZW50LmRlbHRhTW9kZT8xMjA6MSkvNTAwfWZ1bmN0aW9uIHBiKCl7cmV0dXJuIm9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIHZiKHQsbixlKXt2YXIgcj10LmludmVydFgoblswXVswXSktZVswXVswXSxpPXQuaW52ZXJ0WChuWzFdWzBdKS1lWzFdWzBdLG89dC5pbnZlcnRZKG5bMF1bMV0pLWVbMF1bMV0sYT10LmludmVydFkoblsxXVsxXSktZVsxXVsxXTtyZXR1cm4gdC50cmFuc2xhdGUoaT5yPyhyK2kpLzI6TWF0aC5taW4oMCxyKXx8TWF0aC5tYXgoMCxpKSxhPm8/KG8rYSkvMjpNYXRoLm1pbigwLG8pfHxNYXRoLm1heCgwLGEpKX11Yi5wcm90b3R5cGU9b2IucHJvdG90eXBlLHQudmVyc2lvbj0iNS43LjAiLHQuYmlzZWN0PWksdC5iaXNlY3RSaWdodD1pLHQuYmlzZWN0TGVmdD1vLHQuYXNjZW5kaW5nPW4sdC5iaXNlY3Rvcj1lLHQuY3Jvc3M9ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbyx1LGY9dC5sZW5ndGgsYz1uLmxlbmd0aCxzPW5ldyBBcnJheShmKmMpO2ZvcihudWxsPT1lJiYoZT1hKSxyPW89MDtyPGY7KytyKWZvcih1PXRbcl0saT0wO2k8YzsrK2ksKytvKXNbb109ZSh1LG5baV0pO3JldHVybiBzfSx0LmRlc2NlbmRpbmc9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbjx0Py0xOm4+dD8xOm4+PXQ/MDpOYU59LHQuZGV2aWF0aW9uPWMsdC5leHRlbnQ9cyx0Lmhpc3RvZ3JhbT1mdW5jdGlvbigpe3ZhciB0PXYsbj1zLGU9TTtmdW5jdGlvbiByKHIpe3ZhciBvLGEsdT1yLmxlbmd0aCxmPW5ldyBBcnJheSh1KTtmb3Iobz0wO288dTsrK28pZltvXT10KHJbb10sbyxyKTt2YXIgYz1uKGYpLHM9Y1swXSxsPWNbMV0saD1lKGYscyxsKTtBcnJheS5pc0FycmF5KGgpfHwoaD13KHMsbCxoKSxoPWcoTWF0aC5jZWlsKHMvaCkqaCxsLGgpKTtmb3IodmFyIGQ9aC5sZW5ndGg7aFswXTw9czspaC5zaGlmdCgpLC0tZDtmb3IoO2hbZC0xXT5sOyloLnBvcCgpLC0tZDt2YXIgcCx2PW5ldyBBcnJheShkKzEpO2ZvcihvPTA7bzw9ZDsrK28pKHA9dltvXT1bXSkueDA9bz4wP2hbby0xXTpzLHAueDE9bzxkP2hbb106bDtmb3Iobz0wO288dTsrK28pczw9KGE9ZltvXSkmJmE8PWwmJnZbaShoLGEsMCxkKV0ucHVzaChyW29dKTtyZXR1cm4gdn1yZXR1cm4gci52YWx1ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnAobikscik6dH0sci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpwKFt0WzBdLHRbMV1dKSxyKTpufSxyLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP3AoaC5jYWxsKHQpKTpwKHQpLHIpOmV9LHJ9LHQudGhyZXNob2xkRnJlZWRtYW5EaWFjb25pcz1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9ZC5jYWxsKHQsdSkuc29ydChuKSxNYXRoLmNlaWwoKHItZSkvKDIqKEEodCwuNzUpLUEodCwuMjUpKSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSx0LnRocmVzaG9sZFNjb3R0PWZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gTWF0aC5jZWlsKChlLW4pLygzLjUqYyh0KSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSx0LnRocmVzaG9sZFN0dXJnZXM9TSx0Lm1heD1ULHQubWVhbj1mdW5jdGlvbih0LG4pe3ZhciBlLHI9dC5sZW5ndGgsaT1yLG89LTEsYT0wO2lmKG51bGw9PW4pZm9yKDsrK288cjspaXNOYU4oZT11KHRbb10pKT8tLWk6YSs9ZTtlbHNlIGZvcig7KytvPHI7KWlzTmFOKGU9dShuKHRbb10sbyx0KSkpPy0taTphKz1lO2lmKGkpcmV0dXJuIGEvaX0sdC5tZWRpYW49ZnVuY3Rpb24odCxlKXt2YXIgcixpPXQubGVuZ3RoLG89LTEsYT1bXTtpZihudWxsPT1lKWZvcig7KytvPGk7KWlzTmFOKHI9dSh0W29dKSl8fGEucHVzaChyKTtlbHNlIGZvcig7KytvPGk7KWlzTmFOKHI9dShlKHRbb10sbyx0KSkpfHxhLnB1c2gocik7cmV0dXJuIEEoYS5zb3J0KG4pLC41KX0sdC5tZXJnZT1OLHQubWluPVMsdC5wYWlycz1mdW5jdGlvbih0LG4pe251bGw9PW4mJihuPWEpO2Zvcih2YXIgZT0wLHI9dC5sZW5ndGgtMSxpPXRbMF0sbz1uZXcgQXJyYXkocjwwPzA6cik7ZTxyOylvW2VdPW4oaSxpPXRbKytlXSk7cmV0dXJuIG99LHQucGVybXV0ZT1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKTtlLS07KXJbZV09dFtuW2VdXTtyZXR1cm4gcn0sdC5xdWFudGlsZT1BLHQucmFuZ2U9Zyx0LnNjYW49ZnVuY3Rpb24odCxlKXtpZihyPXQubGVuZ3RoKXt2YXIgcixpLG89MCxhPTAsdT10W2FdO2ZvcihudWxsPT1lJiYoZT1uKTsrK288cjspKGUoaT10W29dLHUpPDB8fDAhPT1lKHUsdSkpJiYodT1pLGE9byk7cmV0dXJuIDA9PT1lKHUsdSk/YTp2b2lkIDB9fSx0LnNodWZmbGU9ZnVuY3Rpb24odCxuLGUpe2Zvcih2YXIgcixpLG89KG51bGw9PWU/dC5sZW5ndGg6ZSktKG49bnVsbD09bj8wOituKTtvOylpPU1hdGgucmFuZG9tKCkqby0tfDAscj10W28rbl0sdFtvK25dPXRbaStuXSx0W2krbl09cjtyZXR1cm4gdH0sdC5zdW09ZnVuY3Rpb24odCxuKXt2YXIgZSxyPXQubGVuZ3RoLGk9LTEsbz0wO2lmKG51bGw9PW4pZm9yKDsrK2k8cjspKGU9K3RbaV0pJiYobys9ZSk7ZWxzZSBmb3IoOysraTxyOykoZT0rbih0W2ldLGksdCkpJiYobys9ZSk7cmV0dXJuIG99LHQudGlja3M9bSx0LnRpY2tJbmNyZW1lbnQ9eCx0LnRpY2tTdGVwPXcsdC50cmFuc3Bvc2U9RSx0LnZhcmlhbmNlPWYsdC56aXA9ZnVuY3Rpb24oKXtyZXR1cm4gRShhcmd1bWVudHMpfSx0LmF4aXNUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIEIoeix0KX0sdC5heGlzUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIEIoUix0KX0sdC5heGlzQm90dG9tPWZ1bmN0aW9uKHQpe3JldHVybiBCKEwsdCl9LHQuYXhpc0xlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIEIoRCx0KX0sdC5icnVzaD1mdW5jdGlvbigpe3JldHVybiBSaSh3aSl9LHQuYnJ1c2hYPWZ1bmN0aW9uKCl7cmV0dXJuIFJpKG1pKX0sdC5icnVzaFk9ZnVuY3Rpb24oKXtyZXR1cm4gUmkoeGkpfSx0LmJydXNoU2VsZWN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBuPXQuX19icnVzaDtyZXR1cm4gbj9uLmRpbS5vdXRwdXQobi5zZWxlY3Rpb24pOm51bGx9LHQuY2hvcmQ9ZnVuY3Rpb24oKXt2YXIgdD0wLG49bnVsbCxlPW51bGwscj1udWxsO2Z1bmN0aW9uIGkoaSl7dmFyIG8sYSx1LGYsYyxzLGw9aS5sZW5ndGgsaD1bXSxkPWcobCkscD1bXSx2PVtdLHk9di5ncm91cHM9bmV3IEFycmF5KGwpLF89bmV3IEFycmF5KGwqbCk7Zm9yKG89MCxjPS0xOysrYzxsOyl7Zm9yKGE9MCxzPS0xOysrczxsOylhKz1pW2NdW3NdO2gucHVzaChhKSxwLnB1c2goZyhsKSksbys9YX1mb3IobiYmZC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oaFt0XSxoW2VdKX0pLGUmJnAuZm9yRWFjaChmdW5jdGlvbih0LG4pe3Quc29ydChmdW5jdGlvbih0LHIpe3JldHVybiBlKGlbbl1bdF0saVtuXVtyXSl9KX0pLGY9KG89WWkoMCxPaS10KmwpL28pP3Q6T2kvbCxhPTAsYz0tMTsrK2M8bDspe2Zvcih1PWEscz0tMTsrK3M8bDspe3ZhciBiPWRbY10sbT1wW2JdW3NdLHg9aVtiXVttXSx3PWEsTT1hKz14Km87X1ttKmwrYl09e2luZGV4OmIsc3ViaW5kZXg6bSxzdGFydEFuZ2xlOncsZW5kQW5nbGU6TSx2YWx1ZTp4fX15W2JdPXtpbmRleDpiLHN0YXJ0QW5nbGU6dSxlbmRBbmdsZTphLHZhbHVlOmhbYl19LGErPWZ9Zm9yKGM9LTE7KytjPGw7KWZvcihzPWMtMTsrK3M8bDspe3ZhciBBPV9bcypsK2NdLFQ9X1tjKmwrc107KEEudmFsdWV8fFQudmFsdWUpJiZ2LnB1c2goQS52YWx1ZTxULnZhbHVlP3tzb3VyY2U6VCx0YXJnZXQ6QX06e3NvdXJjZTpBLHRhcmdldDpUfSl9cmV0dXJuIHI/di5zb3J0KHIpOnZ9cmV0dXJuIGkucGFkQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9WWkoMCxuKSxpKTp0fSxpLnNvcnRHcm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxpKTpufSxpLnNvcnRTdWJncm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxpKTplfSxpLnNvcnRDaG9yZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/cj1udWxsOihuPXQscj1mdW5jdGlvbih0LGUpe3JldHVybiBuKHQuc291cmNlLnZhbHVlK3QudGFyZ2V0LnZhbHVlLGUuc291cmNlLnZhbHVlK2UudGFyZ2V0LnZhbHVlKX0pLl89dCxpKTpyJiZyLl87dmFyIG59LGl9LHQucmliYm9uPWZ1bmN0aW9uKCl7dmFyIHQ9Vmksbj0kaSxlPVdpLHI9WmksaT1RaSxvPW51bGw7ZnVuY3Rpb24gYSgpe3ZhciBhLHU9QmkuY2FsbChhcmd1bWVudHMpLGY9dC5hcHBseSh0aGlzLHUpLGM9bi5hcHBseSh0aGlzLHUpLHM9K2UuYXBwbHkodGhpcywodVswXT1mLHUpKSxsPXIuYXBwbHkodGhpcyx1KS1xaSxoPWkuYXBwbHkodGhpcyx1KS1xaSxkPXMqTGkobCkscD1zKkRpKGwpLHY9K2UuYXBwbHkodGhpcywodVswXT1jLHUpKSxnPXIuYXBwbHkodGhpcyx1KS1xaSx5PWkuYXBwbHkodGhpcyx1KS1xaTtpZihvfHwobz1hPUdpKCkpLG8ubW92ZVRvKGQscCksby5hcmMoMCwwLHMsbCxoKSxsPT09ZyYmaD09PXl8fChvLnF1YWRyYXRpY0N1cnZlVG8oMCwwLHYqTGkoZyksdipEaShnKSksby5hcmMoMCwwLHYsZyx5KSksby5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCxkLHApLG8uY2xvc2VQYXRoKCksYSlyZXR1cm4gbz1udWxsLGErIiJ8fG51bGx9cmV0dXJuIGEucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RmkoK3QpLGEpOmV9LGEuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkZpKCt0KSxhKTpyfSxhLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RmkoK3QpLGEpOml9LGEuc291cmNlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4sYSk6dH0sYS50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxhKTpufSxhLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bnVsbD09dD9udWxsOnQsYSk6b30sYX0sdC5uZXN0PWZ1bmN0aW9uKCl7dmFyIHQsbixlLHI9W10saT1bXTtmdW5jdGlvbiBvKGUsaSxhLHUpe2lmKGk+PXIubGVuZ3RoKXJldHVybiBudWxsIT10JiZlLnNvcnQodCksbnVsbCE9bj9uKGUpOmU7Zm9yKHZhciBmLGMscyxsPS0xLGg9ZS5sZW5ndGgsZD1yW2krK10scD1LaSgpLHY9YSgpOysrbDxoOykocz1wLmdldChmPWQoYz1lW2xdKSsiIikpP3MucHVzaChjKTpwLnNldChmLFtjXSk7cmV0dXJuIHAuZWFjaChmdW5jdGlvbih0LG4pe3UodixuLG8odCxpLGEsdSkpfSksdn1yZXR1cm4gZT17b2JqZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBvKHQsMCx0byxubyl9LG1hcDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LDAsZW8scm8pfSxlbnRyaWVzOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiB0KGUsbyl7aWYoKytvPnIubGVuZ3RoKXJldHVybiBlO3ZhciBhLHU9aVtvLTFdO3JldHVybiBudWxsIT1uJiZvPj1yLmxlbmd0aD9hPWUuZW50cmllcygpOihhPVtdLGUuZWFjaChmdW5jdGlvbihuLGUpe2EucHVzaCh7a2V5OmUsdmFsdWVzOnQobixvKX0pfSkpLG51bGwhPXU/YS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIHUodC5rZXksbi5rZXkpfSk6YX0obyh0LDAsZW8scm8pLDApfSxrZXk6ZnVuY3Rpb24odCl7cmV0dXJuIHIucHVzaCh0KSxlfSxzb3J0S2V5czpmdW5jdGlvbih0KXtyZXR1cm4gaVtyLmxlbmd0aC0xXT10LGV9LHNvcnRWYWx1ZXM6ZnVuY3Rpb24obil7cmV0dXJuIHQ9bixlfSxyb2xsdXA6ZnVuY3Rpb24odCl7cmV0dXJuIG49dCxlfX19LHQuc2V0PWFvLHQubWFwPUtpLHQua2V5cz1mdW5jdGlvbih0KXt2YXIgbj1bXTtmb3IodmFyIGUgaW4gdCluLnB1c2goZSk7cmV0dXJuIG59LHQudmFsdWVzPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaCh0W2VdKTtyZXR1cm4gbn0sdC5lbnRyaWVzPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaCh7a2V5OmUsdmFsdWU6dFtlXX0pO3JldHVybiBufSx0LmNvbG9yPXZuLHQucmdiPWJuLHQuaHNsPU1uLHQubGFiPVVuLHQuaGNsPUhuLHQubGNoPWZ1bmN0aW9uKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Jbih0KTpuZXcgam4oZSxuLHQsbnVsbD09cj8xOnIpfSx0LmdyYXk9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbmV3IHFuKHQsMCwwLG51bGw9PW4/MTpuKX0sdC5jdWJlaGVsaXg9S24sdC5jb250b3Vycz1nbyx0LmNvbnRvdXJEZW5zaXR5PWZ1bmN0aW9uKCl7dmFyIHQ9Ym8sbj1tbyxlPXhvLHI9OTYwLGk9NTAwLG89MjAsYT0yLHU9MypvLGY9cisyKnU+PmEsYz1pKzIqdT4+YSxzPWNvKDIwKTtmdW5jdGlvbiBsKHIpe3ZhciBpPW5ldyBGbG9hdDMyQXJyYXkoZipjKSxsPW5ldyBGbG9hdDMyQXJyYXkoZipjKTtyLmZvckVhY2goZnVuY3Rpb24ocixvLHMpe3ZhciBsPSt0KHIsbyxzKSt1Pj5hLGg9K24ocixvLHMpK3U+PmEsZD0rZShyLG8scyk7bD49MCYmbDxmJiZoPj0wJiZoPGMmJihpW2wraCpmXSs9ZCl9KSx5byh7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOml9LHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6bH0sbz4+YSksX28oe3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTpsfSx7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOml9LG8+PmEpLHlvKHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6aX0se3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTpsfSxvPj5hKSxfbyh7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOmx9LHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6aX0sbz4+YSkseW8oe3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTppfSx7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOmx9LG8+PmEpLF9vKHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6bH0se3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTppfSxvPj5hKTt2YXIgZD1zKGkpO2lmKCFBcnJheS5pc0FycmF5KGQpKXt2YXIgcD1UKGkpO2Q9dygwLHAsZCksKGQ9ZygwLE1hdGguZmxvb3IocC9kKSpkLGQpKS5zaGlmdCgpfXJldHVybiBnbygpLnRocmVzaG9sZHMoZCkuc2l6ZShbZixjXSkoaSkubWFwKGgpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQudmFsdWUqPU1hdGgucG93KDIsLTIqYSksdC5jb29yZGluYXRlcy5mb3JFYWNoKGQpLHR9ZnVuY3Rpb24gZCh0KXt0LmZvckVhY2gocCl9ZnVuY3Rpb24gcCh0KXt0LmZvckVhY2godil9ZnVuY3Rpb24gdih0KXt0WzBdPXRbMF0qTWF0aC5wb3coMixhKS11LHRbMV09dFsxXSpNYXRoLnBvdygyLGEpLXV9ZnVuY3Rpb24geSgpe3JldHVybiBmPXIrMioodT0zKm8pPj5hLGM9aSsyKnU+PmEsbH1yZXR1cm4gbC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Y28oK24pLGwpOnR9LGwueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmNvKCt0KSxsKTpufSxsLndlaWdodD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmNvKCt0KSxsKTplfSxsLnNpemU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW3IsaV07dmFyIG49TWF0aC5jZWlsKHRbMF0pLGU9TWF0aC5jZWlsKHRbMV0pO2lmKCEobj49MHx8bj49MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNpemUiKTtyZXR1cm4gcj1uLGk9ZSx5KCl9LGwuY2VsbFNpemU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIDE8PGE7aWYoISgodD0rdCk+PTEpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjZWxsIHNpemUiKTtyZXR1cm4gYT1NYXRoLmZsb29yKE1hdGgubG9nKHQpL01hdGguTE4yKSx5KCl9LGwudGhyZXNob2xkcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkFycmF5LmlzQXJyYXkodCk/Y28odW8uY2FsbCh0KSk6Y28odCksbCk6c30sbC5iYW5kd2lkdGg9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIE1hdGguc3FydChvKihvKzEpKTtpZighKCh0PSt0KT49MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGJhbmR3aWR0aCIpO3JldHVybiBvPU1hdGgucm91bmQoKE1hdGguc3FydCg0KnQqdCsxKS0xKS8yKSx5KCl9LGx9LHQuZGlzcGF0Y2g9SSx0LmRyYWc9ZnVuY3Rpb24oKXt2YXIgbixlLHIsaSxvPVd0LGE9WnQsdT1RdCxmPUp0LGM9e30scz1JKCJzdGFydCIsImRyYWciLCJlbmQiKSxsPTAsaD0wO2Z1bmN0aW9uIGQodCl7dC5vbigibW91c2Vkb3duLmRyYWciLHApLmZpbHRlcihmKS5vbigidG91Y2hzdGFydC5kcmFnIix5KS5vbigidG91Y2htb3ZlLmRyYWciLF8pLm9uKCJ0b3VjaGVuZC5kcmFnIHRvdWNoY2FuY2VsLmRyYWciLGIpLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCJub25lIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKX1mdW5jdGlvbiBwKCl7aWYoIWkmJm8uYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdT1tKCJtb3VzZSIsYS5hcHBseSh0aGlzLGFyZ3VtZW50cyksRnQsdGhpcyxhcmd1bWVudHMpO3UmJihEdCh0LmV2ZW50LnZpZXcpLm9uKCJtb3VzZW1vdmUuZHJhZyIsdiwhMCkub24oIm1vdXNldXAuZHJhZyIsZywhMCksWHQodC5ldmVudC52aWV3KSxIdCgpLHI9ITEsbj10LmV2ZW50LmNsaWVudFgsZT10LmV2ZW50LmNsaWVudFksdSgic3RhcnQiKSl9fWZ1bmN0aW9uIHYoKXtpZihqdCgpLCFyKXt2YXIgaT10LmV2ZW50LmNsaWVudFgtbixvPXQuZXZlbnQuY2xpZW50WS1lO3I9aSppK28qbz5ofWMubW91c2UoImRyYWciKX1mdW5jdGlvbiBnKCl7RHQodC5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLmRyYWcgbW91c2V1cC5kcmFnIixudWxsKSxHdCh0LmV2ZW50LnZpZXcsciksanQoKSxjLm1vdXNlKCJlbmQiKX1mdW5jdGlvbiB5KCl7aWYoby5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9YS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdT1yLmxlbmd0aDtmb3Iobj0wO248dTsrK24pKGU9bShyW25dLmlkZW50aWZpZXIsaSxJdCx0aGlzLGFyZ3VtZW50cykpJiYoSHQoKSxlKCJzdGFydCIpKX19ZnVuY3Rpb24gXygpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9ci5sZW5ndGg7Zm9yKG49MDtuPGk7KytuKShlPWNbcltuXS5pZGVudGlmaWVyXSkmJihqdCgpLGUoImRyYWciKSl9ZnVuY3Rpb24gYigpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLG89ci5sZW5ndGg7Zm9yKGkmJmNsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpPW51bGx9LDUwMCksbj0wO248bzsrK24pKGU9Y1tyW25dLmlkZW50aWZpZXJdKSYmKEh0KCksZSgiZW5kIikpfWZ1bmN0aW9uIG0obixlLHIsaSxvKXt2YXIgYSxmLGgscD1yKGUsbiksdj1zLmNvcHkoKTtpZihDdChuZXcgJHQoZCwiYmVmb3Jlc3RhcnQiLGEsbixsLHBbMF0scFsxXSwwLDAsdiksZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9KHQuZXZlbnQuc3ViamVjdD1hPXUuYXBwbHkoaSxvKSkmJihmPWEueC1wWzBdfHwwLGg9YS55LXBbMV18fDAsITApfSkpcmV0dXJuIGZ1bmN0aW9uIHQodSl7dmFyIHMsZz1wO3N3aXRjaCh1KXtjYXNlInN0YXJ0IjpjW25dPXQscz1sKys7YnJlYWs7Y2FzZSJlbmQiOmRlbGV0ZSBjW25dLC0tbDtjYXNlImRyYWciOnA9cihlLG4pLHM9bH1DdChuZXcgJHQoZCx1LGEsbixzLHBbMF0rZixwWzFdK2gscFswXS1nWzBdLHBbMV0tZ1sxXSx2KSx2LmFwcGx5LHYsW3UsaSxvXSl9fXJldHVybiBkLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlZ0KCEhdCksZCk6b30sZC5jb250YWluZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWdCh0KSxkKTphfSxkLnN1YmplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWdCh0KSxkKTp1fSxkLnRvdWNoYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlZ0KCEhdCksZCk6Zn0sZC5vbj1mdW5jdGlvbigpe3ZhciB0PXMub24uYXBwbHkocyxhcmd1bWVudHMpO3JldHVybiB0PT09cz9kOnR9LGQuY2xpY2tEaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0odD0rdCkqdCxkKTpNYXRoLnNxcnQoaCl9LGR9LHQuZHJhZ0Rpc2FibGU9WHQsdC5kcmFnRW5hYmxlPUd0LHQuZHN2Rm9ybWF0PUVvLHQuY3N2UGFyc2U9Q28sdC5jc3ZQYXJzZVJvd3M9UG8sdC5jc3ZGb3JtYXQ9em8sdC5jc3ZGb3JtYXRSb3dzPVJvLHQudHN2UGFyc2U9RG8sdC50c3ZQYXJzZVJvd3M9VW8sdC50c3ZGb3JtYXQ9cW8sdC50c3ZGb3JtYXRSb3dzPU9vLHQuZWFzZUxpbmVhcj1mdW5jdGlvbih0KXtyZXR1cm4rdH0sdC5lYXNlUXVhZD1Ecix0LmVhc2VRdWFkSW49ZnVuY3Rpb24odCl7cmV0dXJuIHQqdH0sdC5lYXNlUXVhZE91dD1mdW5jdGlvbih0KXtyZXR1cm4gdCooMi10KX0sdC5lYXNlUXVhZEluT3V0PURyLHQuZWFzZUN1YmljPVVyLHQuZWFzZUN1YmljSW49ZnVuY3Rpb24odCl7cmV0dXJuIHQqdCp0fSx0LmVhc2VDdWJpY091dD1mdW5jdGlvbih0KXtyZXR1cm4tLXQqdCp0KzF9LHQuZWFzZUN1YmljSW5PdXQ9VXIsdC5lYXNlUG9seT1Zcix0LmVhc2VQb2x5SW49cXIsdC5lYXNlUG9seU91dD1Pcix0LmVhc2VQb2x5SW5PdXQ9WXIsdC5lYXNlU2luPUlyLHQuZWFzZVNpbkluPWZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguY29zKHQqRnIpfSx0LmVhc2VTaW5PdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc2luKHQqRnIpfSx0LmVhc2VTaW5Jbk91dD1Jcix0LmVhc2VFeHA9SHIsdC5lYXNlRXhwSW49ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KDIsMTAqdC0xMCl9LHQuZWFzZUV4cE91dD1mdW5jdGlvbih0KXtyZXR1cm4gMS1NYXRoLnBvdygyLC0xMCp0KX0sdC5lYXNlRXhwSW5PdXQ9SHIsdC5lYXNlQ2lyY2xlPWpyLHQuZWFzZUNpcmNsZUluPWZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguc3FydCgxLXQqdCl9LHQuZWFzZUNpcmNsZU91dD1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KDEtIC0tdCp0KX0sdC5lYXNlQ2lyY2xlSW5PdXQ9anIsdC5lYXNlQm91bmNlPW5pLHQuZWFzZUJvdW5jZUluPWZ1bmN0aW9uKHQpe3JldHVybiAxLW5pKDEtdCl9LHQuZWFzZUJvdW5jZU91dD1uaSx0LmVhc2VCb3VuY2VJbk91dD1mdW5jdGlvbih0KXtyZXR1cm4oKHQqPTIpPD0xPzEtbmkoMS10KTpuaSh0LTEpKzEpLzJ9LHQuZWFzZUJhY2s9aWksdC5lYXNlQmFja0luPWVpLHQuZWFzZUJhY2tPdXQ9cmksdC5lYXNlQmFja0luT3V0PWlpLHQuZWFzZUVsYXN0aWM9dWksdC5lYXNlRWxhc3RpY0luPWFpLHQuZWFzZUVsYXN0aWNPdXQ9dWksdC5lYXNlRWxhc3RpY0luT3V0PWZpLHQuYmxvYj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oWW8pfSx0LmJ1ZmZlcj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oQm8pfSx0LmRzdj1mdW5jdGlvbih0LG4sZSxyKXszPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT12b2lkIDApO3ZhciBpPUVvKHQpO3JldHVybiBJbyhuLGUpLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIGkucGFyc2UodCxyKX0pfSx0LmNzdj1qbyx0LnRzdj1Ybyx0LmltYWdlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUscil7dmFyIGk9bmV3IEltYWdlO2Zvcih2YXIgbyBpbiBuKWlbb109bltvXTtpLm9uZXJyb3I9cixpLm9ubG9hZD1mdW5jdGlvbigpe2UoaSl9LGkuc3JjPXR9KX0sdC5qc29uPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZldGNoKHQsbikudGhlbihHbyl9LHQudGV4dD1Jbyx0LnhtbD0kbyx0Lmh0bWw9V28sdC5zdmc9Wm8sdC5mb3JjZUNlbnRlcj1mdW5jdGlvbih0LG4pe3ZhciBlO2Z1bmN0aW9uIHIoKXt2YXIgcixpLG89ZS5sZW5ndGgsYT0wLHU9MDtmb3Iocj0wO3I8bzsrK3IpYSs9KGk9ZVtyXSkueCx1Kz1pLnk7Zm9yKGE9YS9vLXQsdT11L28tbixyPTA7cjxvOysrcikoaT1lW3JdKS54LT1hLGkueS09dX1yZXR1cm4gbnVsbD09dCYmKHQ9MCksbnVsbD09biYmKG49MCksci5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2U9dH0sci54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStuLHIpOnR9LHIueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdCxyKTpufSxyfSx0LmZvcmNlQ29sbGlkZT1mdW5jdGlvbih0KXt2YXIgbixlLHI9MSxpPTE7ZnVuY3Rpb24gbygpe2Zvcih2YXIgdCxvLHUsZixjLHMsbCxoPW4ubGVuZ3RoLGQ9MDtkPGk7KytkKWZvcihvPXJhKG4sdWEsZmEpLnZpc2l0QWZ0ZXIoYSksdD0wO3Q8aDsrK3QpdT1uW3RdLHM9ZVt1LmluZGV4XSxsPXMqcyxmPXUueCt1LnZ4LGM9dS55K3Uudnksby52aXNpdChwKTtmdW5jdGlvbiBwKHQsbixlLGksbyl7dmFyIGE9dC5kYXRhLGg9dC5yLGQ9cytoO2lmKCFhKXJldHVybiBuPmYrZHx8aTxmLWR8fGU+YytkfHxvPGMtZDtpZihhLmluZGV4PnUuaW5kZXgpe3ZhciBwPWYtYS54LWEudngsdj1jLWEueS1hLnZ5LGc9cCpwK3YqdjtnPGQqZCYmKDA9PT1wJiYoZys9KHA9Sm8oKSkqcCksMD09PXYmJihnKz0odj1KbygpKSp2KSxnPShkLShnPU1hdGguc3FydChnKSkpL2cqcix1LnZ4Kz0ocCo9ZykqKGQ9KGgqPWgpLyhsK2gpKSx1LnZ5Kz0odio9ZykqZCxhLnZ4LT1wKihkPTEtZCksYS52eS09dipkKX19fWZ1bmN0aW9uIGEodCl7aWYodC5kYXRhKXJldHVybiB0LnI9ZVt0LmRhdGEuaW5kZXhdO2Zvcih2YXIgbj10LnI9MDtuPDQ7KytuKXRbbl0mJnRbbl0ucj50LnImJih0LnI9dFtuXS5yKX1mdW5jdGlvbiB1KCl7aWYobil7dmFyIHIsaSxvPW4ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShvKSxyPTA7cjxvOysrcilpPW5bcl0sZVtpLmluZGV4XT0rdChpLHIsbil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbyhudWxsPT10PzE6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10LHUoKX0sby5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LG8pOml9LG8uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3Qsbyk6cn0sby5yYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRbygrbiksdSgpLG8pOnR9LG99LHQuZm9yY2VMaW5rPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG8sYT1jYSx1PWZ1bmN0aW9uKHQpe3JldHVybiAxL01hdGgubWluKGlbdC5zb3VyY2UuaW5kZXhdLGlbdC50YXJnZXQuaW5kZXhdKX0sZj1RbygzMCksYz0xO2Z1bmN0aW9uIHMocil7Zm9yKHZhciBpPTAsYT10Lmxlbmd0aDtpPGM7KytpKWZvcih2YXIgdSxmLHMsbCxoLGQscCx2PTA7djxhOysrdilmPSh1PXRbdl0pLnNvdXJjZSxsPShzPXUudGFyZ2V0KS54K3MudngtZi54LWYudnh8fEpvKCksaD1zLnkrcy52eS1mLnktZi52eXx8Sm8oKSxsKj1kPSgoZD1NYXRoLnNxcnQobCpsK2gqaCkpLWVbdl0pL2QqcipuW3ZdLGgqPWQscy52eC09bCoocD1vW3ZdKSxzLnZ5LT1oKnAsZi52eCs9bCoocD0xLXApLGYudnkrPWgqcH1mdW5jdGlvbiBsKCl7aWYocil7dmFyIHUsZixjPXIubGVuZ3RoLHM9dC5sZW5ndGgsbD1LaShyLGEpO2Zvcih1PTAsaT1uZXcgQXJyYXkoYyk7dTxzOysrdSkoZj10W3VdKS5pbmRleD11LCJvYmplY3QiIT10eXBlb2YgZi5zb3VyY2UmJihmLnNvdXJjZT1zYShsLGYuc291cmNlKSksIm9iamVjdCIhPXR5cGVvZiBmLnRhcmdldCYmKGYudGFyZ2V0PXNhKGwsZi50YXJnZXQpKSxpW2Yuc291cmNlLmluZGV4XT0oaVtmLnNvdXJjZS5pbmRleF18fDApKzEsaVtmLnRhcmdldC5pbmRleF09KGlbZi50YXJnZXQuaW5kZXhdfHwwKSsxO2Zvcih1PTAsbz1uZXcgQXJyYXkocyk7dTxzOysrdSlmPXRbdV0sb1t1XT1pW2Yuc291cmNlLmluZGV4XS8oaVtmLnNvdXJjZS5pbmRleF0raVtmLnRhcmdldC5pbmRleF0pO249bmV3IEFycmF5KHMpLGgoKSxlPW5ldyBBcnJheShzKSxkKCl9fWZ1bmN0aW9uIGgoKXtpZihyKWZvcih2YXIgZT0wLGk9dC5sZW5ndGg7ZTxpOysrZSluW2VdPSt1KHRbZV0sZSx0KX1mdW5jdGlvbiBkKCl7aWYocilmb3IodmFyIG49MCxpPXQubGVuZ3RoO248aTsrK24pZVtuXT0rZih0W25dLG4sdCl9cmV0dXJuIG51bGw9PXQmJih0PVtdKSxzLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7cj10LGwoKX0scy5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGwoKSxzKTp0fSxzLmlkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQscyk6YX0scy5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSt0LHMpOmN9LHMuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRbygrdCksaCgpLHMpOnV9LHMuZGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRbygrdCksZCgpLHMpOmZ9LHN9LHQuZm9yY2VNYW55Qm9keT1mdW5jdGlvbigpe3ZhciB0LG4sZSxyLGk9UW8oLTMwKSxvPTEsYT0xLzAsdT0uODE7ZnVuY3Rpb24gZihyKXt2YXIgaSxvPXQubGVuZ3RoLGE9cmEodCxsYSxoYSkudmlzaXRBZnRlcihzKTtmb3IoZT1yLGk9MDtpPG87KytpKW49dFtpXSxhLnZpc2l0KGwpfWZ1bmN0aW9uIGMoKXtpZih0KXt2YXIgbixlLG89dC5sZW5ndGg7Zm9yKHI9bmV3IEFycmF5KG8pLG49MDtuPG87KytuKWU9dFtuXSxyW2UuaW5kZXhdPStpKGUsbix0KX19ZnVuY3Rpb24gcyh0KXt2YXIgbixlLGksbyxhLHU9MCxmPTA7aWYodC5sZW5ndGgpe2ZvcihpPW89YT0wO2E8NDsrK2EpKG49dFthXSkmJihlPU1hdGguYWJzKG4udmFsdWUpKSYmKHUrPW4udmFsdWUsZis9ZSxpKz1lKm4ueCxvKz1lKm4ueSk7dC54PWkvZix0Lnk9by9mfWVsc2V7KG49dCkueD1uLmRhdGEueCxuLnk9bi5kYXRhLnk7ZG97dSs9cltuLmRhdGEuaW5kZXhdfXdoaWxlKG49bi5uZXh0KX10LnZhbHVlPXV9ZnVuY3Rpb24gbCh0LGksZixjKXtpZighdC52YWx1ZSlyZXR1cm4hMDt2YXIgcz10Lngtbi54LGw9dC55LW4ueSxoPWMtaSxkPXMqcytsKmw7aWYoaCpoL3U8ZClyZXR1cm4gZDxhJiYoMD09PXMmJihkKz0ocz1KbygpKSpzKSwwPT09bCYmKGQrPShsPUpvKCkpKmwpLGQ8byYmKGQ9TWF0aC5zcXJ0KG8qZCkpLG4udngrPXMqdC52YWx1ZSplL2Qsbi52eSs9bCp0LnZhbHVlKmUvZCksITA7aWYoISh0Lmxlbmd0aHx8ZD49YSkpeyh0LmRhdGEhPT1ufHx0Lm5leHQpJiYoMD09PXMmJihkKz0ocz1KbygpKSpzKSwwPT09bCYmKGQrPShsPUpvKCkpKmwpLGQ8byYmKGQ9TWF0aC5zcXJ0KG8qZCkpKTtkb3t0LmRhdGEhPT1uJiYoaD1yW3QuZGF0YS5pbmRleF0qZS9kLG4udngrPXMqaCxuLnZ5Kz1sKmgpfXdoaWxlKHQ9dC5uZXh0KX19cmV0dXJuIGYuaW5pdGlhbGl6ZT1mdW5jdGlvbihuKXt0PW4sYygpfSxmLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGMoKSxmKTppfSxmLmRpc3RhbmNlTWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQqdCxmKTpNYXRoLnNxcnQobyl9LGYuZGlzdGFuY2VNYXg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCp0LGYpOk1hdGguc3FydChhKX0sZi50aGV0YT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10KnQsZik6TWF0aC5zcXJ0KHUpfSxmfSx0LmZvcmNlUmFkaWFsPWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG8sYT1RbyguMSk7ZnVuY3Rpb24gdSh0KXtmb3IodmFyIGE9MCx1PXIubGVuZ3RoO2E8dTsrK2Epe3ZhciBmPXJbYV0sYz1mLngtbnx8MWUtNixzPWYueS1lfHwxZS02LGw9TWF0aC5zcXJ0KGMqYytzKnMpLGg9KG9bYV0tbCkqaVthXSp0L2w7Zi52eCs9YypoLGYudnkrPXMqaH19ZnVuY3Rpb24gZigpe2lmKHIpe3ZhciBuLGU9ci5sZW5ndGg7Zm9yKGk9bmV3IEFycmF5KGUpLG89bmV3IEFycmF5KGUpLG49MDtuPGU7KytuKW9bbl09K3QocltuXSxuLHIpLGlbbl09aXNOYU4ob1tuXSk/MDorYShyW25dLG4scil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbygrdCkpLG51bGw9PW4mJihuPTApLG51bGw9PWUmJihlPTApLHUuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtyPXQsZigpfSx1LnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGYoKSx1KTphfSx1LnJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlFvKCtuKSxmKCksdSk6dH0sdS54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0LHUpOm59LHUueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCx1KTplfSx1fSx0LmZvcmNlU2ltdWxhdGlvbj1mdW5jdGlvbih0KXt2YXIgbixlPTEscj0uMDAxLGk9MS1NYXRoLnBvdyhyLDEvMzAwKSxvPTAsYT0uNix1PUtpKCksZj11cihzKSxjPUkoInRpY2siLCJlbmQiKTtmdW5jdGlvbiBzKCl7bCgpLGMuY2FsbCgidGljayIsbiksZTxyJiYoZi5zdG9wKCksYy5jYWxsKCJlbmQiLG4pKX1mdW5jdGlvbiBsKCl7dmFyIG4scixmPXQubGVuZ3RoO2ZvcihlKz0oby1lKSppLHUuZWFjaChmdW5jdGlvbih0KXt0KGUpfSksbj0wO248ZjsrK24pbnVsbD09KHI9dFtuXSkuZng/ci54Kz1yLnZ4Kj1hOihyLng9ci5meCxyLnZ4PTApLG51bGw9PXIuZnk/ci55Kz1yLnZ5Kj1hOihyLnk9ci5meSxyLnZ5PTApfWZ1bmN0aW9uIGgoKXtmb3IodmFyIG4sZT0wLHI9dC5sZW5ndGg7ZTxyOysrZSl7aWYoKG49dFtlXSkuaW5kZXg9ZSxpc05hTihuLngpfHxpc05hTihuLnkpKXt2YXIgaT1kYSpNYXRoLnNxcnQoZSksbz1lKnBhO24ueD1pKk1hdGguY29zKG8pLG4ueT1pKk1hdGguc2luKG8pfShpc05hTihuLnZ4KXx8aXNOYU4obi52eSkpJiYobi52eD1uLnZ5PTApfX1mdW5jdGlvbiBkKG4pe3JldHVybiBuLmluaXRpYWxpemUmJm4uaW5pdGlhbGl6ZSh0KSxufXJldHVybiBudWxsPT10JiYodD1bXSksaCgpLG49e3RpY2s6bCxyZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIGYucmVzdGFydChzKSxufSxzdG9wOmZ1bmN0aW9uKCl7cmV0dXJuIGYuc3RvcCgpLG59LG5vZGVzOmZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsaCgpLHUuZWFjaChkKSxuKTp0fSxhbHBoYTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCxuKTplfSxhbHBoYU1pbjpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxuKTpyfSxhbHBoYURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LG4pOitpfSxhbHBoYVRhcmdldDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0rdCxuKTpvfSx2ZWxvY2l0eURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPTEtdCxuKToxLWF9LGZvcmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8obnVsbD09ZT91LnJlbW92ZSh0KTp1LnNldCh0LGQoZSkpLG4pOnUuZ2V0KHQpfSxmaW5kOmZ1bmN0aW9uKG4sZSxyKXt2YXIgaSxvLGEsdSxmLGM9MCxzPXQubGVuZ3RoO2ZvcihudWxsPT1yP3I9MS8wOnIqPXIsYz0wO2M8czsrK2MpKGE9KGk9bi0odT10W2NdKS54KSppKyhvPWUtdS55KSpvKTxyJiYoZj11LHI9YSk7cmV0dXJuIGZ9LG9uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8oYy5vbih0LGUpLG4pOmMub24odCl9fX0sdC5mb3JjZVg9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGk9UW8oLjEpO2Z1bmN0aW9uIG8odCl7Zm9yKHZhciBpLG89MCxhPW4ubGVuZ3RoO288YTsrK28pKGk9bltvXSkudngrPShyW29dLWkueCkqZVtvXSp0fWZ1bmN0aW9uIGEoKXtpZihuKXt2YXIgbyxhPW4ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShhKSxyPW5ldyBBcnJheShhKSxvPTA7bzxhOysrbyllW29dPWlzTmFOKHJbb109K3QobltvXSxvLG4pKT8wOitpKG5bb10sbyxuKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVFvKG51bGw9PXQ/MDordCkpLG8uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtuPXQsYSgpfSxvLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGEoKSxvKTppfSxvLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRbygrbiksYSgpLG8pOnR9LG99LHQuZm9yY2VZPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpPVFvKC4xKTtmdW5jdGlvbiBvKHQpe2Zvcih2YXIgaSxvPTAsYT1uLmxlbmd0aDtvPGE7KytvKShpPW5bb10pLnZ5Kz0ocltvXS1pLnkpKmVbb10qdH1mdW5jdGlvbiBhKCl7aWYobil7dmFyIG8sYT1uLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkoYSkscj1uZXcgQXJyYXkoYSksbz0wO288YTsrK28pZVtvXT1pc05hTihyW29dPSt0KG5bb10sbyxuKSk/MDoraShuW29dLG8sbil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbyhudWxsPT10PzA6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10LGEoKX0sby5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFvKCt0KSxhKCksbyk6aX0sby55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UW8oK24pLGEoKSxvKTp0fSxvfSx0LmZvcm1hdERlZmF1bHRMb2NhbGU9U2EsdC5mb3JtYXRMb2NhbGU9TmEsdC5mb3JtYXRTcGVjaWZpZXI9YmEsdC5wcmVjaXNpb25GaXhlZD1FYSx0LnByZWNpc2lvblByZWZpeD1rYSx0LnByZWNpc2lvblJvdW5kPUNhLHQuZ2VvQXJlYT1mdW5jdGlvbih0KXtyZXR1cm4geXUucmVzZXQoKSxzdSh0LF91KSwyKnl1fSx0Lmdlb0JvdW5kcz1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvLGEsdTtpZihSdT16dT0tKEN1PVB1PTEvMCksT3U9W10sc3UodCxyZiksZT1PdS5sZW5ndGgpe2ZvcihPdS5zb3J0KGRmKSxuPTEsbz1bcj1PdVswXV07bjxlOysrbilwZihyLChpPU91W25dKVswXSl8fHBmKHIsaVsxXSk/KGhmKHJbMF0saVsxXSk+aGYoclswXSxyWzFdKSYmKHJbMV09aVsxXSksaGYoaVswXSxyWzFdKT5oZihyWzBdLHJbMV0pJiYoclswXT1pWzBdKSk6by5wdXNoKHI9aSk7Zm9yKGE9LTEvMCxuPTAscj1vW2U9by5sZW5ndGgtMV07bjw9ZTtyPWksKytuKWk9b1tuXSwodT1oZihyWzFdLGlbMF0pKT5hJiYoYT11LEN1PWlbMF0senU9clsxXSl9cmV0dXJuIE91PVl1PW51bGwsQ3U9PT0xLzB8fFB1PT09MS8wP1tbTmFOLE5hTl0sW05hTixOYU5dXTpbW0N1LFB1XSxbenUsUnVdXX0sdC5nZW9DZW50cm9pZD1mdW5jdGlvbih0KXtCdT1GdT1JdT1IdT1qdT1YdT1HdT1WdT0kdT1XdT1adT0wLHN1KHQsdmYpO3ZhciBuPSR1LGU9V3Uscj1adSxpPW4qbitlKmUrcipyO3JldHVybiBpPFVhJiYobj1YdSxlPUd1LHI9VnUsRnU8RGEmJihuPUl1LGU9SHUscj1qdSksKGk9bipuK2UqZStyKnIpPFVhKT9bTmFOLE5hTl06W1hhKGUsbikqRmEsZXUoci9LYShpKSkqRmFdfSx0Lmdlb0NpcmNsZT1mdW5jdGlvbigpe3ZhciB0LG4sZT1OZihbMCwwXSkscj1OZig5MCksaT1OZig2KSxvPXtwb2ludDpmdW5jdGlvbihlLHIpe3QucHVzaChlPW4oZSxyKSksZVswXSo9RmEsZVsxXSo9RmF9fTtmdW5jdGlvbiBhKCl7dmFyIGE9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdT1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSpJYSxmPWkuYXBwbHkodGhpcyxhcmd1bWVudHMpKklhO3JldHVybiB0PVtdLG49a2YoLWFbMF0qSWEsLWFbMV0qSWEsMCkuaW52ZXJ0LExmKG8sdSxmLDEpLGE9e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOlt0XX0sdD1uPW51bGwsYX1yZXR1cm4gYS5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpOZihbK3RbMF0sK3RbMV1dKSxhKTplfSxhLnJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Ok5mKCt0KSxhKTpyfSxhLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90Ok5mKCt0KSxhKTppfSxhfSx0Lmdlb0NsaXBBbnRpbWVyaWRpYW49R2YsdC5nZW9DbGlwQ2lyY2xlPVZmLHQuZ2VvQ2xpcEV4dGVudD1mdW5jdGlvbigpe3ZhciB0LG4sZSxyPTAsaT0wLG89OTYwLGE9NTAwO3JldHVybiBlPXtzdHJlYW06ZnVuY3Rpb24oZSl7cmV0dXJuIHQmJm49PT1lP3Q6dD1aZihyLGksbyxhKShuPWUpfSxleHRlbnQ6ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3VbMF1bMF0saT0rdVswXVsxXSxvPSt1WzFdWzBdLGE9K3VbMV1bMV0sdD1uPW51bGwsZSk6W1tyLGldLFtvLGFdXX19fSx0Lmdlb0NsaXBSZWN0YW5nbGU9WmYsdC5nZW9Db250YWlucz1mdW5jdGlvbih0LG4pe3JldHVybih0JiZjYy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpP2NjW3QudHlwZV06bGMpKHQsbil9LHQuZ2VvRGlzdGFuY2U9ZmMsdC5nZW9HcmF0aWN1bGU9YmMsdC5nZW9HcmF0aWN1bGUxMD1mdW5jdGlvbigpe3JldHVybiBiYygpKCl9LHQuZ2VvSW50ZXJwb2xhdGU9ZnVuY3Rpb24odCxuKXt2YXIgZT10WzBdKklhLHI9dFsxXSpJYSxpPW5bMF0qSWEsbz1uWzFdKklhLGE9R2EociksdT1RYShyKSxmPUdhKG8pLGM9UWEobykscz1hKkdhKGUpLGw9YSpRYShlKSxoPWYqR2EoaSksZD1mKlFhKGkpLHA9MipldShLYShydShvLXIpK2EqZipydShpLWUpKSksdj1RYShwKSxnPXA/ZnVuY3Rpb24odCl7dmFyIG49UWEodCo9cCkvdixlPVFhKHAtdCkvdixyPWUqcytuKmgsaT1lKmwrbipkLG89ZSp1K24qYztyZXR1cm5bWGEoaSxyKSpGYSxYYShvLEthKHIqcitpKmkpKSpGYV19OmZ1bmN0aW9uKCl7cmV0dXJuW2UqRmEscipGYV19O3JldHVybiBnLmRpc3RhbmNlPXAsZ30sdC5nZW9MZW5ndGg9b2MsdC5nZW9QYXRoPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPTQuNTtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJnIucG9pbnRSYWRpdXMoK2kuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxzdSh0LGUocikpKSxyLnJlc3VsdCgpfXJldHVybiBvLmFyZWE9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShTYykpLFNjLnJlc3VsdCgpfSxvLm1lYXN1cmU9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShkcykpLGRzLnJlc3VsdCgpfSxvLmJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gc3UodCxlKFVjKSksVWMucmVzdWx0KCl9LG8uY2VudHJvaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShaYykpLFpjLnJlc3VsdCgpfSxvLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09bj8odD1udWxsLG1jKToodD1uKS5zdHJlYW0sbyk6dH0sby5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/KG49bnVsbCxuZXcgZ3MpOm5ldyBhcyhuPXQpLCJmdW5jdGlvbiIhPXR5cGVvZiBpJiZyLnBvaW50UmFkaXVzKGkpLG8pOm59LG8ucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooci5wb2ludFJhZGl1cygrdCksK3QpLG8pOml9LG8ucHJvamVjdGlvbih0KS5jb250ZXh0KG4pfSx0Lmdlb0FsYmVycz1Ecyx0Lmdlb0FsYmVyc1VzYT1mdW5jdGlvbigpe3ZhciB0LG4sZSxyLGksbyxhPURzKCksdT1McygpLnJvdGF0ZShbMTU0LDBdKS5jZW50ZXIoWy0yLDU4LjVdKS5wYXJhbGxlbHMoWzU1LDY1XSksZj1McygpLnJvdGF0ZShbMTU3LDBdKS5jZW50ZXIoWy0zLDE5LjldKS5wYXJhbGxlbHMoWzgsMThdKSxjPXtwb2ludDpmdW5jdGlvbih0LG4pe289W3Qsbl19fTtmdW5jdGlvbiBzKHQpe3ZhciBuPXRbMF0sYT10WzFdO3JldHVybiBvPW51bGwsZS5wb2ludChuLGEpLG98fChyLnBvaW50KG4sYSksbyl8fChpLnBvaW50KG4sYSksbyl9ZnVuY3Rpb24gbCgpe3JldHVybiB0PW49bnVsbCxzfXJldHVybiBzLmludmVydD1mdW5jdGlvbih0KXt2YXIgbj1hLnNjYWxlKCksZT1hLnRyYW5zbGF0ZSgpLHI9KHRbMF0tZVswXSkvbixpPSh0WzFdLWVbMV0pL247cmV0dXJuKGk+PS4xMiYmaTwuMjM0JiZyPj0tLjQyNSYmcjwtLjIxND91Omk+PS4xNjYmJmk8LjIzNCYmcj49LS4yMTQmJnI8LS4xMTU/ZjphKS5pbnZlcnQodCl9LHMuc3RyZWFtPWZ1bmN0aW9uKGUpe3JldHVybiB0JiZuPT09ZT90OihyPVthLnN0cmVhbShuPWUpLHUuc3RyZWFtKGUpLGYuc3RyZWFtKGUpXSxpPXIubGVuZ3RoLHQ9e3BvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPS0xOysrZTxpOylyW2VdLnBvaW50KHQsbil9LHNwaGVyZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0tMTsrK3Q8aTspclt0XS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLnBvbHlnb25FbmQoKX19KTt2YXIgcixpfSxzLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYS5wcmVjaXNpb24odCksdS5wcmVjaXNpb24odCksZi5wcmVjaXNpb24odCksbCgpKTphLnByZWNpc2lvbigpfSxzLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhLnNjYWxlKHQpLHUuc2NhbGUoLjM1KnQpLGYuc2NhbGUodCkscy50cmFuc2xhdGUoYS50cmFuc2xhdGUoKSkpOmEuc2NhbGUoKX0scy50cmFuc2xhdGU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGEudHJhbnNsYXRlKCk7dmFyIG49YS5zY2FsZSgpLG89K3RbMF0scz0rdFsxXTtyZXR1cm4gZT1hLnRyYW5zbGF0ZSh0KS5jbGlwRXh0ZW50KFtbby0uNDU1Km4scy0uMjM4Km5dLFtvKy40NTUqbixzKy4yMzgqbl1dKS5zdHJlYW0oYykscj11LnRyYW5zbGF0ZShbby0uMzA3Km4scysuMjAxKm5dKS5jbGlwRXh0ZW50KFtbby0uNDI1Km4rRGEscysuMTIqbitEYV0sW28tLjIxNCpuLURhLHMrLjIzNCpuLURhXV0pLnN0cmVhbShjKSxpPWYudHJhbnNsYXRlKFtvLS4yMDUqbixzKy4yMTIqbl0pLmNsaXBFeHRlbnQoW1tvLS4yMTQqbitEYSxzKy4xNjYqbitEYV0sW28tLjExNSpuLURhLHMrLjIzNCpuLURhXV0pLnN0cmVhbShjKSxsKCl9LHMuZml0RXh0ZW50PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHhzKHMsdCxuKX0scy5maXRTaXplPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHdzKHMsdCxuKX0scy5maXRXaWR0aD1mdW5jdGlvbih0LG4pe3JldHVybiBNcyhzLHQsbil9LHMuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIEFzKHMsdCxuKX0scy5zY2FsZSgxMDcwKX0sdC5nZW9BemltdXRoYWxFcXVhbEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MoT3MpLnNjYWxlKDEyNC43NSkuY2xpcEFuZ2xlKDE3OS45OTkpfSx0Lmdlb0F6aW11dGhhbEVxdWFsQXJlYVJhdz1Pcyx0Lmdlb0F6aW11dGhhbEVxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIENzKFlzKS5zY2FsZSg3OS40MTg4KS5jbGlwQW5nbGUoMTc5Ljk5OSl9LHQuZ2VvQXppbXV0aGFsRXF1aWRpc3RhbnRSYXc9WXMsdC5nZW9Db25pY0NvbmZvcm1hbD1mdW5jdGlvbigpe3JldHVybiB6cyhIcykuc2NhbGUoMTA5LjUpLnBhcmFsbGVscyhbMzAsMzBdKX0sdC5nZW9Db25pY0NvbmZvcm1hbFJhdz1Icyx0Lmdlb0NvbmljRXF1YWxBcmVhPUxzLHQuZ2VvQ29uaWNFcXVhbEFyZWFSYXc9UnMsdC5nZW9Db25pY0VxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIHpzKFhzKS5zY2FsZSgxMzEuMTU0KS5jZW50ZXIoWzAsMTMuOTM4OV0pfSx0Lmdlb0NvbmljRXF1aWRpc3RhbnRSYXc9WHMsdC5nZW9FcXVhbEVhcnRoPWZ1bmN0aW9uKCl7cmV0dXJuIENzKFFzKS5zY2FsZSgxNzcuMTU4KX0sdC5nZW9FcXVhbEVhcnRoUmF3PVFzLHQuZ2VvRXF1aXJlY3Rhbmd1bGFyPWZ1bmN0aW9uKCl7cmV0dXJuIENzKGpzKS5zY2FsZSgxNTIuNjMpfSx0Lmdlb0VxdWlyZWN0YW5ndWxhclJhdz1qcyx0Lmdlb0dub21vbmljPWZ1bmN0aW9uKCl7cmV0dXJuIENzKEpzKS5zY2FsZSgxNDQuMDQ5KS5jbGlwQW5nbGUoNjApfSx0Lmdlb0dub21vbmljUmF3PUpzLHQuZ2VvSWRlbnRpdHk9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscixpLG8sYT0xLHU9MCxmPTAsYz0xLHM9MSxsPW1jLGg9bnVsbCxkPW1jO2Z1bmN0aW9uIHAoKXtyZXR1cm4gcj1pPW51bGwsb31yZXR1cm4gbz17c3RyZWFtOmZ1bmN0aW9uKHQpe3JldHVybiByJiZpPT09dD9yOnI9bChkKGk9dCkpfSxwb3N0Y2xpcDpmdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1yLGg9dD1uPWU9bnVsbCxwKCkpOmR9LGNsaXBFeHRlbnQ6ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9bnVsbD09cj8oaD10PW49ZT1udWxsLG1jKTpaZihoPStyWzBdWzBdLHQ9K3JbMF1bMV0sbj0rclsxXVswXSxlPStyWzFdWzFdKSxwKCkpOm51bGw9PWg/bnVsbDpbW2gsdF0sW24sZV1dfSxzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcygoYT0rdCkqYyxhKnMsdSxmKSxwKCkpOmF9LHRyYW5zbGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcyhhKmMsYSpzLHU9K3RbMF0sZj0rdFsxXSkscCgpKTpbdSxmXX0scmVmbGVjdFg6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9S3MoYSooYz10Py0xOjEpLGEqcyx1LGYpLHAoKSk6YzwwfSxyZWZsZWN0WTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcyhhKmMsYSoocz10Py0xOjEpLHUsZikscCgpKTpzPDB9LGZpdEV4dGVudDpmdW5jdGlvbih0LG4pe3JldHVybiB4cyhvLHQsbil9LGZpdFNpemU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gd3Mobyx0LG4pfSxmaXRXaWR0aDpmdW5jdGlvbih0LG4pe3JldHVybiBNcyhvLHQsbil9LGZpdEhlaWdodDpmdW5jdGlvbih0LG4pe3JldHVybiBBcyhvLHQsbil9fX0sdC5nZW9Qcm9qZWN0aW9uPUNzLHQuZ2VvUHJvamVjdGlvbk11dGF0b3I9UHMsdC5nZW9NZXJjYXRvcj1mdW5jdGlvbigpe3JldHVybiBGcyhCcykuc2NhbGUoOTYxL0JhKX0sdC5nZW9NZXJjYXRvclJhdz1Ccyx0Lmdlb05hdHVyYWxFYXJ0aDE9ZnVuY3Rpb24oKXtyZXR1cm4gQ3ModGwpLnNjYWxlKDE3NS4yOTUpfSx0Lmdlb05hdHVyYWxFYXJ0aDFSYXc9dGwsdC5nZW9PcnRob2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MobmwpLnNjYWxlKDI0OS41KS5jbGlwQW5nbGUoOTArRGEpfSx0Lmdlb09ydGhvZ3JhcGhpY1Jhdz1ubCx0Lmdlb1N0ZXJlb2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MoZWwpLnNjYWxlKDI1MCkuY2xpcEFuZ2xlKDE0Mil9LHQuZ2VvU3RlcmVvZ3JhcGhpY1Jhdz1lbCx0Lmdlb1RyYW5zdmVyc2VNZXJjYXRvcj1mdW5jdGlvbigpe3ZhciB0PUZzKHJsKSxuPXQuY2VudGVyLGU9dC5yb3RhdGU7cmV0dXJuIHQuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oWy10WzFdLHRbMF1dKTpbKHQ9bigpKVsxXSwtdFswXV19LHQucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoW3RbMF0sdFsxXSx0Lmxlbmd0aD4yP3RbMl0rOTA6OTBdKTpbKHQ9ZSgpKVswXSx0WzFdLHRbMl0tOTBdfSxlKFswLDAsOTBdKS5zY2FsZSgxNTkuMTU1KX0sdC5nZW9UcmFuc3ZlcnNlTWVyY2F0b3JSYXc9cmwsdC5nZW9Sb3RhdGlvbj1SZix0Lmdlb1N0cmVhbT1zdSx0Lmdlb1RyYW5zZm9ybT1mdW5jdGlvbih0KXtyZXR1cm57c3RyZWFtOl9zKHQpfX0sdC5jbHVzdGVyPWZ1bmN0aW9uKCl7dmFyIHQ9aWwsbj0xLGU9MSxyPSExO2Z1bmN0aW9uIGkoaSl7dmFyIG8sYT0wO2kuZWFjaEFmdGVyKGZ1bmN0aW9uKG4pe3ZhciBlPW4uY2hpbGRyZW47ZT8obi54PWZ1bmN0aW9uKHQpe3JldHVybiB0LnJlZHVjZShvbCwwKS90Lmxlbmd0aH0oZSksbi55PWZ1bmN0aW9uKHQpe3JldHVybiAxK3QucmVkdWNlKGFsLDApfShlKSk6KG4ueD1vP2ErPXQobixvKTowLG4ueT0wLG89bil9KTt2YXIgdT1mdW5jdGlvbih0KXtmb3IodmFyIG47bj10LmNoaWxkcmVuOyl0PW5bMF07cmV0dXJuIHR9KGkpLGY9ZnVuY3Rpb24odCl7Zm9yKHZhciBuO249dC5jaGlsZHJlbjspdD1uW24ubGVuZ3RoLTFdO3JldHVybiB0fShpKSxjPXUueC10KHUsZikvMixzPWYueCt0KGYsdSkvMjtyZXR1cm4gaS5lYWNoQWZ0ZXIocj9mdW5jdGlvbih0KXt0Lng9KHQueC1pLngpKm4sdC55PShpLnktdC55KSplfTpmdW5jdGlvbih0KXt0Lng9KHQueC1jKS8ocy1jKSpuLHQueT0oMS0oaS55P3QueS9pLnk6MSkpKmV9KX1yZXR1cm4gaS5zZXBhcmF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4saSk6dH0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSExLG49K3RbMF0sZT0rdFsxXSxpKTpyP251bGw6W24sZV19LGkubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITAsbj0rdFswXSxlPSt0WzFdLGkpOnI/W24sZV06bnVsbH0saX0sdC5oaWVyYXJjaHk9ZmwsdC5wYWNrPWZ1bmN0aW9uKCl7dmFyIHQ9bnVsbCxuPTEsZT0xLHI9RWw7ZnVuY3Rpb24gaShpKXtyZXR1cm4gaS54PW4vMixpLnk9ZS8yLHQ/aS5lYWNoQmVmb3JlKFBsKHQpKS5lYWNoQWZ0ZXIoemwociwuNSkpLmVhY2hCZWZvcmUoUmwoMSkpOmkuZWFjaEJlZm9yZShQbChDbCkpLmVhY2hBZnRlcih6bChFbCwxKSkuZWFjaEFmdGVyKHpsKHIsaS5yL01hdGgubWluKG4sZSkpKS5lYWNoQmVmb3JlKFJsKE1hdGgubWluKG4sZSkvKDIqaS5yKSkpLGl9cmV0dXJuIGkucmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PShlPW4pP251bGw6U2woZSksaSk6dDt2YXIgZX0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0WzBdLGU9K3RbMV0saSk6W24sZV19LGkucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmtsKCt0KSxpKTpyfSxpfSx0LnBhY2tTaWJsaW5ncz1mdW5jdGlvbih0KXtyZXR1cm4gTmwodCksdH0sdC5wYWNrRW5jbG9zZT1wbCx0LnBhcnRpdGlvbj1mdW5jdGlvbigpe3ZhciB0PTEsbj0xLGU9MCxyPSExO2Z1bmN0aW9uIGkoaSl7dmFyIG89aS5oZWlnaHQrMTtyZXR1cm4gaS54MD1pLnkwPWUsaS54MT10LGkueTE9bi9vLGkuZWFjaEJlZm9yZShmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbihyKXtyLmNoaWxkcmVuJiZEbChyLHIueDAsdCooci5kZXB0aCsxKS9uLHIueDEsdCooci5kZXB0aCsyKS9uKTt2YXIgaT1yLngwLG89ci55MCxhPXIueDEtZSx1PXIueTEtZTthPGkmJihpPWE9KGkrYSkvMiksdTxvJiYobz11PShvK3UpLzIpLHIueDA9aSxyLnkwPW8sci54MT1hLHIueTE9dX19KG4sbykpLHImJmkuZWFjaEJlZm9yZShMbCksaX1yZXR1cm4gaS5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hIXQsaSk6cn0saS5zaXplPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStlWzBdLG49K2VbMV0saSk6W3Qsbl19LGkucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCxpKTplfSxpfSx0LnN0cmF0aWZ5PWZ1bmN0aW9uKCl7dmFyIHQ9WWwsbj1CbDtmdW5jdGlvbiBlKGUpe3ZhciByLGksbyxhLHUsZixjLHM9ZS5sZW5ndGgsbD1uZXcgQXJyYXkocyksaD17fTtmb3IoaT0wO2k8czsrK2kpcj1lW2ldLHU9bFtpXT1uZXcgaGwociksbnVsbCE9KGY9dChyLGksZSkpJiYoZis9IiIpJiYoaFtjPVVsKyh1LmlkPWYpXT1jIGluIGg/T2w6dSk7Zm9yKGk9MDtpPHM7KytpKWlmKHU9bFtpXSxudWxsIT0oZj1uKGVbaV0saSxlKSkmJihmKz0iIikpe2lmKCEoYT1oW1VsK2ZdKSl0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrZik7aWYoYT09PU9sKXRocm93IG5ldyBFcnJvcigiYW1iaWd1b3VzOiAiK2YpO2EuY2hpbGRyZW4/YS5jaGlsZHJlbi5wdXNoKHUpOmEuY2hpbGRyZW49W3VdLHUucGFyZW50PWF9ZWxzZXtpZihvKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgcm9vdHMiKTtvPXV9aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJubyByb290Iik7aWYoby5wYXJlbnQ9cWwsby5lYWNoQmVmb3JlKGZ1bmN0aW9uKHQpe3QuZGVwdGg9dC5wYXJlbnQuZGVwdGgrMSwtLXN9KS5lYWNoQmVmb3JlKGxsKSxvLnBhcmVudD1udWxsLHM+MCl0aHJvdyBuZXcgRXJyb3IoImN5Y2xlIik7cmV0dXJuIG99cmV0dXJuIGUuaWQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9U2wobiksZSk6dH0sZS5wYXJlbnRJZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1TbCh0KSxlKTpufSxlfSx0LnRyZWU9ZnVuY3Rpb24oKXt2YXIgdD1GbCxuPTEsZT0xLHI9bnVsbDtmdW5jdGlvbiBpKGkpe3ZhciBmPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHIsaSxvLGE9bmV3IEdsKHQsMCksdT1bYV07bj11LnBvcCgpOylpZihyPW4uXy5jaGlsZHJlbilmb3Iobi5jaGlsZHJlbj1uZXcgQXJyYXkobz1yLmxlbmd0aCksaT1vLTE7aT49MDstLWkpdS5wdXNoKGU9bi5jaGlsZHJlbltpXT1uZXcgR2wocltpXSxpKSksZS5wYXJlbnQ9bjtyZXR1cm4oYS5wYXJlbnQ9bmV3IEdsKG51bGwsMCkpLmNoaWxkcmVuPVthXSxhfShpKTtpZihmLmVhY2hBZnRlcihvKSxmLnBhcmVudC5tPS1mLnosZi5lYWNoQmVmb3JlKGEpLHIpaS5lYWNoQmVmb3JlKHUpO2Vsc2V7dmFyIGM9aSxzPWksbD1pO2kuZWFjaEJlZm9yZShmdW5jdGlvbih0KXt0Lng8Yy54JiYoYz10KSx0Lng+cy54JiYocz10KSx0LmRlcHRoPmwuZGVwdGgmJihsPXQpfSk7dmFyIGg9Yz09PXM/MTp0KGMscykvMixkPWgtYy54LHA9bi8ocy54K2grZCksdj1lLyhsLmRlcHRofHwxKTtpLmVhY2hCZWZvcmUoZnVuY3Rpb24odCl7dC54PSh0LngrZCkqcCx0Lnk9dC5kZXB0aCp2fSl9cmV0dXJuIGl9ZnVuY3Rpb24gbyhuKXt2YXIgZT1uLmNoaWxkcmVuLHI9bi5wYXJlbnQuY2hpbGRyZW4saT1uLmk/cltuLmktMV06bnVsbDtpZihlKXshZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9MCxyPTAsaT10LmNoaWxkcmVuLG89aS5sZW5ndGg7LS1vPj0wOykobj1pW29dKS56Kz1lLG4ubSs9ZSxlKz1uLnMrKHIrPW4uYyl9KG4pO3ZhciBvPShlWzBdLnorZVtlLmxlbmd0aC0xXS56KS8yO2k/KG4uej1pLnordChuLl8saS5fKSxuLm09bi56LW8pOm4uej1vfWVsc2UgaSYmKG4uej1pLnordChuLl8saS5fKSk7bi5wYXJlbnQuQT1mdW5jdGlvbihuLGUscil7aWYoZSl7Zm9yKHZhciBpLG89bixhPW4sdT1lLGY9by5wYXJlbnQuY2hpbGRyZW5bMF0sYz1vLm0scz1hLm0sbD11Lm0saD1mLm07dT1IbCh1KSxvPUlsKG8pLHUmJm87KWY9SWwoZiksKGE9SGwoYSkpLmE9biwoaT11LnorbC1vLnotYyt0KHUuXyxvLl8pKT4wJiYoamwoWGwodSxuLHIpLG4saSksYys9aSxzKz1pKSxsKz11Lm0sYys9by5tLGgrPWYubSxzKz1hLm07dSYmIUhsKGEpJiYoYS50PXUsYS5tKz1sLXMpLG8mJiFJbChmKSYmKGYudD1vLGYubSs9Yy1oLHI9bil9cmV0dXJuIHJ9KG4saSxuLnBhcmVudC5BfHxyWzBdKX1mdW5jdGlvbiBhKHQpe3QuXy54PXQueit0LnBhcmVudC5tLHQubSs9dC5wYXJlbnQubX1mdW5jdGlvbiB1KHQpe3QueCo9bix0Lnk9dC5kZXB0aCplfXJldHVybiBpLnNlcGFyYXRpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixpKTp0fSxpLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITEsbj0rdFswXSxlPSt0WzFdLGkpOnI/bnVsbDpbbixlXX0saS5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hMCxuPSt0WzBdLGU9K3RbMV0saSk6cj9bbixlXTpudWxsfSxpfSx0LnRyZWVtYXA9ZnVuY3Rpb24oKXt2YXIgdD1abCxuPSExLGU9MSxyPTEsaT1bMF0sbz1FbCxhPUVsLHU9RWwsZj1FbCxjPUVsO2Z1bmN0aW9uIHModCl7cmV0dXJuIHQueDA9dC55MD0wLHQueDE9ZSx0LnkxPXIsdC5lYWNoQmVmb3JlKGwpLGk9WzBdLG4mJnQuZWFjaEJlZm9yZShMbCksdH1mdW5jdGlvbiBsKG4pe3ZhciBlPWlbbi5kZXB0aF0scj1uLngwK2Uscz1uLnkwK2UsbD1uLngxLWUsaD1uLnkxLWU7bDxyJiYocj1sPShyK2wpLzIpLGg8cyYmKHM9aD0ocytoKS8yKSxuLngwPXIsbi55MD1zLG4ueDE9bCxuLnkxPWgsbi5jaGlsZHJlbiYmKGU9aVtuLmRlcHRoKzFdPW8obikvMixyKz1jKG4pLWUscys9YShuKS1lLChsLT11KG4pLWUpPHImJihyPWw9KHIrbCkvMiksKGgtPWYobiktZSk8cyYmKHM9aD0ocytoKS8yKSx0KG4scixzLGwsaCkpfXJldHVybiBzLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSEhdCxzKTpufSxzLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3RbMF0scj0rdFsxXSxzKTpbZSxyXX0scy50aWxlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PVNsKG4pLHMpOnR9LHMucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9zLnBhZGRpbmdJbm5lcih0KS5wYWRkaW5nT3V0ZXIodCk6cy5wYWRkaW5nSW5uZXIoKX0scy5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6b30scy5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/cy5wYWRkaW5nVG9wKHQpLnBhZGRpbmdSaWdodCh0KS5wYWRkaW5nQm90dG9tKHQpLnBhZGRpbmdMZWZ0KHQpOnMucGFkZGluZ1RvcCgpfSxzLnBhZGRpbmdUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6YX0scy5wYWRkaW5nUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6dX0scy5wYWRkaW5nQm90dG9tPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a2woK3QpLHMpOmZ9LHMucGFkZGluZ0xlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6Y30sc30sdC50cmVlbWFwQmluYXJ5PWZ1bmN0aW9uKHQsbixlLHIsaSl7dmFyIG8sYSx1PXQuY2hpbGRyZW4sZj11Lmxlbmd0aCxjPW5ldyBBcnJheShmKzEpO2ZvcihjWzBdPWE9bz0wO288ZjsrK28pY1tvKzFdPWErPXVbb10udmFsdWU7IWZ1bmN0aW9uIHQobixlLHIsaSxvLGEsZil7aWYobj49ZS0xKXt2YXIgcz11W25dO3JldHVybiBzLngwPWkscy55MD1vLHMueDE9YSx2b2lkKHMueTE9Zil9Zm9yKHZhciBsPWNbbl0saD1yLzIrbCxkPW4rMSxwPWUtMTtkPHA7KXt2YXIgdj1kK3A+Pj4xO2Nbdl08aD9kPXYrMTpwPXZ9aC1jW2QtMV08Y1tkXS1oJiZuKzE8ZCYmLS1kO3ZhciBnPWNbZF0tbCx5PXItZztpZihhLWk+Zi1vKXt2YXIgXz0oaSp5K2EqZykvcjt0KG4sZCxnLGksbyxfLGYpLHQoZCxlLHksXyxvLGEsZil9ZWxzZXt2YXIgYj0obyp5K2YqZykvcjt0KG4sZCxnLGksbyxhLGIpLHQoZCxlLHksaSxiLGEsZil9fSgwLGYsdC52YWx1ZSxuLGUscixpKX0sdC50cmVlbWFwRGljZT1EbCx0LnRyZWVtYXBTbGljZT1WbCx0LnRyZWVtYXBTbGljZURpY2U9ZnVuY3Rpb24odCxuLGUscixpKXsoMSZ0LmRlcHRoP1ZsOkRsKSh0LG4sZSxyLGkpfSx0LnRyZWVtYXBTcXVhcmlmeT1abCx0LnRyZWVtYXBSZXNxdWFyaWZ5PVFsLHQuaW50ZXJwb2xhdGU9bWUsdC5pbnRlcnBvbGF0ZUFycmF5PWRlLHQuaW50ZXJwb2xhdGVCYXNpcz1lZSx0LmludGVycG9sYXRlQmFzaXNDbG9zZWQ9cmUsdC5pbnRlcnBvbGF0ZURhdGU9cGUsdC5pbnRlcnBvbGF0ZURpc2NyZXRlPWZ1bmN0aW9uKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdFtNYXRoLm1heCgwLE1hdGgubWluKG4tMSxNYXRoLmZsb29yKGUqbikpKV19fSx0LmludGVycG9sYXRlSHVlPWZ1bmN0aW9uKHQsbil7dmFyIGU9YWUoK3QsK24pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj1lKHQpO3JldHVybiBuLTM2MCpNYXRoLmZsb29yKG4vMzYwKX19LHQuaW50ZXJwb2xhdGVOdW1iZXI9dmUsdC5pbnRlcnBvbGF0ZU9iamVjdD1nZSx0LmludGVycG9sYXRlUm91bmQ9eGUsdC5pbnRlcnBvbGF0ZVN0cmluZz1iZSx0LmludGVycG9sYXRlVHJhbnNmb3JtQ3NzPUNlLHQuaW50ZXJwb2xhdGVUcmFuc2Zvcm1Tdmc9UGUsdC5pbnRlcnBvbGF0ZVpvb209cWUsdC5pbnRlcnBvbGF0ZVJnYj1jZSx0LmludGVycG9sYXRlUmdiQmFzaXM9bGUsdC5pbnRlcnBvbGF0ZVJnYkJhc2lzQ2xvc2VkPWhlLHQuaW50ZXJwb2xhdGVIc2w9WWUsdC5pbnRlcnBvbGF0ZUhzbExvbmc9QmUsdC5pbnRlcnBvbGF0ZUxhYj1mdW5jdGlvbih0LG4pe3ZhciBlPWZlKCh0PVVuKHQpKS5sLChuPVVuKG4pKS5sKSxyPWZlKHQuYSxuLmEpLGk9ZmUodC5iLG4uYiksbz1mZSh0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQubD1lKG4pLHQuYT1yKG4pLHQuYj1pKG4pLHQub3BhY2l0eT1vKG4pLHQrIiJ9fSx0LmludGVycG9sYXRlSGNsPUllLHQuaW50ZXJwb2xhdGVIY2xMb25nPUhlLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXg9WGUsdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmc9R2UsdC5waWVjZXdpc2U9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9MCxyPW4ubGVuZ3RoLTEsaT1uWzBdLG89bmV3IEFycmF5KHI8MD8wOnIpO2U8cjspb1tlXT10KGksaT1uWysrZV0pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj1NYXRoLm1heCgwLE1hdGgubWluKHItMSxNYXRoLmZsb29yKHQqPXIpKSk7cmV0dXJuIG9bbl0odC1uKX19LHQucXVhbnRpemU9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWVbcl09dChyLyhuLTEpKTtyZXR1cm4gZX0sdC5wYXRoPUdpLHQucG9seWdvbkFyZWE9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9LTEscj10Lmxlbmd0aCxpPXRbci0xXSxvPTA7KytlPHI7KW49aSxpPXRbZV0sbys9blsxXSppWzBdLW5bMF0qaVsxXTtyZXR1cm4gby8yfSx0LnBvbHlnb25DZW50cm9pZD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPS0xLGk9dC5sZW5ndGgsbz0wLGE9MCx1PXRbaS0xXSxmPTA7KytyPGk7KW49dSx1PXRbcl0sZis9ZT1uWzBdKnVbMV0tdVswXSpuWzFdLG8rPShuWzBdK3VbMF0pKmUsYSs9KG5bMV0rdVsxXSkqZTtyZXR1cm5bby8oZio9MyksYS9mXX0sdC5wb2x5Z29uSHVsbD1mdW5jdGlvbih0KXtpZigoZT10Lmxlbmd0aCk8MylyZXR1cm4gbnVsbDt2YXIgbixlLHI9bmV3IEFycmF5KGUpLGk9bmV3IEFycmF5KGUpO2ZvcihuPTA7bjxlOysrbilyW25dPVsrdFtuXVswXSwrdFtuXVsxXSxuXTtmb3Ioci5zb3J0KEpsKSxuPTA7bjxlOysrbilpW25dPVtyW25dWzBdLC1yW25dWzFdXTt2YXIgbz1LbChyKSxhPUtsKGkpLHU9YVswXT09PW9bMF0sZj1hW2EubGVuZ3RoLTFdPT09b1tvLmxlbmd0aC0xXSxjPVtdO2ZvcihuPW8ubGVuZ3RoLTE7bj49MDstLW4pYy5wdXNoKHRbcltvW25dXVsyXV0pO2ZvcihuPSt1O248YS5sZW5ndGgtZjsrK24pYy5wdXNoKHRbclthW25dXVsyXV0pO3JldHVybiBjfSx0LnBvbHlnb25Db250YWlucz1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZSxyLGk9dC5sZW5ndGgsbz10W2ktMV0sYT1uWzBdLHU9blsxXSxmPW9bMF0sYz1vWzFdLHM9ITEsbD0wO2w8aTsrK2wpZT0obz10W2xdKVswXSwocj1vWzFdKT51IT1jPnUmJmE8KGYtZSkqKHUtcikvKGMtcikrZSYmKHM9IXMpLGY9ZSxjPXI7cmV0dXJuIHN9LHQucG9seWdvbkxlbmd0aD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPS0xLGk9dC5sZW5ndGgsbz10W2ktMV0sYT1vWzBdLHU9b1sxXSxmPTA7KytyPGk7KW49YSxlPXUsbi09YT0obz10W3JdKVswXSxlLT11PW9bMV0sZis9TWF0aC5zcXJ0KG4qbitlKmUpO3JldHVybiBmfSx0LnF1YWR0cmVlPXJhLHQucmFuZG9tVW5pZm9ybT1uaCx0LnJhbmRvbU5vcm1hbD1laCx0LnJhbmRvbUxvZ05vcm1hbD1yaCx0LnJhbmRvbUJhdGVzPW9oLHQucmFuZG9tSXJ3aW5IYWxsPWloLHQucmFuZG9tRXhwb25lbnRpYWw9YWgsdC5zY2FsZUJhbmQ9aGgsdC5zY2FsZVBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uIHQobil7dmFyIGU9bi5jb3B5O3JldHVybiBuLnBhZGRpbmc9bi5wYWRkaW5nT3V0ZXIsZGVsZXRlIG4ucGFkZGluZ0lubmVyLGRlbGV0ZSBuLnBhZGRpbmdPdXRlcixuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdChlKCkpfSxufShoaCgpLnBhZGRpbmdJbm5lcigxKSl9LHQuc2NhbGVJZGVudGl0eT1mdW5jdGlvbiB0KCl7dmFyIG49WzAsMV07ZnVuY3Rpb24gZSh0KXtyZXR1cm4rdH1yZXR1cm4gZS5pbnZlcnQ9ZSxlLmRvbWFpbj1lLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWZoLmNhbGwodCxwaCksZSk6bi5zbGljZSgpfSxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihuKX0seGgoZSl9LHQuc2NhbGVMaW5lYXI9ZnVuY3Rpb24gdCgpe3ZhciBuPW1oKGdoLHZlKTtyZXR1cm4gbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKG4sdCgpKX0seGgobil9LHQuc2NhbGVMb2c9ZnVuY3Rpb24gbigpe3ZhciBlPW1oKE1oLEFoKS5kb21haW4oWzEsMTBdKSxyPWUuZG9tYWluLGk9MTAsbz1TaCgxMCksYT1OaCgxMCk7ZnVuY3Rpb24gdSgpe3JldHVybiBvPVNoKGkpLGE9TmgoaSkscigpWzBdPDAmJihvPUVoKG8pLGE9RWgoYSkpLGV9cmV0dXJuIGUuYmFzZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCx1KCkpOml9LGUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyKHQpLHUoKSk6cigpfSxlLnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBuLGU9cigpLHU9ZVswXSxmPWVbZS5sZW5ndGgtMV07KG49Zjx1KSYmKGg9dSx1PWYsZj1oKTt2YXIgYyxzLGwsaD1vKHUpLGQ9byhmKSxwPW51bGw9PXQ/MTA6K3Qsdj1bXTtpZighKGklMSkmJmQtaDxwKXtpZihoPU1hdGgucm91bmQoaCktMSxkPU1hdGgucm91bmQoZCkrMSx1PjApe2Zvcig7aDxkOysraClmb3Iocz0xLGM9YShoKTtzPGk7KytzKWlmKCEoKGw9YypzKTx1KSl7aWYobD5mKWJyZWFrO3YucHVzaChsKX19ZWxzZSBmb3IoO2g8ZDsrK2gpZm9yKHM9aS0xLGM9YShoKTtzPj0xOy0tcylpZighKChsPWMqcyk8dSkpe2lmKGw+ZilicmVhazt2LnB1c2gobCl9fWVsc2Ugdj1tKGgsZCxNYXRoLm1pbihkLWgscCkpLm1hcChhKTtyZXR1cm4gbj92LnJldmVyc2UoKTp2fSxlLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obixyKXtpZihudWxsPT1yJiYocj0xMD09PWk/Ii4wZSI6IiwiKSwiZnVuY3Rpb24iIT10eXBlb2YgciYmKHI9dC5mb3JtYXQocikpLG49PT0xLzApcmV0dXJuIHI7bnVsbD09biYmKG49MTApO3ZhciB1PU1hdGgubWF4KDEsaSpuL2UudGlja3MoKS5sZW5ndGgpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10L2EoTWF0aC5yb3VuZChvKHQpKSk7cmV0dXJuIG4qaTxpLS41JiYobio9aSksbjw9dT9yKHQpOiIifX0sZS5uaWNlPWZ1bmN0aW9uKCl7cmV0dXJuIHIod2gocigpLHtmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gYShNYXRoLmZsb29yKG8odCkpKX0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gYShNYXRoLmNlaWwobyh0KSkpfX0pKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKGUsbigpLmJhc2UoaSkpfSxlfSx0LnNjYWxlT3JkaW5hbD1saCx0LnNjYWxlSW1wbGljaXQ9c2gsdC5zY2FsZVBvdz1DaCx0LnNjYWxlU3FydD1mdW5jdGlvbigpe3JldHVybiBDaCgpLmV4cG9uZW50KC41KX0sdC5zY2FsZVF1YW50aWxlPWZ1bmN0aW9uIHQoKXt2YXIgZT1bXSxyPVtdLG89W107ZnVuY3Rpb24gYSgpe3ZhciB0PTAsbj1NYXRoLm1heCgxLHIubGVuZ3RoKTtmb3Iobz1uZXcgQXJyYXkobi0xKTsrK3Q8bjspb1t0LTFdPUEoZSx0L24pO3JldHVybiB1fWZ1bmN0aW9uIHUodCl7aWYoIWlzTmFOKHQ9K3QpKXJldHVybiByW2kobyx0KV19cmV0dXJuIHUuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBuPXIuaW5kZXhPZih0KTtyZXR1cm4gbjwwP1tOYU4sTmFOXTpbbj4wP29bbi0xXTplWzBdLG48by5sZW5ndGg/b1tuXTplW2UubGVuZ3RoLTFdXX0sdS5kb21haW49ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGUuc2xpY2UoKTtlPVtdO2Zvcih2YXIgcixpPTAsbz10Lmxlbmd0aDtpPG87KytpKW51bGw9PShyPXRbaV0pfHxpc05hTihyPStyKXx8ZS5wdXNoKHIpO3JldHVybiBlLnNvcnQobiksYSgpfSx1LnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWNoLmNhbGwodCksYSgpKTpyLnNsaWNlKCl9LHUucXVhbnRpbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIG8uc2xpY2UoKX0sdS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4oZSkucmFuZ2Uocil9LHV9LHQuc2NhbGVRdWFudGl6ZT1mdW5jdGlvbiB0KCl7dmFyIG49MCxlPTEscj0xLG89Wy41XSxhPVswLDFdO2Z1bmN0aW9uIHUodCl7aWYodDw9dClyZXR1cm4gYVtpKG8sdCwwLHIpXX1mdW5jdGlvbiBmKCl7dmFyIHQ9LTE7Zm9yKG89bmV3IEFycmF5KHIpOysrdDxyOylvW3RdPSgodCsxKSplLSh0LXIpKm4pLyhyKzEpO3JldHVybiB1fXJldHVybiB1LmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdFswXSxlPSt0WzFdLGYoKSk6W24sZV19LHUucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9KGE9Y2guY2FsbCh0KSkubGVuZ3RoLTEsZigpKTphLnNsaWNlKCl9LHUuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBpPWEuaW5kZXhPZih0KTtyZXR1cm4gaTwwP1tOYU4sTmFOXTppPDE/W24sb1swXV06aT49cj9bb1tyLTFdLGVdOltvW2ktMV0sb1tpXV19LHUuY29weT1mdW5jdGlvbigpe3JldHVybiB0KCkuZG9tYWluKFtuLGVdKS5yYW5nZShhKX0seGgodSl9LHQuc2NhbGVUaHJlc2hvbGQ9ZnVuY3Rpb24gdCgpe3ZhciBuPVsuNV0sZT1bMCwxXSxyPTE7ZnVuY3Rpb24gbyh0KXtpZih0PD10KXJldHVybiBlW2kobix0LDAscildfXJldHVybiBvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1jaC5jYWxsKHQpLHI9TWF0aC5taW4obi5sZW5ndGgsZS5sZW5ndGgtMSksbyk6bi5zbGljZSgpfSxvLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWNoLmNhbGwodCkscj1NYXRoLm1pbihuLmxlbmd0aCxlLmxlbmd0aC0xKSxvKTplLnNsaWNlKCl9LG8uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciByPWUuaW5kZXhPZih0KTtyZXR1cm5bbltyLTFdLG5bcl1dfSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihuKS5yYW5nZShlKX0sb30sdC5zY2FsZVRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gY3YoY2QsdWQsVmgsamgsSWgsQmgsT2gsTGgsdC50aW1lRm9ybWF0KS5kb21haW4oW25ldyBEYXRlKDJlMywwLDEpLG5ldyBEYXRlKDJlMywwLDIpXSl9LHQuc2NhbGVVdGM9ZnVuY3Rpb24oKXtyZXR1cm4gY3YoTGQsemQsX2QsdmQsZGQsbGQsT2gsTGgsdC51dGNGb3JtYXQpLmRvbWFpbihbRGF0ZS5VVEMoMmUzLDAsMSksRGF0ZS5VVEMoMmUzLDAsMildKX0sdC5zY2FsZVNlcXVlbnRpYWw9ZnVuY3Rpb24gdChuKXt2YXIgZT0wLHI9MSxpPTEsbz0hMTtmdW5jdGlvbiBhKHQpe3ZhciByPSh0LWUpKmk7cmV0dXJuIG4obz9NYXRoLm1heCgwLE1hdGgubWluKDEscikpOnIpfXJldHVybiBhLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdFswXSxyPSt0WzFdLGk9ZT09PXI/MDoxLyhyLWUpLGEpOltlLHJdfSxhLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSEhdCxhKTpvfSxhLmludGVycG9sYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGEpOm59LGEuY29weT1mdW5jdGlvbigpe3JldHVybiB0KG4pLmRvbWFpbihbZSxyXSkuY2xhbXAobyl9LHhoKGEpfSx0LnNjYWxlRGl2ZXJnaW5nPWZ1bmN0aW9uIHQobil7dmFyIGU9MCxyPS41LGk9MSxvPTEsYT0xLHU9ITE7ZnVuY3Rpb24gZih0KXt2YXIgZT0uNSsoKHQ9K3QpLXIpKih0PHI/bzphKTtyZXR1cm4gbih1P01hdGgubWF4KDAsTWF0aC5taW4oMSxlKSk6ZSl9cmV0dXJuIGYuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLHI9K3RbMV0saT0rdFsyXSxvPWU9PT1yPzA6LjUvKHItZSksYT1yPT09aT8wOi41LyhpLXIpLGYpOltlLHIsaV19LGYuY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ISF0LGYpOnV9LGYuaW50ZXJwb2xhdG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZik6bn0sZi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQobikuZG9tYWluKFtlLHIsaV0pLmNsYW1wKHUpfSx4aChmKX0sdC5zY2hlbWVDYXRlZ29yeTEwPWx2LHQuc2NoZW1lQWNjZW50PWh2LHQuc2NoZW1lRGFyazI9ZHYsdC5zY2hlbWVQYWlyZWQ9cHYsdC5zY2hlbWVQYXN0ZWwxPXZ2LHQuc2NoZW1lUGFzdGVsMj1ndix0LnNjaGVtZVNldDE9eXYsdC5zY2hlbWVTZXQyPV92LHQuc2NoZW1lU2V0Mz1idix0LmludGVycG9sYXRlQnJCRz13dix0LnNjaGVtZUJyQkc9eHYsdC5pbnRlcnBvbGF0ZVBSR249QXYsdC5zY2hlbWVQUkduPU12LHQuaW50ZXJwb2xhdGVQaVlHPU52LHQuc2NoZW1lUGlZRz1Udix0LmludGVycG9sYXRlUHVPcj1Fdix0LnNjaGVtZVB1T3I9U3YsdC5pbnRlcnBvbGF0ZVJkQnU9Q3YsdC5zY2hlbWVSZEJ1PWt2LHQuaW50ZXJwb2xhdGVSZEd5PXp2LHQuc2NoZW1lUmRHeT1Qdix0LmludGVycG9sYXRlUmRZbEJ1PUx2LHQuc2NoZW1lUmRZbEJ1PVJ2LHQuaW50ZXJwb2xhdGVSZFlsR249VXYsdC5zY2hlbWVSZFlsR249RHYsdC5pbnRlcnBvbGF0ZVNwZWN0cmFsPU92LHQuc2NoZW1lU3BlY3RyYWw9cXYsdC5pbnRlcnBvbGF0ZUJ1R249QnYsdC5zY2hlbWVCdUduPVl2LHQuaW50ZXJwb2xhdGVCdVB1PUl2LHQuc2NoZW1lQnVQdT1Gdix0LmludGVycG9sYXRlR25CdT1qdix0LnNjaGVtZUduQnU9SHYsdC5pbnRlcnBvbGF0ZU9yUmQ9R3YsdC5zY2hlbWVPclJkPVh2LHQuaW50ZXJwb2xhdGVQdUJ1R249JHYsdC5zY2hlbWVQdUJ1R249VnYsdC5pbnRlcnBvbGF0ZVB1QnU9WnYsdC5zY2hlbWVQdUJ1PVd2LHQuaW50ZXJwb2xhdGVQdVJkPUp2LHQuc2NoZW1lUHVSZD1Rdix0LmludGVycG9sYXRlUmRQdT10Zyx0LnNjaGVtZVJkUHU9S3YsdC5pbnRlcnBvbGF0ZVlsR25CdT1lZyx0LnNjaGVtZVlsR25CdT1uZyx0LmludGVycG9sYXRlWWxHbj1pZyx0LnNjaGVtZVlsR249cmcsdC5pbnRlcnBvbGF0ZVlsT3JCcj1hZyx0LnNjaGVtZVlsT3JCcj1vZyx0LmludGVycG9sYXRlWWxPclJkPWZnLHQuc2NoZW1lWWxPclJkPXVnLHQuaW50ZXJwb2xhdGVCbHVlcz1zZyx0LnNjaGVtZUJsdWVzPWNnLHQuaW50ZXJwb2xhdGVHcmVlbnM9aGcsdC5zY2hlbWVHcmVlbnM9bGcsdC5pbnRlcnBvbGF0ZUdyZXlzPXBnLHQuc2NoZW1lR3JleXM9ZGcsdC5pbnRlcnBvbGF0ZVB1cnBsZXM9Z2csdC5zY2hlbWVQdXJwbGVzPXZnLHQuaW50ZXJwb2xhdGVSZWRzPV9nLHQuc2NoZW1lUmVkcz15Zyx0LmludGVycG9sYXRlT3Jhbmdlcz1tZyx0LnNjaGVtZU9yYW5nZXM9YmcsdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeERlZmF1bHQ9eGcsdC5pbnRlcnBvbGF0ZVJhaW5ib3c9ZnVuY3Rpb24odCl7KHQ8MHx8dD4xKSYmKHQtPU1hdGguZmxvb3IodCkpO3ZhciBuPU1hdGguYWJzKHQtLjUpO3JldHVybiBBZy5oPTM2MCp0LTEwMCxBZy5zPTEuNS0xLjUqbixBZy5sPS44LS45Km4sQWcrIiJ9LHQuaW50ZXJwb2xhdGVXYXJtPXdnLHQuaW50ZXJwb2xhdGVDb29sPU1nLHQuaW50ZXJwb2xhdGVTaW5lYm93PWZ1bmN0aW9uKHQpe3ZhciBuO3JldHVybiB0PSguNS10KSpNYXRoLlBJLFRnLnI9MjU1KihuPU1hdGguc2luKHQpKSpuLFRnLmc9MjU1KihuPU1hdGguc2luKHQrTmcpKSpuLFRnLmI9MjU1KihuPU1hdGguc2luKHQrU2cpKSpuLFRnKyIifSx0LmludGVycG9sYXRlVmlyaWRpcz1rZyx0LmludGVycG9sYXRlTWFnbWE9Q2csdC5pbnRlcnBvbGF0ZUluZmVybm89UGcsdC5pbnRlcnBvbGF0ZVBsYXNtYT16Zyx0LmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gRHQoVyh0KS5jYWxsKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpfSx0LmNyZWF0b3I9Vyx0LmxvY2FsPXF0LHQubWF0Y2hlcj1ydCx0Lm1vdXNlPUZ0LHQubmFtZXNwYWNlPSQsdC5uYW1lc3BhY2VzPVYsdC5jbGllbnRQb2ludD1CdCx0LnNlbGVjdD1EdCx0LnNlbGVjdEFsbD1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFJ0KFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IFJ0KFtudWxsPT10P1tdOnRdLHp0KX0sdC5zZWxlY3Rpb249THQsdC5zZWxlY3Rvcj1RLHQuc2VsZWN0b3JBbGw9Syx0LnN0eWxlPWx0LHQudG91Y2g9SXQsdC50b3VjaGVzPWZ1bmN0aW9uKHQsbil7bnVsbD09biYmKG49WXQoKS50b3VjaGVzKTtmb3IodmFyIGU9MCxyPW4/bi5sZW5ndGg6MCxpPW5ldyBBcnJheShyKTtlPHI7KytlKWlbZV09QnQodCxuW2VdKTtyZXR1cm4gaX0sdC53aW5kb3c9c3QsdC5jdXN0b21FdmVudD1DdCx0LmFyYz1mdW5jdGlvbigpe3ZhciB0PUdnLG49VmcsZT1SZygwKSxyPW51bGwsaT0kZyxvPVdnLGE9WmcsdT1udWxsO2Z1bmN0aW9uIGYoKXt2YXIgZixjLHMsbD0rdC5hcHBseSh0aGlzLGFyZ3VtZW50cyksaD0rbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksZD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1IZyxwPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpLUhnLHY9TGcocC1kKSxnPXA+ZDtpZih1fHwodT1mPUdpKCkpLGg8bCYmKGM9aCxoPWwsbD1jKSxoPkZnKWlmKHY+amctRmcpdS5tb3ZlVG8oaCpVZyhkKSxoKllnKGQpKSx1LmFyYygwLDAsaCxkLHAsIWcpLGw+RmcmJih1Lm1vdmVUbyhsKlVnKHApLGwqWWcocCkpLHUuYXJjKDAsMCxsLHAsZCxnKSk7ZWxzZXt2YXIgeSxfLGI9ZCxtPXAseD1kLHc9cCxNPXYsQT12LFQ9YS5hcHBseSh0aGlzLGFyZ3VtZW50cykvMixOPVQ+RmcmJihyPytyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpCZyhsKmwraCpoKSksUz1PZyhMZyhoLWwpLzIsK2UuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxFPVMsaz1TO2lmKE4+Rmcpe3ZhciBDPVhnKE4vbCpZZyhUKSksUD1YZyhOL2gqWWcoVCkpOyhNLT0yKkMpPkZnPyh4Kz1DKj1nPzE6LTEsdy09Qyk6KE09MCx4PXc9KGQrcCkvMiksKEEtPTIqUCk+Rmc/KGIrPVAqPWc/MTotMSxtLT1QKTooQT0wLGI9bT0oZCtwKS8yKX12YXIgej1oKlVnKGIpLFI9aCpZZyhiKSxMPWwqVWcodyksRD1sKllnKHcpO2lmKFM+Rmcpe3ZhciBVPWgqVWcobSkscT1oKllnKG0pLE89bCpVZyh4KSxZPWwqWWcoeCk7aWYodjxJZyl7dmFyIEI9TT5GZz9mdW5jdGlvbih0LG4sZSxyLGksbyxhLHUpe3ZhciBmPWUtdCxjPXItbixzPWEtaSxsPXUtbyxoPShzKihuLW8pLWwqKHQtaSkpLyhsKmYtcypjKTtyZXR1cm5bdCtoKmYsbitoKmNdfSh6LFIsTyxZLFUscSxMLEQpOltMLERdLEY9ei1CWzBdLEk9Ui1CWzFdLEg9VS1CWzBdLGo9cS1CWzFdLFg9MS9ZZygoKHM9KEYqSCtJKmopLyhCZyhGKkYrSSpJKSpCZyhIKkgraipqKSkpPjE/MDpzPC0xP0lnOk1hdGguYWNvcyhzKSkvMiksRz1CZyhCWzBdKkJbMF0rQlsxXSpCWzFdKTtFPU9nKFMsKGwtRykvKFgtMSkpLGs9T2coUywoaC1HKS8oWCsxKSl9fUE+Rmc/az5GZz8oeT1RZyhPLFkseixSLGgsayxnKSxfPVFnKFUscSxMLEQsaCxrLGcpLHUubW92ZVRvKHkuY3greS54MDEseS5jeSt5LnkwMSksazxTP3UuYXJjKHkuY3gseS5jeSxrLERnKHkueTAxLHkueDAxKSxEZyhfLnkwMSxfLngwMSksIWcpOih1LmFyYyh5LmN4LHkuY3ksayxEZyh5LnkwMSx5LngwMSksRGcoeS55MTEseS54MTEpLCFnKSx1LmFyYygwLDAsaCxEZyh5LmN5K3kueTExLHkuY3greS54MTEpLERnKF8uY3krXy55MTEsXy5jeCtfLngxMSksIWcpLHUuYXJjKF8uY3gsXy5jeSxrLERnKF8ueTExLF8ueDExKSxEZyhfLnkwMSxfLngwMSksIWcpKSk6KHUubW92ZVRvKHosUiksdS5hcmMoMCwwLGgsYixtLCFnKSk6dS5tb3ZlVG8oeixSKSxsPkZnJiZNPkZnP0U+Rmc/KHk9UWcoTCxELFUscSxsLC1FLGcpLF89UWcoeixSLE8sWSxsLC1FLGcpLHUubGluZVRvKHkuY3greS54MDEseS5jeSt5LnkwMSksRTxTP3UuYXJjKHkuY3gseS5jeSxFLERnKHkueTAxLHkueDAxKSxEZyhfLnkwMSxfLngwMSksIWcpOih1LmFyYyh5LmN4LHkuY3ksRSxEZyh5LnkwMSx5LngwMSksRGcoeS55MTEseS54MTEpLCFnKSx1LmFyYygwLDAsbCxEZyh5LmN5K3kueTExLHkuY3greS54MTEpLERnKF8uY3krXy55MTEsXy5jeCtfLngxMSksZyksdS5hcmMoXy5jeCxfLmN5LEUsRGcoXy55MTEsXy54MTEpLERnKF8ueTAxLF8ueDAxKSwhZykpKTp1LmFyYygwLDAsbCx3LHgsZyk6dS5saW5lVG8oTCxEKX1lbHNlIHUubW92ZVRvKDAsMCk7aWYodS5jbG9zZVBhdGgoKSxmKXJldHVybiB1PW51bGwsZisiInx8bnVsbH1yZXR1cm4gZi5jZW50cm9pZD1mdW5jdGlvbigpe3ZhciBlPSgrdC5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMixyPSgraS5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMi1JZy8yO3JldHVybltVZyhyKSplLFlnKHIpKmVdfSxmLmlubmVyUmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UmcoK24pLGYpOnR9LGYub3V0ZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6bn0sZi5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6ZX0sZi5wYWRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOnJ9LGYuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTppfSxmLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOm99LGYucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6YX0sZi5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGw9PXQ/bnVsbDp0LGYpOnV9LGZ9LHQuYXJlYT1yeSx0LmxpbmU9ZXksdC5waWU9ZnVuY3Rpb24oKXt2YXIgdD1veSxuPWl5LGU9bnVsbCxyPVJnKDApLGk9UmcoamcpLG89UmcoMCk7ZnVuY3Rpb24gYShhKXt2YXIgdSxmLGMscyxsLGg9YS5sZW5ndGgsZD0wLHA9bmV3IEFycmF5KGgpLHY9bmV3IEFycmF5KGgpLGc9K3IuYXBwbHkodGhpcyxhcmd1bWVudHMpLHk9TWF0aC5taW4oamcsTWF0aC5tYXgoLWpnLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpLWcpKSxfPU1hdGgubWluKE1hdGguYWJzKHkpL2gsby5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGI9XyooeTwwPy0xOjEpO2Zvcih1PTA7dTxoOysrdSkobD12W3BbdV09dV09K3QoYVt1XSx1LGEpKT4wJiYoZCs9bCk7Zm9yKG51bGwhPW4/cC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odlt0XSx2W2VdKX0pOm51bGwhPWUmJnAuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBlKGFbdF0sYVtuXSl9KSx1PTAsYz1kPyh5LWgqYikvZDowO3U8aDsrK3UsZz1zKWY9cFt1XSxzPWcrKChsPXZbZl0pPjA/bCpjOjApK2IsdltmXT17ZGF0YTphW2ZdLGluZGV4OnUsdmFsdWU6bCxzdGFydEFuZ2xlOmcsZW5kQW5nbGU6cyxwYWRBbmdsZTpffTtyZXR1cm4gdn1yZXR1cm4gYS52YWx1ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKCtuKSxhKTp0fSxhLnNvcnRWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxlPW51bGwsYSk6bn0sYS5zb3J0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbj1udWxsLGEpOmV9LGEuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxhKTpyfSxhLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOml9LGEucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6b30sYX0sdC5hcmVhUmFkaWFsPWx5LHQucmFkaWFsQXJlYT1seSx0LmxpbmVSYWRpYWw9c3ksdC5yYWRpYWxMaW5lPXN5LHQucG9pbnRSYWRpYWw9aHksdC5saW5rSG9yaXpvbnRhbD1mdW5jdGlvbigpe3JldHVybiBneSh5eSl9LHQubGlua1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuIGd5KF95KX0sdC5saW5rUmFkaWFsPWZ1bmN0aW9uKCl7dmFyIHQ9Z3koYnkpO3JldHVybiB0LmFuZ2xlPXQueCxkZWxldGUgdC54LHQucmFkaXVzPXQueSxkZWxldGUgdC55LHR9LHQuc3ltYm9sPWZ1bmN0aW9uKCl7dmFyIHQ9UmcobXkpLG49UmcoNjQpLGU9bnVsbDtmdW5jdGlvbiByKCl7dmFyIHI7aWYoZXx8KGU9cj1HaSgpKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKS5kcmF3KGUsK24uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxyKXJldHVybiBlPW51bGwscisiInx8bnVsbH1yZXR1cm4gci50eXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Umcobikscik6dH0sci5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLHIpOm59LHIuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6dCxyKTplfSxyfSx0LnN5bWJvbHM9VXksdC5zeW1ib2xDaXJjbGU9bXksdC5zeW1ib2xDcm9zcz14eSx0LnN5bWJvbERpYW1vbmQ9QXksdC5zeW1ib2xTcXVhcmU9a3ksdC5zeW1ib2xTdGFyPUV5LHQuc3ltYm9sVHJpYW5nbGU9UHksdC5zeW1ib2xXeWU9RHksdC5jdXJ2ZUJhc2lzQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgQnkodCl9LHQuY3VydmVCYXNpc09wZW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBGeSh0KX0sdC5jdXJ2ZUJhc2lzPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgWXkodCl9LHQuY3VydmVCdW5kbGU9SHksdC5jdXJ2ZUNhcmRpbmFsQ2xvc2VkPSR5LHQuY3VydmVDYXJkaW5hbE9wZW49WnksdC5jdXJ2ZUNhcmRpbmFsPUd5LHQuY3VydmVDYXRtdWxsUm9tQ2xvc2VkPW5fLHQuY3VydmVDYXRtdWxsUm9tT3Blbj1yXyx0LmN1cnZlQ2F0bXVsbFJvbT1LeSx0LmN1cnZlTGluZWFyQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaV8odCl9LHQuY3VydmVMaW5lYXI9S2csdC5jdXJ2ZU1vbm90b25lWD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGNfKHQpfSx0LmN1cnZlTW9ub3RvbmVZPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgc18odCl9LHQuY3VydmVOYXR1cmFsPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaF8odCl9LHQuY3VydmVTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcF8odCwuNSl9LHQuY3VydmVTdGVwQWZ0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBwXyh0LDEpfSx0LmN1cnZlU3RlcEJlZm9yZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHBfKHQsMCl9LHQuc3RhY2s9ZnVuY3Rpb24oKXt2YXIgdD1SZyhbXSksbj1nXyxlPXZfLHI9eV87ZnVuY3Rpb24gaShpKXt2YXIgbyxhLHU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksZj1pLmxlbmd0aCxjPXUubGVuZ3RoLHM9bmV3IEFycmF5KGMpO2ZvcihvPTA7bzxjOysrbyl7Zm9yKHZhciBsLGg9dVtvXSxkPXNbb109bmV3IEFycmF5KGYpLHA9MDtwPGY7KytwKWRbcF09bD1bMCwrcihpW3BdLGgscCxpKV0sbC5kYXRhPWlbcF07ZC5rZXk9aH1mb3Iobz0wLGE9bihzKTtvPGM7KytvKXNbYVtvXV0uaW5kZXg9bztyZXR1cm4gZShzLGEpLHN9cmV0dXJuIGkua2V5cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKGR5LmNhbGwobikpLGkpOnR9LGkudmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksaSk6cn0saS5vcmRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P2dfOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoZHkuY2FsbCh0KSksaSk6bn0saS5vZmZzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD92Xzp0LGkpOmV9LGl9LHQuc3RhY2tPZmZzZXRFeHBhbmQ9ZnVuY3Rpb24odCxuKXtpZigocj10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHIsaSxvPTAsYT10WzBdLmxlbmd0aDtvPGE7KytvKXtmb3IoaT1lPTA7ZTxyOysrZSlpKz10W2VdW29dWzFdfHwwO2lmKGkpZm9yKGU9MDtlPHI7KytlKXRbZV1bb11bMV0vPWl9dl8odCxuKX19LHQuc3RhY2tPZmZzZXREaXZlcmdpbmc9ZnVuY3Rpb24odCxuKXtpZigodT10Lmxlbmd0aCk+MSlmb3IodmFyIGUscixpLG8sYSx1LGY9MCxjPXRbblswXV0ubGVuZ3RoO2Y8YzsrK2YpZm9yKG89YT0wLGU9MDtlPHU7KytlKShpPShyPXRbbltlXV1bZl0pWzFdLXJbMF0pPj0wPyhyWzBdPW8sclsxXT1vKz1pKTppPDA/KHJbMV09YSxyWzBdPWErPWkpOnJbMF09b30sdC5zdGFja09mZnNldE5vbmU9dl8sdC5zdGFja09mZnNldFNpbGhvdWV0dGU9ZnVuY3Rpb24odCxuKXtpZigoZT10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHI9MCxpPXRbblswXV0sbz1pLmxlbmd0aDtyPG87KytyKXtmb3IodmFyIGE9MCx1PTA7YTxlOysrYSl1Kz10W2FdW3JdWzFdfHwwO2lbcl1bMV0rPWlbcl1bMF09LXUvMn12Xyh0LG4pfX0sdC5zdGFja09mZnNldFdpZ2dsZT1mdW5jdGlvbih0LG4pe2lmKChpPXQubGVuZ3RoKT4wJiYocj0oZT10W25bMF1dKS5sZW5ndGgpPjApe2Zvcih2YXIgZSxyLGksbz0wLGE9MTthPHI7KythKXtmb3IodmFyIHU9MCxmPTAsYz0wO3U8aTsrK3Upe2Zvcih2YXIgcz10W25bdV1dLGw9c1thXVsxXXx8MCxoPShsLShzW2EtMV1bMV18fDApKS8yLGQ9MDtkPHU7KytkKXt2YXIgcD10W25bZF1dO2grPShwW2FdWzFdfHwwKS0ocFthLTFdWzFdfHwwKX1mKz1sLGMrPWgqbH1lW2EtMV1bMV0rPWVbYS0xXVswXT1vLGYmJihvLT1jL2YpfWVbYS0xXVsxXSs9ZVthLTFdWzBdPW8sdl8odCxuKX19LHQuc3RhY2tPcmRlckFzY2VuZGluZz1fXyx0LnN0YWNrT3JkZXJEZXNjZW5kaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBfXyh0KS5yZXZlcnNlKCl9LHQuc3RhY2tPcmRlckluc2lkZU91dD1mdW5jdGlvbih0KXt2YXIgbixlLHI9dC5sZW5ndGgsaT10Lm1hcChiXyksbz1nXyh0KS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGlbbl0taVt0XX0pLGE9MCx1PTAsZj1bXSxjPVtdO2ZvcihuPTA7bjxyOysrbillPW9bbl0sYTx1PyhhKz1pW2VdLGYucHVzaChlKSk6KHUrPWlbZV0sYy5wdXNoKGUpKTtyZXR1cm4gYy5yZXZlcnNlKCkuY29uY2F0KGYpfSx0LnN0YWNrT3JkZXJOb25lPWdfLHQuc3RhY2tPcmRlclJldmVyc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGdfKHQpLnJldmVyc2UoKX0sdC50aW1lSW50ZXJ2YWw9UmgsdC50aW1lTWlsbGlzZWNvbmQ9TGgsdC50aW1lTWlsbGlzZWNvbmRzPURoLHQudXRjTWlsbGlzZWNvbmQ9TGgsdC51dGNNaWxsaXNlY29uZHM9RGgsdC50aW1lU2Vjb25kPU9oLHQudGltZVNlY29uZHM9WWgsdC51dGNTZWNvbmQ9T2gsdC51dGNTZWNvbmRzPVloLHQudGltZU1pbnV0ZT1CaCx0LnRpbWVNaW51dGVzPUZoLHQudGltZUhvdXI9SWgsdC50aW1lSG91cnM9SGgsdC50aW1lRGF5PWpoLHQudGltZURheXM9WGgsdC50aW1lV2Vlaz1WaCx0LnRpbWVXZWVrcz10ZCx0LnRpbWVTdW5kYXk9VmgsdC50aW1lU3VuZGF5cz10ZCx0LnRpbWVNb25kYXk9JGgsdC50aW1lTW9uZGF5cz1uZCx0LnRpbWVUdWVzZGF5PVdoLHQudGltZVR1ZXNkYXlzPWVkLHQudGltZVdlZG5lc2RheT1aaCx0LnRpbWVXZWRuZXNkYXlzPXJkLHQudGltZVRodXJzZGF5PVFoLHQudGltZVRodXJzZGF5cz1pZCx0LnRpbWVGcmlkYXk9SmgsdC50aW1lRnJpZGF5cz1vZCx0LnRpbWVTYXR1cmRheT1LaCx0LnRpbWVTYXR1cmRheXM9YWQsdC50aW1lTW9udGg9dWQsdC50aW1lTW9udGhzPWZkLHQudGltZVllYXI9Y2QsdC50aW1lWWVhcnM9c2QsdC51dGNNaW51dGU9bGQsdC51dGNNaW51dGVzPWhkLHQudXRjSG91cj1kZCx0LnV0Y0hvdXJzPXBkLHQudXRjRGF5PXZkLHQudXRjRGF5cz1nZCx0LnV0Y1dlZWs9X2QsdC51dGNXZWVrcz1UZCx0LnV0Y1N1bmRheT1fZCx0LnV0Y1N1bmRheXM9VGQsdC51dGNNb25kYXk9YmQsdC51dGNNb25kYXlzPU5kLHQudXRjVHVlc2RheT1tZCx0LnV0Y1R1ZXNkYXlzPVNkLHQudXRjV2VkbmVzZGF5PXhkLHQudXRjV2VkbmVzZGF5cz1FZCx0LnV0Y1RodXJzZGF5PXdkLHQudXRjVGh1cnNkYXlzPWtkLHQudXRjRnJpZGF5PU1kLHQudXRjRnJpZGF5cz1DZCx0LnV0Y1NhdHVyZGF5PUFkLHQudXRjU2F0dXJkYXlzPVBkLHQudXRjTW9udGg9emQsdC51dGNNb250aHM9UmQsdC51dGNZZWFyPUxkLHQudXRjWWVhcnM9RGQsdC50aW1lRm9ybWF0RGVmYXVsdExvY2FsZT1RcCx0LnRpbWVGb3JtYXRMb2NhbGU9WWQsdC5pc29Gb3JtYXQ9SnAsdC5pc29QYXJzZT1LcCx0Lm5vdz1pcix0LnRpbWVyPXVyLHQudGltZXJGbHVzaD1mcix0LnRpbWVvdXQ9aHIsdC5pbnRlcnZhbD1mdW5jdGlvbih0LG4sZSl7dmFyIHI9bmV3IGFyLGk9bjtyZXR1cm4gbnVsbD09bj8oci5yZXN0YXJ0KHQsbixlKSxyKToobj0rbixlPW51bGw9PWU/aXIoKTorZSxyLnJlc3RhcnQoZnVuY3Rpb24gbyhhKXthKz1pLHIucmVzdGFydChvLGkrPW4sZSksdChhKX0sbixlKSxyKX0sdC50cmFuc2l0aW9uPXpyLHQuYWN0aXZlPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXQuX190cmFuc2l0aW9uO2lmKGkpZm9yKHIgaW4gbj1udWxsPT1uP251bGw6bisiIixpKWlmKChlPWlbcl0pLnN0YXRlPmdyJiZlLm5hbWU9PT1uKXJldHVybiBuZXcgUHIoW1t0XV0sbGksbiwrcik7cmV0dXJuIG51bGx9LHQuaW50ZXJydXB0PU5yLHQudm9yb25vaT1mdW5jdGlvbigpe3ZhciB0PXhfLG49d18sZT1udWxsO2Z1bmN0aW9uIHIocil7cmV0dXJuIG5ldyBlYihyLm1hcChmdW5jdGlvbihlLGkpe3ZhciBvPVtNYXRoLnJvdW5kKHQoZSxpLHIpL0tfKSpLXyxNYXRoLnJvdW5kKG4oZSxpLHIpL0tfKSpLX107cmV0dXJuIG8uaW5kZXg9aSxvLmRhdGE9ZSxvfSksZSl9cmV0dXJuIHIucG9seWdvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCkucG9seWdvbnMoKX0sci5saW5rcz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KS5saW5rcygpfSxyLnRyaWFuZ2xlcz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KS50cmlhbmdsZXMoKX0sci54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246bV8oK24pLHIpOnR9LHIueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Om1fKCt0KSxyKTpufSxyLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6W1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0scik6ZSYmW1tlWzBdWzBdLGVbMF1bMV1dLFtlWzFdWzBdLGVbMV1bMV1dXX0sci5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/bnVsbDpbWzAsMF0sWyt0WzBdLCt0WzFdXV0scik6ZSYmW2VbMV1bMF0tZVswXVswXSxlWzFdWzFdLWVbMF1bMV1dfSxyfSx0Lnpvb209ZnVuY3Rpb24oKXt2YXIgbixlLHI9c2IsaT1sYixvPXZiLGE9ZGIsdT1wYixmPVswLDEvMF0sYz1bWy0xLzAsLTEvMF0sWzEvMCwxLzBdXSxzPTI1MCxsPXFlLGg9W10sZD1JKCJzdGFydCIsInpvb20iLCJlbmQiKSxwPTUwMCx2PTE1MCxnPTA7ZnVuY3Rpb24geSh0KXt0LnByb3BlcnR5KCJfX3pvb20iLGhiKS5vbigid2hlZWwuem9vbSIsQSkub24oIm1vdXNlZG93bi56b29tIixUKS5vbigiZGJsY2xpY2suem9vbSIsTikuZmlsdGVyKHUpLm9uKCJ0b3VjaHN0YXJ0Lnpvb20iLFMpLm9uKCJ0b3VjaG1vdmUuem9vbSIsRSkub24oInRvdWNoZW5kLnpvb20gdG91Y2hjYW5jZWwuem9vbSIsaykuc3R5bGUoInRvdWNoLWFjdGlvbiIsIm5vbmUiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpfWZ1bmN0aW9uIF8odCxuKXtyZXR1cm4obj1NYXRoLm1heChmWzBdLE1hdGgubWluKGZbMV0sbikpKT09PXQuaz90Om5ldyBvYihuLHQueCx0LnkpfWZ1bmN0aW9uIGIodCxuLGUpe3ZhciByPW5bMF0tZVswXSp0LmssaT1uWzFdLWVbMV0qdC5rO3JldHVybiByPT09dC54JiZpPT09dC55P3Q6bmV3IG9iKHQuayxyLGkpfWZ1bmN0aW9uIG0odCl7cmV0dXJuWygrdFswXVswXSsgK3RbMV1bMF0pLzIsKCt0WzBdWzFdKyArdFsxXVsxXSkvMl19ZnVuY3Rpb24geCh0LG4sZSl7dC5vbigic3RhcnQuem9vbSIsZnVuY3Rpb24oKXt3KHRoaXMsYXJndW1lbnRzKS5zdGFydCgpfSkub24oImludGVycnVwdC56b29tIGVuZC56b29tIixmdW5jdGlvbigpe3codGhpcyxhcmd1bWVudHMpLmVuZCgpfSkudHdlZW4oInpvb20iLGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLHI9dyh0aGlzLHQpLG89aS5hcHBseSh0aGlzLHQpLGE9ZXx8bShvKSx1PU1hdGgubWF4KG9bMV1bMF0tb1swXVswXSxvWzFdWzFdLW9bMF1bMV0pLGY9dGhpcy5fX3pvb20sYz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsdCk6bixzPWwoZi5pbnZlcnQoYSkuY29uY2F0KHUvZi5rKSxjLmludmVydChhKS5jb25jYXQodS9jLmspKTtyZXR1cm4gZnVuY3Rpb24odCl7aWYoMT09PXQpdD1jO2Vsc2V7dmFyIG49cyh0KSxlPXUvblsyXTt0PW5ldyBvYihlLGFbMF0tblswXSplLGFbMV0tblsxXSplKX1yLnpvb20obnVsbCx0KX19KX1mdW5jdGlvbiB3KHQsbil7Zm9yKHZhciBlLHI9MCxpPWgubGVuZ3RoO3I8aTsrK3IpaWYoKGU9aFtyXSkudGhhdD09PXQpcmV0dXJuIGU7cmV0dXJuIG5ldyBNKHQsbil9ZnVuY3Rpb24gTSh0LG4pe3RoaXMudGhhdD10LHRoaXMuYXJncz1uLHRoaXMuaW5kZXg9LTEsdGhpcy5hY3RpdmU9MCx0aGlzLmV4dGVudD1pLmFwcGx5KHQsbil9ZnVuY3Rpb24gQSgpe2lmKHIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdD13KHRoaXMsYXJndW1lbnRzKSxuPXRoaXMuX196b29tLGU9TWF0aC5tYXgoZlswXSxNYXRoLm1pbihmWzFdLG4uaypNYXRoLnBvdygyLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpKSkpLGk9RnQodGhpcyk7aWYodC53aGVlbCl0Lm1vdXNlWzBdWzBdPT09aVswXSYmdC5tb3VzZVswXVsxXT09PWlbMV18fCh0Lm1vdXNlWzFdPW4uaW52ZXJ0KHQubW91c2VbMF09aSkpLGNsZWFyVGltZW91dCh0LndoZWVsKTtlbHNle2lmKG4uaz09PWUpcmV0dXJuO3QubW91c2U9W2ksbi5pbnZlcnQoaSldLE5yKHRoaXMpLHQuc3RhcnQoKX1jYigpLHQud2hlZWw9c2V0VGltZW91dChmdW5jdGlvbigpe3Qud2hlZWw9bnVsbCx0LmVuZCgpfSx2KSx0Lnpvb20oIm1vdXNlIixvKGIoXyhuLGUpLHQubW91c2VbMF0sdC5tb3VzZVsxXSksdC5leHRlbnQsYykpfX1mdW5jdGlvbiBUKCl7aWYoIWUmJnIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj13KHRoaXMsYXJndW1lbnRzKSxpPUR0KHQuZXZlbnQudmlldykub24oIm1vdXNlbW92ZS56b29tIixmdW5jdGlvbigpe2lmKGNiKCksIW4ubW92ZWQpe3ZhciBlPXQuZXZlbnQuY2xpZW50WC11LHI9dC5ldmVudC5jbGllbnRZLWY7bi5tb3ZlZD1lKmUrcipyPmd9bi56b29tKCJtb3VzZSIsbyhiKG4udGhhdC5fX3pvb20sbi5tb3VzZVswXT1GdChuLnRoYXQpLG4ubW91c2VbMV0pLG4uZXh0ZW50LGMpKX0sITApLm9uKCJtb3VzZXVwLnpvb20iLGZ1bmN0aW9uKCl7aS5vbigibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tIixudWxsKSxHdCh0LmV2ZW50LnZpZXcsbi5tb3ZlZCksY2IoKSxuLmVuZCgpfSwhMCksYT1GdCh0aGlzKSx1PXQuZXZlbnQuY2xpZW50WCxmPXQuZXZlbnQuY2xpZW50WTtYdCh0LmV2ZW50LnZpZXcpLGZiKCksbi5tb3VzZT1bYSx0aGlzLl9fem9vbS5pbnZlcnQoYSldLE5yKHRoaXMpLG4uc3RhcnQoKX19ZnVuY3Rpb24gTigpe2lmKHIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj10aGlzLl9fem9vbSxlPUZ0KHRoaXMpLGE9bi5pbnZlcnQoZSksdT1uLmsqKHQuZXZlbnQuc2hpZnRLZXk/LjU6MiksZj1vKGIoXyhuLHUpLGUsYSksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYyk7Y2IoKSxzPjA/RHQodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKHMpLmNhbGwoeCxmLGUpOkR0KHRoaXMpLmNhbGwoeS50cmFuc2Zvcm0sZil9fWZ1bmN0aW9uIFMoKXtpZihyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIGUsaSxvLGEsdT13KHRoaXMsYXJndW1lbnRzKSxmPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsYz1mLmxlbmd0aDtmb3IoZmIoKSxpPTA7aTxjOysraSlhPVthPUl0KHRoaXMsZiwobz1mW2ldKS5pZGVudGlmaWVyKSx0aGlzLl9fem9vbS5pbnZlcnQoYSksby5pZGVudGlmaWVyXSx1LnRvdWNoMD91LnRvdWNoMXx8KHUudG91Y2gxPWEpOih1LnRvdWNoMD1hLGU9ITApO2lmKG4mJihuPWNsZWFyVGltZW91dChuKSwhdS50b3VjaDEpKXJldHVybiB1LmVuZCgpLHZvaWQoKGE9RHQodGhpcykub24oImRibGNsaWNrLnpvb20iKSkmJmEuYXBwbHkodGhpcyxhcmd1bWVudHMpKTtlJiYobj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bj1udWxsfSxwKSxOcih0aGlzKSx1LnN0YXJ0KCkpfX1mdW5jdGlvbiBFKCl7dmFyIGUscixpLGEsdT13KHRoaXMsYXJndW1lbnRzKSxmPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMscz1mLmxlbmd0aDtmb3IoY2IoKSxuJiYobj1jbGVhclRpbWVvdXQobikpLGU9MDtlPHM7KytlKWk9SXQodGhpcyxmLChyPWZbZV0pLmlkZW50aWZpZXIpLHUudG91Y2gwJiZ1LnRvdWNoMFsyXT09PXIuaWRlbnRpZmllcj91LnRvdWNoMFswXT1pOnUudG91Y2gxJiZ1LnRvdWNoMVsyXT09PXIuaWRlbnRpZmllciYmKHUudG91Y2gxWzBdPWkpO2lmKHI9dS50aGF0Ll9fem9vbSx1LnRvdWNoMSl7dmFyIGw9dS50b3VjaDBbMF0saD11LnRvdWNoMFsxXSxkPXUudG91Y2gxWzBdLHA9dS50b3VjaDFbMV0sdj0odj1kWzBdLWxbMF0pKnYrKHY9ZFsxXS1sWzFdKSp2LGc9KGc9cFswXS1oWzBdKSpnKyhnPXBbMV0taFsxXSkqZztyPV8ocixNYXRoLnNxcnQodi9nKSksaT1bKGxbMF0rZFswXSkvMiwobFsxXStkWzFdKS8yXSxhPVsoaFswXStwWzBdKS8yLChoWzFdK3BbMV0pLzJdfWVsc2V7aWYoIXUudG91Y2gwKXJldHVybjtpPXUudG91Y2gwWzBdLGE9dS50b3VjaDBbMV19dS56b29tKCJ0b3VjaCIsbyhiKHIsaSxhKSx1LmV4dGVudCxjKSl9ZnVuY3Rpb24gaygpe3ZhciBuLHIsaT13KHRoaXMsYXJndW1lbnRzKSxvPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsYT1vLmxlbmd0aDtmb3IoZmIoKSxlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZT1udWxsfSxwKSxuPTA7bjxhOysrbilyPW9bbl0saS50b3VjaDAmJmkudG91Y2gwWzJdPT09ci5pZGVudGlmaWVyP2RlbGV0ZSBpLnRvdWNoMDppLnRvdWNoMSYmaS50b3VjaDFbMl09PT1yLmlkZW50aWZpZXImJmRlbGV0ZSBpLnRvdWNoMTtpLnRvdWNoMSYmIWkudG91Y2gwJiYoaS50b3VjaDA9aS50b3VjaDEsZGVsZXRlIGkudG91Y2gxKSxpLnRvdWNoMD9pLnRvdWNoMFsxXT10aGlzLl9fem9vbS5pbnZlcnQoaS50b3VjaDBbMF0pOmkuZW5kKCl9cmV0dXJuIHkudHJhbnNmb3JtPWZ1bmN0aW9uKHQsbil7dmFyIGU9dC5zZWxlY3Rpb24/dC5zZWxlY3Rpb24oKTp0O2UucHJvcGVydHkoIl9fem9vbSIsaGIpLHQhPT1lP3godCxuKTplLmludGVycnVwdCgpLmVhY2goZnVuY3Rpb24oKXt3KHRoaXMsYXJndW1lbnRzKS5zdGFydCgpLnpvb20obnVsbCwiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuKS5lbmQoKX0pfSx5LnNjYWxlQnk9ZnVuY3Rpb24odCxuKXt5LnNjYWxlVG8odCxmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fem9vbS5rKigiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuKX0pfSx5LnNjYWxlVG89ZnVuY3Rpb24odCxuKXt5LnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyksZT10aGlzLl9fem9vbSxyPW0odCksYT1lLmludmVydChyKSx1PSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm47cmV0dXJuIG8oYihfKGUsdSkscixhKSx0LGMpfSl9LHkudHJhbnNsYXRlQnk9ZnVuY3Rpb24odCxuLGUpe3kudHJhbnNmb3JtKHQsZnVuY3Rpb24oKXtyZXR1cm4gbyh0aGlzLl9fem9vbS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6biwiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplKSxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjKX0pfSx5LnRyYW5zbGF0ZVRvPWZ1bmN0aW9uKHQsbixlKXt5LnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cykscj10aGlzLl9fem9vbSxhPW0odCk7cmV0dXJuIG8oYWIudHJhbnNsYXRlKGFbMF0sYVsxXSkuc2NhbGUoci5rKS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIG4/LW4uYXBwbHkodGhpcyxhcmd1bWVudHMpOi1uLCJmdW5jdGlvbiI9PXR5cGVvZiBlPy1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTotZSksdCxjKX0pfSxNLnByb3RvdHlwZT17c3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gMT09Kyt0aGlzLmFjdGl2ZSYmKHRoaXMuaW5kZXg9aC5wdXNoKHRoaXMpLTEsdGhpcy5lbWl0KCJzdGFydCIpKSx0aGlzfSx6b29tOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMubW91c2UmJiJtb3VzZSIhPT10JiYodGhpcy5tb3VzZVsxXT1uLmludmVydCh0aGlzLm1vdXNlWzBdKSksdGhpcy50b3VjaDAmJiJ0b3VjaCIhPT10JiYodGhpcy50b3VjaDBbMV09bi5pbnZlcnQodGhpcy50b3VjaDBbMF0pKSx0aGlzLnRvdWNoMSYmInRvdWNoIiE9PXQmJih0aGlzLnRvdWNoMVsxXT1uLmludmVydCh0aGlzLnRvdWNoMVswXSkpLHRoaXMudGhhdC5fX3pvb209bix0aGlzLmVtaXQoInpvb20iKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09LS10aGlzLmFjdGl2ZSYmKGguc3BsaWNlKHRoaXMuaW5kZXgsMSksdGhpcy5pbmRleD0tMSx0aGlzLmVtaXQoImVuZCIpKSx0aGlzfSxlbWl0OmZ1bmN0aW9uKHQpe0N0KG5ldyBpYih5LHQsdGhpcy50aGF0Ll9fem9vbSksZC5hcHBseSxkLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LHkud2hlZWxEZWx0YT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnJiKCt0KSx5KTphfSx5LmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnJiKCEhdCkseSk6cn0seS50b3VjaGFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpyYighIXQpLHkpOnV9LHkuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6cmIoW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLHkpOml9LHkuc2NhbGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGZbMF09K3RbMF0sZlsxXT0rdFsxXSx5KTpbZlswXSxmWzFdXX0seS50cmFuc2xhdGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGNbMF1bMF09K3RbMF1bMF0sY1sxXVswXT0rdFsxXVswXSxjWzBdWzFdPSt0WzBdWzFdLGNbMV1bMV09K3RbMV1bMV0seSk6W1tjWzBdWzBdLGNbMF1bMV1dLFtjWzFdWzBdLGNbMV1bMV1dXX0seS5jb25zdHJhaW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89dCx5KTpvfSx5LmR1cmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0LHkpOnN9LHkuaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9dCx5KTpsfSx5Lm9uPWZ1bmN0aW9uKCl7dmFyIHQ9ZC5vbi5hcHBseShkLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1kP3k6dH0seS5jbGlja0Rpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPSh0PSt0KSp0LHkpOk1hdGguc3FydChnKX0seX0sdC56b29tVHJhbnNmb3JtPXViLHQuem9vbUlkZW50aXR5PWFiLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNvbG9yLXNjYWxlL3BhbGV0dGVzLmpzCnZhciBYbzsKKGZ1bmN0aW9uKGEpe2EucGFsZXR0ZXM9e2dvb2dsZVN0YW5kYXJkOiIjZGI0NDM3ICNmZjcwNDMgI2Y0YjQwMCAjMGY5ZDU4ICMwMDc5NmIgIzAwYWNjMSAjNDI4NWY0ICM1YzZiYzAgI2FiNDdiYyIuc3BsaXQoIiAiKSxnb29nbGVDb29sOiIjOWU5ZDI0ICMwZjlkNTggIzAwNzk2YiAjMDBhY2MxICM0Mjg1ZjQgIzVjNmJjMCAjNjA3ZDhiIi5zcGxpdCgiICIpLGdvb2dsZVdhcm06IiM3OTU1NDggI2FiNDdiYyAjZjA2MjkyICNjMjE4NWIgI2RiNDQzNyAjZmY3MDQzICNmNGI0MDAiLnNwbGl0KCIgIiksZ29vZ2xlQ29sb3JCbGluZEFzc2lzdDoiI2ZmNzA0MyAjMDBBQ0MxICNBQjQ3QkMgIzJBNTZDNiAjMGI4MDQzICNGN0NCNEQgI2MwY2EzMyAjNWUzNWIxICNBNTI3MTQiLnNwbGl0KCIgIiksdGVuc29yYm9hcmRDb2xvckJsaW5kQXNzaXN0OiIjZmY3MDQzICMwMDc3YmIgI2NjMzMxMSAjMzNiYmVlICNlZTMzNzcgIzAwOTk4OCAjYmJiYmJiIi5zcGxpdCgiICIpLGNvbG9yQmxpbmRBc3Npc3QxOiIjNDQ3N2FhICM0NGFhYWEgI2FhYWE0NCAjYWE3NzQ0ICNhYTQ0NTUgI2FhNDQ4OCIuc3BsaXQoIiAiKSxjb2xvckJsaW5kQXNzaXN0MjoiIzg4Y2NlZSAjNDRhYTk5ICMxMTc3MzMgIzk5OTkzMyAjZGRjYzc3ICNjYzY2NzcgIzg4MjI1NSAjYWE0NDk5Ii5zcGxpdCgiICIpLApjb2xvckJsaW5kQXNzaXN0MzoiIzMzMjI4OCAjNjY5OWNjICM4OGNjZWUgIzQ0YWE5OSAjMTE3NzMzICM5OTk5MzMgI2RkY2M3NyAjY2M2Njc3ICNhYTQ0NjYgIzg4MjI1NSAjNjYxMTAwICNhYTQ0OTkiLnNwbGl0KCIgIiksY29sb3JCbGluZEFzc2lzdDQ6IiM0NDc3YWEgIzY2Y2NlZSAjMjI4ODMzICNjY2JiNDQgI2VlNjY3NyAjYWEzMzc3ICNiYmJiYmIiLnNwbGl0KCIgIiksY29sb3JCbGluZEFzc2lzdDU6IiNGRjZEQjYgIzkyMDAwMCAjOTI0OTAwICNEQkQxMDAgIzI0RkYyNCAjMDA2RERCICM0OTAwOTIiLnNwbGl0KCIgIiksbWxkYXNoOiIjRTQ3RUFEICNGNDY0MEQgI0ZBQTMwMCAjRjVFNjM2ICMwMEEwNzcgIzAwNzdCOCAjMDBCN0VEIi5zcGxpdCgiICIpfTthLnN0YW5kYXJkPWEucGFsZXR0ZXMudGVuc29yYm9hcmRDb2xvckJsaW5kQXNzaXN0fSkoWG98fChYbz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNvbG9yLXNjYWxlL2NvbG9yU2NhbGUuanMKKGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoZixnKXtmdW5jdGlvbiBsKCl7ay5zZXREb21haW4oZygpKX1jb25zdCBrPW5ldyBkO2YuYWRkTGlzdGVuZXIobCk7bCgpO3JldHVybiBuPT5rLmdldENvbG9yKG4pfWNsYXNzIGR7Y29uc3RydWN0b3IoZj1hLnN0YW5kYXJkKXt0aGlzLnBhbGV0dGU9Zjt0aGlzLmlkZW50aWZpZXJzPWQzLm1hcCgpfXNldERvbWFpbihmKXt0aGlzLmlkZW50aWZpZXJzPWQzLm1hcCgpO2YuZm9yRWFjaCgoZyxsKT0+e3RoaXMuaWRlbnRpZmllcnMuc2V0KGcsdGhpcy5wYWxldHRlW2wldGhpcy5wYWxldHRlLmxlbmd0aF0pfSl9Z2V0Q29sb3IoZil7aWYoIXRoaXMuaWRlbnRpZmllcnMuaGFzKGYpKXRocm93IEVycm9yKGBTdHJpbmcgJHtmfSB3YXMgbm90IGluIHRoZSBkb21haW4uYCk7cmV0dXJuIHRoaXMuaWRlbnRpZmllcnMuZ2V0KGYpfX1hLkNvbG9yU2NhbGU9ZDthLnJ1bnNDb2xvclNjYWxlPWMoUW8ucnVuc1N0b3JlLCgpPT5Rby5ydW5zU3RvcmUuZ2V0UnVucygpKTsKYS5leHBlcmltZW50c0NvbG9yU2NhbGU9YyhRby5leHBlcmltZW50c1N0b3JlLCgpPT5Rby5leHBlcmltZW50c1N0b3JlLmdldEV4cGVyaW1lbnRzKCkubWFwKCh7bmFtZTpmfSk9PmYpKX0pKFhvfHwoWG89e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1pY29uLWJ1dHRvbi9wYXBlci1pY29uLWJ1dHRvbi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1pY29uLWJ1dHRvbiIsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImJ1dHRvbiIsdGFiaW5kZXg6IjAifSxiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvcl0scHJvcGVydGllczp7c3JjOnt0eXBlOlN0cmluZ30saWNvbjp7dHlwZTpTdHJpbmd9LGFsdDp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9hbHRDaGFuZ2VkIn19LF9hbHRDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9dGhpcy5nZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiKTtkJiZjIT1kfHx0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsYSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1tdWx0aS1jaGVja2JveC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtbXVsdGktY2hlY2tib3giLHByb3BlcnRpZXM6e25hbWVzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sY29sb3Jpbmc6e3R5cGU6T2JqZWN0LHZhbHVlOntnZXRDb2xvcjooKT0+IiJ9fSxyZWdleDp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLHZhbHVlOiIifSxfcmVnZXg6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfbWFrZVJlZ2V4KHJlZ2V4KSJ9LG5hbWVzTWF0Y2hpbmdSZWdleDp7dHlwZTpBcnJheSxjb21wdXRlZDoiY29tcHV0ZU5hbWVzTWF0Y2hpbmdSZWdleChuYW1lcy4qLCBfcmVnZXgpIn0sc2VsZWN0aW9uU3RhdGU6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTooKT0+KHt9KX0sb3V0U2VsZWN0ZWQ6e3R5cGU6QXJyYXksbm90aWZ5OiEwLGNvbXB1dGVkOiJjb21wdXRlT3V0U2VsZWN0ZWQobmFtZXNNYXRjaGluZ1JlZ2V4LiosIHNlbGVjdGlvblN0YXRlLiopIn0sbWF4TmFtZXNUb0VuYWJsZUJ5RGVmYXVsdDp7dHlwZTpOdW1iZXIsCnZhbHVlOjQwfSxfZGVib3VuY2VkUmVnZXhDaGFuZ2U6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGE9Xy5kZWJvdW5jZShjPT57dGhpcy5yZWdleD1jfSwxNTAse2xlYWRpbmc6ITF9KTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYz10aGlzLiQkKCIjbmFtZXMtcmVnZXgiKS52YWx1ZTsiIj09Yz90aGlzLmFzeW5jKCgpPT57dGhpcy5yZWdleD1jfSwzMCk6YShjKX19fX0sb2JzZXJ2ZXJzOlsiX3NldElzb2xhdG9ySWNvbihzZWxlY3Rpb25TdGF0ZSwgbmFtZXMpIl0sX21ha2VSZWdleDpmdW5jdGlvbihhKXt0cnl7cmV0dXJuIG5ldyBSZWdFeHAoYSl9Y2F0Y2goYyl7cmV0dXJuIG51bGx9fSxfc2V0SXNvbGF0b3JJY29uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZWxlY3Rpb25TdGF0ZSxjPV8uZmlsdGVyKF8udmFsdWVzKGEpKS5sZW5ndGg7QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pc29sYXRvciIpKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2QuaWNvbj0KMT09PWMmJmFbZC5uYW1lXT8icmFkaW8tYnV0dG9uLWNoZWNrZWQiOiJyYWRpby1idXR0b24tdW5jaGVja2VkIn0pfSxjb21wdXRlTmFtZXNNYXRjaGluZ1JlZ2V4OmZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLl9yZWdleDtyZXR1cm4gYT90aGlzLm5hbWVzLmZpbHRlcihjPT5hLnRlc3QoYykpOnRoaXMubmFtZXN9LGNvbXB1dGVPdXRTZWxlY3RlZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2VsZWN0aW9uU3RhdGUsYz10aGlzLm5hbWVzTWF0Y2hpbmdSZWdleC5sZW5ndGg8PXRoaXMubWF4TmFtZXNUb0VuYWJsZUJ5RGVmYXVsdDtyZXR1cm4gdGhpcy5uYW1lc01hdGNoaW5nUmVnZXguZmlsdGVyKGQ9Pm51bGw9PWFbZF0/YzphW2RdKX0sc3luY2hyb25pemVDb2xvcnM6ZnVuY3Rpb24oKXt0aGlzLl9zZXRJc29sYXRvckljb24oKTt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgicGFwZXItY2hlY2tib3giKS5mb3JFYWNoKGE9Pntjb25zdCBjPXRoaXMuY29sb3JpbmcuZ2V0Q29sb3IoYS5uYW1lKTsKYS51cGRhdGVTdHlsZXMoeyItLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3IiOmMsIi0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3IiOmMsIi0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yIjpjLCItLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3IiOmN9KX0pO3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuaXNvbGF0b3IiKS5mb3JFYWNoKGE9Pntjb25zdCBjPXRoaXMuY29sb3JpbmcuZ2V0Q29sb3IoYS5uYW1lKTthLnN0eWxlLmNvbG9yPWN9KTt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy51cGRhdGVTdHlsZXMoKX0pfSxfaXNvbGF0ZU5hbWU6ZnVuY3Rpb24oYSl7dmFyIGM9UG9seW1lci5kb20oYSkubG9jYWxUYXJnZXQubmFtZSxkPXt9O3RoaXMubmFtZXMuZm9yRWFjaChmdW5jdGlvbihmKXtkW2ZdPWY9PWN9KTt0aGlzLnNlbGVjdGlvblN0YXRlPWR9LF9jaGVja2JveENoYW5nZTpmdW5jdGlvbihhKXthPQpQb2x5bWVyLmRvbShhKS5sb2NhbFRhcmdldDtjb25zdCBjPV8uY2xvbmUodGhpcy5zZWxlY3Rpb25TdGF0ZSk7Y1thLm5hbWVdPWEuY2hlY2tlZDt0aGlzLnNlbGVjdGlvblN0YXRlPWN9LF9pc0NoZWNrZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuLTEhPXRoaXMub3V0U2VsZWN0ZWQuaW5kZXhPZihhKX0sdG9nZ2xlQWxsOmZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLm5hbWVzTWF0Y2hpbmdSZWdleC5zb21lKGQ9PnRoaXMub3V0U2VsZWN0ZWQuaW5jbHVkZXMoZCkpLGM9e307dGhpcy5uYW1lcy5mb3JFYWNoKGQ9PntjW2RdPSFhfSk7dGhpcy5zZWxlY3Rpb25TdGF0ZT1jfX0pfSkoVW98fChVbz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXJ1bnMtc2VsZWN0b3IvdGYtd2JyLXN0cmluZy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi13YnItc3RyaW5nIixwcm9wZXJ0aWVzOnt2YWx1ZTpTdHJpbmcsX3BhcnRzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZVBhcnRzKHZhbHVlKSJ9fSxfY29tcHV0ZVBhcnRzKGEpe2NvbnN0IGM9W10sZD0vWy89XywtXS87Zm9yKG51bGw9PWEmJihhPSIiKTs7KXtjb25zdCBmPWEuc2VhcmNoKGQpO2lmKC0xPT09Zil7Yy5wdXNoKGEpO2JyZWFrfWVsc2UgYy5wdXNoKGEuc2xpY2UoMCxmKzEpKSxhPWEuc2xpY2UoZisxKX1yZXR1cm4gY319KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ydW5zLXNlbGVjdG9yL3RmLXJ1bnMtc2VsZWN0b3IuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtcnVucy1zZWxlY3RvciIscHJvcGVydGllczp7cnVuU2VsZWN0aW9uU3RhdGU6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfc3RvcmVSdW5TZWxlY3Rpb25TdGF0ZSIsdmFsdWU6VG8uZ2V0T2JqZWN0SW5pdGlhbGl6ZXIoInJ1blNlbGVjdGlvblN0YXRlIix7ZGVmYXVsdFZhbHVlOnt9fSl9LHJlZ2V4SW5wdXQ6e3R5cGU6U3RyaW5nLHZhbHVlOlRvLmdldFN0cmluZ0luaXRpYWxpemVyKCJyZWdleElucHV0Iix7ZGVmYXVsdFZhbHVlOiIifSksb2JzZXJ2ZXI6Il9yZWdleE9ic2VydmVyIn0sc2VsZWN0ZWRSdW5zOnt0eXBlOkFycmF5LG5vdGlmeTohMH0scnVuczpBcnJheSxkYXRhTG9jYXRpb246e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2NsaXBwZWREYXRhTG9jYXRpb246e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0Q2xpcHBlZERhdGFMb2NhdGlvbihkYXRhTG9jYXRpb24sIF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoKSJ9LF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoOnt0eXBlOk51bWJlciwKdmFsdWU6MjUwLHJlYWRPbmx5OiEwfSxjb2xvcmluZzp7dHlwZTpPYmplY3QsdmFsdWU6e2dldENvbG9yOlhvLnJ1bnNDb2xvclNjYWxlfX19LGF0dGFjaGVkKCl7dGhpcy5fcnVuU3RvcmVMaXN0ZW5lcj1Rby5ydW5zU3RvcmUuYWRkTGlzdGVuZXIoKCk9Pnt0aGlzLnNldCgicnVucyIsUW8ucnVuc1N0b3JlLmdldFJ1bnMoKSl9KTt0aGlzLnNldCgicnVucyIsUW8ucnVuc1N0b3JlLmdldFJ1bnMoKSk7dGhpcy5fZW52U3RvcmVMaXN0ZW5lcj1Rby5lbnZpcm9ubWVudFN0b3JlLmFkZExpc3RlbmVyKCgpPT57dGhpcy5zZXQoImRhdGFMb2NhdGlvbiIsUW8uZW52aXJvbm1lbnRTdG9yZS5nZXREYXRhTG9jYXRpb24oKSl9KTt0aGlzLnNldCgiZGF0YUxvY2F0aW9uIixRby5lbnZpcm9ubWVudFN0b3JlLmdldERhdGFMb2NhdGlvbigpKX0sZGV0YWNoZWQoKXtRby5ydW5zU3RvcmUucmVtb3ZlTGlzdGVuZXJCeUtleSh0aGlzLl9ydW5TdG9yZUxpc3RlbmVyKTtRby5lbnZpcm9ubWVudFN0b3JlLnJlbW92ZUxpc3RlbmVyQnlLZXkodGhpcy5fZW52U3RvcmVMaXN0ZW5lcil9LApfdG9nZ2xlQWxsOmZ1bmN0aW9uKCl7dGhpcy4kLm11bHRpQ2hlY2tib3gudG9nZ2xlQWxsKCl9LF9nZXRDbGlwcGVkRGF0YUxvY2F0aW9uOmZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwIT09YSYmIShhLmxlbmd0aD5jKSlyZXR1cm4gYX0sX29wZW5EYXRhTG9jYXRpb25EaWFsb2c6ZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuJCQoIiNkYXRhLWxvY2F0aW9uLWRpYWxvZyIpLm9wZW4oKX0sX3Nob3VsZFNob3dFeHBhbmREYXRhTG9jYXRpb25CdXR0b24oYSxjKXtyZXR1cm4gYSYmYS5sZW5ndGg+Y30sX3N0b3JlUnVuU2VsZWN0aW9uU3RhdGU6VG8uZ2V0T2JqZWN0T2JzZXJ2ZXIoInJ1blNlbGVjdGlvblN0YXRlIix7ZGVmYXVsdFZhbHVlOnt9fSksX3JlZ2V4T2JzZXJ2ZXI6VG8uZ2V0U3RyaW5nT2JzZXJ2ZXIoInJlZ2V4SW5wdXQiLHtkZWZhdWx0VmFsdWU6IiJ9KX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRlbnNvcmJvYXJkL3JlZ2lzdHJ5LmpzCnZhciBZbzsKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXtjLk5PVF9MT0FERUQ9Ik5PVF9MT0FERUQiO2MuTE9BREVEPSJMT0FERUQiO2MuRkFJTEVEPSJGQUlMRUQifSkoYS5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlfHwoYS5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlPXt9KSk7YS5kYXNoYm9hcmRSZWdpc3RyeT17fTthLnJlZ2lzdGVyRGFzaGJvYXJkPWZ1bmN0aW9uKGMpe2lmKCFjLnBsdWdpbil0aHJvdyBFcnJvcigiRGFzaGJvYXJkLnBsdWdpbiBtdXN0IGJlIHByZXNlbnQiKTtpZighYy5lbGVtZW50TmFtZSl0aHJvdyBFcnJvcigiRGFzaGJvYXJkLmVsZW1lbnROYW1lIG11c3QgYmUgcHJlc2VudCIpO2lmKGMucGx1Z2luIGluIGEuZGFzaGJvYXJkUmVnaXN0cnkpdGhyb3cgRXJyb3IoYFBsdWdpbiBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7Yy5wbHVnaW59YCk7Yy50YWJOYW1lfHwoYy50YWJOYW1lPWMucGx1Z2luKTthLmRhc2hib2FyZFJlZ2lzdHJ5W2MucGx1Z2luXT1jfX0pKFlvfHwoWW89Cnt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtdXRpbHMvdXRpbHMuanMKdmFyIFpvOwooZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhkLGYsZyl7cmV0dXJuIDE9PT1kP2Y6Z31hLmFnZ3JlZ2F0ZVRhZ0luZm89ZnVuY3Rpb24oZCxmKXtsZXQgZz12b2lkIDA7Y29uc3QgbD17fTtPYmplY3Qua2V5cyhkKS5mb3JFYWNoKG49Pntjb25zdCBwPWRbbl07dm9pZCAwPT09ZyYmKGc9cC5kaXNwbGF5TmFtZSk7ZyE9PXAuZGlzcGxheU5hbWUmJihnPW51bGwpO3ZvaWQgMD09PWxbcC5kZXNjcmlwdGlvbl0mJihsW3AuZGVzY3JpcHRpb25dPVtdKTtsW3AuZGVzY3JpcHRpb25dLnB1c2gobil9KTtmPW51bGwhPWc/ZzpmO2NvbnN0IGs9KCgpPT57Y29uc3Qgbj1PYmplY3Qua2V5cyhsKTtyZXR1cm4gMD09PW4ubGVuZ3RoPyIiOjE9PT1uLmxlbmd0aD9uWzBdOmAkeyJceDNjcFx4M2VceDNjc3Ryb25nXHgzZU11bHRpcGxlIGRlc2NyaXB0aW9uczpceDNjL3N0cm9uZ1x4M2VceDNjL3BceDNlIn08dWw+JHtuLm1hcChwPT57Y29uc3QgcT1sW3BdLm1hcCh0PT5gPGNvZGU+JHt0LnJlcGxhY2UoLzwvZywiXHgyNmx0OyIpLnJlcGxhY2UoLz4vZywKIlx4MjZndDsiKS5yZXBsYWNlKC8mL2csIlx4MjZhbXA7Iil9PC9jb2RlPmApLHI9MjxxLmxlbmd0aD9xLnNsaWNlKDAscS5sZW5ndGgtMSkuam9pbigiLCAiKSsiLCBhbmQgIitxW3EubGVuZ3RoLTFdOnEuam9pbigiIGFuZCAiKTtyZXR1cm5gPGxpPjxwPkZvciAke2MocS5sZW5ndGgsInJ1biIsInJ1bnMiKX0gJHtyfTo8L3A+JHtwfTwvbGk+YH0pLmpvaW4oIiIpfTwvdWw+YH0pKCk7cmV0dXJue2Rpc3BsYXlOYW1lOmYsZGVzY3JpcHRpb246a319fSkoWm98fChabz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXNwaW5uZXIvcGFwZXItc3Bpbm5lci1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJTcGlubmVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxvYnNlcnZlcjoiX19hY3RpdmVDaGFuZ2VkIn0sYWx0Ont0eXBlOlN0cmluZyx2YWx1ZToibG9hZGluZyIsb2JzZXJ2ZXI6Il9fYWx0Q2hhbmdlZCJ9LF9fY29vbGluZ0Rvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LF9fY29tcHV0ZUNvbnRhaW5lckNsYXNzZXM6ZnVuY3Rpb24oYSxjKXtyZXR1cm5bYXx8Yz8iYWN0aXZlIjoiIixjPyJjb29sZG93biI6IiJdLmpvaW4oIiAiKX0sX19hY3RpdmVDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7dGhpcy5fX3NldEFyaWFIaWRkZW4oIWEpO3RoaXMuX19jb29saW5nRG93bj0hYSYmY30sX19hbHRDaGFuZ2VkOmZ1bmN0aW9uKGEpeyJsb2FkaW5nIj09PWE/dGhpcy5hbHQ9dGhpcy5nZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiKXx8YToodGhpcy5fX3NldEFyaWFIaWRkZW4oIiI9PT0KYSksdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLGEpKX0sX19zZXRBcmlhSGlkZGVuOmZ1bmN0aW9uKGEpe2E/dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpfSxfX3Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5fX2Nvb2xpbmdEb3duPXRoaXMuYWN0aXZlPSExfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItc3Bpbm5lci9wYXBlci1zcGlubmVyLWxpdGUuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItc3Bpbm5lci1saXRlIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJTcGlubmVyQmVoYXZpb3JdfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi9kYXRhLWxvYWRlci1iZWhhdmlvci5qcwooZnVuY3Rpb24oYSl7bGV0IGM7KGZ1bmN0aW9uKGQpe2RbZC5MT0FESU5HPTBdPSJMT0FESU5HIjtkW2QuTE9BREVEPTFdPSJMT0FERUQifSkoY3x8KGM9e30pKTthLkRhdGFMb2FkZXJCZWhhdmlvcj17cHJvcGVydGllczp7YWN0aXZlOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9sb2FkRGF0YUlmQWN0aXZlIn0sbG9hZEtleTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LGRhdGFUb0xvYWQ6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxnZXREYXRhTG9hZE5hbWU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9PmQ9PlN0cmluZyhkKX0sbG9hZERhdGFDYWxsYmFjazpGdW5jdGlvbixyZXF1ZXN0RGF0YTp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBkPT50aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodGhpcy5nZXREYXRhTG9hZFVybChkKSl9fSxnZXREYXRhTG9hZFVybDpGdW5jdGlvbixkYXRhTG9hZGluZzp7dHlwZTpCb29sZWFuLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCwKdmFsdWU6ITF9LF9kYXRhTG9hZFN0YXRlOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IE1hcH0sX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBRby5DYW5jZWxsZXJ9LF9sb2FkRGF0YUFzeW5jOnt0eXBlOk51bWJlcix2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX2RhdGFUb0xvYWRDaGFuZ2VkKGlzQXR0YWNoZWQsIGRhdGFUb0xvYWQuKikiXSxvbkxvYWRGaW5pc2goKXt9LHJlbG9hZCgpe3RoaXMuX2RhdGFMb2FkU3RhdGUuY2xlYXIoKTt0aGlzLl9sb2FkRGF0YSgpfSxyZXNldCgpe251bGwhPXRoaXMuX2xvYWREYXRhQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2xvYWREYXRhQXN5bmMpLHRoaXMuX2xvYWREYXRhQXN5bmM9bnVsbCk7dGhpcy5fY2FuY2VsbGVyJiZ0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7dGhpcy5fZGF0YUxvYWRTdGF0ZSYmdGhpcy5fZGF0YUxvYWRTdGF0ZS5jbGVhcigpO3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbG9hZERhdGEoKX0sCl9kYXRhVG9Mb2FkQ2hhbmdlZCgpe3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbG9hZERhdGEoKX0sY3JlYXRlZCgpe3RoaXMuX2xvYWREYXRhPV8udGhyb3R0bGUodGhpcy5fbG9hZERhdGFJbXBsLDEwMCx7bGVhZGluZzohMCx0cmFpbGluZzohMH0pfSxkZXRhY2hlZCgpe251bGwhPXRoaXMuX2xvYWREYXRhQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2xvYWREYXRhQXN5bmMpLHRoaXMuX2xvYWREYXRhQXN5bmM9bnVsbCl9LF9sb2FkRGF0YUlmQWN0aXZlKCl7dGhpcy5hY3RpdmUmJnRoaXMuX2xvYWREYXRhKCl9LF9sb2FkRGF0YUltcGwoKXt0aGlzLmFjdGl2ZSYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fbG9hZERhdGFBc3luYyksdGhpcy5fbG9hZERhdGFBc3luYz10aGlzLmFzeW5jKHRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShkPT57aWYoIWQuY2FuY2VsbGVkKXJldHVybiB0aGlzLl9zZXREYXRhTG9hZGluZyghMCksZD10aGlzLmRhdGFUb0xvYWQuZmlsdGVyKGY9Pgp7Zj10aGlzLmdldERhdGFMb2FkTmFtZShmKTtyZXR1cm4hdGhpcy5fZGF0YUxvYWRTdGF0ZS5oYXMoZil9KS5tYXAoZj0+e2NvbnN0IGc9dGhpcy5nZXREYXRhTG9hZE5hbWUoZik7dGhpcy5fZGF0YUxvYWRTdGF0ZS5zZXQoZyxjLkxPQURJTkcpO3JldHVybiB0aGlzLnJlcXVlc3REYXRhKGYpLnRoZW4odGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKGw9PntsLmNhbmNlbGxlZHx8KHRoaXMuX2RhdGFMb2FkU3RhdGUuc2V0KGcsYy5MT0FERUQpLHRoaXMubG9hZERhdGFDYWxsYmFjayh0aGlzLGYsbC52YWx1ZSkpO3JldHVybiBnfSkpfSksUHJvbWlzZS5hbGwoZCkudGhlbih0aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoZj0+e2lmKCFmLmNhbmNlbGxlZCl7Y29uc3QgZz1uZXcgU2V0KGYudmFsdWUpO2lmKHRoaXMuZGF0YVRvTG9hZC5zb21lKGw9PmcuaGFzKHRoaXMuZ2V0RGF0YUxvYWROYW1lKGwpKSkpdGhpcy5vbkxvYWRGaW5pc2goKX1BcnJheS5mcm9tKHRoaXMuX2RhdGFMb2FkU3RhdGUudmFsdWVzKCkpLnNvbWUoZz0+Cmc9PT1jLkxPQURJTkcpfHx0aGlzLl9zZXREYXRhTG9hZGluZyghMSl9KSwoKT0+e30pLnRoZW4odGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKCh7Y2FuY2VsbGVkOmZ9KT0+e2Z8fCh0aGlzLl9sb2FkRGF0YUFzeW5jPW51bGwpfSkpfSkpKX19fSkoVW98fChVbz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltcG9ydHMvcGxvdHRhYmxlLmpzCi8qCiBNSVQKIE1JVAogQGZpbGVvdmVydmlldyBJbXBsZW1lbnRzIHRoZSBTaWduYXR1cmUgQVBJIHRvIGhlbHAgaW4gY29tcGFyaW5nIHdoZW4gdHdvCiBQbG90dGFibGUgb2JqZWN0cyBoYXZlICJjaGFuZ2VkIi4KCiBNZW1vaXphdGlvbiBpbiBQbG90dGFibGUgaXMgY29tcGxpY2F0ZWQgYnkgbXV0YWJsZSBzY2FsZXMgYW5kIGRhdGFzZXRzLiBXZSBjYW5ub3Qgc2ltcGx5CiByZWZlcmVuY2UgY29tcGFyZSB0d28gZS5nLiBzY2FsZXMgc2luY2UgaXQgbWF5IGhhdmUgaW50ZXJuYWxseSBtdXRhdGVkLiBUbyByZXNvbHZlIHRoaXMsCiB3ZSB3cml0ZSBhIHJlY3Vyc2l2ZSBTaWduYXR1cmUgaW50ZXJmYWNlIHRoYXQgaG9sZHMgYW4gaW1tdXRhYmxlIHNuYXBzaG90IG9mIHdoYXRldmVyCiBzdGF0ZSB0aGUgc2NhbGUvZGF0YSB3YXMgaW4gYXQgdGhlIHRpbWUuIFRoZW4gb24gbWVtb2l6ZWQgZnVuY3Rpb24gaW52b2NhdGlvbiB3ZSBzaWduIHRoZQogbmV3IGlucHV0cyBhbmQgY29tcGFyZSB0aGUgc2lnbmF0dXJlcyB0byBkZWNpZGUgaWYgd2Ugc2hvdWxkIHJlY29tcHV0ZS4KCiBXZSBtdXN0IGhhbmQtd3JpdGUgYSBzaWduYXR1cmUgZm9yIGVhY2ggY3VzdG9tIGNsYXNzIHdlIHdpc2ggdG8gc3VwcG9ydC4KIE1JVAoKIEBmaWxlb3ZlcnZpZXcgbWFudWFsbHkgYWRkIGQzLXNlbGVjdGlvbi1tdWx0aSB0byBkMyBkZWZhdWx0IGJ1bmRsZS4gTW9zdCBvZiB0aGlzIGNvZGUgaXMKIGNvcGllZCBmcm9tIGQzLXNlbGVjdGlvbi1tdWx0aUAxLjAuMC4KIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZDMvZDMtc2VsZWN0aW9uLW11bHRpL2lzc3Vlcy8xMSBmb3Igd2h5IHdlIGhhdmUgdG8gZG8gdGhpcwogTUlUCiBAZmlsZW92ZXJ2aWV3IEltcGxlbWVudHMgYSBjb252ZW5pZW50IHRodW5rIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgY29tbW9uIGNhc2UKIG9mIGNyZWF0aW5nIGEgbWVtb2l6ZWQgZnVuY3Rpb24gdGhhdCB0YWtlcyBpdHMgaW5wdXRzIGZyb20gbXV0YWJsZSBjbGFzcyBwcm9wZXJ0aWVzLgogTUlUCiBAZmlsZW92ZXJ2aWV3IEltcGxlbWVudHMgYSBmdW5jdGlvbiBtZW1vaXplciB1c2luZyB0aGUgU2lnbmF0dXJlIEFQSS4KIFBsb3R0YWJsZSAzLjcuMCAoaHR0cHM6Ly9naXRodWIuY29tL3BhbGFudGlyL3Bsb3R0YWJsZSkKIENvcHlyaWdodCAyMDE0LTIwMTcgUGFsYW50aXIgVGVjaG5vbG9naWVzCiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS9wYWxhbnRpci9wbG90dGFibGUvYmxvYi9tYXN0ZXIvTElDRU5TRSkKIGlzLXBsYWluLW9iamVjdCA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvaXMtcGxhaW4tb2JqZWN0PgoKIENvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBKb24gU2NobGlua2VydC4KIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KIGlzb2JqZWN0IDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pc29iamVjdD4KCiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNywgSm9uIFNjaGxpbmtlcnQuCiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuCiovCihmdW5jdGlvbihhLGMpeyJvYmplY3QiPT09dHlwZW9mIGV4cG9ydHMmJiJvYmplY3QiPT09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1jKHJlcXVpcmUoImQzIikpOiJmdW5jdGlvbiI9PT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImQzIl0sYyk6Im9iamVjdCI9PT10eXBlb2YgZXhwb3J0cz9leHBvcnRzLlBsb3R0YWJsZT1jKHJlcXVpcmUoImQzIikpOmEuUGxvdHRhYmxlPWMoYS5kMyl9KSh0aGlzLGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihjKXtmdW5jdGlvbiBkKGcpe2lmKGZbZ10pcmV0dXJuIGZbZ10uZXhwb3J0czt2YXIgbD1mW2ddPXtpOmcsbDohMSxleHBvcnRzOnt9fTtjW2ddLmNhbGwobC5leHBvcnRzLGwsbC5leHBvcnRzLGQpO2wubD0hMDtyZXR1cm4gbC5leHBvcnRzfXZhciBmPXt9O2QubT1jO2QuYz1mO2QuaT1mdW5jdGlvbihnKXtyZXR1cm4gZ307ZC5kPWZ1bmN0aW9uKGcsbCxrKXtkLm8oZyxsKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGcsCmwse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLGdldDprfSl9O2Qubj1mdW5jdGlvbihnKXt2YXIgbD1nJiZnLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gZ1siZGVmYXVsdCJdfTpmdW5jdGlvbigpe3JldHVybiBnfTtkLmQobCwiYSIsbCk7cmV0dXJuIGx9O2Qubz1mdW5jdGlvbihnLGwpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZyxsKX07ZC5wPSIiO3JldHVybiBkKGQucz0xNDApfShbZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcobCl7Zm9yKHZhciBrIGluIGwpZC5oYXNPd25Qcm9wZXJ0eShrKXx8KGRba109bFtrXSl9Yz1mKDEwNyk7ZC5BcnJheT1jO2M9ZigxMTApO2QuQ29sb3I9YztjPWYoNTUpO2QuRE9NPWM7Yz1mKDU2KTtkLk1hdGg9YztjPWYoMTEzKTtkLk9iamVjdD1jO2M9Zig1Nyk7ZC5SVHJlZT1jO2M9ZigxMTUpO2QuU3RhY2tpbmc9YztjPWYoMzUpO2QuV2luZG93PWM7ZyhmKDEwOCkpO2coZigxMDkpKTtnKGYoMTIpKTsKZyhmKDExMSkpO2coZigxMTIpKTtnKGYoNTgpKTtnKGYoMTE2KSl9LGZ1bmN0aW9uKGMpe2MuZXhwb3J0cz1hfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhGLEQsQil7dmFyIEk9RC5hY2Nlc3NvcjtEPUQuc2NhbGU7aWYobnVsbD09RClyZXR1cm5bXTt2YXIgTz1GLmRhdGEoKTtudWxsIT1CJiYoTz1PLmZpbHRlcihmdW5jdGlvbihQLEgpe3JldHVybiBCKFAsSCxGKX0pKTtPPU8ubWFwKGZ1bmN0aW9uKFAsSCl7cmV0dXJuIEkoUCxILEYpfSk7cmV0dXJuIEQuZXh0ZW50T2ZWYWx1ZXMoTyl9dmFyIGw9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKEYsRCl7ZnVuY3Rpb24gQigpe3RoaXMuY29uc3RydWN0b3I9Rn1mb3IodmFyIEkgaW4gRClELmhhc093blByb3BlcnR5KEkpJiYoRltJXT1EW0ldKTtGLnByb3RvdHlwZT1udWxsPT09RD9PYmplY3QuY3JlYXRlKEQpOihCLnByb3RvdHlwZT1ELnByb3RvdHlwZSxuZXcgQil9LGs9ZigxKSxuPWYoNyk7Yz1mKDQpO3ZhciBwPQpmKDE4KSxxPWYoNikscj1mKDkpLHQ9ZigyMCksdj1mKDApLHk9ZigxMiksej1mKDEwKSx4PWYoNTEpLEM9Zig1Mik7ZC5SZW5kZXJlcj16Lm1ha2VFbnVtKFsic3ZnIiwiY2FudmFzIl0pO2Y9ZnVuY3Rpb24oRil7ZnVuY3Rpb24gRCgpe3ZhciBCPUYuY2FsbCh0aGlzKXx8dGhpcztCLl9kYXRhQ2hhbmdlZD0hMTtCLl9hdHRyRXh0ZW50cz17fTtCLl9hbmltYXRlPSExO0IuX2FuaW1hdG9ycz17fTtCLl9wcm9wZXJ0eUV4dGVudHM9e307Qi5fcmVzZXRFbnRpdHlTdG9yZT1mdW5jdGlvbigpe0IuX2NhY2hlZEVudGl0eVN0b3JlPXZvaWQgMH07Qi5fb3ZlcmZsb3dIaWRkZW49ITA7Qi5hZGRDbGFzcygicGxvdCIpO0IuX2RhdGFzZXRUb0RyYXdlcj1uZXcgdi5NYXA7Qi5fYXR0ckJpbmRpbmdzPWsubWFwKCk7Qi5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcj1mdW5jdGlvbihPLFApe3JldHVybiBCLl9pbmNsdWRlZFZhbHVlc0ZvclNjYWxlKE8sUCl9O0IuX3JlbmRlckNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIEIucmVuZGVyKCl9OwpCLl9vbkRhdGFzZXRVcGRhdGVDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBCLl9vbkRhdGFzZXRVcGRhdGUoKX07Qi5fcHJvcGVydHlCaW5kaW5ncz1rLm1hcCgpO3ZhciBJPShuZXcgbi5FYXNpbmcpLm1heFRvdGFsRHVyYXRpb24oRC5fQU5JTUFUSU9OX01BWF9EVVJBVElPTik7Qi5hbmltYXRvcih4LkFuaW1hdG9yLk1BSU4sSSk7Qi5hbmltYXRvcih4LkFuaW1hdG9yLlJFU0VULG5ldyBuLk51bGwpO0IuX2RlZmVycmVkUmVzZXRFbnRpdHlTdG9yZT12LldpbmRvdy5kZWJvdW5jZShDLkRlZmVycmVkUmVuZGVyZXIuREVGRVJSRURfUkVOREVSSU5HX0RFTEFZLEIuX3Jlc2V0RW50aXR5U3RvcmUpO3JldHVybiBCfWwoRCxGKTtELmdldFRvdGFsRHJhd1RpbWU9ZnVuY3Rpb24oQixJKXtyZXR1cm4gSS5yZWR1Y2UoZnVuY3Rpb24oTyxQKXtyZXR1cm4gTytQLmFuaW1hdG9yLnRvdGFsVGltZShCLmxlbmd0aCl9LDApfTtELmFwcGx5RHJhd1N0ZXBzPWZ1bmN0aW9uKEIsSSl7cmV0dXJuIEIubWFwKGZ1bmN0aW9uKE8pe3ZhciBQPQpPLmF0dHJUb1Byb2plY3RvcixIPXt9O09iamVjdC5rZXlzKFApLmZvckVhY2goZnVuY3Rpb24oSyl7SFtLXT1mdW5jdGlvbihNLEwpe3JldHVybiBQW0tdKE0sTCxJKX19KTtyZXR1cm57YXR0clRvQXBwbGllZFByb2plY3RvcjpILGFuaW1hdG9yOk8uYW5pbWF0b3J9fSl9O0QucHJvdG90eXBlLmFuY2hvcj1mdW5jdGlvbihCKXtCPXkuY29lcmNlRXh0ZXJuYWxEMyhCKTtGLnByb3RvdHlwZS5hbmNob3IuY2FsbCh0aGlzLEIpO3RoaXMuX2RhdGFDaGFuZ2VkPSEwO3RoaXMuX3Jlc2V0RW50aXR5U3RvcmUoKTt0aGlzLl91cGRhdGVFeHRlbnRzKCk7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3ZhciBCPXRoaXM7dGhpcy5faXNTZXR1cHx8KEYucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpLG51bGwhPXRoaXMuX2NhbnZhcyYmdGhpcy5fYXBwZW5kQ2FudmFzTm9kZSgpLHRoaXMuX3JlbmRlckFyZWE9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgicmVuZGVyLWFyZWEiLAohMCksdGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oSSl7cmV0dXJuIEIuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldChJKX0pKX07RC5wcm90b3R5cGUuX2FwcGVuZENhbnZhc05vZGU9ZnVuY3Rpb24oKXt2YXIgQj10aGlzLmVsZW1lbnQoKS5zZWxlY3QoIi5wbG90LWNhbnZhcy1jb250YWluZXIiKTtCLmVtcHR5KCkmJihCPXRoaXMuZWxlbWVudCgpLmFwcGVuZCgiZGl2IikuY2xhc3NlZCgicGxvdC1jYW52YXMtY29udGFpbmVyIiwhMCksQi5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fY2FudmFzLm5vZGUoKSkpfTtELnByb3RvdHlwZS5zZXRCb3VuZHM9ZnVuY3Rpb24oQixJLE8sUCl7Ri5wcm90b3R5cGUuc2V0Qm91bmRzLmNhbGwodGhpcyxCLEksTyxQKTt0aGlzLl9yZXNldEVudGl0eVN0b3JlKCk7bnVsbCE9dGhpcy5fY2FudmFzJiYodGhpcy5fYnVmZmVyQ2FudmFzJiYhdGhpcy5fYnVmZmVyQ2FudmFzVmFsaWQmJih0aGlzLl9idWZmZXJDYW52YXMuYXR0cigid2lkdGgiLAp0aGlzLl9jYW52YXMuYXR0cigid2lkdGgiKSksdGhpcy5fYnVmZmVyQ2FudmFzLmF0dHIoImhlaWdodCIsdGhpcy5fY2FudmFzLmF0dHIoImhlaWdodCIpKSwoTz10aGlzLl9idWZmZXJDYW52YXMubm9kZSgpLmdldENvbnRleHQoIjJkIikpJiZPLmRyYXdJbWFnZSh0aGlzLl9jYW52YXMubm9kZSgpLDAsMCksdGhpcy5fYnVmZmVyQ2FudmFzVmFsaWQ9ITApLE89bnVsbCE9d2luZG93LmRldmljZVBpeGVsUmF0aW8/d2luZG93LmRldmljZVBpeGVsUmF0aW86MSx0aGlzLl9jYW52YXMuYXR0cigid2lkdGgiLEIqTyksdGhpcy5fY2FudmFzLmF0dHIoImhlaWdodCIsSSpPKSxQPXRoaXMuX2NhbnZhcy5ub2RlKCkuZ2V0Q29udGV4dCgiMmQiKSkmJihQLnNldFRyYW5zZm9ybShPLDAsMCxPLDAsMCksdGhpcy5fYnVmZmVyQ2FudmFzJiZQLmRyYXdJbWFnZSh0aGlzLl9idWZmZXJDYW52YXMubm9kZSgpLDAsMCxCLEkpKX07RC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBCPXRoaXM7CkYucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9zY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEkpe3JldHVybiBJLm9mZlVwZGF0ZShCLl9yZW5kZXJDYWxsYmFjayl9KTt0aGlzLmRhdGFzZXRzKFtdKX07RC5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldD1mdW5jdGlvbihCKXtCPXRoaXMuX2RhdGFzZXRUb0RyYXdlci5nZXQoQik7InN2ZyI9PT10aGlzLnJlbmRlcmVyKCk/Qi51c2VTVkcodGhpcy5fcmVuZGVyQXJlYSk6Qi51c2VDYW52YXModGhpcy5fY2FudmFzKTtyZXR1cm4gQn07RC5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbigpe3JldHVybiBuZXcgcS5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgci5TVkdEcmF3ZXIoInBhdGgiLCIiKX0sZnVuY3Rpb24oQil7cmV0dXJuIG5ldyBwLkNhbnZhc0RyYXdlcihCLGZ1bmN0aW9uKCl7fSl9KX07RC5wcm90b3R5cGUuX2dldEFuaW1hdG9yPWZ1bmN0aW9uKEIpe3JldHVybiB0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCk/CnRoaXMuX2FuaW1hdG9yc1tCXXx8bmV3IG4uTnVsbDpuZXcgbi5OdWxsfTtELnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlRXh0ZW50cygpO3RoaXMuX2RhdGFDaGFuZ2VkPSEwO3RoaXMuX3Jlc2V0RW50aXR5U3RvcmUoKTt0aGlzLnJlbmRlckxvd1ByaW9yaXR5KCl9O0QucHJvdG90eXBlLmF0dHI9ZnVuY3Rpb24oQixJLE8pe2lmKG51bGw9PUkpcmV0dXJuIHRoaXMuX2F0dHJCaW5kaW5ncy5nZXQoQik7dGhpcy5fYmluZEF0dHIoQixJLE8pO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLl9iaW5kUHJvcGVydHk9ZnVuY3Rpb24oQixJLE8sUCl7dmFyIEg9dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoQik7SD1udWxsIT1IP0guc2NhbGU6bnVsbDt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLnNldChCLHthY2Nlc3NvcjoiZnVuY3Rpb24iPT09dHlwZW9mIEk/STpmdW5jdGlvbigpe3JldHVybiBJfSxzY2FsZTpPLHBvc3RTY2FsZTpQfSk7Cm51bGwhPUgmJnRoaXMuX3VuaW5zdGFsbFNjYWxlRm9yS2V5KEgsQik7bnVsbCE9TyYmdGhpcy5faW5zdGFsbFNjYWxlRm9yS2V5KE8sQik7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpfTtELnByb3RvdHlwZS5fYmluZEF0dHI9ZnVuY3Rpb24oQixJLE8pe3ZhciBQPXRoaXMuX2F0dHJCaW5kaW5ncy5nZXQoQik7UD1udWxsIT1QP1Auc2NhbGU6bnVsbDt0aGlzLl9hdHRyQmluZGluZ3Muc2V0KEIse2FjY2Vzc29yOiJmdW5jdGlvbiI9PT10eXBlb2YgST9JOmZ1bmN0aW9uKCl7cmV0dXJuIEl9LHNjYWxlOk99KTtudWxsIT1QJiZ0aGlzLl91bmluc3RhbGxTY2FsZUZvcktleShQLEIpO251bGwhPU8mJnRoaXMuX2luc3RhbGxTY2FsZUZvcktleShPLEIpO3RoaXMuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGUoKX07RC5wcm90b3R5cGUuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGU9ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yfTtELnByb3RvdHlwZS5fZ2V0QXR0clRvUHJvamVjdG9yPQpmdW5jdGlvbigpe251bGw9PXRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3RvciYmKHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3Rvcj10aGlzLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3RvcigpKTtyZXR1cm4gdi5PYmplY3QuYXNzaWduKHt9LHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3Rvcil9O0QucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe3ZhciBCPXt9O3RoaXMuX2F0dHJCaW5kaW5ncy5lYWNoKGZ1bmN0aW9uKE8sUCl7QltQXT1ELl9zY2FsZWRBY2Nlc3NvcihPKX0pO3ZhciBJPXRoaXMuX3Byb3BlcnR5UHJvamVjdG9ycygpO09iamVjdC5rZXlzKEkpLmZvckVhY2goZnVuY3Rpb24oTyl7bnVsbD09QltPXSYmKEJbT109SVtPXSl9KTtyZXR1cm4gQn07RC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtGLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3RoaXMuX2lzQW5jaG9yZWQmJih0aGlzLl9wYWludCgpLAp0aGlzLl9kYXRhQ2hhbmdlZD0hMSk7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLnJlbmRlckxvd1ByaW9yaXR5PWZ1bmN0aW9uKCl7dGhpcy5fcmVuZGVyQ2FsbGJhY2soKX07RC5wcm90b3R5cGUuYW5pbWF0ZWQ9ZnVuY3Rpb24oQil7aWYobnVsbD09QilyZXR1cm4gdGhpcy5fYW5pbWF0ZTt0aGlzLl9hbmltYXRlPUI7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe0YucHJvdG90eXBlLmRldGFjaC5jYWxsKHRoaXMpO3RoaXMuX3VwZGF0ZUV4dGVudHMoKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX3NjYWxlcz1mdW5jdGlvbigpe3ZhciBCPVtdO3RoaXMuX2F0dHJCaW5kaW5ncy5lYWNoKGZ1bmN0aW9uKEkpe0k9SS5zY2FsZTtudWxsIT1JJiYtMT09PUIuaW5kZXhPZihJKSYmQi5wdXNoKEkpfSk7dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5lYWNoKGZ1bmN0aW9uKEkpe0k9SS5zY2FsZTtudWxsIT1JJiYtMT09PUIuaW5kZXhPZihJKSYmQi5wdXNoKEkpfSk7CnJldHVybiBCfTtELnByb3RvdHlwZS5fdXBkYXRlRXh0ZW50cz1mdW5jdGlvbigpe3ZhciBCPXRoaXM7dGhpcy5fcmVzZXRFbnRpdHlTdG9yZSgpO3RoaXMuX3NjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oSSl7cmV0dXJuIEkuYWRkSW5jbHVkZWRWYWx1ZXNQcm92aWRlcihCLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKX0pfTtELnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH07RC5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvckF0dHI9ZnVuY3Rpb24oQil7dmFyIEk9dGhpcztudWxsPT10aGlzLl9hdHRyRXh0ZW50c1tCXSYmKHRoaXMuX2F0dHJFeHRlbnRzW0JdPXQubWVtVGh1bmsoZnVuY3Rpb24oKXtyZXR1cm4gSS5kYXRhc2V0cygpfSxmdW5jdGlvbigpe3JldHVybiBJLl9hdHRyQmluZGluZ3MuZ2V0KEIpfSxmdW5jdGlvbihPLFApe3JldHVybiBudWxsPT1QfHxudWxsPT1QLmFjY2Vzc29yP251bGw6Ty5tYXAoZnVuY3Rpb24oSCl7cmV0dXJuIGcoSCwKUCxudWxsKX0pfSkpO3JldHVybiB0aGlzLl9hdHRyRXh0ZW50c1tCXSgpfTtELnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oQil7dmFyIEk9dGhpcztudWxsPT10aGlzLl9wcm9wZXJ0eUV4dGVudHNbQl0mJih0aGlzLl9wcm9wZXJ0eUV4dGVudHNbQl09dC5tZW1UaHVuayhmdW5jdGlvbigpe3JldHVybiBJLmRhdGFzZXRzKCl9LGZ1bmN0aW9uKCl7cmV0dXJuIEkuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KEIpfSxmdW5jdGlvbigpe3JldHVybiBJLl9maWx0ZXJGb3JQcm9wZXJ0eShCKX0sZnVuY3Rpb24oTyxQLEgpe3JldHVybiBudWxsPT1QfHxudWxsPT1QLmFjY2Vzc29yP251bGw6Ty5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIGcoSyxQLEgpfSl9KSk7cmV0dXJuIHRoaXMuX3Byb3BlcnR5RXh0ZW50c1tCXSgpfTtELnByb3RvdHlwZS5faW5jbHVkZWRWYWx1ZXNGb3JTY2FsZT1mdW5jdGlvbihCLEkpe3ZhciBPPXRoaXM7aWYoIXRoaXMuX2lzQW5jaG9yZWQmJgohSSlyZXR1cm5bXTt2YXIgUD1bXTt0aGlzLl9hdHRyQmluZGluZ3MuZWFjaChmdW5jdGlvbihILEspe0guc2NhbGU9PT1CJiYoSD1PLmdldEV4dGVudHNGb3JBdHRyKEspLG51bGwhPUgmJihQPVAuY29uY2F0KGsubWVyZ2UoSCkpKSl9KTt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmVhY2goZnVuY3Rpb24oSCxLKXtILnNjYWxlPT09QiYmKEg9Ty5nZXRFeHRlbnRzRm9yUHJvcGVydHkoSyksbnVsbCE9SCYmKFA9UC5jb25jYXQoay5tZXJnZShIKSkpKX0pO3JldHVybiBQfTtELnByb3RvdHlwZS5hbmltYXRvcj1mdW5jdGlvbihCLEkpe2lmKHZvaWQgMD09PUkpcmV0dXJuIHRoaXMuX2FuaW1hdG9yc1tCXTt0aGlzLl9hbmltYXRvcnNbQl09STtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUucmVuZGVyZXI9ZnVuY3Rpb24oQil7dmFyIEk9dGhpcztpZih2b2lkIDA9PT1CKXJldHVybiBudWxsPT10aGlzLl9jYW52YXM/InN2ZyI6ImNhbnZhcyI7bnVsbD09dGhpcy5fY2FudmFzJiYiY2FudmFzIj09PQpCPyh0aGlzLl9jYW52YXM9ay5zZWxlY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikpLmNsYXNzZWQoInBsb3QtY2FudmFzIiwhMCksdGhpcy5fYnVmZmVyQ2FudmFzPWsuc2VsZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpKSxudWxsIT10aGlzLmVsZW1lbnQoKSYmdGhpcy5fYXBwZW5kQ2FudmFzTm9kZSgpLHRoaXMuX2RhdGFzZXRUb0RyYXdlci5mb3JFYWNoKGZ1bmN0aW9uKE8pe08udXNlQ2FudmFzKEkuX2NhbnZhcyl9KSx0aGlzLnJlbmRlcigpKTpudWxsIT10aGlzLl9jYW52YXMmJiJzdmciPT1CJiYodGhpcy5fY2FudmFzLnJlbW92ZSgpLHRoaXMuX2J1ZmZlckNhbnZhcz10aGlzLl9jYW52YXM9bnVsbCx0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZm9yRWFjaChmdW5jdGlvbihPKXtPLnVzZVNWRyhJLl9yZW5kZXJBcmVhKX0pLHRoaXMucmVuZGVyKCkpO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5hZGREYXRhc2V0PWZ1bmN0aW9uKEIpe3RoaXMuX2FkZERhdGFzZXQoQik7CnRoaXMuX29uRGF0YXNldFVwZGF0ZSgpO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5fYWRkRGF0YXNldD1mdW5jdGlvbihCKXt0aGlzLl9yZW1vdmVEYXRhc2V0KEIpO3ZhciBJPXRoaXMuX2NyZWF0ZURyYXdlcihCKTt0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuc2V0KEIsSSk7dGhpcy5faXNTZXR1cCYmdGhpcy5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0KEIpO0Iub25VcGRhdGUodGhpcy5fb25EYXRhc2V0VXBkYXRlQ2FsbGJhY2spO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKEIpe3RoaXMuX3JlbW92ZURhdGFzZXQoQik7dGhpcy5fb25EYXRhc2V0VXBkYXRlKCl9O0QucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKEIpe2lmKC0xPT09dGhpcy5kYXRhc2V0cygpLmluZGV4T2YoQikpcmV0dXJuIHRoaXM7dGhpcy5fcmVtb3ZlRGF0YXNldE5vZGVzKEIpO0Iub2ZmVXBkYXRlKHRoaXMuX29uRGF0YXNldFVwZGF0ZUNhbGxiYWNrKTt0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZGVsZXRlKEIpOwpyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcz1mdW5jdGlvbihCKXt0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZ2V0KEIpLnJlbW92ZSgpfTtELnByb3RvdHlwZS5kYXRhc2V0cz1mdW5jdGlvbihCKXt2YXIgST10aGlzLE89W107dGhpcy5fZGF0YXNldFRvRHJhd2VyLmZvckVhY2goZnVuY3Rpb24oUCxIKXtyZXR1cm4gTy5wdXNoKEgpfSk7aWYobnVsbD09QilyZXR1cm4gTztPLmZvckVhY2goZnVuY3Rpb24oUCl7cmV0dXJuIEkuX3JlbW92ZURhdGFzZXQoUCl9KTtCLmZvckVhY2goZnVuY3Rpb24oUCl7cmV0dXJuIEkuX2FkZERhdGFzZXQoUCl9KTt0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7cmV0dXJuW3thdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6bmV3IG4uTnVsbH1dfTtELnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PQpmdW5jdGlvbigpe307RC5wcm90b3R5cGUuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXM9ZnVuY3Rpb24oQil7dmFyIEk9dGhpcyxPPVtdO0IuZm9yRWFjaChmdW5jdGlvbihQLEgpe3ZhciBLPUkuX2RhdGFzZXRUb0RyYXdlci5nZXQoUCksTT0wO1AuZGF0YSgpLmZvckVhY2goZnVuY3Rpb24oTCxSKXt2YXIgVT1JLl9waXhlbFBvaW50KEwsUixQKTt2Lk1hdGguaXNOYU4oVS54KXx8di5NYXRoLmlzTmFOKFUueSl8fChPLnB1c2goe2RhdHVtOkwsZ2V0IHBvc2l0aW9uKCl7cmV0dXJuIEkuX3BpeGVsUG9pbnQuY2FsbChJLEwsUixQKX0saW5kZXg6UixkYXRhc2V0OlAsZGF0YXNldEluZGV4OkgsY29tcG9uZW50OkksZHJhd2VyOkssdmFsaWREYXR1bUluZGV4Ok19KSxNKyspfSl9KTtyZXR1cm4gT307RC5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXt2YXIgQj1uZXcgdi5NYXA7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oSSl7cmV0dXJuIEIuc2V0KEksCkkuZGF0YSgpKX0pO3JldHVybiBCfTtELnByb3RvdHlwZS5fcGFpbnQ9ZnVuY3Rpb24oKXt2YXIgQj10aGlzO2RlbGV0ZSB0aGlzLl9jYWNoZWRBdHRyVG9Qcm9qZWN0b3I7dmFyIEk9dGhpcy5fZ2VuZXJhdGVEcmF3U3RlcHMoKSxPPXRoaXMuX2dldERhdGFUb0RyYXcoKSxQPXRoaXMuZGF0YXNldHMoKS5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIEIuX2RhdGFzZXRUb0RyYXdlci5nZXQoSyl9KTtpZigiY2FudmFzIj09PXRoaXMucmVuZGVyZXIoKSl7dmFyIEg9dGhpcy5fY2FudmFzLm5vZGUoKTtILmdldENvbnRleHQoIjJkIikuY2xlYXJSZWN0KDAsMCxILmNsaWVudFdpZHRoLEguY2xpZW50SGVpZ2h0KTt0aGlzLl9idWZmZXJDYW52YXNWYWxpZD0hMX10aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihLLE0pe3ZhciBMPUQuYXBwbHlEcmF3U3RlcHMoSSxLKTtQW01dLmRyYXcoTy5nZXQoSyksTCl9KTtIPXRoaXMuZGF0YXNldHMoKS5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIEQuZ2V0VG90YWxEcmF3VGltZShPLmdldChLKSwKSSl9KTtIPXYuTWF0aC5tYXgoSCwwKTt0aGlzLl9hZGRpdGlvbmFsUGFpbnQoSCl9O0QucHJvdG90eXBlLnNlbGVjdGlvbnM9ZnVuY3Rpb24oQil7dmFyIEk9dGhpczt2b2lkIDA9PT1CJiYoQj10aGlzLmRhdGFzZXRzKCkpO2lmKCJjYW52YXMiPT09dGhpcy5yZW5kZXJlcigpKXJldHVybiBrLnNlbGVjdEFsbCgpO3ZhciBPPVtdO0IuZm9yRWFjaChmdW5jdGlvbihQKXtQPUkuX2RhdGFzZXRUb0RyYXdlci5nZXQoUCk7bnVsbCE9UCYmKFA9UC5nZXRWaXN1YWxQcmltaXRpdmVzKCksTy5wdXNoLmFwcGx5KE8sUCkpfSk7cmV0dXJuIGsuc2VsZWN0QWxsKE8pfTtELnByb3RvdHlwZS5lbnRpdGllcz1mdW5jdGlvbihCKXt2YXIgST10aGlzO3JldHVybiB0aGlzLl9nZXRFbnRpdHlTdG9yZShCKS5lbnRpdGllcygpLm1hcChmdW5jdGlvbihPKXtyZXR1cm4gSS5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KE8pfSl9O0QucHJvdG90eXBlLl9nZXRFbnRpdHlTdG9yZT1mdW5jdGlvbihCKXtmdW5jdGlvbiBJKEgpe3JldHVybiBPLl9lbnRpdHlCb3VuZHMoSCl9CnZhciBPPXRoaXM7aWYodm9pZCAwIT09Qil7dmFyIFA9bmV3IHYuRW50aXR5U3RvcmU7UC5hZGRBbGwodGhpcy5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcyhCKSxJLHRoaXMuX2xvY2FsT3JpZ2luQm91bmRzKCkpO3JldHVybiBQfXZvaWQgMD09PXRoaXMuX2NhY2hlZEVudGl0eVN0b3JlJiYoUD1uZXcgdi5FbnRpdHlTdG9yZSxQLmFkZEFsbCh0aGlzLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzKHRoaXMuZGF0YXNldHMoKSksSSx0aGlzLl9sb2NhbE9yaWdpbkJvdW5kcygpKSx0aGlzLl9jYWNoZWRFbnRpdHlTdG9yZT1QKTtyZXR1cm4gdGhpcy5fY2FjaGVkRW50aXR5U3RvcmV9O0QucHJvdG90eXBlLl9sb2NhbE9yaWdpbkJvdW5kcz1mdW5jdGlvbigpe3JldHVybnt0b3BMZWZ0Ont4OjAseTowfSxib3R0b21SaWdodDp7eDp0aGlzLndpZHRoKCkseTp0aGlzLmhlaWdodCgpfX19O0QucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oQil7Qj10aGlzLl9waXhlbFBvaW50KEIuZGF0dW0sCkIuaW5kZXgsQi5kYXRhc2V0KTtyZXR1cm57eDpCLngseTpCLnksd2lkdGg6MCxoZWlnaHQ6MH19O0QucHJvdG90eXBlLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHk9ZnVuY3Rpb24oQil7cmV0dXJue2JvdW5kczp0aGlzLl9lbnRpdHlCb3VuZHMoQiksY29tcG9uZW50OkIuY29tcG9uZW50LGRhdGFzZXQ6Qi5kYXRhc2V0LGRhdGFzZXRJbmRleDpCLmRhdGFzZXRJbmRleCxkYXR1bTpCLmRhdHVtLGluZGV4OkIuaW5kZXgscG9zaXRpb246Qi5wb3NpdGlvbixzZWxlY3Rpb246ay5zZWxlY3QoQi5kcmF3ZXIuZ2V0VmlzdWFsUHJpbWl0aXZlcygpW0IudmFsaWREYXR1bUluZGV4XSl9fTtELnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoInBsb3RzIG11c3QgaW1wbGVtZW50IGVudGl0aWVzQXQiKTt9O0QucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24oQil7Qj10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0eU5lYXJlc3QoQik7CnJldHVybiB2b2lkIDA9PT1CP3ZvaWQgMDp0aGlzLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoQil9O0QucHJvdG90eXBlLmVudGl0aWVzSW49ZnVuY3Rpb24oQixJKXtyZXR1cm4gdGhpcy5lbnRpdGllc0luQm91bmRzKG51bGw9PUk/e3g6Qi50b3BMZWZ0LngseTpCLnRvcExlZnQueSx3aWR0aDpCLmJvdHRvbVJpZ2h0LngtQi50b3BMZWZ0LngsaGVpZ2h0OkIuYm90dG9tUmlnaHQueS1CLnRvcExlZnQueX06e3g6Qi5taW4seTpJLm1pbix3aWR0aDpCLm1heC1CLm1pbixoZWlnaHQ6SS5tYXgtSS5taW59KX07RC5wcm90b3R5cGUuZW50aXRpZXNJbkJvdW5kcz1mdW5jdGlvbihCKXt2YXIgST10aGlzO2lmKEI9dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllc0luQm91bmRzKEIpKXJldHVybiBCLm1hcChmdW5jdGlvbihPKXtyZXR1cm4gSS5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KE8pfSl9O0QucHJvdG90eXBlLmVudGl0aWVzSW5YQm91bmRzPQpmdW5jdGlvbihCKXt2YXIgST10aGlzO2lmKEI9dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllc0luWEJvdW5kcyhCKSlyZXR1cm4gQi5tYXAoZnVuY3Rpb24oTyl7cmV0dXJuIEkuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShPKX0pfTtELnByb3RvdHlwZS5lbnRpdGllc0luWUJvdW5kcz1mdW5jdGlvbihCKXt2YXIgST10aGlzO2lmKEI9dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllc0luWUJvdW5kcyhCKSlyZXR1cm4gQi5tYXAoZnVuY3Rpb24oTyl7cmV0dXJuIEkuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShPKX0pfTtELnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24oQil7Qi5vZmZVcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spO0Iub2ZmVXBkYXRlKHRoaXMuX2RlZmVycmVkUmVzZXRFbnRpdHlTdG9yZSk7Qi5yZW1vdmVJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXIpfTsKRC5wcm90b3R5cGUuX2luc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbihCKXtCLm9uVXBkYXRlKHRoaXMuX3JlbmRlckNhbGxiYWNrKTtCLm9uVXBkYXRlKHRoaXMuX2RlZmVycmVkUmVzZXRFbnRpdHlTdG9yZSk7Qi5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXIpfTtELnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7cmV0dXJue319O0QuX3NjYWxlZEFjY2Vzc29yPWZ1bmN0aW9uKEIpe3ZhciBJPUIuc2NhbGUsTz1CLmFjY2Vzc29yLFA9Qi5wb3N0U2NhbGUsSD1udWxsPT1JP086ZnVuY3Rpb24oSyxNLEwpe3JldHVybiBJLnNjYWxlKE8oSyxNLEwpKX07cmV0dXJuIG51bGw9PVA/SDpmdW5jdGlvbihLLE0sTCl7cmV0dXJuIFAoSChLLE0sTCksSyxNLEwpfX07RC5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm57eDowLHk6MH19O0QucHJvdG90eXBlLl9hbmltYXRlT25OZXh0UmVuZGVyPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbmltYXRlJiZ0aGlzLl9kYXRhQ2hhbmdlZH07cmV0dXJuIER9KGMuQ29tcG9uZW50KTtmLl9BTklNQVRJT05fTUFYX0RVUkFUSU9OPTYwMDtkLlBsb3Q9Zn0sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcobil7Zm9yKHZhciBwIGluIG4pZC5oYXNPd25Qcm9wZXJ0eShwKXx8KGRbcF09bltwXSl9Yz1mKDEwNSk7ZC5UaWNrR2VuZXJhdG9ycz1jO2coZig1NCkpO2coZigxMDEpKTtnKGYoMTAyKSk7ZyhmKDEwMykpO2coZigxMDQpKTtnKGYoMTA2KSk7dmFyIGw9Zig1NCksaz1mKDExKTtkLmlzVHJhbnNmb3JtYWJsZT1mdW5jdGlvbihuKXtyZXR1cm4gbiBpbnN0YW5jZW9mIGsuUXVhbnRpdGF0aXZlU2NhbGV8fG4gaW5zdGFuY2VvZiBsLkNhdGVnb3J5fX0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoMSksbD1mKDMwKSxrPWYoMCksbj1mKDEyKTtjPWYoMTApO2QuWEFsaWdubWVudD1jLm1ha2VFbnVtKFsibGVmdCIsImNlbnRlciIsInJpZ2h0Il0pOwpkLllBbGlnbm1lbnQ9Yy5tYWtlRW51bShbInRvcCIsImNlbnRlciIsImJvdHRvbSJdKTtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcCgpe3RoaXMuX292ZXJmbG93SGlkZGVuPSExO3RoaXMuX29yaWdpbj17eDowLHk6MH07dGhpcy5feEFsaWdubWVudD0ibGVmdCI7dGhpcy5feUFsaWdubWVudD0idG9wIjt0aGlzLl9pc0FuY2hvcmVkPXRoaXMuX2lzU2V0dXA9ITE7dGhpcy5fY3NzQ2xhc3Nlcz1uZXcgay5TZXQ7dGhpcy5fZGVzdHJveWVkPSExO3RoaXMuX29uQW5jaG9yQ2FsbGJhY2tzPW5ldyBrLkNhbGxiYWNrU2V0O3RoaXMuX29uRGV0YWNoQ2FsbGJhY2tzPW5ldyBrLkNhbGxiYWNrU2V0O3RoaXMuX2Nzc0NsYXNzZXMuYWRkKCJjb21wb25lbnQiKX1wLnByb3RvdHlwZS5hbmNob3I9ZnVuY3Rpb24ocSl7cT1uLmNvZXJjZUV4dGVybmFsRDMocSk7aWYodGhpcy5fZGVzdHJveWVkKXRocm93IEVycm9yKCJDYW4ndCByZXVzZSBkZXN0cm95KCktZWQgQ29tcG9uZW50cyEiKTt0aGlzLmlzUm9vdCgpJiYKKHRoaXMuX3Jvb3RFbGVtZW50PXEsdGhpcy5fcm9vdEVsZW1lbnQuY2xhc3NlZCgicGxvdHRhYmxlIiwhMCkpO251bGwhPXRoaXMuX2VsZW1lbnQ/cS5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fZWxlbWVudC5ub2RlKCkpOih0aGlzLl9lbGVtZW50PXEuYXBwZW5kKCJkaXYiKSx0aGlzLl9zZXR1cCgpKTt0aGlzLl9pc0FuY2hvcmVkPSEwO3RoaXMuX29uQW5jaG9yQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcyk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLm9uQW5jaG9yPWZ1bmN0aW9uKHEpe3RoaXMuX2lzQW5jaG9yZWQmJnEodGhpcyk7dGhpcy5fb25BbmNob3JDYWxsYmFja3MuYWRkKHEpfTtwLnByb3RvdHlwZS5vZmZBbmNob3I9ZnVuY3Rpb24ocSl7dGhpcy5fb25BbmNob3JDYWxsYmFja3MuZGVsZXRlKHEpfTtwLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt2YXIgcT10aGlzO3RoaXMuX2lzU2V0dXB8fCh0aGlzLl9jc3NDbGFzc2VzLmZvckVhY2goZnVuY3Rpb24ocil7cS5fZWxlbWVudC5jbGFzc2VkKHIsCiEwKX0pLHRoaXMuX2Nzc0NsYXNzZXM9bmV3IGsuU2V0LHRoaXMuX2JhY2tncm91bmRDb250YWluZXI9dGhpcy5fZWxlbWVudC5hcHBlbmQoInN2ZyIpLmNsYXNzZWQoImJhY2tncm91bmQtY29udGFpbmVyIiwhMCksdGhpcy5fY29udGVudD10aGlzLl9lbGVtZW50LmFwcGVuZCgic3ZnIikuY2xhc3NlZCgiY29udGVudCIsITApLHRoaXMuX2ZvcmVncm91bmRDb250YWluZXI9dGhpcy5fZWxlbWVudC5hcHBlbmQoInN2ZyIpLmNsYXNzZWQoImZvcmVncm91bmQtY29udGFpbmVyIiwhMCksdGhpcy5fb3ZlcmZsb3dIaWRkZW4/dGhpcy5fY29udGVudC5jbGFzc2VkKCJjb21wb25lbnQtb3ZlcmZsb3ctaGlkZGVuIiwhMCk6dGhpcy5fY29udGVudC5jbGFzc2VkKCJjb21wb25lbnQtb3ZlcmZsb3ctdmlzaWJsZSIsITApLHRoaXMuX2lzU2V0dXA9ITApfTtwLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbigpe3JldHVybnttaW5XaWR0aDowLG1pbkhlaWdodDowfX07cC5wcm90b3R5cGUuY29tcHV0ZUxheW91dD0KZnVuY3Rpb24ocSxyLHQpe2lmKG51bGw9PXF8fG51bGw9PXJ8fG51bGw9PXQpe2lmKG51bGw9PXRoaXMuX2VsZW1lbnQpdGhyb3cgRXJyb3IoImFuY2hvcigpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjb21wdXRlTGF5b3V0KCkiKTtpZihudWxsIT10aGlzLl9yb290RWxlbWVudClxPXt4OjAseTowfSx0PXRoaXMuX3Jvb3RFbGVtZW50Lm5vZGUoKSxyPWsuRE9NLmVsZW1lbnRXaWR0aCh0KSx0PWsuRE9NLmVsZW1lbnRIZWlnaHQodCk7ZWxzZSB0aHJvdyBFcnJvcigibnVsbCBhcmd1bWVudHMgY2Fubm90IGJlIHBhc3NlZCB0byBjb21wdXRlTGF5b3V0KCkgb24gYSBub24tcm9vdCwgdW5hbmNob3JlZCBub2RlIik7fXZhciB2PXRoaXMuX3NpemVGcm9tT2ZmZXIocix0KSx5PXYuaGVpZ2h0O3Y9di53aWR0aDt0aGlzLnNldEJvdW5kcyh2LHkscS54KyhyLXYpKnAuX3hBbGlnblRvUHJvcG9ydGlvblt0aGlzLl94QWxpZ25tZW50XSxxLnkrKHQteSkqcC5feUFsaWduVG9Qcm9wb3J0aW9uW3RoaXMuX3lBbGlnbm1lbnRdKTsKcmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnNldEJvdW5kcz1mdW5jdGlvbihxLHIsdCx2KXt2b2lkIDA9PT10JiYodD0wKTt2b2lkIDA9PT12JiYodj0wKTt0aGlzLl93aWR0aD1xO3RoaXMuX2hlaWdodD1yO3RoaXMuX29yaWdpbj17eDp0LHk6dn07bnVsbCE9dGhpcy5fZWxlbWVudCYmdGhpcy5fZWxlbWVudC5zdHlsZXMoe2xlZnQ6dCsicHgiLGhlaWdodDpyKyJweCIsdG9wOnYrInB4Iix3aWR0aDpxKyJweCJ9KTtudWxsIT10aGlzLl9yZXNpemVIYW5kbGVyJiZ0aGlzLl9yZXNpemVIYW5kbGVyKHt3aWR0aDpxLGhlaWdodDpyfSl9O3AucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHEscil7dmFyIHQ9dGhpcy5yZXF1ZXN0ZWRTcGFjZShxLHIpO3JldHVybnt3aWR0aDp0aGlzLmZpeGVkV2lkdGgoKT9NYXRoLm1pbihxLHQubWluV2lkdGgpOnEsaGVpZ2h0OnRoaXMuZml4ZWRIZWlnaHQoKT9NYXRoLm1pbihyLHQubWluSGVpZ2h0KTpyfX07cC5wcm90b3R5cGUucmVuZGVyPQpmdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2lzU2V0dXAmJjA8PXRoaXMud2lkdGgoKSYmMDw9dGhpcy5oZWlnaHQoKSYmbC5yZWdpc3RlclRvUmVuZGVyKHRoaXMpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5yZW5kZXJMb3dQcmlvcml0eT1mdW5jdGlvbigpe3RoaXMucmVuZGVyKCl9O3AucHJvdG90eXBlLl9zY2hlZHVsZUNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oKXt0aGlzLl9pc0FuY2hvcmVkJiZ0aGlzLl9pc1NldHVwJiZsLnJlZ2lzdGVyVG9Db21wdXRlTGF5b3V0QW5kUmVuZGVyKHRoaXMpfTtwLnByb3RvdHlwZS5vblJlc2l6ZT1mdW5jdGlvbihxKXt0aGlzLl9yZXNpemVIYW5kbGVyPXE7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2lzU2V0dXAmJih0aGlzLmlzUm9vdCgpP3RoaXMuX3NjaGVkdWxlQ29tcHV0ZUxheW91dCgpOgp0aGlzLnBhcmVudCgpLnJlZHJhdygpKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7fTtwLnByb3RvdHlwZS5yZW5kZXJUbz1mdW5jdGlvbihxKXt0aGlzLmRldGFjaCgpO2lmKG51bGwhPXEpe3E9InN0cmluZyI9PT10eXBlb2YgcT9nLnNlbGVjdChxKTpxIGluc3RhbmNlb2YgRWxlbWVudD9nLnNlbGVjdChxKTpuLmNvZXJjZUV4dGVybmFsRDMocSk7aWYoIXEubm9kZSgpfHxudWxsPT1xLm5vZGUoKS5ub2RlTmFtZSl0aHJvdyBFcnJvcigiUGxvdHRhYmxlIHJlcXVpcmVzIGEgdmFsaWQgRWxlbWVudCB0byByZW5kZXJUbyIpO2lmKCJzdmciPT09cS5ub2RlKCkubm9kZU5hbWUpdGhyb3cgRXJyb3IoIlBsb3R0YWJsZSAzLnggYW5kIGxhdGVyIGNhbiBvbmx5IHJlbmRlclRvIGFuIEhUTUwgY29tcG9uZW50OyBwYXNzIGEgZGl2IGluc3RlYWQhIik7dGhpcy5hbmNob3IocSl9aWYobnVsbD09dGhpcy5fZWxlbWVudCl0aHJvdyBFcnJvcigiSWYgYSBDb21wb25lbnQgaGFzIG5ldmVyIGJlZW4gcmVuZGVyZWQgYmVmb3JlLCB0aGVuIHJlbmRlclRvIG11c3QgYmUgZ2l2ZW4gYSBub2RlIHRvIHJlbmRlciB0bywgb3IgYSBkMy5TZWxlY3Rpb24sIG9yIGEgc2VsZWN0b3Igc3RyaW5nIik7CmwucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXRBbmRSZW5kZXIodGhpcyk7bC5mbHVzaCgpfTtwLnByb3RvdHlwZS54QWxpZ25tZW50PWZ1bmN0aW9uKHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuX3hBbGlnbm1lbnQ7cT1xLnRvTG93ZXJDYXNlKCk7aWYobnVsbD09cC5feEFsaWduVG9Qcm9wb3J0aW9uW3FdKXRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBhbGlnbm1lbnQ6ICIrcSk7dGhpcy5feEFsaWdubWVudD1xO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnlBbGlnbm1lbnQ9ZnVuY3Rpb24ocSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5feUFsaWdubWVudDtxPXEudG9Mb3dlckNhc2UoKTtpZihudWxsPT1wLl95QWxpZ25Ub1Byb3BvcnRpb25bcV0pdGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIGFsaWdubWVudDogIitxKTt0aGlzLl95QWxpZ25tZW50PXE7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuaGFzQ2xhc3M9ZnVuY3Rpb24ocSl7cmV0dXJuIG51bGw9PQpxPyExOm51bGw9PXRoaXMuX2VsZW1lbnQ/dGhpcy5fY3NzQ2xhc3Nlcy5oYXMocSk6dGhpcy5fZWxlbWVudC5jbGFzc2VkKHEpfTtwLnByb3RvdHlwZS5hZGRDbGFzcz1mdW5jdGlvbihxKXtudWxsIT1xJiYobnVsbD09dGhpcy5fZWxlbWVudD90aGlzLl9jc3NDbGFzc2VzLmFkZChxKTp0aGlzLl9lbGVtZW50LmNsYXNzZWQocSwhMCkpfTtwLnByb3RvdHlwZS5yZW1vdmVDbGFzcz1mdW5jdGlvbihxKXtudWxsIT1xJiYobnVsbD09dGhpcy5fZWxlbWVudD90aGlzLl9jc3NDbGFzc2VzLmRlbGV0ZShxKTp0aGlzLl9lbGVtZW50LmNsYXNzZWQocSwhMSkpfTtwLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuITF9O3AucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuITF9O3AucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe3RoaXMucGFyZW50KG51bGwpO3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7dGhpcy5faXNBbmNob3JlZD0KITE7dGhpcy5fb25EZXRhY2hDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUub25EZXRhY2g9ZnVuY3Rpb24ocSl7dGhpcy5fb25EZXRhY2hDYWxsYmFja3MuYWRkKHEpfTtwLnByb3RvdHlwZS5vZmZEZXRhY2g9ZnVuY3Rpb24ocSl7dGhpcy5fb25EZXRhY2hDYWxsYmFja3MuZGVsZXRlKHEpfTtwLnByb3RvdHlwZS5wYXJlbnQ9ZnVuY3Rpb24ocSl7aWYodm9pZCAwPT09cSlyZXR1cm4gdGhpcy5fcGFyZW50O2lmKG51bGwhPT1xJiYhcS5oYXModGhpcykpdGhyb3cgRXJyb3IoIlBhc3NlZCBpbnZhbGlkIHBhcmVudCIpO3RoaXMuX3BhcmVudD1xO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5ib3VuZHM9ZnVuY3Rpb24oKXt2YXIgcT10aGlzLm9yaWdpbigpO3JldHVybnt0b3BMZWZ0OnEsYm90dG9tUmlnaHQ6e3g6cS54K3RoaXMud2lkdGgoKSx5OnEueSt0aGlzLmhlaWdodCgpfX19O3AucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLl9kZXN0cm95ZWQ9CiEwO3RoaXMuZGV0YWNoKCl9O3AucHJvdG90eXBlLndpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dpZHRofTtwLnByb3RvdHlwZS5oZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGVpZ2h0fTtwLnByb3RvdHlwZS5vcmlnaW49ZnVuY3Rpb24oKXtyZXR1cm57eDp0aGlzLl9vcmlnaW4ueCx5OnRoaXMuX29yaWdpbi55fX07cC5wcm90b3R5cGUub3JpZ2luVG9Sb290PWZ1bmN0aW9uKCl7Zm9yKHZhciBxPXRoaXMub3JpZ2luKCkscj10aGlzLnBhcmVudCgpO251bGwhPXI7KXt2YXIgdD1yLm9yaWdpbigpO3EueCs9dC54O3EueSs9dC55O3I9ci5wYXJlbnQoKX1yZXR1cm4gcX07cC5wcm90b3R5cGUucm9vdD1mdW5jdGlvbigpe2Zvcih2YXIgcT10aGlzOyFxLmlzUm9vdCgpOylxPXEucGFyZW50KCk7cmV0dXJuIHF9O3AucHJvdG90eXBlLmlzUm9vdD1mdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLnBhcmVudCgpfTtwLnByb3RvdHlwZS5mb3JlZ3JvdW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZvcmVncm91bmRDb250YWluZXJ9OwpwLnByb3RvdHlwZS5jb250ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRlbnR9O3AucHJvdG90eXBlLmVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxlbWVudH07cC5wcm90b3R5cGUucm9vdEVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb290KCkuX3Jvb3RFbGVtZW50fTtwLnByb3RvdHlwZS5iYWNrZ3JvdW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tncm91bmRDb250YWluZXJ9O3JldHVybiBwfSgpO2MuX3hBbGlnblRvUHJvcG9ydGlvbj17bGVmdDowLGNlbnRlcjouNSxyaWdodDoxfTtjLl95QWxpZ25Ub1Byb3BvcnRpb249e3RvcDowLGNlbnRlcjouNSxib3R0b206MX07ZC5Db21wb25lbnQ9Y30sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcobCl7Zm9yKHZhciBrIGluIGwpZC5oYXNPd25Qcm9wZXJ0eShrKXx8KGRba109bFtrXSl9ZyhmKDU5KSk7ZyhmKDYyKSk7ZyhmKDEzMykpO2coZigyMSkpO2coZig2NCkpO2coZig2NikpfSwKZnVuY3Rpb24oYyxkKXtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZihnLGwpe3RoaXMuX3N2Z0RyYXdlckZhY3Rvcnk9Zzt0aGlzLl9jYW52YXNEcmF3ZXJGYWN0b3J5PWx9Zi5wcm90b3R5cGUudXNlU1ZHPWZ1bmN0aW9uKGcpe251bGwhPXRoaXMuX2N1cnJlbnREcmF3ZXImJnRoaXMuX2N1cnJlbnREcmF3ZXIucmVtb3ZlKCk7dmFyIGw9dGhpcy5fc3ZnRHJhd2VyRmFjdG9yeSgpO2wuYXR0YWNoVG8oZyk7dGhpcy5fY3VycmVudERyYXdlcj1sfTtmLnByb3RvdHlwZS51c2VDYW52YXM9ZnVuY3Rpb24oZyl7bnVsbCE9dGhpcy5fY3VycmVudERyYXdlciYmdGhpcy5fY3VycmVudERyYXdlci5yZW1vdmUoKTt0aGlzLl9jdXJyZW50RHJhd2VyPXRoaXMuX2NhbnZhc0RyYXdlckZhY3RvcnkoZy5ub2RlKCkuZ2V0Q29udGV4dCgiMmQiKSl9O2YucHJvdG90eXBlLmdldERyYXdlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jdXJyZW50RHJhd2VyfTtmLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXtudWxsIT0KdGhpcy5fY3VycmVudERyYXdlciYmdGhpcy5fY3VycmVudERyYXdlci5yZW1vdmUoKX07Zi5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbihnLGwpe3RoaXMuX2N1cnJlbnREcmF3ZXIuZHJhdyhnLGwpfTtmLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnREcmF3ZXIuZ2V0VmlzdWFsUHJpbWl0aXZlcygpfTtmLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4PWZ1bmN0aW9uKGcpe3JldHVybiB0aGlzLl9jdXJyZW50RHJhd2VyLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXgoZyl9O3JldHVybiBmfSgpO2QuUHJveHlEcmF3ZXI9Y30sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcobCl7Zm9yKHZhciBrIGluIGwpZC5oYXNPd25Qcm9wZXJ0eShrKXx8KGRba109bFtrXSl9ZyhmKDcwKSk7ZyhmKDcxKSl9LGZ1bmN0aW9uKGMsZCxmKXtmdW5jdGlvbiBnKG4pe3ZvaWQgMD09PW4mJihuPTMpO2wobik7cmV0dXJuIGZ1bmN0aW9uKHApe3JldHVybiBwLnRvRml4ZWQobil9fQpmdW5jdGlvbiBsKG4pe2lmKDA+bnx8MjA8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRm9ybWF0dGVyIHByZWNpc2lvbiBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMjAiKTtpZihuIT09TWF0aC5mbG9vcihuKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRm9ybWF0dGVyIHByZWNpc2lvbiBtdXN0IGJlIGFuIGludGVnZXIiKTt9dmFyIGs9ZigxKTtkLmN1cnJlbmN5PWZ1bmN0aW9uKG4scCxxKXt2b2lkIDA9PT1uJiYobj0yKTt2b2lkIDA9PT1wJiYocD0iJCIpO3ZvaWQgMD09PXEmJihxPSEwKTt2YXIgcj1nKG4pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgdj1yKE1hdGguYWJzKHQpKTsiIiE9PXYmJih2PXE/cCt2OnYrcCwwPnQmJih2PSItIit2KSk7cmV0dXJuIHZ9fTtkLmZpeGVkPWc7ZC5nZW5lcmFsPWZ1bmN0aW9uKG4pe3ZvaWQgMD09PW4mJihuPTMpO2wobik7cmV0dXJuIGZ1bmN0aW9uKHApe2lmKCJudW1iZXIiPT09dHlwZW9mIHApe3ZhciBxPU1hdGgucG93KDEwLG4pO3JldHVybiBTdHJpbmcoTWF0aC5yb3VuZChwKgpxKS9xKX1yZXR1cm4gU3RyaW5nKHApfX07ZC5pZGVudGl0eT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gU3RyaW5nKG4pfX07ZC5wZXJjZW50YWdlPWZ1bmN0aW9uKG4pe3ZvaWQgMD09PW4mJihuPTApO3ZhciBwPWcobik7cmV0dXJuIGZ1bmN0aW9uKHEpe3ZhciByPXEudG9TdHJpbmcoKTtyPU1hdGgucG93KDEwLHIubGVuZ3RoLShyLmluZGV4T2YoIi4iKSsxKSk7cmV0dXJuIHAocGFyc2VJbnQoKDEwMCpxKnIpLnRvU3RyaW5nKCksMTApL3IpKyIlIn19O2Quc2lTdWZmaXg9ZnVuY3Rpb24obil7dm9pZCAwPT09biYmKG49Myk7bChuKTtyZXR1cm4gZnVuY3Rpb24ocCl7cmV0dXJuIGsuZm9ybWF0KCIuIituKyJzIikocCl9fTtkLnNob3J0U2NhbGU9ZnVuY3Rpb24oKXt2YXIgbj0wO3ZvaWQgMD09PW4mJihuPTMpO2wobik7dmFyIHA9ay5mb3JtYXQoIi4iK24rImUiKSxxPWsuZm9ybWF0KCIuIituKyJmIikscj1NYXRoLnBvdygxMCwxOCksdD1NYXRoLnBvdygxMCwKLW4pO3JldHVybiBmdW5jdGlvbih2KXt2YXIgeT1NYXRoLmFicyh2KTtpZigoeTx0fHx5Pj1yKSYmMCE9PXkpcmV0dXJuIHAodik7Zm9yKHZhciB6PS0xO3k+PU1hdGgucG93KDFFMyx6KzIpJiY0Pno7KXorKzt5PS0xPT09ej9xKHYpOnEodi9NYXRoLnBvdygxRTMseisxKSkrIktNQlRRIlt6XTtpZigwPHYmJiIxMDAwIj09PXkuc3Vic3RyKDAsNCl8fDA+diYmIi0xMDAwIj09PXkuc3Vic3RyKDAsNSkpND56Pyh6KysseT1xKHYvTWF0aC5wb3coMUUzLHorMSkpKyJLTUJUUSJbel0pOnk9cCh2KTtyZXR1cm4geX19O2QubXVsdGlUaW1lPWZ1bmN0aW9uKCl7dmFyIG49W3tzcGVjaWZpZXI6Ii4lTCIscHJlZGljYXRlOmZ1bmN0aW9uKHApe3JldHVybiAwIT09cC5nZXRNaWxsaXNlY29uZHMoKX19LHtzcGVjaWZpZXI6IjolUyIscHJlZGljYXRlOmZ1bmN0aW9uKHApe3JldHVybiAwIT09cC5nZXRTZWNvbmRzKCl9fSx7c3BlY2lmaWVyOiIlSTolTSIscHJlZGljYXRlOmZ1bmN0aW9uKHApe3JldHVybiAwIT09CnAuZ2V0TWludXRlcygpfX0se3NwZWNpZmllcjoiJUkgJXAiLHByZWRpY2F0ZTpmdW5jdGlvbihwKXtyZXR1cm4gMCE9PXAuZ2V0SG91cnMoKX19LHtzcGVjaWZpZXI6IiVhICVkIixwcmVkaWNhdGU6ZnVuY3Rpb24ocCl7cmV0dXJuIDAhPT1wLmdldERheSgpJiYxIT09cC5nZXREYXRlKCl9fSx7c3BlY2lmaWVyOiIlYiAlZCIscHJlZGljYXRlOmZ1bmN0aW9uKHApe3JldHVybiAxIT09cC5nZXREYXRlKCl9fSx7c3BlY2lmaWVyOiIlYiIscHJlZGljYXRlOmZ1bmN0aW9uKHApe3JldHVybiAwIT09cC5nZXRNb250aCgpfX1dO3JldHVybiBmdW5jdGlvbihwKXt2YXIgcT1uLmZpbHRlcihmdW5jdGlvbihyKXtyZXR1cm4gci5wcmVkaWNhdGUocCl9KTtyZXR1cm4gay50aW1lRm9ybWF0KDA8cS5sZW5ndGg/cVswXS5zcGVjaWZpZXI6IiVZIikocCl9fTtkLnRpbWU9ZnVuY3Rpb24obil7cmV0dXJuIGsudGltZUZvcm1hdChuKX19LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz1mKDEpLGw9ZigwKTsKYz1mdW5jdGlvbigpe2Z1bmN0aW9uIGsobixwKXt0aGlzLl9yb290PWcuc2VsZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJnIikpO3RoaXMuX2NsYXNzTmFtZT1wO3RoaXMuX3N2Z0VsZW1lbnROYW1lPW59ay5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbihuLHApe3ZhciBxPXRoaXM7dGhpcy5fY3JlYXRlQW5kRGVzdHJveURPTUVsZW1lbnRzKG4pO3ZhciByPTA7cC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2wuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gcS5fZHJhd1N0ZXAodCl9LHIpO3IrPXQuYW5pbWF0b3IudG90YWxUaW1lKG4ubGVuZ3RoKX0pfTtrLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVzPWZ1bmN0aW9uKCl7bnVsbD09dGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzJiYodGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzPXRoaXMuX3NlbGVjdGlvbi5ub2RlcygpKTtyZXR1cm4gdGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzfTsKay5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleD1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5nZXRWaXN1YWxQcmltaXRpdmVzKClbbl19O2sucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuX3Jvb3QucmVtb3ZlKCl9O2sucHJvdG90eXBlLmF0dGFjaFRvPWZ1bmN0aW9uKG4pe24ubm9kZSgpLmFwcGVuZENoaWxkKHRoaXMuX3Jvb3Qubm9kZSgpKX07ay5wcm90b3R5cGUuZ2V0Um9vdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290fTtrLnByb3RvdHlwZS5zZWxlY3Rvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdmdFbGVtZW50TmFtZX07ay5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXt9O2sucHJvdG90eXBlLl9jcmVhdGVBbmREZXN0cm95RE9NRWxlbWVudHM9ZnVuY3Rpb24obil7bj1uLmZpbHRlcihmdW5jdGlvbihwKXtyZXR1cm4gbnVsbCE9cH0pO249dGhpcy5fcm9vdC5zZWxlY3RBbGwodGhpcy5zZWxlY3RvcigpKS5kYXRhKG4pOwp0aGlzLl9zZWxlY3Rpb249bi5lbnRlcigpLmFwcGVuZCh0aGlzLl9zdmdFbGVtZW50TmFtZSkubWVyZ2Uobik7bi5leGl0KCkucmVtb3ZlKCk7dGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzPW51bGw7bnVsbCE9dGhpcy5fY2xhc3NOYW1lJiZ0aGlzLl9zZWxlY3Rpb24uY2xhc3NlZCh0aGlzLl9jbGFzc05hbWUsITApO3RoaXMuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXModGhpcy5fc2VsZWN0aW9uKX07ay5wcm90b3R5cGUuX2RyYXdTdGVwPWZ1bmN0aW9uKG4pe3ZhciBwPXRoaXM7WyJmaWxsIiwic3Ryb2tlIl0uZm9yRWFjaChmdW5jdGlvbihxKXtudWxsIT1uLmF0dHJUb0FwcGxpZWRQcm9qZWN0b3JbcV0mJnAuX3NlbGVjdGlvbi5hdHRyKHEsbi5hdHRyVG9BcHBsaWVkUHJvamVjdG9yW3FdKX0pO24uYW5pbWF0b3IuYW5pbWF0ZSh0aGlzLl9zZWxlY3Rpb24sbi5hdHRyVG9BcHBsaWVkUHJvamVjdG9yKTtudWxsIT10aGlzLl9jbGFzc05hbWUmJnRoaXMuX3NlbGVjdGlvbi5jbGFzc2VkKHRoaXMuX2NsYXNzTmFtZSwKITApfTtyZXR1cm4ga30oKTtkLlNWR0RyYXdlcj1jfSxmdW5jdGlvbihjLGQpe2QubWFrZUVudW09ZnVuY3Rpb24oZil7cmV0dXJuIGYucmVkdWNlKGZ1bmN0aW9uKGcsbCl7Z1tsXT1sO3JldHVybiBnfSx7fSl9fSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAscSl7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHQgaW4gcSlxLmhhc093blByb3BlcnR5KHQpJiYocFt0XT1xW3RdKTtwLnByb3RvdHlwZT1udWxsPT09cT9PYmplY3QuY3JlYXRlKHEpOihyLnByb3RvdHlwZT1xLnByb3RvdHlwZSxuZXcgcil9LGw9ZigxKSxrPWYoMjYpLG49ZigwKTtjPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIHEoKXt2YXIgcj1wLmNhbGwodGhpcyl8fHRoaXM7ci5fdGlja0dlbmVyYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gdC5kZWZhdWx0VGlja3MoKX07ci5fcGFkUHJvcG9ydGlvbj0uMDU7ci5fc25hcHBpbmdEb21haW5FbmFibGVkPQohMDtyLl9wYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVycz1uZXcgbi5TZXQ7cmV0dXJuIHJ9ZyhxLHApO3EucHJvdG90eXBlLmF1dG9Eb21haW49ZnVuY3Rpb24oKXt0aGlzLl9kb21haW5NYXg9dGhpcy5fZG9tYWluTWluPW51bGw7cC5wcm90b3R5cGUuYXV0b0RvbWFpbi5jYWxsKHRoaXMpfTtxLnByb3RvdHlwZS5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZT1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuX2RvbWFpbk1pbiYmbnVsbCE9dGhpcy5fZG9tYWluTWF4KXRoaXMuX3NldERvbWFpbihbdGhpcy5fZG9tYWluTWluLHRoaXMuX2RvbWFpbk1heF0pO2Vsc2V7dmFyIHI9dGhpcy5fZ2V0RXh0ZW50KCk7bnVsbCE9dGhpcy5fZG9tYWluTWluPyhyPXJbMV0sdGhpcy5fZG9tYWluTWluPj1yJiYocj10aGlzLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbihbdGhpcy5fZG9tYWluTWluLHRoaXMuX2RvbWFpbk1pbl0pWzFdKSx0aGlzLl9zZXREb21haW4oW3RoaXMuX2RvbWFpbk1pbixyXSkpOgpudWxsIT10aGlzLl9kb21haW5NYXg/KHI9clswXSx0aGlzLl9kb21haW5NYXg8PXImJihyPXRoaXMuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluKFt0aGlzLl9kb21haW5NYXgsdGhpcy5fZG9tYWluTWF4XSlbMF0pLHRoaXMuX3NldERvbWFpbihbcix0aGlzLl9kb21haW5NYXhdKSk6cC5wcm90b3R5cGUuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUuY2FsbCh0aGlzKX19O3EucHJvdG90eXBlLl9nZXRVbmJvdW5kZWRFeHRlbnQ9ZnVuY3Rpb24ocil7dm9pZCAwPT09ciYmKHI9ITEpO3I9dGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMocik7dmFyIHQ9dGhpcy5fZGVmYXVsdEV4dGVudCgpOzAhPT1yLmxlbmd0aCYmKHI9W24uTWF0aC5taW4ocix0WzBdKSxuLk1hdGgubWF4KHIsdFsxXSldLHQ9dGhpcy5fcGFkRG9tYWluKHIpKTtyZXR1cm4gdH07cS5wcm90b3R5cGUuX2dldEV4dGVudD1mdW5jdGlvbigpe3ZhciByPXRoaXMuX2dldFVuYm91bmRlZEV4dGVudCgpO251bGwhPXRoaXMuX2RvbWFpbk1pbiYmCihyWzBdPXRoaXMuX2RvbWFpbk1pbik7bnVsbCE9dGhpcy5fZG9tYWluTWF4JiYoclsxXT10aGlzLl9kb21haW5NYXgpO3JldHVybiByfTtxLnByb3RvdHlwZS5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyPWZ1bmN0aW9uKHIpe3RoaXMuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzLmFkZChyKTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCl9O3EucHJvdG90eXBlLnJlbW92ZVBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXI9ZnVuY3Rpb24ocil7dGhpcy5fcGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcnMuZGVsZXRlKHIpO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKX07cS5wcm90b3R5cGUucGFkUHJvcG9ydGlvbj1mdW5jdGlvbihyKXtpZihudWxsPT1yKXJldHVybiB0aGlzLl9wYWRQcm9wb3J0aW9uO2lmKDA+cil0aHJvdyBFcnJvcigicGFkUHJvcG9ydGlvbiBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpO3RoaXMuX3BhZFByb3BvcnRpb249cjt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7CnJldHVybiB0aGlzfTtxLnByb3RvdHlwZS5fcGFkRG9tYWluPWZ1bmN0aW9uKHIpe3ZhciB0PXRoaXM7aWYoclswXS52YWx1ZU9mKCk9PT1yWzFdLnZhbHVlT2YoKSlyZXR1cm4gdGhpcy5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW4ocik7aWYoMD09PXRoaXMuX3BhZFByb3BvcnRpb24pcmV0dXJuIHI7dmFyIHY9dGhpcy5fcGFkUHJvcG9ydGlvbi8yLHk9clswXSx6PXJbMV0seD0hMSxDPSExO3RoaXMuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzLmZvckVhY2goZnVuY3Rpb24oRCl7RCh0KS5mb3JFYWNoKGZ1bmN0aW9uKEIpe0IudmFsdWVPZigpPT09eS52YWx1ZU9mKCkmJih4PSEwKTtCLnZhbHVlT2YoKT09PXoudmFsdWVPZigpJiYoQz0hMCl9KX0pO3ZhciBGPXRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpO3RoaXMuX2JhY2tpbmdTY2FsZURvbWFpbihyKTtyPXg/eTp0aGlzLmludmVydCh0aGlzLnNjYWxlKHkpLSh0aGlzLnNjYWxlKHopLXRoaXMuc2NhbGUoeSkpKnYpO3Y9Qz8Kejp0aGlzLmludmVydCh0aGlzLnNjYWxlKHopKyh0aGlzLnNjYWxlKHopLXRoaXMuc2NhbGUoeSkpKnYpO3RoaXMuX2JhY2tpbmdTY2FsZURvbWFpbihGKTtyZXR1cm4gdGhpcy5fc25hcHBpbmdEb21haW5FbmFibGVkP3RoaXMuX25pY2VEb21haW4oW3Isdl0pOltyLHZdfTtxLnByb3RvdHlwZS5zbmFwcGluZ0RvbWFpbkVuYWJsZWQ9ZnVuY3Rpb24ocil7bnVsbCE9ciYmKHRoaXMuX3NuYXBwaW5nRG9tYWluRW5hYmxlZD1yLHRoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKSl9O3EucHJvdG90eXBlLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbj1mdW5jdGlvbihyKXtyZXR1cm4gcn07cS5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGludmVydCIpO307cS5wcm90b3R5cGUuZG9tYWluPWZ1bmN0aW9uKHIpe251bGwhPXImJih0aGlzLl9kb21haW5NaW49clswXSx0aGlzLl9kb21haW5NYXg9clsxXSk7CnJldHVybiBwLnByb3RvdHlwZS5kb21haW4uY2FsbCh0aGlzLHIpfTtxLnByb3RvdHlwZS5kb21haW5NaW49ZnVuY3Rpb24ocil7aWYobnVsbD09cilyZXR1cm4gdGhpcy5kb21haW4oKVswXTt0aGlzLl9kb21haW5NaW49cjt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLmRvbWFpbk1heD1mdW5jdGlvbihyKXtpZihudWxsPT1yKXJldHVybiB0aGlzLmRvbWFpbigpWzFdO3RoaXMuX2RvbWFpbk1heD1yO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24ocil7cj1sLmV4dGVudChyLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gbi5NYXRoLmlzVmFsaWROdW1iZXIoK3QpfSkpO3JldHVybiBudWxsPT1yWzBdfHxudWxsPT1yWzFdP1tdOnJ9O3EucHJvdG90eXBlLnpvb209ZnVuY3Rpb24ocix0KXt2YXIgdj10aGlzO3RoaXMuZG9tYWluKHRoaXMucmFuZ2UoKS5tYXAoZnVuY3Rpb24oeSl7cmV0dXJuIHYuaW52ZXJ0KGsuem9vbU91dCh5LApyLHQpKX0pKX07cS5wcm90b3R5cGUucGFuPWZ1bmN0aW9uKHIpe3ZhciB0PXRoaXM7dGhpcy5kb21haW4odGhpcy5yYW5nZSgpLm1hcChmdW5jdGlvbih2KXtyZXR1cm4gdC5pbnZlcnQodityKX0pKX07cS5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBzY2FsZVRyYW5zZm9ybWF0aW9uIik7fTtxLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGludmVydGVkVHJhbnNmb3JtYXRpb24iKTt9O3EucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGdldFRyYW5zZm9ybWF0aW9uRXh0ZW50Iik7fTtxLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBnZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbiIpOwp9O3EucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHNldFRyYW5zZm9ybWF0aW9uRG9tYWluIik7fTtxLnByb3RvdHlwZS5fc2V0RG9tYWluPWZ1bmN0aW9uKHIpe2Z1bmN0aW9uIHQodil7cmV0dXJuIG4uTWF0aC5pc05hTih2KXx8SW5maW5pdHk9PT12fHwtSW5maW5pdHk9PT12fXQoclswXSl8fHQoclsxXSk/bi5XaW5kb3cud2FybigiV2FybmluZzogUXVhbnRpdGF0aXZlU2NhbGVzIGNhbm5vdCB0YWtlIE5hTiBvciBJbmZpbml0eSBhcyBhIGRvbWFpbiB2YWx1ZS4gSWdub3JpbmcuIik6cC5wcm90b3R5cGUuX3NldERvbWFpbi5jYWxsKHRoaXMscil9O3EucHJvdG90eXBlLmRlZmF1bHRUaWNrcz1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfZ2V0RGVmYXVsdFRpY2tzIik7fTtxLnByb3RvdHlwZS50aWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90aWNrR2VuZXJhdG9yKHRoaXMpfTsKcS5wcm90b3R5cGUuX25pY2VEb21haW49ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX25pY2VEb21haW4iKTt9O3EucHJvdG90eXBlLl9kZWZhdWx0RXh0ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIF9kZWZhdWx0RXh0ZW50Iik7fTtxLnByb3RvdHlwZS50aWNrR2VuZXJhdG9yPWZ1bmN0aW9uKCl7dmFyIHI9UGxvdHRhYmxlLlNjYWxlcy5UaWNrR2VuZXJhdG9ycy5pbnRlZ2VyVGlja0dlbmVyYXRvcigpO251bGwhPXImJih0aGlzLl90aWNrR2VuZXJhdG9yPXIpfTtyZXR1cm4gcX0oZigxNykuU2NhbGUpO2MuX0RFRkFVTFRfTlVNX1RJQ0tTPTEwO2QuUXVhbnRpdGF0aXZlU2NhbGU9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoMSk7ZC5jb2VyY2VFeHRlcm5hbEQzPWZ1bmN0aW9uKGwpe2lmKG51bGw9PWwuYXR0cnMpe2lmKG51bGw9PWwubm9kZXMpe3ZhciBrPVtdO2wuZWFjaChmdW5jdGlvbigpe2sucHVzaCh0aGlzKX0pOwpyZXR1cm4gZy5zZWxlY3RBbGwoayl9cmV0dXJuIGcuc2VsZWN0QWxsKGwubm9kZXMoKSl9cmV0dXJuIGx9fSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhsKXtmb3IodmFyIGsgaW4gbClkLmhhc093blByb3BlcnR5KGspfHwoZFtrXT1sW2tdKX1nKGYoODMpKTtnKGYoODQpKTtnKGYoODUpKX0sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcobCl7Zm9yKHZhciBrIGluIGwpZC5oYXNPd25Qcm9wZXJ0eShrKXx8KGRba109bFtrXSl9ZyhmKDQ0KSk7ZyhmKDQ1KSk7ZyhmKDQ2KSk7ZyhmKDE4KSk7ZyhmKDYpKTtnKGYoMzMpKTtnKGYoMzQpKTtnKGYoNDcpKTtnKGYoOSkpO2coZig0OCkpfSxmdW5jdGlvbihjLGQpe2M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBmKCl7dmFyIGc9dGhpczt0aGlzLl9hbmNob3JDYWxsYmFjaz1mdW5jdGlvbihsKXtyZXR1cm4gZy5fYW5jaG9yKGwpfTt0aGlzLl9lbmFibGVkPSEwfWYucHJvdG90eXBlLmF0dGFjaFRvPWZ1bmN0aW9uKGcpe3RoaXMuX2Rpc2Nvbm5lY3QoKTsKdGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbz1nO3RoaXMuX2Nvbm5lY3QoKTtyZXR1cm4gdGhpc307Zi5wcm90b3R5cGUuZGV0YWNoRnJvbT1mdW5jdGlvbigpe3RoaXMuZGV0YWNoKCl9O2YucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe3RoaXMuX2Rpc2Nvbm5lY3QoKTt0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvPW51bGw7cmV0dXJuIHRoaXN9O2YucHJvdG90eXBlLmVuYWJsZWQ9ZnVuY3Rpb24oZyl7aWYobnVsbD09ZylyZXR1cm4gdGhpcy5fZW5hYmxlZDsodGhpcy5fZW5hYmxlZD1nKT90aGlzLl9jb25uZWN0KCk6dGhpcy5fZGlzY29ubmVjdCgpO3JldHVybiB0aGlzfTtmLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZD0hMH07Zi5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZD0hMX07Zi5wcm90b3R5cGUuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2U9ZnVuY3Rpb24oZyl7dmFyIGw9dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby5vcmlnaW5Ub1Jvb3QoKTsKcmV0dXJue3g6Zy54LWwueCx5OmcueS1sLnl9fTtmLnByb3RvdHlwZS5faXNJbnNpZGVDb21wb25lbnQ9ZnVuY3Rpb24oZyl7cmV0dXJuIDA8PWcueCYmMDw9Zy55JiZnLng8PXRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ud2lkdGgoKSYmZy55PD10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLmhlaWdodCgpfTtmLnByb3RvdHlwZS5fY29ubmVjdD1mdW5jdGlvbigpe2lmKHRoaXMuZW5hYmxlZCgpJiZudWxsIT10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvJiYhdGhpcy5faXNBbmNob3JlZCl0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLm9uQW5jaG9yKHRoaXMuX2FuY2hvckNhbGxiYWNrKX07Zi5wcm90b3R5cGUuX2Rpc2Nvbm5lY3Q9ZnVuY3Rpb24oKXt0aGlzLl9pc0FuY2hvcmVkJiZ0aGlzLl91bmFuY2hvcigpO251bGwhPXRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8mJnRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ub2ZmQW5jaG9yKHRoaXMuX2FuY2hvckNhbGxiYWNrKX07cmV0dXJuIGZ9KCk7CmQuSW50ZXJhY3Rpb249Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihxLHIpe2Z1bmN0aW9uIHQoKXt0aGlzLmNvbnN0cnVjdG9yPXF9Zm9yKHZhciB2IGluIHIpci5oYXNPd25Qcm9wZXJ0eSh2KSYmKHFbdl09clt2XSk7cS5wcm90b3R5cGU9bnVsbD09PXI/T2JqZWN0LmNyZWF0ZShyKToodC5wcm90b3R5cGU9ci5wcm90b3R5cGUsbmV3IHQpfSxsPWYoMyksaz1mKDApLG49Zig1MikscD1mKDIpO2M9ZnVuY3Rpb24ocSl7ZnVuY3Rpb24gcigpe3ZhciB0PXEuY2FsbCh0aGlzKXx8dGhpczt0Ll9hdXRvQWRqdXN0WFNjYWxlRG9tYWluPSExO3QuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49ITE7dC5fZGVmZXJyZWRSZW5kZXJpbmc9ITE7dC5fYXBwbHlEZWZlcnJlZFJlbmRlcmluZ1RyYW5zZm9ybT1mdW5jdGlvbih2LHkseix4KXt0Ll9pc0FuY2hvcmVkJiYobnVsbCE9dC5fcmVuZGVyQXJlYSYmdC5fcmVuZGVyQXJlYS5hdHRyKCJ0cmFuc2Zvcm0iLAoidHJhbnNsYXRlKCIrdisiLCAiK3krIikgc2NhbGUoIit6KyIsICIreCsiKSIpLG51bGwhPXQuX2NhbnZhcyYmdC5fY2FudmFzLnN0eWxlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit2KyJweCwgIit5KyJweCkgc2NhbGUoIit6KyIsICIreCsiKSIpKX07dC5hZGRDbGFzcygieHktcGxvdCIpO3QuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gdC5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVgoKX07dC5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVlDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiB0Ll9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWSgpfTt0Ll9yZW5kZXJDYWxsYmFjaz1mdW5jdGlvbigpe2lmKHQuZGVmZXJyZWRSZW5kZXJpbmcoKSl7dmFyIHY9dC54KCkmJnQueCgpLnNjYWxlLHk9dC55KCkmJnQueSgpLnNjYWxlO3QuX2RlZmVycmVkUmVuZGVyZXIudXBkYXRlRG9tYWlucyh2LHkpfWVsc2UgdC5yZW5kZXIoKX07CnQuX2RlZmVycmVkUmVuZGVyZXI9bmV3IG4uRGVmZXJyZWRSZW5kZXJlcihmdW5jdGlvbigpe3JldHVybiB0LnJlbmRlcigpfSx0Ll9hcHBseURlZmVycmVkUmVuZGVyaW5nVHJhbnNmb3JtKTtyZXR1cm4gdH1nKHIscSk7ci5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dGhpcy5kZWZlcnJlZFJlbmRlcmluZygpJiZ0aGlzLl9kZWZlcnJlZFJlbmRlcmVyLnJlc2V0VHJhbnNmb3JtcygpO3JldHVybiBxLnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzKX07ci5wcm90b3R5cGUuZGVmZXJyZWRSZW5kZXJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVmZXJyZWRSZW5kZXJpbmd9O3IucHJvdG90eXBlLng9ZnVuY3Rpb24odCx2LHkpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHIuX1hfS0VZKTt0aGlzLl9iaW5kUHJvcGVydHkoci5fWF9LRVksdCx2LHkpO3Q9dGhpcy53aWR0aCgpO251bGwhPXYmJm51bGwhPXQmJnYucmFuZ2UoWzAsdF0pOwp0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW4oKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS55PWZ1bmN0aW9uKHQsdix5KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChyLl9ZX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KHIuX1lfS0VZLHQsdix5KTt0PXRoaXMuaGVpZ2h0KCk7bnVsbCE9diYmbnVsbCE9dCYmKHYgaW5zdGFuY2VvZiBsLkNhdGVnb3J5P3YucmFuZ2UoWzAsdF0pOnYucmFuZ2UoW3QsMF0pKTt0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVYRXh0ZW50c0FuZEF1dG9kb21haW4oKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24odCl7cmV0dXJuIngiPT09dCYmdGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj90aGlzLl9tYWtlRmlsdGVyQnlQcm9wZXJ0eSgieSIpOgoieSI9PT10JiZ0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluP3RoaXMuX21ha2VGaWx0ZXJCeVByb3BlcnR5KCJ4Iik6bnVsbH07ci5wcm90b3R5cGUuX21ha2VGaWx0ZXJCeVByb3BlcnR5PWZ1bmN0aW9uKHQpe3Q9dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQodCk7aWYobnVsbCE9dCl7dmFyIHY9dC5hY2Nlc3Nvcix5PXQuc2NhbGU7aWYobnVsbCE9eSlyZXR1cm4gZnVuY3Rpb24oeix4LEMpe3ZhciBGPXkucmFuZ2UoKTtyZXR1cm4gay5NYXRoLmluUmFuZ2UoeS5zY2FsZSh2KHoseCxDKSksRlswXSxGWzFdKX19cmV0dXJuIG51bGx9O3IucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbih0LHYpe3EucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleS5jYWxsKHRoaXMsdCx2KTt0Lm9mZlVwZGF0ZSh2PT09ci5fWF9LRVk/dGhpcy5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVhDYWxsYmFjazp0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWUNhbGxiYWNrKX07CnIucHJvdG90eXBlLl9pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24odCx2KXtxLnByb3RvdHlwZS5faW5zdGFsbFNjYWxlRm9yS2V5LmNhbGwodGhpcyx0LHYpO3Qub25VcGRhdGUodj09PXIuX1hfS0VZP3RoaXMuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YQ2FsbGJhY2s6dGhpcy5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVlDYWxsYmFjayl9O3IucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtxLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy54KCkuc2NhbGUmJnRoaXMueCgpLnNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWENhbGxiYWNrKTt0aGlzLnkoKS5zY2FsZSYmdGhpcy55KCkuc2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZQ2FsbGJhY2spO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW4/CiJ4Ijp0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluPyJ5Ijoibm9uZSI7c3dpdGNoKHQpe2Nhc2UgIngiOnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW49ITA7dGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj0hMTt0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWSgpO2JyZWFrO2Nhc2UgInkiOnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW49ITE7dGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj0hMDt0aGlzLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWCgpO2JyZWFrO2Nhc2UgIm5vbmUiOnRoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49dGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj0hMTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJJbnZhbGlkIHNjYWxlIG5hbWUgJyIrdCsiJywgbXVzdCBiZSAneCcsICd5JyBvciAnbm9uZSciKTt9cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24odCx2LHkpe3EucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLAp0LHYseSk7dD0odD10aGlzLngoKSkmJnQuc2NhbGU7bnVsbCE9dCYmdC5yYW5nZShbMCx0aGlzLndpZHRoKCldKTt0PSh0PXRoaXMueSgpKSYmdC5zY2FsZTtudWxsIT10JiYodCBpbnN0YW5jZW9mIGwuQ2F0ZWdvcnk/dC5yYW5nZShbMCx0aGlzLmhlaWdodCgpXSk6dC5yYW5nZShbdGhpcy5oZWlnaHQoKSwwXSkpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy54KCkuc2NhbGU7bnVsbCE9dCYmdC5hdXRvRG9tYWluKCl9O3IucHJvdG90eXBlLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW49ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnkoKS5zY2FsZTtudWxsIT10JiZ0LmF1dG9Eb21haW4oKX07ci5wcm90b3R5cGUuc2hvd0FsbERhdGE9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVYRXh0ZW50c0FuZEF1dG9kb21haW4oKTt0aGlzLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW4oKTtyZXR1cm4gdGhpc307CnIucHJvdG90eXBlLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWD1mdW5jdGlvbigpe3RoaXMuX3Byb2plY3RvcnNSZWFkeSgpJiZ0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW4oKX07ci5wcm90b3R5cGUuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZPWZ1bmN0aW9uKCl7dGhpcy5fcHJvamVjdG9yc1JlYWR5KCkmJnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW4mJnRoaXMuX3VwZGF0ZVhFeHRlbnRzQW5kQXV0b2RvbWFpbigpfTtyLnByb3RvdHlwZS5fcHJvamVjdG9yc1JlYWR5PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy54KCksdj10aGlzLnkoKTtyZXR1cm4gbnVsbCE9dCYmbnVsbCE9dC5hY2Nlc3NvciYmbnVsbCE9diYmbnVsbCE9di5hY2Nlc3Nvcn07ci5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24odCx2LHkpe3ZhciB6PXAuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHg9cC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7CnJldHVybnt4OnoodCx2LHkpLHk6eCh0LHYseSl9fTtyLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoeix4LEMpe3ZhciBGPXAuUGxvdC5fc2NhbGVkQWNjZXNzb3Iodi54KCkpKHoseCxDKTt6PXAuUGxvdC5fc2NhbGVkQWNjZXNzb3Iodi55KCkpKHoseCxDKTtyZXR1cm4gay5NYXRoLmlzVmFsaWROdW1iZXIoRikmJmsuTWF0aC5pc1ZhbGlkTnVtYmVyKHopfXZhciB2PXRoaXMseT1xLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdy5jYWxsKHRoaXMpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKHope3kuc2V0KHoseS5nZXQoeikuZmlsdGVyKGZ1bmN0aW9uKHgsQyl7cmV0dXJuIHQoeCxDLHopfSkpfSk7cmV0dXJuIHl9O3JldHVybiByfShwLlBsb3QpO2MuX1hfS0VZPSJ4IjtjLl9ZX0tFWT0ieSI7ZC5YWVBsb3Q9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoMCk7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGwoKXt0aGlzLl9hdXRvRG9tYWluQXV0b21hdGljYWxseT0KITA7dGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzcz0hMTt0aGlzLl91cGRhdGVJZD0wO3RoaXMuX2NhbGxiYWNrcz1uZXcgZy5DYWxsYmFja1NldDt0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVycz1uZXcgZy5TZXR9bC5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm5bXX07bC5wcm90b3R5cGUuX2dldEFsbEluY2x1ZGVkVmFsdWVzPWZ1bmN0aW9uKGspe3ZhciBuPXRoaXM7dm9pZCAwPT09ayYmKGs9ITEpO3ZhciBwPVtdO3RoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXJzLmZvckVhY2goZnVuY3Rpb24ocSl7cT1xKG4sayk7cD1wLmNvbmNhdChxKX0pO3JldHVybiBwfTtsLnByb3RvdHlwZS5fZ2V0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuW119O2wucHJvdG90eXBlLm9uVXBkYXRlPWZ1bmN0aW9uKGspe3RoaXMuX2NhbGxiYWNrcy5hZGQoayk7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLm9mZlVwZGF0ZT1mdW5jdGlvbihrKXt0aGlzLl9jYWxsYmFja3MuZGVsZXRlKGspOwpyZXR1cm4gdGhpc307bC5wcm90b3R5cGUuX2Rpc3BhdGNoVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSWQrKzt0aGlzLl9jYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKX07bC5wcm90b3R5cGUuYXV0b0RvbWFpbj1mdW5jdGlvbigpe3RoaXMuX2F1dG9Eb21haW5BdXRvbWF0aWNhbGx5PSEwO3RoaXMuX3NldERvbWFpbih0aGlzLl9nZXRFeHRlbnQoKSl9O2wucHJvdG90eXBlLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlPWZ1bmN0aW9uKCl7dGhpcy5fYXV0b0RvbWFpbkF1dG9tYXRpY2FsbHkmJnRoaXMuYXV0b0RvbWFpbigpfTtsLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBzY2FsZSIpO307bC5wcm90b3R5cGUudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21haW4oKX07bC5wcm90b3R5cGUuZG9tYWluPWZ1bmN0aW9uKGspe2lmKG51bGw9PWspcmV0dXJuIHRoaXMuX2dldERvbWFpbigpOwp0aGlzLl9hdXRvRG9tYWluQXV0b21hdGljYWxseT0hMTt0aGlzLl9zZXREb21haW4oayk7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2dldERvbWFpbiIpO307bC5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihrKXt0aGlzLl9kb21haW5Nb2RpZmljYXRpb25JblByb2dyZXNzfHwodGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzcz0hMCx0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oayksdGhpcy5fZGlzcGF0Y2hVcGRhdGUoKSx0aGlzLl9kb21haW5Nb2RpZmljYXRpb25JblByb2dyZXNzPSExKX07bC5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfYmFja2luZ0RvbWFpbiIpO307bC5wcm90b3R5cGUucmFuZ2U9ZnVuY3Rpb24oayl7aWYobnVsbD09aylyZXR1cm4gdGhpcy5fZ2V0UmFuZ2UoKTsKdGhpcy5fc2V0UmFuZ2Uoayk7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfZ2V0UmFuZ2UiKTt9O2wucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfc2V0UmFuZ2UiKTt9O2wucHJvdG90eXBlLmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXI9ZnVuY3Rpb24oayl7dGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcnMuYWRkKGspO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKTtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUucmVtb3ZlSW5jbHVkZWRWYWx1ZXNQcm92aWRlcj1mdW5jdGlvbihrKXt0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVycy5kZWxldGUoayk7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpfTtsLnByb3RvdHlwZS51cGRhdGVJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl91cGRhdGVJZH07CnJldHVybiBsfSgpO2QuU2NhbGU9Y30sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcocix0LHYseSl7Zm9yKHZhciB6PXt9LHg9MDt4PHQubGVuZ3RoO3grKyl7dmFyIEM9dFt4XTtyLmhhc093blByb3BlcnR5KEMpJiYoeltDXT1yW0NdKHYseSkpfXJldHVybiB6fWZ1bmN0aW9uIGwocil7cmV0dXJuKG51bGwhPXJbInN0cm9rZS1vcGFjaXR5Il0/cGFyc2VGbG9hdChyWyJzdHJva2Utb3BhY2l0eSJdKToxKSoobnVsbCE9ci5vcGFjaXR5P3BhcnNlRmxvYXQoci5vcGFjaXR5KToxKX1mdW5jdGlvbiBrKHIpe3JldHVybihudWxsIT1yWyJmaWxsLW9wYWNpdHkiXT9wYXJzZUZsb2F0KHJbImZpbGwtb3BhY2l0eSJdKToxKSoobnVsbCE9ci5vcGFjaXR5P3BhcnNlRmxvYXQoci5vcGFjaXR5KToxKX1mdW5jdGlvbiBuKHIpe3JldHVybiBudWxsIT1yWyJzdHJva2Utd2lkdGgiXT9wYXJzZUZsb2F0KHJbInN0cm9rZS13aWR0aCJdKToxfWZ1bmN0aW9uIHAocix0KXtpZih0LnN0cm9rZSl7ci5saW5lV2lkdGg9Cm4odCk7dmFyIHY9cS5jb2xvcih0LnN0cm9rZSk7di5vcGFjaXR5Kj1sKHQpO3Iuc3Ryb2tlU3R5bGU9di50b1N0cmluZygpO3Iuc3Ryb2tlKCl9dC5maWxsJiYodj1xLmNvbG9yKHQuZmlsbCksdi5vcGFjaXR5Kj1rKHQpLHIuZmlsbFN0eWxlPXYudG9TdHJpbmcoKSxyLmZpbGwoKSl9dmFyIHE9ZigxKTtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcih0LHYpe3RoaXMuX2NvbnRleHQ9dDt0aGlzLl9kcmF3U3RlcD12fXIucHJvdG90eXBlLmdldERyYXdTdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYXdTdGVwfTtyLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKHQsdil7dj12W3YubGVuZ3RoLTFdLmF0dHJUb0FwcGxpZWRQcm9qZWN0b3I7dGhpcy5fY29udGV4dC5zYXZlKCk7dGhpcy5fZHJhd1N0ZXAodGhpcy5fY29udGV4dCx0LHYpO3RoaXMuX2NvbnRleHQucmVzdG9yZSgpfTtyLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVzPWZ1bmN0aW9uKCl7cmV0dXJuW119O3IucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9CmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9O3IucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe307cmV0dXJuIHJ9KCk7ZC5DYW52YXNEcmF3ZXI9YztkLkNvbnRleHRTdHlsZUF0dHJzPSJmaWxsLW9wYWNpdHkgZmlsbCBvcGFjaXR5IHN0cm9rZS1vcGFjaXR5IHN0cm9rZS13aWR0aCBzdHJva2UiLnNwbGl0KCIgIik7ZC5yZXNvbHZlQXR0cmlidXRlc1N1YnNldFdpdGhTdHlsZXM9ZnVuY3Rpb24ocix0LHYseSl7cmV0dXJuIGcocixkLkNvbnRleHRTdHlsZUF0dHJzLmNvbmNhdCh0KSx2LHkpfTtkLnJlc29sdmVBdHRyaWJ1dGVzPWc7ZC5nZXRTdHJva2VXaWR0aD1uO2QucmVuZGVyQXJlYT1mdW5jdGlvbihyLHQsdix5KXtyLnNhdmUoKTtyLmJlZ2luUGF0aCgpO3QuY29udGV4dChyKTt0KHYpO3IubGluZUpvaW49InJvdW5kIjtwKHIseSk7ci5yZXN0b3JlKCl9O2QucmVuZGVyTGluZT1mdW5jdGlvbihyLHQsdix5KXtyLnNhdmUoKTtyLmJlZ2luUGF0aCgpO3QuY29udGV4dChyKTt0KHYpOwpyLmxpbmVKb2luPSJyb3VuZCI7cChyLHkpO3IucmVzdG9yZSgpfTtkLnJlbmRlclBhdGhXaXRoU3R5bGU9cH0sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcobCl7Zm9yKHZhciBrIGluIGwpZC5oYXNPd25Qcm9wZXJ0eShrKXx8KGRba109bFtrXSl9ZyhmKDUwKSk7ZyhmKDI3KSk7ZyhmKDUxKSk7ZyhmKDkzKSk7ZyhmKDUzKSk7ZyhmKDk0KSk7ZyhmKDk1KSk7ZyhmKDk2KSk7ZyhmKDk3KSk7ZyhmKDk4KSk7ZyhmKDk5KSk7ZyhmKDEwMCkpfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhsKXtmb3IodmFyIGsgaW4gbClkLmhhc093blByb3BlcnR5KGspfHwoZFtrXT1sW2tdKX1nKGYoOTIpKTtnKGYoOTEpKTtjPWYoNDkpO2Quc2lnbj1jLnNpZ259LGZ1bmN0aW9uKGMsZCxmKXtmdW5jdGlvbiBnKGwpe2Zvcih2YXIgayBpbiBsKWQuaGFzT3duUHJvcGVydHkoayl8fChkW2tdPWxba10pfWcoZigxMzQpKTtnKGYoMTM1KSk7ZyhmKDEzNikpO2coZigxMzcpKX0sZnVuY3Rpb24oYywKZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocSxyKXtmdW5jdGlvbiB0KCl7dGhpcy5jb25zdHJ1Y3Rvcj1xfWZvcih2YXIgdiBpbiByKXIuaGFzT3duUHJvcGVydHkodikmJihxW3ZdPXJbdl0pO3EucHJvdG90eXBlPW51bGw9PT1yP09iamVjdC5jcmVhdGUocik6KHQucHJvdG90eXBlPXIucHJvdG90eXBlLG5ldyB0KX0sbD1mKDEpLGs9Zig1KTtjPWYoNCk7dmFyIG49Zig4KSxwPWYoMCk7Zj1mKDEwKTtkLkF4aXNPcmllbnRhdGlvbj1mLm1ha2VFbnVtKFsiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwidG9wIl0pO2Y9ZnVuY3Rpb24ocSl7ZnVuY3Rpb24gcih0LHYpe3ZhciB5PXEuY2FsbCh0aGlzKXx8dGhpczt5Ll9lbmRUaWNrTGVuZ3RoPTU7eS5faW5uZXJUaWNrTGVuZ3RoPTU7eS5fdGlja0xhYmVsUGFkZGluZz0xMDt5Ll9tYXJnaW49MTU7eS5fc2hvd0VuZFRpY2tMYWJlbHM9ITE7eS5fYW5ub3RhdGlvbnNFbmFibGVkPSExO3kuX2Fubm90YXRpb25UaWVyQ291bnQ9CjE7aWYobnVsbD09dHx8bnVsbD09dil0aHJvdyBFcnJvcigiQXhpcyByZXF1aXJlcyBhIHNjYWxlIGFuZCBvcmllbnRhdGlvbiIpO3kuX3NjYWxlPXQ7eS5vcmllbnRhdGlvbih2KTt5Ll9zZXREZWZhdWx0QWxpZ25tZW50KCk7eS5hZGRDbGFzcygiYXhpcyIpO3kuaXNIb3Jpem9udGFsKCk/eS5hZGRDbGFzcygieC1heGlzIik6eS5hZGRDbGFzcygieS1heGlzIik7eS5mb3JtYXR0ZXIobi5pZGVudGl0eSgpKTt5Ll9yZXNjYWxlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4geS5fcmVzY2FsZSgpfTt5Ll9zY2FsZS5vblVwZGF0ZSh5Ll9yZXNjYWxlQ2FsbGJhY2spO3kuX2Fubm90YXRlZFRpY2tzPVtdO3kuX2Fubm90YXRpb25Gb3JtYXR0ZXI9bi5pZGVudGl0eSgpO3JldHVybiB5fWcocixxKTtyLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7cS5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX3NjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZXNjYWxlQ2FsbGJhY2spfTsKci5wcm90b3R5cGUudGlja0xhYmVsRGF0YU9uRWxlbWVudD1mdW5jdGlvbih0KXtpZihudWxsIT10KXtmb3IodmFyIHY7bnVsbCE9dCYmdC5jbGFzc0xpc3QmJnZvaWQgMD09PXY7KXQuY2xhc3NMaXN0LmNvbnRhaW5zKHIuVElDS19MQUJFTF9DTEFTUyk/dj10OnQ9dC5wYXJlbnROb2RlO3JldHVybiB2b2lkIDA9PT10P3ZvaWQgMDpsLnNlbGVjdCh0KS5kYXR1bSgpfX07ci5wcm90b3R5cGUuX2NvbXB1dGVXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKX07ci5wcm90b3R5cGUuX2NvbXB1dGVIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCl9O3IucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKCl7dmFyIHQ9MCx2PTA7aWYodGhpcy5pc0hvcml6b250YWwoKSl7aWYodj10aGlzLl9jb21wdXRlSGVpZ2h0KCkrdGhpcy5fbWFyZ2luLHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkpe3ZhciB5PQp0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCsyKnIuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORzt2Kz15KnRoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpfX1lbHNlIHQ9dGhpcy5fY29tcHV0ZVdpZHRoKCkrdGhpcy5fbWFyZ2luLHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkmJih5PXRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqci5fQU5OT1RBVElPTl9MQUJFTF9QQURESU5HLHQrPXkqdGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCkpO3JldHVybnttaW5XaWR0aDp0LG1pbkhlaWdodDp2fX07ci5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0hvcml6b250YWwoKX07ci5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzSG9yaXpvbnRhbCgpfTtyLnByb3RvdHlwZS5fcmVzY2FsZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyKCl9O3IucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9CmZ1bmN0aW9uKHQsdix5KXtxLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyx0LHYseSk7dGhpcy5pc0hvcml6b250YWwoKT90aGlzLl9zY2FsZS5yYW5nZShbMCx0aGlzLndpZHRoKCldKTp0aGlzLl9zY2FsZS5yYW5nZShbdGhpcy5oZWlnaHQoKSwwXSk7cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHQsdil7dmFyIHk9dGhpcy5yZXF1ZXN0ZWRTcGFjZSh0LHYpO3JldHVybiB0aGlzLmlzSG9yaXpvbnRhbCgpP3t3aWR0aDp0LGhlaWdodDp5Lm1pbkhlaWdodH06e2hlaWdodDp2LHdpZHRoOnkubWluV2lkdGh9fTtyLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtxLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl90aWNrTWFya0NvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKHIuVElDS19NQVJLX0NMQVNTKyItY29udGFpbmVyIiwhMCk7dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyPQp0aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKHIuVElDS19MQUJFTF9DTEFTUysiLWNvbnRhaW5lciIsITApO3RoaXMuX2Jhc2VsaW5lPXRoaXMuY29udGVudCgpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImJhc2VsaW5lIiwhMCk7dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLWNvbnRhaW5lciIsITApO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1saW5lLWNvbnRhaW5lciIsITApO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1jaXJjbGUtY29udGFpbmVyIiwhMCk7dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLXJlY3QtY29udGFpbmVyIiwhMCk7dmFyIHQ9dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLWxhYmVsLWNvbnRhaW5lciIsCiEwKTt0PW5ldyBrLlN2Z0NvbnRleHQodC5ub2RlKCkpO3RoaXMuX2Fubm90YXRpb25NZWFzdXJlcj1uZXcgay5DYWNoZU1lYXN1cmVyKHQpO3RoaXMuX2Fubm90YXRpb25Xcml0ZXI9bmV3IGsuV3JpdGVyKHRoaXMuX2Fubm90YXRpb25NZWFzdXJlcix0KX07ci5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm5bXX07ci5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9nZXRUaWNrVmFsdWVzKCksdj10aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3IuVElDS19NQVJLX0NMQVNTKS5kYXRhKHQpLHk9di5lbnRlcigpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoci5USUNLX01BUktfQ0xBU1MsITApLm1lcmdlKHYpO3kuYXR0cnModGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCkpO2wuc2VsZWN0KHkubm9kZXMoKVswXSkuY2xhc3NlZChyLkVORF9USUNLX01BUktfQ0xBU1MsITApLmF0dHJzKHRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCghMCkpOwpsLnNlbGVjdCh5Lm5vZGVzKClbdC5sZW5ndGgtMV0pLmNsYXNzZWQoci5FTkRfVElDS19NQVJLX0NMQVNTLCEwKS5hdHRycyh0aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goITApKTt2LmV4aXQoKS5yZW1vdmUoKTt0aGlzLl9iYXNlbGluZS5hdHRycyh0aGlzLl9nZW5lcmF0ZUJhc2VsaW5lQXR0ckhhc2goKSk7dGhpcy5hbm5vdGF0aW9uc0VuYWJsZWQoKT90aGlzLl9kcmF3QW5ub3RhdGlvbnMoKTp0aGlzLl9yZW1vdmVBbm5vdGF0aW9ucygpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5hbm5vdGF0ZWRUaWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbm5vdGF0ZWRUaWNrc307ci5wcm90b3R5cGUuYW5ub3RhdGlvbkZvcm1hdHRlcj1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9hbm5vdGF0aW9uRm9ybWF0dGVyO3RoaXMuX2Fubm90YXRpb25Gb3JtYXR0ZXI9dDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5hbm5vdGF0aW9uc0VuYWJsZWQ9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fubm90YXRpb25zRW5hYmxlZH07ci5wcm90b3R5cGUuYW5ub3RhdGlvblRpZXJDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbm5vdGF0aW9uVGllckNvdW50fTtyLnByb3RvdHlwZS5fZHJhd0Fubm90YXRpb25zPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChiYSl7c3dpdGNoKEMub3JpZW50YXRpb24oKSl7Y2FzZSAiYm90dG9tIjpjYXNlICJyaWdodCI6cmV0dXJuIHooYmEpO2Nhc2UgInRvcCI6Y2FzZSAibGVmdCI6cmV0dXJuIHooYmEpLUQuZ2V0KGJhKS5oZWlnaHR9fWZ1bmN0aW9uIHYoYmEpe3JldHVybiBQLmhhcyhiYSk/ImhpZGRlbiI6InZpc2libGUifWZ1bmN0aW9uIHkoYmEpe3JldHVybiBDLl9zY2FsZS5zY2FsZShiYSl9ZnVuY3Rpb24geihiYSl7c3dpdGNoKEMub3JpZW50YXRpb24oKSl7Y2FzZSAiYm90dG9tIjpjYXNlICJyaWdodCI6cmV0dXJuIE8uZ2V0KGJhKSpJK0s7Y2FzZSAidG9wIjpjYXNlICJsZWZ0IjpyZXR1cm4gSC0KSy1PLmdldChiYSkqSX19ZnVuY3Rpb24geChiYSxtYSxhYSl7YmE9YmEuc2VsZWN0QWxsKCIuIithYSkuZGF0YShCKTttYT1iYS5lbnRlcigpLmFwcGVuZChtYSkuY2xhc3NlZChhYSwhMCkubWVyZ2UoYmEpO2JhLmV4aXQoKS5yZW1vdmUoKTtyZXR1cm4gbWF9dmFyIEM9dGhpcyxGPXIuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORyxEPW5ldyBwLk1hcCxCPXRoaXMuX2Fubm90YXRlZFRpY2tzVG9SZW5kZXIoKTtCLmZvckVhY2goZnVuY3Rpb24oYmEpe3ZhciBtYT1DLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZShDLmFubm90YXRpb25Gb3JtYXR0ZXIoKShiYSkpO0Quc2V0KGJhLHt3aWR0aDptYS53aWR0aCsyKkYsaGVpZ2h0Om1hLmhlaWdodCsyKkZ9KX0pO3ZhciBJPXRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqRixPPXRoaXMuX2Fubm90YXRpb25Ub1RpZXIoRCksUD1uZXcgcC5TZXQsSD10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuaGVpZ2h0KCk6CnRoaXMud2lkdGgoKSxLPXRoaXMuX2NvcmVTaXplKCksTT1NYXRoLm1pbih0aGlzLmFubm90YXRpb25UaWVyQ291bnQoKSxNYXRoLmZsb29yKChILUspL0kpKTtPLmZvckVhY2goZnVuY3Rpb24oYmEsbWEpeygtMT09PWJhfHxiYT49TSkmJlAuYWRkKG1hKX0pO3N3aXRjaCh0aGlzLm9yaWVudGF0aW9uKCkpe2Nhc2UgImJvdHRvbSI6Y2FzZSAicmlnaHQiOnZhciBMPTA7YnJlYWs7Y2FzZSAidG9wIjpMPXRoaXMuaGVpZ2h0KCk7YnJlYWs7Y2FzZSAibGVmdCI6TD10aGlzLndpZHRoKCl9dmFyIFI9dGhpcy5pc0hvcml6b250YWwoKTt4KHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1saW5lLWNvbnRhaW5lciIpLCJsaW5lIixyLkFOTk9UQVRJT05fTElORV9DTEFTUykuYXR0cnMoe3gxOlI/eTpMLHgyOlI/eTp6LHkxOlI/TDp5LHkyOlI/ejp5LHZpc2liaWxpdHk6dn0pO3godGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3QoIi5hbm5vdGF0aW9uLWNpcmNsZS1jb250YWluZXIiKSwKImNpcmNsZSIsci5BTk5PVEFUSU9OX0NJUkNMRV9DTEFTUykuYXR0cnMoe2N4OlI/eTpMLGN5OlI/TDp5LHI6M30pO3godGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3QoIi5hbm5vdGF0aW9uLXJlY3QtY29udGFpbmVyIiksInJlY3QiLHIuQU5OT1RBVElPTl9SRUNUX0NMQVNTKS5hdHRycyh7eDpSP3k6dCx5OlI/dDp5LHdpZHRoOlI/ZnVuY3Rpb24oYmEpe3JldHVybiBELmdldChiYSkud2lkdGh9OmZ1bmN0aW9uKGJhKXtyZXR1cm4gRC5nZXQoYmEpLmhlaWdodH0saGVpZ2h0OlI/ZnVuY3Rpb24oYmEpe3JldHVybiBELmdldChiYSkuaGVpZ2h0fTpmdW5jdGlvbihiYSl7cmV0dXJuIEQuZ2V0KGJhKS53aWR0aH0sdmlzaWJpbGl0eTp2fSk7dmFyIFU9dGhpcy5fYW5ub3RhdGlvbldyaXRlcixZPXRoaXMuYW5ub3RhdGlvbkZvcm1hdHRlcigpO0w9eCh0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdCgiLmFubm90YXRpb24tbGFiZWwtY29udGFpbmVyIiksImciLHIuQU5OT1RBVElPTl9MQUJFTF9DTEFTUyk7Ckwuc2VsZWN0QWxsKCIudGV4dC1jb250YWluZXIiKS5yZW1vdmUoKTtMLmF0dHJzKHt0cmFuc2Zvcm06ZnVuY3Rpb24oYmEpe3ZhciBtYT1SP3koYmEpOnQoYmEpO2JhPVI/dChiYSk6eShiYSk7cmV0dXJuInRyYW5zbGF0ZSgiK21hKyIsIitiYSsiKSJ9LHZpc2liaWxpdHk6dn0pLmVhY2goZnVuY3Rpb24oYmEpe1Uud3JpdGUoWShiYSksUj9ELmdldChiYSkud2lkdGg6RC5nZXQoYmEpLmhlaWdodCxSP0QuZ2V0KGJhKS5oZWlnaHQ6RC5nZXQoYmEpLndpZHRoLHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIiLHRleHRSb3RhdGlvbjpSPzA6OTB9LGwuc2VsZWN0KHRoaXMpLm5vZGUoKSl9KX07ci5wcm90b3R5cGUuX2Fubm90YXRlZFRpY2tzVG9SZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLHY9dGhpcy5fc2NhbGUucmFuZ2UoKTtyZXR1cm4gcC5BcnJheS51bmlxKHRoaXMuYW5ub3RhdGVkVGlja3MoKS5maWx0ZXIoZnVuY3Rpb24oeSl7cmV0dXJuIG51bGw9PXk/ITE6cC5NYXRoLmluUmFuZ2UodC5fc2NhbGUuc2NhbGUoeSksCnZbMF0sdlsxXSl9KSl9O3IucHJvdG90eXBlLl9jb3JlU2l6ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLndpZHRoKCksdj10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuX2NvbXB1dGVIZWlnaHQoKTp0aGlzLl9jb21wdXRlV2lkdGgoKTtyZXR1cm4gTWF0aC5taW4odix0KX07ci5wcm90b3R5cGUuX2Fubm90YXRpb25UaWVySGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqci5fQU5OT1RBVElPTl9MQUJFTF9QQURESU5HfTtyLnByb3RvdHlwZS5fYW5ub3RhdGlvblRvVGllcj1mdW5jdGlvbih0KXt2YXIgdj10aGlzLHk9W1tdXSx6PW5ldyBwLk1hcCx4PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy53aWR0aCgpOnRoaXMuaGVpZ2h0KCk7dGhpcy5fYW5ub3RhdGVkVGlja3NUb1JlbmRlcigpLmZvckVhY2goZnVuY3Rpb24oQyl7dmFyIEY9di5fc2NhbGUuc2NhbGUoQyksCkQ9dC5nZXQoQykud2lkdGg7aWYoMD5GfHxGK0Q+eCl6LnNldChDLC0xKTtlbHNle2Zvcih2YXIgQj1mdW5jdGlvbihPKXtyZXR1cm4geVtPXS5zb21lKGZ1bmN0aW9uKFApe3ZhciBIPXYuX3NjYWxlLnNjYWxlKFApO1A9dC5nZXQoUCkud2lkdGg7cmV0dXJuIEYrRD49SCYmRjw9SCtQfSl9LEk9MDtCKEkpOylJKysseS5sZW5ndGg9PT1JJiZ5LnB1c2goW10pO3lbSV0ucHVzaChDKTt6LnNldChDLEkpfX0pO3JldHVybiB6fTtyLnByb3RvdHlwZS5fcmVtb3ZlQW5ub3RhdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tbGluZSIpLnJlbW92ZSgpO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0QWxsKCIuYW5ub3RhdGlvbi1jaXJjbGUiKS5yZW1vdmUoKTt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tcmVjdCIpLnJlbW92ZSgpO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0QWxsKCIuYW5ub3RhdGlvbi1sYWJlbCIpLnJlbW92ZSgpfTsKci5wcm90b3R5cGUuX2dlbmVyYXRlQmFzZWxpbmVBdHRySGFzaD1mdW5jdGlvbigpe3ZhciB0PXt4MTowLHkxOjAseDI6MCx5MjowfTtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6dC54Mj10aGlzLndpZHRoKCk7YnJlYWs7Y2FzZSAidG9wIjp0LngyPXRoaXMud2lkdGgoKTt0LnkxPXRoaXMuaGVpZ2h0KCk7dC55Mj10aGlzLmhlaWdodCgpO2JyZWFrO2Nhc2UgImxlZnQiOnQueDE9dGhpcy53aWR0aCgpO3QueDI9dGhpcy53aWR0aCgpO3QueTI9dGhpcy5oZWlnaHQoKTticmVhaztjYXNlICJyaWdodCI6dC55Mj10aGlzLmhlaWdodCgpfXJldHVybiB0fTtyLnByb3RvdHlwZS5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHYoeCl7cmV0dXJuIHkuX3NjYWxlLnNjYWxlKHgpfXZhciB5PXRoaXM7dm9pZCAwPT09dCYmKHQ9ITEpO3ZhciB6PXt4MTowLHkxOjAseDI6MCx5MjowfTt0aGlzLmlzSG9yaXpvbnRhbCgpPyh6LngxPQp2LHoueDI9dik6KHoueTE9dix6LnkyPXYpO3Q9dD90aGlzLl9lbmRUaWNrTGVuZ3RoOnRoaXMuX2lubmVyVGlja0xlbmd0aDtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6ei55Mj10O2JyZWFrO2Nhc2UgInRvcCI6ei55MT10aGlzLmhlaWdodCgpO3oueTI9dGhpcy5oZWlnaHQoKS10O2JyZWFrO2Nhc2UgImxlZnQiOnoueDE9dGhpcy53aWR0aCgpO3oueDI9dGhpcy53aWR0aCgpLXQ7YnJlYWs7Y2FzZSAicmlnaHQiOnoueDI9dH1yZXR1cm4gen07ci5wcm90b3R5cGUuX3NldERlZmF1bHRBbGlnbm1lbnQ9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6dGhpcy55QWxpZ25tZW50KCJ0b3AiKTticmVhaztjYXNlICJ0b3AiOnRoaXMueUFsaWdubWVudCgiYm90dG9tIik7YnJlYWs7Y2FzZSAibGVmdCI6dGhpcy54QWxpZ25tZW50KCJyaWdodCIpO2JyZWFrO2Nhc2UgInJpZ2h0Ijp0aGlzLnhBbGlnbm1lbnQoImxlZnQiKX19OwpyLnByb3RvdHlwZS5pc0hvcml6b250YWw9ZnVuY3Rpb24oKXtyZXR1cm4idG9wIj09PXRoaXMuX29yaWVudGF0aW9ufHwiYm90dG9tIj09PXRoaXMuX29yaWVudGF0aW9ufTtyLnByb3RvdHlwZS5nZXRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY2FsZX07ci5wcm90b3R5cGUuZm9ybWF0dGVyPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX2Zvcm1hdHRlcjt0aGlzLl9mb3JtYXR0ZXI9dDt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5pbm5lclRpY2tMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5uZXJUaWNrTGVuZ3RofTtyLnByb3RvdHlwZS5lbmRUaWNrTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VuZFRpY2tMZW5ndGh9O3IucHJvdG90eXBlLl9tYXhMYWJlbFRpY2tMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaG93RW5kVGlja0xhYmVscygpP01hdGgubWF4KHRoaXMuaW5uZXJUaWNrTGVuZ3RoKCksCnRoaXMuZW5kVGlja0xlbmd0aCgpKTp0aGlzLmlubmVyVGlja0xlbmd0aCgpfTtyLnByb3RvdHlwZS50aWNrTGFiZWxQYWRkaW5nPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbFBhZGRpbmc7aWYoMD50KXRocm93IEVycm9yKCJ0aWNrIGxhYmVsIHBhZGRpbmcgbXVzdCBiZSBwb3NpdGl2ZSIpO3RoaXMuX3RpY2tMYWJlbFBhZGRpbmc9dDt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5tYXJnaW49ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fbWFyZ2luO2lmKDA+dCl0aHJvdyBFcnJvcigibWFyZ2luIHNpemUgbXVzdCBiZSBwb3NpdGl2ZSIpO3RoaXMuX21hcmdpbj10O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX29yaWVudGF0aW9uO3Q9dC50b0xvd2VyQ2FzZSgpO2lmKCJ0b3AiIT09dCYmImJvdHRvbSIhPT0KdCYmImxlZnQiIT09dCYmInJpZ2h0IiE9PXQpdGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIG9yaWVudGF0aW9uIik7dGhpcy5fb3JpZW50YXRpb249dDt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5zaG93RW5kVGlja0xhYmVscz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaG93RW5kVGlja0xhYmVsc307ci5wcm90b3R5cGUuX3Nob3dBbGxUaWNrTWFya3M9ZnVuY3Rpb24oKXt0aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3IuVElDS19NQVJLX0NMQVNTKS5lYWNoKGZ1bmN0aW9uKCl7bC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0Iil9KX07ci5wcm90b3R5cGUuX3Nob3dBbGxUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrci5USUNLX0xBQkVMX0NMQVNTKS5lYWNoKGZ1bmN0aW9uKCl7bC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0Iil9KX07CnIucHJvdG90eXBlLl9oaWRlT3ZlcmZsb3dpbmdUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbGVtZW50KCkubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHY9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrci5USUNLX0xBQkVMX0NMQVNTKTt2LmVtcHR5KCl8fHYuZWFjaChmdW5jdGlvbigpe3AuRE9NLmNsaWVudFJlY3RJbnNpZGUodGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0KXx8bC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX0pfTtyLnByb3RvdHlwZS5faGlkZVRpY2tNYXJrc1dpdGhvdXRMYWJlbD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3RpY2tNYXJrQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrci5USUNLX01BUktfQ0xBU1MpLHY9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrci5USUNLX0xBQkVMX0NMQVNTKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgeT1sLnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIpOwpyZXR1cm4iaW5oZXJpdCI9PT15fHwidmlzaWJsZSI9PT15fSkuZGF0YSgpO3QuZWFjaChmdW5jdGlvbih5KXstMT09PXYuaW5kZXhPZih5KSYmbC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX0pfTtyLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtxLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHJ9KGMuQ29tcG9uZW50KTtmLkVORF9USUNLX01BUktfQ0xBU1M9ImVuZC10aWNrLW1hcmsiO2YuVElDS19NQVJLX0NMQVNTPSJ0aWNrLW1hcmsiO2YuVElDS19MQUJFTF9DTEFTUz0idGljay1sYWJlbCI7Zi5BTk5PVEFUSU9OX0xJTkVfQ0xBU1M9ImFubm90YXRpb24tbGluZSI7Zi5BTk5PVEFUSU9OX1JFQ1RfQ0xBU1M9ImFubm90YXRpb24tcmVjdCI7Zi5BTk5PVEFUSU9OX0NJUkNMRV9DTEFTUz0iYW5ub3RhdGlvbi1jaXJjbGUiO2YuQU5OT1RBVElPTl9MQUJFTF9DTEFTUz0KImFubm90YXRpb24tbGFiZWwiO2YuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORz00O2QuQXhpcz1mfSxmdW5jdGlvbihjLGQpe2QuU0hPV19XQVJOSU5HUz0hMDtkLkFERF9USVRMRV9FTEVNRU5UUz0hMH0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoMCk7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGwoKXt0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uPXt9O3RoaXMuX2V2ZW50VGFyZ2V0PWRvY3VtZW50O3RoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXQ9e307dGhpcy5fY29ubmVjdGVkPSExfWwucHJvdG90eXBlLl9oYXNOb0NhbGxiYWNrcz1mdW5jdGlvbigpe2Zvcih2YXIgaz1PYmplY3Qua2V5cyh0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0KSxuPTA7bjxrLmxlbmd0aDtuKyspaWYoMCE9PXRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRba1tuXV0uc2l6ZSlyZXR1cm4hMTtyZXR1cm4hMH07bC5wcm90b3R5cGUuX2Nvbm5lY3Q9ZnVuY3Rpb24oKXt2YXIgaz10aGlzOwp0aGlzLl9jb25uZWN0ZWR8fChPYmplY3Qua2V5cyh0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe2suX2V2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIobixrLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW25dKX0pLHRoaXMuX2Nvbm5lY3RlZD0hMCl9O2wucHJvdG90eXBlLl9kaXNjb25uZWN0PWZ1bmN0aW9uKCl7dmFyIGs9dGhpczt0aGlzLl9jb25uZWN0ZWQmJnRoaXMuX2hhc05vQ2FsbGJhY2tzKCkmJihPYmplY3Qua2V5cyh0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe2suX2V2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIobixrLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW25dKX0pLHRoaXMuX2Nvbm5lY3RlZD0hMSl9O2wucHJvdG90eXBlLl9hZGRDYWxsYmFja0ZvckV2ZW50PWZ1bmN0aW9uKGssbil7bnVsbD09dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtrXSYmCih0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W2tdPW5ldyBnLkNhbGxiYWNrU2V0KTt0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W2tdLmFkZChuKTt0aGlzLl9jb25uZWN0KCl9O2wucHJvdG90eXBlLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50PWZ1bmN0aW9uKGssbil7bnVsbCE9dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtrXSYmdGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtrXS5kZWxldGUobik7dGhpcy5fZGlzY29ubmVjdCgpfTtsLnByb3RvdHlwZS5fY2FsbENhbGxiYWNrc0ZvckV2ZW50PWZ1bmN0aW9uKGspe2Zvcih2YXIgbj1bXSxwPTE7cDxhcmd1bWVudHMubGVuZ3RoO3ArKyluW3AtMV09YXJndW1lbnRzW3BdO3A9dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtrXTtudWxsIT1wJiZwLmNhbGxDYWxsYmFja3MuYXBwbHkocCxuKX07cmV0dXJuIGx9KCk7ZC5EaXNwYXRjaGVyPWN9LGZ1bmN0aW9uKGMsZCxmKXtmdW5jdGlvbiBnKGwpe2Zvcih2YXIgayBpbiBsKWQuaGFzT3duUHJvcGVydHkoayl8fAooZFtrXT1sW2tdKX1nKGYoODcpKTtnKGYoODgpKTtnKGYoNDApKTtnKGYoODkpKTtnKGYoOTApKTtjPWYoMjYpO2Quem9vbU91dD1jLnpvb21PdXR9LGZ1bmN0aW9uKGMsZCl7ZnVuY3Rpb24gZihxLHIsdCl7cmV0dXJuIHQtKHQtcSkqcn1mdW5jdGlvbiBnKHEscix0KXtyZXR1cm4ocSpyLXQpLyhyLTEpfWZ1bmN0aW9uIGwocSxyLHQsdil7dmFyIHk9MTxyO3Q9eT92OnQ7aWYobnVsbD09dClyZXR1cm4gcjtxPXEuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTtyZXR1cm4oeT9NYXRoLm1pbjpNYXRoLm1heCkocix0L01hdGguYWJzKHFbMV0tcVswXSkpfWZ1bmN0aW9uIGsocSxyLHQsdix5KXtpZigxPj1yKXJldHVybntjZW50ZXJQb2ludDp0LHpvb21BbW91bnQ6cn07aWYobnVsbD09diYmbnVsbD09eSlyZXR1cm57Y2VudGVyUG9pbnQ6dCx6b29tQW1vdW50OnJ9O3ZhciB6PW4ocSkseD1wKHEpLEM9eD9JbmZpbml0eTotSW5maW5pdHk7eD14Py1JbmZpbml0eTpJbmZpbml0eTt2PW51bGw9PQp2P0M6djt5PW51bGw9PXk/eDp5O3g9cS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpO0M9eFswXTt4PXhbMV07eT1xLnNjYWxlVHJhbnNmb3JtYXRpb24oeSk7eD1xLnNjYWxlVHJhbnNmb3JtYXRpb24oeCk7dmFyIEY9Zih4LHIsdCk7dj1xLnNjYWxlVHJhbnNmb3JtYXRpb24odik7cT1xLnNjYWxlVHJhbnNmb3JtYXRpb24oQyk7Qz1mKHEscix0KTtyZXR1cm4gTWF0aC5hYnMoRi1DKT5NYXRoLmFicyh5LXYpPyhyPSh5LXYpLyh4LXEpLDEhPT1yP3tjZW50ZXJQb2ludDpnKHgscix5KSx6b29tQW1vdW50OnJ9OntjZW50ZXJQb2ludDp0LHpvb21BbW91bnQ6cn0pOkY+eSE9ej97Y2VudGVyUG9pbnQ6Zyh4LHIseSksem9vbUFtb3VudDpyfTpDPHYhPXo/e2NlbnRlclBvaW50OmcocSxyLHYpLHpvb21BbW91bnQ6cn06e2NlbnRlclBvaW50OnQsem9vbUFtb3VudDpyfX1mdW5jdGlvbiBuKHEpe3E9cS5yYW5nZSgpO3JldHVybiBxWzFdPHFbMF19ZnVuY3Rpb24gcChxKXtxPXEuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTsKcmV0dXJuIHFbMV08cVswXX1kLnpvb21PdXQ9ZjtkLmNvbnN0cmFpbmVkWm9vbT1mdW5jdGlvbihxLHIsdCx2LHkseix4KXtyPWwocSxyLHYseSk7cmV0dXJuIGsocSxyLHQseix4KX07ZC5jb25zdHJhaW5ab29tRXh0ZW50cz1sO2QuY29uc3RyYWluWm9vbVZhbHVlcz1rO2QuY29uc3RyYWluZWRUcmFuc2xhdGlvbj1mdW5jdGlvbihxLHIsdCx2KXt2YXIgeT1xLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCksej15WzBdLHg9eVsxXTt5PW4ocSk7MDxyIT09eT8odD12LG51bGwhPXQmJih6PXEuc2NhbGVUcmFuc2Zvcm1hdGlvbih4KSxxPXEuc2NhbGVUcmFuc2Zvcm1hdGlvbih0KSxyPSh5P01hdGgubWF4Ok1hdGgubWluKSh6K3IscSkteikpOm51bGwhPXQmJih6PXEuc2NhbGVUcmFuc2Zvcm1hdGlvbih6KSxxPXEuc2NhbGVUcmFuc2Zvcm1hdGlvbih0KSxyPSh5P01hdGgubWluOk1hdGgubWF4KSh6K3IscSkteik7cmV0dXJuIHJ9fSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhJLApPLFApe3ZhciBIPUkuc2NhbGU7aWYoSCBpbnN0YW5jZW9mIHouQ2F0ZWdvcnkpUD1ILnJhbmdlQmFuZCgpO2Vsc2V7dmFyIEs9SS5hY2Nlc3NvcjtJPWsuc2V0KEMuQXJyYXkuZmxhdHRlbihPLm1hcChmdW5jdGlvbihNKXtyZXR1cm4gTS5kYXRhKCkubWFwKGZ1bmN0aW9uKEwsUil7cmV0dXJuIEsoTCxSLE0pfSkuZmlsdGVyKGZ1bmN0aW9uKEwpe3JldHVybiBudWxsIT1MfSkubWFwKGZ1bmN0aW9uKEwpe3JldHVybiBMLnZhbHVlT2YoKX0pfSkpKS52YWx1ZXMoKS5tYXAoZnVuY3Rpb24oTSl7cmV0dXJuK019KTtJLnNvcnQoZnVuY3Rpb24oTSxMKXtyZXR1cm4gTS1MfSk7ST1JLm1hcChmdW5jdGlvbihNKXtyZXR1cm4gSC5zY2FsZShNKX0pO0k9ay5wYWlycyhJKTtQPUMuTWF0aC5taW4oSSxmdW5jdGlvbihNKXtyZXR1cm4gTWF0aC5hYnMoTVsxXS1NWzBdKX0sUCpCLl9TSU5HTEVfQkFSX0RJTUVOU0lPTl9SQVRJTyk7UCo9Qi5fQkFSX1RISUNLTkVTU19SQVRJT31yZXR1cm4gUH0KdmFyIGw9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKEksTyl7ZnVuY3Rpb24gUCgpe3RoaXMuY29uc3RydWN0b3I9SX1mb3IodmFyIEggaW4gTylPLmhhc093blByb3BlcnR5KEgpJiYoSVtIXT1PW0hdKTtJLnByb3RvdHlwZT1udWxsPT09Tz9PYmplY3QuY3JlYXRlKE8pOihQLnByb3RvdHlwZT1PLnByb3RvdHlwZSxuZXcgUCl9LGs9ZigxKSxuPWYoNSkscD1mKDcpLHE9Zig4KSxyPWYoMTQpLHQ9Zig2KSx2PWYoMzQpLHk9ZigyMCksej1mKDMpLHg9ZigxMSksQz1mKDApO2M9ZigxMCk7dmFyIEY9ZigxOSksRD1mKDIpO2Y9ZigxNik7ZC5CYXJPcmllbnRhdGlvbj1jLm1ha2VFbnVtKFsidmVydGljYWwiLCJob3Jpem9udGFsIl0pO2QuTGFiZWxzUG9zaXRpb249Yy5tYWtlRW51bShbInN0YXJ0IiwibWlkZGxlIiwiZW5kIiwib3V0c2lkZSJdKTtkLkJhckFsaWdubWVudD1jLm1ha2VFbnVtKFsic3RhcnQiLCJtaWRkbGUiLCJlbmQiXSk7dmFyIEI9ZnVuY3Rpb24oSSl7ZnVuY3Rpb24gTyhQKXt2b2lkIDA9PT0KUCYmKFA9InZlcnRpY2FsIik7dmFyIEg9SS5jYWxsKHRoaXMpfHx0aGlzO0guX2xhYmVsRm9ybWF0dGVyPXEuaWRlbnRpdHkoKTtILl9sYWJlbHNFbmFibGVkPSExO0guX2xhYmVsc1Bvc2l0aW9uPWQuTGFiZWxzUG9zaXRpb24uZW5kO0guX2hpZGVCYXJzSWZBbnlBcmVUb29XaWRlPSEwO0guX2JhckFsaWdubWVudD0ibWlkZGxlIjtILl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3M9eS5tZW1vaXplKGcpO0guX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M9ITA7SC5hZGRDbGFzcygiYmFyLXBsb3QiKTtpZigidmVydGljYWwiIT09UCYmImhvcml6b250YWwiIT09UCl0aHJvdyBFcnJvcihQKyIgaXMgbm90IGEgdmFsaWQgb3JpZW50YXRpb24gZm9yIFBsb3RzLkJhciIpO0guX2lzVmVydGljYWw9InZlcnRpY2FsIj09PVA7SC5hbmltYXRvcigiYmFzZWxpbmUiLG5ldyBwLk51bGwpO0guYXR0cigiZmlsbCIsKG5ldyB6LkNvbG9yKS5yYW5nZSgpWzBdKTtILmF0dHIoTy5fQkFSX1RISUNLTkVTU19LRVksCmZ1bmN0aW9uKCl7cmV0dXJuIEguX2JhclBpeGVsVGhpY2tuZXNzKCl9KTtILl9sYWJlbENvbmZpZz1uZXcgQy5NYXA7SC5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuW0guYmFzZWxpbmVWYWx1ZSgpXX07cmV0dXJuIEh9bChPLEkpO08ucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oUCxILEspe0kucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLFAsSCxLKTt0aGlzLl91cGRhdGVFeHRlbnRzKCk7cmV0dXJuIHRoaXN9O08ucHJvdG90eXBlLng9ZnVuY3Rpb24oUCxIKXtpZihudWxsPT1QKXJldHVybiBJLnByb3RvdHlwZS54LmNhbGwodGhpcyk7bnVsbD09SD9JLnByb3RvdHlwZS54LmNhbGwodGhpcyxQKTpJLnByb3RvdHlwZS54LmNhbGwodGhpcyxQLEgpO3RoaXMuX3VwZGF0ZVRoaWNrbmVzc0F0dHIoKTt0aGlzLl91cGRhdGVMZW5ndGhTY2FsZSgpO3JldHVybiB0aGlzfTtPLnByb3RvdHlwZS55PWZ1bmN0aW9uKFAsSCl7aWYobnVsbD09ClApcmV0dXJuIEkucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtudWxsPT1IP0kucHJvdG90eXBlLnkuY2FsbCh0aGlzLFApOkkucHJvdG90eXBlLnkuY2FsbCh0aGlzLFAsSCk7dGhpcy5fdXBkYXRlTGVuZ3RoU2NhbGUoKTtyZXR1cm4gdGhpc307Ty5wcm90b3R5cGUubGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/dGhpcy55KCk6dGhpcy54KCl9O08ucHJvdG90eXBlLnBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/dGhpcy54KCk6dGhpcy55KCl9O08ucHJvdG90eXBlLmJhckVuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChPLl9CQVJfRU5EX0tFWSl9O08ucHJvdG90eXBlLmJhckFsaWdubWVudD1mdW5jdGlvbihQKXtpZihudWxsPT1QKXJldHVybiB0aGlzLl9iYXJBbGlnbm1lbnQ7dGhpcy5fYmFyQWxpZ25tZW50PVA7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7CnJldHVybiB0aGlzfTtPLnByb3RvdHlwZS5vcmllbnRhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1ZlcnRpY2FsPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwifTtPLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0LlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB2LlJlY3RhbmdsZVNWR0RyYXdlcihPLl9CQVJfQVJFQV9DTEFTUyl9LGZ1bmN0aW9uKFApe3JldHVybiBuZXcgci5SZWN0YW5nbGVDYW52YXNEcmF3ZXIoUCl9KX07Ty5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7SS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fYmFzZWxpbmU9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApfTtPLnByb3RvdHlwZS5iYXNlbGluZVZhbHVlPWZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5fYmFzZWxpbmVWYWx1ZSlyZXR1cm4gdGhpcy5fYmFzZWxpbmVWYWx1ZTtpZighdGhpcy5fcHJvamVjdG9yc1JlYWR5KCkpcmV0dXJuIDA7CnZhciBQPXRoaXMubGVuZ3RoKCkuc2NhbGU7cmV0dXJuIFA/UCBpbnN0YW5jZW9mIHouVGltZT9uZXcgRGF0ZSgwKTowOjB9O08ucHJvdG90eXBlLmFkZERhdGFzZXQ9ZnVuY3Rpb24oUCl7SS5wcm90b3R5cGUuYWRkRGF0YXNldC5jYWxsKHRoaXMsUCk7cmV0dXJuIHRoaXN9O08ucHJvdG90eXBlLl9hZGREYXRhc2V0PWZ1bmN0aW9uKFApe0kucHJvdG90eXBlLl9hZGREYXRhc2V0LmNhbGwodGhpcyxQKTtyZXR1cm4gdGhpc307Ty5wcm90b3R5cGUucmVtb3ZlRGF0YXNldD1mdW5jdGlvbihQKXtJLnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0LmNhbGwodGhpcyxQKX07Ty5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oUCl7SS5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQuY2FsbCh0aGlzLFApO3JldHVybiB0aGlzfTtPLnByb3RvdHlwZS5kYXRhc2V0cz1mdW5jdGlvbihQKXtpZihudWxsPT1QKXJldHVybiBJLnByb3RvdHlwZS5kYXRhc2V0cy5jYWxsKHRoaXMpO0kucHJvdG90eXBlLmRhdGFzZXRzLmNhbGwodGhpcywKUCk7cmV0dXJuIHRoaXN9O08ucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQ9ZnVuY3Rpb24oUCl7aWYobnVsbD09UClyZXR1cm4gdGhpcy5fbGFiZWxzRW5hYmxlZDt0aGlzLl9sYWJlbHNFbmFibGVkPVA7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O08ucHJvdG90eXBlLmxhYmVsRm9ybWF0dGVyPWZ1bmN0aW9uKFApe2lmKG51bGw9PVApcmV0dXJuIHRoaXMuX2xhYmVsRm9ybWF0dGVyO3RoaXMuX2xhYmVsRm9ybWF0dGVyPVA7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O08ucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQ9ZnVuY3Rpb24oUCl7dmFyIEg9SS5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldC5jYWxsKHRoaXMsUCksSz10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgiZyIpLmNsYXNzZWQoTy5fTEFCRUxfQVJFQV9DTEFTUywhMCksCk09bmV3IG4uU3ZnQ29udGV4dChLLm5vZGUoKSksTD1uZXcgbi5DYWNoZU1lYXN1cmVyKE0pO009bmV3IG4uV3JpdGVyKEwsTSk7dGhpcy5fbGFiZWxDb25maWcuc2V0KFAse2xhYmVsQXJlYTpLLG1lYXN1cmVyOkwsd3JpdGVyOk19KTtyZXR1cm4gSH07Ty5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcz1mdW5jdGlvbihQKXtJLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzLmNhbGwodGhpcyxQKTt2YXIgSD10aGlzLl9sYWJlbENvbmZpZy5nZXQoUCk7bnVsbCE9SCYmKEgubGFiZWxBcmVhLnJlbW92ZSgpLHRoaXMuX2xhYmVsQ29uZmlnLmRlbGV0ZShQKSl9O08ucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24oUCl7dmFyIEg9dGhpcztyZXR1cm4gdGhpcy5fY29tcHV0ZUJhclBpeGVsVGhpY2tuZXNzLmRvTG9ja2VkKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gSyhkYSxsYSxaLEZhKXtyZXR1cm4gSC5fcGl4ZWxQb2ludEJhcihiYShkYSxsYSxaKSxtYSxGYSl9dmFyIE09CkguX2lzVmVydGljYWw/UC54OlAueSxMPUguX2lzVmVydGljYWw/UC55OlAueCxSPUguYm91bmRzKCksVT17bWluOjAsbWF4OlIuYm90dG9tUmlnaHQueC1SLnRvcExlZnQueH0sWT17bWluOjAsbWF4OlIuYm90dG9tUmlnaHQueS1SLnRvcExlZnQueX0sYmE9RC5QbG90Ll9zY2FsZWRBY2Nlc3NvcihILmxlbmd0aCgpKSxtYT1ILmxlbmd0aCgpLnNjYWxlLnNjYWxlKEguYmFzZWxpbmVWYWx1ZSgpKSxhYT1JbmZpbml0eSxjYT1JbmZpbml0eSxmYTtILl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzKCkuZm9yRWFjaChmdW5jdGlvbihkYSl7dmFyIGxhPUguX2VudGl0eUJvdW5kcyhkYSk7aWYoQy5ET00uaW50ZXJzZWN0c0JCb3goVSxZLGxhKSl7dmFyIFo9MCxGYT0wO2lmKCFDLkRPTS5pbnRlcnNlY3RzQkJveChQLngsUC55LGxhLC41KSl7RmE9SyhkYS5kYXR1bSxkYS5pbmRleCxkYS5kYXRhc2V0LGxhKTtaPU1hdGguYWJzKE0tKEguX2lzVmVydGljYWw/RmEueDpGYS55KSk7dmFyIHhhPQpILl9pc1ZlcnRpY2FsP2xhLnk6bGEueDtsYT14YSsoSC5faXNWZXJ0aWNhbD9sYS5oZWlnaHQ6bGEud2lkdGgpO0ZhPUw+PXhhLS41JiZMPD1sYSsuNT8wOk1hdGguYWJzKEwtKEguX2lzVmVydGljYWw/RmEueTpGYS54KSl9aWYoWjxhYXx8Wj09PWFhJiZGYTxjYSlmYT1kYSxhYT1aLGNhPUZhfX0pO2lmKHZvaWQgMCE9PWZhKXJldHVybiBILl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoZmEpfSl9O08ucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oUCl7cmV0dXJuIHRoaXMuX2VudGl0aWVzSW50ZXJzZWN0aW5nKFAueCxQLnkpfTtPLnByb3RvdHlwZS5fZW50aXRpZXNJbnRlcnNlY3Rpbmc9ZnVuY3Rpb24oUCxIKXt2YXIgSz10aGlzLE09W107dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllcygpLmZvckVhY2goZnVuY3Rpb24oTCl7Qy5ET00uaW50ZXJzZWN0c0JCb3goUCxILEsuX2VudGl0eUJvdW5kcyhMKSkmJk0ucHVzaChLLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoTCkpfSk7CnJldHVybiBNfTtPLnByb3RvdHlwZS5fdXBkYXRlTGVuZ3RoU2NhbGU9ZnVuY3Rpb24oKXtpZih0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKSl7dmFyIFA9dGhpcy5sZW5ndGgoKS5zY2FsZTtQIGluc3RhbmNlb2YgeC5RdWFudGl0YXRpdmVTY2FsZSYmKFAuYWRkUGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcih0aGlzLl9iYXNlbGluZVZhbHVlUHJvdmlkZXIpLFAuYWRkSW5jbHVkZWRWYWx1ZXNQcm92aWRlcih0aGlzLl9iYXNlbGluZVZhbHVlUHJvdmlkZXIpKX19O08ucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIFA9dGhpczt0aGlzLl9iYXJQaXhlbFRoaWNrbmVzcygpO3JldHVybiB0aGlzLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3MuZG9Mb2NrZWQoZnVuY3Rpb24oKXtyZXR1cm4gSS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbChQKX0pfTtPLnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PWZ1bmN0aW9uKFApe3ZhciBIPXRoaXMsSz10aGlzLmxlbmd0aCgpLnNjYWxlLnNjYWxlKHRoaXMuYmFzZWxpbmVWYWx1ZSgpKTsKSz17eDE6dGhpcy5faXNWZXJ0aWNhbD8wOksseTE6dGhpcy5faXNWZXJ0aWNhbD9LOjAseDI6dGhpcy5faXNWZXJ0aWNhbD90aGlzLndpZHRoKCk6Syx5Mjp0aGlzLl9pc1ZlcnRpY2FsP0s6dGhpcy5oZWlnaHQoKX07dGhpcy5fZ2V0QW5pbWF0b3IoImJhc2VsaW5lIikuYW5pbWF0ZSh0aGlzLl9iYXNlbGluZSxLKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihNKXtyZXR1cm4gSC5fbGFiZWxDb25maWcuZ2V0KE0pLmxhYmVsQXJlYS5zZWxlY3RBbGwoImciKS5yZW1vdmUoKX0pO3RoaXMuX2xhYmVsc0VuYWJsZWQmJkMuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gSC5fZHJhd0xhYmVscygpfSxQKX07Ty5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5PWZ1bmN0aW9uKFApe3ZhciBIPXRoaXMsSz1JLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLFApO2lmKCJ4Ij09PVAmJnRoaXMuX2lzVmVydGljYWwpUD10aGlzLngoKTsKZWxzZXtpZigieSIhPT1QfHx0aGlzLl9pc1ZlcnRpY2FsKXJldHVybiBLO1A9dGhpcy55KCl9aWYoIShQJiZQLnNjYWxlJiZQLnNjYWxlIGluc3RhbmNlb2YgeC5RdWFudGl0YXRpdmVTY2FsZSkpcmV0dXJuIEs7dmFyIE09UC5zY2FsZSxMPXRoaXMuX2JhclBpeGVsVGhpY2tuZXNzKCk7cmV0dXJuIEs9Sy5tYXAoZnVuY3Rpb24oUil7cmV0dXJuIGsuZXh0ZW50KFtNLmludmVydChILl9nZXRQb3NpdGlvbkF0dHIoTS5zY2FsZShSWzBdKSxMKSksTS5pbnZlcnQoSC5fZ2V0UG9zaXRpb25BdHRyKE0uc2NhbGUoUlswXSksTCkrTCksTS5pbnZlcnQoSC5fZ2V0UG9zaXRpb25BdHRyKE0uc2NhbGUoUlsxXSksTCkpLE0uaW52ZXJ0KEguX2dldFBvc2l0aW9uQXR0cihNLnNjYWxlKFJbMV0pLEwpK0wpXSl9KX07Ty5wcm90b3R5cGUuX2dldFBvc2l0aW9uQXR0cj1mdW5jdGlvbihQLEgpe3RoaXMuX2lzVmVydGljYWx8fChQLT1ILEgqPS0xKTtzd2l0Y2godGhpcy5fYmFyQWxpZ25tZW50KXtjYXNlICJzdGFydCI6cmV0dXJuIFA7CmNhc2UgImVuZCI6cmV0dXJuIFAtSDtkZWZhdWx0OnJldHVybiBQLUgvMn19O08ucHJvdG90eXBlLl9kcmF3TGFiZWxzPWZ1bmN0aW9uKCl7dmFyIFA9dGhpcyxIPXRoaXMuX2dldERhdGFUb0RyYXcoKSxLPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLE09dGhpcy5kYXRhc2V0cygpLnNvbWUoZnVuY3Rpb24oTCl7cmV0dXJuIEguZ2V0KEwpLnNvbWUoZnVuY3Rpb24oUixVKXtyZXR1cm4gbnVsbD09Uj8hMTpQLl9kcmF3TGFiZWwoUixVLEwsSyl9KX0pO3RoaXMuX2hpZGVCYXJzSWZBbnlBcmVUb29XaWRlJiZNJiZ0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihMKXtyZXR1cm4gUC5fbGFiZWxDb25maWcuZ2V0KEwpLmxhYmVsQXJlYS5zZWxlY3RBbGwoImciKS5yZW1vdmUoKX0pfTtPLnByb3RvdHlwZS5fZHJhd0xhYmVsPWZ1bmN0aW9uKFAsSCxLLE0pe3ZhciBMPXRoaXMuX2xhYmVsQ29uZmlnLmdldChLKSxSPUwubGFiZWxBcmVhLFU9TC5tZWFzdXJlcjtMPUwud3JpdGVyOwp2YXIgWT10aGlzLmxlbmd0aCgpLmFjY2Vzc29yLGJhPVkoUCxILEspO1k9dGhpcy5sZW5ndGgoKS5zY2FsZTt2YXIgbWE9bnVsbCE9WT9ZLnNjYWxlKGJhKTpiYSxhYT1udWxsIT1ZP1kuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpOnRoaXMuYmFzZWxpbmVWYWx1ZSgpLGNhPXt4Ok0ueChQLEgsSykseTpNLnkoUCxILEspfTtZPXt3aWR0aDpNLndpZHRoKFAsSCxLKSxoZWlnaHQ6TS5oZWlnaHQoUCxILEspfTtiYT10aGlzLl9sYWJlbEZvcm1hdHRlcihiYSxQLEgsSyk7VT1VLm1lYXN1cmUoYmEpO3ZhciBmYT10aGlzLl9zaG91bGRTaG93TGFiZWxPbkJhcihjYSxZLFUpO2NhPXRoaXMuX2NhbGN1bGF0ZUxhYmVsUHJvcGVydGllcyhjYSxZLFUsZmEsdGhpcy5faXNWZXJ0aWNhbD9tYTw9YWE6bWE8YWEpO21hPWNhLmNvbnRhaW5lckRpbWVuc2lvbnM7YWE9Y2EubGFiZWxDb250YWluZXJPcmlnaW47Y2E9Y2EuYWxpZ25tZW50O1A9TS5maWxsKFAsSCxLKTtSPXRoaXMuX2NyZWF0ZUxhYmVsQ29udGFpbmVyKFIsCmFhLGZhLFApO0wud3JpdGUoYmEsbWEud2lkdGgsbWEuaGVpZ2h0LHt4QWxpZ246Y2EueCx5QWxpZ246Y2EueX0sUi5ub2RlKCkpO3JldHVybiB0aGlzLl9pc1ZlcnRpY2FsP1kud2lkdGg8VS53aWR0aDpZLmhlaWdodDxVLmhlaWdodH07Ty5wcm90b3R5cGUuX3Nob3VsZFNob3dMYWJlbE9uQmFyPWZ1bmN0aW9uKFAsSCxLKXtpZih0aGlzLl9sYWJlbHNQb3NpdGlvbj09PWQuTGFiZWxzUG9zaXRpb24ub3V0c2lkZSlyZXR1cm4hMTtQPXRoaXMuX2lzVmVydGljYWw/UC55OlAueDt2YXIgTT10aGlzLl9pc1ZlcnRpY2FsP0guaGVpZ2h0Okgud2lkdGg7SD10aGlzLl9pc1ZlcnRpY2FsP3RoaXMuaGVpZ2h0KCk6dGhpcy53aWR0aCgpO0s9dGhpcy5faXNWZXJ0aWNhbD9LLmhlaWdodDpLLndpZHRoO3ZhciBMPVArTTtMPkg/TT1ILVA6MD5QJiYoTT1MKTtyZXR1cm4gSytPLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUjw9TX07Ty5wcm90b3R5cGUuX2NhbGN1bGF0ZUxhYmVsUHJvcGVydGllcz0KZnVuY3Rpb24oUCxILEssTSxMKXtmdW5jdGlvbiBSKGxhKXtzd2l0Y2gobGEpe2Nhc2UgInRvcExlZnQiOmFhPVUuX2lzVmVydGljYWw/InRvcCI6ImxlZnQiO2ZhKz1PLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUjtkYSs9Ty5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVI7YnJlYWs7Y2FzZSAiY2VudGVyIjpkYSs9KGJhK21hKS8yO2JyZWFrO2Nhc2UgImJvdHRvbVJpZ2h0IjphYT1VLl9pc1ZlcnRpY2FsPyJib3R0b20iOiJyaWdodCIsZmEtPU8uX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSLGRhKz1jYS1PLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUi1tYX19dmFyIFU9dGhpcyxZPXRoaXMuX2lzVmVydGljYWw/UC55OlAueCxiYT10aGlzLl9pc1ZlcnRpY2FsP0guaGVpZ2h0Okgud2lkdGgsbWE9dGhpcy5faXNWZXJ0aWNhbD9LLmhlaWdodDpLLndpZHRoLGFhPSJjZW50ZXIiLGNhPWJhLGZhPVksZGE9WTtpZihNKXN3aXRjaCh0aGlzLl9sYWJlbHNQb3NpdGlvbil7Y2FzZSBkLkxhYmVsc1Bvc2l0aW9uLnN0YXJ0Okw/ClIoImJvdHRvbVJpZ2h0Iik6UigidG9wTGVmdCIpO2JyZWFrO2Nhc2UgZC5MYWJlbHNQb3NpdGlvbi5taWRkbGU6UigiY2VudGVyIik7YnJlYWs7Y2FzZSBkLkxhYmVsc1Bvc2l0aW9uLmVuZDpMP1IoInRvcExlZnQiKTpSKCJib3R0b21SaWdodCIpfWVsc2UgTD8oYWE9dGhpcy5faXNWZXJ0aWNhbD8idG9wIjoibGVmdCIsY2E9YmErTy5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIrbWEsZmEtPU8uX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSK21hLGRhLT1PLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUittYSk6KGFhPXRoaXMuX2lzVmVydGljYWw/ImJvdHRvbSI6InJpZ2h0IixjYT1iYStPLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUittYSxkYSs9YmErTy5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIpO3JldHVybntjb250YWluZXJEaW1lbnNpb25zOnt3aWR0aDp0aGlzLl9pc1ZlcnRpY2FsP0gud2lkdGg6Y2EsaGVpZ2h0OnRoaXMuX2lzVmVydGljYWw/Y2E6SC5oZWlnaHR9LGxhYmVsQ29udGFpbmVyT3JpZ2luOnt4OnRoaXMuX2lzVmVydGljYWw/ClAueDpmYSx5OnRoaXMuX2lzVmVydGljYWw/ZmE6UC55fSxsYWJlbE9yaWdpbjp7eDp0aGlzLl9pc1ZlcnRpY2FsP1AueCtILndpZHRoLzItSy53aWR0aC8yOmRhLHk6dGhpcy5faXNWZXJ0aWNhbD9kYTpQLnkrSC5oZWlnaHQvMi1LLmhlaWdodC8yfSxhbGlnbm1lbnQ6e3g6dGhpcy5faXNWZXJ0aWNhbD8iY2VudGVyIjphYSx5OnRoaXMuX2lzVmVydGljYWw/YWE6ImNlbnRlciJ9fX07Ty5wcm90b3R5cGUuX2NyZWF0ZUxhYmVsQ29udGFpbmVyPWZ1bmN0aW9uKFAsSCxLLE0pe1A9UC5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitILngrIiwgIitILnkrIikiKTtLPyhQLmNsYXNzZWQoIm9uLWJhci1sYWJlbCIsITApLEs9MS42KkMuQ29sb3IuY29udHJhc3QoIndoaXRlIixNKTxDLkNvbG9yLmNvbnRyYXN0KCJibGFjayIsTSksUC5jbGFzc2VkKEs/ImRhcmstbGFiZWwiOiJsaWdodC1sYWJlbCIsITApKTpQLmNsYXNzZWQoIm9mZi1iYXItbGFiZWwiLCEwKTsKcmV0dXJuIFB9O08ucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz1mdW5jdGlvbigpe3ZhciBQPVtdO2lmKHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSl7dmFyIEg9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksSz10aGlzLmxlbmd0aCgpLnNjYWxlLnNjYWxlKHRoaXMuYmFzZWxpbmVWYWx1ZSgpKSxNPXRoaXMuX2lzVmVydGljYWw/ImhlaWdodCI6IndpZHRoIjtIW3RoaXMuX2lzVmVydGljYWw/InkiOiJ4Il09ZnVuY3Rpb24oKXtyZXR1cm4gS307SFtNXT1mdW5jdGlvbigpe3JldHVybiAwfTtQLnB1c2goe2F0dHJUb1Byb2plY3RvcjpILGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKEYuQW5pbWF0b3IuUkVTRVQpfSl9UC5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoRi5BbmltYXRvci5NQUlOKX0pO3JldHVybiBQfTtPLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9CmZ1bmN0aW9uKCl7ZnVuY3Rpb24gUChjYSxmYSxkYSl7cmV0dXJuIE1hdGguYWJzKE0tWShjYSxmYSxkYSkpfXZhciBIPXRoaXMsSz1JLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IuY2FsbCh0aGlzKSxNPXRoaXMubGVuZ3RoKCkuc2NhbGUuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpLEw9dGhpcy5faXNWZXJ0aWNhbD8ieSI6IngiLFI9dGhpcy5faXNWZXJ0aWNhbD8ieCI6InkiLFU9RC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnBvc2l0aW9uKCkpLFk9RC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLmxlbmd0aCgpKSxiYT1LW08uX0JBUl9USElDS05FU1NfS0VZXSxtYT1LLmdhcCxhYT1udWxsPT1tYT9iYTpmdW5jdGlvbihjYSxmYSxkYSl7cmV0dXJuIGJhKGNhLGZhLGRhKS1tYShjYSxmYSxkYSl9O0sud2lkdGg9dGhpcy5faXNWZXJ0aWNhbD9hYTpQO0suaGVpZ2h0PXRoaXMuX2lzVmVydGljYWw/UDphYTtLW0xdPWZ1bmN0aW9uKGNhLGZhLGRhKXtjYT0KWShjYSxmYSxkYSk7cmV0dXJuIGNhPk0/TTpjYX07S1tSXT1mdW5jdGlvbihjYSxmYSxkYSl7cmV0dXJuIEguX2dldFBvc2l0aW9uQXR0cihVKGNhLGZhLGRhKSxiYShjYSxmYSxkYSkpfTtyZXR1cm4gS307Ty5wcm90b3R5cGUuX3VwZGF0ZVRoaWNrbmVzc0F0dHI9ZnVuY3Rpb24oKXt2YXIgUD10aGlzLEg9dGhpcy5wb3NpdGlvbigpLEs9dGhpcy5iYXJFbmQoKTtudWxsIT1IJiZudWxsIT1LPyh0aGlzLl9maXhlZEJhclBpeGVsVGhpY2tuZXNzPSExLHRoaXMuYXR0cihPLl9CQVJfVEhJQ0tORVNTX0tFWSxmdW5jdGlvbihNLEwsUil7dmFyIFU9SC5hY2Nlc3NvcihNLEwsUik7TT1LLmFjY2Vzc29yKE0sTCxSKTtVPUguc2NhbGU/SC5zY2FsZS5zY2FsZShVKTpVO009Sy5zY2FsZT9LLnNjYWxlLnNjYWxlKE0pOk07cmV0dXJuIE1hdGguYWJzKE0tVSl9KSk6KHRoaXMuX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M9ITAsdGhpcy5hdHRyKE8uX0JBUl9USElDS05FU1NfS0VZLGZ1bmN0aW9uKCl7cmV0dXJuIFAuX2JhclBpeGVsVGhpY2tuZXNzKCl9KSl9OwpPLnByb3RvdHlwZS5fYmFyUGl4ZWxUaGlja25lc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZml4ZWRCYXJQaXhlbFRoaWNrbmVzcz90aGlzLl9wcm9qZWN0b3JzUmVhZHkoKT90aGlzLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3ModGhpcy5wb3NpdGlvbigpLHRoaXMuZGF0YXNldHMoKSx0aGlzLl9pc1ZlcnRpY2FsP3RoaXMud2lkdGgoKTp0aGlzLmhlaWdodCgpKTowOjB9O08ucHJvdG90eXBlLmVudGl0aWVzPWZ1bmN0aW9uKFApe3ZvaWQgMD09PVAmJihQPXRoaXMuZGF0YXNldHMoKSk7cmV0dXJuIHRoaXMuX3Byb2plY3RvcnNSZWFkeSgpP0kucHJvdG90eXBlLmVudGl0aWVzLmNhbGwodGhpcyxQKTpbXX07Ty5wcm90b3R5cGUuX2VudGl0eUJvdW5kcz1mdW5jdGlvbihQKXtyZXR1cm4gdGhpcy5fcGl4ZWxCb3VuZHMoUC5kYXR1bSxQLmluZGV4LFAuZGF0YXNldCl9O08ucHJvdG90eXBlLl9waXhlbEJvdW5kcz1mdW5jdGlvbihQLEgsSyl7dmFyIE09dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7CnJldHVybnt4Ok0ueChQLEgsSykseTpNLnkoUCxILEspLHdpZHRoOk0ud2lkdGgoUCxILEspLGhlaWdodDpNLmhlaWdodChQLEgsSyl9fTtPLnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbihQLEgsSyl7dmFyIE09dGhpcy5fcGl4ZWxCb3VuZHMoUCxILEspO1A9KHRoaXMuX2lzVmVydGljYWw/RC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk6RC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSkpKFAsSCxLKTtIPSh0aGlzLl9pc1ZlcnRpY2FsP3RoaXMueSgpLnNjYWxlOnRoaXMueCgpLnNjYWxlKS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSk7cmV0dXJuIHRoaXMuX3BpeGVsUG9pbnRCYXIoUCxILE0pfTtPLnByb3RvdHlwZS5fcGl4ZWxQb2ludEJhcj1mdW5jdGlvbihQLEgsSyl7aWYodGhpcy5faXNWZXJ0aWNhbCl7dmFyIE09Sy54K0sud2lkdGgvMjtQPVA8PUg/Sy55OksueStLLmhlaWdodH1lbHNlIE09UD49SD9LLngrSy53aWR0aDpLLngsUD1LLnkrSy5oZWlnaHQvCjI7cmV0dXJue3g6TSx5OlB9fTtPLnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24oUCxIKXtJLnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXkuY2FsbCh0aGlzLFAsSCl9O08ucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIFA9dGhpcyxIPW5ldyBDLk1hcCxLPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLE09dGhpcy53aWR0aCgpLEw9dGhpcy5oZWlnaHQoKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihSKXt2YXIgVT1SLmRhdGEoKS5tYXAoZnVuY3Rpb24oWSxiYSl7cmV0dXJuIFAuX2lzRGF0dW1PblNjcmVlbihLLE0sTCxZLGJhLFIpP1k6bnVsbH0pO0guc2V0KFIsVSl9KTtyZXR1cm4gSH07Ty5wcm90b3R5cGUuX2lzRGF0dW1PblNjcmVlbj1mdW5jdGlvbihQLEgsSyxNLEwsUil7dmFyIFU9UC54KE0sTCxSKSxZPVAueShNLEwsUiksYmE9UC53aWR0aChNLEwsUik7UD1QLmhlaWdodChNLEwsUik7cmV0dXJuIEMuTWF0aC5pc1ZhbGlkTnVtYmVyKFUpJiYKQy5NYXRoLmlzVmFsaWROdW1iZXIoWSkmJkMuTWF0aC5pc1ZhbGlkTnVtYmVyKGJhKSYmQy5NYXRoLmlzVmFsaWROdW1iZXIoUCk/Qy5NYXRoLmJvdW5kc0ludGVyc2VjdHMoVSxZLGJhLFAsSCxLKTohMX07cmV0dXJuIE99KGYuWFlQbG90KTtCLl9CQVJfVEhJQ0tORVNTX1JBVElPPS45NTtCLl9TSU5HTEVfQkFSX0RJTUVOU0lPTl9SQVRJTz0uNDtCLl9CQVJfQVJFQV9DTEFTUz0iYmFyLWFyZWEiO0IuX0JBUl9FTkRfS0VZPSJiYXJFbmQiO0IuX0JBUl9USElDS05FU1NfS0VZPSJ3aWR0aCI7Qi5fTEFCRUxfQVJFQV9DTEFTUz0iYmFyLWxhYmVsLXRleHQtYXJlYSI7Qi5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVI9MTA7ZC5CYXI9Qn0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih2LHkpe2Z1bmN0aW9uIHooKXt0aGlzLmNvbnN0cnVjdG9yPXZ9Zm9yKHZhciB4IGluIHkpeS5oYXNPd25Qcm9wZXJ0eSh4KSYmKHZbeF09eVt4XSk7di5wcm90b3R5cGU9Cm51bGw9PT15P09iamVjdC5jcmVhdGUoeSk6KHoucHJvdG90eXBlPXkucHJvdG90eXBlLG5ldyB6KX0sbD1mKDEpLGs9Zig1KSxuPWYoOCkscD1mKDMpLHE9ZigwKTtjPWYoMTApO3ZhciByPWYoMjIpO2QuVGltZUludGVydmFsPWMubWFrZUVudW0oInNlY29uZCBtaW51dGUgaG91ciBkYXkgd2VlayBtb250aCB5ZWFyIi5zcGxpdCgiICIpKTtkLlRpbWVBeGlzT3JpZW50YXRpb249Yy5tYWtlRW51bShbInRvcCIsImJvdHRvbSJdKTtkLlRpZXJMYWJlbFBvc2l0aW9uPWMubWFrZUVudW0oWyJiZXR3ZWVuIiwiY2VudGVyIl0pO2Y9ZnVuY3Rpb24odil7ZnVuY3Rpb24geSh6LHgpe3o9di5jYWxsKHRoaXMseix4KXx8dGhpczt6Ll9tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb249bnVsbDt6Ll90aWVyTGFiZWxQb3NpdGlvbnM9W107ei5hZGRDbGFzcygidGltZS1heGlzIik7ei50aWNrTGFiZWxQYWRkaW5nKDUpO3ouYXhpc0NvbmZpZ3VyYXRpb25zKHkuX0RFRkFVTFRfVElNRV9BWElTX0NPTkZJR1VSQVRJT05TKTsKei5hbm5vdGF0aW9uRm9ybWF0dGVyKG4udGltZSgiJWEgJWIgJWQsICVZIikpO3JldHVybiB6fWcoeSx2KTt5LnByb3RvdHlwZS50aWVyTGFiZWxQb3NpdGlvbnM9ZnVuY3Rpb24oeil7aWYobnVsbD09eilyZXR1cm4gdGhpcy5fdGllckxhYmVsUG9zaXRpb25zO2lmKCF6LmV2ZXJ5KGZ1bmN0aW9uKHgpe3JldHVybiJiZXR3ZWVuIj09PXgudG9Mb3dlckNhc2UoKXx8ImNlbnRlciI9PT14LnRvTG93ZXJDYXNlKCl9KSl0aHJvdyBFcnJvcigiVW5zdXBwb3J0ZWQgcG9zaXRpb24gZm9yIHRpZXIgbGFiZWxzIik7dGhpcy5fdGllckxhYmVsUG9zaXRpb25zPXo7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUubWF4VGltZUludGVydmFsUHJlY2lzaW9uPWZ1bmN0aW9uKHope2lmKG51bGw9PXopcmV0dXJuIHRoaXMuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbjt0aGlzLl9tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb249ejt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt5LnByb3RvdHlwZS5jdXJyZW50QXhpc0NvbmZpZ3VyYXRpb249CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9uc1t0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4XX07eS5wcm90b3R5cGUuYXhpc0NvbmZpZ3VyYXRpb25zPWZ1bmN0aW9uKHope2lmKG51bGwhPXope3RoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9ucz16O3RoaXMuX251bVRpZXJzPXEuTWF0aC5tYXgodGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zLm1hcChmdW5jdGlvbihGKXtyZXR1cm4gRi5sZW5ndGh9KSwwKTt0aGlzLl9pc0FuY2hvcmVkJiZ0aGlzLl9zZXR1cERvbUVsZW1lbnRzKCk7ej10aGlzLnRpZXJMYWJlbFBvc2l0aW9ucygpO2Zvcih2YXIgeD1bXSxDPTA7Qzx0aGlzLl9udW1UaWVycztDKyspeC5wdXNoKHpbQ118fCJiZXR3ZWVuIik7dGhpcy50aWVyTGFiZWxQb3NpdGlvbnMoeCk7dGhpcy5yZWRyYXcoKX19O3kucHJvdG90eXBlLl9nZXRNb3N0UHJlY2lzZUNvbmZpZ3VyYXRpb25JbmRleD0KZnVuY3Rpb24oKXt2YXIgej10aGlzLHg9dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zLmxlbmd0aDt0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMuZm9yRWFjaChmdW5jdGlvbihDLEYpe0Y8eCYmQy5ldmVyeShmdW5jdGlvbihEKXtyZXR1cm4gei5fY2hlY2tUaW1lQXhpc1RpZXJDb25maWd1cmF0aW9uKEQpfSkmJih4PUYpfSk7eD09PXRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9ucy5sZW5ndGgmJihxLldpbmRvdy53YXJuKCJ6b29tZWQgb3V0IHRvbyBmYXI6IGNvdWxkIG5vdCBmaW5kIHN1aXRhYmxlIGludGVydmFsIHRvIGRpc3BsYXkgbGFiZWxzIiksLS14KTtyZXR1cm4geH07eS5wcm90b3R5cGUub3JpZW50YXRpb249ZnVuY3Rpb24oeil7aWYoeiYmKCJyaWdodCI9PT16LnRvTG93ZXJDYXNlKCl8fCJsZWZ0Ij09PXoudG9Mb3dlckNhc2UoKSkpdGhyb3cgRXJyb3IoeisiIGlzIG5vdCBhIHN1cHBvcnRlZCBvcmllbnRhdGlvbiBmb3IgVGltZUF4aXMgLSBvbmx5IGhvcml6b250YWwgb3JpZW50YXRpb25zIGFyZSBzdXBwb3J0ZWQiKTsKcmV0dXJuIHYucHJvdG90eXBlLm9yaWVudGF0aW9uLmNhbGwodGhpcyx6KX07eS5wcm90b3R5cGUuX2NvbXB1dGVIZWlnaHQ9ZnVuY3Rpb24oKXt2YXIgej10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0O3RoaXMuX3RpZXJIZWlnaHRzPVtdO2Zvcih2YXIgeD0wO3g8dGhpcy5fbnVtVGllcnM7eCsrKXRoaXMuX3RpZXJIZWlnaHRzLnB1c2goeit0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSsoImJldHdlZW4iPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW3hdPzA6dGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkpKTtyZXR1cm4gbC5zdW0odGhpcy5fdGllckhlaWdodHMpfTt5LnByb3RvdHlwZS5fZ2V0SW50ZXJ2YWxMZW5ndGg9ZnVuY3Rpb24oeil7dmFyIHg9dGhpcy5fc2NhbGUuZG9tYWluKClbMF07ej1wLlRpbWUudGltZUludGVydmFsVG9EM1RpbWUoei5pbnRlcnZhbCkub2Zmc2V0KHgsei5zdGVwKTtyZXR1cm4gej50aGlzLl9zY2FsZS5kb21haW4oKVsxXT90aGlzLndpZHRoKCk6Ck1hdGguYWJzKHRoaXMuX3NjYWxlLnNjYWxlKHopLXRoaXMuX3NjYWxlLnNjYWxlKHgpKX07eS5wcm90b3R5cGUuX21heFdpZHRoRm9ySW50ZXJ2YWw9ZnVuY3Rpb24oeil7cmV0dXJuIHRoaXMuX21lYXN1cmVyLm1lYXN1cmUoei5mb3JtYXR0ZXIoeS5fTE9OR19EQVRFKSkud2lkdGh9O3kucHJvdG90eXBlLl9jaGVja1RpbWVBeGlzVGllckNvbmZpZ3VyYXRpb249ZnVuY3Rpb24oeil7aWYobnVsbCE9dGhpcy5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uKXt2YXIgeD15Ll9TT1JURURfVElNRV9JTlRFUlZBTF9JTkRFWFt0aGlzLl9tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb25dLEM9eS5fU09SVEVEX1RJTUVfSU5URVJWQUxfSU5ERVhbei5pbnRlcnZhbF07aWYobnVsbCE9eCYmbnVsbCE9QyYmQzx4KXJldHVybiExfXg9dGhpcy5fbWF4V2lkdGhGb3JJbnRlcnZhbCh6KSsyKnRoaXMudGlja0xhYmVsUGFkZGluZygpO3JldHVybiBNYXRoLm1pbih0aGlzLl9nZXRJbnRlcnZhbExlbmd0aCh6KSwKdGhpcy53aWR0aCgpKT49eH07eS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24oeix4KXt2YXIgQz12LnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlci5jYWxsKHRoaXMseix4KTt6PXRoaXMuX3RpZXJIZWlnaHRzLnJlZHVjZShmdW5jdGlvbihGLEQpe3JldHVybiBGK0Q+Qy5oZWlnaHQ/RjpGK0R9KTt4PXRoaXMubWFyZ2luKCkrKHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCk/dGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCkqdGhpcy5fYW5ub3RhdGlvblRpZXJIZWlnaHQoKTowKTtDLmhlaWdodD1NYXRoLm1pbihDLmhlaWdodCx6K3gpO3JldHVybiBDfTt5LnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt2LnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9zZXR1cERvbUVsZW1lbnRzKCl9O3kucHJvdG90eXBlLl9zZXR1cERvbUVsZW1lbnRzPWZ1bmN0aW9uKCl7dGhpcy5jb250ZW50KCkuc2VsZWN0QWxsKCIuIit5LlRJTUVfQVhJU19USUVSX0NMQVNTKS5yZW1vdmUoKTsKdGhpcy5fdGllckxhYmVsQ29udGFpbmVycz1bXTt0aGlzLl90aWVyTWFya0NvbnRhaW5lcnM9W107dGhpcy5fdGllckJhc2VsaW5lcz1bXTt0aGlzLl90aWNrTGFiZWxDb250YWluZXIucmVtb3ZlKCk7dGhpcy5fYmFzZWxpbmUucmVtb3ZlKCk7Zm9yKHZhciB6PTA7ejx0aGlzLl9udW1UaWVyczsrK3ope3ZhciB4PXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoeS5USU1FX0FYSVNfVElFUl9DTEFTUywhMCk7dGhpcy5fdGllckxhYmVsQ29udGFpbmVycy5wdXNoKHguYXBwZW5kKCJnIikuY2xhc3NlZChyLkF4aXMuVElDS19MQUJFTF9DTEFTUysiLWNvbnRhaW5lciIsITApKTt0aGlzLl90aWVyTWFya0NvbnRhaW5lcnMucHVzaCh4LmFwcGVuZCgiZyIpLmNsYXNzZWQoci5BeGlzLlRJQ0tfTUFSS19DTEFTUysiLWNvbnRhaW5lciIsITApKTt0aGlzLl90aWVyQmFzZWxpbmVzLnB1c2goeC5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApKX16PW5ldyBrLlN2Z0NvbnRleHQodGhpcy5fdGllckxhYmVsQ29udGFpbmVyc1swXS5ub2RlKCkpOwp0aGlzLl9tZWFzdXJlcj1uZXcgay5DYWNoZU1lYXN1cmVyKHopfTt5LnByb3RvdHlwZS5fZ2V0VGlja0ludGVydmFsVmFsdWVzPWZ1bmN0aW9uKHope3JldHVybiB0aGlzLl9zY2FsZS50aWNrSW50ZXJ2YWwoei5pbnRlcnZhbCx6LnN0ZXApfTt5LnByb3RvdHlwZS5fZ2V0VGlja1ZhbHVlcz1mdW5jdGlvbigpe3ZhciB6PXRoaXM7cmV0dXJuIHRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9uc1t0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4XS5yZWR1Y2UoZnVuY3Rpb24oeCxDKXtyZXR1cm4geC5jb25jYXQoei5fZ2V0VGlja0ludGVydmFsVmFsdWVzKEMpKX0sW10pfTt5LnByb3RvdHlwZS5fY2xlYW5UaWVycz1mdW5jdGlvbigpe2Zvcih2YXIgej0wO3o8dGhpcy5fdGllckxhYmVsQ29udGFpbmVycy5sZW5ndGg7eisrKXRoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnNbel0uc2VsZWN0QWxsKCIuIityLkF4aXMuVElDS19MQUJFTF9DTEFTUykucmVtb3ZlKCksdGhpcy5fdGllck1hcmtDb250YWluZXJzW3pdLnNlbGVjdEFsbCgiLiIrCnIuQXhpcy5USUNLX01BUktfQ0xBU1MpLnJlbW92ZSgpLHRoaXMuX3RpZXJCYXNlbGluZXNbel0uc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX07eS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXNGb3JDb25maWd1cmF0aW9uPWZ1bmN0aW9uKHope3o9dGhpcy5fc2NhbGUudGlja0ludGVydmFsKHouaW50ZXJ2YWwsei5zdGVwKTt2YXIgeD10aGlzLl9zY2FsZS5kb21haW4oKSxDPXoubWFwKGZ1bmN0aW9uKEYpe3JldHVybiBGLnZhbHVlT2YoKX0pOy0xPT09Qy5pbmRleE9mKHhbMF0udmFsdWVPZigpKSYmei51bnNoaWZ0KHhbMF0pOy0xPT09Qy5pbmRleE9mKHhbMV0udmFsdWVPZigpKSYmei5wdXNoKHhbMV0pO3JldHVybiB6fTt5LnByb3RvdHlwZS5fcmVuZGVyVGllckxhYmVscz1mdW5jdGlvbih6LHgsQyl7dmFyIEY9dGhpcyxEPXRoaXMuX2dldFRpY2tWYWx1ZXNGb3JDb25maWd1cmF0aW9uKHgpLEI9W107ImJldHdlZW4iPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW0NdJiYKMT09PXguc3RlcD9ELm1hcChmdW5jdGlvbihLLE0pe00rMT49RC5sZW5ndGh8fEIucHVzaChuZXcgRGF0ZSgoRFtNKzFdLnZhbHVlT2YoKS1EW01dLnZhbHVlT2YoKSkvMitEW01dLnZhbHVlT2YoKSkpfSk6Qj1EO3o9ei5zZWxlY3RBbGwoIi4iK3IuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5kYXRhKEIsZnVuY3Rpb24oSyl7cmV0dXJuIFN0cmluZyhLLnZhbHVlT2YoKSl9KTt2YXIgST16LmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZChyLkF4aXMuVElDS19MQUJFTF9DTEFTUywhMCk7SS5hcHBlbmQoInRleHQiKTt2YXIgTz0iY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tDXXx8MT09PXguc3RlcD8wOnRoaXMudGlja0xhYmVsUGFkZGluZygpO3ZhciBQPSJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpP2wuc3VtKHRoaXMuX3RpZXJIZWlnaHRzLnNsaWNlKDAsQysxKSktdGhpcy50aWNrTGFiZWxQYWRkaW5nKCk6ImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbQ10/CnRoaXMuaGVpZ2h0KCktbC5zdW0odGhpcy5fdGllckhlaWdodHMuc2xpY2UoMCxDKSktdGhpcy50aWNrTGFiZWxQYWRkaW5nKCktdGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCk6dGhpcy5oZWlnaHQoKS1sLnN1bSh0aGlzLl90aWVySGVpZ2h0cy5zbGljZSgwLEMpKS10aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTtJPXoubWVyZ2UoSSk7dmFyIEg9SS5zZWxlY3RBbGwoInRleHQiKTswPEguc2l6ZSgpJiZILmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK08rIiwiK1ArIikiKTt6LmV4aXQoKS5yZW1vdmUoKTtJLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oSyl7cmV0dXJuInRyYW5zbGF0ZSgiK0YuX3NjYWxlLnNjYWxlKEspKyIsMCkifSk7Qz0iY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tDXXx8MT09PXguc3RlcD8ibWlkZGxlIjoic3RhcnQiO0kuc2VsZWN0QWxsKCJ0ZXh0IikudGV4dCh4LmZvcm1hdHRlcikuc3R5bGUoInRleHQtYW5jaG9yIixDKX07eS5wcm90b3R5cGUuX3JlbmRlclRpY2tNYXJrcz0KZnVuY3Rpb24oeix4KXt6PXRoaXMuX3RpZXJNYXJrQ29udGFpbmVyc1t4XS5zZWxlY3RBbGwoIi4iK3IuQXhpcy5USUNLX01BUktfQ0xBU1MpLmRhdGEoeik7dmFyIEM9ei5lbnRlcigpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoci5BeGlzLlRJQ0tfTUFSS19DTEFTUywhMCkubWVyZ2UoeiksRj10aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goKSxEPXRoaXMuX3RpZXJIZWlnaHRzLnNsaWNlKDAseCkucmVkdWNlKGZ1bmN0aW9uKEIsSSl7cmV0dXJuIEIrSX0sMCk7ImJvdHRvbSI9PT10aGlzLm9yaWVudGF0aW9uKCk/KEYueTE9RCxGLnkyPUQrKCJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW3hdP3RoaXMuaW5uZXJUaWNrTGVuZ3RoKCk6dGhpcy5fdGllckhlaWdodHNbeF0pKTooRi55MT10aGlzLmhlaWdodCgpLUQsRi55Mj10aGlzLmhlaWdodCgpLShEKygiY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1t4XT90aGlzLmlubmVyVGlja0xlbmd0aCgpOgp0aGlzLl90aWVySGVpZ2h0c1t4XSkpKTtDLmF0dHJzKEYpOyJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpPyhGLnkxPUQsRi55Mj1EKygiY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1t4XT90aGlzLmVuZFRpY2tMZW5ndGgoKTp0aGlzLl90aWVySGVpZ2h0c1t4XSkpOihGLnkxPXRoaXMuaGVpZ2h0KCktRCxGLnkyPXRoaXMuaGVpZ2h0KCktKEQrKCJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW3hdP3RoaXMuZW5kVGlja0xlbmd0aCgpOnRoaXMuX3RpZXJIZWlnaHRzW3hdKSkpO2wuc2VsZWN0KEMubm9kZXMoKVswXSkuYXR0cnMoRik7bC5zZWxlY3QoQy5ub2RlcygpW0Muc2l6ZSgpLTFdKS5hdHRycyhGKTtsLnNlbGVjdChDLm5vZGVzKClbMF0pLmNsYXNzZWQoci5BeGlzLkVORF9USUNLX01BUktfQ0xBU1MsITApO2wuc2VsZWN0KEMubm9kZXMoKVtDLnNpemUoKS0xXSkuY2xhc3NlZChyLkF4aXMuRU5EX1RJQ0tfTUFSS19DTEFTUywhMCk7ei5leGl0KCkucmVtb3ZlKCl9Owp5LnByb3RvdHlwZS5fcmVuZGVyTGFiZWxsZXNzVGlja01hcmtzPWZ1bmN0aW9uKHope3o9dGhpcy5fdGlja01hcmtDb250YWluZXIuc2VsZWN0QWxsKCIuIityLkF4aXMuVElDS19NQVJLX0NMQVNTKS5kYXRhKHopO3ZhciB4PXouZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKHIuQXhpcy5USUNLX01BUktfQ0xBU1MsITApLm1lcmdlKHopLEM9dGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCk7Qy55Mj0iYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT90aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTp0aGlzLmhlaWdodCgpLXRoaXMudGlja0xhYmVsUGFkZGluZygpO3guYXR0cnMoQyk7ei5leGl0KCkucmVtb3ZlKCl9O3kucHJvdG90eXBlLl9nZW5lcmF0ZUxhYmVsbGVzc1RpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIDE+dGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleD9bXTp0aGlzLl9nZXRUaWNrSW50ZXJ2YWxWYWx1ZXModGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zW3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXgtCjFdWzBdKX07eS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt2YXIgej10aGlzO3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXg9dGhpcy5fZ2V0TW9zdFByZWNpc2VDb25maWd1cmF0aW9uSW5kZXgoKTt2YXIgeD10aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnNbdGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleF07dGhpcy5fY2xlYW5UaWVycygpO3guZm9yRWFjaChmdW5jdGlvbihJLE8pe3JldHVybiB6Ll9yZW5kZXJUaWVyTGFiZWxzKHouX3RpZXJMYWJlbENvbnRhaW5lcnNbT10sSSxPKX0pO2Zvcih2YXIgQz14Lm1hcChmdW5jdGlvbihJKXtyZXR1cm4gei5fZ2V0VGlja1ZhbHVlc0ZvckNvbmZpZ3VyYXRpb24oSSl9KSxGPTAsRD0wO0Q8TWF0aC5tYXgoeC5sZW5ndGgsMSk7KytEKXt2YXIgQj10aGlzLl9nZW5lcmF0ZUJhc2VsaW5lQXR0ckhhc2goKTtCLnkxKz0iYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT9GOi1GO0IueTI9Qi55MTsKdGhpcy5fdGllckJhc2VsaW5lc1tEXS5hdHRycyhCKS5zdHlsZSgidmlzaWJpbGl0eSIsImluaGVyaXQiKTtGKz10aGlzLl90aWVySGVpZ2h0c1tEXX1GPVtdO0Q9dGhpcy5fc2NhbGUuZG9tYWluKCk7RD10aGlzLl9zY2FsZS5zY2FsZShEWzFdKS10aGlzLl9zY2FsZS5zY2FsZShEWzBdKTsxLjUqdGhpcy5fZ2V0SW50ZXJ2YWxMZW5ndGgoeFswXSk+PUQmJihGPXRoaXMuX2dlbmVyYXRlTGFiZWxsZXNzVGlja3MoKSk7dGhpcy5fcmVuZGVyTGFiZWxsZXNzVGlja01hcmtzKEYpO3RoaXMuX2hpZGVPdmVyZmxvd2luZ1RpZXJzKCk7Zm9yKEQ9MDtEPHgubGVuZ3RoOysrRCl0aGlzLl9yZW5kZXJUaWNrTWFya3MoQ1tEXSxEKSx0aGlzLl9oaWRlT3ZlcmxhcHBpbmdBbmRDdXRPZmZMYWJlbHMoRCk7dGhpcy5hbm5vdGF0aW9uc0VuYWJsZWQoKT90aGlzLl9kcmF3QW5ub3RhdGlvbnMoKTp0aGlzLl9yZW1vdmVBbm5vdGF0aW9ucygpO3JldHVybiB0aGlzfTt5LnByb3RvdHlwZS5faGlkZU92ZXJmbG93aW5nVGllcnM9CmZ1bmN0aW9uKCl7dmFyIHo9dGhpcyx4PXRoaXMuaGVpZ2h0KCksQz0wO3RoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiLiIreS5USU1FX0FYSVNfVElFUl9DTEFTUykuYXR0cigidmlzaWJpbGl0eSIsZnVuY3Rpb24oRixEKXtDKz16Ll90aWVySGVpZ2h0c1tEXTtyZXR1cm4gQzw9eD8iaW5oZXJpdCI6ImhpZGRlbiJ9KX07eS5wcm90b3R5cGUuX2hpZGVPdmVybGFwcGluZ0FuZEN1dE9mZkxhYmVscz1mdW5jdGlvbih6KXtmdW5jdGlvbiB4KEkpe3JldHVybiBNYXRoLmZsb29yKEYubGVmdCk8PU1hdGguY2VpbChJLmxlZnQpJiZNYXRoLmZsb29yKEYudG9wKTw9TWF0aC5jZWlsKEkudG9wKSYmTWF0aC5mbG9vcihJLnJpZ2h0KTw9TWF0aC5jZWlsKEYubGVmdCtDLndpZHRoKCkpJiZNYXRoLmZsb29yKEkuYm90dG9tKTw9TWF0aC5jZWlsKEYudG9wK0MuaGVpZ2h0KCkpfXZhciBDPXRoaXMsRj10aGlzLmVsZW1lbnQoKS5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksRD10aGlzLl90aWVyTWFya0NvbnRhaW5lcnNbel0uc2VsZWN0QWxsKCIuIisKci5BeGlzLlRJQ0tfTUFSS19DTEFTUykuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIEk9bC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiKTtyZXR1cm4idmlzaWJsZSI9PT1JfHwiaW5oZXJpdCI9PT1JfSkubm9kZXMoKS5tYXAoZnVuY3Rpb24oSSl7cmV0dXJuIEkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9KSxCO3RoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnNbel0uc2VsZWN0QWxsKCIuIityLkF4aXMuVElDS19MQUJFTF9DTEFTUykuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIEk9bC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiKTtyZXR1cm4idmlzaWJsZSI9PT1JfHwiaW5oZXJpdCI9PT1JfSkuZWFjaChmdW5jdGlvbihJLE8pe0k9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgUD1sLnNlbGVjdCh0aGlzKSxIPURbT10sSz1EW08rMV07Tz1udWxsIT1CJiZxLkRPTS5jbGllbnRSZWN0c092ZXJsYXAoSSxCKTtIPW51bGwhPUgmJnEuRE9NLmNsaWVudFJlY3RzT3ZlcmxhcChJLApIKTtLPW51bGwhPUsmJnEuRE9NLmNsaWVudFJlY3RzT3ZlcmxhcChJLEspOyF4KEkpfHxPfHxIfHxLP1Auc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKTooQj1JLFAuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0IikpfSl9O3kucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe3YucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpO3RoaXMuX21lYXN1cmVyLnJlc2V0KCl9O3JldHVybiB5fShyLkF4aXMpO2YuVElNRV9BWElTX1RJRVJfQ0xBU1M9InRpbWUtYXhpcy10aWVyIjtmLl9TT1JURURfVElNRV9JTlRFUlZBTF9JTkRFWD0odD17fSx0W2QuVGltZUludGVydmFsLnNlY29uZF09MCx0W2QuVGltZUludGVydmFsLm1pbnV0ZV09MSx0W2QuVGltZUludGVydmFsLmhvdXJdPTIsdFtkLlRpbWVJbnRlcnZhbC5kYXldPTMsdFtkLlRpbWVJbnRlcnZhbC53ZWVrXT00LHRbZC5UaW1lSW50ZXJ2YWwubW9udGhdPTUsdFtkLlRpbWVJbnRlcnZhbC55ZWFyXT0KNix0KTtmLl9ERUZBVUxUX1RJTUVfQVhJU19DT05GSUdVUkFUSU9OUz1bW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDo1LGZvcm1hdHRlcjpuLnRpbWUoIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDoxMCxmb3JtYXR0ZXI6bi50aW1lKCIlSTolTTolUyAlcCIpfSx7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bi50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuc2Vjb25kLHN0ZXA6MTUsCmZvcm1hdHRlcjpuLnRpbWUoIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDozMCxmb3JtYXR0ZXI6bi50aW1lKCIlSTolTTolUyAlcCIpfSx7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bi50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6MSxmb3JtYXR0ZXI6bi50aW1lKCIlSTolTSAlcCIpfSx7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bi50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6NSxmb3JtYXR0ZXI6bi50aW1lKCIlSTolTSAlcCIpfSx7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bi50aW1lKCIlQiAlZSwgJVkiKX1dLApbe2ludGVydmFsOmQuVGltZUludGVydmFsLm1pbnV0ZSxzdGVwOjEwLGZvcm1hdHRlcjpuLnRpbWUoIiVJOiVNICVwIil9LHtpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5taW51dGUsc3RlcDoxNSxmb3JtYXR0ZXI6bi50aW1lKCIlSTolTSAlcCIpfSx7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bi50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6MzAsZm9ybWF0dGVyOm4udGltZSgiJUk6JU0gJXAiKX0se2ludGVydmFsOmQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm4udGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLmhvdXIsc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiVJICVwIil9LHtpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5kYXksCnN0ZXA6MSxmb3JtYXR0ZXI6bi50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuaG91cixzdGVwOjMsZm9ybWF0dGVyOm4udGltZSgiJUkgJXAiKX0se2ludGVydmFsOmQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm4udGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLmhvdXIsc3RlcDo2LGZvcm1hdHRlcjpuLnRpbWUoIiVJICVwIil9LHtpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5ob3VyLHN0ZXA6MTIsZm9ybWF0dGVyOm4udGltZSgiJUkgJXAiKX0se2ludGVydmFsOmQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm4udGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm4udGltZSgiJWEgJWUiKX0sCntpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjEsZm9ybWF0dGVyOm4udGltZSgiJUIgJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bi50aW1lKCIlZSIpfSx7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiVCICVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6MSxmb3JtYXR0ZXI6bi50aW1lKCIlQiIpfSx7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOm4udGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiViIil9LHtpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6bi50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjMsZm9ybWF0dGVyOm4udGltZSgiJWIiKX0sCntpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6bi50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjYsZm9ybWF0dGVyOm4udGltZSgiJWIiKX0se2ludGVydmFsOmQuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiV5Iil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLnllYXIsc3RlcDo1LGZvcm1hdHRlcjpuLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLnllYXIsc3RlcDoyNSxmb3JtYXR0ZXI6bi50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6NTAsZm9ybWF0dGVyOm4udGltZSgiJVkiKX1dLApbe2ludGVydmFsOmQuVGltZUludGVydmFsLnllYXIsc3RlcDoxMDAsZm9ybWF0dGVyOm4udGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjIwMCxmb3JtYXR0ZXI6bi50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6NTAwLGZvcm1hdHRlcjpuLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLnllYXIsc3RlcDoxRTMsZm9ybWF0dGVyOm4udGltZSgiJVkiKX1dXTtmLl9MT05HX0RBVEU9bmV3IERhdGUoOTk5OSw4LDI5LDEyLDU5LDk5OTkpO2QuVGltZT1mO3ZhciB0fSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGssbil7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9a31mb3IodmFyIHEgaW4gbiluLmhhc093blByb3BlcnR5KHEpJiYoa1txXT1uW3FdKTtrLnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihwLnByb3RvdHlwZT0Kbi5wcm90b3R5cGUsbmV3IHApfSxsPWYoMTIpO2M9ZnVuY3Rpb24oayl7ZnVuY3Rpb24gbigpe3ZhciBwPWsuY2FsbCh0aGlzKXx8dGhpcztwLl9kZXRhY2hDYWxsYmFjaz1mdW5jdGlvbihxKXtyZXR1cm4gcC5yZW1vdmUocSl9O3JldHVybiBwfWcobixrKTtuLnByb3RvdHlwZS5hbmNob3I9ZnVuY3Rpb24ocCl7dmFyIHE9dGhpcztwPWwuY29lcmNlRXh0ZXJuYWxEMyhwKTtrLnByb3RvdHlwZS5hbmNob3IuY2FsbCh0aGlzLHApO3RoaXMuX2ZvckVhY2goZnVuY3Rpb24ocil7cmV0dXJuIHIuYW5jaG9yKHEuZWxlbWVudCgpKX0pO3JldHVybiB0aGlzfTtuLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKHApe3JldHVybiBwLnJlbmRlcigpfSk7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLmhhcz1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJoYXMoKSBpcyBub3QgaW1wbGVtZW50ZWQgb24gQ29tcG9uZW50Q29udGFpbmVyIik7fTtuLnByb3RvdHlwZS5fYWRvcHRBbmRBbmNob3I9CmZ1bmN0aW9uKHApe3AucGFyZW50KHRoaXMpO3Aub25EZXRhY2godGhpcy5fZGV0YWNoQ2FsbGJhY2spO3RoaXMuX2lzQW5jaG9yZWQmJnAuYW5jaG9yKHRoaXMuZWxlbWVudCgpKX07bi5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHApe3RoaXMuaGFzKHApJiYocC5vZmZEZXRhY2godGhpcy5fZGV0YWNoQ2FsbGJhY2spLHRoaXMuX3JlbW92ZShwKSxwLmRldGFjaCgpLHRoaXMucmVkcmF3KCkpO3JldHVybiB0aGlzfTtuLnByb3RvdHlwZS5fcmVtb3ZlPWZ1bmN0aW9uKCl7fTtuLnByb3RvdHlwZS5fZm9yRWFjaD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJfZm9yRWFjaCgpIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiBDb21wb25lbnRDb250YWluZXIiKTt9O24ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtrLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy5fZm9yRWFjaChmdW5jdGlvbihwKXtyZXR1cm4gcC5kZXN0cm95KCl9KX07bi5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPQpmdW5jdGlvbigpe3RoaXMuX2ZvckVhY2goZnVuY3Rpb24ocCl7cmV0dXJuIHAuaW52YWxpZGF0ZUNhY2hlKCl9KX07cmV0dXJuIG59KGYoNCkuQ29tcG9uZW50KTtkLkNvbXBvbmVudENvbnRhaW5lcj1jfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyh5KXtxLmFkZCh5KTtwLmFkZCh5KTtsKCl9ZnVuY3Rpb24gbCgpe3J8fChyPSEwLHYucmVuZGVyKCkpfXZhciBrPWYoMCk7Yz1mKDEwKTt2YXIgbj1mKDM5KSxwPW5ldyBrLlNldCxxPW5ldyBrLlNldCxyPSExLHQ9ITE7ZC5Qb2xpY3k9Yy5tYWtlRW51bShbImltbWVkaWF0ZSIsImFuaW1hdGlvbkZyYW1lIiwidGltZW91dCJdKTt2YXIgdj1uZXcgbi5BbmltYXRpb25GcmFtZTtkLnJlbmRlclBvbGljeT1mdW5jdGlvbigpe3ZhciB5PVBsb3R0YWJsZS5SZW5kZXJDb250cm9sbGVyLlBvbGljeS5pbW1lZGlhdGU7aWYobnVsbCE9eSlzd2l0Y2goeSl7Y2FzZSBkLlBvbGljeS5pbW1lZGlhdGU6dj1uZXcgbi5JbW1lZGlhdGU7YnJlYWs7CmNhc2UgZC5Qb2xpY3kuYW5pbWF0aW9uRnJhbWU6dj1uZXcgbi5BbmltYXRpb25GcmFtZTticmVhaztjYXNlIGQuUG9saWN5LnRpbWVvdXQ6dj1uZXcgbi5UaW1lb3V0O2JyZWFrO2RlZmF1bHQ6ay5XaW5kb3cud2FybigiVW5yZWNvZ25pemVkIHJlbmRlclBvbGljeTogIit5KX19O2QucmVnaXN0ZXJUb1JlbmRlcj1mdW5jdGlvbih5KXt0JiZrLldpbmRvdy53YXJuKCJSZWdpc3RlcmVkIHRvIHJlbmRlciB3aGlsZSBvdGhlciBjb21wb25lbnRzIGFyZSBmbHVzaGluZzogcmVxdWVzdCBtYXkgYmUgaWdub3JlZCIpO3AuYWRkKHkpO2woKX07ZC5yZWdpc3RlclRvQ29tcHV0ZUxheW91dEFuZFJlbmRlcj1nO2QucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oeSl7Zyh5KX07ZC5mbHVzaD1mdW5jdGlvbigpe2lmKHIpe3EuZm9yRWFjaChmdW5jdGlvbih6KXtyZXR1cm4gei5jb21wdXRlTGF5b3V0KCl9KTtwLmZvckVhY2goZnVuY3Rpb24oeil7cmV0dXJuIHoucmVuZGVyKCl9KTsKdD0hMDt2YXIgeT1uZXcgay5TZXQ7cC5mb3JFYWNoKGZ1bmN0aW9uKHope3RyeXt6LnJlbmRlckltbWVkaWF0ZWx5KCl9Y2F0Y2goeCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyB4O30sMCkseS5hZGQoeil9fSk7cT1uZXcgay5TZXQ7cD15O3Q9cj0hMX19fSxmdW5jdGlvbihjLGQsZil7dmFyIGc9ZigxKTtkLmNpcmNsZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihrKXtyZXR1cm4gZy5zeW1ib2woKS50eXBlKGcuc3ltYm9sQ2lyY2xlKS5zaXplKE1hdGguUEkqTWF0aC5wb3coay8yLDIpKX19O2Quc3F1YXJlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGspe3JldHVybiBnLnN5bWJvbCgpLnR5cGUoZy5zeW1ib2xTcXVhcmUpLnNpemUoTWF0aC5wb3coaywyKSl9fTtkLmNyb3NzPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGspe3JldHVybiBnLnN5bWJvbCgpLnR5cGUoZy5zeW1ib2xDcm9zcykuc2l6ZSg1LzkqTWF0aC5wb3coaywyKSl9fTtkLmRpYW1vbmQ9CmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGspe3JldHVybiBnLnN5bWJvbCgpLnR5cGUoZy5zeW1ib2xEaWFtb25kKS5zaXplKE1hdGgudGFuKE1hdGguUEkvNikqTWF0aC5wb3coaywyKS8yKX19O2QudHJpYW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oayl7cmV0dXJuIGcuc3ltYm9sKCkudHlwZShnLnN5bWJvbFRyaWFuZ2xlKS5zaXplKE1hdGguc3FydCgzKSpNYXRoLnBvdyhrLzIsMikpfX07ZC5zdGFyPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGspe3JldHVybiBnLnN5bWJvbCgpLnR5cGUoZy5zeW1ib2xTdGFyKS5zaXplKC44OTA4MTMwOTE1MjkyODUyKk1hdGgucG93KGsvMiwyKSl9fTt2YXIgbD0zKigxL01hdGguc3FydCgxMikvMisxKTtkLnd5ZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihrKXtyZXR1cm4gZy5zeW1ib2woKS50eXBlKGcuc3ltYm9sV3llKS5zaXplKGwqTWF0aC5wb3coay8yLjQsMikpfX19LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz0KdGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHEscil7ZnVuY3Rpb24gdCgpe3RoaXMuY29uc3RydWN0b3I9cX1mb3IodmFyIHYgaW4gcilyLmhhc093blByb3BlcnR5KHYpJiYocVt2XT1yW3ZdKTtxLnByb3RvdHlwZT1udWxsPT09cj9PYmplY3QuY3JlYXRlKHIpOih0LnByb3RvdHlwZT1yLnByb3RvdHlwZSxuZXcgdCl9LGw9ZigyNSksaz1mKDApLG49ZigxMikscD1mKDM3KTtjPWZ1bmN0aW9uKHEpe2Z1bmN0aW9uIHIoKXt2YXIgdD1xLmNhbGwodGhpcyl8fHRoaXM7dC5fZGV0ZWN0aW9uUmFkaXVzPTM7dC5fcmVzaXphYmxlPSExO3QuX21vdmFibGU9ITE7dC5faGFzQ29ybmVycz0hMDt0LmFkZENsYXNzKCJkcmFnLWJveC1sYXllciIpO3QuX2RyYWdJbnRlcmFjdGlvbj1uZXcgbC5EcmFnO3QuX3NldFVwQ2FsbGJhY2tzKCk7dC5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKHQpO3QuX2RyYWdTdGFydENhbGxiYWNrcz1uZXcgay5DYWxsYmFja1NldDt0Ll9kcmFnQ2FsbGJhY2tzPQpuZXcgay5DYWxsYmFja1NldDt0Ll9kcmFnRW5kQ2FsbGJhY2tzPW5ldyBrLkNhbGxiYWNrU2V0O3JldHVybiB0fWcocixxKTtyLnByb3RvdHlwZS5fc2V0VXBDYWxsYmFja3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KEksTyl7MD09PUImJkkueD09PU8ueCYmSS55PT09Ty55JiZ6LmJveFZpc2libGUoITEpO3ouX2RyYWdFbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh6LmJvdW5kcygpKX1mdW5jdGlvbiB2KEksTyl7c3dpdGNoKEIpe2Nhc2UgMDpGLng9Ty54O0YueT1PLnk7YnJlYWs7Y2FzZSAxOnguYm90dG9tP0YueT1PLnk6eC50b3AmJihDLnk9Ty55KTt4LnJpZ2h0P0YueD1PLng6eC5sZWZ0JiYoQy54PU8ueCk7YnJlYWs7Y2FzZSAyOkk9Ty54LUQueDt2YXIgUD1PLnktRC55O0MueCs9STtDLnkrPVA7Ri54Kz1JO0YueSs9UDtEPU99ei5fc2V0Qm91bmRzKHt0b3BMZWZ0OkMsYm90dG9tUmlnaHQ6Rn0pO3ouX3hCb3VuZHNNb2RlPT09cC5Qcm9wZXJ0eU1vZGUuVkFMVUUmJm51bGwhPQp6LnhTY2FsZSgpJiZ6Ll9zZXRYRXh0ZW50KFt6LnhTY2FsZSgpLmludmVydChDLngpLHoueFNjYWxlKCkuaW52ZXJ0KEYueCldKTt6Ll95Qm91bmRzTW9kZT09PXAuUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT16LnlTY2FsZSgpJiZ6Ll9zZXRZRXh0ZW50KFt6LnlTY2FsZSgpLmludmVydChDLnkpLHoueVNjYWxlKCkuaW52ZXJ0KEYueSldKTt6LnJlbmRlcigpO3ouX2RyYWdDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh6LmJvdW5kcygpKX1mdW5jdGlvbiB5KEkpe3g9ei5fZ2V0UmVzaXppbmdFZGdlcyhJKTt2YXIgTz16LmJvdW5kcygpO089Ty50b3BMZWZ0Lng8PUkueCYmSS54PD1PLmJvdHRvbVJpZ2h0LngmJk8udG9wTGVmdC55PD1JLnkmJkkueTw9Ty5ib3R0b21SaWdodC55O3ouYm94VmlzaWJsZSgpJiYoeC50b3B8fHguYm90dG9tfHx4LmxlZnR8fHgucmlnaHQpP0I9MTp6LmJveFZpc2libGUoKSYmei5tb3ZhYmxlKCkmJk8/Qj0yOihCPTAsei5fc2V0Qm91bmRzKHt0b3BMZWZ0OkksCmJvdHRvbVJpZ2h0Okl9KSx6Ll94Qm91bmRzTW9kZT09PXAuUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT16LnhTY2FsZSgpJiZ6Ll9zZXRYRXh0ZW50KFt6LnhTY2FsZSgpLmludmVydChJLngpLHoueFNjYWxlKCkuaW52ZXJ0KEkueCldKSx6Ll95Qm91bmRzTW9kZT09PXAuUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT16LnlTY2FsZSgpJiZ6Ll9zZXRZRXh0ZW50KFt6LnlTY2FsZSgpLmludmVydChJLnkpLHoueVNjYWxlKCkuaW52ZXJ0KEkueSldKSx6LnJlbmRlcigpKTt6LmJveFZpc2libGUoITApO089ei5ib3VuZHMoKTtDPXt4Ok8udG9wTGVmdC54LHk6Ty50b3BMZWZ0Lnl9O0Y9e3g6Ty5ib3R0b21SaWdodC54LHk6Ty5ib3R0b21SaWdodC55fTtEPUk7ei5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoTyl9dmFyIHo9dGhpcyx4LEMsRixELEI9MDt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQoeSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZyh2KTsKdGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZCh0KTt0aGlzLl9kaXNjb25uZWN0SW50ZXJhY3Rpb249ZnVuY3Rpb24oKXt6Ll9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZ1N0YXJ0KHkpO3ouX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnKHYpO3ouX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnRW5kKHQpO3ouX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKX19O3IucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtyZXR1cm4gdi5fYm94LmFwcGVuZCgibGluZSIpLnN0eWxlcyh7b3BhY2l0eTowLHN0cm9rZToicGluayIsInBvaW50ZXItZXZlbnRzIjoidmlzaWJsZVN0cm9rZSJ9KX12YXIgdj10aGlzO3EucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX2RldGVjdGlvbkVkZ2VUPXQoKS5jbGFzc2VkKCJkcmFnLWVkZ2UtdGIiLCEwKTt0aGlzLl9kZXRlY3Rpb25FZGdlQj10KCkuY2xhc3NlZCgiZHJhZy1lZGdlLXRiIiwhMCk7dGhpcy5fZGV0ZWN0aW9uRWRnZUw9CnQoKS5jbGFzc2VkKCJkcmFnLWVkZ2UtbHIiLCEwKTt0aGlzLl9kZXRlY3Rpb25FZGdlUj10KCkuY2xhc3NlZCgiZHJhZy1lZGdlLWxyIiwhMCk7aWYodGhpcy5faGFzQ29ybmVycyl7dmFyIHk9ZnVuY3Rpb24oKXtyZXR1cm4gdi5fYm94LmFwcGVuZCgiY2lyY2xlIikuc3R5bGVzKHtvcGFjaXR5OjAsZmlsbDoicGluayIsInBvaW50ZXItZXZlbnRzIjoidmlzaWJsZUZpbGwifSl9O3RoaXMuX2RldGVjdGlvbkNvcm5lclRMPXkoKS5jbGFzc2VkKCJkcmFnLWNvcm5lci10bCIsITApO3RoaXMuX2RldGVjdGlvbkNvcm5lclRSPXkoKS5jbGFzc2VkKCJkcmFnLWNvcm5lci10ciIsITApO3RoaXMuX2RldGVjdGlvbkNvcm5lckJMPXkoKS5jbGFzc2VkKCJkcmFnLWNvcm5lci1ibCIsITApO3RoaXMuX2RldGVjdGlvbkNvcm5lckJSPXkoKS5jbGFzc2VkKCJkcmFnLWNvcm5lci1iciIsITApfX07ci5wcm90b3R5cGUuX2dldFJlc2l6aW5nRWRnZXM9ZnVuY3Rpb24odCl7dmFyIHY9e3RvcDohMSwKYm90dG9tOiExLGxlZnQ6ITEscmlnaHQ6ITF9O2lmKCF0aGlzLnJlc2l6YWJsZSgpKXJldHVybiB2O3ZhciB5PXRoaXMuYm91bmRzKCksej15LnRvcExlZnQueSx4PXkuYm90dG9tUmlnaHQueSxDPXkudG9wTGVmdC54O3k9eS5ib3R0b21SaWdodC54O3ZhciBGPXRoaXMuX2RldGVjdGlvblJhZGl1cztDLUY8PXQueCYmdC54PD15K0YmJih2LnRvcD16LUY8PXQueSYmdC55PD16K0Ysdi5ib3R0b209eC1GPD10LnkmJnQueTw9eCtGKTt6LUY8PXQueSYmdC55PD14K0YmJih2LmxlZnQ9Qy1GPD10LngmJnQueDw9QytGLHYucmlnaHQ9eS1GPD10LngmJnQueDw9eStGKTtyZXR1cm4gdn07ci5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtxLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO2lmKHRoaXMuYm94VmlzaWJsZSgpKXt2YXIgdD10aGlzLmJvdW5kcygpLHY9dC50b3BMZWZ0LnkseT10LmJvdHRvbVJpZ2h0Lnksej10LnRvcExlZnQueDt0PQp0LmJvdHRvbVJpZ2h0Lng7dGhpcy5fZGV0ZWN0aW9uRWRnZVQuYXR0cnMoe3gxOnoseTE6dix4Mjp0LHkyOnYsInN0cm9rZS13aWR0aCI6Mip0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KTt0aGlzLl9kZXRlY3Rpb25FZGdlQi5hdHRycyh7eDE6eix5MTp5LHgyOnQseTI6eSwic3Ryb2tlLXdpZHRoIjoyKnRoaXMuX2RldGVjdGlvblJhZGl1c30pO3RoaXMuX2RldGVjdGlvbkVkZ2VMLmF0dHJzKHt4MTp6LHkxOnYseDI6eix5Mjp5LCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSk7dGhpcy5fZGV0ZWN0aW9uRWRnZVIuYXR0cnMoe3gxOnQseTE6dix4Mjp0LHkyOnksInN0cm9rZS13aWR0aCI6Mip0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KTt0aGlzLl9oYXNDb3JuZXJzJiYodGhpcy5fZGV0ZWN0aW9uQ29ybmVyVEwuYXR0cnMoe2N4OnosY3k6dixyOnRoaXMuX2RldGVjdGlvblJhZGl1c30pLHRoaXMuX2RldGVjdGlvbkNvcm5lclRSLmF0dHJzKHtjeDp0LGN5OnYscjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSwKdGhpcy5fZGV0ZWN0aW9uQ29ybmVyQkwuYXR0cnMoe2N4OnosY3k6eSxyOnRoaXMuX2RldGVjdGlvblJhZGl1c30pLHRoaXMuX2RldGVjdGlvbkNvcm5lckJSLmF0dHJzKHtjeDp0LGN5Onkscjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSl9cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLmRldGVjdGlvblJhZGl1cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZXRlY3Rpb25SYWRpdXN9O3IucHJvdG90eXBlLnJlc2l6YWJsZT1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9yZXNpemFibGU7dGhpcy5fcmVzaXphYmxlPXQ7dGhpcy5fc2V0UmVzaXphYmxlQ2xhc3Nlcyh0KTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUuX3NldFJlc2l6YWJsZUNsYXNzZXM9ZnVuY3Rpb24odCl7dCYmdGhpcy5lbmFibGVkKCk/KHRoaXMuYWRkQ2xhc3MoIngtcmVzaXphYmxlIiksdGhpcy5hZGRDbGFzcygieS1yZXNpemFibGUiKSk6KHRoaXMucmVtb3ZlQ2xhc3MoIngtcmVzaXphYmxlIiksCnRoaXMucmVtb3ZlQ2xhc3MoInktcmVzaXphYmxlIikpfTtyLnByb3RvdHlwZS5tb3ZhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vdmFibGV9O3IucHJvdG90eXBlLl9zZXRNb3ZhYmxlQ2xhc3M9ZnVuY3Rpb24oKXt0aGlzLm1vdmFibGUoKSYmdGhpcy5lbmFibGVkKCk/dGhpcy5hZGRDbGFzcygibW92YWJsZSIpOnRoaXMucmVtb3ZlQ2xhc3MoIm1vdmFibGUiKX07ci5wcm90b3R5cGUub25EcmFnU3RhcnQ9ZnVuY3Rpb24odCl7dGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmFkZCh0KX07ci5wcm90b3R5cGUub2ZmRHJhZ1N0YXJ0PWZ1bmN0aW9uKHQpe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUodCl9O3IucHJvdG90eXBlLm9uRHJhZz1mdW5jdGlvbih0KXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmFkZCh0KTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUub2ZmRHJhZz1mdW5jdGlvbih0KXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZSh0KX07ci5wcm90b3R5cGUub25EcmFnRW5kPQpmdW5jdGlvbih0KXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmFkZCh0KX07ci5wcm90b3R5cGUub2ZmRHJhZ0VuZD1mdW5jdGlvbih0KXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZSh0KX07ci5wcm90b3R5cGUuZHJhZ0ludGVyYWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdJbnRlcmFjdGlvbn07ci5wcm90b3R5cGUuZW5hYmxlZD1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZW5hYmxlZCgpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5lbmFibGVkKHQpO3RoaXMuX3NldFJlc2l6YWJsZUNsYXNzZXModGhpcy5yZXNpemFibGUoKSk7dGhpcy5fc2V0TW92YWJsZUNsYXNzKCk7cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3EucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbih2KXtyZXR1cm4gdC5fZHJhZ0NhbGxiYWNrcy5kZWxldGUodil9KTsKdGhpcy5fZHJhZ0NhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHYpe3JldHVybiB0Ll9kcmFnQ2FsbGJhY2tzLmRlbGV0ZSh2KX0pO3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbih2KXtyZXR1cm4gdC5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUodil9KTt0aGlzLl9kaXNjb25uZWN0SW50ZXJhY3Rpb24oKX07ci5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7dGhpcy5fcmVzZXRTdGF0ZSgpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKTtxLnByb3RvdHlwZS5kZXRhY2guY2FsbCh0aGlzKTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUuYW5jaG9yPWZ1bmN0aW9uKHQpe3Q9bi5jb2VyY2VFeHRlcm5hbEQzKHQpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyh0aGlzKTtxLnByb3RvdHlwZS5hbmNob3IuY2FsbCh0aGlzLHQpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5fcmVzZXRTdGF0ZT1mdW5jdGlvbigpe3RoaXMuYm91bmRzKHt0b3BMZWZ0Ont4OjAsCnk6MH0sYm90dG9tUmlnaHQ6e3g6MCx5OjB9fSl9O3JldHVybiByfShmKDQzKS5TZWxlY3Rpb25Cb3hMYXllcik7ZC5EcmFnQm94TGF5ZXI9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHApe2Z1bmN0aW9uIHEoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciByIGluIHApcC5oYXNPd25Qcm9wZXJ0eShyKSYmKG5bcl09cFtyXSk7bi5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToocS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IHEpfSxsPWYoMTgpO2M9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcCgpe3JldHVybiBuLmNhbGwodGhpcywicGF0aCIsImxpbmUiKXx8dGhpc31nKHAsbik7cC5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24ocSl7cS5zdHlsZSgiZmlsbCIsIm5vbmUiKX07cC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleD1mdW5jdGlvbigpe3JldHVybiBuLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4LmNhbGwodGhpcywKMCl9O3JldHVybiBwfShmKDkpLlNWR0RyYXdlcik7ZC5MaW5lU1ZHRHJhd2VyPWM7dmFyIGs9WyJvcGFjaXR5Iiwic3Ryb2tlLW9wYWNpdHkiLCJzdHJva2Utd2lkdGgiLCJzdHJva2UiXTtkLm1ha2VMaW5lQ2FudmFzRHJhd1N0ZXA9ZnVuY3Rpb24obil7cmV0dXJuIGZ1bmN0aW9uKHAscSxyKXtyPWwucmVzb2x2ZUF0dHJpYnV0ZXMocixrLHFbMF0sMCk7bC5yZW5kZXJMaW5lKHAsbigpLHFbMF0scil9fX0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHApe2Z1bmN0aW9uIHEoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciByIGluIHApcC5oYXNPd25Qcm9wZXJ0eShyKSYmKG5bcl09cFtyXSk7bi5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToocS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IHEpfSxsPWYoMTgpO2M9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcChxKXt2b2lkIDA9PT1xJiYocT0iIik7dmFyIHI9Cm4uY2FsbCh0aGlzLCJyZWN0IiwiIil8fHRoaXM7ci5fcm9vdENsYXNzTmFtZT1xO3IuX3Jvb3QuY2xhc3NlZChyLl9yb290Q2xhc3NOYW1lLCEwKTtyZXR1cm4gcn1nKHAsbik7cmV0dXJuIHB9KGYoOSkuU1ZHRHJhd2VyKTtkLlJlY3RhbmdsZVNWR0RyYXdlcj1jO3ZhciBrPVsieCIsInkiLCJ3aWR0aCIsImhlaWdodCJdO2QuUmVjdGFuZ2xlQ2FudmFzRHJhd1N0ZXA9ZnVuY3Rpb24obixwLHEpe24uc2F2ZSgpO3AuZm9yRWFjaChmdW5jdGlvbihyLHQpe251bGwhPXImJihyPWwucmVzb2x2ZUF0dHJpYnV0ZXNTdWJzZXRXaXRoU3R5bGVzKHEsayxyLHQpLG4uYmVnaW5QYXRoKCksbi5yZWN0KHIueCxyLnksci53aWR0aCxyLmhlaWdodCksbC5yZW5kZXJQYXRoV2l0aFN0eWxlKG4scikpfSk7bi5yZXN0b3JlKCl9O2M9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcChxKXtyZXR1cm4gbi5jYWxsKHRoaXMscSxkLlJlY3RhbmdsZUNhbnZhc0RyYXdTdGVwKXx8dGhpc31nKHAsbik7cmV0dXJuIHB9KGwuQ2FudmFzRHJhd2VyKTsKZC5SZWN0YW5nbGVDYW52YXNEcmF3ZXI9Y30sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcobil7ay5TSE9XX1dBUk5JTkdTJiZjb25zb2xlLndhcm4obil9ZnVuY3Rpb24gbChuLHApe2Zvcih2YXIgcT1bXSxyPTI7cjxhcmd1bWVudHMubGVuZ3RoO3IrKylxW3ItMl09YXJndW1lbnRzW3JdO3JldHVybiAwPT09cD8obihxKSwtMSk6d2luZG93LnNldFRpbWVvdXQobixwLHEpfXZhciBrPWYoMjMpO2Qud2Fybj1nO2Quc2V0VGltZW91dD1sO2QuZGVib3VuY2U9ZnVuY3Rpb24obixwLHEpe2Z1bmN0aW9uIHIoKXtwLmFwcGx5KHEsdil9dmFyIHQ9bnVsbCx2PVtdO3JldHVybiBmdW5jdGlvbigpe3Y9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtjbGVhclRpbWVvdXQodCk7dD1sKHIsbil9fTtkLmRlcHJlY2F0ZWQ9ZnVuY3Rpb24obixwLHEpe3ZvaWQgMD09PXEmJihxPSIiKTtnKCJNZXRob2QgIituKyIgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiB2ZXJzaW9uICIrCnArIi4gUGxlYXNlIHJlZmVyIHRvIHRoZSByZWxlYXNlIG5vdGVzLiAiK3EpfX0sZnVuY3Rpb24oYyxkKXtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZihnKXt0aGlzLnJ1bGVyPW51bGwhPWcuY3JlYXRlUnVsZXI/Zy5jcmVhdGVSdWxlcigpOmd9Zi5wcm90b3R5cGUubWVhc3VyZT1mdW5jdGlvbihnKXt2b2lkIDA9PT1nJiYoZz1mLkhFSUdIVF9URVhUKTtyZXR1cm4gdGhpcy5ydWxlcihnKX07cmV0dXJuIGZ9KCk7Yy5IRUlHSFRfVEVYVD0iYmRwcWwiO2QuQWJzdHJhY3RNZWFzdXJlcj1jfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhsKXtmb3IodmFyIGsgaW4gbClkLmhhc093blByb3BlcnR5KGspfHwoZFtrXT1sW2tdKX1nKGYoMzIpKTtnKGYoNzQpKTtnKGYoNzUpKTtnKGYoNDEpKTtnKGYoNDIpKTtnKGYoNzYpKTtnKGYoNzcpKTtnKGYoNzgpKTtnKGYoNzkpKTtnKGYoNDMpKTtnKGYoODApKTtnKGYoODEpKTtnKGYoODIpKX0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoMCk7Yz0KZnVuY3Rpb24oKXtmdW5jdGlvbiBsKGssbil7dm9pZCAwPT09ayYmKGs9W10pO3ZvaWQgMD09PW4mJihuPXt9KTt0aGlzLl91cGRhdGVJZD0wO3RoaXMuX2RhdGE9azt0aGlzLl9tZXRhZGF0YT1uO3RoaXMuX2NhbGxiYWNrcz1uZXcgZy5DYWxsYmFja1NldH1sLnByb3RvdHlwZS5vblVwZGF0ZT1mdW5jdGlvbihrKXt0aGlzLl9jYWxsYmFja3MuYWRkKGspO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5vZmZVcGRhdGU9ZnVuY3Rpb24oayl7dGhpcy5fY2FsbGJhY2tzLmRlbGV0ZShrKTtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUuZGF0YT1mdW5jdGlvbihrKXtpZihudWxsPT1rKXJldHVybiB0aGlzLl9kYXRhO3RoaXMuX2RhdGE9azt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5tZXRhZGF0YT1mdW5jdGlvbihrKXtpZihudWxsPT1rKXJldHVybiB0aGlzLl9tZXRhZGF0YTt0aGlzLl9tZXRhZGF0YT1rO3RoaXMuX2Rpc3BhdGNoVXBkYXRlKCk7CnJldHVybiB0aGlzfTtsLnByb3RvdHlwZS51cGRhdGVJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl91cGRhdGVJZH07bC5wcm90b3R5cGUuX2Rpc3BhdGNoVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSWQrKzt0aGlzLl9jYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKX07cmV0dXJuIGx9KCk7ZC5EYXRhc2V0PWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz1mKDApLGw9ZigzMCk7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGsoKXt9ay5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7bC5mbHVzaCgpfTtyZXR1cm4ga30oKTtkLkltbWVkaWF0ZT1jO2M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBrKCl7fWsucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe2cuRE9NLnJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsKGwuZmx1c2gpfTtyZXR1cm4ga30oKTtkLkFuaW1hdGlvbkZyYW1lPWM7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGsoKXt0aGlzLl90aW1lb3V0TXNlYz1nLkRPTS5TQ1JFRU5fUkVGUkVTSF9SQVRFX01JTExJU0VDT05EU30Kay5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7c2V0VGltZW91dChsLmZsdXNoLHRoaXMuX3RpbWVvdXRNc2VjKX07cmV0dXJuIGt9KCk7ZC5UaW1lb3V0PWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixwKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgciBpbiBwKXAuaGFzT3duUHJvcGVydHkocikmJihuW3JdPXBbcl0pO24ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX0sbD1mKDEzKSxrPWYoMCk7Yz1mdW5jdGlvbihuKXtmdW5jdGlvbiBwKCl7dmFyIHE9bnVsbCE9PW4mJm4uYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3EuX2tleVByZXNzQ2FsbGJhY2tzPXt9O3EuX2tleVJlbGVhc2VDYWxsYmFja3M9e307cS5fbW91c2VNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4hMX07cS5fZG93bmVkS2V5cz1uZXcgay5TZXQ7CnEuX2tleURvd25DYWxsYmFjaz1mdW5jdGlvbihyLHQpe3JldHVybiBxLl9oYW5kbGVLZXlEb3duRXZlbnQocix0KX07cS5fa2V5VXBDYWxsYmFjaz1mdW5jdGlvbihyKXtyZXR1cm4gcS5faGFuZGxlS2V5VXBFdmVudChyKX07cmV0dXJuIHF9ZyhwLG4pO3AucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24ocSl7bi5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMscSk7dGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyPWwuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl9wb3NpdGlvbkRpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX2tleURpc3BhdGNoZXI9bC5LZXkuZ2V0RGlzcGF0Y2hlcigpO3RoaXMuX2tleURpc3BhdGNoZXIub25LZXlEb3duKHRoaXMuX2tleURvd25DYWxsYmFjayk7dGhpcy5fa2V5RGlzcGF0Y2hlci5vbktleVVwKHRoaXMuX2tleVVwQ2FsbGJhY2spfTtwLnByb3RvdHlwZS5fdW5hbmNob3I9CmZ1bmN0aW9uKCl7bi5wcm90b3R5cGUuX3VuYW5jaG9yLmNhbGwodGhpcyk7dGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyLm9mZk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7dGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyPW51bGw7dGhpcy5fa2V5RGlzcGF0Y2hlci5vZmZLZXlEb3duKHRoaXMuX2tleURvd25DYWxsYmFjayk7dGhpcy5fa2V5RGlzcGF0Y2hlci5vZmZLZXlVcCh0aGlzLl9rZXlVcENhbGxiYWNrKTt0aGlzLl9rZXlEaXNwYXRjaGVyPW51bGx9O3AucHJvdG90eXBlLl9oYW5kbGVLZXlEb3duRXZlbnQ9ZnVuY3Rpb24ocSxyKXt2YXIgdD10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHRoaXMuX3Bvc2l0aW9uRGlzcGF0Y2hlci5sYXN0TW91c2VQb3NpdGlvbigpKTt0aGlzLl9pc0luc2lkZUNvbXBvbmVudCh0KSYmIXIucmVwZWF0JiYodGhpcy5fa2V5UHJlc3NDYWxsYmFja3NbcV0mJnRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW3FdLmNhbGxDYWxsYmFja3MocSksCnRoaXMuX2Rvd25lZEtleXMuYWRkKHEpKX07cC5wcm90b3R5cGUuX2hhbmRsZUtleVVwRXZlbnQ9ZnVuY3Rpb24ocSl7dGhpcy5fZG93bmVkS2V5cy5oYXMocSkmJnRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3NbcV0mJnRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3NbcV0uY2FsbENhbGxiYWNrcyhxKTt0aGlzLl9kb3duZWRLZXlzLmRlbGV0ZShxKX07cC5wcm90b3R5cGUub25LZXlQcmVzcz1mdW5jdGlvbihxLHIpe3RoaXMuX2tleVByZXNzQ2FsbGJhY2tzW3FdfHwodGhpcy5fa2V5UHJlc3NDYWxsYmFja3NbcV09bmV3IGsuQ2FsbGJhY2tTZXQpO3RoaXMuX2tleVByZXNzQ2FsbGJhY2tzW3FdLmFkZChyKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUub2ZmS2V5UHJlc3M9ZnVuY3Rpb24ocSxyKXt0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1txXS5kZWxldGUocik7MD09PXRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW3FdLnNpemUmJmRlbGV0ZSB0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1txXTsKcmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLm9uS2V5UmVsZWFzZT1mdW5jdGlvbihxLHIpe3RoaXMuX2tleVJlbGVhc2VDYWxsYmFja3NbcV18fCh0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW3FdPW5ldyBrLkNhbGxiYWNrU2V0KTt0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW3FdLmFkZChyKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUub2ZmS2V5UmVsZWFzZT1mdW5jdGlvbihxLHIpe3RoaXMuX2tleVJlbGVhc2VDYWxsYmFja3NbcV0uZGVsZXRlKHIpOzA9PT10aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW3FdLnNpemUmJmRlbGV0ZSB0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW3FdO3JldHVybiB0aGlzfTtyZXR1cm4gcH0oZigxNSkuSW50ZXJhY3Rpb24pO2QuS2V5PWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oayxuKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWZvcih2YXIgcSBpbiBuKW4uaGFzT3duUHJvcGVydHkocSkmJgooa1txXT1uW3FdKTtrLnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihwLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgcCl9LGw9ZigwKTtjPWZ1bmN0aW9uKGspe2Z1bmN0aW9uIG4ocCl7dm9pZCAwPT09cCYmKHA9W10pO3ZhciBxPWsuY2FsbCh0aGlzKXx8dGhpcztxLl9jb21wb25lbnRzPVtdO3EuYWRkQ2xhc3MoImNvbXBvbmVudC1ncm91cCIpO3AuZm9yRWFjaChmdW5jdGlvbihyKXtyZXR1cm4gcS5hcHBlbmQocil9KTtyZXR1cm4gcX1nKG4sayk7bi5wcm90b3R5cGUuX2ZvckVhY2g9ZnVuY3Rpb24ocCl7dGhpcy5jb21wb25lbnRzKCkuZm9yRWFjaChwKX07bi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHApe3JldHVybiAwPD10aGlzLl9jb21wb25lbnRzLmluZGV4T2YocCl9O24ucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHAscSl7dmFyIHI9dGhpcy5fY29tcG9uZW50cy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQucmVxdWVzdGVkU3BhY2UocCwKcSl9KTtyZXR1cm57bWluV2lkdGg6bC5NYXRoLm1heChyLGZ1bmN0aW9uKHQpe3JldHVybiB0Lm1pbldpZHRofSwwKSxtaW5IZWlnaHQ6bC5NYXRoLm1heChyLGZ1bmN0aW9uKHQpe3JldHVybiB0Lm1pbkhlaWdodH0sMCl9fTtuLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKHAscSxyKXt2YXIgdD10aGlzO2sucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLHAscSxyKTt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKHYpe3YuY29tcHV0ZUxheW91dCh7eDowLHk6MH0sdC53aWR0aCgpLHQuaGVpZ2h0KCkpfSk7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHAscSl7cmV0dXJue3dpZHRoOnAsaGVpZ2h0OnF9fTtuLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudHMuZXZlcnkoZnVuY3Rpb24ocCl7cmV0dXJuIHAuZml4ZWRXaWR0aCgpfSl9O24ucHJvdG90eXBlLmZpeGVkSGVpZ2h0PQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnRzLmV2ZXJ5KGZ1bmN0aW9uKHApe3JldHVybiBwLmZpeGVkSGVpZ2h0KCl9KX07bi5wcm90b3R5cGUuY29tcG9uZW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnRzLnNsaWNlKCl9O24ucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbihwKXtudWxsPT1wfHx0aGlzLmhhcyhwKXx8KHAuZGV0YWNoKCksdGhpcy5fY29tcG9uZW50cy5wdXNoKHApLHRoaXMuX2Fkb3B0QW5kQW5jaG9yKHApLHRoaXMucmVkcmF3KCkpO3JldHVybiB0aGlzfTtuLnByb3RvdHlwZS5fcmVtb3ZlPWZ1bmN0aW9uKHApe3A9dGhpcy5fY29tcG9uZW50cy5pbmRleE9mKHApOzA8PXAmJnRoaXMuX2NvbXBvbmVudHMuc3BsaWNlKHAsMSl9O3JldHVybiBufShmKDI5KS5Db21wb25lbnRDb250YWluZXIpO2QuR3JvdXA9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihrLG4pe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPQprfWZvcih2YXIgcSBpbiBuKW4uaGFzT3duUHJvcGVydHkocSkmJihrW3FdPW5bcV0pO2sucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHAucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyBwKX07ZigwKTtjPWYoNCk7dmFyIGw7KGZ1bmN0aW9uKGspe2tbay5WQUxVRT0wXT0iVkFMVUUiO2tbay5QSVhFTD0xXT0iUElYRUwifSkobHx8KGw9e30pKTtjPWZ1bmN0aW9uKGspe2Z1bmN0aW9uIG4ocCl7dmFyIHE9ay5jYWxsKHRoaXMpfHx0aGlzO3EuX21vZGU9bC5WQUxVRTtpZihwIT09bi5PUklFTlRBVElPTl9WRVJUSUNBTCYmcCE9PW4uT1JJRU5UQVRJT05fSE9SSVpPTlRBTCl0aHJvdyBFcnJvcihwKyIgaXMgbm90IGEgdmFsaWQgb3JpZW50YXRpb24gZm9yIEd1aWRlTGluZUxheWVyIik7cS5fb3JpZW50YXRpb249cDtxLl9vdmVyZmxvd0hpZGRlbj0hMDtxLmFkZENsYXNzKCJndWlkZS1saW5lLWxheWVyIik7cS5faXNWZXJ0aWNhbCgpP3EuYWRkQ2xhc3MoInZlcnRpY2FsIik6CnEuYWRkQ2xhc3MoImhvcml6b250YWwiKTtxLl9zY2FsZVVwZGF0ZUNhbGxiYWNrPWZ1bmN0aW9uKCl7cS5fc3luY1BpeGVsUG9zaXRpb25BbmRWYWx1ZSgpO3EucmVuZGVyKCl9O3JldHVybiBxfWcobixrKTtuLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtrLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9ndWlkZUxpbmU9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJsaW5lIikuY2xhc3NlZCgiZ3VpZGUtbGluZSIsITApfTtuLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbihwLHEpe3JldHVybnt3aWR0aDpwLGhlaWdodDpxfX07bi5wcm90b3R5cGUuX2lzVmVydGljYWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JpZW50YXRpb249PT1uLk9SSUVOVEFUSU9OX1ZFUlRJQ0FMfTtuLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuITB9O24ucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuITB9O24ucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9CmZ1bmN0aW9uKHAscSxyKXtrLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxwLHEscik7bnVsbCE9dGhpcy5zY2FsZSgpJiYodGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMuc2NhbGUoKS5yYW5nZShbMCx0aGlzLndpZHRoKCldKTp0aGlzLnNjYWxlKCkucmFuZ2UoW3RoaXMuaGVpZ2h0KCksMF0pKTtyZXR1cm4gdGhpc307bi5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtrLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3RoaXMuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWUoKTt0aGlzLl9ndWlkZUxpbmUuYXR0cnMoe3gxOnRoaXMuX2lzVmVydGljYWwoKT90aGlzLnBpeGVsUG9zaXRpb24oKTowLHkxOnRoaXMuX2lzVmVydGljYWwoKT8wOnRoaXMucGl4ZWxQb3NpdGlvbigpLHgyOnRoaXMuX2lzVmVydGljYWwoKT90aGlzLnBpeGVsUG9zaXRpb24oKTp0aGlzLndpZHRoKCkseTI6dGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMuaGVpZ2h0KCk6CnRoaXMucGl4ZWxQb3NpdGlvbigpfSk7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlPWZ1bmN0aW9uKCl7bnVsbCE9dGhpcy5zY2FsZSgpJiYodGhpcy5fbW9kZT09PWwuVkFMVUUmJm51bGwhPXRoaXMudmFsdWUoKT90aGlzLl9waXhlbFBvc2l0aW9uPXRoaXMuc2NhbGUoKS5zY2FsZSh0aGlzLnZhbHVlKCkpOnRoaXMuX21vZGU9PT1sLlBJWEVMJiZudWxsIT10aGlzLnBpeGVsUG9zaXRpb24oKSYmKHRoaXMuX3ZhbHVlPXRoaXMuc2NhbGUoKS5pbnZlcnQodGhpcy5waXhlbFBvc2l0aW9uKCkpKSl9O24ucHJvdG90eXBlLl9zZXRQaXhlbFBvc2l0aW9uV2l0aG91dENoYW5naW5nTW9kZT1mdW5jdGlvbihwKXt0aGlzLl9waXhlbFBvc2l0aW9uPXA7bnVsbCE9dGhpcy5zY2FsZSgpJiYodGhpcy5fdmFsdWU9dGhpcy5zY2FsZSgpLmludmVydCh0aGlzLnBpeGVsUG9zaXRpb24oKSkpO3RoaXMucmVuZGVyKCl9O24ucHJvdG90eXBlLnNjYWxlPQpmdW5jdGlvbihwKXtpZihudWxsPT1wKXJldHVybiB0aGlzLl9zY2FsZTt2YXIgcT10aGlzLl9zY2FsZTtudWxsIT1xJiZxLm9mZlVwZGF0ZSh0aGlzLl9zY2FsZVVwZGF0ZUNhbGxiYWNrKTt0aGlzLl9zY2FsZT1wO3RoaXMuX3NjYWxlLm9uVXBkYXRlKHRoaXMuX3NjYWxlVXBkYXRlQ2FsbGJhY2spO3RoaXMuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWUoKTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtuLnByb3RvdHlwZS52YWx1ZT1mdW5jdGlvbihwKXtpZihudWxsPT1wKXJldHVybiB0aGlzLl92YWx1ZTt0aGlzLl92YWx1ZT1wO3RoaXMuX21vZGU9bC5WQUxVRTt0aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307bi5wcm90b3R5cGUucGl4ZWxQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9waXhlbFBvc2l0aW9ufTtuLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7ay5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpOwpudWxsIT10aGlzLnNjYWxlKCkmJnRoaXMuc2NhbGUoKS5vZmZVcGRhdGUodGhpcy5fc2NhbGVVcGRhdGVDYWxsYmFjayl9O3JldHVybiBufShjLkNvbXBvbmVudCk7Yy5PUklFTlRBVElPTl9WRVJUSUNBTD0idmVydGljYWwiO2MuT1JJRU5UQVRJT05fSE9SSVpPTlRBTD0iaG9yaXpvbnRhbCI7ZC5HdWlkZUxpbmVMYXllcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG4scCl7ZnVuY3Rpb24gcSgpe3RoaXMuY29uc3RydWN0b3I9bn1mb3IodmFyIHIgaW4gcClwLmhhc093blByb3BlcnR5KHIpJiYobltyXT1wW3JdKTtuLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihxLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgcSl9LGw9ZigwKTtjPWYoNCk7dmFyIGs7KGZ1bmN0aW9uKG4pe25bbi5WQUxVRT0wXT0iVkFMVUUiO25bbi5QSVhFTD0xXT0iUElYRUwifSkoaz1kLlByb3BlcnR5TW9kZXx8KGQuUHJvcGVydHlNb2RlPQp7fSkpO2M9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcCgpe3ZhciBxPW4uY2FsbCh0aGlzKXx8dGhpcztxLl9ib3hWaXNpYmxlPSExO3EuX2JveEJvdW5kcz17dG9wTGVmdDp7eDowLHk6MH0sYm90dG9tUmlnaHQ6e3g6MCx5OjB9fTtxLl94Qm91bmRzTW9kZT1rLlBJWEVMO3EuX3lCb3VuZHNNb2RlPWsuUElYRUw7cS5hZGRDbGFzcygic2VsZWN0aW9uLWJveC1sYXllciIpO3EuX2FkanVzdEJvdW5kc0NhbGxiYWNrPWZ1bmN0aW9uKCl7cS5yZW5kZXIoKX07cS5fb3ZlcmZsb3dIaWRkZW49ITA7cS5feEV4dGVudD1bdm9pZCAwLHZvaWQgMF07cS5feUV4dGVudD1bdm9pZCAwLHZvaWQgMF07cmV0dXJuIHF9ZyhwLG4pO3AucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe24ucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX2JveD10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJzZWxlY3Rpb24tYm94IiwhMCkucmVtb3ZlKCk7dGhpcy5fYm94QXJlYT10aGlzLl9ib3guYXBwZW5kKCJyZWN0IikuY2xhc3NlZCgic2VsZWN0aW9uLWFyZWEiLAohMCl9O3AucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHEscil7cmV0dXJue3dpZHRoOnEsaGVpZ2h0OnJ9fTtwLnByb3RvdHlwZS5ib3VuZHM9ZnVuY3Rpb24ocSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5fZ2V0Qm91bmRzKCk7dGhpcy5fc2V0Qm91bmRzKHEpO3RoaXMuX3lCb3VuZHNNb2RlPXRoaXMuX3hCb3VuZHNNb2RlPWsuUElYRUw7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuX3NldEJvdW5kcz1mdW5jdGlvbihxKXt0aGlzLl9ib3hCb3VuZHM9e3RvcExlZnQ6e3g6TWF0aC5taW4ocS50b3BMZWZ0LngscS5ib3R0b21SaWdodC54KSx5Ok1hdGgubWluKHEudG9wTGVmdC55LHEuYm90dG9tUmlnaHQueSl9LGJvdHRvbVJpZ2h0Ont4Ok1hdGgubWF4KHEudG9wTGVmdC54LHEuYm90dG9tUmlnaHQueCkseTpNYXRoLm1heChxLnRvcExlZnQueSxxLmJvdHRvbVJpZ2h0LnkpfX19O3AucHJvdG90eXBlLl9nZXRCb3VuZHM9ZnVuY3Rpb24oKXtyZXR1cm57dG9wTGVmdDp7eDp0aGlzLl94Qm91bmRzTW9kZT09PQprLlBJWEVMP3RoaXMuX2JveEJvdW5kcy50b3BMZWZ0Lng6bnVsbD09dGhpcy5feFNjYWxlPzA6TWF0aC5taW4odGhpcy54U2NhbGUoKS5zY2FsZSh0aGlzLnhFeHRlbnQoKVswXSksdGhpcy54U2NhbGUoKS5zY2FsZSh0aGlzLnhFeHRlbnQoKVsxXSkpLHk6dGhpcy5feUJvdW5kc01vZGU9PT1rLlBJWEVMP3RoaXMuX2JveEJvdW5kcy50b3BMZWZ0Lnk6bnVsbD09dGhpcy5feVNjYWxlPzA6TWF0aC5taW4odGhpcy55U2NhbGUoKS5zY2FsZSh0aGlzLnlFeHRlbnQoKVswXSksdGhpcy55U2NhbGUoKS5zY2FsZSh0aGlzLnlFeHRlbnQoKVsxXSkpfSxib3R0b21SaWdodDp7eDp0aGlzLl94Qm91bmRzTW9kZT09PWsuUElYRUw/dGhpcy5fYm94Qm91bmRzLmJvdHRvbVJpZ2h0Lng6bnVsbD09dGhpcy5feFNjYWxlPzA6TWF0aC5tYXgodGhpcy54U2NhbGUoKS5zY2FsZSh0aGlzLnhFeHRlbnQoKVswXSksdGhpcy54U2NhbGUoKS5zY2FsZSh0aGlzLnhFeHRlbnQoKVsxXSkpLHk6dGhpcy5feUJvdW5kc01vZGU9PT0Kay5QSVhFTD90aGlzLl9ib3hCb3VuZHMuYm90dG9tUmlnaHQueTpudWxsPT10aGlzLl95U2NhbGU/MDpNYXRoLm1heCh0aGlzLnlTY2FsZSgpLnNjYWxlKHRoaXMueUV4dGVudCgpWzBdKSx0aGlzLnlTY2FsZSgpLnNjYWxlKHRoaXMueUV4dGVudCgpWzFdKSl9fX07cC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtuLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO2lmKHRoaXMuX2JveFZpc2libGUpe3ZhciBxPXRoaXMuYm91bmRzKCkscj1xLnRvcExlZnQueSx0PXEuYm90dG9tUmlnaHQueSx2PXEudG9wTGVmdC54O3E9cS5ib3R0b21SaWdodC54O2lmKCEobC5NYXRoLmlzVmFsaWROdW1iZXIocikmJmwuTWF0aC5pc1ZhbGlkTnVtYmVyKHQpJiZsLk1hdGguaXNWYWxpZE51bWJlcih2KSYmbC5NYXRoLmlzVmFsaWROdW1iZXIocSkpKXRocm93IEVycm9yKCJib3VuZHMgaGF2ZSBub3QgYmVlbiBwcm9wZXJseSBzZXQiKTt0aGlzLl9ib3hBcmVhLmF0dHJzKHt4OnYsCnk6cix3aWR0aDpxLXYsaGVpZ2h0OnQtcn0pO3RoaXMuY29udGVudCgpLm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLl9ib3gubm9kZSgpKX1lbHNlIHRoaXMuX2JveC5yZW1vdmUoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuYm94VmlzaWJsZT1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl9ib3hWaXNpYmxlO3RoaXMuX2JveFZpc2libGU9cTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuITB9O3AucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuITB9O3AucHJvdG90eXBlLnhTY2FsZT1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl94U2NhbGU7bnVsbCE9dGhpcy5feFNjYWxlJiZ0aGlzLl94U2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTt0aGlzLl94U2NhbGU9cTt0aGlzLl94Qm91bmRzTW9kZT1rLlZBTFVFO3RoaXMuX3hTY2FsZS5vblVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayk7CnRoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnlTY2FsZT1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl95U2NhbGU7bnVsbCE9dGhpcy5feVNjYWxlJiZ0aGlzLl95U2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTt0aGlzLl95U2NhbGU9cTt0aGlzLl95Qm91bmRzTW9kZT1rLlZBTFVFO3RoaXMuX3lTY2FsZS5vblVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUueEV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRYRXh0ZW50KCl9O3AucHJvdG90eXBlLl9nZXRYRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3hCb3VuZHNNb2RlPT09ay5WQUxVRT90aGlzLl94RXh0ZW50Om51bGw9PXRoaXMuX3hTY2FsZT9bdm9pZCAwLHZvaWQgMF06W3RoaXMuX3hTY2FsZS5pbnZlcnQodGhpcy5fYm94Qm91bmRzLnRvcExlZnQueCksCnRoaXMuX3hTY2FsZS5pbnZlcnQodGhpcy5fYm94Qm91bmRzLmJvdHRvbVJpZ2h0LngpXX07cC5wcm90b3R5cGUuX3NldFhFeHRlbnQ9ZnVuY3Rpb24ocSl7dGhpcy5feEV4dGVudD1xfTtwLnByb3RvdHlwZS55RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFlFeHRlbnQoKX07cC5wcm90b3R5cGUuX2dldFlFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feUJvdW5kc01vZGU9PT1rLlZBTFVFP3RoaXMuX3lFeHRlbnQ6bnVsbD09dGhpcy5feVNjYWxlP1t2b2lkIDAsdm9pZCAwXTpbdGhpcy5feVNjYWxlLmludmVydCh0aGlzLl9ib3hCb3VuZHMudG9wTGVmdC55KSx0aGlzLl95U2NhbGUuaW52ZXJ0KHRoaXMuX2JveEJvdW5kcy5ib3R0b21SaWdodC55KV19O3AucHJvdG90eXBlLl9zZXRZRXh0ZW50PWZ1bmN0aW9uKHEpe3RoaXMuX3lFeHRlbnQ9cX07cC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe24ucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTtudWxsIT0KdGhpcy5feFNjYWxlJiZ0aGlzLnhTY2FsZSgpLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayk7bnVsbCE9dGhpcy5feVNjYWxlJiZ0aGlzLnlTY2FsZSgpLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayl9O3JldHVybiBwfShjLkNvbXBvbmVudCk7ZC5TZWxlY3Rpb25Cb3hMYXllcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwsayl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIHAgaW4gaylrLmhhc093blByb3BlcnR5KHApJiYobFtwXT1rW3BdKTtsLnByb3RvdHlwZT1udWxsPT09az9PYmplY3QuY3JlYXRlKGspOihuLnByb3RvdHlwZT1rLnByb3RvdHlwZSxuZXcgbil9O2M9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gaygpe3JldHVybiBsLmNhbGwodGhpcywicGF0aCIsImFyYyBmaWxsIil8fHRoaXN9ZyhrLGwpO2sucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPQpmdW5jdGlvbihuKXtuLnN0eWxlKCJzdHJva2UiLCJub25lIil9O3JldHVybiBrfShmKDkpLlNWR0RyYXdlcik7ZC5BcmNTVkdEcmF3ZXI9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLGspe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBwIGluIGspay5oYXNPd25Qcm9wZXJ0eShwKSYmKGxbcF09a1twXSk7bC5wcm90b3R5cGU9bnVsbD09PWs/T2JqZWN0LmNyZWF0ZShrKToobi5wcm90b3R5cGU9ay5wcm90b3R5cGUsbmV3IG4pfTtjPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIGsoKXtyZXR1cm4gbC5jYWxsKHRoaXMsInBhdGgiLCJhcmMgb3V0bGluZSIpfHx0aGlzfWcoayxsKTtrLnByb3RvdHlwZS5fYXBwbHlEZWZhdWx0QXR0cmlidXRlcz1mdW5jdGlvbihuKXtuLnN0eWxlKCJmaWxsIiwibm9uZSIpfTtyZXR1cm4ga30oZig5KS5TVkdEcmF3ZXIpO2QuQXJjT3V0bGluZVNWR0RyYXdlcj1jfSxmdW5jdGlvbihjLApkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHApe2Z1bmN0aW9uIHEoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciByIGluIHApcC5oYXNPd25Qcm9wZXJ0eShyKSYmKG5bcl09cFtyXSk7bi5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToocS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IHEpfSxsPWYoMTgpO2M9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcCgpe3JldHVybiBuLmNhbGwodGhpcywicGF0aCIsImFyZWEiKXx8dGhpc31nKHAsbik7cC5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24ocSl7cS5zdHlsZSgic3Ryb2tlIiwibm9uZSIpfTtwLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIG4ucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXguY2FsbCh0aGlzLDApfTtyZXR1cm4gcH0oZig5KS5TVkdEcmF3ZXIpO2QuQXJlYVNWR0RyYXdlcj0KYzt2YXIgaz1bImZpbGwiLCJvcGFjaXR5IiwiZmlsbC1vcGFjaXR5Il07ZC5tYWtlQXJlYUNhbnZhc0RyYXdTdGVwPWZ1bmN0aW9uKG4pe3JldHVybiBmdW5jdGlvbihwLHEscil7cj1sLnJlc29sdmVBdHRyaWJ1dGVzKHIsayxxWzBdLDApO2wucmVuZGVyQXJlYShwLG4oKSxxWzBdLHIpfX19LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxrKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgcCBpbiBrKWsuaGFzT3duUHJvcGVydHkocCkmJihsW3BdPWtbcF0pO2wucHJvdG90eXBlPW51bGw9PT1rP09iamVjdC5jcmVhdGUoayk6KG4ucHJvdG90eXBlPWsucHJvdG90eXBlLG5ldyBuKX07Yz1mdW5jdGlvbihsKXtmdW5jdGlvbiBrKCl7cmV0dXJuIGwuY2FsbCh0aGlzLCJsaW5lIiwiIil8fHRoaXN9ZyhrLGwpO3JldHVybiBrfShmKDkpLlNWR0RyYXdlcik7ZC5TZWdtZW50U1ZHRHJhd2VyPWN9LGZ1bmN0aW9uKGMsCmQsZil7ZnVuY3Rpb24gZyhxLHIsdCx2LHkpe3JldHVybiAwPD10K3kmJnQteTw9cSYmMDw9dit5JiZ2LXk8PXJ9ZnVuY3Rpb24gbChxLHIsdCl7aWYobnVsbD09cSlyZXR1cm4hMTtmb3IodmFyIHY9MDt2PHQubGVuZ3RoO3YrKyl7dmFyIHk9dFt2XTtpZihxW3ldIT1yW3ldKXJldHVybiExfXJldHVybiEwfXZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihxLHIpe2Z1bmN0aW9uIHQoKXt0aGlzLmNvbnN0cnVjdG9yPXF9Zm9yKHZhciB2IGluIHIpci5oYXNPd25Qcm9wZXJ0eSh2KSYmKHFbdl09clt2XSk7cS5wcm90b3R5cGU9bnVsbD09PXI/T2JqZWN0LmNyZWF0ZShyKToodC5wcm90b3R5cGU9ci5wcm90b3R5cGUsbmV3IHQpfSxuPWYoODYpLHA9ZigxOCk7Yz1mdW5jdGlvbihxKXtmdW5jdGlvbiByKCl7cmV0dXJuIHEuY2FsbCh0aGlzLCJwYXRoIiwic3ltYm9sIil8fHRoaXN9ayhyLHEpO3JldHVybiByfShmKDkpLlNWR0RyYXdlcik7ZC5TeW1ib2xTVkdEcmF3ZXI9CmM7ZC5tYWtlU3ltYm9sQ2FudmFzRHJhd1N0ZXA9ZnVuY3Rpb24ocSxyLHQpe3ZhciB2PXRoaXM7cmV0dXJuIGZ1bmN0aW9uKHkseix4KXt2YXIgQz15LmNhbnZhcyxGPUMuY2xpZW50V2lkdGg7Qz1DLmNsaWVudEhlaWdodDtmb3IodmFyIEQ9bmV3IG4uQ2FudmFzQnVmZmVyKDAsMCksQj1yKCksST10KCksTz1udWxsLFA9bnVsbCxIPW51bGwsSz0wO0s8ei5sZW5ndGg7SysrKXt2YXIgTT16W0tdO2lmKG51bGwhPU0pe3ZhciBMPXAucmVzb2x2ZUF0dHJpYnV0ZXNTdWJzZXRXaXRoU3R5bGVzKHgsWyJ4IiwieSJdLE0sSyksUj1JKE0sSyxxKTtpZihnKEYsQyxMLngsTC55LFIpKXt2YXIgVT1sKE8sTCxwLkNvbnRleHRTdHlsZUF0dHJzKTtNPUIoTSxLLHYuX2RhdGFzZXQpO1UmJkg9PVImJlA9PU18fChPPXAuZ2V0U3Ryb2tlV2lkdGgoTCksTz1SK08rMSwoTz5ELnNjcmVlbldpZHRofHxPPkQuc2NyZWVuSGVpZ2h0KSYmRC5yZXNpemUoTyxPLCEwKSxELmNsZWFyKCksTz1ELmN0eCxPLmJlZ2luUGF0aCgpLApNKFIpLmNvbnRleHQoTykobnVsbCksTy5jbG9zZVBhdGgoKSxwLnJlbmRlclBhdGhXaXRoU3R5bGUoTyxMKSxQPU0sSD1SLE89TCk7RC5ibGl0Q2VudGVyKHksTC54LEwueSl9fX19fX0sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcoRCl7cmV0dXJuIEQgaW5zdGFuY2VvZiB6P0Q6RCBpbnN0YW5jZW9mIERhdGU/bihELnZhbHVlT2YoKSk6RCBpbnN0YW5jZW9mIHkuU2NhbGU/bChEKTpEIGluc3RhbmNlb2Ygdi5EYXRhc2V0P2soRCk6dChEKT9xKEQpOkFycmF5LmlzQXJyYXkoRCk/cChEKTpuKEQpfWZ1bmN0aW9uIGwoRCl7RD17ZG9tYWluOkQuZG9tYWluKCkscmFuZ2U6RC5yYW5nZSgpLHVwZGF0ZUlkOkQudXBkYXRlSWQoKSxyZWY6bihEKX07cmV0dXJuIHEoRCl9ZnVuY3Rpb24gayhEKXtEPXtyZWY6bihEKSx1cGRhdGVJZDpELnVwZGF0ZUlkKCl9O3JldHVybiBxKEQpfWZ1bmN0aW9uIG4oRCl7cmV0dXJuIG5ldyBDKEQpfWZ1bmN0aW9uIHAoRCl7cmV0dXJuIG5ldyB4KEQubWFwKGZ1bmN0aW9uKEIpe3JldHVybiBnKEIpfSkpfQpmdW5jdGlvbiBxKEQpe3ZhciBCPXt9LEk7Zm9yKEkgaW4gRClELmhhc093blByb3BlcnR5KEkpJiYoQltJXT1nKERbSV0pKTtyZXR1cm4gbmV3IEYoQil9dmFyIHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKEQsQil7ZnVuY3Rpb24gSSgpe3RoaXMuY29uc3RydWN0b3I9RH1mb3IodmFyIE8gaW4gQilCLmhhc093blByb3BlcnR5KE8pJiYoRFtPXT1CW09dKTtELnByb3RvdHlwZT1udWxsPT09Qj9PYmplY3QuY3JlYXRlKEIpOihJLnByb3RvdHlwZT1CLnByb3RvdHlwZSxuZXcgSSl9LHQ9ZigxMjgpLHY9ZigzOCkseT1mKDE3KTtkLnNpZ249ZztkLnNpZ25TY2FsZT1sO2Quc2lnbkRhdGFzZXQ9aztkLnNpZ25SZWY9bjtkLnNpZ25BcnJheT1wO2Quc2lnbk9iaj1xO3ZhciB6PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gRCgpe31ELnByb3RvdHlwZS5pc0RpZmZlcmVudD1mdW5jdGlvbihCKXtyZXR1cm4gQiBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/dGhpcy5pc1NpZ25hdHVyZURpZmZlcmVudChCKToKITB9O3JldHVybiBEfSgpO2QuU2lnbmF0dXJlPXo7dmFyIHg9ZnVuY3Rpb24oRCl7ZnVuY3Rpb24gQihJKXt2YXIgTz1ELmNhbGwodGhpcyl8fHRoaXM7Ty5hcnJheT1JO3JldHVybiBPfXIoQixEKTtCLnByb3RvdHlwZS5pc1NpZ25hdHVyZURpZmZlcmVudD1mdW5jdGlvbihJKXtpZihJLmFycmF5Lmxlbmd0aCE9PXRoaXMuYXJyYXkubGVuZ3RoKXJldHVybiEwO2Zvcih2YXIgTz0wO088dGhpcy5hcnJheS5sZW5ndGg7TysrKWlmKHRoaXMuYXJyYXlbT10uaXNEaWZmZXJlbnQoSS5hcnJheVtPXSkpcmV0dXJuITA7cmV0dXJuITF9O3JldHVybiBCfSh6KTtkLkFycmF5U2lnbmF0dXJlPXg7dmFyIEM9ZnVuY3Rpb24oRCl7ZnVuY3Rpb24gQihJKXt2YXIgTz1ELmNhbGwodGhpcyl8fHRoaXM7Ty5yZWY9STtyZXR1cm4gT31yKEIsRCk7Qi5wcm90b3R5cGUuaXNTaWduYXR1cmVEaWZmZXJlbnQ9ZnVuY3Rpb24oSSl7cmV0dXJuIHRoaXMucmVmIT09SS5yZWZ9O3JldHVybiBCfSh6KTtkLlJlZmVyZW5jZVNpZ25hdHVyZT0KQzt2YXIgRj1mdW5jdGlvbihEKXtmdW5jdGlvbiBCKEkpe3ZhciBPPUQuY2FsbCh0aGlzKXx8dGhpcztPLm9iaj1JO3JldHVybiBPfXIoQixEKTtCLnByb3RvdHlwZS5pc1NpZ25hdHVyZURpZmZlcmVudD1mdW5jdGlvbihJKXt2YXIgTz1PYmplY3Qua2V5cyh0aGlzLm9iaiksUD1PYmplY3Qua2V5cyhJLm9iaik7aWYoTy5sZW5ndGghPT1QLmxlbmd0aClyZXR1cm4hMDtmb3IoUD0wO1A8Ty5sZW5ndGg7UCsrKXt2YXIgSD1PW1BdO2lmKCFJLm9iai5oYXNPd25Qcm9wZXJ0eShIKXx8dGhpcy5vYmpbSF0uaXNEaWZmZXJlbnQoSS5vYmpbSF0pKXJldHVybiEwfXJldHVybiExfTtyZXR1cm4gQn0oeik7ZC5PYmplY3RTaWduYXR1cmU9Rn0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih6LHgpe2Z1bmN0aW9uIEMoKXt0aGlzLmNvbnN0cnVjdG9yPXp9Zm9yKHZhciBGIGluIHgpeC5oYXNPd25Qcm9wZXJ0eShGKSYmKHpbRl09eFtGXSk7ei5wcm90b3R5cGU9Cm51bGw9PT14P09iamVjdC5jcmVhdGUoeCk6KEMucHJvdG90eXBlPXgucHJvdG90eXBlLG5ldyBDKX0sbD1mKDEpLGs9ZigzKSxuPWYoMCkscD1mKDE0KSxxPWYoNDYpLHI9Zig2KSx0PWYoMzMpLHY9ZigxOSk7Yz1mKDUzKTt2YXIgeT1mKDIpO2Y9ZnVuY3Rpb24oeil7ZnVuY3Rpb24geCgpe3ZhciBDPXouY2FsbCh0aGlzKXx8dGhpcztDLmFkZENsYXNzKCJhcmVhLXBsb3QiKTtDLnkwKDApO0MuYXR0cigiZmlsbC1vcGFjaXR5IiwuMjUpO0MuYXR0cigiZmlsbCIsKG5ldyBrLkNvbG9yKS5yYW5nZSgpWzBdKTtDLl9saW5lRHJhd2Vycz1uZXcgbi5NYXA7cmV0dXJuIEN9Zyh4LHopO3gucHJvdG90eXBlLnk9ZnVuY3Rpb24oQyxGKXtpZihudWxsPT1DKXJldHVybiB6LnByb3RvdHlwZS55LmNhbGwodGhpcyk7bnVsbD09Rj96LnByb3RvdHlwZS55LmNhbGwodGhpcyxDKTp6LnByb3RvdHlwZS55LmNhbGwodGhpcyxDLEYpO251bGwhPUYmJihDPXRoaXMueTAoKS5hY2Nlc3NvcixudWxsIT0KQyYmdGhpcy5fYmluZFByb3BlcnR5KHguX1kwX0tFWSxDLEYpLHRoaXMuX3VwZGF0ZVlTY2FsZSgpKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUueTA9ZnVuY3Rpb24oQyl7aWYobnVsbD09QylyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoeC5fWTBfS0VZKTt2YXIgRj10aGlzLnkoKTt0aGlzLl9iaW5kUHJvcGVydHkoeC5fWTBfS0VZLEMsRiYmRi5zY2FsZSk7dGhpcy5fdXBkYXRlWVNjYWxlKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe3oucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKTt0aGlzLl91cGRhdGVZU2NhbGUoKX07eC5wcm90b3R5cGUuX2FkZERhdGFzZXQ9ZnVuY3Rpb24oQyl7dmFyIEY9dGhpczt0aGlzLl9saW5lRHJhd2Vycy5zZXQoQyxuZXcgcC5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgdC5MaW5lU1ZHRHJhd2VyfSxmdW5jdGlvbihEKXtyZXR1cm4gbmV3IHAuQ2FudmFzRHJhd2VyKEQsCnQubWFrZUxpbmVDYW52YXNEcmF3U3RlcChmdW5jdGlvbigpe3ZhciBCPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRi54KCkpLEk9eS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihGLnkoKSk7cmV0dXJuIEYuX2QzTGluZUZhY3RvcnkoQyxCLEkpfSkpfSkpO3oucHJvdG90eXBlLl9hZGREYXRhc2V0LmNhbGwodGhpcyxDKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldD1mdW5jdGlvbihDKXt6LnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0LmNhbGwodGhpcyxDKTtDPXRoaXMuX2xpbmVEcmF3ZXJzLmdldChDKTsic3ZnIj09PXRoaXMucmVuZGVyZXIoKT9DLnVzZVNWRyh0aGlzLl9yZW5kZXJBcmVhKTpDLnVzZUNhbnZhcyh0aGlzLl9jYW52YXMpO3JldHVybiBDfTt4LnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzPWZ1bmN0aW9uKEMpe3oucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXMuY2FsbCh0aGlzLEMpO3RoaXMuX2xpbmVEcmF3ZXJzLmdldChDKS5yZW1vdmUoKX07CngucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oKXt2YXIgQz10aGlzLEY9dGhpcy5fZ2VuZXJhdGVMaW5lRHJhd1N0ZXBzKCksRD10aGlzLl9nZXREYXRhVG9EcmF3KCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oQil7dmFyIEk9eS5QbG90LmFwcGx5RHJhd1N0ZXBzKEYsQik7Qy5fbGluZURyYXdlcnMuZ2V0KEIpLmRyYXcoRC5nZXQoQiksSSl9KX07eC5wcm90b3R5cGUuX2dlbmVyYXRlTGluZURyYXdTdGVwcz1mdW5jdGlvbigpe3ZhciBDPVtdO2lmKHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSl7dmFyIEY9dGhpcy5fZ2VuZXJhdGVMaW5lQXR0clRvUHJvamVjdG9yKCk7Ri5kPXRoaXMuX2NvbnN0cnVjdExpbmVQcm9qZWN0b3IoeS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksdGhpcy5fZ2V0UmVzZXRZRnVuY3Rpb24oKSk7Qy5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6RixhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih2LkFuaW1hdG9yLlJFU0VUKX0pfUMucHVzaCh7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dlbmVyYXRlTGluZUF0dHJUb1Byb2plY3RvcigpLAphbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih2LkFuaW1hdG9yLk1BSU4pfSk7cmV0dXJuIEN9O3gucHJvdG90eXBlLl9nZW5lcmF0ZUxpbmVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgQz10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTtDLmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3Rvcih5LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx5LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSk7cmV0dXJuIEN9O3gucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oQyl7dmFyIEY9dGhpcztyZXR1cm4gbmV3IHIuUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHEuQXJlYVNWR0RyYXdlcn0sZnVuY3Rpb24oRCl7cmV0dXJuIG5ldyBwLkNhbnZhc0RyYXdlcihELHEubWFrZUFyZWFDYW52YXNEcmF3U3RlcChmdW5jdGlvbigpe3ZhciBCPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRi54KCkpLEk9eS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihGLnkoKSksCk89eS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihGLnkwKCkpO3JldHVybiBGLl9jcmVhdGVBcmVhR2VuZXJhdG9yKEIsSSxPLEYuX2NyZWF0ZURlZmluZWRQcm9qZWN0b3IoQixJKSxDKX0pKX0pfTt4LnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXt2YXIgQz1bXTtpZih0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCkpe3ZhciBGPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO0YuZD10aGlzLl9jb25zdHJ1Y3RBcmVhUHJvamVjdG9yKHkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHRoaXMuX2dldFJlc2V0WUZ1bmN0aW9uKCkseS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkwKCkpKTtDLnB1c2goe2F0dHJUb1Byb2plY3RvcjpGLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKHYuQW5pbWF0b3IuUkVTRVQpfSl9Qy5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3Iodi5BbmltYXRvci5NQUlOKX0pOwpyZXR1cm4gQ307eC5wcm90b3R5cGUuX3VwZGF0ZVlTY2FsZT1mdW5jdGlvbigpe3ZhciBDPXRoaXMuZ2V0RXh0ZW50c0ZvclByb3BlcnR5KCJ5MCIpO0M9bi5BcnJheS51bmlxKG4uQXJyYXkuZmxhdHRlbihDKSk7dmFyIEY9MT09PUMubGVuZ3RoP0NbMF06bnVsbDtDPShDPXRoaXMueSgpKSYmQy5zY2FsZTtudWxsIT1DJiYobnVsbCE9dGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXImJihDLnJlbW92ZVBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXIodGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXIpLHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyPW51bGwpLG51bGwhPUYmJih0aGlzLl9jb25zdGFudEJhc2VsaW5lVmFsdWVQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybltGXX0sQy5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyKSkpfTt4LnByb3RvdHlwZS5fZ2V0UmVzZXRZRnVuY3Rpb249CmZ1bmN0aW9uKCl7cmV0dXJuIHkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55MCgpKX07eC5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBDPXoucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKTtDLmQ9dGhpcy5fY29uc3RydWN0QXJlYVByb2plY3Rvcih5LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx5LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSx5LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTAoKSkpO3JldHVybiBDfTt4LnByb3RvdHlwZS5zZWxlY3Rpb25zPWZ1bmN0aW9uKEMpe3ZhciBGPXRoaXM7dm9pZCAwPT09QyYmKEM9dGhpcy5kYXRhc2V0cygpKTtpZigiY2FudmFzIj09PXRoaXMucmVuZGVyZXIoKSlyZXR1cm4gbC5zZWxlY3RBbGwoKTt2YXIgRD16LnByb3RvdHlwZS5zZWxlY3Rpb25zLmNhbGwodGhpcyxDKS5ub2RlcygpO0MubWFwKGZ1bmN0aW9uKEIpe3JldHVybiBGLl9saW5lRHJhd2Vycy5nZXQoQil9KS5maWx0ZXIoZnVuY3Rpb24oQil7cmV0dXJuIG51bGwhPQpCfSkuZm9yRWFjaChmdW5jdGlvbihCKXtyZXR1cm4gRC5wdXNoLmFwcGx5KEQsQi5nZXRWaXN1YWxQcmltaXRpdmVzKCkpfSk7cmV0dXJuIGwuc2VsZWN0QWxsKEQpfTt4LnByb3RvdHlwZS5fY29uc3RydWN0QXJlYVByb2plY3Rvcj1mdW5jdGlvbihDLEYsRCl7dmFyIEI9dGhpcyxJPXRoaXMuX2NyZWF0ZURlZmluZWRQcm9qZWN0b3IoeS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSkseS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkpO3JldHVybiBmdW5jdGlvbihPLFAsSCl7cmV0dXJuIEIuX2NyZWF0ZUFyZWFHZW5lcmF0b3IoQyxGLEQsSSxIKShPKX19O3gucHJvdG90eXBlLl9jcmVhdGVEZWZpbmVkUHJvamVjdG9yPWZ1bmN0aW9uKEMsRil7cmV0dXJuIGZ1bmN0aW9uKEQsQixJKXt2YXIgTz1DKEQsQixJKTtEPUYoRCxCLEkpO3JldHVybiBuLk1hdGguaXNWYWxpZE51bWJlcihPKSYmbi5NYXRoLmlzVmFsaWROdW1iZXIoRCl9fTt4LnByb3RvdHlwZS5fY3JlYXRlQXJlYUdlbmVyYXRvcj0KZnVuY3Rpb24oQyxGLEQsQixJKXt2YXIgTz10aGlzLl9nZXRDdXJ2ZUZhY3RvcnkoKTtyZXR1cm4gbC5hcmVhKCkueChmdW5jdGlvbihQLEgpe3JldHVybiBDKFAsSCxJKX0pLnkxKGZ1bmN0aW9uKFAsSCl7cmV0dXJuIEYoUCxILEkpfSkueTAoZnVuY3Rpb24oUCxIKXtyZXR1cm4gRChQLEgsSSl9KS5jdXJ2ZShPKS5kZWZpbmVkKGZ1bmN0aW9uKFAsSCl7cmV0dXJuIEIoUCxILEkpfSl9O3JldHVybiB4fShjLkxpbmUpO2YuX1kwX0tFWT0ieTAiO2QuQXJlYT1mfSxmdW5jdGlvbihjLGQpeyhmdW5jdGlvbihmKXtmLk1BSU49Im1haW4iO2YuUkVTRVQ9InJlc2V0In0pKGQuQW5pbWF0b3J8fChkLkFuaW1hdG9yPXt9KSl9LGZ1bmN0aW9uKGMsZCl7dmFyIGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBnKCl7dmFyIGw9dGhpczt0aGlzLnRyYW5zbGF0ZT10aGlzLnNjYWxlPTA7dGhpcy5jYWNoZWREb21haW49W251bGwsbnVsbF07dGhpcy5sYXN0U2VlbkRvbWFpbj1bbnVsbCxudWxsXTt0aGlzLnVwZGF0ZURvbWFpbj0KZnVuY3Rpb24oayl7bC5sYXN0U2VlbkRvbWFpbj1rLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCk7dmFyIG49ay5zY2FsZVRyYW5zZm9ybWF0aW9uKGwuY2FjaGVkRG9tYWluWzFdKS1rLnNjYWxlVHJhbnNmb3JtYXRpb24obC5jYWNoZWREb21haW5bMF0pLHA9ay5zY2FsZVRyYW5zZm9ybWF0aW9uKGwubGFzdFNlZW5Eb21haW5bMV0pLWsuc2NhbGVUcmFuc2Zvcm1hdGlvbihsLmxhc3RTZWVuRG9tYWluWzBdKTtsLnNjYWxlPW4vcHx8MTtsLnRyYW5zbGF0ZT1rLnNjYWxlVHJhbnNmb3JtYXRpb24obC5jYWNoZWREb21haW5bMF0pLWsuc2NhbGVUcmFuc2Zvcm1hdGlvbihsLmxhc3RTZWVuRG9tYWluWzBdKSpsLnNjYWxlfHwwfX1nLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuc2NhbGU9MTt0aGlzLnRyYW5zbGF0ZT0wO3RoaXMuY2FjaGVkRG9tYWluPXRoaXMubGFzdFNlZW5Eb21haW59O2cucHJvdG90eXBlLnNldERvbWFpbj1mdW5jdGlvbihsKXt0aGlzLmNhY2hlZERvbWFpbj0KbC5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpfTtyZXR1cm4gZ30oKTtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZyhsLGspe3ZhciBuPXRoaXM7dGhpcy5yZW5kZXJDYWxsYmFjaz1sO3RoaXMuYXBwbHlUcmFuc2Zvcm1DYWxsYmFjaz1rO3RoaXMuZG9tYWluVHJhbnNmb3JtWD1uZXcgZjt0aGlzLmRvbWFpblRyYW5zZm9ybVk9bmV3IGY7dGhpcy5yZW5kZXJEZWZlcnJlZD1mdW5jdGlvbigpe24uYXBwbHlUcmFuc2Zvcm0oKTtjbGVhclRpbWVvdXQobi50aW1lb3V0VG9rZW4pO24udGltZW91dFRva2VuPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtuLnJlbmRlckNhbGxiYWNrKCl9LGcuREVGRVJSRURfUkVOREVSSU5HX0RFTEFZKX19Zy5wcm90b3R5cGUuc2V0RG9tYWlucz1mdW5jdGlvbihsLGspe2wmJnRoaXMuZG9tYWluVHJhbnNmb3JtWC5zZXREb21haW4obCk7ayYmdGhpcy5kb21haW5UcmFuc2Zvcm1ZLnNldERvbWFpbihrKTt0aGlzLnJlbmRlckRlZmVycmVkKCl9O2cucHJvdG90eXBlLnVwZGF0ZURvbWFpbnM9CmZ1bmN0aW9uKGwsayl7bCYmdGhpcy5kb21haW5UcmFuc2Zvcm1YLnVwZGF0ZURvbWFpbihsKTtrJiZ0aGlzLmRvbWFpblRyYW5zZm9ybVkudXBkYXRlRG9tYWluKGspO3RoaXMucmVuZGVyRGVmZXJyZWQoKX07Zy5wcm90b3R5cGUucmVzZXRUcmFuc2Zvcm1zPWZ1bmN0aW9uKCl7dGhpcy5kb21haW5UcmFuc2Zvcm1YLnJlc2V0KCk7dGhpcy5kb21haW5UcmFuc2Zvcm1ZLnJlc2V0KCk7dGhpcy5hcHBseVRyYW5zZm9ybSgpfTtnLnByb3RvdHlwZS5hcHBseVRyYW5zZm9ybT1mdW5jdGlvbigpe3RoaXMuYXBwbHlUcmFuc2Zvcm1DYWxsYmFjayh0aGlzLmRvbWFpblRyYW5zZm9ybVgudHJhbnNsYXRlLHRoaXMuZG9tYWluVHJhbnNmb3JtWS50cmFuc2xhdGUsdGhpcy5kb21haW5UcmFuc2Zvcm1YLnNjYWxlLHRoaXMuZG9tYWluVHJhbnNmb3JtWS5zY2FsZSl9O3JldHVybiBnfSgpO2MuREVGRVJSRURfUkVOREVSSU5HX0RFTEFZPTIwMDtkLkRlZmVycmVkUmVuZGVyZXI9Y30sZnVuY3Rpb24oYywKZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oQyxGKXtmdW5jdGlvbiBEKCl7dGhpcy5jb25zdHJ1Y3Rvcj1DfWZvcih2YXIgQiBpbiBGKUYuaGFzT3duUHJvcGVydHkoQikmJihDW0JdPUZbQl0pO0MucHJvdG90eXBlPW51bGw9PT1GP09iamVjdC5jcmVhdGUoRik6KEQucHJvdG90eXBlPUYucHJvdG90eXBlLG5ldyBEKX0sbD1mKDEpLGs9Zig3KSxuPWYoMTQpLHA9Zig2KSxxPWYoMzMpLHI9ZigzKSx0PWYoMTEpLHY9ZigwKTtjPWYoMTApO3ZhciB5PWYoMTkpLHo9ZigyKTtmPWYoMTYpO3ZhciB4PXtsaW5lYXI6bC5jdXJ2ZUxpbmVhcixsaW5lYXJDbG9zZWQ6bC5jdXJ2ZUxpbmVhckNsb3NlZCxzdGVwOmwuY3VydmVTdGVwLHN0ZXBCZWZvcmU6bC5jdXJ2ZVN0ZXBCZWZvcmUsc3RlcEFmdGVyOmwuY3VydmVTdGVwQWZ0ZXIsYmFzaXM6bC5jdXJ2ZUJhc2lzLGJhc2lzT3BlbjpsLmN1cnZlQmFzaXNPcGVuLGJhc2lzQ2xvc2VkOmwuY3VydmVCYXNpc0Nsb3NlZCwKYnVuZGxlOmwuY3VydmVCdW5kbGUsY2FyZGluYWw6bC5jdXJ2ZUNhcmRpbmFsLGNhcmRpbmFsT3BlbjpsLmN1cnZlQ2FyZGluYWxPcGVuLGNhcmRpbmFsQ2xvc2VkOmwuY3VydmVDYXJkaW5hbENsb3NlZCxtb25vdG9uZTpsLmN1cnZlTW9ub3RvbmVYfTtkLkN1cnZlTmFtZT1jLm1ha2VFbnVtKCJsaW5lYXIgbGluZWFyQ2xvc2VkIHN0ZXAgc3RlcEJlZm9yZSBzdGVwQWZ0ZXIgYmFzaXMgYmFzaXNPcGVuIGJhc2lzQ2xvc2VkIGJ1bmRsZSBjYXJkaW5hbCBjYXJkaW5hbE9wZW4gY2FyZGluYWxDbG9zZWQgbW9ub3RvbmUiLnNwbGl0KCIgIikpO2Y9ZnVuY3Rpb24oQyl7ZnVuY3Rpb24gRigpe3ZhciBEPUMuY2FsbCh0aGlzKXx8dGhpcztELl9jdXJ2ZT0ibGluZWFyIjtELl9hdXRvcmFuZ2VTbW9vdGg9ITE7RC5fY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQ9ITA7RC5fY29sbGFwc2VEZW5zZVZlcnRpY2FsTGluZXNFbmFibGVkPSExO0QuX2Rvd25zYW1wbGluZ0VuYWJsZWQ9ITE7RC5hZGRDbGFzcygibGluZS1wbG90Iik7CnZhciBCPW5ldyBrLkVhc2luZztCLnN0ZXBEdXJhdGlvbih6LlBsb3QuX0FOSU1BVElPTl9NQVhfRFVSQVRJT04pO0IuZWFzaW5nTW9kZSgiZXhwSW5PdXQiKTtCLm1heFRvdGFsRHVyYXRpb24oei5QbG90Ll9BTklNQVRJT05fTUFYX0RVUkFUSU9OKTtELmFuaW1hdG9yKHkuQW5pbWF0b3IuTUFJTixCKTtELmF0dHIoInN0cm9rZSIsKG5ldyByLkNvbG9yKS5yYW5nZSgpWzBdKTtELmF0dHIoInN0cm9rZS13aWR0aCIsIjJweCIpO3JldHVybiBEfWcoRixDKTtGLnByb3RvdHlwZS54PWZ1bmN0aW9uKEQsQixJKXtpZihudWxsPT1EKXJldHVybiBDLnByb3RvdHlwZS54LmNhbGwodGhpcyk7Qy5wcm90b3R5cGUueC5jYWxsKHRoaXMsRCxCLEkpO3RoaXMuX3NldFNjYWxlU25hcHBpbmcoKTtyZXR1cm4gdGhpc307Ri5wcm90b3R5cGUueT1mdW5jdGlvbihELEIsSSl7aWYobnVsbD09RClyZXR1cm4gQy5wcm90b3R5cGUueS5jYWxsKHRoaXMpO0MucHJvdG90eXBlLnkuY2FsbCh0aGlzLEQsQiwKSSk7dGhpcy5fc2V0U2NhbGVTbmFwcGluZygpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIEMucHJvdG90eXBlLmF1dG9yYW5nZU1vZGUuY2FsbCh0aGlzKTtDLnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlLmNhbGwodGhpcyxEKTt0aGlzLl9zZXRTY2FsZVNuYXBwaW5nKCk7cmV0dXJuIHRoaXN9O0YucHJvdG90eXBlLmF1dG9yYW5nZVNtb290aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hdXRvcmFuZ2VTbW9vdGh9O0YucHJvdG90eXBlLl9zZXRTY2FsZVNuYXBwaW5nPWZ1bmN0aW9uKCl7IngiPT09dGhpcy5hdXRvcmFuZ2VNb2RlKCkmJnRoaXMueCgpJiZ0aGlzLngoKS5zY2FsZSYmdGhpcy54KCkuc2NhbGUgaW5zdGFuY2VvZiB0LlF1YW50aXRhdGl2ZVNjYWxlJiZ0aGlzLngoKS5zY2FsZS5zbmFwcGluZ0RvbWFpbkVuYWJsZWQoIXRoaXMuYXV0b3JhbmdlU21vb3RoKCkpOyJ5Ij09PXRoaXMuYXV0b3JhbmdlTW9kZSgpJiYKdGhpcy55KCkmJnRoaXMueSgpLnNjYWxlJiZ0aGlzLnkoKS5zY2FsZSBpbnN0YW5jZW9mIHQuUXVhbnRpdGF0aXZlU2NhbGUmJnRoaXMueSgpLnNjYWxlLnNuYXBwaW5nRG9tYWluRW5hYmxlZCghdGhpcy5hdXRvcmFuZ2VTbW9vdGgoKSl9O0YucHJvdG90eXBlLmN1cnZlPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2N1cnZlO3RoaXMuX2N1cnZlPUQ7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307Ri5wcm90b3R5cGUuZG93bnNhbXBsaW5nRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kb3duc2FtcGxpbmdFbmFibGVkfTtGLnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD1mdW5jdGlvbihEKXtpZihudWxsPT1EKXJldHVybiB0aGlzLl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZDt0aGlzLl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD1EO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0YucHJvdG90eXBlLmNvbGxhcHNlRGVuc2VMaW5lc0VuYWJsZWQ9CmZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2NvbGxhcHNlRGVuc2VWZXJ0aWNhbExpbmVzRW5hYmxlZDt0aGlzLl9jb2xsYXBzZURlbnNlVmVydGljYWxMaW5lc0VuYWJsZWQ9RDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKEQpe3ZhciBCPXRoaXM7cmV0dXJuIG5ldyBwLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBxLkxpbmVTVkdEcmF3ZXJ9LGZ1bmN0aW9uKEkpe3JldHVybiBuZXcgbi5DYW52YXNEcmF3ZXIoSSxxLm1ha2VMaW5lQ2FudmFzRHJhd1N0ZXAoZnVuY3Rpb24oKXtyZXR1cm4gQi5fZDNMaW5lRmFjdG9yeShEKX0pKX0pfTtGLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oRCl7dmFyIEI9Qy5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5LmNhbGwodGhpcyxEKTtpZighdGhpcy5fYXV0b3JhbmdlU21vb3RofHx0aGlzLmF1dG9yYW5nZU1vZGUoKSE9PQpEfHwieCIhPT10aGlzLmF1dG9yYW5nZU1vZGUoKSYmInkiIT09dGhpcy5hdXRvcmFuZ2VNb2RlKCkpcmV0dXJuIEI7RD10aGlzLl9nZXRFZGdlSW50ZXJzZWN0aW9uUG9pbnRzKCk7dmFyIEk9InkiPT09dGhpcy5hdXRvcmFuZ2VNb2RlKCk/RC5sZWZ0LmNvbmNhdChELnJpZ2h0KS5tYXAoZnVuY3Rpb24oTyl7cmV0dXJuIE8ueX0pOkQudG9wLmNvbmNhdChELmJvdHRvbSkubWFwKGZ1bmN0aW9uKE8pe3JldHVybiBPLnh9KTtyZXR1cm4gQi5tYXAoZnVuY3Rpb24oTyl7cmV0dXJuIGwuZXh0ZW50KGwubWVyZ2UoW08sSV0pKX0pfTtGLnByb3RvdHlwZS5fZ2V0RWRnZUludGVyc2VjdGlvblBvaW50cz1mdW5jdGlvbigpe3ZhciBEPXRoaXM7aWYoISh0aGlzLnkoKS5zY2FsZSBpbnN0YW5jZW9mIHQuUXVhbnRpdGF0aXZlU2NhbGUmJnRoaXMueCgpLnNjYWxlIGluc3RhbmNlb2YgdC5RdWFudGl0YXRpdmVTY2FsZSkpcmV0dXJue2xlZnQ6W10scmlnaHQ6W10sdG9wOltdLGJvdHRvbTpbXX07CnZhciBCPXRoaXMueSgpLnNjYWxlLEk9dGhpcy54KCkuc2NhbGUsTz17bGVmdDpbXSxyaWdodDpbXSx0b3A6W10sYm90dG9tOltdfSxQPUkuc2NhbGUoSS5kb21haW4oKVswXSksSD1JLnNjYWxlKEkuZG9tYWluKClbMV0pLEs9Qi5zY2FsZShCLmRvbWFpbigpWzBdKSxNPUIuc2NhbGUoQi5kb21haW4oKVsxXSk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oTCl7Zm9yKHZhciBSPUwuZGF0YSgpLFUsWSxiYSxtYSxhYSxjYSxmYSxkYT0xO2RhPFIubGVuZ3RoO2RhKyspbWE9Y2F8fEkuc2NhbGUoRC54KCkuYWNjZXNzb3IoUltkYS0xXSxkYS0xLEwpKSxhYT1mYXx8Qi5zY2FsZShELnkoKS5hY2Nlc3NvcihSW2RhLTFdLGRhLTEsTCkpLGNhPUkuc2NhbGUoRC54KCkuYWNjZXNzb3IoUltkYV0sZGEsTCkpLGZhPUIuc2NhbGUoRC55KCkuYWNjZXNzb3IoUltkYV0sZGEsTCkpLG1hPFA9PT1QPD1jYSYmKFU9UC1tYSxZPWNhLW1hLGJhPWZhLWFhLFU9VSpiYS9ZLE8ubGVmdC5wdXNoKHt4OlAsCnk6Qi5pbnZlcnQoYWErVSl9KSksbWE8SD09PUg8PWNhJiYoVT1ILW1hLFk9Y2EtbWEsYmE9ZmEtYWEsVT1VKmJhL1ksTy5yaWdodC5wdXNoKHt4OkgseTpCLmludmVydChhYStVKX0pKSxhYTxNPT09TTw9ZmEmJihZPWNhLW1hLFU9TS1hYSxiYT1mYS1hYSxVPVUqWS9iYSxPLnRvcC5wdXNoKHt4OkkuaW52ZXJ0KG1hK1UpLHk6TX0pKSxhYTxLPT09Szw9ZmEmJihZPWNhLW1hLFU9Sy1hYSxiYT1mYS1hYSxVPVUqWS9iYSxPLmJvdHRvbS5wdXNoKHt4OkkuaW52ZXJ0KG1hK1UpLHk6S30pKX0pO3JldHVybiBPfTtGLnByb3RvdHlwZS5fZ2V0UmVzZXRZRnVuY3Rpb249ZnVuY3Rpb24oKXt2YXIgRD10aGlzLnkoKS5zY2FsZS5kb21haW4oKSxCPU1hdGgubWF4KERbMF0sRFsxXSk7RD1NYXRoLm1pbihEWzBdLERbMV0pO0I9MD5CJiZCfHwwPEQmJkR8fDA7dmFyIEk9dGhpcy55KCkuc2NhbGUuc2NhbGUoQik7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEl9fTtGLnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9CmZ1bmN0aW9uKCl7dmFyIEQ9W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgQj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTtCLmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3Rvcih6LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx0aGlzLl9nZXRSZXNldFlGdW5jdGlvbigpKTtELnB1c2goe2F0dHJUb1Byb2plY3RvcjpCLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKHkuQW5pbWF0b3IuUkVTRVQpfSl9RC5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoeS5BbmltYXRvci5NQUlOKX0pO3JldHVybiBEfTtGLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgRD1DLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IuY2FsbCh0aGlzKTtPYmplY3Qua2V5cyhEKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe2lmKCJkIiE9PQpCKXt2YXIgST1EW0JdO0RbQl09ZnVuY3Rpb24oTyxQLEgpe3JldHVybiAwPE8ubGVuZ3RoP0koT1swXSxQLEgpOm51bGx9fX0pO3JldHVybiBEfTtGLnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEQpe0Q9dGhpcy5lbnRpdHlOZWFyZXN0QnlYVGhlblkoRCk7cmV0dXJuIG51bGwhPUQ/W0RdOltdfTtGLnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0QnlYVGhlblk9ZnVuY3Rpb24oRCl7dmFyIEI9SW5maW5pdHksST1JbmZpbml0eSxPLFA9dGhpcy5ib3VuZHMoKTt0aGlzLmVudGl0aWVzKCkuZm9yRWFjaChmdW5jdGlvbihIKXtpZih2Lk1hdGgud2l0aGluKEgucG9zaXRpb24sUCkpe3ZhciBLPU1hdGguYWJzKEQueC1ILnBvc2l0aW9uLngpLE09TWF0aC5hYnMoRC55LUgucG9zaXRpb24ueSk7aWYoSzxCfHxLPT09QiYmTTxJKU89SCxCPUssST1NfX0pO3JldHVybiBPfTtGLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIEQ9Qy5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpOwpELmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3Rvcih6LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx6LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSk7cmV0dXJuIER9O0YucHJvdG90eXBlLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yPWZ1bmN0aW9uKEQsQil7dmFyIEk9dGhpcztyZXR1cm4gZnVuY3Rpb24oTyxQLEgpe3JldHVybiBJLl9kM0xpbmVGYWN0b3J5KEgsRCxCKShPKX19O0YucHJvdG90eXBlLl9kM0xpbmVGYWN0b3J5PWZ1bmN0aW9uKEQsQixJKXtmdW5jdGlvbiBPKFAsSCxLKXt2YXIgTT1CKFAsSCxLKTtQPUkoUCxILEspO3JldHVybiB2Lk1hdGguaXNWYWxpZE51bWJlcihNKSYmdi5NYXRoLmlzVmFsaWROdW1iZXIoUCl9dm9pZCAwPT09QiYmKEI9ei5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSkpO3ZvaWQgMD09PUkmJihJPXouUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpKTtyZXR1cm4gbC5saW5lKCkueChmdW5jdGlvbihQLEgpe3JldHVybiBCKFAsCkgsRCl9KS55KGZ1bmN0aW9uKFAsSCl7cmV0dXJuIEkoUCxILEQpfSkuY3VydmUodGhpcy5fZ2V0Q3VydmVGYWN0b3J5KCkpLmRlZmluZWQoZnVuY3Rpb24oUCxIKXtyZXR1cm4gTyhQLEgsRCl9KX07Ri5wcm90b3R5cGUuX2dldEN1cnZlRmFjdG9yeT1mdW5jdGlvbigpe3ZhciBEPXRoaXMuY3VydmUoKTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBEPyhEPXhbRF0sbnVsbD09RD94LmxpbmVhcjpEKTpEfTtGLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBEPXRoaXMsQj1uZXcgdi5NYXA7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oSSl7dmFyIE89SS5kYXRhKCk7aWYoRC5fY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWR8fEQuX2Rvd25zYW1wbGluZ0VuYWJsZWQpe3ZhciBQPU8ubWFwKGZ1bmN0aW9uKEgsSyl7cmV0dXJuIEt9KTtELl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZCYmKFA9RC5fZmlsdGVyQ3JvcHBlZFJlbmRlcmluZyhJLFApKTtELl9kb3duc2FtcGxpbmdFbmFibGVkJiYKKFA9RC5fZmlsdGVyRG93bnNhbXBsaW5nKEksUCkpO0QuX2NvbGxhcHNlRGVuc2VWZXJ0aWNhbExpbmVzRW5hYmxlZCYmKFA9RC5fZmlsdGVyRGVuc2VMaW5lcyhJLFApKTtCLnNldChJLFtQLm1hcChmdW5jdGlvbihIKXtyZXR1cm4gT1tIXX0pXSl9ZWxzZSBCLnNldChJLFtPXSl9KTtyZXR1cm4gQn07Ri5wcm90b3R5cGUuX2ZpbHRlckNyb3BwZWRSZW5kZXJpbmc9ZnVuY3Rpb24oRCxCKXtmdW5jdGlvbiBJKGJhLG1hKXtyZXR1cm4gdi5NYXRoLmluUmFuZ2UoYmEsMCxPLndpZHRoKCkpJiZ2Lk1hdGguaW5SYW5nZShtYSwwLE8uaGVpZ2h0KCkpfWZvcih2YXIgTz10aGlzLFA9ei5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksSD16LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSxLPUQuZGF0YSgpLE09W10sTD0wO0w8Qi5sZW5ndGg7TCsrKXt2YXIgUj1QKEtbQltMXV0sQltMXSxEKSxVPUgoS1tCW0xdXSxCW0xdLEQpO1I9SShSLFUpO2lmKCFSJiZudWxsIT1CW0wtCjFdJiZudWxsIT1LW0JbTC0xXV0pe1U9UChLW0JbTC0xXV0sQltMLTFdLEQpO3ZhciBZPUgoS1tCW0wtMV1dLEJbTC0xXSxEKTtSPVJ8fEkoVSxZKX1SfHxudWxsPT1CW0wrMV18fG51bGw9PUtbQltMKzFdXXx8KFU9UChLW0JbTCsxXV0sQltMKzFdLEQpLFk9SChLW0JbTCsxXV0sQltMKzFdLEQpLFI9Unx8SShVLFkpKTtSJiZNLnB1c2goQltMXSl9cmV0dXJuIE19O0YucHJvdG90eXBlLl9maWx0ZXJEb3duc2FtcGxpbmc9ZnVuY3Rpb24oRCxCKXtmdW5jdGlvbiBJKGZhLGRhKXt2YXIgbGE9UChPW0JbZmFdXSxCW2ZhXSxEKSxaPUgoT1tCW2ZhXV0sQltmYV0sRCksRmE9UChPW0JbZmErMV1dLEJbZmErMV0sRCk7ZmE9SChPW0JbZmErMV1dLEJbZmErMV0sRCk7cmV0dXJuIEluZmluaXR5PT09ZGE/TWF0aC5mbG9vcihsYSk9PT1NYXRoLmZsb29yKEZhKTpNYXRoLmZsb29yKGZhKT09PU1hdGguZmxvb3IoWisoRmEtbGEpKmRhKX1pZigwPT09Qi5sZW5ndGgpcmV0dXJuW107Zm9yKHZhciBPPQpELmRhdGEoKSxQPXouUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLEg9ei5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSksSz1bQlswXV0sTT0wO008Qi5sZW5ndGgtMTspe3ZhciBMPUJbTV0sUj1QKE9bQltNXV0sQltNXSxEKSxVPUgoT1tCW01dXSxCW01dLEQpLFk9UChPW0JbTSsxXV0sQltNKzFdLEQpLGJhPUgoT1tCW00rMV1dLEJbTSsxXSxEKTtiYT1NYXRoLmZsb29yKFIpPT09TWF0aC5mbG9vcihZKT9JbmZpbml0eTooYmEtVSkvKFktUik7WT1CW01dO1U9SW5maW5pdHk9PT1iYT9VOlI7Uj1ZO2Zvcih2YXIgbWE9VSxhYT0hMDtNPEIubGVuZ3RoLTEmJihhYXx8SShNLGJhKSk7KXtNKys7YWE9ITE7dmFyIGNhPUluZmluaXR5PT09YmE/SChPW0JbTV1dLEJbTV0sRCk6UChPW0JbTV1dLEJbTV0sRCk7Y2E+bWEmJihtYT1jYSxSPUJbTV0pO2NhPFUmJihVPWNhLFk9QltNXSl9YmE9QltNXTtZIT09TCYmSy5wdXNoKFkpO1IhPT1ZJiZSIT09TCYmSy5wdXNoKFIpO2JhIT09CkwmJmJhIT09WSYmYmEhPT1SJiZLLnB1c2goYmEpfXJldHVybiBLfTtGLnByb3RvdHlwZS5fZmlsdGVyRGVuc2VMaW5lcz1mdW5jdGlvbihELEIpe2lmKDA9PT1CLmxlbmd0aClyZXR1cm5bXTt2YXIgST1ELmRhdGEoKSxPPXouUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLFA9ei5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7cmV0dXJuIHRoaXMuX2J1Y2tldEJ5WChELEIsZnVuY3Rpb24oSCl7cmV0dXJuIE8oSVtIXSxILEQpfSxmdW5jdGlvbihIKXtyZXR1cm4gUChJW0hdLEgsRCl9KX07Ri5wcm90b3R5cGUuX2J1Y2tldEJ5WD1mdW5jdGlvbihELEIsSSxPKXt2YXIgUD1bXTtEPUQuZGF0YSgpO2Zvcih2YXIgSD1udWxsLEs9MDtLPD1CLmxlbmd0aDsrK0spe3ZhciBNPUJbS107aWYobnVsbCE9RFtNXSl7dmFyIEw9TWF0aC5mbG9vcihJKE0pKSxSPU8oTSk7bnVsbD09SD9IPW5ldyB2LkJ1Y2tldChNLEwsUik6SC5pc0luQnVja2V0KEwpP0guYWRkVG9CdWNrZXQoUiwKTSk6KFAucHVzaC5hcHBseShQLEguZ2V0VW5pcXVlSW5kaWNlcygpKSxIPW5ldyB2LkJ1Y2tldChNLEwsUikpfX1udWxsIT1IJiZQLnB1c2guYXBwbHkoUCxILmdldFVuaXF1ZUluZGljZXMoKSk7cmV0dXJuIFB9O3JldHVybiBGfShmLlhZUGxvdCk7ZC5MaW5lPWZ9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocSxyKXtmdW5jdGlvbiB0KCl7dGhpcy5jb25zdHJ1Y3Rvcj1xfWZvcih2YXIgdiBpbiByKXIuaGFzT3duUHJvcGVydHkodikmJihxW3ZdPXJbdl0pO3EucHJvdG90eXBlPW51bGw9PT1yP09iamVjdC5jcmVhdGUocik6KHQucHJvdG90eXBlPXIucHJvdG90eXBlLG5ldyB0KX0sbD1mKDEpLGs9ZigyNiksbj1mKDApLHA9WzAsMV07Yz1mdW5jdGlvbihxKXtmdW5jdGlvbiByKCl7dmFyIHQ9cS5jYWxsKHRoaXMpfHx0aGlzO3QuX3JhbmdlPVswLDFdO3QuX2QzU2NhbGU9bC5zY2FsZUJhbmQoKTt0Ll9kM1NjYWxlLnJhbmdlKHApOwp0Ll9kM1RyYW5zZm9ybWF0aW9uU2NhbGU9bC5zY2FsZUxpbmVhcigpO3QuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4ocCk7dC5faW5uZXJQYWRkaW5nPXIuX2NvbnZlcnRUb1Bsb3R0YWJsZUlubmVyUGFkZGluZygpO3QuX291dGVyUGFkZGluZz1yLl9jb252ZXJ0VG9QbG90dGFibGVPdXRlclBhZGRpbmcoKTtyZXR1cm4gdH1nKHIscSk7ci5wcm90b3R5cGUuY2xvbmVXaXRob3V0UHJvdmlkZXJzPWZ1bmN0aW9uKCl7dmFyIHQ9KG5ldyByKS5kb21haW4odGhpcy5kb21haW4oKSkucmFuZ2UodGhpcy5yYW5nZSgpKS5pbm5lclBhZGRpbmcodGhpcy5pbm5lclBhZGRpbmcoKSkub3V0ZXJQYWRkaW5nKHRoaXMub3V0ZXJQYWRkaW5nKCkpO3QuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4odGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbigpKTtyZXR1cm4gdH07ci5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIG4uQXJyYXkudW5pcSh0KX07CnIucHJvdG90eXBlLl9nZXRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbi5BcnJheS51bmlxKHRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKCkpfTtyLnByb3RvdHlwZS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIHEucHJvdG90eXBlLmRvbWFpbi5jYWxsKHRoaXMsdCl9O3IucHJvdG90eXBlLmludmVydFJhbmdlPWZ1bmN0aW9uKCl7dmFyIHQsdj10aGlzO3ZvaWQgMD09PXQmJih0PXRoaXMucmFuZ2UoKSk7dmFyIHk9dGhpcy5fZDNTY2FsZS5iYW5kd2lkdGgoKSx6PXRoaXMuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbih0WzBdKSx4PXRoaXMuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbih0WzFdKTt0PXRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dmFyIEM9dC5tYXAoZnVuY3Rpb24oRil7cmV0dXJuIHYuX2QzU2NhbGUoRikreS8yfSk7ej1sLmJpc2VjdChDLHopO3g9bC5iaXNlY3QoQyx4KTtyZXR1cm4gdC5zbGljZSh6LHgpfTtyLnByb3RvdHlwZS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gcS5wcm90b3R5cGUucmFuZ2UuY2FsbCh0aGlzLAp0KX07ci5fY29udmVydFRvUGxvdHRhYmxlSW5uZXJQYWRkaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIDEvLjctMX07ci5fY29udmVydFRvUGxvdHRhYmxlT3V0ZXJQYWRkaW5nPWZ1bmN0aW9uKCl7cmV0dXJuLjUvLjd9O3IucHJvdG90eXBlLl9zZXRCYW5kcz1mdW5jdGlvbigpe3ZhciB0PTEtMS8oMSt0aGlzLmlubmVyUGFkZGluZygpKSx2PXRoaXMub3V0ZXJQYWRkaW5nKCkvKDErdGhpcy5pbm5lclBhZGRpbmcoKSk7dGhpcy5fZDNTY2FsZS5wYWRkaW5nSW5uZXIodCk7dGhpcy5fZDNTY2FsZS5wYWRkaW5nT3V0ZXIodil9O3IucHJvdG90eXBlLnJhbmdlQmFuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXNjYWxlQmFuZCh0aGlzLl9kM1NjYWxlLmJhbmR3aWR0aCgpKX07ci5wcm90b3R5cGUuc3RlcFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc2NhbGVCYW5kKHRoaXMuX2QzU2NhbGUuYmFuZHdpZHRoKCkqKDErdGhpcy5pbm5lclBhZGRpbmcoKSkpfTtyLnByb3RvdHlwZS50aWNrcz0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21haW4oKX07ci5wcm90b3R5cGUuaW5uZXJQYWRkaW5nPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX2lubmVyUGFkZGluZzt0aGlzLl9pbm5lclBhZGRpbmc9dDt0aGlzLnJhbmdlKHRoaXMucmFuZ2UoKSk7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUub3V0ZXJQYWRkaW5nPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX291dGVyUGFkZGluZzt0aGlzLl9vdXRlclBhZGRpbmc9dDt0aGlzLnJhbmdlKHRoaXMucmFuZ2UoKSk7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCl7dD10aGlzLl9kM1NjYWxlKHQpK3RoaXMuX2QzU2NhbGUuYmFuZHdpZHRoKCkvMjtyZXR1cm4gdGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlKHQpfTtyLnByb3RvdHlwZS56b29tPWZ1bmN0aW9uKHQsdil7dmFyIHk9dGhpczsKdGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUucmFuZ2UoKS5tYXAoZnVuY3Rpb24oeil7cmV0dXJuIHkuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5pbnZlcnQoay56b29tT3V0KHosdCx2KSl9KSk7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKX07ci5wcm90b3R5cGUucGFuPWZ1bmN0aW9uKHQpe3ZhciB2PXRoaXM7dGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUucmFuZ2UoKS5tYXAoZnVuY3Rpb24oeSl7cmV0dXJuIHYuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5pbnZlcnQoeSt0KX0pKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfTtyLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUodCl9O3IucHJvdG90eXBlLmludmVydGVkVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5pbnZlcnQodCl9OwpyLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD1mdW5jdGlvbigpe3JldHVybiBwfTtyLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKCl9O3IucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKHQpe3RoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4odCk7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKX07ci5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX07ci5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzU2NhbGUuZG9tYWluKHQpO3RoaXMuX3NldEJhbmRzKCk7cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYW5nZX07CnIucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbih0KXt0aGlzLl9yYW5nZT10O3RoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5yYW5nZSh0KTt0aGlzLl9zZXRCYW5kcygpfTtyLnByb3RvdHlwZS5fcmVzY2FsZUJhbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZSh0KS10aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUoMCkpfTtyZXR1cm4gcn0oZigxNykuU2NhbGUpO2QuQ2F0ZWdvcnk9Y30sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcoeCl7dHJ5e3ZhciBDPXgubm9kZSgpLmdldEJCb3goKX1jYXRjaChGKXtDPXt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjB9fXJldHVybiBDfWZ1bmN0aW9uIGwoeCl7aWYoIm51bWJlciI9PT10eXBlb2YgeClyZXR1cm57bWluOngsbWF4Onh9O2lmKHggaW5zdGFuY2VvZiBPYmplY3QmJiJtaW4iaW4geCYmIm1heCJpbiB4KXJldHVybiB4O3Rocm93IEVycm9yKCJpbnB1dCAnIit4KyInIGNhbid0IGJlIHBhcnNlZCBhcyBhbiBSYW5nZSIpOwp9ZnVuY3Rpb24gayh4LEMpe3g9eC5nZXRQcm9wZXJ0eVZhbHVlKEMpO3JldHVybiBwYXJzZUZsb2F0KHgpfHwwfWZ1bmN0aW9uIG4oeCl7aWYobnVsbD09eHx8Im5vbmUiPT09eClyZXR1cm4gbnVsbDt4PXgubWF0Y2goeSk7aWYobnVsbD09eHx8Mj54Lmxlbmd0aClyZXR1cm4gbnVsbDt4PXhbMV0uc3BsaXQoeikubWFwKGZ1bmN0aW9uKEMpe3JldHVybiBwYXJzZUZsb2F0KEMpfSk7cmV0dXJuIDYhPXgubGVuZ3RoP251bGw6eH12YXIgcD1mKDEpLHE9TWF0aDtkLmNvbnRhaW5zPWZ1bmN0aW9uKHgsQyl7Zm9yKDtudWxsIT1DJiZDIT09eDspQz1DLnBhcmVudE5vZGU7cmV0dXJuIEM9PT14fTtkLmVsZW1lbnRCQm94PWc7ZC5lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oeCl7cmV0dXJuIHggaW5zdGFuY2VvZiBTVkdFbGVtZW50P2cocC5zZWxlY3QoeCkpOnggaW5zdGFuY2VvZiBIVE1MRWxlbWVudD8oeD14LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHt4OngubGVmdCx5OngudG9wLHdpZHRoOngud2lkdGgsCmhlaWdodDp4LmhlaWdodH0pOnt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjB9fTtkLlNDUkVFTl9SRUZSRVNIX1JBVEVfTUlMTElTRUNPTkRTPTFFMy82MDtkLnJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsPWZ1bmN0aW9uKHgpe251bGwhPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh4KTpzZXRUaW1lb3V0KHgsZC5TQ1JFRU5fUkVGUkVTSF9SQVRFX01JTExJU0VDT05EUyl9O2QuZWxlbWVudFdpZHRoPWZ1bmN0aW9uKHgpe3g9eCBpbnN0YW5jZW9mIHAuc2VsZWN0aW9uP3gubm9kZSgpOng7eD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh4KTtyZXR1cm4gayh4LCJ3aWR0aCIpK2soeCwicGFkZGluZy1sZWZ0Iikrayh4LCJwYWRkaW5nLXJpZ2h0Iikrayh4LCJib3JkZXItbGVmdC13aWR0aCIpK2soeCwiYm9yZGVyLXJpZ2h0LXdpZHRoIil9O2QuZWxlbWVudEhlaWdodD1mdW5jdGlvbih4KXt4PXggaW5zdGFuY2VvZiBwLnNlbGVjdGlvbj8KeC5ub2RlKCk6eDt4PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHgpO3JldHVybiBrKHgsImhlaWdodCIpK2soeCwicGFkZGluZy10b3AiKStrKHgsInBhZGRpbmctYm90dG9tIikrayh4LCJib3JkZXItdG9wLXdpZHRoIikrayh4LCJib3JkZXItYm90dG9tLXdpZHRoIil9O3ZhciByPS90cmFuc2xhdGVccypcKFxzKigoPzpbLStdP1swLTldKlwuP1swLTldKykpKD86KD86KD86XHMrLD9ccyopfCg/OixccyopKSgoPzpbLStdP1swLTldKlwuP1swLTldKykpKT9ccypcKS8sdD0vcm90YXRlXHMqXChccyooKD86Wy0rXT9bMC05XSpcLj9bMC05XSspKVxzKlwpLyx2PS9zY2FsZVxzKlwoXHMqKCg/OlstK10/WzAtOV0qXC4/WzAtOV0rKSkoPzooPzooPzpccyssP1xzKil8KD86LFxzKikpKCg/OlstK10/WzAtOV0qXC4/WzAtOV0rKSkpP1xzKlwpLztkLmdldFRyYW5zbGF0ZVZhbHVlcz1mdW5jdGlvbih4KXt4PXIuZXhlYyh4LmF0dHIoInRyYW5zZm9ybSIpKTtpZihudWxsIT14KXt2YXIgQz0KeFsyXTtyZXR1cm5bK3hbMV0sKyh2b2lkIDA9PT1DPzA6QyldfXJldHVyblswLDBdfTtkLmdldFJvdGF0ZT1mdW5jdGlvbih4KXt4PXQuZXhlYyh4LmF0dHIoInRyYW5zZm9ybSIpKTtyZXR1cm4gbnVsbCE9eD8reFsxXTowfTtkLmdldFNjYWxlVmFsdWVzPWZ1bmN0aW9uKHgpe3ZhciBDPXYuZXhlYyh4LmF0dHIoInRyYW5zZm9ybSIpKTtyZXR1cm4gbnVsbCE9Qz8oeD1DWzFdLEM9Q1syXSxbK3gsbnVsbD09Qz8reDorQ10pOlswLDBdfTtkLmNsaWVudFJlY3RzT3ZlcmxhcD1mdW5jdGlvbih4LEMpe3JldHVybiBxLmZsb29yKHgucmlnaHQpPD1xLmNlaWwoQy5sZWZ0KXx8cS5jZWlsKHgubGVmdCk+PXEuZmxvb3IoQy5yaWdodCl8fHEuZmxvb3IoeC5ib3R0b20pPD1xLmNlaWwoQy50b3ApfHxxLmNlaWwoeC50b3ApPj1xLmZsb29yKEMuYm90dG9tKT8hMTohMH07ZC5leHBhbmRSZWN0PWZ1bmN0aW9uKHgsQyl7cmV0dXJue2xlZnQ6eC5sZWZ0LUMsdG9wOngudG9wLUMscmlnaHQ6eC5yaWdodCsKQyxib3R0b206eC5ib3R0b20rQyx3aWR0aDp4LndpZHRoKzIqQyxoZWlnaHQ6eC5oZWlnaHQrMipDfX07ZC5jbGllbnRSZWN0SW5zaWRlPWZ1bmN0aW9uKHgsQyl7cmV0dXJuIHEuZmxvb3IoQy5sZWZ0KTw9cS5jZWlsKHgubGVmdCkmJnEuZmxvb3IoQy50b3ApPD1xLmNlaWwoeC50b3ApJiZxLmZsb29yKHgucmlnaHQpPD1xLmNlaWwoQy5yaWdodCkmJnEuZmxvb3IoeC5ib3R0b20pPD1xLmNlaWwoQy5ib3R0b20pfTtkLmludGVyc2VjdHNCQm94PWZ1bmN0aW9uKHgsQyxGLEQpe3ZvaWQgMD09PUQmJihEPS41KTt4PWwoeCk7Qz1sKEMpO3JldHVybiBGLngrRi53aWR0aD49eC5taW4tRCYmRi54PD14Lm1heCtEJiZGLnkrRi5oZWlnaHQ+PUMubWluLUQmJkYueTw9Qy5tYXgrRH07ZC5nZXRIdG1sRWxlbWVudEFuY2VzdG9ycz1mdW5jdGlvbih4KXtmb3IodmFyIEM9W107eCYmeCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50OylDLnB1c2goeCkseD14LnBhcmVudEVsZW1lbnQ7cmV0dXJuIEN9OwpkLmdldEVsZW1lbnRUcmFuc2Zvcm09ZnVuY3Rpb24oeCl7eD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh4LG51bGwpO3g9eC5nZXRQcm9wZXJ0eVZhbHVlKCItd2Via2l0LXRyYW5zZm9ybSIpfHx4LmdldFByb3BlcnR5VmFsdWUoIi1tb3otdHJhbnNmb3JtIil8fHguZ2V0UHJvcGVydHlWYWx1ZSgiLW1zLXRyYW5zZm9ybSIpfHx4LmdldFByb3BlcnR5VmFsdWUoIi1vLXRyYW5zZm9ybSIpfHx4LmdldFByb3BlcnR5VmFsdWUoInRyYW5zZm9ybSIpO3JldHVybiBuKHgpfTt2YXIgeT0vXm1hdHJpeFwoKFteKV0rKVwpJC8sej0vWywgXSsvfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyh0LHYpe3JldHVyblt0WzBdKnZbMF0rdFsyXSp2WzFdLHRbMV0qdlswXSt0WzNdKnZbMV0sdFswXSp2WzJdK3RbMl0qdlszXSx0WzFdKnZbMl0rdFszXSp2WzNdLHRbMF0qdls0XSt0WzJdKnZbNV0rdFs0XSx0WzFdKnZbNF0rdFszXSp2WzVdK3RbNV1dfWZ1bmN0aW9uIGwodCx2KXtyZXR1cm5bdFswXSwKdFsxXSx0WzJdLHRbM10sdFswXSp2WzBdK3RbMl0qdlsxXSt0WzRdLHRbMV0qdlswXSt0WzNdKnZbMV0rdFs1XV19ZnVuY3Rpb24gayh0KXt2YXIgdj10WzBdKnRbM10tdFsxXSp0WzJdO2lmKDA9PT12KXRocm93IEVycm9yKCJzaW5ndWxhciBtYXRyaXgiKTt2PTEvdjtyZXR1cm5bdip0WzNdLHYqLXRbMV0sdiotdFsyXSx2KnRbMF0sdiooLXRbM10qdFs0XSt0WzJdKnRbNV0pLHYqKHRbMV0qdFs0XSstdFswXSp0WzVdKV19dmFyIG49ZigxKSxwPWYoNTUpLHE9TWF0aCxyPVsxLDAsMCwxLDAsMF07ZC5pblJhbmdlPWZ1bmN0aW9uKHQsdix5KXtyZXR1cm4gcS5taW4odix5KTw9dCYmdDw9cS5tYXgodix5KX07ZC5jbGFtcD1mdW5jdGlvbih0LHYseSl7cmV0dXJuIHEubWluKHEubWF4KHYsdCkseSl9O2QubWF4PWZ1bmN0aW9uKHQsdix5KXt2YXIgej0iZnVuY3Rpb24iPT09dHlwZW9mIHY/djpudWxsO3Y9bnVsbD09ej92Onk7dD1udWxsPT16P24ubWF4KHQpOm4ubWF4KHQseik7cmV0dXJuIHZvaWQgMCE9PQp0P3Q6dn07ZC5taW49ZnVuY3Rpb24odCx2LHkpe3ZhciB6PSJmdW5jdGlvbiI9PT10eXBlb2Ygdj92Om51bGw7dj1udWxsPT16P3Y6eTt0PW51bGw9PXo/bi5taW4odCk6bi5taW4odCx6KTtyZXR1cm4gdm9pZCAwIT09dD90OnZ9O2QuaXNOYU49ZnVuY3Rpb24odCl7cmV0dXJuIHQhPT10fTtkLmlzVmFsaWROdW1iZXI9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgdCYmMT50LXR9O2QucmFuZ2U9ZnVuY3Rpb24odCx2LHkpe3ZvaWQgMD09PXkmJih5PTEpO2lmKDA9PT15KXRocm93IEVycm9yKCJzdGVwIGNhbm5vdCBiZSAwIik7dj1xLm1heChxLmNlaWwoKHYtdCkveSksMCk7Zm9yKHZhciB6PVtdLHg9MDt4PHY7Kyt4KXpbeF09dCt5Kng7cmV0dXJuIHp9O2QuZGlzdGFuY2VTcXVhcmVkPWZ1bmN0aW9uKHQsdil7cmV0dXJuIHEucG93KHYueS10LnksMikrcS5wb3codi54LXQueCwyKX07ZC5kZWdyZWVzVG9SYWRpYW5zPWZ1bmN0aW9uKHQpe3JldHVybiB0LzM2MCoKcS5QSSoyfTtkLndpdGhpbj1mdW5jdGlvbih0LHYpe3JldHVybiB2LnRvcExlZnQueDw9dC54JiZ2LmJvdHRvbVJpZ2h0Lng+PXQueCYmdi50b3BMZWZ0Lnk8PXQueSYmdi5ib3R0b21SaWdodC55Pj10Lnl9O2QuYm91bmRzSW50ZXJzZWN0cz1mdW5jdGlvbih0LHYseSx6LHgsQyl7cmV0dXJuIHQ8PTAreCYmMDw9dCt5JiZ2PD0wK0MmJjA8PXYren07ZC5nZXRDdW11bGF0aXZlVHJhbnNmb3JtPWZ1bmN0aW9uKHQpe3Q9cC5nZXRIdG1sRWxlbWVudEFuY2VzdG9ycyh0KTtmb3IodmFyIHY9cix5PW51bGwsej0wO3o8dC5sZW5ndGg7eisrKXt2YXIgeD10W3pdLEM9cC5nZXRFbGVtZW50VHJhbnNmb3JtKHgpO2lmKG51bGwhPUMpe3ZhciBGPXguY2xpZW50V2lkdGgvMixEPXguY2xpZW50SGVpZ2h0LzI7dj1sKHYsW0YsRF0pO3Y9Zyh2LGsoQykpO3Y9bCh2LFstRiwtRF0pfUM9eC5zY3JvbGxMZWZ0O0Y9eC5zY3JvbGxUb3A7aWYobnVsbD09PXl8fHg9PT15KUMtPXgub2Zmc2V0TGVmdCt4LmNsaWVudExlZnQsCkYtPXgub2Zmc2V0VG9wK3guY2xpZW50VG9wLHk9eC5vZmZzZXRQYXJlbnQ7dj1sKHYsW0MsRl0pfXJldHVybiB2fTtkLm11bHRpcGx5TWF0cml4PWc7ZC5wcmVtdWx0aXBseVRyYW5zbGF0ZT1mdW5jdGlvbih0LHYpe3JldHVyblt2WzBdLHZbMV0sdlsyXSx2WzNdLHZbNF0rdFswXSx2WzVdK3RbMV1dfTtkLm11bHRpcGx5VHJhbnNsYXRlPWw7ZC5pbnZlcnRNYXRyaXg9aztkLmFwcGx5VHJhbnNmb3JtPWZ1bmN0aW9uKHQsdil7cmV0dXJue3g6dFswXSp2LngrdFsyXSp2LnkrdFs0XSx5OnRbMV0qdi54K3RbM10qdi55K3RbNV19fX0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPW5ldyAoZigxMTQpLlNwbGl0U3RyYXRlZ3lMaW5lYXIpO2M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHAscSl7dm9pZCAwPT09cCYmKHA9NSk7dm9pZCAwPT09cSYmKHE9Zyk7dGhpcy5tYXhOb2RlQ2hpbGRyZW49cDt0aGlzLnNwbGl0U3RyYXRlZ3k9cTt0aGlzLnJvb3Q9bmV3IGwoITApO3RoaXMuc2l6ZT0wfW4ucHJvdG90eXBlLmdldFJvb3Q9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm9vdH07bi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnJvb3Q9bmV3IGwoITApO3RoaXMuc2l6ZT0wfTtuLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24ocCxxKXtmb3IodmFyIHI9dGhpcy5yb290OyFyLmxlYWY7KXI9ci5zdWJ0cmVlKHApO3A9bC52YWx1ZU5vZGUocCxxKTtyLmluc2VydChwKTtmb3IodGhpcy5zaXplKz0xO3Iub3ZlcmZsb3codGhpcy5tYXhOb2RlQ2hpbGRyZW4pOylyPXIuc3BsaXQodGhpcy5zcGxpdFN0cmF0ZWd5KSxudWxsPT1yLnBhcmVudCYmKHRoaXMucm9vdD1yKX07bi5wcm90b3R5cGUubG9jYXRlPWZ1bmN0aW9uKHApe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKHEpe3JldHVybiBxLmNvbnRhaW5zKHApfSl9O24ucHJvdG90eXBlLmludGVyc2VjdD1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5xdWVyeShmdW5jdGlvbihxKXtyZXR1cm4gay5pc0JvdW5kc092ZXJsYXBCb3VuZHMocSxwKX0pfTtuLnByb3RvdHlwZS5pbnRlcnNlY3RYPQpmdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5xdWVyeShmdW5jdGlvbihxKXtyZXR1cm4gay5pc0JvdW5kc092ZXJsYXBYKHEscCl9KX07bi5wcm90b3R5cGUuaW50ZXJzZWN0WT1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5xdWVyeShmdW5jdGlvbihxKXtyZXR1cm4gay5pc0JvdW5kc092ZXJsYXBZKHEscCl9KX07bi5wcm90b3R5cGUucXVlcnk9ZnVuY3Rpb24ocCl7dmFyIHE9W107aWYobnVsbCE9dGhpcy5yb290LmJvdW5kcyYmIXAodGhpcy5yb290LmJvdW5kcykpcmV0dXJuIHE7Zm9yKHZhciByPVt0aGlzLnJvb3RdOzA8ci5sZW5ndGg7KWZvcih2YXIgdD1yLnNoaWZ0KCksdj0wO3Y8dC5lbnRyaWVzLmxlbmd0aDt2Kyspe3ZhciB5PXQuZW50cmllc1t2XTtwKHkuYm91bmRzKSYmKHQubGVhZj9xLnB1c2goeS52YWx1ZSk6ci5wdXNoKHkpKX1yZXR1cm4gcX07cmV0dXJuIG59KCk7ZC5SVHJlZT1jO3ZhciBsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihwKXt0aGlzLmxlYWY9cDt0aGlzLmJvdW5kcz0KbnVsbDt0aGlzLmVudHJpZXM9W107dGhpcy52YWx1ZT10aGlzLnBhcmVudD1udWxsfW4udmFsdWVOb2RlPWZ1bmN0aW9uKHAscSl7dmFyIHI9bmV3IG4oITApO3IuYm91bmRzPXA7ci52YWx1ZT1xO3JldHVybiByfTtuLnByb3RvdHlwZS5vdmVyZmxvdz1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5lbnRyaWVzLmxlbmd0aD5wfTtuLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24ocCl7dGhpcy5lbnRyaWVzLnB1c2gocCk7cC5wYXJlbnQ9dGhpcztmb3IodmFyIHE9dGhpcztudWxsIT1xOylxLmJvdW5kcz1rLnVuaW9uQWxsKFtxLmJvdW5kcyxwLmJvdW5kc10pLHE9cS5wYXJlbnR9O24ucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihwKXtwPXRoaXMuZW50cmllcy5pbmRleE9mKHApO2lmKDA8PXApZm9yKHRoaXMuZW50cmllcy5zcGxpY2UocCwxKSxwPXRoaXM7bnVsbCE9cDspcC5ib3VuZHM9ay51bmlvbkFsbChwLmVudHJpZXMubWFwKGZ1bmN0aW9uKHEpe3JldHVybiBxLmJvdW5kc30pKSwKcD1wLnBhcmVudDtyZXR1cm4gdGhpc307bi5wcm90b3R5cGUuc3VidHJlZT1mdW5jdGlvbihwKXtmb3IodmFyIHE9bnVsbCxyPTA7cjx0aGlzLmVudHJpZXMubGVuZ3RoO3IrKyl7dmFyIHQ9dGhpcy5lbnRyaWVzW3JdLHY9dC51bmlvbkFyZWFEaWZmZXJlbmNlKHApO2lmKEluZmluaXR5PnZ8fEluZmluaXR5PT09diYmbnVsbCE9cSYmdC5lbnRyaWVzLmxlbmd0aDxxLmVudHJpZXMubGVuZ3RoKXE9dH1yZXR1cm4gcX07bi5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24ocCl7bnVsbCE9dGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJlbW92ZSh0aGlzKTt2YXIgcT1bbmV3IG4odGhpcy5sZWFmKSxuZXcgbih0aGlzLmxlYWYpXTtwLnNwbGl0KHRoaXMuZW50cmllcyxxKTtwPW51bGwhPXRoaXMucGFyZW50P3RoaXMucGFyZW50Om5ldyBuKCExKTtwLmluc2VydChxWzBdKTtwLmluc2VydChxWzFdKTtyZXR1cm4gcH07bi5wcm90b3R5cGUudW5pb25BcmVhRGlmZmVyZW5jZT1mdW5jdGlvbihwKXtyZXR1cm4gTWF0aC5hYnMoay51bmlvbih0aGlzLmJvdW5kcywKcCkuYXJlYSgpLXRoaXMuYm91bmRzLmFyZWEoKSl9O24ucHJvdG90eXBlLm1heERlcHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVhZj8xOjErdGhpcy5lbnRyaWVzLm1hcChmdW5jdGlvbihwKXtyZXR1cm4gcC5tYXhEZXB0aCgpfSkucmVkdWNlKGZ1bmN0aW9uKHAscSl7cmV0dXJuIE1hdGgubWF4KHAscSl9KX07cmV0dXJuIG59KCk7ZC5SVHJlZU5vZGU9bDt2YXIgaz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4ocCxxLHIsdCl7dGhpcy54bD1wO3RoaXMueWw9cTt0aGlzLnhoPXI7dGhpcy55aD10O3RoaXMud2lkdGg9dGhpcy54aC10aGlzLnhsO3RoaXMuaGVpZ2h0PXRoaXMueWgtdGhpcy55bH1uLnh5d2g9ZnVuY3Rpb24ocCxxLHIsdCl7cmV0dXJuIG5ldyBuKHAscSxwK3IscSt0KX07bi5lbnRpdHlCb3VuZHM9ZnVuY3Rpb24ocCl7cmV0dXJuIG5ldyBuKHAueCxwLnkscC54K3Aud2lkdGgscC55K3AuaGVpZ2h0KX07bi5ib3VuZHM9ZnVuY3Rpb24ocCl7cmV0dXJuIG4ucG9pbnRQYWlyKHAudG9wTGVmdCwKcC5ib3R0b21SaWdodCl9O24ucG9pbnRQYWlyPWZ1bmN0aW9uKHAscSl7cmV0dXJuIG5ldyBuKE1hdGgubWluKHAueCxxLngpLE1hdGgubWluKHAueSxxLnkpLE1hdGgubWF4KHAueCxxLngpLE1hdGgubWF4KHAueSxxLnkpKX07bi5wb2ludHM9ZnVuY3Rpb24ocCl7aWYoMj5wLmxlbmd0aCl0aHJvdyBFcnJvcigibmVlZCBhdCBsZWFzdCAyIHBvaW50cyB0byBjcmVhdGUgYm91bmRzIik7dmFyIHE9cC5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIHIueH0pO3A9cC5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIHIueX0pO3JldHVybiBuZXcgbihxLnJlZHVjZShmdW5jdGlvbihyLHQpe3JldHVybiBNYXRoLm1pbihyLHQpfSkscC5yZWR1Y2UoZnVuY3Rpb24ocix0KXtyZXR1cm4gTWF0aC5taW4ocix0KX0pLHEucmVkdWNlKGZ1bmN0aW9uKHIsdCl7cmV0dXJuIE1hdGgubWF4KHIsdCl9KSxwLnJlZHVjZShmdW5jdGlvbihyLHQpe3JldHVybiBNYXRoLm1heChyLHQpfSkpfTtuLnVuaW9uPWZ1bmN0aW9uKHAsCnEpe3JldHVybiBuZXcgbihNYXRoLm1pbihwLnhsLHEueGwpLE1hdGgubWluKHAueWwscS55bCksTWF0aC5tYXgocC54aCxxLnhoKSxNYXRoLm1heChwLnloLHEueWgpKX07bi51bmlvbkFsbD1mdW5jdGlvbihwKXtwPXAuZmlsdGVyKGZ1bmN0aW9uKHEpe3JldHVybiBudWxsIT1xfSk7cmV0dXJuIDA9PT1wLmxlbmd0aD9udWxsOnAucmVkdWNlKGZ1bmN0aW9uKHEscil7cmV0dXJuIG4udW5pb24ocSxyKX0pfTtuLmlzQm91bmRzT3ZlcmxhcEJvdW5kcz1mdW5jdGlvbihwLHEpe3JldHVybiBuLmlzQm91bmRzT3ZlcmxhcFgocCxxKSYmbi5pc0JvdW5kc092ZXJsYXBZKHAscSl9O24uaXNCb3VuZHNPdmVybGFwWD1mdW5jdGlvbihwLHEpe3JldHVybiEocC54aDxxLnhsKSYmIShwLnhsPnEueGgpfTtuLmlzQm91bmRzT3ZlcmxhcFk9ZnVuY3Rpb24ocCxxKXtyZXR1cm4hKHAueWg8cS55bCkmJiEocC55bD5xLnloKX07bi5wcm90b3R5cGUuYXJlYT1mdW5jdGlvbigpe251bGw9PXRoaXMuYXJlYUNhY2hlZCYmCih0aGlzLmFyZWFDYWNoZWQ9KHRoaXMueGgtdGhpcy54bCkqKHRoaXMueWgtdGhpcy55bCkpO3JldHVybiB0aGlzLmFyZWFDYWNoZWR9O24ucHJvdG90eXBlLmNvbnRhaW5zPWZ1bmN0aW9uKHApe3JldHVybiB0aGlzLnhsPD1wLngmJnRoaXMueGg+PXAueCYmdGhpcy55bDw9cC55JiZ0aGlzLnloPj1wLnl9O3JldHVybiBufSgpO2QuUlRyZWVCb3VuZHM9a30sZnVuY3Rpb24oYyxkKXtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZigpeyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LlNldD90aGlzLl9lczZTZXQ9bmV3IHdpbmRvdy5TZXQ6dGhpcy5fdmFsdWVzPVtdO3RoaXMuc2l6ZT0wfWYucHJvdG90eXBlLmFkZD1mdW5jdGlvbihnKXtpZihudWxsIT10aGlzLl9lczZTZXQpcmV0dXJuIHRoaXMuX2VzNlNldC5hZGQoZyksdGhpcy5zaXplPXRoaXMuX2VzNlNldC5zaXplLHRoaXM7dGhpcy5oYXMoZyl8fCh0aGlzLl92YWx1ZXMucHVzaChnKSx0aGlzLnNpemU9dGhpcy5fdmFsdWVzLmxlbmd0aCk7CnJldHVybiB0aGlzfTtmLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24oZyl7aWYobnVsbCE9dGhpcy5fZXM2U2V0KXJldHVybiBnPXRoaXMuX2VzNlNldC5kZWxldGUoZyksdGhpcy5zaXplPXRoaXMuX2VzNlNldC5zaXplLGc7Zz10aGlzLl92YWx1ZXMuaW5kZXhPZihnKTtyZXR1cm4tMSE9PWc/KHRoaXMuX3ZhbHVlcy5zcGxpY2UoZywxKSx0aGlzLnNpemU9dGhpcy5fdmFsdWVzLmxlbmd0aCwhMCk6ITF9O2YucHJvdG90eXBlLmhhcz1mdW5jdGlvbihnKXtyZXR1cm4gbnVsbCE9dGhpcy5fZXM2U2V0P3RoaXMuX2VzNlNldC5oYXMoZyk6LTEhPT10aGlzLl92YWx1ZXMuaW5kZXhPZihnKX07Zi5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihnLGwpe3ZhciBrPXRoaXM7bnVsbCE9dGhpcy5fZXM2U2V0P3RoaXMuX2VzNlNldC5mb3JFYWNoKGZ1bmN0aW9uKG4scCl7cmV0dXJuIGcuY2FsbChsLG4scCxrKX0sbCk6dGhpcy5fdmFsdWVzLmZvckVhY2goZnVuY3Rpb24obil7Zy5jYWxsKGwsCm4sbixrKX0pfTtyZXR1cm4gZn0oKTtkLlNldD1jfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhsKXtmb3IodmFyIGsgaW4gbClkLmhhc093blByb3BlcnR5KGspfHwoZFtrXT1sW2tdKX1nKGYoMTMxKSk7ZyhmKDEzMCkpfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGssbil7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9a31mb3IodmFyIHEgaW4gbiluLmhhc093blByb3BlcnR5KHEpJiYoa1txXT1uW3FdKTtrLnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihwLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgcCl9LGw9ZigyMSk7Yz1mdW5jdGlvbihrKXtmdW5jdGlvbiBuKHAscSl7dmFyIHI9ay5jYWxsKHRoaXMscCxxKXx8dGhpcztyLmNhY2hlPW5ldyBsLkNhY2hlKGZ1bmN0aW9uKHQpe3JldHVybiByLl9tZWFzdXJlQ2hhcmFjdGVyTm90RnJvbUNhY2hlKHQpfSk7cmV0dXJuIHJ9ZyhuLGspO24ucHJvdG90eXBlLl9tZWFzdXJlQ2hhcmFjdGVyTm90RnJvbUNhY2hlPQpmdW5jdGlvbihwKXtyZXR1cm4gay5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXIuY2FsbCh0aGlzLHApfTtuLnByb3RvdHlwZS5fbWVhc3VyZUNoYXJhY3Rlcj1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5jYWNoZS5nZXQocCl9O24ucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5jYWNoZS5jbGVhcigpfTtyZXR1cm4gbn0oZig2MSkuQ2hhcmFjdGVyTWVhc3VyZXIpO2QuQ2FjaGVDaGFyYWN0ZXJNZWFzdXJlcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwsayl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIHAgaW4gaylrLmhhc093blByb3BlcnR5KHApJiYobFtwXT1rW3BdKTtsLnByb3RvdHlwZT1udWxsPT09az9PYmplY3QuY3JlYXRlKGspOihuLnByb3RvdHlwZT1rLnByb3RvdHlwZSxuZXcgbil9O2M9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gaygpe3JldHVybiBsLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8CnRoaXN9ZyhrLGwpO2sucHJvdG90eXBlLl9tZWFzdXJlQ2hhcmFjdGVyPWZ1bmN0aW9uKG4pe3JldHVybiBsLnByb3RvdHlwZS5fbWVhc3VyZUxpbmUuY2FsbCh0aGlzLG4pfTtrLnByb3RvdHlwZS5fbWVhc3VyZUxpbmU9ZnVuY3Rpb24obil7dmFyIHA9dGhpcztuPW4uc3BsaXQoIiIpLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gcC5fbWVhc3VyZUNoYXJhY3RlcihxKX0pO3JldHVybntoZWlnaHQ6bi5yZWR1Y2UoZnVuY3Rpb24ocSxyKXtyZXR1cm4gTWF0aC5tYXgocSxyLmhlaWdodCl9LDApLHdpZHRoOm4ucmVkdWNlKGZ1bmN0aW9uKHEscil7cmV0dXJuIHErci53aWR0aH0sMCl9fTtyZXR1cm4ga30oZig2MykuTWVhc3VyZXIpO2QuQ2hhcmFjdGVyTWVhc3VyZXI9Y30sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcobCl7Zm9yKHZhciBrIGluIGwpZC5oYXNPd25Qcm9wZXJ0eShrKXx8KGRba109bFtrXSl9ZyhmKDM2KSk7ZyhmKDYwKSk7ZyhmKDEzMikpO2coZig2MSkpO2coZig2MykpfSwKZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihrLG4pe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPWt9Zm9yKHZhciBxIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShxKSYmKGtbcV09bltxXSk7ay5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKToocC5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IHApfSxsPWYoMzYpO2M9ZnVuY3Rpb24oayl7ZnVuY3Rpb24gbihwLHEpe3ZvaWQgMD09PXEmJihxPSExKTtwPWsuY2FsbCh0aGlzLHApfHx0aGlzO3AudXNlR3VhcmRzPXE7cmV0dXJuIHB9ZyhuLGspO24ucHJvdG90eXBlLl9hZGRHdWFyZHM9ZnVuY3Rpb24ocCl7cmV0dXJuIGwuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVCtwK2wuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVH07bi5wcm90b3R5cGUuX21lYXN1cmVMaW5lPWZ1bmN0aW9uKHApe3ZhciBxO3ZvaWQgMD09PXEmJihxPSExKTtxPXRoaXMudXNlR3VhcmRzfHwKcXx8L15bXHQgXSQvLnRlc3QocCk7cD1rLnByb3RvdHlwZS5tZWFzdXJlLmNhbGwodGhpcyxxP3RoaXMuX2FkZEd1YXJkcyhwKTpwKTtwLndpZHRoLT1xPzIqdGhpcy5nZXRHdWFyZFdpZHRoKCk6MDtyZXR1cm4gcH07bi5wcm90b3R5cGUubWVhc3VyZT1mdW5jdGlvbihwKXt2YXIgcT10aGlzO3ZvaWQgMD09PXAmJihwPWwuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVCk7aWYoIiI9PT1wLnRyaW0oKSlyZXR1cm57d2lkdGg6MCxoZWlnaHQ6MH07cD1wLnRyaW0oKS5zcGxpdCgiXG4iKS5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIHEuX21lYXN1cmVMaW5lKHIpfSk7cmV0dXJue2hlaWdodDpwLnJlZHVjZShmdW5jdGlvbihyLHQpe3JldHVybiByK3QuaGVpZ2h0fSwwKSx3aWR0aDpwLnJlZHVjZShmdW5jdGlvbihyLHQpe3JldHVybiBNYXRoLm1heChyLHQud2lkdGgpfSwwKX19O24ucHJvdG90eXBlLmdldEd1YXJkV2lkdGg9ZnVuY3Rpb24oKXtudWxsPT10aGlzLmd1YXJkV2lkdGgmJgoodGhpcy5ndWFyZFdpZHRoPWsucHJvdG90eXBlLm1lYXN1cmUuY2FsbCh0aGlzKS53aWR0aCk7cmV0dXJuIHRoaXMuZ3VhcmRXaWR0aH07cmV0dXJuIG59KGwuQWJzdHJhY3RNZWFzdXJlcik7ZC5NZWFzdXJlcj1jfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhsKXtmb3IodmFyIGsgaW4gbClkLmhhc093blByb3BlcnR5KGspfHwoZFtrXT1sW2tdKX1nKGYoMTM4KSk7ZyhmKDY1KSl9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz1mKDIxKTtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbCgpe3RoaXMubWF4TGluZXMoSW5maW5pdHkpO3RoaXMudGV4dFRyaW1taW5nKCk7dGhpcy5hbGxvd0JyZWFraW5nV29yZHMoKTt0aGlzLl90b2tlbml6ZXI9bmV3IGcuVG9rZW5pemVyO3RoaXMuX2JyZWFraW5nQ2hhcmFjdGVyPSItIn1sLnByb3RvdHlwZS5tYXhMaW5lcz1mdW5jdGlvbihrKXtpZihudWxsPT1rKXJldHVybiB0aGlzLl9tYXhMaW5lczt0aGlzLl9tYXhMaW5lcz1rO3JldHVybiB0aGlzfTsKbC5wcm90b3R5cGUudGV4dFRyaW1taW5nPWZ1bmN0aW9uKCl7dGhpcy5fdGV4dFRyaW1taW5nPSJlbGxpcHNpcyJ9O2wucHJvdG90eXBlLmFsbG93QnJlYWtpbmdXb3Jkcz1mdW5jdGlvbigpe3RoaXMuX2FsbG93QnJlYWtpbmdXb3Jkcz0hMH07bC5wcm90b3R5cGUud3JhcD1mdW5jdGlvbihrLG4scCxxKXt2YXIgcj10aGlzO3ZvaWQgMD09PXEmJihxPUluZmluaXR5KTt2YXIgdD17bm9Ccm9rZVdvcmRzOjAsbm9MaW5lczowLG9yaWdpbmFsVGV4dDprLHRydW5jYXRlZFRleHQ6IiIsd3JhcHBlZFRleHQ6IiJ9O3A9e2F2YWlsYWJsZUxpbmVzOk1hdGgubWluKE1hdGguZmxvb3IocS9uLm1lYXN1cmUoKS5oZWlnaHQpLHRoaXMuX21heExpbmVzKSxhdmFpbGFibGVXaWR0aDpwLGNhbkZpdFRleHQ6ITAsY3VycmVudExpbmU6IiIsd3JhcHBpbmc6dH07dmFyIHY9ay5zcGxpdCgiXG4iKTtyZXR1cm4gdi5yZWR1Y2UoZnVuY3Rpb24oeSx6LHgpe3JldHVybiByLmJyZWFrTGluZVRvRml0V2lkdGgoeSwKeix4IT09di5sZW5ndGgtMSxuKX0scCkud3JhcHBpbmd9O2wucHJvdG90eXBlLmJyZWFrTGluZVRvRml0V2lkdGg9ZnVuY3Rpb24oayxuLHAscSl7dmFyIHI9dGhpcztrLmNhbkZpdFRleHR8fCIiPT09ay53cmFwcGluZy50cnVuY2F0ZWRUZXh0fHwoay53cmFwcGluZy50cnVuY2F0ZWRUZXh0Kz0iXG4iKTtrPXRoaXMuX3Rva2VuaXplci50b2tlbml6ZShuKS5yZWR1Y2UoZnVuY3Rpb24odCx2KXtyZXR1cm4gci53cmFwTmV4dFRva2VuKHYsdCxxKX0sayk7bj1nLlN0cmluZ01ldGhvZHMudHJpbUVuZChrLmN1cnJlbnRMaW5lKTtrLndyYXBwaW5nLm5vTGluZXMrPSsoIiIhPT1uKTtrLndyYXBwaW5nLm5vTGluZXM9PT1rLmF2YWlsYWJsZUxpbmVzJiYibm9uZSIhPT10aGlzLl90ZXh0VHJpbW1pbmcmJnA/ay5jYW5GaXRUZXh0PSExOmsud3JhcHBpbmcud3JhcHBlZFRleHQrPW47ay5jdXJyZW50TGluZT0iXG4iO3JldHVybiBrfTtsLnByb3RvdHlwZS5jYW5GaXRUb2tlbj1mdW5jdGlvbihrLApuLHApe3ZhciBxPXRoaXMscj10aGlzLl9hbGxvd0JyZWFraW5nV29yZHM/ay5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKHQsdil7cmV0dXJuIHYhPT1rLmxlbmd0aC0xP3QrcS5fYnJlYWtpbmdDaGFyYWN0ZXI6dH0pOltrXTtyZXR1cm4gcC5tZWFzdXJlKGspLndpZHRoPD1ufHxyLmV2ZXJ5KGZ1bmN0aW9uKHQpe3JldHVybiBwLm1lYXN1cmUodCkud2lkdGg8PW59KX07bC5wcm90b3R5cGUuYWRkRWxsaXBzaXM9ZnVuY3Rpb24oayxuLHApe2lmKCJub25lIj09PXRoaXMuX3RleHRUcmltbWluZylyZXR1cm57cmVtYWluaW5nVG9rZW46IiIsd3JhcHBlZFRva2VuOmt9O3ZhciBxPWsuc3Vic3RyaW5nKDApLnRyaW0oKSxyPXAubWVhc3VyZShxKS53aWR0aCx0PXAubWVhc3VyZSgiLi4uIikud2lkdGgsdj0wPGsubGVuZ3RoJiYiXG4iPT09a1swXT8iXG4iOiIiO2lmKG48PXQpcmV0dXJue3JlbWFpbmluZ1Rva2VuOmssd3JhcHBlZFRva2VuOnYrIi4uLiIuc3Vic3RyKDAsTWF0aC5mbG9vcihuLwoodC8zKSkpfTtmb3IoO3IrdD5uOylxPWcuU3RyaW5nTWV0aG9kcy50cmltRW5kKHEuc3Vic3RyKDAscS5sZW5ndGgtMSkpLHI9cC5tZWFzdXJlKHEpLndpZHRoO3JldHVybntyZW1haW5pbmdUb2tlbjpnLlN0cmluZ01ldGhvZHMudHJpbUVuZChrLnN1YnN0cmluZyhxLmxlbmd0aCksIi0iKS50cmltKCksd3JhcHBlZFRva2VuOnYrcSsiLi4uIn19O2wucHJvdG90eXBlLndyYXBOZXh0VG9rZW49ZnVuY3Rpb24oayxuLHApe2lmKCFuLmNhbkZpdFRleHR8fG4uYXZhaWxhYmxlTGluZXM9PT1uLndyYXBwaW5nLm5vTGluZXN8fCF0aGlzLmNhbkZpdFRva2VuKGssbi5hdmFpbGFibGVXaWR0aCxwKSlyZXR1cm4gdGhpcy5maW5pc2hXcmFwcGluZyhrLG4scCk7Zm9yKDtrOyl7dmFyIHE9dGhpcy5icmVha1Rva2VuVG9GaXRJbldpZHRoKGssbi5jdXJyZW50TGluZSxuLmF2YWlsYWJsZVdpZHRoLHApO24uY3VycmVudExpbmU9cS5saW5lO2s9cS5yZW1haW5pbmdUb2tlbjtpZihudWxsIT1rKWlmKG4ud3JhcHBpbmcubm9Ccm9rZVdvcmRzKz0KK3EuYnJlYWtXb3JkLCsrbi53cmFwcGluZy5ub0xpbmVzLG4uYXZhaWxhYmxlTGluZXM9PT1uLndyYXBwaW5nLm5vTGluZXMpe3A9dGhpcy5hZGRFbGxpcHNpcyhuLmN1cnJlbnRMaW5lLG4uYXZhaWxhYmxlV2lkdGgscCk7bi53cmFwcGluZy53cmFwcGVkVGV4dCs9cC53cmFwcGVkVG9rZW47bi53cmFwcGluZy50cnVuY2F0ZWRUZXh0Kz1wLnJlbWFpbmluZ1Rva2VuK2s7bi5jdXJyZW50TGluZT0iXG4iO2JyZWFrfWVsc2Ugbi53cmFwcGluZy53cmFwcGVkVGV4dCs9Zy5TdHJpbmdNZXRob2RzLnRyaW1FbmQobi5jdXJyZW50TGluZSksbi5jdXJyZW50TGluZT0iXG4ifXJldHVybiBufTtsLnByb3RvdHlwZS5maW5pc2hXcmFwcGluZz1mdW5jdGlvbihrLG4scCl7bi5jYW5GaXRUZXh0JiZuLmF2YWlsYWJsZUxpbmVzIT09bi53cmFwcGluZy5ub0xpbmVzJiZ0aGlzLl9hbGxvd0JyZWFraW5nV29yZHMmJiJub25lIiE9PXRoaXMuX3RleHRUcmltbWluZz8ocD10aGlzLmFkZEVsbGlwc2lzKG4uY3VycmVudExpbmUrCmssbi5hdmFpbGFibGVXaWR0aCxwKSxuLndyYXBwaW5nLndyYXBwZWRUZXh0Kz1wLndyYXBwZWRUb2tlbixuLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPXAucmVtYWluaW5nVG9rZW4sbi53cmFwcGluZy5ub0Jyb2tlV29yZHMrPSsocC5yZW1haW5pbmdUb2tlbi5sZW5ndGg8ay5sZW5ndGgpLG4ud3JhcHBpbmcubm9MaW5lcys9KygwPHAud3JhcHBlZFRva2VuLmxlbmd0aCksbi5jdXJyZW50TGluZT0iIik6bi53cmFwcGluZy50cnVuY2F0ZWRUZXh0Kz1rO24uY2FuRml0VGV4dD0hMTtyZXR1cm4gbn07bC5wcm90b3R5cGUuYnJlYWtUb2tlblRvRml0SW5XaWR0aD1mdW5jdGlvbihrLG4scCxxKXtpZih2b2lkIDA9PT1yKXZhciByPXRoaXMuX2JyZWFraW5nQ2hhcmFjdGVyO2lmKHEubWVhc3VyZShuK2spLndpZHRoPD1wKXJldHVybnticmVha1dvcmQ6ITEsbGluZTpuK2sscmVtYWluaW5nVG9rZW46bnVsbH07aWYoIiI9PT1rLnRyaW0oKSlyZXR1cm57YnJlYWtXb3JkOiExLGxpbmU6biwKcmVtYWluaW5nVG9rZW46IiJ9O2lmKCF0aGlzLl9hbGxvd0JyZWFraW5nV29yZHMpcmV0dXJue2JyZWFrV29yZDohMSxsaW5lOm4scmVtYWluaW5nVG9rZW46a307Zm9yKHZhciB0PTA7dDxrLmxlbmd0aDspaWYocS5tZWFzdXJlKG4ray5zdWJzdHJpbmcoMCx0KzEpK3IpLndpZHRoPD1wKSsrdDtlbHNlIGJyZWFrO3A9IiI7MDx0JiYocD1yKTtyZXR1cm57YnJlYWtXb3JkOjA8dCxsaW5lOm4ray5zdWJzdHJpbmcoMCx0KStwLHJlbWFpbmluZ1Rva2VuOmsuc3Vic3RyaW5nKHQpfX07cmV0dXJuIGx9KCk7ZC5XcmFwcGVyPWN9LGZ1bmN0aW9uKGMsZCxmKXsoZnVuY3Rpb24oZyl7Zm9yKHZhciBsIGluIGcpZC5oYXNPd25Qcm9wZXJ0eShsKXx8KGRbbF09Z1tsXSl9KShmKDEzOSkpfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhsKXtmb3IodmFyIGsgaW4gbClkLmhhc093blByb3BlcnR5KGspfHwoZFtrXT1sW2tdKX1nKGYoNzIpKTtnKGYoNzMpKTtnKGYoMjgpKX0sZnVuY3Rpb24oYywKZCl7ZC52ZXJzaW9uPSIzLjcuMCJ9LGZ1bmN0aW9uKGMsZCxmKXtmdW5jdGlvbiBnKHgsQyl7cmV0dXJuIHguZWFjaChmdW5jdGlvbigpe3ZhciBGPUMuYXBwbHkodGhpcyxhcmd1bWVudHMpLEQ9ei5zZWxlY3QodGhpcyksQjtmb3IoQiBpbiBGKUQuYXR0cihCLEZbQl0pfSl9ZnVuY3Rpb24gbCh4LEMpe2Zvcih2YXIgRiBpbiBDKXguYXR0cihGLENbRl0pO3JldHVybiB4fWZ1bmN0aW9uIGsoeCxDLEYpe3JldHVybiB4LmVhY2goZnVuY3Rpb24oKXt2YXIgRD1DLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxCPXouc2VsZWN0KHRoaXMpLEk7Zm9yKEkgaW4gRClCLnN0eWxlKEksRFtJXSxGKX0pfWZ1bmN0aW9uIG4oeCxDLEYpe2Zvcih2YXIgRCBpbiBDKXguc3R5bGUoRCxDW0RdLEYpO3JldHVybiB4fWZ1bmN0aW9uIHAoeCxDKXtyZXR1cm4geC5lYWNoKGZ1bmN0aW9uKCl7dmFyIEY9Qy5hcHBseSh0aGlzLGFyZ3VtZW50cyksRD16LnNlbGVjdCh0aGlzKSxCO2ZvcihCIGluIEYpRC5wcm9wZXJ0eShCLApGW0JdKX0pfWZ1bmN0aW9uIHEoeCxDKXtmb3IodmFyIEYgaW4gQyl4LnByb3BlcnR5KEYsQ1tGXSk7cmV0dXJuIHh9ZnVuY3Rpb24gcih4LEMpe3JldHVybiB4LmVhY2goZnVuY3Rpb24oKXt2YXIgRj1DLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxEPXouc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oeCksQjtmb3IoQiBpbiBGKUQuYXR0cihCLEZbQl0pfSl9ZnVuY3Rpb24gdCh4LEMpe2Zvcih2YXIgRiBpbiBDKXguYXR0cihGLENbRl0pO3JldHVybiB4fWZ1bmN0aW9uIHYoeCxDLEYpe3JldHVybiB4LmVhY2goZnVuY3Rpb24oKXt2YXIgRD1DLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxCPXouc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oeCksSTtmb3IoSSBpbiBEKUIuc3R5bGUoSSxEW0ldLEYpfSl9ZnVuY3Rpb24geSh4LEMsRil7Zm9yKHZhciBEIGluIEMpeC5zdHlsZShELENbRF0sRik7cmV0dXJuIHh9dmFyIHo9Yz1mKDEpO3ouc2VsZWN0aW9uLnByb3RvdHlwZS5hdHRycz1mdW5jdGlvbih4KXtyZXR1cm4oImZ1bmN0aW9uIj09PQp0eXBlb2YgeD9nOmwpKHRoaXMseCl9O3ouc2VsZWN0aW9uLnByb3RvdHlwZS5zdHlsZXM9ZnVuY3Rpb24oeCl7cmV0dXJuKCJmdW5jdGlvbiI9PT10eXBlb2YgeD9rOm4pKHRoaXMseCwiIil9O3ouc2VsZWN0aW9uLnByb3RvdHlwZS5wcm9wZXJ0aWVzPWZ1bmN0aW9uKHgpe3JldHVybigiZnVuY3Rpb24iPT09dHlwZW9mIHg/cDpxKSh0aGlzLHgpfTtjLnRyYW5zaXRpb24ucHJvdG90eXBlLmF0dHJzPWZ1bmN0aW9uKHgpe3JldHVybigiZnVuY3Rpb24iPT09dHlwZW9mIHg/cjp0KSh0aGlzLHgpfTtjLnRyYW5zaXRpb24ucHJvdG90eXBlLnN0eWxlcz1mdW5jdGlvbih4KXtyZXR1cm4oImZ1bmN0aW9uIj09PXR5cGVvZiB4P3Y6eSkodGhpcyx4LCIiKX19LGZ1bmN0aW9uKGMsZCxmKXtjPWYoMTE3KTt2YXIgZz1mKDEyKTtmPWYoMTApO3ZhciBsPXtsaW5lYXI6Yy5lYXNlTGluZWFyLHF1YWQ6Yy5lYXNlUXVhZCxxdWFkSW46Yy5lYXNlUXVhZEluLHF1YWRPdXQ6Yy5lYXNlUXVhZE91dCwKcXVhZEluT3V0OmMuZWFzZVF1YWRJbk91dCxjdWJpYzpjLmVhc2VDdWJpYyxjdWJpY0luOmMuZWFzZUN1YmljSW4sY3ViaWNPdXQ6Yy5lYXNlQ3ViaWNPdXQsY3ViaWNJbk91dDpjLmVhc2VDdWJpY0luT3V0LHBvbHk6Yy5lYXNlUG9seSxwb2x5SW46Yy5lYXNlUG9seUluLHBvbHlPdXQ6Yy5lYXNlUG9seU91dCxwb2x5SW5PdXQ6Yy5lYXNlUG9seUluT3V0LHNpbjpjLmVhc2VTaW4sc2luSW46Yy5lYXNlU2luSW4sc2luT3V0OmMuZWFzZVNpbk91dCxzaW5Jbk91dDpjLmVhc2VTaW5Jbk91dCxleHA6Yy5lYXNlRXhwLGV4cEluOmMuZWFzZUV4cEluLGV4cE91dDpjLmVhc2VFeHBPdXQsZXhwSW5PdXQ6Yy5lYXNlRXhwSW5PdXQsY2lyY2xlOmMuZWFzZUNpcmNsZSxjaXJjbGVJbjpjLmVhc2VDaXJjbGVJbixjaXJjbGVPdXQ6Yy5lYXNlQ2lyY2xlT3V0LGNpcmNsZUluT3V0OmMuZWFzZUNpcmNsZUluT3V0LGJvdW5jZTpjLmVhc2VCb3VuY2UsYm91bmNlSW46Yy5lYXNlQm91bmNlSW4sYm91bmNlT3V0OmMuZWFzZUJvdW5jZU91dCwKYm91bmNlSW5PdXQ6Yy5lYXNlQm91bmNlSW5PdXQsYmFjazpjLmVhc2VCYWNrLGJhY2tJbjpjLmVhc2VCYWNrSW4sYmFja091dDpjLmVhc2VCYWNrT3V0LGJhY2tJbk91dDpjLmVhc2VCYWNrSW5PdXQsZWxhc3RpYzpjLmVhc2VFbGFzdGljLGVsYXN0aWNJbjpjLmVhc2VFbGFzdGljSW4sZWxhc3RpY091dDpjLmVhc2VFbGFzdGljT3V0LGVsYXN0aWNJbk91dDpjLmVhc2VFbGFzdGljSW5PdXR9O2QuRWFzZU5hbWU9Zi5tYWtlRW51bSgibGluZWFyIHF1YWQgcXVhZEluIHF1YWRPdXQgcXVhZEluT3V0IGN1YmljIGN1YmljSW4gY3ViaWNPdXQgY3ViaWNJbk91dCBwb2x5IHBvbHlJbiBwb2x5T3V0IHBvbHlJbk91dCBzaW4gc2luSW4gc2luT3V0IHNpbkluT3V0IGV4cCBleHBJbiBleHBPdXQgZXhwSW5PdXQgY2lyY2xlIGNpcmNsZUluIGNpcmNsZU91dCBjaXJjbGVJbk91dCBib3VuY2UgYm91bmNlSW4gYm91bmNlT3V0IGJvdW5jZUluT3V0IGJhY2sgYmFja0luIGJhY2tPdXQgYmFja0luT3V0IGVsYXN0aWMgZWxhc3RpY0luIGVsYXN0aWNPdXQgZWxhc3RpY0luT3V0Ii5zcGxpdCgiICIpKTsKZj1mdW5jdGlvbigpe2Z1bmN0aW9uIGsoKXt0aGlzLl9zdGFydERlbGF5PWsuX0RFRkFVTFRfU1RBUlRfREVMQVlfTUlMTElTRUNPTkRTO3RoaXMuX3N0ZXBEdXJhdGlvbj1rLl9ERUZBVUxUX1NURVBfRFVSQVRJT05fTUlMTElTRUNPTkRTO3RoaXMuX3N0ZXBEZWxheT1rLl9ERUZBVUxUX0lURVJBVElWRV9ERUxBWV9NSUxMSVNFQ09ORFM7dGhpcy5fbWF4VG90YWxEdXJhdGlvbj1rLl9ERUZBVUxUX01BWF9UT1RBTF9EVVJBVElPTl9NSUxMSVNFQ09ORFM7dGhpcy5fZWFzaW5nTW9kZT1rLl9ERUZBVUxUX0VBU0lOR19NT0RFfWsucHJvdG90eXBlLnRvdGFsVGltZT1mdW5jdGlvbihuKXt2YXIgcD10aGlzLl9nZXRBZGp1c3RlZEl0ZXJhdGl2ZURlbGF5KG4pO3JldHVybiB0aGlzLnN0YXJ0RGVsYXkoKStwKk1hdGgubWF4KG4tMSwwKSt0aGlzLnN0ZXBEdXJhdGlvbigpfTtrLnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKG4scCl7dmFyIHE9dGhpcztuPWcuY29lcmNlRXh0ZXJuYWxEMyhuKTsKdmFyIHI9bi5zaXplKCksdD10aGlzLl9nZXRBZGp1c3RlZEl0ZXJhdGl2ZURlbGF5KHIpO3JldHVybiBuLnRyYW5zaXRpb24oKS5lYXNlKHRoaXMuX2dldEVhc2VGYWN0b3J5KCkpLmR1cmF0aW9uKHRoaXMuc3RlcER1cmF0aW9uKCkpLmRlbGF5KGZ1bmN0aW9uKHYseSl7cmV0dXJuIHEuc3RhcnREZWxheSgpK3QqeX0pLmF0dHJzKHApfTtrLnByb3RvdHlwZS5zdGFydERlbGF5PWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX3N0YXJ0RGVsYXk7dGhpcy5fc3RhcnREZWxheT1uO3JldHVybiB0aGlzfTtrLnByb3RvdHlwZS5zdGVwRHVyYXRpb249ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gTWF0aC5taW4odGhpcy5fc3RlcER1cmF0aW9uLHRoaXMuX21heFRvdGFsRHVyYXRpb24pO3RoaXMuX3N0ZXBEdXJhdGlvbj1uO3JldHVybiB0aGlzfTtrLnByb3RvdHlwZS5zdGVwRGVsYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RlcERlbGF5fTtrLnByb3RvdHlwZS5tYXhUb3RhbER1cmF0aW9uPQpmdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9tYXhUb3RhbER1cmF0aW9uO3RoaXMuX21heFRvdGFsRHVyYXRpb249bjtyZXR1cm4gdGhpc307ay5wcm90b3R5cGUuZWFzaW5nTW9kZT1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9lYXNpbmdNb2RlO3RoaXMuX2Vhc2luZ01vZGU9bjtyZXR1cm4gdGhpc307ay5wcm90b3R5cGUuX2dldEVhc2VGYWN0b3J5PWZ1bmN0aW9uKCl7dmFyIG49dGhpcy5lYXNpbmdNb2RlKCk7cmV0dXJuInN0cmluZyI9PT10eXBlb2Ygbj8obj1sW25dLG51bGw9PW4/bC5saW5lYXI6bik6bn07ay5wcm90b3R5cGUuX2dldEFkanVzdGVkSXRlcmF0aXZlRGVsYXk9ZnVuY3Rpb24obil7dmFyIHA9dGhpcy5tYXhUb3RhbER1cmF0aW9uKCktdGhpcy5zdGVwRHVyYXRpb24oKTtwPU1hdGgubWF4KHAsMCk7bj1wL01hdGgubWF4KG4tMSwxKTtyZXR1cm4gTWF0aC5taW4odGhpcy5zdGVwRGVsYXkoKSxuKX07cmV0dXJuIGt9KCk7Zi5fREVGQVVMVF9TVEFSVF9ERUxBWV9NSUxMSVNFQ09ORFM9CjA7Zi5fREVGQVVMVF9TVEVQX0RVUkFUSU9OX01JTExJU0VDT05EUz0zMDA7Zi5fREVGQVVMVF9JVEVSQVRJVkVfREVMQVlfTUlMTElTRUNPTkRTPTE1O2YuX0RFRkFVTFRfTUFYX1RPVEFMX0RVUkFUSU9OX01JTExJU0VDT05EUz1JbmZpbml0eTtmLl9ERUZBVUxUX0VBU0lOR19NT0RFPSJleHBPdXQiO2QuRWFzaW5nPWZ9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz1mKDEyKTtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbCgpe31sLnByb3RvdHlwZS50b3RhbFRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gMH07bC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihrLG4pe2s9Zy5jb2VyY2VFeHRlcm5hbEQzKGspO3JldHVybiBrLmF0dHJzKG4pfTtyZXR1cm4gbH0oKTtkLk51bGw9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihyLHQpe2Z1bmN0aW9uIHYoKXt0aGlzLmNvbnN0cnVjdG9yPXJ9Zm9yKHZhciB5IGluIHQpdC5oYXNPd25Qcm9wZXJ0eSh5KSYmCihyW3ldPXRbeV0pO3IucHJvdG90eXBlPW51bGw9PT10P09iamVjdC5jcmVhdGUodCk6KHYucHJvdG90eXBlPXQucHJvdG90eXBlLG5ldyB2KX0sbD1mKDEpLGs9Zig1KSxuPWYoNCkscD1mKDApLHE9ZigyMik7Yz1mdW5jdGlvbihyKXtmdW5jdGlvbiB0KHYseSl7dm9pZCAwPT09eSYmKHk9ImJvdHRvbSIpO3Y9ci5jYWxsKHRoaXMsdix5KXx8dGhpczt2Ll90aWNrTGFiZWxBbmdsZT0wO3YuX3RpY2tMYWJlbFNoZWFyQW5nbGU9MDt2LmFkZENsYXNzKCJjYXRlZ29yeS1heGlzIik7cmV0dXJuIHZ9Zyh0LHIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiX3dyYXBwZXIiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdj1uZXcgay5XcmFwcGVyO251bGwhPXRoaXMuX3RpY2tMYWJlbE1heExpbmVzJiZ2Lm1heExpbmVzKHRoaXMuX3RpY2tMYWJlbE1heExpbmVzKTtyZXR1cm4gdn0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsCiJfd3JpdGVyIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBrLldyaXRlcih0aGlzLl9tZWFzdXJlcix0aGlzLl90eXBlc2V0dGVyQ29udGV4dCx0aGlzLl93cmFwcGVyKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTt0LnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtyLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl90eXBlc2V0dGVyQ29udGV4dD1uZXcgay5TdmdDb250ZXh0KHRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5ub2RlKCkpO3RoaXMuX21lYXN1cmVyPW5ldyBrLkNhY2hlTWVhc3VyZXIodGhpcy5fdHlwZXNldHRlckNvbnRleHQpfTt0LnByb3RvdHlwZS5fcmVzY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlZHJhdygpfTt0LnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbih2LHkpe3ZhciB6PXRoaXMuaXNIb3Jpem9udGFsKCk/MDp0aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpK3RoaXMubWFyZ2luKCkseD10aGlzLmlzSG9yaXpvbnRhbCgpPwp0aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpK3RoaXMubWFyZ2luKCk6MDtpZigwPT09dGhpcy5fc2NhbGUuZG9tYWluKCkubGVuZ3RoKXJldHVybnttaW5XaWR0aDowLG1pbkhlaWdodDowfTtpZih0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpKXt2YXIgQz10aGlzLl9hbm5vdGF0aW9uVGllckhlaWdodCgpKnRoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpO3RoaXMuaXNIb3Jpem9udGFsKCk/eCs9Qzp6Kz1DfXY9dGhpcy5fbWVhc3VyZVRpY2tMYWJlbHModix5KTtyZXR1cm57bWluV2lkdGg6di51c2VkV2lkdGgreixtaW5IZWlnaHQ6di51c2VkSGVpZ2h0K3h9fTt0LnByb3RvdHlwZS5fY29yZVNpemU9ZnVuY3Rpb24oKXt2YXIgdj10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuaGVpZ2h0KCk6dGhpcy53aWR0aCgpLHk9dGhpcy5pc0hvcml6b250YWwoKT90aGlzLnJlcXVlc3RlZFNwYWNlKHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpKS5taW5IZWlnaHQ6dGhpcy5yZXF1ZXN0ZWRTcGFjZSh0aGlzLndpZHRoKCksCnRoaXMuaGVpZ2h0KCkpLm1pbldpZHRoLHo9dGhpcy5tYXJnaW4oKSt0aGlzLl9hbm5vdGF0aW9uVGllckhlaWdodCgpO3JldHVybiBNYXRoLm1pbih5LXosdil9O3QucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RG93bnNhbXBsZUluZm8oKS5kb21haW59O3QucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHYseSl7cmV0dXJuIG4uQ29tcG9uZW50LnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlci5jYWxsKHRoaXMsdix5KX07dC5wcm90b3R5cGUuZ2V0RG93bnNhbXBsZUluZm89ZnVuY3Rpb24odil7dmFyIHk7dm9pZCAwPT09diYmKHY9dGhpcy5fc2NhbGUpO3ZvaWQgMD09PXkmJih5PXYuaW52ZXJ0UmFuZ2UoKSk7dmFyIHo9TWF0aC5jZWlsKHQuX01JTklNVU1fV0lEVEhfUEVSX0xBQkVMX1BYKigwPT09dGhpcy5fdGlja0xhYmVsQW5nbGU/MToxL01hdGguY29zKHRoaXMuX3RpY2tMYWJlbFNoZWFyQW5nbGUvMTgwKk1hdGguUEkpKS8Kdi5zdGVwV2lkdGgoKSk7cmV0dXJue2RvbWFpbjp5LmZpbHRlcihmdW5jdGlvbih4LEMpe3JldHVybiAwPT09QyV6fSksc3RlcFdpZHRoOnoqdi5zdGVwV2lkdGgoKX19O3QucHJvdG90eXBlLnRpY2tMYWJlbEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpY2tMYWJlbEFuZ2xlO3Rocm93IEVycm9yKCJBbmdsZSB1bmRlZmluZWQgbm90IHN1cHBvcnRlZDsgb25seSAwLCA5MCwgYW5kIC05MCBhcmUgdmFsaWQgdmFsdWVzIik7fTt0LnByb3RvdHlwZS50aWNrTGFiZWxTaGVhckFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpY2tMYWJlbFNoZWFyQW5nbGV9O3QucHJvdG90eXBlLnRpY2tMYWJlbE1heFdpZHRoPWZ1bmN0aW9uKHYpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl90aWNrTGFiZWxNYXhXaWR0aDt0aGlzLl90aWNrTGFiZWxNYXhXaWR0aD12O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLnRpY2tMYWJlbE1heExpbmVzPQpmdW5jdGlvbih2KXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fdGlja0xhYmVsTWF4TGluZXM7dGhpcy5fdGlja0xhYmVsTWF4TGluZXM9djt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt0LnByb3RvdHlwZS5fdGlja1NwYWNlUmVxdWlyZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkrdGhpcy50aWNrTGFiZWxQYWRkaW5nKCl9O3QucHJvdG90eXBlLl9kcmF3VGlja3M9ZnVuY3Rpb24odix5KXt2YXIgej10aGlzO3N3aXRjaCh0aGlzLnRpY2tMYWJlbEFuZ2xlKCkpe2Nhc2UgMDp2YXIgeD17bGVmdDoicmlnaHQiLHJpZ2h0OiJsZWZ0Iix0b3A6ImNlbnRlciIsYm90dG9tOiJjZW50ZXIifTt2YXIgQz17bGVmdDoiY2VudGVyIixyaWdodDoiY2VudGVyIix0b3A6ImJvdHRvbSIsYm90dG9tOiJ0b3AifTticmVhaztjYXNlIDkwOng9e2xlZnQ6ImNlbnRlciIscmlnaHQ6ImNlbnRlciIsdG9wOiJyaWdodCIsYm90dG9tOiJsZWZ0In07CkM9e2xlZnQ6InRvcCIscmlnaHQ6ImJvdHRvbSIsdG9wOiJjZW50ZXIiLGJvdHRvbToiY2VudGVyIn07YnJlYWs7Y2FzZSAtOTA6eD17bGVmdDoiY2VudGVyIixyaWdodDoiY2VudGVyIix0b3A6ImxlZnQiLGJvdHRvbToicmlnaHQifSxDPXtsZWZ0OiJib3R0b20iLHJpZ2h0OiJ0b3AiLHRvcDoiY2VudGVyIixib3R0b206ImNlbnRlciJ9fXkuZWFjaChmdW5jdGlvbihGKXt2YXIgRD1sLnNlbGVjdCh0aGlzKSxCPXouaXNIb3Jpem9udGFsKCk/djp6LndpZHRoKCktei5fdGlja1NwYWNlUmVxdWlyZWQoKSxJPXouaXNIb3Jpem9udGFsKCk/ei5oZWlnaHQoKS16Ll90aWNrU3BhY2VSZXF1aXJlZCgpOnYsTz17eEFsaWduOnhbei5vcmllbnRhdGlvbigpXSx5QWxpZ246Q1t6Lm9yaWVudGF0aW9uKCldLHRleHRSb3RhdGlvbjp6LnRpY2tMYWJlbEFuZ2xlKCksdGV4dFNoZWFyOnoudGlja0xhYmVsU2hlYXJBbmdsZSgpfTtpZihudWxsIT16Ll90aWNrTGFiZWxNYXhXaWR0aCl7aWYoImxlZnQiPT09Cnoub3JpZW50YXRpb24oKSYmQj56Ll90aWNrTGFiZWxNYXhXaWR0aCl7dmFyIFA9Qi16Ll90aWNrTGFiZWxNYXhXaWR0aDtQPUQuYXR0cigidHJhbnNmb3JtIikrIiB0cmFuc2xhdGUoIitQKyIsIDApIjtELmF0dHIoInRyYW5zZm9ybSIsUCl9Qj1NYXRoLm1pbihCLHouX3RpY2tMYWJlbE1heFdpZHRoKX16Ll93cml0ZXIud3JpdGUoei5mb3JtYXR0ZXIoKShGKSxCLEksTyxELm5vZGUoKSl9KX07dC5wcm90b3R5cGUuX21lYXN1cmVUaWNrTGFiZWxzPWZ1bmN0aW9uKHYseSl7dmFyIHo9dGhpcyx4PXRoaXMuX3NjYWxlLmNsb25lV2l0aG91dFByb3ZpZGVycygpLnJhbmdlKFswLHRoaXMuaXNIb3Jpem9udGFsKCk/djp5XSksQz10aGlzLmdldERvd25zYW1wbGVJbmZvKHgpO3g9Qy5kb21haW47Qz1DLnN0ZXBXaWR0aDt2YXIgRj12LXRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCk7dGhpcy5pc0hvcml6b250YWwoKSYmKEY9QywwIT09dGhpcy5fdGlja0xhYmVsQW5nbGUmJihGPXktdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKSksCkY9TWF0aC5tYXgoRiwwKSk7dmFyIEQ9Qzt0aGlzLmlzSG9yaXpvbnRhbCgpJiYoRD15LXRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCksMCE9PXRoaXMuX3RpY2tMYWJlbEFuZ2xlJiYoRD12LXRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCkpLEQ9TWF0aC5tYXgoRCwwKSk7bnVsbCE9dGhpcy5fdGlja0xhYmVsTWF4V2lkdGgmJihGPU1hdGgubWluKEYsdGhpcy5fdGlja0xhYmVsTWF4V2lkdGgpKTt5PXgubWFwKGZ1bmN0aW9uKEIpe3JldHVybiB6Ll93cmFwcGVyLndyYXAoei5mb3JtYXR0ZXIoKShCKSx6Ll9tZWFzdXJlcixGLEQpfSk7dj10aGlzLmlzSG9yaXpvbnRhbCgpJiYwPT09dGhpcy5fdGlja0xhYmVsQW5nbGU/bC5zdW06cC5NYXRoLm1heDt4PXRoaXMuaXNIb3Jpem9udGFsKCkmJjA9PT10aGlzLl90aWNrTGFiZWxBbmdsZT9wLk1hdGgubWF4Omwuc3VtO3Y9dih5LGZ1bmN0aW9uKEIpe3JldHVybiB6Ll9tZWFzdXJlci5tZWFzdXJlKEIud3JhcHBlZFRleHQpLndpZHRofSwwKTsKeT14KHksZnVuY3Rpb24oQil7cmV0dXJuIHouX21lYXN1cmVyLm1lYXN1cmUoQi53cmFwcGVkVGV4dCkuaGVpZ2h0fSwwKTswIT09dGhpcy5fdGlja0xhYmVsQW5nbGUmJih5PVt5LHZdLHY9eVswXSx5PXlbMV0pO3JldHVybnt1c2VkV2lkdGg6dix1c2VkSGVpZ2h0Onl9fTt0LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciB2PXRoaXM7ci5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt2YXIgeT10aGlzLl9zY2FsZSx6PXRoaXMuZ2V0RG93bnNhbXBsZUluZm8oeSkseD16LmRvbWFpbixDPXo9ei5zdGVwV2lkdGg7dGhpcy5pc0hvcml6b250YWwoKSYmbnVsbCE9dGhpcy5fdGlja0xhYmVsTWF4V2lkdGgmJihDPU1hdGgubWluKEMsdGhpcy5fdGlja0xhYmVsTWF4V2lkdGgpKTt4PXRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5kYXRhKHgpO3ZhciBGPXguZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKHEuQXhpcy5USUNLX0xBQkVMX0NMQVNTLAohMCkubWVyZ2UoeCk7eC5leGl0KCkucmVtb3ZlKCk7Ri5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKEQpe3ZhciBCPXkuc2NhbGUoRCktQy8yO0Q9di5pc0hvcml6b250YWwoKT9COjA7Qj12LmlzSG9yaXpvbnRhbCgpPzA6QjtyZXR1cm4idHJhbnNsYXRlKCIrRCsiLCIrQisiKSJ9KTtGLnRleHQoIiIpO3RoaXMuX2RyYXdUaWNrcyh6LEYpO3o9InJpZ2h0Ij09PXRoaXMub3JpZW50YXRpb24oKT90aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpOjA7eD0iYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT90aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpOjA7dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK3orIiwiK3grIikiKTt0aGlzLl9zaG93QWxsVGlja01hcmtzKCk7dGhpcy5fc2hvd0FsbFRpY2tMYWJlbHMoKTt0aGlzLl9oaWRlVGlja01hcmtzV2l0aG91dExhYmVsKCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9CmZ1bmN0aW9uKHYseSx6KXtyLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyx2LHkseik7dGhpcy5pc0hvcml6b250YWwoKXx8dGhpcy5fc2NhbGUucmFuZ2UoWzAsdGhpcy5oZWlnaHQoKV0pO3JldHVybiB0aGlzfTt0LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtyLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gdH0ocS5BeGlzKTtjLl9NSU5JTVVNX1dJRFRIX1BFUl9MQUJFTF9QWD0xNTtkLkNhdGVnb3J5PWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocix0KXtmdW5jdGlvbiB2KCl7dGhpcy5jb25zdHJ1Y3Rvcj1yfWZvcih2YXIgeSBpbiB0KXQuaGFzT3duUHJvcGVydHkoeSkmJihyW3ldPXRbeV0pO3IucHJvdG90eXBlPW51bGw9PT10P09iamVjdC5jcmVhdGUodCk6KHYucHJvdG90eXBlPXQucHJvdG90eXBlLG5ldyB2KX0sCmw9ZigxKSxrPWYoNSksbj1mKDgpLHA9ZigwKSxxPWYoMjIpO2M9ZnVuY3Rpb24ocil7ZnVuY3Rpb24gdCh2LHkpe3Y9ci5jYWxsKHRoaXMsdix5KXx8dGhpczt2Ll90aWNrTGFiZWxQb3NpdGlvbmluZz0iY2VudGVyIjt2Ll91c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbj0hMTt2LmZvcm1hdHRlcihuLmdlbmVyYWwoKSk7cmV0dXJuIHZ9Zyh0LHIpO3QucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3IucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3ZhciB2PW5ldyBrLlN2Z0NvbnRleHQodGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLm5vZGUoKSxxLkF4aXMuVElDS19MQUJFTF9DTEFTUyk7dGhpcy5fbWVhc3VyZXI9bmV3IGsuQ2FjaGVNZWFzdXJlcih2KTt0aGlzLl93cmFwcGVyPShuZXcgay5XcmFwcGVyKS5tYXhMaW5lcygxKX07dC5wcm90b3R5cGUuX2NvbXB1dGVXaWR0aD1mdW5jdGlvbigpe3ZhciB2PXRoaXMuX3VzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uP3RoaXMuX2NvbXB1dGVBcHByb3hpbWF0ZVRleHRXaWR0aCgpOgp0aGlzLl9jb21wdXRlRXhhY3RUZXh0V2lkdGgoKTtyZXR1cm4iY2VudGVyIj09PXRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nP3RoaXMuX21heExhYmVsVGlja0xlbmd0aCgpK3RoaXMudGlja0xhYmVsUGFkZGluZygpK3Y6TWF0aC5tYXgodGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCksdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkrdil9O3QucHJvdG90eXBlLl9jb21wdXRlRXhhY3RUZXh0V2lkdGg9ZnVuY3Rpb24oKXt2YXIgdj10aGlzLHk9dGhpcy5fZ2V0VGlja1ZhbHVlcygpLm1hcChmdW5jdGlvbih6KXt6PXYuZm9ybWF0dGVyKCkoeik7cmV0dXJuIHYuX21lYXN1cmVyLm1lYXN1cmUoeikud2lkdGh9KTtyZXR1cm4gcC5NYXRoLm1heCh5LDApfTt0LnByb3RvdHlwZS5fY29tcHV0ZUFwcHJveGltYXRlVGV4dFdpZHRoPWZ1bmN0aW9uKCl7dmFyIHY9dGhpcyx5PXRoaXMuX2dldFRpY2tWYWx1ZXMoKSx6PXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoIk0iKS53aWR0aDt5PXkubWFwKGZ1bmN0aW9uKHgpe3JldHVybiB2LmZvcm1hdHRlcigpKHgpLmxlbmd0aCoKen0pO3JldHVybiBwLk1hdGgubWF4KHksMCl9O3QucHJvdG90eXBlLl9jb21wdXRlSGVpZ2h0PWZ1bmN0aW9uKCl7dmFyIHY9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodDtyZXR1cm4iY2VudGVyIj09PXRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nP3RoaXMuX21heExhYmVsVGlja0xlbmd0aCgpK3RoaXMudGlja0xhYmVsUGFkZGluZygpK3Y6TWF0aC5tYXgodGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCksdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkrdil9O3QucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzPWZ1bmN0aW9uKCl7dmFyIHY9dGhpcy5fc2NhbGUseT12LmRvbWFpbigpLHo9eVswXTw9eVsxXT95WzBdOnlbMV0seD15WzBdPj15WzFdP3lbMF06eVsxXTtyZXR1cm4gdi50aWNrcygpLmZpbHRlcihmdW5jdGlvbihDKXtyZXR1cm4gQz49eiYmQzw9eH0pfTt0LnByb3RvdHlwZS5fcmVzY2FsZT1mdW5jdGlvbigpe2lmKHRoaXMuX2lzU2V0dXApe2lmKCF0aGlzLmlzSG9yaXpvbnRhbCgpKXt2YXIgdj0KdGhpcy5fY29tcHV0ZVdpZHRoKCk7aWYodj50aGlzLndpZHRoKCl8fHY8dGhpcy53aWR0aCgpLXRoaXMubWFyZ2luKCkpe3RoaXMucmVkcmF3KCk7cmV0dXJufX10aGlzLnJlbmRlcigpfX07dC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt2YXIgdj10aGlzO3IucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dmFyIHk9e3g6MCx5OjAsZHg6IjBlbSIsZHk6IjAuM2VtIn0sej10aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSx4PXRoaXMudGlja0xhYmVsUGFkZGluZygpLEM9Im1pZGRsZSIsRj0wLEQ9MCxCPTAsST0wO2lmKHRoaXMuaXNIb3Jpem9udGFsKCkpc3dpdGNoKHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nKXtjYXNlICJsZWZ0IjpDPSJlbmQiO0Y9LXg7ST14O2JyZWFrO2Nhc2UgImNlbnRlciI6ST16K3g7YnJlYWs7Y2FzZSAicmlnaHQiOkM9InN0YXJ0IixJPUY9eH1lbHNlIHN3aXRjaCh0aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZyl7Y2FzZSAidG9wIjp5LmR5PQoiLTAuM2VtIjtCPXg7RD0teDticmVhaztjYXNlICJjZW50ZXIiOkI9eit4O2JyZWFrO2Nhc2UgImJvdHRvbSI6eS5keT0iMWVtIixEPUI9eH16PXRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCgpO3N3aXRjaCh0aGlzLm9yaWVudGF0aW9uKCkpe2Nhc2UgImJvdHRvbSI6eS54PXoueDE7eS5keT0iMC45NWVtIjtEPXoueTErSTticmVhaztjYXNlICJ0b3AiOnkueD16LngxO3kuZHk9Ii0uMjVlbSI7RD16LnkxLUk7YnJlYWs7Y2FzZSAibGVmdCI6Qz0iZW5kIjtGPXoueDEtQjt5Lnk9ei55MTticmVhaztjYXNlICJyaWdodCI6Qz0ic3RhcnQiLEY9ei54MStCLHkueT16LnkxfUI9dGhpcy5fZ2V0VGlja1ZhbHVlcygpO0I9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmRhdGEoQik7Qi5leGl0KCkucmVtb3ZlKCk7Qi5lbnRlcigpLmFwcGVuZCgidGV4dCIpLmNsYXNzZWQocS5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MsCiEwKS5tZXJnZShCKS5zdHlsZSgidGV4dC1hbmNob3IiLEMpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaW5oZXJpdCIpLmF0dHJzKHkpLnRleHQoZnVuY3Rpb24oTyl7cmV0dXJuIHYuZm9ybWF0dGVyKCkoTyl9KTt0aGlzLl90aWNrTGFiZWxDb250YWluZXIuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrRisiLCAiK0QrIikiKTt0aGlzLl9zaG93QWxsVGlja01hcmtzKCk7dGhpcy5zaG93RW5kVGlja0xhYmVscygpfHx0aGlzLl9oaWRlRW5kVGlja0xhYmVscygpO3RoaXMuX2hpZGVPdmVyZmxvd2luZ1RpY2tMYWJlbHMoKTt0aGlzLl9oaWRlT3ZlcmxhcHBpbmdUaWNrTGFiZWxzKCk7ImNlbnRlciIhPT10aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZyYmdGhpcy5faGlkZVRpY2tNYXJrc1dpdGhvdXRMYWJlbCgpO3JldHVybiB0aGlzfTt0LnByb3RvdHlwZS50aWNrTGFiZWxQb3NpdGlvbj1mdW5jdGlvbih2KXtpZihudWxsPT12KXJldHVybiB0aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZzsKdj12LnRvTG93ZXJDYXNlKCk7aWYodGhpcy5pc0hvcml6b250YWwoKSl7aWYoImxlZnQiIT09diYmImNlbnRlciIhPT12JiYicmlnaHQiIT09dil0aHJvdyBFcnJvcih2KyIgaXMgbm90IGEgdmFsaWQgdGljayBsYWJlbCBwb3NpdGlvbiBmb3IgYSBob3Jpem9udGFsIE51bWVyaWNBeGlzIik7fWVsc2UgaWYoInRvcCIhPT12JiYiY2VudGVyIiE9PXYmJiJib3R0b20iIT09dil0aHJvdyBFcnJvcih2KyIgaXMgbm90IGEgdmFsaWQgdGljayBsYWJlbCBwb3NpdGlvbiBmb3IgYSB2ZXJ0aWNhbCBOdW1lcmljQXhpcyIpO3RoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nPXY7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307dC5wcm90b3R5cGUudXNlc1RleHRXaWR0aEFwcHJveGltYXRpb249ZnVuY3Rpb24oKXt0aGlzLl91c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbj0hMH07dC5wcm90b3R5cGUuX2hpZGVFbmRUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dmFyIHY9dGhpcy5lbGVtZW50KCkubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAp5PXRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuQXhpcy5USUNLX0xBQkVMX0NMQVNTKTtpZigwIT09eS5zaXplKCkpe3ZhciB6PXkubm9kZXMoKVswXTtwLkRPTS5jbGllbnRSZWN0SW5zaWRlKHouZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdil8fGwuc2VsZWN0KHopLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIik7eT15Lm5vZGVzKClbeS5zaXplKCktMV07cC5ET00uY2xpZW50UmVjdEluc2lkZSh5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHYpfHxsLnNlbGVjdCh5KS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpfX07dC5wcm90b3R5cGUuX2hpZGVPdmVybGFwcGluZ1RpY2tMYWJlbHM9ZnVuY3Rpb24oKXtmb3IodmFyIHY9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmZpbHRlcihmdW5jdGlvbigpe3ZhciB4PWwuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5Iik7cmV0dXJuImluaGVyaXQiPT09Cnh8fCJ2aXNpYmxlIj09PXh9KSx5PXYubm9kZXMoKS5tYXAoZnVuY3Rpb24oeCl7cmV0dXJuIHguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9KSx6PTE7IXRoaXMuX2hhc092ZXJsYXBXaXRoSW50ZXJ2YWwoeix5KSYmejx5Lmxlbmd0aDspeis9MTt2LmVhY2goZnVuY3Rpb24oeCxDKXt4PWwuc2VsZWN0KHRoaXMpOzAhPT1DJXomJnguc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX0pfTt0LnByb3RvdHlwZS5faGFzT3ZlcmxhcFdpdGhJbnRlcnZhbD1mdW5jdGlvbih2LHkpe3ZhciB6PSJjZW50ZXIiPT09dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc/dGhpcy50aWNrTGFiZWxQYWRkaW5nKCk6Myp0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTt5PXkubWFwKGZ1bmN0aW9uKEMpe3JldHVybiBwLkRPTS5leHBhbmRSZWN0KEMseil9KTtmb3IodmFyIHg9MDt4PHkubGVuZ3RoLXY7eCs9dilpZihwLkRPTS5jbGllbnRSZWN0c092ZXJsYXAoeVt4XSx5W3grdl0pKXJldHVybiExO3JldHVybiEwfTsKdC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7ci5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyk7dGhpcy5fbWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHR9KHEuQXhpcyk7ZC5OdW1lcmljPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixwKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgciBpbiBwKXAuaGFzT3duUHJvcGVydHkocikmJihuW3JdPXBbcl0pO24ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX07Yz1mKDQyKTt2YXIgbD1mKDI1KSxrPWYoMCk7Zj1mdW5jdGlvbihuKXtmdW5jdGlvbiBwKHEpe2Z1bmN0aW9uIHIoKXt4JiYoeD0hMSx6Ll9kcmFnRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoeikpfWZ1bmN0aW9uIHQoQyxGKXt4JiYoei5fc2V0UGl4ZWxQb3NpdGlvbldpdGhvdXRDaGFuZ2luZ01vZGUoei5faXNWZXJ0aWNhbCgpPwpGLng6Ri55KSx6Ll9kcmFnQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoeikpfWZ1bmN0aW9uIHYoQyl7eShDKSYmKHg9ITAsei5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoeikpfWZ1bmN0aW9uIHkoQyl7cmV0dXJuIHouX2lzVmVydGljYWwoKSYmei5waXhlbFBvc2l0aW9uKCktei5kZXRlY3Rpb25SYWRpdXMoKTw9Qy54JiZDLng8PXoucGl4ZWxQb3NpdGlvbigpK3ouZGV0ZWN0aW9uUmFkaXVzKCl8fCF6Ll9pc1ZlcnRpY2FsKCkmJnoucGl4ZWxQb3NpdGlvbigpLXouZGV0ZWN0aW9uUmFkaXVzKCk8PUMueSYmQy55PD16LnBpeGVsUG9zaXRpb24oKSt6LmRldGVjdGlvblJhZGl1cygpfXZhciB6PW4uY2FsbCh0aGlzLHEpfHx0aGlzO3ouX2RldGVjdGlvblJhZGl1cz0zO3ouX2VuYWJsZWQ9ITA7ei5hZGRDbGFzcygiZHJhZy1saW5lLWxheWVyIik7ei5hZGRDbGFzcygiZW5hYmxlZCIpO3ouX2RyYWdJbnRlcmFjdGlvbj1uZXcgbC5EcmFnO3ouX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyh6KTsKdmFyIHg9ITE7ei5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ1N0YXJ0KHYpO3ouX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWcodCk7ei5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZChyKTt6Ll9kaXNjb25uZWN0SW50ZXJhY3Rpb249ZnVuY3Rpb24oKXt6Ll9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZ1N0YXJ0KHYpO3ouX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnKHQpO3ouX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnRW5kKHIpO3ouX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKX07ei5fZHJhZ1N0YXJ0Q2FsbGJhY2tzPW5ldyBrLkNhbGxiYWNrU2V0O3ouX2RyYWdDYWxsYmFja3M9bmV3IGsuQ2FsbGJhY2tTZXQ7ei5fZHJhZ0VuZENhbGxiYWNrcz1uZXcgay5DYWxsYmFja1NldDtyZXR1cm4gen1nKHAsbik7cC5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fZGV0ZWN0aW9uRWRnZT10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImxpbmUiKS5zdHlsZXMoe29wYWNpdHk6MCwKc3Ryb2tlOiJwaW5rIiwicG9pbnRlci1ldmVudHMiOiJ2aXNpYmxlU3Ryb2tlIn0pLmNsYXNzZWQoImRyYWctZWRnZSIsITApfTtwLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe24ucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dGhpcy5fZGV0ZWN0aW9uRWRnZS5hdHRycyh7eDE6dGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMucGl4ZWxQb3NpdGlvbigpOjAseTE6dGhpcy5faXNWZXJ0aWNhbCgpPzA6dGhpcy5waXhlbFBvc2l0aW9uKCkseDI6dGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMucGl4ZWxQb3NpdGlvbigpOnRoaXMud2lkdGgoKSx5Mjp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLnBpeGVsUG9zaXRpb24oKSwic3Ryb2tlLXdpZHRoIjoyKnRoaXMuX2RldGVjdGlvblJhZGl1c30pO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5kZXRlY3Rpb25SYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfTsKcC5wcm90b3R5cGUuZW5hYmxlZD1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl9lbmFibGVkOyh0aGlzLl9lbmFibGVkPXEpP3RoaXMuYWRkQ2xhc3MoImVuYWJsZWQiKTp0aGlzLnJlbW92ZUNsYXNzKCJlbmFibGVkIik7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmVuYWJsZWQocSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLm9uRHJhZ1N0YXJ0PWZ1bmN0aW9uKHEpe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5hZGQocSl9O3AucHJvdG90eXBlLm9mZkRyYWdTdGFydD1mdW5jdGlvbihxKXt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZGVsZXRlKHEpfTtwLnByb3RvdHlwZS5vbkRyYWc9ZnVuY3Rpb24ocSl7dGhpcy5fZHJhZ0NhbGxiYWNrcy5hZGQocSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLm9mZkRyYWc9ZnVuY3Rpb24ocSl7dGhpcy5fZHJhZ0NhbGxiYWNrcy5kZWxldGUocSl9O3AucHJvdG90eXBlLm9uRHJhZ0VuZD1mdW5jdGlvbihxKXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmFkZChxKX07CnAucHJvdG90eXBlLm9mZkRyYWdFbmQ9ZnVuY3Rpb24ocSl7dGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUocSl9O3AucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgcT10aGlzO24ucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihyKXtyZXR1cm4gcS5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmRlbGV0ZShyKX0pO3RoaXMuX2RyYWdDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihyKXtyZXR1cm4gcS5fZHJhZ0NhbGxiYWNrcy5kZWxldGUocil9KTt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24ocil7cmV0dXJuIHEuX2RyYWdFbmRDYWxsYmFja3MuZGVsZXRlKHIpfSk7dGhpcy5fZGlzY29ubmVjdEludGVyYWN0aW9uKCl9O3JldHVybiBwfShjLkd1aWRlTGluZUxheWVyKTtkLkRyYWdMaW5lTGF5ZXI9Zn0sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcoayxuLHApe3ZhciBxPQp7fTtpZih2b2lkIDAhPT1wKWZvcih2YXIgcj0wO3I8cC5sZW5ndGg7cisrKXFbcFtyXV09cFtyLTFdO3JldHVybiBmdW5jdGlvbih0KXt2YXIgdj1rLnNjYWxlKHQpO2lmKCFuKXJldHVybiB2O3ZhciB5O3Q9dm9pZCAwPT09cVt0XT92b2lkIDA6ay5zY2FsZShxW3RdKTt2b2lkIDAhPT10JiYoeT10Kyh2LXQpLzIpO3JldHVybiB5fX12YXIgbD10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oayxuKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWZvcih2YXIgcSBpbiBuKW4uaGFzT3duUHJvcGVydHkocSkmJihrW3FdPW5bcV0pO2sucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHAucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyBwKX07Yz1mdW5jdGlvbihrKXtmdW5jdGlvbiBuKHAscSl7dmFyIHI9ay5jYWxsKHRoaXMpfHx0aGlzO3IuYWRkQ2xhc3MoImdyaWRsaW5lcyIpO3IuX3hTY2FsZT1wO3IuX3lTY2FsZT1xO3IuX3JlbmRlckNhbGxiYWNrPQpmdW5jdGlvbigpe3JldHVybiByLnJlbmRlcigpfTtpZihyLl94U2NhbGUpci5feFNjYWxlLm9uVXBkYXRlKHIuX3JlbmRlckNhbGxiYWNrKTtpZihyLl95U2NhbGUpci5feVNjYWxlLm9uVXBkYXRlKHIuX3JlbmRlckNhbGxiYWNrKTtyZXR1cm4gcn1sKG4sayk7bi5wcm90b3R5cGUuYmV0d2Vlblg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmV0d2Vlblh9O24ucHJvdG90eXBlLmJldHdlZW5ZPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JldHdlZW5ZfTtuLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7ay5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX3hTY2FsZSYmdGhpcy5feFNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZW5kZXJDYWxsYmFjayk7dGhpcy5feVNjYWxlJiZ0aGlzLl95U2NhbGUub2ZmVXBkYXRlKHRoaXMuX3JlbmRlckNhbGxiYWNrKTtyZXR1cm4gdGhpc307bi5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7ay5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7CnRoaXMuX3hMaW5lc0NvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJ4LWdyaWRsaW5lcyIsITApO3RoaXMuX3lMaW5lc0NvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJ5LWdyaWRsaW5lcyIsITApfTtuLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe2sucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dGhpcy5fcmVkcmF3WExpbmVzKCk7dGhpcy5fcmVkcmF3WUxpbmVzKCk7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24ocCxxLHIpe2sucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLHAscSxyKTtudWxsIT10aGlzLl94U2NhbGUmJnRoaXMuX3hTY2FsZS5yYW5nZShbMCx0aGlzLndpZHRoKCldKTtudWxsIT10aGlzLl95U2NhbGUmJnRoaXMuX3lTY2FsZS5yYW5nZShbdGhpcy5oZWlnaHQoKSwwXSk7cmV0dXJuIHRoaXN9OwpuLnByb3RvdHlwZS5fcmVkcmF3WExpbmVzPWZ1bmN0aW9uKCl7aWYodGhpcy5feFNjYWxlKXt2YXIgcD10aGlzLmJldHdlZW5YKCkscT10aGlzLl94U2NhbGUudGlja3MoKS5zbGljZShwPzE6MCk7cT10aGlzLl94TGluZXNDb250YWluZXIuc2VsZWN0QWxsKCJsaW5lIikuZGF0YShxKTtxLmVudGVyKCkuYXBwZW5kKCJsaW5lIikubWVyZ2UocSkuYXR0cigieDEiLGcodGhpcy5feFNjYWxlLHAsdGhpcy5feFNjYWxlLnRpY2tzKCkpKS5hdHRyKCJ5MSIsMCkuYXR0cigieDIiLGcodGhpcy5feFNjYWxlLHAsdGhpcy5feFNjYWxlLnRpY2tzKCkpKS5hdHRyKCJ5MiIsdGhpcy5oZWlnaHQoKSkuY2xhc3NlZCgiYmV0d2VlbmxpbmUiLHApLmNsYXNzZWQoInplcm9saW5lIixmdW5jdGlvbihyKXtyZXR1cm4gMD09PXJ9KTtxLmV4aXQoKS5yZW1vdmUoKX19O24ucHJvdG90eXBlLl9yZWRyYXdZTGluZXM9ZnVuY3Rpb24oKXtpZih0aGlzLl95U2NhbGUpe3ZhciBwPXRoaXMuYmV0d2VlblkoKSwKcT10aGlzLl95U2NhbGUudGlja3MoKS5zbGljZShwPzE6MCk7cT10aGlzLl95TGluZXNDb250YWluZXIuc2VsZWN0QWxsKCJsaW5lIikuZGF0YShxKTtxLmVudGVyKCkuYXBwZW5kKCJsaW5lIikubWVyZ2UocSkuYXR0cigieDEiLDApLmF0dHIoInkxIixnKHRoaXMuX3lTY2FsZSxwLHRoaXMuX3lTY2FsZS50aWNrcygpKSkuYXR0cigieDIiLHRoaXMud2lkdGgoKSkuYXR0cigieTIiLGcodGhpcy5feVNjYWxlLHAsdGhpcy5feVNjYWxlLnRpY2tzKCkpKS5jbGFzc2VkKCJiZXR3ZWVubGluZSIscCkuY2xhc3NlZCgiemVyb2xpbmUiLGZ1bmN0aW9uKHIpe3JldHVybiAwPT09cn0pO3EuZXhpdCgpLnJlbW92ZSgpfX07cmV0dXJuIG59KGYoNCkuQ29tcG9uZW50KTtkLkdyaWRsaW5lcz1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHEscil7ZnVuY3Rpb24gdCgpe3RoaXMuY29uc3RydWN0b3I9cX1mb3IodmFyIHYgaW4gcilyLmhhc093blByb3BlcnR5KHYpJiYKKHFbdl09clt2XSk7cS5wcm90b3R5cGU9bnVsbD09PXI/T2JqZWN0LmNyZWF0ZShyKToodC5wcm90b3R5cGU9ci5wcm90b3R5cGUsbmV3IHQpfSxsPWYoNSksaz1mKDIzKSxuPWYoOCkscD1mKDApO2M9ZnVuY3Rpb24ocSl7ZnVuY3Rpb24gcih0KXt2YXIgdj1xLmNhbGwodGhpcyl8fHRoaXM7di5fdGV4dFBhZGRpbmc9NTtpZihudWxsPT10KXRocm93IEVycm9yKCJJbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZCByZXF1aXJlcyBhIGludGVycG9sYXRlZENvbG9yU2NhbGUiKTt2Ll9zY2FsZT10O3YuX3JlZHJhd0NhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHYucmVkcmF3KCl9O3YuX3NjYWxlLm9uVXBkYXRlKHYuX3JlZHJhd0NhbGxiYWNrKTt2Ll9mb3JtYXR0ZXI9bi5nZW5lcmFsKCk7di5fb3JpZW50YXRpb249Imhvcml6b250YWwiO3YuX2V4cGFuZHM9ITE7di5hZGRDbGFzcygibGVnZW5kIik7di5hZGRDbGFzcygiaW50ZXJwb2xhdGVkLWNvbG9yLWxlZ2VuZCIpO3JldHVybiB2fWcociwKcSk7ci5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3EucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9zY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spfTtyLnByb3RvdHlwZS5mb3JtYXR0ZXI9ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dClyZXR1cm4gdGhpcy5fZm9ybWF0dGVyO3RoaXMuX2Zvcm1hdHRlcj10O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLmV4cGFuZHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXhwYW5kc307ci5fZW5zdXJlT3JpZW50YXRpb249ZnVuY3Rpb24odCl7dD10LnRvTG93ZXJDYXNlKCk7aWYoImhvcml6b250YWwiPT09dHx8ImxlZnQiPT09dHx8InJpZ2h0Ij09PXQpcmV0dXJuIHQ7dGhyb3cgRXJyb3IoJyInK3QrJyIgaXMgbm90IGEgdmFsaWQgb3JpZW50YXRpb24gZm9yIEludGVycG9sYXRlZENvbG9yTGVnZW5kJyk7fTtyLnByb3RvdHlwZS5vcmllbnRhdGlvbj1mdW5jdGlvbih0KXtpZihudWxsPT0KdClyZXR1cm4gdGhpcy5fb3JpZW50YXRpb247dGhpcy5fb3JpZW50YXRpb249ci5fZW5zdXJlT3JpZW50YXRpb24odCk7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiF0aGlzLmV4cGFuZHMoKXx8dGhpcy5faXNWZXJ0aWNhbCgpfTtyLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiF0aGlzLmV4cGFuZHMoKXx8IXRoaXMuX2lzVmVydGljYWwoKX07ci5wcm90b3R5cGUuX2dlbmVyYXRlVGlja3M9ZnVuY3Rpb24odCl7dm9pZCAwPT09dCYmKHQ9ci5fREVGQVVMVF9OVU1fU1dBVENIRVMpO3ZhciB2PXRoaXMuX3NjYWxlLmRvbWFpbigpO2lmKDE9PT10KXJldHVyblt2WzBdXTtmb3IodmFyIHk9KHZbMV0tdlswXSkvKHQtMSksej1bXSx4PTA7eDx0O3grKyl6LnB1c2godlswXSt5KngpO3JldHVybiB6fTtyLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtxLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTsKdGhpcy5fc3dhdGNoQ29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoInN3YXRjaC1jb250YWluZXIiLCEwKTt0aGlzLl9zd2F0Y2hCb3VuZGluZ0JveD10aGlzLmNvbnRlbnQoKS5hcHBlbmQoInJlY3QiKS5jbGFzc2VkKCJzd2F0Y2gtYm91bmRpbmctYm94IiwhMCk7dGhpcy5fbG93ZXJMYWJlbD10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKHIuTEVHRU5EX0xBQkVMX0NMQVNTLCEwKTt0aGlzLl91cHBlckxhYmVsPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoci5MRUdFTkRfTEFCRUxfQ0xBU1MsITApO3ZhciB0PW5ldyBsLlN2Z0NvbnRleHQodGhpcy5jb250ZW50KCkubm9kZSgpKTt0aGlzLl9tZWFzdXJlcj1uZXcgbC5NZWFzdXJlcih0KTt0aGlzLl93cmFwcGVyPW5ldyBsLldyYXBwZXI7dGhpcy5fd3JpdGVyPW5ldyBsLldyaXRlcih0aGlzLl9tZWFzdXJlcix0LHRoaXMuX3dyYXBwZXIpfTtyLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT0KZnVuY3Rpb24oKXt2YXIgdD10aGlzLHY9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCx5PXRoaXMuX3NjYWxlLmRvbWFpbigpLm1hcChmdW5jdGlvbihDKXtyZXR1cm4gdC5fbWVhc3VyZXIubWVhc3VyZSh0Ll9mb3JtYXR0ZXIoQykpLndpZHRofSksej1yLl9ERUZBVUxUX05VTV9TV0FUQ0hFUztpZih0aGlzLl9pc1ZlcnRpY2FsKCkpe3ZhciB4PXAuTWF0aC5tYXgoeSwwKTt5PXYrdit0aGlzLl90ZXh0UGFkZGluZyt4K3RoaXMuX3RleHRQYWRkaW5nO3g9eip2fWVsc2UgeD12K3Yrdix5PXRoaXMuX3RleHRQYWRkaW5nK3lbMF0reip2K3lbMV0rdGhpcy5fdGV4dFBhZGRpbmc7cmV0dXJue21pbldpZHRoOnksbWluSGVpZ2h0Onh9fTtyLnByb3RvdHlwZS5faXNWZXJ0aWNhbD1mdW5jdGlvbigpe3JldHVybiJob3Jpem9udGFsIiE9PXRoaXMuX29yaWVudGF0aW9ufTtyLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTsKdmFyIHY9dGhpcy5fc2NhbGUuZG9tYWluKCkseT10aGlzLl9mb3JtYXR0ZXIodlswXSksej10aGlzLl9tZWFzdXJlci5tZWFzdXJlKHkpLndpZHRoLHg9dGhpcy5fZm9ybWF0dGVyKHZbMV0pO3Y9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSh4KS53aWR0aDt2YXIgQz10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0LEY9dGhpcy5fdGV4dFBhZGRpbmcsRD0wLEI9MCxJPTAsTz0wLFA9e3hBbGlnbjoiY2VudGVyIix5QWxpZ246ImNlbnRlciIsdGV4dFJvdGF0aW9uOjB9LEg9e3hBbGlnbjoiY2VudGVyIix5QWxpZ246ImNlbnRlciIsdGV4dFJvdGF0aW9uOjB9LEs9e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH07aWYodGhpcy5faXNWZXJ0aWNhbCgpKXt2YXIgTT1NYXRoLmZsb29yKHRoaXMuaGVpZ2h0KCkpO3ZhciBMPU1hdGgubWF4KHosdik7dmFyIFI9KHRoaXMud2lkdGgoKS1MLTIqdGhpcy5fdGV4dFBhZGRpbmcpLzI7dj1NYXRoLm1heCh0aGlzLndpZHRoKCktUi0yKkYtTCwwKTsKQz0xO3ZhciBVPWZ1bmN0aW9uKGJhLG1hKXtyZXR1cm4gdC5oZWlnaHQoKS0obWErMSl9O0gueUFsaWduPSJ0b3AiO0I9MDtQLnlBbGlnbj0iYm90dG9tIjtPPTA7aWYoImxlZnQiPT09dGhpcy5fb3JpZW50YXRpb24pe3ZhciBZPWZ1bmN0aW9uKCl7cmV0dXJuIEYrTCtGfTtILnhBbGlnbj0icmlnaHQiO0Q9LShSK3YrRik7UC54QWxpZ249InJpZ2h0IjtJPS0oUit2K0YpfWVsc2UgWT1mdW5jdGlvbigpe3JldHVybiBSfSxILnhBbGlnbj0ibGVmdCIsRD1SK3YrRixQLnhBbGlnbj0ibGVmdCIsST1SK3YrRjtLLndpZHRoPXY7Sy5oZWlnaHQ9TSpDfWVsc2UgUj1NYXRoLm1heChGLCh0aGlzLmhlaWdodCgpLUMpLzIpLE09TWF0aC5tYXgoTWF0aC5mbG9vcih0aGlzLndpZHRoKCktNCpGLXotdiksMCksdj0xLEM9TWF0aC5tYXgodGhpcy5oZWlnaHQoKS0yKlIsMCksWT1mdW5jdGlvbihiYSxtYSl7cmV0dXJuIE1hdGguZmxvb3IoeisyKkYpK21hfSxVPWZ1bmN0aW9uKCl7cmV0dXJuIFJ9LApILnhBbGlnbj0icmlnaHQiLEQ9LUYsUC54QWxpZ249ImxlZnQiLEk9RixLLnk9UixLLndpZHRoPU0qdixLLmhlaWdodD1DO0sueD1ZKG51bGwsMCk7dGhpcy5fdXBwZXJMYWJlbC50ZXh0KCIiKTt0aGlzLl93cml0ZXIud3JpdGUoeCx0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSxILHRoaXMuX3VwcGVyTGFiZWwubm9kZSgpKTt0aGlzLl91cHBlckxhYmVsLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0QrIiwgIitCKyIpIik7dGhpcy5fbG93ZXJMYWJlbC50ZXh0KCIiKTt0aGlzLl93cml0ZXIud3JpdGUoeSx0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSxQLHRoaXMuX2xvd2VyTGFiZWwubm9kZSgpKTt0aGlzLl9sb3dlckxhYmVsLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0krIiwgIitPKyIpIik7dGhpcy5fc3dhdGNoQm91bmRpbmdCb3guYXR0cnMoSyk7eT10aGlzLl9nZW5lcmF0ZVRpY2tzKE0pO3k9dGhpcy5fc3dhdGNoQ29udGFpbmVyLnNlbGVjdEFsbCgicmVjdC5zd2F0Y2giKS5kYXRhKHkpOwp4PXkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5jbGFzc2VkKCJzd2F0Y2giLCEwKTtEPXkubWVyZ2UoeCk7eS5leGl0KCkucmVtb3ZlKCk7RC5hdHRycyh7ZmlsbDpmdW5jdGlvbihiYSl7cmV0dXJuIHQuX3NjYWxlLnNjYWxlKGJhKX0sd2lkdGg6dixoZWlnaHQ6Qyx4OlkseTpVLCJzaGFwZS1yZW5kZXJpbmciOiJjcmlzcEVkZ2VzIn0pO2suQUREX1RJVExFX0VMRU1FTlRTJiZ4LmFwcGVuZCgidGl0bGUiKS50ZXh0KGZ1bmN0aW9uKGJhKXtyZXR1cm4gdC5fZm9ybWF0dGVyKGJhKX0pO3JldHVybiB0aGlzfTtyZXR1cm4gcn0oZig0KS5Db21wb25lbnQpO2MuX0RFRkFVTFRfTlVNX1NXQVRDSEVTPTExO2MuTEVHRU5EX0xBQkVMX0NMQVNTPSJsZWdlbmQtbGFiZWwiO2QuSW50ZXJwb2xhdGVkQ29sb3JMZWdlbmQ9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihrLG4pe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPWt9Zm9yKHZhciBxIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShxKSYmCihrW3FdPW5bcV0pO2sucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHAucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyBwKX0sbD1mKDUpO2M9ZnVuY3Rpb24oayl7ZnVuY3Rpb24gbihwLHEpe3ZvaWQgMD09PXAmJihwPSIiKTt2b2lkIDA9PT1xJiYocT0wKTt2YXIgcj1rLmNhbGwodGhpcyl8fHRoaXM7ci5hZGRDbGFzcygibGFiZWwiKTtyLnRleHQocCk7ci5hbmdsZShxKTtyLnhBbGlnbm1lbnQoImNlbnRlciIpLnlBbGlnbm1lbnQoImNlbnRlciIpO3IuX3BhZGRpbmc9MDtyZXR1cm4gcn1nKG4sayk7bi5wcm90b3R5cGUucmVxdWVzdGVkU3BhY2U9ZnVuY3Rpb24oKXt2YXIgcD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKHRoaXMuX3RleHQpLHE9KDA9PT10aGlzLmFuZ2xlKCk/cC53aWR0aDpwLmhlaWdodCkrMip0aGlzLnBhZGRpbmcoKTtwPSgwPT09dGhpcy5hbmdsZSgpP3AuaGVpZ2h0OnAud2lkdGgpKzIqdGhpcy5wYWRkaW5nKCk7cmV0dXJue21pbldpZHRoOnEsCm1pbkhlaWdodDpwfX07bi5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7ay5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fdGV4dENvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKTt2YXIgcD1uZXcgbC5TdmdDb250ZXh0KHRoaXMuX3RleHRDb250YWluZXIubm9kZSgpKTt0aGlzLl9tZWFzdXJlcj1uZXcgbC5DYWNoZU1lYXN1cmVyKHApO3RoaXMuX3dyYXBwZXI9bmV3IGwuV3JhcHBlcjt0aGlzLl93cml0ZXI9bmV3IGwuV3JpdGVyKHRoaXMuX21lYXN1cmVyLHAsdGhpcy5fd3JhcHBlcik7dGhpcy50ZXh0KHRoaXMuX3RleHQpfTtuLnByb3RvdHlwZS50ZXh0PWZ1bmN0aW9uKHApe2lmKG51bGw9PXApcmV0dXJuIHRoaXMuX3RleHQ7aWYoInN0cmluZyIhPT10eXBlb2YgcCl0aHJvdyBFcnJvcigiTGFiZWwudGV4dCgpIG9ubHkgdGFrZXMgc3RyaW5ncyBhcyBpbnB1dCIpO3RoaXMuX3RleHQ9cDt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtuLnByb3RvdHlwZS5hbmdsZT0KZnVuY3Rpb24ocCl7aWYobnVsbD09cClyZXR1cm4gdGhpcy5fYW5nbGU7cCU9MzYwOzE4MDxwP3AtPTM2MDotMTgwPnAmJihwKz0zNjApO2lmKC05MD09PXB8fDA9PT1wfHw5MD09PXApdGhpcy5fYW5nbGU9cDtlbHNlIHRocm93IEVycm9yKHArIiBpcyBub3QgYSB2YWxpZCBhbmdsZSBmb3IgTGFiZWwiKTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtuLnByb3RvdHlwZS5wYWRkaW5nPWZ1bmN0aW9uKHApe2lmKG51bGw9PXApcmV0dXJuIHRoaXMuX3BhZGRpbmc7cD0rcDtpZigwPnApdGhyb3cgRXJyb3IocCsiIGlzIG5vdCBhIHZhbGlkIHBhZGRpbmcgdmFsdWUuIENhbm5vdCBiZSBsZXNzIHRoYW4gMC4iKTt0aGlzLl9wYWRkaW5nPXA7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307bi5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiEwfTtuLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiEwfTtuLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT0KZnVuY3Rpb24oKXtrLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3RoaXMuX3RleHRDb250YWluZXIuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCk7dmFyIHA9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSh0aGlzLl90ZXh0KSxxPU1hdGgubWF4KE1hdGgubWluKCh0aGlzLmhlaWdodCgpLXAuaGVpZ2h0KS8yLHRoaXMucGFkZGluZygpKSwwKTtwPU1hdGgubWF4KE1hdGgubWluKCh0aGlzLndpZHRoKCktcC53aWR0aCkvMix0aGlzLnBhZGRpbmcoKSksMCk7dGhpcy5fdGV4dENvbnRhaW5lci5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitwKyIsIitxKyIpIik7cD10aGlzLndpZHRoKCktMipwO3E9dGhpcy5oZWlnaHQoKS0yKnE7dmFyIHI9e3hBbGlnbjp0aGlzLnhBbGlnbm1lbnQoKSx5QWxpZ246dGhpcy55QWxpZ25tZW50KCksdGV4dFJvdGF0aW9uOnRoaXMuYW5nbGUoKX07dGhpcy5fd3JpdGVyLndyaXRlKHRoaXMuX3RleHQscCxxLHIpO3JldHVybiB0aGlzfTsKbi5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7ay5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyk7dGhpcy5fbWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIG59KGYoNCkuQ29tcG9uZW50KTtkLkxhYmVsPWM7Zj1mdW5jdGlvbihrKXtmdW5jdGlvbiBuKHAscSl7cD1rLmNhbGwodGhpcyxwLHEpfHx0aGlzO3AuYWRkQ2xhc3Mobi5USVRMRV9MQUJFTF9DTEFTUyk7cmV0dXJuIHB9ZyhuLGspO3JldHVybiBufShjKTtmLlRJVExFX0xBQkVMX0NMQVNTPSJ0aXRsZS1sYWJlbCI7ZC5UaXRsZUxhYmVsPWY7Yz1mdW5jdGlvbihrKXtmdW5jdGlvbiBuKHAscSl7cD1rLmNhbGwodGhpcyxwLHEpfHx0aGlzO3AuYWRkQ2xhc3Mobi5BWElTX0xBQkVMX0NMQVNTKTtyZXR1cm4gcH1nKG4sayk7cmV0dXJuIG59KGMpO2MuQVhJU19MQUJFTF9DTEFTUz0iYXhpcy1sYWJlbCI7ZC5BeGlzTGFiZWw9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHwKZnVuY3Rpb24oeSx6KXtmdW5jdGlvbiB4KCl7dGhpcy5jb25zdHJ1Y3Rvcj15fWZvcih2YXIgQyBpbiB6KXouaGFzT3duUHJvcGVydHkoQykmJih5W0NdPXpbQ10pO3kucHJvdG90eXBlPW51bGw9PT16P09iamVjdC5jcmVhdGUoeik6KHgucHJvdG90eXBlPXoucHJvdG90eXBlLG5ldyB4KX0sbD1mKDEpLGs9Zig1KSxuPWYoMjMpLHA9Zig4KSxxPWYoMzEpLHI9ZigwKTtjPWYoNCk7dmFyIHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB5KHoseCxDKXt2b2lkIDA9PT16JiYoej1bXSk7dm9pZCAwPT09eCYmKHg9MCk7dm9pZCAwPT09QyYmKEM9SW5maW5pdHkpO3RoaXMuY29sdW1ucz16O3RoaXMuYm90dG9tUGFkZGluZz14O3RoaXMubWF4V2lkdGg9Q315LnByb3RvdHlwZS5hZGRDb2x1bW49ZnVuY3Rpb24oeil7dmFyIHg9ei53aWR0aCxDPXRoaXMuZ2V0V2lkdGhBdmFpbGFibGUoKTt6LndpZHRoPU1hdGgubWluKEMseCk7dGhpcy5jb2x1bW5zLnB1c2goeil9O3kucHJvdG90eXBlLmdldEJvdW5kcz0KZnVuY3Rpb24oeil7Zm9yKHZhciB4PXRoaXMuY29sdW1uc1t6XSxDPTAsRj0wO0Y8ejtGKyspQys9dGhpcy5jb2x1bW5zW0ZdLndpZHRoO3JldHVybnt0b3BMZWZ0Ont4OkMseTowfSxib3R0b21SaWdodDp7eDpDK3gud2lkdGgseTp4LmhlaWdodH19fTt5LnByb3RvdHlwZS5nZXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gci5NYXRoLm1heCh0aGlzLmNvbHVtbnMubWFwKGZ1bmN0aW9uKHope3JldHVybiB6LmhlaWdodH0pLDApK3RoaXMuYm90dG9tUGFkZGluZ307eS5wcm90b3R5cGUuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4odGhpcy5jb2x1bW5zLnJlZHVjZShmdW5jdGlvbih6LHgpe3JldHVybiB6K3gud2lkdGh9LDApLHRoaXMubWF4V2lkdGgpfTt5LnByb3RvdHlwZS5nZXRXaWR0aEF2YWlsYWJsZT1mdW5jdGlvbigpe3ZhciB6PXRoaXMuZ2V0V2lkdGgoKTtyZXR1cm4gTWF0aC5tYXgodGhpcy5tYXhXaWR0aC16LDApfTtyZXR1cm4geX0oKSx2PWZ1bmN0aW9uKCl7ZnVuY3Rpb24geSh6LAp4LEMsRil7dm9pZCAwPT09eiYmKHo9SW5maW5pdHkpO3ZvaWQgMD09PXgmJih4PUluZmluaXR5KTt2b2lkIDA9PT1DJiYoQz0wKTt2b2lkIDA9PT1GJiYoRj1bXSk7dGhpcy5tYXhXaWR0aD16O3RoaXMubWF4SGVpZ2h0PXg7dGhpcy5wYWRkaW5nPUM7dGhpcy5yb3dzPUZ9eS5wcm90b3R5cGUuYWRkUm93PWZ1bmN0aW9uKHope3oubWF4V2lkdGg9dGhpcy5tYXhXaWR0aC0yKnRoaXMucGFkZGluZzt0aGlzLnJvd3MucHVzaCh6KX07eS5wcm90b3R5cGUuZ2V0Q29sdW1uQm91bmRzPWZ1bmN0aW9uKHoseCl7dmFyIEM9dGhpcy5nZXRSb3dCb3VuZHMoeik7ej10aGlzLnJvd3Nbel0uZ2V0Qm91bmRzKHgpO3oudG9wTGVmdC54Kz1DLnRvcExlZnQueDt6LmJvdHRvbVJpZ2h0LngrPUMudG9wTGVmdC54O3oudG9wTGVmdC55Kz1DLnRvcExlZnQueTt6LmJvdHRvbVJpZ2h0LnkrPUMudG9wTGVmdC55O3JldHVybiB6fTt5LnByb3RvdHlwZS5nZXRSb3dCb3VuZHM9ZnVuY3Rpb24oeil7Zm9yKHZhciB4PQp0aGlzLnBhZGRpbmcsQz10aGlzLnBhZGRpbmcsRj0wO0Y8ejtGKyspQys9dGhpcy5yb3dzW0ZdLmdldEhlaWdodCgpO3JldHVybnt0b3BMZWZ0Ont4LHk6Q30sYm90dG9tUmlnaHQ6e3g6eCt0aGlzLnJvd3Nbel0uZ2V0V2lkdGgoKSx5OkMrdGhpcy5yb3dzW3pdLmdldEhlaWdodCgpfX19O3kucHJvdG90eXBlLmdldEhlaWdodD1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1pbih0aGlzLnJvd3MucmVkdWNlKGZ1bmN0aW9uKHoseCl7cmV0dXJuIHoreC5nZXRIZWlnaHQoKX0sMCkrMip0aGlzLnBhZGRpbmcsdGhpcy5tYXhIZWlnaHQpfTt5LnByb3RvdHlwZS5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1pbihyLk1hdGgubWF4KHRoaXMucm93cy5tYXAoZnVuY3Rpb24oeil7cmV0dXJuIHouZ2V0V2lkdGgoKX0pLDApKzIqdGhpcy5wYWRkaW5nLHRoaXMubWF4V2lkdGgpfTtyZXR1cm4geX0oKTtjPWZ1bmN0aW9uKHkpe2Z1bmN0aW9uIHooeCl7dmFyIEM9eS5jYWxsKHRoaXMpfHwKdGhpcztDLl9wYWRkaW5nPTU7Qy5fcm93Qm90dG9tUGFkZGluZz0zO0MuYWRkQ2xhc3MoImxlZ2VuZCIpO0MubWF4RW50cmllc1BlclJvdygxKTtpZihudWxsPT14KXRocm93IEVycm9yKCJMZWdlbmQgcmVxdWlyZXMgYSBjb2xvclNjYWxlIik7Qy5fY29sb3JTY2FsZT14O0MuX3JlZHJhd0NhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIEMucmVkcmF3KCl9O0MuX2NvbG9yU2NhbGUub25VcGRhdGUoQy5fcmVkcmF3Q2FsbGJhY2spO0MuX2Zvcm1hdHRlcj1wLmlkZW50aXR5KCk7Qy5tYXhMaW5lc1BlckVudHJ5KDEpO0MueEFsaWdubWVudCgicmlnaHQiKS55QWxpZ25tZW50KCJ0b3AiKTtDLmNvbXBhcmF0b3IoZnVuY3Rpb24oRixEKXt2YXIgQj1DLl9jb2xvclNjYWxlLmRvbWFpbigpLnNsaWNlKCkubWFwKGZ1bmN0aW9uKEkpe3JldHVybiBDLl9mb3JtYXR0ZXIoSSl9KTtyZXR1cm4gQi5pbmRleE9mKEYpLUIuaW5kZXhPZihEKX0pO0MuX3N5bWJvbEZhY3RvcnlBY2Nlc3Nvcj1mdW5jdGlvbigpe3JldHVybiBxLmNpcmNsZSgpfTsKQy5fc3ltYm9sT3BhY2l0eUFjY2Vzc29yPWZ1bmN0aW9uKCl7cmV0dXJuIDF9O3JldHVybiBDfWcoeix5KTt6LnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt5LnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt2YXIgeD10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKHouTEVHRU5EX1JPV19DTEFTUywhMCk7eC5hcHBlbmQoImciKS5jbGFzc2VkKHouTEVHRU5EX0VOVFJZX0NMQVNTLCEwKS5hcHBlbmQoInRleHQiKTt4PW5ldyBrLlN2Z0NvbnRleHQoeC5ub2RlKCksbnVsbCxuLkFERF9USVRMRV9FTEVNRU5UUyk7dGhpcy5fbWVhc3VyZXI9bmV3IGsuQ2FjaGVNZWFzdXJlcih4KTt0aGlzLl93cmFwcGVyPShuZXcgay5XcmFwcGVyKS5tYXhMaW5lcyh0aGlzLm1heExpbmVzUGVyRW50cnkoKSk7dGhpcy5fd3JpdGVyPW5ldyBrLldyaXRlcih0aGlzLl9tZWFzdXJlcix4LHRoaXMuX3dyYXBwZXIpfTt6LnByb3RvdHlwZS5mb3JtYXR0ZXI9ZnVuY3Rpb24oeCl7aWYobnVsbD09CngpcmV0dXJuIHRoaXMuX2Zvcm1hdHRlcjt0aGlzLl9mb3JtYXR0ZXI9eDt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt6LnByb3RvdHlwZS5tYXhFbnRyaWVzUGVyUm93PWZ1bmN0aW9uKHgpe2lmKG51bGw9PXgpcmV0dXJuIHRoaXMuX21heEVudHJpZXNQZXJSb3c7dGhpcy5fbWF4RW50cmllc1BlclJvdz14O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3oucHJvdG90eXBlLm1heExpbmVzUGVyRW50cnk9ZnVuY3Rpb24oeCl7aWYobnVsbD09eClyZXR1cm4gdGhpcy5fbWF4TGluZXNQZXJFbnRyeTt0aGlzLl9tYXhMaW5lc1BlckVudHJ5PXg7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307ei5wcm90b3R5cGUubWF4V2lkdGg9ZnVuY3Rpb24oeCl7aWYobnVsbD09eClyZXR1cm4gdGhpcy5fbWF4V2lkdGg7dGhpcy5fbWF4V2lkdGg9eDt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt6LnByb3RvdHlwZS5jb21wYXJhdG9yPWZ1bmN0aW9uKHgpe251bGwhPXgmJih0aGlzLl9jb21wYXJhdG9yPQp4LHRoaXMucmVkcmF3KCkpfTt6LnByb3RvdHlwZS5jb2xvclNjYWxlPWZ1bmN0aW9uKHgpe3JldHVybiBudWxsIT14Pyh0aGlzLl9jb2xvclNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZWRyYXdDYWxsYmFjayksdGhpcy5fY29sb3JTY2FsZT14LHRoaXMuX2NvbG9yU2NhbGUub25VcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spLHRoaXMucmVkcmF3KCksdGhpcyk6dGhpcy5fY29sb3JTY2FsZX07ei5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3kucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9jb2xvclNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZWRyYXdDYWxsYmFjayl9O3oucHJvdG90eXBlLl9idWlsZExlZ2VuZFRhYmxlPWZ1bmN0aW9uKHgsQyl7dmFyIEY9dGhpcyxEPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQsQj1uZXcgdih4LEMsdGhpcy5fcGFkZGluZyk7eD10aGlzLl9jb2xvclNjYWxlLmRvbWFpbigpLnNsaWNlKCkuc29ydChmdW5jdGlvbihPLApQKXtyZXR1cm4gRi5fY29tcGFyYXRvcihGLl9mb3JtYXR0ZXIoTyksRi5fZm9ybWF0dGVyKFApKX0pO3ZhciBJPW5ldyB0O0IuYWRkUm93KEkpO0kuYm90dG9tUGFkZGluZz10aGlzLl9yb3dCb3R0b21QYWRkaW5nO3guZm9yRWFjaChmdW5jdGlvbihPKXtJLmNvbHVtbnMubGVuZ3RoLzI9PT1GLm1heEVudHJpZXNQZXJSb3coKSYmKEk9bmV3IHQsSS5ib3R0b21QYWRkaW5nPUYuX3Jvd0JvdHRvbVBhZGRpbmcsQi5hZGRSb3coSSkpO3ZhciBQPUkuZ2V0V2lkdGhBdmFpbGFibGUoKSxIPUYuX2Zvcm1hdHRlcihPKSxLPUYuX21lYXN1cmVyLm1lYXN1cmUoSCkud2lkdGg7MD5QLUQtSyYmMTxJLmNvbHVtbnMubGVuZ3RoJiYoST1uZXcgdCxJLmJvdHRvbVBhZGRpbmc9Ri5fcm93Qm90dG9tUGFkZGluZyxCLmFkZFJvdyhJKSk7SS5hZGRDb2x1bW4oe3dpZHRoOkQsaGVpZ2h0OkQsZGF0YTp7bmFtZTpPLHR5cGU6InN5bWJvbCJ9fSk7UD1JLmdldFdpZHRoQXZhaWxhYmxlKCk7UD1NYXRoLm1pbihQLApLKTtGLl93cmFwcGVyLm1heExpbmVzKEYubWF4TGluZXNQZXJFbnRyeSgpKTtIPUYuX3dyYXBwZXIud3JhcChILEYuX21lYXN1cmVyLFApLm5vTGluZXMqRDtJLmFkZENvbHVtbih7d2lkdGg6UCxoZWlnaHQ6SCxkYXRhOntuYW1lOk8sdHlwZToidGV4dCJ9fSl9KTtyZXR1cm4gQn07ei5wcm90b3R5cGUucmVxdWVzdGVkU3BhY2U9ZnVuY3Rpb24oeCxDKXt4PXRoaXMuX2J1aWxkTGVnZW5kVGFibGUoci5NYXRoLm1pbihbdGhpcy5tYXhXaWR0aCgpLHhdLHgpLEMpO3JldHVybnttaW5IZWlnaHQ6eC5nZXRIZWlnaHQoKSxtaW5XaWR0aDp4LmdldFdpZHRoKCl9fTt6LnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKHgpe3ZhciBDPXRoaXM7aWYoIXRoaXMuX2lzU2V0dXApcmV0dXJuW107dmFyIEY9dGhpcy5fYnVpbGRMZWdlbmRUYWJsZSh0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSk7cmV0dXJuIEYucm93cy5yZWR1Y2UoZnVuY3Rpb24oRCxCLEkpe2lmKDAhPT1ELmxlbmd0aClyZXR1cm4gRDsKdmFyIE89Ri5nZXRSb3dCb3VuZHMoSSk7cmV0dXJuIHIuTWF0aC53aXRoaW4oeCxPKT9CLmNvbHVtbnMucmVkdWNlKGZ1bmN0aW9uKFAsSCxLKXt2YXIgTT1GLmdldENvbHVtbkJvdW5kcyhJLEspO2lmKHIuTWF0aC53aXRoaW4oeCxNKSl7UD1DLmNvbnRlbnQoKS5zZWxlY3RBbGwoIi4iK3ouTEVHRU5EX1JPV19DTEFTUykubm9kZXMoKVtJXTtLPWwuc2VsZWN0KFApLnNlbGVjdEFsbCgiLiIrei5MRUdFTkRfRU5UUllfQ0xBU1MpLm5vZGVzKClbTWF0aC5mbG9vcihLLzIpXTt2YXIgTD1sLnNlbGVjdChLKS5zZWxlY3QoIi4iK3ouTEVHRU5EX1NZTUJPTF9DTEFTUyk7TT1yLkRPTS5nZXRUcmFuc2xhdGVWYWx1ZXMobC5zZWxlY3QoUCkpO0w9ci5ET00uZ2V0VHJhbnNsYXRlVmFsdWVzKEwpO3JldHVyblt7Ym91bmRzOnIuRE9NLmVsZW1lbnRCQm94KGwuc2VsZWN0KFApKSxkYXR1bTpILmRhdGEubmFtZSxwb3NpdGlvbjp7eDpNWzBdK0xbMF0seTpNWzFdK0xbMV19LHNlbGVjdGlvbjpsLnNlbGVjdChLKSwKY29tcG9uZW50OkN9XX1yZXR1cm4gUH0sRCk6RH0sW10pfTt6LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3kucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dmFyIHg9dGhpcy5fYnVpbGRMZWdlbmRUYWJsZSh0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSk7dGhpcy5jb250ZW50KCkuc2VsZWN0QWxsKCIqIikucmVtb3ZlKCk7dmFyIEM9dGhpcy5jb250ZW50KCkuc2VsZWN0QWxsKCJnLiIrei5MRUdFTkRfUk9XX0NMQVNTKS5kYXRhKHgucm93cyksRj1DLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCh6LkxFR0VORF9ST1dfQ0xBU1MsITApLm1lcmdlKEMpO0MuZXhpdCgpLnJlbW92ZSgpO0YuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihCLEkpe0I9eC5nZXRSb3dCb3VuZHMoSSk7cmV0dXJuInRyYW5zbGF0ZSgiK0IudG9wTGVmdC54KyIsICIrQi50b3BMZWZ0LnkrIikifSk7dmFyIEQ9dGhpcztGLmVhY2goZnVuY3Rpb24oQixJKXtmb3IodmFyIE89CltdLFA9MDtQPEIuY29sdW1ucy5sZW5ndGg7UCs9MilPLnB1c2goW0IuY29sdW1uc1tQXSxCLmNvbHVtbnNbUCsxXV0pO0I9bC5zZWxlY3QodGhpcykuc2VsZWN0QWxsKCJnLiIrei5MRUdFTkRfRU5UUllfQ0xBU1MpLmRhdGEoTyk7Tz1CLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCh6LkxFR0VORF9FTlRSWV9DTEFTUywhMCkubWVyZ2UoQik7Ty5hcHBlbmQoInBhdGgiKS5hdHRyKCJkIixmdW5jdGlvbihIKXtIPUhbMF07cmV0dXJuIEQuc3ltYm9sKCkoSC5kYXRhLm5hbWUsSSkoLjYqSC5oZWlnaHQpKG51bGwpfSkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihIKXtIPUhbMF07cmV0dXJuInRyYW5zbGF0ZSgiKyh4LmdldENvbHVtbkJvdW5kcyhJLHgucm93c1tJXS5jb2x1bW5zLmluZGV4T2YoSCkpLnRvcExlZnQueCtILndpZHRoLzIpKyIsICIrSC5oZWlnaHQvMisiKSJ9KS5hdHRyKCJmaWxsIixmdW5jdGlvbihIKXtyZXR1cm4gRC5fY29sb3JTY2FsZS5zY2FsZShIWzBdLmRhdGEubmFtZSl9KS5hdHRyKCJvcGFjaXR5IiwKZnVuY3Rpb24oSCl7cmV0dXJuIEQuc3ltYm9sT3BhY2l0eSgpKEhbMF0uZGF0YS5uYW1lLEkpfSkuY2xhc3NlZCh6LkxFR0VORF9TWU1CT0xfQ0xBU1MsITApO08uYXBwZW5kKCJnIikuY2xhc3NlZCgidGV4dC1jb250YWluZXIiLCEwKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKEgpe3JldHVybiJ0cmFuc2xhdGUoIit4LmdldENvbHVtbkJvdW5kcyhJLHgucm93c1tJXS5jb2x1bW5zLmluZGV4T2YoSFsxXSkpLnRvcExlZnQueCsiLCAwKSJ9KS5lYWNoKGZ1bmN0aW9uKEgpe3ZhciBLPWwuc2VsZWN0KHRoaXMpO0g9SFsxXTtELl93cml0ZXIud3JpdGUoRC5fZm9ybWF0dGVyKEguZGF0YS5uYW1lKSxILndpZHRoLEQuaGVpZ2h0KCkse3hBbGlnbjoibGVmdCIseUFsaWduOiJ0b3AiLHRleHRSb3RhdGlvbjowfSxLLm5vZGUoKSl9KTtCLmV4aXQoKS5yZW1vdmUoKX0pO3JldHVybiB0aGlzfTt6LnByb3RvdHlwZS5zeW1ib2w9ZnVuY3Rpb24oeCl7aWYobnVsbD09eClyZXR1cm4gdGhpcy5fc3ltYm9sRmFjdG9yeUFjY2Vzc29yOwp0aGlzLl9zeW1ib2xGYWN0b3J5QWNjZXNzb3I9eDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt6LnByb3RvdHlwZS5zeW1ib2xPcGFjaXR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N5bWJvbE9wYWNpdHlBY2Nlc3Nvcn07ei5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiEwfTt6LnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiEwfTt6LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gen0oYy5Db21wb25lbnQpO2MuTEVHRU5EX1JPV19DTEFTUz0ibGVnZW5kLXJvdyI7Yy5MRUdFTkRfRU5UUllfQ0xBU1M9ImxlZ2VuZC1lbnRyeSI7Yy5MRUdFTkRfU1lNQk9MX0NMQVNTPSJsZWdlbmQtc3ltYm9sIjtkLkxlZ2VuZD1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG4scCl7ZnVuY3Rpb24gcSgpe3RoaXMuY29uc3RydWN0b3I9Cm59Zm9yKHZhciByIGluIHApcC5oYXNPd25Qcm9wZXJ0eShyKSYmKG5bcl09cFtyXSk7bi5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToocS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IHEpfSxsPWYoMiksaz1mKDApO2M9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcCgpe3JldHVybiBudWxsIT09biYmbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9ZyhwLG4pO3AucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24ocSl7dmFyIHIsdD1JbmZpbml0eTt0aGlzLmNvbXBvbmVudHMoKS5mb3JFYWNoKGZ1bmN0aW9uKHYpe3Y9di5lbnRpdHlOZWFyZXN0KHEpO2lmKG51bGwhPXYpe3ZhciB5PWsuTWF0aC5kaXN0YW5jZVNxdWFyZWQodi5wb3NpdGlvbixxKTt5PD10JiYodD15LHI9dil9fSk7cmV0dXJuIHJ9O3AucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbihxKXtpZihudWxsIT1xJiYhKHEgaW5zdGFuY2VvZiBsLlBsb3QpKXRocm93IEVycm9yKCJQbG90IEdyb3VwIG9ubHkgYWNjZXB0cyBwbG90cyIpOwpuLnByb3RvdHlwZS5hcHBlbmQuY2FsbCh0aGlzLHEpO3JldHVybiB0aGlzfTtyZXR1cm4gcH0oZig0MSkuR3JvdXApO2QuUGxvdEdyb3VwPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixwKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgciBpbiBwKXAuaGFzT3duUHJvcGVydHkocikmJihuW3JdPXBbcl0pO24ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX0sbD1mKDEpLGs9ZigwKTtjPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHAocSl7dm9pZCAwPT09cSYmKHE9W10pO3ZhciByPW4uY2FsbCh0aGlzKXx8dGhpcztyLl9yb3dQYWRkaW5nPTA7ci5fY29sdW1uUGFkZGluZz0wO3IuX3Jvd3M9W107ci5fcm93V2VpZ2h0cz1bXTtyLl9jb2x1bW5XZWlnaHRzPVtdO3IuX25Sb3dzPTA7ci5fbkNvbHM9MDtyLl9jYWxjdWxhdGVkTGF5b3V0PQpudWxsO3IuYWRkQ2xhc3MoInRhYmxlIik7cS5mb3JFYWNoKGZ1bmN0aW9uKHQsdil7dC5mb3JFYWNoKGZ1bmN0aW9uKHkseil7bnVsbCE9eSYmci5hZGQoeSx2LHopfSl9KTtyZXR1cm4gcn1nKHAsbik7cC5wcm90b3R5cGUuX2ZvckVhY2g9ZnVuY3Rpb24ocSl7Zm9yKHZhciByPTA7cjx0aGlzLl9uUm93cztyKyspZm9yKHZhciB0PTA7dDx0aGlzLl9uQ29sczt0KyspbnVsbCE9dGhpcy5fcm93c1tyXVt0XSYmcSh0aGlzLl9yb3dzW3JdW3RdKX07cC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHEpe2Zvcih2YXIgcj0wO3I8dGhpcy5fblJvd3M7cisrKWZvcih2YXIgdD0wO3Q8dGhpcy5fbkNvbHM7dCsrKWlmKHRoaXMuX3Jvd3Nbcl1bdF09PT1xKXJldHVybiEwO3JldHVybiExfTtwLnByb3RvdHlwZS5jb21wb25lbnRBdD1mdW5jdGlvbihxKXtyZXR1cm4gMD49dGhpcy5fblJvd3N8fDA+cXx8cT49dGhpcy5fbkNvbHM/bnVsbDp0aGlzLl9yb3dzWzBdW3FdfTtwLnByb3RvdHlwZS5hZGQ9CmZ1bmN0aW9uKHEscix0KXtpZihudWxsPT1xKXRocm93IEVycm9yKCJDYW5ub3QgYWRkIG51bGwgdG8gYSB0YWJsZSBjZWxsIik7aWYoIXRoaXMuaGFzKHEpKXtpZihudWxsIT0odGhpcy5fcm93c1tyXSYmdGhpcy5fcm93c1tyXVt0XSkpdGhyb3cgRXJyb3IoImNlbGwgaXMgb2NjdXBpZWQiKTtxLmRldGFjaCgpO3RoaXMuX25Sb3dzPU1hdGgubWF4KHIrMSx0aGlzLl9uUm93cyk7dGhpcy5fbkNvbHM9TWF0aC5tYXgodCsxLHRoaXMuX25Db2xzKTt0aGlzLl9wYWRUYWJsZVRvU2l6ZSh0aGlzLl9uUm93cyx0aGlzLl9uQ29scyk7dGhpcy5fcm93c1tyXVt0XT1xO3RoaXMuX2Fkb3B0QW5kQW5jaG9yKHEpO3RoaXMucmVkcmF3KCl9cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLl9yZW1vdmU9ZnVuY3Rpb24ocSl7Zm9yKHZhciByPTA7cjx0aGlzLl9uUm93cztyKyspZm9yKHZhciB0PTA7dDx0aGlzLl9uQ29sczt0KyspaWYodGhpcy5fcm93c1tyXVt0XT09PXEpe3RoaXMuX3Jvd3Nbcl1bdF09Cm51bGw7cmV0dXJufX07cC5wcm90b3R5cGUuX2l0ZXJhdGVMYXlvdXQ9ZnVuY3Rpb24ocSxyLHQpe3ZvaWQgMD09PXQmJih0PSExKTt2YXIgdj10aGlzLl9yb3dzLHk9bC50cmFuc3Bvc2UodGhpcy5fcm93cyk7cS09dGhpcy5fY29sdW1uUGFkZGluZyoodGhpcy5fbkNvbHMtMSk7ci09dGhpcy5fcm93UGFkZGluZyoodGhpcy5fblJvd3MtMSk7dj1wLl9jYWxjQ29tcG9uZW50V2VpZ2h0cyh0aGlzLl9yb3dXZWlnaHRzLHYsZnVuY3Rpb24oTCl7cmV0dXJuIG51bGw9PUx8fEwuZml4ZWRIZWlnaHQoKX0pO3k9cC5fY2FsY0NvbXBvbmVudFdlaWdodHModGhpcy5fY29sdW1uV2VpZ2h0cyx5LGZ1bmN0aW9uKEwpe3JldHVybiBudWxsPT1MfHxMLmZpeGVkV2lkdGgoKX0pO3ZhciB6PXkubWFwKGZ1bmN0aW9uKEwpe3JldHVybiAwPT09TD8uNTpMfSkseD12Lm1hcChmdW5jdGlvbihMKXtyZXR1cm4gMD09PUw/LjU6TH0pO3o9cC5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKHoscSk7dmFyIEM9cC5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKHgsCnIpLEY9ay5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSgwLHRoaXMuX25Db2xzKSxEPWsuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCx0aGlzLl9uUm93cyk7eD0wO2Zvcih2YXIgQixJLE87Oyl7RD1rLkFycmF5LmFkZChELEMpO3o9ay5BcnJheS5hZGQoRix6KTtCPXRoaXMuX2RldGVybWluZUd1YXJhbnRlZXMoeixELHQpO0Y9Qi5ndWFyYW50ZWVkV2lkdGhzO0Q9Qi5ndWFyYW50ZWVkSGVpZ2h0cztJPUIud2FudHNXaWR0aEFyci5zb21lKGZ1bmN0aW9uKEwpe3JldHVybiBMfSk7Tz1CLndhbnRzSGVpZ2h0QXJyLnNvbWUoZnVuY3Rpb24oTCl7cmV0dXJuIEx9KTt2YXIgUD1LLEg9TTt2YXIgSz1xLWwuc3VtKEIuZ3VhcmFudGVlZFdpZHRocyk7dmFyIE09ci1sLnN1bShCLmd1YXJhbnRlZWRIZWlnaHRzKTt6PXZvaWQgMDtJPyh6PUIud2FudHNXaWR0aEFyci5tYXAoZnVuY3Rpb24oTCl7cmV0dXJuIEw/LjE6MH0pLHo9ay5BcnJheS5hZGQoeix5KSk6ej15O0M9dm9pZCAwO08/KEM9Qi53YW50c0hlaWdodEFyci5tYXAoZnVuY3Rpb24oTCl7cmV0dXJuIEw/Ci4xOjB9KSxDPWsuQXJyYXkuYWRkKEMsdikpOkM9djt6PXAuX2NhbGNQcm9wb3J0aW9uYWxTcGFjZSh6LEspO0M9cC5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKEMsTSk7eCsrO0g9MDxNJiZNIT09SDtpZighKDA8SyYmSyE9PVB8fEgpKWJyZWFrO2lmKDU8eClicmVha31LPXEtbC5zdW0oQi5ndWFyYW50ZWVkV2lkdGhzKTtNPXItbC5zdW0oQi5ndWFyYW50ZWVkSGVpZ2h0cyk7ej1wLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UoeSxLKTtDPXAuX2NhbGNQcm9wb3J0aW9uYWxTcGFjZSh2LE0pO3JldHVybntjb2xQcm9wb3J0aW9uYWxTcGFjZTp6LHJvd1Byb3BvcnRpb25hbFNwYWNlOkMsZ3VhcmFudGVlZFdpZHRoczpCLmd1YXJhbnRlZWRXaWR0aHMsZ3VhcmFudGVlZEhlaWdodHM6Qi5ndWFyYW50ZWVkSGVpZ2h0cyx3YW50c1dpZHRoOkksd2FudHNIZWlnaHQ6T319O3AucHJvdG90eXBlLl9kZXRlcm1pbmVHdWFyYW50ZWVzPWZ1bmN0aW9uKHEscix0KXt2b2lkIDA9PT10JiYodD0hMSk7dmFyIHY9CmsuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCx0aGlzLl9uQ29scykseT1rLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KDAsdGhpcy5fblJvd3MpLHo9ay5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSghMSx0aGlzLl9uQ29scykseD1rLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KCExLHRoaXMuX25Sb3dzKTt0aGlzLl9yb3dzLmZvckVhY2goZnVuY3Rpb24oQyxGKXtDLmZvckVhY2goZnVuY3Rpb24oRCxCKXtEPW51bGwhPUQ/RC5yZXF1ZXN0ZWRTcGFjZShxW0JdLHJbRl0pOnttaW5XaWR0aDowLG1pbkhlaWdodDowfTt2W0JdPU1hdGgubWF4KHZbQl0sdD9NYXRoLm1pbihELm1pbldpZHRoLHFbQl0pOkQubWluV2lkdGgpO3lbRl09TWF0aC5tYXgoeVtGXSx0P01hdGgubWluKEQubWluSGVpZ2h0LHJbRl0pOkQubWluSGVpZ2h0KTt2YXIgST1ELm1pbldpZHRoPnFbQl07eltCXT16W0JdfHxJO0I9RC5taW5IZWlnaHQ+cltGXTt4W0ZdPXhbRl18fEJ9KX0pO3JldHVybntndWFyYW50ZWVkV2lkdGhzOnYsCmd1YXJhbnRlZWRIZWlnaHRzOnksd2FudHNXaWR0aEFycjp6LHdhbnRzSGVpZ2h0QXJyOnh9fTtwLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbihxLHIpe3RoaXMuX2NhbGN1bGF0ZWRMYXlvdXQ9dGhpcy5faXRlcmF0ZUxheW91dChxLHIpO3JldHVybnttaW5XaWR0aDpsLnN1bSh0aGlzLl9jYWxjdWxhdGVkTGF5b3V0Lmd1YXJhbnRlZWRXaWR0aHMpLG1pbkhlaWdodDpsLnN1bSh0aGlzLl9jYWxjdWxhdGVkTGF5b3V0Lmd1YXJhbnRlZWRIZWlnaHRzKX19O3AucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24ocSxyLHQpe3ZhciB2PXRoaXM7bi5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMscSxyLHQpO3E9bC5zdW0odGhpcy5fY2FsY3VsYXRlZExheW91dC5ndWFyYW50ZWVkV2lkdGhzKTtyPWwuc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZEhlaWdodHMpO3Q9dGhpcy5fY2FsY3VsYXRlZExheW91dDtpZihxPnRoaXMud2lkdGgoKXx8CnI+dGhpcy5oZWlnaHQoKSl0PXRoaXMuX2l0ZXJhdGVMYXlvdXQodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCksITApO3ZhciB5PTAsej1rLkFycmF5LmFkZCh0LnJvd1Byb3BvcnRpb25hbFNwYWNlLHQuZ3VhcmFudGVlZEhlaWdodHMpLHg9ay5BcnJheS5hZGQodC5jb2xQcm9wb3J0aW9uYWxTcGFjZSx0Lmd1YXJhbnRlZWRXaWR0aHMpO3RoaXMuX3Jvd3MuZm9yRWFjaChmdW5jdGlvbihDLEYpe3ZhciBEPTA7Qy5mb3JFYWNoKGZ1bmN0aW9uKEIsSSl7bnVsbCE9QiYmQi5jb21wdXRlTGF5b3V0KHt4OkQseX0seFtJXSx6W0ZdKTtEKz14W0ldK3YuX2NvbHVtblBhZGRpbmd9KTt5Kz16W0ZdK3YuX3Jvd1BhZGRpbmd9KTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUucm93UGFkZGluZz1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl9yb3dQYWRkaW5nO2lmKCFrLk1hdGguaXNWYWxpZE51bWJlcihxKXx8MD5xKXRocm93IEVycm9yKCJyb3dQYWRkaW5nIG11c3QgYmUgYSBub24tbmVnYXRpdmUgZmluaXRlIHZhbHVlIik7CnRoaXMuX3Jvd1BhZGRpbmc9cTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5jb2x1bW5QYWRkaW5nPWZ1bmN0aW9uKHEpe2lmKG51bGwhPXEpe2lmKCFrLk1hdGguaXNWYWxpZE51bWJlcihxKXx8MD5xKXRocm93IEVycm9yKCJjb2x1bW5QYWRkaW5nIG11c3QgYmUgYSBub24tbmVnYXRpdmUgZmluaXRlIHZhbHVlIik7dGhpcy5fY29sdW1uUGFkZGluZz1xO3RoaXMucmVkcmF3KCl9fTtwLnByb3RvdHlwZS5yb3dXZWlnaHQ9ZnVuY3Rpb24ocSxyKXtpZihudWxsPT1yKXJldHVybiB0aGlzLl9yb3dXZWlnaHRzW3FdO2lmKCFrLk1hdGguaXNWYWxpZE51bWJlcihyKXx8MD5yKXRocm93IEVycm9yKCJyb3dXZWlnaHQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgdmFsdWUiKTt0aGlzLl9yb3dXZWlnaHRzW3FdPXI7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuY29sdW1uV2VpZ2h0PWZ1bmN0aW9uKHEscil7aWYobnVsbD09cilyZXR1cm4gdGhpcy5fY29sdW1uV2VpZ2h0c1txXTsKaWYoIWsuTWF0aC5pc1ZhbGlkTnVtYmVyKHIpfHwwPnIpdGhyb3cgRXJyb3IoImNvbHVtbldlaWdodCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSB2YWx1ZSIpO3RoaXMuX2NvbHVtbldlaWdodHNbcV09cjt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7dmFyIHE9bC50cmFuc3Bvc2UodGhpcy5fcm93cyk7cmV0dXJuIHAuX2ZpeGVkU3BhY2UocSxmdW5jdGlvbihyKXtyZXR1cm4gbnVsbD09cnx8ci5maXhlZFdpZHRoKCl9KX07cC5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gcC5fZml4ZWRTcGFjZSh0aGlzLl9yb3dzLGZ1bmN0aW9uKHEpe3JldHVybiBudWxsPT1xfHxxLmZpeGVkSGVpZ2h0KCl9KX07cC5wcm90b3R5cGUuX3BhZFRhYmxlVG9TaXplPWZ1bmN0aW9uKHEscil7Zm9yKHZhciB0PTA7dDxxO3QrKyl7dm9pZCAwPT09dGhpcy5fcm93c1t0XSYmKHRoaXMuX3Jvd3NbdF09W10sCnRoaXMuX3Jvd1dlaWdodHNbdF09bnVsbCk7Zm9yKHZhciB2PTA7djxyO3YrKyl2b2lkIDA9PT10aGlzLl9yb3dzW3RdW3ZdJiYodGhpcy5fcm93c1t0XVt2XT1udWxsKX1mb3Iodj0wO3Y8cjt2Kyspdm9pZCAwPT09dGhpcy5fY29sdW1uV2VpZ2h0c1t2XSYmKHRoaXMuX2NvbHVtbldlaWdodHNbdl09bnVsbCl9O3AuX2NhbGNDb21wb25lbnRXZWlnaHRzPWZ1bmN0aW9uKHEscix0KXtyZXR1cm4gcS5tYXAoZnVuY3Rpb24odix5KXtyZXR1cm4gbnVsbCE9dj92OnJbeV0ubWFwKHQpLnJlZHVjZShmdW5jdGlvbih6LHgpe3JldHVybiB6JiZ4fSwhMCk/MDoxfSl9O3AuX2NhbGNQcm9wb3J0aW9uYWxTcGFjZT1mdW5jdGlvbihxLHIpe3ZhciB0PWwuc3VtKHEpO3JldHVybiAwPT09dD9rLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KDAscS5sZW5ndGgpOnEubWFwKGZ1bmN0aW9uKHYpe3JldHVybiByKnYvdH0pfTtwLl9maXhlZFNwYWNlPWZ1bmN0aW9uKHEscil7ZnVuY3Rpb24gdCh2KXtyZXR1cm4gdi5yZWR1Y2UoZnVuY3Rpb24oeSwKeil7cmV0dXJuIHkmJnp9LCEwKX1yZXR1cm4gdChxLm1hcChmdW5jdGlvbih2KXtyZXR1cm4gdCh2Lm1hcChyKSl9KSl9O3JldHVybiBwfShmKDI5KS5Db21wb25lbnRDb250YWluZXIpO2QuVGFibGU9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLGspe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBwIGluIGspay5oYXNPd25Qcm9wZXJ0eShwKSYmKGxbcF09a1twXSk7bC5wcm90b3R5cGU9bnVsbD09PWs/T2JqZWN0LmNyZWF0ZShrKToobi5wcm90b3R5cGU9ay5wcm90b3R5cGUsbmV3IG4pfTtjPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIGsoKXt2YXIgbj1sLmNhbGwodGhpcyl8fHRoaXM7bi5hZGRDbGFzcygieC1kcmFnLWJveC1sYXllciIpO24uX2hhc0Nvcm5lcnM9ITE7cmV0dXJuIG59ZyhrLGwpO2sucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24obixwLHEpe2wucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLApuLHAscSk7dGhpcy5fc2V0Qm91bmRzKHRoaXMuYm91bmRzKCkpO3JldHVybiB0aGlzfTtrLnByb3RvdHlwZS5fc2V0Qm91bmRzPWZ1bmN0aW9uKG4pe2wucHJvdG90eXBlLl9zZXRCb3VuZHMuY2FsbCh0aGlzLHt0b3BMZWZ0Ont4Om4udG9wTGVmdC54LHk6MH0sYm90dG9tUmlnaHQ6e3g6bi5ib3R0b21SaWdodC54LHk6dGhpcy5oZWlnaHQoKX19KX07ay5wcm90b3R5cGUuX3NldFJlc2l6YWJsZUNsYXNzZXM9ZnVuY3Rpb24obil7biYmdGhpcy5lbmFibGVkKCk/dGhpcy5hZGRDbGFzcygieC1yZXNpemFibGUiKTp0aGlzLnJlbW92ZUNsYXNzKCJ4LXJlc2l6YWJsZSIpfTtrLnByb3RvdHlwZS55U2NhbGU9ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gbC5wcm90b3R5cGUueVNjYWxlLmNhbGwodGhpcyk7dGhyb3cgRXJyb3IoInlTY2FsZXMgY2Fubm90IGJlIHNldCBvbiBhbiBYRHJhZ0JveExheWVyIik7fTtrLnByb3RvdHlwZS55RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIGwucHJvdG90eXBlLnlFeHRlbnQuY2FsbCh0aGlzKTsKdGhyb3cgRXJyb3IoIlhEcmFnQm94TGF5ZXIgaGFzIG5vIHlFeHRlbnQiKTt9O3JldHVybiBrfShmKDMyKS5EcmFnQm94TGF5ZXIpO2QuWERyYWdCb3hMYXllcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwsayl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIHAgaW4gaylrLmhhc093blByb3BlcnR5KHApJiYobFtwXT1rW3BdKTtsLnByb3RvdHlwZT1udWxsPT09az9PYmplY3QuY3JlYXRlKGspOihuLnByb3RvdHlwZT1rLnByb3RvdHlwZSxuZXcgbil9O2M9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gaygpe3ZhciBuPWwuY2FsbCh0aGlzKXx8dGhpcztuLmFkZENsYXNzKCJ5LWRyYWctYm94LWxheWVyIik7bi5faGFzQ29ybmVycz0hMTtyZXR1cm4gbn1nKGssbCk7ay5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihuLHAscSl7bC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsbixwLApxKTt0aGlzLl9zZXRCb3VuZHModGhpcy5ib3VuZHMoKSk7cmV0dXJuIHRoaXN9O2sucHJvdG90eXBlLl9zZXRCb3VuZHM9ZnVuY3Rpb24obil7bC5wcm90b3R5cGUuX3NldEJvdW5kcy5jYWxsKHRoaXMse3RvcExlZnQ6e3g6MCx5Om4udG9wTGVmdC55fSxib3R0b21SaWdodDp7eDp0aGlzLndpZHRoKCkseTpuLmJvdHRvbVJpZ2h0Lnl9fSl9O2sucHJvdG90eXBlLl9zZXRSZXNpemFibGVDbGFzc2VzPWZ1bmN0aW9uKG4pe24mJnRoaXMuZW5hYmxlZCgpP3RoaXMuYWRkQ2xhc3MoInktcmVzaXphYmxlIik6dGhpcy5yZW1vdmVDbGFzcygieS1yZXNpemFibGUiKX07ay5wcm90b3R5cGUueFNjYWxlPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIGwucHJvdG90eXBlLnhTY2FsZS5jYWxsKHRoaXMpO3Rocm93IEVycm9yKCJ4U2NhbGVzIGNhbm5vdCBiZSBzZXQgb24gYW4gWURyYWdCb3hMYXllciIpO307ay5wcm90b3R5cGUueEV4dGVudD1mdW5jdGlvbigpe3JldHVybiBsLnByb3RvdHlwZS54RXh0ZW50LmNhbGwodGhpcyk7CnRocm93IEVycm9yKCJZRHJhZ0JveExheWVyIGhhcyBubyB4RXh0ZW50Iik7fTtyZXR1cm4ga30oZigzMikuRHJhZ0JveExheWVyKTtkLllEcmFnQm94TGF5ZXI9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLGspe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBwIGluIGspay5oYXNPd25Qcm9wZXJ0eShwKSYmKGxbcF09a1twXSk7bC5wcm90b3R5cGU9bnVsbD09PWs/T2JqZWN0LmNyZWF0ZShrKToobi5wcm90b3R5cGU9ay5wcm90b3R5cGUsbmV3IG4pfTtjPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIGsoKXt2YXIgbj1sLmNhbGwodGhpcyl8fHRoaXM7bi5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltrLl9LRVlET1dOX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHApe3JldHVybiBuLl9wcm9jZXNzS2V5ZG93bihwKX07bi5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltrLl9LRVlVUF9FVkVOVF9OQU1FXT1mdW5jdGlvbihwKXtyZXR1cm4gbi5fcHJvY2Vzc0tleXVwKHApfTsKcmV0dXJuIG59ZyhrLGwpO2suZ2V0RGlzcGF0Y2hlcj1mdW5jdGlvbigpe3ZhciBuPWRvY3VtZW50W2suX0RJU1BBVENIRVJfS0VZXTtudWxsPT1uJiYobj1uZXcgayxkb2N1bWVudFtrLl9ESVNQQVRDSEVSX0tFWV09bik7cmV0dXJuIG59O2sucHJvdG90eXBlLl9wcm9jZXNzS2V5ZG93bj1mdW5jdGlvbihuKXt0aGlzLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQoay5fS0VZRE9XTl9FVkVOVF9OQU1FLG4ua2V5Q29kZSxuKX07ay5wcm90b3R5cGUuX3Byb2Nlc3NLZXl1cD1mdW5jdGlvbihuKXt0aGlzLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQoay5fS0VZVVBfRVZFTlRfTkFNRSxuLmtleUNvZGUsbil9O2sucHJvdG90eXBlLm9uS2V5RG93bj1mdW5jdGlvbihuKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGsuX0tFWURPV05fRVZFTlRfTkFNRSxuKX07ay5wcm90b3R5cGUub2ZmS2V5RG93bj1mdW5jdGlvbihuKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KGsuX0tFWURPV05fRVZFTlRfTkFNRSwKbil9O2sucHJvdG90eXBlLm9uS2V5VXA9ZnVuY3Rpb24obil7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChrLl9LRVlVUF9FVkVOVF9OQU1FLG4pfTtrLnByb3RvdHlwZS5vZmZLZXlVcD1mdW5jdGlvbihuKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KGsuX0tFWVVQX0VWRU5UX05BTUUsbil9O3JldHVybiBrfShmKDI0KS5EaXNwYXRjaGVyKTtjLl9ESVNQQVRDSEVSX0tFWT0iX19QbG90dGFibGVfRGlzcGF0Y2hlcl9LZXkiO2MuX0tFWURPV05fRVZFTlRfTkFNRT0ia2V5ZG93biI7Yy5fS0VZVVBfRVZFTlRfTkFNRT0ia2V5dXAiO2QuS2V5PWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oayxuKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWZvcih2YXIgcSBpbiBuKW4uaGFzT3duUHJvcGVydHkocSkmJihrW3FdPW5bcV0pO2sucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHAucHJvdG90eXBlPQpuLnByb3RvdHlwZSxuZXcgcCl9LGw9ZigwKTtjPWZ1bmN0aW9uKGspe2Z1bmN0aW9uIG4ocCl7ZnVuY3Rpb24gcSh0KXtyZXR1cm4gci5fbWVhc3VyZUFuZERpc3BhdGNoKHAsdCxuLl9NT1VTRU1PVkVfRVZFTlRfTkFNRSwicGFnZSIpfXZhciByPWsuY2FsbCh0aGlzKXx8dGhpcztyLl9sYXN0TW91c2VQb3NpdGlvbj17eDotMSx5Oi0xfTtyLl90cmFuc2xhdG9yPWwuZ2V0VHJhbnNsYXRvcihwKTtyLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW24uX01PVVNFT1ZFUl9FVkVOVF9OQU1FXT1xO3IuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bbi5fTU9VU0VNT1ZFX0VWRU5UX05BTUVdPXE7ci5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltuLl9NT1VTRU9VVF9FVkVOVF9OQU1FXT1xO3IuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bbi5fTU9VU0VET1dOX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHQpe3JldHVybiByLl9tZWFzdXJlQW5kRGlzcGF0Y2gocCx0LG4uX01PVVNFRE9XTl9FVkVOVF9OQU1FKX07CnIuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bbi5fTU9VU0VVUF9FVkVOVF9OQU1FXT1mdW5jdGlvbih0KXtyZXR1cm4gci5fbWVhc3VyZUFuZERpc3BhdGNoKHAsdCxuLl9NT1VTRVVQX0VWRU5UX05BTUUsInBhZ2UiKX07ci5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltuLl9XSEVFTF9FVkVOVF9OQU1FXT1mdW5jdGlvbih0KXtyZXR1cm4gci5fbWVhc3VyZUFuZERpc3BhdGNoKHAsdCxuLl9XSEVFTF9FVkVOVF9OQU1FKX07ci5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltuLl9EQkxDTElDS19FVkVOVF9OQU1FXT1mdW5jdGlvbih0KXtyZXR1cm4gci5fbWVhc3VyZUFuZERpc3BhdGNoKHAsdCxuLl9EQkxDTElDS19FVkVOVF9OQU1FKX07cmV0dXJuIHJ9ZyhuLGspO24uZ2V0RGlzcGF0Y2hlcj1mdW5jdGlvbihwKXt2YXIgcT1wLnJvb3QoKS5yb290RWxlbWVudCgpLHI9cVtuLl9ESVNQQVRDSEVSX0tFWV07bnVsbD09ciYmKHI9bmV3IG4ocCkscVtuLl9ESVNQQVRDSEVSX0tFWV09CnIpO3JldHVybiByfTtuLnByb3RvdHlwZS5vbk1vdXNlTW92ZT1mdW5jdGlvbihwKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KG4uX01PVVNFTU9WRV9FVkVOVF9OQU1FLHApfTtuLnByb3RvdHlwZS5vZmZNb3VzZU1vdmU9ZnVuY3Rpb24ocCl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChuLl9NT1VTRU1PVkVfRVZFTlRfTkFNRSxwKX07bi5wcm90b3R5cGUub25Nb3VzZURvd249ZnVuY3Rpb24ocCl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChuLl9NT1VTRURPV05fRVZFTlRfTkFNRSxwKX07bi5wcm90b3R5cGUub2ZmTW91c2VEb3duPWZ1bmN0aW9uKHApe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQobi5fTU9VU0VET1dOX0VWRU5UX05BTUUscCl9O24ucHJvdG90eXBlLm9uTW91c2VVcD1mdW5jdGlvbihwKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KG4uX01PVVNFVVBfRVZFTlRfTkFNRSxwKX07bi5wcm90b3R5cGUub2ZmTW91c2VVcD1mdW5jdGlvbihwKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KG4uX01PVVNFVVBfRVZFTlRfTkFNRSwKcCl9O24ucHJvdG90eXBlLm9uV2hlZWw9ZnVuY3Rpb24ocCl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChuLl9XSEVFTF9FVkVOVF9OQU1FLHApO3JldHVybiB0aGlzfTtuLnByb3RvdHlwZS5vZmZXaGVlbD1mdW5jdGlvbihwKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KG4uX1dIRUVMX0VWRU5UX05BTUUscCl9O24ucHJvdG90eXBlLm9uRGJsQ2xpY2s9ZnVuY3Rpb24ocCl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChuLl9EQkxDTElDS19FVkVOVF9OQU1FLHApfTtuLnByb3RvdHlwZS5vZmZEYmxDbGljaz1mdW5jdGlvbihwKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KG4uX0RCTENMSUNLX0VWRU5UX05BTUUscCl9O24ucHJvdG90eXBlLl9tZWFzdXJlQW5kRGlzcGF0Y2g9ZnVuY3Rpb24ocCxxLHIsdCl7dm9pZCAwPT09dCYmKHQ9ImVsZW1lbnQiKTtpZigicGFnZSIhPT10JiYiZWxlbWVudCIhPT10KXRocm93IEVycm9yKCJJbnZhbGlkIHNjb3BlICciK3QrCiInLCBtdXN0IGJlICdlbGVtZW50JyBvciAncGFnZSciKTtpZigicGFnZSI9PT10fHx0aGlzLmV2ZW50SW5zaWRlKHAscSkpdGhpcy5fbGFzdE1vdXNlUG9zaXRpb249dGhpcy5fdHJhbnNsYXRvci5jb21wdXRlUG9zaXRpb24ocS5jbGllbnRYLHEuY2xpZW50WSksdGhpcy5fY2FsbENhbGxiYWNrc0ZvckV2ZW50KHIsdGhpcy5sYXN0TW91c2VQb3NpdGlvbigpLHEpfTtuLnByb3RvdHlwZS5ldmVudEluc2lkZT1mdW5jdGlvbihwLHEpe3JldHVybiBsLlRyYW5zbGF0b3IuaXNFdmVudEluc2lkZShwLHEpfTtuLnByb3RvdHlwZS5sYXN0TW91c2VQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYXN0TW91c2VQb3NpdGlvbn07cmV0dXJuIG59KGYoMjQpLkRpc3BhdGNoZXIpO2MuX0RJU1BBVENIRVJfS0VZPSJfX1Bsb3R0YWJsZV9EaXNwYXRjaGVyX01vdXNlIjtjLl9NT1VTRU9WRVJfRVZFTlRfTkFNRT0ibW91c2VvdmVyIjtjLl9NT1VTRU1PVkVfRVZFTlRfTkFNRT0ibW91c2Vtb3ZlIjsKYy5fTU9VU0VPVVRfRVZFTlRfTkFNRT0ibW91c2VvdXQiO2MuX01PVVNFRE9XTl9FVkVOVF9OQU1FPSJtb3VzZWRvd24iO2MuX01PVVNFVVBfRVZFTlRfTkFNRT0ibW91c2V1cCI7Yy5fV0hFRUxfRVZFTlRfTkFNRT0id2hlZWwiO2MuX0RCTENMSUNLX0VWRU5UX05BTUU9ImRibGNsaWNrIjtkLk1vdXNlPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oayxuKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWZvcih2YXIgcSBpbiBuKW4uaGFzT3duUHJvcGVydHkocSkmJihrW3FdPW5bcV0pO2sucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHAucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyBwKX0sbD1mKDApO2M9ZnVuY3Rpb24oayl7ZnVuY3Rpb24gbihwKXt2YXIgcT1rLmNhbGwodGhpcyl8fHRoaXM7cS5fdHJhbnNsYXRvcj1sLmdldFRyYW5zbGF0b3IocCk7cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltuLl9UT1VDSFNUQVJUX0VWRU5UX05BTUVdPQpmdW5jdGlvbihyKXtyZXR1cm4gcS5fbWVhc3VyZUFuZERpc3BhdGNoKHAscixuLl9UT1VDSFNUQVJUX0VWRU5UX05BTUUsInBhZ2UiKX07cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltuLl9UT1VDSE1PVkVfRVZFTlRfTkFNRV09ZnVuY3Rpb24ocil7cmV0dXJuIHEuX21lYXN1cmVBbmREaXNwYXRjaChwLHIsbi5fVE9VQ0hNT1ZFX0VWRU5UX05BTUUsInBhZ2UiKX07cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltuLl9UT1VDSEVORF9FVkVOVF9OQU1FXT1mdW5jdGlvbihyKXtyZXR1cm4gcS5fbWVhc3VyZUFuZERpc3BhdGNoKHAscixuLl9UT1VDSEVORF9FVkVOVF9OQU1FLCJwYWdlIil9O3EuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bbi5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRV09ZnVuY3Rpb24ocil7cmV0dXJuIHEuX21lYXN1cmVBbmREaXNwYXRjaChwLHIsbi5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRSwicGFnZSIpfTtyZXR1cm4gcX1nKG4sayk7bi5nZXREaXNwYXRjaGVyPQpmdW5jdGlvbihwKXt2YXIgcT1wLnJvb3QoKS5yb290RWxlbWVudCgpLHI9cVtuLl9ESVNQQVRDSEVSX0tFWV07bnVsbD09ciYmKHI9bmV3IG4ocCkscVtuLl9ESVNQQVRDSEVSX0tFWV09cik7cmV0dXJuIHJ9O24ucHJvdG90eXBlLm9uVG91Y2hTdGFydD1mdW5jdGlvbihwKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KG4uX1RPVUNIU1RBUlRfRVZFTlRfTkFNRSxwKX07bi5wcm90b3R5cGUub2ZmVG91Y2hTdGFydD1mdW5jdGlvbihwKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KG4uX1RPVUNIU1RBUlRfRVZFTlRfTkFNRSxwKX07bi5wcm90b3R5cGUub25Ub3VjaE1vdmU9ZnVuY3Rpb24ocCl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChuLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSxwKX07bi5wcm90b3R5cGUub2ZmVG91Y2hNb3ZlPWZ1bmN0aW9uKHApe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQobi5fVE9VQ0hNT1ZFX0VWRU5UX05BTUUscCl9O24ucHJvdG90eXBlLm9uVG91Y2hFbmQ9CmZ1bmN0aW9uKHApe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQobi5fVE9VQ0hFTkRfRVZFTlRfTkFNRSxwKX07bi5wcm90b3R5cGUub2ZmVG91Y2hFbmQ9ZnVuY3Rpb24ocCl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChuLl9UT1VDSEVORF9FVkVOVF9OQU1FLHApfTtuLnByb3RvdHlwZS5vblRvdWNoQ2FuY2VsPWZ1bmN0aW9uKHApe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQobi5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRSxwKX07bi5wcm90b3R5cGUub2ZmVG91Y2hDYW5jZWw9ZnVuY3Rpb24ocCl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChuLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FLHApfTtuLnByb3RvdHlwZS5fbWVhc3VyZUFuZERpc3BhdGNoPWZ1bmN0aW9uKHAscSxyLHQpe3ZvaWQgMD09PXQmJih0PSJlbGVtZW50Iik7aWYoInBhZ2UiIT09dCYmImVsZW1lbnQiIT09dCl0aHJvdyBFcnJvcigiSW52YWxpZCBzY29wZSAnIit0KyInLCBtdXN0IGJlICdlbGVtZW50JyBvciAncGFnZSciKTsKaWYoImVsZW1lbnQiIT09dHx8dGhpcy5ldmVudEluc2lkZShwLHEpKXtwPXEuY2hhbmdlZFRvdWNoZXM7dD17fTtmb3IodmFyIHY9W10seT0wO3k8cC5sZW5ndGg7eSsrKXt2YXIgej1wW3ldLHg9ei5pZGVudGlmaWVyO3o9dGhpcy5fdHJhbnNsYXRvci5jb21wdXRlUG9zaXRpb24oei5jbGllbnRYLHouY2xpZW50WSk7bnVsbCE9eiYmKHRbeF09eix2LnB1c2goeCkpfTA8di5sZW5ndGgmJnRoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChyLHYsdCxxKX19O24ucHJvdG90eXBlLmV2ZW50SW5zaWRlPWZ1bmN0aW9uKHAscSl7cmV0dXJuIGwuVHJhbnNsYXRvci5pc0V2ZW50SW5zaWRlKHAscSl9O3JldHVybiBufShmKDI0KS5EaXNwYXRjaGVyKTtjLl9ESVNQQVRDSEVSX0tFWT0iX19QbG90dGFibGVfRGlzcGF0Y2hlcl9Ub3VjaCI7Yy5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FPSJ0b3VjaHN0YXJ0IjtjLl9UT1VDSE1PVkVfRVZFTlRfTkFNRT0idG91Y2htb3ZlIjtjLl9UT1VDSEVORF9FVkVOVF9OQU1FPQoidG91Y2hlbmQiO2MuX1RPVUNIQ0FOQ0VMX0VWRU5UX05BTUU9InRvdWNoY2FuY2VsIjtkLlRvdWNoPWN9LGZ1bmN0aW9uKGMsZCl7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGYoZyxsLGspe3ZvaWQgMD09PWsmJihrPXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTt0aGlzLnNjcmVlbldpZHRoPWc7dGhpcy5zY3JlZW5IZWlnaHQ9bDt0aGlzLmRldmljZVBpeGVsUmF0aW89azt0aGlzLnBpeGVsV2lkdGg9ZyprO3RoaXMucGl4ZWxIZWlnaHQ9bCprO3RoaXMuY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3RoaXMuY3R4PXRoaXMuY2FudmFzLmdldENvbnRleHQoIjJkIik7Zi5zaXplUGl4ZWxzKHRoaXMuY3R4LGcsbCxrKX1mLnNpemVQaXhlbHM9ZnVuY3Rpb24oZyxsLGssbil7dmFyIHA9Zy5jYW52YXM7cC53aWR0aD1sKm47cC5oZWlnaHQ9aypuO3Auc3R5bGUud2lkdGg9bCsicHgiO3Auc3R5bGUuaGVpZ2h0PWsrInB4IjtnLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsCjApO2cuc2NhbGUobixuKX07Zi5wcm90b3R5cGUuYmxpdD1mdW5jdGlvbihnLGwsayl7dm9pZCAwPT09bCYmKGw9MCk7dm9pZCAwPT09ayYmKGs9MCk7Zy5kcmF3SW1hZ2UodGhpcy5jYW52YXMsbCxrLHRoaXMuc2NyZWVuV2lkdGgsdGhpcy5zY3JlZW5IZWlnaHQpfTtmLnByb3RvdHlwZS5ibGl0Q2VudGVyPWZ1bmN0aW9uKGcsbCxrKXt2b2lkIDA9PT1sJiYobD0wKTt2b2lkIDA9PT1rJiYoaz0wKTt0aGlzLmJsaXQoZyxNYXRoLmZsb29yKGwtdGhpcy5zY3JlZW5XaWR0aC8yKSxNYXRoLmZsb29yKGstdGhpcy5zY3JlZW5IZWlnaHQvMikpfTtmLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oZyxsLGspe3ZvaWQgMD09PWsmJihrPSExKTt2YXIgbj10aGlzLmRldmljZVBpeGVsUmF0aW87dGhpcy5zY3JlZW5XaWR0aD1nO3RoaXMuc2NyZWVuSGVpZ2h0PWw7dGhpcy5waXhlbFdpZHRoPWcqbjt0aGlzLnBpeGVsSGVpZ2h0PWwqbjtmLnNpemVQaXhlbHModGhpcy5jdHgsZyxsLG4pO2smJgp0aGlzLmN0eC50cmFuc2xhdGUoZy8yLGcvMik7cmV0dXJuIHRoaXN9O2YucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKGcpe3ZhciBsPXRoaXMucGl4ZWxXaWR0aCxrPXRoaXMucGl4ZWxIZWlnaHQsbj10aGlzLmN0eDtuLnNhdmUoKTtuLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCk7bnVsbD09Zz9uLmNsZWFyUmVjdCgwLDAsbCxrKToobi5maWxsU3R5bGU9ZyxuLmZpbGxSZWN0KDAsMCxsLGspKTtuLnJlc3RvcmUoKTtyZXR1cm4gdGhpc307Zi5wcm90b3R5cGUuZ2V0SW1hZ2VEYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3R4LmdldEltYWdlRGF0YSgwLDAsdGhpcy5waXhlbFdpZHRoLHRoaXMucGl4ZWxIZWlnaHQpfTtyZXR1cm4gZn0oKTtkLkNhbnZhc0J1ZmZlcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG4scCl7ZnVuY3Rpb24gcSgpe3RoaXMuY29uc3RydWN0b3I9bn1mb3IodmFyIHIgaW4gcClwLmhhc093blByb3BlcnR5KHIpJiYKKG5bcl09cFtyXSk7bi5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToocS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IHEpfSxsPWYoMTMpLGs9ZigwKTtjPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHAoKXt2YXIgcT1udWxsIT09biYmbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cS5fY2xpY2tlZERvd249ITE7cS5fZG91YmxlQ2xpY2tpbmc9ITE7cS5fb25DbGlja0NhbGxiYWNrcz1uZXcgay5DYWxsYmFja1NldDtxLl9vbkRvdWJsZUNsaWNrQ2FsbGJhY2tzPW5ldyBrLkNhbGxiYWNrU2V0O3EuX21vdXNlRG93bkNhbGxiYWNrPWZ1bmN0aW9uKHIpe3JldHVybiBxLl9oYW5kbGVDbGlja0Rvd24ocil9O3EuX21vdXNlVXBDYWxsYmFjaz1mdW5jdGlvbihyLHQpe3JldHVybiBxLl9oYW5kbGVDbGlja1VwKHIsdCl9O3EuX2RibENsaWNrQ2FsbGJhY2s9ZnVuY3Rpb24ocix0KXtyZXR1cm4gcS5faGFuZGxlRGJsQ2xpY2socix0KX07cS5fdG91Y2hTdGFydENhbGxiYWNrPQpmdW5jdGlvbihyLHQpe3JldHVybiBxLl9oYW5kbGVDbGlja0Rvd24odFtyWzBdXSl9O3EuX3RvdWNoRW5kQ2FsbGJhY2s9ZnVuY3Rpb24ocix0LHYpe3JldHVybiBxLl9oYW5kbGVDbGlja1VwKHRbclswXV0sdil9O3EuX3RvdWNoQ2FuY2VsQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gcS5fY2xpY2tlZERvd249ITF9O3JldHVybiBxfWcocCxuKTtwLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKHEpe24ucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLHEpO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1sLk1vdXNlLmdldERpc3BhdGNoZXIocSk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VEb3duKHRoaXMuX21vdXNlRG93bkNhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uRGJsQ2xpY2sodGhpcy5fZGJsQ2xpY2tDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPQpsLlRvdWNoLmdldERpc3BhdGNoZXIocSk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoQ2FuY2VsKHRoaXMuX3RvdWNoQ2FuY2VsQ2FsbGJhY2spfTtwLnByb3RvdHlwZS5fdW5hbmNob3I9ZnVuY3Rpb24oKXtuLnByb3RvdHlwZS5fdW5hbmNob3IuY2FsbCh0aGlzKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmTW91c2VEb3duKHRoaXMuX21vdXNlRG93bkNhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmTW91c2VVcCh0aGlzLl9tb3VzZVVwQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZEYmxDbGljayh0aGlzLl9kYmxDbGlja0NhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXI9bnVsbDt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spOwp0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoQ2FuY2VsKHRoaXMuX3RvdWNoQ2FuY2VsQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj1udWxsfTtwLnByb3RvdHlwZS5faGFuZGxlQ2xpY2tEb3duPWZ1bmN0aW9uKHEpe3E9dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShxKTt0aGlzLl9pc0luc2lkZUNvbXBvbmVudChxKSYmKHRoaXMuX2NsaWNrZWREb3duPSEwLHRoaXMuX2NsaWNrZWRQb2ludD1xKX07cC5wcm90b3R5cGUuX2hhbmRsZUNsaWNrVXA9ZnVuY3Rpb24ocSxyKXt2YXIgdD10aGlzLHY9dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShxKTt0aGlzLl9jbGlja2VkRG93biYmcC5fcG9pbnRzRXF1YWwodix0aGlzLl9jbGlja2VkUG9pbnQpJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5fZG91YmxlQ2xpY2tpbmd8fHQuX29uQ2xpY2tDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh2LApyKX0sMCk7dGhpcy5fY2xpY2tlZERvd249ITF9O3AucHJvdG90eXBlLl9oYW5kbGVEYmxDbGljaz1mdW5jdGlvbihxLHIpe3ZhciB0PXRoaXM7cT10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHEpO3RoaXMuX2RvdWJsZUNsaWNraW5nPSEwO3RoaXMuX29uRG91YmxlQ2xpY2tDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhxLHIpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gdC5fZG91YmxlQ2xpY2tpbmc9ITF9LDApfTtwLl9wb2ludHNFcXVhbD1mdW5jdGlvbihxLHIpe3JldHVybiBxLng9PT1yLngmJnEueT09PXIueX07cC5wcm90b3R5cGUub25DbGljaz1mdW5jdGlvbihxKXt0aGlzLl9vbkNsaWNrQ2FsbGJhY2tzLmFkZChxKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUub2ZmQ2xpY2s9ZnVuY3Rpb24ocSl7dGhpcy5fb25DbGlja0NhbGxiYWNrcy5kZWxldGUocSl9O3AucHJvdG90eXBlLm9uRG91YmxlQ2xpY2s9ZnVuY3Rpb24ocSl7dGhpcy5fb25Eb3VibGVDbGlja0NhbGxiYWNrcy5hZGQocSl9OwpwLnByb3RvdHlwZS5vZmZEb3VibGVDbGljaz1mdW5jdGlvbihxKXt0aGlzLl9vbkRvdWJsZUNsaWNrQ2FsbGJhY2tzLmRlbGV0ZShxKTtyZXR1cm4gdGhpc307cmV0dXJuIHB9KGYoMTUpLkludGVyYWN0aW9uKTtkLkNsaWNrPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixwKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgciBpbiBwKXAuaGFzT3duUHJvcGVydHkocikmJihuW3JdPXBbcl0pO24ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX0sbD1mKDEzKSxrPWYoMCk7Yz1mdW5jdGlvbihuKXtmdW5jdGlvbiBwKCl7dmFyIHE9bnVsbCE9PW4mJm4uYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3EuX2RyYWdnaW5nPSExO3EuX2NvbnN0cmFpbmVkVG9Db21wb25lbnQ9ITA7cS5fbW91c2VGaWx0ZXI9cC5fREVGQVVMVF9NT1VTRV9GSUxURVI7CnEuX2RyYWdTdGFydENhbGxiYWNrcz1uZXcgay5DYWxsYmFja1NldDtxLl9kcmFnQ2FsbGJhY2tzPW5ldyBrLkNhbGxiYWNrU2V0O3EuX2RyYWdFbmRDYWxsYmFja3M9bmV3IGsuQ2FsbGJhY2tTZXQ7cS5fbW91c2VEb3duQ2FsbGJhY2s9ZnVuY3Rpb24ocix0KXtyZXR1cm4gcS5fc3RhcnREcmFnKHIsdCl9O3EuX21vdXNlTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKHIpe3JldHVybiBxLl9kb0RyYWcocil9O3EuX21vdXNlVXBDYWxsYmFjaz1mdW5jdGlvbihyLHQpe3JldHVybiBxLl9lbmREcmFnKHIsdCl9O3EuX3RvdWNoU3RhcnRDYWxsYmFjaz1mdW5jdGlvbihyLHQsdil7cmV0dXJuIHEuX3N0YXJ0RHJhZyh0W3JbMF1dLHYpfTtxLl90b3VjaE1vdmVDYWxsYmFjaz1mdW5jdGlvbihyLHQpe3JldHVybiBxLl9kb0RyYWcodFtyWzBdXSl9O3EuX3RvdWNoRW5kQ2FsbGJhY2s9ZnVuY3Rpb24ocix0LHYpe3JldHVybiBxLl9lbmREcmFnKHRbclswXV0sdil9O3JldHVybiBxfWcocCxuKTtwLnByb3RvdHlwZS5fYW5jaG9yPQpmdW5jdGlvbihxKXtuLnByb3RvdHlwZS5fYW5jaG9yLmNhbGwodGhpcyxxKTt0aGlzLl9tb3VzZURpc3BhdGNoZXI9bC5Nb3VzZS5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlRG93bih0aGlzLl9tb3VzZURvd25DYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPWwuVG91Y2guZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hNb3ZlKHRoaXMuX3RvdWNoTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaEVuZCh0aGlzLl90b3VjaEVuZENhbGxiYWNrKX07CnAucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe24ucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZURvd24odGhpcy5fbW91c2VEb3duQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGw7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hNb3ZlKHRoaXMuX3RvdWNoTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPW51bGx9O3AucHJvdG90eXBlLl90cmFuc2xhdGVBbmRDb25zdHJhaW49CmZ1bmN0aW9uKHEpe3E9dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShxKTtyZXR1cm4gdGhpcy5fY29uc3RyYWluZWRUb0NvbXBvbmVudD97eDprLk1hdGguY2xhbXAocS54LDAsdGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby53aWR0aCgpKSx5OmsuTWF0aC5jbGFtcChxLnksMCx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLmhlaWdodCgpKX06cX07cC5wcm90b3R5cGUuX3N0YXJ0RHJhZz1mdW5jdGlvbihxLHIpe3IgaW5zdGFuY2VvZiBNb3VzZUV2ZW50JiYhdGhpcy5fbW91c2VGaWx0ZXIocil8fChxPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UocSksdGhpcy5faXNJbnNpZGVDb21wb25lbnQocSkmJihyLnByZXZlbnREZWZhdWx0KCksdGhpcy5fZHJhZ2dpbmc9ITAsdGhpcy5fZHJhZ09yaWdpbj1xLHRoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMuX2RyYWdPcmlnaW4pKSl9O3AucHJvdG90eXBlLl9kb0RyYWc9ZnVuY3Rpb24ocSl7dGhpcy5fZHJhZ2dpbmcmJgp0aGlzLl9kcmFnQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcy5fZHJhZ09yaWdpbix0aGlzLl90cmFuc2xhdGVBbmRDb25zdHJhaW4ocSkpfTtwLnByb3RvdHlwZS5fZW5kRHJhZz1mdW5jdGlvbihxLHIpe3IgaW5zdGFuY2VvZiBNb3VzZUV2ZW50JiYwIT09ci5idXR0b258fCF0aGlzLl9kcmFnZ2luZ3x8KHRoaXMuX2RyYWdnaW5nPSExLHRoaXMuX2RyYWdFbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzLl9kcmFnT3JpZ2luLHRoaXMuX3RyYW5zbGF0ZUFuZENvbnN0cmFpbihxKSkpfTtwLnByb3RvdHlwZS5jb25zdHJhaW5lZFRvQ29tcG9uZW50PWZ1bmN0aW9uKCl7dGhpcy5fY29uc3RyYWluZWRUb0NvbXBvbmVudD0hMX07cC5wcm90b3R5cGUubW91c2VGaWx0ZXI9ZnVuY3Rpb24ocSl7MCE9PWFyZ3VtZW50cy5sZW5ndGgmJih0aGlzLl9tb3VzZUZpbHRlcj1xKX07cC5wcm90b3R5cGUub25EcmFnU3RhcnQ9ZnVuY3Rpb24ocSl7dGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmFkZChxKX07CnAucHJvdG90eXBlLm9mZkRyYWdTdGFydD1mdW5jdGlvbihxKXt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZGVsZXRlKHEpfTtwLnByb3RvdHlwZS5vbkRyYWc9ZnVuY3Rpb24ocSl7dGhpcy5fZHJhZ0NhbGxiYWNrcy5hZGQocSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLm9mZkRyYWc9ZnVuY3Rpb24ocSl7dGhpcy5fZHJhZ0NhbGxiYWNrcy5kZWxldGUocSl9O3AucHJvdG90eXBlLm9uRHJhZ0VuZD1mdW5jdGlvbihxKXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmFkZChxKX07cC5wcm90b3R5cGUub2ZmRHJhZ0VuZD1mdW5jdGlvbihxKXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZShxKX07cmV0dXJuIHB9KGYoMTUpLkludGVyYWN0aW9uKTtjLl9ERUZBVUxUX01PVVNFX0ZJTFRFUj1mdW5jdGlvbihuKXtyZXR1cm4gMD09PW4uYnV0dG9ufTtkLkRyYWc9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih0LHYpe2Z1bmN0aW9uIHkoKXt0aGlzLmNvbnN0cnVjdG9yPQp0fWZvcih2YXIgeiBpbiB2KXYuaGFzT3duUHJvcGVydHkoeikmJih0W3pdPXZbel0pO3QucHJvdG90eXBlPW51bGw9PT12P09iamVjdC5jcmVhdGUodik6KHkucHJvdG90eXBlPXYucHJvdG90eXBlLG5ldyB5KX0sbD1mKDEpLGs9ZigxMyksbj1mKDMpLHA9ZigwKSxxPWYoMjUpO2M9ZigxNSk7dmFyIHI9ZigyNik7Zj1mdW5jdGlvbih0KXtmdW5jdGlvbiB2KHkseil7dmFyIHg9dC5jYWxsKHRoaXMpfHx0aGlzO3guX3doZWVsRmlsdGVyPWZ1bmN0aW9uKCl7cmV0dXJuITB9O3guX3doZWVsQ2FsbGJhY2s9ZnVuY3Rpb24oQyxGKXtyZXR1cm4geC5faGFuZGxlV2hlZWxFdmVudChDLEYpfTt4Ll90b3VjaFN0YXJ0Q2FsbGJhY2s9ZnVuY3Rpb24oQyxGKXtyZXR1cm4geC5faGFuZGxlVG91Y2hTdGFydChDLEYpfTt4Ll90b3VjaE1vdmVDYWxsYmFjaz1mdW5jdGlvbihDLEYpe3JldHVybiB4Ll9oYW5kbGVQaW5jaChDLEYpfTt4Ll90b3VjaEVuZENhbGxiYWNrPWZ1bmN0aW9uKEMpe3JldHVybiB4Ll9oYW5kbGVUb3VjaEVuZChDKX07CnguX3RvdWNoQ2FuY2VsQ2FsbGJhY2s9ZnVuY3Rpb24oQyl7cmV0dXJuIHguX2hhbmRsZVRvdWNoRW5kKEMpfTt4Ll9wYW5FbmRDYWxsYmFja3M9bmV3IHAuQ2FsbGJhY2tTZXQ7eC5fem9vbUVuZENhbGxiYWNrcz1uZXcgcC5DYWxsYmFja1NldDt4Ll9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzPW5ldyBwLkNhbGxiYWNrU2V0O3guX3hTY2FsZXM9bmV3IHAuU2V0O3guX3lTY2FsZXM9bmV3IHAuU2V0O3guX2RyYWdJbnRlcmFjdGlvbj1uZXcgcS5EcmFnO3guX3NldHVwRHJhZ0ludGVyYWN0aW9uKCk7eC5fdG91Y2hJZHM9bC5tYXAoKTt4Ll9taW5Eb21haW5FeHRlbnRzPW5ldyBwLk1hcDt4Ll9tYXhEb21haW5FeHRlbnRzPW5ldyBwLk1hcDt4Ll9taW5Eb21haW5WYWx1ZXM9bmV3IHAuTWFwO3guX21heERvbWFpblZhbHVlcz1uZXcgcC5NYXA7bnVsbCE9eSYmeC5hZGRYU2NhbGUoeSk7bnVsbCE9eiYmeC5hZGRZU2NhbGUoeik7cmV0dXJuIHh9Zyh2LHQpO3YucHJvdG90eXBlLmRyYWdJbnRlcmFjdGlvbj0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZHJhZ0ludGVyYWN0aW9ufTt2LnByb3RvdHlwZS53aGVlbEZpbHRlcj1mdW5jdGlvbih5KXswIT09YXJndW1lbnRzLmxlbmd0aCYmKHRoaXMuX3doZWVsRmlsdGVyPXkpfTt2LnByb3RvdHlwZS5wYW49ZnVuY3Rpb24oeSl7dmFyIHo9dGhpczt0aGlzLnhTY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHgpe3gucGFuKHouX2NvbnN0cmFpbmVkVHJhbnNsYXRpb24oeCx5LngpKX0pO3RoaXMueVNjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oeCl7eC5wYW4oei5fY29uc3RyYWluZWRUcmFuc2xhdGlvbih4LHkueSkpfSk7dGhpcy5fcGFuWm9vbVVwZGF0ZUNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCl9O3YucHJvdG90eXBlLnpvb209ZnVuY3Rpb24oeSx6LHgpe3ZhciBDPXRoaXM7dm9pZCAwPT09eCYmKHg9ITApO2lmKG51bGwhPXope3ZhciBGPXoueDt2YXIgRD16Lnk7eCYmKHRoaXMueFNjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oQil7Qj1DLl9jb25zdHJhaW5lZFpvb20oQiwKeSxGKTtGPUIuY2VudGVyUG9pbnQ7eT1CLnpvb21BbW91bnR9KSx0aGlzLnlTY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe0I9Qy5fY29uc3RyYWluZWRab29tKEIseSxEKTtEPUIuY2VudGVyUG9pbnQ7eT1CLnpvb21BbW91bnR9KSl9dGhpcy54U2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbihCKXt2YXIgST1CLnJhbmdlKCk7Qi56b29tKHksbnVsbD09Rj8oSVsxXStJWzBdKS8yOkYpfSk7dGhpcy55U2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbihCKXt2YXIgST1CLnJhbmdlKCk7Qi56b29tKHksbnVsbD09RD8oSVsxXStJWzBdKS8yOkQpfSk7dGhpcy5fcGFuWm9vbVVwZGF0ZUNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCk7cmV0dXJue3pvb21BbW91bnQ6eSxjZW50ZXJWYWx1ZTp7Y2VudGVyWDpGLGNlbnRlclk6RH19fTt2LnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKHkpe3QucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLHkpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyh5KTsKdGhpcy5fbW91c2VEaXNwYXRjaGVyPWsuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25XaGVlbCh0aGlzLl93aGVlbENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9ay5Ub3VjaC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaE1vdmUodGhpcy5fdG91Y2hNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoQ2FuY2VsKHRoaXMuX3RvdWNoQ2FuY2VsQ2FsbGJhY2spfTt2LnByb3RvdHlwZS5fdW5hbmNob3I9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5fdW5hbmNob3IuY2FsbCh0aGlzKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmV2hlZWwodGhpcy5fd2hlZWxDYWxsYmFjayk7CnRoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoTW92ZSh0aGlzLl90b3VjaE1vdmVDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaENhbmNlbCh0aGlzLl90b3VjaENhbmNlbENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bnVsbDt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCl9O3YucHJvdG90eXBlLl9oYW5kbGVUb3VjaFN0YXJ0PWZ1bmN0aW9uKHkseil7Zm9yKHZhciB4PTA7eDx5Lmxlbmd0aCYmMj50aGlzLl90b3VjaElkcy5zaXplKCk7eCsrKXt2YXIgQz15W3hdO3RoaXMuX3RvdWNoSWRzLnNldChDLnRvU3RyaW5nKCksdGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZSh6W0NdKSl9fTsKdi5wcm90b3R5cGUuX2hhbmRsZVBpbmNoPWZ1bmN0aW9uKHkseil7dmFyIHg9dGhpcztpZighKDI+dGhpcy5fdG91Y2hJZHMuc2l6ZSgpKSl7dmFyIEM9dGhpcy5fdG91Y2hJZHMudmFsdWVzKCk7aWYodGhpcy5faXNJbnNpZGVDb21wb25lbnQodGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShDWzBdKSkmJnRoaXMuX2lzSW5zaWRlQ29tcG9uZW50KHRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UoQ1sxXSkpKXt2YXIgRj12Ll9wb2ludERpc3RhbmNlKENbMF0sQ1sxXSk7aWYoMCE9PUYpe3kuZm9yRWFjaChmdW5jdGlvbihQKXt4Ll90b3VjaElkcy5oYXMoUC50b1N0cmluZygpKSYmeC5fdG91Y2hJZHMuc2V0KFAudG9TdHJpbmcoKSx4Ll90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHpbUF0pKX0pO3k9dGhpcy5fdG91Y2hJZHMudmFsdWVzKCk7dmFyIEQ9di5fcG9pbnREaXN0YW5jZSh5WzBdLHlbMV0pO2lmKDAhPT1EKXt2YXIgQj1GL0QsST15Lm1hcChmdW5jdGlvbihQLApIKXtyZXR1cm57eDooUC54LUNbSF0ueCkvQix5OihQLnktQ1tIXS55KS9CfX0pO0Y9di5jZW50ZXJQb2ludChDWzBdLENbMV0pO0Y9dGhpcy56b29tKEIsRik7eT1GLmNlbnRlclZhbHVlO3ZhciBPPUYuem9vbUFtb3VudDtGPXkuY2VudGVyWDt5PXkuY2VudGVyWTtEPUMubWFwKGZ1bmN0aW9uKFAsSCl7cmV0dXJue3g6SVtIXS54Kk8rUC54LHk6SVtIXS55Kk8rUC55fX0pO3RoaXMucGFuKHt4OkYtKERbMF0ueCtEWzFdLngpLzIseTp5LShEWzBdLnkrRFsxXS55KS8yfSl9fX19fTt2LmNlbnRlclBvaW50PWZ1bmN0aW9uKHkseil7cmV0dXJue3g6KE1hdGgubWluKHkueCx6LngpK01hdGgubWF4KHkueCx6LngpKS8yLHk6KE1hdGgubWF4KHkueSx6LnkpK01hdGgubWluKHkueSx6LnkpKS8yfX07di5fcG9pbnREaXN0YW5jZT1mdW5jdGlvbih5LHope3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coTWF0aC5tYXgoeS54LHoueCktTWF0aC5taW4oeS54LHoueCksMikrTWF0aC5wb3coTWF0aC5tYXgoeS55LAp6LnkpLU1hdGgubWluKHkueSx6LnkpLDIpKX07di5wcm90b3R5cGUuX2hhbmRsZVRvdWNoRW5kPWZ1bmN0aW9uKHkpe3ZhciB6PXRoaXM7eS5mb3JFYWNoKGZ1bmN0aW9uKHgpe3ouX3RvdWNoSWRzLnJlbW92ZSh4LnRvU3RyaW5nKCkpfSk7MDx0aGlzLl90b3VjaElkcy5zaXplKCkmJnRoaXMuX3pvb21FbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcygpfTt2LnByb3RvdHlwZS5faGFuZGxlV2hlZWxFdmVudD1mdW5jdGlvbih5LHope3RoaXMuX3doZWVsRmlsdGVyKHopJiYoeT10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHkpLHRoaXMuX2lzSW5zaWRlQ29tcG9uZW50KHkpJiYoei5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuem9vbShNYXRoLnBvdygyLCgwIT09ei5kZWx0YVk/ei5kZWx0YVk6ei5kZWx0YVgpKih6LmRlbHRhTW9kZT92Ll9QSVhFTFNfUEVSX0xJTkU6MSkqLjAwMikseSksdGhpcy5fem9vbUVuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCkpKX07di5wcm90b3R5cGUuX2NvbnN0cmFpbmVkWm9vbT0KZnVuY3Rpb24oeSx6LHgpe3JldHVybiByLmNvbnN0cmFpbmVkWm9vbSh5LHoseCx0aGlzLm1pbkRvbWFpbkV4dGVudCh5KSx0aGlzLm1heERvbWFpbkV4dGVudCh5KSx0aGlzLm1pbkRvbWFpblZhbHVlKHkpLHRoaXMubWF4RG9tYWluVmFsdWUoeSkpfTt2LnByb3RvdHlwZS5fY29uc3RyYWluZWRUcmFuc2xhdGlvbj1mdW5jdGlvbih5LHope3JldHVybiByLmNvbnN0cmFpbmVkVHJhbnNsYXRpb24oeSx6LHRoaXMubWluRG9tYWluVmFsdWUoeSksdGhpcy5tYXhEb21haW5WYWx1ZSh5KSl9O3YucHJvdG90eXBlLl9zZXR1cERyYWdJbnRlcmFjdGlvbj1mdW5jdGlvbigpe3ZhciB5PXRoaXM7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmNvbnN0cmFpbmVkVG9Db21wb25lbnQoKTt2YXIgejt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQoZnVuY3Rpb24oKXtyZXR1cm4gej1udWxsfSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZyhmdW5jdGlvbih4LEMpezI8PXkuX3RvdWNoSWRzLnNpemUoKXx8Cih5LnBhbih7eDoobnVsbD09ej94Lng6ei54KS1DLngseToobnVsbD09ej94Lnk6ei55KS1DLnl9KSx6PUMpfSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZChmdW5jdGlvbigpe3JldHVybiB5Ll9wYW5FbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcygpfSl9O3YucHJvdG90eXBlLl9ub25MaW5lYXJTY2FsZVdpdGhFeHRlbnRzPWZ1bmN0aW9uKHkpe3JldHVybiBudWxsIT10aGlzLm1pbkRvbWFpbkV4dGVudCh5KSYmbnVsbCE9dGhpcy5tYXhEb21haW5FeHRlbnQoeSkmJiEoeSBpbnN0YW5jZW9mIG4uTGluZWFyKSYmISh5IGluc3RhbmNlb2Ygbi5UaW1lKX07di5wcm90b3R5cGUueFNjYWxlcz1mdW5jdGlvbigpe3ZhciB5PVtdO3RoaXMuX3hTY2FsZXMuZm9yRWFjaChmdW5jdGlvbih6KXt5LnB1c2goeil9KTtyZXR1cm4geX07di5wcm90b3R5cGUueVNjYWxlcz1mdW5jdGlvbigpe3ZhciB5PVtdO3RoaXMuX3lTY2FsZXMuZm9yRWFjaChmdW5jdGlvbih6KXt5LnB1c2goeil9KTsKcmV0dXJuIHl9O3YucHJvdG90eXBlLmFkZFhTY2FsZT1mdW5jdGlvbih5KXt0aGlzLl94U2NhbGVzLmFkZCh5KX07di5wcm90b3R5cGUucmVtb3ZlWFNjYWxlPWZ1bmN0aW9uKHkpe3RoaXMuX3hTY2FsZXMuZGVsZXRlKHkpO3RoaXMuX21pbkRvbWFpbkV4dGVudHMuZGVsZXRlKHkpO3RoaXMuX21heERvbWFpbkV4dGVudHMuZGVsZXRlKHkpO3RoaXMuX21pbkRvbWFpblZhbHVlcy5kZWxldGUoeSk7dGhpcy5fbWF4RG9tYWluVmFsdWVzLmRlbGV0ZSh5KTtyZXR1cm4gdGhpc307di5wcm90b3R5cGUuYWRkWVNjYWxlPWZ1bmN0aW9uKHkpe3RoaXMuX3lTY2FsZXMuYWRkKHkpfTt2LnByb3RvdHlwZS5yZW1vdmVZU2NhbGU9ZnVuY3Rpb24oeSl7dGhpcy5feVNjYWxlcy5kZWxldGUoeSk7dGhpcy5fbWluRG9tYWluRXh0ZW50cy5kZWxldGUoeSk7dGhpcy5fbWF4RG9tYWluRXh0ZW50cy5kZWxldGUoeSk7dGhpcy5fbWluRG9tYWluVmFsdWVzLmRlbGV0ZSh5KTt0aGlzLl9tYXhEb21haW5WYWx1ZXMuZGVsZXRlKHkpOwpyZXR1cm4gdGhpc307di5wcm90b3R5cGUubWluRG9tYWluRXh0ZW50PWZ1bmN0aW9uKHkpe3JldHVybiB0aGlzLl9taW5Eb21haW5FeHRlbnRzLmdldCh5KX07di5wcm90b3R5cGUubWF4RG9tYWluRXh0ZW50PWZ1bmN0aW9uKHkpe3JldHVybiB0aGlzLl9tYXhEb21haW5FeHRlbnRzLmdldCh5KX07di5wcm90b3R5cGUubWluRG9tYWluVmFsdWU9ZnVuY3Rpb24oeSx6KXtpZihudWxsPT16KXJldHVybiB0aGlzLl9taW5Eb21haW5WYWx1ZXMuZ2V0KHkpO3RoaXMuX21pbkRvbWFpblZhbHVlcy5zZXQoeSx6KTtyZXR1cm4gdGhpc307di5wcm90b3R5cGUubWF4RG9tYWluVmFsdWU9ZnVuY3Rpb24oeSx6KXtpZihudWxsPT16KXJldHVybiB0aGlzLl9tYXhEb21haW5WYWx1ZXMuZ2V0KHkpO3RoaXMuX21heERvbWFpblZhbHVlcy5zZXQoeSx6KTtyZXR1cm4gdGhpc307di5wcm90b3R5cGUuc2V0TWluTWF4RG9tYWluVmFsdWVzVG89ZnVuY3Rpb24oeSl7dGhpcy5fbWluRG9tYWluVmFsdWVzLmRlbGV0ZSh5KTsKdGhpcy5fbWF4RG9tYWluVmFsdWVzLmRlbGV0ZSh5KTt2YXIgej15LmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCkseD16WzFdO3RoaXMubWluRG9tYWluVmFsdWUoeSx6WzBdKTt0aGlzLm1heERvbWFpblZhbHVlKHkseCk7cmV0dXJuIHRoaXN9O3YucHJvdG90eXBlLm9uUGFuRW5kPWZ1bmN0aW9uKHkpe3RoaXMuX3BhbkVuZENhbGxiYWNrcy5hZGQoeSl9O3YucHJvdG90eXBlLm9mZlBhbkVuZD1mdW5jdGlvbih5KXt0aGlzLl9wYW5FbmRDYWxsYmFja3MuZGVsZXRlKHkpO3JldHVybiB0aGlzfTt2LnByb3RvdHlwZS5vblpvb21FbmQ9ZnVuY3Rpb24oeSl7dGhpcy5fem9vbUVuZENhbGxiYWNrcy5hZGQoeSl9O3YucHJvdG90eXBlLm9mZlpvb21FbmQ9ZnVuY3Rpb24oeSl7dGhpcy5fem9vbUVuZENhbGxiYWNrcy5kZWxldGUoeSk7cmV0dXJuIHRoaXN9O3YucHJvdG90eXBlLm9uUGFuWm9vbVVwZGF0ZT1mdW5jdGlvbih5KXt0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmFkZCh5KTsKcmV0dXJuIHRoaXN9O3YucHJvdG90eXBlLm9mZlBhblpvb21VcGRhdGU9ZnVuY3Rpb24oeSl7dGhpcy5fcGFuWm9vbVVwZGF0ZUNhbGxiYWNrcy5kZWxldGUoeSk7cmV0dXJuIHRoaXN9O3JldHVybiB2fShjLkludGVyYWN0aW9uKTtmLl9QSVhFTFNfUEVSX0xJTkU9MTIwO2QuUGFuWm9vbT1mfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG4scCl7ZnVuY3Rpb24gcSgpe3RoaXMuY29uc3RydWN0b3I9bn1mb3IodmFyIHIgaW4gcClwLmhhc093blByb3BlcnR5KHIpJiYobltyXT1wW3JdKTtuLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihxLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgcSl9LGw9ZigxMyksaz1mKDApO2M9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcCgpe3ZhciBxPW51bGwhPT1uJiZuLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztxLl9vdmVyQ29tcG9uZW50PSExO3EuX3BvaW50ZXJFbnRlckNhbGxiYWNrcz0KbmV3IGsuQ2FsbGJhY2tTZXQ7cS5fcG9pbnRlck1vdmVDYWxsYmFja3M9bmV3IGsuQ2FsbGJhY2tTZXQ7cS5fcG9pbnRlckV4aXRDYWxsYmFja3M9bmV3IGsuQ2FsbGJhY2tTZXQ7cS5fbW91c2VNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24ocix0KXtyZXR1cm4gcS5faGFuZGxlTW91c2VFdmVudChyLHQpfTtxLl90b3VjaFN0YXJ0Q2FsbGJhY2s9ZnVuY3Rpb24ocix0LHYpe3JldHVybiBxLl9oYW5kbGVUb3VjaEV2ZW50KHRbclswXV0sdil9O3JldHVybiBxfWcocCxuKTtwLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKHEpe24ucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLHEpO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1sLk1vdXNlLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bC5Ub3VjaC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pOwp0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayl9O3AucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe24ucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPW51bGx9O3AucHJvdG90eXBlLl9oYW5kbGVNb3VzZUV2ZW50PWZ1bmN0aW9uKHEscil7cj10aGlzLl9tb3VzZURpc3BhdGNoZXIuZXZlbnRJbnNpZGUodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyxyKTt0aGlzLl9oYW5kbGVQb2ludGVyRXZlbnQocSxyKX07cC5wcm90b3R5cGUuX2hhbmRsZVRvdWNoRXZlbnQ9ZnVuY3Rpb24ocSxyKXtyPXRoaXMuX3RvdWNoRGlzcGF0Y2hlci5ldmVudEluc2lkZSh0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLApyKTt0aGlzLl9oYW5kbGVQb2ludGVyRXZlbnQocSxyKX07cC5wcm90b3R5cGUuX2hhbmRsZVBvaW50ZXJFdmVudD1mdW5jdGlvbihxLHIpe3E9dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShxKTt2YXIgdD10aGlzLl9pc0luc2lkZUNvbXBvbmVudChxKTt0JiZyPyh0aGlzLl9vdmVyQ29tcG9uZW50fHx0aGlzLl9wb2ludGVyRW50ZXJDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhxKSx0aGlzLl9wb2ludGVyTW92ZUNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHEpKTp0aGlzLl9vdmVyQ29tcG9uZW50JiZ0aGlzLl9wb2ludGVyRXhpdENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHEpO3RoaXMuX292ZXJDb21wb25lbnQ9dCYmcn07cC5wcm90b3R5cGUub25Qb2ludGVyRW50ZXI9ZnVuY3Rpb24ocSl7dGhpcy5fcG9pbnRlckVudGVyQ2FsbGJhY2tzLmFkZChxKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUub2ZmUG9pbnRlckVudGVyPWZ1bmN0aW9uKHEpe3RoaXMuX3BvaW50ZXJFbnRlckNhbGxiYWNrcy5kZWxldGUocSk7CnJldHVybiB0aGlzfTtwLnByb3RvdHlwZS5vblBvaW50ZXJNb3ZlPWZ1bmN0aW9uKHEpe3RoaXMuX3BvaW50ZXJNb3ZlQ2FsbGJhY2tzLmFkZChxKX07cC5wcm90b3R5cGUub2ZmUG9pbnRlck1vdmU9ZnVuY3Rpb24ocSl7dGhpcy5fcG9pbnRlck1vdmVDYWxsYmFja3MuZGVsZXRlKHEpfTtwLnByb3RvdHlwZS5vblBvaW50ZXJFeGl0PWZ1bmN0aW9uKHEpe3RoaXMuX3BvaW50ZXJFeGl0Q2FsbGJhY2tzLmFkZChxKX07cC5wcm90b3R5cGUub2ZmUG9pbnRlckV4aXQ9ZnVuY3Rpb24ocSl7dGhpcy5fcG9pbnRlckV4aXRDYWxsYmFja3MuZGVsZXRlKHEpO3JldHVybiB0aGlzfTtyZXR1cm4gcH0oZigxNSkuSW50ZXJhY3Rpb24pO2QuUG9pbnRlcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9ZigyMCk7ZC5tZW1UaHVuaz1mdW5jdGlvbigpe2Zvcih2YXIgbD1bXSxrPTA7azxhcmd1bWVudHMubGVuZ3RoO2srKylsW2tdPWFyZ3VtZW50c1trXTt2YXIgbj1sLnNsaWNlKDAsLTEpLHA9Zy5tZW1vaXplKGxbbC5sZW5ndGgtCjFdKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcT10aGlzLHI9bi5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuYXBwbHkocSl9KTtyZXR1cm4gcC5hcHBseSh2b2lkIDAscil9fX0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoNDkpO2QubWVtb2l6ZT1mdW5jdGlvbihsKXtmdW5jdGlvbiBrKCl7Zm9yKHZhciB0PVtdLHY9MDt2PGFyZ3VtZW50cy5sZW5ndGg7disrKXRbdl09YXJndW1lbnRzW3ZdO2lmKHEpcmV0dXJuIHA7dj1nLnNpZ25BcnJheSh0KTt2b2lkIDA9PT1ufHxuLmlzRGlmZmVyZW50KHYpPyhyJiZjb25zb2xlLmxvZygiY2FjaGUgbWlzcyEgY29tcHV0aW5nIiksbj12LHA9bC5hcHBseSh0aGlzLHQpKTpyJiZjb25zb2xlLmxvZygiY2FjaGUgaGl0ISIpO3JldHVybiBwfXZhciBuPXZvaWQgMCxwLHE9ITEscj0hMTtrLmRvTG9ja2VkPWZ1bmN0aW9uKHQpe2lmKHEpdGhyb3cgRXJyb3IoIkxvY2tpbmcgYW4gYWxyZWFkeSBsb2NrZWQgbWVtb2l6ZSBmdW5jdGlvbiEiKTtxPSEwOwp0PXQuYXBwbHkodGhpcyk7cT0hMTtyZXR1cm4gdH07ay5sb2dQZXJmb3JtYW5jZT1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD0hMCk7cj10O3JldHVybiB0aGlzfTtyZXR1cm4ga319LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocSxyKXtmdW5jdGlvbiB0KCl7dGhpcy5jb25zdHJ1Y3Rvcj1xfWZvcih2YXIgdiBpbiByKXIuaGFzT3duUHJvcGVydHkodikmJihxW3ZdPXJbdl0pO3EucHJvdG90eXBlPW51bGw9PT1yP09iamVjdC5jcmVhdGUocik6KHQucHJvdG90eXBlPXIucHJvdG90eXBlLG5ldyB0KX0sbD1mKDMpLGs9ZigwKSxuPWYoMjcpLHA9ZigyKTtjPWZ1bmN0aW9uKHEpe2Z1bmN0aW9uIHIodCl7dm9pZCAwPT09dCYmKHQ9InZlcnRpY2FsIik7dD1xLmNhbGwodGhpcyx0KXx8dGhpczt0Ll9jbHVzdGVyT2Zmc2V0cz1uZXcgay5NYXA7cmV0dXJuIHR9ZyhyLHEpO3IucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj0KZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7cmV0dXJuIHoucmFuZ2VCYW5kKCl9dmFyIHY9dGhpcyx5PXEucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLHo9dGhpcy5fbWFrZUlubmVyU2NhbGUoKTt5LndpZHRoPXRoaXMuX2lzVmVydGljYWw/dDp5LndpZHRoO3kuaGVpZ2h0PXRoaXMuX2lzVmVydGljYWw/eS5oZWlnaHQ6dDt2YXIgeD15LngsQz15Lnk7eS54PXRoaXMuX2lzVmVydGljYWw/ZnVuY3Rpb24oRixELEIpe3JldHVybiB4KEYsRCxCKSt2Ll9jbHVzdGVyT2Zmc2V0cy5nZXQoQil9OmZ1bmN0aW9uKEYsRCxCKXtyZXR1cm4geChGLEQsQil9O3kueT10aGlzLl9pc1ZlcnRpY2FsP2Z1bmN0aW9uKEYsRCxCKXtyZXR1cm4gQyhGLEQsQil9OmZ1bmN0aW9uKEYsRCxCKXtyZXR1cm4gQyhGLEQsQikrdi5fY2x1c3Rlck9mZnNldHMuZ2V0KEIpfTtyZXR1cm4geX07ci5wcm90b3R5cGUuX3VwZGF0ZUNsdXN0ZXJQb3NpdGlvbj1mdW5jdGlvbigpe3ZhciB0PQp0aGlzLHY9dGhpcy5fbWFrZUlubmVyU2NhbGUoKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbih5LHope3JldHVybiB0Ll9jbHVzdGVyT2Zmc2V0cy5zZXQoeSx2LnNjYWxlKFN0cmluZyh6KSktdi5yYW5nZUJhbmQoKS8yKX0pfTtyLnByb3RvdHlwZS5fbWFrZUlubmVyU2NhbGU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgbC5DYXRlZ29yeTt0LmRvbWFpbih0aGlzLmRhdGFzZXRzKCkubWFwKGZ1bmN0aW9uKHkseil7cmV0dXJuIFN0cmluZyh6KX0pKTt2YXIgdj1wLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuYXR0cihuLkJhci5fQkFSX1RISUNLTkVTU19LRVkpKTt0LnJhbmdlKFswLHYobnVsbCwwLG51bGwpXSk7cmV0dXJuIHR9O3IucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQ2x1c3RlclBvc2l0aW9uKCk7cmV0dXJuIHEucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3LmNhbGwodGhpcyl9O3JldHVybiByfShuLkJhcik7ZC5DbHVzdGVyZWRCYXI9CmN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oQyxGKXtmdW5jdGlvbiBEKCl7dGhpcy5jb25zdHJ1Y3Rvcj1DfWZvcih2YXIgQiBpbiBGKUYuaGFzT3duUHJvcGVydHkoQikmJihDW0JdPUZbQl0pO0MucHJvdG90eXBlPW51bGw9PT1GP09iamVjdC5jcmVhdGUoRik6KEQucHJvdG90eXBlPUYucHJvdG90eXBlLG5ldyBEKX0sbD1mKDEpLGs9Zig1KSxuPWYoNykscD1mKDgpLHE9ZigzKSxyPWYoMCksdD1mKDQ0KSx2PWYoNDUpLHk9Zig2KSx6PWYoMzUpLHg9ZigyKTtjPWZ1bmN0aW9uKEMpe2Z1bmN0aW9uIEYoKXt2YXIgRD1DLmNhbGwodGhpcyl8fHRoaXM7RC5fc3RhcnRBbmdsZT0wO0QuX2VuZEFuZ2xlPTIqTWF0aC5QSTtELl9sYWJlbEZvcm1hdHRlcj1wLmlkZW50aXR5KCk7RC5fbGFiZWxzRW5hYmxlZD0hMTtELmlubmVyUmFkaXVzKDApO0Qub3V0ZXJSYWRpdXMoZnVuY3Rpb24oKXt2YXIgQj1ELl9waWVDZW50ZXIoKTtyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoRC53aWR0aCgpLQpCLngsQi54KSxNYXRoLm1heChELmhlaWdodCgpLUIueSxCLnkpKX0pO0QuYWRkQ2xhc3MoInBpZS1wbG90Iik7RC5hdHRyKCJmaWxsIixmdW5jdGlvbihCLEkpe3JldHVybiBTdHJpbmcoSSl9LG5ldyBxLkNvbG9yKTtELl9zdHJva2VEcmF3ZXJzPW5ldyByLk1hcDtyZXR1cm4gRH1nKEYsQyk7Ri5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcztDLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9zdHJva2VEcmF3ZXJzLmZvckVhY2goZnVuY3Rpb24oQil7cmV0dXJuIEIuYXR0YWNoVG8oRC5fcmVuZGVyQXJlYSl9KX07Ri5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihELEIsSSl7Qy5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsRCxCLEkpO0Q9dGhpcy5fcGllQ2VudGVyKCk7dGhpcy5fcmVuZGVyQXJlYS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitELngrIiwiK0QueSsiKSIpO0Q9TWF0aC5taW4oTWF0aC5tYXgodGhpcy53aWR0aCgpLQpELngsRC54KSxNYXRoLm1heCh0aGlzLmhlaWdodCgpLUQueSxELnkpKTtudWxsIT10aGlzLmlubmVyUmFkaXVzKCkuc2NhbGUmJnRoaXMuaW5uZXJSYWRpdXMoKS5zY2FsZS5yYW5nZShbMCxEXSk7bnVsbCE9dGhpcy5vdXRlclJhZGl1cygpLnNjYWxlJiZ0aGlzLm91dGVyUmFkaXVzKCkuc2NhbGUucmFuZ2UoWzAsRF0pO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5hZGREYXRhc2V0PWZ1bmN0aW9uKEQpe0MucHJvdG90eXBlLmFkZERhdGFzZXQuY2FsbCh0aGlzLEQpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5fYWRkRGF0YXNldD1mdW5jdGlvbihEKXtpZigxPT09dGhpcy5kYXRhc2V0cygpLmxlbmd0aClyZXR1cm4gci5XaW5kb3cud2FybigiT25seSBvbmUgZGF0YXNldCBpcyBzdXBwb3J0ZWQgaW4gUGllIHBsb3RzIiksdGhpczt0aGlzLl91cGRhdGVQaWVBbmdsZXMoKTt2YXIgQj1uZXcgdi5BcmNPdXRsaW5lU1ZHRHJhd2VyO3RoaXMuX2lzU2V0dXAmJkIuYXR0YWNoVG8odGhpcy5fcmVuZGVyQXJlYSk7CnRoaXMuX3N0cm9rZURyYXdlcnMuc2V0KEQsQik7Qy5wcm90b3R5cGUuX2FkZERhdGFzZXQuY2FsbCh0aGlzLEQpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKEQpe0MucHJvdG90eXBlLnJlbW92ZURhdGFzZXQuY2FsbCh0aGlzLEQpfTtGLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzPWZ1bmN0aW9uKEQpe0MucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXMuY2FsbCh0aGlzLEQpO3RoaXMuX3N0cm9rZURyYXdlcnMuZ2V0KEQpLnJlbW92ZSgpfTtGLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldD1mdW5jdGlvbihEKXtDLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldC5jYWxsKHRoaXMsRCk7dGhpcy5fc3RhcnRBbmdsZXM9W107dGhpcy5fZW5kQW5nbGVzPVtdO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5zZWxlY3Rpb25zPWZ1bmN0aW9uKEQpe3ZhciBCPXRoaXM7dm9pZCAwPT09RCYmKEQ9dGhpcy5kYXRhc2V0cygpKTt2YXIgST1DLnByb3RvdHlwZS5zZWxlY3Rpb25zLmNhbGwodGhpcywKRCkubm9kZXMoKTtELmZvckVhY2goZnVuY3Rpb24oTyl7Tz1CLl9zdHJva2VEcmF3ZXJzLmdldChPKTtudWxsIT1PJiZJLnB1c2guYXBwbHkoSSxPLmdldFZpc3VhbFByaW1pdGl2ZXMoKSl9KTtyZXR1cm4gbC5zZWxlY3RBbGwoSSl9O0YucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXtDLnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlLmNhbGwodGhpcyk7dGhpcy5fdXBkYXRlUGllQW5nbGVzKCk7dGhpcy5yZW5kZXIoKX07Ri5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbigpe3JldHVybiBuZXcgeS5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgdC5BcmNTVkdEcmF3ZXJ9LGZ1bmN0aW9uKCl7ei53YXJuKCJjYW52YXMgcmVuZGVyZXIgaXMgbm90IHN1cHBvcnRlZCBvbiBQaWUgUGxvdCEiKTtyZXR1cm4gbnVsbH0pfTtGLnByb3RvdHlwZS5lbnRpdGllcz1mdW5jdGlvbihEKXt2YXIgQj10aGlzO3ZvaWQgMD09PUQmJihEPXRoaXMuZGF0YXNldHMoKSk7CnJldHVybiBDLnByb3RvdHlwZS5lbnRpdGllcy5jYWxsKHRoaXMsRCkubWFwKGZ1bmN0aW9uKEkpe0kucG9zaXRpb24ueCs9Qi53aWR0aCgpLzI7SS5wb3NpdGlvbi55Kz1CLmhlaWdodCgpLzI7dmFyIE89bC5zZWxlY3QoQi5fc3Ryb2tlRHJhd2Vycy5nZXQoSS5kYXRhc2V0KS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4KEkuaW5kZXgpKTtJLnN0cm9rZVNlbGVjdGlvbj1PO3JldHVybiBJfSl9O0YucHJvdG90eXBlLnNlY3RvclZhbHVlPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KEYuX1NFQ1RPUl9WQUxVRV9LRVkpO3RoaXMuX2JpbmRQcm9wZXJ0eShGLl9TRUNUT1JfVkFMVUVfS0VZLEQsdm9pZCAwKTt0aGlzLl91cGRhdGVQaWVBbmdsZXMoKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5pbm5lclJhZGl1cz1mdW5jdGlvbihELEIpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KEYuX0lOTkVSX1JBRElVU19LRVkpOwp0aGlzLl9iaW5kUHJvcGVydHkoRi5fSU5ORVJfUkFESVVTX0tFWSxELEIpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0YucHJvdG90eXBlLm91dGVyUmFkaXVzPWZ1bmN0aW9uKEQsQil7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoRi5fT1VURVJfUkFESVVTX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KEYuX09VVEVSX1JBRElVU19LRVksRCxCKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5zdGFydEFuZ2xlPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX3N0YXJ0QW5nbGU7dGhpcy5fc3RhcnRBbmdsZT1EO3RoaXMuX3VwZGF0ZVBpZUFuZ2xlcygpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0YucHJvdG90eXBlLmVuZEFuZ2xlPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2VuZEFuZ2xlO3RoaXMuX2VuZEFuZ2xlPUQ7dGhpcy5fdXBkYXRlUGllQW5nbGVzKCk7dGhpcy5yZW5kZXIoKTsKcmV0dXJuIHRoaXN9O0YucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQ9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fbGFiZWxzRW5hYmxlZDt0aGlzLl9sYWJlbHNFbmFibGVkPUQ7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307Ri5wcm90b3R5cGUubGFiZWxGb3JtYXR0ZXI9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fbGFiZWxGb3JtYXR0ZXI7dGhpcy5fbGFiZWxGb3JtYXR0ZXI9RDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEQpe3ZhciBCPXRoaXMud2lkdGgoKS8yLEk9dGhpcy5oZWlnaHQoKS8yO0Q9dGhpcy5fc2xpY2VJbmRleEZvclBvaW50KHt4OkQueC1CLHk6RC55LUl9KTtyZXR1cm4gbnVsbD09RD9bXTpbdGhpcy5lbnRpdGllcygpW0RdXX07Ri5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBEPXRoaXMsQj1DLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyksCkk9eC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLmlubmVyUmFkaXVzKCkpLE89eC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLm91dGVyUmFkaXVzKCkpO0IuZD1mdW5jdGlvbihQLEgsSyl7cmV0dXJuIGwuYXJjKCkuaW5uZXJSYWRpdXMoSShQLEgsSykpLm91dGVyUmFkaXVzKE8oUCxILEspKS5zdGFydEFuZ2xlKEQuX3N0YXJ0QW5nbGVzW0hdKS5lbmRBbmdsZShELl9lbmRBbmdsZXNbSF0pKFAsSCl9O3JldHVybiBCfTtGLnByb3RvdHlwZS5fdXBkYXRlUGllQW5nbGVzPWZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5zZWN0b3JWYWx1ZSgpJiYwIT09dGhpcy5kYXRhc2V0cygpLmxlbmd0aCl7dmFyIEQ9eC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnNlY3RvclZhbHVlKCkpLEI9dGhpcy5kYXRhc2V0cygpWzBdLEk9dGhpcy5fZ2V0RGF0YVRvRHJhdygpLmdldChCKTtJPWwucGllKCkuc29ydChudWxsKS5zdGFydEFuZ2xlKHRoaXMuX3N0YXJ0QW5nbGUpLmVuZEFuZ2xlKHRoaXMuX2VuZEFuZ2xlKS52YWx1ZShmdW5jdGlvbihPLApQKXtyZXR1cm4gRChPLFAsQil9KShJKTt0aGlzLl9zdGFydEFuZ2xlcz1JLm1hcChmdW5jdGlvbihPKXtyZXR1cm4gTy5zdGFydEFuZ2xlfSk7dGhpcy5fZW5kQW5nbGVzPUkubWFwKGZ1bmN0aW9uKE8pe3JldHVybiBPLmVuZEFuZ2xlfSl9fTtGLnByb3RvdHlwZS5fcGllQ2VudGVyPWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcy5fc3RhcnRBbmdsZTx0aGlzLl9lbmRBbmdsZT90aGlzLl9zdGFydEFuZ2xlOnRoaXMuX2VuZEFuZ2xlLEI9dGhpcy5fc3RhcnRBbmdsZTx0aGlzLl9lbmRBbmdsZT90aGlzLl9lbmRBbmdsZTp0aGlzLl9zdGFydEFuZ2xlLEk9TWF0aC5zaW4oRCk7RD1NYXRoLmNvcyhEKTt2YXIgTz1NYXRoLnNpbihCKTtCPU1hdGguY29zKEIpO3ZhciBQO2lmKDA8PUkmJjA8PU8paWYoMDw9RCYmMDw9Qil7dmFyIEg9RDt2YXIgSz1QPTA7dmFyIE09T31lbHNlIDA+RCYmMD5CPyhIPTAsUD0tQixLPTAsTT1JKTowPD1EJiYwPkI/KEg9RCxQPS1CLEs9MCxNPUkpOjA+RCYmMDw9QiYmCihLPVA9SD0xLE09TWF0aC5tYXgoSSxPKSk7ZWxzZSAwPD1JJiYwPk8/MDw9RCYmMDw9Qj8oSD1NYXRoLm1heChELEIpLE09Sz1QPTEpOjA+RCYmMD5CPyhIPTAsUD0xLEs9LU8sTT1JKTowPD1EJiYwPkI/KEg9RCxQPTEsSz0tTyxNPTEpOjA+RCYmMDw9QiYmKEg9QixLPVA9MSxNPUkpOjA+SSYmMDw9Tz8wPD1EJiYwPD1CPyhIPTEsUD0wLEs9LUksTT1PKTowPkQmJjA+Qj8oSD0xLFA9TWF0aC5tYXgoLUQsLUIpLE09Sz0xKTowPD1EJiYwPkI/KEg9MSxQPS1CLEs9LUksTT0xKTowPkQmJjA8PUImJihIPTEsUD0tRCxLPTEsTT1PKTowPkkmJjA+TyYmKDA8PUQmJjA8PUI/KEg9QixQPTAsSz0tSSxNPTApOjA+RCYmMD5CPyhIPTAsUD0tRCxLPS1PLE09MCk6MDw9RCYmMD5CPyhQPUg9MSxLPU1hdGgubWF4KEQsLUIpLE09MSk6MD5EJiYwPD1CJiYoSD1CLFA9LUQsSz0xLE09MCkpO3JldHVybnt4OjA9PUsrTT8wOksvKEsrTSkqdGhpcy53aWR0aCgpLHk6MD09SCtQPzA6SC8oSCtQKSp0aGlzLmhlaWdodCgpfX07CkYucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIEQ9Qy5wcm90b3R5cGUuX2dldERhdGFUb0RyYXcuY2FsbCh0aGlzKTtpZigwPT09dGhpcy5kYXRhc2V0cygpLmxlbmd0aClyZXR1cm4gRDt2YXIgQj14LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2VjdG9yVmFsdWUoKSksST10aGlzLmRhdGFzZXRzKClbMF0sTz1ELmdldChJKS5maWx0ZXIoZnVuY3Rpb24oUCxIKXtyZXR1cm4gRi5faXNWYWxpZERhdGEoQihQLEgsSSkpfSk7RC5zZXQoSSxPKTtyZXR1cm4gRH07Ri5faXNWYWxpZERhdGE9ZnVuY3Rpb24oRCl7cmV0dXJuIHIuTWF0aC5pc1ZhbGlkTnVtYmVyKEQpJiYwPD1EfTtGLnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbihELEIsSSl7dmFyIE89eC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnNlY3RvclZhbHVlKCkpO2lmKCFGLl9pc1ZhbGlkRGF0YShPKEQsQixJKSkpcmV0dXJue3g6TmFOLHk6TmFOfTt2YXIgUD14LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuaW5uZXJSYWRpdXMoKSkoRCwKQixJKTtEPXguUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5vdXRlclJhZGl1cygpKShELEIsSSk7UD0oUCtEKS8yO0Q9bC5waWUoKS5zb3J0KG51bGwpLnZhbHVlKGZ1bmN0aW9uKEgsSyl7SD1PKEgsSyxJKTtyZXR1cm4gRi5faXNWYWxpZERhdGEoSCk/SDowfSkuc3RhcnRBbmdsZSh0aGlzLl9zdGFydEFuZ2xlKS5lbmRBbmdsZSh0aGlzLl9lbmRBbmdsZSkoSS5kYXRhKCkpO0I9KERbQl0uc3RhcnRBbmdsZStEW0JdLmVuZEFuZ2xlKS8yO3JldHVybnt4OlAqTWF0aC5zaW4oQikseTotUCpNYXRoLmNvcyhCKX19O0YucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oRCl7dmFyIEI9dGhpczt0aGlzLl9yZW5kZXJBcmVhLnNlbGVjdCgiLmxhYmVsLWFyZWEiKS5yZW1vdmUoKTt0aGlzLl9sYWJlbHNFbmFibGVkJiZyLldpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIEIuX2RyYXdMYWJlbHMoKX0sRCk7dmFyIEk9dGhpcy5fZ2VuZXJhdGVTdHJva2VEcmF3U3RlcHMoKSwKTz10aGlzLl9nZXREYXRhVG9EcmF3KCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oUCl7dmFyIEg9eC5QbG90LmFwcGx5RHJhd1N0ZXBzKEksUCk7Qi5fc3Ryb2tlRHJhd2Vycy5nZXQoUCkuZHJhdyhPLmdldChQKSxIKX0pfTtGLnByb3RvdHlwZS5fZ2VuZXJhdGVTdHJva2VEcmF3U3RlcHM9ZnVuY3Rpb24oKXtyZXR1cm5be2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjpuZXcgbi5OdWxsfV19O0YucHJvdG90eXBlLl9zbGljZUluZGV4Rm9yUG9pbnQ9ZnVuY3Rpb24oRCl7dmFyIEI9TWF0aC5zcXJ0KE1hdGgucG93KEQueCwyKStNYXRoLnBvdyhELnksMikpLEk9TWF0aC5hY29zKC1ELnkvQik7MD5ELngmJihJPTIqTWF0aC5QSS1JKTtmb3IoRD0wO0Q8dGhpcy5fc3RhcnRBbmdsZXMubGVuZ3RoO0QrKylpZih0aGlzLl9zdGFydEFuZ2xlc1tEXTxJJiZ0aGlzLl9lbmRBbmdsZXNbRF0+SSl7dmFyIE89RDticmVha31pZih2b2lkIDAhPT0KTyl7RD10aGlzLmRhdGFzZXRzKClbMF07dmFyIFA9RC5kYXRhKClbT107ST10aGlzLmlubmVyUmFkaXVzKCkuYWNjZXNzb3IoUCxPLEQpO0Q9dGhpcy5vdXRlclJhZGl1cygpLmFjY2Vzc29yKFAsTyxEKTtpZihCPkkmJkI8RClyZXR1cm4gT31yZXR1cm4gbnVsbH07Ri5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgRD10aGlzLEI9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksST10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgiZyIpLmNsYXNzZWQoImxhYmVsLWFyZWEiLCEwKSxPPW5ldyBrLlN2Z0NvbnRleHQoSS5ub2RlKCkpLFA9bmV3IGsuQ2FjaGVNZWFzdXJlcihPKSxIPW5ldyBrLldyaXRlcihQLE8pLEs9dGhpcy5kYXRhc2V0cygpWzBdO3RoaXMuX2dldERhdGFUb0RyYXcoKS5nZXQoSykuZm9yRWFjaChmdW5jdGlvbihNLEwpe3ZhciBSPUQuc2VjdG9yVmFsdWUoKS5hY2Nlc3NvcihNLEwsSyk7aWYoci5NYXRoLmlzVmFsaWROdW1iZXIoUikpe1I9RC5fbGFiZWxGb3JtYXR0ZXIoUiwKTSxMLEspO3ZhciBVPVAubWVhc3VyZShSKSxZPShELl9lbmRBbmdsZXNbTF0rRC5fc3RhcnRBbmdsZXNbTF0pLzIsYmE9RC5vdXRlclJhZGl1cygpLmFjY2Vzc29yKE0sTCxLKTtELm91dGVyUmFkaXVzKCkuc2NhbGUmJihiYT1ELm91dGVyUmFkaXVzKCkuc2NhbGUuc2NhbGUoYmEpKTt2YXIgbWE9RC5pbm5lclJhZGl1cygpLmFjY2Vzc29yKE0sTCxLKTtELmlubmVyUmFkaXVzKCkuc2NhbGUmJihtYT1ELmlubmVyUmFkaXVzKCkuc2NhbGUuc2NhbGUobWEpKTttYT0oYmErbWEpLzI7YmE9TWF0aC5zaW4oWSkqbWEtVS53aWR0aC8yO21hPS1NYXRoLmNvcyhZKSptYS1VLmhlaWdodC8yO3ZhciBhYT1be3g6YmEseTptYX0se3g6YmEseTptYStVLmhlaWdodH0se3g6YmErVS53aWR0aCx5Om1hfSx7eDpiYStVLndpZHRoLHk6bWErVS5oZWlnaHR9XTsoWT1hYS5ldmVyeShmdW5jdGlvbihjYSl7cmV0dXJuIE1hdGguYWJzKGNhLngpPD1ELndpZHRoKCkvMiYmTWF0aC5hYnMoY2EueSk8PUQuaGVpZ2h0KCkvCjJ9KSkmJihZPWFhLm1hcChmdW5jdGlvbihjYSl7cmV0dXJuIEQuX3NsaWNlSW5kZXhGb3JQb2ludChjYSl9KS5ldmVyeShmdW5jdGlvbihjYSl7cmV0dXJuIGNhPT09TH0pKTtNPUIuZmlsbChNLEwsSyk7TT0xLjYqci5Db2xvci5jb250cmFzdCgid2hpdGUiLE0pPHIuQ29sb3IuY29udHJhc3QoImJsYWNrIixNKTtiYT1JLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2JhKyIsIittYSsiKSIpO2JhLmNsYXNzZWQoTT8iZGFyay1sYWJlbCI6ImxpZ2h0LWxhYmVsIiwhMCk7YmEuc3R5bGUoInZpc2liaWxpdHkiLFk/ImluaGVyaXQiOiJoaWRkZW4iKTtILndyaXRlKFIsVS53aWR0aCxVLmhlaWdodCx7eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIn0sYmEubm9kZSgpKX19KX07cmV0dXJuIEZ9KHguUGxvdCk7Yy5fSU5ORVJfUkFESVVTX0tFWT0iaW5uZXItcmFkaXVzIjtjLl9PVVRFUl9SQURJVVNfS0VZPSJvdXRlci1yYWRpdXMiO2MuX1NFQ1RPUl9WQUxVRV9LRVk9CiJzZWN0b3ItdmFsdWUiO2QuUGllPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oeix4KXtmdW5jdGlvbiBDKCl7dGhpcy5jb25zdHJ1Y3Rvcj16fWZvcih2YXIgRiBpbiB4KXguaGFzT3duUHJvcGVydHkoRikmJih6W0ZdPXhbRl0pO3oucHJvdG90eXBlPW51bGw9PT14P09iamVjdC5jcmVhdGUoeCk6KEMucHJvdG90eXBlPXgucHJvdG90eXBlLG5ldyBDKX0sbD1mKDEpLGs9Zig1KSxuPWYoNykscD1mKDE0KSxxPWYoNikscj1mKDM0KSx0PWYoMyksdj1mKDApLHk9ZigyKTtjPWZ1bmN0aW9uKHope2Z1bmN0aW9uIHgoKXt2YXIgQz16LmNhbGwodGhpcyl8fHRoaXM7Qy5fbGFiZWxzRW5hYmxlZD0hMTtDLl9sYWJlbD1udWxsO0MuYW5pbWF0b3IoInJlY3RhbmdsZXMiLG5ldyBuLk51bGwpO0MuYWRkQ2xhc3MoInJlY3RhbmdsZS1wbG90Iik7Qy5hdHRyKCJmaWxsIiwobmV3IHQuQ29sb3IpLnJhbmdlKClbMF0pO3JldHVybiBDfWcoeCwKeik7eC5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbigpe3JldHVybiBuZXcgcS5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgci5SZWN0YW5nbGVTVkdEcmF3ZXJ9LGZ1bmN0aW9uKEMpe3JldHVybiBuZXcgcC5SZWN0YW5nbGVDYW52YXNEcmF3ZXIoQyl9KX07eC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIEM9dGhpcyxGPXoucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLEQ9eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksQj1GW3guX1gyX0tFWV0sST15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSxPPUZbeC5fWTJfS0VZXSxQPXRoaXMueCgpLnNjYWxlLEg9dGhpcy55KCkuc2NhbGU7bnVsbCE9Qj8oRi53aWR0aD1mdW5jdGlvbihLLE0sTCl7cmV0dXJuIE1hdGguYWJzKEIoSyxNLEwpLUQoSyxNLEwpKX0sRi54PWZ1bmN0aW9uKEssTSxMKXtyZXR1cm4gTWF0aC5taW4oQihLLApNLEwpLEQoSyxNLEwpKX0pOihGLndpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIEMuX3JlY3RhbmdsZVdpZHRoKFApfSxGLng9ZnVuY3Rpb24oSyxNLEwpe3JldHVybiBEKEssTSxMKS0uNSpGLndpZHRoKEssTSxMKX0pO251bGwhPU8/KEYuaGVpZ2h0PWZ1bmN0aW9uKEssTSxMKXtyZXR1cm4gTWF0aC5hYnMoTyhLLE0sTCktSShLLE0sTCkpfSxGLnk9ZnVuY3Rpb24oSyxNLEwpe3JldHVybiBNYXRoLm1heChPKEssTSxMKSxJKEssTSxMKSktRi5oZWlnaHQoSyxNLEwpfSk6KEYuaGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIEMuX3JlY3RhbmdsZVdpZHRoKEgpfSxGLnk9ZnVuY3Rpb24oSyxNLEwpe3JldHVybiBJKEssTSxMKS0uNSpGLmhlaWdodChLLE0sTCl9KTtkZWxldGUgRlt4Ll9YMl9LRVldO2RlbGV0ZSBGW3guX1kyX0tFWV07cmV0dXJuIEZ9O3gucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz1mdW5jdGlvbigpe3JldHVyblt7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLAphbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcigicmVjdGFuZ2xlcyIpfV19O3gucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eT1mdW5jdGlvbihDKXtyZXR1cm4ieDIiPT09Qz96LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLCJ4Iik6InkyIj09PUM/ei5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywieSIpOnoucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsQyl9O3gucHJvdG90eXBlLng9ZnVuY3Rpb24oQyxGLEQpe2lmKG51bGw9PUMpcmV0dXJuIHoucHJvdG90eXBlLnguY2FsbCh0aGlzKTtudWxsPT1GP3oucHJvdG90eXBlLnguY2FsbCh0aGlzLEMpOnoucHJvdG90eXBlLnguY2FsbCh0aGlzLEMsRixEKTtudWxsIT1GJiYoRD0oQz10aGlzLngyKCkpJiZDLmFjY2Vzc29yLG51bGwhPUQmJnRoaXMuX2JpbmRQcm9wZXJ0eSh4Ll9YMl9LRVksRCxGLEMucG9zdFNjYWxlKSk7RiBpbnN0YW5jZW9mIHQuQ2F0ZWdvcnkmJgpGLmlubmVyUGFkZGluZygwKS5vdXRlclBhZGRpbmcoMCk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLngyPWZ1bmN0aW9uKEMpe2lmKG51bGw9PUMpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHguX1gyX0tFWSk7dmFyIEY9dGhpcy54KCk7dGhpcy5fYmluZFByb3BlcnR5KHguX1gyX0tFWSxDLEYmJkYuc2NhbGUsdm9pZCAwKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS55PWZ1bmN0aW9uKEMsRixEKXtpZihudWxsPT1DKXJldHVybiB6LnByb3RvdHlwZS55LmNhbGwodGhpcyk7bnVsbD09Rj96LnByb3RvdHlwZS55LmNhbGwodGhpcyxDKTp6LnByb3RvdHlwZS55LmNhbGwodGhpcyxDLEYsRCk7bnVsbCE9RiYmKEQ9KEM9dGhpcy55MigpKSYmQy5hY2Nlc3NvcixudWxsIT1EJiZ0aGlzLl9iaW5kUHJvcGVydHkoeC5fWTJfS0VZLEQsRixDLnBvc3RTY2FsZSkpO0YgaW5zdGFuY2VvZiB0LkNhdGVnb3J5JiZGLmlubmVyUGFkZGluZygwKS5vdXRlclBhZGRpbmcoMCk7CnJldHVybiB0aGlzfTt4LnByb3RvdHlwZS55Mj1mdW5jdGlvbihDKXtpZihudWxsPT1DKXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh4Ll9ZMl9LRVkpO3ZhciBGPXRoaXMueSgpO3RoaXMuX2JpbmRQcm9wZXJ0eSh4Ll9ZMl9LRVksQyxGJiZGLnNjYWxlLHZvaWQgMCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbihDKXt2YXIgRj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTtyZXR1cm4gdGhpcy5lbnRpdGllcygpLmZpbHRlcihmdW5jdGlvbihEKXt2YXIgQj1ELmRhdHVtLEk9RC5pbmRleCxPPUQuZGF0YXNldDtEPUYueChCLEksTyk7dmFyIFA9Ri55KEIsSSxPKSxIPUYud2lkdGgoQixJLE8pO0I9Ri5oZWlnaHQoQixJLE8pO3JldHVybiBEPD1DLngmJkMueDw9RCtIJiZQPD1DLnkmJkMueTw9UCtCfSl9O3gucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oQyl7cmV0dXJuIHRoaXMuX2VudGl0eUJCb3goQy5kYXR1bSwKQy5pbmRleCxDLmRhdGFzZXQsdGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCkpfTt4LnByb3RvdHlwZS5fZW50aXR5QkJveD1mdW5jdGlvbihDLEYsRCxCKXtyZXR1cm57eDpCLngoQyxGLEQpLHk6Qi55KEMsRixEKSx3aWR0aDpCLndpZHRoKEMsRixEKSxoZWlnaHQ6Qi5oZWlnaHQoQyxGLEQpfX07eC5wcm90b3R5cGUubGFiZWw9ZnVuY3Rpb24oQyl7aWYobnVsbD09QylyZXR1cm4gdGhpcy5fbGFiZWw7dGhpcy5fbGFiZWw9Qzt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5sYWJlbHNFbmFibGVkPWZ1bmN0aW9uKEMpe2lmKG51bGw9PUMpcmV0dXJuIHRoaXMuX2xhYmVsc0VuYWJsZWQ7dGhpcy5fbGFiZWxzRW5hYmxlZD1DO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgQz16LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyk7bnVsbCE9dGhpcy54MigpJiYKKEMueDI9eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngyKCkpKTtudWxsIT10aGlzLnkyKCkmJihDLnkyPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55MigpKSk7cmV0dXJuIEN9O3gucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKEMsRixEKXt2YXIgQj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxJPUIueChDLEYsRCksTz1CLnkoQyxGLEQpLFA9Qi53aWR0aChDLEYsRCk7Qz1CLmhlaWdodChDLEYsRCk7cmV0dXJue3g6SStQLzIseTpPK0MvMn19O3gucHJvdG90eXBlLl9yZWN0YW5nbGVXaWR0aD1mdW5jdGlvbihDKXtpZihDIGluc3RhbmNlb2YgdC5DYXRlZ29yeSlyZXR1cm4gQy5yYW5nZUJhbmQoKTt2YXIgRj1DPT09dGhpcy54KCkuc2NhbGU/dGhpcy54KCkuYWNjZXNzb3I6dGhpcy55KCkuYWNjZXNzb3IsRD1sLnNldCh2LkFycmF5LmZsYXR0ZW4odGhpcy5kYXRhc2V0cygpLm1hcChmdW5jdGlvbihPKXtyZXR1cm4gTy5kYXRhKCkubWFwKGZ1bmN0aW9uKFAsCkgpe3JldHVybiBGKFAsSCxPKS52YWx1ZU9mKCl9KX0pKSkudmFsdWVzKCkubWFwKGZ1bmN0aW9uKE8pe3JldHVybitPfSksQj12Lk1hdGgubWluKEQsMCk7RD12Lk1hdGgubWF4KEQsMCk7dmFyIEk9Qy5zY2FsZShCKTtyZXR1cm4oQy5zY2FsZShEKS1JKS9NYXRoLmFicyhELUIpfTt4LnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBDPW5ldyB2Lk1hcCxGPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEQpe3ZhciBCPUQuZGF0YSgpLm1hcChmdW5jdGlvbihJLE8pe3JldHVybiB2Lk1hdGguaXNWYWxpZE51bWJlcihGLngoSSxPLEQpKSYmdi5NYXRoLmlzVmFsaWROdW1iZXIoRi55KEksTyxEKSkmJnYuTWF0aC5pc1ZhbGlkTnVtYmVyKEYud2lkdGgoSSxPLEQpKSYmdi5NYXRoLmlzVmFsaWROdW1iZXIoRi5oZWlnaHQoSSxPLEQpKT9JOm51bGx9KTtDLnNldChELEIpfSk7cmV0dXJuIEN9O3gucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9CmZ1bmN0aW9uKEMpe3ZhciBGPXRoaXM7dGhpcy5fcmVuZGVyQXJlYS5zZWxlY3RBbGwoIi5sYWJlbC1hcmVhIikucmVtb3ZlKCk7dGhpcy5fbGFiZWxzRW5hYmxlZCYmbnVsbCE9dGhpcy5sYWJlbCgpJiZ2LldpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIEYuX2RyYXdMYWJlbHMoKX0sQyl9O3gucHJvdG90eXBlLl9kcmF3TGFiZWxzPWZ1bmN0aW9uKCl7dmFyIEM9dGhpcyxGPXRoaXMuX2dldERhdGFUb0RyYXcoKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihELEIpe3JldHVybiBDLl9kcmF3TGFiZWwoRixELEIpfSl9O3gucHJvdG90eXBlLl9kcmF3TGFiZWw9ZnVuY3Rpb24oQyxGLEQpe3ZhciBCPXRoaXMsST10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxPPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZCgibGFiZWwtYXJlYSIsITApLFA9bmV3IGsuU3ZnQ29udGV4dChPLm5vZGUoKSksSD1uZXcgay5DYWNoZU1lYXN1cmVyKFApLApLPW5ldyBrLldyaXRlcihILFApO1A9dGhpcy54KCkuc2NhbGUucmFuZ2UoKTt2YXIgTT10aGlzLnkoKS5zY2FsZS5yYW5nZSgpLEw9TWF0aC5taW4uYXBwbHkobnVsbCxQKSxSPU1hdGgubWF4LmFwcGx5KG51bGwsUCksVT1NYXRoLm1pbi5hcHBseShudWxsLE0pLFk9TWF0aC5tYXguYXBwbHkobnVsbCxNKTtDLmdldChGKS5mb3JFYWNoKGZ1bmN0aW9uKGJhLG1hKXtpZihudWxsIT1iYSl7dmFyIGFhPSIiK0IubGFiZWwoKShiYSxtYSxGKSxjYT1ILm1lYXN1cmUoYWEpLGZhPUkueChiYSxtYSxGKSxkYT1JLnkoYmEsbWEsRiksbGE9SS53aWR0aChiYSxtYSxGKSxaPUkuaGVpZ2h0KGJhLG1hLEYpO2NhLmhlaWdodDw9WiYmY2Eud2lkdGg8PWxhJiYoWj0oWi1jYS5oZWlnaHQpLzIsZmErPShsYS1jYS53aWR0aCkvMixkYSs9WixsYT17bWluOmZhLG1heDpmYStjYS53aWR0aH0sWj17bWluOmRhLG1heDpkYStjYS5oZWlnaHR9LGxhLm1pbjxMfHxsYS5tYXg+Unx8Wi5taW48VXx8Wi5tYXg+Cll8fEIuX292ZXJsYXlMYWJlbChsYSxaLG1hLEQsQyl8fChiYT1JLmZpbGwoYmEsbWEsRiksYmE9MS42KnYuQ29sb3IuY29udHJhc3QoIndoaXRlIixiYSk8di5Db2xvci5jb250cmFzdCgiYmxhY2siLGJhKSxmYT1PLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2ZhKyIsIitkYSsiKSIpLGZhLmNsYXNzZWQoYmE/ImRhcmstbGFiZWwiOiJsaWdodC1sYWJlbCIsITApLEsud3JpdGUoYWEsY2Eud2lkdGgsY2EuaGVpZ2h0LHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIifSxmYS5ub2RlKCkpKSl9fSl9O3gucHJvdG90eXBlLl9vdmVybGF5TGFiZWw9ZnVuY3Rpb24oQyxGLEQsQixJKXtmb3IodmFyIE89dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksUD10aGlzLmRhdGFzZXRzKCksSD1CO0g8UC5sZW5ndGg7SCsrKWZvcih2YXIgSz1QW0hdLE09SS5nZXQoSyksTD1IPT09Qj9EKzE6MDtMPE0ubGVuZ3RoO0wrKylpZih2LkRPTS5pbnRlcnNlY3RzQkJveChDLApGLHRoaXMuX2VudGl0eUJCb3goTVtMXSxMLEssTykpKXJldHVybiEwO3JldHVybiExfTtyZXR1cm4geH0oZigxNikuWFlQbG90KTtjLl9YMl9LRVk9IngyIjtjLl9ZMl9LRVk9InkyIjtkLlJlY3RhbmdsZT1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHoseCl7ZnVuY3Rpb24gQygpe3RoaXMuY29uc3RydWN0b3I9en1mb3IodmFyIEYgaW4geCl4Lmhhc093blByb3BlcnR5KEYpJiYoeltGXT14W0ZdKTt6LnByb3RvdHlwZT1udWxsPT09eD9PYmplY3QuY3JlYXRlKHgpOihDLnByb3RvdHlwZT14LnByb3RvdHlwZSxuZXcgQyl9LGw9ZigzMSksaz1mKDYpLG49Zig0OCkscD1mKDcpLHE9ZigxNCkscj1mKDMpLHQ9ZigwKSx2PWYoMTkpLHk9ZigyKTtjPWZ1bmN0aW9uKHope2Z1bmN0aW9uIHgoKXt2YXIgQz16LmNhbGwodGhpcyl8fHRoaXM7Qy5hZGRDbGFzcygic2NhdHRlci1wbG90Iik7dmFyIEY9bmV3IHAuRWFzaW5nO0Yuc3RhcnREZWxheSg1KTsKRi5zdGVwRHVyYXRpb24oMjUwKTtGLm1heFRvdGFsRHVyYXRpb24oeS5QbG90Ll9BTklNQVRJT05fTUFYX0RVUkFUSU9OKTtDLmFuaW1hdG9yKHYuQW5pbWF0b3IuTUFJTixGKTtDLmF0dHIoIm9wYWNpdHkiLC42KTtDLmF0dHIoImZpbGwiLChuZXcgci5Db2xvcikucmFuZ2UoKVswXSk7Qy5zaXplKDYpO3ZhciBEPWwuY2lyY2xlKCk7Qy5zeW1ib2woZnVuY3Rpb24oKXtyZXR1cm4gRH0pO3JldHVybiBDfWcoeCx6KTt4LnByb3RvdHlwZS5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcz1mdW5jdGlvbihDKXt2YXIgRj10aGlzO3JldHVybiB6LnByb3RvdHlwZS5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcy5jYWxsKHRoaXMsQykubWFwKGZ1bmN0aW9uKEQpe3ZhciBCPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRi5zaXplKCkpKEQuZGF0dW0sRC5pbmRleCxELmRhdGFzZXQpO0QuZGlhbWV0ZXI9QjtyZXR1cm4gRH0pfTt4LnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKEMpe3ZhciBGPQp0aGlzO3JldHVybiBuZXcgay5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgbi5TeW1ib2xTVkdEcmF3ZXJ9LGZ1bmN0aW9uKEQpe3JldHVybiBuZXcgcS5DYW52YXNEcmF3ZXIoRCxuLm1ha2VTeW1ib2xDYW52YXNEcmF3U3RlcChDLGZ1bmN0aW9uKCl7cmV0dXJuIHkuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRi5zeW1ib2woKSl9LGZ1bmN0aW9uKCl7cmV0dXJuIHkuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRi5zaXplKCkpfSkpfSl9O3gucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oQyxGKXtpZihudWxsPT1DKXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh4Ll9TSVpFX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KHguX1NJWkVfS0VZLEMsRik7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUuc3ltYm9sPWZ1bmN0aW9uKEMpe2lmKG51bGw9PUMpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHguX1NZTUJPTF9LRVkpO3RoaXMuX3Byb3BlcnR5QmluZGluZ3Muc2V0KHguX1NZTUJPTF9LRVksCnthY2Nlc3NvcjpDfSk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7dmFyIEM9W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgRj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxEPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zeW1ib2woKSk7Ri5kPWZ1bmN0aW9uKEIsSSxPKXtyZXR1cm4gRChCLEksTykoMCkobnVsbCl9O0MucHVzaCh7YXR0clRvUHJvamVjdG9yOkYsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3Iodi5BbmltYXRvci5SRVNFVCl9KX1DLnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih2LkFuaW1hdG9yLk1BSU4pfSk7cmV0dXJuIEN9O3gucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgQz16LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyksCkY9eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksRD15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTtDLng9RjtDLnk9RDtDLnRyYW5zZm9ybT1mdW5jdGlvbihCLEksTyl7cmV0dXJuInRyYW5zbGF0ZSgiK0YoQixJLE8pKyIsIitEKEIsSSxPKSsiKSJ9O0MuZD10aGlzLl9jb25zdHJ1Y3RTeW1ib2xHZW5lcmF0b3IoKTtyZXR1cm4gQ307eC5wcm90b3R5cGUuX2NvbnN0cnVjdFN5bWJvbEdlbmVyYXRvcj1mdW5jdGlvbigpe3ZhciBDPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zeW1ib2woKSksRj15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2l6ZSgpKTtyZXR1cm4gZnVuY3Rpb24oRCxCLEkpe3JldHVybiBDKEQsQixJKShGKEQsQixJKSkobnVsbCl9fTt4LnByb3RvdHlwZS5fZW50aXR5Qm91bmRzPWZ1bmN0aW9uKEMpe3JldHVybnt4OkMucG9zaXRpb24ueC1DLmRpYW1ldGVyLzIseTpDLnBvc2l0aW9uLnktQy5kaWFtZXRlci8yLHdpZHRoOkMuZGlhbWV0ZXIsCmhlaWdodDpDLmRpYW1ldGVyfX07eC5wcm90b3R5cGUuX2VudGl0eVZpc2libGVPblBsb3Q9ZnVuY3Rpb24oQyxGKXt2YXIgRD17bWluOkYudG9wTGVmdC54LG1heDpGLmJvdHRvbVJpZ2h0Lnh9O0Y9e21pbjpGLnRvcExlZnQueSxtYXg6Ri5ib3R0b21SaWdodC55fTtDPXRoaXMuX2VudGl0eUJvdW5kcyhDKTtyZXR1cm4gdC5ET00uaW50ZXJzZWN0c0JCb3goRCxGLEMpfTt4LnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEMpe3ZhciBGPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLEQ9eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSksQj15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2l6ZSgpKTtyZXR1cm4gdGhpcy5lbnRpdGllcygpLmZpbHRlcihmdW5jdGlvbihJKXt2YXIgTz1JLmRhdHVtLFA9SS5pbmRleCxIPUkuZGF0YXNldDtJPUYoTyxQLEgpO3ZhciBLPUQoTyxQLEgpO089QihPLFAsSCk7cmV0dXJuIEktTy8yPD1DLngmJkMueDw9SStPLwoyJiZLLU8vMjw9Qy55JiZDLnk8PUsrTy8yfSl9O3JldHVybiB4fShmKDE2KS5YWVBsb3QpO2MuX1NJWkVfS0VZPSJzaXplIjtjLl9TWU1CT0xfS0VZPSJzeW1ib2wiO2QuU2NhdHRlcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHQsdil7ZnVuY3Rpb24geSgpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIHogaW4gdil2Lmhhc093blByb3BlcnR5KHopJiYodFt6XT12W3pdKTt0LnByb3RvdHlwZT1udWxsPT09dj9PYmplY3QuY3JlYXRlKHYpOih5LnByb3RvdHlwZT12LnByb3RvdHlwZSxuZXcgeSl9LGw9Zig3KSxrPWYoNiksbj1mKDQ3KSxwPWYoMykscT1mKDM1KSxyPWYoMik7Yz1mdW5jdGlvbih0KXtmdW5jdGlvbiB2KCl7dmFyIHk9dC5jYWxsKHRoaXMpfHx0aGlzO3kuYWRkQ2xhc3MoInNlZ21lbnQtcGxvdCIpO3kuYXR0cigic3Ryb2tlIiwobmV3IHAuQ29sb3IpLnJhbmdlKClbMF0pO3kuYXR0cigic3Ryb2tlLXdpZHRoIiwKIjJweCIpO3JldHVybiB5fWcodix0KTt2LnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBrLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuLlNlZ21lbnRTVkdEcmF3ZXJ9LGZ1bmN0aW9uKCl7cS53YXJuKCJjYW52YXMgcmVuZGVyZXIgaXMgbm90IHN1cHBvcnRlZCBvbiBTZWdtZW50IFBsb3QhIik7cmV0dXJuIG51bGx9KX07di5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7cmV0dXJuW3thdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6bmV3IGwuTnVsbH1dfTt2LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24oeSl7cmV0dXJuIngyIj09PXk/dC5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywieCIpOiJ5MiI9PT15P3QucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsInkiKTp0LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLAp5KX07di5wcm90b3R5cGUueD1mdW5jdGlvbih5LHope2lmKG51bGw9PXkpcmV0dXJuIHQucHJvdG90eXBlLnguY2FsbCh0aGlzKTtudWxsPT16P3QucHJvdG90eXBlLnguY2FsbCh0aGlzLHkpOih0LnByb3RvdHlwZS54LmNhbGwodGhpcyx5LHopLHk9KHk9dGhpcy54MigpKSYmeS5hY2Nlc3NvcixudWxsIT15JiZ0aGlzLl9iaW5kUHJvcGVydHkodi5fWDJfS0VZLHkseikpO3JldHVybiB0aGlzfTt2LnByb3RvdHlwZS54Mj1mdW5jdGlvbih5KXtpZihudWxsPT15KXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh2Ll9YMl9LRVkpO3ZhciB6PXRoaXMueCgpO3RoaXMuX2JpbmRQcm9wZXJ0eSh2Ll9YMl9LRVkseSx6JiZ6LnNjYWxlKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt2LnByb3RvdHlwZS55PWZ1bmN0aW9uKHkseil7aWYobnVsbD09eSlyZXR1cm4gdC5wcm90b3R5cGUueS5jYWxsKHRoaXMpO251bGw9PXo/dC5wcm90b3R5cGUueS5jYWxsKHRoaXMseSk6KHQucHJvdG90eXBlLnkuY2FsbCh0aGlzLAp5LHopLHk9KHk9dGhpcy55MigpKSYmeS5hY2Nlc3NvcixudWxsIT15JiZ0aGlzLl9iaW5kUHJvcGVydHkodi5fWTJfS0VZLHkseikpO3JldHVybiB0aGlzfTt2LnByb3RvdHlwZS55Mj1mdW5jdGlvbih5KXtpZihudWxsPT15KXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh2Ll9ZMl9LRVkpO3ZhciB6PXRoaXMueSgpO3RoaXMuX2JpbmRQcm9wZXJ0eSh2Ll9ZMl9LRVkseSx6JiZ6LnNjYWxlKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt2LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIHk9dC5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpO3kueDE9ci5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSk7eS54Mj1udWxsPT10aGlzLngyKCk/ci5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSk6ci5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngyKCkpO3kueTE9ci5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7CnkueTI9bnVsbD09dGhpcy55MigpP3IuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpOnIuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55MigpKTtyZXR1cm4geX07di5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbih5KXt5PXRoaXMuZW50aXR5TmVhcmVzdCh5KTtyZXR1cm4gbnVsbCE9eT9beV06W119O3YucHJvdG90eXBlLmVudGl0aWVzSW49ZnVuY3Rpb24oeSx6KXtpZihudWxsPT16KXt2YXIgeD17bWluOnkudG9wTGVmdC54LG1heDp5LmJvdHRvbVJpZ2h0Lnh9O3k9e21pbjp5LnRvcExlZnQueSxtYXg6eS5ib3R0b21SaWdodC55fX1lbHNlIHg9eSx5PXo7cmV0dXJuIHRoaXMuX2VudGl0aWVzSW50ZXJzZWN0aW5nKHgseSl9O3YucHJvdG90eXBlLl9lbnRpdGllc0ludGVyc2VjdGluZz1mdW5jdGlvbih5LHope3ZhciB4PXRoaXMsQz1bXSxGPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO3RoaXMuZW50aXRpZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEQpe3guX2xpbmVJbnRlcnNlY3RzQm94KEQsCnkseixGKSYmQy5wdXNoKEQpfSk7cmV0dXJuIEN9O3YucHJvdG90eXBlLl9saW5lSW50ZXJzZWN0c0JveD1mdW5jdGlvbih5LHoseCxDKXt2YXIgRj10aGlzLEQ9Qy54MSh5LmRhdHVtLHkuaW5kZXgseS5kYXRhc2V0KSxCPUMueDIoeS5kYXR1bSx5LmluZGV4LHkuZGF0YXNldCksST1DLnkxKHkuZGF0dW0seS5pbmRleCx5LmRhdGFzZXQpO3k9Qy55Mih5LmRhdHVtLHkuaW5kZXgseS5kYXRhc2V0KTtpZih6Lm1pbjw9RCYmRDw9ei5tYXgmJngubWluPD1JJiZJPD14Lm1heHx8ei5taW48PUImJkI8PXoubWF4JiZ4Lm1pbjw9eSYmeTw9eC5tYXgpcmV0dXJuITA7dmFyIE89e3g6RCx5Okl9LFA9e3g6Qix5fSxIPVt7eDp6Lm1pbix5OngubWlufSx7eDp6Lm1pbix5OngubWF4fSx7eDp6Lm1heCx5OngubWF4fSx7eDp6Lm1heCx5OngubWlufV07cmV0dXJuIDA8SC5maWx0ZXIoZnVuY3Rpb24oSyxNKXtyZXR1cm4gMCE9PU0/Ri5fbGluZUludGVyc2VjdHNTZWdtZW50KE8sUCxLLEhbTS0xXSkmJgpGLl9saW5lSW50ZXJzZWN0c1NlZ21lbnQoSyxIW00tMV0sTyxQKTohMX0pLmxlbmd0aH07di5wcm90b3R5cGUuX2xpbmVJbnRlcnNlY3RzU2VnbWVudD1mdW5jdGlvbih5LHoseCxDKXtmdW5jdGlvbiBGKEQsQixJKXtyZXR1cm4oQi54LUQueCkqKEkueS1CLnkpLShCLnktRC55KSooSS54LUIueCl9cmV0dXJuIDA+Rih5LHoseCkqRih5LHosQyl9O3JldHVybiB2fShmKDE2KS5YWVBsb3QpO2MuX1gyX0tFWT0ieDIiO2MuX1kyX0tFWT0ieTIiO2QuU2VnbWVudD1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHIsdCl7ZnVuY3Rpb24gdigpe3RoaXMuY29uc3RydWN0b3I9cn1mb3IodmFyIHkgaW4gdCl0Lmhhc093blByb3BlcnR5KHkpJiYoclt5XT10W3ldKTtyLnByb3RvdHlwZT1udWxsPT09dD9PYmplY3QuY3JlYXRlKHQpOih2LnByb3RvdHlwZT10LnByb3RvdHlwZSxuZXcgdil9LGw9ZigxKSxrPWYoNyksbj1mKDIwKSxwPWYoMCk7CmM9Zig1MCk7dmFyIHE9ZigyKTtmPWZ1bmN0aW9uKHIpe2Z1bmN0aW9uIHQoKXt2YXIgdj1yLmNhbGwodGhpcyl8fHRoaXM7di5fc3RhY2tpbmdSZXN1bHQ9bi5tZW1UaHVuayhmdW5jdGlvbigpe3JldHVybiB2LmRhdGFzZXRzKCl9LGZ1bmN0aW9uKCl7cmV0dXJuIHYueCgpLmFjY2Vzc29yfSxmdW5jdGlvbigpe3JldHVybiB2LnkoKS5hY2Nlc3Nvcn0sZnVuY3Rpb24oKXtyZXR1cm4gdi5fc3RhY2tpbmdPcmRlcn0sZnVuY3Rpb24oeSx6LHgsQyl7cmV0dXJuIHAuU3RhY2tpbmcuc3RhY2soeSx6LHgsQyl9KTt2Ll9zdGFja2VkRXh0ZW50PW4ubWVtVGh1bmsodi5fc3RhY2tpbmdSZXN1bHQsZnVuY3Rpb24oKXtyZXR1cm4gdi54KCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHYuX2ZpbHRlckZvclByb3BlcnR5KCJ5Iil9LGZ1bmN0aW9uKHkseix4KXtyZXR1cm4gcC5TdGFja2luZy5zdGFja2VkRXh0ZW50KHkseix4KX0pO3YuX2Jhc2VsaW5lVmFsdWU9MDt2Ll9zdGFja2luZ09yZGVyPQoiYm90dG9tdXAiO3YuYWRkQ2xhc3MoInN0YWNrZWQtYXJlYS1wbG90Iik7di5hdHRyKCJmaWxsLW9wYWNpdHkiLDEpO3YuX2Jhc2VsaW5lVmFsdWVQcm92aWRlcj1mdW5jdGlvbigpe3JldHVyblt2Ll9iYXNlbGluZVZhbHVlXX07di5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZCghMSk7cmV0dXJuIHZ9Zyh0LHIpO3QucHJvdG90eXBlLmNyb3BwZWRSZW5kZXJpbmdFbmFibGVkPWZ1bmN0aW9uKHYpe3JldHVybiBudWxsPT12P3IucHJvdG90eXBlLmNyb3BwZWRSZW5kZXJpbmdFbmFibGVkLmNhbGwodGhpcyk6dj8ocC5XaW5kb3cud2FybigiV2FybmluZzogU3RhY2tlZCBBcmVhIFBsb3QgZG9lcyBub3Qgc3VwcG9ydCBjcm9wcGVkIHJlbmRlcmluZy4iKSx0aGlzKTpyLnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZC5jYWxsKHRoaXMsdil9O3QucHJvdG90eXBlLl9nZXRBbmltYXRvcj1mdW5jdGlvbigpe3JldHVybiBuZXcgay5OdWxsfTt0LnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtyLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTsKdGhpcy5fYmFzZWxpbmU9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApfTt0LnByb3RvdHlwZS54PWZ1bmN0aW9uKHYseSl7aWYobnVsbD09dilyZXR1cm4gci5wcm90b3R5cGUueC5jYWxsKHRoaXMpO251bGw9PXk/ci5wcm90b3R5cGUueC5jYWxsKHRoaXMsdik6ci5wcm90b3R5cGUueC5jYWxsKHRoaXMsdix5KTt0aGlzLl9jaGVja1NhbWVEb21haW4oKTtyZXR1cm4gdGhpc307dC5wcm90b3R5cGUueT1mdW5jdGlvbih2LHkpe2lmKG51bGw9PXYpcmV0dXJuIHIucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtudWxsPT15P3IucHJvdG90eXBlLnkuY2FsbCh0aGlzLHYpOnIucHJvdG90eXBlLnkuY2FsbCh0aGlzLHYseSk7dGhpcy5fY2hlY2tTYW1lRG9tYWluKCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLnN0YWNraW5nT3JkZXI9ZnVuY3Rpb24odil7aWYobnVsbD09dilyZXR1cm4gdGhpcy5fc3RhY2tpbmdPcmRlcjt0aGlzLl9zdGFja2luZ09yZGVyPQp2O3RoaXMuX29uRGF0YXNldFVwZGF0ZSgpO3JldHVybiB0aGlzfTt0LnByb3RvdHlwZS5kb3duc2FtcGxpbmdFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHIucHJvdG90eXBlLmRvd25zYW1wbGluZ0VuYWJsZWQuY2FsbCh0aGlzKX07dC5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbigpe3ZhciB2PXRoaXMueSgpLnNjYWxlLnNjYWxlKHRoaXMuX2Jhc2VsaW5lVmFsdWUpO3Y9e3gxOjAseTE6dix4Mjp0aGlzLndpZHRoKCkseTI6dn07dGhpcy5fZ2V0QW5pbWF0b3IoImJhc2VsaW5lIikuYW5pbWF0ZSh0aGlzLl9iYXNlbGluZSx2KX07dC5wcm90b3R5cGUuX3VwZGF0ZVlTY2FsZT1mdW5jdGlvbigpe3ZhciB2PXRoaXMueSgpO3Y9diYmdi5zY2FsZTtudWxsIT12JiYodi5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlciksdi5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlcikpfTsKdC5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX2NoZWNrU2FtZURvbWFpbigpO3IucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKTtyZXR1cm4gdGhpc307dC5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5PWZ1bmN0aW9uKHYpe3JldHVybiJ5Ij09PXY/W3RoaXMuX3N0YWNrZWRFeHRlbnQoKV06ci5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5LmNhbGwodGhpcyx2KX07dC5wcm90b3R5cGUuX2NoZWNrU2FtZURvbWFpbj1mdW5jdGlvbigpe2lmKHRoaXMuX3Byb2plY3RvcnNSZWFkeSgpKXt2YXIgdj10aGlzLmRhdGFzZXRzKCkseT10aGlzLngoKS5hY2Nlc3Nvcix6PXYubWFwKGZ1bmN0aW9uKEMpe3JldHVybiBsLnNldChDLmRhdGEoKS5tYXAoZnVuY3Rpb24oRixEKXtyZXR1cm4geShGLEQsQykudG9TdHJpbmcoKX0pKS52YWx1ZXMoKX0pLHg9dC5fZG9tYWluS2V5cyh2LHkpO3ouc29tZShmdW5jdGlvbihDKXtyZXR1cm4gQy5sZW5ndGghPT0KeC5sZW5ndGh9KSYmcC5XaW5kb3cud2FybigidGhlIGRvbWFpbnMgYWNyb3NzIHRoZSBkYXRhc2V0cyBhcmUgbm90IHRoZSBzYW1lLiBQbG90IG1heSBwcm9kdWNlIHVuaW50ZW5kZWQgYmVoYXZpb3IuIil9fTt0Ll9kb21haW5LZXlzPWZ1bmN0aW9uKHYseSl7dmFyIHo9bC5zZXQoKTt2LmZvckVhY2goZnVuY3Rpb24oeCl7eC5kYXRhKCkuZm9yRWFjaChmdW5jdGlvbihDLEYpe3ouYWRkKHkoQyxGLHgpKX0pfSk7cmV0dXJuIHoudmFsdWVzKCl9O3QucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB2KEQsQixJKXtyZXR1cm4gcC5TdGFja2luZy5ub3JtYWxpemVLZXkoQyhELEIsSSkpfXZhciB5PXRoaXMsej1yLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcykseD10aGlzLnkoKS5hY2Nlc3NvcixDPXRoaXMueCgpLmFjY2Vzc29yLEY9dGhpcy5fc3RhY2tpbmdSZXN1bHQoKTt6LmQ9dGhpcy5fY29uc3RydWN0QXJlYVByb2plY3RvcihxLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSwKZnVuY3Rpb24oRCxCLEkpe3JldHVybiB5LnkoKS5zY2FsZS5zY2FsZSgreChELEIsSSkrRi5nZXQoSSkuZ2V0KHYoRCxCLEkpKS5vZmZzZXQpfSxmdW5jdGlvbihELEIsSSl7cmV0dXJuIHkueSgpLnNjYWxlLnNjYWxlKEYuZ2V0KEkpLmdldCh2KEQsQixJKSkub2Zmc2V0KX0pO3JldHVybiB6fTt0LnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbih2LHkseil7dmFyIHg9ci5wcm90b3R5cGUuX3BpeGVsUG9pbnQuY2FsbCh0aGlzLHYseSx6KSxDPXRoaXMueCgpLmFjY2Vzc29yKHYseSx6KTt2PXRoaXMueSgpLmFjY2Vzc29yKHYseSx6KTt6PXRoaXMueSgpLnNjYWxlLnNjYWxlKCt2K3RoaXMuX3N0YWNraW5nUmVzdWx0KCkuZ2V0KHopLmdldChwLlN0YWNraW5nLm5vcm1hbGl6ZUtleShDKSkub2Zmc2V0KTtyZXR1cm57eDp4LngseTp6fX07cmV0dXJuIHR9KGMuQXJlYSk7ZC5TdGFja2VkQXJlYT1mfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fApmdW5jdGlvbih0LHYpe2Z1bmN0aW9uIHkoKXt0aGlzLmNvbnN0cnVjdG9yPXR9Zm9yKHZhciB6IGluIHYpdi5oYXNPd25Qcm9wZXJ0eSh6KSYmKHRbel09dlt6XSk7dC5wcm90b3R5cGU9bnVsbD09PXY/T2JqZWN0LmNyZWF0ZSh2KTooeS5wcm90b3R5cGU9di5wcm90b3R5cGUsbmV3IHkpfSxsPWYoNSksaz1mKDgpLG49ZigyMCkscD1mKDApLHE9ZigyNykscj1mKDIpO2M9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gdih5KXt2b2lkIDA9PT15JiYoeT0idmVydGljYWwiKTt2YXIgej10LmNhbGwodGhpcyx5KXx8dGhpczt6Ll9leHRyZW1hRm9ybWF0dGVyPWsuaWRlbnRpdHkoKTt6Ll9zdGFja2luZ1Jlc3VsdD1uLm1lbVRodW5rKGZ1bmN0aW9uKCl7cmV0dXJuIHouZGF0YXNldHMoKX0sZnVuY3Rpb24oKXtyZXR1cm4gei5wb3NpdGlvbigpLmFjY2Vzc29yfSxmdW5jdGlvbigpe3JldHVybiB6Lmxlbmd0aCgpLmFjY2Vzc29yfSxmdW5jdGlvbigpe3JldHVybiB6Ll9zdGFja2luZ09yZGVyfSwKZnVuY3Rpb24oeCxDLEYsRCl7cmV0dXJuIHAuU3RhY2tpbmcuc3RhY2soeCxDLEYsRCl9KTt6Ll9zdGFja2VkRXh0ZW50PW4ubWVtVGh1bmsoei5fc3RhY2tpbmdSZXN1bHQsZnVuY3Rpb24oKXtyZXR1cm4gei5wb3NpdGlvbigpLmFjY2Vzc29yfSxmdW5jdGlvbigpe3JldHVybiB6Ll9maWx0ZXJGb3JQcm9wZXJ0eSh6Ll9pc1ZlcnRpY2FsPyJ5IjoieCIpfSxmdW5jdGlvbih4LEMsRil7cmV0dXJuIHAuU3RhY2tpbmcuc3RhY2tlZEV4dGVudCh4LEMsRil9KTt6LmFkZENsYXNzKCJzdGFja2VkLWJhci1wbG90Iik7ei5fc3RhY2tpbmdPcmRlcj0iYm90dG9tdXAiO3JldHVybiB6fWcodix0KTt2LnByb3RvdHlwZS5zdGFja2luZ09yZGVyPWZ1bmN0aW9uKHkpe2lmKG51bGw9PXkpcmV0dXJuIHRoaXMuX3N0YWNraW5nT3JkZXI7dGhpcy5fc3RhY2tpbmdPcmRlcj15O3RoaXMuX29uRGF0YXNldFVwZGF0ZSgpO3JldHVybiB0aGlzfTt2LnByb3RvdHlwZS5leHRyZW1hRm9ybWF0dGVyPWZ1bmN0aW9uKHkpe2lmKDA9PT0KYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fZXh0cmVtYUZvcm1hdHRlcjt0aGlzLl9leHRyZW1hRm9ybWF0dGVyPXk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307di5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fbGFiZWxBcmVhPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZChxLkJhci5fTEFCRUxfQVJFQV9DTEFTUywhMCk7dmFyIHk9bmV3IGwuU3ZnQ29udGV4dCh0aGlzLl9sYWJlbEFyZWEubm9kZSgpKTt0aGlzLl9tZWFzdXJlcj1uZXcgbC5DYWNoZU1lYXN1cmVyKHkpO3RoaXMuX3dyaXRlcj1uZXcgbC5Xcml0ZXIodGhpcy5fbWVhc3VyZXIseSl9O3YucHJvdG90eXBlLl9kcmF3TGFiZWxzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24geShQLEgpe3ZhciBLPXguX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yKCksTT14LndpZHRoKCksTD14LmhlaWdodCgpO1AuZm9yRWFjaChmdW5jdGlvbihSKXtpZihSLmV4dGVudCE9PQpDKXt2YXIgVT14LmV4dHJlbWFGb3JtYXR0ZXIoKShSLmV4dGVudCksWT14Ll9tZWFzdXJlci5tZWFzdXJlKFUpLGJhPVIuc3RhY2tlZERhdHVtLG1hPWJhLm9yaWdpbmFsRGF0dW0sYWE9YmEub3JpZ2luYWxJbmRleDtiYT1iYS5vcmlnaW5hbERhdGFzZXQ7eC5faXNEYXR1bU9uU2NyZWVuKEssTSxMLG1hLGFhLGJhKSYmKG1hPXIuUGxvdC5fc2NhbGVkQWNjZXNzb3IoeC5hdHRyKHEuQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSkpKG1hLGFhLGJhKSxhYT1ELnNjYWxlKFIuZXh0ZW50KSxSPXguX2dldFBvc2l0aW9uQXR0cihGLnNjYWxlKFIuYXhpc1ZhbHVlKSxtYSkrbWEvMixSPUgoeC5faXNWZXJ0aWNhbD97eDpSLHk6YWF9Ont4OmFhLHk6Un0sWSxtYSksVT16KFUse3RvcExlZnQ6Uixib3R0b21SaWdodDp7eDpSLngrWS53aWR0aCx5OlIueStZLmhlaWdodH19LG1hKSxPLnB1c2goVSkpfX0pfWZ1bmN0aW9uIHooUCxILEspe3ZhciBNPUgudG9wTGVmdCxMPU0ueCxSPU0ueTtNPUguYm90dG9tUmlnaHQueC0KSC50b3BMZWZ0Lng7SD1ILmJvdHRvbVJpZ2h0LnktSC50b3BMZWZ0Lnk7Sz14Ll9pc1ZlcnRpY2FsP00+SzpIPks7S3x8KEw9eC5fbGFiZWxBcmVhLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0wrIiwgIitSKyIpIiksTC5jbGFzc2VkKCJzdGFja2VkLWJhci1sYWJlbCIsITApLHguX3dyaXRlci53cml0ZShQLE0sSCx7eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIn0sTC5ub2RlKCkpKTtyZXR1cm4gS312YXIgeD10aGlzO3QucHJvdG90eXBlLl9kcmF3TGFiZWxzLmNhbGwodGhpcyk7dGhpcy5fbGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpO3ZhciBDPSt0aGlzLmJhc2VsaW5lVmFsdWUoKSxGPXRoaXMucG9zaXRpb24oKS5zY2FsZSxEPXRoaXMubGVuZ3RoKCkuc2NhbGUsQj1wLlN0YWNraW5nLnN0YWNrZWRFeHRlbnRzKHRoaXMuX3N0YWNraW5nUmVzdWx0KCkpLEk9Qi5taW5pbXVtRXh0ZW50cyxPPVtdO3koQi5tYXhpbXVtRXh0ZW50cywKZnVuY3Rpb24oUCxIKXt2YXIgSz14Ll9pc1ZlcnRpY2FsP0gud2lkdGg6SC5oZWlnaHQ7SD14Ll9pc1ZlcnRpY2FsP0guaGVpZ2h0Okgud2lkdGg7cmV0dXJue3g6eC5faXNWZXJ0aWNhbD9QLngtSy8yOlAueCt2Ll9FWFRSRU1BX0xBQkVMX01BUkdJTl9GUk9NX0JBUix5OnguX2lzVmVydGljYWw/UC55LUg6UC55LUsvMn19KTt5KEksZnVuY3Rpb24oUCxIKXt2YXIgSz14Ll9pc1ZlcnRpY2FsP0gud2lkdGg6SC5oZWlnaHQ7SD14Ll9pc1ZlcnRpY2FsP0guaGVpZ2h0Okgud2lkdGg7cmV0dXJue3g6eC5faXNWZXJ0aWNhbD9QLngtSy8yOlAueC1ILHk6eC5faXNWZXJ0aWNhbD9QLnkrdi5fRVhUUkVNQV9MQUJFTF9NQVJHSU5fRlJPTV9CQVI6UC55LUsvMn19KTtPLnNvbWUoZnVuY3Rpb24oUCl7cmV0dXJuIFB9KSYmdGhpcy5fbGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpfTt2LnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXtmdW5jdGlvbiB5KE0sCkwsUil7cmV0dXJuIDA+K1AoTSxMLFIpP0MoTSxMLFIpOngoTSxMLFIpfWZ1bmN0aW9uIHooTSxMLFIpe3JldHVybiBNYXRoLmFicyh4KE0sTCxSKS1DKE0sTCxSKSl9ZnVuY3Rpb24geChNLEwsUil7cmV0dXJuIE8uc2NhbGUoK1AoTSxMLFIpK0suZ2V0KFIpLmdldChGKE0sTCxSKSkub2Zmc2V0KX1mdW5jdGlvbiBDKE0sTCxSKXtyZXR1cm4gTy5zY2FsZShLLmdldChSKS5nZXQoRihNLEwsUikpLm9mZnNldCl9ZnVuY3Rpb24gRihNLEwsUil7cmV0dXJuIHAuU3RhY2tpbmcubm9ybWFsaXplS2V5KEgoTSxMLFIpKX12YXIgRD10aGlzLEI9dC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyksST10aGlzLl9pc1ZlcnRpY2FsPyJ5IjoieCIsTz10aGlzLmxlbmd0aCgpLnNjYWxlLFA9dGhpcy5sZW5ndGgoKS5hY2Nlc3NvcixIPXRoaXMucG9zaXRpb24oKS5hY2Nlc3NvcixLPXRoaXMuX3N0YWNraW5nUmVzdWx0KCk7Qlt0aGlzLl9pc1ZlcnRpY2FsPyJoZWlnaHQiOgoid2lkdGgiXT16O0JbSV09ZnVuY3Rpb24oTSxMLFIpe3JldHVybiBELl9pc1ZlcnRpY2FsP3koTSxMLFIpOnkoTSxMLFIpLXooTSxMLFIpfTtyZXR1cm4gQn07di5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5PWZ1bmN0aW9uKHkpe3JldHVybiB5PT09KHRoaXMuX2lzVmVydGljYWw/InkiOiJ4Iik/W3RoaXMuX3N0YWNrZWRFeHRlbnQoKV06dC5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5LmNhbGwodGhpcyx5KX07di5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyk7dGhpcy5fbWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHZ9KHEuQmFyKTtjLl9FWFRSRU1BX0xBQkVMX01BUkdJTl9GUk9NX0JBUj01O2QuU3RhY2tlZEJhcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG4scCl7ZnVuY3Rpb24gcSgpe3RoaXMuY29uc3RydWN0b3I9Cm59Zm9yKHZhciByIGluIHApcC5oYXNPd25Qcm9wZXJ0eShyKSYmKG5bcl09cFtyXSk7bi5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToocS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IHEpfSxsPWYoMCk7Yz1mKDI3KTt2YXIgaz1mKDIpO2Y9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcCgpe3ZhciBxPW4uY2FsbCh0aGlzKXx8dGhpcztxLl9jb25uZWN0b3JzRW5hYmxlZD0hMTtxLmFkZENsYXNzKCJ3YXRlcmZhbGwtcGxvdCIpO3JldHVybiBxfWcocCxuKTtwLnByb3RvdHlwZS5jb25uZWN0b3JzRW5hYmxlZD1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl9jb25uZWN0b3JzRW5hYmxlZDt0aGlzLl9jb25uZWN0b3JzRW5hYmxlZD1xO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS50b3RhbD1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChwLl9UT1RBTF9LRVkpO3RoaXMuX2JpbmRQcm9wZXJ0eShwLl9UT1RBTF9LRVksCnEsbnVsbCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24ocSl7dmFyIHI9dGhpczt0aGlzLl9jb25uZWN0b3JBcmVhLnNlbGVjdEFsbCgibGluZSIpLnJlbW92ZSgpO3RoaXMuX2Nvbm5lY3RvcnNFbmFibGVkJiZsLldpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIHIuX2RyYXdDb25uZWN0b3JzKCl9LHEpfTtwLnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0PWZ1bmN0aW9uKHEpe3E9bi5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldC5jYWxsKHRoaXMscSk7dGhpcy5fY29ubmVjdG9yQXJlYT10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgiZyIpLmNsYXNzZWQocC5fQ09OTkVDVE9SX0FSRUFfQ0xBU1MsITApO3JldHVybiBxfTtwLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24ocSl7cmV0dXJuInkiPT09cT9bdGhpcy5fZXh0ZW50XTpuLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLApxKX07cC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIHE9dGhpcyxyPW4ucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLHQ9dGhpcy55KCkuc2NhbGUsdj1rLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMudG90YWwoKSk7bnVsbD09dGhpcy5hdHRyKCJ5IikmJihyLnk9ZnVuY3Rpb24oeSx6LHgpe3ZhciBDPXEueSgpLmFjY2Vzc29yKHkseix4KTtpZih2KHkseix4KSlyZXR1cm4gTWF0aC5taW4odC5zY2FsZShDKSx0LnNjYWxlKDApKTt5PXEuX3N1YnRvdGFsc1t6XTtpZigwPT09eilyZXR1cm4gMD5DP3Quc2NhbGUoeS1DKTp0LnNjYWxlKHkpO3o9cS5fc3VidG90YWxzW3otMV07cmV0dXJuIHk+ej90LnNjYWxlKHkpOnQuc2NhbGUoeil9KTtudWxsPT10aGlzLmF0dHIoImhlaWdodCIpJiYoci5oZWlnaHQ9ZnVuY3Rpb24oeSx6LHgpe3ZhciBDPXYoeSx6LHgpO3k9cS55KCkuYWNjZXNzb3IoeSx6LHgpO2lmKEMpcmV0dXJuIE1hdGguYWJzKHQuc2NhbGUoeSktCnQuc2NhbGUoMCkpO0M9cS5fc3VidG90YWxzW3pdO2lmKDA9PT16KXJldHVybiBNYXRoLmFicyh0LnNjYWxlKEMpLXQuc2NhbGUoQy15KSk7ej1xLl9zdWJ0b3RhbHNbei0xXTtyZXR1cm4gTWF0aC5hYnModC5zY2FsZShDKS10LnNjYWxlKHopKX0pO3JbImNsYXNzIl09ZnVuY3Rpb24oeSx6LHgpe3ZhciBDPSIiO251bGwhPXEuYXR0cigiY2xhc3MiKSYmKEM9cS5hdHRyKCJjbGFzcyIpLmFjY2Vzc29yKHkseix4KSsiICIpO2lmKHYoeSx6LHgpKXJldHVybiBDK3AuX0JBUl9UT1RBTF9DTEFTUzt5PXEueSgpLmFjY2Vzc29yKHkseix4KTtyZXR1cm4gQysoMDx5P3AuX0JBUl9HUk9XVEhfQ0xBU1M6cC5fQkFSX0RFQ0xJTkVfQ0xBU1MpfTtyZXR1cm4gcn07cC5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVN1YnRvdGFscygpO24ucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuX2NhbGN1bGF0ZVN1YnRvdGFsc0FuZEV4dGVudD0KZnVuY3Rpb24ocSl7dmFyIHI9dGhpcyx0PU51bWJlci5NQVhfVkFMVUUsdj1OdW1iZXIuTUlOX1ZBTFVFLHk9MCx6PSExO3EuZGF0YSgpLmZvckVhY2goZnVuY3Rpb24oeCxDKXt2YXIgRj1yLnkoKS5hY2Nlc3Nvcih4LEMscSk7KHg9ci50b3RhbCgpLmFjY2Vzc29yKHgsQyxxKSkmJjAhPT1DfHwoeSs9Rik7ci5fc3VidG90YWxzLnB1c2goeSk7eTx0JiYodD15KTt5PnYmJih2PXkpO3gmJihGPHQmJih0PUYpLEY+diYmKHY9RikpO2lmKCF6JiZ4KXtDPUYteTtmb3IoRj0wO0Y8ci5fc3VidG90YWxzLmxlbmd0aDtGKyspci5fc3VidG90YWxzW0ZdKz1DO3o9ITA7eSs9Qzt0Kz1DO3YrPUN9fSk7dGhpcy5fZXh0ZW50PVt0LHZdfTtwLnByb3RvdHlwZS5fZHJhd0Nvbm5lY3RvcnM9ZnVuY3Rpb24oKXtmb3IodmFyIHE9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCkscj10aGlzLmRhdGFzZXRzKClbMF0sdD0xO3Q8ci5kYXRhKCkubGVuZ3RoO3QrKyl7dmFyIHY9dC0xLHk9ci5kYXRhKClbdF0sCno9ci5kYXRhKClbdl07ej1xLngoeix2LHIpO3ZhciB4PXEueCh5LHQscikrcS53aWR0aCh5LHQsciksQz1xLnkoeSx0LHIpO2lmKDA8dGhpcy5fc3VidG90YWxzW3RdJiZ0aGlzLl9zdWJ0b3RhbHNbdF0+dGhpcy5fc3VidG90YWxzW3ZdfHwwPnRoaXMuX3N1YnRvdGFsc1t0XSYmdGhpcy5fc3VidG90YWxzW3RdPj10aGlzLl9zdWJ0b3RhbHNbdl0pQz1xLnkoeSx0LHIpK3EuaGVpZ2h0KHksdCxyKTt0aGlzLl9jb25uZWN0b3JBcmVhLmFwcGVuZCgibGluZSIpLmNsYXNzZWQocC5fQ09OTkVDVE9SX0NMQVNTLCEwKS5hdHRyKCJ4MSIseikuYXR0cigieDIiLHgpLmF0dHIoInkxIixDKS5hdHRyKCJ5MiIsQyl9fTtwLnByb3RvdHlwZS5fdXBkYXRlU3VidG90YWxzPWZ1bmN0aW9uKCl7dmFyIHE9dGhpcy5kYXRhc2V0cygpOzA8cS5sZW5ndGgmJihxPXFbcS5sZW5ndGgtMV0sdGhpcy5fc3VidG90YWxzPVtdLHRoaXMuX2NhbGN1bGF0ZVN1YnRvdGFsc0FuZEV4dGVudChxKSl9O3JldHVybiBwfShjLkJhcik7CmYuX0JBUl9ERUNMSU5FX0NMQVNTPSJ3YXRlcmZhbGwtZGVjbGluZSI7Zi5fQkFSX0dST1dUSF9DTEFTUz0id2F0ZXJmYWxsLWdyb3d0aCI7Zi5fQkFSX1RPVEFMX0NMQVNTPSJ3YXRlcmZhbGwtdG90YWwiO2YuX0NPTk5FQ1RPUl9DTEFTUz0iY29ubmVjdG9yIjtmLl9DT05ORUNUT1JfQVJFQV9DTEFTUz0iY29ubmVjdG9yLWFyZWEiO2YuX1RPVEFMX0tFWT0idG90YWwiO2QuV2F0ZXJmYWxsPWZ9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixwKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgciBpbiBwKXAuaGFzT3duUHJvcGVydHkocikmJihuW3JdPXBbcl0pO24ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX0sbD1mKDEpLGs9ZigwKTtjPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHAocSl7dmFyIHI9bi5jYWxsKHRoaXMpfHx0aGlzOwpzd2l0Y2gocSl7Y2FzZSBudWxsOmNhc2Ugdm9pZCAwOm51bGw9PXAuX3Bsb3R0YWJsZUNvbG9yQ2FjaGUmJihwLl9wbG90dGFibGVDb2xvckNhY2hlPXAuX2dldFBsb3R0YWJsZUNvbG9ycygpKTtxPWwuc2NhbGVPcmRpbmFsKCkucmFuZ2UocC5fcGxvdHRhYmxlQ29sb3JDYWNoZSk7YnJlYWs7Y2FzZSAiQ2F0ZWdvcnkxMCI6Y2FzZSAiY2F0ZWdvcnkxMCI6Y2FzZSAiMTAiOnE9bC5zY2FsZU9yZGluYWwobC5zY2hlbWVDYXRlZ29yeTEwKTticmVhaztjYXNlICJDYXRlZ29yeTIwIjpjYXNlICJjYXRlZ29yeTIwIjpjYXNlICIyMCI6cT1sLnNjYWxlT3JkaW5hbChsLnNjaGVtZUNhdGVnb3J5MjApO2JyZWFrO2Nhc2UgIkNhdGVnb3J5MjBiIjpjYXNlICJjYXRlZ29yeTIwYiI6Y2FzZSAiMjBiIjpxPWwuc2NhbGVPcmRpbmFsKGwuc2NoZW1lQ2F0ZWdvcnkyMGIpO2JyZWFrO2Nhc2UgIkNhdGVnb3J5MjBjIjpjYXNlICJjYXRlZ29yeTIwYyI6Y2FzZSAiMjBjIjpxPWwuc2NhbGVPcmRpbmFsKGwuc2NoZW1lQ2F0ZWdvcnkyMGMpOwpicmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBDb2xvclNjYWxlIHR5cGUiKTt9ci5fZDNTY2FsZT1xO3JldHVybiByfWcocCxuKTtwLnByb3RvdHlwZS5leHRlbnRPZlZhbHVlcz1mdW5jdGlvbihxKXtyZXR1cm4gay5BcnJheS51bmlxKHEpfTtwLnByb3RvdHlwZS5fZ2V0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIGsuQXJyYXkudW5pcSh0aGlzLl9nZXRBbGxJbmNsdWRlZFZhbHVlcygpKX07cC5pbnZhbGlkYXRlQ29sb3JDYWNoZT1mdW5jdGlvbigpe3AuX3Bsb3R0YWJsZUNvbG9yQ2FjaGU9bnVsbH07cC5fZ2V0UGxvdHRhYmxlQ29sb3JzPWZ1bmN0aW9uKCl7Zm9yKHZhciBxPVtdLHI9bC5zZWxlY3QoImJvZHkiKS5hcHBlbmQoInBsb3R0YWJsZS1jb2xvci10ZXN0ZXIiKSx0PWsuQ29sb3IuY29sb3JUZXN0KHIsIiIpLHY9MCx5PWsuQ29sb3IuY29sb3JUZXN0KHIsInBsb3R0YWJsZS1jb2xvcnMtMCIpO251bGwhPXkmJnY8dGhpcy5fTUFYSU1VTV9DT0xPUlNfRlJPTV9DU1MmJgooeSE9PXR8fHkhPT1xW3EubGVuZ3RoLTFdKTspcS5wdXNoKHkpLHYrKyx5PWsuQ29sb3IuY29sb3JUZXN0KHIsInBsb3R0YWJsZS1jb2xvcnMtIit2KTtyLnJlbW92ZSgpO3JldHVybiBxfTtwLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihxKXt2YXIgcj10aGlzLl9kM1NjYWxlKHEpO3E9dGhpcy5kb21haW4oKS5pbmRleE9mKHEpO3E9TWF0aC5mbG9vcihxL3RoaXMucmFuZ2UoKS5sZW5ndGgpO3JldHVybiBrLkNvbG9yLmxpZ2h0ZW5Db2xvcihyLE1hdGgubG9nKHEqcC5fTE9PUF9MSUdIVEVOX0ZBQ1RPUisxKSl9O3AucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCl9O3AucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24ocSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5fZDNTY2FsZS5kb21haW4oKTt0aGlzLl9kM1NjYWxlLmRvbWFpbihxKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuX2dldFJhbmdlPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnJhbmdlKCl9O3AucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbihxKXt0aGlzLl9kM1NjYWxlLnJhbmdlKHEpfTtyZXR1cm4gcH0oZigxNykuU2NhbGUpO2MuX0xPT1BfTElHSFRFTl9GQUNUT1I9MS42O2MuX01BWElNVU1fQ09MT1JTX0ZST01fQ1NTPTI1NjtkLkNvbG9yPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixwKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgciBpbiBwKXAuaGFzT3duUHJvcGVydHkocikmJihuW3JdPXBbcl0pO24ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX0sbD1mKDEpLGs9ZigwKTtjPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHAocSl7dm9pZCAwPT09cSYmKHE9ImxpbmVhciIpO3ZhciByPW4uY2FsbCh0aGlzKXx8dGhpcztzd2l0Y2gocSl7Y2FzZSAibGluZWFyIjpyLl9jb2xvclNjYWxlPQpsLnNjYWxlTGluZWFyKCk7YnJlYWs7Y2FzZSAibG9nIjpyLl9jb2xvclNjYWxlPWwuc2NhbGVMb2coKTticmVhaztjYXNlICJzcXJ0IjpyLl9jb2xvclNjYWxlPWwuc2NhbGVTcXJ0KCk7YnJlYWs7Y2FzZSAicG93IjpyLl9jb2xvclNjYWxlPWwuc2NhbGVQb3coKX1pZihudWxsPT1yLl9jb2xvclNjYWxlKXRocm93IEVycm9yKCJ1bmtub3duIFF1YW50aXRhdGl2ZVNjYWxlIHNjYWxlIHR5cGUgIitxKTtyLnJhbmdlKHAuUkVEUyk7cmV0dXJuIHJ9ZyhwLG4pO3AucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKHEpe3E9bC5leHRlbnQocSk7cmV0dXJuIG51bGw9PXFbMF18fG51bGw9PXFbMV0/W106cX07cC5wcm90b3R5cGUuX2QzSW50ZXJwb2xhdGVkU2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29sb3JTY2FsZS5yYW5nZShbMCwxXSkuaW50ZXJwb2xhdGUodGhpcy5faW50ZXJwb2xhdGVDb2xvcnMoKSl9O3AucHJvdG90eXBlLl9pbnRlcnBvbGF0ZUNvbG9ycz0KZnVuY3Rpb24oKXt2YXIgcT10aGlzLl9jb2xvclJhbmdlO2lmKDI+cS5sZW5ndGgpdGhyb3cgRXJyb3IoIkNvbG9yIHNjYWxlIGFycmF5cyBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIGVsZW1lbnRzLiIpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihyKXtyPU1hdGgubWF4KDAsTWF0aC5taW4oMSxyKSk7cio9cS5sZW5ndGgtMTt2YXIgdD1NYXRoLmZsb29yKHIpLHY9ci10O3JldHVybiBsLmludGVycG9sYXRlTGFiKHFbdF0scVtNYXRoLmNlaWwocildKSh2KX19fTtwLnByb3RvdHlwZS5fcmVzZXRTY2FsZT1mdW5jdGlvbigpe3RoaXMuX2QzU2NhbGU9dGhpcy5fZDNJbnRlcnBvbGF0ZWRTY2FsZSgpO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfTtwLnByb3RvdHlwZS5hdXRvRG9tYWluPWZ1bmN0aW9uKCl7dmFyIHE9dGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKTswPHEubGVuZ3RoJiZ0aGlzLl9zZXREb21haW4oW2suTWF0aC5taW4ocSwKMCksay5NYXRoLm1heChxLDApXSl9O3AucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHEpe3JldHVybiB0aGlzLl9kM1NjYWxlKHEpfTtwLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfTtwLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4ocSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb2xvclJhbmdlfTtwLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24ocSl7dGhpcy5fY29sb3JSYW5nZT1xO3RoaXMuX3Jlc2V0U2NhbGUoKX07cmV0dXJuIHB9KGYoMTcpLlNjYWxlKTtjLlJFRFM9IiNGRkZGRkYgI0ZGRjZFMSAjRkVGNEMwICNGRUQ5NzYgI0ZFQjI0QyAjRkQ4RDNDICNGQzRFMkEgI0UzMUExQyAjQjEwMDI2Ii5zcGxpdCgiICIpOwpjLkJMVUVTPSIjRkZGRkZGICNDQ0ZGRkYgI0E1RkZGRCAjODVGN0ZCICM2RUQzRUYgIzU1QTdFMCAjNDE3RkQwICMyNTQ1RDMgIzBCMDJFMSIuc3BsaXQoIiAiKTtjLlBPU05FRz0iIzBCMDJFMSAjMjU0NUQzICM0MTdGRDAgIzU1QTdFMCAjNkVEM0VGICM4NUY3RkIgI0E1RkZGRCAjQ0NGRkZGICNGRkZGRkYgI0ZGRjZFMSAjRkVGNEMwICNGRUQ5NzYgI0ZFQjI0QyAjRkQ4RDNDICNGQzRFMkEgI0UzMUExQyAjQjEwMDI2Ii5zcGxpdCgiICIpO2QuSW50ZXJwb2xhdGVkQ29sb3I9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihrLG4pe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPWt9Zm9yKHZhciBxIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShxKSYmKGtbcV09bltxXSk7ay5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKToocC5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IHApfSxsPWYoMSk7Yz1mdW5jdGlvbihrKXtmdW5jdGlvbiBuKCl7dmFyIHA9CmsuY2FsbCh0aGlzKXx8dGhpcztwLl9kM1NjYWxlPWwuc2NhbGVMaW5lYXIoKTtyZXR1cm4gcH1nKG4sayk7bi5wcm90b3R5cGUuX2RlZmF1bHRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm5bMCwxXX07bi5wcm90b3R5cGUuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluPWZ1bmN0aW9uKHApe3JldHVybiBwWzBdPT09cFsxXT9bcFswXS0xLHBbMV0rMV06cH07bi5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24ocCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUocCl9O24ucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24ocCl7cmV0dXJuIHRoaXMuc2NhbGUocCl9O24ucHJvdG90eXBlLmludmVydGVkVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24ocCl7cmV0dXJuIHRoaXMuaW52ZXJ0KHApfTtuLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRVbmJvdW5kZWRFeHRlbnQoITApfTtuLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21haW4oKX07bi5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24ocCl7dGhpcy5kb21haW4ocCl9O24ucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCl9O24ucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24ocCl7aWYobnVsbD09cClyZXR1cm4gdGhpcy5fZDNTY2FsZS5kb21haW4oKTt0aGlzLl9kM1NjYWxlLmRvbWFpbihwKTtyZXR1cm4gdGhpc307bi5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUucmFuZ2UoKX07bi5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHApe3RoaXMuX2QzU2NhbGUucmFuZ2UocCl9O24ucHJvdG90eXBlLmludmVydD1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5pbnZlcnQocCl9O24ucHJvdG90eXBlLmRlZmF1bHRUaWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnRpY2tzKCl9OwpuLnByb3RvdHlwZS5fbmljZURvbWFpbj1mdW5jdGlvbihwLHEpe3JldHVybiB0aGlzLl9kM1NjYWxlLmNvcHkoKS5kb21haW4ocCkubmljZShxKS5kb21haW4oKX07cmV0dXJuIG59KGYoMTEpLlF1YW50aXRhdGl2ZVNjYWxlKTtkLkxpbmVhcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAscSl7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHQgaW4gcSlxLmhhc093blByb3BlcnR5KHQpJiYocFt0XT1xW3RdKTtwLnByb3RvdHlwZT1udWxsPT09cT9PYmplY3QuY3JlYXRlKHEpOihyLnByb3RvdHlwZT1xLnByb3RvdHlwZSxuZXcgcil9LGw9ZigxKSxrPWYoMCksbj1mKDMpO2M9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gcShyKXt2b2lkIDA9PT1yJiYocj0xMCk7dmFyIHQ9cC5jYWxsKHRoaXMpfHx0aGlzO3QuX2QzU2NhbGU9bC5zY2FsZUxpbmVhcigpO3QuX2Jhc2U9cjt0Ll9waXZvdD10Ll9iYXNlO3QuX3NldERvbWFpbih0Ll9kZWZhdWx0RXh0ZW50KCkpOwppZigxPj1yKXRocm93IEVycm9yKCJNb2RpZmllZExvZ1NjYWxlOiBUaGUgYmFzZSBtdXN0IGJlIFx4M2UgMSIpO3JldHVybiB0fWcocSxwKTtxLnByb3RvdHlwZS5fYWRqdXN0ZWRMb2c9ZnVuY3Rpb24ocil7dmFyIHQ9MD5yPy0xOjE7cio9dDtyPHRoaXMuX3Bpdm90JiYocis9KHRoaXMuX3Bpdm90LXIpL3RoaXMuX3Bpdm90KTtyPU1hdGgubG9nKHIpL01hdGgubG9nKHRoaXMuX2Jhc2UpO3JldHVybiByKnR9O3EucHJvdG90eXBlLl9pbnZlcnRlZEFkanVzdGVkTG9nPWZ1bmN0aW9uKHIpe3ZhciB0PTA+cj8tMToxO3I9TWF0aC5wb3codGhpcy5fYmFzZSxyKnQpO3I8dGhpcy5fcGl2b3QmJihyPXRoaXMuX3Bpdm90KihyLTEpLyh0aGlzLl9waXZvdC0xKSk7cmV0dXJuIHIqdH07cS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24ocil7cmV0dXJuIHRoaXMuX2QzU2NhbGUodGhpcy5fYWRqdXN0ZWRMb2cocikpfTtxLnByb3RvdHlwZS5pbnZlcnQ9ZnVuY3Rpb24ocil7cmV0dXJuIHRoaXMuX2ludmVydGVkQWRqdXN0ZWRMb2codGhpcy5fZDNTY2FsZS5pbnZlcnQocikpfTsKcS5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbihyKXtyZXR1cm4gdGhpcy5zY2FsZShyKX07cS5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbihyKXtyZXR1cm4gdGhpcy5pbnZlcnQocil9O3EucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCl9O3EucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tYWluKCl9O3EucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKHIpe3RoaXMuZG9tYWluKHIpfTtxLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VudHJhbnNmb3JtZWREb21haW59O3EucHJvdG90eXBlLl9zZXREb21haW49ZnVuY3Rpb24ocil7dGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbj1yO3AucHJvdG90eXBlLl9zZXREb21haW4uY2FsbCh0aGlzLApbdGhpcy5fYWRqdXN0ZWRMb2coclswXSksdGhpcy5fYWRqdXN0ZWRMb2coclsxXSldKX07cS5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbihyKXtpZihudWxsPT1yKXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzU2NhbGUuZG9tYWluKHIpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS50aWNrcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHIoRixELEIpe3JldHVybltGLEQsQl0uc29ydChmdW5jdGlvbihJLE8pe3JldHVybiBJLU99KVsxXX12YXIgdD1rLk1hdGgubWluKHRoaXMuX3VudHJhbnNmb3JtZWREb21haW4sMCksdj1rLk1hdGgubWF4KHRoaXMuX3VudHJhbnNmb3JtZWREb21haW4sMCkseT1yKHQsdiwtdGhpcy5fcGl2b3QpLHo9cih0LHYsdGhpcy5fcGl2b3QpO3k9dGhpcy5fbG9nVGlja3MoLXksLXQpLm1hcChmdW5jdGlvbihGKXtyZXR1cm4tRn0pLnJldmVyc2UoKTt6PXRoaXMuX2xvZ1RpY2tzKHosdik7dmFyIHg9TWF0aC5tYXgodCwKLXRoaXMuX3Bpdm90KSxDPU1hdGgubWluKHYsdGhpcy5fcGl2b3QpO3g9bC5zY2FsZUxpbmVhcigpLmRvbWFpbihbeCxDXSkudGlja3ModGhpcy5faG93TWFueVRpY2tzKHgsQykpO3k9eS5jb25jYXQoeCkuY29uY2F0KHopOzE+PXkubGVuZ3RoJiYoeT1sLnNjYWxlTGluZWFyKCkuZG9tYWluKFt0LHZdKS50aWNrcygpKTtyZXR1cm4geX07cS5wcm90b3R5cGUuX2xvZ1RpY2tzPWZ1bmN0aW9uKHIsdCl7dmFyIHY9dGhpcyx5PXRoaXMuX2hvd01hbnlUaWNrcyhyLHQpO2lmKDA9PT15KXJldHVybltdO3ZhciB6PU1hdGguZmxvb3IoTWF0aC5sb2cocikvTWF0aC5sb2codGhpcy5fYmFzZSkpLHg9TWF0aC5jZWlsKE1hdGgubG9nKHQpL01hdGgubG9nKHRoaXMuX2Jhc2UpKTt5PWwucmFuZ2UoeCx6LC1NYXRoLmNlaWwoKHgteikveSkpO3o9bC5yYW5nZSh0aGlzLl9iYXNlLDEsLSh0aGlzLl9iYXNlLTEpKS5tYXAoTWF0aC5mbG9vcik7dmFyIEM9ay5BcnJheS51bmlxKHopO3k9eS5tYXAoZnVuY3Rpb24oRil7cmV0dXJuIEMubWFwKGZ1bmN0aW9uKEQpe3JldHVybiBNYXRoLnBvdyh2Ll9iYXNlLApGLTEpKkR9KX0pO3JldHVybiBrLkFycmF5LmZsYXR0ZW4oeSkuZmlsdGVyKGZ1bmN0aW9uKEYpe3JldHVybiByPD1GJiZGPD10fSkuc29ydChmdW5jdGlvbihGLEQpe3JldHVybiBGLUR9KX07cS5wcm90b3R5cGUuX2hvd01hbnlUaWNrcz1mdW5jdGlvbihyLHQpe3ZhciB2PXRoaXMuX2FkanVzdGVkTG9nKGsuTWF0aC5taW4odGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbiwwKSkseT10aGlzLl9hZGp1c3RlZExvZyhrLk1hdGgubWF4KHRoaXMuX3VudHJhbnNmb3JtZWREb21haW4sMCkpO3JldHVybiBNYXRoLmNlaWwoKHRoaXMuX2FkanVzdGVkTG9nKHQpLXRoaXMuX2FkanVzdGVkTG9nKHIpKS8oeS12KSpuLk1vZGlmaWVkTG9nLl9ERUZBVUxUX05VTV9USUNLUyl9O3EucHJvdG90eXBlLl9uaWNlRG9tYWluPWZ1bmN0aW9uKHIpe3JldHVybiByfTtxLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3JldHVyblswLHRoaXMuX2Jhc2VdfTtxLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW49CmZ1bmN0aW9uKHIpe3JldHVybiByWzBdPT09clsxXT8ocj1yWzBdLDA8cj9bci90aGlzLl9iYXNlLHIqdGhpcy5fYmFzZV06MD09PXI/Wy10aGlzLl9iYXNlLHRoaXMuX2Jhc2VdOltyKnRoaXMuX2Jhc2Usci90aGlzLl9iYXNlXSk6cn07cS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUucmFuZ2UoKX07cS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHIpe3RoaXMuX2QzU2NhbGUucmFuZ2Uocil9O3EucHJvdG90eXBlLmRlZmF1bHRUaWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnRpY2tzKCl9O3JldHVybiBxfShmKDExKS5RdWFudGl0YXRpdmVTY2FsZSk7ZC5Nb2RpZmllZExvZz1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9ZigwKTtkLmludGVydmFsVGlja0dlbmVyYXRvcj1mdW5jdGlvbihsKXtpZigwPj1sKXRocm93IEVycm9yKCJpbnRlcnZhbCBtdXN0IGJlIHBvc2l0aXZlIG51bWJlciIpO3JldHVybiBmdW5jdGlvbihrKXtrPQprLmRvbWFpbigpO3ZhciBuPU1hdGgubWluKGtbMF0sa1sxXSk7az1NYXRoLm1heChrWzBdLGtbMV0pO3ZhciBwPU1hdGguY2VpbChuL2wpKmw7bj0wPT09biVsP1tdOltuXTt2YXIgcT1nLk1hdGgucmFuZ2UoMCxNYXRoLmZsb29yKChrLXApL2wpKzEpLm1hcChmdW5jdGlvbihyKXtyZXR1cm4gcCtyKmx9KTtyZXR1cm4gbi5jb25jYXQocSkuY29uY2F0KDA9PT1rJWw/W106W2tdKX19O2QuaW50ZWdlclRpY2tHZW5lcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obCl7dmFyIGs9bC5kZWZhdWx0VGlja3MoKTtyZXR1cm4gay5maWx0ZXIoZnVuY3Rpb24obixwKXtyZXR1cm4gMD09PW4lMXx8MD09PXB8fHA9PT1rLmxlbmd0aC0xfSl9fX0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHApe2Z1bmN0aW9uIHEoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciByIGluIHApcC5oYXNPd25Qcm9wZXJ0eShyKSYmKG5bcl09cFtyXSk7Cm4ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX0sbD1mKDEpLGs9ZigyOCk7Yz1mdW5jdGlvbihuKXtmdW5jdGlvbiBwKCl7dmFyIHE9bi5jYWxsKHRoaXMpfHx0aGlzO3EuX2QzU2NhbGU9bC5zY2FsZVRpbWUoKTtxLmF1dG9Eb21haW4oKTtyZXR1cm4gcX1nKHAsbik7cC5wcm90b3R5cGUudGlja0ludGVydmFsPWZ1bmN0aW9uKHEscil7dm9pZCAwPT09ciYmKHI9MSk7dmFyIHQ9bC5zY2FsZVRpbWUoKTtwLnRpbWVJbnRlcnZhbFRvRDNUaW1lKHEpLmV2ZXJ5KHIpO3QuZG9tYWluKHRoaXMuZG9tYWluKCkpO3QucmFuZ2UodGhpcy5yYW5nZSgpKTtyZXR1cm4gdC50aWNrcygpfTtwLnByb3RvdHlwZS5fc2V0RG9tYWluPWZ1bmN0aW9uKHEpe2lmKHFbMV08cVswXSl0aHJvdyBFcnJvcigiU2NhbGUuVGltZSBkb21haW4gdmFsdWVzIG11c3QgYmUgaW4gY2hyb25vbG9naWNhbCBvcmRlciIpO3JldHVybiBuLnByb3RvdHlwZS5fc2V0RG9tYWluLmNhbGwodGhpcywKcSl9O3AucHJvdG90eXBlLl9kZWZhdWx0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuW25ldyBEYXRlKCIxOTcwLTAxLTAxIiksbmV3IERhdGUoIjE5NzAtMDEtMDIiKV19O3AucHJvdG90eXBlLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbj1mdW5jdGlvbihxKXt2YXIgcj1xWzBdLmdldFRpbWUoKSx0PXFbMV0uZ2V0VGltZSgpO3JldHVybiByPT09dD8ocT1uZXcgRGF0ZShyKSxxLnNldERhdGUocS5nZXREYXRlKCktMSksdD1uZXcgRGF0ZSh0KSx0LnNldERhdGUodC5nZXREYXRlKCkrMSksW3EsdF0pOnF9O3AucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHEpe3JldHVybiB0aGlzLl9kM1NjYWxlKHEpfTtwLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHEpe3JldHVybiB0aGlzLnNjYWxlKG5ldyBEYXRlKHEpKX07cC5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbihxKXtyZXR1cm4gdGhpcy5pbnZlcnQocSkuZ2V0VGltZSgpfTtwLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD0KZnVuY3Rpb24oKXt2YXIgcT10aGlzLl9nZXRVbmJvdW5kZWRFeHRlbnQoITApO3JldHVybltxWzBdLnZhbHVlT2YoKSxxWzFdLnZhbHVlT2YoKV19O3AucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7dmFyIHE9dGhpcy5kb21haW4oKTtyZXR1cm5bcVswXS52YWx1ZU9mKCkscVsxXS52YWx1ZU9mKCldfTtwLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbihxKXt0aGlzLmRvbWFpbihbbmV3IERhdGUocVswXSksbmV3IERhdGUocVsxXSldKX07cC5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX07cC5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzU2NhbGUuZG9tYWluKHEpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5yYW5nZSgpfTsKcC5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHEpe3RoaXMuX2QzU2NhbGUucmFuZ2UocSl9O3AucHJvdG90eXBlLmludmVydD1mdW5jdGlvbihxKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5pbnZlcnQocSl9O3AucHJvdG90eXBlLmRlZmF1bHRUaWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnRpY2tzKCl9O3AucHJvdG90eXBlLl9uaWNlRG9tYWluPWZ1bmN0aW9uKHEpe3JldHVybiB0aGlzLl9kM1NjYWxlLmNvcHkoKS5kb21haW4ocSkubmljZSgpLmRvbWFpbigpfTtwLnRpbWVJbnRlcnZhbFRvRDNUaW1lPWZ1bmN0aW9uKHEpe3N3aXRjaChxKXtjYXNlIGsuVGltZUludGVydmFsLnNlY29uZDpyZXR1cm4gbC50aW1lU2Vjb25kO2Nhc2Ugay5UaW1lSW50ZXJ2YWwubWludXRlOnJldHVybiBsLnRpbWVNaW51dGU7Y2FzZSBrLlRpbWVJbnRlcnZhbC5ob3VyOnJldHVybiBsLnRpbWVIb3VyO2Nhc2Ugay5UaW1lSW50ZXJ2YWwuZGF5OnJldHVybiBsLnRpbWVEYXk7CmNhc2Ugay5UaW1lSW50ZXJ2YWwud2VlazpyZXR1cm4gbC50aW1lV2VlaztjYXNlIGsuVGltZUludGVydmFsLm1vbnRoOnJldHVybiBsLnRpbWVNb250aDtjYXNlIGsuVGltZUludGVydmFsLnllYXI6cmV0dXJuIGwudGltZVllYXI7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVGltZUludGVydmFsIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdDogIitxKTt9fTtyZXR1cm4gcH0oZigxMSkuUXVhbnRpdGF0aXZlU2NhbGUpO2QuVGltZT1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9ZigxKSxsPUFycmF5O2QuYWRkPWZ1bmN0aW9uKGssbil7aWYoay5sZW5ndGghPT1uLmxlbmd0aCl0aHJvdyBFcnJvcigiYXR0ZW1wdGVkIHRvIGFkZCBhcnJheXMgb2YgdW5lcXVhbCBsZW5ndGgiKTtyZXR1cm4gay5tYXAoZnVuY3Rpb24ocCxxKXtyZXR1cm4ga1txXStuW3FdfSl9O2QudW5pcT1mdW5jdGlvbihrKXt2YXIgbj1nLnNldCgpLHA9W107ay5mb3JFYWNoKGZ1bmN0aW9uKHEpe24uaGFzKFN0cmluZyhxKSl8fAoobi5hZGQoU3RyaW5nKHEpKSxwLnB1c2gocSkpfSk7cmV0dXJuIHB9O2QuZmxhdHRlbj1mdW5jdGlvbihrKXtyZXR1cm4gbC5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGspfTtkLmNyZWF0ZUZpbGxlZEFycmF5PWZ1bmN0aW9uKGssbil7Zm9yKHZhciBwPVtdLHE9MDtxPG47cSsrKXBbcV09ImZ1bmN0aW9uIj09PXR5cGVvZiBrP2socSk6aztyZXR1cm4gcH19LGZ1bmN0aW9uKGMsZCl7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGYoZyxsLGspe3RoaXMubWF4SW5kZXg9dGhpcy5taW5JbmRleD10aGlzLmV4aXRJbmRleD10aGlzLmVudHJ5SW5kZXg9Zzt0aGlzLmJ1Y2tldFZhbHVlPWw7dGhpcy5tYXhWYWx1ZT10aGlzLm1pblZhbHVlPWt9Zi5wcm90b3R5cGUuaXNJbkJ1Y2tldD1mdW5jdGlvbihnKXtyZXR1cm4gZz09dGhpcy5idWNrZXRWYWx1ZX07Zi5wcm90b3R5cGUuYWRkVG9CdWNrZXQ9ZnVuY3Rpb24oZyxsKXtnPHRoaXMubWluVmFsdWUmJih0aGlzLm1pblZhbHVlPWcsdGhpcy5taW5JbmRleD0KbCk7Zz50aGlzLm1heFZhbHVlJiYodGhpcy5tYXhWYWx1ZT1nLHRoaXMubWF4SW5kZXg9bCk7dGhpcy5leGl0SW5kZXg9bH07Zi5wcm90b3R5cGUuZ2V0VW5pcXVlSW5kaWNlcz1mdW5jdGlvbigpe3ZhciBnPVt0aGlzLmVudHJ5SW5kZXgsdGhpcy5tYXhJbmRleCx0aGlzLm1pbkluZGV4LHRoaXMuZXhpdEluZGV4XTtyZXR1cm4gZy5maWx0ZXIoZnVuY3Rpb24obCxrKXtyZXR1cm4gMD09a3x8bCE9Z1trLTFdfSl9O3JldHVybiBmfSgpO2QuQnVja2V0PWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxrKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgcCBpbiBrKWsuaGFzT3duUHJvcGVydHkocCkmJihsW3BdPWtbcF0pO2wucHJvdG90eXBlPW51bGw9PT1rP09iamVjdC5jcmVhdGUoayk6KG4ucHJvdG90eXBlPWsucHJvdG90eXBlLG5ldyBuKX07Yz1mdW5jdGlvbihsKXtmdW5jdGlvbiBrKCl7cmV0dXJuIG51bGwhPT0KbCYmbC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9ZyhrLGwpO2sucHJvdG90eXBlLmNhbGxDYWxsYmFja3M9ZnVuY3Rpb24oKXtmb3IodmFyIG49dGhpcyxwPVtdLHE9MDtxPGFyZ3VtZW50cy5sZW5ndGg7cSsrKXBbcV09YXJndW1lbnRzW3FdO3RoaXMuZm9yRWFjaChmdW5jdGlvbihyKXtyLmFwcGx5KG4scCl9KTtyZXR1cm4gdGhpc307cmV0dXJuIGt9KGYoNTgpLlNldCk7ZC5DYWxsYmFja1NldD1jfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhuKXtmdW5jdGlvbiBwKHQpe3QvPTI1NTtyZXR1cm4uMDM5Mjg+PXQ/dC8xMi45MjprLnBvdygodCsuMDU1KS8xLjA1NSwyLjQpfXZhciBxPWwucmdiKG4pO249cChxLnIpO3ZhciByPXAocS5nKTtxPXAocS5iKTtyZXR1cm4uMjEyNipuKy43MTUyKnIrLjA3MjIqcX12YXIgbD1mKDEpLGs9TWF0aDtkLmNvbnRyYXN0PWZ1bmN0aW9uKG4scCl7bj1nKG4pKy4wNTtwPWcocCkrLjA1O3JldHVybiBuPnA/bi9wOnAvbn07ZC5saWdodGVuQ29sb3I9CmZ1bmN0aW9uKG4scCl7cmV0dXJuIGwuY29sb3IobikuYnJpZ2h0ZXIocCkucmdiKCkudG9TdHJpbmcoKX07ZC5jb2xvclRlc3Q9ZnVuY3Rpb24obixwKXtuLmNsYXNzZWQocCwhMCk7dmFyIHE9bi5zdHlsZSgiYmFja2dyb3VuZC1jb2xvciIpO2lmKCJ0cmFuc3BhcmVudCI9PT1xKXJldHVybiBudWxsO3E9L1woKC4rKVwpLy5leGVjKHEpO2lmKCFxKXJldHVybiBudWxsO3E9cVsxXS5zcGxpdCgiLCIpLm1hcChmdW5jdGlvbihyKXtyPStyO3ZhciB0PXIudG9TdHJpbmcoMTYpO3JldHVybiAxNj5yPyIwIit0OnR9KTtpZig0PT09cS5sZW5ndGgmJiIwMCI9PT1xWzNdKXJldHVybiBudWxsO3E9IiMiK3Euam9pbigiIik7bi5jbGFzc2VkKHAsITEpO3JldHVybiBxfX0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoMSksbD1mKDU3KTtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaygpe3RoaXMuX2VudGl0aWVzPVtdO3RoaXMuX3J0cmVlPW5ldyBsLlJUcmVlO3RoaXMuX3RyZWU9Zy5xdWFkdHJlZSgpLngoZnVuY3Rpb24obil7cmV0dXJuIE1hdGguZmxvb3Iobi5wb3NpdGlvbi54KX0pLnkoZnVuY3Rpb24obil7cmV0dXJuIE1hdGguZmxvb3Iobi5wb3NpdGlvbi55KX0pfQprLnByb3RvdHlwZS5hZGRBbGw9ZnVuY3Rpb24obixwLHEpeyh2PXRoaXMuX2VudGl0aWVzKS5wdXNoLmFwcGx5KHYsbik7aWYodm9pZCAwIT09cSlmb3IocT1sLlJUcmVlQm91bmRzLmJvdW5kcyhxKSx2PTA7djxuLmxlbmd0aDt2Kyspe3ZhciByPW5bdl0sdD1sLlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhwKHIpKTtsLlJUcmVlQm91bmRzLmlzQm91bmRzT3ZlcmxhcEJvdW5kcyhxLHQpJiYodGhpcy5fdHJlZS5hZGQociksdGhpcy5fcnRyZWUuaW5zZXJ0KHQscikpfWVsc2UgZm9yKHRoaXMuX3RyZWUuYWRkQWxsKG4pLHY9MDt2PG4ubGVuZ3RoO3YrKylyPW5bdl0sdD1sLlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhwKHIpKSx0aGlzLl9ydHJlZS5pbnNlcnQodCxyKTt2YXIgdn07ay5wcm90b3R5cGUuZW50aXR5TmVhcmVzdD1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5fdHJlZS5maW5kKG4ueCxuLnkpfTtrLnByb3RvdHlwZS5lbnRpdGllc0luQm91bmRzPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9ydHJlZS5pbnRlcnNlY3QobC5SVHJlZUJvdW5kcy5lbnRpdHlCb3VuZHMobikpfTsKay5wcm90b3R5cGUuZW50aXRpZXNJblhCb3VuZHM9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX3J0cmVlLmludGVyc2VjdFgobC5SVHJlZUJvdW5kcy5lbnRpdHlCb3VuZHMobikpfTtrLnByb3RvdHlwZS5lbnRpdGllc0luWUJvdW5kcz1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5fcnRyZWUuaW50ZXJzZWN0WShsLlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhuKSl9O2sucHJvdG90eXBlLmVudGl0aWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VudGl0aWVzfTtyZXR1cm4ga30oKTtkLkVudGl0eVN0b3JlPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz1mKDU2KTtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbCgpeyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93Lk1hcD90aGlzLl9lczZNYXA9bmV3IHdpbmRvdy5NYXA6dGhpcy5fa2V5VmFsdWVQYWlycz1bXX1sLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oayxuKXtpZihnLmlzTmFOKGspKXRocm93IEVycm9yKCJOYU4gbWF5IG5vdCBiZSB1c2VkIGFzIGEga2V5IHRvIHRoZSBNYXAiKTsKaWYobnVsbCE9dGhpcy5fZXM2TWFwKXJldHVybiB0aGlzLl9lczZNYXAuc2V0KGssbiksdGhpcztmb3IodmFyIHA9MDtwPHRoaXMuX2tleVZhbHVlUGFpcnMubGVuZ3RoO3ArKylpZih0aGlzLl9rZXlWYWx1ZVBhaXJzW3BdLmtleT09PWspcmV0dXJuIHRoaXMuX2tleVZhbHVlUGFpcnNbcF0udmFsdWU9bix0aGlzO3RoaXMuX2tleVZhbHVlUGFpcnMucHVzaCh7a2V5OmssdmFsdWU6bn0pO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oayl7aWYobnVsbCE9dGhpcy5fZXM2TWFwKXJldHVybiB0aGlzLl9lczZNYXAuZ2V0KGspO2Zvcih2YXIgbj0wO248dGhpcy5fa2V5VmFsdWVQYWlycy5sZW5ndGg7bisrKWlmKHRoaXMuX2tleVZhbHVlUGFpcnNbbl0ua2V5PT09aylyZXR1cm4gdGhpcy5fa2V5VmFsdWVQYWlyc1tuXS52YWx1ZX07bC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGspe2lmKG51bGwhPXRoaXMuX2VzNk1hcClyZXR1cm4gdGhpcy5fZXM2TWFwLmhhcyhrKTsKZm9yKHZhciBuPTA7bjx0aGlzLl9rZXlWYWx1ZVBhaXJzLmxlbmd0aDtuKyspaWYodGhpcy5fa2V5VmFsdWVQYWlyc1tuXS5rZXk9PT1rKXJldHVybiEwO3JldHVybiExfTtsLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGssbil7dmFyIHA9dGhpcztudWxsIT10aGlzLl9lczZNYXA/dGhpcy5fZXM2TWFwLmZvckVhY2goZnVuY3Rpb24ocSxyKXtyZXR1cm4gay5jYWxsKG4scSxyLHApfSxuKTp0aGlzLl9rZXlWYWx1ZVBhaXJzLmZvckVhY2goZnVuY3Rpb24ocSl7ay5jYWxsKG4scS52YWx1ZSxxLmtleSxwKX0pfTtsLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24oayl7aWYobnVsbCE9dGhpcy5fZXM2TWFwKXJldHVybiB0aGlzLl9lczZNYXAuZGVsZXRlKGspO2Zvcih2YXIgbj0wO248dGhpcy5fa2V5VmFsdWVQYWlycy5sZW5ndGg7bisrKWlmKHRoaXMuX2tleVZhbHVlUGFpcnNbbl0ua2V5PT09aylyZXR1cm4gdGhpcy5fa2V5VmFsdWVQYWlycy5zcGxpY2UobiwxKSwhMDtyZXR1cm4hMX07CnJldHVybiBsfSgpO2QuTWFwPWN9LGZ1bmN0aW9uKGMsZCl7ZC5hc3NpZ249ZnVuY3Rpb24oKXtmb3IodmFyIGY9W10sZz0wO2c8YXJndW1lbnRzLmxlbmd0aDtnKyspZltnXT1hcmd1bWVudHNbZ107Zz17fTtmb3IodmFyIGw9MDtsPGYubGVuZ3RoO2wrKylmb3IodmFyIGs9ZltsXSxuPTAscD1PYmplY3Qua2V5cyhrKTtuPHAubGVuZ3RoO24rKyl7dmFyIHE9cFtuXTtnW3FdPWtbcV19cmV0dXJuIGd9fSxmdW5jdGlvbihjLGQpe2M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBmKCl7fWYucHJvdG90eXBlLnNwbGl0PWZ1bmN0aW9uKGcsbCl7Zm9yKHZhciBrPU1hdGguY2VpbChnLmxlbmd0aC8yKSxuPTA7bjxrO24rKylsWzBdLmluc2VydChnW25dKTtmb3Iobj1rO248Zy5sZW5ndGg7bisrKWxbMV0uaW5zZXJ0KGdbbl0pfTtyZXR1cm4gZn0oKTtkLlNwbGl0U3RyYXRlZ3lUcml2aWFsPWM7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGYoKXt9Zi5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24oZyxsKXtnPQpnLnNsaWNlKCk7Zm9yKHRoaXMuY2hvb3NlRmlyc3RTcGxpdChnLGwpOzA8Zy5sZW5ndGg7KXRoaXMuYWRkTmV4dChnLGwpfTtmLnByb3RvdHlwZS5jaG9vc2VGaXJzdFNwbGl0PWZ1bmN0aW9uKGcsbCl7Zm9yKHZhciBrPTAsbj0wLHA9Zy5sZW5ndGgtMSxxPWcubGVuZ3RoLTEscj0xO3I8Zy5sZW5ndGgtMTtyKyspe3ZhciB0PWdbcl07dC5ib3VuZHMueGw+Z1twXS5ib3VuZHMueGw/cD1yOnQuYm91bmRzLnhoPGdba10uYm91bmRzLnhoJiYoaz1yKTt0LmJvdW5kcy55bD5nW3FdLmJvdW5kcy55bD9xPXI6dC5ib3VuZHMueWg8Z1tuXS5ib3VuZHMueWgmJihuPXIpfW49TWF0aC5hYnMoZ1trXS5ib3VuZHMueGgtZ1twXS5ib3VuZHMueGwpPk1hdGguYWJzKGdbbl0uYm91bmRzLnloLWdbcV0uYm91bmRzLnlsKT9bayxwXTpbbixxXTtrPW5bMF07bj1uWzFdO2s9PT1uJiYoaz0wLG49Zy5sZW5ndGgtMSk7bFswXS5pbnNlcnQoZy5zcGxpY2UoTWF0aC5tYXgoayxuKSwxKVswXSk7bFsxXS5pbnNlcnQoZy5zcGxpY2UoTWF0aC5taW4oaywKbiksMSlbMF0pfTtmLnByb3RvdHlwZS5hZGROZXh0PWZ1bmN0aW9uKGcsbCl7Zm9yKHZhciBrPW51bGwsbj1udWxsLHA9bnVsbCxxPTA7cTxnLmxlbmd0aDtxKyspe3ZhciByPWdbcV0sdD1sWzBdLnVuaW9uQXJlYURpZmZlcmVuY2Uoci5ib3VuZHMpO3I9bFsxXS51bmlvbkFyZWFEaWZmZXJlbmNlKHIuYm91bmRzKTtpZih0PG58fG51bGw9PWspaz1xLG49dCxwPWxbMF07cjxuJiYoaz1xLG49cixwPWxbMV0pfXAuaW5zZXJ0KGcuc3BsaWNlKGssMSlbMF0pfTtyZXR1cm4gZn0oKTtkLlNwbGl0U3RyYXRlZ3lMaW5lYXI9Y30sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcocCl7cmV0dXJuIFN0cmluZyhwKX12YXIgbD1mKDEpLGs9ZigwKTtjPWYoMTApO2QuSVN0YWNraW5nT3JkZXI9Yy5tYWtlRW51bShbInRvcGRvd24iLCJib3R0b211cCJdKTt2YXIgbj1NYXRoO2Quc3RhY2s9ZnVuY3Rpb24ocCxxLHIsdCl7dm9pZCAwPT09dCYmKHQ9ImJvdHRvbXVwIik7dmFyIHY9bC5tYXAoKSx5PQpsLm1hcCgpLHo9bmV3IGsuTWFwOyJ0b3Bkb3duIj09PXQmJihwPXAuc2xpY2UoKSxwLnJldmVyc2UoKSk7cC5mb3JFYWNoKGZ1bmN0aW9uKHgpe3ZhciBDPW5ldyBrLk1hcDt4LmRhdGEoKS5mb3JFYWNoKGZ1bmN0aW9uKEYsRCl7dmFyIEI9ZyhxKEYsRCx4KSksST0rcihGLEQseCksTz0wPD1JP3Y6eTtpZihPLmhhcyhCKSl7dmFyIFA9Ty5nZXQoQik7Ty5zZXQoQixQK0kpfWVsc2UgUD0wLE8uc2V0KEIsSSk7Qy5zZXQoQix7b2Zmc2V0OlAsdmFsdWU6SSxheGlzVmFsdWU6cShGLEQseCksb3JpZ2luYWxEYXR1bTpGLG9yaWdpbmFsRGF0YXNldDp4LG9yaWdpbmFsSW5kZXg6RH0pfSk7ei5zZXQoeCxDKX0pO3JldHVybiB6fTtkLnN0YWNrZWRFeHRlbnRzPWZ1bmN0aW9uKHApe3ZhciBxPW5ldyBrLk1hcCxyPW5ldyBrLk1hcDtwLmZvckVhY2goZnVuY3Rpb24odCl7dC5mb3JFYWNoKGZ1bmN0aW9uKHYseSl7dmFyIHo9ay5NYXRoLm1heChbdi5vZmZzZXQrdi52YWx1ZSx2Lm9mZnNldF0sCnYub2Zmc2V0KSx4PWsuTWF0aC5taW4oW3Yub2Zmc2V0K3YudmFsdWUsdi5vZmZzZXRdLHYub2Zmc2V0KSxDPXYuYXhpc1ZhbHVlO3EuaGFzKHkpP3EuZ2V0KHkpLmV4dGVudDx6JiZxLnNldCh5LHtleHRlbnQ6eixheGlzVmFsdWU6QyxzdGFja2VkRGF0dW06dn0pOnEuc2V0KHkse2V4dGVudDp6LGF4aXNWYWx1ZTpDLHN0YWNrZWREYXR1bTp2fSk7ci5oYXMoeSk/ci5nZXQoeSkuZXh0ZW50PngmJnIuc2V0KHkse2V4dGVudDp4LGF4aXNWYWx1ZTpDLHN0YWNrZWREYXR1bTp2fSk6ci5zZXQoeSx7ZXh0ZW50OngsYXhpc1ZhbHVlOkMsc3RhY2tlZERhdHVtOnZ9KX0pfSk7cmV0dXJue21heGltdW1FeHRlbnRzOnEsbWluaW11bUV4dGVudHM6cn19O2Quc3RhY2tlZEV4dGVudD1mdW5jdGlvbihwLHEscil7dmFyIHQ9W107cC5mb3JFYWNoKGZ1bmN0aW9uKHkseil7ei5kYXRhKCkuZm9yRWFjaChmdW5jdGlvbih4LEMpe2lmKG51bGw9PXJ8fHIoeCxDLHopKXg9eS5nZXQoZyhxKHgsQyx6KSkpLAp0LnB1c2goeC52YWx1ZSt4Lm9mZnNldCl9KX0pO3A9ay5NYXRoLm1heCh0LDApO3ZhciB2PWsuTWF0aC5taW4odCwwKTtyZXR1cm5bbi5taW4odiwwKSxuLm1heCgwLHApXX07ZC5ub3JtYWxpemVLZXk9Z30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoMCk7ZC5nZXRUcmFuc2xhdG9yPWZ1bmN0aW9uKGspe2s9ay5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCk7dmFyIG49ay5fX1Bsb3R0YWJsZV9DbGllbnRUcmFuc2xhdG9yO251bGw9PW4mJihuPW5ldyBsKGspLGsuX19QbG90dGFibGVfQ2xpZW50VHJhbnNsYXRvcj1uKTtyZXR1cm4gbn07dmFyIGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBrKG4pe3RoaXMuX3Jvb3RFbGVtZW50PW59ay5wcm90b3R5cGUuY29tcHV0ZVBvc2l0aW9uPWZ1bmN0aW9uKG4scCl7bj17eDpuLHk6cH07cD1nLk1hdGguZ2V0Q3VtdWxhdGl2ZVRyYW5zZm9ybSh0aGlzLl9yb290RWxlbWVudCk7cmV0dXJuIG51bGw9PXA/bjpnLk1hdGguYXBwbHlUcmFuc2Zvcm0ocCwKbil9O2suaXNFdmVudEluc2lkZT1mdW5jdGlvbihuLHApe3JldHVybiBnLkRPTS5jb250YWlucyhuLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKSxwLnRhcmdldCl9O3JldHVybiBrfSgpO2QuVHJhbnNsYXRvcj1sfSxmdW5jdGlvbihjLGQsZil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBnPWYoMTI0KTtmLmQoZCwiZWFzZUxpbmVhciIsZnVuY3Rpb24oKXtyZXR1cm4gZy5hfSk7dmFyIGw9ZigxMjYpO2YuZChkLCJlYXNlUXVhZCIsZnVuY3Rpb24oKXtyZXR1cm4gbC5hfSk7Zi5kKGQsImVhc2VRdWFkSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIGwuYn0pO2YuZChkLCJlYXNlUXVhZE91dCIsZnVuY3Rpb24oKXtyZXR1cm4gbC5jfSk7Zi5kKGQsImVhc2VRdWFkSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIGwuYX0pO3ZhciBrPWYoMTIxKTtmLmQoZCwiZWFzZUN1YmljIixmdW5jdGlvbigpe3JldHVybiBrLmF9KTtmLmQoZCwiZWFzZUN1YmljSW4iLApmdW5jdGlvbigpe3JldHVybiBrLmJ9KTtmLmQoZCwiZWFzZUN1YmljT3V0IixmdW5jdGlvbigpe3JldHVybiBrLmN9KTtmLmQoZCwiZWFzZUN1YmljSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIGsuYX0pO3ZhciBuPWYoMTI1KTtmLmQoZCwiZWFzZVBvbHkiLGZ1bmN0aW9uKCl7cmV0dXJuIG4uYX0pO2YuZChkLCJlYXNlUG9seUluIixmdW5jdGlvbigpe3JldHVybiBuLmJ9KTtmLmQoZCwiZWFzZVBvbHlPdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIG4uY30pO2YuZChkLCJlYXNlUG9seUluT3V0IixmdW5jdGlvbigpe3JldHVybiBuLmF9KTt2YXIgcD1mKDEyNyk7Zi5kKGQsImVhc2VTaW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHAuYX0pO2YuZChkLCJlYXNlU2luSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHAuYn0pO2YuZChkLCJlYXNlU2luT3V0IixmdW5jdGlvbigpe3JldHVybiBwLmN9KTtmLmQoZCwiZWFzZVNpbkluT3V0IixmdW5jdGlvbigpe3JldHVybiBwLmF9KTt2YXIgcT1mKDEyMyk7Zi5kKGQsCiJlYXNlRXhwIixmdW5jdGlvbigpe3JldHVybiBxLmF9KTtmLmQoZCwiZWFzZUV4cEluIixmdW5jdGlvbigpe3JldHVybiBxLmJ9KTtmLmQoZCwiZWFzZUV4cE91dCIsZnVuY3Rpb24oKXtyZXR1cm4gcS5jfSk7Zi5kKGQsImVhc2VFeHBJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gcS5hfSk7dmFyIHI9ZigxMjApO2YuZChkLCJlYXNlQ2lyY2xlIixmdW5jdGlvbigpe3JldHVybiByLmF9KTtmLmQoZCwiZWFzZUNpcmNsZUluIixmdW5jdGlvbigpe3JldHVybiByLmJ9KTtmLmQoZCwiZWFzZUNpcmNsZU91dCIsZnVuY3Rpb24oKXtyZXR1cm4gci5jfSk7Zi5kKGQsImVhc2VDaXJjbGVJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gci5hfSk7dmFyIHQ9ZigxMTkpO2YuZChkLCJlYXNlQm91bmNlIixmdW5jdGlvbigpe3JldHVybiB0LmF9KTtmLmQoZCwiZWFzZUJvdW5jZUluIixmdW5jdGlvbigpe3JldHVybiB0LmJ9KTtmLmQoZCwiZWFzZUJvdW5jZU91dCIsZnVuY3Rpb24oKXtyZXR1cm4gdC5hfSk7CmYuZChkLCJlYXNlQm91bmNlSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHQuY30pO3ZhciB2PWYoMTE4KTtmLmQoZCwiZWFzZUJhY2siLGZ1bmN0aW9uKCl7cmV0dXJuIHYuYX0pO2YuZChkLCJlYXNlQmFja0luIixmdW5jdGlvbigpe3JldHVybiB2LmJ9KTtmLmQoZCwiZWFzZUJhY2tPdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHYuY30pO2YuZChkLCJlYXNlQmFja0luT3V0IixmdW5jdGlvbigpe3JldHVybiB2LmF9KTt2YXIgeT1mKDEyMik7Zi5kKGQsImVhc2VFbGFzdGljIixmdW5jdGlvbigpe3JldHVybiB5LmF9KTtmLmQoZCwiZWFzZUVsYXN0aWNJbiIsZnVuY3Rpb24oKXtyZXR1cm4geS5ifSk7Zi5kKGQsImVhc2VFbGFzdGljT3V0IixmdW5jdGlvbigpe3JldHVybiB5LmF9KTtmLmQoZCwiZWFzZUVsYXN0aWNJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4geS5jfSl9LGZ1bmN0aW9uKGMsZCxmKXtmLmQoZCwiYiIsZnVuY3Rpb24oKXtyZXR1cm4gZ30pO2YuZChkLCJjIixmdW5jdGlvbigpe3JldHVybiBsfSk7CmYuZChkLCJhIixmdW5jdGlvbigpe3JldHVybiBrfSk7dmFyIGc9ZnVuY3Rpb24gcShwKXtmdW5jdGlvbiByKHQpe3JldHVybiB0KnQqKChwKzEpKnQtcCl9cD0rcDtyLm92ZXJzaG9vdD1xO3JldHVybiByfSgxLjcwMTU4KSxsPWZ1bmN0aW9uIHIocSl7ZnVuY3Rpb24gdCh2KXtyZXR1cm4tLXYqdiooKHErMSkqditxKSsxfXE9K3E7dC5vdmVyc2hvb3Q9cjtyZXR1cm4gdH0oMS43MDE1OCksaz1mdW5jdGlvbiB0KHIpe2Z1bmN0aW9uIHYoeSl7cmV0dXJuKDE+KHkqPTIpP3kqeSooKHIrMSkqeS1yKTooeS09MikqeSooKHIrMSkqeStyKSsyKS8yfXI9K3I7di5vdmVyc2hvb3Q9dDtyZXR1cm4gdn0oMS43MDE1OCl9LGZ1bmN0aW9uKGMsZCl7ZnVuY3Rpb24gZih6KXtyZXR1cm4oej0reik8Zz95Knoqejp6PGs/eSooei09bCkqeituOno8cT95Kih6LT1wKSp6K3I6eSooei09dCkqeit2fWQuYj1mdW5jdGlvbih6KXtyZXR1cm4gMS1mKDEteil9O2QuYT1mO2QuYz1mdW5jdGlvbih6KXtyZXR1cm4oMT49Cih6Kj0yKT8xLWYoMS16KTpmKHotMSkrMSkvMn07dmFyIGc9NC8xMSxsPTYvMTEsaz04LzExLG49Ljc1LHA9OS8xMSxxPTEwLzExLHI9LjkzNzUsdD0yMS8yMix2PS45ODQzNzUseT0xL2cvZ30sZnVuY3Rpb24oYyxkKXtkLmI9ZnVuY3Rpb24oZil7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtZipmKX07ZC5jPWZ1bmN0aW9uKGYpe3JldHVybiBNYXRoLnNxcnQoMS0gLS1mKmYpfTtkLmE9ZnVuY3Rpb24oZil7cmV0dXJuKDE+PShmKj0yKT8xLU1hdGguc3FydCgxLWYqZik6TWF0aC5zcXJ0KDEtKGYtPTIpKmYpKzEpLzJ9fSxmdW5jdGlvbihjLGQpe2QuYj1mdW5jdGlvbihmKXtyZXR1cm4gZipmKmZ9O2QuYz1mdW5jdGlvbihmKXtyZXR1cm4tLWYqZipmKzF9O2QuYT1mdW5jdGlvbihmKXtyZXR1cm4oMT49KGYqPTIpP2YqZipmOihmLT0yKSpmKmYrMikvMn19LGZ1bmN0aW9uKGMsZCxmKXtmLmQoZCwiYiIsZnVuY3Rpb24oKXtyZXR1cm4gbH0pO2YuZChkLCJhIixmdW5jdGlvbigpe3JldHVybiBrfSk7CmYuZChkLCJjIixmdW5jdGlvbigpe3JldHVybiBufSk7dmFyIGc9MipNYXRoLlBJLGw9ZnVuY3Rpb24gdChxLHIpe2Z1bmN0aW9uIHYoeil7cmV0dXJuIHEqTWF0aC5wb3coMiwxMCotLXopKk1hdGguc2luKCh5LXopL3IpfXZhciB5PU1hdGguYXNpbigxLyhxPU1hdGgubWF4KDEscSkpKSooci89Zyk7di5hbXBsaXR1ZGU9ZnVuY3Rpb24oeil7cmV0dXJuIHQoeixyKmcpfTt2LnBlcmlvZD1mdW5jdGlvbih6KXtyZXR1cm4gdChxLHopfTtyZXR1cm4gdn0oMSwuMyksaz1mdW5jdGlvbiB2KHIsdCl7ZnVuY3Rpb24geSh4KXtyZXR1cm4gMS1yKk1hdGgucG93KDIsLTEwKih4PSt4KSkqTWF0aC5zaW4oKHgreikvdCl9dmFyIHo9TWF0aC5hc2luKDEvKHI9TWF0aC5tYXgoMSxyKSkpKih0Lz1nKTt5LmFtcGxpdHVkZT1mdW5jdGlvbih4KXtyZXR1cm4gdih4LHQqZyl9O3kucGVyaW9kPWZ1bmN0aW9uKHgpe3JldHVybiB2KHIseCl9O3JldHVybiB5fSgxLC4zKSxuPWZ1bmN0aW9uIHkodCx2KXtmdW5jdGlvbiB6KEMpe3JldHVybigwPgooQz0yKkMtMSk/dCpNYXRoLnBvdygyLDEwKkMpKk1hdGguc2luKCh4LUMpL3YpOjItdCpNYXRoLnBvdygyLC0xMCpDKSpNYXRoLnNpbigoeCtDKS92KSkvMn12YXIgeD1NYXRoLmFzaW4oMS8odD1NYXRoLm1heCgxLHQpKSkqKHYvPWcpO3ouYW1wbGl0dWRlPWZ1bmN0aW9uKEMpe3JldHVybiB5KEMsdipnKX07ei5wZXJpb2Q9ZnVuY3Rpb24oQyl7cmV0dXJuIHkodCxDKX07cmV0dXJuIHp9KDEsLjMpfSxmdW5jdGlvbihjLGQpe2QuYj1mdW5jdGlvbihmKXtyZXR1cm4gTWF0aC5wb3coMiwxMCpmLTEwKX07ZC5jPWZ1bmN0aW9uKGYpe3JldHVybiAxLU1hdGgucG93KDIsLTEwKmYpfTtkLmE9ZnVuY3Rpb24oZil7cmV0dXJuKDE+PShmKj0yKT9NYXRoLnBvdygyLDEwKmYtMTApOjItTWF0aC5wb3coMiwxMC0xMCpmKSkvMn19LGZ1bmN0aW9uKGMsZCl7ZC5hPWZ1bmN0aW9uKGYpe3JldHVybitmfX0sZnVuY3Rpb24oYyxkLGYpe2YuZChkLCJiIixmdW5jdGlvbigpe3JldHVybiBnfSk7Zi5kKGQsCiJjIixmdW5jdGlvbigpe3JldHVybiBsfSk7Zi5kKGQsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGt9KTt2YXIgZz1mdW5jdGlvbiBxKHApe2Z1bmN0aW9uIHIodCl7cmV0dXJuIE1hdGgucG93KHQscCl9cD0rcDtyLmV4cG9uZW50PXE7cmV0dXJuIHJ9KDMpLGw9ZnVuY3Rpb24gcihxKXtmdW5jdGlvbiB0KHYpe3JldHVybiAxLU1hdGgucG93KDEtdixxKX1xPStxO3QuZXhwb25lbnQ9cjtyZXR1cm4gdH0oMyksaz1mdW5jdGlvbiB0KHIpe2Z1bmN0aW9uIHYoeSl7cmV0dXJuKDE+PSh5Kj0yKT9NYXRoLnBvdyh5LHIpOjItTWF0aC5wb3coMi15LHIpKS8yfXI9K3I7di5leHBvbmVudD10O3JldHVybiB2fSgzKX0sZnVuY3Rpb24oYyxkKXtkLmI9ZnVuY3Rpb24oZil7cmV0dXJuIGYqZn07ZC5jPWZ1bmN0aW9uKGYpe3JldHVybiBmKigyLWYpfTtkLmE9ZnVuY3Rpb24oZil7cmV0dXJuKDE+PShmKj0yKT9mKmY6LS1mKigyLWYpKzEpLzJ9fSxmdW5jdGlvbihjLGQpe2QuYj1mdW5jdGlvbihsKXtyZXR1cm4gMS0KTWF0aC5jb3MobCpnKX07ZC5jPWZ1bmN0aW9uKGwpe3JldHVybiBNYXRoLnNpbihsKmcpfTtkLmE9ZnVuY3Rpb24obCl7cmV0dXJuKDEtTWF0aC5jb3MoZipsKSkvMn07dmFyIGY9TWF0aC5QSSxnPWYvMn0sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcoayl7cmV0dXJuITA9PT1sKGspJiYiW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChrKX12YXIgbD1mKDEyOSk7Yy5leHBvcnRzPWZ1bmN0aW9uKGspe2lmKCExPT09ZyhrKSlyZXR1cm4hMTtrPWsuY29uc3RydWN0b3I7aWYoImZ1bmN0aW9uIiE9PXR5cGVvZiBrKXJldHVybiExO2s9ay5wcm90b3R5cGU7cmV0dXJuITE9PT1nKGspfHwhMT09PWsuaGFzT3duUHJvcGVydHkoImlzUHJvdG90eXBlT2YiKT8hMTohMH19LGZ1bmN0aW9uKGMpe2MuZXhwb3J0cz1mdW5jdGlvbihkKXtyZXR1cm4gbnVsbCE9ZCYmIm9iamVjdCI9PT10eXBlb2YgZCYmITE9PT1BcnJheS5pc0FycmF5KGQpfX0sZnVuY3Rpb24oYywKZCl7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGYoZyxsLGspe3ZvaWQgMD09PWwmJihsPTEwKTt2b2lkIDA9PT1rJiYoaz17fSk7dmFyIG49dGhpczt0aGlzLmN0eD1nO3RoaXMubGluZUhlaWdodD1sO3RoaXMuc3R5bGU9azt0aGlzLmNyZWF0ZVJ1bGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHApe24uY3R4LmZvbnQ9bi5zdHlsZS5mb250O3JldHVybnt3aWR0aDpuLmN0eC5tZWFzdXJlVGV4dChwKS53aWR0aCxoZWlnaHQ6bi5saW5lSGVpZ2h0fX19O3RoaXMuY3JlYXRlUGVuPWZ1bmN0aW9uKHAscSxyKXtudWxsPT1yJiYocj1uLmN0eCk7ci5zYXZlKCk7ci50cmFuc2xhdGUocS50cmFuc2xhdGVbMF0scS50cmFuc2xhdGVbMV0pO3Iucm90YXRlKHEucm90YXRlKk1hdGguUEkvMTgwKTtyZXR1cm4gbi5jcmVhdGVDYW52YXNQZW4ocil9O3ZvaWQgMD09PXRoaXMuc3R5bGUuZmlsbCYmKHRoaXMuc3R5bGUuZmlsbD0iIzQ0NCIpfWYucHJvdG90eXBlLmNyZWF0ZUNhbnZhc1Blbj1mdW5jdGlvbihnKXt2YXIgbD0KdGhpcztyZXR1cm57ZGVzdHJveTpmdW5jdGlvbigpe2cucmVzdG9yZSgpfSx3cml0ZTpmdW5jdGlvbihrLG4scCxxKXtnLnRleHRBbGlnbj1uO251bGwhPWwuc3R5bGUuZm9udCYmKGcuZm9udD1sLnN0eWxlLmZvbnQpO251bGwhPWwuc3R5bGUuZmlsbCYmKGcuZmlsbFN0eWxlPWwuc3R5bGUuZmlsbCxnLmZpbGxUZXh0KGsscCxxKSk7bnVsbCE9bC5zdHlsZS5zdHJva2UmJihnLnN0cm9rZVN0eWxlPWwuc3R5bGUuZmlsbCxnLnN0cm9rZVRleHQoayxwLHEpKX19fTtyZXR1cm4gZn0oKTtkLkNhbnZhc0NvbnRleHQ9Y30sZnVuY3Rpb24oYyxkKXt2YXIgZj1mdW5jdGlvbigpe2Z1bmN0aW9uIGcoKXt9Zy5hcHBlbmQ9ZnVuY3Rpb24obCxrKXtmb3IodmFyIG49W10scD0yO3A8YXJndW1lbnRzLmxlbmd0aDtwKyspbltwLTJdPWFyZ3VtZW50c1twXTtuPWcuY3JlYXRlLmFwcGx5KGcsW2tdLmNvbmNhdChuKSk7bC5hcHBlbmRDaGlsZChuKTtyZXR1cm4gbn07Zy5jcmVhdGU9ZnVuY3Rpb24obCl7Zm9yKHZhciBrPQpbXSxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKylrW24tMV09YXJndW1lbnRzW25dO249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGcuU1ZHX05TLGwpO2cuYWRkQ2xhc3Nlcy5hcHBseShnLFtuXS5jb25jYXQoaykpO3JldHVybiBufTtnLmFkZENsYXNzZXM9ZnVuY3Rpb24obCl7Zm9yKHZhciBrPVtdLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWtbbi0xXT1hcmd1bWVudHNbbl07az1rLmZpbHRlcihmdW5jdGlvbihwKXtyZXR1cm4gbnVsbCE9cH0pO251bGwhPWwuY2xhc3NMaXN0P2suZm9yRWFjaChmdW5jdGlvbihwKXtsLmNsYXNzTGlzdC5hZGQocCl9KTpsLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGsuam9pbigiICIpKX07Zy5nZXREaW1lbnNpb25zPWZ1bmN0aW9uKGwpe2lmKGwuZ2V0QkJveCl0cnl7dmFyIGs9bC5nZXRCQm94KCk7cmV0dXJue3dpZHRoOmsud2lkdGgsaGVpZ2h0OmsuaGVpZ2h0fX1jYXRjaChuKXt9cmV0dXJue2hlaWdodDowLHdpZHRoOjB9fTtyZXR1cm4gZ30oKTsKZi5TVkdfTlM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjtkLlN2Z1V0aWxzPWY7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGcobCxrLG4pe3ZvaWQgMD09PW4mJihuPSExKTt2YXIgcD10aGlzO3RoaXMuZWxlbWVudD1sO3RoaXMuY2xhc3NOYW1lPWs7dGhpcy5hZGRUaXRsZUVsZW1lbnQ9bjt0aGlzLmNyZWF0ZVJ1bGVyPWZ1bmN0aW9uKCl7dmFyIHE9cC5nZXRUZXh0RWxlbWVudHMocC5lbGVtZW50KSxyPXEucGFyZW50RWxlbWVudCx0PXEuY29udGFpbmVyRWxlbWVudCx2PXEudGV4dEVsZW1lbnQ7cmV0dXJuIGZ1bmN0aW9uKHkpe3IuYXBwZW5kQ2hpbGQodCk7di50ZXh0Q29udGVudD15O3k9Zi5nZXREaW1lbnNpb25zKHYpO3IucmVtb3ZlQ2hpbGQodCk7cmV0dXJuIHl9fTt0aGlzLmNyZWF0ZVBlbj1mdW5jdGlvbihxLHIsdCl7bnVsbD09dCYmKHQ9cC5lbGVtZW50KTt0PWYuYXBwZW5kKHQsImciLCJ0ZXh0LWNvbnRhaW5lciIscC5jbGFzc05hbWUpO3AuYWRkVGl0bGVFbGVtZW50JiYKKGYuYXBwZW5kKHQsInRpdGxlIikudGV4dENvbnRlbnQ9cSx0LnNldEF0dHJpYnV0ZSgidGl0bGUiLHEpKTtxPWYuYXBwZW5kKHQsImciLCJ0ZXh0LWFyZWEiKTtxLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrci50cmFuc2xhdGVbMF0rIiwiK3IudHJhbnNsYXRlWzFdKyIpcm90YXRlKCIrKHIucm90YXRlKyIpIikpO3JldHVybiBwLmNyZWF0ZVN2Z0xpbmVQZW4ocSl9fWcucHJvdG90eXBlLnNldEFkZFRpdGxlRWxlbWVudD1mdW5jdGlvbihsKXt0aGlzLmFkZFRpdGxlRWxlbWVudD1sfTtnLnByb3RvdHlwZS5jcmVhdGVTdmdMaW5lUGVuPWZ1bmN0aW9uKGwpe3JldHVybnt3cml0ZTpmdW5jdGlvbihrLG4scCxxKXt2YXIgcj1mLmFwcGVuZChsLCJ0ZXh0IiwidGV4dC1saW5lIik7ci50ZXh0Q29udGVudD1rO3Iuc2V0QXR0cmlidXRlKCJ0ZXh0LWFuY2hvciIsbik7ci5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK3ArIiwiK3ErIikiKTtyLnNldEF0dHJpYnV0ZSgieSIsCiItMC4yNWVtIil9fX07Zy5wcm90b3R5cGUuZ2V0VGV4dEVsZW1lbnRzPWZ1bmN0aW9uKGwpe2lmKCJ0ZXh0Ij09PWwudGFnTmFtZSl7dmFyIGs9bC5wYXJlbnRFbGVtZW50O251bGw9PWsmJihrPWwucGFyZW50Tm9kZSk7ay5yZW1vdmVDaGlsZChsKTtyZXR1cm57Y29udGFpbmVyRWxlbWVudDpsLHBhcmVudEVsZW1lbnQ6ayx0ZXh0RWxlbWVudDpsfX12YXIgbj1sLnF1ZXJ5U2VsZWN0b3IoInRleHQiKTtpZihudWxsIT1uKXJldHVybiBrPWwucGFyZW50RWxlbWVudCxudWxsPT1rJiYoaz1sLnBhcmVudE5vZGUpLGsucmVtb3ZlQ2hpbGQobCkse2NvbnRhaW5lckVsZW1lbnQ6bCxwYXJlbnRFbGVtZW50OmssdGV4dEVsZW1lbnQ6bn07az1mLmNyZWF0ZSgidGV4dCIsdGhpcy5jbGFzc05hbWUpO3JldHVybntjb250YWluZXJFbGVtZW50OmsscGFyZW50RWxlbWVudDpsLHRleHRFbGVtZW50Omt9fTtyZXR1cm4gZ30oKTtkLlN2Z0NvbnRleHQ9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPQp0aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixwKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgciBpbiBwKXAuaGFzT3duUHJvcGVydHkocikmJihuW3JdPXBbcl0pO24ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX0sbD1mKDIxKSxrPWYoMzYpO2M9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcChxKXt2YXIgcj1uLmNhbGwodGhpcyxxKXx8dGhpcztyLmRpbUNhY2hlPW5ldyBsLkNhY2hlKGZ1bmN0aW9uKHQpe3JldHVybiByLl9tZWFzdXJlTm90RnJvbUNhY2hlKHQpfSk7cmV0dXJuIHJ9ZyhwLG4pO3AucHJvdG90eXBlLl9tZWFzdXJlTm90RnJvbUNhY2hlPWZ1bmN0aW9uKHEpe3JldHVybiBuLnByb3RvdHlwZS5tZWFzdXJlLmNhbGwodGhpcyxxKX07cC5wcm90b3R5cGUubWVhc3VyZT1mdW5jdGlvbihxKXt2b2lkIDA9PT1xJiYocT1rLkFic3RyYWN0TWVhc3VyZXIuSEVJR0hUX1RFWFQpOwpyZXR1cm4gdGhpcy5kaW1DYWNoZS5nZXQocSl9O3AucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5kaW1DYWNoZS5jbGVhcigpO24ucHJvdG90eXBlLnJlc2V0LmNhbGwodGhpcyl9O3JldHVybiBwfShmKDYwKS5DYWNoZUNoYXJhY3Rlck1lYXN1cmVyKTtkLkNhY2hlTWVhc3VyZXI9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoNTkpLGw9Zig2Miksaz1mKDY0KSxuPWYoNjYpO2M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBwKHEpe3RoaXMuY29udGV4dD1xO3RoaXMubWVhc3VyZXI9bmV3IGwuQ2FjaGVNZWFzdXJlcih0aGlzLmNvbnRleHQpO3RoaXMud3JhcHBlcj1uZXcgay5XcmFwcGVyO3RoaXMud3JpdGVyPW5ldyBuLldyaXRlcih0aGlzLm1lYXN1cmVyLHRoaXMuY29udGV4dCx0aGlzLndyYXBwZXIpfXAuc3ZnPWZ1bmN0aW9uKHEscix0KXtyZXR1cm4gbmV3IHAobmV3IGcuU3ZnQ29udGV4dChxLHIsdCkpfTtwLmNhbnZhcz1mdW5jdGlvbihxLHIsdCl7cmV0dXJuIG5ldyBwKG5ldyBnLkNhbnZhc0NvbnRleHQocSwKcix0KSl9O3AucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHEscix0LHYseSl7dGhpcy53cml0ZXIud3JpdGUocSxyLHQsdix5KX07cC5wcm90b3R5cGUuY2xlYXJNZWFzdXJlckNhY2hlPWZ1bmN0aW9uKCl7dGhpcy5tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gcH0oKTtkLlR5cGVzZXR0ZXI9Y30sZnVuY3Rpb24oYyxkKXtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZihnKXt0aGlzLmNhY2hlPXt9O3RoaXMuY29tcHV0ZT1nfWYucHJvdG90eXBlLmdldD1mdW5jdGlvbihnKXt0aGlzLmNhY2hlLmhhc093blByb3BlcnR5KGcpfHwodGhpcy5jYWNoZVtnXT10aGlzLmNvbXB1dGUoZykpO3JldHVybiB0aGlzLmNhY2hlW2ddfTtmLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuY2FjaGU9e307cmV0dXJuIHRoaXN9O3JldHVybiBmfSgpO2QuQ2FjaGU9Y30sZnVuY3Rpb24oYyxkKXtkLk1ldGhvZHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBmKCl7fWYuYXJyYXlFcT1mdW5jdGlvbihnLGwpe2lmKG51bGw9PQpnfHxudWxsPT1sKXJldHVybiBnPT09bDtpZihnLmxlbmd0aCE9PWwubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgaz0wO2s8Zy5sZW5ndGg7aysrKWlmKGdba10hPT1sW2tdKXJldHVybiExO3JldHVybiEwfTtmLm9iakVxPWZ1bmN0aW9uKGcsbCl7aWYobnVsbD09Z3x8bnVsbD09bClyZXR1cm4gZz09PWw7dmFyIGs9T2JqZWN0LmtleXMoZykuc29ydCgpLG49T2JqZWN0LmtleXMobCkuc29ydCgpLHA9ay5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIGdbcl19KSxxPW4ubWFwKGZ1bmN0aW9uKHIpe3JldHVybiBsW3JdfSk7cmV0dXJuIGYuYXJyYXlFcShrLG4pJiZmLmFycmF5RXEocCxxKX07Zi5zdHJpY3RFcT1mdW5jdGlvbihnLGwpe3JldHVybiBnPT09bH07Zi5kZWZhdWx0cz1mdW5jdGlvbihnKXtmb3IodmFyIGw9W10saz0xO2s8YXJndW1lbnRzLmxlbmd0aDtrKyspbFtrLTFdPWFyZ3VtZW50c1trXTtpZihudWxsPT1nKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCIpOwp2YXIgbj1PYmplY3QoZyk7bC5mb3JFYWNoKGZ1bmN0aW9uKHApe2lmKG51bGwhPXApZm9yKHZhciBxIGluIHApT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHAscSkmJihuW3FdPXBbcV0pfSk7cmV0dXJuIG59O3JldHVybiBmfSgpfSxmdW5jdGlvbihjLGQpe2QuU3RyaW5nTWV0aG9kcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGYoKXt9Zi5jb21iaW5lV2hpdGVzcGFjZT1mdW5jdGlvbihnKXtyZXR1cm4gZy5yZXBsYWNlKC9bIFx0XSsvZywiICIpfTtmLmlzTm90RW1wdHlTdHJpbmc9ZnVuY3Rpb24oZyl7cmV0dXJuIGcmJiIiIT09Zy50cmltKCl9O2YudHJpbVN0YXJ0PWZ1bmN0aW9uKGcsbCl7aWYoIWcpcmV0dXJuIGc7Zz1nLnNwbGl0KCIiKTt2YXIgaz1sP2Z1bmN0aW9uKG4pe3JldHVybiBuLnNwbGl0KGwpLnNvbWUoZi5pc05vdEVtcHR5U3RyaW5nKX06Zi5pc05vdEVtcHR5U3RyaW5nO3JldHVybiBnLnJlZHVjZShmdW5jdGlvbihuLHApe3JldHVybiBrKG4rcCk/Cm4rcDpufSwiIil9O2YudHJpbUVuZD1mdW5jdGlvbihnLGwpe2lmKCFnKXJldHVybiBnO2c9Zy5zcGxpdCgiIik7Zy5yZXZlcnNlKCk7Zz1mLnRyaW1TdGFydChnLmpvaW4oIiIpLGwpLnNwbGl0KCIiKTtnLnJldmVyc2UoKTtyZXR1cm4gZy5qb2luKCIiKX07cmV0dXJuIGZ9KCl9LGZ1bmN0aW9uKGMsZCl7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGYoKXt0aGlzLldvcmREaXZpZGVyUmVnRXhwPS9cVy87dGhpcy5XaGl0ZXNwYWNlUmVnRXhwPS9ccy99Zi5wcm90b3R5cGUudG9rZW5pemU9ZnVuY3Rpb24oZyl7dmFyIGw9dGhpcztyZXR1cm4gZy5zcGxpdCgiIikucmVkdWNlKGZ1bmN0aW9uKGssbil7cmV0dXJuIGsuc2xpY2UoMCwtMSkuY29uY2F0KGwuc2hvdWxkQ3JlYXRlTmV3VG9rZW4oa1trLmxlbmd0aC0xXSxuKSl9LFsiIl0pfTtmLnByb3RvdHlwZS5zaG91bGRDcmVhdGVOZXdUb2tlbj1mdW5jdGlvbihnLGwpe2lmKCFnKXJldHVybltsXTt2YXIgaz1nW2cubGVuZ3RoLTFdO3JldHVybiB0aGlzLldoaXRlc3BhY2VSZWdFeHAudGVzdChrKSYmCnRoaXMuV2hpdGVzcGFjZVJlZ0V4cC50ZXN0KGwpP1tnK2xdOnRoaXMuV2hpdGVzcGFjZVJlZ0V4cC50ZXN0KGspfHx0aGlzLldoaXRlc3BhY2VSZWdFeHAudGVzdChsKT9bZyxsXTp0aGlzLldvcmREaXZpZGVyUmVnRXhwLnRlc3Qoayl8fHRoaXMuV29yZERpdmlkZXJSZWdFeHAudGVzdChsKT9rPT09bD9bZytsXTpbZyxsXTpbZytsXX07cmV0dXJuIGZ9KCk7ZC5Ub2tlbml6ZXI9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLGspe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBwIGluIGspay5oYXNPd25Qcm9wZXJ0eShwKSYmKGxbcF09a1twXSk7bC5wcm90b3R5cGU9bnVsbD09PWs/T2JqZWN0LmNyZWF0ZShrKToobi5wcm90b3R5cGU9ay5wcm90b3R5cGUsbmV3IG4pfTtjPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIGsoKXtyZXR1cm4gbC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9ZyhrLGwpO2sucHJvdG90eXBlLndyYXA9CmZ1bmN0aW9uKG4scCxxLHIpe2Z1bmN0aW9uIHQoRCl7cmV0dXJuIGwucHJvdG90eXBlLndyYXAuY2FsbCh2LG4scCxELHIpfXZhciB2PXRoaXM7dm9pZCAwPT09ciYmKHI9SW5maW5pdHkpO2lmKDE8bi5zcGxpdCgiXG4iKS5sZW5ndGgpdGhyb3cgRXJyb3IoIlNpbmdsZUxpbmVXcmFwcGVyIGlzIGRlc2lnbmVkIHRvIHdvcmsgb25seSBvbiBzaW5nbGUgbGluZSIpO3ZhciB5PXQocSk7aWYoMj55Lm5vTGluZXMpcmV0dXJuIHk7Zm9yKHZhciB6PTAseD0wO3g8ay5OT19XUkFQX0lURVJBVElPTlMmJnE+ejsrK3gpe3ZhciBDPShxK3opLzIsRj10KEMpO3RoaXMuYXJlU2FtZVJlc3VsdHMoeSxGKT8ocT1DLHk9Rik6ej1DfXJldHVybiB5fTtrLnByb3RvdHlwZS5hcmVTYW1lUmVzdWx0cz1mdW5jdGlvbihuLHApe3JldHVybiBuLm5vTGluZXM9PT1wLm5vTGluZXMmJm4udHJ1bmNhdGVkVGV4dD09PXAudHJ1bmNhdGVkVGV4dH07cmV0dXJuIGt9KGYoNjUpLldyYXBwZXIpO2MuTk9fV1JBUF9JVEVSQVRJT05TPQo1O2QuU2luZ2xlTGluZVdyYXBwZXI9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoMjEpLGw9e3RleHRSb3RhdGlvbjowLHRleHRTaGVhcjowLHhBbGlnbjoibGVmdCIseUFsaWduOiJ0b3AifTtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gayhuLHAscSl7dGhpcy5fbWVhc3VyZXI9bjt0aGlzLl9wZW5GYWN0b3J5PXA7dGhpcy5fd3JhcHBlcj1xfWsucHJvdG90eXBlLm1lYXN1cmVyPWZ1bmN0aW9uKG4pe3RoaXMuX21lYXN1cmVyPW47cmV0dXJuIHRoaXN9O2sucHJvdG90eXBlLndyYXBwZXI9ZnVuY3Rpb24obil7dGhpcy5fd3JhcHBlcj1uO3JldHVybiB0aGlzfTtrLnByb3RvdHlwZS5wZW5GYWN0b3J5PWZ1bmN0aW9uKG4pe3RoaXMuX3BlbkZhY3Rvcnk9bjtyZXR1cm4gdGhpc307ay5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24obixwLHEscix0KXt2b2lkIDA9PT1yJiYocj17fSk7cj1nLk1ldGhvZHMuZGVmYXVsdHMoe30sbCxyKTtpZigtMT09PWsuU3VwcG9ydGVkUm90YXRpb24uaW5kZXhPZihyLnRleHRSb3RhdGlvbikpdGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIHJvdGF0aW9uIC0gIisKci50ZXh0Um90YXRpb24rIi4gU3VwcG9ydGVkIHJvdGF0aW9ucyBhcmUgIitrLlN1cHBvcnRlZFJvdGF0aW9uLmpvaW4oIiwgIikpO2lmKG51bGwhPXIudGV4dFNoZWFyJiYtODA+ci50ZXh0U2hlYXJ8fDgwPHIudGV4dFNoZWFyKXRocm93IEVycm9yKCJ1bnN1cHBvcnRlZCBzaGVhciBhbmdsZSAtICIrci50ZXh0U2hlYXIrIi4gTXVzdCBiZSBiZXR3ZWVuIC04MCBhbmQgODAiKTt2YXIgdj00NTxNYXRoLmFicyhNYXRoLmFicyhyLnRleHRSb3RhdGlvbiktOTApLHk9dj9wOnEsej12P3E6cCx4PXIudGV4dFNoZWFyLEM9eCpNYXRoLlBJLzE4MDt2PXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQ7dmFyIEY9dipNYXRoLnRhbihDKTt5PXkvTWF0aC5jb3MoQyktTWF0aC5hYnMoRik7dmFyIEQ9eipNYXRoLmNvcyhDKTt6PWcuU3RyaW5nTWV0aG9kcy5jb21iaW5lV2hpdGVzcGFjZShuKTt6PSh0aGlzLl93cmFwcGVyP3RoaXMuX3dyYXBwZXIud3JhcCh6LHRoaXMuX21lYXN1cmVyLAp5LEQpLndyYXBwZWRUZXh0OnopLnNwbGl0KCJcbiIpO0M9ay5YT2Zmc2V0RmFjdG9yW3IueEFsaWduXSp5Kk1hdGguc2luKEMpLWsuWU9mZnNldEZhY3RvcltyLnlBbGlnbl0qKEQtei5sZW5ndGgqdik7eD1yLnRleHRSb3RhdGlvbit4O3N3aXRjaChyLnRleHRSb3RhdGlvbil7Y2FzZSA5MDpwPVtwK0MsMF07YnJlYWs7Y2FzZSAtOTA6cD1bLUMscV07YnJlYWs7Y2FzZSAxODA6cD1bcCxxK0NdO2JyZWFrO2RlZmF1bHQ6cD1bMCwtQ119bj10aGlzLl9wZW5GYWN0b3J5LmNyZWF0ZVBlbihuLHt0cmFuc2xhdGU6cCxyb3RhdGU6eH0sdCk7dGhpcy53cml0ZUxpbmVzKHosbix5LHYsRixyLnhBbGlnbik7bnVsbCE9bi5kZXN0cm95JiZuLmRlc3Ryb3koKX07ay5wcm90b3R5cGUud3JpdGVMaW5lcz1mdW5jdGlvbihuLHAscSxyLHQsdil7bi5mb3JFYWNoKGZ1bmN0aW9uKHkseil7cC53cml0ZSh5LGsuQW5jaG9yQ29udmVydGVyW3ZdLCgwPHQ/KHorMSkqdDp6KnQpK3Eqay5YT2Zmc2V0RmFjdG9yW3ZdLAooeisxKSpyKX0pfTtyZXR1cm4ga30oKTtjLlN1cHBvcnRlZFJvdGF0aW9uPVstOTAsMCwxODAsOTBdO2MuQW5jaG9yQ29udmVydGVyPXtjZW50ZXI6Im1pZGRsZSIsbGVmdDoic3RhcnQiLHJpZ2h0OiJlbmQifTtjLlhPZmZzZXRGYWN0b3I9e2NlbnRlcjouNSxsZWZ0OjAscmlnaHQ6MX07Yy5ZT2Zmc2V0RmFjdG9yPXtib3R0b206MSxjZW50ZXI6LjUsdG9wOjB9O2QuV3JpdGVyPWN9LGZ1bmN0aW9uKGMsZCxmKXtmdW5jdGlvbiBnKGwpe2Zvcih2YXIgayBpbiBsKWQuaGFzT3duUHJvcGVydHkoayl8fChkW2tdPWxba10pfWYoNjkpO2M9Zig3KTtkLkFuaW1hdG9ycz1jO2M9Zig2Nyk7ZC5BeGVzPWM7Yz1mKDM3KTtkLkNvbXBvbmVudHM9YztjPWYoMjMpO2QuQ29uZmlncz1jO2M9Zig4KTtkLkZvcm1hdHRlcnM9YztjPWYoMzApO2QuUmVuZGVyQ29udHJvbGxlcj1jO2M9ZigzOSk7ZC5SZW5kZXJQb2xpY2llcz1jO2M9ZigzMSk7ZC5TeW1ib2xGYWN0b3JpZXM9YztjPWYoMTMpO2QuRGlzcGF0Y2hlcnM9CmM7Yz1mKDE0KTtkLkRyYXdlcnM9YztjPWYoMjUpO2QuSW50ZXJhY3Rpb25zPWM7Yz1mKDE5KTtkLlBsb3RzPWM7Yz1mKDMpO2QuU2NhbGVzPWM7Yz1mKDApO2QuVXRpbHM9YztnKGYoMjIpKTtjPWYoMjgpO2QuVGltZUludGVydmFsPWMuVGltZUludGVydmFsO2coZig0KSk7ZyhmKDI5KSk7ZyhmKDM4KSk7Yz1mKDY4KTtkLnZlcnNpb249Yy52ZXJzaW9uO2coZigyNCkpO2coZig2KSk7ZyhmKDE1KSk7ZyhmKDQwKSk7ZyhmKDE2KSk7ZyhmKDIpKTtnKGYoMTEpKTtnKGYoMTcpKX1dKX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWNoYXJ0LWhlbHBlcnMvcGxvdHRhYmxlLWludGVyYWN0aW9ucy5qcwp2YXIgJG87CihmdW5jdGlvbihhKXtmdW5jdGlvbiBjKHApe2NvbnN0IHE9W107Zm9yKDtwJiZwIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7KWlmKHEucHVzaChwKSxwLmFzc2lnbmVkU2xvdClwPXAuYXNzaWduZWRTbG90O2Vsc2UgaWYocC5wYXJlbnRFbGVtZW50KXA9cC5wYXJlbnRFbGVtZW50O2Vsc2V7Y29uc3Qgcj1wLnBhcmVudE5vZGU7cD1yIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudD9yLmhvc3Q6ciE9PXA/cjpudWxsfXJldHVybiBxfWZ1bmN0aW9uIGQocCl7dmFyIHE9YyhwKTtwPWY7bGV0IHI9bnVsbDtmb3IoY29uc3QgdiBvZiBxKXtxPVBsb3R0YWJsZS5VdGlscy5ET00uZ2V0RWxlbWVudFRyYW5zZm9ybSh2KTtpZihudWxsIT1xKXt2YXIgdD12LmNsaWVudFdpZHRoLzI7Y29uc3QgeT12LmNsaWVudEhlaWdodC8yO3A9UGxvdHRhYmxlLlV0aWxzLk1hdGgubXVsdGlwbHlUcmFuc2xhdGUocCxbdCx5XSk7cD1QbG90dGFibGUuVXRpbHMuTWF0aC5tdWx0aXBseU1hdHJpeChwLFBsb3R0YWJsZS5VdGlscy5NYXRoLmludmVydE1hdHJpeChxKSk7CnA9UGxvdHRhYmxlLlV0aWxzLk1hdGgubXVsdGlwbHlUcmFuc2xhdGUocCxbLXQsLXldKX1xPXYuc2Nyb2xsTGVmdDt0PXYuc2Nyb2xsVG9wO2lmKG51bGw9PT1yfHx2PT09cilxLT12Lm9mZnNldExlZnQrdi5jbGllbnRMZWZ0LHQtPXYub2Zmc2V0VG9wK3YuY2xpZW50VG9wLHI9di5vZmZzZXRQYXJlbnQ7cD1QbG90dGFibGUuVXRpbHMuTWF0aC5tdWx0aXBseVRyYW5zbGF0ZShwLFtxLHRdKX1yZXR1cm4gcH1jb25zdCBmPVsxLDAsMCwxLDAsMF07Y2xhc3MgZyBleHRlbmRzIFBsb3R0YWJsZS5VdGlscy5UcmFuc2xhdG9ye2NvbXB1dGVQb3NpdGlvbihwLHEpe3A9e3g6cCx5OnF9O3E9ZCh0aGlzLl9yb290RWxlbWVudCk7cmV0dXJuIG51bGw9PXE/cDpQbG90dGFibGUuVXRpbHMuTWF0aC5hcHBseVRyYW5zZm9ybShxLHApfX1jbGFzcyBsIGV4dGVuZHMgUGxvdHRhYmxlLkRpc3BhdGNoZXJzLk1vdXNle2NvbnN0cnVjdG9yKHApe3N1cGVyKHApO3RoaXMuX2V2ZW50VGFyZ2V0PXAucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpOwp0aGlzLl90cmFuc2xhdG9yPW5ldyBnKHAucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpKX1zdGF0aWMgZ2V0RGlzcGF0Y2hlcihwKXtjb25zdCBxPXAucm9vdCgpLnJvb3RFbGVtZW50KCk7bGV0IHI9cVtsLl9ESVNQQVRDSEVSX0tFWV07cnx8KHI9bmV3IGwocCkscVtsLl9ESVNQQVRDSEVSX0tFWV09cik7cmV0dXJuIHJ9fWNsYXNzIGsgZXh0ZW5kcyBQbG90dGFibGUuRGlzcGF0Y2hlcnMuVG91Y2h7Y29uc3RydWN0b3IocCl7c3VwZXIocCk7dGhpcy5fZXZlbnRUYXJnZXQ9cC5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCk7dGhpcy5fdHJhbnNsYXRvcj1uZXcgZyhwLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKSl9c3RhdGljIGdldERpc3BhdGNoZXIocCl7Y29uc3QgcT1wLnJvb3QoKS5yb290RWxlbWVudCgpO2xldCByPXFbay5fRElTUEFUQ0hFUl9LRVldO3J8fChyPW5ldyBrKHApLHFbay5fRElTUEFUQ0hFUl9LRVldPXIpO3JldHVybiByfX1jbGFzcyBuIGV4dGVuZHMgUGxvdHRhYmxlLkludGVyYWN0aW9ucy5Qb2ludGVye19hbmNob3IoKXt0aGlzLl9pc0FuY2hvcmVkPQohMDt0aGlzLl9tb3VzZURpc3BhdGNoZXI9bC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPWsuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayl9fWEuUG9pbnRlckludGVyYWN0aW9uPW59KSgkb3x8KCRvPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotY2hhcnQtaGVscGVycy92ei1jaGFydC1oZWxwZXJzLmpzCihmdW5jdGlvbihhKXtmdW5jdGlvbiBjKCl7bGV0IGw9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO2wudGlja0dlbmVyYXRvcigpO2xldCBrPW5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKGwsImJvdHRvbSIpO2suZm9ybWF0dGVyKGEuc3RlcEZvcm1hdHRlcik7cmV0dXJue3NjYWxlOmwsYXhpczprLGFjY2Vzc29yOm49Pm4uc3RlcH19ZnVuY3Rpb24gZCgpe2xldCBsPW5ldyBQbG90dGFibGUuU2NhbGVzLlRpbWU7cmV0dXJue3NjYWxlOmwsYXhpczpuZXcgUGxvdHRhYmxlLkF4ZXMuVGltZShsLCJib3R0b20iKSxhY2Nlc3NvcjprPT5rLndhbGxfdGltZX19ZnVuY3Rpb24gZigpe2xldCBsPW5ldyBQbG90dGFibGUuU2NhbGVzLkxpbmVhcjtyZXR1cm57c2NhbGU6bCxheGlzOm5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKGwsImJvdHRvbSIpLGFjY2Vzc29yOmEucmVsYXRpdmVBY2Nlc3Nvcn19YS5TWU1CT0xTX0xJU1Q9W3tjaGFyYWN0ZXI6Ilx1MjVmYyIsbWV0aG9kOlBsb3R0YWJsZS5TeW1ib2xGYWN0b3JpZXMuc3F1YXJlfSwKe2NoYXJhY3RlcjoiXHUyNWM2IixtZXRob2Q6UGxvdHRhYmxlLlN5bWJvbEZhY3Rvcmllcy5kaWFtb25kfSx7Y2hhcmFjdGVyOiJcdTI1YjIiLG1ldGhvZDpQbG90dGFibGUuU3ltYm9sRmFjdG9yaWVzLnRyaWFuZ2xlfSx7Y2hhcmFjdGVyOiJcdTI2MDUiLG1ldGhvZDpQbG90dGFibGUuU3ltYm9sRmFjdG9yaWVzLnN0YXJ9LHtjaGFyYWN0ZXI6Ilx1MjcxYSIsbWV0aG9kOlBsb3R0YWJsZS5TeW1ib2xGYWN0b3JpZXMuY3Jvc3N9XTtsZXQgZzsoZnVuY3Rpb24obCl7bC5TVEVQPSJzdGVwIjtsLlJFTEFUSVZFPSJyZWxhdGl2ZSI7bC5XQUxMX1RJTUU9IndhbGxfdGltZSJ9KShnPWEuWFR5cGV8fChhLlhUeXBlPXt9KSk7YS5ZX1RPT0xUSVBfRk9STUFUVEVSX1BSRUNJU0lPTj00O2EuU1RFUF9GT1JNQVRURVJfUFJFQ0lTSU9OPTQ7YS5ZX0FYSVNfRk9STUFUVEVSX1BSRUNJU0lPTj0zO2EuVE9PTFRJUF9ZX1BJWEVMX09GRlNFVD0yMDthLlRPT0xUSVBfQ0lSQ0xFX1NJWkU9NDthLk5BTl9TWU1CT0xfU0laRT0KNjthLm11bHRpc2NhbGVGb3JtYXR0ZXI9ZnVuY3Rpb24obCl7cmV0dXJuIGs9PntsZXQgbj1NYXRoLmFicyhrKTsxRS0xNT5uJiYobj0wKTtyZXR1cm4oMUU0PD1uP2QzLmZvcm1hdCgiLiIrbCsifmUiKTowPG4mJi4wMT5uP2QzLmZvcm1hdCgiLiIrbCsifmUiKTpkMy5mb3JtYXQoIi4iK2wrIn5nIikpKGspfX07YS5jb21wdXRlRG9tYWluPWZ1bmN0aW9uKGwsayl7bD1sLmZpbHRlcihxPT5pc0Zpbml0ZShxKSk7aWYoMD09PWwubGVuZ3RoKXJldHVyblstLjEsMS4xXTtrPyhsPV8uc29ydEJ5KGwpLGs9ZDMucXVhbnRpbGUobCwuMDUpLGw9ZDMucXVhbnRpbGUobCwuOTUpKTooaz1kMy5taW4obCksbD1kMy5tYXgobCkpO2xldCBuLHA9bC1rO249MD09PXA/MS4xKk1hdGguYWJzKGspKzEuMTouMipwO2s9WzA8PWsmJms8cD8tLjEqbDprLW4sbCtuXTtyZXR1cm4gaz1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihrKS5uaWNlKCkuZG9tYWluKCl9O2EuYWNjZXNzb3JpemU9ZnVuY3Rpb24obCl7cmV0dXJuIGs9PgprW2xdfTthLnN0ZXBGb3JtYXR0ZXI9ZDMuZm9ybWF0KGAuJHthLlNURVBfRk9STUFUVEVSX1BSRUNJU0lPTn1+c2ApO2Euc3RlcFg9YzthLnRpbWVGb3JtYXR0ZXI9UGxvdHRhYmxlLkZvcm1hdHRlcnMudGltZSgiJWEgJWIgJWUsICVIOiVNOiVTIik7YS53YWxsWD1kO2EucmVsYXRpdmVBY2Nlc3Nvcj0obCxrLG4pPT57aWYobnVsbCE9bC5yZWxhdGl2ZSlyZXR1cm4gbC5yZWxhdGl2ZTtrPW4uZGF0YSgpO3JldHVybigrbC53YWxsX3RpbWUtKDA8ay5sZW5ndGg/K2tbMF0ud2FsbF90aW1lOjApKS8zNkU1fTthLnJlbGF0aXZlRm9ybWF0dGVyPWw9PntsZXQgaz0iIixuPU1hdGguZmxvb3IobC8yNCk7bC09MjQqbjtuJiYoays9bisiZCAiKTtsZXQgcD1NYXRoLmZsb29yKGwpO2w9NjAqKGwtcCk7aWYocHx8bilrKz1wKyJoICI7bGV0IHE9TWF0aC5mbG9vcihsKTtsPTYwKihsLXEpO2lmKHF8fHB8fG4pays9cSsibSAiO3JldHVybiBrK01hdGguZmxvb3IobCkrInMifTthLnJlbGF0aXZlWD0KZjthLmdldFhDb21wb25lbnRzPWZ1bmN0aW9uKGwpe3N3aXRjaChsKXtjYXNlIGcuU1RFUDpyZXR1cm4gYygpO2Nhc2UgZy5XQUxMX1RJTUU6cmV0dXJuIGQoKTtjYXNlIGcuUkVMQVRJVkU6cmV0dXJuIGYoKTtkZWZhdWx0OnRocm93IEVycm9yKCJpbnZhbGlkIHhUeXBlOiAiK2wpO319fSkoJG98fCgkbz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWNoYXJ0LWhlbHBlcnMvdnotY2hhcnQtdG9vbHRpcC5qcwp2YXIgYXA7CihmdW5jdGlvbihhKXtsZXQgYzsoZnVuY3Rpb24oZil7Zi5BVVRPPSJhdXRvIjtmLkJPVFRPTT0iYm90dG9tIjtmLlJJR0hUPSJyaWdodCJ9KShjPWEuVG9vbHRpcFBvc2l0aW9ufHwoYS5Ub29sdGlwUG9zaXRpb249e30pKTtjb25zdCBkPXtib3hTaGFkb3c6IjAgMXB4IDRweCByZ2JhKDAsIDAsIDAsIC4zKSIsb3BhY2l0eTowLHBvc2l0aW9uOiJmaXhlZCIsd2lsbENoYW5nZToidHJhbnNmb3JtIix6SW5kZXg6NX07UG9seW1lcih7aXM6InZ6LWNoYXJ0LXRvb2x0aXAiLF90ZW1wbGF0ZTpudWxsLHByb3BlcnRpZXM6e2NvbnRlbnRDb21wb25lbnROYW1lOlN0cmluZyxwb3NpdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6Yy5BVVRPfSxtaW5EaXN0RnJvbUVkZ2U6e3R5cGU6TnVtYmVyLHZhbHVlOjE1fX0scmVhZHkoKXt0aGlzLl90dW5uZWw9dGhpcy5fcmFmPXRoaXMuX3N0eWxlQ2FjaGU9bnVsbH0sYXR0YWNoZWQoKXt0aGlzLl90dW5uZWw9dGhpcy5fY3JlYXRlVHVubmVsKCk7dGhpcy5faGlkZU9uQmx1cj0KKCk9Pntkb2N1bWVudC5oaWRkZW4mJnRoaXMuaGlkZSgpfTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsdGhpcy5faGlkZU9uQmx1cil9LGRldGFjaGVkKCl7dGhpcy5oaWRlKCk7dGhpcy5fcmVtb3ZlVHVubmVsKHRoaXMuX3R1bm5lbCk7dGhpcy5fdHVubmVsPW51bGw7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHRoaXMuX2hpZGVPbkJsdXIpfSxjb250ZW50KCl7cmV0dXJuIHRoaXMuX3R1bm5lbC5zaGFkb3dSb290fSxoaWRlKCl7d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JhZik7dGhpcy5fc3R5bGVDYWNoZT1udWxsO3RoaXMuX3R1bm5lbC5zdHlsZS5vcGFjaXR5PTB9LHVwZGF0ZUFuZFBvc2l0aW9uKGYpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yYWYpO3RoaXMuX3JhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9yZXBvc2l0aW9uSW1wbChmKX0pfSwKX3JlcG9zaXRpb25JbXBsKGYpe2NvbnN0IGc9dGhpcy5fdHVubmVsO2Y9Zi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCBsPWcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksaz13aW5kb3cuaW5uZXJIZWlnaHQsbj1kb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLHA9Zi50b3AscT1wK2YuaGVpZ2h0LHI9bC5oZWlnaHQrJG8uVE9PTFRJUF9ZX1BJWEVMX09GRlNFVDtsZXQgdD1udWxsLHY9TWF0aC5tYXgodGhpcy5taW5EaXN0RnJvbUVkZ2UsZi5sZWZ0KSx5PW51bGwsej1wO3RoaXMucG9zaXRpb249PWMuUklHSFQ/dj1mLnJpZ2h0Oih6PXErJG8uVE9PTFRJUF9ZX1BJWEVMX09GRlNFVCxuPHYrbC53aWR0aCt0aGlzLm1pbkRpc3RGcm9tRWRnZSYmKHY9bnVsbCx5PXRoaXMubWluRGlzdEZyb21FZGdlKSk7dGhpcy5wb3NpdGlvbj09Yy5BVVRPJiYwPGYudG9wLXImJms8Zi50b3ArZi5oZWlnaHQrciYmKHo9bnVsbCx0PWstcCskby5UT09MVElQX1lfUElYRUxfT0ZGU0VUKTtmPXtvcGFjaXR5OjEsCmxlZnQ6dj9gJHt2fXB4YDpudWxsLHJpZ2h0Onk/YCR7eX1weGA6bnVsbCx0b3A6ej9gJHt6fXB4YDpudWxsLGJvdHRvbTp0P2Ake3R9cHhgOm51bGx9O18uaXNFcXVhbCh0aGlzLl9zdHlsZUNhY2hlLGYpfHwoT2JqZWN0LmFzc2lnbihnLnN0eWxlLGYpLHRoaXMuX3N0eWxlQ2FjaGU9Zil9LF9jcmVhdGVUdW5uZWwoKXtpZighdGhpcy5jb250ZW50Q29tcG9uZW50TmFtZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiUmVxdWlyZSBgY29udGVudENvbXBvbmVudE5hbWVgIHRvIGJlIGEgbmFtZSBvZiBhIFBvbHltZXIgY29tcG9uZW50Iik7Y29uc3QgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHRoaXMuY29udGVudENvbXBvbmVudE5hbWUpO09iamVjdC5hc3NpZ24oZi5zdHlsZSxkKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO3JldHVybiBmfSxfcmVtb3ZlVHVubmVsKGYpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9fSl9KShhcHx8KGFwPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydC9kcmFnWm9vbUludGVyYWN0aW9uLmpzCnZhciBicDsKKGZ1bmN0aW9uKGEpe2NsYXNzIGMgZXh0ZW5kcyBQbG90dGFibGUuQ29tcG9uZW50cy5TZWxlY3Rpb25Cb3hMYXllcntjb25zdHJ1Y3RvcihkLGYsZyl7c3VwZXIoKTt0aGlzLmVhc2VGbj1kMy5lYXNlQ3ViaWNJbk91dDt0aGlzLl9hbmltYXRpb25UaW1lPTc1MDt0aGlzLnhTY2FsZShkKTt0aGlzLnlTY2FsZShmKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb249bmV3IFBsb3R0YWJsZS5JbnRlcmFjdGlvbnMuRHJhZzt0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uPW5ldyBQbG90dGFibGUuSW50ZXJhY3Rpb25zLkNsaWNrO3RoaXMuc2V0dXBDYWxsYmFja3MoKTt0aGlzLnVuem9vbU1ldGhvZD1nO3RoaXMub25EZXRhY2goKCk9Pnt0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uLmRldGFjaEZyb20oKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoRnJvbSgpfSk7dGhpcy5vbkFuY2hvcigoKT0+e3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24uYXR0YWNoVG8odGhpcyk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKHRoaXMpfSl9aW50ZXJhY3Rpb25TdGFydChkKXt0aGlzLm9uU3RhcnQ9CmR9aW50ZXJhY3Rpb25FbmQoZCl7dGhpcy5vbkVuZD1kfWRyYWdJbnRlcmFjdGlvbigpe3JldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb259c2V0dXBDYWxsYmFja3MoKXtsZXQgZD0hMTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQoZj0+e3RoaXMuYm91bmRzKHt0b3BMZWZ0OmYsYm90dG9tUmlnaHQ6Zn0pO3RoaXMub25TdGFydCgpfSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZygoZixnKT0+e3RoaXMuYm91bmRzKHt0b3BMZWZ0OmYsYm90dG9tUmlnaHQ6Z30pO3RoaXMuYm94VmlzaWJsZSghMCk7ZD0hMH0pO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdFbmQoKGYsZyk9Pnt0aGlzLmJveFZpc2libGUoITEpO3RoaXMuYm91bmRzKHt0b3BMZWZ0OmYsYm90dG9tUmlnaHQ6Z30pO2lmKGQpdGhpcy56b29tKCk7ZWxzZSB0aGlzLm9uRW5kKCk7ZD0hMX0pO3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24ub25Eb3VibGVDbGljayh0aGlzLnVuem9vbS5iaW5kKHRoaXMpKX1hbmltYXRpb25UaW1lKGQpe2lmKG51bGw9PQpkKXJldHVybiB0aGlzLl9hbmltYXRpb25UaW1lO2lmKDA+ZCl0aHJvdyBFcnJvcigiYW5pbWF0aW9uVGltZSBjYW5ub3QgYmUgbmVnYXRpdmUiKTt0aGlzLl9hbmltYXRpb25UaW1lPWQ7cmV0dXJuIHRoaXN9ZWFzZShkKXtpZigiZnVuY3Rpb24iIT09dHlwZW9mIGQpdGhyb3cgRXJyb3IoImVhc2UgZnVuY3Rpb24gbXVzdCBiZSBhIGZ1bmN0aW9uIik7MD09PWQoMCkmJjE9PT1kKDEpfHxQbG90dGFibGUuVXRpbHMuV2luZG93Lndhcm4oIkVhc2luZyBmdW5jdGlvbiBkb2VzIG5vdCBtYWludGFpbiBpbnZhcmlhbnQgZigwKVx4M2RceDNkMCBceDI2XHgyNiBmKDEpXHgzZFx4M2QxLiBCYWQgYmVoYXZpb3IgbWF5IHJlc3VsdC4iKTt0aGlzLmVhc2VGbj1kO3JldHVybiB0aGlzfXpvb20oKXtsZXQgZD10aGlzLnhFeHRlbnQoKVswXS52YWx1ZU9mKCksZj10aGlzLnhFeHRlbnQoKVsxXS52YWx1ZU9mKCksZz10aGlzLnlFeHRlbnQoKVsxXS52YWx1ZU9mKCksbD10aGlzLnlFeHRlbnQoKVswXS52YWx1ZU9mKCk7CmQhPT1mJiZnIT09bCYmdGhpcy5pbnRlcnBvbGF0ZVpvb20oZCxmLGcsbCl9dW56b29tKCl7dmFyIGQ9dGhpcy54U2NhbGUoKTtkLl9kb21haW5NaW49bnVsbDtkLl9kb21haW5NYXg9bnVsbDtkPWQuX2dldEV4dGVudCgpO3RoaXMueFNjYWxlKCkuZG9tYWluKGQpO3RoaXMudW56b29tTWV0aG9kKCl9aXNab29taW5nKGQpe3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5lbmFibGVkKCFkKTt0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uLmVuYWJsZWQoIWQpfWludGVycG9sYXRlWm9vbShkLGYsZyxsKXtsZXQgaz10aGlzLnhTY2FsZSgpLmRvbWFpbigpWzBdLnZhbHVlT2YoKSxuPXRoaXMueFNjYWxlKCkuZG9tYWluKClbMV0udmFsdWVPZigpLHA9dGhpcy55U2NhbGUoKS5kb21haW4oKVswXS52YWx1ZU9mKCkscT10aGlzLnlTY2FsZSgpLmRvbWFpbigpWzFdLnZhbHVlT2YoKSxyPXRoaXMuZWFzZUZuLHQ9KHoseCxDKT0+ZDMuaW50ZXJwb2xhdGVOdW1iZXIoeix4KShyKEMpKTt0aGlzLmlzWm9vbWluZyghMCk7CmxldCB2PURhdGUubm93KCkseT0oKT0+e3ZhciB6PURhdGUubm93KCktdjt6PTA9PT10aGlzLl9hbmltYXRpb25UaW1lPzE6TWF0aC5taW4oMSx6L3RoaXMuX2FuaW1hdGlvblRpbWUpO2xldCB4PXQoayxkLHopLEM9dChuLGYseiksRj10KHAsZyx6KSxEPXQocSxsLHopO3RoaXMueFNjYWxlKCkuZG9tYWluKFt4LENdKTt0aGlzLnlTY2FsZSgpLmRvbWFpbihbRixEXSk7MT56P1Bsb3R0YWJsZS5VdGlscy5ET00ucmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGwoeSk6KHRoaXMub25FbmQoKSx0aGlzLmlzWm9vbWluZyghMSkpfTt5KCl9fWEuRHJhZ1pvb21MYXllcj1jfSkoYnB8fChicD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL3Bhblpvb21EcmFnTGF5ZXIuanMKdmFyIGNwOwooZnVuY3Rpb24oYSl7bGV0IGM7KGZ1bmN0aW9uKGYpe2ZbZi5OT05FPTBdPSJOT05FIjtmW2YuRFJBR19aT09NSU5HPTFdPSJEUkFHX1pPT01JTkciO2ZbZi5QQU5OSU5HPTJdPSJQQU5OSU5HIn0pKGN8fChjPXt9KSk7Y2xhc3MgZCBleHRlbmRzIFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3Vwe2NvbnN0cnVjdG9yKGYsZyxsKXtzdXBlcigpO3RoaXMuc3RhdGU9Yy5OT05FO3RoaXMucGFuU3RhcnRDYWxsYmFjaz1uZXcgUGxvdHRhYmxlLlV0aWxzLkNhbGxiYWNrU2V0O3RoaXMucGFuRW5kQ2FsbGJhY2s9bmV3IFBsb3R0YWJsZS5VdGlscy5DYWxsYmFja1NldDt0aGlzLnBhblpvb209bmV3IFBsb3R0YWJsZS5JbnRlcmFjdGlvbnMuUGFuWm9vbShmLGcpO3RoaXMucGFuWm9vbS5kcmFnSW50ZXJhY3Rpb24oKS5tb3VzZUZpbHRlcihuPT5kLmlzUGFuS2V5KG4pJiYwPT09bi5idXR0b24pO3RoaXMucGFuWm9vbS53aGVlbEZpbHRlcih0aGlzLmNhblNjcm9sbFpvb20pO3RoaXMuZHJhZ1pvb21MYXllcj1uZXcgYnAuRHJhZ1pvb21MYXllcihmLApnLGwpO3RoaXMuZHJhZ1pvb21MYXllci5kcmFnSW50ZXJhY3Rpb24oKS5tb3VzZUZpbHRlcihuPT4hZC5pc1BhbktleShuKSYmMD09PW4uYnV0dG9uKTt0aGlzLmFwcGVuZCh0aGlzLmRyYWdab29tTGF5ZXIpO2NvbnN0IGs9dGhpcy5vbldoZWVsLmJpbmQodGhpcyk7dGhpcy5vbkFuY2hvcigoKT0+e3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1QbG90dGFibGUuRGlzcGF0Y2hlcnMuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25XaGVlbChrKTt0aGlzLnBhblpvb20uYXR0YWNoVG8odGhpcyl9KTt0aGlzLm9uRGV0YWNoKCgpPT57dGhpcy5wYW5ab29tLmRldGFjaEZyb20oKTt0aGlzLl9tb3VzZURpc3BhdGNoZXImJih0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmV2hlZWwoayksdGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGwpfSk7dGhpcy5wYW5ab29tLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ1N0YXJ0KCgpPT57dGhpcy5zdGF0ZT09Yy5OT05FJiYKdGhpcy5zZXRTdGF0ZShjLlBBTk5JTkcpfSk7dGhpcy5wYW5ab29tLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ0VuZCgoKT0+e3RoaXMuc3RhdGU9PWMuUEFOTklORyYmdGhpcy5zZXRTdGF0ZShjLk5PTkUpfSk7dGhpcy5kcmFnWm9vbUxheWVyLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ1N0YXJ0KCgpPT57dGhpcy5zdGF0ZT09Yy5OT05FJiZ0aGlzLnNldFN0YXRlKGMuRFJBR19aT09NSU5HKX0pO3RoaXMuZHJhZ1pvb21MYXllci5kcmFnSW50ZXJhY3Rpb24oKS5vbkRyYWdFbmQoKCk9Pnt0aGlzLnN0YXRlPT1jLkRSQUdfWk9PTUlORyYmdGhpcy5zZXRTdGF0ZShjLk5PTkUpfSl9b25XaGVlbChmLGcpe2lmKCF0aGlzLmNhblNjcm9sbFpvb20oZykmJihmPXRoaXMuZWxlbWVudCgpLGYuc2VsZWN0KCIuaGVscCIpLmVtcHR5KCkpKXt2YXIgbD1mLmFwcGVuZCgiZGl2IikuY2xhc3NlZCgiaGVscCIsITApO2wuYXBwZW5kKCJzcGFuIikudGV4dCgiQWx0ICsgU2Nyb2xsIHRvIFpvb20iKTsKbC5vbigiYW5pbWF0aW9uZW5kIiwoKT0+dm9pZCBsLnJlbW92ZSgpKX19c3RhdGljIGlzUGFuS2V5KGYpe3JldHVybiEhZi5hbHRLZXl8fCEhZi5zaGlmdEtleX1jYW5TY3JvbGxab29tKGYpe3JldHVybiBmLmFsdEtleX1zZXRTdGF0ZShmKXtpZih0aGlzLnN0YXRlIT1mKXt2YXIgZz10aGlzLnN0YXRlO3RoaXMuc3RhdGU9Zjt0aGlzLnJvb3QoKS5yZW1vdmVDbGFzcyh0aGlzLnN0YXRlQ2xhc3NOYW1lKGcpKTt0aGlzLnJvb3QoKS5hZGRDbGFzcyh0aGlzLnN0YXRlQ2xhc3NOYW1lKGYpKTtnPT1jLlBBTk5JTkcmJnRoaXMucGFuRW5kQ2FsbGJhY2suY2FsbENhbGxiYWNrcygpO2Y9PWMuUEFOTklORyYmdGhpcy5wYW5TdGFydENhbGxiYWNrLmNhbGxDYWxsYmFja3MoKX19c3RhdGVDbGFzc05hbWUoZil7c3dpdGNoKGYpe2Nhc2UgYy5QQU5OSU5HOnJldHVybiJwYW5uaW5nIjtjYXNlIGMuRFJBR19aT09NSU5HOnJldHVybiJkcmFnLXpvb21pbmciO2RlZmF1bHQ6cmV0dXJuIiJ9fW9uUGFuU3RhcnQoZil7dGhpcy5wYW5TdGFydENhbGxiYWNrLmFkZChmKX1vblBhbkVuZChmKXt0aGlzLnBhbkVuZENhbGxiYWNrLmFkZChmKX1vblNjcm9sbFpvb20oZil7dGhpcy5wYW5ab29tLm9uWm9vbUVuZChmKX1vbkRyYWdab29tU3RhcnQoZil7dGhpcy5kcmFnWm9vbUxheWVyLmludGVyYWN0aW9uU3RhcnQoZil9b25EcmFnWm9vbUVuZChmKXt0aGlzLmRyYWdab29tTGF5ZXIuaW50ZXJhY3Rpb25FbmQoZil9fQphLlBhblpvb21EcmFnTGF5ZXI9ZH0pKGNwfHwoY3A9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0Mi90Zi1zY2FsZS5qcwooZnVuY3Rpb24oYSl7Y2xhc3MgYyBleHRlbmRzIFBsb3R0YWJsZS5RdWFudGl0YXRpdmVTY2FsZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7dGhpcy5faWdub3JlT3V0bGllcj0hMX1zZXRWYWx1ZVByb3ZpZGVyRm9yRG9tYWluKGQpe3RoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW49ZH1pZ25vcmVPdXRsaWVyKGQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGQ/KHRoaXMuX2lnbm9yZU91dGxpZXI9ZCx0aGlzKTp0aGlzLl9pZ25vcmVPdXRsaWVyfV9nZXRBbGxJbmNsdWRlZFZhbHVlcygpe2NvbnN0IGQ9dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbj90aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluKCk6W107cmV0dXJuIHRoaXMuZXh0ZW50T2ZWYWx1ZXMoZCl9fWEuVGZTY2FsZT1jfSkoY3B8fChjcD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL2xpbmVhci1zY2FsZS5qcwooZnVuY3Rpb24oYSl7Y2xhc3MgYyBleHRlbmRzIFBsb3R0YWJsZS5TY2FsZXMuTGluZWFye2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9pZ25vcmVPdXRsaWVyPSExO3RoaXMucGFkUHJvcG9ydGlvbiguMil9c2V0VmFsdWVQcm92aWRlckZvckRvbWFpbihkKXt0aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluPWR9X25pY2VEb21haW4oZCxmKXtjb25zdCBbZyxsXT1kLGs9bC1nO2Q9MD09PWs/MS4xKk1hdGguYWJzKGcpKzEuMTprKnRoaXMucGFkUHJvcG9ydGlvbigpO3JldHVybiBzdXBlci5fbmljZURvbWFpbihbMDw9ZyYmZzxrPy0uMSpsOmctZCxsK2RdLGYpfV9nZXRVbmJvdW5kZWRFeHRlbnQoZCl7ZD10aGlzLl9nZXRBbGxJbmNsdWRlZFZhbHVlcyhkKTtsZXQgZj10aGlzLl9kZWZhdWx0RXh0ZW50KCk7MCE9PWQubGVuZ3RoJiYoZD1bUGxvdHRhYmxlLlV0aWxzLk1hdGgubWluKGQsZlswXSksUGxvdHRhYmxlLlV0aWxzLk1hdGgubWF4KGQsZlsxXSldLGY9dGhpcy5fbmljZURvbWFpbihkKSk7CnJldHVybiBmfV9nZXRBbGxJbmNsdWRlZFZhbHVlcygpe2NvbnN0IGQ9dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbj90aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluKCk6W107cmV0dXJuIHRoaXMuZXh0ZW50T2ZWYWx1ZXMoZCl9ZXh0ZW50T2ZWYWx1ZXMoZCl7dmFyIGY9ZD1kLmZpbHRlcihnPT5QbG90dGFibGUuVXRpbHMuTWF0aC5pc1ZhbGlkTnVtYmVyKGcpKTtpZih0aGlzLmlnbm9yZU91dGxpZXIoKSl7Zj1kLnNvcnQoKGssbik9Pmstbik7Y29uc3QgZz1kMy5xdWFudGlsZShmLC4wNSksbD1kMy5xdWFudGlsZShmLC45NSk7Zj1kLmZpbHRlcihrPT5rPj1nJiZrPD1sKX1kPWQzLmV4dGVudChmKTtyZXR1cm4gbnVsbD09ZFswXXx8bnVsbD09ZFsxXT9bXTpkfWlnbm9yZU91dGxpZXIoZCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZD8odGhpcy5faWdub3JlT3V0bGllcj1kLHRoaXMpOnRoaXMuX2lnbm9yZU91dGxpZXJ9fWEuTGluZWFyU2NhbGU9Y30pKGNwfHwoY3A9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0Mi9sb2ctc2NhbGUuanMKKGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoZyl7cmV0dXJuIE1hdGgubG9nMTAoZyl9ZnVuY3Rpb24gZChnKXtyZXR1cm4gTWF0aC5wb3coMTAsZyl9YS5NSU5fUE9TSVRJVkVfVkFMVUU9TWF0aC5wb3coMiwtMTA3NCk7Y2xhc3MgZiBleHRlbmRzIGEuVGZTY2FsZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5fZDNMb2dTY2FsZT1kMy5zY2FsZUxvZygpO3RoaXMucGFkUHJvcG9ydGlvbiguMil9c2NhbGUoZyl7cmV0dXJuIDA+PWc/TmFOOnRoaXMuX2QzTG9nU2NhbGUoZyl9aW52ZXJ0KGcpe3JldHVybiB0aGlzLl9kM0xvZ1NjYWxlLmludmVydChnKX1zY2FsZVRyYW5zZm9ybWF0aW9uKGcpe3JldHVybiB0aGlzLnNjYWxlKGcpfWludmVydGVkVHJhbnNmb3JtYXRpb24oZyl7cmV0dXJuIHRoaXMuaW52ZXJ0KGcpfWdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCl7cmV0dXJuIHRoaXMuZG9tYWluKCl9X2dldERvbWFpbigpe3JldHVybiB0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWlufV9zZXREb21haW4oZyl7dGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbj0KZztjb25zdCBbbCxrXT1nO3N1cGVyLl9zZXREb21haW4oW01hdGgubWF4KGEuTUlOX1BPU0lUSVZFX1ZBTFVFLGwpLGtdKX1fbmljZURvbWFpbihnKXtjb25zdCBbbCxrXT1nO2c9TWF0aC5tYXgoYyhhLk1JTl9QT1NJVElWRV9WQUxVRSksYyhsKSk7Y29uc3Qgbj1jKGspO3ZhciBwPW4tZztwPXA/cCp0aGlzLnBhZFByb3BvcnRpb24oKToxO3JldHVybltkKE1hdGgubWF4KGMoYS5NSU5fUE9TSVRJVkVfVkFMVUUpLGctcCkpLGQobitwKV19X2dldFVuYm91bmRlZEV4dGVudChnKXtnPXRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKGcpO2xldCBsPXRoaXMuX2RlZmF1bHRFeHRlbnQoKTswIT09Zy5sZW5ndGgmJihnPVtQbG90dGFibGUuVXRpbHMuTWF0aC5taW4oZyxsWzBdKSxQbG90dGFibGUuVXRpbHMuTWF0aC5tYXgoZyxsWzFdKV0sbD10aGlzLl9uaWNlRG9tYWluKGcpKTtyZXR1cm4gbH1fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKXtyZXR1cm4gc3VwZXIuX2dldEFsbEluY2x1ZGVkVmFsdWVzKCkubWFwKGc9PgowPGc/ZzphLk1JTl9QT1NJVElWRV9WQUxVRSl9X2RlZmF1bHRFeHRlbnQoKXtyZXR1cm5bMSwxMF19X2JhY2tpbmdTY2FsZURvbWFpbihnKXtpZihudWxsPT1nKXJldHVybiB0aGlzLl9kM0xvZ1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzTG9nU2NhbGUuZG9tYWluKGcpO3JldHVybiB0aGlzfV9nZXRSYW5nZSgpe3JldHVybiB0aGlzLl9kM0xvZ1NjYWxlLnJhbmdlKCl9X3NldFJhbmdlKGcpe3RoaXMuX2QzTG9nU2NhbGUucmFuZ2UoZyl9ZGVmYXVsdFRpY2tzKCl7cmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUudGlja3MoKX10aWNrcygpe3JldHVybiB0aGlzLl9kM0xvZ1NjYWxlLnRpY2tzKCl9ZXh0ZW50T2ZWYWx1ZXMoZyl7bGV0IGw9Zz1nLmZpbHRlcihrPT5QbG90dGFibGUuVXRpbHMuTWF0aC5pc1ZhbGlkTnVtYmVyKGspJiYwPGspO2lmKHRoaXMuaWdub3JlT3V0bGllcigpKXtnPWcubWFwKGMpLnNvcnQoKHAscSk9PnAtcSk7Y29uc3Qgaz1kMy5xdWFudGlsZShnLC4wNSksbj1kMy5xdWFudGlsZShnLAouOTUpO2w9Zy5maWx0ZXIocD0+cD49ayYmcDw9bikubWFwKGQpfWc9ZDMuZXh0ZW50KGwpO3JldHVybiBudWxsPT1nWzBdfHxudWxsPT1nWzFdP1tdOmd9fWEuTG9nU2NhbGU9Zn0pKGNwfHwoY3A9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0Mi9saW5lLWNoYXJ0LmpzCihmdW5jdGlvbihhKXtsZXQgYzsoZnVuY3Rpb24oZyl7Z1tnLlRFWFQ9MF09IlRFWFQiO2dbZy5ET009MV09IkRPTSJ9KShjfHwoYz17fSkpO2xldCBkOyhmdW5jdGlvbihnKXtnLkxPRz0ibG9nIjtnLkxJTkVBUj0ibGluZWFyIn0pKGR8fChkPXt9KSk7Y2xhc3MgZntjb25zdHJ1Y3RvcihnLGwsayxuLHAscSxyLHQsdix5LHope3RoaXMuc2VyaWVzTmFtZXM9W107dGhpcy5uYW1lMmRhdGFzZXRzPXt9O3RoaXMuY29sb3JTY2FsZT1uO3RoaXMudG9vbHRpcD1wO3RoaXMuZGF0YXNldHM9W107dGhpcy5faWdub3JlWU91dGxpZXJzPSExO3RoaXMubGFzdFBvaW50c0RhdGFzZXQ9bmV3IFBsb3R0YWJsZS5EYXRhc2V0O3RoaXMubmFuRGF0YXNldD1uZXcgUGxvdHRhYmxlLkRhdGFzZXQ7dGhpcy55VmFsdWVBY2Nlc3Nvcj1sO3RoaXMuc3ltYm9sRnVuY3Rpb249eTt0aGlzLm9uRGF0YXNldENoYW5nZWQ9dGhpcy5fb25EYXRhc2V0Q2hhbmdlZC5iaW5kKHRoaXMpO3RoaXMuX2RlZmF1bHRYUmFuZ2U9CnQ7dGhpcy5fZGVmYXVsdFlSYW5nZT12O3RoaXMudG9vbHRpcENvbHVtbnM9cTt0aGlzLmJ1aWxkQ2hhcnQoZyxsLGsscix6KX1idWlsZENoYXJ0KGcsbCxrLG4scCl7dGhpcy5kZXN0cm95KCk7Zz1nKCk7dGhpcy54QWNjZXNzb3I9Zy5hY2Nlc3Nvcjt0aGlzLnhTY2FsZT1nLnNjYWxlO3RoaXMueEF4aXM9Zy5heGlzO3RoaXMueEF4aXMubWFyZ2luKDApLnRpY2tMYWJlbFBhZGRpbmcoMyk7cCYmdGhpcy54QXhpcy5mb3JtYXR0ZXIocCk7dGhpcy55U2NhbGU9Zi5nZXRZU2NhbGVGcm9tVHlwZShrKTt0aGlzLnlTY2FsZS5zZXRWYWx1ZVByb3ZpZGVyRm9yRG9tYWluKCgpPT50aGlzLmdldFZhbHVlc0ZvcllBeGlzRG9tYWluQ29tcHV0ZSgpKTt0aGlzLnlBeGlzPW5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKHRoaXMueVNjYWxlLCJsZWZ0Iik7cD0kby5tdWx0aXNjYWxlRm9ybWF0dGVyKCRvLllfQVhJU19GT1JNQVRURVJfUFJFQ0lTSU9OKTt0aGlzLnlBeGlzLm1hcmdpbigwKS50aWNrTGFiZWxQYWRkaW5nKDUpLmZvcm1hdHRlcihwKTsKdGhpcy55QXhpcy51c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbigpO3RoaXMuZmlsbEFyZWE9bjtwPW5ldyBhLlBhblpvb21EcmFnTGF5ZXIodGhpcy54U2NhbGUsdGhpcy55U2NhbGUsKCk9PnRoaXMucmVzZXREb21haW4oKSk7dGhpcy50b29sdGlwSW50ZXJhY3Rpb249dGhpcy5jcmVhdGVUb29sdGlwSW50ZXJhY3Rpb24ocCk7dGhpcy50b29sdGlwUG9pbnRzQ29tcG9uZW50PW5ldyBQbG90dGFibGUuQ29tcG9uZW50O249dGhpcy5idWlsZFBsb3QodGhpcy54U2NhbGUsdGhpcy55U2NhbGUsbik7dGhpcy5ncmlkbGluZXM9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyaWRsaW5lcyh0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSk7Zz1udWxsO2shPT1kLkxPRyYmKGc9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkd1aWRlTGluZUxheWVyKCJob3Jpem9udGFsIiksZy5zY2FsZSh0aGlzLnlTY2FsZSkudmFsdWUoMCkpO2s9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkd1aWRlTGluZUxheWVyKCJ2ZXJ0aWNhbCIpOwprLnNjYWxlKHRoaXMueFNjYWxlKS52YWx1ZSgwKTt0aGlzLmNlbnRlcj1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JvdXAoW3RoaXMuZ3JpZGxpbmVzLGcsayxuLHRoaXMudG9vbHRpcFBvaW50c0NvbXBvbmVudCxwXSk7dGhpcy5jZW50ZXIuYWRkQ2xhc3MoIm1haW4iKTt0aGlzLm91dGVyPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5UYWJsZShbW3RoaXMueUF4aXMsdGhpcy5jZW50ZXJdLFtudWxsLHRoaXMueEF4aXNdXSl9YnVpbGRQbG90KGcsbCxrKXtrJiYodGhpcy5tYXJnaW5BcmVhUGxvdD1uZXcgUGxvdHRhYmxlLlBsb3RzLkFyZWEsdGhpcy5tYXJnaW5BcmVhUGxvdC54KHRoaXMueEFjY2Vzc29yLGcpLHRoaXMubWFyZ2luQXJlYVBsb3QueShrLmhpZ2hlckFjY2Vzc29yLGwpLHRoaXMubWFyZ2luQXJlYVBsb3QueTAoay5sb3dlckFjY2Vzc29yKSx0aGlzLm1hcmdpbkFyZWFQbG90LmF0dHIoImZpbGwiLChyLHQsdik9PnRoaXMuY29sb3JTY2FsZS5zY2FsZSh2Lm1ldGFkYXRhKCkubmFtZSkpLAp0aGlzLm1hcmdpbkFyZWFQbG90LmF0dHIoImZpbGwtb3BhY2l0eSIsLjMpLHRoaXMubWFyZ2luQXJlYVBsb3QuYXR0cigic3Ryb2tlLXdpZHRoIiwwKSk7dGhpcy5zbW9vdGhlZEFjY2Vzc29yPXI9PnIuc21vb3RoZWQ7az1uZXcgUGxvdHRhYmxlLlBsb3RzLkxpbmU7ay54KHRoaXMueEFjY2Vzc29yLGcpO2sueSh0aGlzLnlWYWx1ZUFjY2Vzc29yLGwpO2suYXR0cigic3Ryb2tlIiwocix0LHYpPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUodi5tZXRhZGF0YSgpLm5hbWUpKTt0aGlzLmxpbmVQbG90PWs7dGhpcy5zZXR1cFRvb2x0aXBzKGspO2xldCBuPW5ldyBQbG90dGFibGUuUGxvdHMuTGluZTtuLngodGhpcy54QWNjZXNzb3IsZyk7bi55KHRoaXMuc21vb3RoZWRBY2Nlc3NvcixsKTtuLmF0dHIoInN0cm9rZSIsKHIsdCx2KT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHYubWV0YWRhdGEoKS5uYW1lKSk7dGhpcy5zbW9vdGhMaW5lUGxvdD1uO2lmKHRoaXMuc3ltYm9sRnVuY3Rpb24pe3ZhciBwPQpuZXcgUGxvdHRhYmxlLlBsb3RzLlNjYXR0ZXI7cC54KHRoaXMueEFjY2Vzc29yLGcpO3AueSh0aGlzLnlWYWx1ZUFjY2Vzc29yLGwpO3AuYXR0cigiZmlsbCIsKHIsdCx2KT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHYubWV0YWRhdGEoKS5uYW1lKSk7cC5hdHRyKCJvcGFjaXR5IiwxKTtwLnNpemUoMiokby5UT09MVElQX0NJUkNMRV9TSVpFKTtwLnN5bWJvbCgocix0LHYpPT50aGlzLnN5bWJvbEZ1bmN0aW9uKHYubWV0YWRhdGEoKS5uYW1lKSk7dGhpcy5tYXJrZXJzU2NhdHRlclBsb3Q9cH1wPW5ldyBQbG90dGFibGUuUGxvdHMuU2NhdHRlcjtwLngodGhpcy54QWNjZXNzb3IsZyk7cC55KHRoaXMueVZhbHVlQWNjZXNzb3IsbCk7cC5hdHRyKCJmaWxsIixyPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUoci5uYW1lKSk7cC5hdHRyKCJvcGFjaXR5IiwxKTtwLnNpemUoMiokby5UT09MVElQX0NJUkNMRV9TSVpFKTtwLmRhdGFzZXRzKFt0aGlzLmxhc3RQb2ludHNEYXRhc2V0XSk7dGhpcy5zY2F0dGVyUGxvdD0KcDtsZXQgcT1uZXcgUGxvdHRhYmxlLlBsb3RzLlNjYXR0ZXI7cS54KHRoaXMueEFjY2Vzc29yLGcpO3EueShyPT5yLmRpc3BsYXlZLGwpO3EuYXR0cigiZmlsbCIscj0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHIubmFtZSkpO3EuYXR0cigib3BhY2l0eSIsMSk7cS5zaXplKDIqJG8uTkFOX1NZTUJPTF9TSVpFKTtxLmRhdGFzZXRzKFt0aGlzLm5hbkRhdGFzZXRdKTtxLnN5bWJvbChQbG90dGFibGUuU3ltYm9sRmFjdG9yaWVzLnRyaWFuZ2xlKTt0aGlzLm5hbkRpc3BsYXk9cTtnPVtxLHAsbixrXTt0aGlzLm1hcmdpbkFyZWFQbG90JiZnLnB1c2godGhpcy5tYXJnaW5BcmVhUGxvdCk7dGhpcy5tYXJrZXJzU2NhdHRlclBsb3QmJmcucHVzaCh0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdCk7cmV0dXJuIG5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5Hcm91cChnKX1fb25EYXRhc2V0Q2hhbmdlZChnKXt0aGlzLnNtb290aGluZ0VuYWJsZWQmJnRoaXMucmVzbW9vdGhEYXRhc2V0KGcpO3RoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCl9aWdub3JlWU91dGxpZXJzKGcpe2chPT0KdGhpcy5faWdub3JlWU91dGxpZXJzJiYodGhpcy5faWdub3JlWU91dGxpZXJzPWcsdGhpcy51cGRhdGVTcGVjaWFsRGF0YXNldHMoKSx0aGlzLnlTY2FsZS5pZ25vcmVPdXRsaWVyKGcpLHRoaXMucmVzZXRZRG9tYWluKCkpfWdldFZhbHVlc0ZvcllBeGlzRG9tYWluQ29tcHV0ZSgpe2NvbnN0IGc9dGhpcy5nZXRBY2Nlc3NvcnNGb3JDb21wdXRpbmdZUmFuZ2UoKTtyZXR1cm4gXy5mbGF0dGVuRGVlcCh0aGlzLmRhdGFzZXRzLm1hcChsPT5nLm1hcChrPT5sLmRhdGEoKS5tYXAobj0+ayhuLC0xLGwpKSkpKS5maWx0ZXIoaXNGaW5pdGUpfXVwZGF0ZVNwZWNpYWxEYXRhc2V0cygpe2NvbnN0IGc9dGhpcy5nZXRZQXhpc0FjY2Vzc29yKCk7dmFyIGw9dGhpcy5kYXRhc2V0cy5tYXAoaz0+e2xldCBuPW51bGwscD1rLmRhdGEoKS5maWx0ZXIocT0+IWlzTmFOKGcocSwtMSxrKSkpOzA8cC5sZW5ndGgmJihuPXBbcC5sZW5ndGgtMV0sbi5uYW1lPWsubWV0YWRhdGEoKS5uYW1lLG4ucmVsYXRpdmU9CiRvLnJlbGF0aXZlQWNjZXNzb3IobiwtMSxrKSk7cmV0dXJuIG59KS5maWx0ZXIoaz0+bnVsbCE9ayk7dGhpcy5sYXN0UG9pbnRzRGF0YXNldC5kYXRhKGwpO3RoaXMubWFya2Vyc1NjYXR0ZXJQbG90JiZ0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzLm1hcCh0aGlzLmNyZWF0ZVNhbXBsZWREYXRhc2V0Rm9yTWFya2VycykpO2w9Xy5mbGF0dGVuKHRoaXMuZGF0YXNldHMubWFwKGs9PntsZXQgbj1udWxsLHA9ay5kYXRhKCkscT0wO2Zvcig7cTxwLmxlbmd0aCYmbnVsbD09bjspaXNOYU4oZyhwW3FdLC0xLGspKXx8KG49ZyhwW3FdLC0xLGspKSxxKys7bnVsbD09biYmKG49MCk7bGV0IHI9W107Zm9yKHE9MDtxPHAubGVuZ3RoO3ErKylpc05hTihnKHBbcV0sLTEsaykpPyhwW3FdLm5hbWU9ay5tZXRhZGF0YSgpLm5hbWUscFtxXS5kaXNwbGF5WT1uLHBbcV0ucmVsYXRpdmU9JG8ucmVsYXRpdmVBY2Nlc3NvcihwW3FdLC0xLGspLHIucHVzaChwW3FdKSk6Cm49ZyhwW3FdLC0xLGspO3JldHVybiByfSkpO3RoaXMubmFuRGF0YXNldC5kYXRhKGwpfXJlc2V0RG9tYWluKCl7dGhpcy5yZXNldFhEb21haW4oKTt0aGlzLnJlc2V0WURvbWFpbigpfXJlc2V0WERvbWFpbigpe2lmKG51bGwhPXRoaXMuX2RlZmF1bHRYUmFuZ2UpdmFyIGc9dGhpcy5fZGVmYXVsdFhSYW5nZTtlbHNlIGc9dGhpcy54U2NhbGUsZy5fZG9tYWluTWluPW51bGwsZy5fZG9tYWluTWF4PW51bGwsZz1nLl9nZXRFeHRlbnQoKTt0aGlzLnhTY2FsZS5kb21haW4oZyl9cmVzZXRZRG9tYWluKCl7bnVsbCE9dGhpcy5fZGVmYXVsdFlSYW5nZT90aGlzLnlTY2FsZS5kb21haW4odGhpcy5fZGVmYXVsdFlSYW5nZSk6KHRoaXMueVNjYWxlLmF1dG9Eb21haW4oKSx0aGlzLnlTY2FsZS5kb21haW4odGhpcy55U2NhbGUuZG9tYWluKCkpKX1nZXRBY2Nlc3NvcnNGb3JDb21wdXRpbmdZUmFuZ2UoKXtjb25zdCBnPVt0aGlzLmdldFlBeGlzQWNjZXNzb3IoKV07dGhpcy5maWxsQXJlYSYmZy5wdXNoKHRoaXMuZmlsbEFyZWEubG93ZXJBY2Nlc3NvciwKdGhpcy5maWxsQXJlYS5oaWdoZXJBY2Nlc3Nvcik7cmV0dXJuIGd9Z2V0WUF4aXNBY2Nlc3Nvcigpe3JldHVybiB0aGlzLnNtb290aGluZ0VuYWJsZWQ/dGhpcy5zbW9vdGhlZEFjY2Vzc29yOnRoaXMueVZhbHVlQWNjZXNzb3J9Y3JlYXRlVG9vbHRpcEludGVyYWN0aW9uKGcpe2NvbnN0IGw9bmV3ICRvLlBvaW50ZXJJbnRlcmFjdGlvbixrPSgpPT57bC5lbmFibGVkKCExKTt0aGlzLmhpZGVUb29sdGlwcygpfSxuPSgpPT5sLmVuYWJsZWQoITApO2cub25QYW5TdGFydChrKTtnLm9uRHJhZ1pvb21TdGFydChrKTtnLm9uUGFuRW5kKG4pO2cub25EcmFnWm9vbUVuZChuKTtnLm9uU2Nyb2xsWm9vbSgoKT0+dGhpcy51cGRhdGVUb29sdGlwQ29udGVudCh0aGlzLl9sYXN0TW91c2VQb3NpdGlvbikpO2wub25Qb2ludGVyTW92ZShwPT57dGhpcy5fbGFzdE1vdXNlUG9zaXRpb249cDt0aGlzLnVwZGF0ZVRvb2x0aXBDb250ZW50KHApfSk7bC5vblBvaW50ZXJFeGl0KCgpPT50aGlzLmhpZGVUb29sdGlwcygpKTsKcmV0dXJuIGx9dXBkYXRlVG9vbHRpcENvbnRlbnQoZyl7dGhpcy5saW5lUGxvdCYmKHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl90b29sdGlwVXBkYXRlQW5pbWF0aW9uRnJhbWUpLHRoaXMuX3Rvb2x0aXBVcGRhdGVBbmltYXRpb25GcmFtZT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57bGV0IGw9e3g6Zy54LHk6Zy55LGRhdHVtOm51bGwsZGF0YXNldDpudWxsfSxrPXRoaXMuZ3JpZGxpbmVzLmNvbnRlbnQoKS5ub2RlKCkuZ2V0QkJveCgpO3ZhciBuPXRoaXMubGluZVBsb3QuZGF0YXNldHMoKS5tYXAodD0+dGhpcy5maW5kQ2xvc2VzdFBvaW50KGwsdCkpLmZpbHRlcihCb29sZWFuKTtsZXQgcD1QbG90dGFibGUuVXRpbHMuRE9NLmludGVyc2VjdHNCQm94LHE9bi5maWx0ZXIodD0+cCh0LngsdC55LGspfHxpc05hTih0aGlzLnlWYWx1ZUFjY2Vzc29yKHQuZGF0dW0sMCx0LmRhdGFzZXQpKSkscj1xLmZpbHRlcih0PT4haXNOYU4odGhpcy55VmFsdWVBY2Nlc3Nvcih0LmRhdHVtLAowLHQuZGF0YXNldCkpKTswIT09bi5sZW5ndGg/KHRoaXMuc2NhdHRlclBsb3QuYXR0cigiZGlzcGxheSIsIm5vbmUiKSxuPXRoaXMudG9vbHRpcFBvaW50c0NvbXBvbmVudC5jb250ZW50KCkuc2VsZWN0QWxsKCIucG9pbnQiKS5kYXRhKHIsdD0+dC5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSksbi5lbnRlcigpLmFwcGVuZCgiY2lyY2xlIikuY2xhc3NlZCgicG9pbnQiLCEwKSxuLmF0dHIoInIiLCRvLlRPT0xUSVBfQ0lSQ0xFX1NJWkUpLmF0dHIoImN4Iix0PT50LngpLmF0dHIoImN5Iix0PT50LnkpLnN0eWxlKCJzdHJva2UiLCJub25lIikuYXR0cigiZmlsbCIsdD0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHQuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUpKSxuLmV4aXQoKS5yZW1vdmUoKSx0aGlzLmRyYXdUb29sdGlwcyhxLGwsdGhpcy50b29sdGlwQ29sdW1ucykpOnRoaXMuaGlkZVRvb2x0aXBzKCl9KSl9aGlkZVRvb2x0aXBzKCl7d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3Rvb2x0aXBVcGRhdGVBbmltYXRpb25GcmFtZSk7CnRoaXMudG9vbHRpcC5oaWRlKCk7dGhpcy5zY2F0dGVyUGxvdC5hdHRyKCJkaXNwbGF5IiwiYmxvY2siKTt0aGlzLnRvb2x0aXBQb2ludHNDb21wb25lbnQuY29udGVudCgpLnNlbGVjdEFsbCgiLnBvaW50IikucmVtb3ZlKCl9c2V0dXBUb29sdGlwcyhnKXtnLm9uRGV0YWNoKCgpPT57dGhpcy50b29sdGlwSW50ZXJhY3Rpb24uZGV0YWNoRnJvbSgpO3RoaXMudG9vbHRpcEludGVyYWN0aW9uLmVuYWJsZWQoITEpfSk7Zy5vbkFuY2hvcigoKT0+e3RoaXMudG9vbHRpcEludGVyYWN0aW9uLmF0dGFjaFRvKGcpO3RoaXMudG9vbHRpcEludGVyYWN0aW9uLmVuYWJsZWQoITApfSl9ZHJhd1Rvb2x0aXBzKGcsbCxrKXtpZihnLmxlbmd0aCl7dmFyIHtjb2xvclNjYWxlOm59PXRoaXM7az1be3RpdGxlOiIiLHN0YXRpYzohMSxldmFsVHlwZTpjLkRPTSxldmFsdWF0ZSh6KXtkMy5zZWxlY3QodGhpcykuc2VsZWN0KCJzcGFuIikuc3R5bGUoImJhY2tncm91bmQtY29sb3IiLCgpPT5uLnNjYWxlKHouZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUpKTsKcmV0dXJuIiJ9LGVudGVyKHope2QzLnNlbGVjdCh0aGlzKS5hcHBlbmQoInNwYW4iKS5jbGFzc2VkKCJzd2F0Y2giLCEwKS5zdHlsZSgiYmFja2dyb3VuZC1jb2xvciIsKCk9Pm4uc2NhbGUoei5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSkpfX0sLi4ua107dmFyIHA9ej0+TWF0aC5wb3coei54LWwueCwyKStNYXRoLnBvdyh6LnktbC55LDIpLHE9Xy5taW4oZy5tYXAocCkpLHI9dGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuc21vb3RoZWRBY2Nlc3Nvcjp0aGlzLnlWYWx1ZUFjY2Vzc29yO2c9ImFzY2VuZGluZyI9PT10aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kP18uc29ydEJ5KGcsej0+cih6LmRhdHVtLC0xLHouZGF0YXNldCkpOiJkZXNjZW5kaW5nIj09PXRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2Q/Xy5zb3J0QnkoZyx6PT5yKHouZGF0dW0sLTEsei5kYXRhc2V0KSkucmV2ZXJzZSgpOiJuZWFyZXN0Ij09PXRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2Q/Xy5zb3J0QnkoZyxwKTpnLnNsaWNlKDApLnJldmVyc2UoKTsKdmFyIHQ9dGhpcyx2PWQzLnNlbGVjdCh0aGlzLnRvb2x0aXAuY29udGVudCgpKS5zZWxlY3QoInRhYmxlIikseT12LnNlbGVjdCgidGhlYWQiKS5zZWxlY3RBbGwoInRoIikuZGF0YShrLHo9PnoudGl0bGUpO3kuZW50ZXIoKS5hcHBlbmQoInRoIikudGV4dCh6PT56LnRpdGxlKS5ub2RlcygpO3kuZXhpdCgpLnJlbW92ZSgpO2c9di5zZWxlY3QoInRib2R5Iikuc2VsZWN0QWxsKCJ0ciIpLmRhdGEoZyx6PT56LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKTtnLmNsYXNzZWQoImRpc3RhbnQiLHo9Pnt2YXIgeD16LmRhdGFzZXQuZGF0YSgpWzBdLEM9Xy5sYXN0KHouZGF0YXNldC5kYXRhKCkpO3g9dGhpcy54U2NhbGUuc2NhbGUodGhpcy54QWNjZXNzb3IoeCwwLHouZGF0YXNldCkpO0M9dGhpcy54U2NhbGUuc2NhbGUodGhpcy54QWNjZXNzb3IoQywwLHouZGF0YXNldCkpO3o9dGhpcy5zbW9vdGhpbmdFbmFibGVkP3ouZGF0dW0uc21vb3RoZWQ6dGhpcy55VmFsdWVBY2Nlc3Nvcih6LmRhdHVtLAowLHouZGF0YXNldCk7cmV0dXJuIGwueDx4fHxsLng+Q3x8aXNOYU4oeil9KS5jbGFzc2VkKCJjbG9zZXN0Iix6PT5wKHopPT09cSkuZWFjaChmdW5jdGlvbih6KXt0LmRyYXdUb29sdGlwUm93KHRoaXMsayx6KX0pLm9yZGVyKCk7Zy5leGl0KCkucmVtb3ZlKCk7Zy5lbnRlcigpLmFwcGVuZCgidHIiKS5lYWNoKGZ1bmN0aW9uKHope3QuZHJhd1Rvb2x0aXBSb3codGhpcyxrLHopfSkubm9kZXMoKTt0aGlzLnRvb2x0aXAudXBkYXRlQW5kUG9zaXRpb24odGhpcy50YXJnZXRTVkcubm9kZSgpKX1lbHNlIHRoaXMudG9vbHRpcC5oaWRlKCl9ZHJhd1Rvb2x0aXBSb3coZyxsLGspe2NvbnN0IG49dGhpcztnPWQzLnNlbGVjdChnKS5zZWxlY3RBbGwoInRkIikuZGF0YShsKTtnLmVhY2goZnVuY3Rpb24ocCl7cC5zdGF0aWN8fG4uZHJhd1Rvb2x0aXBDb2x1bW4uY2FsbChuLHRoaXMscCxrKX0pO2cuZW50ZXIoKS5hcHBlbmQoInRkIikuZWFjaChmdW5jdGlvbihwKXtwLmVudGVyJiZwLmVudGVyLmNhbGwodGhpcywKayk7bi5kcmF3VG9vbHRpcENvbHVtbi5jYWxsKG4sdGhpcyxwLGspfSl9ZHJhd1Rvb2x0aXBDb2x1bW4oZyxsLGspe2NvbnN0IHtzbW9vdGhpbmdFbmFibGVkOm59PXRoaXM7bC5ldmFsVHlwZT09Yy5ET00/bC5ldmFsdWF0ZS5jYWxsKGcsayx7c21vb3RoaW5nRW5hYmxlZDpufSk6ZDMuc2VsZWN0KGcpLnRleHQobC5ldmFsdWF0ZS5jYWxsKGcsayx7c21vb3RoaW5nRW5hYmxlZDpufSkpfWZpbmRDbG9zZXN0UG9pbnQoZyxsKXtjb25zdCBrPWwuZGF0YSgpLm1hcCgocSxyKT0+dGhpcy54U2NhbGUuc2NhbGUodGhpcy54QWNjZXNzb3IocSxyLGwpKSk7bGV0IG49Xy5zb3J0ZWRJbmRleChrLGcueCk7aWYoMD09ay5sZW5ndGgpcmV0dXJuIG51bGw7bj09PWsubGVuZ3RoPy0tbjowIT09biYmKG49TWF0aC5hYnMoa1tuLTFdLWcueCk8TWF0aC5hYnMoa1tuXS1nLngpP24tMTpuKTtnPWwuZGF0YSgpW25dO2NvbnN0IHA9dGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuc21vb3RoZWRBY2Nlc3NvcihnLApuLGwpOnRoaXMueVZhbHVlQWNjZXNzb3IoZyxuLGwpO3JldHVybnt4Omtbbl0seTp0aGlzLnlTY2FsZS5zY2FsZShwKSxkYXR1bTpnLGRhdGFzZXQ6bH19cmVzbW9vdGhEYXRhc2V0KGcpe2xldCBsPWcuZGF0YSgpO2NvbnN0IGs9dGhpcy5zbW9vdGhpbmdXZWlnaHQ7bGV0IG49MDxsLmxlbmd0aD8wOk5hTixwPTA7Y29uc3QgcT1sLm1hcCgodCx2KT0+dGhpcy55VmFsdWVBY2Nlc3Nvcih0LHYsZykpLHI9cS5ldmVyeSh0PT50PT1xWzBdKTtsLmZvckVhY2goKHQsdik9Pnt2PXFbdl07cnx8IU51bWJlci5pc0Zpbml0ZSh2KT90LnNtb290aGVkPXY6KG49biprKygxLWspKnYscCsrLHY9MSwxIT09ayYmKHY9MS1NYXRoLnBvdyhrLHApKSx0LnNtb290aGVkPW4vdil9KX1nZXREYXRhc2V0KGcpe3ZvaWQgMD09PXRoaXMubmFtZTJkYXRhc2V0c1tnXSYmKHRoaXMubmFtZTJkYXRhc2V0c1tnXT1uZXcgUGxvdHRhYmxlLkRhdGFzZXQoW10se25hbWU6ZyxtZXRhOm51bGx9KSk7cmV0dXJuIHRoaXMubmFtZTJkYXRhc2V0c1tnXX1zdGF0aWMgZ2V0WVNjYWxlRnJvbVR5cGUoZyl7aWYoZz09PQpkLkxPRylyZXR1cm4gbmV3IGEuTG9nU2NhbGU7aWYoZz09PWQuTElORUFSKXJldHVybiBuZXcgYS5MaW5lYXJTY2FsZTt0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIHlTY2FsZSB0eXBlICIrZyk7fXNldFZpc2libGVTZXJpZXMoZyl7dGhpcy5zZXJpZXNOYW1lcz1nPWcuc29ydCgpO2cucmV2ZXJzZSgpO3RoaXMuZGF0YXNldHMuZm9yRWFjaChsPT5sLm9mZlVwZGF0ZSh0aGlzLm9uRGF0YXNldENoYW5nZWQpKTt0aGlzLmRhdGFzZXRzPWcubWFwKGw9PnRoaXMuZ2V0RGF0YXNldChsKSk7dGhpcy5kYXRhc2V0cy5mb3JFYWNoKGw9Pmwub25VcGRhdGUodGhpcy5vbkRhdGFzZXRDaGFuZ2VkKSk7dGhpcy5saW5lUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKTt0aGlzLnNtb290aGluZ0VuYWJsZWQmJnRoaXMuc21vb3RoTGluZVBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cyk7dGhpcy5tYXJnaW5BcmVhUGxvdCYmdGhpcy5tYXJnaW5BcmVhUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKTsKdGhpcy51cGRhdGVTcGVjaWFsRGF0YXNldHMoKX1jcmVhdGVTYW1wbGVkRGF0YXNldEZvck1hcmtlcnMoZyl7Y29uc3QgbD1nLmRhdGEoKTtpZigyMD49bC5sZW5ndGgpcmV0dXJuIGc7Y29uc3Qgaz1NYXRoLmNlaWwobC5sZW5ndGgvMjApLG49QXJyYXkoTWF0aC5mbG9vcihsLmxlbmd0aC9rKSk7Zm9yKGxldCBwPTAscT0wO3A8bi5sZW5ndGg7cCsrLHErPWspbltwXT1sW3FdO3JldHVybiBuZXcgUGxvdHRhYmxlLkRhdGFzZXQobixnLm1ldGFkYXRhKCkpfXNldFNlcmllc0RhdGEoZyxsKXt0aGlzLmdldERhdGFzZXQoZykuZGF0YShsKTt0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKX1zZXRTZXJpZXNNZXRhZGF0YShnLGwpe2w9T2JqZWN0LmFzc2lnbih7fSx0aGlzLmdldERhdGFzZXQoZykubWV0YWRhdGEoKSx7bWV0YTpsfSk7dGhpcy5nZXREYXRhc2V0KGcpLm1ldGFkYXRhKGwpfXNtb290aGluZ1VwZGF0ZShnKXt0aGlzLnNtb290aGluZ1dlaWdodD0KZzt0aGlzLmRhdGFzZXRzLmZvckVhY2gobD0+dGhpcy5yZXNtb290aERhdGFzZXQobCkpO3RoaXMuc21vb3RoaW5nRW5hYmxlZHx8KHRoaXMubGluZVBsb3QuYWRkQ2xhc3MoImdob3N0IiksdGhpcy5zY2F0dGVyUGxvdC55KHRoaXMuc21vb3RoZWRBY2Nlc3Nvcix0aGlzLnlTY2FsZSksdGhpcy5zbW9vdGhpbmdFbmFibGVkPSEwLHRoaXMuc21vb3RoTGluZVBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cykpO3RoaXMubWFya2Vyc1NjYXR0ZXJQbG90JiZ0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdC55KHRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpLHRoaXMueVNjYWxlKTt0aGlzLnVwZGF0ZVNwZWNpYWxEYXRhc2V0cygpfXNtb290aGluZ0Rpc2FibGUoKXt0aGlzLnNtb290aGluZ0VuYWJsZWQmJih0aGlzLmxpbmVQbG90LnJlbW92ZUNsYXNzKCJnaG9zdCIpLHRoaXMuc2NhdHRlclBsb3QueSh0aGlzLnlWYWx1ZUFjY2Vzc29yLHRoaXMueVNjYWxlKSx0aGlzLnNtb290aExpbmVQbG90LmRhdGFzZXRzKFtdKSwKdGhpcy5zbW9vdGhpbmdFbmFibGVkPSExLHRoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCkpO3RoaXMubWFya2Vyc1NjYXR0ZXJQbG90JiZ0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdC55KHRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpLHRoaXMueVNjYWxlKX1zZXRUb29sdGlwU29ydGluZ01ldGhvZChnKXt0aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kPWd9cmVuZGVyVG8oZyl7dGhpcy50YXJnZXRTVkc9Zzt0aGlzLm91dGVyLnJlbmRlclRvKGcpO251bGwhPXRoaXMuX2RlZmF1bHRYUmFuZ2UmJnRoaXMucmVzZXRYRG9tYWluKCk7bnVsbCE9dGhpcy5fZGVmYXVsdFlSYW5nZSYmdGhpcy5yZXNldFlEb21haW4oKTt0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKX1yZWRyYXcoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVkcmF3UmFmKTt0aGlzLl9yZWRyYXdSYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMubWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXQoKTsKdGhpcy5vdXRlci5yZWRyYXcoKX0pfW1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5faW52YWxpZGF0ZUxheW91dFJhZik7dGhpcy5faW52YWxpZGF0ZUxheW91dFJhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5tZWFzdXJlQkJveEFuZE1heWJlSW52YWxpZGF0ZUxheW91dCgpfSl9bWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXQoKXtpZih0aGlzLl9sYXN0RHJhd0JCb3gpe2NvbnN0IHt3aWR0aDpnfT10aGlzLl9sYXN0RHJhd0JCb3gse3dpZHRoOmx9PXRoaXMudGFyZ2V0U1ZHLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTswPT1nJiZnPGwmJnRoaXMub3V0ZXIuaW52YWxpZGF0ZUNhY2hlKCl9dGhpcy5fbGFzdERyYXdCQm94PXRoaXMudGFyZ2V0U1ZHLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1kZXN0cm95KCl7d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlZHJhd1JhZik7CndpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9pbnZhbGlkYXRlTGF5b3V0UmFmKTt0aGlzLm91dGVyJiZ0aGlzLm91dGVyLmRlc3Ryb3koKX1vbkFuY2hvcihnKXtpZih0aGlzLm91dGVyKXRoaXMub3V0ZXIub25BbmNob3IoZyl9fWEuTGluZUNoYXJ0PWZ9KShjcHx8KGNwPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydDIvdnotbGluZS1jaGFydDIuanMKKGZ1bmN0aW9uKGEpe2NvbnN0IGM9JG8ubXVsdGlzY2FsZUZvcm1hdHRlcigkby5ZX1RPT0xUSVBfRk9STUFUVEVSX1BSRUNJU0lPTiksZD1mPT5pc05hTihmKT8iTmFOIjpjKGYpO2EuREVGQVVMVF9UT09MVElQX0NPTFVNTlM9W3t0aXRsZToiTmFtZSIsZXZhbHVhdGU6Zj0+Zi5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZX0se3RpdGxlOiJTbW9vdGhlZCIsZXZhbHVhdGUoZixnKXsoe3Ntb290aGluZ0VuYWJsZWQ6Z309Zyk7cmV0dXJuIGQoZz9mLmRhdHVtLnNtb290aGVkOmYuZGF0dW0uc2NhbGFyKX19LHt0aXRsZToiVmFsdWUiLGV2YWx1YXRlOmY9PmQoZi5kYXR1bS5zY2FsYXIpfSx7dGl0bGU6IlN0ZXAiLGV2YWx1YXRlOmY9PiRvLnN0ZXBGb3JtYXR0ZXIoZi5kYXR1bS5zdGVwKX0se3RpdGxlOiJUaW1lIixldmFsdWF0ZTpmPT4kby50aW1lRm9ybWF0dGVyKGYuZGF0dW0ud2FsbF90aW1lKX0se3RpdGxlOiJSZWxhdGl2ZSIsZXZhbHVhdGU6Zj0+JG8ucmVsYXRpdmVGb3JtYXR0ZXIoJG8ucmVsYXRpdmVBY2Nlc3NvcihmLmRhdHVtLAotMSxmLmRhdGFzZXQpKX1dO1BvbHltZXIoe2lzOiJ2ei1saW5lLWNoYXJ0MiIscHJvcGVydGllczp7Y29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IFBsb3R0YWJsZS5TY2FsZXMuQ29sb3IpLnJhbmdlKGQzLnNjaGVtZUNhdGVnb3J5MTApfX0sc3ltYm9sRnVuY3Rpb246T2JqZWN0LHNtb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAsdmFsdWU6ITF9LHNtb290aGluZ1dlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6LjZ9LHhUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0seENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZDp7dHlwZTpPYmplY3QsdmFsdWU6IiJ9LHhBeGlzRm9ybWF0dGVyOk9iamVjdCx5VmFsdWVBY2Nlc3Nvcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9PmY9PmYuc2NhbGFyfSx0b29sdGlwQ29sdW1uczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+YS5ERUZBVUxUX1RPT0xUSVBfQ09MVU1OU30sZmlsbEFyZWE6T2JqZWN0LApkZWZhdWx0WFJhbmdlOkFycmF5LGRlZmF1bHRZUmFuZ2U6QXJyYXkseVNjYWxlVHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImxpbmVhciJ9LGlnbm9yZVlPdXRsaWVyczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx0b29sdGlwU29ydGluZ01ldGhvZDp7dHlwZTpTdHJpbmcsdmFsdWU6ImRlZmF1bHQifSx0b29sdGlwUG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOmFwLlRvb2x0aXBQb3NpdGlvbi5CT1RUT019LF9jaGFydDpPYmplY3QsX3Zpc2libGVTZXJpZXNDYWNoZTp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9zZXJpZXNEYXRhQ2FjaGU6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfc2VyaWVzTWV0YWRhdGFDYWNoZTp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ6e3R5cGU6TnVtYmVyLHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6WyJfbWFrZUNoYXJ0KHhDb21wb25lbnRzQ3JlYXRpb25NZXRob2QsIHhUeXBlLCB5VmFsdWVBY2Nlc3NvciwgeVNjYWxlVHlwZSwgdG9vbHRpcENvbHVtbnMsIGNvbG9yU2NhbGUsIGlzQXR0YWNoZWQpIiwKIl9yZWxvYWRGcm9tQ2FjaGUoX2NoYXJ0LCBfdmlzaWJsZVNlcmllc0NhY2hlKSIsIl9zbW9vdGhpbmdDaGFuZ2VkKHNtb290aGluZ0VuYWJsZWQsIHNtb290aGluZ1dlaWdodCwgX2NoYXJ0KSIsIl90b29sdGlwU29ydGluZ01ldGhvZENoYW5nZWQodG9vbHRpcFNvcnRpbmdNZXRob2QsIF9jaGFydCkiLCJfb3V0bGllcnNDaGFuZ2VkKGlnbm9yZVlPdXRsaWVycywgX2NoYXJ0KSJdLHJlYWR5KCl7dGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLmNoYXJ0ZGl2LCEwKX0sYXR0YWNoZWQoKXtjb25zdCBmPXtjYXB0dXJlOiEwLHBhc3NpdmU6ITB9O3RoaXMuX2xpc3Rlbih0aGlzLCJtb3VzZWRvd24iLHRoaXMuX29uTW91c2VEb3duLmJpbmQodGhpcyksZik7dGhpcy5fbGlzdGVuKHRoaXMsIm1vdXNldXAiLHRoaXMuX29uTW91c2VVcC5iaW5kKHRoaXMpLGYpO3RoaXMuX2xpc3Rlbih3aW5kb3csImtleWRvd24iLHRoaXMuX29uS2V5RG93bi5iaW5kKHRoaXMpLGYpO3RoaXMuX2xpc3Rlbih3aW5kb3csCiJrZXl1cCIsdGhpcy5fb25LZXlVcC5iaW5kKHRoaXMpLGYpfSxkZXRhY2hlZCgpe3RoaXMuY2FuY2VsQXN5bmModGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkKTt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuZGVzdHJveSgpO3RoaXMuX2xpc3RlbmVycyYmKHRoaXMuX2xpc3RlbmVycy5mb3JFYWNoKCh7bm9kZTpmLGV2ZW50TmFtZTpnLGZ1bmM6bCxvcHRpb246a30pPT57Zi5yZW1vdmVFdmVudExpc3RlbmVyKGcsbCxrKX0pLHRoaXMuX2xpc3RlbmVycy5jbGVhcigpKX0sX2xpc3RlbihmLGcsbCxrPXt9KXt0aGlzLl9saXN0ZW5lcnN8fCh0aGlzLl9saXN0ZW5lcnM9bmV3IFNldCk7dGhpcy5fbGlzdGVuZXJzLmFkZCh7bm9kZTpmLGV2ZW50TmFtZTpnLGZ1bmM6bCxvcHRpb246a30pO2YuYWRkRXZlbnRMaXN0ZW5lcihnLGwsayl9LF9vbktleURvd24oZil7dGhpcy50b2dnbGVDbGFzcygicGFua2V5IixhLlBhblpvb21EcmFnTGF5ZXIuaXNQYW5LZXkoZikpfSxfb25LZXlVcChmKXt0aGlzLnRvZ2dsZUNsYXNzKCJwYW5rZXkiLAphLlBhblpvb21EcmFnTGF5ZXIuaXNQYW5LZXkoZikpfSxfb25Nb3VzZURvd24oKXt0aGlzLnRvZ2dsZUNsYXNzKCJtb3VzZWRvd24iLCEwKX0sX29uTW91c2VVcCgpe3RoaXMudG9nZ2xlQ2xhc3MoIm1vdXNlZG93biIsITEpfSxzZXRWaXNpYmxlU2VyaWVzOmZ1bmN0aW9uKGYpe18uaXNFcXVhbCh0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUsZil8fCh0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGU9Zil9LHNldFNlcmllc0RhdGE6ZnVuY3Rpb24oZixnKXt0aGlzLl9zZXJpZXNEYXRhQ2FjaGVbZl09Zzt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuc2V0U2VyaWVzRGF0YShmLGcpfSxzZXRTZXJpZXNNZXRhZGF0YShmLGcpe3RoaXMuX3Nlcmllc01ldGFkYXRhQ2FjaGVbZl09Zzt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuc2V0U2VyaWVzTWV0YWRhdGEoZixnKX0scmVzZXREb21haW46ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQucmVzZXREb21haW4oKX0scmVkcmF3OmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJgp0aGlzLl9jaGFydC5yZWRyYXcoKX0sX21ha2VDaGFydDpmdW5jdGlvbihmLGcsbCxrLG4scCl7Z3x8Zj9nJiYoZj0oKT0+JG8uZ2V0WENvbXBvbmVudHMoZykpOmY9JG8uc3RlcFg7bnVsbCE9PXRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZCYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkKSx0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9bnVsbCk7dGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkPXRoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9bnVsbDtpZihmJiZ0aGlzLnlWYWx1ZUFjY2Vzc29yJiZ0aGlzLnRvb2x0aXBDb2x1bW5zKXt2YXIgcT1uZXcgYS5MaW5lQ2hhcnQoZix0aGlzLnlWYWx1ZUFjY2Vzc29yLGsscCx0aGlzLiQudG9vbHRpcCx0aGlzLnRvb2x0aXBDb2x1bW5zLHRoaXMuZmlsbEFyZWEsdGhpcy5kZWZhdWx0WFJhbmdlLHRoaXMuZGVmYXVsdFlSYW5nZSwKdGhpcy5zeW1ib2xGdW5jdGlvbix0aGlzLnhBeGlzRm9ybWF0dGVyKSxyPWQzLnNlbGVjdCh0aGlzLiQuY2hhcnRkaXYpO3EucmVuZGVyVG8ocik7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LmRlc3Ryb3koKTt0aGlzLl9jaGFydD1xO3RoaXMuX2NoYXJ0Lm9uQW5jaG9yKCgpPT50aGlzLmZpcmUoImNoYXJ0LWF0dGFjaGVkIikpfX0sMzUwKX0sX3JlbG9hZEZyb21DYWNoZTpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiYodGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlLmZvckVhY2goZj0+e3RoaXMuX2NoYXJ0LnNldFNlcmllc0RhdGEoZix0aGlzLl9zZXJpZXNEYXRhQ2FjaGVbZl18fFtdKX0pLHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZS5maWx0ZXIoZj0+dGhpcy5fc2VyaWVzTWV0YWRhdGFDYWNoZVtmXSkuZm9yRWFjaChmPT57dGhpcy5fY2hhcnQuc2V0U2VyaWVzTWV0YWRhdGEoZix0aGlzLl9zZXJpZXNNZXRhZGF0YUNhY2hlW2ZdKX0pLHRoaXMuX2NoYXJ0LnNldFZpc2libGVTZXJpZXModGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlKSl9LApfc21vb3RoaW5nQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiYodGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuX2NoYXJ0LnNtb290aGluZ1VwZGF0ZSh0aGlzLnNtb290aGluZ1dlaWdodCk6dGhpcy5fY2hhcnQuc21vb3RoaW5nRGlzYWJsZSgpKX0sX291dGxpZXJzQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5pZ25vcmVZT3V0bGllcnModGhpcy5pZ25vcmVZT3V0bGllcnMpfSxfdG9vbHRpcFNvcnRpbmdNZXRob2RDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnNldFRvb2x0aXBTb3J0aW5nTWV0aG9kKHRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2QpfSxnZXRFeHBvcnRlcigpe3JldHVybiBuZXcgYS5MaW5lQ2hhcnRFeHBvcnRlcih0aGlzLiQuY2hhcnRkaXYpfX0pfSkoY3B8fChjcD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL3Z6LWxpbmUtY2hhcnQyLmh0bWwuanMKUG9seW1lcih7aXM6InZ6LWxpbmUtY2hhcnQtdG9vbHRpcCJ9KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0Mi9saW5lLWNoYXJ0LWV4cG9ydGVyLmpzCihmdW5jdGlvbihhKXtsZXQgYzsoZnVuY3Rpb24oZyl7Zy5HUk9VUD0iRyI7Zy5ESVY9IkRJViI7Zy5TVkc9IlNWRyI7Zy5URVhUPSJURVhUIn0pKGN8fChjPXt9KSk7Y2xhc3MgZHtjb25zdHJ1Y3RvcihnKXt0aGlzLnVuaXF1ZUlkPTA7dGhpcy5yb290PWd9ZXhwb3J0QXNTdHJpbmcoKXtjb25zdCBnPXRoaXMuY29udmVydCh0aGlzLnJvb3QpO2lmKCFnKXJldHVybiIiO2NvbnN0IGw9dGhpcy5jcmVhdGVSb290U3ZnKCk7bC5hcHBlbmRDaGlsZChnKTtyZXR1cm4gbC5vdXRlckhUTUx9Y3JlYXRlVW5pcXVlSWQoKXtyZXR1cm5gJHsiY2xpcCJ9XyR7dGhpcy51bmlxdWVJZCsrfWB9Z2V0U2l6ZSgpe3JldHVybiB0aGlzLnJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y3JlYXRlUm9vdFN2Zygpe2NvbnN0IGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3ZnIiksbD10aGlzLmdldFNpemUoKTtnLnNldEF0dHJpYnV0ZU5TKCJzdmciLCJ2aWV3Qm94IixgMCAwICR7bC53aWR0aH0gJHtsLmhlaWdodH1gKTsKZy5zZXRBdHRyaWJ1dGUoInhtbG5zIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciKTtyZXR1cm4gZ31jb252ZXJ0KGcpe2xldCBsPW51bGw7dmFyIGs9Zy5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO2lmKGcubm9kZVR5cGUhPU5vZGUuRUxFTUVOVF9OT0RFfHxrIT1jLkRJViYmayE9Yy5TVkcpbD1nLmNsb25lTm9kZSgpO2Vsc2V7bD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGMuR1JPVVApO3ZhciBuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGcpLHA9cGFyc2VJbnQobi5sZWZ0LDEwKSxxPXBhcnNlSW50KG4udG9wLDEwKTtpZihwfHxxKWs9dGhpcy5jcmVhdGVVbmlxdWVJZCgpLGwuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLGB0cmFuc2xhdGUoJHtwfSwgJHtxfSlgKSxsLnNldEF0dHJpYnV0ZSgiY2xpcC1wYXRoIixgdXJsKCMke2t9KWApLHE9cGFyc2VJbnQobi5oZWlnaHQsMTApLHA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicmVjdCIpLHAuc2V0QXR0cmlidXRlKCJ3aWR0aCIsClN0cmluZyhwYXJzZUludChuLndpZHRoLDEwKSkpLHAuc2V0QXR0cmlidXRlKCJoZWlnaHQiLFN0cmluZyhxKSksbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoInN2ZyIsImNsaXBQYXRoIiksbi5pZD1rLG4uYXBwZW5kQ2hpbGQocCksbC5hcHBlbmRDaGlsZChuKX1BcnJheS5mcm9tKGcuY2hpbGROb2RlcykubWFwKHI9PnRoaXMuY29udmVydChyKSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2gocj0+bC5hcHBlbmRDaGlsZChyKSk7cmV0dXJuIGwubm9kZU5hbWUudG9VcHBlckNhc2UoKT09Yy5HUk9VUCYmIWwuaGFzQ2hpbGROb2RlcygpfHx0aGlzLnNob3VsZE9taXROb2RlKGcpP251bGw6dGhpcy5zdHJpcENsYXNzKHRoaXMudHJhbnNmZXJTdHlsZShnLGwpKX1zdHJpcENsYXNzKGcpe2cubm9kZVR5cGU9PU5vZGUuRUxFTUVOVF9OT0RFJiZnLnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKTtyZXR1cm4gZ310cmFuc2ZlclN0eWxlKGcsbCl7aWYobC5ub2RlVHlwZSE9Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIGw7CmNvbnN0IGs9bC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO2c9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZyk7az09Yy5URVhUJiZPYmplY3QuYXNzaWduKGwuc3R5bGUse2ZvbnRGYW1pbHk6Zy5mb250RmFtaWx5LGZvbnRTaXplOmcuZm9udFNpemUsZm9udFdlaWdodDpnLmZvbnRXZWlnaHR9KTtrIT1jLkdST1VQJiYobC5zZXRBdHRyaWJ1dGUoImZpbGwiLGcuZmlsbCksbC5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsZy5zdHJva2UpLGwuc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLGcuc3Ryb2tlV2lkdGgpKTsiMSIhPWcub3BhY2l0eSYmbC5zZXRBdHRyaWJ1dGUoIm9wYWNpdHkiLGcub3BhY2l0eSk7cmV0dXJuIGx9c2hvdWxkT21pdE5vZGUoKXtyZXR1cm4hMX19YS5QbG90dGFibGVFeHBvcnRlcj1kO2NsYXNzIGYgZXh0ZW5kcyBke3Nob3VsZE9taXROb2RlKGcpe3JldHVybiBnLm5vZGVUeXBlPT1Ob2RlLkVMRU1FTlRfTk9ERT9nLmNsYXNzTGlzdC5jb250YWlucygic2NhdHRlci1wbG90Iik6CiExfX1hLkxpbmVDaGFydEV4cG9ydGVyPWZ9KShjcHx8KGNwPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLmh0bWwuanMKKGZ1bmN0aW9uKCl7Y29uc3QgYT1bXSxjPWZ1bmN0aW9uKCl7cmV0dXJuIF8udGhyb3R0bGUoZnVuY3Rpb24gZigpe2lmKDAhPWEubGVuZ3RoKXt2YXIgZz1hLnNoaWZ0KCk7Zy5hY3RpdmUmJihnLnJlZHJhdygpLGcuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlPSExKTt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUoMCk7d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmKX19LDEwMCl9KCk7UG9seW1lcih7aXM6InRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiLHByb3BlcnRpZXM6e2FjdGl2ZTp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfZml4QmFkU3RhdGVXaGVuQWN0aXZlIn0sZGF0YVNlcmllczpBcnJheSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsbG9nU2NhbGVBY3RpdmU6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2xvZ1NjYWxlQ2hhbmdlZCJ9LHhDb21wb25lbnRzQ3JlYXRpb25NZXRob2Q6T2JqZWN0LHhUeXBlOlN0cmluZyx5VmFsdWVBY2Nlc3NvcjpPYmplY3QsZmlsbEFyZWE6T2JqZWN0LApzbW9vdGhpbmdFbmFibGVkOkJvb2xlYW4sc21vb3RoaW5nV2VpZ2h0Ok51bWJlcix0b29sdGlwQ29sdW1uczpBcnJheSx0b29sdGlwU29ydGluZ01ldGhvZDpTdHJpbmcsdG9vbHRpcFBvc2l0aW9uOlN0cmluZyxpZ25vcmVZT3V0bGllcnM6Qm9vbGVhbixkZWZhdWx0WFJhbmdlOkFycmF5LGRlZmF1bHRZUmFuZ2U6QXJyYXksc3ltYm9sRnVuY3Rpb246T2JqZWN0LGNvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe3NjYWxlOlhvLnJ1bnNDb2xvclNjYWxlfSl9LF9yZXNldERvbWFpbk9uTmV4dExvYWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfX0sYmVoYXZpb3JzOltVby5EYXRhTG9hZGVyQmVoYXZpb3JdLG9ic2VydmVyczpbIl9kYXRhU2VyaWVzQ2hhbmdlZChkYXRhU2VyaWVzLiopIiwiX2xvYWRLZXlDaGFuZ2VkKGxvYWRLZXkpIl0sb25Mb2FkRmluaXNoKCl7MDwKdGhpcy5kYXRhVG9Mb2FkLmxlbmd0aCYmdGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkJiYodGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkPSExLHRoaXMuJC5jaGFydC5yZXNldERvbWFpbigpKTt0aGlzLnJlZHJhdygpfSxkZXRhY2hlZCgpe2NhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlZHJhd1JhZil9LGV4cG9ydEFzU3ZnU3RyaW5nKCl7cmV0dXJuIHRoaXMuJC5jaGFydC5nZXRFeHBvcnRlcigpLmV4cG9ydEFzU3RyaW5nKCl9LHJlc2V0RG9tYWluKCl7dGhpcy4kLmNoYXJ0LnJlc2V0RG9tYWluKCl9LHNldFNlcmllc0RhdGEoZCxmKXt0aGlzLiQuY2hhcnQuc2V0U2VyaWVzRGF0YShkLGYpfSxzZXRTZXJpZXNNZXRhZGF0YShkLGYpe3RoaXMuJC5jaGFydC5zZXRTZXJpZXNNZXRhZGF0YShkLGYpfSxyZWRyYXcoKXtjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWRyYXdSYWYpO3RoaXMuX3JlZHJhd1JhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5hY3RpdmU/CnRoaXMuJC5jaGFydC5yZWRyYXcoKTp0aGlzLl9tYXliZVJlbmRlcmVkSW5CYWRTdGF0ZT0hMH0pfSxfbG9hZEtleUNoYW5nZWQoKXt0aGlzLnJlc2V0KCk7dGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkPSEwfSxfZGF0YVNlcmllc0NoYW5nZWQoKXt0aGlzLiQuY2hhcnQuc2V0VmlzaWJsZVNlcmllcyh0aGlzLmRhdGFTZXJpZXMpfSxfbG9nU2NhbGVDaGFuZ2VkKGQpe3RoaXMuJC5jaGFydC55U2NhbGVUeXBlPWQ/ImxvZyI6ImxpbmVhciI7dGhpcy5yZWRyYXcoKX0sX2ZpeEJhZFN0YXRlV2hlbkFjdGl2ZSgpe3RoaXMuYWN0aXZlJiZ0aGlzLl9tYXliZVJlbmRlcmVkSW5CYWRTdGF0ZSYmKGEucHVzaCh0aGlzKSxjKCkpfSxfb25DaGFydEF0dGFjaGVkKCl7dGhpcy5hY3RpdmV8fCh0aGlzLl9tYXliZVJlbmRlcmVkSW5CYWRTdGF0ZT0hMCl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWRpYWxvZy1zY3JvbGxhYmxlL3BhcGVyLWRpYWxvZy1zY3JvbGxhYmxlLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWRpYWxvZy1zY3JvbGxhYmxlIixwcm9wZXJ0aWVzOntkaWFsb2dFbGVtZW50Ont0eXBlOk9iamVjdH19LGdldCBzY3JvbGxUYXJnZXQoKXtyZXR1cm4gdGhpcy4kLnNjcm9sbGFibGV9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fZW5zdXJlVGFyZ2V0KCk7dGhpcy5jbGFzc0xpc3QuYWRkKCJuby1wYWRkaW5nIil9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fZW5zdXJlVGFyZ2V0KCk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMudXBkYXRlU2Nyb2xsU3RhdGUuYmluZCh0aGlzKSl9LHVwZGF0ZVNjcm9sbFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy50b2dnbGVDbGFzcygiaXMtc2Nyb2xsZWQiLDA8dGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsVG9wKTt0aGlzLnRvZ2dsZUNsYXNzKCJjYW4tc2Nyb2xsIix0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRIZWlnaHQ8dGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsSGVpZ2h0KTt0aGlzLnRvZ2dsZUNsYXNzKCJzY3JvbGxlZC10by1ib3R0b20iLAp0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3ArdGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0SGVpZ2h0Pj10aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxIZWlnaHQpfSxfZW5zdXJlVGFyZ2V0OmZ1bmN0aW9uKCl7KHRoaXMuZGlhbG9nRWxlbWVudD10aGlzLmRpYWxvZ0VsZW1lbnR8fHRoaXMucGFyZW50RWxlbWVudCkmJnRoaXMuZGlhbG9nRWxlbWVudC5iZWhhdmlvcnMmJjA8PXRoaXMuZGlhbG9nRWxlbWVudC5iZWhhdmlvcnMuaW5kZXhPZihQb2x5bWVyLlBhcGVyRGlhbG9nQmVoYXZpb3JJbXBsKT8odGhpcy5kaWFsb2dFbGVtZW50LnNpemluZ1RhcmdldD10aGlzLnNjcm9sbFRhcmdldCx0aGlzLnNjcm9sbFRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCJmaXQiKSk6dGhpcy5kaWFsb2dFbGVtZW50JiZ0aGlzLnNjcm9sbFRhcmdldC5jbGFzc0xpc3QuYWRkKCJmaXQiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1tYXJrZG93bi12aWV3L3RmLW1hcmtkb3duLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtbWFya2Rvd24tdmlldyIscHJvcGVydGllczp7aHRtbDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9fSxhdHRhY2hlZCgpe3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pnt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQubWFya2Rvd24sITApfSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY2FyZC1oZWFkaW5nL3V0aWwuanMKdmFyIGRwOyhmdW5jdGlvbihhKXtmdW5jdGlvbiBjKGQpe2lmKCFkKXJldHVybiBudWxsO2xldCBmPWQubWF0Y2goL14jKFswLTlhLWZdezEsMn0pKFswLTlhLWZdezEsMn0pKFswLTlhLWZdezEsMn0pJC8pO2lmKCFmKXJldHVybiBudWxsO2lmKDQ9PWQubGVuZ3RoKWZvcihkPTE7Mz49ZDtkKyspZltkXSs9ZltkXTtyZXR1cm5bcGFyc2VJbnQoZlsxXSwxNikscGFyc2VJbnQoZlsyXSwxNikscGFyc2VJbnQoZlszXSwxNildfWEuZm9ybWF0RGF0ZT1mdW5jdGlvbihkKXtyZXR1cm4gZD9kLnRvU3RyaW5nKCkucmVwbGFjZSgvR01ULVxkKyBcKChbXildKylcKS8sIiQxIik6IiJ9O2EucGlja1RleHRDb2xvcj1mdW5jdGlvbihkKXtyZXR1cm4oZD1jKGQpKT8xMjU8TWF0aC5yb3VuZCgoMjk5KmRbMF0rNTg3KmRbMV0rMTE0KmRbMl0pLzFFMyk/ImluaGVyaXQiOiIjZWVlIjoiaW5oZXJpdCJ9fSkoZHB8fChkcD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNhcmQtaGVhZGluZy90Zi1jYXJkLWhlYWRpbmcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtY2FyZC1oZWFkaW5nIixwcm9wZXJ0aWVzOntkaXNwbGF5TmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sdGFnOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxydW46e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGRlc2NyaXB0aW9uOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxjb2xvcjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3J1bkJhY2tncm91bmQ6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkJhY2tncm91bmQoY29sb3IpIixyZWFkT25seTohMCxvYnNlcnZlcjoiX3VwZGF0ZUhlYWRpbmdTdHlsZSJ9LF9ydW5Db2xvcjp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUnVuQ29sb3IoY29sb3IpIixyZWFkT25seTohMCxvYnNlcnZlcjoiX3VwZGF0ZUhlYWRpbmdTdHlsZSJ9LF9uYW1lTGFiZWw6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZU5hbWVMYWJlbChkaXNwbGF5TmFtZSwgdGFnKSJ9LF90YWdMYWJlbDp7dHlwZTpTdHJpbmcsCmNvbXB1dGVkOiJfY29tcHV0ZVRhZ0xhYmVsKGRpc3BsYXlOYW1lLCB0YWcpIn19LF91cGRhdGVIZWFkaW5nU3R5bGUoKXt0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tdGYtY2FyZC1oZWFkaW5nLWJhY2tncm91bmQtY29sb3IiOnRoaXMuX3J1bkJhY2tncm91bmQsIi0tdGYtY2FyZC1oZWFkaW5nLWNvbG9yIjp0aGlzLl9ydW5Db2xvcn0pfSxfY29tcHV0ZVJ1bkJhY2tncm91bmQoYSl7cmV0dXJuIGF8fCJub25lIn0sX2NvbXB1dGVSdW5Db2xvcihhKXtyZXR1cm4gZHAucGlja1RleHRDb2xvcihhKX0sX2NvbXB1dGVOYW1lTGFiZWwoYSxjKXtyZXR1cm4gYXx8Y3x8IiJ9LF9jb21wdXRlVGFnTGFiZWwoYSxjKXtyZXR1cm4gYyYmYyE9PWE/YzoiIn0sX3RvZ2dsZURlc2NyaXB0aW9uRGlhbG9nKGEpe3RoaXMuJC5kZXNjcmlwdGlvbkRpYWxvZy5wb3NpdGlvblRhcmdldD1hLnRhcmdldDt0aGlzLiQuZGVzY3JpcHRpb25EaWFsb2cudG9nZ2xlKCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1kb3dubG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRvd25sb2FkZXIiLHByb3BlcnRpZXM6e19ydW46e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxydW5zOkFycmF5LHRhZzpTdHJpbmcsdXJsRm46RnVuY3Rpb259LF9jc3ZVcmwoYSxjLGQpe3JldHVybiBjP1FvLmFkZFBhcmFtcyhkKGEsYykse2Zvcm1hdDoiY3N2In0pOiIifSxfanNvblVybChhLGMsZCl7cmV0dXJuIGM/ZChhLGMpOiIifSxfY3N2TmFtZShhLGMpe3JldHVybiBjP2BydW4tJHtjfS10YWctJHthfS5jc3ZgOiIifSxfanNvbk5hbWUoYSxjKXtyZXR1cm4gYz9gcnVuLSR7Y30tdGFnLSR7YX0uanNvbmA6IiJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtc2NhbGFyLWRhc2hib2FyZC90Zi1zY2FsYXItY2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1zY2FsYXItY2FyZCIscHJvcGVydGllczp7dGFnOlN0cmluZyxkYXRhVG9Mb2FkOkFycmF5LHhUeXBlOlN0cmluZyxhY3RpdmU6Qm9vbGVhbixpZ25vcmVZT3V0bGllcnM6Qm9vbGVhbixyZXF1ZXN0TWFuYWdlcjpPYmplY3Qsc2hvd0Rvd25MaW5rczpCb29sZWFuLHNtb290aGluZ0VuYWJsZWQ6Qm9vbGVhbixzbW9vdGhpbmdXZWlnaHQ6TnVtYmVyLHRhZ01ldGFkYXRhOk9iamVjdCxjb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSx0b29sdGlwU29ydGluZ01ldGhvZDpTdHJpbmcsX2xvYWREYXRhQ2FsbGJhY2s6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKGEsYyxkKT0+e2Q9ZC5tYXAoZz0+KHt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKmdbMF0pLHN0ZXA6Z1sxXSxzY2FsYXI6Z1syXX0pKTtjb25zdCBmPXRoaXMuX2dldFNlcmllc05hbWVGcm9tRGF0dW0oYyk7YS5zZXRTZXJpZXNNZXRhZGF0YShmLGMpO2Euc2V0U2VyaWVzRGF0YShmLApkKX19LHJlYWRPbmx5OiEwfSxnZXREYXRhTG9hZFVybDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybih7dGFnOmEscnVuOmN9KT0+UW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInNjYWxhcnMiLCIvc2NhbGFycyIsbmV3IFVSTFNlYXJjaFBhcmFtcyh7dGFnOmEscnVuOmN9KSl9fSxfZG93bmxvYWRVcmxGbjp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybihhLGMpPT50aGlzLmdldERhdGFMb2FkVXJsKHt0YWc6YSxydW46Y30pfX0scmVxdWVzdERhdGE6RnVuY3Rpb24sX2dldERhdGFMb2FkTmFtZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBhPT50aGlzLl9nZXRTZXJpZXNOYW1lRnJvbURhdHVtKGEpfX0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfbG9nU2NhbGVBY3RpdmU6Qm9vbGVhbixfdG9vbHRpcENvbHVtbnM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtjb25zdCBhPQpjcC5ERUZBVUxUX1RPT0xUSVBfQ09MVU1OUy5zbGljZSgpLGM9YS5maW5kSW5kZXgoZD0+Ik5hbWUiPT1kLnRpdGxlKTthLnNwbGljZShjLDEse3RpdGxlOiJOYW1lIixldmFsdWF0ZTpkPT57ZD1kLmRhdGFzZXQubWV0YWRhdGEoKS5tZXRhO3JldHVybiB0aGlzLl9nZXRTZXJpZXNEaXNwbGF5TmFtZUZyb21EYXR1bShkKX19KTtyZXR1cm4gYX19fSxyZWxvYWQoKXt0aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikucmVsb2FkKCl9LHJlZHJhdygpe3RoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5yZWRyYXcoKX0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfSxfdG9nZ2xlTG9nU2NhbGUoKXt0aGlzLnNldCgiX2xvZ1NjYWxlQWN0aXZlIiwhdGhpcy5fbG9nU2NhbGVBY3RpdmUpfSxfcmVzZXREb21haW4oKXtjb25zdCBhPXRoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKTsKYSYmYS5yZXNldERvbWFpbigpfSxfdXBkYXRlRG93bmxvYWRMaW5rKCl7Y29uc3QgYT10aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikuZXhwb3J0QXNTdmdTdHJpbmcoKTt0aGlzLiQkKCIjc3ZnTGluayIpLmhyZWY9YGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJHtidG9hKGEpfWB9LF9ydW5zRnJvbURhdGEoYSl7cmV0dXJuIGEubWFwKGM9PmMucnVuKX0sX2dldERhdGFTZXJpZXMoKXtyZXR1cm4gdGhpcy5kYXRhVG9Mb2FkLm1hcChhPT50aGlzLl9nZXRTZXJpZXNOYW1lRnJvbURhdHVtKGEpKX0sX2dldFNlcmllc05hbWVGcm9tRGF0dW0oe3J1bjphLGV4cGVyaW1lbnQ6Yz17bmFtZToiX2RlZmF1bHQifX0pe3JldHVybiBKU09OLnN0cmluZ2lmeShbYy5uYW1lLGFdKX0sX2dldFNlcmllc0Rpc3BsYXlOYW1lRnJvbURhdHVtKGEpe3JldHVybiBhLnJ1bn0sX2dldENvbG9yU2NhbGUoKXtyZXR1cm4gbnVsbCE9PXRoaXMuY29sb3JTY2FsZT90aGlzLmNvbG9yU2NhbGU6CntzY2FsZTphPT57WyxhXT1KU09OLnBhcnNlKGEpO3JldHVybiBYby5ydW5zQ29sb3JTY2FsZShhKX19fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tcmFuZ2UtYmVoYXZpb3IvaXJvbi1yYW5nZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvblJhbmdlQmVoYXZpb3I9e3Byb3BlcnRpZXM6e3ZhbHVlOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LG1pbjp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LG1heDp7dHlwZTpOdW1iZXIsdmFsdWU6MTAwLG5vdGlmeTohMH0sc3RlcDp7dHlwZTpOdW1iZXIsdmFsdWU6MSxub3RpZnk6ITB9LHJhdGlvOnt0eXBlOk51bWJlcix2YWx1ZTowLHJlYWRPbmx5OiEwLG5vdGlmeTohMH19LG9ic2VydmVyczpbIl91cGRhdGUodmFsdWUsIG1pbiwgbWF4LCBzdGVwKSJdLF9jYWxjUmF0aW86ZnVuY3Rpb24oYSl7cmV0dXJuKHRoaXMuX2NsYW1wVmFsdWUoYSktdGhpcy5taW4pLyh0aGlzLm1heC10aGlzLm1pbil9LF9jbGFtcFZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLm1pbih0aGlzLm1heCxNYXRoLm1heCh0aGlzLm1pbix0aGlzLl9jYWxjU3RlcChhKSkpfSxfY2FsY1N0ZXA6ZnVuY3Rpb24oYSl7YT1wYXJzZUZsb2F0KGEpOwppZighdGhpcy5zdGVwKXJldHVybiBhO2E9TWF0aC5yb3VuZCgoYS10aGlzLm1pbikvdGhpcy5zdGVwKTtyZXR1cm4gMT50aGlzLnN0ZXA/YS8oMS90aGlzLnN0ZXApK3RoaXMubWluOmEqdGhpcy5zdGVwK3RoaXMubWlufSxfdmFsaWRhdGVWYWx1ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2NsYW1wVmFsdWUodGhpcy52YWx1ZSk7dGhpcy52YWx1ZT10aGlzLm9sZFZhbHVlPWlzTmFOKGEpP3RoaXMub2xkVmFsdWU6YTtyZXR1cm4gdGhpcy52YWx1ZSE9PWF9LF91cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl92YWxpZGF0ZVZhbHVlKCk7dGhpcy5fc2V0UmF0aW8oMTAwKnRoaXMuX2NhbGNSYXRpbyh0aGlzLnZhbHVlKSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1wcm9ncmVzcy9wYXBlci1wcm9ncmVzcy5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1wcm9ncmVzcyIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25SYW5nZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntzZWNvbmRhcnlQcm9ncmVzczp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sc2Vjb25kYXJ5UmF0aW86e3R5cGU6TnVtYmVyLHZhbHVlOjAscmVhZE9ubHk6ITB9LGluZGV0ZXJtaW5hdGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX3RvZ2dsZUluZGV0ZXJtaW5hdGUifSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxvYnNlcnZlcjoiX2Rpc2FibGVkQ2hhbmdlZCJ9fSxvYnNlcnZlcnM6WyJfcHJvZ3Jlc3NDaGFuZ2VkKHNlY29uZGFyeVByb2dyZXNzLCB2YWx1ZSwgbWluLCBtYXgsIGluZGV0ZXJtaW5hdGUpIl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InByb2dyZXNzYmFyIn0sX3RvZ2dsZUluZGV0ZXJtaW5hdGU6ZnVuY3Rpb24oYSl7dGhpcy50b2dnbGVDbGFzcygiaW5kZXRlcm1pbmF0ZSIsCmEsdGhpcy4kLnByaW1hcnlQcm9ncmVzcyl9LF90cmFuc2Zvcm1Qcm9ncmVzczpmdW5jdGlvbihhLGMpe2Euc3R5bGUudHJhbnNmb3JtPWEuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJzY2FsZVgoIitjLzEwMCsiKSJ9LF9tYWluUmF0aW9DaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuX3RyYW5zZm9ybVByb2dyZXNzKHRoaXMuJC5wcmltYXJ5UHJvZ3Jlc3MsYSl9LF9wcm9ncmVzc0NoYW5nZWQ6ZnVuY3Rpb24oYSxjLGQsZixnKXthPXRoaXMuX2NsYW1wVmFsdWUoYSk7Yz10aGlzLl9jbGFtcFZhbHVlKGMpO3ZhciBsPTEwMCp0aGlzLl9jYWxjUmF0aW8oYSksaz0xMDAqdGhpcy5fY2FsY1JhdGlvKGMpO3RoaXMuX3NldFNlY29uZGFyeVJhdGlvKGwpO3RoaXMuX3RyYW5zZm9ybVByb2dyZXNzKHRoaXMuJC5zZWNvbmRhcnlQcm9ncmVzcyxsKTt0aGlzLl90cmFuc2Zvcm1Qcm9ncmVzcyh0aGlzLiQucHJpbWFyeVByb2dyZXNzLGspO3RoaXMuc2Vjb25kYXJ5UHJvZ3Jlc3M9YTtnP3RoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLXZhbHVlbm93Iik6CnRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbm93IixjKTt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW1pbiIsZCk7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVtYXgiLGYpfSxfZGlzYWJsZWRDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWRpc2FibGVkIixhPyJ0cnVlIjoiZmFsc2UiKX0sX2hpZGVTZWNvbmRhcnlQcm9ncmVzczpmdW5jdGlvbihhKXtyZXR1cm4gMD09PWF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItc2xpZGVyL3BhcGVyLXNsaWRlci5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1zbGlkZXIiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcixQb2x5bWVyLklyb25Gb3JtRWxlbWVudEJlaGF2aW9yLFBvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvcixQb2x5bWVyLklyb25SYW5nZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntzbmFwczp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0scGluOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxzZWNvbmRhcnlQcm9ncmVzczp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9zZWNvbmRhcnlQcm9ncmVzc0NoYW5nZWQifSxlZGl0YWJsZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbW1lZGlhdGVWYWx1ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MCxyZWFkT25seTohMCxub3RpZnk6ITB9LG1heE1hcmtlcnM6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSxleHBhbmQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH0sCmlnbm9yZUJhclRvdWNoOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGRyYWdnaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSx0cmFuc2l0aW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVhZE9ubHk6ITB9LG1hcmtlcnM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19fSxvYnNlcnZlcnM6WyJfdXBkYXRlS25vYih2YWx1ZSwgbWluLCBtYXgsIHNuYXBzLCBzdGVwKSIsIl92YWx1ZUNoYW5nZWQodmFsdWUpIiwiX2ltbWVkaWF0ZVZhbHVlQ2hhbmdlZChpbW1lZGlhdGVWYWx1ZSkiLCJfdXBkYXRlTWFya2VycyhtYXhNYXJrZXJzLCBtaW4sIG1heCwgc25hcHMpIl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InNsaWRlciIsdGFiaW5kZXg6MH0sa2V5QmluZGluZ3M6e2xlZnQ6Il9sZWZ0S2V5IixyaWdodDoiX3JpZ2h0S2V5IiwiZG93biBwYWdlZG93biBob21lIjoiX2RlY3JlbWVudEtleSIsInVwIHBhZ2V1cCBlbmQiOiJfaW5jcmVtZW50S2V5In0sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5pZ25vcmVCYXJUb3VjaCYmUG9seW1lci5HZXN0dXJlcy5zZXRUb3VjaEFjdGlvbih0aGlzLiQuc2xpZGVyQmFyLCJhdXRvIil9LGluY3JlbWVudDpmdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnZhbHVlK3RoaXMuc3RlcCl9LGRlY3JlbWVudDpmdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnZhbHVlLXRoaXMuc3RlcCl9LF91cGRhdGVLbm9iOmZ1bmN0aW9uKGEsYyxkKXt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW1pbiIsYyk7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVtYXgiLGQpO3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbm93IixhKTt0aGlzLl9wb3NpdGlvbktub2IoMTAwKnRoaXMuX2NhbGNSYXRpbyhhKSl9LF92YWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoInZhbHVlLWNoYW5nZSIse2NvbXBvc2VkOiEwfSl9LF9pbW1lZGlhdGVWYWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmRyYWdnaW5nPwp0aGlzLmZpcmUoImltbWVkaWF0ZS12YWx1ZS1jaGFuZ2UiLHtjb21wb3NlZDohMH0pOnRoaXMudmFsdWU9dGhpcy5pbW1lZGlhdGVWYWx1ZX0sX3NlY29uZGFyeVByb2dyZXNzQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuc2Vjb25kYXJ5UHJvZ3Jlc3M9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnNlY29uZGFyeVByb2dyZXNzKX0sX2V4cGFuZEtub2I6ZnVuY3Rpb24oKXt0aGlzLl9zZXRFeHBhbmQoITApfSxfcmVzZXRLbm9iOmZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxEZWJvdW5jZXIoImV4cGFuZEtub2IiKTt0aGlzLl9zZXRFeHBhbmQoITEpfSxfcG9zaXRpb25Lbm9iOmZ1bmN0aW9uKGEpe3RoaXMuX3NldEltbWVkaWF0ZVZhbHVlKHRoaXMuX2NhbGNTdGVwKHRoaXMuX2NhbGNLbm9iUG9zaXRpb24oYSkpKTt0aGlzLl9zZXRSYXRpbygxMDAqdGhpcy5fY2FsY1JhdGlvKHRoaXMuaW1tZWRpYXRlVmFsdWUpKTt0aGlzLiQuc2xpZGVyS25vYi5zdHlsZS5sZWZ0PXRoaXMucmF0aW8rIiUiO3RoaXMuZHJhZ2dpbmcmJgoodGhpcy5fa25vYnN0YXJ0eD10aGlzLnJhdGlvKnRoaXMuX3cvMTAwLHRoaXMudHJhbnNsYXRlM2QoMCwwLDAsdGhpcy4kLnNsaWRlcktub2IpKX0sX2NhbGNLbm9iUG9zaXRpb246ZnVuY3Rpb24oYSl7cmV0dXJuKHRoaXMubWF4LXRoaXMubWluKSphLzEwMCt0aGlzLm1pbn0sX29uVHJhY2s6ZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKTtzd2l0Y2goYS5kZXRhaWwuc3RhdGUpe2Nhc2UgInN0YXJ0Ijp0aGlzLl90cmFja1N0YXJ0KGEpO2JyZWFrO2Nhc2UgInRyYWNrIjp0aGlzLl90cmFja1goYSk7YnJlYWs7Y2FzZSAiZW5kIjp0aGlzLl90cmFja0VuZCgpfX0sX3RyYWNrU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9zZXRUcmFuc2l0aW5nKCExKTt0aGlzLl93PXRoaXMuJC5zbGlkZXJCYXIub2Zmc2V0V2lkdGg7dGhpcy5fa25vYnN0YXJ0eD10aGlzLl9zdGFydHg9dGhpcy5feD10aGlzLnJhdGlvKnRoaXMuX3cvMTAwO3RoaXMuX21pbng9LXRoaXMuX3N0YXJ0eDt0aGlzLl9tYXh4PQp0aGlzLl93LXRoaXMuX3N0YXJ0eDt0aGlzLiQuc2xpZGVyS25vYi5jbGFzc0xpc3QuYWRkKCJkcmFnZ2luZyIpO3RoaXMuX3NldERyYWdnaW5nKCEwKX0sX3RyYWNrWDpmdW5jdGlvbihhKXt0aGlzLmRyYWdnaW5nfHx0aGlzLl90cmFja1N0YXJ0KGEpO3RoaXMuX3g9dGhpcy5fc3RhcnR4K01hdGgubWluKHRoaXMuX21heHgsTWF0aC5tYXgodGhpcy5fbWlueCxhLmRldGFpbC5keCoodGhpcy5faXNSVEw/LTE6MSkpKTt0aGlzLl9zZXRJbW1lZGlhdGVWYWx1ZSh0aGlzLl9jYWxjU3RlcCh0aGlzLl9jYWxjS25vYlBvc2l0aW9uKHRoaXMuX3gvdGhpcy5fdyoxMDApKSk7dGhpcy50cmFuc2xhdGUzZCh0aGlzLl9jYWxjUmF0aW8odGhpcy5pbW1lZGlhdGVWYWx1ZSkqdGhpcy5fdy10aGlzLl9rbm9ic3RhcnR4KyJweCIsMCwwLHRoaXMuJC5zbGlkZXJLbm9iKX0sX3RyYWNrRW5kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kLnNsaWRlcktub2Iuc3R5bGU7dGhpcy4kLnNsaWRlcktub2IuY2xhc3NMaXN0LnJlbW92ZSgiZHJhZ2dpbmciKTsKdGhpcy5fc2V0RHJhZ2dpbmcoITEpO3RoaXMuX3Jlc2V0S25vYigpO3RoaXMudmFsdWU9dGhpcy5pbW1lZGlhdGVWYWx1ZTthLnRyYW5zZm9ybT1hLndlYmtpdFRyYW5zZm9ybT0iIjt0aGlzLmZpcmUoImNoYW5nZSIse2NvbXBvc2VkOiEwfSl9LF9rbm9iZG93bjpmdW5jdGlvbihhKXt0aGlzLl9leHBhbmRLbm9iKCk7YS5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuZm9jdXMoKX0sX2JhcnRyYWNrOmZ1bmN0aW9uKGEpe3RoaXMuX2FsbG93QmFyRXZlbnQoYSkmJnRoaXMuX29uVHJhY2soYSl9LF9iYXJjbGljazpmdW5jdGlvbihhKXt0aGlzLl93PXRoaXMuJC5zbGlkZXJCYXIub2Zmc2V0V2lkdGg7dmFyIGM9dGhpcy4kLnNsaWRlckJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjPShhLmRldGFpbC54LWMubGVmdCkvdGhpcy5fdyoxMDA7dGhpcy5faXNSVEwmJihjPTEwMC1jKTt2YXIgZD10aGlzLnJhdGlvO3RoaXMuX3NldFRyYW5zaXRpbmcoITApO3RoaXMuX3Bvc2l0aW9uS25vYihjKTsKZD09PXRoaXMucmF0aW8mJnRoaXMuX3NldFRyYW5zaXRpbmcoITEpO3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmZpcmUoImNoYW5nZSIse2NvbXBvc2VkOiEwfSl9KTthLnByZXZlbnREZWZhdWx0KCk7dGhpcy5mb2N1cygpfSxfYmFyZG93bjpmdW5jdGlvbihhKXt0aGlzLl9hbGxvd0JhckV2ZW50KGEpJiYodGhpcy5kZWJvdW5jZSgiZXhwYW5kS25vYiIsdGhpcy5fZXhwYW5kS25vYiw2MCksdGhpcy5fYmFyY2xpY2soYSkpfSxfa25vYlRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PT10aGlzLiQuc2xpZGVyS25vYiYmdGhpcy5fc2V0VHJhbnNpdGluZyghMSl9LF91cGRhdGVNYXJrZXJzOmZ1bmN0aW9uKGEsYyxkLGYpe2Z8fHRoaXMuX3NldE1hcmtlcnMoW10pO2M9TWF0aC5yb3VuZCgoZC1jKS90aGlzLnN0ZXApO2M+YSYmKGM9YSk7aWYoMD5jfHwhaXNGaW5pdGUoYykpYz0wO3RoaXMuX3NldE1hcmtlcnMoQXJyYXkoYykpfSxfbWVyZ2VDbGFzc2VzOmZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3Qua2V5cyhhKS5maWx0ZXIoZnVuY3Rpb24oYyl7cmV0dXJuIGFbY119KS5qb2luKCIgIil9LApfZ2V0Q2xhc3NOYW1lczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tZXJnZUNsYXNzZXMoe2Rpc2FibGVkOnRoaXMuZGlzYWJsZWQscGluOnRoaXMucGluLHNuYXBzOnRoaXMuc25hcHMscmluZzp0aGlzLmltbWVkaWF0ZVZhbHVlPD10aGlzLm1pbixleHBhbmQ6dGhpcy5leHBhbmQsZHJhZ2dpbmc6dGhpcy5kcmFnZ2luZyx0cmFuc2l0aW5nOnRoaXMudHJhbnNpdGluZyxlZGl0YWJsZTp0aGlzLmVkaXRhYmxlfSl9LF9hbGxvd0JhckV2ZW50OmZ1bmN0aW9uKGEpe3JldHVybiF0aGlzLmlnbm9yZUJhclRvdWNofHxhLmRldGFpbC5zb3VyY2VFdmVudCBpbnN0YW5jZW9mIE1vdXNlRXZlbnR9LGdldCBfaXNSVEwoKXt2b2lkIDA9PT10aGlzLl9faXNSVEwmJih0aGlzLl9faXNSVEw9InJ0bCI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKS5kaXJlY3Rpb24pO3JldHVybiB0aGlzLl9faXNSVEx9LF9sZWZ0S2V5OmZ1bmN0aW9uKGEpe3RoaXMuX2lzUlRMP3RoaXMuX2luY3JlbWVudEtleShhKToKdGhpcy5fZGVjcmVtZW50S2V5KGEpfSxfcmlnaHRLZXk6ZnVuY3Rpb24oYSl7dGhpcy5faXNSVEw/dGhpcy5fZGVjcmVtZW50S2V5KGEpOnRoaXMuX2luY3JlbWVudEtleShhKX0sX2luY3JlbWVudEtleTpmdW5jdGlvbihhKXt0aGlzLmRpc2FibGVkfHwoImVuZCI9PT1hLmRldGFpbC5rZXk/dGhpcy52YWx1ZT10aGlzLm1heDp0aGlzLmluY3JlbWVudCgpLHRoaXMuZmlyZSgiY2hhbmdlIiksYS5wcmV2ZW50RGVmYXVsdCgpKX0sX2RlY3JlbWVudEtleTpmdW5jdGlvbihhKXt0aGlzLmRpc2FibGVkfHwoImhvbWUiPT09YS5kZXRhaWwua2V5P3RoaXMudmFsdWU9dGhpcy5taW46dGhpcy5kZWNyZW1lbnQoKSx0aGlzLmZpcmUoImNoYW5nZSIpLGEucHJldmVudERlZmF1bHQoKSl9LF9jaGFuZ2VWYWx1ZTpmdW5jdGlvbihhKXt0aGlzLnZhbHVlPWEudGFyZ2V0LnZhbHVlO3RoaXMuZmlyZSgiY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0sX2lucHV0S2V5RG93bjpmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSwKX2NyZWF0ZVJpcHBsZTpmdW5jdGlvbigpe3RoaXMuX3JpcHBsZUNvbnRhaW5lcj10aGlzLiQuc2xpZGVyS25vYjtyZXR1cm4gUG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9ySW1wbC5fY3JlYXRlUmlwcGxlLmNhbGwodGhpcyl9LF9mb2N1c2VkQ2hhbmdlZDpmdW5jdGlvbihhKXthJiZ0aGlzLmVuc3VyZVJpcHBsZSgpO3RoaXMuaGFzUmlwcGxlKCkmJih0aGlzLl9yaXBwbGUuc3R5bGUuZGlzcGxheT1hPyIiOiJub25lIix0aGlzLl9yaXBwbGUuaG9sZERvd249YSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtc2NhbGFyLWRhc2hib2FyZC90Zi1zbW9vdGhpbmctaW5wdXQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtc21vb3RoaW5nLWlucHV0Iixwcm9wZXJ0aWVzOntzdGVwOk51bWJlcixtYXg6TnVtYmVyLG1pbjpOdW1iZXIsd2VpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTouNixub3RpZnk6ITB9LF9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlcjp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwLG9ic2VydmVyOiJfaW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXJDaGFuZ2VkIn0sX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dDp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLG9ic2VydmVyOiJfaW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0Q2hhbmdlZCJ9fSxfdXBkYXRlV2VpZ2h0Ol8uZGVib3VuY2UoZnVuY3Rpb24oYSl7dGhpcy53ZWlnaHQ9YX0sMjUwKSxfaW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXJDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0PXRoaXMuX2ltbWVkaWF0ZVdlaWdodE51bWJlckZvclBhcGVyU2xpZGVyLnRvU3RyaW5nKCk7CnRoaXMuX3VwZGF0ZVdlaWdodC5jYWxsKHRoaXMsdGhpcy5faW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXIpfSxfaW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0Q2hhbmdlZDpmdW5jdGlvbigpezA+K3RoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dD90aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ9IjAiOjE8K3RoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dCYmKHRoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dD0iMSIpO3ZhciBhPSt0aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ7aXNOYU4oYSl8fHRoaXMuX3VwZGF0ZVdlaWdodC5jYWxsKHRoaXMsYSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtc2NhbGFyLWRhc2hib2FyZC90Zi1zY2FsYXItZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXNjYWxhci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19zaG93RG93bmxvYWRMaW5rczp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTpUby5nZXRCb29sZWFuSW5pdGlhbGl6ZXIoIl9zaG93RG93bmxvYWRMaW5rcyIse2RlZmF1bHRWYWx1ZTohMSx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxvYnNlcnZlcjoiX3Nob3dEb3dubG9hZExpbmtzT2JzZXJ2ZXIifSxfc21vb3RoaW5nV2VpZ2h0Ont0eXBlOk51bWJlcixub3RpZnk6ITAsdmFsdWU6VG8uZ2V0TnVtYmVySW5pdGlhbGl6ZXIoIl9zbW9vdGhpbmdXZWlnaHQiLHtkZWZhdWx0VmFsdWU6LjZ9KSxvYnNlcnZlcjoiX3Ntb290aGluZ1dlaWdodE9ic2VydmVyIn0sX3Ntb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVTbW9vdGhpbmdFbmFibGVkKF9zbW9vdGhpbmdXZWlnaHQpIn0sX2lnbm9yZVlPdXRsaWVyczp7dHlwZTpCb29sZWFuLHZhbHVlOlRvLmdldEJvb2xlYW5Jbml0aWFsaXplcigiX2lnbm9yZVlPdXRsaWVycyIsCntkZWZhdWx0VmFsdWU6ITAsdXNlTG9jYWxTdG9yYWdlOiEwfSksb2JzZXJ2ZXI6Il9pZ25vcmVZT3V0bGllcnNPYnNlcnZlciJ9LF94VHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6JG8uWFR5cGUuU1RFUH0sX3NlbGVjdGVkUnVuczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2NhdGVnb3JpZXNEb21SZWFkeTpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX2dldENhdGVnb3J5SXRlbUtleTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+YT0+YS50YWd9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBRby5SZXF1ZXN0TWFuYWdlcig1MCl9fSxiZWhhdmlvcnM6W1VvLkFycmF5VXBkYXRlSGVscGVyXSxvYnNlcnZlcnM6WyJfdXBkYXRlQ2F0ZWdvcmllcyhfcnVuVG9UYWdJbmZvLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyLCBfY2F0ZWdvcmllc0RvbVJlYWR5KSJdLApfc2hvd0Rvd25sb2FkTGlua3NPYnNlcnZlcjpUby5nZXRCb29sZWFuT2JzZXJ2ZXIoIl9zaG93RG93bmxvYWRMaW5rcyIse2RlZmF1bHRWYWx1ZTohMSx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxfc21vb3RoaW5nV2VpZ2h0T2JzZXJ2ZXI6VG8uZ2V0TnVtYmVyT2JzZXJ2ZXIoIl9zbW9vdGhpbmdXZWlnaHQiLHtkZWZhdWx0VmFsdWU6LjZ9KSxfaWdub3JlWU91dGxpZXJzT2JzZXJ2ZXI6VG8uZ2V0Qm9vbGVhbk9ic2VydmVyKCJfaWdub3JlWU91dGxpZXJzIix7ZGVmYXVsdFZhbHVlOiEwLHVzZUxvY2FsU3RvcmFnZTohMH0pLF9jb21wdXRlU21vb3RoaW5nRW5hYmxlZChhKXtyZXR1cm4gMDxhfSxfZ2V0Q2F0ZWdvcnlLZXkoYSl7cmV0dXJuIGEubWV0YWRhdGEudHlwZT09Um8uQ2F0ZWdvcnlUeXBlLlNFQVJDSF9SRVNVTFRTPyIiOmEubmFtZX0sX3Nob3VsZE9wZW4oYSl7cmV0dXJuIDI+PWF9LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKT0+Cnt0aGlzLl9yZWxvYWRDaGFydHMoKX0pfSxfZmV0Y2hUYWdzKCl7Y29uc3QgYT1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgic2NhbGFycyIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihjPT57aWYoIV8uaXNFcXVhbChjLHRoaXMuX3J1blRvVGFnSW5mbykpe3ZhciBkPV8ubWFwVmFsdWVzKGMsZj0+T2JqZWN0LmtleXMoZikpO2Q9UW8uZ2V0VGFncyhkKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWQubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsYyk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZENoYXJ0cygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1zY2FsYXItY2FyZCIpLmZvckVhY2goYT0+e2EucmVsb2FkKCl9KX0sX3VwZGF0ZUNhdGVnb3JpZXMoYSxjLGQpe2E9Xy5tYXBWYWx1ZXMoYSxmPT5PYmplY3Qua2V5cyhmKSk7CmM9Um8uY2F0ZWdvcml6ZVRhZ3MoYSxjLGQpO2MuZm9yRWFjaChmPT57Zi5pdGVtcz1mLml0ZW1zLm1hcChnPT4oe3RhZzpnLnRhZyxzZXJpZXM6Zy5ydW5zLm1hcChsPT4oe3J1bjpsLHRhZzpnLnRhZ30pKX0pKX0pO3RoaXMudXBkYXRlQXJyYXlQcm9wKCJfY2F0ZWdvcmllcyIsYyx0aGlzLl9nZXRDYXRlZ29yeUtleSl9LF90YWdNZXRhZGF0YShhLGMsZCl7Y29uc3QgZj1kLnRhZyxnPXt9O2Quc2VyaWVzLmZvckVhY2goKHtydW46bn0pPT57Z1tuXT1jW25dW2ZdfSk7ZD1mLnJlcGxhY2UoL1wvc2NhbGFyX3N1bW1hcnkkLywiIik7bGV0IHtkZXNjcmlwdGlvbjpsLGRpc3BsYXlOYW1lOmt9PVpvLmFnZ3JlZ2F0ZVRhZ0luZm8oZyxkKTthLm1ldGFkYXRhLnR5cGU9PVJvLkNhdGVnb3J5VHlwZS5QUkVGSVhfR1JPVVAmJmsuc3RhcnRzV2l0aChhLm5hbWUrIi8iKSYmKGs9ay5zbGljZShhLm5hbWUubGVuZ3RoKzEpKTtyZXR1cm57ZGVzY3JpcHRpb246bCxkaXNwbGF5TmFtZTprfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jdXN0b20tc2NhbGFyLWRhc2hib2FyZC90Zi1jdXN0b20tc2NhbGFyLWhlbHBlcnMuanMKdmFyIGVwOwooZnVuY3Rpb24oYSl7Y2xhc3MgY3tjb25zdHJ1Y3RvcihmLGcsbCxrLG4pe3RoaXMucnVuPWY7dGhpcy50YWc9Zzt0aGlzLm5hbWU9bDt0aGlzLnNjYWxhckRhdGE9azt0aGlzLnN5bWJvbD1ufWdldE5hbWUoKXtyZXR1cm4gdGhpcy5uYW1lfXNldERhdGEoZil7dGhpcy5zY2FsYXJEYXRhPWZ9Z2V0RGF0YSgpe3JldHVybiB0aGlzLnNjYWxhckRhdGF9Z2V0UnVuKCl7cmV0dXJuIHRoaXMucnVufWdldFRhZygpe3JldHVybiB0aGlzLnRhZ31nZXRTeW1ib2woKXtyZXR1cm4gdGhpcy5zeW1ib2x9fWEuRGF0YVNlcmllcz1jO2EuZ2VuZXJhdGVEYXRhU2VyaWVzTmFtZT1mdW5jdGlvbihmLGcpe3JldHVybmAke2d9ICgke2Z9KWB9O2NsYXNzIGR7Y29uc3RydWN0b3IoZil7dGhpcy5ydW5CYXNlZENvbG9yU2NhbGU9Zn1zY2FsZShmKXtyZXR1cm4gdGhpcy5ydW5CYXNlZENvbG9yU2NhbGUuc2NhbGUodGhpcy5wYXJzZVJ1bk5hbWUoZikpfXBhcnNlUnVuTmFtZShmKXtyZXR1cm4oZj1mLm1hdGNoKC9cKCguKilcKSQvKSk/CmZbMV06IiJ9fWEuRGF0YVNlcmllc0NvbG9yU2NhbGU9ZH0pKGVwfHwoZXA9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jdXN0b20tc2NhbGFyLWRhc2hib2FyZC90Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQiLHByb3BlcnRpZXM6e3J1bnM6QXJyYXkseFR5cGU6U3RyaW5nLGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlYWRPbmx5OiEwfSx0aXRsZTpTdHJpbmcsbWFyZ2luQ2hhcnRTZXJpZXM6QXJyYXksaWdub3JlWU91dGxpZXJzOkJvb2xlYW4scmVxdWVzdE1hbmFnZXI6T2JqZWN0LHNob3dEb3dubG9hZExpbmtzOkJvb2xlYW4sdGFnTWV0YWRhdGE6T2JqZWN0LHRvb2x0aXBTb3J0aW5nTWV0aG9kOlN0cmluZyxfY29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6bmV3IGVwLkRhdGFTZXJpZXNDb2xvclNjYWxlKHtzY2FsZTpYby5ydW5zQ29sb3JTY2FsZX0pLHJlYWRPbmx5OiEwfSxfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVUYWdGaWx0ZXIobWFyZ2luQ2hhcnRTZXJpZXMpIn0sX3RhZ0ZpbHRlckludmFsaWQ6Qm9vbGVhbixfbmFtZVRvRGF0YVNlcmllczp7dHlwZTpPYmplY3QsCnZhbHVlOigpPT4oe30pfSxfc2VyaWVzTmFtZXM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZVNlcmllc05hbWVzKF9uYW1lVG9EYXRhU2VyaWVzLCBydW5zKSJ9LF9leHBhbmRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX2xvZ1NjYWxlQWN0aXZlOkJvb2xlYW4sX2RhdGFVcmw6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gYT0+e2NvbnN0IGM9dGhpcy5fdGFnRmlsdGVyO3JldHVybiBRby5hZGRQYXJhbXMoUW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImN1c3RvbV9zY2FsYXJzIiwiL3NjYWxhcnMiKSx7dGFnOmMscnVuOmF9KX19fSxfcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXg6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfbWF0Y2hlc0xpc3RPcGVuZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3RpdGxlRGlzcGxheVN0cmluZzp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlVGl0bGVEaXNwbGF5U3RyaW5nKHRpdGxlKSJ9LApfZmlsbEFyZWE6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLHZhbHVlOntsb3dlckFjY2Vzc29yOmE9PmEubG93ZXIsaGlnaGVyQWNjZXNzb3I6YT0+YS51cHBlcn19LF90b29sdGlwQ29sdW1uczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe2NvbnN0IGE9JG8ubXVsdGlzY2FsZUZvcm1hdHRlcigkby5ZX1RPT0xUSVBfRk9STUFUVEVSX1BSRUNJU0lPTiksYz1kPT5pc05hTihkKT8iTmFOIjphKGQpO3JldHVyblt7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmQ9PmQuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWV9LHt0aXRsZToiVmFsdWUiLGV2YWx1YXRlOmQ9PmMoZC5kYXR1bS5zY2FsYXIpfSx7dGl0bGU6Ikxvd2VyIE1hcmdpbiIsZXZhbHVhdGU6ZD0+YyhkLmRhdHVtLmxvd2VyKX0se3RpdGxlOiJVcHBlciBNYXJnaW4iLGV2YWx1YXRlOmQ9PmMoZC5kYXR1bS51cHBlcil9LHt0aXRsZToiU3RlcCIsZXZhbHVhdGU6ZD0+JG8uc3RlcEZvcm1hdHRlcihkLmRhdHVtLnN0ZXApfSx7dGl0bGU6IlRpbWUiLApldmFsdWF0ZTpkPT4kby50aW1lRm9ybWF0dGVyKGQuZGF0dW0ud2FsbF90aW1lKX0se3RpdGxlOiJSZWxhdGl2ZSIsZXZhbHVhdGU6ZD0+JG8ucmVsYXRpdmVGb3JtYXR0ZXIoJG8ucmVsYXRpdmVBY2Nlc3NvcihkLmRhdHVtLC0xLGQuZGF0YXNldCkpfV19fSxfbWlzc2luZ1RhZ3M6e3R5cGU6QXJyYXksdmFsdWU6W119LF9taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9zdGVwc01pc21hdGNoOk9iamVjdH0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZUNoYXJ0KF9uYW1lVG9EYXRhU2VyaWVzKSIsIl9yZWZyZXNoRGF0YVNlcmllcyhfdGFnRmlsdGVyKSJdLHJlbG9hZCgpe3RoaXMuJC5sb2FkZXIucmVsb2FkKCl9LHJlZHJhdygpe3RoaXMuJC5sb2FkZXIucmVkcmF3KCl9LF90b2dnbGVFeHBhbmRlZCgpe3RoaXMuc2V0KCJfZXhwYW5kZWQiLCF0aGlzLl9leHBhbmRlZCk7dGhpcy5yZWRyYXcoKX0sX3RvZ2dsZUxvZ1NjYWxlKCl7dGhpcy5zZXQoIl9sb2dTY2FsZUFjdGl2ZSIsCiF0aGlzLl9sb2dTY2FsZUFjdGl2ZSl9LF9yZXNldERvbWFpbigpe2NvbnN0IGE9dGhpcy4kLmxvYWRlcjthJiZhLnJlc2V0RG9tYWluKCl9LF9jc3ZVcmwoYSxjKXtpZighYylyZXR1cm4iIjthPXRoaXMuX2Rvd25sb2FkRGF0YVVybChhLGMpO3JldHVybiBRby5hZGRQYXJhbXMoYSx7Zm9ybWF0OiJjc3YifSl9LF9qc29uVXJsKGEsYyl7aWYoIWMpcmV0dXJuIiI7YT10aGlzLl9kb3dubG9hZERhdGFVcmwoYSxjKTtyZXR1cm4gUW8uYWRkUGFyYW1zKGEse2Zvcm1hdDoianNvbiJ9KX0sX2Rvd25sb2FkRGF0YVVybChhLGMpe2E9YVtjXTthPXt0YWc6YS5nZXRUYWcoKSxydW46YS5nZXRSdW4oKX07cmV0dXJuIFFvLmFkZFBhcmFtcyhRby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvZG93bmxvYWRfZGF0YSIpLGEpfSxfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbihhKXtyZXR1cm4oYyxkLGYpPT57aWYoZi5yZWdleF92YWxpZCl7dmFyIGc9Xy5jbG9uZSh0aGlzLl9uYW1lVG9EYXRhU2VyaWVzKSwKbD1bXTtfLmZvckVhY2goYSxrPT57dmFyIG49ITEscD1mLnRhZ190b19ldmVudHNbay52YWx1ZV07Y29uc3QgcT1mLnRhZ190b19ldmVudHNbay5sb3dlcl0scj1mLnRhZ190b19ldmVudHNbay51cHBlcl07Xy5pc1VuZGVmaW5lZChwKSYmKGwucHVzaChrLnZhbHVlKSxuPSEwKTtfLmlzVW5kZWZpbmVkKHEpJiYobC5wdXNoKGsubG93ZXIpLG49ITApO18uaXNVbmRlZmluZWQocikmJihsLnB1c2goay51cHBlciksbj0hMCk7aWYoIW4pe3ZhciB0PXo9PnpbMV07aWYobj10aGlzLl9maW5kU3RlcE1pc21hdGNoKGsscC5tYXAodCkscS5tYXAodCksci5tYXAodCkpKXRoaXMuc2V0KCJfc3RlcHNNaXNtYXRjaCIsbik7ZWxzZXt2YXIgdj16PT56WzJdO249cC5tYXAoKHoseCk9Pih7d2FsbF90aW1lOm5ldyBEYXRlKDFFMyp6WzBdKSxzdGVwOnQoeiksc2NhbGFyOnYoeiksbG93ZXI6dihxW3hdKSx1cHBlcjp2KHJbeF0pfSkpO3A9ZXAuZ2VuZXJhdGVEYXRhU2VyaWVzTmFtZShkLGsudmFsdWUpOwp2YXIgeT1nW3BdO3k/eS5zZXREYXRhKG4pOihrPXRoaXMuX2NyZWF0ZU5ld0RhdGFTZXJpZXMoZCxrLnZhbHVlLHAsbiksZ1twXT1rKX19fSk7dGhpcy5zZXQoIl9uYW1lVG9EYXRhU2VyaWVzIixnKTtjPV8uZmluZEluZGV4KHRoaXMuX21pc3NpbmdUYWdzLGs9PmsucnVuPT09ZCk7aWYobC5sZW5ndGgmJjMhPWwubGVuZ3RoKXtjb25zdCBrPXtydW46ZCx0YWdzOmx9OzA8PWM/dGhpcy5zcGxpY2UoIl9taXNzaW5nVGFncyIsYywxLGspOnRoaXMucHVzaCgiX21pc3NpbmdUYWdzIixrKX1lbHNlIDA8PWMmJnRoaXMuc3BsaWNlKCJfbWlzc2luZ1RhZ3MiLGMsMSl9ZWxzZSB0aGlzLnNldCgiX3RhZ0ZpbHRlckludmFsaWQiLCEwKX19LF9maW5kU3RlcE1pc21hdGNoKGEsYyxkLGYpe3JldHVybiBfLmlzRXF1YWwoZCxjKSYmXy5pc0VxdWFsKGYsYyk/bnVsbDp7c2VyaWVzT2JqZWN0OmEsdmFsdWVTdGVwczpjLGxvd2VyU3RlcHM6ZCx1cHBlclN0ZXBzOmZ9fSxfY3JlYXRlTmV3RGF0YVNlcmllcyhhLApjLGQsZil7dGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbYV18PTA7Yz1uZXcgZXAuRGF0YVNlcmllcyhhLGMsZCxmLCRvLlNZTUJPTFNfTElTVFt0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFthXV0pO3RoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2FdPSh0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFthXSsxKSUkby5TWU1CT0xTX0xJU1QubGVuZ3RoO3JldHVybiBjfSxfdXBkYXRlQ2hhcnQoYSl7Xy5mb3JPd24oYSxjPT57dGhpcy4kLmxvYWRlci5zZXRTZXJpZXNEYXRhKGMuZ2V0TmFtZSgpLGMuZ2V0RGF0YSgpKX0pfSxfY29tcHV0ZVNlcmllc05hbWVzKCl7Y29uc3QgYT1uZXcgU2V0KHRoaXMucnVucyk7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuX25hbWVUb0RhdGFTZXJpZXMpLmZpbHRlcigoWyxjXSk9PmEuaGFzKGMucnVuKSkubWFwKChbY10pPT5jKX0sX2RldGVybWluZUNvbG9yKGEsYyl7cmV0dXJuIGEuc2NhbGUoYyl9LApfcmVmcmVzaERhdGFTZXJpZXMoKXt0aGlzLnNldCgiX25hbWVUb0RhdGFTZXJpZXMiLHt9KX0sX2NyZWF0ZVN5bWJvbEZ1bmN0aW9uKCl7cmV0dXJuIGE9PnRoaXMuX25hbWVUb0RhdGFTZXJpZXNbYV0uZ2V0U3ltYm9sKCkubWV0aG9kKCl9LF9kZXRlcm1pbmVTeW1ib2woYSxjKXtyZXR1cm4gYVtjXS5nZXRTeW1ib2woKS5jaGFyYWN0ZXJ9LF9jb21wdXRlVGFnRmlsdGVyKGEpe3JldHVybiBfLmZsYXR0ZW4oYS5tYXAoYz0+W2MudmFsdWUsYy5sb3dlcixjLnVwcGVyXSkpLm1hcChjPT4iKCIrdGhpcy5fZXNjYXBlUmVnZXhDaGFyYWN0ZXJzKGMpKyIpIikuam9pbigifCIpfSxfZXNjYXBlUmVnZXhDaGFyYWN0ZXJzKGEpe3JldHVybiBhLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCJcXCRceDI2Iil9LF9nZXRUb2dnbGVDb2xsYXBzaWJsZUljb24oYSl7cmV0dXJuIGE/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifSxfdG9nZ2xlTWF0Y2hlc09wZW4oKXt0aGlzLnNldCgiX21hdGNoZXNMaXN0T3BlbmVkIiwKIXRoaXMuX21hdGNoZXNMaXN0T3BlbmVkKX0sX2NvbXB1dGVUaXRsZURpc3BsYXlTdHJpbmcoYSl7cmV0dXJuIGF8fCJ1bnRpdGxlZCJ9LF9zZXBhcmF0ZVdpdGhDb21tYXMoYSl7cmV0dXJuIGEuam9pbigiLCAiKX0sX3RvZ2dsZU1pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuKCl7dGhpcy5zZXQoIl9taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkIiwhdGhpcy5fbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZCl9LF9tYXRjaExpc3RFbnRyeUNvbG9yVXBkYXRlZCgpe2NvbnN0IGE9dGhpcy4kJCgiI21hdGNoLWxpc3QtcmVwZWF0Iik7YSYmdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5tYXRjaC1saXN0LWVudHJ5IikuZm9yRWFjaChjPT57Y29uc3QgZD1hLml0ZW1Gb3JFbGVtZW50KGMpO2Muc3R5bGUuY29sb3I9dGhpcy5fZGV0ZXJtaW5lQ29sb3IodGhpcy5fY29sb3JTY2FsZSxkKX0pfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkL3RmLWN1c3RvbS1zY2FsYXItbXVsdGktbGluZS1jaGFydC1jYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWN1c3RvbS1zY2FsYXItbXVsdGktbGluZS1jaGFydC1jYXJkIixwcm9wZXJ0aWVzOntydW5zOkFycmF5LHhUeXBlOlN0cmluZyxhY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxyZWFkT25seTohMH0sdGl0bGU6U3RyaW5nLHRhZ1JlZ2V4ZXM6QXJyYXksaWdub3JlWU91dGxpZXJzOkJvb2xlYW4scmVxdWVzdE1hbmFnZXI6T2JqZWN0LHNob3dEb3dubG9hZExpbmtzOkJvb2xlYW4sc21vb3RoaW5nRW5hYmxlZDpCb29sZWFuLHNtb290aGluZ1dlaWdodDpOdW1iZXIsdGFnTWV0YWRhdGE6T2JqZWN0LHRvb2x0aXBTb3J0aW5nTWV0aG9kOlN0cmluZyxfY29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6bmV3IGVwLkRhdGFTZXJpZXNDb2xvclNjYWxlKHtzY2FsZTpYby5ydW5zQ29sb3JTY2FsZX0pLHJlYWRPbmx5OiEwfSxfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVUYWdGaWx0ZXIodGFnUmVnZXhlcykifSxfbmFtZVRvRGF0YVNlcmllczp7dHlwZTpPYmplY3QsCnZhbHVlOigpPT4oe30pfSxfc2VyaWVzTmFtZXM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZVNlcmllc05hbWVzKF9uYW1lVG9EYXRhU2VyaWVzLCBydW5zKSJ9LF9leHBhbmRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX2xvZ1NjYWxlQWN0aXZlOkJvb2xlYW4sX2RhdGFVcmw6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gYT0+e2NvbnN0IGM9dGhpcy5fdGFnRmlsdGVyO3JldHVybiBRby5hZGRQYXJhbXMoUW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImN1c3RvbV9zY2FsYXJzIiwiL3NjYWxhcnMiKSx7dGFnOmMscnVuOmF9KX19fSxfcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXg6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfbWF0Y2hlc0xpc3RPcGVuZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3RpdGxlRGlzcGxheVN0cmluZzp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlVGl0bGVEaXNwbGF5U3RyaW5nKHRpdGxlKSJ9fSwKb2JzZXJ2ZXJzOlsiX3VwZGF0ZUNoYXJ0KF9uYW1lVG9EYXRhU2VyaWVzKSIsIl9yZWZyZXNoRGF0YVNlcmllcyhfdGFnRmlsdGVyKSJdLHJlbG9hZCgpe3RoaXMuJC5sb2FkZXIucmVsb2FkKCl9LHJlZHJhdygpe3RoaXMuJC5sb2FkZXIucmVkcmF3KCl9LF90b2dnbGVFeHBhbmRlZCgpe3RoaXMuc2V0KCJfZXhwYW5kZWQiLCF0aGlzLl9leHBhbmRlZCk7dGhpcy5yZWRyYXcoKX0sX3RvZ2dsZUxvZ1NjYWxlKCl7dGhpcy5zZXQoIl9sb2dTY2FsZUFjdGl2ZSIsIXRoaXMuX2xvZ1NjYWxlQWN0aXZlKX0sX3Jlc2V0RG9tYWluKCl7Y29uc3QgYT10aGlzLiQubG9hZGVyO2EmJmEucmVzZXREb21haW4oKX0sX2NzdlVybChhLGMpe2lmKCFjKXJldHVybiIiO2E9dGhpcy5fZG93bmxvYWREYXRhVXJsKGEsYyk7cmV0dXJuIFFvLmFkZFBhcmFtcyhhLHtmb3JtYXQ6ImNzdiJ9KX0sX2pzb25VcmwoYSxjKXtpZighYylyZXR1cm4iIjthPXRoaXMuX2Rvd25sb2FkRGF0YVVybChhLGMpO3JldHVybiBRby5hZGRQYXJhbXMoYSwKe2Zvcm1hdDoianNvbiJ9KX0sX2Rvd25sb2FkRGF0YVVybChhLGMpe2E9YVtjXTthPXt0YWc6YS5nZXRUYWcoKSxydW46YS5nZXRSdW4oKX07cmV0dXJuIFFvLmFkZFBhcmFtcyhRby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvZG93bmxvYWRfZGF0YSIpLGEpfSxfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpe3JldHVybihhLGMsZCk9PntpZihkLnJlZ2V4X3ZhbGlkKXtjb25zdCBmPV8uY2xvbmUodGhpcy5fbmFtZVRvRGF0YVNlcmllcyk7Xy5mb3JPd24oZC50YWdfdG9fZXZlbnRzLChnLGwpPT57Y29uc3Qgaz1nLm1hcChwPT4oe3dhbGxfdGltZTpuZXcgRGF0ZSgxRTMqcFswXSksc3RlcDpwWzFdLHNjYWxhcjpwWzJdfSkpO2c9ZXAuZ2VuZXJhdGVEYXRhU2VyaWVzTmFtZShjLGwpO2NvbnN0IG49ZltnXTtuP24uc2V0RGF0YShrKTooXy5pc1VuZGVmaW5lZCh0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtjXSkmJih0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtjXT0KMCksbD1uZXcgZXAuRGF0YVNlcmllcyhjLGwsZyxrLCRvLlNZTUJPTFNfTElTVFt0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtjXV0pLGZbZ109bCx0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtjXT0odGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbY10rMSklJG8uU1lNQk9MU19MSVNULmxlbmd0aCl9KTt0aGlzLnNldCgiX25hbWVUb0RhdGFTZXJpZXMiLGYpfX19LF91cGRhdGVDaGFydChhKXtPYmplY3QuZW50cmllcyhhKS5mb3JFYWNoKChbYyxkXSk9Pnt0aGlzLiQubG9hZGVyLnNldFNlcmllc0RhdGEoYyxkLmdldERhdGEoKSl9KX0sX2NvbXB1dGVTZWxlY3RlZFJ1bnNTZXQoYSl7Y29uc3QgYz17fTtfLmZvckVhY2goYSxkPT57Y1tkXT0xfSk7cmV0dXJuIGN9LF9jb21wdXRlU2VyaWVzTmFtZXMoKXtjb25zdCBhPW5ldyBTZXQodGhpcy5ydW5zKTtyZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5fbmFtZVRvRGF0YVNlcmllcykuZmlsdGVyKChbLApjXSk9PmEuaGFzKGMucnVuKSkubWFwKChbY10pPT5jKX0sX2RldGVybWluZUNvbG9yKGEsYyl7cmV0dXJuIGEuc2NhbGUoYyl9LF9yZWZyZXNoRGF0YVNlcmllcygpe3RoaXMuc2V0KCJfbmFtZVRvRGF0YVNlcmllcyIse30pfSxfY3JlYXRlU3ltYm9sRnVuY3Rpb24oKXtyZXR1cm4gYT0+dGhpcy5fbmFtZVRvRGF0YVNlcmllc1thXS5nZXRTeW1ib2woKS5tZXRob2QoKX0sX2RldGVybWluZVN5bWJvbChhLGMpe3JldHVybiBhW2NdLmdldFN5bWJvbCgpLmNoYXJhY3Rlcn0sX2NvbXB1dGVUYWdGaWx0ZXIoYSl7cmV0dXJuIDE9PT1hLmxlbmd0aD9hWzBdOmEubWFwKGM9PiIoIitjKyIpIikuam9pbigifCIpfSxfZ2V0VG9nZ2xlTWF0Y2hlc0ljb24oYSl7cmV0dXJuIGE/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifSxfdG9nZ2xlTWF0Y2hlc09wZW4oKXt0aGlzLnNldCgiX21hdGNoZXNMaXN0T3BlbmVkIiwhdGhpcy5fbWF0Y2hlc0xpc3RPcGVuZWQpfSxfY29tcHV0ZVRpdGxlRGlzcGxheVN0cmluZyhhKXtyZXR1cm4gYXx8CiJ1bnRpdGxlZCJ9LF9tYXRjaExpc3RFbnRyeUNvbG9yVXBkYXRlZCgpe2NvbnN0IGE9dGhpcy4kJCgiI21hdGNoLWxpc3QtcmVwZWF0Iik7YSYmdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5tYXRjaC1saXN0LWVudHJ5IikuZm9yRWFjaChjPT57Y29uc3QgZD1hLml0ZW1Gb3JFbGVtZW50KGMpO2Muc3R5bGUuY29sb3I9dGhpcy5fZGV0ZXJtaW5lQ29sb3IodGhpcy5fY29sb3JTY2FsZSxkKX0pfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkL3RmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUW8uUmVxdWVzdE1hbmFnZXIoNTApfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFFvLkNhbmNlbGxlcn0sX3NlbGVjdGVkUnVuczpBcnJheSxfc2hvd0Rvd25sb2FkTGlua3M6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAsdmFsdWU6VG8uZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJfc2hvd0Rvd25sb2FkTGlua3MiLHtkZWZhdWx0VmFsdWU6ITEsdXNlTG9jYWxTdG9yYWdlOiEwfSksb2JzZXJ2ZXI6Il9zaG93RG93bmxvYWRMaW5rc09ic2VydmVyIn0sX3Ntb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVTbW9vdGhpbmdFbmFibGVkKF9zbW9vdGhpbmdXZWlnaHQpIn0sX3Ntb290aGluZ1dlaWdodDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwLHZhbHVlOlRvLmdldE51bWJlckluaXRpYWxpemVyKCJfc21vb3RoaW5nV2VpZ2h0IiwKe2RlZmF1bHRWYWx1ZTouNn0pLG9ic2VydmVyOiJfc21vb3RoaW5nV2VpZ2h0T2JzZXJ2ZXIifSxfaWdub3JlWU91dGxpZXJzOnt0eXBlOkJvb2xlYW4sdmFsdWU6VG8uZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJfaWdub3JlWU91dGxpZXJzIix7ZGVmYXVsdFZhbHVlOiEwLHVzZUxvY2FsU3RvcmFnZTohMH0pLG9ic2VydmVyOiJfaWdub3JlWU91dGxpZXJzT2JzZXJ2ZXIifSxfeFR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGVwIn0sX2xheW91dDpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX2xheW91dCkifSxfb3BlbmVkQ2F0ZWdvcmllczp7dHlwZTpPYmplY3R9LF9hY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxyZWFkT25seTohMH19LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7Y29uc3QgYT1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5zTGlzdGluZygpLGM9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKGQ9Pgp7ZC5jYW5jZWxsZWR8fCh0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsIWQudmFsdWUuY3VzdG9tX3NjYWxhcnMpLHRoaXMuX2RhdGFOb3RGb3VuZHx8dGhpcy5fcmV0cmlldmVMYXlvdXRBbmREYXRhKCkpfSk7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChhKS50aGVuKGMpfSxfcmVsb2FkQ2hhcnRzKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQsIHRmLWN1c3RvbS1zY2FsYXItbXVsdGktbGluZS1jaGFydC1jYXJkIikuZm9yRWFjaChhPT57YS5yZWxvYWQoKX0pfSxfcmV0cmlldmVMYXlvdXRBbmREYXRhKCl7Y29uc3QgYT1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvbGF5b3V0IiksYz10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoZD0+e2QuY2FuY2VsbGVkfHwodGhpcy5zZXQoIl9sYXlvdXQiLGQudmFsdWUpLHRoaXMuX2RhdGFOb3RGb3VuZHx8dGhpcy5fcmVsb2FkQ2hhcnRzKCkpfSk7CnRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihjKX0sX3Nob3dEb3dubG9hZExpbmtzT2JzZXJ2ZXI6VG8uZ2V0Qm9vbGVhbk9ic2VydmVyKCJfc2hvd0Rvd25sb2FkTGlua3MiLHtkZWZhdWx0VmFsdWU6ITEsdXNlTG9jYWxTdG9yYWdlOiEwfSksX3Ntb290aGluZ1dlaWdodE9ic2VydmVyOlRvLmdldE51bWJlck9ic2VydmVyKCJfc21vb3RoaW5nV2VpZ2h0Iix7ZGVmYXVsdFZhbHVlOi42fSksX2lnbm9yZVlPdXRsaWVyc09ic2VydmVyOlRvLmdldEJvb2xlYW5PYnNlcnZlcigiX2lnbm9yZVlPdXRsaWVycyIse2RlZmF1bHRWYWx1ZTohMCx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxfY29tcHV0ZVNtb290aGluZ0VuYWJsZWQoYSl7cmV0dXJuIDA8YX0sX21ha2VDYXRlZ29yaWVzKGEpe2lmKCFhLmNhdGVnb3J5KXJldHVybltdO2xldCBjPSExO3RoaXMuX29wZW5lZENhdGVnb3JpZXN8fChjPSEwLHRoaXMuX29wZW5lZENhdGVnb3JpZXM9e30pO3JldHVybiBhLmNhdGVnb3J5Lm1hcChkPT4Ke2MmJiFkLmNsb3NlZCYmKHRoaXMuX29wZW5lZENhdGVnb3JpZXNbZC50aXRsZV09ITApO3JldHVybntuYW1lOmQudGl0bGUsaXRlbXM6ZC5jaGFydCxtZXRhZGF0YTp7b3BlbmVkOiEhdGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1tkLnRpdGxlXX19fSl9LF9jYXRlZ29yeU9wZW5lZFRvZ2dsZWQoYSl7YT1hLnRhcmdldDthLm9wZW5lZD90aGlzLl9vcGVuZWRDYXRlZ29yaWVzW2EuY2F0ZWdvcnkubmFtZV09ITA6ZGVsZXRlIHRoaXMuX29wZW5lZENhdGVnb3JpZXNbYS5jYXRlZ29yeS5uYW1lXX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1pbWFnZS1kYXNoYm9hcmQvdGYtaW1hZ2UtbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWltYWdlLWxvYWRlciIscHJvcGVydGllczp7cnVuOlN0cmluZyx0YWc6U3RyaW5nLHNhbXBsZTpOdW1iZXIsb2ZTYW1wbGVzOk51bWJlcix0YWdNZXRhZGF0YTpPYmplY3QsX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0sYWN0dWFsU2l6ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sYnJpZ2h0bmVzc0FkanVzdG1lbnQ6e3R5cGU6TnVtYmVyLHZhbHVlOi41fSxjb250cmFzdFBlcmNlbnRhZ2U6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxfbWV0YWRhdGFDYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUW8uQ2FuY2VsbGVyfSxfaW1hZ2VDYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUW8uQ2FuY2VsbGVyfSxfc3RlcHM6e3R5cGU6QXJyYXksdmFsdWU6W10sbm90aWZ5OiEwfSxfc3RlcEluZGV4Ont0eXBlOk51bWJlciwKbm90aWZ5OiEwfSxfY3VycmVudFN0ZXA6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRTdGVwKF9zdGVwcywgX3N0ZXBJbmRleCkifSxfaGFzQXRMZWFzdE9uZVN0ZXA6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNBdExlYXN0T25lU3RlcChfc3RlcHMpIn0sX2hhc011bHRpcGxlU3RlcHM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNNdWx0aXBsZVN0ZXBzKF9zdGVwcykifSxfc3RlcFZhbHVlOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVTdGVwVmFsdWUoX2N1cnJlbnRTdGVwKSJ9LF9jdXJyZW50V2FsbFRpbWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRXYWxsVGltZShfY3VycmVudFN0ZXApIn0sX21heFN0ZXBJbmRleDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4U3RlcEluZGV4KF9zdGVwcykifSxfc2FtcGxlVGV4dDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlU2FtcGxlVGV4dChzYW1wbGUpIn0sCl9oYXNNdWx0aXBsZVNhbXBsZXM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNNdWx0aXBsZVNhbXBsZXMob2ZTYW1wbGVzKSJ9LF9pc0ltYWdlTG9hZGluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sb2JzZXJ2ZXJzOlsicmVsb2FkKHJ1biwgdGFnKSIsIl91cGRhdGVJbWFnZVVybChfY3VycmVudFN0ZXAsIGJyaWdodG5lc3NBZGp1c3RtZW50LCBjb250cmFzdFBlcmNlbnRhZ2UpIl0sX2NvbXB1dGVSdW5Db2xvcihhKXtyZXR1cm4gWG8ucnVuc0NvbG9yU2NhbGUoYSl9LF9jb21wdXRlSGFzQXRMZWFzdE9uZVN0ZXAoYSl7cmV0dXJuISFhJiYwPGEubGVuZ3RofSxfY29tcHV0ZUhhc011bHRpcGxlU3RlcHMoYSl7cmV0dXJuISFhJiYxPGEubGVuZ3RofSxfY29tcHV0ZUN1cnJlbnRTdGVwKGEsYyl7cmV0dXJuIGFbY118fG51bGx9LF9jb21wdXRlU3RlcFZhbHVlKGEpe3JldHVybiBhP2Euc3RlcDowfSxfY29tcHV0ZUN1cnJlbnRXYWxsVGltZShhKXtyZXR1cm4gYT8KZHAuZm9ybWF0RGF0ZShhLndhbGxfdGltZSk6IiJ9LF9jb21wdXRlTWF4U3RlcEluZGV4KGEpe3JldHVybiBhLmxlbmd0aC0xfSxfY29tcHV0ZVNhbXBsZVRleHQoYSl7cmV0dXJuYCR7YSsxfWB9LF9jb21wdXRlSGFzTXVsdGlwbGVTYW1wbGVzKGEpe3JldHVybiAxPGF9LF9nZXRBcmlhRXhwYW5kZWQoKXtyZXR1cm4gdGhpcy5hY3R1YWxTaXplPyJ0cnVlIjoiZmFsc2UifSxhdHRhY2hlZCgpe3RoaXMuX2F0dGFjaGVkPSEwO3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe2lmKHRoaXMuX2F0dGFjaGVkKXt0aGlzLl9tZXRhZGF0YUNhbmNlbGxlci5jYW5jZWxBbGwoKTt2YXIgYT1Rby5hZGRQYXJhbXMoUW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImltYWdlcyIsIi9pbWFnZXMiKSx7dGFnOnRoaXMudGFnLHJ1bjp0aGlzLnJ1bixzYW1wbGU6dGhpcy5zYW1wbGV9KSxjPXRoaXMuX21ldGFkYXRhQ2FuY2VsbGVyLmNhbmNlbGxhYmxlKGQ9PntkLmNhbmNlbGxlZHx8KGQ9ZC52YWx1ZS5tYXAodGhpcy5fY3JlYXRlU3RlcERhdHVtLmJpbmQodGhpcykpLAp0aGlzLnNldCgiX3N0ZXBzIixkKSx0aGlzLnNldCgiX3N0ZXBJbmRleCIsZC5sZW5ndGgtMSkpfSk7dGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGEpLnRoZW4oYyl9fSxfY3JlYXRlU3RlcERhdHVtKGEpe2xldCBjPVFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJpbWFnZXMiLCIvaW5kaXZpZHVhbEltYWdlIik7Yz1Rby5hZGRQYXJhbXMoYyx7dHM6YS53YWxsX3RpbWV9KTtjKz0iXHgyNiIrYS5xdWVyeTtyZXR1cm57d2lkdGg6YS53aWR0aCxoZWlnaHQ6YS5oZWlnaHQsd2FsbF90aW1lOm5ldyBEYXRlKDFFMyphLndhbGxfdGltZSksc3RlcDphLnN0ZXAsdXJsOmN9fSxfdXBkYXRlSW1hZ2VVcmwoYSxjLGQpe2lmKGEpe3ZhciBmPW5ldyBJbWFnZTt0aGlzLl9pbWFnZUNhbmNlbGxlci5jYW5jZWxBbGwoKTtmLm9ubG9hZD1mLm9uZXJyb3I9dGhpcy5faW1hZ2VDYW5jZWxsZXIuY2FuY2VsbGFibGUoZz0+e2cuY2FuY2VsbGVkfHwoZz10aGlzLiQkKCIjbWFpbi1pbWFnZS1jb250YWluZXIiKSwKZy5pbm5lckhUTUw9IiIsUG9seW1lci5kb20oZykuYXBwZW5kQ2hpbGQoZiksdGhpcy5zZXQoIl9pc0ltYWdlTG9hZGluZyIsITEpKX0pLmJpbmQodGhpcyk7Zi5zdHlsZS5maWx0ZXI9YGNvbnRyYXN0KCR7ZH0lKSBgO2Yuc3R5bGUuZmlsdGVyKz1gYnJpZ2h0bmVzcygke2N9KWA7dGhpcy5zZXQoIl9pc0ltYWdlTG9hZGluZyIsITApO2Yuc3JjPWEudXJsfX0sX2hhbmRsZVRhcCgpe3RoaXMuc2V0KCJhY3R1YWxTaXplIiwhdGhpcy5hY3R1YWxTaXplKX0sX3RvTG9jYWxlU3RyaW5nKGEpe3JldHVybiBhLnRvTG9jYWxlU3RyaW5nKCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1hZ2UtZGFzaGJvYXJkL3RmLWltYWdlLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1pbWFnZS1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19zZWxlY3RlZFJ1bnM6QXJyYXksX3J1blRvVGFnSW5mbzpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF9hY3R1YWxTaXplOkJvb2xlYW4sX2RlZmF1bHRCcmlnaHRuZXNzQWRqdXN0bWVudDp7dHlwZTpOdW1iZXIsdmFsdWU6MSxyZWFkT25seTohMH0sX2RlZmF1bHRDb250cmFzdFBlcmNlbnRhZ2U6e3R5cGU6TnVtYmVyLHZhbHVlOjEwMCxyZWFkT25seTohMH0sX2JyaWdodG5lc3NBZGp1c3RtZW50Ont0eXBlOk51bWJlcix2YWx1ZToxfSxfY29udHJhc3RQZXJjZW50YWdlOnt0eXBlOk51bWJlcix2YWx1ZToxMDB9LF90YWdGaWx0ZXI6U3RyaW5nLF9icmlnaHRuZXNzSXNEZWZhdWx0Ont0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQnJpZ2h0bmVzc0lzRGVmYXVsdChfYnJpZ2h0bmVzc0FkanVzdG1lbnQpIn0sX2NvbnRyYXN0SXNEZWZhdWx0Ont0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQ29udHJhc3RJc0RlZmF1bHQoX2NvbnRyYXN0UGVyY2VudGFnZSkifSwKX2NhdGVnb3JpZXNEb21SZWFkeTpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnSW5mbywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlciwgX2NhdGVnb3JpZXNEb21SZWFkeSkifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUW8uUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRJbWFnZXMoKX0pfSxfZmV0Y2hUYWdzKCl7Y29uc3QgYT1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiaW1hZ2VzIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChhKS50aGVuKGM9PntpZighXy5pc0VxdWFsKGMsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGQ9Xy5tYXBWYWx1ZXMoYyxmPT5PYmplY3Qua2V5cyhmKSk7ZD1Rby5nZXRUYWdzKGQpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwKMD09PWQubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsYyk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZEltYWdlcygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1pbWFnZS1sb2FkZXIiKS5mb3JFYWNoKGE9PnthLnJlbG9hZCgpfSl9LF9zaG91bGRPcGVuKGEpe3JldHVybiAyPj1hfSxfcmVzZXRCcmlnaHRuZXNzKCl7dGhpcy5fYnJpZ2h0bmVzc0FkanVzdG1lbnQ9dGhpcy5fZGVmYXVsdEJyaWdodG5lc3NBZGp1c3RtZW50fSxfcmVzZXRDb250cmFzdCgpe3RoaXMuX2NvbnRyYXN0UGVyY2VudGFnZT10aGlzLl9kZWZhdWx0Q29udHJhc3RQZXJjZW50YWdlfSxfY29tcHV0ZUJyaWdodG5lc3NJc0RlZmF1bHQoYSl7cmV0dXJuIGE9PT10aGlzLl9kZWZhdWx0QnJpZ2h0bmVzc0FkanVzdG1lbnR9LF9jb21wdXRlQ29udHJhc3RJc0RlZmF1bHQoYSl7cmV0dXJuIGE9PT10aGlzLl9kZWZhdWx0Q29udHJhc3RQZXJjZW50YWdlfSwKX21ha2VDYXRlZ29yaWVzKGEsYyxkKXtmdW5jdGlvbiBmKGwpe2NvbnN0IGs9YVtsLnJ1bl1bbC50YWddLnNhbXBsZXM7cmV0dXJuIF8ucmFuZ2UoaykubWFwKG49Pk9iamVjdC5hc3NpZ24oe30sbCx7c2FtcGxlOm4sb2ZTYW1wbGVzOmt9KSl9Y29uc3QgZz1fLm1hcFZhbHVlcyhhLGw9Pk9iamVjdC5rZXlzKGwpKTtyZXR1cm4gUm8uY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhnLGMsZCkubWFwKGw9Pk9iamVjdC5hc3NpZ24oe30sbCx7aXRlbXM6W10uY29uY2F0LmFwcGx5KFtdLGwuaXRlbXMubWFwKGYpKX0pKX0sX3RhZ01ldGFkYXRhKGEsYyxkKXtyZXR1cm4gYVtjXVtkXX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1hdWRpby1kYXNoYm9hcmQvdGYtYXVkaW8tbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWF1ZGlvLWxvYWRlciIscHJvcGVydGllczp7cnVuOlN0cmluZyx0YWc6U3RyaW5nLHNhbXBsZTpOdW1iZXIsdG90YWxTYW1wbGVzOk51bWJlcix0YWdNZXRhZGF0YTpPYmplY3QsX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0scmVxdWVzdE1hbmFnZXI6T2JqZWN0LF9tZXRhZGF0YUNhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBRby5DYW5jZWxsZXJ9LF9zdGVwczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9zdGVwSW5kZXg6TnVtYmVyLF9oYXNBdExlYXN0T25lU3RlcDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc0F0TGVhc3RPbmVTdGVwKF9zdGVwcykifSxfaGFzTXVsdGlwbGVTdGVwczp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlU3RlcHMoX3N0ZXBzKSJ9LF9jdXJyZW50RGF0dW06e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnREYXR1bShfc3RlcHMsIF9zdGVwSW5kZXgpIn0sCl9tYXhTdGVwSW5kZXg6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZU1heFN0ZXBJbmRleChfc3RlcHMpIn0sX3NhbXBsZVRleHQ6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVNhbXBsZVRleHQoc2FtcGxlKSJ9LF9oYXNNdWx0aXBsZVNhbXBsZXM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNNdWx0aXBsZVNhbXBsZXModG90YWxTYW1wbGVzKSJ9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVuLCB0YWcpIl0sX2NvbXB1dGVSdW5Db2xvcihhKXtyZXR1cm4gWG8ucnVuc0NvbG9yU2NhbGUoYSl9LF9jb21wdXRlSGFzQXRMZWFzdE9uZVN0ZXAoYSl7cmV0dXJuISFhJiYwPGEubGVuZ3RofSxfY29tcHV0ZUhhc011bHRpcGxlU3RlcHMoYSl7cmV0dXJuISFhJiYxPGEubGVuZ3RofSxfY29tcHV0ZU1heFN0ZXBJbmRleChhKXtyZXR1cm4gYS5sZW5ndGgtMX0sX2NvbXB1dGVDdXJyZW50RGF0dW0oYSxjKXtyZXR1cm4gYVtjXX0sX2NvbXB1dGVTYW1wbGVUZXh0KGEpe3JldHVybmAke2ErCjF9YH0sX2NvbXB1dGVIYXNNdWx0aXBsZVNhbXBsZXMoYSl7cmV0dXJuIDE8YX0sYXR0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMDt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXtpZih0aGlzLl9hdHRhY2hlZCl7dGhpcy5fbWV0YWRhdGFDYW5jZWxsZXIuY2FuY2VsQWxsKCk7dmFyIGE9UW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImF1ZGlvIiwiL2F1ZGlvIixuZXcgVVJMU2VhcmNoUGFyYW1zKHt0YWc6dGhpcy50YWcscnVuOnRoaXMucnVuLHNhbXBsZTp0aGlzLnNhbXBsZX0pKSxjPXRoaXMuX21ldGFkYXRhQ2FuY2VsbGVyLmNhbmNlbGxhYmxlKGQ9PntkLmNhbmNlbGxlZHx8KGQ9ZC52YWx1ZS5tYXAodGhpcy5fY3JlYXRlU3RlcERhdHVtLmJpbmQodGhpcykpLHRoaXMuc2V0KCJfc3RlcHMiLGQpLHRoaXMuc2V0KCJfc3RlcEluZGV4IixkLmxlbmd0aC0xKSl9KTt0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihjKX19LF9jcmVhdGVTdGVwRGF0dW0oYSl7dmFyIGM9Cm5ldyBVUkxTZWFyY2hQYXJhbXMoYS5xdWVyeSk7Yy5hcHBlbmQoInRzIixhLndhbGxfdGltZSk7Yz1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYXVkaW8iLCIvaW5kaXZpZHVhbEF1ZGlvIixjKTtyZXR1cm57d2FsbF90aW1lOmRwLmZvcm1hdERhdGUobmV3IERhdGUoMUUzKmEud2FsbF90aW1lKSksc3RlcDphLnN0ZXAsbGFiZWw6YS5sYWJlbCxjb250ZW50VHlwZTphLmNvbnRlbnRUeXBlLHVybDpjfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1hdWRpby1kYXNoYm9hcmQvdGYtYXVkaW8tZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWF1ZGlvLWRhc2hib2FyZCIscHJvcGVydGllczp7X3NlbGVjdGVkUnVuczpBcnJheSxfcnVuVG9UYWdJbmZvOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnSW5mbywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlcikifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUW8uUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRBdWRpbygpfSl9LF9mZXRjaFRhZ3MoKXtjb25zdCBhPVFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJhdWRpbyIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihjPT57aWYoIV8uaXNFcXVhbChjLAp0aGlzLl9ydW5Ub1RhZ0luZm8pKXt2YXIgZD1fLm1hcFZhbHVlcyhjLGY9Pk9iamVjdC5rZXlzKGYpKTtkPVFvLmdldFRhZ3MoZCk7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1kLmxlbmd0aCk7dGhpcy5zZXQoIl9ydW5Ub1RhZ0luZm8iLGMpfX0pfSxfcmVsb2FkQXVkaW8oKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtYXVkaW8tbG9hZGVyIikuZm9yRWFjaChhPT57YS5yZWxvYWQoKX0pfSxfc2hvdWxkT3BlbihhKXtyZXR1cm4gMj49YX0sX21ha2VDYXRlZ29yaWVzKGEsYyxkKXtmdW5jdGlvbiBmKGwpe2NvbnN0IGs9YVtsLnJ1bl1bbC50YWddLnNhbXBsZXM7cmV0dXJuIF8ucmFuZ2UoaykubWFwKG49Pk9iamVjdC5hc3NpZ24oe30sbCx7c2FtcGxlOm4sdG90YWxTYW1wbGVzOmt9KSl9Y29uc3QgZz1fLm1hcFZhbHVlcyhhLGw9Pk9iamVjdC5rZXlzKGwpKTtyZXR1cm4gUm8uY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhnLGMsZCkubWFwKGw9Pk9iamVjdC5hc3NpZ24oe30sCmwse2l0ZW1zOltdLmNvbmNhdC5hcHBseShbXSxsLml0ZW1zLm1hcChmKSl9KSl9LF90YWdNZXRhZGF0YShhLGMsZCl7cmV0dXJuIGFbY11bZF19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYS9pcm9uLWF1dG9ncm93LXRleHRhcmVhLmh0bWwuanMKUG9seW1lcih7aXM6Imlyb24tYXV0b2dyb3ctdGV4dGFyZWEiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvcixQb2x5bWVyLklyb25Db250cm9sU3RhdGVdLHByb3BlcnRpZXM6e3ZhbHVlOntvYnNlcnZlcjoiX3ZhbHVlQ2hhbmdlZCIsdHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxiaW5kVmFsdWU6e29ic2VydmVyOiJfYmluZFZhbHVlQ2hhbmdlZCIsdHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxyb3dzOnt0eXBlOk51bWJlcix2YWx1ZToxLG9ic2VydmVyOiJfdXBkYXRlQ2FjaGVkIn0sbWF4Um93czp7dHlwZTpOdW1iZXIsdmFsdWU6MCxvYnNlcnZlcjoiX3VwZGF0ZUNhY2hlZCJ9LGF1dG9jb21wbGV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im9mZiJ9LGF1dG9mb2N1czp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbnB1dG1vZGU6e3R5cGU6U3RyaW5nfSxwbGFjZWhvbGRlcjp7dHlwZTpTdHJpbmd9LHJlYWRvbmx5Ont0eXBlOlN0cmluZ30scmVxdWlyZWQ6e3R5cGU6Qm9vbGVhbn0sCm1pbmxlbmd0aDp7dHlwZTpOdW1iZXJ9LG1heGxlbmd0aDp7dHlwZTpOdW1iZXJ9LGxhYmVsOnt0eXBlOlN0cmluZ319LGxpc3RlbmVyczp7aW5wdXQ6Il9vbklucHV0In0sZ2V0IHRleHRhcmVhKCl7cmV0dXJuIHRoaXMuJC50ZXh0YXJlYX0sZ2V0IHNlbGVjdGlvblN0YXJ0KCl7cmV0dXJuIHRoaXMuJC50ZXh0YXJlYS5zZWxlY3Rpb25TdGFydH0sZ2V0IHNlbGVjdGlvbkVuZCgpe3JldHVybiB0aGlzLiQudGV4dGFyZWEuc2VsZWN0aW9uRW5kfSxzZXQgc2VsZWN0aW9uU3RhcnQoYSl7dGhpcy4kLnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0PWF9LHNldCBzZWxlY3Rpb25FbmQoYSl7dGhpcy4kLnRleHRhcmVhLnNlbGVjdGlvbkVuZD1hfSxhdHRhY2hlZDpmdW5jdGlvbigpe25hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQKD86W29hXWR8aG9uZSkvKSYmKHRoaXMuJC50ZXh0YXJlYS5zdHlsZS5tYXJnaW5MZWZ0PSItM3B4Iil9LHZhbGlkYXRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kLnRleHRhcmVhLnZhbGlkaXR5LnZhbGlkOwphJiYodGhpcy5yZXF1aXJlZCYmIiI9PT10aGlzLnZhbHVlP2E9ITE6dGhpcy5oYXNWYWxpZGF0b3IoKSYmKGE9UG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvci52YWxpZGF0ZS5jYWxsKHRoaXMsdGhpcy52YWx1ZSkpKTt0aGlzLmludmFsaWQ9IWE7dGhpcy5maXJlKCJpcm9uLWlucHV0LXZhbGlkYXRlIik7cmV0dXJuIGF9LF9iaW5kVmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMudmFsdWU9YX0sX3ZhbHVlQ2hhbmdlZDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnRleHRhcmVhO2MmJihjLnZhbHVlIT09YSYmKGMudmFsdWU9YXx8MD09PWE/YToiIiksdGhpcy5iaW5kVmFsdWU9YSx0aGlzLiQubWlycm9yLmlubmVySFRNTD10aGlzLl92YWx1ZUZvck1pcnJvcigpLHRoaXMuZmlyZSgiYmluZC12YWx1ZS1jaGFuZ2VkIix7dmFsdWU6dGhpcy5iaW5kVmFsdWV9KSl9LF9vbklucHV0OmZ1bmN0aW9uKGEpe3ZhciBjPVBvbHltZXIuZG9tKGEpLnBhdGg7dGhpcy52YWx1ZT1jP2NbMF0udmFsdWU6CmEudGFyZ2V0LnZhbHVlfSxfY29uc3RyYWluOmZ1bmN0aW9uKGEpe2E9YXx8WyIiXTtmb3IoYT0wPHRoaXMubWF4Um93cyYmYS5sZW5ndGg+dGhpcy5tYXhSb3dzP2Euc2xpY2UoMCx0aGlzLm1heFJvd3MpOmEuc2xpY2UoMCk7MDx0aGlzLnJvd3MmJmEubGVuZ3RoPHRoaXMucm93czspYS5wdXNoKCIiKTtyZXR1cm4gYS5qb2luKCJceDNjYnIvXHgzZSIpKyJceDI2IzE2MDsifSxfdmFsdWVGb3JNaXJyb3I6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnRleHRhcmVhO2lmKGEpcmV0dXJuIHRoaXMudG9rZW5zPWEmJmEudmFsdWU/YS52YWx1ZS5yZXBsYWNlKC8mL2dtLCJceDI2YW1wOyIpLnJlcGxhY2UoLyIvZ20sIlx4MjZxdW90OyIpLnJlcGxhY2UoLycvZ20sIlx4MjYjMzk7IikucmVwbGFjZSgvPC9nbSwiXHgyNmx0OyIpLnJlcGxhY2UoLz4vZ20sIlx4MjZndDsiKS5zcGxpdCgiXG4iKTpbIiJdLHRoaXMuX2NvbnN0cmFpbih0aGlzLnRva2Vucyl9LF91cGRhdGVDYWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLiQubWlycm9yLmlubmVySFRNTD0KdGhpcy5fY29uc3RyYWluKHRoaXMudG9rZW5zKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1pbnB1dC9wYXBlci10ZXh0YXJlYS5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10ZXh0YXJlYSIsYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVySW5wdXRCZWhhdmlvcixQb2x5bWVyLklyb25Gb3JtRWxlbWVudEJlaGF2aW9yXSxwcm9wZXJ0aWVzOntfYXJpYUxhYmVsbGVkQnk6e29ic2VydmVyOiJfYXJpYUxhYmVsbGVkQnlDaGFuZ2VkIix0eXBlOlN0cmluZ30sX2FyaWFEZXNjcmliZWRCeTp7b2JzZXJ2ZXI6Il9hcmlhRGVzY3JpYmVkQnlDaGFuZ2VkIix0eXBlOlN0cmluZ30sdmFsdWU6e3R5cGU6U3RyaW5nfSxyb3dzOnt0eXBlOk51bWJlcix2YWx1ZToxfSxtYXhSb3dzOnt0eXBlOk51bWJlcix2YWx1ZTowfX0sZ2V0IHNlbGVjdGlvblN0YXJ0KCl7cmV0dXJuIHRoaXMuJC5pbnB1dC50ZXh0YXJlYS5zZWxlY3Rpb25TdGFydH0sc2V0IHNlbGVjdGlvblN0YXJ0KGEpe3RoaXMuJC5pbnB1dC50ZXh0YXJlYS5zZWxlY3Rpb25TdGFydD1hfSxnZXQgc2VsZWN0aW9uRW5kKCl7cmV0dXJuIHRoaXMuJC5pbnB1dC50ZXh0YXJlYS5zZWxlY3Rpb25FbmR9LApzZXQgc2VsZWN0aW9uRW5kKGEpe3RoaXMuJC5pbnB1dC50ZXh0YXJlYS5zZWxlY3Rpb25FbmQ9YX0sX2FyaWFMYWJlbGxlZEJ5Q2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLl9mb2N1c2FibGVFbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5IixhKX0sX2FyaWFEZXNjcmliZWRCeUNoYW5nZWQ6ZnVuY3Rpb24oYSl7dGhpcy5fZm9jdXNhYmxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoImFyaWEtZGVzY3JpYmVkYnkiLGEpfSxnZXQgX2ZvY3VzYWJsZUVsZW1lbnQoKXtyZXR1cm4gdGhpcy5pbnB1dEVsZW1lbnQudGV4dGFyZWF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItdG9hc3QvcGFwZXItdG9hc3QuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYT1udWxsO1BvbHltZXIoe2lzOiJwYXBlci10b2FzdCIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JdLHByb3BlcnRpZXM6e2ZpdEludG86e3R5cGU6T2JqZWN0LHZhbHVlOndpbmRvdyxvYnNlcnZlcjoiX29uRml0SW50b0NoYW5nZWQifSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJsZWZ0In0sdmVydGljYWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImJvdHRvbSJ9LGR1cmF0aW9uOnt0eXBlOk51bWJlcix2YWx1ZTozRTN9LHRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxub0NhbmNlbE9uT3V0c2lkZUNsaWNrOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LG5vQXV0b0ZvY3VzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9fSxsaXN0ZW5lcnM6e3RyYW5zaXRpb25lbmQ6Il9fb25UcmFuc2l0aW9uRW5kIn0sZ2V0IHZpc2libGUoKXtQb2x5bWVyLkJhc2UuX3dhcm4oImB2aXNpYmxlYCBpcyBkZXByZWNhdGVkLCB1c2UgYG9wZW5lZGAgaW5zdGVhZCIpOwpyZXR1cm4gdGhpcy5vcGVuZWR9LGdldCBfY2FuQXV0b0Nsb3NlKCl7cmV0dXJuIDA8dGhpcy5kdXJhdGlvbiYmSW5maW5pdHkhPT10aGlzLmR1cmF0aW9ufSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXV0b0Nsb3NlPW51bGw7UG9seW1lci5Jcm9uQTExeUFubm91bmNlci5yZXF1ZXN0QXZhaWxhYmlsaXR5KCl9LHNob3c6ZnVuY3Rpb24oYyl7InN0cmluZyI9PXR5cGVvZiBjJiYoYz17dGV4dDpjfSk7Zm9yKHZhciBkIGluIGMpMD09PWQuaW5kZXhPZigiXyIpP1BvbHltZXIuQmFzZS5fd2FybignVGhlIHByb3BlcnR5ICInK2QrJyIgaXMgcHJpdmF0ZSBhbmQgd2FzIG5vdCBzZXQuJyk6ZCBpbiB0aGlzP3RoaXNbZF09Y1tkXTpQb2x5bWVyLkJhc2UuX3dhcm4oJ1RoZSBwcm9wZXJ0eSAiJytkKyciIGlzIG5vdCB2YWxpZC4nKTt0aGlzLm9wZW4oKX0saGlkZTpmdW5jdGlvbigpe3RoaXMuY2xvc2UoKX0sX19vblRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oYyl7YyYmYy50YXJnZXQ9PT0KdGhpcyYmIm9wYWNpdHkiPT09Yy5wcm9wZXJ0eU5hbWUmJih0aGlzLm9wZW5lZD90aGlzLl9maW5pc2hSZW5kZXJPcGVuZWQoKTp0aGlzLl9maW5pc2hSZW5kZXJDbG9zZWQoKSl9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuX2F1dG9DbG9zZSYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fYXV0b0Nsb3NlKSx0aGlzLl9hdXRvQ2xvc2U9bnVsbCk7dGhpcy5vcGVuZWQ/KGEmJmEhPT10aGlzJiZhLmNsb3NlKCksYT10aGlzLHRoaXMuZmlyZSgiaXJvbi1hbm5vdW5jZSIse3RleHQ6dGhpcy50ZXh0fSksdGhpcy5fY2FuQXV0b0Nsb3NlJiYodGhpcy5fYXV0b0Nsb3NlPXRoaXMuYXN5bmModGhpcy5jbG9zZSx0aGlzLmR1cmF0aW9uKSkpOmE9PT10aGlzJiYoYT1udWxsKTtQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JJbXBsLl9vcGVuZWRDaGFuZ2VkLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sX3JlbmRlck9wZW5lZDpmdW5jdGlvbigpe3RoaXMuY2xhc3NMaXN0LmFkZCgicGFwZXItdG9hc3Qtb3BlbiIpfSwKX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpe3RoaXMuY2xhc3NMaXN0LnJlbW92ZSgicGFwZXItdG9hc3Qtb3BlbiIpfSxfb25GaXRJbnRvQ2hhbmdlZDpmdW5jdGlvbihjKXt0aGlzLnBvc2l0aW9uVGFyZ2V0PWN9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXRvZ2dsZS1idXR0b24vcGFwZXItdG9nZ2xlLWJ1dHRvbi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10b2dnbGUtYnV0dG9uIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9yXSxob3N0QXR0cmlidXRlczp7cm9sZToiYnV0dG9uIiwiYXJpYS1wcmVzc2VkIjoiZmFsc2UiLHRhYmluZGV4OjB9LHByb3BlcnRpZXM6e30sbGlzdGVuZXJzOnt0cmFjazoiX29udHJhY2sifSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLGZ1bmN0aW9uKCl7UG9seW1lci5HZXN0dXJlcy5zZXRUb3VjaEFjdGlvbih0aGlzLCJwYW4teSIpfSl9LF9vbnRyYWNrOmZ1bmN0aW9uKGEpe2E9YS5kZXRhaWw7InN0YXJ0Ij09PWEuc3RhdGU/dGhpcy5fdHJhY2tTdGFydChhKToidHJhY2siPT09YS5zdGF0ZT90aGlzLl90cmFja01vdmUoYSk6ImVuZCI9PT1hLnN0YXRlJiZ0aGlzLl90cmFja0VuZChhKX0sX3RyYWNrU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl93aWR0aD10aGlzLiQudG9nZ2xlQmFyLm9mZnNldFdpZHRoLwoyO3RoaXMuX3RyYWNrQ2hlY2tlZD10aGlzLmNoZWNrZWQ7dGhpcy4kLnRvZ2dsZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCJkcmFnZ2luZyIpfSxfdHJhY2tNb3ZlOmZ1bmN0aW9uKGEpe2E9YS5keDt0aGlzLl94PU1hdGgubWluKHRoaXMuX3dpZHRoLE1hdGgubWF4KDAsdGhpcy5fdHJhY2tDaGVja2VkP3RoaXMuX3dpZHRoK2E6YSkpO3RoaXMudHJhbnNsYXRlM2QodGhpcy5feCsicHgiLDAsMCx0aGlzLiQudG9nZ2xlQnV0dG9uKTt0aGlzLl91c2VyQWN0aXZhdGUodGhpcy5feD50aGlzLl93aWR0aC8yKX0sX3RyYWNrRW5kOmZ1bmN0aW9uKCl7dGhpcy4kLnRvZ2dsZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCJkcmFnZ2luZyIpO3RoaXMudHJhbnNmb3JtKCIiLHRoaXMuJC50b2dnbGVCdXR0b24pfSxfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7dGhpcy5fcmlwcGxlQ29udGFpbmVyPXRoaXMuJC50b2dnbGVCdXR0b247dmFyIGE9UG9seW1lci5QYXBlclJpcHBsZUJlaGF2aW9yLl9jcmVhdGVSaXBwbGUoKTsKYS5pZD0iaW5rIjthLnNldEF0dHJpYnV0ZSgicmVjZW50ZXJzIiwiIik7YS5jbGFzc0xpc3QuYWRkKCJjaXJjbGUiLCJ0b2dnbGUtaW5rIik7cmV0dXJuIGF9fSk7CgooZnVuY3Rpb24oZil7aWYodHlwZW9mIGV4cG9ydHM9PT0ib2JqZWN0IiYmdHlwZW9mIG1vZHVsZSE9PSJ1bmRlZmluZWQiKW1vZHVsZS5leHBvcnRzPWYoKTtlbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKWRlZmluZShbXSxmKTtlbHNle3ZhciBnO2lmKHR5cGVvZiB3aW5kb3chPT0idW5kZWZpbmVkIilnPXdpbmRvdztlbHNlIGlmKHR5cGVvZiBnbG9iYWwhPT0idW5kZWZpbmVkIilnPWdsb2JhbDtlbHNlIGlmKHR5cGVvZiBzZWxmIT09InVuZGVmaW5lZCIpZz1zZWxmO2Vsc2UgZz10aGlzO2cuZ3JhcGhsaWI9ZigpfX0pKGZ1bmN0aW9uKCl7dmFyIGRlZmluZSxtb2R1bGUsZXhwb3J0cztyZXR1cm4gZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PSJmdW5jdGlvbiImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTsKdmFyIGY9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpO3Rocm93IGYuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsZjt9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSh7MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGxpYj1yZXF1aXJlKCIuL2xpYiIpO21vZHVsZS5leHBvcnRzPXtHcmFwaDpsaWIuR3JhcGgsanNvbjpyZXF1aXJlKCIuL2xpYi9qc29uIiksYWxnOnJlcXVpcmUoIi4vbGliL2FsZyIpLHZlcnNpb246bGliLnZlcnNpb259fSx7Ii4vbGliIjoxNywiLi9saWIvYWxnIjo4LCIuL2xpYi9qc29uIjoxOH1dLAoyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1jb21wb25lbnRzO2Z1bmN0aW9uIGNvbXBvbmVudHMoZyl7dmFyIHZpc2l0ZWQ9e30sY21wdHM9W10sY21wdDtmdW5jdGlvbiBkZnModil7aWYoXy5oYXModmlzaXRlZCx2KSlyZXR1cm47dmlzaXRlZFt2XT10cnVlO2NtcHQucHVzaCh2KTtfLmVhY2goZy5zdWNjZXNzb3JzKHYpLGRmcyk7Xy5lYWNoKGcucHJlZGVjZXNzb3JzKHYpLGRmcyl9Xy5lYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtjbXB0PVtdO2Rmcyh2KTtpZihjbXB0Lmxlbmd0aCljbXB0cy5wdXNoKGNtcHQpfSk7cmV0dXJuIGNtcHRzfX0seyIuLi9sb2Rhc2giOjE5fV0sMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9ZGZzO2Z1bmN0aW9uIGRmcyhnLHZzLG9yZGVyKXtpZighXy5pc0FycmF5KHZzKSl2cz0KW3ZzXTt2YXIgbmF2aWdhdGlvbj0oZy5pc0RpcmVjdGVkKCk/Zy5zdWNjZXNzb3JzOmcubmVpZ2hib3JzKS5iaW5kKGcpO3ZhciBhY2M9W10sdmlzaXRlZD17fTtfLmVhY2godnMsZnVuY3Rpb24odil7aWYoIWcuaGFzTm9kZSh2KSl0aHJvdyBuZXcgRXJyb3IoIkdyYXBoIGRvZXMgbm90IGhhdmUgbm9kZTogIit2KTtkb0RmcyhnLHYsb3JkZXI9PT0icG9zdCIsdmlzaXRlZCxuYXZpZ2F0aW9uLGFjYyl9KTtyZXR1cm4gYWNjfWZ1bmN0aW9uIGRvRGZzKGcsdixwb3N0b3JkZXIsdmlzaXRlZCxuYXZpZ2F0aW9uLGFjYyl7aWYoIV8uaGFzKHZpc2l0ZWQsdikpe3Zpc2l0ZWRbdl09dHJ1ZTtpZighcG9zdG9yZGVyKWFjYy5wdXNoKHYpO18uZWFjaChuYXZpZ2F0aW9uKHYpLGZ1bmN0aW9uKHcpe2RvRGZzKGcsdyxwb3N0b3JkZXIsdmlzaXRlZCxuYXZpZ2F0aW9uLGFjYyl9KTtpZihwb3N0b3JkZXIpYWNjLnB1c2godil9fX0seyIuLi9sb2Rhc2giOjE5fV0sNDpbZnVuY3Rpb24ocmVxdWlyZSwKbW9kdWxlLGV4cG9ydHMpe3ZhciBkaWprc3RyYT1yZXF1aXJlKCIuL2RpamtzdHJhIiksXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1kaWprc3RyYUFsbDtmdW5jdGlvbiBkaWprc3RyYUFsbChnLHdlaWdodEZ1bmMsZWRnZUZ1bmMpe3JldHVybiBfLnRyYW5zZm9ybShnLm5vZGVzKCksZnVuY3Rpb24oYWNjLHYpe2FjY1t2XT1kaWprc3RyYShnLHYsd2VpZ2h0RnVuYyxlZGdlRnVuYyl9LHt9KX19LHsiLi4vbG9kYXNoIjoxOSwiLi9kaWprc3RyYSI6NX1dLDU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLFByaW9yaXR5UXVldWU9cmVxdWlyZSgiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZSIpO21vZHVsZS5leHBvcnRzPWRpamtzdHJhO3ZhciBERUZBVUxUX1dFSUdIVF9GVU5DPV8uY29uc3RhbnQoMSk7ZnVuY3Rpb24gZGlqa3N0cmEoZyxzb3VyY2Usd2VpZ2h0Rm4sZWRnZUZuKXtyZXR1cm4gcnVuRGlqa3N0cmEoZywKU3RyaW5nKHNvdXJjZSksd2VpZ2h0Rm58fERFRkFVTFRfV0VJR0hUX0ZVTkMsZWRnZUZufHxmdW5jdGlvbih2KXtyZXR1cm4gZy5vdXRFZGdlcyh2KX0pfWZ1bmN0aW9uIHJ1bkRpamtzdHJhKGcsc291cmNlLHdlaWdodEZuLGVkZ2VGbil7dmFyIHJlc3VsdHM9e30scHE9bmV3IFByaW9yaXR5UXVldWUsdix2RW50cnk7dmFyIHVwZGF0ZU5laWdoYm9ycz1mdW5jdGlvbihlZGdlKXt2YXIgdz1lZGdlLnYhPT12P2VkZ2UudjplZGdlLncsd0VudHJ5PXJlc3VsdHNbd10sd2VpZ2h0PXdlaWdodEZuKGVkZ2UpLGRpc3RhbmNlPXZFbnRyeS5kaXN0YW5jZSt3ZWlnaHQ7aWYod2VpZ2h0PDApdGhyb3cgbmV3IEVycm9yKCJkaWprc3RyYSBkb2VzIG5vdCBhbGxvdyBuZWdhdGl2ZSBlZGdlIHdlaWdodHMuICIrIkJhZCBlZGdlOiAiK2VkZ2UrIiBXZWlnaHQ6ICIrd2VpZ2h0KTtpZihkaXN0YW5jZTx3RW50cnkuZGlzdGFuY2Upe3dFbnRyeS5kaXN0YW5jZT1kaXN0YW5jZTt3RW50cnkucHJlZGVjZXNzb3I9CnY7cHEuZGVjcmVhc2UodyxkaXN0YW5jZSl9fTtnLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbih2KXt2YXIgZGlzdGFuY2U9dj09PXNvdXJjZT8wOk51bWJlci5QT1NJVElWRV9JTkZJTklUWTtyZXN1bHRzW3ZdPXtkaXN0YW5jZTpkaXN0YW5jZX07cHEuYWRkKHYsZGlzdGFuY2UpfSk7d2hpbGUocHEuc2l6ZSgpPjApe3Y9cHEucmVtb3ZlTWluKCk7dkVudHJ5PXJlc3VsdHNbdl07aWYodkVudHJ5LmRpc3RhbmNlPT09TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKWJyZWFrO2VkZ2VGbih2KS5mb3JFYWNoKHVwZGF0ZU5laWdoYm9ycyl9cmV0dXJuIHJlc3VsdHN9fSx7Ii4uL2RhdGEvcHJpb3JpdHktcXVldWUiOjE1LCIuLi9sb2Rhc2giOjE5fV0sNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksdGFyamFuPXJlcXVpcmUoIi4vdGFyamFuIik7bW9kdWxlLmV4cG9ydHM9ZmluZEN5Y2xlcztmdW5jdGlvbiBmaW5kQ3ljbGVzKGcpe3JldHVybiBfLmZpbHRlcih0YXJqYW4oZyksCmZ1bmN0aW9uKGNtcHQpe3JldHVybiBjbXB0Lmxlbmd0aD4xfHxjbXB0Lmxlbmd0aD09PTEmJmcuaGFzRWRnZShjbXB0WzBdLGNtcHRbMF0pfSl9fSx7Ii4uL2xvZGFzaCI6MTksIi4vdGFyamFuIjoxM31dLDc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWZsb3lkV2Fyc2hhbGw7dmFyIERFRkFVTFRfV0VJR0hUX0ZVTkM9Xy5jb25zdGFudCgxKTtmdW5jdGlvbiBmbG95ZFdhcnNoYWxsKGcsd2VpZ2h0Rm4sZWRnZUZuKXtyZXR1cm4gcnVuRmxveWRXYXJzaGFsbChnLHdlaWdodEZufHxERUZBVUxUX1dFSUdIVF9GVU5DLGVkZ2VGbnx8ZnVuY3Rpb24odil7cmV0dXJuIGcub3V0RWRnZXModil9KX1mdW5jdGlvbiBydW5GbG95ZFdhcnNoYWxsKGcsd2VpZ2h0Rm4sZWRnZUZuKXt2YXIgcmVzdWx0cz17fSxub2Rlcz1nLm5vZGVzKCk7bm9kZXMuZm9yRWFjaChmdW5jdGlvbih2KXtyZXN1bHRzW3ZdPQp7fTtyZXN1bHRzW3ZdW3ZdPXtkaXN0YW5jZTowfTtub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHcpe2lmKHYhPT13KXJlc3VsdHNbdl1bd109e2Rpc3RhbmNlOk51bWJlci5QT1NJVElWRV9JTkZJTklUWX19KTtlZGdlRm4odikuZm9yRWFjaChmdW5jdGlvbihlZGdlKXt2YXIgdz1lZGdlLnY9PT12P2VkZ2UudzplZGdlLnYsZD13ZWlnaHRGbihlZGdlKTtyZXN1bHRzW3ZdW3ddPXtkaXN0YW5jZTpkLHByZWRlY2Vzc29yOnZ9fSl9KTtub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGspe3ZhciByb3dLPXJlc3VsdHNba107bm9kZXMuZm9yRWFjaChmdW5jdGlvbihpKXt2YXIgcm93ST1yZXN1bHRzW2ldO25vZGVzLmZvckVhY2goZnVuY3Rpb24oail7dmFyIGlrPXJvd0lba107dmFyIGtqPXJvd0tbal07dmFyIGlqPXJvd0lbal07dmFyIGFsdERpc3RhbmNlPWlrLmRpc3RhbmNlK2tqLmRpc3RhbmNlO2lmKGFsdERpc3RhbmNlPGlqLmRpc3RhbmNlKXtpai5kaXN0YW5jZT1hbHREaXN0YW5jZTtpai5wcmVkZWNlc3Nvcj0Ka2oucHJlZGVjZXNzb3J9fSl9KX0pO3JldHVybiByZXN1bHRzfX0seyIuLi9sb2Rhc2giOjE5fV0sODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9e2NvbXBvbmVudHM6cmVxdWlyZSgiLi9jb21wb25lbnRzIiksZGlqa3N0cmE6cmVxdWlyZSgiLi9kaWprc3RyYSIpLGRpamtzdHJhQWxsOnJlcXVpcmUoIi4vZGlqa3N0cmEtYWxsIiksZmluZEN5Y2xlczpyZXF1aXJlKCIuL2ZpbmQtY3ljbGVzIiksZmxveWRXYXJzaGFsbDpyZXF1aXJlKCIuL2Zsb3lkLXdhcnNoYWxsIiksaXNBY3ljbGljOnJlcXVpcmUoIi4vaXMtYWN5Y2xpYyIpLHBvc3RvcmRlcjpyZXF1aXJlKCIuL3Bvc3RvcmRlciIpLHByZW9yZGVyOnJlcXVpcmUoIi4vcHJlb3JkZXIiKSxwcmltOnJlcXVpcmUoIi4vcHJpbSIpLHRhcmphbjpyZXF1aXJlKCIuL3RhcmphbiIpLHRvcHNvcnQ6cmVxdWlyZSgiLi90b3Bzb3J0Iil9fSx7Ii4vY29tcG9uZW50cyI6MiwiLi9kaWprc3RyYSI6NSwKIi4vZGlqa3N0cmEtYWxsIjo0LCIuL2ZpbmQtY3ljbGVzIjo2LCIuL2Zsb3lkLXdhcnNoYWxsIjo3LCIuL2lzLWFjeWNsaWMiOjksIi4vcG9zdG9yZGVyIjoxMCwiLi9wcmVvcmRlciI6MTEsIi4vcHJpbSI6MTIsIi4vdGFyamFuIjoxMywiLi90b3Bzb3J0IjoxNH1dLDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciB0b3Bzb3J0PXJlcXVpcmUoIi4vdG9wc29ydCIpO21vZHVsZS5leHBvcnRzPWlzQWN5Y2xpYztmdW5jdGlvbiBpc0FjeWNsaWMoZyl7dHJ5e3RvcHNvcnQoZyl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIHRvcHNvcnQuQ3ljbGVFeGNlcHRpb24pcmV0dXJuIGZhbHNlO3Rocm93IGU7fXJldHVybiB0cnVlfX0seyIuL3RvcHNvcnQiOjE0fV0sMTA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBkZnM9cmVxdWlyZSgiLi9kZnMiKTttb2R1bGUuZXhwb3J0cz1wb3N0b3JkZXI7ZnVuY3Rpb24gcG9zdG9yZGVyKGcsdnMpe3JldHVybiBkZnMoZywKdnMsInBvc3QiKX19LHsiLi9kZnMiOjN9XSwxMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGRmcz1yZXF1aXJlKCIuL2RmcyIpO21vZHVsZS5leHBvcnRzPXByZW9yZGVyO2Z1bmN0aW9uIHByZW9yZGVyKGcsdnMpe3JldHVybiBkZnMoZyx2cywicHJlIil9fSx7Ii4vZGZzIjozfV0sMTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4uL2dyYXBoIiksUHJpb3JpdHlRdWV1ZT1yZXF1aXJlKCIuLi9kYXRhL3ByaW9yaXR5LXF1ZXVlIik7bW9kdWxlLmV4cG9ydHM9cHJpbTtmdW5jdGlvbiBwcmltKGcsd2VpZ2h0RnVuYyl7dmFyIHJlc3VsdD1uZXcgR3JhcGgscGFyZW50cz17fSxwcT1uZXcgUHJpb3JpdHlRdWV1ZSx2O2Z1bmN0aW9uIHVwZGF0ZU5laWdoYm9ycyhlZGdlKXt2YXIgdz1lZGdlLnY9PT12P2VkZ2UudzplZGdlLnYscHJpPXBxLnByaW9yaXR5KHcpO2lmKHByaSE9PQp1bmRlZmluZWQpe3ZhciBlZGdlV2VpZ2h0PXdlaWdodEZ1bmMoZWRnZSk7aWYoZWRnZVdlaWdodDxwcmkpe3BhcmVudHNbd109djtwcS5kZWNyZWFzZSh3LGVkZ2VXZWlnaHQpfX19aWYoZy5ub2RlQ291bnQoKT09PTApcmV0dXJuIHJlc3VsdDtfLmVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3BxLmFkZCh2LE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7cmVzdWx0LnNldE5vZGUodil9KTtwcS5kZWNyZWFzZShnLm5vZGVzKClbMF0sMCk7dmFyIGluaXQ9ZmFsc2U7d2hpbGUocHEuc2l6ZSgpPjApe3Y9cHEucmVtb3ZlTWluKCk7aWYoXy5oYXMocGFyZW50cyx2KSlyZXN1bHQuc2V0RWRnZSh2LHBhcmVudHNbdl0pO2Vsc2UgaWYoaW5pdCl0aHJvdyBuZXcgRXJyb3IoIklucHV0IGdyYXBoIGlzIG5vdCBjb25uZWN0ZWQ6ICIrZyk7ZWxzZSBpbml0PXRydWU7Zy5ub2RlRWRnZXModikuZm9yRWFjaCh1cGRhdGVOZWlnaGJvcnMpfXJldHVybiByZXN1bHR9fSx7Ii4uL2RhdGEvcHJpb3JpdHktcXVldWUiOjE1LAoiLi4vZ3JhcGgiOjE2LCIuLi9sb2Rhc2giOjE5fV0sMTM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPXRhcmphbjtmdW5jdGlvbiB0YXJqYW4oZyl7dmFyIGluZGV4PTAsc3RhY2s9W10sdmlzaXRlZD17fSxyZXN1bHRzPVtdO2Z1bmN0aW9uIGRmcyh2KXt2YXIgZW50cnk9dmlzaXRlZFt2XT17b25TdGFjazp0cnVlLGxvd2xpbms6aW5kZXgsaW5kZXg6aW5kZXgrK307c3RhY2sucHVzaCh2KTtnLnN1Y2Nlc3NvcnModikuZm9yRWFjaChmdW5jdGlvbih3KXtpZighXy5oYXModmlzaXRlZCx3KSl7ZGZzKHcpO2VudHJ5Lmxvd2xpbms9TWF0aC5taW4oZW50cnkubG93bGluayx2aXNpdGVkW3ddLmxvd2xpbmspfWVsc2UgaWYodmlzaXRlZFt3XS5vblN0YWNrKWVudHJ5Lmxvd2xpbms9TWF0aC5taW4oZW50cnkubG93bGluayx2aXNpdGVkW3ddLmluZGV4KX0pO2lmKGVudHJ5Lmxvd2xpbms9PT1lbnRyeS5pbmRleCl7dmFyIGNtcHQ9CltdLHc7ZG97dz1zdGFjay5wb3AoKTt2aXNpdGVkW3ddLm9uU3RhY2s9ZmFsc2U7Y21wdC5wdXNoKHcpfXdoaWxlKHYhPT13KTtyZXN1bHRzLnB1c2goY21wdCl9fWcubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHYpe2lmKCFfLmhhcyh2aXNpdGVkLHYpKWRmcyh2KX0pO3JldHVybiByZXN1bHRzfX0seyIuLi9sb2Rhc2giOjE5fV0sMTQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPXRvcHNvcnQ7dG9wc29ydC5DeWNsZUV4Y2VwdGlvbj1DeWNsZUV4Y2VwdGlvbjtmdW5jdGlvbiB0b3Bzb3J0KGcpe3ZhciB2aXNpdGVkPXt9LHN0YWNrPXt9LHJlc3VsdHM9W107ZnVuY3Rpb24gdmlzaXQobm9kZSl7aWYoXy5oYXMoc3RhY2ssbm9kZSkpdGhyb3cgbmV3IEN5Y2xlRXhjZXB0aW9uO2lmKCFfLmhhcyh2aXNpdGVkLG5vZGUpKXtzdGFja1tub2RlXT10cnVlO3Zpc2l0ZWRbbm9kZV09dHJ1ZTtfLmVhY2goZy5wcmVkZWNlc3NvcnMobm9kZSksCnZpc2l0KTtkZWxldGUgc3RhY2tbbm9kZV07cmVzdWx0cy5wdXNoKG5vZGUpfX1fLmVhY2goZy5zaW5rcygpLHZpc2l0KTtpZihfLnNpemUodmlzaXRlZCkhPT1nLm5vZGVDb3VudCgpKXRocm93IG5ldyBDeWNsZUV4Y2VwdGlvbjtyZXR1cm4gcmVzdWx0c31mdW5jdGlvbiBDeWNsZUV4Y2VwdGlvbigpe319LHsiLi4vbG9kYXNoIjoxOX1dLDE1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1Qcmlvcml0eVF1ZXVlO2Z1bmN0aW9uIFByaW9yaXR5UXVldWUoKXt0aGlzLl9hcnI9W107dGhpcy5fa2V5SW5kaWNlcz17fX1Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fyci5sZW5ndGh9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLmtleXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXJyLm1hcChmdW5jdGlvbih4KXtyZXR1cm4geC5rZXl9KX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuaGFzPQpmdW5jdGlvbihrZXkpe3JldHVybiBfLmhhcyh0aGlzLl9rZXlJbmRpY2VzLGtleSl9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLnByaW9yaXR5PWZ1bmN0aW9uKGtleSl7dmFyIGluZGV4PXRoaXMuX2tleUluZGljZXNba2V5XTtpZihpbmRleCE9PXVuZGVmaW5lZClyZXR1cm4gdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUubWluPWZ1bmN0aW9uKCl7aWYodGhpcy5zaXplKCk9PT0wKXRocm93IG5ldyBFcnJvcigiUXVldWUgdW5kZXJmbG93Iik7cmV0dXJuIHRoaXMuX2FyclswXS5rZXl9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLmFkZD1mdW5jdGlvbihrZXkscHJpb3JpdHkpe3ZhciBrZXlJbmRpY2VzPXRoaXMuX2tleUluZGljZXM7a2V5PVN0cmluZyhrZXkpO2lmKCFfLmhhcyhrZXlJbmRpY2VzLGtleSkpe3ZhciBhcnI9dGhpcy5fYXJyO3ZhciBpbmRleD1hcnIubGVuZ3RoO2tleUluZGljZXNba2V5XT1pbmRleDthcnIucHVzaCh7a2V5OmtleSwKcHJpb3JpdHk6cHJpb3JpdHl9KTt0aGlzLl9kZWNyZWFzZShpbmRleCk7cmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5yZW1vdmVNaW49ZnVuY3Rpb24oKXt0aGlzLl9zd2FwKDAsdGhpcy5fYXJyLmxlbmd0aC0xKTt2YXIgbWluPXRoaXMuX2Fyci5wb3AoKTtkZWxldGUgdGhpcy5fa2V5SW5kaWNlc1ttaW4ua2V5XTt0aGlzLl9oZWFwaWZ5KDApO3JldHVybiBtaW4ua2V5fTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5kZWNyZWFzZT1mdW5jdGlvbihrZXkscHJpb3JpdHkpe3ZhciBpbmRleD10aGlzLl9rZXlJbmRpY2VzW2tleV07aWYocHJpb3JpdHk+dGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSl0aHJvdyBuZXcgRXJyb3IoIk5ldyBwcmlvcml0eSBpcyBncmVhdGVyIHRoYW4gY3VycmVudCBwcmlvcml0eS4gIisiS2V5OiAiK2tleSsiIE9sZDogIit0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5KyIgTmV3OiAiK3ByaW9yaXR5KTt0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5PQpwcmlvcml0eTt0aGlzLl9kZWNyZWFzZShpbmRleCl9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLl9oZWFwaWZ5PWZ1bmN0aW9uKGkpe3ZhciBhcnI9dGhpcy5fYXJyO3ZhciBsPTIqaSxyPWwrMSxsYXJnZXN0PWk7aWYobDxhcnIubGVuZ3RoKXtsYXJnZXN0PWFycltsXS5wcmlvcml0eTxhcnJbbGFyZ2VzdF0ucHJpb3JpdHk/bDpsYXJnZXN0O2lmKHI8YXJyLmxlbmd0aClsYXJnZXN0PWFycltyXS5wcmlvcml0eTxhcnJbbGFyZ2VzdF0ucHJpb3JpdHk/cjpsYXJnZXN0O2lmKGxhcmdlc3QhPT1pKXt0aGlzLl9zd2FwKGksbGFyZ2VzdCk7dGhpcy5faGVhcGlmeShsYXJnZXN0KX19fTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5fZGVjcmVhc2U9ZnVuY3Rpb24oaW5kZXgpe3ZhciBhcnI9dGhpcy5fYXJyO3ZhciBwcmlvcml0eT1hcnJbaW5kZXhdLnByaW9yaXR5O3ZhciBwYXJlbnQ7d2hpbGUoaW5kZXghPT0wKXtwYXJlbnQ9aW5kZXg+PjE7aWYoYXJyW3BhcmVudF0ucHJpb3JpdHk8cHJpb3JpdHkpYnJlYWs7CnRoaXMuX3N3YXAoaW5kZXgscGFyZW50KTtpbmRleD1wYXJlbnR9fTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5fc3dhcD1mdW5jdGlvbihpLGope3ZhciBhcnI9dGhpcy5fYXJyO3ZhciBrZXlJbmRpY2VzPXRoaXMuX2tleUluZGljZXM7dmFyIG9yaWdBcnJJPWFycltpXTt2YXIgb3JpZ0Fycko9YXJyW2pdO2FycltpXT1vcmlnQXJySjthcnJbal09b3JpZ0Fyckk7a2V5SW5kaWNlc1tvcmlnQXJySi5rZXldPWk7a2V5SW5kaWNlc1tvcmlnQXJySS5rZXldPWp9fSx7Ii4uL2xvZGFzaCI6MTl9XSwxNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1HcmFwaDt2YXIgREVGQVVMVF9FREdFX05BTUU9Ilx4MDAiLEdSQVBIX05PREU9Ilx4MDAiLEVER0VfS0VZX0RFTElNPSJcdTAwMDEiO2Z1bmN0aW9uIEdyYXBoKG9wdHMpe3RoaXMuX2lzRGlyZWN0ZWQ9Xy5oYXMob3B0cywiZGlyZWN0ZWQiKT9vcHRzLmRpcmVjdGVkOgp0cnVlO3RoaXMuX2lzTXVsdGlncmFwaD1fLmhhcyhvcHRzLCJtdWx0aWdyYXBoIik/b3B0cy5tdWx0aWdyYXBoOmZhbHNlO3RoaXMuX2lzQ29tcG91bmQ9Xy5oYXMob3B0cywiY29tcG91bmQiKT9vcHRzLmNvbXBvdW5kOmZhbHNlO3RoaXMuX2xhYmVsPXVuZGVmaW5lZDt0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm49Xy5jb25zdGFudCh1bmRlZmluZWQpO3RoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbj1fLmNvbnN0YW50KHVuZGVmaW5lZCk7dGhpcy5fbm9kZXM9e307aWYodGhpcy5faXNDb21wb3VuZCl7dGhpcy5fcGFyZW50PXt9O3RoaXMuX2NoaWxkcmVuPXt9O3RoaXMuX2NoaWxkcmVuW0dSQVBIX05PREVdPXt9fXRoaXMuX2luPXt9O3RoaXMuX3ByZWRzPXt9O3RoaXMuX291dD17fTt0aGlzLl9zdWNzPXt9O3RoaXMuX2VkZ2VPYmpzPXt9O3RoaXMuX2VkZ2VMYWJlbHM9e319R3JhcGgucHJvdG90eXBlLl9ub2RlQ291bnQ9MDtHcmFwaC5wcm90b3R5cGUuX2VkZ2VDb3VudD0wO0dyYXBoLnByb3RvdHlwZS5pc0RpcmVjdGVkPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0RpcmVjdGVkfTtHcmFwaC5wcm90b3R5cGUuaXNNdWx0aWdyYXBoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzTXVsdGlncmFwaH07R3JhcGgucHJvdG90eXBlLmlzQ29tcG91bmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNDb21wb3VuZH07R3JhcGgucHJvdG90eXBlLnNldEdyYXBoPWZ1bmN0aW9uKGxhYmVsKXt0aGlzLl9sYWJlbD1sYWJlbDtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLmdyYXBoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhYmVsfTtHcmFwaC5wcm90b3R5cGUuc2V0RGVmYXVsdE5vZGVMYWJlbD1mdW5jdGlvbihuZXdEZWZhdWx0KXtpZighXy5pc0Z1bmN0aW9uKG5ld0RlZmF1bHQpKW5ld0RlZmF1bHQ9Xy5jb25zdGFudChuZXdEZWZhdWx0KTt0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm49bmV3RGVmYXVsdDtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLm5vZGVDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2RlQ291bnR9OwpHcmFwaC5wcm90b3R5cGUubm9kZXM9ZnVuY3Rpb24oKXtyZXR1cm4gXy5rZXlzKHRoaXMuX25vZGVzKX07R3JhcGgucHJvdG90eXBlLnNvdXJjZXM9ZnVuY3Rpb24oKXt2YXIgc2VsZj10aGlzO3JldHVybiBfLmZpbHRlcih0aGlzLm5vZGVzKCksZnVuY3Rpb24odil7cmV0dXJuIF8uaXNFbXB0eShzZWxmLl9pblt2XSl9KX07R3JhcGgucHJvdG90eXBlLnNpbmtzPWZ1bmN0aW9uKCl7dmFyIHNlbGY9dGhpcztyZXR1cm4gXy5maWx0ZXIodGhpcy5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldHVybiBfLmlzRW1wdHkoc2VsZi5fb3V0W3ZdKX0pfTtHcmFwaC5wcm90b3R5cGUuc2V0Tm9kZXM9ZnVuY3Rpb24odnMsdmFsdWUpe3ZhciBhcmdzPWFyZ3VtZW50czt2YXIgc2VsZj10aGlzO18uZWFjaCh2cyxmdW5jdGlvbih2KXtpZihhcmdzLmxlbmd0aD4xKXNlbGYuc2V0Tm9kZSh2LHZhbHVlKTtlbHNlIHNlbGYuc2V0Tm9kZSh2KX0pO3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuc2V0Tm9kZT0KZnVuY3Rpb24odix2YWx1ZSl7aWYoXy5oYXModGhpcy5fbm9kZXMsdikpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl0aGlzLl9ub2Rlc1t2XT12YWx1ZTtyZXR1cm4gdGhpc310aGlzLl9ub2Rlc1t2XT1hcmd1bWVudHMubGVuZ3RoPjE/dmFsdWU6dGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuKHYpO2lmKHRoaXMuX2lzQ29tcG91bmQpe3RoaXMuX3BhcmVudFt2XT1HUkFQSF9OT0RFO3RoaXMuX2NoaWxkcmVuW3ZdPXt9O3RoaXMuX2NoaWxkcmVuW0dSQVBIX05PREVdW3ZdPXRydWV9dGhpcy5faW5bdl09e307dGhpcy5fcHJlZHNbdl09e307dGhpcy5fb3V0W3ZdPXt9O3RoaXMuX3N1Y3Nbdl09e307Kyt0aGlzLl9ub2RlQ291bnQ7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5ub2RlPWZ1bmN0aW9uKHYpe3JldHVybiB0aGlzLl9ub2Rlc1t2XX07R3JhcGgucHJvdG90eXBlLmhhc05vZGU9ZnVuY3Rpb24odil7cmV0dXJuIF8uaGFzKHRoaXMuX25vZGVzLHYpfTtHcmFwaC5wcm90b3R5cGUucmVtb3ZlTm9kZT0KZnVuY3Rpb24odil7dmFyIHNlbGY9dGhpcztpZihfLmhhcyh0aGlzLl9ub2Rlcyx2KSl7dmFyIHJlbW92ZUVkZ2U9ZnVuY3Rpb24oZSl7c2VsZi5yZW1vdmVFZGdlKHNlbGYuX2VkZ2VPYmpzW2VdKX07ZGVsZXRlIHRoaXMuX25vZGVzW3ZdO2lmKHRoaXMuX2lzQ29tcG91bmQpe3RoaXMuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0KHYpO2RlbGV0ZSB0aGlzLl9wYXJlbnRbdl07Xy5lYWNoKHRoaXMuY2hpbGRyZW4odiksZnVuY3Rpb24oY2hpbGQpe3NlbGYuc2V0UGFyZW50KGNoaWxkKX0pO2RlbGV0ZSB0aGlzLl9jaGlsZHJlblt2XX1fLmVhY2goXy5rZXlzKHRoaXMuX2luW3ZdKSxyZW1vdmVFZGdlKTtkZWxldGUgdGhpcy5faW5bdl07ZGVsZXRlIHRoaXMuX3ByZWRzW3ZdO18uZWFjaChfLmtleXModGhpcy5fb3V0W3ZdKSxyZW1vdmVFZGdlKTtkZWxldGUgdGhpcy5fb3V0W3ZdO2RlbGV0ZSB0aGlzLl9zdWNzW3ZdOy0tdGhpcy5fbm9kZUNvdW50fXJldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuc2V0UGFyZW50PQpmdW5jdGlvbih2LHBhcmVudCl7aWYoIXRoaXMuX2lzQ29tcG91bmQpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qgc2V0IHBhcmVudCBpbiBhIG5vbi1jb21wb3VuZCBncmFwaCIpO2lmKF8uaXNVbmRlZmluZWQocGFyZW50KSlwYXJlbnQ9R1JBUEhfTk9ERTtlbHNle3BhcmVudCs9IiI7Zm9yKHZhciBhbmNlc3Rvcj1wYXJlbnQ7IV8uaXNVbmRlZmluZWQoYW5jZXN0b3IpO2FuY2VzdG9yPXRoaXMucGFyZW50KGFuY2VzdG9yKSlpZihhbmNlc3Rvcj09PXYpdGhyb3cgbmV3IEVycm9yKCJTZXR0aW5nICIrcGFyZW50KyIgYXMgcGFyZW50IG9mICIrdisiIHdvdWxkIGNyZWF0ZSBhIGN5Y2xlIik7dGhpcy5zZXROb2RlKHBhcmVudCl9dGhpcy5zZXROb2RlKHYpO3RoaXMuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0KHYpO3RoaXMuX3BhcmVudFt2XT1wYXJlbnQ7dGhpcy5fY2hpbGRyZW5bcGFyZW50XVt2XT10cnVlO3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0PQpmdW5jdGlvbih2KXtkZWxldGUgdGhpcy5fY2hpbGRyZW5bdGhpcy5fcGFyZW50W3ZdXVt2XX07R3JhcGgucHJvdG90eXBlLnBhcmVudD1mdW5jdGlvbih2KXtpZih0aGlzLl9pc0NvbXBvdW5kKXt2YXIgcGFyZW50PXRoaXMuX3BhcmVudFt2XTtpZihwYXJlbnQhPT1HUkFQSF9OT0RFKXJldHVybiBwYXJlbnR9fTtHcmFwaC5wcm90b3R5cGUuY2hpbGRyZW49ZnVuY3Rpb24odil7aWYoXy5pc1VuZGVmaW5lZCh2KSl2PUdSQVBIX05PREU7aWYodGhpcy5faXNDb21wb3VuZCl7dmFyIGNoaWxkcmVuPXRoaXMuX2NoaWxkcmVuW3ZdO2lmKGNoaWxkcmVuKXJldHVybiBfLmtleXMoY2hpbGRyZW4pfWVsc2UgaWYodj09PUdSQVBIX05PREUpcmV0dXJuIHRoaXMubm9kZXMoKTtlbHNlIGlmKHRoaXMuaGFzTm9kZSh2KSlyZXR1cm5bXX07R3JhcGgucHJvdG90eXBlLnByZWRlY2Vzc29ycz1mdW5jdGlvbih2KXt2YXIgcHJlZHNWPXRoaXMuX3ByZWRzW3ZdO2lmKHByZWRzVilyZXR1cm4gXy5rZXlzKHByZWRzVil9OwpHcmFwaC5wcm90b3R5cGUuc3VjY2Vzc29ycz1mdW5jdGlvbih2KXt2YXIgc3Vjc1Y9dGhpcy5fc3Vjc1t2XTtpZihzdWNzVilyZXR1cm4gXy5rZXlzKHN1Y3NWKX07R3JhcGgucHJvdG90eXBlLm5laWdoYm9ycz1mdW5jdGlvbih2KXt2YXIgcHJlZHM9dGhpcy5wcmVkZWNlc3NvcnModik7aWYocHJlZHMpcmV0dXJuIF8udW5pb24ocHJlZHMsdGhpcy5zdWNjZXNzb3JzKHYpKX07R3JhcGgucHJvdG90eXBlLmlzTGVhZj1mdW5jdGlvbih2KXt2YXIgbmVpZ2hib3JzO2lmKHRoaXMuaXNEaXJlY3RlZCgpKW5laWdoYm9ycz10aGlzLnN1Y2Nlc3NvcnModik7ZWxzZSBuZWlnaGJvcnM9dGhpcy5uZWlnaGJvcnModik7cmV0dXJuIG5laWdoYm9ycy5sZW5ndGg9PT0wfTtHcmFwaC5wcm90b3R5cGUuZmlsdGVyTm9kZXM9ZnVuY3Rpb24oZmlsdGVyKXt2YXIgY29weT1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih7ZGlyZWN0ZWQ6dGhpcy5faXNEaXJlY3RlZCxtdWx0aWdyYXBoOnRoaXMuX2lzTXVsdGlncmFwaCwKY29tcG91bmQ6dGhpcy5faXNDb21wb3VuZH0pO2NvcHkuc2V0R3JhcGgodGhpcy5ncmFwaCgpKTt2YXIgc2VsZj10aGlzO18uZWFjaCh0aGlzLl9ub2RlcyxmdW5jdGlvbih2YWx1ZSx2KXtpZihmaWx0ZXIodikpY29weS5zZXROb2RlKHYsdmFsdWUpfSk7Xy5lYWNoKHRoaXMuX2VkZ2VPYmpzLGZ1bmN0aW9uKGUpe2lmKGNvcHkuaGFzTm9kZShlLnYpJiZjb3B5Lmhhc05vZGUoZS53KSljb3B5LnNldEVkZ2UoZSxzZWxmLmVkZ2UoZSkpfSk7dmFyIHBhcmVudHM9e307ZnVuY3Rpb24gZmluZFBhcmVudCh2KXt2YXIgcGFyZW50PXNlbGYucGFyZW50KHYpO2lmKHBhcmVudD09PXVuZGVmaW5lZHx8Y29weS5oYXNOb2RlKHBhcmVudCkpe3BhcmVudHNbdl09cGFyZW50O3JldHVybiBwYXJlbnR9ZWxzZSBpZihwYXJlbnQgaW4gcGFyZW50cylyZXR1cm4gcGFyZW50c1twYXJlbnRdO2Vsc2UgcmV0dXJuIGZpbmRQYXJlbnQocGFyZW50KX1pZih0aGlzLl9pc0NvbXBvdW5kKV8uZWFjaChjb3B5Lm5vZGVzKCksCmZ1bmN0aW9uKHYpe2NvcHkuc2V0UGFyZW50KHYsZmluZFBhcmVudCh2KSl9KTtyZXR1cm4gY29weX07R3JhcGgucHJvdG90eXBlLnNldERlZmF1bHRFZGdlTGFiZWw9ZnVuY3Rpb24obmV3RGVmYXVsdCl7aWYoIV8uaXNGdW5jdGlvbihuZXdEZWZhdWx0KSluZXdEZWZhdWx0PV8uY29uc3RhbnQobmV3RGVmYXVsdCk7dGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuPW5ld0RlZmF1bHQ7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5lZGdlQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZUNvdW50fTtHcmFwaC5wcm90b3R5cGUuZWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gXy52YWx1ZXModGhpcy5fZWRnZU9ianMpfTtHcmFwaC5wcm90b3R5cGUuc2V0UGF0aD1mdW5jdGlvbih2cyx2YWx1ZSl7dmFyIHNlbGY9dGhpcyxhcmdzPWFyZ3VtZW50cztfLnJlZHVjZSh2cyxmdW5jdGlvbih2LHcpe2lmKGFyZ3MubGVuZ3RoPjEpc2VsZi5zZXRFZGdlKHYsdyx2YWx1ZSk7ZWxzZSBzZWxmLnNldEVkZ2UodiwKdyk7cmV0dXJuIHd9KTtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLnNldEVkZ2U9ZnVuY3Rpb24oKXt2YXIgdix3LG5hbWUsdmFsdWUsdmFsdWVTcGVjaWZpZWQ9ZmFsc2UsYXJnMD1hcmd1bWVudHNbMF07aWYodHlwZW9mIGFyZzA9PT0ib2JqZWN0IiYmYXJnMCE9PW51bGwmJiJ2ImluIGFyZzApe3Y9YXJnMC52O3c9YXJnMC53O25hbWU9YXJnMC5uYW1lO2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0yKXt2YWx1ZT1hcmd1bWVudHNbMV07dmFsdWVTcGVjaWZpZWQ9dHJ1ZX19ZWxzZXt2PWFyZzA7dz1hcmd1bWVudHNbMV07bmFtZT1hcmd1bWVudHNbM107aWYoYXJndW1lbnRzLmxlbmd0aD4yKXt2YWx1ZT1hcmd1bWVudHNbMl07dmFsdWVTcGVjaWZpZWQ9dHJ1ZX19dj0iIit2O3c9IiIrdztpZighXy5pc1VuZGVmaW5lZChuYW1lKSluYW1lPSIiK25hbWU7dmFyIGU9ZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsdix3LG5hbWUpO2lmKF8uaGFzKHRoaXMuX2VkZ2VMYWJlbHMsCmUpKXtpZih2YWx1ZVNwZWNpZmllZCl0aGlzLl9lZGdlTGFiZWxzW2VdPXZhbHVlO3JldHVybiB0aGlzfWlmKCFfLmlzVW5kZWZpbmVkKG5hbWUpJiYhdGhpcy5faXNNdWx0aWdyYXBoKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHNldCBhIG5hbWVkIGVkZ2Ugd2hlbiBpc011bHRpZ3JhcGggXHgzZCBmYWxzZSIpO3RoaXMuc2V0Tm9kZSh2KTt0aGlzLnNldE5vZGUodyk7dGhpcy5fZWRnZUxhYmVsc1tlXT12YWx1ZVNwZWNpZmllZD92YWx1ZTp0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm4odix3LG5hbWUpO3ZhciBlZGdlT2JqPWVkZ2VBcmdzVG9PYmoodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSk7dj1lZGdlT2JqLnY7dz1lZGdlT2JqLnc7T2JqZWN0LmZyZWV6ZShlZGdlT2JqKTt0aGlzLl9lZGdlT2Jqc1tlXT1lZGdlT2JqO2luY3JlbWVudE9ySW5pdEVudHJ5KHRoaXMuX3ByZWRzW3ddLHYpO2luY3JlbWVudE9ySW5pdEVudHJ5KHRoaXMuX3N1Y3Nbdl0sdyk7dGhpcy5faW5bd11bZV09CmVkZ2VPYmo7dGhpcy5fb3V0W3ZdW2VdPWVkZ2VPYmo7dGhpcy5fZWRnZUNvdW50Kys7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5lZGdlPWZ1bmN0aW9uKHYsdyxuYW1lKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPT09MT9lZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLGFyZ3VtZW50c1swXSk6ZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsdix3LG5hbWUpO3JldHVybiB0aGlzLl9lZGdlTGFiZWxzW2VdfTtHcmFwaC5wcm90b3R5cGUuaGFzRWRnZT1mdW5jdGlvbih2LHcsbmFtZSl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD09PTE/ZWRnZU9ialRvSWQodGhpcy5faXNEaXJlY3RlZCxhcmd1bWVudHNbMF0pOmVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLHYsdyxuYW1lKTtyZXR1cm4gXy5oYXModGhpcy5fZWRnZUxhYmVscyxlKX07R3JhcGgucHJvdG90eXBlLnJlbW92ZUVkZ2U9ZnVuY3Rpb24odix3LG5hbWUpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg9PT0xPwplZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLGFyZ3VtZW50c1swXSk6ZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsdix3LG5hbWUpLGVkZ2U9dGhpcy5fZWRnZU9ianNbZV07aWYoZWRnZSl7dj1lZGdlLnY7dz1lZGdlLnc7ZGVsZXRlIHRoaXMuX2VkZ2VMYWJlbHNbZV07ZGVsZXRlIHRoaXMuX2VkZ2VPYmpzW2VdO2RlY3JlbWVudE9yUmVtb3ZlRW50cnkodGhpcy5fcHJlZHNbd10sdik7ZGVjcmVtZW50T3JSZW1vdmVFbnRyeSh0aGlzLl9zdWNzW3ZdLHcpO2RlbGV0ZSB0aGlzLl9pblt3XVtlXTtkZWxldGUgdGhpcy5fb3V0W3ZdW2VdO3RoaXMuX2VkZ2VDb3VudC0tfXJldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuaW5FZGdlcz1mdW5jdGlvbih2LHUpe3ZhciBpblY9dGhpcy5faW5bdl07aWYoaW5WKXt2YXIgZWRnZXM9Xy52YWx1ZXMoaW5WKTtpZighdSlyZXR1cm4gZWRnZXM7cmV0dXJuIF8uZmlsdGVyKGVkZ2VzLGZ1bmN0aW9uKGVkZ2Upe3JldHVybiBlZGdlLnY9PT0KdX0pfX07R3JhcGgucHJvdG90eXBlLm91dEVkZ2VzPWZ1bmN0aW9uKHYsdyl7dmFyIG91dFY9dGhpcy5fb3V0W3ZdO2lmKG91dFYpe3ZhciBlZGdlcz1fLnZhbHVlcyhvdXRWKTtpZighdylyZXR1cm4gZWRnZXM7cmV0dXJuIF8uZmlsdGVyKGVkZ2VzLGZ1bmN0aW9uKGVkZ2Upe3JldHVybiBlZGdlLnc9PT13fSl9fTtHcmFwaC5wcm90b3R5cGUubm9kZUVkZ2VzPWZ1bmN0aW9uKHYsdyl7dmFyIGluRWRnZXM9dGhpcy5pbkVkZ2VzKHYsdyk7aWYoaW5FZGdlcylyZXR1cm4gaW5FZGdlcy5jb25jYXQodGhpcy5vdXRFZGdlcyh2LHcpKX07ZnVuY3Rpb24gaW5jcmVtZW50T3JJbml0RW50cnkobWFwLGspe2lmKG1hcFtrXSltYXBba10rKztlbHNlIG1hcFtrXT0xfWZ1bmN0aW9uIGRlY3JlbWVudE9yUmVtb3ZlRW50cnkobWFwLGspe2lmKCEtLW1hcFtrXSlkZWxldGUgbWFwW2tdfWZ1bmN0aW9uIGVkZ2VBcmdzVG9JZChpc0RpcmVjdGVkLHZfLHdfLG5hbWUpe3ZhciB2PSIiK3ZfO3ZhciB3PQoiIit3XztpZighaXNEaXJlY3RlZCYmdj53KXt2YXIgdG1wPXY7dj13O3c9dG1wfXJldHVybiB2K0VER0VfS0VZX0RFTElNK3crRURHRV9LRVlfREVMSU0rKF8uaXNVbmRlZmluZWQobmFtZSk/REVGQVVMVF9FREdFX05BTUU6bmFtZSl9ZnVuY3Rpb24gZWRnZUFyZ3NUb09iaihpc0RpcmVjdGVkLHZfLHdfLG5hbWUpe3ZhciB2PSIiK3ZfO3ZhciB3PSIiK3dfO2lmKCFpc0RpcmVjdGVkJiZ2Pncpe3ZhciB0bXA9djt2PXc7dz10bXB9dmFyIGVkZ2VPYmo9e3Y6dix3Ond9O2lmKG5hbWUpZWRnZU9iai5uYW1lPW5hbWU7cmV0dXJuIGVkZ2VPYmp9ZnVuY3Rpb24gZWRnZU9ialRvSWQoaXNEaXJlY3RlZCxlZGdlT2JqKXtyZXR1cm4gZWRnZUFyZ3NUb0lkKGlzRGlyZWN0ZWQsZWRnZU9iai52LGVkZ2VPYmoudyxlZGdlT2JqLm5hbWUpfX0seyIuL2xvZGFzaCI6MTl9XSwxNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9e0dyYXBoOnJlcXVpcmUoIi4vZ3JhcGgiKSwKdmVyc2lvbjpyZXF1aXJlKCIuL3ZlcnNpb24iKX19LHsiLi9ncmFwaCI6MTYsIi4vdmVyc2lvbiI6MjB9XSwxODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSxHcmFwaD1yZXF1aXJlKCIuL2dyYXBoIik7bW9kdWxlLmV4cG9ydHM9e3dyaXRlOndyaXRlLHJlYWQ6cmVhZH07ZnVuY3Rpb24gd3JpdGUoZyl7dmFyIGpzb249e29wdGlvbnM6e2RpcmVjdGVkOmcuaXNEaXJlY3RlZCgpLG11bHRpZ3JhcGg6Zy5pc011bHRpZ3JhcGgoKSxjb21wb3VuZDpnLmlzQ29tcG91bmQoKX0sbm9kZXM6d3JpdGVOb2RlcyhnKSxlZGdlczp3cml0ZUVkZ2VzKGcpfTtpZighXy5pc1VuZGVmaW5lZChnLmdyYXBoKCkpKWpzb24udmFsdWU9Xy5jbG9uZShnLmdyYXBoKCkpO3JldHVybiBqc29ufWZ1bmN0aW9uIHdyaXRlTm9kZXMoZyl7cmV0dXJuIF8ubWFwKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZVZhbHVlPWcubm9kZSh2KSxwYXJlbnQ9CmcucGFyZW50KHYpLG5vZGU9e3Y6dn07aWYoIV8uaXNVbmRlZmluZWQobm9kZVZhbHVlKSlub2RlLnZhbHVlPW5vZGVWYWx1ZTtpZighXy5pc1VuZGVmaW5lZChwYXJlbnQpKW5vZGUucGFyZW50PXBhcmVudDtyZXR1cm4gbm9kZX0pfWZ1bmN0aW9uIHdyaXRlRWRnZXMoZyl7cmV0dXJuIF8ubWFwKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZVZhbHVlPWcuZWRnZShlKSxlZGdlPXt2OmUudix3OmUud307aWYoIV8uaXNVbmRlZmluZWQoZS5uYW1lKSllZGdlLm5hbWU9ZS5uYW1lO2lmKCFfLmlzVW5kZWZpbmVkKGVkZ2VWYWx1ZSkpZWRnZS52YWx1ZT1lZGdlVmFsdWU7cmV0dXJuIGVkZ2V9KX1mdW5jdGlvbiByZWFkKGpzb24pe3ZhciBnPShuZXcgR3JhcGgoanNvbi5vcHRpb25zKSkuc2V0R3JhcGgoanNvbi52YWx1ZSk7Xy5lYWNoKGpzb24ubm9kZXMsZnVuY3Rpb24oZW50cnkpe2cuc2V0Tm9kZShlbnRyeS52LGVudHJ5LnZhbHVlKTtpZihlbnRyeS5wYXJlbnQpZy5zZXRQYXJlbnQoZW50cnkudiwKZW50cnkucGFyZW50KX0pO18uZWFjaChqc29uLmVkZ2VzLGZ1bmN0aW9uKGVudHJ5KXtnLnNldEVkZ2Uoe3Y6ZW50cnkudix3OmVudHJ5LncsbmFtZTplbnRyeS5uYW1lfSxlbnRyeS52YWx1ZSl9KTtyZXR1cm4gZ319LHsiLi9ncmFwaCI6MTYsIi4vbG9kYXNoIjoxOX1dLDE5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgbG9kYXNoO2lmKHR5cGVvZiByZXF1aXJlPT09ImZ1bmN0aW9uIil0cnl7bG9kYXNoPXJlcXVpcmUoImxvZGFzaCIpfWNhdGNoKGUpe31pZighbG9kYXNoKWxvZGFzaD13aW5kb3cuXzttb2R1bGUuZXhwb3J0cz1sb2Rhc2h9LHsibG9kYXNoIjp1bmRlZmluZWR9XSwyMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9IjIuMS41In0se31dfSx7fSxbMV0pKDEpfSk7CihmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlIT09InVuZGVmaW5lZCIpbW9kdWxlLmV4cG9ydHM9ZigpO2Vsc2UgaWYodHlwZW9mIGRlZmluZT09PSJmdW5jdGlvbiImJmRlZmluZS5hbWQpZGVmaW5lKFtdLGYpO2Vsc2V7dmFyIGc7aWYodHlwZW9mIHdpbmRvdyE9PSJ1bmRlZmluZWQiKWc9d2luZG93O2Vsc2UgaWYodHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiKWc9Z2xvYmFsO2Vsc2UgaWYodHlwZW9mIHNlbGYhPT0idW5kZWZpbmVkIilnPXNlbGY7ZWxzZSBnPXRoaXM7Zy5kYWdyZT1mKCl9fSkoZnVuY3Rpb24oKXt2YXIgZGVmaW5lLG1vZHVsZSxleHBvcnRzO3JldHVybiBmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPQpuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitvKyInIik7dGhyb3cgZi5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixmO312YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KHsxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz17Z3JhcGhsaWI6cmVxdWlyZSgiLi9saWIvZ3JhcGhsaWIiKSxsYXlvdXQ6cmVxdWlyZSgiLi9saWIvbGF5b3V0IiksZGVidWc6cmVxdWlyZSgiLi9saWIvZGVidWciKSx1dGlsOnt0aW1lOnJlcXVpcmUoIi4vbGliL3V0aWwiKS50aW1lLG5vdGltZTpyZXF1aXJlKCIuL2xpYi91dGlsIikubm90aW1lfSwKdmVyc2lvbjpyZXF1aXJlKCIuL2xpYi92ZXJzaW9uIil9fSx7Ii4vbGliL2RlYnVnIjo2LCIuL2xpYi9ncmFwaGxpYiI6NywiLi9saWIvbGF5b3V0Ijo5LCIuL2xpYi91dGlsIjoyOSwiLi9saWIvdmVyc2lvbiI6MzB9XSwyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLGdyZWVkeUZBUz1yZXF1aXJlKCIuL2dyZWVkeS1mYXMiKTttb2R1bGUuZXhwb3J0cz17cnVuOnJ1bix1bmRvOnVuZG99O2Z1bmN0aW9uIHJ1bihnKXt2YXIgZmFzPWcuZ3JhcGgoKS5hY3ljbGljZXI9PT0iZ3JlZWR5Ij9ncmVlZHlGQVMoZyx3ZWlnaHRGbihnKSk6ZGZzRkFTKGcpO18uZm9yRWFjaChmYXMsZnVuY3Rpb24oZSl7dmFyIGxhYmVsPWcuZWRnZShlKTtnLnJlbW92ZUVkZ2UoZSk7bGFiZWwuZm9yd2FyZE5hbWU9ZS5uYW1lO2xhYmVsLnJldmVyc2VkPXRydWU7Zy5zZXRFZGdlKGUudyxlLnYsbGFiZWwsXy51bmlxdWVJZCgicmV2IikpfSk7ZnVuY3Rpb24gd2VpZ2h0Rm4oZyl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBnLmVkZ2UoZSkud2VpZ2h0fX0KfWZ1bmN0aW9uIGRmc0ZBUyhnKXt2YXIgZmFzPVtdLHN0YWNrPXt9LHZpc2l0ZWQ9e307ZnVuY3Rpb24gZGZzKHYpe2lmKF8uaGFzKHZpc2l0ZWQsdikpcmV0dXJuO3Zpc2l0ZWRbdl09dHJ1ZTtzdGFja1t2XT10cnVlO18uZm9yRWFjaChnLm91dEVkZ2VzKHYpLGZ1bmN0aW9uKGUpe2lmKF8uaGFzKHN0YWNrLGUudykpZmFzLnB1c2goZSk7ZWxzZSBkZnMoZS53KX0pO2RlbGV0ZSBzdGFja1t2XX1fLmZvckVhY2goZy5ub2RlcygpLGRmcyk7cmV0dXJuIGZhc31mdW5jdGlvbiB1bmRvKGcpe18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGxhYmVsPWcuZWRnZShlKTtpZihsYWJlbC5yZXZlcnNlZCl7Zy5yZW1vdmVFZGdlKGUpO3ZhciBmb3J3YXJkTmFtZT1sYWJlbC5mb3J3YXJkTmFtZTtkZWxldGUgbGFiZWwucmV2ZXJzZWQ7ZGVsZXRlIGxhYmVsLmZvcndhcmROYW1lO2cuc2V0RWRnZShlLncsZS52LGxhYmVsLGZvcndhcmROYW1lKX19KX19LHsiLi9ncmVlZHktZmFzIjo4LAoiLi9sb2Rhc2giOjEwfV0sMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4vdXRpbCIpO21vZHVsZS5leHBvcnRzPWFkZEJvcmRlclNlZ21lbnRzO2Z1bmN0aW9uIGFkZEJvcmRlclNlZ21lbnRzKGcpe2Z1bmN0aW9uIGRmcyh2KXt2YXIgY2hpbGRyZW49Zy5jaGlsZHJlbih2KSxub2RlPWcubm9kZSh2KTtpZihjaGlsZHJlbi5sZW5ndGgpXy5mb3JFYWNoKGNoaWxkcmVuLGRmcyk7aWYoXy5oYXMobm9kZSwibWluUmFuayIpKXtub2RlLmJvcmRlckxlZnQ9W107bm9kZS5ib3JkZXJSaWdodD1bXTtmb3IodmFyIHJhbms9bm9kZS5taW5SYW5rLG1heFJhbms9bm9kZS5tYXhSYW5rKzE7cmFuazxtYXhSYW5rOysrcmFuayl7YWRkQm9yZGVyTm9kZShnLCJib3JkZXJMZWZ0IiwiX2JsIix2LG5vZGUscmFuayk7YWRkQm9yZGVyTm9kZShnLCJib3JkZXJSaWdodCIsIl9iciIsdixub2RlLHJhbmspfX19Xy5mb3JFYWNoKGcuY2hpbGRyZW4oKSwKZGZzKX1mdW5jdGlvbiBhZGRCb3JkZXJOb2RlKGcscHJvcCxwcmVmaXgsc2csc2dOb2RlLHJhbmspe3ZhciBsYWJlbD17d2lkdGg6MCxoZWlnaHQ6MCxyYW5rOnJhbmssYm9yZGVyVHlwZTpwcm9wfSxwcmV2PXNnTm9kZVtwcm9wXVtyYW5rLTFdLGN1cnI9dXRpbC5hZGREdW1teU5vZGUoZywiYm9yZGVyIixsYWJlbCxwcmVmaXgpO3NnTm9kZVtwcm9wXVtyYW5rXT1jdXJyO2cuc2V0UGFyZW50KGN1cnIsc2cpO2lmKHByZXYpZy5zZXRFZGdlKHByZXYsY3Vycix7d2VpZ2h0OjF9KX19LHsiLi9sb2Rhc2giOjEwLCIuL3V0aWwiOjI5fV0sNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz17YWRqdXN0OmFkanVzdCx1bmRvOnVuZG99O2Z1bmN0aW9uIGFkanVzdChnKXt2YXIgcmFua0Rpcj1nLmdyYXBoKCkucmFua2Rpci50b0xvd2VyQ2FzZSgpO2lmKHJhbmtEaXI9PT0ibHIifHxyYW5rRGlyPT09InJsIilzd2FwV2lkdGhIZWlnaHQoZyl9CmZ1bmN0aW9uIHVuZG8oZyl7dmFyIHJhbmtEaXI9Zy5ncmFwaCgpLnJhbmtkaXIudG9Mb3dlckNhc2UoKTtpZihyYW5rRGlyPT09ImJ0Inx8cmFua0Rpcj09PSJybCIpcmV2ZXJzZVkoZyk7aWYocmFua0Rpcj09PSJsciJ8fHJhbmtEaXI9PT0icmwiKXtzd2FwWFkoZyk7c3dhcFdpZHRoSGVpZ2h0KGcpfX1mdW5jdGlvbiBzd2FwV2lkdGhIZWlnaHQoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtzd2FwV2lkdGhIZWlnaHRPbmUoZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7c3dhcFdpZHRoSGVpZ2h0T25lKGcuZWRnZShlKSl9KX1mdW5jdGlvbiBzd2FwV2lkdGhIZWlnaHRPbmUoYXR0cnMpe3ZhciB3PWF0dHJzLndpZHRoO2F0dHJzLndpZHRoPWF0dHJzLmhlaWdodDthdHRycy5oZWlnaHQ9d31mdW5jdGlvbiByZXZlcnNlWShnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldmVyc2VZT25lKGcubm9kZSh2KSl9KTtfLmZvckVhY2goZy5lZGdlcygpLApmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7Xy5mb3JFYWNoKGVkZ2UucG9pbnRzLHJldmVyc2VZT25lKTtpZihfLmhhcyhlZGdlLCJ5IikpcmV2ZXJzZVlPbmUoZWRnZSl9KX1mdW5jdGlvbiByZXZlcnNlWU9uZShhdHRycyl7YXR0cnMueT0tYXR0cnMueX1mdW5jdGlvbiBzd2FwWFkoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtzd2FwWFlPbmUoZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO18uZm9yRWFjaChlZGdlLnBvaW50cyxzd2FwWFlPbmUpO2lmKF8uaGFzKGVkZ2UsIngiKSlzd2FwWFlPbmUoZWRnZSl9KX1mdW5jdGlvbiBzd2FwWFlPbmUoYXR0cnMpe3ZhciB4PWF0dHJzLng7YXR0cnMueD1hdHRycy55O2F0dHJzLnk9eH19LHsiLi9sb2Rhc2giOjEwfV0sNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9TGlzdDtmdW5jdGlvbiBMaXN0KCl7dmFyIHNlbnRpbmVsPQp7fTtzZW50aW5lbC5fbmV4dD1zZW50aW5lbC5fcHJldj1zZW50aW5lbDt0aGlzLl9zZW50aW5lbD1zZW50aW5lbH1MaXN0LnByb3RvdHlwZS5kZXF1ZXVlPWZ1bmN0aW9uKCl7dmFyIHNlbnRpbmVsPXRoaXMuX3NlbnRpbmVsLGVudHJ5PXNlbnRpbmVsLl9wcmV2O2lmKGVudHJ5IT09c2VudGluZWwpe3VubGluayhlbnRyeSk7cmV0dXJuIGVudHJ5fX07TGlzdC5wcm90b3R5cGUuZW5xdWV1ZT1mdW5jdGlvbihlbnRyeSl7dmFyIHNlbnRpbmVsPXRoaXMuX3NlbnRpbmVsO2lmKGVudHJ5Ll9wcmV2JiZlbnRyeS5fbmV4dCl1bmxpbmsoZW50cnkpO2VudHJ5Ll9uZXh0PXNlbnRpbmVsLl9uZXh0O3NlbnRpbmVsLl9uZXh0Ll9wcmV2PWVudHJ5O3NlbnRpbmVsLl9uZXh0PWVudHJ5O2VudHJ5Ll9wcmV2PXNlbnRpbmVsfTtMaXN0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBzdHJzPVtdLHNlbnRpbmVsPXRoaXMuX3NlbnRpbmVsLGN1cnI9c2VudGluZWwuX3ByZXY7d2hpbGUoY3VyciE9PQpzZW50aW5lbCl7c3Rycy5wdXNoKEpTT04uc3RyaW5naWZ5KGN1cnIsZmlsdGVyT3V0TGlua3MpKTtjdXJyPWN1cnIuX3ByZXZ9cmV0dXJuIlsiK3N0cnMuam9pbigiLCAiKSsiXSJ9O2Z1bmN0aW9uIHVubGluayhlbnRyeSl7ZW50cnkuX3ByZXYuX25leHQ9ZW50cnkuX25leHQ7ZW50cnkuX25leHQuX3ByZXY9ZW50cnkuX3ByZXY7ZGVsZXRlIGVudHJ5Ll9uZXh0O2RlbGV0ZSBlbnRyeS5fcHJldn1mdW5jdGlvbiBmaWx0ZXJPdXRMaW5rcyhrLHYpe2lmKGshPT0iX25leHQiJiZrIT09Il9wcmV2IilyZXR1cm4gdn19LHt9XSw2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLHV0aWw9cmVxdWlyZSgiLi91dGlsIiksR3JhcGg9cmVxdWlyZSgiLi9ncmFwaGxpYiIpLkdyYXBoO21vZHVsZS5leHBvcnRzPXtkZWJ1Z09yZGVyaW5nOmRlYnVnT3JkZXJpbmd9O2Z1bmN0aW9uIGRlYnVnT3JkZXJpbmcoZyl7dmFyIGxheWVyTWF0cml4PQp1dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7dmFyIGg9KG5ldyBHcmFwaCh7Y29tcG91bmQ6dHJ1ZSxtdWx0aWdyYXBoOnRydWV9KSkuc2V0R3JhcGgoe30pO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7aC5zZXROb2RlKHYse2xhYmVsOnZ9KTtoLnNldFBhcmVudCh2LCJsYXllciIrZy5ub2RlKHYpLnJhbmspfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXtoLnNldEVkZ2UoZS52LGUudyx7fSxlLm5hbWUpfSk7Xy5mb3JFYWNoKGxheWVyTWF0cml4LGZ1bmN0aW9uKGxheWVyLGkpe3ZhciBsYXllclY9ImxheWVyIitpO2guc2V0Tm9kZShsYXllclYse3Jhbms6InNhbWUifSk7Xy5yZWR1Y2UobGF5ZXIsZnVuY3Rpb24odSx2KXtoLnNldEVkZ2UodSx2LHtzdHlsZToiaW52aXMifSk7cmV0dXJuIHZ9KX0pO3JldHVybiBofX0seyIuL2dyYXBobGliIjo3LCIuL2xvZGFzaCI6MTAsIi4vdXRpbCI6Mjl9XSw3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgZ3JhcGhsaWI7CmlmKHR5cGVvZiByZXF1aXJlPT09ImZ1bmN0aW9uIil0cnl7Z3JhcGhsaWI9cmVxdWlyZSgiZ3JhcGhsaWIiKX1jYXRjaChlKXt9aWYoIWdyYXBobGliKWdyYXBobGliPXdpbmRvdy5ncmFwaGxpYjttb2R1bGUuZXhwb3J0cz1ncmFwaGxpYn0seyJncmFwaGxpYiI6dW5kZWZpbmVkfV0sODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSxHcmFwaD1yZXF1aXJlKCIuL2dyYXBobGliIikuR3JhcGgsTGlzdD1yZXF1aXJlKCIuL2RhdGEvbGlzdCIpO21vZHVsZS5leHBvcnRzPWdyZWVkeUZBUzt2YXIgREVGQVVMVF9XRUlHSFRfRk49Xy5jb25zdGFudCgxKTtmdW5jdGlvbiBncmVlZHlGQVMoZyx3ZWlnaHRGbil7aWYoZy5ub2RlQ291bnQoKTw9MSlyZXR1cm5bXTt2YXIgc3RhdGU9YnVpbGRTdGF0ZShnLHdlaWdodEZufHxERUZBVUxUX1dFSUdIVF9GTik7dmFyIHJlc3VsdHM9ZG9HcmVlZHlGQVMoc3RhdGUuZ3JhcGgsc3RhdGUuYnVja2V0cywKc3RhdGUuemVyb0lkeCk7cmV0dXJuIF8uZmxhdHRlbihfLm1hcChyZXN1bHRzLGZ1bmN0aW9uKGUpe3JldHVybiBnLm91dEVkZ2VzKGUudixlLncpfSksdHJ1ZSl9ZnVuY3Rpb24gZG9HcmVlZHlGQVMoZyxidWNrZXRzLHplcm9JZHgpe3ZhciByZXN1bHRzPVtdLHNvdXJjZXM9YnVja2V0c1tidWNrZXRzLmxlbmd0aC0xXSxzaW5rcz1idWNrZXRzWzBdO3ZhciBlbnRyeTt3aGlsZShnLm5vZGVDb3VudCgpKXt3aGlsZShlbnRyeT1zaW5rcy5kZXF1ZXVlKCkpcmVtb3ZlTm9kZShnLGJ1Y2tldHMsemVyb0lkeCxlbnRyeSk7d2hpbGUoZW50cnk9c291cmNlcy5kZXF1ZXVlKCkpcmVtb3ZlTm9kZShnLGJ1Y2tldHMsemVyb0lkeCxlbnRyeSk7aWYoZy5ub2RlQ291bnQoKSlmb3IodmFyIGk9YnVja2V0cy5sZW5ndGgtMjtpPjA7LS1pKXtlbnRyeT1idWNrZXRzW2ldLmRlcXVldWUoKTtpZihlbnRyeSl7cmVzdWx0cz1yZXN1bHRzLmNvbmNhdChyZW1vdmVOb2RlKGcsYnVja2V0cyx6ZXJvSWR4LAplbnRyeSx0cnVlKSk7YnJlYWt9fX1yZXR1cm4gcmVzdWx0c31mdW5jdGlvbiByZW1vdmVOb2RlKGcsYnVja2V0cyx6ZXJvSWR4LGVudHJ5LGNvbGxlY3RQcmVkZWNlc3NvcnMpe3ZhciByZXN1bHRzPWNvbGxlY3RQcmVkZWNlc3NvcnM/W106dW5kZWZpbmVkO18uZm9yRWFjaChnLmluRWRnZXMoZW50cnkudiksZnVuY3Rpb24oZWRnZSl7dmFyIHdlaWdodD1nLmVkZ2UoZWRnZSksdUVudHJ5PWcubm9kZShlZGdlLnYpO2lmKGNvbGxlY3RQcmVkZWNlc3NvcnMpcmVzdWx0cy5wdXNoKHt2OmVkZ2Uudix3OmVkZ2Uud30pO3VFbnRyeS5vdXQtPXdlaWdodDthc3NpZ25CdWNrZXQoYnVja2V0cyx6ZXJvSWR4LHVFbnRyeSl9KTtfLmZvckVhY2goZy5vdXRFZGdlcyhlbnRyeS52KSxmdW5jdGlvbihlZGdlKXt2YXIgd2VpZ2h0PWcuZWRnZShlZGdlKSx3PWVkZ2Uudyx3RW50cnk9Zy5ub2RlKHcpO3dFbnRyeVsiaW4iXS09d2VpZ2h0O2Fzc2lnbkJ1Y2tldChidWNrZXRzLHplcm9JZHgsd0VudHJ5KX0pOwpnLnJlbW92ZU5vZGUoZW50cnkudik7cmV0dXJuIHJlc3VsdHN9ZnVuY3Rpb24gYnVpbGRTdGF0ZShnLHdlaWdodEZuKXt2YXIgZmFzR3JhcGg9bmV3IEdyYXBoLG1heEluPTAsbWF4T3V0PTA7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtmYXNHcmFwaC5zZXROb2RlKHYse3Y6diwiaW4iOjAsb3V0OjB9KX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIHByZXZXZWlnaHQ9ZmFzR3JhcGguZWRnZShlLnYsZS53KXx8MCx3ZWlnaHQ9d2VpZ2h0Rm4oZSksZWRnZVdlaWdodD1wcmV2V2VpZ2h0K3dlaWdodDtmYXNHcmFwaC5zZXRFZGdlKGUudixlLncsZWRnZVdlaWdodCk7bWF4T3V0PU1hdGgubWF4KG1heE91dCxmYXNHcmFwaC5ub2RlKGUudikub3V0Kz13ZWlnaHQpO21heEluPU1hdGgubWF4KG1heEluLGZhc0dyYXBoLm5vZGUoZS53KVsiaW4iXSs9d2VpZ2h0KX0pO3ZhciBidWNrZXRzPV8ucmFuZ2UobWF4T3V0K21heEluKzMpLm1hcChmdW5jdGlvbigpe3JldHVybiBuZXcgTGlzdH0pOwp2YXIgemVyb0lkeD1tYXhJbisxO18uZm9yRWFjaChmYXNHcmFwaC5ub2RlcygpLGZ1bmN0aW9uKHYpe2Fzc2lnbkJ1Y2tldChidWNrZXRzLHplcm9JZHgsZmFzR3JhcGgubm9kZSh2KSl9KTtyZXR1cm57Z3JhcGg6ZmFzR3JhcGgsYnVja2V0czpidWNrZXRzLHplcm9JZHg6emVyb0lkeH19ZnVuY3Rpb24gYXNzaWduQnVja2V0KGJ1Y2tldHMsemVyb0lkeCxlbnRyeSl7aWYoIWVudHJ5Lm91dClidWNrZXRzWzBdLmVucXVldWUoZW50cnkpO2Vsc2UgaWYoIWVudHJ5WyJpbiJdKWJ1Y2tldHNbYnVja2V0cy5sZW5ndGgtMV0uZW5xdWV1ZShlbnRyeSk7ZWxzZSBidWNrZXRzW2VudHJ5Lm91dC1lbnRyeVsiaW4iXSt6ZXJvSWR4XS5lbnF1ZXVlKGVudHJ5KX19LHsiLi9kYXRhL2xpc3QiOjUsIi4vZ3JhcGhsaWIiOjcsIi4vbG9kYXNoIjoxMH1dLDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksYWN5Y2xpYz1yZXF1aXJlKCIuL2FjeWNsaWMiKSwKbm9ybWFsaXplPXJlcXVpcmUoIi4vbm9ybWFsaXplIikscmFuaz1yZXF1aXJlKCIuL3JhbmsiKSxub3JtYWxpemVSYW5rcz1yZXF1aXJlKCIuL3V0aWwiKS5ub3JtYWxpemVSYW5rcyxwYXJlbnREdW1teUNoYWlucz1yZXF1aXJlKCIuL3BhcmVudC1kdW1teS1jaGFpbnMiKSxyZW1vdmVFbXB0eVJhbmtzPXJlcXVpcmUoIi4vdXRpbCIpLnJlbW92ZUVtcHR5UmFua3MsbmVzdGluZ0dyYXBoPXJlcXVpcmUoIi4vbmVzdGluZy1ncmFwaCIpLGFkZEJvcmRlclNlZ21lbnRzPXJlcXVpcmUoIi4vYWRkLWJvcmRlci1zZWdtZW50cyIpLGNvb3JkaW5hdGVTeXN0ZW09cmVxdWlyZSgiLi9jb29yZGluYXRlLXN5c3RlbSIpLG9yZGVyPXJlcXVpcmUoIi4vb3JkZXIiKSxwb3NpdGlvbj1yZXF1aXJlKCIuL3Bvc2l0aW9uIiksdXRpbD1yZXF1aXJlKCIuL3V0aWwiKSxHcmFwaD1yZXF1aXJlKCIuL2dyYXBobGliIikuR3JhcGg7bW9kdWxlLmV4cG9ydHM9bGF5b3V0O2Z1bmN0aW9uIGxheW91dChnLG9wdHMpe3ZhciB0aW1lPQpvcHRzJiZvcHRzLmRlYnVnVGltaW5nP3V0aWwudGltZTp1dGlsLm5vdGltZTt0aW1lKCJsYXlvdXQiLGZ1bmN0aW9uKCl7dmFyIGxheW91dEdyYXBoPXRpbWUoIiAgYnVpbGRMYXlvdXRHcmFwaCIsZnVuY3Rpb24oKXtyZXR1cm4gYnVpbGRMYXlvdXRHcmFwaChnKX0pO3RpbWUoIiAgcnVuTGF5b3V0IixmdW5jdGlvbigpe3J1bkxheW91dChsYXlvdXRHcmFwaCx0aW1lKX0pO3RpbWUoIiAgdXBkYXRlSW5wdXRHcmFwaCIsZnVuY3Rpb24oKXt1cGRhdGVJbnB1dEdyYXBoKGcsbGF5b3V0R3JhcGgpfSl9KX1mdW5jdGlvbiBydW5MYXlvdXQoZyx0aW1lKXt0aW1lKCIgICAgbWFrZVNwYWNlRm9yRWRnZUxhYmVscyIsZnVuY3Rpb24oKXttYWtlU3BhY2VGb3JFZGdlTGFiZWxzKGcpfSk7dGltZSgiICAgIHJlbW92ZVNlbGZFZGdlcyIsZnVuY3Rpb24oKXtyZW1vdmVTZWxmRWRnZXMoZyl9KTt0aW1lKCIgICAgYWN5Y2xpYyIsZnVuY3Rpb24oKXthY3ljbGljLnJ1bihnKX0pO3RpbWUoIiAgICBuZXN0aW5nR3JhcGgucnVuIiwKZnVuY3Rpb24oKXtuZXN0aW5nR3JhcGgucnVuKGcpfSk7dGltZSgiICAgIHJhbmsiLGZ1bmN0aW9uKCl7cmFuayh1dGlsLmFzTm9uQ29tcG91bmRHcmFwaChnKSl9KTt0aW1lKCIgICAgaW5qZWN0RWRnZUxhYmVsUHJveGllcyIsZnVuY3Rpb24oKXtpbmplY3RFZGdlTGFiZWxQcm94aWVzKGcpfSk7dGltZSgiICAgIHJlbW92ZUVtcHR5UmFua3MiLGZ1bmN0aW9uKCl7cmVtb3ZlRW1wdHlSYW5rcyhnKX0pO3RpbWUoIiAgICBuZXN0aW5nR3JhcGguY2xlYW51cCIsZnVuY3Rpb24oKXtuZXN0aW5nR3JhcGguY2xlYW51cChnKX0pO3RpbWUoIiAgICBub3JtYWxpemVSYW5rcyIsZnVuY3Rpb24oKXtub3JtYWxpemVSYW5rcyhnKX0pO3RpbWUoIiAgICBhc3NpZ25SYW5rTWluTWF4IixmdW5jdGlvbigpe2Fzc2lnblJhbmtNaW5NYXgoZyl9KTt0aW1lKCIgICAgcmVtb3ZlRWRnZUxhYmVsUHJveGllcyIsZnVuY3Rpb24oKXtyZW1vdmVFZGdlTGFiZWxQcm94aWVzKGcpfSk7dGltZSgiICAgIG5vcm1hbGl6ZS5ydW4iLApmdW5jdGlvbigpe25vcm1hbGl6ZS5ydW4oZyl9KTt0aW1lKCIgICAgcGFyZW50RHVtbXlDaGFpbnMiLGZ1bmN0aW9uKCl7cGFyZW50RHVtbXlDaGFpbnMoZyl9KTt0aW1lKCIgICAgYWRkQm9yZGVyU2VnbWVudHMiLGZ1bmN0aW9uKCl7YWRkQm9yZGVyU2VnbWVudHMoZyl9KTt0aW1lKCIgICAgb3JkZXIiLGZ1bmN0aW9uKCl7b3JkZXIoZyl9KTt0aW1lKCIgICAgaW5zZXJ0U2VsZkVkZ2VzIixmdW5jdGlvbigpe2luc2VydFNlbGZFZGdlcyhnKX0pO3RpbWUoIiAgICBhZGp1c3RDb29yZGluYXRlU3lzdGVtIixmdW5jdGlvbigpe2Nvb3JkaW5hdGVTeXN0ZW0uYWRqdXN0KGcpfSk7dGltZSgiICAgIHBvc2l0aW9uIixmdW5jdGlvbigpe3Bvc2l0aW9uKGcpfSk7dGltZSgiICAgIHBvc2l0aW9uU2VsZkVkZ2VzIixmdW5jdGlvbigpe3Bvc2l0aW9uU2VsZkVkZ2VzKGcpfSk7dGltZSgiICAgIHJlbW92ZUJvcmRlck5vZGVzIixmdW5jdGlvbigpe3JlbW92ZUJvcmRlck5vZGVzKGcpfSk7dGltZSgiICAgIG5vcm1hbGl6ZS51bmRvIiwKZnVuY3Rpb24oKXtub3JtYWxpemUudW5kbyhnKX0pO3RpbWUoIiAgICBmaXh1cEVkZ2VMYWJlbENvb3JkcyIsZnVuY3Rpb24oKXtmaXh1cEVkZ2VMYWJlbENvb3JkcyhnKX0pO3RpbWUoIiAgICB1bmRvQ29vcmRpbmF0ZVN5c3RlbSIsZnVuY3Rpb24oKXtjb29yZGluYXRlU3lzdGVtLnVuZG8oZyl9KTt0aW1lKCIgICAgdHJhbnNsYXRlR3JhcGgiLGZ1bmN0aW9uKCl7dHJhbnNsYXRlR3JhcGgoZyl9KTt0aW1lKCIgICAgYXNzaWduTm9kZUludGVyc2VjdHMiLGZ1bmN0aW9uKCl7YXNzaWduTm9kZUludGVyc2VjdHMoZyl9KTt0aW1lKCIgICAgcmV2ZXJzZVBvaW50cyIsZnVuY3Rpb24oKXtyZXZlcnNlUG9pbnRzRm9yUmV2ZXJzZWRFZGdlcyhnKX0pO3RpbWUoIiAgICBhY3ljbGljLnVuZG8iLGZ1bmN0aW9uKCl7YWN5Y2xpYy51bmRvKGcpfSl9ZnVuY3Rpb24gdXBkYXRlSW5wdXRHcmFwaChpbnB1dEdyYXBoLGxheW91dEdyYXBoKXtfLmZvckVhY2goaW5wdXRHcmFwaC5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBpbnB1dExhYmVsPQppbnB1dEdyYXBoLm5vZGUodiksbGF5b3V0TGFiZWw9bGF5b3V0R3JhcGgubm9kZSh2KTtpZihpbnB1dExhYmVsKXtpbnB1dExhYmVsLng9bGF5b3V0TGFiZWwueDtpbnB1dExhYmVsLnk9bGF5b3V0TGFiZWwueTtpZihsYXlvdXRHcmFwaC5jaGlsZHJlbih2KS5sZW5ndGgpe2lucHV0TGFiZWwud2lkdGg9bGF5b3V0TGFiZWwud2lkdGg7aW5wdXRMYWJlbC5oZWlnaHQ9bGF5b3V0TGFiZWwuaGVpZ2h0fX19KTtfLmZvckVhY2goaW5wdXRHcmFwaC5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBpbnB1dExhYmVsPWlucHV0R3JhcGguZWRnZShlKSxsYXlvdXRMYWJlbD1sYXlvdXRHcmFwaC5lZGdlKGUpO2lucHV0TGFiZWwucG9pbnRzPWxheW91dExhYmVsLnBvaW50cztpZihfLmhhcyhsYXlvdXRMYWJlbCwieCIpKXtpbnB1dExhYmVsLng9bGF5b3V0TGFiZWwueDtpbnB1dExhYmVsLnk9bGF5b3V0TGFiZWwueX19KTtpbnB1dEdyYXBoLmdyYXBoKCkud2lkdGg9bGF5b3V0R3JhcGguZ3JhcGgoKS53aWR0aDsKaW5wdXRHcmFwaC5ncmFwaCgpLmhlaWdodD1sYXlvdXRHcmFwaC5ncmFwaCgpLmhlaWdodH12YXIgZ3JhcGhOdW1BdHRycz1bIm5vZGVzZXAiLCJlZGdlc2VwIiwicmFua3NlcCIsIm1hcmdpbngiLCJtYXJnaW55Il0sZ3JhcGhEZWZhdWx0cz17cmFua3NlcDo1MCxlZGdlc2VwOjIwLG5vZGVzZXA6NTAscmFua2RpcjoidGIifSxncmFwaEF0dHJzPVsiYWN5Y2xpY2VyIiwicmFua2VyIiwicmFua2RpciIsImFsaWduIl0sbm9kZU51bUF0dHJzPVsid2lkdGgiLCJoZWlnaHQiXSxub2RlRGVmYXVsdHM9e3dpZHRoOjAsaGVpZ2h0OjB9LGVkZ2VOdW1BdHRycz1bIm1pbmxlbiIsIndlaWdodCIsIndpZHRoIiwiaGVpZ2h0IiwibGFiZWxvZmZzZXQiXSxlZGdlRGVmYXVsdHM9e21pbmxlbjoxLHdlaWdodDoxLHdpZHRoOjAsaGVpZ2h0OjAsbGFiZWxvZmZzZXQ6MTAsbGFiZWxwb3M6InIifSxlZGdlQXR0cnM9WyJsYWJlbHBvcyJdO2Z1bmN0aW9uIGJ1aWxkTGF5b3V0R3JhcGgoaW5wdXRHcmFwaCl7dmFyIGc9Cm5ldyBHcmFwaCh7bXVsdGlncmFwaDp0cnVlLGNvbXBvdW5kOnRydWV9KSxncmFwaD1jYW5vbmljYWxpemUoaW5wdXRHcmFwaC5ncmFwaCgpKTtnLnNldEdyYXBoKF8ubWVyZ2Uoe30sZ3JhcGhEZWZhdWx0cyxzZWxlY3ROdW1iZXJBdHRycyhncmFwaCxncmFwaE51bUF0dHJzKSxfLnBpY2soZ3JhcGgsZ3JhcGhBdHRycykpKTtfLmZvckVhY2goaW5wdXRHcmFwaC5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLm5vZGUodikpO2cuc2V0Tm9kZSh2LF8uZGVmYXVsdHMoc2VsZWN0TnVtYmVyQXR0cnMobm9kZSxub2RlTnVtQXR0cnMpLG5vZGVEZWZhdWx0cykpO2cuc2V0UGFyZW50KHYsaW5wdXRHcmFwaC5wYXJlbnQodikpfSk7Xy5mb3JFYWNoKGlucHV0R3JhcGguZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1jYW5vbmljYWxpemUoaW5wdXRHcmFwaC5lZGdlKGUpKTtnLnNldEVkZ2UoZSxfLm1lcmdlKHt9LGVkZ2VEZWZhdWx0cyxzZWxlY3ROdW1iZXJBdHRycyhlZGdlLAplZGdlTnVtQXR0cnMpLF8ucGljayhlZGdlLGVkZ2VBdHRycykpKX0pO3JldHVybiBnfWZ1bmN0aW9uIG1ha2VTcGFjZUZvckVkZ2VMYWJlbHMoZyl7dmFyIGdyYXBoPWcuZ3JhcGgoKTtncmFwaC5yYW5rc2VwLz0yO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2VkZ2UubWlubGVuKj0yO2lmKGVkZ2UubGFiZWxwb3MudG9Mb3dlckNhc2UoKSE9PSJjIilpZihncmFwaC5yYW5rZGlyPT09IlRCInx8Z3JhcGgucmFua2Rpcj09PSJCVCIpZWRnZS53aWR0aCs9ZWRnZS5sYWJlbG9mZnNldDtlbHNlIGVkZ2UuaGVpZ2h0Kz1lZGdlLmxhYmVsb2Zmc2V0fSl9ZnVuY3Rpb24gaW5qZWN0RWRnZUxhYmVsUHJveGllcyhnKXtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtpZihlZGdlLndpZHRoJiZlZGdlLmhlaWdodCl7dmFyIHY9Zy5ub2RlKGUudiksdz1nLm5vZGUoZS53KSxsYWJlbD17cmFuazoody5yYW5rLQp2LnJhbmspLzIrdi5yYW5rLGU6ZX07dXRpbC5hZGREdW1teU5vZGUoZywiZWRnZS1wcm94eSIsbGFiZWwsIl9lcCIpfX0pfWZ1bmN0aW9uIGFzc2lnblJhbmtNaW5NYXgoZyl7dmFyIG1heFJhbms9MDtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KTtpZihub2RlLmJvcmRlclRvcCl7bm9kZS5taW5SYW5rPWcubm9kZShub2RlLmJvcmRlclRvcCkucmFuaztub2RlLm1heFJhbms9Zy5ub2RlKG5vZGUuYm9yZGVyQm90dG9tKS5yYW5rO21heFJhbms9Xy5tYXgobWF4UmFuayxub2RlLm1heFJhbmspfX0pO2cuZ3JhcGgoKS5tYXhSYW5rPW1heFJhbmt9ZnVuY3Rpb24gcmVtb3ZlRWRnZUxhYmVsUHJveGllcyhnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KTtpZihub2RlLmR1bW15PT09ImVkZ2UtcHJveHkiKXtnLmVkZ2Uobm9kZS5lKS5sYWJlbFJhbms9bm9kZS5yYW5rO2cucmVtb3ZlTm9kZSh2KX19KX0KZnVuY3Rpb24gdHJhbnNsYXRlR3JhcGgoZyl7dmFyIG1pblg9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLG1heFg9MCxtaW5ZPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxtYXhZPTAsZ3JhcGhMYWJlbD1nLmdyYXBoKCksbWFyZ2luWD1ncmFwaExhYmVsLm1hcmdpbnh8fDAsbWFyZ2luWT1ncmFwaExhYmVsLm1hcmdpbnl8fDA7ZnVuY3Rpb24gZ2V0RXh0cmVtZXMoYXR0cnMpe3ZhciB4PWF0dHJzLngseT1hdHRycy55LHc9YXR0cnMud2lkdGgsaD1hdHRycy5oZWlnaHQ7bWluWD1NYXRoLm1pbihtaW5YLHgtdy8yKTttYXhYPU1hdGgubWF4KG1heFgseCt3LzIpO21pblk9TWF0aC5taW4obWluWSx5LWgvMik7bWF4WT1NYXRoLm1heChtYXhZLHkraC8yKX1fLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2dldEV4dHJlbWVzKGcubm9kZSh2KSl9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtpZihfLmhhcyhlZGdlLCJ4IikpZ2V0RXh0cmVtZXMoZWRnZSl9KTsKbWluWC09bWFyZ2luWDttaW5ZLT1tYXJnaW5ZO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpO25vZGUueC09bWluWDtub2RlLnktPW1pbll9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtfLmZvckVhY2goZWRnZS5wb2ludHMsZnVuY3Rpb24ocCl7cC54LT1taW5YO3AueS09bWluWX0pO2lmKF8uaGFzKGVkZ2UsIngiKSllZGdlLngtPW1pblg7aWYoXy5oYXMoZWRnZSwieSIpKWVkZ2UueS09bWluWX0pO2dyYXBoTGFiZWwud2lkdGg9bWF4WC1taW5YK21hcmdpblg7Z3JhcGhMYWJlbC5oZWlnaHQ9bWF4WS1taW5ZK21hcmdpbll9ZnVuY3Rpb24gYXNzaWduTm9kZUludGVyc2VjdHMoZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSksbm9kZVY9Zy5ub2RlKGUudiksbm9kZVc9Zy5ub2RlKGUudykscDEscDI7aWYoIWVkZ2UucG9pbnRzKXtlZGdlLnBvaW50cz0KW107cDE9bm9kZVc7cDI9bm9kZVZ9ZWxzZXtwMT1lZGdlLnBvaW50c1swXTtwMj1lZGdlLnBvaW50c1tlZGdlLnBvaW50cy5sZW5ndGgtMV19ZWRnZS5wb2ludHMudW5zaGlmdCh1dGlsLmludGVyc2VjdFJlY3Qobm9kZVYscDEpKTtlZGdlLnBvaW50cy5wdXNoKHV0aWwuaW50ZXJzZWN0UmVjdChub2RlVyxwMikpfSl9ZnVuY3Rpb24gZml4dXBFZGdlTGFiZWxDb29yZHMoZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7aWYoXy5oYXMoZWRnZSwieCIpKXtpZihlZGdlLmxhYmVscG9zPT09ImwifHxlZGdlLmxhYmVscG9zPT09InIiKWVkZ2Uud2lkdGgtPWVkZ2UubGFiZWxvZmZzZXQ7c3dpdGNoKGVkZ2UubGFiZWxwb3Mpe2Nhc2UgImwiOmVkZ2UueC09ZWRnZS53aWR0aC8yK2VkZ2UubGFiZWxvZmZzZXQ7YnJlYWs7Y2FzZSAiciI6ZWRnZS54Kz1lZGdlLndpZHRoLzIrZWRnZS5sYWJlbG9mZnNldDticmVha319fSl9ZnVuY3Rpb24gcmV2ZXJzZVBvaW50c0ZvclJldmVyc2VkRWRnZXMoZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSwKZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2lmKGVkZ2UucmV2ZXJzZWQpZWRnZS5wb2ludHMucmV2ZXJzZSgpfSl9ZnVuY3Rpb24gcmVtb3ZlQm9yZGVyTm9kZXMoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtpZihnLmNoaWxkcmVuKHYpLmxlbmd0aCl7dmFyIG5vZGU9Zy5ub2RlKHYpLHQ9Zy5ub2RlKG5vZGUuYm9yZGVyVG9wKSxiPWcubm9kZShub2RlLmJvcmRlckJvdHRvbSksbD1nLm5vZGUoXy5sYXN0KG5vZGUuYm9yZGVyTGVmdCkpLHI9Zy5ub2RlKF8ubGFzdChub2RlLmJvcmRlclJpZ2h0KSk7bm9kZS53aWR0aD1NYXRoLmFicyhyLngtbC54KTtub2RlLmhlaWdodD1NYXRoLmFicyhiLnktdC55KTtub2RlLng9bC54K25vZGUud2lkdGgvMjtub2RlLnk9dC55K25vZGUuaGVpZ2h0LzJ9fSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtpZihnLm5vZGUodikuZHVtbXk9PT0iYm9yZGVyIilnLnJlbW92ZU5vZGUodil9KX1mdW5jdGlvbiByZW1vdmVTZWxmRWRnZXMoZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSwKZnVuY3Rpb24oZSl7aWYoZS52PT09ZS53KXt2YXIgbm9kZT1nLm5vZGUoZS52KTtpZighbm9kZS5zZWxmRWRnZXMpbm9kZS5zZWxmRWRnZXM9W107bm9kZS5zZWxmRWRnZXMucHVzaCh7ZTplLGxhYmVsOmcuZWRnZShlKX0pO2cucmVtb3ZlRWRnZShlKX19KX1mdW5jdGlvbiBpbnNlcnRTZWxmRWRnZXMoZyl7dmFyIGxheWVycz11dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7Xy5mb3JFYWNoKGxheWVycyxmdW5jdGlvbihsYXllcil7dmFyIG9yZGVyU2hpZnQ9MDtfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odixpKXt2YXIgbm9kZT1nLm5vZGUodik7bm9kZS5vcmRlcj1pK29yZGVyU2hpZnQ7Xy5mb3JFYWNoKG5vZGUuc2VsZkVkZ2VzLGZ1bmN0aW9uKHNlbGZFZGdlKXt1dGlsLmFkZER1bW15Tm9kZShnLCJzZWxmZWRnZSIse3dpZHRoOnNlbGZFZGdlLmxhYmVsLndpZHRoLGhlaWdodDpzZWxmRWRnZS5sYWJlbC5oZWlnaHQscmFuazpub2RlLnJhbmssb3JkZXI6aSsgKytvcmRlclNoaWZ0LAplOnNlbGZFZGdlLmUsbGFiZWw6c2VsZkVkZ2UubGFiZWx9LCJfc2UiKX0pO2RlbGV0ZSBub2RlLnNlbGZFZGdlc30pfSl9ZnVuY3Rpb24gcG9zaXRpb25TZWxmRWRnZXMoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodik7aWYobm9kZS5kdW1teT09PSJzZWxmZWRnZSIpe3ZhciBzZWxmTm9kZT1nLm5vZGUobm9kZS5lLnYpLHg9c2VsZk5vZGUueCtzZWxmTm9kZS53aWR0aC8yLHk9c2VsZk5vZGUueSxkeD1ub2RlLngteCxkeT1zZWxmTm9kZS5oZWlnaHQvMjtnLnNldEVkZ2Uobm9kZS5lLG5vZGUubGFiZWwpO2cucmVtb3ZlTm9kZSh2KTtub2RlLmxhYmVsLnBvaW50cz1be3g6eCsyKmR4LzMseTp5LWR5fSx7eDp4KzUqZHgvNix5OnktZHl9LHt4OngrZHgseTp5fSx7eDp4KzUqZHgvNix5OnkrZHl9LHt4OngrMipkeC8zLHk6eStkeX1dO25vZGUubGFiZWwueD1ub2RlLng7bm9kZS5sYWJlbC55PW5vZGUueX19KX1mdW5jdGlvbiBzZWxlY3ROdW1iZXJBdHRycyhvYmosCmF0dHJzKXtyZXR1cm4gXy5tYXBWYWx1ZXMoXy5waWNrKG9iaixhdHRycyksTnVtYmVyKX1mdW5jdGlvbiBjYW5vbmljYWxpemUoYXR0cnMpe3ZhciBuZXdBdHRycz17fTtfLmZvckVhY2goYXR0cnMsZnVuY3Rpb24odixrKXtuZXdBdHRyc1trLnRvTG93ZXJDYXNlKCldPXZ9KTtyZXR1cm4gbmV3QXR0cnN9fSx7Ii4vYWN5Y2xpYyI6MiwiLi9hZGQtYm9yZGVyLXNlZ21lbnRzIjozLCIuL2Nvb3JkaW5hdGUtc3lzdGVtIjo0LCIuL2dyYXBobGliIjo3LCIuL2xvZGFzaCI6MTAsIi4vbmVzdGluZy1ncmFwaCI6MTEsIi4vbm9ybWFsaXplIjoxMiwiLi9vcmRlciI6MTcsIi4vcGFyZW50LWR1bW15LWNoYWlucyI6MjIsIi4vcG9zaXRpb24iOjI0LCIuL3JhbmsiOjI2LCIuL3V0aWwiOjI5fV0sMTA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBsb2Rhc2g7aWYodHlwZW9mIHJlcXVpcmU9PT0iZnVuY3Rpb24iKXRyeXtsb2Rhc2g9cmVxdWlyZSgibG9kYXNoIil9Y2F0Y2goZSl7fWlmKCFsb2Rhc2gpbG9kYXNoPQp3aW5kb3cuXzttb2R1bGUuZXhwb3J0cz1sb2Rhc2h9LHsibG9kYXNoIjp1bmRlZmluZWR9XSwxMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4vdXRpbCIpO21vZHVsZS5leHBvcnRzPXtydW46cnVuLGNsZWFudXA6Y2xlYW51cH07ZnVuY3Rpb24gcnVuKGcpe3ZhciByb290PXV0aWwuYWRkRHVtbXlOb2RlKGcsInJvb3QiLHt9LCJfcm9vdCIpO3ZhciBkZXB0aHM9dHJlZURlcHRocyhnKTt2YXIgaGVpZ2h0PV8ubWF4KF8udmFsdWVzKGRlcHRocykpLTE7dmFyIG5vZGVTZXA9MipoZWlnaHQrMTtnLmdyYXBoKCkubmVzdGluZ1Jvb3Q9cm9vdDtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe2cuZWRnZShlKS5taW5sZW4qPW5vZGVTZXB9KTt2YXIgd2VpZ2h0PXN1bVdlaWdodHMoZykrMTtfLmZvckVhY2goZy5jaGlsZHJlbigpLGZ1bmN0aW9uKGNoaWxkKXtkZnMoZyxyb290LG5vZGVTZXAsCndlaWdodCxoZWlnaHQsZGVwdGhzLGNoaWxkKX0pO2cuZ3JhcGgoKS5ub2RlUmFua0ZhY3Rvcj1ub2RlU2VwfWZ1bmN0aW9uIGRmcyhnLHJvb3Qsbm9kZVNlcCx3ZWlnaHQsaGVpZ2h0LGRlcHRocyx2KXt2YXIgY2hpbGRyZW49Zy5jaGlsZHJlbih2KTtpZighY2hpbGRyZW4ubGVuZ3RoKXtpZih2IT09cm9vdClnLnNldEVkZ2Uocm9vdCx2LHt3ZWlnaHQ6MCxtaW5sZW46bm9kZVNlcH0pO3JldHVybn12YXIgdG9wPXV0aWwuYWRkQm9yZGVyTm9kZShnLCJfYnQiKSxib3R0b209dXRpbC5hZGRCb3JkZXJOb2RlKGcsIl9iYiIpLGxhYmVsPWcubm9kZSh2KTtnLnNldFBhcmVudCh0b3Asdik7bGFiZWwuYm9yZGVyVG9wPXRvcDtnLnNldFBhcmVudChib3R0b20sdik7bGFiZWwuYm9yZGVyQm90dG9tPWJvdHRvbTtfLmZvckVhY2goY2hpbGRyZW4sZnVuY3Rpb24oY2hpbGQpe2RmcyhnLHJvb3Qsbm9kZVNlcCx3ZWlnaHQsaGVpZ2h0LGRlcHRocyxjaGlsZCk7dmFyIGNoaWxkTm9kZT1nLm5vZGUoY2hpbGQpLApjaGlsZFRvcD1jaGlsZE5vZGUuYm9yZGVyVG9wP2NoaWxkTm9kZS5ib3JkZXJUb3A6Y2hpbGQsY2hpbGRCb3R0b209Y2hpbGROb2RlLmJvcmRlckJvdHRvbT9jaGlsZE5vZGUuYm9yZGVyQm90dG9tOmNoaWxkLHRoaXNXZWlnaHQ9Y2hpbGROb2RlLmJvcmRlclRvcD93ZWlnaHQ6Mip3ZWlnaHQsbWlubGVuPWNoaWxkVG9wIT09Y2hpbGRCb3R0b20/MTpoZWlnaHQtZGVwdGhzW3ZdKzE7Zy5zZXRFZGdlKHRvcCxjaGlsZFRvcCx7d2VpZ2h0OnRoaXNXZWlnaHQsbWlubGVuOm1pbmxlbixuZXN0aW5nRWRnZTp0cnVlfSk7Zy5zZXRFZGdlKGNoaWxkQm90dG9tLGJvdHRvbSx7d2VpZ2h0OnRoaXNXZWlnaHQsbWlubGVuOm1pbmxlbixuZXN0aW5nRWRnZTp0cnVlfSl9KTtpZighZy5wYXJlbnQodikpZy5zZXRFZGdlKHJvb3QsdG9wLHt3ZWlnaHQ6MCxtaW5sZW46aGVpZ2h0K2RlcHRoc1t2XX0pfWZ1bmN0aW9uIHRyZWVEZXB0aHMoZyl7dmFyIGRlcHRocz17fTtmdW5jdGlvbiBkZnModixkZXB0aCl7dmFyIGNoaWxkcmVuPQpnLmNoaWxkcmVuKHYpO2lmKGNoaWxkcmVuJiZjaGlsZHJlbi5sZW5ndGgpXy5mb3JFYWNoKGNoaWxkcmVuLGZ1bmN0aW9uKGNoaWxkKXtkZnMoY2hpbGQsZGVwdGgrMSl9KTtkZXB0aHNbdl09ZGVwdGh9Xy5mb3JFYWNoKGcuY2hpbGRyZW4oKSxmdW5jdGlvbih2KXtkZnModiwxKX0pO3JldHVybiBkZXB0aHN9ZnVuY3Rpb24gc3VtV2VpZ2h0cyhnKXtyZXR1cm4gXy5yZWR1Y2UoZy5lZGdlcygpLGZ1bmN0aW9uKGFjYyxlKXtyZXR1cm4gYWNjK2cuZWRnZShlKS53ZWlnaHR9LDApfWZ1bmN0aW9uIGNsZWFudXAoZyl7dmFyIGdyYXBoTGFiZWw9Zy5ncmFwaCgpO2cucmVtb3ZlTm9kZShncmFwaExhYmVsLm5lc3RpbmdSb290KTtkZWxldGUgZ3JhcGhMYWJlbC5uZXN0aW5nUm9vdDtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtpZihlZGdlLm5lc3RpbmdFZGdlKWcucmVtb3ZlRWRnZShlKX0pfX0seyIuL2xvZGFzaCI6MTAsIi4vdXRpbCI6Mjl9XSwKMTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksdXRpbD1yZXF1aXJlKCIuL3V0aWwiKTttb2R1bGUuZXhwb3J0cz17cnVuOnJ1bix1bmRvOnVuZG99O2Z1bmN0aW9uIHJ1bihnKXtnLmdyYXBoKCkuZHVtbXlDaGFpbnM9W107Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlZGdlKXtub3JtYWxpemVFZGdlKGcsZWRnZSl9KX1mdW5jdGlvbiBub3JtYWxpemVFZGdlKGcsZSl7dmFyIHY9ZS52LHZSYW5rPWcubm9kZSh2KS5yYW5rLHc9ZS53LHdSYW5rPWcubm9kZSh3KS5yYW5rLG5hbWU9ZS5uYW1lLGVkZ2VMYWJlbD1nLmVkZ2UoZSksbGFiZWxSYW5rPWVkZ2VMYWJlbC5sYWJlbFJhbms7aWYod1Jhbms9PT12UmFuaysxKXJldHVybjtnLnJlbW92ZUVkZ2UoZSk7dmFyIGR1bW15LGF0dHJzLGk7Zm9yKGk9MCwrK3ZSYW5rO3ZSYW5rPHdSYW5rOysraSwrK3ZSYW5rKXtlZGdlTGFiZWwucG9pbnRzPVtdO2F0dHJzPXt3aWR0aDowLApoZWlnaHQ6MCxlZGdlTGFiZWw6ZWRnZUxhYmVsLGVkZ2VPYmo6ZSxyYW5rOnZSYW5rfTtkdW1teT11dGlsLmFkZER1bW15Tm9kZShnLCJlZGdlIixhdHRycywiX2QiKTtpZih2UmFuaz09PWxhYmVsUmFuayl7YXR0cnMud2lkdGg9ZWRnZUxhYmVsLndpZHRoO2F0dHJzLmhlaWdodD1lZGdlTGFiZWwuaGVpZ2h0O2F0dHJzLmR1bW15PSJlZGdlLWxhYmVsIjthdHRycy5sYWJlbHBvcz1lZGdlTGFiZWwubGFiZWxwb3N9Zy5zZXRFZGdlKHYsZHVtbXkse3dlaWdodDplZGdlTGFiZWwud2VpZ2h0fSxuYW1lKTtpZihpPT09MClnLmdyYXBoKCkuZHVtbXlDaGFpbnMucHVzaChkdW1teSk7dj1kdW1teX1nLnNldEVkZ2Uodix3LHt3ZWlnaHQ6ZWRnZUxhYmVsLndlaWdodH0sbmFtZSl9ZnVuY3Rpb24gdW5kbyhnKXtfLmZvckVhY2goZy5ncmFwaCgpLmR1bW15Q2hhaW5zLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KSxvcmlnTGFiZWw9bm9kZS5lZGdlTGFiZWwsdztnLnNldEVkZ2Uobm9kZS5lZGdlT2JqLApvcmlnTGFiZWwpO3doaWxlKG5vZGUuZHVtbXkpe3c9Zy5zdWNjZXNzb3JzKHYpWzBdO2cucmVtb3ZlTm9kZSh2KTtvcmlnTGFiZWwucG9pbnRzLnB1c2goe3g6bm9kZS54LHk6bm9kZS55fSk7aWYobm9kZS5kdW1teT09PSJlZGdlLWxhYmVsIil7b3JpZ0xhYmVsLng9bm9kZS54O29yaWdMYWJlbC55PW5vZGUueTtvcmlnTGFiZWwud2lkdGg9bm9kZS53aWR0aDtvcmlnTGFiZWwuaGVpZ2h0PW5vZGUuaGVpZ2h0fXY9dztub2RlPWcubm9kZSh2KX19KX19LHsiLi9sb2Rhc2giOjEwLCIuL3V0aWwiOjI5fV0sMTM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWFkZFN1YmdyYXBoQ29uc3RyYWludHM7ZnVuY3Rpb24gYWRkU3ViZ3JhcGhDb25zdHJhaW50cyhnLGNnLHZzKXt2YXIgcHJldj17fSxyb290UHJldjtfLmZvckVhY2godnMsZnVuY3Rpb24odil7dmFyIGNoaWxkPWcucGFyZW50KHYpLHBhcmVudCwKcHJldkNoaWxkO3doaWxlKGNoaWxkKXtwYXJlbnQ9Zy5wYXJlbnQoY2hpbGQpO2lmKHBhcmVudCl7cHJldkNoaWxkPXByZXZbcGFyZW50XTtwcmV2W3BhcmVudF09Y2hpbGR9ZWxzZXtwcmV2Q2hpbGQ9cm9vdFByZXY7cm9vdFByZXY9Y2hpbGR9aWYocHJldkNoaWxkJiZwcmV2Q2hpbGQhPT1jaGlsZCl7Y2cuc2V0RWRnZShwcmV2Q2hpbGQsY2hpbGQpO3JldHVybn1jaGlsZD1wYXJlbnR9fSl9fSx7Ii4uL2xvZGFzaCI6MTB9XSwxNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9YmFyeWNlbnRlcjtmdW5jdGlvbiBiYXJ5Y2VudGVyKGcsbW92YWJsZSl7cmV0dXJuIF8ubWFwKG1vdmFibGUsZnVuY3Rpb24odil7dmFyIGluVj1nLmluRWRnZXModik7aWYoIWluVi5sZW5ndGgpcmV0dXJue3Y6dn07ZWxzZXt2YXIgcmVzdWx0PV8ucmVkdWNlKGluVixmdW5jdGlvbihhY2MsZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpLApub2RlVT1nLm5vZGUoZS52KTtyZXR1cm57c3VtOmFjYy5zdW0rZWRnZS53ZWlnaHQqbm9kZVUub3JkZXIsd2VpZ2h0OmFjYy53ZWlnaHQrZWRnZS53ZWlnaHR9fSx7c3VtOjAsd2VpZ2h0OjB9KTtyZXR1cm57djp2LGJhcnljZW50ZXI6cmVzdWx0LnN1bS9yZXN1bHQud2VpZ2h0LHdlaWdodDpyZXN1bHQud2VpZ2h0fX19KX19LHsiLi4vbG9kYXNoIjoxMH1dLDE1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxHcmFwaD1yZXF1aXJlKCIuLi9ncmFwaGxpYiIpLkdyYXBoO21vZHVsZS5leHBvcnRzPWJ1aWxkTGF5ZXJHcmFwaDtmdW5jdGlvbiBidWlsZExheWVyR3JhcGgoZyxyYW5rLHJlbGF0aW9uc2hpcCl7dmFyIHJvb3Q9Y3JlYXRlUm9vdE5vZGUoZykscmVzdWx0PShuZXcgR3JhcGgoe2NvbXBvdW5kOnRydWV9KSkuc2V0R3JhcGgoe3Jvb3Q6cm9vdH0pLnNldERlZmF1bHROb2RlTGFiZWwoZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KX0pOwpfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KSxwYXJlbnQ9Zy5wYXJlbnQodik7aWYobm9kZS5yYW5rPT09cmFua3x8bm9kZS5taW5SYW5rPD1yYW5rJiZyYW5rPD1ub2RlLm1heFJhbmspe3Jlc3VsdC5zZXROb2RlKHYpO3Jlc3VsdC5zZXRQYXJlbnQodixwYXJlbnR8fHJvb3QpO18uZm9yRWFjaChnW3JlbGF0aW9uc2hpcF0odiksZnVuY3Rpb24oZSl7dmFyIHU9ZS52PT09dj9lLnc6ZS52LGVkZ2U9cmVzdWx0LmVkZ2UodSx2KSx3ZWlnaHQ9IV8uaXNVbmRlZmluZWQoZWRnZSk/ZWRnZS53ZWlnaHQ6MDtyZXN1bHQuc2V0RWRnZSh1LHYse3dlaWdodDpnLmVkZ2UoZSkud2VpZ2h0K3dlaWdodH0pfSk7aWYoXy5oYXMobm9kZSwibWluUmFuayIpKXJlc3VsdC5zZXROb2RlKHYse2JvcmRlckxlZnQ6bm9kZS5ib3JkZXJMZWZ0W3JhbmtdLGJvcmRlclJpZ2h0Om5vZGUuYm9yZGVyUmlnaHRbcmFua119KX19KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNyZWF0ZVJvb3ROb2RlKGcpe3ZhciB2Owp3aGlsZShnLmhhc05vZGUodj1fLnVuaXF1ZUlkKCJfcm9vdCIpKSk7cmV0dXJuIHZ9fSx7Ii4uL2dyYXBobGliIjo3LCIuLi9sb2Rhc2giOjEwfV0sMTY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWNyb3NzQ291bnQ7ZnVuY3Rpb24gY3Jvc3NDb3VudChnLGxheWVyaW5nKXt2YXIgY2M9MDtmb3IodmFyIGk9MTtpPGxheWVyaW5nLmxlbmd0aDsrK2kpY2MrPXR3b0xheWVyQ3Jvc3NDb3VudChnLGxheWVyaW5nW2ktMV0sbGF5ZXJpbmdbaV0pO3JldHVybiBjY31mdW5jdGlvbiB0d29MYXllckNyb3NzQ291bnQoZyxub3J0aExheWVyLHNvdXRoTGF5ZXIpe3ZhciBzb3V0aFBvcz1fLnppcE9iamVjdChzb3V0aExheWVyLF8ubWFwKHNvdXRoTGF5ZXIsZnVuY3Rpb24odixpKXtyZXR1cm4gaX0pKTt2YXIgc291dGhFbnRyaWVzPV8uZmxhdHRlbihfLm1hcChub3J0aExheWVyLGZ1bmN0aW9uKHYpe3JldHVybiBfLmNoYWluKGcub3V0RWRnZXModikpLm1hcChmdW5jdGlvbihlKXtyZXR1cm57cG9zOnNvdXRoUG9zW2Uud10sCndlaWdodDpnLmVkZ2UoZSkud2VpZ2h0fX0pLnNvcnRCeSgicG9zIikudmFsdWUoKX0pLHRydWUpO3ZhciBmaXJzdEluZGV4PTE7d2hpbGUoZmlyc3RJbmRleDxzb3V0aExheWVyLmxlbmd0aClmaXJzdEluZGV4PDw9MTt2YXIgdHJlZVNpemU9MipmaXJzdEluZGV4LTE7Zmlyc3RJbmRleC09MTt2YXIgdHJlZT1fLm1hcChuZXcgQXJyYXkodHJlZVNpemUpLGZ1bmN0aW9uKCl7cmV0dXJuIDB9KTt2YXIgY2M9MDtfLmZvckVhY2goc291dGhFbnRyaWVzLmZvckVhY2goZnVuY3Rpb24oZW50cnkpe3ZhciBpbmRleD1lbnRyeS5wb3MrZmlyc3RJbmRleDt0cmVlW2luZGV4XSs9ZW50cnkud2VpZ2h0O3ZhciB3ZWlnaHRTdW09MDt3aGlsZShpbmRleD4wKXtpZihpbmRleCUyKXdlaWdodFN1bSs9dHJlZVtpbmRleCsxXTtpbmRleD1pbmRleC0xPj4xO3RyZWVbaW5kZXhdKz1lbnRyeS53ZWlnaHR9Y2MrPWVudHJ5LndlaWdodCp3ZWlnaHRTdW19KSk7cmV0dXJuIGNjfX0seyIuLi9sb2Rhc2giOjEwfV0sCjE3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxpbml0T3JkZXI9cmVxdWlyZSgiLi9pbml0LW9yZGVyIiksY3Jvc3NDb3VudD1yZXF1aXJlKCIuL2Nyb3NzLWNvdW50Iiksc29ydFN1YmdyYXBoPXJlcXVpcmUoIi4vc29ydC1zdWJncmFwaCIpLGJ1aWxkTGF5ZXJHcmFwaD1yZXF1aXJlKCIuL2J1aWxkLWxheWVyLWdyYXBoIiksYWRkU3ViZ3JhcGhDb25zdHJhaW50cz1yZXF1aXJlKCIuL2FkZC1zdWJncmFwaC1jb25zdHJhaW50cyIpLEdyYXBoPXJlcXVpcmUoIi4uL2dyYXBobGliIikuR3JhcGgsdXRpbD1yZXF1aXJlKCIuLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9b3JkZXI7ZnVuY3Rpb24gb3JkZXIoZyl7dmFyIG1heFJhbms9dXRpbC5tYXhSYW5rKGcpLGRvd25MYXllckdyYXBocz1idWlsZExheWVyR3JhcGhzKGcsXy5yYW5nZSgxLG1heFJhbmsrMSksImluRWRnZXMiKSx1cExheWVyR3JhcGhzPWJ1aWxkTGF5ZXJHcmFwaHMoZywKXy5yYW5nZShtYXhSYW5rLTEsLTEsLTEpLCJvdXRFZGdlcyIpO3ZhciBsYXllcmluZz1pbml0T3JkZXIoZyk7YXNzaWduT3JkZXIoZyxsYXllcmluZyk7dmFyIGJlc3RDQz1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksYmVzdDtmb3IodmFyIGk9MCxsYXN0QmVzdD0wO2xhc3RCZXN0PDQ7KytpLCsrbGFzdEJlc3Qpe3N3ZWVwTGF5ZXJHcmFwaHMoaSUyP2Rvd25MYXllckdyYXBoczp1cExheWVyR3JhcGhzLGklND49Mik7bGF5ZXJpbmc9dXRpbC5idWlsZExheWVyTWF0cml4KGcpO3ZhciBjYz1jcm9zc0NvdW50KGcsbGF5ZXJpbmcpO2lmKGNjPGJlc3RDQyl7bGFzdEJlc3Q9MDtiZXN0PV8uY2xvbmVEZWVwKGxheWVyaW5nKTtiZXN0Q0M9Y2N9fWFzc2lnbk9yZGVyKGcsYmVzdCl9ZnVuY3Rpb24gYnVpbGRMYXllckdyYXBocyhnLHJhbmtzLHJlbGF0aW9uc2hpcCl7cmV0dXJuIF8ubWFwKHJhbmtzLGZ1bmN0aW9uKHJhbmspe3JldHVybiBidWlsZExheWVyR3JhcGgoZyxyYW5rLHJlbGF0aW9uc2hpcCl9KX0KZnVuY3Rpb24gc3dlZXBMYXllckdyYXBocyhsYXllckdyYXBocyxiaWFzUmlnaHQpe3ZhciBjZz1uZXcgR3JhcGg7Xy5mb3JFYWNoKGxheWVyR3JhcGhzLGZ1bmN0aW9uKGxnKXt2YXIgcm9vdD1sZy5ncmFwaCgpLnJvb3Q7dmFyIHNvcnRlZD1zb3J0U3ViZ3JhcGgobGcscm9vdCxjZyxiaWFzUmlnaHQpO18uZm9yRWFjaChzb3J0ZWQudnMsZnVuY3Rpb24odixpKXtsZy5ub2RlKHYpLm9yZGVyPWl9KTthZGRTdWJncmFwaENvbnN0cmFpbnRzKGxnLGNnLHNvcnRlZC52cyl9KX1mdW5jdGlvbiBhc3NpZ25PcmRlcihnLGxheWVyaW5nKXtfLmZvckVhY2gobGF5ZXJpbmcsZnVuY3Rpb24obGF5ZXIpe18uZm9yRWFjaChsYXllcixmdW5jdGlvbih2LGkpe2cubm9kZSh2KS5vcmRlcj1pfSl9KX19LHsiLi4vZ3JhcGhsaWIiOjcsIi4uL2xvZGFzaCI6MTAsIi4uL3V0aWwiOjI5LCIuL2FkZC1zdWJncmFwaC1jb25zdHJhaW50cyI6MTMsIi4vYnVpbGQtbGF5ZXItZ3JhcGgiOjE1LCIuL2Nyb3NzLWNvdW50IjoxNiwKIi4vaW5pdC1vcmRlciI6MTgsIi4vc29ydC1zdWJncmFwaCI6MjB9XSwxODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9aW5pdE9yZGVyO2Z1bmN0aW9uIGluaXRPcmRlcihnKXt2YXIgdmlzaXRlZD17fSxzaW1wbGVOb2Rlcz1fLmZpbHRlcihnLm5vZGVzKCksZnVuY3Rpb24odil7cmV0dXJuIWcuY2hpbGRyZW4odikubGVuZ3RofSksbWF4UmFuaz1fLm1heChfLm1hcChzaW1wbGVOb2RlcyxmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpLnJhbmt9KSksbGF5ZXJzPV8ubWFwKF8ucmFuZ2UobWF4UmFuaysxKSxmdW5jdGlvbigpe3JldHVybltdfSk7ZnVuY3Rpb24gZGZzKHYpe2lmKF8uaGFzKHZpc2l0ZWQsdikpcmV0dXJuO3Zpc2l0ZWRbdl09dHJ1ZTt2YXIgbm9kZT1nLm5vZGUodik7bGF5ZXJzW25vZGUucmFua10ucHVzaCh2KTtfLmZvckVhY2goZy5zdWNjZXNzb3JzKHYpLGRmcyl9dmFyIG9yZGVyZWRWcz0KXy5zb3J0Qnkoc2ltcGxlTm9kZXMsZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KS5yYW5rfSk7Xy5mb3JFYWNoKG9yZGVyZWRWcyxkZnMpO3JldHVybiBsYXllcnN9fSx7Ii4uL2xvZGFzaCI6MTB9XSwxOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9cmVzb2x2ZUNvbmZsaWN0cztmdW5jdGlvbiByZXNvbHZlQ29uZmxpY3RzKGVudHJpZXMsY2cpe3ZhciBtYXBwZWRFbnRyaWVzPXt9O18uZm9yRWFjaChlbnRyaWVzLGZ1bmN0aW9uKGVudHJ5LGkpe3ZhciB0bXA9bWFwcGVkRW50cmllc1tlbnRyeS52XT17aW5kZWdyZWU6MCwiaW4iOltdLG91dDpbXSx2czpbZW50cnkudl0saTppfTtpZighXy5pc1VuZGVmaW5lZChlbnRyeS5iYXJ5Y2VudGVyKSl7dG1wLmJhcnljZW50ZXI9ZW50cnkuYmFyeWNlbnRlcjt0bXAud2VpZ2h0PWVudHJ5LndlaWdodH19KTtfLmZvckVhY2goY2cuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZW50cnlWPQptYXBwZWRFbnRyaWVzW2Uudl0sZW50cnlXPW1hcHBlZEVudHJpZXNbZS53XTtpZighXy5pc1VuZGVmaW5lZChlbnRyeVYpJiYhXy5pc1VuZGVmaW5lZChlbnRyeVcpKXtlbnRyeVcuaW5kZWdyZWUrKztlbnRyeVYub3V0LnB1c2gobWFwcGVkRW50cmllc1tlLnddKX19KTt2YXIgc291cmNlU2V0PV8uZmlsdGVyKG1hcHBlZEVudHJpZXMsZnVuY3Rpb24oZW50cnkpe3JldHVybiFlbnRyeS5pbmRlZ3JlZX0pO3JldHVybiBkb1Jlc29sdmVDb25mbGljdHMoc291cmNlU2V0KX1mdW5jdGlvbiBkb1Jlc29sdmVDb25mbGljdHMoc291cmNlU2V0KXt2YXIgZW50cmllcz1bXTtmdW5jdGlvbiBoYW5kbGVJbih2RW50cnkpe3JldHVybiBmdW5jdGlvbih1RW50cnkpe2lmKHVFbnRyeS5tZXJnZWQpcmV0dXJuO2lmKF8uaXNVbmRlZmluZWQodUVudHJ5LmJhcnljZW50ZXIpfHxfLmlzVW5kZWZpbmVkKHZFbnRyeS5iYXJ5Y2VudGVyKXx8dUVudHJ5LmJhcnljZW50ZXI+PXZFbnRyeS5iYXJ5Y2VudGVyKW1lcmdlRW50cmllcyh2RW50cnksCnVFbnRyeSl9fWZ1bmN0aW9uIGhhbmRsZU91dCh2RW50cnkpe3JldHVybiBmdW5jdGlvbih3RW50cnkpe3dFbnRyeVsiaW4iXS5wdXNoKHZFbnRyeSk7aWYoLS13RW50cnkuaW5kZWdyZWU9PT0wKXNvdXJjZVNldC5wdXNoKHdFbnRyeSl9fXdoaWxlKHNvdXJjZVNldC5sZW5ndGgpe3ZhciBlbnRyeT1zb3VyY2VTZXQucG9wKCk7ZW50cmllcy5wdXNoKGVudHJ5KTtfLmZvckVhY2goZW50cnlbImluIl0ucmV2ZXJzZSgpLGhhbmRsZUluKGVudHJ5KSk7Xy5mb3JFYWNoKGVudHJ5Lm91dCxoYW5kbGVPdXQoZW50cnkpKX1yZXR1cm4gXy5jaGFpbihlbnRyaWVzKS5maWx0ZXIoZnVuY3Rpb24oZW50cnkpe3JldHVybiFlbnRyeS5tZXJnZWR9KS5tYXAoZnVuY3Rpb24oZW50cnkpe3JldHVybiBfLnBpY2soZW50cnksWyJ2cyIsImkiLCJiYXJ5Y2VudGVyIiwid2VpZ2h0Il0pfSkudmFsdWUoKX1mdW5jdGlvbiBtZXJnZUVudHJpZXModGFyZ2V0LHNvdXJjZSl7dmFyIHN1bT0wLHdlaWdodD0wOwppZih0YXJnZXQud2VpZ2h0KXtzdW0rPXRhcmdldC5iYXJ5Y2VudGVyKnRhcmdldC53ZWlnaHQ7d2VpZ2h0Kz10YXJnZXQud2VpZ2h0fWlmKHNvdXJjZS53ZWlnaHQpe3N1bSs9c291cmNlLmJhcnljZW50ZXIqc291cmNlLndlaWdodDt3ZWlnaHQrPXNvdXJjZS53ZWlnaHR9dGFyZ2V0LnZzPXNvdXJjZS52cy5jb25jYXQodGFyZ2V0LnZzKTt0YXJnZXQuYmFyeWNlbnRlcj1zdW0vd2VpZ2h0O3RhcmdldC53ZWlnaHQ9d2VpZ2h0O3RhcmdldC5pPU1hdGgubWluKHNvdXJjZS5pLHRhcmdldC5pKTtzb3VyY2UubWVyZ2VkPXRydWV9fSx7Ii4uL2xvZGFzaCI6MTB9XSwyMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksYmFyeWNlbnRlcj1yZXF1aXJlKCIuL2JhcnljZW50ZXIiKSxyZXNvbHZlQ29uZmxpY3RzPXJlcXVpcmUoIi4vcmVzb2x2ZS1jb25mbGljdHMiKSxzb3J0PXJlcXVpcmUoIi4vc29ydCIpO21vZHVsZS5leHBvcnRzPQpzb3J0U3ViZ3JhcGg7ZnVuY3Rpb24gc29ydFN1YmdyYXBoKGcsdixjZyxiaWFzUmlnaHQpe3ZhciBtb3ZhYmxlPWcuY2hpbGRyZW4odiksbm9kZT1nLm5vZGUodiksYmw9bm9kZT9ub2RlLmJvcmRlckxlZnQ6dW5kZWZpbmVkLGJyPW5vZGU/bm9kZS5ib3JkZXJSaWdodDp1bmRlZmluZWQsc3ViZ3JhcGhzPXt9O2lmKGJsKW1vdmFibGU9Xy5maWx0ZXIobW92YWJsZSxmdW5jdGlvbih3KXtyZXR1cm4gdyE9PWJsJiZ3IT09YnJ9KTt2YXIgYmFyeWNlbnRlcnM9YmFyeWNlbnRlcihnLG1vdmFibGUpO18uZm9yRWFjaChiYXJ5Y2VudGVycyxmdW5jdGlvbihlbnRyeSl7aWYoZy5jaGlsZHJlbihlbnRyeS52KS5sZW5ndGgpe3ZhciBzdWJncmFwaFJlc3VsdD1zb3J0U3ViZ3JhcGgoZyxlbnRyeS52LGNnLGJpYXNSaWdodCk7c3ViZ3JhcGhzW2VudHJ5LnZdPXN1YmdyYXBoUmVzdWx0O2lmKF8uaGFzKHN1YmdyYXBoUmVzdWx0LCJiYXJ5Y2VudGVyIikpbWVyZ2VCYXJ5Y2VudGVycyhlbnRyeSwKc3ViZ3JhcGhSZXN1bHQpfX0pO3ZhciBlbnRyaWVzPXJlc29sdmVDb25mbGljdHMoYmFyeWNlbnRlcnMsY2cpO2V4cGFuZFN1YmdyYXBocyhlbnRyaWVzLHN1YmdyYXBocyk7dmFyIHJlc3VsdD1zb3J0KGVudHJpZXMsYmlhc1JpZ2h0KTtpZihibCl7cmVzdWx0LnZzPV8uZmxhdHRlbihbYmwscmVzdWx0LnZzLGJyXSx0cnVlKTtpZihnLnByZWRlY2Vzc29ycyhibCkubGVuZ3RoKXt2YXIgYmxQcmVkPWcubm9kZShnLnByZWRlY2Vzc29ycyhibClbMF0pLGJyUHJlZD1nLm5vZGUoZy5wcmVkZWNlc3NvcnMoYnIpWzBdKTtpZighXy5oYXMocmVzdWx0LCJiYXJ5Y2VudGVyIikpe3Jlc3VsdC5iYXJ5Y2VudGVyPTA7cmVzdWx0LndlaWdodD0wfXJlc3VsdC5iYXJ5Y2VudGVyPShyZXN1bHQuYmFyeWNlbnRlcipyZXN1bHQud2VpZ2h0K2JsUHJlZC5vcmRlciticlByZWQub3JkZXIpLyhyZXN1bHQud2VpZ2h0KzIpO3Jlc3VsdC53ZWlnaHQrPTJ9fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gZXhwYW5kU3ViZ3JhcGhzKGVudHJpZXMsCnN1YmdyYXBocyl7Xy5mb3JFYWNoKGVudHJpZXMsZnVuY3Rpb24oZW50cnkpe2VudHJ5LnZzPV8uZmxhdHRlbihlbnRyeS52cy5tYXAoZnVuY3Rpb24odil7aWYoc3ViZ3JhcGhzW3ZdKXJldHVybiBzdWJncmFwaHNbdl0udnM7cmV0dXJuIHZ9KSx0cnVlKX0pfWZ1bmN0aW9uIG1lcmdlQmFyeWNlbnRlcnModGFyZ2V0LG90aGVyKXtpZighXy5pc1VuZGVmaW5lZCh0YXJnZXQuYmFyeWNlbnRlcikpe3RhcmdldC5iYXJ5Y2VudGVyPSh0YXJnZXQuYmFyeWNlbnRlcip0YXJnZXQud2VpZ2h0K290aGVyLmJhcnljZW50ZXIqb3RoZXIud2VpZ2h0KS8odGFyZ2V0LndlaWdodCtvdGhlci53ZWlnaHQpO3RhcmdldC53ZWlnaHQrPW90aGVyLndlaWdodH1lbHNle3RhcmdldC5iYXJ5Y2VudGVyPW90aGVyLmJhcnljZW50ZXI7dGFyZ2V0LndlaWdodD1vdGhlci53ZWlnaHR9fX0seyIuLi9sb2Rhc2giOjEwLCIuL2JhcnljZW50ZXIiOjE0LCIuL3Jlc29sdmUtY29uZmxpY3RzIjoxOSwiLi9zb3J0IjoyMX1dLAoyMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksdXRpbD1yZXF1aXJlKCIuLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9c29ydDtmdW5jdGlvbiBzb3J0KGVudHJpZXMsYmlhc1JpZ2h0KXt2YXIgcGFydHM9dXRpbC5wYXJ0aXRpb24oZW50cmllcyxmdW5jdGlvbihlbnRyeSl7cmV0dXJuIF8uaGFzKGVudHJ5LCJiYXJ5Y2VudGVyIil9KTt2YXIgc29ydGFibGU9cGFydHMubGhzLHVuc29ydGFibGU9Xy5zb3J0QnkocGFydHMucmhzLGZ1bmN0aW9uKGVudHJ5KXtyZXR1cm4tZW50cnkuaX0pLHZzPVtdLHN1bT0wLHdlaWdodD0wLHZzSW5kZXg9MDtzb3J0YWJsZS5zb3J0KGNvbXBhcmVXaXRoQmlhcyghIWJpYXNSaWdodCkpO3ZzSW5kZXg9Y29uc3VtZVVuc29ydGFibGUodnMsdW5zb3J0YWJsZSx2c0luZGV4KTtfLmZvckVhY2goc29ydGFibGUsZnVuY3Rpb24oZW50cnkpe3ZzSW5kZXgrPWVudHJ5LnZzLmxlbmd0aDt2cy5wdXNoKGVudHJ5LnZzKTsKc3VtKz1lbnRyeS5iYXJ5Y2VudGVyKmVudHJ5LndlaWdodDt3ZWlnaHQrPWVudHJ5LndlaWdodDt2c0luZGV4PWNvbnN1bWVVbnNvcnRhYmxlKHZzLHVuc29ydGFibGUsdnNJbmRleCl9KTt2YXIgcmVzdWx0PXt2czpfLmZsYXR0ZW4odnMsdHJ1ZSl9O2lmKHdlaWdodCl7cmVzdWx0LmJhcnljZW50ZXI9c3VtL3dlaWdodDtyZXN1bHQud2VpZ2h0PXdlaWdodH1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNvbnN1bWVVbnNvcnRhYmxlKHZzLHVuc29ydGFibGUsaW5kZXgpe3ZhciBsYXN0O3doaWxlKHVuc29ydGFibGUubGVuZ3RoJiYobGFzdD1fLmxhc3QodW5zb3J0YWJsZSkpLmk8PWluZGV4KXt1bnNvcnRhYmxlLnBvcCgpO3ZzLnB1c2gobGFzdC52cyk7aW5kZXgrK31yZXR1cm4gaW5kZXh9ZnVuY3Rpb24gY29tcGFyZVdpdGhCaWFzKGJpYXMpe3JldHVybiBmdW5jdGlvbihlbnRyeVYsZW50cnlXKXtpZihlbnRyeVYuYmFyeWNlbnRlcjxlbnRyeVcuYmFyeWNlbnRlcilyZXR1cm4tMTtlbHNlIGlmKGVudHJ5Vi5iYXJ5Y2VudGVyPgplbnRyeVcuYmFyeWNlbnRlcilyZXR1cm4gMTtyZXR1cm4hYmlhcz9lbnRyeVYuaS1lbnRyeVcuaTplbnRyeVcuaS1lbnRyeVYuaX19fSx7Ii4uL2xvZGFzaCI6MTAsIi4uL3V0aWwiOjI5fV0sMjI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9cGFyZW50RHVtbXlDaGFpbnM7ZnVuY3Rpb24gcGFyZW50RHVtbXlDaGFpbnMoZyl7dmFyIHBvc3RvcmRlck51bXM9cG9zdG9yZGVyKGcpO18uZm9yRWFjaChnLmdyYXBoKCkuZHVtbXlDaGFpbnMsZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpLGVkZ2VPYmo9bm9kZS5lZGdlT2JqLHBhdGhEYXRhPWZpbmRQYXRoKGcscG9zdG9yZGVyTnVtcyxlZGdlT2JqLnYsZWRnZU9iai53KSxwYXRoPXBhdGhEYXRhLnBhdGgsbGNhPXBhdGhEYXRhLmxjYSxwYXRoSWR4PTAscGF0aFY9cGF0aFtwYXRoSWR4XSxhc2NlbmRpbmc9dHJ1ZTt3aGlsZSh2IT09ZWRnZU9iai53KXtub2RlPQpnLm5vZGUodik7aWYoYXNjZW5kaW5nKXt3aGlsZSgocGF0aFY9cGF0aFtwYXRoSWR4XSkhPT1sY2EmJmcubm9kZShwYXRoVikubWF4UmFuazxub2RlLnJhbmspcGF0aElkeCsrO2lmKHBhdGhWPT09bGNhKWFzY2VuZGluZz1mYWxzZX1pZighYXNjZW5kaW5nKXt3aGlsZShwYXRoSWR4PHBhdGgubGVuZ3RoLTEmJmcubm9kZShwYXRoVj1wYXRoW3BhdGhJZHgrMV0pLm1pblJhbms8PW5vZGUucmFuaylwYXRoSWR4Kys7cGF0aFY9cGF0aFtwYXRoSWR4XX1nLnNldFBhcmVudCh2LHBhdGhWKTt2PWcuc3VjY2Vzc29ycyh2KVswXX19KX1mdW5jdGlvbiBmaW5kUGF0aChnLHBvc3RvcmRlck51bXMsdix3KXt2YXIgdlBhdGg9W10sd1BhdGg9W10sbG93PU1hdGgubWluKHBvc3RvcmRlck51bXNbdl0ubG93LHBvc3RvcmRlck51bXNbd10ubG93KSxsaW09TWF0aC5tYXgocG9zdG9yZGVyTnVtc1t2XS5saW0scG9zdG9yZGVyTnVtc1t3XS5saW0pLHBhcmVudCxsY2E7cGFyZW50PXY7ZG97cGFyZW50PQpnLnBhcmVudChwYXJlbnQpO3ZQYXRoLnB1c2gocGFyZW50KX13aGlsZShwYXJlbnQmJihwb3N0b3JkZXJOdW1zW3BhcmVudF0ubG93Pmxvd3x8bGltPnBvc3RvcmRlck51bXNbcGFyZW50XS5saW0pKTtsY2E9cGFyZW50O3BhcmVudD13O3doaWxlKChwYXJlbnQ9Zy5wYXJlbnQocGFyZW50KSkhPT1sY2Epd1BhdGgucHVzaChwYXJlbnQpO3JldHVybntwYXRoOnZQYXRoLmNvbmNhdCh3UGF0aC5yZXZlcnNlKCkpLGxjYTpsY2F9fWZ1bmN0aW9uIHBvc3RvcmRlcihnKXt2YXIgcmVzdWx0PXt9LGxpbT0wO2Z1bmN0aW9uIGRmcyh2KXt2YXIgbG93PWxpbTtfLmZvckVhY2goZy5jaGlsZHJlbih2KSxkZnMpO3Jlc3VsdFt2XT17bG93OmxvdyxsaW06bGltKyt9fV8uZm9yRWFjaChnLmNoaWxkcmVuKCksZGZzKTtyZXR1cm4gcmVzdWx0fX0seyIuL2xvZGFzaCI6MTB9XSwyMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksR3JhcGg9CnJlcXVpcmUoIi4uL2dyYXBobGliIikuR3JhcGgsdXRpbD1yZXF1aXJlKCIuLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9e3Bvc2l0aW9uWDpwb3NpdGlvblgsZmluZFR5cGUxQ29uZmxpY3RzOmZpbmRUeXBlMUNvbmZsaWN0cyxmaW5kVHlwZTJDb25mbGljdHM6ZmluZFR5cGUyQ29uZmxpY3RzLGFkZENvbmZsaWN0OmFkZENvbmZsaWN0LGhhc0NvbmZsaWN0Omhhc0NvbmZsaWN0LHZlcnRpY2FsQWxpZ25tZW50OnZlcnRpY2FsQWxpZ25tZW50LGhvcml6b250YWxDb21wYWN0aW9uOmhvcml6b250YWxDb21wYWN0aW9uLGFsaWduQ29vcmRpbmF0ZXM6YWxpZ25Db29yZGluYXRlcyxmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudDpmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudCxiYWxhbmNlOmJhbGFuY2V9O2Z1bmN0aW9uIGZpbmRUeXBlMUNvbmZsaWN0cyhnLGxheWVyaW5nKXt2YXIgY29uZmxpY3RzPXt9O2Z1bmN0aW9uIHZpc2l0TGF5ZXIocHJldkxheWVyLGxheWVyKXt2YXIgazA9MCxzY2FuUG9zPQowLHByZXZMYXllckxlbmd0aD1wcmV2TGF5ZXIubGVuZ3RoLGxhc3ROb2RlPV8ubGFzdChsYXllcik7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYsaSl7dmFyIHc9ZmluZE90aGVySW5uZXJTZWdtZW50Tm9kZShnLHYpLGsxPXc/Zy5ub2RlKHcpLm9yZGVyOnByZXZMYXllckxlbmd0aDtpZih3fHx2PT09bGFzdE5vZGUpe18uZm9yRWFjaChsYXllci5zbGljZShzY2FuUG9zLGkrMSksZnVuY3Rpb24oc2Nhbk5vZGUpe18uZm9yRWFjaChnLnByZWRlY2Vzc29ycyhzY2FuTm9kZSksZnVuY3Rpb24odSl7dmFyIHVMYWJlbD1nLm5vZGUodSksdVBvcz11TGFiZWwub3JkZXI7aWYoKHVQb3M8azB8fGsxPHVQb3MpJiYhKHVMYWJlbC5kdW1teSYmZy5ub2RlKHNjYW5Ob2RlKS5kdW1teSkpYWRkQ29uZmxpY3QoY29uZmxpY3RzLHUsc2Nhbk5vZGUpfSl9KTtzY2FuUG9zPWkrMTtrMD1rMX19KTtyZXR1cm4gbGF5ZXJ9Xy5yZWR1Y2UobGF5ZXJpbmcsdmlzaXRMYXllcik7cmV0dXJuIGNvbmZsaWN0c30KZnVuY3Rpb24gZmluZFR5cGUyQ29uZmxpY3RzKGcsbGF5ZXJpbmcpe3ZhciBjb25mbGljdHM9e307ZnVuY3Rpb24gc2Nhbihzb3V0aCxzb3V0aFBvcyxzb3V0aEVuZCxwcmV2Tm9ydGhCb3JkZXIsbmV4dE5vcnRoQm9yZGVyKXt2YXIgdjtfLmZvckVhY2goXy5yYW5nZShzb3V0aFBvcyxzb3V0aEVuZCksZnVuY3Rpb24oaSl7dj1zb3V0aFtpXTtpZihnLm5vZGUodikuZHVtbXkpXy5mb3JFYWNoKGcucHJlZGVjZXNzb3JzKHYpLGZ1bmN0aW9uKHUpe3ZhciB1Tm9kZT1nLm5vZGUodSk7aWYodU5vZGUuZHVtbXkmJih1Tm9kZS5vcmRlcjxwcmV2Tm9ydGhCb3JkZXJ8fHVOb2RlLm9yZGVyPm5leHROb3J0aEJvcmRlcikpYWRkQ29uZmxpY3QoY29uZmxpY3RzLHUsdil9KX0pfWZ1bmN0aW9uIHZpc2l0TGF5ZXIobm9ydGgsc291dGgpe3ZhciBwcmV2Tm9ydGhQb3M9LTEsbmV4dE5vcnRoUG9zLHNvdXRoUG9zPTA7Xy5mb3JFYWNoKHNvdXRoLGZ1bmN0aW9uKHYsc291dGhMb29rYWhlYWQpe2lmKGcubm9kZSh2KS5kdW1teT09PQoiYm9yZGVyIil7dmFyIHByZWRlY2Vzc29ycz1nLnByZWRlY2Vzc29ycyh2KTtpZihwcmVkZWNlc3NvcnMubGVuZ3RoKXtuZXh0Tm9ydGhQb3M9Zy5ub2RlKHByZWRlY2Vzc29yc1swXSkub3JkZXI7c2Nhbihzb3V0aCxzb3V0aFBvcyxzb3V0aExvb2thaGVhZCxwcmV2Tm9ydGhQb3MsbmV4dE5vcnRoUG9zKTtzb3V0aFBvcz1zb3V0aExvb2thaGVhZDtwcmV2Tm9ydGhQb3M9bmV4dE5vcnRoUG9zfX1zY2FuKHNvdXRoLHNvdXRoUG9zLHNvdXRoLmxlbmd0aCxuZXh0Tm9ydGhQb3Msbm9ydGgubGVuZ3RoKX0pO3JldHVybiBzb3V0aH1fLnJlZHVjZShsYXllcmluZyx2aXNpdExheWVyKTtyZXR1cm4gY29uZmxpY3RzfWZ1bmN0aW9uIGZpbmRPdGhlcklubmVyU2VnbWVudE5vZGUoZyx2KXtpZihnLm5vZGUodikuZHVtbXkpcmV0dXJuIF8uZmluZChnLnByZWRlY2Vzc29ycyh2KSxmdW5jdGlvbih1KXtyZXR1cm4gZy5ub2RlKHUpLmR1bW15fSl9ZnVuY3Rpb24gYWRkQ29uZmxpY3QoY29uZmxpY3RzLAp2LHcpe2lmKHY+dyl7dmFyIHRtcD12O3Y9dzt3PXRtcH12YXIgY29uZmxpY3RzVj1jb25mbGljdHNbdl07aWYoIWNvbmZsaWN0c1YpY29uZmxpY3RzW3ZdPWNvbmZsaWN0c1Y9e307Y29uZmxpY3RzVlt3XT10cnVlfWZ1bmN0aW9uIGhhc0NvbmZsaWN0KGNvbmZsaWN0cyx2LHcpe2lmKHY+dyl7dmFyIHRtcD12O3Y9dzt3PXRtcH1yZXR1cm4gXy5oYXMoY29uZmxpY3RzW3ZdLHcpfWZ1bmN0aW9uIHZlcnRpY2FsQWxpZ25tZW50KGcsbGF5ZXJpbmcsY29uZmxpY3RzLG5laWdoYm9yRm4pe3ZhciByb290PXt9LGFsaWduPXt9LHBvcz17fTtfLmZvckVhY2gobGF5ZXJpbmcsZnVuY3Rpb24obGF5ZXIpe18uZm9yRWFjaChsYXllcixmdW5jdGlvbih2LG9yZGVyKXtyb290W3ZdPXY7YWxpZ25bdl09djtwb3Nbdl09b3JkZXJ9KX0pO18uZm9yRWFjaChsYXllcmluZyxmdW5jdGlvbihsYXllcil7dmFyIHByZXZJZHg9LTE7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYpe3ZhciB3cz1uZWlnaGJvckZuKHYpOwppZih3cy5sZW5ndGgpe3dzPV8uc29ydEJ5KHdzLGZ1bmN0aW9uKHcpe3JldHVybiBwb3Nbd119KTt2YXIgbXA9KHdzLmxlbmd0aC0xKS8yO2Zvcih2YXIgaT1NYXRoLmZsb29yKG1wKSxpbD1NYXRoLmNlaWwobXApO2k8PWlsOysraSl7dmFyIHc9d3NbaV07aWYoYWxpZ25bdl09PT12JiZwcmV2SWR4PHBvc1t3XSYmIWhhc0NvbmZsaWN0KGNvbmZsaWN0cyx2LHcpKXthbGlnblt3XT12O2FsaWduW3ZdPXJvb3Rbdl09cm9vdFt3XTtwcmV2SWR4PXBvc1t3XX19fX0pfSk7cmV0dXJue3Jvb3Q6cm9vdCxhbGlnbjphbGlnbn19ZnVuY3Rpb24gaG9yaXpvbnRhbENvbXBhY3Rpb24oZyxsYXllcmluZyxyb290LGFsaWduLHJldmVyc2VTZXApe3ZhciB4cz17fSxibG9ja0c9YnVpbGRCbG9ja0dyYXBoKGcsbGF5ZXJpbmcscm9vdCxyZXZlcnNlU2VwKSxib3JkZXJUeXBlPXJldmVyc2VTZXA/ImJvcmRlckxlZnQiOiJib3JkZXJSaWdodCI7ZnVuY3Rpb24gaXRlcmF0ZShzZXRYc0Z1bmMsbmV4dE5vZGVzRnVuYyl7dmFyIHN0YWNrPQpibG9ja0cubm9kZXMoKTt2YXIgZWxlbT1zdGFjay5wb3AoKTt2YXIgdmlzaXRlZD17fTt3aGlsZShlbGVtKXtpZih2aXNpdGVkW2VsZW1dKXNldFhzRnVuYyhlbGVtKTtlbHNle3Zpc2l0ZWRbZWxlbV09dHJ1ZTtzdGFjay5wdXNoKGVsZW0pO3N0YWNrPXN0YWNrLmNvbmNhdChuZXh0Tm9kZXNGdW5jKGVsZW0pKX1lbGVtPXN0YWNrLnBvcCgpfX1mdW5jdGlvbiBwYXNzMShlbGVtKXt4c1tlbGVtXT1ibG9ja0cuaW5FZGdlcyhlbGVtKS5yZWR1Y2UoZnVuY3Rpb24oYWNjLGUpe3JldHVybiBNYXRoLm1heChhY2MseHNbZS52XStibG9ja0cuZWRnZShlKSl9LDApfWZ1bmN0aW9uIHBhc3MyKGVsZW0pe3ZhciBtaW49YmxvY2tHLm91dEVkZ2VzKGVsZW0pLnJlZHVjZShmdW5jdGlvbihhY2MsZSl7cmV0dXJuIE1hdGgubWluKGFjYyx4c1tlLnddLWJsb2NrRy5lZGdlKGUpKX0sTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTt2YXIgbm9kZT1nLm5vZGUoZWxlbSk7aWYobWluIT09TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZJiYKbm9kZS5ib3JkZXJUeXBlIT09Ym9yZGVyVHlwZSl4c1tlbGVtXT1NYXRoLm1heCh4c1tlbGVtXSxtaW4pfWl0ZXJhdGUocGFzczEsXy5iaW5kKGJsb2NrRy5wcmVkZWNlc3NvcnMsYmxvY2tHKSk7aXRlcmF0ZShwYXNzMixfLmJpbmQoYmxvY2tHLnN1Y2Nlc3NvcnMsYmxvY2tHKSk7Xy5mb3JFYWNoKGFsaWduLGZ1bmN0aW9uKHYpe3hzW3ZdPXhzW3Jvb3Rbdl1dfSk7cmV0dXJuIHhzfWZ1bmN0aW9uIGJ1aWxkQmxvY2tHcmFwaChnLGxheWVyaW5nLHJvb3QscmV2ZXJzZVNlcCl7dmFyIGJsb2NrR3JhcGg9bmV3IEdyYXBoLGdyYXBoTGFiZWw9Zy5ncmFwaCgpLHNlcEZuPXNlcChncmFwaExhYmVsLm5vZGVzZXAsZ3JhcGhMYWJlbC5lZGdlc2VwLHJldmVyc2VTZXApO18uZm9yRWFjaChsYXllcmluZyxmdW5jdGlvbihsYXllcil7dmFyIHU7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYpe3ZhciB2Um9vdD1yb290W3ZdO2Jsb2NrR3JhcGguc2V0Tm9kZSh2Um9vdCk7aWYodSl7dmFyIHVSb290PQpyb290W3VdLHByZXZNYXg9YmxvY2tHcmFwaC5lZGdlKHVSb290LHZSb290KTtibG9ja0dyYXBoLnNldEVkZ2UodVJvb3QsdlJvb3QsTWF0aC5tYXgoc2VwRm4oZyx2LHUpLHByZXZNYXh8fDApKX11PXZ9KX0pO3JldHVybiBibG9ja0dyYXBofWZ1bmN0aW9uIGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50KGcseHNzKXtyZXR1cm4gXy5taW5CeShfLnZhbHVlcyh4c3MpLGZ1bmN0aW9uKHhzKXt2YXIgbWF4PU51bWJlci5ORUdBVElWRV9JTkZJTklUWTt2YXIgbWluPU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtfLmZvckluKHhzLGZ1bmN0aW9uKHgsdil7dmFyIGhhbGZXaWR0aD13aWR0aChnLHYpLzI7bWF4PU1hdGgubWF4KHgraGFsZldpZHRoLG1heCk7bWluPU1hdGgubWluKHgtaGFsZldpZHRoLG1pbil9KTtyZXR1cm4gbWF4LW1pbn0pfWZ1bmN0aW9uIGFsaWduQ29vcmRpbmF0ZXMoeHNzLGFsaWduVG8pe3ZhciBhbGlnblRvVmFscz1fLnZhbHVlcyhhbGlnblRvKSxhbGlnblRvTWluPQpfLm1pbihhbGlnblRvVmFscyksYWxpZ25Ub01heD1fLm1heChhbGlnblRvVmFscyk7Xy5mb3JFYWNoKFsidSIsImQiXSxmdW5jdGlvbih2ZXJ0KXtfLmZvckVhY2goWyJsIiwiciJdLGZ1bmN0aW9uKGhvcml6KXt2YXIgYWxpZ25tZW50PXZlcnQraG9yaXoseHM9eHNzW2FsaWdubWVudF0sZGVsdGE7aWYoeHM9PT1hbGlnblRvKXJldHVybjt2YXIgeHNWYWxzPV8udmFsdWVzKHhzKTtkZWx0YT1ob3Jpej09PSJsIj9hbGlnblRvTWluLV8ubWluKHhzVmFscyk6YWxpZ25Ub01heC1fLm1heCh4c1ZhbHMpO2lmKGRlbHRhKXhzc1thbGlnbm1lbnRdPV8ubWFwVmFsdWVzKHhzLGZ1bmN0aW9uKHgpe3JldHVybiB4K2RlbHRhfSl9KX0pfWZ1bmN0aW9uIGJhbGFuY2UoeHNzLGFsaWduKXtyZXR1cm4gXy5tYXBWYWx1ZXMoeHNzLnVsLGZ1bmN0aW9uKGlnbm9yZSx2KXtpZihhbGlnbilyZXR1cm4geHNzW2FsaWduLnRvTG93ZXJDYXNlKCldW3ZdO2Vsc2V7dmFyIHhzPV8uc29ydEJ5KF8ubWFwKHhzcywKdikpO3JldHVybih4c1sxXSt4c1syXSkvMn19KX1mdW5jdGlvbiBwb3NpdGlvblgoZyl7dmFyIGxheWVyaW5nPXV0aWwuYnVpbGRMYXllck1hdHJpeChnKSxjb25mbGljdHM9Xy5tZXJnZShmaW5kVHlwZTFDb25mbGljdHMoZyxsYXllcmluZyksZmluZFR5cGUyQ29uZmxpY3RzKGcsbGF5ZXJpbmcpKTt2YXIgeHNzPXt9LGFkanVzdGVkTGF5ZXJpbmc7Xy5mb3JFYWNoKFsidSIsImQiXSxmdW5jdGlvbih2ZXJ0KXthZGp1c3RlZExheWVyaW5nPXZlcnQ9PT0idSI/bGF5ZXJpbmc6Xy52YWx1ZXMobGF5ZXJpbmcpLnJldmVyc2UoKTtfLmZvckVhY2goWyJsIiwiciJdLGZ1bmN0aW9uKGhvcml6KXtpZihob3Jpej09PSJyIilhZGp1c3RlZExheWVyaW5nPV8ubWFwKGFkanVzdGVkTGF5ZXJpbmcsZnVuY3Rpb24oaW5uZXIpe3JldHVybiBfLnZhbHVlcyhpbm5lcikucmV2ZXJzZSgpfSk7dmFyIG5laWdoYm9yRm49Xy5iaW5kKHZlcnQ9PT0idSI/Zy5wcmVkZWNlc3NvcnM6Zy5zdWNjZXNzb3JzLApnKTt2YXIgYWxpZ249dmVydGljYWxBbGlnbm1lbnQoZyxhZGp1c3RlZExheWVyaW5nLGNvbmZsaWN0cyxuZWlnaGJvckZuKTt2YXIgeHM9aG9yaXpvbnRhbENvbXBhY3Rpb24oZyxhZGp1c3RlZExheWVyaW5nLGFsaWduLnJvb3QsYWxpZ24uYWxpZ24saG9yaXo9PT0iciIpO2lmKGhvcml6PT09InIiKXhzPV8ubWFwVmFsdWVzKHhzLGZ1bmN0aW9uKHgpe3JldHVybi14fSk7eHNzW3ZlcnQraG9yaXpdPXhzfSl9KTt2YXIgc21hbGxlc3RXaWR0aD1maW5kU21hbGxlc3RXaWR0aEFsaWdubWVudChnLHhzcyk7YWxpZ25Db29yZGluYXRlcyh4c3Msc21hbGxlc3RXaWR0aCk7cmV0dXJuIGJhbGFuY2UoeHNzLGcuZ3JhcGgoKS5hbGlnbil9ZnVuY3Rpb24gc2VwKG5vZGVTZXAsZWRnZVNlcCxyZXZlcnNlU2VwKXtyZXR1cm4gZnVuY3Rpb24oZyx2LHcpe3ZhciB2TGFiZWw9Zy5ub2RlKHYpLHdMYWJlbD1nLm5vZGUodyksc3VtPTAsZGVsdGE7c3VtKz12TGFiZWwud2lkdGgvMjtpZihfLmhhcyh2TGFiZWwsCiJsYWJlbHBvcyIpKXN3aXRjaCh2TGFiZWwubGFiZWxwb3MudG9Mb3dlckNhc2UoKSl7Y2FzZSAibCI6ZGVsdGE9LXZMYWJlbC53aWR0aC8yO2JyZWFrO2Nhc2UgInIiOmRlbHRhPXZMYWJlbC53aWR0aC8yO2JyZWFrfWlmKGRlbHRhKXN1bSs9cmV2ZXJzZVNlcD9kZWx0YTotZGVsdGE7ZGVsdGE9MDtzdW0rPSh2TGFiZWwuZHVtbXk/ZWRnZVNlcDpub2RlU2VwKS8yO3N1bSs9KHdMYWJlbC5kdW1teT9lZGdlU2VwOm5vZGVTZXApLzI7c3VtKz13TGFiZWwud2lkdGgvMjtpZihfLmhhcyh3TGFiZWwsImxhYmVscG9zIikpc3dpdGNoKHdMYWJlbC5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpKXtjYXNlICJsIjpkZWx0YT13TGFiZWwud2lkdGgvMjticmVhaztjYXNlICJyIjpkZWx0YT0td0xhYmVsLndpZHRoLzI7YnJlYWt9aWYoZGVsdGEpc3VtKz1yZXZlcnNlU2VwP2RlbHRhOi1kZWx0YTtkZWx0YT0wO3JldHVybiBzdW19fWZ1bmN0aW9uIHdpZHRoKGcsdil7cmV0dXJuIGcubm9kZSh2KS53aWR0aH0KfSx7Ii4uL2dyYXBobGliIjo3LCIuLi9sb2Rhc2giOjEwLCIuLi91dGlsIjoyOX1dLDI0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4uL3V0aWwiKSxwb3NpdGlvblg9cmVxdWlyZSgiLi9iayIpLnBvc2l0aW9uWDttb2R1bGUuZXhwb3J0cz1wb3NpdGlvbjtmdW5jdGlvbiBwb3NpdGlvbihnKXtnPXV0aWwuYXNOb25Db21wb3VuZEdyYXBoKGcpO3Bvc2l0aW9uWShnKTtfLmZvckVhY2gocG9zaXRpb25YKGcpLGZ1bmN0aW9uKHgsdil7Zy5ub2RlKHYpLng9eH0pfWZ1bmN0aW9uIHBvc2l0aW9uWShnKXt2YXIgbGF5ZXJpbmc9dXRpbC5idWlsZExheWVyTWF0cml4KGcpLHJhbmtTZXA9Zy5ncmFwaCgpLnJhbmtzZXAscHJldlk9MDtfLmZvckVhY2gobGF5ZXJpbmcsZnVuY3Rpb24obGF5ZXIpe3ZhciBtYXhIZWlnaHQ9Xy5tYXgoXy5tYXAobGF5ZXIsZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KS5oZWlnaHR9KSk7Cl8uZm9yRWFjaChsYXllcixmdW5jdGlvbih2KXtnLm5vZGUodikueT1wcmV2WSttYXhIZWlnaHQvMn0pO3ByZXZZKz1tYXhIZWlnaHQrcmFua1NlcH0pfX0seyIuLi9sb2Rhc2giOjEwLCIuLi91dGlsIjoyOSwiLi9iayI6MjN9XSwyNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksR3JhcGg9cmVxdWlyZSgiLi4vZ3JhcGhsaWIiKS5HcmFwaCxzbGFjaz1yZXF1aXJlKCIuL3V0aWwiKS5zbGFjazttb2R1bGUuZXhwb3J0cz1mZWFzaWJsZVRyZWU7ZnVuY3Rpb24gZmVhc2libGVUcmVlKGcpe3ZhciB0PW5ldyBHcmFwaCh7ZGlyZWN0ZWQ6ZmFsc2V9KTt2YXIgc3RhcnQ9Zy5ub2RlcygpWzBdLHNpemU9Zy5ub2RlQ291bnQoKTt0LnNldE5vZGUoc3RhcnQse30pO3ZhciBlZGdlLGRlbHRhO3doaWxlKHRpZ2h0VHJlZSh0LGcpPHNpemUpe2VkZ2U9ZmluZE1pblNsYWNrRWRnZSh0LGcpO2RlbHRhPXQuaGFzTm9kZShlZGdlLnYpPwpzbGFjayhnLGVkZ2UpOi1zbGFjayhnLGVkZ2UpO3NoaWZ0UmFua3ModCxnLGRlbHRhKX1yZXR1cm4gdH1mdW5jdGlvbiB0aWdodFRyZWUodCxnKXtmdW5jdGlvbiBkZnModil7Xy5mb3JFYWNoKGcubm9kZUVkZ2VzKHYpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlVj1lLnYsdz12PT09ZWRnZVY/ZS53OmVkZ2VWO2lmKCF0Lmhhc05vZGUodykmJiFzbGFjayhnLGUpKXt0LnNldE5vZGUodyx7fSk7dC5zZXRFZGdlKHYsdyx7fSk7ZGZzKHcpfX0pfV8uZm9yRWFjaCh0Lm5vZGVzKCksZGZzKTtyZXR1cm4gdC5ub2RlQ291bnQoKX1mdW5jdGlvbiBmaW5kTWluU2xhY2tFZGdlKHQsZyl7cmV0dXJuIF8ubWluQnkoZy5lZGdlcygpLGZ1bmN0aW9uKGUpe2lmKHQuaGFzTm9kZShlLnYpIT09dC5oYXNOb2RlKGUudykpcmV0dXJuIHNsYWNrKGcsZSl9KX1mdW5jdGlvbiBzaGlmdFJhbmtzKHQsZyxkZWx0YSl7Xy5mb3JFYWNoKHQubm9kZXMoKSxmdW5jdGlvbih2KXtnLm5vZGUodikucmFuays9ZGVsdGF9KX0KfSx7Ii4uL2dyYXBobGliIjo3LCIuLi9sb2Rhc2giOjEwLCIuL3V0aWwiOjI4fV0sMjY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciByYW5rVXRpbD1yZXF1aXJlKCIuL3V0aWwiKSxsb25nZXN0UGF0aD1yYW5rVXRpbC5sb25nZXN0UGF0aCxmZWFzaWJsZVRyZWU9cmVxdWlyZSgiLi9mZWFzaWJsZS10cmVlIiksbmV0d29ya1NpbXBsZXg9cmVxdWlyZSgiLi9uZXR3b3JrLXNpbXBsZXgiKTttb2R1bGUuZXhwb3J0cz1yYW5rO2Z1bmN0aW9uIHJhbmsoZyl7c3dpdGNoKGcuZ3JhcGgoKS5yYW5rZXIpe2Nhc2UgIm5ldHdvcmstc2ltcGxleCI6bmV0d29ya1NpbXBsZXhSYW5rZXIoZyk7YnJlYWs7Y2FzZSAidGlnaHQtdHJlZSI6dGlnaHRUcmVlUmFua2VyKGcpO2JyZWFrO2Nhc2UgImxvbmdlc3QtcGF0aCI6bG9uZ2VzdFBhdGhSYW5rZXIoZyk7YnJlYWs7ZGVmYXVsdDpuZXR3b3JrU2ltcGxleFJhbmtlcihnKX19dmFyIGxvbmdlc3RQYXRoUmFua2VyPWxvbmdlc3RQYXRoOwpmdW5jdGlvbiB0aWdodFRyZWVSYW5rZXIoZyl7bG9uZ2VzdFBhdGgoZyk7ZmVhc2libGVUcmVlKGcpfWZ1bmN0aW9uIG5ldHdvcmtTaW1wbGV4UmFua2VyKGcpe25ldHdvcmtTaW1wbGV4KGcpfX0seyIuL2ZlYXNpYmxlLXRyZWUiOjI1LCIuL25ldHdvcmstc2ltcGxleCI6MjcsIi4vdXRpbCI6Mjh9XSwyNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksZmVhc2libGVUcmVlPXJlcXVpcmUoIi4vZmVhc2libGUtdHJlZSIpLHNsYWNrPXJlcXVpcmUoIi4vdXRpbCIpLnNsYWNrLGluaXRSYW5rPXJlcXVpcmUoIi4vdXRpbCIpLmxvbmdlc3RQYXRoLHByZW9yZGVyPXJlcXVpcmUoIi4uL2dyYXBobGliIikuYWxnLnByZW9yZGVyLHBvc3RvcmRlcj1yZXF1aXJlKCIuLi9ncmFwaGxpYiIpLmFsZy5wb3N0b3JkZXIsc2ltcGxpZnk9cmVxdWlyZSgiLi4vdXRpbCIpLnNpbXBsaWZ5O21vZHVsZS5leHBvcnRzPW5ldHdvcmtTaW1wbGV4OwpuZXR3b3JrU2ltcGxleC5pbml0TG93TGltVmFsdWVzPWluaXRMb3dMaW1WYWx1ZXM7bmV0d29ya1NpbXBsZXguaW5pdEN1dFZhbHVlcz1pbml0Q3V0VmFsdWVzO25ldHdvcmtTaW1wbGV4LmNhbGNDdXRWYWx1ZT1jYWxjQ3V0VmFsdWU7bmV0d29ya1NpbXBsZXgubGVhdmVFZGdlPWxlYXZlRWRnZTtuZXR3b3JrU2ltcGxleC5lbnRlckVkZ2U9ZW50ZXJFZGdlO25ldHdvcmtTaW1wbGV4LmV4Y2hhbmdlRWRnZXM9ZXhjaGFuZ2VFZGdlcztmdW5jdGlvbiBuZXR3b3JrU2ltcGxleChnKXtnPXNpbXBsaWZ5KGcpO2luaXRSYW5rKGcpO3ZhciB0PWZlYXNpYmxlVHJlZShnKTtpbml0TG93TGltVmFsdWVzKHQpO2luaXRDdXRWYWx1ZXModCxnKTt2YXIgZSxmO3doaWxlKGU9bGVhdmVFZGdlKHQpKXtmPWVudGVyRWRnZSh0LGcsZSk7ZXhjaGFuZ2VFZGdlcyh0LGcsZSxmKX19ZnVuY3Rpb24gaW5pdEN1dFZhbHVlcyh0LGcpe3ZhciB2cz1wb3N0b3JkZXIodCx0Lm5vZGVzKCkpO3ZzPXZzLnNsaWNlKDAsCnZzLmxlbmd0aC0xKTtfLmZvckVhY2godnMsZnVuY3Rpb24odil7YXNzaWduQ3V0VmFsdWUodCxnLHYpfSl9ZnVuY3Rpb24gYXNzaWduQ3V0VmFsdWUodCxnLGNoaWxkKXt2YXIgY2hpbGRMYWI9dC5ub2RlKGNoaWxkKSxwYXJlbnQ9Y2hpbGRMYWIucGFyZW50O3QuZWRnZShjaGlsZCxwYXJlbnQpLmN1dHZhbHVlPWNhbGNDdXRWYWx1ZSh0LGcsY2hpbGQpfWZ1bmN0aW9uIGNhbGNDdXRWYWx1ZSh0LGcsY2hpbGQpe3ZhciBjaGlsZExhYj10Lm5vZGUoY2hpbGQpLHBhcmVudD1jaGlsZExhYi5wYXJlbnQsY2hpbGRJc1RhaWw9dHJ1ZSxncmFwaEVkZ2U9Zy5lZGdlKGNoaWxkLHBhcmVudCksY3V0VmFsdWU9MDtpZighZ3JhcGhFZGdlKXtjaGlsZElzVGFpbD1mYWxzZTtncmFwaEVkZ2U9Zy5lZGdlKHBhcmVudCxjaGlsZCl9Y3V0VmFsdWU9Z3JhcGhFZGdlLndlaWdodDtfLmZvckVhY2goZy5ub2RlRWRnZXMoY2hpbGQpLGZ1bmN0aW9uKGUpe3ZhciBpc091dEVkZ2U9ZS52PT09Y2hpbGQsb3RoZXI9CmlzT3V0RWRnZT9lLnc6ZS52O2lmKG90aGVyIT09cGFyZW50KXt2YXIgcG9pbnRzVG9IZWFkPWlzT3V0RWRnZT09PWNoaWxkSXNUYWlsLG90aGVyV2VpZ2h0PWcuZWRnZShlKS53ZWlnaHQ7Y3V0VmFsdWUrPXBvaW50c1RvSGVhZD9vdGhlcldlaWdodDotb3RoZXJXZWlnaHQ7aWYoaXNUcmVlRWRnZSh0LGNoaWxkLG90aGVyKSl7dmFyIG90aGVyQ3V0VmFsdWU9dC5lZGdlKGNoaWxkLG90aGVyKS5jdXR2YWx1ZTtjdXRWYWx1ZSs9cG9pbnRzVG9IZWFkPy1vdGhlckN1dFZhbHVlOm90aGVyQ3V0VmFsdWV9fX0pO3JldHVybiBjdXRWYWx1ZX1mdW5jdGlvbiBpbml0TG93TGltVmFsdWVzKHRyZWUscm9vdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXJvb3Q9dHJlZS5ub2RlcygpWzBdO2Rmc0Fzc2lnbkxvd0xpbSh0cmVlLHt9LDEscm9vdCl9ZnVuY3Rpb24gZGZzQXNzaWduTG93TGltKHRyZWUsdmlzaXRlZCxuZXh0TGltLHYscGFyZW50KXt2YXIgbG93PW5leHRMaW0sbGFiZWw9dHJlZS5ub2RlKHYpOwp2aXNpdGVkW3ZdPXRydWU7Xy5mb3JFYWNoKHRyZWUubmVpZ2hib3JzKHYpLGZ1bmN0aW9uKHcpe2lmKCFfLmhhcyh2aXNpdGVkLHcpKW5leHRMaW09ZGZzQXNzaWduTG93TGltKHRyZWUsdmlzaXRlZCxuZXh0TGltLHcsdil9KTtsYWJlbC5sb3c9bG93O2xhYmVsLmxpbT1uZXh0TGltKys7aWYocGFyZW50KWxhYmVsLnBhcmVudD1wYXJlbnQ7ZWxzZSBkZWxldGUgbGFiZWwucGFyZW50O3JldHVybiBuZXh0TGltfWZ1bmN0aW9uIGxlYXZlRWRnZSh0cmVlKXtyZXR1cm4gXy5maW5kKHRyZWUuZWRnZXMoKSxmdW5jdGlvbihlKXtyZXR1cm4gdHJlZS5lZGdlKGUpLmN1dHZhbHVlPDB9KX1mdW5jdGlvbiBlbnRlckVkZ2UodCxnLGVkZ2Upe3ZhciB2PWVkZ2Uudix3PWVkZ2UudztpZighZy5oYXNFZGdlKHYsdykpe3Y9ZWRnZS53O3c9ZWRnZS52fXZhciB2TGFiZWw9dC5ub2RlKHYpLHdMYWJlbD10Lm5vZGUodyksdGFpbExhYmVsPXZMYWJlbCxmbGlwPWZhbHNlO2lmKHZMYWJlbC5saW0+d0xhYmVsLmxpbSl7dGFpbExhYmVsPQp3TGFiZWw7ZmxpcD10cnVlfXZhciBjYW5kaWRhdGVzPV8uZmlsdGVyKGcuZWRnZXMoKSxmdW5jdGlvbihlZGdlKXtyZXR1cm4gZmxpcD09PWlzRGVzY2VuZGFudCh0LHQubm9kZShlZGdlLnYpLHRhaWxMYWJlbCkmJmZsaXAhPT1pc0Rlc2NlbmRhbnQodCx0Lm5vZGUoZWRnZS53KSx0YWlsTGFiZWwpfSk7cmV0dXJuIF8ubWluQnkoY2FuZGlkYXRlcyxmdW5jdGlvbihlZGdlKXtyZXR1cm4gc2xhY2soZyxlZGdlKX0pfWZ1bmN0aW9uIGV4Y2hhbmdlRWRnZXModCxnLGUsZil7dmFyIHY9ZS52LHc9ZS53O3QucmVtb3ZlRWRnZSh2LHcpO3Quc2V0RWRnZShmLnYsZi53LHt9KTtpbml0TG93TGltVmFsdWVzKHQpO2luaXRDdXRWYWx1ZXModCxnKTt1cGRhdGVSYW5rcyh0LGcpfWZ1bmN0aW9uIHVwZGF0ZVJhbmtzKHQsZyl7dmFyIHJvb3Q9Xy5maW5kKHQubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4hZy5ub2RlKHYpLnBhcmVudH0pLHZzPXByZW9yZGVyKHQscm9vdCk7dnM9dnMuc2xpY2UoMSk7Cl8uZm9yRWFjaCh2cyxmdW5jdGlvbih2KXt2YXIgcGFyZW50PXQubm9kZSh2KS5wYXJlbnQsZWRnZT1nLmVkZ2UodixwYXJlbnQpLGZsaXBwZWQ9ZmFsc2U7aWYoIWVkZ2Upe2VkZ2U9Zy5lZGdlKHBhcmVudCx2KTtmbGlwcGVkPXRydWV9Zy5ub2RlKHYpLnJhbms9Zy5ub2RlKHBhcmVudCkucmFuaysoZmxpcHBlZD9lZGdlLm1pbmxlbjotZWRnZS5taW5sZW4pfSl9ZnVuY3Rpb24gaXNUcmVlRWRnZSh0cmVlLHUsdil7cmV0dXJuIHRyZWUuaGFzRWRnZSh1LHYpfWZ1bmN0aW9uIGlzRGVzY2VuZGFudCh0cmVlLHZMYWJlbCxyb290TGFiZWwpe3JldHVybiByb290TGFiZWwubG93PD12TGFiZWwubGltJiZ2TGFiZWwubGltPD1yb290TGFiZWwubGltfX0seyIuLi9ncmFwaGxpYiI6NywiLi4vbG9kYXNoIjoxMCwiLi4vdXRpbCI6MjksIi4vZmVhc2libGUtdHJlZSI6MjUsIi4vdXRpbCI6Mjh9XSwyODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7Cm1vZHVsZS5leHBvcnRzPXtsb25nZXN0UGF0aDpsb25nZXN0UGF0aCxzbGFjazpzbGFja307ZnVuY3Rpb24gbG9uZ2VzdFBhdGgoZyl7dmFyIHZpc2l0ZWQ9e307ZnVuY3Rpb24gZGZzKHYpe3ZhciBsYWJlbD1nLm5vZGUodik7aWYoXy5oYXModmlzaXRlZCx2KSlyZXR1cm4gbGFiZWwucmFuazt2aXNpdGVkW3ZdPXRydWU7dmFyIHJhbms9Xy5taW5CeShfLm1hcChnLm91dEVkZ2VzKHYpLGZ1bmN0aW9uKGUpe3JldHVybiBkZnMoZS53KS1nLmVkZ2UoZSkubWlubGVufSkpO2lmKHJhbms9PT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFl8fHJhbms9PT11bmRlZmluZWR8fHJhbms9PT1udWxsKXJhbms9MDtyZXR1cm4gbGFiZWwucmFuaz1yYW5rfV8uZm9yRWFjaChnLnNvdXJjZXMoKSxkZnMpfWZ1bmN0aW9uIHNsYWNrKGcsZSl7cmV0dXJuIGcubm9kZShlLncpLnJhbmstZy5ub2RlKGUudikucmFuay1nLmVkZ2UoZSkubWlubGVufX0seyIuLi9sb2Rhc2giOjEwfV0sMjk6W2Z1bmN0aW9uKHJlcXVpcmUsCm1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4vZ3JhcGhsaWIiKS5HcmFwaDttb2R1bGUuZXhwb3J0cz17YWRkRHVtbXlOb2RlOmFkZER1bW15Tm9kZSxzaW1wbGlmeTpzaW1wbGlmeSxhc05vbkNvbXBvdW5kR3JhcGg6YXNOb25Db21wb3VuZEdyYXBoLHN1Y2Nlc3NvcldlaWdodHM6c3VjY2Vzc29yV2VpZ2h0cyxwcmVkZWNlc3NvcldlaWdodHM6cHJlZGVjZXNzb3JXZWlnaHRzLGludGVyc2VjdFJlY3Q6aW50ZXJzZWN0UmVjdCxidWlsZExheWVyTWF0cml4OmJ1aWxkTGF5ZXJNYXRyaXgsbm9ybWFsaXplUmFua3M6bm9ybWFsaXplUmFua3MscmVtb3ZlRW1wdHlSYW5rczpyZW1vdmVFbXB0eVJhbmtzLGFkZEJvcmRlck5vZGU6YWRkQm9yZGVyTm9kZSxtYXhSYW5rOm1heFJhbmsscGFydGl0aW9uOnBhcnRpdGlvbix0aW1lOnRpbWUsbm90aW1lOm5vdGltZX07ZnVuY3Rpb24gYWRkRHVtbXlOb2RlKGcsdHlwZSxhdHRycyxuYW1lKXt2YXIgdjsKZG8gdj1fLnVuaXF1ZUlkKG5hbWUpO3doaWxlKGcuaGFzTm9kZSh2KSk7YXR0cnMuZHVtbXk9dHlwZTtnLnNldE5vZGUodixhdHRycyk7cmV0dXJuIHZ9ZnVuY3Rpb24gc2ltcGxpZnkoZyl7dmFyIHNpbXBsaWZpZWQ9KG5ldyBHcmFwaCkuc2V0R3JhcGgoZy5ncmFwaCgpKTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3NpbXBsaWZpZWQuc2V0Tm9kZSh2LGcubm9kZSh2KSl9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBzaW1wbGVMYWJlbD1zaW1wbGlmaWVkLmVkZ2UoZS52LGUudyl8fHt3ZWlnaHQ6MCxtaW5sZW46MX0sbGFiZWw9Zy5lZGdlKGUpO3NpbXBsaWZpZWQuc2V0RWRnZShlLnYsZS53LHt3ZWlnaHQ6c2ltcGxlTGFiZWwud2VpZ2h0K2xhYmVsLndlaWdodCxtaW5sZW46TWF0aC5tYXgoc2ltcGxlTGFiZWwubWlubGVuLGxhYmVsLm1pbmxlbil9KX0pO3JldHVybiBzaW1wbGlmaWVkfWZ1bmN0aW9uIGFzTm9uQ29tcG91bmRHcmFwaChnKXt2YXIgc2ltcGxpZmllZD0KKG5ldyBHcmFwaCh7bXVsdGlncmFwaDpnLmlzTXVsdGlncmFwaCgpfSkpLnNldEdyYXBoKGcuZ3JhcGgoKSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtpZighZy5jaGlsZHJlbih2KS5sZW5ndGgpc2ltcGxpZmllZC5zZXROb2RlKHYsZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7c2ltcGxpZmllZC5zZXRFZGdlKGUsZy5lZGdlKGUpKX0pO3JldHVybiBzaW1wbGlmaWVkfWZ1bmN0aW9uIHN1Y2Nlc3NvcldlaWdodHMoZyl7dmFyIHdlaWdodE1hcD1fLm1hcChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIHN1Y3M9e307Xy5mb3JFYWNoKGcub3V0RWRnZXModiksZnVuY3Rpb24oZSl7c3Vjc1tlLnddPShzdWNzW2Uud118fDApK2cuZWRnZShlKS53ZWlnaHR9KTtyZXR1cm4gc3Vjc30pO3JldHVybiBfLnppcE9iamVjdChnLm5vZGVzKCksd2VpZ2h0TWFwKX1mdW5jdGlvbiBwcmVkZWNlc3NvcldlaWdodHMoZyl7dmFyIHdlaWdodE1hcD1fLm1hcChnLm5vZGVzKCksCmZ1bmN0aW9uKHYpe3ZhciBwcmVkcz17fTtfLmZvckVhY2goZy5pbkVkZ2VzKHYpLGZ1bmN0aW9uKGUpe3ByZWRzW2Uudl09KHByZWRzW2Uudl18fDApK2cuZWRnZShlKS53ZWlnaHR9KTtyZXR1cm4gcHJlZHN9KTtyZXR1cm4gXy56aXBPYmplY3QoZy5ub2RlcygpLHdlaWdodE1hcCl9ZnVuY3Rpb24gaW50ZXJzZWN0UmVjdChyZWN0LHBvaW50KXt2YXIgeD1yZWN0Lng7dmFyIHk9cmVjdC55O3ZhciBkeD1wb2ludC54LXg7dmFyIGR5PXBvaW50LnkteTt2YXIgdz1yZWN0LndpZHRoLzI7dmFyIGg9cmVjdC5oZWlnaHQvMjtpZighZHgmJiFkeSl0aHJvdyBuZXcgRXJyb3IoIk5vdCBwb3NzaWJsZSB0byBmaW5kIGludGVyc2VjdGlvbiBpbnNpZGUgb2YgdGhlIHJlY3RhbmdsZSIpO3ZhciBzeCxzeTtpZihNYXRoLmFicyhkeSkqdz5NYXRoLmFicyhkeCkqaCl7aWYoZHk8MCloPS1oO3N4PWgqZHgvZHk7c3k9aH1lbHNle2lmKGR4PDApdz0tdztzeD13O3N5PXcqZHkvZHh9cmV0dXJue3g6eCsKc3gseTp5K3N5fX1mdW5jdGlvbiBidWlsZExheWVyTWF0cml4KGcpe3ZhciBsYXllcmluZz1fLm1hcChfLnJhbmdlKG1heFJhbmsoZykrMSksZnVuY3Rpb24oKXtyZXR1cm5bXX0pO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpLHJhbms9bm9kZS5yYW5rO2lmKCFfLmlzVW5kZWZpbmVkKHJhbmspKWxheWVyaW5nW3JhbmtdW25vZGUub3JkZXJdPXZ9KTtyZXR1cm4gbGF5ZXJpbmd9ZnVuY3Rpb24gbm9ybWFsaXplUmFua3MoZyl7dmFyIG1pbj1fLm1pbkJ5KF8ubWFwKGcubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpLnJhbmt9KSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodik7aWYoXy5oYXMobm9kZSwicmFuayIpKW5vZGUucmFuay09bWlufSl9ZnVuY3Rpb24gcmVtb3ZlRW1wdHlSYW5rcyhnKXt2YXIgb2Zmc2V0PV8ubWluQnkoXy5tYXAoZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldHVybiBnLm5vZGUodikucmFua30pKTsKdmFyIGxheWVycz1bXTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciByYW5rPWcubm9kZSh2KS5yYW5rLW9mZnNldDtpZighbGF5ZXJzW3JhbmtdKWxheWVyc1tyYW5rXT1bXTtsYXllcnNbcmFua10ucHVzaCh2KX0pO3ZhciBkZWx0YT0wLG5vZGVSYW5rRmFjdG9yPWcuZ3JhcGgoKS5ub2RlUmFua0ZhY3RvcjtfLmZvckVhY2gobGF5ZXJzLGZ1bmN0aW9uKHZzLGkpe2lmKF8uaXNVbmRlZmluZWQodnMpJiZpJW5vZGVSYW5rRmFjdG9yIT09MCktLWRlbHRhO2Vsc2UgaWYoZGVsdGEpXy5mb3JFYWNoKHZzLGZ1bmN0aW9uKHYpe2cubm9kZSh2KS5yYW5rKz1kZWx0YX0pfSl9ZnVuY3Rpb24gYWRkQm9yZGVyTm9kZShnLHByZWZpeCxyYW5rLG9yZGVyKXt2YXIgbm9kZT17d2lkdGg6MCxoZWlnaHQ6MH07aWYoYXJndW1lbnRzLmxlbmd0aD49NCl7bm9kZS5yYW5rPXJhbms7bm9kZS5vcmRlcj1vcmRlcn1yZXR1cm4gYWRkRHVtbXlOb2RlKGcsImJvcmRlciIsbm9kZSxwcmVmaXgpfQpmdW5jdGlvbiBtYXhSYW5rKGcpe3JldHVybiBfLm1heChfLm1hcChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIHJhbms9Zy5ub2RlKHYpLnJhbms7aWYoIV8uaXNVbmRlZmluZWQocmFuaykpcmV0dXJuIHJhbmt9KSl9ZnVuY3Rpb24gcGFydGl0aW9uKGNvbGxlY3Rpb24sZm4pe3ZhciByZXN1bHQ9e2xoczpbXSxyaHM6W119O18uZm9yRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlKXtpZihmbih2YWx1ZSkpcmVzdWx0Lmxocy5wdXNoKHZhbHVlKTtlbHNlIHJlc3VsdC5yaHMucHVzaCh2YWx1ZSl9KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHRpbWUobmFtZSxmbil7dmFyIHN0YXJ0PV8ubm93KCk7dHJ5e3JldHVybiBmbigpfWZpbmFsbHl7Y29uc29sZS5sb2cobmFtZSsiIHRpbWU6ICIrKF8ubm93KCktc3RhcnQpKyJtcyIpfX1mdW5jdGlvbiBub3RpbWUobmFtZSxmbil7cmV0dXJuIGZuKCl9fSx7Ii4vZ3JhcGhsaWIiOjcsIi4vbG9kYXNoIjoxMH1dLDMwOltmdW5jdGlvbihyZXF1aXJlLAptb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9IjAuOC4yIn0se31dfSx7fSxbMV0pKDEpfSk7Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vYW5ub3RhdGlvbi5qcwp2YXIgdGY7CihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmdW5jdGlvbiBnKHIpe3JldHVybihjLnJlbmRlci5Bbm5vdGF0aW9uVHlwZVtyXXx8IiIpLnRvTG93ZXJDYXNlKCl8fG51bGx9ZnVuY3Rpb24gbChyLHQpe3QuYW5ub3RhdGlvblR5cGU9PT1jLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5TVU1NQVJZP2Quc2VsZWN0T3JDcmVhdGVDaGlsZChyLCJ1c2UiKS5hdHRyKCJjbGFzcyIsInN1bW1hcnkiKS5hdHRyKCJ4bGluazpocmVmIiwiI3N1bW1hcnktaWNvbiIpLmF0dHIoImN1cnNvciIsInBvaW50ZXIiKToocj1kLm5vZGUuYnVpbGRTaGFwZShyLHQsZC5DbGFzcy5Bbm5vdGF0aW9uLk5PREUpLGQuc2VsZWN0T3JDcmVhdGVDaGlsZChyLCJ0aXRsZSIpLnRleHQodC5ub2RlLm5hbWUpKX1mdW5jdGlvbiBrKHIsdCl7bGV0IHY9dC5ub2RlLm5hbWUuc3BsaXQoIi8iKTtyZXR1cm4gbihyLHZbdi5sZW5ndGgtMV0sdCxudWxsKX1mdW5jdGlvbiBuKHIsdCwKdix5KXtsZXQgej1kLkNsYXNzLkFubm90YXRpb24uTEFCRUw7eSYmKHorPSIgIit5KTtyPXIuYXBwZW5kKCJ0ZXh0IikuYXR0cigiY2xhc3MiLHopLmF0dHIoImR5IiwiLjM1ZW0iKS5hdHRyKCJ0ZXh0LWFuY2hvciIsdi5pc0luPyJlbmQiOiJzdGFydCIpLnRleHQodCk7cmV0dXJuIGEuZ3JhcGguc2NlbmUubm9kZS5lbmZvcmNlTGFiZWxXaWR0aChyLC0xKX1mdW5jdGlvbiBwKHIsdCx2LHkpe3Iub24oIm1vdXNlb3ZlciIsej0+e3kuZmlyZSgiYW5ub3RhdGlvbi1oaWdobGlnaHQiLHtuYW1lOnoubm9kZS5uYW1lLGhvc3ROYW1lOnQubm9kZS5uYW1lfSl9KS5vbigibW91c2VvdXQiLHo9Pnt5LmZpcmUoImFubm90YXRpb24tdW5oaWdobGlnaHQiLHtuYW1lOnoubm9kZS5uYW1lLGhvc3ROYW1lOnQubm9kZS5uYW1lfSl9KS5vbigiY2xpY2siLHo9PntkMy5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTt5LmZpcmUoImFubm90YXRpb24tc2VsZWN0Iix7bmFtZTp6Lm5vZGUubmFtZSxob3N0TmFtZTp0Lm5vZGUubmFtZX0pfSk7CmlmKHYuYW5ub3RhdGlvblR5cGUhPT1jLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5TVU1NQVJZJiZ2LmFubm90YXRpb25UeXBlIT09Yy5yZW5kZXIuQW5ub3RhdGlvblR5cGUuQ09OU1RBTlQpci5vbigiY29udGV4dG1lbnUiLGQuY29udGV4dG1lbnUuZ2V0TWVudSh5LGQubm9kZS5nZXRDb250ZXh0TWVudSh2Lm5vZGUseSkpKX1mdW5jdGlvbiBxKHIsdCx2LHkpe2xldCB6PWMubGF5b3V0LmNvbXB1dGVDWFBvc2l0aW9uT2ZOb2RlU2hhcGUodCk7di5yZW5kZXJOb2RlSW5mbyYmdi5hbm5vdGF0aW9uVHlwZSE9PWMucmVuZGVyLkFubm90YXRpb25UeXBlLkVMTElQU0lTJiZkLm5vZGUuc3R5bGl6ZShyLHYucmVuZGVyTm9kZUluZm8seSxkLkNsYXNzLkFubm90YXRpb24uTk9ERSk7di5hbm5vdGF0aW9uVHlwZT09PWMucmVuZGVyLkFubm90YXRpb25UeXBlLlNVTU1BUlkmJih2LndpZHRoKz0xMCk7ci5zZWxlY3QoInRleHQuIitkLkNsYXNzLkFubm90YXRpb24uTEFCRUwpLnRyYW5zaXRpb24oKS5hdHRyKCJ4IiwKeit2LmR4Kyh2LmlzSW4/LTE6MSkqKHYud2lkdGgvMit2LmxhYmVsT2Zmc2V0KSkuYXR0cigieSIsdC55K3YuZHkpO3Iuc2VsZWN0KCJ1c2Uuc3VtbWFyeSIpLnRyYW5zaXRpb24oKS5hdHRyKCJ4Iix6K3YuZHgtMykuYXR0cigieSIsdC55K3YuZHktNik7ZC5wb3NpdGlvbkVsbGlwc2Uoci5zZWxlY3QoIi4iK2QuQ2xhc3MuQW5ub3RhdGlvbi5OT0RFKyIgZWxsaXBzZSIpLHordi5keCx0Lnkrdi5keSx2LndpZHRoLHYuaGVpZ2h0KTtkLnBvc2l0aW9uUmVjdChyLnNlbGVjdCgiLiIrZC5DbGFzcy5Bbm5vdGF0aW9uLk5PREUrIiByZWN0Iikseit2LmR4LHQueSt2LmR5LHYud2lkdGgsdi5oZWlnaHQpO2QucG9zaXRpb25SZWN0KHIuc2VsZWN0KCIuIitkLkNsYXNzLkFubm90YXRpb24uTk9ERSsiIHVzZSIpLHordi5keCx0Lnkrdi5keSx2LndpZHRoLHYuaGVpZ2h0KTtyLnNlbGVjdCgicGF0aC4iK2QuQ2xhc3MuQW5ub3RhdGlvbi5FREdFKS50cmFuc2l0aW9uKCkuYXR0cigiZCIseD0+Cnt4PXgucG9pbnRzLm1hcChDPT4oe3g6Qy5keCt6LHk6Qy5keSt0Lnl9KSk7cmV0dXJuIGQuZWRnZS5pbnRlcnBvbGF0ZSh4KX0pfWYuYnVpbGRHcm91cD1mdW5jdGlvbihyLHQsdix5KXtyPXIuc2VsZWN0QWxsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlc30pLmRhdGEodC5saXN0LHo9Pnoubm9kZS5uYW1lKTtyLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiZGF0YS1uYW1lIix6PT56Lm5vZGUubmFtZSkuZWFjaChmdW5jdGlvbih6KXtsZXQgeD1kMy5zZWxlY3QodGhpcyk7eS5hZGRBbm5vdGF0aW9uR3JvdXAoeix2LHgpO2xldCBDPWQuQ2xhc3MuQW5ub3RhdGlvbi5FREdFLEY9ei5yZW5kZXJNZXRhZWRnZUluZm8mJnoucmVuZGVyTWV0YWVkZ2VJbmZvLm1ldGFlZGdlO0YmJiFGLm51bVJlZ3VsYXJFZGdlcyYmKEMrPSIgIitkLkNsYXNzLkFubm90YXRpb24uQ09OVFJPTF9FREdFKTtGJiZGLm51bVJlZkVkZ2VzJiYoQys9IiAiK2QuQ2xhc3MuRWRnZS5SRUZfTElORSk7CmQuZWRnZS5hcHBlbmRFZGdlKHgseix5LEMpO3ouYW5ub3RhdGlvblR5cGUhPT1jLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5FTExJUFNJUz8oayh4LHopLGwoeCx6KSk6bih4LHoubm9kZS5uYW1lLHosZC5DbGFzcy5Bbm5vdGF0aW9uLkVMTElQU0lTKX0pLm1lcmdlKHIpLmF0dHIoImNsYXNzIix6PT5kLkNsYXNzLkFubm90YXRpb24uR1JPVVArIiAiK2coei5hbm5vdGF0aW9uVHlwZSkrIiAiK2Qubm9kZS5ub2RlQ2xhc3MoeikpLmVhY2goZnVuY3Rpb24oeil7bGV0IHg9ZDMuc2VsZWN0KHRoaXMpO3EoeCx2LHoseSk7ei5hbm5vdGF0aW9uVHlwZSE9PWMucmVuZGVyLkFubm90YXRpb25UeXBlLkVMTElQU0lTJiZwKHgsdix6LHkpfSk7ci5leGl0KCkuZWFjaChmdW5jdGlvbih6KXtsZXQgeD1kMy5zZWxlY3QodGhpcyk7eS5yZW1vdmVBbm5vdGF0aW9uR3JvdXAoeix2LHgpfSkucmVtb3ZlKCk7cmV0dXJuIHJ9fSkoZC5hbm5vdGF0aW9ufHwoZC5hbm5vdGF0aW9uPXt9KSl9KShjLnNjZW5lfHwKKGMuc2NlbmU9e30pKX0pKGEuZ3JhcGh8fChhLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2NvbG9ycy5qcwooZnVuY3Rpb24oYSl7YS5DT0xPUlM9W3tuYW1lOiJHb29nbGUgQmx1ZSIsY29sb3I6IiM0MTg0ZjMiLGFjdGl2ZToiIzNhNTNjNSIsZGlzYWJsZWQ6IiNjYWQ4ZmMifSx7bmFtZToiR29vZ2xlIFJlZCIsY29sb3I6IiNkYjQ0MzciLGFjdGl2ZToiIzhmMmEwYyIsZGlzYWJsZWQ6IiNlOGM2YzEifSx7bmFtZToiR29vZ2xlIFllbGxvdyIsY29sb3I6IiNmNGI0MDAiLGFjdGl2ZToiI2RiOTIwMCIsZGlzYWJsZWQ6IiNmN2U4YjAifSx7bmFtZToiR29vZ2xlIEdyZWVuIixjb2xvcjoiIzBmOWQ1OCIsYWN0aXZlOiIjNDg4MDQ2IixkaXNhYmxlZDoiI2MyZTFjYyJ9LHtuYW1lOiJQdXJwbGUiLGNvbG9yOiIjYWE0NmJiIixhY3RpdmU6IiM1YzEzOTgiLGRpc2FibGVkOiIjZDdiY2U2In0se25hbWU6IlRlYWwiLGNvbG9yOiIjMDBhYmMwIixhY3RpdmU6IiM0NzgyOGUiLGRpc2FibGVkOiIjYzJlYWYyIn0se25hbWU6IkRlZXAgT3JhbmdlIixjb2xvcjoiI2ZmNmY0MiIsYWN0aXZlOiIjY2E0YTA2IiwKZGlzYWJsZWQ6IiNmMmNiYmEifSx7bmFtZToiTGltZSIsY29sb3I6IiM5ZDljMjMiLGFjdGl2ZToiIzdmNzcxZCIsZGlzYWJsZWQ6IiNmMWY0YzIifSx7bmFtZToiSW5kaWdvIixjb2xvcjoiIzViNmFiZiIsYWN0aXZlOiIjM2U0N2E5IixkaXNhYmxlZDoiI2M1YzhlOCJ9LHtuYW1lOiJQaW5rIixjb2xvcjoiI2VmNjE5MSIsYWN0aXZlOiIjY2ExYzYwIixkaXNhYmxlZDoiI2U5YjljZSJ9LHtuYW1lOiJEZWVwIFRlYWwiLGNvbG9yOiIjMDA3ODZhIixhY3RpdmU6IiMyYjRmNDMiLGRpc2FibGVkOiIjYmVkZWRhIn0se25hbWU6IkRlZXAgUGluayIsY29sb3I6IiNjMTE3NWEiLGFjdGl2ZToiIzc1MDg0ZiIsZGlzYWJsZWQ6IiNkZThjYWUifSx7bmFtZToiR3JheSIsY29sb3I6IiM5RTlFOUUiLGFjdGl2ZToiIzQyNDI0MiIsZGlzYWJsZWQ6IkY1RjVGNSJ9XS5yZWR1Y2UoKGMsZCk9PntjW2QubmFtZV09ZDtyZXR1cm4gY30se30pO2EuT1BfR1JPVVBfQ09MT1JTPVt7Y29sb3I6Ikdvb2dsZSBSZWQiLApncm91cHM6Imdlbl9sZWdhY3lfb3BzIGxlZ2FjeV9vcHMgbGVnYWN5X2Zsb2dzX2lucHV0IGxlZ2FjeV9pbWFnZV9pbnB1dCBsZWdhY3lfaW5wdXRfZXhhbXBsZV9pbnB1dCBsZWdhY3lfc2VxdWVuY2VfaW5wdXQgbGVnYWN5X3NldGlfaW5wdXRfaW5wdXQiLnNwbGl0KCIgIil9LHtjb2xvcjoiRGVlcCBPcmFuZ2UiLGdyb3VwczpbImNvbnN0YW50X29wcyJdfSx7Y29sb3I6IkluZGlnbyIsZ3JvdXBzOlsic3RhdGVfb3BzIl19LHtjb2xvcjoiUHVycGxlIixncm91cHM6WyJubl9vcHMiLCJubiJdfSx7Y29sb3I6Ikdvb2dsZSBHcmVlbiIsZ3JvdXBzOlsibWF0aF9vcHMiXX0se2NvbG9yOiJMaW1lIixncm91cHM6WyJhcnJheV9vcHMiXX0se2NvbG9yOiJUZWFsIixncm91cHM6WyJjb250cm9sX2Zsb3dfb3BzIiwiZGF0YV9mbG93X29wcyJdfSx7Y29sb3I6IlBpbmsiLGdyb3VwczpbInN1bW1hcnlfb3BzIl19LHtjb2xvcjoiRGVlcCBQaW5rIixncm91cHM6WyJpb19vcHMiXX1dLnJlZHVjZSgoYywKZCk9PntkLmdyb3Vwcy5mb3JFYWNoKGZ1bmN0aW9uKGYpe2NbZl09ZC5jb2xvcn0pO3JldHVybiBjfSx7fSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2NvbW1vbi5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXtkLk9QX0dSQVBIPSJvcF9ncmFwaCI7ZC5DT05DRVBUVUFMX0dSQVBIPSJjb25jZXB0dWFsX2dyYXBoIjtkLlBST0ZJTEU9InByb2ZpbGUifSkoYy5TZWxlY3Rpb25UeXBlfHwoYy5TZWxlY3Rpb25UeXBlPXt9KSl9KShhLmdyYXBofHwoYS5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9jb250ZXh0bWVudS5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gZyhsKXtsZXQgaz0wLG49MDtmb3IoO2wmJjA8PWwub2Zmc2V0TGVmdCYmMDw9bC5vZmZzZXRUb3A7KWsrPWwub2Zmc2V0TGVmdC1sLnNjcm9sbExlZnQsbis9bC5vZmZzZXRUb3AtbC5zY3JvbGxUb3AsbD1sLm9mZnNldFBhcmVudDtyZXR1cm57bGVmdDprLHRvcDpufX1mLmdldE1lbnU9ZnVuY3Rpb24obCxrKXtjb25zdCBuPWwuZ2V0Q29udGV4dE1lbnUoKSxwPWQzLnNlbGVjdChsLmdldENvbnRleHRNZW51KCkpO3JldHVybiBmdW5jdGlvbihxLHIpe2Z1bmN0aW9uIHQoeil7eiYmei5jb21wb3NlZFBhdGgoKS5pbmNsdWRlcyhuKXx8KHAuc3R5bGUoImRpc3BsYXkiLCJub25lIiksZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHQse2NhcHR1cmU6ITB9KSl9bGV0IHY9ZDMuZXZlbnQ7Y29uc3QgeT1nKGwpO3Auc3R5bGUoImRpc3BsYXkiLCJibG9jayIpLnN0eWxlKCJsZWZ0IiwKdi5jbGllbnRYLXkubGVmdCsxKyJweCIpLnN0eWxlKCJ0b3AiLHYuY2xpZW50WS15LnRvcCsxKyJweCIpO3YucHJldmVudERlZmF1bHQoKTt2LnN0b3BQcm9wYWdhdGlvbigpO2RvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0LHtjYXB0dXJlOiEwfSk7cC5odG1sKCIiKTtwLmFwcGVuZCgidWwiKS5zZWxlY3RBbGwoImxpIikuZGF0YShrKS5lbnRlcigpLmFwcGVuZCgibGkiKS5vbigiY2xpY2siLHo9Pnt6LmFjdGlvbih0aGlzLHEscik7dCgpfSkuaHRtbChmdW5jdGlvbih6KXtyZXR1cm4gei50aXRsZShxKX0pfX19KShkLmNvbnRleHRtZW51fHwoZC5jb250ZXh0bWVudT17fSkpfSkoYy5zY2VuZXx8KGMuc2NlbmU9e30pKX0pKGEuZ3JhcGh8fChhLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2VkZ2UuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGcoeil7cmV0dXJuIHouditjLkVER0VfS0VZX0RFTElNK3oud31mdW5jdGlvbiBsKHoseCl7eD14LmdldE5vZGVCeU5hbWUoei52KTtpZihudWxsPT14Lm91dHB1dFNoYXBlc3x8Xy5pc0VtcHR5KHgub3V0cHV0U2hhcGVzKSlyZXR1cm4gbnVsbDt6PXgub3V0cHV0U2hhcGVzW3oub3V0cHV0VGVuc29yS2V5XTtyZXR1cm4gbnVsbD09ej9udWxsOjA9PT16Lmxlbmd0aD8ic2NhbGFyIjp6Lm1hcChDPT4tMT09PUM/Ij8iOkMpLmpvaW4oIlx1MDBkNyIpfWZ1bmN0aW9uIGsoeix4KXtyZXR1cm4geC5lZGdlTGFiZWxGdW5jdGlvbj94LmVkZ2VMYWJlbEZ1bmN0aW9uKHoseCk6MTx6LmJhc2VFZGdlTGlzdC5sZW5ndGg/ei5iYXNlRWRnZUxpc3QubGVuZ3RoKyIgdGVuc29ycyI6bCh6LmJhc2VFZGdlTGlzdFswXSx4KX1mdW5jdGlvbiBuKHoseCxDKXtjb25zdCBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhhLmdyYXBoLnNjZW5lLlNWR19OQU1FU1BBQ0UsCiJwYXRoIik7Zm9yKGxldCBEPTE7RDx6Lmxlbmd0aDtEKyspaWYoRi5zZXRBdHRyaWJ1dGUoImQiLEMoei5zbGljZSgwLEQpKSksRi5nZXRUb3RhbExlbmd0aCgpPngpcmV0dXJuIEQtMTtyZXR1cm4gei5sZW5ndGgtMX1mdW5jdGlvbiBwKHoseCxDKXt2YXIgRj1kMy5saW5lKCkueChPPT5PLngpLnkoTz0+Ty55KSxEPWQzLnNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwicGF0aCIpKS5hdHRyKCJkIixGKHopKSxCPSt4LmF0dHIoIm1hcmtlcldpZHRoIiksST14LmF0dHIoInZpZXdCb3giKS5zcGxpdCgiICIpLm1hcChOdW1iZXIpO0k9SVsyXS1JWzBdO3g9K3guYXR0cigicmVmWCIpO0Q9RC5ub2RlKCk7aWYoQylyZXR1cm4gQio9MS14L0ksQz1ELmdldFBvaW50QXRMZW5ndGgoQiksRj1uKHosQixGKSx6W0YtMV09e3g6Qy54LHk6Qy55fSx6LnNsaWNlKEYtMSk7Qz0xLXgvSTtCPUQuZ2V0VG90YWxMZW5ndGgoKS1CKkM7Qz0KRC5nZXRQb2ludEF0TGVuZ3RoKEIpO0Y9bih6LEIsRik7eltGXT17eDpDLngseTpDLnl9O3JldHVybiB6LnNsaWNlKDAsRisxKX1mdW5jdGlvbiBxKHoseCxDLEYpe0Y9Rnx8ZC5DbGFzcy5FZGdlLkxJTkU7eC5sYWJlbCYmeC5sYWJlbC5zdHJ1Y3R1cmFsJiYoRis9IiAiK2QuQ2xhc3MuRWRnZS5TVFJVQ1RVUkFMKTt4LmxhYmVsJiZ4LmxhYmVsLm1ldGFlZGdlJiZ4LmxhYmVsLm1ldGFlZGdlLm51bVJlZkVkZ2VzJiYoRis9IiAiK2QuQ2xhc3MuRWRnZS5SRUZFUkVOQ0VfRURHRSk7Qy5oYW5kbGVFZGdlU2VsZWN0ZWQmJihGKz0iICIrZC5DbGFzcy5FZGdlLlNFTEVDVEFCTEUpO2xldCBEPSJwYXRoXyIrZyh4KTtpZihDLnJlbmRlckhpZXJhcmNoeS5lZGdlV2lkdGhGdW5jdGlvbil2YXIgQj1DLnJlbmRlckhpZXJhcmNoeS5lZGdlV2lkdGhGdW5jdGlvbih4LEYpO2Vsc2UgQj0xLG51bGwhPXgubGFiZWwmJm51bGwhPXgubGFiZWwubWV0YWVkZ2UmJihCPXgubGFiZWwubWV0YWVkZ2UudG90YWxTaXplKSwKQj1DLnJlbmRlckhpZXJhcmNoeS5lZGdlV2lkdGhTaXplZEJhc2VkU2NhbGUoQik7Rj16LmFwcGVuZCgicGF0aCIpLmF0dHIoImlkIixEKS5hdHRyKCJjbGFzcyIsRikuc3R5bGUoInN0cm9rZS13aWR0aCIsQisicHgiKTt4LmxhYmVsJiZ4LmxhYmVsLm1ldGFlZGdlJiYoeC5sYWJlbC5tZXRhZWRnZS5udW1SZWZFZGdlcz8oQj1gcmVmZXJlbmNlLWFycm93aGVhZC0ke3koQil9YCxGLnN0eWxlKCJtYXJrZXItc3RhcnQiLGB1cmwoIyR7Qn0pYCkseC5sYWJlbC5zdGFydE1hcmtlcklkPUIpOihCPWBkYXRhZmxvdy1hcnJvd2hlYWQtJHt5KEIpfWAsRi5zdHlsZSgibWFya2VyLWVuZCIsYHVybCgjJHtCfSlgKSx4LmxhYmVsLmVuZE1hcmtlcklkPUIpKTtudWxsIT14LmxhYmVsJiZudWxsIT14LmxhYmVsLm1ldGFlZGdlJiYoeD1rKHgubGFiZWwubWV0YWVkZ2UsQy5yZW5kZXJIaWVyYXJjaHkpLG51bGwhPXgmJnouYXBwZW5kKCJ0ZXh0IikuYXBwZW5kKCJ0ZXh0UGF0aCIpLmF0dHIoInhsaW5rOmhyZWYiLAoiIyIrRCkuYXR0cigic3RhcnRPZmZzZXQiLCI1MCUiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLmF0dHIoImRvbWluYW50LWJhc2VsaW5lIiwiY2VudHJhbCIpLnRleHQoeCkpfWZ1bmN0aW9uIHIoeix4LEMsRixEKXtGPUMubGFiZWw7bGV0IEI9Ri5hZGpvaW5pbmdNZXRhZWRnZSxJPUYucG9pbnRzOyh7c2hhZG93Um9vdDp6fT16KTtDLmxhYmVsLnN0YXJ0TWFya2VySWQmJihJPXAoSSxkMy5zZWxlY3Qoei5xdWVyeVNlbGVjdG9yKCIjIitDLmxhYmVsLnN0YXJ0TWFya2VySWQpKSwhMCkpO0MubGFiZWwuZW5kTWFya2VySWQmJihJPXAoSSxkMy5zZWxlY3Qoei5xdWVyeVNlbGVjdG9yKCIjIitDLmxhYmVsLmVuZE1hcmtlcklkKSksITEpKTtpZighQilyZXR1cm4gZDMuaW50ZXJwb2xhdGUoRCxmLmludGVycG9sYXRlKEkpKTtsZXQgTz1CLmVkZ2VHcm91cC5ub2RlKCkuZmlyc3RDaGlsZCxQPUYubWV0YWVkZ2UuaW5ib3VuZDtyZXR1cm4gZnVuY3Rpb24oKXtsZXQgSD1PLmdldFBvaW50QXRMZW5ndGgoUD8KTy5nZXRUb3RhbExlbmd0aCgpOjApLm1hdHJpeFRyYW5zZm9ybShPLmdldENUTSgpKS5tYXRyaXhUcmFuc2Zvcm0oeC5nZXRDVE0oKS5pbnZlcnNlKCkpLEs9UD8wOkkubGVuZ3RoLTE7SVtLXS54PUgueDtJW0tdLnk9SC55O3JldHVybiBmLmludGVycG9sYXRlKEkpfX1mdW5jdGlvbiB0KHoseCl7ZDMuc2VsZWN0KHgpLnNlbGVjdCgicGF0aC4iK2QuQ2xhc3MuRWRnZS5MSU5FKS50cmFuc2l0aW9uKCkuYXR0clR3ZWVuKCJkIixmdW5jdGlvbihDLEYsRCl7cmV0dXJuIHIoeix0aGlzLEMsRixEKX0pfWZ1bmN0aW9uIHYoeix4KXt6LmNsYXNzZWQoImZhZGVkIix4LmxhYmVsLmlzRmFkZWRPdXQpO3g9eC5sYWJlbC5tZXRhZWRnZTt6LnNlbGVjdCgicGF0aC4iK2QuQ2xhc3MuRWRnZS5MSU5FKS5jbGFzc2VkKCJjb250cm9sLWRlcCIseCYmIXgubnVtUmVndWxhckVkZ2VzKX1mLk1JTl9FREdFX1dJRFRIPS43NTtmLk1BWF9FREdFX1dJRFRIPTEyO2YuRURHRV9XSURUSF9TSVpFX0JBU0VEX1NDQUxFPQpkMy5zY2FsZVBvdygpLmV4cG9uZW50KC4zKS5kb21haW4oWzEsNUU2XSkucmFuZ2UoW2YuTUlOX0VER0VfV0lEVEgsZi5NQVhfRURHRV9XSURUSF0pLmNsYW1wKCEwKTtsZXQgeT1kMy5zY2FsZVF1YW50aXplKCkuZG9tYWluKFtmLk1JTl9FREdFX1dJRFRILGYuTUFYX0VER0VfV0lEVEhdKS5yYW5nZShbInNtYWxsIiwibWVkaXVtIiwibGFyZ2UiLCJ4bGFyZ2UiXSk7Zi5nZXRFZGdlS2V5PWc7Zi5idWlsZEdyb3VwPWZ1bmN0aW9uKHoseCxDKXtsZXQgRj1bXTtGPV8ucmVkdWNlKHguZWRnZXMoKSwoRCxCKT0+e2xldCBJPXguZWRnZShCKTtELnB1c2goe3Y6Qi52LHc6Qi53LGxhYmVsOkl9KTtyZXR1cm4gRH0sRik7ej1kLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoeiwiZyIsZC5DbGFzcy5FZGdlLkNPTlRBSU5FUikuc2VsZWN0QWxsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlc30pLmRhdGEoRixnKTt6LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLGQuQ2xhc3MuRWRnZS5HUk9VUCkuYXR0cigiZGF0YS1lZGdlIiwKZykuZWFjaChmdW5jdGlvbihEKXtsZXQgQj1kMy5zZWxlY3QodGhpcyk7RC5sYWJlbC5lZGdlR3JvdXA9QjtDLl9lZGdlR3JvdXBJbmRleFtnKEQpXT1CO2lmKEMuaGFuZGxlRWRnZVNlbGVjdGVkKUIub24oImNsaWNrIixJPT57ZDMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Qy5maXJlKCJlZGdlLXNlbGVjdCIse2VkZ2VEYXRhOkksZWRnZUdyb3VwOkJ9KX0pO3EoQixELEMpfSkubWVyZ2UoeikuZWFjaChmdW5jdGlvbigpe3QoQyx0aGlzKX0pLmVhY2goZnVuY3Rpb24oRCl7dihkMy5zZWxlY3QodGhpcyksRCxDKX0pO3ouZXhpdCgpLmVhY2goRD0+e2RlbGV0ZSBDLl9lZGdlR3JvdXBJbmRleFtnKEQpXX0pLnJlbW92ZSgpO3JldHVybiB6fTtmLmdldExhYmVsRm9yQmFzZUVkZ2U9bDtmLmdldExhYmVsRm9yRWRnZT1rO2YuYXBwZW5kRWRnZT1xO2YuaW50ZXJwb2xhdGU9ZDMubGluZSgpLmN1cnZlKGQzLmN1cnZlQmFzaXMpLngoej0+ei54KS55KHo9PnoueSl9KShkLmVkZ2V8fChkLmVkZ2U9Cnt9KSl9KShjLnNjZW5lfHwoYy5zY2VuZT17fSkpfSkoYS5ncmFwaHx8KGEuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vZXh0ZXJucy5qcwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9ncmFwaC5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGQoSCxLLE0sTCxSKXtyZXR1cm4oTT9NKyIvIjoiIikrKEgrKCJ1bmRlZmluZWQiIT09dHlwZW9mIEwmJiJ1bmRlZmluZWQiIT09dHlwZW9mIFI/IlsiK0wrIi0iK1IrIl0iOiIjIikrSyl9ZnVuY3Rpb24gZihIKXtpZighSClyZXR1cm4gbnVsbDtmb3IobGV0IEs9MDtLPEgubGVuZ3RoO0srKyl7bGV0IHtrZXk6TSx2YWx1ZTpMfT1IW0tdO2lmKCJfb3V0cHV0X3NoYXBlcyI9PT1NKXtpZighTC5saXN0LnNoYXBlKWJyZWFrO2xldCBSPUwubGlzdC5zaGFwZS5tYXAoVT0+VS51bmtub3duX3Jhbms/bnVsbDpudWxsPT1VLmRpbXx8MT09PVUuZGltLmxlbmd0aCYmbnVsbD09VS5kaW1bMF0uc2l6ZT9bXTpVLmRpbS5tYXAoWT0+WS5zaXplKSk7SC5zcGxpY2UoSywxKTtyZXR1cm4gUn19cmV0dXJuIG51bGx9ZnVuY3Rpb24gZyhIKXtpZighSClyZXR1cm4gbnVsbDtmb3IobGV0IEs9MDtLPEgubGVuZ3RoO0srKylpZigiX1hsYUNsdXN0ZXIiPT09CkhbS10ua2V5KXJldHVybiBIW0tdLnZhbHVlLnN8fG51bGw7cmV0dXJuIG51bGx9ZnVuY3Rpb24gbChIKXtsZXQgSz1bXTtfLmVhY2goSCxNPT57bGV0IEw9Il4iPT09TVswXTtMJiYoTT1NLnN1YnN0cmluZygxKSk7bGV0IFI9TSxVPSIwIixZPU0ubWF0Y2goLyguKik6KFx3KzpcZCspJC8pO2lmKFkpUj1ZWzFdLFU9WVsyXTtlbHNlIGlmKFk9TS5tYXRjaCgvKC4qKTooXGQrKSQvKSlSPVlbMV0sVT1ZWzJdOzAhPT1LLmxlbmd0aCYmUj09PUtbSy5sZW5ndGgtMV0ubmFtZXx8Sy5wdXNoKHtuYW1lOlIsb3V0cHV0VGVuc29yS2V5OlUsaXNDb250cm9sRGVwZW5kZW5jeTpMfSl9KTtyZXR1cm4gS31mdW5jdGlvbiBrKEgsSyxNLEwsUixVKXtLIT09TS5uYW1lJiZILmVkZ2VzLnB1c2goe3Y6Syx3Ok0ubmFtZSxvdXRwdXRUZW5zb3JLZXk6TC5vdXRwdXRUZW5zb3JLZXksaXNDb250cm9sRGVwZW5kZW5jeTpMLmlzQ29udHJvbERlcGVuZGVuY3ksaXNSZWZlcmVuY2VFZGdlOiEwPT09Ui5yZWZFZGdlc1tNLm9wKwoiICIrVV19KX1mdW5jdGlvbiBuKEgsSyxNKXtNPU18fHt9O2xldCBMPW5ldyBncmFwaGxpYi5HcmFwaChNKTtMLnNldEdyYXBoKHtuYW1lOkgscmFua2RpcjpNLnJhbmtkaXJ8fCJCVCIsdHlwZTpLfSk7cmV0dXJuIEx9ZnVuY3Rpb24gcChIKXtyZXR1cm4gZnVuY3Rpb24oSyl7Zm9yKGxldCBNPTA7TTxILmxlbmd0aDtNKyspe2xldCBMPW5ldyBSZWdFeHAoSFtNXSk7aWYoInN0cmluZyI9PT10eXBlb2YgSy5vcCYmSy5vcC5tYXRjaChMKSlyZXR1cm4hMH1yZXR1cm4hMX19ZnVuY3Rpb24gcShIKXtsZXQgSz1ILnNwbGl0KGMuTkFNRVNQQUNFX0RFTElNKTtyZXR1cm4gSCtjLk5BTUVTUEFDRV9ERUxJTSsiKCIrS1tLLmxlbmd0aC0xXSsiKSJ9ZnVuY3Rpb24gcihILEspe2xldCBNPXt9LEw9e307SC5zb3J0KCk7Zm9yKGxldCBSPTA7UjxILmxlbmd0aC0xOysrUil7bGV0IFU9SFtSXTtfLmVhY2godihVKS5zbGljZSgwLC0xKSxZPT57TFtZXT0hMH0pO2ZvcihsZXQgWT1SKzE7WTxILmxlbmd0aDsrK1kpe2xldCBiYT0KSFtZXTtpZihfLnN0YXJ0c1dpdGgoYmEsVSkpe2lmKGJhLmxlbmd0aD5VLmxlbmd0aCYmYmEuY2hhckF0KFUubGVuZ3RoKT09PWMuTkFNRVNQQUNFX0RFTElNKXtNW1VdPXEoVSk7YnJlYWt9fWVsc2UgYnJlYWt9fV8uZWFjaChLLFI9PntSIGluIEwmJihNW1JdPXEoUikpfSk7cmV0dXJuIE19ZnVuY3Rpb24gdChIKXtsZXQgSz1ILm5vZGVzKCkubWFwKGZ1bmN0aW9uKE0pe3JldHVybiBILm5laWdoYm9ycyhNKS5sZW5ndGh9KTtLLnNvcnQoKTtyZXR1cm4gS31mdW5jdGlvbiB2KEgsSyl7bGV0IE09W10sTD1ILmluZGV4T2YoYy5OQU1FU1BBQ0VfREVMSU0pO2Zvcig7MDw9TDspTS5wdXNoKEguc3Vic3RyaW5nKDAsTCkpLEw9SC5pbmRleE9mKGMuTkFNRVNQQUNFX0RFTElNLEwrMSk7SyYmKEs9S1tIXSkmJk0ucHVzaChLKTtNLnB1c2goSCk7cmV0dXJuIE19Yy5OQU1FU1BBQ0VfREVMSU09Ii8iO2MuUk9PVF9OQU1FPSJfX3Jvb3RfXyI7Yy5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYPQoiX19mdW5jdGlvbl9saWJyYXJ5X18iO2MuTEFSR0VfQVRUUlNfS0VZPSJfdG9vX2xhcmdlX2F0dHJzIjtjLkxJTUlUX0FUVFJfU0laRT0xMDI0O2MuRURHRV9LRVlfREVMSU09Ii0tIjtsZXQgeTsoZnVuY3Rpb24oSCl7SFtILkZVTEw9MF09IkZVTEwiO0hbSC5FTUJFRERFRD0xXT0iRU1CRURERUQiO0hbSC5NRVRBPTJdPSJNRVRBIjtIW0guU0VSSUVTPTNdPSJTRVJJRVMiO0hbSC5DT1JFPTRdPSJDT1JFIjtIW0guU0hBRE9XPTVdPSJTSEFET1ciO0hbSC5CUklER0U9Nl09IkJSSURHRSI7SFtILkVER0U9N109IkVER0UifSkoeT1jLkdyYXBoVHlwZXx8KGMuR3JhcGhUeXBlPXt9KSk7bGV0IHo7KGZ1bmN0aW9uKEgpe0hbSC5NRVRBPTBdPSJNRVRBIjtIW0guT1A9MV09Ik9QIjtIW0guU0VSSUVTPTJdPSJTRVJJRVMiO0hbSC5CUklER0U9M109IkJSSURHRSI7SFtILkVMTElQU0lTPTRdPSJFTExJUFNJUyJ9KSh6PWMuTm9kZVR5cGV8fChjLk5vZGVUeXBlPXt9KSk7bGV0IHg7KGZ1bmN0aW9uKEgpe0hbSC5JTkNMVURFPQowXT0iSU5DTFVERSI7SFtILkVYQ0xVREU9MV09IkVYQ0xVREUiO0hbSC5VTlNQRUNJRklFRD0yXT0iVU5TUEVDSUZJRUQifSkoeD1jLkluY2x1c2lvblR5cGV8fChjLkluY2x1c2lvblR5cGU9e30pKTsoZnVuY3Rpb24oSCl7SFtILkdST1VQPTBdPSJHUk9VUCI7SFtILlVOR1JPVVA9MV09IlVOR1JPVVAifSkoYy5TZXJpZXNHcm91cGluZ1R5cGV8fChjLlNlcmllc0dyb3VwaW5nVHlwZT17fSkpO2NsYXNzIEN7Y29uc3RydWN0b3IoKXt0aGlzLm5vZGVzPXt9O3RoaXMuZWRnZXM9W119fWMuU2xpbUdyYXBoPUM7Y2xhc3MgRntjb25zdHJ1Y3RvcihIKXt0aGlzLnR5cGU9ei5FTExJUFNJUzt0aGlzLmlzR3JvdXBOb2RlPSExO3RoaXMuY2FyZGluYWxpdHk9MTt0aGlzLnN0YXRzPXRoaXMucGFyZW50Tm9kZT1udWxsO3RoaXMuc2V0TnVtTW9yZU5vZGVzKEgpO3RoaXMuaW5jbHVkZT14LlVOU1BFQ0lGSUVEfXNldE51bU1vcmVOb2RlcyhIKXt0aGlzLm51bU1vcmVOb2Rlcz1IO3RoaXMubmFtZT0KIi4uLiAiK0grIiBtb3JlIn19Yy5FbGxpcHNpc05vZGVJbXBsPUY7Y2xhc3MgRHtjb25zdHJ1Y3RvcihIKXt0aGlzLm9wPUgub3A7dGhpcy5uYW1lPUgubmFtZTt0aGlzLmRldmljZT1ILmRldmljZTt0aGlzLmF0dHI9SC5hdHRyO3RoaXMuaW5wdXRzPWwoSC5pbnB1dCk7dGhpcy5vdXRwdXRTaGFwZXM9ZihILmF0dHIpO3RoaXMueGxhQ2x1c3Rlcj1nKEguYXR0cik7dGhpcy5jb21wYXRpYmxlPSExO3RoaXMudHlwZT16Lk9QO3RoaXMuaXNHcm91cE5vZGU9ITE7dGhpcy5jYXJkaW5hbGl0eT0xO3RoaXMuaW5FbWJlZGRpbmdzPVtdO3RoaXMub3V0RW1iZWRkaW5ncz1bXTt0aGlzLnBhcmVudE5vZGU9bnVsbDt0aGlzLmluY2x1ZGU9eC5VTlNQRUNJRklFRDt0aGlzLm93bmluZ1Nlcmllcz1udWxsfX1jLk9wTm9kZUltcGw9RDtjLmNyZWF0ZU1ldGFub2RlPWZ1bmN0aW9uKEgsSz17fSl7cmV0dXJuIG5ldyBJKEgsSyl9O2Muam9pblN0YXRzSW5mb1dpdGhHcmFwaD1mdW5jdGlvbihILEssCk0pe18uZWFjaChILm5vZGVzLEw9PntMLnN0YXRzPW51bGx9KTtfLmVhY2goSy5kZXZfc3RhdHMsTD0+e00mJiFNW0wuZGV2aWNlXXx8Xy5lYWNoKEwubm9kZV9zdGF0cyxSPT57bGV0IFU9Ui5ub2RlX25hbWUgaW4gSC5ub2Rlcz9SLm5vZGVfbmFtZTpxKFIubm9kZV9uYW1lKTtpZihVIGluIEgubm9kZXMpe3ZhciBZPTA7Ui5tZW1vcnkmJl8uZWFjaChSLm1lbW9yeSxtYT0+e21hLnRvdGFsX2J5dGVzJiYoMDxtYS50b3RhbF9ieXRlcz9ZKz1OdW1iZXIobWEudG90YWxfYnl0ZXMpOmNvbnNvbGUubG9nKCJpZ25vcmluZyBuZWdhdGl2ZSBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgIitVKSl9KTt2YXIgYmE9bnVsbDtSLm91dHB1dCYmKGJhPV8ubWFwKFIub3V0cHV0LG1hPT5fLm1hcChtYS50ZW5zb3JfZGVzY3JpcHRpb24uc2hhcGUuZGltLGFhPT5OdW1iZXIoYWEuc2l6ZSkpKSk7SC5ub2Rlc1tVXS5kZXZpY2U9TC5kZXZpY2U7bnVsbD09SC5ub2Rlc1tVXS5zdGF0cyYmKEgubm9kZXNbVV0uc3RhdHM9Cm5ldyBCKGJhKSk7SC5ub2Rlc1tVXS5zdGF0cy5hZGRCeXRlc0FsbG9jYXRpb24oWSk7Ui5hbGxfZW5kX3JlbF9taWNyb3MmJigwPFIuYWxsX2VuZF9yZWxfbWljcm9zP0gubm9kZXNbVV0uc3RhdHMuYWRkRXhlY3V0aW9uVGltZShSLmFsbF9zdGFydF9taWNyb3MsUi5hbGxfc3RhcnRfbWljcm9zK1IuYWxsX2VuZF9yZWxfbWljcm9zKTpjb25zb2xlLmxvZygiaWdub3JpbmcgbmVnYXRpdmUgcnVudGltZSBmb3IgIitVKSl9fSl9KX07Y2xhc3MgQntjb25zdHJ1Y3RvcihIKXt0aGlzLnRvdGFsQnl0ZXM9MDt0aGlzLm91dHB1dFNpemU9SH1hZGRFeGVjdXRpb25UaW1lKEgsSyl7dGhpcy5zdGFydFRpbWU9bnVsbCE9dGhpcy5zdGFydFRpbWU/TWF0aC5taW4odGhpcy5zdGFydFRpbWUsSCk6SDt0aGlzLmVuZFRpbWU9bnVsbCE9dGhpcy5lbmRUaW1lP01hdGgubWF4KHRoaXMuZW5kVGltZSxLKTpLfWFkZEJ5dGVzQWxsb2NhdGlvbihIKXt0aGlzLnRvdGFsQnl0ZXM9bnVsbCE9dGhpcy50b3RhbEJ5dGVzPwpNYXRoLm1heCh0aGlzLnRvdGFsQnl0ZXMsSCk6SH1jb21iaW5lKEgpe251bGwhPUgudG90YWxCeXRlcyYmKHRoaXMudG90YWxCeXRlcys9SC50b3RhbEJ5dGVzKTtudWxsIT1ILmdldFRvdGFsTWljcm9zKCkmJnRoaXMuYWRkRXhlY3V0aW9uVGltZShILnN0YXJ0VGltZSxILmVuZFRpbWUpfWdldFRvdGFsTWljcm9zKCl7cmV0dXJuIG51bGw9PXRoaXMuc3RhcnRUaW1lfHxudWxsPT10aGlzLmVuZFRpbWU/bnVsbDp0aGlzLmVuZFRpbWUtdGhpcy5zdGFydFRpbWV9fWMuTm9kZVN0YXRzPUI7Y2xhc3MgSXtjb25zdHJ1Y3RvcihILEs9e30pe3RoaXMubmFtZT1IO3RoaXMudHlwZT16Lk1FVEE7dGhpcy5kZXB0aD0xO3RoaXMuaXNHcm91cE5vZGU9ITA7dGhpcy5jYXJkaW5hbGl0eT0wO3RoaXMubWV0YWdyYXBoPW4oSCx5Lk1FVEEsSyk7dGhpcy5icmlkZ2VncmFwaD1udWxsO3RoaXMub3BIaXN0b2dyYW09e307dGhpcy5kZXZpY2VIaXN0b2dyYW09e307dGhpcy54bGFDbHVzdGVySGlzdG9ncmFtPQp7fTt0aGlzLmNvbXBhdGliaWxpdHlIaXN0b2dyYW09e2NvbXBhdGlibGU6MCxpbmNvbXBhdGlibGU6MH07dGhpcy5wYXJlbnROb2RlPXRoaXMudGVtcGxhdGVJZD1udWxsO3RoaXMuaGFzTm9uQ29udHJvbEVkZ2VzPSExO3RoaXMuaW5jbHVkZT14LlVOU1BFQ0lGSUVEO3RoaXMuYXNzb2NpYXRlZEZ1bmN0aW9uPSIifWdldEZpcnN0Q2hpbGQoKXtyZXR1cm4gdGhpcy5tZXRhZ3JhcGgubm9kZSh0aGlzLm1ldGFncmFwaC5ub2RlcygpWzBdKX1nZXRSb290T3AoKXtsZXQgSD10aGlzLm5hbWUuc3BsaXQoIi8iKTtyZXR1cm4gdGhpcy5tZXRhZ3JhcGgubm9kZSh0aGlzLm5hbWUrIi8oIitIW0gubGVuZ3RoLTFdKyIpIil9bGVhdmVzKCl7bGV0IEg9W10sSz1bdGhpc10sTTtmb3IoO0subGVuZ3RoOyl7bGV0IEw9Sy5zaGlmdCgpO0wuaXNHcm91cE5vZGU/KE09TC5tZXRhZ3JhcGgsXy5lYWNoKE0ubm9kZXMoKSxSPT5LLnB1c2goTS5ub2RlKFIpKSkpOkgucHVzaChMLm5hbWUpfXJldHVybiBIfX0KYy5NZXRhbm9kZUltcGw9STtjLmNyZWF0ZU1ldGFlZGdlPWZ1bmN0aW9uKEgsSyl7cmV0dXJuIG5ldyBPKEgsSyl9O2NsYXNzIE97Y29uc3RydWN0b3IoSCxLKXt0aGlzLnY9SDt0aGlzLnc9Szt0aGlzLmJhc2VFZGdlTGlzdD1bXTt0aGlzLmluYm91bmQ9bnVsbDt0aGlzLnRvdGFsU2l6ZT10aGlzLm51bVJlZkVkZ2VzPXRoaXMubnVtQ29udHJvbEVkZ2VzPXRoaXMubnVtUmVndWxhckVkZ2VzPTB9YWRkQmFzZUVkZ2UoSCxLKXt0aGlzLmJhc2VFZGdlTGlzdC5wdXNoKEgpO0guaXNDb250cm9sRGVwZW5kZW5jeT90aGlzLm51bUNvbnRyb2xFZGdlcys9MTp0aGlzLm51bVJlZ3VsYXJFZGdlcys9MTtILmlzUmVmZXJlbmNlRWRnZSYmKHRoaXMubnVtUmVmRWRnZXMrPTEpO3RoaXMudG90YWxTaXplKz1PLmNvbXB1dGVTaXplT2ZFZGdlKEgsSyk7Sy5tYXhNZXRhRWRnZVNpemU9TWF0aC5tYXgoSy5tYXhNZXRhRWRnZVNpemUsdGhpcy50b3RhbFNpemUpfXN0YXRpYyBjb21wdXRlU2l6ZU9mRWRnZShILApLKXtsZXQgTT1LLm5vZGUoSC52KTtpZighTS5vdXRwdXRTaGFwZXMpcmV0dXJuIDE7Sy5oYXNTaGFwZUluZm89ITA7SD1PYmplY3Qua2V5cyhNLm91dHB1dFNoYXBlcykubWFwKEw9Pk0ub3V0cHV0U2hhcGVzW0xdKS5tYXAoTD0+bnVsbD09TD8xOkwucmVkdWNlKChSLFUpPT57LTE9PT1VJiYoVT0xKTtyZXR1cm4gUipVfSwxKSk7cmV0dXJuIF8uc3VtKEgpfX1jLk1ldGFlZGdlSW1wbD1PO2MuY3JlYXRlU2VyaWVzTm9kZT1mdW5jdGlvbihILEssTSxMLFIsVSl7cmV0dXJuIG5ldyBQKEgsSyxNLEwsUixVKX07Yy5nZXRTZXJpZXNOb2RlTmFtZT1kO2NsYXNzIFB7Y29uc3RydWN0b3IoSCxLLE0sTCxSLFUpe3RoaXMubmFtZT1SfHxkKEgsSyxNKTt0aGlzLnR5cGU9ei5TRVJJRVM7dGhpcy5oYXNMb29wPSExO3RoaXMucHJlZml4PUg7dGhpcy5zdWZmaXg9Szt0aGlzLmNsdXN0ZXJJZD1MO3RoaXMuaWRzPVtdO3RoaXMucGFyZW50PU07dGhpcy5pc0dyb3VwTm9kZT0hMDt0aGlzLmNhcmRpbmFsaXR5PQowO3RoaXMubWV0YWdyYXBoPW4oUix5LlNFUklFUyxVKTt0aGlzLnBhcmVudE5vZGU9dGhpcy5icmlkZ2VncmFwaD1udWxsO3RoaXMuZGV2aWNlSGlzdG9ncmFtPXt9O3RoaXMueGxhQ2x1c3Rlckhpc3RvZ3JhbT17fTt0aGlzLmNvbXBhdGliaWxpdHlIaXN0b2dyYW09e2NvbXBhdGlibGU6MCxpbmNvbXBhdGlibGU6MH07dGhpcy5oYXNOb25Db250cm9sRWRnZXM9ITE7dGhpcy5pbmNsdWRlPXguVU5TUEVDSUZJRUR9fWMuRGVmYXVsdEJ1aWxkUGFyYW1zPXtlbmFibGVFbWJlZGRpbmc6ITAsaW5FbWJlZGRpbmdUeXBlczpbIkNvbnN0Il0sb3V0RW1iZWRkaW5nVHlwZXM6WyJeW2EtekEtWl0rU3VtbWFyeSQiXSxyZWZFZGdlczp7IkFzc2lnbiAwIjohMCwiQXNzaWduQWRkIDAiOiEwLCJBc3NpZ25TdWIgMCI6ITAsImFzc2lnbiAwIjohMCwiYXNzaWduX2FkZCAwIjohMCwiYXNzaWduX3N1YiAwIjohMCwiY291bnRfdXBfdG8gMCI6ITAsIlNjYXR0ZXJBZGQgMCI6ITAsIlNjYXR0ZXJTdWIgMCI6ITAsCiJTY2F0dGVyVXBkYXRlIDAiOiEwLCJzY2F0dGVyX2FkZCAwIjohMCwic2NhdHRlcl9zdWIgMCI6ITAsInNjYXR0ZXJfdXBkYXRlIDAiOiEwfX07Yy5idWlsZD1mdW5jdGlvbihILEssTSl7bGV0IEw9e30sUj17fSxVPXt9LFk9cChLLmluRW1iZWRkaW5nVHlwZXMpLGJhPXAoSy5vdXRFbWJlZGRpbmdUeXBlcyksbWE9W10sYWE9SC5ub2RlLGNhPUFycmF5KGFhLmxlbmd0aCk7cmV0dXJuIGEuZ3JhcGgudXRpbC5ydW5Bc3luY1Rhc2soIk5vcm1hbGl6aW5nIG5hbWVzIiwzMCwoKT0+e2xldCBmYT1BcnJheShhYS5sZW5ndGgpLGRhPTA7Y29uc3QgbGE9RmE9PntsZXQgeGE9bmV3IEQoRmEpO2lmKFkoeGEpKXJldHVybiBtYS5wdXNoKHhhLm5hbWUpLExbeGEubmFtZV09eGE7aWYoYmEoeGEpKXJldHVybiBtYS5wdXNoKHhhLm5hbWUpLFJbeGEubmFtZV09eGEsXy5lYWNoKHhhLmlucHV0cyx5YT0+e3lhPXlhLm5hbWU7VVt5YV09VVt5YV18fFtdO1VbeWFdLnB1c2goeGEpfSkseGE7ZmFbZGFdPQp4YTtjYVtkYV09eGEubmFtZTtkYSsrO3JldHVybiB4YX07Xy5lYWNoKGFhLGxhKTtjb25zdCBaPUZhPT57Y29uc3QgeGE9Yy5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYK0ZhLnNpZ25hdHVyZS5uYW1lO2xhKHtuYW1lOnhhLGlucHV0OltdLGRldmljZToiIixvcDoiIixhdHRyOltdfSk7aWYoRmEuc2lnbmF0dXJlLmlucHV0X2FyZyl7bGV0IHphPTA7dmFyIHlhPVVhPT57bGEoe25hbWU6eGErYy5OQU1FU1BBQ0VfREVMSU0rVWEubmFtZSxpbnB1dDpbXSxkZXZpY2U6IiIsb3A6ImlucHV0X2FyZyIsYXR0cjpbe2tleToiVCIsdmFsdWU6e3R5cGU6VWEudHlwZX19XX0pLmZ1bmN0aW9uSW5wdXRJbmRleD16YTt6YSsrfTtGYS5zaWduYXR1cmUuaW5wdXRfYXJnLm5hbWU/eWEoRmEuc2lnbmF0dXJlLmlucHV0X2FyZyk6Xy5lYWNoKEZhLnNpZ25hdHVyZS5pbnB1dF9hcmcseWEpfWxldCBCYT0wO2NvbnN0IEdhPXt9O0ZhLnNpZ25hdHVyZS5vdXRwdXRfYXJnJiYoeWE9emE9PntHYVt4YSsKYy5OQU1FU1BBQ0VfREVMSU0remEubmFtZV09QmE7QmErK30sRmEuc2lnbmF0dXJlLm91dHB1dF9hcmcubmFtZT95YShGYS5zaWduYXR1cmUub3V0cHV0X2FyZyk6Xy5lYWNoKEZhLnNpZ25hdHVyZS5vdXRwdXRfYXJnLHlhKSk7Xy5lYWNoKEZhLm5vZGVfZGVmLHphPT57emEubmFtZT14YSsiLyIremEubmFtZTsic3RyaW5nIj09PXR5cGVvZiB6YS5pbnB1dCYmKHphLmlucHV0PVt6YS5pbnB1dF0pO2NvbnN0IFVhPWxhKHphKTtfLmlzTnVtYmVyKEdhW3phLm5hbWVdKSYmKFVhLmZ1bmN0aW9uT3V0cHV0SW5kZXg9R2FbemEubmFtZV0pO18uZWFjaChVYS5pbnB1dHMsWmE9PntaYS5uYW1lPXhhK2MuTkFNRVNQQUNFX0RFTElNK1phLm5hbWV9KX0pfTtILmxpYnJhcnkmJkgubGlicmFyeS5mdW5jdGlvbiYmXy5lYWNoKEgubGlicmFyeS5mdW5jdGlvbixaKTtmYS5zcGxpY2UoZGEpO2NhLnNwbGljZShkYSk7cmV0dXJuIGZhfSxNKS50aGVuKGZhPT5hLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJCdWlsZGluZyB0aGUgZGF0YSBzdHJ1Y3R1cmUiLAo3MCwoKT0+e2xldCBkYT1yKGNhLG1hKSxsYT1uZXcgQztfLmVhY2goZmEsWj0+e2xldCBGYT1kYVtaLm5hbWVdfHxaLm5hbWU7bGEubm9kZXNbRmFdPVo7Wi5uYW1lIGluIFUmJihaLm91dEVtYmVkZGluZ3M9VVtaLm5hbWVdLF8uZWFjaChaLm91dEVtYmVkZGluZ3MseGE9Pnt4YS5uYW1lPWRhW3hhLm5hbWVdfHx4YS5uYW1lfSkpO1oubmFtZT1GYX0pO18uZWFjaChmYSxaPT57Xy5lYWNoKFouaW5wdXRzLChGYSx4YSk9PntsZXQgeWE9RmEubmFtZTtpZih5YSBpbiBMKXtGYT1MW3lhXTtaLmluRW1iZWRkaW5ncy5wdXNoKEZhKTtmb3IodmFyIEJhIG9mIEZhLmlucHV0cylrKGxhLGRhW0JhLm5hbWVdfHxCYS5uYW1lLFosQmEsSyx4YSl9ZWxzZSBpZih5YSBpbiBSKXtCYT1SW3lhXTtmb3IobGV0IEdhIG9mIEJhLmlucHV0cylrKGxhLGRhW0dhLm5hbWVdfHxHYS5uYW1lLFosRmEsSyx4YSl9ZWxzZSBrKGxhLGRhW3lhXXx8eWEsWixGYSxLLHhhKX0pfSk7Xy5lYWNoKEwsWj0+e1oubmFtZT0KZGFbWi5uYW1lXXx8Wi5uYW1lfSk7cmV0dXJuIGxhfSxNKSl9O2MuY3JlYXRlR3JhcGg9bjtjLmdldFN0cmljdE5hbWU9cTtjLmhhc1NpbWlsYXJEZWdyZWVTZXF1ZW5jZT1mdW5jdGlvbihILEspe0g9dChIKTtLPXQoSyk7Zm9yKGxldCBNPTA7TTxILmxlbmd0aDtNKyspaWYoSFtNXSE9PUtbTV0pcmV0dXJuITE7cmV0dXJuITB9O2MuZ2V0SGllcmFyY2hpY2FsUGF0aD12O2MuZ2V0SW5jbHVkZU5vZGVCdXR0b25TdHJpbmc9ZnVuY3Rpb24oSCl7cmV0dXJuIEg9PT1hLmdyYXBoLkluY2x1c2lvblR5cGUuRVhDTFVERT8iQWRkIHRvIG1haW4gZ3JhcGgiOiJSZW1vdmUgZnJvbSBtYWluIGdyYXBoIn07Yy5nZXRHcm91cFNlcmllc05vZGVCdXR0b25TdHJpbmc9ZnVuY3Rpb24oSCl7cmV0dXJuIEg9PT1hLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5HUk9VUD8iVW5ncm91cCB0aGlzIHNlcmllcyBvZiBub2RlcyI6Ikdyb3VwIHRoaXMgc2VyaWVzIG9mIG5vZGVzIn07Yy50b2dnbGVOb2RlU2VyaWVzR3JvdXA9CmZ1bmN0aW9uKEgsSyl7SFtLXT1LIGluIEgmJkhbS10hPT1hLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5HUk9VUD9hLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5HUk9VUDphLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5VTkdST1VQfX0pKGEuZ3JhcGh8fChhLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2hpZXJhcmNoeS5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXtmdW5jdGlvbiBmKHYseSx6LHgpe3k9ej92LmluRWRnZXMoeS5uYW1lKTp2Lm91dEVkZ2VzKHkubmFtZSk7Xy5lYWNoKHksQz0+e0M9di5lZGdlKEMpOyhDLm51bVJlZ3VsYXJFZGdlcz94LnJlZ3VsYXI6eC5jb250cm9sKS5wdXNoKEMpfSl9ZnVuY3Rpb24gZyh2LHkpe2NvbnN0IHo9e307Xy5lYWNoKHkubm9kZXMseD0+e2xldCBDPWMuZ2V0SGllcmFyY2hpY2FsUGF0aCh4Lm5hbWUpLEY9di5yb290O0YuZGVwdGg9TWF0aC5tYXgoQy5sZW5ndGgsRi5kZXB0aCk7elt4Lm9wXXx8KHpbeC5vcF09W10pO3pbeC5vcF0ucHVzaCh4KTtmb3IobGV0IEI9MDtCPEMubGVuZ3RoO0IrKyl7Ri5kZXB0aD1NYXRoLm1heChGLmRlcHRoLEMubGVuZ3RoLUIpO0YuY2FyZGluYWxpdHkrPXguY2FyZGluYWxpdHk7Ri5vcEhpc3RvZ3JhbVt4Lm9wXT0oRi5vcEhpc3RvZ3JhbVt4Lm9wXXx8MCkrMTtudWxsIT14LmRldmljZSYmKEYuZGV2aWNlSGlzdG9ncmFtW3guZGV2aWNlXT0KKEYuZGV2aWNlSGlzdG9ncmFtW3guZGV2aWNlXXx8MCkrMSk7bnVsbCE9eC54bGFDbHVzdGVyJiYoRi54bGFDbHVzdGVySGlzdG9ncmFtW3gueGxhQ2x1c3Rlcl09KEYueGxhQ2x1c3Rlckhpc3RvZ3JhbVt4LnhsYUNsdXN0ZXJdfHwwKSsxKTt4LmNvbXBhdGlibGU/Ri5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KEYuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOkYuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9KEYuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGV8fDApKzE7Xy5lYWNoKHguaW5FbWJlZGRpbmdzLE89PntPLmNvbXBhdGlibGU/Ri5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KEYuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOkYuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9KEYuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGV8fAowKSsxfSk7Xy5lYWNoKHgub3V0RW1iZWRkaW5ncyxPPT57Ty5jb21wYXRpYmxlP0YuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShGLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpGLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShGLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxfSk7aWYoQj09PUMubGVuZ3RoLTEpYnJlYWs7dmFyIEQ9Q1tCXTtsZXQgST12Lm5vZGUoRCk7SXx8KEk9Yy5jcmVhdGVNZXRhbm9kZShELHYuZ3JhcGhPcHRpb25zKSxJLnBhcmVudE5vZGU9Rix2LnNldE5vZGUoRCxJKSxGLm1ldGFncmFwaC5zZXROb2RlKEQsSSksMD09PUQuaW5kZXhPZihhLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgpJiZGLm5hbWU9PT1hLmdyYXBoLlJPT1RfTkFNRSYmKEQ9RC5zdWJzdHJpbmcoYS5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYLmxlbmd0aCkseltEXXx8Cih6W0RdPVtdKSx2LmxpYnJhcnlGdW5jdGlvbnNbRF09e25vZGU6SSx1c2FnZXM6eltEXX0sSS5hc3NvY2lhdGVkRnVuY3Rpb249RCkpO0Y9SX12LnNldE5vZGUoeC5uYW1lLHgpO3gucGFyZW50Tm9kZT1GO0YubWV0YWdyYXBoLnNldE5vZGUoeC5uYW1lLHgpO18uZWFjaCh4LmluRW1iZWRkaW5ncyxmdW5jdGlvbihCKXt2LnNldE5vZGUoQi5uYW1lLEIpO0IucGFyZW50Tm9kZT14fSk7Xy5lYWNoKHgub3V0RW1iZWRkaW5ncyxmdW5jdGlvbihCKXt2LnNldE5vZGUoQi5uYW1lLEIpO0IucGFyZW50Tm9kZT14fSl9KX1mdW5jdGlvbiBsKHYseSl7bGV0IHo9di5nZXROb2RlTWFwKCkseD1bXSxDPVtdLEY9KEQsQik9PntsZXQgST0wO2Zvcig7RDspQltJKytdPUQubmFtZSxEPUQucGFyZW50Tm9kZTtyZXR1cm4gSS0xfTtfLmVhY2goeS5lZGdlcyxEPT57dmFyIEI9Rih5Lm5vZGVzW0Qudl0seCksST1GKHkubm9kZXNbRC53XSxDKTtpZigtMSE9PUImJi0xIT09SSl7Zm9yKDt4W0JdPT09Q1tJXTspaWYoQi0tLApJLS0sMD5CfHwwPkkpdGhyb3cgRXJyb3IoIk5vIGRpZmZlcmVuY2UgZm91bmQgYmV0d2VlbiBhbmNlc3RvciBwYXRocy4iKTt2YXIgTz16W3hbQisxXV07Qj14W0JdO0k9Q1tJXTt2YXIgUD1PLm1ldGFncmFwaC5lZGdlKEIsSSk7UHx8KFA9Yy5jcmVhdGVNZXRhZWRnZShCLEkpLE8ubWV0YWdyYXBoLnNldEVkZ2UoQixJLFApKTtPLmhhc05vbkNvbnRyb2xFZGdlc3x8RC5pc0NvbnRyb2xEZXBlbmRlbmN5fHwoTy5oYXNOb25Db250cm9sRWRnZXM9ITApO1AuYWRkQmFzZUVkZ2UoRCx2KX19KX1mdW5jdGlvbiBrKHYseSx6LHgsQyxGKXtsZXQgRD12Lm1ldGFncmFwaDtfLmVhY2goRC5ub2RlcygpLEI9PntCPUQubm9kZShCKTtCLnR5cGU9PT1hLmdyYXBoLk5vZGVUeXBlLk1FVEEmJmsoQix5LHoseCxDLEYpfSk7dj1uKEQpO3Y9KEY/cTpwKSh2LEQseS5ncmFwaE9wdGlvbnMpO18uZWFjaCh2LGZ1bmN0aW9uKEIsSSl7bGV0IE89Qi5tZXRhZ3JhcGgubm9kZXMoKTtfLmVhY2goTyxQPT4Ke1A9RC5ub2RlKFApO1Aub3duaW5nU2VyaWVzfHwoUC5vd25pbmdTZXJpZXM9SSl9KTtPLmxlbmd0aDx4JiYhKEIubmFtZSBpbiBDKSYmKENbQi5uYW1lXT1hLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5VTkdST1VQKTtCLm5hbWUgaW4gQyYmQ1tCLm5hbWVdPT09YS5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuVU5HUk9VUHx8KHkuc2V0Tm9kZShJLEIpLEQuc2V0Tm9kZShJLEIpLF8uZWFjaChPLFA9PntsZXQgSD1ELm5vZGUoUCk7Qi5tZXRhZ3JhcGguc2V0Tm9kZShQLEgpO0IucGFyZW50Tm9kZT1ILnBhcmVudE5vZGU7Qi5jYXJkaW5hbGl0eSsrO251bGwhPUguZGV2aWNlJiYoQi5kZXZpY2VIaXN0b2dyYW1bSC5kZXZpY2VdPShCLmRldmljZUhpc3RvZ3JhbVtILmRldmljZV18fDApKzEpO251bGwhPUgueGxhQ2x1c3RlciYmKEIueGxhQ2x1c3Rlckhpc3RvZ3JhbVtILnhsYUNsdXN0ZXJdPShCLnhsYUNsdXN0ZXJIaXN0b2dyYW1bSC54bGFDbHVzdGVyXXx8MCkrMSk7SC5jb21wYXRpYmxlPwpCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0oQi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6Qi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0oQi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMTtfLmVhY2goSC5pbkVtYmVkZGluZ3MsSz0+e0suY29tcGF0aWJsZT9CLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0oQi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6Qi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0oQi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMX0pO18uZWFjaChILm91dEVtYmVkZGluZ3MsSz0+e0suY29tcGF0aWJsZT9CLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0oQi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6Qi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0KKEIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGV8fDApKzF9KTtILnBhcmVudE5vZGU9Qjt6W1BdPUk7RC5yZW1vdmVOb2RlKFApfSkpfSl9ZnVuY3Rpb24gbih2KXtyZXR1cm4gXy5yZWR1Y2Uodi5ub2RlcygpLCh5LHopPT57ej12Lm5vZGUoeik7aWYoei50eXBlPT09Yy5Ob2RlVHlwZS5NRVRBKXJldHVybiB5O2xldCB4PXoub3A7eCYmKHlbeF09eVt4XXx8W10seVt4XS5wdXNoKHoubmFtZSkpO3JldHVybiB5fSx7fSl9ZnVuY3Rpb24gcCh2LHkseil7bGV0IHg9e307Xy5lYWNoKHYsZnVuY3Rpb24oQyxGKXtpZighKDE+PUMubGVuZ3RoKSl7dmFyIEQ9e307Xy5lYWNoKEMsZnVuY3Rpb24oQil7dmFyIEk9IioiPT09Qi5jaGFyQXQoQi5sZW5ndGgtMSksTz1CLnNwbGl0KCIvIiksUD1PW08ubGVuZ3RoLTFdO089Ty5zbGljZSgwLE8ubGVuZ3RoLTEpLmpvaW4oIi8iKTt2YXIgSD1QLm1hdGNoKC9eKFxEKilfKFxkKykkLyk7bGV0IEs9IiI7SD8oUD1IWzFdLEg9SFsyXSk6CihQPUk/UC5zdWJzdHIoMCxQLmxlbmd0aC0xKTpQLEg9MCxLPUk/IioiOiIiKTtJPWMuZ2V0U2VyaWVzTm9kZU5hbWUoUCxLLE8pO0RbSV09RFtJXXx8W107Qj1jLmNyZWF0ZVNlcmllc05vZGUoUCxLLE8sK0gsQix6KTtEW0ldLnB1c2goQil9KTtfLmVhY2goRCxmdW5jdGlvbihCKXtpZighKDI+Qi5sZW5ndGgpKXtCLnNvcnQoZnVuY3Rpb24oTyxQKXtyZXR1cm4rTy5jbHVzdGVySWQtK1AuY2x1c3RlcklkfSk7dmFyIEk9W0JbMF1dO2ZvcihsZXQgTz0xO088Qi5sZW5ndGg7TysrKXtsZXQgUD1CW09dO1AuY2x1c3RlcklkPT09SVtJLmxlbmd0aC0xXS5jbHVzdGVySWQrMT9JLnB1c2goUCk6KHIoSSx4LCtGLHkseiksST1bUF0pfXIoSSx4LCtGLHkseil9fSl9fSk7cmV0dXJuIHh9ZnVuY3Rpb24gcSh2LHkseil7bGV0IHg9e307Xy5lYWNoKHYsZnVuY3Rpb24oQyxGKXtpZighKDE+PUMubGVuZ3RoKSl7dmFyIEQ9e30sQj17fTtfLmVhY2goQyxmdW5jdGlvbihPKXtsZXQgUD0iKiI9PT0KTy5jaGFyQXQoTy5sZW5ndGgtMSk7dmFyIEg9Ty5zcGxpdCgiLyIpO2xldCBLPUhbSC5sZW5ndGgtMV07SD1ILnNsaWNlKDAsSC5sZW5ndGgtMSkuam9pbigiLyIpO2NvbnN0IE09LyhcZCspL2c7dmFyIEw7bGV0IFIsVSxZLGJhPTA7Zm9yKDtMPU0uZXhlYyhLKTspKytiYSxSPUsuc2xpY2UoMCxMLmluZGV4KSxVPUxbMF0sTD1LLnNsaWNlKEwuaW5kZXgrTFswXS5sZW5ndGgpLFk9Yy5nZXRTZXJpZXNOb2RlTmFtZShSLEwsSCksRFtZXT1EW1ldLERbWV18fChEW1ldPWMuY3JlYXRlU2VyaWVzTm9kZShSLEwsSCwrVSxPLHopKSxEW1ldLmlkcy5wdXNoKFUpLEJbT109QltPXXx8W10sQltPXS5wdXNoKFtZLFVdKTsxPmJhJiYoUj1QP0suc3Vic3RyKDAsSy5sZW5ndGgtMSk6SyxVPTAsTD1QPyIqIjoiIixZPWMuZ2V0U2VyaWVzTm9kZU5hbWUoUixMLEgpLERbWV09RFtZXSxEW1ldfHwoRFtZXT1jLmNyZWF0ZVNlcmllc05vZGUoUixMLEgsK1UsTyx6KSksRFtZXS5pZHMucHVzaChVKSxCW09dPQpCW09dfHxbXSxCW09dLnB1c2goW1ksVV0pKX0pO3ZhciBJPXt9O18uZWFjaChCLGZ1bmN0aW9uKE8sUCl7Ty5zb3J0KGZ1bmN0aW9uKE0sTCl7cmV0dXJuIERbTFswXV0uaWRzLmxlbmd0aC1EW01bMF1dLmlkcy5sZW5ndGh9KTt2YXIgSD1PWzBdWzBdO089T1swXVsxXTtJW0hdPUlbSF18fFtdO2NvbnN0IEs9UC5zcGxpdCgiLyIpO1A9Yy5jcmVhdGVTZXJpZXNOb2RlKERbSF0ucHJlZml4LERbSF0uc3VmZml4LEsuc2xpY2UoMCxLLmxlbmd0aC0xKS5qb2luKCIvIiksK08sUCx6KTtJW0hdLnB1c2goUCl9KTtfLmVhY2goSSxmdW5jdGlvbihPKXtpZighKDI+Ty5sZW5ndGgpKXtPLnNvcnQoZnVuY3Rpb24oSCxLKXtyZXR1cm4rSC5jbHVzdGVySWQtK0suY2x1c3RlcklkfSk7dmFyIFA9W09bMF1dO2ZvcihsZXQgSD0xO0g8Ty5sZW5ndGg7SCsrKXtsZXQgSz1PW0hdO0suY2x1c3RlcklkPT09UFtQLmxlbmd0aC0xXS5jbHVzdGVySWQrMT9QLnB1c2goSyk6KHIoUCx4LCtGLHkseiksUD0KW0tdKX1yKFAseCwrRix5LHopfX0pfX0pO3JldHVybiB4fWZ1bmN0aW9uIHIodix5LHoseCxDKXtpZigxPHYubGVuZ3RoKXtsZXQgRj1jLmdldFNlcmllc05vZGVOYW1lKHZbMF0ucHJlZml4LHZbMF0uc3VmZml4LHZbMF0ucGFyZW50LHZbMF0uY2x1c3RlcklkLHZbdi5sZW5ndGgtMV0uY2x1c3RlcklkKSxEPWMuY3JlYXRlU2VyaWVzTm9kZSh2WzBdLnByZWZpeCx2WzBdLnN1ZmZpeCx2WzBdLnBhcmVudCx6LEYsQyk7Xy5lYWNoKHYsZnVuY3Rpb24oQil7RC5pZHMucHVzaChCLmNsdXN0ZXJJZCk7RC5tZXRhZ3JhcGguc2V0Tm9kZShCLm5hbWUseC5ub2RlKEIubmFtZSkpfSk7eVtGXT1EfX1jbGFzcyB0e2NvbnN0cnVjdG9yKHYpe3RoaXMuaGFzU2hhcGVJbmZvPSExO3RoaXMubWF4TWV0YUVkZ2VTaXplPTE7dGhpcy5ncmFwaE9wdGlvbnM9dnx8e307dGhpcy5ncmFwaE9wdGlvbnMuY29tcG91bmQ9ITA7dGhpcy5yb290PWMuY3JlYXRlTWV0YW5vZGUoYy5ST09UX05BTUUsdGhpcy5ncmFwaE9wdGlvbnMpOwp0aGlzLmxpYnJhcnlGdW5jdGlvbnM9e307dGhpcy54bGFDbHVzdGVycz10aGlzLmRldmljZXM9dGhpcy50ZW1wbGF0ZXM9bnVsbDt0aGlzLmluZGV4PXt9O3RoaXMuaW5kZXhbYy5ST09UX05BTUVdPXRoaXMucm9vdDt0aGlzLm9yZGVyaW5ncz17fX1nZXROb2RlTWFwKCl7cmV0dXJuIHRoaXMuaW5kZXh9bm9kZSh2KXtyZXR1cm4gdGhpcy5pbmRleFt2XX1zZXROb2RlKHYseSl7dGhpcy5pbmRleFt2XT15fWdldEJyaWRnZWdyYXBoKHYpe3ZhciB5PXRoaXMuaW5kZXhbdl07aWYoIXkpdGhyb3cgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIG5vZGUgaW4gaGllcmFyY2h5OiAiK3YpO2lmKCEoIm1ldGFncmFwaCJpbiB5KSlyZXR1cm4gbnVsbDtpZih5LmJyaWRnZWdyYXBoKXJldHVybiB5LmJyaWRnZWdyYXBoO2xldCB6PXkuYnJpZGdlZ3JhcGg9Yy5jcmVhdGVHcmFwaCgiQlJJREdFR1JBUEgiLGMuR3JhcGhUeXBlLkJSSURHRSx0aGlzLmdyYXBoT3B0aW9ucyk7aWYoISh5LnBhcmVudE5vZGUmJgoibWV0YWdyYXBoImluIHkucGFyZW50Tm9kZSkpcmV0dXJuIHo7dmFyIHg9eS5wYXJlbnROb2RlO3k9eC5tZXRhZ3JhcGg7eD10aGlzLmdldEJyaWRnZWdyYXBoKHgubmFtZSk7Xy5lYWNoKFt5LHhdLEM9PntDLmVkZ2VzKCkuZmlsdGVyKEY9PkYudj09PXZ8fEYudz09PXYpLmZvckVhY2goRj0+e2xldCBEPUYudz09PXYsQj1DLmVkZ2UoRik7Xy5lYWNoKEIuYmFzZUVkZ2VMaXN0LEk9PntsZXQgW08sUF09RD9bSS53LEYudl06W0kudixGLnddO3ZhciBIPXRoaXMuZ2V0Q2hpbGROYW1lKHYsTyk7SD17djpEP1A6SCx3OkQ/SDpQfTtsZXQgSz16LmVkZ2UoSCk7S3x8KEs9Yy5jcmVhdGVNZXRhZWRnZShILnYsSC53KSxLLmluYm91bmQ9RCx6LnNldEVkZ2UoSC52LEgudyxLKSk7Sy5hZGRCYXNlRWRnZShJLHRoaXMpfSl9KX0pO3JldHVybiB6fWdldENoaWxkTmFtZSh2LHkpe2xldCB6PXRoaXMuaW5kZXhbeV07Zm9yKDt6Oyl7aWYoei5wYXJlbnROb2RlJiZ6LnBhcmVudE5vZGUubmFtZT09PQp2KXJldHVybiB6Lm5hbWU7ej16LnBhcmVudE5vZGV9dGhyb3cgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIGltbWVkaWF0ZSBjaGlsZCBmb3IgZGVzY2VuZGFudDogIit5KTt9Z2V0UHJlZGVjZXNzb3JzKHYpe2xldCB5PXRoaXMuaW5kZXhbdl07aWYoIXkpdGhyb3cgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIG5vZGUgd2l0aCBuYW1lOiAiK3YpO2xldCB6PXRoaXMuZ2V0T25lV2F5RWRnZXMoeSwhMCk7eS5pc0dyb3VwTm9kZXx8Xy5lYWNoKHkuaW5FbWJlZGRpbmdzLHg9PntfLmVhY2goeS5pbnB1dHMsQz0+e2lmKEMubmFtZT09PXgubmFtZSl7bGV0IEY9bmV3IGMuTWV0YWVkZ2VJbXBsKHgubmFtZSx2KTtGLmFkZEJhc2VFZGdlKHtpc0NvbnRyb2xEZXBlbmRlbmN5OkMuaXNDb250cm9sRGVwZW5kZW5jeSxvdXRwdXRUZW5zb3JLZXk6Qy5vdXRwdXRUZW5zb3JLZXksaXNSZWZlcmVuY2VFZGdlOiExLHY6eC5uYW1lLHc6dn0sdGhpcyk7ei5yZWd1bGFyLnB1c2goRil9fSl9KTtyZXR1cm4gen1nZXRTdWNjZXNzb3JzKHYpe2xldCB5PQp0aGlzLmluZGV4W3ZdO2lmKCF5KXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBub2RlIHdpdGggbmFtZTogIit2KTtsZXQgej10aGlzLmdldE9uZVdheUVkZ2VzKHksITEpO3kuaXNHcm91cE5vZGV8fF8uZWFjaCh5Lm91dEVtYmVkZGluZ3MseD0+e18uZWFjaCh4LmlucHV0cyxDPT57aWYoQy5uYW1lPT09dil7bGV0IEY9bmV3IGMuTWV0YWVkZ2VJbXBsKHYseC5uYW1lKTtGLmFkZEJhc2VFZGdlKHtpc0NvbnRyb2xEZXBlbmRlbmN5OkMuaXNDb250cm9sRGVwZW5kZW5jeSxvdXRwdXRUZW5zb3JLZXk6Qy5vdXRwdXRUZW5zb3JLZXksaXNSZWZlcmVuY2VFZGdlOiExLHYsdzp4Lm5hbWV9LHRoaXMpO3oucmVndWxhci5wdXNoKEYpfX0pfSk7cmV0dXJuIHp9Z2V0T25lV2F5RWRnZXModix5KXtsZXQgej17Y29udHJvbDpbXSxyZWd1bGFyOltdfTtpZighdi5wYXJlbnROb2RlfHwhdi5wYXJlbnROb2RlLmlzR3JvdXBOb2RlKXJldHVybiB6O3ZhciB4PXYucGFyZW50Tm9kZTtsZXQgQz0KeC5tZXRhZ3JhcGg7eD10aGlzLmdldEJyaWRnZWdyYXBoKHgubmFtZSk7ZihDLHYseSx6KTtmKHgsdix5LHopO3JldHVybiB6fWdldFRvcG9sb2dpY2FsT3JkZXJpbmcodil7dmFyIHk9dGhpcy5pbmRleFt2XTtpZigheSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSB3aXRoIG5hbWU6ICIrdik7aWYoIXkuaXNHcm91cE5vZGUpcmV0dXJuIG51bGw7aWYodiBpbiB0aGlzLm9yZGVyaW5ncylyZXR1cm4gdGhpcy5vcmRlcmluZ3Nbdl07bGV0IHo9e30seD17fSxDPXkubWV0YWdyYXBoO18uZWFjaChDLmVkZ2VzKCksRD0+e0MuZWRnZShEKS5udW1SZWd1bGFyRWRnZXMmJihELnYgaW4genx8KHpbRC52XT1bXSkseltELnZdLnB1c2goRC53KSx4W0Qud109ITApfSk7bGV0IEY9Xy5kaWZmZXJlbmNlKF8ua2V5cyh6KSxfLmtleXMoeCkpO3Y9dGhpcy5vcmRlcmluZ3Nbdl09e307Zm9yKHk9MDtGLmxlbmd0aDspe2xldCBEPUYuc2hpZnQoKTt2W0RdPXkrKztfLmVhY2goeltEXSxCPT4KRi5wdXNoKEIpKTtkZWxldGUgeltEXX1yZXR1cm4gdn1nZXRUZW1wbGF0ZUluZGV4KCl7bGV0IHY9ZDMua2V5cyh0aGlzLnRlbXBsYXRlcykseT1kMy5zY2FsZU9yZGluYWwoKS5kb21haW4odikucmFuZ2UoZDMucmFuZ2UoMCx2Lmxlbmd0aCkpO3JldHVybiB6PT55KHopfX1kLkRlZmF1bHRIaWVyYXJjaHlQYXJhbXM9e3ZlcmlmeVRlbXBsYXRlOiEwLHNlcmllc05vZGVNaW5TaXplOjUsc2VyaWVzTWFwOnt9LHJhbmtEaXJlY3Rpb246IkJUIix1c2VHZW5lcmFsaXplZFNlcmllc1BhdHRlcm5zOiExfTtkLmJ1aWxkPWZ1bmN0aW9uKHYseSx6KXtsZXQgeD1uZXcgdCh7cmFua2Rpcjp5LnJhbmtEaXJlY3Rpb259KSxDPXt9O3JldHVybiBhLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJBZGRpbmcgbm9kZXMiLDIwLCgpPT57bGV0IEY9e30sRD17fTtfLmVhY2godi5ub2RlcyxCPT57Qi5kZXZpY2UmJihGW0IuZGV2aWNlXT0hMCk7Qi54bGFDbHVzdGVyJiYoRFtCLnhsYUNsdXN0ZXJdPSEwKX0pOwp4LmRldmljZXM9Xy5rZXlzKEYpO3gueGxhQ2x1c3RlcnM9Xy5rZXlzKEQpO2coeCx2KX0seikudGhlbigoKT0+YS5ncmFwaC51dGlsLnJ1bkFzeW5jVGFzaygiRGV0ZWN0IHNlcmllcyIsMjAsKCk9PnswPHkuc2VyaWVzTm9kZU1pblNpemUmJmsoeC5yb290LHgsQyx5LnNlcmllc05vZGVNaW5TaXplLHkuc2VyaWVzTWFwLHkudXNlR2VuZXJhbGl6ZWRTZXJpZXNQYXR0ZXJucyl9LHopKS50aGVuKCgpPT5hLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJBZGRpbmcgZWRnZXMiLDMwLCgpPT57bCh4LHYsQyl9LHopKS50aGVuKCgpPT5hLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJGaW5kaW5nIHNpbWlsYXIgc3ViZ3JhcGhzIiwzMCwoKT0+e3gudGVtcGxhdGVzPWMudGVtcGxhdGUuZGV0ZWN0KHgseS52ZXJpZnlUZW1wbGF0ZSl9LHopKS50aGVuKCgpPT54KX07ZC5qb2luQW5kQWdncmVnYXRlU3RhdHM9ZnVuY3Rpb24odil7bGV0IHk9e30sej17fTtfLmVhY2godi5yb290LmxlYXZlcygpLAp4PT57eD12Lm5vZGUoeCk7bnVsbCE9eC5kZXZpY2UmJih5W3guZGV2aWNlXT0hMCk7bnVsbCE9eC54bGFDbHVzdGVyJiYoelt4LnhsYUNsdXN0ZXJdPSEwKX0pO3YuZGV2aWNlcz1fLmtleXMoeSk7di54bGFDbHVzdGVycz1fLmtleXMoeik7Xy5lYWNoKHYuZ2V0Tm9kZU1hcCgpLHg9Pnt4LmlzR3JvdXBOb2RlJiYoeC5zdGF0cz1uZXcgYy5Ob2RlU3RhdHMobnVsbCkseC5kZXZpY2VIaXN0b2dyYW09e30pfSk7Xy5lYWNoKHYucm9vdC5sZWF2ZXMoKSx4PT57bGV0IEM9eD12Lm5vZGUoeCk7Zm9yKDtudWxsIT1DLnBhcmVudE5vZGU7KXtpZihudWxsIT14LmRldmljZSl7dmFyIEY9Qy5wYXJlbnROb2RlLmRldmljZUhpc3RvZ3JhbTtGW3guZGV2aWNlXT0oRlt4LmRldmljZV18fDApKzF9bnVsbCE9eC54bGFDbHVzdGVyJiYoRj1DLnBhcmVudE5vZGUueGxhQ2x1c3Rlckhpc3RvZ3JhbSxGW3gueGxhQ2x1c3Rlcl09KEZbeC54bGFDbHVzdGVyXXx8MCkrMSk7bnVsbCE9eC5zdGF0cyYmQy5wYXJlbnROb2RlLnN0YXRzLmNvbWJpbmUoeC5zdGF0cyk7CkM9Qy5wYXJlbnROb2RlfX0pfTtkLmdldEluY29tcGF0aWJsZU9wcz1mdW5jdGlvbih2LHkpe2xldCB6PVtdLHg9e307Xy5lYWNoKHYucm9vdC5sZWF2ZXMoKSxDPT57Qz12Lm5vZGUoQyk7aWYoQy50eXBlPT1jLk5vZGVUeXBlLk9QKXtpZighQy5jb21wYXRpYmxlKWlmKEMub3duaW5nU2VyaWVzKWlmKHkmJnkuc2VyaWVzTWFwW0Mub3duaW5nU2VyaWVzXT09PWEuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLlVOR1JPVVApei5wdXNoKEMpO2Vsc2V7aWYoIXhbQy5vd25pbmdTZXJpZXNdKXtsZXQgRj12Lm5vZGUoQy5vd25pbmdTZXJpZXMpO0YmJih4W0Mub3duaW5nU2VyaWVzXT1GLHoucHVzaChGKSl9fWVsc2Ugei5wdXNoKEMpO18uZWFjaChDLmluRW1iZWRkaW5ncyxGPT57Ri5jb21wYXRpYmxlfHx6LnB1c2goRil9KTtfLmVhY2goQy5vdXRFbWJlZGRpbmdzLEY9PntGLmNvbXBhdGlibGV8fHoucHVzaChGKX0pfX0pO3JldHVybiB6fX0pKGMuaGllcmFyY2h5fHwoYy5oaWVyYXJjaHk9Cnt9KSl9KShhLmdyYXBofHwoYS5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9sYXlvdXQuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7ZnVuY3Rpb24gZih4KXt4Lm5vZGUuaXNHcm91cE5vZGUmJmwoeCk7eC5ub2RlLnR5cGU9PT1jLk5vZGVUeXBlLk1FVEE/bih4KTp4Lm5vZGUudHlwZT09PWMuTm9kZVR5cGUuU0VSSUVTJiZwKHgpfWZ1bmN0aW9uIGcoeCl7eC5pbmJveFdpZHRoPTA8eC5pbkFubm90YXRpb25zLmxpc3QubGVuZ3RoP2QuUEFSQU1TLmFubm90YXRpb25zLmluYm94V2lkdGg6MDt4Lm91dGJveFdpZHRoPTA8eC5vdXRBbm5vdGF0aW9ucy5saXN0Lmxlbmd0aD9kLlBBUkFNUy5hbm5vdGF0aW9ucy5vdXRib3hXaWR0aDowO3guY29yZUJveC53aWR0aD14LndpZHRoO3guY29yZUJveC5oZWlnaHQ9eC5oZWlnaHQ7eC53aWR0aD1NYXRoLm1heCh4LmNvcmVCb3gud2lkdGgreC5pbmJveFdpZHRoK3gub3V0Ym94V2lkdGgsMyp4LmRpc3BsYXlOYW1lLmxlbmd0aCl9ZnVuY3Rpb24gbCh4KXtsZXQgQz14LmNvcmVHcmFwaC5ub2RlcygpLm1hcChGPT4KeC5jb3JlR3JhcGgubm9kZShGKSkuY29uY2F0KHguaXNvbGF0ZWRJbkV4dHJhY3QseC5pc29sYXRlZE91dEV4dHJhY3QseC5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdCk7Xy5lYWNoKEMsRj0+e3N3aXRjaChGLm5vZGUudHlwZSl7Y2FzZSBjLk5vZGVUeXBlLk9QOl8uZXh0ZW5kKEYsZC5QQVJBTVMubm9kZVNpemUub3ApO2JyZWFrO2Nhc2UgYy5Ob2RlVHlwZS5CUklER0U6Xy5leHRlbmQoRixkLlBBUkFNUy5ub2RlU2l6ZS5icmlkZ2UpO2JyZWFrO2Nhc2UgYy5Ob2RlVHlwZS5NRVRBOkYuZXhwYW5kZWQ/ZihGKTooXy5leHRlbmQoRixkLlBBUkFNUy5ub2RlU2l6ZS5tZXRhKSxGLmhlaWdodD1kLlBBUkFNUy5ub2RlU2l6ZS5tZXRhLmhlaWdodChGLm5vZGUuY2FyZGluYWxpdHkpKTticmVhaztjYXNlIGMuTm9kZVR5cGUuU0VSSUVTOkYuZXhwYW5kZWQ/KF8uZXh0ZW5kKEYsZC5QQVJBTVMubm9kZVNpemUuc2VyaWVzLmV4cGFuZGVkKSxmKEYpKTpfLmV4dGVuZChGLEYubm9kZS5oYXNOb25Db250cm9sRWRnZXM/CmQuUEFSQU1TLm5vZGVTaXplLnNlcmllcy52ZXJ0aWNhbDpkLlBBUkFNUy5ub2RlU2l6ZS5zZXJpZXMuaG9yaXpvbnRhbCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIG5vZGUgdHlwZTogIitGLm5vZGUudHlwZSk7fUYuZXhwYW5kZWR8fGcoRik7cShGKX0pfWZ1bmN0aW9uIGsoeCxDKXtfLmV4dGVuZCh4LmdyYXBoKCkse25vZGVzZXA6Qy5ub2RlU2VwLHJhbmtzZXA6Qy5yYW5rU2VwLGVkZ2VzZXA6Qy5lZGdlU2VwfSk7bGV0IEY9W10sRD1bXTtfLmVhY2goeC5ub2RlcygpLEg9Pnt4Lm5vZGUoSCkubm9kZS50eXBlPT09Yy5Ob2RlVHlwZS5CUklER0U/Ri5wdXNoKEgpOkQucHVzaChIKX0pO2lmKCFELmxlbmd0aClyZXR1cm57d2lkdGg6MCxoZWlnaHQ6MH07ZGFncmUubGF5b3V0KHgpO2xldCBCPUluZmluaXR5LEk9SW5maW5pdHksTz0tSW5maW5pdHksUD0tSW5maW5pdHk7Xy5lYWNoKEQsSD0+e0g9eC5ub2RlKEgpO3ZhciBLPS41Kkgud2lkdGgsTT1ILngtCks7Sz1ILngrSztCPU08Qj9NOkI7Tz1LPk8/SzpPO0s9LjUqSC5oZWlnaHQ7TT1ILnktSztIPUgueStLO0k9TTxJP006STtQPUg+UD9IOlB9KTtfLmVhY2goeC5lZGdlcygpLEg9PntIPXguZWRnZShIKTtpZighSC5zdHJ1Y3R1cmFsKXt2YXIgSz14Lm5vZGUoSC5tZXRhZWRnZS52KSxNPXgubm9kZShILm1ldGFlZGdlLncpO2lmKDM9PT1ILnBvaW50cy5sZW5ndGgmJnkoSC5wb2ludHMpKXtpZihudWxsIT1LKXt2YXIgTD1LLmV4cGFuZGVkP0sueDp0KEspO0gucG9pbnRzWzBdLng9TH1udWxsIT1NJiYoTD1NLmV4cGFuZGVkP00ueDp0KE0pLEgucG9pbnRzWzJdLng9TCk7SC5wb2ludHM9W0gucG9pbnRzWzBdLEgucG9pbnRzWzFdXX1MPUgucG9pbnRzW0gucG9pbnRzLmxlbmd0aC0yXTtudWxsIT1NJiYoSC5wb2ludHNbSC5wb2ludHMubGVuZ3RoLTFdPXooTCxNKSk7TT1ILnBvaW50c1sxXTtudWxsIT1LJiYoSC5wb2ludHNbMF09eihNLEspKTtfLmVhY2goSC5wb2ludHMsUj0+e0I9Ui54PApCP1IueDpCO089Ui54Pk8/Ui54Ok87ST1SLnk8ST9SLnk6STtQPVIueT5QP1IueTpQfSl9fSk7Xy5lYWNoKHgubm9kZXMoKSxIPT57SD14Lm5vZGUoSCk7SC54LT1CO0gueS09SX0pO18uZWFjaCh4LmVkZ2VzKCksSD0+e18uZWFjaCh4LmVkZ2UoSCkucG9pbnRzLEs9PntLLngtPUI7Sy55LT1JfSl9KTtyZXR1cm57d2lkdGg6Ty1CLGhlaWdodDpQLUl9fWZ1bmN0aW9uIG4oeCl7bGV0IEM9ZC5QQVJBTVMuc3Vic2NlbmUubWV0YTtfLmV4dGVuZCh4LEMpO18uZXh0ZW5kKHguY29yZUJveCxrKHguY29yZUdyYXBoLGQuUEFSQU1TLmdyYXBoLm1ldGEpKTt2YXIgRj14Lmlzb2xhdGVkSW5FeHRyYWN0Lmxlbmd0aD9fLm1heCh4Lmlzb2xhdGVkSW5FeHRyYWN0LEI9PkIud2lkdGgpLndpZHRoOm51bGw7eC5pbkV4dHJhY3RCb3gud2lkdGg9bnVsbCE9Rj9GOjA7eC5pbkV4dHJhY3RCb3guaGVpZ2h0PV8ucmVkdWNlKHguaXNvbGF0ZWRJbkV4dHJhY3QsKEIsSSxPKT0+e089MDxPP0MuZXh0cmFjdFlPZmZzZXQ6CjA7SS54PTA7SS55PUIrTytJLmhlaWdodC8yO3JldHVybiBCK08rSS5oZWlnaHR9LDApO0Y9eC5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoP18ubWF4KHguaXNvbGF0ZWRPdXRFeHRyYWN0LEI9PkIud2lkdGgpLndpZHRoOm51bGw7eC5vdXRFeHRyYWN0Qm94LndpZHRoPW51bGwhPUY/RjowO3gub3V0RXh0cmFjdEJveC5oZWlnaHQ9Xy5yZWR1Y2UoeC5pc29sYXRlZE91dEV4dHJhY3QsKEIsSSxPKT0+e089MDxPP0MuZXh0cmFjdFlPZmZzZXQ6MDtJLng9MDtJLnk9QitPK0kuaGVpZ2h0LzI7cmV0dXJuIEIrTytJLmhlaWdodH0sMCk7Rj14LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0Lmxlbmd0aD9fLm1heCh4LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LEI9PkIud2lkdGgpLndpZHRoOm51bGw7eC5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoPW51bGwhPUY/RjowO3gubGlicmFyeUZ1bmN0aW9uc0JveC5oZWlnaHQ9Xy5yZWR1Y2UoeC5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdCwoQixJLApPKT0+e089MDxPP0MuZXh0cmFjdFlPZmZzZXQ6MDtJLng9MDtJLnk9QitPK0kuaGVpZ2h0LzI7cmV0dXJuIEIrTytJLmhlaWdodH0sMCk7Rj0wOzA8eC5pc29sYXRlZEluRXh0cmFjdC5sZW5ndGgmJkYrKzswPHguaXNvbGF0ZWRPdXRFeHRyYWN0Lmxlbmd0aCYmRisrOzA8eC5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGgmJkYrKzswPHguY29yZUdyYXBoLm5vZGVDb3VudCgpJiZGKys7bGV0IEQ9ZC5QQVJBTVMuc3Vic2NlbmUubWV0YS5leHRyYWN0WE9mZnNldDtGPTE+PUY/MDpGKkQ7eC5jb3JlQm94LndpZHRoKz1NYXRoLm1heChkLk1JTl9BVVhfV0lEVEgseC5pbkV4dHJhY3RCb3gud2lkdGgreC5vdXRFeHRyYWN0Qm94LndpZHRoKStGK3gubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aCtGO3guY29yZUJveC5oZWlnaHQ9Qy5sYWJlbEhlaWdodCtNYXRoLm1heCh4LmluRXh0cmFjdEJveC5oZWlnaHQseC5jb3JlQm94LmhlaWdodCx4LmxpYnJhcnlGdW5jdGlvbnNCb3guaGVpZ2h0LAp4Lm91dEV4dHJhY3RCb3guaGVpZ2h0KTt4LndpZHRoPXguY29yZUJveC53aWR0aCtDLnBhZGRpbmdMZWZ0K0MucGFkZGluZ1JpZ2h0O3guaGVpZ2h0PXgucGFkZGluZ1RvcCt4LmNvcmVCb3guaGVpZ2h0K3gucGFkZGluZ0JvdHRvbX1mdW5jdGlvbiBwKHgpe2xldCBDPXguY29yZUdyYXBoLEY9ZC5QQVJBTVMuc3Vic2NlbmUuc2VyaWVzO18uZXh0ZW5kKHgsRik7Xy5leHRlbmQoeC5jb3JlQm94LGsoeC5jb3JlR3JhcGgsZC5QQVJBTVMuZ3JhcGguc2VyaWVzKSk7Xy5lYWNoKEMubm9kZXMoKSxEPT57Qy5ub2RlKEQpLmV4Y2x1ZGVkPSExfSk7eC53aWR0aD14LmNvcmVCb3gud2lkdGgrRi5wYWRkaW5nTGVmdCtGLnBhZGRpbmdSaWdodDt4LmhlaWdodD14LmNvcmVCb3guaGVpZ2h0K0YucGFkZGluZ1RvcCtGLnBhZGRpbmdCb3R0b219ZnVuY3Rpb24gcSh4KXtpZigheC5leHBhbmRlZCl7dmFyIEM9eC5pbkFubm90YXRpb25zLmxpc3QsRj14Lm91dEFubm90YXRpb25zLmxpc3Q7Xy5lYWNoKEMsCks9PnIoSykpO18uZWFjaChGLEs9PnIoSykpO3ZhciBEPWQuUEFSQU1TLmFubm90YXRpb25zLEI9Xy5yZWR1Y2UoQywoSyxNLEwpPT57TD0wPEw/RC55T2Zmc2V0OjA7TS5keD0tKHguY29yZUJveC53aWR0aCtNLndpZHRoKS8yLUQueE9mZnNldDtNLmR5PUsrTCtNLmhlaWdodC8yO3JldHVybiBLK0wrTS5oZWlnaHR9LDApO18uZWFjaChDLEs9PntLLmR5LT1CLzI7Sy5sYWJlbE9mZnNldD1ELmxhYmVsT2Zmc2V0fSk7dmFyIEk9Xy5yZWR1Y2UoRiwoSyxNLEwpPT57TD0wPEw/RC55T2Zmc2V0OjA7TS5keD0oeC5jb3JlQm94LndpZHRoK00ud2lkdGgpLzIrRC54T2Zmc2V0O00uZHk9SytMK00uaGVpZ2h0LzI7cmV0dXJuIEsrTCtNLmhlaWdodH0sMCk7Xy5lYWNoKEYsSz0+e0suZHktPUkvMjtLLmxhYmVsT2Zmc2V0PUQubGFiZWxPZmZzZXR9KTt2YXIgTz1NYXRoLm1pbih4LmhlaWdodC8yLXgucmFkaXVzLEIvMik7Tz0wPk8/MDpPO3ZhciBQPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLApDLmxlbmd0aC0xXSkucmFuZ2UoWy1PLE9dKTtfLmVhY2goQywoSyxNKT0+e0sucG9pbnRzPVt7ZHg6Sy5keCtLLndpZHRoLzIsZHk6Sy5keX0se2R4Oi14LmNvcmVCb3gud2lkdGgvMixkeToxPEMubGVuZ3RoP1AoTSk6MH1dfSk7Tz1NYXRoLm1pbih4LmhlaWdodC8yLXgucmFkaXVzLEkvMik7Tz0wPk8/MDpPO3ZhciBIPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLEYubGVuZ3RoLTFdKS5yYW5nZShbLU8sT10pO18uZWFjaChGLChLLE0pPT57Sy5wb2ludHM9W3tkeDp4LmNvcmVCb3gud2lkdGgvMixkeToxPEYubGVuZ3RoP0goTSk6MH0se2R4OksuZHgtSy53aWR0aC8yLGR5OksuZHl9XX0pO3guaGVpZ2h0PU1hdGgubWF4KHguaGVpZ2h0LEIsSSl9fWZ1bmN0aW9uIHIoeCl7c3dpdGNoKHguYW5ub3RhdGlvblR5cGUpe2Nhc2UgYy5yZW5kZXIuQW5ub3RhdGlvblR5cGUuQ09OU1RBTlQ6Xy5leHRlbmQoeCxkLlBBUkFNUy5jb25zdGFudC5zaXplKTticmVhaztjYXNlIGMucmVuZGVyLkFubm90YXRpb25UeXBlLlNIT1JUQ1VUOmlmKHgubm9kZS50eXBlPT09CmMuTm9kZVR5cGUuT1ApXy5leHRlbmQoeCxkLlBBUkFNUy5zaG9ydGN1dFNpemUub3ApO2Vsc2UgaWYoeC5ub2RlLnR5cGU9PT1jLk5vZGVUeXBlLk1FVEEpXy5leHRlbmQoeCxkLlBBUkFNUy5zaG9ydGN1dFNpemUubWV0YSk7ZWxzZSBpZih4Lm5vZGUudHlwZT09PWMuTm9kZVR5cGUuU0VSSUVTKV8uZXh0ZW5kKHgsZC5QQVJBTVMuc2hvcnRjdXRTaXplLnNlcmllcyk7ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBub2RlIHR5cGU6ICIreC5ub2RlLnR5cGUpO2JyZWFrO2Nhc2UgYy5yZW5kZXIuQW5ub3RhdGlvblR5cGUuU1VNTUFSWTpfLmV4dGVuZCh4LGQuUEFSQU1TLmNvbnN0YW50LnNpemUpfX1mdW5jdGlvbiB0KHgpe3JldHVybiB4LmV4cGFuZGVkP3gueDp4LngteC53aWR0aC8yKyh4LmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGg/eC5pbmJveFdpZHRoOjApK3guY29yZUJveC53aWR0aC8yfWZ1bmN0aW9uIHYoeCxDKXtyZXR1cm4gMTgwKk1hdGguYXRhbigoQy55LXgueSkvKEMueC0KeC54KSkvTWF0aC5QSX1mdW5jdGlvbiB5KHgpe2xldCBDPXYoeFswXSx4WzFdKTtmb3IobGV0IEY9MTtGPHgubGVuZ3RoLTE7RisrKXtsZXQgRD12KHhbRl0seFtGKzFdKTtpZigxPE1hdGguYWJzKEQtQykpcmV0dXJuITE7Qz1EfXJldHVybiEwfWZ1bmN0aW9uIHooeCxDKXtsZXQgRj1DLmV4cGFuZGVkP0MueDp0KEMpLEQ9Qy55O3ZhciBCPXgueC1GO3g9eC55LUQ7bGV0IEk9Qy5leHBhbmRlZD9DLndpZHRoOkMuY29yZUJveC53aWR0aCxPPUMuZXhwYW5kZWQ/Qy5oZWlnaHQ6Qy5jb3JlQm94LmhlaWdodDtNYXRoLmFicyh4KSpJLzI+TWF0aC5hYnMoQikqTy8yPygwPngmJihPPS1PKSxDPTA9PT14PzA6Ty8yKkIveCxCPU8vMik6KDA+QiYmKEk9LUkpLEM9SS8yLEI9MD09PUI/MDpJLzIqeC9CKTtyZXR1cm57eDpGK0MseTpEK0J9fWQuUEFSQU1TPXthbmltYXRpb246e2R1cmF0aW9uOjI1MH0sZ3JhcGg6e21ldGE6e25vZGVTZXA6NSxyYW5rU2VwOjI1LGVkZ2VTZXA6NX0sc2VyaWVzOntub2RlU2VwOjUsCnJhbmtTZXA6MjUsZWRnZVNlcDo1fSxwYWRkaW5nOntwYWRkaW5nVG9wOjQwLHBhZGRpbmdMZWZ0OjIwfX0sc3Vic2NlbmU6e21ldGE6e3BhZGRpbmdUb3A6MTAscGFkZGluZ0JvdHRvbToxMCxwYWRkaW5nTGVmdDoxMCxwYWRkaW5nUmlnaHQ6MTAsbGFiZWxIZWlnaHQ6MjAsZXh0cmFjdFhPZmZzZXQ6MTUsZXh0cmFjdFlPZmZzZXQ6MjB9LHNlcmllczp7cGFkZGluZ1RvcDoxMCxwYWRkaW5nQm90dG9tOjEwLHBhZGRpbmdMZWZ0OjEwLHBhZGRpbmdSaWdodDoxMCxsYWJlbEhlaWdodDoxMH19LG5vZGVTaXplOnttZXRhOntyYWRpdXM6NSx3aWR0aDo2MCxtYXhMYWJlbFdpZHRoOjUyLGhlaWdodDpkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMSwyMDBdKS5yYW5nZShbMTUsNjBdKS5jbGFtcCghMCksZXhwYW5kQnV0dG9uUmFkaXVzOjN9LG9wOnt3aWR0aDoxNSxoZWlnaHQ6NixyYWRpdXM6MyxsYWJlbE9mZnNldDotOCxtYXhMYWJlbFdpZHRoOjMwfSxzZXJpZXM6e2V4cGFuZGVkOntyYWRpdXM6MTAsCmxhYmVsT2Zmc2V0OjB9LHZlcnRpY2FsOnt3aWR0aDoxNixoZWlnaHQ6MTMsbGFiZWxPZmZzZXQ6LTEzfSxob3Jpem9udGFsOnt3aWR0aDoyNCxoZWlnaHQ6OCxyYWRpdXM6MTAsbGFiZWxPZmZzZXQ6LTEwfX0sYnJpZGdlOnt3aWR0aDoyMCxoZWlnaHQ6MjAscmFkaXVzOjIsbGFiZWxPZmZzZXQ6MH19LHNob3J0Y3V0U2l6ZTp7b3A6e3dpZHRoOjEwLGhlaWdodDo0fSxtZXRhOnt3aWR0aDoxMixoZWlnaHQ6NCxyYWRpdXM6MX0sc2VyaWVzOnt3aWR0aDoxNCxoZWlnaHQ6NH19LGFubm90YXRpb25zOntpbmJveFdpZHRoOjUwLG91dGJveFdpZHRoOjUwLHhPZmZzZXQ6MTAseU9mZnNldDozLGxhYmVsT2Zmc2V0OjIsbWF4TGFiZWxXaWR0aDoxMjB9LGNvbnN0YW50OntzaXplOnt3aWR0aDo0LGhlaWdodDo0fX0sc2VyaWVzOnttYXhTdGFja0NvdW50OjMscGFyYWxsZWxTdGFja09mZnNldFJhdGlvOi4yLHRvd2VyU3RhY2tPZmZzZXRSYXRpbzouNX0sbWluaW1hcDp7c2l6ZToxNTB9fTtkLk1JTl9BVVhfV0lEVEg9CjE0MDtkLmxheW91dFNjZW5lPWY7ZC5jb21wdXRlQ1hQb3NpdGlvbk9mTm9kZVNoYXBlPXR9KShjLmxheW91dHx8KGMubGF5b3V0PXt9KSl9KShhLmdyYXBofHwoYS5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9sb2FkZXIuanMKdmFyIGZwPXRoaXMmJnRoaXMuX19hd2FpdGVyfHxmdW5jdGlvbihhLGMsZCxmKXtyZXR1cm4gbmV3IChkfHwoZD1Qcm9taXNlKSkoZnVuY3Rpb24oZyxsKXtmdW5jdGlvbiBrKHEpe3RyeXtwKGYubmV4dChxKSl9Y2F0Y2gocil7bChyKX19ZnVuY3Rpb24gbihxKXt0cnl7cChmWyJ0aHJvdyJdKHEpKX1jYXRjaChyKXtsKHIpfX1mdW5jdGlvbiBwKHEpe3EuZG9uZT9nKHEudmFsdWUpOihuZXcgZChmdW5jdGlvbihyKXtyKHEudmFsdWUpfSkpLnRoZW4oayxuKX1wKChmPWYuYXBwbHkoYSxjfHxbXSkpLm5leHQoKSl9KX07CihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKGQpe2QuZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaD1mdW5jdGlvbihmLGcsbCxrPW5ldyBjLm9wLlRwdUNvbXBhdGliaWxpdHlQcm92aWRlcixuPWMuaGllcmFyY2h5LkRlZmF1bHRIaWVyYXJjaHlQYXJhbXMpe2NvbnN0IHA9Yy51dGlsLmdldFN1YnRhc2tUcmFja2VyKGYsMjAsIkdyYXBoIikscT1jLnV0aWwuZ2V0U3VidGFza1RyYWNrZXIoZiw1MCwiTmFtZXNwYWNlIGhpZXJhcmNoeSIpO3JldHVybiBjLnBhcnNlci5mZXRjaEFuZFBhcnNlR3JhcGhEYXRhKGcsbCxjLnV0aWwuZ2V0U3VidGFza1RyYWNrZXIoZiwzMCwiRGF0YSIpKS50aGVuKGZ1bmN0aW9uKHIpe2lmKCFyLm5vZGUpdGhyb3cgRXJyb3IoIlRoZSBncmFwaCBpcyBlbXB0eS4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gVGVuc29yRmxvdyBjb3VsZCBub3QgdHJhY2UgYW55IGdyYXBoLiBQbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvaXNzdWVzLzE5NjEgZm9yIG1vcmUgaW5mb3JtYXRpb24uIik7CnJldHVybiBjLmJ1aWxkKHIsYy5EZWZhdWx0QnVpbGRQYXJhbXMscCl9LCgpPT57dGhyb3cgRXJyb3IoIk1hbGZvcm1lZCBHcmFwaERlZi4gVGhpcyBjYW4gc29tZXRpbWVzIGJlIGNhdXNlZCBieSBhIGJhZCBuZXR3b3JrIGNvbm5lY3Rpb24gb3IgZGlmZmljdWx0eSByZWNvbmNpbGluZyBtdWx0aXBsZSBHcmFwaERlZnM7IGZvciB0aGUgbGF0dGVyIGNhc2UsIHBsZWFzZSByZWZlciB0byBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9pc3N1ZXMvMTkyOS4iKTt9KS50aGVuKHI9PmZwKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXtjLm9wLmNoZWNrT3BzRm9yQ29tcGF0aWJpbGl0eShyLGspO2NvbnN0IHQ9eWllbGQgYy5oaWVyYXJjaHkuYnVpbGQocixuLHEpO3JldHVybntncmFwaDpyLGdyYXBoSGllcmFyY2h5OnR9fSkpLmNhdGNoKHI9PntmLnJlcG9ydEVycm9yKGBHcmFwaCB2aXN1YWxpemF0aW9uIGZhaWxlZC5cblxuJHtyfWAscik7dGhyb3cgcjsKfSl9fSkoYy5sb2FkZXJ8fChjLmxvYWRlcj17fSkpfSkoYS5ncmFwaHx8KGEuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vbm9kZS5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gZyhhYSxjYSxmYSl7aWYoY2Eubm9kZS5pc0dyb3VwTm9kZSl7aWYoY2EuZXhwYW5kZWQpcmV0dXJuIGQuYnVpbGRHcm91cChhYSxjYSxmYSxkLkNsYXNzLlN1YnNjZW5lLkdST1VQKTtkLnNlbGVjdENoaWxkKGFhLCJnIixkLkNsYXNzLlN1YnNjZW5lLkdST1VQKS5yZW1vdmUoKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBsKGFhLGNhKXtsZXQgZmE9Y2EueC1jYS53aWR0aC8yK2NhLnBhZGRpbmdMZWZ0O2NhPWNhLnktY2EuaGVpZ2h0LzIrY2EucGFkZGluZ1RvcDthYT1kLnNlbGVjdENoaWxkKGFhLCJnIixkLkNsYXNzLlN1YnNjZW5lLkdST1VQKTtkLnRyYW5zbGF0ZShhYSxmYSxjYSl9ZnVuY3Rpb24gayhhYSxjYSxmYSl7YWE9ZC5zZWxlY3RPckNyZWF0ZUNoaWxkKGFhLCJnIixkLkNsYXNzLk5vZGUuQlVUVE9OX0NPTlRBSU5FUik7ZC5zZWxlY3RPckNyZWF0ZUNoaWxkKGFhLCJjaXJjbGUiLApkLkNsYXNzLk5vZGUuQlVUVE9OX0NJUkNMRSk7ZC5zZWxlY3RPckNyZWF0ZUNoaWxkKGFhLCJwYXRoIixkLkNsYXNzLk5vZGUuRVhQQU5EX0JVVFRPTikuYXR0cigiZCIsIk0wLC0yLjIgVjIuMiBNLTIuMiwwIEgyLjIiKTtkLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoYWEsInBhdGgiLGQuQ2xhc3MuTm9kZS5DT0xMQVBTRV9CVVRUT04pLmF0dHIoImQiLCJNLTIuMiwwIEgyLjIiKTthYS5vbigiY2xpY2siLGRhPT57ZDMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7ZmEuZmlyZSgibm9kZS10b2dnbGUtZXhwYW5kIix7bmFtZTpkYS5ub2RlLm5hbWV9KX0pO2QucG9zaXRpb25CdXR0b24oYWEsY2EpfWZ1bmN0aW9uIG4oYWEsY2EsZmEsZGEpe2lmKGRhKWFhLmF0dHIoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpO2Vsc2V7dmFyIGxhPWQuY29udGV4dG1lbnUuZ2V0TWVudShmYSxwKGNhLm5vZGUsZmEpKTthYS5vbigiZGJsY2xpY2siLFo9PntmYS5maXJlKCJub2RlLXRvZ2dsZS1leHBhbmQiLHtuYW1lOloubm9kZS5uYW1lfSl9KS5vbigibW91c2VvdmVyIiwKWj0+e2ZhLmlzTm9kZUV4cGFuZGVkKFopfHxmYS5maXJlKCJub2RlLWhpZ2hsaWdodCIse25hbWU6Wi5ub2RlLm5hbWV9KX0pLm9uKCJtb3VzZW91dCIsWj0+e2ZhLmlzTm9kZUV4cGFuZGVkKFopfHxmYS5maXJlKCJub2RlLXVuaGlnaGxpZ2h0Iix7bmFtZTpaLm5vZGUubmFtZX0pfSkub24oImNsaWNrIixaPT57ZDMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7ZmEuZmlyZSgibm9kZS1zZWxlY3QiLHtuYW1lOloubm9kZS5uYW1lfSl9KS5vbigiY29udGV4dG1lbnUiLChaLEZhKT0+e2ZhLmZpcmUoIm5vZGUtc2VsZWN0Iix7bmFtZTpaLm5vZGUubmFtZX0pO2xhLmNhbGwoWixGYSl9KX19ZnVuY3Rpb24gcChhYSxjYSl7bGV0IGZhPVt7dGl0bGU6KCk9PmMuZ2V0SW5jbHVkZU5vZGVCdXR0b25TdHJpbmcoYWEuaW5jbHVkZSksYWN0aW9uOigpPT57Y2EuZmlyZSgibm9kZS10b2dnbGUtZXh0cmFjdCIse25hbWU6YWEubmFtZX0pfX1dO2NhLm5vZGVDb250ZXh0TWVudUl0ZW1zJiYoZmE9CmZhLmNvbmNhdChjYS5ub2RlQ29udGV4dE1lbnVJdGVtcykpO3EoYWEpJiZmYS5wdXNoKHt0aXRsZTooKT0+dihhYSksYWN0aW9uOigpPT57Y2EuZmlyZSgibm9kZS10b2dnbGUtc2VyaWVzZ3JvdXAiLHtuYW1lOnIoYWEpfSl9fSk7cmV0dXJuIGZhfWZ1bmN0aW9uIHEoYWEpe3JldHVybiBudWxsIT09cihhYSl9ZnVuY3Rpb24gcihhYSl7cmV0dXJuIGFhP2FhLnR5cGU9PT1jLk5vZGVUeXBlLlNFUklFUz9hYS5uYW1lOmFhLnR5cGU9PT1jLk5vZGVUeXBlLk9QP2FhLm93bmluZ1NlcmllczpudWxsOm51bGx9ZnVuY3Rpb24gdChhYSl7bGV0IGNhPW51bGw7aWYoIWFhKXJldHVybiBudWxsO2FhLnR5cGU9PT1jLk5vZGVUeXBlLlNFUklFUz9jYT1hYTphYS5wYXJlbnROb2RlJiZhYS5wYXJlbnROb2RlLnR5cGU9PT1jLk5vZGVUeXBlLlNFUklFUyYmKGNhPWFhLnBhcmVudE5vZGUpO3JldHVybiBjYX1mdW5jdGlvbiB2KGFhKXtyZXR1cm4gYS5ncmFwaC5nZXRHcm91cFNlcmllc05vZGVCdXR0b25TdHJpbmcobnVsbCE9PQp0KGFhKT9hLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5HUk9VUDphLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5VTkdST1VQKX1mdW5jdGlvbiB5KGFhLGNhLGZhKXt2YXIgZGE9Y2EuZGlzcGxheU5hbWU7bGV0IGxhPWNhLm5vZGUudHlwZT09PWMuTm9kZVR5cGUuTUVUQSYmIWNhLmV4cGFuZGVkO2FhPWQuc2VsZWN0T3JDcmVhdGVDaGlsZChhYSwidGV4dCIsZC5DbGFzcy5Ob2RlLkxBQkVMKTtsZXQgWj1hYS5ub2RlKCk7Wi5wYXJlbnROb2RlLmFwcGVuZENoaWxkKFopO2FhLmF0dHIoImR5IiwiLjM1ZW0iKS5hdHRyKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpO2xhJiYoZGEubGVuZ3RoPmZhLm1heE1ldGFub2RlTGFiZWxMZW5ndGgmJihkYT1kYS5zdWJzdHIoMCxmYS5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoLTIpKyIuLi4iKSxmYT14KGZhKSxhYS5hdHRyKCJmb250LXNpemUiLGZhKGRhLmxlbmd0aCkrInB4IikpO2RhPWFhLnRleHQoZGEpO3ooZGEsY2Eubm9kZS50eXBlLGNhKTsKcmV0dXJuIGFhfWZ1bmN0aW9uIHooYWEsY2EsZmEpe2xldCBkYT1hYS5ub2RlKCk7dmFyIGxhPWRhLmdldENvbXB1dGVkVGV4dExlbmd0aCgpO2xldCBaPWRhLnRleHRDb250ZW50LEZhPW51bGw7c3dpdGNoKGNhKXtjYXNlIGMuTm9kZVR5cGUuTUVUQTpmYSYmIWZhLmV4cGFuZGVkJiYoRmE9Yy5sYXlvdXQuUEFSQU1TLm5vZGVTaXplLm1ldGEubWF4TGFiZWxXaWR0aCk7YnJlYWs7Y2FzZSBjLk5vZGVUeXBlLk9QOkZhPWMubGF5b3V0LlBBUkFNUy5ub2RlU2l6ZS5vcC5tYXhMYWJlbFdpZHRoO2JyZWFrO2Nhc2UgLTE6RmE9Yy5sYXlvdXQuUEFSQU1TLmFubm90YXRpb25zLm1heExhYmVsV2lkdGh9aWYoIShudWxsPT09RmF8fGxhPD1GYSkpe2ZvcihsYT0xO2RhLmdldFN1YlN0cmluZ0xlbmd0aCgwLGxhKTxGYTspbGErKztjYT1kYS50ZXh0Q29udGVudC5zdWJzdHIoMCxsYSk7ZG8gY2E9Y2Euc3Vic3RyKDAsY2EubGVuZ3RoLTEpLGRhLnRleHRDb250ZW50PWNhKyIuLi4iLGxhPWRhLmdldENvbXB1dGVkVGV4dExlbmd0aCgpOwp3aGlsZShsYT5GYSYmMDxjYS5sZW5ndGgpO3JldHVybiBhYS5hcHBlbmQoInRpdGxlIikudGV4dChaKX19ZnVuY3Rpb24geChhYSl7YmF8fChiYT1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbYWEubWF4TWV0YW5vZGVMYWJlbExlbmd0aExhcmdlRm9udCxhYS5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoXSkucmFuZ2UoW2FhLm1heE1ldGFub2RlTGFiZWxMZW5ndGhGb250U2l6ZSxhYS5taW5NZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemVdKS5jbGFtcCghMCkpO3JldHVybiBiYX1mdW5jdGlvbiBDKGFhLGNhLGZhLGRhKXtkLnNlbGVjdENoaWxkKGFhLCJ0ZXh0IixkLkNsYXNzLk5vZGUuTEFCRUwpLnRyYW5zaXRpb24oKS5hdHRyKCJ4IixjYSkuYXR0cigieSIsZmErZGEpfWZ1bmN0aW9uIEYoYWEsY2EsZmEpe2FhPWQuc2VsZWN0T3JDcmVhdGVDaGlsZChhYSwiZyIsZmEpO3N3aXRjaChjYS5ub2RlLnR5cGUpe2Nhc2UgYy5Ob2RlVHlwZS5PUDpjYT1jYS5ub2RlO2lmKF8uaXNOdW1iZXIoY2EuZnVuY3Rpb25JbnB1dEluZGV4KXx8Cl8uaXNOdW1iZXIoY2EuZnVuY3Rpb25PdXRwdXRJbmRleCkpe2Quc2VsZWN0T3JDcmVhdGVDaGlsZChhYSwicG9seWdvbiIsZC5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVCk7YnJlYWt9ZC5zZWxlY3RPckNyZWF0ZUNoaWxkKGFhLCJlbGxpcHNlIixkLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUKTticmVhaztjYXNlIGMuTm9kZVR5cGUuU0VSSUVTOmZhPSJhbm5vdGF0aW9uIjtjYS5jb3JlR3JhcGgmJihmYT1jYS5ub2RlLmhhc05vbkNvbnRyb2xFZGdlcz8idmVydGljYWwiOiJob3Jpem9udGFsIik7bGV0IGRhPVtkLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUXTtjYS5pc0ZhZGVkT3V0JiZkYS5wdXNoKCJmYWRlZC1lbGxpcHNlIik7ZC5zZWxlY3RPckNyZWF0ZUNoaWxkKGFhLCJ1c2UiLGRhKS5hdHRyKCJ4bGluazpocmVmIiwiI29wLXNlcmllcy0iK2ZhKyItc3RhbXAiKTtkLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoYWEsInJlY3QiLGQuQ2xhc3MuTm9kZS5DT0xPUl9UQVJHRVQpLmF0dHIoInJ4IiwKY2EucmFkaXVzKS5hdHRyKCJyeSIsY2EucmFkaXVzKTticmVhaztjYXNlIGMuTm9kZVR5cGUuQlJJREdFOmQuc2VsZWN0T3JDcmVhdGVDaGlsZChhYSwicmVjdCIsZC5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVCkuYXR0cigicngiLGNhLnJhZGl1cykuYXR0cigicnkiLGNhLnJhZGl1cyk7YnJlYWs7Y2FzZSBjLk5vZGVUeXBlLk1FVEE6ZC5zZWxlY3RPckNyZWF0ZUNoaWxkKGFhLCJyZWN0IixkLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUKS5hdHRyKCJyeCIsY2EucmFkaXVzKS5hdHRyKCJyeSIsY2EucmFkaXVzKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJVbnJlY29nbml6ZWQgbm9kZSB0eXBlOiAiK2NhLm5vZGUudHlwZSk7fXJldHVybiBhYX1mdW5jdGlvbiBEKGFhKXtzd2l0Y2goYWEubm9kZS50eXBlKXtjYXNlIGMuTm9kZVR5cGUuT1A6cmV0dXJuIGQuQ2xhc3MuT1BOT0RFO2Nhc2UgYy5Ob2RlVHlwZS5NRVRBOnJldHVybiBkLkNsYXNzLk1FVEFOT0RFO2Nhc2UgYy5Ob2RlVHlwZS5TRVJJRVM6cmV0dXJuIGQuQ2xhc3MuU0VSSUVTTk9ERTsKY2FzZSBjLk5vZGVUeXBlLkJSSURHRTpyZXR1cm4gZC5DbGFzcy5CUklER0VOT0RFO2Nhc2UgYy5Ob2RlVHlwZS5FTExJUFNJUzpyZXR1cm4gZC5DbGFzcy5FTExJUFNJU05PREV9dGhyb3cgRXJyb3IoIlVucmVjb2duaXplZCBub2RlIHR5cGU6ICIrYWEubm9kZS50eXBlKTt9ZnVuY3Rpb24gQihhYSxjYSl7dmFyIGZhPWQuc2VsZWN0Q2hpbGQoYWEsImciLGQuQ2xhc3MuTm9kZS5TSEFQRSk7bGV0IGRhPWMubGF5b3V0LmNvbXB1dGVDWFBvc2l0aW9uT2ZOb2RlU2hhcGUoY2EpO3N3aXRjaChjYS5ub2RlLnR5cGUpe2Nhc2UgYy5Ob2RlVHlwZS5PUDp7Y29uc3QgbGE9Y2Eubm9kZTtfLmlzTnVtYmVyKGxhLmZ1bmN0aW9uSW5wdXRJbmRleCl8fF8uaXNOdW1iZXIobGEuZnVuY3Rpb25PdXRwdXRJbmRleCk/KGZhPWQuc2VsZWN0Q2hpbGQoZmEsInBvbHlnb24iKSxkLnBvc2l0aW9uVHJpYW5nbGUoZmEsY2EueCxjYS55LGNhLmNvcmVCb3gud2lkdGgsY2EuY29yZUJveC5oZWlnaHQpKTooZmE9CmQuc2VsZWN0Q2hpbGQoZmEsImVsbGlwc2UiKSxkLnBvc2l0aW9uRWxsaXBzZShmYSxkYSxjYS55LGNhLmNvcmVCb3gud2lkdGgsY2EuY29yZUJveC5oZWlnaHQpKTtDKGFhLGRhLGNhLnksY2EubGFiZWxPZmZzZXQpO2JyZWFrfWNhc2UgYy5Ob2RlVHlwZS5NRVRBOmZhPWZhLnNlbGVjdEFsbCgicmVjdCIpO2NhLmV4cGFuZGVkPyhkLnBvc2l0aW9uUmVjdChmYSxjYS54LGNhLnksY2Eud2lkdGgsY2EuaGVpZ2h0KSxsKGFhLGNhKSxDKGFhLGRhLGNhLnksLWNhLmhlaWdodC8yK2NhLmxhYmVsSGVpZ2h0LzIpKTooZC5wb3NpdGlvblJlY3QoZmEsZGEsY2EueSxjYS5jb3JlQm94LndpZHRoLGNhLmNvcmVCb3guaGVpZ2h0KSxDKGFhLGRhLGNhLnksMCkpO2JyZWFrO2Nhc2UgYy5Ob2RlVHlwZS5TRVJJRVM6ZmE9ZC5zZWxlY3RDaGlsZChmYSwidXNlIik7Y2EuZXhwYW5kZWQ/KGQucG9zaXRpb25SZWN0KGZhLGNhLngsY2EueSxjYS53aWR0aCxjYS5oZWlnaHQpLGwoYWEsY2EpLEMoYWEsZGEsCmNhLnksLWNhLmhlaWdodC8yK2NhLmxhYmVsSGVpZ2h0LzIpKTooZC5wb3NpdGlvblJlY3QoZmEsZGEsY2EueSxjYS5jb3JlQm94LndpZHRoLGNhLmNvcmVCb3guaGVpZ2h0KSxDKGFhLGRhLGNhLnksY2EubGFiZWxPZmZzZXQpKTticmVhaztjYXNlIGMuTm9kZVR5cGUuQlJJREdFOmFhPWQuc2VsZWN0Q2hpbGQoZmEsInJlY3QiKTtkLnBvc2l0aW9uUmVjdChhYSxjYS54LGNhLnksY2Eud2lkdGgsY2EuaGVpZ2h0KTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJVbnJlY29nbml6ZWQgbm9kZSB0eXBlOiAiK2NhLm5vZGUudHlwZSk7fX1mdW5jdGlvbiBJKGFhLGNhLGZhKXtsZXQgZGE9YS5ncmFwaC51dGlsLmVzY2FwZVF1ZXJ5U2VsZWN0b3IoYWEpO2lmKCFmYSlyZXR1cm5gdXJsKCMke2RhfSlgO2ZhPWQzLnNlbGVjdChmYSk7bGV0IGxhPWZhLnNlbGVjdCgiZGVmcyNfZ3JhcGgtZ3JhZGllbnRzIik7bGEuZW1wdHkoKSYmKGxhPWZhLmFwcGVuZCgiZGVmcyIpLmF0dHIoImlkIiwiX2dyYXBoLWdyYWRpZW50cyIpKTsKbGV0IFo9bGEuc2VsZWN0KCJsaW5lYXJHcmFkaWVudCMiK2RhKTtpZihaLmVtcHR5KCkpe1o9bGEuYXBwZW5kKCJsaW5lYXJHcmFkaWVudCIpLmF0dHIoImlkIixhYSk7Wi5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTtsZXQgRmE9MDtfLmVhY2goY2EseGE9PntsZXQgeWE9eGEuY29sb3I7Wi5hcHBlbmQoInN0b3AiKS5hdHRyKCJvZmZzZXQiLEZhKS5hdHRyKCJzdG9wLWNvbG9yIix5YSk7Wi5hcHBlbmQoInN0b3AiKS5hdHRyKCJvZmZzZXQiLEZhK3hhLnByb3BvcnRpb24pLmF0dHIoInN0b3AtY29sb3IiLHlhKTtGYSs9eGEucHJvcG9ydGlvbn0pfX1mdW5jdGlvbiBPKGFhLGNhLGZhLGRhLGxhKXtsZXQgWj1jLnJlbmRlci5NZXRhbm9kZUNvbG9ycztzd2l0Y2goY2Epe2Nhc2UgbWEuU1RSVUNUVVJFOnJldHVybiBmYS5ub2RlLnR5cGU9PT1jLk5vZGVUeXBlLk1FVEE/KGNhPWZhLm5vZGUudGVtcGxhdGVJZCxudWxsPT09Y2E/Wi5VTktOT1dOOlouU1RSVUNUVVJFX1BBTEVUVEUoYWEoY2EpLApkYSkpOmZhLm5vZGUudHlwZT09PWMuTm9kZVR5cGUuU0VSSUVTP2RhP1ouRVhQQU5ERURfQ09MT1I6IndoaXRlIjpmYS5ub2RlLnR5cGU9PT1jLk5vZGVUeXBlLkJSSURHRT9mYS5zdHJ1Y3R1cmFsPyIjZjBlIjpmYS5ub2RlLmluYm91bmQ/IiMwZWYiOiIjZmUwIjpfLmlzTnVtYmVyKGZhLm5vZGUuZnVuY3Rpb25JbnB1dEluZGV4KT8iIzc5NTU0OCI6Xy5pc051bWJlcihmYS5ub2RlLmZ1bmN0aW9uT3V0cHV0SW5kZXgpPyIjMDA5Njg4Ijoid2hpdGUiO2Nhc2UgbWEuREVWSUNFOnJldHVybiBudWxsPT1mYS5kZXZpY2VDb2xvcnM/Wi5VTktOT1dOOmRhP1ouRVhQQU5ERURfQ09MT1I6SSgiZGV2aWNlLSIrZmEubm9kZS5uYW1lLGZhLmRldmljZUNvbG9ycyxsYSk7Y2FzZSBtYS5YTEFfQ0xVU1RFUjpyZXR1cm4gbnVsbD09ZmEueGxhQ2x1c3RlckNvbG9ycz9aLlVOS05PV046ZGE/Wi5FWFBBTkRFRF9DT0xPUjpJKCJ4bGEtIitmYS5ub2RlLm5hbWUsZmEueGxhQ2x1c3RlckNvbG9ycywKbGEpO2Nhc2UgbWEuQ09NUFVURV9USU1FOnJldHVybiBkYT9aLkVYUEFOREVEX0NPTE9SOmZhLmNvbXB1dGVUaW1lQ29sb3J8fFouVU5LTk9XTjtjYXNlIG1hLk1FTU9SWTpyZXR1cm4gZGE/Wi5FWFBBTkRFRF9DT0xPUjpmYS5tZW1vcnlDb2xvcnx8Wi5VTktOT1dOO2Nhc2UgbWEuT1BfQ09NUEFUSUJJTElUWTpyZXR1cm4gbnVsbD09ZmEuY29tcGF0aWJpbGl0eUNvbG9ycz9aLlVOS05PV046ZGE/Wi5FWFBBTkRFRF9DT0xPUjpJKCJvcC1jb21wYXQtIitmYS5ub2RlLm5hbWUsZmEuY29tcGF0aWJpbGl0eUNvbG9ycyxsYSk7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5rbm93biBjYXNlIHRvIGNvbG9yIG5vZGVzIGJ5Iik7fX1mdW5jdGlvbiBQKGFhLGNhLGZhLGRhKXtkYT1kYXx8ZC5DbGFzcy5Ob2RlLlNIQVBFO2xldCBsYT1mYS5pc05vZGVTZWxlY3RlZChjYS5ub2RlLm5hbWUpLFo9Y2EuaXNJbkV4dHJhY3R8fGNhLmlzT3V0RXh0cmFjdHx8Y2EuaXNMaWJyYXJ5RnVuY3Rpb24sRmE9CmNhLmV4cGFuZGVkJiZkYSE9PWQuQ2xhc3MuQW5ub3RhdGlvbi5OT0RFLHhhPWNhLmlzRmFkZWRPdXQ7YWEuY2xhc3NlZCgiaGlnaGxpZ2h0ZWQiLGZhLmlzTm9kZUhpZ2hsaWdodGVkKGNhLm5vZGUubmFtZSkpO2FhLmNsYXNzZWQoInNlbGVjdGVkIixsYSk7YWEuY2xhc3NlZCgiZXh0cmFjdCIsWik7YWEuY2xhc3NlZCgiZXhwYW5kZWQiLEZhKTthYS5jbGFzc2VkKCJmYWRlZCIseGEpO2FhPWFhLnNlbGVjdCgiLiIrZGErIiAuIitkLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUKTtjYT1PKGZhLnRlbXBsYXRlSW5kZXgsbWFbZmEuY29sb3JCeS50b1VwcGVyQ2FzZSgpXSxjYSxGYSxmYS5nZXRHcmFwaFN2Z1Jvb3QoKSk7YWEuc3R5bGUoImZpbGwiLGNhKTthYS5zdHlsZSgic3Ryb2tlIixsYT9udWxsOkgoY2EpKX1mdW5jdGlvbiBIKGFhKXtyZXR1cm4idXJsIj09PWFhLnN1YnN0cmluZygwLDMpP2MucmVuZGVyLk1ldGFub2RlQ29sb3JzLkdSQURJRU5UX09VVExJTkU6ZDMucmdiKGFhKS5kYXJrZXIoKS50b1N0cmluZygpfQpmdW5jdGlvbiBLKGFhLGNhKXtsZXQgZmE9W107YWE9Y2EuZ2V0Tm9kZUJ5TmFtZShhYSk7aWYoYWEgaW5zdGFuY2VvZiBhLmdyYXBoLk9wTm9kZUltcGwpcmV0dXJuW2FhXS5jb25jYXQoYWEuaW5FbWJlZGRpbmdzKTthYT1hYS5tZXRhZ3JhcGgubm9kZXMoKTtfLmVhY2goYWEsZnVuY3Rpb24oZGEpe2ZhPWZhLmNvbmNhdChLKGRhLGNhKSl9KTtyZXR1cm4gZmF9ZnVuY3Rpb24gTShhYSxjYSxmYSxkYSl7aWYoZGFbZmEubmFtZV0pcmV0dXJuIGRhO2RhW2ZhLm5hbWVdPSEwO3ZhciBsYT1mYS5pbnB1dHM7bGV0IFo9WShjYSxmYSk7ZDMuc2VsZWN0KGFhKS5zZWxlY3QoYC5ub2RlW2RhdGEtbmFtZT0iJHtaLm5hbWV9Il1gKS5jbGFzc2VkKCJpbnB1dC1oaWdobGlnaHQiLCEwKTtsZXQgRmE9e307Xy5lYWNoKGxhLGZ1bmN0aW9uKEJhKXtCYT1jYS5nZXROb2RlQnlOYW1lKEJhLm5hbWUpO2lmKHZvaWQgMCE9PUJhKXtCYSBpbnN0YW5jZW9mIGMuTWV0YW5vZGVJbXBsJiYoQmE9YS5ncmFwaC5nZXRTdHJpY3ROYW1lKEJhLm5hbWUpLApCYT1jYS5nZXROb2RlQnlOYW1lKEJhKSk7dmFyIEdhPVkoY2EsQmEpLHphPUZhW0dhLm5hbWVdO3phP3phLm9wTm9kZXMucHVzaChCYSk6RmFbR2EubmFtZV09e3Zpc2libGVQYXJlbnQ6R2Esb3BOb2RlczpbQmFdfX19KTtsZXQgeGE9e30seWE9W1pdO3hhW1oubmFtZV09e3RyYWNlZDohMSxpbmRleDowLGNvbm5lY3Rpb25FbmRwb2ludHM6W119O2ZhPVo7Zm9yKGxhPTE7ZmEubmFtZSE9PWEuZ3JhcGguUk9PVF9OQU1FO2xhKyspZmE9ZmEucGFyZW50Tm9kZSx4YVtmYS5uYW1lXT17dHJhY2VkOiExLGluZGV4OmxhLGNvbm5lY3Rpb25FbmRwb2ludHM6W119LHlhW2xhXT1mYTtfLmZvck93bihGYSxmdW5jdGlvbihCYSl7bGV0IEdhPUJhLnZpc2libGVQYXJlbnQ7Xy5lYWNoKEJhLm9wTm9kZXMsZnVuY3Rpb24oemEpe2RhPU0oYWEsY2EsemEsZGEpfSk7R2EubmFtZSE9PVoubmFtZSYmTChhYSxHYSx4YSx5YSl9KTtyZXR1cm4gZGF9ZnVuY3Rpb24gTChhYSxjYSxmYSxkYSl7dmFyIGxhPQpjYSxaPWNhO2ZvcihjYT1bXTshZmFbbGEubmFtZV07KVoubmFtZSE9PWxhLm5hbWUmJmNhLnB1c2goW1osbGFdKSxaPWxhLGxhPWxhLnBhcmVudE5vZGU7ZmE9ZmFbbGEubmFtZV0uaW5kZXg7bGV0IEZhPWRhW01hdGgubWF4KGZhLTEsMCldLm5hbWU7Wj1sYT1aLm5hbWU7Y29uc3QgeGE9ZDMuc2VsZWN0KGFhKTt4YS5zZWxlY3RBbGwoYFtkYXRhLWVkZ2U9IiR7Wn0tLSR7RmF9Il1gKS5jbGFzc2VkKCJpbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApO18uZWFjaChjYSxmdW5jdGlvbih5YSl7eGEuc2VsZWN0QWxsKGBbZGF0YS1lZGdlPSIke3lhWzBdLm5hbWV9LS0ke0ZhfWArYH5+JHt5YVsxXS5uYW1lfX5+T1VUIl1gKS5jbGFzc2VkKCJpbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApfSk7Zm9yKGFhPTE7YWE8ZmE7YWErKyl4YS5zZWxlY3RBbGwoYFtkYXRhLWVkZ2U9IiR7bGF9fn4ke2RhW2FhXS5uYW1lfWArYH5+SU4tLSR7ZGFbYWEtMV0ubmFtZX0iXWApLmNsYXNzZWQoImlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwKITApfWZ1bmN0aW9uIFIoYWEsY2Epe2xldCBmYT17fTtfLmVhY2goY2EsZnVuY3Rpb24oZGEpe2RhPWFhLmdldE5vZGVCeU5hbWUoZGEpO2RhPVkoYWEsZGEpO2ZhW2RhLm5hbWVdPWRhfSk7cmV0dXJuIGZhfWZ1bmN0aW9uIFUoYWEsY2Epe18uZm9yT3duKGNhLGZ1bmN0aW9uKGZhKXtmb3IoO2ZhLm5hbWUhPT1hLmdyYXBoLlJPT1RfTkFNRTspe2NvbnN0IGRhPWQzLnNlbGVjdChhYSkuc2VsZWN0KGAubm9kZVtkYXRhLW5hbWU9IiR7ZmEubmFtZX0iXWApOyFkYS5ub2RlcygpLmxlbmd0aHx8ZGEuY2xhc3NlZCgiaW5wdXQtaGlnaGxpZ2h0Iil8fGRhLmNsYXNzZWQoInNlbGVjdGVkIil8fGRhLmNsYXNzZWQoIm9wIil8fGRhLmNsYXNzZWQoImlucHV0LXBhcmVudCIsITApO2ZhPWZhLnBhcmVudE5vZGV9fSl9ZnVuY3Rpb24gWShhYSxjYSl7bGV0IGZhPSExLGRhPWNhO2Zvcig7IWZhOylpZihjYT1kYSxkYT1jYS5wYXJlbnROb2RlLHZvaWQgMD09PWRhKWZhPSEwO2Vsc2V7bGV0IGxhPQphYS5nZXRSZW5kZXJOb2RlQnlOYW1lKGRhLm5hbWUpO2xhJiYobGEuZXhwYW5kZWR8fGRhIGluc3RhbmNlb2YgYy5PcE5vZGVJbXBsKSYmKGZhPSEwKX1yZXR1cm4gY2F9Zi5idWlsZEdyb3VwPWZ1bmN0aW9uKGFhLGNhLGZhKXthYT1kLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoYWEsImciLGQuQ2xhc3MuTm9kZS5DT05UQUlORVIpLnNlbGVjdEFsbChmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9KS5kYXRhKGNhLGRhPT5kYS5ub2RlLm5hbWUrIjoiK2RhLm5vZGUudHlwZSk7YWEuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJkYXRhLW5hbWUiLGRhPT5kYS5ub2RlLm5hbWUpLmVhY2goZnVuY3Rpb24oZGEpe2xldCBsYT1kMy5zZWxlY3QodGhpcyk7ZmEuYWRkTm9kZUdyb3VwKGRhLm5vZGUubmFtZSxsYSl9KS5tZXJnZShhYSkuYXR0cigiY2xhc3MiLGRhPT5kLkNsYXNzLk5vZGUuR1JPVVArIiAiK0QoZGEpKS5lYWNoKGZ1bmN0aW9uKGRhKXtsZXQgbGE9ZDMuc2VsZWN0KHRoaXMpOwp2YXIgWj1kLnNlbGVjdE9yQ3JlYXRlQ2hpbGQobGEsImciLGQuQ2xhc3MuQW5ub3RhdGlvbi5JTkJPWCk7ZC5hbm5vdGF0aW9uLmJ1aWxkR3JvdXAoWixkYS5pbkFubm90YXRpb25zLGRhLGZhKTtaPWQuc2VsZWN0T3JDcmVhdGVDaGlsZChsYSwiZyIsZC5DbGFzcy5Bbm5vdGF0aW9uLk9VVEJPWCk7ZC5hbm5vdGF0aW9uLmJ1aWxkR3JvdXAoWixkYS5vdXRBbm5vdGF0aW9ucyxkYSxmYSk7Wj1GKGxhLGRhLGQuQ2xhc3MuTm9kZS5TSEFQRSk7ZGEubm9kZS5pc0dyb3VwTm9kZSYmayhaLGRhLGZhKTtuKFosZGEsZmEpO2cobGEsZGEsZmEpO1o9eShsYSxkYSxmYSk7bihaLGRhLGZhLGRhLm5vZGUudHlwZT09PWMuTm9kZVR5cGUuTUVUQSk7UChsYSxkYSxmYSk7QihsYSxkYSl9KTthYS5leGl0KCkuZWFjaChmdW5jdGlvbihkYSl7ZmEucmVtb3ZlTm9kZUdyb3VwKGRhLm5vZGUubmFtZSk7bGV0IGxhPWQzLnNlbGVjdCh0aGlzKTswPGRhLmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGgmJmxhLnNlbGVjdCgiLiIrCmQuQ2xhc3MuQW5ub3RhdGlvbi5JTkJPWCkuc2VsZWN0QWxsKCIuIitkLkNsYXNzLkFubm90YXRpb24uR1JPVVApLmVhY2goWj0+e2ZhLnJlbW92ZUFubm90YXRpb25Hcm91cChaLGRhKX0pOzA8ZGEub3V0QW5ub3RhdGlvbnMubGlzdC5sZW5ndGgmJmxhLnNlbGVjdCgiLiIrZC5DbGFzcy5Bbm5vdGF0aW9uLk9VVEJPWCkuc2VsZWN0QWxsKCIuIitkLkNsYXNzLkFubm90YXRpb24uR1JPVVApLmVhY2goWj0+e2ZhLnJlbW92ZUFubm90YXRpb25Hcm91cChaLGRhKX0pfSkucmVtb3ZlKCk7cmV0dXJuIGFhfTtmLmdldENvbnRleHRNZW51PXA7Zi5jYW5CZUluU2VyaWVzPXE7Zi5nZXRTZXJpZXNOYW1lPXI7Zi5nZXRHcm91cFNldHRpbmdMYWJlbD12O2YuZW5mb3JjZUxhYmVsV2lkdGg9ejtsZXQgYmE9bnVsbDtmLmJ1aWxkU2hhcGU9RjtmLm5vZGVDbGFzcz1EO2xldCBtYTsoZnVuY3Rpb24oYWEpe2FhW2FhLlNUUlVDVFVSRT0wXT0iU1RSVUNUVVJFIjthYVthYS5ERVZJQ0U9MV09IkRFVklDRSI7CmFhW2FhLlhMQV9DTFVTVEVSPTJdPSJYTEFfQ0xVU1RFUiI7YWFbYWEuQ09NUFVURV9USU1FPTNdPSJDT01QVVRFX1RJTUUiO2FhW2FhLk1FTU9SWT00XT0iTUVNT1JZIjthYVthYS5PUF9DT01QQVRJQklMSVRZPTVdPSJPUF9DT01QQVRJQklMSVRZIn0pKG1hPWYuQ29sb3JCeXx8KGYuQ29sb3JCeT17fSkpO2YucmVtb3ZlR3JhZGllbnREZWZpbml0aW9ucz1mdW5jdGlvbihhYSl7ZDMuc2VsZWN0KGFhKS5zZWxlY3QoImRlZnMjX2dyYXBoLWdyYWRpZW50cyIpLnJlbW92ZSgpfTtmLmdldEZpbGxGb3JOb2RlPU87Zi5zdHlsaXplPVA7Zi5nZXRTdHJva2VGb3JGaWxsPUg7Zi51cGRhdGVJbnB1dFRyYWNlPWZ1bmN0aW9uKGFhLGNhLGZhLGRhKXtjb25zdCBsYT1kMy5zZWxlY3QoYWEpO2xhLnNlbGVjdEFsbCgiLmlucHV0LWhpZ2hsaWdodCIpLmNsYXNzZWQoImlucHV0LWhpZ2hsaWdodCIsITEpO2xhLnNlbGVjdEFsbCgiLm5vbi1pbnB1dCIpLmNsYXNzZWQoIm5vbi1pbnB1dCIsITEpOwpsYS5zZWxlY3RBbGwoIi5pbnB1dC1wYXJlbnQiKS5jbGFzc2VkKCJpbnB1dC1wYXJlbnQiLCExKTtsYS5zZWxlY3RBbGwoIi5pbnB1dC1jaGlsZCIpLmNsYXNzZWQoImlucHV0LWNoaWxkIiwhMSk7bGEuc2VsZWN0QWxsKCIuaW5wdXQtZWRnZS1oaWdobGlnaHQiKS5jbGFzc2VkKCJpbnB1dC1lZGdlLWhpZ2hsaWdodCIsITEpO2xhLnNlbGVjdEFsbCgiLm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCIpLmNsYXNzZWQoIm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCIsITEpO2xhLnNlbGVjdEFsbCgiLmlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZCIpLmNsYXNzZWQoImlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZCIsITEpO2lmKGNhJiZkYSYmZmEpe2ZhPUsoZmEsY2EpO3ZhciBaPXt9O18uZWFjaChmYSxmdW5jdGlvbihGYSl7Wj1NKGFhLGNhLEZhLFopfSk7ZmE9T2JqZWN0LmtleXMoWik7ZmE9UihjYSxmYSk7VShhYSxmYSk7bGEuc2VsZWN0QWxsKCJnLm5vZGU6bm90KC5zZWxlY3RlZCk6bm90KC5pbnB1dC1oaWdobGlnaHQpOm5vdCguaW5wdXQtcGFyZW50KTpub3QoLmlucHV0LWNoaWxkcmVuKSIpLmNsYXNzZWQoIm5vbi1pbnB1dCIsCiEwKS5lYWNoKGZ1bmN0aW9uKEZhKXtsYS5zZWxlY3RBbGwoYFtkYXRhLW5hbWU9IiR7RmEubm9kZS5uYW1lfSJdYCkuY2xhc3NlZCgibm9uLWlucHV0IiwhMCl9KTtsYS5zZWxlY3RBbGwoImcuZWRnZTpub3QoLmlucHV0LWVkZ2UtaGlnaGxpZ2h0KSIpLmNsYXNzZWQoIm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApfX07Zi5nZXRWaXNpYmxlUGFyZW50PVl9KShkLm5vZGV8fChkLm5vZGU9e30pKX0pKGMuc2NlbmV8fChjLnNjZW5lPXt9KSl9KShhLmdyYXBofHwoYS5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9vcC5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXtjbGFzcyBme2lzTm90VHB1T3AoZyl7cmV0dXJuLTEhPWcudG9Mb3dlckNhc2UoKS5zZWFyY2goImNwdToiKXx8LTEhPWcudG9Mb3dlckNhc2UoKS5zZWFyY2goImdwdToiKT8hMDotMT09Zy50b0xvd2VyQ2FzZSgpLnNlYXJjaCgidHB1Iil9b3BWYWxpZChnKXtyZXR1cm4gMD09Zy5uYW1lLnNlYXJjaChjLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgpfHwhZy5vcHx8Zy5kZXZpY2UmJnRoaXMuaXNOb3RUcHVPcChnLmRldmljZSl8fGcuZGV2aWNlJiYtMSE9Zy5kZXZpY2Uuc2VhcmNoKCJUUFVfU1lTVEVNIik/ITA6Xy5pbmNsdWRlcyhmLldISVRFTElTVCxnLm9wKX19Zi5XSElURUxJU1Q9IkFicyBBY29zIEFjb3NoIEFkZCBBZGROIEFkanVzdENvbnRyYXN0djIgQWRqdXN0SHVlIEFkanVzdFNhdHVyYXRpb24gQWxsIEFuZ2xlIEFueSBBcHByb3hpbWF0ZUVxdWFsIEFyZ01heCBBcmdNaW4gQXNpbiBBc2luaCBBc3NlcnQgQXNzaWduQWRkVmFyaWFibGVPcCBBc3NpZ25TdWJWYXJpYWJsZU9wIEFzc2lnblZhcmlhYmxlT3AgQXRhbiBBdGFuMiBBdGFuaCBBdmdQb29sIEF2Z1Bvb2wzRCBBdmdQb29sM0RHcmFkIEF2Z1Bvb2xHcmFkIEJhdGNoTWF0TXVsIEJhdGNoVG9TcGFjZSBCYXRjaFRvU3BhY2VORCBCaWFzQWRkIEJpYXNBZGRHcmFkIEJpYXNBZGRWMSBCaXRjYXN0IEJpdHdpc2VBbmQgQml0d2lzZU9yIEJpdHdpc2VYb3IgQnJvYWRjYXN0QXJncyBCcm9hZGNhc3RHcmFkaWVudEFyZ3MgQnVja2V0aXplIENhc3QgQ2VpbCBDaGVja051bWVyaWNzIENob2xlc2t5IENsaXBCeVZhbHVlIENvbXBsZXggQ29tcGxleEFicyBDb25jYXQgQ29uY2F0T2Zmc2V0IENvbmNhdFYyIENvbmogQ29uanVnYXRlVHJhbnNwb3NlIENvbnN0IENvbnRyb2xUcmlnZ2VyIENvbnYyRCBDb252MkRCYWNrcHJvcEZpbHRlciBDb252MkRCYWNrcHJvcElucHV0IENvbnYzRCBDb252M0RCYWNrcHJvcEZpbHRlclYyIENvbnYzREJhY2twcm9wSW5wdXRWMiBDb3MgQ29zaCBDcm9zcyBDcm9zc1JlcGxpY2FTdW0gQ3VtcHJvZCBDdW1zdW0gRGVwdGhUb1NwYWNlIERlcHRod2lzZUNvbnYyZE5hdGl2ZSBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0IERpYWcgRGlhZ1BhcnQgRGlnYW1tYSBEaXYgRHluYW1pY1N0aXRjaCBFbHUgRWx1R3JhZCBFbXB0eSBFcXVhbCBFcmYgRXJmYyBFeHAgRXhwYW5kRGltcyBFeHBtMSBFeHRyYWN0SW1hZ2VQYXRjaGVzIEZGVCBGRlQyRCBGRlQzRCBGYWtlUXVhbnRXaXRoTWluTWF4QXJncyBGYWtlUXVhbnRXaXRoTWluTWF4QXJnc0dyYWRpZW50IEZha2VRdWFudFdpdGhNaW5NYXhWYXJzIEZha2VRdWFudFdpdGhNaW5NYXhWYXJzR3JhZGllbnQgRmlsbCBGbG9vciBGbG9vckRpdiBGbG9vck1vZCBGdXNlZEJhdGNoTm9ybSBGdXNlZEJhdGNoTm9ybUdyYWQgRnVzZWRCYXRjaE5vcm1HcmFkVjIgRnVzZWRCYXRjaE5vcm1WMiBHYXRoZXIgR2F0aGVyTmQgR2F0aGVyVjIgR2V0SXRlbSBHcmVhdGVyIEdyZWF0ZXJFcXVhbCBIU1ZUb1JHQiBJRkZUIElGRlQyRCBJRkZUM0QgSVJGRlQgSVJGRlQyRCBJUkZGVDNEIElkZW50aXR5IElkZW50aXR5TiBJZiBJbWFnIEluZmVlZERlcXVldWUgSW5mZWVkRGVxdWV1ZVR1cGxlIElucGxhY2VBZGQgSW5wbGFjZVVwZGF0ZSBJbnYgSW52ZXJ0IEludmVydFBlcm11dGF0aW9uIElzRmluaXRlIElzSW5mIElzTmFuIEwyTG9zcyBMUk4gTFJOR3JhZCBMZWZ0U2hpZnQgTGVzcyBMZXNzRXF1YWwgTGdhbW1hIExpblNwYWNlIExpc3REaWZmIExvZyBMb2cxcCBMb2dTb2Z0bWF4IExvZ2ljYWxBbmQgTG9naWNhbE5vdCBMb2dpY2FsT3IgTWF0TXVsIE1hdHJpeEJhbmRQYXJ0IE1hdHJpeERpYWcgTWF0cml4RGlhZ1BhcnQgTWF0cml4U2V0RGlhZyBNYXRyaXhUcmlhbmd1bGFyU29sdmUgTWF4IE1heFBvb2wgTWF4UG9vbDNEIE1heFBvb2wzREdyYWQgTWF4UG9vbDNER3JhZEdyYWQgTWF4UG9vbEdyYWQgTWF4UG9vbEdyYWRHcmFkIE1heFBvb2xHcmFkR3JhZFYyIE1heFBvb2xHcmFkVjIgTWF4UG9vbFYyIE1heGltdW0gTWVhbiBNaW4gTWluaW11bSBNaXJyb3JQYWQgTW9kIE11bCBNdWx0aW5vbWlhbCBOZWcgTm9PcCBOb25NYXhTdXBwcmVzc2lvblY0IE5vdEVxdWFsIE9uZUhvdCBPbmVzTGlrZSBPdXRmZWVkRW5xdWV1ZSBPdXRmZWVkRW5xdWV1ZVR1cGxlIFBhY2sgUGFkIFBhZFYyIFBhcmFsbGVsRHluYW1pY1N0aXRjaCBQbGFjZWhvbGRlcldpdGhEZWZhdWx0IFBvdyBQcmV2ZW50R3JhZGllbnQgUHJvZCBRciBRdWFudGl6ZUFuZERlcXVhbnRpemVWMiBRdWFudGl6ZUFuZERlcXVhbnRpemVWMyBSRkZUIFJGRlQyRCBSRkZUM0QgUkdCVG9IU1YgUmFuZG9tU2h1ZmZsZSBSYW5kb21TdGFuZGFyZE5vcm1hbCBSYW5kb21Vbmlmb3JtIFJhbmRvbVVuaWZvcm1JbnQgUmFuZ2UgUmFuayBSZWFkVmFyaWFibGVPcCBSZWFsIFJlYWxEaXYgUmVjaXByb2NhbCBSZWNpcHJvY2FsR3JhZCBSZWN2VFBVRW1iZWRkaW5nQWN0aXZhdGlvbnMgUmVsdSBSZWx1NiBSZWx1NkdyYWQgUmVsdUdyYWQgUmVzaGFwZSBSZXNpemVCaWxpbmVhciBSZXNpemVCaWxpbmVhckdyYWQgUmVzb3VyY2VBcHBseUFkYU1heCBSZXNvdXJjZUFwcGx5QWRhZGVsdGEgUmVzb3VyY2VBcHBseUFkYWdyYWQgUmVzb3VyY2VBcHBseUFkYWdyYWREQSBSZXNvdXJjZUFwcGx5QWRhbSBSZXNvdXJjZUFwcGx5QWRkU2lnbiBSZXNvdXJjZUFwcGx5Q2VudGVyZWRSTVNQcm9wIFJlc291cmNlQXBwbHlGdHJsIFJlc291cmNlQXBwbHlGdHJsVjIgUmVzb3VyY2VBcHBseUdyYWRpZW50RGVzY2VudCBSZXNvdXJjZUFwcGx5TW9tZW50dW0gUmVzb3VyY2VBcHBseVBvd2VyU2lnbiBSZXNvdXJjZUFwcGx5UHJveGltYWxBZGFncmFkIFJlc291cmNlQXBwbHlQcm94aW1hbEdyYWRpZW50RGVzY2VudCBSZXNvdXJjZUFwcGx5Uk1TUHJvcCBSZXNvdXJjZUdhdGhlciBSZXNvdXJjZVNjYXR0ZXJBZGQgUmVzb3VyY2VTY2F0dGVyRGl2IFJlc291cmNlU2NhdHRlck1heCBSZXNvdXJjZVNjYXR0ZXJNaW4gUmVzb3VyY2VTY2F0dGVyTXVsIFJlc291cmNlU2NhdHRlck5kQWRkIFJlc291cmNlU2NhdHRlck5kVXBkYXRlIFJlc291cmNlU2NhdHRlclN1YiBSZXNvdXJjZVNjYXR0ZXJVcGRhdGUgUmVzb3VyY2VTdHJpZGVkU2xpY2VBc3NpZ24gUmV2ZXJzZSBSZXZlcnNlU2VxdWVuY2UgUmV2ZXJzZVYyIFJpZ2h0U2hpZnQgUmludCBSb3VuZCBSc3FydCBSc3FydEdyYWQgU2NhdHRlck5kIFNlbGVjdCBTZWx1IFNlbHVHcmFkIFNlbmRUUFVFbWJlZGRpbmdHcmFkaWVudHMgU2hhcGUgU2hhcGVOIFNpZ21vaWQgU2lnbW9pZEdyYWQgU2lnbiBTaW4gU2luaCBTaXplIFNsaWNlIFNuYXBzaG90IFNvZnRtYXggU29mdG1heENyb3NzRW50cm9weVdpdGhMb2dpdHMgU29mdHBsdXMgU29mdHBsdXNHcmFkIFNvZnRzaWduIFNvZnRzaWduR3JhZCBTcGFjZVRvQmF0Y2ggU3BhY2VUb0JhdGNoTkQgU3BhY2VUb0RlcHRoIFNwYXJzZU1hdE11bCBTcGFyc2VTb2Z0bWF4Q3Jvc3NFbnRyb3B5V2l0aExvZ2l0cyBTcGFyc2VUb0RlbnNlIFNwbGl0IFNwbGl0ViBTcXJ0IFNxcnRHcmFkIFNxdWFyZSBTcXVhcmVkRGlmZmVyZW5jZSBTcXVlZXplIFN0YWNrQ2xvc2VWMiBTdGFja1BvcFYyIFN0YWNrUHVzaFYyIFN0YWNrVjIgU3RhdGVsZXNzSWYgU3RhdGVsZXNzUmFuZG9tTm9ybWFsIFN0YXRlbGVzc1JhbmRvbVVuaWZvcm0gU3RhdGVsZXNzVHJ1bmNhdGVkTm9ybWFsIFN0YXRlbGVzc1doaWxlIFN0b3BHcmFkaWVudCBTdHJpZGVkU2xpY2UgU3RyaWRlZFNsaWNlR3JhZCBTdWIgU3VtIFN5bWJvbGljR3JhZGllbnQgVFBVRW1iZWRkaW5nQWN0aXZhdGlvbnMgVGFuIFRhbmggVGFuaEdyYWQgVGVuc29yQXJyYXlDbG9zZVYzIFRlbnNvckFycmF5Q29uY2F0VjMgVGVuc29yQXJyYXlHYXRoZXJWMyBUZW5zb3JBcnJheUdyYWRWMyBUZW5zb3JBcnJheVJlYWRWMyBUZW5zb3JBcnJheVNjYXR0ZXJWMyBUZW5zb3JBcnJheVNpemVWMyBUZW5zb3JBcnJheVNwbGl0VjMgVGVuc29yQXJyYXlWMyBUZW5zb3JBcnJheVdyaXRlVjMgVGlsZSBUb3BLVjIgVHJhbnNwb3NlIFRydW5jYXRlRGl2IFRydW5jYXRlTW9kIFRydW5jYXRlZE5vcm1hbCBVbnBhY2sgVW5zb3J0ZWRTZWdtZW50TWF4IFVuc29ydGVkU2VnbWVudE1pbiBVbnNvcnRlZFNlZ21lbnRQcm9kIFVuc29ydGVkU2VnbWVudFN1bSBWYXJJc0luaXRpYWxpemVkT3AgVmFyaWFibGVTaGFwZSBXaGlsZSBYbGFEeW5hbWljVXBkYXRlU2xpY2UgWGxhSG9zdENvbXB1dGUgWGxhSWYgWGxhUmVjdiBYbGFSZWR1Y2VXaW5kb3cgWGxhU2VuZCBYbGFTb3J0IFhsYVdoaWxlIFplcm9zTGlrZSBFbnRlciBFeGl0IExvb3BDb25kIE1lcmdlIE5leHRJdGVyYXRpb24gU3dpdGNoIF9BcmcgX1BhcmFsbGVsQ29uY2F0VXBkYXRlIF9SZXR2YWwgX1RQVUNvbXBpbGUgX1RQVUV4ZWN1dGUgVFBVQ29tcGlsYXRpb25SZXN1bHQgVFBVUmVwbGljYXRlZElucHV0IFRQVVJlcGxpY2F0ZWRPdXRwdXQgVFBVUmVwbGljYXRlTWV0YWRhdGEgTWVyZ2VWMkNoZWNrcG9pbnRzIFJlc3RvcmVWMiBTYXZlVjIgQWJvcnQgQXNzZXJ0IEFzc2lnbiBQbGFjZWhvbGRlciBQbGFjZWhvbGRlclYyIFNoYXJkZWRGaWxlbmFtZSBTdHJpbmdKb2luIFZhcmlhYmxlIFZhcmlhYmxlVjIgVmFySGFuZGxlT3AgQXVkaW9TdW1tYXJ5IEF1ZGlvU3VtbWFyeVYyIERlYnVnTnVtZXJpY1N1bW1hcnkgSGlzdG9ncmFtU3VtbWFyeSBJbWFnZVN1bW1hcnkgTWVyZ2VTdW1tYXJ5IFNjYWxhclN1bW1hcnkgU3RhdHNBZ2dyZWdhdG9yU3VtbWFyeSIuc3BsaXQoIiAiKTsKZC5UcHVDb21wYXRpYmlsaXR5UHJvdmlkZXI9ZjtkLmNoZWNrT3BzRm9yQ29tcGF0aWJpbGl0eT1mdW5jdGlvbihnLGwpe2lmKG51bGw9PT1sKXRocm93IEVycm9yKCJDb21wYXRpYmlsaXR5IHByb3ZpZGVyIHJlcXVpcmVkLCBidXQgZ290OiAiK2wpO18uZWFjaChnLm5vZGVzLGs9PntrLmNvbXBhdGlibGU9bC5vcFZhbGlkKGspO18uZWFjaChrLmluRW1iZWRkaW5ncyxuPT57bi5jb21wYXRpYmxlPWwub3BWYWxpZChuKX0pO18uZWFjaChrLm91dEVtYmVkZGluZ3Msbj0+e24uY29tcGF0aWJsZT1sLm9wVmFsaWQobil9KX0pfX0pKGMub3B8fChjLm9wPXt9KSl9KShhLmdyYXBofHwoYS5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9wYXJzZXIuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7ZnVuY3Rpb24gZih0KXtpZigidHJ1ZSI9PT10KXJldHVybiEwO2lmKCJmYWxzZSI9PT10KXJldHVybiExO2lmKCciJz09PXRbMF0pcmV0dXJuIHQuc3Vic3RyaW5nKDEsdC5sZW5ndGgtMSk7bGV0IHY9cGFyc2VGbG9hdCh0KTtyZXR1cm4gaXNOYU4odik/dDp2fWZ1bmN0aW9uIGcodCl7cmV0dXJuIG5ldyBQcm9taXNlKCh2LHkpPT57ZmV0Y2godCkudGhlbih6PT57ei5vaz96LmFycmF5QnVmZmVyKCkudGhlbih2LHkpOnoudGV4dCgpLnRoZW4oeSx5KX0pfSl9ZnVuY3Rpb24gbCh0LHYseT0xRTYsej0iXG4iKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oeCxDKXtmdW5jdGlvbiBGKEQsQixJKXt2YXIgTz1JPj10LmJ5dGVMZW5ndGg7Qj1CLnNwbGl0KHopO0JbMF09RCtCWzBdO2NvbnN0IFA9Tz8iIjpCLnBvcCgpO2ZvcihsZXQgSCBvZiBCKXRyeXt2KEgpfWNhdGNoKEspe0MoSyk7cmV0dXJufU8/eCghMCk6CihEPW5ldyBCbG9iKFt0LnNsaWNlKEksSSt5KV0pLE89bmV3IEZpbGVSZWFkZXIsTy5vbmxvYWQ9ZnVuY3Rpb24oSCl7RihQLEgudGFyZ2V0LnJlc3VsdCxJK3kpfSxPLnJlYWRBc1RleHQoRCkpfUYoIiIsIiIsMCl9KX1mdW5jdGlvbiBrKHQpe3JldHVybiBwKHQscSl9ZnVuY3Rpb24gbih0KXtyZXR1cm4gcCh0LHIpLnRoZW4odj0+di5zdGVwX3N0YXRzKX1mdW5jdGlvbiBwKHQsdil7ZnVuY3Rpb24geShCKXtsZXQgST1CLmluZGV4T2YoIjoiKSxPPUIuc3Vic3RyaW5nKDAsSSkudHJpbSgpO0I9ZihCLnN1YnN0cmluZyhJKzIpLnRyaW0oKSk7cmV0dXJue25hbWU6Tyx2YWx1ZTpCfX1mdW5jdGlvbiB6KEIsSSxPLFApe2xldCBIPUJbSV07bnVsbD09SD9CW0ldPVAuam9pbigiLiIpaW4gdj9bT106TzpBcnJheS5pc0FycmF5KEgpP0gucHVzaChPKTpCW0ldPVtILE9dfWxldCB4PXt9LEM9W10sRj1bXSxEPXg7cmV0dXJuIGwodCxmdW5jdGlvbihCKXtpZihCKXN3aXRjaChCPUIudHJpbSgpLApCW0IubGVuZ3RoLTFdKXtjYXNlICJ7IjpCPUIuc3Vic3RyaW5nKDAsQi5sZW5ndGgtMikudHJpbSgpO2xldCBJPXt9O0MucHVzaChEKTtGLnB1c2goQik7eihELEIsSSxGKTtEPUk7YnJlYWs7Y2FzZSAifSI6RD1DLnBvcCgpO0YucG9wKCk7YnJlYWs7ZGVmYXVsdDpCPXkoQikseihELEIubmFtZSxCLnZhbHVlLEYuY29uY2F0KEIubmFtZSkpfX0pLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4geH0pfWQuZmV0Y2hQYlR4dD1nO2QuZmV0Y2hBbmRQYXJzZU1ldGFkYXRhPWZ1bmN0aW9uKHQsdil7cmV0dXJuIGEuZ3JhcGgudXRpbC5ydW5UYXNrKCJSZWFkaW5nIG1ldGFkYXRhIHBidHh0Iiw0MCwoKT0+bnVsbD09dD9Qcm9taXNlLnJlc29sdmUobnVsbCk6Zyh0KSx2KS50aGVuKHk9PmEuZ3JhcGgudXRpbC5ydW5Bc3luY1Byb21pc2VUYXNrKCJQYXJzaW5nIG1ldGFkYXRhLnBidHh0Iiw2MCwoKT0+bnVsbCE9eT9uKHkpOlByb21pc2UucmVzb2x2ZShudWxsKSx2KSl9O2QuZmV0Y2hBbmRQYXJzZUdyYXBoRGF0YT0KZnVuY3Rpb24odCx2LHkpe3JldHVybiBhLmdyYXBoLnV0aWwucnVuQXN5bmNQcm9taXNlVGFzaygiUmVhZGluZyBncmFwaCBwYnR4dCIsNDAsKCk9PnY/bmV3IFByb21pc2UoZnVuY3Rpb24oeix4KXtsZXQgQz1uZXcgRmlsZVJlYWRlcjtDLm9ubG9hZD0oKT0+eihDLnJlc3VsdCk7Qy5vbmVycm9yPSgpPT54KEMuZXJyb3IpO0MucmVhZEFzQXJyYXlCdWZmZXIodil9KTpnKHQpLHkpLnRoZW4oej0+YS5ncmFwaC51dGlsLnJ1bkFzeW5jUHJvbWlzZVRhc2soIlBhcnNpbmcgZ3JhcGgucGJ0eHQiLDYwLCgpPT5rKHopLHkpKX07ZC5zdHJlYW1QYXJzZT1sO2NvbnN0IHE9eyJsaWJyYXJ5LmZ1bmN0aW9uIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZiI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuaW5wdXQiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5iIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QuZiI6ITAsCiJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5mdW5jIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QuaSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnMiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5zaGFwZSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnNoYXBlLmRpbSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnRlbnNvciI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnR5cGUiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUuc2hhcGUuZGltIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLnRlbnNvci5zdHJpbmdfdmFsIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLnRlbnNvci50ZW5zb3Jfc2hhcGUuZGltIjohMCwKImxpYnJhcnkuZnVuY3Rpb24uc2lnbmF0dXJlLmlucHV0X2FyZyI6ITAsImxpYnJhcnkuZnVuY3Rpb24uc2lnbmF0dXJlLm91dHB1dF9hcmciOiEwLCJsaWJyYXJ5LnZlcnNpb25zIjohMCxub2RlOiEwLCJub2RlLmlucHV0IjohMCwibm9kZS5hdHRyIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QuYiI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LmYiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5mdW5jIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QuaSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnMiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5zaGFwZSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnNoYXBlLmRpbSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnRlbnNvciI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnR5cGUiOiEwLCJub2RlLmF0dHIudmFsdWUuc2hhcGUuZGltIjohMCwibm9kZS5hdHRyLnZhbHVlLnRlbnNvci5zdHJpbmdfdmFsIjohMCwibm9kZS5hdHRyLnZhbHVlLnRlbnNvci50ZW5zb3Jfc2hhcGUuZGltIjohMH0sCnI9eyJzdGVwX3N0YXRzLmRldl9zdGF0cyI6ITAsInN0ZXBfc3RhdHMuZGV2X3N0YXRzLm5vZGVfc3RhdHMiOiEwLCJzdGVwX3N0YXRzLmRldl9zdGF0cy5ub2RlX3N0YXRzLm91dHB1dCI6ITAsInN0ZXBfc3RhdHMuZGV2X3N0YXRzLm5vZGVfc3RhdHMubWVtb3J5IjohMCwic3RlcF9zdGF0cy5kZXZfc3RhdHMubm9kZV9zdGF0cy5vdXRwdXQudGVuc29yX2Rlc2NyaXB0aW9uLnNoYXBlLmRpbSI6ITB9O2QucGFyc2VHcmFwaFBiVHh0PWs7ZC5wYXJzZVN0YXRzUGJUeHQ9bn0pKGMucGFyc2VyfHwoYy5wYXJzZXI9e30pKX0pKGEuZ3JhcGh8fChhLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3Byb3RvLmpzCgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3JlbmRlci5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXtmdW5jdGlvbiBmKEwsUixVLFksYmEpe1I9bmV3IEkoUixVLFksYmEsITApO0wuaW5Bbm5vdGF0aW9ucy5wdXNoKFIpfWZ1bmN0aW9uIGcoTCxSLFUsWSxiYSl7Uj1uZXcgSShSLFUsWSxiYSwhMSk7TC5vdXRBbm5vdGF0aW9ucy5wdXNoKFIpfWZ1bmN0aW9uIGwoTCxSKXtfLmVhY2goTC5ub2RlcygpLFU9PntVPUwubm9kZShVKTtVLmV4cGFuZGVkPTE8UjtpZigwPFIpc3dpdGNoKFUubm9kZS50eXBlKXtjYXNlIGMuTm9kZVR5cGUuTUVUQTpjYXNlIGMuTm9kZVR5cGUuU0VSSUVTOmsoVSxSLTEpfX0pfWZ1bmN0aW9uIGsoTCxSKXtMLmNvcmVHcmFwaCYmbChMLmNvcmVHcmFwaCxSKX1mdW5jdGlvbiBuKEwsUixVKXtsZXQgWT1MLm5vZGUoUiksYmE9TC5ub2RlKFUpLG1hPUwuZWRnZShSLFUpO2lmKFkubm9kZS5pbmNsdWRlIT09Yy5JbmNsdXNpb25UeXBlLklOQ0xVREUmJmJhLm5vZGUuaW5jbHVkZSE9PWMuSW5jbHVzaW9uVHlwZS5JTkNMVURFfHwKWS5ub2RlLmluY2x1ZGU9PT1jLkluY2x1c2lvblR5cGUuRVhDTFVERXx8YmEubm9kZS5pbmNsdWRlPT09Yy5JbmNsdXNpb25UeXBlLkVYQ0xVREUpZyhZLGJhLm5vZGUsYmEsbWEsTy5TSE9SVENVVCksZihiYSxZLm5vZGUsWSxtYSxPLlNIT1JUQ1VUKSxMLnJlbW92ZUVkZ2UoUixVKX1mdW5jdGlvbiBwKEwsUixVKXtsZXQgWT1MLmNvcmVHcmFwaCxiYT1ZLm5vZGUoUik7YmEuaXNPdXRFeHRyYWN0PSEwO18uZWFjaChZLnByZWRlY2Vzc29ycyhSKSxtYT0+e24oWSxtYSxSKX0pOyhGLmRldGFjaEFsbEVkZ2VzRm9ySGlnaERlZ3JlZXx8VSkmJl8uZWFjaChZLnN1Y2Nlc3NvcnMoUiksbWE9PntuKFksUixtYSl9KTswPT09WS5uZWlnaGJvcnMoUikubGVuZ3RoJiYoYmEubm9kZS5pbmNsdWRlPWMuSW5jbHVzaW9uVHlwZS5FWENMVURFLEwuaXNvbGF0ZWRPdXRFeHRyYWN0LnB1c2goYmEpLFkucmVtb3ZlTm9kZShSKSl9ZnVuY3Rpb24gcShMLFIsVSl7bGV0IFk9TC5jb3JlR3JhcGgsYmE9Clkubm9kZShSKTtiYS5pc0luRXh0cmFjdD0hMDtfLmVhY2goWS5zdWNjZXNzb3JzKFIpLG1hPT57bihZLFIsbWEpfSk7KEYuZGV0YWNoQWxsRWRnZXNGb3JIaWdoRGVncmVlfHxVKSYmXy5lYWNoKFkucHJlZGVjZXNzb3JzKFIpLG1hPT57bihZLG1hLFIpfSk7MD09PVkubmVpZ2hib3JzKFIpLmxlbmd0aCYmKGJhLm5vZGUuaW5jbHVkZT1jLkluY2x1c2lvblR5cGUuRVhDTFVERSxMLmlzb2xhdGVkSW5FeHRyYWN0LnB1c2goYmEpLFkucmVtb3ZlTm9kZShSKSl9ZnVuY3Rpb24gcihMLFIpe2lmKEwudHlwZT09PWMuTm9kZVR5cGUuT1ApZm9yKHZhciBVPTA7VTxSLmxlbmd0aDtVKyspe2lmKEwub3A9PT1SW1VdKXJldHVybiEwfWVsc2UgaWYoTC50eXBlPT09Yy5Ob2RlVHlwZS5NRVRBJiYoTD1MLmdldFJvb3RPcCgpKSlmb3IoVT0wO1U8Ui5sZW5ndGg7VSsrKWlmKEwub3A9PT1SW1VdKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIHQoTCl7bGV0IFI9TC5jb3JlR3JhcGg7Xy5lYWNoKFIubm9kZXMoKSwKVT0+e1Iubm9kZShVKS5ub2RlLmluY2x1ZGUhPT1jLkluY2x1c2lvblR5cGUuRVhDTFVERXx8VS5zdGFydHNXaXRoKGEuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCl8fChMLmNvcmVHcmFwaC5vdXRFZGdlcyhVKS5sZW5ndGg+TC5jb3JlR3JhcGguaW5FZGdlcyhVKS5sZW5ndGg/cChMLFUsITApOnEoTCxVLCEwKSl9KX1mdW5jdGlvbiB2KEwpe2xldCBSPUwuY29yZUdyYXBoO18uZWFjaChSLm5vZGVzKCksVT0+e2xldCBZPVIubm9kZShVKTtZLm5vZGUuaW5jbHVkZT09PWMuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCYmcihZLm5vZGUsRi5vdXRFeHRyYWN0VHlwZXMpJiZwKEwsVSl9KX1mdW5jdGlvbiB5KEwpe2xldCBSPUwuY29yZUdyYXBoO18uZWFjaChSLm5vZGVzKCksVT0+e2xldCBZPVIubm9kZShVKTtZLm5vZGUuaW5jbHVkZT09PWMuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCYmcihZLm5vZGUsRi5pbkV4dHJhY3RUeXBlcykmJnEoTCxVKX0pfWZ1bmN0aW9uIHooTCl7bGV0IFI9CkwuY29yZUdyYXBoLFU9e30sWT17fSxiYT0wO18uZWFjaChSLm5vZGVzKCksbGE9PntpZihSLm5vZGUobGEpLm5vZGUuaW5jbHVkZT09PWMuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCl7dmFyIFo9Xy5yZWR1Y2UoUi5wcmVkZWNlc3NvcnMobGEpLCh4YSx5YSk9Pnt5YT1SLmVkZ2UoeWEsbGEpLm1ldGFlZGdlO3JldHVybiB4YSsoeWEubnVtUmVndWxhckVkZ2VzPzE6MCl9LDApOzA9PT1aJiYwPFIucHJlZGVjZXNzb3JzKGxhKS5sZW5ndGgmJihaPVIucHJlZGVjZXNzb3JzKGxhKS5sZW5ndGgpO3ZhciBGYT1fLnJlZHVjZShSLnN1Y2Nlc3NvcnMobGEpLCh4YSx5YSk9Pnt5YT1SLmVkZ2UobGEseWEpLm1ldGFlZGdlO3JldHVybiB4YSsoeWEubnVtUmVndWxhckVkZ2VzPzE6MCl9LDApOzA9PT1GYSYmMDxSLnN1Y2Nlc3NvcnMobGEpLmxlbmd0aCYmKEZhPVIuc3VjY2Vzc29ycyhsYSkubGVuZ3RoKTtVW2xhXT1aO1lbbGFdPUZhO2JhKyt9fSk7aWYoIShiYTxGLm1pbk5vZGVDb3VudEZvckV4dHJhY3Rpb24pKXt2YXIgbWE9CkYubWluRGVncmVlRm9yRXh0cmFjdGlvbi0xLGFhPU1hdGgucm91bmQoLjc1KmJhKSxjYT1NYXRoLnJvdW5kKC4yNSpiYSksZmE9T2JqZWN0LmtleXMoVSkuc29ydCgobGEsWik9PlVbbGFdLVVbWl0pLGRhPVVbZmFbYWFdXTtkYT1kYStkYS1VW2ZhW2NhXV07ZGE9TWF0aC5tYXgoZGEsbWEpO2ZvcihsZXQgbGE9YmEtMTtVW2ZhW2xhXV0+ZGE7bGEtLSlxKEwsZmFbbGFdKTtmYT1PYmplY3Qua2V5cyhZKS5zb3J0KChsYSxaKT0+WVtsYV0tWVtaXSk7YWE9WVtmYVthYV1dO2NhPWFhKzQqKGFhLVlbZmFbY2FdXSk7Y2E9TWF0aC5tYXgoY2EsbWEpO2ZvcihtYT1iYS0xO1lbZmFbbWFdXT5jYTttYS0tKShhYT1SLm5vZGUoZmFbbWFdKSkmJiFhYS5pc0luRXh0cmFjdCYmcChMLGZhW21hXSl9fWZ1bmN0aW9uIHgoTCl7bGV0IFI9TC5jb3JlR3JhcGgsVT17fTtfLmVhY2goUi5lZGdlcygpLFk9PntSLmVkZ2UoWSkubWV0YWVkZ2UubnVtUmVndWxhckVkZ2VzfHwoKFVbWS52XT1VW1kudl18fApbXSkucHVzaChZKSwoVVtZLnddPVVbWS53XXx8W10pLnB1c2goWSkpfSk7Xy5lYWNoKFUsWT0+e1kubGVuZ3RoPkYubWF4Q29udHJvbERlZ3JlZSYmXy5lYWNoKFksYmE9Pm4oUixiYS52LGJhLncpKX0pfWZ1bmN0aW9uIEMoTCl7dChMKTtGLm91dEV4dHJhY3RUeXBlcyYmdihMKTtGLmluRXh0cmFjdFR5cGVzJiZ5KEwpO3ooTCk7Ri5tYXhDb250cm9sRGVncmVlJiZ4KEwpO2xldCBSPUwuY29yZUdyYXBoO18uZWFjaChSLm5vZGVzKCksVT0+e2xldCBZPVIubm9kZShVKTt2YXIgYmE9Ui5uZWlnaGJvcnMoVSkubGVuZ3RoO2lmKFkubm9kZS5pbmNsdWRlPT09Yy5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEJiYwPT09YmEpe2JhPTA8WS5vdXRBbm5vdGF0aW9ucy5saXN0Lmxlbmd0aDtsZXQgbWE9MDxZLmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGg7WS5pc0luRXh0cmFjdD8oTC5pc29sYXRlZEluRXh0cmFjdC5wdXNoKFkpLFkubm9kZS5pbmNsdWRlPWMuSW5jbHVzaW9uVHlwZS5FWENMVURFLApSLnJlbW92ZU5vZGUoVSkpOlkuaXNPdXRFeHRyYWN0PyhMLmlzb2xhdGVkT3V0RXh0cmFjdC5wdXNoKFkpLFkubm9kZS5pbmNsdWRlPWMuSW5jbHVzaW9uVHlwZS5FWENMVURFLFIucmVtb3ZlTm9kZShVKSk6Ri5leHRyYWN0SXNvbGF0ZWROb2Rlc1dpdGhBbm5vdGF0aW9uc09uT25lU2lkZSYmKGJhJiYhbWE/KFkuaXNJbkV4dHJhY3Q9ITAsTC5pc29sYXRlZEluRXh0cmFjdC5wdXNoKFkpLFkubm9kZS5pbmNsdWRlPWMuSW5jbHVzaW9uVHlwZS5FWENMVURFLFIucmVtb3ZlTm9kZShVKSk6bWEmJiFiYSYmKFkuaXNPdXRFeHRyYWN0PSEwLEwuaXNvbGF0ZWRPdXRFeHRyYWN0LnB1c2goWSksWS5ub2RlLmluY2x1ZGU9Yy5JbmNsdXNpb25UeXBlLkVYQ0xVREUsUi5yZW1vdmVOb2RlKFUpKSl9fSl9ZC5PcE5vZGVDb2xvcnM9e0RFRkFVTFRfRklMTDoiI2ZmZmZmZiIsREVGQVVMVF9TVFJPS0U6IiNiMmIyYjIiLENPTVBBVElCTEU6IiMwZjlkNTgiLElOQ09NUEFUSUJMRToiI2RiNDQzNyJ9OwpkLk1ldGFub2RlQ29sb3JzPXtERUZBVUxUX0ZJTEw6IiNkOWQ5ZDkiLERFRkFVTFRfU1RST0tFOiIjYTZhNmE2IixTQVRVUkFUSU9OOi42LExJR0hUTkVTUzouODUsRVhQQU5ERURfQ09MT1I6IiNmMGYwZjAiLEhVRVM6WzIyMCwxMDAsMTgwLDQwLDIwLDM0MCwyNjAsMzAwLDE0MCw2MF0sU1RSVUNUVVJFX1BBTEVUVEUoTCxSKXt2YXIgVT1kLk1ldGFub2RlQ29sb3JzLkhVRVM7TD1VW0wlVS5sZW5ndGhdO1U9TWF0aC5zaW4oTCpNYXRoLlBJLzM2MCk7cmV0dXJuIGQzLmhzbChMLC4wMSooUj8zMDo5MC02MCpVKSwuMDEqKFI/OTU6ODApKS50b1N0cmluZygpfSxERVZJQ0VfUEFMRVRURShMKXtyZXR1cm4gZC5NZXRhbm9kZUNvbG9ycy5TVFJVQ1RVUkVfUEFMRVRURShMKX0sWExBX0NMVVNURVJfUEFMRVRURShMKXtyZXR1cm4gZC5NZXRhbm9kZUNvbG9ycy5TVFJVQ1RVUkVfUEFMRVRURShMKX0sVU5LTk9XTjoiI2VlZSIsR1JBRElFTlRfT1VUTElORToiIzg4OCJ9O2QuU2VyaWVzTm9kZUNvbG9ycz0Ke0RFRkFVTFRfRklMTDoid2hpdGUiLERFRkFVTFRfU1RST0tFOiIjYjJiMmIyIn07Y29uc3QgRj17ZW5hYmxlRXh0cmFjdGlvbjohMCxtaW5Ob2RlQ291bnRGb3JFeHRyYWN0aW9uOjE1LG1pbkRlZ3JlZUZvckV4dHJhY3Rpb246NSxtYXhDb250cm9sRGVncmVlOjQsbWF4QnJpZGdlUGF0aERlZ3JlZTo0LG91dEV4dHJhY3RUeXBlczpbIk5vT3AiXSxpbkV4dHJhY3RUeXBlczpbXSxkZXRhY2hBbGxFZGdlc0ZvckhpZ2hEZWdyZWU6ITAsZXh0cmFjdElzb2xhdGVkTm9kZXNXaXRoQW5ub3RhdGlvbnNPbk9uZVNpZGU6ITAsZW5hYmxlQnJpZGdlZ3JhcGg6ITAsbWluTWF4Q29sb3JzOlsiI2ZmZjVmMCIsIiNmYjZhNGEiXSxtYXhBbm5vdGF0aW9uczo1fSxEPW5ldyBSZWdFeHAoIl4oPzoiK2EuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCsiKT8oXFx3KylfW2EtejAtOV17OH0oPzpfXFxkKyk/JCIpO2NsYXNzIEJ7Y29uc3RydWN0b3IoTCxSKXt0aGlzLmhpZXJhcmNoeT1MOwp0aGlzLmRpc3BsYXlpbmdTdGF0cz1SO3RoaXMuaW5kZXg9e307dGhpcy5yZW5kZXJlZE9wTmFtZXM9W107dGhpcy5jb21wdXRlU2NhbGVzKCk7dGhpcy5oYXNTdWJoaWVyYXJjaHk9e307dGhpcy5yb290PW5ldyBNKEwucm9vdCxMLmdyYXBoT3B0aW9ucyk7dGhpcy5pbmRleFtMLnJvb3QubmFtZV09dGhpcy5yb290O3RoaXMucmVuZGVyZWRPcE5hbWVzLnB1c2goTC5yb290Lm5hbWUpO3RoaXMuYnVpbGRTdWJoaWVyYXJjaHkoTC5yb290Lm5hbWUpO3RoaXMucm9vdC5leHBhbmRlZD0hMDt0aGlzLnRyYWNlSW5wdXRzPSExfWNvbXB1dGVTY2FsZXMoKXt0aGlzLmRldmljZUNvbG9yTWFwPWQzLnNjYWxlT3JkaW5hbCgpLmRvbWFpbih0aGlzLmhpZXJhcmNoeS5kZXZpY2VzKS5yYW5nZShfLm1hcChkMy5yYW5nZSh0aGlzLmhpZXJhcmNoeS5kZXZpY2VzLmxlbmd0aCksZC5NZXRhbm9kZUNvbG9ycy5ERVZJQ0VfUEFMRVRURSkpO3RoaXMueGxhQ2x1c3RlckNvbG9yTWFwPWQzLnNjYWxlT3JkaW5hbCgpLmRvbWFpbih0aGlzLmhpZXJhcmNoeS54bGFDbHVzdGVycykucmFuZ2UoXy5tYXAoZDMucmFuZ2UodGhpcy5oaWVyYXJjaHkueGxhQ2x1c3RlcnMubGVuZ3RoKSwKZC5NZXRhbm9kZUNvbG9ycy5YTEFfQ0xVU1RFUl9QQUxFVFRFKSk7bGV0IEw9dGhpcy5oaWVyYXJjaHkucm9vdC5tZXRhZ3JhcGg7dmFyIFI9ZDMubWF4KEwubm9kZXMoKSxVPT57VT1MLm5vZGUoVSk7aWYobnVsbCE9VS5zdGF0cylyZXR1cm4gVS5zdGF0cy50b3RhbEJ5dGVzfSk7dGhpcy5tZW1vcnlVc2FnZVNjYWxlPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLFJdKS5yYW5nZShGLm1pbk1heENvbG9ycyk7Uj1kMy5tYXgoTC5ub2RlcygpLFU9PntVPUwubm9kZShVKTtpZihudWxsIT1VLnN0YXRzKXJldHVybiBVLnN0YXRzLmdldFRvdGFsTWljcm9zKCl9KTt0aGlzLmNvbXB1dGVUaW1lU2NhbGU9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzAsUl0pLnJhbmdlKEYubWluTWF4Q29sb3JzKTt0aGlzLmVkZ2VXaWR0aFNpemVkQmFzZWRTY2FsZT10aGlzLmhpZXJhcmNoeS5oYXNTaGFwZUluZm8/Yy5zY2VuZS5lZGdlLkVER0VfV0lEVEhfU0laRV9CQVNFRF9TQ0FMRTpkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMSwKdGhpcy5oaWVyYXJjaHkubWF4TWV0YUVkZ2VTaXplXSkucmFuZ2UoW2Muc2NlbmUuZWRnZS5NSU5fRURHRV9XSURUSCxjLnNjZW5lLmVkZ2UuTUFYX0VER0VfV0lEVEhdKX1nZXRSZW5kZXJOb2RlQnlOYW1lKEwpe3JldHVybiB0aGlzLmluZGV4W0xdfWdldE5vZGVCeU5hbWUoTCl7cmV0dXJuIHRoaXMuaGllcmFyY2h5Lm5vZGUoTCl9Y29sb3JIaXN0b2dyYW0oTCxSKXtpZigwPE9iamVjdC5rZXlzKEwpLmxlbmd0aCl7Y29uc3QgVT1fLnN1bShPYmplY3Qua2V5cyhMKS5tYXAoWT0+TFtZXSkpO3JldHVybiBPYmplY3Qua2V5cyhMKS5tYXAoWT0+KHtjb2xvcjpSKFkpLHByb3BvcnRpb246TFtZXS9VfSkpfWNvbnNvbGUuaW5mbygibm8gcGFpcnMgZm91bmQhIik7cmV0dXJuIG51bGx9Z2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKEwpe2lmKCFMKXJldHVybiBudWxsO2lmKEwgaW4gdGhpcy5pbmRleClyZXR1cm4gdGhpcy5pbmRleFtMXTt2YXIgUj10aGlzLmhpZXJhcmNoeS5ub2RlKEwpOwppZighUilyZXR1cm4gbnVsbDtsZXQgVT1SLmlzR3JvdXBOb2RlP25ldyBNKFIsdGhpcy5oaWVyYXJjaHkuZ3JhcGhPcHRpb25zKTpuZXcgSChSKTt0aGlzLmluZGV4W0xdPVU7dGhpcy5yZW5kZXJlZE9wTmFtZXMucHVzaChMKTtSLnN0YXRzJiYoVS5tZW1vcnlDb2xvcj10aGlzLm1lbW9yeVVzYWdlU2NhbGUoUi5zdGF0cy50b3RhbEJ5dGVzKSxVLmNvbXB1dGVUaW1lQ29sb3I9dGhpcy5jb21wdXRlVGltZVNjYWxlKFIuc3RhdHMuZ2V0VG90YWxNaWNyb3MoKSkpO1UuaXNGYWRlZE91dD10aGlzLmRpc3BsYXlpbmdTdGF0cyYmIWEuZ3JhcGgudXRpbC5oYXNEaXNwbGF5YWJsZU5vZGVTdGF0cyhSLnN0YXRzKTt2YXIgWT1udWxsLGJhPW51bGwsbWE9bnVsbDtpZihSLmlzR3JvdXBOb2RlKXtZPVIuZGV2aWNlSGlzdG9ncmFtO2JhPVIueGxhQ2x1c3Rlckhpc3RvZ3JhbTt2YXIgYWE9Ui5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU7Uj1SLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlOwppZigwIT1hYXx8MCE9UiltYT1hYS8oYWErUil9ZWxzZShhYT1VLm5vZGUuZGV2aWNlKSYmKFk9e1thYV06MX0pLChhYT1VLm5vZGUueGxhQ2x1c3RlcikmJihiYT17W2FhXToxfSksVS5ub2RlLnR5cGU9PT1jLk5vZGVUeXBlLk9QJiYobWE9VS5ub2RlLmNvbXBhdGlibGU/MTowKTtZJiYoVS5kZXZpY2VDb2xvcnM9dGhpcy5jb2xvckhpc3RvZ3JhbShZLHRoaXMuZGV2aWNlQ29sb3JNYXApKTtiYSYmKFUueGxhQ2x1c3RlckNvbG9ycz10aGlzLmNvbG9ySGlzdG9ncmFtKGJhLHRoaXMueGxhQ2x1c3RlckNvbG9yTWFwKSk7bnVsbCE9bWEmJihVLmNvbXBhdGliaWxpdHlDb2xvcnM9W3tjb2xvcjphLmdyYXBoLnJlbmRlci5PcE5vZGVDb2xvcnMuQ09NUEFUSUJMRSxwcm9wb3J0aW9uOm1hfSx7Y29sb3I6YS5ncmFwaC5yZW5kZXIuT3BOb2RlQ29sb3JzLklOQ09NUEFUSUJMRSxwcm9wb3J0aW9uOjEtbWF9XSk7cmV0dXJuIHRoaXMuaW5kZXhbTF19Z2V0TmVhcmVzdFZpc2libGVBbmNlc3RvcihMKXt2YXIgUj0KYy5nZXRIaWVyYXJjaGljYWxQYXRoKEwpO2xldCBVPTAsWT1udWxsO2Zvcig7VTxSLmxlbmd0aCYmKEw9UltVXSxZPXRoaXMuZ2V0UmVuZGVyTm9kZUJ5TmFtZShMKSxZLmV4cGFuZGVkKTtVKyspO3JldHVybiBVPT1SLmxlbmd0aC0yJiYoUj1SW1UrMV0sWS5pbkFubm90YXRpb25zLm5vZGVOYW1lc1tSXXx8WS5vdXRBbm5vdGF0aW9ucy5ub2RlTmFtZXNbUl0pP1I6TH1zZXREZXB0aChMKXtrKHRoaXMucm9vdCwrTCl9aXNOb2RlQXV4aWxpYXJ5KEwpe2xldCBSPXRoaXMuZ2V0UmVuZGVyTm9kZUJ5TmFtZShMLm5vZGUucGFyZW50Tm9kZS5uYW1lKSxVPV8uZmluZChSLmlzb2xhdGVkSW5FeHRyYWN0LFk9Plkubm9kZS5uYW1lPT09TC5ub2RlLm5hbWUpO2lmKFUpcmV0dXJuITA7VT1fLmZpbmQoUi5pc29sYXRlZE91dEV4dHJhY3QsWT0+WS5ub2RlLm5hbWU9PT1MLm5vZGUubmFtZSk7cmV0dXJuISFVfWdldE5hbWVzT2ZSZW5kZXJlZE9wcygpe3JldHVybiB0aGlzLnJlbmRlcmVkT3BOYW1lc31jbG9uZUFuZEFkZEZ1bmN0aW9uT3BOb2RlKEwsClIsVSxZKXt2YXIgYmE9VS5uYW1lLnJlcGxhY2UoUixZKTtsZXQgbWE9TC5tZXRhZ3JhcGgubm9kZShiYSk7aWYobWEpcmV0dXJuIG1hO21hPW5ldyBjLk9wTm9kZUltcGwoe25hbWU6YmEsaW5wdXQ6W10sZGV2aWNlOlUuZGV2aWNlLG9wOlUub3AsYXR0cjpfLmNsb25lRGVlcChVLmF0dHIpfSk7bWEuY2FyZGluYWxpdHk9VS5jYXJkaW5hbGl0eTttYS5pbmNsdWRlPVUuaW5jbHVkZTttYS5vdXRwdXRTaGFwZXM9Xy5jbG9uZURlZXAoVS5vdXRwdXRTaGFwZXMpO21hLnhsYUNsdXN0ZXI9VS54bGFDbHVzdGVyO21hLmZ1bmN0aW9uSW5wdXRJbmRleD1VLmZ1bmN0aW9uSW5wdXRJbmRleDttYS5mdW5jdGlvbk91dHB1dEluZGV4PVUuZnVuY3Rpb25PdXRwdXRJbmRleDttYS5pbnB1dHM9VS5pbnB1dHMubWFwKGFhPT57Y29uc3QgY2E9Xy5jbG9uZShhYSk7Y2EubmFtZT1hYS5uYW1lLnJlcGxhY2UoUixZKTtyZXR1cm4gY2F9KTttYS5wYXJlbnROb2RlPUw7TC5tZXRhZ3JhcGguc2V0Tm9kZShtYS5uYW1lLAptYSk7dGhpcy5oaWVyYXJjaHkuc2V0Tm9kZShtYS5uYW1lLG1hKTtiYT1hYT0+dGhpcy5jbG9uZUFuZEFkZEZ1bmN0aW9uT3BOb2RlKEwsUixhYSxZKTttYS5pbkVtYmVkZGluZ3M9VS5pbkVtYmVkZGluZ3MubWFwKGJhKTttYS5vdXRFbWJlZGRpbmdzPVUub3V0RW1iZWRkaW5ncy5tYXAoYmEpO3JldHVybiBtYX1jbG9uZUZ1bmN0aW9uTGlicmFyeU1ldGFub2RlKEwsUixVLFksYmEpe2NvbnN0IG1hPXt9O0w9dGhpcy5jbG9uZUZ1bmN0aW9uTGlicmFyeU1ldGFub2RlSGVscGVyKEwsUixVLFksYmEsbWEpO18uaXNFbXB0eShtYSl8fHRoaXMucGF0Y2hFZGdlc0Zyb21GdW5jdGlvbk91dHB1dHMoUixtYSk7cmV0dXJuIEx9Y2xvbmVGdW5jdGlvbkxpYnJhcnlNZXRhbm9kZUhlbHBlcihMLFIsVSxZLGJhLG1hKXtjb25zdCBhYT1hLmdyYXBoLmNyZWF0ZU1ldGFub2RlKFUubmFtZS5yZXBsYWNlKFksYmEpKTthYS5kZXB0aD1VLmRlcHRoO2FhLmNhcmRpbmFsaXR5PVUuY2FyZGluYWxpdHk7CmFhLnRlbXBsYXRlSWQ9VS50ZW1wbGF0ZUlkO2FhLm9wSGlzdG9ncmFtPV8uY2xvbmUoVS5vcEhpc3RvZ3JhbSk7YWEuZGV2aWNlSGlzdG9ncmFtPV8uY2xvbmUoVS5kZXZpY2VIaXN0b2dyYW0pO2FhLnhsYUNsdXN0ZXJIaXN0b2dyYW09Xy5jbG9uZShVLnhsYUNsdXN0ZXJIaXN0b2dyYW0pO2FhLmhhc05vbkNvbnRyb2xFZGdlcz1VLmhhc05vbkNvbnRyb2xFZGdlczthYS5pbmNsdWRlPVUuaW5jbHVkZTthYS5ub2RlQXR0cmlidXRlcz1fLmNsb25lKFUubm9kZUF0dHJpYnV0ZXMpO2FhLmFzc29jaWF0ZWRGdW5jdGlvbj1VLmFzc29jaWF0ZWRGdW5jdGlvbjtfLmVhY2goVS5tZXRhZ3JhcGgubm9kZXMoKSxjYT0+e2NhPVUubWV0YWdyYXBoLm5vZGUoY2EpO3N3aXRjaChjYS50eXBlKXtjYXNlIGMuTm9kZVR5cGUuTUVUQTpjYT10aGlzLmNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGVIZWxwZXIoTCxSLGNhLFksYmEsbWEpO2NhLnBhcmVudE5vZGU9YWE7YWEubWV0YWdyYXBoLnNldE5vZGUoY2EubmFtZSwKY2EpO3RoaXMuaGllcmFyY2h5LnNldE5vZGUoY2EubmFtZSxjYSk7YnJlYWs7Y2FzZSBjLk5vZGVUeXBlLk9QOmNhPXRoaXMuY2xvbmVBbmRBZGRGdW5jdGlvbk9wTm9kZShhYSxZLGNhLGJhKTtfLmlzTnVtYmVyKGNhLmZ1bmN0aW9uSW5wdXRJbmRleCkmJnRoaXMucGF0Y2hFZGdlc0ludG9GdW5jdGlvbklucHV0cyhSLGNhKTtfLmlzTnVtYmVyKGNhLmZ1bmN0aW9uT3V0cHV0SW5kZXgpJiYobWFbY2EuZnVuY3Rpb25PdXRwdXRJbmRleF09Y2EpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKGNhLm5hbWUrIiBpcyBvZGRseSBuZWl0aGVyIGEgbWV0YW5vZGUgbm9yIGFuIG9wbm9kZS4iKX19KTt0aGlzLmNsb25lTGlicmFyeU1ldGFub2RlRWRnZXMoVSxhYSxZLGJhKTtyZXR1cm4gYWF9Y2xvbmVMaWJyYXJ5TWV0YW5vZGVFZGdlcyhMLFIsVSxZKXtfLmVhY2goTC5tZXRhZ3JhcGguZWRnZXMoKSxiYT0+e2JhPUwubWV0YWdyYXBoLmVkZ2UoYmEpO2NvbnN0IG1hPWJhLnYucmVwbGFjZShVLApZKSxhYT1iYS53LnJlcGxhY2UoVSxZKSxjYT1uZXcgYy5NZXRhZWRnZUltcGwobWEsYWEpO2NhLmluYm91bmQ9YmEuaW5ib3VuZDtjYS5udW1SZWd1bGFyRWRnZXM9YmEubnVtUmVndWxhckVkZ2VzO2NhLm51bUNvbnRyb2xFZGdlcz1iYS5udW1Db250cm9sRWRnZXM7Y2EubnVtUmVmRWRnZXM9YmEubnVtUmVmRWRnZXM7Y2EudG90YWxTaXplPWJhLnRvdGFsU2l6ZTtiYS5iYXNlRWRnZUxpc3QmJihjYS5iYXNlRWRnZUxpc3Q9YmEuYmFzZUVkZ2VMaXN0Lm1hcChmYT0+e2NvbnN0IGRhPV8uY2xvbmUoZmEpO2RhLnY9ZmEudi5yZXBsYWNlKFUsWSk7ZGEudz1mYS53LnJlcGxhY2UoVSxZKTtyZXR1cm4gZGF9KSk7Ui5tZXRhZ3JhcGgubm9kZShhYSk/Ui5tZXRhZ3JhcGguc2V0RWRnZShtYSxhYSxjYSk6Ui5tZXRhZ3JhcGguc2V0RWRnZShhYSxtYSxjYSl9KX1wYXRjaEVkZ2VzSW50b0Z1bmN0aW9uSW5wdXRzKEwsUil7bGV0IFU9TWF0aC5taW4oUi5mdW5jdGlvbklucHV0SW5kZXgsTC5pbnB1dHMubGVuZ3RoLQoxKTtmb3IodmFyIFk9Xy5jbG9uZShMLmlucHV0c1tVXSk7WS5pc0NvbnRyb2xEZXBlbmRlbmN5OylVKyssWT1MLmlucHV0c1tVXTtSLmlucHV0cy5wdXNoKFkpO1k9dGhpcy5oaWVyYXJjaHkuZ2V0UHJlZGVjZXNzb3JzKEwubmFtZSk7bGV0IGJhLG1hPTA7Xy5lYWNoKFkucmVndWxhcixhYT0+e21hKz1hYS5udW1SZWd1bGFyRWRnZXM7aWYobWE+VSlyZXR1cm4gYmE9YWEsITF9KTtfLmVhY2goYmEuYmFzZUVkZ2VMaXN0LGFhPT57YWEudz09PUwubmFtZSYmKGFhLnc9Ui5uYW1lKTthYS52PT09TC5uYW1lJiYoYWEudj1SLm5hbWUpfSl9cGF0Y2hFZGdlc0Zyb21GdW5jdGlvbk91dHB1dHMoTCxSKXtjb25zdCBVPXRoaXMuaGllcmFyY2h5LmdldFN1Y2Nlc3NvcnMoTC5uYW1lKTtfLmVhY2goVS5yZWd1bGFyLFk9PntfLmVhY2goWS5iYXNlRWRnZUxpc3QsYmE9Pntjb25zdCBtYT10aGlzLmhpZXJhcmNoeS5ub2RlKGJhLncpO18uZWFjaChtYS5pbnB1dHMsYWE9PnthYS5uYW1lPT09TC5uYW1lJiYKKGFhLm5hbWU9UlthYS5vdXRwdXRUZW5zb3JLZXldLm5hbWUsYWEub3V0cHV0VGVuc29yS2V5PWJhLm91dHB1dFRlbnNvcktleSl9KX0pO18uZWFjaChZLmJhc2VFZGdlTGlzdCxiYT0+e2JhLnY9UltiYS5vdXRwdXRUZW5zb3JLZXldLm5hbWU7YmEub3V0cHV0VGVuc29yS2V5PSIwIn0pfSl9YnVpbGRTdWJoaWVyYXJjaHkoTCl7aWYoIShMIGluIHRoaXMuaGFzU3ViaGllcmFyY2h5KSl7dGhpcy5oYXNTdWJoaWVyYXJjaHlbTF09ITA7dmFyIFI9dGhpcy5pbmRleFtMXTtpZihSLm5vZGUudHlwZT09PWMuTm9kZVR5cGUuTUVUQXx8Ui5ub2RlLnR5cGU9PT1jLk5vZGVUeXBlLlNFUklFUyl7dmFyIFU9Ui5ub2RlLm1ldGFncmFwaCxZPVIuY29yZUdyYXBoLGJhPVtdLG1hPVtdO18uaXNFbXB0eSh0aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zKXx8KF8uZWFjaChVLm5vZGVzKCkseWE9Pntjb25zdCBCYT1VLm5vZGUoeWEpLEdhPXRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnNbQmEub3BdOwpHYSYmMCE9PXlhLmluZGV4T2YoYS5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKSYmKHlhPXRoaXMuY2xvbmVGdW5jdGlvbkxpYnJhcnlNZXRhbm9kZShVLEJhLEdhLm5vZGUsR2Eubm9kZS5uYW1lLEJhLm5hbWUpLGJhLnB1c2goQmEpLG1hLnB1c2goeWEpKX0pLF8uZWFjaChtYSwoeWEsQmEpPT57QmE9YmFbQmFdO3lhLnBhcmVudE5vZGU9QmEucGFyZW50Tm9kZTtVLnNldE5vZGUoQmEubmFtZSx5YSk7dGhpcy5oaWVyYXJjaHkuc2V0Tm9kZShCYS5uYW1lLHlhKX0pKTtfLmVhY2goVS5ub2RlcygpLHlhPT57bGV0IEJhPXRoaXMuZ2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKHlhKSxHYT1CYS5ub2RlO1kuc2V0Tm9kZSh5YSxCYSk7R2EuaXNHcm91cE5vZGV8fChfLmVhY2goR2EuaW5FbWJlZGRpbmdzLHphPT57bGV0IFVhPW5ldyBLKG51bGwpLFphPW5ldyBIKHphKTtmKEJhLHphLFphLFVhLE8uQ09OU1RBTlQpO3RoaXMuaW5kZXhbemEubmFtZV09WmF9KSxfLmVhY2goR2Eub3V0RW1iZWRkaW5ncywKemE9PntsZXQgVWE9bmV3IEsobnVsbCksWmE9bmV3IEgoemEpO2coQmEsemEsWmEsVWEsTy5TVU1NQVJZKTt0aGlzLmluZGV4W3phLm5hbWVdPVphfSkpfSk7Xy5lYWNoKFUuZWRnZXMoKSx5YT0+e3ZhciBCYT1VLmVkZ2UoeWEpO0JhPW5ldyBLKEJhKTtCYS5pc0ZhZGVkT3V0PXRoaXMuaW5kZXhbeWEudl0uaXNGYWRlZE91dHx8dGhpcy5pbmRleFt5YS53XS5pc0ZhZGVkT3V0O1kuc2V0RWRnZSh5YS52LHlhLncsQmEpfSk7Ri5lbmFibGVFeHRyYWN0aW9uJiZSLm5vZGUudHlwZT09PWMuTm9kZVR5cGUuTUVUQSYmQyhSKTtfLmlzRW1wdHkodGhpcy5oaWVyYXJjaHkubGlicmFyeUZ1bmN0aW9ucyl8fHRoaXMuYnVpbGRTdWJoaWVyYXJjaGllc0Zvck5lZWRlZEZ1bmN0aW9ucyhVKTtMPT09YS5ncmFwaC5ST09UX05BTUUmJl8uZm9yT3duKHRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnMseWE9Pnt5YT15YS5ub2RlO2NvbnN0IEJhPXRoaXMuZ2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKHlhLm5hbWUpOwpSLmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LnB1c2goQmEpO0JhLm5vZGUuaW5jbHVkZT1jLkluY2x1c2lvblR5cGUuRVhDTFVERTtZLnJlbW92ZU5vZGUoeWEubmFtZSl9KTt2YXIgYWE9Ui5ub2RlLnBhcmVudE5vZGU7aWYoYWEpe3ZhciBjYT10aGlzLmluZGV4W2FhLm5hbWVdLGZhPSh5YSwuLi5CYSk9PkJhLmNvbmNhdChbeWE/IklOIjoiT1VUIl0pLmpvaW4oIn5+IiksZGE9dGhpcy5oaWVyYXJjaHkuZ2V0QnJpZGdlZ3JhcGgoTCksbGE9e30sWj17fSxGYT17fTtfLmVhY2goZGEuZWRnZXMoKSx5YT0+e2xldCBCYT0hIVUubm9kZSh5YS53KSxHYT1CYT95YS52OnlhLnc7ZGEuZWRnZSh5YSkubnVtUmVndWxhckVkZ2VzP0JhP1pbR2FdPShaW0dhXXx8MCkrMTpsYVtHYV09KGxhW0dhXXx8MCkrMTpGYVtHYV09KEZhW0dhXXx8MCkrMX0pO3ZhciB4YT10aGlzLmhpZXJhcmNoeS5nZXROb2RlTWFwKCk7Xy5lYWNoKGRhLmVkZ2VzKCkseWE9Pnt2YXIgQmE9ZGEuZWRnZSh5YSk7bGV0IEdhPQohIVUubm9kZSh5YS53KSxbemEsVWFdPUdhP1t5YS53LHlhLnZdOlt5YS52LHlhLnddO3ZhciBaYT10aGlzLmluZGV4W3phXSx6Yj10aGlzLmluZGV4W1VhXSxJYj16Yj96Yi5ub2RlOnhhW1VhXSx1Yj0hQmEubnVtUmVndWxhckVkZ2VzJiZGYVtVYV0+Ri5tYXhDb250cm9sRGVncmVlLFssRmJdPUdhP1tSLmluQW5ub3RhdGlvbnMsWmEuaW5Bbm5vdGF0aW9uc106W1Iub3V0QW5ub3RhdGlvbnMsWmEub3V0QW5ub3RhdGlvbnNdO2xldCBBYj0oR2E/WjpsYSlbVWFdPkYubWF4QnJpZGdlUGF0aERlZ3JlZTt5YT1udWxsO3ZhciBQYj0hMTtGLmVuYWJsZUJyaWRnZWdyYXBoJiYhQWImJiF1YiYmWmEuaXNJbkNvcmUoKSYmKFBiPWJjPT5jYS5jb3JlR3JhcGguZWRnZShHYT97djpiYyx3Okx9Ont2OkwsdzpiY30pLCh5YT1QYihVYSkpfHwoeWE9UGIoZmEoR2EsVWEsYWEubmFtZSkpKSxQYj0hIXlhKTtaYT0hMTtpZih5YSYmIUJhLm51bVJlZ3VsYXJFZGdlcyl7WmE9eWE7Zm9yKHViPWNhLm5vZGU7WmEuYWRqb2luaW5nTWV0YWVkZ2U7KVphPQpaYS5hZGpvaW5pbmdNZXRhZWRnZSx1Yj11Yi5wYXJlbnROb2RlO3ViPXRoaXMuaGllcmFyY2h5LmdldFRvcG9sb2dpY2FsT3JkZXJpbmcodWIubmFtZSk7WmE9WmEubWV0YWVkZ2U7WmE9dWJbWmEudl0+dWJbWmEud119UGImJiFaYT8oSWI9ZmEoR2EsTCksemI9ZmEoR2EsVWEsTCksRmI9WS5ub2RlKHpiKSxGYnx8KFBiPVkubm9kZShJYiksUGJ8fChQYj1uZXcgSCh7bmFtZTpJYix0eXBlOmMuTm9kZVR5cGUuQlJJREdFLGlzR3JvdXBOb2RlOiExLGNhcmRpbmFsaXR5OjAscGFyZW50Tm9kZTpudWxsLHN0YXRzOm51bGwsaW5jbHVkZTpjLkluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUQsaW5ib3VuZDpHYSxub2RlQXR0cmlidXRlczp7fX0pLHRoaXMuaW5kZXhbSWJdPVBiLFkuc2V0Tm9kZShJYixQYikpLEZiPW5ldyBIKHtuYW1lOnpiLHR5cGU6Yy5Ob2RlVHlwZS5CUklER0UsaXNHcm91cE5vZGU6ITEsY2FyZGluYWxpdHk6MSxwYXJlbnROb2RlOm51bGwsc3RhdHM6bnVsbCxpbmNsdWRlOmMuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCwKaW5ib3VuZDpHYSxub2RlQXR0cmlidXRlczp7fX0pLHRoaXMuaW5kZXhbemJdPUZiLFkuc2V0Tm9kZSh6YixGYiksWS5zZXRQYXJlbnQoemIsSWIpLFBiLm5vZGUuY2FyZGluYWxpdHkrKyksQmE9bmV3IEsoQmEpLEJhLmFkam9pbmluZ01ldGFlZGdlPXlhLEdhP1kuc2V0RWRnZSh6Yix6YSxCYSk6WS5zZXRFZGdlKHphLHpiLEJhKSk6RmIucHVzaChuZXcgSShJYix6YixuZXcgSyhCYSksTy5TSE9SVENVVCxHYSkpfSk7Xy5lYWNoKFshMCwhMV0seWE9PntsZXQgQmE9ZmEoeWEsTCksR2E9WS5ub2RlKEJhKTtHYSYmXy5lYWNoKFkubm9kZXMoKSx6YT0+e2lmKFkubm9kZSh6YSkubm9kZS50eXBlIT09Yy5Ob2RlVHlwZS5CUklER0UmJih5YT8hWS5wcmVkZWNlc3NvcnMoemEpLmxlbmd0aDohWS5zdWNjZXNzb3JzKHphKS5sZW5ndGgpKXt2YXIgVWE9ZmEoeWEsTCwiU1RSVUNUVVJBTF9UQVJHRVQiKSxaYT1ZLm5vZGUoVWEpO1phfHwoWmE9bmV3IEgoe25hbWU6VWEsdHlwZTpjLk5vZGVUeXBlLkJSSURHRSwKaXNHcm91cE5vZGU6ITEsY2FyZGluYWxpdHk6MSxwYXJlbnROb2RlOm51bGwsc3RhdHM6bnVsbCxpbmNsdWRlOmMuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCxpbmJvdW5kOnlhLG5vZGVBdHRyaWJ1dGVzOnt9fSksWmEuc3RydWN0dXJhbD0hMCx0aGlzLmluZGV4W1VhXT1aYSxZLnNldE5vZGUoVWEsWmEpLEdhLm5vZGUuY2FyZGluYWxpdHkrKyxZLnNldFBhcmVudChVYSxCYSkpO1phPW5ldyBLKG51bGwpO1phLnN0cnVjdHVyYWw9ITA7WmEud2VpZ2h0LS07eWE/WS5zZXRFZGdlKFVhLHphLFphKTpZLnNldEVkZ2UoemEsVWEsWmEpfX0pfSl9fX19YnVpbGRTdWJoaWVyYXJjaGllc0Zvck5lZWRlZEZ1bmN0aW9ucyhMKXtfLmVhY2goTC5lZGdlcygpLFI9PntSPUwuZWRnZShSKTtSPW5ldyBLKFIpO18uZm9yRWFjaChSLm1ldGFlZGdlLmJhc2VFZGdlTGlzdCxVPT57dmFyIFk9VS52LnNwbGl0KGEuZ3JhcGguTkFNRVNQQUNFX0RFTElNKTtmb3IodmFyIGJhPVkubGVuZ3RoOzA8PWJhO2JhLS0pe1U9Clkuc2xpY2UoMCxiYSk7Y29uc3QgbWE9dGhpcy5oaWVyYXJjaHkubm9kZShVLmpvaW4oYS5ncmFwaC5OQU1FU1BBQ0VfREVMSU0pKTtpZihtYSl7aWYobWEudHlwZT09PWMuTm9kZVR5cGUuT1AmJnRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnNbbWEub3BdKWZvcihZPTE7WTxVLmxlbmd0aDtZKyspKGJhPVUuc2xpY2UoMCxZKS5qb2luKGEuZ3JhcGguTkFNRVNQQUNFX0RFTElNKSkmJnRoaXMuYnVpbGRTdWJoaWVyYXJjaHkoYmEpO2JyZWFrfX19KX0pfX1kLlJlbmRlckdyYXBoSW5mbz1CO2NsYXNzIEl7Y29uc3RydWN0b3IoTCxSLFUsWSxiYSl7dGhpcy5ub2RlPUw7dGhpcy5yZW5kZXJOb2RlSW5mbz1SO3RoaXMucmVuZGVyTWV0YWVkZ2VJbmZvPVU7dGhpcy5hbm5vdGF0aW9uVHlwZT1ZO3RoaXMuaGVpZ2h0PXRoaXMud2lkdGg9dGhpcy5keT10aGlzLmR4PTA7VSYmVS5tZXRhZWRnZSYmKHRoaXMudj1VLm1ldGFlZGdlLnYsdGhpcy53PVUubWV0YWVkZ2Uudyk7dGhpcy5pc0luPQpiYTt0aGlzLnBvaW50cz1bXX19ZC5Bbm5vdGF0aW9uPUk7bGV0IE87KGZ1bmN0aW9uKEwpe0xbTC5TSE9SVENVVD0wXT0iU0hPUlRDVVQiO0xbTC5DT05TVEFOVD0xXT0iQ09OU1RBTlQiO0xbTC5TVU1NQVJZPTJdPSJTVU1NQVJZIjtMW0wuRUxMSVBTSVM9M109IkVMTElQU0lTIn0pKE89ZC5Bbm5vdGF0aW9uVHlwZXx8KGQuQW5ub3RhdGlvblR5cGU9e30pKTtjbGFzcyBQe2NvbnN0cnVjdG9yKCl7dGhpcy5saXN0PVtdO3RoaXMubm9kZU5hbWVzPXt9fXB1c2goTCl7aWYoIShMLm5vZGUubmFtZSBpbiB0aGlzLm5vZGVOYW1lcykpaWYodGhpcy5ub2RlTmFtZXNbTC5ub2RlLm5hbWVdPSEwLHRoaXMubGlzdC5sZW5ndGg8Ri5tYXhBbm5vdGF0aW9ucyl0aGlzLmxpc3QucHVzaChMKTtlbHNle3ZhciBSPXRoaXMubGlzdFt0aGlzLmxpc3QubGVuZ3RoLTFdO1IuYW5ub3RhdGlvblR5cGU9PT1PLkVMTElQU0lTPyhMPVIubm9kZSxMLnNldE51bU1vcmVOb2RlcygrK0wubnVtTW9yZU5vZGVzKSk6CihSPW5ldyBhLmdyYXBoLkVsbGlwc2lzTm9kZUltcGwoMSksdGhpcy5saXN0LnB1c2gobmV3IEkoUixuZXcgSChSKSxudWxsLE8uRUxMSVBTSVMsTC5pc0luKSkpfX19ZC5Bbm5vdGF0aW9uTGlzdD1QO2NsYXNzIEh7Y29uc3RydWN0b3IoTCl7dGhpcy5ub2RlPUw7dGhpcy5leHBhbmRlZD0hMTt0aGlzLmluQW5ub3RhdGlvbnM9bmV3IFA7dGhpcy5vdXRBbm5vdGF0aW9ucz1uZXcgUDt0aGlzLm91dGJveFdpZHRoPXRoaXMuaW5ib3hXaWR0aD10aGlzLmhlaWdodD10aGlzLndpZHRoPXRoaXMueT10aGlzLng9MDt0aGlzLnN0cnVjdHVyYWw9dGhpcy5leGNsdWRlZD0hMTt0aGlzLnBhZGRpbmdCb3R0b209dGhpcy5wYWRkaW5nUmlnaHQ9dGhpcy5wYWRkaW5nTGVmdD10aGlzLnBhZGRpbmdUb3A9dGhpcy5sYWJlbEhlaWdodD10aGlzLnJhZGl1cz10aGlzLmxhYmVsT2Zmc2V0PTA7dGhpcy5pc091dEV4dHJhY3Q9dGhpcy5pc0luRXh0cmFjdD0hMTt0aGlzLmNvcmVCb3g9e3dpZHRoOjAsaGVpZ2h0OjB9Owp0aGlzLmlzRmFkZWRPdXQ9ITE7dGhpcy5kaXNwbGF5TmFtZT1MLm5hbWUuc3Vic3RyaW5nKEwubmFtZS5sYXN0SW5kZXhPZihhLmdyYXBoLk5BTUVTUEFDRV9ERUxJTSkrMSk7TC50eXBlPT09Yy5Ob2RlVHlwZS5NRVRBJiZMLmFzc29jaWF0ZWRGdW5jdGlvbiYmKChMPXRoaXMuZGlzcGxheU5hbWUubWF0Y2goRCkpP3RoaXMuZGlzcGxheU5hbWU9TFsxXTpfLnN0YXJ0c1dpdGgodGhpcy5kaXNwbGF5TmFtZSxhLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgpJiYodGhpcy5kaXNwbGF5TmFtZT10aGlzLmRpc3BsYXlOYW1lLnN1YnN0cmluZyhhLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgubGVuZ3RoKSkpfWlzSW5Db3JlKCl7cmV0dXJuIXRoaXMuaXNJbkV4dHJhY3QmJiF0aGlzLmlzT3V0RXh0cmFjdCYmIXRoaXMuaXNMaWJyYXJ5RnVuY3Rpb259fWQuUmVuZGVyTm9kZUluZm89SDtjbGFzcyBLe2NvbnN0cnVjdG9yKEwpe3RoaXMubWV0YWVkZ2U9TDsKdGhpcy5hZGpvaW5pbmdNZXRhZWRnZT1udWxsO3RoaXMuc3RydWN0dXJhbD0hMTt0aGlzLndlaWdodD0xO3RoaXMuaXNGYWRlZE91dD0hMX19ZC5SZW5kZXJNZXRhZWRnZUluZm89SztjbGFzcyBNIGV4dGVuZHMgSHtjb25zdHJ1Y3RvcihMLFIpe3N1cGVyKEwpO0w9TC5tZXRhZ3JhcGguZ3JhcGgoKTtSLmNvbXBvdW5kPSEwO3RoaXMuY29yZUdyYXBoPWMuY3JlYXRlR3JhcGgoTC5uYW1lLGMuR3JhcGhUeXBlLkNPUkUsUik7dGhpcy5pbkV4dHJhY3RCb3g9e3dpZHRoOjAsaGVpZ2h0OjB9O3RoaXMub3V0RXh0cmFjdEJveD17d2lkdGg6MCxoZWlnaHQ6MH07dGhpcy5saWJyYXJ5RnVuY3Rpb25zQm94PXt3aWR0aDowLGhlaWdodDowfTt0aGlzLmlzb2xhdGVkSW5FeHRyYWN0PVtdO3RoaXMuaXNvbGF0ZWRPdXRFeHRyYWN0PVtdO3RoaXMubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3Q9W119fWQuUmVuZGVyR3JvdXBOb2RlSW5mbz1NO2QubWFrZUluRXh0cmFjdD1xO2QubWFwSW5kZXhUb0h1ZT0KZnVuY3Rpb24oTCl7cmV0dXJuIDErNTc5LjI1NjE2Nzk3MjUqTCUzNTh9O2QuZXhwYW5kVW50aWxOb2RlSXNTaG93bj1mdW5jdGlvbihMLFIpe3ZhciBVPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzY2VuZSIpO1I9Ui5zcGxpdCgiLyIpO3ZhciBZPVJbUi5sZW5ndGgtMV0ubWF0Y2goLyguKik6XHcrLyk7Mj09PVkubGVuZ3RoJiYoUltSLmxlbmd0aC0xXT1ZWzFdKTtZPVJbMF07bGV0IGJhPUwuZ2V0UmVuZGVyTm9kZUJ5TmFtZShZKTtmb3IobGV0IG1hPTE7bWE8Ui5sZW5ndGgmJmJhLm5vZGUudHlwZSE9PWEuZ3JhcGguTm9kZVR5cGUuT1A7bWErKylMLmJ1aWxkU3ViaGllcmFyY2h5KFkpLGJhLmV4cGFuZGVkPSEwLFUuc2V0Tm9kZUV4cGFuZGVkKGJhKSxZKz0iLyIrUlttYV0sYmE9TC5nZXRSZW5kZXJOb2RlQnlOYW1lKFkpO3JldHVybiBiYS5ub2RlLm5hbWV9fSkoYy5yZW5kZXJ8fChjLnJlbmRlcj17fSkpfSkoYS5ncmFwaHx8KGEuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vc2NlbmUuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7ZnVuY3Rpb24gZihyLHQsdix5KXt2YXIgej1nKHIsdCx2KTtpZighei5lbXB0eSgpKXJldHVybiB6O3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdCk7aWYodiBpbnN0YW5jZW9mIEFycmF5KWZvcih6PTA7ejx2Lmxlbmd0aDt6KyspdC5jbGFzc0xpc3QuYWRkKHZbel0pO2Vsc2UgdC5jbGFzc0xpc3QuYWRkKHYpO3k/ci5ub2RlKCkuaW5zZXJ0QmVmb3JlKHQseSk6ci5ub2RlKCkuYXBwZW5kQ2hpbGQodCk7cmV0dXJuIGQzLnNlbGVjdCh0KS5kYXR1bShyLmRhdHVtKCkpfWZ1bmN0aW9uIGcocix0LHYpe3I9ci5ub2RlKCkuY2hpbGROb2Rlcztmb3IobGV0IHk9MDt5PHIubGVuZ3RoO3krKyl7bGV0IHo9clt5XTtpZih6LnRhZ05hbWU9PT10KWlmKHYgaW5zdGFuY2VvZiBBcnJheSl7bGV0IHg9ITA7Zm9yKGxldCBDPTA7Qzx2Lmxlbmd0aDtDKyspeD14JiZ6LmNsYXNzTGlzdC5jb250YWlucyh2W0NdKTsKaWYoeClyZXR1cm4gZDMuc2VsZWN0KHopfWVsc2UgaWYoIXZ8fHouY2xhc3NMaXN0LmNvbnRhaW5zKHYpKXJldHVybiBkMy5zZWxlY3Qoeil9cmV0dXJuIGQzLnNlbGVjdChudWxsKX1mdW5jdGlvbiBsKHIsdCl7bGV0IHY9dC5ub2RlLnR5cGU9PT1jLk5vZGVUeXBlLlNFUklFUz8wOmMubGF5b3V0LlBBUkFNUy5zdWJzY2VuZS5tZXRhLmxhYmVsSGVpZ2h0O2soZyhyLCJnIixkLkNsYXNzLlNjZW5lLkNPUkUpLDAsdik7dmFyIHk9MDx0Lmlzb2xhdGVkSW5FeHRyYWN0Lmxlbmd0aCx6PTA8dC5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoO2xldCB4PTA8dC5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGgsQz1jLmxheW91dC5QQVJBTVMuc3Vic2NlbmUubWV0YS5leHRyYWN0WE9mZnNldCxGPTA7eSYmKEYrPXQub3V0RXh0cmFjdEJveC53aWR0aCk7eiYmKEYrPXQub3V0RXh0cmFjdEJveC53aWR0aCk7eSYmKHk9dC5jb3JlQm94LndpZHRoLHk9RjxjLmxheW91dC5NSU5fQVVYX1dJRFRIPwp5LWMubGF5b3V0Lk1JTl9BVVhfV0lEVEgrdC5pbkV4dHJhY3RCb3gud2lkdGgvMjp5LXQuaW5FeHRyYWN0Qm94LndpZHRoLzItdC5vdXRFeHRyYWN0Qm94LndpZHRoLSh6P0M6MCkseT15LXQubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aC0oeD9DOjApLGsoZyhyLCJnIixkLkNsYXNzLlNjZW5lLklORVhUUkFDVCkseSx2KSk7eiYmKHo9dC5jb3JlQm94LndpZHRoLHo9RjxjLmxheW91dC5NSU5fQVVYX1dJRFRIP3otYy5sYXlvdXQuTUlOX0FVWF9XSURUSCt0Lm91dEV4dHJhY3RCb3gud2lkdGgvMjp6LXQub3V0RXh0cmFjdEJveC53aWR0aC8yLHo9ei10LmxpYnJhcnlGdW5jdGlvbnNCb3gud2lkdGgtKHg/QzowKSxrKGcociwiZyIsZC5DbGFzcy5TY2VuZS5PVVRFWFRSQUNUKSx6LHYpKTt4JiYodD10LmNvcmVCb3gud2lkdGgtdC5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoLzIsayhnKHIsImciLGQuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSksdCx2KSl9ZnVuY3Rpb24gayhyLAp0LHYpe251bGwhPXIuYXR0cigidHJhbnNmb3JtIikmJihyPXIudHJhbnNpdGlvbigicG9zaXRpb24iKSk7ci5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit0KyIsIit2KyIpIil9ZnVuY3Rpb24gbihyLHQpe3JldHVybiB0P3IudG9GaXhlZCgwKToxPD1NYXRoLmFicyhyKT9yLnRvRml4ZWQoMSk6ci50b0V4cG9uZW50aWFsKDEpfWZ1bmN0aW9uIHAocix0LHYseSl7bGV0IHo9IkRldmljZTogIityLmRldmljZV9uYW1lKyJcbiI7eis9ImR0eXBlOiAiK3IuZHR5cGUrIlxuIjtsZXQgeD0iKHNjYWxhcikiOzA8ci5zaGFwZS5sZW5ndGgmJih4PSIoIityLnNoYXBlLmpvaW4oIiwiKSsiKSIpO3o9eisoIlxuc2hhcGU6ICIreCsiXG5cbiMoZWxlbWVudHMpOiAiKSsodCsiXG4iKTtyPVtdO2Zvcih0PTA7dDx2Lmxlbmd0aDt0KyspMDx2W3RdJiZyLnB1c2goIiMoIitkLmhlYWx0aFBpbGxFbnRyaWVzW3RdLmxhYmVsKyIpOiAiK3ZbdF0pO3orPXIuam9pbigiLCAiKSsiXG5cbiI7eS5tYXg+PQp5Lm1pbiYmKHorPSJtaW46ICIreS5taW4rIiwgbWF4OiAiK3kubWF4KyJcbiIseis9Im1lYW46ICIreS5tZWFuKyIsIHN0ZGRldjogIit5LnN0ZGRldik7cmV0dXJuIHp9ZnVuY3Rpb24gcShyLHQsdix5LHo9NjAseD0xMCxDPTAsRil7ZDMuc2VsZWN0KHIucGFyZW50Tm9kZSkuc2VsZWN0QWxsKCIuaGVhbHRoLXBpbGwiKS5yZW1vdmUoKTtpZih0KXt2YXIgRD10LnZhbHVlLEI9RC5zbGljZSgyLDgpLEk9QlswXSxPPUJbMV0sUD1CWzVdLEg9RFsxXSxLPXttaW46RFs4XSxtYXg6RFs5XSxtZWFuOkRbMTBdLHN0ZGRldjpNYXRoLnNxcnQoRFsxMV0pfTtudWxsPT16JiYoej02MCk7bnVsbD09eCYmKHg9MTApO251bGw9PUMmJihDPTApO251bGwhPXYmJnYubm9kZS50eXBlPT09YS5ncmFwaC5Ob2RlVHlwZS5PUCYmKHovPTIseC89Mik7RD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZC5TVkdfTkFNRVNQQUNFLCJnIik7RC5jbGFzc0xpc3QuYWRkKCJoZWFsdGgtcGlsbCIpO3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkLlNWR19OQU1FU1BBQ0UsCiJkZWZzIik7RC5hcHBlbmRDaGlsZChNKTt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZC5TVkdfTkFNRVNQQUNFLCJsaW5lYXJHcmFkaWVudCIpO3k9ImhlYWx0aC1waWxsLWdyYWRpZW50LSIreTtMLnNldEF0dHJpYnV0ZSgiaWQiLHkpO3ZhciBSPTAsVT0iMCUiO2ZvcihsZXQgYmE9MDtiYTxCLmxlbmd0aDtiYSsrKWlmKEJbYmFdKXtSKz1CW2JhXTt2YXIgWT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZC5TVkdfTkFNRVNQQUNFLCJzdG9wIik7WS5zZXRBdHRyaWJ1dGUoIm9mZnNldCIsVSk7WS5zZXRBdHRyaWJ1dGUoInN0b3AtY29sb3IiLGQuaGVhbHRoUGlsbEVudHJpZXNbYmFdLmJhY2tncm91bmRfY29sb3IpO0wuYXBwZW5kQ2hpbGQoWSk7VT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZC5TVkdfTkFNRVNQQUNFLCJzdG9wIik7WT0xMDAqUi9IKyIlIjtVLnNldEF0dHJpYnV0ZSgib2Zmc2V0IixZKTtVLnNldEF0dHJpYnV0ZSgic3RvcC1jb2xvciIsZC5oZWFsdGhQaWxsRW50cmllc1tiYV0uYmFja2dyb3VuZF9jb2xvcik7CkwuYXBwZW5kQ2hpbGQoVSk7VT1ZfU0uYXBwZW5kQ2hpbGQoTCk7TT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZC5TVkdfTkFNRVNQQUNFLCJyZWN0Iik7TS5zZXRBdHRyaWJ1dGUoImZpbGwiLCJ1cmwoIyIreSsiKSIpO00uc2V0QXR0cmlidXRlKCJ3aWR0aCIsU3RyaW5nKHopKTtNLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixTdHJpbmcoeCkpO00uc2V0QXR0cmlidXRlKCJ5IixTdHJpbmcoQykpO0QuYXBwZW5kQ2hpbGQoTSk7TT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZC5TVkdfTkFNRVNQQUNFLCJ0aXRsZSIpO00udGV4dENvbnRlbnQ9cCh0LEgsQixLKTtELmFwcGVuZENoaWxkKE0pO3Q9ITE7aWYobnVsbCE9diYmKE09di54LXovMix4PXYueS14LXYuaGVpZ2h0LzItMiwwPnYubGFiZWxPZmZzZXQmJih4Kz12LmxhYmVsT2Zmc2V0KSxELnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrTSsiLCAiK3grIikiKSwoQlsyXXx8QlszXXx8Qls0XSkmJih2PXYubm9kZS5hdHRyKSYmCnYubGVuZ3RoKSlmb3IoQj0wO0I8di5sZW5ndGg7QisrKWlmKCJUIj09PXZbQl0ua2V5KXt0PSh2PXZbQl0udmFsdWUudHlwZSkmJi9eRFRfKEJPT0x8SU5UfFVJTlQpLy50ZXN0KHYpO2JyZWFrfXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGQuU1ZHX05BTUVTUEFDRSwidGV4dCIpO2lmKE51bWJlci5pc0Zpbml0ZShLLm1pbikmJk51bWJlci5pc0Zpbml0ZShLLm1heCkpe2lmKEI9bihLLm1pbix0KSxLPW4oSy5tYXgsdCksdi50ZXh0Q29udGVudD0xPEg/QisiIH4gIitLOkIsMDxJfHwwPE98fDA8UCl2LnRleHRDb250ZW50Kz0iICgiLEg9W10sMDxJJiZILnB1c2goYE5hTlx1MDBkNyR7SX1gKSwwPE8mJkgucHVzaChgLVx1MjIxZVx1MDBkNyR7T31gKSwwPFAmJkgucHVzaChgK1x1MjIxZVx1MDBkNyR7UH1gKSx2LnRleHRDb250ZW50Kz1ILmpvaW4oIjsgIikrIikifWVsc2Ugdi50ZXh0Q29udGVudD0iKE5vIGZpbml0ZSBlbGVtZW50cykiO3YuY2xhc3NMaXN0LmFkZCgiaGVhbHRoLXBpbGwtc3RhdHMiKTsKbnVsbD09RiYmKEY9ei8yKTt2LnNldEF0dHJpYnV0ZSgieCIsU3RyaW5nKEYpKTt2LnNldEF0dHJpYnV0ZSgieSIsU3RyaW5nKEMtMikpO0QuYXBwZW5kQ2hpbGQodik7UG9seW1lci5kb20oci5wYXJlbnROb2RlKS5hcHBlbmRDaGlsZChEKX19ZC5TVkdfTkFNRVNQQUNFPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7ZC5DbGFzcz17Tm9kZTp7Q09OVEFJTkVSOiJub2RlcyIsR1JPVVA6Im5vZGUiLFNIQVBFOiJub2Rlc2hhcGUiLENPTE9SX1RBUkdFVDoibm9kZWNvbG9ydGFyZ2V0IixMQUJFTDoibm9kZWxhYmVsIixCVVRUT05fQ09OVEFJTkVSOiJidXR0b25jb250YWluZXIiLEJVVFRPTl9DSVJDTEU6ImJ1dHRvbmNpcmNsZSIsRVhQQU5EX0JVVFRPTjoiZXhwYW5kYnV0dG9uIixDT0xMQVBTRV9CVVRUT046ImNvbGxhcHNlYnV0dG9uIn0sRWRnZTp7Q09OVEFJTkVSOiJlZGdlcyIsR1JPVVA6ImVkZ2UiLExJTkU6ImVkZ2VsaW5lIixSRUZFUkVOQ0VfRURHRToicmVmZXJlbmNlZWRnZSIsClJFRl9MSU5FOiJyZWZsaW5lIixTRUxFQ1RBQkxFOiJzZWxlY3RhYmxlZWRnZSIsU0VMRUNURUQ6InNlbGVjdGVkZWRnZSIsU1RSVUNUVVJBTDoic3RydWN0dXJhbCJ9LEFubm90YXRpb246e09VVEJPWDoib3V0LWFubm90YXRpb25zIixJTkJPWDoiaW4tYW5ub3RhdGlvbnMiLEdST1VQOiJhbm5vdGF0aW9uIixOT0RFOiJhbm5vdGF0aW9uLW5vZGUiLEVER0U6ImFubm90YXRpb24tZWRnZSIsQ09OVFJPTF9FREdFOiJhbm5vdGF0aW9uLWNvbnRyb2wtZWRnZSIsTEFCRUw6ImFubm90YXRpb24tbGFiZWwiLEVMTElQU0lTOiJhbm5vdGF0aW9uLWVsbGlwc2lzIn0sU2NlbmU6e0dST1VQOiJzY2VuZSIsQ09SRToiY29yZSIsRlVOQ1RJT05fTElCUkFSWToiZnVuY3Rpb24tbGlicmFyeSIsSU5FWFRSQUNUOiJpbi1leHRyYWN0IixPVVRFWFRSQUNUOiJvdXQtZXh0cmFjdCJ9LFN1YnNjZW5lOntHUk9VUDoic3Vic2NlbmUifSxPUE5PREU6Im9wIixNRVRBTk9ERToibWV0YSIsU0VSSUVTTk9ERToic2VyaWVzIiwKQlJJREdFTk9ERToiYnJpZGdlIixFTExJUFNJU05PREU6ImVsbGlwc2lzIn07ZC5oZWFsdGhQaWxsRW50cmllcz1be2JhY2tncm91bmRfY29sb3I6IiNDQzJGMkMiLGxhYmVsOiJOYU4ifSx7YmFja2dyb3VuZF9jb2xvcjoiI0ZGOEQwMCIsbGFiZWw6Ii1cdTIyMWUifSx7YmFja2dyb3VuZF9jb2xvcjoiI0VBRUFFQSIsbGFiZWw6Ii0ifSx7YmFja2dyb3VuZF9jb2xvcjoiI0E1QTVBNSIsbGFiZWw6IjAifSx7YmFja2dyb3VuZF9jb2xvcjoiIzI2MjYyNiIsbGFiZWw6IisifSx7YmFja2dyb3VuZF9jb2xvcjoiIzAwM0VENCIsbGFiZWw6IitcdTIyMWUifV07ZC5maXQ9ZnVuY3Rpb24ocix0LHYseSl7dmFyIHo9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtsZXQgeD1udWxsO3RyeXtpZih4PXQuZ2V0QkJveCgpLDA9PT14LndpZHRoKXJldHVybn1jYXRjaChDKXtyZXR1cm59dD1jLmxheW91dC5QQVJBTVMuZ3JhcGg7ej1kMy56b29tSWRlbnRpdHkuc2NhbGUoLjkqTWF0aC5taW4oei53aWR0aC8KeC53aWR0aCx6LmhlaWdodC94LmhlaWdodCwyKSkudHJhbnNsYXRlKHQucGFkZGluZy5wYWRkaW5nTGVmdCx0LnBhZGRpbmcucGFkZGluZ1RvcCk7ZDMuc2VsZWN0KHIpLnRyYW5zaXRpb24oKS5kdXJhdGlvbig1MDApLmNhbGwodi50cmFuc2Zvcm0seikub24oImVuZC5maXR0ZWQiLCgpPT57di5vbigiZW5kLmZpdHRlZCIsbnVsbCk7eSgpfSl9O2QucGFuVG9Ob2RlPWZ1bmN0aW9uKHIsdCx2LHkpe3Y9ZDMuc2VsZWN0KHQpLnNlbGVjdChgW2RhdGEtbmFtZT0iJHtyfSJdYCkubm9kZSgpO2lmKCF2KXJldHVybiBjb25zb2xlLndhcm4oYHBhblRvTm9kZSgpIGZhaWxlZCBmb3Igbm9kZSBuYW1lICIke3J9ImApLCExO3ZhciB6PXYuZ2V0QkJveCgpLHg9di5nZXRTY3JlZW5DVE0oKTtyPXQuY3JlYXRlU1ZHUG9pbnQoKTt2PXQuY3JlYXRlU1ZHUG9pbnQoKTtyLng9ei54O3IueT16Lnk7di54PXoueCt6LndpZHRoO3YueT16Lnkrei5oZWlnaHQ7cj1yLm1hdHJpeFRyYW5zZm9ybSh4KTt2PQp2Lm1hdHJpeFRyYW5zZm9ybSh4KTt4PShGLEQsQixJKT0+IShGPkImJkQ8SSk7ej10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2NvbnN0IEM9ei50b3Arei5oZWlnaHQtMTUwO3JldHVybiB4KHIueCx2Lngsei5sZWZ0LHoubGVmdCt6LndpZHRoLTMyMCl8fHgoci55LHYueSx6LnRvcCxDKT8oeD16LmxlZnQrei53aWR0aC8yLShyLngrdi54KS8yLHI9ei50b3Arei5oZWlnaHQvMi0oci55K3YueSkvMix2PWQzLnpvb21UcmFuc2Zvcm0odCksZDMuc2VsZWN0KHQpLnRyYW5zaXRpb24oKS5kdXJhdGlvbig1MDApLmNhbGwoeS50cmFuc2xhdGVCeSx4L3YuayxyL3YuayksITApOiExfTtkLnNlbGVjdE9yQ3JlYXRlQ2hpbGQ9ZjtkLnNlbGVjdENoaWxkPWc7ZC5idWlsZEdyb3VwPWZ1bmN0aW9uKHIsdCx2LHkpe3k9eXx8ZC5DbGFzcy5TY2VuZS5HUk9VUDtsZXQgej1nKHIsImciLHkpLmVtcHR5KCk7cj1mKHIsImciLHkpO3k9ZihyLCJnIixkLkNsYXNzLlNjZW5lLkNPUkUpO2xldCB4PV8ucmVkdWNlKHQuY29yZUdyYXBoLm5vZGVzKCksCihDLEYpPT57Rj10LmNvcmVHcmFwaC5ub2RlKEYpO0YuZXhjbHVkZWR8fEMucHVzaChGKTtyZXR1cm4gQ30sW10pO3Qubm9kZS50eXBlPT09Yy5Ob2RlVHlwZS5TRVJJRVMmJngucmV2ZXJzZSgpO2QuZWRnZS5idWlsZEdyb3VwKHksdC5jb3JlR3JhcGgsdik7ZC5ub2RlLmJ1aWxkR3JvdXAoeSx4LHYpOzA8dC5pc29sYXRlZEluRXh0cmFjdC5sZW5ndGg/KHk9ZihyLCJnIixkLkNsYXNzLlNjZW5lLklORVhUUkFDVCksZC5ub2RlLmJ1aWxkR3JvdXAoeSx0Lmlzb2xhdGVkSW5FeHRyYWN0LHYpKTpnKHIsImciLGQuQ2xhc3MuU2NlbmUuSU5FWFRSQUNUKS5yZW1vdmUoKTswPHQuaXNvbGF0ZWRPdXRFeHRyYWN0Lmxlbmd0aD8oeT1mKHIsImciLGQuQ2xhc3MuU2NlbmUuT1VURVhUUkFDVCksZC5ub2RlLmJ1aWxkR3JvdXAoeSx0Lmlzb2xhdGVkT3V0RXh0cmFjdCx2KSk6ZyhyLCJnIixkLkNsYXNzLlNjZW5lLk9VVEVYVFJBQ1QpLnJlbW92ZSgpOzA8dC5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGg/Cih5PWYociwiZyIsZC5DbGFzcy5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKSxkLm5vZGUuYnVpbGRHcm91cCh5LHQubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QsdikpOmcociwiZyIsZC5DbGFzcy5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKS5yZW1vdmUoKTtsKHIsdCk7eiYmci5hdHRyKCJvcGFjaXR5IiwwKS50cmFuc2l0aW9uKCkuYXR0cigib3BhY2l0eSIsMSk7cmV0dXJuIHJ9O2QuYWRkR3JhcGhDbGlja0xpc3RlbmVyPWZ1bmN0aW9uKHIsdCl7ZDMuc2VsZWN0KHIpLm9uKCJjbGljayIsKCk9Pnt0LmZpcmUoImdyYXBoLXNlbGVjdCIpfSl9O2QudHJhbnNsYXRlPWs7ZC5wb3NpdGlvblJlY3Q9ZnVuY3Rpb24ocix0LHYseSx6KXtyLnRyYW5zaXRpb24oKS5hdHRyKCJ4Iix0LXkvMikuYXR0cigieSIsdi16LzIpLmF0dHIoIndpZHRoIix5KS5hdHRyKCJoZWlnaHQiLHopfTtkLnBvc2l0aW9uVHJpYW5nbGU9ZnVuY3Rpb24ocix0LHYseSx6KXt6Lz0yO3kvPTI7dD1bW3Qsdi16XSxbdCt5LAp2K3pdLFt0LXksdit6XV07ci50cmFuc2l0aW9uKCkuYXR0cigicG9pbnRzIix0Lm1hcCh4PT54LmpvaW4oIiwiKSkuam9pbigiICIpKX07ZC5wb3NpdGlvbkJ1dHRvbj1mdW5jdGlvbihyLHQpe2xldCB2PWMubGF5b3V0LmNvbXB1dGVDWFBvc2l0aW9uT2ZOb2RlU2hhcGUodCkrKHQuZXhwYW5kZWQ/dC53aWR0aDp0LmNvcmVCb3gud2lkdGgpLzItNix5PXQueS0odC5leHBhbmRlZD90LmhlaWdodDp0LmNvcmVCb3guaGVpZ2h0KS8yKzY7dC5ub2RlLnR5cGUhPT1jLk5vZGVUeXBlLlNFUklFU3x8dC5leHBhbmRlZHx8KHYrPTEwLHktPTIpO3Q9InRyYW5zbGF0ZSgiK3YrIiwiK3krIikiO3Iuc2VsZWN0QWxsKCJwYXRoIikudHJhbnNpdGlvbigpLmF0dHIoInRyYW5zZm9ybSIsdCk7ci5zZWxlY3QoImNpcmNsZSIpLnRyYW5zaXRpb24oKS5hdHRyKHtjeDp2LGN5OnkscjpjLmxheW91dC5QQVJBTVMubm9kZVNpemUubWV0YS5leHBhbmRCdXR0b25SYWRpdXN9KX07ZC5wb3NpdGlvbkVsbGlwc2U9CmZ1bmN0aW9uKHIsdCx2LHkseil7ci50cmFuc2l0aW9uKCkuYXR0cigiY3giLHQpLmF0dHIoImN5Iix2KS5hdHRyKCJyeCIseS8yKS5hdHRyKCJyeSIsei8yKX07ZC5odW1hbml6ZUhlYWx0aFBpbGxTdGF0PW47ZC5hZGRIZWFsdGhQaWxsPXE7ZC5hZGRIZWFsdGhQaWxscz1mdW5jdGlvbihyLHQsdil7aWYodCl7dmFyIHk9MTtkMy5zZWxlY3Qocikuc2VsZWN0QWxsKCJnLm5vZGVzaGFwZSIpLmVhY2goZnVuY3Rpb24oeil7Y29uc3QgeD10W3oubm9kZS5uYW1lXTtxKHRoaXMseD94W3ZdOm51bGwseix5KyspfSl9fX0pKGMuc2NlbmV8fChjLnNjZW5lPXt9KSl9KShhLmdyYXBofHwoYS5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi90ZW1wbGF0ZS5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXtmdW5jdGlvbiBmKHEpe2xldCByPV8ubWFwKHtkZXB0aDpxLmRlcHRoLCJ8VnwiOnEubWV0YWdyYXBoLm5vZGVzKCkubGVuZ3RoLCJ8RXwiOnEubWV0YWdyYXBoLmVkZ2VzKCkubGVuZ3RofSxmdW5jdGlvbih0LHYpe3JldHVybiB2KyJceDNkIit0fSkuam9pbigiICIpO3E9Xy5tYXAocS5vcEhpc3RvZ3JhbSxmdW5jdGlvbih0LHYpe3JldHVybiB2KyJceDNkIit0fSkuam9pbigiLCIpO3JldHVybiByKyIgW29wc10gIitxfWZ1bmN0aW9uIGcocSl7Y29uc3Qgcj1xLmdldE5vZGVNYXAoKTtsZXQgdD1PYmplY3Qua2V5cyhyKS5yZWR1Y2UoKHYseSk9Pntjb25zdCB6PXJbeV07aWYoei50eXBlIT09Yy5Ob2RlVHlwZS5NRVRBKXJldHVybiB2O3k9eS5zcGxpdCgiLyIpLmxlbmd0aC0xO2xldCB4PWYoeiksQz12W3hdfHx7bm9kZXM6W10sbGV2ZWw6eX07dlt4XT1DO0Mubm9kZXMucHVzaCh6KTtDLmxldmVsPnkmJihDLmxldmVsPQp5KTtyZXR1cm4gdn0se30pO3JldHVybiBPYmplY3Qua2V5cyh0KS5tYXAodj0+W3YsdFt2XV0pLmZpbHRlcigoWyx2XSk9Pnsoe25vZGVzOnZ9PXYpO2lmKDE8di5sZW5ndGgpcmV0dXJuITA7dj12WzBdO3JldHVybiB2LnR5cGU9PT1jLk5vZGVUeXBlLk1FVEEmJnYuYXNzb2NpYXRlZEZ1bmN0aW9ufSkuc29ydCgoWyx2XSk9PnYubm9kZXNbMF0uZGVwdGgpfWZ1bmN0aW9uIGwocSxyKXtyZXR1cm4gXy5yZWR1Y2UocSxmdW5jdGlvbih0LHYpe2xldCB5PXZbMF0sej1bXTt2WzFdLm5vZGVzLmZvckVhY2goZnVuY3Rpb24oeCl7Zm9yKGxldCBDPTA7Qzx6Lmxlbmd0aDtDKyspaWYoIXJ8fG4oeltDXS5tZXRhbm9kZS5tZXRhZ3JhcGgseC5tZXRhZ3JhcGgpKXt4LnRlbXBsYXRlSWQ9eltDXS5tZXRhbm9kZS50ZW1wbGF0ZUlkO3pbQ10ubWVtYmVycy5wdXNoKHgubmFtZSk7cmV0dXJufXgudGVtcGxhdGVJZD15KyJbIit6Lmxlbmd0aCsiXSI7ei5wdXNoKHttZXRhbm9kZTp4LG1lbWJlcnM6W3gubmFtZV19KX0pOwp6LmZvckVhY2goZnVuY3Rpb24oeCl7dFt4Lm1ldGFub2RlLnRlbXBsYXRlSWRdPXtsZXZlbDp2WzFdLmxldmVsLG5vZGVzOngubWVtYmVyc319KTtyZXR1cm4gdH0se30pfWZ1bmN0aW9uIGsocSxyLHQpe3JldHVybiBfLnNvcnRCeShxLFt2PT5yLm5vZGUodikub3Asdj0+ci5ub2RlKHYpLnRlbXBsYXRlSWQsdj0+ci5uZWlnaGJvcnModikubGVuZ3RoLHY9PnIucHJlZGVjZXNzb3JzKHYpLmxlbmd0aCx2PT5yLnN1Y2Nlc3NvcnModikubGVuZ3RoLHY9PnYuc3Vic3RyKHQubGVuZ3RoKV0pfWZ1bmN0aW9uIG4ocSxyKXtmdW5jdGlvbiB0KEksTyl7bGV0IFA9SS5zdWJzdHIodi5sZW5ndGgpLEg9Ty5zdWJzdHIoeS5sZW5ndGgpO2lmKHpbUF1eeFtIXSlyZXR1cm4gY29uc29sZS53YXJuKCJkaWZmZXJlbnQgdmlzaXQgcGF0dGVybiIsIlsiK3YrIl0iLFAsIlsiK3krIl0iLEgpLCEwO3pbUF18fCh6W1BdPXhbSF09ITAsQy5wdXNoKHtuMTpJLG4yOk99KSk7cmV0dXJuITF9aWYoIWEuZ3JhcGguaGFzU2ltaWxhckRlZ3JlZVNlcXVlbmNlKHEsCnIpKXJldHVybiExO2xldCB2PXEuZ3JhcGgoKS5uYW1lLHk9ci5ncmFwaCgpLm5hbWUsej17fSx4PXt9LEM9W107dmFyIEY9cS5zb3VyY2VzKCksRD1yLnNvdXJjZXMoKTtpZihGLmxlbmd0aCE9PUQubGVuZ3RoKXJldHVybiBjb25zb2xlLmxvZygiZGlmZmVyZW50IHNvdXJjZSBsZW5ndGgiKSwhMTtGPWsoRixxLHYpO0Q9ayhELHIseSk7Zm9yKHZhciBCPTA7QjxGLmxlbmd0aDtCKyspaWYodChGW0JdLERbQl0pKXJldHVybiExO2Zvcig7MDxDLmxlbmd0aDspe0Q9Qy5wb3AoKTtpZighcChxLm5vZGUoRC5uMSksci5ub2RlKEQubjIpKSlyZXR1cm4hMTtGPXEuc3VjY2Vzc29ycyhELm4xKTtEPXIuc3VjY2Vzc29ycyhELm4yKTtpZihGLmxlbmd0aCE9PUQubGVuZ3RoKXJldHVybiBjb25zb2xlLmxvZygiIyBvZiBzdWNjZXNzb3JzIG1pc21hdGNoIixGLEQpLCExO0Y9ayhGLHEsdik7RD1rKEQscix5KTtmb3IoQj0wO0I8Ri5sZW5ndGg7QisrKWlmKHQoRltCXSxEW0JdKSlyZXR1cm4hMX1yZXR1cm4hMH0KZnVuY3Rpb24gcChxLHIpe2lmKHEudHlwZT09PWMuTm9kZVR5cGUuTUVUQSlyZXR1cm4gcS50ZW1wbGF0ZUlkJiZyLnRlbXBsYXRlSWQmJnEudGVtcGxhdGVJZD09PXIudGVtcGxhdGVJZDtpZihxLnR5cGU9PT1jLk5vZGVUeXBlLk9QJiZyLnR5cGU9PT1jLk5vZGVUeXBlLk9QKXJldHVybiBxLm9wPT09ci5vcDtpZihxLnR5cGU9PT1jLk5vZGVUeXBlLlNFUklFUyYmci50eXBlPT09Yy5Ob2RlVHlwZS5TRVJJRVMpe2xldCB0PXEubWV0YWdyYXBoLm5vZGVDb3VudCgpO3JldHVybiB0PT09ci5tZXRhZ3JhcGgubm9kZUNvdW50KCkmJigwPT09dHx8cS5tZXRhZ3JhcGgubm9kZShxLm1ldGFncmFwaC5ub2RlcygpWzBdKS5vcD09PXIubWV0YWdyYXBoLm5vZGUoci5tZXRhZ3JhcGgubm9kZXMoKVswXSkub3ApfXJldHVybiExfWQuZGV0ZWN0PWZ1bmN0aW9uKHEscil7cT1nKHEpO2xldCB0PWwocSxyKTtyZXR1cm4gT2JqZWN0LmtleXModCkuc29ydCh2PT50W3ZdLmxldmVsKS5yZWR1Y2UoKHYsCnkpPT57dlt5XT10W3ldO3JldHVybiB2fSx7fSl9fSkoYy50ZW1wbGF0ZXx8KGMudGVtcGxhdGU9e30pKX0pKGEuZ3JhcGh8fChhLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3V0aWwuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7ZC50aW1lPWZ1bmN0aW9uKGYsZyl7bGV0IGw9RGF0ZS5ub3coKTtnPWcoKTtjb25zb2xlLmxvZyhmLCI6IixEYXRlLm5vdygpLWwsIm1zIik7cmV0dXJuIGd9O2QuZ2V0VHJhY2tlcj1mdW5jdGlvbihmKXtyZXR1cm57c2V0TWVzc2FnZTpmdW5jdGlvbihnKXtmLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTpmLnByb2dyZXNzLnZhbHVlLG1zZzpnfSl9LHVwZGF0ZVByb2dyZXNzOmZ1bmN0aW9uKGcpe2Yuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOmYucHJvZ3Jlc3MudmFsdWUrZyxtc2c6Zi5wcm9ncmVzcy5tc2d9KX0scmVwb3J0RXJyb3I6ZnVuY3Rpb24oZyxsKXtjb25zb2xlLmVycm9yKGwuc3RhY2spO2Yuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOmYucHJvZ3Jlc3MudmFsdWUsbXNnOmcsZXJyb3I6ITB9KX19fTtkLmdldFN1YnRhc2tUcmFja2VyPWZ1bmN0aW9uKGYsZyxsKXtyZXR1cm57c2V0TWVzc2FnZTpmdW5jdGlvbihrKXtmLnNldE1lc3NhZ2UobCsKIjogIitrKX0sdXBkYXRlUHJvZ3Jlc3M6ZnVuY3Rpb24oayl7Zi51cGRhdGVQcm9ncmVzcyhrKmcvMTAwKX0scmVwb3J0RXJyb3I6ZnVuY3Rpb24oayxuKXtmLnJlcG9ydEVycm9yKGwrIjogIitrLG4pfX19O2QucnVuVGFzaz1mdW5jdGlvbihmLGcsbCxrKXtrLnNldE1lc3NhZ2UoZik7dHJ5e2xldCBuPWEuZ3JhcGgudXRpbC50aW1lKGYsbCk7ay51cGRhdGVQcm9ncmVzcyhnKTtyZXR1cm4gbn1jYXRjaChuKXtrLnJlcG9ydEVycm9yKCJGYWlsZWQgIitmLG4pfX07ZC5ydW5Bc3luY1Rhc2s9ZnVuY3Rpb24oZixnLGwsayl7cmV0dXJuIG5ldyBQcm9taXNlKG49PntrLnNldE1lc3NhZ2UoZik7c2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtsZXQgcD1hLmdyYXBoLnV0aWwudGltZShmLGwpO2sudXBkYXRlUHJvZ3Jlc3MoZyk7bihwKX1jYXRjaChwKXtrLnJlcG9ydEVycm9yKCJGYWlsZWQgIitmLHApfX0sMjApfSl9O2QucnVuQXN5bmNQcm9taXNlVGFzaz1mdW5jdGlvbihmLGcsbCxrKXtyZXR1cm4gbmV3IFByb21pc2UoKG4sCnApPT57ZnVuY3Rpb24gcShyKXtrLnJlcG9ydEVycm9yKCJGYWlsZWQgIitmLHIpO3Aocil9ay5zZXRNZXNzYWdlKGYpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7bGV0IHI9RGF0ZS5ub3coKTtsKCkudGhlbihmdW5jdGlvbih0KXtjb25zb2xlLmxvZyhmLCI6IixEYXRlLm5vdygpLXIsIm1zIik7ay51cGRhdGVQcm9ncmVzcyhnKTtuKHQpfSkuY2F0Y2gocSl9Y2F0Y2gocil7cShyKX19LDIwKX0pfTtkLmVzY2FwZVF1ZXJ5U2VsZWN0b3I9ZnVuY3Rpb24oZil7cmV0dXJuIGYucmVwbGFjZSgvKFs6LlxbXF0sL1xcXChcKV0pL2csIlxcJDEiKX07ZC5NRU1PUllfVU5JVFM9W3tzeW1ib2w6IkIifSx7c3ltYm9sOiJLQiIsbnVtVW5pdHM6MTAyNH0se3N5bWJvbDoiTUIiLG51bVVuaXRzOjEwMjR9LHtzeW1ib2w6IkdCIixudW1Vbml0czoxMDI0fSx7c3ltYm9sOiJUQiIsbnVtVW5pdHM6MTAyNH0se3N5bWJvbDoiUEIiLG51bVVuaXRzOjEwMjR9XTtkLlRJTUVfVU5JVFM9W3tzeW1ib2w6Ilx1MDBiNXMifSwKe3N5bWJvbDoibXMiLG51bVVuaXRzOjFFM30se3N5bWJvbDoicyIsbnVtVW5pdHM6MUUzfSx7c3ltYm9sOiJtaW4iLG51bVVuaXRzOjYwfSx7c3ltYm9sOiJociIsbnVtVW5pdHM6NjB9LHtzeW1ib2w6ImRheXMiLG51bVVuaXRzOjI0fV07ZC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGU9ZnVuY3Rpb24oZixnLGw9MCl7cmV0dXJuIGwrMTxnLmxlbmd0aCYmZj49Z1tsKzFdLm51bVVuaXRzP2EuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUoZi9nW2wrMV0ubnVtVW5pdHMsZyxsKzEpOk51bWJlcihmLnRvUHJlY2lzaW9uKDMpKSsiICIrZ1tsXS5zeW1ib2x9O2QuaGFzRGlzcGxheWFibGVOb2RlU3RhdHM9ZnVuY3Rpb24oZil7cmV0dXJuIGYmJigwPGYudG90YWxCeXRlc3x8MDxmLmdldFRvdGFsTWljcm9zKCl8fGYub3V0cHV0U2l6ZSk/ITA6ITF9O2QucmVtb3ZlQ29tbW9uUHJlZml4PWZ1bmN0aW9uKGYpe2lmKDI+Zi5sZW5ndGgpcmV0dXJuIGY7bGV0IGc9CjAsbD0wLGs9Xy5taW4oXy5tYXAoZixuPT5uLmxlbmd0aCkpO2Zvcig7Oyl7ZysrO2xldCBuPV8ubWFwKGYscD0+cC5zdWJzdHJpbmcoMCxnKSk7aWYobi5ldmVyeSgocCxxKT0+MD09PXE/ITA6cD09PW5bcS0xXSkpe2lmKGc+PWspcmV0dXJuIGY7bD1nfWVsc2UgYnJlYWt9cmV0dXJuIF8ubWFwKGYsbj0+bi5zdWJzdHJpbmcobCkpfTtkLmNvbXB1dGVIdW1hbkZyaWVuZGx5VGltZT1mdW5jdGlvbihmKXtmPStuZXcgRGF0ZS0rbmV3IERhdGUoZi8xRTMpO3JldHVybiAzRTQ+Zj8ianVzdCBub3ciOjZFND5mP01hdGguZmxvb3IoZi8xRTMpKyIgc2Vjb25kcyBhZ28iOjEyRTQ+Zj8iYSBtaW51dGUgYWdvIjozNkU1PmY/TWF0aC5mbG9vcihmLzZFNCkrIiBtaW51dGVzIGFnbyI6MT09TWF0aC5mbG9vcihmLzM2RTUpPyJhbiBob3VyIGFnbyI6ODY0RTU+Zj9NYXRoLmZsb29yKGYvMzZFNSkrIiBob3VycyBhZ28iOjE3MjhFNT5mPyJ5ZXN0ZXJkYXkiOk1hdGguZmxvb3IoZi84NjRFNSkrIiBkYXlzIGFnbyJ9fSkoYy51dGlsfHwKKGMudXRpbD17fSkpfSkoYS5ncmFwaHx8KGEuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vbWluaW1hcC5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpe2NsYXNzIGR7Y29uc3RydWN0b3IoZixnLGwsayxuLHApe3RoaXMuc3ZnPWY7dGhpcy5sYWJlbFBhZGRpbmc9cDt0aGlzLnpvb21HPWc7dGhpcy5tYWluWm9vbT1sO3RoaXMubWF4V2FuZEg9bjtmPWQzLnNlbGVjdChrLnNoYWRvd1Jvb3QpO2xldCBxPWYuc2VsZWN0KCJzdmciKSxyPXEuc2VsZWN0KCJyZWN0Iik7dGhpcy52aWV3cG9pbnRDb29yZD17eDowLHk6MH07Zz1kMy5kcmFnKCkuc3ViamVjdChPYmplY3QpLm9uKCJkcmFnIiwoKT0+e3RoaXMudmlld3BvaW50Q29vcmQueD1kMy5ldmVudC54O3RoaXMudmlld3BvaW50Q29vcmQueT1kMy5ldmVudC55O3RoaXMudXBkYXRlVmlld3BvaW50KCl9KTtyLmRhdHVtKHRoaXMudmlld3BvaW50Q29vcmQpLmNhbGwoZyk7cS5vbigiY2xpY2siLCgpPT57aWYoIWQzLmV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpe3ZhciB0PU51bWJlcihyLmF0dHIoIndpZHRoIikpLHY9TnVtYmVyKHIuYXR0cigiaGVpZ2h0IikpLAp5PWQzLm1vdXNlKHEubm9kZSgpKTt0aGlzLnZpZXdwb2ludENvb3JkLng9eVswXS10LzI7dGhpcy52aWV3cG9pbnRDb29yZC55PXlbMV0tdi8yO3RoaXMudXBkYXRlVmlld3BvaW50KCl9fSk7dGhpcy52aWV3cG9pbnQ9ci5ub2RlKCk7dGhpcy5taW5pbWFwU3ZnPXEubm9kZSgpO3RoaXMubWluaW1hcD1rO3RoaXMuY2FudmFzPWYuc2VsZWN0KCJjYW52YXMuZmlyc3QiKS5ub2RlKCk7dGhpcy5jYW52YXNCdWZmZXI9Zi5zZWxlY3QoImNhbnZhcy5zZWNvbmQiKS5ub2RlKCk7dGhpcy5kb3dubG9hZENhbnZhcz1mLnNlbGVjdCgiY2FudmFzLmRvd25sb2FkIikubm9kZSgpO2QzLnNlbGVjdCh0aGlzLmRvd25sb2FkQ2FudmFzKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKTt0aGlzLnVwZGF0ZSgpfXVwZGF0ZVZpZXdwb2ludCgpe2QzLnNlbGVjdCh0aGlzLnZpZXdwb2ludCkuYXR0cigieCIsdGhpcy52aWV3cG9pbnRDb29yZC54KS5hdHRyKCJ5Iix0aGlzLnZpZXdwb2ludENvb3JkLnkpO2xldCBmPQotdGhpcy52aWV3cG9pbnRDb29yZC54KnRoaXMuc2NhbGVNYWluL3RoaXMuc2NhbGVNaW5pbWFwLGc9LXRoaXMudmlld3BvaW50Q29vcmQueSp0aGlzLnNjYWxlTWFpbi90aGlzLnNjYWxlTWluaW1hcDtkMy5zZWxlY3QodGhpcy5zdmcpLmNhbGwodGhpcy5tYWluWm9vbS50cmFuc2Zvcm0sZDMuem9vbUlkZW50aXR5LnRyYW5zbGF0ZShmLGcpLnNjYWxlKHRoaXMuc2NhbGVNYWluKSl9dXBkYXRlKCl7bGV0IGY9bnVsbDt0cnl7aWYoZj10aGlzLnpvb21HLmdldEJCb3goKSwwPT09Zi53aWR0aClyZXR1cm59Y2F0Y2godCl7cmV0dXJufXZhciBnPWQzLnNlbGVjdCgiI2dyYXBoZG93bmxvYWQiKTt0aGlzLmRvd25sb2FkPWcubm9kZSgpO2cub24oImNsaWNrIiwoKT0+e1VSTC5yZXZva2VPYmplY3RVUkwodGhpcy5kb3dubG9hZC5ocmVmKTt2YXIgdD10aGlzLmRvd25sb2FkQ2FudmFzLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIik7Y29uc3Qgdj10LnNsaWNlKDAsdC5pbmRleE9mKCIsIikpO2lmKHYuZW5kc1dpdGgoIjtiYXNlNjQiKSl7dmFyIHk9CmF0b2IodC5zbGljZSh0LmluZGV4T2YoIiwiKSsxKSk7dD0obmV3IFVpbnQ4QXJyYXkoeS5sZW5ndGgpKS5tYXAoKHoseCk9PnkuY2hhckNvZGVBdCh4KSk7dGhpcy5kb3dubG9hZC5ocmVmPVVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3RdLHt0eXBlOiJpbWFnZS9wbmcifSkpfWVsc2UgY29uc29sZS53YXJuKGBub24tYmFzZTY0IGRhdGEgVVJMICgke3Z9KTsgY2Fubm90IHVzZSBibG9iIGRvd25sb2FkYCksdGhpcy5kb3dubG9hZC5ocmVmPXR9KTtnPWQzLnNlbGVjdCh0aGlzLnN2Zyk7dmFyIGw9IiIsaz10aGlzLnN2ZztrPShrLmdldFJvb3ROb2RlP2suZ2V0Um9vdE5vZGUoKTp0aGlzLnN2Zy5wYXJlbnROb2RlKS5zdHlsZVNoZWV0cztmb3IodmFyIG49MDtuPGsubGVuZ3RoO24rKyl0cnl7dmFyIHA9a1tuXS5jc3NSdWxlc3x8a1tuXS5ydWxlcztpZihudWxsIT1wKWZvcihsZXQgdD0wO3Q8cC5sZW5ndGg7dCsrKWwrPXBbdF0uY3NzVGV4dC5yZXBsYWNlKC8gP3RmLVtcdy1dKyA/L2csCiIiKSsiXG4ifWNhdGNoKHQpe2lmKCJTZWN1cml0eUVycm9yIiE9PXQubmFtZSl0aHJvdyB0O31wPWcuYXBwZW5kKCJzdHlsZSIpO3AudGV4dChsKTtsPWQzLnNlbGVjdCh0aGlzLnpvb21HKTtrPWwuYXR0cigidHJhbnNmb3JtIik7bC5hdHRyKCJ0cmFuc2Zvcm0iLG51bGwpO2YuaGVpZ2h0Kz1mLnk7Zi53aWR0aCs9Zi54O2YuaGVpZ2h0Kz0yKnRoaXMubGFiZWxQYWRkaW5nO2Yud2lkdGgrPTIqdGhpcy5sYWJlbFBhZGRpbmc7Zy5hdHRyKCJ3aWR0aCIsZi53aWR0aCkuYXR0cigiaGVpZ2h0IixmLmhlaWdodCk7dGhpcy5zY2FsZU1pbmltYXA9dGhpcy5tYXhXYW5kSC9NYXRoLm1heChmLndpZHRoLGYuaGVpZ2h0KTt0aGlzLm1pbmltYXBTaXplPXt3aWR0aDpmLndpZHRoKnRoaXMuc2NhbGVNaW5pbWFwLGhlaWdodDpmLmhlaWdodCp0aGlzLnNjYWxlTWluaW1hcH07ZDMuc2VsZWN0KHRoaXMubWluaW1hcFN2ZykuYXR0cih0aGlzLm1pbmltYXBTaXplKTtkMy5zZWxlY3QodGhpcy5jYW52YXNCdWZmZXIpLmF0dHIodGhpcy5taW5pbWFwU2l6ZSk7Cm49ZDMuc2VsZWN0KHRoaXMuZG93bmxvYWRDYW52YXMpO24uc3R5bGUoIndpZHRoIixmLndpZHRoKTtuLnN0eWxlKCJoZWlnaHQiLGYuaGVpZ2h0KTtuLmF0dHIoIndpZHRoIiwzKmYud2lkdGgpO24uYXR0cigiaGVpZ2h0IiwzKmYuaGVpZ2h0KTtudWxsIT10aGlzLnRyYW5zbGF0ZSYmbnVsbCE9dGhpcy56b29tJiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PnRoaXMuem9vbSgpKTtsZXQgcT0obmV3IFhNTFNlcmlhbGl6ZXIpLnNlcmlhbGl6ZVRvU3RyaW5nKHRoaXMuc3ZnKTtwLnJlbW92ZSgpO2cuYXR0cigid2lkdGgiLG51bGwpLmF0dHIoImhlaWdodCIsbnVsbCk7bC5hdHRyKCJ0cmFuc2Zvcm0iLGspO2xldCByPW5ldyBJbWFnZTtyLm9ubG9hZD0oKT0+e3ZhciB0PXRoaXMuY2FudmFzQnVmZmVyLmdldENvbnRleHQoIjJkIik7dC5jbGVhclJlY3QoMCwwLHRoaXMuY2FudmFzQnVmZmVyLndpZHRoLHRoaXMuY2FudmFzQnVmZmVyLmhlaWdodCk7dC5kcmF3SW1hZ2UociwwLDAsdGhpcy5taW5pbWFwU2l6ZS53aWR0aCwKdGhpcy5taW5pbWFwU2l6ZS5oZWlnaHQpO3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e2QzLnNlbGVjdCh0aGlzLmNhbnZhc0J1ZmZlcikuc3R5bGUoImRpc3BsYXkiLG51bGwpO2QzLnNlbGVjdCh0aGlzLmNhbnZhcykuc3R5bGUoImRpc3BsYXkiLCJub25lIik7W3RoaXMuY2FudmFzLHRoaXMuY2FudmFzQnVmZmVyXT1bdGhpcy5jYW52YXNCdWZmZXIsdGhpcy5jYW52YXNdfSk7dD10aGlzLmRvd25sb2FkQ2FudmFzLmdldENvbnRleHQoIjJkIik7dC5jbGVhclJlY3QoMCwwLHRoaXMuZG93bmxvYWRDYW52YXMud2lkdGgsdGhpcy5kb3dubG9hZENhbnZhcy5oZWlnaHQpO3QuZHJhd0ltYWdlKHIsMCwwLHRoaXMuZG93bmxvYWRDYW52YXMud2lkdGgsdGhpcy5kb3dubG9hZENhbnZhcy5oZWlnaHQpfTtyLm9uZXJyb3I9KCk9PntyLnNyYz1VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtxXSx7dHlwZToiaW1hZ2Uvc3ZnK3htbDtjaGFyc2V0XHgzZHV0Zi04In0pKX07ci5zcmM9CiJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldFx4M2R1dGYtOCwiK2VuY29kZVVSSUNvbXBvbmVudChxKX16b29tKGYpe2lmKG51bGwhPXRoaXMuc2NhbGVNaW5pbWFwKXtmJiYodGhpcy50cmFuc2xhdGU9W2YueCxmLnldLHRoaXMuc2NhbGVNYWluPWYuayk7dmFyIGc9dGhpcy5zdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbD1kMy5zZWxlY3QodGhpcy52aWV3cG9pbnQpO3RoaXMudmlld3BvaW50Q29vcmQueD0tdGhpcy50cmFuc2xhdGVbMF0qdGhpcy5zY2FsZU1pbmltYXAvdGhpcy5zY2FsZU1haW47dGhpcy52aWV3cG9pbnRDb29yZC55PS10aGlzLnRyYW5zbGF0ZVsxXSp0aGlzLnNjYWxlTWluaW1hcC90aGlzLnNjYWxlTWFpbjtmPWcud2lkdGgqdGhpcy5zY2FsZU1pbmltYXAvdGhpcy5zY2FsZU1haW47Zz1nLmhlaWdodCp0aGlzLnNjYWxlTWluaW1hcC90aGlzLnNjYWxlTWFpbjtsLmF0dHIoIngiLHRoaXMudmlld3BvaW50Q29vcmQueCkuYXR0cigieSIsdGhpcy52aWV3cG9pbnRDb29yZC55KS5hdHRyKCJ3aWR0aCIsCmYpLmF0dHIoImhlaWdodCIsZyk7bD10aGlzLm1pbmltYXBTaXplLndpZHRoO3ZhciBrPXRoaXMubWluaW1hcFNpemUuaGVpZ2h0LG49dGhpcy52aWV3cG9pbnRDb29yZC54LHA9dGhpcy52aWV3cG9pbnRDb29yZC55Oy44PihNYXRoLm1pbihNYXRoLm1heCgwLG4rZiksbCktTWF0aC5taW4oTWF0aC5tYXgoMCxuKSxsKSkqKE1hdGgubWluKE1hdGgubWF4KDAscCtnKSxrKS1NYXRoLm1pbihNYXRoLm1heCgwLHApLGspKS8obCprKT90aGlzLm1pbmltYXAuY2xhc3NMaXN0LnJlbW92ZSgiaGlkZGVuIik6dGhpcy5taW5pbWFwLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpfX19Yy5NaW5pbWFwPWR9KShhLnNjZW5lfHwoYS5zY2VuZT17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoL3RmLWdyYXBoLW1pbmltYXAuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZ3JhcGgtbWluaW1hcCIsaW5pdDpmdW5jdGlvbihhLGMsZCxmLGcpe3JldHVybiBuZXcgdGYuc2NlbmUuTWluaW1hcChhLGMsZCx0aGlzLGYsZyl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgvdGYtZ3JhcGgtc2NlbmUuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZ3JhcGgtc2NlbmUiLHByb3BlcnRpZXM6e3JlbmRlckhpZXJhcmNoeTpPYmplY3QsbmFtZTpTdHJpbmcsY29sb3JCeTpTdHJpbmcsdHJhY2VJbnB1dHM6Qm9vbGVhbixfaGFzUmVuZGVySGllcmFyY2h5QmVlbkZpdE9uY2U6Qm9vbGVhbixfaXNBdHRhY2hlZDpCb29sZWFuLF96b29tOk9iamVjdCxoaWdobGlnaHRlZE5vZGU6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfaGlnaGxpZ2h0ZWROb2RlQ2hhbmdlZCJ9LHNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9zZWxlY3RlZE5vZGVDaGFuZ2VkIn0saGFuZGxlRWRnZVNlbGVjdGVkOk9iamVjdCxfem9vbWVkOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9vblpvb21DaGFuZ2VkIix2YWx1ZTohMX0sX3pvb21TdGFydENvb3Jkczp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX3pvb21UcmFuc2Zvcm06e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9tYXhab29tRGlzdGFuY2VGb3JDbGljazp7dHlwZTpOdW1iZXIsCnZhbHVlOjIwfSx0ZW1wbGF0ZUluZGV4OkZ1bmN0aW9uLG1pbmltYXA6T2JqZWN0LF9ub2RlR3JvdXBJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LF9hbm5vdGF0aW9uR3JvdXBJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LF9lZGdlR3JvdXBJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LG1heE1ldGFub2RlTGFiZWxMZW5ndGhGb250U2l6ZTp7dHlwZTpOdW1iZXIsdmFsdWU6OX0sbWluTWV0YW5vZGVMYWJlbExlbmd0aEZvbnRTaXplOnt0eXBlOk51bWJlcix2YWx1ZTo2fSxtYXhNZXRhbm9kZUxhYmVsTGVuZ3RoTGFyZ2VGb250Ont0eXBlOk51bWJlcix2YWx1ZToxMX0sbWF4TWV0YW5vZGVMYWJlbExlbmd0aDp7dHlwZTpOdW1iZXIsdmFsdWU6MTh9LHByb2dyZXNzOk9iamVjdCxub2RlQ29udGV4dE1lbnVJdGVtczpBcnJheSxub2RlTmFtZXNUb0hlYWx0aFBpbGxzOk9iamVjdCwKaGVhbHRoUGlsbFN0ZXBJbmRleDpOdW1iZXJ9LG9ic2VydmVyczpbIl9jb2xvckJ5Q2hhbmdlZChjb2xvckJ5KSIsIl9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkKHJlbmRlckhpZXJhcmNoeSkiLCJfYW5pbWF0ZUFuZEZpdChfaXNBdHRhY2hlZCwgcmVuZGVySGllcmFyY2h5KSIsIl91cGRhdGVIZWFsdGhQaWxscyhub2RlTmFtZXNUb0hlYWx0aFBpbGxzLCBoZWFsdGhQaWxsU3RlcEluZGV4KSIsIl91cGRhdGVJbnB1dFRyYWNlKHRyYWNlSW5wdXRzLCBzZWxlY3RlZE5vZGUpIl0sZ2V0Tm9kZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShhKX0saXNOb2RlRXhwYW5kZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZXhwYW5kZWR9LHNldE5vZGVFeHBhbmRlZDpmdW5jdGlvbigpe3RoaXMuX2J1aWxkKHRoaXMucmVuZGVySGllcmFyY2h5KTt0aGlzLl91cGRhdGVMYWJlbHMoIXRoaXMuX3pvb21lZCl9LHBhblRvTm9kZShhKXt0Zi5ncmFwaC5zY2VuZS5wYW5Ub05vZGUoYSwKdGhpcy4kLnN2Zyx0aGlzLiQucm9vdCx0aGlzLl96b29tKSYmKHRoaXMuX3pvb21lZD0hMCl9LGdldEdyYXBoU3ZnUm9vdCgpe3JldHVybiB0aGlzLiQuc3ZnfSxnZXRDb250ZXh0TWVudSgpe3JldHVybiB0aGlzLiQuY29udGV4dE1lbnV9LF9yZXNldFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5fbm9kZUdyb3VwSW5kZXg9e307dGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXg9e307dGhpcy5fZWRnZUdyb3VwSW5kZXg9e307dGhpcy5fdXBkYXRlTGFiZWxzKCExKTtkMy5zZWxlY3QodGhpcy4kLnN2Zykuc2VsZWN0KCIjcm9vdCIpLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpO3RmLmdyYXBoLnNjZW5lLm5vZGUucmVtb3ZlR3JhZGllbnREZWZpbml0aW9ucyh0aGlzLiQuc3ZnKX0sX2J1aWxkOmZ1bmN0aW9uKGEpe3RoaXMudGVtcGxhdGVJbmRleD1hLmhpZXJhcmNoeS5nZXRUZW1wbGF0ZUluZGV4KCk7dGYuZ3JhcGgudXRpbC50aW1lKCJ0Zi1ncmFwaC1zY2VuZSAobGF5b3V0KToiLGZ1bmN0aW9uKCl7dGYuZ3JhcGgubGF5b3V0LmxheW91dFNjZW5lKGEucm9vdCwKdGhpcyl9LmJpbmQodGhpcykpO3RmLmdyYXBoLnV0aWwudGltZSgidGYtZ3JhcGgtc2NlbmUgKGJ1aWxkIHNjZW5lKToiLGZ1bmN0aW9uKCl7dGYuZ3JhcGguc2NlbmUuYnVpbGRHcm91cChkMy5zZWxlY3QodGhpcy4kLnJvb3QpLGEucm9vdCx0aGlzKTt0Zi5ncmFwaC5zY2VuZS5hZGRHcmFwaENsaWNrTGlzdGVuZXIodGhpcy4kLnN2Zyx0aGlzKTt0aGlzLl91cGRhdGVJbnB1dFRyYWNlKCl9LmJpbmQodGhpcykpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVIZWFsdGhQaWxscyh0aGlzLm5vZGVOYW1lc1RvSGVhbHRoUGlsbHMsdGhpcy5oZWFsdGhQaWxsU3RlcEluZGV4KTt0aGlzLm1pbmltYXAudXBkYXRlKCl9LmJpbmQodGhpcyksdGYuZ3JhcGgubGF5b3V0LlBBUkFNUy5hbmltYXRpb24uZHVyYXRpb24pfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX3pvb209ZDMuem9vbSgpLm9uKCJlbmQiLGZ1bmN0aW9uKCl7dGhpcy5fem9vbVN0YXJ0Q29vcmRzJiYoTWF0aC5zcXJ0KE1hdGgucG93KHRoaXMuX3pvb21TdGFydENvb3Jkcy54LQp0aGlzLl96b29tVHJhbnNmb3JtLngsMikrTWF0aC5wb3codGhpcy5fem9vbVN0YXJ0Q29vcmRzLnktdGhpcy5fem9vbVRyYW5zZm9ybS55LDIpKTx0aGlzLl9tYXhab29tRGlzdGFuY2VGb3JDbGljaz90aGlzLl9maXJlRW5hYmxlQ2xpY2soKTpzZXRUaW1lb3V0KHRoaXMuX2ZpcmVFbmFibGVDbGljay5iaW5kKHRoaXMpLDUwKSk7dGhpcy5fem9vbVN0YXJ0Q29vcmRzPW51bGx9LmJpbmQodGhpcykpLm9uKCJ6b29tIixmdW5jdGlvbigpe3RoaXMuX3pvb21UcmFuc2Zvcm09ZDMuZXZlbnQudHJhbnNmb3JtO3RoaXMuX3pvb21TdGFydENvb3Jkc3x8KHRoaXMuX3pvb21TdGFydENvb3Jkcz10aGlzLl96b29tVHJhbnNmb3JtLHRoaXMuZmlyZSgiZGlzYWJsZS1jbGljayIpKTt0aGlzLl96b29tZWQ9ITA7ZDMuc2VsZWN0KHRoaXMuJC5yb290KS5hdHRyKCJ0cmFuc2Zvcm0iLGQzLmV2ZW50LnRyYW5zZm9ybSk7dGhpcy5taW5pbWFwLnpvb20oZDMuZXZlbnQudHJhbnNmb3JtKX0uYmluZCh0aGlzKSk7CmQzLnNlbGVjdCh0aGlzLiQuc3ZnKS5jYWxsKHRoaXMuX3pvb20pLm9uKCJkYmxjbGljay56b29tIixudWxsKTtkMy5zZWxlY3Qod2luZG93KS5vbigicmVzaXplIixmdW5jdGlvbigpe3RoaXMubWluaW1hcC56b29tKCl9LmJpbmQodGhpcykpO3RoaXMubWluaW1hcD10aGlzLiQubWluaW1hcC5pbml0KHRoaXMuJC5zdmcsdGhpcy4kLnJvb3QsdGhpcy5fem9vbSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLm1pbmltYXAuc2l6ZSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLnN1YnNjZW5lLm1ldGEubGFiZWxIZWlnaHQpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITApfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITEpfSxfcmVuZGVySGllcmFyY2h5Q2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLl9oYXNSZW5kZXJIaWVyYXJjaHlCZWVuRml0T25jZT0hMTt0aGlzLl9yZXNldFN0YXRlKCk7dGhpcy5fYnVpbGQoYSl9LF9hbmltYXRlQW5kRml0OmZ1bmN0aW9uKGEpeyF0aGlzLl9oYXNSZW5kZXJIaWVyYXJjaHlCZWVuRml0T25jZSYmCmEmJnNldFRpbWVvdXQodGhpcy5maXQuYmluZCh0aGlzKSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLmFuaW1hdGlvbi5kdXJhdGlvbil9LF91cGRhdGVMYWJlbHM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy4kJCgiLnRpdGxlIiksZD1jLnN0eWxlLGY9dGhpcy4kJCgiLmF1eFRpdGxlIiksZz1mLnN0eWxlLGw9dGhpcy4kJCgiLmZ1bmN0aW9uTGlicmFyeVRpdGxlIikuc3R5bGU7Y29uc3Qgaz1kMy5zZWxlY3QodGhpcy4kLnN2Zyk7dmFyIG49ay5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuQ09SRSkubm9kZSgpO2lmKGEmJm4mJnRoaXMucHJvZ3Jlc3MmJjEwMD09PXRoaXMucHJvZ3Jlc3MudmFsdWUpe2E9ay5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuSU5FWFRSQUNUKS5ub2RlKCl8fGsuc2VsZWN0KCIuIisKdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuR1JPVVArIlx4M2UuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5PVVRFWFRSQUNUKS5ub2RlKCk7dmFyIHA9bi5nZXRDVE0oKS5lO249YT9hLmdldENUTSgpLmU6bnVsbDtkLmRpc3BsYXk9ImlubGluZSI7ZC5sZWZ0PXArInB4IjtudWxsIT09biYmbiE9PXA/KGcuZGlzcGxheT0iaW5saW5lIixuPU1hdGgubWF4KHArYy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCxuKSxnLmxlZnQ9bisicHgiKTpnLmRpc3BsYXk9Im5vbmUiO2M9KGM9ay5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSkubm9kZSgpKT9jLmdldENUTSgpLmU6bnVsbDtudWxsIT09YyYmYyE9PW4/KGwuZGlzcGxheT0iaW5saW5lIixjPU1hdGgubWF4KG4rZi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCxjKSxsLmxlZnQ9YysicHgiKToKbC5kaXNwbGF5PSJub25lIn1lbHNlIGQuZGlzcGxheT0ibm9uZSIsZy5kaXNwbGF5PSJub25lIixsLmRpc3BsYXk9Im5vbmUifSxfY29sb3JCeUNoYW5nZWQ6ZnVuY3Rpb24oKXtudWxsIT10aGlzLnJlbmRlckhpZXJhcmNoeSYmKF8uZWFjaCh0aGlzLl9ub2RlR3JvdXBJbmRleCwoYSxjKT0+e3RoaXMuX3VwZGF0ZU5vZGVTdGF0ZShjKX0pLHRoaXMubWluaW1hcC51cGRhdGUoKSl9LGZpdDpmdW5jdGlvbigpe3RoaXMuX2hhc1JlbmRlckhpZXJhcmNoeUJlZW5GaXRPbmNlPSEwO3RmLmdyYXBoLnNjZW5lLmZpdCh0aGlzLiQuc3ZnLHRoaXMuJC5yb290LHRoaXMuX3pvb20sZnVuY3Rpb24oKXt0aGlzLl96b29tZWQ9ITF9LmJpbmQodGhpcykpfSxpc05vZGVTZWxlY3RlZDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PXRoaXMuc2VsZWN0ZWROb2RlfSxpc05vZGVIaWdobGlnaHRlZDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PXRoaXMuaGlnaGxpZ2h0ZWROb2RlfSxhZGRBbm5vdGF0aW9uR3JvdXA6ZnVuY3Rpb24oYSwKYyxkKXthPWEubm9kZS5uYW1lO3RoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2FdPXRoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2FdfHx7fTt0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleFthXVtjLm5vZGUubmFtZV09ZH0sZ2V0QW5ub3RhdGlvbkdyb3Vwc0luZGV4OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleFthXX0scmVtb3ZlQW5ub3RhdGlvbkdyb3VwOmZ1bmN0aW9uKGEsYyl7ZGVsZXRlIHRoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2Eubm9kZS5uYW1lXVtjLm5vZGUubmFtZV19LGFkZE5vZGVHcm91cDpmdW5jdGlvbihhLGMpe3RoaXMuX25vZGVHcm91cEluZGV4W2FdPWN9LGdldE5vZGVHcm91cDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fbm9kZUdyb3VwSW5kZXhbYV19LHJlbW92ZU5vZGVHcm91cDpmdW5jdGlvbihhKXtkZWxldGUgdGhpcy5fbm9kZUdyb3VwSW5kZXhbYV19LGFkZEVkZ2VHcm91cDpmdW5jdGlvbihhLGMpe3RoaXMuX2VkZ2VHcm91cEluZGV4W2FdPQpjfSxnZXRFZGdlR3JvdXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX2VkZ2VHcm91cEluZGV4W2FdfSxfdXBkYXRlSGVhbHRoUGlsbHM6ZnVuY3Rpb24oYSxjKXt0Zi5ncmFwaC5zY2VuZS5hZGRIZWFsdGhQaWxscyh0aGlzLiQuc3ZnLGEsYyl9LF91cGRhdGVOb2RlU3RhdGU6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5nZXROb2RlKGEpLGQ9dGhpcy5nZXROb2RlR3JvdXAoYSk7ZCYmdGYuZ3JhcGguc2NlbmUubm9kZS5zdHlsaXplKGQsYyx0aGlzKTtjLm5vZGUudHlwZT09PXRmLmdyYXBoLk5vZGVUeXBlLk1FVEEmJmMubm9kZS5hc3NvY2lhdGVkRnVuY3Rpb24mJiFjLmlzTGlicmFyeUZ1bmN0aW9uJiYoZD1kMy5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSsnIGdbZGF0YS1uYW1lXHgzZCInKyh0Zi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKwpjLm5vZGUuYXNzb2NpYXRlZEZ1bmN0aW9uKSsnIl0nKSx0Zi5ncmFwaC5zY2VuZS5ub2RlLnN0eWxpemUoZCxjLHRoaXMpKTtfLmVhY2godGhpcy5nZXRBbm5vdGF0aW9uR3JvdXBzSW5kZXgoYSksZj0+e3RmLmdyYXBoLnNjZW5lLm5vZGUuc3R5bGl6ZShmLGMsdGhpcyx0Zi5ncmFwaC5zY2VuZS5DbGFzcy5Bbm5vdGF0aW9uLk5PREUpfSl9LF9zZWxlY3RlZE5vZGVDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7aWYoYSE9PWMmJihjJiZ0aGlzLl91cGRhdGVOb2RlU3RhdGUoYyksYSkpe3RoaXMubWluaW1hcC51cGRhdGUoKTtjPXRoaXMucmVuZGVySGllcmFyY2h5LmhpZXJhcmNoeS5ub2RlKGEpO2Zvcih2YXIgZD1bXTtudWxsIT1jLnBhcmVudE5vZGUmJmMucGFyZW50Tm9kZS5uYW1lIT10Zi5ncmFwaC5ST09UX05BTUU7KWM9Yy5wYXJlbnROb2RlLGQucHVzaChjLm5hbWUpO3ZhciBmO18uZm9yRWFjaFJpZ2h0KGQsZz0+e3RoaXMucmVuZGVySGllcmFyY2h5LmJ1aWxkU3ViaGllcmFyY2h5KGcpOwpnPXRoaXMucmVuZGVySGllcmFyY2h5LmdldFJlbmRlck5vZGVCeU5hbWUoZyk7Zy5ub2RlLmlzR3JvdXBOb2RlJiYhZy5leHBhbmRlZCYmKGcuZXhwYW5kZWQ9ITAsZnx8KGY9ZykpfSk7ZiYmKHRoaXMuc2V0Tm9kZUV4cGFuZGVkKGYpLHRoaXMuX3pvb21lZD0hMCk7YSYmdGhpcy5fdXBkYXRlTm9kZVN0YXRlKGEpO3NldFRpbWVvdXQoKCk9Pnt0aGlzLnBhblRvTm9kZShhKX0sdGYuZ3JhcGgubGF5b3V0LlBBUkFNUy5hbmltYXRpb24uZHVyYXRpb24pfX0sX2hpZ2hsaWdodGVkTm9kZUNoYW5nZWQ6ZnVuY3Rpb24oYSxjKXthIT09YyYmKGEmJnRoaXMuX3VwZGF0ZU5vZGVTdGF0ZShhKSxjJiZ0aGlzLl91cGRhdGVOb2RlU3RhdGUoYykpfSxfb25ab29tQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUxhYmVscyghdGhpcy5fem9vbWVkKX0sX2ZpcmVFbmFibGVDbGljazpmdW5jdGlvbigpe3RoaXMuZmlyZSgiZW5hYmxlLWNsaWNrIil9LF91cGRhdGVJbnB1dFRyYWNlOmZ1bmN0aW9uKCl7dGYuZ3JhcGguc2NlbmUubm9kZS51cGRhdGVJbnB1dFRyYWNlKHRoaXMuZ2V0R3JhcGhTdmdSb290KCksCnRoaXMucmVuZGVySGllcmFyY2h5LHRoaXMuc2VsZWN0ZWROb2RlLHRoaXMudHJhY2VJbnB1dHMpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoL3RmLWdyYXBoLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWdyYXBoIixwcm9wZXJ0aWVzOntncmFwaEhpZXJhcmNoeTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLG9ic2VydmVyOiJfZ3JhcGhDaGFuZ2VkIn0sYmFzaWNHcmFwaDpPYmplY3Qsc3RhdHM6T2JqZWN0LGRldmljZXNGb3JTdGF0czpPYmplY3QsaGllcmFyY2h5UGFyYW1zOk9iamVjdCxwcm9ncmVzczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSx0aXRsZTpTdHJpbmcsc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGVjdGVkRWRnZTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxfbGFzdFNlbGVjdGVkRWRnZUdyb3VwOk9iamVjdCxoaWdobGlnaHRlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sY29sb3JCeTpTdHJpbmcsY29sb3JCeVBhcmFtczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSxyZW5kZXJIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sdHJhY2VJbnB1dHM6Qm9vbGVhbiwKbm9kZUNvbnRleHRNZW51SXRlbXM6QXJyYXksX3JlbmRlckRlcHRoOnt0eXBlOk51bWJlcix2YWx1ZToxfSxfYWxsb3dHcmFwaFNlbGVjdDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxub2RlTmFtZXNUb0hlYWx0aFBpbGxzOk9iamVjdCxoZWFsdGhQaWxsU3RlcEluZGV4Ok51bWJlcixlZGdlV2lkdGhGdW5jdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6IiJ9LGhhbmRsZU5vZGVTZWxlY3RlZDp7dHlwZTpPYmplY3QsdmFsdWU6IiJ9LGVkZ2VMYWJlbEZ1bmN0aW9uOnt0eXBlOk9iamVjdCx2YWx1ZToiIn0saGFuZGxlRWRnZVNlbGVjdGVkOnt0eXBlOk9iamVjdCx2YWx1ZToiIn19LG9ic2VydmVyczpbIl9zdGF0c0NoYW5nZWQoc3RhdHMsIGRldmljZXNGb3JTdGF0cykiLCJfYnVpbGROZXdSZW5kZXJIaWVyYXJjaHkoZ3JhcGhIaWVyYXJjaHksIGVkZ2VXaWR0aEZ1bmN0aW9uLCBoYW5kbGVOb2RlU2VsZWN0ZWQsIGVkZ2VMYWJlbEZ1bmN0aW9uLCBoYW5kbGVFZGdlU2VsZWN0ZWQpIiwiX3NlbGVjdGVkTm9kZUNoYW5nZWQoc2VsZWN0ZWROb2RlKSIsCiJfc2VsZWN0ZWRFZGdlQ2hhbmdlZChzZWxlY3RlZEVkZ2UpIl0scGFuVG9Ob2RlKGEpe3RoaXMuJCQoInRmLWdyYXBoLXNjZW5lIikucGFuVG9Ob2RlKGEpfSxfYnVpbGROZXdSZW5kZXJIaWVyYXJjaHkoYSl7YSYmdGhpcy5fYnVpbGRSZW5kZXJIaWVyYXJjaHkoYSl9LF9zdGF0c0NoYW5nZWQ6ZnVuY3Rpb24oYSxjKXt0aGlzLmdyYXBoSGllcmFyY2h5JiYoYSYmYyYmKHRmLmdyYXBoLmpvaW5TdGF0c0luZm9XaXRoR3JhcGgodGhpcy5iYXNpY0dyYXBoLGEsYyksdGYuZ3JhcGguaGllcmFyY2h5LmpvaW5BbmRBZ2dyZWdhdGVTdGF0cyh0aGlzLmdyYXBoSGllcmFyY2h5KSksdGhpcy5fYnVpbGRSZW5kZXJIaWVyYXJjaHkodGhpcy5ncmFwaEhpZXJhcmNoeSkpfSxfYnVpbGRSZW5kZXJIaWVyYXJjaHk6ZnVuY3Rpb24oYSl7dGYuZ3JhcGgudXRpbC50aW1lKCJuZXcgdGYuZ3JhcGgucmVuZGVyLkhpZXJhcmNoeSIsZnVuY3Rpb24oKXtmdW5jdGlvbiBjKGYpe3JldHVybnttaW5WYWx1ZTpmLmRvbWFpbigpWzBdLAptYXhWYWx1ZTpmLmRvbWFpbigpWzFdLHN0YXJ0Q29sb3I6Zi5yYW5nZSgpWzBdLGVuZENvbG9yOmYucmFuZ2UoKVsxXX19aWYoYS5yb290LnR5cGU9PT10Zi5ncmFwaC5Ob2RlVHlwZS5NRVRBKXt2YXIgZD1uZXcgdGYuZ3JhcGgucmVuZGVyLlJlbmRlckdyYXBoSW5mbyhhLCEhdGhpcy5zdGF0cyk7ZC5lZGdlTGFiZWxGdW5jdGlvbj10aGlzLmVkZ2VMYWJlbEZ1bmN0aW9uO2QuZWRnZVdpZHRoRnVuY3Rpb249dGhpcy5lZGdlV2lkdGhGdW5jdGlvbjt0aGlzLl9zZXRDb2xvckJ5UGFyYW1zKHtjb21wdXRlX3RpbWU6YyhkLmNvbXB1dGVUaW1lU2NhbGUpLG1lbW9yeTpjKGQubWVtb3J5VXNhZ2VTY2FsZSksZGV2aWNlOl8ubWFwKGQuZGV2aWNlQ29sb3JNYXAuZG9tYWluKCksZnVuY3Rpb24oZil7cmV0dXJue2RldmljZTpmLGNvbG9yOmQuZGV2aWNlQ29sb3JNYXAoZil9fSkseGxhX2NsdXN0ZXI6Xy5tYXAoZC54bGFDbHVzdGVyQ29sb3JNYXAuZG9tYWluKCksZnVuY3Rpb24oZil7cmV0dXJue3hsYV9jbHVzdGVyOmYsCmNvbG9yOmQueGxhQ2x1c3RlckNvbG9yTWFwKGYpfX0pfSk7dGhpcy5fc2V0UmVuZGVySGllcmFyY2h5KGQpO3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmZpcmUoInJlbmRlcmVkIil9KX19LmJpbmQodGhpcykpfSxfZ2V0VmlzaWJsZTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnJlbmRlckhpZXJhcmNoeS5nZXROZWFyZXN0VmlzaWJsZUFuY2VzdG9yKGEpOmF9LGxpc3RlbmVyczp7ImdyYXBoLXNlbGVjdCI6Il9ncmFwaFNlbGVjdGVkIiwiZGlzYWJsZS1jbGljayI6Il9kaXNhYmxlQ2xpY2siLCJlbmFibGUtY2xpY2siOiJfZW5hYmxlQ2xpY2siLCJub2RlLXRvZ2dsZS1leHBhbmQiOiJfbm9kZVRvZ2dsZUV4cGFuZCIsIm5vZGUtc2VsZWN0IjoiX25vZGVTZWxlY3RlZCIsIm5vZGUtaGlnaGxpZ2h0IjoiX25vZGVIaWdobGlnaHRlZCIsIm5vZGUtdW5oaWdobGlnaHQiOiJfbm9kZVVuaGlnaGxpZ2h0ZWQiLCJub2RlLXRvZ2dsZS1leHRyYWN0IjoiX25vZGVUb2dnbGVFeHRyYWN0IiwKIm5vZGUtdG9nZ2xlLXNlcmllc2dyb3VwIjoiX25vZGVUb2dnbGVTZXJpZXNHcm91cCIsImVkZ2Utc2VsZWN0IjoiX2VkZ2VTZWxlY3RlZCIsImFubm90YXRpb24tc2VsZWN0IjoiX25vZGVTZWxlY3RlZCIsImFubm90YXRpb24taGlnaGxpZ2h0IjoiX25vZGVIaWdobGlnaHRlZCIsImFubm90YXRpb24tdW5oaWdobGlnaHQiOiJfbm9kZVVuaGlnaGxpZ2h0ZWQifSxmaXQ6ZnVuY3Rpb24oKXt0aGlzLiQuc2NlbmUuZml0KCl9LF9ncmFwaENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoImdyYXBoLXNlbGVjdCIpfSxfZ3JhcGhTZWxlY3RlZDpmdW5jdGlvbigpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3QmJih0aGlzLnNldCgic2VsZWN0ZWROb2RlIixudWxsKSx0aGlzLnNldCgic2VsZWN0ZWRFZGdlIixudWxsKSk7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMH0sX2Rpc2FibGVDbGljazpmdW5jdGlvbigpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3Q9ITF9LF9lbmFibGVDbGljazpmdW5jdGlvbigpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3Q9CiEwfSxfc2VsZWN0ZWROb2RlQ2hhbmdlZChhKXt0aGlzLmhhbmRsZU5vZGVTZWxlY3RlZCYmdGhpcy5oYW5kbGVOb2RlU2VsZWN0ZWQoYSl9LF9zZWxlY3RlZEVkZ2VDaGFuZ2VkKGEpe3RoaXMuX2Rlc2VsZWN0UHJldmlvdXNFZGdlKCk7YSYmKHRoaXMuX2xhc3RTZWxlY3RlZEVkZ2VHcm91cC5jbGFzc2VkKHRmLmdyYXBoLnNjZW5lLkNsYXNzLkVkZ2UuU0VMRUNURUQsITApLHRoaXMuX3VwZGF0ZU1hcmtlck9mU2VsZWN0ZWRFZGdlKGEpKTt0aGlzLmhhbmRsZUVkZ2VTZWxlY3RlZCYmdGhpcy5oYW5kbGVFZGdlU2VsZWN0ZWQoYSl9LF9ub2RlU2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdCYmdGhpcy5zZXQoInNlbGVjdGVkTm9kZSIsYS5kZXRhaWwubmFtZSk7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMH0sX2VkZ2VTZWxlY3RlZChhKXt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0JiYodGhpcy5zZXQoIl9sYXN0U2VsZWN0ZWRFZGdlR3JvdXAiLGEuZGV0YWlsLmVkZ2VHcm91cCksCnRoaXMuc2V0KCJzZWxlY3RlZEVkZ2UiLGEuZGV0YWlsLmVkZ2VEYXRhKSk7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMH0sX25vZGVIaWdobGlnaHRlZDpmdW5jdGlvbihhKXt0aGlzLnNldCgiaGlnaGxpZ2h0ZWROb2RlIixhLmRldGFpbC5uYW1lKX0sX25vZGVVbmhpZ2hsaWdodGVkOmZ1bmN0aW9uKCl7dGhpcy5zZXQoImhpZ2hsaWdodGVkTm9kZSIsbnVsbCl9LF9ub2RlVG9nZ2xlRXhwYW5kOmZ1bmN0aW9uKGEpe3RoaXMuX25vZGVTZWxlY3RlZChhKTthPWEuZGV0YWlsLm5hbWU7dmFyIGM9dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShhKTtjLm5vZGUudHlwZSE9PXRmLmdyYXBoLk5vZGVUeXBlLk9QJiYodGhpcy5yZW5kZXJIaWVyYXJjaHkuYnVpbGRTdWJoaWVyYXJjaHkoYSksYy5leHBhbmRlZD0hYy5leHBhbmRlZCx0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy4kLnNjZW5lLnNldE5vZGVFeHBhbmRlZChjKX0sNzUpKX0sX25vZGVUb2dnbGVFeHRyYWN0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZVRvZ2dsZUV4dHJhY3QoYS5kZXRhaWwubmFtZSl9LApub2RlVG9nZ2xlRXh0cmFjdDpmdW5jdGlvbihhKXthPXRoaXMucmVuZGVySGllcmFyY2h5LmdldFJlbmRlck5vZGVCeU5hbWUoYSk7YS5ub2RlLmluY2x1ZGU9YS5ub2RlLmluY2x1ZGU9PXRmLmdyYXBoLkluY2x1c2lvblR5cGUuSU5DTFVERT90Zi5ncmFwaC5JbmNsdXNpb25UeXBlLkVYQ0xVREU6YS5ub2RlLmluY2x1ZGU9PXRmLmdyYXBoLkluY2x1c2lvblR5cGUuRVhDTFVERT90Zi5ncmFwaC5JbmNsdXNpb25UeXBlLklOQ0xVREU6dGhpcy5yZW5kZXJIaWVyYXJjaHkuaXNOb2RlQXV4aWxpYXJ5KGEpP3RmLmdyYXBoLkluY2x1c2lvblR5cGUuSU5DTFVERTp0Zi5ncmFwaC5JbmNsdXNpb25UeXBlLkVYQ0xVREU7dGhpcy5fYnVpbGRSZW5kZXJIaWVyYXJjaHkodGhpcy5ncmFwaEhpZXJhcmNoeSl9LF9ub2RlVG9nZ2xlU2VyaWVzR3JvdXA6ZnVuY3Rpb24oYSl7dGhpcy5ub2RlVG9nZ2xlU2VyaWVzR3JvdXAoYS5kZXRhaWwubmFtZSl9LG5vZGVUb2dnbGVTZXJpZXNHcm91cDpmdW5jdGlvbihhKXt0Zi5ncmFwaC50b2dnbGVOb2RlU2VyaWVzR3JvdXAodGhpcy5oaWVyYXJjaHlQYXJhbXMuc2VyaWVzTWFwLAphKTt0aGlzLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTowLG1zZzoiIn0pO3RmLmdyYXBoLmhpZXJhcmNoeS5idWlsZCh0aGlzLmJhc2ljR3JhcGgsdGhpcy5oaWVyYXJjaHlQYXJhbXMsdGYuZ3JhcGgudXRpbC5nZXRTdWJ0YXNrVHJhY2tlcih0Zi5ncmFwaC51dGlsLmdldFRyYWNrZXIodGhpcyksMTAwLCJOYW1lc3BhY2UgaGllcmFyY2h5IikpLnRoZW4oZnVuY3Rpb24oYyl7dGhpcy5zZXQoImdyYXBoSGllcmFyY2h5IixjKTt0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0aGlzLmdyYXBoSGllcmFyY2h5KX0uYmluZCh0aGlzKSl9LF9kZXNlbGVjdFByZXZpb3VzRWRnZSgpe2QzLnNlbGVjdCgiLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuRWRnZS5TRUxFQ1RFRCkuY2xhc3NlZCh0Zi5ncmFwaC5zY2VuZS5DbGFzcy5FZGdlLlNFTEVDVEVELCExKS5lYWNoKGE9PntpZihhLmxhYmVsKXtjb25zdCBjPWQzLnNlbGVjdCh0aGlzKS5zZWxlY3RBbGwoInBhdGguZWRnZWxpbmUiKTthLmxhYmVsLnN0YXJ0TWFya2VySWQmJgpjLnN0eWxlKCJtYXJrZXItc3RhcnQiLGB1cmwoIyR7YS5sYWJlbC5zdGFydE1hcmtlcklkfSlgKTthLmxhYmVsLmVuZE1hcmtlcklkJiZjLnN0eWxlKCJtYXJrZXItZW5kIixgdXJsKCMke2EubGFiZWwuZW5kTWFya2VySWR9KWApfX0pfSxfdXBkYXRlTWFya2VyT2ZTZWxlY3RlZEVkZ2UoYSl7aWYoYS5sYWJlbCl7dmFyIGM9YS5sYWJlbC5zdGFydE1hcmtlcklkfHxhLmxhYmVsLmVuZE1hcmtlcklkO2lmKGMpe2NvbnN0IGQ9Yy5yZXBsYWNlKCJkYXRhZmxvdy0iLCJzZWxlY3RlZC0iKTtsZXQgZj10aGlzLiQkKCIjIitkKTtmfHwoYz10aGlzLiQuc2NlbmUucXVlcnlTZWxlY3RvcigiIyIrYyksZj1jLmNsb25lTm9kZSghMCksZi5zZXRBdHRyaWJ1dGUoImlkIixkKSxmLmNsYXNzTGlzdC5hZGQoInNlbGVjdGVkLWFycm93aGVhZCIpLGMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChmKSk7YT1hLmxhYmVsLnN0YXJ0TWFya2VySWQ/Im1hcmtlci1zdGFydCI6Im1hcmtlci1lbmQiO3RoaXMuX2xhc3RTZWxlY3RlZEVkZ2VHcm91cC5zZWxlY3RBbGwoInBhdGguZWRnZWxpbmUiKS5zdHlsZShhLApgdXJsKCMke2R9KWApfX19LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4hYX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1sb2FkZXIvdGYtZ3JhcGgtbG9hZGVyLmpzCihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWdyYXBoLWxvYWRlciIsX3RlbXBsYXRlOm51bGwscHJvcGVydGllczp7ZGF0YXNldHM6QXJyYXksc2VsZWN0ZWREYXRhOnt0eXBlOk51bWJlcix2YWx1ZTowfSxzZWxlY3RlZEZpbGU6T2JqZWN0LGNvbXBhdGliaWxpdHlQcm92aWRlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBhLmdyYXBoLm9wLlRwdUNvbXBhdGliaWxpdHlQcm92aWRlcn0sb3ZlcnJpZGluZ0hpZXJhcmNoeVBhcmFtczp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LHByb2dyZXNzOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LG91dEdyYXBoSGllcmFyY2h5Ont0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9LG91dEdyYXBoOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9LG91dEhpZXJhcmNoeVBhcmFtczp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfX0sb2JzZXJ2ZXJzOlsiX2xvYWREYXRhKGRhdGFzZXRzLCBzZWxlY3RlZERhdGEsIG92ZXJyaWRpbmdIaWVyYXJjaHlQYXJhbXMsIGNvbXBhdGliaWxpdHlQcm92aWRlcikiLAoiX2xvYWRGaWxlKHNlbGVjdGVkRmlsZSwgb3ZlcnJpZGluZ0hpZXJhcmNoeVBhcmFtcywgY29tcGF0aWJpbGl0eVByb3ZpZGVyKSJdLF9sb2FkRGF0YSgpe3RoaXMuZGVib3VuY2UoImxvYWQiLCgpPT57Y29uc3QgZD10aGlzLmRhdGFzZXRzW3RoaXMuc2VsZWN0ZWREYXRhXTtkJiZ0aGlzLl9wYXJzZUFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoKGQucGF0aCl9KX0sX3BhcnNlQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoZCxmKXtjb25zdCB7b3ZlcnJpZGluZ0hpZXJhcmNoeVBhcmFtczpnLGNvbXBhdGliaWxpdHlQcm92aWRlcjpsfT10aGlzO3RoaXMucHJvZ3Jlc3M9e3ZhbHVlOjAsbXNnOiIifTtjb25zdCBrPWEuZ3JhcGgudXRpbC5nZXRUcmFja2VyKHRoaXMpLG49T2JqZWN0LmFzc2lnbih7fSxhLmdyYXBoLmhpZXJhcmNoeS5EZWZhdWx0SGllcmFyY2h5UGFyYW1zLGcpO2EuZ3JhcGgubG9hZGVyLmZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoaywKZCxmLGwsbikudGhlbigoe2dyYXBoOnAsZ3JhcGhIaWVyYXJjaHk6cX0pPT57dGhpcy5fc2V0T3V0SGllcmFyY2h5UGFyYW1zKG4pO3RoaXMuX3NldE91dEdyYXBoKHApO3RoaXMuX3NldE91dEdyYXBoSGllcmFyY2h5KHEpfSl9LF9sb2FkRmlsZShkKXtpZihkKXtkPWQudGFyZ2V0O3ZhciBmPWQuZmlsZXNbMF07ZiYmKGQudmFsdWU9IiIsdGhpcy5fcGFyc2VBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChudWxsLGYpKX19fSl9KShjLmxvYWRlcnx8KGMubG9hZGVyPXt9KSl9KShhLmdyYXBofHwoYS5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC9oZWFsdGgtcGlsbHMuanMKdmFyIGdwOwooZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhnLGwpe2lmKG51bGw9PWcpdGhyb3cgRXJyb3IoYE1pc3NpbmcgcmVmVmFsdWUgZm9yIGNvbmRpdGlvbiAoJHtsfSkuYCk7fWZ1bmN0aW9uIGQoZyl7cmV0dXJuIG51bGw9PWd8fDA9PWcubGVuZ3RofHwxIT09Z1swXX1jb25zdCBmPXtJTkZfT1JfTkFOOntkZXNjcmlwdGlvbjoiQ29udGFpbnMgKy8tXHUyMjFlIG9yIE5hTiIscHJlZGljYXRlOmc9PjA8Z1syXXx8MDxnWzNdfHwwPGdbN119LElORjp7ZGVzY3JpcHRpb246IkNvbnRhaW5zICsvLVx1MjIxZSIscHJlZGljYXRlOmc9PjA8Z1szXXx8MDxnWzddfSxOQU46e2Rlc2NyaXB0aW9uOiJDb250YWlucyBOYU4iLHByZWRpY2F0ZTpnPT4wPGdbMl19LE1BWF9HVDp7ZGVzY3JpcHRpb246Ik1heCBceDNlIixwcmVkaWNhdGU6KGcsbCk9PntjKGwsIk1BWF9HVCIpO3JldHVybiBnWzldPmx9fSxNQVhfTFQ6e2Rlc2NyaXB0aW9uOiJNYXggXHgzYyIscHJlZGljYXRlOihnLGwpPT57YyhsLCJNQVhfTFQiKTsKcmV0dXJuIGdbOV08bH19LE1JTl9HVDp7ZGVzY3JpcHRpb246Ik1pbiBceDNlIixwcmVkaWNhdGU6KGcsbCk9PntjKGwsIk1JTl9HVCIpO3JldHVybiBnWzhdPmx9fSxNSU5fTFQ6e2Rlc2NyaXB0aW9uOiJNaW4gXHgzYyIscHJlZGljYXRlOihnLGwpPT57YyhsLCJNSU5fTFQiKTtyZXR1cm4gZ1s4XTxsfX0sTUVBTl9HVDp7ZGVzY3JpcHRpb246Ik1lYW4gXHgzZSIscHJlZGljYXRlOihnLGwpPT57YyhsLCJNRUFOX0dUIik7cmV0dXJuIGdbMTBdPmx9fSxNRUFOX0xUOntkZXNjcmlwdGlvbjoiTWVhbiBceDNjIixwcmVkaWNhdGU6KGcsbCk9PntjKGwsIk1FQU5fTFQiKTtyZXR1cm4gZ1sxMF08bH19LFJBTkdFX0dUOntkZXNjcmlwdGlvbjoiTWF4IC0gTWluIFx4M2UiLHByZWRpY2F0ZTooZyxsKT0+e2MobCwiUkFOR0VfR1QiKTtyZXR1cm4gZ1s5XS1nWzhdPmx9fSxSQU5HRV9MVDp7ZGVzY3JpcHRpb246Ik1heCAtIE1pbiBceDNjIixwcmVkaWNhdGU6KGcsbCk9PntjKGwsIlJBTkdFX0xUIik7CnJldHVybiBnWzldLWdbOF08bH19LFNURERFVl9HVDp7ZGVzY3JpcHRpb246IlN0YW5kYXJkIGRldmlhdGlvbiBceDNlIixwcmVkaWNhdGU6KGcsbCk9PntjKGwsIlNURERFVl9HVCIpO3JldHVybiBNYXRoLnNxcnQoZ1sxMV0pPmx9fSxTVERERVZfTFQ6e2Rlc2NyaXB0aW9uOiJTdGFuZGFyZCBkZXZpYXRpb24gXHgzYyIscHJlZGljYXRlOihnLGwpPT57YyhsLCJTVERERVZfTFQiKTtyZXR1cm4gTWF0aC5zcXJ0KGdbMTFdKTxsfX19O2EudGVuc29yQ29uZGl0aW9uRGVzY3JpcHRpb24yS2V5PWZ1bmN0aW9uKGcpe2Zvcihjb25zdCBsIGluIGYpaWYoZi5oYXNPd25Qcm9wZXJ0eShsKSYmZltsXS5kZXNjcmlwdGlvbj09PWcpcmV0dXJuIGw7cmV0dXJuIG51bGx9O2EuY2hlY2tIZWFsdGhQaWxsQWdhaW5zdFRlbnNvckNvbmRpdGlvbktleT1mdW5jdGlvbihnLGwsayl7aWYoZChsKSlyZXR1cm4hMTtnPWZbZ10ucHJlZGljYXRlO3JldHVybiBnKGwsayl9fSkoZ3B8fChncD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1kZWJ1Z2dlci1jb250aW51ZS1kaWFsb2cuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZGVidWdnZXItY29udGludWUtZGlhbG9nIixwcm9wZXJ0aWVzOntjb250aW51ZU51bTp7dHlwZTpOdW1iZXIsdmFsdWU6NX0sc2Vzc2lvblJ1bkdvOkZ1bmN0aW9uLHRlbnNvckNvbmRpdGlvbkdvOkZ1bmN0aW9uLGZvcmNlQ29udGludWF0aW9uU3RvcDpGdW5jdGlvbixfY29udGludWVCdXR0b25UZXh0Ont0eXBlOlN0cmluZyx2YWx1ZToiQ29udGludWUuLi4ifSxfY29udGludWVCdXR0b25Db250aW51ZVRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJDb250aW51ZS4uLiIscmVhZG9ubHk6ITB9LF9jb250aW51ZUJ1dHRvblN0b3BUZXh0Ont0eXBlOlN0cmluZyx2YWx1ZToiU3RvcCBDb250aW51YXRpb24iLHJlYWRvbmx5OiEwfSxfc2VsZWN0ZWRUZW5zb3JDb25kaXRpb246U3RyaW5nLF90ZW5zb3JDb25kaXRpb25SZWZWYWx1ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LF9pc1JlZlZhbHVlSW5wdXRIaWRkZW46e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCwKbm90aWZ5OiEwfX0sb2JzZXJ2ZXJzOlsiX29uU2VsZWN0ZWRUZW5zb3JDb25kaXRpb25DaGFuZ2VkKF9zZWxlY3RlZFRlbnNvckNvbmRpdGlvbikiXSxub3RpZnlDb250aW51YXRpb25TdG9wKCl7dGhpcy51cGRhdGVDb250aW51ZUJ1dHRvblRleHQoITEpfSxfb3BlbkRpYWxvZygpe3RoaXMuJC5jb250aW51ZURpYWxvZy5vcGVuKCl9LF9jbG9zZURpYWxvZygpe3RoaXMuJC5jb250aW51ZURpYWxvZy5jbG9zZSgpfSxfY29udGludWVCdXR0b25DYWxsYmFjaygpe3RoaXMuX2NvbnRpbnVlQnV0dG9uVGV4dD09PXRoaXMuX2NvbnRpbnVlQnV0dG9uU3RvcFRleHQ/dGhpcy5mb3JjZUNvbnRpbnVhdGlvblN0b3AoKTp0aGlzLl9vcGVuRGlhbG9nKCl9LHVwZGF0ZUNvbnRpbnVlQnV0dG9uVGV4dChhKXt0aGlzLnNldCgiX2NvbnRpbnVlQnV0dG9uVGV4dCIsYT90aGlzLl9jb250aW51ZUJ1dHRvblN0b3BUZXh0OnRoaXMuX2NvbnRpbnVlQnV0dG9uQ29udGludWVUZXh0KX0sX3Nlc3Npb25SdW5Hb0J1dHRvbkNhbGxiYWNrKCl7MDwKdGhpcy5jb250aW51ZU51bT8odGhpcy5zZXNzaW9uUnVuR28odGhpcy5jb250aW51ZU51bSksdGhpcy51cGRhdGVDb250aW51ZUJ1dHRvblRleHQoITApLHRoaXMuX2Nsb3NlRGlhbG9nKCkpOnRoaXMuc2V0KCJjb250aW51ZU51bSIsMSl9LF90ZW5zb3JDb250aW51ZUdvQnV0dG9uQ2FsbGJhY2soKXtpZihudWxsIT10aGlzLl9zZWxlY3RlZFRlbnNvckNvbmRpdGlvbil7dmFyIGE9Z3AudGVuc29yQ29uZGl0aW9uRGVzY3JpcHRpb24yS2V5KHRoaXMuX3NlbGVjdGVkVGVuc29yQ29uZGl0aW9uKTtudWxsPT1hJiZjb25zb2xlLmVycm9yKCJJbnZhbGlkIFRlbnNvciBDb25kaXRpb24gbmFtZToiK3RoaXMuX3NlbGVjdGVkVGVuc29yQ29uZGl0aW9uKTt2YXIgYz1OdW1iZXIodGhpcy5fdGVuc29yQ29uZGl0aW9uUmVmVmFsdWUpO051bWJlci5pc0Zpbml0ZShjKT8odGhpcy50ZW5zb3JDb25kaXRpb25HbyhhLGMpLHRoaXMudXBkYXRlQ29udGludWVCdXR0b25UZXh0KCEwKSx0aGlzLl9jbG9zZURpYWxvZygpKToKdGhpcy5zZXQoIl90ZW5zb3JDb25kaXRpb25SZWZWYWx1ZSIsMCl9fSxfb25TZWxlY3RlZFRlbnNvckNvbmRpdGlvbkNoYW5nZWQoYSl7YT1ncC50ZW5zb3JDb25kaXRpb25EZXNjcmlwdGlvbjJLZXkoYSk7dGhpcy5zZXQoIl9pc1JlZlZhbHVlSW5wdXRIaWRkZW4iLC0xIT09WyJJTkZfT1JfTkFOIiwiSU5GIiwiTkFOIl0uaW5kZXhPZihhKSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLWRlYnVnZ2VyLWluaXRpYWwtZGlhbG9nLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRlYnVnZ2VyLWluaXRpYWwtZGlhbG9nIixwcm9wZXJ0aWVzOntfdGl0bGU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9jdXN0b21NZXNzYWdlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfaGFzQ3VzdG9tTWVzc2FnZTp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc0N1c3RvbU1lc3NhZ2UoX2N1c3RvbU1lc3NhZ2UpIn0sX2hvc3Q6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9wb3J0Ont0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfb3Blbjp7dHlwZTpCb29sZWFufSxfaGlkZGVuOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGlkZGVuKF9vcGVuKSIscmVmbGVjdFRvQXR0cmlidXRlOiEwfX0sb3BlbkRpYWxvZyhhLGMpe3RoaXMuc2V0KCJfdGl0bGUiLCJEZWJ1Z2dlciBpcyB3YWl0aW5nIGZvciBTZXNzaW9uLnJ1bigpIGNvbm5lY3Rpb25zLi4uIik7dGhpcy5zZXQoIl9jdXN0b21NZXNzYWdlIixudWxsKTt0aGlzLiQuZGlhbG9nLm9wZW4oKTsKbnVsbCE9YSYmbnVsbCE9YyYmKHRoaXMuc2V0KCJfaG9zdCIsYSksdGhpcy5zZXQoIl9wb3J0IixjKSl9LGNsb3NlRGlhbG9nKCl7dGhpcy4kLmRpYWxvZy5jbG9zZSgpfSxvcGVuRGlzYWJsZWREaWFsb2coKXt0aGlzLnNldCgiX3RpdGxlIiwiRGVidWdnZXIgaXMgbm90IGVuYWJsZWQgaW4gdGhpcyBUZW5zb3JCb2FyZCBpbnN0YW5jZSIpO3RoaXMuc2V0KCJfY3VzdG9tTWVzc2FnZSIsIlRvIGVuYWJsZSB0aGUgZGVidWdnZXIgaW4gVGVuc29yQm9hcmQsIHVzZSB0aGUgZmxhZzogLS1kZWJ1Z2dlcl9wb3J0IFx4M2Nwb3J0X251bWJlclx4M2UiKTt0aGlzLiQuZGlhbG9nLm9wZW4oKX0sX2NvbXB1dGVIaWRkZW4oYSl7cmV0dXJuIWF9LF9jb21wdXRlSGFzQ3VzdG9tTWVzc2FnZShhKXtyZXR1cm4hXy5pc0VtcHR5KGEpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1kZWJ1Z2dlci1yZXNpemVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRlYnVnZ2VyLXJlc2l6ZXIiLHByb3BlcnRpZXM6e2N1cnJlbnRMZW5ndGg6e3R5cGU6TnVtYmVyLG5vdGlmeTohMH0sbWluTGVuZ3RoOk51bWJlcixtYXhMZW5ndGg6TnVtYmVyLGlzSG9yaXpvbnRhbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX3Jlc2l6ZXJJZGVudGlmaWVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAscmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfaXNWZXJ0aWNhbDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUlzVmVydGljYWwoaXNIb3Jpem9udGFsKSIscmVmbGVjdFRvQXR0cmlidXRlOiEwLHJlYWRPbmx5OiEwfSxfZHJhZ1N0YXJ0UG9zaXRpb246TnVtYmVyLF9kcmFnU3RhcnRMZW5ndGg6TnVtYmVyLF9wcmV2aW91c01vdXNlTW92ZUNhbGxiYWNrOk9iamVjdCxfcHJldmlvdXNNb3VzZVVwQ2FsbGJhY2s6T2JqZWN0fSxsaXN0ZW5lcnM6e21vdXNlZG93bjoiX2hhbmRsZU1vdXNlRG93biJ9LApfaGFuZGxlTW91c2VEb3duKGEpe2EucHJldmVudERlZmF1bHQoKTt0aGlzLl9lbmREcmFnKCk7dGhpcy5fcHJldmlvdXNNb3VzZU1vdmVDYWxsYmFjaz1jPT57Yy5wcmV2ZW50RGVmYXVsdCgpO2M9dGhpcy5fZHJhZ1N0YXJ0TGVuZ3RoKyh0aGlzLl9nZXRQb3NpdGlvblJlbGF0aXZlVG9WaWV3cG9ydChjKS10aGlzLl9kcmFnU3RhcnRQb3NpdGlvbik7Yz1NYXRoLm1heChjLHRoaXMubWluTGVuZ3RoKTtjPU1hdGgubWluKGMsdGhpcy5tYXhMZW5ndGgpO3RoaXMuc2V0KCJjdXJyZW50TGVuZ3RoIixjKX07dGhpcy5fcHJldmlvdXNNb3VzZVVwQ2FsbGJhY2s9Yz0+e2MucHJldmVudERlZmF1bHQoKTt0aGlzLl9lbmREcmFnKCl9O3RoaXMuc2V0KCJfZHJhZ1N0YXJ0UG9zaXRpb24iLHRoaXMuX2dldFBvc2l0aW9uUmVsYXRpdmVUb1ZpZXdwb3J0KGEpKTt0aGlzLnNldCgiX2RyYWdTdGFydExlbmd0aCIsdGhpcy5jdXJyZW50TGVuZ3RoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsCnRoaXMuX3ByZXZpb3VzTW91c2VVcENhbGxiYWNrLCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0aGlzLl9wcmV2aW91c01vdXNlTW92ZUNhbGxiYWNrLCExKX0sX2dldFBvc2l0aW9uUmVsYXRpdmVUb1ZpZXdwb3J0KGEpe3JldHVybiB0aGlzLmlzSG9yaXpvbnRhbD9hLmNsaWVudFk6YS5jbGllbnRYfSxfZW5kRHJhZygpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMuX3ByZXZpb3VzTW91c2VNb3ZlQ2FsbGJhY2ssITEpO3RoaXMuX3ByZXZpb3VzTW91c2VNb3ZlQ2FsbGJhY2s9bnVsbDt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsdGhpcy5fcHJldmlvdXNNb3VzZVVwQ2FsbGJhY2ssITEpO3RoaXMuX3ByZXZpb3VzTW91c2VVcENhbGxiYWNrPW51bGx9LF9jb21wdXRlSXNWZXJ0aWNhbChhKXtyZXR1cm4hYX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvc2VsZWN0aW9uLXRyZWUtbm9kZS5qcwooZnVuY3Rpb24oYSl7YS5OT0RFX05BTUVfU0VQQVJBVE9SPSIvIjthLkRFVklDRV9OQU1FX1BBVFRFUk49L15cL2pvYjpbQS1aYS16MC05X10rXC9yZXBsaWNhOlswLTlfXStcL3Rhc2s6WzAtOV0rXC9kZXZpY2U6W0EtWmEtejAtOV9dKzpbMC05XSsvO2xldCBjOyhmdW5jdGlvbihnKXtnW2cuRU1QVFk9MF09IkVNUFRZIjtnW2cuQ0hFQ0tFRD0xXT0iQ0hFQ0tFRCI7Z1tnLlBBUlRJQUw9Ml09IlBBUlRJQUwifSkoYz1hLkNoZWNrYm94U3RhdGV8fChhLkNoZWNrYm94U3RhdGU9e30pKTthLnNwbGl0Tm9kZU5hbWU9ZnVuY3Rpb24oZyl7bGV0IGw9W107Y29uc3Qgaz1nLm1hdGNoKGEuREVWSUNFX05BTUVfUEFUVEVSTik7bnVsbCE9ayYmKGwucHVzaChrWzBdKSwiLyIhPT1nW2tbMF0ubGVuZ3RoXSYmY29uc29sZS5lcnJvcignTm8gc2xhc2ggKCIvIikgYWZ0ZXIgZGV2aWNlIG5hbWUgaW4gbm9kZSBuYW1lOicsZyksZz1nLnNsaWNlKGtbMF0ubGVuZ3RoKzEpKTtyZXR1cm4gbC5jb25jYXQoZy5zcGxpdChhLk5PREVfTkFNRV9TRVBBUkFUT1IpKX07CmEuZ2V0Q2xlYW5Ob2RlTmFtZT1mdW5jdGlvbihnKXtsZXQgbD1nO2NvbnN0IGs9Zy5tYXRjaChhLkRFVklDRV9OQU1FX1BBVFRFUk4pO251bGwhPWs/KGwubGVuZ3RoPmtbMF0ubGVuZ3RoJiYiLyIhPWxba1swXS5sZW5ndGhdJiZjb25zb2xlLmVycm9yKCdObyBzbGFzaCAoIi8iKSBhZnRlciBkZXZpY2UgbmFtZSBpbiBub2RlIG5hbWU6JyxnKSxsPWwuc2xpY2Uoa1swXS5sZW5ndGgrMSkpOiIvIj09PWxbMF0mJihsPWwuc2xpY2UoMSkpO2wuaW5kZXhPZigiKSIpPT09bC5sZW5ndGgtMSYmKGw9bC5zbGljZSgwLGwuaW5kZXhPZigiLygiKSkpO3JldHVybiBsfTthLnNvcnRBbmRCYXNlRXhwYW5kRGVidWdXYXRjaGVzPWZ1bmN0aW9uKGcpe2cuc29ydCgoayxuKT0+ay5ub2RlX25hbWU8bi5ub2RlX25hbWU/LTE6ay5ub2RlX25hbWU+bi5ub2RlX25hbWU/MTprLm91dHB1dF9zbG90LW4ub3V0cHV0X3Nsb3QpO2ZvcihsZXQgaz0wO2s8Zy5sZW5ndGg7KytrKXt2YXIgbD1nW2tdLm5vZGVfbmFtZSsKIi8iO2xldCBuPSExO2ZvcihsZXQgcD1rKzE7cDxnLmxlbmd0aDsrK3ApaWYoMD09PWdbcF0ubm9kZV9uYW1lLmluZGV4T2YobCkpe249ITA7YnJlYWt9biYmKGw9Z1trXS5ub2RlX25hbWUuc3BsaXQoIi8iKSxnW2tdLm5vZGVfbmFtZSs9Ii8oIitsW2wubGVuZ3RoLTFdKyIpIil9fTthLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbj1mdW5jdGlvbihnKXtyZXR1cm4gZy5lbmRzV2l0aCgiKSIpP2cuc2xpY2UoMCxnLmxhc3RJbmRleE9mKCIvKCIpKTpnfTthLmFzc2VtYmxlRGV2aWNlQW5kTm9kZU5hbWVzPWZ1bmN0aW9uKGcpe2NvbnN0IGw9W251bGwsbnVsbF07aWYoZ1swXS5tYXRjaChhLkRFVklDRV9OQU1FX1BBVFRFUk4pKXtsZXQgaz1nWzBdOyIvIj09PWtbay5sZW5ndGgtMV0mJihrPWsuc2xpY2UoMCxrLmxlbmd0aC0xKSk7bFswXT1rO2xbMV09Zy5zbGljZSgxKS5qb2luKCIvIil9ZWxzZSBsWzFdPWcuam9pbigiLyIpO3JldHVybiBsfTtsZXQgZDsoZnVuY3Rpb24oZyl7Z1tnLk5vZGVOYW1lPQowXT0iTm9kZU5hbWUiO2dbZy5PcFR5cGU9MV09Ik9wVHlwZSJ9KShkPWEuRGVidWdXYXRjaEZpbHRlck1vZGV8fChhLkRlYnVnV2F0Y2hGaWx0ZXJNb2RlPXt9KSk7YS5maWx0ZXJEZWJ1Z1dhdGNoZXM9ZnVuY3Rpb24oZyxsLGspe2lmKGw9PT1kLk5vZGVOYW1lKXJldHVybiBnLmZpbHRlcihuPT5uLm5vZGVfbmFtZS5tYXRjaChrKSk7aWYobD09PWQuT3BUeXBlKXJldHVybiBnLmZpbHRlcihuPT5uLm9wX3R5cGUubWF0Y2goaykpfTtjbGFzcyBme2NvbnN0cnVjdG9yKGcsbCxrLG4pe3RoaXMuZGVidWdXYXRjaENoYW5nZT1sO3RoaXMuZGVidWdXYXRjaD1uO3RoaXMubmFtZT1nO3RoaXMuZGVidWdXYXRjaD1uO3RoaXMuY2hlY2tib3hTdGF0ZT1jLkVNUFRZO3RoaXMucGFyZW50PWs7dGhpcy5jaGlsZHJlbj17fTt0aGlzLmNoZWNrYm94PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLWNoZWNrYm94Iik7dGhpcy5jaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCgpPT4Ke3RoaXMuX2hhbmRsZUNoYW5nZSgpfSwhMSl9X2hhbmRsZUNoYW5nZSgpe2lmKHRoaXMuYXZvaWRQcm9wYWdhdGlvbil0aGlzLmRlYnVnV2F0Y2gmJnRoaXMuZGVidWdXYXRjaENoYW5nZSh0aGlzLmRlYnVnV2F0Y2gsdGhpcy5pc0NoZWNrYm94Q2hlY2tlZCgpKTtlbHNlIGlmKHRoaXMuZGVidWdXYXRjaCl0aGlzLnNldENoZWNrYm94U3RhdGUodGhpcy5pc0NoZWNrYm94Q2hlY2tlZCgpP2MuQ0hFQ0tFRDpjLkVNUFRZLCEwKSx0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCk/dGhpcy5zZXROb2Rlc0Fib3ZlVG9DaGVja2VkKCk6dGhpcy5zZXROb2Rlc0Fib3ZlVG9FbXB0eSgpLHRoaXMuZGVidWdXYXRjaENoYW5nZSh0aGlzLmRlYnVnV2F0Y2gsdGhpcy5pc0NoZWNrYm94Q2hlY2tlZCgpKTtlbHNlIGlmKHRoaXMuc2V0Q2hlY2tib3hTdGF0ZSh0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCk/Yy5DSEVDS0VEOmMuRU1QVFksITApLHRoaXMuaXNDaGVja2JveENoZWNrZWQoKSl7Y29uc3QgbD1fLnZhbHVlcyh0aGlzLmNoaWxkcmVuKTsKZm9yKDtsLmxlbmd0aDspe3ZhciBnPWwucG9wKCk7Xy5mb3JFYWNoKGcuY2hpbGRyZW4saz0+bC5wdXNoKGspKTtnLnNldENoZWNrYm94U3RhdGUoYy5DSEVDS0VELCEwKX10aGlzLnNldE5vZGVzQWJvdmVUb0NoZWNrZWQoKX1lbHNle2NvbnN0IGw9Xy52YWx1ZXModGhpcy5jaGlsZHJlbik7Zm9yKDtsLmxlbmd0aDspZz1sLnBvcCgpLF8uZm9yRWFjaChnLmNoaWxkcmVuLGs9PmwucHVzaChrKSksZy5zZXRDaGVja2JveFN0YXRlKGMuRU1QVFksITApO3RoaXMuc2V0Tm9kZXNBYm92ZVRvRW1wdHkoKX19aXNMZWFmKCl7cmV0dXJuISF0aGlzLmRlYnVnV2F0Y2h9c2V0VG9BbGxDaGVja2VkRXh0ZXJuYWxseSgpe3RoaXMuc2V0Q2hlY2tib3hTdGF0ZShjLkNIRUNLRUQpO3RoaXMuX2hhbmRsZUNoYW5nZSgpfXNldENoZWNrYm94U3RhdGUoZyxsKXt0aGlzLmF2b2lkUHJvcGFnYXRpb249bDt0aGlzLmNoZWNrYm94U3RhdGU9Zzt0aGlzLmNoZWNrYm94LmNsYXNzTGlzdC50b2dnbGUoInBhcnRpYWwtY2hlY2tib3giLApnPT09Yy5QQVJUSUFMKTtnPT09Yy5DSEVDS0VEP3RoaXMuY2hlY2tib3guc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpOnRoaXMuY2hlY2tib3gucmVtb3ZlQXR0cmlidXRlKCJjaGVja2VkIik7dGhpcy5hdm9pZFByb3BhZ2F0aW9uPSExfWlzQ2hlY2tib3hDaGVja2VkKCl7cmV0dXJuIHRoaXMuY2hlY2tib3guaGFzQXR0cmlidXRlKCJjaGVja2VkIil9c2V0Tm9kZXNBYm92ZVRvQ2hlY2tlZCgpe2xldCBnPXRoaXMucGFyZW50LGw9ITE7Zm9yKDtnOylsP2cuc2V0Q2hlY2tib3hTdGF0ZShjLlBBUlRJQUwsITApOihsPS0xIT09Xy5maW5kSW5kZXgoXy52YWx1ZXMoZy5jaGlsZHJlbiksaz0+ay5jaGVja2JveFN0YXRlIT09Yy5DSEVDS0VEKSxnLnNldENoZWNrYm94U3RhdGUobD9jLlBBUlRJQUw6Yy5DSEVDS0VELCEwKSksZz1nLnBhcmVudH1zZXROb2Rlc0Fib3ZlVG9FbXB0eSgpe2xldCBnPXRoaXMucGFyZW50LGw9ITE7Zm9yKDtnOylsP2cuc2V0Q2hlY2tib3hTdGF0ZShjLlBBUlRJQUwsCiEwKToobD0tMSE9PV8uZmluZEluZGV4KF8udmFsdWVzKGcuY2hpbGRyZW4pLGs9PmsuY2hlY2tib3hTdGF0ZSE9PWMuRU1QVFkpLGcuc2V0Q2hlY2tib3hTdGF0ZShsP2MuUEFSVElBTDpjLkVNUFRZLCEwKSksZz1nLnBhcmVudH1zZXRMZXZlbERvbShnKXt0aGlzLmxldmVsRG9tPWd9fWEuU2VsZWN0aW9uVHJlZU5vZGU9Zn0pKGdwfHwoZ3A9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtb3Atc2VsZWN0b3IuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtb3Atc2VsZWN0b3IiLHByb3BlcnRpZXM6e2RlYnVnV2F0Y2hlczpBcnJheSxkZWJ1Z1dhdGNoQ2hhbmdlOk9iamVjdCxub2RlQ2xpY2tlZDpGdW5jdGlvbixmb3JjZUV4cGFuZEFuZENoZWNrTm9kZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGZvcmNlRXhwYW5kTm9kZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9zZWxlY3RlZERlYnVnV2F0Y2hNYXBwaW5nOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX2xldmVsTmFtZTJDb250YWluZXI6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9sZXZlbE5hbWUyTm9kZTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX3dhdGNoSGllcmFyY2h5Ont0eXBlOk9iamVjdCxjb21wdXRlZDoiX2NvbXB1dGVXYXRjaEhpZXJhcmNoeShkZWJ1Z1dhdGNoZXMsIGRlYnVnV2F0Y2hDaGFuZ2UsIF9maWx0ZXJNb2RlLCBfZmlsdGVySW5wdXQpIn0sX2ZpbHRlck1vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJOb2RlIE5hbWUiLApub3RpZnk6ITB9LF9maWx0ZXJJbnB1dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsbm90aWZ5OiEwfSxfaXNMb2FkaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9oaWdobGlnaHRlZExldmVsRG9tOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX3JlbmRlckhpZXJhcmNoeVdpdGhUaW1lb3V0KF93YXRjaEhpZXJhcmNoeSwgZGVidWdXYXRjaENoYW5nZSkiLCJfaGFuZGxlRm9yY2VOb2RlRXhwYW5kQW5kQ2hlY2soZm9yY2VFeHBhbmRBbmRDaGVja05vZGVOYW1lKSIsIl9oYW5kbGVGb3JjZU5vZGVFeHBhbmQoZm9yY2VFeHBhbmROb2RlTmFtZSkiXSxfY29tcHV0ZVdhdGNoSGllcmFyY2h5KGEsYyxkLGYpe2Y9Zi50cmltKCk7bGV0IGc9YTtudWxsIT1kJiYwPGYubGVuZ3RoJiYoZz1ncC5maWx0ZXJEZWJ1Z1dhdGNoZXMoYSxncC5EZWJ1Z1dhdGNoRmlsdGVyTW9kZVtkLnJlcGxhY2UoL1xzL2csIiIpXSxuZXcgUmVnRXhwKGYpKSk7Y29uc3QgbD1uZXcgZ3AuU2VsZWN0aW9uVHJlZU5vZGUoIiIsCmMpO2wuaXNSb290PSEwO18uZm9yRWFjaChnLGs9Pntjb25zdCBuPWdwLnNwbGl0Tm9kZU5hbWUoay5kZXZpY2VfbmFtZSsiLyIray5ub2RlX25hbWUpO2xldCBwPWw7Xy5mb3JFYWNoKG4sKHEscik9PntyPT09bi5sZW5ndGgtMT8ocj1uZXcgZ3AuU2VsZWN0aW9uVHJlZU5vZGUocSxjLHAsaykscC5jaGlsZHJlbltxXT1yKToocC5jaGlsZHJlbltxXXx8KHAuY2hpbGRyZW5bcV09bmV3IGdwLlNlbGVjdGlvblRyZWVOb2RlKHEsYyxwKSkscD1wLmNoaWxkcmVuW3FdKX0pfSk7cmV0dXJuIGx9LF9jbGVhclNlbGVjdG9ySGllcmFyY2h5KCl7Y29uc3QgYT10aGlzLiQkKCIjc2VsZWN0b3ItaGllcmFyY2h5Iik7Zm9yKDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKX0sX3JlbmRlckhpZXJhcmNoeVdpdGhUaW1lb3V0KGEsYyxkLGYpe3RoaXMuX2lzTG9hZGluZ3x8KHRoaXMuc2V0KCJfaXNMb2FkaW5nIiwhMCksdGhpcy5fY2xlYXJTZWxlY3RvckhpZXJhcmNoeSgpLApzZXRUaW1lb3V0KCgpPT57dGhpcy5fcmVuZGVySGllcmFyY2h5KGEsYyxkLGYpfSwxMCkpfSxfcmVuZGVySGllcmFyY2h5KGEsYyl7dGhpcy5zZXQoIl9sZXZlbE5hbWUyQ29udGFpbmVyIix7fSk7dGhpcy5zZXQoIl9sZXZlbE5hbWUyTm9kZSIse30pO2E9dGhpcy5fcmVuZGVyTGV2ZWwobnVsbCxudWxsLGEsYyk7UG9seW1lci5kb20odGhpcy4kJCgiI3NlbGVjdG9yLWhpZXJhcmNoeSIpKS5hcHBlbmRDaGlsZChhKTt0aGlzLnNldCgiX2lzTG9hZGluZyIsITEpfSxfcmVuZGVyTGV2ZWwoYSxjLGQsZil7Y29uc3QgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtudWxsIT1hJiZnLnNldEF0dHJpYnV0ZSgibGV2ZWwtbmFtZSIsYSk7bGV0IGw7bD1udWxsPT1jP2E6YysiLyIrYTtQb2x5bWVyLmRvbShnKS5jbGFzc0xpc3QuYWRkKCJsZXZlbC1jb250YWluZXIiKTtjb25zdCBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlyb24tY29sbGFwc2UiKTtpZihhKXt0aGlzLl9sZXZlbE5hbWUyQ29udGFpbmVyW2xdPQprO2sucmVtb3ZlQXR0cmlidXRlKCJvcGVuZWQiKTtQb2x5bWVyLmRvbShnKS5jbGFzc0xpc3QuYWRkKCJpbmRlbnRlZC1sZXZlbC1jb250YWluZXIiKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO1BvbHltZXIuZG9tKGMpLmNsYXNzTGlzdC5hZGQoImxldmVsLXRpdGxlIik7Y29uc3QgcT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwYXBlci1pY29uLWJ1dHRvbiIpO1BvbHltZXIuZG9tKHEpLmNsYXNzTGlzdC5hZGQoIm5vZGUtZXhwYW5kLWJ1dHRvbiIpO2NvbnN0IHI9KCk9PntxLnNldEF0dHJpYnV0ZSgiaWNvbiIsay5oYXNBdHRyaWJ1dGUoIm9wZW5lZCIpPyJleHBhbmQtbGVzcyI6ImV4cGFuZC1tb3JlIil9O3EuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57ay5oYXNBdHRyaWJ1dGUoIm9wZW5lZCIpP2sucmVtb3ZlQXR0cmlidXRlKCJvcGVuZWQiKTprLnNldEF0dHJpYnV0ZSgib3BlbmVkIiwhMCk7cigpfSwhMSk7cigpO1BvbHltZXIuZG9tKGMpLmFwcGVuZENoaWxkKHEpOwpQb2x5bWVyLmRvbShjKS5hcHBlbmRDaGlsZChkLmNoZWNrYm94KTtkLnNldExldmVsRG9tKGMpO2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO1BvbHltZXIuZG9tKHQpLmNsYXNzTGlzdC5hZGQoImxldmVsLXRpdGxlLXRleHQiKTt0LnRleHRDb250ZW50PWE7UG9seW1lci5kb20oYykuYXBwZW5kQ2hpbGQodCk7UG9seW1lci5kb20oZykuYXBwZW5kQ2hpbGQoYyk7KGEubWF0Y2goZ3AuREVWSUNFX05BTUVfUEFUVEVSTil8fDE9PT1PYmplY3Qua2V5cyhkLmNoaWxkcmVuKS5sZW5ndGgpJiZrLnNldEF0dHJpYnV0ZSgib3BlbmVkIiwhMCl9ZWxzZSBrLnNldEF0dHJpYnV0ZSgib3BlbmVkIiwhMCk7Y29uc3Qgbj1bXSxwPVtdO1BvbHltZXIuZG9tKGspLmNsYXNzTGlzdC5hZGQoImNvbnRlbnQtY29udGFpbmVyIik7Xy5mb3JFYWNoKGQuY2hpbGRyZW4sKHEscik9Pntjb25zdCB0PXEuZGVidWdXYXRjaDt2YXIgdj1sO251bGw9PWwmJih2PSIiKTt2Kz0iLyIrcjsKdGhpcy5fbGV2ZWxOYW1lMk5vZGVbdl09cTtudWxsIT10aGlzLl9zZWxlY3RlZERlYnVnV2F0Y2hNYXBwaW5nW3ZdJiYocS5zZXRDaGVja2JveFN0YXRlKGdwLkNoZWNrYm94U3RhdGUuQ0hFQ0tFRCkscS5zZXROb2Rlc0Fib3ZlVG9DaGVja2VkKCkpO2lmKHQpe3Y9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7UG9seW1lci5kb20odikuY2xhc3NMaXN0LmFkZCgib3AtZGVzY3JpcHRpb24iKTtxLmNoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsej0+e3RoaXMuX2hhbmRsZUxlYWZOb2RlU2VsZWN0ZWQoZix0LHoudGFyZ2V0LmNoZWNrZWQpfSwhMSk7UG9seW1lci5kb20odikuYXBwZW5kQ2hpbGQocS5jaGVja2JveCk7cS5zZXRMZXZlbERvbSh2KTt2YXIgeT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7eS50ZXh0Q29udGVudD0iWyIrdC5vcF90eXBlKyJdIjt5LnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJvcC10eXBlIik7UG9seW1lci5kb20odikuYXBwZW5kQ2hpbGQoeSk7Cnk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO3kudGV4dENvbnRlbnQ9cjt5LnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJvcC10aXRsZS1sZWFmIik7eS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9Pntjb25zdCB6PXRoaXMuX2dldERldmljZUFuZE5vZGVOYW1lcyhyLGcpO3RoaXMubm9kZUNsaWNrZWQoelswXSx6WzFdKX0sITEpO1BvbHltZXIuZG9tKHYpLmFwcGVuZENoaWxkKHkpO3AucHVzaCh2KX1lbHNlIHEuY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix6PT57dGhpcy5faGFuZGxlTWV0YU5vZGVDaGFuZ2UocSxmLHoudGFyZ2V0LmNoZWNrZWQpfSksbi5wdXNoKHRoaXMuX3JlbmRlckxldmVsKHIsbCxxLGYpKX0pO2E9cT0+e1BvbHltZXIuZG9tKGspLmFwcGVuZENoaWxkKHEpfTtfLmZvckVhY2gocCxhKTtfLmZvckVhY2gobixhKTtQb2x5bWVyLmRvbShnKS5hcHBlbmRDaGlsZChrKTtyZXR1cm4gZ30sX2dldExlYWZEZWJ1Z1dhdGNoZXMoYSxjKXthLmRlYnVnV2F0Y2g/CmMucHVzaChhLmRlYnVnV2F0Y2gpOl8uZm9yRWFjaChhLmNoaWxkcmVuLGQ9Pnt0aGlzLl9nZXRMZWFmRGVidWdXYXRjaGVzKGQsYyl9KX0sX2dldERldmljZUFuZE5vZGVOYW1lcyhhLGMpe2ZvcihhPVthXTs7KXtjb25zdCBkPWMuZ2V0QXR0cmlidXRlKCJsZXZlbC1uYW1lIik7aWYobnVsbD09ZClicmVhaztlbHNlIGEucHVzaChkKTtjPVBvbHltZXIuZG9tKGMpLnBhcmVudE5vZGUucGFyZW50Tm9kZX1hLnJldmVyc2UoKTtyZXR1cm4gZ3AuYXNzZW1ibGVEZXZpY2VBbmROb2RlTmFtZXMoYSl9LF9oYW5kbGVNZXRhTm9kZUNoYW5nZShhLGMsZCl7bGV0IGY9W107dGhpcy5fZ2V0TGVhZkRlYnVnV2F0Y2hlcyhhLGYpO18uZm9yRWFjaChmLGc9Pnt0aGlzLl9oYW5kbGVMZWFmTm9kZVNlbGVjdGVkKGMsZyxkKX0pfSxfaGFuZGxlTGVhZk5vZGVTZWxlY3RlZChhLGMsZCl7Y29uc3QgZj1jLmRldmljZV9uYW1lKyIvIitjLm5vZGVfbmFtZTtkP3RoaXMuX3NlbGVjdGVkRGVidWdXYXRjaE1hcHBpbmdbZl09CmM6ZGVsZXRlIHRoaXMuX3NlbGVjdGVkRGVidWdXYXRjaE1hcHBpbmdbZl07YShjLGQpfSxfaGFuZGxlRm9yY2VOb2RlKGEsYyl7dGhpcy5zZXQoIl9maWx0ZXJJbnB1dCIsIiIpO3NldFRpbWVvdXQoKCk9PntpZihudWxsIT1hJiZudWxsIT10aGlzLl9sZXZlbE5hbWUyQ29udGFpbmVyKXt2YXIgZD1ncC5zcGxpdE5vZGVOYW1lKGEpO2ZvcihsZXQgZz0xO2c8PWQubGVuZ3RoOysrZyl7dmFyIGY9ZC5zbGljZSgwLGcpLmpvaW4oIi8iKTtjb25zdCBsPXRoaXMuX2xldmVsTmFtZTJOb2RlW2ZdO251bGwhPWwmJm51bGwhPWwubGV2ZWxEb20mJmwubGV2ZWxEb20uc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJjZW50ZXIiLGJlaGF2aW91cjoic21vb3RoIn0pO2c8ZC5sZW5ndGg/bnVsbCE9dGhpcy5fbGV2ZWxOYW1lMkNvbnRhaW5lcltmXSYmdGhpcy5fbGV2ZWxOYW1lMkNvbnRhaW5lcltmXS5zZXRBdHRyaWJ1dGUoIm9wZW5lZCIsITApOihsLmRlYnVnV2F0Y2h8fHRoaXMuX2hhbmRsZU1ldGFOb2RlQ2hhbmdlKGwsCmwuZGVidWdXYXRjaENoYW5nZSwhMCksYyYmKGwuc2V0VG9BbGxDaGVja2VkRXh0ZXJuYWxseSgpLChmPWwuZGVidWdXYXRjaCkmJm51bGw9PXRoaXMuX3NlbGVjdGVkRGVidWdXYXRjaE1hcHBpbmdbZi5ub2RlX25hbWVdJiYodGhpcy5fc2VsZWN0ZWREZWJ1Z1dhdGNoTWFwcGluZ1thXT1mKSksbnVsbCE9dGhpcy5faGlnaGxpZ2h0ZWRMZXZlbERvbSYmdGhpcy5faGlnaGxpZ2h0ZWRMZXZlbERvbS5jbGFzc0xpc3QucmVtb3ZlKCJoaWdobGlnaHRlZCIpLGwubGV2ZWxEb20uY2xhc3NMaXN0LmFkZCgiaGlnaGxpZ2h0ZWQiKSx0aGlzLnNldCgiX2hpZ2hsaWdodGVkTGV2ZWxEb20iLGwubGV2ZWxEb20pKX19fSwyMCl9LF9oYW5kbGVGb3JjZU5vZGVFeHBhbmRBbmRDaGVjayhhKXt0aGlzLl9oYW5kbGVGb3JjZU5vZGUoYSwhMCl9LF9oYW5kbGVGb3JjZU5vZGVFeHBhbmQoYSl7dGhpcy5faGFuZGxlRm9yY2VOb2RlKGEsITEpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1zZXNzaW9uLXJ1bnMtdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1zZXNzaW9uLXJ1bnMtdmlldyIscHJvcGVydGllczp7bGF0ZXN0U2Vzc2lvblJ1bjpPYmplY3Qsc2Vzc2lvblJ1bktleVRvRGV2aWNlTmFtZXM6T2JqZWN0LHNvbGVBY3RpdmU6Qm9vbGVhbixub2RlT3JUZW5zb3JDbGlja2VkOkZ1bmN0aW9uLF9ydW5LZXkyQ291bnQ6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfcnVuS2V5Mk51bURldmljZXM6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfYWN0aXZlUnVuS2V5OlN0cmluZ30sb2JzZXJ2ZXJzOlsicmVuZGVyTGF0ZXN0KGxhdGVzdFNlc3Npb25SdW4pIiwic2V0U29sZUFjdGl2ZVN0YXR1cyhzb2xlQWN0aXZlKSJdLHJlbmRlckxhdGVzdChhKXthPUpTT04uc3RyaW5naWZ5KGEpO3RoaXMuX3J1bktleTJDb3VudFthXT12b2lkIDA9PT10aGlzLl9ydW5LZXkyQ291bnRbYV0/MTp0aGlzLl9ydW5LZXkyQ291bnRbYV0rMTt2b2lkIDA9PT10aGlzLl9ydW5LZXkyTnVtRGV2aWNlc1thXSYmKHRoaXMuX3J1bktleTJOdW1EZXZpY2VzW2FdPQowKTt0aGlzLl9hY3RpdmVSdW5LZXk9YTt0aGlzLl9yZW5kZXJTZXNzaW9uUnVuVGFibGUoKX0sdXBkYXRlTnVtRGV2aWNlcyhhKXtudWxsIT10aGlzLl9hY3RpdmVSdW5LZXkmJih0aGlzLl9ydW5LZXkyTnVtRGV2aWNlc1t0aGlzLl9hY3RpdmVSdW5LZXldPWEsdGhpcy5fcmVuZGVyU2Vzc2lvblJ1blRhYmxlKCkpfSxzZXRTb2xlQWN0aXZlU3RhdHVzKCl7dGhpcy5fcmVuZGVyU2Vzc2lvblJ1blRhYmxlKCl9LF9yZW5kZXJTZXNzaW9uUnVuVGFibGUoKXt0aGlzLl9jbGVhclRhYmxlKCk7dGhpcy5fcmVuZGVySGVhZGVyKCk7bGV0IGE7Zm9yKGNvbnN0IGQgaW4gdGhpcy5fcnVuS2V5MkNvdW50KWlmKHRoaXMuX3J1bktleTJDb3VudC5oYXNPd25Qcm9wZXJ0eShkKSl7dmFyIGM9SlNPTi5wYXJzZShkKTsoYz10aGlzLl9yZW5kZXJSb3coYyx0aGlzLl9ydW5LZXkyTnVtRGV2aWNlc1tkXSx0aGlzLl9ydW5LZXkyQ291bnRbZF0sdGhpcy5fYWN0aXZlUnVuS2V5PT09ZCx0aGlzLnNvbGVBY3RpdmUpKSYmCihhPWMpfWEmJihQb2x5bWVyLmRvbSh0aGlzLiQkKCIjc2Vzc2lvbi1ydW5zLXRhYmxlIikpLnBhcmVudE5vZGUucGFyZW50Tm9kZS5zY3JvbGxUb3A9YS5vZmZzZXRUb3ApfSxfY2xlYXJUYWJsZSgpe2NvbnN0IGE9dGhpcy4kJCgiI3Nlc3Npb24tcnVucy10YWJsZSIpO2Zvcig7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCl9LF9yZW5kZXJIZWFkZXIoKXtjb25zdCBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpO2MudGV4dENvbnRlbnQ9IkZlZWRzIjtjb25zdCBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoIik7ZC50ZXh0Q29udGVudD0iRmV0Y2hlcyI7Y29uc3QgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpO2YudGV4dENvbnRlbnQ9IlRhcmdldHMiO2NvbnN0IGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGgiKTtnLnRleHRDb250ZW50PSIjKERldmljZXMpIjtjb25zdCBsPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpO2wudGV4dENvbnRlbnQ9IkNvdW50IjthLmFwcGVuZENoaWxkKGMpO2EuYXBwZW5kQ2hpbGQoZCk7YS5hcHBlbmRDaGlsZChmKTthLmFwcGVuZENoaWxkKGcpO2EuYXBwZW5kQ2hpbGQobCk7UG9seW1lci5kb20odGhpcy4kJCgiI3Nlc3Npb24tcnVucy10YWJsZSIpKS5hcHBlbmRDaGlsZChhKX0sX3JlbmRlclJvdyhhLGMsZCxmLGcpe2NvbnN0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKSxrPXRoaXMuX3JlbmRlckdyYXBoRWxlbWVudHMoYS5mZWVkcyksbj10aGlzLl9yZW5kZXJHcmFwaEVsZW1lbnRzKGEuZmV0Y2hlcyk7YT10aGlzLl9yZW5kZXJHcmFwaEVsZW1lbnRzKGEudGFyZ2V0cyk7Y29uc3QgcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO3AudGV4dENvbnRlbnQ9YztjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Yy50ZXh0Q29udGVudD1kO2wuYXBwZW5kQ2hpbGQoayk7bC5hcHBlbmRDaGlsZChuKTsKbC5hcHBlbmRDaGlsZChhKTtsLmFwcGVuZENoaWxkKHApO2wuYXBwZW5kQ2hpbGQoYyk7ZiYmKGc/bC5zZXRBdHRyaWJ1dGUoImNsYXNzIiwic29sZS1hY3RpdmUtc2Vzc2lvbi1ydW4iKTpsLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJhY3RpdmUtc2Vzc2lvbi1ydW4iKSk7UG9seW1lci5kb20odGhpcy4kJCgiI3Nlc3Npb24tcnVucy10YWJsZSIpKS5hcHBlbmRDaGlsZChsKTtpZihmKXJldHVybiBsfSxfcmVuZGVyR3JhcGhFbGVtZW50cyhhKXtjb25zdCBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Xy5mb3JFYWNoKGEsZD0+e2NvbnN0IGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi50ZXh0Q29udGVudD1kO2Yuc2V0QXR0cmlidXRlKCJjbGFzcyIsIm5vZGUtb3ItdGVuc29yLWVsZW1lbnQiKTtmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e3RoaXMubm9kZU9yVGVuc29yQ2xpY2tlZChkKX0pO2MuYXBwZW5kQ2hpbGQoZil9KTtyZXR1cm4gY319KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtc291cmNlLWNvZGUtdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1zb3VyY2UtY29kZS12aWV3Iixwcm9wZXJ0aWVzOntyZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sZm9jdXNOb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX29sZEZvY3VzTm9kZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGRlYnVnV2F0Y2hlczp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sbm9kZUNsaWNrZWQ6e3R5cGU6RnVuY3Rpb24sdmFsdWU6bnVsbH0sY29udGludWVUb05vZGU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6bnVsbH0sX2hpZ2hsaWdodGVkRWxlbWVudHM6e3R5cGU6QXJyYXksdmFsdWU6W119LF9maWxlUGF0aFNlbGVjdGVkOk51bWJlcixfZnVsbEZpbGVQYXRoczp7dHlwZTpBcnJheSx2YWx1ZTpudWxsfSxfc2hvcnRGaWxlUGF0aHM6e3R5cGU6QXJyYXksdmFsdWU6bnVsbH0sX2ZpbGVMaW5lczp7dHlwZTpBcnJheSx2YWx1ZTpudWxsfSxfbm9kZU5hbWUyRGV2aWNlTmFtZTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sCl9ub2RlTmFtZTJCYXNlRXhwYW5kZWROb2RlTmFtZTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX25vZGVOYW1lMk5vZGVFbGVtZW50czp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX25vZGVOYW1lMlN0YWNrVG9wTm9kZUVsZW1lbnQ6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9zZXRIaWdodGxpZ2h0T3JpZ2luTm9kZUVsZW1lbnQ6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9mdWxsU3RhY2tTaG93bjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfZnVsbFN0YWNrTm9kZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9yZW5kZXJEZWxheU1pbGxpczp7dHlwZTpOdW1iZXIsdmFsdWU6NTAscmVhZG9ubHk6ITB9fSxvYnNlcnZlcnM6WyJfcmVuZGVyRmlsZShfZmlsZVBhdGhTZWxlY3RlZCkiLCJfZm9jdXNPbk5vZGUoZm9jdXNOb2RlTmFtZSkiXSxyZW5kZXIoYSl7bnVsbCE9YSYmdGhpcy5zZXQoIl9kZWJ1Z1dhdGNoZXMiLGEpO3RoaXMuX3F1ZXJ5U291cmNlQ29kZUVuZFBvaW50KHttb2RlOiJwYXRocyJ9KS50aGVuKGM9Pgp7dGhpcy5zZXQoIl9mdWxsRmlsZVBhdGhzIixjLnBhdGhzKTtjb25zdCBkPWMucGF0aHMubWFwKGY9Pih7aWQ6ZixuYW1lOnRoaXMuX3Nob3J0ZW5QYXRoKGYsYy5wYXRocyl9KSk7dGhpcy5zZXQoIl9zaG9ydEZpbGVQYXRocyIsZCk7MDxkLmxlbmd0aCYmdGhpcy5zZXQoIl9maWxlUGF0aFNlbGVjdGVkIiwwKX0pfSxfc2hvcnRlblBhdGgoYSl7YT1hLnJlcGxhY2UoL1xcL2csIi8iKTthPWEuc3BsaXQoIi8iKTtyZXR1cm4gYVthLmxlbmd0aC0xXX0sX3JlbmRlckZpbGUoYSl7aWYobnVsbCE9YSl7dmFyIGM9dGhpcy5fc2hvcnRGaWxlUGF0aHNbYV0uaWQ7dGhpcy5fcXVlcnlTb3VyY2VDb2RlRW5kUG9pbnQoe21vZGU6ImNvbnRlbnQiLGZpbGVfcGF0aDpjfSkudGhlbihkPT57Y29uc3QgZj1bXSxnPWQuY29udGVudFtjXSxsPWQubGluZW5vX3RvX29wX25hbWVfYW5kX3N0YWNrX3BvcztkPXt9O2Zvcih2YXIgayBpbiBsKWwuaGFzT3duUHJvcGVydHkoaykmJihkW2tdPWxba10ubGVuZ3RoKTsKdGhpcy5fZmlsdGVyRmlsZVRyYWNlYmFja3NCeURlYnVnV2F0Y2hlcyhsKTtmb3Ioaz0wO2s8Zy5sZW5ndGg7KytrKXtjb25zdCBwPWsrMTtmLnB1c2goe2xpbmVubzpwLG51bU5vZGVzOm51bGwhPWxbcF0/U3RyaW5nKGxbcF0ubGVuZ3RoKSsiLyIrU3RyaW5nKGRbcF0pKyIgXHUyNWJjIjoiIix0ZXh0OnRoaXMuX2h0bWxFc2NhcGUoZ1trXSl9KX10aGlzLnNldCgiX2ZpbGVMaW5lcyIsZik7Y29uc3Qgbj10aGlzO3NldFRpbWVvdXQoKCk9Pntjb25zdCBwPXt9LHE9e307Zm9yKGNvbnN0IHQgaW4gbCl7aWYoIWwuaGFzT3duUHJvcGVydHkodCkpY29udGludWU7Zm9yKHZhciByPW4uJCQoIiNzb3VyY2UtbGluZS1ub2Rlcy0iK3QpO3IuZmlyc3RDaGlsZDspci5yZW1vdmVDaGlsZChyLmZpcnN0Q2hpbGQpO2NvbnN0IHY9bFt0XTt2LnNvcnQoZnVuY3Rpb24oeSx6KXtyZXR1cm4geVswXTx6WzBdPy0xOnlbMF0+elswXT8xOjB9KTtmb3IobGV0IHk9MDt5PHYubGVuZ3RoOysreSl7Y29uc3Qgej0Kdlt5XVswXSx4PXZbeV1bMV0sQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtGLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJzb3VyY2UtbGluZS1ub2RlLWVudHRyeSIpO0Yuc2V0QXR0cmlidXRlKCJzb3VyY2VMaW5lbm8iLHQpO0YudGV4dENvbnRlbnQ9ejtGLmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsKCk9Pnt0aGlzLm5vZGVDbGlja2VkKHRoaXMuX25vZGVOYW1lMkRldmljZU5hbWVbel0sdGhpcy5fbm9kZU5hbWUyQmFzZUV4cGFuZGVkTm9kZU5hbWVbel0sITApfSk7Y29uc3QgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwYXBlci1pY29uLWJ1dHRvbiIpO0Quc2V0QXR0cmlidXRlKCJpY29uIiwiZmlsdGVyLWxpc3QiKTtELnNldEF0dHJpYnV0ZSgidGl0bGUiLCJTaG93IHN0YWNrIik7RC5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLCgpPT57dGhpcy5faGlnaGxpZ2h0Tm9kZUVsZW1lbnRzKHopO3RoaXMuc2V0KCJfZnVsbFN0YWNrTm9kZU5hbWUiLAp6KTt0aGlzLnNldCgiX2Z1bGxTdGFja1Nob3duIiwhMCk7dGhpcy5fcG9wdWxhdGVGdWxsU3RhY2soeix0aGlzLl9mdWxsRmlsZVBhdGhzW3RoaXMuX2ZpbGVQYXRoU2VsZWN0ZWRdLE51bWJlcih0KSl9KTtjb25zdCBCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLWljb24tYnV0dG9uIik7Qi5zZXRBdHRyaWJ1dGUoImljb24iLCJmb3J3YXJkIik7Qi5zZXRBdHRyaWJ1dGUoInRpdGxlIiwiQ29udGludWUgdG8iKTtCLmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsKCk9Pnt0aGlzLm5vZGVDbGlja2VkKHRoaXMuX25vZGVOYW1lMkRldmljZU5hbWVbel0sdGhpcy5fbm9kZU5hbWUyQmFzZUV4cGFuZGVkTm9kZU5hbWVbel0sITApO2NvbnN0IEk9dGhpcy5fbm9kZU5hbWUyRGV2aWNlTmFtZVt6XSxPPXRoaXMuX25vZGVOYW1lMkJhc2VFeHBhbmRlZE5vZGVOYW1lW3pdO3RoaXMuc2V0KCJfc2V0SGlnaHRsaWdodE9yaWdpbk5vZGVFbGVtZW50IixGKTt0aGlzLmNvbnRpbnVlVG9Ob2RlKEksCk8pfSk7Qy5hcHBlbmRDaGlsZChEKTtDLmFwcGVuZENoaWxkKEIpO0MuYXBwZW5kQ2hpbGQoRik7ci5hcHBlbmRDaGlsZChDKTtwLmhhc093blByb3BlcnR5KHopfHwocFt6XT1bXSk7cFt6XS5wdXNoKEYpO3EuaGFzT3duUHJvcGVydHkoeil8fChxW3pdPVtGLHhdKTt4PnFbel1bMV0mJihxW3pdPVtGLHhdKX1yLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwhMCk7cj1uLiQkKCIjc291cmNlLWxpbmUtbm9kZS10b2dnbGUtIit0KTtudWxsPT1yLmdldEF0dHJpYnV0ZSgidGFwQ2FsbGJhY2tTZXQiKSYmKHIuYWRkRXZlbnRMaXN0ZW5lcigidGFwIiwoKT0+e24uX3RvZ2dsZUxpbmVOb2RlcyhOdW1iZXIodCkpfSksci5zZXRBdHRyaWJ1dGUoInRhcENhbGxiYWNrU2V0IiwhMCkpfW4uc2V0KCJfbm9kZU5hbWUyTm9kZUVsZW1lbnRzIixwKTtmb3IoY29uc3QgdCBpbiBxKXEuaGFzT3duUHJvcGVydHkodCkmJihxW3RdPXFbdF1bMF0pO24uc2V0KCJfbm9kZU5hbWUyU3RhY2tUb3BOb2RlRWxlbWVudCIsCnEpfSx0aGlzLl9yZW5kZXJEZWxheU1pbGxpcyl9KX19LF90b2dnbGVMaW5lTm9kZXMoYSxjPSExKXthPXRoaXMuJCQoIiNzb3VyY2UtbGluZS1ub2Rlcy0iK2EpO251bGw9PWEuZ2V0QXR0cmlidXRlKCJoaWRkZW4iKSYmITAhPT1jP2Euc2V0QXR0cmlidXRlKCJoaWRkZW4iLCEwKTphLnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIil9LF9maWx0ZXJGaWxlVHJhY2ViYWNrc0J5RGVidWdXYXRjaGVzKGEpe2NvbnN0IGM9dGhpcy5kZWJ1Z1dhdGNoZXMubWFwKGc9PmdwLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihnLm5vZGVfbmFtZSkpLGQ9e30sZj17fTtmb3IoY29uc3QgZyBvZiB0aGlzLmRlYnVnV2F0Y2hlcyl7Y29uc3QgbD1ncC5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oZy5ub2RlX25hbWUpO2RbbF09Zy5kZXZpY2VfbmFtZTtmW2xdPWcubm9kZV9uYW1lfXRoaXMuc2V0KCJfbm9kZU5hbWUyRGV2aWNlTmFtZSIsZCk7dGhpcy5zZXQoIl9ub2RlTmFtZTJCYXNlRXhwYW5kZWROb2RlTmFtZSIsCmYpO2Zvcihjb25zdCBnIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShnKSYmKGFbZ109YVtnXS5maWx0ZXIobD0+Xy5pbmNsdWRlcyhjLGxbMF0pKSl9LF9xdWVyeVNvdXJjZUNvZGVFbmRQb2ludChhKXtjb25zdCBjPVFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9zb3VyY2VfY29kZSIpO2E9UW8uYWRkUGFyYW1zKGMsYSk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChhKX0sX2h0bWxFc2NhcGUoYSl7cmV0dXJuIGEucmVwbGFjZSgvIC9nLCJcdTAwYTAiKX0sX2ZvY3VzT25Ob2RlKGEpe2lmKG51bGwhPWEpe3ZhciBjPXRoaXMuX3Nob3J0RmlsZVBhdGhzW3RoaXMuX2ZpbGVQYXRoU2VsZWN0ZWRdLmlkLGQ9dGhpczt0aGlzLl9xdWVyeVNvdXJjZUNvZGVFbmRQb2ludCh7bW9kZToib3BfdHJhY2ViYWNrIixvcF9uYW1lOmF9KS50aGVuKGY9Pntjb25zdCBnPWYub3BfdHJhY2ViYWNrW2FdO2Y9W107Zm9yKGxldCBrPTA7azxnLmxlbmd0aDsrK2spe2NvbnN0IG49Cmdba11bMV07Z1trXVswXT09PWMmJmYucHVzaChuKX1mb3IodmFyIGwgb2YgZC5faGlnaGxpZ2h0ZWRFbGVtZW50cylsLmNsYXNzTGlzdC5yZW1vdmUoImhpZ2hsaWdodGVkLXNvdXJjZS1saW5lIik7bD1bXTtmb3IoY29uc3QgayBvZiBmKWY9dGhpcy4kJCgiI3NvdXJjZS1saW5lLSIrayksbC5wdXNoKGYpLGYuY2xhc3NMaXN0LmFkZCgiaGlnaGxpZ2h0ZWQtc291cmNlLWxpbmUiKSxkLl90b2dnbGVMaW5lTm9kZXMoaywhMCk7ZC5zZXQoIl9oaWdobGlnaHRlZEVsZW1lbnRzIixsKTt0aGlzLl9oaWdobGlnaHROb2RlRWxlbWVudHMoYSl9KX19LF9oaWdobGlnaHROb2RlRWxlbWVudHMoYSl7aWYobnVsbCE9dGhpcy5fb2xkRm9jdXNOb2RlTmFtZSlmb3IoY29uc3QgYyBvZiB0aGlzLl9ub2RlTmFtZTJOb2RlRWxlbWVudHNbdGhpcy5fb2xkRm9jdXNOb2RlTmFtZV0pYy5zdHlsZVsiZm9udC13ZWlnaHQiXT0ibm9ybWFsIjtmb3IoY29uc3QgYyBvZiB0aGlzLl9ub2RlTmFtZTJOb2RlRWxlbWVudHNbYV0pYy5zdHlsZVsiZm9udC13ZWlnaHQiXT0KImJvbGQiO251bGw9PXRoaXMuX3NldEhpZ2h0bGlnaHRPcmlnaW5Ob2RlRWxlbWVudD90aGlzLl9ub2RlTmFtZTJTdGFja1RvcE5vZGVFbGVtZW50W2FdLnNjcm9sbEludG9WaWV3KHtibG9jazoiY2VudGVyIixiZWhhdmlvdXI6InNtb290aCJ9KTp0aGlzLnNldCgiX3NldEhpZ2h0bGlnaHRPcmlnaW5Ob2RlRWxlbWVudCIsbnVsbCk7dGhpcy5zZXQoIl9vbGRGb2N1c05vZGVOYW1lIixhKX0sX3BvcHVsYXRlRnVsbFN0YWNrKGEsYyxkKXt0aGlzLl9xdWVyeVNvdXJjZUNvZGVFbmRQb2ludCh7bW9kZToib3BfdHJhY2ViYWNrIixvcF9uYW1lOmF9KS50aGVuKGY9Pntjb25zdCBnPXRoaXMuJCQoIiNmdWxsLXN0YWNrLWNvbnRlbnQiKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2Zvcihjb25zdCBsIG9mIGYub3BfdHJhY2ViYWNrW2FdKXtjb25zdCBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpIiksbj1sWzBdLHA9TnVtYmVyKGxbMV0pO2sudGV4dENvbnRlbnQ9Cm4rIjogIitTdHJpbmcocCk7Xy5pbmNsdWRlcyh0aGlzLl9mdWxsRmlsZVBhdGhzLG4pPyhrLmNsYXNzTGlzdC5hZGQoInN0YWNrLWZyYW1lLWNsaWNrYWJsZSIpLGsuc3R5bGUuY29sb3I9ImJsdWUiLGsuc3R5bGVbInRleHQtZGVjb3JhdGlvbiJdPSJ1bmRlcmxpbmUiLGsuc3R5bGUuY3Vyc29yPSJwb2ludGVyIixuPT09YyYmcD09PWQmJihrLnN0eWxlWyJmb250LXdlaWdodCJdPSJib2xkIiksay5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLCgpPT57dGhpcy5zZXQoIl9maWxlUGF0aFNlbGVjdGVkIix0aGlzLl9mdWxsRmlsZVBhdGhzLmluZGV4T2YobikpO3NldFRpbWVvdXQoKCk9Pnt0aGlzLl90b2dnbGVMaW5lTm9kZXMocCwhMCk7Zm9yKGNvbnN0IHEgb2YgdGhpcy5fbm9kZU5hbWUyTm9kZUVsZW1lbnRzW2FdKU51bWJlcihxLmdldEF0dHJpYnV0ZSgic291cmNlTGluZW5vIikpPT09TnVtYmVyKHApJiYocS5zY3JvbGxJbnRvVmlldyh7YmxvY2s6ImNlbnRlciIsYmVoYXZpb3VyOiJzbW9vdGgifSksCnRoaXMuc2V0KCJfc2V0SGlnaHRsaWdodE9yaWdpbk5vZGVFbGVtZW50IixrKSx0aGlzLl9oaWdobGlnaHROb2RlRWxlbWVudHMoYSksYz09PW4mJmQ9PT1wfHx0aGlzLl9wb3B1bGF0ZUZ1bGxTdGFjayhhLG4scCkpfSwyKnRoaXMuX3JlbmRlckRlbGF5TWlsbGlzKX0pKTooay5jbGFzc0xpc3QuYWRkKCJzdGFjay1mcmFtZS1ub25jbGlja2FibGUiKSxrLnN0eWxlLmNvbG9yPSIjNTU1Iik7Zy5hcHBlbmRDaGlsZChrKX19KX0sX2Nsb3NlRnVsbFN0YWNrRGlhbG9nKCl7dGhpcy5zZXQoIl9mdWxsU3RhY2tTaG93biIsITEpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRlbnNvci1kYXRhLXN1bW1hcnkiLHByb3BlcnRpZXM6e2xhdGVzdFRlbnNvckRhdGE6T2JqZWN0LGV4cGFuZEhhbmRsZXI6T2JqZWN0LGNvbnRpbnVlVG9DYWxsYmFjazpGdW5jdGlvbixoaWdobGlnaHRlZE5vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSx0ZW5zb3JOYW1lQ2xpY2tlZDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpudWxsfSxnZXRIZWFsdGhQaWxsOkZ1bmN0aW9uLF9oZWFsdGhQaWxsc0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxub3RpZnk6ITB9LF93YXRjaEtleXM6e3R5cGU6QXJyYXksdmFsdWU6W119LF93YXRjaEtleTJEYXRhOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX3dhdGNoS2V5MkNvdW50Ont0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX3dhdGNoS2V5MkV4cGFuZEhhbmRsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfd2F0Y2hLZXkyVmFsdWVTaG9ydDp7dHlwZTpPYmplY3QsdmFsdWU6e319LF93YXRjaEtleTJSb3c6e3R5cGU6T2JqZWN0LAp2YWx1ZTp7fX0sX2FjdGl2ZVdhdGNoS2V5OlN0cmluZyxfaGVhbHRoUGlsbFdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZToyMDAscmVhZG9ubHk6ITB9LF9oZWFsdGhQaWxsSGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTozMixyZWFkb25seTohMH19LG9ic2VydmVyczpbIl9yZW5kZXJMYXRlc3QobGF0ZXN0VGVuc29yRGF0YSwgZXhwYW5kSGFuZGxlcikiLCJfaGlnaGxpZ2h0KGhpZ2hsaWdodGVkTm9kZU5hbWUpIl0sbGlzdGVuZXJzOnsic2hvdy1oZWFsdGgtcGlsbHMuY2hhbmdlIjoiX3Nob3dIZWFsdGhQaWxsc0NoYW5nZWQifSxyZWFkeSgpe3RoaXMuX3JlbmRlckhlYWx0aFBpbGxMZWdlbmQoKX0sZW5hYmxlSGVhbHRoUGlsbHMoKXt0aGlzLnNldCgiX2hlYWx0aFBpbGxzRW5hYmxlZCIsITApO3RoaXMuX3JlbmRlckhlYWx0aFBpbGxMZWdlbmQoKX0sX3Nob3dIZWFsdGhQaWxsc0NoYW5nZWQoKXt0aGlzLl9oZWFsdGhQaWxsc0VuYWJsZWQ/dGhpcy5fcmVuZGVySGVhbHRoUGlsbExlZ2VuZCgpOgp0aGlzLl9jbGVhckhlYWx0aFBpbGxMZWdlbmQoKTt0aGlzLl9yZW5kZXJBbGwoKX0sX3JlbmRlckFsbCgpe3RoaXMuX2NsZWFyVGVuc29yRGF0YVRhYmxlKCk7Zm9yKGNvbnN0IGEgb2YgdGhpcy5fd2F0Y2hLZXlzKXRoaXMuX3JlbmRlckxhdGVzdCh0aGlzLl93YXRjaEtleTJEYXRhW2FdLHRoaXMuX3dhdGNoS2V5MkV4cGFuZEhhbmRsZXJbYV0pfSxfdGVuc29yRGF0YTJXYXRjaEtleShhKXtyZXR1cm4gYS5kZXZpY2VOYW1lKyIvIithLnRlbnNvck5hbWUrIjoiK2EuZGVidWdPcH0sX3JlbmRlckxhdGVzdChhLGMpe2lmKGEpe3ZhciBkPXRoaXMuX3RlbnNvckRhdGEyV2F0Y2hLZXkoYSksZj1udWxsOyJVbmluaXRpYWxpemVkIiE9PWEuZHR5cGUmJiJVbnN1cHBvcnRlZCIhPT1hLmR0eXBlJiYoZj0oKT0+YyhhKSk7dmFyIGc9bnVsbCE9YS52YWx1ZT9KU09OLnN0cmluZ2lmeShhLnZhbHVlLChsLGspPT5rLnRvRml4ZWQ/TnVtYmVyKGsudG9GaXhlZCgzKSk6ayk6IihDbGljayB0byB2aWV3KSI7CnRoaXMuX3dhdGNoS2V5MkRhdGFbZF09YTstMT09PXRoaXMuX3dhdGNoS2V5cy5pbmRleE9mKGQpPyh0aGlzLl93YXRjaEtleXMucHVzaChkKSx0aGlzLl93YXRjaEtleTJDb3VudFtkXT0xKTp0aGlzLl93YXRjaEtleTJDb3VudFtkXSs9MTt0aGlzLl93YXRjaEtleTJFeHBhbmRIYW5kbGVyW2RdPWY7dGhpcy5fd2F0Y2hLZXkyVmFsdWVTaG9ydFtkXT1nO3RoaXMuX2FjdGl2ZVdhdGNoS2V5PWQ7dGhpcy5fcmVtb3ZlQWN0aXZlU3RhdHVzRnJvbUFsbFJvd3MoKTt0aGlzLl9yZW5kZXJSb3coZCl9fSxfY2xlYXJUZW5zb3JEYXRhVGFibGUoKXtmb3IoY29uc3QgYSBpbiB0aGlzLl93YXRjaEtleTJSb3cpdGhpcy5fd2F0Y2hLZXkyUm93Lmhhc093blByb3BlcnR5KGEpJiYodGhpcy5fd2F0Y2hLZXkyUm93W2FdLnJlbW92ZSgpLGRlbGV0ZSB0aGlzLl93YXRjaEtleTJSb3dbYV0pfSxfY2xlYXJUZW5zb3JEYXRhUm93KGEpe2Zvcig7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCl9LApfY2xlYXJIZWFsdGhQaWxsTGVnZW5kKCl7Y29uc3QgYT10aGlzLiQkKCIjaGVhbHRoLXBpbGwtbGVnZW5kIik7Zm9yKDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKX0sX3JlbmRlckhlYWx0aFBpbGxMZWdlbmQoKXt0aGlzLl9jbGVhckhlYWx0aFBpbGxMZWdlbmQoKTtjb25zdCBhPXRoaXMuJCQoIiNoZWFsdGgtcGlsbC1sZWdlbmQiKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLnRleHRDb250ZW50PSJMZWdlbmQ6IjthLmFwcGVuZENoaWxkKGMpO2Muc3R5bGVbIm1hcmdpbi1yaWdodCJdPSIwLjVlbSI7Yy5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siO2ZvcihjPTA7Yzx0Zi5ncmFwaC5zY2VuZS5oZWFsdGhQaWxsRW50cmllcy5sZW5ndGg7KytjKXtjb25zdCBkPXRmLmdyYXBoLnNjZW5lLmhlYWx0aFBpbGxFbnRyaWVzW2NdLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOwpmLnN0eWxlWyJtYXJnaW4tcmlnaHQiXT0iMC4yNWVtIjtjb25zdCBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtnLnRleHRDb250ZW50PSJcdTI1YTAiO2cuc3R5bGUuY29sb3I9ZC5iYWNrZ3JvdW5kX2NvbG9yO2NvbnN0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO2wudGV4dENvbnRlbnQ9ZC5sYWJlbDtsLnN0eWxlLmNvbG9yPWQuYmFja2dyb3VuZF9jb2xvcjtmLmFwcGVuZENoaWxkKGcpO2YuYXBwZW5kQ2hpbGQobCk7YS5hcHBlbmRDaGlsZChmKX19LF9yZW1vdmVBY3RpdmVTdGF0dXNGcm9tQWxsUm93cygpe2Zvcihjb25zdCBhIGluIHRoaXMuX3dhdGNoS2V5MlJvdyl7aWYoIXRoaXMuX3dhdGNoS2V5MlJvdy5oYXNPd25Qcm9wZXJ0eShhKSljb250aW51ZTtjb25zdCBjPXRoaXMuX3dhdGNoS2V5MlJvd1thXTtQb2x5bWVyLmRvbShjKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUtdGVuc29yIik7UG9seW1lci5kb20oYykuY2xhc3NMaXN0LnJlbW92ZSgiaGlnaGxpZ2h0ZWQiKX19LApfcmVuZGVyUm93KGEpe2xldCBjLGQ9ITE7bnVsbCE9dGhpcy5fd2F0Y2hLZXkyUm93W2FdPyhjPXRoaXMuX3dhdGNoS2V5MlJvd1thXSx0aGlzLl9jbGVhclRlbnNvckRhdGFSb3coYyksZD0hMSk6KGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKSxkPSEwKTtjb25zdCBmPXRoaXMuX3dhdGNoS2V5MkRhdGFbYV0uZGV2aWNlTmFtZSxnPXRoaXMuX3dhdGNoS2V5MkRhdGFbYV0ubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSxsPWYrIi8iK2c7dmFyIGs9dGhpcy5fd2F0Y2hLZXkyQ291bnRbYV0sbj10aGlzLl93YXRjaEtleTJEYXRhW2FdLnRlbnNvck5hbWUscD10aGlzLl93YXRjaEtleTJEYXRhW2FdLmRlYnVnT3AscT10aGlzLl93YXRjaEtleTJWYWx1ZVNob3J0W2FdO2NvbnN0IHI9dGhpcy5fd2F0Y2hLZXkyRXhwYW5kSGFuZGxlclthXSx0PWE9PT10aGlzLl9hY3RpdmVXYXRjaEtleSx2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7UG9seW1lci5kb20odikuY2xhc3NMaXN0LmFkZCgidGVuc29yLW5hbWUiKTsKdi5zdHlsZVsidGV4dC1kZWNvcmF0aW9uIl09InVuZGVybGluZSI7di5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO3YudGV4dENvbnRlbnQ9bjt2LmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsKCk9PntudWxsIT10aGlzLnRlbnNvck5hbWVDbGlja2VkJiZ0aGlzLnRlbnNvck5hbWVDbGlja2VkKGYsZyl9KTtjb25zdCB5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7eS50ZXh0Q29udGVudD1rO2NvbnN0IHo9dGhpcy5fd2F0Y2hLZXkyRGF0YVthXS5kdHlwZTtrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Y29uc3QgeD10aGlzLl93YXRjaEtleTJEYXRhW2FdLnNoYXBlO2sudGV4dENvbnRlbnQ9ejtjb25zdCBDPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Qy50ZXh0Q29udGVudD1KU09OLnN0cmluZ2lmeSh4KTtjb25zdCBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ri50ZXh0Q29udGVudD1xO1BvbHltZXIuZG9tKEYpLmNsYXNzTGlzdC5hZGQoInZhbHVlLWV4cGFuc2lvbi1saW5rIik7Cm51bGwhPXImJihGLmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsciwhMSksRi5zdHlsZVsidGV4dC1kZWNvcmF0aW9uIl09InVuZGVybGluZSIsRi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtxPW51bGw7cT10aGlzLl9oZWFsdGhQaWxsc0VuYWJsZWQ/dGhpcy5fcmVuZGVySGVhbHRoUGlsbChuKyI6IitwLHtkZXZpY2VfbmFtZTpmLG5vZGVfbmFtZTpnLGR0eXBlOnosc2hhcGU6eCx2YWx1ZTpudWxsfSxyKTpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLWljb24tYnV0dG9uIik7cC5zZXRBdHRyaWJ1dGUoImljb24iLCJmb3J3YXJkIik7cC5zZXRBdHRyaWJ1dGUoInRpdGxlIiwiQ29udGludWUgdG8iKTtwLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e3RoaXMuY29udGludWVUb0NhbGxiYWNrKGYsZyl9KTtuLmFwcGVuZENoaWxkKHApO2MuYXBwZW5kQ2hpbGQodik7CmMuYXBwZW5kQ2hpbGQoeSk7Yy5hcHBlbmRDaGlsZChrKTtjLmFwcGVuZENoaWxkKEMpO2MuYXBwZW5kQ2hpbGQoRik7Yy5hcHBlbmRDaGlsZChxKTtjLmFwcGVuZENoaWxkKG4pO2Muc2V0QXR0cmlidXRlKCJub2RlTmFtZVdpdGhEZXZpY2UiLGwpO3QmJihQb2x5bWVyLmRvbShjKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUtdGVuc29yIiksUG9seW1lci5kb20oYykuY2xhc3NMaXN0LmFkZCgiaGlnaGxpZ2h0ZWQiKSk7dGhpcy5fd2F0Y2hLZXkyUm93W2FdPWM7ZCYmUG9seW1lci5kb20odGhpcy4kJCgiI3RlbnNvci1kYXRhLXRhYmxlIHRib2R5IikpLmFwcGVuZENoaWxkKGMpO2Muc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJlbmQiLGlubGluZToibmVhcmVzdCIsYmVoYXZpb3VyOiJzbW9vdGgifSl9LF9yZW5kZXJIZWFsdGhQaWxsKGEsYyxkKXtjb25zdCBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7UG9seW1lci5kb20oZikuY2xhc3NMaXN0LmFkZCgiaGVhbHRoLXBpbGwiKTsKbnVsbCE9ZCYmZi5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLGQsITEpO2Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRmLmdyYXBoLnNjZW5lLlNWR19OQU1FU1BBQ0UsInN2ZyIpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsdGhpcy5faGVhbHRoUGlsbFdpZHRoKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0Iix0aGlzLl9oZWFsdGhQaWxsSGVpZ2h0KTtjb25zdCBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0Zi5ncmFwaC5zY2VuZS5TVkdfTkFNRVNQQUNFLCJnIik7ZC5hcHBlbmRDaGlsZChnKTtmLmFwcGVuZENoaWxkKGQpO2NvbnN0IGw9InRkcC8iK2E7dGhpcy5nZXRIZWFsdGhQaWxsKGEsYy5kZXZpY2VfbmFtZSxjLm5vZGVfbmFtZSxrPT57bnVsbD09az8oZi50ZXh0Q29udGVudD0iTi9BIixmLnN0eWxlLmNvbG9yPSJncmF5Iik6KGMudmFsdWU9ayx0Zi5ncmFwaC5zY2VuZS5hZGRIZWFsdGhQaWxsKGcsYyxudWxsLGwsdGhpcy5faGVhbHRoUGlsbFdpZHRoLHRoaXMuX2hlYWx0aFBpbGxIZWlnaHQvCjIsdGhpcy5faGVhbHRoUGlsbEhlaWdodC8yLDApKX0pO3JldHVybiBmfSxfaGlnaGxpZ2h0KGEpe1BvbHltZXIuZG9tKHRoaXMuJCQoIiN0ZW5zb3ItZGF0YS10YWJsZSIpKTtjb25zdCBjPVtdO2Zvcihjb25zdCBkIGluIHRoaXMuX3dhdGNoS2V5MlJvdyl7aWYoIXRoaXMuX3dhdGNoS2V5MlJvdy5oYXNPd25Qcm9wZXJ0eShkKSljb250aW51ZTtjb25zdCBmPXRoaXMuX3dhdGNoS2V5MlJvd1tkXTtudWxsIT1mLmdldEF0dHJpYnV0ZSYmKGYuZ2V0QXR0cmlidXRlKCJub2RlTmFtZVdpdGhEZXZpY2UiKT09PWE/Yy5wdXNoKGYpOlBvbHltZXIuZG9tKGYpLmNsYXNzTGlzdC5yZW1vdmUoImhpZ2hsaWdodGVkIikpfWlmKG51bGwhPWEpZm9yKGE9MDthPGMubGVuZ3RoOysrYSlQb2x5bWVyLmRvbShjW2FdKS5jbGFzc0xpc3QuYWRkKCJoaWdobGlnaHRlZCIpLGNbYV0uc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJlbmQiLGlubGluZToibmVhcmVzdCIsYmVoYXZpb3VyOiJzbW9vdGgifSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGVuc29yLXdpZGdldC90ZW5zb3Jfd2lkZ2V0X2JpbmFyeS5qcwp2YXIgaHA9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShjLGQpe2E9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKGYsZyl7Zi5fX3Byb3RvX189Z318fGZ1bmN0aW9uKGYsZyl7Zm9yKHZhciBsIGluIGcpZy5oYXNPd25Qcm9wZXJ0eShsKSYmKGZbbF09Z1tsXSl9O3JldHVybiBhKGMsZCl9cmV0dXJuIGZ1bmN0aW9uKGMsZCl7ZnVuY3Rpb24gZigpe3RoaXMuY29uc3RydWN0b3I9Y31hKGMsZCk7Yy5wcm90b3R5cGU9bnVsbD09PWQ/T2JqZWN0LmNyZWF0ZShkKTooZi5wcm90b3R5cGU9ZC5wcm90b3R5cGUsbmV3IGYpfX0oKSxpcD10aGlzJiZ0aGlzLl9fZ2VuZXJhdG9yfHxmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGQocSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBmKFtxLHJdKX19ZnVuY3Rpb24gZihxKXtpZihsKXRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4iKTsKZm9yKDtnOyl0cnl7aWYobD0xLGsmJihuPXFbMF0mMj9rWyJyZXR1cm4iXTpxWzBdP2tbInRocm93Il18fCgobj1rWyJyZXR1cm4iXSkmJm4uY2FsbChrKSwwKTprLm5leHQpJiYhKG49bi5jYWxsKGsscVsxXSkpLmRvbmUpcmV0dXJuIG47aWYoaz0wLG4pcT1bcVswXSYyLG4udmFsdWVdO3N3aXRjaChxWzBdKXtjYXNlIDA6Y2FzZSAxOm49cTticmVhaztjYXNlIDQ6cmV0dXJuIGcubGFiZWwrKyx7dmFsdWU6cVsxXSxkb25lOiExfTtjYXNlIDU6Zy5sYWJlbCsrO2s9cVsxXTtxPVswXTtjb250aW51ZTtjYXNlIDc6cT1nLm9wcy5wb3AoKTtnLnRyeXMucG9wKCk7Y29udGludWU7ZGVmYXVsdDppZighKG49Zy50cnlzLG49MDxuLmxlbmd0aCYmbltuLmxlbmd0aC0xXSkmJig2PT09cVswXXx8Mj09PXFbMF0pKXtnPTA7Y29udGludWV9aWYoMz09PXFbMF0mJighbnx8cVsxXT5uWzBdJiZxWzFdPG5bM10pKWcubGFiZWw9cVsxXTtlbHNlIGlmKDY9PT1xWzBdJiZnLmxhYmVsPG5bMV0pZy5sYWJlbD0KblsxXSxuPXE7ZWxzZSBpZihuJiZnLmxhYmVsPG5bMl0pZy5sYWJlbD1uWzJdLGcub3BzLnB1c2gocSk7ZWxzZXtuWzJdJiZnLm9wcy5wb3AoKTtnLnRyeXMucG9wKCk7Y29udGludWV9fXE9Yy5jYWxsKGEsZyl9Y2F0Y2gocil7cT1bNixyXSxrPTB9ZmluYWxseXtsPW49MH1pZihxWzBdJjUpdGhyb3cgcVsxXTtyZXR1cm57dmFsdWU6cVswXT9xWzFdOnZvaWQgMCxkb25lOiEwfX12YXIgZz17bGFiZWw6MCxzZW50OmZ1bmN0aW9uKCl7aWYoblswXSYxKXRocm93IG5bMV07cmV0dXJuIG5bMV19LHRyeXM6W10sb3BzOltdfSxsLGssbixwO3JldHVybiBwPXtuZXh0OmQoMCksInRocm93IjpkKDEpLCJyZXR1cm4iOmQoMil9LCJmdW5jdGlvbiI9PT10eXBlb2YgU3ltYm9sJiYocFtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxwfSxqcD10aGlzJiZ0aGlzLl9fcmVhZHx8ZnVuY3Rpb24oYSxjKXt2YXIgZD0iZnVuY3Rpb24iPT09dHlwZW9mIFN5bWJvbCYmYVtTeW1ib2wuaXRlcmF0b3JdOwppZighZClyZXR1cm4gYTthPWQuY2FsbChhKTt2YXIgZixnPVtdO3RyeXtmb3IoOyh2b2lkIDA9PT1jfHwwPGMtLSkmJiEoZj1hLm5leHQoKSkuZG9uZTspZy5wdXNoKGYudmFsdWUpfWNhdGNoKGspe3ZhciBsPXtlcnJvcjprfX1maW5hbGx5e3RyeXtmJiYhZi5kb25lJiYoZD1hWyJyZXR1cm4iXSkmJmQuY2FsbChhKX1maW5hbGx5e2lmKGwpdGhyb3cgbC5lcnJvcjt9fXJldHVybiBnfTsKKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShILEssTSxMKXtyZXR1cm4gbmV3IChNfHwoTT1Qcm9taXNlKSkoZnVuY3Rpb24oUixVKXtmdW5jdGlvbiBZKGFhKXt0cnl7bWEoTC5uZXh0KGFhKSl9Y2F0Y2goY2Epe1UoY2EpfX1mdW5jdGlvbiBiYShhYSl7dHJ5e21hKExbInRocm93Il0oYWEpKX1jYXRjaChjYSl7VShjYSl9fWZ1bmN0aW9uIG1hKGFhKXthYS5kb25lP1IoYWEudmFsdWUpOihuZXcgTShmdW5jdGlvbihjYSl7Y2EoYWEudmFsdWUpfSkpLnRoZW4oWSxiYSl9bWEoKEw9TC5hcHBseShILEt8fFtdKSkubmV4dCgpKX0pfWZ1bmN0aW9uIGMoSCl7cmV0dXJuIG51bGwhPT1ILm1hdGNoKC9eaW50WzAtOV0rJC8pfHxudWxsIT09SC5tYXRjaCgvXnVpbnRbMC05XSskLyl9ZnVuY3Rpb24gZChIKXtyZXR1cm4gbnVsbCE9PUgubWF0Y2goL15mbG9hdFswLTldKyQvKXx8bnVsbCE9PUgubWF0Y2goL15iZmxvYXRbMC05XSskLyl9ZnVuY3Rpb24gZihIKXtyZXR1cm4iYm9vbCI9PT1ILnRvTG93ZXJDYXNlKCl8fAoiYm9vbGVhbiI9PT1ILnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gZyhIKXtyZXR1cm4ic3RyIj09PUgudG9Mb3dlckNhc2UoKXx8InN0cmluZyI9PT1ILnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gbChIKXt2YXIgSz0xO0guZm9yRWFjaChmdW5jdGlvbihNKXtLKj1NfSk7cmV0dXJuIEt9ZnVuY3Rpb24gayhIKXtyZXR1cm4gMD09PUgubGVuZ3RoPyJzY2FsYXIiOiJbIitIKyJdIn1mdW5jdGlvbiBuKEgpe3ZhciBLPXtzbGljaW5nRGltc0FuZEluZGljZXM6W10sdmlld2luZ0RpbXM6W10sdmVydGljYWxSYW5nZTpudWxsLGhvcml6b250YWxSYW5nZTpudWxsfSxNPUgubGVuZ3RoO2lmKDE9PT1NKUsudmlld2luZ0RpbXM9WzBdO2Vsc2UgaWYoMTxNKXtpZigyPE0pZm9yKHZhciBMPTA7TDxNLTI7KytMKUsuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLnB1c2goe2RpbTpMLGluZGV4OjA9PT1IW0xdP251bGw6MH0pO2ZvcihMPUgubGVuZ3RoLTI7TDxILmxlbmd0aDsrK0wpSy52aWV3aW5nRGltcy5wdXNoKEwpfXJldHVybiBLfQpmdW5jdGlvbiBwKEgsSyl7aWYoSC52aWV3aW5nRGltc1swXSE9PUsudmlld2luZ0RpbXNbMF18fEgudmlld2luZ0RpbXNbMV0hPT1LLnZpZXdpbmdEaW1zWzFdKXJldHVybiExO0s9SC5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKE0pe3JldHVybiBNLmRpbX0pO0suc29ydCgpO0g9SC5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKE0pe3JldHVybiBNLmRpbX0pO0guc29ydCgpO3JldHVybiBKU09OLnN0cmluZ2lmeShLKT09PUpTT04uc3RyaW5naWZ5KEgpfWZ1bmN0aW9uIHEoSCl7cmV0dXJuIDIwPj1ILmxlbmd0aD9IOkguc2xpY2UoMCwxMCkrIi4uLiIrSC5zbGljZShILmxlbmd0aC03LEgubGVuZ3RoKX1mdW5jdGlvbiByKEgsSyxNLEwpe3ZvaWQgMD09PU0mJihNPTIpO2lmKGlzTmFOKEgpKXJldHVybiJOYU4iO2lmKC1JbmZpbml0eT09PUgpcmV0dXJuIi1cdTIyMWUiO2lmKEluZmluaXR5PT09SClyZXR1cm4iK1x1MjIxZSI7bnVsbD09TCYmKEw9Ck1hdGguYWJzKEgpLEw9MUUzPkwmJi4wMTw9THx8MD09PUw/ImZpeGVkIjoiZXhwb25lbnRpYWwiKTtyZXR1cm4gbnVsbD09THx8ImZpeGVkIj09PUw/Sz8iIitIOkgudG9GaXhlZChNKTpILnRvRXhwb25lbnRpYWwoTSl9ZnVuY3Rpb24gdChILEspe3ZvaWQgMD09PUsmJihLPSEwKTtyZXR1cm4gSD9LPyJUIjoiVHJ1ZSI6Sz8iRiI6IkZhbHNlIn1mdW5jdGlvbiB2KEgsSyl7dm9pZCAwPT09SyYmKEs9NCk7cmV0dXJuIG51bGw9PT1LfHxILmxlbmd0aDw9Sz9IOkguc2xpY2UoMCxLLTEpKyJcdTIwMjYifXZhciB5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSChLKXt0aGlzLmlzU2hvd249ITE7dGhpcy5ibHVySGlkZUZ1bmN0aW9uPW51bGw7dGhpcy5kcm9wZG93bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmRyb3Bkb3duLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duIik7dGhpcy5kcm9wZG93bi5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO3RoaXMuZHJvcGRvd24uc3R5bGUuZGlzcGxheT0KIm5vbmUiO0suYXBwZW5kQ2hpbGQodGhpcy5kcm9wZG93bil9SC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbihLLE0sTCl7dmFyIFI9dGhpcztMLmZvckVhY2goZnVuY3Rpb24oWSl7dmFyIGJhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2JhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbSIpO2JhLnRleHRDb250ZW50PVkuY2FwdGlvbjtSLmRyb3Bkb3duLmFwcGVuZENoaWxkKGJhKTtZLmRpc2FibGVkP2JhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1kaXNhYmxlZCIpOihiYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24obWEpe21hLnN0b3BQcm9wYWdhdGlvbigpO1IuZHJvcGRvd24uY2xpY2soKTtpZihudWxsIT09WS5vbkNsaWNrKVkub25DbGljayhtYSk7Ui5oaWRlKCl9KSxiYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixmdW5jdGlvbihtYSl7aWYobnVsbCE9PQpZLm9uSG92ZXIpWS5vbkhvdmVyKG1hKTtiYS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0tYWN0aXZlIil9KSxiYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe2JhLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUiKTtpZihudWxsIT09WS5vbkhvdmVyKXtmb3IodmFyIG1hPVtdLGFhPTA7YWE8YmEuY2hpbGRyZW4ubGVuZ3RoOysrYWEpe3ZhciBjYT1iYS5jaGlsZHJlblthYV07Y2EuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93biIpJiZtYS5wdXNoKGNhKX1tYS5mb3JFYWNoKGZ1bmN0aW9uKGZhKXtyZXR1cm4gYmEucmVtb3ZlQ2hpbGQoZmEpfSl9fSkpfSk7dGhpcy5kcm9wZG93bi5zdHlsZS5kaXNwbGF5PSJibG9jayI7dGhpcy5kcm9wZG93bi5zdHlsZS50b3A9SysicHgiO3RoaXMuZHJvcGRvd24uc3R5bGUubGVmdD0KTSsicHgiO0w9dGhpcy5kcm9wZG93bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgVT1MLmxlZnQtTTt0aGlzLmRyb3Bkb3duLnN0eWxlLnRvcD0oSy0oTC50b3AtSykpLnRvRml4ZWQoMSkrInB4Ijt0aGlzLmRyb3Bkb3duLnN0eWxlLmxlZnQ9KE0tVSkudG9GaXhlZCgxKSsicHgiO3RoaXMuaXNTaG93bj0hMDt0aGlzLmJsdXJIaWRlRnVuY3Rpb249ZnVuY3Rpb24oKXtSLmhpZGUoKX07c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLFIuYmx1ckhpZGVGdW5jdGlvbil9LDUwKX07SC5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe2Zvcih0aGlzLmRyb3Bkb3duLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZHJvcGRvd24uZmlyc3RDaGlsZDspdGhpcy5kcm9wZG93bi5yZW1vdmVDaGlsZCh0aGlzLmRyb3Bkb3duLmZpcnN0Q2hpbGQpO3RoaXMuaXNTaG93bj0hMTtudWxsIT10aGlzLmJsdXJIaWRlRnVuY3Rpb24mJndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuYmx1ckhpZGVGdW5jdGlvbil9O0gucHJvdG90eXBlLnNob3duPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNTaG93bn07cmV0dXJuIEh9KCksej1mdW5jdGlvbigpe2Z1bmN0aW9uIEgoSyxNKXt2YXIgTD10aGlzO3RoaXMuY29uZmlnPUs7dGhpcy5wYXJlbnRFbGVtZW50PU07dGhpcy5iYXNlRmxhdE1lbnU9bmV3IHkodGhpcy5wYXJlbnRFbGVtZW50KTt0aGlzLmN1cnJlbnRDaG9pY2VTZWxlY3Rpb25zPXt9O3RoaXMuY29uZmlnLml0ZW1zLmZvckVhY2goZnVuY3Rpb24oUixVKXtudWxsIT1SLm9wdGlvbnMmJihMLmN1cnJlbnRDaG9pY2VTZWxlY3Rpb25zW1VdPVIuZGVmYXVsdFNlbGVjdGlvbil9KX1ILnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKEssTSl7dmFyIEw9dGhpcyxSPVtdO3RoaXMuY29uZmlnLml0ZW1zLmZvckVhY2goZnVuY3Rpb24oVSxZKXt2YXIgYmE9e2NhcHRpb246VS5jYXB0aW9uLG9uQ2xpY2s6bnVsbCxvbkhvdmVyOm51bGx9O2lmKG51bGwhPVUub3B0aW9ucyl7dmFyIG1hPQpMLmN1cnJlbnRDaG9pY2VTZWxlY3Rpb25zW1ldO2JhLm9uSG92ZXI9ZnVuY3Rpb24oYWEpe3ZhciBjYT1hYS50YXJnZXQsZmE9W107VS5vcHRpb25zLmZvckVhY2goZnVuY3Rpb24oZGEsbGEpe2ZhLnB1c2goe2NhcHRpb246bGE9PT1tYT9kYSsiIChcdTI3MTMpIjpkYSxvbkNsaWNrOmZ1bmN0aW9uKCl7bWEhPT1sYSYmKEwuY3VycmVudENob2ljZVNlbGVjdGlvbnNbWV09bGEsVS5jYWxsYmFjayhsYSkpfSxvbkhvdmVyOm51bGx9KX0pO2FhPW5ldyB5KGNhKTtjYT1jYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTthYS5zaG93KGNhLnRvcCxjYS5yaWdodCxmYSl9fWVsc2UgYmEub25DbGljaz1VLmNhbGxiYWNrO251bGw9PVUuaXNFbmFibGVkfHxVLmlzRW5hYmxlZCgpfHwoYmEuZGlzYWJsZWQ9ITApO1IucHVzaChiYSl9KTt0aGlzLmJhc2VGbGF0TWVudS5zaG93KEssTSxSKX07SC5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3RoaXMuYmFzZUZsYXRNZW51LmhpZGUoKX07SC5wcm90b3R5cGUuc2hvd249CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmFzZUZsYXRNZW51LnNob3duKCl9O3JldHVybiBIfSgpLHg7KGZ1bmN0aW9uKEgpe0hbSC5VUD0xXT0iVVAiO0hbSC5ET1dOPTJdPSJET1dOIjtIW0guTEVGVD0zXT0iTEVGVCI7SFtILlJJR0hUPTRdPSJSSUdIVCJ9KSh4fHwoeD17fSkpO3ZhciBDPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSChLLE0sTCxSLFUsWSl7dGhpcy5zaGFwZT1LO3RoaXMuc2xpY2VEaW1zPVtdO3RoaXMuc2xpY2VJbmRpY2VzPVtdO2lmKDA9PT1sKHRoaXMuc2hhcGUpKXRocm93IEVycm9yKCJUZW5zb3JFbGVtZW50U2VsZWN0aW9uIGRvZXNuJ3Qgc3VwcG9ydCB0ZW5zb3Igd2l0aCB6ZXJvIGVsZW1lbnRzLiIpO2ZvcihLPTA7SzxNLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5sZW5ndGg7KytLKXt0aGlzLnNsaWNlRGltcy5wdXNoKE0uc2xpY2luZ0RpbXNBbmRJbmRpY2VzW0tdLmRpbSk7dmFyIGJhPU0uc2xpY2luZ0RpbXNBbmRJbmRpY2VzW0tdLmluZGV4O2lmKG51bGw9PT0KYmEpdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgVGVuc29yRWxlbWVudFNlbGVjdGlvbiBkdWUgdG8gdW5kZXRlcm1pbmVkIHNsaWNpbmcgaW5kZXggYXQgZGltZW5zaW9uICIrSyk7dGhpcy5zbGljZUluZGljZXMucHVzaChiYSl9dGhpcy5yYW5rPXRoaXMuc2hhcGUubGVuZ3RoO2lmKDA8dGhpcy5yYW5rJiZ0aGlzLnNsaWNlRGltcy5sZW5ndGg+PXRoaXMucmFuayl0aHJvdyBFcnJvcigiRXhwZWN0ZWQgc2xpY2VEaW1zIHRvIGhhdmUgYSBsZW5ndGggbGVzcyB0aGFuIHJhbmsgIit0aGlzLnJhbmsrIiwgYnV0IGdvdCBsZW5ndGggIit0aGlzLnNsaWNlRGltcy5sZW5ndGgpO3RoaXMudmlld0RpbXM9W107Zm9yKEs9MDtLPHRoaXMucmFuazsrK0spLTE9PT10aGlzLnNsaWNlRGltcy5pbmRleE9mKEspJiZ0aGlzLnZpZXdEaW1zLnB1c2goSyk7aWYoMjx0aGlzLnZpZXdEaW1zLmxlbmd0aCl0aHJvdyBFcnJvcigiT25seSBzZWxlY3Rpb25zIGluIDFEIGFuZCAyRCBhcmUgc3VwcG9ydGVkLiIpOwp0aGlzLnJvd1N0YXJ0PW51bGw9PUw/MDpMO3RoaXMuY29sU3RhcnQ9bnVsbD09Uj8wOlI7dGhpcy5yb3dDb3VudD1udWxsPT1VPzE6VTt0aGlzLmNvbENvdW50PW51bGw9PVk/MTpZfUgucHJvdG90eXBlLmdldEVsZW1lbnRTdGF0dXM9ZnVuY3Rpb24oSyl7aWYoSy5sZW5ndGghPT10aGlzLnJhbmspdGhyb3cgRXJyb3IoIkV4cGVjdGVkIGluZGljZXMgdG8gaGF2ZSBhIHJhbmsgb2YgIit0aGlzLnJhbmsrIiwgYnV0IGdvdCAiKyhLLmxlbmd0aCsiIChbIitLKyJdKSIpKTtmb3IodmFyIE09MDtNPEsubGVuZ3RoOysrTSlpZigtMSE9PXRoaXMuc2xpY2VEaW1zLmluZGV4T2YoTSkmJktbTV0hPT10aGlzLnNsaWNlSW5kaWNlc1t0aGlzLnNsaWNlRGltcy5pbmRleE9mKE0pXSlyZXR1cm4gbnVsbDtNPW51bGw7dmFyIEw9dGhpcy5yb3dTdGFydCt0aGlzLnJvd0NvdW50LFI9dGhpcy5jb2xTdGFydCt0aGlzLmNvbENvdW50O2lmKDA9PT10aGlzLnZpZXdEaW1zLmxlbmd0aCkwPT09Sy5sZW5ndGgmJgooTT17dG9wRWRnZTohMCxib3R0b21FZGdlOiEwLGxlZnRFZGdlOiEwLHJpZ2h0RWRnZTohMH0pO2Vsc2UgaWYoMT09PXRoaXMudmlld0RpbXMubGVuZ3RoKXt2YXIgVT10aGlzLnZpZXdEaW1zWzBdO0tbVV0+PXRoaXMucm93U3RhcnQmJktbVV08TCYmKE09e3RvcEVkZ2U6S1tVXT09PXRoaXMucm93U3RhcnQsYm90dG9tRWRnZTpLW1VdPT09TC0xLGxlZnRFZGdlOiEwLHJpZ2h0RWRnZTohMH0pfWVsc2UgaWYoMj09PXRoaXMudmlld0RpbXMubGVuZ3RoKXtVPXRoaXMudmlld0RpbXNbMF07dmFyIFk9dGhpcy52aWV3RGltc1sxXTtLW1VdPj10aGlzLnJvd1N0YXJ0JiZLW1VdPEwmJktbWV0+PXRoaXMuY29sU3RhcnQmJktbWV08UiYmKE09e3RvcEVkZ2U6S1tVXT09PXRoaXMucm93U3RhcnQsYm90dG9tRWRnZTpLW1VdPT09TC0xLGxlZnRFZGdlOktbWV09PT10aGlzLmNvbFN0YXJ0LHJpZ2h0RWRnZTpLW1ldPT09Ui0xfSl9ZWxzZSB0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBsZW5ndGggb2Ygdmlld0RpbXM6ICIrCnRoaXMudmlld0RpbXMpO3JldHVybiBNfTtILnByb3RvdHlwZS5tb3ZlPWZ1bmN0aW9uKEssTSl7dmFyIEw9bnVsbDtpZigwPT09dGhpcy5yYW5rfHwxPT09dGhpcy5yYW5rJiYoSz09PXguTEVGVHx8Sz09PXguUklHSFQpKXJldHVybiBudWxsO2lmKG51bGw9PT1NLnZlcnRpY2FsUmFuZ2V8fG51bGw9PT1NLnZlcnRpY2FsUmFuZ2VbMV0pdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBtb3ZlIGR1ZSB0byB1bmRldGVybWluZWQgdmVydGljYWwgcmFuZ2UuIik7Sz09PXguVVA/MDx0aGlzLnJvd1N0YXJ0JiYodGhpcy5yb3dTdGFydC0tLG51bGwhPU0udmVydGljYWxSYW5nZSYmdGhpcy5yb3dTdGFydDxNLnZlcnRpY2FsUmFuZ2VbMF0mJihMPXguVVApKTpLPT09eC5ET1dOP251bGwhPU0udmlld2luZ0RpbXMmJm51bGwhPU0udmlld2luZ0RpbXNbMF0mJnRoaXMucm93U3RhcnQ8dGhpcy5zaGFwZVtNLnZpZXdpbmdEaW1zWzBdXS0xJiYodGhpcy5yb3dTdGFydCsrLG51bGwhPU0udmVydGljYWxSYW5nZSYmCnRoaXMucm93U3RhcnQ+PU0udmVydGljYWxSYW5nZVsxXSYmKEw9eC5ET1dOKSk6Sz09PXguTEVGVD8wPHRoaXMuY29sU3RhcnQmJih0aGlzLmNvbFN0YXJ0LS0sbnVsbCE9TS5ob3Jpem9udGFsUmFuZ2UmJnRoaXMuY29sU3RhcnQ8TS5ob3Jpem9udGFsUmFuZ2VbMF0mJihMPXguTEVGVCkpOks9PT14LlJJR0hUJiZudWxsIT1NLnZpZXdpbmdEaW1zJiZudWxsIT1NLnZpZXdpbmdEaW1zWzFdJiZ0aGlzLmNvbFN0YXJ0PHRoaXMuc2hhcGVbTS52aWV3aW5nRGltc1sxXV0tMSYmKHRoaXMuY29sU3RhcnQrKyxudWxsIT1NLmhvcml6b250YWxSYW5nZSYmdGhpcy5jb2xTdGFydD49TS5ob3Jpem9udGFsUmFuZ2VbMV0mJihMPXguUklHSFQpKTt0aGlzLmNvbENvdW50PXRoaXMucm93Q291bnQ9MTtyZXR1cm4gTH07SC5wcm90b3R5cGUuZ2V0Um93U3RhcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb3dTdGFydH07SC5wcm90b3R5cGUuZ2V0Um93Q291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb3dDb3VudH07CkgucHJvdG90eXBlLmdldENvbFN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29sU3RhcnR9O0gucHJvdG90eXBlLmdldENvbENvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29sQ291bnR9O3JldHVybiBIfSgpLEY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBIKEssTSxMKXt2b2lkIDA9PT1MJiYoTD1mdW5jdGlvbigpe30pO3RoaXMucm9vdERpdj1LO3RoaXMuc2hhcGU9TTt0aGlzLm9uU2xpY2luZ1NwZWNDaGFuZ2U9TDt0aGlzLmRpbUNvbnRyb2xzPVtdO3RoaXMuZGltSW5wdXRzPVtdO3RoaXMuY29tbWFzPVtdO3RoaXMuZHJvcGRvd25zPVtdO3RoaXMuYnJhY2tldERpdnM9W251bGwsbnVsbF07dGhpcy5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWQ9W107dGhpcy5yYW5rPXRoaXMuc2hhcGUubGVuZ3RoO2lmKDM+dGhpcy5yYW5rKXRocm93IEVycm9yKCJEaW1lbnNpb24gY29udHJvbCBpcyBub3QgYXBwbGljYWJsZSB0byB0ZW5zb3Igc2hhcGVzIGxlc3MgdGhhbiAzRDogcmVjZWl2ZWQgIisKKHRoaXMucmFuaysiRCB0ZW5zb3Igc2hhcGU6ICIpKyhKU09OLnN0cmluZ2lmeSh0aGlzLnNoYXBlKSsiLiIpKTt0aGlzLmNyZWF0ZUNvbXBvbmVudHMoKTt0aGlzLnNsaWNpbmdTcGVjPW4oTSl9SC5wcm90b3R5cGUuY3JlYXRlQ29tcG9uZW50cz1mdW5jdGlvbigpe2Zvcih2YXIgSz10aGlzO3RoaXMucm9vdERpdi5maXJzdENoaWxkOyl0aGlzLnJvb3REaXYucmVtb3ZlQ2hpbGQodGhpcy5yb290RGl2LmZpcnN0Q2hpbGQpO3RoaXMuZGltQ29udHJvbHM9W107dGhpcy5kaW1JbnB1dHM9W107dGhpcy5jb21tYXM9W107dGhpcy5kcm9wZG93bnM9W107dGhpcy5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWQ9W107dGhpcy5icmFja2V0RGl2c1swXT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmJyYWNrZXREaXZzWzBdLnRleHRDb250ZW50PSJTbGljaW5nOiBbIjt0aGlzLmJyYWNrZXREaXZzWzBdLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWJyYWNrZXRzIik7CnRoaXMucm9vdERpdi5hcHBlbmRDaGlsZCh0aGlzLmJyYWNrZXREaXZzWzBdKTtmb3IodmFyIE09MDtNPHRoaXMucmFuazsrK00pe3ZhciBMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0wuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0iKTtMLnRpdGxlPSJEaW1lbnNpb24gIitNKyI6IHNpemVceDNkIit0aGlzLnNoYXBlW01dO3RoaXMucm9vdERpdi5hcHBlbmRDaGlsZChMKTt0aGlzLmRpbUNvbnRyb2xzLnB1c2goTCk7dGhpcy5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWQucHVzaCghMSk7TD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO0wuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0iKTtMLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMucm9vdERpdi5hcHBlbmRDaGlsZChMKTt0aGlzLmRpbUlucHV0cy5wdXNoKEwpO008dGhpcy5yYW5rLTEmJihMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLEwuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0tY29tbWEiKSwKTC50ZXh0Q29udGVudD0iLCIsdGhpcy5yb290RGl2LmFwcGVuZENoaWxkKEwpLHRoaXMuY29tbWFzLnB1c2goTCkpO0w9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7TC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93biIpO0wuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5yb290RGl2LmFwcGVuZENoaWxkKEwpO3RoaXMuZHJvcGRvd25zLnB1c2goTCl9dGhpcy5icmFja2V0RGl2c1sxXT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmJyYWNrZXREaXZzWzFdLnRleHRDb250ZW50PSJdIjt0aGlzLmJyYWNrZXREaXZzWzFdLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWJyYWNrZXRzIik7dGhpcy5yb290RGl2LmFwcGVuZENoaWxkKHRoaXMuYnJhY2tldERpdnNbMV0pO3RoaXMucm9vdERpdi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe0suY2xlYXJBbGxEcm9wZG93bnMoKX0pfTtILnByb3RvdHlwZS5yZW5kZXI9CmZ1bmN0aW9uKEspe2Z1bmN0aW9uIE0oYmEpe3ZhciBtYT1ZLmRpbUNvbnRyb2xzW2JhXSxhYT1ZLmRpbUlucHV0c1tiYV0sY2E9WS5kcm9wZG93bnNbYmFdO2lmKCJub25lIiE9PWFhLnN0eWxlLmRpc3BsYXkpcmV0dXJuImNvbnRpbnVlIjt2YXIgZmE9WS5zaGFwZVtiYV07aWYoLTEhPT1SLmluZGV4T2YoYmEpKXt2YXIgZGE9VVtSLmluZGV4T2YoYmEpXTttYS50ZXh0Q29udGVudD1TdHJpbmcoZGEpO2FhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltIik7YWEudHlwZT0ibnVtYmVyIjthYS5taW49IjAiO2FhLm1heD1TdHJpbmcoZmEtMSk7YWEudmFsdWU9U3RyaW5nKGRhKTtZLmRpbUNvbnRyb2xzTGlzdGVuZXJBdHRhY2hlZFtiYV18fChtYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtMLmNsZWFyQWxsRHJvcGRvd25zKCk7bWEuc3R5bGUuZGlzcGxheT0ibm9uZSI7YWEuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIn0pLGFhLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsCmZ1bmN0aW9uKCl7aWYobnVsbD09PUwuc2xpY2luZ1NwZWMpdGhyb3cgRXJyb3IoIlNsaWNpbmcgY29udHJvbCBjaGFuZ2UgY2FsbGJhY2sgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIHNwZWMuIik7dmFyIGxhPXBhcnNlSW50KGFhLnZhbHVlLDEwKTshaXNGaW5pdGUobGEpfHwwPmxhfHxsYT49ZmF8fE1hdGguZmxvb3IoZmEpIT1mYT9hYS52YWx1ZT1TdHJpbmcoTC5zbGljaW5nU3BlYy5zbGljaW5nRGltc0FuZEluZGljZXNbUi5pbmRleE9mKGJhKV0uaW5kZXgpOihMLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tSLmluZGV4T2YoYmEpXS5pbmRleD1sYSxtYS50ZXh0Q29udGVudD1TdHJpbmcobGEpLEwub25TbGljaW5nU3BlY0NoYW5nZShMLnNsaWNpbmdTcGVjKSl9KSxhYS5hZGRFdmVudExpc3RlbmVyKCJibHVyIixmdW5jdGlvbigpe2FhLnN0eWxlLmRpc3BsYXk9Im5vbmUiO21hLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayJ9KSxZLmRpbUNvbnRyb2xzTGlzdGVuZXJBdHRhY2hlZFtiYV09CiEwKX1lbHNle2lmKFkuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF09PT1iYSl7aWYobnVsbD09PVkuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyB2ZXJ0aWNhbCByYW5nZS4iKTttYS50ZXh0Q29udGVudD0iXHUyMTk1ICIrWS5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdKyI6IitZLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV19ZWxzZXtpZihudWxsPT09WS5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgaG9yaXpvbnRhbCByYW5nZS4iKTttYS50ZXh0Q29udGVudD0iXHUyMTk0ICIrWS5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF0rIjoiK1kuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdfW1hLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltIik7WS5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWRbYmFdfHwobWEuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dmFyIGxhPQptYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtMLnJlbmRlckRyb3Bkb3duTWVudUl0ZW1zKGNhLGxhLmJvdHRvbSxsYS5sZWZ0LGJhKX0pLFkuZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkW2JhXT0hMCl9fXZhciBMPXRoaXM7bnVsbCE9SyYmKHRoaXMuc2xpY2luZ1NwZWM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShLKSkpO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJTbGljaW5nIGNvbnRyb2wgcmVuZGVyaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBzbGljaW5nIHNwZWMuIik7dmFyIFI9dGhpcy5zbGljaW5nU3BlYy5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKGJhKXtyZXR1cm4gYmEuZGltfSksVT10aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZnVuY3Rpb24oYmEpe3JldHVybiBiYS5pbmRleH0pLFk9dGhpcztmb3IoSz0wO0s8dGhpcy5yYW5rOysrSylNKEspfTtILnByb3RvdHlwZS5yZW5kZXJEcm9wZG93bk1lbnVJdGVtcz0KZnVuY3Rpb24oSyxNLEwsUil7ZnVuY3Rpb24gVShmYSl7aWYoLTE9PT1iYS5pbmRleE9mKGZhKXx8Uj09PW1hLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzFdJiZmYTw9bWEuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF18fFI9PW1hLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdJiZmYT49bWEuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV0pcmV0dXJuImNvbnRpbnVlIjt2YXIgZGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZGEuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtIik7ZGEudGV4dENvbnRlbnQ9IlN3YXAgd2l0aCBkaW1lbnNpb24gIitmYTtLLmFwcGVuZENoaWxkKGRhKTtkYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixmdW5jdGlvbigpe2RhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUiKTtZLmRpbUNvbnRyb2xzW2ZhXS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1oaWdobGlnaHRlZCIpfSk7CmRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLGZ1bmN0aW9uKCl7ZGEuY2xhc3NMaXN0LnJlbW92ZSgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSIpO1kuZGltQ29udHJvbHNbZmFdLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtZGltLWhpZ2hsaWdodGVkIil9KTt2YXIgbGE9bWEuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF09PT1SO2RhLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe2lmKG51bGw9PT1ZLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJEaW1lbnNpb24gc3dhcHBpbmcgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIHNsaWNpbmcgc3BlYyIpO3ZhciBaPWJhLmluZGV4T2YoZmEpO1kuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbbGE/MDoxXT1mYTtZLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1taXT17ZGltOlIsaW5kZXg6MH07WS5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlPW51bGw7WS5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2U9Cm51bGw7aWYoWS5vblNsaWNpbmdTcGVjQ2hhbmdlKVkub25TbGljaW5nU3BlY0NoYW5nZShZLnNsaWNpbmdTcGVjKX0pfXZhciBZPXRoaXM7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMpdGhyb3cgRXJyb3IoIlNsaWNpbmcgY29udHJvbCBjYW5ub3QgcmVuZGVyIGRyb3Bkb3duIG1lbnUgaXRlbXMgZHVlIHRvIG1pc3Npbmcgc2xpY2luZyBzcGVjLiIpO3RoaXMuY2xlYXJBbGxEcm9wZG93bnMoKTtmb3IodmFyIGJhPXRoaXMuc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLm1hcChmdW5jdGlvbihmYSl7cmV0dXJuIGZhLmRpbX0pLG1hPXRoaXMsYWE9MDthYTx0aGlzLnJhbms7KythYSlVKGFhKTtLLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLGZ1bmN0aW9uKCl7Sy5zdHlsZS5kaXNwbGF5PSJub25lIn0pO2lmKEsuZmlyc3RDaGlsZCl7Sy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO0suc3R5bGUudG9wPU0rInB4IjtLLnN0eWxlLmxlZnQ9TCsicHgiO0suc3R5bGUuZGlzcGxheT0KImJsb2NrIjthYT1LLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciBjYT1hYS5sZWZ0LUw7Sy5zdHlsZS50b3A9KE0tKGFhLnRvcC1NKSkudG9GaXhlZCgxKSsicHgiO0suc3R5bGUubGVmdD0oTC1jYSkudG9GaXhlZCgxKSsicHgifX07SC5wcm90b3R5cGUuc2V0U2xpY2luZ1NwZWM9ZnVuY3Rpb24oSyl7dGhpcy5zbGljaW5nU3BlYz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEspKTtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYyl0aHJvdyBFcnJvcigiQ2Fubm90IHNldCBzbGljaW5nIHNwZWMgdG8gbnVsbC4iKTt0aGlzLnJlbmRlcih0aGlzLnNsaWNpbmdTcGVjKX07SC5wcm90b3R5cGUuY2xlYXJBbGxEcm9wZG93bnM9ZnVuY3Rpb24oKXt0aGlzLmRyb3Bkb3ducy5mb3JFYWNoKGZ1bmN0aW9uKEspe2lmKG51bGwhPUspe2Zvcig7Sy5maXJzdENoaWxkOylLLnJlbW92ZUNoaWxkKEsuZmlyc3RDaGlsZCk7Sy5zdHlsZS5kaXNwbGF5PSJub25lIn19KX07cmV0dXJuIEh9KCksCkQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBIKEspe3RoaXMuY29uZmlnPUs7aWYoIWlzRmluaXRlKEsubWluKSl0aHJvdyBFcnJvcigibWluIHZhbHVlICgiK0subWluKyIpIGlzIG5vdCBmaW5pdGUiKTtpZighaXNGaW5pdGUoSy5tYXgpKXRocm93IEVycm9yKCJtYXggdmFsdWUgKCIrSy5tYXgrIikgaXMgbm90IGZpbml0ZSIpO2lmKEsubWF4PEsubWluKXRocm93IEVycm9yKCJtYXggKCIrSy5tYXgrIikgaXMgXHgzYyBtaW4gKCIrSy5taW4rIikiKTt9SC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKEssTSl7aWYodGhpcy5jb25maWcubWluIT09dGhpcy5jb25maWcubWF4KXt2YXIgTD1LLmdldENvbnRleHQoIjJkIik7aWYobnVsbCE9TCl7Zm9yKHZhciBSPUsud2lkdGgvMTAwLFU9Sy5oZWlnaHQsWT0uNipVLGJhPTA7MTAwPmJhOysrYmEpe3ZhciBtYT1SKmJhLGFhPS4yKlUsY2E9anAodGhpcy5nZXRSR0IoYmEvMTAwKih0aGlzLmNvbmZpZy5tYXgtdGhpcy5jb25maWcubWluKSt0aGlzLmNvbmZpZy5taW4pLAozKSxmYT1jYVswXSxkYT1jYVsxXTtjYT1jYVsyXTtMLmJlZ2luUGF0aCgpO0wuZmlsbFN0eWxlPSJyZ2JhKCIrZmErIiwgIitkYSsiLCAiK2NhKyIsIDEpIjtMLmZpbGxSZWN0KG1hLGFhLFIsWSk7TC5zdHJva2UoKX1udWxsIT1NJiZNPj10aGlzLmNvbmZpZy5taW4mJk08PXRoaXMuY29uZmlnLm1heCYmKEs9KE0tdGhpcy5jb25maWcubWluKS8odGhpcy5jb25maWcubWF4LXRoaXMuY29uZmlnLm1pbikqSy53aWR0aCxMLmJlZ2luUGF0aCgpLEwuZmlsbFN0eWxlPSJyZ2JhKDAsIDAsIDAsIDEpIixMLm1vdmVUbyhLLC4yKlUpLEwubGluZVRvKEstNCwwKSxMLmxpbmVUbyhLKzQsMCksTC5maWxsKCksTC5iZWdpblBhdGgoKSxMLm1vdmVUbyhLLC44KlUpLEwubGluZVRvKEstNCxVKSxMLmxpbmVUbyhLKzQsVSksTC5maWxsKCkpfX19O3JldHVybiBIfSgpLEI9ZnVuY3Rpb24oSCl7ZnVuY3Rpb24gSygpe3JldHVybiBudWxsIT09SCYmSC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9CmhwKEssSCk7Sy5wcm90b3R5cGUuZ2V0UkdCPWZ1bmN0aW9uKE0pe2lmKGlzTmFOKE0pKXJldHVyblsyNTUsMCwwXTtpZighaXNGaW5pdGUoTSkpcmV0dXJuIDA8TT9bMCwwLDI1NV06WzI1NSwxMjcuNSwwXTtNPXRoaXMuY29uZmlnLm1pbj09PXRoaXMuY29uZmlnLm1heD8uNTooTS10aGlzLmNvbmZpZy5taW4pLyh0aGlzLmNvbmZpZy5tYXgtdGhpcy5jb25maWcubWluKTtNPU1hdGgubWF4KE1hdGgubWluKE0sMSksMCk7cmV0dXJuWzI1NSpNLDI1NSpNLDI1NSpNXX07cmV0dXJuIEt9KEQpO0Q9ZnVuY3Rpb24oSCl7ZnVuY3Rpb24gSygpe3JldHVybiBudWxsIT09SCYmSC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9aHAoSyxIKTtLLnByb3RvdHlwZS5nZXRSR0I9ZnVuY3Rpb24oTSl7aWYoaXNOYU4oTSkpcmV0dXJuWzYzLjc1LDYzLjc1LDYzLjc1XTtpZighaXNGaW5pdGUoTSkpcmV0dXJuIDA+TT9bMTI3LjUsMTI3LjUsMTI3LjVdOlsxOTEuMjUsMTkxLjI1LDE5MS4yNV07dmFyIEw9CjAsUj0wLFU9MDtNPXRoaXMuY29uZmlnLm1pbj09PXRoaXMuY29uZmlnLm1heD8uNTooTS10aGlzLmNvbmZpZy5taW4pLyh0aGlzLmNvbmZpZy5tYXgtdGhpcy5jb25maWcubWluKTtNPU1hdGgubWF4KE1hdGgubWluKE0sMSksMCk7LjM1Pj1NPyhSPU0vLjM1LFU9MSk6LjM1PE0mJi42NT49TT8oTD0oTS0uMzUpLyguNjUtLjM1KSxSPTEsVT0oLjY1LU0pLyguNjUtLjM1KSk6LjY1PE0mJihMPTEsUj0oMS1NKS8uMzUpO3JldHVyblsyNTUqTCwyNTUqUiwyNTUqVV19O3JldHVybiBLfShEKTt2YXIgSTsoZnVuY3Rpb24oSCl7SFtILlRFWFQ9MV09IlRFWFQiO0hbSC5JTUFHRT0yXT0iSU1BR0UifSkoSXx8KEk9e30pKTt2YXIgTz17R3JheXNjYWxlOkIsSmV0OkR9LFA9ZnVuY3Rpb24oKXtmdW5jdGlvbiBIKEssTSxMKXt0aGlzLnJvb3RFbGVtZW50PUs7dGhpcy50ZW5zb3JWaWV3PU07dGhpcy5iYXNlUnVsZXJUaWNrPXRoaXMudG9wUnVsZXI9dGhpcy52YWx1ZVNlY3Rpb249dGhpcy5zbGljaW5nU3BlY1Jvb3Q9CnRoaXMubWVudVRodW1iPXRoaXMuaW5mb1N1YnNlY3Rpb249dGhpcy5oZWFkZXJTZWN0aW9uPW51bGw7dGhpcy50b3BSdWxlclRpY2tzPVtdO3RoaXMubGVmdFJ1bGVyVGlja3M9W107dGhpcy52YWx1ZVJvd3M9W107dGhpcy52YWx1ZURpdnM9W107dGhpcy5zbGljaW5nQ29udHJvbD10aGlzLnZhbHVlVG9vbHRpcD1udWxsO3RoaXMuY29sc0N1dG9mZj10aGlzLnJvd3NDdXRvZmY9ITE7dGhpcy5tZW51PXRoaXMubWVudUNvbmZpZz10aGlzLnNlbGVjdGlvbj1udWxsO3RoaXMuY29sb3JNYXBOYW1lPSJHcmF5c2NhbGUiO3RoaXMuY29sb3JNYXA9bnVsbDt0aGlzLnNob3dJbmRpY2VzT25UaWNrcz0hMTt0aGlzLmltYWdlQ2VsbFNpemU9MTY7dGhpcy5taW5JbWFnZUNlbGxTaXplPTQ7dGhpcy5tYXhJbWFnZUNlbGxTaXplPTQwO3RoaXMuem9vbVN0ZXBSYXRpbz0xLjI7dGhpcy5udW1lcmljU3VtbWFyeT1udWxsO3RoaXMub3B0aW9ucz1MfHx7fTt0aGlzLnNsaWNpbmdTcGVjPW4odGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGUpOwp0aGlzLnJhbms9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGUubGVuZ3RoO3RoaXMudmFsdWVSZW5kZXJNb2RlPUkuVEVYVH1ILnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gYSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gaXAodGhpcyxmdW5jdGlvbihLKXtzd2l0Y2goSy5sYWJlbCl7Y2FzZSAwOnRoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldCIpO3RoaXMucmVuZGVySGVhZGVyKCk7aWYoIShjKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKXx8ZCh0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSl8fGYodGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUpfHxnKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKSkpdGhyb3cgRXJyb3IoIlJlbmRlcmluZyBkdHlwZSAiK3RoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKyIgaXMgbm90IHN1cHBvcnRlZCB5ZXQuIik7cmV0dXJuWzQsdGhpcy5yZW5kZXJWYWx1ZXMoKV07CmNhc2UgMTpyZXR1cm4gSy5zZW50KCksWzJdfX0pfSl9O0gucHJvdG90eXBlLnJlbmRlckhlYWRlcj1mdW5jdGlvbigpe251bGw9PXRoaXMuaGVhZGVyU2VjdGlvbiYmKHRoaXMuaGVhZGVyU2VjdGlvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmhlYWRlclNlY3Rpb24uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1oZWFkZXIiKSx0aGlzLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaGVhZGVyU2VjdGlvbiksdGhpcy5jcmVhdGVNZW51KCkpO3RoaXMucmVuZGVySW5mbygpfTtILnByb3RvdHlwZS5yZW5kZXJJbmZvPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuaGVhZGVyU2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIHRlbnNvciBpbmZvIGZhaWxlZCBkdWUgdG8gbWlzaW5nIGhlYWRlciBzZWN0aW9uIik7bnVsbD09dGhpcy5pbmZvU3Vic2VjdGlvbiYmKHRoaXMuaW5mb1N1YnNlY3Rpb249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksCnRoaXMuaW5mb1N1YnNlY3Rpb24uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1pbmZvIiksdGhpcy5oZWFkZXJTZWN0aW9uLmFwcGVuZENoaWxkKHRoaXMuaW5mb1N1YnNlY3Rpb24pKTtmb3IoO3RoaXMuaW5mb1N1YnNlY3Rpb24uZmlyc3RDaGlsZDspdGhpcy5pbmZvU3Vic2VjdGlvbi5yZW1vdmVDaGlsZCh0aGlzLmluZm9TdWJzZWN0aW9uLmZpcnN0Q2hpbGQpO3RoaXMucmVuZGVyTmFtZSgpO3RoaXMucmVuZGVyRFR5cGUoKTt0aGlzLnJlbmRlclNoYXBlKCl9O0gucHJvdG90eXBlLnJlbmRlck5hbWU9ZnVuY3Rpb24oKXtpZihudWxsPT10aGlzLmluZm9TdWJzZWN0aW9uKXRocm93IEVycm9yKCJSZW5kZXJpbmcgdGVuc29yIG5hbWUgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIGluZm8gc3Vic2VjdGlvbi4iKTtpZihudWxsIT10aGlzLm9wdGlvbnMubmFtZSYmMCE9PXRoaXMub3B0aW9ucy5uYW1lLmxlbmd0aCl7dmFyIEs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Sy5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXRlbnNvci1uYW1lIik7CksudGV4dENvbnRlbnQ9cSh0aGlzLm9wdGlvbnMubmFtZSk7Sy50aXRsZT10aGlzLm9wdGlvbnMubmFtZTt0aGlzLmluZm9TdWJzZWN0aW9uLmFwcGVuZENoaWxkKEspfX07SC5wcm90b3R5cGUucmVuZGVyRFR5cGU9ZnVuY3Rpb24oKXtpZihudWxsPT10aGlzLmluZm9TdWJzZWN0aW9uKXRocm93IEVycm9yKCJSZW5kZXJpbmcgdGVuc29yIGR0eXBlIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBpbmZvIHN1YnNlY3Rpb24uIik7dmFyIEs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Sy5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWR0eXBlIik7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO00uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kdHlwZS1sYWJlbCIpO00udGV4dENvbnRlbnQ9ImR0eXBlOiI7Sy5hcHBlbmRDaGlsZChNKTtNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtNLnRleHRDb250ZW50PXRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlOwpLLmFwcGVuZENoaWxkKE0pO3RoaXMuaW5mb1N1YnNlY3Rpb24uYXBwZW5kQ2hpbGQoSyl9O0gucHJvdG90eXBlLnJlbmRlclNoYXBlPWZ1bmN0aW9uKCl7aWYobnVsbD09dGhpcy5pbmZvU3Vic2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIHRlbnNvciBzaGFwZSBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgaW5mbyBzdWJzZWN0aW9uLiIpO3ZhciBLPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0suY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1zaGFwZSIpO3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO00uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1zaGFwZS1sYWJlbCIpO00udGV4dENvbnRlbnQ9InNoYXBlOiI7Sy5hcHBlbmRDaGlsZChNKTtNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO00uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1zaGFwZS12YWx1ZSIpO00udGV4dENvbnRlbnQ9ayh0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZSk7CksuYXBwZW5kQ2hpbGQoTSk7dGhpcy5pbmZvU3Vic2VjdGlvbi5hcHBlbmRDaGlsZChLKX07SC5wcm90b3R5cGUuY3JlYXRlTWVudT1mdW5jdGlvbigpe3ZhciBLPXRoaXM7dGhpcy5tZW51Q29uZmlnPXtpdGVtczpbXX07aWYoZCh0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSl8fGModGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUpfHxmKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKSl0aGlzLm1lbnVDb25maWcuaXRlbXMucHVzaCh7Y2FwdGlvbjoiU2VsZWN0IGRpc3BsYXkgbW9kZS4uLiIsb3B0aW9uczpbIlRleHQiLCJJbWFnZSJdLGRlZmF1bHRTZWxlY3Rpb246MCxjYWxsYmFjazpmdW5jdGlvbihNKXswPT09TT8oSy52YWx1ZVJlbmRlck1vZGU9SS5URVhULEsucmVuZGVyVmFsdWVzKCkpOihLLnZhbHVlUmVuZGVyTW9kZT1JLklNQUdFLEsudGVuc29yVmlldy5nZXROdW1lcmljU3VtbWFyeSgpLnRoZW4oZnVuY3Rpb24oTCl7Sy5udW1lcmljU3VtbWFyeT1MO0sucmVuZGVyVmFsdWVzKCl9KSl9fSksCnRoaXMubWVudUNvbmZpZy5pdGVtcy5wdXNoKHtjYXB0aW9uOiJTZWxlY3QgY29sb3IgbWFwLi4uIixvcHRpb25zOk9iamVjdC5rZXlzKE8pLGRlZmF1bHRTZWxlY3Rpb246MCxjYWxsYmFjazpmdW5jdGlvbihNKXtLLmNvbG9yTWFwTmFtZT1PYmplY3Qua2V5cyhPKVtNXTtLLnJlbmRlclZhbHVlcygpfSxpc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gSy52YWx1ZVJlbmRlck1vZGU9PT1JLklNQUdFfX0pLHRoaXMubWVudUNvbmZpZy5pdGVtcy5wdXNoKHtjYXB0aW9uOiJab29tIGluIChJbWFnZSBtb2RlKSIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtLLnpvb21Jbk9uZVN0ZXBBbmRSZW5kZXJWYWx1ZXMoKX0saXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIEsudmFsdWVSZW5kZXJNb2RlPT09SS5JTUFHRX19KSx0aGlzLm1lbnVDb25maWcuaXRlbXMucHVzaCh7Y2FwdGlvbjoiWm9vbSBvdXQgKEltYWdlIG1vZGUpIixjYWxsYmFjazpmdW5jdGlvbigpe0suem9vbU91dE9uZVN0ZXBBbmRSZW5kZXJWYWx1ZXMoKX0sCmlzRW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiBLLnZhbHVlUmVuZGVyTW9kZT09PUkuSU1BR0V9fSk7bnVsbCE9PXRoaXMubWVudUNvbmZpZyYmMDx0aGlzLm1lbnVDb25maWcuaXRlbXMubGVuZ3RoJiYodGhpcy5tZW51PW5ldyB6KHRoaXMubWVudUNvbmZpZyx0aGlzLmhlYWRlclNlY3Rpb24pLHRoaXMucmVuZGVyTWVudVRodW1iKCkpfTtILnByb3RvdHlwZS56b29tSW5PbmVTdGVwQW5kUmVuZGVyVmFsdWVzPWZ1bmN0aW9uKCl7dGhpcy5pbWFnZUNlbGxTaXplKnRoaXMuem9vbVN0ZXBSYXRpbzw9dGhpcy5tYXhJbWFnZUNlbGxTaXplJiYodGhpcy5pbWFnZUNlbGxTaXplKj10aGlzLnpvb21TdGVwUmF0aW8sdGhpcy5yZW5kZXJWYWx1ZXMoKSl9O0gucHJvdG90eXBlLnpvb21PdXRPbmVTdGVwQW5kUmVuZGVyVmFsdWVzPWZ1bmN0aW9uKCl7dGhpcy5pbWFnZUNlbGxTaXplL3RoaXMuem9vbVN0ZXBSYXRpbz49dGhpcy5taW5JbWFnZUNlbGxTaXplJiYodGhpcy5pbWFnZUNlbGxTaXplLz0KdGhpcy56b29tU3RlcFJhdGlvLHRoaXMucmVuZGVyVmFsdWVzKCkpfTtILnByb3RvdHlwZS5yZW5kZXJNZW51VGh1bWI9ZnVuY3Rpb24oKXt2YXIgSz10aGlzO2lmKG51bGw9PXRoaXMuaGVhZGVyU2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIG1lbnUgdGh1bWIgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIGhlYWRlciBzZWN0aW9uLiIpO3RoaXMubWVudVRodW1iPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMubWVudVRodW1iLnRleHRDb250ZW50PSJcdTIyZWUiO3RoaXMubWVudVRodW1iLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtbWVudS10aHVtYiIpO3RoaXMuaGVhZGVyU2VjdGlvbi5hcHBlbmRDaGlsZCh0aGlzLm1lbnVUaHVtYik7dGhpcy5tZW51VGh1bWIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7aWYobnVsbCE9PUsubWVudSlpZihLLm1lbnUuc2hvd24oKSlLLm1lbnUuaGlkZSgpO2Vsc2V7dmFyIE09Sy5tZW51VGh1bWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CksubWVudS5zaG93KE0uYm90dG9tLE0ubGVmdCl9fSl9O0gucHJvdG90eXBlLnJlbmRlclZhbHVlcz1mdW5jdGlvbigpe3JldHVybiBhKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBLPXRoaXM7cmV0dXJuIGlwKHRoaXMsZnVuY3Rpb24oTSl7c3dpdGNoKE0ubGFiZWwpe2Nhc2UgMDpyZXR1cm4gMjx0aGlzLnJhbmsmJm51bGw9PT10aGlzLnNsaWNpbmdTcGVjUm9vdCYmKHRoaXMuc2xpY2luZ1NwZWNSb290PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuc2xpY2luZ1NwZWNSb290LmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtc2xpY2luZy1ncm91cCIpLHRoaXMucm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zbGljaW5nU3BlY1Jvb3QpKSxudWxsPT10aGlzLnZhbHVlU2VjdGlvbiYmKHRoaXMudmFsdWVTZWN0aW9uPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMudmFsdWVTZWN0aW9uLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtc2VjdGlvbiIpLAp0aGlzLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudmFsdWVTZWN0aW9uKSx0aGlzLnZhbHVlU2VjdGlvbi5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsZnVuY3Rpb24oTCl7cmV0dXJuIGEoSyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIFI7cmV0dXJuIGlwKHRoaXMsZnVuY3Rpb24oVSl7c3dpdGNoKFUubGFiZWwpe2Nhc2UgMDpSPSExO251bGw9PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXl8fCJjdHJsIj09PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXk/Uj1MLmN0cmxLZXk6ImFsdCI9PT10aGlzLm9wdGlvbnMud2hlZWxab29tS2V5P1I9TC5hbHRLZXk6InNoaWZ0Ij09PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXkmJihSPUwuc2hpZnRLZXkpO2lmKFImJnRoaXMudmFsdWVSZW5kZXJNb2RlPT09SS5JTUFHRSlyZXR1cm4gTC5zdG9wUHJvcGFnYXRpb24oKSxMLnByZXZlbnREZWZhdWx0KCksMDxMLmRlbHRhWT90aGlzLnpvb21PdXRPbmVTdGVwQW5kUmVuZGVyVmFsdWVzKCk6CnRoaXMuem9vbUluT25lU3RlcEFuZFJlbmRlclZhbHVlcygpLFsyXTtpZihudWxsPT10aGlzLnNlbGVjdGlvbilyZXR1cm5bMl07TC5zdG9wUHJvcGFnYXRpb24oKTtMLnByZXZlbnREZWZhdWx0KCk7dGhpcy5oaWRlVmFsdWVUb29sdGlwKCk7cmV0dXJuWzQsdGhpcy5zY3JvbGxVcE9yRG93bigwPEwuZGVsdGFZP3guRE9XTjp4LlVQKV07Y2FzZSAxOnJldHVybiBVLnNlbnQoKSxbMl19fSl9KX0pLHRoaXMudmFsdWVTZWN0aW9uLnRhYkluZGV4PTEwMjQsdGhpcy52YWx1ZVNlY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oTCl7dmFyIFI9WzM4LDQwLDM3LDM5XTtpZihudWxsIT1LLnNlbGVjdGlvbiYmLTEhPT1SLmluZGV4T2YoTC5rZXlDb2RlKSl7TC5zdG9wUHJvcGFnYXRpb24oKTtMLnByZXZlbnREZWZhdWx0KCk7Sy5oaWRlVmFsdWVUb29sdGlwKCk7dmFyIFU9Uj1udWxsOzM4PT09TC5rZXlDb2RlP1U9eC5VUDo0MD09PUwua2V5Q29kZT9VPXguRE9XTjoKMzc9PT1MLmtleUNvZGU/VT14LkxFRlQ6Mzk9PT1MLmtleUNvZGUmJihVPXguUklHSFQpO251bGwhPT1VJiYoUj1LLnNlbGVjdGlvbi5tb3ZlKFUsSy5zbGljaW5nU3BlYykpO251bGw9PT1SP0sucmVuZGVyU2VsZWN0aW9uKCk6Uj09PXguVVB8fFI9PT14LkRPV04/Sy5zY3JvbGxVcE9yRG93bihSKTooUj09PXguTEVGVHx8Uj09PXguUklHSFQpJiZLLnNjcm9sbExlZnRPclJpZ2h0KFIpfX0pKSx0aGlzLmNsZWFyVmFsdWVTZWN0aW9uKCksdGhpcy5jcmVhdGVUb3BSdWxlcigpLHRoaXMuY3JlYXRlTGVmdFJ1bGVyKCksdGhpcy5jcmVhdGVWYWx1ZURpdnMoKSxbNCx0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpXTtjYXNlIDE6cmV0dXJuIE0uc2VudCgpLDI8dGhpcy5yYW5rJiYodGhpcy5zbGljaW5nQ29udHJvbD1uZXcgRih0aGlzLnNsaWNpbmdTcGVjUm9vdCx0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZSxmdW5jdGlvbihMKXtyZXR1cm4gYShLLHZvaWQgMCx2b2lkIDAsCmZ1bmN0aW9uKCl7cmV0dXJuIGlwKHRoaXMsZnVuY3Rpb24oUil7c3dpdGNoKFIubGFiZWwpe2Nhc2UgMDppZihwKHRoaXMuc2xpY2luZ1NwZWMsTCkpcmV0dXJuWzMsMl07dGhpcy5zbGljaW5nU3BlYz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEwpKTtyZXR1cm5bNCx0aGlzLnJlbmRlcigpXTtjYXNlIDE6cmV0dXJuIFIuc2VudCgpLFszLDRdO2Nhc2UgMjpyZXR1cm4gdGhpcy5zbGljaW5nU3BlYz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEwpKSxbNCx0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpXTtjYXNlIDM6Ui5zZW50KCksUi5sYWJlbD00O2Nhc2UgNDpyZXR1cm5bMl19fSl9KX0pLHRoaXMuc2xpY2luZ0NvbnRyb2wucmVuZGVyKHRoaXMuc2xpY2luZ1NwZWMpKSxbMl19fSl9KX07SC5wcm90b3R5cGUuY2xlYXJWYWx1ZVNlY3Rpb249ZnVuY3Rpb24oKXtpZihudWxsIT09dGhpcy52YWx1ZVNlY3Rpb24pe2Zvcig7dGhpcy52YWx1ZVNlY3Rpb24uZmlyc3RDaGlsZDspdGhpcy52YWx1ZVNlY3Rpb24ucmVtb3ZlQ2hpbGQodGhpcy52YWx1ZVNlY3Rpb24uZmlyc3RDaGlsZCk7CnRoaXMudG9wUnVsZXI9bnVsbDt0aGlzLnZhbHVlUm93cz1bXX19O0gucHJvdG90eXBlLmNyZWF0ZVRvcFJ1bGVyPWZ1bmN0aW9uKCl7dmFyIEs9dGhpcztpZihudWxsPT09dGhpcy52YWx1ZVNlY3Rpb24pdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgdG9wIHJ1bGVyIGR1ZSB0byBtaXNzaW5nIHZhbHVlIHNlY3Rpb24uIik7bnVsbD09dGhpcy50b3BSdWxlciYmKHRoaXMudG9wUnVsZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy50b3BSdWxlci5jbGFzc0xpc3QuYWRkKCJ0ZW5lc29yLXdpZGdldC10b3AtcnVsZXIiKSx0aGlzLnRvcFJ1bGVyLnN0eWxlLndoaXRlU3BhY2U9Im5vd3JhcCIsdGhpcy52YWx1ZVNlY3Rpb24uYXBwZW5kQ2hpbGQodGhpcy50b3BSdWxlciksdGhpcy50b3BSdWxlclRpY2tzPVtdLHRoaXMudG9wUnVsZXIuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLGZ1bmN0aW9uKFkpe3JldHVybiBhKEssdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBpcCh0aGlzLApmdW5jdGlvbihiYSl7c3dpdGNoKGJhLmxhYmVsKXtjYXNlIDA6aWYobnVsbD09dGhpcy5zZWxlY3Rpb24pcmV0dXJuWzJdO1kuc3RvcFByb3BhZ2F0aW9uKCk7WS5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuaGlkZVZhbHVlVG9vbHRpcCgpO3JldHVybls0LHRoaXMuc2Nyb2xsTGVmdE9yUmlnaHQoMDxZLmRlbHRhWT94LlJJR0hUOnguTEVGVCldO2Nhc2UgMTpyZXR1cm4gYmEuc2VudCgpLFsyXX19KX0pfSkpO2Zvcig7dGhpcy50b3BSdWxlci5maXJzdENoaWxkOyl0aGlzLnRvcFJ1bGVyLnJlbW92ZUNoaWxkKHRoaXMudG9wUnVsZXIuZmlyc3RDaGlsZCk7dGhpcy5iYXNlUnVsZXJUaWNrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuYmFzZVJ1bGVyVGljay5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXRvcC1ydWxlci10aWNrIik7dGhpcy50b3BSdWxlci5hcHBlbmRDaGlsZCh0aGlzLmJhc2VSdWxlclRpY2spOzI8PXRoaXMucmFuayYmKHRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlPQpbMCxudWxsXSk7dmFyIE09MT49dGhpcy5yYW5rPzE6dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV07dmFyIEw9dGhpcy5yb290RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodDt0aGlzLmNvbHNDdXRvZmY9ITE7Zm9yKHZhciBSPTA7UjxNOysrUil7dmFyIFU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7VS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXRvcC1ydWxlci10aWNrIik7dGhpcy52YWx1ZVJlbmRlck1vZGU9PT1JLklNQUdFJiYoVS5zdHlsZS53aWR0aD10aGlzLmltYWdlQ2VsbFNpemUrInB4Iik7dGhpcy50b3BSdWxlci5hcHBlbmRDaGlsZChVKTt0aGlzLnRvcFJ1bGVyVGlja3MucHVzaChVKTtpZihVLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0Pj1MKXtpZigyPD10aGlzLnJhbmspe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyBob3Jpem9udGFsIHJhbmdlIGZvciAiKwp0aGlzLnJhbmsrIkQgdGVuc29yLiIpO3RoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdPVIrMTt0aGlzLmNvbHNDdXRvZmY9ITB9YnJlYWt9fWlmKCF0aGlzLmNvbHNDdXRvZmYmJjI8PXRoaXMucmFuayl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIGhvcml6b250YWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVsxXT1NfX07SC5wcm90b3R5cGUuY3JlYXRlTGVmdFJ1bGVyPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMudmFsdWVTZWN0aW9uKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGxlZnQgcnVsZXIgZHVlIHRvIG1pc3NpbmcgdmFsdWUgc2VjdGlvbi4iKTt0aGlzLnZhbHVlUm93cz1bXTt0aGlzLmxlZnRSdWxlclRpY2tzPVtdOzE8PXRoaXMucmFuayYmKHRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZT0KWzAsbnVsbF0pO3ZhciBLPTA9PT10aGlzLnJhbms/MTp0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXTt0aGlzLnJvd3NDdXRvZmY9ITE7Zm9yKHZhciBNPXRoaXMucm9vdEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tLEw9MDtMPEs7KytMKXt2YXIgUj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtSLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtcm93Iik7dGhpcy52YWx1ZVJlbmRlck1vZGU9PT1JLklNQUdFJiYoUi5zdHlsZS5oZWlnaHQ9dGhpcy5pbWFnZUNlbGxTaXplKyJweCIsUi5zdHlsZS5saW5lSGVpZ2h0PXRoaXMuaW1hZ2VDZWxsU2l6ZSsicHgiKTt0aGlzLnZhbHVlU2VjdGlvbi5hcHBlbmRDaGlsZChSKTt0aGlzLnZhbHVlUm93cy5wdXNoKFIpO3ZhciBVPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO1UuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC10b3AtcnVsZXItdGljayIpOwp0aGlzLnZhbHVlUmVuZGVyTW9kZT09PUkuSU1BR0UmJihVLnN0eWxlLmhlaWdodD10aGlzLmltYWdlQ2VsbFNpemUrInB4IixVLnN0eWxlLmxpbmVIZWlnaHQ9dGhpcy5pbWFnZUNlbGxTaXplKyJweCIpO1IuYXBwZW5kQ2hpbGQoVSk7dGhpcy5sZWZ0UnVsZXJUaWNrcy5wdXNoKFUpO2lmKFUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tPj1NKXtpZigxPD10aGlzLnJhbmspe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgdmVydGljYWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV09TCsxO3RoaXMucm93c0N1dG9mZj0hMH1icmVha319aWYoIXRoaXMucm93c0N1dG9mZiYmMTw9dGhpcy5yYW5rKXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIHZlcnRpY2FsIHJhbmdlIGZvciAiKwp0aGlzLnJhbmsrIkQgdGVuc29yLiIpO3RoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVsxXT1LfX07SC5wcm90b3R5cGUuY3JlYXRlVmFsdWVEaXZzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSyhiYSl7ZnVuY3Rpb24gbWEoY2Epe3ZhciBmYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtmYS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdiIpO1UudmFsdWVSZW5kZXJNb2RlPT09SS5JTUFHRSYmKGZhLnN0eWxlLndpZHRoPVUuaW1hZ2VDZWxsU2l6ZSsicHgiLGZhLnN0eWxlLmhlaWdodD1VLmltYWdlQ2VsbFNpemUrInB4IixmYS5zdHlsZS5saW5lSGVpZ2h0PVUuaW1hZ2VDZWxsU2l6ZSsicHgiKTtVLnZhbHVlUm93c1tiYV0uYXBwZW5kQ2hpbGQoZmEpO1UudmFsdWVEaXZzW2JhXS5wdXNoKGZhKTtmYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtNLnNlbGVjdGlvbj1uZXcgQyhNLnRlbnNvclZpZXcuc3BlYy5zaGFwZSxNLnNsaWNpbmdTcGVjLApudWxsPT1NLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2V8fG51bGw9PU0uc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXT8wOk0uc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXStiYSxudWxsPT1NLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZXx8bnVsbD09TS5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF0/MDpNLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXStjYSwxLDEpO00ucmVuZGVyU2VsZWN0aW9uKCl9KTtmYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixmdW5jdGlvbigpe3ZhciBkYT1mYS5nZXRBdHRyaWJ1dGUoImRldGFpbGVkLXZhbHVlIik7aWYobnVsbCE9PWRhKXt2YXIgbGE9TS5yb290RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxaPWZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLEZhPVouYm90dG9tLVoudG9wLHhhPVoucmlnaHQtWi5sZWZ0LHlhPU0uY2FsY3VsYXRlSW5kaWNlcyhiYSxjYSk7TS5kcmF3VmFsdWVUb29sdGlwKHlhLApkYSxaLnRvcC1sYS50b3ArLjgqRmEsWi5sZWZ0LWxhLmxlZnQrLjc1KnhhKX19KTtmYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe00uaGlkZVZhbHVlVG9vbHRpcCgpfSl9VS52YWx1ZURpdnNbYmFdPVtdO2Zvcih2YXIgYWE9MDthYTxMOysrYWEpbWEoYWEpfXZhciBNPXRoaXM7aWYobnVsbD09PXRoaXMudmFsdWVSb3dzKXRocm93IEVycm9yKCJWYWx1ZSByb3dzIGFyZSB1bmV4cGVjdGVkbHkgdW5pbml0aWFsaXplZC4iKTt0aGlzLnZhbHVlRGl2cz1bXTtmb3IodmFyIEw9dGhpcy50b3BSdWxlclRpY2tzLmxlbmd0aCxSPXRoaXMudmFsdWVSb3dzLmxlbmd0aCxVPXRoaXMsWT0wO1k8UjsrK1kpSyhZKX07SC5wcm90b3R5cGUucmVuZGVyVG9wUnVsZXI9ZnVuY3Rpb24oKXtpZigyPD10aGlzLnJhbmspZm9yKHZhciBLPXRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV1dLE09MDtNPHRoaXMudG9wUnVsZXJUaWNrcy5sZW5ndGg7KytNKXtpZihudWxsPT09CnRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIGhvcml6b250YWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt2YXIgTD10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXStNO3RoaXMuc2hvd0luZGljZXNPblRpY2tzJiYodGhpcy50b3BSdWxlclRpY2tzW01dLnRleHRDb250ZW50PUw8Sz8iIitMOiIiKX19O0gucHJvdG90eXBlLnJlbmRlckxlZnRSdWxlcj1mdW5jdGlvbigpe2lmKDE8PXRoaXMucmFuaylmb3IodmFyIEs9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXV0sTT0wO008dGhpcy5sZWZ0UnVsZXJUaWNrcy5sZW5ndGg7KytNKXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIHZlcnRjaWFsIHJhbmdlIGZvciAiK3RoaXMucmFuaysiRCB0ZW5zb3IuIik7dmFyIEw9dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdKwpNO3RoaXMuc2hvd0luZGljZXNPblRpY2tzJiYodGhpcy5sZWZ0UnVsZXJUaWNrc1tNXS50ZXh0Q29udGVudD1MPEs/IiIrTDoiIil9fTtILnByb3RvdHlwZS5yZW5kZXJWYWx1ZURpdnM9ZnVuY3Rpb24oKXtyZXR1cm4gYSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgSyxNLEwsUixVLFksYmEsbWEsYWEsY2EsZmEsZGEsbGEsWixGYSx4YSx5YTtyZXR1cm4gaXAodGhpcyxmdW5jdGlvbihCYSl7c3dpdGNoKEJhLmxhYmVsKXtjYXNlIDA6cmV0dXJuIEs9dGhpcy52YWx1ZURpdnMubGVuZ3RoLE09dGhpcy52YWx1ZURpdnNbMF0ubGVuZ3RoLFs0LHRoaXMudGVuc29yVmlldy52aWV3KHRoaXMuc2xpY2luZ1NwZWMpXTtjYXNlIDE6TD1CYS5zZW50KCk7MD09PXRoaXMucmFuaz9MPVtbTF1dOjE9PT10aGlzLnJhbmsmJihMPUwubWFwKGZ1bmN0aW9uKEdhKXtyZXR1cm5bR2FdfSkpO1I9dGhpcy5nZXRWYWx1ZUNsYXNzKCk7VT10aGlzLnZhbHVlUmVuZGVyTW9kZTtpZihVPT09CkkuSU1BR0Upe2lmKG51bGw9PXRoaXMubnVtZXJpY1N1bW1hcnkpdGhyb3cgRXJyb3IoIkZhaWxlZCB0byByZW5kZXIgaW1hZ2UgcmVwcmVzZW50YXRpb24gb2YgdGVuc29yIGR1ZSB0byBtaXNzaW5nIG51bWVyaWMgc3VtbWFyeSIpO1k9dGhpcy5udW1lcmljU3VtbWFyeTtiYT1ZLm1pbmltdW07bWE9WS5tYXhpbXVtO2lmKG51bGw9PWJhfHxudWxsPT1tYSl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIHJlbmRlciBpbWFnZSByZXByZXNlbnRhdGlvbiBvZiB0ZW5zb3IgZHVlIHRvIG1pc3NpbmcgbWluaW11bSBvciBtYXhpbXVtIHZhbHVlcyBpbiBudW1lcmljIHN1bW1hcnkiKTthYT17bWluOmJhLG1heDptYX07dGhpcy5jb2xvck1hcD10aGlzLmNvbG9yTWFwTmFtZSBpbiBPP25ldyBPW3RoaXMuY29sb3JNYXBOYW1lXShhYSk6bmV3IEIoYWEpfWZvcihjYT0wO2NhPEs7KytjYSlmb3IoZmE9MDtmYTxNOysrZmEpZGE9dGhpcy52YWx1ZURpdnNbY2FdW2ZhXSxjYTxMLmxlbmd0aCYmZmE8TFtjYV0ubGVuZ3RoPwoobGE9TFtjYV1bZmFdLFU9PT1JLklNQUdFPyhaPWpwKHRoaXMuY29sb3JNYXAuZ2V0UkdCKGxhKSwzKSxGYT1aWzBdLHhhPVpbMV0seWE9WlsyXSxkYS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InJnYigiK0ZhKyIsICIreGErIiwgIit5YSsiKSIpOiJudW1lcmljIj09PVI/ZGEudGV4dENvbnRlbnQ9cihsYSxjKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKSk6ImJvb2xlYW4iPT09Uj9kYS50ZXh0Q29udGVudD10KGxhKToic3RyaW5nIj09PVImJihkYS50ZXh0Q29udGVudD12KGxhKSksZGEuc2V0QXR0cmlidXRlKCJkZXRhaWxlZC12YWx1ZSIsdGhpcy5nZXREZXRhaWxlZFZhbHVlVG9vbHRpcFN0cmluZyhsYSkpKTooZGEudGV4dENvbnRlbnQ9IiIsZGEuc2V0QXR0cmlidXRlKCJkZXRhaWxlZC12YWx1ZSIsIiIpKTt0aGlzLnJlbmRlclNlbGVjdGlvbigpO3JldHVyblsyXX19KX0pfTtILnByb3RvdHlwZS5nZXREZXRhaWxlZFZhbHVlVG9vbHRpcFN0cmluZz1mdW5jdGlvbihLKXtyZXR1cm4iYm9vbGVhbiI9PT0KdGhpcy5nZXRWYWx1ZUNsYXNzKCk/dChLLCExKToic3RyaW5nIj09PXRoaXMuZ2V0VmFsdWVDbGFzcygpPyJMZW5ndGgtIitLLmxlbmd0aCsnIHN0cmluZzogIicrdihLLDUwMCkrJyInOlN0cmluZyhLKX07SC5wcm90b3R5cGUucmVuZGVyU2VsZWN0aW9uPWZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5zZWxlY3Rpb24pZm9yKHZhciBLPXRoaXMudmFsdWVEaXZzLmxlbmd0aCxNPXRoaXMudmFsdWVEaXZzWzBdLmxlbmd0aCxMPTA7TDxLOysrTClmb3IodmFyIFI9MDtSPE07KytSKXt2YXIgVT10aGlzLnZhbHVlRGl2c1tMXVtSXTtVLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbiIpO1UuY2xhc3NMaXN0LnJlbW92ZSgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXRvcCIpO1UuY2xhc3NMaXN0LnJlbW92ZSgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWJvdHRvbSIpO1UuY2xhc3NMaXN0LnJlbW92ZSgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWxlZnQiKTsKVS5jbGFzc0xpc3QucmVtb3ZlKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tcmlnaHQiKTt2YXIgWT10aGlzLmNhbGN1bGF0ZUluZGljZXMoTCxSKTtZPXRoaXMuc2VsZWN0aW9uLmdldEVsZW1lbnRTdGF0dXMoWSk7bnVsbCE9PVkmJihVLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbiIpLFkudG9wRWRnZSYmVS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tdG9wIiksWS5ib3R0b21FZGdlJiZVLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1ib3R0b20iKSxZLmxlZnRFZGdlJiZVLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1sZWZ0IiksWS5yaWdodEVkZ2UmJlUuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXJpZ2h0IikpfX07SC5wcm90b3R5cGUuY2FsY3VsYXRlSW5kaWNlcz0KZnVuY3Rpb24oSyxNKXtmb3IodmFyIEw9W10sUj10aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZnVuY3Rpb24obWEpe3JldHVybiBtYS5kaW19KSxVPXRoaXMuc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLm1hcChmdW5jdGlvbihtYSl7cmV0dXJuIG1hLmluZGV4fSksWT0wO1k8dGhpcy5yYW5rOysrWSlpZigtMSE9PVIuaW5kZXhPZihZKSl7dmFyIGJhPVVbUi5pbmRleE9mKFkpXTtpZihudWxsPT09YmEpdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjYWxjdWxhdGUgaW5kaWNlczogVW5kZXRlcm1pbmVkIGluZGV4IGF0IGRpbWVuc2lvbiAiK1kpO0wucHVzaChiYSl9ZWxzZSBpZihZPT09dGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXSl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZXx8bnVsbD09PXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXSl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGNhbGN1bGF0ZSBpbmRpY2VzIGR1ZSB0byB1bmRlcnRlcm1pbmVkIHZlcnRpY2FsIHJhbmdlLiIpOwpMLnB1c2godGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdK0spfWVsc2UgaWYoWT09PXRoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV0pe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZXx8bnVsbD09PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY2FsY3VsYXRlIGluZGljZXMgZHVlIHRvIHVuZGVydGVybWluZWQgdmVydGljYWwgcmFuZ2UuIik7TC5wdXNoKHRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdK00pfXJldHVybiBMfTtILnByb3RvdHlwZS5kcmF3VmFsdWVUb29sdGlwPWZ1bmN0aW9uKEssTSxMLFIpe251bGw9PT10aGlzLnZhbHVlVG9vbHRpcCYmKHRoaXMudmFsdWVUb29sdGlwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMudmFsdWVUb29sdGlwLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcCIpLHRoaXMucm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy52YWx1ZVRvb2x0aXApKTsKZm9yKDt0aGlzLnZhbHVlVG9vbHRpcC5maXJzdENoaWxkOyl0aGlzLnZhbHVlVG9vbHRpcC5yZW1vdmVDaGlsZCh0aGlzLnZhbHVlVG9vbHRpcC5maXJzdENoaWxkKTt2YXIgVT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtVLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC1pbmRpY2VzIik7VS50ZXh0Q29udGVudD0iSW5kaWNlczogIitKU09OLnN0cmluZ2lmeShLKTt0aGlzLnZhbHVlVG9vbHRpcC5hcHBlbmRDaGlsZChVKTtLPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0suY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLXZhbHVlIik7Sy50ZXh0Q29udGVudD1NO3RoaXMudmFsdWVUb29sdGlwLmFwcGVuZENoaWxkKEspO3RoaXMudmFsdWVUb29sdGlwLnN0eWxlLnRvcD1MKyJweCI7dGhpcy52YWx1ZVRvb2x0aXAuc3R5bGUubGVmdD1SKyJweCI7dGhpcy52YWx1ZVRvb2x0aXAuc3R5bGUuZGlzcGxheT0iYmxvY2siOwp0aGlzLnZhbHVlUmVuZGVyTW9kZT09SS5JTUFHRSYmbnVsbCE9dGhpcy5jb2xvck1hcCYmKEw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksTC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLXRvb2x0aXAtY29sb3JiYXIiKSx0aGlzLnZhbHVlVG9vbHRpcC5hcHBlbmRDaGlsZChMKSx0aGlzLmNvbG9yTWFwLnJlbmRlcihMLHBhcnNlRmxvYXQoTSkpKX07SC5wcm90b3R5cGUuaGlkZVZhbHVlVG9vbHRpcD1mdW5jdGlvbigpe251bGwhPXRoaXMudmFsdWVUb29sdGlwJiYodGhpcy52YWx1ZVRvb2x0aXAuc3R5bGUuZGlzcGxheT0ibm9uZSIpfTtILnByb3RvdHlwZS5yZW5kZXJSdWxlcnNBbmRWYWx1ZURpdnM9ZnVuY3Rpb24oKXtyZXR1cm4gYSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gaXAodGhpcyxmdW5jdGlvbihLKXtzd2l0Y2goSy5sYWJlbCl7Y2FzZSAwOnJldHVybiBudWxsIT10aGlzLnNsaWNpbmdDb250cm9sJiZ0aGlzLnNsaWNpbmdDb250cm9sLnNldFNsaWNpbmdTcGVjKHRoaXMuc2xpY2luZ1NwZWMpLAp0aGlzLmNhbGN1bGF0ZVNob3dJbmRpY2VzT25SdWxlclRpY2tzKCksdGhpcy5yZW5kZXJUb3BSdWxlcigpLHRoaXMucmVuZGVyTGVmdFJ1bGVyKCksWzQsdGhpcy5yZW5kZXJWYWx1ZURpdnMoKV07Y2FzZSAxOnJldHVybiBLLnNlbnQoKSxbMl19fSl9KX07SC5wcm90b3R5cGUuY2FsY3VsYXRlU2hvd0luZGljZXNPblJ1bGVyVGlja3M9ZnVuY3Rpb24oKXtpZigyPD10aGlzLnJhbmspe3ZhciBLPXRoaXMudG9wUnVsZXJUaWNrc1swXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLnNob3dJbmRpY2VzT25UaWNrcz1LLnJpZ2h0LUsubGVmdD45Kk1hdGguY2VpbChNYXRoLmxvZyh0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXSkvTWF0aC5MTjEwKX1lbHNlIDE9PT10aGlzLnJhbms/KEs9dGhpcy5sZWZ0UnVsZXJUaWNrc1swXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0aGlzLnNob3dJbmRpY2VzT25UaWNrcz0xNjxLLmJvdHRvbS0KSy50b3ApOnRoaXMuc2hvd0luZGljZXNPblRpY2tzPSExfTtILnByb3RvdHlwZS5zY3JvbGxIb3Jpem9udGFsbHk9ZnVuY3Rpb24oSyl7cmV0dXJuIGEodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIE0sTDtyZXR1cm4gaXAodGhpcyxmdW5jdGlvbihSKXtzd2l0Y2goUi5sYWJlbCl7Y2FzZSAwOmlmKDE+PXRoaXMucmFuaylyZXR1cm5bMl07aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIGhvcml6b250YWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTtNPXRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV1dO2lmKDA+S3x8Sz49TSl0aHJvdyBFcnJvcigiSW5kZXggb3V0IG9mIGJvdW5kOiAiK0srIiBpcyBvdXRzaWRlIFswLCAiK00rIl0pIik7dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF09Szt0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVsxXT0KSyt0aGlzLnRvcFJ1bGVyVGlja3MubGVuZ3RoO0w9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV07dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMV0+TCYmKHRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdPUwpO3JldHVybls0LHRoaXMucmVuZGVyUnVsZXJzQW5kVmFsdWVEaXZzKCldO2Nhc2UgMTpyZXR1cm4gUi5zZW50KCksWzJdfX0pfSl9O0gucHJvdG90eXBlLnNjcm9sbFZlcnRpY2FsbHk9ZnVuY3Rpb24oSyl7cmV0dXJuIGEodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIE0sTDtyZXR1cm4gaXAodGhpcyxmdW5jdGlvbihSKXtzd2l0Y2goUi5sYWJlbCl7Y2FzZSAwOmlmKDA9PT10aGlzLnJhbmspcmV0dXJuWzJdO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgdmVydGljYWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKwoiRCB0ZW5zb3IuIik7aWYobnVsbD09PXRoaXMudmFsdWVSb3dzKXRocm93IEVycm9yKCJWZXJ0aWNhbCBzY3JvbGxpbmcgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIHZhbHVlIHJvd3MuIik7TT10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXTtpZigwPkt8fEs+PU0pdGhyb3cgRXJyb3IoIkluZGV4IG91dCBvZiBib3VuZDogIitLKyIgaXMgb3V0c2lkZSBbMCwgIitNKyJdKSIpO3RoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXT1LO3RoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVsxXT1LK3RoaXMudmFsdWVSb3dzLmxlbmd0aDtMPXRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF1dO3RoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVsxXT5MJiYodGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzFdPUwpO3JldHVybls0LHRoaXMucmVuZGVyUnVsZXJzQW5kVmFsdWVEaXZzKCldOwpjYXNlIDE6cmV0dXJuIFIuc2VudCgpLFsyXX19KX0pfTtILnByb3RvdHlwZS5zY3JvbGxVcE9yRG93bj1mdW5jdGlvbihLKXtyZXR1cm4gYSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgTSxMLFI7cmV0dXJuIGlwKHRoaXMsZnVuY3Rpb24oVSl7c3dpdGNoKFUubGFiZWwpe2Nhc2UgMDppZigwPT09dGhpcy5yYW5rfHwhdGhpcy5yb3dzQ3V0b2ZmKXJldHVyblsyXTtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIHZlcnRpY2FsIHJhbmdlIGZvciAiK3RoaXMucmFuaysiRCB0ZW5zb3IuIik7aWYobnVsbD09PXRoaXMudmFsdWVSb3dzKXRocm93IEVycm9yKCJWZXJ0aWNhbCBzY3JvbGxpbmcgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIHZhbHVlIHJvd3MuIik7TT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF07aWYoSyE9PXguRE9XTilyZXR1cm5bMywzXTtMPXRoaXMudmFsdWVSb3dzLmxlbmd0aC0KMTtSPXRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF1dLUw7cmV0dXJuIE08Uj9bNCx0aGlzLnNjcm9sbFZlcnRpY2FsbHkoTSsxKV06WzMsMl07Y2FzZSAxOlUuc2VudCgpLFUubGFiZWw9MjtjYXNlIDI6cmV0dXJuWzMsNV07Y2FzZSAzOnJldHVybiAwPD1NLTE/WzQsdGhpcy5zY3JvbGxWZXJ0aWNhbGx5KE0tMSldOlszLDVdO2Nhc2UgNDpVLnNlbnQoKSxVLmxhYmVsPTU7Y2FzZSA1OnJldHVyblsyXX19KX0pfTtILnByb3RvdHlwZS5zY3JvbGxMZWZ0T3JSaWdodD1mdW5jdGlvbihLKXtyZXR1cm4gYSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgTSxMLFI7cmV0dXJuIGlwKHRoaXMsZnVuY3Rpb24oVSl7c3dpdGNoKFUubGFiZWwpe2Nhc2UgMDppZigxPj10aGlzLnJhbmt8fCF0aGlzLmNvbHNDdXRvZmYpcmV0dXJuWzJdO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZSl0aHJvdyBFcnJvcigiSG9yaXpvbnRhbCBzY3JvbGxpbmcgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIGhvcml6b250YWwgcmFuZ2UuIik7Ck09dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF07aWYoSyE9PXguUklHSFQpcmV0dXJuWzMsM107TD10aGlzLnRvcFJ1bGVyVGlja3MubGVuZ3RoLTE7Uj10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzFdXS1MO3JldHVybiBNPFI/WzQsdGhpcy5zY3JvbGxIb3Jpem9udGFsbHkoTSsxKV06WzMsMl07Y2FzZSAxOlUuc2VudCgpLFUubGFiZWw9MjtjYXNlIDI6cmV0dXJuWzMsNV07Y2FzZSAzOnJldHVybiAwPD1NLTE/WzQsdGhpcy5zY3JvbGxIb3Jpem9udGFsbHkoTS0xKV06WzMsNV07Y2FzZSA0OlUuc2VudCgpLFUubGFiZWw9NTtjYXNlIDU6cmV0dXJuWzJdfX0pfSl9O0gucHJvdG90eXBlLm5hdmlnYXRlVG9JbmRpY2VzPWZ1bmN0aW9uKCl7cmV0dXJuIGEodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIGlwKHRoaXMsZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigibmF2aWdhdGVUb0luZGljZXMoKSBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LiIpOwp9KX0pfTtILnByb3RvdHlwZS5nZXRWYWx1ZUNsYXNzPWZ1bmN0aW9uKCl7dmFyIEs9dGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGU7cmV0dXJuIGMoSyl8fGQoSyk/Im51bWVyaWMiOmYoSyk/ImJvb2xlYW4iOiJzdHJpbmcifTtyZXR1cm4gSH0oKTtEPU9iamVjdC5mcmVlemUoe3RlbnNvcldpZGdldDpmdW5jdGlvbihILEssTSl7cmV0dXJuIG5ldyBQKEgsSyxNKX0sVkVSU0lPTjoiMC4wLjAifSk7d2luZG93LnRlbnNvcl93aWRnZXQ9RH0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLWRlYnVnZ2VyLWxpbmUtY2hhcnQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZGVidWdnZXItbGluZS1jaGFydCIscHJvcGVydGllczp7ZGF0YTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX2RlZmF1bHRTZXJpZXNOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZToiX19kZWJ1Z2dlcl9kYXRhX18iLHJlYWRvbmx5OiEwfSxfbGluZUNoYXJ0WENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZDp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsdmFsdWU6KCk9PigpPT57Y29uc3QgYT1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXI7cmV0dXJue3NjYWxlOmEsYXhpczpuZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyhhLCJib3R0b20iKSxhY2Nlc3NvcjpjPT5jLnN0ZXB9fX0sX2xpbmVDaGFydFlWYWx1ZUFjY2Vzc29yOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCx2YWx1ZTooKT0+YT0+YS5zY2FsYXJ9LF9saW5lQ2hhcnRUb29sdGlwQ29sdW1uczp7dHlwZTpBcnJheSxyZWFkT25seTohMCx2YWx1ZTooKT0+W3t0aXRsZToiTmFtZSIsZXZhbHVhdGU6YT0+CiJzdGVwXHgzZCIrYS5kYXR1bS5zdGVwKyI7IHNjYWxhclx4M2QgIithLmRhdHVtLnNjYWxhcn1dfSxfbGluZUNoYXJ0U21vb3RoaW5nRW5hYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlYWRPbmx5OiEwfX0sb2JzZXJ2ZXJzOlsicmVuZGVyKGRhdGEpIl0scmVuZGVyKGEpe2lmKG51bGwhPWEpe3ZhciBjPXRoaXMuJCQoInZ6LWxpbmUtY2hhcnQyIik7Yy5zZXRWaXNpYmxlU2VyaWVzKFt0aGlzLl9kZWZhdWx0U2VyaWVzTmFtZV0pO3ZhciBkPVtdLGY9YS54O2E9YS55O2ZvcihsZXQgZz0wO2c8Zi5sZW5ndGg7KytnKWQucHVzaCh7c3RlcDpmW2ddLHNjYWxhcjphW2ddfSk7Yy5zZXRTZXJpZXNEYXRhKHRoaXMuX2RlZmF1bHRTZXJpZXNOYW1lLGQpfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtdGVuc29yLXZhbHVlLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtdGVuc29yLXZhbHVlLXZpZXciLHByb3BlcnRpZXM6e3ZpZXdJZDpTdHJpbmcsdGVuc29yTmFtZTpTdHJpbmcsZGVidWdPcDpTdHJpbmcsZGV2aWNlTmFtZTpTdHJpbmcsbWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZTpTdHJpbmcsc2xpY2luZzpTdHJpbmcsdGltZUluZGljZXM6U3RyaW5nLGR0eXBlOlN0cmluZyxzaGFwZTpBcnJheSxjb250aW51ZVRvQnV0dG9uQ2FsbGJhY2s6T2JqZWN0LGNsb3NlQnV0dG9uQ2FsbGJhY2s6T2JqZWN0LHRlbnNvck5hbWVDYWxsYmFjazpPYmplY3QsdGVuc29yV2lkZ2V0Ok9iamVjdCxnZXRIZWFsdGhQaWxsOkZ1bmN0aW9uLF9pc1RlbnNvclZhbHVlU2NhbGFyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9pc1RlbnNvclZhbHVlTGluZUNoYXJ0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9pc1RlbnNvclZhbHVlSW1hZ2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2RhdGFTY2FsYXI6e3R5cGU6TnVtYmVyLHZhbHVlOm51bGx9LApfbGluZUNoYXJ0RGF0YTp7dHlwZTpBcnJheSx2YWx1ZTpudWxsfSxfZGF0YUltYWdlU3JjOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUW8uUmVxdWVzdE1hbmFnZXIoMTApfX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZVRpbWVJbmRpY2VzVG9nZ2xlKHRpbWVJbmRpY2VzKSJdLHJlbmRlclRlbnNvclZhbHVlKCl7aWYodGhpcy50ZW5zb3JOYW1lKWlmKG51bGw9PXRoaXMuc2xpY2luZyl7dGhpcy5zZXQoIl91c2VUZW5zb3JXaWRnZXQiLCEwKTtjb25zdCBjPXtzcGVjOntkdHlwZTp0aGlzLmR0eXBlLHNoYXBlOnRoaXMuc2hhcGV9LGdldDooKT0+e3Rocm93IEVycm9yKCJ0ZW5zb3JWaWV3LmdldCgpIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuIik7fSx2aWV3OmQ9Pntjb25zdCBmPXRoaXM7cmV0dXJuIEJiKGZ1bmN0aW9uKigpe2NvbnN0IGc9Zi5zaGFwZS5sZW5ndGgsbD1kLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAocD0+CnAuZGltKSxrPWQuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLm1hcChwPT5wLmluZGV4KTtsZXQgbj0iWyI7Zm9yKGxldCBwPTA7cDxnOysrcCktMSE9PWwuaW5kZXhPZihwKT9uKz1gJHtrW2wuaW5kZXhPZihwKV19YDpkLnZpZXdpbmdEaW1zWzBdPT09cD9uKz1gJHtkLnZlcnRpY2FsUmFuZ2VbMF19OiR7ZC52ZXJ0aWNhbFJhbmdlWzFdfWA6ZC52aWV3aW5nRGltc1sxXT09PXAmJihuKz1gJHtkLmhvcml6b250YWxSYW5nZVswXX06JHtkLmhvcml6b250YWxSYW5nZVsxXX1gKSxwPGctMSYmKG4rPSIsIik7bis9Il0iO3JldHVybiBuZXcgUHJvbWlzZSgocCxxKT0+e2NvbnN0IHI9Zi5fZ2V0VGVuc29yRGF0YVVSTCh7d2F0Y2hfa2V5OmYudGVuc29yTmFtZSsiOiIrZi5kZWJ1Z09wLHNsaWNpbmc6bix0aW1lX2luZGljZXM6Zi50aW1lSW5kaWNlcyxtYXBwaW5nOiJub25lIn0pO2YuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QocikudGhlbih0PT57bnVsbD09dC5lcnJvcj9wKHQudGVuc29yX2RhdGFbdC50ZW5zb3JfZGF0YS5sZW5ndGgtCjFdKTpxKHQuZXJyb3IpfSkuY2F0Y2godD0+cSh0KSl9KX0pfSxnZXROdW1lcmljU3VtbWFyeTooKT0+e2NvbnN0IGQ9dGhpcztyZXR1cm4gQmIoZnVuY3Rpb24qKCl7cmV0dXJuIG5ldyBQcm9taXNlKChmLGcpPT57Y29uc3QgbD1kLnRlbnNvck5hbWUrIjoiK2QuZGVidWdPcDtkLmdldEhlYWx0aFBpbGwobCxkLmRldmljZU5hbWUsZC5tYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lLGs9PntudWxsPT1rP2coYEZhaWxlZCB0byBnZXQgaGVhbHRoIHBpbGwgZm9yIHdhdGNoIGtleSAke2x9YCk6Zih7ZWxlbWVudENvdW50OmtbMV0sbWluaW11bTprWzhdLG1heGltdW06a1s5XX0pfSl9KX0pfX07c2V0VGltZW91dCgoKT0+e251bGw9PXRoaXMudGVuc29yV2lkZ2V0JiYodGhpcy50ZW5zb3JXaWRnZXQ9dGVuc29yX3dpZGdldC50ZW5zb3JXaWRnZXQodGhpcy4kJCgiI3RlbnNvci13aWRnZXQiKSxjLHt3aGVlbFpvb21LZXk6ImFsdCJ9KSk7dGhpcy50ZW5zb3JXaWRnZXQucmVuZGVyKCl9LAoxMCl9ZWxzZXt0aGlzLnNldCgiX3VzZVRlbnNvcldpZGdldCIsITEpO3ZhciBhPXRoaXMuX3JhbmtGcm9tU2xpY2luZyh0aGlzLnNsaWNpbmcudHJpbSgpKTtjb25zdCBjPXRoaXMuX2lzVGltZUluZGljZXNTaW5nbGVTdGVwKHRoaXMudGltZUluZGljZXMpO2xldCBkPWE7aWYoIWMpe2lmKDE8YSl7dGhpcy5fc2hvd1RvYXN0KCJIaXN0b3J5IGZvciB0ZW5zb3JzIFx4M2UgMUQgaXMgbm90IHlldCBzdXBwb3J0ZWQuIik7cmV0dXJufWQrPTF9YT10aGlzLl9nZXRUZW5zb3JEYXRhVVJMKHt3YXRjaF9rZXk6dGhpcy50ZW5zb3JOYW1lKyI6Iit0aGlzLmRlYnVnT3Asc2xpY2luZzp0aGlzLnNsaWNpbmcsdGltZV9pbmRpY2VzOnRoaXMudGltZUluZGljZXMsbWFwcGluZzoyPD1kPyJpbWFnZS9wbmciOiJub25lIn0pO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihmPT57dGhpcy4kJCgiI2RlYnVnLW9wIikudGV4dENvbnRlbnQ9dGhpcy5fY2FsY3VsYXRlRGVidWdPcFRvRGlzcGxheSgpOwppZihudWxsIT1mLmVycm9yKXRoaXMuX3Nob3dUb2FzdChmLmVycm9yLnR5cGUrIjogIitmLmVycm9yLm1lc3NhZ2UpO2Vsc2UgaWYoZj1jP2YudGVuc29yX2RhdGFbMF06Zi50ZW5zb3JfZGF0YSwwPT09ZCl0aGlzLl9zZXRWaXN1YWxpemF0aW9uVHlwZSgic2NhbGFyIiksdGhpcy5zZXQoIl9kYXRhU2NhbGFyIixmKTtlbHNlIGlmKDE9PT1kKXt0aGlzLl9zZXRWaXN1YWxpemF0aW9uVHlwZSgibGluZUNoYXJ0Iik7bGV0IGc9e3g6W10seTpmfTtmb3IobGV0IGw9MDtsPGYubGVuZ3RoOysrbClnLngucHVzaChsKzEpO3RoaXMuc2V0KCJfbGluZUNoYXJ0RGF0YSIsZyl9ZWxzZSAyPD1kPyh0aGlzLl9zZXRWaXN1YWxpemF0aW9uVHlwZSgiaW1hZ2UiKSx0aGlzLnNldCgiX2RhdGFJbWFnZVNyYyIsImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwiK2YpKTp0aGlzLl9zaG93VG9hc3QoIlZpc3VhbGl6YXRpb24gb2YgcmFuay0iK2QrIiB0ZW5zb3JzIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIpfSl9fSwKcmVmcmVzaCgpe3RoaXMudGVuc29yTmFtZS50cmltKCkmJnRoaXMucmVuZGVyVGVuc29yVmFsdWUoKX0sX2dldFRlbnNvckRhdGFVUkwoYSl7Y29uc3QgYz1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvdGVuc29yX2RhdGEiKTtyZXR1cm4gUW8uYWRkUGFyYW1zKGMsYSl9LF9yYW5rRnJvbVNsaWNpbmcoYSl7YS5zdGFydHNXaXRoKCJbIikmJihhPWEuc2xpY2UoMSxhLmxlbmd0aC0xKSk7aWYoMD09PWEubGVuZ3RoKXJldHVybiAwO3thPWEuc3BsaXQoIiwiKTtsZXQgYz1hLmxlbmd0aDtmb3IoY29uc3QgZCBvZiBhKWlzTmFOKE51bWJlcihkKSl8fGMtLTtyZXR1cm4gY319LF9zZXRWaXN1YWxpemF0aW9uVHlwZShhKXsic2NhbGFyIj09PWE/KHRoaXMuc2V0KCJfaXNWYWx1ZVNjYWxhciIsITApLHRoaXMuc2V0KCJfaXNWYWx1ZUxpbmVDaGFydCIsITEpLHRoaXMuc2V0KCJfaXNWYWx1ZUltYWdlIiwhMSkpOiJsaW5lQ2hhcnQiPT09YT8odGhpcy5zZXQoIl9pc1ZhbHVlU2NhbGFyIiwKITEpLHRoaXMuc2V0KCJfaXNWYWx1ZUxpbmVDaGFydCIsITApLHRoaXMuc2V0KCJfaXNWYWx1ZUltYWdlIiwhMSkpOiJpbWFnZSI9PT1hPyh0aGlzLnNldCgiX2lzVmFsdWVTY2FsYXIiLCExKSx0aGlzLnNldCgiX2lzVmFsdWVMaW5lQ2hhcnQiLCExKSx0aGlzLnNldCgiX2lzVmFsdWVJbWFnZSIsITApKTpjb25zb2xlLmVycm9yKCJJbnZhbGlkIHZpc3VhbGl6YXRpb25UeXBlOiIsYSl9LF90aW1lSW5kaWNlc1RvZ2dsZUJ1dHRvbkNhbGxiYWNrKCl7ImZ1bGwgaGlzdG9yeSI9PT1Qb2x5bWVyLmRvbSh0aGlzLiQkKCIjdGltZS1pbmRpY2VzLXRvZ2dsZS1idXR0b24iKSkudGV4dENvbnRlbnQudG9Mb3dlckNhc2UoKT90aGlzLnNldCgidGltZUluZGljZXMiLCI6Iik6dGhpcy5zZXQoInRpbWVJbmRpY2VzIiwiLTEiKTt0aGlzLnJlbmRlclRlbnNvclZhbHVlKCl9LF91cGRhdGVUaW1lSW5kaWNlc1RvZ2dsZShhKXt0aGlzLl9pc1RpbWVJbmRpY2VzU2luZ2xlU3RlcChhKT9Qb2x5bWVyLmRvbSh0aGlzLiQkKCIjdGltZS1pbmRpY2VzLXRvZ2dsZS1idXR0b24iKSkudGV4dENvbnRlbnQ9CiJGdWxsIEhpc3RvcnkiOlBvbHltZXIuZG9tKHRoaXMuJCQoIiN0aW1lLWluZGljZXMtdG9nZ2xlLWJ1dHRvbiIpKS50ZXh0Q29udGVudD0iTGF0ZXN0IFRpbWUgUG9pbnQifSxfaXNUaW1lSW5kaWNlc1NpbmdsZVN0ZXAoYSl7YS5zdGFydHNXaXRoKCJbIikmJihhPWEuc2xpY2UoMSxhLmxlbmd0aC0xKSk7cmV0dXJuIWlzTmFOKE51bWJlcihhKSl9LF9jYWxjdWxhdGVEZWJ1Z09wVG9EaXNwbGF5KCl7cmV0dXJuIkRlYnVnSWRlbnRpdHkiPT09dGhpcy5kZWJ1Z09wPyIiOnRoaXMuZGVidWdPcH0sX3Nob3dUb2FzdChhKXt0aGlzLiQudGVuc29yVmFsdWVUb2FzdC5zZXRBdHRyaWJ1dGUoInRleHQiLGEpO3RoaXMuJC50ZW5zb3JWYWx1ZVRvYXN0Lm9wZW4oKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXciLHByb3BlcnRpZXM6e2NvbnRpbnVlVG9DYWxsYmFjazpGdW5jdGlvbix0ZW5zb3JOYW1lQ2xpY2tlZDpGdW5jdGlvbixfdGVuc29yVmlld0NvdW50ZXI6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGdldEhlYWx0aFBpbGw6RnVuY3Rpb259LGFkZFZpZXcoYSl7Y29uc3QgYz10aGlzLiQkKCIjbXVsdGktdGVuc29yLXZpZXctY29udGFpbmVyIiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Zi10ZW5zb3ItdmFsdWUtdmlldyIpO2Quc2V0QXR0cmlidXRlKCJjbGFzcyIsImRlYnVnZ2VyLXRlbnNvci12aWV3Iik7ZC52aWV3SWQ9YS52aWV3SWQ7ZC50ZW5zb3JOYW1lPWEudGVuc29yTmFtZTtkLmRlYnVnT3A9YS5kZWJ1Z09wO2QuZGV2aWNlTmFtZT1hLmRldmljZU5hbWU7ZC5tYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lPWEubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZTtkLmR0eXBlPWEuZHR5cGU7ZC5zaGFwZT1hLnNoYXBlOwpkLnNsaWNpbmc9YS5zbGljaW5nO2QudGltZUluZGljZXM9YS50aW1lSW5kaWNlcztkLmNsb3NlQnV0dG9uQ2FsbGJhY2s9dGhpcy5fY3JlYXRlQ2xvc2VCdXR0b25DYWxsYmFjayhhLnZpZXdJZCk7ZC5jb250aW51ZVRvQnV0dG9uQ2FsbGJhY2s9KCk9Pnt0aGlzLmNvbnRpbnVlVG9DYWxsYmFjayhhLmRldmljZU5hbWUsYS5tYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lKX07ZC50ZW5zb3JOYW1lQ2FsbGJhY2s9KCk9Pnt0aGlzLnRlbnNvck5hbWVDbGlja2VkKGEuZGV2aWNlTmFtZSxhLm1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWUpfTtkLmdldEhlYWx0aFBpbGw9dGhpcy5nZXRIZWFsdGhQaWxsO2MuYXBwZW5kQ2hpbGQoZCk7ZC5yZWZyZXNoKCl9LGdldFZpZXdzKCl7Y29uc3QgYT1bXTtfLmZvckVhY2godGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5kZWJ1Z2dlci10ZW5zb3ItdmlldyIpLGM9PnthLnB1c2goe3ZpZXdJZDpjLnZpZXdJZCx0ZW5zb3JOYW1lOmMudGVuc29yTmFtZSwKZGVidWdPcDpjLmRlYnVnT3Asc2xpY2luZzpjLnNsaWNpbmcsdGltZUluZGljZXM6Yy50aW1lSW5kaWNlc30pfSk7cmV0dXJuIGF9LHJlbmRlclRlbnNvclZhbHVlcygpe18uZm9yRWFjaCh0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmRlYnVnZ2VyLXRlbnNvci12aWV3IiksYT0+e2EucmVuZGVyVGVuc29yVmFsdWUoKX0pfSxfcmVkcmF3Vmlld3MoYSl7Y29uc3QgYz10aGlzLiQkKCIjbXVsdGktdGVuc29yLXZpZXctY29udGFpbmVyIik7Xy5mb3JFYWNoKHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuZGVidWdnZXItdGVuc29yLXZpZXciKSxkPT57Yy5yZW1vdmVDaGlsZChkKX0pO18uZm9yRWFjaChhLGQ9Pnt0aGlzLmFkZFZpZXcoZCl9KX0sX2NyZWF0ZUNsb3NlQnV0dG9uQ2FsbGJhY2soYSl7cmV0dXJuKCk9Pntjb25zdCBjPVtdLGQ9dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5kZWJ1Z2dlci10ZW5zb3ItdmlldyIpO2ZvcihsZXQgZj0wO2Y8ZC5sZW5ndGg7KytmKXtjb25zdCBnPQpkW2ZdO2cudmlld0lkIT09YSYmYy5wdXNoKHt2aWV3SWQ6Zy52aWV3SWQsdGVuc29yTmFtZTpnLnRlbnNvck5hbWUsZGVidWdPcDpnLmRlYnVnT3AsZHR5cGU6Zy5kdHlwZSxzaGFwZTpnLnNoYXBlLHNsaWNpbmc6Zy5zbGljaW5nLHRpbWVJbmRpY2VzOmcudGltZUluZGljZXN9KX10aGlzLl9yZWRyYXdWaWV3cyhjKX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RlbnNvci1zaGFwZS1oZWxwZXIuanMKKGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoZCxmKXtyZXR1cm4gZDw9Zj8iOjoiOiI6OiIrTWF0aC5jZWlsKGQvZil9YS5nZXREZWZhdWx0U2xpY2luZz1mdW5jdGlvbihkKXtyZXR1cm4gMD09PWQubGVuZ3RoPyIiOjE9PT1kLmxlbmd0aD8iWyIrYyhkWzBdLDFFMykrIl0iOjI9PT1kLmxlbmd0aD8iWyIrYyhkWzBdLDI1MCkrIiwgIitjKGRbMV0sMjUwKSsiXSI6bnVsbH07YS5yYW5rRnJvbVNsaWNpbmc9ZnVuY3Rpb24oZCl7ZC5zdGFydHNXaXRoKCJbIikmJihkPWQuc2xpY2UoMSxkLmxlbmd0aC0xKSk7aWYoMD09PWQubGVuZ3RoKXJldHVybiAwO3tkPWQuc3BsaXQoIiwiKTtsZXQgZj1kLmxlbmd0aDtmb3IoY29uc3QgZyBvZiBkKWlzTmFOKE51bWJlcihnKSl8fGYtLTtyZXR1cm4gZn19fSkoZ3B8fChncD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQuaHRtbC5qcwpjb25zdCBrcD0oKT0+d2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0fHxkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCxscD0oKT0+d2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aHx8ZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCxtcD0oa3AoKS03MCkvMjsKUG9seW1lcih7aXM6InRmLWRlYnVnZ2VyLWRhc2hib2FyZCIscHJvcGVydGllczp7X3RvcFJpZ2h0VGFiczp7dHlwZTpBcnJheSx2YWx1ZTpbe2lkOiJ0YWItcnVudGltZS1ncmFwaHMiLG5hbWU6IlJ1bnRpbWUgR3JhcGhzIn0se2lkOiJ0YWItdGVuc29yLXZhbHVlcyIsbmFtZToiVGVuc29yIFZhbHVlcyJ9XSxyZWFkb25seTohMH0sX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF9pc1RvcFJpZ2h0VGVuc29yVmFsdWVzQWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF90b3BSaWdodFNlbGVjdGVkOnt0eXBlOlN0cmluZyx2YWx1ZToiMCIsb2JzZXJ2ZXI6Il90b3BSaWdodFNlbGVjdGVkQ2hhbmdlZCJ9LF9sb25nUG9sbENvdW50Ont0eXBlOk51bWJlcix2YWx1ZTowfSxfc3RlcEJ1dHRvblRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJTdGVwIn0sX2NvbnRpbnVlQnV0dG9uVGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IkNvbnRpbnVlLi4uIn0sCl90ZW5zb3JWaWV3SWRDb3VudGVyOnt0eXBlOk51bWJlcix2YWx1ZTowfSxpc1JlbG9hZERpc2FibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAscmVhZE9ubHk6ITB9LGFscmVhZHlTdGFydGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9jdXJyZW50U2Vzc2lvblJ1bkluZm86e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9zZXNzaW9uUnVuVG90YWxDb3VudGVyOnt0eXBlOk51bWJlcix2YWx1ZTowfSxfc2Vzc2lvblJ1bkNvdW50ZXJzOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXM6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfYWN0aXZlU2Vzc2lvblJ1bktleTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxfYWN0aXZlU2Vzc2lvblJ1bk51bURldmljZXM6e3R5cGU6TnVtYmVyLHZhbHVlOi0xfSxfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZTp7dHlwZTpTdHJpbmcsCnZhbHVlOm51bGwsbm90aWZ5OiEwfSxfaGlnaGxpZ2h0Tm9kZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9jb250aW51ZVRvVHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9jb250aW51ZVRvQ291bnRlcjp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX2NvbnRpbnVlU3RvcDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY29udGludWVUb1RhcmdldDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9jb250aW51ZVRvQ291bnRlclRhcmdldDp7dHlwZTpOdW1iZXIsdmFsdWU6LTF9LF9mb3JjZUV4cGFuZEFuZENoZWNrTm9kZU5hbWU6U3RyaW5nLF9mb3JjZUV4cGFuZE5vZGVOYW1lOlN0cmluZyxfc291cmNlRm9jdXNOb2RlTmFtZTpTdHJpbmcsX3NvdXJjZUNvZGVTaG93bjp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfc2hvd1NvdXJjZUNvZGVDaGFuZ2VkIn0sX2dyYXBoUHJvZ3Jlc3M6e3R5cGU6T2JqZWN0fSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4KbmV3IFFvLlJlcXVlc3RNYW5hZ2VyKDUwKX0sX2J1c3k6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2xlZnRQYW5lV2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOlRvLmdldE51bWJlckluaXRpYWxpemVyKCJfbGVmdFBhbmVXaWR0aCIse2RlZmF1bHRWYWx1ZTo0NTB9KSxvYnNlcnZlcjoiX2xlZnRQYW5lV2lkdGhPYnNlcnZlciJ9LF9taW5sZWZ0UGFuZVdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTo0NTAscmVhZE9ubHk6ITB9LF9tYXhsZWZ0UGFuZVdpZHRoOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVNYXhsZWZ0UGFuZVdpZHRoKF93aW5kb3dXaWR0aCwgX21heE1haW5Db250ZW50V2lkdGgsIF9yZXNpemVyV2lkdGgpIn0sX21heE1haW5Db250ZW50V2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjM1MCxyZWFkT25seTohMH0sX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbHVlOlRvLmdldE51bWJlckluaXRpYWxpemVyKCJfdG9wUmlnaHRRdWFkcmFudEhlaWdodCIsCntkZWZhdWx0VmFsdWU6bXB9KSxvYnNlcnZlcjoiX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHRPYnNlcnZlciJ9LF9taW5Ub3BSaWdodFF1YWRyYW50SGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZToyMDAscmVhZE9ubHk6ITB9LF9tYXhUb3BSaWdodFF1YWRyYW50SGVpZ2h0Ont0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVNYXhUb3BSaWdodFF1YWRyYW50SGVpZ2h0KF93aW5kb3dIZWlnaHQsIF9yZXNpemVyV2lkdGgpIn0sX3Jlc2l6ZXJXaWR0aDp7dHlwZTpOdW1iZXIsdmFsdWU6MzAscmVhZE9ubHk6ITB9LF93aW5kb3dXaWR0aDpOdW1iZXIsX3dpbmRvd0hlaWdodDpOdW1iZXIsX2RlYnVnV2F0Y2hlczpBcnJheSxfbGF0ZXN0U2Vzc2lvblJ1bjpPYmplY3R9LG9ic2VydmVyczpbIl9vbkFjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWVDaGFuZ2UoX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUpIiwiX3NpemVEYXNoYm9hcmRSZWdpb25zKF9sZWZ0UGFuZVdpZHRoLCBfdG9wUmlnaHRRdWFkcmFudEhlaWdodCwgX3dpbmRvd1dpZHRoKSIsCiJfZ3JhcGhQcm9ncmVzc1VwZGF0ZWQoX2dyYXBoUHJvZ3Jlc3MpIl0scmVhZHkoKXt0aGlzLl9oYW5kbGVXaW5kb3dSZXNpemUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIiwoKT0+e3RoaXMuX2hhbmRsZVdpbmRvd1Jlc2l6ZSgpfSwhMSk7dGhpcy5yZWxvYWQoKX0sbG9uZ19wb2xsKCl7Y29uc3QgYT17cG9zOisrdGhpcy5fbG9uZ1BvbGxDb3VudH07bGV0IGM9UW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL2NvbW0iKTtjPVFvLmFkZFBhcmFtcyhjLGEpO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYykudGhlbihkPT57Y29uc3QgZj1kLnR5cGU7ZD1kLmRhdGE7aWYoIm1ldGEiPT09Zil7dmFyIGc9ZC5ydW5fa2V5LGw9Z1swXS5zcGxpdCgiLCIpLGs9Z1sxXS5zcGxpdCgiLCIpO2NvbnN0IHA9Z1syXS5zcGxpdCgiLCIpO3ZhciBuPXRoaXMuX2FjdGl2ZVNlc3Npb25SdW5LZXk7dGhpcy5zZXQoIl9hY3RpdmVTZXNzaW9uUnVuS2V5IiwKZyk7dGhpcy5zZXQoIl9sYXRlc3RTZXNzaW9uUnVuIix7ZmVlZHM6bCxmZXRjaGVzOmssdGFyZ2V0czpwfSk7dGhpcy5zZXQoIl9zZXNzaW9uUnVuU29sZUFjdGl2ZSIsITApO3ZvaWQgMD09PXRoaXMuX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXNbZ10/KHRoaXMuX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXNbZ109W10sdGhpcy5zZXQoIl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcyIsW10pKTp0aGlzLnNldCgiX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzIix0aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2ddKTt0aGlzLl9jdXJyZW50U2Vzc2lvblJ1bkluZm89bD0iRmVlZHM6ICIrbCsiOyBGZXRjaGVzOiAiK2srIjsgVGFyZ2V0czogIitwO3RoaXMuX3Nlc3Npb25SdW5Db3VudGVycy5oYXNPd25Qcm9wZXJ0eShsKT90aGlzLl9zZXNzaW9uUnVuQ291bnRlcnNbbF0rPTE6dGhpcy5fc2Vzc2lvblJ1bkNvdW50ZXJzW2xdPTE7dGhpcy5fc2Vzc2lvblJ1blRvdGFsQ291bnRlcisrOwp0aGlzLiQuaW5pdGlhbERpYWxvZy5jbG9zZURpYWxvZygpO3RoaXMuX2NvbnRpbnVlVG9UeXBlJiZfLmlzRXF1YWwobixnKXx8KHRoaXMuX3Byb2Nlc3NHYXRlZEdycGNEZWJ1Z09wcyhnLCExKSx0aGlzLl9hbm5vdW5jZU5ld1Nlc3Npb25SdW4oKSl9ZWxzZSJ0ZW5zb3IiPT09Zj8oZz1kLmRldmljZV9uYW1lLG49ZC5ub2RlX25hbWUsbD1kLm1heWJlX2Jhc2VfZXhwYW5kZWRfbm9kZV9uYW1lLHRoaXMuX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUhPWc/dGhpcy5zZXQoIl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lIixnKTohdGhpcy5fY29udGludWVUb1R5cGUmJnRoaXMuX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlJiYodGhpcy5fZm9jdXNPbkdyYXBoTm9kZShnLGwpLHRoaXMuc2V0KCJfZm9yY2VFeHBhbmROb2RlTmFtZSIsZysiLyIrbCkpLHRoaXMuc2V0KCJfc2Vzc2lvblJ1blNvbGVBY3RpdmUiLCExKSxrPW4rIjoiK2Qub3V0cHV0X3Nsb3QsdGhpcy5zZXQoIl9sYXRlc3RUZW5zb3JEYXRhIiwKe2RldmljZU5hbWU6Zyx0ZW5zb3JOYW1lOmssbm9kZU5hbWU6bixtYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lOmwsZGVidWdPcDpkLmRlYnVnX29wLGR0eXBlOmQuZHR5cGUsc2hhcGU6ZC5zaGFwZSx2YWx1ZTpkLnZhbHVlc30pLHRoaXMuX21heWJlVXBkYXRlVGVuc29yVmFsdWVWaWV3cyhrLGQuZGVidWdfb3ApLHRoaXMuc2V0KCJfYnVzeSIsITEpKTpjb25zb2xlLmVycm9yKCJJbnZhbGlkIGxvbmctcG9sbGluZyByZXNwb25zZSB0eXBlOiAiLGYpO251bGwhPXRoaXMuX2NvbnRpbnVlVG9UeXBlJiZ0aGlzLl9wcm9jZXNzQ29udGludWVUbyhmLGQpO3RoaXMubG9uZ19wb2xsKCl9KX0sX3Byb2Nlc3NDb250aW51ZVRvKGEsYyl7dGhpcy5fY29udGludWVTdG9wP3RoaXMuX2NsZWFyQ29udGludWVUbygpOiJTZXNzaW9uUnVuIj09PXRoaXMuX2NvbnRpbnVlVG9UeXBlP3RoaXMuX3Byb2Nlc3NDb250aW51ZVRvU2Vzc2lvblJ1bigibWV0YSI9PT1hKToiVGVuc29yQ29uZGl0aW9uIj09PQp0aGlzLl9jb250aW51ZVRvVHlwZT90aGlzLl9zdGVwKCk6Im9wIj09PXRoaXMuX2NvbnRpbnVlVG9UeXBlP3RoaXMuX3Byb2Nlc3NDb250aW51ZVRvT3AoIm1ldGEiPT09YSxjKTpudWxsIT10aGlzLl9jb250aW51ZVRvVHlwZSYmIiIhPT10aGlzLl9jb250aW51ZVRvVHlwZSYmY29uc29sZS5lcnJvcigiSW52YWxpZCBfY29udGludWVUb1R5cGU6Iix0aGlzLl9jb250aW51ZVRvVHlwZSl9LF9wcm9jZXNzQ29udGludWVUb1Nlc3Npb25SdW4oYSl7YSYmdGhpcy5zZXQoIl9jb250aW51ZVRvQ291bnRlciIsdGhpcy5fY29udGludWVUb0NvdW50ZXIrMSk7dGhpcy5fY29udGludWVUb0NvdW50ZXI8dGhpcy5fY29udGludWVUb0NvdW50ZXJUYXJnZXQ/dGhpcy5fc3RlcCgpOnRoaXMuX2NsZWFyQ29udGludWVUbygpfSxfcHJvY2Vzc0NvbnRpbnVlVG9PcChhLGMpe2EmJnRoaXMuX2Fubm91bmNlTmV3U2Vzc2lvblJ1bigpO2E9Yy5kZXZpY2VfbmFtZTtjPWMubWF5YmVfYmFzZV9leHBhbmRlZF9ub2RlX25hbWU7CmNvbnN0IGQ9bnVsbD09Yz9udWxsOmdwLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihjKTthKyIvIitjPT09dGhpcy5fY29udGludWVUb1RhcmdldHx8YSsiLyIrZD09PXRoaXMuX2NvbnRpbnVlVG9UYXJnZXQ/KHRoaXMuX2NsZWFyQ29udGludWVUbygpLHRoaXMuX3NvdXJjZUNvZGVTaG93biYmdGhpcy5zZXQoIl9zb3VyY2VGb2N1c05vZGVOYW1lIixkKSk6dGhpcy5fc3RlcCgpfSxfbWF5YmVVcGRhdGVUZW5zb3JWYWx1ZVZpZXdzKGEsYyl7Y29uc3QgZD10aGlzLiQkKCIjdGVuc29yVmFsdWVNdWx0aVZpZXciKTtpZihudWxsIT1kKXt2YXIgZj0hMTtfLmZvckVhY2goZC5nZXRWaWV3cygpLGc9PntpZihnLnRlbnNvck5hbWU9PT1hJiZnLmRlYnVnT3A9PT1jKXJldHVybiBmPSEwLCExfSk7ZiYmZC5yZW5kZXJUZW5zb3JWYWx1ZXMoKX19LHJlbG9hZCgpe2lmKCF0aGlzLmFscmVhZHlTdGFydGVkKXt0aGlzLnNldCgiYWxyZWFkeVN0YXJ0ZWQiLCEwKTt2YXIgYT1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLAoiL2RlYnVnZ2VyX2dycGNfaG9zdF9wb3J0Iik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChhKS50aGVuKGM9PnswPGMucG9ydD8odGhpcy4kLmluaXRpYWxEaWFsb2cub3BlbkRpYWxvZyhjLmhvc3QsYy5wb3J0KSx0aGlzLmxvbmdfcG9sbCgpKTp0aGlzLiQuaW5pdGlhbERpYWxvZy5vcGVuRGlzYWJsZWREaWFsb2coKX0pfX0sX3Nob3dTb3VyY2VDb2RlQ2hhbmdlZCgpe3RoaXMuX3NvdXJjZUNvZGVTaG93bj8odGhpcy4kJCgiI25vZGUtZW50cmllcyIpLnN0eWxlLmhlaWdodD0iNDAlIix0aGlzLiQuc291cmNlQ29kZVZpZXcucmVuZGVyKCkpOnRoaXMuJCQoIiNub2RlLWVudHJpZXMiKS5zdHlsZS5oZWlnaHQ9IjgwJSJ9LF9zaG93VG9hc3QoYSl7dGhpcy4kLnRvYXN0LnNldEF0dHJpYnV0ZSgidGV4dCIsYSk7dGhpcy4kLnRvYXN0Lm9wZW4oKX0sX2Fubm91bmNlTmV3U2Vzc2lvblJ1bigpe3RoaXMuX3Nob3dUb2FzdCgiU2Vzc2lvbi5ydW4oKSAjIit0aGlzLl9zZXNzaW9uUnVuVG90YWxDb3VudGVyKwoiIGlzIHN0YXJ0aW5nLiIpfSxfZGlzcGxheUdyYXBoKGEsYyl7YT17cnVuX2tleTpKU09OLnN0cmluZ2lmeShhKSxkZXZpY2VfbmFtZTpjfTthPVFvLmFkZFBhcmFtcygiL2RhdGEvcGx1Z2luL2RlYnVnZ2VyL2RlYnVnZ2VyX2dyYXBoIixhKTt0aGlzLiQubG9hZGVyLmRhdGFzZXRzPVt7bmFtZToiL2RlYnVnZ2VyX2dyYXBoIixwYXRoOmF9XTt0aGlzLiQubG9hZGVyLnNldCgic2VsZWN0ZWREYXRhc2V0IiwwKX0sX3Byb2Nlc3NHYXRlZEdycGNEZWJ1Z09wcyhhLGMpe2M/Y29uc29sZS5sb2coIlBvbGxpbmcgZm9yIGZpcnN0IEdyYXBoRGVmIGZvciBydW4ga2V5OiIsYSk6dGhpcy5zZXQoIl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lIixudWxsKTt2YXIgZD17bW9kZToicmV0cmlldmVfYWxsIixydW5fa2V5OkpTT04uc3RyaW5naWZ5KGEpfTtjb25zdCBmPVFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9nYXRlZF9ncnBjIik7ZD1Rby5hZGRQYXJhbXMoZiwKZCk7bGV0IGc9W107dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChkKS50aGVuKGw9PntpZigwPT1sLmRldmljZV9uYW1lcy5sZW5ndGgpY3x8dGhpcy5fc3RlcCgpLHRoaXMuX3Byb2Nlc3NHYXRlZEdycGNEZWJ1Z09wcyhhLCEwKTtlbHNle3ZhciBrPW51bGw7Zm9yKGNvbnN0IG4gaW4gbC5nYXRlZF9ncnBjX3RlbnNvcnMpaWYobC5nYXRlZF9ncnBjX3RlbnNvcnMuaGFzT3duUHJvcGVydHkobikpey0xPT09dGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1thXS5pbmRleE9mKG4pJiYodGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1thXS5wdXNoKG4pLHRoaXMuJC5zZXNzaW9uUnVuc1ZpZXcudXBkYXRlTnVtRGV2aWNlcyh0aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2FdLmxlbmd0aCkpO3RoaXMuc2V0KCJfYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMiLHRoaXMuX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXNbYV0uc2xpY2UoKSk7az10aGlzLl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlc1t0aGlzLl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcy5sZW5ndGgtCjFdO2NvbnN0IHA9bC5nYXRlZF9ncnBjX3RlbnNvcnNbbl07Zm9yKGxldCBxPTA7cTxwLmxlbmd0aDsrK3EpZy5wdXNoKHtkZXZpY2VfbmFtZTpuLG5vZGVfbmFtZTpwW3FdWzBdLG9wX3R5cGU6cFtxXVsxXSxvdXRwdXRfc2xvdDpwW3FdWzJdLGRlYnVnX29wOnBbcV1bM119KX1udWxsIT1rJiYodGhpcy5zZXQoIl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lIixrKSxsPVBvbHltZXIuZG9tKHRoaXMuJCQoIiNhY3RpdmUtcnVudGltZS1ncmFwaC1kZXZpY2UtbmFtZSIpKSxudWxsIT1sJiZsLnNldEF0dHJpYnV0ZSgic2VsZWN0ZWQiLGspKTtncC5zb3J0QW5kQmFzZUV4cGFuZERlYnVnV2F0Y2hlcyhnKTt0aGlzLnNldCgiX2RlYnVnV2F0Y2hlcyIsZyk7dGhpcy4kLnNvdXJjZUNvZGVWaWV3LnJlbmRlcihnKX19KX0sX2NyZWF0ZURlYnVnV2F0Y2hDaGFuZ2VIYW5kbGVyKCl7cmV0dXJuKGEsYyk9PntjPWM/ImJyZWFrIjoiZGlzYWJsZSI7dGhpcy5fcmVxdWVzdEJyZWFrcG9pbnRTdGF0ZUNoYW5nZShncC5nZXRDbGVhbk5vZGVOYW1lKGEuZGV2aWNlX25hbWUrCiIvIithLm5vZGVfbmFtZSksYS5vdXRwdXRfc2xvdCxhLmRlYnVnX29wLGMpfX0sX2ZvY3VzT25HcmFwaE5vZGUoYSxjKXtudWxsIT1hJiZ0aGlzLl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lIT09YSYmdGhpcy5zZXQoIl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lIixhKTt0aGlzLl9zZXRUb3BSaWdodFJ1bnRpbWVHcmFwaHNUb0FjdGl2ZSgpO2NvbnN0IGQ9dGhpcy4kJCgiI2dyYXBoIik7aWYoZC5zZWxlY3RlZE5vZGU9PT1jKWQucGFuVG9Ob2RlKGMpO2Vsc2V7Y29uc3QgZj1kLmdldCgicmVuZGVySGllcmFyY2h5IikuaGllcmFyY2h5LmdldE5vZGVNYXAoKTtudWxsPT1mW2NdJiYoYz1ncC5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oYykpO251bGwhPWZbY10mJmQuc2V0KCJzZWxlY3RlZE5vZGUiLGMpfXRoaXMuc2V0KCJfaGlnaGxpZ2h0Tm9kZU5hbWUiLGErIi8iK2MpfSxfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCl7cmV0dXJuKGEsYyxkKT0+e3RoaXMuX3NvdXJjZUNvZGVTaG93biYmCiEwIT09ZCYmdGhpcy5zZXQoIl9zb3VyY2VGb2N1c05vZGVOYW1lIixncC5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oYykpO3RoaXMuX2ZvY3VzT25HcmFwaE5vZGUoYSxjKTt0aGlzLnNldCgiX2ZvcmNlRXhwYW5kTm9kZU5hbWUiLGErIi8iK2MpfX0sX2NyZWF0ZUZlZWRGZXRjaFRhcmdldENsaWNrZWRIYW5kbGVyKCl7cmV0dXJuIGE9PntsZXQgYz1hOy0xIT09Yy5pbmRleE9mKCI6IikmJihjPWMuc2xpY2UoMCxjLmluZGV4T2YoIjoiKSkpO2E9Xy5maW5kKHRoaXMuX2RlYnVnV2F0Y2hlcyxkPT5kLm5vZGVfbmFtZT09PWN8fDA9PT1kLm5vZGVfbmFtZS5pbmRleE9mKGMpJiYiKCI9PT1kLm5vZGVfbmFtZVtjLmxlbmd0aF0pO251bGw9PWE/dGhpcy5fc2hvd1RvYXN0KCJOb2RlICciK2MrIicgaXMgbm90IGluIHRoZSBydW50aW1lIGdyYXBoIG9mIHRoZSBjdXJyZW50IFNlc3Npb24ucnVuIG9yIGRvZXMgbm90IGhhdmUgYSBkZWJ1ZyBvcCBhdHRhY2hlZC4iKTp0aGlzLl9mb2N1c09uR3JhcGhOb2RlKGEuZGV2aWNlX25hbWUsCmMpfX0sX2NyZWF0ZVRlbnNvckRhdGFFeHBhbmRIYW5kbGVyKCl7cmV0dXJuIGE9Pnt0aGlzLl9zZXRUb3BSaWdodFRlbnNvclZhbHVlc1RvQWN0aXZlKCk7c2V0VGltZW91dCgoKT0+e3RoaXMuJCQoIiN0ZW5zb3JWYWx1ZU11bHRpVmlldyIpLmFkZFZpZXcoe3ZpZXdJZDp0aGlzLl9jcmVhdGVUZW5zb3JWaWV3SWQoKSxkZXZpY2VOYW1lOmEuZGV2aWNlTmFtZSx0ZW5zb3JOYW1lOmEudGVuc29yTmFtZSxub2RlTmFtZTphLm5vZGVOYW1lLG1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWU6YS5tYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lLGRlYnVnT3A6YS5kZWJ1Z09wLGR0eXBlOmEuZHR5cGUsc2hhcGU6YS5zaGFwZSxzbGljaW5nOmdwLmdldERlZmF1bHRTbGljaW5nKGEuc2hhcGUpLHRpbWVJbmRpY2VzOiItMSJ9KX0sMTApfX0sX2NyZWF0ZVRlbnNvclZpZXdJZCgpe2NvbnN0IGE9ImRlYnVnZ2VyLXRlbnNvci12aWV3LSIrdGhpcy5fdGVuc29yVmlld0lkQ291bnRlcjt0aGlzLl90ZW5zb3JWaWV3SWRDb3VudGVyKys7CnJldHVybiBhfSxfY3JlYXRlTm9kZUNvbnRleHRNZW51SXRlbXMoKXtyZXR1cm5be3RpdGxlOigpPT4iRXhwYW5kIGFuZCBoaWdobGlnaHQiLGFjdGlvbjphPT57Y29uc3QgYz1ncC5nZXRDbGVhbk5vZGVOYW1lKGEubm9kZS5uYW1lKTthPXRoaXMuX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUrIi8iK2Eubm9kZS5uYW1lO3RoaXMuc2V0KCJfZm9yY2VFeHBhbmROb2RlTmFtZSIsYSk7dGhpcy5zZXQoIl9oaWdobGlnaHROb2RlTmFtZSIsYSk7dGhpcy5fc291cmNlQ29kZVNob3duJiZ0aGlzLnNldCgiX3NvdXJjZUZvY3VzTm9kZU5hbWUiLGdwLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihjKSl9fSx7dGl0bGU6KCk9PiJBZGQgYnJlYWtwb2ludCIsYWN0aW9uOmE9Pntjb25zdCBjPWdwLmdldENsZWFuTm9kZU5hbWUoYS5ub2RlLm5hbWUpO3RoaXMuc2V0KCJfZm9yY2VFeHBhbmRBbmRDaGVja05vZGVOYW1lIix0aGlzLl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lKwoiLyIrYS5ub2RlLm5hbWUpO3RoaXMuX3NvdXJjZUNvZGVTaG93biYmdGhpcy5zZXQoIl9zb3VyY2VGb2N1c05vZGVOYW1lIixncC5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oYykpfX0se3RpdGxlOigpPT4iQ29udGludWUgdG8iLGFjdGlvbjphPT57LTEhPT1bIl9BcmciLCJfUmV0dmFsIl0uaW5kZXhPZihhLm5vZGUub3ApP3RoaXMuX3Nob3dUb2FzdCgnQ2Fubm90IGNvbnRpbnVlIHRvIG5vZGUgIicrYS5ub2RlLm5hbWUrJyIsIGR1ZSB0byBvcCB0eXBlICInK2Eubm9kZS5vcCsnIi4nKTp0aGlzLl9jb250aW51ZVRvTm9kZSh0aGlzLl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lLGEubm9kZS5uYW1lKX19XX0sX2NyZWF0ZUdldEhlYWx0aFBpbGwoKXtyZXR1cm4oYSxjLGQsZik9Pnt2YXIgZz17d2F0Y2hfa2V5OmEsdGltZV9pbmRpY2VzOiItMSIsbWFwcGluZzoiaGVhbHRoLXBpbGwifTtjb25zdCBsPVFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsCiIvdGVuc29yX2RhdGEiKTtnPVFvLmFkZFBhcmFtcyhsLGcpO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZykudGhlbihrPT57az1rLnRlbnNvcl9kYXRhWzBdO2Yoayk7dGhpcy5fY29uZGl0aW9uYWxIZWFsdGhQaWxsU3RvcChhLGMsZCxrKX0pfX0sX2NvbmRpdGlvbmFsSGVhbHRoUGlsbFN0b3AoYSxjLGQsZil7aWYoIlRlbnNvckNvbmRpdGlvbiI9PT10aGlzLl9jb250aW51ZVRvVHlwZSYmZ3AuY2hlY2tIZWFsdGhQaWxsQWdhaW5zdFRlbnNvckNvbmRpdGlvbktleSh0aGlzLl9jb250aW51ZVRvVGFyZ2V0LGYsdGhpcy5fY29udGludWVUb0NvdW50ZXJUYXJnZXQpKXt0aGlzLnNldCgiX2NvbnRpbnVlU3RvcCIsITApO2Y9Z3AucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGQpO3RoaXMuX3NvdXJjZUNvZGVTaG93biYmdGhpcy5zZXQoIl9zb3VyY2VGb2N1c05vZGVOYW1lIixmKTt0aGlzLl9mb2N1c09uR3JhcGhOb2RlKGMsZCk7Y29uc3QgZz1jKyIvIitkO3RoaXMuc2V0KCJfZm9yY2VFeHBhbmROb2RlTmFtZSIsCmcpO3NldFRpbWVvdXQoKCk9Pnt0aGlzLnNldCgiX2hpZ2hsaWdodE5vZGVOYW1lIixudWxsKTt0aGlzLnNldCgiX2hpZ2hsaWdodE5vZGVOYW1lIixnKX0sMTAwKTt0aGlzLl9zaG93VG9hc3QoJ1RlbnNvciBjb25kaXRpb24gIicrdGhpcy5fY29udGludWVUb1RhcmdldCsnIiBpcyBtZXQgYnkgd2F0Y2gga2V5OiAiJythKyciLlxuU3RvcHBpbmcgY29udGludWF0aW9uLicpfX0sX2NvbnRpbnVlVG9Ob2RlKGEsYyl7Y29uc3QgZD1ncC5nZXRDbGVhbk5vZGVOYW1lKGMpO2E9YSsiLyIrYzt0aGlzLl9yZXF1ZXN0QnJlYWtwb2ludFN0YXRlQ2hhbmdlKGQsMCwiRGVidWdJZGVudGl0eSIsImJyZWFrIik7dGhpcy5zZXQoIl9mb3JjZUV4cGFuZEFuZENoZWNrTm9kZU5hbWUiLGEpO3RoaXMuX3NvdXJjZUNvZGVTaG93biYmdGhpcy5zZXQoIl9zb3VyY2VGb2N1c05vZGVOYW1lIixncC5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oZCkpO3RoaXMuX3NldENvbnRpbnVlVG8oIm9wIixhKTsKdGhpcy4kLmNvbnRpbnVlRGlhbG9nLnVwZGF0ZUNvbnRpbnVlQnV0dG9uVGV4dCghMCk7dGhpcy5fc3RlcCgpfSxfY3JlYXRlQ29udGludWVUb05vZGVIYW5kbGVyKCl7cmV0dXJuKGEsYyk9Pnt0aGlzLl9jb250aW51ZVRvTm9kZShhLGMpfX0sX29uQWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZUNoYW5nZShhKXtjb25zdCBjPVBvbHltZXIuZG9tKHRoaXMuJCQoIiNydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIikpO2lmKDA8dGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMubGVuZ3RoKXtsZXQgZDtkPWErKCIgKGRldmljZSAiKyh0aGlzLl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcy5pbmRleE9mKGEpKzEpKyIgb2YgIit0aGlzLl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcy5sZW5ndGgrIikiKTt0aGlzLl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSYmbnVsbCE9YyYmKGMudGV4dENvbnRlbnQ9ZCl9ZWxzZSB0aGlzLl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSYmCm51bGwhPWMmJihjLnRleHRDb250ZW50PSJXYWl0aW5nIGZvciBkZXZpY2UuLi4iKTtudWxsIT1hJiZ0aGlzLl9kaXNwbGF5R3JhcGgodGhpcy5fYWN0aXZlU2Vzc2lvblJ1bktleSxhKX0sX3N0ZXAoKXtpZihudWxsIT10aGlzLl9hY3RpdmVTZXNzaW9uUnVuS2V5KXt0aGlzLnNldCgiX2J1c3kiLCEwKTt2YXIgYT17bW9kZToicmV0cmlldmVfZGV2aWNlX25hbWVzIixydW5fa2V5OkpTT04uc3RyaW5naWZ5KHRoaXMuX2FjdGl2ZVNlc3Npb25SdW5LZXkpfSxjPVFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9nYXRlZF9ncnBjIik7YT1Rby5hZGRQYXJhbXMoYyxhKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGEpLnRoZW4oZD0+e2xldCBmPSExO2ZvcihsZXQgZz0wO2c8ZC5kZXZpY2VfbmFtZXMubGVuZ3RoOysrZylpZigtMT09PXRoaXMuX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzLmluZGV4T2YoZC5kZXZpY2VfbmFtZXNbZ10pKXtmPSEwO2JyZWFrfWQ9ClFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9hY2siKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGQpLnRoZW4oKCk9PntmJiZ0aGlzLl9wcm9jZXNzR2F0ZWRHcnBjRGVidWdPcHModGhpcy5fYWN0aXZlU2Vzc2lvblJ1bktleSwhMSl9KX0pfX0sX2NyZWF0ZVNlc3Npb25SdW5Hbygpe3JldHVybiBhPT57dGhpcy5fc2V0Q29udGludWVUbygiU2Vzc2lvblJ1biIsdGhpcy5fY3VycmVudFNlc3Npb25SdW5JbmZvLGEpO3RoaXMuX3N0ZXAoKX19LF9jcmVhdGVUZW5zb3JDb25kaXRpb25Hbygpe3JldHVybihhLGMpPT57dGhpcy5fc2V0Q29udGludWVUbygiVGVuc29yQ29uZGl0aW9uIixhLGMpO3RoaXMuJC50ZW5zb3JEYXRhU3VtbWFyeS5lbmFibGVIZWFsdGhQaWxscygpO3RoaXMuX3N0ZXAoKX19LF9jcmVhdGVGb3JjZUNvbnRpbnVhdGlvblN0b3AoKXtyZXR1cm4oKT0+e3RoaXMuX3Nob3dUb2FzdCgnQ29udGludWF0aW9uIG9mIHR5cGUgIicrdGhpcy5fY29udGludWVUb1R5cGUrCiciIHdhcyBpbnRlcnJ1cHRlZCBieSB1c2VyLicpO3RoaXMuc2V0KCJfY29udGludWVTdG9wIiwhMCl9fSxfc2V0Q29udGludWVUbyhhLGMsZD0tMSl7dGhpcy5fY29udGludWVUb1R5cGU9YTt0aGlzLl9jb250aW51ZVRvVGFyZ2V0PWM7dGhpcy5fY29udGludWVUb0NvdW50ZXJUYXJnZXQ9ZDt0aGlzLl9jb250aW51ZVRvQ291bnRlcj0wO3RoaXMuX2NvbnRpbnVlU3RvcD0hMX0sX2NsZWFyQ29udGludWVUbygpe3RoaXMuJC5jb250aW51ZURpYWxvZy5ub3RpZnlDb250aW51YXRpb25TdG9wKCk7dGhpcy5fY29udGludWVUb1RhcmdldD10aGlzLl9jb250aW51ZVRvVHlwZT0iIjt0aGlzLl9jb250aW51ZVRvQ291bnRlclRhcmdldD0tMTt0aGlzLl9jb250aW51ZVRvQ291bnRlcj0wO3RoaXMuX2NvbnRpbnVlU3RvcD0hMTt0aGlzLnNldCgiX2J1c3kiLCExKX0sX2NyZWF0ZUNvbnRpbnVlVG9DYWxsYmFjaygpe3JldHVybihhLGMpPT57dGhpcy5fc2V0Q29udGludWVUbygib3AiLGErIi8iKwpjKTt0aGlzLl9zdGVwKCk7dGhpcy5faXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUmJnRoaXMuX2ZvY3VzT25HcmFwaE5vZGUoYSxjKTt0aGlzLnNldCgiX2ZvcmNlRXhwYW5kTm9kZU5hbWUiLGErIi8iK2MpfX0sX3RvcFJpZ2h0U2VsZWN0ZWRDaGFuZ2VkKGEpe2E9dGhpcy5fdG9wUmlnaHRUYWJzW2FdLmlkO3RoaXMuc2V0KCJfaXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUiLCJ0YWItcnVudGltZS1ncmFwaHMiPT09YSk7dGhpcy5zZXQoIl9pc1RvcFJpZ2h0VGVuc29yVmFsdWVzQWN0aXZlIiwidGFiLXRlbnNvci12YWx1ZXMiPT09YSl9LF9zZXRUb3BSaWdodFJ1bnRpbWVHcmFwaHNUb0FjdGl2ZSgpe3RoaXMuc2V0KCJfdG9wUmlnaHRTZWxlY3RlZCIsIjAiKTt0aGlzLnNldCgiX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlIiwhMCk7dGhpcy5zZXQoIl9pc1RvcFJpZ2h0VGVuc29yVmFsdWVzQWN0aXZlIiwhMSl9LF9zZXRUb3BSaWdodFRlbnNvclZhbHVlc1RvQWN0aXZlKCl7dGhpcy5zZXQoIl90b3BSaWdodFNlbGVjdGVkIiwKIjEiKTt0aGlzLnNldCgiX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlIiwhMSk7dGhpcy5zZXQoIl9pc1RvcFJpZ2h0VGVuc29yVmFsdWVzQWN0aXZlIiwhMCl9LF9yZXF1ZXN0QnJlYWtwb2ludFN0YXRlQ2hhbmdlKGEsYyxkLGYpe2E9e21vZGU6InNldF9zdGF0ZSIsbm9kZV9uYW1lOmEsb3V0cHV0X3Nsb3Q6YyxkZWJ1Z19vcDpkLHN0YXRlOmZ9O2M9UW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL2dhdGVkX2dycGMiKTthPVFvLmFkZFBhcmFtcyhjLGEpO3RoaXMuc2V0KCJfYnVzeSIsITApO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihnPT57dGhpcy5zZXQoIl9idXN5IiwhMSk7Y29uc29sZS5sb2coIkJyZWFrcG9pbnQgc2V0X3N0YXRlIHJlc3BvbnNlOiAiLGcpfSl9LF9ncmFwaFByb2dyZXNzVXBkYXRlZChhKXtjb25zdCBjPXRoaXMuJCQoIiN0b3AtcmlnaHQtcHJvZ3Jlc3MtYmFyIik7bnVsbD09dGhpcy5fbGF0ZXN0U2Vzc2lvblJ1bj8KKGMuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsMCksdGhpcy5zZXQoIl9idXN5IiwhMSkpOihjLnNldEF0dHJpYnV0ZSgidmFsdWUiLGEudmFsdWUpLHRoaXMuc2V0KCJfYnVzeSIsMTAwPmEudmFsdWUpKX0sX2hhbmRsZVdpbmRvd1Jlc2l6ZSgpe3RoaXMuc2V0KCJfd2luZG93V2lkdGgiLGxwKCkpO3RoaXMuc2V0KCJfd2luZG93SGVpZ2h0IixrcCgpKTt0aGlzLl9zaXplRGFzaGJvYXJkUmVnaW9ucyh0aGlzLl9sZWZ0UGFuZVdpZHRoLHRoaXMuX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHQsdGhpcy5fd2luZG93V2lkdGgpfSxfY29tcHV0ZU1heGxlZnRQYW5lV2lkdGgoYSxjLGQpe3JldHVybiBhLWMtZH0sX2NvbXB1dGVNYXhUb3BSaWdodFF1YWRyYW50SGVpZ2h0KGEsYyl7cmV0dXJuIGEtYy03MH0sX3NpemVEYXNoYm9hcmRSZWdpb25zKGEsYyxkKXt0aGlzLiQkKCIjbGVmdC1wYW5lIikuc3R5bGUud2lkdGg9YSsicHgiO2E9ZC1hLXRoaXMuX3Jlc2l6ZXJXaWR0aC04O3RoaXMuJCQoIiNjZW50ZXItY29udGVudCIpLnN0eWxlLndpZHRoPQphKyJweCI7YT1jLXRoaXMuX3Jlc2l6ZXJXaWR0aDt0aGlzLiQkKCIjdG9wLXJpZ2h0LXF1YWRyYW50Iikuc3R5bGUuaGVpZ2h0PWErInB4Ijt0aGlzLiQkKCIjdGVuc29yLWRhdGEiKS5zdHlsZS50b3A9YysicHgifSxfbGVmdFBhbmVXaWR0aE9ic2VydmVyOlRvLmdldE51bWJlck9ic2VydmVyKCJfbGVmdFBhbmVXaWR0aCIse2RlZmF1bHRWYWx1ZTo0NTB9KSxfdG9wUmlnaHRRdWFkcmFudEhlaWdodE9ic2VydmVyOlRvLmdldE51bWJlck9ic2VydmVyKCJfdG9wUmlnaHRRdWFkcmFudEhlaWdodCIse2RlZmF1bHRWYWx1ZTptcH0pfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItbWF0ZXJpYWwvcGFwZXItbWF0ZXJpYWwuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItbWF0ZXJpYWwiLHByb3BlcnRpZXM6e2VsZXZhdGlvbjp7dHlwZTpOdW1iZXIscmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOjF9LGFuaW1hdGVkOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQvdGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWdyYXBoLWRlYnVnZ2VyLWRhdGEtY2FyZCIscHJvcGVydGllczp7cmVuZGVySGllcmFyY2h5Ok9iamVjdCxkZWJ1Z2dlck51bWVyaWNBbGVydHM6e3R5cGU6QXJyYXksbm90aWZ5OiEwfSxub2RlTmFtZXNUb0hlYWx0aFBpbGxzOk9iamVjdCxoZWFsdGhQaWxsU3RlcEluZGV4Ont0eXBlOk51bWJlcixub3RpZnk6ITB9LHNwZWNpZmljSGVhbHRoUGlsbFN0ZXA6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSxzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0saGlnaGxpZ2h0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGVjdGVkTm9kZUluY2x1ZGU6e3R5cGU6TnVtYmVyLG5vdGlmeTohMH0sYXJlSGVhbHRoUGlsbHNMb2FkaW5nOkJvb2xlYW4saGVhbHRoUGlsbEVudHJpZXM6e3R5cGU6QXJyYXksdmFsdWU6dGYuZ3JhcGguc2NlbmUuaGVhbHRoUGlsbEVudHJpZXMscmVhZE9ubHk6ITB9LGhlYWx0aFBpbGxWYWx1ZXNGb3JTZWxlY3RlZE5vZGU6e3R5cGU6QXJyYXksCmNvbXB1dGVkOiJfY29tcHV0ZUhlYWx0aFBpbGxGb3JOb2RlKG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMsIGhlYWx0aFBpbGxTdGVwSW5kZXgsIHNlbGVjdGVkTm9kZSwgYWxsU3RlcHNNb2RlRW5hYmxlZCwgYXJlSGVhbHRoUGlsbHNMb2FkaW5nKSJ9LGFsbFN0ZXBzTW9kZUVuYWJsZWQ6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITB9LF9iaWdnZXN0U3RlcEV2ZXJTZWVuOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVCaWdnZXN0U3RlcEV2ZXJTZWVuKG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMpIn0sX21heFN0ZXBJbmRleDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4U3RlcEluZGV4KG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMpIn0sX2N1cnJlbnRTdGVwRGlzcGxheVZhbHVlOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVDdXJyZW50U3RlcERpc3BsYXlWYWx1ZShub2RlTmFtZXNUb0hlYWx0aFBpbGxzLCBoZWFsdGhQaWxsU3RlcEluZGV4LCBhbGxTdGVwc01vZGVFbmFibGVkLCBzcGVjaWZpY0hlYWx0aFBpbGxTdGVwLCBhcmVIZWFsdGhQaWxsc0xvYWRpbmcpIn19LApvYnNlcnZlcnM6WyJfdXBkYXRlQWxlcnRzTGlzdChkZWJ1Z2dlck51bWVyaWNBbGVydHMpIl0scmVhZHk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFpbkNvbnRhaW5lciIpLGM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigidGYtZGFzaGJvYXJkLWxheW91dCAuc2Nyb2xsYmFyIik7YSYmYyYmKGEuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsYy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIil9LF9oZWFsdGhQaWxsc0F2YWlsYWJsZTpmdW5jdGlvbihhLGMpe3JldHVybiBhJiZjfSxfY29tcHV0ZVRlbnNvckNvdW50U3RyaW5nOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGE/YVtjXS50b0ZpeGVkKDApOiIifSxfY29tcHV0ZUhlYWx0aFBpbGxGb3JOb2RlOmZ1bmN0aW9uKGEsYyxkLGYsZyl7aWYoZ3x8IWQpcmV0dXJuIG51bGw7YT1hW2RdO3JldHVybiBhPyhjPWFbZj8wOmNdKT9jLnZhbHVlLnNsaWNlKDIsOCk6bnVsbDpudWxsfSxfY29tcHV0ZUN1cnJlbnRTdGVwRGlzcGxheVZhbHVlOmZ1bmN0aW9uKGEsCmMsZCxmLGcpe2lmKGQpcmV0dXJuIGYudG9GaXhlZCgwKTtpZihnKXJldHVybiAwO2ZvcihsZXQgbCBpbiBhKXJldHVybiBhW2xdW2NdLnN0ZXAudG9GaXhlZCgwKTtyZXR1cm4gMH0sX2NvbXB1dGVCaWdnZXN0U3RlcEV2ZXJTZWVuOmZ1bmN0aW9uKGEpe2ZvcihsZXQgYyBpbiBhKXJldHVybiBhPWFbY10sTWF0aC5tYXgodGhpcy5fYmlnZ2VzdFN0ZXBFdmVyU2VlbixhW2EubGVuZ3RoLTFdLnN0ZXApO3JldHVybiB0aGlzLl9iaWdnZXN0U3RlcEV2ZXJTZWVufHwwfSxfY29tcHV0ZU1heFN0ZXBJbmRleDpmdW5jdGlvbihhKXtmb3IobGV0IGMgaW4gYSlyZXR1cm4gYVtjXS5sZW5ndGgtMTtyZXR1cm4gMH0sX2hhc0RlYnVnZ2VyTnVtZXJpY0FsZXJ0czpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5sZW5ndGh9LF91cGRhdGVBbGVydHNMaXN0OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuJCQoIiNudW1lcmljLWFsZXJ0cy1ib2R5Iik7aWYoYyl7Yy5pbm5lckhUTUw9IiI7Zm9yKHZhciBkPQowO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZj1hW2RdLGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKSxsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7bC5pbm5lckhUTUw9dGYuZ3JhcGgudXRpbC5jb21wdXRlSHVtYW5GcmllbmRseVRpbWUoZi5maXJzdF90aW1lc3RhbXApO2wuY2xhc3NMaXN0LmFkZCgiZmlyc3Qtb2ZmZW5zZS10ZCIpO2cuYXBwZW5kQ2hpbGQobCk7bD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO2wuY2xhc3NMaXN0LmFkZCgidGVuc29yLWRldmljZS10ZCIpO3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2suY2xhc3NMaXN0LmFkZCgidGVuc29yLXNlY3Rpb24td2l0aGluLXRhYmxlIik7ay5pbm5lckhUTUw9Zi50ZW5zb3JfbmFtZTt0aGlzLl9hZGRPcEV4cGFuc2lvbkxpc3RlbmVyKGssZi50ZW5zb3JfbmFtZSk7bC5hcHBlbmRDaGlsZChrKTtrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2suY2xhc3NMaXN0LmFkZCgiZGV2aWNlLXNlY3Rpb24td2l0aGluLXRhYmxlIik7CmsuaW5uZXJIVE1MPSIoIitmLmRldmljZV9uYW1lKyIpIjtsLmFwcGVuZENoaWxkKGspO2cuYXBwZW5kQ2hpbGQobCk7bD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLmNsYXNzTGlzdC5hZGQoIm1pbmktaGVhbHRoLXBpbGwiKTtrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7ay5jbGFzc0xpc3QuYWRkKCJtaW5pLWhlYWx0aC1waWxsLXRkIik7ay5hcHBlbmRDaGlsZChsKTtnLmFwcGVuZENoaWxkKGspO2YubmVnX2luZl9ldmVudF9jb3VudCYmKGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iiksay5jbGFzc0xpc3QuYWRkKCJuZWdhdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIiksay5pbm5lckhUTUw9Zi5uZWdfaW5mX2V2ZW50X2NvdW50LGsuc2V0QXR0cmlidXRlKCJ0aXRsZSIsZi5uZWdfaW5mX2V2ZW50X2NvdW50KyIgZXZlbnRzIHdpdGggLVx1MjIxZSIpLGwuYXBwZW5kQ2hpbGQoaykpO2YucG9zX2luZl9ldmVudF9jb3VudCYmKGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksCmsuY2xhc3NMaXN0LmFkZCgicG9zaXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiIpLGsuaW5uZXJIVE1MPWYucG9zX2luZl9ldmVudF9jb3VudCxrLnNldEF0dHJpYnV0ZSgidGl0bGUiLGYucG9zX2luZl9ldmVudF9jb3VudCsiIGV2ZW50cyB3aXRoICtcdTIyMWUiKSxsLmFwcGVuZENoaWxkKGspKTtmLm5hbl9ldmVudF9jb3VudCYmKGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iiksay5jbGFzc0xpc3QuYWRkKCJuYW4tbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIiksay5pbm5lckhUTUw9Zi5uYW5fZXZlbnRfY291bnQsay5zZXRBdHRyaWJ1dGUoInRpdGxlIixmLm5hbl9ldmVudF9jb3VudCsiIGV2ZW50cyB3aXRoIE5hTiIpLGwuYXBwZW5kQ2hpbGQoaykpO1BvbHltZXIuZG9tKGMpLmFwcGVuZENoaWxkKGcpfX19LF9hZGRPcEV4cGFuc2lvbkxpc3RlbmVyOmZ1bmN0aW9uKGEsYyl7YS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9Pnt2YXIgZD10Zi5ncmFwaC5yZW5kZXIuZXhwYW5kVW50aWxOb2RlSXNTaG93bih0aGlzLnJlbmRlckhpZXJhcmNoeSwKYyksZixnPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInRmLWdyYXBoLWluZm8jZ3JhcGgtaW5mbyIpO2cmJihmPWcuc2Nyb2xsSGVpZ2h0LWcuc2Nyb2xsVG9wKTt2YXIgbD10aGlzLnNlbGVjdGVkTm9kZTt0aGlzLnNldCgic2VsZWN0ZWROb2RlIixkKTtkPSgpPT57Zy5zY3JvbGxUb3A9Zy5zY3JvbGxIZWlnaHQtZn07ZyYmKGw/ZCgpOndpbmRvdy5zZXRUaW1lb3V0KGQsMjApKX0pfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLXNjcm9sbC10YXJnZXQtYmVoYXZpb3IvaXJvbi1zY3JvbGwtdGFyZ2V0LWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uU2Nyb2xsVGFyZ2V0QmVoYXZpb3I9e3Byb3BlcnRpZXM6e3Njcm9sbFRhcmdldDp7dHlwZTpIVE1MRWxlbWVudCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZWZhdWx0U2Nyb2xsVGFyZ2V0fX19LG9ic2VydmVyczpbIl9zY3JvbGxUYXJnZXRDaGFuZ2VkKHNjcm9sbFRhcmdldCwgaXNBdHRhY2hlZCkiXSxfc2hvdWxkSGF2ZUxpc3RlbmVyOiEwLF9zY3JvbGxUYXJnZXRDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7dGhpcy5fb2xkU2Nyb2xsVGFyZ2V0JiYodGhpcy5fdG9nZ2xlU2Nyb2xsTGlzdGVuZXIoITEsdGhpcy5fb2xkU2Nyb2xsVGFyZ2V0KSx0aGlzLl9vbGRTY3JvbGxUYXJnZXQ9bnVsbCk7YyYmKCJkb2N1bWVudCI9PT1hP3RoaXMuc2Nyb2xsVGFyZ2V0PXRoaXMuX2RvYzoic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuc2Nyb2xsVGFyZ2V0PShjPXRoaXMuZG9tSG9zdCkmJmMuJD9jLiRbYV06UG9seW1lci5kb20odGhpcy5vd25lckRvY3VtZW50KS5xdWVyeVNlbGVjdG9yKCIjIisKYSk6dGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpJiYodGhpcy5fb2xkU2Nyb2xsVGFyZ2V0PWEsdGhpcy5fdG9nZ2xlU2Nyb2xsTGlzdGVuZXIodGhpcy5fc2hvdWxkSGF2ZUxpc3RlbmVyLGEpKSl9LF9zY3JvbGxIYW5kbGVyOmZ1bmN0aW9uKCl7fSxnZXQgX2RlZmF1bHRTY3JvbGxUYXJnZXQoKXtyZXR1cm4gdGhpcy5fZG9jfSxnZXQgX2RvYygpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fSxnZXQgX3Njcm9sbFRvcCgpe3JldHVybiB0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCk/dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LnBhZ2VZT2Zmc2V0OnRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcDowfSxnZXQgX3Njcm9sbExlZnQoKXtyZXR1cm4gdGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpP3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5wYWdlWE9mZnNldDp0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxMZWZ0OgowfSxzZXQgX3Njcm9sbFRvcChhKXt0aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cuc2Nyb2xsVG8od2luZG93LnBhZ2VYT2Zmc2V0LGEpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcD1hKX0sc2V0IF9zY3JvbGxMZWZ0KGEpe3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5zY3JvbGxUbyhhLHdpbmRvdy5wYWdlWU9mZnNldCk6dGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpJiYodGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsTGVmdD1hKX0sc2Nyb2xsOmZ1bmN0aW9uKGEsYyl7dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LnNjcm9sbFRvKGEsYyk6dGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpJiYodGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsTGVmdD1hLHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcD1jKX0sZ2V0IF9zY3JvbGxUYXJnZXRXaWR0aCgpe3JldHVybiB0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCk/CnRoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5pbm5lcldpZHRoOnRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldFdpZHRoOjB9LGdldCBfc2Nyb2xsVGFyZ2V0SGVpZ2h0KCl7cmV0dXJuIHRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKT90aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cuaW5uZXJIZWlnaHQ6dGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0SGVpZ2h0OjB9LF9pc1ZhbGlkU2Nyb2xsVGFyZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Nyb2xsVGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnR9LF90b2dnbGVTY3JvbGxMaXN0ZW5lcjpmdW5jdGlvbihhLGMpe2M9Yz09PXRoaXMuX2RvYz93aW5kb3c6YzthP3RoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcnx8KHRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcj10aGlzLl9zY3JvbGxIYW5kbGVyLmJpbmQodGhpcyksYy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcikpOgp0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXImJihjLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyKSx0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXI9bnVsbCl9LHRvZ2dsZVNjcm9sbExpc3RlbmVyOmZ1bmN0aW9uKGEpe3RoaXMuX3Nob3VsZEhhdmVMaXN0ZW5lcj1hO3RoaXMuX3RvZ2dsZVNjcm9sbExpc3RlbmVyKGEsdGhpcy5zY3JvbGxUYXJnZXQpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1saXN0L2lyb24tbGlzdC5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQKD86aG9uZXxhZDsoPzogVTspPyBDUFUpIE9TIChcZCspLyksYz1hJiY4PD1hWzFdLGQ9bnVsbCE9UG9seW1lci5mbHVzaCxmPWQ/UG9seW1lci5Bc3luYy5hbmltYXRpb25GcmFtZTowLGc9ZD9Qb2x5bWVyLkFzeW5jLmlkbGVQZXJpb2Q6MSxsPWQ/UG9seW1lci5Bc3luYy5taWNyb1Rhc2s6MjtQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvcnx8KFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yPXt9KTtQb2x5bWVyKHtpczoiaXJvbi1saXN0Iixwcm9wZXJ0aWVzOntpdGVtczp7dHlwZTpBcnJheX0sYXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpdGVtIn0saW5kZXhBczp7dHlwZTpTdHJpbmcsdmFsdWU6ImluZGV4In0sc2VsZWN0ZWRBczp7dHlwZTpTdHJpbmcsdmFsdWU6InNlbGVjdGVkIn0sZ3JpZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCwKb2JzZXJ2ZXI6Il9ncmlkQ2hhbmdlZCJ9LHNlbGVjdGlvbkVuYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sc2VsZWN0ZWRJdGVtOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LHNlbGVjdGVkSXRlbXM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sbXVsdGlTZWxlY3Rpb246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sc2Nyb2xsT2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZTowfX0sb2JzZXJ2ZXJzOlsiX2l0ZW1zQ2hhbmdlZChpdGVtcy4qKSIsIl9zZWxlY3Rpb25FbmFibGVkQ2hhbmdlZChzZWxlY3Rpb25FbmFibGVkKSIsIl9tdWx0aVNlbGVjdGlvbkNoYW5nZWQobXVsdGlTZWxlY3Rpb24pIiwiX3NldE92ZXJmbG93KHNjcm9sbFRhcmdldCwgc2Nyb2xsT2Zmc2V0KSJdLGJlaGF2aW9yczpbUG9seW1lci5UZW1wbGF0aXplcixQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcixQb2x5bWVyLklyb25TY3JvbGxUYXJnZXRCZWhhdmlvcixQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvcl0sCl9yYXRpbzouNSxfc2Nyb2xsZXJQYWRkaW5nVG9wOjAsX3Njcm9sbFBvc2l0aW9uOjAsX3BoeXNpY2FsU2l6ZTowLF9waHlzaWNhbEF2ZXJhZ2U6MCxfcGh5c2ljYWxBdmVyYWdlQ291bnQ6MCxfcGh5c2ljYWxUb3A6MCxfdmlydHVhbENvdW50OjAsX2VzdFNjcm9sbEhlaWdodDowLF9zY3JvbGxIZWlnaHQ6MCxfdmlld3BvcnRIZWlnaHQ6MCxfdmlld3BvcnRXaWR0aDowLF9waHlzaWNhbEl0ZW1zOm51bGwsX3BoeXNpY2FsU2l6ZXM6bnVsbCxfZmlyc3RWaXNpYmxlSW5kZXhWYWw6bnVsbCxfY29sbGVjdGlvbjpudWxsLF9sYXN0VmlzaWJsZUluZGV4VmFsOm51bGwsX21heFBhZ2VzOjIsX2ZvY3VzZWRJdGVtOm51bGwsX2ZvY3VzZWRWaXJ0dWFsSW5kZXg6LTEsX2ZvY3VzZWRQaHlzaWNhbEluZGV4Oi0xLF9vZmZzY3JlZW5Gb2N1c2VkSXRlbTpudWxsLF9mb2N1c0JhY2tmaWxsSXRlbTpudWxsLF9pdGVtc1BlclJvdzoxLF9pdGVtV2lkdGg6MCxfcm93SGVpZ2h0OjAsX3RlbXBsYXRlQ29zdDowLApfcGFyZW50TW9kZWw6ITAsZ2V0IF9waHlzaWNhbEJvdHRvbSgpe3JldHVybiB0aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9waHlzaWNhbFNpemV9LGdldCBfc2Nyb2xsQm90dG9tKCl7cmV0dXJuIHRoaXMuX3Njcm9sbFBvc2l0aW9uK3RoaXMuX3ZpZXdwb3J0SGVpZ2h0fSxnZXQgX3ZpcnR1YWxFbmQoKXtyZXR1cm4gdGhpcy5fdmlydHVhbFN0YXJ0K3RoaXMuX3BoeXNpY2FsQ291bnQtMX0sZ2V0IF9oaWRkZW5Db250ZW50U2l6ZSgpe3JldHVybih0aGlzLmdyaWQ/dGhpcy5fcGh5c2ljYWxSb3dzKnRoaXMuX3Jvd0hlaWdodDp0aGlzLl9waHlzaWNhbFNpemUpLXRoaXMuX3ZpZXdwb3J0SGVpZ2h0fSxnZXQgX2l0ZW1zUGFyZW50KCl7cmV0dXJuIFBvbHltZXIuZG9tKFBvbHltZXIuZG9tKHRoaXMuX3VzZXJUZW1wbGF0ZSkucGFyZW50Tm9kZSl9LGdldCBfbWF4U2Nyb2xsVG9wKCl7cmV0dXJuIHRoaXMuX2VzdFNjcm9sbEhlaWdodC10aGlzLl92aWV3cG9ydEhlaWdodCt0aGlzLl9zY3JvbGxPZmZzZXR9LApnZXQgX21heFZpcnR1YWxTdGFydCgpe3ZhciBrPXRoaXMuX2NvbnZlcnRJbmRleFRvQ29tcGxldGVSb3codGhpcy5fdmlydHVhbENvdW50KTtyZXR1cm4gTWF0aC5tYXgoMCxrLXRoaXMuX3BoeXNpY2FsQ291bnQpfSxzZXQgX3ZpcnR1YWxTdGFydChrKXtrPXRoaXMuX2NsYW1wKGssMCx0aGlzLl9tYXhWaXJ0dWFsU3RhcnQpO3RoaXMuZ3JpZCYmKGstPWsldGhpcy5faXRlbXNQZXJSb3cpO3RoaXMuX3ZpcnR1YWxTdGFydFZhbD1rfSxnZXQgX3ZpcnR1YWxTdGFydCgpe3JldHVybiB0aGlzLl92aXJ0dWFsU3RhcnRWYWx8fDB9LHNldCBfcGh5c2ljYWxTdGFydChrKXtrJT10aGlzLl9waHlzaWNhbENvdW50OzA+ayYmKGs9dGhpcy5fcGh5c2ljYWxDb3VudCtrKTt0aGlzLmdyaWQmJihrLT1rJXRoaXMuX2l0ZW1zUGVyUm93KTt0aGlzLl9waHlzaWNhbFN0YXJ0VmFsPWt9LGdldCBfcGh5c2ljYWxTdGFydCgpe3JldHVybiB0aGlzLl9waHlzaWNhbFN0YXJ0VmFsfHwwfSxnZXQgX3BoeXNpY2FsRW5kKCl7cmV0dXJuKHRoaXMuX3BoeXNpY2FsU3RhcnQrCnRoaXMuX3BoeXNpY2FsQ291bnQtMSkldGhpcy5fcGh5c2ljYWxDb3VudH0sc2V0IF9waHlzaWNhbENvdW50KGspe3RoaXMuX3BoeXNpY2FsQ291bnRWYWw9a30sZ2V0IF9waHlzaWNhbENvdW50KCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsQ291bnRWYWx8fDB9LGdldCBfb3B0UGh5c2ljYWxTaXplKCl7cmV0dXJuIDA9PT10aGlzLl92aWV3cG9ydEhlaWdodD9JbmZpbml0eTp0aGlzLl92aWV3cG9ydEhlaWdodCp0aGlzLl9tYXhQYWdlc30sZ2V0IF9pc1Zpc2libGUoKXtyZXR1cm4hKCF0aGlzLm9mZnNldFdpZHRoJiYhdGhpcy5vZmZzZXRIZWlnaHQpfSxnZXQgZmlyc3RWaXNpYmxlSW5kZXgoKXt2YXIgaz10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbDtpZihudWxsPT1rKXt2YXIgbj10aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9zY3JvbGxPZmZzZXQ7dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9az10aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24ocCxxKXtuKz10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQocCk7CmlmKG4+dGhpcy5fc2Nyb2xsUG9zaXRpb24pcmV0dXJuIHRoaXMuZ3JpZD9xLXEldGhpcy5faXRlbXNQZXJSb3c6cTtpZih0aGlzLmdyaWQmJnRoaXMuX3ZpcnR1YWxDb3VudC0xPT09cSlyZXR1cm4gcS1xJXRoaXMuX2l0ZW1zUGVyUm93fSl8fDB9cmV0dXJuIGt9LGdldCBsYXN0VmlzaWJsZUluZGV4KCl7dmFyIGs9dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbDtpZihudWxsPT1rKXtpZih0aGlzLmdyaWQpaz1NYXRoLm1pbih0aGlzLl92aXJ0dWFsQ291bnQsdGhpcy5maXJzdFZpc2libGVJbmRleCt0aGlzLl9lc3RSb3dzSW5WaWV3KnRoaXMuX2l0ZW1zUGVyUm93LTEpO2Vsc2V7dmFyIG49dGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0O3RoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihwLHEpe248dGhpcy5fc2Nyb2xsQm90dG9tJiYoaz1xKTtuKz10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQocCl9KX10aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPWt9cmV0dXJuIGt9LApnZXQgX2RlZmF1bHRTY3JvbGxUYXJnZXQoKXtyZXR1cm4gdGhpc30sZ2V0IF92aXJ0dWFsUm93Q291bnQoKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuX3ZpcnR1YWxDb3VudC90aGlzLl9pdGVtc1BlclJvdyl9LGdldCBfZXN0Um93c0luVmlldygpe3JldHVybiBNYXRoLmNlaWwodGhpcy5fdmlld3BvcnRIZWlnaHQvdGhpcy5fcm93SGVpZ2h0KX0sZ2V0IF9waHlzaWNhbFJvd3MoKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuX3BoeXNpY2FsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpfSxnZXQgX3Njcm9sbE9mZnNldCgpe3JldHVybiB0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3ArdGhpcy5zY3JvbGxPZmZzZXR9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fZGlkRm9jdXMuYmluZCh0aGlzKSwhMCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLHRoaXMuX3JlbmRlcixmKTt0aGlzLmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsCiJfcmVzaXplSGFuZGxlciIpO3RoaXMubGlzdGVuKHRoaXMsImtleWRvd24iLCJfa2V5ZG93bkhhbmRsZXIiKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnVubGlzdGVuKHRoaXMsImlyb24tcmVzaXplIiwiX3Jlc2l6ZUhhbmRsZXIiKTt0aGlzLnVubGlzdGVuKHRoaXMsImtleWRvd24iLCJfa2V5ZG93bkhhbmRsZXIiKX0sX3NldE92ZXJmbG93OmZ1bmN0aW9uKGspe3RoaXMuc3R5bGUud2Via2l0T3ZlcmZsb3dTY3JvbGxpbmc9az09PXRoaXM/InRvdWNoIjoiIjt0aGlzLnN0eWxlLm92ZXJmbG93WT1rPT09dGhpcz8iYXV0byI6IiI7dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1udWxsO3RoaXMuX2RlYm91bmNlKCJfcmVuZGVyIix0aGlzLl9yZW5kZXIsZil9LHVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllczpmdW5jdGlvbigpe3ZhciBrPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpO3RoaXMuX3Njcm9sbGVyUGFkZGluZ1RvcD0KdGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzPzA6cGFyc2VJbnQoa1sicGFkZGluZy10b3AiXSwxMCk7dGhpcy5faXNSVEw9InJ0bCI9PT1rLmRpcmVjdGlvbjt0aGlzLl92aWV3cG9ydFdpZHRoPXRoaXMuJC5pdGVtcy5vZmZzZXRXaWR0aDt0aGlzLl92aWV3cG9ydEhlaWdodD10aGlzLl9zY3JvbGxUYXJnZXRIZWlnaHQ7dGhpcy5ncmlkJiZ0aGlzLl91cGRhdGVHcmlkTWV0cmljcygpfSxfc2Nyb2xsSGFuZGxlcjpmdW5jdGlvbigpe3ZhciBrPU1hdGgubWF4KDAsTWF0aC5taW4odGhpcy5fbWF4U2Nyb2xsVG9wLHRoaXMuX3Njcm9sbFRvcCkpLG49ay10aGlzLl9zY3JvbGxQb3NpdGlvbixwPTA8PW47dGhpcy5fc2Nyb2xsUG9zaXRpb249azt0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPW51bGw7TWF0aC5hYnMobik+dGhpcy5fcGh5c2ljYWxTaXplJiYwPHRoaXMuX3BoeXNpY2FsU2l6ZT8obi09dGhpcy5fc2Nyb2xsT2Zmc2V0LHA9TWF0aC5yb3VuZChuLwp0aGlzLl9waHlzaWNhbEF2ZXJhZ2UpKnRoaXMuX2l0ZW1zUGVyUm93LHRoaXMuX3ZpcnR1YWxTdGFydCs9cCx0aGlzLl9waHlzaWNhbFN0YXJ0Kz1wLHRoaXMuX3BoeXNpY2FsVG9wPU1hdGguZmxvb3IodGhpcy5fdmlydHVhbFN0YXJ0L3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2UsdGhpcy5fdXBkYXRlKCkpOjA8dGhpcy5fcGh5c2ljYWxDb3VudCYmKGs9dGhpcy5fZ2V0UmV1c2FibGVzKHApLHA/KHRoaXMuX3BoeXNpY2FsVG9wPWsucGh5c2ljYWxUb3AsdGhpcy5fdmlydHVhbFN0YXJ0Kz1rLmluZGV4ZXMubGVuZ3RoLHRoaXMuX3BoeXNpY2FsU3RhcnQrPWsuaW5kZXhlcy5sZW5ndGgpOih0aGlzLl92aXJ0dWFsU3RhcnQtPWsuaW5kZXhlcy5sZW5ndGgsdGhpcy5fcGh5c2ljYWxTdGFydC09ay5pbmRleGVzLmxlbmd0aCksdGhpcy5fdXBkYXRlKGsuaW5kZXhlcyxwP251bGw6ay5pbmRleGVzKSx0aGlzLl9kZWJvdW5jZSgiX2luY3JlYXNlUG9vbElmTmVlZGVkIiwKdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQuYmluZCh0aGlzLDApLGwpKX0sX2dldFJldXNhYmxlczpmdW5jdGlvbihrKXt2YXIgbj1bXSxwPXRoaXMuX2hpZGRlbkNvbnRlbnRTaXplKnRoaXMuX3JhdGlvLHE9dGhpcy5fdmlydHVhbFN0YXJ0LHI9dGhpcy5fdmlydHVhbEVuZCx0PXRoaXMuX3BoeXNpY2FsQ291bnQsdj10aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9zY3JvbGxPZmZzZXQ7dmFyIHk9dGhpcy5fcGh5c2ljYWxCb3R0b20rdGhpcy5fc2Nyb2xsT2Zmc2V0O3ZhciB6PXRoaXMuX3Njcm9sbFRvcCx4PXRoaXMuX3Njcm9sbEJvdHRvbTtpZihrKXt2YXIgQz10aGlzLl9waHlzaWNhbFN0YXJ0O3k9ei12fWVsc2UgQz10aGlzLl9waHlzaWNhbEVuZCx5LT14O2Zvcig7Oyl7dmFyIEY9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KEMpO3ktPUY7aWYobi5sZW5ndGg+PXR8fHk8PXApYnJlYWs7aWYoayl7aWYocituLmxlbmd0aCsxPj10aGlzLl92aXJ0dWFsQ291bnQpYnJlYWs7CmlmKHYrRj49ei10aGlzLl9zY3JvbGxPZmZzZXQpYnJlYWs7bi5wdXNoKEMpO3YrPUY7Qz0oQysxKSV0fWVsc2V7aWYoMD49cS1uLmxlbmd0aClicmVhaztpZih2K3RoaXMuX3BoeXNpY2FsU2l6ZS1GPD14KWJyZWFrO24ucHVzaChDKTt2LT1GO0M9MD09PUM/dC0xOkMtMX19cmV0dXJue2luZGV4ZXM6bixwaHlzaWNhbFRvcDp2LXRoaXMuX3Njcm9sbE9mZnNldH19LF91cGRhdGU6ZnVuY3Rpb24oayxuKXtpZighKGsmJjA9PT1rLmxlbmd0aHx8MD09PXRoaXMuX3BoeXNpY2FsQ291bnQpKXt0aGlzLl9tYW5hZ2VGb2N1cygpO3RoaXMuX2Fzc2lnbk1vZGVscyhrKTt0aGlzLl91cGRhdGVNZXRyaWNzKGspO2lmKG4pZm9yKDtuLmxlbmd0aDspaz1uLnBvcCgpLHRoaXMuX3BoeXNpY2FsVG9wLT10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQoayk7dGhpcy5fcG9zaXRpb25JdGVtcygpO3RoaXMuX3VwZGF0ZVNjcm9sbGVyU2l6ZSgpfX0sX2NyZWF0ZVBvb2w6ZnVuY3Rpb24oayl7dGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKTsKdmFyIG4scD1BcnJheShrKTtmb3Iobj0wO248aztuKyspe3ZhciBxPXRoaXMuc3RhbXAobnVsbCk7cFtuXT1xLnJvb3QucXVlcnlTZWxlY3RvcigiKiIpO3RoaXMuX2l0ZW1zUGFyZW50LmFwcGVuZENoaWxkKHEucm9vdCl9cmV0dXJuIHB9LF9pc0NsaWVudEZ1bGw6ZnVuY3Rpb24oKXtyZXR1cm4gMCE9dGhpcy5fc2Nyb2xsQm90dG9tJiZ0aGlzLl9waHlzaWNhbEJvdHRvbS0xPj10aGlzLl9zY3JvbGxCb3R0b20mJnRoaXMuX3BoeXNpY2FsVG9wPD10aGlzLl9zY3JvbGxQb3NpdGlvbn0sX2luY3JlYXNlUG9vbElmTmVlZGVkOmZ1bmN0aW9uKGspe2s9dGhpcy5fY2xhbXAodGhpcy5fcGh5c2ljYWxDb3VudCtrLDMsdGhpcy5fdmlydHVhbENvdW50LXRoaXMuX3ZpcnR1YWxTdGFydCk7az10aGlzLl9jb252ZXJ0SW5kZXhUb0NvbXBsZXRlUm93KGspO2lmKHRoaXMuZ3JpZCl7dmFyIG49ayV0aGlzLl9pdGVtc1BlclJvdztuJiZrLW48PXRoaXMuX3BoeXNpY2FsQ291bnQmJihrKz10aGlzLl9pdGVtc1BlclJvdyk7CmstPW59ay09dGhpcy5fcGh5c2ljYWxDb3VudDtuPU1hdGgucm91bmQoLjUqdGhpcy5fcGh5c2ljYWxDb3VudCk7aWYoISgwPmspKXtpZigwPGspe249d2luZG93LnBlcmZvcm1hbmNlLm5vdygpO1tdLnB1c2guYXBwbHkodGhpcy5fcGh5c2ljYWxJdGVtcyx0aGlzLl9jcmVhdGVQb29sKGspKTtmb3IodmFyIHA9MDtwPGs7cCsrKXRoaXMuX3BoeXNpY2FsU2l6ZXMucHVzaCgwKTt0aGlzLl9waHlzaWNhbENvdW50Kz1rO3RoaXMuX3BoeXNpY2FsU3RhcnQ+dGhpcy5fcGh5c2ljYWxFbmQmJnRoaXMuX2lzSW5kZXhSZW5kZXJlZCh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KSYmdGhpcy5fZ2V0UGh5c2ljYWxJbmRleCh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KTx0aGlzLl9waHlzaWNhbEVuZCYmKHRoaXMuX3BoeXNpY2FsU3RhcnQrPWspO3RoaXMuX3VwZGF0ZSgpO3RoaXMuX3RlbXBsYXRlQ29zdD0od2luZG93LnBlcmZvcm1hbmNlLm5vdygpLW4pL2s7bj1NYXRoLnJvdW5kKC41Kgp0aGlzLl9waHlzaWNhbENvdW50KX10aGlzLl92aXJ0dWFsRW5kPj10aGlzLl92aXJ0dWFsQ291bnQtMXx8MD09PW58fCh0aGlzLl9pc0NsaWVudEZ1bGwoKT90aGlzLl9waHlzaWNhbFNpemU8dGhpcy5fb3B0UGh5c2ljYWxTaXplJiZ0aGlzLl9kZWJvdW5jZSgiX2luY3JlYXNlUG9vbElmTmVlZGVkIix0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZC5iaW5kKHRoaXMsdGhpcy5fY2xhbXAoTWF0aC5yb3VuZCg1MC90aGlzLl90ZW1wbGF0ZUNvc3QpLDEsbikpLGcpOnRoaXMuX2RlYm91bmNlKCJfaW5jcmVhc2VQb29sSWZOZWVkZWQiLHRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkLmJpbmQodGhpcyxuKSxsKSl9fSxfcmVuZGVyOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9pc1Zpc2libGUpaWYoMCE9PXRoaXMuX3BoeXNpY2FsQ291bnQpe3ZhciBrPXRoaXMuX2dldFJldXNhYmxlcyghMCk7dGhpcy5fcGh5c2ljYWxUb3A9ay5waHlzaWNhbFRvcDt0aGlzLl92aXJ0dWFsU3RhcnQrPQprLmluZGV4ZXMubGVuZ3RoO3RoaXMuX3BoeXNpY2FsU3RhcnQrPWsuaW5kZXhlcy5sZW5ndGg7dGhpcy5fdXBkYXRlKGsuaW5kZXhlcyk7dGhpcy5fdXBkYXRlKCk7dGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoMCl9ZWxzZSAwPHRoaXMuX3ZpcnR1YWxDb3VudCYmKHRoaXMudXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzKCksdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoMykpfSxfZW5zdXJlVGVtcGxhdGl6ZWQ6ZnVuY3Rpb24oKXtpZighdGhpcy5jdG9yKXsodGhpcy5fdXNlclRlbXBsYXRlPXRoaXMucXVlcnlFZmZlY3RpdmVDaGlsZHJlbigidGVtcGxhdGUiKSl8fGNvbnNvbGUud2FybigiaXJvbi1saXN0IHJlcXVpcmVzIGEgdGVtcGxhdGUgdG8gYmUgcHJvdmlkZWQgaW4gbGlnaHQtZG9tIik7dmFyIGs9e19fa2V5X186ITB9O2tbdGhpcy5hc109ITA7a1t0aGlzLmluZGV4QXNdPSEwO2tbdGhpcy5zZWxlY3RlZEFzXT0hMDtrLnRhYkluZGV4PSEwO3RoaXMuX2luc3RhbmNlUHJvcHM9Cms7dGhpcy50ZW1wbGF0aXplKHRoaXMuX3VzZXJUZW1wbGF0ZSx0aGlzLm11dGFibGVEYXRhKX19LF9ncmlkQ2hhbmdlZDpmdW5jdGlvbihrLG4peyJ1bmRlZmluZWQiIT09dHlwZW9mIG4mJih0aGlzLm5vdGlmeVJlc2l6ZSgpLFBvbHltZXIuZmx1c2g/UG9seW1lci5mbHVzaCgpOlBvbHltZXIuZG9tLmZsdXNoKCksayYmdGhpcy5fdXBkYXRlR3JpZE1ldHJpY3MoKSl9LF9pdGVtc0NoYW5nZWQ6ZnVuY3Rpb24oayl7aWYoIml0ZW1zIj09PWsucGF0aCl0aGlzLl9waHlzaWNhbFRvcD10aGlzLl92aXJ0dWFsU3RhcnQ9MCx0aGlzLl92aXJ0dWFsQ291bnQ9dGhpcy5pdGVtcz90aGlzLml0ZW1zLmxlbmd0aDowLHRoaXMuX2NvbGxlY3Rpb249dGhpcy5pdGVtcyYmUG9seW1lci5Db2xsZWN0aW9uP1BvbHltZXIuQ29sbGVjdGlvbi5nZXQodGhpcy5pdGVtcyk6bnVsbCx0aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5PXt9LHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9Cm51bGwsdGhpcy5fcGh5c2ljYWxDb3VudD10aGlzLl9waHlzaWNhbENvdW50fHwwLHRoaXMuX3BoeXNpY2FsSXRlbXM9dGhpcy5fcGh5c2ljYWxJdGVtc3x8W10sdGhpcy5fcGh5c2ljYWxTaXplcz10aGlzLl9waHlzaWNhbFNpemVzfHxbXSx0aGlzLl9waHlzaWNhbFN0YXJ0PTAsdGhpcy5fc2Nyb2xsVG9wPnRoaXMuX3Njcm9sbE9mZnNldCYmdGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbigwKSx0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpLHRoaXMuX2RlYm91bmNlKCJfcmVuZGVyIix0aGlzLl9yZW5kZXIsZik7ZWxzZSBpZigiaXRlbXMuc3BsaWNlcyI9PT1rLnBhdGgpe3RoaXMuX2FkanVzdFZpcnR1YWxJbmRleChrLnZhbHVlLmluZGV4U3BsaWNlcyk7dGhpcy5fdmlydHVhbENvdW50PXRoaXMuaXRlbXM/dGhpcy5pdGVtcy5sZW5ndGg6MDtpZihrLnZhbHVlLmluZGV4U3BsaWNlcy5zb21lKGZ1bmN0aW9uKHApe3JldHVybiAwPHAuYWRkZWRDb3VudHx8MDxwLnJlbW92ZWQubGVuZ3RofSkpe3ZhciBuPQp0aGlzLl9nZXRBY3RpdmVFbGVtZW50KCk7dGhpcy5jb250YWlucyhuKSYmbi5ibHVyKCl9az1rLnZhbHVlLmluZGV4U3BsaWNlcy5zb21lKGZ1bmN0aW9uKHApe3JldHVybiBwLmluZGV4K3AuYWRkZWRDb3VudD49dGhpcy5fdmlydHVhbFN0YXJ0JiZwLmluZGV4PD10aGlzLl92aXJ0dWFsRW5kfSx0aGlzKTt0aGlzLl9pc0NsaWVudEZ1bGwoKSYmIWt8fHRoaXMuX2RlYm91bmNlKCJfcmVuZGVyIix0aGlzLl9yZW5kZXIsZil9ZWxzZSJpdGVtcy5sZW5ndGgiIT09ay5wYXRoJiZ0aGlzLl9mb3J3YXJkSXRlbVBhdGgoay5wYXRoLGsudmFsdWUpfSxfZm9yd2FyZEl0ZW1QYXRoOmZ1bmN0aW9uKGssbil7az1rLnNsaWNlKDYpO3ZhciBwPWsuaW5kZXhPZigiLiIpOy0xPT09cCYmKHA9ay5sZW5ndGgpO3ZhciBxLHI9dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pO2lmKGQpe3ZhciB0PXBhcnNlSW50KGsuc3Vic3RyaW5nKDAscCksMTApO2lmKHE9dGhpcy5faXNJbmRleFJlbmRlcmVkKHQpKXt2YXIgdj0KdGhpcy5fZ2V0UGh5c2ljYWxJbmRleCh0KTt2YXIgeT10aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9waHlzaWNhbEl0ZW1zW3ZdKX1lbHNlIHImJih5PXIpO2lmKCF5fHx5W3RoaXMuaW5kZXhBc10hPT10KXJldHVybn1lbHNlIGlmKHQ9ay5zdWJzdHJpbmcoMCxwKSxyJiZyLl9fa2V5X189PT10KXk9cjtlbHNlIGlmKHY9dGhpcy5fcGh5c2ljYWxJbmRleEZvcktleVt0XSx5PXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX3BoeXNpY2FsSXRlbXNbdl0pLCF5fHx5Ll9fa2V5X18hPT10KXJldHVybjtrPWsuc3Vic3RyaW5nKHArMSk7az10aGlzLmFzKyhrPyIuIitrOiIiKTtkP3kuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChrLG4sITEsITApOnkubm90aWZ5UGF0aChrLG4sITApO3kuX2ZsdXNoUHJvcGVydGllcyYmeS5fZmx1c2hQcm9wZXJ0aWVzKCEwKTtxJiYodGhpcy5fdXBkYXRlTWV0cmljcyhbdl0pLHRoaXMuX3Bvc2l0aW9uSXRlbXMoKSx0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoKSl9LApfYWRqdXN0VmlydHVhbEluZGV4OmZ1bmN0aW9uKGspe2suZm9yRWFjaChmdW5jdGlvbihuKXtuLnJlbW92ZWQuZm9yRWFjaCh0aGlzLl9yZW1vdmVJdGVtLHRoaXMpO24uaW5kZXg8dGhpcy5fdmlydHVhbFN0YXJ0JiYobj1NYXRoLm1heChuLmFkZGVkQ291bnQtbi5yZW1vdmVkLmxlbmd0aCxuLmluZGV4LXRoaXMuX3ZpcnR1YWxTdGFydCksdGhpcy5fdmlydHVhbFN0YXJ0Kz1uLDA8PXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgmJih0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4Kz1uKSl9LHRoaXMpfSxfcmVtb3ZlSXRlbTpmdW5jdGlvbihrKXt0aGlzLiQuc2VsZWN0b3IuZGVzZWxlY3Qoayk7dGhpcy5fZm9jdXNlZEl0ZW0mJnRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX2ZvY3VzZWRJdGVtKVt0aGlzLmFzXT09PWsmJnRoaXMuX3JlbW92ZUZvY3VzZWRJdGVtKCl9LF9pdGVyYXRlSXRlbXM6ZnVuY3Rpb24oayxuKXt2YXIgcCxxO2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiZuKWZvcihxPQowO3E8bi5sZW5ndGg7cSsrKXt2YXIgcj1uW3FdO3ZhciB0PXRoaXMuX2NvbXB1dGVWaWR4KHIpO2lmKG51bGwhPShwPWsuY2FsbCh0aGlzLHIsdCkpKXJldHVybiBwfWVsc2V7cj10aGlzLl9waHlzaWNhbFN0YXJ0O2Zvcih0PXRoaXMuX3ZpcnR1YWxTdGFydDtyPHRoaXMuX3BoeXNpY2FsQ291bnQ7cisrLHQrKylpZihudWxsIT0ocD1rLmNhbGwodGhpcyxyLHQpKSlyZXR1cm4gcDtmb3Iocj0wO3I8dGhpcy5fcGh5c2ljYWxTdGFydDtyKyssdCsrKWlmKG51bGwhPShwPWsuY2FsbCh0aGlzLHIsdCkpKXJldHVybiBwfX0sX2NvbXB1dGVWaWR4OmZ1bmN0aW9uKGspe3JldHVybiBrPj10aGlzLl9waHlzaWNhbFN0YXJ0P3RoaXMuX3ZpcnR1YWxTdGFydCsoay10aGlzLl9waHlzaWNhbFN0YXJ0KTp0aGlzLl92aXJ0dWFsU3RhcnQrKHRoaXMuX3BoeXNpY2FsQ291bnQtdGhpcy5fcGh5c2ljYWxTdGFydCkra30sX2Fzc2lnbk1vZGVsczpmdW5jdGlvbihrKXt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24obiwKcCl7dmFyIHE9dGhpcy5fcGh5c2ljYWxJdGVtc1tuXSxyPXRoaXMuaXRlbXMmJnRoaXMuaXRlbXNbcF07aWYobnVsbCE9cil7dmFyIHQ9dGhpcy5tb2RlbEZvckVsZW1lbnQocSk7dC5fX2tleV9fPXRoaXMuX2NvbGxlY3Rpb24/dGhpcy5fY29sbGVjdGlvbi5nZXRLZXkocik6bnVsbDt0aGlzLl9mb3J3YXJkUHJvcGVydHkodCx0aGlzLmFzLHIpO3RoaXMuX2ZvcndhcmRQcm9wZXJ0eSh0LHRoaXMuc2VsZWN0ZWRBcyx0aGlzLiQuc2VsZWN0b3IuaXNTZWxlY3RlZChyKSk7dGhpcy5fZm9yd2FyZFByb3BlcnR5KHQsdGhpcy5pbmRleEFzLHApO3RoaXMuX2ZvcndhcmRQcm9wZXJ0eSh0LCJ0YWJJbmRleCIsdGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleD09PXA/MDotMSk7dGhpcy5fcGh5c2ljYWxJbmRleEZvcktleVt0Ll9fa2V5X19dPW47dC5fZmx1c2hQcm9wZXJ0aWVzJiZ0Ll9mbHVzaFByb3BlcnRpZXMoITApO3EucmVtb3ZlQXR0cmlidXRlKCJoaWRkZW4iKX1lbHNlIHEuc2V0QXR0cmlidXRlKCJoaWRkZW4iLAoiIil9LGspfSxfdXBkYXRlTWV0cmljczpmdW5jdGlvbihrKXtQb2x5bWVyLmZsdXNoP1BvbHltZXIuZmx1c2goKTpQb2x5bWVyLmRvbS5mbHVzaCgpO3ZhciBuPTAscD0wLHE9dGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQscj10aGlzLl9waHlzaWNhbEF2ZXJhZ2U7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKHQpe3ArPXRoaXMuX3BoeXNpY2FsU2l6ZXNbdF07dGhpcy5fcGh5c2ljYWxTaXplc1t0XT10aGlzLl9waHlzaWNhbEl0ZW1zW3RdLm9mZnNldEhlaWdodDtuKz10aGlzLl9waHlzaWNhbFNpemVzW3RdO3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50Kz10aGlzLl9waHlzaWNhbFNpemVzW3RdPzE6MH0sayk7dGhpcy5ncmlkPyh0aGlzLl91cGRhdGVHcmlkTWV0cmljcygpLHRoaXMuX3BoeXNpY2FsU2l6ZT1NYXRoLmNlaWwodGhpcy5fcGh5c2ljYWxDb3VudC90aGlzLl9pdGVtc1BlclJvdykqdGhpcy5fcm93SGVpZ2h0KToocD0xPT09dGhpcy5faXRlbXNQZXJSb3c/cDoKTWF0aC5jZWlsKHRoaXMuX3BoeXNpY2FsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3Jvd0hlaWdodCx0aGlzLl9waHlzaWNhbFNpemU9dGhpcy5fcGh5c2ljYWxTaXplK24tcCx0aGlzLl9pdGVtc1BlclJvdz0xKTt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCE9PXEmJih0aGlzLl9waHlzaWNhbEF2ZXJhZ2U9TWF0aC5yb3VuZCgocipxK24pL3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50KSl9LF91cGRhdGVHcmlkTWV0cmljczpmdW5jdGlvbigpe3RoaXMuX2l0ZW1XaWR0aD0wPHRoaXMuX3BoeXNpY2FsQ291bnQ/dGhpcy5fcGh5c2ljYWxJdGVtc1swXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDoyMDA7dGhpcy5fcm93SGVpZ2h0PTA8dGhpcy5fcGh5c2ljYWxDb3VudD90aGlzLl9waHlzaWNhbEl0ZW1zWzBdLm9mZnNldEhlaWdodDoyMDA7dGhpcy5faXRlbXNQZXJSb3c9dGhpcy5faXRlbVdpZHRoP01hdGguZmxvb3IodGhpcy5fdmlld3BvcnRXaWR0aC90aGlzLl9pdGVtV2lkdGgpOgp0aGlzLl9pdGVtc1BlclJvd30sX3Bvc2l0aW9uSXRlbXM6ZnVuY3Rpb24oKXt0aGlzLl9hZGp1c3RTY3JvbGxQb3NpdGlvbigpO3ZhciBrPXRoaXMuX3BoeXNpY2FsVG9wO2lmKHRoaXMuZ3JpZCl7dmFyIG49KHRoaXMuX3ZpZXdwb3J0V2lkdGgtdGhpcy5faXRlbXNQZXJSb3cqdGhpcy5faXRlbVdpZHRoKS8yO3RoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihwLHEpe3ZhciByPU1hdGguZmxvb3IocSV0aGlzLl9pdGVtc1BlclJvdyp0aGlzLl9pdGVtV2lkdGgrbik7dGhpcy5faXNSVEwmJihyKj0tMSk7dGhpcy50cmFuc2xhdGUzZChyKyJweCIsaysicHgiLDAsdGhpcy5fcGh5c2ljYWxJdGVtc1twXSk7dGhpcy5fc2hvdWxkUmVuZGVyTmV4dFJvdyhxKSYmKGsrPXRoaXMuX3Jvd0hlaWdodCl9KX1lbHNlIHRoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihwKXt0aGlzLnRyYW5zbGF0ZTNkKDAsaysicHgiLDAsdGhpcy5fcGh5c2ljYWxJdGVtc1twXSk7ays9dGhpcy5fcGh5c2ljYWxTaXplc1twXX0pfSwKX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudDpmdW5jdGlvbihrKXtyZXR1cm4gdGhpcy5ncmlkP3RoaXMuX2NvbXB1dGVWaWR4KGspJXRoaXMuX2l0ZW1zUGVyUm93IT09dGhpcy5faXRlbXNQZXJSb3ctMT8wOnRoaXMuX3Jvd0hlaWdodDp0aGlzLl9waHlzaWNhbFNpemVzW2tdfSxfc2hvdWxkUmVuZGVyTmV4dFJvdzpmdW5jdGlvbihrKXtyZXR1cm4gayV0aGlzLl9pdGVtc1BlclJvdz09PXRoaXMuX2l0ZW1zUGVyUm93LTF9LF9hZGp1c3RTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBrPTA9PT10aGlzLl92aXJ0dWFsU3RhcnQ/dGhpcy5fcGh5c2ljYWxUb3A6TWF0aC5taW4odGhpcy5fc2Nyb2xsUG9zaXRpb24rdGhpcy5fcGh5c2ljYWxUb3AsMCk7aWYoMCE9PWspe3RoaXMuX3BoeXNpY2FsVG9wLT1rO3ZhciBuPXRoaXMuX3Njcm9sbFRvcDshYyYmMDxuJiZ0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKG4tayl9fSxfcmVzZXRTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbihrKXt0aGlzLnNjcm9sbFRhcmdldCYmCjA8PWsmJih0aGlzLl9zY3JvbGxQb3NpdGlvbj10aGlzLl9zY3JvbGxUb3A9ayl9LF91cGRhdGVTY3JvbGxlclNpemU6ZnVuY3Rpb24oayl7dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0PXRoaXMuZ3JpZD90aGlzLl92aXJ0dWFsUm93Q291bnQqdGhpcy5fcm93SGVpZ2h0OnRoaXMuX3BoeXNpY2FsQm90dG9tK01hdGgubWF4KHRoaXMuX3ZpcnR1YWxDb3VudC10aGlzLl9waHlzaWNhbENvdW50LXRoaXMuX3ZpcnR1YWxTdGFydCwwKSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2U7aWYoKGs9KGs9KGs9a3x8MD09PXRoaXMuX3Njcm9sbEhlaWdodCl8fHRoaXMuX3Njcm9sbFBvc2l0aW9uPj10aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fcGh5c2ljYWxTaXplKXx8dGhpcy5ncmlkJiZ0aGlzLiQuaXRlbXMuc3R5bGUuaGVpZ2h0PHRoaXMuX2VzdFNjcm9sbEhlaWdodCl8fE1hdGguYWJzKHRoaXMuX2VzdFNjcm9sbEhlaWdodC10aGlzLl9zY3JvbGxIZWlnaHQpPj10aGlzLl92aWV3cG9ydEhlaWdodCl0aGlzLiQuaXRlbXMuc3R5bGUuaGVpZ2h0PQp0aGlzLl9lc3RTY3JvbGxIZWlnaHQrInB4Iix0aGlzLl9zY3JvbGxIZWlnaHQ9dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0fSxzY3JvbGxUb0l0ZW06ZnVuY3Rpb24oayl7cmV0dXJuIHRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLml0ZW1zLmluZGV4T2YoaykpfSxzY3JvbGxUb0luZGV4OmZ1bmN0aW9uKGspe2lmKCEoIm51bWJlciIhPT10eXBlb2Yga3x8MD5rfHxrPnRoaXMuaXRlbXMubGVuZ3RoLTEpJiYoUG9seW1lci5mbHVzaD9Qb2x5bWVyLmZsdXNoKCk6UG9seW1lci5kb20uZmx1c2goKSwwIT09dGhpcy5fcGh5c2ljYWxDb3VudCkpe2s9dGhpcy5fY2xhbXAoaywwLHRoaXMuX3ZpcnR1YWxDb3VudC0xKTtpZighdGhpcy5faXNJbmRleFJlbmRlcmVkKGspfHxrPj10aGlzLl9tYXhWaXJ0dWFsU3RhcnQpdGhpcy5fdmlydHVhbFN0YXJ0PXRoaXMuZ3JpZD9rLTIqdGhpcy5faXRlbXNQZXJSb3c6ay0xO3RoaXMuX21hbmFnZUZvY3VzKCk7dGhpcy5fYXNzaWduTW9kZWxzKCk7dGhpcy5fdXBkYXRlTWV0cmljcygpOwp0aGlzLl9waHlzaWNhbFRvcD1NYXRoLmZsb29yKHRoaXMuX3ZpcnR1YWxTdGFydC90aGlzLl9pdGVtc1BlclJvdykqdGhpcy5fcGh5c2ljYWxBdmVyYWdlO2Zvcih2YXIgbj10aGlzLl9waHlzaWNhbFN0YXJ0LHA9dGhpcy5fdmlydHVhbFN0YXJ0LHE9MCxyPXRoaXMuX2hpZGRlbkNvbnRlbnRTaXplO3A8ayYmcTw9cjspcSs9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KG4pLG49KG4rMSkldGhpcy5fcGh5c2ljYWxDb3VudCxwKys7dGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCEwKTt0aGlzLl9wb3NpdGlvbkl0ZW1zKCk7dGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbih0aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9zY3JvbGxPZmZzZXQrcSk7dGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoMCk7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsfX0sX3Jlc2V0QXZlcmFnZTpmdW5jdGlvbigpe3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50PQp0aGlzLl9waHlzaWNhbEF2ZXJhZ2U9MH0sX3Jlc2l6ZUhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsZnVuY3Rpb24oKXt0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPW51bGw7dGhpcy51cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXMoKTt0aGlzLl9pc1Zpc2libGU/KHRoaXMudG9nZ2xlU2Nyb2xsTGlzdGVuZXIoITApLHRoaXMuX3Jlc2V0QXZlcmFnZSgpLHRoaXMuX3JlbmRlcigpKTp0aGlzLnRvZ2dsZVNjcm9sbExpc3RlbmVyKCExKX0sZil9LHNlbGVjdEl0ZW06ZnVuY3Rpb24oayl7cmV0dXJuIHRoaXMuc2VsZWN0SW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKGspKX0sc2VsZWN0SW5kZXg6ZnVuY3Rpb24oayl7aWYoISgwPmt8fGs+PXRoaXMuX3ZpcnR1YWxDb3VudCkpeyF0aGlzLm11bHRpU2VsZWN0aW9uJiZ0aGlzLnNlbGVjdGVkSXRlbSYmdGhpcy5jbGVhclNlbGVjdGlvbigpO2lmKHRoaXMuX2lzSW5kZXhSZW5kZXJlZChrKSl7dmFyIG49CnRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZ2V0UGh5c2ljYWxJbmRleChrKV0pO24mJihuW3RoaXMuc2VsZWN0ZWRBc109ITApO3RoaXMudXBkYXRlU2l6ZUZvckluZGV4KGspfXRoaXMuJC5zZWxlY3Rvci5zZWxlY3RJbmRleD90aGlzLiQuc2VsZWN0b3Iuc2VsZWN0SW5kZXgoayk6dGhpcy4kLnNlbGVjdG9yLnNlbGVjdCh0aGlzLml0ZW1zW2tdKX19LGRlc2VsZWN0SXRlbTpmdW5jdGlvbihrKXtyZXR1cm4gdGhpcy5kZXNlbGVjdEluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZihrKSl9LGRlc2VsZWN0SW5kZXg6ZnVuY3Rpb24oayl7MD5rfHxrPj10aGlzLl92aXJ0dWFsQ291bnR8fCh0aGlzLl9pc0luZGV4UmVuZGVyZWQoaykmJih0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgoayldKVt0aGlzLnNlbGVjdGVkQXNdPSExLHRoaXMudXBkYXRlU2l6ZUZvckluZGV4KGspKSx0aGlzLiQuc2VsZWN0b3IuZGVzZWxlY3RJbmRleD8KdGhpcy4kLnNlbGVjdG9yLmRlc2VsZWN0SW5kZXgoayk6dGhpcy4kLnNlbGVjdG9yLmRlc2VsZWN0KHRoaXMuaXRlbXNba10pKX0sdG9nZ2xlU2VsZWN0aW9uRm9ySXRlbTpmdW5jdGlvbihrKXtyZXR1cm4gdGhpcy50b2dnbGVTZWxlY3Rpb25Gb3JJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YoaykpfSx0b2dnbGVTZWxlY3Rpb25Gb3JJbmRleDpmdW5jdGlvbihrKXsodGhpcy4kLnNlbGVjdG9yLmlzSW5kZXhTZWxlY3RlZD90aGlzLiQuc2VsZWN0b3IuaXNJbmRleFNlbGVjdGVkKGspOnRoaXMuJC5zZWxlY3Rvci5pc1NlbGVjdGVkKHRoaXMuaXRlbXNba10pKT90aGlzLmRlc2VsZWN0SW5kZXgoayk6dGhpcy5zZWxlY3RJbmRleChrKX0sY2xlYXJTZWxlY3Rpb246ZnVuY3Rpb24oKXt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24oayl7dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1trXSlbdGhpcy5zZWxlY3RlZEFzXT0hMX0pO3RoaXMuJC5zZWxlY3Rvci5jbGVhclNlbGVjdGlvbigpfSwKX3NlbGVjdGlvbkVuYWJsZWRDaGFuZ2VkOmZ1bmN0aW9uKGspeyhrP3RoaXMubGlzdGVuOnRoaXMudW5saXN0ZW4pLmNhbGwodGhpcyx0aGlzLCJ0YXAiLCJfc2VsZWN0aW9uSGFuZGxlciIpfSxfc2VsZWN0aW9uSGFuZGxlcjpmdW5jdGlvbihrKXt2YXIgbj10aGlzLm1vZGVsRm9yRWxlbWVudChrLnRhcmdldCk7aWYobil7dmFyIHA9UG9seW1lci5kb20oaykucGF0aFswXTtrPXRoaXMuX2dldEFjdGl2ZUVsZW1lbnQoKTt2YXIgcT10aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgoblt0aGlzLmluZGV4QXNdKV07aWYoImlucHV0IiE9PXAubG9jYWxOYW1lJiYiYnV0dG9uIiE9PXAubG9jYWxOYW1lJiYic2VsZWN0IiE9PXAubG9jYWxOYW1lKXtwPW4udGFiSW5kZXg7bi50YWJJbmRleD0tMTAwO3ZhciByPWs/ay50YWJJbmRleDotMTtuLnRhYkluZGV4PXA7ayYmcSE9PWsmJnEuY29udGFpbnMoaykmJi0xMDAhPT1yfHx0aGlzLnRvZ2dsZVNlbGVjdGlvbkZvckl0ZW0oblt0aGlzLmFzXSl9fX0sCl9tdWx0aVNlbGVjdGlvbkNoYW5nZWQ6ZnVuY3Rpb24oayl7dGhpcy5jbGVhclNlbGVjdGlvbigpO3RoaXMuJC5zZWxlY3Rvci5tdWx0aT1rfSx1cGRhdGVTaXplRm9ySXRlbTpmdW5jdGlvbihrKXtyZXR1cm4gdGhpcy51cGRhdGVTaXplRm9ySW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKGspKX0sdXBkYXRlU2l6ZUZvckluZGV4OmZ1bmN0aW9uKGspe2lmKCF0aGlzLl9pc0luZGV4UmVuZGVyZWQoaykpcmV0dXJuIG51bGw7dGhpcy5fdXBkYXRlTWV0cmljcyhbdGhpcy5fZ2V0UGh5c2ljYWxJbmRleChrKV0pO3RoaXMuX3Bvc2l0aW9uSXRlbXMoKTtyZXR1cm4gbnVsbH0sX21hbmFnZUZvY3VzOmZ1bmN0aW9uKCl7dmFyIGs9dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleDswPD1rJiZrPHRoaXMuX3ZpcnR1YWxDb3VudD90aGlzLl9pc0luZGV4UmVuZGVyZWQoayk/dGhpcy5fcmVzdG9yZUZvY3VzZWRJdGVtKCk6dGhpcy5fY3JlYXRlRm9jdXNCYWNrZmlsbEl0ZW0oKTowPHRoaXMuX3ZpcnR1YWxDb3VudCYmCjA8dGhpcy5fcGh5c2ljYWxDb3VudCYmKHRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX3BoeXNpY2FsU3RhcnQsdGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleD10aGlzLl92aXJ0dWFsU3RhcnQsdGhpcy5fZm9jdXNlZEl0ZW09dGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9waHlzaWNhbFN0YXJ0XSl9LF9jb252ZXJ0SW5kZXhUb0NvbXBsZXRlUm93OmZ1bmN0aW9uKGspe3RoaXMuX2l0ZW1zUGVyUm93PXRoaXMuX2l0ZW1zUGVyUm93fHwxO3JldHVybiB0aGlzLmdyaWQ/TWF0aC5jZWlsKGsvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX2l0ZW1zUGVyUm93Omt9LF9pc0luZGV4UmVuZGVyZWQ6ZnVuY3Rpb24oayl7cmV0dXJuIGs+PXRoaXMuX3ZpcnR1YWxTdGFydCYmazw9dGhpcy5fdmlydHVhbEVuZH0sX2lzSW5kZXhWaXNpYmxlOmZ1bmN0aW9uKGspe3JldHVybiBrPj10aGlzLmZpcnN0VmlzaWJsZUluZGV4JiZrPD10aGlzLmxhc3RWaXNpYmxlSW5kZXh9LF9nZXRQaHlzaWNhbEluZGV4OmZ1bmN0aW9uKGspe3JldHVybiBkPwoodGhpcy5fcGh5c2ljYWxTdGFydCsoay10aGlzLl92aXJ0dWFsU3RhcnQpKSV0aGlzLl9waHlzaWNhbENvdW50OnRoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbdGhpcy5fY29sbGVjdGlvbi5nZXRLZXkodGhpcy5pdGVtc1trXSldfSxmb2N1c0l0ZW06ZnVuY3Rpb24oayl7dGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0oayl9LF9mb2N1c1BoeXNpY2FsSXRlbTpmdW5jdGlvbihrKXtpZighKDA+a3x8az49dGhpcy5fdmlydHVhbENvdW50KSl7dGhpcy5fcmVzdG9yZUZvY3VzZWRJdGVtKCk7dGhpcy5faXNJbmRleFJlbmRlcmVkKGspfHx0aGlzLnNjcm9sbFRvSW5kZXgoayk7dmFyIG49dGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9nZXRQaHlzaWNhbEluZGV4KGspXSxwPXRoaXMubW9kZWxGb3JFbGVtZW50KG4pLHE7cC50YWJJbmRleD0tMTAwOy0xMDA9PT1uLnRhYkluZGV4JiYocT1uKTtxfHwocT1Qb2x5bWVyLmRvbShuKS5xdWVyeVNlbGVjdG9yKCdbdGFiaW5kZXhceDNkIi0xMDAiXScpKTsKcC50YWJJbmRleD0wO3RoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9aztxJiZxLmZvY3VzKCl9fSxfcmVtb3ZlRm9jdXNlZEl0ZW06ZnVuY3Rpb24oKXt0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSYmdGhpcy5faXRlbXNQYXJlbnQucmVtb3ZlQ2hpbGQodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pO3RoaXMuX2ZvY3VzZWRJdGVtPXRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtPXRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtPW51bGw7dGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXg9dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleD0tMX0sX2NyZWF0ZUZvY3VzQmFja2ZpbGxJdGVtOmZ1bmN0aW9uKCl7dmFyIGs9dGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXg7aWYoISh0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbXx8MD50aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KSl7aWYoIXRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtKXt2YXIgbj10aGlzLnN0YW1wKG51bGwpO3RoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtPQpuLnJvb3QucXVlcnlTZWxlY3RvcigiKiIpO3RoaXMuX2l0ZW1zUGFyZW50LmFwcGVuZENoaWxkKG4ucm9vdCl9dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW09dGhpcy5fcGh5c2ljYWxJdGVtc1trXTt0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSkudGFiSW5kZXg9MDt0aGlzLl9waHlzaWNhbEl0ZW1zW2tdPXRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtO3RoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PWs7dGhpcy50cmFuc2xhdGUzZCgwLCItMTAwMDBweCIsMCx0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSl9fSxfcmVzdG9yZUZvY3VzZWRJdGVtOmZ1bmN0aW9uKCl7aWYodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0mJiEoMD50aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KSl7dGhpcy5fYXNzaWduTW9kZWxzKCk7dmFyIGs9dGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXg9dGhpcy5fZ2V0UGh5c2ljYWxJbmRleCh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KSwKbj10aGlzLl9waHlzaWNhbEl0ZW1zW2tdO2lmKG4pe3ZhciBwPXRoaXMubW9kZWxGb3JFbGVtZW50KG4pLHE9dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pO3BbdGhpcy5hc109PT1xW3RoaXMuYXNdPyh0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT1uLHAudGFiSW5kZXg9LTEsdGhpcy5fcGh5c2ljYWxJdGVtc1trXT10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSx0aGlzLnRyYW5zbGF0ZTNkKDAsIi0xMDAwMHB4IiwwLHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtKSk6KHRoaXMuX3JlbW92ZUZvY3VzZWRJdGVtKCksdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW09bnVsbCk7dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW09bnVsbH19fSxfZGlkRm9jdXM6ZnVuY3Rpb24oayl7az10aGlzLm1vZGVsRm9yRWxlbWVudChrLnRhcmdldCk7dmFyIG49dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fZm9jdXNlZEl0ZW0pLHA9bnVsbCE9PXRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtLApxPXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg7ayYmKG49PT1rP3RoaXMuX2lzSW5kZXhWaXNpYmxlKHEpfHx0aGlzLnNjcm9sbFRvSW5kZXgocSk6KHRoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpLG4mJihuLnRhYkluZGV4PS0xKSxrLnRhYkluZGV4PTAsdGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleD1xPWtbdGhpcy5pbmRleEFzXSx0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleD10aGlzLl9nZXRQaHlzaWNhbEluZGV4KHEpLHRoaXMuX2ZvY3VzZWRJdGVtPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXhdLHAmJiF0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSYmdGhpcy5fdXBkYXRlKCkpKX0sX2tleWRvd25IYW5kbGVyOmZ1bmN0aW9uKGspe3N3aXRjaChrLmtleUNvZGUpe2Nhc2UgNDA6dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleDx0aGlzLl92aXJ0dWFsQ291bnQtMSYmay5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgrCih0aGlzLmdyaWQ/dGhpcy5faXRlbXNQZXJSb3c6MSkpO2JyZWFrO2Nhc2UgMzk6dGhpcy5ncmlkJiZ0aGlzLl9mb2N1c1BoeXNpY2FsSXRlbSh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4Kyh0aGlzLl9pc1JUTD8tMToxKSk7YnJlYWs7Y2FzZSAzODowPHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgmJmsucHJldmVudERlZmF1bHQoKTt0aGlzLl9mb2N1c1BoeXNpY2FsSXRlbSh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4LSh0aGlzLmdyaWQ/dGhpcy5faXRlbXNQZXJSb3c6MSkpO2JyZWFrO2Nhc2UgMzc6dGhpcy5ncmlkJiZ0aGlzLl9mb2N1c1BoeXNpY2FsSXRlbSh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4Kyh0aGlzLl9pc1JUTD8xOi0xKSk7YnJlYWs7Y2FzZSAxMzp0aGlzLl9mb2N1c1BoeXNpY2FsSXRlbSh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KSx0aGlzLnNlbGVjdGlvbkVuYWJsZWQmJnRoaXMuX3NlbGVjdGlvbkhhbmRsZXIoayl9fSxfY2xhbXA6ZnVuY3Rpb24oaywKbixwKXtyZXR1cm4gTWF0aC5taW4ocCxNYXRoLm1heChuLGspKX0sX2RlYm91bmNlOmZ1bmN0aW9uKGssbixwKXtkPyh0aGlzLl9kZWJvdW5jZXJzPXRoaXMuX2RlYm91bmNlcnN8fHt9LHRoaXMuX2RlYm91bmNlcnNba109UG9seW1lci5EZWJvdW5jZXIuZGVib3VuY2UodGhpcy5fZGVib3VuY2Vyc1trXSxwLG4uYmluZCh0aGlzKSksUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyKHRoaXMuX2RlYm91bmNlcnNba10pKTpQb2x5bWVyLmRvbS5hZGREZWJvdW5jZXIodGhpcy5kZWJvdW5jZShrLG4pKX0sX2ZvcndhcmRQcm9wZXJ0eTpmdW5jdGlvbihrLG4scCl7ZD9rLl9zZXRQZW5kaW5nUHJvcGVydHkobixwKTprW25dPXB9LF9mb3J3YXJkSG9zdFByb3BWMjpmdW5jdGlvbihrLG4peyh0aGlzLl9waHlzaWNhbEl0ZW1zfHxbXSkuY29uY2F0KFt0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSx0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbV0pLmZvckVhY2goZnVuY3Rpb24ocCl7cCYmdGhpcy5tb2RlbEZvckVsZW1lbnQocCkuZm9yd2FyZEhvc3RQcm9wKGssCm4pfSx0aGlzKX0sX25vdGlmeUluc3RhbmNlUHJvcFYyOmZ1bmN0aW9uKGssbixwKXtQb2x5bWVyLlBhdGgubWF0Y2hlcyh0aGlzLmFzLG4pJiYoaz1rW3RoaXMuaW5kZXhBc10sbj09dGhpcy5hcyYmKHRoaXMuaXRlbXNba109cCksdGhpcy5ub3RpZnlQYXRoKFBvbHltZXIuUGF0aC50cmFuc2xhdGUodGhpcy5hcywiaXRlbXMuIitrLG4pLHApKX0sX2dldFN0YW1wZWRDaGlsZHJlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9waHlzaWNhbEl0ZW1zfSxfZm9yd2FyZEluc3RhbmNlUGF0aDpmdW5jdGlvbihrLG4scCl7MD09PW4uaW5kZXhPZih0aGlzLmFzKyIuIikmJnRoaXMubm90aWZ5UGF0aCgiaXRlbXMuIitrLl9fa2V5X18rIi4iK24uc2xpY2UodGhpcy5hcy5sZW5ndGgrMSkscCl9LF9mb3J3YXJkUGFyZW50UGF0aDpmdW5jdGlvbihrLG4peyh0aGlzLl9waHlzaWNhbEl0ZW1zfHxbXSkuY29uY2F0KFt0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSx0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbV0pLmZvckVhY2goZnVuY3Rpb24ocCl7cCYmCnRoaXMubW9kZWxGb3JFbGVtZW50KHApLm5vdGlmeVBhdGgoayxuLCEwKX0sdGhpcyl9LF9mb3J3YXJkUGFyZW50UHJvcDpmdW5jdGlvbihrLG4peyh0aGlzLl9waHlzaWNhbEl0ZW1zfHxbXSkuY29uY2F0KFt0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSx0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbV0pLmZvckVhY2goZnVuY3Rpb24ocCl7cCYmKHRoaXMubW9kZWxGb3JFbGVtZW50KHApW2tdPW4pfSx0aGlzKX0sX2dldEFjdGl2ZUVsZW1lbnQ6ZnVuY3Rpb24oKXt2YXIgaz10aGlzLl9pdGVtc1BhcmVudC5ub2RlLmRvbUhvc3Q7cmV0dXJuIFBvbHltZXIuZG9tKGs/ay5yb290OmRvY3VtZW50KS5hY3RpdmVFbGVtZW50fX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1pdGVtL3BhcGVyLWl0ZW0tYm9keS5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1pdGVtLWJvZHkifSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3RmLWdyYXBoLWljb24uanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7bGV0IGY7KGZ1bmN0aW9uKGcpe2cuQ09OU1Q9IkNPTlNUIjtnLk1FVEE9Ik1FVEEiO2cuT1A9Ik9QIjtnLlNFUklFUz0iU0VSSUVTIjtnLlNVTU1BUlk9IlNVTU1BUlkifSkoZj1kLkdyYXBoSWNvblR5cGV8fChkLkdyYXBoSWNvblR5cGU9e30pKTtQb2x5bWVyKHtpczoidGYtZ3JhcGgtaWNvbiIscHJvcGVydGllczp7dHlwZTpTdHJpbmcsdmVydGljYWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZmlsbE92ZXJyaWRlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxzdHJva2VPdmVycmlkZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0saGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZToyMH0sZmFkZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2ZpbGw6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUZpbGwodHlwZSwgZmlsbE92ZXJyaWRlKSJ9LF9zdHJva2U6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVN0cm9rZSh0eXBlLCBzdHJva2VPdmVycmlkZSkifX0sCmdldFN2Z0RlZmluYWJsZUVsZW1lbnQoKXtyZXR1cm4gdGhpcy4kLnN2Z0RlZnN9LF9jb21wdXRlRmlsbChnLGwpe2lmKG51bGwhPWwpcmV0dXJuIGw7c3dpdGNoKGcpe2Nhc2UgZi5NRVRBOnJldHVybiBhLmdyYXBoLnJlbmRlci5NZXRhbm9kZUNvbG9ycy5ERUZBVUxUX0ZJTEw7Y2FzZSBmLlNFUklFUzpyZXR1cm4gYS5ncmFwaC5yZW5kZXIuU2VyaWVzTm9kZUNvbG9ycy5ERUZBVUxUX0ZJTEw7ZGVmYXVsdDpyZXR1cm4gYS5ncmFwaC5yZW5kZXIuT3BOb2RlQ29sb3JzLkRFRkFVTFRfRklMTH19LF9jb21wdXRlU3Ryb2tlKGcsbCl7aWYobnVsbCE9bClyZXR1cm4gbDtzd2l0Y2goZyl7Y2FzZSBmLk1FVEE6cmV0dXJuIGEuZ3JhcGgucmVuZGVyLk1ldGFub2RlQ29sb3JzLkRFRkFVTFRfU1RST0tFO2Nhc2UgZi5TRVJJRVM6cmV0dXJuIGEuZ3JhcGgucmVuZGVyLlNlcmllc05vZGVDb2xvcnMuREVGQVVMVF9TVFJPS0U7ZGVmYXVsdDpyZXR1cm4gYS5ncmFwaC5yZW5kZXIuT3BOb2RlQ29sb3JzLkRFRkFVTFRfU1RST0tFfX0sCl9pc1R5cGUoZyxsKXtyZXR1cm4gZz09PWx9LF9mYWRlZENsYXNzOmZ1bmN0aW9uKGcsbCl7cmV0dXJuIGc/ImZhZGVkLSIrbDoiIn19KX0pKGMuaWNvbnx8KGMuaWNvbj17fSkpfSkoYS5ncmFwaHx8KGEuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vdGYtbm9kZS1pY29uLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLW5vZGUtaWNvbiIscHJvcGVydGllczp7bm9kZTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0scmVuZGVySW5mbzp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sY29sb3JCeTp7dHlwZTpPYmplY3QsdmFsdWU6InN0cnVjdHVyYWwifSx0ZW1wbGF0ZUluZGV4Ont0eXBlOkZ1bmN0aW9uLHZhbHVlOm51bGx9LHR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHZlcnRpY2FsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGNvbnN0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHN1bW1hcnk6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZmlsbDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0saGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZToyMH0sX2ZpbGxPdmVycmlkZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlRmlsbE92ZXJyaWRlKG5vZGUsIHJlbmRlckluZm8sIGNvbG9yQnksIHRlbXBsYXRlSW5kZXgsIGZpbGwpIixvYnNlcnZlcjoiX29uRmlsbE92ZXJyaWRlQ2hhbmdlZCJ9fSwKX2NvbXB1dGVGaWxsT3ZlcnJpZGU6ZnVuY3Rpb24oYSxjLGQsZixnKXtyZXR1cm4gYSYmYyYmZCYmZj8oYT10Zi5ncmFwaC5zY2VuZS5ub2RlLGEuZ2V0RmlsbEZvck5vZGUoZixhLkNvbG9yQnlbZC50b1VwcGVyQ2FzZSgpXSxjLCExKSk6Z30sX2dldFN0cm9rZU92ZXJyaWRlOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RmLmdyYXBoLnNjZW5lLm5vZGUuZ2V0U3Ryb2tlRm9yRmlsbChhKTpudWxsfSxfZ2V0VHlwZTpmdW5jdGlvbihhLGMsZCxmKXtjb25zdCB7R3JhcGhJY29uVHlwZTpnfT10Zi5ncmFwaC5pY29uO2lmKGEpc3dpdGNoKGEudHlwZSl7Y2FzZSB0Zi5ncmFwaC5Ob2RlVHlwZS5PUDpyZXR1cm4gYT1hLm9wLCJzdHJpbmciIT09dHlwZW9mIGE/Zy5PUDoiQ29uc3QiPT09YXx8ZD9nLkNPTlNUOmEuZW5kc1dpdGgoIlN1bW1hcnkiKXx8Yz9nLlNVTU1BUlk6Zy5PUDtjYXNlIHRmLmdyYXBoLk5vZGVUeXBlLk1FVEE6cmV0dXJuIGcuTUVUQTtjYXNlIHRmLmdyYXBoLk5vZGVUeXBlLlNFUklFUzpyZXR1cm4gZy5TRVJJRVN9cmV0dXJuIGZ9LApfaXNWZXJ0aWNhbDpmdW5jdGlvbihhLGMpe3JldHVybiBhP2EuaGFzTm9uQ29udHJvbEVkZ2VzOiEhY30sX2dldEZhZGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmlzRmFkZWRPdXR9LF9vbkZpbGxPdmVycmlkZUNoYW5nZWQoYSxjKXtjb25zdCB7bm9kZTpkLHJlbmRlckluZm86Zixjb2xvckJ5OmcsdGVtcGxhdGVJbmRleDpsfT10aGlzLGs9dGYuZ3JhcGguc2NlbmUubm9kZTthIT09YyYmay5yZW1vdmVHcmFkaWVudERlZmluaXRpb25zKHRoaXMuJC5pY29uLmdldFN2Z0RlZmluYWJsZUVsZW1lbnQoKSk7ZCYmZiYmZyYmbCYmay5nZXRGaWxsRm9yTm9kZShsLGsuQ29sb3JCeVtnLnRvVXBwZXJDYXNlKCldLGYsITEsdGhpcy4kLmljb24uZ2V0U3ZnRGVmaW5hYmxlRWxlbWVudCgpKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtb3AtY29tcGF0LWNhcmQvdGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1vcC1jb21wYXQtbGlzdC1pdGVtIixwcm9wZXJ0aWVzOntjYXJkTm9kZTpPYmplY3QsaXRlbU5vZGU6T2JqZWN0LGVkZ2VMYWJlbDpTdHJpbmcsaXRlbVJlbmRlckluZm86T2JqZWN0LG5hbWU6U3RyaW5nLGl0ZW1UeXBlOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX2l0ZW1UeXBlQ2hhbmdlZCJ9LGNvbG9yQnk6U3RyaW5nLGNvbG9yQnlQYXJhbXM6T2JqZWN0LHRlbXBsYXRlSW5kZXg6RnVuY3Rpb259LF9pdGVtVHlwZUNoYW5nZWQ6ZnVuY3Rpb24oKXsic3Vibm9kZSIhPT10aGlzLml0ZW1UeXBlP3RoaXMuJFsibGlzdC1pdGVtIl0uY2xhc3NMaXN0LmFkZCgiY2xpY2thYmxlIik6dGhpcy4kWyJsaXN0LWl0ZW0iXS5jbGFzc0xpc3QucmVtb3ZlKCJjbGlja2FibGUiKX0sX25vZGVMaXN0ZW5lcjpmdW5jdGlvbihhKXt0aGlzLmZpcmUoIm5vZGUtbGlzdC1pdGVtLSIrYS50eXBlLHtub2RlTmFtZTp0aGlzLm5hbWUsdHlwZTp0aGlzLml0ZW1UeXBlfSl9LApfZmFkZWRDbGFzczpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5pc0ZhZGVkT3V0PyJmYWRlZCI6IiJ9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkL3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIixwcm9wZXJ0aWVzOntncmFwaEhpZXJhcmNoeTpPYmplY3QsaGllcmFyY2h5UGFyYW1zOk9iamVjdCxyZW5kZXJIaWVyYXJjaHk6T2JqZWN0LG5vZGVUaXRsZTpTdHJpbmcsX3RlbXBsYXRlSW5kZXg6e3R5cGU6RnVuY3Rpb24sY29tcHV0ZWQ6Il9nZXRUZW1wbGF0ZUluZGV4KGdyYXBoSGllcmFyY2h5KSJ9LF9pbmNvbXBhdGlibGVPcE5vZGVzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldEluY29tcGF0aWJsZU9wTm9kZXMoZ3JhcGhIaWVyYXJjaHksIGhpZXJhcmNoeVBhcmFtcykifSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX29wQ29tcGF0U2NvcmU6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZU9wQ29tcGF0U2NvcmUoZ3JhcGhIaWVyYXJjaHkpIn0sX29wQ29tcGF0U2NvcmVMYWJlbDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXRPcENvbXBhdFNjb3JlTGFiZWwoX29wQ29tcGF0U2NvcmUpIn0sCl9vcENvbXBhdENvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZTp0Zi5ncmFwaC5yZW5kZXIuT3BOb2RlQ29sb3JzLkNPTVBBVElCTEV9LF9vcEluY29tcGF0Q29sb3I6e3R5cGU6U3RyaW5nLHZhbHVlOnRmLmdyYXBoLnJlbmRlci5PcE5vZGVDb2xvcnMuSU5DT01QQVRJQkxFfSxfdG90YWxJbmNvbXBhdE9wczp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9nZXRUb3RhbEluY29tcGF0aWJsZU9wcyhncmFwaEhpZXJhcmNoeSkifX0sX2dldFRlbXBsYXRlSW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0VGVtcGxhdGVJbmRleCgpfSxfZ2V0Tm9kZTpmdW5jdGlvbihhLGMpe3JldHVybiBjLm5vZGUoYSl9LF9nZXRQcmludGFibGVIVE1MTm9kZU5hbWU6ZnVuY3Rpb24oYSl7cmV0dXJuKGF8fCIiKS5yZXBsYWNlKC9cLy9nLCJceDNjd2JyXHgzZS8iKX0sX2dldFJlbmRlckluZm86ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucmVuZGVySGllcmFyY2h5LmdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZShhKX0sCl90b2dnbGVFeHBhbmRlZDpmdW5jdGlvbigpe3RoaXMuX2V4cGFuZGVkPSF0aGlzLl9leHBhbmRlZH0sX2dldFRvZ2dsZUljb246ZnVuY3Rpb24oYSl7cmV0dXJuIGE/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifSxfcmVzaXplTGlzdDpmdW5jdGlvbihhKXsoYT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGEpKSYmYS5maXJlKCJpcm9uLXJlc2l6ZSIpfSxfZ2V0SW5jb21wYXRpYmxlT3BOb2RlczpmdW5jdGlvbihhLGMpe2lmKGEmJmEucm9vdClyZXR1cm4gdGhpcy5hc3luYyh0aGlzLl9yZXNpemVMaXN0LmJpbmQodGhpcywiI2luY29tcGF0aWJsZU9wc0xpc3QiKSksdGYuZ3JhcGguaGllcmFyY2h5LmdldEluY29tcGF0aWJsZU9wcyhhLGMpfSxfY29tcHV0ZU9wQ29tcGF0U2NvcmU6ZnVuY3Rpb24oYSl7aWYoYSYmYS5yb290KXt2YXIgYz1hLnJvb3Q7YT1jLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZTtjPWMuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU7CnJldHVybiAwPT1hJiYwPT1jPzA6TWF0aC5mbG9vcigxMDAqYS8oYStjKSkvMTAwfXJldHVybiAwfSxfZ2V0T3BDb21wYXRTY29yZUxhYmVsOmZ1bmN0aW9uKGEpe3JldHVybiBkMy5mb3JtYXQoIi4wJSIpKGEpfSxfZ2V0VG90YWxJbmNvbXBhdGlibGVPcHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEucm9vdD9hLnJvb3QuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU6MH19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtaW5mby90Zi1ub2RlLWxpc3QtaXRlbS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ub2RlLWxpc3QtaXRlbSIscHJvcGVydGllczp7Y2FyZE5vZGU6T2JqZWN0LGl0ZW1Ob2RlOk9iamVjdCxlZGdlTGFiZWw6U3RyaW5nLGl0ZW1SZW5kZXJJbmZvOk9iamVjdCxuYW1lOlN0cmluZyxpdGVtVHlwZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9pdGVtVHlwZUNoYW5nZWQifSxjb2xvckJ5OlN0cmluZyxjb2xvckJ5UGFyYW1zOk9iamVjdCx0ZW1wbGF0ZUluZGV4OkZ1bmN0aW9ufSxfaXRlbVR5cGVDaGFuZ2VkOmZ1bmN0aW9uKCl7InN1Ym5vZGUiIT09dGhpcy5pdGVtVHlwZT90aGlzLiRbImxpc3QtaXRlbSJdLmNsYXNzTGlzdC5hZGQoImNsaWNrYWJsZSIpOnRoaXMuJFsibGlzdC1pdGVtIl0uY2xhc3NMaXN0LnJlbW92ZSgiY2xpY2thYmxlIil9LF9ub2RlTGlzdGVuZXI6ZnVuY3Rpb24oYSl7dGhpcy5maXJlKCJub2RlLWxpc3QtaXRlbS0iK2EudHlwZSx7Y2FyZE5vZGU6dGhpcy5jYXJkTm9kZS5uYW1lLG5vZGVOYW1lOnRoaXMubmFtZSwKdHlwZTp0aGlzLml0ZW1UeXBlfSl9LF9mYWRlZENsYXNzOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmlzRmFkZWRPdXQ/ImZhZGVkIjoiIn19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtaW5mby90Zi1ub2RlLWluZm8uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtbm9kZS1pbmZvIixwcm9wZXJ0aWVzOntub2RlTmFtZTpTdHJpbmcsZ3JhcGhIaWVyYXJjaHk6T2JqZWN0LHJlbmRlckhpZXJhcmNoeTpPYmplY3QsY29sb3JCeTpTdHJpbmcsX3RlbXBsYXRlSW5kZXg6e3R5cGU6RnVuY3Rpb24sY29tcHV0ZWQ6Il9nZXRUZW1wbGF0ZUluZGV4KGdyYXBoSGllcmFyY2h5KSJ9LF9ub2RlOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldE5vZGUobm9kZU5hbWUsIGdyYXBoSGllcmFyY2h5KSIsb2JzZXJ2ZXI6Il9yZXNldFN0YXRlIn0sX25vZGVTdGF0czp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9nZXROb2RlU3RhdHMobm9kZU5hbWUsIGdyYXBoSGllcmFyY2h5KSIsb2JzZXJ2ZXI6Il9yZXNldFN0YXRlIn0sX2hhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldEhhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzKF9ub2RlU3RhdHMpIn0sX25vZGVTdGF0c0Zvcm1hdHRlZEJ5dGVzOnt0eXBlOlN0cmluZywKY29tcHV0ZWQ6Il9nZXROb2RlU3RhdHNGb3JtYXR0ZWRCeXRlcyhfbm9kZVN0YXRzKSJ9LF9ub2RlU3RhdHNGb3JtYXR0ZWRDb21wdXRlVGltZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXROb2RlU3RhdHNGb3JtYXR0ZWRDb21wdXRlVGltZShfbm9kZVN0YXRzKSJ9LF9ub2RlU3RhdHNGb3JtYXR0ZWRPdXRwdXRTaXplczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldE5vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzKF9ub2RlU3RhdHMpIn0sbm9kZUluY2x1ZGU6e3R5cGU6TnVtYmVyLG9ic2VydmVyOiJfbm9kZUluY2x1ZGVTdGF0ZUNoYW5nZWQifSxfYXR0cmlidXRlczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEF0dHJpYnV0ZXMoX25vZGUpIn0sX2RldmljZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXREZXZpY2UoX25vZGUpIn0sX3N1Y2Nlc3NvcnM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0U3VjY2Vzc29ycyhfbm9kZSwgZ3JhcGhIaWVyYXJjaHkpIn0sCl9wcmVkZWNlc3NvcnM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0UHJlZGVjZXNzb3JzKF9ub2RlLCBncmFwaEhpZXJhcmNoeSkifSxfZnVuY3Rpb25Vc2FnZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9nZXRGdW5jdGlvblVzYWdlcyhfbm9kZSwgZ3JhcGhIaWVyYXJjaHkpIn0sX3N1Ym5vZGVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfZ2V0U3Vibm9kZXMoX25vZGUpIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF90b3RhbFByZWRlY2Vzc29yczp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9nZXRUb3RhbFByZWQoX3ByZWRlY2Vzc29ycykifSxfdG90YWxTdWNjZXNzb3JzOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2dldFRvdGFsU3VjYyhfc3VjY2Vzc29ycykifSxfb3BlbmVkQ29udHJvbFByZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX29wZW5lZENvbnRyb2xTdWNjOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9hdXhCdXR0b25UZXh0OlN0cmluZyxfZ3JvdXBCdXR0b25UZXh0OlN0cmluZ30sCmV4cGFuZE5vZGU6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoIl9ub2RlLmV4cGFuZCIsdGhpcy5ub2RlKX0sX2dldFRlbXBsYXRlSW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0VGVtcGxhdGVJbmRleCgpfSxfZ2V0Tm9kZTpmdW5jdGlvbihhLGMpe3JldHVybiBjLm5vZGUoYSl9LF9nZXROb2RlU3RhdHM6ZnVuY3Rpb24oYSxjKXtyZXR1cm4oYT10aGlzLl9nZXROb2RlKGEsYykpP2Euc3RhdHM6bnVsbH0sX2dldFRvdGFsTWljcm9zOmZ1bmN0aW9uKGEpe3JldHVybiBhP2EuZ2V0VG90YWxNaWNyb3MoKTowfSxfZ2V0SGFzRGlzcGxheWFibGVOb2RlU3RhdHM6ZnVuY3Rpb24oYSl7cmV0dXJuIHRmLmdyYXBoLnV0aWwuaGFzRGlzcGxheWFibGVOb2RlU3RhdHMoYSl9LF9nZXROb2RlU3RhdHNGb3JtYXR0ZWRCeXRlczpmdW5jdGlvbihhKXtpZihhJiZhLnRvdGFsQnl0ZXMpcmV0dXJuIHRmLmdyYXBoLnV0aWwuY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKGEudG90YWxCeXRlcyx0Zi5ncmFwaC51dGlsLk1FTU9SWV9VTklUUyl9LApfZ2V0Tm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWU6ZnVuY3Rpb24oYSl7aWYoYSYmYS5nZXRUb3RhbE1pY3JvcygpKXJldHVybiB0Zi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZShhLmdldFRvdGFsTWljcm9zKCksdGYuZ3JhcGgudXRpbC5USU1FX1VOSVRTKX0sX2dldE5vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzOmZ1bmN0aW9uKGEpe2lmKGEmJmEub3V0cHV0U2l6ZSYmYS5vdXRwdXRTaXplLmxlbmd0aClyZXR1cm4gXy5tYXAoYS5vdXRwdXRTaXplLGZ1bmN0aW9uKGMpe3JldHVybiAwPT09Yy5sZW5ndGg/InNjYWxhciI6IlsiK2Muam9pbigiLCAiKSsiXSJ9KX0sX2dldFByaW50YWJsZUhUTUxOb2RlTmFtZTpmdW5jdGlvbihhKXtyZXR1cm4oYXx8IiIpLnJlcGxhY2UoL1wvL2csIlx4M2N3YnJceDNlLyIpfSxfZ2V0UmVuZGVySW5mbzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKGEpfSwKX2dldEF0dHJpYnV0ZXM6ZnVuY3Rpb24oYSl7dGhpcy5hc3luYyh0aGlzLl9yZXNpemVMaXN0LmJpbmQodGhpcywiI2F0dHJpYnV0ZXNMaXN0IikpO2lmKCFhfHwhYS5hdHRyKXJldHVybltdO3ZhciBjPVtdO18uZWFjaChhLmF0dHIsZnVuY3Rpb24oZCl7ZC5rZXk9PT10Zi5ncmFwaC5MQVJHRV9BVFRSU19LRVk/Yz1jLmNvbmNhdChkLnZhbHVlLmxpc3Qucy5tYXAoZnVuY3Rpb24oZil7cmV0dXJue2tleTpmLHZhbHVlOiJUb28gbGFyZ2UgdG8gc2hvdy4uLiJ9fSkpOmMucHVzaCh7a2V5OmQua2V5LHZhbHVlOkpTT04uc3RyaW5naWZ5KGQudmFsdWUpfSl9KTtyZXR1cm4gY30sX2dldERldmljZTpmdW5jdGlvbihhKXtyZXR1cm4gYT9hLmRldmljZTpudWxsfSxfZ2V0U3VjY2Vzc29ycyhhLGMpe3RoaXMuX3JlZnJlc2hOb2RlSXRlbUxpc3QoImlucHV0c0xpc3QiKTtyZXR1cm4gYT90aGlzLl9jb252ZXJ0RWRnZUxpc3RUb0VkZ2VJbmZvTGlzdChjLmdldFN1Y2Nlc3NvcnMoYS5uYW1lKSwKITEsYS5pc0dyb3VwTm9kZSk6e3JlZ3VsYXI6W10sY29udHJvbDpbXX19LF9nZXRQcmVkZWNlc3NvcnMoYSxjKXt0aGlzLl9yZWZyZXNoTm9kZUl0ZW1MaXN0KCJvdXRwdXRzTGlzdCIpO3JldHVybiBhP3RoaXMuX2NvbnZlcnRFZGdlTGlzdFRvRWRnZUluZm9MaXN0KGMuZ2V0UHJlZGVjZXNzb3JzKGEubmFtZSksITAsYS5pc0dyb3VwTm9kZSk6e3JlZ3VsYXI6W10sY29udHJvbDpbXX19LF9nZXRGdW5jdGlvblVzYWdlcyhhLGMpe3RoaXMuX3JlZnJlc2hOb2RlSXRlbUxpc3QoImZ1bmN0aW9uVXNhZ2VzTGlzdCIpO3JldHVybiBhJiZhLnR5cGU9PT10Zi5ncmFwaC5Ob2RlVHlwZS5NRVRBPyhhPWMubGlicmFyeUZ1bmN0aW9uc1thLmFzc29jaWF0ZWRGdW5jdGlvbl0pP2EudXNhZ2VzOltdOltdfSxfcmVmcmVzaE5vZGVJdGVtTGlzdChhKXt0aGlzLmFzeW5jKHRoaXMuX3Jlc2l6ZUxpc3QuYmluZCh0aGlzLGAjJHthfWApKX0sX2NvbnZlcnRFZGdlTGlzdFRvRWRnZUluZm9MaXN0OmZ1bmN0aW9uKGEsCmMsZCl7dmFyIGY9bD0+Xy5tYXAobC5iYXNlRWRnZUxpc3Qsaz0+e3ZhciBuPWM/ay52OmsudztyZXR1cm57bmFtZTpuLG5vZGU6dGhpcy5fZ2V0Tm9kZShuLHRoaXMuZ3JhcGhIaWVyYXJjaHkpLGVkZ2VMYWJlbDp0Zi5ncmFwaC5zY2VuZS5lZGdlLmdldExhYmVsRm9yQmFzZUVkZ2Uoayx0aGlzLnJlbmRlckhpZXJhcmNoeSkscmVuZGVySW5mbzp0aGlzLl9nZXRSZW5kZXJJbmZvKG4sdGhpcy5yZW5kZXJIaWVyYXJjaHkpfX0pLGc9ZnVuY3Rpb24obCl7dmFyIGs9W107Xy5lYWNoKGwsbj0+e3ZhciBwPWM/bi52Om4udztkJiYxIT1uLmJhc2VFZGdlTGlzdC5sZW5ndGg/ay5wdXNoKHtuYW1lOnAsbm9kZTp0aGlzLl9nZXROb2RlKHAsdGhpcy5ncmFwaEhpZXJhcmNoeSksZWRnZUxhYmVsOnRmLmdyYXBoLnNjZW5lLmVkZ2UuZ2V0TGFiZWxGb3JFZGdlKG4sdGhpcy5yZW5kZXJIaWVyYXJjaHkpLHJlbmRlckluZm86dGhpcy5fZ2V0UmVuZGVySW5mbyhwLHRoaXMucmVuZGVySGllcmFyY2h5KX0pOgprPWsuY29uY2F0KGYobikpfSk7cmV0dXJuIGt9LmJpbmQodGhpcyk7cmV0dXJue3JlZ3VsYXI6ZyhhLnJlZ3VsYXIpLGNvbnRyb2w6ZyhhLmNvbnRyb2wpfX0sX2dldFN1Ym5vZGVzOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLm1ldGFncmFwaD9hLm1ldGFncmFwaC5ub2RlcygpOm51bGx9LF9nZXRUb3RhbFByZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVndWxhci5sZW5ndGgrYS5jb250cm9sLmxlbmd0aH0sX2dldFRvdGFsU3VjYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZWd1bGFyLmxlbmd0aCthLmNvbnRyb2wubGVuZ3RofSxfdG9nZ2xlQ29udHJvbFByZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vcGVuZWRDb250cm9sUHJlZD0hdGhpcy5fb3BlbmVkQ29udHJvbFByZWR9LF90b2dnbGVDb250cm9sU3VjYzpmdW5jdGlvbigpe3RoaXMuX29wZW5lZENvbnRyb2xTdWNjPSF0aGlzLl9vcGVuZWRDb250cm9sU3VjY30sX3RvZ2dsZUV4cGFuZGVkOmZ1bmN0aW9uKCl7dGhpcy5fZXhwYW5kZWQ9CiF0aGlzLl9leHBhbmRlZH0sX2dldFRvZ2dsZUljb246ZnVuY3Rpb24oYSl7cmV0dXJuIGE/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifSxfcmVzZXRTdGF0ZTpmdW5jdGlvbigpe3RoaXMuX29wZW5lZENvbnRyb2xTdWNjPXRoaXMuX29wZW5lZENvbnRyb2xQcmVkPSExO3RoaXMuc2V0KCJfZ3JvdXBCdXR0b25UZXh0Iix0Zi5ncmFwaC5zY2VuZS5ub2RlLmdldEdyb3VwU2V0dGluZ0xhYmVsKHRoaXMuX25vZGUpKTt0aGlzLl9ub2RlJiYoUG9seW1lci5kb20odGhpcy4kLm5vZGV0aXRsZSkuaW5uZXJIVE1MPXRoaXMuX2dldFByaW50YWJsZUhUTUxOb2RlTmFtZSh0aGlzLl9ub2RlLm5hbWUpKX0sX3Jlc2l6ZUxpc3Q6ZnVuY3Rpb24oYSl7KGE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihhKSkmJmEuZmlyZSgiaXJvbi1yZXNpemUiKX0sX3RvZ2dsZUluY2x1ZGU6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoIm5vZGUtdG9nZ2xlLWluY2x1c2lvbiIse25hbWU6dGhpcy5ub2RlTmFtZX0pfSwKX25vZGVJbmNsdWRlU3RhdGVDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuc2V0KCJfYXV4QnV0dG9uVGV4dCIsdGYuZ3JhcGguZ2V0SW5jbHVkZU5vZGVCdXR0b25TdHJpbmcoYSkpfSxfdG9nZ2xlR3JvdXA6ZnVuY3Rpb24oKXt2YXIgYT10Zi5ncmFwaC5zY2VuZS5ub2RlLmdldFNlcmllc05hbWUodGhpcy5fbm9kZSk7dGhpcy5maXJlKCJub2RlLXRvZ2dsZS1zZXJpZXNncm91cCIse25hbWU6YX0pfSxfaXNMaWJyYXJ5RnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEubmFtZS5zdGFydHNXaXRoKHRmLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgpfSxfaXNJblNlcmllczpmdW5jdGlvbihhKXtyZXR1cm4gdGYuZ3JhcGguc2NlbmUubm9kZS5jYW5CZUluU2VyaWVzKGEpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1pbmZvL3RmLWdyYXBoLWluZm8uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtZ3JhcGgtaW5mbyIscHJvcGVydGllczp7dGl0bGU6U3RyaW5nLGdyYXBoSGllcmFyY2h5Ok9iamVjdCxncmFwaDpPYmplY3QscmVuZGVySGllcmFyY2h5Ok9iamVjdCxub2RlTmFtZXNUb0hlYWx0aFBpbGxzOk9iamVjdCxoZWFsdGhQaWxsU3RlcEluZGV4Ont0eXBlOk51bWJlcixub3RpZnk6ITB9LGNvbG9yQnk6U3RyaW5nLGNvbXBhdE5vZGVUaXRsZTpTdHJpbmcsc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LGhpZ2hsaWdodGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxzZWxlY3RlZE5vZGVJbmNsdWRlOnt0eXBlOk51bWJlcixub3RpZnk6ITB9LGRlYnVnZ2VyRGF0YUVuYWJsZWQ6Qm9vbGVhbn0sbGlzdGVuZXJzOnsibm9kZS1saXN0LWl0ZW0tY2xpY2siOiJfbm9kZUxpc3RJdGVtQ2xpY2tlZCIsIm5vZGUtbGlzdC1pdGVtLW1vdXNlb3ZlciI6Il9ub2RlTGlzdEl0ZW1Nb3VzZW92ZXIiLCJub2RlLWxpc3QtaXRlbS1tb3VzZW91dCI6Il9ub2RlTGlzdEl0ZW1Nb3VzZW91dCJ9LApfbm9kZUxpc3RJdGVtQ2xpY2tlZDpmdW5jdGlvbihhKXt0aGlzLnNlbGVjdGVkTm9kZT1hLmRldGFpbC5ub2RlTmFtZX0sX25vZGVMaXN0SXRlbU1vdXNlb3ZlcjpmdW5jdGlvbihhKXt0aGlzLmhpZ2hsaWdodGVkTm9kZT1hLmRldGFpbC5ub2RlTmFtZX0sX25vZGVMaXN0SXRlbU1vdXNlb3V0OmZ1bmN0aW9uKCl7dGhpcy5oaWdobGlnaHRlZE5vZGU9bnVsbH0sX2hlYWx0aFBpbGxzQXZhaWxhYmxlOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEmJmMmJjA8T2JqZWN0LmtleXMoYykubGVuZ3RofSxfZXF1YWxzOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGE9PT1jfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1ib2FyZC90Zi1ncmFwaC1ib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ncmFwaC1ib2FyZCIscHJvcGVydGllczp7Z3JhcGhIaWVyYXJjaHk6T2JqZWN0LGdyYXBoOk9iamVjdCxzdGF0czpPYmplY3QscHJvZ3Jlc3M6T2JqZWN0LHRyYWNlSW5wdXRzOkJvb2xlYW4sY29sb3JCeTpTdHJpbmcsY29sb3JCeVBhcmFtczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxyZW5kZXJIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sZGVidWdnZXJEYXRhRW5hYmxlZDpCb29sZWFuLGFyZUhlYWx0aFBpbGxzTG9hZGluZzpCb29sZWFuLGRlYnVnZ2VyTnVtZXJpY0FsZXJ0czp7dHlwZTpBcnJheSxub3RpZnk6ITB9LG5vZGVOYW1lc1RvSGVhbHRoUGlsbHM6T2JqZWN0LGFsbFN0ZXBzTW9kZUVuYWJsZWQ6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAsdmFsdWU6ITF9LHNwZWNpZmljSGVhbHRoUGlsbFN0ZXA6e3R5cGU6TnVtYmVyLG5vdGlmeTohMCx2YWx1ZTowfSxoZWFsdGhQaWxsU3RlcEluZGV4Ok51bWJlcixzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLApub3RpZnk6ITB9LGNvbXBhdE5vZGVUaXRsZTp7dHlwZTpTdHJpbmcsdmFsdWU6IlRQVSBDb21wYXRpYmlsaXR5In0sZWRnZVdpZHRoRnVuY3Rpb246T2JqZWN0LF9zZWxlY3RlZE5vZGVJbmNsdWRlOk51bWJlcixfaGlnaGxpZ2h0ZWROb2RlOlN0cmluZyxoYW5kbGVOb2RlU2VsZWN0ZWQ6T2JqZWN0LGVkZ2VMYWJlbEZ1bmN0aW9uOk9iamVjdCxoYW5kbGVFZGdlU2VsZWN0ZWQ6T2JqZWN0fSxvYnNlcnZlcnM6WyJfdXBkYXRlTm9kZUluY2x1ZGUoc2VsZWN0ZWROb2RlLCByZW5kZXJIaWVyYXJjaHkpIl0sZml0OmZ1bmN0aW9uKCl7dGhpcy4kLmdyYXBoLmZpdCgpfSxfaXNOb3RDb21wbGV0ZTpmdW5jdGlvbihhKXtyZXR1cm4gMTAwPmEudmFsdWV9LF9nZXRDb250YWluZXJDbGFzczpmdW5jdGlvbihhKXt2YXIgYz0iY29udGFpbmVyIjthLmVycm9yJiYoYys9IiBlcnJvciIpO3RoaXMuX2lzTm90Q29tcGxldGUoYSkmJihjKz0iIGxvYWRpbmciKTtyZXR1cm4gY30sX29uTm9kZUluY2x1c2lvblRvZ2dsZWQoYSl7dGhpcy4kLmdyYXBoLm5vZGVUb2dnbGVFeHRyYWN0KGEuZGV0YWlsLm5hbWUpfSwKX29uTm9kZVNlcmllc0dyb3VwVG9nZ2xlZChhKXt0aGlzLiQuZ3JhcGgubm9kZVRvZ2dsZVNlcmllc0dyb3VwKGEuZGV0YWlsLm5hbWUpfSxfdXBkYXRlTm9kZUluY2x1ZGUoKXtjb25zdCBhPXRoaXMucmVuZGVySGllcmFyY2h5P3RoaXMucmVuZGVySGllcmFyY2h5LmdldE5vZGVCeU5hbWUodGhpcy5zZWxlY3RlZE5vZGUpOm51bGw7dGhpcy5fc2VsZWN0ZWROb2RlSW5jbHVkZT1hP2EuaW5jbHVkZTp0Zi5ncmFwaC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tbWVudS1iZWhhdmlvci9pcm9uLW1lbnViYXItYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JJbXBsPXtob3N0QXR0cmlidXRlczp7cm9sZToibWVudWJhciJ9LGtleUJpbmRpbmdzOntsZWZ0OiJfb25MZWZ0S2V5IixyaWdodDoiX29uUmlnaHRLZXkifSxfb25VcEtleTpmdW5jdGlvbihhKXt0aGlzLmZvY3VzZWRJdGVtLmNsaWNrKCk7YS5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25Eb3duS2V5OmZ1bmN0aW9uKGEpe3RoaXMuZm9jdXNlZEl0ZW0uY2xpY2soKTthLmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LGdldCBfaXNSVEwoKXtyZXR1cm4icnRsIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLmRpcmVjdGlvbn0sX29uTGVmdEtleTpmdW5jdGlvbihhKXt0aGlzLl9pc1JUTD90aGlzLl9mb2N1c05leHQoKTp0aGlzLl9mb2N1c1ByZXZpb3VzKCk7YS5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25SaWdodEtleTpmdW5jdGlvbihhKXt0aGlzLl9pc1JUTD8KdGhpcy5fZm9jdXNQcmV2aW91cygpOnRoaXMuX2ZvY3VzTmV4dCgpO2EuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sX29uS2V5ZG93bjpmdW5jdGlvbihhKXt0aGlzLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhhLCJ1cCBkb3duIGxlZnQgcmlnaHQgZXNjIil8fHRoaXMuX2ZvY3VzV2l0aEtleWJvYXJkRXZlbnQoYSl9fTtQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3I9W1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvcixQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1yYWRpby1idXR0b24vcGFwZXItcmFkaW8tYnV0dG9uLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXJhZGlvLWJ1dHRvbiIsYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVyQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InJhZGlvIiwiYXJpYS1jaGVja2VkIjohMSx0YWJpbmRleDowfSxwcm9wZXJ0aWVzOnthcmlhQWN0aXZlQXR0cmlidXRlOnt0eXBlOlN0cmluZyx2YWx1ZToiYXJpYS1jaGVja2VkIn19LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fcmlwcGxlQ29udGFpbmVyPXRoaXMuJC5yYWRpb0NvbnRhaW5lcn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLlJlbmRlclN0YXR1cy5hZnRlck5leHRSZW5kZXIodGhpcyxmdW5jdGlvbigpe2lmKCItMXB4Ij09PXRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCItLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplIikudHJpbSgpKXt2YXIgYT1wYXJzZUZsb2F0KHRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCItLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemUiKS50cmltKCkpLApjPU1hdGguZmxvb3IoMyphKTtjJTIhPT1hJTImJmMrKzt0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplIjpjKyJweCJ9KX19KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1yYWRpby1ncm91cC9wYXBlci1yYWRpby1ncm91cC5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1yYWRpby1ncm91cCIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJyYWRpb2dyb3VwIn0scHJvcGVydGllczp7YXR0ckZvclNlbGVjdGVkOnt0eXBlOlN0cmluZyx2YWx1ZToibmFtZSJ9LHNlbGVjdGVkQXR0cmlidXRlOnt0eXBlOlN0cmluZyx2YWx1ZToiY2hlY2tlZCJ9LHNlbGVjdGFibGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJwYXBlci1yYWRpby1idXR0b24ifSxhbGxvd0VtcHR5U2VsZWN0aW9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxzZWxlY3Q6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fdmFsdWVUb0l0ZW0oYSk7aWYoIWN8fCFjLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7aWYodGhpcy5zZWxlY3RlZCl7Yz10aGlzLl92YWx1ZVRvSXRlbSh0aGlzLnNlbGVjdGVkKTtpZih0aGlzLnNlbGVjdGVkPT1hKWlmKHRoaXMuYWxsb3dFbXB0eVNlbGVjdGlvbilhPSIiO2Vsc2V7YyYmCihjLmNoZWNrZWQ9ITApO3JldHVybn1jJiYoYy5jaGVja2VkPSExKX1Qb2x5bWVyLklyb25TZWxlY3RhYmxlQmVoYXZpb3Iuc2VsZWN0LmFwcGx5KHRoaXMsW2FdKTt0aGlzLmZpcmUoInBhcGVyLXJhZGlvLWdyb3VwLWNoYW5nZWQiKX19LF9hY3RpdmF0ZUZvY3VzZWRJdGVtOmZ1bmN0aW9uKCl7dGhpcy5faXRlbUFjdGl2YXRlKHRoaXMuX3ZhbHVlRm9ySXRlbSh0aGlzLmZvY3VzZWRJdGVtKSx0aGlzLmZvY3VzZWRJdGVtKX0sX29uVXBLZXk6ZnVuY3Rpb24oYSl7dGhpcy5fZm9jdXNQcmV2aW91cygpO2EucHJldmVudERlZmF1bHQoKTt0aGlzLl9hY3RpdmF0ZUZvY3VzZWRJdGVtKCl9LF9vbkRvd25LZXk6ZnVuY3Rpb24oYSl7dGhpcy5fZm9jdXNOZXh0KCk7YS5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX0sX29uTGVmdEtleTpmdW5jdGlvbihhKXtQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JJbXBsLl9vbkxlZnRLZXkuYXBwbHkodGhpcyxhcmd1bWVudHMpOwp0aGlzLl9hY3RpdmF0ZUZvY3VzZWRJdGVtKCl9LF9vblJpZ2h0S2V5OmZ1bmN0aW9uKGEpe1BvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvckltcGwuX29uUmlnaHRLZXkuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10b29sdGlwL3BhcGVyLXRvb2x0aXAuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdG9vbHRpcCIsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6InRvb2x0aXAiLHRhYmluZGV4Oi0xfSxwcm9wZXJ0aWVzOntmb3I6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfZmluZFRhcmdldCJ9LG1hbnVhbE1vZGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX21hbnVhbE1vZGVDaGFuZ2VkIn0scG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOiJib3R0b20ifSxmaXRUb1Zpc2libGVCb3VuZHM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sb2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZToxNH0sbWFyZ2luVG9wOnt0eXBlOk51bWJlcix2YWx1ZToxNH0sYW5pbWF0aW9uRGVsYXk6e3R5cGU6TnVtYmVyLHZhbHVlOjUwMCxvYnNlcnZlcjoiX2RlbGF5Q2hhbmdlIn0sYW5pbWF0aW9uRW50cnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxhbmltYXRpb25FeGl0Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sYW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdCwKdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57ZW50cnk6W3tuYW1lOiJmYWRlLWluLWFuaW1hdGlvbiIsbm9kZTp0aGlzLHRpbWluZzp7ZGVsYXk6MH19XSxleGl0Olt7bmFtZToiZmFkZS1vdXQtYW5pbWF0aW9uIixub2RlOnRoaXN9XX19fSxfc2hvd2luZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sbGlzdGVuZXJzOnt3ZWJraXRBbmltYXRpb25FbmQ6Il9vbkFuaW1hdGlvbkVuZCJ9LGdldCB0YXJnZXQoKXt2YXIgYT1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlLGM9UG9seW1lci5kb20odGhpcykuZ2V0T3duZXJSb290KCk7cmV0dXJuIHRoaXMuZm9yP1BvbHltZXIuZG9tKGMpLnF1ZXJ5U2VsZWN0b3IoIiMiK3RoaXMuZm9yKTphLm5vZGVUeXBlPT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU/Yy5ob3N0OmF9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fZmluZFRhcmdldCgpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMubWFudWFsTW9kZXx8dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCl9LApwbGF5QW5pbWF0aW9uOmZ1bmN0aW9uKGEpeyJlbnRyeSI9PT1hP3RoaXMuc2hvdygpOiJleGl0Ij09PWEmJnRoaXMuaGlkZSgpfSxjYW5jZWxBbmltYXRpb246ZnVuY3Rpb24oKXt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QuYWRkKCJjYW5jZWwtYW5pbWF0aW9uIil9LHNob3c6ZnVuY3Rpb24oKXtpZighdGhpcy5fc2hvd2luZyl7aWYoIiI9PT1Qb2x5bWVyLmRvbSh0aGlzKS50ZXh0Q29udGVudC50cmltKCkpe2Zvcih2YXIgYT0hMCxjPVBvbHltZXIuZG9tKHRoaXMpLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKSxkPTA7ZDxjLmxlbmd0aDtkKyspaWYoIiIhPT1jW2RdLnRleHRDb250ZW50LnRyaW0oKSl7YT0hMTticmVha31pZihhKXJldHVybn10aGlzLl9zaG93aW5nPSEwO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlbiIpO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImNhbmNlbC1hbmltYXRpb24iKTt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImV4aXQiKSk7CnRoaXMudXBkYXRlUG9zaXRpb24oKTt0aGlzLl9hbmltYXRpb25QbGF5aW5nPSEwO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZW50cnkiKSl9fSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5fc2hvd2luZyYmKHRoaXMuX2FuaW1hdGlvblBsYXlpbmc/KHRoaXMuX3Nob3dpbmc9ITEsdGhpcy5fY2FuY2VsQW5pbWF0aW9uKCkpOih0aGlzLl9vbkFuaW1hdGlvbkZpbmlzaCgpLHRoaXMuX3Nob3dpbmc9ITEsdGhpcy5fYW5pbWF0aW9uUGxheWluZz0hMCkpfSx1cGRhdGVQb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXMuX3RhcmdldCYmdGhpcy5vZmZzZXRQYXJlbnQpe3ZhciBhPXRoaXMub2Zmc2V0OzE0IT10aGlzLm1hcmdpblRvcCYmMTQ9PXRoaXMub2Zmc2V0JiYoYT10aGlzLm1hcmdpblRvcCk7dmFyIGM9dGhpcy5vZmZzZXRQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD10aGlzLl90YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCmY9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxnPShkLndpZHRoLWYud2lkdGgpLzIsbD0oZC5oZWlnaHQtZi5oZWlnaHQpLzIsaz1kLmxlZnQtYy5sZWZ0LG49ZC50b3AtYy50b3A7c3dpdGNoKHRoaXMucG9zaXRpb24pe2Nhc2UgInRvcCI6dmFyIHA9aytnO3ZhciBxPW4tZi5oZWlnaHQtYTticmVhaztjYXNlICJib3R0b20iOnA9aytnO3E9bitkLmhlaWdodCthO2JyZWFrO2Nhc2UgImxlZnQiOnA9ay1mLndpZHRoLWE7cT1uK2w7YnJlYWs7Y2FzZSAicmlnaHQiOnA9aytkLndpZHRoK2EscT1uK2x9dGhpcy5maXRUb1Zpc2libGVCb3VuZHM/KGMubGVmdCtwK2Yud2lkdGg+d2luZG93LmlubmVyV2lkdGg/KHRoaXMuc3R5bGUucmlnaHQ9IjBweCIsdGhpcy5zdHlsZS5sZWZ0PSJhdXRvIik6KHRoaXMuc3R5bGUubGVmdD1NYXRoLm1heCgwLHApKyJweCIsdGhpcy5zdHlsZS5yaWdodD0iYXV0byIpLGMudG9wK3ErZi5oZWlnaHQ+d2luZG93LmlubmVySGVpZ2h0Pyh0aGlzLnN0eWxlLmJvdHRvbT0KYy5oZWlnaHQrInB4Iix0aGlzLnN0eWxlLnRvcD0iYXV0byIpOih0aGlzLnN0eWxlLnRvcD1NYXRoLm1heCgtYy50b3AscSkrInB4Iix0aGlzLnN0eWxlLmJvdHRvbT0iYXV0byIpKToodGhpcy5zdHlsZS5sZWZ0PXArInB4Iix0aGlzLnN0eWxlLnRvcD1xKyJweCIpfX0sX2FkZExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuX3RhcmdldCYmKHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwibW91c2VlbnRlciIsInNob3ciKSx0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsImZvY3VzIiwic2hvdyIpLHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwibW91c2VsZWF2ZSIsImhpZGUiKSx0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsImJsdXIiLCJoaWRlIiksdGhpcy5saXN0ZW4odGhpcy5fdGFyZ2V0LCJ0YXAiLCJoaWRlIikpO3RoaXMubGlzdGVuKHRoaXMuJC50b29sdGlwLCJhbmltYXRpb25lbmQiLCJfb25BbmltYXRpb25FbmQiKTt0aGlzLmxpc3Rlbih0aGlzLCJtb3VzZWVudGVyIiwiaGlkZSIpfSwKX2ZpbmRUYXJnZXQ6ZnVuY3Rpb24oKXt0aGlzLm1hbnVhbE1vZGV8fHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO3RoaXMuX3RhcmdldD10aGlzLnRhcmdldDt0aGlzLm1hbnVhbE1vZGV8fHRoaXMuX2FkZExpc3RlbmVycygpfSxfZGVsYXlDaGFuZ2U6ZnVuY3Rpb24oYSl7NTAwIT09YSYmdGhpcy51cGRhdGVTdHlsZXMoeyItLXBhcGVyLXRvb2x0aXAtZGVsYXktaW4iOmErIm1zIn0pfSxfbWFudWFsTW9kZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLm1hbnVhbE1vZGU/dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCk6dGhpcy5fYWRkTGlzdGVuZXJzKCl9LF9jYW5jZWxBbmltYXRpb246ZnVuY3Rpb24oKXt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImVudHJ5IikpO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZXhpdCIpKTt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKCJjYW5jZWwtYW5pbWF0aW9uIik7CnRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpfSxfb25BbmltYXRpb25GaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl9zaG93aW5nJiYodGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJlbnRyeSIpKSx0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKCJjYW5jZWwtYW5pbWF0aW9uIiksdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJleGl0IikpKX0sX29uQW5pbWF0aW9uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fYW5pbWF0aW9uUGxheWluZz0hMTt0aGlzLl9zaG93aW5nfHwodGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJleGl0IikpLHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpKX0sX2dldEFuaW1hdGlvblR5cGU6ZnVuY3Rpb24oYSl7aWYoImVudHJ5Ij09PWEmJiIiIT09dGhpcy5hbmltYXRpb25FbnRyeSlyZXR1cm4gdGhpcy5hbmltYXRpb25FbnRyeTsKaWYoImV4aXQiPT09YSYmIiIhPT10aGlzLmFuaW1hdGlvbkV4aXQpcmV0dXJuIHRoaXMuYW5pbWF0aW9uRXhpdDtpZih0aGlzLmFuaW1hdGlvbkNvbmZpZ1thXSYmInN0cmluZyI9PT10eXBlb2YgdGhpcy5hbmltYXRpb25Db25maWdbYV1bMF0ubmFtZSl7aWYodGhpcy5hbmltYXRpb25Db25maWdbYV1bMF0udGltaW5nJiZ0aGlzLmFuaW1hdGlvbkNvbmZpZ1thXVswXS50aW1pbmcuZGVsYXkmJjAhPT10aGlzLmFuaW1hdGlvbkNvbmZpZ1thXVswXS50aW1pbmcuZGVsYXkpe3ZhciBjPXRoaXMuYW5pbWF0aW9uQ29uZmlnW2FdWzBdLnRpbWluZy5kZWxheTsiZW50cnkiPT09YT90aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItdG9vbHRpcC1kZWxheS1pbiI6YysibXMifSk6ImV4aXQiPT09YSYmdGhpcy51cGRhdGVTdHlsZXMoeyItLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0IjpjKyJtcyJ9KX1yZXR1cm4gdGhpcy5hbmltYXRpb25Db25maWdbYV1bMF0ubmFtZX19LF9yZW1vdmVMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt0aGlzLl90YXJnZXQmJgoodGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsIm1vdXNlZW50ZXIiLCJzaG93IiksdGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsImZvY3VzIiwic2hvdyIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJtb3VzZWxlYXZlIiwiaGlkZSIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJibHVyIiwiaGlkZSIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJ0YXAiLCJoaWRlIikpO3RoaXMudW5saXN0ZW4odGhpcy4kLnRvb2x0aXAsImFuaW1hdGlvbmVuZCIsIl9vbkFuaW1hdGlvbkVuZCIpO3RoaXMudW5saXN0ZW4odGhpcywibW91c2VlbnRlciIsImhpZGUiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1ub2RlLXNlYXJjaC90Zi1ncmFwaC1ub2RlLXNlYXJjaC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ncmFwaC1ub2RlLXNlYXJjaCIscHJvcGVydGllczp7cmVuZGVySGllcmFyY2h5Ok9iamVjdCxzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX3Jhd1JlZ2V4SW5wdXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfcmVnZXhJbnB1dDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUmVnZXhJbnB1dChyZW5kZXJIaWVyYXJjaHksIF9yYXdSZWdleElucHV0KSJ9LF9wcmV2aW91c1JlZ2V4SW5wdXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfc2VhcmNoVGltZW91dERlbGF5Ont0eXBlOk51bWJlcix2YWx1ZToxNTAscmVhZE9ubHk6ITB9LF9zZWFyY2hQZW5kaW5nOkJvb2xlYW4sX21heFJlZ2V4UmVzdWx0czp7dHlwZTpOdW1iZXIsdmFsdWU6NDJ9LF9yZWdleE1hdGNoZXM6QXJyYXl9LG9ic2VydmVyczpbIl9yZWdleElucHV0Q2hhbmdlZChfcmVnZXhJbnB1dCkiXSxfY29tcHV0ZVJlZ2V4SW5wdXQoYSxjKXtyZXR1cm4gYy50cmltKCl9LApfcmVnZXhJbnB1dENoYW5nZWQoKXt0aGlzLl9yZXF1ZXN0U2VhcmNoKCl9LF9jbGVhclNlYXJjaFJlc3VsdHMoKXt0aGlzLnNldCgiX3JlZ2V4TWF0Y2hlcyIsW10pfSxfcmVxdWVzdFNlYXJjaCgpe3RoaXMuX3NlYXJjaFBlbmRpbmd8fCh0aGlzLl9yZWdleElucHV0PT09dGhpcy5fcHJldmlvdXNSZWdleElucHV0P3RoaXMuX3NlYXJjaFBlbmRpbmc9ITE6KHRoaXMuX3NlYXJjaFBlbmRpbmc9ITAsdGhpcy5fZXhlY3V0ZVNlYXJjaCgpLHRoaXMuYXN5bmMoKCk9Pnt0aGlzLl9zZWFyY2hQZW5kaW5nPSExO3RoaXMuX3JlcXVlc3RTZWFyY2goKX0sdGhpcy5fc2VhcmNoVGltZW91dERlbGF5KSkpfSxfZXhlY3V0ZVNlYXJjaCgpe2lmKHRoaXMuX3ByZXZpb3VzUmVnZXhJbnB1dD10aGlzLl9yZWdleElucHV0KXt0cnl7dmFyIGE9bmV3IFJlZ0V4cCh0aGlzLl9yZWdleElucHV0KX1jYXRjaChkKXt0aGlzLl9jbGVhclNlYXJjaFJlc3VsdHMoKTtyZXR1cm59dmFyIGM9W107Xy5lYWNoKHRoaXMucmVuZGVySGllcmFyY2h5LmhpZXJhcmNoeS5nZXROb2RlTWFwKCksCihkLGYpPT57aWYoYy5sZW5ndGg+PXRoaXMuX21heFJlZ2V4UmVzdWx0cylyZXR1cm4hMTthLnRlc3QoZikmJmMucHVzaChmKX0pO3RoaXMuc2V0KCJfcmVnZXhNYXRjaGVzIixjKX1lbHNlIHRoaXMuX2NsZWFyU2VhcmNoUmVzdWx0cygpfSxfbWF0Y2hDbGlja2VkKGEpe3RoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLGEubW9kZWwuaXRlbSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29udHJvbHMvdGYtZ3JhcGgtY29udHJvbHMuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7Y29uc3QgZj0vZGV2aWNlOihbXjpdKzpbMC05XSspJC8sZz1be3JlZ2V4OmZ9XSxsPVtdO2xldCBrOyhmdW5jdGlvbihwKXtwLkNPTVBVVEVfVElNRT0iY29tcHV0ZV90aW1lIjtwLk1FTU9SWT0ibWVtb3J5IjtwLlNUUlVDVFVSRT0ic3RydWN0dXJlIjtwLlhMQV9DTFVTVEVSPSJ4bGFfY2x1c3RlciI7cC5PUF9DT01QQVRJQklMSVRZPSJvcF9jb21wYXRpYmlsaXR5In0pKGs9ZC5Db2xvckJ5fHwoZC5Db2xvckJ5PXt9KSk7Y29uc3Qgbj1uZXcgU2V0KFtrLkNPTVBVVEVfVElNRSxrLk1FTU9SWV0pO1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1jb250cm9scyIscHJvcGVydGllczp7c3RhdHM6e3ZhbHVlOm51bGwsdHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9zdGF0c0NoYW5nZWQifSxkZXZpY2VzRm9yU3RhdHM6e3ZhbHVlOm51bGwsdHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRvbmx5OiEwfSxjb2xvckJ5Ont0eXBlOlN0cmluZywKdmFsdWU6ay5TVFJVQ1RVUkUsbm90aWZ5OiEwfSxjb2xvckJ5UGFyYW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITAscmVhZG9ubHk6ITB9LGRhdGFzZXRzOnt0eXBlOkFycmF5LG9ic2VydmVyOiJfZGF0YXNldHNDaGFuZ2VkIix2YWx1ZTooKT0+W119LHJlbmRlckhpZXJhcmNoeTp7dHlwZTpPYmplY3R9LHNlbGVjdGlvbjp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwLGNvbXB1dGVkOiJfY29tcHV0ZVNlbGVjdGlvbihkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4LCBfc2VsZWN0ZWRHcmFwaFR5cGUpIn0sc2VsZWN0ZWRGaWxlOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LF9zZWxlY3RlZFJ1bkluZGV4Ont0eXBlOk51bWJlcix2YWx1ZTowLG9ic2VydmVyOiJfc2VsZWN0ZWRSdW5JbmRleENoYW5nZWQifSx0cmFjZUlucHV0czp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0sX3NlbGVjdGVkVGFnSW5kZXg6e3R5cGU6TnVtYmVyLAp2YWx1ZTowLG9ic2VydmVyOiJfc2VsZWN0ZWRUYWdJbmRleENoYW5nZWQifSxfc2VsZWN0ZWRHcmFwaFR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOmEuZ3JhcGguU2VsZWN0aW9uVHlwZS5PUF9HUkFQSH0sc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9jdXJyZW50RGV2aWNlczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEN1cnJlbnREZXZpY2VzKGRldmljZXNGb3JTdGF0cykifSxfY3VycmVudERldmljZVBhcmFtczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEN1cnJlbnREZXZpY2VQYXJhbXMoY29sb3JCeVBhcmFtcykifSxfY3VycmVudFhsYUNsdXN0ZXJQYXJhbXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9nZXRDdXJyZW50WGxhQ2x1c3RlclBhcmFtcyhjb2xvckJ5UGFyYW1zKSJ9LF9jdXJyZW50R3JhZGllbnRQYXJhbXM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0Q3VycmVudEdyYWRpZW50UGFyYW1zKGNvbG9yQnlQYXJhbXMsIGNvbG9yQnkpIn0sCnNob3dTZXNzaW9uUnVuc0Ryb3Bkb3duOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LHNob3dVcGxvYWRCdXR0b246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0saGVhbHRoUGlsbHNGZWF0dXJlRW5hYmxlZDpCb29sZWFuLGhlYWx0aFBpbGxzVG9nZ2xlZE9uOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSxfbGVnZW5kT3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9fSxfeGxhQ2x1c3RlcnNQcm92aWRlZDpmdW5jdGlvbihwKXtyZXR1cm4gcCYmcC5oaWVyYXJjaHkmJjA8cC5oaWVyYXJjaHkueGxhQ2x1c3RlcnMubGVuZ3RofSxfc3RhdHNDaGFuZ2VkOmZ1bmN0aW9uKHApe2lmKG51bGwhPXApe3ZhciBxPXt9O18uZWFjaChwLmRldl9zdGF0cyxmdW5jdGlvbihyKXt2YXIgdD1fLnNvbWUoZyxmdW5jdGlvbih5KXtyZXR1cm4geS5yZWdleC50ZXN0KHIuZGV2aWNlKX0pLHY9Xy5zb21lKGwsZnVuY3Rpb24oeSl7cmV0dXJuIHkucmVnZXgudGVzdChyLmRldmljZSl9KTt0JiYhdiYmKHFbci5kZXZpY2VdPQohMCl9KTt0aGlzLnNldCgiZGV2aWNlc0ZvclN0YXRzIixxKX19LF9nZXRDdXJyZW50RGV2aWNlczpmdW5jdGlvbihwKXt2YXIgcT10aGlzLnN0YXRzO3E9KHE/cS5kZXZfc3RhdHM6W10pLm1hcCh0PT50LmRldmljZSkuZmlsdGVyKHQ9Pmcuc29tZSh2PT52LnJlZ2V4LnRlc3QodCkpKTtjb25zdCByPWEuZ3JhcGgudXRpbC5yZW1vdmVDb21tb25QcmVmaXgocSk7aWYoMT09ci5sZW5ndGgpe2NvbnN0IHQ9clswXS5tYXRjaChmKTt0JiYoclswXT10WzFdKX1yZXR1cm4gcS5tYXAoKHQsdik9PntsZXQgeT1udWxsO2wuZm9yRWFjaCh6PT57ei5yZWdleC50ZXN0KHQpJiYoeT16Lm1zZyl9KTtyZXR1cm57ZGV2aWNlOnQsc3VmZml4OnJbdl0sdXNlZDpwW3RdLGlnbm9yZWRNc2c6eX19KX0sX2RldmljZUNoZWNrYm94Q2xpY2tlZDpmdW5jdGlvbihwKXtwPXAudGFyZ2V0O2NvbnN0IHE9T2JqZWN0LmFzc2lnbih7fSx0aGlzLmRldmljZXNGb3JTdGF0cykscj1wLnZhbHVlO3AuY2hlY2tlZD8KcVtyXT0hMDpkZWxldGUgcVtyXTt0aGlzLnNldCgiZGV2aWNlc0ZvclN0YXRzIixxKX0sX251bVRhZ3M6ZnVuY3Rpb24ocCxxKXtyZXR1cm4gdGhpcy5fZ2V0VGFncyhwLHEpLmxlbmd0aH0sX2dldFRhZ3M6ZnVuY3Rpb24ocCxxKXtyZXR1cm4gcCYmcFtxXT9wW3FdLnRhZ3M6W119LF9maXQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoImZpdC10YXAiKX0sX2lzR3JhZGllbnRDb2xvcmluZzpmdW5jdGlvbihwLHEpe3JldHVybiBuLmhhcyhxKSYmbnVsbCE9cH0sX2VxdWFsczpmdW5jdGlvbihwLHEpe3JldHVybiBwPT09cX0sX2dldEN1cnJlbnREZXZpY2VQYXJhbXM6ZnVuY3Rpb24ocCl7cD1wLmRldmljZS5maWx0ZXIodD0+Zy5zb21lKHY9PnYucmVnZXgudGVzdCh0LmRldmljZSkpKTtjb25zdCBxPWEuZ3JhcGgudXRpbC5yZW1vdmVDb21tb25QcmVmaXgocC5tYXAodD0+dC5kZXZpY2UpKTtpZigxPT1xLmxlbmd0aCl7dmFyIHI9cVswXS5tYXRjaChmKTtyJiYocVswXT1yWzFdKX1yZXR1cm4gcC5tYXAoKHQsCnYpPT4oe2RldmljZTpxW3ZdLGNvbG9yOnQuY29sb3J9KSl9LF9nZXRDdXJyZW50WGxhQ2x1c3RlclBhcmFtczpmdW5jdGlvbihwKXtyZXR1cm4gcC54bGFfY2x1c3Rlcn0sX2dldEN1cnJlbnRHcmFkaWVudFBhcmFtczpmdW5jdGlvbihwLHEpe2lmKHRoaXMuX2lzR3JhZGllbnRDb2xvcmluZyh0aGlzLnN0YXRzLHEpKXtwPXBbcV07dmFyIHI9cC5taW5WYWx1ZSx0PXAubWF4VmFsdWU7cT09PWsuTUVNT1JZPyhyPWEuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUocixhLmdyYXBoLnV0aWwuTUVNT1JZX1VOSVRTKSx0PWEuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUodCxhLmdyYXBoLnV0aWwuTUVNT1JZX1VOSVRTKSk6cT09PWsuQ09NUFVURV9USU1FJiYocj1hLmdyYXBoLnV0aWwuY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKHIsYS5ncmFwaC51dGlsLlRJTUVfVU5JVFMpLHQ9YS5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZSh0LAphLmdyYXBoLnV0aWwuVElNRV9VTklUUykpO3JldHVybnttaW5WYWx1ZTpyLG1heFZhbHVlOnQsc3RhcnRDb2xvcjpwLnN0YXJ0Q29sb3IsZW5kQ29sb3I6cC5lbmRDb2xvcn19fSxkb3dubG9hZDpmdW5jdGlvbigpe3RoaXMuJC5ncmFwaGRvd25sb2FkLmNsaWNrKCl9LF91cGRhdGVGaWxlSW5wdXQ6ZnVuY3Rpb24ocCl7dmFyIHE9cC50YXJnZXQuZmlsZXNbMF07aWYocSl7cT1xLm5hbWU7dmFyIHI9cS5sYXN0SW5kZXhPZigiLiIpOzA8PXImJihxPXEuc3Vic3RyaW5nKDAscikpO3I9cS5sYXN0SW5kZXhPZigiLyIpOzA8PXImJihxPXEuc3Vic3RyaW5nKHIrMSkpO3RoaXMuX3NldERvd25sb2FkRmlsZW5hbWUocSk7dGhpcy5zZXQoInNlbGVjdGVkRmlsZSIscCl9fSxfZGF0YXNldHNDaGFuZ2VkOmZ1bmN0aW9uKHAscSl7bnVsbCE9cSYmKHRoaXMuX3NlbGVjdGVkUnVuSW5kZXg9MCl9LF9jb21wdXRlU2VsZWN0aW9uOmZ1bmN0aW9uKHAscSxyLHQpe3JldHVybiBwW3FdJiZwW3FdLnRhZ3Nbcl0/CntydW46cFtxXS5uYW1lLHRhZzpwW3FdLnRhZ3Nbcl0udGFnLHR5cGU6dH06bnVsbH0sX3NlbGVjdGVkUnVuSW5kZXhDaGFuZ2VkOmZ1bmN0aW9uKHApe3RoaXMuZGF0YXNldHMmJih0aGlzLmNvbG9yQnk9ay5TVFJVQ1RVUkUsdGhpcy5fc2VsZWN0ZWRUYWdJbmRleD0wLHRoaXMuX3NlbGVjdGVkR3JhcGhUeXBlPXRoaXMuX2dldERlZmF1bHRTZWxlY3Rpb25UeXBlKCksdGhpcy50cmFjZUlucHV0cz0hMSx0aGlzLl9zZXREb3dubG9hZEZpbGVuYW1lKHRoaXMuZGF0YXNldHNbcF0/dGhpcy5kYXRhc2V0c1twXS5uYW1lOiIiKSl9LF9zZWxlY3RlZFRhZ0luZGV4Q2hhbmdlZCgpe3RoaXMuX3NlbGVjdGVkR3JhcGhUeXBlPXRoaXMuX2dldERlZmF1bHRTZWxlY3Rpb25UeXBlKCl9LF9nZXREZWZhdWx0U2VsZWN0aW9uVHlwZSgpe2NvbnN0IHtkYXRhc2V0czpwLF9zZWxlY3RlZFJ1bkluZGV4OnEsX3NlbGVjdGVkVGFnSW5kZXg6cn09dGhpcztyZXR1cm4gcCYmcFtxXSYmcFtxXS50YWdzW3JdJiYKIXBbcV0udGFnc1tyXS5vcEdyYXBoP3BbcV0udGFnc1tyXS5wcm9maWxlP2EuZ3JhcGguU2VsZWN0aW9uVHlwZS5QUk9GSUxFOnBbcV0udGFnc1tyXS5jb25jZXB0dWFsR3JhcGg/YS5ncmFwaC5TZWxlY3Rpb25UeXBlLkNPTkNFUFRVQUxfR1JBUEg6YS5ncmFwaC5TZWxlY3Rpb25UeXBlLk9QX0dSQVBIOmEuZ3JhcGguU2VsZWN0aW9uVHlwZS5PUF9HUkFQSH0sX2dldEZpbGU6ZnVuY3Rpb24oKXt0aGlzLiQkKCIjZmlsZSIpLmNsaWNrKCl9LF9zZXREb3dubG9hZEZpbGVuYW1lOmZ1bmN0aW9uKHApe3RoaXMuJC5ncmFwaGRvd25sb2FkLnNldEF0dHJpYnV0ZSgiZG93bmxvYWQiLHArIi5wbmciKX0sX3N0YXRzTm90TnVsbDpmdW5jdGlvbihwKXtyZXR1cm4gbnVsbCE9PXB9LF90b2dnbGVMZWdlbmRPcGVuKCl7dGhpcy5zZXQoIl9sZWdlbmRPcGVuZWQiLCF0aGlzLl9sZWdlbmRPcGVuZWQpfSxfZ2V0VG9nZ2xlVGV4dChwKXtyZXR1cm4gcD8iQ2xvc2UgbGVnZW5kLiI6IkV4cGFuZCBsZWdlbmQuIn0sCl9nZXRUb2dnbGVMZWdlbmRJY29uKHApe3JldHVybiBwPyJleHBhbmQtbW9yZSI6ImV4cGFuZC1sZXNzIn0sX2dldFNlbGVjdGlvbk9wR3JhcGhEaXNhYmxlZChwLHEscil7cmV0dXJuIXBbcV18fCFwW3FdLnRhZ3Nbcl18fCFwW3FdLnRhZ3Nbcl0ub3BHcmFwaH0sX2dldFNlbGVjdGlvblByb2ZpbGVEaXNhYmxlZChwLHEscil7cmV0dXJuIXBbcV18fCFwW3FdLnRhZ3Nbcl18fCFwW3FdLnRhZ3Nbcl0ucHJvZmlsZX0sX2dldFNlbGVjdGlvbkNvbmNlcHR1YWxHcmFwaERpc2FibGVkKHAscSxyKXtyZXR1cm4hcFtxXXx8IXBbcV0udGFnc1tyXXx8IXBbcV0udGFnc1tyXS5jb25jZXB0dWFsR3JhcGh9fSl9KShjLmNvbnRyb2xzfHwoYy5jb250cm9scz17fSkpfSkoYS5ncmFwaHx8KGEuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1sb2FkZXIvdGYtZ3JhcGgtZGFzaGJvYXJkLWxvYWRlci5qcwpmcD10aGlzJiZ0aGlzLl9fYXdhaXRlcnx8ZnVuY3Rpb24oYSxjLGQsZil7cmV0dXJuIG5ldyAoZHx8KGQ9UHJvbWlzZSkpKGZ1bmN0aW9uKGcsbCl7ZnVuY3Rpb24gayhxKXt0cnl7cChmLm5leHQocSkpfWNhdGNoKHIpe2wocil9fWZ1bmN0aW9uIG4ocSl7dHJ5e3AoZlsidGhyb3ciXShxKSl9Y2F0Y2gocil7bChyKX19ZnVuY3Rpb24gcChxKXtxLmRvbmU/ZyhxLnZhbHVlKToobmV3IGQoZnVuY3Rpb24ocil7cihxLnZhbHVlKX0pKS50aGVuKGssbil9cCgoZj1mLmFwcGx5KGEsY3x8W10pKS5uZXh0KCkpfSl9OwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1kYXNoYm9hcmQtbG9hZGVyIixfdGVtcGxhdGU6bnVsbCxwcm9wZXJ0aWVzOntkYXRhc2V0czpBcnJheSxwcm9ncmVzczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxzZWxlY3Rpb246T2JqZWN0LHNlbGVjdGVkRmlsZTpPYmplY3QsY29tcGF0aWJpbGl0eVByb3ZpZGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGEuZ3JhcGgub3AuVHB1Q29tcGF0aWJpbGl0eVByb3ZpZGVyfSxoaWVyYXJjaHlQYXJhbXM6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5hLmdyYXBoLmhpZXJhcmNoeS5EZWZhdWx0SGllcmFyY2h5UGFyYW1zfSxvdXRHcmFwaEhpZXJhcmNoeTp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxvdXRHcmFwaDp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxvdXRTdGF0czp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSwKX2dyYXBoUnVuVGFnOk9iamVjdH0sb2JzZXJ2ZXJzOlsiX3NlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uLCBjb21wYXRpYmlsaXR5UHJvdmlkZXIpIiwiX3NlbGVjdGVkRmlsZUNoYW5nZWQoc2VsZWN0ZWRGaWxlLCBjb21wYXRpYmlsaXR5UHJvdmlkZXIpIl0sX3NlbGVjdGlvbkNoYW5nZWQoKXt0aGlzLmRlYm91bmNlKCJzZWxlY3Rpb25jaGFuZ2UiLCgpPT57dGhpcy5fbG9hZCh0aGlzLnNlbGVjdGlvbil9KX0sX2xvYWQ6ZnVuY3Rpb24oZCl7Y29uc3Qge3J1bjpmLHRhZzpnLHR5cGU6bH09ZDtzd2l0Y2gobCl7Y2FzZSBhLmdyYXBoLlNlbGVjdGlvblR5cGUuT1BfR1JBUEg6Y2FzZSBhLmdyYXBoLlNlbGVjdGlvblR5cGUuQ09OQ0VQVFVBTF9HUkFQSDpyZXR1cm4gdGhpcy5fc2V0T3V0U3RhdHMobnVsbCksZD1uZXcgVVJMU2VhcmNoUGFyYW1zLGQuc2V0KCJydW4iLGYpLGQuc2V0KCJjb25jZXB0dWFsIixTdHJpbmcobD09PWEuZ3JhcGguU2VsZWN0aW9uVHlwZS5DT05DRVBUVUFMX0dSQVBIKSksCmcmJmQuc2V0KCJ0YWciLGcpLGQ9UW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImdyYXBocyIsIi9ncmFwaCIsZCksdGhpcy5fZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChkKS50aGVuKCgpPT57dGhpcy5fZ3JhcGhSdW5UYWc9e3J1bjpmLHRhZzpnfX0pO2Nhc2UgYS5ncmFwaC5TZWxlY3Rpb25UeXBlLlBST0ZJTEU6eyh7dGFnczpkfT10aGlzLmRhdGFzZXRzLmZpbmQoKHtuYW1lOnF9KT0+cT09PWYpKTtjb25zdCBrPWQuZmluZChxPT5xLnRhZz09PWcpLm9wR3JhcGg/ZzpudWxsO2NvbnNvbGUuYXNzZXJ0KGQuZmluZChxPT5xLnRhZz09PWspLGBSZXF1aXJlZCB0YWcgKCR7a30pIGlzIG1pc3NpbmcuYCk7ZD10aGlzLl9ncmFwaFJ1blRhZyYmdGhpcy5fZ3JhcGhSdW5UYWcucnVuPT09ZiYmdGhpcy5fZ3JhcGhSdW5UYWcudGFnPT09az9Qcm9taXNlLnJlc29sdmUoKTp0aGlzLl9sb2FkKHtydW46Zix0YWc6ayx0eXBlOmEuZ3JhcGguU2VsZWN0aW9uVHlwZS5PUF9HUkFQSH0pOwpjb25zdCBuPW5ldyBVUkxTZWFyY2hQYXJhbXM7bi5zZXQoInRhZyIsZyk7bi5zZXQoInJ1biIsZik7Y29uc3QgcD1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZ3JhcGhzIiwiL3J1bl9tZXRhZGF0YSIsbik7cmV0dXJuIGQudGhlbigoKT0+dGhpcy5fcmVhZEFuZFBhcnNlTWV0YWRhdGEocCkpfWRlZmF1bHQ6cmV0dXJuIFByb21pc2UucmVqZWN0KEVycm9yKGBVbmtub3duIHNlbGVjdGlvbiB0eXBlOiAke2x9YCkpfX0sX3JlYWRBbmRQYXJzZU1ldGFkYXRhOmZ1bmN0aW9uKGQpe3RoaXMuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOjAsbXNnOiIifSk7YS5ncmFwaC5wYXJzZXIuZmV0Y2hBbmRQYXJzZU1ldGFkYXRhKGQsYS5ncmFwaC51dGlsLmdldFRyYWNrZXIodGhpcykpLnRoZW4oZj0+e3RoaXMuX3NldE91dFN0YXRzKGYpfSl9LF9mZXRjaEFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoOmZ1bmN0aW9uKGQsZil7cmV0dXJuIGZwKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXt0aGlzLnNldCgicHJvZ3Jlc3MiLAp7dmFsdWU6MCxtc2c6IiJ9KTtyZXR1cm4gYS5ncmFwaC5sb2FkZXIuZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChhLmdyYXBoLnV0aWwuZ2V0VHJhY2tlcih0aGlzKSxkLGYsdGhpcy5jb21wYXRpYmlsaXR5UHJvdmlkZXIsdGhpcy5oaWVyYXJjaHlQYXJhbXMpLnRoZW4oKHtncmFwaDpnLGdyYXBoSGllcmFyY2h5Omx9KT0+e3RoaXMuX3NldE91dEdyYXBoKGcpO3RoaXMuX3NldE91dEdyYXBoSGllcmFyY2h5KGwpfSl9KX0sX3NlbGVjdGVkRmlsZUNoYW5nZWQ6ZnVuY3Rpb24oZCl7aWYoZCl7ZD1kLnRhcmdldDt2YXIgZj1kLmZpbGVzWzBdO2YmJihkLnZhbHVlPSIiLHRoaXMuX2ZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgobnVsbCxmKSl9fX0pfSkoYy5sb2FkZXJ8fChjLmxvYWRlcj17fSkpfSkoYS5ncmFwaHx8KGEuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1kYXNoYm9hcmQvdGYtZ3JhcGgtZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWdyYXBoLWRhc2hib2FyZCIscHJvcGVydGllczp7X2RhdGFzZXRzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX2RhdGFzZXRzRmV0Y2hlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfc2VsZWN0ZWREYXRhc2V0Ont0eXBlOk51bWJlcix2YWx1ZTowfSxfcmVuZGVySGllcmFyY2h5Ont0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3JlbmRlckhpZXJhcmNoeUNoYW5nZWQifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUW8uUmVxdWVzdE1hbmFnZXJ9LF9jYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUW8uQ2FuY2VsbGVyfSxfZGVidWdnZXJEYXRhRW5hYmxlZDpCb29sZWFuLGFsbFN0ZXBzTW9kZUVuYWJsZWQ6Qm9vbGVhbixzcGVjaWZpY0hlYWx0aFBpbGxTdGVwOnt0eXBlOk51bWJlcix2YWx1ZTowfSxoZWFsdGhQaWxsc1RvZ2dsZWRPbjp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfaGVhbHRoUGlsbHNUb2dnbGVkT25DaGFuZ2VkIn0sCnNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxfaXNBdHRhY2hlZDpCb29sZWFuLF9pbml0aWFsaXplZDpCb29sZWFuLF9hcmVIZWFsdGhQaWxsc0xvYWRpbmc6Qm9vbGVhbixfZGVidWdnZXJOdW1lcmljQWxlcnRzOnt0eXBlOkFycmF5LHZhbHVlOltdLG5vdGlmeTohMH0sX25vZGVOYW1lc1RvSGVhbHRoUGlsbHM6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfaGVhbHRoUGlsbFN0ZXBJbmRleDpOdW1iZXIsX2hlYWx0aFBpbGxSZXF1ZXN0SWQ6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LF9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkOk51bWJlcixfaGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJEZWxheTp7dHlwZTpOdW1iZXIsdmFsdWU6NTAwLHJlYWRPbmx5OiEwfSxydW5zOkFycmF5LHJ1bjp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLHZhbHVlOlRvLmdldFN0cmluZ0luaXRpYWxpemVyKCJydW4iLHtkZWZhdWx0VmFsdWU6IiIsdXNlTG9jYWxTdG9yYWdlOiExfSksb2JzZXJ2ZXI6Il9ydW5PYnNlcnZlciJ9LApfc2VsZWN0aW9uOnt0eXBlOk9iamVjdH0sX2NvbXBhdGliaWxpdHlQcm92aWRlcjpPYmplY3QsX3RyYWNlSW5wdXRzOkJvb2xlYW59LGxpc3RlbmVyczp7Im5vZGUtdG9nZ2xlLWV4cGFuZCI6Il9oYW5kbGVOb2RlVG9nZ2xlRXhwYW5kIn0sb2JzZXJ2ZXJzOlsiX21heWJlRmV0Y2hIZWFsdGhQaWxscyhfZGVidWdnZXJEYXRhRW5hYmxlZCwgYWxsU3RlcHNNb2RlRW5hYmxlZCwgc3BlY2lmaWNIZWFsdGhQaWxsU3RlcCwgX3NlbGVjdGVkTm9kZSkiLCJfbWF5YmVJbml0aWFsaXplRGFzaGJvYXJkKF9pc0F0dGFjaGVkKSIsIl9kZXRlcm1pbmVTZWxlY3RlZERhdGFzZXQoX2RhdGFzZXRzRmV0Y2hlZCwgX2RhdGFzZXRzLCBydW4pIiwiX3VwZGF0ZVNlbGVjdGVkRGF0YXNldE5hbWUoX2RhdGFzZXRzRmV0Y2hlZCwgX2RhdGFzZXRzLCBfc2VsZWN0ZWREYXRhc2V0KSJdLGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9pc0F0dGFjaGVkIiwhMCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9pc0F0dGFjaGVkIiwKITEpfSxyZWxvYWQ6ZnVuY3Rpb24oKXt0aGlzLl9kZWJ1Z2dlckRhdGFFbmFibGVkfHx0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KFFvLmdldFJvdXRlcigpLnBsdWdpbnNMaXN0aW5nKCkpLnRoZW4odGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKGE9PnthLmNhbmNlbGxlZHx8YS52YWx1ZVsiZGVidWdnZXIiXSYmdGhpcy5zZXQoIl9kZWJ1Z2dlckRhdGFFbmFibGVkIiwhMCl9KSk7dGhpcy5fbWF5YmVGZXRjaEhlYWx0aFBpbGxzKCl9LF9maXQ6ZnVuY3Rpb24oKXt0aGlzLiQkKCIjZ3JhcGhib2FyZCIpLmZpdCgpfSxfcnVuT2JzZXJ2ZXI6VG8uZ2V0U3RyaW5nT2JzZXJ2ZXIoInJ1biIse2RlZmF1bHRWYWx1ZToiIixwb2x5bWVyUHJvcGVydHk6InJ1biIsdXNlTG9jYWxTdG9yYWdlOiExfSksX2ZldGNoRGF0YXNldCgpe3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KFFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJncmFwaHMiLCIvaW5mbyIpKX0sX2ZldGNoSGVhbHRoUGlsbHMoYSwKYyl7YT17bm9kZV9uYW1lczpKU09OLnN0cmluZ2lmeShhKSxydW46Il9fZGVidWdnZXJfZGF0YV9fIn07dm9pZCAwIT09YyYmKGEuc3RlcD1jKTtjPVFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9oZWFsdGhfcGlsbHMiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChjLGEpfSxfZmV0Y2hEZWJ1Z2dlck51bWVyaWNzQWxlcnRzKCl7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoUW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL251bWVyaWNzX2FsZXJ0X3JlcG9ydCIpKX0sX2dyYXBoVXJsKGEsYyxkKXtyZXR1cm4gUW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImdyYXBocyIsIi9ncmFwaCIsbmV3IFVSTFNlYXJjaFBhcmFtcyh7cnVuOmEsbGltaXRfYXR0cl9zaXplOmMsbGFyZ2VfYXR0cnNfa2V5OmR9KSl9LF9zaG91bGRSZXF1ZXN0SGVhbHRoUGlsbHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVidWdnZXJEYXRhRW5hYmxlZCYmCnRoaXMuaGVhbHRoUGlsbHNUb2dnbGVkT24mJnRoaXMuX3JlbmRlckhpZXJhcmNoeSYmdGhpcy5fZGF0YXNldHNTdGF0ZSh0aGlzLl9kYXRhc2V0c0ZldGNoZWQsdGhpcy5fZGF0YXNldHMsIlBSRVNFTlQiKX0sX21heWJlSW5pdGlhbGl6ZURhc2hib2FyZDpmdW5jdGlvbihhKXshdGhpcy5faW5pdGlhbGl6ZWQmJmEmJih0aGlzLnNldCgiX2NvbXBhdGliaWxpdHlQcm92aWRlciIsbmV3IHRmLmdyYXBoLm9wLlRwdUNvbXBhdGliaWxpdHlQcm92aWRlciksdGhpcy5faW5pdGlhbGl6ZWQ9ITAsdGhpcy5fZmV0Y2hEYXRhc2V0KCkudGhlbihjPT57dGhpcy5fZGF0YXNldHM9T2JqZWN0LmtleXMoYykuc29ydChnbi5jb21wYXJlVGFnTmFtZXMpLm1hcChkPT57Y29uc3QgZj1jW2RdO3ZhciBnPU9iamVjdC5rZXlzKGYudGFncykuc29ydChnbi5jb21wYXJlVGFnTmFtZXMpLm1hcChsPT5mLnRhZ3NbbF0pLm1hcCgoe3RhZzpsLGNvbmNlcHR1YWxfZ3JhcGg6ayxvcF9ncmFwaDpuLHByb2ZpbGU6cH0pPT4KKHt0YWc6bCxkaXNwbGF5TmFtZTpsLGNvbmNlcHR1YWxHcmFwaDprLG9wR3JhcGg6bixwcm9maWxlOnB9KSk7Zz1mLnJ1bl9ncmFwaD9be3RhZzpudWxsLGRpc3BsYXlOYW1lOiJEZWZhdWx0Iixjb25jZXB0dWFsR3JhcGg6ITEsb3BHcmFwaDohMCxwcm9maWxlOiExfSwuLi5nXTpnO3JldHVybntuYW1lOmQsdGFnczpnfX0pO3RoaXMuX2RhdGFzZXRzRmV0Y2hlZD0hMH0pKX0sX2RldGVybWluZVNlbGVjdGVkRGF0YXNldChhLGMsZCl7ZD8oYz1jLmZpbmRJbmRleChmPT5mLm5hbWU9PT1kKSwtMT09PWM/YSYmKGE9dGhpcy4kJCgiI2Vycm9yLWRpYWxvZyIpLGEudGV4dENvbnRlbnQ9YE5vIGRhdGFzZXQgbmFtZWQgIiR7ZH0iIGNvdWxkIGJlIGZvdW5kLmAsYS5vcGVuKCkpOnRoaXMuc2V0KCJfc2VsZWN0ZWREYXRhc2V0IixjKSk6dGhpcy5zZXQoIl9zZWxlY3RlZERhdGFzZXQiLDApfSxfdXBkYXRlU2VsZWN0ZWREYXRhc2V0TmFtZShhLGMsZCl7YSYmKGMubGVuZ3RoPD1kfHx0aGlzLnNldCgicnVuIiwKY1tkXS5uYW1lKSl9LF9yZXF1ZXN0SGVhbHRoUGlsbHM6ZnVuY3Rpb24oKXt0aGlzLnNldCgiX2FyZUhlYWx0aFBpbGxzTG9hZGluZyIsITApO3ZhciBhPSsrdGhpcy5faGVhbHRoUGlsbFJlcXVlc3RJZDtudWxsIT09dGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZCksdGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZD1udWxsKTt0aGlzLmFsbFN0ZXBzTW9kZUVuYWJsZWQ/dGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZD1udWxsO3RoaXMuX2luaXRpYXRlTmV0d29ya1JlcXVlc3RGb3JIZWFsdGhQaWxscyhhKX0uYmluZCh0aGlzKSx0aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lckRlbGF5KTp0aGlzLl9pbml0aWF0ZU5ldHdvcmtSZXF1ZXN0Rm9ySGVhbHRoUGlsbHMoYSl9LApfaW5pdGlhdGVOZXR3b3JrUmVxdWVzdEZvckhlYWx0aFBpbGxzOmZ1bmN0aW9uKGEpe2lmKHRoaXMuX2hlYWx0aFBpbGxSZXF1ZXN0SWQ9PT1hKXt2YXIgYz10aGlzLl9mZXRjaEhlYWx0aFBpbGxzKHRoaXMuX3JlbmRlckhpZXJhcmNoeS5nZXROYW1lc09mUmVuZGVyZWRPcHMoKSx0aGlzLmFsbFN0ZXBzTW9kZUVuYWJsZWQ/dGhpcy5zcGVjaWZpY0hlYWx0aFBpbGxTdGVwOnZvaWQgMCksZD10aGlzLl9mZXRjaERlYnVnZ2VyTnVtZXJpY3NBbGVydHMoKTtQcm9taXNlLmFsbChbYyxkXSkudGhlbihmdW5jdGlvbihmKXt2YXIgZz1mWzBdO2Y9ZlsxXTtpZih0aGlzLmhlYWx0aFBpbGxzVG9nZ2xlZE9uJiZhPT09dGhpcy5faGVhbHRoUGlsbFJlcXVlc3RJZCl7Zm9yKHZhciBsIGluIGcpe3RoaXMuc2V0KCJfaGVhbHRoUGlsbFN0ZXBJbmRleCIsZ1tsXS5sZW5ndGgtMSk7YnJlYWt9dGhpcy5zZXQoIl9kZWJ1Z2dlck51bWVyaWNBbGVydHMiLGYpO3RoaXMuc2V0KCJfbm9kZU5hbWVzVG9IZWFsdGhQaWxscyIsCmcpO3RoaXMuc2V0KCJfYXJlSGVhbHRoUGlsbHNMb2FkaW5nIiwhMSk7dGhpcy5zZXQoIl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkIixudWxsKX19LmJpbmQodGhpcykpfX0sX2RhdGFzZXRzU3RhdGU6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiBhP2MmJmMubGVuZ3RoPyJQUkVTRU5UIj09PWQ6IkVNUFRZIj09PWQ6Ik5PVF9MT0FERUQiPT09ZH0sX3JlbmRlckhpZXJhcmNoeUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLnJlbG9hZCgpfSxfaGFuZGxlTm9kZVRvZ2dsZUV4cGFuZDpmdW5jdGlvbigpe3RoaXMuX21heWJlRmV0Y2hIZWFsdGhQaWxscygpfSxfaGVhbHRoUGlsbHNUb2dnbGVkT25DaGFuZ2VkOmZ1bmN0aW9uKGEpe2E/dGhpcy5yZWxvYWQoKTp0aGlzLnNldCgiX25vZGVOYW1lc1RvSGVhbHRoUGlsbHMiLHt9KX0sX21heWJlRmV0Y2hIZWFsdGhQaWxsczpmdW5jdGlvbigpe3RoaXMuX3Nob3VsZFJlcXVlc3RIZWFsdGhQaWxscygpJiZ0aGlzLl9yZXF1ZXN0SGVhbHRoUGlsbHMoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1kaXN0cmlidXRpb24tY2hhcnQvdnotZGlzdHJpYnV0aW9uLWNoYXJ0LmpzCnZhciBucDsKKGZ1bmN0aW9uKGEpe2NsYXNzIGN7Y29uc3RydWN0b3IoZCxmKXt0aGlzLnJ1bjJkYXRhc2V0cz17fTt0aGlzLmNvbG9yU2NhbGU9Zjt0aGlzLmJ1aWxkQ2hhcnQoZCl9Z2V0RGF0YXNldChkKXt2b2lkIDA9PT10aGlzLnJ1bjJkYXRhc2V0c1tkXSYmKHRoaXMucnVuMmRhdGFzZXRzW2RdPW5ldyBQbG90dGFibGUuRGF0YXNldChbXSx7cnVuOmR9KSk7cmV0dXJuIHRoaXMucnVuMmRhdGFzZXRzW2RdfWJ1aWxkQ2hhcnQoZCl7dGhpcy5vdXRlciYmdGhpcy5vdXRlci5kZXN0cm95KCk7ZD0kby5nZXRYQ29tcG9uZW50cyhkKTt0aGlzLnhBY2Nlc3Nvcj1kLmFjY2Vzc29yO3RoaXMueFNjYWxlPWQuc2NhbGU7dGhpcy54QXhpcz1kLmF4aXM7dGhpcy54QXhpcy5tYXJnaW4oMCkudGlja0xhYmVsUGFkZGluZygzKTt0aGlzLnlTY2FsZT1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXI7dGhpcy55QXhpcz1uZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyh0aGlzLnlTY2FsZSwibGVmdCIpO2Q9CiRvLm11bHRpc2NhbGVGb3JtYXR0ZXIoJG8uWV9BWElTX0ZPUk1BVFRFUl9QUkVDSVNJT04pO3RoaXMueUF4aXMubWFyZ2luKDApLnRpY2tMYWJlbFBhZGRpbmcoNSkuZm9ybWF0dGVyKGQpO3RoaXMueUF4aXMudXNlc1RleHRXaWR0aEFwcHJveGltYXRpb24oKTtkPXRoaXMuYnVpbGRQbG90KHRoaXMueEFjY2Vzc29yLHRoaXMueFNjYWxlLHRoaXMueVNjYWxlKTt0aGlzLmdyaWRsaW5lcz1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JpZGxpbmVzKHRoaXMueFNjYWxlLHRoaXMueVNjYWxlKTt0aGlzLmNlbnRlcj1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JvdXAoW3RoaXMuZ3JpZGxpbmVzLGRdKTt0aGlzLm91dGVyPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5UYWJsZShbW3RoaXMueUF4aXMsdGhpcy5jZW50ZXJdLFtudWxsLHRoaXMueEF4aXNdXSl9YnVpbGRQbG90KGQsZixnKXtsZXQgbD1bMCwyMjgsMTU4NywzMDg1LDVFMyw2OTE1LDg0MTMsOTc3MiwxRTRdLGs9Xy5yYW5nZShsLmxlbmd0aC0KMSkubWFwKHQ9PihsW3QrMV0tbFt0XSkvMjUwMCksbj1sLm1hcCgodCx2KT0+eT0+eVt2XVsxXSkscD1uWzRdLHE9Xy5yYW5nZShuLmxlbmd0aC0xKS5tYXAodD0+e2xldCB2PW5ldyBQbG90dGFibGUuUGxvdHMuQXJlYTt2LngoZCxmKTtsZXQgeT00PHQ/blt0XTpuW3QrMV07di55KDQ8dD9uW3QrMV06blt0XSxnKTt2LnkwKHkpO3YuYXR0cigiZmlsbCIsKHoseCxDKT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKEMubWV0YWRhdGEoKS5ydW4pKTt2LmF0dHIoInN0cm9rZSIsKHoseCxDKT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKEMubWV0YWRhdGEoKS5ydW4pKTt2LmF0dHIoInN0cm9rZS13ZWlnaHQiLCgpPT4iMC41cHgiKTt2LmF0dHIoInN0cm9rZS1vcGFjaXR5IiwoKT0+a1t0XSk7di5hdHRyKCJmaWxsLW9wYWNpdHkiLCgpPT5rW3RdKTtyZXR1cm4gdn0pLHI9bmV3IFBsb3R0YWJsZS5QbG90cy5MaW5lO3IueChkLGYpO3IueShwLGcpO3IuYXR0cigic3Ryb2tlIiwodCx2LHkpPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUoeS5ydW4pKTsKdGhpcy5wbG90cz1xO3JldHVybiBuZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JvdXAocSl9c2V0VmlzaWJsZVNlcmllcyhkKXt0aGlzLnJ1bnM9ZDtsZXQgZj1kLm1hcChnPT50aGlzLmdldERhdGFzZXQoZykpO3RoaXMucGxvdHMuZm9yRWFjaChnPT5nLmRhdGFzZXRzKGYpKX1zZXRTZXJpZXNEYXRhKGQsZil7dGhpcy5nZXREYXRhc2V0KGQpLmRhdGEoZil9cmVuZGVyVG8oZCl7dGhpcy50YXJnZXRTVkc9ZDt0aGlzLm91dGVyLnJlbmRlclRvKGQpfXJlZHJhdygpe3RoaXMub3V0ZXIucmVkcmF3KCl9ZGVzdHJveSgpe3RoaXMub3V0ZXIuZGVzdHJveSgpfX1hLkRpc3RyaWJ1dGlvbkNoYXJ0PWM7UG9seW1lcih7aXM6InZ6LWRpc3RyaWJ1dGlvbi1jaGFydCIscHJvcGVydGllczp7Y29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IFBsb3R0YWJsZS5TY2FsZXMuQ29sb3IpLnJhbmdlKGQzLnNjaGVtZUNhdGVnb3J5MTApfX0seFR5cGU6e3R5cGU6U3RyaW5nLAp2YWx1ZToic3RlcCJ9LF9hdHRhY2hlZDpCb29sZWFuLF9jaGFydDpPYmplY3QsX3Zpc2libGVTZXJpZXNDYWNoZTp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX3Nlcmllc0RhdGFDYWNoZTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LF9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ6e3R5cGU6TnVtYmVyLHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6WyJfbWFrZUNoYXJ0KHhUeXBlLCBjb2xvclNjYWxlLCBfYXR0YWNoZWQpIiwiX3JlbG9hZEZyb21DYWNoZShfY2hhcnQpIl0sc2V0VmlzaWJsZVNlcmllczpmdW5jdGlvbihkKXt0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGU9ZDt0aGlzLl9jaGFydCYmKHRoaXMuX2NoYXJ0LnNldFZpc2libGVTZXJpZXMoZCksdGhpcy5yZWRyYXcoKSl9LHNldFNlcmllc0RhdGE6ZnVuY3Rpb24oZCxmKXt0aGlzLl9zZXJpZXNEYXRhQ2FjaGVbZF09Zjt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuc2V0U2VyaWVzRGF0YShkLApmKX0scmVkcmF3OmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQucmVkcmF3KCl9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLmNoYXJ0ZGl2LCEwKX0sX21ha2VDaGFydDpmdW5jdGlvbihkLGYsZyl7bnVsbD09PXRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZCYmdGhpcy5jYW5jZWxBc3luYyh0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQpO3RoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZD10aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkPW51bGw7aWYoZyl7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LmRlc3Ryb3koKTt2YXIgbD1uZXcgYyhkLGYpLGs9ZDMuc2VsZWN0KHRoaXMuJC5jaGFydGRpdik7bC5yZW5kZXJUbyhrKTt0aGlzLl9jaGFydD1sfX0sMzUwKX0sX3JlbG9hZEZyb21DYWNoZTpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiYodGhpcy5fY2hhcnQuc2V0VmlzaWJsZVNlcmllcyh0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUpLAp0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUuZm9yRWFjaChmdW5jdGlvbihkKXt0aGlzLl9jaGFydC5zZXRTZXJpZXNEYXRhKGQsdGhpcy5fc2VyaWVzRGF0YUNhY2hlW2RdfHxbXSl9LmJpbmQodGhpcykpKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hdHRhY2hlZD0hMH0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hdHRhY2hlZD0hMX19KX0pKG5wfHwobnA9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kaXN0cmlidXRpb24tZGFzaGJvYXJkL3RmLWRpc3RyaWJ1dGlvbi1sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZGlzdHJpYnV0aW9uLWxvYWRlciIscHJvcGVydGllczp7cnVuOlN0cmluZyx0YWc6U3RyaW5nLHRhZ01ldGFkYXRhOk9iamVjdCx4VHlwZTpTdHJpbmcsZGF0YVRvTG9hZDp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2NvbXB1dGVEYXRhVG9Mb2FkKHJ1biwgdGFnKSJ9LGdldERhdGFMb2FkTmFtZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+KHtydW46YX0pPT5hfSxnZXREYXRhTG9hZFVybDp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+KHt0YWc6YSxydW46Y30pPT5Rby5hZGRQYXJhbXMoUW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRpc3RyaWJ1dGlvbnMiLCIvZGlzdHJpYnV0aW9ucyIpLHt0YWc6YSxydW46Y30pfSxsb2FkRGF0YUNhbGxiYWNrOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKGEsYyxkKT0+e2E9ZC5tYXAoZj0+e2NvbnN0IFtnLGwsa109ZjtrLndhbGxfdGltZT1uZXcgRGF0ZSgxRTMqZyk7ay5zdGVwPWw7cmV0dXJuIGt9KTsKYz10aGlzLmdldERhdGFMb2FkTmFtZShjKTt0aGlzLiQuY2hhcnQuc2V0U2VyaWVzRGF0YShjLGEpO3RoaXMuJC5jaGFydC5zZXRWaXNpYmxlU2VyaWVzKFtjXSl9fX0sX2NvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe3NjYWxlOlhvLnJ1bnNDb2xvclNjYWxlfSkscmVhZE9ubHk6ITB9LF9ydW5Db2xvcjp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUnVuQ29sb3IocnVuKSJ9LF9leHBhbmRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0scmVxdWVzdE1hbmFnZXI6T2JqZWN0LF9jYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUW8uQ2FuY2VsbGVyfX0sb2JzZXJ2ZXJzOlsicmVsb2FkKHJ1biwgdGFnKSJdLGJlaGF2aW9yczpbVW8uRGF0YUxvYWRlckJlaGF2aW9yXSxfY29tcHV0ZURhdGFUb0xvYWQoYSxjKXtyZXR1cm5be3J1bjphLHRhZzpjfV19LF9jb21wdXRlUnVuQ29sb3IoYSl7cmV0dXJuIHRoaXMuX2NvbG9yU2NhbGUuc2NhbGUoYSl9LApyZWRyYXcoKXt0aGlzLiQuY2hhcnQucmVkcmF3KCl9LF90b2dnbGVFeHBhbmRlZCgpe3RoaXMuc2V0KCJfZXhwYW5kZWQiLCF0aGlzLl9leHBhbmRlZCk7dGhpcy5yZWRyYXcoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kaXN0cmlidXRpb24tZGFzaGJvYXJkL3RmLWRpc3RyaWJ1dGlvbi1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZCIscHJvcGVydGllczp7X3hUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZToic3RlcCJ9LF9zZWxlY3RlZFJ1bnM6QXJyYXksX3J1blRvVGFnOk9iamVjdCxfcnVuVG9UYWdJbmZvOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjpTdHJpbmcsX2NhdGVnb3JpZXNEb21SZWFkeTpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyLCBfY2F0ZWdvcmllc0RvbVJlYWR5KSJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBRby5SZXF1ZXN0TWFuYWdlcn19LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKT0+e3RoaXMuX3JlbG9hZERpc3RyaWJ1dGlvbnMoKX0pfSxfZmV0Y2hUYWdzKCl7Y29uc3QgYT1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGlzdHJpYnV0aW9ucyIsCiIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGEpLnRoZW4oYz0+e2lmKCFfLmlzRXF1YWwoYyx0aGlzLl9ydW5Ub1RhZ0luZm8pKXt2YXIgZD1fLm1hcFZhbHVlcyhjLGc9Pk9iamVjdC5rZXlzKGcpKSxmPVFvLmdldFRhZ3MoZCk7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1mLmxlbmd0aCk7dGhpcy5zZXQoIl9ydW5Ub1RhZyIsZCk7dGhpcy5zZXQoIl9ydW5Ub1RhZ0luZm8iLGMpO3RoaXMuYXN5bmMoKCk9Pnt0aGlzLnNldCgiX2NhdGVnb3JpZXNEb21SZWFkeSIsITApfSl9fSl9LF9yZWxvYWREaXN0cmlidXRpb25zKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWRpc3RyaWJ1dGlvbi1sb2FkZXIiKS5mb3JFYWNoKGE9PnthLnJlbG9hZCgpfSl9LF9zaG91bGRPcGVuKGEpe3JldHVybiAyPj1hfSxfbWFrZUNhdGVnb3JpZXMoYSxjLGQpe3JldHVybiBSby5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGEsYyxkKX0sX3RhZ01ldGFkYXRhKGEsCmMsZCl7cmV0dXJuIGFbY11bZF19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMvdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMuaHRtbC5qcwpQb2x5bWVyKHtpczoidnotaGlzdG9ncmFtLXRpbWVzZXJpZXMiLHByb3BlcnRpZXM6e21vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJvZmZzZXQifSx0aW1lUHJvcGVydHk6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGVwIn0sYmluczp7dHlwZTpTdHJpbmcsdmFsdWU6ImJpbnMifSx4Ont0eXBlOlN0cmluZyx2YWx1ZToieCJ9LGR4Ont0eXBlOlN0cmluZyx2YWx1ZToiZHgifSx5Ont0eXBlOlN0cmluZyx2YWx1ZToieSJ9LGNvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGQzLnNjYWxlT3JkaW5hbChkMy5zY2hlbWVDYXRlZ29yeTEwKX19LG1vZGVUcmFuc2l0aW9uRHVyYXRpb246e3R5cGU6TnVtYmVyLHZhbHVlOjUwMH0sX2F0dGFjaGVkOkJvb2xlYW4sX25hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9kYXRhOnt0eXBlOkFycmF5LHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6WyJyZWRyYXcodGltZVByb3BlcnR5LCBfYXR0YWNoZWQpIiwiX21vZGVSZWRyYXcobW9kZSkiXSwKcmVhZHk6ZnVuY3Rpb24oKXt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuc3ZnLCEwKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hdHRhY2hlZD0hMH0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hdHRhY2hlZD0hMX0sc2V0U2VyaWVzRGF0YTpmdW5jdGlvbihhLGMpe3RoaXMuX25hbWU9YTt0aGlzLl9kYXRhPWM7dGhpcy5yZWRyYXcoKX0scmVkcmF3OmZ1bmN0aW9uKCl7dGhpcy5fZHJhdygwKX0sX21vZGVSZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl9kcmF3KHRoaXMubW9kZVRyYW5zaXRpb25EdXJhdGlvbil9LF9kcmF3OmZ1bmN0aW9uKGEpe2lmKHRoaXMuX2F0dGFjaGVkJiZ0aGlzLl9kYXRhKXtpZih2b2lkIDA9PT1hKXRocm93IEVycm9yKCJ2ei1oaXN0b2dyYW0tdGltZXNlcmllcyBfZHJhdyBuZWVkcyBkdXJhdGlvbiIpO2lmKDA+PXRoaXMuX2RhdGEubGVuZ3RoKXRocm93IEVycm9yKCJOb3QgZW5vdWdoIHN0ZXBzIGluIHRoZSBkYXRhIik7aWYoIXRoaXMuX2RhdGFbMF0uaGFzT3duUHJvcGVydHkodGhpcy5iaW5zKSl0aHJvdyBFcnJvcigiTm8gYmlucyBwcm9wZXJ0eSBvZiAnIisKdGhpcy5iaW5zKyInIGluIGRhdGEiKTtpZigwPj10aGlzLl9kYXRhWzBdW3RoaXMuYmluc10ubGVuZ3RoKXRocm93IEVycm9yKCJNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGJpbiBpbiBiaW5zIGluIGRhdGEiKTtpZighdGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdWzBdLmhhc093blByb3BlcnR5KHRoaXMueCkpdGhyb3cgRXJyb3IoIk5vIHggcHJvcGVydHkgJyIrdGhpcy54KyInIG9uIGJpbnMgZGF0YSIpO2lmKCF0aGlzLl9kYXRhWzBdW3RoaXMuYmluc11bMF0uaGFzT3duUHJvcGVydHkodGhpcy5keCkpdGhyb3cgRXJyb3IoIk5vIGR4IHByb3BlcnR5ICciK3RoaXMuZHgrIicgb24gYmlucyBkYXRhIik7aWYoIXRoaXMuX2RhdGFbMF1bdGhpcy5iaW5zXVswXS5oYXNPd25Qcm9wZXJ0eSh0aGlzLnkpKXRocm93IEVycm9yKCJObyB5IHByb3BlcnR5ICciK3RoaXMueSsiJyBvbiBiaW5zIGRhdGEiKTt2YXIgYz10aGlzLnRpbWVQcm9wZXJ0eSxkPXRoaXMueCxmPXRoaXMuYmlucyxnPXRoaXMuZHgsCmw9dGhpcy55LGs9dGhpcy5fZGF0YSxuPXRoaXMubW9kZSxwPWQzLmhjbCh0aGlzLmNvbG9yU2NhbGUodGhpcy5fbmFtZSkpLHE9ZDMuc2VsZWN0KHRoaXMuJC50b29sdGlwKSxyPWZ1bmN0aW9uKHphKXtyZXR1cm4gemFbZF19LHQ9ZnVuY3Rpb24oemEpe3JldHVybiB6YVtsXX0sdj1mdW5jdGlvbih6YSl7cmV0dXJuIHphW2RdK3phW2ddfSx5PWZ1bmN0aW9uKHphKXtyZXR1cm4gemFbY119OyJyZWxhdGl2ZSI9PT1jJiYoeT1mdW5jdGlvbih6YSl7cmV0dXJuIHphLndhbGxfdGltZS1rWzBdLndhbGxfdGltZX0pO3ZhciB6PXRoaXMuJC5zdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkseD16LndpZHRoLEM9ei5oZWlnaHQsRj01O2lmKCJvZmZzZXQiPT09bil7dmFyIEQ9Qy8yLjU7Rj1EKzV9ZWxzZSBEPUMtRi0yMDt2YXIgQj14LTI0LTYwLEk9Qy1GLTIwO2QzLm1pbihrLHIpO2QzLm1heChrLHYpO3ZhciBPPWQzLmZvcm1hdCgiLjNuIik7ej1kMy5mb3JtYXQoIi4wZiIpOyJ3YWxsX3RpbWUiPT09CmM/ej1kMy50aW1lRm9ybWF0KCIlbS8lZCAlWCIpOiJyZWxhdGl2ZSI9PT1jJiYoej1mdW5jdGlvbih6YSl7cmV0dXJuIGQzLmZvcm1hdCgiLjFyIikoemEvMzZFNSkrImgifSk7dmFyIFA9ay5tYXAoZnVuY3Rpb24oemEpe3JldHVybltkMy5taW4oemFbZl0sciksZDMubWF4KHphW2ZdLHYpXX0pLEg9ay5tYXAoZnVuY3Rpb24oemEpe3JldHVybiBkMy5leHRlbnQoemFbZl0sdCl9KSxLPWQzLmV4dGVudChrLHkpLE09KCJ3YWxsX3RpbWUiPT09Yz9kMy5zY2FsZVRpbWUoKTpkMy5zY2FsZUxpbmVhcigpKS5kb21haW4oSykucmFuZ2UoWzAsIm9mZnNldCI9PT1uP0k6MF0pLEw9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzAsZDMubWF4KGssZnVuY3Rpb24oemEsVWEpe3JldHVybiBIW1VhXVsxXX0pXSkucmFuZ2UoW0QsMF0pLFI9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oTC5kb21haW4oKSkucmFuZ2UoWzUwMCwwXSksVT1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbZDMubWluKGssZnVuY3Rpb24oemEsClVhKXtyZXR1cm4gUFtVYV1bMF19KSxkMy5tYXgoayxmdW5jdGlvbih6YSxVYSl7cmV0dXJuIFBbVWFdWzFdfSldKS5uaWNlKCkucmFuZ2UoWzAsQl0pLFk9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oVS5kb21haW4oKSkucmFuZ2UoWzAsNTAwXSksYmE9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oZDMuZXh0ZW50KGsseSkpLnJhbmdlKFtwLmRhcmtlcigpLHAuYnJpZ2h0ZXIoKV0pLmludGVycG9sYXRlKGQzLmludGVycG9sYXRlSGNsKTtwPWQzLmF4aXNCb3R0b20oVSkudGlja3MoKTt2YXIgbWE9ZDMuYXhpc1JpZ2h0KE0pLnRpY2tzKCkudGlja0Zvcm1hdCh6KSxhYT1kMy5heGlzUmlnaHQoTCkudGlja3MoKS50aWNrU2l6ZShCKzUpLnRpY2tGb3JtYXQoTyksY2E9ZnVuY3Rpb24oemEpe3JldHVybiB6YVtkXSt6YVtnXS8yfSxmYT1kMy5saW5lKCkueChmdW5jdGlvbih6YSl7cmV0dXJuIFkoY2EoemEpKX0pLnkoZnVuY3Rpb24oemEpe3JldHVybiBSKHphW2xdKX0pLGRhPWZ1bmN0aW9uKHphKXtyZXR1cm4iTSIrClkoY2EoemFbMF0pKSsiLCIrUigwKSsiTCIrZmEoemEpLnNsaWNlKDEpKyJMIitZKGNhKHphW3phLmxlbmd0aC0xXSkpKyIsIitSKDApfSxsYT10aGlzLiQuc3ZnO3o9ZDMuc2VsZWN0KGxhKTthPXoudHJhbnNpdGlvbigpLmR1cmF0aW9uKGEpO3o9ei5zZWxlY3QoImciKS5jbGFzc2VkKCJzbWFsbCIsZnVuY3Rpb24oKXtyZXR1cm4gMDxCJiYxNTA+PUJ9KS5jbGFzc2VkKCJtZWRpdW0iLGZ1bmN0aW9uKCl7cmV0dXJuIDE1MDxCJiYzMDA+PUJ9KS5jbGFzc2VkKCJsYXJnZSIsZnVuY3Rpb24oKXtyZXR1cm4gMzAwPEJ9KTthPWEuc2VsZWN0KCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDI0LCIrRisiKSIpO3ZhciBaPWQzLmJpc2VjdG9yKHYpLmxlZnQ7Sz16LnNlbGVjdCgiLnN0YWdlIikub24oIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt4YS5zdHlsZSgib3BhY2l0eSIsMSk7eWEuc3R5bGUoIm9wYWNpdHkiLDEpO0JhLnN0eWxlKCJvcGFjaXR5IiwxKTtHYS5zdHlsZSgib3BhY2l0eSIsCjEpO3Euc3R5bGUoIm9wYWNpdHkiLDEpfSkub24oIm1vdXNlb3V0IixmdW5jdGlvbigpe3hhLnN0eWxlKCJvcGFjaXR5IiwwKTt5YS5zdHlsZSgib3BhY2l0eSIsMCk7QmEuc3R5bGUoIm9wYWNpdHkiLDApO0dhLnN0eWxlKCJvcGFjaXR5IiwwKTt4YS5jbGFzc2VkKCJob3Zlci1jbG9zZXN0IiwhMSk7RmEuY2xhc3NlZCgib3V0bGluZS1ob3ZlciIsITEpO3Euc3R5bGUoIm9wYWNpdHkiLDApfSkub24oIm1vdXNlbW92ZSIsZnVuY3Rpb24oKXtmdW5jdGlvbiB6YShHYil7cmV0dXJuIE1hdGgubWluKEdiW2ZdLmxlbmd0aC0xLFooR2JbZl0sWmEpKX12YXIgVWE9ZDMubW91c2UodGhpcyksWmE9VS5pbnZlcnQoVWFbMF0pO00uaW52ZXJ0KFVhWzFdKTt2YXIgemIsSWI9SW5maW5pdHksdWI7eGEuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihHYil7dmFyIFJiPXphKEdiKTt1Yj1HYjt2YXIgRWM9VShHYltmXVtSYl1bZF0rR2JbZl1bUmJdW2ddLzIpO1JiPUwoR2JbZl1bUmJdW2xdKTt2YXIgeGM9CiJvZmZzZXQiPT09bj9NKHkoR2IpKS0oRC1SYik6UmI7eGM9TWF0aC5hYnMoVWFbMV0teGMpO3hjPEliJiYoSWI9eGMsemI9R2IpO3JldHVybiJ0cmFuc2xhdGUoIitFYysiLCIrUmIrIikifSk7eGEuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbihHYil7dmFyIFJiPXphKEdiKTtyZXR1cm4gR2JbZl1bUmJdW2xdfSk7eGEuY2xhc3NlZCgiaG92ZXItY2xvc2VzdCIsZnVuY3Rpb24oR2Ipe3JldHVybiBHYj09PXpifSk7RmEuY2xhc3NlZCgib3V0bGluZS1ob3ZlciIsZnVuY3Rpb24oR2Ipe3JldHVybiBHYj09PXpifSk7dmFyIEZiPXphKHViKTt5YS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK1UodWJbZl1bRmJdW2RdK3ViW2ZdW0ZiXVtnXS8yKSsiLCAiK0krIikifSkuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbigpe3JldHVybiBPKHViW2ZdW0ZiXVtkXSt1YltmXVtGYl1bZ10vMil9KTt2YXIgQWI9bWEudGlja0Zvcm1hdCgpO0JhLmF0dHIoInRyYW5zZm9ybSIsCmZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK0IrIiwgIisoIm9mZnNldCI9PT1uP00oeSh6YikpOjApKyIpIn0pLnN0eWxlKCJkaXNwbGF5Iiwib2Zmc2V0Ij09PW4/IiI6Im5vbmUiKS5zZWxlY3QoInRleHQiKS50ZXh0KGZ1bmN0aW9uKCl7cmV0dXJuIEFiKHkoemIpKX0pO3ZhciBQYj1hYS50aWNrRm9ybWF0KCk7R2EuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbigpe3JldHVybiJ0cmFuc2xhdGUoIitCKyIsICIrKCJvZmZzZXQiPT09bj8wOkwoemJbZl1bRmJdW2xdKSkrIikifSkuc3R5bGUoImRpc3BsYXkiLCJvZmZzZXQiPT09bj8ibm9uZSI6IiIpLnNlbGVjdCgidGV4dCIpLnRleHQoZnVuY3Rpb24oKXtyZXR1cm4gUGIoemJbZl1bRmJdW2xdKX0pO3ZhciBiYz1kMy5tb3VzZShsYSk7cS5zdHlsZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrKGJjWzBdKzE1KSsicHgsIisoYmNbMV0tMTUpKyJweCkiKS5zZWxlY3QoInNwYW4iKS50ZXh0KCJvZmZzZXQiPT09bj9QYih6YltmXVtGYl1bbF0pOgooInN0ZXAiPT09Yz8ic3RlcCAiOiIiKStBYih5KHpiKSkpfSk7Sy5zZWxlY3QoIi5iYWNrZ3JvdW5kIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKC0yNCwiKy1GKyIpIikuYXR0cigid2lkdGgiLHgpLmF0dHIoImhlaWdodCIsQyk7Qz1LLnNlbGVjdEFsbCgiLmhpc3RvZ3JhbSIpLmRhdGEoayk7Qy5leGl0KCkucmVtb3ZlKCk7eD1DLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJoaXN0b2dyYW0iKTtDPXgubWVyZ2UoQykuc29ydChmdW5jdGlvbih6YSxVYSl7cmV0dXJuIHkoemEpLXkoVWEpfSk7Rj1hLnNlbGVjdEFsbCgiLmhpc3RvZ3JhbSIpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oemEpe3JldHVybiJ0cmFuc2xhdGUoMCwgIisoIm9mZnNldCI9PT1uP00oeSh6YSkpLUQ6MCkrIikifSk7eC5hcHBlbmQoImxpbmUiKS5hdHRyKCJjbGFzcyIsImJhc2VsaW5lIik7Ri5zZWxlY3QoIi5iYXNlbGluZSIpLnN0eWxlKCJzdHJva2Utb3BhY2l0eSIsZnVuY3Rpb24oKXtyZXR1cm4ib2Zmc2V0Ij09PQpuPy4xOjB9KS5hdHRyKCJ5MSIsRCkuYXR0cigieTIiLEQpLmF0dHIoIngyIixCKTt4LmFwcGVuZCgicGF0aCIpLmF0dHIoImNsYXNzIiwib3V0bGluZSIpO3ZhciBGYT1DLnNlbGVjdCgiLm91dGxpbmUiKS5hdHRyKCJ2ZWN0b3ItZWZmZWN0Iiwibm9uLXNjYWxpbmctc3Ryb2tlIikuYXR0cigiZCIsZnVuY3Rpb24oemEpe3JldHVybiBkYSh6YVtmXSl9KS5zdHlsZSgic3Ryb2tlLXdpZHRoIiwxKTtGLnNlbGVjdCgiLm91dGxpbmUiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJzY2FsZSgiK0IvNTAwKyIsICIrRC81MDArIikiKS5zdHlsZSgic3Ryb2tlIixmdW5jdGlvbih6YSl7cmV0dXJuIm9mZnNldCI9PT1uPyJ3aGl0ZSI6YmEoeSh6YSkpfSkuc3R5bGUoImZpbGwtb3BhY2l0eSIsZnVuY3Rpb24oKXtyZXR1cm4ib2Zmc2V0Ij09PW4/MTowfSkuc3R5bGUoImZpbGwiLGZ1bmN0aW9uKHphKXtyZXR1cm4gYmEoeSh6YSkpfSk7eD14LmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwiaG92ZXIiKS5zdHlsZSgiZmlsbCIsCmZ1bmN0aW9uKHphKXtyZXR1cm4gYmEoeSh6YSkpfSk7dmFyIHhhPUMuc2VsZWN0KCIuaG92ZXIiKTt4LmFwcGVuZCgiY2lyY2xlIikuYXR0cigiciIsMik7eC5hcHBlbmQoInRleHQiKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKS5hdHRyKCJkeCIsNCk7eD16LnNlbGVjdCgiLngtYXhpcy1ob3ZlciIpLnNlbGVjdEFsbCgiLmxhYmVsIikuZGF0YShbIngiXSk7Qz14LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsYWJlbCIpO3ZhciB5YT14Lm1lcmdlKEMpO0MuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLTIwKS5hdHRyKCJ5Iiw2KS5hdHRyKCJ3aWR0aCIsNDApLmF0dHIoImhlaWdodCIsMTQpO0MuYXBwZW5kKCJsaW5lIikuYXR0cigieDEiLDApLmF0dHIoIngyIiwwKS5hdHRyKCJ5MSIsMCkuYXR0cigieTIiLDYpO0MuYXBwZW5kKCJ0ZXh0IikuYXR0cigiZHkiLDE4KTt4PXouc2VsZWN0KCIueS1heGlzLWhvdmVyIikuc2VsZWN0QWxsKCIubGFiZWwiKS5kYXRhKFsieSJdKTsKQz14LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsYWJlbCIpO3ZhciBCYT14Lm1lcmdlKEMpO0MuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsOCkuYXR0cigieSIsLTYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCk7Qy5hcHBlbmQoImxpbmUiKS5hdHRyKCJ4MSIsMCkuYXR0cigieDIiLDYpLmF0dHIoInkxIiwwKS5hdHRyKCJ5MiIsMCk7Qy5hcHBlbmQoInRleHQiKS5hdHRyKCJkeCIsOCkuYXR0cigiZHkiLDQpO3o9ei5zZWxlY3QoIi55LXNsaWNlLWF4aXMtaG92ZXIiKS5zZWxlY3RBbGwoIi5sYWJlbCIpLmRhdGEoWyJ5Il0pO3g9ei5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibGFiZWwiKTt2YXIgR2E9ei5tZXJnZSh4KTt4LmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLDgpLmF0dHIoInkiLC02KS5hdHRyKCJ3aWR0aCIsNDApLmF0dHIoImhlaWdodCIsMTQpO3guYXBwZW5kKCJsaW5lIikuYXR0cigieDEiLDApLmF0dHIoIngyIiw2KS5hdHRyKCJ5MSIsCjApLmF0dHIoInkyIiwwKTt4LmFwcGVuZCgidGV4dCIpLmF0dHIoImR4Iiw4KS5hdHRyKCJkeSIsNCk7YS5zZWxlY3QoIi55LmF4aXMuc2xpY2UiKS5zdHlsZSgib3BhY2l0eSIsIm9mZnNldCI9PT1uPzA6MSkuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDAsICIrKCJvZmZzZXQiPT09bj8tRDowKSsiKSIpLmNhbGwoYWEpO2Euc2VsZWN0KCIueC5heGlzIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDAsICIrSSsiKSIpLmNhbGwocCk7YS5zZWxlY3QoIi55LmF4aXMiKS5zdHlsZSgib3BhY2l0eSIsIm9mZnNldCI9PT1uPzE6MCkuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrQisiLCAiKygib2Zmc2V0Ij09PW4/MDpJKSsiKSIpLmNhbGwobWEpO2Euc2VsZWN0QWxsKCIudGljayB0ZXh0IikuYXR0cigiZmlsbCIsIiNhYWEiKTthLnNlbGVjdEFsbCgiLmF4aXMgcGF0aC5kb21haW4iKS5hdHRyKCJzdHJva2UiLCJub25lIil9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhpc3RvZ3JhbS1kYXNoYm9hcmQvaGlzdG9ncmFtQ29yZS5qcwp2YXIgb3A7CihmdW5jdGlvbihhKXtmdW5jdGlvbiBjKGYpe2NvbnN0IFtnLGwsa109ZjtyZXR1cm57d2FsbF90aW1lOmcsc3RlcDpsLG1pbjpkMy5taW4oay5tYXAoKFtuXSk9Pm4pKSxtYXg6ZDMubWF4KGsubWFwKChbLG5dKT0+bikpLGJ1Y2tldHM6ay5tYXAoKFtuLHAscV0pPT4oe2xlZnQ6bixyaWdodDpwLGNvdW50OnF9KSl9fWZ1bmN0aW9uIGQoZixnLGwsaz0zMCl7bD09PWcmJihsPTEuMSpnKzEsZz1nLzEuMS0xKTtjb25zdCBuPShsLWcpL2s7bGV0IHA9MDtyZXR1cm4gZDMucmFuZ2UoZyxsLG4pLm1hcChxPT57Y29uc3Qgcj1xK247bGV0IHQ9MDtmb3IoO3A8Zi5idWNrZXRzLmxlbmd0aDspe2NvbnN0IHk9TWF0aC5taW4obCxmLmJ1Y2tldHNbcF0ucmlnaHQpO3ZhciB2PU1hdGgubWF4KGcsZi5idWNrZXRzW3BdLmxlZnQpO2NvbnN0IHo9TWF0aC5taW4oeSxyKS1NYXRoLm1heCh2LHEpO3Y9ei8oeS12KSpmLmJ1Y2tldHNbcF0uY291bnQ7dCs9MDx6P3Y6MDtpZih5PnIpYnJlYWs7cCsrfXJldHVybnt4OnEsCmR4Om4seTp0fX0pfWEuYmFja2VuZFRvSW50ZXJtZWRpYXRlPWM7YS5pbnRlcm1lZGlhdGVUb0QzPWQ7YS5iYWNrZW5kVG9Wej1mdW5jdGlvbihmKXtmPWYubWFwKGMpO2NvbnN0IGc9ZDMubWluKGYsaz0+ay5taW4pLGw9ZDMubWF4KGYsaz0+ay5tYXgpO3JldHVybiBmLm1hcChrPT4oe3dhbGxfdGltZTprLndhbGxfdGltZSxzdGVwOmsuc3RlcCxiaW5zOmQoayxnLGwpfSkpfX0pKG9wfHwob3A9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1oaXN0b2dyYW0tZGFzaGJvYXJkL3RmLWhpc3RvZ3JhbS1sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaGlzdG9ncmFtLWxvYWRlciIscHJvcGVydGllczp7cnVuOlN0cmluZyx0YWc6U3RyaW5nLGRhdGFUb0xvYWQ6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlRGF0YVRvTG9hZChydW4sIHRhZykifSxnZXREYXRhTG9hZE5hbWU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pih7cnVuOmF9KT0+YX0sZ2V0RGF0YUxvYWRVcmw6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pih7dGFnOmEscnVuOmN9KT0+UW8uYWRkUGFyYW1zKFFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJoaXN0b2dyYW1zIiwiL2hpc3RvZ3JhbXMiKSx7dGFnOmEscnVuOmN9KX0sbG9hZERhdGFDYWxsYmFjazp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybihhLGMsZCk9PnthPW9wLmJhY2tlbmRUb1Z6KGQpO2M9dGhpcy5nZXREYXRhTG9hZE5hbWUoYyk7dGhpcy4kLmNoYXJ0LnNldFNlcmllc0RhdGEoYyxhKX19fSx0YWdNZXRhZGF0YTpPYmplY3QsdGltZVByb3BlcnR5OlN0cmluZywKaGlzdG9ncmFtTW9kZTpTdHJpbmcsX2NvbG9yU2NhbGVGdW5jdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9PlhvLnJ1bnNDb2xvclNjYWxlfSxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVuLCB0YWcsIHJlcXVlc3RNYW5hZ2VyKSJdLGJlaGF2aW9yczpbVW8uRGF0YUxvYWRlckJlaGF2aW9yXSxfY29tcHV0ZURhdGFUb0xvYWQoYSxjKXtyZXR1cm5be3J1bjphLHRhZzpjfV19LF9jb21wdXRlUnVuQ29sb3IoYSl7cmV0dXJuIHRoaXMuX2NvbG9yU2NhbGVGdW5jdGlvbihhKX0scmVkcmF3KCl7dGhpcy4kLmNoYXJ0LnJlZHJhdygpfSxfdG9nZ2xlRXhwYW5kZWQoKXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaGlzdG9ncmFtLWRhc2hib2FyZC90Zi1oaXN0b2dyYW0tZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhpc3RvZ3JhbS1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19oaXN0b2dyYW1Nb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToib2Zmc2V0In0sX3RpbWVQcm9wZXJ0eTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0ZXAifSxfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZzpPYmplY3QsX3J1blRvVGFnSW5mbzpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6U3RyaW5nLF9yZXN0YW1wOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlciwgX2NhdGVnb3JpZXNEb21SZWFkeSkifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUW8uUmVxdWVzdE1hbmFnZXJ9fSxsaXN0ZW5lcnM6eyJjb250ZW50LXZpc2liaWxpdHktY2hhbmdlZCI6Il9yZWRyYXdDYXRlZ29yeVBhbmUifSwKX3JlZHJhd0NhdGVnb3J5UGFuZShhLGMpe2MmJmEudGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWhpc3RvZ3JhbS1sb2FkZXIiKS5mb3JFYWNoKGQ9PmQucmVkcmF3KCkpfSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRIaXN0b2dyYW1zKCl9KX0sX2ZldGNoVGFncygpe2NvbnN0IGE9UW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImhpc3RvZ3JhbXMiLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGEpLnRoZW4oYz0+e2lmKCFfLmlzRXF1YWwoYyx0aGlzLl9ydW5Ub1RhZ0luZm8pKXt2YXIgZD1fLm1hcFZhbHVlcyhjLGc9Pk9iamVjdC5rZXlzKGcpKSxmPVFvLmdldFRhZ3MoZCk7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1mLmxlbmd0aCk7dGhpcy5zZXQoIl9ydW5Ub1RhZyIsZCk7dGhpcy5zZXQoIl9ydW5Ub1RhZ0luZm8iLGMpO3RoaXMuYXN5bmMoKCk9Pgp7dGhpcy5zZXQoIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCEwKX0pfX0pfSxfcmVsb2FkSGlzdG9ncmFtcygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1oaXN0b2dyYW0tbG9hZGVyIikuZm9yRWFjaChhPT57YS5yZWxvYWQoKX0pfSxfc2hvdWxkT3BlbihhKXtyZXR1cm4gMj49YX0sX21ha2VDYXRlZ29yaWVzKGEsYyxkKXtyZXR1cm4gUm8uY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhhLGMsZCl9LF90YWdNZXRhZGF0YShhLGMsZCl7cmV0dXJuIGFbY11bZF19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtdGV4dC1kYXNoYm9hcmQvdGYtdGV4dC1sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtdGV4dC1sb2FkZXIiLHByb3BlcnRpZXM6e3J1bjpTdHJpbmcsdGFnOlN0cmluZyxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxfdGV4dHM6e3R5cGU6QXJyYXksdmFsdWU6W119LHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFFvLkNhbmNlbGxlcn19LF9jb21wdXRlUnVuQ29sb3IoYSl7cmV0dXJuIFhvLnJ1bnNDb2xvclNjYWxlKGEpfSxhdHRhY2hlZCgpe3RoaXMuX2F0dGFjaGVkPSEwO3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe2lmKHRoaXMuX2F0dGFjaGVkKXt0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7dmFyIGE9UW8uYWRkUGFyYW1zKFFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJ0ZXh0IiwiL3RleHQiKSx7dGFnOnRoaXMudGFnLHJ1bjp0aGlzLnJ1bn0pLGM9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKGQ9PntkLmNhbmNlbGxlZHx8CihkPWQudmFsdWUubWFwKGY9Pih7d2FsbF90aW1lOm5ldyBEYXRlKDFFMypmLndhbGxfdGltZSksc3RlcDpmLnN0ZXAsdGV4dDpmLnRleHR9KSksdGhpcy5zZXQoIl90ZXh0cyIsZC5zbGljZSgpLnJldmVyc2UoKSkpfSk7dGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGEpLnRoZW4oYyl9fSxfZm9ybWF0U3RlcChhKXtyZXR1cm4gZDMuZm9ybWF0KCIsIikoYSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtdGV4dC1kYXNoYm9hcmQvdGYtdGV4dC1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtdGV4dC1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19zZWxlY3RlZFJ1bnM6QXJyYXksX3J1blRvVGFnOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjpTdHJpbmcsX2NhdGVnb3JpZXNEb21SZWFkeTpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyLCBfY2F0ZWdvcmllc0RvbVJlYWR5KSJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBRby5SZXF1ZXN0TWFuYWdlcn19LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKT0+e3RoaXMuX3JlbG9hZFRleHRzKCl9KX0sX3Nob3VsZE9wZW4oYSl7cmV0dXJuIDI+PWF9LF9mZXRjaFRhZ3MoKXtjb25zdCBhPVFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJ0ZXh0IiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChhKS50aGVuKGM9Pgp7aWYoIV8uaXNFcXVhbChjLHRoaXMuX3J1blRvVGFnKSl7dmFyIGQ9UW8uZ2V0VGFncyhjKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWQubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnIixjKTt0aGlzLmFzeW5jKCgpPT57dGhpcy5zZXQoIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCEwKX0pfX0pfSxfcmVsb2FkVGV4dHMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtdGV4dC1sb2FkZXIiKS5mb3JFYWNoKGE9PnthLnJlbG9hZCgpfSl9LF9tYWtlQ2F0ZWdvcmllcyhhLGMsZCl7cmV0dXJuIFJvLmNhdGVnb3JpemVSdW5UYWdDb21iaW5hdGlvbnMoYSxjLGQpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXByLWN1cnZlLWRhc2hib2FyZC90Zi1wci1jdXJ2ZS1jYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXByLWN1cnZlLWNhcmQiLHByb3BlcnRpZXM6e3J1bnM6QXJyYXksdGFnOlN0cmluZyx0YWdNZXRhZGF0YTpPYmplY3QscnVuVG9TdGVwQ2FwOk9iamVjdCxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsYWN0aXZlOkJvb2xlYW4sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfcnVuVG9QckN1cnZlRW50cnk6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfcHJldmlvdXNSdW5Ub1ByQ3VydmVFbnRyeTp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9ydW5zV2l0aFN0ZXBBdmFpbGFibGU6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlUnVuc1dpdGhTdGVwQXZhaWxhYmxlKHJ1bnMsIF9ydW5Ub1ByQ3VydmVFbnRyeSkifSxfc2V0T2ZSZWxldmFudFJ1bnM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZVNldE9mUmVsZXZhbnRSdW5zKF9ydW5zV2l0aFN0ZXBBdmFpbGFibGUpIn0sX3J1blRvRGF0YU92ZXJUaW1lOk9iamVjdCwKX2NvbG9yU2NhbGVGdW5jdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7c2NhbGU6WG8ucnVuc0NvbG9yU2NhbGV9KX0sX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBRby5DYW5jZWxsZXJ9LF9hdHRhY2hlZDpCb29sZWFuLF94Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCx2YWx1ZTooKT0+KCk9Pntjb25zdCBhPW5ldyBQbG90dGFibGUuU2NhbGVzLkxpbmVhcjtyZXR1cm57c2NhbGU6YSxheGlzOm5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKGEsImJvdHRvbSIpLGFjY2Vzc29yOmM9PmMucmVjYWxsfX19LF95VmFsdWVBY2Nlc3Nvcjp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsdmFsdWU6KCk9PmE9PmEucHJlY2lzaW9ufSxfdG9vbHRpcENvbHVtbnM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsdmFsdWU6KCk9Pntjb25zdCBhPSRvLm11bHRpc2NhbGVGb3JtYXR0ZXIoJG8uWV9UT09MVElQX0ZPUk1BVFRFUl9QUkVDSVNJT04pLApjPWQ9PmlzTmFOKGQpPyJOYU4iOmEoZCk7cmV0dXJuW3t0aXRsZToiUnVuIixldmFsdWF0ZTpkPT5kLmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfSx7dGl0bGU6IlRocmVzaG9sZCIsZXZhbHVhdGU6ZD0+YyhkLmRhdHVtLnRocmVzaG9sZHMpfSx7dGl0bGU6IlByZWNpc2lvbiIsZXZhbHVhdGU6ZD0+YyhkLmRhdHVtLnByZWNpc2lvbil9LHt0aXRsZToiUmVjYWxsIixldmFsdWF0ZTpkPT5jKGQuZGF0dW0ucmVjYWxsKX0se3RpdGxlOiJUUCIsZXZhbHVhdGU6ZD0+ZC5kYXR1bS50cnVlX3Bvc2l0aXZlc30se3RpdGxlOiJGUCIsZXZhbHVhdGU6ZD0+ZC5kYXR1bS5mYWxzZV9wb3NpdGl2ZXN9LHt0aXRsZToiVE4iLGV2YWx1YXRlOmQ9PmQuZGF0dW0udHJ1ZV9uZWdhdGl2ZXN9LHt0aXRsZToiRk4iLGV2YWx1YXRlOmQ9PmQuZGF0dW0uZmFsc2VfbmVnYXRpdmVzfV19fSxfc2VyaWVzRGF0YUZpZWxkczp7dHlwZTpBcnJheSx2YWx1ZToidGhyZXNob2xkcyBwcmVjaXNpb24gcmVjYWxsIHRydWVfcG9zaXRpdmVzIGZhbHNlX3Bvc2l0aXZlcyB0cnVlX25lZ2F0aXZlcyBmYWxzZV9uZWdhdGl2ZXMiLnNwbGl0KCIgIiksCnJlYWRPbmx5OiEwfSxfZGVmYXVsdFhSYW5nZTp7dHlwZTpBcnJheSx2YWx1ZTpbLS4wNSwxLjA1XSxyZWFkT25seTohMH0sX2RlZmF1bHRZUmFuZ2U6e3R5cGU6QXJyYXksdmFsdWU6Wy0uMDUsMS4wNV0scmVhZE9ubHk6ITB9LF9kYXRhVXJsOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGE9Pntjb25zdCBjPXRoaXMudGFnO3JldHVybiBRby5hZGRQYXJhbXMoUW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInByX2N1cnZlcyIsIi9wcl9jdXJ2ZXMiKSx7dGFnOmMscnVuOmF9KX19fSxfc21vb3RoaW5nRW5hYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlYWRPbmx5OiEwfX0sb2JzZXJ2ZXJzOlsicmVsb2FkKHJ1bnMsIHRhZykiLCJfc2V0Q2hhcnREYXRhKF9ydW5Ub1ByQ3VydmVFbnRyeSwgX3ByZXZpb3VzUnVuVG9QckN1cnZlRW50cnksIF9zZXRPZlJlbGV2YW50UnVucykiLCJfdXBkYXRlUnVuVG9QckN1cnZlRW50cnkoX3J1blRvRGF0YU92ZXJUaW1lLCBydW5Ub1N0ZXBDYXApIl0sCl9jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKCl7cmV0dXJuKGEsYyxkKT0+e3RoaXMuc2V0KCJfcnVuVG9EYXRhT3ZlclRpbWUiLE9iamVjdC5hc3NpZ24oe30sdGhpcy5fcnVuVG9EYXRhT3ZlclRpbWUsZCkpfX0sX2NvbXB1dGVSdW5Db2xvcihhKXtyZXR1cm4gdGhpcy5fY29sb3JTY2FsZUZ1bmN0aW9uLnNjYWxlKGEpfSxhdHRhY2hlZCgpe3RoaXMuX2F0dGFjaGVkPSEwO3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2F0dGFjaGVkJiYoMD09PXRoaXMucnVucy5sZW5ndGg/dGhpcy5zZXQoIl9ydW5Ub0RhdGFPdmVyVGltZSIse30pOnRoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5yZWxvYWQoKSl9LF9zZXRDaGFydERhdGEoYSxjLGQpe18uZm9yT3duKGEsKGYsZyk9Pntjb25zdCBsPWNbZ107bCYmYVtnXS5zdGVwPT09bC5zdGVwfHwoZFtnXT90aGlzLl91cGRhdGVTZXJpZXNEYXRhRm9yUnVuKGcsZik6dGhpcy5fY2xlYXJTZXJpZXNEYXRhKGcpKX0pfSwKX3VwZGF0ZVNlcmllc0RhdGFGb3JSdW4oYSxjKXtjb25zdCBkPV8ucmVkdWNlKHRoaXMuX3Nlcmllc0RhdGFGaWVsZHMsKGcsbCk9PntnW2xdPWNbbF0uc2xpY2UoKS5yZXZlcnNlKCk7cmV0dXJuIGd9LHt9KSxmPUFycmF5KGRbdGhpcy5fc2VyaWVzRGF0YUZpZWxkc1swXV0ubGVuZ3RoKTtmb3IobGV0IGc9MDtnPGYubGVuZ3RoO2crKylmW2ddPV8ubWFwVmFsdWVzKGQsbD0+bFtnXSk7dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpLnNldFNlcmllc0RhdGEoYSxmKX0sX2NsZWFyU2VyaWVzRGF0YShhKXt0aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikuc2V0U2VyaWVzRGF0YShhLFtdKX0sX3VwZGF0ZVJ1blRvUHJDdXJ2ZUVudHJ5KGEsYyl7Y29uc3QgZD17fTtfLmZvck93bihhLChmLGcpPT57ZiYmZi5sZW5ndGgmJihkW2ddPXRoaXMuX2NvbXB1dGVFbnRyeUNsb3Nlc3RPckVxdWFsVG9TdGVwQ2FwKGNbZ10sZikpfSk7dGhpcy5zZXQoIl9wcmV2aW91c1J1blRvUHJDdXJ2ZUVudHJ5IiwKdGhpcy5fcnVuVG9QckN1cnZlRW50cnkpO3RoaXMuc2V0KCJfcnVuVG9QckN1cnZlRW50cnkiLGQpfSxfY29tcHV0ZUVudHJ5Q2xvc2VzdE9yRXF1YWxUb1N0ZXBDYXAoYSxjKXthPU1hdGgubWluKF8uc29ydGVkSW5kZXgoYy5tYXAoZD0+ZC5zdGVwKSxhKSxjLmxlbmd0aC0xKTtyZXR1cm4gY1thXX0sX2NvbXB1dGVSdW5zV2l0aFN0ZXBBdmFpbGFibGUoYSxjKXtyZXR1cm4gXy5maWx0ZXIoYSxkPT5jW2RdKS5zb3J0KCl9LF9jb21wdXRlU2V0T2ZSZWxldmFudFJ1bnMoYSl7Y29uc3QgYz17fTtfLmZvckVhY2goYSxkPT57Y1tkXT0hMH0pO3JldHVybiBjfSxfY29tcHV0ZUN1cnJlbnRTdGVwRm9yUnVuKGEsYyl7cmV0dXJuKGE9YVtjXSk/YS5zdGVwOm51bGx9LF9jb21wdXRlQ3VycmVudFdhbGxUaW1lRm9yUnVuKGEsYyl7cmV0dXJuKGE9YVtjXSk/KG5ldyBEYXRlKDFFMyphLndhbGxfdGltZSkpLnRvU3RyaW5nKCk6bnVsbH0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsCiF0aGlzLl9leHBhbmRlZCk7dGhpcy5yZWRyYXcoKX0sX3Jlc2V0RG9tYWluKCl7dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpLnJlc2V0RG9tYWluKCl9LHJlZHJhdygpe3RoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5yZWRyYXcoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wci1jdXJ2ZS1kYXNoYm9hcmQvdGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3IuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3IiLHByb3BlcnRpZXM6e3J1bnM6QXJyYXkscnVuVG9BdmFpbGFibGVUaW1lRW50cmllczpPYmplY3QscnVuVG9TdGVwOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsY29tcHV0ZWQ6Il9jb21wdXRlUnVuVG9TdGVwKHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMsIF9ydW5Ub1N0ZXBJbmRleCkifSx0aW1lRGlzcGxheVR5cGU6U3RyaW5nLF9ydW5Ub1N0ZXBJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9ydW5zV2l0aFNsaWRlcnM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlUnVuc1dpdGhTbGlkZXJzKHJ1bnMsIHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMpIn19LG9ic2VydmVyczpbIl91cGRhdGVTdGVwc0Zvck5ld1J1bnMocnVuVG9BdmFpbGFibGVUaW1lRW50cmllcykiXSxfY29tcHV0ZUNvbG9yRm9yUnVuKGEpe3JldHVybiBYby5ydW5zQ29sb3JTY2FsZShhKX0sX2NvbXB1dGVUaW1lVGV4dEZvclJ1bihhLApjLGQsZil7Yz1jW2RdO2lmKCFfLmlzTnVtYmVyKGMpKXJldHVybiIiO2E9YVtkXTtpZighYSlyZXR1cm4iIjthPWFbY11bZl07aWYoInN0ZXAiPT09ZilyZXR1cm5gc3RlcCAke2F9YDtpZigicmVsYXRpdmUiPT09ZilyZXR1cm4gMT5hP2AkeygxRTMqYSkudG9GaXhlZCgyKX0gbXNgOmAke2EudG9GaXhlZCgyKX0gc2A7aWYoIndhbGxfdGltZSI9PT1mKXJldHVybihuZXcgRGF0ZSgxRTMqYSkpLnRvU3RyaW5nKCk7dGhyb3cgRXJyb3IoYFRoZSBkaXNwbGF5IHR5cGUgb2YgJHtmfSBpcyBub3QgcmVjb2duaXplZC5gKTt9LF9zbGlkZXJWYWx1ZUNoYW5nZWQoYSl7Y29uc3QgYz1hLnRhcmdldC5kYXRhc2V0LnJ1bixkPWEudGFyZ2V0LmltbWVkaWF0ZVZhbHVlLGY9T2JqZWN0LmFzc2lnbih7fSx0aGlzLl9ydW5Ub1N0ZXBJbmRleCk7aXNOYU4oZCk/ZGVsZXRlIGZbY106ZltjXT1hLnRhcmdldC5pbW1lZGlhdGVWYWx1ZTt0aGlzLl9ydW5Ub1N0ZXBJbmRleD1mfSxfY29tcHV0ZU1heFN0ZXBJbmRleEZvclJ1bihhLApjKXtyZXR1cm4oYT1hW2NdKSYmYS5sZW5ndGg/YS5sZW5ndGgtMTowfSxfdXBkYXRlU3RlcHNGb3JOZXdSdW5zKGEpe2NvbnN0IGM9T2JqZWN0LmFzc2lnbih7fSx0aGlzLl9ydW5Ub1N0ZXBJbmRleCk7Xy5mb3JPd24oYSwoZCxmKT0+e18uaXNOdW1iZXIoY1tmXSl8fChjW2ZdPWQubGVuZ3RoLTEpfSk7dGhpcy5fcnVuVG9TdGVwSW5kZXg9Y30sX2dldFN0ZXAoYSxjKXtyZXR1cm4gdGhpcy5fcnVuVG9TdGVwSW5kZXg/dGhpcy5fcnVuVG9TdGVwSW5kZXhbY106MH0sX2NvbXB1dGVSdW5Ub1N0ZXAoYSxjKXtjb25zdCBkPXt9O18uZm9yT3duKGMsKGYsZyk9Pntjb25zdCBsPWFbZ107bCYmKGRbZ109bFtmXS5zdGVwKX0pO3JldHVybiBkfSxfY29tcHV0ZVJ1bnNXaXRoU2xpZGVycyhhLGMpe3JldHVybiBhLmZpbHRlcihkPT5jW2RdKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wci1jdXJ2ZS1kYXNoYm9hcmQvdGYtcHItY3VydmUtZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXByLWN1cnZlLWRhc2hib2FyZCIscHJvcGVydGllczp7X3RpbWVEaXNwbGF5VHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0ZXAifSxfc2VsZWN0ZWRSdW5zOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX3J1blRvVGFnSW5mbzp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9ydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX3JlbGV2YW50U2VsZWN0ZWRSdW5zOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZVJlbGV2YW50U2VsZWN0ZWRSdW5zKF9zZWxlY3RlZFJ1bnMsIF9ydW5Ub1RhZ0luZm8pIn0sX3J1bnNXaXRoUHJDdXJ2ZURhdGE6QXJyYXksX3J1blRvU3RlcDp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjpTdHJpbmcsX2NhdGVnb3JpZXNEb21SZWFkeTpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnSW5mbywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlciwgX2NhdGVnb3JpZXNEb21SZWFkeSkifSwKX2dldENhdGVnb3J5SXRlbUtleTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+YT0+YS50YWd9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBRby5SZXF1ZXN0TWFuYWdlcn0sX3N0ZXA6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfX0scmVhZHkoKXt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXtQcm9taXNlLmFsbChbdGhpcy5fZmV0Y2hUYWdzKCksdGhpcy5fZmV0Y2hUaW1lRW50cmllc1BlclJ1bigpXSkudGhlbigoKT0+e3RoaXMuX3JlbG9hZENhcmRzKCl9KX0sX3Nob3VsZE9wZW4oYSl7cmV0dXJuIDI+PWF9LF9mZXRjaFRhZ3MoKXtjb25zdCBhPVFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJwcl9jdXJ2ZXMiLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGEpLnRoZW4oYz0+e2lmKCFfLmlzRXF1YWwoYyx0aGlzLl9ydW5Ub1RhZ0luZm8pKXt2YXIgZD1fLm1hcFZhbHVlcyhjLGY9Pl8ua2V5cyhmKSk7CmQ9UW8uZ2V0VGFncyhkKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWQubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsYyk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX2ZldGNoVGltZUVudHJpZXNQZXJSdW4oKXtjb25zdCBhPVFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJwcl9jdXJ2ZXMiLCIvYXZhaWxhYmxlX3RpbWVfZW50cmllcyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGEpLnRoZW4oYz0+e18uZm9yT3duKGMsZD0+e18uZm9yRWFjaChkLGY9PntmLnJlbGF0aXZlPWYud2FsbF90aW1lLWRbMF0ud2FsbF90aW1lfSl9KTt0aGlzLnNldCgiX3J1blRvQXZhaWxhYmxlVGltZUVudHJpZXMiLGMpO2M9Xy5rZXlzKGMpLnNsaWNlKCkuc29ydCgpO18uaXNFcXVhbChjLHRoaXMuX3J1bnNXaXRoUHJDdXJ2ZURhdGEpfHx0aGlzLnNldCgiX3J1bnNXaXRoUHJDdXJ2ZURhdGEiLApjKX0pfSxfcmVsb2FkQ2FyZHMoKXtfLmZvckVhY2godGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLXByLWN1cnZlLWNhcmQiKSxhPT57YS5yZWxvYWQoKX0pfSxfbWFrZUNhdGVnb3JpZXMoYSxjLGQpe2E9Xy5tYXBWYWx1ZXMoYSxmPT5PYmplY3Qua2V5cyhmKSk7cmV0dXJuIFJvLmNhdGVnb3JpemVUYWdzKGEsYyxkKX0sX2NvbXB1dGVDb2xvckZvclJ1bihhKXtyZXR1cm4gWG8ucnVuc0NvbG9yU2NhbGUoYSl9LF9jb21wdXRlUmVsZXZhbnRTZWxlY3RlZFJ1bnMoYSxjKXtyZXR1cm4gYS5maWx0ZXIoZD0+Y1tkXSl9LF90YWdNZXRhZGF0YShhLGMsZCl7Y29uc3QgZj17fTtjLmZvckVhY2goZz0+e2ZbZ109YVtnXVtkXX0pO2M9ZC5yZXBsYWNlKC9cL3ByX2N1cnZlcyQvLCIiKTtyZXR1cm4gWm8uYWdncmVnYXRlVGFnSW5mbyhmLGMpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXNwaW5uZXIvcGFwZXItc3Bpbm5lci5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1zcGlubmVyIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJTcGlubmVyQmVoYXZpb3JdfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW5wdXQtcGlwZWxpbmUvaW5wdXQtcGlwZWxpbmUtYW5hbHl6ZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoiaW5wdXQtcGlwZWxpbmUtYW5hbHl6ZXIiLHByb3BlcnRpZXM6e19kYXRhOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3VwZGF0ZVZpZXcifSxfc2hvd19kZXZpY2Vfc2lkZV9hbmFseXNpczp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLG5vdGlmeTohMH0sX3Nob3dfaG9zdF9zaWRlX2NoYXJ0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITAsbm90aWZ5OiEwfSxfc2hvd19ob3N0X3NpZGVfdGFibGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LF90b2dnbGVfYnV0dG9uX3RleHQ6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0VG9nZ2xlQnV0dG9uVGV4dChfc2hvd19ob3N0X3NpZGVfdGFibGUpIn0sX2RldmljZUpzb246e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2hvc3RKc29uOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9yZWNvbW1lbmRhdGlvbkpzb246e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCwKb2JzZXJ2ZXI6Il9vbkFjdGl2ZUNoYW5nZWQifSxfc3VtbWFyeV9jb25jbHVzaW9uOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9zdW1tYXJ5X25leHRzdGVwOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9pbmZlZWRfcGVyY2VudF9hdmVyYWdlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9pbmZlZWRfcGVyY2VudF9zdGRkZXY6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2luZmVlZF9wZXJjZW50X21pbmltdW06e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2luZmVlZF9wZXJjZW50X21heGltdW06e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX3N0ZXB0aW1lX21zX2F2ZXJhZ2U6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX3N0ZXB0aW1lX21zX3N0ZGRldjp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxfc3RlcHRpbWVfbXNfbWluaW11bTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxfc3RlcHRpbWVfbXNfbWF4aW11bTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfX0sb2JzZXJ2ZXJzOlsiX3Nob3dEZXZpY2VTdGVwQ2hhcnQoX2RldmljZUpzb24pIiwKIl9zaG93RGV2aWNlSW5mZWVkQ2hhcnQoX2RldmljZUpzb24pIiwiX3Nob3dIb3N0Q2hhcnQoX2hvc3RKc29uKSIsIl9zaG93SG9zdFRhYmxlKF9ob3N0SnNvbikiLCJfbWFrZVJlY29tbWVuZGF0aW9ucyhfcmVjb21tZW5kYXRpb25Kc29uKSJdLG9uQ2xpY2s6ZnVuY3Rpb24oKXt0aGlzLnNldCgiX3Nob3dfaG9zdF9zaWRlX3RhYmxlIiwhdGhpcy5fc2hvd19ob3N0X3NpZGVfdGFibGUpfSxfb25BY3RpdmVDaGFuZ2VkOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLl9zaG93X2hvc3Rfc2lkZV90YWJsZT10aGlzLl9zaG93X2hvc3Rfc2lkZV9jaGFydD10aGlzLl9zaG93X2RldmljZV9zaWRlX2FuYWx5c2lzPSExKX0sX2dldFRvZ2dsZUJ1dHRvblRleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuKGE/IkhpZGUiOiJTaG93IikrIiBJbnB1dCBPcCBTdGF0aXN0aWNzIn0sX3VzVG9NczpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5hYnMoTnVtYmVyKGEpKS8xRTN9LF91cGRhdGVWaWV3OmZ1bmN0aW9uKCl7aWYodGhpcy5fZGF0YSYmCnRoaXMuX2FjdGl2ZSl7dmFyIGE9dGhpcy5fZGF0YVswXTt0aGlzLl9kZXZpY2VKc29uPWE7dGhpcy5faG9zdEpzb249dGhpcy5fZGF0YVsyXTt0aGlzLl9yZWNvbW1lbmRhdGlvbkpzb249dGhpcy5fZGF0YVszXTt0aGlzLl9zdW1tYXJ5X2NvbmNsdXNpb249YS5wLnN1bW1hcnlfY29uY2x1c2lvbjt0aGlzLl9zdW1tYXJ5X25leHRzdGVwPWEucC5zdW1tYXJ5X25leHRzdGVwO3RoaXMuX2luZmVlZF9wZXJjZW50X2F2ZXJhZ2U9YS5wLmluZmVlZF9wZXJjZW50X2F2ZXJhZ2U7dGhpcy5faW5mZWVkX3BlcmNlbnRfc3RkZGV2PWEucC5pbmZlZWRfcGVyY2VudF9zdGFuZGFyZF9kZXZpYXRpb247dGhpcy5faW5mZWVkX3BlcmNlbnRfbWluaW11bT1hLnAuaW5mZWVkX3BlcmNlbnRfbWluaW11bTt0aGlzLl9pbmZlZWRfcGVyY2VudF9tYXhpbXVtPWEucC5pbmZlZWRfcGVyY2VudF9tYXhpbXVtO3RoaXMuX3N0ZXB0aW1lX21zX2F2ZXJhZ2U9YS5wLnN0ZXB0aW1lX21zX2F2ZXJhZ2U7dGhpcy5fc3RlcHRpbWVfbXNfc3RkZGV2PQphLnAuc3RlcHRpbWVfbXNfc3RhbmRhcmRfZGV2aWF0aW9uO3RoaXMuX3N0ZXB0aW1lX21zX21pbmltdW09YS5wLnN0ZXB0aW1lX21zX21pbmltdW07dGhpcy5fc3RlcHRpbWVfbXNfbWF4aW11bT1hLnAuc3RlcHRpbWVfbXNfbWF4aW11bTt0aGlzLl9zdW1tYXJ5X2NvbmNsdXNpb24uaW5jbHVkZXMoIkhJR0hMWSIpP3RoaXMuY3VzdG9tU3R5bGVbIi0tc3VtbWFyeS1jb2xvciJdPSJyZWQiOnRoaXMuX3N1bW1hcnlfY29uY2x1c2lvbi5pbmNsdWRlcygiTU9ERVJBVEUiKSYmKHRoaXMuY3VzdG9tU3R5bGVbIi0tc3VtbWFyeS1jb2xvciJdPSJvcmFuZ2UiKTt0aGlzLnVwZGF0ZVN0eWxlcygpfX0sX3Nob3dEZXZpY2VTdGVwQ2hhcnQ6ZnVuY3Rpb24oYSl7aWYoYSYmMCE9YS5yb3dzLmxlbmd0aCYmdGhpcy5fYWN0aXZlKXt0aGlzLl9zaG93X2RldmljZV9zaWRlX2FuYWx5c2lzPSEwO3ZhciBjPVtdLGQ9W10sZj0wLGc9LTE7YS5yb3dzLmZvckVhY2goZnVuY3Rpb24obCl7Zz0wPGc/KytnOgpOdW1iZXIobC5jWzBdLnYpO2MucHVzaCh7c2NhbGFyOmwuY1sxXS52LHN0ZXA6Zyx0cHVfc3RlcDpOdW1iZXIobC5jWzBdLnYpLGxvd193YXRlcm1hcms6MH0pO2QucHVzaCh7c2NhbGFyOmwuY1sxXS52K2wuY1syXS52LHN0ZXA6Zyxsb3dfd2F0ZXJtYXJrOmwuY1sxXS52fSk7Zj1NYXRoLm1heChmLGwuY1sxXS52K2wuY1syXS52KX0pO2lmKGE9dGhpcy4kLmRldmljZV9zdGVwX2NoYXJ0KWEuc2V0VmlzaWJsZVNlcmllcyhbImRldmljZSBzdGVwIHRpbWUiLCJjb21wdXRlIHRpbWUiXSksYS5zZXRTZXJpZXNEYXRhKCJkZXZpY2Ugc3RlcCB0aW1lIixkKSxhLnNldFNlcmllc0RhdGEoImNvbXB1dGUgdGltZSIsYyksYS5kZWZhdWx0WVJhbmdlPVswLDEuMSpmXSxhLnNtb290aGluZ0VuYWJsZWQ9ITEsYS50b29sdGlwQ29sdW1ucz1be3RpdGxlOiJOYW1lIixldmFsdWF0ZTpsPT5sLmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfSx7dGl0bGU6IlRpbWUobXMpIixldmFsdWF0ZTpsPT5sLmRhdHVtLnNjYWxhci50b0ZpeGVkKDIpfSwKe3RpdGxlOiJTdGVwIixldmFsdWF0ZTpsPT5sLmRhdHVtLnN0ZXB9XSxhLmZpbGxBcmVhPXtoaWdoZXJBY2Nlc3NvcjpsPT5sLnNjYWxhcixsb3dlckFjY2Vzc29yOmw9PmwubG93X3dhdGVybWFya30sYS54QXhpc0Zvcm1hdHRlcj1kMy5mb3JtYXQoImQiKX1lbHNlIHRoaXMuX3Nob3dfZGV2aWNlX3NpZGVfYW5hbHlzaXM9ITF9LF9zaG93RGV2aWNlSW5mZWVkQ2hhcnQ6ZnVuY3Rpb24oYSl7aWYoYSYmMCE9YS5yb3dzLmxlbmd0aCl7dmFyIGM9W10sZD0tMTthLnJvd3MuZm9yRWFjaChmdW5jdGlvbihmKXtkPTA8ZD8rK2Q6TnVtYmVyKGYuY1swXS52KTtjLnB1c2goe3N0ZXA6ZCx0cHVfc3RlcDpOdW1iZXIoZi5jWzBdLnYpLHNjYWxhcjpmLmNbNF0udixtaW46Zi5jWzVdLnYsbWF4OmYuY1s2XS52fSl9KTtpZihhPXRoaXMuJC5kZXZpY2VfaW5mZWVkX2NoYXJ0KWEuc2V0VmlzaWJsZVNlcmllcyhbImlucHV0IHRpbWUlIl0pLGEuc2V0U2VyaWVzRGF0YSgiaW5wdXQgdGltZSUiLGMpLAphLnRvb2x0aXBDb2x1bW5zPVt7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmY9PmYuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWV9LHt0aXRsZToiU3RlcCIsZXZhbHVhdGU6Zj0+Zi5kYXR1bS50cHVfc3RlcH0se3RpdGxlOiJBdmVyYWdlKCUpIixldmFsdWF0ZTpmPT5mLmRhdHVtLnNjYWxhci50b0ZpeGVkKDQpKyIlIn0se3RpdGxlOiJNaW4oJSkiLGV2YWx1YXRlOmY9PmYuZGF0dW0ubWluLnRvRml4ZWQoNCkrIiUifSx7dGl0bGU6Ik1heCglKSIsZXZhbHVhdGU6Zj0+Zi5kYXR1bS5tYXgudG9GaXhlZCg0KSsiJSJ9XSxhLmZpbGxBcmVhPXtoaWdoZXJBY2Nlc3NvcjpmPT5mLm1heCxsb3dlckFjY2Vzc29yOmY9PmYubWlufSxhLnhBeGlzRm9ybWF0dGVyPWQzLmZvcm1hdCgiZCIpfWVsc2UgdGhpcy5fc2hvd19kZXZpY2Vfc2lkZV9hbmFseXNpcz0hMX0sX3Nob3dIb3N0Q2hhcnQ6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9dGhpcy5fdXNUb01zKGEucC51bmNsYXNzaWZpZWRfbm9uZXF1ZXVlX3VzKSwKZD10aGlzLl91c1RvTXMoYS5wLmRlbWFuZGVkX2ZpbGVfcmVhZF91cyksZj10aGlzLl91c1RvTXMoYS5wLmFkdmFuY2VkX2ZpbGVfcmVhZF91cyksZz10aGlzLl91c1RvTXMoYS5wLnByZXByb2Nlc3NpbmdfdXMpO2E9dGhpcy5fdXNUb01zKGEucC5lbnF1ZXVlX3VzKTt2YXIgbD1jK2QrZitnK2E7dGhpcy5fc2hvd19ob3N0X3NpZGVfY2hhcnQ9MDxsOzA8bCYmKGY9W3tOYW1lOiJPdGhlciBkYXRhIHJlYWRpbmcgb3IgcHJvY2Vzc2luZyIsVG90YWw6Yy9sKjEwMH0se05hbWU6IlJlYWRpbmcgZGF0YSBmcm9tIGZpbGVzIG9uIGRlbWFuZCIsVG90YWw6ZC9sKjEwMH0se05hbWU6IlJlYWRpbmcgZGF0YSBmcm9tIGZpbGVzIGluIGFkdmFuY2UgW2luY2x1ZGluZyBjYWNoaW5nLCBwcmVmZXRjaGluZywgaW50ZXJsZWF2aW5nXSIsVG90YWw6Zi9sKjEwMH0se05hbWU6IkRhdGEgcHJlcHJvY2Vzc2luZyIsVG90YWw6Zy9sKjEwMH0se05hbWU6IkVucXVldWluZyBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIHRvIGRldmljZSIsClRvdGFsOmEvbCoxMDB9XSxnPW5ldyBQbG90dGFibGUuU2NhbGVzLkNvbG9yLGQ9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkxlZ2VuZChnKSxjPWQzLnNlbGVjdCh0aGlzLiQuaG9zdF9zaWRlX2NoYXJ0KSxmPShuZXcgUGxvdHRhYmxlLlBsb3RzLlBpZSkuYXR0cigiZmlsbCIsZnVuY3Rpb24oayl7cmV0dXJuIGsuTmFtZX0sZykuYWRkRGF0YXNldChuZXcgUGxvdHRhYmxlLkRhdGFzZXQoZikpLnNlY3RvclZhbHVlKGZ1bmN0aW9uKGspe3JldHVybiBrLlRvdGFsfSkubGFiZWxzRW5hYmxlZCghMCkubGFiZWxGb3JtYXR0ZXIoZnVuY3Rpb24oayl7cmV0dXJuIE51bWJlcihrKS50b0ZpeGVkKDIpKyIlIn0pLGQ9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLlRhYmxlKFtbZixkXV0pLGMuc2VsZWN0KCIqIikucmVtb3ZlKCksZC5yZW5kZXJUbyhjKSl9fSxfc2hvd0hvc3RUYWJsZTpmdW5jdGlvbihhKXtpZihhKXt2YXIgYz10aGlzLiQuaG9zdF9zaWRlX3RhYmxlX2NvbnRlbnQ7Yy5pbm5lckhUTUw9CiIiO3RoaXMuX3Nob3dfaG9zdF9zaWRlX3RhYmxlPSExOzAhPWEucm93cy5sZW5ndGgmJmEucm93cy5mb3JFYWNoKGZ1bmN0aW9uKGQpe2xldCBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7UG9seW1lci5kb20oYykuYXBwZW5kQ2hpbGQoZik7bGV0IGc9W107Zy5wdXNoKGQuY1swXS52KTtnLnB1c2goZC5jWzFdLnYpO2cucHVzaChkLmNbMl0udi50b0ZpeGVkKDIpKTtnLnB1c2goKDEwMCpkLmNbM10udikudG9GaXhlZCgyKSsiJSIpO2cucHVzaChkLmNbNF0udi50b0ZpeGVkKDIpKTtnLnB1c2goKDEwMCpkLmNbNV0udikudG9GaXhlZCgyKSsiJSIpO2cucHVzaChkLmNbNl0udik7Zy5mb3JFYWNoKGZ1bmN0aW9uKGwpe2xldCBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7UG9seW1lci5kb20oZikuYXBwZW5kQ2hpbGQoayk7UG9seW1lci5kb20oaykuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobCkpfSl9KX19LF9tYWtlUmVjb21tZW5kYXRpb25zOmZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPQoiIjthLnJvd3MuZm9yRWFjaChmdW5jdGlvbihkKXtjKz0iXHgzY2xpXHgzZSIrZC5jWzBdLnYrIlx4M2MvbGlceDNlIn0pO3RoaXMuJC5yZWNvbW1lbmRhdGlvbl9kZXRhaWxzLmlubmVySFRNTD1jfX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hY3RpdmU9ITA7dGhpcy5fdXBkYXRlVmlldygpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2FjdGl2ZT0hMX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWltYWdlL2lyb24taW1hZ2UuaHRtbC5qcwpQb2x5bWVyKHtpczoiaXJvbi1pbWFnZSIscHJvcGVydGllczp7c3JjOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sYWx0Ont0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxjcm9zc29yaWdpbjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0scHJldmVudExvYWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sc2l6aW5nOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0scG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOiJjZW50ZXIifSxwcmVsb2FkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHBsYWNlaG9sZGVyOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsLG9ic2VydmVyOiJfcGxhY2Vob2xkZXJDaGFuZ2VkIn0sZmFkZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxsb2FkZWQ6e25vdGlmeTohMCxyZWFkT25seTohMCx0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGxvYWRpbmc6e25vdGlmeTohMCxyZWFkT25seTohMCx0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGVycm9yOntub3RpZnk6ITAsCnJlYWRPbmx5OiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMX0sd2lkdGg6e29ic2VydmVyOiJfd2lkdGhDaGFuZ2VkIix0eXBlOk51bWJlcix2YWx1ZTpudWxsfSxoZWlnaHQ6e29ic2VydmVyOiJfaGVpZ2h0Q2hhbmdlZCIsdHlwZTpOdW1iZXIsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl90cmFuc2Zvcm1DaGFuZ2VkKHNpemluZywgcG9zaXRpb24pIiwiX2xvYWRTdGF0ZU9ic2VydmVyKHNyYywgcHJldmVudExvYWQpIl0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX3Jlc29sdmVkU3JjPSIifSxfaW1nT25Mb2FkOmZ1bmN0aW9uKCl7dGhpcy4kLmltZy5zcmM9PT10aGlzLl9yZXNvbHZlU3JjKHRoaXMuc3JjKSYmKHRoaXMuX3NldExvYWRpbmcoITEpLHRoaXMuX3NldExvYWRlZCghMCksdGhpcy5fc2V0RXJyb3IoITEpKX0sX2ltZ09uRXJyb3I6ZnVuY3Rpb24oKXt0aGlzLiQuaW1nLnNyYz09PXRoaXMuX3Jlc29sdmVTcmModGhpcy5zcmMpJiYodGhpcy4kLmltZy5yZW1vdmVBdHRyaWJ1dGUoInNyYyIpLAp0aGlzLiQuc2l6ZWRJbWdEaXYuc3R5bGUuYmFja2dyb3VuZEltYWdlPSIiLHRoaXMuX3NldExvYWRpbmcoITEpLHRoaXMuX3NldExvYWRlZCghMSksdGhpcy5fc2V0RXJyb3IoITApKX0sX2NvbXB1dGVQbGFjZWhvbGRlckhpZGRlbjpmdW5jdGlvbigpe3JldHVybiF0aGlzLnByZWxvYWR8fCF0aGlzLmZhZGUmJiF0aGlzLmxvYWRpbmcmJnRoaXMubG9hZGVkfSxfY29tcHV0ZVBsYWNlaG9sZGVyQ2xhc3NOYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJlbG9hZCYmdGhpcy5mYWRlJiYhdGhpcy5sb2FkaW5nJiZ0aGlzLmxvYWRlZD8iZmFkZWQtb3V0IjoiIn0sX2NvbXB1dGVJbWdEaXZIaWRkZW46ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5zaXppbmd9LF9jb21wdXRlSW1nRGl2QVJJQUhpZGRlbjpmdW5jdGlvbigpe3JldHVybiIiPT09dGhpcy5hbHQ/InRydWUiOnZvaWQgMH0sX2NvbXB1dGVJbWdEaXZBUklBTGFiZWw6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PXRoaXMuYWx0P3RoaXMuYWx0OgoiIj09PXRoaXMuc3JjPyIiOnRoaXMuX3Jlc29sdmVTcmModGhpcy5zcmMpLnJlcGxhY2UoL1s/fCNdLiovZywiIikuc3BsaXQoIi8iKS5wb3AoKX0sX2NvbXB1dGVJbWdIaWRkZW46ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuc2l6aW5nfSxfd2lkdGhDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZS53aWR0aD1pc05hTih0aGlzLndpZHRoKT90aGlzLndpZHRoOnRoaXMud2lkdGgrInB4In0sX2hlaWdodENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLmhlaWdodD1pc05hTih0aGlzLmhlaWdodCk/dGhpcy5oZWlnaHQ6dGhpcy5oZWlnaHQrInB4In0sX2xvYWRTdGF0ZU9ic2VydmVyOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9dGhpcy5fcmVzb2x2ZVNyYyhhKTtkIT09dGhpcy5fcmVzb2x2ZWRTcmMmJih0aGlzLl9yZXNvbHZlZFNyYz0iIix0aGlzLiQuaW1nLnJlbW92ZUF0dHJpYnV0ZSgic3JjIiksdGhpcy4kLnNpemVkSW1nRGl2LnN0eWxlLmJhY2tncm91bmRJbWFnZT0iIiwiIj09PQphfHxjP3RoaXMuX3NldExvYWRpbmcoITEpOih0aGlzLl9yZXNvbHZlZFNyYz1kLHRoaXMuJC5pbWcuc3JjPXRoaXMuX3Jlc29sdmVkU3JjLHRoaXMuJC5zaXplZEltZ0Rpdi5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2U9J3VybCgiJyt0aGlzLl9yZXNvbHZlZFNyYysnIiknLHRoaXMuX3NldExvYWRpbmcoITApKSx0aGlzLl9zZXRMb2FkZWQoITEpLHRoaXMuX3NldEVycm9yKCExKSl9LF9wbGFjZWhvbGRlckNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLiQucGxhY2Vob2xkZXIuc3R5bGUuYmFja2dyb3VuZEltYWdlPXRoaXMucGxhY2Vob2xkZXI/J3VybCgiJyt0aGlzLnBsYWNlaG9sZGVyKyciKSc6IiJ9LF90cmFuc2Zvcm1DaGFuZ2VkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kLnNpemVkSW1nRGl2LnN0eWxlLGM9dGhpcy4kLnBsYWNlaG9sZGVyLnN0eWxlO2EuYmFja2dyb3VuZFNpemU9Yy5iYWNrZ3JvdW5kU2l6ZT10aGlzLnNpemluZzthLmJhY2tncm91bmRQb3NpdGlvbj1jLmJhY2tncm91bmRQb3NpdGlvbj0KdGhpcy5zaXppbmc/dGhpcy5wb3NpdGlvbjoiIjthLmJhY2tncm91bmRSZXBlYXQ9Yy5iYWNrZ3JvdW5kUmVwZWF0PXRoaXMuc2l6aW5nPyJuby1yZXBlYXQiOiIifSxfcmVzb2x2ZVNyYzpmdW5jdGlvbihhKXthPVBvbHltZXIuUmVzb2x2ZVVybC5yZXNvbHZlVXJsKGEsdGhpcy4kLmJhc2VVUklBbmNob3IuaHJlZik7Ii8iPT09YVswXSYmKGE9KGxvY2F0aW9uLm9yaWdpbnx8bG9jYXRpb24ucHJvdG9jb2wrIi8vIitsb2NhdGlvbi5ob3N0KSthKTtyZXR1cm4gYX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1jYXJkL3BhcGVyLWNhcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItY2FyZCIscHJvcGVydGllczp7aGVhZGluZzp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsb2JzZXJ2ZXI6Il9oZWFkaW5nQ2hhbmdlZCJ9LGltYWdlOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sYWx0Ont0eXBlOlN0cmluZ30scHJlbG9hZEltYWdlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZhZGVJbWFnZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxwbGFjZWhvbGRlckltYWdlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxlbGV2YXRpb246e3R5cGU6TnVtYmVyLHZhbHVlOjEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxhbmltYXRlZFNoYWRvdzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbmltYXRlZDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxyZWFkT25seTohMCxjb21wdXRlZDoiX2NvbXB1dGVBbmltYXRlZChhbmltYXRlZFNoYWRvdykifX0sX2lzSGlkZGVuOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJmYWxzZSI6InRydWUifSxfaGVhZGluZ0NoYW5nZWQ6ZnVuY3Rpb24oYSl7dmFyIGM9CnRoaXMuZ2V0QXR0cmlidXRlKCJoZWFkaW5nIiksZD10aGlzLmdldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpOyJzdHJpbmciPT09dHlwZW9mIGQmJmQhPT1jfHx0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsYSl9LF9jb21wdXRlSGVhZGluZ0NsYXNzOmZ1bmN0aW9uKGEpe3JldHVybiBhPyIgb3Zlci1pbWFnZSI6IiJ9LF9jb21wdXRlQW5pbWF0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtb3ZlcnZpZXctcGFnZS9vdmVydmlldy1wYWdlLmh0bWwuanMKUG9seW1lcih7aXM6Im92ZXJ2aWV3LXBhZ2UiLHByb3BlcnRpZXM6e19kYXRhOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3VwZGF0ZVZpZXcifSxfc2hvd190b3Bfb3BzX3RhYmxlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9zaG93X3N0ZXBfdGltZV9ncmFwaDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfc2hvdWxkU2hvd1N0ZXBUaW1lR3JhcGgoX2RhdGEsIF9hY3RpdmUpIn0sX3RvcF9vcHNfYnV0dG9uX3RleHQ6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0VG9wT3BzQnV0dG9uVGV4dChfc2hvd190b3Bfb3BzX3RhYmxlKSJ9LF9nZW5lcmFsQW5hbHlzaXNKc29uOnt0eXBlOlN0cmluZ30sX2lucHV0QW5hbHlzaXNKc29uOnt0eXBlOlN0cmluZ30sX3J1bkVudmlyb25tZW50SnNvbjp7dHlwZTpTdHJpbmd9LF9yZWNvbW1lbmRhdGlvbkpzb246e3R5cGU6U3RyaW5nfSxfYWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9vbkFjdGl2ZUNoYW5nZWQifSxfaG9zdF9pZGxlX3RpbWVfcGVyY2VudDp7dHlwZTpTdHJpbmd9LApfZGV2aWNlX2lkbGVfdGltZV9wZXJjZW50Ont0eXBlOlN0cmluZ30sX214dV91dGlsaXphdGlvbl9wZXJjZW50Ont0eXBlOlN0cmluZ30sX3N0ZXB0aW1lX21zX2F2ZXJhZ2U6e3R5cGU6U3RyaW5nfSxfc3RlcHRpbWVfbXNfc3RkZGV2Ont0eXBlOlN0cmluZ30sX2luZmVlZF9tc19hdmVyYWdlOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2NvbXB1dGVfbXNfYXZlcmFnZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF90b3Bfb3BzX2hlYWRpbmc6e3R5cGU6U3RyaW5nfSxfZXJyb3JfbWVzc2FnZTp7dHlwZTpTdHJpbmd9LF9ob3N0X2NvdW50Ont0eXBlOlN0cmluZ30sX3RwdV90eXBlOnt0eXBlOlN0cmluZ30sX3RwdV9jb3JlX2NvdW50Ont0eXBlOlN0cmluZ30sX2JhdGNoX3NpemU6e3R5cGU6U3RyaW5nfSxfY2hhbmdlX2xpc3Q6e3R5cGU6U3RyaW5nfSxfYnVpbGRfdGltZTp7dHlwZTpTdHJpbmd9LF9idWlsZF90YXJnZXQ6e3R5cGU6U3RyaW5nfSxfc3RhdGVtZW50Ont0eXBlOlN0cmluZ319LApvYnNlcnZlcnM6WyJfc2hvd1N1bW1hcnkoX2lucHV0QW5hbHlzaXNKc29uLCBfZ2VuZXJhbEFuYWx5c2lzSnNvbikiLCJfc2hvd1J1bkVudmlyb25tZW50KF9ydW5FbnZpcm9ubWVudEpzb24pIiwiX3Nob3dEZXZpY2VTdGVwQ2hhcnQoX2lucHV0QW5hbHlzaXNKc29uKSIsIl9zaG93VG9wT3BzVGFibGUoX2dlbmVyYWxBbmFseXNpc0pzb24pIiwiX3Nob3dSZWNvbW1lbmRhdGlvbihfcmVjb21tZW5kYXRpb25Kc29uKSJdLG9uQ2xpY2tUb3BPcHM6ZnVuY3Rpb24oKXt0aGlzLl9zaG93X3RvcF9vcHNfdGFibGU9IXRoaXMuX3Nob3dfdG9wX29wc190YWJsZX0sX2dldFRvcE9wc0J1dHRvblRleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuKGE/IkhpZGUiOiJTaG93IikrIiB0YWJsZSJ9LF91cGRhdGVWaWV3OmZ1bmN0aW9uKCl7aWYodGhpcy5fZGF0YSYmdGhpcy5fYWN0aXZlKXt0aGlzLl9nZW5lcmFsQW5hbHlzaXNKc29uPXRoaXMuX2RhdGFbMF07dGhpcy5faW5wdXRBbmFseXNpc0pzb249dGhpcy5fZGF0YVsxXTsKdGhpcy5fcnVuRW52aXJvbm1lbnRKc29uPXRoaXMuX2RhdGFbMl07dmFyIGE9dGhpcy5fZGF0YVszXTt0aGlzLl9yZWNvbW1lbmRhdGlvbkpzb249YTt0aGlzLl9zdGF0ZW1lbnQ9YS5wLnN0YXRlbWVudDthPSJncmVlbiI7dGhpcy5fc3RhdGVtZW50LmluY2x1ZGVzKCJISUdITFkiKT9hPSJyZWQiOnRoaXMuX3N0YXRlbWVudC5pbmNsdWRlcygiTU9ERVJBVEUiKSYmKGE9Im9yYW5nZSIpO3RoaXMudXBkYXRlU3R5bGVzKHsiLS1zdW1tYXJ5LWNvbG9yIjphfSl9fSxfc2hvd1N1bW1hcnk6ZnVuY3Rpb24oYSxjKXthJiZjJiYodGhpcy5faG9zdF9pZGxlX3RpbWVfcGVyY2VudD1jLnAuaG9zdF9pZGxlX3RpbWVfcGVyY2VudCx0aGlzLl9kZXZpY2VfaWRsZV90aW1lX3BlcmNlbnQ9Yy5wLmRldmljZV9pZGxlX3RpbWVfcGVyY2VudCx0aGlzLl9teHVfdXRpbGl6YXRpb25fcGVyY2VudD1jLnAubXh1X3V0aWxpemF0aW9uX3BlcmNlbnQsdGhpcy5fc3RlcHRpbWVfbXNfYXZlcmFnZT1hLnAuc3RlcHRpbWVfbXNfYXZlcmFnZSwKdGhpcy5fc3RlcHRpbWVfbXNfc3RkZGV2PWEucC5zdGVwdGltZV9tc19zdGFuZGFyZF9kZXZpYXRpb24sdGhpcy5fY29tcHV0ZV9tc19hdmVyYWdlPWEucC5jb21wdXRlX21zX2F2ZXJhZ2UsdGhpcy5faW5mZWVkX21zX2F2ZXJhZ2U9YS5wLmluZmVlZF9tc19hdmVyYWdlKX0sX3Nob3dSdW5FbnZpcm9ubWVudDpmdW5jdGlvbihhKXthJiYodGhpcy5fZXJyb3JfbWVzc2FnZT1hLnAuZXJyb3JfbWVzc2FnZSx0aGlzLl9ob3N0X2NvdW50PWEucC5ob3N0X2NvdW50LHRoaXMuX3RwdV90eXBlPWEucC50cHVfdHlwZSx0aGlzLl90cHVfY29yZV9jb3VudD1hLnAudHB1X2NvcmVfY291bnQsdGhpcy5fYmF0Y2hfc2l6ZT1hLnAuYmF0Y2hfc2l6ZSx0aGlzLl9jaGFuZ2VfbGlzdD1hLnAuY2hhbmdlX2xpc3QsdGhpcy5fYnVpbGRfdGltZT1hLnAuYnVpbGRfdGltZSx0aGlzLl9idWlsZF90YXJnZXQ9YS5wLmJ1aWxkX3RhcmdldCl9LF9zaG93RGV2aWNlU3RlcENoYXJ0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuX3Nob3dfc3RlcF90aW1lX2dyYXBoKXt2YXIgYz0KW10sZD1bXSxmPTAsZz0tMTthLnJvd3MuZm9yRWFjaChmdW5jdGlvbihsKXtnPTA8Zz8rK2c6TnVtYmVyKGwuY1swXS52KTtjLnB1c2goe3NjYWxhcjpsLmNbMV0udixzdGVwOmcsdHB1X3N0ZXA6TnVtYmVyKGwuY1swXS52KSxsb3dfd2F0ZXJtYXJrOjB9KTtkLnB1c2goe3NjYWxhcjpsLmNbMV0uditsLmNbMl0udixzdGVwOmcsbG93X3dhdGVybWFyazpsLmNbMV0udn0pO2Y9TWF0aC5tYXgoZixsLmNbMV0uditsLmNbMl0udil9KTtpZihhPXRoaXMuJCQoIiNkZXZpY2Vfc3RlcF9jaGFydCIpKWEuc2V0VmlzaWJsZVNlcmllcyhbImNvbXB1dGUtdGltZSIsInN0ZXAtdGltZSBceDNkIGlucHV0LXRpbWUgKyBjb21wdXRlLXRpbWUiXSksYS5zZXRTZXJpZXNEYXRhKCJjb21wdXRlLXRpbWUiLGMpLGEuc2V0U2VyaWVzRGF0YSgic3RlcC10aW1lIFx4M2QgaW5wdXQtdGltZSArIGNvbXB1dGUtdGltZSIsZCksYS5kZWZhdWx0WVJhbmdlPVswLDEuMSpmXSxhLnNtb290aGluZ0VuYWJsZWQ9CiExLGEudG9vbHRpcENvbHVtbnM9W3t0aXRsZToiTmFtZSIsZXZhbHVhdGU6bD0+bC5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZX0se3RpdGxlOiJUaW1lKG1zKSIsZXZhbHVhdGU6bD0+bC5kYXR1bS5zY2FsYXIudG9GaXhlZCgyKX0se3RpdGxlOiJTdGVwIixldmFsdWF0ZTpsPT5sLmRhdHVtLnN0ZXB9XSxhLmZpbGxBcmVhPXtoaWdoZXJBY2Nlc3NvcjpsPT5sLnNjYWxhcixsb3dlckFjY2Vzc29yOmw9PmwubG93X3dhdGVybWFya30sYS54QXhpc0Zvcm1hdHRlcj1kMy5mb3JtYXQoImQiKX19LF9zaG93VG9wT3BzVGFibGU6ZnVuY3Rpb24oYSl7aWYoYSYmYS5yb3dzJiZhLnJvd3MubGVuZ3RoJiZ0aGlzLl9hY3RpdmUpe3ZhciBjPTAsZD10aGlzLiQkKCIjdG9wX29wc190YWJsZV9jb250ZW50Iik7ZCYmKGQuaW5uZXJIVE1MPSIiLGEucm93cy5mb3JFYWNoKGZ1bmN0aW9uKGYpe3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7UG9seW1lci5kb20oZCkuYXBwZW5kQ2hpbGQoZyk7CnZhciBsPVtdO2wucHVzaCgoMTAwKmYuY1swXS52KS50b0ZpeGVkKDIpKyIlIik7bC5wdXNoKCgxMDAqZi5jWzFdLnYpLnRvRml4ZWQoMikrIiUiKTtsLnB1c2goZi5jWzJdLnYpO2wucHVzaChmLmNbM10udik7bC5wdXNoKGYuY1s0XS52LnRvRml4ZWQoMikpO2wuZm9yRWFjaChmdW5jdGlvbihrKXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO1BvbHltZXIuZG9tKGcpLmFwcGVuZENoaWxkKG4pO1BvbHltZXIuZG9tKG4pLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGspKX0pO2MrPTF9KSx0aGlzLl90b3Bfb3BzX2hlYWRpbmc9IlRvcCAiK2MrIiBUZW5zb3JGbG93IG9wZXJhdGlvbnMgZXhlY3V0ZWQgb24gVFBVIix0aGlzLl9zaG93X3RvcF9vcHNfdGFibGU9ITEpfX0sX2dlbmVyYXRlUmVjb21tZW5kYXRpb25IdG1sOmZ1bmN0aW9uKGEsYyxkLGYpe3ZhciBnPSJceDNjcFx4M2VceDI2bmJzcDtceDNjL3BceDNlIjtnKz0nXHgzY2RpdiBjbGFzc1x4M2QiJysKYysnIlx4M2UnO2crPSJceDNjYlx4M2UiK2YrIjpceDNjL2JceDNlIjthLnJvd3MuZm9yRWFjaChmdW5jdGlvbihsKXtsLmNbMF0udj09ZCYmKGcrPSJceDNjbGlceDNlIitsLmNbMV0udisiXHgzYy9saVx4M2UiKX0pO3JldHVybiBnKz0iXHgzYy9kaXZceDNlIn0sX3Nob3dSZWNvbW1lbmRhdGlvbjpmdW5jdGlvbihhKXtpZihhJiZ0aGlzLl9hY3RpdmUpe3ZhciBjPWEucC5ib3R0bGVuZWNrLGQ9dGhpcy4kJCgiI2hvc3Rfc2lkZV90aXBzIiksZj10aGlzLiQkKCIjZGV2aWNlX3NpZGVfdGlwcyIpO2QmJmYmJigiZGV2aWNlIj09Yz8oZC5pbm5lckhUTUw9IiIsZi5pbm5lckhUTUw9dGhpcy5fZ2VuZXJhdGVSZWNvbW1lbmRhdGlvbkh0bWwoYSwiYm90dGxlbmVja1RpcHMiLCJkZXZpY2UiLCJOZXh0IHRvb2xzIHRvIHVzZSBmb3IgcmVkdWNpbmcgdGhlIFRQVSB0aW1lIikpOiJob3N0Ij09Yz8oZC5pbm5lckhUTUw9dGhpcy5fZ2VuZXJhdGVSZWNvbW1lbmRhdGlvbkh0bWwoYSwiYm90dGxlbmVja1RpcHMiLAoiaG9zdCIsIk5leHQgdG9vbHMgdG8gdXNlIGZvciByZWR1Y2luZyB0aGUgaW5wdXQgdGltZSIpLGYuaW5uZXJIVE1MPSIiKTooZC5pbm5lckhUTUw9dGhpcy5fZ2VuZXJhdGVSZWNvbW1lbmRhdGlvbkh0bWwoYSwiYm90dGxlbmVja1RpcHMiLCJob3N0IiwiTmV4dCB0b29scyB0byB1c2UgZm9yIHJlZHVjaW5nIHRoZSBpbnB1dCB0aW1lIiksZi5pbm5lckhUTUw9dGhpcy5fZ2VuZXJhdGVSZWNvbW1lbmRhdGlvbkh0bWwoYSwiYm90dGxlbmVja1RpcHMiLCJkZXZpY2UiLCJOZXh0IHRvb2xzIHRvIHVzZSBmb3IgcmVkdWNpbmcgdGhlIFRQVSB0aW1lIikpLGM9dGhpcy4kJCgiI2RvY3VtZW50YXRpb25fdGlwcyIpKSYmKGMuaW5uZXJIVE1MPXRoaXMuX2dlbmVyYXRlUmVjb21tZW5kYXRpb25IdG1sKGEsImRvY3VtZW50YXRpb25UaXBzIiwiZG9jIiwiT3RoZXIgdXNlZnVsIHJlc291cmNlcyIpKX19LF9vbkFjdGl2ZUNoYW5nZWQ6ZnVuY3Rpb24oYSl7YT90aGlzLl91cGRhdGVWaWV3KCk6CnRoaXMuX3Nob3dfdG9wX29wc190YWJsZT10aGlzLl9zaG93X3N0ZXBfdGltZV9ncmFwaD0hMX0sX3Nob3VsZFNob3dTdGVwVGltZUdyYXBoOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGMmJmEmJmFbMV0mJmFbMV0ucm93cyYmYVsxXS5yb3dzLmxlbmd0aH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hY3RpdmU9ITA7dGhpcy5fdXBkYXRlVmlldygpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2FjdGl2ZT0hMX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1vcC1wcm9maWxlL3V0aWxzLmpzCnZhciBwcDsKKGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMobCxrLG4scCl7cmV0dXJuInJnYmEoIitNYXRoLnJvdW5kKDI1NSpsKSsiLCIrTWF0aC5yb3VuZCgyNTUqaykrIiwiK01hdGgucm91bmQoMjU1Km4pKyIsIitwKyIpIn1mdW5jdGlvbiBkKGwsaz0xLG49MSxwPU1hdGguc3FydCl7aWYoaXNOYU4obCkpcmV0dXJuIGMoayxrLGssbik7bD1wKGwpO3JldHVybi41Pmw/YyhrLDIqbCprLDAsbik6YygyKigxLWwpKmssaywwLG4pfWZ1bmN0aW9uIGYobCl7cmV0dXJuIGwmJmwubWV0cmljcyYmbC5tZXRyaWNzLnRpbWU/bC5tZXRyaWNzLmZsb3BzL2wubWV0cmljcy50aW1lOk5hTn1mdW5jdGlvbiBnKGwpe3JldHVybiBsJiZsLm1ldHJpY3MmJmwubWV0cmljcy5tZW1vcnlCYW5kd2lkdGg/bC5tZXRyaWNzLm1lbW9yeUJhbmR3aWR0aDpOYU59YS5mbGFtZUNvbG9yPWQ7YS5mbG9wc0NvbG9yPWZ1bmN0aW9uKGwpe3JldHVybiBkKGwsLjcpfTthLmJ3Q29sb3I9ZnVuY3Rpb24obCl7cmV0dXJuIGQoMS1sLAouNyl9O2EudXRpbGl6YXRpb249ZjthLm1lbW9yeVV0aWxpemF0aW9uPWc7YS5oYXNNZW1vcnlVdGlsaXphdGlvbj1mdW5jdGlvbihsKXtyZXR1cm4gbCYmbC5tZXRyaWNzJiZsLm1ldHJpY3MubWVtb3J5QmFuZHdpZHRofTthLmhhc0Zsb3BzPWZ1bmN0aW9uKGwpe3JldHVybiBsJiZsLm1ldHJpY3MmJmwubWV0cmljcy50aW1lfTthLnBlcmNlbnQ9ZnVuY3Rpb24obCl7cmV0dXJuIGlzTmFOKGwpPyItIjouOTk1PD1sPyIxMDAlIjoxRS01Pmw/IjAuMDAlIjooMTAwKmwpLnRvUHJlY2lzaW9uKDIpKyIlIn07YS50aW1lV2FzdGVkPWZ1bmN0aW9uKGwpe3JldHVybiBsJiZsLm1ldHJpY3M/bC5tZXRyaWNzLnRpbWUqKDEtTWF0aC5tYXgoZihsKSxnKGwpKSk6TmFOfX0pKHBwfHwocHA9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1vcC1wcm9maWxlL3RmLW9wLXRhYmxlLmh0bWwuanMKUG9seW1lcih7aXM6InRmLW9wLXRhYmxlIixwcm9wZXJ0aWVzOntyb290Tm9kZTp7dHlwZTpPYmplY3R9LGFjdGl2ZTp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9hY3RpdmUoX3NlbGVjdGVkLCBfaG92ZXIpIixub3RpZnk6ITB9LHNob3dQOTA6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LGJ5V2FzdGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LGNoaWxkcmVuQ291bnQ6e3R5cGU6TnVtYmVyLHZhbHVlOjEwLG5vdGlmeTohMH0sX3NlbGVjdGVkOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsLG5vdGlmeTohMH0sX2hvdmVyOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsLG5vdGlmeTohMH0sX29uSGVhZGVySG92ZXI6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGE9PnRoaXMuX2hvdmVyPWF9fSxfb25IZWFkZXJDbGljazp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gYT0+e3RoaXMuX3NlbGVjdGVkJiYodGhpcy5fc2VsZWN0ZWQuc2VsZWN0ZWQ9CiExKTt0aGlzLl9zZWxlY3RlZD1hO2Euc2VsZWN0ZWQ9ITB9fX19LF9hY3RpdmU6ZnVuY3Rpb24oYSxjKXtpZihjKXJldHVybiBjLm5vZGU7aWYoYSlyZXR1cm4gYS5ub2RlfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLW9wLXByb2ZpbGUvdGYtb3AtdGFibGUuaHRtbC0yLmpzClBvbHltZXIoe2lzOiJ0Zi1vcC10YWJsZS1lbnRyeSIscHJvcGVydGllczp7bm9kZTp7dHlwZTpPYmplY3R9LGxldmVsOnt0eXBlOk51bWJlcix2YWx1ZTowfSxoZWFkZXJIb3Zlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9PmZ1bmN0aW9uKCl7fSxub3RpZnk6ITB9LGhlYWRlckNsaWNrOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+ZnVuY3Rpb24oKXt9LG5vdGlmeTohMH0sZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LHNlbGVjdGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9zZWxlY3RlZENoYW5nZWQifX0sX2VxOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGE9PWN9LF9uZXh0TGV2ZWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGErMX0sX2hhbmRsZUhlYWRlckNsaWNrOmZ1bmN0aW9uKCl7dGhpcy5leHBhbmRlZF49MTt0aGlzLmhlYWRlckNsaWNrKHRoaXMpfSxfaGFuZGxlSGVhZGVyTW91c2VFbnRlcjpmdW5jdGlvbigpe3RoaXMuaGVhZGVySG92ZXIodGhpcyl9LApfaGFuZGxlSGVhZGVyTW91c2VMZWF2ZTpmdW5jdGlvbigpe3RoaXMuaGVhZGVySG92ZXIobnVsbCl9LF9wZXJjZW50OmZ1bmN0aW9uKGEpe3JldHVybiBhLm1ldHJpY3MmJmEubWV0cmljcy50aW1lP3BwLnBlcmNlbnQoYS5tZXRyaWNzLnRpbWUpOiIifSxfdGltZVdhc3RlZDpmdW5jdGlvbihhKXtyZXR1cm4gcHAucGVyY2VudChwcC50aW1lV2FzdGVkKGEpKX0sX3Byb3ZlbmFuY2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEueGxhJiZhLnhsYS5wcm92ZW5hbmNlP2EueGxhLnByb3ZlbmFuY2UucmVwbGFjZSgvXi4qXC8vLCIiKToiIn0sX3V0aWxpemF0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiBwcC5wZXJjZW50KHBwLnV0aWxpemF0aW9uKGEpKX0sX2hhc0Zsb3BzOnBwLmhhc0Zsb3BzLF9mbGFtZUNvbG9yOmZ1bmN0aW9uKGEpe3JldHVybiBwcC5mbGFtZUNvbG9yKHBwLnV0aWxpemF0aW9uKGEpLDEsLjIpfSxfYmFyV2lkdGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubWV0cmljcyYmYS5tZXRyaWNzLnRpbWU/CnBwLnBlcmNlbnQoYS5tZXRyaWNzLnRpbWUpOjB9LF9zZWxlY3RlZENoYW5nZWQ6ZnVuY3Rpb24oYSl7dGhpcy5jbGFzc0xpc3QudG9nZ2xlKCJzZWxlY3RlZCIsYSl9LF9nZXRLQ2hpbGRyZW46ZnVuY3Rpb24oYSxjLGQsZil7aWYoZCYmMDxhLmNoaWxkcmVuLmxlbmd0aCYmYS5jaGlsZHJlblswXS5tZXRyaWNzKXtmb3IodmFyIGc9ZD0wLGw9LjkqYS5tZXRyaWNzLnRpbWU7ZzxNYXRoLm1pbihjLGEuY2hpbGRyZW4ubGVuZ3RoKSYmIShkPj1sKTtnKyspZCs9YS5jaGlsZHJlbltnXS5tZXRyaWNzLnRpbWU7Yz1nfXJldHVybiBmP2EuY2hpbGRyZW4uc2xpY2UoMCxjKTphLmNoaWxkcmVufSxfaGFzTGVmdG91dDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGQ/YS5udW1DaGlsZHJlbj5NYXRoLm1pbihjLGEuY2hpbGRyZW4ubGVuZ3RoKTohMX0sX251bUxlZnRvdXQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5udW1DaGlsZHJlbi1NYXRoLm1pbihjLGEuY2hpbGRyZW4ubGVuZ3RoKX0sX2dldFBhZGRpbmdMZWZ0OmZ1bmN0aW9uKGEpe3JldHVybiBhKwo1fSxfc29ydDpmdW5jdGlvbihhKXtyZXR1cm4gYT8oYyxkKT0+cHAudGltZVdhc3RlZChkKS1wcC50aW1lV2FzdGVkKGMpOjB9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtb3AtcHJvZmlsZS90Zi1vcC1kZXRhaWxzLmh0bWwuanMKUG9seW1lcih7aXM6InRmLW9wLWJhciIscHJvcGVydGllczp7dmFsdWU6e3R5cGU6TnVtYmVyfSxjb2xvcjp7dHlwZTpTdHJpbmd9fSxvYnNlcnZlcnM6WyJfdXBkYXRlVmFsdWUodmFsdWUsIGNvbG9yKSJdLF9wZXJjZW50OnBwLnBlcmNlbnQsX3VwZGF0ZVZhbHVlOmZ1bmN0aW9uKGEsYyl7YyYmKGE9cHAucGVyY2VudChhKSx0aGlzLnN0eWxlLmJhY2tncm91bmQ9YGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgJHtjfSAke2F9LCAjY2NjICR7YX0pYCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtb3AtcHJvZmlsZS90Zi1vcC1kZXRhaWxzLmh0bWwtMi5qcwpQb2x5bWVyKHtpczoidGYtb3AtZGV0YWlscyIscHJvcGVydGllczp7bm9kZTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLG9ic2VydmVyOiJfdXBkYXRlQ2FyZCJ9fSxfdXRpbGl6YXRpb246cHAudXRpbGl6YXRpb24sX21lbW9yeVV0aWxpemF0aW9uOnBwLm1lbW9yeVV0aWxpemF0aW9uLF9oYXNGbG9wczpwcC5oYXNGbG9wcyxfaGFzTWVtb3J5VXRpbGl6YXRpb246cHAuaGFzTWVtb3J5VXRpbGl6YXRpb24sX3VwZGF0ZUNhcmQ6ZnVuY3Rpb24oYSl7YSYmKGE9cHAuZmxhbWVDb2xvcihwcC51dGlsaXphdGlvbihhKSwuNyksdGhpcy4kLmNhcmQudXBkYXRlU3R5bGVzKHsiLS1wYXBlci1jYXJkLWJhY2tncm91bmQtY29sb3IiOmF9KSl9LF9zdWJoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/YS54bGE/YS54bGEuY2F0ZWdvcnkrIiBvcGVyYXRpb24iOmEuY2F0ZWdvcnk/Ik9wZXJhdGlvbiBjYXRlZ29yeSI6IlVua25vd24iOm51bGx9LF9mdXNlZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCmEueGxhJiYhKGEubWV0cmljcyYmYS5tZXRyaWNzLnRpbWUpfSxfZGltZW5zaW9uQ29sb3I6ZnVuY3Rpb24oYSl7aWYoIWF8fCFhLmFsaWdubWVudClyZXR1cm4gbnVsbDthPWEuc2l6ZS9hLmFsaWdubWVudDtyZXR1cm4gcHAuZmxhbWVDb2xvcihhL01hdGguY2VpbChhKSwxLC4yNSxjPT4xLU1hdGguc3FydCgxLWMpKX0sX2RpbWVuc2lvbkhpbnQ6ZnVuY3Rpb24oYSl7aWYoIWF8fCFhLmFsaWdubWVudClyZXR1cm4gbnVsbDt2YXIgYz1NYXRoLmNlaWwoYS5zaXplL2EuYWxpZ25tZW50KSxkPTE9PWM/IiI6IjogIitjKyIgXHUwMGQ3ICIrYS5hbGlnbm1lbnQ7cmV0dXJuIDA9PWEuc2l6ZSVhLmFsaWdubWVudD8iRXhhY3QgZml0IitkOiJQYWQgdG8gIitjKmEuYWxpZ25tZW50K2R9LF9mbG9wc0NvbG9yOmZ1bmN0aW9uKGEpe3JldHVybiBwcC5mbG9wc0NvbG9yKHBwLnV0aWxpemF0aW9uKGEpKX0sX2J3Q29sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHBwLmJ3Q29sb3IocHAubWVtb3J5VXRpbGl6YXRpb24oYSkpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLW9wLXByb2ZpbGUvdGYtb3AtcHJvZmlsZS5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1vcC1wcm9maWxlIixwcm9wZXJ0aWVzOntfZGF0YTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxfcm9vdDp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxhY3RpdmU6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTpudWxsfSxfaGFzVHdvUHJvZmlsZXM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NoZWNrUHJvZmlsZXMoX2RhdGEpIixub3RpZnk6ITB9LGlzQnlDYXRlZ29yeTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sc2hvd1A5MDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sYnlXYXN0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sY2hpbGRyZW5Db3VudDp7dHlwZTpOdW1iZXIsdmFsdWU6MTAsbm90aWZ5OiEwfX0sb2JzZXJ2ZXJzOlsiX2dldFJvb3QoX2RhdGEsIGlzQnlDYXRlZ29yeSkiXSxfbG9hZDpmdW5jdGlvbihhKXt0aGlzLl9kYXRhPWF9LF9nZXRSb290OmZ1bmN0aW9uKGEsYyl7dGhpcy5fcm9vdD0KdGhpcy5faGFzVHdvUHJvZmlsZXM/Yz9hLmJ5Q2F0ZWdvcnk6YS5ieVByb2dyYW06YS5ieUNhdGVnb3J5fHxhLmJ5UHJvZ3JhbX0sX2NoZWNrUHJvZmlsZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEuYnlQcm9ncmFtJiZudWxsIT1hLmJ5Q2F0ZWdvcnl9LF91dGlsaXphdGlvblBlcmNlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHBwLnBlcmNlbnQocHAudXRpbGl6YXRpb24oYSkpfSxfbWVtb3J5VXRpbGl6YXRpb25QZXJjZW50OmZ1bmN0aW9uKGEpe3JldHVybiBwcC5wZXJjZW50KHBwLm1lbW9yeVV0aWxpemF0aW9uKGEpKX0sX2hhc0Zsb3BzOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEubWV0cmljcy5mbG9wc30sX2Zsb3BzQ29sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHBwLmZsb3BzQ29sb3IocHAudXRpbGl6YXRpb24oYSkpfSxfYndDb2xvcjpmdW5jdGlvbihhKXtyZXR1cm4gcHAuYndDb2xvcihwcC5tZW1vcnlVdGlsaXphdGlvbihhKSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcHJvZmlsZS1jb21tb24vdXRpbC5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXtkLnRpbWU9ZnVuY3Rpb24oZixnKXtsZXQgbD1EYXRlLm5vdygpO2c9ZygpO2NvbnNvbGUubG9nKGYsIjoiLERhdGUubm93KCktbCwibXMiKTtyZXR1cm4gZ307ZC5nZXRUcmFja2VyPWZ1bmN0aW9uKGYpe3JldHVybntzZXRNZXNzYWdlOmZ1bmN0aW9uKGcpe2Yuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOmYucHJvZ3Jlc3MudmFsdWUsbXNnOmd9KX0sdXBkYXRlUHJvZ3Jlc3M6ZnVuY3Rpb24oZyl7Zi5zZXQoInByb2dyZXNzIix7dmFsdWU6Zi5wcm9ncmVzcy52YWx1ZStnLG1zZzpmLnByb2dyZXNzLm1zZ30pfSxyZXBvcnRFcnJvcjpmdW5jdGlvbihnLGwpe2NvbnNvbGUuZXJyb3IobC5zdGFjayk7Zi5zZXQoInByb2dyZXNzIix7dmFsdWU6Zi5wcm9ncmVzcy52YWx1ZSxtc2c6ZyxlcnJvcjohMH0pfX19O2QucnVuVGFzaz1mdW5jdGlvbihmLGcsbCxrKXtrLnNldE1lc3NhZ2UoZik7dHJ5e2xldCBuPWEucHJvZmlsZS51dGlsLnRpbWUoZiwKbCk7ay51cGRhdGVQcm9ncmVzcyhnKTtyZXR1cm4gbn1jYXRjaChuKXtrLnJlcG9ydEVycm9yKCJGYWlsZWQgIitmLG4pfX19KShjLnV0aWx8fChjLnV0aWw9e30pKX0pKGEucHJvZmlsZXx8KGEucHJvZmlsZT17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL21lbW9yeS12aWV3ZXIvdXRpbHMuanMKdmFyIHFwOwooZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhkLGYsZyxsKXtyZXR1cm4icmdiYSgiK01hdGgucm91bmQoMjU1KmQpKyIsIitNYXRoLnJvdW5kKDI1NSpmKSsiLCIrTWF0aC5yb3VuZCgyNTUqZykrIiwiK2wrIikifWEuYnl0ZXNUb01pQj1mdW5jdGlvbihkKXtyZXR1cm4gZC8xMDQ4NTc2fTthLmJ5dGVTaXplT2ZQcmltaXRpdmVUeXBlPWZ1bmN0aW9uKGQpe3N3aXRjaChkKXtjYXNlICJQUkVEIjpyZXR1cm4gMTtjYXNlICJTOCI6cmV0dXJuIDE7Y2FzZSAiUzE2IjpyZXR1cm4gMjtjYXNlICJTMzIiOnJldHVybiA0O2Nhc2UgIlM2NCI6cmV0dXJuIDg7Y2FzZSAiVTgiOnJldHVybiAxO2Nhc2UgIlUxNiI6cmV0dXJuIDI7Y2FzZSAiVTMyIjpyZXR1cm4gNDtjYXNlICJVNjQiOnJldHVybiA4O2Nhc2UgIkJGMTYiOnJldHVybiAyO2Nhc2UgIkYxNiI6cmV0dXJuIDI7Y2FzZSAiRjMyIjpyZXR1cm4gNDtjYXNlICJGNjQiOnJldHVybiA4O2Nhc2UgIkM2NCI6cmV0dXJuIDg7Y2FzZSAiVE9LRU4iOnJldHVybiAwO2RlZmF1bHQ6cmV0dXJuIGNvbnNvbGUuZXJyb3IoIlVuaGFuZGxlZCBwcmltaXRpdmUgdHlwZSAiKwpkKSwwfX07YS5mbGFtZUNvbG9yPWZ1bmN0aW9uKGQsZixnLGwpe3ZvaWQgMD09PWYmJihmPTEpO3ZvaWQgMD09PWcmJihnPTEpO3ZvaWQgMD09PWwmJihsPWs9PjEtTWF0aC5zcXJ0KDEtaykpO2lmKGlzTmFOKGQpKXJldHVybiBjKGYsZixmLGcpO2Q9bChkKTtyZXR1cm4uNT5kP2MoZiwyKmQqZiwwLGcpOmMoMiooMS1kKSpmLGYsMCxnKX07YS5wZXJjZW50PWZ1bmN0aW9uKGQpe3JldHVybiBpc05hTihkKT8iLSI6Ljk5NTw9ZD8iMTAwJSI6MUUtNT5kPyIwLjAwJSI6KDEwMCpkKS50b1ByZWNpc2lvbigyKSsiJSJ9fSkocXB8fChxcD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL21lbW9yeS12aWV3ZXIvc2hhcGUuanMKdmFyIHJwOwooZnVuY3Rpb24oYSl7Y2xhc3MgY3tjb25zdHJ1Y3RvcihkKXt0aGlzLmVsZW1lbnRUeXBlPWQuZWxlbWVudFR5cGUudG9TdHJpbmcoKTt0aGlzLmRpbWVuc2lvbnM9ZC5kaW1lbnNpb25zLm1hcChmPT5wYXJzZUludChmLDEwKSk7ZC50dXBsZVNoYXBlcyYmKHRoaXMudHVwbGVTaGFwZXM9ZC50dXBsZVNoYXBlcy5tYXAoZj0+bmV3IGMoZikpKTt0aGlzLmxheW91dD1kLmxheW91dH1yZXNvbHZlU2hhcGVJbmRleChkKXtyZXR1cm4gZC5yZWR1Y2UoKGYsZyk9PmYudHVwbGVTaGFwZXNbZ10sdGhpcyl9dW5wYWRkZWRIZWFwU2l6ZUJ5dGVzKCl7aWYoIlRPS0VOIj09PXRoaXMuZWxlbWVudFR5cGUpcmV0dXJuIDA7aWYoIlRVUExFIj09PXRoaXMuZWxlbWVudFR5cGUpcmV0dXJuIDgqdGhpcy50dXBsZVNoYXBlcy5sZW5ndGg7bGV0IGQ9MDtpZih0aGlzLmxheW91dCYmIkRFTlNFIiE9dGhpcy5sYXlvdXQuZm9ybWF0KSJTUEFSU0UiPT10aGlzLmxheW91dC5mb3JtYXQmJihmPXBhcnNlSW50KHRoaXMubGF5b3V0Lm1heFNwYXJzZUVsZW1lbnRzLAoxMCksZD1mKnFwLmJ5dGVTaXplT2ZQcmltaXRpdmVUeXBlKHRoaXMuZWxlbWVudFR5cGUpLGQrPWYqdGhpcy5kaW1lbnNpb25zLmxlbmd0aCo4KTtlbHNle3ZhciBmPXRoaXMuZGltZW5zaW9ucy5yZWR1Y2UoKGcsbCk9PmcqbCwxKTtkKz1mKnFwLmJ5dGVTaXplT2ZQcmltaXRpdmVUeXBlKHRoaXMuZWxlbWVudFR5cGUpfXJldHVybiBkfWh1bWFuU3RyaW5nV2l0aExheW91dCgpe2lmKCJUVVBMRSI9PT10aGlzLmVsZW1lbnRUeXBlKXt2YXIgZD0iKCI7bGV0IGY9IiI7Zm9yKGNvbnN0IGcgb2YgdGhpcy50dXBsZVNoYXBlcylkPWQrZitnLmh1bWFuU3RyaW5nV2l0aExheW91dCgpLGY9IiwgIjtyZXR1cm4gZCs9IikifWQ9dGhpcy5lbGVtZW50VHlwZS50b0xvd2VyQ2FzZSgpKyJbIjtkKz10aGlzLmRpbWVuc2lvbnMuam9pbigpKyJdIjsiT1BBUVVFIiE9PXRoaXMuZWxlbWVudFR5cGUmJiJUT0tFTiIhPT10aGlzLmVsZW1lbnRUeXBlJiYwPHRoaXMuZGltZW5zaW9ucy5sZW5ndGgmJnRoaXMubGF5b3V0JiYKKGQrPXRoaXMuaHVtYW5MYXlvdXRTdHJpbmcodGhpcy5sYXlvdXQpKTtyZXR1cm4gZH1odW1hbkxheW91dFN0cmluZyhkKXtyZXR1cm4iU1BBUlNFIj09ZC5mb3JtYXQ/InNwYXJzZXsiK2QubWF4U3BhcnNlRWxlbWVudHMrIn0iOiJERU5TRSI9PWQuZm9ybWF0PyJ7IitkLm1pbm9yVG9NYWpvci5qb2luKCkrIn0iOiIifX1hLlNoYXBlPWN9KShycHx8KHJwPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vbWVtb3J5LXZpZXdlci9sb2dpY2FsLWJ1ZmZlci5qcwp2YXIgc3A7KGZ1bmN0aW9uKGEpe2NsYXNzIGN7Y29uc3RydWN0b3IoZCl7dGhpcy5pbnN0cnVjdGlvbk5hbWU9dGhpcy5jb21wdXRhdGlvbk5hbWU9IiI7dGhpcy5zaGFwZUluZGV4PVtdO3RoaXMuaWQ9cGFyc2VJbnQoZC5pZCwxMCk7dGhpcy5zaXplPXBhcnNlSW50KGQuc2l6ZSwxMCk7dGhpcy5jb2xvcj1wYXJzZUludChkLmNvbG9yLDEwKTt0aGlzLmluaXRCdWZmZXJMb2NhdGlvbl8oZC5kZWZpbmVkQXQpfWluaXRCdWZmZXJMb2NhdGlvbl8oZCl7ZCYmKHRoaXMuY29tcHV0YXRpb25OYW1lPWQuY29tcHV0YXRpb25OYW1lLHRoaXMuaW5zdHJ1Y3Rpb25OYW1lPWQuaW5zdHJ1Y3Rpb25OYW1lLHRoaXMuc2hhcGVJbmRleD1kLnNoYXBlSW5kZXgubWFwKGY9PnBhcnNlSW50KGYsMTApKSl9fWEuTG9naWNhbEJ1ZmZlcj1jfSkoc3B8fChzcD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL21lbW9yeS12aWV3ZXIvYnVmZmVyLWFsbG9jYXRpb24uanMKdmFyIHRwOyhmdW5jdGlvbihhKXtjbGFzcyBje2NvbnN0cnVjdG9yKGQpe3RoaXMuaW5kZXg9cGFyc2VJbnQoZC5pbmRleCwxMCk7dGhpcy5zaXplPXBhcnNlSW50KGQuc2l6ZSwxMCk7dGhpcy5pc1RocmVhZExvY2FsPWQuaXNUaHJlYWRMb2NhbHx8ITE7dGhpcy5hc3NpZ25lZD1kLmFzc2lnbmVkLm1hcChmPT5uZXcgdXAuQnVmZmVyQWxsb2NhdGlvbkFzc2lnbmVkKGYpKTt0aGlzLmdyb3VwTmFtZT10aGlzLmdldEdyb3VwTmFtZShkKX1nZXRHcm91cE5hbWUoZCl7cmV0dXJuIGQuaXNFbnRyeUNvbXB1dGF0aW9uUGFyYW1ldGVyPyJQYXJhbWV0ZXIiOmQubWF5YmVMaXZlT3V0PyJPdXRwdXQiOmQuaXNUaHJlYWRMb2NhbD8iVGhyZWFkLWxvY2FsIjoiVGVtcG9yYXJ5In19YS5CdWZmZXJBbGxvY2F0aW9uPWN9KSh0cHx8KHRwPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vbWVtb3J5LXZpZXdlci9idWZmZXItYWxsb2NhdGlvbi1hc3NpZ25lZC5qcwp2YXIgdXA7KGZ1bmN0aW9uKGEpe2NsYXNzIGN7Y29uc3RydWN0b3IoZCl7dGhpcy5sb2dpY2FsQnVmZmVySWQ9cGFyc2VJbnQoZC5sb2dpY2FsQnVmZmVySWQsMTApO3RoaXMub2Zmc2V0PXBhcnNlSW50KGQub2Zmc2V0LDEwKTt0aGlzLnNpemU9cGFyc2VJbnQoZC5zaXplLDEwKX19YS5CdWZmZXJBbGxvY2F0aW9uQXNzaWduZWQ9Y30pKHVwfHwodXA9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9tZW1vcnktdmlld2VyL2hsby1pbnN0cnVjdGlvbi5qcwp2YXIgdnA7KGZ1bmN0aW9uKGEpe2NsYXNzIGN7Y29uc3RydWN0b3IoZCl7dGhpcy5uYW1lPWQubmFtZT9kLm5hbWU6IiI7dGhpcy5vcGNvZGU9ZC5vcGNvZGU/ZC5vcGNvZGU6IiI7dGhpcy5zaGFwZT1kLnNoYXBlP25ldyBycC5TaGFwZShkLnNoYXBlKTpudWxsO2QubWV0YWRhdGEmJih0aGlzLnRmT3BOYW1lPWQubWV0YWRhdGEub3BOYW1lP2QubWV0YWRhdGEub3BOYW1lOiIiKX19YS5IbG9JbnN0cnVjdGlvbj1jfSkodnB8fCh2cD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL21lbW9yeS12aWV3ZXIvbWVtb3J5LXVzYWdlLmpzCnZhciB3cDsKKGZ1bmN0aW9uKGEpe2NsYXNzIGN7Y29uc3RydWN0b3IoZCl7dGhpcy5idWZmZXJzXz1bXTt0aGlzLmlkVG9CdWZmZXJfPXt9O3RoaXMuaWRUb0J1ZmZlckFsbG9jYXRpb25fPXt9O3RoaXMubmFtZVRvSGxvXz17fTt0aGlzLnVucGFkZGVkUGVha0hlYXBTaXplQnl0ZXM9dGhpcy5wZWFrSGVhcFNpemVCeXRlcz10aGlzLnJlc3RfPXRoaXMubkNvbG9yXz0wO3RoaXMucGVha0xvZ2ljYWxCdWZmZXJzPVtdO3RoaXMuaW5kZWZpbml0ZU1lbW9yeVVzYWdlQnl0ZXM9dGhpcy5wZWFrSGVhcFNpemVQb3NpdGlvbj0wO3RoaXMuaGVhcFNpemVzPVtdO3RoaXMudW5wYWRkZWRIZWFwU2l6ZXM9W107dGhpcy5tYXhIZWFwPVtdO3RoaXMubWF4SGVhcEJ5U2l6ZT1bXTt0aGlzLmJ5U2l6ZVRvTWF4SGVhcD1bXTt0aGlzLm1heEhlYXBUb0J5U2l6ZT1bXTt0aGlzLmxvZ2ljYWxCdWZmZXJTcGFucz17fTt0aGlzLnVuU2VlbkxvZ2ljYWxCdWZmZXJzXz1uZXcgU2V0O3RoaXMuc2VlbkJ1ZmZlckFsbG9jYXRpb25zXz1uZXcgU2V0Owp0aGlzLnNtYWxsQnVmZmVyU2l6ZT0xNjM4NDt0aGlzLmluaXRIbG9JbnN0cnVjdGlvbnNfKGQuaGxvTW9kdWxlKTt0aGlzLmluaXRNZW1vcnlVc2FnZV8oZC5idWZmZXJBc3NpZ25tZW50KTt0aGlzLmluaXRNYXhIZWFwXygpfWluaXRIbG9JbnN0cnVjdGlvbnNfKGQpe2lmKGQpZm9yKGNvbnN0IGYgb2YgZC5jb21wdXRhdGlvbnMpZm9yKGNvbnN0IGcgb2YgZi5pbnN0cnVjdGlvbnMpZy5uYW1lJiYodGhpcy5uYW1lVG9IbG9fW2cubmFtZV09bmV3IHZwLkhsb0luc3RydWN0aW9uKGcpKTtlbHNlIGNvbnNvbGUud2FybigiTWlzc2luZyBobG9Nb2R1bGUsIHNraXBwaW5nIHVucGFkZGVkIGFsbG9jYXRpb24gc2l6ZSBhbmFseXNpcyIpfWluaXRNZW1vcnlVc2FnZV8oZCl7ZD8odGhpcy5pbml0QnVmZmVyc18oZCksdGhpcy5pbml0QWxsb2NhdGlvbnNfKGQpLChkPXRoaXMuZ2V0SGJtSGVhcFRyYWNlXyhkKSk/dGhpcy5maW5kUGVha01lbW9yeVVzYWdlXyhkKTpjb25zb2xlLmVycm9yKCJNaXNzaW5nIGhibSBoZWFwIHNpbXVsYXRvciB0cmFjZS4iKSk6CmNvbnNvbGUuZXJyb3IoIk5vIGJ1ZmZlciBhc3NpZ25tZW50IGluZm8iKX1nZXRIYm1IZWFwVHJhY2VfKGQpe2Zvcihjb25zdCBmIG9mIGQuaGVhcFNpbXVsYXRvclRyYWNlcylmb3IoY29uc3QgZyBvZiBmLmV2ZW50cylpZihnLmJ1ZmZlcklkJiYoZD10aGlzLmlkVG9CdWZmZXJfW2cuYnVmZmVySWRdKSl7aWYoMCE9ZC5jb2xvcilicmVhaztyZXR1cm4gZn1yZXR1cm4gbnVsbH1pbml0QnVmZmVyc18oZCl7Zm9yKGxldCBmIG9mIGQubG9naWNhbEJ1ZmZlcnMpZD1uZXcgc3AuTG9naWNhbEJ1ZmZlcihmKSx0aGlzLmJ1ZmZlcnNfLnB1c2goZCksdGhpcy5pZFRvQnVmZmVyX1tkLmlkXT1kLHRoaXMudW5TZWVuTG9naWNhbEJ1ZmZlcnNfLmFkZChkLmlkKX1pbml0QWxsb2NhdGlvbnNfKGQpe2Zvcihjb25zdCBmIG9mIGQuYnVmZmVyQWxsb2NhdGlvbnMpe2Q9bmV3IHRwLkJ1ZmZlckFsbG9jYXRpb24oZik7Zm9yKGNvbnN0IGcgb2YgZi5hc3NpZ25lZClnLmxvZ2ljYWxCdWZmZXJJZCYmKHRoaXMuaWRUb0J1ZmZlckFsbG9jYXRpb25fW2cubG9naWNhbEJ1ZmZlcklkXT0KZCl9fW5ld0hlYXBPYmplY3RfKGQsZixnLGwsayl7Y29uc3Qgbj1nP3FwLmJ5dGVzVG9NaUIoZy51bnBhZGRlZEhlYXBTaXplQnl0ZXMoKSk6MDtyZXR1cm57aW5zdHJ1Y3Rpb25OYW1lOmYuaW5zdHJ1Y3Rpb25OYW1lLGxvZ2ljYWxCdWZmZXJJZDpmLmlkLHVucGFkZGVkU2l6ZU1pQjpuLHRmT3BOYW1lOmwudGZPcE5hbWUsb3Bjb2RlOmwub3Bjb2RlLHNpemVNaUI6cXAuYnl0ZXNUb01pQihmLnNpemUpLGNvbG9yOmQsc2hhcGU6Zz9nLmh1bWFuU3RyaW5nV2l0aExheW91dCgpOiIiLGdyb3VwTmFtZTprfX1hZGRIZWFwT2JqZWN0XyhkLGYsZyl7aWYoZi5zaXplPD1kLnNtYWxsQnVmZmVyU2l6ZSlkLnJlc3RfKz1mLnNpemU7ZWxzZSBpZihmLmluc3RydWN0aW9uTmFtZSl7dmFyIGw9ZC5uYW1lVG9IbG9fW2YuaW5zdHJ1Y3Rpb25OYW1lXTtpZihsKXt2YXIgaz1sLnNoYXBlLnJlc29sdmVTaGFwZUluZGV4KGYuc2hhcGVJbmRleCk7ZC5tYXhIZWFwLnB1c2goZC5uZXdIZWFwT2JqZWN0XyhkLm5Db2xvcl8rKywKZixrLGwsZykpfX19aW5pdE1heEhlYXBfKCl7Zm9yKHZhciBkIG9mIHRoaXMucGVha0xvZ2ljYWxCdWZmZXJzKXtjb25zdCBmPXRoaXMuaWRUb0J1ZmZlckFsbG9jYXRpb25fW2RdO3RoaXMuYWRkSGVhcE9iamVjdF8odGhpcyx0aGlzLmlkVG9CdWZmZXJfW2RdLGY/Zi5ncm91cE5hbWU6IiIpfTAhPXRoaXMucmVzdF8mJihkPSJzbWFsbCAoXHgzYyIrdGhpcy5zbWFsbEJ1ZmZlclNpemUvMTAyNCsiIEtpQikiLHRoaXMubWF4SGVhcC5wdXNoKHtpbnN0cnVjdGlvbk5hbWU6ZCxzaXplTWlCOnFwLmJ5dGVzVG9NaUIodGhpcy5yZXN0XyksY29sb3I6MCxncm91cE5hbWU6ZH0pKTtkPXRoaXMubWF4SGVhcC5tYXAoZnVuY3Rpb24oZixnKXtyZXR1cm57aW5kOmcsdmFsOmZ9fSk7ZC5zb3J0KChmLGcpPT5nLnZhbC5zaXplTWlCLWYudmFsLnNpemVNaUIpO3RoaXMubWF4SGVhcEJ5U2l6ZT1kLm1hcChmdW5jdGlvbihmKXtyZXR1cm4gZi52YWx9KTt0aGlzLmJ5U2l6ZVRvTWF4SGVhcD1kLm1hcChmdW5jdGlvbihmKXtyZXR1cm4gZi5pbmR9KTsKdGhpcy5tYXhIZWFwVG9CeVNpemUubGVuZ3RoPXRoaXMubWF4SGVhcC5sZW5ndGg7Zm9yKGQ9MDtkPHRoaXMuYnlTaXplVG9NYXhIZWFwLmxlbmd0aDtkKyspdGhpcy5tYXhIZWFwVG9CeVNpemVbdGhpcy5ieVNpemVUb01heEhlYXBbZF1dPWR9ZmluZFBlYWtNZW1vcnlVc2FnZV8oZCl7bGV0IGY9W10sZz1bXTt2YXIgbD1bXTtsZXQgaz1bXSxuPTAscD0wLHE9MCxyPTAsdD0wO2Zvcihjb25zdCB6IG9mIGQuZXZlbnRzKXtmLnB1c2gocXAuYnl0ZXNUb01pQihuKSk7Zy5wdXNoKHFwLmJ5dGVzVG9NaUIocCkpO2NvbnN0IHg9cGFyc2VJbnQoei5idWZmZXJJZCwxMCk7ZD10aGlzLmlkVG9CdWZmZXJfW3hdO3RoaXMudW5TZWVuTG9naWNhbEJ1ZmZlcnNfLmRlbGV0ZSh4KTt2YXIgdj10aGlzLmlkVG9CdWZmZXJBbGxvY2F0aW9uX1t4XTt2JiZ0aGlzLnNlZW5CdWZmZXJBbGxvY2F0aW9uc18uYWRkKHYuaW5kZXgpO3Y9bnVsbDtkLmluc3RydWN0aW9uTmFtZSYmIiIhPWQuaW5zdHJ1Y3Rpb25OYW1lJiYKKHY9dGhpcy5uYW1lVG9IbG9fW2QuaW5zdHJ1Y3Rpb25OYW1lXS5zaGFwZS5yZXNvbHZlU2hhcGVJbmRleChkLnNoYXBlSW5kZXgpKTtzd2l0Y2goei5raW5kLnRvU3RyaW5nKCkpe2Nhc2UgIkFMTE9DIjpjYXNlICJTSEFSRV9XSVRIIjpsLnB1c2goeCk7bis9ZC5zaXplO3YmJihwKz12LnVucGFkZGVkSGVhcFNpemVCeXRlcygpKTt0aGlzLmxvZ2ljYWxCdWZmZXJTcGFuc1t4XT1bZi5sZW5ndGgsLTFdO24+cSYmKHE9bixyPXAsdD1mLmxlbmd0aCxrPWwuc2xpY2UoKSk7YnJlYWs7Y2FzZSAiRlJFRSI6bD1sLmZpbHRlcihDPT5DIT09eCk7bi09ZC5zaXplO3YmJihwLT12LnVucGFkZGVkSGVhcFNpemVCeXRlcygpKTt0aGlzLmxvZ2ljYWxCdWZmZXJTcGFuc1t4XVsxXT1mLmxlbmd0aDswPm4mJmNvbnNvbGUuZXJyb3IoImhlYXBfc2l6ZV9ieXRlcyBceDNjIDAiKTticmVhaztkZWZhdWx0OmNvbnNvbGUubG9nKCJFUlJPUjogdW5rbm93biBoZWFwIGV2ZW50IGtpbmQ6Iix6KX19Zi5wdXNoKHFwLmJ5dGVzVG9NaUIobikpOwpsPXRoaXMuZmluZEluZGVmaW5pdGVNZW1vcnlVc2FnZV8odGhpcy51blNlZW5Mb2dpY2FsQnVmZmVyc18pO3RoaXMucGVha0hlYXBTaXplQnl0ZXM9cStsO3RoaXMudW5wYWRkZWRQZWFrSGVhcFNpemVCeXRlcz1yK2w7dGhpcy5wZWFrTG9naWNhbEJ1ZmZlcnM9azt0aGlzLnBlYWtIZWFwU2l6ZVBvc2l0aW9uPXQ7Y29uc3QgeT1xcC5ieXRlc1RvTWlCKGwpO3RoaXMuaGVhcFNpemVzPWYubWFwKHo9PnoreSk7dGhpcy51bnBhZGRlZEhlYXBTaXplcz1nLm1hcCh6PT56K3kpfWZpbmRJbmRlZmluaXRlTWVtb3J5VXNhZ2VfKGQpe2xldCBmPTA7ZC5mb3JFYWNoKGc9Pntjb25zdCBsPXRoaXMuaWRUb0J1ZmZlckFsbG9jYXRpb25fW2ddO2wuaXNUaHJlYWRMb2NhbHx8dGhpcy5zZWVuQnVmZmVyQWxsb2NhdGlvbnNfLmhhcyhsLmluZGV4KXx8KHRoaXMuc2VlbkJ1ZmZlckFsbG9jYXRpb25zXy5hZGQobC5pbmRleCksZis9bC5zaXplLHRoaXMuYWRkSGVhcE9iamVjdF8odGhpcyx0aGlzLmlkVG9CdWZmZXJfW2ddLApsLmdyb3VwTmFtZSkpfSk7cmV0dXJuIHRoaXMuaW5kZWZpbml0ZU1lbW9yeVVzYWdlQnl0ZXM9Zn19YS5NZW1vcnlVc2FnZT1jfSkod3B8fCh3cD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL21lbW9yeS12aWV3ZXIvbXYtbGluZS1jaGFydC5qcwp2YXIgeHA7CihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJtdi1saW5lLWNoYXJ0Iixwcm9wZXJ0aWVzOntkYXRhOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9kYXRhQ2hhbmdlZCJ9LGFjdGl2ZTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLG9ic2VydmVyOiJfcmVuZGVyU3BhbnMifSxidWZmZXJTaXplczp7dHlwZTpBcnJheSxub3RpZnk6ITB9LHVucGFkZGVkQnVmZmVyU2l6ZXM6e3R5cGU6QXJyYXksbm90aWZ5OiEwfSxtYXhIZWFwOnt0eXBlOkFycmF5LG5vdGlmeTohMH0sbWF4SGVhcEJ5U2l6ZTp7dHlwZTpBcnJheSxub3RpZnk6ITB9LHNwYW5QbG90Ont0eXBlOk9iamVjdCxub3RpZnk6ITB9LGNvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sX3NlbGVjdGVkRW50aXR5SW5TcmNDaGFydDp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLG9ic2VydmVyOiJfc2VsZWN0ZWRFbnRpdHlDaGFuZ2VkIn0sX3NlbGVjdGVkRW50aXR5SW5Ec3RDaGFydDp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLApvYnNlcnZlcjoiX3NlbGVjdGVkRW50aXR5Q2hhbmdlZCJ9LF9zeW1ib2xUb0V2ZW50Q2FsbGJhY2s6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgTWFwfX0sX21ha2VDaGFydERhdGFzZXQoKXtpZih0aGlzLmRhdGEpe3RoaXMuYnVmZmVyU2l6ZXM9dGhpcy5kYXRhLmhlYXBTaXplcy5tYXAoKGQsZik9PltmLGRdKTt0aGlzLnVucGFkZGVkQnVmZmVyU2l6ZXM9dGhpcy5kYXRhLnVucGFkZGVkSGVhcFNpemVzLm1hcCgoZCxmKT0+W2YsZF0pO3ZhciBhPXRoaXMuZGF0YS5tYXhIZWFwO3RoaXMuZGF0YS5tYXhIZWFwLnJlZHVjZShmdW5jdGlvbihkLGYsZyl7YVtnXS5vZmZzZXQ9ZDtyZXR1cm4gZCtmLnNpemVNaUJ9LDApO3RoaXMubWF4SGVhcD1hO3ZhciBjPXRoaXMuZGF0YS5tYXhIZWFwQnlTaXplO3RoaXMuZGF0YS5tYXhIZWFwQnlTaXplLnJlZHVjZShmdW5jdGlvbihkLGYsZyl7Y1tnXS5vZmZzZXRCeVNpemU9ZDtyZXR1cm4gZCtmLnNpemVNaUJ9LDApO3RoaXMubWF4SGVhcEJ5U2l6ZT0KY319LF9kcmF3UHJvZ3JhbU9yZGVyKCl7aWYodGhpcy5kYXRhKXt2YXIgYT1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXIsYz1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXIsZD1uZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyhhLCJib3R0b20iKSxmPW5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKGMsImxlZnQiKSxnPW5ldyBQbG90dGFibGUuUGxvdHMuTGluZTtnLmFkZERhdGFzZXQobmV3IFBsb3R0YWJsZS5EYXRhc2V0KHRoaXMuYnVmZmVyU2l6ZXMpKTtnLngoZnVuY3Rpb24odil7cmV0dXJuIHZbMF19LGEpLnkoZnVuY3Rpb24odil7cmV0dXJuIHZbMV19LGMpLmF0dHIoInN0cm9rZSIsInJlZCIpO3ZhciBsPW5ldyBQbG90dGFibGUuUGxvdHMuTGluZTtsLmFkZERhdGFzZXQobmV3IFBsb3R0YWJsZS5EYXRhc2V0KHRoaXMudW5wYWRkZWRCdWZmZXJTaXplcykpO2wueChmdW5jdGlvbih2KXtyZXR1cm4gdlswXX0sYSkueShmdW5jdGlvbih2KXtyZXR1cm4gdlsxXX0sYykuYXR0cigic3Ryb2tlIiwKImdyZXkiKTt2YXIgaz1uZXcgUGxvdHRhYmxlLlBsb3RzLlJlY3RhbmdsZSxuPXRoaXMuYnVmZmVyU2l6ZXMubGVuZ3RoLzQwO2suYWRkRGF0YXNldChuZXcgUGxvdHRhYmxlLkRhdGFzZXQoW3RoaXMuYnVmZmVyU2l6ZXNbdGhpcy5kYXRhLnBlYWtIZWFwU2l6ZVBvc2l0aW9uXV0pKTtrLngoZnVuY3Rpb24odil7cmV0dXJuIHZbMF0tbi8yfSxhKS55KGZ1bmN0aW9uKCl7cmV0dXJuIDB9LGMpLngyKGZ1bmN0aW9uKHYpe3JldHVybiB2WzBdK24vMn0pLnkyKGZ1bmN0aW9uKHYpe3JldHVybiB2WzFdfSkuYXR0cigiZmlsbCIsInJlZCIpLmF0dHIoIm9wYWNpdHkiLC4zKTt2YXIgcD10aGlzLmNvbG9yU2NhbGUscT1uZXcgUGxvdHRhYmxlLlBsb3RzLlJlY3RhbmdsZSxyPXRoaXMuZGF0YS5sb2dpY2FsQnVmZmVyU3BhbnMsdD10aGlzLm1heEhlYXAubWFwKHY9Pntjb25zdCB5PXJbdi5sb2dpY2FsQnVmZmVySWRdO3JldHVybiB5P3tpZDp2LmxvZ2ljYWxCdWZmZXJJZCxzcGFuOnksc2l6ZTp2LnNpemVNaUIsCmNvbG9yOnYuY29sb3J9Om51bGx9KTt0PXQuZmlsdGVyKHY9Pm51bGwhPT12KTtxLmFkZERhdGFzZXQobmV3IFBsb3R0YWJsZS5EYXRhc2V0KHQpKTtxLngoZnVuY3Rpb24odil7cmV0dXJuIHYuc3BhblswXX0sYSkueShmdW5jdGlvbigpe3JldHVybiAwfSxjKS54MihmdW5jdGlvbih2KXtyZXR1cm4gdi5zcGFuWzFdfSkueTIoZnVuY3Rpb24odil7cmV0dXJuIHYuc2l6ZX0pLmF0dHIoImZpbGwiLGZ1bmN0aW9uKHYpe3JldHVybih2LmNvbG9yJTEwKS50b1N0cmluZygpfSxwKS5hdHRyKCJmaWxsLW9wYWNpdHkiLDApO3RoaXMuc3BhblBsb3Q9cTtwPW5ldyBQbG90dGFibGUuU2NhbGVzLkNvbG9yO3AucmFuZ2UoWyJyZWQiLCJncmV5Il0pO3AuZG9tYWluKFsiU2l6ZXMiLCJVbnBhZGRlZCBTaXplcyJdKTtwPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5MZWdlbmQocCk7cC5tYXhFbnRyaWVzUGVyUm93KDIpO2E9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyaWRsaW5lcyhhLGMpOwpnPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5Hcm91cChbayxnLGwsYSxxXSk7ZD1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuVGFibGUoW1tudWxsLHBdLFtmLGddLFtudWxsLGRdXSk7Zj1kMy5zZWxlY3QodGhpcy4kLmNoYXJ0ZGl2KTtmLnNlbGVjdEFsbCgiLmNvbXBvbmVudCIpLnJlbW92ZSgpO2QucmVuZGVyVG8oZil9fSxfZHJhd01heEhlYXAoKXtsZXQgYT1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXIsYz1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXI7bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWMoYywidG9wIik7bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWMoYSwibGVmdCIpO2xldCBkPXRoaXMuY29sb3JTY2FsZTtkMy5zZWxlY3QodGhpcy4kLm1heGhlYXBjaGFydCkuc2VsZWN0QWxsKCIuY29tcG9uZW50IikucmVtb3ZlKCk7ZDMuc2VsZWN0KHRoaXMuJC5tYXhoZWFwc2l6ZWNoYXJ0KS5zZWxlY3RBbGwoIi5jb21wb25lbnQiKS5yZW1vdmUoKTt0aGlzLl9tYXhIZWFwQ2hhcnRNb3VzZU1vdmVLZXkmJgoodGhpcy5fdW5saXN0ZW4odGhpcy5fbWF4SGVhcENoYXJ0TW91c2VNb3ZlS2V5KSx0aGlzLl9tYXhIZWFwQ2hhcnRNb3VzZU1vdmVLZXk9bnVsbCk7dGhpcy5fbWF4SGVhcFNpemVDaGFydE1vdXNlTW92ZUtleSYmKHRoaXMuX3VubGlzdGVuKHRoaXMuX21heEhlYXBTaXplQ2hhcnRNb3VzZU1vdmVLZXkpLHRoaXMuX21heEhlYXBTaXplQ2hhcnRNb3VzZU1vdmVLZXk9bnVsbCk7bGV0IGY9bmV3IFBsb3R0YWJsZS5QbG90cy5SZWN0YW5nbGU7Zi5hZGREYXRhc2V0KG5ldyBQbG90dGFibGUuRGF0YXNldCh0aGlzLm1heEhlYXApKS54KGZ1bmN0aW9uKGwpe3JldHVybiBsLm9mZnNldH0sYykueShmdW5jdGlvbigpe3JldHVybiAwfSxhKS54MihmdW5jdGlvbihsKXtyZXR1cm4gbC5vZmZzZXQrbC5zaXplTWlCfSkueTIoZnVuY3Rpb24oKXtyZXR1cm4gMTJ9KS5hdHRyKCJmaWxsIixmdW5jdGlvbihsKXtyZXR1cm4obC5jb2xvciUxMCkudG9TdHJpbmcoKX0sZCkuYXR0cigib3BhY2l0eSIsCiIwLjYiKS5yZW5kZXJUbyhkMy5zZWxlY3QodGhpcy4kLm1heGhlYXBjaGFydCkpO2xldCBnPW5ldyBQbG90dGFibGUuUGxvdHMuUmVjdGFuZ2xlO2cuYWRkRGF0YXNldChuZXcgUGxvdHRhYmxlLkRhdGFzZXQodGhpcy5tYXhIZWFwQnlTaXplKSkueChmdW5jdGlvbihsKXtyZXR1cm4gbC5vZmZzZXRCeVNpemV9LGMpLnkoZnVuY3Rpb24oKXtyZXR1cm4gMH0sYSkueDIoZnVuY3Rpb24obCl7cmV0dXJuIGwub2Zmc2V0QnlTaXplK2wuc2l6ZU1pQn0pLnkyKGZ1bmN0aW9uKCl7cmV0dXJuIDEyfSkuYXR0cigiZmlsbCIsZnVuY3Rpb24obCl7cmV0dXJuKGwuY29sb3IlMTApLnRvU3RyaW5nKCl9LGQpLmF0dHIoIm9wYWNpdHkiLCIwLjYiKS5yZW5kZXJUbyhkMy5zZWxlY3QodGhpcy4kLm1heGhlYXBzaXplY2hhcnQpKTt0aGlzLl9tYXhIZWFwQ2hhcnRNb3VzZU1vdmVLZXk9dGhpcy5fbGlzdGVuKHRoaXMuJC5tYXhoZWFwY2hhcnQsIm1vdXNlbW92ZSIsbD0+e3RoaXMuX29uSG92ZXJJbnRlcmFjdGlvbihsLApmLGcsdGhpcy5kYXRhLm1heEhlYXBUb0J5U2l6ZSl9LHtwYXNzaXZlOiEwfSk7dGhpcy5fbWF4SGVhcFNpemVDaGFydE1vdXNlTW92ZUtleT10aGlzLl9saXN0ZW4odGhpcy4kLm1heGhlYXBzaXplY2hhcnQsIm1vdXNlbW92ZSIsbD0+e3RoaXMuX29uSG92ZXJJbnRlcmFjdGlvbihsLGcsZix0aGlzLmRhdGEuYnlTaXplVG9NYXhIZWFwKX0se3Bhc3NpdmU6ITB9KX0sX2xpc3RlbihhLGMsZCxmPW51bGwpe2NvbnN0IGc9U3ltYm9sKCk7YS5hZGRFdmVudExpc3RlbmVyKGMsZCxmKTt0aGlzLl9zeW1ib2xUb0V2ZW50Q2FsbGJhY2suc2V0KGcse2V2ZW50TmFtZTpjLG5vZGU6YSxjYWxsYmFjazpkLG9wdGlvbnM6Zn0pO3JldHVybiBnfSxfdW5saXN0ZW4oYSl7Y29uc29sZS5hc3NlcnQodGhpcy5fc3ltYm9sVG9FdmVudENhbGxiYWNrLmhhcyhhKSwiQ2Fubm90IHVubGlzdGVuIGFuIHVua25vd24gZXZlbnQiKTthPXRoaXMuX3N5bWJvbFRvRXZlbnRDYWxsYmFjay5nZXQoYSk7Y29uc3Qge2NhbGxiYWNrOmMsCmV2ZW50TmFtZTpkLG5vZGU6ZixvcHRpb25zOmd9PWE7Zi5yZW1vdmVFdmVudExpc3RlbmVyKGQsYyxnKX0sX29uSG92ZXJJbnRlcmFjdGlvbihhLGMsZCxmKXt2YXIgZz1jLnJvb3RFbGVtZW50KCkubm9kZSgpOyh7bGVmdDpnfT1nLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtjb25zdCBsPWEuY2xpZW50WC1nOyhhPWMuZW50aXRpZXMoKS5maW5kKGs9Pntjb25zdCB7eDpuLHdpZHRoOnB9PWsuYm91bmRzO3JldHVybiBuPD1sJiZuK3A+PWx9KSk/KHRoaXMuYWN0aXZlPWEuZGF0dW0sdGhpcy5fc2VsZWN0ZWRFbnRpdHlJblNyY0NoYXJ0PWEsdGhpcy5fc2VsZWN0ZWRFbnRpdHlJbkRzdENoYXJ0PWQuZW50aXRpZXMoKVtmW2EuaW5kZXhdXSk6dGhpcy5hY3RpdmU9dGhpcy5fc2VsZWN0ZWRFbnRpdHlJbkRzdENoYXJ0PXRoaXMuX3NlbGVjdGVkRW50aXR5SW5TcmNDaGFydD1udWxsfSxfc2VsZWN0ZWRFbnRpdHlDaGFuZ2VkKGEsYyl7YyYmYy5zZWxlY3Rpb24uYXR0cigib3BhY2l0eSIsCiIwLjYiKTthJiZhLnNlbGVjdGlvbi5hdHRyKCJvcGFjaXR5IiwiMS4wIil9LF9yZW5kZXJTcGFucyhhKXt0aGlzLnNwYW5QbG90JiYodGhpcy5zcGFuUGxvdC5zZWxlY3Rpb25zKCkuYXR0cigiZmlsbC1vcGFjaXR5IiwiMCIpLGEmJnRoaXMuc3BhblBsb3QuZW50aXRpZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2Muc2VsZWN0aW9uLmF0dHIoImZpbGwtb3BhY2l0eSIsYy5kYXR1bS5pZD09PWEubG9naWNhbEJ1ZmZlcklkPzE6MCl9KSl9LF9yZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLmRhdGEmJih0aGlzLmNvbG9yU2NhbGU9bmV3IFBsb3R0YWJsZS5TY2FsZXMuQ29sb3IoIkNhdGVnb3J5MTAiKSx0aGlzLl9tYWtlQ2hhcnREYXRhc2V0KCksdGhpcy5fZHJhd1Byb2dyYW1PcmRlcigpLHRoaXMuX2RyYXdNYXhIZWFwKCkpfSxfZGF0YUNoYW5nZWQoYSl7YSYmdGhpcy5fcmVkcmF3KCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVkcmF3KCl9fSl9KSh4cHx8KHhwPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vbWVtb3J5LXZpZXdlci9idWZmZXItZGV0YWlscy5qcwp2YXIgeXA7CihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1tdi1iYXIiLHByb3BlcnRpZXM6e3ZhbHVlOnt0eXBlOk51bWJlcixub3RpZnk6ITAsb2JzZXJ2ZXI6Il91cGRhdGVWYWx1ZSJ9fSxfdXBkYXRlVmFsdWU6ZnVuY3Rpb24oYSl7Y29uc3QgYz1xcC5mbGFtZUNvbG9yKGEpO2E9cXAucGVyY2VudChhKTt0aGlzLnN0eWxlLmJhY2tncm91bmQ9YGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgJHtjfSAke2F9LCAjY2NjICR7YX0pYH19KTtQb2x5bWVyKHtpczoiYnVmZmVyLWRldGFpbHMiLHByb3BlcnRpZXM6e25vZGU6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxvYnNlcnZlcjoiX3VwZGF0ZUNhcmQifSxzaXplOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHVucGFkZGVkU2l6ZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxwYWRkaW5nOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LGV4cGFuc2lvbjp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSx1dGlsaXphdGlvbjp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfX0sCl91cGRhdGVDYXJkOmZ1bmN0aW9uKGEpe2lmKGEpe3RoaXMuc2l6ZT1hLnNpemVNaUIudG9GaXhlZCgxKTt2YXIgYz0icmdiKDE5MiwxOTIsMTkyKSI7YS51bnBhZGRlZFNpemVNaUImJih0aGlzLnVucGFkZGVkU2l6ZT1hLnVucGFkZGVkU2l6ZU1pQi50b0ZpeGVkKDEpLHRoaXMucGFkZGluZz0oYS5zaXplTWlCLWEudW5wYWRkZWRTaXplTWlCKS50b0ZpeGVkKDEpLHRoaXMudXRpbGl6YXRpb249YS51bnBhZGRlZFNpemVNaUIvYS5zaXplTWlCLHRoaXMuZXhwYW5zaW9uPSgxL3RoaXMudXRpbGl6YXRpb24pLnRvRml4ZWQoMSksYz1xcC5mbGFtZUNvbG9yKHRoaXMudXRpbGl6YXRpb24sLjcpKTt0aGlzLiQuY2FyZC51cGRhdGVTdHlsZXMoeyItLXBhcGVyLWNhcmQtYmFja2dyb3VuZC1jb2xvciI6Y30pO3RoaXMuJC5zdWJoZWFkZXIuc3R5bGUuYmFja2dyb3VuZENvbG9yPWN9fSxfc3ViaGVhZGVyOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLm9wY29kZT9hLm9wY29kZSsiIG9wZXJhdGlvbiI6CiIifX0pfSkoeXB8fCh5cD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL21lbW9yeS12aWV3ZXIvbWVtb3J5LXZpZXdlci1kYXNoYm9hcmQuanMKdmFyIHpwOwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoibWVtb3J5LXZpZXdlci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19kYXRhOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsb2JzZXJ2ZXI6ImRhdGFDaGFuZ2VkXyJ9LGhsb01vZHVsZV86e3R5cGU6T2JqZWN0fSxtb2R1bGVOYW1lXzp7dHlwZTpTdHJpbmd9LHBlYWtIZWFwU2l6ZU1pQl86e3R5cGU6U3RyaW5nfSx1bnBhZGRlZFBlYWtIZWFwU2l6ZU1pQl86e3R5cGU6U3RyaW5nfSx1c2FnZTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxhY3RpdmU6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTpudWxsfX0sZGF0YUNoYW5nZWRfKGEpe2EmJmEuaGxvTW9kdWxlJiZhLmJ1ZmZlckFzc2lnbm1lbnQmJih0aGlzLmhsb01vZHVsZV89YS5obG9Nb2R1bGUsdGhpcy5tb2R1bGVOYW1lXz10aGlzLmhsb01vZHVsZV8ubmFtZT90aGlzLmhsb01vZHVsZV8ubmFtZToiIix0aGlzLnVzYWdlPW5ldyB3cC5NZW1vcnlVc2FnZShhKSx0aGlzLnBlYWtIZWFwU2l6ZU1pQl89cXAuYnl0ZXNUb01pQih0aGlzLnVzYWdlLnBlYWtIZWFwU2l6ZUJ5dGVzKS50b0ZpeGVkKDIpLAp0aGlzLnVucGFkZGVkUGVha0hlYXBTaXplTWlCXz1xcC5ieXRlc1RvTWlCKHRoaXMudXNhZ2UudW5wYWRkZWRQZWFrSGVhcFNpemVCeXRlcykudG9GaXhlZCgyKSl9fSl9KSh6cHx8KHpwPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcG9kLXZpZXdlci9wcm90by5qcwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BvZC12aWV3ZXIvZGV0YWlscy1jYXJkLmpzCnZhciBBcDsKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6ImRldGFpbHMtY2FyZCIscHJvcGVydGllczp7bm9kZXM6e3R5cGU6QXJyYXl9LF9uYW1lOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVOYW1lKG5vZGVzKSJ9LHN0ZXBCcmVha2Rvd25MYXllcnM6e3R5cGU6QXJyYXksdmFsdWU6KCk9Plt7a2V5OiJoaWdoRmxvcHNDb21wdXRlVXMiLGxhYmVsOiJIaWdoIGZsb3BzIGNvbXB1dGUifSx7a2V5OiJsb3dGbG9wc0NvbXB1dGVVcyIsbGFiZWw6IkxvdyBmbG9wcyBjb21wdXRlIn0se2tleToiaG9zdEluZmVlZER1cmF0aW9uVXMiLGxhYmVsOiJJbmZlZWQifSx7a2V5OiJob3N0T3V0ZmVlZER1cmF0aW9uVXMiLGxhYmVsOiJPdXRmZWVkIn0se2tleToiYWxsUmVkdWNlQ29tcHV0ZUR1cmF0aW9uVXMiLGxhYmVsOiJBbGxSZWR1Y2UgY29tcHV0ZSJ9LHtrZXk6ImFsbFJlZHVjZVN5bmNEdXJhdGlvblVzIixsYWJlbDoiQWxsUmVkdWNlIHN5bmMifSx7a2V5OiJzZW5kRHVyYXRpb25VcyIsbGFiZWw6IlNlbmQifSwKe2tleToicmVjdkR1cmF0aW9uVXMiLGxhYmVsOiJSZWN2In1dfX0sX2lzQWxsUmVkdWNlKGEpe3JldHVybiB2b2lkIDAhPWEucmVwbGljYUdyb3Vwc30sX2lzQ2hhbm5lbChhKXtyZXR1cm4gdm9pZCAwIT1hLmNoYW5uZWxJZH0sX2lzU3RlcChhKXtyZXR1cm4gdm9pZCAwIT1hLmhvc3ROYW1lfSxfaGFzUmVwbGljYUdyb3VwcyhhKXtyZXR1cm4gYS5yZXBsaWNhR3JvdXBzJiYwPGEucmVwbGljYUdyb3Vwcy5sZW5ndGh9LF9jb21wdXRlTmFtZTpmdW5jdGlvbihhKXtpZihhJiYwIT1hLmxlbmd0aCl7YT1hWzBdO2lmKHRoaXMuX2lzQ2hhbm5lbChhKSlyZXR1cm4iQ2hhbm5lbCAjICIrYS5jaGFubmVsSWQ7aWYodGhpcy5faXNBbGxSZWR1Y2UoYSkpcmV0dXJuIGEubmFtZTtpZih0aGlzLl9pc1N0ZXAoYSkpcmV0dXJuIlN0ZXAgYnJlYWtkb3duIG9mIGNoaXAgIithLmNoaXBJZCsiLCBjb3JlICIrYS5ub2RlSWR9fSxfYnl0ZXNUb01pQjpmdW5jdGlvbihhKXtyZXR1cm4gYS8xMDQ4NTc2fSwKX3NpemVNaUI6ZnVuY3Rpb24oYSl7aWYoYSlyZXR1cm4gdGhpcy5fZm9ybWF0KHRoaXMuX2J5dGVzVG9NaUIoYSkpfSxfYmFuZHdpZHRoOmZ1bmN0aW9uKGEsYyl7aWYoYSYmYylyZXR1cm4gdGhpcy5fZm9ybWF0KGEvYy8xMDczLjc0KX0sX2NoaXBJZDpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5mbG9vcihhLzIpfSxfbm9kZUlkOmZ1bmN0aW9uKGEpe3JldHVybiBhJjF9LF9mb3JtYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6YS50b0ZpeGVkKDIpfSxfZ2V0U3RlcEJyZWFrZG93blZhbHVlOmZ1bmN0aW9uKGEsYyl7aWYoYyYmYSlyZXR1cm4gdGhpcy5fZm9ybWF0KGFbY10/YVtjXTowKX0sX2dldFN0ZXBCcmVha2Rvd25QY3Q6ZnVuY3Rpb24oYSxjKXtpZihjJiZhJiZhLnRvdGFsRHVyYXRpb25VcyYmYVtjXSlyZXR1cm4oYVtjXS9hLnRvdGFsRHVyYXRpb25VcyoxMDApLnRvRml4ZWQoMikrIiUifX0pfSkoQXB8fChBcD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BvZC12aWV3ZXIvc3RhY2stYmFyLWNoYXJ0LmpzCnZhciBCcDsKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InN0YWNrLWJhci1jaGFydCIscHJvcGVydGllczp7ZGF0YTp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W10sb2JzZXJ2ZXI6Il9kYXRhQ2hhbmdlZCJ9LGFjdGl2ZUJhcjp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSx4RG9tYWluRnVuYzp7dHlwZTpPYmplY3R9LHN0YWNrTGF5ZXJzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXSxvYnNlcnZlcjoiX29uU3RhY2tMYXllcnNDaGFuZ2VkIn19LHN0YWNrQmFyQ2hhcnQ6ZnVuY3Rpb24oYSl7aWYoYS5sZW5ndGgmJnRoaXMuaXNBdHRhY2hlZCYmMCE9dGhpcy5zdGFja0xheWVycy5sZW5ndGgpe3ZhciBjPXRoaXMuc3RhY2tMYXllcnMubWFwKHA9PnAua2V5KSxkPXRoaXMuc3RhY2tMYXllcnMubWFwKHA9PnAubGFiZWwpLGY9NTAqYS5sZW5ndGgsZz1kMy5zY2FsZUJhbmQoKS5yYW5nZShbMCxmXSkucGFkZGluZyguNCksbD1kMy5zY2FsZUxpbmVhcigpLnJhbmdlKFsyNTAsMF0pLGs9ZDMuc2NhbGVPcmRpbmFsKGQzLnNjaGVtZUNhdGVnb3J5MTApLmRvbWFpbihbMCwxOV0pLApuPWQzLnNlbGVjdCh0aGlzLiQuY2hhcnQpLnNlbGVjdCgic3ZnIik7bi5lbXB0eSgpJiYobj1kMy5zZWxlY3QodGhpcy4kLmNoYXJ0KS5hcHBlbmQoInN2ZyIpLmF0dHIoIndpZHRoIixNYXRoLm1heCgxNjAwLGYrMTAwKzIwKSkuYXR0cigiaGVpZ2h0IiwzMDApLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgxMDAsMjApIiksbi5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInggYXhpcyIpLnN0eWxlKCJmb250LXNpemUiLDE0KS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwyNTUpIiksbi5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInkgYXhpcyIpLnN0eWxlKCJmb250LXNpemUiLDE0KS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwwKSIpKTtjPWQzLnN0YWNrKCkua2V5cyhjKS5vcmRlcihkMy5zdGFja09yZGVyTm9uZSkub2Zmc2V0KGQzLnN0YWNrT2Zmc2V0Tm9uZSkoYSk7Zy5kb21haW4oYS5tYXAodGhpcy54RG9tYWluRnVuYykpO2wuZG9tYWluKFswLApkMy5tYXgoY1tjLmxlbmd0aC0xXSxwPT5wWzBdK3BbMV0pXSkubmljZSgpO3RoaXMuZHJhd0xheWVycyhuLGMsZyxsLGspO3RoaXMuZHJhd0F4ZXMobixnLGwsMjUwKTthPWQzLnNlbGVjdCh0aGlzLiQuY2hhcnQpLnNlbGVjdCgiLmxlZ2VuZCIpO2EuZW1wdHkoKSYmKGE9bi5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxlZ2VuZCIpLmF0dHIoImZvbnQtZmFtaWx5Iiwic2Fucy1zZXJpZiIpLmF0dHIoImZvbnQtc2l6ZSIsMTQpLmF0dHIoInRleHQtYW5jaG9yIiwic3RhcnQiKSk7dGhpcy5kcmF3TGVnZW5kKGEsZCxrKX19LGRyYXdMYXllcnM6ZnVuY3Rpb24oYSxjLGQsZixnKXtsZXQgbD10aGlzO2E9YS5zZWxlY3RBbGwoIi5sYXllciIpLmRhdGEoYyk7Yz1hLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsYXllciIpLm1lcmdlKGEpLnN0eWxlKCJmaWxsIiwoayxuKT0+ZyhuKSkuc2VsZWN0QWxsKCJyZWN0IikuZGF0YShrPT5rKTtjLmVudGVyKCkuYXBwZW5kKCJyZWN0IikubWVyZ2UoYykuYXR0cigid2lkdGgiLApkLmJhbmR3aWR0aCgpKS5hdHRyKCJ5IixrPT5mKGtbMV0pKS5hdHRyKCJoZWlnaHQiLGs9PmYoa1swXSktZihrWzFdKSkuYXR0cigieCIsaz0+ZChsLnhEb21haW5GdW5jKGsuZGF0YSkpKS5vbigibW91c2VvdmVyIixmdW5jdGlvbihrKXtkMy5zZWxlY3QodGhpcykuc3R5bGUoIm9wYWNpdHkiLC41KTtsLmFjdGl2ZUJhcj1rLmRhdGF9KS5vbigibW91c2VvdXQiLGZ1bmN0aW9uKCl7ZDMuc2VsZWN0KHRoaXMpLnN0eWxlKCJvcGFjaXR5IiwxKTtsLmFjdGl2ZUJhcj1udWxsfSkudHJhbnNpdGlvbigpLmR1cmF0aW9uKDFFMyk7YS5leGl0KCkucmVtb3ZlKCl9LGRyYXdBeGVzOmZ1bmN0aW9uKGEsYyxkKXthLnNlbGVjdCgiLnguYXhpcyIpLnRyYW5zaXRpb24oKS5kdXJhdGlvbigxRTMpLmNhbGwoZDMuYXhpc0JvdHRvbShjKSk7YS5zZWxlY3QoIi55LmF4aXMiKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oMUUzKS5jYWxsKGQzLmF4aXNMZWZ0KGQpKX0sZHJhd0xlZ2VuZDpmdW5jdGlvbihhLApjLGQpe2E9YS5zZWxlY3RBbGwoImciKS5kYXRhKGMuc2xpY2UoKSk7YS5leGl0KCkucmVtb3ZlKCk7Yz1hLmVudGVyKCkuYXBwZW5kKCJnIik7Yy5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwyMDApLmF0dHIoIndpZHRoIiwxOSkuYXR0cigiaGVpZ2h0IiwxOSk7Yy5hcHBlbmQoInRleHQiKS5hdHRyKCJ4IiwyMjQpLmF0dHIoInkiLDkuNSkuYXR0cigiZHkiLCIwLjMyZW0iKTthPWMubWVyZ2UoYSk7YS5hdHRyKCJ0cmFuc2Zvcm0iLChmLGcpPT5gdHJhbnNsYXRlKCR7MTUwKmctNzUwKk1hdGguZmxvb3IoZy81KX0sICR7MzAqTWF0aC5mbG9vcihnLzUpfSlgKTthLnNlbGVjdCgicmVjdCIpLmF0dHIoImZpbGwiLChmLGcpPT5kKGcpKTthLnNlbGVjdCgidGV4dCIpLnRleHQoZj0+Zil9LHJlZHJhdzpmdW5jdGlvbihhKXthJiYwIT1hLmxlbmd0aCYmdGhpcy5zdGFja0JhckNoYXJ0KGEpfSxfb25TdGFja0xheWVyc0NoYW5nZWQ6ZnVuY3Rpb24oYSl7YSYmMCE9YS5sZW5ndGgmJnRoaXMucmVkcmF3KHRoaXMuZGF0YSl9LApfZGF0YUNoYW5nZWQ6ZnVuY3Rpb24oYSl7YSYmMCE9YS5sZW5ndGgmJnRoaXMucmVkcmF3KGEpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMucmVkcmF3KHRoaXMuZGF0YSl9fSl9KShCcHx8KEJwPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcG9kLXZpZXdlci90b3BvbG9neS1ncmFwaC5qcwp2YXIgQ3A7CihmdW5jdGlvbigpe2NvbnN0IGE9IiNmZmZmZDkgI2VkZjhiMSAjYzdlOWI0ICM3ZmNkYmIgIzQxYjZjNCAjMWQ5MWMwICMyMjVlYTggIzI1MzQ5NCAjMDgxZDU4Ii5zcGxpdCgiICIpLGM9ZDMuc2NhbGVRdWFudGlsZSgpLmRvbWFpbihbMCwxXSkucmFuZ2UoYSk7UG9seW1lcih7aXM6InRvcG9sb2d5LWdyYXBoIixwcm9wZXJ0aWVzOntkYXRhOnt0eXBlOk9iamVjdH0scnVuRW52aXJvbm1lbnQ6e3R5cGU6T2JqZWN0fSxtZXRyaWNzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sYWN0aXZlQmFyOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX2FjdGl2ZUJhckNoYW5nZWQifSxzZWxlY3RlZE1ldHJpY0lkeDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxvYnNlcnZlcjoiX3NlbGVjdGVkTWV0cmljSWR4Q2hhbmdlZCJ9LF90b3BvRGF0YTp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlVG9wb0RhdGEoZGF0YSwgcnVuRW52aXJvbm1lbnQsIG1ldHJpY3MpIn0sX3hEaW1lbnNpb246e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZVhEaW1lbnNpb24ocnVuRW52aXJvbm1lbnQpIn0sCl95RGltZW5zaW9uOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVZRGltZW5zaW9uKHJ1bkVudmlyb25tZW50KSJ9LF90b3RhbENvcmVDb3VudDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlVG90YWxDb3JlQ291bnQoX3hEaW1lbnNpb24sIF95RGltZW5zaW9uKSJ9LF90cHVUeXBlOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVUcHVUeXBlKHJ1bkVudmlyb25tZW50KSJ9LF9ob3N0WFN0cmlkZTp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlSG9zdFhTdHJpZGUoX3RwdVR5cGUpIn0sX2hvc3RHcmlkV2lkdGg6e3R5cGU6TnVtYmVyfSxfaG9zdEdyaWRIZWlnaHQ6e3R5cGU6TnVtYmVyfSxfbm9kZUdyaWRIZWlnaHQ6e3R5cGU6TnVtYmVyfSxfbm9kZUdyaWRXaWR0aDp7dHlwZTpOdW1iZXJ9LF9nU1ZHOnt0eXBlOk9iamVjdH19LG9ic2VydmVyczpbImRyYXdUb3BvbG9neShfdG9wb0RhdGEsIHJ1bkVudmlyb25tZW50KSJdLF9jb21wdXRlVG9wb0RhdGE6ZnVuY3Rpb24oZCwKZixnKXtpZihkJiZmJiZmLnRvcG9sb2d5JiZnKXt2YXIgbD1wYXJzZUludChmLnRvcG9sb2d5LnhEaW1lbnNpb24sMTApO3JldHVybiBPYmplY3Qua2V5cyhkLnBvZFN0YXRzUGVyQ29yZSkubWFwKGs9Pntjb25zdCBuPWQucG9kU3RhdHNQZXJDb3JlW2tdO2xldCBwPWcubWFwKHE9Pm5bcS5rZXldP25bcS5rZXldOjApO3JldHVybnt4ZGltOm4uY2hpcElkJWwseWRpbTpNYXRoLmZsb29yKG4uY2hpcElkL2wpLG5pZDpuLm5vZGVJZCxjaWQ6bi5jaGlwSWQscmlkOmQuY29yZUlkVG9SZXBsaWNhSWRNYXBba10saG9zdDpuLmhvc3ROYW1lLHZhbHVlczpwLHRvdGFsOm4udG90YWxEdXJhdGlvblVzfX0pfX0sX2NvbXB1dGVUcHVUeXBlOmZ1bmN0aW9uKGQpe2lmKGQpcmV0dXJuIGQudHB1VHlwZX0sX2NvbXB1dGVYRGltZW5zaW9uOmZ1bmN0aW9uKGQpe2lmKGQmJmQudG9wb2xvZ3kpcmV0dXJuIHBhcnNlSW50KGQudG9wb2xvZ3kueERpbWVuc2lvbiwxMCl9LF9jb21wdXRlWURpbWVuc2lvbjpmdW5jdGlvbihkKXtpZihkJiYKZC50b3BvbG9neSlyZXR1cm4gcGFyc2VJbnQoZC50b3BvbG9neS55RGltZW5zaW9uLDEwKX0sX2NvbXB1dGVUb3RhbENvcmVDb3VudDpmdW5jdGlvbihkLGYpe3JldHVybiBkKmYqMn0sX2NvbXB1dGVIb3N0WFN0cmlkZTpmdW5jdGlvbihkKXtyZXR1cm4iVFBVIHYzIj09ZD80OjJ9LHRvcG9sb2d5R3JhcGg6ZnVuY3Rpb24oZCl7dGhpcy5faG9zdEdyaWRXaWR0aD10aGlzLmdldEhvc3RHcmlkU2l6ZSh0aGlzLl9ob3N0WFN0cmlkZSk7dGhpcy5faG9zdEdyaWRIZWlnaHQ9dGhpcy5nZXRIb3N0R3JpZFNpemUoMik7dGhpcy5fbm9kZUdyaWRXaWR0aD0xNTt0aGlzLl9ub2RlR3JpZEhlaWdodD0zMDt2YXIgZj10aGlzLl94RGltZW5zaW9uL3RoaXMuX2hvc3RYU3RyaWRlO2NvbnN0IGc9dGhpcy5feURpbWVuc2lvbi8yLGw9QXJyYXkuZnJvbShBcnJheSh0aGlzLl94RGltZW5zaW9uKS5rZXlzKCkpLGs9QXJyYXkuZnJvbShBcnJheSh0aGlzLl95RGltZW5zaW9uKS5rZXlzKCkpO3RoaXMuX2dTVkd8fAoodGhpcy5fZ1NWRz1kMy5zZWxlY3QodGhpcy4kLnRwZ3JhcGgpLmFwcGVuZCgic3ZnIikuYXR0cigid2lkdGgiLDE2MjApLmF0dHIoImhlaWdodCIsZyp0aGlzLl9ob3N0R3JpZEhlaWdodCsxNTApLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgzMCw1MCkiKSx0aGlzLl9nU1ZHLmFwcGVuZCgic3ZnOmciKS5jbGFzc2VkKCJncmFwaCIsITApLHRoaXMuX2dTVkcuYXBwZW5kKCJzdmc6ZyIpLmNsYXNzZWQoImxpbmsiLCEwKSx0aGlzLl9nU1ZHLmFwcGVuZCgic3ZnOmRlZnMiKS5hcHBlbmQoInN2ZzptYXJrZXIiKS5hdHRyKCJpZCIsImFycm93IikuYXR0cigidmlld0JveCIsIjAgLTUgMTAgMTAiKS5hdHRyKCJtYXJrZXJXaWR0aCIsNSkuYXR0cigibWFya2VySGVpZ2h0Iiw1KS5hdHRyKCJvcmllbnQiLCJhdXRvIikuYXBwZW5kKCJzdmc6cGF0aCIpLnN0eWxlKCJzdHJva2UiLCJyZWQiKS5zdHlsZSgiZmlsbCIsInJlZCIpLmF0dHIoImQiLCJNMCwtNUwxMCwwTDAsNSIpKTsKbGV0IG49dGhpcy5fZ1NWRy5zZWxlY3QoIi5ncmFwaCIpO2Y9dGhpcy5jcmVhdGVIb3N0RGF0YShmLGcpO3RoaXMuZHJhd0hvc3RDYXJkcyhuLGYsdGhpcy5faG9zdEdyaWRXaWR0aCx0aGlzLl9ob3N0R3JpZEhlaWdodCk7dGhpcy5kcmF3Tm9kZUNhcmRzKG4sZCxjKTt0aGlzLmRyYXdMYWJlbHMobixsLGspO3RoaXMuZHJhd0xlZ2VuZChuLHRoaXMuX2hvc3RHcmlkSGVpZ2h0Kk1hdGguY2VpbCh0aGlzLl95RGltZW5zaW9uLzIpKzEwLGMpfSxnZXRIb3N0R3JpZFNpemUoZCl7cmV0dXJuIDMwKzEwKihkLTEpKzMwKmQrMTB9LGdldENoaXBYTG9jOmZ1bmN0aW9uKGQsZil7cmV0dXJuIGQqdGhpcy5faG9zdEdyaWRXaWR0aCsxNSs0MCpmfSxnZXRDaGlwWUxvYzpmdW5jdGlvbihkLGYpe3JldHVybiBkKnRoaXMuX2hvc3RHcmlkSGVpZ2h0KzE1KzQwKmZ9LGdldE5vZGVYTG9jOmZ1bmN0aW9uKGQsZixnKXtyZXR1cm4gdGhpcy5nZXRDaGlwWExvYyhkLGYpK2cqdGhpcy5fbm9kZUdyaWRXaWR0aH0sCmNyZWF0ZUhvc3REYXRhOmZ1bmN0aW9uKGQsZil7bGV0IGc9W107Zm9yKGxldCBsPTA7bDxkO2wrKylmb3IobGV0IGs9MDtrPGY7aysrKWcucHVzaCh7eGRpbTpsLHlkaW06a30pO3JldHVybiBnfSxkcmF3TGFiZWxzOmZ1bmN0aW9uKGQsZixnKXtmPWQuc2VsZWN0QWxsKCIueC1sYWJlbCIpLmRhdGEoZik7Zi5lbnRlcigpLmFwcGVuZCgidGV4dCIpLm1lcmdlKGYpLnRleHQobD0+bCkuYXR0cigieCIsKGwsayk9PnRoaXMuZ2V0Q2hpcFhMb2MoTWF0aC5mbG9vcihrL3RoaXMuX2hvc3RYU3RyaWRlKSxrJXRoaXMuX2hvc3RYU3RyaWRlKSkuYXR0cigieSIsMCkuc3R5bGUoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDE1LCAtNikiKS5hdHRyKCJjbGFzcyIsIngtbGFiZWwiKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oMUUzKTtmLmV4aXQoKS5yZW1vdmUoKTtkPWQuc2VsZWN0QWxsKCIueS1sYWJlbCIpLmRhdGEoZyk7ZC5lbnRlcigpLmFwcGVuZCgidGV4dCIpLm1lcmdlKGQpLnRleHQobD0+CmwpLmF0dHIoIngiLDApLmF0dHIoInkiLChsLGspPT50aGlzLmdldENoaXBZTG9jKE1hdGguZmxvb3Ioay8yKSxrJTIpKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoLTEyLDE1KSIpLmF0dHIoImNsYXNzIiwieS1sYWJlbCIpLnRyYW5zaXRpb24oKS5kdXJhdGlvbigxRTMpO2QuZXhpdCgpLnJlbW92ZSgpfSxkcmF3SG9zdENhcmRzOmZ1bmN0aW9uKGQsZixnLGwpe2Q9ZC5zZWxlY3RBbGwoIi5ob3N0IikuZGF0YShmKTtkLmVudGVyKCkuYXBwZW5kKCJyZWN0IikubWVyZ2UoZCkuYXR0cigieCIsaz0+ay54ZGltKmcpLmF0dHIoInkiLGs9PmsueWRpbSpsKS5hdHRyKCJyeCIsNCpnL2wpLmF0dHIoInJ5Iiw0KS5hdHRyKCJjbGFzcyIsImhvc3QgYm9yZGVyZWQiKS5hdHRyKCJ3aWR0aCIsZy0xMCkuYXR0cigiaGVpZ2h0IixsLTEwKS5hdHRyKCJib3JkZXIiLDEpLnN0eWxlKCJmaWxsIiwiRjBGMEYwIikuc3R5bGUoInN0cm9rZSIsCiJibGFjayIpLnN0eWxlKCJzdHJva2Utd2lkdGgiLDEpLnRyYW5zaXRpb24oKS5kdXJhdGlvbigxRTMpO2QuZXhpdCgpLnJlbW92ZSgpfSxkcmF3Tm9kZUNhcmRzOmZ1bmN0aW9uKGQsZixnKXtkPWQuc2VsZWN0QWxsKCIubm9kZSIpLmRhdGEoZik7bGV0IGw9dGhpcyxrPU1hdGgubWF4KHRoaXMuc2VsZWN0ZWRNZXRyaWNJZHgsMCk7ZC5lbnRlcigpLmFwcGVuZCgicmVjdCIpLm1lcmdlKGQpLmF0dHIoImlkIixuPT4icmlkIituLnJpZCkuYXR0cigieCIsbj0+dGhpcy5nZXROb2RlWExvYyhNYXRoLmZsb29yKG4ueGRpbS90aGlzLl9ob3N0WFN0cmlkZSksbi54ZGltJXRoaXMuX2hvc3RYU3RyaWRlLG4ubmlkKSkuYXR0cigieSIsbj0+dGhpcy5nZXRDaGlwWUxvYyhNYXRoLmZsb29yKG4ueWRpbS8yKSxuLnlkaW0lMikpLmF0dHIoInJ4IiwyKS5hdHRyKCJyeSIsNCkuYXR0cigiY2xhc3MiLCJub2RlIGJvcmRlcmVkIikuYXR0cigid2lkdGgiLHRoaXMuX25vZGVHcmlkV2lkdGgpLmF0dHIoImhlaWdodCIsCnRoaXMuX25vZGVHcmlkSGVpZ2h0KS5hdHRyKCJib3JkZXIiLDEpLnN0eWxlKCJzdHJva2UiLCJibGFjayIpLnN0eWxlKCJzdHJva2Utd2lkdGgiLDEpLnN0eWxlKCJmaWxsIixuPT5nKG4udmFsdWVzW2tdL24udG90YWwpKS5vbigibW91c2VvdmVyIixmdW5jdGlvbihuKXtkMy5zZWxlY3QodGhpcykuY2xhc3NlZCgiY2VsbC1ob3ZlciIsITApLnN0eWxlKCJvcGFjaXR5IiwuNSk7dmFyIHA9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCBxPWwuJC5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscj1wLngrcC53aWR0aCs1LXEueDtwPXAueS1xLnk7ZDMuc2VsZWN0KGwuJC50b29sdGlwKS5zdHlsZSgibGVmdCIscisicHgiKS5zdHlsZSgidG9wIixwKyJweCIpLnNlbGVjdCgiI3ZhbHVlIikudGV4dChsLl9nZXRUb29sVGlwVGV4dChuKSk7ZDMuc2VsZWN0KGwuJC50b29sdGlwKS5jbGFzc2VkKCJoaWRkZW4iLCExKX0pLm9uKCJtb3VzZW91dCIsZnVuY3Rpb24oKXtkMy5zZWxlY3QodGhpcykuY2xhc3NlZCgiY2VsbC1ob3ZlciIsCiExKS5zdHlsZSgib3BhY2l0eSIsMSk7ZDMuc2VsZWN0KGwuJC50b29sdGlwKS5jbGFzc2VkKCJoaWRkZW4iLCEwKX0pLnRyYW5zaXRpb24oKS5kdXJhdGlvbigxRTMpO2QuZXhpdCgpLnJlbW92ZSgpfSxkcmF3TGlua3M6ZnVuY3Rpb24oZCxmKXtmJiZmLmxlbmd0aCYmZCYmKGQ9ZC5zZWxlY3QoIi5saW5rIikuc2VsZWN0QWxsKCJwYXRoIikuZGF0YShmKSxkLmVudGVyKCkuYXBwZW5kKCJzdmc6cGF0aCIpLm1lcmdlKGQpLmF0dHIoInN0cm9rZS13aWR0aCIsMikuYXR0cigic3Ryb2tlIiwicmVkIikuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJtYXJrZXItZW5kIiwidXJsKCNhcnJvdykiKS5hdHRyKCJkIixnPT50aGlzLmxpbmtUb1BhdGgoZ1swXSxnWzFdKSksZC5leGl0KCkucmVtb3ZlKCkpfSxjb3JlSWRUb1BvczpmdW5jdGlvbihkKXt2YXIgZj1NYXRoLmZsb29yKGQvMik7Y29uc3QgZz1mJXRoaXMuX3hEaW1lbnNpb247Zj1NYXRoLmZsb29yKGYvdGhpcy5feERpbWVuc2lvbik7CnJldHVybnt4OjcuNSt0aGlzLmdldE5vZGVYTG9jKE1hdGguZmxvb3IoZy90aGlzLl9ob3N0WFN0cmlkZSksZyV0aGlzLl9ob3N0WFN0cmlkZSxkJjEpLHk6dGhpcy5nZXRDaGlwWUxvYyhNYXRoLmZsb29yKGYvMiksZiUyKSsxNX19LGxpbmtUb1BhdGg6ZnVuY3Rpb24oZCxmKXtkPXRoaXMuY29yZUlkVG9Qb3MoZD9kOjApO2Y9dGhpcy5jb3JlSWRUb1BvcyhmP2Y6MCk7cmV0dXJuIk0gIitkLngrIiAiK2QueSsiTCAiK2YueCsiICIrZi55fSxfZ2V0VG9vbFRpcFRleHQ6ZnVuY3Rpb24oZCl7Y29uc3QgZj0wPD10aGlzLnNlbGVjdGVkTWV0cmljSWR4P3RoaXMubWV0cmljc1t0aGlzLnNlbGVjdGVkTWV0cmljSWR4XS5sYWJlbDoiIixnPTA8PXRoaXMuc2VsZWN0ZWRNZXRyaWNJZHg/ZC52YWx1ZXNbdGhpcy5zZWxlY3RlZE1ldHJpY0lkeF06MCxsPW5ldyBJbnRsLk51bWJlckZvcm1hdChuYXZpZ2F0b3IubGFuZ3VhZ2Use3N0eWxlOiJwZXJjZW50IixtaW5pbXVtRnJhY3Rpb25EaWdpdHM6Mn0pOwpyZXR1cm5gcG9zOiAoJHtkLnlkaW19LCAke2QueGRpbX0pLAogICAgICAgIGhvc3Q6ICR7ZC5ob3N0fSwKICAgICAgICBjaGlwIGlkOiAke2QuY2lkfSwKICAgICAgICBjb3JlIGlkOiAke2QubmlkfSwKICAgICAgICByZXBsaWNhIGlkOiAke2QucmlkfQogICAgICAgICR7Zj9gJHtmfSBzcGVuZHMgJHtnLnRvRml4ZWQoMil9XHUwMGI1cyBpbiB0b3RhbCwKICAgICAgICAgICAgdGFraW5nICR7bC5mb3JtYXQoZy9kLnRvdGFsKX0gb2YgYSBzdGVwLmA6IiJ9YH0sZHJhd0xlZ2VuZDpmdW5jdGlvbihkLGYsZyl7ZD1kLnNlbGVjdEFsbCgiLmxlZ2VuZCIpLmRhdGEoWzBdLmNvbmNhdChnLnF1YW50aWxlcygpKSxsPT5sKTtkLmV4aXQoKS5yZW1vdmUoKTtnPWQuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxlZ2VuZCIpO2cuYXBwZW5kKCJyZWN0IikuYXR0cigid2lkdGgiLDYwKS5hdHRyKCJoZWlnaHQiLDMwKS5tZXJnZShkLnNlbGVjdCgicmVjdCIpKS5hdHRyKCJ4IiwobCxrKT0+NjAqaykuYXR0cigieSIsZikuc3R5bGUoImZpbGwiLChsLGspPT5hW2tdKTtnLmFwcGVuZCgidGV4dCIpLm1lcmdlKGQuc2VsZWN0KCJ0ZXh0IikpLnRleHQobD0+Ilx1MjI2NSAwLiIrTWF0aC5yb3VuZCgxMCpsKSkuYXR0cigieCIsKGwsayk9PjYwKmspLmF0dHIoInkiLGYrNjApfSxkcmF3VG9wb2xvZ3k6ZnVuY3Rpb24oZCxmKXtkJiZmJiZ0aGlzLmlzQXR0YWNoZWQmJgp0aGlzLnRvcG9sb2d5R3JhcGgoZCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5kcmF3VG9wb2xvZ3kodGhpcy5fdG9wb0RhdGEsdGhpcy5ydW5FbnZpcm9ubWVudCl9LF9zZWxlY3RlZE1ldHJpY0lkeENoYW5nZWQ6ZnVuY3Rpb24oZCl7MD5kfHxkMy5zZWxlY3QodGhpcy4kLnRwZ3JhcGgpLnNlbGVjdEFsbCgiLm5vZGUiKS5zdHlsZSgiZmlsbCIsZj0+YyhmLnZhbHVlc1tkXS9mLnRvdGFsKSl9LF9hY3RpdmVCYXJDaGFuZ2VkOmZ1bmN0aW9uKGQpe3ZhciBmPWQzLnNjYWxlT3JkaW5hbChkMy5zY2hlbWVDYXRlZ29yeTEwKS5kb21haW4oZDMucmFuZ2UoMCwxOSkpO2lmKGQpaWYoZC5yZXBsaWNhR3JvdXBzJiYwPGQucmVwbGljYUdyb3Vwcy5sZW5ndGgpe2ZvcihsZXQgZz0wO2c8ZC5yZXBsaWNhR3JvdXBzLmxlbmd0aDtnKyspe2NvbnN0IGw9ZC5yZXBsaWNhR3JvdXBzW2ddLnJlcGxpY2FJZHM7Zm9yKGxldCBrPTA7azxsLmxlbmd0aDtrKyspZDMuc2VsZWN0KHRoaXMuJC50cGdyYXBoKS5zZWxlY3RBbGwoIiNyaWQiKwpsW2tdKS5zdHlsZSgiZmlsbCIsZihnJTIwKSl9dGhpcy5zZWxlY3RlZE1ldHJpY0lkeD0tMX1lbHNlIGQuc3JjQ29yZUlkcyYmKGY9ZC5zcmNDb3JlSWRzLm1hcCgoZyxsKT0+W2csZC5kc3RDb3JlSWRzW2xdXSksdGhpcy5kcmF3TGlua3ModGhpcy5fZ1NWRyxmKSl9LF9nZXRTZWxlY3RlZE1ldHJpY0xhYmVsOmZ1bmN0aW9uKGQsZil7cmV0dXJuIDA+Znx8IWR8fGY+ZC5sZW5ndGg/IlBsZWFzZSBzZWxlY3QgYSBtZXRyaWMiOiJDb2xvcjogIitkW2ZdLmxhYmVsfX0pfSkoQ3B8fChDcD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BvZC12aWV3ZXIvcG9kLXZpZXdlci1kYXNoYm9hcmQuanMKdmFyIERwOwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoicG9kLXZpZXdlci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e2RhdGE6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfZGF0YUNoYW5nZWQifSxhY3RpdmVEZXRhaWxzOnt0eXBlOkFycmF5LG5vdGlmeTohMH0sYWN0aXZlQmFyOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9hY3RpdmVCYXJDaGFuZ2VkIn0sY3VyU3RlcElkOnt0eXBlOk51bWJlcix2YWx1ZTowfSxfcG9kU3RhdHNNYXBzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2NvbXB1dGVQb2RTdGF0c01hcHMoZGF0YSkifSxfbWF4U3RlcElkOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVNYXhTdGVwSWQoX3BvZFN0YXRzTWFwcykifSxfZXJyb3JNZXNzYWdlOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVFcnJvck1lc3NhZ2UoX21heFN0ZXBJZCkifSxfcnVuRW52aXJvbm1lbnQ6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkVudmlyb25tZW50KGRhdGEpIn0sX3N0ZXBCcmVha2Rvd25MYXllcnM6e3R5cGU6T2JqZWN0LAp2YWx1ZTooKT0+W3trZXk6ImhpZ2hGbG9wc0NvbXB1dGVVcyIsbGFiZWw6IkhpZ2ggZmxvcHMgY29tcHV0ZSJ9LHtrZXk6Imxvd0Zsb3BzQ29tcHV0ZVVzIixsYWJlbDoiTG93IGZsb3BzIGNvbXB1dGUifSx7a2V5OiJob3N0SW5mZWVkRHVyYXRpb25VcyIsbGFiZWw6IkluZmVlZCJ9LHtrZXk6Imhvc3RPdXRmZWVkRHVyYXRpb25VcyIsbGFiZWw6Ik91dGZlZWQifSx7a2V5OiJhbGxSZWR1Y2VDb21wdXRlRHVyYXRpb25VcyIsbGFiZWw6IkFsbFJlZHVjZSBjb21wdXRlIn0se2tleToiYWxsUmVkdWNlU3luY0R1cmF0aW9uVXMiLGxhYmVsOiJBbGxSZWR1Y2Ugc3luYyJ9LHtrZXk6InNlbmREdXJhdGlvblVzIixsYWJlbDoiU2VuZCJ9LHtrZXk6InJlY3ZEdXJhdGlvblVzIixsYWJlbDoiUmVjdiJ9XX0sX3BvZFN0YXRzTWFwOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2NvbXB1dGVQb2RTdGF0c01hcChfcG9kU3RhdHNNYXBzLCBjdXJTdGVwSWQsIF9zdGVwQnJlYWtkb3duTGF5ZXJzKSJ9LApfc3RlcFN0YXRzOnt0eXBlOkFycmF5LHZhbHVlOm51bGwsY29tcHV0ZWQ6Il9jb21wdXRlU3RlcFN0YXRzKF9wb2RTdGF0c01hcCkifSxfY2hhbm5lbERiOnt0eXBlOkFycmF5LHZhbHVlOm51bGwsY29tcHV0ZWQ6Il9jb21wdXRlQ2hhbm5lbERiKF9wb2RTdGF0c01hcCkifSxfYWxsUmVkdWNlRGI6e3R5cGU6QXJyYXksdmFsdWU6bnVsbCxjb21wdXRlZDoiX2NvbXB1dGVBbGxSZWR1Y2VEYihfcG9kU3RhdHNNYXApIn0sX2NoYW5uZWxMYXllcnM6e3R5cGU6QXJyYXksdmFsdWU6KCk9Plt7a2V5OiJkdXJhdGlvblVzIixsYWJlbDoiRHVyYXRpb24gKHMpIn1dfSxfYWxsUmVkdWNlTGF5ZXJzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5be2tleToiZHVyYXRpb25VcyIsbGFiZWw6IkR1cmF0aW9uIChcdTAwYjVzKSJ9XX0sX3N0ZXBCcmVha2Rvd25GdW5jOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+YT0+YCgke2EuY2hpcElkfSwgJHthLm5vZGVJZH0pYH0sX2NoYW5uZWxGdW5jOnt0eXBlOk9iamVjdCwKdmFsdWU6KCk9PmE9PmEuY2hhbm5lbElkfSxfYWxsUmVkdWNlRnVuYzp7dHlwZTpPYmplY3QsdmFsdWU6KCk9PmZ1bmN0aW9uKGEpe2lmKGEubmFtZSlyZXR1cm4gYT1hLm5hbWUucmVwbGFjZSgvbGwtcmVkdWNlLnx1c2lvbi58bGwtcmVkdWNlfHVzaW9uLywiIiksMTxhLmxlbmd0aD9hOmErIjAifX19LF9jb21wdXRlUG9kU3RhdHNNYXBzKGEpe3JldHVybiBhP2EucG9kU3RhdHNTZXF1ZW5jZS5wb2RTdGF0c01hcDpbXX0sX2NvbXB1dGVSdW5FbnZpcm9ubWVudChhKXtpZihhKXJldHVybiBhLnJ1bkVudmlyb25tZW50fSxfY29tcHV0ZU1heFN0ZXBJZChhKXtyZXR1cm4gYS5sZW5ndGgtMX0sX2NvbXB1dGVFcnJvck1lc3NhZ2UoYSl7cmV0dXJuIDA8PWE/IiI6IldBUk5JTkc6IE5vIHN0ZXAgdGltZSBtZWFzdXJlZC4gVGhpcyBtaWdodCBoYXBwZW4gaWYgeW91ciBwcm9maWxlIGR1cmF0aW9uIGlzIHRvbyBzaG9ydCwgdHJ5IGluY3JlYXNlIHByb2ZpbGUgZHVyYXRpb24gdG8gY292ZXIgYSBmdWxsIHN0ZXAuIElmIHlvdSBoYXZlIGFuIGluZmVyZW5jZSBqb2Igb3Igbm90IHVzZSBUcHVFc3RpbWF0b3IsIHBsZWFzZSBza2lwIHRoaXMgdG9vbC4ifSwKX3BvcHVsYXRlTG93RmxvcHNDb21wdXRlKGEsYyl7aWYoYSYmYyl7dmFyIGQ9YS5wb2RTdGF0c1BlckNvcmU7Zm9yKGxldCBmIGluIGQpe2xldCBnPWRbZl07aWYoZy5oYXNPd25Qcm9wZXJ0eSgibG93RmxvcHNDb21wdXRlVXMiKSlicmVhaztnLmxvd0Zsb3BzQ29tcHV0ZVVzPWcudG90YWxEdXJhdGlvblVzO2ZvcihsZXQgbD0wO2w8Yy5sZW5ndGg7bCsrKTEhPWwmJihnW2NbbF0ua2V5XXx8KGdbY1tsXS5rZXldPTApLGcubG93RmxvcHNDb21wdXRlVXMtPWdbY1tsXS5rZXldKX1yZXR1cm4gYX19LF9jb21wdXRlUG9kU3RhdHNNYXAoYSxjLGQpe2lmKCEoIWF8fDA+Y3x8Yz49YS5sZW5ndGgpJiZkKXJldHVybiB0aGlzLl9wb3B1bGF0ZUxvd0Zsb3BzQ29tcHV0ZShhW2NdLGQpfSxfY29tcHV0ZVN0ZXBTdGF0cyhhKXtpZihhJiZhLnBvZFN0YXRzUGVyQ29yZSl7dmFyIGM9YS5wb2RTdGF0c1BlckNvcmU7cmV0dXJuIE9iamVjdC5rZXlzKGMpLm1hcChkPT5jW2RdKS5zb3J0KChkLGYpPT4KZC5jaGlwSWQtZi5jaGlwSWQpfX0sX2NvbXB1dGVDaGFubmVsRGIoYSl7aWYoYSYmYS5jaGFubmVsRGImJiEoMD49YS5jaGFubmVsRGIubGVuZ3RoKSlyZXR1cm4gYS5jaGFubmVsRGIuc2xpY2UoKS5zb3J0KChjLGQpPT5kLmR1cmF0aW9uVXMtYy5kdXJhdGlvblVzKX0sX2NvbXB1dGVBbGxSZWR1Y2VEYihhKXtpZihhJiZhLmFsbFJlZHVjZU9wRGImJiEoMD49YS5hbGxSZWR1Y2VPcERiLmxlbmd0aCkpcmV0dXJuIGEuYWxsUmVkdWNlT3BEYi5zbGljZSgpLnNvcnQoKGMsZCk9PmQuZHVyYXRpb25Vcy1jLmR1cmF0aW9uVXMpfSxfZGF0YUNoYW5nZWQoYSl7YSYmKHRoaXMuY3VyU3RlcElkPTApfSxfYWN0aXZlQmFyQ2hhbmdlZChhKXthJiYodGhpcy5hY3RpdmVEZXRhaWxzPVthXSl9LF9nZXRTdGVwTnVtKGEpe3JldHVybiBhP2Euc3RlcE51bTowfX0pfSkoRHB8fChEcD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tYWpheC9pcm9uLXJlcXVlc3QuaHRtbC5qcwpQb2x5bWVyKHtpczoiaXJvbi1yZXF1ZXN0Iixob3N0QXR0cmlidXRlczp7aGlkZGVuOiEwfSxwcm9wZXJ0aWVzOnt4aHI6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxyZWFkT25seTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgWE1MSHR0cFJlcXVlc3R9fSxyZXNwb25zZTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9fSxzdGF0dXM6e3R5cGU6TnVtYmVyLG5vdGlmeTohMCxyZWFkT25seTohMCx2YWx1ZTowfSxzdGF0dXNUZXh0Ont0eXBlOlN0cmluZyxub3RpZnk6ITAscmVhZE9ubHk6ITAsdmFsdWU6IiJ9LGNvbXBsZXRlczp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYyl7dGhpcy5yZXNvbHZlQ29tcGxldGVzPWE7dGhpcy5yZWplY3RDb21wbGV0ZXM9Y30uYmluZCh0aGlzKSl9fSxwcm9ncmVzczp7dHlwZTpPYmplY3QsCm5vdGlmeTohMCxyZWFkT25seTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX0sYWJvcnRlZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCxyZWFkT25seTohMCx2YWx1ZTohMX0sZXJyb3JlZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCxyZWFkT25seTohMCx2YWx1ZTohMX0sdGltZWRPdXQ6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAscmVhZE9ubHk6ITAsdmFsdWU6ITF9fSxnZXQgc3VjY2VlZGVkKCl7aWYodGhpcy5lcnJvcmVkfHx0aGlzLmFib3J0ZWR8fHRoaXMudGltZWRPdXQpcmV0dXJuITE7dmFyIGE9dGhpcy54aHIuc3RhdHVzfHwwO3JldHVybiAwPT09YXx8MjAwPD1hJiYzMDA+YX0sc2VuZDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnhocjtpZigwPGMucmVhZHlTdGF0ZSlyZXR1cm4gbnVsbDtjLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixmdW5jdGlvbihuKXt0aGlzLl9zZXRQcm9ncmVzcyh7bGVuZ3RoQ29tcHV0YWJsZTpuLmxlbmd0aENvbXB1dGFibGUsbG9hZGVkOm4ubG9hZGVkLAp0b3RhbDpuLnRvdGFsfSk7dGhpcy5maXJlKCJpcm9uLXJlcXVlc3QtcHJvZ3Jlc3MtY2hhbmdlZCIse3ZhbHVlOnRoaXMucHJvZ3Jlc3N9KX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24obil7dGhpcy5fc2V0RXJyb3JlZCghMCk7dGhpcy5fdXBkYXRlU3RhdHVzKCk7dGhpcy5yZWplY3RDb21wbGV0ZXMoYS5yZWplY3RXaXRoUmVxdWVzdD97ZXJyb3I6bixyZXF1ZXN0OnRoaXN9Om4pfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoInRpbWVvdXQiLGZ1bmN0aW9uKG4pe3RoaXMuX3NldFRpbWVkT3V0KCEwKTt0aGlzLl91cGRhdGVTdGF0dXMoKTt0aGlzLnJlamVjdENvbXBsZXRlcyhhLnJlamVjdFdpdGhSZXF1ZXN0P3tlcnJvcjpuLHJlcXVlc3Q6dGhpc306bil9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLGZ1bmN0aW9uKCl7dGhpcy5fc2V0QWJvcnRlZCghMCk7dGhpcy5fdXBkYXRlU3RhdHVzKCk7dmFyIG49CkVycm9yKCJSZXF1ZXN0IGFib3J0ZWQuIik7dGhpcy5yZWplY3RDb21wbGV0ZXMoYS5yZWplY3RXaXRoUmVxdWVzdD97ZXJyb3I6bixyZXF1ZXN0OnRoaXN9Om4pfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlbmQiLGZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlU3RhdHVzKCk7dGhpcy5fc2V0UmVzcG9uc2UodGhpcy5wYXJzZVJlc3BvbnNlKCkpO2lmKHRoaXMuc3VjY2VlZGVkKXRoaXMucmVzb2x2ZUNvbXBsZXRlcyh0aGlzKTtlbHNle3ZhciBuPUVycm9yKCJUaGUgcmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZTogIit0aGlzLnhoci5zdGF0dXMpO3RoaXMucmVqZWN0Q29tcGxldGVzKGEucmVqZWN0V2l0aFJlcXVlc3Q/e2Vycm9yOm4scmVxdWVzdDp0aGlzfTpuKX19LmJpbmQodGhpcykpO3RoaXMudXJsPWEudXJsO3ZhciBkPSExIT09YS5hc3luYztjLm9wZW4oYS5tZXRob2R8fCJHRVQiLGEudXJsLGQpO3ZhciBmPXtqc29uOiJhcHBsaWNhdGlvbi9qc29uIiwKdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCIsYXJyYXlidWZmZXI6ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSJ9W2EuaGFuZGxlQXNdLGc9YS5oZWFkZXJzfHxPYmplY3QuY3JlYXRlKG51bGwpLGw9T2JqZWN0LmNyZWF0ZShudWxsKSxrO2ZvcihrIGluIGcpbFtrLnRvTG93ZXJDYXNlKCldPWdba107Zz1sO2YmJiFnLmFjY2VwdCYmKGcuYWNjZXB0PWYpO09iamVjdC5rZXlzKGcpLmZvckVhY2goZnVuY3Rpb24obil7L1tBLVpdLy50ZXN0KG4pJiZQb2x5bWVyLkJhc2UuX2Vycm9yKCJIZWFkZXJzIG11c3QgYmUgbG93ZXIgY2FzZSwgZ290IixuKTtjLnNldFJlcXVlc3RIZWFkZXIobixnW25dKX0sdGhpcyk7aWYoZCl7Yy50aW1lb3V0PWEudGltZW91dDtkPWEuaGFuZGxlQXM7aWYoYS5qc29uUHJlZml4fHwhZClkPSJ0ZXh0IjtjLnJlc3BvbnNlVHlwZT1jLl9yZXNwb25zZVR5cGU9ZDthLmpzb25QcmVmaXgmJihjLl9qc29uUHJlZml4PQphLmpzb25QcmVmaXgpfWMud2l0aENyZWRlbnRpYWxzPSEhYS53aXRoQ3JlZGVudGlhbHM7ZD10aGlzLl9lbmNvZGVCb2R5T2JqZWN0KGEuYm9keSxnWyJjb250ZW50LXR5cGUiXSk7Yy5zZW5kKGQpO3JldHVybiB0aGlzLmNvbXBsZXRlc30scGFyc2VSZXNwb25zZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMueGhyLGM9YS5yZXNwb25zZVR5cGV8fGEuX3Jlc3BvbnNlVHlwZSxkPSF0aGlzLnhoci5yZXNwb25zZVR5cGUsZj1hLl9qc29uUHJlZml4JiZhLl9qc29uUHJlZml4Lmxlbmd0aHx8MDt0cnl7c3dpdGNoKGMpe2Nhc2UgImpzb24iOmlmKGR8fHZvaWQgMD09PWEucmVzcG9uc2UpdHJ5e3JldHVybiBKU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtyZXR1cm4gY29uc29sZS53YXJuKCJGYWlsZWQgdG8gcGFyc2UgSlNPTiBzZW50IGZyb20gIithLnJlc3BvbnNlVVJMKSxudWxsfXJldHVybiBhLnJlc3BvbnNlO2Nhc2UgInhtbCI6cmV0dXJuIGEucmVzcG9uc2VYTUw7Y2FzZSAiYmxvYiI6Y2FzZSAiZG9jdW1lbnQiOmNhc2UgImFycmF5YnVmZmVyIjpyZXR1cm4gYS5yZXNwb25zZTsKZGVmYXVsdDppZihmKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dC5zdWJzdHJpbmcoZikpfWNhdGNoKGcpe3JldHVybiBjb25zb2xlLndhcm4oIkZhaWxlZCB0byBwYXJzZSBKU09OIHNlbnQgZnJvbSAiK2EucmVzcG9uc2VVUkwpLG51bGx9cmV0dXJuIGEucmVzcG9uc2VUZXh0fX1jYXRjaChnKXt0aGlzLnJlamVjdENvbXBsZXRlcyhFcnJvcigiQ291bGQgbm90IHBhcnNlIHJlc3BvbnNlLiAiK2cubWVzc2FnZSkpfX0sYWJvcnQ6ZnVuY3Rpb24oKXt0aGlzLl9zZXRBYm9ydGVkKCEwKTt0aGlzLnhoci5hYm9ydCgpfSxfZW5jb2RlQm9keU9iamVjdDpmdW5jdGlvbihhLGMpe2lmKCJzdHJpbmciPT10eXBlb2YgYSlyZXR1cm4gYTtzd2l0Y2goYyl7Y2FzZSAiYXBwbGljYXRpb24vanNvbiI6cmV0dXJuIEpTT04uc3RyaW5naWZ5KGEpO2Nhc2UgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCI6cmV0dXJuIHRoaXMuX3d3d0Zvcm1VcmxFbmNvZGUoYSl9cmV0dXJuIGF9LApfd3d3Rm9ybVVybEVuY29kZTpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4iIjt2YXIgYz1bXTtPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2MucHVzaCh0aGlzLl93d3dGb3JtVXJsRW5jb2RlUGllY2UoZCkrIlx4M2QiK3RoaXMuX3d3d0Zvcm1VcmxFbmNvZGVQaWVjZShhW2RdKSl9LHRoaXMpO3JldHVybiBjLmpvaW4oIlx4MjYiKX0sX3d3d0Zvcm1VcmxFbmNvZGVQaWVjZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9PWEmJnZvaWQgMCE9PWEmJmEudG9TdHJpbmc/ZW5jb2RlVVJJQ29tcG9uZW50KGEudG9TdHJpbmcoKS5yZXBsYWNlKC9ccj9cbi9nLCJcclxuIikpLnJlcGxhY2UoLyUyMC9nLCIrIik6IiJ9LF91cGRhdGVTdGF0dXM6ZnVuY3Rpb24oKXt0aGlzLl9zZXRTdGF0dXModGhpcy54aHIuc3RhdHVzKTt0aGlzLl9zZXRTdGF0dXNUZXh0KHZvaWQgMD09PXRoaXMueGhyLnN0YXR1c1RleHQ/IiI6dGhpcy54aHIuc3RhdHVzVGV4dCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZ29vZ2xlLWNoYXJ0L2dvb2dsZS1jaGFydC1sb2FkZXIuaHRtbC5qcwooZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGspe3JldHVybiBnb29nbGVbMD09PWsuaW5kZXhPZigibWQtIik/Yy5DSEFSVFM6Yy5WSVNdfXZhciBjPXtDSEFSVFM6ImNoYXJ0cyIsVklTOiJ2aXN1YWxpemF0aW9uIn0sZD17YXJlYTp7Y3RvcjoiQXJlYUNoYXJ0In0sYmFyOntjdG9yOiJCYXJDaGFydCJ9LCJtZC1iYXIiOntjdG9yOiJCYXIiLHBrZzoiYmFyIn0sYnViYmxlOntjdG9yOiJCdWJibGVDaGFydCJ9LGNhbGVuZGFyOntjdG9yOiJDYWxlbmRhciIscGtnOiJjYWxlbmRhciJ9LGNhbmRsZXN0aWNrOntjdG9yOiJDYW5kbGVzdGlja0NoYXJ0In0sY29sdW1uOntjdG9yOiJDb2x1bW5DaGFydCJ9LGNvbWJvOntjdG9yOiJDb21ib0NoYXJ0In0sZ2F1Z2U6e2N0b3I6IkdhdWdlIixwa2c6ImdhdWdlIn0sZ2VvOntjdG9yOiJHZW9DaGFydCJ9LGhpc3RvZ3JhbTp7Y3RvcjoiSGlzdG9ncmFtIn0sbGluZTp7Y3RvcjoiTGluZUNoYXJ0In0sIm1kLWxpbmUiOntjdG9yOiJMaW5lIixwa2c6ImxpbmUifSwKb3JnOntjdG9yOiJPcmdDaGFydCIscGtnOiJvcmdjaGFydCJ9LHBpZTp7Y3RvcjoiUGllQ2hhcnQifSxzYW5rZXk6e2N0b3I6IlNhbmtleSIscGtnOiJzYW5rZXkifSxzY2F0dGVyOntjdG9yOiJTY2F0dGVyQ2hhcnQifSwibWQtc2NhdHRlciI6e2N0b3I6IlNjYXR0ZXIiLHBrZzoic2NhdHRlciJ9LCJzdGVwcGVkLWFyZWEiOntjdG9yOiJTdGVwcGVkQXJlYUNoYXJ0In0sdGFibGU6e2N0b3I6IlRhYmxlIixwa2c6InRhYmxlIn0sdGltZWxpbmU6e2N0b3I6IlRpbWVsaW5lIixwa2c6InRpbWVsaW5lIn0sdHJlZW1hcDp7Y3RvcjoiVHJlZU1hcCIscGtnOiJ0cmVlbWFwIn0sd29yZHRyZWU6e2N0b3I6IldvcmRUcmVlIixuYW1lc3BhY2U6Yy5WSVMscGtnOiJ3b3JkdHJlZSJ9fSxmPXt9LGc9e30sbD17fTtQb2x5bWVyKHtpczoiZ29vZ2xlLWNoYXJ0LWxvYWRlciIscHJvcGVydGllczp7cGFja2FnZXM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX0sb2JzZXJ2ZXI6Il9sb2FkUGFja2FnZXMifSwKdHlwZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9sb2FkUGFja2FnZUZvclR5cGUifX0sZ2V0IF9jb3JlUGFja2FnZSgpe3JldHVybiBnLmNvcmVjaGFydD9nLmNvcmVjaGFydDp0aGlzLl9sb2FkUGFja2FnZXMoWyJjb3JlY2hhcnQiXSkudGhlbihmdW5jdGlvbihrKXtyZXR1cm4ga1swXX0pfSxfbG9hZFBhY2thZ2VzRGVib3VuY2U6ZnVuY3Rpb24oKXt0aGlzLmRlYm91bmNlKCJsb2FkUGFja2FnZXMiLGZ1bmN0aW9uKCl7dmFyIGs9T2JqZWN0LmtleXMoZik7ay5sZW5ndGgmJihmPXt9LGdvb2dsZS5jaGFydHMubG9hZCgiY3VycmVudCIse3BhY2thZ2VzOmssbGFuZ3VhZ2U6ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lmxhbmd8fCJlbiJ9KSxnb29nbGUuY2hhcnRzLnNldE9uTG9hZENhbGxiYWNrKGZ1bmN0aW9uKCl7ay5mb3JFYWNoKGZ1bmN0aW9uKG4pe3RoaXMuZmlyZSgibG9hZGVkIixuKTtsW25dKGdvb2dsZS52aXN1YWxpemF0aW9uKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sCjEwMCl9LF9sb2FkUGFja2FnZXM6ZnVuY3Rpb24oayl7dmFyIG49W107ay5mb3JFYWNoKGZ1bmN0aW9uKHApe2dbcF18fChmW3BdPSEwLGdbcF09bmV3IFByb21pc2UoZnVuY3Rpb24ocSl7bFtwXT1xfSksdGhpcy5fbG9hZFBhY2thZ2VzRGVib3VuY2UoKSk7bi5wdXNoKGdbcF0pfS5iaW5kKHRoaXMpKTtyZXR1cm4gUHJvbWlzZS5hbGwobil9LF9sb2FkUGFja2FnZUZvclR5cGU6ZnVuY3Rpb24oayl7dmFyIG49ZFtrXTtyZXR1cm4gbj90aGlzLl9sb2FkUGFja2FnZXMoW24ucGtnfHwiY29yZWNoYXJ0Il0pLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4oZ29vZ2xlW24ubmFtZXNwYWNlXXx8YShrKSlbbi5jdG9yXX0pOlByb21pc2UucmVqZWN0KCJUaGlzIGNoYXJ0IHR5cGUgaXMgbm90IHlldCBzdXBwb3J0ZWQ6ICIrayl9LGNyZWF0ZTpmdW5jdGlvbihrLG4pe3JldHVybiB0aGlzLl9sb2FkUGFja2FnZUZvclR5cGUoaykudGhlbihmdW5jdGlvbihwKXtyZXR1cm4gbmV3IHAobil9KX0sZmlyZU9uQ2hhcnRFdmVudDpmdW5jdGlvbihrLApuLHApe3JldHVybiB0aGlzLl9jb3JlUGFja2FnZS50aGVuKGZ1bmN0aW9uKHEpeyhwP3EuZXZlbnRzLmFkZE9uZVRpbWVMaXN0ZW5lcjpxLmV2ZW50cy5hZGRMaXN0ZW5lcikoayxuLGZ1bmN0aW9uKHIpe3RoaXMuZmlyZSgiZ29vZ2xlLWNoYXJ0LSIrbix7Y2hhcnQ6ayxkYXRhOnJ9KX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfSxkYXRhVGFibGU6ZnVuY3Rpb24oayl7cmV0dXJuIHRoaXMuX2NvcmVQYWNrYWdlLnRoZW4oZnVuY3Rpb24obil7cmV0dXJuIG51bGw9PWs/bmV3IG4uRGF0YVRhYmxlOmsuZ2V0TnVtYmVyT2ZSb3dzP2s6ay5jb2xzP25ldyBuLkRhdGFUYWJsZShrKTowPGsubGVuZ3RoP24uYXJyYXlUb0RhdGFUYWJsZShrKTowPT09ay5sZW5ndGg/UHJvbWlzZS5yZWplY3QoIkRhdGEgd2FzIGVtcHR5LiIpOlByb21pc2UucmVqZWN0KCJEYXRhIGZvcm1hdCB3YXMgbm90IHJlY29nbml6ZWQuIil9KX0sZGF0YVZpZXc6ZnVuY3Rpb24oayl7cmV0dXJuIHRoaXMuX2NvcmVQYWNrYWdlLnRoZW4oZnVuY3Rpb24obil7cmV0dXJuIG5ldyBuLkRhdGFWaWV3KGspfSl9LApxdWVyeTpmdW5jdGlvbihrLG4pe3JldHVybiB0aGlzLl9jb3JlUGFja2FnZS50aGVuKGZ1bmN0aW9uKHApe3JldHVybiBuZXcgcC5RdWVyeShrLG4pfSl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2dvb2dsZS1jaGFydC9nb29nbGUtY2hhcnQuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoiZ29vZ2xlLWNoYXJ0Iixwcm9wZXJ0aWVzOnt0eXBlOnt0eXBlOlN0cmluZyx2YWx1ZToiY29sdW1uIixvYnNlcnZlcjoiX3R5cGVDaGFuZ2VkIn0sZXZlbnRzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxvcHRpb25zOnt0eXBlOk9iamVjdH0sY29sczp7dHlwZTpBcnJheSxvYnNlcnZlcjoiX3Jvd3NPckNvbHVtbnNDaGFuZ2VkIn0scm93czp7dHlwZTpBcnJheSxvYnNlcnZlcjoiX3Jvd3NPckNvbHVtbnNDaGFuZ2VkIn0sZGF0YTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9kYXRhQ2hhbmdlZCJ9LHZpZXc6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfdmlld0NoYW5nZWQifSxzZWxlY3Rpb246e3R5cGU6QXJyYXksbm90aWZ5OiEwLG9ic2VydmVyOiJfc2V0U2VsZWN0aW9uIn0sZHJhd246e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMCx2YWx1ZTohMX19LG9ic2VydmVyczpbIl9kcmF3KF9jaGFydCwgX2RhdGFWaWV3KSIsCiJfc3ViT3B0aW9uQ2hhbmdlZChvcHRpb25zLiopIl0sbGlzdGVuZXJzOnsiZ29vZ2xlLWNoYXJ0LXNlbGVjdCI6Il91cGRhdGVTZWxlY3Rpb24iLCJnb29nbGUtY2hhcnQtcmVhZHkiOiJfb25DaGFydFJlYWR5In0sX2NoYXJ0Om51bGwsX2RhdGFWaWV3Om51bGwsX3NlbGVjdGlvbjpudWxsLF90eXBlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuJC5sb2FkZXIuY3JlYXRlKHRoaXMudHlwZSx0aGlzLiQuY2hhcnRkaXYpLnRoZW4oZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy4kLmxvYWRlcjtPYmplY3Qua2V5cyh0aGlzLmV2ZW50cy5jb25jYXQoWyJzZWxlY3QiLCJyZWFkeSJdKS5yZWR1Y2UoZnVuY3Rpb24oZCxmKXtkW2ZdPSEwO3JldHVybiBkfSx7fSkpLmZvckVhY2goZnVuY3Rpb24oZCl7Yy5maXJlT25DaGFydEV2ZW50KGEsZCl9KTt0aGlzLl9zZXREcmF3bighMSk7dGhpcy5fY2hhcnQ9YX0uYmluZCh0aGlzKSl9LF9zdWJPcHRpb25DaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMub3B0aW9ucz0KYS5iYXNlO3RoaXMuZGVib3VuY2UoIm9wdGlvbkNoYW5nZVJlZHJhdyIsZnVuY3Rpb24oKXt0aGlzLnJlZHJhdygpfSw1KX0sX3NldFNlbGVjdGlvbjpmdW5jdGlvbigpe3RoaXMuZHJhd24mJnRoaXMuc2VsZWN0aW9uJiZ0aGlzLnNlbGVjdGlvbiE9PXRoaXMuX3NlbGVjdGlvbiYmKHRoaXMuX2NoYXJ0LnNldFNlbGVjdGlvbiYmdGhpcy5fY2hhcnQuc2V0U2VsZWN0aW9uKHRoaXMuc2VsZWN0aW9uKSx0aGlzLl9zZWxlY3Rpb249dGhpcy5zZWxlY3Rpb24pfSxfdXBkYXRlU2VsZWN0aW9uOmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb249dGhpcy5fc2VsZWN0aW9uPXRoaXMuX2NoYXJ0LmdldFNlbGVjdGlvbigpfSxfb25DaGFydFJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fc2V0RHJhd24oITApO3RoaXMuX3NlbGVjdGlvbj1udWxsO3RoaXMuX3NldFNlbGVjdGlvbigpfSxyZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmdGhpcy5fZGF0YVZpZXcmJnRoaXMuX2RyYXcodGhpcy5fY2hhcnQsCnRoaXMuX2RhdGFWaWV3KX0sX2RyYXc6ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1hJiZudWxsIT1jKXRyeXt0aGlzLl9zZXREcmF3bighMSksYS5kcmF3KGMsdGhpcy5vcHRpb25zfHx7fSl9Y2F0Y2goZCl7dGhpcy4kLmNoYXJ0ZGl2LmlubmVySFRNTD1kfX0sZ2V0IGltYWdlVVJJKCl7cmV0dXJuIHRoaXMuX2NoYXJ0P3RoaXMuX2NoYXJ0LmdldEltYWdlVVJJKCk6bnVsbH0sX3ZpZXdDaGFuZ2VkOmZ1bmN0aW9uKGEpe2EmJih0aGlzLl9kYXRhVmlldz1hKX0sX3Jvd3NPckNvbHVtbnNDaGFuZ2VkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5yb3dzLGM9dGhpcy5jb2xzO2EmJmMmJnRoaXMuJC5sb2FkZXIuZGF0YVRhYmxlKCkudGhlbihmdW5jdGlvbihkKXtjLmZvckVhY2goZnVuY3Rpb24oZil7ZC5hZGRDb2x1bW4oZil9KTtkLmFkZFJvd3MoYSk7cmV0dXJuIGR9LmJpbmQodGhpcykpLnRoZW4odGhpcy4kLmxvYWRlci5kYXRhVmlldy5iaW5kKHRoaXMuJC5sb2FkZXIpKS50aGVuKGZ1bmN0aW9uKGQpe3RoaXMuX2RhdGFWaWV3PQpkfS5iaW5kKHRoaXMpKS5jYXRjaChmdW5jdGlvbihkKXt0aGlzLiQuY2hhcnRkaXYuaW5uZXJIVE1MPWR9LmJpbmQodGhpcykpfSxfZGF0YUNoYW5nZWQ6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9ITE7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtjPSJzdHJpbmciPT10eXBlb2YgYXx8YSBpbnN0YW5jZW9mIFN0cmluZ31hPWM/ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaXJvbi1yZXF1ZXN0Iikuc2VuZCh7dXJsOmEsaGFuZGxlQXM6Impzb24ifSkudGhlbihmdW5jdGlvbihkKXtyZXR1cm4gZC5yZXNwb25zZX0pOlByb21pc2UucmVzb2x2ZShhKTthLnRoZW4odGhpcy4kLmxvYWRlci5kYXRhVGFibGUuYmluZCh0aGlzLiQubG9hZGVyKSkudGhlbih0aGlzLiQubG9hZGVyLmRhdGFWaWV3LmJpbmQodGhpcy4kLmxvYWRlcikpLnRoZW4oZnVuY3Rpb24oZCl7dGhpcy5fZGF0YVZpZXc9ZH0uYmluZCh0aGlzKSl9fSxhdHRhY2hlZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwphLnNyYz0iaHR0cHM6Ly93d3cuZ3N0YXRpYy5jb20vY2hhcnRzL2xvYWRlci5qcyI7ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChhKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZ29vZ2xlLWNoYXJ0L2dvb2dsZS1jaGFydC1kZW1vLmh0bWwuanMKUG9seW1lcih7aXM6Imdvb2dsZS1jaGFydC1kZW1vIixwcm9wZXJ0aWVzOntfZGF0YTp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il91cGRhdGVWaWV3In19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtdGVuc29yYm9hcmQvcGx1Z2luLWRpYWxvZy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1wbHVnaW4tZGlhbG9nIixwcm9wZXJ0aWVzOntfdGl0bGU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9jdXN0b21NZXNzYWdlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfb3Blbjp7dHlwZTpCb29sZWFufSxfaGlkZGVuOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGlkZGVuKF9vcGVuKSIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfdXNlTmF0aXZlQmFja2Ryb3A6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH19LG9wZW5Ob1RlbnNvckZsb3dEaWFsb2coKXt0aGlzLm9wZW5EaWFsb2coIlRoaXMgcGx1Z2luIGlzIGRpc2FibGVkIHdpdGhvdXQgVGVuc29yRmxvdyIsJ1RvIGVuYWJsZSB0aGlzIHBsdWdpbiBpbiBUZW5zb3JCb2FyZCwgaW5zdGFsbCBUZW5zb3JGbG93IHdpdGggInBpcCBpbnN0YWxsIHRlbnNvcmZsb3ciIG9yIGVxdWl2YWxlbnQuJyl9LG9wZW5PbGRUZW5zb3JGbG93RGlhbG9nKGEpe3RoaXMub3BlbkRpYWxvZygiVGhpcyBwbHVnaW4gaXMgZGlzYWJsZWQgd2l0aG91dCBUZW5zb3JGbG93ICIrCmEsIlRvIGVuYWJsZSB0aGlzIHBsdWdpbiBpbiBUZW5zb3JCb2FyZCwgaW5zdGFsbCBUZW5zb3JGbG93ICIrYSsnIG9yIGdyZWF0ZXIgd2l0aCAicGlwIGluc3RhbGwgdGVuc29yZmxvdyIgb3IgZXF1aXZhbGVudC4nKX0sb3BlbkRpYWxvZyhhLGMpe3RoaXMuc2V0KCJfdGl0bGUiLGEpO3RoaXMuc2V0KCJfY3VzdG9tTWVzc2FnZSIsYyk7dGhpcy4kLmRpYWxvZy5vcGVuKCl9LGNsb3NlRGlhbG9nKCl7dGhpcy4kLmRpYWxvZy5jbG9zZSgpfSxfY29tcHV0ZUhpZGRlbihhKXtyZXR1cm4hYX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wcm9maWxlLWRhc2hib2FyZC90Zi1wcm9maWxlLWRhc2hib2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1wcm9maWxlLWRhc2hib2FyZCIscHJvcGVydGllczp7X3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFFvLlJlcXVlc3RNYW5hZ2VyfSxfaXNBdHRhY2hlZDpCb29sZWFuLF9pc0F2YWlsYWJsZTpCb29sZWFuLF9pbml0aWFsaXplZDpCb29sZWFuLF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfZGF0YXNldHM6e3R5cGU6QXJyYXksbm90aWZ5OiEwLG9ic2VydmVyOiJfZGF0YXNldHNDaGFuZ2VkIn0sX2FjdGl2ZVRvb2xzTGlzdDp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEFjdGl2ZVRvb2xzTGlzdChzZWxlY3RlZERhdGFzZXRJbmRleCwgX2RhdGFzZXRzKSIsb2JzZXJ2ZXI6Il9hY3RpdmVUb29sc0NoYW5nZWQifSxfYWN0aXZlSG9zdHNMaXN0Ont0eXBlOkFycmF5LG9ic2VydmVyOiJfYWN0aXZlSG9zdHNDaGFuZ2VkIn0sX3RvcExldmVsU3RhdGU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVRvcExldmVsU3RhdGUoX2RhdGFOb3RGb3VuZCwgcHJvZ3Jlc3MpIiwKcmVhZE9ubHk6ITB9LHByb2dyZXNzOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LHNlbGVjdGVkRGF0YXNldEluZGV4Ont0eXBlOk51bWJlcixub3RpZnk6ITAsdmFsdWU6MH0sc2VsZWN0ZWRUb29sSW5kZXg6e3R5cGU6TnVtYmVyLG5vdGlmeTohMCx2YWx1ZTowfSxzZWxlY3RlZEhvc3RJbmRleDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwLHZhbHVlOjB9LHRyYWNlVmlld2VyQmFzZVVybDp7dHlwZTpTdHJpbmcsdmFsdWU6InRyYWNlX3ZpZXdlcl9pbmRleC5odG1sIn0sX3Byb2ZpbGVyU2VydmljZUFkZHJlc3M6U3RyaW5nLF9wcm9maWxlclNlcnZpY2VBZGRyZXNzVHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImlwLWFkZHJlc3MifSxfcHJvZmlsZUR1cmF0aW9uOnt0eXBlOlN0cmluZyx2YWx1ZToiMTAwMCJ9LF9wcm9maWxlTnVtUmV0cnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIzIn0sX3Byb2ZpbGVXb3JrZXJMaXN0Ont0eXBlOlN0cmluZ30sX3Byb2ZpbGVJbmNsdWRlRGF0YXNldE9wczp7dHlwZTpCb29sZWFuLAp2YWx1ZTohMH0sX3RyYWNlRGF0YVVybDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9vcFByb2ZpbGVEYXRhOnt0eXBlOk9iamVjdH0sX2lucHV0UGlwZWxpbmVEYXRhOnt0eXBlOk9iamVjdH0sX292ZXJ2aWV3UGFnZURhdGE6e3R5cGU6T2JqZWN0fSxfbWVtb3J5Vmlld2VyRGF0YTp7dHlwZTpPYmplY3R9LF9wb2RWaWV3ZXJEYXRhOnt0eXBlOk9iamVjdH0sX2dvb2dsZUNoYXJ0RGVtb0RhdGE6e3R5cGU6T2JqZWN0fSxfc2VsZWN0ZWREYXRhc2V0TmFtZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLGNvbXB1dGVkOiJfZ2V0U2VsZWN0ZWREYXRhc2V0TmFtZShzZWxlY3RlZERhdGFzZXRJbmRleCwgX2RhdGFzZXRzKSJ9LF9zZWxlY3RlZFRvb2xOYW1lOnt0eXBlOlN0cmluZyxub3RpZnk6ITAsY29tcHV0ZWQ6Il9nZXRTZWxlY3RlZChzZWxlY3RlZFRvb2xJbmRleCwgX2FjdGl2ZVRvb2xzTGlzdCkifSxfc2VsZWN0ZWRIb3N0TmFtZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLGNvbXB1dGVkOiJfZ2V0U2VsZWN0ZWQoc2VsZWN0ZWRIb3N0SW5kZXgsIF9hY3RpdmVIb3N0c0xpc3QpIn0sCl90b29sSW5TY29wZTp7dHlwZTpTdHJpbmd9LF9hY3RpdmVPcERldGFpbHM6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT57fX0sX2FjdGl2ZUJ1ZmZlckRldGFpbHM6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT57fX0sX2FjdGl2ZVBvZERldGFpbHM6e3R5cGU6QXJyYXl9LF9jYXB0dXJpbmdQcm9maWxlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxyZWxvYWQ6ZnVuY3Rpb24oKXt9LHJlYWR5OmZ1bmN0aW9uKCl7fSxvYnNlcnZlcnM6WyJfbWF5YmVJbml0aWFsaXplRGFzaGJvYXJkKF9pc0F0dGFjaGVkLCBfaXNBdmFpbGFibGUpIiwiX21heWJlVXBkYXRlRGF0YShfc2VsZWN0ZWRIb3N0TmFtZSkiLCJfbWF5YmVVcGRhdGVBY3RpdmVIb3N0cyhfc2VsZWN0ZWREYXRhc2V0TmFtZSwgX3NlbGVjdGVkVG9vbE5hbWUpIl0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnNldCgiX2lzQXR0YWNoZWQiLCEwKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KFFvLmdldFJvdXRlcigpLnBsdWdpbnNMaXN0aW5nKCkpLnRoZW4oYT0+CnsicHJvZmlsZSJpbiBhPyh0aGlzLiQuaW5pdGlhbERpYWxvZy5jbG9zZURpYWxvZygpLHRoaXMuc2V0KCJfaXNBdmFpbGFibGUiLCEwKSk6KHRoaXMuJC5pbml0aWFsRGlhbG9nLm9wZW5PbGRUZW5zb3JGbG93RGlhbG9nKCIxLjE0IiksdGhpcy5zZXQoIl9pc0F2YWlsYWJsZSIsITEpKX0pfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITEpfSxfb3BlbkNhcHR1cmVQcm9maWxlRGlhbG9nOmZ1bmN0aW9uKCl7dGhpcy4kLmNhcHR1cmVQcm9maWxlRGlhbG9nLm9wZW4oKX0sX3Nob3VsZERpc2FibGVDYXB0dXJlUHJvZmlsZUJ1dHRvbjpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIWF8fCIiPT09Y3x8IiI9PT1kfSxfc2hvdWxkU2hvd1RwdU9wdGlvbnM6ZnVuY3Rpb24oYSl7cmV0dXJuInRwdS1uYW1lIj09YX0sX2NhcHR1cmVQcm9maWxlOmZ1bmN0aW9uKCl7dGhpcy5fY2FwdHVyaW5nUHJvZmlsZT0hMDtjb25zdCBhPVFvLmFkZFBhcmFtcyhRby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgicHJvZmlsZSIsCiIvY2FwdHVyZV9wcm9maWxlIikse3NlcnZpY2VfYWRkcjp0aGlzLl9wcm9maWxlclNlcnZpY2VBZGRyZXNzLnRyaW0oKSxpc190cHVfbmFtZToidHB1LW5hbWUiPT10aGlzLl9wcm9maWxlclNlcnZpY2VBZGRyZXNzVHlwZSxkdXJhdGlvbjp0aGlzLl9wcm9maWxlRHVyYXRpb24sd29ya2VyX2xpc3Q6dGhpcy5fcHJvZmlsZVdvcmtlckxpc3QsaW5jbHVkZV9kYXRhc2V0X29wczp0aGlzLl9wcm9maWxlSW5jbHVkZURhdGFzZXRPcHMsbnVtX3JldHJ5OnRoaXMuX3Byb2ZpbGVOdW1SZXRyeX0pO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihjPT57dGhpcy5fY2FwdHVyaW5nUHJvZmlsZT0hMTtudWxsIT1jLmVycm9yP3RoaXMuX3Nob3dUb2FzdCgiRmFpbGVkIHRvIGNhcHR1cmUgcHJvZmlsZTogIitjLmVycm9yKTp0aGlzLl9zaG93VG9hc3QoYy5yZXN1bHQpfSkuY2F0Y2goYz0+e3RoaXMuX2NhcHR1cmluZ1Byb2ZpbGU9ITE7dGhpcy5fc2hvd1RvYXN0KCJGYWlsZWQgdG8gY2FwdHVyZSBwcm9maWxlOiAiKwpjKX0pfSxfc2hvd1RvYXN0KGEpe3RoaXMuJC50b2FzdC50ZXh0PWE7dGhpcy4kLnRvYXN0Lm9wZW4oKX0sX21heWJlSW5pdGlhbGl6ZURhc2hib2FyZDpmdW5jdGlvbihhLGMpe2lmKCF0aGlzLl9pbml0aWFsaXplZCYmYSYmYyl7dGhpcy5faW5pdGlhbGl6ZWQ9ITA7dmFyIGQ9UW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInByb2ZpbGUiLCIvdG9vbHMiKTt0aGlzLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTowLG1zZzoiIn0pO3ZhciBmPXRoaXMsZz10Zi5wcm9maWxlLnV0aWwuZ2V0VHJhY2tlcih0aGlzKTt0Zi5wcm9maWxlLnV0aWwucnVuVGFzaygiTG9hZGluZyBkYXRhc2V0cyIsMjAsKCk9Pntjb25zb2xlLmxvZygic3RhcnQgY291bnRpbmciKTtyZXR1cm4gZi5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChkKX0sZykudGhlbihsPT50Zi5wcm9maWxlLnV0aWwucnVuVGFzaygiUHJvY2Vzc2luZyBkYXRhc2V0cyIsNzAsKCk9Pm5ldyBQcm9taXNlKGZ1bmN0aW9uKGspe2YuX3Byb2Nlc3NSdW5Ub1Rvb2wobCk7CmsobnVsbCl9KSxnKSkudGhlbigoKT0+dGYucHJvZmlsZS51dGlsLnJ1blRhc2soIkRvbmUiLDEwLCgpPT5udWxsLGcpKX19LF9wcm9jZXNzUnVuVG9Ub29sOmZ1bmN0aW9uKGEpe2E9Xy5tYXAoYSwoYyxkKT0+KHtuYW1lOmQsYWN0aXZlVG9vbHM6Y30pKTthLnNvcnQoKGMsZCk9PjAtZ24uY29tcGFyZVRhZ05hbWVzKGMubmFtZSxkLm5hbWUpKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWEubGVuZ3RoKTt0aGlzLnNldCgiX2RhdGFzZXRzIixhKX0sX2dldFNlbGVjdGVkOmZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9YSlyZXR1cm4gYyYmMDw9YSYmYTxjLmxlbmd0aD9jW2FdOm51bGx9LF9nZXRTZWxlY3RlZERhdGFzZXROYW1lOmZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9YSlyZXR1cm4gYyYmMDw9YSYmYTxjLmxlbmd0aD9jW2FdLm5hbWU6IiJ9LF9nZXRBY3RpdmVUb29sc0xpc3Q6ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1hKXJldHVybiBjJiYwPD1hJiZhPGMubGVuZ3RoPyh0aGlzLnNlbGVjdGVkVG9vbEluZGV4PQowLGNbYV0uYWN0aXZlVG9vbHMpOltdfSxfbWF5YmVVcGRhdGVEYXRhOmZ1bmN0aW9uKGEpe2lmKG51bGwhPWEpe3ZhciBjPXRoaXMuX3NlbGVjdGVkRGF0YXNldE5hbWUsZD10aGlzLl9zZWxlY3RlZFRvb2xOYW1lO2lmKG51bGwhPWMmJm51bGwhPWQpaWYodGhpcy5fdG9vbEluU2NvcGU9InVuZGVmaW5lZCIsZC5zdGFydHNXaXRoKCJ0cmFjZV92aWV3ZXIiKSl7dmFyIGY9UW8uYWRkUGFyYW1zKFFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJwcm9maWxlIiwiL2RhdGEiKSx7dGFnOmQscnVuOmMsaG9zdDphfSksZz1kLmVuZHNXaXRoKCJAIik7dGhpcy5fdHJhY2VEYXRhVXJsPXRoaXMudHJhY2VWaWV3ZXJCYXNlVXJsKyI/dHJhY2VfZGF0YV91cmxceDNkIitlbmNvZGVVUklDb21wb25lbnQoZikrIlx4MjZpc19zdHJlYW1pbmdceDNkIitnO3RoaXMuX3Rvb2xJblNjb3BlPSJ0cmFjZV92aWV3ZXIifWVsc2V7dGhpcy5zZXQoInByb2dyZXNzIix7dmFsdWU6MCxtc2c6IiJ9KTtsZXQgbD0KdGhpcyxrPXRmLnByb2ZpbGUudXRpbC5nZXRUcmFja2VyKHRoaXMpO3RmLnByb2ZpbGUudXRpbC5ydW5UYXNrKCJSZWFkaW5nICIrZCsiIHRvb2wgZGF0YSIsMjAsKCk9PmwuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoUW8uYWRkUGFyYW1zKFFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJwcm9maWxlIiwiL2RhdGEiKSx7dGFnOmQsaG9zdDphLHJ1bjpjfSkpLGspLmNhdGNoKCgpPT57fSkudGhlbihuPT50Zi5wcm9maWxlLnV0aWwucnVuVGFzaygiRG9uZSIsODAsKCk9PntsLl91cGRhdGVUb29sRGF0YShkLG4pfSxrKSl9fX0sX3VwZGF0ZVRvb2xEYXRhOmZ1bmN0aW9uKGEsYyl7c3dpdGNoKGEpe2Nhc2UgIm9wX3Byb2ZpbGUiOnRoaXMuX29wUHJvZmlsZURhdGE9Yzt0aGlzLl90b29sSW5TY29wZT0ib3BfcHJvZmlsZSI7YnJlYWs7Y2FzZSAiaW5wdXRfcGlwZWxpbmVfYW5hbHl6ZXIiOnRoaXMuX2lucHV0UGlwZWxpbmVEYXRhPWM7dGhpcy5fdG9vbEluU2NvcGU9ImlucHV0X3BpcGVsaW5lX2FuYWx5emVyIjsKYnJlYWs7Y2FzZSAib3ZlcnZpZXdfcGFnZSI6dGhpcy5fb3ZlcnZpZXdQYWdlRGF0YT1jO3RoaXMuX3Rvb2xJblNjb3BlPSJvdmVydmlld19wYWdlIjticmVhaztjYXNlICJtZW1vcnlfdmlld2VyIjp0aGlzLl9tZW1vcnlWaWV3ZXJEYXRhPWM7dGhpcy5fdG9vbEluU2NvcGU9Im1lbW9yeV92aWV3ZXIiO2JyZWFrO2Nhc2UgInBvZF92aWV3ZXIiOnRoaXMuX3BvZFZpZXdlckRhdGE9Yzt0aGlzLl90b29sSW5TY29wZT0icG9kX3ZpZXdlciI7YnJlYWs7Y2FzZSAiZ29vZ2xlX2NoYXJ0X2RlbW8iOnRoaXMuX2dvb2dsZUNoYXJ0RGVtb0RhdGE9Yyx0aGlzLl90b29sSW5TY29wZT0iZ29vZ2xlX2NoYXJ0X2RlbW8ifX0sX21heWJlVXBkYXRlQWN0aXZlSG9zdHM6ZnVuY3Rpb24oYSxjKXtpZihudWxsPT1hfHxudWxsPT1jKXJldHVybiBudWxsO3RoaXMuX2FjdGl2ZUhvc3RzTGlzdD1bXTthPVFvLmFkZFBhcmFtcyhRby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgicHJvZmlsZSIsIi9ob3N0cyIpLAp7dGFnOmMscnVuOmF9KTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGEpLnRoZW4oZD0+e3RoaXMuc2V0KCJfYWN0aXZlSG9zdHNMaXN0IixkLnNvcnQoKGYsZyk9PmduLmNvbXBhcmVUYWdOYW1lcyhmLGcpKSl9KX0sX2RhdGFzZXRzQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2RhdGFzZXRzJiYodGhpcy5zZWxlY3RlZERhdGFzZXRJbmRleD0wKX0sX2FjdGl2ZVRvb2xzQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2FjdGl2ZVRvb2xzTGlzdCYmdGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuc2V0KCJzZWxlY3RlZFRvb2xJbmRleCIsLTEpO3RoaXMuc2V0KCJzZWxlY3RlZFRvb2xJbmRleCIsMCl9LmJpbmQodGhpcykpfSxfYWN0aXZlSG9zdHNDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fYWN0aXZlSG9zdHNMaXN0JiZ0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5zZXQoInNlbGVjdGVkSG9zdEluZGV4IiwtMSk7dGhpcy5zZXQoInNlbGVjdGVkSG9zdEluZGV4IiwwKX0uYmluZCh0aGlzKSl9LApfaXNDdXJyZW50VG9vbDpmdW5jdGlvbihhLGMpe3JldHVybiBhPT1jfSxfaGFzQWN0aXZlVG9vbHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYWN0aXZlVG9vbHNMaXN0JiYwPHRoaXMuX2FjdGl2ZVRvb2xzTGlzdC5sZW5ndGg/ITA6ITF9LF9nZXRIb3N0RGlzcGxheU5hbWU6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6IiI9PWE/ImRlZmF1bHQiOmEuc2xpY2UoMCwtMSl9LF9jb21wdXRlVG9wTGV2ZWxTdGF0ZTpmdW5jdGlvbihhLGMpe3JldHVybiBhPyJEQVRBX05PVF9GT1VORCI6IWN8fDEwMD5jLnZhbHVlPyJMT0FESU5HIjoiQUNUSVZFIn0sX2lzU3RhdGU6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYT09PWN9fSk7WW8ucmVnaXN0ZXJEYXNoYm9hcmQoe3BsdWdpbjoicHJvZmlsZSIsZWxlbWVudE5hbWU6InRmLXByb2ZpbGUtZGFzaGJvYXJkIixpc1JlbG9hZERpc2FibGVkOiEwfSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJlaG9sZGVyLWRhc2hib2FyZC90Zi1iZWhvbGRlci12aWRlby5odG1sLmpzCihmdW5jdGlvbigpe2NvbnN0IGE9UW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImJlaG9sZGVyIiwiL2JlaG9sZGVyLWZyYW1lIiksYz1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYmVob2xkZXIiLCIvcGluZyIpO1BvbHltZXIoe2lzOiJ0Zi1iZWhvbGRlci12aWRlbyIscHJvcGVydGllczp7ZnBzOnt0eXBlOk51bWJlcix2YWx1ZToxMCxvYnNlcnZlcjoiX2Zwc0NoYW5nZWQifSxwaW5nU2xlZXA6e3R5cGU6TnVtYmVyLHZhbHVlOjFFM30seGhyVGltZW91dDp7dHlwZTpOdW1iZXIsdmFsdWU6MjUwMH0sX2ltYWdlVVJMOnt0eXBlOlN0cmluZyx2YWx1ZToiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBRC9BQ3dBQUFBQUFRQUJBQUFDQURzXHgzZCJ9LF94aHI6T2JqZWN0LF90aW1lcjpOdW1iZXIsX2lzRGVhZDpCb29sZWFufSxhdHRhY2hlZCgpe3RoaXMuc2V0KCJfaW1hZ2VVUkwiLGEpO3RoaXMuX3BpbmcoKX0sZGV0YWNoZWQoKXt0aGlzLl9jbGVhcigpOwp0aGlzLnNldCgiX2ltYWdlVVJMIiwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBRC9BQ3dBQUFBQUFRQUJBQUFDQURzXHgzZCIpfSxfcGluZygpe3RoaXMuX2NsZWFyKCk7dGhpcy5feGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt0aGlzLl94aHIub3BlbigiR0VUIixjLCEwKTt0aGlzLl94aHIudGltZW91dD10aGlzLnhoclRpbWVvdXQ7dGhpcy5feGhyLm9ubG9hZD10aGlzLl9vblBpbmdMb2FkLmJpbmQodGhpcyk7dGhpcy5feGhyLm9uZXJyb3I9dGhpcy5fb25QaW5nLmJpbmQodGhpcywhMSx0aGlzLnBpbmdTbGVlcCk7dGhpcy5feGhyLm9udGltZW91dD10aGlzLl9vblBpbmcuYmluZCh0aGlzLCExLDEpO3RoaXMuX3hoci5zZW5kKG51bGwpfSxfb25QaW5nTG9hZCgpe2lmKDIwMD09dGhpcy5feGhyLnN0YXR1cyl7Y29uc3QgZD1KU09OLnBhcnNlKHRoaXMuX3hoci5yZXNwb25zZVRleHQpO3RoaXMuX29uUGluZygiYWxpdmUiPT1kLnN0YXR1cyx0aGlzLnBpbmdTbGVlcCl9ZWxzZSB0aGlzLl9vblBpbmcoITEsCnRoaXMucGluZ1NsZWVwKX0sX29uUGluZyhkLGYpe2QmJnRoaXMuX2lzRGVhZCYmdGhpcy5zZXQoIl9pbWFnZVVSTCIsYSsiP3RceDNkIisobmV3IERhdGUpLmdldFRpbWUoKSk7dGhpcy5faXNEZWFkPSFkO3RoaXMuX3RpbWVyPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT50aGlzLl9waW5nKCksZil9LF9jbGVhcigpe3RoaXMuX3RpbWVyJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLl90aW1lciksdGhpcy5fdGltZXI9bnVsbCk7dGhpcy5feGhyJiYodGhpcy5feGhyLnJlYWR5U3RhdGU8WE1MSHR0cFJlcXVlc3QuRE9ORSYmdGhpcy5feGhyLmFib3J0KCksdGhpcy5feGhyPW51bGwpfSxfZnBzQ2hhbmdlZChkLGYpezA9PWQ/dGhpcy5fY2xlYXIoKTowPT1mJiZ0aGlzLl9waW5nKCl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJlaG9sZGVyLWRhc2hib2FyZC90Zi1iZWhvbGRlci1pbmZvLmh0bWwuanMKKGZ1bmN0aW9uKCl7Y29uc3QgYT1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYmVob2xkZXIiLCIvc2VjdGlvbi1pbmZvIik7UG9seW1lcih7aXM6InRmLWJlaG9sZGVyLWluZm8iLHByb3BlcnRpZXM6e2Zwczp7dHlwZTpOdW1iZXIsdmFsdWU6MTAsb2JzZXJ2ZXI6Il9mcHNDaGFuZ2VkIn0seGhyVGltZW91dDp7dHlwZTpOdW1iZXIsdmFsdWU6MUU0fSxfaXRlbXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9Plt7bmFtZToiTG9hZGluZy4uLiJ9XX0sX3hocjpPYmplY3QsX3RpbWVyOk51bWJlcn0sYXR0YWNoZWQoKXt0aGlzLl9sb2FkKCl9LGRldGFjaGVkKCl7dGhpcy5fY2xlYXIoKX0sX2xvYWQoKXt0aGlzLl9jbGVhcigpO3RoaXMuX3hocj1uZXcgWE1MSHR0cFJlcXVlc3Q7dGhpcy5feGhyLm9wZW4oIkdFVCIsYSwhMCk7dGhpcy5feGhyLnRpbWVvdXQ9dGhpcy54aHJUaW1lb3V0O3RoaXMuX3hoci5vbmxvYWQ9dGhpcy5fb25Mb2FkLmJpbmQodGhpcyk7dGhpcy5feGhyLm9uZXJyb3I9CnRoaXMuX3JldHJ5LmJpbmQodGhpcyx0aGlzLl9nZXRTbGVlcCgpKTt0aGlzLl94aHIub250aW1lb3V0PXRoaXMuX3JldHJ5LmJpbmQodGhpcywxKTt0aGlzLl94aHIuc2VuZChudWxsKX0sX29uTG9hZCgpe2lmKDIwMD09dGhpcy5feGhyLnN0YXR1cyl7Y29uc3QgYz1KU09OLnBhcnNlKHRoaXMuX3hoci5yZXNwb25zZVRleHQpO2NvbnNvbGUuYXNzZXJ0KEFycmF5LmlzQXJyYXkoYyksIkV4cGVjdGVkIHJlc3BvbnNlIHRvIGJlIGluIGFuIGFycmF5Iik7dGhpcy5faXRlbXM9Y310aGlzLl9yZXRyeSh0aGlzLl9nZXRTbGVlcCgpKX0sX3JldHJ5KGMpe3RoaXMuX3RpbWVyPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuX2xvYWQuYmluZCh0aGlzKSxjKX0sX2dldFNsZWVwKCl7cmV0dXJuIDFFMy8oMD09PXRoaXMuZnBzPzE6dGhpcy5mcHMpfSxfY2xlYXIoKXt0aGlzLl90aW1lciYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPW51bGwpO3RoaXMuX3hociYmCih0aGlzLl94aHIucmVhZHlTdGF0ZTxYTUxIdHRwUmVxdWVzdC5ET05FJiZ0aGlzLl94aHIuYWJvcnQoKSx0aGlzLl94aHI9bnVsbCl9LF9mcHNDaGFuZ2VkKGMsZCl7MD09Yz90aGlzLl9jbGVhcigpOjA9PWQmJnRoaXMuX2xvYWQoKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmVob2xkZXItZGFzaGJvYXJkL3RmLWJlaG9sZGVyLWRhc2hib2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1iZWhvbGRlci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBRby5SZXF1ZXN0TWFuYWdlcigxMCwwKX0sX2lzQXZhaWxhYmxlOkJvb2xlYW4sX3ZhbHVlczp7dHlwZTpTdHJpbmcsdmFsdWU6InRyYWluYWJsZV92YXJpYWJsZXMiLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9tb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToidmFyaWFuY2UiLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9zY2FsaW5nOnt0eXBlOlN0cmluZyx2YWx1ZToibGF5ZXIiLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF93aW5kb3dTaXplOnt0eXBlOk51bWJlcix2YWx1ZToxNSxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifSxfcHJldmlvdXNGUFM6e3R5cGU6TnVtYmVyLHZhbHVlOjMwfSxfRlBTOnt0eXBlOk51bWJlcix2YWx1ZToxMCxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifSwKX3JlY29yZFRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGFydCByZWNvcmRpbmcifSxfaXNSZWNvcmRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifSxfc2hvd0FsbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9jb2xvcm1hcDp7dHlwZTpTdHJpbmcsdmFsdWU6Im1hZ21hIixvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifSxfaXNfYWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX2NvbnRyb2xzX2Rpc2FibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn19LF92YWx1ZXNOb3RGcmFtZShhKXtyZXR1cm4iZnJhbWVzIiE9PWF9LF92YXJpYW5jZVNlbGVjdGVkKGEpe3JldHVybiJ2YXJpYW5jZSI9PT1hfSxfY29uZmlnQ2hhbmdlZCgpe2lmKHRoaXMuX2lzX2FjdGl2ZSYmIXRoaXMuX2NvbnRyb2xzX2Rpc2FibGVkKXt2YXIgYT0KW3RoaXMuX3ZhbHVlcyx0aGlzLl9tb2RlLHRoaXMuX3NjYWxpbmcsdGhpcy5fd2luZG93U2l6ZSx0aGlzLl9GUFMsdGhpcy5faXNSZWNvcmRpbmcsdGhpcy5fc2hvd0FsbCx0aGlzLl9jb2xvcm1hcF0sYztmb3IoYyBvZiBhKWlmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGN8fCIiPT09YylyZXR1cm47YT1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYmVob2xkZXIiLCIvY2hhbmdlLWNvbmZpZyIpO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSx7dmFsdWVzOnRoaXMuX3ZhbHVlcyxtb2RlOnRoaXMuX21vZGUsc2NhbGluZzp0aGlzLl9zY2FsaW5nLHdpbmRvd19zaXplOnRoaXMuX3dpbmRvd1NpemUsRlBTOnRoaXMuX0ZQUyxpc19yZWNvcmRpbmc6dGhpcy5faXNSZWNvcmRpbmcsc2hvd19hbGw6dGhpcy5fc2hvd0FsbCxjb2xvcm1hcDp0aGlzLl9jb2xvcm1hcH0pfX0sX3RvZ2dsZVJlY29yZCgpeyJzdGFydCByZWNvcmRpbmciPT10aGlzLl9yZWNvcmRUZXh0Pyh0aGlzLnNldCgiX3JlY29yZFRleHQiLAoic3RvcCByZWNvcmRpbmciKSx0aGlzLnNldCgiX2lzUmVjb3JkaW5nIiwhMCkpOih0aGlzLnNldCgiX3JlY29yZFRleHQiLCJzdGFydCByZWNvcmRpbmciKSx0aGlzLnNldCgiX2lzUmVjb3JkaW5nIiwhMSkpO3RoaXMuJC5yZWNvcmRfYnV0dG9uLmNsYXNzTGlzdC50b2dnbGUoImlzLXJlY29yZGluZyIpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoUW8uZ2V0Um91dGVyKCkucGx1Z2luc0xpc3RpbmcoKSkudGhlbihhPT57ImJlaG9sZGVyImluIGE/KHRoaXMuJC5pbml0aWFsRGlhbG9nLmNsb3NlRGlhbG9nKCksdGhpcy5zZXQoIl9pc0F2YWlsYWJsZSIsITApKToodGhpcy4kLmluaXRpYWxEaWFsb2cub3Blbk5vVGVuc29yRmxvd0RpYWxvZygpLHRoaXMuc2V0KCJfaXNBdmFpbGFibGUiLCExKSl9KX0scmVhZHkoKXt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXtpZih0aGlzLl9pc0F2YWlsYWJsZSl7Y29uc3QgYT1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYmVob2xkZXIiLAoiL2lzLWFjdGl2ZSIpO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihjPT57dGhpcy5zZXQoIl9pc19hY3RpdmUiLGMuaXNfYWN0aXZlKTt0aGlzLnNldCgiX2NvbnRyb2xzX2Rpc2FibGVkIiwhYy5pc19jb25maWdfd3JpdGFibGUpfSl9fX0pO1lvLnJlZ2lzdGVyRGFzaGJvYXJkKHtwbHVnaW46ImJlaG9sZGVyIixlbGVtZW50TmFtZToidGYtYmVob2xkZXItZGFzaGJvYXJkIixzaG91bGRSZW1vdmVEb206ITB9KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1wYWdlcy9pcm9uLXBhZ2VzLmh0bWwuanMKUG9seW1lcih7aXM6Imlyb24tcGFnZXMiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3IsUG9seW1lci5Jcm9uU2VsZWN0YWJsZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOnthY3RpdmF0ZUV2ZW50Ont0eXBlOlN0cmluZyx2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX3NlbGVjdGVkUGFnZUNoYW5nZWQoc2VsZWN0ZWQpIl0sX3NlbGVjdGVkUGFnZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmFzeW5jKHRoaXMubm90aWZ5UmVzaXplKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10YWJzL3BhcGVyLXRhYi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10YWIiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLFBvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvcl0scHJvcGVydGllczp7bGluazp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJ0YWIifSxsaXN0ZW5lcnM6e2Rvd246Il91cGRhdGVOb2luayIsdGFwOiJfb25UYXAifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZU5vaW5rKCl9LGdldCBfcGFyZW50Tm9pbmsoKXt2YXIgYT1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlO3JldHVybiEhYSYmISFhLm5vaW5rfSxfdXBkYXRlTm9pbms6ZnVuY3Rpb24oKXt0aGlzLm5vaW5rPSEhdGhpcy5ub2lua3x8ISF0aGlzLl9wYXJlbnROb2lua30sX29uVGFwOmZ1bmN0aW9uKGEpe2lmKHRoaXMubGluayl7dmFyIGM9dGhpcy5xdWVyeUVmZmVjdGl2ZUNoaWxkcmVuKCJhIik7CmMmJmEudGFyZ2V0IT09YyYmYy5jbGljaygpfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10YWJzL3BhcGVyLXRhYnMuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdGFicyIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcixQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JdLHByb3BlcnRpZXM6e25vaW5rOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9ub2lua0NoYW5nZWQifSxub0Jhcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub1NsaWRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNjcm9sbGFibGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZml0Q29udGFpbmVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGRpc2FibGVEcmFnOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGhpZGVTY3JvbGxCdXR0b25zOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGFsaWduQm90dG9tOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNlbGVjdGFibGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJwYXBlci10YWIifSxhdXRvc2VsZWN0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGF1dG9zZWxlY3REZWxheTp7dHlwZTpOdW1iZXIsCnZhbHVlOjB9LF9zdGVwOnt0eXBlOk51bWJlcix2YWx1ZToxMH0sX2hvbGREZWxheTp7dHlwZTpOdW1iZXIsdmFsdWU6MX0sX2xlZnRIaWRkZW46e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3JpZ2h0SGlkZGVuOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9wcmV2aW91c1RhYjp7dHlwZTpPYmplY3R9fSxob3N0QXR0cmlidXRlczp7cm9sZToidGFibGlzdCJ9LGxpc3RlbmVyczp7Imlyb24tcmVzaXplIjoiX29uVGFiU2l6aW5nQ2hhbmdlZCIsImlyb24taXRlbXMtY2hhbmdlZCI6Il9vblRhYlNpemluZ0NoYW5nZWQiLCJpcm9uLXNlbGVjdCI6Il9vbklyb25TZWxlY3QiLCJpcm9uLWRlc2VsZWN0IjoiX29uSXJvbkRlc2VsZWN0In0sa2V5QmluZGluZ3M6eyJsZWZ0OmtleXVwIHJpZ2h0OmtleXVwIjoiX29uQXJyb3dLZXl1cCJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9ob2xkSm9iPW51bGw7dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT0Kdm9pZCAwO3RoaXMuX2JpbmREZWxheWVkQWN0aXZhdGlvbkhhbmRsZXI9dGhpcy5fZGVsYXllZEFjdGl2YXRpb25IYW5kbGVyLmJpbmQodGhpcyk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9vbkJsdXJDYXB0dXJlLmJpbmQodGhpcyksITApfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2V0U2Nyb2xsRGlyZWN0aW9uKCJ5Iix0aGlzLiQudGFic0NvbnRhaW5lcil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fY2FuY2VsUGVuZGluZ0FjdGl2YXRpb24oKX0sX25vaW5rQ2hhbmdlZDpmdW5jdGlvbihhKXtQb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yQWxsKCJwYXBlci10YWIiKS5mb3JFYWNoKGE/dGhpcy5fc2V0Tm9pbmtBdHRyaWJ1dGU6dGhpcy5fcmVtb3ZlTm9pbmtBdHRyaWJ1dGUpfSxfc2V0Tm9pbmtBdHRyaWJ1dGU6ZnVuY3Rpb24oYSl7YS5zZXRBdHRyaWJ1dGUoIm5vaW5rIiwiIil9LF9yZW1vdmVOb2lua0F0dHJpYnV0ZTpmdW5jdGlvbihhKXthLnJlbW92ZUF0dHJpYnV0ZSgibm9pbmsiKX0sCl9jb21wdXRlU2Nyb2xsQnV0dG9uQ2xhc3M6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiFjfHxkPyJoaWRkZW4iOmE/Im5vdC12aXNpYmxlIjoiIn0sX2NvbXB1dGVUYWJzQ29udGVudENsYXNzOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGE/InNjcm9sbGFibGUiKyhjPyIgZml0LWNvbnRhaW5lciI6IiIpOiIgZml0LWNvbnRhaW5lciJ9LF9jb21wdXRlU2VsZWN0aW9uQmFyQ2xhc3M6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYT8iaGlkZGVuIjpjPyJhbGlnbi1ib3R0b20iOiIifSxfb25UYWJTaXppbmdDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kZWJvdW5jZSgiX29uVGFiU2l6aW5nQ2hhbmdlZCIsZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGwoKTt0aGlzLl90YWJDaGFuZ2VkKHRoaXMuc2VsZWN0ZWRJdGVtKX0sMTApfSxfb25Jcm9uU2VsZWN0OmZ1bmN0aW9uKGEpe3RoaXMuX3RhYkNoYW5nZWQoYS5kZXRhaWwuaXRlbSx0aGlzLl9wcmV2aW91c1RhYik7dGhpcy5fcHJldmlvdXNUYWI9YS5kZXRhaWwuaXRlbTsKdGhpcy5jYW5jZWxEZWJvdW5jZXIoInRhYi1jaGFuZ2VkIil9LF9vbklyb25EZXNlbGVjdDpmdW5jdGlvbigpe3RoaXMuZGVib3VuY2UoInRhYi1jaGFuZ2VkIixmdW5jdGlvbigpe3RoaXMuX3RhYkNoYW5nZWQobnVsbCx0aGlzLl9wcmV2aW91c1RhYik7dGhpcy5fcHJldmlvdXNUYWI9bnVsbH0sMSl9LF9hY3RpdmF0ZUhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpO1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX2FjdGl2YXRlSGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9zY2hlZHVsZUFjdGl2YXRpb246ZnVuY3Rpb24oYSxjKXt0aGlzLl9wZW5kaW5nQWN0aXZhdGlvbkl0ZW09YTt0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQ9dGhpcy5hc3luYyh0aGlzLl9iaW5kRGVsYXllZEFjdGl2YXRpb25IYW5kbGVyLGMpfSxfZGVsYXllZEFjdGl2YXRpb25IYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtOwp0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQ9dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtPXZvaWQgMDthLmZpcmUodGhpcy5hY3RpdmF0ZUV2ZW50LG51bGwse2J1YmJsZXM6ITAsY2FuY2VsYWJsZTohMH0pfSxfY2FuY2VsUGVuZGluZ0FjdGl2YXRpb246ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uVGltZW91dCksdGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT12b2lkIDApfSxfb25BcnJvd0tleXVwOmZ1bmN0aW9uKCl7dGhpcy5hdXRvc2VsZWN0JiZ0aGlzLl9zY2hlZHVsZUFjdGl2YXRpb24odGhpcy5mb2N1c2VkSXRlbSx0aGlzLmF1dG9zZWxlY3REZWxheSl9LF9vbkJsdXJDYXB0dXJlOmZ1bmN0aW9uKGEpe2EudGFyZ2V0PT09dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtJiZ0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpfSwKZ2V0IF90YWJDb250YWluZXJTY3JvbGxTaXplKCl7cmV0dXJuIE1hdGgubWF4KDAsdGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsV2lkdGgtdGhpcy4kLnRhYnNDb250YWluZXIub2Zmc2V0V2lkdGgpfSxfc2Nyb2xsOmZ1bmN0aW9uKGEsYyl7dGhpcy5zY3JvbGxhYmxlJiZ0aGlzLl9hZmZlY3RTY3JvbGwoYyYmLWMuZGR4fHwwKX0sX2Rvd246ZnVuY3Rpb24oKXt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fZGVmYXVsdEZvY3VzQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jKSx0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYz1udWxsKX0sMSl9LF9hZmZlY3RTY3JvbGw6ZnVuY3Rpb24oYSl7dGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdCs9YTthPXRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQ7dGhpcy5fbGVmdEhpZGRlbj0wPT09YTt0aGlzLl9yaWdodEhpZGRlbj1hPT09dGhpcy5fdGFiQ29udGFpbmVyU2Nyb2xsU2l6ZX0sCl9vbkxlZnRTY3JvbGxCdXR0b25Eb3duOmZ1bmN0aW9uKCl7dGhpcy5fc2Nyb2xsVG9MZWZ0KCk7dGhpcy5faG9sZEpvYj1zZXRJbnRlcnZhbCh0aGlzLl9zY3JvbGxUb0xlZnQuYmluZCh0aGlzKSx0aGlzLl9ob2xkRGVsYXkpfSxfb25SaWdodFNjcm9sbEJ1dHRvbkRvd246ZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGxUb1JpZ2h0KCk7dGhpcy5faG9sZEpvYj1zZXRJbnRlcnZhbCh0aGlzLl9zY3JvbGxUb1JpZ2h0LmJpbmQodGhpcyksdGhpcy5faG9sZERlbGF5KX0sX29uU2Nyb2xsQnV0dG9uVXA6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKHRoaXMuX2hvbGRKb2IpO3RoaXMuX2hvbGRKb2I9bnVsbH0sX3Njcm9sbFRvTGVmdDpmdW5jdGlvbigpe3RoaXMuX2FmZmVjdFNjcm9sbCgtdGhpcy5fc3RlcCl9LF9zY3JvbGxUb1JpZ2h0OmZ1bmN0aW9uKCl7dGhpcy5fYWZmZWN0U2Nyb2xsKHRoaXMuX3N0ZXApfSxfdGFiQ2hhbmdlZDpmdW5jdGlvbihhLGMpe2lmKGEpe3ZhciBkPXRoaXMuJC50YWJzQ29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKZj1kLndpZHRoLGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtkPWcubGVmdC1kLmxlZnQ7dGhpcy5fcG9zPXt3aWR0aDp0aGlzLl9jYWxjUGVyY2VudChnLndpZHRoLGYpLGxlZnQ6dGhpcy5fY2FsY1BlcmNlbnQoZCxmKX07aWYodGhpcy5ub1NsaWRlfHxudWxsPT1jKXRoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LnJlbW92ZSgiZXhwYW5kIiksdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCJjb250cmFjdCIpLHRoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX3Bvcy53aWR0aCx0aGlzLl9wb3MubGVmdCk7ZWxzZXt2YXIgbD1jLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2M9dGhpcy5pdGVtcy5pbmRleE9mKGMpO2E9dGhpcy5pdGVtcy5pbmRleE9mKGEpO3RoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LmFkZCgiZXhwYW5kIik7YT1jPGE7dGhpcy5faXNSVEwmJihhPSFhKTthP3RoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX2NhbGNQZXJjZW50KGcubGVmdCtnLndpZHRoLQpsLmxlZnQsZiktNSx0aGlzLl9sZWZ0KTp0aGlzLl9wb3NpdGlvbkJhcih0aGlzLl9jYWxjUGVyY2VudChsLmxlZnQrbC53aWR0aC1nLmxlZnQsZiktNSx0aGlzLl9jYWxjUGVyY2VudChkLGYpKzUpO3RoaXMuc2Nyb2xsYWJsZSYmdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZElmTmVlZGVkKGcud2lkdGgsZCl9fWVsc2UgdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCJleHBhbmQiKSx0aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdC5yZW1vdmUoImNvbnRyYWN0IiksdGhpcy5fcG9zaXRpb25CYXIoMCwwKX0sX3Njcm9sbFRvU2VsZWN0ZWRJZk5lZWRlZDpmdW5jdGlvbihhLGMpe2MtPXRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQ7MD5jP3RoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQrPWM6KGMrPWEtdGhpcy4kLnRhYnNDb250YWluZXIub2Zmc2V0V2lkdGgsMDxjJiYodGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdCs9YykpfSxfY2FsY1BlcmNlbnQ6ZnVuY3Rpb24oYSwKYyl7cmV0dXJuIDEwMCphL2N9LF9wb3NpdGlvbkJhcjpmdW5jdGlvbihhLGMpe2E9YXx8MDtjPWN8fDA7dGhpcy5fd2lkdGg9YTt0aGlzLl9sZWZ0PWM7dGhpcy50cmFuc2Zvcm0oInRyYW5zbGF0ZVgoIitjKyIlKSBzY2FsZVgoIithLzEwMCsiKSIsdGhpcy4kLnNlbGVjdGlvbkJhcil9LF9vbkJhclRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdDthLmNvbnRhaW5zKCJleHBhbmQiKT8oYS5yZW1vdmUoImV4cGFuZCIpLGEuYWRkKCJjb250cmFjdCIpLHRoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX3Bvcy53aWR0aCx0aGlzLl9wb3MubGVmdCkpOmEuY29udGFpbnMoImNvbnRyYWN0IikmJmEucmVtb3ZlKCJjb250cmFjdCIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWludGVyYWN0aXZlLWluZmVyZW5jZS1kYXNoYm9hcmQvdGYtaW5mZXJlbmNlLXBhbmVsLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWluZmVyZW5jZS1wYW5lbCIscHJvcGVydGllczp7ZXhhbXBsZXNQYXRoOnt0eXBlOlN0cmluZyx2YWx1ZTpUby5nZXRTdHJpbmdJbml0aWFsaXplcigiZXhhbXBsZXNQYXRoIix7ZGVmYXVsdFZhbHVlOiIifSksb2JzZXJ2ZXI6ImV4YW1wbGVzUGF0aENoYW5nZWRfIixub3RpZnk6ITB9LGhpZGVNb2RlbFBhbmUyOnt0eXBlOkJvb2xlYW4sdmFsdWU6VG8uZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJoaWRlTW9kZWxQYW5lMiIse2RlZmF1bHRWYWx1ZTohMH0pLG9ic2VydmVyOiJoaWRlTW9kZWxQYW5lMkNoYW5nZWRfIn0sbW9kZWxOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZToiIixub3RpZnk6ITB9LG1vZGVsTmFtZTE6e3R5cGU6U3RyaW5nLHZhbHVlOlRvLmdldFN0cmluZ0luaXRpYWxpemVyKCJtb2RlbE5hbWUxIix7ZGVmYXVsdFZhbHVlOiIifSksb2JzZXJ2ZXI6Im1vZGVsTmFtZTFDaGFuZ2VkXyIsbm90aWZ5OiEwfSxtb2RlbE5hbWUyOnt0eXBlOlN0cmluZywKdmFsdWU6VG8uZ2V0U3RyaW5nSW5pdGlhbGl6ZXIoIm1vZGVsTmFtZTIiLHtkZWZhdWx0VmFsdWU6IiJ9KSxvYnNlcnZlcjoibW9kZWxOYW1lMkNoYW5nZWRfIixub3RpZnk6ITB9LGluZmVyZW5jZUFkZHJlc3M6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0saW5mZXJlbmNlQWRkcmVzczE6e3R5cGU6U3RyaW5nLHZhbHVlOlRvLmdldFN0cmluZ0luaXRpYWxpemVyKCJpbmZlcmVuY2VBZGRyZXNzMSIse2RlZmF1bHRWYWx1ZToiIn0pLG9ic2VydmVyOiJpbmZlcmVuY2VBZGRyZXNzMUNoYW5nZWRfIixub3RpZnk6ITB9LGluZmVyZW5jZUFkZHJlc3MyOnt0eXBlOlN0cmluZyx2YWx1ZTpUby5nZXRTdHJpbmdJbml0aWFsaXplcigiaW5mZXJlbmNlQWRkcmVzczIiLHtkZWZhdWx0VmFsdWU6IiJ9KSxvYnNlcnZlcjoiaW5mZXJlbmNlQWRkcmVzczJDaGFuZ2VkXyIsbm90aWZ5OiEwfSxtb2RlbFR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOlRvLmdldFN0cmluZ0luaXRpYWxpemVyKCJtb2RlbFR5cGUiLAp7ZGVmYXVsdFZhbHVlOiJjbGFzc2lmaWNhdGlvbiJ9KSxvYnNlcnZlcjoibW9kZWxUeXBlQ2hhbmdlZF8iLG5vdGlmeTohMH0sbW9kZWxWZXJzaW9uOnt0eXBlOlN0cmluZyx2YWx1ZToiIixub3RpZnk6ITB9LG1vZGVsVmVyc2lvbjE6e3R5cGU6U3RyaW5nLHZhbHVlOlRvLmdldFN0cmluZ0luaXRpYWxpemVyKCJtb2RlbFZlcnNpb24xIix7ZGVmYXVsdFZhbHVlOiIifSksb2JzZXJ2ZXI6Im1vZGVsVmVyc2lvbjFDaGFuZ2VkXyIsbm90aWZ5OiEwfSxtb2RlbFZlcnNpb24yOnt0eXBlOlN0cmluZyx2YWx1ZTpUby5nZXRTdHJpbmdJbml0aWFsaXplcigibW9kZWxWZXJzaW9uMiIse2RlZmF1bHRWYWx1ZToiIn0pLG9ic2VydmVyOiJtb2RlbFZlcnNpb24yQ2hhbmdlZF8iLG5vdGlmeTohMH0sbW9kZWxTaWduYXR1cmU6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0sbW9kZWxTaWduYXR1cmUxOnt0eXBlOlN0cmluZyx2YWx1ZTpUby5nZXRTdHJpbmdJbml0aWFsaXplcigibW9kZWxTaWduYXR1cmUxIiwKe2RlZmF1bHRWYWx1ZToiIn0pLG9ic2VydmVyOiJtb2RlbFNpZ25hdHVyZTFDaGFuZ2VkXyIsbm90aWZ5OiEwfSxtb2RlbFNpZ25hdHVyZTI6e3R5cGU6U3RyaW5nLHZhbHVlOlRvLmdldFN0cmluZ0luaXRpYWxpemVyKCJtb2RlbFNpZ25hdHVyZTIiLHtkZWZhdWx0VmFsdWU6IiJ9KSxvYnNlcnZlcjoibW9kZWxTaWduYXR1cmUyQ2hhbmdlZF8iLG5vdGlmeTohMH0sbWF4RXhhbXBsZXM6e3R5cGU6TnVtYmVyLHZhbHVlOlRvLmdldFN0cmluZ0luaXRpYWxpemVyKCJtYXhFeGFtcGxlcyIse2RlZmF1bHRWYWx1ZToiMTAwMCJ9KSxvYnNlcnZlcjoibWF4RXhhbXBsZXNDaGFuZ2VkXyIsbm90aWZ5OiEwfSxsYWJlbFZvY2FiUGF0aDp7dHlwZTpTdHJpbmcsdmFsdWU6VG8uZ2V0U3RyaW5nSW5pdGlhbGl6ZXIoImxhYmVsVm9jYWJQYXRoIix7ZGVmYXVsdFZhbHVlOiIifSksb2JzZXJ2ZXI6ImxhYmVsVm9jYWJQYXRoQ2hhbmdlZF8iLG5vdGlmeTohMH0sbXVsdGlDbGFzczp7dHlwZTpCb29sZWFuLApub3RpZnk6ITAsdmFsdWU6VG8uZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJtdWx0aUNsYXNzIix7ZGVmYXVsdFZhbHVlOiExfSksb2JzZXJ2ZXI6Im11bHRpQ2xhc3NDaGFuZ2VkXyJ9LHNlcXVlbmNlRXhhbXBsZXM6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAsdmFsdWU6VG8uZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJzZXF1ZW5jZUV4YW1wbGVzIix7ZGVmYXVsdFZhbHVlOiExfSksb2JzZXJ2ZXI6InNlcXVlbmNlRXhhbXBsZXNDaGFuZ2VkXyJ9LG1heENsYXNzZXNUb0Rpc3BsYXk6e3R5cGU6TnVtYmVyLHZhbHVlOlRvLmdldFN0cmluZ0luaXRpYWxpemVyKCJtYXhDbGFzc2VzVG9EaXNwbGF5Iix7ZGVmYXVsdFZhbHVlOiI1In0pLG9ic2VydmVyOiJtYXhDbGFzc2VzVG9EaXNwbGF5Q2hhbmdlZF8iLG5vdGlmeTohMH0sc2FtcGxpbmdPZGRzOnt0eXBlOk51bWJlcix2YWx1ZTpUby5nZXRTdHJpbmdJbml0aWFsaXplcigic2FtcGxpbmdPZGRzIix7ZGVmYXVsdFZhbHVlOiIxIn0pLG9ic2VydmVyOiJzYW1wbGluZ09kZHNDaGFuZ2VkXyIsCm5vdGlmeTohMH0sdXNlUHJlZGljdEFwaTp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTpUby5nZXRCb29sZWFuSW5pdGlhbGl6ZXIoInVzZVByZWRpY3RBcGkiLHtkZWZhdWx0VmFsdWU6ITF9KSxvYnNlcnZlcjoidXNlUHJlZGljdEFwaUNoYW5nZWRfIn0scHJlZGljdElucHV0VGVuc29yOnt0eXBlOlN0cmluZyx2YWx1ZTpUby5nZXRTdHJpbmdJbml0aWFsaXplcigicHJlZGljdElucHV0VGVuc29yIix7ZGVmYXVsdFZhbHVlOiJleGFtcGxlcyJ9KSxvYnNlcnZlcjoicHJlZGljdElucHV0VGVuc29yQ2hhbmdlZF8iLG5vdGlmeTohMH0scHJlZGljdE91dHB1dFRlbnNvcjp7dHlwZTpTdHJpbmcsdmFsdWU6VG8uZ2V0U3RyaW5nSW5pdGlhbGl6ZXIoInByZWRpY3RPdXRwdXRUZW5zb3IiLHtkZWZhdWx0VmFsdWU6InByb2JhYmlsaXRpZXMifSksb2JzZXJ2ZXI6InByZWRpY3RPdXRwdXRUZW5zb3JDaGFuZ2VkXyIsbm90aWZ5OiEwfX0sb2JzZXJ2ZXJzOlsidXBkYXRlTW9kZWxOYW1lKG1vZGVsTmFtZTEsIG1vZGVsTmFtZTIpIiwKInVwZGF0ZUluZmVyZW5jZUFkZHJlc3MoaW5mZXJlbmNlQWRkcmVzczEsIGluZmVyZW5jZUFkZHJlc3MyKSIsInVwZGF0ZU1vZGVsVmVyc2lvbihtb2RlbFZlcnNpb24xLCBtb2RlbFZlcnNpb24yKSIsInVwZGF0ZU1vZGVsU2lnbmF0dXJlKG1vZGVsU2lnbmF0dXJlMSwgbW9kZWxTaWduYXR1cmUyKSJdLHVwZGF0ZU1vZGVsTmFtZTpmdW5jdGlvbihhLGMpe3RoaXMubW9kZWxOYW1lPWErIiwiK2M7dGhpcy5tb2RlbE5hbWU9dGhpcy5tb2RlbE5hbWUucmVwbGFjZSgvKF4sKXwoLCQpL2csIiIpfSx1cGRhdGVJbmZlcmVuY2VBZGRyZXNzOmZ1bmN0aW9uKGEsYyl7dGhpcy5pbmZlcmVuY2VBZGRyZXNzPWErIiwiK2M7dGhpcy5pbmZlcmVuY2VBZGRyZXNzPXRoaXMuaW5mZXJlbmNlQWRkcmVzcy5yZXBsYWNlKC8oXiwpfCgsJCkvZywiIil9LHVwZGF0ZU1vZGVsVmVyc2lvbjpmdW5jdGlvbihhLGMpe3RoaXMubW9kZWxWZXJzaW9uPWErIiwiK2N9LHVwZGF0ZU1vZGVsU2lnbmF0dXJlOmZ1bmN0aW9uKGEsCmMpe3RoaXMubW9kZWxTaWduYXR1cmU9YSsiLCIrY30sYWRkTW9kZWxDbGlja2VkXzpmdW5jdGlvbigpe3RoaXMuaGlkZU1vZGVsUGFuZTI9IXRoaXMuaGlkZU1vZGVsUGFuZTJ9LGV4YW1wbGVzUGF0aENoYW5nZWRfOlRvLmdldFN0cmluZ09ic2VydmVyKCJleGFtcGxlc1BhdGgiLHtkZWZhdWx0VmFsdWU6IiJ9KSxtb2RlbE5hbWUxQ2hhbmdlZF86VG8uZ2V0U3RyaW5nT2JzZXJ2ZXIoIm1vZGVsTmFtZTEiLHtkZWZhdWx0VmFsdWU6IiJ9KSxtb2RlbE5hbWUyQ2hhbmdlZF86VG8uZ2V0U3RyaW5nT2JzZXJ2ZXIoIm1vZGVsTmFtZTIiLHtkZWZhdWx0VmFsdWU6IiJ9KSxpbmZlcmVuY2VBZGRyZXNzMUNoYW5nZWRfOlRvLmdldFN0cmluZ09ic2VydmVyKCJpbmZlcmVuY2VBZGRyZXNzMSIse2RlZmF1bHRWYWx1ZToiIn0pLGluZmVyZW5jZUFkZHJlc3MyQ2hhbmdlZF86VG8uZ2V0U3RyaW5nT2JzZXJ2ZXIoImluZmVyZW5jZUFkZHJlc3MyIix7ZGVmYXVsdFZhbHVlOiIifSksbW9kZWxUeXBlQ2hhbmdlZF86VG8uZ2V0U3RyaW5nT2JzZXJ2ZXIoIm1vZGVsVHlwZSIsCntkZWZhdWx0VmFsdWU6ImNsYXNzaWZpY2F0aW9uIn0pLG1vZGVsVmVyc2lvbjFDaGFuZ2VkXzpUby5nZXRTdHJpbmdPYnNlcnZlcigibW9kZWxWZXJzaW9uMSIse2RlZmF1bHRWYWx1ZToiIn0pLG1vZGVsVmVyc2lvbjJDaGFuZ2VkXzpUby5nZXRTdHJpbmdPYnNlcnZlcigibW9kZWxWZXJzaW9uMiIse2RlZmF1bHRWYWx1ZToiIn0pLG1vZGVsU2lnbmF0dXJlMUNoYW5nZWRfOlRvLmdldFN0cmluZ09ic2VydmVyKCJtb2RlbFNpZ25hdHVyZTEiLHtkZWZhdWx0VmFsdWU6IiJ9KSxtb2RlbFNpZ25hdHVyZTJDaGFuZ2VkXzpUby5nZXRTdHJpbmdPYnNlcnZlcigibW9kZWxTaWduYXR1cmUyIix7ZGVmYXVsdFZhbHVlOiIifSksbWF4RXhhbXBsZXNDaGFuZ2VkXzpUby5nZXRTdHJpbmdPYnNlcnZlcigibWF4RXhhbXBsZXMiLHtkZWZhdWx0VmFsdWU6IjEwMDAifSksbGFiZWxWb2NhYlBhdGhDaGFuZ2VkXzpUby5nZXRTdHJpbmdPYnNlcnZlcigibGFiZWxWb2NhYlBhdGgiLHtkZWZhdWx0VmFsdWU6IiJ9KSwKbWF4Q2xhc3Nlc1RvRGlzcGxheUNoYW5nZWRfOlRvLmdldFN0cmluZ09ic2VydmVyKCJtYXhDbGFzc2VzVG9EaXNwbGF5Iix7ZGVmYXVsdFZhbHVlOiI1In0pLHNhbXBsaW5nT2Rkc0NoYW5nZWRfOlRvLmdldFN0cmluZ09ic2VydmVyKCJzYW1wbGluZ09kZHMiLHtkZWZhdWx0VmFsdWU6IjEifSksbXVsdGlDbGFzc0NoYW5nZWRfOlRvLmdldEJvb2xlYW5PYnNlcnZlcigibXVsdGlDbGFzcyIse2RlZmF1bHRWYWx1ZTohMX0pLHNlcXVlbmNlRXhhbXBsZXNDaGFuZ2VkXzpUby5nZXRCb29sZWFuT2JzZXJ2ZXIoInNlcXVlbmNlRXhhbXBsZXMiLHtkZWZhdWx0VmFsdWU6ITF9KSxoaWRlTW9kZWxQYW5lMkNoYW5nZWRfOlRvLmdldEJvb2xlYW5PYnNlcnZlcigiaGlkZU1vZGVsUGFuZTIiLHtkZWZhdWx0VmFsdWU6ITB9KSx1c2VQcmVkaWN0QXBpQ2hhbmdlZF86VG8uZ2V0Qm9vbGVhbk9ic2VydmVyKCJ1c2VQcmVkaWN0QXBpIix7ZGVmYXVsdFZhbHVlOiExfSkscHJlZGljdE91dHB1dFRlbnNvckNoYW5nZWRfOlRvLmdldFN0cmluZ09ic2VydmVyKCJwcmVkaWN0T3V0cHV0VGVuc29yIiwKe2RlZmF1bHRWYWx1ZToicHJvYmFiaWxpdGllcyJ9KSxwcmVkaWN0SW5wdXRUZW5zb3JDaGFuZ2VkXzpUby5nZXRTdHJpbmdPYnNlcnZlcigicHJlZGljdElucHV0VGVuc29yIix7ZGVmYXVsdFZhbHVlOiJleGFtcGxlcyJ9KSxzaG91bGREaXNhYmxlQ2xhc3NpZmljYXRpb25Db250cm9sc186ZnVuY3Rpb24oYSl7cmV0dXJuInJlZ3Jlc3Npb24iPT1hfSxzaG91bGREaXNhYmxlTXVsdGlDbGFzc0NvbnRyb2xzXzpmdW5jdGlvbihhKXtyZXR1cm4hYX0sc2hvdWxkRGlzYWJsZVByZWRpY3RUZW5zb3JDb250cm9sc186ZnVuY3Rpb24oYSl7cmV0dXJuIWF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotYmFyLWNoYXJ0L3Z6LWJhci1jaGFydC5qcwp2YXIgRXA7CihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ2ei1iYXItY2hhcnQiLHByb3BlcnRpZXM6e2RhdGE6T2JqZWN0LGxpbmVzOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sY29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IFBsb3R0YWJsZS5TY2FsZXMuQ29sb3IpLnJhbmdlKGQzLnNjaGVtZUNhdGVnb3J5MTApfX0sbGluZXNDb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybihuZXcgUGxvdHRhYmxlLlNjYWxlcy5Db2xvcikucmFuZ2UoZDMuc2NoZW1lQ2F0ZWdvcnkxMCl9fSx0b29sdGlwQ29sdW1uczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVyblt7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmZ1bmN0aW9uKGMpe3JldHVybiBjLmtleX19LHt0aXRsZToiWCIsZXZhbHVhdGU6ZnVuY3Rpb24oYyl7cmV0dXJuIGMudmFsdWUueH19LHt0aXRsZToiWSIsZXZhbHVhdGU6ZnVuY3Rpb24oYyl7cmV0dXJuIGMudmFsdWUueX19XX19LF9hdHRhY2hlZDpCb29sZWFuLApfY2hhcnQ6T2JqZWN0fSxvYnNlcnZlcnM6WyJfbWFrZUNoYXJ0KGRhdGEsIGxpbmVzLCBjb2xvclNjYWxlLCBsaW5lc0NvbG9yU2NhbGUsIHRvb2x0aXBDb2x1bW5zLCBfYXR0YWNoZWQpIl0scmVkcmF3OmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnJlZHJhdygpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2F0dGFjaGVkPSEwfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2F0dGFjaGVkPSExfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC50b29sdGlwLCEwKTt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuY2hhcnRkaXYsITApfSxfbWFrZUNoYXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LmRlc3Ryb3koKTt2YXIgYz1kMy5zZWxlY3QodGhpcy4kLnRvb2x0aXApO2M9bmV3IGEodGhpcy5kYXRhLHRoaXMubGluZXMsdGhpcy5jb2xvclNjYWxlLHRoaXMubGluZXNDb2xvclNjYWxlLGMsdGhpcy50b29sdGlwQ29sdW1ucyk7CnZhciBkPWQzLnNlbGVjdCh0aGlzLiQuY2hhcnRkaXYpO2MucmVuZGVyVG8oZCk7dGhpcy5fY2hhcnQ9Y319KTtjbGFzcyBhe2NvbnN0cnVjdG9yKGMsZCxmLGcsbCxrKXtmLmRvbWFpbihfLnNvcnRCeShfLmtleXMoYykpKTt0aGlzLmRhdGE9Yzt0aGlzLmxpbmVzPWQ7dGhpcy5jb2xvclNjYWxlPWY7dGhpcy5saW5lc0NvbG9yU2NhbGU9Zzt0aGlzLnRvb2x0aXA9bDt0aGlzLm91dGVyPXRoaXMucGxvdD1udWxsO3RoaXMuYnVpbGRDaGFydChjLGQsZixnKTt0aGlzLnNldHVwVG9vbHRpcHMoayl9YnVpbGRDaGFydChjLGQsZil7dGhpcy5vdXRlciYmdGhpcy5vdXRlci5kZXN0cm95KCk7dmFyIGc9bmV3IFBsb3R0YWJsZS5TY2FsZXMuQ2F0ZWdvcnk7Y29uc3QgbD1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXIsaz1uZXcgUGxvdHRhYmxlLkF4ZXMuQ2F0ZWdvcnkoZywiYm90dG9tIiksbj1uZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyhsLCJsZWZ0IikscD1uZXcgUGxvdHRhYmxlLlBsb3RzLkNsdXN0ZXJlZEJhcjsKcC54KGZ1bmN0aW9uKHIpe3JldHVybiByLnh9LGcpO3AueShmdW5jdGlvbihyKXtyZXR1cm4gci55fSxsKTtfLmtleXMoYykuZm9yRWFjaChyPT5wLmFkZERhdGFzZXQoKG5ldyBQbG90dGFibGUuRGF0YXNldChjW3JdKSkubWV0YWRhdGEocikpKTtwLmF0dHIoImZpbGwiLGZ1bmN0aW9uKHIsdCx2KXtyZXR1cm4gZi5zY2FsZSh2Lm1ldGFkYXRhKCkpfSk7dGhpcy5wbG90PXA7Y29uc3QgcT1fLmtleXMoZCk7aWYoMDxxLmxlbmd0aCl7Y29uc3Qgcj1uZXcgUGxvdHRhYmxlLlBsb3RzLkxpbmU7ci54KGZ1bmN0aW9uKHQpe3JldHVybiB0Lnh9LGcpO3IueShmdW5jdGlvbih0KXtyZXR1cm4gdC55fSxsKTtxLmZvckVhY2godD0+ci5hZGREYXRhc2V0KChuZXcgUGxvdHRhYmxlLkRhdGFzZXQoZFt0XSkpLm1ldGFkYXRhKHQpKSk7ci5hdHRyKCJzdHJva2UiLCh0LHYseSk9PnRoaXMubGluZXNDb2xvclNjYWxlLnNjYWxlKHkubWV0YWRhdGEoKSkpO2c9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3VwKFtwLApyXSk7dGhpcy5vdXRlcj1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuVGFibGUoW1tuLGddLFtudWxsLGtdXSl9ZWxzZSB0aGlzLm91dGVyPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5UYWJsZShbW24scF0sW251bGwsa11dKX1zZXR1cFRvb2x0aXBzKGMpe3ZhciBkPXRoaXMudG9vbHRpcC5zZWxlY3QoInRoZWFkIHRyIik7ZC5zZWxlY3RBbGwoInRoIikuZGF0YShjKS5lbnRlcigpLmFwcGVuZCgidGgiKS50ZXh0KGc9PmcudGl0bGUpO2QuaW5zZXJ0KCJ0aCIsIjpmaXJzdC1jaGlsZCIpO2NvbnN0IGY9dGhpcy5wbG90O2Q9bmV3ICRvLlBvaW50ZXJJbnRlcmFjdGlvbjtkLmF0dGFjaFRvKGYpO2Qub25Qb2ludGVyTW92ZShnPT57KGc9Zi5lbnRpdHlOZWFyZXN0KGcpKSYmdGhpcy5kcmF3VG9vbHRpcHMoZyxjKX0pO2Qub25Qb2ludGVyRXhpdCgoKT0+e3RoaXMudG9vbHRpcC5zdHlsZSgib3BhY2l0eSIsMCl9KX1kcmF3VG9vbHRpcHMoYyxkKXtjb25zdCBmPWMuZGF0dW0ueCxnPWMuZGF0YXNldC5tZXRhZGF0YSgpOwp2YXIgbD1fLm1hcFZhbHVlcyh0aGlzLmRhdGEscD0+Xy5maWx0ZXIocCxxPT5xLng9PWYpKTtsPV8ucGlja0J5KGwscD0+MDxwLmxlbmd0aCk7bD1fLm1hcFZhbHVlcyhsLHA9PnBbMF0pO2w9ZDMuZW50cmllcyhsKTtjb25zdCBrPXRoaXMudG9vbHRpcC5zZWxlY3QoInRib2R5IikuaHRtbCgiIikuc2VsZWN0QWxsKCJ0ciIpLmRhdGEobCkuZW50ZXIoKS5hcHBlbmQoInRyIik7ay5zdHlsZSgid2hpdGUtc3BhY2UiLCJub3dyYXAiKTtrLmNsYXNzZWQoImNsb3Nlc3QiLHA9PnAua2V5PT1nKTtjb25zdCBuPXRoaXMuY29sb3JTY2FsZTtrLmFwcGVuZCgidGQiKS5hcHBlbmQoImRpdiIpLmNsYXNzZWQoInN3YXRjaCIsITApLnN0eWxlKCJiYWNrZ3JvdW5kLWNvbG9yIixwPT5uLnNjYWxlKHAua2V5KSk7Xy5lYWNoKGQscD0+e2suYXBwZW5kKCJ0ZCIpLnRleHQocT0+cC5ldmFsdWF0ZShxKSl9KTt0aGlzLnRvb2x0aXAuc3R5bGUoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2MucG9zaXRpb24ueCsKInB4LCIrYy5wb3NpdGlvbi55KyJweCkiKTt0aGlzLnRvb2x0aXAuc3R5bGUoIm9wYWNpdHkiLDEpfXJlbmRlclRvKGMpe3RoaXMudGFyZ2V0U1ZHPWM7dGhpcy5vdXRlci5yZW5kZXJUbyhjKX1yZWRyYXcoKXt0aGlzLm91dGVyLnJlZHJhdygpfWRlc3Ryb3koKXt0aGlzLm91dGVyLmRlc3Ryb3koKX19fSkoRXB8fChFcD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWludGVyYWN0aXZlLWluZmVyZW5jZS1kYXNoYm9hcmQvdGYtY29uZnVzaW9uLW1hdHJpeC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1jb25mdXNpb24tbWF0cml4Iixwcm9wZXJ0aWVzOntjb3VudHM6T2JqZWN0LGFsbEl0ZW1zOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sbGFiZWw6U3RyaW5nLGJhY2tncm91bmQ6e3R5cGU6T2JqZWN0LHZhbHVlOmQzLmNvbG9yKCJncmF5Iil9fSxvYnNlcnZlcnM6WyJkcmF3TWF0cml4KGNvdW50cywgYWxsSXRlbXMpIl0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuaG9sZGVyLCEwKX0sZHJhd01hdHJpeDpmdW5jdGlvbihhLGMpe3RoaXMuJC5ob2xkZXIuaW5uZXJIVE1MPSIiO2lmKGEpe3ZhciBkPWM7aWYobnVsbD09ZHx8MD09ZC5sZW5ndGgpe2M9bmV3IFNldDt2YXIgZj1PYmplY3Qua2V5cyhhKTtmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl7Yy5hZGQoZltnXSk7dmFyIGw9T2JqZWN0LmtleXMoYVtmW2ddXSk7Zm9yKGxldCBxPTA7cTxsLmxlbmd0aDtxKyspYy5hZGQobFtxXSl9ZD1BcnJheS5mcm9tKGMudmFsdWVzKCkpfWQ9CmQuc29ydCgpOzI9PWQubGVuZ3RoJiYiTm8iPT1kWzBdJiYiWWVzIj09ZFsxXSYmKGQ9ZC5yZXZlcnNlKCkpO3ZhciBrPUFycmF5KGQubGVuZ3RoKTtfLmZpbGwoaywwKTt2YXIgbj1bXTtmb3IoYz0wO2M8ZC5sZW5ndGg7YysrKWY9QXJyYXkoZC5sZW5ndGgpLF8uZmlsbChmLDApLG4ucHVzaChmKTtmb3IoYz0wO2M8ZC5sZW5ndGg7YysrKWZvcihmPTA7ZjxkLmxlbmd0aDtmKyspZz1kW2NdLGw9ZFtmXSxnIGluIGEmJmwgaW4gYVtnXSYmKG5bY11bZl09YVtnXVtsXSk7YT1bXTt2YXIgcD0wO2ZvcihjPTA7YzxuLmxlbmd0aDtjKyspZm9yKGY9bltjXS5yZWR1Y2UoKHEscik9PnErciwwKSxhLnB1c2goWzBdLmNvbmNhdChuW2NdKS5jb25jYXQoW2ZdKSksZj0wO2Y8bi5sZW5ndGg7ZisrKWtbZl0rPW5bY11bZl0scCs9bltjXVtmXTtjPXRoaXMuZ2V0SW5kaWNlcyhuLmxlbmd0aCsyKTtsPWQzLnNlbGVjdCh0aGlzLiQuaG9sZGVyKS5hcHBlbmQoInRhYmxlIik7Zj1sLmFwcGVuZCgidGhlYWQiKTsKZz1sLmFwcGVuZCgidGJvZHkiKTtsPWwuYXBwZW5kKCJ0Zm9vdCIpO2YuYXBwZW5kKCJ0ciIpLnNlbGVjdEFsbCgidGgiKS5kYXRhKGMpLmVudGVyKCkuYXBwZW5kKCJ0aCIpLnRleHQocT0+MD09cT90aGlzLmxhYmVsOnE8PW4ubGVuZ3RoPyJQcmVkaWN0ZWQgIitkW3EtMV06IlRvdGFsIikuYXR0cigiY2xhc3MiLHE9PjA9PXE/Im4tbGFiZWwiOnE8PW4ubGVuZ3RoPyJwcmVkLWxhYmVsIjoidG90YWwtbGFiZWwiKTthPWcuc2VsZWN0QWxsKCJ0ciIpLmRhdGEoYSkuZW50ZXIoKS5hcHBlbmQoInRyIikuc2VsZWN0QWxsKCJ0ZCIpLmRhdGEoKHEscik9PnEubWFwKCh0LHYpPT4wPT12P3t2YWx1ZToiQWN0dWFsICIrZFtyXX06e3ZhbHVlOnQscm93OnJ9KSkuZW50ZXIoKS5hcHBlbmQoInRkIikuYXR0cigiY2xhc3MiLChxLHIpPT4wPT1yPyJhY3R1YWwtbGFiZWwiOnI8PW4ubGVuZ3RoPyJ2YWx1ZS1jZWxsIjoidG90YWwtY2VsbCIpLnN0eWxlKCJiYWNrZ3JvdW5kIiwocSxyKT0+e2lmKDA9PQpyfHxyPm4ubGVuZ3RoKXJldHVybiIjRkZGRkZGIjtyPXRoaXMuYmFja2dyb3VuZDtyLm9wYWNpdHk9cS52YWx1ZS9wO3JldHVybiByKyIifSkuYXBwZW5kKCJkaXYiKS5jbGFzc2VkKCJmbGV4IiwhMCk7YS5hcHBlbmQoImRpdiIpLmNsYXNzZWQoInBhcmVudGhldGljYWwiLChxLHIpPT4hIXIpLnRleHQocT0+InJvdyJpbiBxPyIoIitxLnZhbHVlKyIpIjoiIik7YS5hcHBlbmQoImRpdiIpLnRleHQoKHEscik9PjA8cj9kMy5mb3JtYXQoIiwuMSUiKShxLnZhbHVlL3ApOnEudmFsdWUpO2E9bC5hcHBlbmQoInRyIikuc2VsZWN0QWxsKCJ0ZCIpLmRhdGEoYykuZW50ZXIoKS5hcHBlbmQoInRkIik7YS5jbGFzc2VkKCJ0b3RhbC1sYWJlbCIsKHEscik9PjA9PXIpO2EuY2xhc3NlZCgidG90YWwtY2VsbCIsKHEscik9PjAhPXIpO2E9YS5hcHBlbmQoImRpdiIpLmNsYXNzZWQoImZsZXgiLCEwKTthLmFwcGVuZCgiZGl2IikuY2xhc3NlZCgicGFyZW50aGV0aWNhbCIsKHEscik9PiEhcikudGV4dChxPT4KMD09cT8iVG90YWwiOnE8PW4ubGVuZ3RoPyIoIitrW3EtMV0rIikiOiIiKTthLmFwcGVuZCgiZGl2IikudGV4dChxPT4wPT1xPyIiOnE8PW4ubGVuZ3RoP2QzLmZvcm1hdCgiLC4xJSIpKGtbcS0xXS9wKToiIil9fSxnZXRJbmRpY2VzOmZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5hcHBseShudWxsLHtsZW5ndGg6YX0pLm1hcChOdW1iZXIuY2FsbCxOdW1iZXIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWludGVyYWN0aXZlLWluZmVyZW5jZS1kYXNoYm9hcmQvdGYtaW5mZXJlbmNlLXZpZXdlci5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1pbmZlcmVuY2Utdmlld2VyIixwcm9wZXJ0aWVzOntpbmZlcmVuY2VzOkFycmF5LG1vZGVsVHlwZTpTdHJpbmcsbW9kZWxOYW1lczpBcnJheSxtYXhFbnRyaWVzUGVyUnVuOnt0eXBlOk51bWJlcix2YWx1ZTo1fX0sZ2V0TGFiZWw6ZnVuY3Rpb24oYSl7bGV0IGM9YS5sYWJlbDthLnZvY2FiTGFiZWwmJihjKz0iICgiK2Eudm9jYWJMYWJlbCsiKSIpO3JldHVybiBjfSxnZXRMYWJlbENsYXNzOmZ1bmN0aW9uKGEpe3JldHVybiJjbGFzc2lmaWNhdGlvbiI9PWE/InNob3ctbGFiZWwgdGV4dCI6Im5vLWxhYmVsIn0sZ2V0TGFiZWxIZWFkZXJDbGFzczpmdW5jdGlvbihhKXtyZXR1cm4iY2xhc3NpZmljYXRpb24iPT1hPyJzaG93LWxhYmVsIjoibm8tbGFiZWwifSxnZXRNb2RlbENsYXNzOmZ1bmN0aW9uKGEpe3JldHVybiBhJiYxPGFbMF0ubGVuZ3RoPyJtdWx0aS1tb2RlbCB0ZXh0Ijoib25lLW1vZGVsIn0sZ2V0TW9kZWxIZWFkZXJDbGFzczpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCjE8YVswXS5sZW5ndGg/Im11bHRpLW1vZGVsIjoib25lLW1vZGVsIn0sZ2V0U2NvcmVMYWJlbDpmdW5jdGlvbihhKXtyZXR1cm4iY2xhc3NpZmljYXRpb24iPT1hPyJTY29yZSI6IlZhbHVlIn0sZ2V0SWNvbkNsYXNzOmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gdGhpcy5nZXRJY29uRGVjaXNpb24oYSxjLGQsImdyZWVuIiwicmVkIil9LGdldEljb246ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmdldEljb25EZWNpc2lvbihhLGMsZCwiaWNvbnM6YXJyb3ctdXB3YXJkIiwiaWNvbnM6YXJyb3ctZG93bndhcmQiKX0sZ2V0SWNvbkRlY2lzaW9uOmZ1bmN0aW9uKGEsYyxkLGYsZyl7aWYoMD09YSlyZXR1cm4iIjtjb25zdCBsPXRoaXMuaW5mZXJlbmNlc1thXVtkXVtjXS5sYWJlbDtjPXRoaXMuaW5mZXJlbmNlc1thXVtkXVtjXS5zY29yZTthPXRoaXMuaW5mZXJlbmNlc1thLTFdW2RdO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspaWYoYVtkXS5sYWJlbD09bCl7aWYoYVtkXS5zY29yZT5jKXJldHVybiBnOwppZihhW2RdLnNjb3JlPGMpYnJlYWs7cmV0dXJuIiJ9cmV0dXJuIGZ9LGdldFJ1bk51bWJlcjpmdW5jdGlvbihhKXtyZXR1cm4gYSsxfSxnZXRNb2RlbE5hbWU6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYVtjXX0sZ2V0TWFya2VyQ2xhc3M6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiJtYXJrZXIiKyhudWxsIT1jJiZhPT1jLmxlbmd0aC0xPzA9PWQ/IiBtYXJrLW9uZSI6IiBtYXJrLXR3byI6IiIpfSxnZXRSb3dDbGFzczpmdW5jdGlvbihhLGMsZCl7bGV0IGY9InJvdyAiO3JldHVybiBmPW51bGwhPWMmJmE9PWMubGVuZ3RoLTE/ZisoMD09ZD8iZGFyay1yb3ctb25lIjoiZGFyay1yb3ctdHdvIik6Zisid2hpdGUtcm93In0sZ2V0SW5mZXJlbmNlOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxnZXRQcmludGFibGVTY29yZTpmdW5jdGlvbihhKXtyZXR1cm4gYS50b0ZpeGVkKDMpfSxnZXRQcmludGFibGVEZWx0YTpmdW5jdGlvbihhLGMsZCl7aWYoMD09YSlyZXR1cm4iIjtjb25zdCBmPXRoaXMuaW5mZXJlbmNlc1thXVtkXVtjXS5sYWJlbDsKYz10aGlzLmluZmVyZW5jZXNbYV1bZF1bY10uc2NvcmU7YT10aGlzLmluZmVyZW5jZXNbYS0xXVtkXTtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWlmKGFbZF0ubGFiZWw9PWYpcmV0dXJuKGMtYVtkXS5zY29yZSkudG9GaXhlZCg2KTtyZXR1cm4iIn0sZ2V0SW5mZXJlbmNlTGlzdDpmdW5jdGlvbihhLGMpe3JldHVybiBhLnNsaWNlKDAsYyl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLWRpdmUvbGliL2JvdW5kZWQtb2JqZWN0LmpzCi8qCgogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4KCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KdmFyIEZwOyhmdW5jdGlvbihhKXthW2EuQm90dG9tPTBdPSJCb3R0b20iO2FbYS5MZWZ0PTFdPSJMZWZ0IjthW2EuUmlnaHQ9Ml09IlJpZ2h0IjthW2EuVG9wPTNdPSJUb3AifSkoRnB8fChGcD17fSkpOwpjbGFzcyBHcHtzaG91bGRCZVZpc2libGUoYSxjLGQsZil7aWYodm9pZCAwIT09dGhpcy5taW5TY2FsZSlyZXR1cm4gdGhpcy5zY2FsZURvd258fGM+PXRoaXMubWluU2NhbGU7aWYoIXRoaXMuYm91bmRpbmdCb3gpcmV0dXJuITA7Y29uc3QgZz10aGlzLmJvdW5kaW5nQm94O2lmKGcubGVmdD5kLngrZi5yaWdodHx8Zy5yaWdodDxkLngrZi5sZWZ0fHxnLmJvdHRvbT5kLnkrZi50b3B8fGcudG9wPGQueStmLmJvdHRvbSlyZXR1cm4hMTtmPXRoaXMuZWxlbWVudE1hcmdpbnx8e2JvdHRvbTowLGxlZnQ6MCxyaWdodDowLHRvcDowfTtkPXZvaWQgMD09PXRoaXMud2lkdGg/YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCtmLmxlZnQrZi5yaWdodDp0aGlzLndpZHRoO2E9dm9pZCAwPT09dGhpcy5oZWlnaHQ/YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQrZi50b3ArZi5ib3R0b206dGhpcy5oZWlnaHQ7Zj1pc0Zpbml0ZShnLnRvcCkmJmlzRmluaXRlKGcuYm90dG9tKT8KZy50b3AtZy5ib3R0b206SW5maW5pdHk7cmV0dXJuKGlzRmluaXRlKGcubGVmdCkmJmlzRmluaXRlKGcucmlnaHQpP2cucmlnaHQtZy5sZWZ0OkluZmluaXR5KSpjPj1kJiZmKmM+PWF9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9mYWNldHMtZGl2ZS9saWIvc29ydGluZy5qcwpmdW5jdGlvbiBIcChhLGMpe3JldHVybiBudWxsIT09YSYmdm9pZCAwIT09YXx8bnVsbCE9PWMmJnZvaWQgMCE9PWM/bnVsbD09PWF8fHZvaWQgMD09PWE/LTE6bnVsbD09PWN8fHZvaWQgMD09PWM/MToibnVtYmVyIj09PXR5cGVvZiBhJiYibnVtYmVyIj09PXR5cGVvZiBjP2lzTmFOKGEpJiZpc05hTihjKT8wOmlzTmFOKGEpPy0xOmlzTmFOKGMpPzE6YS1jOiJzdHJpbmciIT09dHlwZW9mIGE/LTE6InN0cmluZyIhPT10eXBlb2YgYz8xOmEubG9jYWxlQ29tcGFyZShjKTphPT09Yz8wOnZvaWQgMD09PWE/LTE6MX0KZnVuY3Rpb24gSXAoYSxjKXtyZXR1cm4gbnVsbCE9PWEmJnZvaWQgMCE9PWF8fG51bGwhPT1jJiZ2b2lkIDAhPT1jP251bGw9PT1hfHx2b2lkIDA9PT1hPy0xOm51bGw9PT1jfHx2b2lkIDA9PT1jPzE6Im51bWJlciI9PT10eXBlb2YgYSYmIm51bWJlciI9PT10eXBlb2YgYz9pc05hTihhKSYmaXNOYU4oYyk/MDppc05hTihhKT8tMTppc05hTihjKT8xOmMtYToic3RyaW5nIiE9PXR5cGVvZiBhPy0xOiJzdHJpbmciIT09dHlwZW9mIGM/MTotYS5sb2NhbGVDb21wYXJlKGMpOmE9PT1jPzA6dm9pZCAwPT09YT8tMToxfQpmdW5jdGlvbiBKcChhLGMpe3JldHVybiBudWxsIT09YSYmdm9pZCAwIT09YXx8bnVsbCE9PWMmJnZvaWQgMCE9PWM/bnVsbD09PWF8fHZvaWQgMD09PWE/LTE6bnVsbD09PWN8fHZvaWQgMD09PWM/MToic3RyaW5nIj09PXR5cGVvZiBhJiYic3RyaW5nIj09PXR5cGVvZiBjP2EubG9jYWxlQ29tcGFyZShjKToibnVtYmVyIiE9PXR5cGVvZiBhPy0xOiJudW1iZXIiIT09dHlwZW9mIGM/MTppc05hTihhKSYmaXNOYU4oYyk/MDppc05hTihhKT8tMTppc05hTihjKT8xOmEtYzphPT09Yz8wOnZvaWQgMD09PWE/LTE6MX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLWRpdmUvbGliL2dyaWQuanMKY29uc3QgS3A9KGEsYyxkLGYpPT57YT1NYXRoLmZsb29yKDFFLTYrZC5taW5XaWR0aC9mLml0ZW1Bc3BlY3RSYXRpbyk7cmV0dXJuIDE8YT9jJWEvKGEtMSk6MH0sTHA9KGEsYyxkLGYpPT57YT1NYXRoLmZsb29yKDFFLTYrZC5taW5XaWR0aC9mLml0ZW1Bc3BlY3RSYXRpbyk7ZD1NYXRoLmNlaWwoZC5pdGVtcy5sZW5ndGgvYSk7cmV0dXJuIDE8ZD9NYXRoLmZsb29yKGMvYSkvKGQtMSk6MH0sTXA9KGEsYyk9Pntjb25zdCBkPSJyaWdodCI9PT1jPzE6Im1pZGRsZSI9PT1jPy41OjAsZj0idG9wIj09PWE/MToibWlkZGxlIj09PWE/LjU6MDtyZXR1cm4oZyxsLGssbik9Pntjb25zdCBwPWsuaW5uZXJXaWR0aC1uLml0ZW1Bc3BlY3RSYXRpbyxxPWsuaW5uZXJIZWlnaHQtMTtyZXR1cm57eDpLcChnLGwsayxuKS9wKihrLm1pbldpZHRoLW4uaXRlbUFzcGVjdFJhdGlvKStkKihrLmlubmVyV2lkdGgtay5taW5XaWR0aCkvcCx5OkxwKGcsbCxrLG4pL3EqKGsubWluSGVpZ2h0LTEpK2YqKGsuaW5uZXJIZWlnaHQtCmsubWluSGVpZ2h0KS9xfX19LE5wPU1wKCJib3R0b20iLCJsZWZ0Iik7dmFyIE9wOyhmdW5jdGlvbihhKXthW2EuVGlnaHQ9MF09IlRpZ2h0IjthW2EuVW5pZm9ybT0xXT0iVW5pZm9ybSJ9KShPcHx8KE9wPXt9KSk7CmNsYXNzIFBwe2NvbnN0cnVjdG9yKGEpe3RoaXMuaXRlbXM9YTt0aGlzLmNlbGxNYXJnaW49dGhpcy5pdGVtQXNwZWN0UmF0aW89MTt0aGlzLmNlbGxQYWRkaW5nPXtib3R0b206MCxsZWZ0OjAscmlnaHQ6MCx0b3A6MH07dGhpcy50YXJnZXRHcmlkQXNwZWN0UmF0aW89MTt0aGlzLm1pbkNlbGxBc3BlY3RSYXRpbz0wO3RoaXMubWF4Q2VsbEFzcGVjdFJhdGlvPUluZmluaXR5O3RoaXMudmVydGljYWxGYWNldD0oKT0+bnVsbDt0aGlzLmhvcml6b250YWxGYWNldD0oKT0+bnVsbDt0aGlzLnZlcnRpY2FsS2V5Q29tcGFyZT1JcDt0aGlzLmhvcml6b250YWxLZXlDb21wYXJlPUhwO3RoaXMudmVydGljYWxLZXlzPVtdO3RoaXMudmVydGljYWxLZXlzSGFzaD17fTt0aGlzLmhvcml6b250YWxLZXlzPVtdO3RoaXMuaG9yaXpvbnRhbEtleXNIYXNoPXt9O3RoaXMuY2VsbHM9e307dGhpcy5oZWlnaHQ9dGhpcy53aWR0aD10aGlzLmxvbmdlc3RDZWxsTGVuZ3RoPTA7dGhpcy5pdGVtUG9zaXRpb25TZXR0ZXI9CihjLGQsZik9PntjLng9ZDtjLnk9Zn07dGhpcy5jb21wdXRlSXRlbVBvc2l0aW9uPU5wO3RoaXMuaG9yaXpvbnRhbEdyaWRBbGlnbm1lbnQ9dGhpcy52ZXJ0aWNhbEdyaWRBbGlnbm1lbnQ9T3AuVGlnaHQ7dGhpcy5jZWxsSXRlbUNvbXBhcmF0b3I9bnVsbH1jbGVhcigpe3RoaXMudmVydGljYWxLZXlzPVtdO3RoaXMudmVydGljYWxLZXlzSGFzaD17fTt0aGlzLmhvcml6b250YWxLZXlzPVtdO3RoaXMuaG9yaXpvbnRhbEtleXNIYXNoPXt9O3RoaXMuY2VsbHM9e307dGhpcy5oZWlnaHQ9dGhpcy53aWR0aD10aGlzLmxvbmdlc3RDZWxsTGVuZ3RoPTB9YXJyYW5nZSgpe3RoaXMuZmFjZXRJdGVtc0ludG9DZWxscygpO3ZhciBhPXRoaXMuY29tcHV0ZU9wdGltYWxDZWxsQXNwZWN0UmF0aW8odGhpcy50YXJnZXRHcmlkQXNwZWN0UmF0aW8pLGM9TWF0aC5taW4odGhpcy5tYXhDZWxsQXNwZWN0UmF0aW8sTWF0aC5tYXgodGhpcy5taW5DZWxsQXNwZWN0UmF0aW8sYSkpO2E9W107Y29uc3QgZD0KW107Zm9yKHZhciBmPTA7Zjx0aGlzLnZlcnRpY2FsS2V5cy5sZW5ndGg7ZisrKWZvcih2YXIgZz0wO2c8dGhpcy5ob3Jpem9udGFsS2V5cy5sZW5ndGg7ZysrKXt2YXIgbD10aGlzLmdldE9yQ3JlYXRlQ2VsbCh0aGlzLnZlcnRpY2FsS2V5c1tmXSx0aGlzLmhvcml6b250YWxLZXlzW2ddKTtbbC5taW5XaWR0aCxsLm1pbkhlaWdodF09dGhpcy5jb21wdXRlQ2VsbERpbWVuc2lvbnMoYyxsLml0ZW1zLmxlbmd0aCk7YVtmXT1NYXRoLm1heChhW2ZdfHwwLGwubWluSGVpZ2h0KTtkW2ddPU1hdGgubWF4KGRbZ118fDAsbC5taW5XaWR0aCl9Zm9yKGM9MDtjPHRoaXMudmVydGljYWxLZXlzLmxlbmd0aDtjKyspZm9yKGY9MDtmPHRoaXMuaG9yaXpvbnRhbEtleXMubGVuZ3RoO2YrKylnPXRoaXMuZ2V0Q2VsbCh0aGlzLnZlcnRpY2FsS2V5c1tjXSx0aGlzLmhvcml6b250YWxLZXlzW2ZdKSxjPHRoaXMudmVydGljYWxLZXlzLmxlbmd0aC0xJiYoZy5zaWJsaW5ncy5hYm92ZT10aGlzLmdldENlbGwodGhpcy52ZXJ0aWNhbEtleXNbYysKMV0sdGhpcy5ob3Jpem9udGFsS2V5c1tmXSkpLDA8YyYmKGcuc2libGluZ3MuYmVsb3c9dGhpcy5nZXRDZWxsKHRoaXMudmVydGljYWxLZXlzW2MtMV0sdGhpcy5ob3Jpem9udGFsS2V5c1tmXSkpLDA8ZiYmKGcuc2libGluZ3MubGVmdD10aGlzLmdldENlbGwodGhpcy52ZXJ0aWNhbEtleXNbY10sdGhpcy5ob3Jpem9udGFsS2V5c1tmLTFdKSksZjx0aGlzLmhvcml6b250YWxLZXlzLmxlbmd0aC0xJiYoZy5zaWJsaW5ncy5yaWdodD10aGlzLmdldENlbGwodGhpcy52ZXJ0aWNhbEtleXNbY10sdGhpcy5ob3Jpem9udGFsS2V5c1tmKzFdKSk7aWYodGhpcy52ZXJ0aWNhbEdyaWRBbGlnbm1lbnQ9PT1PcC5Vbmlmb3JtKWZvcihjPU1hdGgubWF4KC4uLmEpLGY9MDtmPGEubGVuZ3RoO2YrKylhW2ZdPWM7aWYodGhpcy5ob3Jpem9udGFsR3JpZEFsaWdubWVudD09PU9wLlVuaWZvcm0pZm9yKGM9TWF0aC5tYXgoLi4uZCksZj0wO2Y8ZC5sZW5ndGg7ZisrKWRbZl09Yztmb3IoYz0wO2M8dGhpcy52ZXJ0aWNhbEtleXMubGVuZ3RoO2MrKylmb3IoZj0KMDtmPHRoaXMuaG9yaXpvbnRhbEtleXMubGVuZ3RoO2YrKylnPXRoaXMuZ2V0Q2VsbCh0aGlzLnZlcnRpY2FsS2V5c1tjXSx0aGlzLmhvcml6b250YWxLZXlzW2ZdKSxnLmhlaWdodD1hW2NdLGcud2lkdGg9ZFtmXSxnLmlubmVySGVpZ2h0PWcuaGVpZ2h0LXRoaXMuY2VsbFBhZGRpbmcudG9wLXRoaXMuY2VsbFBhZGRpbmcuYm90dG9tLGcuaW5uZXJXaWR0aD1nLndpZHRoLXRoaXMuY2VsbFBhZGRpbmcubGVmdC10aGlzLmNlbGxQYWRkaW5nLnJpZ2h0O2M9dGhpcy5jZWxsTWFyZ2luKnRoaXMuaXRlbUFzcGVjdFJhdGlvO2ZvcihmPTA7Zjx0aGlzLnZlcnRpY2FsS2V5cy5sZW5ndGg7ZisrKWZvcihnPTA7Zzx0aGlzLmhvcml6b250YWxLZXlzLmxlbmd0aDtnKyspbD10aGlzLmdldENlbGwodGhpcy52ZXJ0aWNhbEtleXNbZl0sdGhpcy5ob3Jpem9udGFsS2V5c1tnXSksbC55PWY/dGhpcy5nZXRDZWxsKHRoaXMudmVydGljYWxLZXlzW2YtMV0sdGhpcy5ob3Jpem9udGFsS2V5c1tnXSkueSsKYVtmLTFdK2M6MCxsLmNvbnRlbnRZPWwueSt0aGlzLmNlbGxQYWRkaW5nLmJvdHRvbSxsLng9Zz90aGlzLmdldENlbGwodGhpcy52ZXJ0aWNhbEtleXNbZl0sdGhpcy5ob3Jpem9udGFsS2V5c1tnLTFdKS54K2RbZy0xXStjOjAsbC5jb250ZW50WD1sLngrdGhpcy5jZWxsUGFkZGluZy5sZWZ0O3RoaXMuZWFjaENlbGwoaz0+e3RoaXMud2lkdGg9TWF0aC5tYXgodGhpcy53aWR0aCxrLngray53aWR0aCk7dGhpcy5oZWlnaHQ9TWF0aC5tYXgodGhpcy5oZWlnaHQsay55K2suaGVpZ2h0KX0pO3RoaXMucG9zaXRpb25JdGVtcygpfXBvc2l0aW9uSXRlbXMoKXt0aGlzLmVhY2hDZWxsKGE9Pntjb25zdCBjPU1hdGgubWF4KDAsYS5pbm5lcldpZHRoLXRoaXMuaXRlbUFzcGVjdFJhdGlvKSxkPU1hdGgubWF4KDAsYS5pbm5lckhlaWdodC0xKSxmPWEuaXRlbXMuc2xpY2UoMCk7dGhpcy5jZWxsSXRlbUNvbXBhcmF0b3ImJmYuc29ydCh0aGlzLmNlbGxJdGVtQ29tcGFyYXRvcik7Zm9yKGxldCBnPQowO2c8Zi5sZW5ndGg7ZysrKXtjb25zdCBsPXRoaXMuY29tcHV0ZUl0ZW1Qb3NpdGlvbihmW2ddLGcsYSx0aGlzKTt0aGlzLml0ZW1Qb3NpdGlvblNldHRlcihmW2ddLGEuY29udGVudFgrKCFsfHxpc05hTihsLngpPzA6TWF0aC5tYXgoMCxNYXRoLm1pbigxLGwueCkpKSpjLGEuY29udGVudFkrKCFsfHxpc05hTihsLnkpPzA6TWF0aC5tYXgoMCxNYXRoLm1pbigxLGwueSkpKSpkKX19KX1mYWNldEl0ZW1zSW50b0NlbGxzKCl7dGhpcy5jbGVhcigpO3RoaXMuZWFjaEl0ZW0oYT0+e2NvbnN0IGM9dGhpcy5nZXRPckNyZWF0ZUNlbGwodGhpcy52ZXJ0aWNhbEZhY2V0KGEpLHRoaXMuaG9yaXpvbnRhbEZhY2V0KGEpKTtjLml0ZW1zLnB1c2goYSk7dGhpcy5sb25nZXN0Q2VsbExlbmd0aD1NYXRoLm1heCh0aGlzLmxvbmdlc3RDZWxsTGVuZ3RoLGMuaXRlbXMubGVuZ3RoKX0pO2Zvcihjb25zdCBhIGluIHRoaXMudmVydGljYWxLZXlzSGFzaCl0aGlzLnZlcnRpY2FsS2V5cy5wdXNoKHRoaXMudmVydGljYWxLZXlzSGFzaFthXSk7CnRoaXMudmVydGljYWxLZXlzLnNvcnQodGhpcy52ZXJ0aWNhbEtleUNvbXBhcmUpO2Zvcihjb25zdCBhIGluIHRoaXMuaG9yaXpvbnRhbEtleXNIYXNoKXRoaXMuaG9yaXpvbnRhbEtleXMucHVzaCh0aGlzLmhvcml6b250YWxLZXlzSGFzaFthXSk7dGhpcy5ob3Jpem9udGFsS2V5cy5zb3J0KHRoaXMuaG9yaXpvbnRhbEtleUNvbXBhcmUpfWVhY2hJdGVtKGEpe2lmKHRoaXMuaXRlbXMpZm9yKGxldCBjPTA7Yzx0aGlzLml0ZW1zLmxlbmd0aDtjKyspYS5jYWxsKHRoaXMsdGhpcy5pdGVtc1tjXSl9ZWFjaENlbGwoYSl7Zm9yKGNvbnN0IGMgaW4gdGhpcy5jZWxscylhLmNhbGwodGhpcyx0aGlzLmNlbGxzW2NdKX1nZXRDb21wb3VuZEtleShhLGMpe3JldHVybiB0eXBlb2YgYSsiXHUwMDFmIithKyJcdTAwMWUiK3R5cGVvZiBjKyJcdTAwMWYiK2N9Z2V0Q2VsbChhLGMpe2E9dGhpcy5nZXRDb21wb3VuZEtleShhLGMpO3JldHVybiBhIGluIHRoaXMuY2VsbHM/dGhpcy5jZWxsc1thXTpudWxsfWdldENlbGxzKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuY2VsbHMpLm1hcChhPT4KdGhpcy5jZWxsc1thXSl9Z2V0T3JDcmVhdGVDZWxsKGEsYyl7bGV0IGQ9dGhpcy5nZXRDZWxsKGEsYyk7aWYoZClyZXR1cm4gZDt0aGlzLmFkZFZlcnRpY2FsS2V5KGEpO3RoaXMuYWRkSG9yaXpvbnRhbEtleShjKTtjb25zdCBmPXRoaXMuZ2V0Q29tcG91bmRLZXkoYSxjKTtkPXt2ZXJ0aWNhbEtleTphLGhvcml6b250YWxLZXk6Yyxjb21wb3VuZEtleTpmLGl0ZW1zOltdLHNpYmxpbmdzOnt9fTtyZXR1cm4gdGhpcy5jZWxsc1tmXT1kfWdldFJvdyhhKXtjb25zdCBjPVtdO2ZvcihsZXQgZD0wO2Q8dGhpcy5ob3Jpem9udGFsS2V5cy5sZW5ndGg7ZCsrKXtjb25zdCBmPXRoaXMuZ2V0Q2VsbChhLHRoaXMuaG9yaXpvbnRhbEtleXNbZF0pO2YmJmMucHVzaChmKX1yZXR1cm4gY31nZXRDb2x1bW4oYSl7Y29uc3QgYz1bXTtmb3IobGV0IGQ9MDtkPHRoaXMudmVydGljYWxLZXlzLmxlbmd0aDtkKyspe2NvbnN0IGY9dGhpcy5nZXRDZWxsKHRoaXMudmVydGljYWxLZXlzW2RdLGEpO2YmJmMucHVzaChmKX1yZXR1cm4gY31hZGRWZXJ0aWNhbEtleShhKXtjb25zdCBjPQp0eXBlb2YgYSsiXHUwMDFmIithO2MgaW4gdGhpcy52ZXJ0aWNhbEtleXNIYXNofHwodGhpcy52ZXJ0aWNhbEtleXNIYXNoW2NdPWEpfWFkZEhvcml6b250YWxLZXkoYSl7Y29uc3QgYz10eXBlb2YgYSsiXHUwMDFmIithO2MgaW4gdGhpcy5ob3Jpem9udGFsS2V5c0hhc2h8fCh0aGlzLmhvcml6b250YWxLZXlzSGFzaFtjXT1hKX1jb21wdXRlT3B0aW1hbENlbGxBc3BlY3RSYXRpbyhhKXt2YXIgYz10aGlzLnZlcnRpY2FsS2V5cy5sZW5ndGgsZD10aGlzLmhvcml6b250YWxLZXlzLmxlbmd0aDtpZighY3x8IWQpcmV0dXJuIDE7bGV0IGY9Yy9kLGc9ZixsPUluZmluaXR5LGs9MCxuPUluZmluaXR5O2M9TWF0aC5taW4oMjAsTWF0aC5tYXgoYyxkLHRoaXMubG9uZ2VzdENlbGxMZW5ndGgpKTtmb3IoZD0wO2Q8Yzspe2QrKztjb25zdCBwPXRoaXMuY29tcHV0ZUdyaWRBc3BlY3RSYXRpbyhmKSxxPU1hdGguYWJzKDEtcC9hKTtxPGwmJihnPWYsbD1xKTtpZiguMDAxPnEpYnJlYWs7cD5hPyhuPQpmLGYtPShuLWspLzIpOihrPWYsZj1pc0Zpbml0ZShuKT9mKyhuLWspLzI6MipmKX1yZXR1cm4gZ31jb21wdXRlR3JpZEFzcGVjdFJhdGlvKGEpe2NvbnN0IGM9dGhpcy52ZXJ0aWNhbEtleXMubGVuZ3RoLGQ9dGhpcy5ob3Jpem9udGFsS2V5cy5sZW5ndGg7bGV0IGY9LUluZmluaXR5LGc9LUluZmluaXR5LGw9LUluZmluaXR5LGs9LUluZmluaXR5O2NvbnN0IG49W107Zm9yKGxldCBwPTA7cDxjO3ArKyl7bltwXT1bXTtmb3IobGV0IHE9MDtxPGQ7cSsrKXtjb25zdCByPW5bcF1bcV09e3dpZHRoOnE/bltwXVtxLTFdLndpZHRoOjAsaGVpZ2h0OnA/bltwLTFdW3FdLmhlaWdodDowfSx0PXRoaXMuZ2V0Q2VsbCh0aGlzLnZlcnRpY2FsS2V5c1twXSx0aGlzLmhvcml6b250YWxLZXlzW3FdKTtpZighdHx8IXQuaXRlbXN8fCF0Lml0ZW1zLmxlbmd0aCljb250aW51ZTtjb25zdCBbdix5XT10aGlzLmNvbXB1dGVDZWxsRGltZW5zaW9ucyhhLHQuaXRlbXMubGVuZ3RoKTtyLndpZHRoKz12O3IuaGVpZ2h0Kz0KeTtmPU1hdGgubWF4KGYsci53aWR0aCk7Zz1NYXRoLm1heChnLHkpO2w9TWF0aC5tYXgobCx2KTtrPU1hdGgubWF4KGssci5oZWlnaHQpfX10aGlzLnZlcnRpY2FsR3JpZEFsaWdubWVudD09PU9wLlVuaWZvcm0mJihrPWcqYyk7dGhpcy5ob3Jpem9udGFsR3JpZEFsaWdubWVudD09PU9wLlVuaWZvcm0mJihmPWwqZCk7YT10aGlzLmNlbGxNYXJnaW4qdGhpcy5pdGVtQXNwZWN0UmF0aW87cmV0dXJuKGYrYSooZC0xKSkvKGsrYSooYy0xKSl9Y29tcHV0ZUNlbGxEaW1lbnNpb25zKGEsYyl7Y29uc3QgZD1bdGhpcy5pdGVtQXNwZWN0UmF0aW8qKHRoaXMuY2VsbFBhZGRpbmcubGVmdCt0aGlzLmNlbGxQYWRkaW5nLnJpZ2h0KSx0aGlzLml0ZW1Bc3BlY3RSYXRpbyoodGhpcy5jZWxsUGFkZGluZy50b3ArdGhpcy5jZWxsUGFkZGluZy5ib3R0b20pXTtpZighYylyZXR1cm4gZDthPU1hdGgubWluKGMsTWF0aC5jZWlsKE1hdGguc3FydChhKmMpL3RoaXMuaXRlbUFzcGVjdFJhdGlvKSk7ZFswXSs9CnRoaXMuaXRlbUFzcGVjdFJhdGlvKmE7ZFsxXSs9TWF0aC5jZWlsKGMvYSk7cmV0dXJuIGR9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9mYWNldHMtZGl2ZS9saWIvYXhpcy5qcwpjbGFzcyBRcCBleHRlbmRzIEdwe2NvbnN0cnVjdG9yKGEsYyl7c3VwZXIoKTt0aGlzLnNpZGU9YTt0aGlzLmNlbGw9Yztzd2l0Y2goYSl7Y2FzZSBGcC5MZWZ0OnRoaXMubWluU2NhbGU9MzAvYy5pbm5lckhlaWdodDtmb3IoYT1jLnNpYmxpbmdzLmxlZnQ7ISghYXx8YS5pdGVtcy5sZW5ndGh8fGEuc2libGluZ3MuYWJvdmUmJmEuc2libGluZ3MuYWJvdmUuaXRlbXMubGVuZ3RoKTspYT1hLnNpYmxpbmdzLmxlZnQ7YSYmKHRoaXMubWluU2NhbGU9TWF0aC5tYXgodGhpcy5taW5TY2FsZSwzOS4yLyhjLmNvbnRlbnRYLShhLmNvbnRlbnRYK2EuaW5uZXJXaWR0aCkpKSk7YnJlYWs7Y2FzZSBGcC5Cb3R0b206dGhpcy5taW5TY2FsZT0zMC9jLmlubmVyV2lkdGg7Zm9yKGE9Yy5zaWJsaW5ncy5iZWxvdzshKCFhfHxhLml0ZW1zLmxlbmd0aHx8YS5zaWJsaW5ncy5yaWdodCYmYS5zaWJsaW5ncy5yaWdodC5pdGVtcy5sZW5ndGgpOylhPWEuc2libGluZ3MuYmVsb3c7YSYmKHRoaXMubWluU2NhbGU9Ck1hdGgubWF4KHRoaXMubWluU2NhbGUsMzkuMi8oYy5jb250ZW50WS0oYS5jb250ZW50WSthLmlubmVySGVpZ2h0KSkpKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJBeGVzIGZvciBzcGVjaWZpZWQgc2lkZSBhcmUgbm90IGltcGxlbWVudGVkLiIpO319c3Ryb2tlV2lkdGgoYSl7cmV0dXJuIDEuMi9hfXBhdGgoYSl7Y29uc3QgYz00L2EsZD02L2E7cmV0dXJuIHRoaXMuc2lkZT09PUZwLkxlZnQ/YE0gJHt0aGlzLmNlbGwuY29udGVudFgtYy1kfSwke3RoaXMuY2VsbC5jb250ZW50WSsuNi9hfSBoICR7ZH0gdiAke3RoaXMuY2VsbC5pbm5lckhlaWdodC0xLjIvYX0gaCAtJHtkfWA6dGhpcy5zaWRlPT09RnAuQm90dG9tP2BNICR7dGhpcy5jZWxsLmNvbnRlbnRYKy42L2F9LCR7dGhpcy5jZWxsLmNvbnRlbnRZLWMtZH0gdiAke2R9IGggJHt0aGlzLmNlbGwuaW5uZXJXaWR0aC0xLjIvYX0gdiAtJHtkfWA6IiJ9a2V5KCl7cmV0dXJuYCR7dGhpcy5jZWxsLmNvbXBvdW5kS2V5fS0ke3RoaXMuc2lkZX1gfX0KOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2ZhY2V0cy1kaXZlL2xpYi9kYXRhLWV4YW1wbGUuanMKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9mYWNldHMtZGl2ZS9saWIvbGFiZWwuanMKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9mYWNldHMtZGl2ZS9saWIvbGF5b3V0LmpzCmNsYXNzIFJwe2NvbnN0cnVjdG9yKCl7dGhpcy5ncmlkPXtib3R0b206MCxsZWZ0OjAscmlnaHQ6MCx0b3A6MH07dGhpcy52aWV3cG9ydD17aGVpZ2h0OjAsd2lkdGg6MH07dGhpcy5wYWRkaW5nPXtib3R0b206MCxsZWZ0OjAscmlnaHQ6MCx0b3A6MH19Y29tcHV0ZVNjYWxlKCl7Y29uc3QgYT10aGlzLnZpZXdwb3J0LndpZHRoLXRoaXMucGFkZGluZy5sZWZ0LXRoaXMucGFkZGluZy5yaWdodCxjPXRoaXMudmlld3BvcnQuaGVpZ2h0LXRoaXMucGFkZGluZy50b3AtdGhpcy5wYWRkaW5nLmJvdHRvbTtpZihpc05hTihhKXx8MD49YXx8aXNOYU4oYyl8fDA+PWMpcmV0dXJuIE5hTjtjb25zdCBkPXRoaXMuZ3JpZC5yaWdodC10aGlzLmdyaWQubGVmdCxmPXRoaXMuZ3JpZC50b3AtdGhpcy5ncmlkLmJvdHRvbTtyZXR1cm4gaXNOYU4oZCl8fDA+PWR8fGlzTmFOKGYpfHwwPj1mP05hTjphL2M+ZC9mP2MvZjphL2R9Y29tcHV0ZUNhbWVyYSgpe2NvbnN0IGE9dGhpcy5jb21wdXRlU2NhbGUoKTsKaWYoaXNOYU4oYSl8fDA+PWEpcmV0dXJue3Bvc2l0aW9uOnt4Ok5hTix5Ok5hTn0sZnJ1c3R1bTp7Ym90dG9tOk5hTixsZWZ0Ok5hTixyaWdodDpOYU4sdG9wOk5hTn19O2NvbnN0IGM9dGhpcy52aWV3cG9ydC53aWR0aC9hLGQ9dGhpcy52aWV3cG9ydC5oZWlnaHQvYTtyZXR1cm57cG9zaXRpb246e3g6dGhpcy5ncmlkLmxlZnQtKGMtKHRoaXMucGFkZGluZy5sZWZ0K3RoaXMucGFkZGluZy5yaWdodCkvYS0odGhpcy5ncmlkLnJpZ2h0LXRoaXMuZ3JpZC5sZWZ0KSkvMi10aGlzLnBhZGRpbmcubGVmdC9hLHk6dGhpcy5ncmlkLnRvcCsoZC0odGhpcy5wYWRkaW5nLnRvcCt0aGlzLnBhZGRpbmcuYm90dG9tKS9hLSh0aGlzLmdyaWQudG9wLXRoaXMuZ3JpZC5ib3R0b20pKS8yK3RoaXMucGFkZGluZy50b3AvYX0sZnJ1c3R1bTp7Ym90dG9tOi1kLGxlZnQ6MCxyaWdodDpjLHRvcDowfX19cmVkdWNlUGFkZGluZ1RvRml0V2lkdGgoYSl7aWYoMjAwPmEpdGhpcy5wYWRkaW5nLmxlZnQ9MCx0aGlzLnBhZGRpbmcucmlnaHQ9CjA7ZWxzZSBpZih0aGlzLnBhZGRpbmcubGVmdCt0aGlzLnBhZGRpbmcucmlnaHQrMjAwPmEpe2NvbnN0IGM9dGhpcy5wYWRkaW5nLmxlZnQrdGhpcy5wYWRkaW5nLnJpZ2h0O2EtPTIwMDt0aGlzLnBhZGRpbmcubGVmdD10aGlzLnBhZGRpbmcubGVmdC9jKmF8fDA7dGhpcy5wYWRkaW5nLnJpZ2h0PXRoaXMucGFkZGluZy5yaWdodC9jKmF8fDB9fXJlZHVjZVBhZGRpbmdUb0ZpdEhlaWdodChhKXtpZigyMDA+YSl0aGlzLnBhZGRpbmcudG9wPTAsdGhpcy5wYWRkaW5nLmJvdHRvbT0wO2Vsc2UgaWYodGhpcy5wYWRkaW5nLnRvcCt0aGlzLnBhZGRpbmcuYm90dG9tKzIwMD5hKXtjb25zdCBjPXRoaXMucGFkZGluZy50b3ArdGhpcy5wYWRkaW5nLmJvdHRvbTthLT0yMDA7dGhpcy5wYWRkaW5nLnRvcD10aGlzLnBhZGRpbmcudG9wL2MqYXx8MDt0aGlzLnBhZGRpbmcuYm90dG9tPXRoaXMucGFkZGluZy5ib3R0b20vYyphfHwwfX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2ZhY2V0cy1kaXZlL2xpYi90ZXh0LmpzCnZhciBTcDsoZnVuY3Rpb24oYSl7YVthLkxlZnQ9MF09IkxlZnQiO2FbYS5SaWdodD0xXT0iUmlnaHQiO2FbYS5DZW50ZXI9Ml09IkNlbnRlciJ9KShTcHx8KFNwPXt9KSk7dmFyIFRwOyhmdW5jdGlvbihhKXthW2EuVG9wPTBdPSJUb3AiO2FbYS5Cb3R0b209MV09IkJvdHRvbSI7YVthLk1pZGRsZT0yXT0iTWlkZGxlIn0pKFRwfHwoVHA9e30pKTtjb25zdCBVcD17eDowLHk6MCxnbHlwaEFzcGVjdFJhdGlvOi42LGxpbmVIZWlnaHQ6MS4xLGhvcml6b250YWxBbGlnbjpTcC5DZW50ZXIsdmVydGljYWxBbGlnbjpUcC5NaWRkbGV9OwpjbGFzcyBWcHtjb25zdHJ1Y3RvcihhKXt0aGlzLnNldHRpbmdzPU9iamVjdC5hc3NpZ24oe30sVXAsYSl9Zml0KGEpe2E9YS50cmltKCk7Y29uc3Qge21heDpjLHNlZ21lbnRzOmR9PXRoaXMuc3BsaXQoYSkse2N1dG9mZjpmLHdpZHRoOmcsaGVpZ2h0Omx9PXRoaXMuY29tcHV0ZUN1dG9mZihkLGEubGVuZ3RoLGMpO2E9Zyp0aGlzLnNldHRpbmdzLmdseXBoQXNwZWN0UmF0aW87YT1hL2w+dGhpcy5zZXR0aW5ncy53aWR0aC90aGlzLnNldHRpbmdzLmhlaWdodD90aGlzLnNldHRpbmdzLndpZHRoL2E6dGhpcy5zZXR0aW5ncy5oZWlnaHQvbDtjb25zdCBrPXRoaXMuc2V0dGluZ3MuaG9yaXpvbnRhbEFsaWduPT09U3AuTGVmdD8wOnRoaXMuc2V0dGluZ3MuaG9yaXpvbnRhbEFsaWduPT09U3AuUmlnaHQ/MTouNSxuPU1hdGgubWF4KDAsdGhpcy5zZXR0aW5ncy5oZWlnaHQtbCphKSoodGhpcy5zZXR0aW5ncy52ZXJ0aWNhbEFsaWduPT09VHAuVG9wPzA6dGhpcy5zZXR0aW5ncy52ZXJ0aWNhbEFsaWduPT09ClRwLkJvdHRvbT8xOi41KSxwPXRoaXMud3JhcExpbmVzKGQsZikscT1bXTtmb3IobGV0IHI9MDtyPHAubGVuZ3RoO3IrKyl7Y29uc3Qge3N0YXJ0UG9zOnQsZW5kUG9zOnZ9PXBbcl07bGV0IHk9IiI7Zm9yKGxldCB6PXQ7ejx2O3orKyl5Kz1kW3pdLnRleHQ7cS5wdXNoKHt0ZXh0OnkseDp0aGlzLnNldHRpbmdzLngraypNYXRoLm1heCgwLHRoaXMuc2V0dGluZ3Mud2lkdGgteS5sZW5ndGgqdGhpcy5zZXR0aW5ncy5nbHlwaEFzcGVjdFJhdGlvKmEpLHk6dGhpcy5zZXR0aW5ncy55K24rcip0aGlzLnNldHRpbmdzLmxpbmVIZWlnaHQqYX0pfXJldHVybntsaW5lczpxLGZvbnRTaXplOmF9fXNwbGl0KGEpe2NvbnN0IGM9W107bGV0IGQ9MSxmPS9ccy8udGVzdChhLmNoYXJBdCgwKSksZz0wLGw9MDtmb3IoO2Q8PWEubGVuZ3RoOyl7Y29uc3Qgaz1hLmNoYXJBdChkKSxuPS9ccy8udGVzdChrKTtrLmxlbmd0aCYmZj09PW58fChsPU1hdGgubWF4KGwsZC1nKSxjLnB1c2goe3RleHQ6YS5zdWJzdHJpbmcoZywKZCksd2hpdGVzcGFjZTpmfSksZz1kKTtmPW47ZCsrfXJldHVybnttYXg6bCxzZWdtZW50czpjfX1jb21wdXRlVGV4dFJlY3QoYSxjKXtsZXQgZD0wLGY9MCxnPTAsbD0xO2ZvcihsZXQgaz0wO2s8YS5sZW5ndGg7aysrKXtjb25zdCB7dGV4dDpuLHdoaXRlc3BhY2U6cH09YVtrXSxxPW4ubGVuZ3RoO2lmKCFwfHxkKXA/ZCtxPD1jP2QrPXE6KGY9ZD0wLGwrPXRoaXMuc2V0dGluZ3MubGluZUhlaWdodCk6ZCtxPD1jP2Y9ZCs9cTooZj9kPWY9cTooZz1NYXRoLm1heChnLHEpLGQ9Zj0wKSxsKz10aGlzLnNldHRpbmdzLmxpbmVIZWlnaHQpLGc9TWF0aC5tYXgoZyxmKX1yZXR1cm57d2lkdGg6ZyxoZWlnaHQ6bH19Y29tcHV0ZUN1dG9mZihhLGMsZCl7Y29uc3QgZj10aGlzLnNldHRpbmdzLndpZHRoL3RoaXMuc2V0dGluZ3MuaGVpZ2h0O2xldCBnPWQrKGMtZCkvMixsPWcsaz1udWxsLG49SW5maW5pdHk7Y29uc3QgcD1NYXRoLm1pbigyMCwoYS5sZW5ndGgrMSkvMik7bGV0IHE9MDtmb3IoO3E8CnA7KXtxKys7Y29uc3Qgcj10aGlzLmNvbXB1dGVUZXh0UmVjdChhLGcpLHQ9ci53aWR0aC9yLmhlaWdodCp0aGlzLnNldHRpbmdzLmdseXBoQXNwZWN0UmF0aW8sdj1NYXRoLmFicygxLXQvZik7djxuJiYobD1nLGs9cixuPXYpO2lmKC4wMT52KWJyZWFrO3Q+Zj9jPWc6ZD1nO2c9ZCsoYy1kKS8yfXJldHVybntjdXRvZmY6bCx3aWR0aDprLndpZHRoLGhlaWdodDprLmhlaWdodH19d3JhcExpbmVzKGEsYyl7Y29uc3QgZD1bXTtsZXQgZj0wLGc9MCxsPTAsaz0wO2ZvcihsZXQgbj0wO248YS5sZW5ndGg7bisrKXtjb25zdCB7dGV4dDpwLHdoaXRlc3BhY2U6cX09YVtuXSxyPXAubGVuZ3RoO3EmJiFsP2Y9Zz1uKzE6cT9sK3I8PWM/bCs9cjooZC5wdXNoKHtzdGFydFBvczpmLGVuZFBvczpnLHRleHRMZW5ndGg6a30pLGw9az0wLGY9Zz1uKzEpOmwrcjw9Yz8oaz1sKz1yLGc9bisxKTprPyhkLnB1c2goe3N0YXJ0UG9zOmYsZW5kUG9zOmcsdGV4dExlbmd0aDprfSksbD1rPXIsZj1uLGc9bisKMSk6KGQucHVzaCh7c3RhcnRQb3M6bixlbmRQb3M6bisxLHRleHRMZW5ndGg6cn0pLGw9az0wLGY9Zz1uKzEpfWc+ZiYmZC5wdXNoKHtzdGFydFBvczpmLGVuZFBvczpnLHRleHRMZW5ndGg6a30pO3JldHVybiBkfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy90aHJlZS5qcwooZnVuY3Rpb24oYSxjKXsib2JqZWN0Ij09PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9PXR5cGVvZiBtb2R1bGU/YyhleHBvcnRzKToiZnVuY3Rpb24iPT09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIl0sYyk6KGE9YXx8c2VsZixjKGEuVEhSRUU9e30pKX0pKHRoaXMsZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYygpe31mdW5jdGlvbiBkKGIsZSl7dGhpcy54PWJ8fDA7dGhpcy55PWV8fDB9ZnVuY3Rpb24gZihiLGUsaCxtKXt0aGlzLl94PWJ8fDA7dGhpcy5feT1lfHwwO3RoaXMuX3o9aHx8MDt0aGlzLl93PXZvaWQgMCE9PW0/bToxfWZ1bmN0aW9uIGcoYixlLGgpe3RoaXMueD1ifHwwO3RoaXMueT1lfHwwO3RoaXMuej1ofHwwfWZ1bmN0aW9uIGwoKXt0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDEsMCwwLDAsMV07MDxhcmd1bWVudHMubGVuZ3RoJiZjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXgzOiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLiIpfQpmdW5jdGlvbiBrKGIsZSxoLG0sdSx3LEEsRSxHLEope09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOkpxKyt9KTt0aGlzLnV1aWQ9bGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy5uYW1lPSIiO3RoaXMuaW1hZ2U9dm9pZCAwIT09Yj9iOmsuREVGQVVMVF9JTUFHRTt0aGlzLm1pcG1hcHM9W107dGhpcy5tYXBwaW5nPXZvaWQgMCE9PWU/ZTprLkRFRkFVTFRfTUFQUElORzt0aGlzLndyYXBTPXZvaWQgMCE9PWg/aDoxMDAxO3RoaXMud3JhcFQ9dm9pZCAwIT09bT9tOjEwMDE7dGhpcy5tYWdGaWx0ZXI9dm9pZCAwIT09dT91OjEwMDY7dGhpcy5taW5GaWx0ZXI9dm9pZCAwIT09dz93OjEwMDg7dGhpcy5hbmlzb3Ryb3B5PXZvaWQgMCE9PUc/RzoxO3RoaXMuZm9ybWF0PXZvaWQgMCE9PUE/QToxMDIzO3RoaXMudHlwZT12b2lkIDAhPT1FP0U6MTAwOTt0aGlzLm9mZnNldD1uZXcgZCgwLDApO3RoaXMucmVwZWF0PW5ldyBkKDEsMSk7dGhpcy5jZW50ZXI9bmV3IGQoMCwwKTsKdGhpcy5yb3RhdGlvbj0wO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0hMDt0aGlzLm1hdHJpeD1uZXcgbDt0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMDt0aGlzLnByZW11bHRpcGx5QWxwaGE9ITE7dGhpcy5mbGlwWT0hMDt0aGlzLnVucGFja0FsaWdubWVudD00O3RoaXMuZW5jb2Rpbmc9dm9pZCAwIT09Sj9KOjNFMzt0aGlzLnZlcnNpb249MDt0aGlzLm9uVXBkYXRlPW51bGx9ZnVuY3Rpb24gbihiLGUsaCxtKXt0aGlzLng9Ynx8MDt0aGlzLnk9ZXx8MDt0aGlzLno9aHx8MDt0aGlzLnc9dm9pZCAwIT09bT9tOjF9ZnVuY3Rpb24gcChiLGUsaCl7dGhpcy53aWR0aD1iO3RoaXMuaGVpZ2h0PWU7dGhpcy5zY2lzc29yPW5ldyBuKDAsMCxiLGUpO3RoaXMuc2Npc3NvclRlc3Q9ITE7dGhpcy52aWV3cG9ydD1uZXcgbigwLDAsYixlKTtoPWh8fHt9O3RoaXMudGV4dHVyZT1uZXcgayh2b2lkIDAsdm9pZCAwLGgud3JhcFMsaC53cmFwVCxoLm1hZ0ZpbHRlcixoLm1pbkZpbHRlcixoLmZvcm1hdCxoLnR5cGUsCmguYW5pc290cm9weSxoLmVuY29kaW5nKTt0aGlzLnRleHR1cmUuaW1hZ2U9e307dGhpcy50ZXh0dXJlLmltYWdlLndpZHRoPWI7dGhpcy50ZXh0dXJlLmltYWdlLmhlaWdodD1lO3RoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9dm9pZCAwIT09aC5nZW5lcmF0ZU1pcG1hcHM/aC5nZW5lcmF0ZU1pcG1hcHM6ITE7dGhpcy50ZXh0dXJlLm1pbkZpbHRlcj12b2lkIDAhPT1oLm1pbkZpbHRlcj9oLm1pbkZpbHRlcjoxMDA2O3RoaXMuZGVwdGhCdWZmZXI9dm9pZCAwIT09aC5kZXB0aEJ1ZmZlcj9oLmRlcHRoQnVmZmVyOiEwO3RoaXMuc3RlbmNpbEJ1ZmZlcj12b2lkIDAhPT1oLnN0ZW5jaWxCdWZmZXI/aC5zdGVuY2lsQnVmZmVyOiEwO3RoaXMuZGVwdGhUZXh0dXJlPXZvaWQgMCE9PWguZGVwdGhUZXh0dXJlP2guZGVwdGhUZXh0dXJlOm51bGx9ZnVuY3Rpb24gcShiLGUsaCl7cC5jYWxsKHRoaXMsYixlLGgpO3RoaXMuc2FtcGxlcz00fWZ1bmN0aW9uIHIoKXt0aGlzLmVsZW1lbnRzPQpbMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV07MDxhcmd1bWVudHMubGVuZ3RoJiZjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLiIpfWZ1bmN0aW9uIHQoYixlLGgsbSl7dGhpcy5feD1ifHwwO3RoaXMuX3k9ZXx8MDt0aGlzLl96PWh8fDA7dGhpcy5fb3JkZXI9bXx8dC5EZWZhdWx0T3JkZXJ9ZnVuY3Rpb24gdigpe3RoaXMubWFzaz0xfWZ1bmN0aW9uIHkoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpLcSsrfSk7dGhpcy51dWlkPWxiLmdlbmVyYXRlVVVJRCgpO3RoaXMubmFtZT0iIjt0aGlzLnR5cGU9Ik9iamVjdDNEIjt0aGlzLnBhcmVudD1udWxsO3RoaXMuY2hpbGRyZW49W107dGhpcy51cD15LkRlZmF1bHRVcC5jbG9uZSgpO3ZhciBiPW5ldyBnLGU9bmV3IHQsaD1uZXcgZixtPW5ldyBnKDEsMSwxKTtlLl9vbkNoYW5nZShmdW5jdGlvbigpe2guc2V0RnJvbUV1bGVyKGUsCiExKX0pO2guX29uQ2hhbmdlKGZ1bmN0aW9uKCl7ZS5zZXRGcm9tUXVhdGVybmlvbihoLHZvaWQgMCwhMSl9KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtwb3NpdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6Yn0scm90YXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmV9LHF1YXRlcm5pb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmh9LHNjYWxlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTptfSxtb2RlbFZpZXdNYXRyaXg6e3ZhbHVlOm5ldyByfSxub3JtYWxNYXRyaXg6e3ZhbHVlOm5ldyBsfX0pO3RoaXMubWF0cml4PW5ldyByO3RoaXMubWF0cml4V29ybGQ9bmV3IHI7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPXkuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGU7dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExO3RoaXMubGF5ZXJzPW5ldyB2O3RoaXMudmlzaWJsZT0hMDsKdGhpcy5yZWNlaXZlU2hhZG93PXRoaXMuY2FzdFNoYWRvdz0hMTt0aGlzLmZydXN0dW1DdWxsZWQ9ITA7dGhpcy5yZW5kZXJPcmRlcj0wO3RoaXMudXNlckRhdGE9e319ZnVuY3Rpb24geigpe3kuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNjZW5lIjt0aGlzLm92ZXJyaWRlTWF0ZXJpYWw9dGhpcy5mb2c9dGhpcy5iYWNrZ3JvdW5kPW51bGw7dGhpcy5hdXRvVXBkYXRlPSEwOyJ1bmRlZmluZWQiIT09dHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyYmX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJvYnNlcnZlIix7ZGV0YWlsOnRoaXN9KSl9ZnVuY3Rpb24geChiLGUpe3RoaXMubWluPXZvaWQgMCE9PWI/YjpuZXcgZyhJbmZpbml0eSxJbmZpbml0eSxJbmZpbml0eSk7dGhpcy5tYXg9dm9pZCAwIT09ZT9lOm5ldyBnKC1JbmZpbml0eSwtSW5maW5pdHksLUluZmluaXR5KX1mdW5jdGlvbiBDKGIsZSxoLG0sdSl7dmFyIHc7dmFyIEE9MDtmb3Iodz1iLmxlbmd0aC0KMztBPD13O0ErPTMpe0llLmZyb21BcnJheShiLEEpO3ZhciBFPWUuZG90KEllKSxHPWguZG90KEllKSxKPW0uZG90KEllKTtpZihNYXRoLm1heCgtTWF0aC5tYXgoRSxHLEopLE1hdGgubWluKEUsRyxKKSk+dS54Kk1hdGguYWJzKEllLngpK3UueSpNYXRoLmFicyhJZS55KSt1LnoqTWF0aC5hYnMoSWUueikpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gRihiLGUpe3RoaXMuY2VudGVyPXZvaWQgMCE9PWI/YjpuZXcgZzt0aGlzLnJhZGl1cz12b2lkIDAhPT1lP2U6MH1mdW5jdGlvbiBEKGIsZSl7dGhpcy5vcmlnaW49dm9pZCAwIT09Yj9iOm5ldyBnO3RoaXMuZGlyZWN0aW9uPXZvaWQgMCE9PWU/ZTpuZXcgZ31mdW5jdGlvbiBCKGIsZSxoKXt0aGlzLmE9dm9pZCAwIT09Yj9iOm5ldyBnO3RoaXMuYj12b2lkIDAhPT1lP2U6bmV3IGc7dGhpcy5jPXZvaWQgMCE9PWg/aDpuZXcgZ31mdW5jdGlvbiBJKGIsZSxoKXtyZXR1cm4gdm9pZCAwPT09ZSYmdm9pZCAwPT09aD90aGlzLnNldChiKToKdGhpcy5zZXRSR0IoYixlLGgpfWZ1bmN0aW9uIE8oYixlLGgpezA+aCYmKGgrPTEpOzE8aCYmLS1oO3JldHVybiBoPDEvNj9iKzYqKGUtYikqaDouNT5oP2U6aDwyLzM/Yis2KihlLWIpKigyLzMtaCk6Yn1mdW5jdGlvbiBQKGIpe3JldHVybi4wNDA0NT5iPy4wNzczOTkzODA4KmI6TWF0aC5wb3coLjk0Nzg2NzI5ODYqYisuMDUyMTMyNzAxNCwyLjQpfWZ1bmN0aW9uIEgoYil7cmV0dXJuLjAwMzEzMDg+Yj8xMi45MipiOjEuMDU1Kk1hdGgucG93KGIsLjQxNjY2KS0uMDU1fWZ1bmN0aW9uIEsoYixlLGgsbSx1LHcpe3RoaXMuYT1iO3RoaXMuYj1lO3RoaXMuYz1oO3RoaXMubm9ybWFsPW0mJm0uaXNWZWN0b3IzP206bmV3IGc7dGhpcy52ZXJ0ZXhOb3JtYWxzPUFycmF5LmlzQXJyYXkobSk/bTpbXTt0aGlzLmNvbG9yPXUmJnUuaXNDb2xvcj91Om5ldyBJO3RoaXMudmVydGV4Q29sb3JzPUFycmF5LmlzQXJyYXkodSk/dTpbXTt0aGlzLm1hdGVyaWFsSW5kZXg9dm9pZCAwIT09dz93OjB9CmZ1bmN0aW9uIE0oKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpMcSsrfSk7dGhpcy51dWlkPWxiLmdlbmVyYXRlVVVJRCgpO3RoaXMubmFtZT0iIjt0aGlzLnR5cGU9Ik1hdGVyaWFsIjt0aGlzLmxpZ2h0cz10aGlzLmZvZz0hMDt0aGlzLmJsZW5kaW5nPTE7dGhpcy5zaWRlPTA7dGhpcy52ZXJ0ZXhUYW5nZW50cz10aGlzLmZsYXRTaGFkaW5nPSExO3RoaXMudmVydGV4Q29sb3JzPTA7dGhpcy5vcGFjaXR5PTE7dGhpcy50cmFuc3BhcmVudD0hMTt0aGlzLmJsZW5kU3JjPTIwNDt0aGlzLmJsZW5kRHN0PTIwNTt0aGlzLmJsZW5kRXF1YXRpb249MTAwO3RoaXMuYmxlbmRFcXVhdGlvbkFscGhhPXRoaXMuYmxlbmREc3RBbHBoYT10aGlzLmJsZW5kU3JjQWxwaGE9bnVsbDt0aGlzLmRlcHRoRnVuYz0zO3RoaXMuZGVwdGhXcml0ZT10aGlzLmRlcHRoVGVzdD0hMDt0aGlzLnN0ZW5jaWxGdW5jPTUxOTt0aGlzLnN0ZW5jaWxSZWY9MDt0aGlzLnN0ZW5jaWxNYXNrPQoyNTU7dGhpcy5zdGVuY2lsWlBhc3M9dGhpcy5zdGVuY2lsWkZhaWw9dGhpcy5zdGVuY2lsRmFpbD03NjgwO3RoaXMuc3RlbmNpbFdyaXRlPSExO3RoaXMuY2xpcHBpbmdQbGFuZXM9bnVsbDt0aGlzLmNsaXBTaGFkb3dzPXRoaXMuY2xpcEludGVyc2VjdGlvbj0hMTt0aGlzLnNoYWRvd1NpZGU9bnVsbDt0aGlzLmNvbG9yV3JpdGU9ITA7dGhpcy5wcmVjaXNpb249bnVsbDt0aGlzLnBvbHlnb25PZmZzZXQ9ITE7dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHM9dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yPTA7dGhpcy5kaXRoZXJpbmc9ITE7dGhpcy5hbHBoYVRlc3Q9MDt0aGlzLnByZW11bHRpcGxpZWRBbHBoYT0hMTt0aGlzLnRvbmVNYXBwZWQ9dGhpcy52aXNpYmxlPSEwO3RoaXMudXNlckRhdGE9e307dGhpcy5uZWVkc1VwZGF0ZT0hMH1mdW5jdGlvbiBMKGIpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hCYXNpY01hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLmxpZ2h0TWFwPQp0aGlzLm1hcD1udWxsO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9MTt0aGlzLmFvTWFwPW51bGw7dGhpcy5hb01hcEludGVuc2l0eT0xO3RoaXMuZW52TWFwPXRoaXMuYWxwaGFNYXA9dGhpcy5zcGVjdWxhck1hcD1udWxsO3RoaXMuY29tYmluZT0wO3RoaXMucmVmbGVjdGl2aXR5PTE7dGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4O3RoaXMud2lyZWZyYW1lPSExO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPTE7dGhpcy53aXJlZnJhbWVMaW5lam9pbj10aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIjt0aGlzLmxpZ2h0cz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPSExO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uIFIoYixlLGgpe2lmKEFycmF5LmlzQXJyYXkoYikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTt0aGlzLm5hbWU9IiI7dGhpcy5hcnJheT1iO3RoaXMuaXRlbVNpemU9CmU7dGhpcy5jb3VudD12b2lkIDAhPT1iP2IubGVuZ3RoL2U6MDt0aGlzLm5vcm1hbGl6ZWQ9ITA9PT1oO3RoaXMuZHluYW1pYz0hMTt0aGlzLnVwZGF0ZVJhbmdlPXtvZmZzZXQ6MCxjb3VudDotMX07dGhpcy52ZXJzaW9uPTB9ZnVuY3Rpb24gVShiLGUsaCl7Ui5jYWxsKHRoaXMsbmV3IEludDhBcnJheShiKSxlLGgpfWZ1bmN0aW9uIFkoYixlLGgpe1IuY2FsbCh0aGlzLG5ldyBVaW50OEFycmF5KGIpLGUsaCl9ZnVuY3Rpb24gYmEoYixlLGgpe1IuY2FsbCh0aGlzLG5ldyBVaW50OENsYW1wZWRBcnJheShiKSxlLGgpfWZ1bmN0aW9uIG1hKGIsZSxoKXtSLmNhbGwodGhpcyxuZXcgSW50MTZBcnJheShiKSxlLGgpfWZ1bmN0aW9uIGFhKGIsZSxoKXtSLmNhbGwodGhpcyxuZXcgVWludDE2QXJyYXkoYiksZSxoKX1mdW5jdGlvbiBjYShiLGUsaCl7Ui5jYWxsKHRoaXMsbmV3IEludDMyQXJyYXkoYiksZSxoKX1mdW5jdGlvbiBmYShiLGUsaCl7Ui5jYWxsKHRoaXMsbmV3IFVpbnQzMkFycmF5KGIpLAplLGgpfWZ1bmN0aW9uIGRhKGIsZSxoKXtSLmNhbGwodGhpcyxuZXcgRmxvYXQzMkFycmF5KGIpLGUsaCl9ZnVuY3Rpb24gbGEoYixlLGgpe1IuY2FsbCh0aGlzLG5ldyBGbG9hdDY0QXJyYXkoYiksZSxoKX1mdW5jdGlvbiBaKCl7dGhpcy52ZXJ0aWNlcz1bXTt0aGlzLm5vcm1hbHM9W107dGhpcy5jb2xvcnM9W107dGhpcy51dnM9W107dGhpcy51dnMyPVtdO3RoaXMuZ3JvdXBzPVtdO3RoaXMubW9ycGhUYXJnZXRzPXt9O3RoaXMuc2tpbldlaWdodHM9W107dGhpcy5za2luSW5kaWNlcz1bXTt0aGlzLmJvdW5kaW5nU3BoZXJlPXRoaXMuYm91bmRpbmdCb3g9bnVsbDt0aGlzLmdyb3Vwc05lZWRVcGRhdGU9dGhpcy51dnNOZWVkVXBkYXRlPXRoaXMuY29sb3JzTmVlZFVwZGF0ZT10aGlzLm5vcm1hbHNOZWVkVXBkYXRlPXRoaXMudmVydGljZXNOZWVkVXBkYXRlPSExfWZ1bmN0aW9uIEZhKGIpe2lmKDA9PT1iLmxlbmd0aClyZXR1cm4tSW5maW5pdHk7Zm9yKHZhciBlPWJbMF0saD0xLG09CmIubGVuZ3RoO2g8bTsrK2gpYltoXT5lJiYoZT1iW2hdKTtyZXR1cm4gZX1mdW5jdGlvbiB4YSgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOk1xKz0yfSk7dGhpcy51dWlkPWxiLmdlbmVyYXRlVVVJRCgpO3RoaXMubmFtZT0iIjt0aGlzLnR5cGU9IkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLmluZGV4PW51bGw7dGhpcy5hdHRyaWJ1dGVzPXt9O3RoaXMubW9ycGhBdHRyaWJ1dGVzPXt9O3RoaXMuZ3JvdXBzPVtdO3RoaXMuYm91bmRpbmdTcGhlcmU9dGhpcy5ib3VuZGluZ0JveD1udWxsO3RoaXMuZHJhd1JhbmdlPXtzdGFydDowLGNvdW50OkluZmluaXR5fTt0aGlzLnVzZXJEYXRhPXt9fWZ1bmN0aW9uIHlhKGIsZSl7eS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTWVzaCI7dGhpcy5nZW9tZXRyeT12b2lkIDAhPT1iP2I6bmV3IHhhO3RoaXMubWF0ZXJpYWw9dm9pZCAwIT09ZT9lOm5ldyBMKHtjb2xvcjoxNjc3NzIxNSpNYXRoLnJhbmRvbSgpfSk7dGhpcy5kcmF3TW9kZT0KMDt0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpfWZ1bmN0aW9uIEJhKGIsZSxoLG0sdSx3LEEsRSl7aWYobnVsbD09PSgxPT09ZS5zaWRlP20uaW50ZXJzZWN0VHJpYW5nbGUoQSx3LHUsITAsRSk6bS5pbnRlcnNlY3RUcmlhbmdsZSh1LHcsQSwyIT09ZS5zaWRlLEUpKSlyZXR1cm4gbnVsbDtwaS5jb3B5KEUpO3BpLmFwcGx5TWF0cml4NChiLm1hdHJpeFdvcmxkKTtlPWgucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKHBpKTtyZXR1cm4gZTxoLm5lYXJ8fGU+aC5mYXI/bnVsbDp7ZGlzdGFuY2U6ZSxwb2ludDpwaS5jbG9uZSgpLG9iamVjdDpifX1mdW5jdGlvbiBHYShiLGUsaCxtLHUsdyxBLEUsRyxKLFEpe0plLmZyb21CdWZmZXJBdHRyaWJ1dGUodSxHKTtLZS5mcm9tQnVmZmVyQXR0cmlidXRlKHUsSik7TGUuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh1LFEpO3U9Yi5tb3JwaFRhcmdldEluZmx1ZW5jZXM7aWYoZS5tb3JwaFRhcmdldHMmJncmJnUpe2xrLnNldCgwLDAsMCk7bWsuc2V0KDAsMCwwKTsKbmsuc2V0KDAsMCwwKTtmb3IodmFyIFM9MCxUPXcubGVuZ3RoO1M8VDtTKyspe3ZhciBXPXVbU10sWD13W1NdOzAhPT1XJiYoaG4uZnJvbUJ1ZmZlckF0dHJpYnV0ZShYLEcpLGpuLmZyb21CdWZmZXJBdHRyaWJ1dGUoWCxKKSxrbi5mcm9tQnVmZmVyQXR0cmlidXRlKFgsUSksbGsuYWRkU2NhbGVkVmVjdG9yKGhuLnN1YihKZSksVyksbWsuYWRkU2NhbGVkVmVjdG9yKGpuLnN1YihLZSksVyksbmsuYWRkU2NhbGVkVmVjdG9yKGtuLnN1YihMZSksVykpfUplLmFkZChsayk7S2UuYWRkKG1rKTtMZS5hZGQobmspfWlmKGI9QmEoYixlLGgsbSxKZSxLZSxMZSxZZykpQSYmKHpmLmZyb21CdWZmZXJBdHRyaWJ1dGUoQSxHKSxBZi5mcm9tQnVmZmVyQXR0cmlidXRlKEEsSiksQmYuZnJvbUJ1ZmZlckF0dHJpYnV0ZShBLFEpLGIudXY9Qi5nZXRVVihZZyxKZSxLZSxMZSx6ZixBZixCZixuZXcgZCkpLEUmJih6Zi5mcm9tQnVmZmVyQXR0cmlidXRlKEUsRyksQWYuZnJvbUJ1ZmZlckF0dHJpYnV0ZShFLApKKSxCZi5mcm9tQnVmZmVyQXR0cmlidXRlKEUsUSksYi51djI9Qi5nZXRVVihZZyxKZSxLZSxMZSx6ZixBZixCZixuZXcgZCkpLEE9bmV3IEsoRyxKLFEpLEIuZ2V0Tm9ybWFsKEplLEtlLExlLEEubm9ybWFsKSxiLmZhY2U9QTtyZXR1cm4gYn1mdW5jdGlvbiB6YSgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOk5xKz0yfSk7dGhpcy51dWlkPWxiLmdlbmVyYXRlVVVJRCgpO3RoaXMubmFtZT0iIjt0aGlzLnR5cGU9Ikdlb21ldHJ5Ijt0aGlzLnZlcnRpY2VzPVtdO3RoaXMuY29sb3JzPVtdO3RoaXMuZmFjZXM9W107dGhpcy5mYWNlVmVydGV4VXZzPVtbXV07dGhpcy5tb3JwaFRhcmdldHM9W107dGhpcy5tb3JwaE5vcm1hbHM9W107dGhpcy5za2luV2VpZ2h0cz1bXTt0aGlzLnNraW5JbmRpY2VzPVtdO3RoaXMubGluZURpc3RhbmNlcz1bXTt0aGlzLmJvdW5kaW5nU3BoZXJlPXRoaXMuYm91bmRpbmdCb3g9bnVsbDt0aGlzLmdyb3Vwc05lZWRVcGRhdGU9dGhpcy5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZT0KdGhpcy5jb2xvcnNOZWVkVXBkYXRlPXRoaXMubm9ybWFsc05lZWRVcGRhdGU9dGhpcy51dnNOZWVkVXBkYXRlPXRoaXMudmVydGljZXNOZWVkVXBkYXRlPXRoaXMuZWxlbWVudHNOZWVkVXBkYXRlPSExfWZ1bmN0aW9uIFVhKGIsZSxoLG0sdSx3KXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQm94R2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17d2lkdGg6YixoZWlnaHQ6ZSxkZXB0aDpoLHdpZHRoU2VnbWVudHM6bSxoZWlnaHRTZWdtZW50czp1LGRlcHRoU2VnbWVudHM6d307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFphKGIsZSxoLG0sdSx3KSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gWmEoYixlLGgsbSx1LHcpe2Z1bmN0aW9uIEEoWCxpYSxoYSxzYSxxYSxyYSx3YSxwYSx2YSxDYSxWYSl7dmFyIFdhPXJhL3ZhLERhPXdhL0NhLElhPXJhLzIsRWE9d2EvMixPYT1wYS8yO3dhPXZhKzE7dmFyIGhiPUNhKzEseWI9cmE9MCxMYSxlYixuYj1uZXcgZztmb3IoZWI9CjA7ZWI8aGI7ZWIrKyl7dmFyIE5iPWViKkRhLUVhO2ZvcihMYT0wO0xhPHdhO0xhKyspbmJbWF09KExhKldhLUlhKSpzYSxuYltpYV09TmIqcWEsbmJbaGFdPU9hLEoucHVzaChuYi54LG5iLnksbmIueiksbmJbWF09MCxuYltpYV09MCxuYltoYV09MDxwYT8xOi0xLFEucHVzaChuYi54LG5iLnksbmIueiksUy5wdXNoKExhL3ZhKSxTLnB1c2goMS1lYi9DYSkscmErPTF9Zm9yKGViPTA7ZWI8Q2E7ZWIrKylmb3IoTGE9MDtMYTx2YTtMYSsrKVg9VCtMYSt3YSooZWIrMSksaWE9VCsoTGErMSkrd2EqKGViKzEpLGhhPVQrKExhKzEpK3dhKmViLEcucHVzaChUK0xhK3dhKmViLFgsaGEpLEcucHVzaChYLGlhLGhhKSx5Yis9NjtFLmFkZEdyb3VwKFcseWIsVmEpO1crPXliO1QrPXJhfXhhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJCb3hCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt3aWR0aDpiLGhlaWdodDplLGRlcHRoOmgsd2lkdGhTZWdtZW50czptLGhlaWdodFNlZ21lbnRzOnUsCmRlcHRoU2VnbWVudHM6d307dmFyIEU9dGhpcztiPWJ8fDE7ZT1lfHwxO2g9aHx8MTttPU1hdGguZmxvb3IobSl8fDE7dT1NYXRoLmZsb29yKHUpfHwxO3c9TWF0aC5mbG9vcih3KXx8MTt2YXIgRz1bXSxKPVtdLFE9W10sUz1bXSxUPTAsVz0wO0EoInoiLCJ5IiwieCIsLTEsLTEsaCxlLGIsdyx1LDApO0EoInoiLCJ5IiwieCIsMSwtMSxoLGUsLWIsdyx1LDEpO0EoIngiLCJ6IiwieSIsMSwxLGIsaCxlLG0sdywyKTtBKCJ4IiwieiIsInkiLDEsLTEsYixoLC1lLG0sdywzKTtBKCJ4IiwieSIsInoiLDEsLTEsYixlLGgsbSx1LDQpO0EoIngiLCJ5IiwieiIsLTEsLTEsYixlLC1oLG0sdSw1KTt0aGlzLnNldEluZGV4KEcpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGRhKEosMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBkYShRLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBkYShTLDIpKX1mdW5jdGlvbiB6YihiKXt2YXIgZT17fSxoO2ZvcihoIGluIGIpe2VbaF09Cnt9O2Zvcih2YXIgbSBpbiBiW2hdKXt2YXIgdT1iW2hdW21dO2VbaF1bbV09dSYmKHUuaXNDb2xvcnx8dS5pc01hdHJpeDN8fHUuaXNNYXRyaXg0fHx1LmlzVmVjdG9yMnx8dS5pc1ZlY3RvcjN8fHUuaXNWZWN0b3I0fHx1LmlzVGV4dHVyZSk/dS5jbG9uZSgpOkFycmF5LmlzQXJyYXkodSk/dS5zbGljZSgpOnV9fXJldHVybiBlfWZ1bmN0aW9uIEliKGIpe2Zvcih2YXIgZT17fSxoPTA7aDxiLmxlbmd0aDtoKyspe3ZhciBtPXpiKGJbaF0pLHU7Zm9yKHUgaW4gbSllW3VdPW1bdV19cmV0dXJuIGV9ZnVuY3Rpb24gdWIoYil7TS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU2hhZGVyTWF0ZXJpYWwiO3RoaXMuZGVmaW5lcz17fTt0aGlzLnVuaWZvcm1zPXt9O3RoaXMudmVydGV4U2hhZGVyPSJ2b2lkIG1haW4oKSB7XG5cdGdsX1Bvc2l0aW9uIFx4M2QgcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcbn0iO3RoaXMuZnJhZ21lbnRTaGFkZXI9CiJ2b2lkIG1haW4oKSB7XG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIDEuMCwgMC4wLCAwLjAsIDEuMCApO1xufSI7dGhpcy5saW5ld2lkdGg9MTt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMubW9ycGhOb3JtYWxzPXRoaXMubW9ycGhUYXJnZXRzPXRoaXMuc2tpbm5pbmc9dGhpcy5jbGlwcGluZz10aGlzLmxpZ2h0cz10aGlzLmZvZz0hMTt0aGlzLmV4dGVuc2lvbnM9e2Rlcml2YXRpdmVzOiExLGZyYWdEZXB0aDohMSxkcmF3QnVmZmVyczohMSxzaGFkZXJUZXh0dXJlTE9EOiExfTt0aGlzLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM9e2NvbG9yOlsxLDEsMV0sdXY6WzAsMF0sdXYyOlswLDBdfTt0aGlzLmluZGV4MEF0dHJpYnV0ZU5hbWU9dm9pZCAwO3RoaXMudW5pZm9ybXNOZWVkVXBkYXRlPSExO3ZvaWQgMCE9PWImJih2b2lkIDAhPT1iLmF0dHJpYnV0ZXMmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLlNoYWRlck1hdGVyaWFsOiBhdHRyaWJ1dGVzIHNob3VsZCBub3cgYmUgZGVmaW5lZCBpbiBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpLAp0aGlzLnNldFZhbHVlcyhiKSl9ZnVuY3Rpb24gRmIoKXt5LmNhbGwodGhpcyk7dGhpcy50eXBlPSJDYW1lcmEiO3RoaXMubWF0cml4V29ybGRJbnZlcnNlPW5ldyByO3RoaXMucHJvamVjdGlvbk1hdHJpeD1uZXcgcjt0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlPW5ldyByfWZ1bmN0aW9uIEFiKGIsZSxoLG0pe0ZiLmNhbGwodGhpcyk7dGhpcy50eXBlPSJQZXJzcGVjdGl2ZUNhbWVyYSI7dGhpcy5mb3Y9dm9pZCAwIT09Yj9iOjUwO3RoaXMuem9vbT0xO3RoaXMubmVhcj12b2lkIDAhPT1oP2g6LjE7dGhpcy5mYXI9dm9pZCAwIT09bT9tOjJFMzt0aGlzLmZvY3VzPTEwO3RoaXMuYXNwZWN0PXZvaWQgMCE9PWU/ZToxO3RoaXMudmlldz1udWxsO3RoaXMuZmlsbUdhdWdlPTM1O3RoaXMuZmlsbU9mZnNldD0wO3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfWZ1bmN0aW9uIFBiKGIsZSxoLG0pe3kuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN1YmVDYW1lcmEiO3ZhciB1PW5ldyBBYig5MCwKMSxiLGUpO3UudXAuc2V0KDAsLTEsMCk7dS5sb29rQXQobmV3IGcoMSwwLDApKTt0aGlzLmFkZCh1KTt2YXIgdz1uZXcgQWIoOTAsMSxiLGUpO3cudXAuc2V0KDAsLTEsMCk7dy5sb29rQXQobmV3IGcoLTEsMCwwKSk7dGhpcy5hZGQodyk7dmFyIEE9bmV3IEFiKDkwLDEsYixlKTtBLnVwLnNldCgwLDAsMSk7QS5sb29rQXQobmV3IGcoMCwxLDApKTt0aGlzLmFkZChBKTt2YXIgRT1uZXcgQWIoOTAsMSxiLGUpO0UudXAuc2V0KDAsMCwtMSk7RS5sb29rQXQobmV3IGcoMCwtMSwwKSk7dGhpcy5hZGQoRSk7dmFyIEc9bmV3IEFiKDkwLDEsYixlKTtHLnVwLnNldCgwLC0xLDApO0cubG9va0F0KG5ldyBnKDAsMCwxKSk7dGhpcy5hZGQoRyk7dmFyIEo9bmV3IEFiKDkwLDEsYixlKTtKLnVwLnNldCgwLC0xLDApO0oubG9va0F0KG5ldyBnKDAsMCwtMSkpO3RoaXMuYWRkKEopO209bXx8e2Zvcm1hdDoxMDIyLG1hZ0ZpbHRlcjoxMDA2LG1pbkZpbHRlcjoxMDA2fTt0aGlzLnJlbmRlclRhcmdldD0KbmV3IGJjKGgsaCxtKTt0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWU9IkN1YmVDYW1lcmEiO3RoaXMudXBkYXRlPWZ1bmN0aW9uKFEsUyl7bnVsbD09PXRoaXMucGFyZW50JiZ0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCk7dmFyIFQ9US5nZXRSZW5kZXJUYXJnZXQoKSxXPXRoaXMucmVuZGVyVGFyZ2V0LFg9Vy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztXLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPSExO1Euc2V0UmVuZGVyVGFyZ2V0KFcsMCk7US5yZW5kZXIoUyx1KTtRLnNldFJlbmRlclRhcmdldChXLDEpO1EucmVuZGVyKFMsdyk7US5zZXRSZW5kZXJUYXJnZXQoVywyKTtRLnJlbmRlcihTLEEpO1Euc2V0UmVuZGVyVGFyZ2V0KFcsMyk7US5yZW5kZXIoUyxFKTtRLnNldFJlbmRlclRhcmdldChXLDQpO1EucmVuZGVyKFMsRyk7Vy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz1YO1Euc2V0UmVuZGVyVGFyZ2V0KFcsNSk7US5yZW5kZXIoUyxKKTtRLnNldFJlbmRlclRhcmdldChUKX07CnRoaXMuY2xlYXI9ZnVuY3Rpb24oUSxTLFQsVyl7Zm9yKHZhciBYPVEuZ2V0UmVuZGVyVGFyZ2V0KCksaWE9dGhpcy5yZW5kZXJUYXJnZXQsaGE9MDs2PmhhO2hhKyspUS5zZXRSZW5kZXJUYXJnZXQoaWEsaGEpLFEuY2xlYXIoUyxULFcpO1Euc2V0UmVuZGVyVGFyZ2V0KFgpfX1mdW5jdGlvbiBiYyhiLGUsaCl7cC5jYWxsKHRoaXMsYixlLGgpfWZ1bmN0aW9uIEdiKGIsZSxoLG0sdSx3LEEsRSxHLEosUSxTKXtrLmNhbGwodGhpcyxudWxsLHcsQSxFLEcsSixtLHUsUSxTKTt0aGlzLmltYWdlPXtkYXRhOmIsd2lkdGg6ZSxoZWlnaHQ6aH07dGhpcy5tYWdGaWx0ZXI9dm9pZCAwIT09Rz9HOjEwMDM7dGhpcy5taW5GaWx0ZXI9dm9pZCAwIT09Sj9KOjEwMDM7dGhpcy5mbGlwWT10aGlzLmdlbmVyYXRlTWlwbWFwcz0hMTt0aGlzLnVucGFja0FsaWdubWVudD0xfWZ1bmN0aW9uIFJiKGIsZSl7dGhpcy5ub3JtYWw9dm9pZCAwIT09Yj9iOm5ldyBnKDEsMCwwKTt0aGlzLmNvbnN0YW50PXZvaWQgMCE9PQplP2U6MH1mdW5jdGlvbiBFYyhiLGUsaCxtLHUsdyl7dGhpcy5wbGFuZXM9W3ZvaWQgMCE9PWI/YjpuZXcgUmIsdm9pZCAwIT09ZT9lOm5ldyBSYix2b2lkIDAhPT1oP2g6bmV3IFJiLHZvaWQgMCE9PW0/bTpuZXcgUmIsdm9pZCAwIT09dT91Om5ldyBSYix2b2lkIDAhPT13P3c6bmV3IFJiXX1mdW5jdGlvbiB4Yygpe2Z1bmN0aW9uIGIodSx3KXshMSE9PWgmJihtKHUsdyksZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYikpfXZhciBlPW51bGwsaD0hMSxtPW51bGw7cmV0dXJue3N0YXJ0OmZ1bmN0aW9uKCl7ITAhPT1oJiZudWxsIT09bSYmKGUucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGIpLGg9ITApfSxzdG9wOmZ1bmN0aW9uKCl7aD0hMX0sc2V0QW5pbWF0aW9uTG9vcDpmdW5jdGlvbih1KXttPXV9LHNldENvbnRleHQ6ZnVuY3Rpb24odSl7ZT11fX19ZnVuY3Rpb24gTWUoYil7ZnVuY3Rpb24gZSh1LHcpe3ZhciBBPXUuYXJyYXksRT11LmR5bmFtaWM/MzUwNDg6MzUwNDQsRz1iLmNyZWF0ZUJ1ZmZlcigpOwpiLmJpbmRCdWZmZXIodyxHKTtiLmJ1ZmZlckRhdGEodyxBLEUpO3Uub25VcGxvYWRDYWxsYmFjaygpO3c9NTEyNjtBIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5P3c9NTEyNjpBIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5P2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xBdHRyaWJ1dGVzOiBVbnN1cHBvcnRlZCBkYXRhIGJ1ZmZlciBmb3JtYXQ6IEZsb2F0NjRBcnJheS4iKTpBIGluc3RhbmNlb2YgVWludDE2QXJyYXk/dz01MTIzOkEgaW5zdGFuY2VvZiBJbnQxNkFycmF5P3c9NTEyMjpBIGluc3RhbmNlb2YgVWludDMyQXJyYXk/dz01MTI1OkEgaW5zdGFuY2VvZiBJbnQzMkFycmF5P3c9NTEyNDpBIGluc3RhbmNlb2YgSW50OEFycmF5P3c9NTEyMDpBIGluc3RhbmNlb2YgVWludDhBcnJheSYmKHc9NTEyMSk7cmV0dXJue2J1ZmZlcjpHLHR5cGU6dyxieXRlc1BlckVsZW1lbnQ6QS5CWVRFU19QRVJfRUxFTUVOVCx2ZXJzaW9uOnUudmVyc2lvbn19ZnVuY3Rpb24gaCh1LHcsQSl7dmFyIEU9CncuYXJyYXksRz13LnVwZGF0ZVJhbmdlO2IuYmluZEJ1ZmZlcihBLHUpOyExPT09dy5keW5hbWljP2IuYnVmZmVyRGF0YShBLEUsMzUwNDQpOi0xPT09Ry5jb3VudD9iLmJ1ZmZlclN1YkRhdGEoQSwwLEUpOjA9PT1HLmNvdW50P2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMT2JqZWN0cy51cGRhdGVCdWZmZXI6IGR5bmFtaWMgVEhSRUUuQnVmZmVyQXR0cmlidXRlIG1hcmtlZCBhcyBuZWVkc1VwZGF0ZSBidXQgdXBkYXRlUmFuZ2UuY291bnQgaXMgMCwgZW5zdXJlIHlvdSBhcmUgdXNpbmcgc2V0IG1ldGhvZHMgb3IgdXBkYXRpbmcgbWFudWFsbHkuIik6KGIuYnVmZmVyU3ViRGF0YShBLEcub2Zmc2V0KkUuQllURVNfUEVSX0VMRU1FTlQsRS5zdWJhcnJheShHLm9mZnNldCxHLm9mZnNldCtHLmNvdW50KSksRy5jb3VudD0tMSl9dmFyIG09bmV3IFdlYWtNYXA7cmV0dXJue2dldDpmdW5jdGlvbih1KXt1LmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJih1PXUuZGF0YSk7cmV0dXJuIG0uZ2V0KHUpfSwKcmVtb3ZlOmZ1bmN0aW9uKHUpe3UuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKHU9dS5kYXRhKTt2YXIgdz1tLmdldCh1KTt3JiYoYi5kZWxldGVCdWZmZXIody5idWZmZXIpLG0uZGVsZXRlKHUpKX0sdXBkYXRlOmZ1bmN0aW9uKHUsdyl7dS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYodT11LmRhdGEpO3ZhciBBPW0uZ2V0KHUpO3ZvaWQgMD09PUE/bS5zZXQodSxlKHUsdykpOkEudmVyc2lvbjx1LnZlcnNpb24mJihoKEEuYnVmZmVyLHUsdyksQS52ZXJzaW9uPXUudmVyc2lvbil9fX1mdW5jdGlvbiBpZShiLGUsaCxtKXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGxhbmVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt3aWR0aDpiLGhlaWdodDplLHdpZHRoU2VnbWVudHM6aCxoZWlnaHRTZWdtZW50czptfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgdGQoYixlLGgsbSkpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIHRkKGIsZSxoLG0pe3hhLmNhbGwodGhpcyk7CnRoaXMudHlwZT0iUGxhbmVCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt3aWR0aDpiLGhlaWdodDplLHdpZHRoU2VnbWVudHM6aCxoZWlnaHRTZWdtZW50czptfTtiPWJ8fDE7ZT1lfHwxO3ZhciB1PWIvMix3PWUvMjtoPU1hdGguZmxvb3IoaCl8fDE7bT1NYXRoLmZsb29yKG0pfHwxO3ZhciBBPWgrMSxFPW0rMSxHPWIvaCxKPWUvbSxRPVtdLFM9W10sVD1bXSxXPVtdO2ZvcihiPTA7YjxFO2IrKyl7dmFyIFg9YipKLXc7Zm9yKGU9MDtlPEE7ZSsrKVMucHVzaChlKkctdSwtWCwwKSxULnB1c2goMCwwLDEpLFcucHVzaChlL2gpLFcucHVzaCgxLWIvbSl9Zm9yKGI9MDtiPG07YisrKWZvcihlPTA7ZTxoO2UrKyl1PWUrQSooYisxKSx3PWUrMStBKihiKzEpLEU9ZSsxK0EqYixRLnB1c2goZStBKmIsdSxFKSxRLnB1c2godSx3LEUpO3RoaXMuc2V0SW5kZXgoUSk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgZGEoUywzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsCm5ldyBkYShULDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBkYShXLDIpKX1mdW5jdGlvbiBqZShiLGUsaCxtKXtmdW5jdGlvbiB1KFMsVCl7ZS5idWZmZXJzLmNvbG9yLnNldENsZWFyKFMucixTLmcsUy5iLFQsbSl9dmFyIHc9bmV3IEkoMCksQT0wLEUsRyxKPW51bGwsUT0wO3JldHVybntnZXRDbGVhckNvbG9yOmZ1bmN0aW9uKCl7cmV0dXJuIHd9LHNldENsZWFyQ29sb3I6ZnVuY3Rpb24oUyxUKXt3LnNldChTKTtBPXZvaWQgMCE9PVQ/VDoxO3UodyxBKX0sZ2V0Q2xlYXJBbHBoYTpmdW5jdGlvbigpe3JldHVybiBBfSxzZXRDbGVhckFscGhhOmZ1bmN0aW9uKFMpe0E9Uzt1KHcsQSl9LHJlbmRlcjpmdW5jdGlvbihTLFQsVyxYKXtUPVQuYmFja2dyb3VuZDtXPWIudnI7KFc9Vy5nZXRTZXNzaW9uJiZXLmdldFNlc3Npb24oKSkmJiJhZGRpdGl2ZSI9PT1XLmVudmlyb25tZW50QmxlbmRNb2RlJiYoVD1udWxsKTtudWxsPT09VD8odSh3LEEpLEo9bnVsbCxRPTApOlQmJlQuaXNDb2xvciYmCih1KFQsMSksWD0hMCxKPW51bGwsUT0wKTsoYi5hdXRvQ2xlYXJ8fFgpJiZiLmNsZWFyKGIuYXV0b0NsZWFyQ29sb3IsYi5hdXRvQ2xlYXJEZXB0aCxiLmF1dG9DbGVhclN0ZW5jaWwpO2lmKFQmJihULmlzQ3ViZVRleHR1cmV8fFQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUpKXt2b2lkIDA9PT1HJiYoRz1uZXcgeWEobmV3IFphKDEsMSwxKSxuZXcgdWIoe3R5cGU6IkJhY2tncm91bmRDdWJlTWF0ZXJpYWwiLHVuaWZvcm1zOnpiKHVkLmN1YmUudW5pZm9ybXMpLHZlcnRleFNoYWRlcjp1ZC5jdWJlLnZlcnRleFNoYWRlcixmcmFnbWVudFNoYWRlcjp1ZC5jdWJlLmZyYWdtZW50U2hhZGVyLHNpZGU6MSxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSxmb2c6ITF9KSksRy5nZW9tZXRyeS5yZW1vdmVBdHRyaWJ1dGUoIm5vcm1hbCIpLEcuZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCJ1diIpLEcub25CZWZvcmVSZW5kZXI9ZnVuY3Rpb24oaWEsaGEsc2Epe3RoaXMubWF0cml4V29ybGQuY29weVBvc2l0aW9uKHNhLm1hdHJpeFdvcmxkKX0sCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShHLm1hdGVyaWFsLCJtYXAiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy50Q3ViZS52YWx1ZX19KSxoLnVwZGF0ZShHKSk7WD1ULmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlP1QudGV4dHVyZTpUO0cubWF0ZXJpYWwudW5pZm9ybXMudEN1YmUudmFsdWU9WDtHLm1hdGVyaWFsLnVuaWZvcm1zLnRGbGlwLnZhbHVlPVQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmU/MTotMTtpZihKIT09VHx8USE9PVgudmVyc2lvbilHLm1hdGVyaWFsLm5lZWRzVXBkYXRlPSEwLEo9VCxRPVgudmVyc2lvbjtTLnVuc2hpZnQoRyxHLmdlb21ldHJ5LEcubWF0ZXJpYWwsMCwwLG51bGwpfWVsc2UgaWYoVCYmVC5pc1RleHR1cmUpe3ZvaWQgMD09PUUmJihFPW5ldyB5YShuZXcgdGQoMiwyKSxuZXcgdWIoe3R5cGU6IkJhY2tncm91bmRNYXRlcmlhbCIsdW5pZm9ybXM6emIodWQuYmFja2dyb3VuZC51bmlmb3JtcyksdmVydGV4U2hhZGVyOnVkLmJhY2tncm91bmQudmVydGV4U2hhZGVyLApmcmFnbWVudFNoYWRlcjp1ZC5iYWNrZ3JvdW5kLmZyYWdtZW50U2hhZGVyLHNpZGU6MCxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSxmb2c6ITF9KSksRS5nZW9tZXRyeS5yZW1vdmVBdHRyaWJ1dGUoIm5vcm1hbCIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFLm1hdGVyaWFsLCJtYXAiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy50MkQudmFsdWV9fSksaC51cGRhdGUoRSkpO0UubWF0ZXJpYWwudW5pZm9ybXMudDJELnZhbHVlPVQ7ITA9PT1ULm1hdHJpeEF1dG9VcGRhdGUmJlQudXBkYXRlTWF0cml4KCk7RS5tYXRlcmlhbC51bmlmb3Jtcy51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KFQubWF0cml4KTtpZihKIT09VHx8USE9PVQudmVyc2lvbilFLm1hdGVyaWFsLm5lZWRzVXBkYXRlPSEwLEo9VCxRPVQudmVyc2lvbjtTLnVuc2hpZnQoRSxFLmdlb21ldHJ5LEUubWF0ZXJpYWwsMCwwLG51bGwpfX19fWZ1bmN0aW9uIHVhKGIsZSxoLG0pe3ZhciB1O3RoaXMuc2V0TW9kZT0KZnVuY3Rpb24odyl7dT13fTt0aGlzLnJlbmRlcj1mdW5jdGlvbih3LEEpe2IuZHJhd0FycmF5cyh1LHcsQSk7aC51cGRhdGUoQSx1KX07dGhpcy5yZW5kZXJJbnN0YW5jZXM9ZnVuY3Rpb24odyxBLEUpe2lmKG0uaXNXZWJHTDIpe3ZhciBHPWI7dmFyIEo9ImRyYXdBcnJheXNJbnN0YW5jZWQifWVsc2UgaWYoRz1lLmdldCgiQU5HTEVfaW5zdGFuY2VkX2FycmF5cyIpLEo9ImRyYXdBcnJheXNJbnN0YW5jZWRBTkdMRSIsbnVsbD09PUcpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLiIpO3JldHVybn1HW0pdKHUsQSxFLHcubWF4SW5zdGFuY2VkQ291bnQpO2gudXBkYXRlKEUsdSx3Lm1heEluc3RhbmNlZENvdW50KX19ZnVuY3Rpb24gJGIoYixlLGgpe2Z1bmN0aW9uIG0ocmEpe2lmKCJoaWdocCI9PT0KcmEpe2lmKDA8Yi5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoMzU2MzMsMzYzMzgpLnByZWNpc2lvbiYmMDxiLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCgzNTYzMiwzNjMzOCkucHJlY2lzaW9uKXJldHVybiJoaWdocCI7cmE9Im1lZGl1bXAifXJldHVybiJtZWRpdW1wIj09PXJhJiYwPGIuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMzLDM2MzM3KS5wcmVjaXNpb24mJjA8Yi5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoMzU2MzIsMzYzMzcpLnByZWNpc2lvbj8ibWVkaXVtcCI6Imxvd3AifXZhciB1LHc9InVuZGVmaW5lZCIhPT10eXBlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCYmYiBpbnN0YW5jZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQsQT12b2lkIDAhPT1oLnByZWNpc2lvbj9oLnByZWNpc2lvbjoiaGlnaHAiLEU9bShBKTtFIT09QSYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjoiLEEsIm5vdCBzdXBwb3J0ZWQsIHVzaW5nIixFLCJpbnN0ZWFkLiIpLApBPUUpO2g9ITA9PT1oLmxvZ2FyaXRobWljRGVwdGhCdWZmZXI7RT1iLmdldFBhcmFtZXRlcigzNDkzMCk7dmFyIEc9Yi5nZXRQYXJhbWV0ZXIoMzU2NjApLEo9Yi5nZXRQYXJhbWV0ZXIoMzM3OSksUT1iLmdldFBhcmFtZXRlcigzNDA3NiksUz1iLmdldFBhcmFtZXRlcigzNDkyMSksVD1iLmdldFBhcmFtZXRlcigzNjM0NyksVz1iLmdldFBhcmFtZXRlcigzNjM0OCksWD1iLmdldFBhcmFtZXRlcigzNjM0OSksaWE9MDxHLGhhPXd8fCEhZS5nZXQoIk9FU190ZXh0dXJlX2Zsb2F0Iiksc2E9aWEmJmhhLHFhPXc/Yi5nZXRQYXJhbWV0ZXIoMzYxODMpOjA7cmV0dXJue2lzV2ViR0wyOncsZ2V0TWF4QW5pc290cm9weTpmdW5jdGlvbigpe2lmKHZvaWQgMCE9PXUpcmV0dXJuIHU7dmFyIHJhPWUuZ2V0KCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTtyZXR1cm4gdT1udWxsIT09cmE/Yi5nZXRQYXJhbWV0ZXIocmEuTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUKTowfSwKZ2V0TWF4UHJlY2lzaW9uOm0scHJlY2lzaW9uOkEsbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjpoLG1heFRleHR1cmVzOkUsbWF4VmVydGV4VGV4dHVyZXM6RyxtYXhUZXh0dXJlU2l6ZTpKLG1heEN1YmVtYXBTaXplOlEsbWF4QXR0cmlidXRlczpTLG1heFZlcnRleFVuaWZvcm1zOlQsbWF4VmFyeWluZ3M6VyxtYXhGcmFnbWVudFVuaWZvcm1zOlgsdmVydGV4VGV4dHVyZXM6aWEsZmxvYXRGcmFnbWVudFRleHR1cmVzOmhhLGZsb2F0VmVydGV4VGV4dHVyZXM6c2EsbWF4U2FtcGxlczpxYX19ZnVuY3Rpb24gWmMoKXtmdW5jdGlvbiBiKCl7Si52YWx1ZSE9PW0mJihKLnZhbHVlPW0sSi5uZWVkc1VwZGF0ZT0wPHUpO2gubnVtUGxhbmVzPXU7aC5udW1JbnRlcnNlY3Rpb249MH1mdW5jdGlvbiBlKFEsUyxULFcpe3ZhciBYPW51bGwhPT1RP1EubGVuZ3RoOjAsaWE9bnVsbDtpZigwIT09WCl7aWE9Si52YWx1ZTtpZighMCE9PVd8fG51bGw9PT1pYSl7Vz1UKzQqWDtTPVMubWF0cml4V29ybGRJbnZlcnNlOwpHLmdldE5vcm1hbE1hdHJpeChTKTtpZihudWxsPT09aWF8fGlhLmxlbmd0aDxXKWlhPW5ldyBGbG9hdDMyQXJyYXkoVyk7Zm9yKFc9MDtXIT09WDsrK1csVCs9NClFLmNvcHkoUVtXXSkuYXBwbHlNYXRyaXg0KFMsRyksRS5ub3JtYWwudG9BcnJheShpYSxUKSxpYVtUKzNdPUUuY29uc3RhbnR9Si52YWx1ZT1pYTtKLm5lZWRzVXBkYXRlPSEwfWgubnVtUGxhbmVzPVg7cmV0dXJuIGlhfXZhciBoPXRoaXMsbT1udWxsLHU9MCx3PSExLEE9ITEsRT1uZXcgUmIsRz1uZXcgbCxKPXt2YWx1ZTpudWxsLG5lZWRzVXBkYXRlOiExfTt0aGlzLnVuaWZvcm09Sjt0aGlzLm51bUludGVyc2VjdGlvbj10aGlzLm51bVBsYW5lcz0wO3RoaXMuaW5pdD1mdW5jdGlvbihRLFMsVCl7dmFyIFc9MCE9PVEubGVuZ3RofHxTfHwwIT09dXx8dzt3PVM7bT1lKFEsVCwwKTt1PVEubGVuZ3RoO3JldHVybiBXfTt0aGlzLmJlZ2luU2hhZG93cz1mdW5jdGlvbigpe0E9ITA7ZShudWxsKX07dGhpcy5lbmRTaGFkb3dzPQpmdW5jdGlvbigpe0E9ITE7YigpfTt0aGlzLnNldFN0YXRlPWZ1bmN0aW9uKFEsUyxULFcsWCxpYSl7aWYoIXd8fG51bGw9PT1RfHwwPT09US5sZW5ndGh8fEEmJiFUKUE/ZShudWxsKTpiKCk7ZWxzZXtUPUE/MDp1O3ZhciBoYT00KlQsc2E9WC5jbGlwcGluZ1N0YXRlfHxudWxsO0oudmFsdWU9c2E7c2E9ZShRLFcsaGEsaWEpO2ZvcihRPTA7USE9PWhhOysrUSlzYVtRXT1tW1FdO1guY2xpcHBpbmdTdGF0ZT1zYTt0aGlzLm51bUludGVyc2VjdGlvbj1TP3RoaXMubnVtUGxhbmVzOjA7dGhpcy5udW1QbGFuZXMrPVR9fX1mdW5jdGlvbiBMZChiKXt2YXIgZT17fTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGgpe2lmKHZvaWQgMCE9PWVbaF0pcmV0dXJuIGVbaF07c3dpdGNoKGgpe2Nhc2UgIldFQkdMX2RlcHRoX3RleHR1cmUiOnZhciBtPWIuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9kZXB0aF90ZXh0dXJlIil8fGIuZ2V0RXh0ZW5zaW9uKCJNT1pfV0VCR0xfZGVwdGhfdGV4dHVyZSIpfHxiLmdldEV4dGVuc2lvbigiV0VCS0lUX1dFQkdMX2RlcHRoX3RleHR1cmUiKTsKYnJlYWs7Y2FzZSAiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIjptPWIuZ2V0RXh0ZW5zaW9uKCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKXx8Yi5nZXRFeHRlbnNpb24oIk1PWl9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKXx8Yi5nZXRFeHRlbnNpb24oIldFQktJVF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTticmVhaztjYXNlICJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyI6bT1iLmdldEV4dGVuc2lvbigiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKXx8Yi5nZXRFeHRlbnNpb24oIk1PWl9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpfHxiLmdldEV4dGVuc2lvbigiV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIik7YnJlYWs7Y2FzZSAiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIjptPWIuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKXx8CmIuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIik7YnJlYWs7ZGVmYXVsdDptPWIuZ2V0RXh0ZW5zaW9uKGgpfW51bGw9PT1tJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6ICIraCsiIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLiIpO3JldHVybiBlW2hdPW19fX1mdW5jdGlvbiBrZShiLGUsaCl7ZnVuY3Rpb24gbShFKXt2YXIgRz1FLnRhcmdldDtFPXcuZ2V0KEcpO251bGwhPT1FLmluZGV4JiZlLnJlbW92ZShFLmluZGV4KTtmb3IodmFyIEogaW4gRS5hdHRyaWJ1dGVzKWUucmVtb3ZlKEUuYXR0cmlidXRlc1tKXSk7Ry5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixtKTt3LmRlbGV0ZShHKTtpZihKPUEuZ2V0KEUpKWUucmVtb3ZlKEopLEEuZGVsZXRlKEUpO2gubWVtb3J5Lmdlb21ldHJpZXMtLX1mdW5jdGlvbiB1KEUpe3ZhciBHPVtdLEo9RS5pbmRleCxRPUUuYXR0cmlidXRlcy5wb3NpdGlvbjtpZihudWxsIT09Ckope3ZhciBTPUouYXJyYXk7Sj1KLnZlcnNpb247UT0wO2Zvcih2YXIgVD1TLmxlbmd0aDtRPFQ7USs9Myl7dmFyIFc9U1tRKzBdLFg9U1tRKzFdLGlhPVNbUSsyXTtHLnB1c2goVyxYLFgsaWEsaWEsVyl9fWVsc2UgZm9yKFM9US5hcnJheSxKPVEudmVyc2lvbixRPTAsVD1TLmxlbmd0aC8zLTE7UTxUO1ErPTMpVz1RKzAsWD1RKzEsaWE9USsyLEcucHVzaChXLFgsWCxpYSxpYSxXKTtHPW5ldyAoNjU1MzU8RmEoRyk/ZmE6YWEpKEcsMSk7Ry52ZXJzaW9uPUo7ZS51cGRhdGUoRywzNDk2Myk7KFM9QS5nZXQoRSkpJiZlLnJlbW92ZShTKTtBLnNldChFLEcpfXZhciB3PW5ldyBXZWFrTWFwLEE9bmV3IFdlYWtNYXA7cmV0dXJue2dldDpmdW5jdGlvbihFLEcpe3ZhciBKPXcuZ2V0KEcpO2lmKEopcmV0dXJuIEo7Ry5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixtKTtHLmlzQnVmZmVyR2VvbWV0cnk/Sj1HOkcuaXNHZW9tZXRyeSYmKHZvaWQgMD09PUcuX2J1ZmZlckdlb21ldHJ5JiYoRy5fYnVmZmVyR2VvbWV0cnk9CihuZXcgeGEpLnNldEZyb21PYmplY3QoRSkpLEo9Ry5fYnVmZmVyR2VvbWV0cnkpO3cuc2V0KEcsSik7aC5tZW1vcnkuZ2VvbWV0cmllcysrO3JldHVybiBKfSx1cGRhdGU6ZnVuY3Rpb24oRSl7dmFyIEc9RS5pbmRleCxKPUUuYXR0cmlidXRlcztudWxsIT09RyYmZS51cGRhdGUoRywzNDk2Myk7Zm9yKHZhciBRIGluIEopZS51cGRhdGUoSltRXSwzNDk2Mik7RT1FLm1vcnBoQXR0cmlidXRlcztmb3IoUSBpbiBFKXtHPUVbUV07Sj0wO2Zvcih2YXIgUz1HLmxlbmd0aDtKPFM7SisrKWUudXBkYXRlKEdbSl0sMzQ5NjIpfX0sZ2V0V2lyZWZyYW1lQXR0cmlidXRlOmZ1bmN0aW9uKEUpe3ZhciBHPUEuZ2V0KEUpO2lmKEcpe3ZhciBKPUUuaW5kZXg7bnVsbCE9PUomJkcudmVyc2lvbjxKLnZlcnNpb24mJnUoRSl9ZWxzZSB1KEUpO3JldHVybiBBLmdldChFKX19fWZ1bmN0aW9uIHFpKGIsZSxoLG0pe3ZhciB1LHcsQTt0aGlzLnNldE1vZGU9ZnVuY3Rpb24oRSl7dT1FfTt0aGlzLnNldEluZGV4PQpmdW5jdGlvbihFKXt3PUUudHlwZTtBPUUuYnl0ZXNQZXJFbGVtZW50fTt0aGlzLnJlbmRlcj1mdW5jdGlvbihFLEcpe2IuZHJhd0VsZW1lbnRzKHUsRyx3LEUqQSk7aC51cGRhdGUoRyx1KX07dGhpcy5yZW5kZXJJbnN0YW5jZXM9ZnVuY3Rpb24oRSxHLEope2lmKG0uaXNXZWJHTDIpe3ZhciBRPWI7dmFyIFM9ImRyYXdFbGVtZW50c0luc3RhbmNlZCJ9ZWxzZSBpZihRPWUuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIiksUz0iZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUiLG51bGw9PT1RKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7cmV0dXJufVFbU10odSxKLHcsRypBLEUubWF4SW5zdGFuY2VkQ291bnQpO2gudXBkYXRlKEosdSxFLm1heEluc3RhbmNlZENvdW50KX19CmZ1bmN0aW9uIE9xKCl7dmFyIGI9e2ZyYW1lOjAsY2FsbHM6MCx0cmlhbmdsZXM6MCxwb2ludHM6MCxsaW5lczowfTtyZXR1cm57bWVtb3J5OntnZW9tZXRyaWVzOjAsdGV4dHVyZXM6MH0scmVuZGVyOmIscHJvZ3JhbXM6bnVsbCxhdXRvUmVzZXQ6ITAscmVzZXQ6ZnVuY3Rpb24oKXtiLmZyYW1lKys7Yi5jYWxscz0wO2IudHJpYW5nbGVzPTA7Yi5wb2ludHM9MDtiLmxpbmVzPTB9LHVwZGF0ZTpmdW5jdGlvbihlLGgsbSl7bT1tfHwxO2IuY2FsbHMrKztzd2l0Y2goaCl7Y2FzZSA0OmIudHJpYW5nbGVzKz1lLzMqbTticmVhaztjYXNlIDU6Y2FzZSA2OmIudHJpYW5nbGVzKz1tKihlLTIpO2JyZWFrO2Nhc2UgMTpiLmxpbmVzKz1lLzIqbTticmVhaztjYXNlIDM6Yi5saW5lcys9bSooZS0xKTticmVhaztjYXNlIDI6Yi5saW5lcys9bSplO2JyZWFrO2Nhc2UgMDpiLnBvaW50cys9bSplO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xJbmZvOiBVbmtub3duIGRyYXcgbW9kZToiLApoKX19fX1mdW5jdGlvbiBQcShiLGUpe3JldHVybiBNYXRoLmFicyhlWzFdKS1NYXRoLmFicyhiWzFdKX1mdW5jdGlvbiBRcShiKXt2YXIgZT17fSxoPW5ldyBGbG9hdDMyQXJyYXkoOCk7cmV0dXJue3VwZGF0ZTpmdW5jdGlvbihtLHUsdyxBKXt2YXIgRT1tLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyxHPUUubGVuZ3RoO209ZVt1LmlkXTtpZih2b2lkIDA9PT1tKXttPVtdO2Zvcih2YXIgSj0wO0o8RztKKyspbVtKXT1bSiwwXTtlW3UuaWRdPW19dmFyIFE9dy5tb3JwaFRhcmdldHMmJnUubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO3c9dy5tb3JwaE5vcm1hbHMmJnUubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbDtmb3IoSj0wO0o8RztKKyspe3ZhciBTPW1bSl07MCE9PVNbMV0mJihRJiZ1LnJlbW92ZUF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK0opLHcmJnUucmVtb3ZlQXR0cmlidXRlKCJtb3JwaE5vcm1hbCIrSikpfWZvcihKPTA7SjxHO0orKylTPW1bSl0sU1swXT1KLFNbMV09RVtKXTttLnNvcnQoUHEpOwpmb3IoSj0wOzg+SjtKKyspe2lmKFM9bVtKXSlpZihFPVNbMF0sRz1TWzFdKXtRJiZ1LmFkZEF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK0osUVtFXSk7dyYmdS5hZGRBdHRyaWJ1dGUoIm1vcnBoTm9ybWFsIitKLHdbRV0pO2hbSl09Rztjb250aW51ZX1oW0pdPTB9QS5nZXRVbmlmb3JtcygpLnNldFZhbHVlKGIsIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyIsaCl9fX1mdW5jdGlvbiBScShiLGUpe3ZhciBoPXt9O3JldHVybnt1cGRhdGU6ZnVuY3Rpb24obSl7dmFyIHU9ZS5yZW5kZXIuZnJhbWUsdz1tLmdlb21ldHJ5LEE9Yi5nZXQobSx3KTtoW0EuaWRdIT09dSYmKHcuaXNHZW9tZXRyeSYmQS51cGRhdGVGcm9tT2JqZWN0KG0pLGIudXBkYXRlKEEpLGhbQS5pZF09dSk7cmV0dXJuIEF9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtoPXt9fX19ZnVuY3Rpb24gTWQoYixlLGgsbSx1LHcsQSxFLEcsSil7Yj12b2lkIDAhPT1iP2I6W107ay5jYWxsKHRoaXMsYix2b2lkIDAhPT1lP2U6MzAxLGgsbSx1LHcsCnZvaWQgMCE9PUE/QToxMDIyLEUsRyxKKTt0aGlzLmZsaXBZPSExfWZ1bmN0aW9uIENmKGIsZSxoLG0pe2suY2FsbCh0aGlzLG51bGwpO3RoaXMuaW1hZ2U9e2RhdGE6Yix3aWR0aDplLGhlaWdodDpoLGRlcHRoOm19O3RoaXMubWluRmlsdGVyPXRoaXMubWFnRmlsdGVyPTEwMDM7dGhpcy53cmFwUj0xMDAxO3RoaXMuZmxpcFk9dGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITF9ZnVuY3Rpb24gRGYoYixlLGgsbSl7ay5jYWxsKHRoaXMsbnVsbCk7dGhpcy5pbWFnZT17ZGF0YTpiLHdpZHRoOmUsaGVpZ2h0OmgsZGVwdGg6bX07dGhpcy5taW5GaWx0ZXI9dGhpcy5tYWdGaWx0ZXI9MTAwMzt0aGlzLndyYXBSPTEwMDE7dGhpcy5mbGlwWT10aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX1mdW5jdGlvbiBFZihiLGUsaCl7dmFyIG09YlswXTtpZigwPj1tfHwwPG0pcmV0dXJuIGI7dmFyIHU9ZSpoLHc9bG5bdV07dm9pZCAwPT09dyYmKHc9bmV3IEZsb2F0MzJBcnJheSh1KSxsblt1XT13KTtpZigwIT09ZSlmb3IobS50b0FycmF5KHcsCjApLG09MSx1PTA7bSE9PWU7KyttKXUrPWgsYlttXS50b0FycmF5KHcsdSk7cmV0dXJuIHd9ZnVuY3Rpb24gUWMoYixlKXtpZihiLmxlbmd0aCE9PWUubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgaD0wLG09Yi5sZW5ndGg7aDxtO2grKylpZihiW2hdIT09ZVtoXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBJYyhiLGUpe2Zvcih2YXIgaD0wLG09ZS5sZW5ndGg7aDxtO2grKyliW2hdPWVbaF19ZnVuY3Rpb24gbW4oYixlKXt2YXIgaD1ubltlXTt2b2lkIDA9PT1oJiYoaD1uZXcgSW50MzJBcnJheShlKSxubltlXT1oKTtmb3IodmFyIG09MDttIT09ZTsrK20paFttXT1iLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtyZXR1cm4gaH1mdW5jdGlvbiBTcShiLGUpe3ZhciBoPXRoaXMuY2FjaGU7aFswXSE9PWUmJihiLnVuaWZvcm0xZih0aGlzLmFkZHIsZSksaFswXT1lKX1mdW5jdGlvbiBUcShiLGUpe3ZhciBoPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09ZS54KXtpZihoWzBdIT09ZS54fHxoWzFdIT09CmUueSliLnVuaWZvcm0yZih0aGlzLmFkZHIsZS54LGUueSksaFswXT1lLngsaFsxXT1lLnl9ZWxzZSBRYyhoLGUpfHwoYi51bmlmb3JtMmZ2KHRoaXMuYWRkcixlKSxJYyhoLGUpKX1mdW5jdGlvbiBVcShiLGUpe3ZhciBoPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09ZS54KXtpZihoWzBdIT09ZS54fHxoWzFdIT09ZS55fHxoWzJdIT09ZS56KWIudW5pZm9ybTNmKHRoaXMuYWRkcixlLngsZS55LGUueiksaFswXT1lLngsaFsxXT1lLnksaFsyXT1lLnp9ZWxzZSBpZih2b2lkIDAhPT1lLnIpe2lmKGhbMF0hPT1lLnJ8fGhbMV0hPT1lLmd8fGhbMl0hPT1lLmIpYi51bmlmb3JtM2YodGhpcy5hZGRyLGUucixlLmcsZS5iKSxoWzBdPWUucixoWzFdPWUuZyxoWzJdPWUuYn1lbHNlIFFjKGgsZSl8fChiLnVuaWZvcm0zZnYodGhpcy5hZGRyLGUpLEljKGgsZSkpfWZ1bmN0aW9uIFZxKGIsZSl7dmFyIGg9dGhpcy5jYWNoZTtpZih2b2lkIDAhPT1lLngpe2lmKGhbMF0hPT1lLnh8fGhbMV0hPT1lLnl8fApoWzJdIT09ZS56fHxoWzNdIT09ZS53KWIudW5pZm9ybTRmKHRoaXMuYWRkcixlLngsZS55LGUueixlLncpLGhbMF09ZS54LGhbMV09ZS55LGhbMl09ZS56LGhbM109ZS53fWVsc2UgUWMoaCxlKXx8KGIudW5pZm9ybTRmdih0aGlzLmFkZHIsZSksSWMoaCxlKSl9ZnVuY3Rpb24gV3EoYixlKXt2YXIgaD10aGlzLmNhY2hlLG09ZS5lbGVtZW50czt2b2lkIDA9PT1tP1FjKGgsZSl8fChiLnVuaWZvcm1NYXRyaXgyZnYodGhpcy5hZGRyLCExLGUpLEljKGgsZSkpOlFjKGgsbSl8fChvbi5zZXQobSksYi51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxvbiksSWMoaCxtKSl9ZnVuY3Rpb24gWHEoYixlKXt2YXIgaD10aGlzLmNhY2hlLG09ZS5lbGVtZW50czt2b2lkIDA9PT1tP1FjKGgsZSl8fChiLnVuaWZvcm1NYXRyaXgzZnYodGhpcy5hZGRyLCExLGUpLEljKGgsZSkpOlFjKGgsbSl8fChwbi5zZXQobSksYi51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxwbiksSWMoaCxtKSl9CmZ1bmN0aW9uIFlxKGIsZSl7dmFyIGg9dGhpcy5jYWNoZSxtPWUuZWxlbWVudHM7dm9pZCAwPT09bT9RYyhoLGUpfHwoYi51bmlmb3JtTWF0cml4NGZ2KHRoaXMuYWRkciwhMSxlKSxJYyhoLGUpKTpRYyhoLG0pfHwocW4uc2V0KG0pLGIudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsITEscW4pLEljKGgsbSkpfWZ1bmN0aW9uIFpxKGIsZSxoKXt2YXIgbT10aGlzLmNhY2hlLHU9aC5hbGxvY2F0ZVRleHR1cmVVbml0KCk7bVswXSE9PXUmJihiLnVuaWZvcm0xaSh0aGlzLmFkZHIsdSksbVswXT11KTtoLnNhZmVTZXRUZXh0dXJlMkQoZXx8cm4sdSl9ZnVuY3Rpb24gJHEoYixlLGgpe3ZhciBtPXRoaXMuY2FjaGUsdT1oLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTttWzBdIT09dSYmKGIudW5pZm9ybTFpKHRoaXMuYWRkcix1KSxtWzBdPXUpO2guc2V0VGV4dHVyZTJEQXJyYXkoZXx8YXIsdSl9ZnVuY3Rpb24gYnIoYixlLGgpe3ZhciBtPXRoaXMuY2FjaGUsdT1oLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTsKbVswXSE9PXUmJihiLnVuaWZvcm0xaSh0aGlzLmFkZHIsdSksbVswXT11KTtoLnNldFRleHR1cmUzRChlfHxjcix1KX1mdW5jdGlvbiBkcihiLGUsaCl7dmFyIG09dGhpcy5jYWNoZSx1PWguYWxsb2NhdGVUZXh0dXJlVW5pdCgpO21bMF0hPT11JiYoYi51bmlmb3JtMWkodGhpcy5hZGRyLHUpLG1bMF09dSk7aC5zYWZlU2V0VGV4dHVyZUN1YmUoZXx8c24sdSl9ZnVuY3Rpb24gZXIoYixlKXt2YXIgaD10aGlzLmNhY2hlO2hbMF0hPT1lJiYoYi51bmlmb3JtMWkodGhpcy5hZGRyLGUpLGhbMF09ZSl9ZnVuY3Rpb24gZnIoYixlKXt2YXIgaD10aGlzLmNhY2hlO1FjKGgsZSl8fChiLnVuaWZvcm0yaXYodGhpcy5hZGRyLGUpLEljKGgsZSkpfWZ1bmN0aW9uIGdyKGIsZSl7dmFyIGg9dGhpcy5jYWNoZTtRYyhoLGUpfHwoYi51bmlmb3JtM2l2KHRoaXMuYWRkcixlKSxJYyhoLGUpKX1mdW5jdGlvbiBocihiLGUpe3ZhciBoPXRoaXMuY2FjaGU7UWMoaCxlKXx8KGIudW5pZm9ybTRpdih0aGlzLmFkZHIsCmUpLEljKGgsZSkpfWZ1bmN0aW9uIGlyKGIpe3N3aXRjaChiKXtjYXNlIDUxMjY6cmV0dXJuIFNxO2Nhc2UgMzU2NjQ6cmV0dXJuIFRxO2Nhc2UgMzU2NjU6cmV0dXJuIFVxO2Nhc2UgMzU2NjY6cmV0dXJuIFZxO2Nhc2UgMzU2NzQ6cmV0dXJuIFdxO2Nhc2UgMzU2NzU6cmV0dXJuIFhxO2Nhc2UgMzU2NzY6cmV0dXJuIFlxO2Nhc2UgMzU2Nzg6Y2FzZSAzNjE5ODpyZXR1cm4gWnE7Y2FzZSAzNTY3OTpyZXR1cm4gYnI7Y2FzZSAzNTY4MDpyZXR1cm4gZHI7Y2FzZSAzNjI4OTpyZXR1cm4gJHE7Y2FzZSA1MTI0OmNhc2UgMzU2NzA6cmV0dXJuIGVyO2Nhc2UgMzU2Njc6Y2FzZSAzNTY3MTpyZXR1cm4gZnI7Y2FzZSAzNTY2ODpjYXNlIDM1NjcyOnJldHVybiBncjtjYXNlIDM1NjY5OmNhc2UgMzU2NzM6cmV0dXJuIGhyfX1mdW5jdGlvbiBqcihiLGUpe2IudW5pZm9ybTFmdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24ga3IoYixlKXtiLnVuaWZvcm0xaXYodGhpcy5hZGRyLGUpfWZ1bmN0aW9uIGxyKGIsCmUpe2IudW5pZm9ybTJpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gbXIoYixlKXtiLnVuaWZvcm0zaXYodGhpcy5hZGRyLGUpfWZ1bmN0aW9uIG5yKGIsZSl7Yi51bmlmb3JtNGl2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBvcihiLGUpe2U9RWYoZSx0aGlzLnNpemUsMik7Yi51bmlmb3JtMmZ2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBwcihiLGUpe2U9RWYoZSx0aGlzLnNpemUsMyk7Yi51bmlmb3JtM2Z2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBxcihiLGUpe2U9RWYoZSx0aGlzLnNpemUsNCk7Yi51bmlmb3JtNGZ2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBycihiLGUpe2U9RWYoZSx0aGlzLnNpemUsNCk7Yi51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxlKX1mdW5jdGlvbiBzcihiLGUpe2U9RWYoZSx0aGlzLnNpemUsOSk7Yi51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxlKX1mdW5jdGlvbiB0cihiLGUpe2U9RWYoZSx0aGlzLnNpemUsMTYpO2IudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsCiExLGUpfWZ1bmN0aW9uIHVyKGIsZSxoKXt2YXIgbT1lLmxlbmd0aCx1PW1uKGgsbSk7Yi51bmlmb3JtMWl2KHRoaXMuYWRkcix1KTtmb3IoYj0wO2IhPT1tOysrYiloLnNhZmVTZXRUZXh0dXJlMkQoZVtiXXx8cm4sdVtiXSl9ZnVuY3Rpb24gdnIoYixlLGgpe3ZhciBtPWUubGVuZ3RoLHU9bW4oaCxtKTtiLnVuaWZvcm0xaXYodGhpcy5hZGRyLHUpO2ZvcihiPTA7YiE9PW07KytiKWguc2FmZVNldFRleHR1cmVDdWJlKGVbYl18fHNuLHVbYl0pfWZ1bmN0aW9uIHdyKGIpe3N3aXRjaChiKXtjYXNlIDUxMjY6cmV0dXJuIGpyO2Nhc2UgMzU2NjQ6cmV0dXJuIG9yO2Nhc2UgMzU2NjU6cmV0dXJuIHByO2Nhc2UgMzU2NjY6cmV0dXJuIHFyO2Nhc2UgMzU2NzQ6cmV0dXJuIHJyO2Nhc2UgMzU2NzU6cmV0dXJuIHNyO2Nhc2UgMzU2NzY6cmV0dXJuIHRyO2Nhc2UgMzU2Nzg6cmV0dXJuIHVyO2Nhc2UgMzU2ODA6cmV0dXJuIHZyO2Nhc2UgNTEyNDpjYXNlIDM1NjcwOnJldHVybiBrcjtjYXNlIDM1NjY3OmNhc2UgMzU2NzE6cmV0dXJuIGxyOwpjYXNlIDM1NjY4OmNhc2UgMzU2NzI6cmV0dXJuIG1yO2Nhc2UgMzU2Njk6Y2FzZSAzNTY3MzpyZXR1cm4gbnJ9fWZ1bmN0aW9uIHhyKGIsZSxoKXt0aGlzLmlkPWI7dGhpcy5hZGRyPWg7dGhpcy5jYWNoZT1bXTt0aGlzLnNldFZhbHVlPWlyKGUudHlwZSl9ZnVuY3Rpb24gdG4oYixlLGgpe3RoaXMuaWQ9Yjt0aGlzLmFkZHI9aDt0aGlzLmNhY2hlPVtdO3RoaXMuc2l6ZT1lLnNpemU7dGhpcy5zZXRWYWx1ZT13cihlLnR5cGUpfWZ1bmN0aW9uIHVuKGIpe3RoaXMuaWQ9Yjt0aGlzLnNlcT1bXTt0aGlzLm1hcD17fX1mdW5jdGlvbiB2bihiLGUpe2Iuc2VxLnB1c2goZSk7Yi5tYXBbZS5pZF09ZX1mdW5jdGlvbiB5cihiLGUsaCl7dmFyIG09Yi5uYW1lLHU9bS5sZW5ndGg7Zm9yKG9rLmxhc3RJbmRleD0wOzspe3ZhciB3PW9rLmV4ZWMobSksQT1vay5sYXN0SW5kZXgsRT13WzFdLEc9d1szXTsiXSI9PT13WzJdJiYoRXw9MCk7aWYodm9pZCAwPT09R3x8IlsiPT09RyYmQSsyPT09dSl7dm4oaCwKdm9pZCAwPT09Rz9uZXcgeHIoRSxiLGUpOm5ldyB0bihFLGIsZSkpO2JyZWFrfWVsc2Ugdz1oLm1hcFtFXSx2b2lkIDA9PT13JiYodz1uZXcgdW4oRSksdm4oaCx3KSksaD13fX1mdW5jdGlvbiBsZShiLGUpe3RoaXMuc2VxPVtdO3RoaXMubWFwPXt9O2Zvcih2YXIgaD1iLmdldFByb2dyYW1QYXJhbWV0ZXIoZSwzNTcxOCksbT0wO208aDsrK20pe3ZhciB1PWIuZ2V0QWN0aXZlVW5pZm9ybShlLG0pO3lyKHUsYi5nZXRVbmlmb3JtTG9jYXRpb24oZSx1Lm5hbWUpLHRoaXMpfX1mdW5jdGlvbiB3bihiLGUsaCl7ZT1iLmNyZWF0ZVNoYWRlcihlKTtiLnNoYWRlclNvdXJjZShlLGgpO2IuY29tcGlsZVNoYWRlcihlKTtyZXR1cm4gZX1mdW5jdGlvbiB6cihiKXtiPWIuc3BsaXQoIlxuIik7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspYltlXT1lKzErIjogIitiW2VdO3JldHVybiBiLmpvaW4oIlxuIil9ZnVuY3Rpb24geG4oYil7c3dpdGNoKGIpe2Nhc2UgM0UzOnJldHVyblsiTGluZWFyIiwKIiggdmFsdWUgKSJdO2Nhc2UgMzAwMTpyZXR1cm5bInNSR0IiLCIoIHZhbHVlICkiXTtjYXNlIDMwMDI6cmV0dXJuWyJSR0JFIiwiKCB2YWx1ZSApIl07Y2FzZSAzMDA0OnJldHVyblsiUkdCTSIsIiggdmFsdWUsIDcuMCApIl07Y2FzZSAzMDA1OnJldHVyblsiUkdCTSIsIiggdmFsdWUsIDE2LjAgKSJdO2Nhc2UgMzAwNjpyZXR1cm5bIlJHQkQiLCIoIHZhbHVlLCAyNTYuMCApIl07Y2FzZSAzMDA3OnJldHVyblsiR2FtbWEiLCIoIHZhbHVlLCBmbG9hdCggR0FNTUFfRkFDVE9SICkgKSJdO2Nhc2UgMzAwMzpyZXR1cm5bIkxvZ0x1diIsIiggdmFsdWUgKSJdO2RlZmF1bHQ6dGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIGVuY29kaW5nOiAiK2IpO319ZnVuY3Rpb24geW4oYixlLGgpe3ZhciBtPWIuZ2V0U2hhZGVyUGFyYW1ldGVyKGUsMzU3MTMpLHU9Yi5nZXRTaGFkZXJJbmZvTG9nKGUpLnRyaW0oKTtyZXR1cm4gbSYmIiI9PT11PyIiOiJUSFJFRS5XZWJHTFNoYWRlcjogZ2wuZ2V0U2hhZGVySW5mb0xvZygpICIrCmgrIlxuIit1K3pyKGIuZ2V0U2hhZGVyU291cmNlKGUpKX1mdW5jdGlvbiByaShiLGUpe2U9eG4oZSk7cmV0dXJuInZlYzQgIitiKyIoIHZlYzQgdmFsdWUgKSB7IHJldHVybiAiK2VbMF0rIlRvTGluZWFyIitlWzFdKyI7IH0ifWZ1bmN0aW9uIEFyKGIsZSl7ZT14bihlKTtyZXR1cm4idmVjNCAiK2IrIiggdmVjNCB2YWx1ZSApIHsgcmV0dXJuIExpbmVhclRvIitlWzBdK2VbMV0rIjsgfSJ9ZnVuY3Rpb24gQnIoYixlKXtzd2l0Y2goZSl7Y2FzZSAxOmU9IkxpbmVhciI7YnJlYWs7Y2FzZSAyOmU9IlJlaW5oYXJkIjticmVhaztjYXNlIDM6ZT0iVW5jaGFydGVkMiI7YnJlYWs7Y2FzZSA0OmU9Ik9wdGltaXplZENpbmVvbiI7YnJlYWs7Y2FzZSA1OmU9IkFDRVNGaWxtaWMiO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIHRvbmVNYXBwaW5nOiAiK2UpO31yZXR1cm4idmVjMyAiK2IrIiggdmVjMyBjb2xvciApIHsgcmV0dXJuICIrZSsiVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0ifQpmdW5jdGlvbiBDcihiLGUsaCl7Yj1ifHx7fTtyZXR1cm5bYi5kZXJpdmF0aXZlc3x8ZS5lbnZNYXBDdWJlVVZ8fGUuYnVtcE1hcHx8ZS50YW5nZW50U3BhY2VOb3JtYWxNYXB8fGUuY2xlYXJjb2F0Tm9ybWFsTWFwfHxlLmZsYXRTaGFkaW5nPyIjZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IGVuYWJsZSI6IiIsKGIuZnJhZ0RlcHRofHxlLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIpJiZoLmdldCgiRVhUX2ZyYWdfZGVwdGgiKT8iI2V4dGVuc2lvbiBHTF9FWFRfZnJhZ19kZXB0aCA6IGVuYWJsZSI6IiIsYi5kcmF3QnVmZmVycyYmaC5nZXQoIldFQkdMX2RyYXdfYnVmZmVycyIpPyIjZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlIjoiIiwoYi5zaGFkZXJUZXh0dXJlTE9EfHxlLmVudk1hcCkmJmguZ2V0KCJFWFRfc2hhZGVyX3RleHR1cmVfbG9kIik/IiNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IGVuYWJsZSI6IiJdLmZpbHRlcihaZykuam9pbigiXG4iKX0KZnVuY3Rpb24gRHIoYil7dmFyIGU9W10saDtmb3IoaCBpbiBiKXt2YXIgbT1iW2hdOyExIT09bSYmZS5wdXNoKCIjZGVmaW5lICIraCsiICIrbSl9cmV0dXJuIGUuam9pbigiXG4iKX1mdW5jdGlvbiBFcihiLGUpe2Zvcih2YXIgaD17fSxtPWIuZ2V0UHJvZ3JhbVBhcmFtZXRlcihlLDM1NzIxKSx1PTA7dTxtO3UrKyl7dmFyIHc9Yi5nZXRBY3RpdmVBdHRyaWIoZSx1KS5uYW1lO2hbd109Yi5nZXRBdHRyaWJMb2NhdGlvbihlLHcpfXJldHVybiBofWZ1bmN0aW9uIFpnKGIpe3JldHVybiIiIT09Yn1mdW5jdGlvbiB6bihiLGUpe3JldHVybiBiLnJlcGxhY2UoL05VTV9ESVJfTElHSFRTL2csZS5udW1EaXJMaWdodHMpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUUy9nLGUubnVtU3BvdExpZ2h0cykucmVwbGFjZSgvTlVNX1JFQ1RfQVJFQV9MSUdIVFMvZyxlLm51bVJlY3RBcmVhTGlnaHRzKS5yZXBsYWNlKC9OVU1fUE9JTlRfTElHSFRTL2csZS5udW1Qb2ludExpZ2h0cykucmVwbGFjZSgvTlVNX0hFTUlfTElHSFRTL2csCmUubnVtSGVtaUxpZ2h0cykucmVwbGFjZSgvTlVNX0RJUl9MSUdIVF9TSEFET1dTL2csZS5udW1EaXJMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUX1NIQURPV1MvZyxlLm51bVNwb3RMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9QT0lOVF9MSUdIVF9TSEFET1dTL2csZS5udW1Qb2ludExpZ2h0U2hhZG93cyl9ZnVuY3Rpb24gQW4oYixlKXtyZXR1cm4gYi5yZXBsYWNlKC9OVU1fQ0xJUFBJTkdfUExBTkVTL2csZS5udW1DbGlwcGluZ1BsYW5lcykucmVwbGFjZSgvVU5JT05fQ0xJUFBJTkdfUExBTkVTL2csZS5udW1DbGlwcGluZ1BsYW5lcy1lLm51bUNsaXBJbnRlcnNlY3Rpb24pfWZ1bmN0aW9uIHBrKGIpe3JldHVybiBiLnJlcGxhY2UoL15bIFx0XSojaW5jbHVkZSArPChbXHdcZC4vXSspPi9nbSxmdW5jdGlvbihlLGgpe2U9d2JbaF07aWYodm9pZCAwPT09ZSl0aHJvdyBFcnJvcigiQ2FuIG5vdCByZXNvbHZlICNpbmNsdWRlIFx4M2MiK2grIlx4M2UiKTtyZXR1cm4gcGsoZSl9KX0KZnVuY3Rpb24gQm4oYil7cmV0dXJuIGIucmVwbGFjZSgvI3ByYWdtYSB1bnJvbGxfbG9vcFtcc10rP2ZvciBcKCBpbnQgaSA9IChcZCspOyBpIDwgKFxkKyk7IGkgXCtcKyBcKSBceyhbXHNcU10rPykoPz1cfSlcfS9nLGZ1bmN0aW9uKGUsaCxtLHUpe2U9IiI7Zm9yKGg9cGFyc2VJbnQoaCk7aDxwYXJzZUludChtKTtoKyspZSs9dS5yZXBsYWNlKC9cWyBpIFxdL2csIlsgIitoKyIgXSIpLnJlcGxhY2UoL1VOUk9MTEVEX0xPT1BfSU5ERVgvZyxoKTtyZXR1cm4gZX0pfWZ1bmN0aW9uIEZyKGIsZSxoLG0sdSx3LEEpe3ZhciBFPWIuZ2V0Q29udGV4dCgpLEc9bS5kZWZpbmVzLEo9dS52ZXJ0ZXhTaGFkZXIsUT11LmZyYWdtZW50U2hhZGVyLFM9IlNIQURPV01BUF9UWVBFX0JBU0lDIjsxPT09dy5zaGFkb3dNYXBUeXBlP1M9IlNIQURPV01BUF9UWVBFX1BDRiI6Mj09PXcuc2hhZG93TWFwVHlwZT9TPSJTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCI6Mz09PXcuc2hhZG93TWFwVHlwZSYmKFM9CiJTSEFET1dNQVBfVFlQRV9WU00iKTt2YXIgVD0iRU5WTUFQX1RZUEVfQ1VCRSIsVz0iRU5WTUFQX01PREVfUkVGTEVDVElPTiIsWD0iRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZIjtpZih3LmVudk1hcCl7c3dpdGNoKG0uZW52TWFwLm1hcHBpbmcpe2Nhc2UgMzAxOmNhc2UgMzAyOlQ9IkVOVk1BUF9UWVBFX0NVQkUiO2JyZWFrO2Nhc2UgMzA2OmNhc2UgMzA3OlQ9IkVOVk1BUF9UWVBFX0NVQkVfVVYiO2JyZWFrO2Nhc2UgMzAzOmNhc2UgMzA0OlQ9IkVOVk1BUF9UWVBFX0VRVUlSRUMiO2JyZWFrO2Nhc2UgMzA1OlQ9IkVOVk1BUF9UWVBFX1NQSEVSRSJ9c3dpdGNoKG0uZW52TWFwLm1hcHBpbmcpe2Nhc2UgMzAyOmNhc2UgMzA0Olc9IkVOVk1BUF9NT0RFX1JFRlJBQ1RJT04ifXN3aXRjaChtLmNvbWJpbmUpe2Nhc2UgMDpYPSJFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFkiO2JyZWFrO2Nhc2UgMTpYPSJFTlZNQVBfQkxFTkRJTkdfTUlYIjticmVhaztjYXNlIDI6WD0iRU5WTUFQX0JMRU5ESU5HX0FERCJ9fXZhciBpYT0KMDxiLmdhbW1hRmFjdG9yP2IuZ2FtbWFGYWN0b3I6MSxoYT1BLmlzV2ViR0wyPyIiOkNyKG0uZXh0ZW5zaW9ucyx3LGUpLHNhPURyKEcpLHFhPUUuY3JlYXRlUHJvZ3JhbSgpO20uaXNSYXdTaGFkZXJNYXRlcmlhbD8oRz1bc2FdLmZpbHRlcihaZykuam9pbigiXG4iKSwwPEcubGVuZ3RoJiYoRys9IlxuIiksZT1baGEsc2FdLmZpbHRlcihaZykuam9pbigiXG4iKSwwPGUubGVuZ3RoJiYoZSs9IlxuIikpOihHPVsicHJlY2lzaW9uICIrdy5wcmVjaXNpb24rIiBmbG9hdDsiLCJwcmVjaXNpb24gIit3LnByZWNpc2lvbisiIGludDsiLCJoaWdocCI9PT13LnByZWNpc2lvbj8iI2RlZmluZSBISUdIX1BSRUNJU0lPTiI6IiIsIiNkZWZpbmUgU0hBREVSX05BTUUgIit1Lm5hbWUsc2Esdy5zdXBwb3J0c1ZlcnRleFRleHR1cmVzPyIjZGVmaW5lIFZFUlRFWF9URVhUVVJFUyI6IiIsIiNkZWZpbmUgR0FNTUFfRkFDVE9SICIraWEsIiNkZWZpbmUgTUFYX0JPTkVTICIrdy5tYXhCb25lcyx3LnVzZUZvZyYmCncuZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLHcudXNlRm9nJiZ3LmZvZ0V4cDI/IiNkZWZpbmUgRk9HX0VYUDIiOiIiLHcubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLHcuZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLHcuZW52TWFwPyIjZGVmaW5lICIrVzoiIix3LmxpZ2h0TWFwPyIjZGVmaW5lIFVTRV9MSUdIVE1BUCI6IiIsdy5hb01hcD8iI2RlZmluZSBVU0VfQU9NQVAiOiIiLHcuZW1pc3NpdmVNYXA/IiNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQIjoiIix3LmJ1bXBNYXA/IiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLHcubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLHcubm9ybWFsTWFwJiZ3Lm9iamVjdFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCI6IiIsdy5ub3JtYWxNYXAmJncudGFuZ2VudFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAiOiIiLHcuY2xlYXJjb2F0Tm9ybWFsTWFwPwoiI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCI6IiIsdy5kaXNwbGFjZW1lbnRNYXAmJncuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcz8iI2RlZmluZSBVU0VfRElTUExBQ0VNRU5UTUFQIjoiIix3LnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsdy5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6IiIsdy5tZXRhbG5lc3NNYXA/IiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCI6IiIsdy5hbHBoYU1hcD8iI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLHcudmVydGV4VGFuZ2VudHM/IiNkZWZpbmUgVVNFX1RBTkdFTlQiOiIiLHcudmVydGV4Q29sb3JzPyIjZGVmaW5lIFVTRV9DT0xPUiI6IiIsdy52ZXJ0ZXhVdnM/IiNkZWZpbmUgVVNFX1VWIjoiIix3LmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIix3LnNraW5uaW5nPyIjZGVmaW5lIFVTRV9TS0lOTklORyI6IiIsdy51c2VWZXJ0ZXhUZXh0dXJlPyIjZGVmaW5lIEJPTkVfVEVYVFVSRSI6CiIiLHcubW9ycGhUYXJnZXRzPyIjZGVmaW5lIFVTRV9NT1JQSFRBUkdFVFMiOiIiLHcubW9ycGhOb3JtYWxzJiYhMT09PXcuZmxhdFNoYWRpbmc/IiNkZWZpbmUgVVNFX01PUlBITk9STUFMUyI6IiIsdy5kb3VibGVTaWRlZD8iI2RlZmluZSBET1VCTEVfU0lERUQiOiIiLHcuZmxpcFNpZGVkPyIjZGVmaW5lIEZMSVBfU0lERUQiOiIiLHcuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSBVU0VfU0hBRE9XTUFQIjoiIix3LnNoYWRvd01hcEVuYWJsZWQ/IiNkZWZpbmUgIitTOiIiLHcuc2l6ZUF0dGVudWF0aW9uPyIjZGVmaW5lIFVTRV9TSVpFQVRURU5VQVRJT04iOiIiLHcubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcj8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUYiOiIiLHcubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciYmKEEuaXNXZWJHTDJ8fGUuZ2V0KCJFWFRfZnJhZ19kZXB0aCIpKT8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUIjoiIiwidW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OyIsInVuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7IiwKInVuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4OyIsInVuaWZvcm0gbWF0NCB2aWV3TWF0cml4OyIsInVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7IiwidW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOyIsImF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uOyIsImF0dHJpYnV0ZSB2ZWMzIG5vcm1hbDsiLCJhdHRyaWJ1dGUgdmVjMiB1djsiLCIjaWZkZWYgVVNFX1RBTkdFTlQiLCJcdGF0dHJpYnV0ZSB2ZWM0IHRhbmdlbnQ7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9DT0xPUiIsIlx0YXR0cmlidXRlIHZlYzMgY29sb3I7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFMiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MDsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MTsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MjsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MzsiLCJcdCNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTIiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMDsiLAoiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMTsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwyOyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDM7IiwiXHQjZWxzZSIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDQ7IiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NTsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ2OyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDc7IiwiXHQjZW5kaWYiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX1NLSU5OSU5HIiwiXHRhdHRyaWJ1dGUgdmVjNCBza2luSW5kZXg7IiwiXHRhdHRyaWJ1dGUgdmVjNCBza2luV2VpZ2h0OyIsIiNlbmRpZiIsIlxuIl0uZmlsdGVyKFpnKS5qb2luKCJcbiIpLGU9W2hhLCJwcmVjaXNpb24gIit3LnByZWNpc2lvbisiIGZsb2F0OyIsInByZWNpc2lvbiAiK3cucHJlY2lzaW9uKyIgaW50OyIsImhpZ2hwIj09PXcucHJlY2lzaW9uPyIjZGVmaW5lIEhJR0hfUFJFQ0lTSU9OIjoKIiIsIiNkZWZpbmUgU0hBREVSX05BTUUgIit1Lm5hbWUsc2Esdy5hbHBoYVRlc3Q/IiNkZWZpbmUgQUxQSEFURVNUICIrdy5hbHBoYVRlc3QrKHcuYWxwaGFUZXN0JTE/IiI6Ii4wIik6IiIsIiNkZWZpbmUgR0FNTUFfRkFDVE9SICIraWEsdy51c2VGb2cmJncuZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLHcudXNlRm9nJiZ3LmZvZ0V4cDI/IiNkZWZpbmUgRk9HX0VYUDIiOiIiLHcubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLHcubWF0Y2FwPyIjZGVmaW5lIFVTRV9NQVRDQVAiOiIiLHcuZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLHcuZW52TWFwPyIjZGVmaW5lICIrVDoiIix3LmVudk1hcD8iI2RlZmluZSAiK1c6IiIsdy5lbnZNYXA/IiNkZWZpbmUgIitYOiIiLHcubGlnaHRNYXA/IiNkZWZpbmUgVVNFX0xJR0hUTUFQIjoiIix3LmFvTWFwPyIjZGVmaW5lIFVTRV9BT01BUCI6IiIsdy5lbWlzc2l2ZU1hcD8iI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAiOiIiLHcuYnVtcE1hcD8KIiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLHcubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLHcubm9ybWFsTWFwJiZ3Lm9iamVjdFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCI6IiIsdy5ub3JtYWxNYXAmJncudGFuZ2VudFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAiOiIiLHcuY2xlYXJjb2F0Tm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQIjoiIix3LnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsdy5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6IiIsdy5tZXRhbG5lc3NNYXA/IiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCI6IiIsdy5hbHBoYU1hcD8iI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLHcuc2hlZW4/IiNkZWZpbmUgVVNFX1NIRUVOIjoiIix3LnZlcnRleFRhbmdlbnRzPyIjZGVmaW5lIFVTRV9UQU5HRU5UIjoKIiIsdy52ZXJ0ZXhDb2xvcnM/IiNkZWZpbmUgVVNFX0NPTE9SIjoiIix3LnZlcnRleFV2cz8iI2RlZmluZSBVU0VfVVYiOiIiLHcuZ3JhZGllbnRNYXA/IiNkZWZpbmUgVVNFX0dSQURJRU5UTUFQIjoiIix3LmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIix3LmRvdWJsZVNpZGVkPyIjZGVmaW5lIERPVUJMRV9TSURFRCI6IiIsdy5mbGlwU2lkZWQ/IiNkZWZpbmUgRkxJUF9TSURFRCI6IiIsdy5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lIFVTRV9TSEFET1dNQVAiOiIiLHcuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSAiK1M6IiIsdy5wcmVtdWx0aXBsaWVkQWxwaGE/IiNkZWZpbmUgUFJFTVVMVElQTElFRF9BTFBIQSI6IiIsdy5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cz8iI2RlZmluZSBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTIjoiIix3LmxvZ2FyaXRobWljRGVwdGhCdWZmZXI/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGIjoiIix3LmxvZ2FyaXRobWljRGVwdGhCdWZmZXImJgooQS5pc1dlYkdMMnx8ZS5nZXQoIkVYVF9mcmFnX2RlcHRoIikpPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQiOiIiLChtLmV4dGVuc2lvbnMmJm0uZXh0ZW5zaW9ucy5zaGFkZXJUZXh0dXJlTE9EfHx3LmVudk1hcCkmJihBLmlzV2ViR0wyfHxlLmdldCgiRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCIpKT8iI2RlZmluZSBURVhUVVJFX0xPRF9FWFQiOiIiLCJ1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsiLCJ1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247IiwwIT09dy50b25lTWFwcGluZz8iI2RlZmluZSBUT05FX01BUFBJTkciOiIiLDAhPT13LnRvbmVNYXBwaW5nP3diLnRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IiIsMCE9PXcudG9uZU1hcHBpbmc/QnIoInRvbmVNYXBwaW5nIix3LnRvbmVNYXBwaW5nKToiIix3LmRpdGhlcmluZz8iI2RlZmluZSBESVRIRVJJTkciOiIiLHcub3V0cHV0RW5jb2Rpbmd8fHcubWFwRW5jb2Rpbmd8fHcubWF0Y2FwRW5jb2Rpbmd8fHcuZW52TWFwRW5jb2Rpbmd8fAp3LmVtaXNzaXZlTWFwRW5jb2Rpbmc/d2IuZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ6IiIsdy5tYXBFbmNvZGluZz9yaSgibWFwVGV4ZWxUb0xpbmVhciIsdy5tYXBFbmNvZGluZyk6IiIsdy5tYXRjYXBFbmNvZGluZz9yaSgibWF0Y2FwVGV4ZWxUb0xpbmVhciIsdy5tYXRjYXBFbmNvZGluZyk6IiIsdy5lbnZNYXBFbmNvZGluZz9yaSgiZW52TWFwVGV4ZWxUb0xpbmVhciIsdy5lbnZNYXBFbmNvZGluZyk6IiIsdy5lbWlzc2l2ZU1hcEVuY29kaW5nP3JpKCJlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXIiLHcuZW1pc3NpdmVNYXBFbmNvZGluZyk6IiIsdy5vdXRwdXRFbmNvZGluZz9BcigibGluZWFyVG9PdXRwdXRUZXhlbCIsdy5vdXRwdXRFbmNvZGluZyk6IiIsdy5kZXB0aFBhY2tpbmc/IiNkZWZpbmUgREVQVEhfUEFDS0lORyAiK20uZGVwdGhQYWNraW5nOiIiLCJcbiJdLmZpbHRlcihaZykuam9pbigiXG4iKSk7Sj1wayhKKTtKPXpuKEosdyk7Sj1BbihKLHcpO1E9cGsoUSk7UT16bihRLAp3KTtRPUFuKFEsdyk7Sj1CbihKKTtRPUJuKFEpO0EuaXNXZWJHTDImJiFtLmlzUmF3U2hhZGVyTWF0ZXJpYWwmJihBPSExLFM9L15ccyojdmVyc2lvblxzKzMwMFxzK2VzXHMqXG4vLG0uaXNTaGFkZXJNYXRlcmlhbCYmbnVsbCE9PUoubWF0Y2goUykmJm51bGwhPT1RLm1hdGNoKFMpJiYoQT0hMCxKPUoucmVwbGFjZShTLCIiKSxRPVEucmVwbGFjZShTLCIiKSksRz0iI3ZlcnNpb24gMzAwIGVzXG5cbiNkZWZpbmUgYXR0cmlidXRlIGluXG4jZGVmaW5lIHZhcnlpbmcgb3V0XG4jZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlXG4iK0csZT1bIiN2ZXJzaW9uIDMwMCBlc1xuXG4jZGVmaW5lIHZhcnlpbmcgaW4iLEE/IiI6Im91dCBoaWdocCB2ZWM0IHBjX2ZyYWdDb2xvcjsiLEE/IiI6IiNkZWZpbmUgZ2xfRnJhZ0NvbG9yIHBjX2ZyYWdDb2xvciIsIiNkZWZpbmUgZ2xfRnJhZ0RlcHRoRVhUIGdsX0ZyYWdEZXB0aFxuI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZVxuI2RlZmluZSB0ZXh0dXJlQ3ViZSB0ZXh0dXJlXG4jZGVmaW5lIHRleHR1cmUyRFByb2ogdGV4dHVyZVByb2pcbiNkZWZpbmUgdGV4dHVyZTJETG9kRVhUIHRleHR1cmVMb2RcbiNkZWZpbmUgdGV4dHVyZTJEUHJvakxvZEVYVCB0ZXh0dXJlUHJvakxvZFxuI2RlZmluZSB0ZXh0dXJlQ3ViZUxvZEVYVCB0ZXh0dXJlTG9kXG4jZGVmaW5lIHRleHR1cmUyREdyYWRFWFQgdGV4dHVyZUdyYWRcbiNkZWZpbmUgdGV4dHVyZTJEUHJvakdyYWRFWFQgdGV4dHVyZVByb2pHcmFkXG4jZGVmaW5lIHRleHR1cmVDdWJlR3JhZEVYVCB0ZXh0dXJlR3JhZCJdLmpvaW4oIlxuIikrCiJcbiIrZSk7UT1lK1E7Sj13bihFLDM1NjMzLEcrSik7UT13bihFLDM1NjMyLFEpO0UuYXR0YWNoU2hhZGVyKHFhLEopO0UuYXR0YWNoU2hhZGVyKHFhLFEpO3ZvaWQgMCE9PW0uaW5kZXgwQXR0cmlidXRlTmFtZT9FLmJpbmRBdHRyaWJMb2NhdGlvbihxYSwwLG0uaW5kZXgwQXR0cmlidXRlTmFtZSk6ITA9PT13Lm1vcnBoVGFyZ2V0cyYmRS5iaW5kQXR0cmliTG9jYXRpb24ocWEsMCwicG9zaXRpb24iKTtFLmxpbmtQcm9ncmFtKHFhKTtpZihiLmRlYnVnLmNoZWNrU2hhZGVyRXJyb3JzKXtiPUUuZ2V0UHJvZ3JhbUluZm9Mb2cocWEpLnRyaW0oKTt3PUUuZ2V0U2hhZGVySW5mb0xvZyhKKS50cmltKCk7QT1FLmdldFNoYWRlckluZm9Mb2coUSkudHJpbSgpO1Q9Uz0hMDtpZighMT09PUUuZ2V0UHJvZ3JhbVBhcmFtZXRlcihxYSwzNTcxNCkpUz0hMSxXPXluKEUsSiwidmVydGV4IiksWD15bihFLFEsImZyYWdtZW50IiksY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xQcm9ncmFtOiBzaGFkZXIgZXJyb3I6ICIsCkUuZ2V0RXJyb3IoKSwiMzU3MTUiLEUuZ2V0UHJvZ3JhbVBhcmFtZXRlcihxYSwzNTcxNSksImdsLmdldFByb2dyYW1JbmZvTG9nIixiLFcsWCk7ZWxzZSBpZigiIiE9PWIpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW06IGdsLmdldFByb2dyYW1JbmZvTG9nKCkiLGIpO2Vsc2UgaWYoIiI9PT13fHwiIj09PUEpVD0hMTtUJiYodGhpcy5kaWFnbm9zdGljcz17cnVubmFibGU6UyxtYXRlcmlhbDptLHByb2dyYW1Mb2c6Yix2ZXJ0ZXhTaGFkZXI6e2xvZzp3LHByZWZpeDpHfSxmcmFnbWVudFNoYWRlcjp7bG9nOkEscHJlZml4OmV9fSl9RS5kZWxldGVTaGFkZXIoSik7RS5kZWxldGVTaGFkZXIoUSk7dmFyIHJhO3RoaXMuZ2V0VW5pZm9ybXM9ZnVuY3Rpb24oKXt2b2lkIDA9PT1yYSYmKHJhPW5ldyBsZShFLHFhKSk7cmV0dXJuIHJhfTt2YXIgd2E7dGhpcy5nZXRBdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7dm9pZCAwPT09d2EmJih3YT1FcihFLHFhKSk7cmV0dXJuIHdhfTt0aGlzLmRlc3Ryb3k9CmZ1bmN0aW9uKCl7RS5kZWxldGVQcm9ncmFtKHFhKTt0aGlzLnByb2dyYW09dm9pZCAwfTt0aGlzLm5hbWU9dS5uYW1lO3RoaXMuaWQ9R3IrKzt0aGlzLmNvZGU9aDt0aGlzLnVzZWRUaW1lcz0xO3RoaXMucHJvZ3JhbT1xYTt0aGlzLnZlcnRleFNoYWRlcj1KO3RoaXMuZnJhZ21lbnRTaGFkZXI9UTtyZXR1cm4gdGhpc31mdW5jdGlvbiBIcihiLGUsaCl7ZnVuY3Rpb24gbShHKXtHPUcuc2tlbGV0b24uYm9uZXM7aWYoaC5mbG9hdFZlcnRleFRleHR1cmVzKXJldHVybiAxMDI0O3ZhciBKPU1hdGgubWluKE1hdGguZmxvb3IoKGgubWF4VmVydGV4VW5pZm9ybXMtMjApLzQpLEcubGVuZ3RoKTtyZXR1cm4gSjxHLmxlbmd0aD8oY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBTa2VsZXRvbiBoYXMgIitHLmxlbmd0aCsiIGJvbmVzLiBUaGlzIEdQVSBzdXBwb3J0cyAiK0orIi4iKSwwKTpKfWZ1bmN0aW9uIHUoRyxKKXtpZihHKUcuaXNUZXh0dXJlP1E9Ry5lbmNvZGluZzpHLmlzV2ViR0xSZW5kZXJUYXJnZXQmJgooY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW1zLmdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXA6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksUT1HLnRleHR1cmUuZW5jb2RpbmcpO2Vsc2UgdmFyIFE9M0UzOzNFMz09PVEmJkomJihRPTMwMDcpO3JldHVybiBRfXZhciB3PVtdLEE9e01lc2hEZXB0aE1hdGVyaWFsOiJkZXB0aCIsTWVzaERpc3RhbmNlTWF0ZXJpYWw6ImRpc3RhbmNlUkdCQSIsTWVzaE5vcm1hbE1hdGVyaWFsOiJub3JtYWwiLE1lc2hCYXNpY01hdGVyaWFsOiJiYXNpYyIsTWVzaExhbWJlcnRNYXRlcmlhbDoibGFtYmVydCIsTWVzaFBob25nTWF0ZXJpYWw6InBob25nIixNZXNoVG9vbk1hdGVyaWFsOiJwaG9uZyIsTWVzaFN0YW5kYXJkTWF0ZXJpYWw6InBoeXNpY2FsIixNZXNoUGh5c2ljYWxNYXRlcmlhbDoicGh5c2ljYWwiLE1lc2hNYXRjYXBNYXRlcmlhbDoibWF0Y2FwIiwKTGluZUJhc2ljTWF0ZXJpYWw6ImJhc2ljIixMaW5lRGFzaGVkTWF0ZXJpYWw6ImRhc2hlZCIsUG9pbnRzTWF0ZXJpYWw6InBvaW50cyIsU2hhZG93TWF0ZXJpYWw6InNoYWRvdyIsU3ByaXRlTWF0ZXJpYWw6InNwcml0ZSJ9LEU9InByZWNpc2lvbiBzdXBwb3J0c1ZlcnRleFRleHR1cmVzIG1hcCBtYXBFbmNvZGluZyBtYXRjYXAgbWF0Y2FwRW5jb2RpbmcgZW52TWFwIGVudk1hcE1vZGUgZW52TWFwRW5jb2RpbmcgbGlnaHRNYXAgYW9NYXAgZW1pc3NpdmVNYXAgZW1pc3NpdmVNYXBFbmNvZGluZyBidW1wTWFwIG5vcm1hbE1hcCBvYmplY3RTcGFjZU5vcm1hbE1hcCB0YW5nZW50U3BhY2VOb3JtYWxNYXAgY2xlYXJjb2F0Tm9ybWFsTWFwIGRpc3BsYWNlbWVudE1hcCBzcGVjdWxhck1hcCByb3VnaG5lc3NNYXAgbWV0YWxuZXNzTWFwIGdyYWRpZW50TWFwIGFscGhhTWFwIGNvbWJpbmUgdmVydGV4Q29sb3JzIHZlcnRleFRhbmdlbnRzIGZvZyB1c2VGb2cgZm9nRXhwMiBmbGF0U2hhZGluZyBzaXplQXR0ZW51YXRpb24gbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciBza2lubmluZyBtYXhCb25lcyB1c2VWZXJ0ZXhUZXh0dXJlIG1vcnBoVGFyZ2V0cyBtb3JwaE5vcm1hbHMgbWF4TW9ycGhUYXJnZXRzIG1heE1vcnBoTm9ybWFscyBwcmVtdWx0aXBsaWVkQWxwaGEgbnVtRGlyTGlnaHRzIG51bVBvaW50TGlnaHRzIG51bVNwb3RMaWdodHMgbnVtSGVtaUxpZ2h0cyBudW1SZWN0QXJlYUxpZ2h0cyBzaGFkb3dNYXBFbmFibGVkIHNoYWRvd01hcFR5cGUgdG9uZU1hcHBpbmcgcGh5c2ljYWxseUNvcnJlY3RMaWdodHMgYWxwaGFUZXN0IGRvdWJsZVNpZGVkIGZsaXBTaWRlZCBudW1DbGlwcGluZ1BsYW5lcyBudW1DbGlwSW50ZXJzZWN0aW9uIGRlcHRoUGFja2luZyBkaXRoZXJpbmcgc2hlZW4iLnNwbGl0KCIgIik7CnRoaXMuZ2V0UGFyYW1ldGVycz1mdW5jdGlvbihHLEosUSxTLFQsVyxYKXt2YXIgaWE9QVtHLnR5cGVdLGhhPVguaXNTa2lubmVkTWVzaD9tKFgpOjAsc2E9aC5wcmVjaXNpb247bnVsbCE9PUcucHJlY2lzaW9uJiYoc2E9aC5nZXRNYXhQcmVjaXNpb24oRy5wcmVjaXNpb24pLHNhIT09Ry5wcmVjaXNpb24mJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtLmdldFBhcmFtZXRlcnM6IixHLnByZWNpc2lvbiwibm90IHN1cHBvcnRlZCwgdXNpbmciLHNhLCJpbnN0ZWFkLiIpKTt2YXIgcWE9Yi5nZXRSZW5kZXJUYXJnZXQoKTtyZXR1cm57c2hhZGVySUQ6aWEscHJlY2lzaW9uOnNhLHN1cHBvcnRzVmVydGV4VGV4dHVyZXM6aC52ZXJ0ZXhUZXh0dXJlcyxvdXRwdXRFbmNvZGluZzp1KHFhP3FhLnRleHR1cmU6bnVsbCxiLmdhbW1hT3V0cHV0KSxtYXA6ISFHLm1hcCxtYXBFbmNvZGluZzp1KEcubWFwLGIuZ2FtbWFJbnB1dCksbWF0Y2FwOiEhRy5tYXRjYXAsbWF0Y2FwRW5jb2Rpbmc6dShHLm1hdGNhcCwKYi5nYW1tYUlucHV0KSxlbnZNYXA6ISFHLmVudk1hcCxlbnZNYXBNb2RlOkcuZW52TWFwJiZHLmVudk1hcC5tYXBwaW5nLGVudk1hcEVuY29kaW5nOnUoRy5lbnZNYXAsYi5nYW1tYUlucHV0KSxlbnZNYXBDdWJlVVY6ISFHLmVudk1hcCYmKDMwNj09PUcuZW52TWFwLm1hcHBpbmd8fDMwNz09PUcuZW52TWFwLm1hcHBpbmcpLGxpZ2h0TWFwOiEhRy5saWdodE1hcCxhb01hcDohIUcuYW9NYXAsZW1pc3NpdmVNYXA6ISFHLmVtaXNzaXZlTWFwLGVtaXNzaXZlTWFwRW5jb2Rpbmc6dShHLmVtaXNzaXZlTWFwLGIuZ2FtbWFJbnB1dCksYnVtcE1hcDohIUcuYnVtcE1hcCxub3JtYWxNYXA6ISFHLm5vcm1hbE1hcCxvYmplY3RTcGFjZU5vcm1hbE1hcDoxPT09Ry5ub3JtYWxNYXBUeXBlLHRhbmdlbnRTcGFjZU5vcm1hbE1hcDowPT09Ry5ub3JtYWxNYXBUeXBlLGNsZWFyY29hdE5vcm1hbE1hcDohIUcuY2xlYXJjb2F0Tm9ybWFsTWFwLGRpc3BsYWNlbWVudE1hcDohIUcuZGlzcGxhY2VtZW50TWFwLApyb3VnaG5lc3NNYXA6ISFHLnJvdWdobmVzc01hcCxtZXRhbG5lc3NNYXA6ISFHLm1ldGFsbmVzc01hcCxzcGVjdWxhck1hcDohIUcuc3BlY3VsYXJNYXAsYWxwaGFNYXA6ISFHLmFscGhhTWFwLGdyYWRpZW50TWFwOiEhRy5ncmFkaWVudE1hcCxzaGVlbjohIUcuc2hlZW4sY29tYmluZTpHLmNvbWJpbmUsdmVydGV4VGFuZ2VudHM6Ry5ub3JtYWxNYXAmJkcudmVydGV4VGFuZ2VudHMsdmVydGV4Q29sb3JzOkcudmVydGV4Q29sb3JzLHZlcnRleFV2czohIUcubWFwfHwhIUcuYnVtcE1hcHx8ISFHLm5vcm1hbE1hcHx8ISFHLnNwZWN1bGFyTWFwfHwhIUcuYWxwaGFNYXB8fCEhRy5lbWlzc2l2ZU1hcHx8ISFHLnJvdWdobmVzc01hcHx8ISFHLm1ldGFsbmVzc01hcHx8ISFHLmNsZWFyY29hdE5vcm1hbE1hcCxmb2c6ISFTLHVzZUZvZzpHLmZvZyxmb2dFeHAyOlMmJlMuaXNGb2dFeHAyLGZsYXRTaGFkaW5nOkcuZmxhdFNoYWRpbmcsc2l6ZUF0dGVudWF0aW9uOkcuc2l6ZUF0dGVudWF0aW9uLApsb2dhcml0aG1pY0RlcHRoQnVmZmVyOmgubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcixza2lubmluZzpHLnNraW5uaW5nJiYwPGhhLG1heEJvbmVzOmhhLHVzZVZlcnRleFRleHR1cmU6aC5mbG9hdFZlcnRleFRleHR1cmVzLG1vcnBoVGFyZ2V0czpHLm1vcnBoVGFyZ2V0cyxtb3JwaE5vcm1hbHM6Ry5tb3JwaE5vcm1hbHMsbWF4TW9ycGhUYXJnZXRzOmIubWF4TW9ycGhUYXJnZXRzLG1heE1vcnBoTm9ybWFsczpiLm1heE1vcnBoTm9ybWFscyxudW1EaXJMaWdodHM6Si5kaXJlY3Rpb25hbC5sZW5ndGgsbnVtUG9pbnRMaWdodHM6Si5wb2ludC5sZW5ndGgsbnVtU3BvdExpZ2h0czpKLnNwb3QubGVuZ3RoLG51bVJlY3RBcmVhTGlnaHRzOkoucmVjdEFyZWEubGVuZ3RoLG51bUhlbWlMaWdodHM6Si5oZW1pLmxlbmd0aCxudW1EaXJMaWdodFNoYWRvd3M6Si5kaXJlY3Rpb25hbFNoYWRvd01hcC5sZW5ndGgsbnVtUG9pbnRMaWdodFNoYWRvd3M6Si5wb2ludFNoYWRvd01hcC5sZW5ndGgsbnVtU3BvdExpZ2h0U2hhZG93czpKLnNwb3RTaGFkb3dNYXAubGVuZ3RoLApudW1DbGlwcGluZ1BsYW5lczpULG51bUNsaXBJbnRlcnNlY3Rpb246VyxkaXRoZXJpbmc6Ry5kaXRoZXJpbmcsc2hhZG93TWFwRW5hYmxlZDpiLnNoYWRvd01hcC5lbmFibGVkJiZYLnJlY2VpdmVTaGFkb3cmJjA8US5sZW5ndGgsc2hhZG93TWFwVHlwZTpiLnNoYWRvd01hcC50eXBlLHRvbmVNYXBwaW5nOkcudG9uZU1hcHBlZD9iLnRvbmVNYXBwaW5nOjAscGh5c2ljYWxseUNvcnJlY3RMaWdodHM6Yi5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyxwcmVtdWx0aXBsaWVkQWxwaGE6Ry5wcmVtdWx0aXBsaWVkQWxwaGEsYWxwaGFUZXN0OkcuYWxwaGFUZXN0LGRvdWJsZVNpZGVkOjI9PT1HLnNpZGUsZmxpcFNpZGVkOjE9PT1HLnNpZGUsZGVwdGhQYWNraW5nOnZvaWQgMCE9PUcuZGVwdGhQYWNraW5nP0cuZGVwdGhQYWNraW5nOiExfX07dGhpcy5nZXRQcm9ncmFtQ29kZT1mdW5jdGlvbihHLEope3ZhciBRPVtdO0ouc2hhZGVySUQ/US5wdXNoKEouc2hhZGVySUQpOihRLnB1c2goRy5mcmFnbWVudFNoYWRlciksClEucHVzaChHLnZlcnRleFNoYWRlcikpO2lmKHZvaWQgMCE9PUcuZGVmaW5lcylmb3IodmFyIFMgaW4gRy5kZWZpbmVzKVEucHVzaChTKSxRLnB1c2goRy5kZWZpbmVzW1NdKTtmb3IoUz0wO1M8RS5sZW5ndGg7UysrKVEucHVzaChKW0VbU11dKTtRLnB1c2goRy5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKSk7US5wdXNoKGIuZ2FtbWFPdXRwdXQpO1EucHVzaChiLmdhbW1hRmFjdG9yKTtyZXR1cm4gUS5qb2luKCl9O3RoaXMuYWNxdWlyZVByb2dyYW09ZnVuY3Rpb24oRyxKLFEsUyl7Zm9yKHZhciBULFc9MCxYPXcubGVuZ3RoO1c8WDtXKyspe3ZhciBpYT13W1ddO2lmKGlhLmNvZGU9PT1TKXtUPWlhOysrVC51c2VkVGltZXM7YnJlYWt9fXZvaWQgMD09PVQmJihUPW5ldyBGcihiLGUsUyxHLEosUSxoKSx3LnB1c2goVCkpO3JldHVybiBUfTt0aGlzLnJlbGVhc2VQcm9ncmFtPWZ1bmN0aW9uKEcpezA9PT0tLUcudXNlZFRpbWVzJiYod1t3LmluZGV4T2YoRyldPXdbdy5sZW5ndGgtMV0sCncucG9wKCksRy5kZXN0cm95KCkpfTt0aGlzLnByb2dyYW1zPXd9ZnVuY3Rpb24gSXIoKXt2YXIgYj1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUpe3ZhciBoPWIuZ2V0KGUpO3ZvaWQgMD09PWgmJihoPXt9LGIuc2V0KGUsaCkpO3JldHVybiBofSxyZW1vdmU6ZnVuY3Rpb24oZSl7Yi5kZWxldGUoZSl9LHVwZGF0ZTpmdW5jdGlvbihlLGgsbSl7Yi5nZXQoZSlbaF09bX0sZGlzcG9zZTpmdW5jdGlvbigpe2I9bmV3IFdlYWtNYXB9fX1mdW5jdGlvbiBKcihiLGUpe3JldHVybiBiLmdyb3VwT3JkZXIhPT1lLmdyb3VwT3JkZXI/Yi5ncm91cE9yZGVyLWUuZ3JvdXBPcmRlcjpiLnJlbmRlck9yZGVyIT09ZS5yZW5kZXJPcmRlcj9iLnJlbmRlck9yZGVyLWUucmVuZGVyT3JkZXI6Yi5wcm9ncmFtIT09ZS5wcm9ncmFtP2IucHJvZ3JhbS5pZC1lLnByb2dyYW0uaWQ6Yi5tYXRlcmlhbC5pZCE9PWUubWF0ZXJpYWwuaWQ/Yi5tYXRlcmlhbC5pZC1lLm1hdGVyaWFsLmlkOmIueiE9PQplLno/Yi56LWUuejpiLmlkLWUuaWR9ZnVuY3Rpb24gS3IoYixlKXtyZXR1cm4gYi5ncm91cE9yZGVyIT09ZS5ncm91cE9yZGVyP2IuZ3JvdXBPcmRlci1lLmdyb3VwT3JkZXI6Yi5yZW5kZXJPcmRlciE9PWUucmVuZGVyT3JkZXI/Yi5yZW5kZXJPcmRlci1lLnJlbmRlck9yZGVyOmIueiE9PWUuej9lLnotYi56OmIuaWQtZS5pZH1mdW5jdGlvbiBDbigpe2Z1bmN0aW9uIGIoQSxFLEcsSixRLFMpe3ZhciBUPWVbaF07dm9pZCAwPT09VD8oVD17aWQ6QS5pZCxvYmplY3Q6QSxnZW9tZXRyeTpFLG1hdGVyaWFsOkcscHJvZ3JhbTpHLnByb2dyYW18fHcsZ3JvdXBPcmRlcjpKLHJlbmRlck9yZGVyOkEucmVuZGVyT3JkZXIsejpRLGdyb3VwOlN9LGVbaF09VCk6KFQuaWQ9QS5pZCxULm9iamVjdD1BLFQuZ2VvbWV0cnk9RSxULm1hdGVyaWFsPUcsVC5wcm9ncmFtPUcucHJvZ3JhbXx8dyxULmdyb3VwT3JkZXI9SixULnJlbmRlck9yZGVyPUEucmVuZGVyT3JkZXIsVC56PVEsVC5ncm91cD1TKTsKaCsrO3JldHVybiBUfXZhciBlPVtdLGg9MCxtPVtdLHU9W10sdz17aWQ6LTF9O3JldHVybntvcGFxdWU6bSx0cmFuc3BhcmVudDp1LGluaXQ6ZnVuY3Rpb24oKXtoPTA7bS5sZW5ndGg9MDt1Lmxlbmd0aD0wfSxwdXNoOmZ1bmN0aW9uKEEsRSxHLEosUSxTKXtBPWIoQSxFLEcsSixRLFMpOyghMD09PUcudHJhbnNwYXJlbnQ/dTptKS5wdXNoKEEpfSx1bnNoaWZ0OmZ1bmN0aW9uKEEsRSxHLEosUSxTKXtBPWIoQSxFLEcsSixRLFMpOyghMD09PUcudHJhbnNwYXJlbnQ/dTptKS51bnNoaWZ0KEEpfSxzb3J0OmZ1bmN0aW9uKCl7MTxtLmxlbmd0aCYmbS5zb3J0KEpyKTsxPHUubGVuZ3RoJiZ1LnNvcnQoS3IpfX19ZnVuY3Rpb24gTHIoKXtmdW5jdGlvbiBiKGgpe2g9aC50YXJnZXQ7aC5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixiKTtlLmRlbGV0ZShoKX12YXIgZT1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGgsbSl7dmFyIHU9ZS5nZXQoaCk7aWYodm9pZCAwPT09CnUpe3ZhciB3PW5ldyBDbjtlLnNldChoLG5ldyBXZWFrTWFwKTtlLmdldChoKS5zZXQobSx3KTtoLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGIpfWVsc2Ugdz11LmdldChtKSx2b2lkIDA9PT13JiYodz1uZXcgQ24sdS5zZXQobSx3KSk7cmV0dXJuIHd9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtlPW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24gTXIoKXt2YXIgYj17fTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUpe2lmKHZvaWQgMCE9PWJbZS5pZF0pcmV0dXJuIGJbZS5pZF07c3dpdGNoKGUudHlwZSl7Y2FzZSAiRGlyZWN0aW9uYWxMaWdodCI6dmFyIGg9e2RpcmVjdGlvbjpuZXcgZyxjb2xvcjpuZXcgSSxzaGFkb3c6ITEsc2hhZG93QmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IGR9O2JyZWFrO2Nhc2UgIlNwb3RMaWdodCI6aD17cG9zaXRpb246bmV3IGcsZGlyZWN0aW9uOm5ldyBnLGNvbG9yOm5ldyBJLGRpc3RhbmNlOjAsY29uZUNvczowLHBlbnVtYnJhQ29zOjAsZGVjYXk6MCwKc2hhZG93OiExLHNoYWRvd0JpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBkfTticmVhaztjYXNlICJQb2ludExpZ2h0IjpoPXtwb3NpdGlvbjpuZXcgZyxjb2xvcjpuZXcgSSxkaXN0YW5jZTowLGRlY2F5OjAsc2hhZG93OiExLHNoYWRvd0JpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBkLHNoYWRvd0NhbWVyYU5lYXI6MSxzaGFkb3dDYW1lcmFGYXI6MUUzfTticmVhaztjYXNlICJIZW1pc3BoZXJlTGlnaHQiOmg9e2RpcmVjdGlvbjpuZXcgZyxza3lDb2xvcjpuZXcgSSxncm91bmRDb2xvcjpuZXcgSX07YnJlYWs7Y2FzZSAiUmVjdEFyZWFMaWdodCI6aD17Y29sb3I6bmV3IEkscG9zaXRpb246bmV3IGcsaGFsZldpZHRoOm5ldyBnLGhhbGZIZWlnaHQ6bmV3IGd9fXJldHVybiBiW2UuaWRdPWh9fX1mdW5jdGlvbiBOcihiLGUpe3JldHVybihlLmNhc3RTaGFkb3c/MTowKS0oYi5jYXN0U2hhZG93PzE6MCl9ZnVuY3Rpb24gT3IoKXtmb3IodmFyIGI9Cm5ldyBNcixlPXt2ZXJzaW9uOjAsaGFzaDp7ZGlyZWN0aW9uYWxMZW5ndGg6LTEscG9pbnRMZW5ndGg6LTEsc3BvdExlbmd0aDotMSxyZWN0QXJlYUxlbmd0aDotMSxoZW1pTGVuZ3RoOi0xLG51bURpcmVjdGlvbmFsU2hhZG93czotMSxudW1Qb2ludFNoYWRvd3M6LTEsbnVtU3BvdFNoYWRvd3M6LTF9LGFtYmllbnQ6WzAsMCwwXSxwcm9iZTpbXSxkaXJlY3Rpb25hbDpbXSxkaXJlY3Rpb25hbFNoYWRvd01hcDpbXSxkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDpbXSxzcG90OltdLHNwb3RTaGFkb3dNYXA6W10sc3BvdFNoYWRvd01hdHJpeDpbXSxyZWN0QXJlYTpbXSxwb2ludDpbXSxwb2ludFNoYWRvd01hcDpbXSxwb2ludFNoYWRvd01hdHJpeDpbXSxoZW1pOltdLG51bURpcmVjdGlvbmFsU2hhZG93czotMSxudW1Qb2ludFNoYWRvd3M6LTEsbnVtU3BvdFNoYWRvd3M6LTF9LGg9MDs5Pmg7aCsrKWUucHJvYmUucHVzaChuZXcgZyk7dmFyIG09bmV3IGcsdT1uZXcgcix3PW5ldyByO3JldHVybntzZXR1cDpmdW5jdGlvbihBLApFLEcpe2Zvcih2YXIgSj0wLFE9MCxTPTAsVD0wOzk+VDtUKyspZS5wcm9iZVtUXS5zZXQoMCwwLDApO3ZhciBXPUU9MCxYPTAsaWE9MCxoYT0wLHNhPTAscWE9MCxyYT0wO0c9Ry5tYXRyaXhXb3JsZEludmVyc2U7QS5zb3J0KE5yKTtUPTA7Zm9yKHZhciB3YT1BLmxlbmd0aDtUPHdhO1QrKyl7dmFyIHBhPUFbVF0sdmE9cGEuY29sb3IsQ2E9cGEuaW50ZW5zaXR5LFZhPXBhLmRpc3RhbmNlLFdhPXBhLnNoYWRvdyYmcGEuc2hhZG93Lm1hcD9wYS5zaGFkb3cubWFwLnRleHR1cmU6bnVsbDtpZihwYS5pc0FtYmllbnRMaWdodClKKz12YS5yKkNhLFErPXZhLmcqQ2EsUys9dmEuYipDYTtlbHNlIGlmKHBhLmlzTGlnaHRQcm9iZSlmb3IoV2E9MDs5PldhO1dhKyspZS5wcm9iZVtXYV0uYWRkU2NhbGVkVmVjdG9yKHBhLnNoLmNvZWZmaWNpZW50c1tXYV0sQ2EpO2Vsc2UgaWYocGEuaXNEaXJlY3Rpb25hbExpZ2h0KXt2YXIgRGE9Yi5nZXQocGEpO0RhLmNvbG9yLmNvcHkocGEuY29sb3IpLm11bHRpcGx5U2NhbGFyKHBhLmludGVuc2l0eSk7CkRhLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ocGEubWF0cml4V29ybGQpO20uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHBhLnRhcmdldC5tYXRyaXhXb3JsZCk7RGEuZGlyZWN0aW9uLnN1YihtKTtEYS5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKEcpO2lmKERhLnNoYWRvdz1wYS5jYXN0U2hhZG93KUNhPXBhLnNoYWRvdyxEYS5zaGFkb3dCaWFzPUNhLmJpYXMsRGEuc2hhZG93UmFkaXVzPUNhLnJhZGl1cyxEYS5zaGFkb3dNYXBTaXplPUNhLm1hcFNpemUsZS5kaXJlY3Rpb25hbFNoYWRvd01hcFtFXT1XYSxlLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4W0VdPXBhLnNoYWRvdy5tYXRyaXgsc2ErKztlLmRpcmVjdGlvbmFsW0VdPURhO0UrK31lbHNlIGlmKHBhLmlzU3BvdExpZ2h0KXtEYT1iLmdldChwYSk7RGEucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHBhLm1hdHJpeFdvcmxkKTtEYS5wb3NpdGlvbi5hcHBseU1hdHJpeDQoRyk7RGEuY29sb3IuY29weSh2YSkubXVsdGlwbHlTY2FsYXIoQ2EpOwpEYS5kaXN0YW5jZT1WYTtEYS5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHBhLm1hdHJpeFdvcmxkKTttLnNldEZyb21NYXRyaXhQb3NpdGlvbihwYS50YXJnZXQubWF0cml4V29ybGQpO0RhLmRpcmVjdGlvbi5zdWIobSk7RGEuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihHKTtEYS5jb25lQ29zPU1hdGguY29zKHBhLmFuZ2xlKTtEYS5wZW51bWJyYUNvcz1NYXRoLmNvcyhwYS5hbmdsZSooMS1wYS5wZW51bWJyYSkpO0RhLmRlY2F5PXBhLmRlY2F5O2lmKERhLnNoYWRvdz1wYS5jYXN0U2hhZG93KUNhPXBhLnNoYWRvdyxEYS5zaGFkb3dCaWFzPUNhLmJpYXMsRGEuc2hhZG93UmFkaXVzPUNhLnJhZGl1cyxEYS5zaGFkb3dNYXBTaXplPUNhLm1hcFNpemUsZS5zcG90U2hhZG93TWFwW1hdPVdhLGUuc3BvdFNoYWRvd01hdHJpeFtYXT1wYS5zaGFkb3cubWF0cml4LHJhKys7ZS5zcG90W1hdPURhO1grK31lbHNlIGlmKHBhLmlzUmVjdEFyZWFMaWdodClEYT1iLmdldChwYSksCkRhLmNvbG9yLmNvcHkodmEpLm11bHRpcGx5U2NhbGFyKENhKSxEYS5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ocGEubWF0cml4V29ybGQpLERhLnBvc2l0aW9uLmFwcGx5TWF0cml4NChHKSx3LmlkZW50aXR5KCksdS5jb3B5KHBhLm1hdHJpeFdvcmxkKSx1LnByZW11bHRpcGx5KEcpLHcuZXh0cmFjdFJvdGF0aW9uKHUpLERhLmhhbGZXaWR0aC5zZXQoLjUqcGEud2lkdGgsMCwwKSxEYS5oYWxmSGVpZ2h0LnNldCgwLC41KnBhLmhlaWdodCwwKSxEYS5oYWxmV2lkdGguYXBwbHlNYXRyaXg0KHcpLERhLmhhbGZIZWlnaHQuYXBwbHlNYXRyaXg0KHcpLGUucmVjdEFyZWFbaWFdPURhLGlhKys7ZWxzZSBpZihwYS5pc1BvaW50TGlnaHQpe0RhPWIuZ2V0KHBhKTtEYS5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ocGEubWF0cml4V29ybGQpO0RhLnBvc2l0aW9uLmFwcGx5TWF0cml4NChHKTtEYS5jb2xvci5jb3B5KHBhLmNvbG9yKS5tdWx0aXBseVNjYWxhcihwYS5pbnRlbnNpdHkpOwpEYS5kaXN0YW5jZT1wYS5kaXN0YW5jZTtEYS5kZWNheT1wYS5kZWNheTtpZihEYS5zaGFkb3c9cGEuY2FzdFNoYWRvdylDYT1wYS5zaGFkb3csRGEuc2hhZG93Qmlhcz1DYS5iaWFzLERhLnNoYWRvd1JhZGl1cz1DYS5yYWRpdXMsRGEuc2hhZG93TWFwU2l6ZT1DYS5tYXBTaXplLERhLnNoYWRvd0NhbWVyYU5lYXI9Q2EuY2FtZXJhLm5lYXIsRGEuc2hhZG93Q2FtZXJhRmFyPUNhLmNhbWVyYS5mYXIsZS5wb2ludFNoYWRvd01hcFtXXT1XYSxlLnBvaW50U2hhZG93TWF0cml4W1ddPXBhLnNoYWRvdy5tYXRyaXgscWErKztlLnBvaW50W1ddPURhO1crK31lbHNlIHBhLmlzSGVtaXNwaGVyZUxpZ2h0JiYoRGE9Yi5nZXQocGEpLERhLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ocGEubWF0cml4V29ybGQpLERhLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oRyksRGEuZGlyZWN0aW9uLm5vcm1hbGl6ZSgpLERhLnNreUNvbG9yLmNvcHkocGEuY29sb3IpLm11bHRpcGx5U2NhbGFyKENhKSwKRGEuZ3JvdW5kQ29sb3IuY29weShwYS5ncm91bmRDb2xvcikubXVsdGlwbHlTY2FsYXIoQ2EpLGUuaGVtaVtoYV09RGEsaGErKyl9ZS5hbWJpZW50WzBdPUo7ZS5hbWJpZW50WzFdPVE7ZS5hbWJpZW50WzJdPVM7QT1lLmhhc2g7aWYoQS5kaXJlY3Rpb25hbExlbmd0aCE9PUV8fEEucG9pbnRMZW5ndGghPT1XfHxBLnNwb3RMZW5ndGghPT1YfHxBLnJlY3RBcmVhTGVuZ3RoIT09aWF8fEEuaGVtaUxlbmd0aCE9PWhhfHxBLm51bURpcmVjdGlvbmFsU2hhZG93cyE9PXNhfHxBLm51bVBvaW50U2hhZG93cyE9PXFhfHxBLm51bVNwb3RTaGFkb3dzIT09cmEpZS5kaXJlY3Rpb25hbC5sZW5ndGg9RSxlLnNwb3QubGVuZ3RoPVgsZS5yZWN0QXJlYS5sZW5ndGg9aWEsZS5wb2ludC5sZW5ndGg9VyxlLmhlbWkubGVuZ3RoPWhhLGUuZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoPXNhLGUucG9pbnRTaGFkb3dNYXAubGVuZ3RoPXFhLGUuc3BvdFNoYWRvd01hcC5sZW5ndGg9cmEsZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC5sZW5ndGg9CnNhLGUucG9pbnRTaGFkb3dNYXRyaXgubGVuZ3RoPXFhLGUuc3BvdFNoYWRvd01hdHJpeC5sZW5ndGg9cmEsQS5kaXJlY3Rpb25hbExlbmd0aD1FLEEucG9pbnRMZW5ndGg9VyxBLnNwb3RMZW5ndGg9WCxBLnJlY3RBcmVhTGVuZ3RoPWlhLEEuaGVtaUxlbmd0aD1oYSxBLm51bURpcmVjdGlvbmFsU2hhZG93cz1zYSxBLm51bVBvaW50U2hhZG93cz1xYSxBLm51bVNwb3RTaGFkb3dzPXJhLGUudmVyc2lvbj1QcisrfSxzdGF0ZTplfX1mdW5jdGlvbiBEbigpe3ZhciBiPW5ldyBPcixlPVtdLGg9W107cmV0dXJue2luaXQ6ZnVuY3Rpb24oKXtlLmxlbmd0aD0wO2gubGVuZ3RoPTB9LHN0YXRlOntsaWdodHNBcnJheTplLHNoYWRvd3NBcnJheTpoLGxpZ2h0czpifSxzZXR1cExpZ2h0czpmdW5jdGlvbihtKXtiLnNldHVwKGUsaCxtKX0scHVzaExpZ2h0OmZ1bmN0aW9uKG0pe2UucHVzaChtKX0scHVzaFNoYWRvdzpmdW5jdGlvbihtKXtoLnB1c2gobSl9fX1mdW5jdGlvbiBRcigpe2Z1bmN0aW9uIGIoaCl7aD0KaC50YXJnZXQ7aC5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixiKTtlLmRlbGV0ZShoKX12YXIgZT1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGgsbSl7aWYoITE9PT1lLmhhcyhoKSl7dmFyIHU9bmV3IERuO2Uuc2V0KGgsbmV3IFdlYWtNYXApO2UuZ2V0KGgpLnNldChtLHUpO2guYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYil9ZWxzZSExPT09ZS5nZXQoaCkuaGFzKG0pPyh1PW5ldyBEbixlLmdldChoKS5zZXQobSx1KSk6dT1lLmdldChoKS5nZXQobSk7cmV0dXJuIHV9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtlPW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24gbWUoYil7TS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTWVzaERlcHRoTWF0ZXJpYWwiO3RoaXMuZGVwdGhQYWNraW5nPTMyMDA7dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLmRpc3BsYWNlbWVudE1hcD10aGlzLmFscGhhTWFwPXRoaXMubWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0KMTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uIG5lKGIpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hEaXN0YW5jZU1hdGVyaWFsIjt0aGlzLnJlZmVyZW5jZVBvc2l0aW9uPW5ldyBnO3RoaXMubmVhckRpc3RhbmNlPTE7dGhpcy5mYXJEaXN0YW5jZT0xRTM7dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLmRpc3BsYWNlbWVudE1hcD10aGlzLmFscGhhTWFwPXRoaXMubWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz0wO3RoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uIEVuKGIsZSxoKXtmdW5jdGlvbiBtKHZhLENhKXt2YXIgVmE9ZS51cGRhdGUoc2EpO1gudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWU9CnZhLm1hcC50ZXh0dXJlO1gudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZT12YS5tYXBTaXplO1gudW5pZm9ybXMucmFkaXVzLnZhbHVlPXZhLnJhZGl1cztiLnNldFJlbmRlclRhcmdldCh2YS5tYXBQYXNzKTtiLmNsZWFyKCk7Yi5yZW5kZXJCdWZmZXJEaXJlY3QoQ2EsbnVsbCxWYSxYLHNhLG51bGwpO2lhLnVuaWZvcm1zLnNoYWRvd19wYXNzLnZhbHVlPXZhLm1hcFBhc3MudGV4dHVyZTtpYS51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlPXZhLm1hcFNpemU7aWEudW5pZm9ybXMucmFkaXVzLnZhbHVlPXZhLnJhZGl1cztiLnNldFJlbmRlclRhcmdldCh2YS5tYXApO2IuY2xlYXIoKTtiLnJlbmRlckJ1ZmZlckRpcmVjdChDYSxudWxsLFZhLGlhLHNhLG51bGwpfWZ1bmN0aW9uIHUodmEsQ2EsVmEsV2EsRGEsSWEpe3ZhciBFYT12YS5nZW9tZXRyeTt2YXIgT2E9UTt2YXIgaGI9dmEuY3VzdG9tRGVwdGhNYXRlcmlhbDtWYS5pc1BvaW50TGlnaHQmJihPYT1TLGhiPXZhLmN1c3RvbURpc3RhbmNlTWF0ZXJpYWwpOwpoYj9PYT1oYjooaGI9ITEsQ2EubW9ycGhUYXJnZXRzJiYoRWEmJkVhLmlzQnVmZmVyR2VvbWV0cnk/aGI9RWEubW9ycGhBdHRyaWJ1dGVzJiZFYS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24mJjA8RWEubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aDpFYSYmRWEuaXNHZW9tZXRyeSYmKGhiPUVhLm1vcnBoVGFyZ2V0cyYmMDxFYS5tb3JwaFRhcmdldHMubGVuZ3RoKSksdmEuaXNTa2lubmVkTWVzaCYmITE9PT1DYS5za2lubmluZyYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFNoYWRvd01hcDogVEhSRUUuU2tpbm5lZE1lc2ggd2l0aCBtYXRlcmlhbC5za2lubmluZyBzZXQgdG8gZmFsc2U6Iix2YSksdmE9dmEuaXNTa2lubmVkTWVzaCYmQ2Euc2tpbm5pbmcsRWE9MCxoYiYmKEVhfD0xKSx2YSYmKEVhfD0yKSxPYT1PYVtFYV0pO2IubG9jYWxDbGlwcGluZ0VuYWJsZWQmJiEwPT09Q2EuY2xpcFNoYWRvd3MmJjAhPT1DYS5jbGlwcGluZ1BsYW5lcy5sZW5ndGgmJihFYT1PYS51dWlkLApoYj1DYS51dWlkLHZhPVRbRWFdLHZvaWQgMD09PXZhJiYodmE9e30sVFtFYV09dmEpLEVhPXZhW2hiXSx2b2lkIDA9PT1FYSYmKEVhPU9hLmNsb25lKCksdmFbaGJdPUVhKSxPYT1FYSk7T2EudmlzaWJsZT1DYS52aXNpYmxlO09hLndpcmVmcmFtZT1DYS53aXJlZnJhbWU7T2Euc2lkZT0zPT09SWE/bnVsbCE9Q2Euc2hhZG93U2lkZT9DYS5zaGFkb3dTaWRlOkNhLnNpZGU6bnVsbCE9Q2Euc2hhZG93U2lkZT9DYS5zaGFkb3dTaWRlOldbQ2Euc2lkZV07T2EuY2xpcFNoYWRvd3M9Q2EuY2xpcFNoYWRvd3M7T2EuY2xpcHBpbmdQbGFuZXM9Q2EuY2xpcHBpbmdQbGFuZXM7T2EuY2xpcEludGVyc2VjdGlvbj1DYS5jbGlwSW50ZXJzZWN0aW9uO09hLndpcmVmcmFtZUxpbmV3aWR0aD1DYS53aXJlZnJhbWVMaW5ld2lkdGg7T2EubGluZXdpZHRoPUNhLmxpbmV3aWR0aDtWYS5pc1BvaW50TGlnaHQmJk9hLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwmJihPYS5yZWZlcmVuY2VQb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oVmEubWF0cml4V29ybGQpLApPYS5uZWFyRGlzdGFuY2U9V2EsT2EuZmFyRGlzdGFuY2U9RGEpO3JldHVybiBPYX1mdW5jdGlvbiB3KHZhLENhLFZhLFdhLERhKXtpZighMSE9PXZhLnZpc2libGUpe2lmKHZhLmxheWVycy50ZXN0KENhLmxheWVycykmJih2YS5pc01lc2h8fHZhLmlzTGluZXx8dmEuaXNQb2ludHMpJiYodmEuY2FzdFNoYWRvd3x8dmEucmVjZWl2ZVNoYWRvdyYmMz09PURhKSYmKCF2YS5mcnVzdHVtQ3VsbGVkfHxBLmludGVyc2VjdHNPYmplY3QodmEpKSl7dmEubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoVmEubWF0cml4V29ybGRJbnZlcnNlLHZhLm1hdHJpeFdvcmxkKTt2YXIgSWE9ZS51cGRhdGUodmEpLEVhPXZhLm1hdGVyaWFsO2lmKEFycmF5LmlzQXJyYXkoRWEpKWZvcih2YXIgT2E9SWEuZ3JvdXBzLGhiPTAseWI9T2EubGVuZ3RoO2hiPHliO2hiKyspe3ZhciBMYT1PYVtoYl0sZWI9RWFbTGEubWF0ZXJpYWxJbmRleF07ZWImJmViLnZpc2libGUmJihlYj11KHZhLGViLFdhLFZhLm5lYXIsClZhLmZhcixEYSksYi5yZW5kZXJCdWZmZXJEaXJlY3QoVmEsbnVsbCxJYSxlYix2YSxMYSkpfWVsc2UgRWEudmlzaWJsZSYmKGViPXUodmEsRWEsV2EsVmEubmVhcixWYS5mYXIsRGEpLGIucmVuZGVyQnVmZmVyRGlyZWN0KFZhLG51bGwsSWEsZWIsdmEsbnVsbCkpfXZhPXZhLmNoaWxkcmVuO0lhPTA7Zm9yKEVhPXZhLmxlbmd0aDtJYTxFYTtJYSsrKXcodmFbSWFdLENhLFZhLFdhLERhKX19dmFyIEE9bmV3IEVjLEU9bmV3IGQsRz1uZXcgZCxKPW5ldyBuLFE9QXJyYXkoNCksUz1BcnJheSg0KSxUPXt9LFc9ezA6MSwxOjAsMjoyfSxYPW5ldyB1Yih7ZGVmaW5lczp7U0FNUExFX1JBVEU6LjI1LEhBTEZfU0FNUExFX1JBVEU6LjEyNX0sdW5pZm9ybXM6e3NoYWRvd19wYXNzOnt2YWx1ZTpudWxsfSxyZXNvbHV0aW9uOnt2YWx1ZTpuZXcgZH0scmFkaXVzOnt2YWx1ZTo0fX0sdmVydGV4U2hhZGVyOiJ2b2lkIG1haW4oKSB7XG5cdGdsX1Bvc2l0aW9uIFx4M2QgdmVjNCggcG9zaXRpb24sIDEuMCApO1xufSIsCmZyYWdtZW50U2hhZGVyOiJ1bmlmb3JtIHNhbXBsZXIyRCBzaGFkb3dfcGFzcztcbnVuaWZvcm0gdmVjMiByZXNvbHV0aW9uO1xudW5pZm9ybSBmbG9hdCByYWRpdXM7XG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbnZvaWQgbWFpbigpIHtcbiAgZmxvYXQgbWVhbiBceDNkIDAuMDtcbiAgZmxvYXQgc3F1YXJlZF9tZWFuIFx4M2QgMC4wO1xuICBcblx0ZmxvYXQgZGVwdGggXHgzZCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgICkgLyByZXNvbHV0aW9uICkgKTtcbiAgZm9yICggZmxvYXQgaSBceDNkIC0xLjA7IGkgXHgzYyAxLjAgOyBpICtceDNkIFNBTVBMRV9SQVRFKSB7XG4gICAgI2lmZGVmIEhPUklaT05BTF9QQVNTXG4gICAgICB2ZWMyIGRpc3RyaWJ1dGlvbiBceDNkIGRlY29kZUhhbGZSR0JBICggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCBpLCAwLjAgKSAqIHJhZGl1cyApIC8gcmVzb2x1dGlvbiApICk7XG4gICAgICBtZWFuICtceDNkIGRpc3RyaWJ1dGlvbi54O1xuICAgICAgc3F1YXJlZF9tZWFuICtceDNkIGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKyBkaXN0cmlidXRpb24ueCAqIGRpc3RyaWJ1dGlvbi54O1xuICAgICNlbHNlXG4gICAgICBmbG9hdCBkZXB0aCBceDNkIHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIHNoYWRvd19wYXNzLCAoIGdsX0ZyYWdDb29yZC54eSArIHZlYzIoIDAuMCwgIGkgKSAgKiByYWRpdXMgKSAvIHJlc29sdXRpb24gKSApO1xuICAgICAgbWVhbiArXHgzZCBkZXB0aDtcbiAgICAgIHNxdWFyZWRfbWVhbiArXHgzZCBkZXB0aCAqIGRlcHRoO1xuICAgICNlbmRpZlxuICB9XG4gIG1lYW4gXHgzZCBtZWFuICogSEFMRl9TQU1QTEVfUkFURTtcbiAgc3F1YXJlZF9tZWFuIFx4M2Qgc3F1YXJlZF9tZWFuICogSEFMRl9TQU1QTEVfUkFURTtcbiAgZmxvYXQgc3RkX2RldiBceDNkIHBvdyggc3F1YXJlZF9tZWFuIC0gbWVhbiAqIG1lYW4sIDAuNSApO1xuICBnbF9GcmFnQ29sb3IgXHgzZCBlbmNvZGVIYWxmUkdCQSggdmVjMiggbWVhbiwgc3RkX2RldiApICk7XG59In0pLAppYT1YLmNsb25lKCk7aWEuZGVmaW5lcy5IT1JJWk9OQUxfUEFTUz0xO3ZhciBoYT1uZXcgeGE7aGEuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFIobmV3IEZsb2F0MzJBcnJheShbLTEsLTEsLjUsMywtMSwuNSwtMSwzLC41XSksMykpO3ZhciBzYT1uZXcgeWEoaGEsWCk7Zm9yKGhhPTA7NCE9PWhhOysraGEpe3ZhciBxYT0wIT09KGhhJjEpLHJhPTAhPT0oaGEmMiksd2E9bmV3IG1lKHtkZXB0aFBhY2tpbmc6MzIwMSxtb3JwaFRhcmdldHM6cWEsc2tpbm5pbmc6cmF9KTtRW2hhXT13YTtxYT1uZXcgbmUoe21vcnBoVGFyZ2V0czpxYSxza2lubmluZzpyYX0pO1NbaGFdPXFhfXZhciBwYT10aGlzO3RoaXMuZW5hYmxlZD0hMTt0aGlzLmF1dG9VcGRhdGU9ITA7dGhpcy5uZWVkc1VwZGF0ZT0hMTt0aGlzLnR5cGU9MTt0aGlzLnJlbmRlcj1mdW5jdGlvbih2YSxDYSxWYSl7aWYoITEhPT1wYS5lbmFibGVkJiYoITEhPT1wYS5hdXRvVXBkYXRlfHwhMSE9PXBhLm5lZWRzVXBkYXRlKSYmCjAhPT12YS5sZW5ndGgpe3ZhciBXYT1iLmdldFJlbmRlclRhcmdldCgpLERhPWIuZ2V0QWN0aXZlQ3ViZUZhY2UoKSxJYT1iLmdldEFjdGl2ZU1pcG1hcExldmVsKCksRWE9Yi5zdGF0ZTtFYS5zZXRCbGVuZGluZygwKTtFYS5idWZmZXJzLmNvbG9yLnNldENsZWFyKDEsMSwxLDEpO0VhLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCghMCk7RWEuc2V0U2Npc3NvclRlc3QoITEpO2Zvcih2YXIgT2E9MCxoYj12YS5sZW5ndGg7T2E8aGI7T2ErKyl7dmFyIHliPXZhW09hXSxMYT15Yi5zaGFkb3c7aWYodm9pZCAwPT09TGEpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFNoYWRvd01hcDoiLHliLCJoYXMgbm8gc2hhZG93LiIpO2Vsc2V7RS5jb3B5KExhLm1hcFNpemUpO3ZhciBlYj1MYS5nZXRGcmFtZUV4dGVudHMoKTtFLm11bHRpcGx5KGViKTtHLmNvcHkoTGEubWFwU2l6ZSk7aWYoRS54Pmh8fEUueT5oKWNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xTaGFkb3dNYXA6Iix5YiwiaGFzIHNoYWRvdyBleGNlZWRpbmcgbWF4IHRleHR1cmUgc2l6ZSwgcmVkdWNpbmciKSwKRS54PmgmJihHLng9TWF0aC5mbG9vcihoL2ViLngpLEUueD1HLngqZWIueCxMYS5tYXBTaXplLng9Ry54KSxFLnk+aCYmKEcueT1NYXRoLmZsb29yKGgvZWIueSksRS55PUcueSplYi55LExhLm1hcFNpemUueT1HLnkpO251bGwhPT1MYS5tYXB8fExhLmlzUG9pbnRMaWdodFNoYWRvd3x8MyE9PXRoaXMudHlwZXx8KGViPXttaW5GaWx0ZXI6MTAwNixtYWdGaWx0ZXI6MTAwNixmb3JtYXQ6MTAyM30sTGEubWFwPW5ldyBwKEUueCxFLnksZWIpLExhLm1hcC50ZXh0dXJlLm5hbWU9eWIubmFtZSsiLnNoYWRvd01hcCIsTGEubWFwUGFzcz1uZXcgcChFLngsRS55LGViKSxMYS5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpKTtudWxsPT09TGEubWFwJiYoZWI9e21pbkZpbHRlcjoxMDAzLG1hZ0ZpbHRlcjoxMDAzLGZvcm1hdDoxMDIzfSxMYS5tYXA9bmV3IHAoRS54LEUueSxlYiksTGEubWFwLnRleHR1cmUubmFtZT15Yi5uYW1lKyIuc2hhZG93TWFwIixMYS5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpKTsKYi5zZXRSZW5kZXJUYXJnZXQoTGEubWFwKTtiLmNsZWFyKCk7ZWI9TGEuZ2V0Vmlld3BvcnRDb3VudCgpO2Zvcih2YXIgbmI9MDtuYjxlYjtuYisrKXt2YXIgTmI9TGEuZ2V0Vmlld3BvcnQobmIpO0ouc2V0KEcueCpOYi54LEcueSpOYi55LEcueCpOYi56LEcueSpOYi53KTtFYS52aWV3cG9ydChKKTtMYS51cGRhdGVNYXRyaWNlcyh5YixWYSxuYik7QT1MYS5nZXRGcnVzdHVtKCk7dyhDYSxWYSxMYS5jYW1lcmEseWIsdGhpcy50eXBlKX1MYS5pc1BvaW50TGlnaHRTaGFkb3d8fDMhPT10aGlzLnR5cGV8fG0oTGEsVmEpfX1wYS5uZWVkc1VwZGF0ZT0hMTtiLnNldFJlbmRlclRhcmdldChXYSxEYSxJYSl9fX1mdW5jdGlvbiBScihiLGUsaCxtKXtmdW5jdGlvbiB1KGthLEhhLE5hKXt2YXIgcmI9bmV3IFVpbnQ4QXJyYXkoNCksWGE9Yi5jcmVhdGVUZXh0dXJlKCk7Yi5iaW5kVGV4dHVyZShrYSxYYSk7Yi50ZXhQYXJhbWV0ZXJpKGthLDEwMjQxLDk3MjgpO2IudGV4UGFyYW1ldGVyaShrYSwKMTAyNDAsOTcyOCk7Zm9yKGthPTA7a2E8TmE7a2ErKyliLnRleEltYWdlMkQoSGEra2EsMCw2NDA4LDEsMSwwLDY0MDgsNTEyMSxyYik7cmV0dXJuIFhhfWZ1bmN0aW9uIHcoa2EsSGEpe3NhW2thXT0xOzA9PT1xYVtrYV0mJihiLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGthKSxxYVtrYV09MSk7cmFba2FdIT09SGEmJigobS5pc1dlYkdMMj9iOmUuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpW20uaXNXZWJHTDI/InZlcnRleEF0dHJpYkRpdmlzb3IiOiJ2ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUiXShrYSxIYSkscmFba2FdPUhhKX1mdW5jdGlvbiBBKGthKXshMCE9PXdhW2thXSYmKGIuZW5hYmxlKGthKSx3YVtrYV09ITApfWZ1bmN0aW9uIEUoa2EpeyExIT09d2Fba2FdJiYoYi5kaXNhYmxlKGthKSx3YVtrYV09ITEpfWZ1bmN0aW9uIEcoa2EsSGEsTmEscmIsWGEsbWIsb2IsU2Epe2lmKDA9PT1rYSlDYSYmKEUoMzA0MiksQ2E9ITEpO2Vsc2UgaWYoQ2F8fChBKDMwNDIpLApDYT0hMCksNSE9PWthKXtpZihrYSE9PVZhfHxTYSE9PXliKXtpZigxMDAhPT1XYXx8MTAwIT09RWEpYi5ibGVuZEVxdWF0aW9uKDMyNzc0KSxFYT1XYT0xMDA7aWYoU2Epc3dpdGNoKGthKXtjYXNlIDE6Yi5ibGVuZEZ1bmNTZXBhcmF0ZSgxLDc3MSwxLDc3MSk7YnJlYWs7Y2FzZSAyOmIuYmxlbmRGdW5jKDEsMSk7YnJlYWs7Y2FzZSAzOmIuYmxlbmRGdW5jU2VwYXJhdGUoMCwwLDc2OSw3NzEpO2JyZWFrO2Nhc2UgNDpiLmJsZW5kRnVuY1NlcGFyYXRlKDAsNzY4LDAsNzcwKTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICIsa2EpfWVsc2Ugc3dpdGNoKGthKXtjYXNlIDE6Yi5ibGVuZEZ1bmNTZXBhcmF0ZSg3NzAsNzcxLDEsNzcxKTticmVhaztjYXNlIDI6Yi5ibGVuZEZ1bmMoNzcwLDEpO2JyZWFrO2Nhc2UgMzpiLmJsZW5kRnVuYygwLDc2OSk7YnJlYWs7Y2FzZSA0OmIuYmxlbmRGdW5jKDAsNzY4KTticmVhazsKZGVmYXVsdDpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAiLGthKX1oYj1PYT1JYT1EYT1udWxsO1ZhPWthO3liPVNhfX1lbHNle1hhPVhhfHxIYTttYj1tYnx8TmE7b2I9b2J8fHJiO2lmKEhhIT09V2F8fFhhIT09RWEpYi5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoaC5jb252ZXJ0KEhhKSxoLmNvbnZlcnQoWGEpKSxXYT1IYSxFYT1YYTtpZihOYSE9PURhfHxyYiE9PUlhfHxtYiE9PU9hfHxvYiE9PWhiKWIuYmxlbmRGdW5jU2VwYXJhdGUoaC5jb252ZXJ0KE5hKSxoLmNvbnZlcnQocmIpLGguY29udmVydChtYiksaC5jb252ZXJ0KG9iKSksRGE9TmEsSWE9cmIsT2E9bWIsaGI9b2I7VmE9a2E7eWI9bnVsbH19ZnVuY3Rpb24gSihrYSl7TGEhPT1rYSYmKGthP2IuZnJvbnRGYWNlKDIzMDQpOmIuZnJvbnRGYWNlKDIzMDUpLExhPWthKX1mdW5jdGlvbiBRKGthKXswIT09a2E/KEEoMjg4NCksa2EhPT1lYiYmKDE9PT1rYT9iLmN1bGxGYWNlKDEwMjkpOgoyPT09a2E/Yi5jdWxsRmFjZSgxMDI4KTpiLmN1bGxGYWNlKDEwMzIpKSk6RSgyODg0KTtlYj1rYX1mdW5jdGlvbiBTKGthLEhhLE5hKXtpZihrYSl7aWYoQSgzMjgyMyksTmIhPT1IYXx8RGIhPT1OYSliLnBvbHlnb25PZmZzZXQoSGEsTmEpLE5iPUhhLERiPU5hfWVsc2UgRSgzMjgyMyl9ZnVuY3Rpb24gVChrYSl7dm9pZCAwPT09a2EmJihrYT0zMzk4NCtqYS0xKTtBYSE9PWthJiYoYi5hY3RpdmVUZXh0dXJlKGthKSxBYT1rYSl9dmFyIFc9bmV3IGZ1bmN0aW9uKCl7dmFyIGthPSExLEhhPW5ldyBuLE5hPW51bGwscmI9bmV3IG4oMCwwLDAsMCk7cmV0dXJue3NldE1hc2s6ZnVuY3Rpb24oWGEpe05hPT09WGF8fGthfHwoYi5jb2xvck1hc2soWGEsWGEsWGEsWGEpLE5hPVhhKX0sc2V0TG9ja2VkOmZ1bmN0aW9uKFhhKXtrYT1YYX0sc2V0Q2xlYXI6ZnVuY3Rpb24oWGEsbWIsb2IsU2EsamIpeyEwPT09amImJihYYSo9U2EsbWIqPVNhLG9iKj1TYSk7SGEuc2V0KFhhLG1iLG9iLFNhKTsKITE9PT1yYi5lcXVhbHMoSGEpJiYoYi5jbGVhckNvbG9yKFhhLG1iLG9iLFNhKSxyYi5jb3B5KEhhKSl9LHJlc2V0OmZ1bmN0aW9uKCl7a2E9ITE7TmE9bnVsbDtyYi5zZXQoLTEsMCwwLDApfX19LFg9bmV3IGZ1bmN0aW9uKCl7dmFyIGthPSExLEhhPW51bGwsTmE9bnVsbCxyYj1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKFhhKXtYYT9BKDI5MjkpOkUoMjkyOSl9LHNldE1hc2s6ZnVuY3Rpb24oWGEpe0hhPT09WGF8fGthfHwoYi5kZXB0aE1hc2soWGEpLEhhPVhhKX0sc2V0RnVuYzpmdW5jdGlvbihYYSl7aWYoTmEhPT1YYSl7aWYoWGEpc3dpdGNoKFhhKXtjYXNlIDA6Yi5kZXB0aEZ1bmMoNTEyKTticmVhaztjYXNlIDE6Yi5kZXB0aEZ1bmMoNTE5KTticmVhaztjYXNlIDI6Yi5kZXB0aEZ1bmMoNTEzKTticmVhaztjYXNlIDM6Yi5kZXB0aEZ1bmMoNTE1KTticmVhaztjYXNlIDQ6Yi5kZXB0aEZ1bmMoNTE0KTticmVhaztjYXNlIDU6Yi5kZXB0aEZ1bmMoNTE4KTticmVhaztjYXNlIDY6Yi5kZXB0aEZ1bmMoNTE2KTsKYnJlYWs7Y2FzZSA3OmIuZGVwdGhGdW5jKDUxNyk7YnJlYWs7ZGVmYXVsdDpiLmRlcHRoRnVuYyg1MTUpfWVsc2UgYi5kZXB0aEZ1bmMoNTE1KTtOYT1YYX19LHNldExvY2tlZDpmdW5jdGlvbihYYSl7a2E9WGF9LHNldENsZWFyOmZ1bmN0aW9uKFhhKXtyYiE9PVhhJiYoYi5jbGVhckRlcHRoKFhhKSxyYj1YYSl9LHJlc2V0OmZ1bmN0aW9uKCl7a2E9ITE7cmI9TmE9SGE9bnVsbH19fSxpYT1uZXcgZnVuY3Rpb24oKXt2YXIga2E9ITEsSGE9bnVsbCxOYT1udWxsLHJiPW51bGwsWGE9bnVsbCxtYj1udWxsLG9iPW51bGwsU2E9bnVsbCxqYj1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKHFiKXtrYXx8KHFiP0EoMjk2MCk6RSgyOTYwKSl9LHNldE1hc2s6ZnVuY3Rpb24ocWIpe0hhPT09cWJ8fGthfHwoYi5zdGVuY2lsTWFzayhxYiksSGE9cWIpfSxzZXRGdW5jOmZ1bmN0aW9uKHFiLHRiLHhiKXtpZihOYSE9PXFifHxyYiE9PXRifHxYYSE9PXhiKWIuc3RlbmNpbEZ1bmMocWIsdGIsCnhiKSxOYT1xYixyYj10YixYYT14Yn0sc2V0T3A6ZnVuY3Rpb24ocWIsdGIseGIpe2lmKG1iIT09cWJ8fG9iIT09dGJ8fFNhIT09eGIpYi5zdGVuY2lsT3AocWIsdGIseGIpLG1iPXFiLG9iPXRiLFNhPXhifSxzZXRMb2NrZWQ6ZnVuY3Rpb24ocWIpe2thPXFifSxzZXRDbGVhcjpmdW5jdGlvbihxYil7amIhPT1xYiYmKGIuY2xlYXJTdGVuY2lsKHFiKSxqYj1xYil9LHJlc2V0OmZ1bmN0aW9uKCl7a2E9ITE7amI9U2E9b2I9bWI9WGE9cmI9TmE9SGE9bnVsbH19fSxoYT1iLmdldFBhcmFtZXRlcigzNDkyMSksc2E9bmV3IFVpbnQ4QXJyYXkoaGEpLHFhPW5ldyBVaW50OEFycmF5KGhhKSxyYT1uZXcgVWludDhBcnJheShoYSksd2E9e30scGE9bnVsbCx2YT1udWxsLENhPW51bGwsVmE9bnVsbCxXYT1udWxsLERhPW51bGwsSWE9bnVsbCxFYT1udWxsLE9hPW51bGwsaGI9bnVsbCx5Yj0hMSxMYT1udWxsLGViPW51bGwsbmI9bnVsbCxOYj1udWxsLERiPW51bGwsamE9Yi5nZXRQYXJhbWV0ZXIoMzU2NjEpLApvYT0hMTtoYT0wO2hhPWIuZ2V0UGFyYW1ldGVyKDc5MzgpOy0xIT09aGEuaW5kZXhPZigiV2ViR0wiKT8oaGE9cGFyc2VGbG9hdCgvXldlYkdMIChbMC05XSkvLmV4ZWMoaGEpWzFdKSxvYT0xPD1oYSk6LTEhPT1oYS5pbmRleE9mKCJPcGVuR0wgRVMiKSYmKGhhPXBhcnNlRmxvYXQoL15PcGVuR0wgRVMgKFswLTldKS8uZXhlYyhoYSlbMV0pLG9hPTI8PWhhKTt2YXIgQWE9bnVsbCxLYT17fSwkYT1uZXcgbixQYT1uZXcgbixmYj17fTtmYlszNTUzXT11KDM1NTMsMzU1MywxKTtmYlszNDA2N109dSgzNDA2NywzNDA2OSw2KTtXLnNldENsZWFyKDAsMCwwLDEpO1guc2V0Q2xlYXIoMSk7aWEuc2V0Q2xlYXIoMCk7QSgyOTI5KTtYLnNldEZ1bmMoMyk7SighMSk7USgxKTtBKDI4ODQpO0coMCk7cmV0dXJue2J1ZmZlcnM6e2NvbG9yOlcsZGVwdGg6WCxzdGVuY2lsOmlhfSxpbml0QXR0cmlidXRlczpmdW5jdGlvbigpe2Zvcih2YXIga2E9MCxIYT1zYS5sZW5ndGg7a2E8SGE7a2ErKylzYVtrYV09CjB9LGVuYWJsZUF0dHJpYnV0ZTpmdW5jdGlvbihrYSl7dyhrYSwwKX0sZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvcjp3LGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzOmZ1bmN0aW9uKCl7Zm9yKHZhciBrYT0wLEhhPXFhLmxlbmd0aDtrYSE9PUhhOysra2EpcWFba2FdIT09c2Fba2FdJiYoYi5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoa2EpLHFhW2thXT0wKX0sZW5hYmxlOkEsZGlzYWJsZTpFLGdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0czpmdW5jdGlvbigpe2lmKG51bGw9PT1wYSYmKHBhPVtdLGUuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKXx8ZS5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fGUuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMSIpfHxlLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiKSkpZm9yKHZhciBrYT1iLmdldFBhcmFtZXRlcigzNDQ2NyksSGE9MDtIYTxrYS5sZW5ndGg7SGErKylwYS5wdXNoKGthW0hhXSk7CnJldHVybiBwYX0sdXNlUHJvZ3JhbTpmdW5jdGlvbihrYSl7cmV0dXJuIHZhIT09a2E/KGIudXNlUHJvZ3JhbShrYSksdmE9a2EsITApOiExfSxzZXRCbGVuZGluZzpHLHNldE1hdGVyaWFsOmZ1bmN0aW9uKGthLEhhKXsyPT09a2Euc2lkZT9FKDI4ODQpOkEoMjg4NCk7dmFyIE5hPTE9PT1rYS5zaWRlO0hhJiYoTmE9IU5hKTtKKE5hKTsxPT09a2EuYmxlbmRpbmcmJiExPT09a2EudHJhbnNwYXJlbnQ/RygwKTpHKGthLmJsZW5kaW5nLGthLmJsZW5kRXF1YXRpb24sa2EuYmxlbmRTcmMsa2EuYmxlbmREc3Qsa2EuYmxlbmRFcXVhdGlvbkFscGhhLGthLmJsZW5kU3JjQWxwaGEsa2EuYmxlbmREc3RBbHBoYSxrYS5wcmVtdWx0aXBsaWVkQWxwaGEpO1guc2V0RnVuYyhrYS5kZXB0aEZ1bmMpO1guc2V0VGVzdChrYS5kZXB0aFRlc3QpO1guc2V0TWFzayhrYS5kZXB0aFdyaXRlKTtXLnNldE1hc2soa2EuY29sb3JXcml0ZSk7SGE9a2Euc3RlbmNpbFdyaXRlO2lhLnNldFRlc3QoSGEpO0hhJiYKKGlhLnNldEZ1bmMoa2Euc3RlbmNpbEZ1bmMsa2Euc3RlbmNpbFJlZixrYS5zdGVuY2lsTWFzayksaWEuc2V0T3Aoa2Euc3RlbmNpbEZhaWwsa2Euc3RlbmNpbFpGYWlsLGthLnN0ZW5jaWxaUGFzcykpO1Moa2EucG9seWdvbk9mZnNldCxrYS5wb2x5Z29uT2Zmc2V0RmFjdG9yLGthLnBvbHlnb25PZmZzZXRVbml0cyl9LHNldEZsaXBTaWRlZDpKLHNldEN1bGxGYWNlOlEsc2V0TGluZVdpZHRoOmZ1bmN0aW9uKGthKXtrYSE9PW5iJiYob2EmJmIubGluZVdpZHRoKGthKSxuYj1rYSl9LHNldFBvbHlnb25PZmZzZXQ6UyxzZXRTY2lzc29yVGVzdDpmdW5jdGlvbihrYSl7a2E/QSgzMDg5KTpFKDMwODkpfSxhY3RpdmVUZXh0dXJlOlQsYmluZFRleHR1cmU6ZnVuY3Rpb24oa2EsSGEpe251bGw9PT1BYSYmVCgpO3ZhciBOYT1LYVtBYV07dm9pZCAwPT09TmEmJihOYT17dHlwZTp2b2lkIDAsdGV4dHVyZTp2b2lkIDB9LEthW0FhXT1OYSk7aWYoTmEudHlwZSE9PWthfHxOYS50ZXh0dXJlIT09CkhhKWIuYmluZFRleHR1cmUoa2EsSGF8fGZiW2thXSksTmEudHlwZT1rYSxOYS50ZXh0dXJlPUhhfSxjb21wcmVzc2VkVGV4SW1hZ2UyRDpmdW5jdGlvbigpe3RyeXtiLmNvbXByZXNzZWRUZXhJbWFnZTJELmFwcGx5KGIsYXJndW1lbnRzKX1jYXRjaChrYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGthKX19LHRleEltYWdlMkQ6ZnVuY3Rpb24oKXt0cnl7Yi50ZXhJbWFnZTJELmFwcGx5KGIsYXJndW1lbnRzKX1jYXRjaChrYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGthKX19LHRleEltYWdlM0Q6ZnVuY3Rpb24oKXt0cnl7Yi50ZXhJbWFnZTNELmFwcGx5KGIsYXJndW1lbnRzKX1jYXRjaChrYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGthKX19LHNjaXNzb3I6ZnVuY3Rpb24oa2EpeyExPT09JGEuZXF1YWxzKGthKSYmKGIuc2Npc3NvcihrYS54LGthLnksa2EueixrYS53KSwkYS5jb3B5KGthKSl9LHZpZXdwb3J0OmZ1bmN0aW9uKGthKXshMT09PQpQYS5lcXVhbHMoa2EpJiYoYi52aWV3cG9ydChrYS54LGthLnksa2EueixrYS53KSxQYS5jb3B5KGthKSl9LHJlc2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBrYT0wO2thPHFhLmxlbmd0aDtrYSsrKTE9PT1xYVtrYV0mJihiLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShrYSkscWFba2FdPTApO3dhPXt9O0FhPXBhPW51bGw7S2E9e307ZWI9TGE9VmE9dmE9bnVsbDtXLnJlc2V0KCk7WC5yZXNldCgpO2lhLnJlc2V0KCl9fX1mdW5jdGlvbiBTcihiLGUsaCxtLHUsdyxBKXtmdW5jdGlvbiBFKGphLG9hKXtyZXR1cm4gZWI/bmV3IE9mZnNjcmVlbkNhbnZhcyhqYSxvYSk6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiY2FudmFzIil9ZnVuY3Rpb24gRyhqYSxvYSxBYSxLYSl7dmFyICRhPTE7aWYoamEud2lkdGg+S2F8fGphLmhlaWdodD5LYSkkYT1LYS9NYXRoLm1heChqYS53aWR0aCxqYS5oZWlnaHQpO2lmKDE+JGF8fCEwPT09b2Epe2lmKCJ1bmRlZmluZWQiIT09CnR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50JiZqYSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fCJ1bmRlZmluZWQiIT09dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50JiZqYSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHwidW5kZWZpbmVkIiE9PXR5cGVvZiBJbWFnZUJpdG1hcCYmamEgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcClyZXR1cm4gS2E9b2E/bGIuZmxvb3JQb3dlck9mVHdvOk1hdGguZmxvb3Isb2E9S2EoJGEqamEud2lkdGgpLCRhPUthKCRhKmphLmhlaWdodCksdm9pZCAwPT09TGEmJihMYT1FKG9hLCRhKSksQWE9QWE/RShvYSwkYSk6TGEsQWEud2lkdGg9b2EsQWEuaGVpZ2h0PSRhLEFhLmdldENvbnRleHQoIjJkIikuZHJhd0ltYWdlKGphLDAsMCxvYSwkYSksY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGhhcyBiZWVuIHJlc2l6ZWQgZnJvbSAoIitqYS53aWR0aCsieCIramEuaGVpZ2h0KyIpIHRvICgiK29hKyJ4IiskYSsiKS4iKSwKQWE7ImRhdGEiaW4gamEmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogSW1hZ2UgaW4gRGF0YVRleHR1cmUgaXMgdG9vIGJpZyAoIitqYS53aWR0aCsieCIramEuaGVpZ2h0KyIpLiIpfXJldHVybiBqYX1mdW5jdGlvbiBKKGphKXtyZXR1cm4gbGIuaXNQb3dlck9mVHdvKGphLndpZHRoKSYmbGIuaXNQb3dlck9mVHdvKGphLmhlaWdodCl9ZnVuY3Rpb24gUShqYSl7cmV0dXJuIHUuaXNXZWJHTDI/ITE6MTAwMSE9PWphLndyYXBTfHwxMDAxIT09amEud3JhcFR8fDEwMDMhPT1qYS5taW5GaWx0ZXImJjEwMDYhPT1qYS5taW5GaWx0ZXJ9ZnVuY3Rpb24gUyhqYSxvYSl7cmV0dXJuIGphLmdlbmVyYXRlTWlwbWFwcyYmb2EmJjEwMDMhPT1qYS5taW5GaWx0ZXImJjEwMDYhPT1qYS5taW5GaWx0ZXJ9ZnVuY3Rpb24gVChqYSxvYSxBYSxLYSl7Yi5nZW5lcmF0ZU1pcG1hcChqYSk7bS5nZXQob2EpLl9fbWF4TWlwTGV2ZWw9TWF0aC5sb2coTWF0aC5tYXgoQWEsS2EpKSpNYXRoLkxPRzJFfQpmdW5jdGlvbiBXKGphLG9hKXtpZighdS5pc1dlYkdMMilyZXR1cm4gamE7dmFyIEFhPWphOzY0MDM9PT1qYSYmKDUxMjY9PT1vYSYmKEFhPTMzMzI2KSw1MTMxPT09b2EmJihBYT0zMzMyNSksNTEyMT09PW9hJiYoQWE9MzMzMjEpKTs2NDA3PT09amEmJig1MTI2PT09b2EmJihBYT0zNDgzNyksNTEzMT09PW9hJiYoQWE9MzQ4NDMpLDUxMjE9PT1vYSYmKEFhPTMyODQ5KSk7NjQwOD09PWphJiYoNTEyNj09PW9hJiYoQWE9MzQ4MzYpLDUxMzE9PT1vYSYmKEFhPTM0ODQyKSw1MTIxPT09b2EmJihBYT0zMjg1NikpOzMzMzI1PT09QWF8fDMzMzI2PT09QWF8fDM0ODQyPT09QWF8fDM0ODM2PT09QWE/ZS5nZXQoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKTooMzQ4NDM9PT1BYXx8MzQ4Mzc9PT1BYSkmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogRmxvYXRpbmcgcG9pbnQgdGV4dHVyZXMgd2l0aCBSR0IgZm9ybWF0IG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSB1c2UgUkdCQSBpbnN0ZWFkLiIpOwpyZXR1cm4gQWF9ZnVuY3Rpb24gWChqYSl7cmV0dXJuIDEwMDM9PT1qYXx8MTAwND09PWphfHwxMDA1PT09amE/OTcyODo5NzI5fWZ1bmN0aW9uIGlhKGphKXtqYT1qYS50YXJnZXQ7amEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsaWEpO3NhKGphKTtqYS5pc1ZpZGVvVGV4dHVyZSYmeWIuZGVsZXRlKGphKTtBLm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIGhhKGphKXtqYT1qYS50YXJnZXQ7amEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsaGEpO3FhKGphKTtBLm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIHNhKGphKXt2YXIgb2E9bS5nZXQoamEpO3ZvaWQgMCE9PW9hLl9fd2ViZ2xJbml0JiYoYi5kZWxldGVUZXh0dXJlKG9hLl9fd2ViZ2xUZXh0dXJlKSxtLnJlbW92ZShqYSkpfWZ1bmN0aW9uIHFhKGphKXt2YXIgb2E9bS5nZXQoamEpLEFhPW0uZ2V0KGphLnRleHR1cmUpO2lmKGphKXt2b2lkIDAhPT1BYS5fX3dlYmdsVGV4dHVyZSYmYi5kZWxldGVUZXh0dXJlKEFhLl9fd2ViZ2xUZXh0dXJlKTsKamEuZGVwdGhUZXh0dXJlJiZqYS5kZXB0aFRleHR1cmUuZGlzcG9zZSgpO2lmKGphLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKWZvcihBYT0wOzY+QWE7QWErKyliLmRlbGV0ZUZyYW1lYnVmZmVyKG9hLl9fd2ViZ2xGcmFtZWJ1ZmZlcltBYV0pLG9hLl9fd2ViZ2xEZXB0aGJ1ZmZlciYmYi5kZWxldGVSZW5kZXJidWZmZXIob2EuX193ZWJnbERlcHRoYnVmZmVyW0FhXSk7ZWxzZSBiLmRlbGV0ZUZyYW1lYnVmZmVyKG9hLl9fd2ViZ2xGcmFtZWJ1ZmZlciksb2EuX193ZWJnbERlcHRoYnVmZmVyJiZiLmRlbGV0ZVJlbmRlcmJ1ZmZlcihvYS5fX3dlYmdsRGVwdGhidWZmZXIpO20ucmVtb3ZlKGphLnRleHR1cmUpO20ucmVtb3ZlKGphKX19ZnVuY3Rpb24gcmEoamEsb2Epe3ZhciBBYT1tLmdldChqYSk7amEuaXNWaWRlb1RleHR1cmUmJmhiKGphKTtpZigwPGphLnZlcnNpb24mJkFhLl9fdmVyc2lvbiE9PWphLnZlcnNpb24pe3ZhciBLYT1qYS5pbWFnZTtpZih2b2lkIDA9PT1LYSljb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIHVuZGVmaW5lZCIpOwplbHNlIGlmKCExPT09S2EuY29tcGxldGUpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyBpbmNvbXBsZXRlIik7ZWxzZXtWYShBYSxqYSxvYSk7cmV0dXJufX1oLmFjdGl2ZVRleHR1cmUoMzM5ODQrb2EpO2guYmluZFRleHR1cmUoMzU1MyxBYS5fX3dlYmdsVGV4dHVyZSl9ZnVuY3Rpb24gd2EoamEsb2Epe2lmKDY9PT1qYS5pbWFnZS5sZW5ndGgpe3ZhciBBYT1tLmdldChqYSk7aWYoMDxqYS52ZXJzaW9uJiZBYS5fX3ZlcnNpb24hPT1qYS52ZXJzaW9uKXtDYShBYSxqYSk7aC5hY3RpdmVUZXh0dXJlKDMzOTg0K29hKTtoLmJpbmRUZXh0dXJlKDM0MDY3LEFhLl9fd2ViZ2xUZXh0dXJlKTtiLnBpeGVsU3RvcmVpKDM3NDQwLGphLmZsaXBZKTt2YXIgS2E9amEmJmphLmlzQ29tcHJlc3NlZFRleHR1cmU7b2E9amEuaW1hZ2VbMF0mJmphLmltYWdlWzBdLmlzRGF0YVRleHR1cmU7Zm9yKHZhciAkYT1bXSwKUGE9MDs2PlBhO1BhKyspJGFbUGFdPUthfHxvYT9vYT9qYS5pbWFnZVtQYV0uaW1hZ2U6amEuaW1hZ2VbUGFdOkcoamEuaW1hZ2VbUGFdLCExLCEwLHUubWF4Q3ViZW1hcFNpemUpO3ZhciBmYj0kYVswXSxrYT1KKGZiKXx8dS5pc1dlYkdMMixIYT13LmNvbnZlcnQoamEuZm9ybWF0KSxOYT13LmNvbnZlcnQoamEudHlwZSkscmI9VyhIYSxOYSk7dmEoMzQwNjcsamEsa2EpO2lmKEthKXtmb3IoUGE9MDs2PlBhO1BhKyspe3ZhciBYYT0kYVtQYV0ubWlwbWFwcztmb3IoS2E9MDtLYTxYYS5sZW5ndGg7S2ErKyl7dmFyIG1iPVhhW0thXTsxMDIzIT09amEuZm9ybWF0JiYxMDIyIT09amEuZm9ybWF0Py0xPGguZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZihIYSk/aC5jb21wcmVzc2VkVGV4SW1hZ2UyRCgzNDA2OStQYSxLYSxyYixtYi53aWR0aCxtYi5oZWlnaHQsMCxtYi5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC5zZXRUZXh0dXJlQ3ViZSgpIik6CmgudGV4SW1hZ2UyRCgzNDA2OStQYSxLYSxyYixtYi53aWR0aCxtYi5oZWlnaHQsMCxIYSxOYSxtYi5kYXRhKX19QWEuX19tYXhNaXBMZXZlbD1YYS5sZW5ndGgtMX1lbHNle1hhPWphLm1pcG1hcHM7Zm9yKFBhPTA7Nj5QYTtQYSsrKWlmKG9hKWZvcihoLnRleEltYWdlMkQoMzQwNjkrUGEsMCxyYiwkYVtQYV0ud2lkdGgsJGFbUGFdLmhlaWdodCwwLEhhLE5hLCRhW1BhXS5kYXRhKSxLYT0wO0thPFhhLmxlbmd0aDtLYSsrKW1iPVhhW0thXSxtYj1tYi5pbWFnZVtQYV0uaW1hZ2UsaC50ZXhJbWFnZTJEKDM0MDY5K1BhLEthKzEscmIsbWIud2lkdGgsbWIuaGVpZ2h0LDAsSGEsTmEsbWIuZGF0YSk7ZWxzZSBmb3IoaC50ZXhJbWFnZTJEKDM0MDY5K1BhLDAscmIsSGEsTmEsJGFbUGFdKSxLYT0wO0thPFhhLmxlbmd0aDtLYSsrKW1iPVhhW0thXSxoLnRleEltYWdlMkQoMzQwNjkrUGEsS2ErMSxyYixIYSxOYSxtYi5pbWFnZVtQYV0pO0FhLl9fbWF4TWlwTGV2ZWw9WGEubGVuZ3RofVMoamEsCmthKSYmVCgzNDA2NyxqYSxmYi53aWR0aCxmYi5oZWlnaHQpO0FhLl9fdmVyc2lvbj1qYS52ZXJzaW9uO2lmKGphLm9uVXBkYXRlKWphLm9uVXBkYXRlKGphKX1lbHNlIGguYWN0aXZlVGV4dHVyZSgzMzk4NCtvYSksaC5iaW5kVGV4dHVyZSgzNDA2NyxBYS5fX3dlYmdsVGV4dHVyZSl9fWZ1bmN0aW9uIHBhKGphLG9hKXtoLmFjdGl2ZVRleHR1cmUoMzM5ODQrb2EpO2guYmluZFRleHR1cmUoMzQwNjcsbS5nZXQoamEpLl9fd2ViZ2xUZXh0dXJlKX1mdW5jdGlvbiB2YShqYSxvYSxBYSl7QWE/KGIudGV4UGFyYW1ldGVyaShqYSwxMDI0Mix3LmNvbnZlcnQob2Eud3JhcFMpKSxiLnRleFBhcmFtZXRlcmkoamEsMTAyNDMsdy5jb252ZXJ0KG9hLndyYXBUKSksMzI4NzkhPT1qYSYmMzU4NjYhPT1qYXx8Yi50ZXhQYXJhbWV0ZXJpKGphLDMyODgyLHcuY29udmVydChvYS53cmFwUikpLGIudGV4UGFyYW1ldGVyaShqYSwxMDI0MCx3LmNvbnZlcnQob2EubWFnRmlsdGVyKSksYi50ZXhQYXJhbWV0ZXJpKGphLAoxMDI0MSx3LmNvbnZlcnQob2EubWluRmlsdGVyKSkpOihiLnRleFBhcmFtZXRlcmkoamEsMTAyNDIsMzMwNzEpLGIudGV4UGFyYW1ldGVyaShqYSwxMDI0MywzMzA3MSksMzI4NzkhPT1qYSYmMzU4NjYhPT1qYXx8Yi50ZXhQYXJhbWV0ZXJpKGphLDMyODgyLDMzMDcxKSwxMDAxPT09b2Eud3JhcFMmJjEwMDE9PT1vYS53cmFwVHx8Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLiIpLGIudGV4UGFyYW1ldGVyaShqYSwxMDI0MCxYKG9hLm1hZ0ZpbHRlcikpLGIudGV4UGFyYW1ldGVyaShqYSwxMDI0MSxYKG9hLm1pbkZpbHRlcikpLDEwMDMhPT1vYS5taW5GaWx0ZXImJjEwMDYhPT1vYS5taW5GaWx0ZXImJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBpcyBub3QgcG93ZXIgb2YgdHdvLiBUZXh0dXJlLm1pbkZpbHRlciBzaG91bGQgYmUgc2V0IHRvIFRIUkVFLk5lYXJlc3RGaWx0ZXIgb3IgVEhSRUUuTGluZWFyRmlsdGVyLiIpKTsKIShBYT1lLmdldCgiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIikpfHwxMDE1PT09b2EudHlwZSYmbnVsbD09PWUuZ2V0KCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKXx8MTAxNj09PW9hLnR5cGUmJm51bGw9PT0odS5pc1dlYkdMMnx8ZS5nZXQoIk9FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyIikpfHwhKDE8b2EuYW5pc290cm9weXx8bS5nZXQob2EpLl9fY3VycmVudEFuaXNvdHJvcHkpfHwoYi50ZXhQYXJhbWV0ZXJmKGphLEFhLlRFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhULE1hdGgubWluKG9hLmFuaXNvdHJvcHksdS5nZXRNYXhBbmlzb3Ryb3B5KCkpKSxtLmdldChvYSkuX19jdXJyZW50QW5pc290cm9weT1vYS5hbmlzb3Ryb3B5KX1mdW5jdGlvbiBDYShqYSxvYSl7dm9pZCAwPT09amEuX193ZWJnbEluaXQmJihqYS5fX3dlYmdsSW5pdD0hMCxvYS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixpYSksamEuX193ZWJnbFRleHR1cmU9Yi5jcmVhdGVUZXh0dXJlKCksCkEubWVtb3J5LnRleHR1cmVzKyspfWZ1bmN0aW9uIFZhKGphLG9hLEFhKXt2YXIgS2E9MzU1MztvYS5pc0RhdGFUZXh0dXJlMkRBcnJheSYmKEthPTM1ODY2KTtvYS5pc0RhdGFUZXh0dXJlM0QmJihLYT0zMjg3OSk7Q2EoamEsb2EpO2guYWN0aXZlVGV4dHVyZSgzMzk4NCtBYSk7aC5iaW5kVGV4dHVyZShLYSxqYS5fX3dlYmdsVGV4dHVyZSk7Yi5waXhlbFN0b3JlaSgzNzQ0MCxvYS5mbGlwWSk7Yi5waXhlbFN0b3JlaSgzNzQ0MSxvYS5wcmVtdWx0aXBseUFscGhhKTtiLnBpeGVsU3RvcmVpKDMzMTcsb2EudW5wYWNrQWxpZ25tZW50KTtBYT1RKG9hKSYmITE9PT1KKG9hLmltYWdlKTtBYT1HKG9hLmltYWdlLEFhLCExLHUubWF4VGV4dHVyZVNpemUpO3ZhciAkYT1KKEFhKXx8dS5pc1dlYkdMMixQYT13LmNvbnZlcnQob2EuZm9ybWF0KSxmYj13LmNvbnZlcnQob2EudHlwZSksa2E9VyhQYSxmYik7dmEoS2Esb2EsJGEpO3ZhciBIYT1vYS5taXBtYXBzO2lmKG9hLmlzRGVwdGhUZXh0dXJlKXtrYT0KNjQwMjtpZigxMDE1PT09b2EudHlwZSl7aWYoIXUuaXNXZWJHTDIpdGhyb3cgRXJyb3IoIkZsb2F0IERlcHRoIFRleHR1cmUgb25seSBzdXBwb3J0ZWQgaW4gV2ViR0wyLjAiKTtrYT0zNjAxMn1lbHNlIHUuaXNXZWJHTDImJihrYT0zMzE4OSk7MTAyNj09PW9hLmZvcm1hdCYmNjQwMj09PWthJiYxMDEyIT09b2EudHlwZSYmMTAxNCE9PW9hLnR5cGUmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZFNob3J0VHlwZSBvciBVbnNpZ25lZEludFR5cGUgZm9yIERlcHRoRm9ybWF0IERlcHRoVGV4dHVyZS4iKSxvYS50eXBlPTEwMTIsZmI9dy5jb252ZXJ0KG9hLnR5cGUpKTsxMDI3PT09b2EuZm9ybWF0JiYoa2E9MzQwNDEsMTAyMCE9PW9hLnR5cGUmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERlcHRoU3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuIiksb2EudHlwZT0xMDIwLGZiPQp3LmNvbnZlcnQob2EudHlwZSkpKTtoLnRleEltYWdlMkQoMzU1MywwLGthLEFhLndpZHRoLEFhLmhlaWdodCwwLFBhLGZiLG51bGwpfWVsc2UgaWYob2EuaXNEYXRhVGV4dHVyZSlpZigwPEhhLmxlbmd0aCYmJGEpe2Zvcih2YXIgTmE9MCxyYj1IYS5sZW5ndGg7TmE8cmI7TmErKylLYT1IYVtOYV0saC50ZXhJbWFnZTJEKDM1NTMsTmEsa2EsS2Eud2lkdGgsS2EuaGVpZ2h0LDAsUGEsZmIsS2EuZGF0YSk7b2EuZ2VuZXJhdGVNaXBtYXBzPSExO2phLl9fbWF4TWlwTGV2ZWw9SGEubGVuZ3RoLTF9ZWxzZSBoLnRleEltYWdlMkQoMzU1MywwLGthLEFhLndpZHRoLEFhLmhlaWdodCwwLFBhLGZiLEFhLmRhdGEpLGphLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKG9hLmlzQ29tcHJlc3NlZFRleHR1cmUpe05hPTA7Zm9yKHJiPUhhLmxlbmd0aDtOYTxyYjtOYSsrKUthPUhhW05hXSwxMDIzIT09b2EuZm9ybWF0JiYxMDIyIT09b2EuZm9ybWF0Py0xPGguZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZihQYSk/CmguY29tcHJlc3NlZFRleEltYWdlMkQoMzU1MyxOYSxrYSxLYS53aWR0aCxLYS5oZWlnaHQsMCxLYS5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC51cGxvYWRUZXh0dXJlKCkiKTpoLnRleEltYWdlMkQoMzU1MyxOYSxrYSxLYS53aWR0aCxLYS5oZWlnaHQsMCxQYSxmYixLYS5kYXRhKTtqYS5fX21heE1pcExldmVsPUhhLmxlbmd0aC0xfWVsc2UgaWYob2EuaXNEYXRhVGV4dHVyZTJEQXJyYXkpaC50ZXhJbWFnZTNEKDM1ODY2LDAsa2EsQWEud2lkdGgsQWEuaGVpZ2h0LEFhLmRlcHRoLDAsUGEsZmIsQWEuZGF0YSksamEuX19tYXhNaXBMZXZlbD0wO2Vsc2UgaWYob2EuaXNEYXRhVGV4dHVyZTNEKWgudGV4SW1hZ2UzRCgzMjg3OSwwLGthLEFhLndpZHRoLEFhLmhlaWdodCxBYS5kZXB0aCwwLFBhLGZiLEFhLmRhdGEpLGphLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKDA8CkhhLmxlbmd0aCYmJGEpe05hPTA7Zm9yKHJiPUhhLmxlbmd0aDtOYTxyYjtOYSsrKUthPUhhW05hXSxoLnRleEltYWdlMkQoMzU1MyxOYSxrYSxQYSxmYixLYSk7b2EuZ2VuZXJhdGVNaXBtYXBzPSExO2phLl9fbWF4TWlwTGV2ZWw9SGEubGVuZ3RoLTF9ZWxzZSBoLnRleEltYWdlMkQoMzU1MywwLGthLFBhLGZiLEFhKSxqYS5fX21heE1pcExldmVsPTA7UyhvYSwkYSkmJlQoMzU1MyxvYSxBYS53aWR0aCxBYS5oZWlnaHQpO2phLl9fdmVyc2lvbj1vYS52ZXJzaW9uO2lmKG9hLm9uVXBkYXRlKW9hLm9uVXBkYXRlKG9hKX1mdW5jdGlvbiBXYShqYSxvYSxBYSxLYSl7dmFyICRhPXcuY29udmVydChvYS50ZXh0dXJlLmZvcm1hdCksUGE9dy5jb252ZXJ0KG9hLnRleHR1cmUudHlwZSksZmI9VygkYSxQYSk7aC50ZXhJbWFnZTJEKEthLDAsZmIsb2Eud2lkdGgsb2EuaGVpZ2h0LDAsJGEsUGEsbnVsbCk7Yi5iaW5kRnJhbWVidWZmZXIoMzYxNjAsamEpO2IuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsCkFhLEthLG0uZ2V0KG9hLnRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlLDApO2IuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWZ1bmN0aW9uIERhKGphLG9hLEFhKXtiLmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsamEpO2lmKG9hLmRlcHRoQnVmZmVyJiYhb2Euc3RlbmNpbEJ1ZmZlcilBYT8oQWE9T2Eob2EpLGIucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLEFhLDMzMTg5LG9hLndpZHRoLG9hLmhlaWdodCkpOmIucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSwzMzE4OSxvYS53aWR0aCxvYS5oZWlnaHQpLGIuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoMzYxNjAsMzYwOTYsMzYxNjEsamEpO2Vsc2UgaWYob2EuZGVwdGhCdWZmZXImJm9hLnN0ZW5jaWxCdWZmZXIpQWE/KEFhPU9hKG9hKSxiLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSxBYSwzNTA1NixvYS53aWR0aCxvYS5oZWlnaHQpKTpiLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoMzYxNjEsMzQwNDEsCm9hLndpZHRoLG9hLmhlaWdodCksYi5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzMzMwNiwzNjE2MSxqYSk7ZWxzZXtqYT13LmNvbnZlcnQob2EudGV4dHVyZS5mb3JtYXQpO3ZhciBLYT13LmNvbnZlcnQob2EudGV4dHVyZS50eXBlKTtqYT1XKGphLEthKTtBYT8oQWE9T2Eob2EpLGIucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLEFhLGphLG9hLndpZHRoLG9hLmhlaWdodCkpOmIucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSxqYSxvYS53aWR0aCxvYS5oZWlnaHQpfWIuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxudWxsKX1mdW5jdGlvbiBJYShqYSxvYSl7aWYob2EmJm9hLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKXRocm93IEVycm9yKCJEZXB0aCBUZXh0dXJlIHdpdGggY3ViZSByZW5kZXIgdGFyZ2V0cyBpcyBub3Qgc3VwcG9ydGVkIik7Yi5iaW5kRnJhbWVidWZmZXIoMzYxNjAsamEpO2lmKCFvYS5kZXB0aFRleHR1cmV8fCFvYS5kZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUpdGhyb3cgRXJyb3IoInJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBUSFJFRS5EZXB0aFRleHR1cmUiKTsKbS5nZXQob2EuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSYmb2EuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoPT09b2Eud2lkdGgmJm9hLmRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQ9PT1vYS5oZWlnaHR8fChvYS5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGg9b2Eud2lkdGgsb2EuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodD1vYS5oZWlnaHQsb2EuZGVwdGhUZXh0dXJlLm5lZWRzVXBkYXRlPSEwKTtyYShvYS5kZXB0aFRleHR1cmUsMCk7amE9bS5nZXQob2EuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZTtpZigxMDI2PT09b2EuZGVwdGhUZXh0dXJlLmZvcm1hdCliLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDM2MDk2LDM1NTMsamEsMCk7ZWxzZSBpZigxMDI3PT09b2EuZGVwdGhUZXh0dXJlLmZvcm1hdCliLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDMzMzA2LDM1NTMsamEsMCk7ZWxzZSB0aHJvdyBFcnJvcigiVW5rbm93biBkZXB0aFRleHR1cmUgZm9ybWF0Iik7Cn1mdW5jdGlvbiBFYShqYSl7dmFyIG9hPW0uZ2V0KGphKSxBYT0hMD09PWphLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlO2lmKGphLmRlcHRoVGV4dHVyZSl7aWYoQWEpdGhyb3cgRXJyb3IoInRhcmdldC5kZXB0aFRleHR1cmUgbm90IHN1cHBvcnRlZCBpbiBDdWJlIHJlbmRlciB0YXJnZXRzIik7SWEob2EuX193ZWJnbEZyYW1lYnVmZmVyLGphKX1lbHNlIGlmKEFhKWZvcihvYS5fX3dlYmdsRGVwdGhidWZmZXI9W10sQWE9MDs2PkFhO0FhKyspYi5iaW5kRnJhbWVidWZmZXIoMzYxNjAsb2EuX193ZWJnbEZyYW1lYnVmZmVyW0FhXSksb2EuX193ZWJnbERlcHRoYnVmZmVyW0FhXT1iLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLERhKG9hLl9fd2ViZ2xEZXB0aGJ1ZmZlcltBYV0samEpO2Vsc2UgYi5iaW5kRnJhbWVidWZmZXIoMzYxNjAsb2EuX193ZWJnbEZyYW1lYnVmZmVyKSxvYS5fX3dlYmdsRGVwdGhidWZmZXI9Yi5jcmVhdGVSZW5kZXJidWZmZXIoKSxEYShvYS5fX3dlYmdsRGVwdGhidWZmZXIsCmphKTtiLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxudWxsKX1mdW5jdGlvbiBPYShqYSl7cmV0dXJuIHUuaXNXZWJHTDImJmphLmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldD9NYXRoLm1pbih1Lm1heFNhbXBsZXMsamEuc2FtcGxlcyk6MH1mdW5jdGlvbiBoYihqYSl7dmFyIG9hPUEucmVuZGVyLmZyYW1lO3liLmdldChqYSkhPT1vYSYmKHliLnNldChqYSxvYSksamEudXBkYXRlKCkpfXZhciB5Yj1uZXcgV2Vha01hcCxMYSxlYj0idW5kZWZpbmVkIiE9PXR5cGVvZiBPZmZzY3JlZW5DYW52YXMsbmI9MCxOYj0hMSxEYj0hMTt0aGlzLmFsbG9jYXRlVGV4dHVyZVVuaXQ9ZnVuY3Rpb24oKXt2YXIgamE9bmI7amE+PXUubWF4VGV4dHVyZXMmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlczogVHJ5aW5nIHRvIHVzZSAiK2phKyIgdGV4dHVyZSB1bml0cyB3aGlsZSB0aGlzIEdQVSBzdXBwb3J0cyBvbmx5ICIrdS5tYXhUZXh0dXJlcyk7bmIrPTE7cmV0dXJuIGphfTt0aGlzLnJlc2V0VGV4dHVyZVVuaXRzPQpmdW5jdGlvbigpe25iPTB9O3RoaXMuc2V0VGV4dHVyZTJEPXJhO3RoaXMuc2V0VGV4dHVyZTJEQXJyYXk9ZnVuY3Rpb24oamEsb2Epe3ZhciBBYT1tLmdldChqYSk7MDxqYS52ZXJzaW9uJiZBYS5fX3ZlcnNpb24hPT1qYS52ZXJzaW9uP1ZhKEFhLGphLG9hKTooaC5hY3RpdmVUZXh0dXJlKDMzOTg0K29hKSxoLmJpbmRUZXh0dXJlKDM1ODY2LEFhLl9fd2ViZ2xUZXh0dXJlKSl9O3RoaXMuc2V0VGV4dHVyZTNEPWZ1bmN0aW9uKGphLG9hKXt2YXIgQWE9bS5nZXQoamEpOzA8amEudmVyc2lvbiYmQWEuX192ZXJzaW9uIT09amEudmVyc2lvbj9WYShBYSxqYSxvYSk6KGguYWN0aXZlVGV4dHVyZSgzMzk4NCtvYSksaC5iaW5kVGV4dHVyZSgzMjg3OSxBYS5fX3dlYmdsVGV4dHVyZSkpfTt0aGlzLnNldFRleHR1cmVDdWJlPXdhO3RoaXMuc2V0VGV4dHVyZUN1YmVEeW5hbWljPXBhO3RoaXMuc2V0dXBSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24oamEpe3ZhciBvYT1tLmdldChqYSksQWE9bS5nZXQoamEudGV4dHVyZSk7CmphLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGhhKTtBYS5fX3dlYmdsVGV4dHVyZT1iLmNyZWF0ZVRleHR1cmUoKTtBLm1lbW9yeS50ZXh0dXJlcysrO3ZhciBLYT0hMD09PWphLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlLCRhPSEwPT09amEuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0LFBhPUooamEpfHx1LmlzV2ViR0wyO2lmKEthKWZvcihvYS5fX3dlYmdsRnJhbWVidWZmZXI9W10sJGE9MDs2PiRhOyRhKyspb2EuX193ZWJnbEZyYW1lYnVmZmVyWyRhXT1iLmNyZWF0ZUZyYW1lYnVmZmVyKCk7ZWxzZSBpZihvYS5fX3dlYmdsRnJhbWVidWZmZXI9Yi5jcmVhdGVGcmFtZWJ1ZmZlcigpLCRhKWlmKHUuaXNXZWJHTDIpe29hLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcj1iLmNyZWF0ZUZyYW1lYnVmZmVyKCk7b2EuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyPWIuY3JlYXRlUmVuZGVyYnVmZmVyKCk7Yi5iaW5kUmVuZGVyYnVmZmVyKDM2MTYxLG9hLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcik7CiRhPXcuY29udmVydChqYS50ZXh0dXJlLmZvcm1hdCk7dmFyIGZiPXcuY29udmVydChqYS50ZXh0dXJlLnR5cGUpOyRhPVcoJGEsZmIpO2ZiPU9hKGphKTtiLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSxmYiwkYSxqYS53aWR0aCxqYS5oZWlnaHQpO2IuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG9hLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcik7Yi5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzNjA2NCwzNjE2MSxvYS5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIpO2IuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxudWxsKTtqYS5kZXB0aEJ1ZmZlciYmKG9hLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcj1iLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLERhKG9hLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcixqYSwhMCkpO2IuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIik7CmlmKEthKXtoLmJpbmRUZXh0dXJlKDM0MDY3LEFhLl9fd2ViZ2xUZXh0dXJlKTt2YSgzNDA2NyxqYS50ZXh0dXJlLFBhKTtmb3IoJGE9MDs2PiRhOyRhKyspV2Eob2EuX193ZWJnbEZyYW1lYnVmZmVyWyRhXSxqYSwzNjA2NCwzNDA2OSskYSk7UyhqYS50ZXh0dXJlLFBhKSYmVCgzNDA2NyxqYS50ZXh0dXJlLGphLndpZHRoLGphLmhlaWdodCk7aC5iaW5kVGV4dHVyZSgzNDA2NyxudWxsKX1lbHNlIGguYmluZFRleHR1cmUoMzU1MyxBYS5fX3dlYmdsVGV4dHVyZSksdmEoMzU1MyxqYS50ZXh0dXJlLFBhKSxXYShvYS5fX3dlYmdsRnJhbWVidWZmZXIsamEsMzYwNjQsMzU1MyksUyhqYS50ZXh0dXJlLFBhKSYmVCgzNTUzLGphLnRleHR1cmUsamEud2lkdGgsamEuaGVpZ2h0KSxoLmJpbmRUZXh0dXJlKDM1NTMsbnVsbCk7amEuZGVwdGhCdWZmZXImJkVhKGphKX07dGhpcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA9ZnVuY3Rpb24oamEpe3ZhciBvYT1qYS50ZXh0dXJlLEFhPUooamEpfHwKdS5pc1dlYkdMMjtpZihTKG9hLEFhKSl7QWE9amEuaXNXZWJHTFJlbmRlclRhcmdldEN1YmU/MzQwNjc6MzU1Mzt2YXIgS2E9bS5nZXQob2EpLl9fd2ViZ2xUZXh0dXJlO2guYmluZFRleHR1cmUoQWEsS2EpO1QoQWEsb2EsamEud2lkdGgsamEuaGVpZ2h0KTtoLmJpbmRUZXh0dXJlKEFhLG51bGwpfX07dGhpcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldD1mdW5jdGlvbihqYSl7aWYoamEuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KWlmKHUuaXNXZWJHTDIpe3ZhciBvYT1tLmdldChqYSk7Yi5iaW5kRnJhbWVidWZmZXIoMzYwMDgsb2EuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKTtiLmJpbmRGcmFtZWJ1ZmZlcigzNjAwOSxvYS5fX3dlYmdsRnJhbWVidWZmZXIpO29hPWphLndpZHRoO3ZhciBBYT1qYS5oZWlnaHQsS2E9MTYzODQ7amEuZGVwdGhCdWZmZXImJihLYXw9MjU2KTtqYS5zdGVuY2lsQnVmZmVyJiYoS2F8PTEwMjQpO2IuYmxpdEZyYW1lYnVmZmVyKDAsCjAsb2EsQWEsMCwwLG9hLEFhLEthLDk3MjgpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIil9O3RoaXMuc2FmZVNldFRleHR1cmUyRD1mdW5jdGlvbihqYSxvYSl7amEmJmphLmlzV2ViR0xSZW5kZXJUYXJnZXQmJighMT09PU5iJiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFRleHR1cmVzLnNhZmVTZXRUZXh0dXJlMkQ6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksTmI9ITApLGphPWphLnRleHR1cmUpO3JhKGphLG9hKX07dGhpcy5zYWZlU2V0VGV4dHVyZUN1YmU9ZnVuY3Rpb24oamEsb2Epe2phJiZqYS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSYmKCExPT09RGImJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMVGV4dHVyZXMuc2FmZVNldFRleHR1cmVDdWJlOiBkb24ndCB1c2UgY3ViZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksCkRiPSEwKSxqYT1qYS50ZXh0dXJlKTtqYSYmamEuaXNDdWJlVGV4dHVyZXx8QXJyYXkuaXNBcnJheShqYS5pbWFnZSkmJjY9PT1qYS5pbWFnZS5sZW5ndGg/d2EoamEsb2EpOnBhKGphLG9hKX19ZnVuY3Rpb24gRm4oYixlLGgpe3JldHVybntjb252ZXJ0OmZ1bmN0aW9uKG0pe2lmKDFFMz09PW0pcmV0dXJuIDEwNDk3O2lmKDEwMDE9PT1tKXJldHVybiAzMzA3MTtpZigxMDAyPT09bSlyZXR1cm4gMzM2NDg7aWYoMTAwMz09PW0pcmV0dXJuIDk3Mjg7aWYoMTAwND09PW0pcmV0dXJuIDk5ODQ7aWYoMTAwNT09PW0pcmV0dXJuIDk5ODY7aWYoMTAwNj09PW0pcmV0dXJuIDk3Mjk7aWYoMTAwNz09PW0pcmV0dXJuIDk5ODU7aWYoMTAwOD09PW0pcmV0dXJuIDk5ODc7aWYoMTAwOT09PW0pcmV0dXJuIDUxMjE7aWYoMTAxNz09PW0pcmV0dXJuIDMyODE5O2lmKDEwMTg9PT1tKXJldHVybiAzMjgyMDtpZigxMDE5PT09bSlyZXR1cm4gMzM2MzU7aWYoMTAxMD09PW0pcmV0dXJuIDUxMjA7aWYoMTAxMT09PQptKXJldHVybiA1MTIyO2lmKDEwMTI9PT1tKXJldHVybiA1MTIzO2lmKDEwMTM9PT1tKXJldHVybiA1MTI0O2lmKDEwMTQ9PT1tKXJldHVybiA1MTI1O2lmKDEwMTU9PT1tKXJldHVybiA1MTI2O2lmKDEwMTY9PT1tKXtpZihoLmlzV2ViR0wyKXJldHVybiA1MTMxO3ZhciB1PWUuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0Iik7aWYobnVsbCE9PXUpcmV0dXJuIHUuSEFMRl9GTE9BVF9PRVN9aWYoMTAyMT09PW0pcmV0dXJuIDY0MDY7aWYoMTAyMj09PW0pcmV0dXJuIDY0MDc7aWYoMTAyMz09PW0pcmV0dXJuIDY0MDg7aWYoMTAyND09PW0pcmV0dXJuIDY0MDk7aWYoMTAyNT09PW0pcmV0dXJuIDY0MTA7aWYoMTAyNj09PW0pcmV0dXJuIDY0MDI7aWYoMTAyNz09PW0pcmV0dXJuIDM0MDQxO2lmKDEwMjg9PT1tKXJldHVybiA2NDAzO2lmKDEwMD09PW0pcmV0dXJuIDMyNzc0O2lmKDEwMT09PW0pcmV0dXJuIDMyNzc4O2lmKDEwMj09PW0pcmV0dXJuIDMyNzc5O2lmKDIwMD09PW0pcmV0dXJuIDA7CmlmKDIwMT09PW0pcmV0dXJuIDE7aWYoMjAyPT09bSlyZXR1cm4gNzY4O2lmKDIwMz09PW0pcmV0dXJuIDc2OTtpZigyMDQ9PT1tKXJldHVybiA3NzA7aWYoMjA1PT09bSlyZXR1cm4gNzcxO2lmKDIwNj09PW0pcmV0dXJuIDc3MjtpZigyMDc9PT1tKXJldHVybiA3NzM7aWYoMjA4PT09bSlyZXR1cm4gNzc0O2lmKDIwOT09PW0pcmV0dXJuIDc3NTtpZigyMTA9PT1tKXJldHVybiA3NzY7aWYoMzM3NzY9PT1tfHwzMzc3Nz09PW18fDMzNzc4PT09bXx8MzM3Nzk9PT1tKWlmKHU9ZS5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIiksbnVsbCE9PXUpe2lmKDMzNzc2PT09bSlyZXR1cm4gdS5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUO2lmKDMzNzc3PT09bSlyZXR1cm4gdS5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVDtpZigzMzc3OD09PW0pcmV0dXJuIHUuQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ7aWYoMzM3Nzk9PT1tKXJldHVybiB1LkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUfWlmKDM1ODQwPT09Cm18fDM1ODQxPT09bXx8MzU4NDI9PT1tfHwzNTg0Mz09PW0paWYodT1lLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIiksbnVsbCE9PXUpe2lmKDM1ODQwPT09bSlyZXR1cm4gdS5DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HO2lmKDM1ODQxPT09bSlyZXR1cm4gdS5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HO2lmKDM1ODQyPT09bSlyZXR1cm4gdS5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRztpZigzNTg0Mz09PW0pcmV0dXJuIHUuQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUd9aWYoMzYxOTY9PT1tJiYodT1lLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEiKSxudWxsIT09dSkpcmV0dXJuIHUuQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTDtpZigzNzgwOD09PW18fDM3ODA5PT09bXx8Mzc4MTA9PT1tfHwzNzgxMT09PW18fDM3ODEyPT09bXx8Mzc4MTM9PT1tfHwzNzgxND09PW18fDM3ODE1PT09bXx8Mzc4MTY9PT0KbXx8Mzc4MTc9PT1tfHwzNzgxOD09PW18fDM3ODE5PT09bXx8Mzc4MjA9PT1tfHwzNzgyMT09PW0paWYodT1lLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiKSxudWxsIT09dSlyZXR1cm4gbTtpZigxMDM9PT1tfHwxMDQ9PT1tKXtpZihoLmlzV2ViR0wyKXtpZigxMDM9PT1tKXJldHVybiAzMjc3NTtpZigxMDQ9PT1tKXJldHVybiAzMjc3Nn11PWUuZ2V0KCJFWFRfYmxlbmRfbWlubWF4Iik7aWYobnVsbCE9PXUpe2lmKDEwMz09PW0pcmV0dXJuIHUuTUlOX0VYVDtpZigxMDQ9PT1tKXJldHVybiB1Lk1BWF9FWFR9fWlmKDEwMjA9PT1tKXtpZihoLmlzV2ViR0wyKXJldHVybiAzNDA0Mjt1PWUuZ2V0KCJXRUJHTF9kZXB0aF90ZXh0dXJlIik7aWYobnVsbCE9PXUpcmV0dXJuIHUuVU5TSUdORURfSU5UXzI0XzhfV0VCR0x9cmV0dXJuIDB9fX1mdW5jdGlvbiBGZigpe3kuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ikdyb3VwIn1mdW5jdGlvbiAkZyhiKXtBYi5jYWxsKHRoaXMpOwp0aGlzLmNhbWVyYXM9Ynx8W119ZnVuY3Rpb24gR24oYixlLGgpe0huLnNldEZyb21NYXRyaXhQb3NpdGlvbihlLm1hdHJpeFdvcmxkKTtJbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oaC5tYXRyaXhXb3JsZCk7dmFyIG09SG4uZGlzdGFuY2VUbyhJbiksdT1lLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMsdz1oLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMsQT11WzE0XS8odVsxMF0tMSk7aD11WzE0XS8odVsxMF0rMSk7dmFyIEU9KHVbOV0rMSkvdVs1XSxHPSh1WzldLTEpL3VbNV0sSj0odVs4XS0xKS91WzBdLFE9KHdbOF0rMSkvd1swXTt1PUEqSjt3PUEqUTtRPW0vKC1KK1EpO0o9USotSjtlLm1hdHJpeFdvcmxkLmRlY29tcG9zZShiLnBvc2l0aW9uLGIucXVhdGVybmlvbixiLnNjYWxlKTtiLnRyYW5zbGF0ZVgoSik7Yi50cmFuc2xhdGVaKFEpO2IubWF0cml4V29ybGQuY29tcG9zZShiLnBvc2l0aW9uLGIucXVhdGVybmlvbixiLnNjYWxlKTtiLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKGIubWF0cml4V29ybGQpOwplPUErUTtBPWgrUTtiLnByb2plY3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKHUtSix3KyhtLUopLEUqaC9BKmUsRypoL0EqZSxlLEEpfWZ1bmN0aW9uIHFrKGIpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PUomJiEwPT09Si5pc1ByZXNlbnRpbmd9ZnVuY3Rpb24gaCgpe2lmKGUoKSl7dmFyIElhPUouZ2V0RXllUGFyYW1ldGVycygibGVmdCIpO0E9MipJYS5yZW5kZXJXaWR0aCppYTtFPUlhLnJlbmRlckhlaWdodCppYTtWYT1iLmdldFBpeGVsUmF0aW8oKTtiLmdldFNpemUoQ2EpO2Iuc2V0RHJhd2luZ0J1ZmZlclNpemUoQSxFLDEpO3dhLnZpZXdwb3J0LnNldCgwLDAsQS8yLEUpO3BhLnZpZXdwb3J0LnNldChBLzIsMCxBLzIsRSk7RGEuc3RhcnQoKTtHLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25zdGFydCJ9KX1lbHNlIEcuZW5hYmxlZCYmYi5zZXREcmF3aW5nQnVmZmVyU2l6ZShDYS53aWR0aCxDYS5oZWlnaHQsVmEpLERhLnN0b3AoKSxHLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9CmZ1bmN0aW9uIG0oSWEpe2Zvcih2YXIgRWE9bmF2aWdhdG9yLmdldEdhbWVwYWRzJiZuYXZpZ2F0b3IuZ2V0R2FtZXBhZHMoKSxPYT0wLGhiPTAseWI9RWEubGVuZ3RoO09hPHliO09hKyspe3ZhciBMYT1FYVtPYV07aWYoTGEmJigiRGF5ZHJlYW0gQ29udHJvbGxlciI9PT1MYS5pZHx8IkdlYXIgVlIgQ29udHJvbGxlciI9PT1MYS5pZHx8Ik9jdWx1cyBHbyBDb250cm9sbGVyIj09PUxhLmlkfHwiT3BlblZSIEdhbWVwYWQiPT09TGEuaWR8fExhLmlkLnN0YXJ0c1dpdGgoIk9jdWx1cyBUb3VjaCIpfHxMYS5pZC5zdGFydHNXaXRoKCJIVEMgVml2ZSBGb2N1cyIpfHxMYS5pZC5zdGFydHNXaXRoKCJTcGF0aWFsIENvbnRyb2xsZXIiKSkpe2lmKGhiPT09SWEpcmV0dXJuIExhO2hiKyt9fX1mdW5jdGlvbiB1KCl7Zm9yKHZhciBJYT0wO0lhPFQubGVuZ3RoO0lhKyspe3ZhciBFYT1UW0lhXSxPYT1tKElhKTtpZih2b2lkIDAhPT1PYSYmdm9pZCAwIT09T2EucG9zZSl7aWYobnVsbD09PU9hLnBvc2UpYnJlYWs7CnZhciBoYj1PYS5wb3NlOyExPT09aGIuaGFzUG9zaXRpb24mJkVhLnBvc2l0aW9uLnNldCguMiwtLjYsLS4wNSk7bnVsbCE9PWhiLnBvc2l0aW9uJiZFYS5wb3NpdGlvbi5mcm9tQXJyYXkoaGIucG9zaXRpb24pO251bGwhPT1oYi5vcmllbnRhdGlvbiYmRWEucXVhdGVybmlvbi5mcm9tQXJyYXkoaGIub3JpZW50YXRpb24pO0VhLm1hdHJpeC5jb21wb3NlKEVhLnBvc2l0aW9uLEVhLnF1YXRlcm5pb24sRWEuc2NhbGUpO0VhLm1hdHJpeC5wcmVtdWx0aXBseShXKTtFYS5tYXRyaXguZGVjb21wb3NlKEVhLnBvc2l0aW9uLEVhLnF1YXRlcm5pb24sRWEuc2NhbGUpO0VhLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITA7RWEudmlzaWJsZT0hMDtoYj0iRGF5ZHJlYW0gQ29udHJvbGxlciI9PT1PYS5pZD8wOjE7dm9pZCAwPT09V2FbSWFdJiYoV2FbSWFdPSExKTtXYVtJYV0hPT1PYS5idXR0b25zW2hiXS5wcmVzc2VkJiYoV2FbSWFdPU9hLmJ1dHRvbnNbaGJdLnByZXNzZWQsITA9PT1XYVtJYV0/CkVhLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlbGVjdHN0YXJ0In0pOihFYS5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZWxlY3RlbmQifSksRWEuZGlzcGF0Y2hFdmVudCh7dHlwZToic2VsZWN0In0pKSl9ZWxzZSBFYS52aXNpYmxlPSExfX1mdW5jdGlvbiB3KElhLEVhKXtudWxsIT09RWEmJjQ9PT1FYS5sZW5ndGgmJklhLnNldChFYVswXSpBLEVhWzFdKkUsRWFbMl0qQSxFYVszXSpFKX12YXIgQSxFLEc9dGhpcyxKPW51bGwsUT1udWxsLFM9bnVsbCxUPVtdLFc9bmV3IHIsWD1uZXcgcixpYT0xLGhhPSJsb2NhbC1mbG9vciI7InVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93JiYiVlJGcmFtZURhdGEiaW4gd2luZG93JiYoUT1uZXcgd2luZG93LlZSRnJhbWVEYXRhLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ2cmRpc3BsYXlwcmVzZW50Y2hhbmdlIixoLCExKSk7dmFyIHNhPW5ldyByLHFhPW5ldyBmLHJhPW5ldyBnLHdhPW5ldyBBYjt3YS52aWV3cG9ydD1uZXcgbjt3YS5sYXllcnMuZW5hYmxlKDEpOwp2YXIgcGE9bmV3IEFiO3BhLnZpZXdwb3J0PW5ldyBuO3BhLmxheWVycy5lbmFibGUoMik7dmFyIHZhPW5ldyAkZyhbd2EscGFdKTt2YS5sYXllcnMuZW5hYmxlKDEpO3ZhLmxheWVycy5lbmFibGUoMik7dmFyIENhPW5ldyBkLFZhLFdhPVtdO3RoaXMuZW5hYmxlZD0hMTt0aGlzLmdldENvbnRyb2xsZXI9ZnVuY3Rpb24oSWEpe3ZhciBFYT1UW0lhXTt2b2lkIDA9PT1FYSYmKEVhPW5ldyBGZixFYS5tYXRyaXhBdXRvVXBkYXRlPSExLEVhLnZpc2libGU9ITEsVFtJYV09RWEpO3JldHVybiBFYX07dGhpcy5nZXREZXZpY2U9ZnVuY3Rpb24oKXtyZXR1cm4gSn07dGhpcy5zZXREZXZpY2U9ZnVuY3Rpb24oSWEpe3ZvaWQgMCE9PUlhJiYoSj1JYSk7RGEuc2V0Q29udGV4dChJYSl9O3RoaXMuc2V0RnJhbWVidWZmZXJTY2FsZUZhY3Rvcj1mdW5jdGlvbihJYSl7aWE9SWF9O3RoaXMuc2V0UmVmZXJlbmNlU3BhY2VUeXBlPWZ1bmN0aW9uKElhKXtoYT1JYX07dGhpcy5zZXRQb3NlVGFyZ2V0PWZ1bmN0aW9uKElhKXt2b2lkIDAhPT0KSWEmJihTPUlhKX07dGhpcy5nZXRDYW1lcmE9ZnVuY3Rpb24oSWEpe3ZhciBFYT0ibG9jYWwtZmxvb3IiPT09aGE/MS42OjA7aWYoITE9PT1lKCkpcmV0dXJuIElhLnBvc2l0aW9uLnNldCgwLEVhLDApLElhLnJvdGF0aW9uLnNldCgwLDAsMCksSWE7Si5kZXB0aE5lYXI9SWEubmVhcjtKLmRlcHRoRmFyPUlhLmZhcjtKLmdldEZyYW1lRGF0YShRKTtpZigibG9jYWwtZmxvb3IiPT09aGEpe3ZhciBPYT1KLnN0YWdlUGFyYW1ldGVycztPYT9XLmZyb21BcnJheShPYS5zaXR0aW5nVG9TdGFuZGluZ1RyYW5zZm9ybSk6Vy5tYWtlVHJhbnNsYXRpb24oMCxFYSwwKX1FYT1RLnBvc2U7T2E9bnVsbCE9PVM/UzpJYTtPYS5tYXRyaXguY29weShXKTtPYS5tYXRyaXguZGVjb21wb3NlKE9hLnBvc2l0aW9uLE9hLnF1YXRlcm5pb24sT2Euc2NhbGUpO251bGwhPT1FYS5vcmllbnRhdGlvbiYmKHFhLmZyb21BcnJheShFYS5vcmllbnRhdGlvbiksT2EucXVhdGVybmlvbi5tdWx0aXBseShxYSkpO251bGwhPT0KRWEucG9zaXRpb24mJihxYS5zZXRGcm9tUm90YXRpb25NYXRyaXgoVykscmEuZnJvbUFycmF5KEVhLnBvc2l0aW9uKSxyYS5hcHBseVF1YXRlcm5pb24ocWEpLE9hLnBvc2l0aW9uLmFkZChyYSkpO09hLnVwZGF0ZU1hdHJpeFdvcmxkKCk7d2EubmVhcj1JYS5uZWFyO3BhLm5lYXI9SWEubmVhcjt3YS5mYXI9SWEuZmFyO3BhLmZhcj1JYS5mYXI7d2EubWF0cml4V29ybGRJbnZlcnNlLmZyb21BcnJheShRLmxlZnRWaWV3TWF0cml4KTtwYS5tYXRyaXhXb3JsZEludmVyc2UuZnJvbUFycmF5KFEucmlnaHRWaWV3TWF0cml4KTtYLmdldEludmVyc2UoVyk7ImxvY2FsLWZsb29yIj09PWhhJiYod2EubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KFgpLHBhLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseShYKSk7SWE9T2EucGFyZW50O251bGwhPT1JYSYmKHNhLmdldEludmVyc2UoSWEubWF0cml4V29ybGQpLHdhLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseShzYSkscGEubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KHNhKSk7CndhLm1hdHJpeFdvcmxkLmdldEludmVyc2Uod2EubWF0cml4V29ybGRJbnZlcnNlKTtwYS5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKHBhLm1hdHJpeFdvcmxkSW52ZXJzZSk7d2EucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoUS5sZWZ0UHJvamVjdGlvbk1hdHJpeCk7cGEucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoUS5yaWdodFByb2plY3Rpb25NYXRyaXgpO0duKHZhLHdhLHBhKTtJYT1KLmdldExheWVycygpO0lhLmxlbmd0aCYmKElhPUlhWzBdLHcod2Eudmlld3BvcnQsSWEubGVmdEJvdW5kcyksdyhwYS52aWV3cG9ydCxJYS5yaWdodEJvdW5kcykpO3UoKTtyZXR1cm4gdmF9O3RoaXMuZ2V0U3RhbmRpbmdNYXRyaXg9ZnVuY3Rpb24oKXtyZXR1cm4gV307dGhpcy5pc1ByZXNlbnRpbmc9ZTt2YXIgRGE9bmV3IHhjO3RoaXMuc2V0QW5pbWF0aW9uTG9vcD1mdW5jdGlvbihJYSl7RGEuc2V0QW5pbWF0aW9uTG9vcChJYSk7ZSgpJiZEYS5zdGFydCgpfTt0aGlzLnN1Ym1pdEZyYW1lPQpmdW5jdGlvbigpe2UoKSYmSi5zdWJtaXRGcmFtZSgpfTt0aGlzLmRpc3Bvc2U9ZnVuY3Rpb24oKXsidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ2cmRpc3BsYXlwcmVzZW50Y2hhbmdlIixoKX07dGhpcy5zZXRGcmFtZU9mUmVmZXJlbmNlVHlwZT1mdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViVlJNYW5hZ2VyOiBzZXRGcmFtZU9mUmVmZXJlbmNlVHlwZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9fWZ1bmN0aW9uIEpuKGIsZSl7ZnVuY3Rpb24gaCgpe3JldHVybiBudWxsIT09RyYmbnVsbCE9PUp9ZnVuY3Rpb24gbShyYSl7Zm9yKHZhciB3YT0wO3dhPFQubGVuZ3RoO3dhKyspV1t3YV09PT1yYS5pbnB1dFNvdXJjZSYmVFt3YV0uZGlzcGF0Y2hFdmVudCh7dHlwZTpyYS50eXBlfSl9ZnVuY3Rpb24gdSgpe2Iuc2V0RnJhbWVidWZmZXIobnVsbCk7Yi5zZXRSZW5kZXJUYXJnZXQoYi5nZXRSZW5kZXJUYXJnZXQoKSk7CnFhLnN0b3AoKTtFLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9ZnVuY3Rpb24gdyhyYSl7Sj1yYTtxYS5zZXRDb250ZXh0KEcpO3FhLnN0YXJ0KCk7RS5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZXNzaW9uc3RhcnQifSl9ZnVuY3Rpb24gQShyYSx3YSl7bnVsbD09PXdhP3JhLm1hdHJpeFdvcmxkLmNvcHkocmEubWF0cml4KTpyYS5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHdhLm1hdHJpeFdvcmxkLHJhLm1hdHJpeCk7cmEubWF0cml4V29ybGRJbnZlcnNlLmdldEludmVyc2UocmEubWF0cml4V29ybGQpfXZhciBFPXRoaXMsRz1udWxsLEo9bnVsbCxRPSJsb2NhbC1mbG9vciIsUz1udWxsLFQ9W10sVz1bXSxYPW5ldyBBYjtYLmxheWVycy5lbmFibGUoMSk7WC52aWV3cG9ydD1uZXcgbjt2YXIgaWE9bmV3IEFiO2lhLmxheWVycy5lbmFibGUoMik7aWEudmlld3BvcnQ9bmV3IG47dmFyIGhhPW5ldyAkZyhbWCxpYV0pO2hhLmxheWVycy5lbmFibGUoMSk7aGEubGF5ZXJzLmVuYWJsZSgyKTsKdGhpcy5lbmFibGVkPSExO3RoaXMuZ2V0Q29udHJvbGxlcj1mdW5jdGlvbihyYSl7dmFyIHdhPVRbcmFdO3ZvaWQgMD09PXdhJiYod2E9bmV3IEZmLHdhLm1hdHJpeEF1dG9VcGRhdGU9ITEsd2EudmlzaWJsZT0hMSxUW3JhXT13YSk7cmV0dXJuIHdhfTt0aGlzLnNldEZyYW1lYnVmZmVyU2NhbGVGYWN0b3I9ZnVuY3Rpb24oKXt9O3RoaXMuc2V0UmVmZXJlbmNlU3BhY2VUeXBlPWZ1bmN0aW9uKHJhKXtRPXJhfTt0aGlzLmdldFNlc3Npb249ZnVuY3Rpb24oKXtyZXR1cm4gR307dGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKHJhKXtHPXJhO251bGwhPT1HJiYoRy5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3QiLG0pLEcuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0c3RhcnQiLG0pLEcuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0ZW5kIixtKSxHLmFkZEV2ZW50TGlzdGVuZXIoImVuZCIsdSksRy51cGRhdGVSZW5kZXJTdGF0ZSh7YmFzZUxheWVyOm5ldyBYUldlYkdMTGF5ZXIoRyxlKX0pLEcucmVxdWVzdFJlZmVyZW5jZVNwYWNlKFEpLnRoZW4odyksClc9Ry5pbnB1dFNvdXJjZXMsRy5hZGRFdmVudExpc3RlbmVyKCJpbnB1dHNvdXJjZXNjaGFuZ2UiLGZ1bmN0aW9uKCl7Vz1HLmlucHV0U291cmNlcztjb25zb2xlLmxvZyhXKTtmb3IodmFyIHdhPTA7d2E8VC5sZW5ndGg7d2ErKylUW3dhXS51c2VyRGF0YS5pbnB1dFNvdXJjZT1XW3dhXX0pKX07dGhpcy5nZXRDYW1lcmE9ZnVuY3Rpb24ocmEpe2lmKGgoKSl7dmFyIHdhPXJhLnBhcmVudCxwYT1oYS5jYW1lcmFzO0EoaGEsd2EpO2Zvcih2YXIgdmE9MDt2YTxwYS5sZW5ndGg7dmErKylBKHBhW3ZhXSx3YSk7cmEubWF0cml4V29ybGQuY29weShoYS5tYXRyaXhXb3JsZCk7cmE9cmEuY2hpbGRyZW47dmE9MDtmb3Iod2E9cmEubGVuZ3RoO3ZhPHdhO3ZhKyspcmFbdmFdLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTtHbihoYSxYLGlhKTtyZXR1cm4gaGF9cmV0dXJuIHJhfTt0aGlzLmlzUHJlc2VudGluZz1oO3ZhciBzYT1udWxsLHFhPW5ldyB4YztxYS5zZXRBbmltYXRpb25Mb29wKGZ1bmN0aW9uKHJhLAp3YSl7Uz13YS5nZXRWaWV3ZXJQb3NlKEopO2lmKG51bGwhPT1TKXt2YXIgcGE9Uy52aWV3cyx2YT1HLnJlbmRlclN0YXRlLmJhc2VMYXllcjtiLnNldEZyYW1lYnVmZmVyKHZhLmZyYW1lYnVmZmVyKTtmb3IodmFyIENhPTA7Q2E8cGEubGVuZ3RoO0NhKyspe3ZhciBWYT1wYVtDYV0sV2E9dmEuZ2V0Vmlld3BvcnQoVmEpLERhPWhhLmNhbWVyYXNbQ2FdO0RhLm1hdHJpeC5mcm9tQXJyYXkoVmEudHJhbnNmb3JtLmludmVyc2UubWF0cml4KS5nZXRJbnZlcnNlKERhLm1hdHJpeCk7RGEucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoVmEucHJvamVjdGlvbk1hdHJpeCk7RGEudmlld3BvcnQuc2V0KFdhLngsV2EueSxXYS53aWR0aCxXYS5oZWlnaHQpOzA9PT1DYSYmaGEubWF0cml4LmNvcHkoRGEubWF0cml4KX19Zm9yKENhPTA7Q2E8VC5sZW5ndGg7Q2ErKyl7cGE9VFtDYV07aWYodmE9V1tDYV0paWYodmE9d2EuZ2V0UG9zZSh2YS50YXJnZXRSYXlTcGFjZSxKKSxudWxsIT09dmEpe3BhLm1hdHJpeC5mcm9tQXJyYXkodmEudHJhbnNmb3JtLm1hdHJpeCk7CnBhLm1hdHJpeC5kZWNvbXBvc2UocGEucG9zaXRpb24scGEucm90YXRpb24scGEuc2NhbGUpO3BhLnZpc2libGU9ITA7Y29udGludWV9cGEudmlzaWJsZT0hMX1zYSYmc2EocmEpfSk7dGhpcy5zZXRBbmltYXRpb25Mb29wPWZ1bmN0aW9uKHJhKXtzYT1yYX07dGhpcy5kaXNwb3NlPWZ1bmN0aW9uKCl7fTt0aGlzLmdldFN0YW5kaW5nTWF0cml4PWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IGdldFN0YW5kaW5nTWF0cml4KCkgaXMgbm8gbG9uZ2VyIG5lZWRlZC4iKTtyZXR1cm4gbmV3IHJ9O3RoaXMuZ2V0RGV2aWNlPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IGdldERldmljZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9O3RoaXMuc2V0RGV2aWNlPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IHNldERldmljZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9O3RoaXMuc2V0RnJhbWVPZlJlZmVyZW5jZVR5cGU9CmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IHNldEZyYW1lT2ZSZWZlcmVuY2VUeXBlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4iKX07dGhpcy5zdWJtaXRGcmFtZT1mdW5jdGlvbigpe319ZnVuY3Rpb24gcmsoYil7dmFyIGU7ZnVuY3Rpb24gaCgpe3JldHVybiBudWxsPT09bWI/eWM6MX1mdW5jdGlvbiBtKCl7WWI9bmV3IExkKFRhKTt6Yz1uZXcgJGIoVGEsWWIsYik7emMuaXNXZWJHTDJ8fChZYi5nZXQoIldFQkdMX2RlcHRoX3RleHR1cmUiKSxZYi5nZXQoIk9FU190ZXh0dXJlX2Zsb2F0IiksWWIuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IiksWWIuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhciIpLFliLmdldCgiT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIiksWWIuZ2V0KCJPRVNfZWxlbWVudF9pbmRleF91aW50IiksWWIuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpO1liLmdldCgiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIik7CnZkPW5ldyBGbihUYSxZYix6Yyk7RWI9bmV3IFJyKFRhLFliLHZkLHpjKTtFYi5zY2lzc29yKGljLmNvcHkoR2YpLm11bHRpcGx5U2NhbGFyKHljKS5mbG9vcigpKTtFYi52aWV3cG9ydChXYi5jb3B5KEhmKS5tdWx0aXBseVNjYWxhcih5YykuZmxvb3IoKSk7b2U9bmV3IE9xKFRhKTtBYz1uZXcgSXI7d2Q9bmV3IFNyKFRhLFliLEViLEFjLHpjLHZkLG9lKTtzaT1uZXcgTWUoVGEpO3NrPW5ldyBrZShUYSxzaSxvZSk7SWY9bmV3IFJxKHNrLG9lKTtLbj1uZXcgUXEoVGEpO05lPW5ldyBIcihrYSxZYix6Yyk7dGk9bmV3IExyO0pmPW5ldyBRcjtwZT1uZXcgamUoa2EsRWIsSWYsb2EpO0xuPW5ldyB1YShUYSxZYixvZSx6Yyk7TW49bmV3IHFpKFRhLFliLG9lLHpjKTtvZS5wcm9ncmFtcz1OZS5wcm9ncmFtcztrYS5jYXBhYmlsaXRpZXM9emM7a2EuZXh0ZW5zaW9ucz1ZYjtrYS5wcm9wZXJ0aWVzPUFjO2thLnJlbmRlckxpc3RzPXRpO2thLnN0YXRlPUViO2thLmluZm89b2V9ZnVuY3Rpb24gdShWKXtWLnByZXZlbnREZWZhdWx0KCk7CmNvbnNvbGUubG9nKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IExvc3QuIik7SGE9ITB9ZnVuY3Rpb24gdygpe2NvbnNvbGUubG9nKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IFJlc3RvcmVkLiIpO0hhPSExO20oKX1mdW5jdGlvbiBBKFYpe1Y9Vi50YXJnZXQ7Vi5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixBKTtFKFYpfWZ1bmN0aW9uIEUoVil7RyhWKTtBYy5yZW1vdmUoVil9ZnVuY3Rpb24gRyhWKXt2YXIgZWE9QWMuZ2V0KFYpLnByb2dyYW07Vi5wcm9ncmFtPXZvaWQgMDt2b2lkIDAhPT1lYSYmTmUucmVsZWFzZVByb2dyYW0oZWEpfWZ1bmN0aW9uIEooVixlYSl7Vi5yZW5kZXIoZnVuY3Rpb24obmEpe2thLnJlbmRlckJ1ZmZlckltbWVkaWF0ZShuYSxlYSl9KX1mdW5jdGlvbiBRKFYsZWEsbmEpe2lmKG5hJiZuYS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5JiYhemMuaXNXZWJHTDImJm51bGw9PT1ZYi5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSljb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnNldHVwVmVydGV4QXR0cmlidXRlczogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7CmVsc2V7RWIuaW5pdEF0dHJpYnV0ZXMoKTt2YXIgSmE9bmEuYXR0cmlidXRlcztlYT1lYS5nZXRBdHRyaWJ1dGVzKCk7Vj1WLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM7Zm9yKHZhciBRYSBpbiBlYSl7dmFyIGRiPWVhW1FhXTtpZigwPD1kYil7dmFyIFJhPUphW1FhXTtpZih2b2lkIDAhPT1SYSl7dmFyIGtiPVJhLm5vcm1hbGl6ZWQsSmI9UmEuaXRlbVNpemUsc2I9c2kuZ2V0KFJhKTtpZih2b2lkIDAhPT1zYil7dmFyIGJiPXNiLmJ1ZmZlcix4ZD1zYi50eXBlO3NiPXNiLmJ5dGVzUGVyRWxlbWVudDtpZihSYS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXt2YXIgJGM9UmEuZGF0YSxLZj0kYy5zdHJpZGU7UmE9UmEub2Zmc2V0OyRjJiYkYy5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyPyhFYi5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKGRiLCRjLm1lc2hQZXJBdHRyaWJ1dGUpLHZvaWQgMD09PW5hLm1heEluc3RhbmNlZENvdW50JiYobmEubWF4SW5zdGFuY2VkQ291bnQ9CiRjLm1lc2hQZXJBdHRyaWJ1dGUqJGMuY291bnQpKTpFYi5lbmFibGVBdHRyaWJ1dGUoZGIpO1RhLmJpbmRCdWZmZXIoMzQ5NjIsYmIpO1RhLnZlcnRleEF0dHJpYlBvaW50ZXIoZGIsSmIseGQsa2IsS2Yqc2IsUmEqc2IpfWVsc2UgUmEuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU/KEViLmVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoZGIsUmEubWVzaFBlckF0dHJpYnV0ZSksdm9pZCAwPT09bmEubWF4SW5zdGFuY2VkQ291bnQmJihuYS5tYXhJbnN0YW5jZWRDb3VudD1SYS5tZXNoUGVyQXR0cmlidXRlKlJhLmNvdW50KSk6RWIuZW5hYmxlQXR0cmlidXRlKGRiKSxUYS5iaW5kQnVmZmVyKDM0OTYyLGJiKSxUYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGRiLEpiLHhkLGtiLDAsMCl9fWVsc2UgaWYodm9pZCAwIT09ViYmKGtiPVZbUWFdLHZvaWQgMCE9PWtiKSlzd2l0Y2goa2IubGVuZ3RoKXtjYXNlIDI6VGEudmVydGV4QXR0cmliMmZ2KGRiLGtiKTticmVhaztjYXNlIDM6VGEudmVydGV4QXR0cmliM2Z2KGRiLAprYik7YnJlYWs7Y2FzZSA0OlRhLnZlcnRleEF0dHJpYjRmdihkYixrYik7YnJlYWs7ZGVmYXVsdDpUYS52ZXJ0ZXhBdHRyaWIxZnYoZGIsa2IpfX19RWIuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKX19ZnVuY3Rpb24gUyhWLGVhLG5hLEphKXtpZighMSE9PVYudmlzaWJsZSl7aWYoVi5sYXllcnMudGVzdChlYS5sYXllcnMpKWlmKFYuaXNHcm91cCluYT1WLnJlbmRlck9yZGVyO2Vsc2UgaWYoVi5pc0xPRCkhMD09PVYuYXV0b1VwZGF0ZSYmVi51cGRhdGUoZWEpO2Vsc2UgaWYoVi5pc0xpZ2h0KWZiLnB1c2hMaWdodChWKSxWLmNhc3RTaGFkb3cmJmZiLnB1c2hTaGFkb3coVik7ZWxzZSBpZihWLmlzU3ByaXRlKXtpZighVi5mcnVzdHVtQ3VsbGVkfHx0ay5pbnRlcnNlY3RzU3ByaXRlKFYpKXtKYSYmcWUuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKFYubWF0cml4V29ybGQpLmFwcGx5TWF0cml4NChhaCk7dmFyIFFhPUlmLnVwZGF0ZShWKSxkYj1WLm1hdGVyaWFsO2RiLnZpc2libGUmJlBhLnB1c2goViwKUWEsZGIsbmEscWUueixudWxsKX19ZWxzZSBpZihWLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0KUphJiZxZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oVi5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KGFoKSxQYS5wdXNoKFYsbnVsbCxWLm1hdGVyaWFsLG5hLHFlLnosbnVsbCk7ZWxzZSBpZihWLmlzTWVzaHx8Vi5pc0xpbmV8fFYuaXNQb2ludHMpaWYoVi5pc1NraW5uZWRNZXNoJiZWLnNrZWxldG9uLnVwZGF0ZSgpLCFWLmZydXN0dW1DdWxsZWR8fHRrLmludGVyc2VjdHNPYmplY3QoVikpaWYoSmEmJnFlLnNldEZyb21NYXRyaXhQb3NpdGlvbihWLm1hdHJpeFdvcmxkKS5hcHBseU1hdHJpeDQoYWgpLFFhPUlmLnVwZGF0ZShWKSxkYj1WLm1hdGVyaWFsLEFycmF5LmlzQXJyYXkoZGIpKWZvcih2YXIgUmE9UWEuZ3JvdXBzLGtiPTAsSmI9UmEubGVuZ3RoO2tiPEpiO2tiKyspe3ZhciBzYj1SYVtrYl0sYmI9ZGJbc2IubWF0ZXJpYWxJbmRleF07YmImJmJiLnZpc2libGUmJlBhLnB1c2goViwKUWEsYmIsbmEscWUueixzYil9ZWxzZSBkYi52aXNpYmxlJiZQYS5wdXNoKFYsUWEsZGIsbmEscWUueixudWxsKTtWPVYuY2hpbGRyZW47a2I9MDtmb3IoSmI9Vi5sZW5ndGg7a2I8SmI7a2IrKylTKFZba2JdLGVhLG5hLEphKX19ZnVuY3Rpb24gVChWLGVhLG5hLEphKXtmb3IodmFyIFFhPTAsZGI9Vi5sZW5ndGg7UWE8ZGI7UWErKyl7dmFyIFJhPVZbUWFdLGtiPVJhLm9iamVjdCxKYj1SYS5nZW9tZXRyeSxzYj12b2lkIDA9PT1KYT9SYS5tYXRlcmlhbDpKYTtSYT1SYS5ncm91cDtpZihuYS5pc0FycmF5Q2FtZXJhKXt4Yj1uYTtmb3IodmFyIGJiPW5hLmNhbWVyYXMseGQ9MCwkYz1iYi5sZW5ndGg7eGQ8JGM7eGQrKyl7dmFyIEtmPWJiW3hkXTtrYi5sYXllcnMudGVzdChLZi5sYXllcnMpJiYoRWIudmlld3BvcnQoV2IuY29weShLZi52aWV3cG9ydCkpLGZiLnNldHVwTGlnaHRzKEtmKSxXKGtiLGVhLEtmLEpiLHNiLFJhKSl9fWVsc2UgeGI9bnVsbCxXKGtiLGVhLG5hLEpiLHNiLFJhKX19CmZ1bmN0aW9uIFcoVixlYSxuYSxKYSxRYSxkYil7Vi5vbkJlZm9yZVJlbmRlcihrYSxlYSxuYSxKYSxRYSxkYik7ZmI9SmYuZ2V0KGVhLHhifHxuYSk7Vi5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyhuYS5tYXRyaXhXb3JsZEludmVyc2UsVi5tYXRyaXhXb3JsZCk7Vi5ub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KFYubW9kZWxWaWV3TWF0cml4KTtWLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0PyhFYi5zZXRNYXRlcmlhbChRYSksSmE9aWEobmEsZWEuZm9nLFFhLFYpLGpiPWU9bnVsbCxxYj0hMSxKKFYsSmEpKTprYS5yZW5kZXJCdWZmZXJEaXJlY3QobmEsZWEuZm9nLEphLFFhLFYsZGIpO2ZiPUpmLmdldChlYSx4Ynx8bmEpfWZ1bmN0aW9uIFgoVixlYSxuYSl7dmFyIEphPUFjLmdldChWKSxRYT1mYi5zdGF0ZS5saWdodHMsZGI9UWEuc3RhdGUudmVyc2lvbjtuYT1OZS5nZXRQYXJhbWV0ZXJzKFYsUWEuc3RhdGUsZmIuc3RhdGUuc2hhZG93c0FycmF5LGVhLGFkLm51bVBsYW5lcywKYWQubnVtSW50ZXJzZWN0aW9uLG5hKTt2YXIgUmE9TmUuZ2V0UHJvZ3JhbUNvZGUoVixuYSksa2I9SmEucHJvZ3JhbSxKYj0hMDtpZih2b2lkIDA9PT1rYilWLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLEEpO2Vsc2UgaWYoa2IuY29kZSE9PVJhKUcoVik7ZWxzZXtpZihKYS5saWdodHNTdGF0ZVZlcnNpb24hPT1kYilKYS5saWdodHNTdGF0ZVZlcnNpb249ZGI7ZWxzZSBpZih2b2lkIDAhPT1uYS5zaGFkZXJJRClyZXR1cm47SmI9ITF9SmImJihuYS5zaGFkZXJJRD8oUmE9dWRbbmEuc2hhZGVySURdLEphLnNoYWRlcj17bmFtZTpWLnR5cGUsdW5pZm9ybXM6emIoUmEudW5pZm9ybXMpLHZlcnRleFNoYWRlcjpSYS52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6UmEuZnJhZ21lbnRTaGFkZXJ9KTpKYS5zaGFkZXI9e25hbWU6Vi50eXBlLHVuaWZvcm1zOlYudW5pZm9ybXMsdmVydGV4U2hhZGVyOlYudmVydGV4U2hhZGVyLGZyYWdtZW50U2hhZGVyOlYuZnJhZ21lbnRTaGFkZXJ9LApSYT1OZS5nZXRQcm9ncmFtQ29kZShWLG5hKSxrYj1OZS5hY3F1aXJlUHJvZ3JhbShWLEphLnNoYWRlcixuYSxSYSksSmEucHJvZ3JhbT1rYixWLnByb2dyYW09a2IpO25hPWtiLmdldEF0dHJpYnV0ZXMoKTtpZihWLm1vcnBoVGFyZ2V0cylmb3IoUmE9Vi5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHM9MDtSYTxrYS5tYXhNb3JwaFRhcmdldHM7UmErKykwPD1uYVsibW9ycGhUYXJnZXQiK1JhXSYmVi5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHMrKztpZihWLm1vcnBoTm9ybWFscylmb3IoUmE9Vi5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHM9MDtSYTxrYS5tYXhNb3JwaE5vcm1hbHM7UmErKykwPD1uYVsibW9ycGhOb3JtYWwiK1JhXSYmVi5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHMrKztuYT1KYS5zaGFkZXIudW5pZm9ybXM7aWYoIVYuaXNTaGFkZXJNYXRlcmlhbCYmIVYuaXNSYXdTaGFkZXJNYXRlcmlhbHx8ITA9PT1WLmNsaXBwaW5nKUphLm51bUNsaXBwaW5nUGxhbmVzPWFkLm51bVBsYW5lcywKSmEubnVtSW50ZXJzZWN0aW9uPWFkLm51bUludGVyc2VjdGlvbixuYS5jbGlwcGluZ1BsYW5lcz1hZC51bmlmb3JtO0phLmZvZz1lYTtKYS5saWdodHNTdGF0ZVZlcnNpb249ZGI7Vi5saWdodHMmJihuYS5hbWJpZW50TGlnaHRDb2xvci52YWx1ZT1RYS5zdGF0ZS5hbWJpZW50LG5hLmxpZ2h0UHJvYmUudmFsdWU9UWEuc3RhdGUucHJvYmUsbmEuZGlyZWN0aW9uYWxMaWdodHMudmFsdWU9UWEuc3RhdGUuZGlyZWN0aW9uYWwsbmEuc3BvdExpZ2h0cy52YWx1ZT1RYS5zdGF0ZS5zcG90LG5hLnJlY3RBcmVhTGlnaHRzLnZhbHVlPVFhLnN0YXRlLnJlY3RBcmVhLG5hLnBvaW50TGlnaHRzLnZhbHVlPVFhLnN0YXRlLnBvaW50LG5hLmhlbWlzcGhlcmVMaWdodHMudmFsdWU9UWEuc3RhdGUuaGVtaSxuYS5kaXJlY3Rpb25hbFNoYWRvd01hcC52YWx1ZT1RYS5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcCxuYS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC52YWx1ZT1RYS5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeCwKbmEuc3BvdFNoYWRvd01hcC52YWx1ZT1RYS5zdGF0ZS5zcG90U2hhZG93TWFwLG5hLnNwb3RTaGFkb3dNYXRyaXgudmFsdWU9UWEuc3RhdGUuc3BvdFNoYWRvd01hdHJpeCxuYS5wb2ludFNoYWRvd01hcC52YWx1ZT1RYS5zdGF0ZS5wb2ludFNoYWRvd01hcCxuYS5wb2ludFNoYWRvd01hdHJpeC52YWx1ZT1RYS5zdGF0ZS5wb2ludFNoYWRvd01hdHJpeCk7Vj1KYS5wcm9ncmFtLmdldFVuaWZvcm1zKCk7Vj1sZS5zZXFXaXRoVmFsdWUoVi5zZXEsbmEpO0phLnVuaWZvcm1zTGlzdD1WfWZ1bmN0aW9uIGlhKFYsZWEsbmEsSmEpe3dkLnJlc2V0VGV4dHVyZVVuaXRzKCk7dmFyIFFhPUFjLmdldChuYSksZGI9ZmIuc3RhdGUubGlnaHRzO3VpJiYodWt8fFYhPT10YikmJmFkLnNldFN0YXRlKG5hLmNsaXBwaW5nUGxhbmVzLG5hLmNsaXBJbnRlcnNlY3Rpb24sbmEuY2xpcFNoYWRvd3MsVixRYSxWPT09dGImJm5hLmlkPT09U2EpOyExPT09bmEubmVlZHNVcGRhdGUmJih2b2lkIDA9PT1RYS5wcm9ncmFtPwpuYS5uZWVkc1VwZGF0ZT0hMDpuYS5mb2cmJlFhLmZvZyE9PWVhP25hLm5lZWRzVXBkYXRlPSEwOm5hLmxpZ2h0cyYmUWEubGlnaHRzU3RhdGVWZXJzaW9uIT09ZGIuc3RhdGUudmVyc2lvbj9uYS5uZWVkc1VwZGF0ZT0hMDp2b2lkIDA9PT1RYS5udW1DbGlwcGluZ1BsYW5lc3x8UWEubnVtQ2xpcHBpbmdQbGFuZXM9PT1hZC5udW1QbGFuZXMmJlFhLm51bUludGVyc2VjdGlvbj09PWFkLm51bUludGVyc2VjdGlvbnx8KG5hLm5lZWRzVXBkYXRlPSEwKSk7bmEubmVlZHNVcGRhdGUmJihYKG5hLGVhLEphKSxuYS5uZWVkc1VwZGF0ZT0hMSk7dmFyIFJhPSExLGtiPWRiPSExLEpiPVFhLnByb2dyYW0sc2I9SmIuZ2V0VW5pZm9ybXMoKSxiYj1RYS5zaGFkZXIudW5pZm9ybXM7RWIudXNlUHJvZ3JhbShKYi5wcm9ncmFtKSYmKGtiPWRiPVJhPSEwKTtuYS5pZCE9PVNhJiYoU2E9bmEuaWQsZGI9ITApO2lmKFJhfHx0YiE9PVYpe3NiLnNldFZhbHVlKFRhLCJwcm9qZWN0aW9uTWF0cml4IixWLnByb2plY3Rpb25NYXRyaXgpOwp6Yy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyJiZzYi5zZXRWYWx1ZShUYSwibG9nRGVwdGhCdWZGQyIsMi8oTWF0aC5sb2coVi5mYXIrMSkvTWF0aC5MTjIpKTt0YiE9PVYmJih0Yj1WLGtiPWRiPSEwKTtpZihuYS5pc1NoYWRlck1hdGVyaWFsfHxuYS5pc01lc2hQaG9uZ01hdGVyaWFsfHxuYS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsfHxuYS5lbnZNYXApUmE9c2IubWFwLmNhbWVyYVBvc2l0aW9uLHZvaWQgMCE9PVJhJiZSYS5zZXRWYWx1ZShUYSxxZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oVi5tYXRyaXhXb3JsZCkpOyhuYS5pc01lc2hQaG9uZ01hdGVyaWFsfHxuYS5pc01lc2hMYW1iZXJ0TWF0ZXJpYWx8fG5hLmlzTWVzaEJhc2ljTWF0ZXJpYWx8fG5hLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWx8fG5hLmlzU2hhZGVyTWF0ZXJpYWx8fG5hLnNraW5uaW5nKSYmc2Iuc2V0VmFsdWUoVGEsInZpZXdNYXRyaXgiLFYubWF0cml4V29ybGRJbnZlcnNlKX1pZihuYS5za2lubmluZyYmKHNiLnNldE9wdGlvbmFsKFRhLApKYSwiYmluZE1hdHJpeCIpLHNiLnNldE9wdGlvbmFsKFRhLEphLCJiaW5kTWF0cml4SW52ZXJzZSIpLFY9SmEuc2tlbGV0b24pKWlmKFJhPVYuYm9uZXMsemMuZmxvYXRWZXJ0ZXhUZXh0dXJlcyl7aWYodm9pZCAwPT09Vi5ib25lVGV4dHVyZSl7UmE9TWF0aC5zcXJ0KDQqUmEubGVuZ3RoKTtSYT1sYi5jZWlsUG93ZXJPZlR3byhSYSk7UmE9TWF0aC5tYXgoUmEsNCk7dmFyIHhkPW5ldyBGbG9hdDMyQXJyYXkoUmEqUmEqNCk7eGQuc2V0KFYuYm9uZU1hdHJpY2VzKTt2YXIgJGM9bmV3IEdiKHhkLFJhLFJhLDEwMjMsMTAxNSk7JGMubmVlZHNVcGRhdGU9ITA7Vi5ib25lTWF0cmljZXM9eGQ7Vi5ib25lVGV4dHVyZT0kYztWLmJvbmVUZXh0dXJlU2l6ZT1SYX1zYi5zZXRWYWx1ZShUYSwiYm9uZVRleHR1cmUiLFYuYm9uZVRleHR1cmUsd2QpO3NiLnNldFZhbHVlKFRhLCJib25lVGV4dHVyZVNpemUiLFYuYm9uZVRleHR1cmVTaXplKX1lbHNlIHNiLnNldE9wdGlvbmFsKFRhLFYsImJvbmVNYXRyaWNlcyIpOwpkYiYmKHNiLnNldFZhbHVlKFRhLCJ0b25lTWFwcGluZ0V4cG9zdXJlIixrYS50b25lTWFwcGluZ0V4cG9zdXJlKSxzYi5zZXRWYWx1ZShUYSwidG9uZU1hcHBpbmdXaGl0ZVBvaW50IixrYS50b25lTWFwcGluZ1doaXRlUG9pbnQpLG5hLmxpZ2h0cyYmeWIoYmIsa2IpLGVhJiZuYS5mb2cmJnBhKGJiLGVhKSxuYS5pc01lc2hCYXNpY01hdGVyaWFsP2hhKGJiLG5hKTpuYS5pc01lc2hMYW1iZXJ0TWF0ZXJpYWw/KGhhKGJiLG5hKSx2YShiYixuYSkpOm5hLmlzTWVzaFBob25nTWF0ZXJpYWw/KGhhKGJiLG5hKSxuYS5pc01lc2hUb29uTWF0ZXJpYWw/VmEoYmIsbmEpOkNhKGJiLG5hKSk6bmEuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD8oaGEoYmIsbmEpLG5hLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWw/RGEoYmIsbmEpOldhKGJiLG5hKSk6bmEuaXNNZXNoTWF0Y2FwTWF0ZXJpYWw/KGhhKGJiLG5hKSxJYShiYixuYSkpOm5hLmlzTWVzaERlcHRoTWF0ZXJpYWw/KGhhKGJiLG5hKSxFYShiYiwKbmEpKTpuYS5pc01lc2hEaXN0YW5jZU1hdGVyaWFsPyhoYShiYixuYSksT2EoYmIsbmEpKTpuYS5pc01lc2hOb3JtYWxNYXRlcmlhbD8oaGEoYmIsbmEpLGhiKGJiLG5hKSk6bmEuaXNMaW5lQmFzaWNNYXRlcmlhbD8oc2EoYmIsbmEpLG5hLmlzTGluZURhc2hlZE1hdGVyaWFsJiZxYShiYixuYSkpOm5hLmlzUG9pbnRzTWF0ZXJpYWw/cmEoYmIsbmEpOm5hLmlzU3ByaXRlTWF0ZXJpYWw/d2EoYmIsbmEpOm5hLmlzU2hhZG93TWF0ZXJpYWwmJihiYi5jb2xvci52YWx1ZS5jb3B5KG5hLmNvbG9yKSxiYi5vcGFjaXR5LnZhbHVlPW5hLm9wYWNpdHkpLHZvaWQgMCE9PWJiLmx0Y18xJiYoYmIubHRjXzEudmFsdWU9WWEuTFRDXzEpLHZvaWQgMCE9PWJiLmx0Y18yJiYoYmIubHRjXzIudmFsdWU9WWEuTFRDXzIpLGxlLnVwbG9hZChUYSxRYS51bmlmb3Jtc0xpc3QsYmIsd2QpKTtuYS5pc1NoYWRlck1hdGVyaWFsJiYhMD09PW5hLnVuaWZvcm1zTmVlZFVwZGF0ZSYmKGxlLnVwbG9hZChUYSxRYS51bmlmb3Jtc0xpc3QsCmJiLHdkKSxuYS51bmlmb3Jtc05lZWRVcGRhdGU9ITEpO25hLmlzU3ByaXRlTWF0ZXJpYWwmJnNiLnNldFZhbHVlKFRhLCJjZW50ZXIiLEphLmNlbnRlcik7c2Iuc2V0VmFsdWUoVGEsIm1vZGVsVmlld01hdHJpeCIsSmEubW9kZWxWaWV3TWF0cml4KTtzYi5zZXRWYWx1ZShUYSwibm9ybWFsTWF0cml4IixKYS5ub3JtYWxNYXRyaXgpO3NiLnNldFZhbHVlKFRhLCJtb2RlbE1hdHJpeCIsSmEubWF0cml4V29ybGQpO3JldHVybiBKYn1mdW5jdGlvbiBoYShWLGVhKXtWLm9wYWNpdHkudmFsdWU9ZWEub3BhY2l0eTtlYS5jb2xvciYmVi5kaWZmdXNlLnZhbHVlLmNvcHkoZWEuY29sb3IpO2VhLmVtaXNzaXZlJiZWLmVtaXNzaXZlLnZhbHVlLmNvcHkoZWEuZW1pc3NpdmUpLm11bHRpcGx5U2NhbGFyKGVhLmVtaXNzaXZlSW50ZW5zaXR5KTtlYS5tYXAmJihWLm1hcC52YWx1ZT1lYS5tYXApO2VhLmFscGhhTWFwJiYoVi5hbHBoYU1hcC52YWx1ZT1lYS5hbHBoYU1hcCk7ZWEuc3BlY3VsYXJNYXAmJgooVi5zcGVjdWxhck1hcC52YWx1ZT1lYS5zcGVjdWxhck1hcCk7ZWEuZW52TWFwJiYoVi5lbnZNYXAudmFsdWU9ZWEuZW52TWFwLFYuZmxpcEVudk1hcC52YWx1ZT1lYS5lbnZNYXAuaXNDdWJlVGV4dHVyZT8tMToxLFYucmVmbGVjdGl2aXR5LnZhbHVlPWVhLnJlZmxlY3Rpdml0eSxWLnJlZnJhY3Rpb25SYXRpby52YWx1ZT1lYS5yZWZyYWN0aW9uUmF0aW8sVi5tYXhNaXBMZXZlbC52YWx1ZT1BYy5nZXQoZWEuZW52TWFwKS5fX21heE1pcExldmVsKTtlYS5saWdodE1hcCYmKFYubGlnaHRNYXAudmFsdWU9ZWEubGlnaHRNYXAsVi5saWdodE1hcEludGVuc2l0eS52YWx1ZT1lYS5saWdodE1hcEludGVuc2l0eSk7ZWEuYW9NYXAmJihWLmFvTWFwLnZhbHVlPWVhLmFvTWFwLFYuYW9NYXBJbnRlbnNpdHkudmFsdWU9ZWEuYW9NYXBJbnRlbnNpdHkpO2lmKGVhLm1hcCl2YXIgbmE9ZWEubWFwO2Vsc2UgZWEuc3BlY3VsYXJNYXA/bmE9ZWEuc3BlY3VsYXJNYXA6ZWEuZGlzcGxhY2VtZW50TWFwPwpuYT1lYS5kaXNwbGFjZW1lbnRNYXA6ZWEubm9ybWFsTWFwP25hPWVhLm5vcm1hbE1hcDplYS5idW1wTWFwP25hPWVhLmJ1bXBNYXA6ZWEucm91Z2huZXNzTWFwP25hPWVhLnJvdWdobmVzc01hcDplYS5tZXRhbG5lc3NNYXA/bmE9ZWEubWV0YWxuZXNzTWFwOmVhLmFscGhhTWFwP25hPWVhLmFscGhhTWFwOmVhLmVtaXNzaXZlTWFwJiYobmE9ZWEuZW1pc3NpdmVNYXApO3ZvaWQgMCE9PW5hJiYobmEuaXNXZWJHTFJlbmRlclRhcmdldCYmKG5hPW5hLnRleHR1cmUpLCEwPT09bmEubWF0cml4QXV0b1VwZGF0ZSYmbmEudXBkYXRlTWF0cml4KCksVi51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KG5hLm1hdHJpeCkpfWZ1bmN0aW9uIHNhKFYsZWEpe1YuZGlmZnVzZS52YWx1ZS5jb3B5KGVhLmNvbG9yKTtWLm9wYWNpdHkudmFsdWU9ZWEub3BhY2l0eX1mdW5jdGlvbiBxYShWLGVhKXtWLmRhc2hTaXplLnZhbHVlPWVhLmRhc2hTaXplO1YudG90YWxTaXplLnZhbHVlPWVhLmRhc2hTaXplK2VhLmdhcFNpemU7ClYuc2NhbGUudmFsdWU9ZWEuc2NhbGV9ZnVuY3Rpb24gcmEoVixlYSl7Vi5kaWZmdXNlLnZhbHVlLmNvcHkoZWEuY29sb3IpO1Yub3BhY2l0eS52YWx1ZT1lYS5vcGFjaXR5O1Yuc2l6ZS52YWx1ZT1lYS5zaXplKnljO1Yuc2NhbGUudmFsdWU9LjUqYmQ7Vi5tYXAudmFsdWU9ZWEubWFwO251bGwhPT1lYS5tYXAmJighMD09PWVhLm1hcC5tYXRyaXhBdXRvVXBkYXRlJiZlYS5tYXAudXBkYXRlTWF0cml4KCksVi51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KGVhLm1hcC5tYXRyaXgpKX1mdW5jdGlvbiB3YShWLGVhKXtWLmRpZmZ1c2UudmFsdWUuY29weShlYS5jb2xvcik7Vi5vcGFjaXR5LnZhbHVlPWVhLm9wYWNpdHk7Vi5yb3RhdGlvbi52YWx1ZT1lYS5yb3RhdGlvbjtWLm1hcC52YWx1ZT1lYS5tYXA7bnVsbCE9PWVhLm1hcCYmKCEwPT09ZWEubWFwLm1hdHJpeEF1dG9VcGRhdGUmJmVhLm1hcC51cGRhdGVNYXRyaXgoKSxWLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoZWEubWFwLm1hdHJpeCkpfQpmdW5jdGlvbiBwYShWLGVhKXtWLmZvZ0NvbG9yLnZhbHVlLmNvcHkoZWEuY29sb3IpO2VhLmlzRm9nPyhWLmZvZ05lYXIudmFsdWU9ZWEubmVhcixWLmZvZ0Zhci52YWx1ZT1lYS5mYXIpOmVhLmlzRm9nRXhwMiYmKFYuZm9nRGVuc2l0eS52YWx1ZT1lYS5kZW5zaXR5KX1mdW5jdGlvbiB2YShWLGVhKXtlYS5lbWlzc2l2ZU1hcCYmKFYuZW1pc3NpdmVNYXAudmFsdWU9ZWEuZW1pc3NpdmVNYXApfWZ1bmN0aW9uIENhKFYsZWEpe1Yuc3BlY3VsYXIudmFsdWUuY29weShlYS5zcGVjdWxhcik7Vi5zaGluaW5lc3MudmFsdWU9TWF0aC5tYXgoZWEuc2hpbmluZXNzLDFFLTQpO2VhLmVtaXNzaXZlTWFwJiYoVi5lbWlzc2l2ZU1hcC52YWx1ZT1lYS5lbWlzc2l2ZU1hcCk7ZWEuYnVtcE1hcCYmKFYuYnVtcE1hcC52YWx1ZT1lYS5idW1wTWFwLFYuYnVtcFNjYWxlLnZhbHVlPWVhLmJ1bXBTY2FsZSwxPT09ZWEuc2lkZSYmKFYuYnVtcFNjYWxlLnZhbHVlKj0tMSkpO2VhLm5vcm1hbE1hcCYmKFYubm9ybWFsTWFwLnZhbHVlPQplYS5ub3JtYWxNYXAsVi5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KGVhLm5vcm1hbFNjYWxlKSwxPT09ZWEuc2lkZSYmVi5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKSk7ZWEuZGlzcGxhY2VtZW50TWFwJiYoVi5kaXNwbGFjZW1lbnRNYXAudmFsdWU9ZWEuZGlzcGxhY2VtZW50TWFwLFYuZGlzcGxhY2VtZW50U2NhbGUudmFsdWU9ZWEuZGlzcGxhY2VtZW50U2NhbGUsVi5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPWVhLmRpc3BsYWNlbWVudEJpYXMpfWZ1bmN0aW9uIFZhKFYsZWEpe0NhKFYsZWEpO2VhLmdyYWRpZW50TWFwJiYoVi5ncmFkaWVudE1hcC52YWx1ZT1lYS5ncmFkaWVudE1hcCl9ZnVuY3Rpb24gV2EoVixlYSl7Vi5yb3VnaG5lc3MudmFsdWU9ZWEucm91Z2huZXNzO1YubWV0YWxuZXNzLnZhbHVlPWVhLm1ldGFsbmVzcztlYS5yb3VnaG5lc3NNYXAmJihWLnJvdWdobmVzc01hcC52YWx1ZT1lYS5yb3VnaG5lc3NNYXApO2VhLm1ldGFsbmVzc01hcCYmKFYubWV0YWxuZXNzTWFwLnZhbHVlPQplYS5tZXRhbG5lc3NNYXApO2VhLmVtaXNzaXZlTWFwJiYoVi5lbWlzc2l2ZU1hcC52YWx1ZT1lYS5lbWlzc2l2ZU1hcCk7ZWEuYnVtcE1hcCYmKFYuYnVtcE1hcC52YWx1ZT1lYS5idW1wTWFwLFYuYnVtcFNjYWxlLnZhbHVlPWVhLmJ1bXBTY2FsZSwxPT09ZWEuc2lkZSYmKFYuYnVtcFNjYWxlLnZhbHVlKj0tMSkpO2VhLm5vcm1hbE1hcCYmKFYubm9ybWFsTWFwLnZhbHVlPWVhLm5vcm1hbE1hcCxWLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoZWEubm9ybWFsU2NhbGUpLDE9PT1lYS5zaWRlJiZWLm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKTtlYS5kaXNwbGFjZW1lbnRNYXAmJihWLmRpc3BsYWNlbWVudE1hcC52YWx1ZT1lYS5kaXNwbGFjZW1lbnRNYXAsVi5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1lYS5kaXNwbGFjZW1lbnRTY2FsZSxWLmRpc3BsYWNlbWVudEJpYXMudmFsdWU9ZWEuZGlzcGxhY2VtZW50Qmlhcyk7ZWEuZW52TWFwJiYoVi5lbnZNYXBJbnRlbnNpdHkudmFsdWU9CmVhLmVudk1hcEludGVuc2l0eSl9ZnVuY3Rpb24gRGEoVixlYSl7V2EoVixlYSk7Vi5yZWZsZWN0aXZpdHkudmFsdWU9ZWEucmVmbGVjdGl2aXR5O1YuY2xlYXJjb2F0LnZhbHVlPWVhLmNsZWFyY29hdDtWLmNsZWFyY29hdFJvdWdobmVzcy52YWx1ZT1lYS5jbGVhcmNvYXRSb3VnaG5lc3M7ZWEuc2hlZW4mJlYuc2hlZW4udmFsdWUuY29weShlYS5zaGVlbik7ZWEuY2xlYXJjb2F0Tm9ybWFsTWFwJiYoVi5jbGVhcmNvYXROb3JtYWxTY2FsZS52YWx1ZS5jb3B5KGVhLmNsZWFyY29hdE5vcm1hbFNjYWxlKSxWLmNsZWFyY29hdE5vcm1hbE1hcC52YWx1ZT1lYS5jbGVhcmNvYXROb3JtYWxNYXAsMT09PWVhLnNpZGUmJlYuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO1YudHJhbnNwYXJlbmN5LnZhbHVlPWVhLnRyYW5zcGFyZW5jeX1mdW5jdGlvbiBJYShWLGVhKXtlYS5tYXRjYXAmJihWLm1hdGNhcC52YWx1ZT1lYS5tYXRjYXApO2VhLmJ1bXBNYXAmJihWLmJ1bXBNYXAudmFsdWU9CmVhLmJ1bXBNYXAsVi5idW1wU2NhbGUudmFsdWU9ZWEuYnVtcFNjYWxlLDE9PT1lYS5zaWRlJiYoVi5idW1wU2NhbGUudmFsdWUqPS0xKSk7ZWEubm9ybWFsTWFwJiYoVi5ub3JtYWxNYXAudmFsdWU9ZWEubm9ybWFsTWFwLFYubm9ybWFsU2NhbGUudmFsdWUuY29weShlYS5ub3JtYWxTY2FsZSksMT09PWVhLnNpZGUmJlYubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO2VhLmRpc3BsYWNlbWVudE1hcCYmKFYuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWVhLmRpc3BsYWNlbWVudE1hcCxWLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWVhLmRpc3BsYWNlbWVudFNjYWxlLFYuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1lYS5kaXNwbGFjZW1lbnRCaWFzKX1mdW5jdGlvbiBFYShWLGVhKXtlYS5kaXNwbGFjZW1lbnRNYXAmJihWLmRpc3BsYWNlbWVudE1hcC52YWx1ZT1lYS5kaXNwbGFjZW1lbnRNYXAsVi5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1lYS5kaXNwbGFjZW1lbnRTY2FsZSxWLmRpc3BsYWNlbWVudEJpYXMudmFsdWU9CmVhLmRpc3BsYWNlbWVudEJpYXMpfWZ1bmN0aW9uIE9hKFYsZWEpe2VhLmRpc3BsYWNlbWVudE1hcCYmKFYuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWVhLmRpc3BsYWNlbWVudE1hcCxWLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWVhLmRpc3BsYWNlbWVudFNjYWxlLFYuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1lYS5kaXNwbGFjZW1lbnRCaWFzKTtWLnJlZmVyZW5jZVBvc2l0aW9uLnZhbHVlLmNvcHkoZWEucmVmZXJlbmNlUG9zaXRpb24pO1YubmVhckRpc3RhbmNlLnZhbHVlPWVhLm5lYXJEaXN0YW5jZTtWLmZhckRpc3RhbmNlLnZhbHVlPWVhLmZhckRpc3RhbmNlfWZ1bmN0aW9uIGhiKFYsZWEpe2VhLmJ1bXBNYXAmJihWLmJ1bXBNYXAudmFsdWU9ZWEuYnVtcE1hcCxWLmJ1bXBTY2FsZS52YWx1ZT1lYS5idW1wU2NhbGUsMT09PWVhLnNpZGUmJihWLmJ1bXBTY2FsZS52YWx1ZSo9LTEpKTtlYS5ub3JtYWxNYXAmJihWLm5vcm1hbE1hcC52YWx1ZT1lYS5ub3JtYWxNYXAsVi5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KGVhLm5vcm1hbFNjYWxlKSwKMT09PWVhLnNpZGUmJlYubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO2VhLmRpc3BsYWNlbWVudE1hcCYmKFYuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWVhLmRpc3BsYWNlbWVudE1hcCxWLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWVhLmRpc3BsYWNlbWVudFNjYWxlLFYuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1lYS5kaXNwbGFjZW1lbnRCaWFzKX1mdW5jdGlvbiB5YihWLGVhKXtWLmFtYmllbnRMaWdodENvbG9yLm5lZWRzVXBkYXRlPWVhO1YubGlnaHRQcm9iZS5uZWVkc1VwZGF0ZT1lYTtWLmRpcmVjdGlvbmFsTGlnaHRzLm5lZWRzVXBkYXRlPWVhO1YucG9pbnRMaWdodHMubmVlZHNVcGRhdGU9ZWE7Vi5zcG90TGlnaHRzLm5lZWRzVXBkYXRlPWVhO1YucmVjdEFyZWFMaWdodHMubmVlZHNVcGRhdGU9ZWE7Vi5oZW1pc3BoZXJlTGlnaHRzLm5lZWRzVXBkYXRlPWVhfWI9Ynx8e307dmFyIExhPXZvaWQgMCE9PWIuY2FudmFzP2IuY2FudmFzOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsCiJjYW52YXMiKSxlYj12b2lkIDAhPT1iLmNvbnRleHQ/Yi5jb250ZXh0Om51bGwsbmI9dm9pZCAwIT09Yi5hbHBoYT9iLmFscGhhOiExLE5iPXZvaWQgMCE9PWIuZGVwdGg/Yi5kZXB0aDohMCxEYj12b2lkIDAhPT1iLnN0ZW5jaWw/Yi5zdGVuY2lsOiEwLGphPXZvaWQgMCE9PWIuYW50aWFsaWFzP2IuYW50aWFsaWFzOiExLG9hPXZvaWQgMCE9PWIucHJlbXVsdGlwbGllZEFscGhhP2IucHJlbXVsdGlwbGllZEFscGhhOiEwLEFhPXZvaWQgMCE9PWIucHJlc2VydmVEcmF3aW5nQnVmZmVyP2IucHJlc2VydmVEcmF3aW5nQnVmZmVyOiExLEthPXZvaWQgMCE9PWIucG93ZXJQcmVmZXJlbmNlP2IucG93ZXJQcmVmZXJlbmNlOiJkZWZhdWx0IiwkYT12b2lkIDAhPT1iLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ/Yi5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiExLFBhPW51bGwsZmI9bnVsbDt0aGlzLmRvbUVsZW1lbnQ9TGE7dGhpcy5kZWJ1Zz17Y2hlY2tTaGFkZXJFcnJvcnM6ITB9Owp0aGlzLnNvcnRPYmplY3RzPXRoaXMuYXV0b0NsZWFyU3RlbmNpbD10aGlzLmF1dG9DbGVhckRlcHRoPXRoaXMuYXV0b0NsZWFyQ29sb3I9dGhpcy5hdXRvQ2xlYXI9ITA7dGhpcy5jbGlwcGluZ1BsYW5lcz1bXTt0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkPSExO3RoaXMuZ2FtbWFGYWN0b3I9Mjt0aGlzLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzPXRoaXMuZ2FtbWFPdXRwdXQ9dGhpcy5nYW1tYUlucHV0PSExO3RoaXMudG9uZU1hcHBpbmdXaGl0ZVBvaW50PXRoaXMudG9uZU1hcHBpbmdFeHBvc3VyZT10aGlzLnRvbmVNYXBwaW5nPTE7dGhpcy5tYXhNb3JwaFRhcmdldHM9ODt0aGlzLm1heE1vcnBoTm9ybWFscz00O3ZhciBrYT10aGlzLEhhPSExLE5hPW51bGwscmI9MCxYYT0wLG1iPW51bGwsb2I9bnVsbCxTYT0tMTt2YXIgamI9ZT1udWxsO3ZhciBxYj0hMTt2YXIgdGI9bnVsbCx4Yj1udWxsLFdiPW5ldyBuLGljPW5ldyBuLEpjPW51bGwseWQ9TGEud2lkdGgsYmQ9TGEuaGVpZ2h0LAp5Yz0xLEhmPW5ldyBuKDAsMCx5ZCxiZCksR2Y9bmV3IG4oMCwwLHlkLGJkKSx2az0hMSx0az1uZXcgRWMsYWQ9bmV3IFpjLHVpPSExLHVrPSExLGFoPW5ldyByLHFlPW5ldyBnO3RyeXtuYj17YWxwaGE6bmIsZGVwdGg6TmIsc3RlbmNpbDpEYixhbnRpYWxpYXM6amEscHJlbXVsdGlwbGllZEFscGhhOm9hLHByZXNlcnZlRHJhd2luZ0J1ZmZlcjpBYSxwb3dlclByZWZlcmVuY2U6S2EsZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDokYSx4ckNvbXBhdGlibGU6ITB9O0xhLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLHUsITEpO0xhLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIix3LCExKTt2YXIgVGE9ZWJ8fExhLmdldENvbnRleHQoIndlYmdsIixuYil8fExhLmdldENvbnRleHQoImV4cGVyaW1lbnRhbC13ZWJnbCIsbmIpO2lmKG51bGw9PT1UYSl7aWYobnVsbCE9PUxhLmdldENvbnRleHQoIndlYmdsIikpdGhyb3cgRXJyb3IoIkVycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQgd2l0aCB5b3VyIHNlbGVjdGVkIGF0dHJpYnV0ZXMuIik7CnRocm93IEVycm9yKCJFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0LiIpO312b2lkIDA9PT1UYS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQmJihUYS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQ9ZnVuY3Rpb24oKXtyZXR1cm57cmFuZ2VNaW46MSxyYW5nZU1heDoxLHByZWNpc2lvbjoxfX0pfWNhdGNoKFYpe3Rocm93IGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXI6ICIrVi5tZXNzYWdlKSxWO312YXIgWWIsemMsRWIsb2UsQWMsd2Qsc2ksc2ssSWYsTmUsdGksSmYscGUsS24sTG4sTW4sdmQ7bSgpO3ZhciBOZD0idW5kZWZpbmVkIiE9PXR5cGVvZiBuYXZpZ2F0b3ImJiJ4ciJpbiBuYXZpZ2F0b3ImJiJzdXBwb3J0c1Nlc3Npb24iaW4gbmF2aWdhdG9yLnhyP25ldyBKbihrYSxUYSk6bmV3IHFrKGthKTt0aGlzLnZyPU5kO3ZhciBObj1uZXcgRW4oa2EsSWYsemMubWF4VGV4dHVyZVNpemUpO3RoaXMuc2hhZG93TWFwPU5uO3RoaXMuZ2V0Q29udGV4dD1mdW5jdGlvbigpe3JldHVybiBUYX07CnRoaXMuZ2V0Q29udGV4dEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gVGEuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKX07dGhpcy5mb3JjZUNvbnRleHRMb3NzPWZ1bmN0aW9uKCl7dmFyIFY9WWIuZ2V0KCJXRUJHTF9sb3NlX2NvbnRleHQiKTtWJiZWLmxvc2VDb250ZXh0KCl9O3RoaXMuZm9yY2VDb250ZXh0UmVzdG9yZT1mdW5jdGlvbigpe3ZhciBWPVliLmdldCgiV0VCR0xfbG9zZV9jb250ZXh0Iik7ViYmVi5yZXN0b3JlQ29udGV4dCgpfTt0aGlzLmdldFBpeGVsUmF0aW89ZnVuY3Rpb24oKXtyZXR1cm4geWN9O3RoaXMuc2V0UGl4ZWxSYXRpbz1mdW5jdGlvbigpe3ZhciBWPXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO3ZvaWQgMCE9PVYmJih5Yz1WLHRoaXMuc2V0U2l6ZSh5ZCxiZCwhMSkpfTt0aGlzLmdldFNpemU9ZnVuY3Rpb24oVil7dm9pZCAwPT09ViYmKGNvbnNvbGUud2FybigiV2ViR0xSZW5kZXJlcjogLmdldHNpemUoKSBub3cgcmVxdWlyZXMgYSBWZWN0b3IyIGFzIGFuIGFyZ3VtZW50IiksClY9bmV3IGQpO3JldHVybiBWLnNldCh5ZCxiZCl9O3RoaXMuc2V0U2l6ZT1mdW5jdGlvbihWLGVhLG5hKXtOZC5pc1ByZXNlbnRpbmcoKT9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IENhbid0IGNoYW5nZSBzaXplIHdoaWxlIFZSIGRldmljZSBpcyBwcmVzZW50aW5nLiIpOih5ZD1WLGJkPWVhLExhLndpZHRoPU1hdGguZmxvb3IoVip5YyksTGEuaGVpZ2h0PU1hdGguZmxvb3IoZWEqeWMpLCExIT09bmEmJihMYS5zdHlsZS53aWR0aD1WKyJweCIsTGEuc3R5bGUuaGVpZ2h0PWVhKyJweCIpLHRoaXMuc2V0Vmlld3BvcnQoVixlYSkpfTt0aGlzLmdldERyYXdpbmdCdWZmZXJTaXplPWZ1bmN0aW9uKFYpe3ZvaWQgMD09PVYmJihjb25zb2xlLndhcm4oIldlYkdMUmVuZGVyZXI6IC5nZXRkcmF3aW5nQnVmZmVyU2l6ZSgpIG5vdyByZXF1aXJlcyBhIFZlY3RvcjIgYXMgYW4gYXJndW1lbnQiKSxWPW5ldyBkKTtyZXR1cm4gVi5zZXQoeWQqeWMsYmQqeWMpLmZsb29yKCl9Owp0aGlzLnNldERyYXdpbmdCdWZmZXJTaXplPWZ1bmN0aW9uKFYsZWEsbmEpe3lkPVY7YmQ9ZWE7eWM9bmE7TGEud2lkdGg9TWF0aC5mbG9vcihWKm5hKTtMYS5oZWlnaHQ9TWF0aC5mbG9vcihlYSpuYSk7dGhpcy5zZXRWaWV3cG9ydChWLGVhKX07dGhpcy5nZXRDdXJyZW50Vmlld3BvcnQ9ZnVuY3Rpb24oVil7dm9pZCAwPT09ViYmKGNvbnNvbGUud2FybigiV2ViR0xSZW5kZXJlcjogLmdldEN1cnJlbnRWaWV3cG9ydCgpIG5vdyByZXF1aXJlcyBhIFZlY3RvcjQgYXMgYW4gYXJndW1lbnQiKSxWPW5ldyBuKTtyZXR1cm4gVi5jb3B5KFdiKX07dGhpcy5nZXRWaWV3cG9ydD1mdW5jdGlvbihWKXtyZXR1cm4gVi5jb3B5KEhmKX07dGhpcy5zZXRWaWV3cG9ydD1mdW5jdGlvbihWLGVhKXsoMCkuaXNWZWN0b3I0P0hmLnNldCgoMCkueCwoMCkueSwoMCkueiwoMCkudyk6SGYuc2V0KDAsMCxWLGVhKTtFYi52aWV3cG9ydChXYi5jb3B5KEhmKS5tdWx0aXBseVNjYWxhcih5YykuZmxvb3IoKSl9Owp0aGlzLmdldFNjaXNzb3I9ZnVuY3Rpb24oVil7cmV0dXJuIFYuY29weShHZil9O3RoaXMuc2V0U2Npc3Nvcj1mdW5jdGlvbihWLGVhLG5hLEphKXtWLmlzVmVjdG9yND9HZi5zZXQoVi54LFYueSxWLnosVi53KTpHZi5zZXQoVixlYSxuYSxKYSk7RWIuc2Npc3NvcihpYy5jb3B5KEdmKS5tdWx0aXBseVNjYWxhcih5YykuZmxvb3IoKSl9O3RoaXMuZ2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdmt9O3RoaXMuc2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24oVil7RWIuc2V0U2Npc3NvclRlc3Qodms9Vil9O3RoaXMuZ2V0Q2xlYXJDb2xvcj1mdW5jdGlvbigpe3JldHVybiBwZS5nZXRDbGVhckNvbG9yKCl9O3RoaXMuc2V0Q2xlYXJDb2xvcj1mdW5jdGlvbigpe3BlLnNldENsZWFyQ29sb3IuYXBwbHkocGUsYXJndW1lbnRzKX07dGhpcy5nZXRDbGVhckFscGhhPWZ1bmN0aW9uKCl7cmV0dXJuIHBlLmdldENsZWFyQWxwaGEoKX07dGhpcy5zZXRDbGVhckFscGhhPWZ1bmN0aW9uKCl7cGUuc2V0Q2xlYXJBbHBoYS5hcHBseShwZSwKYXJndW1lbnRzKX07dGhpcy5jbGVhcj1mdW5jdGlvbihWLGVhLG5hKXt2YXIgSmE9MDtpZih2b2lkIDA9PT1WfHxWKUphfD0xNjM4NDtpZih2b2lkIDA9PT1lYXx8ZWEpSmF8PTI1NjtpZih2b2lkIDA9PT1uYXx8bmEpSmF8PTEwMjQ7VGEuY2xlYXIoSmEpfTt0aGlzLmNsZWFyQ29sb3I9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCEwLCExLCExKX07dGhpcy5jbGVhckRlcHRoPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMSwhMCwhMSl9O3RoaXMuY2xlYXJTdGVuY2lsPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMSwhMSwhMCl9O3RoaXMuZGlzcG9zZT1mdW5jdGlvbigpe0xhLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLHUsITEpO0xhLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIix3LCExKTt0aS5kaXNwb3NlKCk7SmYuZGlzcG9zZSgpO0FjLmRpc3Bvc2UoKTtJZi5kaXNwb3NlKCk7TmQuZGlzcG9zZSgpO3ZpLnN0b3AoKX07dGhpcy5yZW5kZXJCdWZmZXJJbW1lZGlhdGU9CmZ1bmN0aW9uKFYsZWEpe0ViLmluaXRBdHRyaWJ1dGVzKCk7dmFyIG5hPUFjLmdldChWKTtWLmhhc1Bvc2l0aW9ucyYmIW5hLnBvc2l0aW9uJiYobmEucG9zaXRpb249VGEuY3JlYXRlQnVmZmVyKCkpO1YuaGFzTm9ybWFscyYmIW5hLm5vcm1hbCYmKG5hLm5vcm1hbD1UYS5jcmVhdGVCdWZmZXIoKSk7Vi5oYXNVdnMmJiFuYS51diYmKG5hLnV2PVRhLmNyZWF0ZUJ1ZmZlcigpKTtWLmhhc0NvbG9ycyYmIW5hLmNvbG9yJiYobmEuY29sb3I9VGEuY3JlYXRlQnVmZmVyKCkpO2VhPWVhLmdldEF0dHJpYnV0ZXMoKTtWLmhhc1Bvc2l0aW9ucyYmKFRhLmJpbmRCdWZmZXIoMzQ5NjIsbmEucG9zaXRpb24pLFRhLmJ1ZmZlckRhdGEoMzQ5NjIsVi5wb3NpdGlvbkFycmF5LDM1MDQ4KSxFYi5lbmFibGVBdHRyaWJ1dGUoZWEucG9zaXRpb24pLFRhLnZlcnRleEF0dHJpYlBvaW50ZXIoZWEucG9zaXRpb24sMyw1MTI2LCExLDAsMCkpO1YuaGFzTm9ybWFscyYmKFRhLmJpbmRCdWZmZXIoMzQ5NjIsbmEubm9ybWFsKSwKVGEuYnVmZmVyRGF0YSgzNDk2MixWLm5vcm1hbEFycmF5LDM1MDQ4KSxFYi5lbmFibGVBdHRyaWJ1dGUoZWEubm9ybWFsKSxUYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGVhLm5vcm1hbCwzLDUxMjYsITEsMCwwKSk7Vi5oYXNVdnMmJihUYS5iaW5kQnVmZmVyKDM0OTYyLG5hLnV2KSxUYS5idWZmZXJEYXRhKDM0OTYyLFYudXZBcnJheSwzNTA0OCksRWIuZW5hYmxlQXR0cmlidXRlKGVhLnV2KSxUYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGVhLnV2LDIsNTEyNiwhMSwwLDApKTtWLmhhc0NvbG9ycyYmKFRhLmJpbmRCdWZmZXIoMzQ5NjIsbmEuY29sb3IpLFRhLmJ1ZmZlckRhdGEoMzQ5NjIsVi5jb2xvckFycmF5LDM1MDQ4KSxFYi5lbmFibGVBdHRyaWJ1dGUoZWEuY29sb3IpLFRhLnZlcnRleEF0dHJpYlBvaW50ZXIoZWEuY29sb3IsMyw1MTI2LCExLDAsMCkpO0ViLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7VGEuZHJhd0FycmF5cyg0LDAsVi5jb3VudCk7Vi5jb3VudD0wfTt0aGlzLnJlbmRlckJ1ZmZlckRpcmVjdD0KZnVuY3Rpb24oVixlYSxuYSxKYSxRYSxkYil7RWIuc2V0TWF0ZXJpYWwoSmEsUWEuaXNNZXNoJiYwPlFhLm1hdHJpeFdvcmxkLmRldGVybWluYW50KCkpO3ZhciBSYT1pYShWLGVhLEphLFFhKSxrYj0hMTtpZihlIT09bmEuaWR8fGpiIT09UmEuaWR8fHFiIT09KCEwPT09SmEud2lyZWZyYW1lKSllPW5hLmlkLGpiPVJhLmlkLHFiPSEwPT09SmEud2lyZWZyYW1lLGtiPSEwO1FhLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyYmKEtuLnVwZGF0ZShRYSxuYSxKYSxSYSksa2I9ITApO3ZhciBKYj1uYS5pbmRleCxzYj1uYS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2VhPTE7ITA9PT1KYS53aXJlZnJhbWUmJihKYj1zay5nZXRXaXJlZnJhbWVBdHRyaWJ1dGUobmEpLGVhPTIpO1Y9TG47aWYobnVsbCE9PUpiKXt2YXIgYmI9c2kuZ2V0KEpiKTtWPU1uO1Yuc2V0SW5kZXgoYmIpfWtiJiYoUShKYSxSYSxuYSksbnVsbCE9PUpiJiZUYS5iaW5kQnVmZmVyKDM0OTYzLGJiLmJ1ZmZlcikpO2JiPUluZmluaXR5OwpudWxsIT09SmI/YmI9SmIuY291bnQ6dm9pZCAwIT09c2ImJihiYj1zYi5jb3VudCk7c2I9bmEuZHJhd1JhbmdlLnN0YXJ0KmVhO1JhPW51bGwhPT1kYj9kYi5zdGFydCplYTowO0piPU1hdGgubWF4KHNiLFJhKTtkYj1NYXRoLm1heCgwLE1hdGgubWluKGJiLHNiK25hLmRyYXdSYW5nZS5jb3VudCplYSxSYSsobnVsbCE9PWRiP2RiLmNvdW50KmVhOkluZmluaXR5KSktMS1KYisxKTtpZigwIT09ZGIpe2lmKFFhLmlzTWVzaClpZighMD09PUphLndpcmVmcmFtZSlFYi5zZXRMaW5lV2lkdGgoSmEud2lyZWZyYW1lTGluZXdpZHRoKmgoKSksVi5zZXRNb2RlKDEpO2Vsc2Ugc3dpdGNoKFFhLmRyYXdNb2RlKXtjYXNlIDA6Vi5zZXRNb2RlKDQpO2JyZWFrO2Nhc2UgMTpWLnNldE1vZGUoNSk7YnJlYWs7Y2FzZSAyOlYuc2V0TW9kZSg2KX1lbHNlIFFhLmlzTGluZT8oSmE9SmEubGluZXdpZHRoLHZvaWQgMD09PUphJiYoSmE9MSksRWIuc2V0TGluZVdpZHRoKEphKmgoKSksUWEuaXNMaW5lU2VnbWVudHM/ClYuc2V0TW9kZSgxKTpRYS5pc0xpbmVMb29wP1Yuc2V0TW9kZSgyKTpWLnNldE1vZGUoMykpOlFhLmlzUG9pbnRzP1Yuc2V0TW9kZSgwKTpRYS5pc1Nwcml0ZSYmVi5zZXRNb2RlKDQpO25hJiZuYS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5PzA8bmEubWF4SW5zdGFuY2VkQ291bnQmJlYucmVuZGVySW5zdGFuY2VzKG5hLEpiLGRiKTpWLnJlbmRlcihKYixkYil9fTt0aGlzLmNvbXBpbGU9ZnVuY3Rpb24oVixlYSl7ZmI9SmYuZ2V0KFYsZWEpO2ZiLmluaXQoKTtWLnRyYXZlcnNlKGZ1bmN0aW9uKG5hKXtuYS5pc0xpZ2h0JiYoZmIucHVzaExpZ2h0KG5hKSxuYS5jYXN0U2hhZG93JiZmYi5wdXNoU2hhZG93KG5hKSl9KTtmYi5zZXR1cExpZ2h0cyhlYSk7Vi50cmF2ZXJzZShmdW5jdGlvbihuYSl7aWYobmEubWF0ZXJpYWwpaWYoQXJyYXkuaXNBcnJheShuYS5tYXRlcmlhbCkpZm9yKHZhciBKYT0wO0phPG5hLm1hdGVyaWFsLmxlbmd0aDtKYSsrKVgobmEubWF0ZXJpYWxbSmFdLFYuZm9nLApuYSk7ZWxzZSBYKG5hLm1hdGVyaWFsLFYuZm9nLG5hKX0pfTt2YXIgd2s9bnVsbCx2aT1uZXcgeGM7dmkuc2V0QW5pbWF0aW9uTG9vcChmdW5jdGlvbihWKXtOZC5pc1ByZXNlbnRpbmcoKXx8d2smJndrKFYpfSk7InVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93JiZ2aS5zZXRDb250ZXh0KHdpbmRvdyk7dGhpcy5zZXRBbmltYXRpb25Mb29wPWZ1bmN0aW9uKFYpe3drPVY7TmQuc2V0QW5pbWF0aW9uTG9vcChWKTt2aS5zdGFydCgpfTt0aGlzLnJlbmRlcj1mdW5jdGlvbihWLGVhLG5hLEphKXtpZih2b2lkIDAhPT1uYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlbmRlcigpOiB0aGUgcmVuZGVyVGFyZ2V0IGFyZ3VtZW50IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuc2V0UmVuZGVyVGFyZ2V0KCkgaW5zdGVhZC4iKTt2YXIgUWE9bmF9aWYodm9pZCAwIT09SmEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXIoKTogdGhlIGZvcmNlQ2xlYXIgYXJndW1lbnQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5jbGVhcigpIGluc3RlYWQuIik7CnZhciBkYj1KYX1lYSYmZWEuaXNDYW1lcmE/SGF8fChqYj1lPW51bGwscWI9ITEsU2E9LTEsdGI9bnVsbCwhMD09PVYuYXV0b1VwZGF0ZSYmVi51cGRhdGVNYXRyaXhXb3JsZCgpLG51bGw9PT1lYS5wYXJlbnQmJmVhLnVwZGF0ZU1hdHJpeFdvcmxkKCksTmQuZW5hYmxlZCYmKGVhPU5kLmdldENhbWVyYShlYSkpLGZiPUpmLmdldChWLGVhKSxmYi5pbml0KCksVi5vbkJlZm9yZVJlbmRlcihrYSxWLGVhLFFhfHxtYiksYWgubXVsdGlwbHlNYXRyaWNlcyhlYS5wcm9qZWN0aW9uTWF0cml4LGVhLm1hdHJpeFdvcmxkSW52ZXJzZSksdGsuc2V0RnJvbU1hdHJpeChhaCksdWs9dGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZCx1aT1hZC5pbml0KHRoaXMuY2xpcHBpbmdQbGFuZXMsdWssZWEpLFBhPXRpLmdldChWLGVhKSxQYS5pbml0KCksUyhWLGVhLDAsa2Euc29ydE9iamVjdHMpLCEwPT09a2Euc29ydE9iamVjdHMmJlBhLnNvcnQoKSx1aSYmYWQuYmVnaW5TaGFkb3dzKCksTm4ucmVuZGVyKGZiLnN0YXRlLnNoYWRvd3NBcnJheSwKVixlYSksZmIuc2V0dXBMaWdodHMoZWEpLHVpJiZhZC5lbmRTaGFkb3dzKCksdGhpcy5pbmZvLmF1dG9SZXNldCYmdGhpcy5pbmZvLnJlc2V0KCksdm9pZCAwIT09UWEmJnRoaXMuc2V0UmVuZGVyVGFyZ2V0KFFhKSxwZS5yZW5kZXIoUGEsVixlYSxkYiksbmE9UGEub3BhcXVlLEphPVBhLnRyYW5zcGFyZW50LFYub3ZlcnJpZGVNYXRlcmlhbD8oUWE9Vi5vdmVycmlkZU1hdGVyaWFsLG5hLmxlbmd0aCYmVChuYSxWLGVhLFFhKSxKYS5sZW5ndGgmJlQoSmEsVixlYSxRYSkpOihuYS5sZW5ndGgmJlQobmEsVixlYSksSmEubGVuZ3RoJiZUKEphLFYsZWEpKSxudWxsIT09bWImJih3ZC51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAobWIpLHdkLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KG1iKSksRWIuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCEwKSxFYi5idWZmZXJzLmRlcHRoLnNldE1hc2soITApLEViLmJ1ZmZlcnMuY29sb3Iuc2V0TWFzayghMCksRWIuc2V0UG9seWdvbk9mZnNldCghMSksCk5kLmVuYWJsZWQmJk5kLnN1Ym1pdEZyYW1lKCksZmI9UGE9bnVsbCk6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXI6IGNhbWVyYSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQ2FtZXJhLiIpfTt0aGlzLnNldEZyYW1lYnVmZmVyPWZ1bmN0aW9uKFYpe05hIT09ViYmVGEuYmluZEZyYW1lYnVmZmVyKDM2MTYwLFYpO05hPVZ9O3RoaXMuZ2V0QWN0aXZlQ3ViZUZhY2U9ZnVuY3Rpb24oKXtyZXR1cm4gcmJ9O3RoaXMuZ2V0QWN0aXZlTWlwbWFwTGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gWGF9O3RoaXMuZ2V0UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG1ifTt0aGlzLnNldFJlbmRlclRhcmdldD1mdW5jdGlvbihWLGVhLG5hKXttYj1WO3JiPWVhO1hhPW5hO1YmJnZvaWQgMD09PUFjLmdldChWKS5fX3dlYmdsRnJhbWVidWZmZXImJndkLnNldHVwUmVuZGVyVGFyZ2V0KFYpO3ZhciBKYT1OYSxRYT0hMTtWPyhKYT1BYy5nZXQoVikuX193ZWJnbEZyYW1lYnVmZmVyLApWLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlPyhKYT1KYVtlYXx8MF0sUWE9ITApOkphPVYuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0P0FjLmdldChWKS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXI6SmEsV2IuY29weShWLnZpZXdwb3J0KSxpYy5jb3B5KFYuc2Npc3NvciksSmM9Vi5zY2lzc29yVGVzdCk6KFdiLmNvcHkoSGYpLm11bHRpcGx5U2NhbGFyKHljKS5mbG9vcigpLGljLmNvcHkoR2YpLm11bHRpcGx5U2NhbGFyKHljKS5mbG9vcigpLEpjPXZrKTtvYiE9PUphJiYoVGEuYmluZEZyYW1lYnVmZmVyKDM2MTYwLEphKSxvYj1KYSk7RWIudmlld3BvcnQoV2IpO0ViLnNjaXNzb3IoaWMpO0ViLnNldFNjaXNzb3JUZXN0KEpjKTtRYSYmKFY9QWMuZ2V0KFYudGV4dHVyZSksVGEuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsMzYwNjQsMzQwNjkrKGVhfHwwKSxWLl9fd2ViZ2xUZXh0dXJlLG5hfHwwKSl9O3RoaXMucmVhZFJlbmRlclRhcmdldFBpeGVscz1mdW5jdGlvbihWLAplYSxuYSxKYSxRYSxkYixSYSl7aWYoViYmVi5pc1dlYkdMUmVuZGVyVGFyZ2V0KXt2YXIga2I9QWMuZ2V0KFYpLl9fd2ViZ2xGcmFtZWJ1ZmZlcjtWLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlJiZ2b2lkIDAhPT1SYSYmKGtiPWtiW1JhXSk7aWYoa2Ipe1JhPSExO2tiIT09b2ImJihUYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsa2IpLFJhPSEwKTt0cnl7dmFyIEpiPVYudGV4dHVyZSxzYj1KYi5mb3JtYXQsYmI9SmIudHlwZTsxMDIzIT09c2ImJnZkLmNvbnZlcnQoc2IpIT09VGEuZ2V0UGFyYW1ldGVyKDM1NzM5KT9jb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZvcm1hdC4iKToxMDA5PT09YmJ8fHZkLmNvbnZlcnQoYmIpPT09VGEuZ2V0UGFyYW1ldGVyKDM1NzM4KXx8MTAxNT09PWJiJiYoemMuaXNXZWJHTDJ8fFliLmdldCgiT0VTX3RleHR1cmVfZmxvYXQiKXx8ClliLmdldCgiV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0IikpfHwxMDE2PT09YmImJih6Yy5pc1dlYkdMMj9ZYi5nZXQoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKTpZYi5nZXQoIkVYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCIpKT8zNjA1Mz09PVRhLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoMzYxNjApPzA8PWVhJiZlYTw9Vi53aWR0aC1KYSYmMDw9bmEmJm5hPD1WLmhlaWdodC1RYSYmVGEucmVhZFBpeGVscyhlYSxuYSxKYSxRYSx2ZC5jb252ZXJ0KHNiKSx2ZC5jb252ZXJ0KGJiKSxkYik6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZWFkUGl4ZWxzIGZyb20gcmVuZGVyVGFyZ2V0IGZhaWxlZC4gRnJhbWVidWZmZXIgbm90IGNvbXBsZXRlLiIpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4iKX1maW5hbGx5e1JhJiYKVGEuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG9iKX19fWVsc2UgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0LiIpfTt0aGlzLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZT1mdW5jdGlvbihWLGVhLG5hKXt2YXIgSmE9ZWEuaW1hZ2Uud2lkdGgsUWE9ZWEuaW1hZ2UuaGVpZ2h0LGRiPXZkLmNvbnZlcnQoZWEuZm9ybWF0KTt3ZC5zZXRUZXh0dXJlMkQoZWEsMCk7VGEuY29weVRleEltYWdlMkQoMzU1MyxuYXx8MCxkYixWLngsVi55LEphLFFhLDApfTt0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlPWZ1bmN0aW9uKFYsZWEsbmEsSmEpe3ZhciBRYT1lYS5pbWFnZS53aWR0aCxkYj1lYS5pbWFnZS5oZWlnaHQsUmE9dmQuY29udmVydChuYS5mb3JtYXQpLGtiPXZkLmNvbnZlcnQobmEudHlwZSk7d2Quc2V0VGV4dHVyZTJEKG5hLDApO2VhLmlzRGF0YVRleHR1cmU/ClRhLnRleFN1YkltYWdlMkQoMzU1MyxKYXx8MCxWLngsVi55LFFhLGRiLFJhLGtiLGVhLmltYWdlLmRhdGEpOlRhLnRleFN1YkltYWdlMkQoMzU1MyxKYXx8MCxWLngsVi55LFJhLGtiLGVhLmltYWdlKX07InVuZGVmaW5lZCIhPT10eXBlb2YgX19USFJFRV9ERVZUT09MU19fJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm9ic2VydmUiLHtkZXRhaWw6dGhpc30pKX1mdW5jdGlvbiB3aShiLGUpe3RoaXMubmFtZT0iIjt0aGlzLmNvbG9yPW5ldyBJKGIpO3RoaXMuZGVuc2l0eT12b2lkIDAhPT1lP2U6Mi41RS00fWZ1bmN0aW9uIHhpKGIsZSxoKXt0aGlzLm5hbWU9IiI7dGhpcy5jb2xvcj1uZXcgSShiKTt0aGlzLm5lYXI9dm9pZCAwIT09ZT9lOjE7dGhpcy5mYXI9dm9pZCAwIT09aD9oOjFFM31mdW5jdGlvbiBPZShiLGUpe3RoaXMuYXJyYXk9Yjt0aGlzLnN0cmlkZT1lO3RoaXMuY291bnQ9dm9pZCAwIT09Yj9iLmxlbmd0aC9lOjA7dGhpcy5keW5hbWljPQohMTt0aGlzLnVwZGF0ZVJhbmdlPXtvZmZzZXQ6MCxjb3VudDotMX07dGhpcy52ZXJzaW9uPTB9ZnVuY3Rpb24gYmgoYixlLGgsbSl7dGhpcy5kYXRhPWI7dGhpcy5pdGVtU2l6ZT1lO3RoaXMub2Zmc2V0PWg7dGhpcy5ub3JtYWxpemVkPSEwPT09bX1mdW5jdGlvbiByZShiKXtNLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcHJpdGVNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSSgxNjc3NzIxNSk7dGhpcy5tYXA9bnVsbDt0aGlzLnJvdGF0aW9uPTA7dGhpcy5zaXplQXR0ZW51YXRpb249ITA7dGhpcy5saWdodHM9ITE7dGhpcy50cmFuc3BhcmVudD0hMDt0aGlzLnNldFZhbHVlcyhiKX1mdW5jdGlvbiBjaChiKXt5LmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcHJpdGUiO2lmKHZvaWQgMD09PUxmKXtMZj1uZXcgeGE7dmFyIGU9bmV3IE9lKG5ldyBGbG9hdDMyQXJyYXkoWy0uNSwtLjUsMCwwLDAsLjUsLS41LDAsMSwwLC41LC41LDAsMSwxLC0uNSwuNSwwLDAsMV0pLDUpO0xmLnNldEluZGV4KFswLAoxLDIsMCwyLDNdKTtMZi5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmgoZSwzLDAsITEpKTtMZi5hZGRBdHRyaWJ1dGUoInV2IixuZXcgYmgoZSwyLDMsITEpKX10aGlzLmdlb21ldHJ5PUxmO3RoaXMubWF0ZXJpYWw9dm9pZCAwIT09Yj9iOm5ldyByZTt0aGlzLmNlbnRlcj1uZXcgZCguNSwuNSl9ZnVuY3Rpb24geWkoYixlLGgsbSx1LHcpe01mLnN1YlZlY3RvcnMoYixoKS5hZGRTY2FsYXIoLjUpLm11bHRpcGx5KG0pO3ZvaWQgMCE9PXU/KGRoLng9dypNZi54LXUqTWYueSxkaC55PXUqTWYueCt3Kk1mLnkpOmRoLmNvcHkoTWYpO2IuY29weShlKTtiLngrPWRoLng7Yi55Kz1kaC55O2IuYXBwbHlNYXRyaXg0KE9uKX1mdW5jdGlvbiBlaCgpe3kuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxPRCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7bGV2ZWxzOntlbnVtZXJhYmxlOiEwLHZhbHVlOltdfX0pO3RoaXMuYXV0b1VwZGF0ZT0hMH1mdW5jdGlvbiBmaChiLGUpe2ImJmIuaXNHZW9tZXRyeSYmCmNvbnNvbGUuZXJyb3IoIlRIUkVFLlNraW5uZWRNZXNoIG5vIGxvbmdlciBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIik7eWEuY2FsbCh0aGlzLGIsZSk7dGhpcy50eXBlPSJTa2lubmVkTWVzaCI7dGhpcy5iaW5kTW9kZT0iYXR0YWNoZWQiO3RoaXMuYmluZE1hdHJpeD1uZXcgcjt0aGlzLmJpbmRNYXRyaXhJbnZlcnNlPW5ldyByfWZ1bmN0aW9uIHppKGIsZSl7Yj1ifHxbXTt0aGlzLmJvbmVzPWIuc2xpY2UoMCk7dGhpcy5ib25lTWF0cmljZXM9bmV3IEZsb2F0MzJBcnJheSgxNip0aGlzLmJvbmVzLmxlbmd0aCk7aWYodm9pZCAwPT09ZSl0aGlzLmNhbGN1bGF0ZUludmVyc2VzKCk7ZWxzZSBpZih0aGlzLmJvbmVzLmxlbmd0aD09PWUubGVuZ3RoKXRoaXMuYm9uZUludmVyc2VzPWUuc2xpY2UoMCk7ZWxzZSBmb3IoY29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbiBib25lSW52ZXJzZXMgaXMgdGhlIHdyb25nIGxlbmd0aC4iKSwKdGhpcy5ib25lSW52ZXJzZXM9W10sYj0wLGU9dGhpcy5ib25lcy5sZW5ndGg7YjxlO2IrKyl0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKG5ldyByKX1mdW5jdGlvbiB4aygpe3kuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkJvbmUifWZ1bmN0aW9uIE9iKGIpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpbmVCYXNpY01hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLmxpbmV3aWR0aD0xO3RoaXMubGluZWpvaW49dGhpcy5saW5lY2FwPSJyb3VuZCI7dGhpcy5saWdodHM9ITE7dGhpcy5zZXRWYWx1ZXMoYil9ZnVuY3Rpb24gbWMoYixlLGgpezE9PT1oJiZjb25zb2xlLmVycm9yKCJUSFJFRS5MaW5lOiBwYXJhbWV0ZXIgVEhSRUUuTGluZVBpZWNlcyBubyBsb25nZXIgc3VwcG9ydGVkLiBVc2UgVEhSRUUuTGluZVNlZ21lbnRzIGluc3RlYWQuIik7eS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTGluZSI7dGhpcy5nZW9tZXRyeT12b2lkIDAhPT1iP2I6bmV3IHhhO3RoaXMubWF0ZXJpYWw9CnZvaWQgMCE9PWU/ZTpuZXcgT2Ioe2NvbG9yOjE2Nzc3MjE1Kk1hdGgucmFuZG9tKCl9KX1mdW5jdGlvbiBTYihiLGUpe21jLmNhbGwodGhpcyxiLGUpO3RoaXMudHlwZT0iTGluZVNlZ21lbnRzIn1mdW5jdGlvbiBBaShiLGUpe21jLmNhbGwodGhpcyxiLGUpO3RoaXMudHlwZT0iTGluZUxvb3AifWZ1bmN0aW9uIGNkKGIpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBvaW50c01hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLm1hcD1udWxsO3RoaXMuc2l6ZT0xO3RoaXMuc2l6ZUF0dGVudWF0aW9uPSEwO3RoaXMubGlnaHRzPXRoaXMubW9ycGhUYXJnZXRzPSExO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uIE5mKGIsZSl7eS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUG9pbnRzIjt0aGlzLmdlb21ldHJ5PXZvaWQgMCE9PWI/YjpuZXcgeGE7dGhpcy5tYXRlcmlhbD12b2lkIDAhPT1lP2U6bmV3IGNkKHtjb2xvcjoxNjc3NzIxNSpNYXRoLnJhbmRvbSgpfSk7dGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX0KZnVuY3Rpb24geWsoYixlLGgsbSx1LHcsQSl7dmFyIEU9emsuZGlzdGFuY2VTcVRvUG9pbnQoYik7RTxoJiYoaD1uZXcgZyx6ay5jbG9zZXN0UG9pbnRUb1BvaW50KGIsaCksaC5hcHBseU1hdHJpeDQobSksYj11LnJheS5vcmlnaW4uZGlzdGFuY2VUbyhoKSxiPHUubmVhcnx8Yj51LmZhcnx8dy5wdXNoKHtkaXN0YW5jZTpiLGRpc3RhbmNlVG9SYXk6TWF0aC5zcXJ0KEUpLHBvaW50OmgsaW5kZXg6ZSxmYWNlOm51bGwsb2JqZWN0OkF9KSl9ZnVuY3Rpb24gQWsoYixlLGgsbSx1LHcsQSxFLEcpe2suY2FsbCh0aGlzLGIsZSxoLG0sdSx3LEEsRSxHKTt0aGlzLmZvcm1hdD12b2lkIDAhPT1BP0E6MTAyMjt0aGlzLm1pbkZpbHRlcj12b2lkIDAhPT13P3c6MTAwNjt0aGlzLm1hZ0ZpbHRlcj12b2lkIDAhPT11P3U6MTAwNjt0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX1mdW5jdGlvbiBPZihiLGUsaCxtLHUsdyxBLEUsRyxKLFEsUyl7ay5jYWxsKHRoaXMsbnVsbCx3LEEsRSxHLEosbSx1LFEsClMpO3RoaXMuaW1hZ2U9e3dpZHRoOmUsaGVpZ2h0Omh9O3RoaXMubWlwbWFwcz1iO3RoaXMuZ2VuZXJhdGVNaXBtYXBzPXRoaXMuZmxpcFk9ITF9ZnVuY3Rpb24gZ2goYixlLGgsbSx1LHcsQSxFLEcpe2suY2FsbCh0aGlzLGIsZSxoLG0sdSx3LEEsRSxHKTt0aGlzLm5lZWRzVXBkYXRlPSEwfWZ1bmN0aW9uIGhoKGIsZSxoLG0sdSx3LEEsRSxHLEope0o9dm9pZCAwIT09Sj9KOjEwMjY7aWYoMTAyNiE9PUomJjEwMjchPT1KKXRocm93IEVycm9yKCJEZXB0aFRleHR1cmUgZm9ybWF0IG11c3QgYmUgZWl0aGVyIFRIUkVFLkRlcHRoRm9ybWF0IG9yIFRIUkVFLkRlcHRoU3RlbmNpbEZvcm1hdCIpO3ZvaWQgMD09PWgmJjEwMjY9PT1KJiYoaD0xMDEyKTt2b2lkIDA9PT1oJiYxMDI3PT09SiYmKGg9MTAyMCk7ay5jYWxsKHRoaXMsbnVsbCxtLHUsdyxBLEUsSixoLEcpO3RoaXMuaW1hZ2U9e3dpZHRoOmIsaGVpZ2h0OmV9O3RoaXMubWFnRmlsdGVyPXZvaWQgMCE9PUE/QToxMDAzO3RoaXMubWluRmlsdGVyPQp2b2lkIDAhPT1FP0U6MTAwMzt0aGlzLmdlbmVyYXRlTWlwbWFwcz10aGlzLmZsaXBZPSExfWZ1bmN0aW9uIFBmKGIpe3hhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJXaXJlZnJhbWVHZW9tZXRyeSI7dmFyIGU9W10saCxtLHUsdz1bMCwwXSxBPXt9LEU9WyJhIiwiYiIsImMiXTtpZihiJiZiLmlzR2VvbWV0cnkpe3ZhciBHPWIuZmFjZXM7dmFyIEo9MDtmb3IobT1HLmxlbmd0aDtKPG07SisrKXt2YXIgUT1HW0pdO2ZvcihoPTA7Mz5oO2grKyl7dmFyIFM9UVtFW2hdXTt2YXIgVD1RW0VbKGgrMSklM11dO3dbMF09TWF0aC5taW4oUyxUKTt3WzFdPU1hdGgubWF4KFMsVCk7Uz13WzBdKyIsIit3WzFdO3ZvaWQgMD09PUFbU10mJihBW1NdPXtpbmRleDE6d1swXSxpbmRleDI6d1sxXX0pfX1mb3IoUyBpbiBBKUo9QVtTXSxFPWIudmVydGljZXNbSi5pbmRleDFdLGUucHVzaChFLngsRS55LEUueiksRT1iLnZlcnRpY2VzW0ouaW5kZXgyXSxlLnB1c2goRS54LEUueSxFLnopfWVsc2UgaWYoYiYmCmIuaXNCdWZmZXJHZW9tZXRyeSlpZihFPW5ldyBnLG51bGwhPT1iLmluZGV4KXtHPWIuYXR0cmlidXRlcy5wb3NpdGlvbjtRPWIuaW5kZXg7dmFyIFc9Yi5ncm91cHM7MD09PVcubGVuZ3RoJiYoVz1be3N0YXJ0OjAsY291bnQ6US5jb3VudCxtYXRlcmlhbEluZGV4OjB9XSk7Yj0wO2Zvcih1PVcubGVuZ3RoO2I8dTsrK2IpZm9yKEo9V1tiXSxoPUouc3RhcnQsbT1KLmNvdW50LEo9aCxtPWgrbTtKPG07Sis9Mylmb3IoaD0wOzM+aDtoKyspUz1RLmdldFgoSitoKSxUPVEuZ2V0WChKKyhoKzEpJTMpLHdbMF09TWF0aC5taW4oUyxUKSx3WzFdPU1hdGgubWF4KFMsVCksUz13WzBdKyIsIit3WzFdLHZvaWQgMD09PUFbU10mJihBW1NdPXtpbmRleDE6d1swXSxpbmRleDI6d1sxXX0pO2ZvcihTIGluIEEpSj1BW1NdLEUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShHLEouaW5kZXgxKSxlLnB1c2goRS54LEUueSxFLnopLEUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShHLEouaW5kZXgyKSxlLnB1c2goRS54LApFLnksRS56KX1lbHNlIGZvcihHPWIuYXR0cmlidXRlcy5wb3NpdGlvbixKPTAsbT1HLmNvdW50LzM7SjxtO0orKylmb3IoaD0wOzM+aDtoKyspQT0zKkoraCxFLmZyb21CdWZmZXJBdHRyaWJ1dGUoRyxBKSxlLnB1c2goRS54LEUueSxFLnopLEE9MypKKyhoKzEpJTMsRS5mcm9tQnVmZmVyQXR0cmlidXRlKEcsQSksZS5wdXNoKEUueCxFLnksRS56KTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBkYShlLDMpKX1mdW5jdGlvbiBpaChiLGUsaCl7emEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBhcmFtZXRyaWNHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtmdW5jOmIsc2xpY2VzOmUsc3RhY2tzOmh9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBRZihiLGUsaCkpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFFmKGIsZSxoKXt4YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e2Z1bmM6YiwKc2xpY2VzOmUsc3RhY2tzOmh9O3ZhciBtPVtdLHU9W10sdz1bXSxBPVtdLEU9bmV3IGcsRz1uZXcgZyxKPW5ldyBnLFE9bmV3IGcsUz1uZXcgZyxULFc7Mz5iLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVEhSRUUuUGFyYW1ldHJpY0dlb21ldHJ5OiBGdW5jdGlvbiBtdXN0IG5vdyBtb2RpZnkgYSBWZWN0b3IzIGFzIHRoaXJkIHBhcmFtZXRlci4iKTt2YXIgWD1lKzE7Zm9yKFQ9MDtUPD1oO1QrKyl7dmFyIGlhPVQvaDtmb3IoVz0wO1c8PWU7VysrKXt2YXIgaGE9Vy9lO2IoaGEsaWEsRyk7dS5wdXNoKEcueCxHLnksRy56KTswPD1oYS0xRS01PyhiKGhhLTFFLTUsaWEsSiksUS5zdWJWZWN0b3JzKEcsSikpOihiKGhhKzFFLTUsaWEsSiksUS5zdWJWZWN0b3JzKEosRykpOzA8PWlhLTFFLTU/KGIoaGEsaWEtMUUtNSxKKSxTLnN1YlZlY3RvcnMoRyxKKSk6KGIoaGEsaWErMUUtNSxKKSxTLnN1YlZlY3RvcnMoSixHKSk7RS5jcm9zc1ZlY3RvcnMoUSxTKS5ub3JtYWxpemUoKTt3LnB1c2goRS54LApFLnksRS56KTtBLnB1c2goaGEsaWEpfX1mb3IoVD0wO1Q8aDtUKyspZm9yKFc9MDtXPGU7VysrKWI9VCpYK1crMSxFPShUKzEpKlgrVysxLEc9KFQrMSkqWCtXLG0ucHVzaChUKlgrVyxiLEcpLG0ucHVzaChiLEUsRyk7dGhpcy5zZXRJbmRleChtKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBkYSh1LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgZGEodywzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgZGEoQSwyKSl9ZnVuY3Rpb24gamgoYixlLGgsbSl7emEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBvbHloZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt2ZXJ0aWNlczpiLGluZGljZXM6ZSxyYWRpdXM6aCxkZXRhaWw6bX07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IEZjKGIsZSxoLG0pKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBGYyhiLGUsaCxtKXtmdW5jdGlvbiB1KFgsaWEsaGEsc2Epe3NhPU1hdGgucG93KDIsCnNhKTt2YXIgcWE9W10scmEsd2E7Zm9yKHJhPTA7cmE8PXNhO3JhKyspe3FhW3JhXT1bXTt2YXIgcGE9WC5jbG9uZSgpLmxlcnAoaGEscmEvc2EpLHZhPWlhLmNsb25lKCkubGVycChoYSxyYS9zYSksQ2E9c2EtcmE7Zm9yKHdhPTA7d2E8PUNhO3dhKyspcWFbcmFdW3dhXT0wPT09d2EmJnJhPT09c2E/cGE6cGEuY2xvbmUoKS5sZXJwKHZhLHdhL0NhKX1mb3IocmE9MDtyYTxzYTtyYSsrKWZvcih3YT0wO3dhPDIqKHNhLXJhKS0xO3dhKyspWD1NYXRoLmZsb29yKHdhLzIpLDA9PT13YSUyPyhBKHFhW3JhXVtYKzFdKSxBKHFhW3JhKzFdW1hdKSxBKHFhW3JhXVtYXSkpOihBKHFhW3JhXVtYKzFdKSxBKHFhW3JhKzFdW1grMV0pLEEocWFbcmErMV1bWF0pKX1mdW5jdGlvbiB3KCl7Zm9yKHZhciBYPTA7WDxXLmxlbmd0aDtYKz02KXt2YXIgaWE9V1tYKzBdLGhhPVdbWCsyXSxzYT1XW1grNF0scWE9TWF0aC5taW4oaWEsaGEsc2EpOy45PE1hdGgubWF4KGlhLGhhLHNhKSYmLjE+cWEmJiguMj4KaWEmJihXW1grMF0rPTEpLC4yPmhhJiYoV1tYKzJdKz0xKSwuMj5zYSYmKFdbWCs0XSs9MSkpfX1mdW5jdGlvbiBBKFgpe1QucHVzaChYLngsWC55LFgueil9ZnVuY3Rpb24gRShYLGlhKXtYKj0zO2lhLng9YltYKzBdO2lhLnk9YltYKzFdO2lhLno9YltYKzJdfWZ1bmN0aW9uIEcoKXtmb3IodmFyIFg9bmV3IGcsaWE9bmV3IGcsaGE9bmV3IGcsc2E9bmV3IGcscWE9bmV3IGQscmE9bmV3IGQsd2E9bmV3IGQscGE9MCx2YT0wO3BhPFQubGVuZ3RoO3BhKz05LHZhKz02KXtYLnNldChUW3BhKzBdLFRbcGErMV0sVFtwYSsyXSk7aWEuc2V0KFRbcGErM10sVFtwYSs0XSxUW3BhKzVdKTtoYS5zZXQoVFtwYSs2XSxUW3BhKzddLFRbcGErOF0pO3FhLnNldChXW3ZhKzBdLFdbdmErMV0pO3JhLnNldChXW3ZhKzJdLFdbdmErM10pO3dhLnNldChXW3ZhKzRdLFdbdmErNV0pO3NhLmNvcHkoWCkuYWRkKGlhKS5hZGQoaGEpLmRpdmlkZVNjYWxhcigzKTt2YXIgQ2E9UShzYSk7SihxYSx2YSswLFgsCkNhKTtKKHJhLHZhKzIsaWEsQ2EpO0ood2EsdmErNCxoYSxDYSl9fWZ1bmN0aW9uIEooWCxpYSxoYSxzYSl7MD5zYSYmMT09PVgueCYmKFdbaWFdPVgueC0xKTswPT09aGEueCYmMD09PWhhLnomJihXW2lhXT1zYS8yL01hdGguUEkrLjUpfWZ1bmN0aW9uIFEoWCl7cmV0dXJuIE1hdGguYXRhbjIoWC56LC1YLngpfWZ1bmN0aW9uIFMoWCl7cmV0dXJuIE1hdGguYXRhbjIoLVgueSxNYXRoLnNxcnQoWC54KlgueCtYLnoqWC56KSl9eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt2ZXJ0aWNlczpiLGluZGljZXM6ZSxyYWRpdXM6aCxkZXRhaWw6bX07aD1ofHwxO209bXx8MDt2YXIgVD1bXSxXPVtdOyhmdW5jdGlvbihYKXtmb3IodmFyIGlhPW5ldyBnLGhhPW5ldyBnLHNhPW5ldyBnLHFhPTA7cWE8ZS5sZW5ndGg7cWErPTMpRShlW3FhKzBdLGlhKSxFKGVbcWErMV0saGEpLEUoZVtxYSsyXSxzYSksdShpYSxoYSxzYSwKWCl9KShtKTsoZnVuY3Rpb24oWCl7Zm9yKHZhciBpYT1uZXcgZyxoYT0wO2hhPFQubGVuZ3RoO2hhKz0zKWlhLng9VFtoYSswXSxpYS55PVRbaGErMV0saWEuej1UW2hhKzJdLGlhLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKFgpLFRbaGErMF09aWEueCxUW2hhKzFdPWlhLnksVFtoYSsyXT1pYS56fSkoaCk7KGZ1bmN0aW9uKCl7Zm9yKHZhciBYPW5ldyBnLGlhPTA7aWE8VC5sZW5ndGg7aWErPTMpe1gueD1UW2lhKzBdO1gueT1UW2lhKzFdO1guej1UW2lhKzJdO3ZhciBoYT1RKFgpLzIvTWF0aC5QSSsuNSxzYT1TKFgpL01hdGguUEkrLjU7Vy5wdXNoKGhhLDEtc2EpfUcoKTt3KCl9KSgpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGRhKFQsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBkYShULnNsaWNlKCksMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGRhKFcsMikpOzA9PT1tP3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTp0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKX0KZnVuY3Rpb24ga2goYixlKXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVGV0cmFoZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YixkZXRhaWw6ZX07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFJmKGIsZSkpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFJmKGIsZSl7RmMuY2FsbCh0aGlzLFsxLDEsMSwtMSwtMSwxLC0xLDEsLTEsMSwtMSwtMV0sWzIsMSwwLDAsMywyLDEsMywwLDIsMywxXSxiLGUpO3RoaXMudHlwZT0iVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YixkZXRhaWw6ZX19ZnVuY3Rpb24gbGgoYixlKXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iT2N0YWhlZHJvbkdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLGRldGFpbDplfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgUGUoYixlKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gUGUoYixlKXtGYy5jYWxsKHRoaXMsClsxLDAsMCwtMSwwLDAsMCwxLDAsMCwtMSwwLDAsMCwxLDAsMCwtMV0sWzAsMiw0LDAsNCwzLDAsMyw1LDAsNSwyLDEsMiw1LDEsNSwzLDEsMyw0LDEsNCwyXSxiLGUpO3RoaXMudHlwZT0iT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLGRldGFpbDplfX1mdW5jdGlvbiBtaChiLGUpe3phLmNhbGwodGhpcyk7dGhpcy50eXBlPSJJY29zYWhlZHJvbkdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLGRldGFpbDplfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgU2YoYixlKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gU2YoYixlKXt2YXIgaD0oMStNYXRoLnNxcnQoNSkpLzI7RmMuY2FsbCh0aGlzLFstMSxoLDAsMSxoLDAsLTEsLWgsMCwxLC1oLDAsMCwtMSxoLDAsMSxoLDAsLTEsLWgsMCwxLC1oLGgsMCwtMSxoLDAsMSwtaCwwLC0xLC1oLDAsMV0sWzAsMTEsNSwwLDUsMSwwLDEsNywwLDcsMTAsMCwxMCwxMSwKMSw1LDksNSwxMSw0LDExLDEwLDIsMTAsNyw2LDcsMSw4LDMsOSw0LDMsNCwyLDMsMiw2LDMsNiw4LDMsOCw5LDQsOSw1LDIsNCwxMSw2LDIsMTAsOCw2LDcsOSw4LDFdLGIsZSk7dGhpcy50eXBlPSJJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLGRldGFpbDplfX1mdW5jdGlvbiBuaChiLGUpe3phLmNhbGwodGhpcyk7dGhpcy50eXBlPSJEb2RlY2FoZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YixkZXRhaWw6ZX07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFRmKGIsZSkpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFRmKGIsZSl7dmFyIGg9KDErTWF0aC5zcXJ0KDUpKS8yLG09MS9oO0ZjLmNhbGwodGhpcyxbLTEsLTEsLTEsLTEsLTEsMSwtMSwxLC0xLC0xLDEsMSwxLC0xLC0xLDEsLTEsMSwxLDEsLTEsMSwxLDEsMCwtbSwtaCwwLC1tLGgsMCxtLC1oLDAsbSxoLC1tLC1oLDAsLW0saCwwLG0sCi1oLDAsbSxoLDAsLWgsMCwtbSxoLDAsLW0sLWgsMCxtLGgsMCxtXSxbMywxMSw3LDMsNywxNSwzLDE1LDEzLDcsMTksMTcsNywxNyw2LDcsNiwxNSwxNyw0LDgsMTcsOCwxMCwxNywxMCw2LDgsMCwxNiw4LDE2LDIsOCwyLDEwLDAsMTIsMSwwLDEsMTgsMCwxOCwxNiw2LDEwLDIsNiwyLDEzLDYsMTMsMTUsMiwxNiwxOCwyLDE4LDMsMiwzLDEzLDE4LDEsOSwxOCw5LDExLDE4LDExLDMsNCwxNCwxMiw0LDEyLDAsNCwwLDgsMTEsOSw1LDExLDUsMTksMTEsMTksNywxOSw1LDE0LDE5LDE0LDQsMTksNCwxNywxLDEyLDE0LDEsMTQsNSwxLDUsOV0sYixlKTt0aGlzLnR5cGU9IkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLGRldGFpbDplfX1mdW5jdGlvbiBvaChiLGUsaCxtLHUsdyl7emEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlR1YmVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtwYXRoOmIsdHVidWxhclNlZ21lbnRzOmUscmFkaXVzOmgsCnJhZGlhbFNlZ21lbnRzOm0sY2xvc2VkOnV9O3ZvaWQgMCE9PXcmJmNvbnNvbGUud2FybigiVEhSRUUuVHViZUdlb21ldHJ5OiB0YXBlciBoYXMgYmVlbiByZW1vdmVkLiIpO2I9bmV3IFFlKGIsZSxoLG0sdSk7dGhpcy50YW5nZW50cz1iLnRhbmdlbnRzO3RoaXMubm9ybWFscz1iLm5vcm1hbHM7dGhpcy5iaW5vcm1hbHM9Yi5iaW5vcm1hbHM7dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoYik7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gUWUoYixlLGgsbSx1KXtmdW5jdGlvbiB3KHJhKXtUPWIuZ2V0UG9pbnRBdChyYS9lLFQpO3ZhciB3YT1HLm5vcm1hbHNbcmFdO3JhPUcuYmlub3JtYWxzW3JhXTtmb3IoWD0wO1g8PW07WCsrKXt2YXIgcGE9WC9tKk1hdGguUEkqMix2YT1NYXRoLnNpbihwYSk7cGE9LU1hdGguY29zKHBhKTtRLng9cGEqd2EueCt2YSpyYS54O1EueT1wYSp3YS55K3ZhKnJhLnk7US56PXBhKndhLnordmEqcmEuejtRLm5vcm1hbGl6ZSgpO2hhLnB1c2goUS54LApRLnksUS56KTtKLng9VC54K2gqUS54O0oueT1ULnkraCpRLnk7Si56PVQueitoKlEuejtpYS5wdXNoKEoueCxKLnksSi56KX19ZnVuY3Rpb24gQSgpe2ZvcihYPTE7WDw9ZTtYKyspZm9yKFc9MTtXPD1tO1crKyl7dmFyIHJhPShtKzEpKlgrKFctMSksd2E9KG0rMSkqWCtXLHBhPShtKzEpKihYLTEpK1c7cWEucHVzaCgobSsxKSooWC0xKSsoVy0xKSxyYSxwYSk7cWEucHVzaChyYSx3YSxwYSl9fWZ1bmN0aW9uIEUoKXtmb3IoVz0wO1c8PWU7VysrKWZvcihYPTA7WDw9bTtYKyspUy54PVcvZSxTLnk9WC9tLHNhLnB1c2goUy54LFMueSl9eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlR1YmVCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtwYXRoOmIsdHVidWxhclNlZ21lbnRzOmUscmFkaXVzOmgscmFkaWFsU2VnbWVudHM6bSxjbG9zZWQ6dX07ZT1lfHw2NDtoPWh8fDE7bT1tfHw4O3U9dXx8ITE7dmFyIEc9Yi5jb21wdXRlRnJlbmV0RnJhbWVzKGUsdSk7dGhpcy50YW5nZW50cz0KRy50YW5nZW50czt0aGlzLm5vcm1hbHM9Ry5ub3JtYWxzO3RoaXMuYmlub3JtYWxzPUcuYmlub3JtYWxzO3ZhciBKPW5ldyBnLFE9bmV3IGcsUz1uZXcgZCxUPW5ldyBnLFcsWCxpYT1bXSxoYT1bXSxzYT1bXSxxYT1bXTsoZnVuY3Rpb24oKXtmb3IoVz0wO1c8ZTtXKyspdyhXKTt3KCExPT09dT9lOjApO0UoKTtBKCl9KSgpO3RoaXMuc2V0SW5kZXgocWEpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGRhKGlhLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgZGEoaGEsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGRhKHNhLDIpKX1mdW5jdGlvbiBwaChiLGUsaCxtLHUsdyxBKXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVG9ydXNLbm90R2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmIsdHViZTplLHR1YnVsYXJTZWdtZW50czpoLHJhZGlhbFNlZ21lbnRzOm0scDp1LHE6d307dm9pZCAwIT09QSYmY29uc29sZS53YXJuKCJUSFJFRS5Ub3J1c0tub3RHZW9tZXRyeTogaGVpZ2h0U2NhbGUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5zY2FsZSggeCwgeSwgeiApIGluc3RlYWQuIik7CnRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBVZihiLGUsaCxtLHUsdykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFVmKGIsZSxoLG0sdSx3KXtmdW5jdGlvbiBBKHZhLENhLFZhLFdhLERhKXt2YXIgSWE9TWF0aC5zaW4odmEpO0NhPVZhL0NhKnZhO1ZhPU1hdGguY29zKENhKTtEYS54PVdhKigyK1ZhKSouNSpNYXRoLmNvcyh2YSk7RGEueT1XYSooMitWYSkqSWEqLjU7RGEuej1XYSpNYXRoLnNpbihDYSkqLjV9eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLHR1YmU6ZSx0dWJ1bGFyU2VnbWVudHM6aCxyYWRpYWxTZWdtZW50czptLHA6dSxxOnd9O2I9Ynx8MTtlPWV8fC40O2g9TWF0aC5mbG9vcihoKXx8NjQ7bT1NYXRoLmZsb29yKG0pfHw4O3U9dXx8Mjt3PXd8fDM7dmFyIEU9W10sRz1bXSxKPVtdLFE9W10sUyxUPW5ldyBnLFc9bmV3IGcsWD1uZXcgZyxpYT1uZXcgZyxoYT1uZXcgZywKc2E9bmV3IGcscWE9bmV3IGc7Zm9yKFM9MDtTPD1oOysrUyl7dmFyIHJhPVMvaCp1Kk1hdGguUEkqMjtBKHJhLHUsdyxiLFgpO0EocmErLjAxLHUsdyxiLGlhKTtzYS5zdWJWZWN0b3JzKGlhLFgpO3FhLmFkZFZlY3RvcnMoaWEsWCk7aGEuY3Jvc3NWZWN0b3JzKHNhLHFhKTtxYS5jcm9zc1ZlY3RvcnMoaGEsc2EpO2hhLm5vcm1hbGl6ZSgpO3FhLm5vcm1hbGl6ZSgpO2ZvcihyYT0wO3JhPD1tOysrcmEpe3ZhciB3YT1yYS9tKk1hdGguUEkqMixwYT0tZSpNYXRoLmNvcyh3YSk7d2E9ZSpNYXRoLnNpbih3YSk7VC54PVgueCsocGEqcWEueCt3YSpoYS54KTtULnk9WC55KyhwYSpxYS55K3dhKmhhLnkpO1Quej1YLnorKHBhKnFhLnord2EqaGEueik7Ry5wdXNoKFQueCxULnksVC56KTtXLnN1YlZlY3RvcnMoVCxYKS5ub3JtYWxpemUoKTtKLnB1c2goVy54LFcueSxXLnopO1EucHVzaChTL2gpO1EucHVzaChyYS9tKX19Zm9yKHJhPTE7cmE8PWg7cmErKylmb3IoUz0xO1M8PW07UysrKWI9CihtKzEpKnJhKyhTLTEpLGU9KG0rMSkqcmErUyx1PShtKzEpKihyYS0xKStTLEUucHVzaCgobSsxKSoocmEtMSkrKFMtMSksYix1KSxFLnB1c2goYixlLHUpO3RoaXMuc2V0SW5kZXgoRSk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgZGEoRywzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGRhKEosMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGRhKFEsMikpfWZ1bmN0aW9uIHFoKGIsZSxoLG0sdSl7emEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlRvcnVzR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmIsdHViZTplLHJhZGlhbFNlZ21lbnRzOmgsdHVidWxhclNlZ21lbnRzOm0sYXJjOnV9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBWZihiLGUsaCxtLHUpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBWZihiLGUsaCxtLHUpe3hhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJUb3J1c0J1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9CntyYWRpdXM6Yix0dWJlOmUscmFkaWFsU2VnbWVudHM6aCx0dWJ1bGFyU2VnbWVudHM6bSxhcmM6dX07Yj1ifHwxO2U9ZXx8LjQ7aD1NYXRoLmZsb29yKGgpfHw4O209TWF0aC5mbG9vcihtKXx8Njt1PXV8fDIqTWF0aC5QSTt2YXIgdz1bXSxBPVtdLEU9W10sRz1bXSxKPW5ldyBnLFE9bmV3IGcsUz1uZXcgZyxULFc7Zm9yKFQ9MDtUPD1oO1QrKylmb3IoVz0wO1c8PW07VysrKXt2YXIgWD1XL20qdSxpYT1UL2gqTWF0aC5QSSoyO1EueD0oYitlKk1hdGguY29zKGlhKSkqTWF0aC5jb3MoWCk7US55PShiK2UqTWF0aC5jb3MoaWEpKSpNYXRoLnNpbihYKTtRLno9ZSpNYXRoLnNpbihpYSk7QS5wdXNoKFEueCxRLnksUS56KTtKLng9YipNYXRoLmNvcyhYKTtKLnk9YipNYXRoLnNpbihYKTtTLnN1YlZlY3RvcnMoUSxKKS5ub3JtYWxpemUoKTtFLnB1c2goUy54LFMueSxTLnopO0cucHVzaChXL20pO0cucHVzaChUL2gpfWZvcihUPTE7VDw9aDtUKyspZm9yKFc9MTtXPD1tO1crKyliPShtKwoxKSooVC0xKStXLTEsZT0obSsxKSooVC0xKStXLHU9KG0rMSkqVCtXLHcucHVzaCgobSsxKSpUK1ctMSxiLHUpLHcucHVzaChiLGUsdSk7dGhpcy5zZXRJbmRleCh3KTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBkYShBLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgZGEoRSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgZGEoRywyKSl9ZnVuY3Rpb24gUG4oYixlLGgsbSx1KXtpZih1PT09MDxUcihiLGUsaCxtKSlmb3IodT1lO3U8aDt1Kz1tKXZhciB3PVFuKHUsYlt1XSxiW3UrMV0sdyk7ZWxzZSBmb3IodT1oLW07dT49ZTt1LT1tKXc9UW4odSxiW3VdLGJbdSsxXSx3KTt3JiZSZSh3LHcubmV4dCkmJihyaCh3KSx3PXcubmV4dCk7cmV0dXJuIHd9ZnVuY3Rpb24gc2goYixlKXtpZighYilyZXR1cm4gYjtlfHwoZT1iKTtkb3t2YXIgaD0hMTtpZihiLnN0ZWluZXJ8fCFSZShiLGIubmV4dCkmJjAhPT1uYyhiLnByZXYsYixiLm5leHQpKWI9Yi5uZXh0OwplbHNle3JoKGIpO2I9ZT1iLnByZXY7aWYoYj09PWIubmV4dClicmVhaztoPSEwfX13aGlsZShofHxiIT09ZSk7cmV0dXJuIGV9ZnVuY3Rpb24gdGgoYixlLGgsbSx1LHcsQSl7aWYoYil7IUEmJncmJlVyKGIsbSx1LHcpO2Zvcih2YXIgRT1iLEcsSjtiLnByZXYhPT1iLm5leHQ7KWlmKEc9Yi5wcmV2LEo9Yi5uZXh0LHc/VnIoYixtLHUsdyk6V3IoYikpZS5wdXNoKEcuaS9oKSxlLnB1c2goYi5pL2gpLGUucHVzaChKLmkvaCkscmgoYiksRT1iPUoubmV4dDtlbHNlIGlmKGI9SixiPT09RSl7QT8xPT09QT8oYj1YcihiLGUsaCksdGgoYixlLGgsbSx1LHcsMikpOjI9PT1BJiZZcihiLGUsaCxtLHUsdyk6dGgoc2goYiksZSxoLG0sdSx3LDEpO2JyZWFrfX19ZnVuY3Rpb24gV3IoYil7dmFyIGU9Yi5wcmV2LGg9Yi5uZXh0O2lmKDA8PW5jKGUsYixoKSlyZXR1cm4hMTtmb3IodmFyIG09Yi5uZXh0Lm5leHQ7bSE9PWIucHJldjspe2lmKFdmKGUueCxlLnksYi54LGIueSxoLngsaC55LG0ueCwKbS55KSYmMDw9bmMobS5wcmV2LG0sbS5uZXh0KSlyZXR1cm4hMTttPW0ubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiBWcihiLGUsaCxtKXt2YXIgdT1iLnByZXYsdz1iLm5leHQ7aWYoMDw9bmModSxiLHcpKXJldHVybiExO3ZhciBBPXUueD5iLng/dS54PncueD91Lng6dy54OmIueD53Lng/Yi54OncueCxFPXUueT5iLnk/dS55PncueT91Lnk6dy55OmIueT53Lnk/Yi55OncueSxHPUJrKHUueDxiLng/dS54PHcueD91Lng6dy54OmIueDx3Lng/Yi54OncueCx1Lnk8Yi55P3UueTx3Lnk/dS55OncueTpiLnk8dy55P2IueTp3LnksZSxoLG0pO2U9QmsoQSxFLGUsaCxtKTtoPWIucHJldlo7Zm9yKG09Yi5uZXh0WjtoJiZoLno+PUcmJm0mJm0uejw9ZTspe2lmKGghPT1iLnByZXYmJmghPT1iLm5leHQmJldmKHUueCx1LnksYi54LGIueSx3Lngsdy55LGgueCxoLnkpJiYwPD1uYyhoLnByZXYsaCxoLm5leHQpKXJldHVybiExO2g9aC5wcmV2WjtpZihtIT09Yi5wcmV2JiZtIT09Yi5uZXh0JiZXZih1LngsCnUueSxiLngsYi55LHcueCx3LnksbS54LG0ueSkmJjA8PW5jKG0ucHJldixtLG0ubmV4dCkpcmV0dXJuITE7bT1tLm5leHRafWZvcig7aCYmaC56Pj1HOyl7aWYoaCE9PWIucHJldiYmaCE9PWIubmV4dCYmV2YodS54LHUueSxiLngsYi55LHcueCx3LnksaC54LGgueSkmJjA8PW5jKGgucHJldixoLGgubmV4dCkpcmV0dXJuITE7aD1oLnByZXZafWZvcig7bSYmbS56PD1lOyl7aWYobSE9PWIucHJldiYmbSE9PWIubmV4dCYmV2YodS54LHUueSxiLngsYi55LHcueCx3LnksbS54LG0ueSkmJjA8PW5jKG0ucHJldixtLG0ubmV4dCkpcmV0dXJuITE7bT1tLm5leHRafXJldHVybiEwfWZ1bmN0aW9uIFhyKGIsZSxoKXt2YXIgbT1iO2Rve3ZhciB1PW0ucHJldix3PW0ubmV4dC5uZXh0OyFSZSh1LHcpJiZSbih1LG0sbS5uZXh0LHcpJiZ1aCh1LHcpJiZ1aCh3LHUpJiYoZS5wdXNoKHUuaS9oKSxlLnB1c2gobS5pL2gpLGUucHVzaCh3LmkvaCkscmgobSkscmgobS5uZXh0KSxtPWI9dyk7bT1tLm5leHR9d2hpbGUobSE9PQpiKTtyZXR1cm4gbX1mdW5jdGlvbiBZcihiLGUsaCxtLHUsdyl7dmFyIEE9Yjtkb3tmb3IodmFyIEU9QS5uZXh0Lm5leHQ7RSE9PUEucHJldjspe2lmKEEuaSE9PUUuaSYmWnIoQSxFKSl7Yj1TbihBLEUpO0E9c2goQSxBLm5leHQpO2I9c2goYixiLm5leHQpO3RoKEEsZSxoLG0sdSx3KTt0aChiLGUsaCxtLHUsdyk7cmV0dXJufUU9RS5uZXh0fUE9QS5uZXh0fXdoaWxlKEEhPT1iKX1mdW5jdGlvbiAkcihiLGUsaCxtKXt2YXIgdT1bXSx3O3ZhciBBPTA7Zm9yKHc9ZS5sZW5ndGg7QTx3O0ErKyl7dmFyIEU9ZVtBXSptO3ZhciBHPUE8dy0xP2VbQSsxXSptOmIubGVuZ3RoO0U9UG4oYixFLEcsbSwhMSk7RT09PUUubmV4dCYmKEUuc3RlaW5lcj0hMCk7dS5wdXNoKGFzKEUpKX11LnNvcnQoYnMpO2ZvcihBPTA7QTx1Lmxlbmd0aDtBKyspY3ModVtBXSxoKSxoPXNoKGgsaC5uZXh0KTtyZXR1cm4gaH1mdW5jdGlvbiBicyhiLGUpe3JldHVybiBiLngtZS54fWZ1bmN0aW9uIGNzKGIsZSl7aWYoZT0KZHMoYixlKSliPVNuKGUsYiksc2goYixiLm5leHQpfWZ1bmN0aW9uIGRzKGIsZSl7dmFyIGg9ZSxtPWIueCx1PWIueSx3PS1JbmZpbml0eTtkb3tpZih1PD1oLnkmJnU+PWgubmV4dC55JiZoLm5leHQueSE9PWgueSl7dmFyIEE9aC54Kyh1LWgueSkqKGgubmV4dC54LWgueCkvKGgubmV4dC55LWgueSk7aWYoQTw9bSYmQT53KXt3PUE7aWYoQT09PW0pe2lmKHU9PT1oLnkpcmV0dXJuIGg7aWYodT09PWgubmV4dC55KXJldHVybiBoLm5leHR9dmFyIEU9aC54PGgubmV4dC54P2g6aC5uZXh0fX1oPWgubmV4dH13aGlsZShoIT09ZSk7aWYoIUUpcmV0dXJuIG51bGw7aWYobT09PXcpcmV0dXJuIEUucHJldjtlPUU7QT1FLng7dmFyIEc9RS55LEo9SW5maW5pdHk7Zm9yKGg9RS5uZXh0O2ghPT1lOyl7aWYobT49aC54JiZoLng+PUEmJm0hPT1oLngmJldmKHU8Rz9tOncsdSxBLEcsdTxHP3c6bSx1LGgueCxoLnkpKXt2YXIgUT1NYXRoLmFicyh1LWgueSkvKG0taC54KTsoUTxKfHxRPT09SiYmCmgueD5FLngpJiZ1aChoLGIpJiYoRT1oLEo9USl9aD1oLm5leHR9cmV0dXJuIEV9ZnVuY3Rpb24gVXIoYixlLGgsbSl7dmFyIHU9YjtkbyBudWxsPT09dS56JiYodS56PUJrKHUueCx1LnksZSxoLG0pKSx1LnByZXZaPXUucHJldix1PXUubmV4dFo9dS5uZXh0O3doaWxlKHUhPT1iKTt1LnByZXZaLm5leHRaPW51bGw7dS5wcmV2Wj1udWxsO2VzKHUpfWZ1bmN0aW9uIGVzKGIpe3ZhciBlLGgsbSx1LHc9MTtkb3t2YXIgQT1iO3ZhciBFPWI9bnVsbDtmb3IoaD0wO0E7KXtoKys7dmFyIEc9QTtmb3IoZT1tPTA7ZTx3JiYobSsrLEc9Ry5uZXh0WixHKTtlKyspO2Zvcih1PXc7MDxtfHwwPHUmJkc7KTAhPT1tJiYoMD09PXV8fCFHfHxBLno8PUcueik/KGU9QSxBPUEubmV4dFosbS0tKTooZT1HLEc9Ry5uZXh0Wix1LS0pLEU/RS5uZXh0Wj1lOmI9ZSxlLnByZXZaPUUsRT1lO0E9R31FLm5leHRaPW51bGw7dyo9Mn13aGlsZSgxPGgpO3JldHVybiBifWZ1bmN0aW9uIEJrKGIsZSxoLG0sdSl7Yj0KMzI3NjcqKGItaCkqdTtlPTMyNzY3KihlLW0pKnU7Yj0oYnxiPDw4KSYxNjcxMTkzNTtiPShifGI8PDQpJjI1MjY0NTEzNTtiPShifGI8PDIpJjg1ODk5MzQ1OTtlPShlfGU8PDgpJjE2NzExOTM1O2U9KGV8ZTw8NCkmMjUyNjQ1MTM1O2U9KGV8ZTw8MikmODU4OTkzNDU5O3JldHVybihifGI8PDEpJjE0MzE2NTU3NjV8KChlfGU8PDEpJjE0MzE2NTU3NjUpPDwxfWZ1bmN0aW9uIGFzKGIpe3ZhciBlPWIsaD1iO2Rve2lmKGUueDxoLnh8fGUueD09PWgueCYmZS55PGgueSloPWU7ZT1lLm5leHR9d2hpbGUoZSE9PWIpO3JldHVybiBofWZ1bmN0aW9uIFdmKGIsZSxoLG0sdSx3LEEsRSl7cmV0dXJuIDA8PSh1LUEpKihlLUUpLShiLUEpKih3LUUpJiYwPD0oYi1BKSoobS1FKS0oaC1BKSooZS1FKSYmMDw9KGgtQSkqKHctRSktKHUtQSkqKG0tRSl9ZnVuY3Rpb24gWnIoYixlKXtyZXR1cm4gYi5uZXh0LmkhPT1lLmkmJmIucHJldi5pIT09ZS5pJiYhZnMoYixlKSYmdWgoYixlKSYmdWgoZSxiKSYmCmdzKGIsZSl9ZnVuY3Rpb24gbmMoYixlLGgpe3JldHVybihlLnktYi55KSooaC54LWUueCktKGUueC1iLngpKihoLnktZS55KX1mdW5jdGlvbiBSZShiLGUpe3JldHVybiBiLng9PT1lLngmJmIueT09PWUueX1mdW5jdGlvbiBSbihiLGUsaCxtKXtyZXR1cm4gUmUoYixoKSYmUmUoZSxtKXx8UmUoYixtKSYmUmUoaCxlKT8hMDowPG5jKGIsZSxoKSE9PTA8bmMoYixlLG0pJiYwPG5jKGgsbSxiKSE9PTA8bmMoaCxtLGUpfWZ1bmN0aW9uIGZzKGIsZSl7dmFyIGg9Yjtkb3tpZihoLmkhPT1iLmkmJmgubmV4dC5pIT09Yi5pJiZoLmkhPT1lLmkmJmgubmV4dC5pIT09ZS5pJiZSbihoLGgubmV4dCxiLGUpKXJldHVybiEwO2g9aC5uZXh0fXdoaWxlKGghPT1iKTtyZXR1cm4hMX1mdW5jdGlvbiB1aChiLGUpe3JldHVybiAwPm5jKGIucHJldixiLGIubmV4dCk/MDw9bmMoYixlLGIubmV4dCkmJjA8PW5jKGIsYi5wcmV2LGUpOjA+bmMoYixlLGIucHJldil8fDA+bmMoYixiLm5leHQsZSl9ZnVuY3Rpb24gZ3MoYiwKZSl7dmFyIGg9YixtPSExLHU9KGIueCtlLngpLzI7ZT0oYi55K2UueSkvMjtkbyBoLnk+ZSE9PWgubmV4dC55PmUmJmgubmV4dC55IT09aC55JiZ1PChoLm5leHQueC1oLngpKihlLWgueSkvKGgubmV4dC55LWgueSkraC54JiYobT0hbSksaD1oLm5leHQ7d2hpbGUoaCE9PWIpO3JldHVybiBtfWZ1bmN0aW9uIFNuKGIsZSl7dmFyIGg9bmV3IENrKGIuaSxiLngsYi55KSxtPW5ldyBDayhlLmksZS54LGUueSksdT1iLm5leHQsdz1lLnByZXY7Yi5uZXh0PWU7ZS5wcmV2PWI7aC5uZXh0PXU7dS5wcmV2PWg7bS5uZXh0PWg7aC5wcmV2PW07dy5uZXh0PW07bS5wcmV2PXc7cmV0dXJuIG19ZnVuY3Rpb24gUW4oYixlLGgsbSl7Yj1uZXcgQ2soYixlLGgpO20/KGIubmV4dD1tLm5leHQsYi5wcmV2PW0sbS5uZXh0LnByZXY9YixtLm5leHQ9Yik6KGIucHJldj1iLGIubmV4dD1iKTtyZXR1cm4gYn1mdW5jdGlvbiByaChiKXtiLm5leHQucHJldj1iLnByZXY7Yi5wcmV2Lm5leHQ9Yi5uZXh0O2IucHJldlomJgooYi5wcmV2Wi5uZXh0Wj1iLm5leHRaKTtiLm5leHRaJiYoYi5uZXh0Wi5wcmV2Wj1iLnByZXZaKX1mdW5jdGlvbiBDayhiLGUsaCl7dGhpcy5pPWI7dGhpcy54PWU7dGhpcy55PWg7dGhpcy5uZXh0Wj10aGlzLnByZXZaPXRoaXMuej10aGlzLm5leHQ9dGhpcy5wcmV2PW51bGw7dGhpcy5zdGVpbmVyPSExfWZ1bmN0aW9uIFRyKGIsZSxoLG0pe2Zvcih2YXIgdT0wLHc9aC1tO2U8aDtlKz1tKXUrPShiW3ddLWJbZV0pKihiW2UrMV0rYlt3KzFdKSx3PWU7cmV0dXJuIHV9ZnVuY3Rpb24gVG4oYil7dmFyIGU9Yi5sZW5ndGg7MjxlJiZiW2UtMV0uZXF1YWxzKGJbMF0pJiZiLnBvcCgpfWZ1bmN0aW9uIFVuKGIsZSl7Zm9yKHZhciBoPTA7aDxlLmxlbmd0aDtoKyspYi5wdXNoKGVbaF0ueCksYi5wdXNoKGVbaF0ueSl9ZnVuY3Rpb24gU2UoYixlKXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iRXh0cnVkZUdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3NoYXBlczpiLG9wdGlvbnM6ZX07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IHpkKGIsCmUpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiB6ZChiLGUpe2Z1bmN0aW9uIGgoRyl7ZnVuY3Rpb24gSihTYSxqYixxYil7amJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0Iik7cmV0dXJuIGpiLmNsb25lKCkubXVsdGlwbHlTY2FsYXIocWIpLmFkZChTYSl9ZnVuY3Rpb24gUShTYSxqYixxYil7dmFyIHRiPVNhLngtamIueDt2YXIgeGI9U2EueS1qYi55O3ZhciBXYj1xYi54LVNhLng7dmFyIGljPXFiLnktU2EueSxKYz10Yip0Yit4Yip4YjtpZihNYXRoLmFicyh0YippYy14YipXYik+TnVtYmVyLkVQU0lMT04pe3ZhciB5ZD1NYXRoLnNxcnQoSmMpLGJkPU1hdGguc3FydChXYipXYitpYyppYyk7SmM9amIueC14Yi95ZDtqYj1qYi55K3RiL3lkO2ljPSgocWIueC1pYy9iZC1KYykqaWMtKHFiLnkrV2IvYmQtamIpKldiKS8odGIqaWMteGIqV2IpO1diPUpjK3RiKmljLVNhLng7dGI9amIreGIqaWMtU2EueTt4Yj1XYioKV2IrdGIqdGI7aWYoMj49eGIpcmV0dXJuIG5ldyBkKFdiLHRiKTt4Yj1NYXRoLnNxcnQoeGIvMil9ZWxzZSBTYT0hMSx0Yj5OdW1iZXIuRVBTSUxPTj9XYj5OdW1iZXIuRVBTSUxPTiYmKFNhPSEwKTp0YjwtTnVtYmVyLkVQU0lMT04/V2I8LU51bWJlci5FUFNJTE9OJiYoU2E9ITApOk1hdGguc2lnbih4Yik9PT1NYXRoLnNpZ24oaWMpJiYoU2E9ITApLFNhPyhXYj0teGIseGI9TWF0aC5zcXJ0KEpjKSk6KFdiPXRiLHRiPXhiLHhiPU1hdGguc3FydChKYy8yKSk7cmV0dXJuIG5ldyBkKFdiL3hiLHRiL3hiKX1mdW5jdGlvbiBTKFNhLGpiKXtmb3Ioa2E9U2EubGVuZ3RoOzA8PS0ta2E7KXt2YXIgcWI9a2E7dmFyIHRiPWthLTE7MD50YiYmKHRiPVNhLmxlbmd0aC0xKTt2YXIgeGIsV2I9cmErMipXYTtmb3IoeGI9MDt4YjxXYjt4YisrKXt2YXIgaWM9JGEqeGIsSmM9JGEqKHhiKzEpO1goamIrcWIraWMsamIrdGIraWMsamIrdGIrSmMsamIrcWIrSmMpfX19ZnVuY3Rpb24gVChTYSxqYixxYil7c2EucHVzaChTYSk7CnNhLnB1c2goamIpO3NhLnB1c2gocWIpfWZ1bmN0aW9uIFcoU2EsamIscWIpe2lhKFNhKTtpYShqYik7aWEocWIpO1NhPXUubGVuZ3RoLzM7U2E9SWEuZ2VuZXJhdGVUb3BVVihtLHUsU2EtMyxTYS0yLFNhLTEpO2hhKFNhWzBdKTtoYShTYVsxXSk7aGEoU2FbMl0pfWZ1bmN0aW9uIFgoU2EsamIscWIsdGIpe2lhKFNhKTtpYShqYik7aWEodGIpO2lhKGpiKTtpYShxYik7aWEodGIpO1NhPXUubGVuZ3RoLzM7U2E9SWEuZ2VuZXJhdGVTaWRlV2FsbFVWKG0sdSxTYS02LFNhLTMsU2EtMixTYS0xKTtoYShTYVswXSk7aGEoU2FbMV0pO2hhKFNhWzNdKTtoYShTYVsxXSk7aGEoU2FbMl0pO2hhKFNhWzNdKX1mdW5jdGlvbiBpYShTYSl7dS5wdXNoKHNhWzMqU2FdKTt1LnB1c2goc2FbMypTYSsxXSk7dS5wdXNoKHNhWzMqU2ErMl0pfWZ1bmN0aW9uIGhhKFNhKXt3LnB1c2goU2EueCk7dy5wdXNoKFNhLnkpfXZhciBzYT1bXSxxYT12b2lkIDAhPT1lLmN1cnZlU2VnbWVudHM/ZS5jdXJ2ZVNlZ21lbnRzOgoxMixyYT12b2lkIDAhPT1lLnN0ZXBzP2Uuc3RlcHM6MSx3YT12b2lkIDAhPT1lLmRlcHRoP2UuZGVwdGg6MTAwLHBhPXZvaWQgMCE9PWUuYmV2ZWxFbmFibGVkP2UuYmV2ZWxFbmFibGVkOiEwLHZhPXZvaWQgMCE9PWUuYmV2ZWxUaGlja25lc3M/ZS5iZXZlbFRoaWNrbmVzczo2LENhPXZvaWQgMCE9PWUuYmV2ZWxTaXplP2UuYmV2ZWxTaXplOnZhLTIsVmE9dm9pZCAwIT09ZS5iZXZlbE9mZnNldD9lLmJldmVsT2Zmc2V0OjAsV2E9dm9pZCAwIT09ZS5iZXZlbFNlZ21lbnRzP2UuYmV2ZWxTZWdtZW50czozLERhPWUuZXh0cnVkZVBhdGgsSWE9dm9pZCAwIT09ZS5VVkdlbmVyYXRvcj9lLlVWR2VuZXJhdG9yOmhzO3ZvaWQgMCE9PWUuYW1vdW50JiYoY29uc29sZS53YXJuKCJUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IGFtb3VudCBoYXMgYmVlbiByZW5hbWVkIHRvIGRlcHRoLiIpLHdhPWUuYW1vdW50KTt2YXIgRWE9ITE7aWYoRGEpe3ZhciBPYT1EYS5nZXRTcGFjZWRQb2ludHMocmEpOwpFYT0hMDtwYT0hMTt2YXIgaGI9RGEuY29tcHV0ZUZyZW5ldEZyYW1lcyhyYSwhMSk7dmFyIHliPW5ldyBnO3ZhciBMYT1uZXcgZzt2YXIgZWI9bmV3IGd9cGF8fChWYT1DYT12YT1XYT0wKTt2YXIgbmI7cWE9Ry5leHRyYWN0UG9pbnRzKHFhKTtHPXFhLnNoYXBlO3ZhciBOYj1xYS5ob2xlcztpZighT2QuaXNDbG9ja1dpc2UoRykpe0c9Ry5yZXZlcnNlKCk7dmFyIERiPTA7Zm9yKG5iPU5iLmxlbmd0aDtEYjxuYjtEYisrKXt2YXIgamE9TmJbRGJdO09kLmlzQ2xvY2tXaXNlKGphKSYmKE5iW0RiXT1qYS5yZXZlcnNlKCkpfX12YXIgb2E9T2QudHJpYW5ndWxhdGVTaGFwZShHLE5iKSxBYT1HO0RiPTA7Zm9yKG5iPU5iLmxlbmd0aDtEYjxuYjtEYisrKWphPU5iW0RiXSxHPUcuY29uY2F0KGphKTt2YXIgS2EsJGE9Ry5sZW5ndGgsUGEsZmI9b2EubGVuZ3RoO3FhPVtdO3ZhciBrYT0wO3ZhciBIYT1BYS5sZW5ndGg7dmFyIE5hPUhhLTE7Zm9yKEthPWthKzE7a2E8SGE7a2ErKyxOYSsrLEthKyspTmE9PT0KSGEmJihOYT0wKSxLYT09PUhhJiYoS2E9MCkscWFba2FdPVEoQWFba2FdLEFhW05hXSxBYVtLYV0pO0RhPVtdO3ZhciByYj1xYS5jb25jYXQoKTtEYj0wO2ZvcihuYj1OYi5sZW5ndGg7RGI8bmI7RGIrKyl7amE9TmJbRGJdO3ZhciBYYT1bXTtrYT0wO0hhPWphLmxlbmd0aDtOYT1IYS0xO2ZvcihLYT1rYSsxO2thPEhhO2thKyssTmErKyxLYSsrKU5hPT09SGEmJihOYT0wKSxLYT09PUhhJiYoS2E9MCksWGFba2FdPVEoamFba2FdLGphW05hXSxqYVtLYV0pO0RhLnB1c2goWGEpO3JiPXJiLmNvbmNhdChYYSl9Zm9yKE5hPTA7TmE8V2E7TmErKyl7SGE9TmEvV2E7dmFyIG1iPXZhKk1hdGguY29zKEhhKk1hdGguUEkvMik7S2E9Q2EqTWF0aC5zaW4oSGEqTWF0aC5QSS8yKStWYTtrYT0wO2ZvcihIYT1BYS5sZW5ndGg7a2E8SGE7a2ErKyl7dmFyIG9iPUooQWFba2FdLHFhW2thXSxLYSk7VChvYi54LG9iLnksLW1iKX1EYj0wO2ZvcihuYj1OYi5sZW5ndGg7RGI8bmI7RGIrKylmb3IoamE9Ck5iW0RiXSxYYT1EYVtEYl0sa2E9MCxIYT1qYS5sZW5ndGg7a2E8SGE7a2ErKylvYj1KKGphW2thXSxYYVtrYV0sS2EpLFQob2IueCxvYi55LC1tYil9S2E9Q2ErVmE7Zm9yKGthPTA7a2E8JGE7a2ErKylvYj1wYT9KKEdba2FdLHJiW2thXSxLYSk6R1trYV0sRWE/KExhLmNvcHkoaGIubm9ybWFsc1swXSkubXVsdGlwbHlTY2FsYXIob2IueCkseWIuY29weShoYi5iaW5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKG9iLnkpLGViLmNvcHkoT2FbMF0pLmFkZChMYSkuYWRkKHliKSxUKGViLngsZWIueSxlYi56KSk6VChvYi54LG9iLnksMCk7Zm9yKEhhPTE7SGE8PXJhO0hhKyspZm9yKGthPTA7a2E8JGE7a2ErKylvYj1wYT9KKEdba2FdLHJiW2thXSxLYSk6R1trYV0sRWE/KExhLmNvcHkoaGIubm9ybWFsc1tIYV0pLm11bHRpcGx5U2NhbGFyKG9iLngpLHliLmNvcHkoaGIuYmlub3JtYWxzW0hhXSkubXVsdGlwbHlTY2FsYXIob2IueSksZWIuY29weShPYVtIYV0pLmFkZChMYSkuYWRkKHliKSwKVChlYi54LGViLnksZWIueikpOlQob2IueCxvYi55LHdhL3JhKkhhKTtmb3IoTmE9V2EtMTswPD1OYTtOYS0tKXtIYT1OYS9XYTttYj12YSpNYXRoLmNvcyhIYSpNYXRoLlBJLzIpO0thPUNhKk1hdGguc2luKEhhKk1hdGguUEkvMikrVmE7a2E9MDtmb3IoSGE9QWEubGVuZ3RoO2thPEhhO2thKyspb2I9SihBYVtrYV0scWFba2FdLEthKSxUKG9iLngsb2IueSx3YSttYik7RGI9MDtmb3IobmI9TmIubGVuZ3RoO0RiPG5iO0RiKyspZm9yKGphPU5iW0RiXSxYYT1EYVtEYl0sa2E9MCxIYT1qYS5sZW5ndGg7a2E8SGE7a2ErKylvYj1KKGphW2thXSxYYVtrYV0sS2EpLEVhP1Qob2IueCxvYi55K09hW3JhLTFdLnksT2FbcmEtMV0ueCttYik6VChvYi54LG9iLnksd2ErbWIpfShmdW5jdGlvbigpe3ZhciBTYT11Lmxlbmd0aC8zO2lmKHBhKXt2YXIgamI9MCokYTtmb3Ioa2E9MDtrYTxmYjtrYSsrKVBhPW9hW2thXSxXKFBhWzJdK2piLFBhWzFdK2piLFBhWzBdK2piKTtqYj0kYSoocmErMipXYSk7CmZvcihrYT0wO2thPGZiO2thKyspUGE9b2Fba2FdLFcoUGFbMF0ramIsUGFbMV0ramIsUGFbMl0ramIpfWVsc2V7Zm9yKGthPTA7a2E8ZmI7a2ErKylQYT1vYVtrYV0sVyhQYVsyXSxQYVsxXSxQYVswXSk7Zm9yKGthPTA7a2E8ZmI7a2ErKylQYT1vYVtrYV0sVyhQYVswXSskYSpyYSxQYVsxXSskYSpyYSxQYVsyXSskYSpyYSl9bS5hZGRHcm91cChTYSx1Lmxlbmd0aC8zLVNhLDApfSkoKTsoZnVuY3Rpb24oKXt2YXIgU2E9dS5sZW5ndGgvMyxqYj0wO1MoQWEsamIpO2piKz1BYS5sZW5ndGg7RGI9MDtmb3IobmI9TmIubGVuZ3RoO0RiPG5iO0RiKyspamE9TmJbRGJdLFMoamEsamIpLGpiKz1qYS5sZW5ndGg7bS5hZGRHcm91cChTYSx1Lmxlbmd0aC8zLVNhLDEpfSkoKX14YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iRXh0cnVkZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3NoYXBlczpiLG9wdGlvbnM6ZX07Yj1BcnJheS5pc0FycmF5KGIpP2I6W2JdO2Zvcih2YXIgbT10aGlzLAp1PVtdLHc9W10sQT0wLEU9Yi5sZW5ndGg7QTxFO0ErKyloKGJbQV0pO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGRhKHUsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGRhKHcsMikpO3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKX1mdW5jdGlvbiBWbihiLGUsaCl7aC5zaGFwZXM9W107aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIG09MCx1PWIubGVuZ3RoO208dTttKyspaC5zaGFwZXMucHVzaChiW21dLnV1aWQpO2Vsc2UgaC5zaGFwZXMucHVzaChiLnV1aWQpO3ZvaWQgMCE9PWUuZXh0cnVkZVBhdGgmJihoLm9wdGlvbnMuZXh0cnVkZVBhdGg9ZS5leHRydWRlUGF0aC50b0pTT04oKSk7cmV0dXJuIGh9ZnVuY3Rpb24gdmgoYixlKXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVGV4dEdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3RleHQ6YixwYXJhbWV0ZXJzOmV9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBYZihiLGUpKTt0aGlzLm1lcmdlVmVydGljZXMoKX0KZnVuY3Rpb24gWGYoYixlKXtlPWV8fHt9O3ZhciBoPWUuZm9udDtpZighaHx8IWguaXNGb250KXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5UZXh0R2VvbWV0cnk6IGZvbnQgcGFyYW1ldGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5Gb250LiIpLG5ldyB6YTtiPWguZ2VuZXJhdGVTaGFwZXMoYixlLnNpemUpO2UuZGVwdGg9dm9pZCAwIT09ZS5oZWlnaHQ/ZS5oZWlnaHQ6NTA7dm9pZCAwPT09ZS5iZXZlbFRoaWNrbmVzcyYmKGUuYmV2ZWxUaGlja25lc3M9MTApO3ZvaWQgMD09PWUuYmV2ZWxTaXplJiYoZS5iZXZlbFNpemU9OCk7dm9pZCAwPT09ZS5iZXZlbEVuYWJsZWQmJihlLmJldmVsRW5hYmxlZD0hMSk7emQuY2FsbCh0aGlzLGIsZSk7dGhpcy50eXBlPSJUZXh0QnVmZmVyR2VvbWV0cnkifWZ1bmN0aW9uIHdoKGIsZSxoLG0sdSx3LEEpe3phLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcGhlcmVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6Yix3aWR0aFNlZ21lbnRzOmUsCmhlaWdodFNlZ21lbnRzOmgscGhpU3RhcnQ6bSxwaGlMZW5ndGg6dSx0aGV0YVN0YXJ0OncsdGhldGFMZW5ndGg6QX07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IHNlKGIsZSxoLG0sdSx3LEEpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBzZShiLGUsaCxtLHUsdyxBKXt4YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU3BoZXJlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmIsd2lkdGhTZWdtZW50czplLGhlaWdodFNlZ21lbnRzOmgscGhpU3RhcnQ6bSxwaGlMZW5ndGg6dSx0aGV0YVN0YXJ0OncsdGhldGFMZW5ndGg6QX07Yj1ifHwxO2U9TWF0aC5tYXgoMyxNYXRoLmZsb29yKGUpfHw4KTtoPU1hdGgubWF4KDIsTWF0aC5mbG9vcihoKXx8Nik7bT12b2lkIDAhPT1tP206MDt1PXZvaWQgMCE9PXU/dToyKk1hdGguUEk7dz12b2lkIDAhPT13P3c6MDtBPXZvaWQgMCE9PUE/QTpNYXRoLlBJO3ZhciBFPU1hdGgubWluKHcrQSxNYXRoLlBJKSxHLApKLFE9MCxTPVtdLFQ9bmV3IGcsVz1uZXcgZyxYPVtdLGlhPVtdLGhhPVtdLHNhPVtdO2ZvcihKPTA7Sjw9aDtKKyspe3ZhciBxYT1bXSxyYT1KL2gsd2E9MDswPT1KJiYwPT13P3dhPS41L2U6Sj09aCYmRT09TWF0aC5QSSYmKHdhPS0uNS9lKTtmb3IoRz0wO0c8PWU7RysrKXt2YXIgcGE9Ry9lO1QueD0tYipNYXRoLmNvcyhtK3BhKnUpKk1hdGguc2luKHcrcmEqQSk7VC55PWIqTWF0aC5jb3ModytyYSpBKTtULno9YipNYXRoLnNpbihtK3BhKnUpKk1hdGguc2luKHcrcmEqQSk7aWEucHVzaChULngsVC55LFQueik7Vy5jb3B5KFQpLm5vcm1hbGl6ZSgpO2hhLnB1c2goVy54LFcueSxXLnopO3NhLnB1c2gocGErd2EsMS1yYSk7cWEucHVzaChRKyspfVMucHVzaChxYSl9Zm9yKEo9MDtKPGg7SisrKWZvcihHPTA7RzxlO0crKyliPVNbSl1bRysxXSxtPVNbSl1bR10sdT1TW0orMV1bR10sQT1TW0orMV1bRysxXSwoMCE9PUp8fDA8dykmJlgucHVzaChiLG0sQSksKEohPT1oLTF8fEU8TWF0aC5QSSkmJgpYLnB1c2gobSx1LEEpO3RoaXMuc2V0SW5kZXgoWCk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgZGEoaWEsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBkYShoYSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgZGEoc2EsMikpfWZ1bmN0aW9uIHhoKGIsZSxoLG0sdSx3KXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUmluZ0dlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e2lubmVyUmFkaXVzOmIsb3V0ZXJSYWRpdXM6ZSx0aGV0YVNlZ21lbnRzOmgscGhpU2VnbWVudHM6bSx0aGV0YVN0YXJ0OnUsdGhldGFMZW5ndGg6d307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFlmKGIsZSxoLG0sdSx3KSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gWWYoYixlLGgsbSx1LHcpe3hhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJSaW5nQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17aW5uZXJSYWRpdXM6YixvdXRlclJhZGl1czplLHRoZXRhU2VnbWVudHM6aCwKcGhpU2VnbWVudHM6bSx0aGV0YVN0YXJ0OnUsdGhldGFMZW5ndGg6d307Yj1ifHwuNTtlPWV8fDE7dT12b2lkIDAhPT11P3U6MDt3PXZvaWQgMCE9PXc/dzoyKk1hdGguUEk7aD12b2lkIDAhPT1oP01hdGgubWF4KDMsaCk6ODttPXZvaWQgMCE9PW0/TWF0aC5tYXgoMSxtKToxO3ZhciBBPVtdLEU9W10sRz1bXSxKPVtdLFE9YixTPShlLWIpL20sVD1uZXcgZyxXPW5ldyBkLFgsaWE7Zm9yKFg9MDtYPD1tO1grKyl7Zm9yKGlhPTA7aWE8PWg7aWErKyliPXUraWEvaCp3LFQueD1RKk1hdGguY29zKGIpLFQueT1RKk1hdGguc2luKGIpLEUucHVzaChULngsVC55LFQueiksRy5wdXNoKDAsMCwxKSxXLng9KFQueC9lKzEpLzIsVy55PShULnkvZSsxKS8yLEoucHVzaChXLngsVy55KTtRKz1TfWZvcihYPTA7WDxtO1grKylmb3IoZT1YKihoKzEpLGlhPTA7aWE8aDtpYSsrKWI9aWErZSx1PWIraCsxLHc9YitoKzIsUT1iKzEsQS5wdXNoKGIsdSxRKSxBLnB1c2godSx3LFEpO3RoaXMuc2V0SW5kZXgoQSk7CnRoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGRhKEUsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBkYShHLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBkYShKLDIpKX1mdW5jdGlvbiB5aChiLGUsaCxtKXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTGF0aGVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtwb2ludHM6YixzZWdtZW50czplLHBoaVN0YXJ0OmgscGhpTGVuZ3RoOm19O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBaZihiLGUsaCxtKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gWmYoYixlLGgsbSl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxhdGhlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cG9pbnRzOmIsc2VnbWVudHM6ZSxwaGlTdGFydDpoLHBoaUxlbmd0aDptfTtlPU1hdGguZmxvb3IoZSl8fDEyO2g9aHx8MDttPW18fDIqTWF0aC5QSTttPWxiLmNsYW1wKG0sMCwyKk1hdGguUEkpO3ZhciB1PQpbXSx3PVtdLEE9W10sRT0xL2UsRz1uZXcgZyxKPW5ldyBkLFE7Zm9yKFE9MDtRPD1lO1ErKyl7dmFyIFM9aCtRKkUqbTt2YXIgVD1NYXRoLnNpbihTKSxXPU1hdGguY29zKFMpO2ZvcihTPTA7Uzw9Yi5sZW5ndGgtMTtTKyspRy54PWJbU10ueCpULEcueT1iW1NdLnksRy56PWJbU10ueCpXLHcucHVzaChHLngsRy55LEcueiksSi54PVEvZSxKLnk9Uy8oYi5sZW5ndGgtMSksQS5wdXNoKEoueCxKLnkpfWZvcihRPTA7UTxlO1ErKylmb3IoUz0wO1M8Yi5sZW5ndGgtMTtTKyspaD1TK1EqYi5sZW5ndGgsRT1oK2IubGVuZ3RoLEc9aCtiLmxlbmd0aCsxLEo9aCsxLHUucHVzaChoLEUsSiksdS5wdXNoKEUsRyxKKTt0aGlzLnNldEluZGV4KHUpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGRhKHcsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGRhKEEsMikpO3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtpZihtPT09MipNYXRoLlBJKWZvcihtPXRoaXMuYXR0cmlidXRlcy5ub3JtYWwuYXJyYXksCnU9bmV3IGcsdz1uZXcgZyxBPW5ldyBnLGg9ZSpiLmxlbmd0aCozLFM9UT0wO1E8Yi5sZW5ndGg7USsrLFMrPTMpdS54PW1bUyswXSx1Lnk9bVtTKzFdLHUuej1tW1MrMl0sdy54PW1baCtTKzBdLHcueT1tW2grUysxXSx3Lno9bVtoK1MrMl0sQS5hZGRWZWN0b3JzKHUsdykubm9ybWFsaXplKCksbVtTKzBdPW1baCtTKzBdPUEueCxtW1MrMV09bVtoK1MrMV09QS55LG1bUysyXT1tW2grUysyXT1BLnp9ZnVuY3Rpb24gVGUoYixlKXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU2hhcGVHZW9tZXRyeSI7Im9iamVjdCI9PT10eXBlb2YgZSYmKGNvbnNvbGUud2FybigiVEhSRUUuU2hhcGVHZW9tZXRyeTogT3B0aW9ucyBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVtb3ZlZC4iKSxlPWUuY3VydmVTZWdtZW50cyk7dGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6YixjdXJ2ZVNlZ21lbnRzOmV9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBVZShiLGUpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBVZShiLAplKXtmdW5jdGlvbiBoKFEpe3ZhciBTLFQ9dS5sZW5ndGgvMztRPVEuZXh0cmFjdFBvaW50cyhlKTt2YXIgVz1RLnNoYXBlLFg9US5ob2xlczshMT09PU9kLmlzQ2xvY2tXaXNlKFcpJiYoVz1XLnJldmVyc2UoKSk7UT0wO2ZvcihTPVgubGVuZ3RoO1E8UztRKyspe3ZhciBpYT1YW1FdOyEwPT09T2QuaXNDbG9ja1dpc2UoaWEpJiYoWFtRXT1pYS5yZXZlcnNlKCkpfXZhciBoYT1PZC50cmlhbmd1bGF0ZVNoYXBlKFcsWCk7UT0wO2ZvcihTPVgubGVuZ3RoO1E8UztRKyspaWE9WFtRXSxXPVcuY29uY2F0KGlhKTtRPTA7Zm9yKFM9Vy5sZW5ndGg7UTxTO1ErKylpYT1XW1FdLHUucHVzaChpYS54LGlhLnksMCksdy5wdXNoKDAsMCwxKSxBLnB1c2goaWEueCxpYS55KTtRPTA7Zm9yKFM9aGEubGVuZ3RoO1E8UztRKyspVz1oYVtRXSxtLnB1c2goV1swXStULFdbMV0rVCxXWzJdK1QpLEcrPTN9eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYXBlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz0Ke3NoYXBlczpiLGN1cnZlU2VnbWVudHM6ZX07ZT1lfHwxMjt2YXIgbT1bXSx1PVtdLHc9W10sQT1bXSxFPTAsRz0wO2lmKCExPT09QXJyYXkuaXNBcnJheShiKSloKGIpO2Vsc2UgZm9yKHZhciBKPTA7SjxiLmxlbmd0aDtKKyspaChiW0pdKSx0aGlzLmFkZEdyb3VwKEUsRyxKKSxFKz1HLEc9MDt0aGlzLnNldEluZGV4KG0pO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGRhKHUsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBkYSh3LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBkYShBLDIpKX1mdW5jdGlvbiBXbihiLGUpe2Uuc2hhcGVzPVtdO2lmKEFycmF5LmlzQXJyYXkoYikpZm9yKHZhciBoPTAsbT1iLmxlbmd0aDtoPG07aCsrKWUuc2hhcGVzLnB1c2goYltoXS51dWlkKTtlbHNlIGUuc2hhcGVzLnB1c2goYi51dWlkKTtyZXR1cm4gZX1mdW5jdGlvbiAkZihiLGUpe3hhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJFZGdlc0dlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9Cnt0aHJlc2hvbGRBbmdsZTplfTt2YXIgaD1bXTtlPU1hdGguY29zKGxiLkRFRzJSQUQqKHZvaWQgMCE9PWU/ZToxKSk7dmFyIG09WzAsMF0sdT17fSx3PVsiYSIsImIiLCJjIl07aWYoYi5pc0J1ZmZlckdlb21ldHJ5KXt2YXIgQT1uZXcgemE7QS5mcm9tQnVmZmVyR2VvbWV0cnkoYil9ZWxzZSBBPWIuY2xvbmUoKTtBLm1lcmdlVmVydGljZXMoKTtBLmNvbXB1dGVGYWNlTm9ybWFscygpO2I9QS52ZXJ0aWNlcztBPUEuZmFjZXM7Zm9yKHZhciBFPTAsRz1BLmxlbmd0aDtFPEc7RSsrKWZvcih2YXIgSj1BW0VdLFE9MDszPlE7USsrKXt2YXIgUz1KW3dbUV1dO3ZhciBUPUpbd1soUSsxKSUzXV07bVswXT1NYXRoLm1pbihTLFQpO21bMV09TWF0aC5tYXgoUyxUKTtTPW1bMF0rIiwiK21bMV07dm9pZCAwPT09dVtTXT91W1NdPXtpbmRleDE6bVswXSxpbmRleDI6bVsxXSxmYWNlMTpFLGZhY2UyOnZvaWQgMH06dVtTXS5mYWNlMj1FfWZvcihTIGluIHUpaWYobT11W1NdLHZvaWQgMD09PW0uZmFjZTJ8fApBW20uZmFjZTFdLm5vcm1hbC5kb3QoQVttLmZhY2UyXS5ub3JtYWwpPD1lKXc9YlttLmluZGV4MV0saC5wdXNoKHcueCx3Lnksdy56KSx3PWJbbS5pbmRleDJdLGgucHVzaCh3Lngsdy55LHcueik7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgZGEoaCwzKSl9ZnVuY3Rpb24gVmUoYixlLGgsbSx1LHcsQSxFKXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ3lsaW5kZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXNUb3A6YixyYWRpdXNCb3R0b206ZSxoZWlnaHQ6aCxyYWRpYWxTZWdtZW50czptLGhlaWdodFNlZ21lbnRzOnUsb3BlbkVuZGVkOncsdGhldGFTdGFydDpBLHRoZXRhTGVuZ3RoOkV9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBQZChiLGUsaCxtLHUsdyxBLEUpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBQZChiLGUsaCxtLHUsdyxBLEUpe2Z1bmN0aW9uIEcocWEpe3ZhciByYSx3YT1uZXcgZCxwYT1uZXcgZyx2YT0wLENhPSEwPT09CnFhP2I6ZSxWYT0hMD09PXFhPzE6LTE7dmFyIFdhPVg7Zm9yKHJhPTE7cmE8PW07cmErKylTLnB1c2goMCxoYSpWYSwwKSxULnB1c2goMCxWYSwwKSxXLnB1c2goLjUsLjUpLFgrKzt2YXIgRGE9WDtmb3IocmE9MDtyYTw9bTtyYSsrKXt2YXIgSWE9cmEvbSpFK0EsRWE9TWF0aC5jb3MoSWEpO0lhPU1hdGguc2luKElhKTtwYS54PUNhKklhO3BhLnk9aGEqVmE7cGEuej1DYSpFYTtTLnB1c2gocGEueCxwYS55LHBhLnopO1QucHVzaCgwLFZhLDApO3dhLng9LjUqRWErLjU7d2EueT0uNSpJYSpWYSsuNTtXLnB1c2god2EueCx3YS55KTtYKyt9Zm9yKHJhPTA7cmE8bTtyYSsrKXdhPVdhK3JhLHBhPURhK3JhLCEwPT09cWE/US5wdXNoKHBhLHBhKzEsd2EpOlEucHVzaChwYSsxLHBhLHdhKSx2YSs9MztKLmFkZEdyb3VwKHNhLHZhLCEwPT09cWE/MToyKTtzYSs9dmF9eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN5bGluZGVyQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzVG9wOmIsCnJhZGl1c0JvdHRvbTplLGhlaWdodDpoLHJhZGlhbFNlZ21lbnRzOm0saGVpZ2h0U2VnbWVudHM6dSxvcGVuRW5kZWQ6dyx0aGV0YVN0YXJ0OkEsdGhldGFMZW5ndGg6RX07dmFyIEo9dGhpcztiPXZvaWQgMCE9PWI/YjoxO2U9dm9pZCAwIT09ZT9lOjE7aD1ofHwxO209TWF0aC5mbG9vcihtKXx8ODt1PU1hdGguZmxvb3IodSl8fDE7dz12b2lkIDAhPT13P3c6ITE7QT12b2lkIDAhPT1BP0E6MDtFPXZvaWQgMCE9PUU/RToyKk1hdGguUEk7dmFyIFE9W10sUz1bXSxUPVtdLFc9W10sWD0wLGlhPVtdLGhhPWgvMixzYT0wOyhmdW5jdGlvbigpe3ZhciBxYSxyYSx3YT1uZXcgZyxwYT1uZXcgZyx2YT0wLENhPShlLWIpL2g7Zm9yKHJhPTA7cmE8PXU7cmErKyl7dmFyIFZhPVtdLFdhPXJhL3UsRGE9V2EqKGUtYikrYjtmb3IocWE9MDtxYTw9bTtxYSsrKXt2YXIgSWE9cWEvbSxFYT1JYSpFK0EsT2E9TWF0aC5zaW4oRWEpO0VhPU1hdGguY29zKEVhKTtwYS54PURhKk9hO3BhLnk9LVdhKmgraGE7CnBhLno9RGEqRWE7Uy5wdXNoKHBhLngscGEueSxwYS56KTt3YS5zZXQoT2EsQ2EsRWEpLm5vcm1hbGl6ZSgpO1QucHVzaCh3YS54LHdhLnksd2Eueik7Vy5wdXNoKElhLDEtV2EpO1ZhLnB1c2goWCsrKX1pYS5wdXNoKFZhKX1mb3IocWE9MDtxYTxtO3FhKyspZm9yKHJhPTA7cmE8dTtyYSsrKXdhPWlhW3JhKzFdW3FhXSxwYT1pYVtyYSsxXVtxYSsxXSxDYT1pYVtyYV1bcWErMV0sUS5wdXNoKGlhW3JhXVtxYV0sd2EsQ2EpLFEucHVzaCh3YSxwYSxDYSksdmErPTY7Si5hZGRHcm91cChzYSx2YSwwKTtzYSs9dmF9KSgpOyExPT09dyYmKDA8YiYmRyghMCksMDxlJiZHKCExKSk7dGhpcy5zZXRJbmRleChRKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBkYShTLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgZGEoVCwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgZGEoVywyKSl9ZnVuY3Rpb24gemgoYixlLGgsbSx1LHcsQSl7VmUuY2FsbCh0aGlzLAowLGIsZSxoLG0sdSx3LEEpO3RoaXMudHlwZT0iQ29uZUdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLGhlaWdodDplLHJhZGlhbFNlZ21lbnRzOmgsaGVpZ2h0U2VnbWVudHM6bSxvcGVuRW5kZWQ6dSx0aGV0YVN0YXJ0OncsdGhldGFMZW5ndGg6QX19ZnVuY3Rpb24gQWgoYixlLGgsbSx1LHcsQSl7UGQuY2FsbCh0aGlzLDAsYixlLGgsbSx1LHcsQSk7dGhpcy50eXBlPSJDb25lQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmIsaGVpZ2h0OmUscmFkaWFsU2VnbWVudHM6aCxoZWlnaHRTZWdtZW50czptLG9wZW5FbmRlZDp1LHRoZXRhU3RhcnQ6dyx0aGV0YUxlbmd0aDpBfX1mdW5jdGlvbiBCaChiLGUsaCxtKXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ2lyY2xlR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmIsc2VnbWVudHM6ZSx0aGV0YVN0YXJ0OmgsdGhldGFMZW5ndGg6bX07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IGFnKGIsCmUsaCxtKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gYWcoYixlLGgsbSl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkNpcmNsZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLHNlZ21lbnRzOmUsdGhldGFTdGFydDpoLHRoZXRhTGVuZ3RoOm19O2I9Ynx8MTtlPXZvaWQgMCE9PWU/TWF0aC5tYXgoMyxlKTo4O2g9dm9pZCAwIT09aD9oOjA7bT12b2lkIDAhPT1tP206MipNYXRoLlBJO3ZhciB1PVtdLHc9W10sQT1bXSxFPVtdLEcsSj1uZXcgZyxRPW5ldyBkO3cucHVzaCgwLDAsMCk7QS5wdXNoKDAsMCwxKTtFLnB1c2goLjUsLjUpO3ZhciBTPTA7Zm9yKEc9MztTPD1lO1MrKyxHKz0zKXt2YXIgVD1oK1MvZSptO0oueD1iKk1hdGguY29zKFQpO0oueT1iKk1hdGguc2luKFQpO3cucHVzaChKLngsSi55LEoueik7QS5wdXNoKDAsMCwxKTtRLng9KHdbR10vYisxKS8yO1EueT0od1tHKzFdL2IrMSkvMjtFLnB1c2goUS54LFEueSl9Zm9yKEc9MTtHPD0KZTtHKyspdS5wdXNoKEcsRysxLDApO3RoaXMuc2V0SW5kZXgodSk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgZGEodywzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGRhKEEsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGRhKEUsMikpfWZ1bmN0aW9uIFdlKGIpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYWRvd01hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDApO3RoaXMudHJhbnNwYXJlbnQ9ITA7dGhpcy5zZXRWYWx1ZXMoYil9ZnVuY3Rpb24gYmcoYil7dWIuY2FsbCh0aGlzLGIpO3RoaXMudHlwZT0iUmF3U2hhZGVyTWF0ZXJpYWwifWZ1bmN0aW9uIEFkKGIpe00uY2FsbCh0aGlzKTt0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIifTt0aGlzLnR5cGU9Ik1lc2hTdGFuZGFyZE1hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLm1ldGFsbmVzcz10aGlzLnJvdWdobmVzcz0uNTt0aGlzLmxpZ2h0TWFwPXRoaXMubWFwPQpudWxsO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9MTt0aGlzLmFvTWFwPW51bGw7dGhpcy5hb01hcEludGVuc2l0eT0xO3RoaXMuZW1pc3NpdmU9bmV3IEkoMCk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xO3RoaXMuYnVtcE1hcD10aGlzLmVtaXNzaXZlTWFwPW51bGw7dGhpcy5idW1wU2NhbGU9MTt0aGlzLm5vcm1hbE1hcD1udWxsO3RoaXMubm9ybWFsTWFwVHlwZT0wO3RoaXMubm9ybWFsU2NhbGU9bmV3IGQoMSwxKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLmVudk1hcD10aGlzLmFscGhhTWFwPXRoaXMubWV0YWxuZXNzTWFwPXRoaXMucm91Z2huZXNzTWFwPW51bGw7dGhpcy5lbnZNYXBJbnRlbnNpdHk9MTt0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTg7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWNhcD0KInJvdW5kIjt0aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPSExO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uIFhlKGIpe0FkLmNhbGwodGhpcyk7dGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIixQSFlTSUNBTDoiIn07dGhpcy50eXBlPSJNZXNoUGh5c2ljYWxNYXRlcmlhbCI7dGhpcy5yZWZsZWN0aXZpdHk9LjU7dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3M9dGhpcy5jbGVhcmNvYXQ9MDt0aGlzLnNoZWVuPW51bGw7dGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZT1uZXcgZCgxLDEpO3RoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwPW51bGw7dGhpcy50cmFuc3BhcmVuY3k9MDt0aGlzLnNldFZhbHVlcyhiKX1mdW5jdGlvbiBkZChiKXtNLmNhbGwodGhpcyk7dGhpcy50eXBlPSJNZXNoUGhvbmdNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSSgxNjc3NzIxNSk7dGhpcy5zcGVjdWxhcj1uZXcgSSgxMTE4NDgxKTt0aGlzLnNoaW5pbmVzcz0zMDt0aGlzLmxpZ2h0TWFwPQp0aGlzLm1hcD1udWxsO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9MTt0aGlzLmFvTWFwPW51bGw7dGhpcy5hb01hcEludGVuc2l0eT0xO3RoaXMuZW1pc3NpdmU9bmV3IEkoMCk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xO3RoaXMuYnVtcE1hcD10aGlzLmVtaXNzaXZlTWFwPW51bGw7dGhpcy5idW1wU2NhbGU9MTt0aGlzLm5vcm1hbE1hcD1udWxsO3RoaXMubm9ybWFsTWFwVHlwZT0wO3RoaXMubm9ybWFsU2NhbGU9bmV3IGQoMSwxKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLmVudk1hcD10aGlzLmFscGhhTWFwPXRoaXMuc3BlY3VsYXJNYXA9bnVsbDt0aGlzLmNvbWJpbmU9MDt0aGlzLnJlZmxlY3Rpdml0eT0xO3RoaXMucmVmcmFjdGlvblJhdGlvPS45ODt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMud2lyZWZyYW1lTGluZWpvaW49dGhpcy53aXJlZnJhbWVMaW5lY2FwPQoicm91bmQiO3RoaXMubW9ycGhOb3JtYWxzPXRoaXMubW9ycGhUYXJnZXRzPXRoaXMuc2tpbm5pbmc9ITE7dGhpcy5zZXRWYWx1ZXMoYil9ZnVuY3Rpb24gWWUoYil7ZGQuY2FsbCh0aGlzKTt0aGlzLmRlZmluZXM9e1RPT046IiJ9O3RoaXMudHlwZT0iTWVzaFRvb25NYXRlcmlhbCI7dGhpcy5ncmFkaWVudE1hcD1udWxsO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uIFplKGIpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hOb3JtYWxNYXRlcmlhbCI7dGhpcy5idW1wTWFwPW51bGw7dGhpcy5idW1wU2NhbGU9MTt0aGlzLm5vcm1hbE1hcD1udWxsO3RoaXMubm9ybWFsTWFwVHlwZT0wO3RoaXMubm9ybWFsU2NhbGU9bmV3IGQoMSwxKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMubW9ycGhOb3JtYWxzPXRoaXMubW9ycGhUYXJnZXRzPQp0aGlzLnNraW5uaW5nPXRoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uICRlKGIpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hMYW1iZXJ0TWF0ZXJpYWwiO3RoaXMuY29sb3I9bmV3IEkoMTY3NzcyMTUpO3RoaXMubGlnaHRNYXA9dGhpcy5tYXA9bnVsbDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTE7dGhpcy5hb01hcD1udWxsO3RoaXMuYW9NYXBJbnRlbnNpdHk9MTt0aGlzLmVtaXNzaXZlPW5ldyBJKDApO3RoaXMuZW1pc3NpdmVJbnRlbnNpdHk9MTt0aGlzLmVudk1hcD10aGlzLmFscGhhTWFwPXRoaXMuc3BlY3VsYXJNYXA9dGhpcy5lbWlzc2l2ZU1hcD1udWxsO3RoaXMuY29tYmluZT0wO3RoaXMucmVmbGVjdGl2aXR5PTE7dGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4O3RoaXMud2lyZWZyYW1lPSExO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPTE7dGhpcy53aXJlZnJhbWVMaW5lam9pbj10aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIjsKdGhpcy5tb3JwaE5vcm1hbHM9dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLnNldFZhbHVlcyhiKX1mdW5jdGlvbiBhZihiKXtNLmNhbGwodGhpcyk7dGhpcy5kZWZpbmVzPXtNQVRDQVA6IiJ9O3RoaXMudHlwZT0iTWVzaE1hdGNhcE1hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLmJ1bXBNYXA9dGhpcy5tYXA9dGhpcy5tYXRjYXA9bnVsbDt0aGlzLmJ1bXBTY2FsZT0xO3RoaXMubm9ybWFsTWFwPW51bGw7dGhpcy5ub3JtYWxNYXBUeXBlPTA7dGhpcy5ub3JtYWxTY2FsZT1uZXcgZCgxLDEpO3RoaXMuZGlzcGxhY2VtZW50TWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz0wO3RoaXMuYWxwaGFNYXA9bnVsbDt0aGlzLmxpZ2h0cz10aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPSExO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uIGJmKGIpe09iLmNhbGwodGhpcyk7CnRoaXMudHlwZT0iTGluZURhc2hlZE1hdGVyaWFsIjt0aGlzLnNjYWxlPTE7dGhpcy5kYXNoU2l6ZT0zO3RoaXMuZ2FwU2l6ZT0xO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uIEtjKGIsZSxoLG0pe3RoaXMucGFyYW1ldGVyUG9zaXRpb25zPWI7dGhpcy5fY2FjaGVkSW5kZXg9MDt0aGlzLnJlc3VsdEJ1ZmZlcj12b2lkIDAhPT1tP206bmV3IGUuY29uc3RydWN0b3IoaCk7dGhpcy5zYW1wbGVWYWx1ZXM9ZTt0aGlzLnZhbHVlU2l6ZT1ofWZ1bmN0aW9uIEJpKGIsZSxoLG0pe0tjLmNhbGwodGhpcyxiLGUsaCxtKTt0aGlzLl9vZmZzZXROZXh0PXRoaXMuX3dlaWdodE5leHQ9dGhpcy5fb2Zmc2V0UHJldj10aGlzLl93ZWlnaHRQcmV2PS0wfWZ1bmN0aW9uIENoKGIsZSxoLG0pe0tjLmNhbGwodGhpcyxiLGUsaCxtKX1mdW5jdGlvbiBDaShiLGUsaCxtKXtLYy5jYWxsKHRoaXMsYixlLGgsbSl9ZnVuY3Rpb24gb2MoYixlLGgsbSl7aWYodm9pZCAwPT09Yil0aHJvdyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgbmFtZSBpcyB1bmRlZmluZWQiKTsKaWYodm9pZCAwPT09ZXx8MD09PWUubGVuZ3RoKXRocm93IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBubyBrZXlmcmFtZXMgaW4gdHJhY2sgbmFtZWQgIitiKTt0aGlzLm5hbWU9Yjt0aGlzLnRpbWVzPWpjLmNvbnZlcnRBcnJheShlLHRoaXMuVGltZUJ1ZmZlclR5cGUpO3RoaXMudmFsdWVzPWpjLmNvbnZlcnRBcnJheShoLHRoaXMuVmFsdWVCdWZmZXJUeXBlKTt0aGlzLnNldEludGVycG9sYXRpb24obXx8dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil9ZnVuY3Rpb24gRGkoYixlLGgpe29jLmNhbGwodGhpcyxiLGUsaCl9ZnVuY3Rpb24gRWkoYixlLGgsbSl7b2MuY2FsbCh0aGlzLGIsZSxoLG0pfWZ1bmN0aW9uIGNnKGIsZSxoLG0pe29jLmNhbGwodGhpcyxiLGUsaCxtKX1mdW5jdGlvbiBGaShiLGUsaCxtKXtLYy5jYWxsKHRoaXMsYixlLGgsbSl9ZnVuY3Rpb24gRGgoYixlLGgsbSl7b2MuY2FsbCh0aGlzLGIsZSxoLG0pfWZ1bmN0aW9uIEdpKGIsZSxoLG0pe29jLmNhbGwodGhpcywKYixlLGgsbSl9ZnVuY3Rpb24gZGcoYixlLGgsbSl7b2MuY2FsbCh0aGlzLGIsZSxoLG0pfWZ1bmN0aW9uIFJjKGIsZSxoKXt0aGlzLm5hbWU9Yjt0aGlzLnRyYWNrcz1oO3RoaXMuZHVyYXRpb249dm9pZCAwIT09ZT9lOi0xO3RoaXMudXVpZD1sYi5nZW5lcmF0ZVVVSUQoKTswPnRoaXMuZHVyYXRpb24mJnRoaXMucmVzZXREdXJhdGlvbigpfWZ1bmN0aW9uIGlzKGIpe3N3aXRjaChiLnRvTG93ZXJDYXNlKCkpe2Nhc2UgInNjYWxhciI6Y2FzZSAiZG91YmxlIjpjYXNlICJmbG9hdCI6Y2FzZSAibnVtYmVyIjpjYXNlICJpbnRlZ2VyIjpyZXR1cm4gY2c7Y2FzZSAidmVjdG9yIjpjYXNlICJ2ZWN0b3IyIjpjYXNlICJ2ZWN0b3IzIjpjYXNlICJ2ZWN0b3I0IjpyZXR1cm4gZGc7Y2FzZSAiY29sb3IiOnJldHVybiBFaTtjYXNlICJxdWF0ZXJuaW9uIjpyZXR1cm4gRGg7Y2FzZSAiYm9vbCI6Y2FzZSAiYm9vbGVhbiI6cmV0dXJuIERpO2Nhc2UgInN0cmluZyI6cmV0dXJuIEdpfXRocm93IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBVbnN1cHBvcnRlZCB0eXBlTmFtZTogIisKYik7fWZ1bmN0aW9uIGpzKGIpe2lmKHZvaWQgMD09PWIudHlwZSl0aHJvdyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgdHlwZSB1bmRlZmluZWQsIGNhbiBub3QgcGFyc2UiKTt2YXIgZT1pcyhiLnR5cGUpO2lmKHZvaWQgMD09PWIudGltZXMpe3ZhciBoPVtdLG09W107amMuZmxhdHRlbkpTT04oYi5rZXlzLGgsbSwidmFsdWUiKTtiLnRpbWVzPWg7Yi52YWx1ZXM9bX1yZXR1cm4gdm9pZCAwIT09ZS5wYXJzZT9lLnBhcnNlKGIpOm5ldyBlKGIubmFtZSxiLnRpbWVzLGIudmFsdWVzLGIuaW50ZXJwb2xhdGlvbil9ZnVuY3Rpb24gRGsoYixlLGgpe3ZhciBtPXRoaXMsdT0hMSx3PTAsQT0wLEU9dm9pZCAwO3RoaXMub25TdGFydD12b2lkIDA7dGhpcy5vbkxvYWQ9Yjt0aGlzLm9uUHJvZ3Jlc3M9ZTt0aGlzLm9uRXJyb3I9aDt0aGlzLml0ZW1TdGFydD1mdW5jdGlvbihHKXtBKys7aWYoITE9PT11JiZ2b2lkIDAhPT1tLm9uU3RhcnQpbS5vblN0YXJ0KEcsdyxBKTt1PSEwfTsKdGhpcy5pdGVtRW5kPWZ1bmN0aW9uKEcpe3crKztpZih2b2lkIDAhPT1tLm9uUHJvZ3Jlc3MpbS5vblByb2dyZXNzKEcsdyxBKTtpZih3PT09QSYmKHU9ITEsdm9pZCAwIT09bS5vbkxvYWQpKW0ub25Mb2FkKCl9O3RoaXMuaXRlbUVycm9yPWZ1bmN0aW9uKEcpe2lmKHZvaWQgMCE9PW0ub25FcnJvciltLm9uRXJyb3IoRyl9O3RoaXMucmVzb2x2ZVVSTD1mdW5jdGlvbihHKXtyZXR1cm4gRT9FKEcpOkd9O3RoaXMuc2V0VVJMTW9kaWZpZXI9ZnVuY3Rpb24oRyl7RT1HO3JldHVybiB0aGlzfX1mdW5jdGlvbiBLYihiKXt0aGlzLm1hbmFnZXI9dm9pZCAwIT09Yj9iOlhuO3RoaXMuY3Jvc3NPcmlnaW49ImFub255bW91cyI7dGhpcy5yZXNvdXJjZVBhdGg9dGhpcy5wYXRoPSIifWZ1bmN0aW9uIFNjKGIpe0tiLmNhbGwodGhpcyxiKX1mdW5jdGlvbiBFayhiKXtLYi5jYWxsKHRoaXMsYil9ZnVuY3Rpb24gRmsoYil7S2IuY2FsbCh0aGlzLGIpO3RoaXMuX3BhcnNlcj1udWxsfWZ1bmN0aW9uIEhpKGIpe0tiLmNhbGwodGhpcywKYik7dGhpcy5fcGFyc2VyPW51bGx9ZnVuY3Rpb24gZWcoYil7S2IuY2FsbCh0aGlzLGIpfWZ1bmN0aW9uIElpKGIpe0tiLmNhbGwodGhpcyxiKX1mdW5jdGlvbiBKaShiKXtLYi5jYWxsKHRoaXMsYil9ZnVuY3Rpb24gYWIoKXt0aGlzLnR5cGU9IkN1cnZlIjt0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz0yMDB9ZnVuY3Rpb24gTGMoYixlLGgsbSx1LHcsQSxFKXthYi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iRWxsaXBzZUN1cnZlIjt0aGlzLmFYPWJ8fDA7dGhpcy5hWT1lfHwwO3RoaXMueFJhZGl1cz1ofHwxO3RoaXMueVJhZGl1cz1tfHwxO3RoaXMuYVN0YXJ0QW5nbGU9dXx8MDt0aGlzLmFFbmRBbmdsZT13fHwyKk1hdGguUEk7dGhpcy5hQ2xvY2t3aXNlPUF8fCExO3RoaXMuYVJvdGF0aW9uPUV8fDB9ZnVuY3Rpb24gZmcoYixlLGgsbSx1LHcpe0xjLmNhbGwodGhpcyxiLGUsaCxoLG0sdSx3KTt0aGlzLnR5cGU9IkFyY0N1cnZlIn1mdW5jdGlvbiBHaygpe2Z1bmN0aW9uIGIodyxBLEUsCkcpe2U9dztoPUU7bT0tMyp3KzMqQS0yKkUtRzt1PTIqdy0yKkErRStHfXZhciBlPTAsaD0wLG09MCx1PTA7cmV0dXJue2luaXRDYXRtdWxsUm9tOmZ1bmN0aW9uKHcsQSxFLEcsSil7YihBLEUsSiooRS13KSxKKihHLUEpKX0saW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tOmZ1bmN0aW9uKHcsQSxFLEcsSixRLFMpe2IoQSxFLCgoQS13KS9KLShFLXcpLyhKK1EpKyhFLUEpL1EpKlEsKChFLUEpL1EtKEctQSkvKFErUykrKEctRSkvUykqUSl9LGNhbGM6ZnVuY3Rpb24odyl7dmFyIEE9dyp3O3JldHVybiBlK2gqdyttKkErdSpBKnd9fX1mdW5jdGlvbiB1YyhiLGUsaCxtKXthYi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ2F0bXVsbFJvbUN1cnZlMyI7dGhpcy5wb2ludHM9Ynx8W107dGhpcy5jbG9zZWQ9ZXx8ITE7dGhpcy5jdXJ2ZVR5cGU9aHx8ImNlbnRyaXBldGFsIjt0aGlzLnRlbnNpb249bXx8LjV9ZnVuY3Rpb24gWW4oYixlLGgsbSx1KXtlPS41KihtLWUpO3U9LjUqKHUtaCk7dmFyIHc9CmIqYjtyZXR1cm4oMipoLTIqbStlK3UpKmIqdysoLTMqaCszKm0tMiplLXUpKncrZSpiK2h9ZnVuY3Rpb24ga3MoYixlKXtiPTEtYjtyZXR1cm4gYipiKmV9ZnVuY3Rpb24gbHMoYixlKXtyZXR1cm4gMiooMS1iKSpiKmV9ZnVuY3Rpb24gbXMoYixlKXtyZXR1cm4gYipiKmV9ZnVuY3Rpb24gRWgoYixlLGgsbSl7cmV0dXJuIGtzKGIsZSkrbHMoYixoKSttcyhiLG0pfWZ1bmN0aW9uIG5zKGIsZSl7Yj0xLWI7cmV0dXJuIGIqYipiKmV9ZnVuY3Rpb24gb3MoYixlKXt2YXIgaD0xLWI7cmV0dXJuIDMqaCpoKmIqZX1mdW5jdGlvbiBwcyhiLGUpe3JldHVybiAzKigxLWIpKmIqYiplfWZ1bmN0aW9uIHFzKGIsZSl7cmV0dXJuIGIqYipiKmV9ZnVuY3Rpb24gRmgoYixlLGgsbSx1KXtyZXR1cm4gbnMoYixlKStvcyhiLGgpK3BzKGIsbSkrcXMoYix1KX1mdW5jdGlvbiBlZChiLGUsaCxtKXthYi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ3ViaWNCZXppZXJDdXJ2ZSI7dGhpcy52MD1ifHxuZXcgZDsKdGhpcy52MT1lfHxuZXcgZDt0aGlzLnYyPWh8fG5ldyBkO3RoaXMudjM9bXx8bmV3IGR9ZnVuY3Rpb24gQmQoYixlLGgsbSl7YWIuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUzIjt0aGlzLnYwPWJ8fG5ldyBnO3RoaXMudjE9ZXx8bmV3IGc7dGhpcy52Mj1ofHxuZXcgZzt0aGlzLnYzPW18fG5ldyBnfWZ1bmN0aW9uIEdjKGIsZSl7YWIuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpbmVDdXJ2ZSI7dGhpcy52MT1ifHxuZXcgZDt0aGlzLnYyPWV8fG5ldyBkfWZ1bmN0aW9uIGZkKGIsZSl7YWIuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpbmVDdXJ2ZTMiO3RoaXMudjE9Ynx8bmV3IGc7dGhpcy52Mj1lfHxuZXcgZ31mdW5jdGlvbiBnZChiLGUsaCl7YWIuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlF1YWRyYXRpY0JlemllckN1cnZlIjt0aGlzLnYwPWJ8fG5ldyBkO3RoaXMudjE9ZXx8bmV3IGQ7dGhpcy52Mj1ofHxuZXcgZH1mdW5jdGlvbiBDZChiLGUsaCl7YWIuY2FsbCh0aGlzKTsKdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiO3RoaXMudjA9Ynx8bmV3IGc7dGhpcy52MT1lfHxuZXcgZzt0aGlzLnYyPWh8fG5ldyBnfWZ1bmN0aW9uIGhkKGIpe2FiLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcGxpbmVDdXJ2ZSI7dGhpcy5wb2ludHM9Ynx8W119ZnVuY3Rpb24gUWQoKXthYi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ3VydmVQYXRoIjt0aGlzLmN1cnZlcz1bXTt0aGlzLmF1dG9DbG9zZT0hMX1mdW5jdGlvbiBpZChiKXtRZC5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGF0aCI7dGhpcy5jdXJyZW50UG9pbnQ9bmV3IGQ7YiYmdGhpcy5zZXRGcm9tUG9pbnRzKGIpfWZ1bmN0aW9uIHRlKGIpe2lkLmNhbGwodGhpcyxiKTt0aGlzLnV1aWQ9bGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy50eXBlPSJTaGFwZSI7dGhpcy5ob2xlcz1bXX1mdW5jdGlvbiBVYihiLGUpe3kuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpZ2h0Ijt0aGlzLmNvbG9yPW5ldyBJKGIpO3RoaXMuaW50ZW5zaXR5PQp2b2lkIDAhPT1lP2U6MTt0aGlzLnJlY2VpdmVTaGFkb3c9dm9pZCAwfWZ1bmN0aW9uIEtpKGIsZSxoKXtVYi5jYWxsKHRoaXMsYixoKTt0aGlzLnR5cGU9IkhlbWlzcGhlcmVMaWdodCI7dGhpcy5jYXN0U2hhZG93PXZvaWQgMDt0aGlzLnBvc2l0aW9uLmNvcHkoeS5EZWZhdWx0VXApO3RoaXMudXBkYXRlTWF0cml4KCk7dGhpcy5ncm91bmRDb2xvcj1uZXcgSShlKX1mdW5jdGlvbiBEZChiKXt0aGlzLmNhbWVyYT1iO3RoaXMuYmlhcz0wO3RoaXMucmFkaXVzPTE7dGhpcy5tYXBTaXplPW5ldyBkKDUxMiw1MTIpO3RoaXMubWFwUGFzcz10aGlzLm1hcD1udWxsO3RoaXMubWF0cml4PW5ldyByO3RoaXMuX2ZydXN0dW09bmV3IEVjO3RoaXMuX2ZyYW1lRXh0ZW50cz1uZXcgZCgxLDEpO3RoaXMuX3ZpZXdwb3J0Q291bnQ9MTt0aGlzLl92aWV3cG9ydHM9W25ldyBuKDAsMCwxLDEpXX1mdW5jdGlvbiBMaSgpe0RkLmNhbGwodGhpcyxuZXcgQWIoNTAsMSwuNSw1MDApKX1mdW5jdGlvbiBNaShiLAplLGgsbSx1LHcpe1ViLmNhbGwodGhpcyxiLGUpO3RoaXMudHlwZT0iU3BvdExpZ2h0Ijt0aGlzLnBvc2l0aW9uLmNvcHkoeS5EZWZhdWx0VXApO3RoaXMudXBkYXRlTWF0cml4KCk7dGhpcy50YXJnZXQ9bmV3IHk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInBvd2VyIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW50ZW5zaXR5Kk1hdGguUEl9LHNldDpmdW5jdGlvbihBKXt0aGlzLmludGVuc2l0eT1BL01hdGguUEl9fSk7dGhpcy5kaXN0YW5jZT12b2lkIDAhPT1oP2g6MDt0aGlzLmFuZ2xlPXZvaWQgMCE9PW0/bTpNYXRoLlBJLzM7dGhpcy5wZW51bWJyYT12b2lkIDAhPT11P3U6MDt0aGlzLmRlY2F5PXZvaWQgMCE9PXc/dzoxO3RoaXMuc2hhZG93PW5ldyBMaX1mdW5jdGlvbiBIaygpe0RkLmNhbGwodGhpcyxuZXcgQWIoOTAsMSwuNSw1MDApKTt0aGlzLl9mcmFtZUV4dGVudHM9bmV3IGQoNCwyKTt0aGlzLl92aWV3cG9ydENvdW50PTY7dGhpcy5fdmlld3BvcnRzPVtuZXcgbigyLAoxLDEsMSksbmV3IG4oMCwxLDEsMSksbmV3IG4oMywxLDEsMSksbmV3IG4oMSwxLDEsMSksbmV3IG4oMywwLDEsMSksbmV3IG4oMSwwLDEsMSldO3RoaXMuX2N1YmVEaXJlY3Rpb25zPVtuZXcgZygxLDAsMCksbmV3IGcoLTEsMCwwKSxuZXcgZygwLDAsMSksbmV3IGcoMCwwLC0xKSxuZXcgZygwLDEsMCksbmV3IGcoMCwtMSwwKV07dGhpcy5fY3ViZVVwcz1bbmV3IGcoMCwxLDApLG5ldyBnKDAsMSwwKSxuZXcgZygwLDEsMCksbmV3IGcoMCwxLDApLG5ldyBnKDAsMCwxKSxuZXcgZygwLDAsLTEpXX1mdW5jdGlvbiBOaShiLGUsaCxtKXtVYi5jYWxsKHRoaXMsYixlKTt0aGlzLnR5cGU9IlBvaW50TGlnaHQiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwb3dlciIse2dldDpmdW5jdGlvbigpe3JldHVybiA0KnRoaXMuaW50ZW5zaXR5Kk1hdGguUEl9LHNldDpmdW5jdGlvbih1KXt0aGlzLmludGVuc2l0eT11Lyg0Kk1hdGguUEkpfX0pO3RoaXMuZGlzdGFuY2U9dm9pZCAwIT09aD8KaDowO3RoaXMuZGVjYXk9dm9pZCAwIT09bT9tOjE7dGhpcy5zaGFkb3c9bmV3IEhrfWZ1bmN0aW9uIEdoKGIsZSxoLG0sdSx3KXtGYi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iT3J0aG9ncmFwaGljQ2FtZXJhIjt0aGlzLnpvb209MTt0aGlzLnZpZXc9bnVsbDt0aGlzLmxlZnQ9dm9pZCAwIT09Yj9iOi0xO3RoaXMucmlnaHQ9dm9pZCAwIT09ZT9lOjE7dGhpcy50b3A9dm9pZCAwIT09aD9oOjE7dGhpcy5ib3R0b209dm9pZCAwIT09bT9tOi0xO3RoaXMubmVhcj12b2lkIDAhPT11P3U6LjE7dGhpcy5mYXI9dm9pZCAwIT09dz93OjJFMzt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1mdW5jdGlvbiBPaSgpe0RkLmNhbGwodGhpcyxuZXcgR2goLTUsNSw1LC01LC41LDUwMCkpfWZ1bmN0aW9uIFBpKGIsZSl7VWIuY2FsbCh0aGlzLGIsZSk7dGhpcy50eXBlPSJEaXJlY3Rpb25hbExpZ2h0Ijt0aGlzLnBvc2l0aW9uLmNvcHkoeS5EZWZhdWx0VXApO3RoaXMudXBkYXRlTWF0cml4KCk7CnRoaXMudGFyZ2V0PW5ldyB5O3RoaXMuc2hhZG93PW5ldyBPaX1mdW5jdGlvbiBRaShiLGUpe1ViLmNhbGwodGhpcyxiLGUpO3RoaXMudHlwZT0iQW1iaWVudExpZ2h0Ijt0aGlzLmNhc3RTaGFkb3c9dm9pZCAwfWZ1bmN0aW9uIFJpKGIsZSxoLG0pe1ViLmNhbGwodGhpcyxiLGUpO3RoaXMudHlwZT0iUmVjdEFyZWFMaWdodCI7dGhpcy53aWR0aD12b2lkIDAhPT1oP2g6MTA7dGhpcy5oZWlnaHQ9dm9pZCAwIT09bT9tOjEwfWZ1bmN0aW9uIFNpKGIpe0tiLmNhbGwodGhpcyxiKTt0aGlzLnRleHR1cmVzPXt9fWZ1bmN0aW9uIFRpKCl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ikluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5Ijt0aGlzLm1heEluc3RhbmNlZENvdW50PXZvaWQgMH1mdW5jdGlvbiBVaShiLGUsaCxtKXsibnVtYmVyIj09PXR5cGVvZiBoJiYobT1oLGg9ITEsY29uc29sZS5lcnJvcigiVEhSRUUuSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlOiBUaGUgY29uc3RydWN0b3Igbm93IGV4cGVjdHMgbm9ybWFsaXplZCBhcyB0aGUgdGhpcmQgYXJndW1lbnQuIikpOwpSLmNhbGwodGhpcyxiLGUsaCk7dGhpcy5tZXNoUGVyQXR0cmlidXRlPW18fDF9ZnVuY3Rpb24gVmkoYil7S2IuY2FsbCh0aGlzLGIpfWZ1bmN0aW9uIFdpKGIpe0tiLmNhbGwodGhpcyxiKX1mdW5jdGlvbiBJayhiKXsidW5kZWZpbmVkIj09PXR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcCYmY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogY3JlYXRlSW1hZ2VCaXRtYXAoKSBub3Qgc3VwcG9ydGVkLiIpOyJ1bmRlZmluZWQiPT09dHlwZW9mIGZldGNoJiZjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlQml0bWFwTG9hZGVyOiBmZXRjaCgpIG5vdCBzdXBwb3J0ZWQuIik7S2IuY2FsbCh0aGlzLGIpO3RoaXMub3B0aW9ucz12b2lkIDB9ZnVuY3Rpb24gSmsoKXt0aGlzLnR5cGU9IlNoYXBlUGF0aCI7dGhpcy5jb2xvcj1uZXcgSTt0aGlzLnN1YlBhdGhzPVtdO3RoaXMuY3VycmVudFBhdGg9bnVsbH1mdW5jdGlvbiBLayhiKXt0aGlzLnR5cGU9IkZvbnQiO3RoaXMuZGF0YT0KYn1mdW5jdGlvbiBycyhiLGUsaCl7Yj1BcnJheS5mcm9tP0FycmF5LmZyb20oYik6U3RyaW5nKGIpLnNwbGl0KCIiKTtlLz1oLnJlc29sdXRpb247Zm9yKHZhciBtPShoLmJvdW5kaW5nQm94LnlNYXgtaC5ib3VuZGluZ0JveC55TWluK2gudW5kZXJsaW5lVGhpY2tuZXNzKSplLHU9W10sdz0wLEE9MCxFPTA7RTxiLmxlbmd0aDtFKyspe3ZhciBHPWJbRV07IlxuIj09PUc/KHc9MCxBLT1tKTooRz1zcyhHLGUsdyxBLGgpLHcrPUcub2Zmc2V0WCx1LnB1c2goRy5wYXRoKSl9cmV0dXJuIHV9ZnVuY3Rpb24gc3MoYixlLGgsbSx1KXt2YXIgdz11LmdseXBoc1tiXXx8dS5nbHlwaHNbIj8iXTtpZih3KXtiPW5ldyBKaztpZih3Lm8pe3U9dy5fY2FjaGVkT3V0bGluZXx8KHcuX2NhY2hlZE91dGxpbmU9dy5vLnNwbGl0KCIgIikpO2Zvcih2YXIgQT0wLEU9dS5sZW5ndGg7QTxFOylzd2l0Y2godVtBKytdKXtjYXNlICJtIjp2YXIgRz11W0ErK10qZStoO3ZhciBKPXVbQSsrXSplK207Yi5tb3ZlVG8oRywKSik7YnJlYWs7Y2FzZSAibCI6Rz11W0ErK10qZStoO0o9dVtBKytdKmUrbTtiLmxpbmVUbyhHLEopO2JyZWFrO2Nhc2UgInEiOkc9dVtBKytdKmUraDtKPXVbQSsrXSplK207dmFyIFE9dVtBKytdKmUraDt2YXIgUz11W0ErK10qZSttO2IucXVhZHJhdGljQ3VydmVUbyhRLFMsRyxKKTticmVhaztjYXNlICJiIjpHPXVbQSsrXSplK2g7Sj11W0ErK10qZSttO1E9dVtBKytdKmUraDtTPXVbQSsrXSplK207dmFyIFQ9dVtBKytdKmUraDt2YXIgVz11W0ErK10qZSttO2IuYmV6aWVyQ3VydmVUbyhRLFMsVCxXLEcsSil9fXJldHVybntvZmZzZXRYOncuaGEqZSxwYXRoOmJ9fWNvbnNvbGUuZXJyb3IoJ1RIUkVFLkZvbnQ6IGNoYXJhY3RlciAiJytiKyciIGRvZXMgbm90IGV4aXN0cyBpbiBmb250IGZhbWlseSAnK3UuZmFtaWx5TmFtZSsiLiIpfWZ1bmN0aW9uIExrKGIpe0tiLmNhbGwodGhpcyxiKX1mdW5jdGlvbiBYaShiKXtLYi5jYWxsKHRoaXMsYil9ZnVuY3Rpb24gWWkoKXt0aGlzLmNvZWZmaWNpZW50cz0KW107Zm9yKHZhciBiPTA7OT5iO2IrKyl0aGlzLmNvZWZmaWNpZW50cy5wdXNoKG5ldyBnKX1mdW5jdGlvbiBqZChiLGUpe1ViLmNhbGwodGhpcyx2b2lkIDAsZSk7dGhpcy5zaD12b2lkIDAhPT1iP2I6bmV3IFlpfWZ1bmN0aW9uIE1rKGIsZSxoKXtqZC5jYWxsKHRoaXMsdm9pZCAwLGgpO2I9KG5ldyBJKS5zZXQoYik7aD0obmV3IEkpLnNldChlKTtlPW5ldyBnKGIucixiLmcsYi5iKTtiPW5ldyBnKGgucixoLmcsaC5iKTtoPU1hdGguc3FydChNYXRoLlBJKTt2YXIgbT1oKk1hdGguc3FydCguNzUpO3RoaXMuc2guY29lZmZpY2llbnRzWzBdLmNvcHkoZSkuYWRkKGIpLm11bHRpcGx5U2NhbGFyKGgpO3RoaXMuc2guY29lZmZpY2llbnRzWzFdLmNvcHkoZSkuc3ViKGIpLm11bHRpcGx5U2NhbGFyKG0pfWZ1bmN0aW9uIE5rKGIsZSl7amQuY2FsbCh0aGlzLHZvaWQgMCxlKTtiPShuZXcgSSkuc2V0KGIpO3RoaXMuc2guY29lZmZpY2llbnRzWzBdLnNldChiLnIsYi5nLGIuYikubXVsdGlwbHlTY2FsYXIoMioKTWF0aC5zcXJ0KE1hdGguUEkpKX1mdW5jdGlvbiBabigpe3RoaXMudHlwZT0iU3RlcmVvQ2FtZXJhIjt0aGlzLmFzcGVjdD0xO3RoaXMuZXllU2VwPS4wNjQ7dGhpcy5jYW1lcmFMPW5ldyBBYjt0aGlzLmNhbWVyYUwubGF5ZXJzLmVuYWJsZSgxKTt0aGlzLmNhbWVyYUwubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmNhbWVyYVI9bmV3IEFiO3RoaXMuY2FtZXJhUi5sYXllcnMuZW5hYmxlKDIpO3RoaXMuY2FtZXJhUi5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuX2NhY2hlPXtmb2N1czpudWxsLGZvdjpudWxsLGFzcGVjdDpudWxsLG5lYXI6bnVsbCxmYXI6bnVsbCx6b29tOm51bGwsZXllU2VwOm51bGx9fWZ1bmN0aW9uIE9rKGIpe3RoaXMuYXV0b1N0YXJ0PXZvaWQgMCE9PWI/YjohMDt0aGlzLmVsYXBzZWRUaW1lPXRoaXMub2xkVGltZT10aGlzLnN0YXJ0VGltZT0wO3RoaXMucnVubmluZz0hMX1mdW5jdGlvbiBQaygpe3kuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkF1ZGlvTGlzdGVuZXIiOwp0aGlzLmNvbnRleHQ9UWsuZ2V0Q29udGV4dCgpO3RoaXMuZ2Fpbj10aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO3RoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbik7dGhpcy5maWx0ZXI9bnVsbDt0aGlzLnRpbWVEZWx0YT0wO3RoaXMuX2Nsb2NrPW5ldyBPa31mdW5jdGlvbiBnZyhiKXt5LmNhbGwodGhpcyk7dGhpcy50eXBlPSJBdWRpbyI7dGhpcy5saXN0ZW5lcj1iO3RoaXMuY29udGV4dD1iLmNvbnRleHQ7dGhpcy5nYWluPXRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7dGhpcy5nYWluLmNvbm5lY3QoYi5nZXRJbnB1dCgpKTt0aGlzLmF1dG9wbGF5PSExO3RoaXMuYnVmZmVyPW51bGw7dGhpcy5kZXR1bmU9MDt0aGlzLmxvb3A9ITE7dGhpcy5vZmZzZXQ9dGhpcy5zdGFydFRpbWU9MDt0aGlzLmR1cmF0aW9uPXZvaWQgMDt0aGlzLnBsYXliYWNrUmF0ZT0xO3RoaXMuaXNQbGF5aW5nPSExO3RoaXMuaGFzUGxheWJhY2tDb250cm9sPSEwO3RoaXMuc291cmNlVHlwZT0KImVtcHR5Ijt0aGlzLmZpbHRlcnM9W119ZnVuY3Rpb24gUmsoYil7Z2cuY2FsbCh0aGlzLGIpO3RoaXMucGFubmVyPXRoaXMuY29udGV4dC5jcmVhdGVQYW5uZXIoKTt0aGlzLnBhbm5lci5wYW5uaW5nTW9kZWw9IkhSVEYiO3RoaXMucGFubmVyLmNvbm5lY3QodGhpcy5nYWluKX1mdW5jdGlvbiBTayhiLGUpe3RoaXMuYW5hbHlzZXI9Yi5jb250ZXh0LmNyZWF0ZUFuYWx5c2VyKCk7dGhpcy5hbmFseXNlci5mZnRTaXplPXZvaWQgMCE9PWU/ZToyMDQ4O3RoaXMuZGF0YT1uZXcgVWludDhBcnJheSh0aGlzLmFuYWx5c2VyLmZyZXF1ZW5jeUJpbkNvdW50KTtiLmdldE91dHB1dCgpLmNvbm5lY3QodGhpcy5hbmFseXNlcil9ZnVuY3Rpb24gVGsoYixlLGgpe3RoaXMuYmluZGluZz1iO3RoaXMudmFsdWVTaXplPWg7Yj1GbG9hdDY0QXJyYXk7c3dpdGNoKGUpe2Nhc2UgInF1YXRlcm5pb24iOmU9dGhpcy5fc2xlcnA7YnJlYWs7Y2FzZSAic3RyaW5nIjpjYXNlICJib29sIjpiPUFycmF5O2U9CnRoaXMuX3NlbGVjdDticmVhaztkZWZhdWx0OmU9dGhpcy5fbGVycH10aGlzLmJ1ZmZlcj1uZXcgYig0KmgpO3RoaXMuX21peEJ1ZmZlclJlZ2lvbj1lO3RoaXMucmVmZXJlbmNlQ291bnQ9dGhpcy51c2VDb3VudD10aGlzLmN1bXVsYXRpdmVXZWlnaHQ9MH1mdW5jdGlvbiAkbihiLGUsaCl7aD1ofHx2Yy5wYXJzZVRyYWNrTmFtZShlKTt0aGlzLl90YXJnZXRHcm91cD1iO3RoaXMuX2JpbmRpbmdzPWIuc3Vic2NyaWJlXyhlLGgpfWZ1bmN0aW9uIHZjKGIsZSxoKXt0aGlzLnBhdGg9ZTt0aGlzLnBhcnNlZFBhdGg9aHx8dmMucGFyc2VUcmFja05hbWUoZSk7dGhpcy5ub2RlPXZjLmZpbmROb2RlKGIsdGhpcy5wYXJzZWRQYXRoLm5vZGVOYW1lKXx8Yjt0aGlzLnJvb3ROb2RlPWJ9ZnVuY3Rpb24gYW8oKXt0aGlzLnV1aWQ9bGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy5fb2JqZWN0cz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubkNhY2hlZE9iamVjdHNfPTA7dmFyIGI9Cnt9O3RoaXMuX2luZGljZXNCeVVVSUQ9Yjtmb3IodmFyIGU9MCxoPWFyZ3VtZW50cy5sZW5ndGg7ZSE9PWg7KytlKWJbYXJndW1lbnRzW2VdLnV1aWRdPWU7dGhpcy5fcGF0aHM9W107dGhpcy5fcGFyc2VkUGF0aHM9W107dGhpcy5fYmluZGluZ3M9W107dGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoPXt9O3ZhciBtPXRoaXM7dGhpcy5zdGF0cz17b2JqZWN0czp7Z2V0IHRvdGFsKCl7cmV0dXJuIG0uX29iamVjdHMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gdGhpcy50b3RhbC1tLm5DYWNoZWRPYmplY3RzX319LGdldCBiaW5kaW5nc1Blck9iamVjdCgpe3JldHVybiBtLl9iaW5kaW5ncy5sZW5ndGh9fX1mdW5jdGlvbiBibyhiLGUsaCl7dGhpcy5fbWl4ZXI9Yjt0aGlzLl9jbGlwPWU7dGhpcy5fbG9jYWxSb290PWh8fG51bGw7Yj1lLnRyYWNrcztlPWIubGVuZ3RoO2g9QXJyYXkoZSk7Zm9yKHZhciBtPXtlbmRpbmdTdGFydDoyNDAwLGVuZGluZ0VuZDoyNDAwfSx1PTA7dSE9PQplOysrdSl7dmFyIHc9Ylt1XS5jcmVhdGVJbnRlcnBvbGFudChudWxsKTtoW3VdPXc7dy5zZXR0aW5ncz1tfXRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M9bTt0aGlzLl9pbnRlcnBvbGFudHM9aDt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzPUFycmF5KGUpO3RoaXMuX3dlaWdodEludGVycG9sYW50PXRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PXRoaXMuX2J5Q2xpcENhY2hlSW5kZXg9dGhpcy5fY2FjaGVJbmRleD1udWxsO3RoaXMubG9vcD0yMjAxO3RoaXMuX2xvb3BDb3VudD0tMTt0aGlzLl9zdGFydFRpbWU9bnVsbDt0aGlzLnRpbWU9MDt0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9dGhpcy53ZWlnaHQ9dGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlPXRoaXMudGltZVNjYWxlPTE7dGhpcy5yZXBldGl0aW9ucz1JbmZpbml0eTt0aGlzLnBhdXNlZD0hMTt0aGlzLmVuYWJsZWQ9ITA7dGhpcy5jbGFtcFdoZW5GaW5pc2hlZD0hMTt0aGlzLnplcm9TbG9wZUF0RW5kPXRoaXMuemVyb1Nsb3BlQXRTdGFydD0KITB9ZnVuY3Rpb24gVWsoYil7dGhpcy5fcm9vdD1iO3RoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCk7dGhpcy50aW1lPXRoaXMuX2FjY3VJbmRleD0wO3RoaXMudGltZVNjYWxlPTF9ZnVuY3Rpb24gWmkoYixlKXsic3RyaW5nIj09PXR5cGVvZiBiJiYoY29uc29sZS53YXJuKCJUSFJFRS5Vbmlmb3JtOiBUeXBlIHBhcmFtZXRlciBpcyBubyBsb25nZXIgbmVlZGVkLiIpLGI9ZSk7dGhpcy52YWx1ZT1ifWZ1bmN0aW9uIFZrKGIsZSxoKXtPZS5jYWxsKHRoaXMsYixlKTt0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9aHx8MX1mdW5jdGlvbiBjbyhiLGUsaCxtKXt0aGlzLnJheT1uZXcgRChiLGUpO3RoaXMubmVhcj1ofHwwO3RoaXMuZmFyPW18fEluZmluaXR5O3RoaXMuY2FtZXJhPW51bGw7dGhpcy5wYXJhbXM9e01lc2g6e30sTGluZTp7fSxMT0Q6e30sUG9pbnRzOnt0aHJlc2hvbGQ6MX0sU3ByaXRlOnt9fTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLnBhcmFtcyx7UG9pbnRDbG91ZDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5SYXljYXN0ZXI6IHBhcmFtcy5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gcGFyYW1zLlBvaW50cy4iKTsKcmV0dXJuIHRoaXMuUG9pbnRzfX19KX1mdW5jdGlvbiBlbyhiLGUpe3JldHVybiBiLmRpc3RhbmNlLWUuZGlzdGFuY2V9ZnVuY3Rpb24gV2soYixlLGgsbSl7aWYoITEhPT1iLnZpc2libGUmJihiLnJheWNhc3QoZSxoKSwhMD09PW0pKXtiPWIuY2hpbGRyZW47bT0wO2Zvcih2YXIgdT1iLmxlbmd0aDttPHU7bSsrKVdrKGJbbV0sZSxoLCEwKX19ZnVuY3Rpb24gZm8oYixlLGgpe3RoaXMucmFkaXVzPXZvaWQgMCE9PWI/YjoxO3RoaXMucGhpPXZvaWQgMCE9PWU/ZTowO3RoaXMudGhldGE9dm9pZCAwIT09aD9oOjA7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gZ28oYixlLGgpe3RoaXMucmFkaXVzPXZvaWQgMCE9PWI/YjoxO3RoaXMudGhldGE9dm9pZCAwIT09ZT9lOjA7dGhpcy55PXZvaWQgMCE9PWg/aDowO3JldHVybiB0aGlzfWZ1bmN0aW9uIFhrKGIsZSl7dGhpcy5taW49dm9pZCAwIT09Yj9iOm5ldyBkKEluZmluaXR5LEluZmluaXR5KTt0aGlzLm1heD12b2lkIDAhPT1lP2U6bmV3IGQoLUluZmluaXR5LAotSW5maW5pdHkpfWZ1bmN0aW9uIFlrKGIsZSl7dGhpcy5zdGFydD12b2lkIDAhPT1iP2I6bmV3IGc7dGhpcy5lbmQ9dm9pZCAwIT09ZT9lOm5ldyBnfWZ1bmN0aW9uIEhoKGIpe3kuY2FsbCh0aGlzKTt0aGlzLm1hdGVyaWFsPWI7dGhpcy5yZW5kZXI9ZnVuY3Rpb24oKXt9fWZ1bmN0aW9uIEloKGIsZSxoLG0pe3RoaXMub2JqZWN0PWI7dGhpcy5zaXplPXZvaWQgMCE9PWU/ZToxO2I9dm9pZCAwIT09aD9oOjE2NzExNjgwO209dm9pZCAwIT09bT9tOjE7ZT0wOyhoPXRoaXMub2JqZWN0Lmdlb21ldHJ5KSYmaC5pc0dlb21ldHJ5P2U9MypoLmZhY2VzLmxlbmd0aDpoJiZoLmlzQnVmZmVyR2VvbWV0cnkmJihlPWguYXR0cmlidXRlcy5ub3JtYWwuY291bnQpO2g9bmV3IHhhO2U9bmV3IGRhKDYqZSwzKTtoLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLGUpO1NiLmNhbGwodGhpcyxoLG5ldyBPYih7Y29sb3I6YixsaW5ld2lkdGg6bX0pKTt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy51cGRhdGUoKX0KZnVuY3Rpb24gaGcoYixlKXt5LmNhbGwodGhpcyk7dGhpcy5saWdodD1iO3RoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTt0aGlzLm1hdHJpeD1iLm1hdHJpeFdvcmxkO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmNvbG9yPWU7Yj1uZXcgeGE7ZT1bMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsLTEsMCwxLDAsMCwwLDAsMSwxLDAsMCwwLDAsLTEsMV07Zm9yKHZhciBoPTAsbT0xOzMyPmg7aCsrLG0rKyl7dmFyIHU9aC8zMipNYXRoLlBJKjIsdz1tLzMyKk1hdGguUEkqMjtlLnB1c2goTWF0aC5jb3ModSksTWF0aC5zaW4odSksMSxNYXRoLmNvcyh3KSxNYXRoLnNpbih3KSwxKX1iLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBkYShlLDMpKTtlPW5ldyBPYih7Zm9nOiExfSk7dGhpcy5jb25lPW5ldyBTYihiLGUpO3RoaXMuYWRkKHRoaXMuY29uZSk7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBobyhiKXt2YXIgZT1bXTtiJiZiLmlzQm9uZSYmZS5wdXNoKGIpOwpmb3IodmFyIGg9MDtoPGIuY2hpbGRyZW4ubGVuZ3RoO2grKyllLnB1c2guYXBwbHkoZSxobyhiLmNoaWxkcmVuW2hdKSk7cmV0dXJuIGV9ZnVuY3Rpb24gaWcoYil7Zm9yKHZhciBlPWhvKGIpLGg9bmV3IHhhLG09W10sdT1bXSx3PW5ldyBJKDAsMCwxKSxBPW5ldyBJKDAsMSwwKSxFPTA7RTxlLmxlbmd0aDtFKyspe3ZhciBHPWVbRV07Ry5wYXJlbnQmJkcucGFyZW50LmlzQm9uZSYmKG0ucHVzaCgwLDAsMCksbS5wdXNoKDAsMCwwKSx1LnB1c2gody5yLHcuZyx3LmIpLHUucHVzaChBLnIsQS5nLEEuYikpfWguYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGRhKG0sMykpO2guYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IGRhKHUsMykpO209bmV3IE9iKHt2ZXJ0ZXhDb2xvcnM6MixkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSx0cmFuc3BhcmVudDohMH0pO1NiLmNhbGwodGhpcyxoLG0pO3RoaXMucm9vdD1iO3RoaXMuYm9uZXM9ZTt0aGlzLm1hdHJpeD1iLm1hdHJpeFdvcmxkO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0KITF9ZnVuY3Rpb24gamcoYixlLGgpe3RoaXMubGlnaHQ9Yjt0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7dGhpcy5jb2xvcj1oO2I9bmV3IHNlKGUsNCwyKTtlPW5ldyBMKHt3aXJlZnJhbWU6ITAsZm9nOiExfSk7eWEuY2FsbCh0aGlzLGIsZSk7dGhpcy5tYXRyaXg9dGhpcy5saWdodC5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBrZyhiLGUpe3RoaXMudHlwZT0iUmVjdEFyZWFMaWdodEhlbHBlciI7dGhpcy5saWdodD1iO3RoaXMuY29sb3I9ZTtiPW5ldyB4YTtiLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBkYShbMSwxLDAsLTEsMSwwLC0xLC0xLDAsMSwtMSwwLDEsMSwwXSwzKSk7Yi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtlPW5ldyBPYih7Zm9nOiExfSk7bWMuY2FsbCh0aGlzLGIsZSk7Yj1uZXcgeGE7Yi5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgZGEoWzEsMSwwLC0xLDEsMCwtMSwtMSwwLAoxLDEsMCwtMSwtMSwwLDEsLTEsMF0sMykpO2IuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7dGhpcy5hZGQobmV3IHlhKGIsbmV3IEwoe3NpZGU6MSxmb2c6ITF9KSkpO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gbGcoYixlLGgpe3kuY2FsbCh0aGlzKTt0aGlzLmxpZ2h0PWI7dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO3RoaXMubWF0cml4PWIubWF0cml4V29ybGQ7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuY29sb3I9aDtiPW5ldyBQZShlKTtiLnJvdGF0ZVkoLjUqTWF0aC5QSSk7dGhpcy5tYXRlcmlhbD1uZXcgTCh7d2lyZWZyYW1lOiEwLGZvZzohMX0pO3ZvaWQgMD09PXRoaXMuY29sb3ImJih0aGlzLm1hdGVyaWFsLnZlcnRleENvbG9ycz0yKTtlPWIuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2IuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IFIobmV3IEZsb2F0MzJBcnJheSgzKmUuY291bnQpLDMpKTt0aGlzLmFkZChuZXcgeWEoYix0aGlzLm1hdGVyaWFsKSk7CnRoaXMudXBkYXRlKCl9ZnVuY3Rpb24gbWcoYixlKXt0aGlzLmxpZ2h0UHJvYmU9Yjt0aGlzLnNpemU9ZTtiPW5ldyB1Yih7ZGVmaW5lczp7R0FNTUFfT1VUUFVUOiIifSx1bmlmb3Jtczp7c2g6e3ZhbHVlOnRoaXMubGlnaHRQcm9iZS5zaC5jb2VmZmljaWVudHN9LGludGVuc2l0eTp7dmFsdWU6dGhpcy5saWdodFByb2JlLmludGVuc2l0eX19LHZlcnRleFNoYWRlcjoidmFyeWluZyB2ZWMzIHZOb3JtYWw7XG52b2lkIG1haW4oKSB7XG5cdHZOb3JtYWwgXHgzZCBub3JtYWxpemUoIG5vcm1hbE1hdHJpeCAqIG5vcm1hbCApO1xuXHRnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XG59IixmcmFnbWVudFNoYWRlcjoiI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2XG52ZWMzIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgbm9ybWFsLCBpbiBtYXQ0IG1hdHJpeCApIHtcblx0Ly8gbWF0cml4IGlzIGFzc3VtZWQgdG8gYmUgb3J0aG9nb25hbFxuXHRyZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQoIG5vcm1hbCwgMC4wICkgKiBtYXRyaXggKS54eXogKTtcbn1cbnZlYzMgbGluZWFyVG9PdXRwdXQoIGluIHZlYzMgYSApIHtcblx0I2lmZGVmIEdBTU1BX09VVFBVVFxuXHRcdHJldHVybiBwb3coIGEsIHZlYzMoIDEuMCAvIGZsb2F0KCBHQU1NQV9GQUNUT1IgKSApICk7XG5cdCNlbHNlXG5cdFx0cmV0dXJuIGE7XG5cdCNlbmRpZlxufVxuLy8gc291cmNlOiBodHRwczovL2dyYXBoaWNzLnN0YW5mb3JkLmVkdS9wYXBlcnMvZW52bWFwL2Vudm1hcC5wZGZcbnZlYzMgc2hHZXRJcnJhZGlhbmNlQXQoIGluIHZlYzMgbm9ybWFsLCBpbiB2ZWMzIHNoQ29lZmZpY2llbnRzWyA5IF0gKSB7XG5cdC8vIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGhhdmUgdW5pdCBsZW5ndGhcblx0ZmxvYXQgeCBceDNkIG5vcm1hbC54LCB5IFx4M2Qgbm9ybWFsLnksIHogXHgzZCBub3JtYWwuejtcblx0Ly8gYmFuZCAwXG5cdHZlYzMgcmVzdWx0IFx4M2Qgc2hDb2VmZmljaWVudHNbIDAgXSAqIDAuODg2MjI3O1xuXHQvLyBiYW5kIDFcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyAxIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgMiBdICogMi4wICogMC41MTE2NjQgKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDMgXSAqIDIuMCAqIDAuNTExNjY0ICogeDtcblx0Ly8gYmFuZCAyXG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNCBdICogMi4wICogMC40MjkwNDMgKiB4ICogeTtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA1IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHkgKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDYgXSAqICggMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNyBdICogMi4wICogMC40MjkwNDMgKiB4ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA4IF0gKiAwLjQyOTA0MyAqICggeCAqIHggLSB5ICogeSApO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxudW5pZm9ybSB2ZWMzIHNoWyA5IF07IC8vIHNoIGNvZWZmaWNpZW50c1xudW5pZm9ybSBmbG9hdCBpbnRlbnNpdHk7IC8vIGxpZ2h0IHByb2JlIGludGVuc2l0eVxudmFyeWluZyB2ZWMzIHZOb3JtYWw7XG52b2lkIG1haW4oKSB7XG5cdHZlYzMgbm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB2Tm9ybWFsICk7XG5cdHZlYzMgd29ybGROb3JtYWwgXHgzZCBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTtcblx0dmVjMyBpcnJhZGlhbmNlIFx4M2Qgc2hHZXRJcnJhZGlhbmNlQXQoIHdvcmxkTm9ybWFsLCBzaCApO1xuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCBSRUNJUFJPQ0FMX1BJICogaXJyYWRpYW5jZSAqIGludGVuc2l0eTtcblx0b3V0Z29pbmdMaWdodCBceDNkIGxpbmVhclRvT3V0cHV0KCBvdXRnb2luZ0xpZ2h0ICk7XG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIDEuMCApO1xufSJ9KTsKZT1uZXcgc2UoMSwzMiwxNik7eWEuY2FsbCh0aGlzLGUsYik7dGhpcy5vbkJlZm9yZVJlbmRlcigpfWZ1bmN0aW9uICRpKGIsZSxoLG0pe2I9Ynx8MTA7ZT1lfHwxMDtoPW5ldyBJKHZvaWQgMCE9PWg/aDo0NDczOTI0KTttPW5ldyBJKHZvaWQgMCE9PW0/bTo4OTQ3ODQ4KTt2YXIgdT1lLzIsdz1iL2UsQT1iLzI7Yj1bXTtmb3IodmFyIEU9W10sRz0wLEo9MCxRPS1BO0c8PWU7RysrLFErPXcpe2IucHVzaCgtQSwwLFEsQSwwLFEpO2IucHVzaChRLDAsLUEsUSwwLEEpO3ZhciBTPUc9PT11P2g6bTtTLnRvQXJyYXkoRSxKKTtKKz0zO1MudG9BcnJheShFLEopO0orPTM7Uy50b0FycmF5KEUsSik7Sis9MztTLnRvQXJyYXkoRSxKKTtKKz0zfWU9bmV3IHhhO2UuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGRhKGIsMykpO2UuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IGRhKEUsMykpO2g9bmV3IE9iKHt2ZXJ0ZXhDb2xvcnM6Mn0pO1NiLmNhbGwodGhpcyxlLGgpfWZ1bmN0aW9uIGFqKGIsCmUsaCxtLHUsdyl7Yj1ifHwxMDtlPWV8fDE2O2g9aHx8ODttPW18fDY0O3U9bmV3IEkodm9pZCAwIT09dT91OjQ0NzM5MjQpO3c9bmV3IEkodm9pZCAwIT09dz93Ojg5NDc4NDgpO3ZhciBBPVtdLEU9W10sRztmb3IoRz0wO0c8PWU7RysrKXt2YXIgSj1HL2UqMipNYXRoLlBJO3ZhciBRPU1hdGguc2luKEopKmI7Sj1NYXRoLmNvcyhKKSpiO0EucHVzaCgwLDAsMCk7QS5wdXNoKFEsMCxKKTt2YXIgUz1HJjE/dTp3O0UucHVzaChTLnIsUy5nLFMuYik7RS5wdXNoKFMucixTLmcsUy5iKX1mb3IoRz0wO0c8PWg7RysrKXtTPUcmMT91Onc7dmFyIFQ9Yi1iL2gqRztmb3IoZT0wO2U8bTtlKyspSj1lL20qMipNYXRoLlBJLFE9TWF0aC5zaW4oSikqVCxKPU1hdGguY29zKEopKlQsQS5wdXNoKFEsMCxKKSxFLnB1c2goUy5yLFMuZyxTLmIpLEo9KGUrMSkvbSoyKk1hdGguUEksUT1NYXRoLnNpbihKKSpULEo9TWF0aC5jb3MoSikqVCxBLnB1c2goUSwwLEopLEUucHVzaChTLnIsUy5nLFMuYil9Yj0KbmV3IHhhO2IuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGRhKEEsMykpO2IuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IGRhKEUsMykpO0E9bmV3IE9iKHt2ZXJ0ZXhDb2xvcnM6Mn0pO1NiLmNhbGwodGhpcyxiLEEpfWZ1bmN0aW9uIG5nKGIsZSxoLG0pe3RoaXMuYXVkaW89Yjt0aGlzLnJhbmdlPWV8fDE7dGhpcy5kaXZpc2lvbnNJbm5lckFuZ2xlPWh8fDE2O3RoaXMuZGl2aXNpb25zT3V0ZXJBbmdsZT1tfHwyO2I9bmV3IHhhO2IuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFIobmV3IEZsb2F0MzJBcnJheSgzKigzKih0aGlzLmRpdmlzaW9uc0lubmVyQW5nbGUrMip0aGlzLmRpdmlzaW9uc091dGVyQW5nbGUpKzMpKSwzKSk7ZT1uZXcgT2Ioe2NvbG9yOjY1MjgwfSk7aD1uZXcgT2Ioe2NvbG9yOjE2Nzc2OTYwfSk7bWMuY2FsbCh0aGlzLGIsW2gsZV0pO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gSmgoYixlLGgsbSl7dGhpcy5vYmplY3Q9Yjt0aGlzLnNpemU9dm9pZCAwIT09CmU/ZToxO2I9dm9pZCAwIT09aD9oOjE2Nzc2OTYwO209dm9pZCAwIT09bT9tOjE7ZT0wOyhoPXRoaXMub2JqZWN0Lmdlb21ldHJ5KSYmaC5pc0dlb21ldHJ5P2U9aC5mYWNlcy5sZW5ndGg6Y29uc29sZS53YXJuKCJUSFJFRS5GYWNlTm9ybWFsc0hlbHBlcjogb25seSBUSFJFRS5HZW9tZXRyeSBpcyBzdXBwb3J0ZWQuIFVzZSBUSFJFRS5WZXJ0ZXhOb3JtYWxzSGVscGVyLCBpbnN0ZWFkLiIpO2g9bmV3IHhhO2U9bmV3IGRhKDYqZSwzKTtoLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLGUpO1NiLmNhbGwodGhpcyxoLG5ldyBPYih7Y29sb3I6YixsaW5ld2lkdGg6bX0pKTt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBvZyhiLGUsaCl7eS5jYWxsKHRoaXMpO3RoaXMubGlnaHQ9Yjt0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7dGhpcy5tYXRyaXg9Yi5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy5jb2xvcj1oOwp2b2lkIDA9PT1lJiYoZT0xKTtiPW5ldyB4YTtiLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBkYShbLWUsZSwwLGUsZSwwLGUsLWUsMCwtZSwtZSwwLC1lLGUsMF0sMykpO2U9bmV3IE9iKHtmb2c6ITF9KTt0aGlzLmxpZ2h0UGxhbmU9bmV3IG1jKGIsZSk7dGhpcy5hZGQodGhpcy5saWdodFBsYW5lKTtiPW5ldyB4YTtiLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBkYShbMCwwLDAsMCwwLDFdLDMpKTt0aGlzLnRhcmdldExpbmU9bmV3IG1jKGIsZSk7dGhpcy5hZGQodGhpcy50YXJnZXRMaW5lKTt0aGlzLnVwZGF0ZSgpfWZ1bmN0aW9uIEtoKGIpe2Z1bmN0aW9uIGUoVyxYLGlhKXtoKFcsaWEpO2goWCxpYSl9ZnVuY3Rpb24gaChXLFgpe3cucHVzaCgwLDAsMCk7QS5wdXNoKFgucixYLmcsWC5iKTt2b2lkIDA9PT1FW1ddJiYoRVtXXT1bXSk7RVtXXS5wdXNoKHcubGVuZ3RoLzMtMSl9dmFyIG09bmV3IHhhLHU9bmV3IE9iKHtjb2xvcjoxNjc3NzIxNSx2ZXJ0ZXhDb2xvcnM6MX0pLAp3PVtdLEE9W10sRT17fSxHPW5ldyBJKDE2NzU1MjAwKSxKPW5ldyBJKDE2NzExNjgwKSxRPW5ldyBJKDQzNzc1KSxTPW5ldyBJKDE2Nzc3MjE1KSxUPW5ldyBJKDMzNTU0NDMpO2UoIm4xIiwibjIiLEcpO2UoIm4yIiwibjQiLEcpO2UoIm40IiwibjMiLEcpO2UoIm4zIiwibjEiLEcpO2UoImYxIiwiZjIiLEcpO2UoImYyIiwiZjQiLEcpO2UoImY0IiwiZjMiLEcpO2UoImYzIiwiZjEiLEcpO2UoIm4xIiwiZjEiLEcpO2UoIm4yIiwiZjIiLEcpO2UoIm4zIiwiZjMiLEcpO2UoIm40IiwiZjQiLEcpO2UoInAiLCJuMSIsSik7ZSgicCIsIm4yIixKKTtlKCJwIiwibjMiLEopO2UoInAiLCJuNCIsSik7ZSgidTEiLCJ1MiIsUSk7ZSgidTIiLCJ1MyIsUSk7ZSgidTMiLCJ1MSIsUSk7ZSgiYyIsInQiLFMpO2UoInAiLCJjIixUKTtlKCJjbjEiLCJjbjIiLFQpO2UoImNuMyIsImNuNCIsVCk7ZSgiY2YxIiwiY2YyIixUKTtlKCJjZjMiLCJjZjQiLFQpO20uYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsCm5ldyBkYSh3LDMpKTttLmFkZEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBkYShBLDMpKTtTYi5jYWxsKHRoaXMsbSx1KTt0aGlzLmNhbWVyYT1iO3RoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgmJnRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTt0aGlzLm1hdHJpeD1iLm1hdHJpeFdvcmxkO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLnBvaW50TWFwPUU7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBlYyhiLGUsaCxtLHUsdyxBKXtiai5zZXQodSx3LEEpLnVucHJvamVjdChtKTtiPWVbYl07aWYodm9pZCAwIT09Yilmb3IoaD1oLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKSxlPTAsbT1iLmxlbmd0aDtlPG07ZSsrKWguc2V0WFlaKGJbZV0sYmoueCxiai55LGJqLnopfWZ1bmN0aW9uIFJkKGIsZSl7dGhpcy5vYmplY3Q9Yjt2b2lkIDA9PT1lJiYoZT0xNjc3Njk2MCk7Yj1uZXcgVWludDE2QXJyYXkoWzAsMSwxLDIsMiwzLDMsMCw0LDUsNSw2LDYsNyw3LAo0LDAsNCwxLDUsMiw2LDMsN10pO3ZhciBoPW5ldyBGbG9hdDMyQXJyYXkoMjQpLG09bmV3IHhhO20uc2V0SW5kZXgobmV3IFIoYiwxKSk7bS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgUihoLDMpKTtTYi5jYWxsKHRoaXMsbSxuZXcgT2Ioe2NvbG9yOmV9KSk7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gTGgoYixlKXt0aGlzLnR5cGU9IkJveDNIZWxwZXIiO3RoaXMuYm94PWI7ZT1lfHwxNjc3Njk2MDtiPW5ldyBVaW50MTZBcnJheShbMCwxLDEsMiwyLDMsMywwLDQsNSw1LDYsNiw3LDcsNCwwLDQsMSw1LDIsNiwzLDddKTt2YXIgaD1uZXcgeGE7aC5zZXRJbmRleChuZXcgUihiLDEpKTtoLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBkYShbMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwtMSwxLDEsMSwtMSwtMSwxLC0xLC0xLC0xLC0xLDEsLTEsLTFdLDMpKTtTYi5jYWxsKHRoaXMsaCxuZXcgT2Ioe2NvbG9yOmV9KSk7dGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKX0KZnVuY3Rpb24gTWgoYixlLGgpe3RoaXMudHlwZT0iUGxhbmVIZWxwZXIiO3RoaXMucGxhbmU9Yjt0aGlzLnNpemU9dm9pZCAwPT09ZT8xOmU7Yj12b2lkIDAhPT1oP2g6MTY3NzY5NjA7ZT1uZXcgeGE7ZS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgZGEoWzEsLTEsMSwtMSwxLDEsLTEsLTEsMSwxLDEsMSwtMSwxLDEsLTEsLTEsMSwxLC0xLDEsMSwxLDEsMCwwLDEsMCwwLDBdLDMpKTtlLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO21jLmNhbGwodGhpcyxlLG5ldyBPYih7Y29sb3I6Yn0pKTtlPW5ldyB4YTtlLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBkYShbMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwxLDEsLTEsLTEsMSwxLC0xLDFdLDMpKTtlLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3RoaXMuYWRkKG5ldyB5YShlLG5ldyBMKHtjb2xvcjpiLG9wYWNpdHk6LjIsdHJhbnNwYXJlbnQ6ITAsZGVwdGhXcml0ZTohMX0pKSl9ZnVuY3Rpb24gU2QoYixlLGgsbSx1LHcpe3kuY2FsbCh0aGlzKTsKdm9pZCAwPT09YiYmKGI9bmV3IGcoMCwwLDEpKTt2b2lkIDA9PT1lJiYoZT1uZXcgZygwLDAsMCkpO3ZvaWQgMD09PWgmJihoPTEpO3ZvaWQgMD09PW0mJihtPTE2Nzc2OTYwKTt2b2lkIDA9PT11JiYodT0uMipoKTt2b2lkIDA9PT13JiYodz0uMip1KTt2b2lkIDA9PT1jaiYmKGNqPW5ldyB4YSxjai5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgZGEoWzAsMCwwLDAsMSwwXSwzKSksWms9bmV3IFBkKDAsLjUsMSw1LDEpLFprLnRyYW5zbGF0ZSgwLC0uNSwwKSk7dGhpcy5wb3NpdGlvbi5jb3B5KGUpO3RoaXMubGluZT1uZXcgbWMoY2osbmV3IE9iKHtjb2xvcjptfSkpO3RoaXMubGluZS5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuYWRkKHRoaXMubGluZSk7dGhpcy5jb25lPW5ldyB5YShaayxuZXcgTCh7Y29sb3I6bX0pKTt0aGlzLmNvbmUubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmFkZCh0aGlzLmNvbmUpO3RoaXMuc2V0RGlyZWN0aW9uKGIpO3RoaXMuc2V0TGVuZ3RoKGgsCnUsdyl9ZnVuY3Rpb24gTmgoYil7Yj1ifHwxO3ZhciBlPVswLDAsMCxiLDAsMCwwLDAsMCwwLGIsMCwwLDAsMCwwLDAsYl07Yj1uZXcgeGE7Yi5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgZGEoZSwzKSk7Yi5hZGRBdHRyaWJ1dGUoImNvbG9yIixuZXcgZGEoWzEsMCwwLDEsLjYsMCwwLDEsMCwuNiwxLDAsMCwwLDEsMCwuNiwxXSwzKSk7ZT1uZXcgT2Ioe3ZlcnRleENvbG9yczoyfSk7U2IuY2FsbCh0aGlzLGIsZSl9ZnVuY3Rpb24gaW8oYil7Y29uc29sZS53YXJuKCJUSFJFRS5DbG9zZWRTcGxpbmVDdXJ2ZTMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4iKTt1Yy5jYWxsKHRoaXMsYik7dGhpcy50eXBlPSJjYXRtdWxscm9tIjt0aGlzLmNsb3NlZD0hMH1mdW5jdGlvbiBqbyhiKXtjb25zb2xlLndhcm4oIlRIUkVFLlNwbGluZUN1cnZlMyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLiIpOwp1Yy5jYWxsKHRoaXMsYik7dGhpcy50eXBlPSJjYXRtdWxscm9tIn1mdW5jdGlvbiAkayhiKXtjb25zb2xlLndhcm4oIlRIUkVFLlNwbGluZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLiIpO3VjLmNhbGwodGhpcyxiKTt0aGlzLnR5cGU9ImNhdG11bGxyb20ifXZvaWQgMD09PU51bWJlci5FUFNJTE9OJiYoTnVtYmVyLkVQU0lMT049TWF0aC5wb3coMiwtNTIpKTt2b2lkIDA9PT1OdW1iZXIuaXNJbnRlZ2VyJiYoTnVtYmVyLmlzSW50ZWdlcj1mdW5jdGlvbihiKXtyZXR1cm4ibnVtYmVyIj09PXR5cGVvZiBiJiZpc0Zpbml0ZShiKSYmTWF0aC5mbG9vcihiKT09PWJ9KTt2b2lkIDA9PT1NYXRoLnNpZ24mJihNYXRoLnNpZ249ZnVuY3Rpb24oYil7cmV0dXJuIDA+Yj8tMTowPGI/MTorYn0pOyExPT09Im5hbWUiaW4gRnVuY3Rpb24ucHJvdG90eXBlJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCJuYW1lIiwKe2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRvU3RyaW5nKCkubWF0Y2goL15ccypmdW5jdGlvblxzKihbXlwoXHNdKikvKVsxXX19KTt2b2lkIDA9PT1PYmplY3QuYXNzaWduJiYoT2JqZWN0LmFzc2lnbj1mdW5jdGlvbihiKXtpZih2b2lkIDA9PT1ifHxudWxsPT09Yil0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QiKTtmb3IodmFyIGU9T2JqZWN0KGIpLGg9MTtoPGFyZ3VtZW50cy5sZW5ndGg7aCsrKXt2YXIgbT1hcmd1bWVudHNbaF07aWYodm9pZCAwIT09bSYmbnVsbCE9PW0pZm9yKHZhciB1IGluIG0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG0sdSkmJihlW3VdPW1bdV0pfXJldHVybiBlfSk7T2JqZWN0LmFzc2lnbihjLnByb3RvdHlwZSx7YWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PXRoaXMuX2xpc3RlbmVycyYmKHRoaXMuX2xpc3RlbmVycz17fSk7dmFyIGg9CnRoaXMuX2xpc3RlbmVyczt2b2lkIDA9PT1oW2JdJiYoaFtiXT1bXSk7LTE9PT1oW2JdLmluZGV4T2YoZSkmJmhbYl0ucHVzaChlKX0saGFzRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihiLGUpe2lmKHZvaWQgMD09PXRoaXMuX2xpc3RlbmVycylyZXR1cm4hMTt2YXIgaD10aGlzLl9saXN0ZW5lcnM7cmV0dXJuIHZvaWQgMCE9PWhbYl0mJi0xIT09aFtiXS5pbmRleE9mKGUpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGIsZSl7dm9pZCAwIT09dGhpcy5fbGlzdGVuZXJzJiYoYj10aGlzLl9saXN0ZW5lcnNbYl0sdm9pZCAwIT09YiYmKGU9Yi5pbmRleE9mKGUpLC0xIT09ZSYmYi5zcGxpY2UoZSwxKSkpfSxkaXNwYXRjaEV2ZW50OmZ1bmN0aW9uKGIpe2lmKHZvaWQgMCE9PXRoaXMuX2xpc3RlbmVycyl7dmFyIGU9dGhpcy5fbGlzdGVuZXJzW2IudHlwZV07aWYodm9pZCAwIT09ZSl7Yi50YXJnZXQ9dGhpcztlPWUuc2xpY2UoMCk7Zm9yKHZhciBoPTAsbT1lLmxlbmd0aDtoPG07aCsrKWVbaF0uY2FsbCh0aGlzLApiKX19fX0pO2Zvcih2YXIgcGM9W10sT2g9MDsyNTY+T2g7T2grKylwY1tPaF09KDE2Pk9oPyIwIjoiIikrT2gudG9TdHJpbmcoMTYpO3ZhciBsYj17REVHMlJBRDpNYXRoLlBJLzE4MCxSQUQyREVHOjE4MC9NYXRoLlBJLGdlbmVyYXRlVVVJRDpmdW5jdGlvbigpe3ZhciBiPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLGU9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAsaD00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxtPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwO3JldHVybihwY1tiJjI1NV0rcGNbYj4+OCYyNTVdK3BjW2I+PjE2JjI1NV0rcGNbYj4+MjQmMjU1XSsiLSIrcGNbZSYyNTVdK3BjW2U+PjgmMjU1XSsiLSIrcGNbZT4+MTYmMTV8NjRdK3BjW2U+PjI0JjI1NV0rIi0iK3BjW2gmNjN8MTI4XStwY1toPj44JjI1NV0rIi0iK3BjW2g+PjE2JjI1NV0rcGNbaD4+MjQmMjU1XStwY1ttJjI1NV0rcGNbbT4+OCYyNTVdK3BjW20+PjE2JjI1NV0rcGNbbT4+MjQmMjU1XSkudG9VcHBlckNhc2UoKX0sCmNsYW1wOmZ1bmN0aW9uKGIsZSxoKXtyZXR1cm4gTWF0aC5tYXgoZSxNYXRoLm1pbihoLGIpKX0sZXVjbGlkZWFuTW9kdWxvOmZ1bmN0aW9uKGIsZSl7cmV0dXJuKGIlZStlKSVlfSxtYXBMaW5lYXI6ZnVuY3Rpb24oYixlLGgsbSx1KXtyZXR1cm4gbSsoYi1lKSoodS1tKS8oaC1lKX0sbGVycDpmdW5jdGlvbihiLGUsaCl7cmV0dXJuKDEtaCkqYitoKmV9LHNtb290aHN0ZXA6ZnVuY3Rpb24oYixlLGgpe2lmKGI8PWUpcmV0dXJuIDA7aWYoYj49aClyZXR1cm4gMTtiPShiLWUpLyhoLWUpO3JldHVybiBiKmIqKDMtMipiKX0sc21vb3RoZXJzdGVwOmZ1bmN0aW9uKGIsZSxoKXtpZihiPD1lKXJldHVybiAwO2lmKGI+PWgpcmV0dXJuIDE7Yj0oYi1lKS8oaC1lKTtyZXR1cm4gYipiKmIqKGIqKDYqYi0xNSkrMTApfSxyYW5kSW50OmZ1bmN0aW9uKGIsZSl7cmV0dXJuIGIrTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihlLWIrMSkpfSxyYW5kRmxvYXQ6ZnVuY3Rpb24oYixlKXtyZXR1cm4gYisKTWF0aC5yYW5kb20oKSooZS1iKX0scmFuZEZsb2F0U3ByZWFkOmZ1bmN0aW9uKGIpe3JldHVybiBiKiguNS1NYXRoLnJhbmRvbSgpKX0sZGVnVG9SYWQ6ZnVuY3Rpb24oYil7cmV0dXJuIGIqbGIuREVHMlJBRH0scmFkVG9EZWc6ZnVuY3Rpb24oYil7cmV0dXJuIGIqbGIuUkFEMkRFR30saXNQb3dlck9mVHdvOmZ1bmN0aW9uKGIpe3JldHVybiAwPT09KGImYi0xKSYmMCE9PWJ9LGNlaWxQb3dlck9mVHdvOmZ1bmN0aW9uKGIpe3JldHVybiBNYXRoLnBvdygyLE1hdGguY2VpbChNYXRoLmxvZyhiKS9NYXRoLkxOMikpfSxmbG9vclBvd2VyT2ZUd286ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5mbG9vcihNYXRoLmxvZyhiKS9NYXRoLkxOMikpfX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZC5wcm90b3R5cGUse3dpZHRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54fSxzZXQ6ZnVuY3Rpb24oYil7dGhpcy54PWJ9fSxoZWlnaHQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnl9LApzZXQ6ZnVuY3Rpb24oYil7dGhpcy55PWJ9fX0pO09iamVjdC5hc3NpZ24oZC5wcm90b3R5cGUse2lzVmVjdG9yMjohMCxzZXQ6ZnVuY3Rpb24oYixlKXt0aGlzLng9Yjt0aGlzLnk9ZTtyZXR1cm4gdGhpc30sc2V0U2NhbGFyOmZ1bmN0aW9uKGIpe3RoaXMueT10aGlzLng9YjtyZXR1cm4gdGhpc30sc2V0WDpmdW5jdGlvbihiKXt0aGlzLng9YjtyZXR1cm4gdGhpc30sc2V0WTpmdW5jdGlvbihiKXt0aGlzLnk9YjtyZXR1cm4gdGhpc30sc2V0Q29tcG9uZW50OmZ1bmN0aW9uKGIsZSl7c3dpdGNoKGIpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK2IpO31yZXR1cm4gdGhpc30sZ2V0Q29tcG9uZW50OmZ1bmN0aW9uKGIpe3N3aXRjaChiKXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrCmIpO319LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnkpfSxjb3B5OmZ1bmN0aW9uKGIpe3RoaXMueD1iLng7dGhpcy55PWIueTtyZXR1cm4gdGhpc30sYWRkOmZ1bmN0aW9uKGIsZSl7aWYodm9pZCAwIT09ZSlyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5hZGRWZWN0b3JzKGIsZSk7dGhpcy54Kz1iLng7dGhpcy55Kz1iLnk7cmV0dXJuIHRoaXN9LGFkZFNjYWxhcjpmdW5jdGlvbihiKXt0aGlzLngrPWI7dGhpcy55Kz1iO3JldHVybiB0aGlzfSxhZGRWZWN0b3JzOmZ1bmN0aW9uKGIsZSl7dGhpcy54PWIueCtlLng7dGhpcy55PWIueStlLnk7cmV0dXJuIHRoaXN9LGFkZFNjYWxlZFZlY3RvcjpmdW5jdGlvbihiLGUpe3RoaXMueCs9Yi54KmU7dGhpcy55Kz1iLnkqZTtyZXR1cm4gdGhpc30sCnN1YjpmdW5jdGlvbihiLGUpe2lmKHZvaWQgMCE9PWUpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuc3ViVmVjdG9ycyhiLGUpO3RoaXMueC09Yi54O3RoaXMueS09Yi55O3JldHVybiB0aGlzfSxzdWJTY2FsYXI6ZnVuY3Rpb24oYil7dGhpcy54LT1iO3RoaXMueS09YjtyZXR1cm4gdGhpc30sc3ViVmVjdG9yczpmdW5jdGlvbihiLGUpe3RoaXMueD1iLngtZS54O3RoaXMueT1iLnktZS55O3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihiKXt0aGlzLngqPWIueDt0aGlzLnkqPWIueTtyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYil7dGhpcy54Kj1iO3RoaXMueSo9YjtyZXR1cm4gdGhpc30sZGl2aWRlOmZ1bmN0aW9uKGIpe3RoaXMueC89Yi54O3RoaXMueS89Yi55O3JldHVybiB0aGlzfSxkaXZpZGVTY2FsYXI6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS8KYil9LGFwcGx5TWF0cml4MzpmdW5jdGlvbihiKXt2YXIgZT10aGlzLngsaD10aGlzLnk7Yj1iLmVsZW1lbnRzO3RoaXMueD1iWzBdKmUrYlszXSpoK2JbNl07dGhpcy55PWJbMV0qZStiWzRdKmgrYls3XTtyZXR1cm4gdGhpc30sbWluOmZ1bmN0aW9uKGIpe3RoaXMueD1NYXRoLm1pbih0aGlzLngsYi54KTt0aGlzLnk9TWF0aC5taW4odGhpcy55LGIueSk7cmV0dXJuIHRoaXN9LG1heDpmdW5jdGlvbihiKXt0aGlzLng9TWF0aC5tYXgodGhpcy54LGIueCk7dGhpcy55PU1hdGgubWF4KHRoaXMueSxiLnkpO3JldHVybiB0aGlzfSxjbGFtcDpmdW5jdGlvbihiLGUpe3RoaXMueD1NYXRoLm1heChiLngsTWF0aC5taW4oZS54LHRoaXMueCkpO3RoaXMueT1NYXRoLm1heChiLnksTWF0aC5taW4oZS55LHRoaXMueSkpO3JldHVybiB0aGlzfSxjbGFtcFNjYWxhcjpmdW5jdGlvbihiLGUpe3RoaXMueD1NYXRoLm1heChiLE1hdGgubWluKGUsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGIsTWF0aC5taW4oZSwKdGhpcy55KSk7cmV0dXJuIHRoaXN9LGNsYW1wTGVuZ3RoOmZ1bmN0aW9uKGIsZSl7dmFyIGg9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoaHx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgoYixNYXRoLm1pbihlLGgpKSl9LGZsb29yOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpO3JldHVybiB0aGlzfSxjZWlsOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGguY2VpbCh0aGlzLngpO3RoaXMueT1NYXRoLmNlaWwodGhpcy55KTtyZXR1cm4gdGhpc30scm91bmQ6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpO3RoaXMueT1NYXRoLnJvdW5kKHRoaXMueSk7cmV0dXJuIHRoaXN9LHJvdW5kVG9aZXJvOmZ1bmN0aW9uKCl7dGhpcy54PTA+dGhpcy54P01hdGguY2VpbCh0aGlzLngpOk1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9MD50aGlzLnk/TWF0aC5jZWlsKHRoaXMueSk6TWF0aC5mbG9vcih0aGlzLnkpOwpyZXR1cm4gdGhpc30sbmVnYXRlOmZ1bmN0aW9uKCl7dGhpcy54PS10aGlzLng7dGhpcy55PS10aGlzLnk7cmV0dXJuIHRoaXN9LGRvdDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy54KmIueCt0aGlzLnkqYi55fSxjcm9zczpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy54KmIueS10aGlzLnkqYi54fSxsZW5ndGhTcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnl9LGxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55KX0sbWFuaGF0dGFuTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KX0sbm9ybWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfSxhbmdsZTpmdW5jdGlvbigpe3ZhciBiPU1hdGguYXRhbjIodGhpcy55LHRoaXMueCk7MD5iJiYoYis9MipNYXRoLlBJKTtyZXR1cm4gYn0sCmRpc3RhbmNlVG86ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKGIpKX0sZGlzdGFuY2VUb1NxdWFyZWQ6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy54LWIueDtiPXRoaXMueS1iLnk7cmV0dXJuIGUqZStiKmJ9LG1hbmhhdHRhbkRpc3RhbmNlVG86ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGguYWJzKHRoaXMueC1iLngpK01hdGguYWJzKHRoaXMueS1iLnkpfSxzZXRMZW5ndGg6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoYil9LGxlcnA6ZnVuY3Rpb24oYixlKXt0aGlzLngrPShiLngtdGhpcy54KSplO3RoaXMueSs9KGIueS10aGlzLnkpKmU7cmV0dXJuIHRoaXN9LGxlcnBWZWN0b3JzOmZ1bmN0aW9uKGIsZSxoKXtyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKGUsYikubXVsdGlwbHlTY2FsYXIoaCkuYWRkKGIpfSxlcXVhbHM6ZnVuY3Rpb24oYil7cmV0dXJuIGIueD09PXRoaXMueCYmYi55PT09dGhpcy55fSwKZnJvbUFycmF5OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGU9MCk7dGhpcy54PWJbZV07dGhpcy55PWJbZSsxXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWImJihiPVtdKTt2b2lkIDA9PT1lJiYoZT0wKTtiW2VdPXRoaXMueDtiW2UrMV09dGhpcy55O3JldHVybiBifSxmcm9tQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGIsZSxoKXt2b2lkIDAhPT1oJiZjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTt0aGlzLng9Yi5nZXRYKGUpO3RoaXMueT1iLmdldFkoZSk7cmV0dXJuIHRoaXN9LHJvdGF0ZUFyb3VuZDpmdW5jdGlvbihiLGUpe3ZhciBoPU1hdGguY29zKGUpO2U9TWF0aC5zaW4oZSk7dmFyIG09dGhpcy54LWIueCx1PXRoaXMueS1iLnk7dGhpcy54PW0qaC11KmUrYi54O3RoaXMueT1tKmUrdSpoK2IueTtyZXR1cm4gdGhpc319KTtPYmplY3QuYXNzaWduKGYsCntzbGVycDpmdW5jdGlvbihiLGUsaCxtKXtyZXR1cm4gaC5jb3B5KGIpLnNsZXJwKGUsbSl9LHNsZXJwRmxhdDpmdW5jdGlvbihiLGUsaCxtLHUsdyxBKXt2YXIgRT1oW20rMF0sRz1oW20rMV0sSj1oW20rMl07aD1oW20rM107bT11W3crMF07dmFyIFE9dVt3KzFdLFM9dVt3KzJdO3U9dVt3KzNdO2lmKGghPT11fHxFIT09bXx8RyE9PVF8fEohPT1TKXt3PTEtQTt2YXIgVD1FKm0rRypRK0oqUytoKnUsVz0wPD1UPzE6LTEsWD0xLVQqVDtYPk51bWJlci5FUFNJTE9OJiYoWD1NYXRoLnNxcnQoWCksVD1NYXRoLmF0YW4yKFgsVCpXKSx3PU1hdGguc2luKHcqVCkvWCxBPU1hdGguc2luKEEqVCkvWCk7Vyo9QTtFPUUqdyttKlc7Rz1HKncrUSpXO0o9Sip3K1MqVztoPWgqdyt1Klc7dz09PTEtQSYmKEE9MS9NYXRoLnNxcnQoRSpFK0cqRytKKkoraCpoKSxFKj1BLEcqPUEsSio9QSxoKj1BKX1iW2VdPUU7YltlKzFdPUc7YltlKzJdPUo7YltlKzNdPWh9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZi5wcm90b3R5cGUsCnt4OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feH0sc2V0OmZ1bmN0aW9uKGIpe3RoaXMuX3g9Yjt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fSx5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feX0sc2V0OmZ1bmN0aW9uKGIpe3RoaXMuX3k9Yjt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fSx6OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fen0sc2V0OmZ1bmN0aW9uKGIpe3RoaXMuX3o9Yjt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fSx3OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd30sc2V0OmZ1bmN0aW9uKGIpe3RoaXMuX3c9Yjt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fX0pO09iamVjdC5hc3NpZ24oZi5wcm90b3R5cGUse2lzUXVhdGVybmlvbjohMCxzZXQ6ZnVuY3Rpb24oYixlLGgsbSl7dGhpcy5feD1iO3RoaXMuX3k9ZTt0aGlzLl96PWg7dGhpcy5fdz1tO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCwKdGhpcy5feSx0aGlzLl96LHRoaXMuX3cpfSxjb3B5OmZ1bmN0aW9uKGIpe3RoaXMuX3g9Yi54O3RoaXMuX3k9Yi55O3RoaXMuX3o9Yi56O3RoaXMuX3c9Yi53O3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2V0RnJvbUV1bGVyOmZ1bmN0aW9uKGIsZSl7aWYoIWJ8fCFiLmlzRXVsZXIpdGhyb3cgRXJyb3IoIlRIUkVFLlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLiIpO3ZhciBoPWIuX3gsbT1iLl95LHU9Yi5fejtiPWIub3JkZXI7dmFyIHc9TWF0aC5jb3MsQT1NYXRoLnNpbixFPXcoaC8yKSxHPXcobS8yKTt3PXcodS8yKTtoPUEoaC8yKTttPUEobS8yKTt1PUEodS8yKTsiWFlaIj09PWI/KHRoaXMuX3g9aCpHKncrRSptKnUsdGhpcy5feT1FKm0qdy1oKkcqdSx0aGlzLl96PUUqRyp1K2gqbSp3LHRoaXMuX3c9RSpHKnctaCptKnUpOiJZWFoiPT09CmI/KHRoaXMuX3g9aCpHKncrRSptKnUsdGhpcy5feT1FKm0qdy1oKkcqdSx0aGlzLl96PUUqRyp1LWgqbSp3LHRoaXMuX3c9RSpHKncraCptKnUpOiJaWFkiPT09Yj8odGhpcy5feD1oKkcqdy1FKm0qdSx0aGlzLl95PUUqbSp3K2gqRyp1LHRoaXMuX3o9RSpHKnUraCptKncsdGhpcy5fdz1FKkcqdy1oKm0qdSk6IlpZWCI9PT1iPyh0aGlzLl94PWgqRyp3LUUqbSp1LHRoaXMuX3k9RSptKncraCpHKnUsdGhpcy5fej1FKkcqdS1oKm0qdyx0aGlzLl93PUUqRyp3K2gqbSp1KToiWVpYIj09PWI/KHRoaXMuX3g9aCpHKncrRSptKnUsdGhpcy5feT1FKm0qdytoKkcqdSx0aGlzLl96PUUqRyp1LWgqbSp3LHRoaXMuX3c9RSpHKnctaCptKnUpOiJYWlkiPT09YiYmKHRoaXMuX3g9aCpHKnctRSptKnUsdGhpcy5feT1FKm0qdy1oKkcqdSx0aGlzLl96PUUqRyp1K2gqbSp3LHRoaXMuX3c9RSpHKncraCptKnUpOyExIT09ZSYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzZXRGcm9tQXhpc0FuZ2xlOmZ1bmN0aW9uKGIsCmUpe2UvPTI7dmFyIGg9TWF0aC5zaW4oZSk7dGhpcy5feD1iLngqaDt0aGlzLl95PWIueSpoO3RoaXMuX3o9Yi56Kmg7dGhpcy5fdz1NYXRoLmNvcyhlKTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHNldEZyb21Sb3RhdGlvbk1hdHJpeDpmdW5jdGlvbihiKXt2YXIgZT1iLmVsZW1lbnRzLGg9ZVswXTtiPWVbNF07dmFyIG09ZVs4XSx1PWVbMV0sdz1lWzVdLEE9ZVs5XSxFPWVbMl0sRz1lWzZdO2U9ZVsxMF07dmFyIEo9aCt3K2U7MDxKPyhoPS41L01hdGguc3FydChKKzEpLHRoaXMuX3c9LjI1L2gsdGhpcy5feD0oRy1BKSpoLHRoaXMuX3k9KG0tRSkqaCx0aGlzLl96PSh1LWIpKmgpOmg+dyYmaD5lPyhoPTIqTWF0aC5zcXJ0KDEraC13LWUpLHRoaXMuX3c9KEctQSkvaCx0aGlzLl94PS4yNSpoLHRoaXMuX3k9KGIrdSkvaCx0aGlzLl96PShtK0UpL2gpOnc+ZT8oaD0yKk1hdGguc3FydCgxK3ctaC1lKSx0aGlzLl93PShtLUUpL2gsdGhpcy5feD0oYit1KS9oLAp0aGlzLl95PS4yNSpoLHRoaXMuX3o9KEErRykvaCk6KGg9MipNYXRoLnNxcnQoMStlLWgtdyksdGhpcy5fdz0odS1iKS9oLHRoaXMuX3g9KG0rRSkvaCx0aGlzLl95PShBK0cpL2gsdGhpcy5fej0uMjUqaCk7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzZXRGcm9tVW5pdFZlY3RvcnM6ZnVuY3Rpb24oYixlKXt2YXIgaD1iLmRvdChlKSsxOzFFLTY+aD8oaD0wLE1hdGguYWJzKGIueCk+TWF0aC5hYnMoYi56KT8odGhpcy5feD0tYi55LHRoaXMuX3k9Yi54LHRoaXMuX3o9MCk6KHRoaXMuX3g9MCx0aGlzLl95PS1iLnosdGhpcy5fej1iLnkpKToodGhpcy5feD1iLnkqZS56LWIueiplLnksdGhpcy5feT1iLnoqZS54LWIueCplLnosdGhpcy5fej1iLngqZS55LWIueSplLngpO3RoaXMuX3c9aDtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKX0sYW5nbGVUbzpmdW5jdGlvbihiKXtyZXR1cm4gMipNYXRoLmFjb3MoTWF0aC5hYnMobGIuY2xhbXAodGhpcy5kb3QoYiksLTEsCjEpKSl9LHJvdGF0ZVRvd2FyZHM6ZnVuY3Rpb24oYixlKXt2YXIgaD10aGlzLmFuZ2xlVG8oYik7aWYoMD09PWgpcmV0dXJuIHRoaXM7dGhpcy5zbGVycChiLE1hdGgubWluKDEsZS9oKSk7cmV0dXJuIHRoaXN9LGludmVyc2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25qdWdhdGUoKX0sY29uanVnYXRlOmZ1bmN0aW9uKCl7dGhpcy5feCo9LTE7dGhpcy5feSo9LTE7dGhpcy5feio9LTE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxkb3Q6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX3gqYi5feCt0aGlzLl95KmIuX3krdGhpcy5feipiLl96K3RoaXMuX3cqYi5fd30sbGVuZ3RoU3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feCp0aGlzLl94K3RoaXMuX3kqdGhpcy5feSt0aGlzLl96KnRoaXMuX3ordGhpcy5fdyp0aGlzLl93fSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feioKdGhpcy5feit0aGlzLl93KnRoaXMuX3cpfSxub3JtYWxpemU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmxlbmd0aCgpOzA9PT1iPyh0aGlzLl96PXRoaXMuX3k9dGhpcy5feD0wLHRoaXMuX3c9MSk6KGI9MS9iLHRoaXMuX3gqPWIsdGhpcy5feSo9Yix0aGlzLl96Kj1iLHRoaXMuX3cqPWIpO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sbXVsdGlwbHk6ZnVuY3Rpb24oYixlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseVF1YXRlcm5pb25zKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoYixlKSk6dGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsYil9LHByZW11bHRpcGx5OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoYix0aGlzKX0sbXVsdGlwbHlRdWF0ZXJuaW9uczpmdW5jdGlvbihiLAplKXt2YXIgaD1iLl94LG09Yi5feSx1PWIuX3o7Yj1iLl93O3ZhciB3PWUuX3gsQT1lLl95LEU9ZS5fejtlPWUuX3c7dGhpcy5feD1oKmUrYip3K20qRS11KkE7dGhpcy5feT1tKmUrYipBK3Uqdy1oKkU7dGhpcy5fej11KmUrYipFK2gqQS1tKnc7dGhpcy5fdz1iKmUtaCp3LW0qQS11KkU7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzbGVycDpmdW5jdGlvbihiLGUpe2lmKDA9PT1lKXJldHVybiB0aGlzO2lmKDE9PT1lKXJldHVybiB0aGlzLmNvcHkoYik7dmFyIGg9dGhpcy5feCxtPXRoaXMuX3ksdT10aGlzLl96LHc9dGhpcy5fdyxBPXcqYi5fdytoKmIuX3grbSpiLl95K3UqYi5fejswPkE/KHRoaXMuX3c9LWIuX3csdGhpcy5feD0tYi5feCx0aGlzLl95PS1iLl95LHRoaXMuX3o9LWIuX3osQT0tQSk6dGhpcy5jb3B5KGIpO2lmKDE8PUEpcmV0dXJuIHRoaXMuX3c9dyx0aGlzLl94PWgsdGhpcy5feT1tLHRoaXMuX3o9dSx0aGlzO2I9MS1BKkE7aWYoYjw9TnVtYmVyLkVQU0lMT04pcmV0dXJuIEE9CjEtZSx0aGlzLl93PUEqdytlKnRoaXMuX3csdGhpcy5feD1BKmgrZSp0aGlzLl94LHRoaXMuX3k9QSptK2UqdGhpcy5feSx0aGlzLl96PUEqdStlKnRoaXMuX3osdGhpcy5ub3JtYWxpemUoKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpcztiPU1hdGguc3FydChiKTt2YXIgRT1NYXRoLmF0YW4yKGIsQSk7QT1NYXRoLnNpbigoMS1lKSpFKS9iO2U9TWF0aC5zaW4oZSpFKS9iO3RoaXMuX3c9dypBK3RoaXMuX3cqZTt0aGlzLl94PWgqQSt0aGlzLl94KmU7dGhpcy5feT1tKkErdGhpcy5feSplO3RoaXMuX3o9dSpBK3RoaXMuX3oqZTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihiKXtyZXR1cm4gYi5feD09PXRoaXMuX3gmJmIuX3k9PT10aGlzLl95JiZiLl96PT09dGhpcy5feiYmYi5fdz09PXRoaXMuX3d9LGZyb21BcnJheTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihlPTApO3RoaXMuX3g9YltlXTt0aGlzLl95PWJbZSsxXTsKdGhpcy5fej1iW2UrMl07dGhpcy5fdz1iW2UrM107dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09YiYmKGI9W10pO3ZvaWQgMD09PWUmJihlPTApO2JbZV09dGhpcy5feDtiW2UrMV09dGhpcy5feTtiW2UrMl09dGhpcy5fejtiW2UrM109dGhpcy5fdztyZXR1cm4gYn0sX29uQ2hhbmdlOmZ1bmN0aW9uKGIpe3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9YjtyZXR1cm4gdGhpc30sX29uQ2hhbmdlQ2FsbGJhY2s6ZnVuY3Rpb24oKXt9fSk7dmFyIGFsPW5ldyBnLGtvPW5ldyBmO09iamVjdC5hc3NpZ24oZy5wcm90b3R5cGUse2lzVmVjdG9yMzohMCxzZXQ6ZnVuY3Rpb24oYixlLGgpe3RoaXMueD1iO3RoaXMueT1lO3RoaXMuej1oO3JldHVybiB0aGlzfSxzZXRTY2FsYXI6ZnVuY3Rpb24oYil7dGhpcy56PXRoaXMueT10aGlzLng9YjtyZXR1cm4gdGhpc30sc2V0WDpmdW5jdGlvbihiKXt0aGlzLng9YjtyZXR1cm4gdGhpc30sCnNldFk6ZnVuY3Rpb24oYil7dGhpcy55PWI7cmV0dXJuIHRoaXN9LHNldFo6ZnVuY3Rpb24oYil7dGhpcy56PWI7cmV0dXJuIHRoaXN9LHNldENvbXBvbmVudDpmdW5jdGlvbihiLGUpe3N3aXRjaChiKXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrYik7fXJldHVybiB0aGlzfSxnZXRDb21wb25lbnQ6ZnVuY3Rpb24oYil7c3dpdGNoKGIpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2RlZmF1bHQ6dGhyb3cgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIitiKTt9fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55LHRoaXMueil9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy54PWIueDt0aGlzLnk9Yi55Owp0aGlzLno9Yi56O3JldHVybiB0aGlzfSxhZGQ6ZnVuY3Rpb24oYixlKXtpZih2b2lkIDAhPT1lKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmFkZFZlY3RvcnMoYixlKTt0aGlzLngrPWIueDt0aGlzLnkrPWIueTt0aGlzLnorPWIuejtyZXR1cm4gdGhpc30sYWRkU2NhbGFyOmZ1bmN0aW9uKGIpe3RoaXMueCs9Yjt0aGlzLnkrPWI7dGhpcy56Kz1iO3JldHVybiB0aGlzfSxhZGRWZWN0b3JzOmZ1bmN0aW9uKGIsZSl7dGhpcy54PWIueCtlLng7dGhpcy55PWIueStlLnk7dGhpcy56PWIueitlLno7cmV0dXJuIHRoaXN9LGFkZFNjYWxlZFZlY3RvcjpmdW5jdGlvbihiLGUpe3RoaXMueCs9Yi54KmU7dGhpcy55Kz1iLnkqZTt0aGlzLnorPWIueiplO3JldHVybiB0aGlzfSxzdWI6ZnVuY3Rpb24oYixlKXtpZih2b2lkIDAhPT1lKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSwKdGhpcy5zdWJWZWN0b3JzKGIsZSk7dGhpcy54LT1iLng7dGhpcy55LT1iLnk7dGhpcy56LT1iLno7cmV0dXJuIHRoaXN9LHN1YlNjYWxhcjpmdW5jdGlvbihiKXt0aGlzLngtPWI7dGhpcy55LT1iO3RoaXMuei09YjtyZXR1cm4gdGhpc30sc3ViVmVjdG9yczpmdW5jdGlvbihiLGUpe3RoaXMueD1iLngtZS54O3RoaXMueT1iLnktZS55O3RoaXMuej1iLnotZS56O3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihiLGUpe2lmKHZvaWQgMCE9PWUpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5VmVjdG9ycyhiLGUpO3RoaXMueCo9Yi54O3RoaXMueSo9Yi55O3RoaXMueio9Yi56O3JldHVybiB0aGlzfSxtdWx0aXBseVNjYWxhcjpmdW5jdGlvbihiKXt0aGlzLngqPWI7dGhpcy55Kj1iO3RoaXMueio9CmI7cmV0dXJuIHRoaXN9LG11bHRpcGx5VmVjdG9yczpmdW5jdGlvbihiLGUpe3RoaXMueD1iLngqZS54O3RoaXMueT1iLnkqZS55O3RoaXMuej1iLnoqZS56O3JldHVybiB0aGlzfSxhcHBseUV1bGVyOmZ1bmN0aW9uKGIpe2ImJmIuaXNFdWxlcnx8Y29uc29sZS5lcnJvcigiVEhSRUUuVmVjdG9yMzogLmFwcGx5RXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLiIpO3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihrby5zZXRGcm9tRXVsZXIoYikpfSxhcHBseUF4aXNBbmdsZTpmdW5jdGlvbihiLGUpe3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihrby5zZXRGcm9tQXhpc0FuZ2xlKGIsZSkpfSxhcHBseU1hdHJpeDM6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy54LGg9dGhpcy55LG09dGhpcy56O2I9Yi5lbGVtZW50czt0aGlzLng9YlswXSplK2JbM10qaCtiWzZdKm07dGhpcy55PWJbMV0qZStiWzRdKmgrYls3XSoKbTt0aGlzLno9YlsyXSplK2JbNV0qaCtiWzhdKm07cmV0dXJuIHRoaXN9LGFwcGx5TWF0cml4NDpmdW5jdGlvbihiKXt2YXIgZT10aGlzLngsaD10aGlzLnksbT10aGlzLno7Yj1iLmVsZW1lbnRzO3ZhciB1PTEvKGJbM10qZStiWzddKmgrYlsxMV0qbStiWzE1XSk7dGhpcy54PShiWzBdKmUrYls0XSpoK2JbOF0qbStiWzEyXSkqdTt0aGlzLnk9KGJbMV0qZStiWzVdKmgrYls5XSptK2JbMTNdKSp1O3RoaXMuej0oYlsyXSplK2JbNl0qaCtiWzEwXSptK2JbMTRdKSp1O3JldHVybiB0aGlzfSxhcHBseVF1YXRlcm5pb246ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy54LGg9dGhpcy55LG09dGhpcy56LHU9Yi54LHc9Yi55LEE9Yi56O2I9Yi53O3ZhciBFPWIqZSt3Km0tQSpoLEc9YipoK0EqZS11Km0sSj1iKm0rdSpoLXcqZTtlPS11KmUtdypoLUEqbTt0aGlzLng9RSpiK2UqLXUrRyotQS1KKi13O3RoaXMueT1HKmIrZSotdytKKi11LUUqLUE7dGhpcy56PUoqYitlKi1BK0UqLXctRyotdTtyZXR1cm4gdGhpc30sCnByb2plY3Q6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KGIubWF0cml4V29ybGRJbnZlcnNlKS5hcHBseU1hdHJpeDQoYi5wcm9qZWN0aW9uTWF0cml4KX0sdW5wcm9qZWN0OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4NChiLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKS5hcHBseU1hdHJpeDQoYi5tYXRyaXhXb3JsZCl9LHRyYW5zZm9ybURpcmVjdGlvbjpmdW5jdGlvbihiKXt2YXIgZT10aGlzLngsaD10aGlzLnksbT10aGlzLno7Yj1iLmVsZW1lbnRzO3RoaXMueD1iWzBdKmUrYls0XSpoK2JbOF0qbTt0aGlzLnk9YlsxXSplK2JbNV0qaCtiWzldKm07dGhpcy56PWJbMl0qZStiWzZdKmgrYlsxMF0qbTtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKX0sZGl2aWRlOmZ1bmN0aW9uKGIpe3RoaXMueC89Yi54O3RoaXMueS89Yi55O3RoaXMuei89Yi56O3JldHVybiB0aGlzfSxkaXZpZGVTY2FsYXI6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS8KYil9LG1pbjpmdW5jdGlvbihiKXt0aGlzLng9TWF0aC5taW4odGhpcy54LGIueCk7dGhpcy55PU1hdGgubWluKHRoaXMueSxiLnkpO3RoaXMuej1NYXRoLm1pbih0aGlzLnosYi56KTtyZXR1cm4gdGhpc30sbWF4OmZ1bmN0aW9uKGIpe3RoaXMueD1NYXRoLm1heCh0aGlzLngsYi54KTt0aGlzLnk9TWF0aC5tYXgodGhpcy55LGIueSk7dGhpcy56PU1hdGgubWF4KHRoaXMueixiLnopO3JldHVybiB0aGlzfSxjbGFtcDpmdW5jdGlvbihiLGUpe3RoaXMueD1NYXRoLm1heChiLngsTWF0aC5taW4oZS54LHRoaXMueCkpO3RoaXMueT1NYXRoLm1heChiLnksTWF0aC5taW4oZS55LHRoaXMueSkpO3RoaXMuej1NYXRoLm1heChiLnosTWF0aC5taW4oZS56LHRoaXMueikpO3JldHVybiB0aGlzfSxjbGFtcFNjYWxhcjpmdW5jdGlvbihiLGUpe3RoaXMueD1NYXRoLm1heChiLE1hdGgubWluKGUsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGIsTWF0aC5taW4oZSx0aGlzLnkpKTt0aGlzLno9TWF0aC5tYXgoYiwKTWF0aC5taW4oZSx0aGlzLnopKTtyZXR1cm4gdGhpc30sY2xhbXBMZW5ndGg6ZnVuY3Rpb24oYixlKXt2YXIgaD10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihofHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heChiLE1hdGgubWluKGUsaCkpKX0sZmxvb3I6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpO3RoaXMueT1NYXRoLmZsb29yKHRoaXMueSk7dGhpcy56PU1hdGguZmxvb3IodGhpcy56KTtyZXR1cm4gdGhpc30sY2VpbDpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmNlaWwodGhpcy54KTt0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSk7dGhpcy56PU1hdGguY2VpbCh0aGlzLnopO3JldHVybiB0aGlzfSxyb3VuZDpmdW5jdGlvbigpe3RoaXMueD1NYXRoLnJvdW5kKHRoaXMueCk7dGhpcy55PU1hdGgucm91bmQodGhpcy55KTt0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopO3JldHVybiB0aGlzfSxyb3VuZFRvWmVybzpmdW5jdGlvbigpe3RoaXMueD0KMD50aGlzLng/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpO3RoaXMueT0wPnRoaXMueT9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSk7dGhpcy56PTA+dGhpcy56P01hdGguY2VpbCh0aGlzLnopOk1hdGguZmxvb3IodGhpcy56KTtyZXR1cm4gdGhpc30sbmVnYXRlOmZ1bmN0aW9uKCl7dGhpcy54PS10aGlzLng7dGhpcy55PS10aGlzLnk7dGhpcy56PS10aGlzLno7cmV0dXJuIHRoaXN9LGRvdDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy54KmIueCt0aGlzLnkqYi55K3RoaXMueipiLnp9LGxlbmd0aFNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56KX0sbWFuaGF0dGFuTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KSsKTWF0aC5hYnModGhpcy56KX0sbm9ybWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfSxzZXRMZW5ndGg6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoYil9LGxlcnA6ZnVuY3Rpb24oYixlKXt0aGlzLngrPShiLngtdGhpcy54KSplO3RoaXMueSs9KGIueS10aGlzLnkpKmU7dGhpcy56Kz0oYi56LXRoaXMueikqZTtyZXR1cm4gdGhpc30sbGVycFZlY3RvcnM6ZnVuY3Rpb24oYixlLGgpe3JldHVybiB0aGlzLnN1YlZlY3RvcnMoZSxiKS5tdWx0aXBseVNjYWxhcihoKS5hZGQoYil9LGNyb3NzOmZ1bmN0aW9uKGIsZSl7cmV0dXJuIHZvaWQgMCE9PWU/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmNyb3NzKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuY3Jvc3NWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmNyb3NzVmVjdG9ycyhiLGUpKTp0aGlzLmNyb3NzVmVjdG9ycyh0aGlzLApiKX0sY3Jvc3NWZWN0b3JzOmZ1bmN0aW9uKGIsZSl7dmFyIGg9Yi54LG09Yi55O2I9Yi56O3ZhciB1PWUueCx3PWUueTtlPWUuejt0aGlzLng9bSplLWIqdzt0aGlzLnk9Yip1LWgqZTt0aGlzLno9aCp3LW0qdTtyZXR1cm4gdGhpc30scHJvamVjdE9uVmVjdG9yOmZ1bmN0aW9uKGIpe3ZhciBlPWIuZG90KHRoaXMpL2IubGVuZ3RoU3EoKTtyZXR1cm4gdGhpcy5jb3B5KGIpLm11bHRpcGx5U2NhbGFyKGUpfSxwcm9qZWN0T25QbGFuZTpmdW5jdGlvbihiKXthbC5jb3B5KHRoaXMpLnByb2plY3RPblZlY3RvcihiKTtyZXR1cm4gdGhpcy5zdWIoYWwpfSxyZWZsZWN0OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnN1YihhbC5jb3B5KGIpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QoYikpKX0sYW5nbGVUbzpmdW5jdGlvbihiKXtyZXR1cm4gTWF0aC5hY29zKGxiLmNsYW1wKHRoaXMuZG90KGIpL01hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqYi5sZW5ndGhTcSgpKSwtMSwxKSl9LGRpc3RhbmNlVG86ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKGIpKX0sCmRpc3RhbmNlVG9TcXVhcmVkOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMueC1iLngsaD10aGlzLnktYi55O2I9dGhpcy56LWIuejtyZXR1cm4gZSplK2gqaCtiKmJ9LG1hbmhhdHRhbkRpc3RhbmNlVG86ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGguYWJzKHRoaXMueC1iLngpK01hdGguYWJzKHRoaXMueS1iLnkpK01hdGguYWJzKHRoaXMuei1iLnopfSxzZXRGcm9tU3BoZXJpY2FsOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHMoYi5yYWRpdXMsYi5waGksYi50aGV0YSl9LHNldEZyb21TcGhlcmljYWxDb29yZHM6ZnVuY3Rpb24oYixlLGgpe3ZhciBtPU1hdGguc2luKGUpKmI7dGhpcy54PW0qTWF0aC5zaW4oaCk7dGhpcy55PU1hdGguY29zKGUpKmI7dGhpcy56PW0qTWF0aC5jb3MoaCk7cmV0dXJuIHRoaXN9LHNldEZyb21DeWxpbmRyaWNhbDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHMoYi5yYWRpdXMsYi50aGV0YSwKYi55KX0sc2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzOmZ1bmN0aW9uKGIsZSxoKXt0aGlzLng9YipNYXRoLnNpbihlKTt0aGlzLnk9aDt0aGlzLno9YipNYXRoLmNvcyhlKTtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeFBvc2l0aW9uOmZ1bmN0aW9uKGIpe2I9Yi5lbGVtZW50czt0aGlzLng9YlsxMl07dGhpcy55PWJbMTNdO3RoaXMuej1iWzE0XTtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeFNjYWxlOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbihiLDApLmxlbmd0aCgpLGg9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKGIsMSkubGVuZ3RoKCk7Yj10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oYiwyKS5sZW5ndGgoKTt0aGlzLng9ZTt0aGlzLnk9aDt0aGlzLno9YjtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeENvbHVtbjpmdW5jdGlvbihiLGUpe3JldHVybiB0aGlzLmZyb21BcnJheShiLmVsZW1lbnRzLDQqZSl9LGVxdWFsczpmdW5jdGlvbihiKXtyZXR1cm4gYi54PT09CnRoaXMueCYmYi55PT09dGhpcy55JiZiLno9PT10aGlzLnp9LGZyb21BcnJheTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihlPTApO3RoaXMueD1iW2VdO3RoaXMueT1iW2UrMV07dGhpcy56PWJbZSsyXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWImJihiPVtdKTt2b2lkIDA9PT1lJiYoZT0wKTtiW2VdPXRoaXMueDtiW2UrMV09dGhpcy55O2JbZSsyXT10aGlzLno7cmV0dXJuIGJ9LGZyb21CdWZmZXJBdHRyaWJ1dGU6ZnVuY3Rpb24oYixlLGgpe3ZvaWQgMCE9PWgmJmNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpO3RoaXMueD1iLmdldFgoZSk7dGhpcy55PWIuZ2V0WShlKTt0aGlzLno9Yi5nZXRaKGUpO3JldHVybiB0aGlzfX0pO3ZhciBjZj1uZXcgZztPYmplY3QuYXNzaWduKGwucHJvdG90eXBlLHtpc01hdHJpeDM6ITAsc2V0OmZ1bmN0aW9uKGIsCmUsaCxtLHUsdyxBLEUsRyl7dmFyIEo9dGhpcy5lbGVtZW50cztKWzBdPWI7SlsxXT1tO0pbMl09QTtKWzNdPWU7Sls0XT11O0pbNV09RTtKWzZdPWg7Sls3XT13O0pbOF09RztyZXR1cm4gdGhpc30saWRlbnRpdHk6ZnVuY3Rpb24oKXt0aGlzLnNldCgxLDAsMCwwLDEsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9LGNvcHk6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5lbGVtZW50cztiPWIuZWxlbWVudHM7ZVswXT1iWzBdO2VbMV09YlsxXTtlWzJdPWJbMl07ZVszXT1iWzNdO2VbNF09Yls0XTtlWzVdPWJbNV07ZVs2XT1iWzZdO2VbN109Yls3XTtlWzhdPWJbOF07cmV0dXJuIHRoaXN9LHNldEZyb21NYXRyaXg0OmZ1bmN0aW9uKGIpe2I9Yi5lbGVtZW50czt0aGlzLnNldChiWzBdLGJbNF0sYls4XSxiWzFdLGJbNV0sYls5XSxiWzJdLGJbNl0sYlsxMF0pO3JldHVybiB0aGlzfSwKYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZTpmdW5jdGlvbihiKXtmb3IodmFyIGU9MCxoPWIuY291bnQ7ZTxoO2UrKyljZi54PWIuZ2V0WChlKSxjZi55PWIuZ2V0WShlKSxjZi56PWIuZ2V0WihlKSxjZi5hcHBseU1hdHJpeDModGhpcyksYi5zZXRYWVooZSxjZi54LGNmLnksY2Yueik7cmV0dXJuIGJ9LG11bHRpcGx5OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyxiKX0scHJlbXVsdGlwbHk6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyhiLHRoaXMpfSxtdWx0aXBseU1hdHJpY2VzOmZ1bmN0aW9uKGIsZSl7dmFyIGg9Yi5lbGVtZW50cyxtPWUuZWxlbWVudHM7ZT10aGlzLmVsZW1lbnRzO2I9aFswXTt2YXIgdT1oWzNdLHc9aFs2XSxBPWhbMV0sRT1oWzRdLEc9aFs3XSxKPWhbMl0sUT1oWzVdO2g9aFs4XTt2YXIgUz1tWzBdLFQ9bVszXSxXPW1bNl0sWD1tWzFdLGlhPW1bNF0saGE9bVs3XSxzYT1tWzJdLHFhPW1bNV07bT1tWzhdOwplWzBdPWIqUyt1KlgrdypzYTtlWzNdPWIqVCt1KmlhK3cqcWE7ZVs2XT1iKlcrdSpoYSt3Km07ZVsxXT1BKlMrRSpYK0cqc2E7ZVs0XT1BKlQrRSppYStHKnFhO2VbN109QSpXK0UqaGErRyptO2VbMl09SipTK1EqWCtoKnNhO2VbNV09SipUK1EqaWEraCpxYTtlWzhdPUoqVytRKmhhK2gqbTtyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5lbGVtZW50cztlWzBdKj1iO2VbM10qPWI7ZVs2XSo9YjtlWzFdKj1iO2VbNF0qPWI7ZVs3XSo9YjtlWzJdKj1iO2VbNV0qPWI7ZVs4XSo9YjtyZXR1cm4gdGhpc30sZGV0ZXJtaW5hbnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmVsZW1lbnRzLGU9YlswXSxoPWJbMV0sbT1iWzJdLHU9YlszXSx3PWJbNF0sQT1iWzVdLEU9Yls2XSxHPWJbN107Yj1iWzhdO3JldHVybiBlKncqYi1lKkEqRy1oKnUqYitoKkEqRSttKnUqRy1tKncqRX0sZ2V0SW52ZXJzZTpmdW5jdGlvbihiLGUpe2ImJmIuaXNNYXRyaXg0JiYKY29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4MzogLmdldEludmVyc2UoKSBubyBsb25nZXIgdGFrZXMgYSBNYXRyaXg0IGFyZ3VtZW50LiIpO3ZhciBoPWIuZWxlbWVudHM7Yj10aGlzLmVsZW1lbnRzO3ZhciBtPWhbMF0sdT1oWzFdLHc9aFsyXSxBPWhbM10sRT1oWzRdLEc9aFs1XSxKPWhbNl0sUT1oWzddO2g9aFs4XTt2YXIgUz1oKkUtRypRLFQ9RypKLWgqQSxXPVEqQS1FKkosWD1tKlMrdSpUK3cqVztpZigwPT09WCl7aWYoITA9PT1lKXRocm93IEVycm9yKCJUSFJFRS5NYXRyaXgzOiAuZ2V0SW52ZXJzZSgpIGNhbid0IGludmVydCBtYXRyaXgsIGRldGVybWluYW50IGlzIDAiKTtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDM6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMCIpO3JldHVybiB0aGlzLmlkZW50aXR5KCl9ZT0xL1g7YlswXT1TKmU7YlsxXT0odypRLWgqdSkqZTtiWzJdPShHKnUtdypFKSplO2JbM109VCplO2JbNF09CihoKm0tdypKKSplO2JbNV09KHcqQS1HKm0pKmU7Yls2XT1XKmU7Yls3XT0odSpKLVEqbSkqZTtiWzhdPShFKm0tdSpBKSplO3JldHVybiB0aGlzfSx0cmFuc3Bvc2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmVsZW1lbnRzO3ZhciBlPWJbMV07YlsxXT1iWzNdO2JbM109ZTtlPWJbMl07YlsyXT1iWzZdO2JbNl09ZTtlPWJbNV07Yls1XT1iWzddO2JbN109ZTtyZXR1cm4gdGhpc30sZ2V0Tm9ybWFsTWF0cml4OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KGIpLmdldEludmVyc2UodGhpcykudHJhbnNwb3NlKCl9LHRyYW5zcG9zZUludG9BcnJheTpmdW5jdGlvbihiKXt2YXIgZT10aGlzLmVsZW1lbnRzO2JbMF09ZVswXTtiWzFdPWVbM107YlsyXT1lWzZdO2JbM109ZVsxXTtiWzRdPWVbNF07Yls1XT1lWzddO2JbNl09ZVsyXTtiWzddPWVbNV07Yls4XT1lWzhdO3JldHVybiB0aGlzfSxzZXRVdlRyYW5zZm9ybTpmdW5jdGlvbihiLGUsaCxtLHUsdyxBKXt2YXIgRT0KTWF0aC5jb3ModSk7dT1NYXRoLnNpbih1KTt0aGlzLnNldChoKkUsaCp1LC1oKihFKncrdSpBKSt3K2IsLW0qdSxtKkUsLW0qKC11KncrRSpBKStBK2UsMCwwLDEpfSxzY2FsZTpmdW5jdGlvbihiLGUpe3ZhciBoPXRoaXMuZWxlbWVudHM7aFswXSo9YjtoWzNdKj1iO2hbNl0qPWI7aFsxXSo9ZTtoWzRdKj1lO2hbN10qPWU7cmV0dXJuIHRoaXN9LHJvdGF0ZTpmdW5jdGlvbihiKXt2YXIgZT1NYXRoLmNvcyhiKTtiPU1hdGguc2luKGIpO3ZhciBoPXRoaXMuZWxlbWVudHMsbT1oWzBdLHU9aFszXSx3PWhbNl0sQT1oWzFdLEU9aFs0XSxHPWhbN107aFswXT1lKm0rYipBO2hbM109ZSp1K2IqRTtoWzZdPWUqdytiKkc7aFsxXT0tYiptK2UqQTtoWzRdPS1iKnUrZSpFO2hbN109LWIqdytlKkc7cmV0dXJuIHRoaXN9LHRyYW5zbGF0ZTpmdW5jdGlvbihiLGUpe3ZhciBoPXRoaXMuZWxlbWVudHM7aFswXSs9YipoWzJdO2hbM10rPWIqaFs1XTtoWzZdKz1iKmhbOF07aFsxXSs9ZSpoWzJdO2hbNF0rPQplKmhbNV07aFs3XSs9ZSpoWzhdO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5lbGVtZW50cztiPWIuZWxlbWVudHM7Zm9yKHZhciBoPTA7OT5oO2grKylpZihlW2hdIT09YltoXSlyZXR1cm4hMTtyZXR1cm4hMH0sZnJvbUFycmF5OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGU9MCk7Zm9yKHZhciBoPTA7OT5oO2grKyl0aGlzLmVsZW1lbnRzW2hdPWJbaCtlXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWImJihiPVtdKTt2b2lkIDA9PT1lJiYoZT0wKTt2YXIgaD10aGlzLmVsZW1lbnRzO2JbZV09aFswXTtiW2UrMV09aFsxXTtiW2UrMl09aFsyXTtiW2UrM109aFszXTtiW2UrNF09aFs0XTtiW2UrNV09aFs1XTtiW2UrNl09aFs2XTtiW2UrN109aFs3XTtiW2UrOF09aFs4XTtyZXR1cm4gYn19KTt2YXIgcGcsdWU9e2dldERhdGFVUkw6ZnVuY3Rpb24oYil7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudClyZXR1cm4gYi5zcmM7CmlmKCEoYiBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KSl7dm9pZCAwPT09cGcmJihwZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJjYW52YXMiKSk7cGcud2lkdGg9Yi53aWR0aDtwZy5oZWlnaHQ9Yi5oZWlnaHQ7dmFyIGU9cGcuZ2V0Q29udGV4dCgiMmQiKTtiIGluc3RhbmNlb2YgSW1hZ2VEYXRhP2UucHV0SW1hZ2VEYXRhKGIsMCwwKTplLmRyYXdJbWFnZShiLDAsMCxiLndpZHRoLGIuaGVpZ2h0KTtiPXBnfXJldHVybiAyMDQ4PGIud2lkdGh8fDIwNDg8Yi5oZWlnaHQ/Yi50b0RhdGFVUkwoImltYWdlL2pwZWciLC42KTpiLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIil9fSxKcT0wO2suREVGQVVMVF9JTUFHRT12b2lkIDA7ay5ERUZBVUxUX01BUFBJTkc9MzAwO2sucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmssaXNUZXh0dXJlOiEwLHVwZGF0ZU1hdHJpeDpmdW5jdGlvbigpe3RoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKHRoaXMub2Zmc2V0LngsCnRoaXMub2Zmc2V0LnksdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55LHRoaXMucm90YXRpb24sdGhpcy5jZW50ZXIueCx0aGlzLmNlbnRlci55KX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy5uYW1lPWIubmFtZTt0aGlzLmltYWdlPWIuaW1hZ2U7dGhpcy5taXBtYXBzPWIubWlwbWFwcy5zbGljZSgwKTt0aGlzLm1hcHBpbmc9Yi5tYXBwaW5nO3RoaXMud3JhcFM9Yi53cmFwUzt0aGlzLndyYXBUPWIud3JhcFQ7dGhpcy5tYWdGaWx0ZXI9Yi5tYWdGaWx0ZXI7dGhpcy5taW5GaWx0ZXI9Yi5taW5GaWx0ZXI7dGhpcy5hbmlzb3Ryb3B5PWIuYW5pc290cm9weTt0aGlzLmZvcm1hdD1iLmZvcm1hdDt0aGlzLnR5cGU9Yi50eXBlO3RoaXMub2Zmc2V0LmNvcHkoYi5vZmZzZXQpO3RoaXMucmVwZWF0LmNvcHkoYi5yZXBlYXQpO3RoaXMuY2VudGVyLmNvcHkoYi5jZW50ZXIpO3RoaXMucm90YXRpb249CmIucm90YXRpb247dGhpcy5tYXRyaXhBdXRvVXBkYXRlPWIubWF0cml4QXV0b1VwZGF0ZTt0aGlzLm1hdHJpeC5jb3B5KGIubWF0cml4KTt0aGlzLmdlbmVyYXRlTWlwbWFwcz1iLmdlbmVyYXRlTWlwbWFwczt0aGlzLnByZW11bHRpcGx5QWxwaGE9Yi5wcmVtdWx0aXBseUFscGhhO3RoaXMuZmxpcFk9Yi5mbGlwWTt0aGlzLnVucGFja0FsaWdubWVudD1iLnVucGFja0FsaWdubWVudDt0aGlzLmVuY29kaW5nPWIuZW5jb2Rpbmc7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihiKXt2YXIgZT12b2lkIDA9PT1ifHwic3RyaW5nIj09PXR5cGVvZiBiO2lmKCFlJiZ2b2lkIDAhPT1iLnRleHR1cmVzW3RoaXMudXVpZF0pcmV0dXJuIGIudGV4dHVyZXNbdGhpcy51dWlkXTt2YXIgaD17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6IlRleHR1cmUiLGdlbmVyYXRvcjoiVGV4dHVyZS50b0pTT04ifSx1dWlkOnRoaXMudXVpZCxuYW1lOnRoaXMubmFtZSxtYXBwaW5nOnRoaXMubWFwcGluZywKcmVwZWF0Olt0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnldLG9mZnNldDpbdGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55XSxjZW50ZXI6W3RoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueV0scm90YXRpb246dGhpcy5yb3RhdGlvbix3cmFwOlt0aGlzLndyYXBTLHRoaXMud3JhcFRdLGZvcm1hdDp0aGlzLmZvcm1hdCx0eXBlOnRoaXMudHlwZSxlbmNvZGluZzp0aGlzLmVuY29kaW5nLG1pbkZpbHRlcjp0aGlzLm1pbkZpbHRlcixtYWdGaWx0ZXI6dGhpcy5tYWdGaWx0ZXIsYW5pc290cm9weTp0aGlzLmFuaXNvdHJvcHksZmxpcFk6dGhpcy5mbGlwWSxwcmVtdWx0aXBseUFscGhhOnRoaXMucHJlbXVsdGlwbHlBbHBoYSx1bnBhY2tBbGlnbm1lbnQ6dGhpcy51bnBhY2tBbGlnbm1lbnR9O2lmKHZvaWQgMCE9PXRoaXMuaW1hZ2Upe3ZhciBtPXRoaXMuaW1hZ2U7dm9pZCAwPT09bS51dWlkJiYobS51dWlkPWxiLmdlbmVyYXRlVVVJRCgpKTtpZighZSYmdm9pZCAwPT09Yi5pbWFnZXNbbS51dWlkXSl7aWYoQXJyYXkuaXNBcnJheShtKSl7dmFyIHU9CltdO2Zvcih2YXIgdz0wLEE9bS5sZW5ndGg7dzxBO3crKyl1LnB1c2godWUuZ2V0RGF0YVVSTChtW3ddKSl9ZWxzZSB1PXVlLmdldERhdGFVUkwobSk7Yi5pbWFnZXNbbS51dWlkXT17dXVpZDptLnV1aWQsdXJsOnV9fWguaW1hZ2U9bS51dWlkfWV8fChiLnRleHR1cmVzW3RoaXMudXVpZF09aCk7cmV0dXJuIGh9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9LHRyYW5zZm9ybVV2OmZ1bmN0aW9uKGIpe2lmKDMwMCE9PXRoaXMubWFwcGluZylyZXR1cm4gYjtiLmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCk7aWYoMD5iLnh8fDE8Yi54KXN3aXRjaCh0aGlzLndyYXBTKXtjYXNlIDFFMzpiLngtPU1hdGguZmxvb3IoYi54KTticmVhaztjYXNlIDEwMDE6Yi54PTA+Yi54PzA6MTticmVhaztjYXNlIDEwMDI6Yi54PTE9PT1NYXRoLmFicyhNYXRoLmZsb29yKGIueCklMik/TWF0aC5jZWlsKGIueCktYi54OmIueC1NYXRoLmZsb29yKGIueCl9aWYoMD4KYi55fHwxPGIueSlzd2l0Y2godGhpcy53cmFwVCl7Y2FzZSAxRTM6Yi55LT1NYXRoLmZsb29yKGIueSk7YnJlYWs7Y2FzZSAxMDAxOmIueT0wPmIueT8wOjE7YnJlYWs7Y2FzZSAxMDAyOmIueT0xPT09TWF0aC5hYnMoTWF0aC5mbG9vcihiLnkpJTIpP01hdGguY2VpbChiLnkpLWIueTpiLnktTWF0aC5mbG9vcihiLnkpfXRoaXMuZmxpcFkmJihiLnk9MS1iLnkpO3JldHVybiBifX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShrLnByb3RvdHlwZSwibmVlZHNVcGRhdGUiLHtzZXQ6ZnVuY3Rpb24oYil7ITA9PT1iJiZ0aGlzLnZlcnNpb24rK319KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLnByb3RvdHlwZSx7d2lkdGg6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnp9LHNldDpmdW5jdGlvbihiKXt0aGlzLno9Yn19LGhlaWdodDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud30sc2V0OmZ1bmN0aW9uKGIpe3RoaXMudz1ifX19KTtPYmplY3QuYXNzaWduKG4ucHJvdG90eXBlLAp7aXNWZWN0b3I0OiEwLHNldDpmdW5jdGlvbihiLGUsaCxtKXt0aGlzLng9Yjt0aGlzLnk9ZTt0aGlzLno9aDt0aGlzLnc9bTtyZXR1cm4gdGhpc30sc2V0U2NhbGFyOmZ1bmN0aW9uKGIpe3RoaXMudz10aGlzLno9dGhpcy55PXRoaXMueD1iO3JldHVybiB0aGlzfSxzZXRYOmZ1bmN0aW9uKGIpe3RoaXMueD1iO3JldHVybiB0aGlzfSxzZXRZOmZ1bmN0aW9uKGIpe3RoaXMueT1iO3JldHVybiB0aGlzfSxzZXRaOmZ1bmN0aW9uKGIpe3RoaXMuej1iO3JldHVybiB0aGlzfSxzZXRXOmZ1bmN0aW9uKGIpe3RoaXMudz1iO3JldHVybiB0aGlzfSxzZXRDb21wb25lbnQ6ZnVuY3Rpb24oYixlKXtzd2l0Y2goYil7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztjYXNlIDI6dGhpcy56PWU7YnJlYWs7Y2FzZSAzOnRoaXMudz1lO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIitiKTt9cmV0dXJuIHRoaXN9LGdldENvbXBvbmVudDpmdW5jdGlvbihiKXtzd2l0Y2goYil7Y2FzZSAwOnJldHVybiB0aGlzLng7CmNhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2Nhc2UgMzpyZXR1cm4gdGhpcy53O2RlZmF1bHQ6dGhyb3cgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIitiKTt9fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55LHRoaXMueix0aGlzLncpfSxjb3B5OmZ1bmN0aW9uKGIpe3RoaXMueD1iLng7dGhpcy55PWIueTt0aGlzLno9Yi56O3RoaXMudz12b2lkIDAhPT1iLnc/Yi53OjE7cmV0dXJuIHRoaXN9LGFkZDpmdW5jdGlvbihiLGUpe2lmKHZvaWQgMCE9PWUpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yNDogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuYWRkVmVjdG9ycyhiLGUpO3RoaXMueCs9Yi54O3RoaXMueSs9Yi55O3RoaXMueis9Yi56O3RoaXMudys9Yi53O3JldHVybiB0aGlzfSwKYWRkU2NhbGFyOmZ1bmN0aW9uKGIpe3RoaXMueCs9Yjt0aGlzLnkrPWI7dGhpcy56Kz1iO3RoaXMudys9YjtyZXR1cm4gdGhpc30sYWRkVmVjdG9yczpmdW5jdGlvbihiLGUpe3RoaXMueD1iLngrZS54O3RoaXMueT1iLnkrZS55O3RoaXMuej1iLnorZS56O3RoaXMudz1iLncrZS53O3JldHVybiB0aGlzfSxhZGRTY2FsZWRWZWN0b3I6ZnVuY3Rpb24oYixlKXt0aGlzLngrPWIueCplO3RoaXMueSs9Yi55KmU7dGhpcy56Kz1iLnoqZTt0aGlzLncrPWIudyplO3JldHVybiB0aGlzfSxzdWI6ZnVuY3Rpb24oYixlKXtpZih2b2lkIDAhPT1lKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLnN1YlZlY3RvcnMoYixlKTt0aGlzLngtPWIueDt0aGlzLnktPWIueTt0aGlzLnotPWIuejt0aGlzLnctPWIudztyZXR1cm4gdGhpc30sc3ViU2NhbGFyOmZ1bmN0aW9uKGIpe3RoaXMueC09CmI7dGhpcy55LT1iO3RoaXMuei09Yjt0aGlzLnctPWI7cmV0dXJuIHRoaXN9LHN1YlZlY3RvcnM6ZnVuY3Rpb24oYixlKXt0aGlzLng9Yi54LWUueDt0aGlzLnk9Yi55LWUueTt0aGlzLno9Yi56LWUuejt0aGlzLnc9Yi53LWUudztyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYil7dGhpcy54Kj1iO3RoaXMueSo9Yjt0aGlzLnoqPWI7dGhpcy53Kj1iO3JldHVybiB0aGlzfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy54LGg9dGhpcy55LG09dGhpcy56LHU9dGhpcy53O2I9Yi5lbGVtZW50czt0aGlzLng9YlswXSplK2JbNF0qaCtiWzhdKm0rYlsxMl0qdTt0aGlzLnk9YlsxXSplK2JbNV0qaCtiWzldKm0rYlsxM10qdTt0aGlzLno9YlsyXSplK2JbNl0qaCtiWzEwXSptK2JbMTRdKnU7dGhpcy53PWJbM10qZStiWzddKmgrYlsxMV0qbStiWzE1XSp1O3JldHVybiB0aGlzfSxkaXZpZGVTY2FsYXI6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS8KYil9LHNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGIpe3RoaXMudz0yKk1hdGguYWNvcyhiLncpO3ZhciBlPU1hdGguc3FydCgxLWIudypiLncpOzFFLTQ+ZT8odGhpcy54PTEsdGhpcy56PXRoaXMueT0wKToodGhpcy54PWIueC9lLHRoaXMueT1iLnkvZSx0aGlzLno9Yi56L2UpO3JldHVybiB0aGlzfSxzZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXg6ZnVuY3Rpb24oYil7Yj1iLmVsZW1lbnRzO3ZhciBlPWJbMF07dmFyIGg9Yls0XTt2YXIgbT1iWzhdLHU9YlsxXSx3PWJbNV0sQT1iWzldO3ZhciBFPWJbMl07dmFyIEc9Yls2XTt2YXIgSj1iWzEwXTtpZiguMDE+TWF0aC5hYnMoaC11KSYmLjAxPk1hdGguYWJzKG0tRSkmJi4wMT5NYXRoLmFicyhBLUcpKXtpZiguMT5NYXRoLmFicyhoK3UpJiYuMT5NYXRoLmFicyhtK0UpJiYuMT5NYXRoLmFicyhBK0cpJiYuMT5NYXRoLmFicyhlK3crSi0zKSlyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCksdGhpcztiPU1hdGguUEk7CmU9KGUrMSkvMjt3PSh3KzEpLzI7Sj0oSisxKS8yO2g9KGgrdSkvNDttPShtK0UpLzQ7QT0oQStHKS80O2U+dyYmZT5KPy4wMT5lPyhHPTAsaD1FPS43MDcxMDY3ODEpOihHPU1hdGguc3FydChlKSxFPWgvRyxoPW0vRyk6dz5KPy4wMT53PyhHPS43MDcxMDY3ODEsRT0wLGg9LjcwNzEwNjc4MSk6KEU9TWF0aC5zcXJ0KHcpLEc9aC9FLGg9QS9FKTouMDE+Sj8oRT1HPS43MDcxMDY3ODEsaD0wKTooaD1NYXRoLnNxcnQoSiksRz1tL2gsRT1BL2gpO3RoaXMuc2V0KEcsRSxoLGIpO3JldHVybiB0aGlzfWI9TWF0aC5zcXJ0KChHLUEpKihHLUEpKyhtLUUpKihtLUUpKyh1LWgpKih1LWgpKTsuMDAxPk1hdGguYWJzKGIpJiYoYj0xKTt0aGlzLng9KEctQSkvYjt0aGlzLnk9KG0tRSkvYjt0aGlzLno9KHUtaCkvYjt0aGlzLnc9TWF0aC5hY29zKChlK3crSi0xKS8yKTtyZXR1cm4gdGhpc30sbWluOmZ1bmN0aW9uKGIpe3RoaXMueD1NYXRoLm1pbih0aGlzLngsYi54KTt0aGlzLnk9TWF0aC5taW4odGhpcy55LApiLnkpO3RoaXMuej1NYXRoLm1pbih0aGlzLnosYi56KTt0aGlzLnc9TWF0aC5taW4odGhpcy53LGIudyk7cmV0dXJuIHRoaXN9LG1heDpmdW5jdGlvbihiKXt0aGlzLng9TWF0aC5tYXgodGhpcy54LGIueCk7dGhpcy55PU1hdGgubWF4KHRoaXMueSxiLnkpO3RoaXMuej1NYXRoLm1heCh0aGlzLnosYi56KTt0aGlzLnc9TWF0aC5tYXgodGhpcy53LGIudyk7cmV0dXJuIHRoaXN9LGNsYW1wOmZ1bmN0aW9uKGIsZSl7dGhpcy54PU1hdGgubWF4KGIueCxNYXRoLm1pbihlLngsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGIueSxNYXRoLm1pbihlLnksdGhpcy55KSk7dGhpcy56PU1hdGgubWF4KGIueixNYXRoLm1pbihlLnosdGhpcy56KSk7dGhpcy53PU1hdGgubWF4KGIudyxNYXRoLm1pbihlLncsdGhpcy53KSk7cmV0dXJuIHRoaXN9LGNsYW1wU2NhbGFyOmZ1bmN0aW9uKGIsZSl7dGhpcy54PU1hdGgubWF4KGIsTWF0aC5taW4oZSx0aGlzLngpKTt0aGlzLnk9TWF0aC5tYXgoYixNYXRoLm1pbihlLAp0aGlzLnkpKTt0aGlzLno9TWF0aC5tYXgoYixNYXRoLm1pbihlLHRoaXMueikpO3RoaXMudz1NYXRoLm1heChiLE1hdGgubWluKGUsdGhpcy53KSk7cmV0dXJuIHRoaXN9LGNsYW1wTGVuZ3RoOmZ1bmN0aW9uKGIsZSl7dmFyIGg9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoaHx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgoYixNYXRoLm1pbihlLGgpKSl9LGZsb29yOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpO3RoaXMuej1NYXRoLmZsb29yKHRoaXMueik7dGhpcy53PU1hdGguZmxvb3IodGhpcy53KTtyZXR1cm4gdGhpc30sY2VpbDpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmNlaWwodGhpcy54KTt0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSk7dGhpcy56PU1hdGguY2VpbCh0aGlzLnopO3RoaXMudz1NYXRoLmNlaWwodGhpcy53KTtyZXR1cm4gdGhpc30scm91bmQ6ZnVuY3Rpb24oKXt0aGlzLng9Ck1hdGgucm91bmQodGhpcy54KTt0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpO3RoaXMuej1NYXRoLnJvdW5kKHRoaXMueik7dGhpcy53PU1hdGgucm91bmQodGhpcy53KTtyZXR1cm4gdGhpc30scm91bmRUb1plcm86ZnVuY3Rpb24oKXt0aGlzLng9MD50aGlzLng/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpO3RoaXMueT0wPnRoaXMueT9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSk7dGhpcy56PTA+dGhpcy56P01hdGguY2VpbCh0aGlzLnopOk1hdGguZmxvb3IodGhpcy56KTt0aGlzLnc9MD50aGlzLnc/TWF0aC5jZWlsKHRoaXMudyk6TWF0aC5mbG9vcih0aGlzLncpO3JldHVybiB0aGlzfSxuZWdhdGU6ZnVuY3Rpb24oKXt0aGlzLng9LXRoaXMueDt0aGlzLnk9LXRoaXMueTt0aGlzLno9LXRoaXMuejt0aGlzLnc9LXRoaXMudztyZXR1cm4gdGhpc30sZG90OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLngqYi54K3RoaXMueSpiLnkrdGhpcy56KgpiLnordGhpcy53KmIud30sbGVuZ3RoU3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMud30sbGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53KX0sbWFuaGF0dGFuTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopK01hdGguYWJzKHRoaXMudyl9LG5vcm1hbGl6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX0sc2V0TGVuZ3RoOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGIpfSxsZXJwOmZ1bmN0aW9uKGIsZSl7dGhpcy54Kz0oYi54LXRoaXMueCkqZTt0aGlzLnkrPShiLnktdGhpcy55KSplO3RoaXMueis9KGIuei0KdGhpcy56KSplO3RoaXMudys9KGIudy10aGlzLncpKmU7cmV0dXJuIHRoaXN9LGxlcnBWZWN0b3JzOmZ1bmN0aW9uKGIsZSxoKXtyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKGUsYikubXVsdGlwbHlTY2FsYXIoaCkuYWRkKGIpfSxlcXVhbHM6ZnVuY3Rpb24oYil7cmV0dXJuIGIueD09PXRoaXMueCYmYi55PT09dGhpcy55JiZiLno9PT10aGlzLnomJmIudz09PXRoaXMud30sZnJvbUFycmF5OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGU9MCk7dGhpcy54PWJbZV07dGhpcy55PWJbZSsxXTt0aGlzLno9YltlKzJdO3RoaXMudz1iW2UrM107cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1iJiYoYj1bXSk7dm9pZCAwPT09ZSYmKGU9MCk7YltlXT10aGlzLng7YltlKzFdPXRoaXMueTtiW2UrMl09dGhpcy56O2JbZSszXT10aGlzLnc7cmV0dXJuIGJ9LGZyb21CdWZmZXJBdHRyaWJ1dGU6ZnVuY3Rpb24oYixlLGgpe3ZvaWQgMCE9PWgmJmNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yNDogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpOwp0aGlzLng9Yi5nZXRYKGUpO3RoaXMueT1iLmdldFkoZSk7dGhpcy56PWIuZ2V0WihlKTt0aGlzLnc9Yi5nZXRXKGUpO3JldHVybiB0aGlzfX0pO3AucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnAsaXNXZWJHTFJlbmRlclRhcmdldDohMCxzZXRTaXplOmZ1bmN0aW9uKGIsZSl7aWYodGhpcy53aWR0aCE9PWJ8fHRoaXMuaGVpZ2h0IT09ZSl0aGlzLndpZHRoPWIsdGhpcy5oZWlnaHQ9ZSx0aGlzLnRleHR1cmUuaW1hZ2Uud2lkdGg9Yix0aGlzLnRleHR1cmUuaW1hZ2UuaGVpZ2h0PWUsdGhpcy5kaXNwb3NlKCk7dGhpcy52aWV3cG9ydC5zZXQoMCwwLGIsZSk7dGhpcy5zY2lzc29yLnNldCgwLDAsYixlKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy53aWR0aD1iLndpZHRoO3RoaXMuaGVpZ2h0PWIuaGVpZ2h0O3RoaXMudmlld3BvcnQuY29weShiLnZpZXdwb3J0KTsKdGhpcy50ZXh0dXJlPWIudGV4dHVyZS5jbG9uZSgpO3RoaXMuZGVwdGhCdWZmZXI9Yi5kZXB0aEJ1ZmZlcjt0aGlzLnN0ZW5jaWxCdWZmZXI9Yi5zdGVuY2lsQnVmZmVyO3RoaXMuZGVwdGhUZXh0dXJlPWIuZGVwdGhUZXh0dXJlO3JldHVybiB0aGlzfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX0pO3EucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShwLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnEsaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0OiEwLGNvcHk6ZnVuY3Rpb24oYil7cC5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5zYW1wbGVzPWIuc2FtcGxlcztyZXR1cm4gdGhpc319KTt2YXIgTWM9bmV3IGcsZmM9bmV3IHIsdHM9bmV3IGcoMCwwLDApLHVzPW5ldyBnKDEsMSwxKSx2ZT1uZXcgZyxkaj1uZXcgZyxCYz1uZXcgZztPYmplY3QuYXNzaWduKHIucHJvdG90eXBlLHtpc01hdHJpeDQ6ITAsCnNldDpmdW5jdGlvbihiLGUsaCxtLHUsdyxBLEUsRyxKLFEsUyxULFcsWCxpYSl7dmFyIGhhPXRoaXMuZWxlbWVudHM7aGFbMF09YjtoYVs0XT1lO2hhWzhdPWg7aGFbMTJdPW07aGFbMV09dTtoYVs1XT13O2hhWzldPUE7aGFbMTNdPUU7aGFbMl09RztoYVs2XT1KO2hhWzEwXT1RO2hhWzE0XT1TO2hhWzNdPVQ7aGFbN109VztoYVsxMV09WDtoYVsxNV09aWE7cmV0dXJuIHRoaXN9LGlkZW50aXR5OmZ1bmN0aW9uKCl7dGhpcy5zZXQoMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyByKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9LGNvcHk6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5lbGVtZW50cztiPWIuZWxlbWVudHM7ZVswXT1iWzBdO2VbMV09YlsxXTtlWzJdPWJbMl07ZVszXT1iWzNdO2VbNF09Yls0XTtlWzVdPWJbNV07ZVs2XT1iWzZdO2VbN109Yls3XTtlWzhdPWJbOF07ZVs5XT1iWzldO2VbMTBdPQpiWzEwXTtlWzExXT1iWzExXTtlWzEyXT1iWzEyXTtlWzEzXT1iWzEzXTtlWzE0XT1iWzE0XTtlWzE1XT1iWzE1XTtyZXR1cm4gdGhpc30sY29weVBvc2l0aW9uOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuZWxlbWVudHM7Yj1iLmVsZW1lbnRzO2VbMTJdPWJbMTJdO2VbMTNdPWJbMTNdO2VbMTRdPWJbMTRdO3JldHVybiB0aGlzfSxleHRyYWN0QmFzaXM6ZnVuY3Rpb24oYixlLGgpe2Iuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDApO2Uuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDEpO2guc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDIpO3JldHVybiB0aGlzfSxtYWtlQmFzaXM6ZnVuY3Rpb24oYixlLGgpe3RoaXMuc2V0KGIueCxlLngsaC54LDAsYi55LGUueSxoLnksMCxiLnosZS56LGgueiwwLDAsMCwwLDEpO3JldHVybiB0aGlzfSxleHRyYWN0Um90YXRpb246ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5lbGVtZW50cyxoPWIuZWxlbWVudHMsbT0xL01jLnNldEZyb21NYXRyaXhDb2x1bW4oYiwKMCkubGVuZ3RoKCksdT0xL01jLnNldEZyb21NYXRyaXhDb2x1bW4oYiwxKS5sZW5ndGgoKTtiPTEvTWMuc2V0RnJvbU1hdHJpeENvbHVtbihiLDIpLmxlbmd0aCgpO2VbMF09aFswXSptO2VbMV09aFsxXSptO2VbMl09aFsyXSptO2VbM109MDtlWzRdPWhbNF0qdTtlWzVdPWhbNV0qdTtlWzZdPWhbNl0qdTtlWzddPTA7ZVs4XT1oWzhdKmI7ZVs5XT1oWzldKmI7ZVsxMF09aFsxMF0qYjtlWzExXT0wO2VbMTJdPTA7ZVsxM109MDtlWzE0XT0wO2VbMTVdPTE7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvbkZyb21FdWxlcjpmdW5jdGlvbihiKXtiJiZiLmlzRXVsZXJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5tYWtlUm90YXRpb25Gcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuIik7dmFyIGU9dGhpcy5lbGVtZW50cyxoPWIueCxtPWIueSx1PWIueix3PU1hdGguY29zKGgpO2g9TWF0aC5zaW4oaCk7CnZhciBBPU1hdGguY29zKG0pO209TWF0aC5zaW4obSk7dmFyIEU9TWF0aC5jb3ModSk7dT1NYXRoLnNpbih1KTtpZigiWFlaIj09PWIub3JkZXIpe2I9dypFO3ZhciBHPXcqdSxKPWgqRSxRPWgqdTtlWzBdPUEqRTtlWzRdPS1BKnU7ZVs4XT1tO2VbMV09RytKKm07ZVs1XT1iLVEqbTtlWzldPS1oKkE7ZVsyXT1RLWIqbTtlWzZdPUorRyptO2VbMTBdPXcqQX1lbHNlIllYWiI9PT1iLm9yZGVyPyhiPUEqRSxHPUEqdSxKPW0qRSxRPW0qdSxlWzBdPWIrUSpoLGVbNF09SipoLUcsZVs4XT13Km0sZVsxXT13KnUsZVs1XT13KkUsZVs5XT0taCxlWzJdPUcqaC1KLGVbNl09UStiKmgsZVsxMF09dypBKToiWlhZIj09PWIub3JkZXI/KGI9QSpFLEc9QSp1LEo9bSpFLFE9bSp1LGVbMF09Yi1RKmgsZVs0XT0tdyp1LGVbOF09SitHKmgsZVsxXT1HK0oqaCxlWzVdPXcqRSxlWzldPVEtYipoLGVbMl09LXcqbSxlWzZdPWgsZVsxMF09dypBKToiWllYIj09PWIub3JkZXI/KGI9dypFLEc9dyp1LEo9aCoKRSxRPWgqdSxlWzBdPUEqRSxlWzRdPUoqbS1HLGVbOF09YiptK1EsZVsxXT1BKnUsZVs1XT1RKm0rYixlWzldPUcqbS1KLGVbMl09LW0sZVs2XT1oKkEsZVsxMF09dypBKToiWVpYIj09PWIub3JkZXI/KGI9dypBLEc9dyptLEo9aCpBLFE9aCptLGVbMF09QSpFLGVbNF09US1iKnUsZVs4XT1KKnUrRyxlWzFdPXUsZVs1XT13KkUsZVs5XT0taCpFLGVbMl09LW0qRSxlWzZdPUcqdStKLGVbMTBdPWItUSp1KToiWFpZIj09PWIub3JkZXImJihiPXcqQSxHPXcqbSxKPWgqQSxRPWgqbSxlWzBdPUEqRSxlWzRdPS11LGVbOF09bSpFLGVbMV09Yip1K1EsZVs1XT13KkUsZVs5XT1HKnUtSixlWzJdPUoqdS1HLGVbNl09aCpFLGVbMTBdPVEqdStiKTtlWzNdPTA7ZVs3XT0wO2VbMTFdPTA7ZVsxMl09MDtlWzEzXT0wO2VbMTRdPTA7ZVsxNV09MTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb246ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuY29tcG9zZSh0cyxiLHVzKX0sbG9va0F0OmZ1bmN0aW9uKGIsCmUsaCl7dmFyIG09dGhpcy5lbGVtZW50cztCYy5zdWJWZWN0b3JzKGIsZSk7MD09PUJjLmxlbmd0aFNxKCkmJihCYy56PTEpO0JjLm5vcm1hbGl6ZSgpO3ZlLmNyb3NzVmVjdG9ycyhoLEJjKTswPT09dmUubGVuZ3RoU3EoKSYmKDE9PT1NYXRoLmFicyhoLnopP0JjLngrPTFFLTQ6QmMueis9MUUtNCxCYy5ub3JtYWxpemUoKSx2ZS5jcm9zc1ZlY3RvcnMoaCxCYykpO3ZlLm5vcm1hbGl6ZSgpO2RqLmNyb3NzVmVjdG9ycyhCYyx2ZSk7bVswXT12ZS54O21bNF09ZGoueDttWzhdPUJjLng7bVsxXT12ZS55O21bNV09ZGoueTttWzldPUJjLnk7bVsyXT12ZS56O21bNl09ZGouejttWzEwXT1CYy56O3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihiLGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5TWF0cmljZXMoIGEsIGIgKSBpbnN0ZWFkLiIpLAp0aGlzLm11bHRpcGx5TWF0cmljZXMoYixlKSk6dGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsYil9LHByZW11bHRpcGx5OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoYix0aGlzKX0sbXVsdGlwbHlNYXRyaWNlczpmdW5jdGlvbihiLGUpe3ZhciBoPWIuZWxlbWVudHMsbT1lLmVsZW1lbnRzO2U9dGhpcy5lbGVtZW50cztiPWhbMF07dmFyIHU9aFs0XSx3PWhbOF0sQT1oWzEyXSxFPWhbMV0sRz1oWzVdLEo9aFs5XSxRPWhbMTNdLFM9aFsyXSxUPWhbNl0sVz1oWzEwXSxYPWhbMTRdLGlhPWhbM10saGE9aFs3XSxzYT1oWzExXTtoPWhbMTVdO3ZhciBxYT1tWzBdLHJhPW1bNF0sd2E9bVs4XSxwYT1tWzEyXSx2YT1tWzFdLENhPW1bNV0sVmE9bVs5XSxXYT1tWzEzXSxEYT1tWzJdLElhPW1bNl0sRWE9bVsxMF0sT2E9bVsxNF0saGI9bVszXSx5Yj1tWzddLExhPW1bMTFdO209bVsxNV07ZVswXT1iKnFhK3UqdmErdypEYStBKmhiO2VbNF09YipyYSt1KkNhK3cqCklhK0EqeWI7ZVs4XT1iKndhK3UqVmErdypFYStBKkxhO2VbMTJdPWIqcGErdSpXYSt3Kk9hK0EqbTtlWzFdPUUqcWErRyp2YStKKkRhK1EqaGI7ZVs1XT1FKnJhK0cqQ2ErSipJYStRKnliO2VbOV09RSp3YStHKlZhK0oqRWErUSpMYTtlWzEzXT1FKnBhK0cqV2ErSipPYStRKm07ZVsyXT1TKnFhK1QqdmErVypEYStYKmhiO2VbNl09UypyYStUKkNhK1cqSWErWCp5YjtlWzEwXT1TKndhK1QqVmErVypFYStYKkxhO2VbMTRdPVMqcGErVCpXYStXKk9hK1gqbTtlWzNdPWlhKnFhK2hhKnZhK3NhKkRhK2gqaGI7ZVs3XT1pYSpyYStoYSpDYStzYSpJYStoKnliO2VbMTFdPWlhKndhK2hhKlZhK3NhKkVhK2gqTGE7ZVsxNV09aWEqcGEraGEqV2Erc2EqT2EraCptO3JldHVybiB0aGlzfSxtdWx0aXBseVNjYWxhcjpmdW5jdGlvbihiKXt2YXIgZT10aGlzLmVsZW1lbnRzO2VbMF0qPWI7ZVs0XSo9YjtlWzhdKj1iO2VbMTJdKj1iO2VbMV0qPWI7ZVs1XSo9YjtlWzldKj1iO2VbMTNdKj1iO2VbMl0qPQpiO2VbNl0qPWI7ZVsxMF0qPWI7ZVsxNF0qPWI7ZVszXSo9YjtlWzddKj1iO2VbMTFdKj1iO2VbMTVdKj1iO3JldHVybiB0aGlzfSxhcHBseVRvQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZT0wLGg9Yi5jb3VudDtlPGg7ZSsrKU1jLng9Yi5nZXRYKGUpLE1jLnk9Yi5nZXRZKGUpLE1jLno9Yi5nZXRaKGUpLE1jLmFwcGx5TWF0cml4NCh0aGlzKSxiLnNldFhZWihlLE1jLngsTWMueSxNYy56KTtyZXR1cm4gYn0sZGV0ZXJtaW5hbnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmVsZW1lbnRzLGU9YlswXSxoPWJbNF0sbT1iWzhdLHU9YlsxMl0sdz1iWzFdLEE9Yls1XSxFPWJbOV0sRz1iWzEzXSxKPWJbMl0sUT1iWzZdLFM9YlsxMF0sVD1iWzE0XTtyZXR1cm4gYlszXSooK3UqRSpRLW0qRypRLXUqQSpTK2gqRypTK20qQSpULWgqRSpUKStiWzddKigrZSpFKlQtZSpHKlMrdSp3KlMtbSp3KlQrbSpHKkotdSpFKkopK2JbMTFdKigrZSpHKlEtZSpBKlQtdSp3KlEraCp3KlQrCnUqQSpKLWgqRypKKStiWzE1XSooLW0qQSpKLWUqRSpRK2UqQSpTK20qdypRLWgqdypTK2gqRSpKKX0sdHJhbnNwb3NlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lbGVtZW50czt2YXIgZT1iWzFdO2JbMV09Yls0XTtiWzRdPWU7ZT1iWzJdO2JbMl09Yls4XTtiWzhdPWU7ZT1iWzZdO2JbNl09Yls5XTtiWzldPWU7ZT1iWzNdO2JbM109YlsxMl07YlsxMl09ZTtlPWJbN107Yls3XT1iWzEzXTtiWzEzXT1lO2U9YlsxMV07YlsxMV09YlsxNF07YlsxNF09ZTtyZXR1cm4gdGhpc30sc2V0UG9zaXRpb246ZnVuY3Rpb24oYixlLGgpe3ZhciBtPXRoaXMuZWxlbWVudHM7Yi5pc1ZlY3RvcjM/KG1bMTJdPWIueCxtWzEzXT1iLnksbVsxNF09Yi56KToobVsxMl09YixtWzEzXT1lLG1bMTRdPWgpO3JldHVybiB0aGlzfSxnZXRJbnZlcnNlOmZ1bmN0aW9uKGIsZSl7dmFyIGg9dGhpcy5lbGVtZW50cyxtPWIuZWxlbWVudHM7Yj1tWzBdO3ZhciB1PW1bMV0sdz1tWzJdLEE9bVszXSxFPW1bNF0sRz1tWzVdLApKPW1bNl0sUT1tWzddLFM9bVs4XSxUPW1bOV0sVz1tWzEwXSxYPW1bMTFdLGlhPW1bMTJdLGhhPW1bMTNdLHNhPW1bMTRdO209bVsxNV07dmFyIHFhPVQqc2EqUS1oYSpXKlEraGEqSipYLUcqc2EqWC1UKkoqbStHKlcqbSxyYT1pYSpXKlEtUypzYSpRLWlhKkoqWCtFKnNhKlgrUypKKm0tRSpXKm0sd2E9UypoYSpRLWlhKlQqUStpYSpHKlgtRSpoYSpYLVMqRyptK0UqVCptLHBhPWlhKlQqSi1TKmhhKkotaWEqRypXK0UqaGEqVytTKkcqc2EtRSpUKnNhLHZhPWIqcWErdSpyYSt3KndhK0EqcGE7aWYoMD09PXZhKXtpZighMD09PWUpdGhyb3cgRXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMCIpO2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmdldEludmVyc2UoKSBjYW4ndCBpbnZlcnQgbWF0cml4LCBkZXRlcm1pbmFudCBpcyAwIik7cmV0dXJuIHRoaXMuaWRlbnRpdHkoKX1lPTEvdmE7aFswXT0KcWEqZTtoWzFdPShoYSpXKkEtVCpzYSpBLWhhKncqWCt1KnNhKlgrVCp3Km0tdSpXKm0pKmU7aFsyXT0oRypzYSpBLWhhKkoqQStoYSp3KlEtdSpzYSpRLUcqdyptK3UqSiptKSplO2hbM109KFQqSipBLUcqVypBLVQqdypRK3UqVypRK0cqdypYLXUqSipYKSplO2hbNF09cmEqZTtoWzVdPShTKnNhKkEtaWEqVypBK2lhKncqWC1iKnNhKlgtUyp3Km0rYipXKm0pKmU7aFs2XT0oaWEqSipBLUUqc2EqQS1pYSp3KlErYipzYSpRK0UqdyptLWIqSiptKSplO2hbN109KEUqVypBLVMqSipBK1MqdypRLWIqVypRLUUqdypYK2IqSipYKSplO2hbOF09d2EqZTtoWzldPShpYSpUKkEtUypoYSpBLWlhKnUqWCtiKmhhKlgrUyp1Km0tYipUKm0pKmU7aFsxMF09KEUqaGEqQS1pYSpHKkEraWEqdSpRLWIqaGEqUS1FKnUqbStiKkcqbSkqZTtoWzExXT0oUypHKkEtRSpUKkEtUyp1KlErYipUKlErRSp1KlgtYipHKlgpKmU7aFsxMl09cGEqZTtoWzEzXT0oUypoYSp3LWlhKlQqdytpYSp1KlctYipoYSpXLQpTKnUqc2ErYipUKnNhKSplO2hbMTRdPShpYSpHKnctRSpoYSp3LWlhKnUqSitiKmhhKkorRSp1KnNhLWIqRypzYSkqZTtoWzE1XT0oRSpUKnctUypHKncrUyp1KkotYipUKkotRSp1KlcrYipHKlcpKmU7cmV0dXJuIHRoaXN9LHNjYWxlOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuZWxlbWVudHMsaD1iLngsbT1iLnk7Yj1iLno7ZVswXSo9aDtlWzRdKj1tO2VbOF0qPWI7ZVsxXSo9aDtlWzVdKj1tO2VbOV0qPWI7ZVsyXSo9aDtlWzZdKj1tO2VbMTBdKj1iO2VbM10qPWg7ZVs3XSo9bTtlWzExXSo9YjtyZXR1cm4gdGhpc30sZ2V0TWF4U2NhbGVPbkF4aXM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmVsZW1lbnRzO3JldHVybiBNYXRoLnNxcnQoTWF0aC5tYXgoYlswXSpiWzBdK2JbMV0qYlsxXStiWzJdKmJbMl0sYls0XSpiWzRdK2JbNV0qYls1XStiWzZdKmJbNl0sYls4XSpiWzhdK2JbOV0qYls5XStiWzEwXSpiWzEwXSkpfSxtYWtlVHJhbnNsYXRpb246ZnVuY3Rpb24oYixlLGgpe3RoaXMuc2V0KDEsCjAsMCxiLDAsMSwwLGUsMCwwLDEsaCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uWDpmdW5jdGlvbihiKXt2YXIgZT1NYXRoLmNvcyhiKTtiPU1hdGguc2luKGIpO3RoaXMuc2V0KDEsMCwwLDAsMCxlLC1iLDAsMCxiLGUsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uWTpmdW5jdGlvbihiKXt2YXIgZT1NYXRoLmNvcyhiKTtiPU1hdGguc2luKGIpO3RoaXMuc2V0KGUsMCxiLDAsMCwxLDAsMCwtYiwwLGUsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uWjpmdW5jdGlvbihiKXt2YXIgZT1NYXRoLmNvcyhiKTtiPU1hdGguc2luKGIpO3RoaXMuc2V0KGUsLWIsMCwwLGIsZSwwLDAsMCwwLDEsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uQXhpczpmdW5jdGlvbihiLGUpe3ZhciBoPU1hdGguY29zKGUpO2U9TWF0aC5zaW4oZSk7dmFyIG09MS1oLHU9Yi54LHc9Yi55O2I9Yi56O3ZhciBBPW0qdSxFPW0qdzt0aGlzLnNldChBKgp1K2gsQSp3LWUqYixBKmIrZSp3LDAsQSp3K2UqYixFKncraCxFKmItZSp1LDAsQSpiLWUqdyxFKmIrZSp1LG0qYipiK2gsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVNjYWxlOmZ1bmN0aW9uKGIsZSxoKXt0aGlzLnNldChiLDAsMCwwLDAsZSwwLDAsMCwwLGgsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVNoZWFyOmZ1bmN0aW9uKGIsZSxoKXt0aGlzLnNldCgxLGUsaCwwLGIsMSxoLDAsYixlLDEsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sY29tcG9zZTpmdW5jdGlvbihiLGUsaCl7dmFyIG09dGhpcy5lbGVtZW50cyx1PWUuX3gsdz1lLl95LEE9ZS5feixFPWUuX3csRz11K3UsSj13K3csUT1BK0E7ZT11Kkc7dmFyIFM9dSpKO3UqPVE7dmFyIFQ9dypKO3cqPVE7QSo9UTtHKj1FO0oqPUU7RSo9UTtRPWgueDt2YXIgVz1oLnk7aD1oLno7bVswXT0oMS0oVCtBKSkqUTttWzFdPShTK0UpKlE7bVsyXT0odS1KKSpRO21bM109MDttWzRdPShTLUUpKlc7bVs1XT0oMS0oZStBKSkqClc7bVs2XT0odytHKSpXO21bN109MDttWzhdPSh1K0opKmg7bVs5XT0ody1HKSpoO21bMTBdPSgxLShlK1QpKSpoO21bMTFdPTA7bVsxMl09Yi54O21bMTNdPWIueTttWzE0XT1iLno7bVsxNV09MTtyZXR1cm4gdGhpc30sZGVjb21wb3NlOmZ1bmN0aW9uKGIsZSxoKXt2YXIgbT10aGlzLmVsZW1lbnRzLHU9TWMuc2V0KG1bMF0sbVsxXSxtWzJdKS5sZW5ndGgoKSx3PU1jLnNldChtWzRdLG1bNV0sbVs2XSkubGVuZ3RoKCksQT1NYy5zZXQobVs4XSxtWzldLG1bMTBdKS5sZW5ndGgoKTswPnRoaXMuZGV0ZXJtaW5hbnQoKSYmKHU9LXUpO2IueD1tWzEyXTtiLnk9bVsxM107Yi56PW1bMTRdO2ZjLmNvcHkodGhpcyk7Yj0xL3U7bT0xL3c7dmFyIEU9MS9BO2ZjLmVsZW1lbnRzWzBdKj1iO2ZjLmVsZW1lbnRzWzFdKj1iO2ZjLmVsZW1lbnRzWzJdKj1iO2ZjLmVsZW1lbnRzWzRdKj1tO2ZjLmVsZW1lbnRzWzVdKj1tO2ZjLmVsZW1lbnRzWzZdKj1tO2ZjLmVsZW1lbnRzWzhdKj1FO2ZjLmVsZW1lbnRzWzldKj0KRTtmYy5lbGVtZW50c1sxMF0qPUU7ZS5zZXRGcm9tUm90YXRpb25NYXRyaXgoZmMpO2gueD11O2gueT13O2guej1BO3JldHVybiB0aGlzfSxtYWtlUGVyc3BlY3RpdmU6ZnVuY3Rpb24oYixlLGgsbSx1LHcpe3ZvaWQgMD09PXcmJmNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm1ha2VQZXJzcGVjdGl2ZSgpIGhhcyBiZWVuIHJlZGVmaW5lZCBhbmQgaGFzIGEgbmV3IHNpZ25hdHVyZS4gUGxlYXNlIGNoZWNrIHRoZSBkb2NzLiIpO3ZhciBBPXRoaXMuZWxlbWVudHM7QVswXT0yKnUvKGUtYik7QVs0XT0wO0FbOF09KGUrYikvKGUtYik7QVsxMl09MDtBWzFdPTA7QVs1XT0yKnUvKGgtbSk7QVs5XT0oaCttKS8oaC1tKTtBWzEzXT0wO0FbMl09MDtBWzZdPTA7QVsxMF09LSh3K3UpLyh3LXUpO0FbMTRdPS0yKncqdS8ody11KTtBWzNdPTA7QVs3XT0wO0FbMTFdPS0xO0FbMTVdPTA7cmV0dXJuIHRoaXN9LG1ha2VPcnRob2dyYXBoaWM6ZnVuY3Rpb24oYixlLGgsbSx1LHcpe3ZhciBBPQp0aGlzLmVsZW1lbnRzLEU9MS8oZS1iKSxHPTEvKGgtbSksSj0xLyh3LXUpO0FbMF09MipFO0FbNF09MDtBWzhdPTA7QVsxMl09LSgoZStiKSpFKTtBWzFdPTA7QVs1XT0yKkc7QVs5XT0wO0FbMTNdPS0oKGgrbSkqRyk7QVsyXT0wO0FbNl09MDtBWzEwXT0tMipKO0FbMTRdPS0oKHcrdSkqSik7QVszXT0wO0FbN109MDtBWzExXT0wO0FbMTVdPTE7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihiKXt2YXIgZT10aGlzLmVsZW1lbnRzO2I9Yi5lbGVtZW50cztmb3IodmFyIGg9MDsxNj5oO2grKylpZihlW2hdIT09YltoXSlyZXR1cm4hMTtyZXR1cm4hMH0sZnJvbUFycmF5OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGU9MCk7Zm9yKHZhciBoPTA7MTY+aDtoKyspdGhpcy5lbGVtZW50c1toXT1iW2grZV07cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1iJiYoYj1bXSk7dm9pZCAwPT09ZSYmKGU9MCk7dmFyIGg9dGhpcy5lbGVtZW50cztiW2VdPWhbMF07CmJbZSsxXT1oWzFdO2JbZSsyXT1oWzJdO2JbZSszXT1oWzNdO2JbZSs0XT1oWzRdO2JbZSs1XT1oWzVdO2JbZSs2XT1oWzZdO2JbZSs3XT1oWzddO2JbZSs4XT1oWzhdO2JbZSs5XT1oWzldO2JbZSsxMF09aFsxMF07YltlKzExXT1oWzExXTtiW2UrMTJdPWhbMTJdO2JbZSsxM109aFsxM107YltlKzE0XT1oWzE0XTtiW2UrMTVdPWhbMTVdO3JldHVybiBifX0pO3ZhciBsbz1uZXcgcixtbz1uZXcgZjt0LlJvdGF0aW9uT3JkZXJzPSJYWVogWVpYIFpYWSBYWlkgWVhaIFpZWCIuc3BsaXQoIiAiKTt0LkRlZmF1bHRPcmRlcj0iWFlaIjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LnByb3RvdHlwZSx7eDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3h9LHNldDpmdW5jdGlvbihiKXt0aGlzLl94PWI7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX0seTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3l9LHNldDpmdW5jdGlvbihiKXt0aGlzLl95PWI7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX0sCno6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl96fSxzZXQ6ZnVuY3Rpb24oYil7dGhpcy5fej1iO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX19LG9yZGVyOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JkZXJ9LHNldDpmdW5jdGlvbihiKXt0aGlzLl9vcmRlcj1iO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX19fSk7T2JqZWN0LmFzc2lnbih0LnByb3RvdHlwZSx7aXNFdWxlcjohMCxzZXQ6ZnVuY3Rpb24oYixlLGgsbSl7dGhpcy5feD1iO3RoaXMuX3k9ZTt0aGlzLl96PWg7dGhpcy5fb3JkZXI9bXx8dGhpcy5fb3JkZXI7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl9vcmRlcil9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy5feD1iLl94O3RoaXMuX3k9Yi5feTt0aGlzLl96PWIuX3o7dGhpcy5fb3JkZXI9Yi5fb3JkZXI7CnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2V0RnJvbVJvdGF0aW9uTWF0cml4OmZ1bmN0aW9uKGIsZSxoKXt2YXIgbT1sYi5jbGFtcCx1PWIuZWxlbWVudHM7Yj11WzBdO3ZhciB3PXVbNF0sQT11WzhdLEU9dVsxXSxHPXVbNV0sSj11WzldLFE9dVsyXSxTPXVbNl07dT11WzEwXTtlPWV8fHRoaXMuX29yZGVyOyJYWVoiPT09ZT8odGhpcy5feT1NYXRoLmFzaW4obShBLC0xLDEpKSwuOTk5OTk5OT5NYXRoLmFicyhBKT8odGhpcy5feD1NYXRoLmF0YW4yKC1KLHUpLHRoaXMuX3o9TWF0aC5hdGFuMigtdyxiKSk6KHRoaXMuX3g9TWF0aC5hdGFuMihTLEcpLHRoaXMuX3o9MCkpOiJZWFoiPT09ZT8odGhpcy5feD1NYXRoLmFzaW4oLW0oSiwtMSwxKSksLjk5OTk5OTk+TWF0aC5hYnMoSik/KHRoaXMuX3k9TWF0aC5hdGFuMihBLHUpLHRoaXMuX3o9TWF0aC5hdGFuMihFLEcpKToodGhpcy5feT1NYXRoLmF0YW4yKC1RLGIpLHRoaXMuX3o9MCkpOiJaWFkiPT09ZT8odGhpcy5feD0KTWF0aC5hc2luKG0oUywtMSwxKSksLjk5OTk5OTk+TWF0aC5hYnMoUyk/KHRoaXMuX3k9TWF0aC5hdGFuMigtUSx1KSx0aGlzLl96PU1hdGguYXRhbjIoLXcsRykpOih0aGlzLl95PTAsdGhpcy5fej1NYXRoLmF0YW4yKEUsYikpKToiWllYIj09PWU/KHRoaXMuX3k9TWF0aC5hc2luKC1tKFEsLTEsMSkpLC45OTk5OTk5Pk1hdGguYWJzKFEpPyh0aGlzLl94PU1hdGguYXRhbjIoUyx1KSx0aGlzLl96PU1hdGguYXRhbjIoRSxiKSk6KHRoaXMuX3g9MCx0aGlzLl96PU1hdGguYXRhbjIoLXcsRykpKToiWVpYIj09PWU/KHRoaXMuX3o9TWF0aC5hc2luKG0oRSwtMSwxKSksLjk5OTk5OTk+TWF0aC5hYnMoRSk/KHRoaXMuX3g9TWF0aC5hdGFuMigtSixHKSx0aGlzLl95PU1hdGguYXRhbjIoLVEsYikpOih0aGlzLl94PTAsdGhpcy5feT1NYXRoLmF0YW4yKEEsdSkpKToiWFpZIj09PWU/KHRoaXMuX3o9TWF0aC5hc2luKC1tKHcsLTEsMSkpLC45OTk5OTk5Pk1hdGguYWJzKHcpPyh0aGlzLl94PQpNYXRoLmF0YW4yKFMsRyksdGhpcy5feT1NYXRoLmF0YW4yKEEsYikpOih0aGlzLl94PU1hdGguYXRhbjIoLUosdSksdGhpcy5feT0wKSk6Y29uc29sZS53YXJuKCJUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGdpdmVuIHVuc3VwcG9ydGVkIG9yZGVyOiAiK2UpO3RoaXMuX29yZGVyPWU7ITEhPT1oJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHNldEZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGIsZSxoKXtsby5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihiKTtyZXR1cm4gdGhpcy5zZXRGcm9tUm90YXRpb25NYXRyaXgobG8sZSxoKX0sc2V0RnJvbVZlY3RvcjM6ZnVuY3Rpb24oYixlKXtyZXR1cm4gdGhpcy5zZXQoYi54LGIueSxiLnosZXx8dGhpcy5fb3JkZXIpfSxyZW9yZGVyOmZ1bmN0aW9uKGIpe21vLnNldEZyb21FdWxlcih0aGlzKTtyZXR1cm4gdGhpcy5zZXRGcm9tUXVhdGVybmlvbihtbyxiKX0sZXF1YWxzOmZ1bmN0aW9uKGIpe3JldHVybiBiLl94PT09CnRoaXMuX3gmJmIuX3k9PT10aGlzLl95JiZiLl96PT09dGhpcy5feiYmYi5fb3JkZXI9PT10aGlzLl9vcmRlcn0sZnJvbUFycmF5OmZ1bmN0aW9uKGIpe3RoaXMuX3g9YlswXTt0aGlzLl95PWJbMV07dGhpcy5fej1iWzJdO3ZvaWQgMCE9PWJbM10mJih0aGlzLl9vcmRlcj1iWzNdKTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1iJiYoYj1bXSk7dm9pZCAwPT09ZSYmKGU9MCk7YltlXT10aGlzLl94O2JbZSsxXT10aGlzLl95O2JbZSsyXT10aGlzLl96O2JbZSszXT10aGlzLl9vcmRlcjtyZXR1cm4gYn0sdG9WZWN0b3IzOmZ1bmN0aW9uKGIpe3JldHVybiBiP2Iuc2V0KHRoaXMuX3gsdGhpcy5feSx0aGlzLl96KTpuZXcgZyh0aGlzLl94LHRoaXMuX3ksdGhpcy5feil9LF9vbkNoYW5nZTpmdW5jdGlvbihiKXt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPWI7cmV0dXJuIHRoaXN9LF9vbkNoYW5nZUNhbGxiYWNrOmZ1bmN0aW9uKCl7fX0pOwpPYmplY3QuYXNzaWduKHYucHJvdG90eXBlLHtzZXQ6ZnVuY3Rpb24oYil7dGhpcy5tYXNrPTE8PGJ8MH0sZW5hYmxlOmZ1bmN0aW9uKGIpe3RoaXMubWFzaz10aGlzLm1hc2t8MTw8YnwwfSxlbmFibGVBbGw6ZnVuY3Rpb24oKXt0aGlzLm1hc2s9LTF9LHRvZ2dsZTpmdW5jdGlvbihiKXt0aGlzLm1hc2tePTE8PGJ8MH0sZGlzYWJsZTpmdW5jdGlvbihiKXt0aGlzLm1hc2smPX4oMTw8YnwwKX0sZGlzYWJsZUFsbDpmdW5jdGlvbigpe3RoaXMubWFzaz0wfSx0ZXN0OmZ1bmN0aW9uKGIpe3JldHVybiAwIT09KHRoaXMubWFzayZiLm1hc2spfX0pO3ZhciBLcT0wLG5vPW5ldyBnLHFnPW5ldyBmLFRkPW5ldyByLGVqPW5ldyBnLFBoPW5ldyBnLHZzPW5ldyBnLHdzPW5ldyBmLG9vPW5ldyBnKDEsMCwwKSxwbz1uZXcgZygwLDEsMCkscW89bmV3IGcoMCwwLDEpLHhzPXt0eXBlOiJhZGRlZCJ9LHlzPXt0eXBlOiJyZW1vdmVkIn07eS5EZWZhdWx0VXA9bmV3IGcoMCwxLDApO3kuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGU9CiEwO3kucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnksaXNPYmplY3QzRDohMCxvbkJlZm9yZVJlbmRlcjpmdW5jdGlvbigpe30sb25BZnRlclJlbmRlcjpmdW5jdGlvbigpe30sYXBwbHlNYXRyaXg6ZnVuY3Rpb24oYil7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpO3RoaXMubWF0cml4LnByZW11bHRpcGx5KGIpO3RoaXMubWF0cml4LmRlY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKX0sYXBwbHlRdWF0ZXJuaW9uOmZ1bmN0aW9uKGIpe3RoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShiKTtyZXR1cm4gdGhpc30sc2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlOmZ1bmN0aW9uKGIsZSl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoYixlKX0sc2V0Um90YXRpb25Gcm9tRXVsZXI6ZnVuY3Rpb24oYil7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21FdWxlcihiLAohMCl9LHNldFJvdGF0aW9uRnJvbU1hdHJpeDpmdW5jdGlvbihiKXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KGIpfSxzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGIpe3RoaXMucXVhdGVybmlvbi5jb3B5KGIpfSxyb3RhdGVPbkF4aXM6ZnVuY3Rpb24oYixlKXtxZy5zZXRGcm9tQXhpc0FuZ2xlKGIsZSk7dGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KHFnKTtyZXR1cm4gdGhpc30scm90YXRlT25Xb3JsZEF4aXM6ZnVuY3Rpb24oYixlKXtxZy5zZXRGcm9tQXhpc0FuZ2xlKGIsZSk7dGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KHFnKTtyZXR1cm4gdGhpc30scm90YXRlWDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMob28sYil9LHJvdGF0ZVk6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKHBvLGIpfSxyb3RhdGVaOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhxbyxiKX0sdHJhbnNsYXRlT25BeGlzOmZ1bmN0aW9uKGIsCmUpe25vLmNvcHkoYikuYXBwbHlRdWF0ZXJuaW9uKHRoaXMucXVhdGVybmlvbik7dGhpcy5wb3NpdGlvbi5hZGQobm8ubXVsdGlwbHlTY2FsYXIoZSkpO3JldHVybiB0aGlzfSx0cmFuc2xhdGVYOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhvbyxiKX0sdHJhbnNsYXRlWTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMocG8sYil9LHRyYW5zbGF0ZVo6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKHFvLGIpfSxsb2NhbFRvV29ybGQ6ZnVuY3Rpb24oYil7cmV0dXJuIGIuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpfSx3b3JsZFRvTG9jYWw6ZnVuY3Rpb24oYil7cmV0dXJuIGIuYXBwbHlNYXRyaXg0KFRkLmdldEludmVyc2UodGhpcy5tYXRyaXhXb3JsZCkpfSxsb29rQXQ6ZnVuY3Rpb24oYixlLGgpe2IuaXNWZWN0b3IzP2VqLmNvcHkoYik6ZWouc2V0KGIsZSxoKTtiPXRoaXMucGFyZW50O3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsCiExKTtQaC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7dGhpcy5pc0NhbWVyYXx8dGhpcy5pc0xpZ2h0P1RkLmxvb2tBdChQaCxlaix0aGlzLnVwKTpUZC5sb29rQXQoZWosUGgsdGhpcy51cCk7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeChUZCk7YiYmKFRkLmV4dHJhY3RSb3RhdGlvbihiLm1hdHJpeFdvcmxkKSxxZy5zZXRGcm9tUm90YXRpb25NYXRyaXgoVGQpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShxZy5pbnZlcnNlKCkpKX0sYWRkOmZ1bmN0aW9uKGIpe2lmKDE8YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0aGlzLmFkZChhcmd1bWVudHNbZV0pO3JldHVybiB0aGlzfWlmKGI9PT10aGlzKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBjYW4ndCBiZSBhZGRlZCBhcyBhIGNoaWxkIG9mIGl0c2VsZi4iLGIpLHRoaXM7YiYmYi5pc09iamVjdDNEPwoobnVsbCE9PWIucGFyZW50JiZiLnBhcmVudC5yZW1vdmUoYiksYi5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkcmVuLnB1c2goYiksYi5kaXNwYXRjaEV2ZW50KHhzKSk6Y29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3Qgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLk9iamVjdDNELiIsYik7cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbihiKXtpZigxPGFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdGhpcy5yZW1vdmUoYXJndW1lbnRzW2VdKTtyZXR1cm4gdGhpc31lPXRoaXMuY2hpbGRyZW4uaW5kZXhPZihiKTstMSE9PWUmJihiLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW4uc3BsaWNlKGUsMSksYi5kaXNwYXRjaEV2ZW50KHlzKSk7cmV0dXJuIHRoaXN9LGF0dGFjaDpmdW5jdGlvbihiKXt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTtUZC5nZXRJbnZlcnNlKHRoaXMubWF0cml4V29ybGQpO251bGwhPT0KYi5wYXJlbnQmJihiLnBhcmVudC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksVGQubXVsdGlwbHkoYi5wYXJlbnQubWF0cml4V29ybGQpKTtiLmFwcGx5TWF0cml4KFRkKTtiLnVwZGF0ZVdvcmxkTWF0cml4KCExLCExKTt0aGlzLmFkZChiKTtyZXR1cm4gdGhpc30sZ2V0T2JqZWN0QnlJZDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJpZCIsYil9LGdldE9iamVjdEJ5TmFtZTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJuYW1lIixiKX0sZ2V0T2JqZWN0QnlQcm9wZXJ0eTpmdW5jdGlvbihiLGUpe2lmKHRoaXNbYl09PT1lKXJldHVybiB0aGlzO2Zvcih2YXIgaD0wLG09dGhpcy5jaGlsZHJlbi5sZW5ndGg7aDxtO2grKyl7dmFyIHU9dGhpcy5jaGlsZHJlbltoXS5nZXRPYmplY3RCeVByb3BlcnR5KGIsZSk7aWYodm9pZCAwIT09dSlyZXR1cm4gdX19LGdldFdvcmxkUG9zaXRpb246ZnVuY3Rpb24oYil7dm9pZCAwPT09CmImJihjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRQb3NpdGlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxiPW5ldyBnKTt0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTtyZXR1cm4gYi5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCl9LGdldFdvcmxkUXVhdGVybmlvbjpmdW5jdGlvbihiKXt2b2lkIDA9PT1iJiYoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUXVhdGVybmlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxiPW5ldyBmKTt0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTt0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShQaCxiLHZzKTtyZXR1cm4gYn0sZ2V0V29ybGRTY2FsZTpmdW5jdGlvbihiKXt2b2lkIDA9PT1iJiYoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkU2NhbGUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYj1uZXcgZyk7dGhpcy51cGRhdGVNYXRyaXhXb3JsZCghMCk7CnRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKFBoLHdzLGIpO3JldHVybiBifSxnZXRXb3JsZERpcmVjdGlvbjpmdW5jdGlvbihiKXt2b2lkIDA9PT1iJiYoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkRGlyZWN0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGI9bmV3IGcpO3RoaXMudXBkYXRlTWF0cml4V29ybGQoITApO3ZhciBlPXRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7cmV0dXJuIGIuc2V0KGVbOF0sZVs5XSxlWzEwXSkubm9ybWFsaXplKCl9LHJheWNhc3Q6ZnVuY3Rpb24oKXt9LHRyYXZlcnNlOmZ1bmN0aW9uKGIpe2IodGhpcyk7Zm9yKHZhciBlPXRoaXMuY2hpbGRyZW4saD0wLG09ZS5sZW5ndGg7aDxtO2grKyllW2hdLnRyYXZlcnNlKGIpfSx0cmF2ZXJzZVZpc2libGU6ZnVuY3Rpb24oYil7aWYoITEhPT10aGlzLnZpc2libGUpe2IodGhpcyk7Zm9yKHZhciBlPXRoaXMuY2hpbGRyZW4saD0wLG09ZS5sZW5ndGg7aDxtO2grKyllW2hdLnRyYXZlcnNlVmlzaWJsZShiKX19LAp0cmF2ZXJzZUFuY2VzdG9yczpmdW5jdGlvbihiKXt2YXIgZT10aGlzLnBhcmVudDtudWxsIT09ZSYmKGIoZSksZS50cmF2ZXJzZUFuY2VzdG9ycyhiKSl9LHVwZGF0ZU1hdHJpeDpmdW5jdGlvbigpe3RoaXMubWF0cml4LmNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSk7dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihiKXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCk7aWYodGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlfHxiKW51bGw9PT10aGlzLnBhcmVudD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCksdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLGI9ITA7Zm9yKHZhciBlPXRoaXMuY2hpbGRyZW4saD0KMCxtPWUubGVuZ3RoO2g8bTtoKyspZVtoXS51cGRhdGVNYXRyaXhXb3JsZChiKX0sdXBkYXRlV29ybGRNYXRyaXg6ZnVuY3Rpb24oYixlKXt2YXIgaD10aGlzLnBhcmVudDshMD09PWImJm51bGwhPT1oJiZoLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCk7bnVsbD09PXRoaXMucGFyZW50P3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KTtpZighMD09PWUpZm9yKGI9dGhpcy5jaGlsZHJlbixlPTAsaD1iLmxlbmd0aDtlPGg7ZSsrKWJbZV0udXBkYXRlV29ybGRNYXRyaXgoITEsITApfSx0b0pTT046ZnVuY3Rpb24oYil7ZnVuY3Rpb24gZShRLFMpe3ZvaWQgMD09PVFbUy51dWlkXSYmKFFbUy51dWlkXT1TLnRvSlNPTihiKSk7cmV0dXJuIFMudXVpZH1mdW5jdGlvbiBoKFEpe3ZhciBTPQpbXSxUO2ZvcihUIGluIFEpe3ZhciBXPVFbVF07ZGVsZXRlIFcubWV0YWRhdGE7Uy5wdXNoKFcpfXJldHVybiBTfXZhciBtPXZvaWQgMD09PWJ8fCJzdHJpbmciPT09dHlwZW9mIGIsdT17fTttJiYoYj17Z2VvbWV0cmllczp7fSxtYXRlcmlhbHM6e30sdGV4dHVyZXM6e30saW1hZ2VzOnt9LHNoYXBlczp7fX0sdS5tZXRhZGF0YT17dmVyc2lvbjo0LjUsdHlwZToiT2JqZWN0IixnZW5lcmF0b3I6Ik9iamVjdDNELnRvSlNPTiJ9KTt2YXIgdz17fTt3LnV1aWQ9dGhpcy51dWlkO3cudHlwZT10aGlzLnR5cGU7IiIhPT10aGlzLm5hbWUmJih3Lm5hbWU9dGhpcy5uYW1lKTshMD09PXRoaXMuY2FzdFNoYWRvdyYmKHcuY2FzdFNoYWRvdz0hMCk7ITA9PT10aGlzLnJlY2VpdmVTaGFkb3cmJih3LnJlY2VpdmVTaGFkb3c9ITApOyExPT09dGhpcy52aXNpYmxlJiYody52aXNpYmxlPSExKTshMT09PXRoaXMuZnJ1c3R1bUN1bGxlZCYmKHcuZnJ1c3R1bUN1bGxlZD0hMSk7MCE9PXRoaXMucmVuZGVyT3JkZXImJgoody5yZW5kZXJPcmRlcj10aGlzLnJlbmRlck9yZGVyKTsie30iIT09SlNPTi5zdHJpbmdpZnkodGhpcy51c2VyRGF0YSkmJih3LnVzZXJEYXRhPXRoaXMudXNlckRhdGEpO3cubGF5ZXJzPXRoaXMubGF5ZXJzLm1hc2s7dy5tYXRyaXg9dGhpcy5tYXRyaXgudG9BcnJheSgpOyExPT09dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiYody5tYXRyaXhBdXRvVXBkYXRlPSExKTt0aGlzLmlzTWVzaCYmMCE9PXRoaXMuZHJhd01vZGUmJih3LmRyYXdNb2RlPXRoaXMuZHJhd01vZGUpO2lmKHRoaXMuaXNNZXNofHx0aGlzLmlzTGluZXx8dGhpcy5pc1BvaW50cyl7dy5nZW9tZXRyeT1lKGIuZ2VvbWV0cmllcyx0aGlzLmdlb21ldHJ5KTt2YXIgQT10aGlzLmdlb21ldHJ5LnBhcmFtZXRlcnM7aWYodm9pZCAwIT09QSYmdm9pZCAwIT09QS5zaGFwZXMpaWYoQT1BLnNoYXBlcyxBcnJheS5pc0FycmF5KEEpKWZvcih2YXIgRT0wLEc9QS5sZW5ndGg7RTxHO0UrKyllKGIuc2hhcGVzLEFbRV0pO2Vsc2UgZShiLnNoYXBlcywKQSl9aWYodm9pZCAwIT09dGhpcy5tYXRlcmlhbClpZihBcnJheS5pc0FycmF5KHRoaXMubWF0ZXJpYWwpKXtBPVtdO0U9MDtmb3IoRz10aGlzLm1hdGVyaWFsLmxlbmd0aDtFPEc7RSsrKUEucHVzaChlKGIubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWxbRV0pKTt3Lm1hdGVyaWFsPUF9ZWxzZSB3Lm1hdGVyaWFsPWUoYi5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbCk7aWYoMDx0aGlzLmNoaWxkcmVuLmxlbmd0aClmb3Iody5jaGlsZHJlbj1bXSxFPTA7RTx0aGlzLmNoaWxkcmVuLmxlbmd0aDtFKyspdy5jaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5bRV0udG9KU09OKGIpLm9iamVjdCk7aWYobSl7bT1oKGIuZ2VvbWV0cmllcyk7RT1oKGIubWF0ZXJpYWxzKTtHPWgoYi50ZXh0dXJlcyk7dmFyIEo9aChiLmltYWdlcyk7QT1oKGIuc2hhcGVzKTswPG0ubGVuZ3RoJiYodS5nZW9tZXRyaWVzPW0pOzA8RS5sZW5ndGgmJih1Lm1hdGVyaWFscz1FKTswPEcubGVuZ3RoJiYodS50ZXh0dXJlcz1HKTsKMDxKLmxlbmd0aCYmKHUuaW1hZ2VzPUopOzA8QS5sZW5ndGgmJih1LnNoYXBlcz1BKX11Lm9iamVjdD13O3JldHVybiB1fSxjbG9uZTpmdW5jdGlvbihiKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyxiKX0sY29weTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihlPSEwKTt0aGlzLm5hbWU9Yi5uYW1lO3RoaXMudXAuY29weShiLnVwKTt0aGlzLnBvc2l0aW9uLmNvcHkoYi5wb3NpdGlvbik7dGhpcy5xdWF0ZXJuaW9uLmNvcHkoYi5xdWF0ZXJuaW9uKTt0aGlzLnNjYWxlLmNvcHkoYi5zY2FsZSk7dGhpcy5tYXRyaXguY29weShiLm1hdHJpeCk7dGhpcy5tYXRyaXhXb3JsZC5jb3B5KGIubWF0cml4V29ybGQpO3RoaXMubWF0cml4QXV0b1VwZGF0ZT1iLm1hdHJpeEF1dG9VcGRhdGU7dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPWIubWF0cml4V29ybGROZWVkc1VwZGF0ZTt0aGlzLmxheWVycy5tYXNrPWIubGF5ZXJzLm1hc2s7dGhpcy52aXNpYmxlPWIudmlzaWJsZTsKdGhpcy5jYXN0U2hhZG93PWIuY2FzdFNoYWRvdzt0aGlzLnJlY2VpdmVTaGFkb3c9Yi5yZWNlaXZlU2hhZG93O3RoaXMuZnJ1c3R1bUN1bGxlZD1iLmZydXN0dW1DdWxsZWQ7dGhpcy5yZW5kZXJPcmRlcj1iLnJlbmRlck9yZGVyO3RoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShiLnVzZXJEYXRhKSk7aWYoITA9PT1lKWZvcihlPTA7ZTxiLmNoaWxkcmVuLmxlbmd0aDtlKyspdGhpcy5hZGQoYi5jaGlsZHJlbltlXS5jbG9uZSgpKTtyZXR1cm4gdGhpc319KTt6LnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoeS5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp6LGlzU2NlbmU6ITAsY29weTpmdW5jdGlvbihiLGUpe3kucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIsZSk7bnVsbCE9PWIuYmFja2dyb3VuZCYmKHRoaXMuYmFja2dyb3VuZD1iLmJhY2tncm91bmQuY2xvbmUoKSk7bnVsbCE9PWIuZm9nJiYodGhpcy5mb2c9Yi5mb2cuY2xvbmUoKSk7Cm51bGwhPT1iLm92ZXJyaWRlTWF0ZXJpYWwmJih0aGlzLm92ZXJyaWRlTWF0ZXJpYWw9Yi5vdmVycmlkZU1hdGVyaWFsLmNsb25lKCkpO3RoaXMuYXV0b1VwZGF0ZT1iLmF1dG9VcGRhdGU7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPWIubWF0cml4QXV0b1VwZGF0ZTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKGIpe3ZhciBlPXkucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsYik7bnVsbCE9PXRoaXMuYmFja2dyb3VuZCYmKGUub2JqZWN0LmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTihiKSk7bnVsbCE9PXRoaXMuZm9nJiYoZS5vYmplY3QuZm9nPXRoaXMuZm9nLnRvSlNPTigpKTtyZXR1cm4gZX0sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19KTt2YXIgVWQ9W25ldyBnLG5ldyBnLG5ldyBnLG5ldyBnLG5ldyBnLG5ldyBnLG5ldyBnLG5ldyBnXSxFZD1uZXcgZyxyZz1uZXcgZyxzZz1uZXcgZyx0Zz1uZXcgZywKd2U9bmV3IGcseGU9bmV3IGcsZGY9bmV3IGcsUWg9bmV3IGcsZmo9bmV3IGcsZ2o9bmV3IGcsSWU9bmV3IGc7T2JqZWN0LmFzc2lnbih4LnByb3RvdHlwZSx7aXNCb3gzOiEwLHNldDpmdW5jdGlvbihiLGUpe3RoaXMubWluLmNvcHkoYik7dGhpcy5tYXguY29weShlKTtyZXR1cm4gdGhpc30sc2V0RnJvbUFycmF5OmZ1bmN0aW9uKGIpe2Zvcih2YXIgZT1JbmZpbml0eSxoPUluZmluaXR5LG09SW5maW5pdHksdT0tSW5maW5pdHksdz0tSW5maW5pdHksQT0tSW5maW5pdHksRT0wLEc9Yi5sZW5ndGg7RTxHO0UrPTMpe3ZhciBKPWJbRV0sUT1iW0UrMV0sUz1iW0UrMl07SjxlJiYoZT1KKTtRPGgmJihoPVEpO1M8bSYmKG09Uyk7Sj51JiYodT1KKTtRPncmJih3PVEpO1M+QSYmKEE9Uyl9dGhpcy5taW4uc2V0KGUsaCxtKTt0aGlzLm1heC5zZXQodSx3LEEpO3JldHVybiB0aGlzfSxzZXRGcm9tQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZT1JbmZpbml0eSxoPUluZmluaXR5LAptPUluZmluaXR5LHU9LUluZmluaXR5LHc9LUluZmluaXR5LEE9LUluZmluaXR5LEU9MCxHPWIuY291bnQ7RTxHO0UrKyl7dmFyIEo9Yi5nZXRYKEUpLFE9Yi5nZXRZKEUpLFM9Yi5nZXRaKEUpO0o8ZSYmKGU9Sik7UTxoJiYoaD1RKTtTPG0mJihtPVMpO0o+dSYmKHU9Sik7UT53JiYodz1RKTtTPkEmJihBPVMpfXRoaXMubWluLnNldChlLGgsbSk7dGhpcy5tYXguc2V0KHUsdyxBKTtyZXR1cm4gdGhpc30sc2V0RnJvbVBvaW50czpmdW5jdGlvbihiKXt0aGlzLm1ha2VFbXB0eSgpO2Zvcih2YXIgZT0wLGg9Yi5sZW5ndGg7ZTxoO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQoYltlXSk7cmV0dXJuIHRoaXN9LHNldEZyb21DZW50ZXJBbmRTaXplOmZ1bmN0aW9uKGIsZSl7ZT1FZC5jb3B5KGUpLm11bHRpcGx5U2NhbGFyKC41KTt0aGlzLm1pbi5jb3B5KGIpLnN1YihlKTt0aGlzLm1heC5jb3B5KGIpLmFkZChlKTtyZXR1cm4gdGhpc30sc2V0RnJvbU9iamVjdDpmdW5jdGlvbihiKXt0aGlzLm1ha2VFbXB0eSgpOwpyZXR1cm4gdGhpcy5leHBhbmRCeU9iamVjdChiKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy5taW4uY29weShiLm1pbik7dGhpcy5tYXguY29weShiLm1heCk7cmV0dXJuIHRoaXN9LG1ha2VFbXB0eTpmdW5jdGlvbigpe3RoaXMubWluLng9dGhpcy5taW4ueT10aGlzLm1pbi56PUluZmluaXR5O3RoaXMubWF4Lng9dGhpcy5tYXgueT10aGlzLm1heC56PS1JbmZpbml0eTtyZXR1cm4gdGhpc30saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueXx8dGhpcy5tYXguejx0aGlzLm1pbi56fSxnZXRDZW50ZXI6ZnVuY3Rpb24oYil7dm9pZCAwPT09YiYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxiPW5ldyBnKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/CmIuc2V0KDAsMCwwKTpiLmFkZFZlY3RvcnModGhpcy5taW4sdGhpcy5tYXgpLm11bHRpcGx5U2NhbGFyKC41KX0sZ2V0U2l6ZTpmdW5jdGlvbihiKXt2b2lkIDA9PT1iJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuZ2V0U2l6ZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxiPW5ldyBnKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/Yi5zZXQoMCwwLDApOmIuc3ViVmVjdG9ycyh0aGlzLm1heCx0aGlzLm1pbil9LGV4cGFuZEJ5UG9pbnQ6ZnVuY3Rpb24oYil7dGhpcy5taW4ubWluKGIpO3RoaXMubWF4Lm1heChiKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlWZWN0b3I6ZnVuY3Rpb24oYil7dGhpcy5taW4uc3ViKGIpO3RoaXMubWF4LmFkZChiKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlTY2FsYXI6ZnVuY3Rpb24oYil7dGhpcy5taW4uYWRkU2NhbGFyKC1iKTt0aGlzLm1heC5hZGRTY2FsYXIoYik7cmV0dXJuIHRoaXN9LGV4cGFuZEJ5T2JqZWN0OmZ1bmN0aW9uKGIpe3ZhciBlO2IudXBkYXRlV29ybGRNYXRyaXgoITEsCiExKTt2YXIgaD1iLmdlb21ldHJ5O2lmKHZvaWQgMCE9PWgpaWYoaC5pc0dlb21ldHJ5KXt2YXIgbT1oLnZlcnRpY2VzO2g9MDtmb3IoZT1tLmxlbmd0aDtoPGU7aCsrKUVkLmNvcHkobVtoXSksRWQuYXBwbHlNYXRyaXg0KGIubWF0cml4V29ybGQpLHRoaXMuZXhwYW5kQnlQb2ludChFZCl9ZWxzZSBpZihoLmlzQnVmZmVyR2VvbWV0cnkmJihtPWguYXR0cmlidXRlcy5wb3NpdGlvbix2b2lkIDAhPT1tKSlmb3IoaD0wLGU9bS5jb3VudDtoPGU7aCsrKUVkLmZyb21CdWZmZXJBdHRyaWJ1dGUobSxoKS5hcHBseU1hdHJpeDQoYi5tYXRyaXhXb3JsZCksdGhpcy5leHBhbmRCeVBvaW50KEVkKTtiPWIuY2hpbGRyZW47aD0wO2ZvcihlPWIubGVuZ3RoO2g8ZTtoKyspdGhpcy5leHBhbmRCeU9iamVjdChiW2hdKTtyZXR1cm4gdGhpc30sY29udGFpbnNQb2ludDpmdW5jdGlvbihiKXtyZXR1cm4gYi54PHRoaXMubWluLnh8fGIueD50aGlzLm1heC54fHxiLnk8dGhpcy5taW4ueXx8Yi55PnRoaXMubWF4Lnl8fApiLno8dGhpcy5taW4uenx8Yi56PnRoaXMubWF4Lno/ITE6ITB9LGNvbnRhaW5zQm94OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLm1pbi54PD1iLm1pbi54JiZiLm1heC54PD10aGlzLm1heC54JiZ0aGlzLm1pbi55PD1iLm1pbi55JiZiLm1heC55PD10aGlzLm1heC55JiZ0aGlzLm1pbi56PD1iLm1pbi56JiZiLm1heC56PD10aGlzLm1heC56fSxnZXRQYXJhbWV0ZXI6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1lJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuZ2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGU9bmV3IGcpO3JldHVybiBlLnNldCgoYi54LXRoaXMubWluLngpLyh0aGlzLm1heC54LXRoaXMubWluLngpLChiLnktdGhpcy5taW4ueSkvKHRoaXMubWF4LnktdGhpcy5taW4ueSksKGIuei10aGlzLm1pbi56KS8odGhpcy5tYXguei10aGlzLm1pbi56KSl9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYil7cmV0dXJuIGIubWF4Lng8dGhpcy5taW4ueHx8CmIubWluLng+dGhpcy5tYXgueHx8Yi5tYXgueTx0aGlzLm1pbi55fHxiLm1pbi55PnRoaXMubWF4Lnl8fGIubWF4Lno8dGhpcy5taW4uenx8Yi5taW4uej50aGlzLm1heC56PyExOiEwfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGIpe3RoaXMuY2xhbXBQb2ludChiLmNlbnRlcixFZCk7cmV0dXJuIEVkLmRpc3RhbmNlVG9TcXVhcmVkKGIuY2VudGVyKTw9Yi5yYWRpdXMqYi5yYWRpdXN9LGludGVyc2VjdHNQbGFuZTpmdW5jdGlvbihiKXtpZigwPGIubm9ybWFsLngpe3ZhciBlPWIubm9ybWFsLngqdGhpcy5taW4ueDt2YXIgaD1iLm5vcm1hbC54KnRoaXMubWF4Lnh9ZWxzZSBlPWIubm9ybWFsLngqdGhpcy5tYXgueCxoPWIubm9ybWFsLngqdGhpcy5taW4ueDswPGIubm9ybWFsLnk/KGUrPWIubm9ybWFsLnkqdGhpcy5taW4ueSxoKz1iLm5vcm1hbC55KnRoaXMubWF4LnkpOihlKz1iLm5vcm1hbC55KnRoaXMubWF4LnksaCs9Yi5ub3JtYWwueSp0aGlzLm1pbi55KTswPGIubm9ybWFsLno/CihlKz1iLm5vcm1hbC56KnRoaXMubWluLnosaCs9Yi5ub3JtYWwueip0aGlzLm1heC56KTooZSs9Yi5ub3JtYWwueip0aGlzLm1heC56LGgrPWIubm9ybWFsLnoqdGhpcy5taW4ueik7cmV0dXJuIGU8PS1iLmNvbnN0YW50JiZoPj0tYi5jb25zdGFudH0saW50ZXJzZWN0c1RyaWFuZ2xlOmZ1bmN0aW9uKGIpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiExO3RoaXMuZ2V0Q2VudGVyKFFoKTtmai5zdWJWZWN0b3JzKHRoaXMubWF4LFFoKTtyZy5zdWJWZWN0b3JzKGIuYSxRaCk7c2cuc3ViVmVjdG9ycyhiLmIsUWgpO3RnLnN1YlZlY3RvcnMoYi5jLFFoKTt3ZS5zdWJWZWN0b3JzKHNnLHJnKTt4ZS5zdWJWZWN0b3JzKHRnLHNnKTtkZi5zdWJWZWN0b3JzKHJnLHRnKTtiPVswLC13ZS56LHdlLnksMCwteGUueix4ZS55LDAsLWRmLnosZGYueSx3ZS56LDAsLXdlLngseGUueiwwLC14ZS54LGRmLnosMCwtZGYueCwtd2UueSx3ZS54LDAsLXhlLnkseGUueCwwLC1kZi55LGRmLngsMF07aWYoIUMoYiwKcmcsc2csdGcsZmopKXJldHVybiExO2I9WzEsMCwwLDAsMSwwLDAsMCwxXTtpZighQyhiLHJnLHNnLHRnLGZqKSlyZXR1cm4hMTtnai5jcm9zc1ZlY3RvcnMod2UseGUpO2I9W2dqLngsZ2oueSxnai56XTtyZXR1cm4gQyhiLHJnLHNnLHRnLGZqKX0sY2xhbXBQb2ludDpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5jbGFtcFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGU9bmV3IGcpO3JldHVybiBlLmNvcHkoYikuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfSxkaXN0YW5jZVRvUG9pbnQ6ZnVuY3Rpb24oYil7cmV0dXJuIEVkLmNvcHkoYikuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpLnN1YihiKS5sZW5ndGgoKX0sZ2V0Qm91bmRpbmdTcGhlcmU6ZnVuY3Rpb24oYil7dm9pZCAwPT09YiYmY29uc29sZS5lcnJvcigiVEhSRUUuQm94MzogLmdldEJvdW5kaW5nU3BoZXJlKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpO3RoaXMuZ2V0Q2VudGVyKGIuY2VudGVyKTsKYi5yYWRpdXM9LjUqdGhpcy5nZXRTaXplKEVkKS5sZW5ndGgoKTtyZXR1cm4gYn0saW50ZXJzZWN0OmZ1bmN0aW9uKGIpe3RoaXMubWluLm1heChiLm1pbik7dGhpcy5tYXgubWluKGIubWF4KTt0aGlzLmlzRW1wdHkoKSYmdGhpcy5tYWtlRW1wdHkoKTtyZXR1cm4gdGhpc30sdW5pb246ZnVuY3Rpb24oYil7dGhpcy5taW4ubWluKGIubWluKTt0aGlzLm1heC5tYXgoYi5tYXgpO3JldHVybiB0aGlzfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oYil7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIHRoaXM7VWRbMF0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQoYik7VWRbMV0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQoYik7VWRbMl0uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQoYik7VWRbM10uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQoYik7ClVkWzRdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KGIpO1VkWzVdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KGIpO1VkWzZdLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KGIpO1VkWzddLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KGIpO3RoaXMuc2V0RnJvbVBvaW50cyhVZCk7cmV0dXJuIHRoaXN9LHRyYW5zbGF0ZTpmdW5jdGlvbihiKXt0aGlzLm1pbi5hZGQoYik7dGhpcy5tYXguYWRkKGIpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYil7cmV0dXJuIGIubWluLmVxdWFscyh0aGlzLm1pbikmJmIubWF4LmVxdWFscyh0aGlzLm1heCl9fSk7dmFyIHpzPW5ldyB4O09iamVjdC5hc3NpZ24oRi5wcm90b3R5cGUse3NldDpmdW5jdGlvbihiLGUpe3RoaXMuY2VudGVyLmNvcHkoYik7dGhpcy5yYWRpdXM9CmU7cmV0dXJuIHRoaXN9LHNldEZyb21Qb2ludHM6ZnVuY3Rpb24oYixlKXt2YXIgaD10aGlzLmNlbnRlcjt2b2lkIDAhPT1lP2guY29weShlKTp6cy5zZXRGcm9tUG9pbnRzKGIpLmdldENlbnRlcihoKTtmb3IodmFyIG09ZT0wLHU9Yi5sZW5ndGg7bTx1O20rKyllPU1hdGgubWF4KGUsaC5kaXN0YW5jZVRvU3F1YXJlZChiW21dKSk7dGhpcy5yYWRpdXM9TWF0aC5zcXJ0KGUpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihiKXt0aGlzLmNlbnRlci5jb3B5KGIuY2VudGVyKTt0aGlzLnJhZGl1cz1iLnJhZGl1cztyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gMD49dGhpcy5yYWRpdXN9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD10aGlzLnJhZGl1cyp0aGlzLnJhZGl1c30sZGlzdGFuY2VUb1BvaW50OmZ1bmN0aW9uKGIpe3JldHVybiBiLmRpc3RhbmNlVG8odGhpcy5jZW50ZXIpLQp0aGlzLnJhZGl1c30saW50ZXJzZWN0c1NwaGVyZTpmdW5jdGlvbihiKXt2YXIgZT10aGlzLnJhZGl1cytiLnJhZGl1cztyZXR1cm4gYi5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD1lKmV9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaW50ZXJzZWN0c1NwaGVyZSh0aGlzKX0saW50ZXJzZWN0c1BsYW5lOmZ1bmN0aW9uKGIpe3JldHVybiBNYXRoLmFicyhiLmRpc3RhbmNlVG9Qb2ludCh0aGlzLmNlbnRlcikpPD10aGlzLnJhZGl1c30sY2xhbXBQb2ludDpmdW5jdGlvbihiLGUpe3ZhciBoPXRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKGIpO3ZvaWQgMD09PWUmJihjb25zb2xlLndhcm4oIlRIUkVFLlNwaGVyZTogLmNsYW1wUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksZT1uZXcgZyk7ZS5jb3B5KGIpO2g+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMmJihlLnN1Yih0aGlzLmNlbnRlcikubm9ybWFsaXplKCksZS5tdWx0aXBseVNjYWxhcih0aGlzLnJhZGl1cykuYWRkKHRoaXMuY2VudGVyKSk7CnJldHVybiBlfSxnZXRCb3VuZGluZ0JveDpmdW5jdGlvbihiKXt2b2lkIDA9PT1iJiYoY29uc29sZS53YXJuKCJUSFJFRS5TcGhlcmU6IC5nZXRCb3VuZGluZ0JveCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxiPW5ldyB4KTtiLnNldCh0aGlzLmNlbnRlcix0aGlzLmNlbnRlcik7Yi5leHBhbmRCeVNjYWxhcih0aGlzLnJhZGl1cyk7cmV0dXJuIGJ9LGFwcGx5TWF0cml4NDpmdW5jdGlvbihiKXt0aGlzLmNlbnRlci5hcHBseU1hdHJpeDQoYik7dGhpcy5yYWRpdXMqPWIuZ2V0TWF4U2NhbGVPbkF4aXMoKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGIpe3RoaXMuY2VudGVyLmFkZChiKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGIpe3JldHVybiBiLmNlbnRlci5lcXVhbHModGhpcy5jZW50ZXIpJiZiLnJhZGl1cz09PXRoaXMucmFkaXVzfX0pO3ZhciBWZD1uZXcgZyxibD1uZXcgZyxoaj1uZXcgZyx5ZT1uZXcgZyxjbD1uZXcgZyxpaj1uZXcgZyxkbD1uZXcgZzsKT2JqZWN0LmFzc2lnbihELnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGIsZSl7dGhpcy5vcmlnaW4uY29weShiKTt0aGlzLmRpcmVjdGlvbi5jb3B5KGUpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihiKXt0aGlzLm9yaWdpbi5jb3B5KGIub3JpZ2luKTt0aGlzLmRpcmVjdGlvbi5jb3B5KGIuZGlyZWN0aW9uKTtyZXR1cm4gdGhpc30sYXQ6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1lJiYoY29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5hdCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxlPW5ldyBnKTtyZXR1cm4gZS5jb3B5KHRoaXMuZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcihiKS5hZGQodGhpcy5vcmlnaW4pfSxsb29rQXQ6ZnVuY3Rpb24oYil7dGhpcy5kaXJlY3Rpb24uY29weShiKS5zdWIodGhpcy5vcmlnaW4pLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzfSxyZWNhc3Q6ZnVuY3Rpb24oYil7dGhpcy5vcmlnaW4uY29weSh0aGlzLmF0KGIsClZkKSk7cmV0dXJuIHRoaXN9LGNsb3Nlc3RQb2ludFRvUG9pbnQ6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1lJiYoY29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGU9bmV3IGcpO2Uuc3ViVmVjdG9ycyhiLHRoaXMub3JpZ2luKTtiPWUuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gMD5iP2UuY29weSh0aGlzLm9yaWdpbik6ZS5jb3B5KHRoaXMuZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcihiKS5hZGQodGhpcy5vcmlnaW4pfSxkaXN0YW5jZVRvUG9pbnQ6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlU3FUb1BvaW50KGIpKX0sZGlzdGFuY2VTcVRvUG9pbnQ6ZnVuY3Rpb24oYil7dmFyIGU9VmQuc3ViVmVjdG9ycyhiLHRoaXMub3JpZ2luKS5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKDA+ZSlyZXR1cm4gdGhpcy5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQoYik7VmQuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoZSkuYWRkKHRoaXMub3JpZ2luKTsKcmV0dXJuIFZkLmRpc3RhbmNlVG9TcXVhcmVkKGIpfSxkaXN0YW5jZVNxVG9TZWdtZW50OmZ1bmN0aW9uKGIsZSxoLG0pe2JsLmNvcHkoYikuYWRkKGUpLm11bHRpcGx5U2NhbGFyKC41KTtoai5jb3B5KGUpLnN1YihiKS5ub3JtYWxpemUoKTt5ZS5jb3B5KHRoaXMub3JpZ2luKS5zdWIoYmwpO3ZhciB1PS41KmIuZGlzdGFuY2VUbyhlKSx3PS10aGlzLmRpcmVjdGlvbi5kb3QoaGopLEE9eWUuZG90KHRoaXMuZGlyZWN0aW9uKSxFPS15ZS5kb3QoaGopLEc9eWUubGVuZ3RoU3EoKSxKPU1hdGguYWJzKDEtdyp3KTtpZigwPEope2I9dypFLUE7ZT13KkEtRTt2YXIgUT11Kko7MDw9Yj9lPj0tUT9lPD1RPyh1PTEvSixiKj11LGUqPXUsdz1iKihiK3cqZSsyKkEpK2UqKHcqYitlKzIqRSkrRyk6KGU9dSxiPU1hdGgubWF4KDAsLSh3KmUrQSkpLHc9LWIqYitlKihlKzIqRSkrRyk6KGU9LXUsYj1NYXRoLm1heCgwLC0odyplK0EpKSx3PS1iKmIrZSooZSsyKkUpK0cpOmU8PS1RPyhiPU1hdGgubWF4KDAsCi0oLXcqdStBKSksZT0wPGI/LXU6TWF0aC5taW4oTWF0aC5tYXgoLXUsLUUpLHUpLHc9LWIqYitlKihlKzIqRSkrRyk6ZTw9UT8oYj0wLGU9TWF0aC5taW4oTWF0aC5tYXgoLXUsLUUpLHUpLHc9ZSooZSsyKkUpK0cpOihiPU1hdGgubWF4KDAsLSh3KnUrQSkpLGU9MDxiP3U6TWF0aC5taW4oTWF0aC5tYXgoLXUsLUUpLHUpLHc9LWIqYitlKihlKzIqRSkrRyl9ZWxzZSBlPTA8dz8tdTp1LGI9TWF0aC5tYXgoMCwtKHcqZStBKSksdz0tYipiK2UqKGUrMipFKStHO2gmJmguY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoYikuYWRkKHRoaXMub3JpZ2luKTttJiZtLmNvcHkoaGopLm11bHRpcGx5U2NhbGFyKGUpLmFkZChibCk7cmV0dXJuIHd9LGludGVyc2VjdFNwaGVyZTpmdW5jdGlvbihiLGUpe1ZkLnN1YlZlY3RvcnMoYi5jZW50ZXIsdGhpcy5vcmlnaW4pO3ZhciBoPVZkLmRvdCh0aGlzLmRpcmVjdGlvbiksbT1WZC5kb3QoVmQpLWgqaDtiPWIucmFkaXVzKmIucmFkaXVzOwppZihtPmIpcmV0dXJuIG51bGw7Yj1NYXRoLnNxcnQoYi1tKTttPWgtYjtoKz1iO3JldHVybiAwPm0mJjA+aD9udWxsOjA+bT90aGlzLmF0KGgsZSk6dGhpcy5hdChtLGUpfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KGIuY2VudGVyKTw9Yi5yYWRpdXMqYi5yYWRpdXN9LGRpc3RhbmNlVG9QbGFuZTpmdW5jdGlvbihiKXt2YXIgZT1iLm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKDA9PT1lKXJldHVybiAwPT09Yi5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pPzA6bnVsbDtiPS0odGhpcy5vcmlnaW4uZG90KGIubm9ybWFsKStiLmNvbnN0YW50KS9lO3JldHVybiAwPD1iP2I6bnVsbH0saW50ZXJzZWN0UGxhbmU6ZnVuY3Rpb24oYixlKXtiPXRoaXMuZGlzdGFuY2VUb1BsYW5lKGIpO3JldHVybiBudWxsPT09Yj9udWxsOnRoaXMuYXQoYixlKX0saW50ZXJzZWN0c1BsYW5lOmZ1bmN0aW9uKGIpe3ZhciBlPWIuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKTsKcmV0dXJuIDA9PT1lfHwwPmIubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbikqZT8hMDohMX0saW50ZXJzZWN0Qm94OmZ1bmN0aW9uKGIsZSl7dmFyIGg9MS90aGlzLmRpcmVjdGlvbi54O3ZhciBtPTEvdGhpcy5kaXJlY3Rpb24ueTt2YXIgdT0xL3RoaXMuZGlyZWN0aW9uLnosdz10aGlzLm9yaWdpbjtpZigwPD1oKXt2YXIgQT0oYi5taW4ueC13LngpKmg7aCo9Yi5tYXgueC13Lnh9ZWxzZSBBPShiLm1heC54LXcueCkqaCxoKj1iLm1pbi54LXcueDtpZigwPD1tKXt2YXIgRT0oYi5taW4ueS13LnkpKm07bSo9Yi5tYXgueS13Lnl9ZWxzZSBFPShiLm1heC55LXcueSkqbSxtKj1iLm1pbi55LXcueTtpZihBPm18fEU+aClyZXR1cm4gbnVsbDtpZihFPkF8fEEhPT1BKUE9RTtpZihtPGh8fGghPT1oKWg9bTswPD11PyhFPShiLm1pbi56LXcueikqdSxiPShiLm1heC56LXcueikqdSk6KEU9KGIubWF4Lnotdy56KSp1LGI9KGIubWluLnotdy56KSp1KTtpZihBPmJ8fEU+aClyZXR1cm4gbnVsbDsKaWYoRT5BfHxBIT09QSlBPUU7aWYoYjxofHxoIT09aCloPWI7cmV0dXJuIDA+aD9udWxsOnRoaXMuYXQoMDw9QT9BOmgsZSl9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYil7cmV0dXJuIG51bGwhPT10aGlzLmludGVyc2VjdEJveChiLFZkKX0saW50ZXJzZWN0VHJpYW5nbGU6ZnVuY3Rpb24oYixlLGgsbSx1KXtjbC5zdWJWZWN0b3JzKGUsYik7aWouc3ViVmVjdG9ycyhoLGIpO2RsLmNyb3NzVmVjdG9ycyhjbCxpaik7ZT10aGlzLmRpcmVjdGlvbi5kb3QoZGwpO2lmKDA8ZSl7aWYobSlyZXR1cm4gbnVsbDttPTF9ZWxzZSBpZigwPmUpbT0tMSxlPS1lO2Vsc2UgcmV0dXJuIG51bGw7eWUuc3ViVmVjdG9ycyh0aGlzLm9yaWdpbixiKTtiPW0qdGhpcy5kaXJlY3Rpb24uZG90KGlqLmNyb3NzVmVjdG9ycyh5ZSxpaikpO2lmKDA+YilyZXR1cm4gbnVsbDtoPW0qdGhpcy5kaXJlY3Rpb24uZG90KGNsLmNyb3NzKHllKSk7aWYoMD5ofHxiK2g+ZSlyZXR1cm4gbnVsbDtiPS1tKnllLmRvdChkbCk7CnJldHVybiAwPmI/bnVsbDp0aGlzLmF0KGIvZSx1KX0sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGIpe3RoaXMub3JpZ2luLmFwcGx5TWF0cml4NChiKTt0aGlzLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oYik7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihiKXtyZXR1cm4gYi5vcmlnaW4uZXF1YWxzKHRoaXMub3JpZ2luKSYmYi5kaXJlY3Rpb24uZXF1YWxzKHRoaXMuZGlyZWN0aW9uKX19KTt2YXIga2Q9bmV3IGcsV2Q9bmV3IGcsZWw9bmV3IGcsWGQ9bmV3IGcsdWc9bmV3IGcsdmc9bmV3IGcscm89bmV3IGcsZmw9bmV3IGcsZ2w9bmV3IGcsaGw9bmV3IGc7T2JqZWN0LmFzc2lnbihCLHtnZXROb3JtYWw6ZnVuY3Rpb24oYixlLGgsbSl7dm9pZCAwPT09bSYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5nZXROb3JtYWwoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksbT1uZXcgZyk7bS5zdWJWZWN0b3JzKGgsZSk7a2Quc3ViVmVjdG9ycyhiLGUpO20uY3Jvc3Moa2QpOwpiPW0ubGVuZ3RoU3EoKTtyZXR1cm4gMDxiP20ubXVsdGlwbHlTY2FsYXIoMS9NYXRoLnNxcnQoYikpOm0uc2V0KDAsMCwwKX0sZ2V0QmFyeWNvb3JkOmZ1bmN0aW9uKGIsZSxoLG0sdSl7a2Quc3ViVmVjdG9ycyhtLGUpO1dkLnN1YlZlY3RvcnMoaCxlKTtlbC5zdWJWZWN0b3JzKGIsZSk7Yj1rZC5kb3Qoa2QpO2U9a2QuZG90KFdkKTtoPWtkLmRvdChlbCk7dmFyIHc9V2QuZG90KFdkKTttPVdkLmRvdChlbCk7dmFyIEE9Yip3LWUqZTt2b2lkIDA9PT11JiYoY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmdldEJhcnljb29yZCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSx1PW5ldyBnKTtpZigwPT09QSlyZXR1cm4gdS5zZXQoLTIsLTEsLTEpO0E9MS9BO3c9KHcqaC1lKm0pKkE7Yj0oYiptLWUqaCkqQTtyZXR1cm4gdS5zZXQoMS13LWIsYix3KX0sY29udGFpbnNQb2ludDpmdW5jdGlvbihiLGUsaCxtKXtCLmdldEJhcnljb29yZChiLGUsaCxtLFhkKTtyZXR1cm4gMDw9WGQueCYmCjA8PVhkLnkmJjE+PVhkLngrWGQueX0sZ2V0VVY6ZnVuY3Rpb24oYixlLGgsbSx1LHcsQSxFKXt0aGlzLmdldEJhcnljb29yZChiLGUsaCxtLFhkKTtFLnNldCgwLDApO0UuYWRkU2NhbGVkVmVjdG9yKHUsWGQueCk7RS5hZGRTY2FsZWRWZWN0b3IodyxYZC55KTtFLmFkZFNjYWxlZFZlY3RvcihBLFhkLnopO3JldHVybiBFfSxpc0Zyb250RmFjaW5nOmZ1bmN0aW9uKGIsZSxoLG0pe2tkLnN1YlZlY3RvcnMoaCxlKTtXZC5zdWJWZWN0b3JzKGIsZSk7cmV0dXJuIDA+a2QuY3Jvc3MoV2QpLmRvdChtKT8hMDohMX19KTtPYmplY3QuYXNzaWduKEIucHJvdG90eXBlLHtzZXQ6ZnVuY3Rpb24oYixlLGgpe3RoaXMuYS5jb3B5KGIpO3RoaXMuYi5jb3B5KGUpO3RoaXMuYy5jb3B5KGgpO3JldHVybiB0aGlzfSxzZXRGcm9tUG9pbnRzQW5kSW5kaWNlczpmdW5jdGlvbihiLGUsaCxtKXt0aGlzLmEuY29weShiW2VdKTt0aGlzLmIuY29weShiW2hdKTt0aGlzLmMuY29weShiW21dKTtyZXR1cm4gdGhpc30sCmNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGIpe3RoaXMuYS5jb3B5KGIuYSk7dGhpcy5iLmNvcHkoYi5iKTt0aGlzLmMuY29weShiLmMpO3JldHVybiB0aGlzfSxnZXRBcmVhOmZ1bmN0aW9uKCl7a2Quc3ViVmVjdG9ycyh0aGlzLmMsdGhpcy5iKTtXZC5zdWJWZWN0b3JzKHRoaXMuYSx0aGlzLmIpO3JldHVybi41KmtkLmNyb3NzKFdkKS5sZW5ndGgoKX0sZ2V0TWlkcG9pbnQ6ZnVuY3Rpb24oYil7dm9pZCAwPT09YiYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5nZXRNaWRwb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxiPW5ldyBnKTtyZXR1cm4gYi5hZGRWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLmFkZCh0aGlzLmMpLm11bHRpcGx5U2NhbGFyKDEvMyl9LGdldE5vcm1hbDpmdW5jdGlvbihiKXtyZXR1cm4gQi5nZXROb3JtYWwodGhpcy5hLHRoaXMuYix0aGlzLmMsYil9LGdldFBsYW5lOmZ1bmN0aW9uKGIpe3ZvaWQgMD09PQpiJiYoY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmdldFBsYW5lKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGI9bmV3IGcpO3JldHVybiBiLnNldEZyb21Db3BsYW5hclBvaW50cyh0aGlzLmEsdGhpcy5iLHRoaXMuYyl9LGdldEJhcnljb29yZDpmdW5jdGlvbihiLGUpe3JldHVybiBCLmdldEJhcnljb29yZChiLHRoaXMuYSx0aGlzLmIsdGhpcy5jLGUpfSxnZXRVVjpmdW5jdGlvbihiLGUsaCxtLHUpe3JldHVybiBCLmdldFVWKGIsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSxoLG0sdSl9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYil7cmV0dXJuIEIuY29udGFpbnNQb2ludChiLHRoaXMuYSx0aGlzLmIsdGhpcy5jKX0saXNGcm9udEZhY2luZzpmdW5jdGlvbihiKXtyZXR1cm4gQi5pc0Zyb250RmFjaW5nKHRoaXMuYSx0aGlzLmIsdGhpcy5jLGIpfSxpbnRlcnNlY3RzQm94OmZ1bmN0aW9uKGIpe3JldHVybiBiLmludGVyc2VjdHNUcmlhbmdsZSh0aGlzKX0sY2xvc2VzdFBvaW50VG9Qb2ludDpmdW5jdGlvbihiLAplKXt2b2lkIDA9PT1lJiYoY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmNsb3Nlc3RQb2ludFRvUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksZT1uZXcgZyk7dmFyIGg9dGhpcy5hLG09dGhpcy5iLHU9dGhpcy5jO3VnLnN1YlZlY3RvcnMobSxoKTt2Zy5zdWJWZWN0b3JzKHUsaCk7Zmwuc3ViVmVjdG9ycyhiLGgpO3ZhciB3PXVnLmRvdChmbCksQT12Zy5kb3QoZmwpO2lmKDA+PXcmJjA+PUEpcmV0dXJuIGUuY29weShoKTtnbC5zdWJWZWN0b3JzKGIsbSk7dmFyIEU9dWcuZG90KGdsKSxHPXZnLmRvdChnbCk7aWYoMDw9RSYmRzw9RSlyZXR1cm4gZS5jb3B5KG0pO3ZhciBKPXcqRy1FKkE7aWYoMD49SiYmMDw9dyYmMD49RSlyZXR1cm4gbT13Lyh3LUUpLGUuY29weShoKS5hZGRTY2FsZWRWZWN0b3IodWcsbSk7aGwuc3ViVmVjdG9ycyhiLHUpO2I9dWcuZG90KGhsKTt2YXIgUT12Zy5kb3QoaGwpO2lmKDA8PVEmJmI8PVEpcmV0dXJuIGUuY29weSh1KTt3PWIqQS0KdypRO2lmKDA+PXcmJjA8PUEmJjA+PVEpcmV0dXJuIEo9QS8oQS1RKSxlLmNvcHkoaCkuYWRkU2NhbGVkVmVjdG9yKHZnLEopO0E9RSpRLWIqRztpZigwPj1BJiYwPD1HLUUmJjA8PWItUSlyZXR1cm4gcm8uc3ViVmVjdG9ycyh1LG0pLEo9KEctRSkvKEctRSsoYi1RKSksZS5jb3B5KG0pLmFkZFNjYWxlZFZlY3RvcihybyxKKTt1PTEvKEErdytKKTttPXcqdTtKKj11O3JldHVybiBlLmNvcHkoaCkuYWRkU2NhbGVkVmVjdG9yKHVnLG0pLmFkZFNjYWxlZFZlY3Rvcih2ZyxKKX0sZXF1YWxzOmZ1bmN0aW9uKGIpe3JldHVybiBiLmEuZXF1YWxzKHRoaXMuYSkmJmIuYi5lcXVhbHModGhpcy5iKSYmYi5jLmVxdWFscyh0aGlzLmMpfX0pO3ZhciBBcz17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSwKYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LApkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsCmxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NywKbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LApyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9LEhjPXtoOjAsCnM6MCxsOjB9LGpqPXtoOjAsczowLGw6MH07T2JqZWN0LmFzc2lnbihJLnByb3RvdHlwZSx7aXNDb2xvcjohMCxyOjEsZzoxLGI6MSxzZXQ6ZnVuY3Rpb24oYil7YiYmYi5pc0NvbG9yP3RoaXMuY29weShiKToibnVtYmVyIj09PXR5cGVvZiBiP3RoaXMuc2V0SGV4KGIpOiJzdHJpbmciPT09dHlwZW9mIGImJnRoaXMuc2V0U3R5bGUoYik7cmV0dXJuIHRoaXN9LHNldFNjYWxhcjpmdW5jdGlvbihiKXt0aGlzLmI9dGhpcy5nPXRoaXMucj1iO3JldHVybiB0aGlzfSxzZXRIZXg6ZnVuY3Rpb24oYil7Yj1NYXRoLmZsb29yKGIpO3RoaXMucj0oYj4+MTYmMjU1KS8yNTU7dGhpcy5nPShiPj44JjI1NSkvMjU1O3RoaXMuYj0oYiYyNTUpLzI1NTtyZXR1cm4gdGhpc30sc2V0UkdCOmZ1bmN0aW9uKGIsZSxoKXt0aGlzLnI9Yjt0aGlzLmc9ZTt0aGlzLmI9aDtyZXR1cm4gdGhpc30sc2V0SFNMOmZ1bmN0aW9uKGIsZSxoKXtiPWxiLmV1Y2xpZGVhbk1vZHVsbyhiLDEpO2U9bGIuY2xhbXAoZSwwLAoxKTtoPWxiLmNsYW1wKGgsMCwxKTswPT09ZT90aGlzLnI9dGhpcy5nPXRoaXMuYj1oOihlPS41Pj1oP2gqKDErZSk6aCtlLWgqZSxoPTIqaC1lLHRoaXMucj1PKGgsZSxiKzEvMyksdGhpcy5nPU8oaCxlLGIpLHRoaXMuYj1PKGgsZSxiLTEvMykpO3JldHVybiB0aGlzfSxzZXRTdHlsZTpmdW5jdGlvbihiKXtmdW5jdGlvbiBlKEEpe3ZvaWQgMCE9PUEmJjE+cGFyc2VGbG9hdChBKSYmY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogQWxwaGEgY29tcG9uZW50IG9mICIrYisiIHdpbGwgYmUgaWdub3JlZC4iKX12YXIgaDtpZihoPS9eKCg/OnJnYnxoc2wpYT8pXChccyooW15cKV0qKVwpLy5leGVjKGIpKXt2YXIgbT1oWzJdO3N3aXRjaChoWzFdKXtjYXNlICJyZ2IiOmNhc2UgInJnYmEiOmlmKGg9L14oXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKigsXHMqKFswLTldKlwuP1swLTldKylccyopPyQvLmV4ZWMobSkpcmV0dXJuIHRoaXMucj1NYXRoLm1pbigyNTUscGFyc2VJbnQoaFsxXSwKMTApKS8yNTUsdGhpcy5nPU1hdGgubWluKDI1NSxwYXJzZUludChoWzJdLDEwKSkvMjU1LHRoaXMuYj1NYXRoLm1pbigyNTUscGFyc2VJbnQoaFszXSwxMCkpLzI1NSxlKGhbNV0pLHRoaXM7aWYoaD0vXihcZCspJVxzKixccyooXGQrKSVccyosXHMqKFxkKyklXHMqKCxccyooWzAtOV0qXC4/WzAtOV0rKVxzKik/JC8uZXhlYyhtKSlyZXR1cm4gdGhpcy5yPU1hdGgubWluKDEwMCxwYXJzZUludChoWzFdLDEwKSkvMTAwLHRoaXMuZz1NYXRoLm1pbigxMDAscGFyc2VJbnQoaFsyXSwxMCkpLzEwMCx0aGlzLmI9TWF0aC5taW4oMTAwLHBhcnNlSW50KGhbM10sMTApKS8xMDAsZShoWzVdKSx0aGlzO2JyZWFrO2Nhc2UgImhzbCI6Y2FzZSAiaHNsYSI6aWYoaD0vXihbMC05XSpcLj9bMC05XSspXHMqLFxzKihcZCspJVxzKixccyooXGQrKSVccyooLFxzKihbMC05XSpcLj9bMC05XSspXHMqKT8kLy5leGVjKG0pKXttPXBhcnNlRmxvYXQoaFsxXSkvMzYwO3ZhciB1PXBhcnNlSW50KGhbMl0sCjEwKS8xMDAsdz1wYXJzZUludChoWzNdLDEwKS8xMDA7ZShoWzVdKTtyZXR1cm4gdGhpcy5zZXRIU0wobSx1LHcpfX19ZWxzZSBpZihoPS9eIyhbQS1GYS1mMC05XSspJC8uZXhlYyhiKSl7aD1oWzFdO209aC5sZW5ndGg7aWYoMz09PW0pcmV0dXJuIHRoaXMucj1wYXJzZUludChoLmNoYXJBdCgwKStoLmNoYXJBdCgwKSwxNikvMjU1LHRoaXMuZz1wYXJzZUludChoLmNoYXJBdCgxKStoLmNoYXJBdCgxKSwxNikvMjU1LHRoaXMuYj1wYXJzZUludChoLmNoYXJBdCgyKStoLmNoYXJBdCgyKSwxNikvMjU1LHRoaXM7aWYoNj09PW0pcmV0dXJuIHRoaXMucj1wYXJzZUludChoLmNoYXJBdCgwKStoLmNoYXJBdCgxKSwxNikvMjU1LHRoaXMuZz1wYXJzZUludChoLmNoYXJBdCgyKStoLmNoYXJBdCgzKSwxNikvMjU1LHRoaXMuYj1wYXJzZUludChoLmNoYXJBdCg0KStoLmNoYXJBdCg1KSwxNikvMjU1LHRoaXN9YiYmMDxiLmxlbmd0aCYmKGg9QXNbYl0sdm9pZCAwIT09aD90aGlzLnNldEhleChoKToKY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAiK2IpKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5yLHRoaXMuZyx0aGlzLmIpfSxjb3B5OmZ1bmN0aW9uKGIpe3RoaXMucj1iLnI7dGhpcy5nPWIuZzt0aGlzLmI9Yi5iO3JldHVybiB0aGlzfSxjb3B5R2FtbWFUb0xpbmVhcjpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihlPTIpO3RoaXMucj1NYXRoLnBvdyhiLnIsZSk7dGhpcy5nPU1hdGgucG93KGIuZyxlKTt0aGlzLmI9TWF0aC5wb3coYi5iLGUpO3JldHVybiB0aGlzfSxjb3B5TGluZWFyVG9HYW1tYTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihlPTIpO2U9MDxlPzEvZToxO3RoaXMucj1NYXRoLnBvdyhiLnIsZSk7dGhpcy5nPU1hdGgucG93KGIuZyxlKTt0aGlzLmI9TWF0aC5wb3coYi5iLGUpO3JldHVybiB0aGlzfSxjb252ZXJ0R2FtbWFUb0xpbmVhcjpmdW5jdGlvbihiKXt0aGlzLmNvcHlHYW1tYVRvTGluZWFyKHRoaXMsCmIpO3JldHVybiB0aGlzfSxjb252ZXJ0TGluZWFyVG9HYW1tYTpmdW5jdGlvbihiKXt0aGlzLmNvcHlMaW5lYXJUb0dhbW1hKHRoaXMsYik7cmV0dXJuIHRoaXN9LGNvcHlTUkdCVG9MaW5lYXI6ZnVuY3Rpb24oYil7dGhpcy5yPVAoYi5yKTt0aGlzLmc9UChiLmcpO3RoaXMuYj1QKGIuYik7cmV0dXJuIHRoaXN9LGNvcHlMaW5lYXJUb1NSR0I6ZnVuY3Rpb24oYil7dGhpcy5yPUgoYi5yKTt0aGlzLmc9SChiLmcpO3RoaXMuYj1IKGIuYik7cmV0dXJuIHRoaXN9LGNvbnZlcnRTUkdCVG9MaW5lYXI6ZnVuY3Rpb24oKXt0aGlzLmNvcHlTUkdCVG9MaW5lYXIodGhpcyk7cmV0dXJuIHRoaXN9LGNvbnZlcnRMaW5lYXJUb1NSR0I6ZnVuY3Rpb24oKXt0aGlzLmNvcHlMaW5lYXJUb1NSR0IodGhpcyk7cmV0dXJuIHRoaXN9LGdldEhleDpmdW5jdGlvbigpe3JldHVybiAyNTUqdGhpcy5yPDwxNl4yNTUqdGhpcy5nPDw4XjI1NSp0aGlzLmI8PDB9LGdldEhleFN0cmluZzpmdW5jdGlvbigpe3JldHVybigiMDAwMDAwIisKdGhpcy5nZXRIZXgoKS50b1N0cmluZygxNikpLnNsaWNlKC02KX0sZ2V0SFNMOmZ1bmN0aW9uKGIpe3ZvaWQgMD09PWImJihjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiAuZ2V0SFNMKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGI9e2g6MCxzOjAsbDowfSk7dmFyIGU9dGhpcy5yLGg9dGhpcy5nLG09dGhpcy5iLHU9TWF0aC5tYXgoZSxoLG0pLHc9TWF0aC5taW4oZSxoLG0pLEEsRT0odyt1KS8yO2lmKHc9PT11KXc9QT0wO2Vsc2V7dmFyIEc9dS13O3c9LjU+PUU/Ry8odSt3KTpHLygyLXUtdyk7c3dpdGNoKHUpe2Nhc2UgZTpBPShoLW0pL0crKGg8bT82OjApO2JyZWFrO2Nhc2UgaDpBPShtLWUpL0crMjticmVhaztjYXNlIG06QT0oZS1oKS9HKzR9QS89Nn1iLmg9QTtiLnM9dztiLmw9RTtyZXR1cm4gYn0sZ2V0U3R5bGU6ZnVuY3Rpb24oKXtyZXR1cm4icmdiKCIrKDI1NSp0aGlzLnJ8MCkrIiwiKygyNTUqdGhpcy5nfDApKyIsIisoMjU1KnRoaXMuYnwwKSsiKSJ9LG9mZnNldEhTTDpmdW5jdGlvbihiLAplLGgpe3RoaXMuZ2V0SFNMKEhjKTtIYy5oKz1iO0hjLnMrPWU7SGMubCs9aDt0aGlzLnNldEhTTChIYy5oLEhjLnMsSGMubCk7cmV0dXJuIHRoaXN9LGFkZDpmdW5jdGlvbihiKXt0aGlzLnIrPWIucjt0aGlzLmcrPWIuZzt0aGlzLmIrPWIuYjtyZXR1cm4gdGhpc30sYWRkQ29sb3JzOmZ1bmN0aW9uKGIsZSl7dGhpcy5yPWIucitlLnI7dGhpcy5nPWIuZytlLmc7dGhpcy5iPWIuYitlLmI7cmV0dXJuIHRoaXN9LGFkZFNjYWxhcjpmdW5jdGlvbihiKXt0aGlzLnIrPWI7dGhpcy5nKz1iO3RoaXMuYis9YjtyZXR1cm4gdGhpc30sc3ViOmZ1bmN0aW9uKGIpe3RoaXMucj1NYXRoLm1heCgwLHRoaXMuci1iLnIpO3RoaXMuZz1NYXRoLm1heCgwLHRoaXMuZy1iLmcpO3RoaXMuYj1NYXRoLm1heCgwLHRoaXMuYi1iLmIpO3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihiKXt0aGlzLnIqPWIucjt0aGlzLmcqPWIuZzt0aGlzLmIqPWIuYjtyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYil7dGhpcy5yKj0KYjt0aGlzLmcqPWI7dGhpcy5iKj1iO3JldHVybiB0aGlzfSxsZXJwOmZ1bmN0aW9uKGIsZSl7dGhpcy5yKz0oYi5yLXRoaXMucikqZTt0aGlzLmcrPShiLmctdGhpcy5nKSplO3RoaXMuYis9KGIuYi10aGlzLmIpKmU7cmV0dXJuIHRoaXN9LGxlcnBIU0w6ZnVuY3Rpb24oYixlKXt0aGlzLmdldEhTTChIYyk7Yi5nZXRIU0woamopO2I9bGIubGVycChIYy5oLGpqLmgsZSk7dmFyIGg9bGIubGVycChIYy5zLGpqLnMsZSk7ZT1sYi5sZXJwKEhjLmwsamoubCxlKTt0aGlzLnNldEhTTChiLGgsZSk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihiKXtyZXR1cm4gYi5yPT09dGhpcy5yJiZiLmc9PT10aGlzLmcmJmIuYj09PXRoaXMuYn0sZnJvbUFycmF5OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGU9MCk7dGhpcy5yPWJbZV07dGhpcy5nPWJbZSsxXTt0aGlzLmI9YltlKzJdO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09YiYmKGI9W10pO3ZvaWQgMD09PQplJiYoZT0wKTtiW2VdPXRoaXMucjtiW2UrMV09dGhpcy5nO2JbZSsyXT10aGlzLmI7cmV0dXJuIGJ9LHRvSlNPTjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEhleCgpfX0pO09iamVjdC5hc3NpZ24oSy5wcm90b3R5cGUse2Nsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGIpe3RoaXMuYT1iLmE7dGhpcy5iPWIuYjt0aGlzLmM9Yi5jO3RoaXMubm9ybWFsLmNvcHkoYi5ub3JtYWwpO3RoaXMuY29sb3IuY29weShiLmNvbG9yKTt0aGlzLm1hdGVyaWFsSW5kZXg9Yi5tYXRlcmlhbEluZGV4O2Zvcih2YXIgZT0wLGg9Yi52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDtlPGg7ZSsrKXRoaXMudmVydGV4Tm9ybWFsc1tlXT1iLnZlcnRleE5vcm1hbHNbZV0uY2xvbmUoKTtlPTA7Zm9yKGg9Yi52ZXJ0ZXhDb2xvcnMubGVuZ3RoO2U8aDtlKyspdGhpcy52ZXJ0ZXhDb2xvcnNbZV09Yi52ZXJ0ZXhDb2xvcnNbZV0uY2xvbmUoKTsKcmV0dXJuIHRoaXN9fSk7dmFyIExxPTA7TS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6TSxpc01hdGVyaWFsOiEwLG9uQmVmb3JlQ29tcGlsZTpmdW5jdGlvbigpe30sc2V0VmFsdWVzOmZ1bmN0aW9uKGIpe2lmKHZvaWQgMCE9PWIpZm9yKHZhciBlIGluIGIpe3ZhciBoPWJbZV07aWYodm9pZCAwPT09aCljb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAnIitlKyInIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuIik7ZWxzZSBpZigic2hhZGluZyI9PT1lKWNvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLiIpLHRoaXMuZmxhdFNoYWRpbmc9MT09PWg/ITA6ITE7ZWxzZXt2YXIgbT10aGlzW2VdO3ZvaWQgMD09PW0/Y29uc29sZS53YXJuKCJUSFJFRS4iK3RoaXMudHlwZSsiOiAnIitlKyInIGlzIG5vdCBhIHByb3BlcnR5IG9mIHRoaXMgbWF0ZXJpYWwuIik6Cm0mJm0uaXNDb2xvcj9tLnNldChoKTptJiZtLmlzVmVjdG9yMyYmaCYmaC5pc1ZlY3RvcjM/bS5jb3B5KGgpOnRoaXNbZV09aH19fSx0b0pTT046ZnVuY3Rpb24oYil7ZnVuY3Rpb24gZSh1KXt2YXIgdz1bXSxBO2ZvcihBIGluIHUpe3ZhciBFPXVbQV07ZGVsZXRlIEUubWV0YWRhdGE7dy5wdXNoKEUpfXJldHVybiB3fXZhciBoPXZvaWQgMD09PWJ8fCJzdHJpbmciPT09dHlwZW9mIGI7aCYmKGI9e3RleHR1cmVzOnt9LGltYWdlczp7fX0pO3ZhciBtPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiTWF0ZXJpYWwiLGdlbmVyYXRvcjoiTWF0ZXJpYWwudG9KU09OIn19O20udXVpZD10aGlzLnV1aWQ7bS50eXBlPXRoaXMudHlwZTsiIiE9PXRoaXMubmFtZSYmKG0ubmFtZT10aGlzLm5hbWUpO3RoaXMuY29sb3ImJnRoaXMuY29sb3IuaXNDb2xvciYmKG0uY29sb3I9dGhpcy5jb2xvci5nZXRIZXgoKSk7dm9pZCAwIT09dGhpcy5yb3VnaG5lc3MmJihtLnJvdWdobmVzcz10aGlzLnJvdWdobmVzcyk7CnZvaWQgMCE9PXRoaXMubWV0YWxuZXNzJiYobS5tZXRhbG5lc3M9dGhpcy5tZXRhbG5lc3MpO3RoaXMuZW1pc3NpdmUmJnRoaXMuZW1pc3NpdmUuaXNDb2xvciYmKG0uZW1pc3NpdmU9dGhpcy5lbWlzc2l2ZS5nZXRIZXgoKSk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eSYmMSE9PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkmJihtLmVtaXNzaXZlSW50ZW5zaXR5PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkpO3RoaXMuc3BlY3VsYXImJnRoaXMuc3BlY3VsYXIuaXNDb2xvciYmKG0uc3BlY3VsYXI9dGhpcy5zcGVjdWxhci5nZXRIZXgoKSk7dm9pZCAwIT09dGhpcy5zaGluaW5lc3MmJihtLnNoaW5pbmVzcz10aGlzLnNoaW5pbmVzcyk7dm9pZCAwIT09dGhpcy5jbGVhcmNvYXQmJihtLmNsZWFyY29hdD10aGlzLmNsZWFyY29hdCk7dm9pZCAwIT09dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MmJihtLmNsZWFyY29hdFJvdWdobmVzcz10aGlzLmNsZWFyY29hdFJvdWdobmVzcyk7dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAmJgp0aGlzLmNsZWFyY29hdE5vcm1hbE1hcC5pc1RleHR1cmUmJihtLmNsZWFyY29hdE5vcm1hbE1hcD10aGlzLmNsZWFyY29hdE5vcm1hbE1hcC50b0pTT04oYikudXVpZCxtLmNsZWFyY29hdE5vcm1hbFNjYWxlPXRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudG9BcnJheSgpKTt0aGlzLm1hcCYmdGhpcy5tYXAuaXNUZXh0dXJlJiYobS5tYXA9dGhpcy5tYXAudG9KU09OKGIpLnV1aWQpO3RoaXMubWF0Y2FwJiZ0aGlzLm1hdGNhcC5pc1RleHR1cmUmJihtLm1hdGNhcD10aGlzLm1hdGNhcC50b0pTT04oYikudXVpZCk7dGhpcy5hbHBoYU1hcCYmdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUmJihtLmFscGhhTWFwPXRoaXMuYWxwaGFNYXAudG9KU09OKGIpLnV1aWQpO3RoaXMubGlnaHRNYXAmJnRoaXMubGlnaHRNYXAuaXNUZXh0dXJlJiYobS5saWdodE1hcD10aGlzLmxpZ2h0TWFwLnRvSlNPTihiKS51dWlkKTt0aGlzLmFvTWFwJiZ0aGlzLmFvTWFwLmlzVGV4dHVyZSYmKG0uYW9NYXA9dGhpcy5hb01hcC50b0pTT04oYikudXVpZCwKbS5hb01hcEludGVuc2l0eT10aGlzLmFvTWFwSW50ZW5zaXR5KTt0aGlzLmJ1bXBNYXAmJnRoaXMuYnVtcE1hcC5pc1RleHR1cmUmJihtLmJ1bXBNYXA9dGhpcy5idW1wTWFwLnRvSlNPTihiKS51dWlkLG0uYnVtcFNjYWxlPXRoaXMuYnVtcFNjYWxlKTt0aGlzLm5vcm1hbE1hcCYmdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlJiYobS5ub3JtYWxNYXA9dGhpcy5ub3JtYWxNYXAudG9KU09OKGIpLnV1aWQsbS5ub3JtYWxNYXBUeXBlPXRoaXMubm9ybWFsTWFwVHlwZSxtLm5vcm1hbFNjYWxlPXRoaXMubm9ybWFsU2NhbGUudG9BcnJheSgpKTt0aGlzLmRpc3BsYWNlbWVudE1hcCYmdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlJiYobS5kaXNwbGFjZW1lbnRNYXA9dGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKGIpLnV1aWQsbS5kaXNwbGFjZW1lbnRTY2FsZT10aGlzLmRpc3BsYWNlbWVudFNjYWxlLG0uZGlzcGxhY2VtZW50Qmlhcz10aGlzLmRpc3BsYWNlbWVudEJpYXMpO3RoaXMucm91Z2huZXNzTWFwJiYKdGhpcy5yb3VnaG5lc3NNYXAuaXNUZXh0dXJlJiYobS5yb3VnaG5lc3NNYXA9dGhpcy5yb3VnaG5lc3NNYXAudG9KU09OKGIpLnV1aWQpO3RoaXMubWV0YWxuZXNzTWFwJiZ0aGlzLm1ldGFsbmVzc01hcC5pc1RleHR1cmUmJihtLm1ldGFsbmVzc01hcD10aGlzLm1ldGFsbmVzc01hcC50b0pTT04oYikudXVpZCk7dGhpcy5lbWlzc2l2ZU1hcCYmdGhpcy5lbWlzc2l2ZU1hcC5pc1RleHR1cmUmJihtLmVtaXNzaXZlTWFwPXRoaXMuZW1pc3NpdmVNYXAudG9KU09OKGIpLnV1aWQpO3RoaXMuc3BlY3VsYXJNYXAmJnRoaXMuc3BlY3VsYXJNYXAuaXNUZXh0dXJlJiYobS5zcGVjdWxhck1hcD10aGlzLnNwZWN1bGFyTWFwLnRvSlNPTihiKS51dWlkKTt0aGlzLmVudk1hcCYmdGhpcy5lbnZNYXAuaXNUZXh0dXJlJiYobS5lbnZNYXA9dGhpcy5lbnZNYXAudG9KU09OKGIpLnV1aWQsbS5yZWZsZWN0aXZpdHk9dGhpcy5yZWZsZWN0aXZpdHksbS5yZWZyYWN0aW9uUmF0aW89dGhpcy5yZWZyYWN0aW9uUmF0aW8sCnZvaWQgMCE9PXRoaXMuY29tYmluZSYmKG0uY29tYmluZT10aGlzLmNvbWJpbmUpLHZvaWQgMCE9PXRoaXMuZW52TWFwSW50ZW5zaXR5JiYobS5lbnZNYXBJbnRlbnNpdHk9dGhpcy5lbnZNYXBJbnRlbnNpdHkpKTt0aGlzLmdyYWRpZW50TWFwJiZ0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSYmKG0uZ3JhZGllbnRNYXA9dGhpcy5ncmFkaWVudE1hcC50b0pTT04oYikudXVpZCk7dm9pZCAwIT09dGhpcy5zaXplJiYobS5zaXplPXRoaXMuc2l6ZSk7dm9pZCAwIT09dGhpcy5zaXplQXR0ZW51YXRpb24mJihtLnNpemVBdHRlbnVhdGlvbj10aGlzLnNpemVBdHRlbnVhdGlvbik7MSE9PXRoaXMuYmxlbmRpbmcmJihtLmJsZW5kaW5nPXRoaXMuYmxlbmRpbmcpOyEwPT09dGhpcy5mbGF0U2hhZGluZyYmKG0uZmxhdFNoYWRpbmc9dGhpcy5mbGF0U2hhZGluZyk7MCE9PXRoaXMuc2lkZSYmKG0uc2lkZT10aGlzLnNpZGUpOzAhPT10aGlzLnZlcnRleENvbG9ycyYmKG0udmVydGV4Q29sb3JzPQp0aGlzLnZlcnRleENvbG9ycyk7MT50aGlzLm9wYWNpdHkmJihtLm9wYWNpdHk9dGhpcy5vcGFjaXR5KTshMD09PXRoaXMudHJhbnNwYXJlbnQmJihtLnRyYW5zcGFyZW50PXRoaXMudHJhbnNwYXJlbnQpO20uZGVwdGhGdW5jPXRoaXMuZGVwdGhGdW5jO20uZGVwdGhUZXN0PXRoaXMuZGVwdGhUZXN0O20uZGVwdGhXcml0ZT10aGlzLmRlcHRoV3JpdGU7bS5zdGVuY2lsV3JpdGU9dGhpcy5zdGVuY2lsV3JpdGU7bS5zdGVuY2lsRnVuYz10aGlzLnN0ZW5jaWxGdW5jO20uc3RlbmNpbFJlZj10aGlzLnN0ZW5jaWxSZWY7bS5zdGVuY2lsTWFzaz10aGlzLnN0ZW5jaWxNYXNrO20uc3RlbmNpbEZhaWw9dGhpcy5zdGVuY2lsRmFpbDttLnN0ZW5jaWxaRmFpbD10aGlzLnN0ZW5jaWxaRmFpbDttLnN0ZW5jaWxaUGFzcz10aGlzLnN0ZW5jaWxaUGFzczt0aGlzLnJvdGF0aW9uJiYwIT09dGhpcy5yb3RhdGlvbiYmKG0ucm90YXRpb249dGhpcy5yb3RhdGlvbik7ITA9PT10aGlzLnBvbHlnb25PZmZzZXQmJgoobS5wb2x5Z29uT2Zmc2V0PSEwKTswIT09dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yJiYobS5wb2x5Z29uT2Zmc2V0RmFjdG9yPXRoaXMucG9seWdvbk9mZnNldEZhY3Rvcik7MCE9PXRoaXMucG9seWdvbk9mZnNldFVuaXRzJiYobS5wb2x5Z29uT2Zmc2V0VW5pdHM9dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMpO3RoaXMubGluZXdpZHRoJiYxIT09dGhpcy5saW5ld2lkdGgmJihtLmxpbmV3aWR0aD10aGlzLmxpbmV3aWR0aCk7dm9pZCAwIT09dGhpcy5kYXNoU2l6ZSYmKG0uZGFzaFNpemU9dGhpcy5kYXNoU2l6ZSk7dm9pZCAwIT09dGhpcy5nYXBTaXplJiYobS5nYXBTaXplPXRoaXMuZ2FwU2l6ZSk7dm9pZCAwIT09dGhpcy5zY2FsZSYmKG0uc2NhbGU9dGhpcy5zY2FsZSk7ITA9PT10aGlzLmRpdGhlcmluZyYmKG0uZGl0aGVyaW5nPSEwKTswPHRoaXMuYWxwaGFUZXN0JiYobS5hbHBoYVRlc3Q9dGhpcy5hbHBoYVRlc3QpOyEwPT09dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEmJihtLnByZW11bHRpcGxpZWRBbHBoYT0KdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEpOyEwPT09dGhpcy53aXJlZnJhbWUmJihtLndpcmVmcmFtZT10aGlzLndpcmVmcmFtZSk7MTx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCYmKG0ud2lyZWZyYW1lTGluZXdpZHRoPXRoaXMud2lyZWZyYW1lTGluZXdpZHRoKTsicm91bmQiIT09dGhpcy53aXJlZnJhbWVMaW5lY2FwJiYobS53aXJlZnJhbWVMaW5lY2FwPXRoaXMud2lyZWZyYW1lTGluZWNhcCk7InJvdW5kIiE9PXRoaXMud2lyZWZyYW1lTGluZWpvaW4mJihtLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWpvaW4pOyEwPT09dGhpcy5tb3JwaFRhcmdldHMmJihtLm1vcnBoVGFyZ2V0cz0hMCk7ITA9PT10aGlzLm1vcnBoTm9ybWFscyYmKG0ubW9ycGhOb3JtYWxzPSEwKTshMD09PXRoaXMuc2tpbm5pbmcmJihtLnNraW5uaW5nPSEwKTshMT09PXRoaXMudmlzaWJsZSYmKG0udmlzaWJsZT0hMSk7ITE9PT10aGlzLnRvbmVNYXBwZWQmJihtLnRvbmVNYXBwZWQ9ITEpOwoie30iIT09SlNPTi5zdHJpbmdpZnkodGhpcy51c2VyRGF0YSkmJihtLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpO2gmJihoPWUoYi50ZXh0dXJlcyksYj1lKGIuaW1hZ2VzKSwwPGgubGVuZ3RoJiYobS50ZXh0dXJlcz1oKSwwPGIubGVuZ3RoJiYobS5pbWFnZXM9YikpO3JldHVybiBtfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihiKXt0aGlzLm5hbWU9Yi5uYW1lO3RoaXMuZm9nPWIuZm9nO3RoaXMubGlnaHRzPWIubGlnaHRzO3RoaXMuYmxlbmRpbmc9Yi5ibGVuZGluZzt0aGlzLnNpZGU9Yi5zaWRlO3RoaXMuZmxhdFNoYWRpbmc9Yi5mbGF0U2hhZGluZzt0aGlzLnZlcnRleENvbG9ycz1iLnZlcnRleENvbG9yczt0aGlzLm9wYWNpdHk9Yi5vcGFjaXR5O3RoaXMudHJhbnNwYXJlbnQ9Yi50cmFuc3BhcmVudDt0aGlzLmJsZW5kU3JjPWIuYmxlbmRTcmM7dGhpcy5ibGVuZERzdD1iLmJsZW5kRHN0O3RoaXMuYmxlbmRFcXVhdGlvbj0KYi5ibGVuZEVxdWF0aW9uO3RoaXMuYmxlbmRTcmNBbHBoYT1iLmJsZW5kU3JjQWxwaGE7dGhpcy5ibGVuZERzdEFscGhhPWIuYmxlbmREc3RBbHBoYTt0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT1iLmJsZW5kRXF1YXRpb25BbHBoYTt0aGlzLmRlcHRoRnVuYz1iLmRlcHRoRnVuYzt0aGlzLmRlcHRoVGVzdD1iLmRlcHRoVGVzdDt0aGlzLmRlcHRoV3JpdGU9Yi5kZXB0aFdyaXRlO3RoaXMuc3RlbmNpbFdyaXRlPWIuc3RlbmNpbFdyaXRlO3RoaXMuc3RlbmNpbEZ1bmM9Yi5zdGVuY2lsRnVuYzt0aGlzLnN0ZW5jaWxSZWY9Yi5zdGVuY2lsUmVmO3RoaXMuc3RlbmNpbE1hc2s9Yi5zdGVuY2lsTWFzazt0aGlzLnN0ZW5jaWxGYWlsPWIuc3RlbmNpbEZhaWw7dGhpcy5zdGVuY2lsWkZhaWw9Yi5zdGVuY2lsWkZhaWw7dGhpcy5zdGVuY2lsWlBhc3M9Yi5zdGVuY2lsWlBhc3M7dGhpcy5jb2xvcldyaXRlPWIuY29sb3JXcml0ZTt0aGlzLnByZWNpc2lvbj1iLnByZWNpc2lvbjt0aGlzLnBvbHlnb25PZmZzZXQ9CmIucG9seWdvbk9mZnNldDt0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9Yi5wb2x5Z29uT2Zmc2V0RmFjdG9yO3RoaXMucG9seWdvbk9mZnNldFVuaXRzPWIucG9seWdvbk9mZnNldFVuaXRzO3RoaXMuZGl0aGVyaW5nPWIuZGl0aGVyaW5nO3RoaXMuYWxwaGFUZXN0PWIuYWxwaGFUZXN0O3RoaXMucHJlbXVsdGlwbGllZEFscGhhPWIucHJlbXVsdGlwbGllZEFscGhhO3RoaXMudmlzaWJsZT1iLnZpc2libGU7dGhpcy50b25lTWFwcGVkPWIudG9uZU1hcHBlZDt0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYi51c2VyRGF0YSkpO3RoaXMuY2xpcFNoYWRvd3M9Yi5jbGlwU2hhZG93czt0aGlzLmNsaXBJbnRlcnNlY3Rpb249Yi5jbGlwSW50ZXJzZWN0aW9uO3ZhciBlPWIuY2xpcHBpbmdQbGFuZXMsaD1udWxsO2lmKG51bGwhPT1lKXt2YXIgbT1lLmxlbmd0aDtoPUFycmF5KG0pO2Zvcih2YXIgdT0wO3UhPT1tOysrdSloW3VdPWVbdV0uY2xvbmUoKX10aGlzLmNsaXBwaW5nUGxhbmVzPQpoO3RoaXMuc2hhZG93U2lkZT1iLnNoYWRvd1NpZGU7cmV0dXJuIHRoaXN9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fSk7TC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7TC5wcm90b3R5cGUuY29uc3RydWN0b3I9TDtMLnByb3RvdHlwZS5pc01lc2hCYXNpY01hdGVyaWFsPSEwO0wucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5jb2xvci5jb3B5KGIuY29sb3IpO3RoaXMubWFwPWIubWFwO3RoaXMubGlnaHRNYXA9Yi5saWdodE1hcDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PWIubGlnaHRNYXBJbnRlbnNpdHk7dGhpcy5hb01hcD1iLmFvTWFwO3RoaXMuYW9NYXBJbnRlbnNpdHk9Yi5hb01hcEludGVuc2l0eTt0aGlzLnNwZWN1bGFyTWFwPWIuc3BlY3VsYXJNYXA7dGhpcy5hbHBoYU1hcD1iLmFscGhhTWFwO3RoaXMuZW52TWFwPWIuZW52TWFwOwp0aGlzLmNvbWJpbmU9Yi5jb21iaW5lO3RoaXMucmVmbGVjdGl2aXR5PWIucmVmbGVjdGl2aXR5O3RoaXMucmVmcmFjdGlvblJhdGlvPWIucmVmcmFjdGlvblJhdGlvO3RoaXMud2lyZWZyYW1lPWIud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWIud2lyZWZyYW1lTGluZXdpZHRoO3RoaXMud2lyZWZyYW1lTGluZWNhcD1iLndpcmVmcmFtZUxpbmVjYXA7dGhpcy53aXJlZnJhbWVMaW5lam9pbj1iLndpcmVmcmFtZUxpbmVqb2luO3RoaXMuc2tpbm5pbmc9Yi5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1iLm1vcnBoVGFyZ2V0cztyZXR1cm4gdGhpc307T2JqZWN0LmRlZmluZVByb3BlcnR5KFIucHJvdG90eXBlLCJuZWVkc1VwZGF0ZSIse3NldDpmdW5jdGlvbihiKXshMD09PWImJnRoaXMudmVyc2lvbisrfX0pO09iamVjdC5hc3NpZ24oUi5wcm90b3R5cGUse2lzQnVmZmVyQXR0cmlidXRlOiEwLG9uVXBsb2FkQ2FsbGJhY2s6ZnVuY3Rpb24oKXt9LHNldEFycmF5OmZ1bmN0aW9uKGIpe2lmKEFycmF5LmlzQXJyYXkoYikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTsKdGhpcy5jb3VudD12b2lkIDAhPT1iP2IubGVuZ3RoL3RoaXMuaXRlbVNpemU6MDt0aGlzLmFycmF5PWI7cmV0dXJuIHRoaXN9LHNldER5bmFtaWM6ZnVuY3Rpb24oYil7dGhpcy5keW5hbWljPWI7cmV0dXJuIHRoaXN9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy5uYW1lPWIubmFtZTt0aGlzLmFycmF5PW5ldyBiLmFycmF5LmNvbnN0cnVjdG9yKGIuYXJyYXkpO3RoaXMuaXRlbVNpemU9Yi5pdGVtU2l6ZTt0aGlzLmNvdW50PWIuY291bnQ7dGhpcy5ub3JtYWxpemVkPWIubm9ybWFsaXplZDt0aGlzLmR5bmFtaWM9Yi5keW5hbWljO3JldHVybiB0aGlzfSxjb3B5QXQ6ZnVuY3Rpb24oYixlLGgpe2IqPXRoaXMuaXRlbVNpemU7aCo9ZS5pdGVtU2l6ZTtmb3IodmFyIG09MCx1PXRoaXMuaXRlbVNpemU7bTx1O20rKyl0aGlzLmFycmF5W2IrbV09ZS5hcnJheVtoK21dO3JldHVybiB0aGlzfSxjb3B5QXJyYXk6ZnVuY3Rpb24oYil7dGhpcy5hcnJheS5zZXQoYik7cmV0dXJuIHRoaXN9LGNvcHlDb2xvcnNBcnJheTpmdW5jdGlvbihiKXtmb3IodmFyIGU9CnRoaXMuYXJyYXksaD0wLG09MCx1PWIubGVuZ3RoO208dTttKyspe3ZhciB3PWJbbV07dm9pZCAwPT09dyYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlDb2xvcnNBcnJheSgpOiBjb2xvciBpcyB1bmRlZmluZWQiLG0pLHc9bmV3IEkpO2VbaCsrXT13LnI7ZVtoKytdPXcuZztlW2grK109dy5ifXJldHVybiB0aGlzfSxjb3B5VmVjdG9yMnNBcnJheTpmdW5jdGlvbihiKXtmb3IodmFyIGU9dGhpcy5hcnJheSxoPTAsbT0wLHU9Yi5sZW5ndGg7bTx1O20rKyl7dmFyIHc9YlttXTt2b2lkIDA9PT13JiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCIsbSksdz1uZXcgZCk7ZVtoKytdPXcueDtlW2grK109dy55fXJldHVybiB0aGlzfSxjb3B5VmVjdG9yM3NBcnJheTpmdW5jdGlvbihiKXtmb3IodmFyIGU9dGhpcy5hcnJheSxoPTAsbT0wLHU9Yi5sZW5ndGg7bTx1O20rKyl7dmFyIHc9CmJbbV07dm9pZCAwPT09dyYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQiLG0pLHc9bmV3IGcpO2VbaCsrXT13Lng7ZVtoKytdPXcueTtlW2grK109dy56fXJldHVybiB0aGlzfSxjb3B5VmVjdG9yNHNBcnJheTpmdW5jdGlvbihiKXtmb3IodmFyIGU9dGhpcy5hcnJheSxoPTAsbT0wLHU9Yi5sZW5ndGg7bTx1O20rKyl7dmFyIHc9YlttXTt2b2lkIDA9PT13JiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjRzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCIsbSksdz1uZXcgbik7ZVtoKytdPXcueDtlW2grK109dy55O2VbaCsrXT13Lno7ZVtoKytdPXcud31yZXR1cm4gdGhpc30sc2V0OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGU9MCk7dGhpcy5hcnJheS5zZXQoYixlKTtyZXR1cm4gdGhpc30sZ2V0WDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5hcnJheVtiKgp0aGlzLml0ZW1TaXplXX0sc2V0WDpmdW5jdGlvbihiLGUpe3RoaXMuYXJyYXlbYip0aGlzLml0ZW1TaXplXT1lO3JldHVybiB0aGlzfSxnZXRZOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFycmF5W2IqdGhpcy5pdGVtU2l6ZSsxXX0sc2V0WTpmdW5jdGlvbihiLGUpe3RoaXMuYXJyYXlbYip0aGlzLml0ZW1TaXplKzFdPWU7cmV0dXJuIHRoaXN9LGdldFo6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuYXJyYXlbYip0aGlzLml0ZW1TaXplKzJdfSxzZXRaOmZ1bmN0aW9uKGIsZSl7dGhpcy5hcnJheVtiKnRoaXMuaXRlbVNpemUrMl09ZTtyZXR1cm4gdGhpc30sZ2V0VzpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5hcnJheVtiKnRoaXMuaXRlbVNpemUrM119LHNldFc6ZnVuY3Rpb24oYixlKXt0aGlzLmFycmF5W2IqdGhpcy5pdGVtU2l6ZSszXT1lO3JldHVybiB0aGlzfSxzZXRYWTpmdW5jdGlvbihiLGUsaCl7Yio9dGhpcy5pdGVtU2l6ZTt0aGlzLmFycmF5W2IrMF09ZTt0aGlzLmFycmF5W2IrCjFdPWg7cmV0dXJuIHRoaXN9LHNldFhZWjpmdW5jdGlvbihiLGUsaCxtKXtiKj10aGlzLml0ZW1TaXplO3RoaXMuYXJyYXlbYiswXT1lO3RoaXMuYXJyYXlbYisxXT1oO3RoaXMuYXJyYXlbYisyXT1tO3JldHVybiB0aGlzfSxzZXRYWVpXOmZ1bmN0aW9uKGIsZSxoLG0sdSl7Yio9dGhpcy5pdGVtU2l6ZTt0aGlzLmFycmF5W2IrMF09ZTt0aGlzLmFycmF5W2IrMV09aDt0aGlzLmFycmF5W2IrMl09bTt0aGlzLmFycmF5W2IrM109dTtyZXR1cm4gdGhpc30sb25VcGxvYWQ6ZnVuY3Rpb24oYil7dGhpcy5vblVwbG9hZENhbGxiYWNrPWI7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuYXJyYXksdGhpcy5pdGVtU2l6ZSkpLmNvcHkodGhpcyl9LHRvSlNPTjpmdW5jdGlvbigpe3JldHVybntpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuYXJyYXkpLApub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH19fSk7VS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShSLnByb3RvdHlwZSk7VS5wcm90b3R5cGUuY29uc3RydWN0b3I9VTtZLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFIucHJvdG90eXBlKTtZLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1ZO2JhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFIucHJvdG90eXBlKTtiYS5wcm90b3R5cGUuY29uc3RydWN0b3I9YmE7bWEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUi5wcm90b3R5cGUpO21hLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1tYTthYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShSLnByb3RvdHlwZSk7YWEucHJvdG90eXBlLmNvbnN0cnVjdG9yPWFhO2NhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFIucHJvdG90eXBlKTtjYS5wcm90b3R5cGUuY29uc3RydWN0b3I9Y2E7ZmEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUi5wcm90b3R5cGUpO2ZhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1mYTsKZGEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUi5wcm90b3R5cGUpO2RhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1kYTtsYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShSLnByb3RvdHlwZSk7bGEucHJvdG90eXBlLmNvbnN0cnVjdG9yPWxhO09iamVjdC5hc3NpZ24oWi5wcm90b3R5cGUse2NvbXB1dGVHcm91cHM6ZnVuY3Rpb24oYil7dmFyIGU9W10saD12b2lkIDA7Yj1iLmZhY2VzO2Zvcih2YXIgbT0wO208Yi5sZW5ndGg7bSsrKXt2YXIgdT1iW21dO2lmKHUubWF0ZXJpYWxJbmRleCE9PWgpe2g9dS5tYXRlcmlhbEluZGV4O3ZvaWQgMCE9PXcmJih3LmNvdW50PTMqbS13LnN0YXJ0LGUucHVzaCh3KSk7dmFyIHc9e3N0YXJ0OjMqbSxtYXRlcmlhbEluZGV4Omh9fX12b2lkIDAhPT13JiYody5jb3VudD0zKm0tdy5zdGFydCxlLnB1c2godykpO3RoaXMuZ3JvdXBzPWV9LGZyb21HZW9tZXRyeTpmdW5jdGlvbihiKXt2YXIgZT1iLmZhY2VzLGg9Yi52ZXJ0aWNlcyxtPWIuZmFjZVZlcnRleFV2cywKdT1tWzBdJiYwPG1bMF0ubGVuZ3RoLHc9bVsxXSYmMDxtWzFdLmxlbmd0aCxBPWIubW9ycGhUYXJnZXRzLEU9QS5sZW5ndGg7aWYoMDxFKXt2YXIgRz1bXTtmb3IodmFyIEo9MDtKPEU7SisrKUdbSl09e25hbWU6QVtKXS5uYW1lLGRhdGE6W119O3RoaXMubW9ycGhUYXJnZXRzLnBvc2l0aW9uPUd9dmFyIFE9Yi5tb3JwaE5vcm1hbHMsUz1RLmxlbmd0aDtpZigwPFMpe3ZhciBUPVtdO2ZvcihKPTA7SjxTO0orKylUW0pdPXtuYW1lOlFbSl0ubmFtZSxkYXRhOltdfTt0aGlzLm1vcnBoVGFyZ2V0cy5ub3JtYWw9VH12YXIgVz1iLnNraW5JbmRpY2VzLFg9Yi5za2luV2VpZ2h0cyxpYT1XLmxlbmd0aD09PWgubGVuZ3RoLGhhPVgubGVuZ3RoPT09aC5sZW5ndGg7MDxoLmxlbmd0aCYmMD09PWUubGVuZ3RoJiZjb25zb2xlLmVycm9yKCJUSFJFRS5EaXJlY3RHZW9tZXRyeTogRmFjZWxlc3MgZ2VvbWV0cmllcyBhcmUgbm90IHN1cHBvcnRlZC4iKTtmb3IoSj0wO0o8ZS5sZW5ndGg7SisrKXt2YXIgc2E9CmVbSl07dGhpcy52ZXJ0aWNlcy5wdXNoKGhbc2EuYV0saFtzYS5iXSxoW3NhLmNdKTt2YXIgcWE9c2EudmVydGV4Tm9ybWFsczszPT09cWEubGVuZ3RoP3RoaXMubm9ybWFscy5wdXNoKHFhWzBdLHFhWzFdLHFhWzJdKToocWE9c2Eubm9ybWFsLHRoaXMubm9ybWFscy5wdXNoKHFhLHFhLHFhKSk7cWE9c2EudmVydGV4Q29sb3JzOzM9PT1xYS5sZW5ndGg/dGhpcy5jb2xvcnMucHVzaChxYVswXSxxYVsxXSxxYVsyXSk6KHFhPXNhLmNvbG9yLHRoaXMuY29sb3JzLnB1c2gocWEscWEscWEpKTshMD09PXUmJihxYT1tWzBdW0pdLHZvaWQgMCE9PXFhP3RoaXMudXZzLnB1c2gocWFbMF0scWFbMV0scWFbMl0pOihjb25zb2xlLndhcm4oIlRIUkVFLkRpcmVjdEdlb21ldHJ5LmZyb21HZW9tZXRyeSgpOiBVbmRlZmluZWQgdmVydGV4VXYgIixKKSx0aGlzLnV2cy5wdXNoKG5ldyBkLG5ldyBkLG5ldyBkKSkpOyEwPT09dyYmKHFhPW1bMV1bSl0sdm9pZCAwIT09cWE/dGhpcy51dnMyLnB1c2gocWFbMF0sCnFhWzFdLHFhWzJdKTooY29uc29sZS53YXJuKCJUSFJFRS5EaXJlY3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2MiAiLEopLHRoaXMudXZzMi5wdXNoKG5ldyBkLG5ldyBkLG5ldyBkKSkpO2ZvcihxYT0wO3FhPEU7cWErKyl7dmFyIHJhPUFbcWFdLnZlcnRpY2VzO0dbcWFdLmRhdGEucHVzaChyYVtzYS5hXSxyYVtzYS5iXSxyYVtzYS5jXSl9Zm9yKHFhPTA7cWE8UztxYSsrKXJhPVFbcWFdLnZlcnRleE5vcm1hbHNbSl0sVFtxYV0uZGF0YS5wdXNoKHJhLmEscmEuYixyYS5jKTtpYSYmdGhpcy5za2luSW5kaWNlcy5wdXNoKFdbc2EuYV0sV1tzYS5iXSxXW3NhLmNdKTtoYSYmdGhpcy5za2luV2VpZ2h0cy5wdXNoKFhbc2EuYV0sWFtzYS5iXSxYW3NhLmNdKX10aGlzLmNvbXB1dGVHcm91cHMoYik7dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGU9Yi52ZXJ0aWNlc05lZWRVcGRhdGU7dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZT1iLm5vcm1hbHNOZWVkVXBkYXRlOwp0aGlzLmNvbG9yc05lZWRVcGRhdGU9Yi5jb2xvcnNOZWVkVXBkYXRlO3RoaXMudXZzTmVlZFVwZGF0ZT1iLnV2c05lZWRVcGRhdGU7dGhpcy5ncm91cHNOZWVkVXBkYXRlPWIuZ3JvdXBzTmVlZFVwZGF0ZTtudWxsIT09Yi5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9Yi5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpKTtudWxsIT09Yi5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9Yi5ib3VuZGluZ0JveC5jbG9uZSgpKTtyZXR1cm4gdGhpc319KTt2YXIgTXE9MSxGZD1uZXcgcixpbD1uZXcgeSxraj1uZXcgZyxlZj1uZXcgeCxqbD1uZXcgeCxsZD1uZXcgZzt4YS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6eGEsaXNCdWZmZXJHZW9tZXRyeTohMCxnZXRJbmRleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluZGV4fSxzZXRJbmRleDpmdW5jdGlvbihiKXt0aGlzLmluZGV4PUFycmF5LmlzQXJyYXkoYik/Cm5ldyAoNjU1MzU8RmEoYik/ZmE6YWEpKGIsMSk6Yn0sYWRkQXR0cmlidXRlOmZ1bmN0aW9uKGIsZSxoKXtpZighKGUmJmUuaXNCdWZmZXJBdHRyaWJ1dGV8fGUmJmUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSkpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRBdHRyaWJ1dGUoKSBub3cgZXhwZWN0cyAoIG5hbWUsIGF0dHJpYnV0ZSApLiIpLHRoaXMuYWRkQXR0cmlidXRlKGIsbmV3IFIoZSxoKSk7aWYoImluZGV4Ij09PWIpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnkuYWRkQXR0cmlidXRlOiBVc2UgLnNldEluZGV4KCkgZm9yIGluZGV4IGF0dHJpYnV0ZS4iKSx0aGlzLnNldEluZGV4KGUpLHRoaXM7dGhpcy5hdHRyaWJ1dGVzW2JdPWU7cmV0dXJuIHRoaXN9LGdldEF0dHJpYnV0ZTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW2JdfSxyZW1vdmVBdHRyaWJ1dGU6ZnVuY3Rpb24oYil7ZGVsZXRlIHRoaXMuYXR0cmlidXRlc1tiXTsKcmV0dXJuIHRoaXN9LGFkZEdyb3VwOmZ1bmN0aW9uKGIsZSxoKXt0aGlzLmdyb3Vwcy5wdXNoKHtzdGFydDpiLGNvdW50OmUsbWF0ZXJpYWxJbmRleDp2b2lkIDAhPT1oP2g6MH0pfSxjbGVhckdyb3VwczpmdW5jdGlvbigpe3RoaXMuZ3JvdXBzPVtdfSxzZXREcmF3UmFuZ2U6ZnVuY3Rpb24oYixlKXt0aGlzLmRyYXdSYW5nZS5zdGFydD1iO3RoaXMuZHJhd1JhbmdlLmNvdW50PWV9LGFwcGx5TWF0cml4OmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjt2b2lkIDAhPT1lJiYoYi5hcHBseVRvQnVmZmVyQXR0cmlidXRlKGUpLGUubmVlZHNVcGRhdGU9ITApO3ZhciBoPXRoaXMuYXR0cmlidXRlcy5ub3JtYWw7dm9pZCAwIT09aCYmKGU9KG5ldyBsKS5nZXROb3JtYWxNYXRyaXgoYiksZS5hcHBseVRvQnVmZmVyQXR0cmlidXRlKGgpLGgubmVlZHNVcGRhdGU9ITApO2g9dGhpcy5hdHRyaWJ1dGVzLnRhbmdlbnQ7dm9pZCAwIT09aCYmKGU9KG5ldyBsKS5nZXROb3JtYWxNYXRyaXgoYiksCmUuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZShoKSxoLm5lZWRzVXBkYXRlPSEwKTtudWxsIT09dGhpcy5ib3VuZGluZ0JveCYmdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtudWxsIT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtyZXR1cm4gdGhpc30scm90YXRlWDpmdW5jdGlvbihiKXtGZC5tYWtlUm90YXRpb25YKGIpO3RoaXMuYXBwbHlNYXRyaXgoRmQpO3JldHVybiB0aGlzfSxyb3RhdGVZOmZ1bmN0aW9uKGIpe0ZkLm1ha2VSb3RhdGlvblkoYik7dGhpcy5hcHBseU1hdHJpeChGZCk7cmV0dXJuIHRoaXN9LHJvdGF0ZVo6ZnVuY3Rpb24oYil7RmQubWFrZVJvdGF0aW9uWihiKTt0aGlzLmFwcGx5TWF0cml4KEZkKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGIsZSxoKXtGZC5tYWtlVHJhbnNsYXRpb24oYixlLGgpO3RoaXMuYXBwbHlNYXRyaXgoRmQpO3JldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihiLGUsaCl7RmQubWFrZVNjYWxlKGIsCmUsaCk7dGhpcy5hcHBseU1hdHJpeChGZCk7cmV0dXJuIHRoaXN9LGxvb2tBdDpmdW5jdGlvbihiKXtpbC5sb29rQXQoYik7aWwudXBkYXRlTWF0cml4KCk7dGhpcy5hcHBseU1hdHJpeChpbC5tYXRyaXgpO3JldHVybiB0aGlzfSxjZW50ZXI6ZnVuY3Rpb24oKXt0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO3RoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKGtqKS5uZWdhdGUoKTt0aGlzLnRyYW5zbGF0ZShrai54LGtqLnksa2oueik7cmV0dXJuIHRoaXN9LHNldEZyb21PYmplY3Q6ZnVuY3Rpb24oYil7dmFyIGU9Yi5nZW9tZXRyeTtpZihiLmlzUG9pbnRzfHxiLmlzTGluZSl7Yj1uZXcgZGEoMyplLnZlcnRpY2VzLmxlbmd0aCwzKTt2YXIgaD1uZXcgZGEoMyplLmNvbG9ycy5sZW5ndGgsMyk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixiLmNvcHlWZWN0b3Izc0FycmF5KGUudmVydGljZXMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgiY29sb3IiLGguY29weUNvbG9yc0FycmF5KGUuY29sb3JzKSk7CmUubGluZURpc3RhbmNlcyYmZS5saW5lRGlzdGFuY2VzLmxlbmd0aD09PWUudmVydGljZXMubGVuZ3RoJiYoYj1uZXcgZGEoZS5saW5lRGlzdGFuY2VzLmxlbmd0aCwxKSx0aGlzLmFkZEF0dHJpYnV0ZSgibGluZURpc3RhbmNlIixiLmNvcHlBcnJheShlLmxpbmVEaXN0YW5jZXMpKSk7bnVsbCE9PWUuYm91bmRpbmdTcGhlcmUmJih0aGlzLmJvdW5kaW5nU3BoZXJlPWUuYm91bmRpbmdTcGhlcmUuY2xvbmUoKSk7bnVsbCE9PWUuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PWUuYm91bmRpbmdCb3guY2xvbmUoKSl9ZWxzZSBiLmlzTWVzaCYmZSYmZS5pc0dlb21ldHJ5JiZ0aGlzLmZyb21HZW9tZXRyeShlKTtyZXR1cm4gdGhpc30sc2V0RnJvbVBvaW50czpmdW5jdGlvbihiKXtmb3IodmFyIGU9W10saD0wLG09Yi5sZW5ndGg7aDxtO2grKyl7dmFyIHU9YltoXTtlLnB1c2godS54LHUueSx1Lnp8fDApfXRoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGRhKGUsMykpOwpyZXR1cm4gdGhpc30sdXBkYXRlRnJvbU9iamVjdDpmdW5jdGlvbihiKXt2YXIgZT1iLmdlb21ldHJ5O2lmKGIuaXNNZXNoKXt2YXIgaD1lLl9fZGlyZWN0R2VvbWV0cnk7ITA9PT1lLmVsZW1lbnRzTmVlZFVwZGF0ZSYmKGg9dm9pZCAwLGUuZWxlbWVudHNOZWVkVXBkYXRlPSExKTtpZih2b2lkIDA9PT1oKXJldHVybiB0aGlzLmZyb21HZW9tZXRyeShlKTtoLnZlcnRpY2VzTmVlZFVwZGF0ZT1lLnZlcnRpY2VzTmVlZFVwZGF0ZTtoLm5vcm1hbHNOZWVkVXBkYXRlPWUubm9ybWFsc05lZWRVcGRhdGU7aC5jb2xvcnNOZWVkVXBkYXRlPWUuY29sb3JzTmVlZFVwZGF0ZTtoLnV2c05lZWRVcGRhdGU9ZS51dnNOZWVkVXBkYXRlO2guZ3JvdXBzTmVlZFVwZGF0ZT1lLmdyb3Vwc05lZWRVcGRhdGU7ZS52ZXJ0aWNlc05lZWRVcGRhdGU9ITE7ZS5ub3JtYWxzTmVlZFVwZGF0ZT0hMTtlLmNvbG9yc05lZWRVcGRhdGU9ITE7ZS51dnNOZWVkVXBkYXRlPSExO2UuZ3JvdXBzTmVlZFVwZGF0ZT0hMTsKZT1ofSEwPT09ZS52ZXJ0aWNlc05lZWRVcGRhdGUmJihoPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbix2b2lkIDAhPT1oJiYoaC5jb3B5VmVjdG9yM3NBcnJheShlLnZlcnRpY2VzKSxoLm5lZWRzVXBkYXRlPSEwKSxlLnZlcnRpY2VzTmVlZFVwZGF0ZT0hMSk7ITA9PT1lLm5vcm1hbHNOZWVkVXBkYXRlJiYoaD10aGlzLmF0dHJpYnV0ZXMubm9ybWFsLHZvaWQgMCE9PWgmJihoLmNvcHlWZWN0b3Izc0FycmF5KGUubm9ybWFscyksaC5uZWVkc1VwZGF0ZT0hMCksZS5ub3JtYWxzTmVlZFVwZGF0ZT0hMSk7ITA9PT1lLmNvbG9yc05lZWRVcGRhdGUmJihoPXRoaXMuYXR0cmlidXRlcy5jb2xvcix2b2lkIDAhPT1oJiYoaC5jb3B5Q29sb3JzQXJyYXkoZS5jb2xvcnMpLGgubmVlZHNVcGRhdGU9ITApLGUuY29sb3JzTmVlZFVwZGF0ZT0hMSk7ZS51dnNOZWVkVXBkYXRlJiYoaD10aGlzLmF0dHJpYnV0ZXMudXYsdm9pZCAwIT09aCYmKGguY29weVZlY3RvcjJzQXJyYXkoZS51dnMpLGgubmVlZHNVcGRhdGU9CiEwKSxlLnV2c05lZWRVcGRhdGU9ITEpO2UubGluZURpc3RhbmNlc05lZWRVcGRhdGUmJihoPXRoaXMuYXR0cmlidXRlcy5saW5lRGlzdGFuY2Usdm9pZCAwIT09aCYmKGguY29weUFycmF5KGUubGluZURpc3RhbmNlcyksaC5uZWVkc1VwZGF0ZT0hMCksZS5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZT0hMSk7ZS5ncm91cHNOZWVkVXBkYXRlJiYoZS5jb21wdXRlR3JvdXBzKGIuZ2VvbWV0cnkpLHRoaXMuZ3JvdXBzPWUuZ3JvdXBzLGUuZ3JvdXBzTmVlZFVwZGF0ZT0hMSk7cmV0dXJuIHRoaXN9LGZyb21HZW9tZXRyeTpmdW5jdGlvbihiKXtiLl9fZGlyZWN0R2VvbWV0cnk9KG5ldyBaKS5mcm9tR2VvbWV0cnkoYik7cmV0dXJuIHRoaXMuZnJvbURpcmVjdEdlb21ldHJ5KGIuX19kaXJlY3RHZW9tZXRyeSl9LGZyb21EaXJlY3RHZW9tZXRyeTpmdW5jdGlvbihiKXt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLChuZXcgUihuZXcgRmxvYXQzMkFycmF5KDMqYi52ZXJ0aWNlcy5sZW5ndGgpLAozKSkuY29weVZlY3RvcjNzQXJyYXkoYi52ZXJ0aWNlcykpOzA8Yi5ub3JtYWxzLmxlbmd0aCYmdGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsKG5ldyBSKG5ldyBGbG9hdDMyQXJyYXkoMypiLm5vcm1hbHMubGVuZ3RoKSwzKSkuY29weVZlY3RvcjNzQXJyYXkoYi5ub3JtYWxzKSk7MDxiLmNvbG9ycy5sZW5ndGgmJnRoaXMuYWRkQXR0cmlidXRlKCJjb2xvciIsKG5ldyBSKG5ldyBGbG9hdDMyQXJyYXkoMypiLmNvbG9ycy5sZW5ndGgpLDMpKS5jb3B5Q29sb3JzQXJyYXkoYi5jb2xvcnMpKTswPGIudXZzLmxlbmd0aCYmdGhpcy5hZGRBdHRyaWJ1dGUoInV2IiwobmV3IFIobmV3IEZsb2F0MzJBcnJheSgyKmIudXZzLmxlbmd0aCksMikpLmNvcHlWZWN0b3Iyc0FycmF5KGIudXZzKSk7MDxiLnV2czIubGVuZ3RoJiZ0aGlzLmFkZEF0dHJpYnV0ZSgidXYyIiwobmV3IFIobmV3IEZsb2F0MzJBcnJheSgyKmIudXZzMi5sZW5ndGgpLDIpKS5jb3B5VmVjdG9yMnNBcnJheShiLnV2czIpKTsKdGhpcy5ncm91cHM9Yi5ncm91cHM7Zm9yKHZhciBlIGluIGIubW9ycGhUYXJnZXRzKXtmb3IodmFyIGg9W10sbT1iLm1vcnBoVGFyZ2V0c1tlXSx1PTAsdz1tLmxlbmd0aDt1PHc7dSsrKXt2YXIgQT1tW3VdLEU9bmV3IGRhKDMqQS5kYXRhLmxlbmd0aCwzKTtFLm5hbWU9QS5uYW1lO2gucHVzaChFLmNvcHlWZWN0b3Izc0FycmF5KEEuZGF0YSkpfXRoaXMubW9ycGhBdHRyaWJ1dGVzW2VdPWh9MDxiLnNraW5JbmRpY2VzLmxlbmd0aCYmKGU9bmV3IGRhKDQqYi5za2luSW5kaWNlcy5sZW5ndGgsNCksdGhpcy5hZGRBdHRyaWJ1dGUoInNraW5JbmRleCIsZS5jb3B5VmVjdG9yNHNBcnJheShiLnNraW5JbmRpY2VzKSkpOzA8Yi5za2luV2VpZ2h0cy5sZW5ndGgmJihlPW5ldyBkYSg0KmIuc2tpbldlaWdodHMubGVuZ3RoLDQpLHRoaXMuYWRkQXR0cmlidXRlKCJza2luV2VpZ2h0IixlLmNvcHlWZWN0b3I0c0FycmF5KGIuc2tpbldlaWdodHMpKSk7bnVsbCE9PWIuYm91bmRpbmdTcGhlcmUmJgoodGhpcy5ib3VuZGluZ1NwaGVyZT1iLmJvdW5kaW5nU3BoZXJlLmNsb25lKCkpO251bGwhPT1iLmJvdW5kaW5nQm94JiYodGhpcy5ib3VuZGluZ0JveD1iLmJvdW5kaW5nQm94LmNsb25lKCkpO3JldHVybiB0aGlzfSxjb21wdXRlQm91bmRpbmdCb3g6ZnVuY3Rpb24oKXtudWxsPT09dGhpcy5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IHgpO3ZhciBiPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbixlPXRoaXMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKHZvaWQgMCE9PWIpe2lmKHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShiKSxlKXtiPTA7Zm9yKHZhciBoPWUubGVuZ3RoO2I8aDtiKyspZWYuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShlW2JdKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoZWYubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoZWYubWF4KX19ZWxzZSB0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpOwooaXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueCl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnkpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi56KSkmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveDogQ29tcHV0ZWQgbWluL21heCBoYXZlIE5hTiB2YWx1ZXMuIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsdGhpcyl9LGNvbXB1dGVCb3VuZGluZ1NwaGVyZTpmdW5jdGlvbigpe251bGw9PT10aGlzLmJvdW5kaW5nU3BoZXJlJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1uZXcgRik7dmFyIGI9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYoYil7dmFyIGg9dGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7ZWYuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShiKTtpZihlKWZvcih2YXIgbT0wLHU9ZS5sZW5ndGg7bTx1O20rKyl7dmFyIHc9CmVbbV07amwuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh3KTtlZi5leHBhbmRCeVBvaW50KGpsLm1pbik7ZWYuZXhwYW5kQnlQb2ludChqbC5tYXgpfWVmLmdldENlbnRlcihoKTt2YXIgQT0wO209MDtmb3IodT1iLmNvdW50O208dTttKyspbGQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShiLG0pLEE9TWF0aC5tYXgoQSxoLmRpc3RhbmNlVG9TcXVhcmVkKGxkKSk7aWYoZSlmb3IobT0wLHU9ZS5sZW5ndGg7bTx1O20rKyl7dz1lW21dO2I9MDtmb3IodmFyIEU9dy5jb3VudDtiPEU7YisrKWxkLmZyb21CdWZmZXJBdHRyaWJ1dGUodyxiKSxBPU1hdGgubWF4KEEsaC5kaXN0YW5jZVRvU3F1YXJlZChsZCkpfXRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzPU1hdGguc3FydChBKTtpc05hTih0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cykmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBDb21wdXRlZCByYWRpdXMgaXMgTmFOLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLAp0aGlzKX19LGNvbXB1dGVGYWNlTm9ybWFsczpmdW5jdGlvbigpe30sY29tcHV0ZVZlcnRleE5vcm1hbHM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmluZGV4LGU9dGhpcy5hdHRyaWJ1dGVzO2lmKGUucG9zaXRpb24pe3ZhciBoPWUucG9zaXRpb24uYXJyYXk7aWYodm9pZCAwPT09ZS5ub3JtYWwpdGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFIobmV3IEZsb2F0MzJBcnJheShoLmxlbmd0aCksMykpO2Vsc2UgZm9yKHZhciBtPWUubm9ybWFsLmFycmF5LHU9MCx3PW0ubGVuZ3RoO3U8dzt1KyspbVt1XT0wO209ZS5ub3JtYWwuYXJyYXk7dmFyIEE9bmV3IGcsRT1uZXcgZyxHPW5ldyBnLEo9bmV3IGcsUT1uZXcgZztpZihiKXt2YXIgUz1iLmFycmF5O3U9MDtmb3Iodz1iLmNvdW50O3U8dzt1Kz0zKXtiPTMqU1t1KzBdO3ZhciBUPTMqU1t1KzFdO3ZhciBXPTMqU1t1KzJdO0EuZnJvbUFycmF5KGgsYik7RS5mcm9tQXJyYXkoaCxUKTtHLmZyb21BcnJheShoLFcpO0ouc3ViVmVjdG9ycyhHLApFKTtRLnN1YlZlY3RvcnMoQSxFKTtKLmNyb3NzKFEpO21bYl0rPUoueDttW2IrMV0rPUoueTttW2IrMl0rPUouejttW1RdKz1KLng7bVtUKzFdKz1KLnk7bVtUKzJdKz1KLno7bVtXXSs9Si54O21bVysxXSs9Si55O21bVysyXSs9Si56fX1lbHNlIGZvcih1PTAsdz1oLmxlbmd0aDt1PHc7dSs9OSlBLmZyb21BcnJheShoLHUpLEUuZnJvbUFycmF5KGgsdSszKSxHLmZyb21BcnJheShoLHUrNiksSi5zdWJWZWN0b3JzKEcsRSksUS5zdWJWZWN0b3JzKEEsRSksSi5jcm9zcyhRKSxtW3VdPUoueCxtW3UrMV09Si55LG1bdSsyXT1KLnosbVt1KzNdPUoueCxtW3UrNF09Si55LG1bdSs1XT1KLnosbVt1KzZdPUoueCxtW3UrN109Si55LG1bdSs4XT1KLno7dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7ZS5ub3JtYWwubmVlZHNVcGRhdGU9ITB9fSxtZXJnZTpmdW5jdGlvbihiLGUpe2lmKGImJmIuaXNCdWZmZXJHZW9tZXRyeSl7dm9pZCAwPT09ZSYmKGU9MCxjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IE92ZXJ3cml0aW5nIG9yaWdpbmFsIGdlb21ldHJ5LCBzdGFydGluZyBhdCBvZmZzZXRceDNkMC4gVXNlIEJ1ZmZlckdlb21ldHJ5VXRpbHMubWVyZ2VCdWZmZXJHZW9tZXRyaWVzKCkgZm9yIGxvc3NsZXNzIG1lcmdlLiIpKTsKdmFyIGg9dGhpcy5hdHRyaWJ1dGVzLG07Zm9yKG0gaW4gaClpZih2b2lkIDAhPT1iLmF0dHJpYnV0ZXNbbV0pe3ZhciB1PWhbbV0uYXJyYXksdz1iLmF0dHJpYnV0ZXNbbV0sQT13LmFycmF5LEU9dy5pdGVtU2l6ZSplO3c9TWF0aC5taW4oQS5sZW5ndGgsdS5sZW5ndGgtRSk7Zm9yKHZhciBHPTA7Rzx3O0crKyxFKyspdVtFXT1BW0ddfXJldHVybiB0aGlzfWNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IGdlb21ldHJ5IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5CdWZmZXJHZW9tZXRyeS4iLGIpfSxub3JtYWxpemVOb3JtYWxzOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuYXR0cmlidXRlcy5ub3JtYWwsZT0wLGg9Yi5jb3VudDtlPGg7ZSsrKWxkLng9Yi5nZXRYKGUpLGxkLnk9Yi5nZXRZKGUpLGxkLno9Yi5nZXRaKGUpLGxkLm5vcm1hbGl6ZSgpLGIuc2V0WFlaKGUsbGQueCxsZC55LGxkLnopfSx0b05vbkluZGV4ZWQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKFEsClMpe3ZhciBUPVEuYXJyYXk7UT1RLml0ZW1TaXplO2Zvcih2YXIgVz1uZXcgVC5jb25zdHJ1Y3RvcihTLmxlbmd0aCpRKSxYLGlhPTAsaGE9MCxzYT1TLmxlbmd0aDtoYTxzYTtoYSsrKXtYPVNbaGFdKlE7Zm9yKHZhciBxYT0wO3FhPFE7cWErKylXW2lhKytdPVRbWCsrXX1yZXR1cm4gbmV3IFIoVyxRKX1pZihudWxsPT09dGhpcy5pbmRleClyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTogR2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4iKSx0aGlzO3ZhciBlPW5ldyB4YSxoPXRoaXMuaW5kZXguYXJyYXksbT10aGlzLmF0dHJpYnV0ZXMsdTtmb3IodSBpbiBtKXt2YXIgdz1tW3VdO3c9Yih3LGgpO2UuYWRkQXR0cmlidXRlKHUsdyl9dmFyIEE9dGhpcy5tb3JwaEF0dHJpYnV0ZXM7Zm9yKHUgaW4gQSl7dmFyIEU9W10sRz1BW3VdO209MDtmb3IodmFyIEo9Ry5sZW5ndGg7bTxKO20rKyl3PUdbbV0sdz1iKHcsaCksRS5wdXNoKHcpOwplLm1vcnBoQXR0cmlidXRlc1t1XT1FfWg9dGhpcy5ncm91cHM7bT0wO2Zvcih1PWgubGVuZ3RoO208dTttKyspdz1oW21dLGUuYWRkR3JvdXAody5zdGFydCx3LmNvdW50LHcubWF0ZXJpYWxJbmRleCk7cmV0dXJuIGV9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBiPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiQnVmZmVyR2VvbWV0cnkiLGdlbmVyYXRvcjoiQnVmZmVyR2VvbWV0cnkudG9KU09OIn19O2IudXVpZD10aGlzLnV1aWQ7Yi50eXBlPXRoaXMudHlwZTsiIiE9PXRoaXMubmFtZSYmKGIubmFtZT10aGlzLm5hbWUpOzA8T2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoJiYoYi51c2VyRGF0YT10aGlzLnVzZXJEYXRhKTtpZih2b2lkIDAhPT10aGlzLnBhcmFtZXRlcnMpe3ZhciBlPXRoaXMucGFyYW1ldGVycztmb3IoSiBpbiBlKXZvaWQgMCE9PWVbSl0mJihiW0pdPWVbSl0pO3JldHVybiBifWIuZGF0YT17YXR0cmlidXRlczp7fX07ZT10aGlzLmluZGV4O251bGwhPT0KZSYmKGIuZGF0YS5pbmRleD17dHlwZTplLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5hcnJheSl9KTt2YXIgaD10aGlzLmF0dHJpYnV0ZXM7Zm9yKEogaW4gaCl7ZT1oW0pdO3ZhciBtPWUudG9KU09OKCk7IiIhPT1lLm5hbWUmJihtLm5hbWU9ZS5uYW1lKTtiLmRhdGEuYXR0cmlidXRlc1tKXT1tfWg9e307dmFyIHU9ITE7Zm9yKEogaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMpe2Zvcih2YXIgdz10aGlzLm1vcnBoQXR0cmlidXRlc1tKXSxBPVtdLEU9MCxHPXcubGVuZ3RoO0U8RztFKyspZT13W0VdLG09ZS50b0pTT04oKSwiIiE9PWUubmFtZSYmKG0ubmFtZT1lLm5hbWUpLEEucHVzaChtKTswPEEubGVuZ3RoJiYoaFtKXT1BLHU9ITApfXUmJihiLmRhdGEubW9ycGhBdHRyaWJ1dGVzPWgpO3ZhciBKPXRoaXMuZ3JvdXBzOzA8Si5sZW5ndGgmJihiLmRhdGEuZ3JvdXBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoSikpKTtKPQp0aGlzLmJvdW5kaW5nU3BoZXJlO251bGwhPT1KJiYoYi5kYXRhLmJvdW5kaW5nU3BoZXJlPXtjZW50ZXI6Si5jZW50ZXIudG9BcnJheSgpLHJhZGl1czpKLnJhZGl1c30pO3JldHVybiBifSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgeGEpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7dmFyIGU7dGhpcy5pbmRleD1udWxsO3RoaXMuYXR0cmlidXRlcz17fTt0aGlzLm1vcnBoQXR0cmlidXRlcz17fTt0aGlzLmdyb3Vwcz1bXTt0aGlzLmJvdW5kaW5nU3BoZXJlPXRoaXMuYm91bmRpbmdCb3g9bnVsbDt0aGlzLm5hbWU9Yi5uYW1lO3ZhciBoPWIuaW5kZXg7bnVsbCE9PWgmJnRoaXMuc2V0SW5kZXgoaC5jbG9uZSgpKTtoPWIuYXR0cmlidXRlcztmb3IoQSBpbiBoKXRoaXMuYWRkQXR0cmlidXRlKEEsaFtBXS5jbG9uZSgpKTt2YXIgbT1iLm1vcnBoQXR0cmlidXRlcztmb3IoQSBpbiBtKXt2YXIgdT1bXSx3PW1bQV07aD0wO2ZvcihlPXcubGVuZ3RoO2g8ZTtoKyspdS5wdXNoKHdbaF0uY2xvbmUoKSk7CnRoaXMubW9ycGhBdHRyaWJ1dGVzW0FdPXV9dmFyIEE9Yi5ncm91cHM7aD0wO2ZvcihlPUEubGVuZ3RoO2g8ZTtoKyspbT1BW2hdLHRoaXMuYWRkR3JvdXAobS5zdGFydCxtLmNvdW50LG0ubWF0ZXJpYWxJbmRleCk7QT1iLmJvdW5kaW5nQm94O251bGwhPT1BJiYodGhpcy5ib3VuZGluZ0JveD1BLmNsb25lKCkpO0E9Yi5ib3VuZGluZ1NwaGVyZTtudWxsIT09QSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9QS5jbG9uZSgpKTt0aGlzLmRyYXdSYW5nZS5zdGFydD1iLmRyYXdSYW5nZS5zdGFydDt0aGlzLmRyYXdSYW5nZS5jb3VudD1iLmRyYXdSYW5nZS5jb3VudDt0aGlzLnVzZXJEYXRhPWIudXNlckRhdGE7cmV0dXJuIHRoaXN9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fSk7dmFyIHNvPW5ldyByLGZmPW5ldyBELGtsPW5ldyBGLEplPW5ldyBnLEtlPW5ldyBnLExlPW5ldyBnLGhuPW5ldyBnLGpuPW5ldyBnLGtuPW5ldyBnLGxrPQpuZXcgZyxtaz1uZXcgZyxuaz1uZXcgZyx6Zj1uZXcgZCxBZj1uZXcgZCxCZj1uZXcgZCxZZz1uZXcgZyxwaT1uZXcgZzt5YS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHkucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6eWEsaXNNZXNoOiEwLHNldERyYXdNb2RlOmZ1bmN0aW9uKGIpe3RoaXMuZHJhd01vZGU9Yn0sY29weTpmdW5jdGlvbihiKXt5LnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLmRyYXdNb2RlPWIuZHJhd01vZGU7dm9pZCAwIT09Yi5tb3JwaFRhcmdldEluZmx1ZW5jZXMmJih0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1iLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5zbGljZSgpKTt2b2lkIDAhPT1iLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSYmKHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PU9iamVjdC5hc3NpZ24oe30sYi5tb3JwaFRhcmdldERpY3Rpb25hcnkpKTtyZXR1cm4gdGhpc30sdXBkYXRlTW9ycGhUYXJnZXRzOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2VvbWV0cnk7aWYoYi5pc0J1ZmZlckdlb21ldHJ5KXtiPWIubW9ycGhBdHRyaWJ1dGVzO3ZhciBlPU9iamVjdC5rZXlzKGIpO2lmKDA8ZS5sZW5ndGgpe3ZhciBoPWJbZVswXV07aWYodm9pZCAwIT09aClmb3IodGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9W10sdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9e30sYj0wLGU9aC5sZW5ndGg7YjxlO2IrKyl7dmFyIG09aFtiXS5uYW1lfHxTdHJpbmcoYik7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCgwKTt0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVttXT1ifX19ZWxzZSBiPWIubW9ycGhUYXJnZXRzLHZvaWQgMCE9PWImJjA8Yi5sZW5ndGgmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1lc2gudXBkYXRlTW9ycGhUYXJnZXRzKCkgbm8gbG9uZ2VyIHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKX0scmF5Y2FzdDpmdW5jdGlvbihiLGUpe3ZhciBoPXRoaXMuZ2VvbWV0cnksCm09dGhpcy5tYXRlcmlhbCx1PXRoaXMubWF0cml4V29ybGQ7aWYodm9pZCAwIT09bSYmKG51bGw9PT1oLmJvdW5kaW5nU3BoZXJlJiZoLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLGtsLmNvcHkoaC5ib3VuZGluZ1NwaGVyZSksa2wuYXBwbHlNYXRyaXg0KHUpLCExIT09Yi5yYXkuaW50ZXJzZWN0c1NwaGVyZShrbCkmJihzby5nZXRJbnZlcnNlKHUpLGZmLmNvcHkoYi5yYXkpLmFwcGx5TWF0cml4NChzbyksbnVsbD09PWguYm91bmRpbmdCb3h8fCExIT09ZmYuaW50ZXJzZWN0c0JveChoLmJvdW5kaW5nQm94KSkpKWlmKGguaXNCdWZmZXJHZW9tZXRyeSl7dmFyIHc9aC5pbmRleDt1PWguYXR0cmlidXRlcy5wb3NpdGlvbjt2YXIgQT1oLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixFPWguYXR0cmlidXRlcy51dixHPWguYXR0cmlidXRlcy51djIsSj1oLmdyb3VwcyxRPWguZHJhd1JhbmdlLFMsVDtpZihudWxsIT09dylpZihBcnJheS5pc0FycmF5KG0pKXt2YXIgVz0wO2ZvcihTPUoubGVuZ3RoO1c8ClM7VysrKXt2YXIgWD1KW1ddO3ZhciBpYT1tW1gubWF0ZXJpYWxJbmRleF07dmFyIGhhPU1hdGgubWF4KFguc3RhcnQsUS5zdGFydCk7Zm9yKFQ9aD1NYXRoLm1pbihYLnN0YXJ0K1guY291bnQsUS5zdGFydCtRLmNvdW50KTtoYTxUO2hhKz0zKXtoPXcuZ2V0WChoYSk7dmFyIHNhPXcuZ2V0WChoYSsxKTt2YXIgcWE9dy5nZXRYKGhhKzIpO2lmKGg9R2EodGhpcyxpYSxiLGZmLHUsQSxFLEcsaCxzYSxxYSkpaC5mYWNlSW5kZXg9TWF0aC5mbG9vcihoYS8zKSxoLmZhY2UubWF0ZXJpYWxJbmRleD1YLm1hdGVyaWFsSW5kZXgsZS5wdXNoKGgpfX19ZWxzZSBmb3IoaGE9TWF0aC5tYXgoMCxRLnN0YXJ0KSxoPU1hdGgubWluKHcuY291bnQsUS5zdGFydCtRLmNvdW50KSxXPWhhLFM9aDtXPFM7Vys9Myl7aWYoaD13LmdldFgoVyksc2E9dy5nZXRYKFcrMSkscWE9dy5nZXRYKFcrMiksaD1HYSh0aGlzLG0sYixmZix1LEEsRSxHLGgsc2EscWEpKWguZmFjZUluZGV4PU1hdGguZmxvb3IoVy8zKSwKZS5wdXNoKGgpfWVsc2UgaWYodm9pZCAwIT09dSlpZihBcnJheS5pc0FycmF5KG0pKWZvcihXPTAsUz1KLmxlbmd0aDtXPFM7VysrKWZvcihYPUpbV10saWE9bVtYLm1hdGVyaWFsSW5kZXhdLGhhPU1hdGgubWF4KFguc3RhcnQsUS5zdGFydCksVD1oPU1hdGgubWluKFguc3RhcnQrWC5jb3VudCxRLnN0YXJ0K1EuY291bnQpO2hhPFQ7aGErPTMpe2lmKGg9aGEsc2E9aGErMSxxYT1oYSsyLGg9R2EodGhpcyxpYSxiLGZmLHUsQSxFLEcsaCxzYSxxYSkpaC5mYWNlSW5kZXg9TWF0aC5mbG9vcihoYS8zKSxoLmZhY2UubWF0ZXJpYWxJbmRleD1YLm1hdGVyaWFsSW5kZXgsZS5wdXNoKGgpfWVsc2UgZm9yKGhhPU1hdGgubWF4KDAsUS5zdGFydCksaD1NYXRoLm1pbih1LmNvdW50LFEuc3RhcnQrUS5jb3VudCksVz1oYSxTPWg7VzxTO1crPTMpaWYoaD1XLHNhPVcrMSxxYT1XKzIsaD1HYSh0aGlzLG0sYixmZix1LEEsRSxHLGgsc2EscWEpKWguZmFjZUluZGV4PU1hdGguZmxvb3IoVy8zKSxlLnB1c2goaCl9ZWxzZSBpZihoLmlzR2VvbWV0cnkpZm9yKHU9CkFycmF5LmlzQXJyYXkobSksQT1oLnZlcnRpY2VzLEU9aC5mYWNlcyxoPWguZmFjZVZlcnRleFV2c1swXSwwPGgubGVuZ3RoJiYodz1oKSxXPTAsUz1FLmxlbmd0aDtXPFM7VysrKWlmKFg9RVtXXSxoPXU/bVtYLm1hdGVyaWFsSW5kZXhdOm0sdm9pZCAwIT09aCYmKEc9QVtYLmFdLEo9QVtYLmJdLFE9QVtYLmNdLGg9QmEodGhpcyxoLGIsZmYsRyxKLFEsWWcpKSl3JiZ3W1ddJiYoaWE9d1tXXSx6Zi5jb3B5KGlhWzBdKSxBZi5jb3B5KGlhWzFdKSxCZi5jb3B5KGlhWzJdKSxoLnV2PUIuZ2V0VVYoWWcsRyxKLFEsemYsQWYsQmYsbmV3IGQpKSxoLmZhY2U9WCxoLmZhY2VJbmRleD1XLGUucHVzaChoKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5nZW9tZXRyeSx0aGlzLm1hdGVyaWFsKSkuY29weSh0aGlzKX19KTt2YXIgTnE9MCxHZD1uZXcgcixsbD1uZXcgeSxsaj1uZXcgZzt6YS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGMucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOnphLGlzR2VvbWV0cnk6ITAsYXBwbHlNYXRyaXg6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPShuZXcgbCkuZ2V0Tm9ybWFsTWF0cml4KGIpLGg9MCxtPXRoaXMudmVydGljZXMubGVuZ3RoO2g8bTtoKyspdGhpcy52ZXJ0aWNlc1toXS5hcHBseU1hdHJpeDQoYik7aD0wO2ZvcihtPXRoaXMuZmFjZXMubGVuZ3RoO2g8bTtoKyspe2I9dGhpcy5mYWNlc1toXTtiLm5vcm1hbC5hcHBseU1hdHJpeDMoZSkubm9ybWFsaXplKCk7Zm9yKHZhciB1PTAsdz1iLnZlcnRleE5vcm1hbHMubGVuZ3RoO3U8dzt1KyspYi52ZXJ0ZXhOb3JtYWxzW3VdLmFwcGx5TWF0cml4MyhlKS5ub3JtYWxpemUoKX1udWxsIT09dGhpcy5ib3VuZGluZ0JveCYmdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtudWxsIT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTt0aGlzLm5vcm1hbHNOZWVkVXBkYXRlPXRoaXMudmVydGljZXNOZWVkVXBkYXRlPSEwO3JldHVybiB0aGlzfSwKcm90YXRlWDpmdW5jdGlvbihiKXtHZC5tYWtlUm90YXRpb25YKGIpO3RoaXMuYXBwbHlNYXRyaXgoR2QpO3JldHVybiB0aGlzfSxyb3RhdGVZOmZ1bmN0aW9uKGIpe0dkLm1ha2VSb3RhdGlvblkoYik7dGhpcy5hcHBseU1hdHJpeChHZCk7cmV0dXJuIHRoaXN9LHJvdGF0ZVo6ZnVuY3Rpb24oYil7R2QubWFrZVJvdGF0aW9uWihiKTt0aGlzLmFwcGx5TWF0cml4KEdkKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGIsZSxoKXtHZC5tYWtlVHJhbnNsYXRpb24oYixlLGgpO3RoaXMuYXBwbHlNYXRyaXgoR2QpO3JldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihiLGUsaCl7R2QubWFrZVNjYWxlKGIsZSxoKTt0aGlzLmFwcGx5TWF0cml4KEdkKTtyZXR1cm4gdGhpc30sbG9va0F0OmZ1bmN0aW9uKGIpe2xsLmxvb2tBdChiKTtsbC51cGRhdGVNYXRyaXgoKTt0aGlzLmFwcGx5TWF0cml4KGxsLm1hdHJpeCk7cmV0dXJuIHRoaXN9LGZyb21CdWZmZXJHZW9tZXRyeTpmdW5jdGlvbihiKXtmdW5jdGlvbiBlKFcsClgsaWEsaGEpe3ZhciBzYT12b2lkIDA9PT1FP1tdOltoLmNvbG9yc1tXXS5jbG9uZSgpLGguY29sb3JzW1hdLmNsb25lKCksaC5jb2xvcnNbaWFdLmNsb25lKCldLHFhPXZvaWQgMD09PUE/W106WyhuZXcgZykuZnJvbUFycmF5KEEsMypXKSwobmV3IGcpLmZyb21BcnJheShBLDMqWCksKG5ldyBnKS5mcm9tQXJyYXkoQSwzKmlhKV07aGE9bmV3IEsoVyxYLGlhLHFhLHNhLGhhKTtoLmZhY2VzLnB1c2goaGEpO3ZvaWQgMCE9PUcmJmguZmFjZVZlcnRleFV2c1swXS5wdXNoKFsobmV3IGQpLmZyb21BcnJheShHLDIqVyksKG5ldyBkKS5mcm9tQXJyYXkoRywyKlgpLChuZXcgZCkuZnJvbUFycmF5KEcsMippYSldKTt2b2lkIDAhPT1KJiZoLmZhY2VWZXJ0ZXhVdnNbMV0ucHVzaChbKG5ldyBkKS5mcm9tQXJyYXkoSiwyKlcpLChuZXcgZCkuZnJvbUFycmF5KEosMipYKSwobmV3IGQpLmZyb21BcnJheShKLDIqaWEpXSl9dmFyIGg9dGhpcyxtPW51bGwhPT1iLmluZGV4P2IuaW5kZXguYXJyYXk6CnZvaWQgMCx1PWIuYXR0cmlidXRlcyx3PXUucG9zaXRpb24uYXJyYXksQT12b2lkIDAhPT11Lm5vcm1hbD91Lm5vcm1hbC5hcnJheTp2b2lkIDAsRT12b2lkIDAhPT11LmNvbG9yP3UuY29sb3IuYXJyYXk6dm9pZCAwLEc9dm9pZCAwIT09dS51dj91LnV2LmFycmF5OnZvaWQgMCxKPXZvaWQgMCE9PXUudXYyP3UudXYyLmFycmF5OnZvaWQgMDt2b2lkIDAhPT1KJiYodGhpcy5mYWNlVmVydGV4VXZzWzFdPVtdKTtmb3IodT0wO3U8dy5sZW5ndGg7dSs9MyloLnZlcnRpY2VzLnB1c2goKG5ldyBnKS5mcm9tQXJyYXkodyx1KSksdm9pZCAwIT09RSYmaC5jb2xvcnMucHVzaCgobmV3IEkpLmZyb21BcnJheShFLHUpKTt2YXIgUT1iLmdyb3VwcztpZigwPFEubGVuZ3RoKWZvcih1PTA7dTxRLmxlbmd0aDt1Kyspe3c9UVt1XTt2YXIgUz13LnN0YXJ0LFQ9Uztmb3IoUys9dy5jb3VudDtUPFM7VCs9Myl2b2lkIDAhPT1tP2UobVtUXSxtW1QrMV0sbVtUKzJdLHcubWF0ZXJpYWxJbmRleCk6ZShULApUKzEsVCsyLHcubWF0ZXJpYWxJbmRleCl9ZWxzZSBpZih2b2lkIDAhPT1tKWZvcih1PTA7dTxtLmxlbmd0aDt1Kz0zKWUobVt1XSxtW3UrMV0sbVt1KzJdKTtlbHNlIGZvcih1PTA7dTx3Lmxlbmd0aC8zO3UrPTMpZSh1LHUrMSx1KzIpO3RoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCk7bnVsbCE9PWIuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PWIuYm91bmRpbmdCb3guY2xvbmUoKSk7bnVsbCE9PWIuYm91bmRpbmdTcGhlcmUmJih0aGlzLmJvdW5kaW5nU3BoZXJlPWIuYm91bmRpbmdTcGhlcmUuY2xvbmUoKSk7cmV0dXJuIHRoaXN9LGNlbnRlcjpmdW5jdGlvbigpe3RoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7dGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIobGopLm5lZ2F0ZSgpO3RoaXMudHJhbnNsYXRlKGxqLngsbGoueSxsai56KTtyZXR1cm4gdGhpc30sbm9ybWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTt2YXIgYj10aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlciwKZT10aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cztlPTA9PT1lPzE6MS9lO3ZhciBoPW5ldyByO2guc2V0KGUsMCwwLC1lKmIueCwwLGUsMCwtZSpiLnksMCwwLGUsLWUqYi56LDAsMCwwLDEpO3RoaXMuYXBwbHlNYXRyaXgoaCk7cmV0dXJuIHRoaXN9LGNvbXB1dGVGYWNlTm9ybWFsczpmdW5jdGlvbigpe2Zvcih2YXIgYj1uZXcgZyxlPW5ldyBnLGg9MCxtPXRoaXMuZmFjZXMubGVuZ3RoO2g8bTtoKyspe3ZhciB1PXRoaXMuZmFjZXNbaF0sdz10aGlzLnZlcnRpY2VzW3UuYV0sQT10aGlzLnZlcnRpY2VzW3UuYl07Yi5zdWJWZWN0b3JzKHRoaXMudmVydGljZXNbdS5jXSxBKTtlLnN1YlZlY3RvcnModyxBKTtiLmNyb3NzKGUpO2Iubm9ybWFsaXplKCk7dS5ub3JtYWwuY29weShiKX19LGNvbXB1dGVWZXJ0ZXhOb3JtYWxzOmZ1bmN0aW9uKGIpe3ZvaWQgMD09PWImJihiPSEwKTt2YXIgZTt2YXIgaD1BcnJheSh0aGlzLnZlcnRpY2VzLmxlbmd0aCk7dmFyIG09MDtmb3IoZT10aGlzLnZlcnRpY2VzLmxlbmd0aDttPAplO20rKyloW21dPW5ldyBnO2lmKGIpe3ZhciB1PW5ldyBnLHc9bmV3IGc7Yj0wO2ZvcihtPXRoaXMuZmFjZXMubGVuZ3RoO2I8bTtiKyspe2U9dGhpcy5mYWNlc1tiXTt2YXIgQT10aGlzLnZlcnRpY2VzW2UuYV07dmFyIEU9dGhpcy52ZXJ0aWNlc1tlLmJdO3ZhciBHPXRoaXMudmVydGljZXNbZS5jXTt1LnN1YlZlY3RvcnMoRyxFKTt3LnN1YlZlY3RvcnMoQSxFKTt1LmNyb3NzKHcpO2hbZS5hXS5hZGQodSk7aFtlLmJdLmFkZCh1KTtoW2UuY10uYWRkKHUpfX1lbHNlIGZvcih0aGlzLmNvbXB1dGVGYWNlTm9ybWFscygpLGI9MCxtPXRoaXMuZmFjZXMubGVuZ3RoO2I8bTtiKyspZT10aGlzLmZhY2VzW2JdLGhbZS5hXS5hZGQoZS5ub3JtYWwpLGhbZS5iXS5hZGQoZS5ub3JtYWwpLGhbZS5jXS5hZGQoZS5ub3JtYWwpO209MDtmb3IoZT10aGlzLnZlcnRpY2VzLmxlbmd0aDttPGU7bSsrKWhbbV0ubm9ybWFsaXplKCk7Yj0wO2ZvcihtPXRoaXMuZmFjZXMubGVuZ3RoO2I8bTtiKyspZT0KdGhpcy5mYWNlc1tiXSxBPWUudmVydGV4Tm9ybWFscywzPT09QS5sZW5ndGg/KEFbMF0uY29weShoW2UuYV0pLEFbMV0uY29weShoW2UuYl0pLEFbMl0uY29weShoW2UuY10pKTooQVswXT1oW2UuYV0uY2xvbmUoKSxBWzFdPWhbZS5iXS5jbG9uZSgpLEFbMl09aFtlLmNdLmNsb25lKCkpOzA8dGhpcy5mYWNlcy5sZW5ndGgmJih0aGlzLm5vcm1hbHNOZWVkVXBkYXRlPSEwKX0sY29tcHV0ZUZsYXRWZXJ0ZXhOb3JtYWxzOmZ1bmN0aW9uKCl7dmFyIGI7dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTt2YXIgZT0wO2ZvcihiPXRoaXMuZmFjZXMubGVuZ3RoO2U8YjtlKyspe3ZhciBoPXRoaXMuZmFjZXNbZV07dmFyIG09aC52ZXJ0ZXhOb3JtYWxzOzM9PT1tLmxlbmd0aD8obVswXS5jb3B5KGgubm9ybWFsKSxtWzFdLmNvcHkoaC5ub3JtYWwpLG1bMl0uY29weShoLm5vcm1hbCkpOihtWzBdPWgubm9ybWFsLmNsb25lKCksbVsxXT1oLm5vcm1hbC5jbG9uZSgpLG1bMl09aC5ub3JtYWwuY2xvbmUoKSl9MDwKdGhpcy5mYWNlcy5sZW5ndGgmJih0aGlzLm5vcm1hbHNOZWVkVXBkYXRlPSEwKX0sY29tcHV0ZU1vcnBoTm9ybWFsczpmdW5jdGlvbigpe3ZhciBiLGU7dmFyIGg9MDtmb3IoZT10aGlzLmZhY2VzLmxlbmd0aDtoPGU7aCsrKXt2YXIgbT10aGlzLmZhY2VzW2hdO20uX19vcmlnaW5hbEZhY2VOb3JtYWw/bS5fX29yaWdpbmFsRmFjZU5vcm1hbC5jb3B5KG0ubm9ybWFsKTptLl9fb3JpZ2luYWxGYWNlTm9ybWFsPW0ubm9ybWFsLmNsb25lKCk7bS5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc3x8KG0uX19vcmlnaW5hbFZlcnRleE5vcm1hbHM9W10pO3ZhciB1PTA7Zm9yKGI9bS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDt1PGI7dSsrKW0uX19vcmlnaW5hbFZlcnRleE5vcm1hbHNbdV0/bS5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1t1XS5jb3B5KG0udmVydGV4Tm9ybWFsc1t1XSk6bS5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1t1XT1tLnZlcnRleE5vcm1hbHNbdV0uY2xvbmUoKX12YXIgdz1uZXcgemE7CncuZmFjZXM9dGhpcy5mYWNlczt1PTA7Zm9yKGI9dGhpcy5tb3JwaFRhcmdldHMubGVuZ3RoO3U8Yjt1Kyspe2lmKCF0aGlzLm1vcnBoTm9ybWFsc1t1XSl7dGhpcy5tb3JwaE5vcm1hbHNbdV09e307dGhpcy5tb3JwaE5vcm1hbHNbdV0uZmFjZU5vcm1hbHM9W107dGhpcy5tb3JwaE5vcm1hbHNbdV0udmVydGV4Tm9ybWFscz1bXTttPXRoaXMubW9ycGhOb3JtYWxzW3VdLmZhY2VOb3JtYWxzO3ZhciBBPXRoaXMubW9ycGhOb3JtYWxzW3VdLnZlcnRleE5vcm1hbHM7aD0wO2ZvcihlPXRoaXMuZmFjZXMubGVuZ3RoO2g8ZTtoKyspe3ZhciBFPW5ldyBnO3ZhciBHPXthOm5ldyBnLGI6bmV3IGcsYzpuZXcgZ307bS5wdXNoKEUpO0EucHVzaChHKX19QT10aGlzLm1vcnBoTm9ybWFsc1t1XTt3LnZlcnRpY2VzPXRoaXMubW9ycGhUYXJnZXRzW3VdLnZlcnRpY2VzO3cuY29tcHV0ZUZhY2VOb3JtYWxzKCk7dy5jb21wdXRlVmVydGV4Tm9ybWFscygpO2g9MDtmb3IoZT10aGlzLmZhY2VzLmxlbmd0aDtoPAplO2grKyltPXRoaXMuZmFjZXNbaF0sRT1BLmZhY2VOb3JtYWxzW2hdLEc9QS52ZXJ0ZXhOb3JtYWxzW2hdLEUuY29weShtLm5vcm1hbCksRy5hLmNvcHkobS52ZXJ0ZXhOb3JtYWxzWzBdKSxHLmIuY29weShtLnZlcnRleE5vcm1hbHNbMV0pLEcuYy5jb3B5KG0udmVydGV4Tm9ybWFsc1syXSl9aD0wO2ZvcihlPXRoaXMuZmFjZXMubGVuZ3RoO2g8ZTtoKyspbT10aGlzLmZhY2VzW2hdLG0ubm9ybWFsPW0uX19vcmlnaW5hbEZhY2VOb3JtYWwsbS52ZXJ0ZXhOb3JtYWxzPW0uX19vcmlnaW5hbFZlcnRleE5vcm1hbHN9LGNvbXB1dGVCb3VuZGluZ0JveDpmdW5jdGlvbigpe251bGw9PT10aGlzLmJvdW5kaW5nQm94JiYodGhpcy5ib3VuZGluZ0JveD1uZXcgeCk7dGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tUG9pbnRzKHRoaXMudmVydGljZXMpfSxjb21wdXRlQm91bmRpbmdTcGhlcmU6ZnVuY3Rpb24oKXtudWxsPT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9Cm5ldyBGKTt0aGlzLmJvdW5kaW5nU3BoZXJlLnNldEZyb21Qb2ludHModGhpcy52ZXJ0aWNlcyl9LG1lcmdlOmZ1bmN0aW9uKGIsZSxoKXtpZihiJiZiLmlzR2VvbWV0cnkpe3ZhciBtLHU9dGhpcy52ZXJ0aWNlcy5sZW5ndGgsdz10aGlzLnZlcnRpY2VzLEE9Yi52ZXJ0aWNlcyxFPXRoaXMuZmFjZXMsRz1iLmZhY2VzLEo9dGhpcy5jb2xvcnMsUT1iLmNvbG9yczt2b2lkIDA9PT1oJiYoaD0wKTt2b2lkIDAhPT1lJiYobT0obmV3IGwpLmdldE5vcm1hbE1hdHJpeChlKSk7Zm9yKHZhciBTPTAsVD1BLmxlbmd0aDtTPFQ7UysrKXt2YXIgVz1BW1NdLmNsb25lKCk7dm9pZCAwIT09ZSYmVy5hcHBseU1hdHJpeDQoZSk7dy5wdXNoKFcpfVM9MDtmb3IoVD1RLmxlbmd0aDtTPFQ7UysrKUoucHVzaChRW1NdLmNsb25lKCkpO1M9MDtmb3IoVD1HLmxlbmd0aDtTPFQ7UysrKXtBPUdbU107dmFyIFg9QS52ZXJ0ZXhOb3JtYWxzO1E9QS52ZXJ0ZXhDb2xvcnM7Sj1uZXcgSyhBLmErdSxBLmIrdSxBLmMrCnUpO0oubm9ybWFsLmNvcHkoQS5ub3JtYWwpO3ZvaWQgMCE9PW0mJkoubm9ybWFsLmFwcGx5TWF0cml4MyhtKS5ub3JtYWxpemUoKTtlPTA7Zm9yKHc9WC5sZW5ndGg7ZTx3O2UrKylXPVhbZV0uY2xvbmUoKSx2b2lkIDAhPT1tJiZXLmFwcGx5TWF0cml4MyhtKS5ub3JtYWxpemUoKSxKLnZlcnRleE5vcm1hbHMucHVzaChXKTtKLmNvbG9yLmNvcHkoQS5jb2xvcik7ZT0wO2Zvcih3PVEubGVuZ3RoO2U8dztlKyspVz1RW2VdLEoudmVydGV4Q29sb3JzLnB1c2goVy5jbG9uZSgpKTtKLm1hdGVyaWFsSW5kZXg9QS5tYXRlcmlhbEluZGV4K2g7RS5wdXNoKEopfVM9MDtmb3IoVD1iLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoO1M8VDtTKyspZm9yKGg9Yi5mYWNlVmVydGV4VXZzW1NdLHZvaWQgMD09PXRoaXMuZmFjZVZlcnRleFV2c1tTXSYmKHRoaXMuZmFjZVZlcnRleFV2c1tTXT1bXSksZT0wLHc9aC5sZW5ndGg7ZTx3O2UrKyl7bT1oW2VdO3U9W107RT0wO2ZvcihHPW0ubGVuZ3RoO0U8RztFKyspdS5wdXNoKG1bRV0uY2xvbmUoKSk7CnRoaXMuZmFjZVZlcnRleFV2c1tTXS5wdXNoKHUpfX1lbHNlIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkdlb21ldHJ5Lm1lcmdlKCk6IGdlb21ldHJ5IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5HZW9tZXRyeS4iLGIpfSxtZXJnZU1lc2g6ZnVuY3Rpb24oYil7YiYmYi5pc01lc2g/KGIubWF0cml4QXV0b1VwZGF0ZSYmYi51cGRhdGVNYXRyaXgoKSx0aGlzLm1lcmdlKGIuZ2VvbWV0cnksYi5tYXRyaXgpKTpjb25zb2xlLmVycm9yKCJUSFJFRS5HZW9tZXRyeS5tZXJnZU1lc2goKTogbWVzaCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuTWVzaC4iLGIpfSxtZXJnZVZlcnRpY2VzOmZ1bmN0aW9uKCl7dmFyIGI9e30sZT1bXSxoPVtdLG09TWF0aC5wb3coMTAsNCksdTt2YXIgdz0wO2Zvcih1PXRoaXMudmVydGljZXMubGVuZ3RoO3c8dTt3Kyspe3ZhciBBPXRoaXMudmVydGljZXNbd107QT1NYXRoLnJvdW5kKEEueCptKSsiXyIrTWF0aC5yb3VuZChBLnkqbSkrIl8iK01hdGgucm91bmQoQS56KgptKTt2b2lkIDA9PT1iW0FdPyhiW0FdPXcsZS5wdXNoKHRoaXMudmVydGljZXNbd10pLGhbd109ZS5sZW5ndGgtMSk6aFt3XT1oW2JbQV1dfWI9W107dz0wO2Zvcih1PXRoaXMuZmFjZXMubGVuZ3RoO3c8dTt3KyspZm9yKG09dGhpcy5mYWNlc1t3XSxtLmE9aFttLmFdLG0uYj1oW20uYl0sbS5jPWhbbS5jXSxtPVttLmEsbS5iLG0uY10sQT0wOzM+QTtBKyspaWYobVtBXT09PW1bKEErMSklM10pe2IucHVzaCh3KTticmVha31mb3Iodz1iLmxlbmd0aC0xOzA8PXc7dy0tKWZvcihtPWJbd10sdGhpcy5mYWNlcy5zcGxpY2UobSwxKSxoPTAsdT10aGlzLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoO2g8dTtoKyspdGhpcy5mYWNlVmVydGV4VXZzW2hdLnNwbGljZShtLDEpO3c9dGhpcy52ZXJ0aWNlcy5sZW5ndGgtZS5sZW5ndGg7dGhpcy52ZXJ0aWNlcz1lO3JldHVybiB3fSxzZXRGcm9tUG9pbnRzOmZ1bmN0aW9uKGIpe3RoaXMudmVydGljZXM9W107Zm9yKHZhciBlPTAsaD1iLmxlbmd0aDtlPGg7ZSsrKXt2YXIgbT0KYltlXTt0aGlzLnZlcnRpY2VzLnB1c2gobmV3IGcobS54LG0ueSxtLnp8fDApKX1yZXR1cm4gdGhpc30sc29ydEZhY2VzQnlNYXRlcmlhbEluZGV4OmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuZmFjZXMsZT1iLmxlbmd0aCxoPTA7aDxlO2grKyliW2hdLl9pZD1oO2Iuc29ydChmdW5jdGlvbihHLEope3JldHVybiBHLm1hdGVyaWFsSW5kZXgtSi5tYXRlcmlhbEluZGV4fSk7dmFyIG09dGhpcy5mYWNlVmVydGV4VXZzWzBdLHU9dGhpcy5mYWNlVmVydGV4VXZzWzFdLHcsQTttJiZtLmxlbmd0aD09PWUmJih3PVtdKTt1JiZ1Lmxlbmd0aD09PWUmJihBPVtdKTtmb3IoaD0wO2g8ZTtoKyspe3ZhciBFPWJbaF0uX2lkO3cmJncucHVzaChtW0VdKTtBJiZBLnB1c2godVtFXSl9dyYmKHRoaXMuZmFjZVZlcnRleFV2c1swXT13KTtBJiYodGhpcy5mYWNlVmVydGV4VXZzWzFdPUEpfSx0b0pTT046ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKHBhLHZhLENhKXtyZXR1cm4gQ2E/cGF8MTw8dmE6cGEmCn4oMTw8dmEpfWZ1bmN0aW9uIGUocGEpe3ZhciB2YT1wYS54LnRvU3RyaW5nKCkrcGEueS50b1N0cmluZygpK3BhLnoudG9TdHJpbmcoKTtpZih2b2lkIDAhPT1KW3ZhXSlyZXR1cm4gSlt2YV07Slt2YV09Ry5sZW5ndGgvMztHLnB1c2gocGEueCxwYS55LHBhLnopO3JldHVybiBKW3ZhXX1mdW5jdGlvbiBoKHBhKXt2YXIgdmE9cGEuci50b1N0cmluZygpK3BhLmcudG9TdHJpbmcoKStwYS5iLnRvU3RyaW5nKCk7aWYodm9pZCAwIT09U1t2YV0pcmV0dXJuIFNbdmFdO1NbdmFdPVEubGVuZ3RoO1EucHVzaChwYS5nZXRIZXgoKSk7cmV0dXJuIFNbdmFdfWZ1bmN0aW9uIG0ocGEpe3ZhciB2YT1wYS54LnRvU3RyaW5nKCkrcGEueS50b1N0cmluZygpO2lmKHZvaWQgMCE9PVdbdmFdKXJldHVybiBXW3ZhXTtXW3ZhXT1ULmxlbmd0aC8yO1QucHVzaChwYS54LHBhLnkpO3JldHVybiBXW3ZhXX12YXIgdT17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6Ikdlb21ldHJ5IixnZW5lcmF0b3I6Ikdlb21ldHJ5LnRvSlNPTiJ9fTsKdS51dWlkPXRoaXMudXVpZDt1LnR5cGU9dGhpcy50eXBlOyIiIT09dGhpcy5uYW1lJiYodS5uYW1lPXRoaXMubmFtZSk7aWYodm9pZCAwIT09dGhpcy5wYXJhbWV0ZXJzKXt2YXIgdz10aGlzLnBhcmFtZXRlcnMsQTtmb3IoQSBpbiB3KXZvaWQgMCE9PXdbQV0mJih1W0FdPXdbQV0pO3JldHVybiB1fXc9W107Zm9yKEE9MDtBPHRoaXMudmVydGljZXMubGVuZ3RoO0ErKyl7dmFyIEU9dGhpcy52ZXJ0aWNlc1tBXTt3LnB1c2goRS54LEUueSxFLnopfUU9W107dmFyIEc9W10sSj17fSxRPVtdLFM9e30sVD1bXSxXPXt9O2ZvcihBPTA7QTx0aGlzLmZhY2VzLmxlbmd0aDtBKyspe3ZhciBYPXRoaXMuZmFjZXNbQV0saWE9dm9pZCAwIT09dGhpcy5mYWNlVmVydGV4VXZzWzBdW0FdLGhhPTA8WC5ub3JtYWwubGVuZ3RoKCksc2E9MDxYLnZlcnRleE5vcm1hbHMubGVuZ3RoLHFhPTEhPT1YLmNvbG9yLnJ8fDEhPT1YLmNvbG9yLmd8fDEhPT1YLmNvbG9yLmIscmE9MDxYLnZlcnRleENvbG9ycy5sZW5ndGgsCndhPTA7d2E9Yih3YSwwLDApO3dhPWIod2EsMSwhMCk7d2E9Yih3YSwyLCExKTt3YT1iKHdhLDMsaWEpO3dhPWIod2EsNCxoYSk7d2E9Yih3YSw1LHNhKTt3YT1iKHdhLDYscWEpO3dhPWIod2EsNyxyYSk7RS5wdXNoKHdhKTtFLnB1c2goWC5hLFguYixYLmMpO0UucHVzaChYLm1hdGVyaWFsSW5kZXgpO2lhJiYoaWE9dGhpcy5mYWNlVmVydGV4VXZzWzBdW0FdLEUucHVzaChtKGlhWzBdKSxtKGlhWzFdKSxtKGlhWzJdKSkpO2hhJiZFLnB1c2goZShYLm5vcm1hbCkpO3NhJiYoaGE9WC52ZXJ0ZXhOb3JtYWxzLEUucHVzaChlKGhhWzBdKSxlKGhhWzFdKSxlKGhhWzJdKSkpO3FhJiZFLnB1c2goaChYLmNvbG9yKSk7cmEmJihYPVgudmVydGV4Q29sb3JzLEUucHVzaChoKFhbMF0pLGgoWFsxXSksaChYWzJdKSkpfXUuZGF0YT17fTt1LmRhdGEudmVydGljZXM9dzt1LmRhdGEubm9ybWFscz1HOzA8US5sZW5ndGgmJih1LmRhdGEuY29sb3JzPVEpOzA8VC5sZW5ndGgmJih1LmRhdGEudXZzPQpbVF0pO3UuZGF0YS5mYWNlcz1FO3JldHVybiB1fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgemEpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7dmFyIGUsaCxtO3RoaXMudmVydGljZXM9W107dGhpcy5jb2xvcnM9W107dGhpcy5mYWNlcz1bXTt0aGlzLmZhY2VWZXJ0ZXhVdnM9W1tdXTt0aGlzLm1vcnBoVGFyZ2V0cz1bXTt0aGlzLm1vcnBoTm9ybWFscz1bXTt0aGlzLnNraW5XZWlnaHRzPVtdO3RoaXMuc2tpbkluZGljZXM9W107dGhpcy5saW5lRGlzdGFuY2VzPVtdO3RoaXMuYm91bmRpbmdTcGhlcmU9dGhpcy5ib3VuZGluZ0JveD1udWxsO3RoaXMubmFtZT1iLm5hbWU7dmFyIHU9Yi52ZXJ0aWNlczt2YXIgdz0wO2ZvcihlPXUubGVuZ3RoO3c8ZTt3KyspdGhpcy52ZXJ0aWNlcy5wdXNoKHVbd10uY2xvbmUoKSk7dT1iLmNvbG9yczt3PTA7Zm9yKGU9dS5sZW5ndGg7dzxlO3crKyl0aGlzLmNvbG9ycy5wdXNoKHVbd10uY2xvbmUoKSk7dT1iLmZhY2VzO3c9MDtmb3IoZT0KdS5sZW5ndGg7dzxlO3crKyl0aGlzLmZhY2VzLnB1c2godVt3XS5jbG9uZSgpKTt3PTA7Zm9yKGU9Yi5mYWNlVmVydGV4VXZzLmxlbmd0aDt3PGU7dysrKXt2YXIgQT1iLmZhY2VWZXJ0ZXhVdnNbd107dm9pZCAwPT09dGhpcy5mYWNlVmVydGV4VXZzW3ddJiYodGhpcy5mYWNlVmVydGV4VXZzW3ddPVtdKTt1PTA7Zm9yKGg9QS5sZW5ndGg7dTxoO3UrKyl7dmFyIEU9QVt1XSxHPVtdO3ZhciBKPTA7Zm9yKG09RS5sZW5ndGg7SjxtO0orKylHLnB1c2goRVtKXS5jbG9uZSgpKTt0aGlzLmZhY2VWZXJ0ZXhVdnNbd10ucHVzaChHKX19Sj1iLm1vcnBoVGFyZ2V0czt3PTA7Zm9yKGU9Si5sZW5ndGg7dzxlO3crKyl7bT17fTttLm5hbWU9Slt3XS5uYW1lO2lmKHZvaWQgMCE9PUpbd10udmVydGljZXMpZm9yKG0udmVydGljZXM9W10sdT0wLGg9Slt3XS52ZXJ0aWNlcy5sZW5ndGg7dTxoO3UrKyltLnZlcnRpY2VzLnB1c2goSlt3XS52ZXJ0aWNlc1t1XS5jbG9uZSgpKTtpZih2b2lkIDAhPT1KW3ddLm5vcm1hbHMpZm9yKG0ubm9ybWFscz0KW10sdT0wLGg9Slt3XS5ub3JtYWxzLmxlbmd0aDt1PGg7dSsrKW0ubm9ybWFscy5wdXNoKEpbd10ubm9ybWFsc1t1XS5jbG9uZSgpKTt0aGlzLm1vcnBoVGFyZ2V0cy5wdXNoKG0pfUo9Yi5tb3JwaE5vcm1hbHM7dz0wO2ZvcihlPUoubGVuZ3RoO3c8ZTt3Kyspe209e307aWYodm9pZCAwIT09Slt3XS52ZXJ0ZXhOb3JtYWxzKWZvcihtLnZlcnRleE5vcm1hbHM9W10sdT0wLGg9Slt3XS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDt1PGg7dSsrKUE9Slt3XS52ZXJ0ZXhOb3JtYWxzW3VdLEU9e30sRS5hPUEuYS5jbG9uZSgpLEUuYj1BLmIuY2xvbmUoKSxFLmM9QS5jLmNsb25lKCksbS52ZXJ0ZXhOb3JtYWxzLnB1c2goRSk7aWYodm9pZCAwIT09Slt3XS5mYWNlTm9ybWFscylmb3IobS5mYWNlTm9ybWFscz1bXSx1PTAsaD1KW3ddLmZhY2VOb3JtYWxzLmxlbmd0aDt1PGg7dSsrKW0uZmFjZU5vcm1hbHMucHVzaChKW3ddLmZhY2VOb3JtYWxzW3VdLmNsb25lKCkpO3RoaXMubW9ycGhOb3JtYWxzLnB1c2gobSl9dT0KYi5za2luV2VpZ2h0czt3PTA7Zm9yKGU9dS5sZW5ndGg7dzxlO3crKyl0aGlzLnNraW5XZWlnaHRzLnB1c2godVt3XS5jbG9uZSgpKTt1PWIuc2tpbkluZGljZXM7dz0wO2ZvcihlPXUubGVuZ3RoO3c8ZTt3KyspdGhpcy5za2luSW5kaWNlcy5wdXNoKHVbd10uY2xvbmUoKSk7dT1iLmxpbmVEaXN0YW5jZXM7dz0wO2ZvcihlPXUubGVuZ3RoO3c8ZTt3KyspdGhpcy5saW5lRGlzdGFuY2VzLnB1c2godVt3XSk7dz1iLmJvdW5kaW5nQm94O251bGwhPT13JiYodGhpcy5ib3VuZGluZ0JveD13LmNsb25lKCkpO3c9Yi5ib3VuZGluZ1NwaGVyZTtudWxsIT09dyYmKHRoaXMuYm91bmRpbmdTcGhlcmU9dy5jbG9uZSgpKTt0aGlzLmVsZW1lbnRzTmVlZFVwZGF0ZT1iLmVsZW1lbnRzTmVlZFVwZGF0ZTt0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZT1iLnZlcnRpY2VzTmVlZFVwZGF0ZTt0aGlzLnV2c05lZWRVcGRhdGU9Yi51dnNOZWVkVXBkYXRlO3RoaXMubm9ybWFsc05lZWRVcGRhdGU9Yi5ub3JtYWxzTmVlZFVwZGF0ZTsKdGhpcy5jb2xvcnNOZWVkVXBkYXRlPWIuY29sb3JzTmVlZFVwZGF0ZTt0aGlzLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlPWIubGluZURpc3RhbmNlc05lZWRVcGRhdGU7dGhpcy5ncm91cHNOZWVkVXBkYXRlPWIuZ3JvdXBzTmVlZFVwZGF0ZTtyZXR1cm4gdGhpc30sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19KTtVYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh6YS5wcm90b3R5cGUpO1VhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1VYTtaYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO1phLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1aYTt2YXIgQnM9e2Nsb25lOnpiLG1lcmdlOklifTt1Yi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7dWIucHJvdG90eXBlLmNvbnN0cnVjdG9yPXViO3ViLnByb3RvdHlwZS5pc1NoYWRlck1hdGVyaWFsPSEwO3ViLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLApiKTt0aGlzLmZyYWdtZW50U2hhZGVyPWIuZnJhZ21lbnRTaGFkZXI7dGhpcy52ZXJ0ZXhTaGFkZXI9Yi52ZXJ0ZXhTaGFkZXI7dGhpcy51bmlmb3Jtcz16YihiLnVuaWZvcm1zKTt0aGlzLmRlZmluZXM9T2JqZWN0LmFzc2lnbih7fSxiLmRlZmluZXMpO3RoaXMud2lyZWZyYW1lPWIud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWIud2lyZWZyYW1lTGluZXdpZHRoO3RoaXMubGlnaHRzPWIubGlnaHRzO3RoaXMuY2xpcHBpbmc9Yi5jbGlwcGluZzt0aGlzLnNraW5uaW5nPWIuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9Yi5tb3JwaFRhcmdldHM7dGhpcy5tb3JwaE5vcm1hbHM9Yi5tb3JwaE5vcm1hbHM7dGhpcy5leHRlbnNpb25zPWIuZXh0ZW5zaW9ucztyZXR1cm4gdGhpc307dWIucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbihiKXt2YXIgZT1NLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGIpO2UudW5pZm9ybXM9e307Zm9yKHZhciBoIGluIHRoaXMudW5pZm9ybXMpe3ZhciBtPQp0aGlzLnVuaWZvcm1zW2hdLnZhbHVlO2UudW5pZm9ybXNbaF09bSYmbS5pc1RleHR1cmU/e3R5cGU6InQiLHZhbHVlOm0udG9KU09OKGIpLnV1aWR9Om0mJm0uaXNDb2xvcj97dHlwZToiYyIsdmFsdWU6bS5nZXRIZXgoKX06bSYmbS5pc1ZlY3RvcjI/e3R5cGU6InYyIix2YWx1ZTptLnRvQXJyYXkoKX06bSYmbS5pc1ZlY3RvcjM/e3R5cGU6InYzIix2YWx1ZTptLnRvQXJyYXkoKX06bSYmbS5pc1ZlY3RvcjQ/e3R5cGU6InY0Iix2YWx1ZTptLnRvQXJyYXkoKX06bSYmbS5pc01hdHJpeDM/e3R5cGU6Im0zIix2YWx1ZTptLnRvQXJyYXkoKX06bSYmbS5pc01hdHJpeDQ/e3R5cGU6Im00Iix2YWx1ZTptLnRvQXJyYXkoKX06e3ZhbHVlOm19fTA8T2JqZWN0LmtleXModGhpcy5kZWZpbmVzKS5sZW5ndGgmJihlLmRlZmluZXM9dGhpcy5kZWZpbmVzKTtlLnZlcnRleFNoYWRlcj10aGlzLnZlcnRleFNoYWRlcjtlLmZyYWdtZW50U2hhZGVyPXRoaXMuZnJhZ21lbnRTaGFkZXI7Yj17fTtmb3IodmFyIHUgaW4gdGhpcy5leHRlbnNpb25zKSEwPT09CnRoaXMuZXh0ZW5zaW9uc1t1XSYmKGJbdV09ITApOzA8T2JqZWN0LmtleXMoYikubGVuZ3RoJiYoZS5leHRlbnNpb25zPWIpO3JldHVybiBlfTtGYi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHkucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6RmIsaXNDYW1lcmE6ITAsY29weTpmdW5jdGlvbihiLGUpe3kucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIsZSk7dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuY29weShiLm1hdHJpeFdvcmxkSW52ZXJzZSk7dGhpcy5wcm9qZWN0aW9uTWF0cml4LmNvcHkoYi5wcm9qZWN0aW9uTWF0cml4KTt0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoYi5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSk7cmV0dXJuIHRoaXN9LGdldFdvcmxkRGlyZWN0aW9uOmZ1bmN0aW9uKGIpe3ZvaWQgMD09PWImJihjb25zb2xlLndhcm4oIlRIUkVFLkNhbWVyYTogLmdldFdvcmxkRGlyZWN0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLApiPW5ldyBnKTt0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTt2YXIgZT10aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO3JldHVybiBiLnNldCgtZVs4XSwtZVs5XSwtZVsxMF0pLm5vcm1hbGl6ZSgpfSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihiKXt5LnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYik7dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSh0aGlzLm1hdHJpeFdvcmxkKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fSk7QWIucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShGYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpBYixpc1BlcnNwZWN0aXZlQ2FtZXJhOiEwLGNvcHk6ZnVuY3Rpb24oYixlKXtGYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYixlKTt0aGlzLmZvdj1iLmZvdjt0aGlzLnpvb209Yi56b29tO3RoaXMubmVhcj1iLm5lYXI7dGhpcy5mYXI9CmIuZmFyO3RoaXMuZm9jdXM9Yi5mb2N1czt0aGlzLmFzcGVjdD1iLmFzcGVjdDt0aGlzLnZpZXc9bnVsbD09PWIudmlldz9udWxsOk9iamVjdC5hc3NpZ24oe30sYi52aWV3KTt0aGlzLmZpbG1HYXVnZT1iLmZpbG1HYXVnZTt0aGlzLmZpbG1PZmZzZXQ9Yi5maWxtT2Zmc2V0O3JldHVybiB0aGlzfSxzZXRGb2NhbExlbmd0aDpmdW5jdGlvbihiKXt0aGlzLmZvdj0yKmxiLlJBRDJERUcqTWF0aC5hdGFuKC41KnRoaXMuZ2V0RmlsbUhlaWdodCgpL2IpO3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSxnZXRGb2NhbExlbmd0aDpmdW5jdGlvbigpe3JldHVybi41KnRoaXMuZ2V0RmlsbUhlaWdodCgpL01hdGgudGFuKC41KmxiLkRFRzJSQUQqdGhpcy5mb3YpfSxnZXRFZmZlY3RpdmVGT1Y6ZnVuY3Rpb24oKXtyZXR1cm4gMipsYi5SQUQyREVHKk1hdGguYXRhbihNYXRoLnRhbiguNSpsYi5ERUcyUkFEKnRoaXMuZm92KS90aGlzLnpvb20pfSxnZXRGaWxtV2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxtR2F1Z2UqCk1hdGgubWluKHRoaXMuYXNwZWN0LDEpfSxnZXRGaWxtSGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbUdhdWdlL01hdGgubWF4KHRoaXMuYXNwZWN0LDEpfSxzZXRWaWV3T2Zmc2V0OmZ1bmN0aW9uKGIsZSxoLG0sdSx3KXt0aGlzLmFzcGVjdD1iL2U7bnVsbD09PXRoaXMudmlldyYmKHRoaXMudmlldz17ZW5hYmxlZDohMCxmdWxsV2lkdGg6MSxmdWxsSGVpZ2h0OjEsb2Zmc2V0WDowLG9mZnNldFk6MCx3aWR0aDoxLGhlaWdodDoxfSk7dGhpcy52aWV3LmVuYWJsZWQ9ITA7dGhpcy52aWV3LmZ1bGxXaWR0aD1iO3RoaXMudmlldy5mdWxsSGVpZ2h0PWU7dGhpcy52aWV3Lm9mZnNldFg9aDt0aGlzLnZpZXcub2Zmc2V0WT1tO3RoaXMudmlldy53aWR0aD11O3RoaXMudmlldy5oZWlnaHQ9dzt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX0sY2xlYXJWaWV3T2Zmc2V0OmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMudmlldyYmKHRoaXMudmlldy5lbmFibGVkPSExKTt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX0sCnVwZGF0ZVByb2plY3Rpb25NYXRyaXg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5lYXIsZT1iKk1hdGgudGFuKC41KmxiLkRFRzJSQUQqdGhpcy5mb3YpL3RoaXMuem9vbSxoPTIqZSxtPXRoaXMuYXNwZWN0KmgsdT0tLjUqbSx3PXRoaXMudmlldztpZihudWxsIT09dGhpcy52aWV3JiZ0aGlzLnZpZXcuZW5hYmxlZCl7dmFyIEE9dy5mdWxsV2lkdGgsRT13LmZ1bGxIZWlnaHQ7dSs9dy5vZmZzZXRYKm0vQTtlLT13Lm9mZnNldFkqaC9FO20qPXcud2lkdGgvQTtoKj13LmhlaWdodC9FfXc9dGhpcy5maWxtT2Zmc2V0OzAhPT13JiYodSs9Yip3L3RoaXMuZ2V0RmlsbVdpZHRoKCkpO3RoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUodSx1K20sZSxlLWgsYix0aGlzLmZhcik7dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKHRoaXMucHJvamVjdGlvbk1hdHJpeCl9LHRvSlNPTjpmdW5jdGlvbihiKXtiPXkucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsCmIpO2Iub2JqZWN0LmZvdj10aGlzLmZvdjtiLm9iamVjdC56b29tPXRoaXMuem9vbTtiLm9iamVjdC5uZWFyPXRoaXMubmVhcjtiLm9iamVjdC5mYXI9dGhpcy5mYXI7Yi5vYmplY3QuZm9jdXM9dGhpcy5mb2N1cztiLm9iamVjdC5hc3BlY3Q9dGhpcy5hc3BlY3Q7bnVsbCE9PXRoaXMudmlldyYmKGIub2JqZWN0LnZpZXc9T2JqZWN0LmFzc2lnbih7fSx0aGlzLnZpZXcpKTtiLm9iamVjdC5maWxtR2F1Z2U9dGhpcy5maWxtR2F1Z2U7Yi5vYmplY3QuZmlsbU9mZnNldD10aGlzLmZpbG1PZmZzZXQ7cmV0dXJuIGJ9fSk7UGIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeS5wcm90b3R5cGUpO1BiLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1QYjtiYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShwLnByb3RvdHlwZSk7YmMucHJvdG90eXBlLmNvbnN0cnVjdG9yPWJjO2JjLnByb3RvdHlwZS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZT0hMDtiYy5wcm90b3R5cGUuZnJvbUVxdWlyZWN0YW5ndWxhclRleHR1cmU9CmZ1bmN0aW9uKGIsZSl7dGhpcy50ZXh0dXJlLnR5cGU9ZS50eXBlO3RoaXMudGV4dHVyZS5mb3JtYXQ9ZS5mb3JtYXQ7dGhpcy50ZXh0dXJlLmVuY29kaW5nPWUuZW5jb2Rpbmc7dmFyIGg9bmV3IHosbT1uZXcgdWIoe3R5cGU6IkN1YmVtYXBGcm9tRXF1aXJlY3QiLHVuaWZvcm1zOnpiKHt0RXF1aXJlY3Q6e3ZhbHVlOm51bGx9fSksdmVydGV4U2hhZGVyOiJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xudmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcblx0cmV0dXJuIG5vcm1hbGl6ZSggKCBtYXRyaXggKiB2ZWM0KCBkaXIsIDAuMCApICkueHl6ICk7XG59XG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZERpcmVjdGlvbiBceDNkIHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcbn0iLApmcmFnbWVudFNoYWRlcjoidW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0O1xudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NjE4XG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkyIDAuMTU5MTU0OTRcbnZvaWQgbWFpbigpIHtcblx0dmVjMyBkaXJlY3Rpb24gXHgzZCBub3JtYWxpemUoIHZXb3JsZERpcmVjdGlvbiApO1xuXHR2ZWMyIHNhbXBsZVVWO1xuXHRzYW1wbGVVVi55IFx4M2QgYXNpbiggY2xhbXAoIGRpcmVjdGlvbi55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdHNhbXBsZVVWLnggXHgzZCBhdGFuKCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTtcbn0iLHNpZGU6MSxibGVuZGluZzowfSk7bS51bmlmb3Jtcy50RXF1aXJlY3QudmFsdWU9ZTsKZT1uZXcgeWEobmV3IFphKDUsNSw1KSxtKTtoLmFkZChlKTttPW5ldyBQYigxLDEwLDEpO20ucmVuZGVyVGFyZ2V0PXRoaXM7bS5yZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lPSJDdWJlQ2FtZXJhVGV4dHVyZSI7bS51cGRhdGUoYixoKTtlLmdlb21ldHJ5LmRpc3Bvc2UoKTtlLm1hdGVyaWFsLmRpc3Bvc2UoKTtyZXR1cm4gdGhpc307R2IucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoay5wcm90b3R5cGUpO0diLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1HYjtHYi5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZT0hMDt2YXIgbWw9bmV3IGcsQ3M9bmV3IGcsRHM9bmV3IGw7T2JqZWN0LmFzc2lnbihSYi5wcm90b3R5cGUse2lzUGxhbmU6ITAsc2V0OmZ1bmN0aW9uKGIsZSl7dGhpcy5ub3JtYWwuY29weShiKTt0aGlzLmNvbnN0YW50PWU7cmV0dXJuIHRoaXN9LHNldENvbXBvbmVudHM6ZnVuY3Rpb24oYixlLGgsbSl7dGhpcy5ub3JtYWwuc2V0KGIsZSxoKTt0aGlzLmNvbnN0YW50PW07cmV0dXJuIHRoaXN9LApzZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludDpmdW5jdGlvbihiLGUpe3RoaXMubm9ybWFsLmNvcHkoYik7dGhpcy5jb25zdGFudD0tZS5kb3QodGhpcy5ub3JtYWwpO3JldHVybiB0aGlzfSxzZXRGcm9tQ29wbGFuYXJQb2ludHM6ZnVuY3Rpb24oYixlLGgpe2U9bWwuc3ViVmVjdG9ycyhoLGUpLmNyb3NzKENzLnN1YlZlY3RvcnMoYixlKSkubm9ybWFsaXplKCk7dGhpcy5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludChlLGIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihiKXt0aGlzLm5vcm1hbC5jb3B5KGIubm9ybWFsKTt0aGlzLmNvbnN0YW50PWIuY29uc3RhbnQ7cmV0dXJuIHRoaXN9LG5vcm1hbGl6ZTpmdW5jdGlvbigpe3ZhciBiPTEvdGhpcy5ub3JtYWwubGVuZ3RoKCk7dGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIoYik7dGhpcy5jb25zdGFudCo9YjtyZXR1cm4gdGhpc30sCm5lZ2F0ZTpmdW5jdGlvbigpe3RoaXMuY29uc3RhbnQqPS0xO3RoaXMubm9ybWFsLm5lZ2F0ZSgpO3JldHVybiB0aGlzfSxkaXN0YW5jZVRvUG9pbnQ6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMubm9ybWFsLmRvdChiKSt0aGlzLmNvbnN0YW50fSxkaXN0YW5jZVRvU3BoZXJlOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmRpc3RhbmNlVG9Qb2ludChiLmNlbnRlciktYi5yYWRpdXN9LHByb2plY3RQb2ludDpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihjb25zb2xlLndhcm4oIlRIUkVFLlBsYW5lOiAucHJvamVjdFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGU9bmV3IGcpO3JldHVybiBlLmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmRpc3RhbmNlVG9Qb2ludChiKSkuYWRkKGIpfSxpbnRlcnNlY3RMaW5lOmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGNvbnNvbGUud2FybigiVEhSRUUuUGxhbmU6IC5pbnRlcnNlY3RMaW5lKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLAplPW5ldyBnKTt2YXIgaD1iLmRlbHRhKG1sKSxtPXRoaXMubm9ybWFsLmRvdChoKTtpZigwPT09bSl7aWYoMD09PXRoaXMuZGlzdGFuY2VUb1BvaW50KGIuc3RhcnQpKXJldHVybiBlLmNvcHkoYi5zdGFydCl9ZWxzZSBpZihtPS0oYi5zdGFydC5kb3QodGhpcy5ub3JtYWwpK3RoaXMuY29uc3RhbnQpL20sISgwPm18fDE8bSkpcmV0dXJuIGUuY29weShoKS5tdWx0aXBseVNjYWxhcihtKS5hZGQoYi5zdGFydCl9LGludGVyc2VjdHNMaW5lOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuZGlzdGFuY2VUb1BvaW50KGIuc3RhcnQpO2I9dGhpcy5kaXN0YW5jZVRvUG9pbnQoYi5lbmQpO3JldHVybiAwPmUmJjA8Ynx8MD5iJiYwPGV9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaW50ZXJzZWN0c1BsYW5lKHRoaXMpfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGIpe3JldHVybiBiLmludGVyc2VjdHNQbGFuZSh0aGlzKX0sY29wbGFuYXJQb2ludDpmdW5jdGlvbihiKXt2b2lkIDA9PT0KYiYmKGNvbnNvbGUud2FybigiVEhSRUUuUGxhbmU6IC5jb3BsYW5hclBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGI9bmV3IGcpO3JldHVybiBiLmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX0sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGIsZSl7ZT1lfHxEcy5nZXROb3JtYWxNYXRyaXgoYik7Yj10aGlzLmNvcGxhbmFyUG9pbnQobWwpLmFwcGx5TWF0cml4NChiKTtlPXRoaXMubm9ybWFsLmFwcGx5TWF0cml4MyhlKS5ub3JtYWxpemUoKTt0aGlzLmNvbnN0YW50PS1iLmRvdChlKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGIpe3RoaXMuY29uc3RhbnQtPWIuZG90KHRoaXMubm9ybWFsKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGIpe3JldHVybiBiLm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpJiZiLmNvbnN0YW50PT09dGhpcy5jb25zdGFudH19KTt2YXIgd2c9bmV3IEYsbWo9bmV3IGc7T2JqZWN0LmFzc2lnbihFYy5wcm90b3R5cGUsCntzZXQ6ZnVuY3Rpb24oYixlLGgsbSx1LHcpe3ZhciBBPXRoaXMucGxhbmVzO0FbMF0uY29weShiKTtBWzFdLmNvcHkoZSk7QVsyXS5jb3B5KGgpO0FbM10uY29weShtKTtBWzRdLmNvcHkodSk7QVs1XS5jb3B5KHcpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihiKXtmb3IodmFyIGU9dGhpcy5wbGFuZXMsaD0wOzY+aDtoKyspZVtoXS5jb3B5KGIucGxhbmVzW2hdKTtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeDpmdW5jdGlvbihiKXt2YXIgZT10aGlzLnBsYW5lcyxoPWIuZWxlbWVudHM7Yj1oWzBdO3ZhciBtPWhbMV0sdT1oWzJdLHc9aFszXSxBPWhbNF0sRT1oWzVdLEc9aFs2XSxKPWhbN10sUT1oWzhdLFM9aFs5XSxUPWhbMTBdLFc9aFsxMV0sWD1oWzEyXSxpYT1oWzEzXSxoYT1oWzE0XTtoPWhbMTVdO2VbMF0uc2V0Q29tcG9uZW50cyh3LWIsSi1BLFctUSxoLVgpLm5vcm1hbGl6ZSgpOwplWzFdLnNldENvbXBvbmVudHModytiLEorQSxXK1EsaCtYKS5ub3JtYWxpemUoKTtlWzJdLnNldENvbXBvbmVudHModyttLEorRSxXK1MsaCtpYSkubm9ybWFsaXplKCk7ZVszXS5zZXRDb21wb25lbnRzKHctbSxKLUUsVy1TLGgtaWEpLm5vcm1hbGl6ZSgpO2VbNF0uc2V0Q29tcG9uZW50cyh3LXUsSi1HLFctVCxoLWhhKS5ub3JtYWxpemUoKTtlWzVdLnNldENvbXBvbmVudHModyt1LEorRyxXK1QsaCtoYSkubm9ybWFsaXplKCk7cmV0dXJuIHRoaXN9LGludGVyc2VjdHNPYmplY3Q6ZnVuY3Rpb24oYil7dmFyIGU9Yi5nZW9tZXRyeTtudWxsPT09ZS5ib3VuZGluZ1NwaGVyZSYmZS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTt3Zy5jb3B5KGUuYm91bmRpbmdTcGhlcmUpLmFwcGx5TWF0cml4NChiLm1hdHJpeFdvcmxkKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKHdnKX0saW50ZXJzZWN0c1Nwcml0ZTpmdW5jdGlvbihiKXt3Zy5jZW50ZXIuc2V0KDAsMCwwKTt3Zy5yYWRpdXM9Ci43MDcxMDY3ODExODY1NDc2O3dnLmFwcGx5TWF0cml4NChiLm1hdHJpeFdvcmxkKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKHdnKX0saW50ZXJzZWN0c1NwaGVyZTpmdW5jdGlvbihiKXt2YXIgZT10aGlzLnBsYW5lcyxoPWIuY2VudGVyO2I9LWIucmFkaXVzO2Zvcih2YXIgbT0wOzY+bTttKyspaWYoZVttXS5kaXN0YW5jZVRvUG9pbnQoaCk8YilyZXR1cm4hMTtyZXR1cm4hMH0saW50ZXJzZWN0c0JveDpmdW5jdGlvbihiKXtmb3IodmFyIGU9dGhpcy5wbGFuZXMsaD0wOzY+aDtoKyspe3ZhciBtPWVbaF07bWoueD0wPG0ubm9ybWFsLng/Yi5tYXgueDpiLm1pbi54O21qLnk9MDxtLm5vcm1hbC55P2IubWF4Lnk6Yi5taW4ueTttai56PTA8bS5ub3JtYWwuej9iLm1heC56OmIubWluLno7aWYoMD5tLmRpc3RhbmNlVG9Qb2ludChtaikpcmV0dXJuITF9cmV0dXJuITB9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPXRoaXMucGxhbmVzLGg9MDs2Pmg7aCsrKWlmKDA+CmVbaF0uZGlzdGFuY2VUb1BvaW50KGIpKXJldHVybiExO3JldHVybiEwfX0pO3ZhciB3Yj17YWxwaGFtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQUxQSEFNQVBcblx0ZGlmZnVzZUNvbG9yLmEgKlx4M2QgdGV4dHVyZTJEKCBhbHBoYU1hcCwgdlV2ICkuZztcbiNlbmRpZiIsYWxwaGFtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9BTFBIQU1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBhbHBoYU1hcDtcbiNlbmRpZiIsYWxwaGF0ZXN0X2ZyYWdtZW50OiIjaWZkZWYgQUxQSEFURVNUXG5cdGlmICggZGlmZnVzZUNvbG9yLmEgXHgzYyBBTFBIQVRFU1QgKSBkaXNjYXJkO1xuI2VuZGlmIixhb21hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9BT01BUFxuXHRmbG9hdCBhbWJpZW50T2NjbHVzaW9uIFx4M2QgKCB0ZXh0dXJlMkQoIGFvTWFwLCB2VXYyICkuciAtIDEuMCApICogYW9NYXBJbnRlbnNpdHkgKyAxLjA7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqXHgzZCBhbWJpZW50T2NjbHVzaW9uO1xuXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIFx4MjZceDI2IGRlZmluZWQoIFNUQU5EQVJEIClcblx0XHRmbG9hdCBkb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciAqXHgzZCBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGRvdE5WLCBhbWJpZW50T2NjbHVzaW9uLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xuXHQjZW5kaWZcbiNlbmRpZiIsCmFvbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQU9NQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgYW9NYXA7XG5cdHVuaWZvcm0gZmxvYXQgYW9NYXBJbnRlbnNpdHk7XG4jZW5kaWYiLGJlZ2luX3ZlcnRleDoidmVjMyB0cmFuc2Zvcm1lZCBceDNkIHZlYzMoIHBvc2l0aW9uICk7IixiZWdpbm5vcm1hbF92ZXJ0ZXg6InZlYzMgb2JqZWN0Tm9ybWFsIFx4M2QgdmVjMyggbm9ybWFsICk7XG4jaWZkZWYgVVNFX1RBTkdFTlRcblx0dmVjMyBvYmplY3RUYW5nZW50IFx4M2QgdmVjMyggdGFuZ2VudC54eXogKTtcbiNlbmRpZiIsYnNkZnM6InZlYzIgaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRjb25zdCB2ZWM0IGMwIFx4M2QgdmVjNCggLSAxLCAtIDAuMDI3NSwgLSAwLjU3MiwgMC4wMjIgKTtcblx0Y29uc3QgdmVjNCBjMSBceDNkIHZlYzQoIDEsIDAuMDQyNSwgMS4wNCwgLSAwLjA0ICk7XG5cdHZlYzQgciBceDNkIHJvdWdobmVzcyAqIGMwICsgYzE7XG5cdGZsb2F0IGEwMDQgXHgzZCBtaW4oIHIueCAqIHIueCwgZXhwMiggLSA5LjI4ICogZG90TlYgKSApICogci54ICsgci55O1xuXHRyZXR1cm4gdmVjMiggLTEuMDQsIDEuMDQgKSAqIGEwMDQgKyByLnp3O1xufVxuZmxvYXQgcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggY29uc3QgaW4gZmxvYXQgbGlnaHREaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgY3V0b2ZmRGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGRlY2F5RXhwb25lbnQgKSB7XG4jaWYgZGVmaW5lZCAoIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFMgKVxuXHRmbG9hdCBkaXN0YW5jZUZhbGxvZmYgXHgzZCAxLjAgLyBtYXgoIHBvdyggbGlnaHREaXN0YW5jZSwgZGVjYXlFeHBvbmVudCApLCAwLjAxICk7XG5cdGlmKCBjdXRvZmZEaXN0YW5jZSBceDNlIDAuMCApIHtcblx0XHRkaXN0YW5jZUZhbGxvZmYgKlx4M2QgcG93Miggc2F0dXJhdGUoIDEuMCAtIHBvdzQoIGxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSApICkgKTtcblx0fVxuXHRyZXR1cm4gZGlzdGFuY2VGYWxsb2ZmO1xuI2Vsc2Vcblx0aWYoIGN1dG9mZkRpc3RhbmNlIFx4M2UgMC4wIFx4MjZceDI2IGRlY2F5RXhwb25lbnQgXHgzZSAwLjAgKSB7XG5cdFx0cmV0dXJuIHBvdyggc2F0dXJhdGUoIC1saWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKyAxLjAgKSwgZGVjYXlFeHBvbmVudCApO1xuXHR9XG5cdHJldHVybiAxLjA7XG4jZW5kaWZcbn1cbnZlYzMgQlJERl9EaWZmdXNlX0xhbWJlcnQoIGNvbnN0IGluIHZlYzMgZGlmZnVzZUNvbG9yICkge1xuXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGRpZmZ1c2VDb2xvcjtcbn1cbnZlYzMgRl9TY2hsaWNrKCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IGRvdExIICkge1xuXHRmbG9hdCBmcmVzbmVsIFx4M2QgZXhwMiggKCAtNS41NTQ3MyAqIGRvdExIIC0gNi45ODMxNiApICogZG90TEggKTtcblx0cmV0dXJuICggMS4wIC0gc3BlY3VsYXJDb2xvciApICogZnJlc25lbCArIHNwZWN1bGFyQ29sb3I7XG59XG52ZWMzIEZfU2NobGlja19Sb3VnaG5lc3NEZXBlbmRlbnQoIGNvbnN0IGluIHZlYzMgRjAsIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGZyZXNuZWwgXHgzZCBleHAyKCAoIC01LjU1NDczICogZG90TlYgLSA2Ljk4MzE2ICkgKiBkb3ROViApO1xuXHR2ZWMzIEZyIFx4M2QgbWF4KCB2ZWMzKCAxLjAgLSByb3VnaG5lc3MgKSwgRjAgKSAtIEYwO1xuXHRyZXR1cm4gRnIgKiBmcmVzbmVsICsgRjA7XG59XG5mbG9hdCBHX0dHWF9TbWl0aCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5MLCBjb25zdCBpbiBmbG9hdCBkb3ROViApIHtcblx0ZmxvYXQgYTIgXHgzZCBwb3cyKCBhbHBoYSApO1xuXHRmbG9hdCBnbCBceDNkIGRvdE5MICsgc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XG5cdGZsb2F0IGd2IFx4M2QgZG90TlYgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcblx0cmV0dXJuIDEuMCAvICggZ2wgKiBndiApO1xufVxuZmxvYXQgR19HR1hfU21pdGhDb3JyZWxhdGVkKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xuXHRmbG9hdCBhMiBceDNkIHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGd2IFx4M2QgZG90TkwgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcblx0ZmxvYXQgZ2wgXHgzZCBkb3ROViAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TkwgKSApO1xuXHRyZXR1cm4gMC41IC8gbWF4KCBndiArIGdsLCBFUFNJTE9OICk7XG59XG5mbG9hdCBEX0dHWCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkge1xuXHRmbG9hdCBhMiBceDNkIHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGRlbm9tIFx4M2QgcG93MiggZG90TkggKSAqICggYTIgLSAxLjAgKSArIDEuMDtcblx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBhMiAvIHBvdzIoIGRlbm9tICk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfR0dYKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGluY2lkZW50TGlnaHQsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRmbG9hdCBhbHBoYSBceDNkIHBvdzIoIHJvdWdobmVzcyApO1xuXHR2ZWMzIGhhbGZEaXIgXHgzZCBub3JtYWxpemUoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICsgdmlld0RpciApO1xuXHRmbG9hdCBkb3ROTCBceDNkIHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKSApO1xuXHRmbG9hdCBkb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7XG5cdGZsb2F0IGRvdE5IIFx4M2Qgc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTtcblx0ZmxvYXQgZG90TEggXHgzZCBzYXR1cmF0ZSggZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRpciApICk7XG5cdHZlYzMgRiBceDNkIEZfU2NobGljayggc3BlY3VsYXJDb2xvciwgZG90TEggKTtcblx0ZmxvYXQgRyBceDNkIEdfR0dYX1NtaXRoQ29ycmVsYXRlZCggYWxwaGEsIGRvdE5MLCBkb3ROViApO1xuXHRmbG9hdCBEIFx4M2QgRF9HR1goIGFscGhhLCBkb3ROSCApO1xuXHRyZXR1cm4gRiAqICggRyAqIEQgKTtcbn1cbnZlYzIgTFRDX1V2KCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRjb25zdCBmbG9hdCBMVVRfU0laRSAgXHgzZCA2NC4wO1xuXHRjb25zdCBmbG9hdCBMVVRfU0NBTEUgXHgzZCAoIExVVF9TSVpFIC0gMS4wICkgLyBMVVRfU0laRTtcblx0Y29uc3QgZmxvYXQgTFVUX0JJQVMgIFx4M2QgMC41IC8gTFVUX1NJWkU7XG5cdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggTiwgViApICk7XG5cdHZlYzIgdXYgXHgzZCB2ZWMyKCByb3VnaG5lc3MsIHNxcnQoIDEuMCAtIGRvdE5WICkgKTtcblx0dXYgXHgzZCB1diAqIExVVF9TQ0FMRSArIExVVF9CSUFTO1xuXHRyZXR1cm4gdXY7XG59XG5mbG9hdCBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgZiApIHtcblx0ZmxvYXQgbCBceDNkIGxlbmd0aCggZiApO1xuXHRyZXR1cm4gbWF4KCAoIGwgKiBsICsgZi56ICkgLyAoIGwgKyAxLjAgKSwgMC4wICk7XG59XG52ZWMzIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyB2MSwgY29uc3QgaW4gdmVjMyB2MiApIHtcblx0ZmxvYXQgeCBceDNkIGRvdCggdjEsIHYyICk7XG5cdGZsb2F0IHkgXHgzZCBhYnMoIHggKTtcblx0ZmxvYXQgYSBceDNkIDAuODU0Mzk4NSArICggMC40OTY1MTU1ICsgMC4wMTQ1MjA2ICogeSApICogeTtcblx0ZmxvYXQgYiBceDNkIDMuNDE3NTk0MCArICggNC4xNjE2NzI0ICsgeSApICogeTtcblx0ZmxvYXQgdiBceDNkIGEgLyBiO1xuXHRmbG9hdCB0aGV0YV9zaW50aGV0YSBceDNkICggeCBceDNlIDAuMCApID8gdiA6IDAuNSAqIGludmVyc2VzcXJ0KCBtYXgoIDEuMCAtIHggKiB4LCAxZS03ICkgKSAtIHY7XG5cdHJldHVybiBjcm9zcyggdjEsIHYyICkgKiB0aGV0YV9zaW50aGV0YTtcbn1cbnZlYzMgTFRDX0V2YWx1YXRlKCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gdmVjMyBQLCBjb25zdCBpbiBtYXQzIG1JbnYsIGNvbnN0IGluIHZlYzMgcmVjdENvb3Jkc1sgNCBdICkge1xuXHR2ZWMzIHYxIFx4M2QgcmVjdENvb3Jkc1sgMSBdIC0gcmVjdENvb3Jkc1sgMCBdO1xuXHR2ZWMzIHYyIFx4M2QgcmVjdENvb3Jkc1sgMyBdIC0gcmVjdENvb3Jkc1sgMCBdO1xuXHR2ZWMzIGxpZ2h0Tm9ybWFsIFx4M2QgY3Jvc3MoIHYxLCB2MiApO1xuXHRpZiggZG90KCBsaWdodE5vcm1hbCwgUCAtIHJlY3RDb29yZHNbIDAgXSApIFx4M2MgMC4wICkgcmV0dXJuIHZlYzMoIDAuMCApO1xuXHR2ZWMzIFQxLCBUMjtcblx0VDEgXHgzZCBub3JtYWxpemUoIFYgLSBOICogZG90KCBWLCBOICkgKTtcblx0VDIgXHgzZCAtIGNyb3NzKCBOLCBUMSApO1xuXHRtYXQzIG1hdCBceDNkIG1JbnYgKiB0cmFuc3Bvc2VNYXQzKCBtYXQzKCBUMSwgVDIsIE4gKSApO1xuXHR2ZWMzIGNvb3Jkc1sgNCBdO1xuXHRjb29yZHNbIDAgXSBceDNkIG1hdCAqICggcmVjdENvb3Jkc1sgMCBdIC0gUCApO1xuXHRjb29yZHNbIDEgXSBceDNkIG1hdCAqICggcmVjdENvb3Jkc1sgMSBdIC0gUCApO1xuXHRjb29yZHNbIDIgXSBceDNkIG1hdCAqICggcmVjdENvb3Jkc1sgMiBdIC0gUCApO1xuXHRjb29yZHNbIDMgXSBceDNkIG1hdCAqICggcmVjdENvb3Jkc1sgMyBdIC0gUCApO1xuXHRjb29yZHNbIDAgXSBceDNkIG5vcm1hbGl6ZSggY29vcmRzWyAwIF0gKTtcblx0Y29vcmRzWyAxIF0gXHgzZCBub3JtYWxpemUoIGNvb3Jkc1sgMSBdICk7XG5cdGNvb3Jkc1sgMiBdIFx4M2Qgbm9ybWFsaXplKCBjb29yZHNbIDIgXSApO1xuXHRjb29yZHNbIDMgXSBceDNkIG5vcm1hbGl6ZSggY29vcmRzWyAzIF0gKTtcblx0dmVjMyB2ZWN0b3JGb3JtRmFjdG9yIFx4M2QgdmVjMyggMC4wICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgK1x4M2QgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDAgXSwgY29vcmRzWyAxIF0gKTtcblx0dmVjdG9yRm9ybUZhY3RvciArXHgzZCBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMSBdLCBjb29yZHNbIDIgXSApO1xuXHR2ZWN0b3JGb3JtRmFjdG9yICtceDNkIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAyIF0sIGNvb3Jkc1sgMyBdICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgK1x4M2QgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDMgXSwgY29vcmRzWyAwIF0gKTtcblx0ZmxvYXQgcmVzdWx0IFx4M2QgTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCB2ZWN0b3JGb3JtRmFjdG9yICk7XG5cdHJldHVybiB2ZWMzKCByZXN1bHQgKTtcbn1cbnZlYzMgQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRmbG9hdCBkb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7XG5cdHZlYzIgYnJkZiBceDNkIGludGVncmF0ZVNwZWN1bGFyQlJERiggZG90TlYsIHJvdWdobmVzcyApO1xuXHRyZXR1cm4gc3BlY3VsYXJDb2xvciAqIGJyZGYueCArIGJyZGYueTtcbn1cbnZvaWQgQlJERl9TcGVjdWxhcl9NdWx0aXNjYXR0ZXJpbmdfRW52aXJvbm1lbnQoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBpbm91dCB2ZWMzIHNpbmdsZVNjYXR0ZXIsIGlub3V0IHZlYzMgbXVsdGlTY2F0dGVyICkge1xuXHRmbG9hdCBkb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdHZlYzMgRiBceDNkIEZfU2NobGlja19Sb3VnaG5lc3NEZXBlbmRlbnQoIHNwZWN1bGFyQ29sb3IsIGRvdE5WLCByb3VnaG5lc3MgKTtcblx0dmVjMiBicmRmIFx4M2QgaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBkb3ROViwgcm91Z2huZXNzICk7XG5cdHZlYzMgRnNzRXNzIFx4M2QgRiAqIGJyZGYueCArIGJyZGYueTtcblx0ZmxvYXQgRXNzIFx4M2QgYnJkZi54ICsgYnJkZi55O1xuXHRmbG9hdCBFbXMgXHgzZCAxLjAgLSBFc3M7XG5cdHZlYzMgRmF2ZyBceDNkIHNwZWN1bGFyQ29sb3IgKyAoIDEuMCAtIHNwZWN1bGFyQ29sb3IgKSAqIDAuMDQ3NjE5O1x0dmVjMyBGbXMgXHgzZCBGc3NFc3MgKiBGYXZnIC8gKCAxLjAgLSBFbXMgKiBGYXZnICk7XG5cdHNpbmdsZVNjYXR0ZXIgK1x4M2QgRnNzRXNzO1xuXHRtdWx0aVNjYXR0ZXIgK1x4M2QgRm1zICogRW1zO1xufVxuZmxvYXQgR19CbGlublBob25nX0ltcGxpY2l0KCApIHtcblx0cmV0dXJuIDAuMjU7XG59XG5mbG9hdCBEX0JsaW5uUGhvbmcoIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7XG5cdHJldHVybiBSRUNJUFJPQ0FMX1BJICogKCBzaGluaW5lc3MgKiAwLjUgKyAxLjAgKSAqIHBvdyggZG90TkgsIHNoaW5pbmVzcyApO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MgKSB7XG5cdHZlYzMgaGFsZkRpciBceDNkIG5vcm1hbGl6ZSggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKyBnZW9tZXRyeS52aWV3RGlyICk7XG5cdGZsb2F0IGRvdE5IIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoYWxmRGlyICkgKTtcblx0ZmxvYXQgZG90TEggXHgzZCBzYXR1cmF0ZSggZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRpciApICk7XG5cdHZlYzMgRiBceDNkIEZfU2NobGljayggc3BlY3VsYXJDb2xvciwgZG90TEggKTtcblx0ZmxvYXQgRyBceDNkIEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKTtcblx0ZmxvYXQgRCBceDNkIERfQmxpbm5QaG9uZyggc2hpbmluZXNzLCBkb3ROSCApO1xuXHRyZXR1cm4gRiAqICggRyAqIEQgKTtcbn1cbmZsb2F0IEdHWFJvdWdobmVzc1RvQmxpbm5FeHBvbmVudCggY29uc3QgaW4gZmxvYXQgZ2d4Um91Z2huZXNzICkge1xuXHRyZXR1cm4gKCAyLjAgLyBwb3cyKCBnZ3hSb3VnaG5lc3MgKyAwLjAwMDEgKSAtIDIuMCApO1xufVxuZmxvYXQgQmxpbm5FeHBvbmVudFRvR0dYUm91Z2huZXNzKCBjb25zdCBpbiBmbG9hdCBibGlubkV4cG9uZW50ICkge1xuXHRyZXR1cm4gc3FydCggMi4wIC8gKCBibGlubkV4cG9uZW50ICsgMi4wICkgKTtcbn1cbiNpZiBkZWZpbmVkKCBVU0VfU0hFRU4gKVxuZmxvYXQgRF9DaGFybGllKGZsb2F0IHJvdWdobmVzcywgZmxvYXQgTm9IKSB7XG5cdGZsb2F0IGludkFscGhhICBceDNkIDEuMCAvIHJvdWdobmVzcztcblx0ZmxvYXQgY29zMmggXHgzZCBOb0ggKiBOb0g7XG5cdGZsb2F0IHNpbjJoIFx4M2QgbWF4KDEuMCAtIGNvczJoLCAwLjAwNzgxMjUpO1x0cmV0dXJuICgyLjAgKyBpbnZBbHBoYSkgKiBwb3coc2luMmgsIGludkFscGhhICogMC41KSAvICgyLjAgKiBQSSk7XG59XG5mbG9hdCBWX05ldWJlbHQoZmxvYXQgTm9WLCBmbG9hdCBOb0wpIHtcblx0cmV0dXJuIHNhdHVyYXRlKDEuMCAvICg0LjAgKiAoTm9MICsgTm9WIC0gTm9MICogTm9WKSkpO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX1NoZWVuKCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIHZlYzMgTCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgdmVjMyBzcGVjdWxhckNvbG9yICkge1xuXHR2ZWMzIE4gXHgzZCBnZW9tZXRyeS5ub3JtYWw7XG5cdHZlYzMgViBceDNkIGdlb21ldHJ5LnZpZXdEaXI7XG5cdHZlYzMgSCBceDNkIG5vcm1hbGl6ZSggViArIEwgKTtcblx0ZmxvYXQgZG90TkggXHgzZCBzYXR1cmF0ZSggZG90KCBOLCBIICkgKTtcblx0cmV0dXJuIHNwZWN1bGFyQ29sb3IgKiBEX0NoYXJsaWUoIHJvdWdobmVzcywgZG90TkggKSAqIFZfTmV1YmVsdCggZG90KE4sIFYpLCBkb3QoTiwgTCkgKTtcbn1cbiNlbmRpZiIsCmJ1bXBtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9CVU1QTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGJ1bXBNYXA7XG5cdHVuaWZvcm0gZmxvYXQgYnVtcFNjYWxlO1xuXHR2ZWMyIGRIZHh5X2Z3ZCgpIHtcblx0XHR2ZWMyIGRTVGR4IFx4M2QgZEZkeCggdlV2ICk7XG5cdFx0dmVjMiBkU1RkeSBceDNkIGRGZHkoIHZVdiApO1xuXHRcdGZsb2F0IEhsbCBceDNkIGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICkueDtcblx0XHRmbG9hdCBkQnggXHgzZCBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR4ICkueCAtIEhsbDtcblx0XHRmbG9hdCBkQnkgXHgzZCBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR5ICkueCAtIEhsbDtcblx0XHRyZXR1cm4gdmVjMiggZEJ4LCBkQnkgKTtcblx0fVxuXHR2ZWMzIHBlcnR1cmJOb3JtYWxBcmIoIHZlYzMgc3VyZl9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIGRIZHh5ICkge1xuXHRcdHZlYzMgdlNpZ21hWCBceDNkIHZlYzMoIGRGZHgoIHN1cmZfcG9zLnggKSwgZEZkeCggc3VyZl9wb3MueSApLCBkRmR4KCBzdXJmX3Bvcy56ICkgKTtcblx0XHR2ZWMzIHZTaWdtYVkgXHgzZCB2ZWMzKCBkRmR5KCBzdXJmX3Bvcy54ICksIGRGZHkoIHN1cmZfcG9zLnkgKSwgZEZkeSggc3VyZl9wb3MueiApICk7XG5cdFx0dmVjMyB2TiBceDNkIHN1cmZfbm9ybTtcblx0XHR2ZWMzIFIxIFx4M2QgY3Jvc3MoIHZTaWdtYVksIHZOICk7XG5cdFx0dmVjMyBSMiBceDNkIGNyb3NzKCB2TiwgdlNpZ21hWCApO1xuXHRcdGZsb2F0IGZEZXQgXHgzZCBkb3QoIHZTaWdtYVgsIFIxICk7XG5cdFx0ZkRldCAqXHgzZCAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdFx0dmVjMyB2R3JhZCBceDNkIHNpZ24oIGZEZXQgKSAqICggZEhkeHkueCAqIFIxICsgZEhkeHkueSAqIFIyICk7XG5cdFx0cmV0dXJuIG5vcm1hbGl6ZSggYWJzKCBmRGV0ICkgKiBzdXJmX25vcm0gLSB2R3JhZCApO1xuXHR9XG4jZW5kaWYiLApjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTIFx4M2UgMFxuXHR2ZWM0IHBsYW5lO1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHtcblx0XHRwbGFuZSBceDNkIGNsaXBwaW5nUGxhbmVzWyBpIF07XG5cdFx0aWYgKCBkb3QoIHZWaWV3UG9zaXRpb24sIHBsYW5lLnh5eiApIFx4M2UgcGxhbmUudyApIGRpc2NhcmQ7XG5cdH1cblx0I2lmIFVOSU9OX0NMSVBQSU5HX1BMQU5FUyBceDNjIE5VTV9DTElQUElOR19QTEFORVNcblx0XHRib29sIGNsaXBwZWQgXHgzZCB0cnVlO1xuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0XHRmb3IgKCBpbnQgaSBceDNkIFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSBceDNjIE5VTV9DTElQUElOR19QTEFORVM7IGkgKysgKSB7XG5cdFx0XHRwbGFuZSBceDNkIGNsaXBwaW5nUGxhbmVzWyBpIF07XG5cdFx0XHRjbGlwcGVkIFx4M2QgKCBkb3QoIHZWaWV3UG9zaXRpb24sIHBsYW5lLnh5eiApIFx4M2UgcGxhbmUudyApIFx4MjZceDI2IGNsaXBwZWQ7XG5cdFx0fVxuXHRcdGlmICggY2xpcHBlZCApIGRpc2NhcmQ7XG5cdCNlbmRpZlxuI2VuZGlmIiwKY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTIFx4M2UgMFxuXHQjaWYgISBkZWZpbmVkKCBTVEFOREFSRCApIFx4MjZceDI2ICEgZGVmaW5lZCggUEhPTkcgKSBceDI2XHgyNiAhIGRlZmluZWQoIE1BVENBUCApXG5cdFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG5cdCNlbmRpZlxuXHR1bmlmb3JtIHZlYzQgY2xpcHBpbmdQbGFuZXNbIE5VTV9DTElQUElOR19QTEFORVMgXTtcbiNlbmRpZiIsY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4OiIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyBceDNlIDAgXHgyNlx4MjYgISBkZWZpbmVkKCBTVEFOREFSRCApIFx4MjZceDI2ICEgZGVmaW5lZCggUEhPTkcgKSBceDI2XHgyNiAhIGRlZmluZWQoIE1BVENBUCApXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmIixjbGlwcGluZ19wbGFuZXNfdmVydGV4OiIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyBceDNlIDAgXHgyNlx4MjYgISBkZWZpbmVkKCBTVEFOREFSRCApIFx4MjZceDI2ICEgZGVmaW5lZCggUEhPTkcgKSBceDI2XHgyNiAhIGRlZmluZWQoIE1BVENBUCApXG5cdHZWaWV3UG9zaXRpb24gXHgzZCAtIG12UG9zaXRpb24ueHl6O1xuI2VuZGlmIiwKY29sb3JfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQ09MT1Jcblx0ZGlmZnVzZUNvbG9yLnJnYiAqXHgzZCB2Q29sb3I7XG4jZW5kaWYiLGNvbG9yX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQ09MT1Jcblx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcbiNlbmRpZiIsY29sb3JfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfQ09MT1Jcblx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcbiNlbmRpZiIsY29sb3JfdmVydGV4OiIjaWZkZWYgVVNFX0NPTE9SXG5cdHZDb2xvci54eXogXHgzZCBjb2xvci54eXo7XG4jZW5kaWYiLGNvbW1vbjoiI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU5XG4jZGVmaW5lIFBJMiA2LjI4MzE4NTMwNzE4XG4jZGVmaW5lIFBJX0hBTEYgMS41NzA3OTYzMjY3OTQ5XG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkgMC4zMTgzMDk4ODYxOFxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJMiAwLjE1OTE1NDk0XG4jZGVmaW5lIExPRzIgMS40NDI2OTVcbiNkZWZpbmUgRVBTSUxPTiAxZS02XG4jZGVmaW5lIHNhdHVyYXRlKGEpIGNsYW1wKCBhLCAwLjAsIDEuMCApXG4jZGVmaW5lIHdoaXRlQ29tcGxlbWVudChhKSAoIDEuMCAtIHNhdHVyYXRlKCBhICkgKVxuZmxvYXQgcG93MiggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeDsgfVxuZmxvYXQgcG93MyggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeCp4OyB9XG5mbG9hdCBwb3c0KCBjb25zdCBpbiBmbG9hdCB4ICkgeyBmbG9hdCB4MiBceDNkIHgqeDsgcmV0dXJuIHgyKngyOyB9XG5mbG9hdCBhdmVyYWdlKCBjb25zdCBpbiB2ZWMzIGNvbG9yICkgeyByZXR1cm4gZG90KCBjb2xvciwgdmVjMyggMC4zMzMzICkgKTsgfVxuaGlnaHAgZmxvYXQgcmFuZCggY29uc3QgaW4gdmVjMiB1diApIHtcblx0Y29uc3QgaGlnaHAgZmxvYXQgYSBceDNkIDEyLjk4OTgsIGIgXHgzZCA3OC4yMzMsIGMgXHgzZCA0Mzc1OC41NDUzO1xuXHRoaWdocCBmbG9hdCBkdCBceDNkIGRvdCggdXYueHksIHZlYzIoIGEsYiApICksIHNuIFx4M2QgbW9kKCBkdCwgUEkgKTtcblx0cmV0dXJuIGZyYWN0KHNpbihzbikgKiBjKTtcbn1cbiNpZmRlZiBISUdIX1BSRUNJU0lPTlxuXHRmbG9hdCBwcmVjaXNpb25TYWZlTGVuZ3RoKCB2ZWMzIHYgKSB7IHJldHVybiBsZW5ndGgoIHYgKTsgfVxuI2Vsc2Vcblx0ZmxvYXQgbWF4MyggdmVjMyB2ICkgeyByZXR1cm4gbWF4KCBtYXgoIHYueCwgdi55ICksIHYueiApOyB9XG5cdGZsb2F0IHByZWNpc2lvblNhZmVMZW5ndGgoIHZlYzMgdiApIHtcblx0XHRmbG9hdCBtYXhDb21wb25lbnQgXHgzZCBtYXgzKCBhYnMoIHYgKSApO1xuXHRcdHJldHVybiBsZW5ndGgoIHYgLyBtYXhDb21wb25lbnQgKSAqIG1heENvbXBvbmVudDtcblx0fVxuI2VuZGlmXG5zdHJ1Y3QgSW5jaWRlbnRMaWdodCB7XG5cdHZlYzMgY29sb3I7XG5cdHZlYzMgZGlyZWN0aW9uO1xuXHRib29sIHZpc2libGU7XG59O1xuc3RydWN0IFJlZmxlY3RlZExpZ2h0IHtcblx0dmVjMyBkaXJlY3REaWZmdXNlO1xuXHR2ZWMzIGRpcmVjdFNwZWN1bGFyO1xuXHR2ZWMzIGluZGlyZWN0RGlmZnVzZTtcblx0dmVjMyBpbmRpcmVjdFNwZWN1bGFyO1xufTtcbnN0cnVjdCBHZW9tZXRyaWNDb250ZXh0IHtcblx0dmVjMyBwb3NpdGlvbjtcblx0dmVjMyBub3JtYWw7XG5cdHZlYzMgdmlld0RpcjtcbiNpZmRlZiBDTEVBUkNPQVRcblx0dmVjMyBjbGVhcmNvYXROb3JtYWw7XG4jZW5kaWZcbn07XG52ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTtcbn1cbnZlYzMgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQoIGRpciwgMC4wICkgKiBtYXRyaXggKS54eXogKTtcbn1cbnZlYzMgcHJvamVjdE9uUGxhbmUoaW4gdmVjMyBwb2ludCwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XG5cdGZsb2F0IGRpc3RhbmNlIFx4M2QgZG90KCBwbGFuZU5vcm1hbCwgcG9pbnQgLSBwb2ludE9uUGxhbmUgKTtcblx0cmV0dXJuIC0gZGlzdGFuY2UgKiBwbGFuZU5vcm1hbCArIHBvaW50O1xufVxuZmxvYXQgc2lkZU9mUGxhbmUoIGluIHZlYzMgcG9pbnQsIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xuXHRyZXR1cm4gc2lnbiggZG90KCBwb2ludCAtIHBvaW50T25QbGFuZSwgcGxhbmVOb3JtYWwgKSApO1xufVxudmVjMyBsaW5lUGxhbmVJbnRlcnNlY3QoIGluIHZlYzMgcG9pbnRPbkxpbmUsIGluIHZlYzMgbGluZURpcmVjdGlvbiwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XG5cdHJldHVybiBsaW5lRGlyZWN0aW9uICogKCBkb3QoIHBsYW5lTm9ybWFsLCBwb2ludE9uUGxhbmUgLSBwb2ludE9uTGluZSApIC8gZG90KCBwbGFuZU5vcm1hbCwgbGluZURpcmVjdGlvbiApICkgKyBwb2ludE9uTGluZTtcbn1cbm1hdDMgdHJhbnNwb3NlTWF0MyggY29uc3QgaW4gbWF0MyBtICkge1xuXHRtYXQzIHRtcDtcblx0dG1wWyAwIF0gXHgzZCB2ZWMzKCBtWyAwIF0ueCwgbVsgMSBdLngsIG1bIDIgXS54ICk7XG5cdHRtcFsgMSBdIFx4M2QgdmVjMyggbVsgMCBdLnksIG1bIDEgXS55LCBtWyAyIF0ueSApO1xuXHR0bXBbIDIgXSBceDNkIHZlYzMoIG1bIDAgXS56LCBtWyAxIF0ueiwgbVsgMiBdLnogKTtcblx0cmV0dXJuIHRtcDtcbn1cbmZsb2F0IGxpbmVhclRvUmVsYXRpdmVMdW1pbmFuY2UoIGNvbnN0IGluIHZlYzMgY29sb3IgKSB7XG5cdHZlYzMgd2VpZ2h0cyBceDNkIHZlYzMoIDAuMjEyNiwgMC43MTUyLCAwLjA3MjIgKTtcblx0cmV0dXJuIGRvdCggd2VpZ2h0cywgY29sb3IucmdiICk7XG59IiwKY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50OiIjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVlxuI2RlZmluZSBjdWJlVVZfdGV4dHVyZVNpemUgKDEwMjQuMClcbmludCBnZXRGYWNlRnJvbURpcmVjdGlvbih2ZWMzIGRpcmVjdGlvbikge1xuXHR2ZWMzIGFic0RpcmVjdGlvbiBceDNkIGFicyhkaXJlY3Rpb24pO1xuXHRpbnQgZmFjZSBceDNkIC0xO1xuXHRpZiggYWJzRGlyZWN0aW9uLnggXHgzZSBhYnNEaXJlY3Rpb24ueiApIHtcblx0XHRpZihhYnNEaXJlY3Rpb24ueCBceDNlIGFic0RpcmVjdGlvbi55IClcblx0XHRcdGZhY2UgXHgzZCBkaXJlY3Rpb24ueCBceDNlIDAuMCA/IDAgOiAzO1xuXHRcdGVsc2Vcblx0XHRcdGZhY2UgXHgzZCBkaXJlY3Rpb24ueSBceDNlIDAuMCA/IDEgOiA0O1xuXHR9XG5cdGVsc2Uge1xuXHRcdGlmKGFic0RpcmVjdGlvbi56IFx4M2UgYWJzRGlyZWN0aW9uLnkgKVxuXHRcdFx0ZmFjZSBceDNkIGRpcmVjdGlvbi56IFx4M2UgMC4wID8gMiA6IDU7XG5cdFx0ZWxzZVxuXHRcdFx0ZmFjZSBceDNkIGRpcmVjdGlvbi55IFx4M2UgMC4wID8gMSA6IDQ7XG5cdH1cblx0cmV0dXJuIGZhY2U7XG59XG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMSAgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMS4wKVxuI2RlZmluZSBjdWJlVVZfcmFuZ2VDbGFtcCAoZXhwMigoNi4wIC0gMS4wKSAqIDIuMCkpXG52ZWMyIE1pcExldmVsSW5mbyggdmVjMyB2ZWMsIGZsb2F0IHJvdWdobmVzc0xldmVsLCBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IHNjYWxlIFx4M2QgZXhwMihjdWJlVVZfbWF4TG9kczEgLSByb3VnaG5lc3NMZXZlbCk7XG5cdGZsb2F0IGR4Um91Z2huZXNzIFx4M2QgZEZkeChyb3VnaG5lc3MpO1xuXHRmbG9hdCBkeVJvdWdobmVzcyBceDNkIGRGZHkocm91Z2huZXNzKTtcblx0dmVjMyBkeCBceDNkIGRGZHgoIHZlYyAqIHNjYWxlICogZHhSb3VnaG5lc3MgKTtcblx0dmVjMyBkeSBceDNkIGRGZHkoIHZlYyAqIHNjYWxlICogZHlSb3VnaG5lc3MgKTtcblx0ZmxvYXQgZCBceDNkIG1heCggZG90KCBkeCwgZHggKSwgZG90KCBkeSwgZHkgKSApO1xuXHRkIFx4M2QgY2xhbXAoZCwgMS4wLCBjdWJlVVZfcmFuZ2VDbGFtcCk7XG5cdGZsb2F0IG1pcExldmVsIFx4M2QgMC41ICogbG9nMihkKTtcblx0cmV0dXJuIHZlYzIoZmxvb3IobWlwTGV2ZWwpLCBmcmFjdChtaXBMZXZlbCkpO1xufVxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczIgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMi4wKVxuI2RlZmluZSBjdWJlVVZfcmNwVGV4dHVyZVNpemUgKDEuMCAvIGN1YmVVVl90ZXh0dXJlU2l6ZSlcbnZlYzIgZ2V0Q3ViZVVWKHZlYzMgZGlyZWN0aW9uLCBmbG9hdCByb3VnaG5lc3NMZXZlbCwgZmxvYXQgbWlwTGV2ZWwpIHtcblx0bWlwTGV2ZWwgXHgzZCByb3VnaG5lc3NMZXZlbCBceDNlIGN1YmVVVl9tYXhMb2RzMiAtIDMuMCA/IDAuMCA6IG1pcExldmVsO1xuXHRmbG9hdCBhIFx4M2QgMTYuMCAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtcblx0dmVjMiBleHAyX3BhY2tlZCBceDNkIGV4cDIoIHZlYzIoIHJvdWdobmVzc0xldmVsLCBtaXBMZXZlbCApICk7XG5cdHZlYzIgcmNwX2V4cDJfcGFja2VkIFx4M2QgdmVjMiggMS4wICkgLyBleHAyX3BhY2tlZDtcblx0ZmxvYXQgcG93U2NhbGUgXHgzZCBleHAyX3BhY2tlZC54ICogZXhwMl9wYWNrZWQueTtcblx0ZmxvYXQgc2NhbGUgXHgzZCByY3BfZXhwMl9wYWNrZWQueCAqIHJjcF9leHAyX3BhY2tlZC55ICogMC4yNTtcblx0ZmxvYXQgbWlwT2Zmc2V0IFx4M2QgMC43NSooMS4wIC0gcmNwX2V4cDJfcGFja2VkLnkpICogcmNwX2V4cDJfcGFja2VkLng7XG5cdGJvb2wgYlJlcyBceDNkIG1pcExldmVsIFx4M2RceDNkIDAuMDtcblx0c2NhbGUgXHgzZCAgYlJlcyBceDI2XHgyNiAoc2NhbGUgXHgzYyBhKSA/IGEgOiBzY2FsZTtcblx0dmVjMyByO1xuXHR2ZWMyIG9mZnNldDtcblx0aW50IGZhY2UgXHgzZCBnZXRGYWNlRnJvbURpcmVjdGlvbihkaXJlY3Rpb24pO1xuXHRmbG9hdCByY3BQb3dTY2FsZSBceDNkIDEuMCAvIHBvd1NjYWxlO1xuXHRpZiggZmFjZSBceDNkXHgzZCAwKSB7XG5cdFx0ciBceDNkIHZlYzMoZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCBceDNkIHZlYzIoMC4wK21pcE9mZnNldCwwLjc1ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55IFx4M2QgYlJlcyBceDI2XHgyNiAob2Zmc2V0LnkgXHgzYyAyLjAqYSkgPyBhIDogb2Zmc2V0Lnk7XG5cdH1cblx0ZWxzZSBpZiggZmFjZSBceDNkXHgzZCAxKSB7XG5cdFx0ciBceDNkIHZlYzMoZGlyZWN0aW9uLnksIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueik7XG5cdFx0b2Zmc2V0IFx4M2QgdmVjMihzY2FsZSttaXBPZmZzZXQsIDAuNzUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IGEgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlIFx4M2RceDNkIDIpIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLngsIGRpcmVjdGlvbi55KTtcblx0XHRvZmZzZXQgXHgzZCB2ZWMyKDIuMCpzY2FsZSttaXBPZmZzZXQsIDAuNzUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IGEgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlIFx4M2RceDNkIDMpIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55KTtcblx0XHRvZmZzZXQgXHgzZCB2ZWMyKDAuMCttaXBPZmZzZXQsMC41ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55IFx4M2QgYlJlcyBceDI2XHgyNiAob2Zmc2V0LnkgXHgzYyAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlIFx4M2RceDNkIDQpIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueSwgZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueik7XG5cdFx0b2Zmc2V0IFx4M2QgdmVjMihzY2FsZSttaXBPZmZzZXQsIDAuNSAqIHJjcFBvd1NjYWxlKTtcblx0XHRvZmZzZXQueSBceDNkIGJSZXMgXHgyNlx4MjYgKG9mZnNldC55IFx4M2MgMi4wKmEpID8gMC4wIDogb2Zmc2V0Lnk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0ciBceDNkIHZlYzMoZGlyZWN0aW9uLnosIC1kaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCBceDNkIHZlYzIoMi4wKnNjYWxlK21pcE9mZnNldCwgMC41ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55IFx4M2QgYlJlcyBceDI2XHgyNiAob2Zmc2V0LnkgXHgzYyAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcblx0fVxuXHRyIFx4M2Qgbm9ybWFsaXplKHIpO1xuXHRmbG9hdCB0ZXhlbE9mZnNldCBceDNkIDAuNSAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtcblx0dmVjMiBzIFx4M2QgKCByLnl6IC8gYWJzKCByLnggKSArIHZlYzIoIDEuMCApICkgKiAwLjU7XG5cdHZlYzIgYmFzZSBceDNkIG9mZnNldCArIHZlYzIoIHRleGVsT2Zmc2V0ICk7XG5cdHJldHVybiBiYXNlICsgcyAqICggc2NhbGUgLSAyLjAgKiB0ZXhlbE9mZnNldCApO1xufVxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczMgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMy4wKVxudmVjNCB0ZXh0dXJlQ3ViZVVWKCBzYW1wbGVyMkQgZW52TWFwLCB2ZWMzIHJlZmxlY3RlZERpcmVjdGlvbiwgZmxvYXQgcm91Z2huZXNzICkge1xuXHRmbG9hdCByb3VnaG5lc3NWYWwgXHgzZCByb3VnaG5lc3MqIGN1YmVVVl9tYXhMb2RzMztcblx0ZmxvYXQgcjEgXHgzZCBmbG9vcihyb3VnaG5lc3NWYWwpO1xuXHRmbG9hdCByMiBceDNkIHIxICsgMS4wO1xuXHRmbG9hdCB0IFx4M2QgZnJhY3Qocm91Z2huZXNzVmFsKTtcblx0dmVjMiBtaXBJbmZvIFx4M2QgTWlwTGV2ZWxJbmZvKHJlZmxlY3RlZERpcmVjdGlvbiwgcjEsIHJvdWdobmVzcyk7XG5cdGZsb2F0IHMgXHgzZCBtaXBJbmZvLnk7XG5cdGZsb2F0IGxldmVsMCBceDNkIG1pcEluZm8ueDtcblx0ZmxvYXQgbGV2ZWwxIFx4M2QgbGV2ZWwwICsgMS4wO1xuXHRsZXZlbDEgXHgzZCBsZXZlbDEgXHgzZSA1LjAgPyA1LjAgOiBsZXZlbDE7XG5cdGxldmVsMCArXHgzZCBtaW4oIGZsb29yKCBzICsgMC41ICksIDUuMCApO1xuXHR2ZWMyIHV2XzEwIFx4M2QgZ2V0Q3ViZVVWKHJlZmxlY3RlZERpcmVjdGlvbiwgcjEsIGxldmVsMCk7XG5cdHZlYzQgY29sb3IxMCBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXZfMTApKTtcblx0dmVjMiB1dl8yMCBceDNkIGdldEN1YmVVVihyZWZsZWN0ZWREaXJlY3Rpb24sIHIyLCBsZXZlbDApO1xuXHR2ZWM0IGNvbG9yMjAgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKHRleHR1cmUyRChlbnZNYXAsIHV2XzIwKSk7XG5cdHZlYzQgcmVzdWx0IFx4M2QgbWl4KGNvbG9yMTAsIGNvbG9yMjAsIHQpO1xuXHRyZXR1cm4gdmVjNChyZXN1bHQucmdiLCAxLjApO1xufVxuI2VuZGlmIiwKZGVmYXVsdG5vcm1hbF92ZXJ0ZXg6InZlYzMgdHJhbnNmb3JtZWROb3JtYWwgXHgzZCBub3JtYWxNYXRyaXggKiBvYmplY3ROb3JtYWw7XG4jaWZkZWYgRkxJUF9TSURFRFxuXHR0cmFuc2Zvcm1lZE5vcm1hbCBceDNkIC0gdHJhbnNmb3JtZWROb3JtYWw7XG4jZW5kaWZcbiNpZmRlZiBVU0VfVEFOR0VOVFxuXHR2ZWMzIHRyYW5zZm9ybWVkVGFuZ2VudCBceDNkIG5vcm1hbE1hdHJpeCAqIG9iamVjdFRhbmdlbnQ7XG5cdCNpZmRlZiBGTElQX1NJREVEXG5cdFx0dHJhbnNmb3JtZWRUYW5nZW50IFx4M2QgLSB0cmFuc2Zvcm1lZFRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmIixkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGRpc3BsYWNlbWVudE1hcDtcblx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRTY2FsZTtcblx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRCaWFzO1xuI2VuZGlmIixkaXNwbGFjZW1lbnRtYXBfdmVydGV4OiIjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHR0cmFuc2Zvcm1lZCArXHgzZCBub3JtYWxpemUoIG9iamVjdE5vcm1hbCApICogKCB0ZXh0dXJlMkQoIGRpc3BsYWNlbWVudE1hcCwgdXYgKS54ICogZGlzcGxhY2VtZW50U2NhbGUgKyBkaXNwbGFjZW1lbnRCaWFzICk7XG4jZW5kaWYiLAplbWlzc2l2ZW1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxuXHR2ZWM0IGVtaXNzaXZlQ29sb3IgXHgzZCB0ZXh0dXJlMkQoIGVtaXNzaXZlTWFwLCB2VXYgKTtcblx0ZW1pc3NpdmVDb2xvci5yZ2IgXHgzZCBlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXIoIGVtaXNzaXZlQ29sb3IgKS5yZ2I7XG5cdHRvdGFsRW1pc3NpdmVSYWRpYW5jZSAqXHgzZCBlbWlzc2l2ZUNvbG9yLnJnYjtcbiNlbmRpZiIsZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBlbWlzc2l2ZU1hcDtcbiNlbmRpZiIsZW5jb2RpbmdzX2ZyYWdtZW50OiJnbF9GcmFnQ29sb3IgXHgzZCBsaW5lYXJUb091dHB1dFRleGVsKCBnbF9GcmFnQ29sb3IgKTsiLGVuY29kaW5nc19wYXJzX2ZyYWdtZW50OiJcbnZlYzQgTGluZWFyVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2YWx1ZTtcbn1cbnZlYzQgR2FtbWFUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XG5cdHJldHVybiB2ZWM0KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggZ2FtbWFGYWN0b3IgKSApLCB2YWx1ZS5hICk7XG59XG52ZWM0IExpbmVhclRvR2FtbWEoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IGdhbW1hRmFjdG9yICkge1xuXHRyZXR1cm4gdmVjNCggcG93KCB2YWx1ZS5yZ2IsIHZlYzMoIDEuMCAvIGdhbW1hRmFjdG9yICkgKSwgdmFsdWUuYSApO1xufVxudmVjNCBzUkdCVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiICogMC45NDc4NjcyOTg2ICsgdmVjMyggMC4wNTIxMzI3MDE0ICksIHZlYzMoIDIuNCApICksIHZhbHVlLnJnYiAqIDAuMDc3Mzk5MzgwOCwgdmVjMyggbGVzc1RoYW5FcXVhbCggdmFsdWUucmdiLCB2ZWMzKCAwLjA0MDQ1ICkgKSApICksIHZhbHVlLmEgKTtcbn1cbnZlYzQgTGluZWFyVG9zUkdCKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMC40MTY2NiApICkgKiAxLjA1NSAtIHZlYzMoIDAuMDU1ICksIHZhbHVlLnJnYiAqIDEyLjkyLCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDAzMTMwOCApICkgKSApLCB2YWx1ZS5hICk7XG59XG52ZWM0IFJHQkVUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqIGV4cDIoIHZhbHVlLmEgKiAyNTUuMCAtIDEyOC4wICksIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQkUoIGluIHZlYzQgdmFsdWUgKSB7XG5cdGZsb2F0IG1heENvbXBvbmVudCBceDNkIG1heCggbWF4KCB2YWx1ZS5yLCB2YWx1ZS5nICksIHZhbHVlLmIgKTtcblx0ZmxvYXQgZkV4cCBceDNkIGNsYW1wKCBjZWlsKCBsb2cyKCBtYXhDb21wb25lbnQgKSApLCAtMTI4LjAsIDEyNy4wICk7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgLyBleHAyKCBmRXhwICksICggZkV4cCArIDEyOC4wICkgLyAyNTUuMCApO1xufVxudmVjNCBSR0JNVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogdmFsdWUuYSAqIG1heFJhbmdlLCAxLjAgKTtcbn1cbnZlYzQgTGluZWFyVG9SR0JNKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcblx0ZmxvYXQgbWF4UkdCIFx4M2QgbWF4KCB2YWx1ZS5yLCBtYXgoIHZhbHVlLmcsIHZhbHVlLmIgKSApO1xuXHRmbG9hdCBNIFx4M2QgY2xhbXAoIG1heFJHQiAvIG1heFJhbmdlLCAwLjAsIDEuMCApO1xuXHRNIFx4M2QgY2VpbCggTSAqIDI1NS4wICkgLyAyNTUuMDtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvICggTSAqIG1heFJhbmdlICksIE0gKTtcbn1cbnZlYzQgUkdCRFRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICggKCBtYXhSYW5nZSAvIDI1NS4wICkgLyB2YWx1ZS5hICksIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQkQoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRmbG9hdCBtYXhSR0IgXHgzZCBtYXgoIHZhbHVlLnIsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XG5cdGZsb2F0IEQgXHgzZCBtYXgoIG1heFJhbmdlIC8gbWF4UkdCLCAxLjAgKTtcblx0RCBceDNkIG1pbiggZmxvb3IoIEQgKSAvIDI1NS4wLCAxLjAgKTtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICggRCAqICggMjU1LjAgLyBtYXhSYW5nZSApICksIEQgKTtcbn1cbmNvbnN0IG1hdDMgY0xvZ0x1dk0gXHgzZCBtYXQzKCAwLjIyMDksIDAuMzM5MCwgMC40MTg0LCAwLjExMzgsIDAuNjc4MCwgMC43MzE5LCAwLjAxMDIsIDAuMTEzMCwgMC4yOTY5ICk7XG52ZWM0IExpbmVhclRvTG9nTHV2KCBpbiB2ZWM0IHZhbHVlICkgIHtcblx0dmVjMyBYcF9ZX1hZWnAgXHgzZCBjTG9nTHV2TSAqIHZhbHVlLnJnYjtcblx0WHBfWV9YWVpwIFx4M2QgbWF4KCBYcF9ZX1hZWnAsIHZlYzMoIDFlLTYsIDFlLTYsIDFlLTYgKSApO1xuXHR2ZWM0IHZSZXN1bHQ7XG5cdHZSZXN1bHQueHkgXHgzZCBYcF9ZX1hZWnAueHkgLyBYcF9ZX1hZWnAuejtcblx0ZmxvYXQgTGUgXHgzZCAyLjAgKiBsb2cyKFhwX1lfWFlacC55KSArIDEyNy4wO1xuXHR2UmVzdWx0LncgXHgzZCBmcmFjdCggTGUgKTtcblx0dlJlc3VsdC56IFx4M2QgKCBMZSAtICggZmxvb3IoIHZSZXN1bHQudyAqIDI1NS4wICkgKSAvIDI1NS4wICkgLyAyNTUuMDtcblx0cmV0dXJuIHZSZXN1bHQ7XG59XG5jb25zdCBtYXQzIGNMb2dMdXZJbnZlcnNlTSBceDNkIG1hdDMoIDYuMDAxNCwgLTIuNzAwOCwgLTEuNzk5NiwgLTEuMzMyMCwgMy4xMDI5LCAtNS43NzIxLCAwLjMwMDgsIC0xLjA4ODIsIDUuNjI2OCApO1xudmVjNCBMb2dMdXZUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0ZmxvYXQgTGUgXHgzZCB2YWx1ZS56ICogMjU1LjAgKyB2YWx1ZS53O1xuXHR2ZWMzIFhwX1lfWFlacDtcblx0WHBfWV9YWVpwLnkgXHgzZCBleHAyKCAoIExlIC0gMTI3LjAgKSAvIDIuMCApO1xuXHRYcF9ZX1hZWnAueiBceDNkIFhwX1lfWFlacC55IC8gdmFsdWUueTtcblx0WHBfWV9YWVpwLnggXHgzZCB2YWx1ZS54ICogWHBfWV9YWVpwLno7XG5cdHZlYzMgdlJHQiBceDNkIGNMb2dMdXZJbnZlcnNlTSAqIFhwX1lfWFlacC5yZ2I7XG5cdHJldHVybiB2ZWM0KCBtYXgoIHZSR0IsIDAuMCApLCAxLjAgKTtcbn0iLAplbnZtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpZmRlZiBFTlZfV09STERQT1Ncblx0XHR2ZWMzIGNhbWVyYVRvVmVydGV4IFx4M2Qgbm9ybWFsaXplKCB2V29ybGRQb3NpdGlvbiAtIGNhbWVyYVBvc2l0aW9uICk7XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0XHR2ZWMzIHJlZmxlY3RWZWMgXHgzZCByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTtcblx0XHQjZWxzZVxuXHRcdFx0dmVjMyByZWZsZWN0VmVjIFx4M2QgcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZcblx0I2Vsc2Vcblx0XHR2ZWMzIHJlZmxlY3RWZWMgXHgzZCB2UmVmbGVjdDtcblx0I2VuZGlmXG5cdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0dmVjNCBlbnZDb2xvciBceDNkIHRleHR1cmVDdWJlKCBlbnZNYXAsIHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKSApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9FUVVJUkVDIClcblx0XHR2ZWMyIHNhbXBsZVVWO1xuXHRcdHJlZmxlY3RWZWMgXHgzZCBub3JtYWxpemUoIHJlZmxlY3RWZWMgKTtcblx0XHRzYW1wbGVVVi55IFx4M2QgYXNpbiggY2xhbXAoIHJlZmxlY3RWZWMueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xuXHRcdHNhbXBsZVVWLnggXHgzZCBhdGFuKCByZWZsZWN0VmVjLnosIHJlZmxlY3RWZWMueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XG5cdFx0dmVjNCBlbnZDb2xvciBceDNkIHRleHR1cmUyRCggZW52TWFwLCBzYW1wbGVVViApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9TUEhFUkUgKVxuXHRcdHJlZmxlY3RWZWMgXHgzZCBub3JtYWxpemUoIHJlZmxlY3RWZWMgKTtcblx0XHR2ZWMzIHJlZmxlY3RWaWV3IFx4M2Qgbm9ybWFsaXplKCAoIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZsZWN0VmVjLCAwLjAgKSApLnh5eiArIHZlYzMoIDAuMCwgMC4wLCAxLjAgKSApO1xuXHRcdHZlYzQgZW52Q29sb3IgXHgzZCB0ZXh0dXJlMkQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUgKTtcblx0I2Vsc2Vcblx0XHR2ZWM0IGVudkNvbG9yIFx4M2QgdmVjNCggMC4wICk7XG5cdCNlbmRpZlxuXHRlbnZDb2xvciBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIoIGVudkNvbG9yICk7XG5cdCNpZmRlZiBFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFlcblx0XHRvdXRnb2luZ0xpZ2h0IFx4M2QgbWl4KCBvdXRnb2luZ0xpZ2h0LCBvdXRnb2luZ0xpZ2h0ICogZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19NSVggKVxuXHRcdG91dGdvaW5nTGlnaHQgXHgzZCBtaXgoIG91dGdvaW5nTGlnaHQsIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfQkxFTkRJTkdfQUREIClcblx0XHRvdXRnb2luZ0xpZ2h0ICtceDNkIGVudkNvbG9yLnh5eiAqIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHk7XG5cdCNlbmRpZlxuI2VuZGlmIiwKZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VOVk1BUFxuXHR1bmlmb3JtIGZsb2F0IGVudk1hcEludGVuc2l0eTtcblx0dW5pZm9ybSBmbG9hdCBmbGlwRW52TWFwO1xuXHR1bmlmb3JtIGludCBtYXhNaXBMZXZlbDtcblx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHR1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcblx0I2Vsc2Vcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7XG5cdCNlbmRpZlxuXHRcbiNlbmRpZiIsZW52bWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdHVuaWZvcm0gZmxvYXQgcmVmbGVjdGl2aXR5O1xuXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKVxuXHRcdCNkZWZpbmUgRU5WX1dPUkxEUE9TXG5cdCNlbmRpZlxuXHQjaWZkZWYgRU5WX1dPUkxEUE9TXG5cdFx0dmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuXHRcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xuXHQjZWxzZVxuXHRcdHZhcnlpbmcgdmVjMyB2UmVmbGVjdDtcblx0I2VuZGlmXG4jZW5kaWYiLAplbnZtYXBfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fGRlZmluZWQoIFBIT05HIClcblx0XHQjZGVmaW5lIEVOVl9XT1JMRFBPU1xuXHQjZW5kaWZcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdFxuXHRcdHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcblx0I2Vsc2Vcblx0XHR2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7XG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbmRpZlxuI2VuZGlmIixlbnZtYXBfcGh5c2ljYWxfcGFyc19mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKVxuXHQjaWZkZWYgRU5WTUFQX01PREVfUkVGUkFDVElPTlxuXHRcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xuXHQjZW5kaWZcblx0dmVjMyBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGdlb21ldHJ5Lm5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0XHR2ZWMzIHF1ZXJ5VmVjIFx4M2QgdmVjMyggZmxpcEVudk1hcCAqIHdvcmxkTm9ybWFsLngsIHdvcmxkTm9ybWFsLnl6ICk7XG5cdFx0XHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlQ3ViZUxvZEVYVCggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcblx0XHRcdCNlbHNlXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlQ3ViZSggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcblx0XHRcdCNlbmRpZlxuXHRcdFx0ZW52TWFwQ29sb3IucmdiIFx4M2QgZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XG5cdFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXG5cdFx0XHR2ZWMzIHF1ZXJ5VmVjIFx4M2QgdmVjMyggZmxpcEVudk1hcCAqIHdvcmxkTm9ybWFsLngsIHdvcmxkTm9ybWFsLnl6ICk7XG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZUN1YmVVViggZW52TWFwLCBxdWVyeVZlYywgMS4wICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB2ZWM0KCAwLjAgKTtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gUEkgKiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7XG5cdH1cblx0ZmxvYXQgZ2V0U3BlY3VsYXJNSVBMZXZlbCggY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XG5cdFx0ZmxvYXQgbWF4TUlQTGV2ZWxTY2FsYXIgXHgzZCBmbG9hdCggbWF4TUlQTGV2ZWwgKTtcblx0XHRmbG9hdCBzaWdtYSBceDNkIFBJICogcm91Z2huZXNzICogcm91Z2huZXNzIC8gKCAxLjAgKyByb3VnaG5lc3MgKTtcblx0XHRmbG9hdCBkZXNpcmVkTUlQTGV2ZWwgXHgzZCBtYXhNSVBMZXZlbFNjYWxhciArIGxvZzIoIHNpZ21hICk7XG5cdFx0cmV0dXJuIGNsYW1wKCBkZXNpcmVkTUlQTGV2ZWwsIDAuMCwgbWF4TUlQTGV2ZWxTY2FsYXIgKTtcblx0fVxuXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcblx0XHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxuXHRcdCAgdmVjMyByZWZsZWN0VmVjIFx4M2QgcmVmbGVjdCggLXZpZXdEaXIsIG5vcm1hbCApO1xuXHRcdCAgcmVmbGVjdFZlYyBceDNkIG5vcm1hbGl6ZSggbWl4KCByZWZsZWN0VmVjLCBub3JtYWwsIHJvdWdobmVzcyAqIHJvdWdobmVzcykgKTtcblx0XHQjZWxzZVxuXHRcdCAgdmVjMyByZWZsZWN0VmVjIFx4M2QgcmVmcmFjdCggLXZpZXdEaXIsIG5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XG5cdFx0I2VuZGlmXG5cdFx0cmVmbGVjdFZlYyBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHJlZmxlY3RWZWMsIHZpZXdNYXRyaXggKTtcblx0XHRmbG9hdCBzcGVjdWxhck1JUExldmVsIFx4M2QgZ2V0U3BlY3VsYXJNSVBMZXZlbCggcm91Z2huZXNzLCBtYXhNSVBMZXZlbCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0XHR2ZWMzIHF1ZXJ5UmVmbGVjdFZlYyBceDNkIHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlTG9kRVhUKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRcdHZlYzMgcXVlcnlSZWZsZWN0VmVjIFx4M2QgdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApO1xuXHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlVVYoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCByb3VnaG5lc3MgKTtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9FUVVJUkVDIClcblx0XHRcdHZlYzIgc2FtcGxlVVY7XG5cdFx0XHRzYW1wbGVVVi55IFx4M2QgYXNpbiggY2xhbXAoIHJlZmxlY3RWZWMueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xuXHRcdFx0c2FtcGxlVVYueCBceDNkIGF0YW4oIHJlZmxlY3RWZWMueiwgcmVmbGVjdFZlYy54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmUyRExvZEVYVCggZW52TWFwLCBzYW1wbGVVViwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmUyRCggZW52TWFwLCBzYW1wbGVVViwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9TUEhFUkUgKVxuXHRcdFx0dmVjMyByZWZsZWN0VmlldyBceDNkIG5vcm1hbGl6ZSggKCB2aWV3TWF0cml4ICogdmVjNCggcmVmbGVjdFZlYywgMC4wICkgKS54eXogKyB2ZWMzKCAwLjAsMC4wLDEuMCApICk7XG5cdFx0XHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlMkRMb2RFWFQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcblx0XHRcdCNlbHNlXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlMkQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcblx0XHRcdCNlbmRpZlxuXHRcdFx0ZW52TWFwQ29sb3IucmdiIFx4M2QgZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XG5cdFx0I2VuZGlmXG5cdFx0cmV0dXJuIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcblx0fVxuI2VuZGlmIiwKZW52bWFwX3ZlcnRleDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdHZXb3JsZFBvc2l0aW9uIFx4M2Qgd29ybGRQb3NpdGlvbi54eXo7XG5cdCNlbHNlXG5cdFx0dmVjMyBjYW1lcmFUb1ZlcnRleCBceDNkIG5vcm1hbGl6ZSggd29ybGRQb3NpdGlvbi54eXogLSBjYW1lcmFQb3NpdGlvbiApO1xuXHRcdHZlYzMgd29ybGROb3JtYWwgXHgzZCBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCB0cmFuc2Zvcm1lZE5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0XHR2UmVmbGVjdCBceDNkIHJlZmxlY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCApO1xuXHRcdCNlbHNlXG5cdFx0XHR2UmVmbGVjdCBceDNkIHJlZnJhY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XG5cdFx0I2VuZGlmXG5cdCNlbmRpZlxuI2VuZGlmIixmb2dfdmVydGV4OiIjaWZkZWYgVVNFX0ZPR1xuXHRmb2dEZXB0aCBceDNkIC1tdlBvc2l0aW9uLno7XG4jZW5kaWYiLApmb2dfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfRk9HXG5cdHZhcnlpbmcgZmxvYXQgZm9nRGVwdGg7XG4jZW5kaWYiLGZvZ19mcmFnbWVudDoiI2lmZGVmIFVTRV9GT0dcblx0I2lmZGVmIEZPR19FWFAyXG5cdFx0ZmxvYXQgZm9nRmFjdG9yIFx4M2QgMS4wIC0gZXhwKCAtIGZvZ0RlbnNpdHkgKiBmb2dEZW5zaXR5ICogZm9nRGVwdGggKiBmb2dEZXB0aCApO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGZvZ0ZhY3RvciBceDNkIHNtb290aHN0ZXAoIGZvZ05lYXIsIGZvZ0ZhciwgZm9nRGVwdGggKTtcblx0I2VuZGlmXG5cdGdsX0ZyYWdDb2xvci5yZ2IgXHgzZCBtaXgoIGdsX0ZyYWdDb2xvci5yZ2IsIGZvZ0NvbG9yLCBmb2dGYWN0b3IgKTtcbiNlbmRpZiIsZm9nX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRk9HXG5cdHVuaWZvcm0gdmVjMyBmb2dDb2xvcjtcblx0dmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcblx0I2lmZGVmIEZPR19FWFAyXG5cdFx0dW5pZm9ybSBmbG9hdCBmb2dEZW5zaXR5O1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gZmxvYXQgZm9nTmVhcjtcblx0XHR1bmlmb3JtIGZsb2F0IGZvZ0Zhcjtcblx0I2VuZGlmXG4jZW5kaWYiLApncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVE9PTlxuXHR1bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudE1hcDtcblx0dmVjMyBnZXRHcmFkaWVudElycmFkaWFuY2UoIHZlYzMgbm9ybWFsLCB2ZWMzIGxpZ2h0RGlyZWN0aW9uICkge1xuXHRcdGZsb2F0IGRvdE5MIFx4M2QgZG90KCBub3JtYWwsIGxpZ2h0RGlyZWN0aW9uICk7XG5cdFx0dmVjMiBjb29yZCBceDNkIHZlYzIoIGRvdE5MICogMC41ICsgMC41LCAwLjAgKTtcblx0XHQjaWZkZWYgVVNFX0dSQURJRU5UTUFQXG5cdFx0XHRyZXR1cm4gdGV4dHVyZTJEKCBncmFkaWVudE1hcCwgY29vcmQgKS5yZ2I7XG5cdFx0I2Vsc2Vcblx0XHRcdHJldHVybiAoIGNvb3JkLnggXHgzYyAwLjcgKSA/IHZlYzMoIDAuNyApIDogdmVjMyggMS4wICk7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZiIsbGlnaHRtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTElHSFRNQVBcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIFBJICogdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApLnh5eiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xuI2VuZGlmIiwKbGlnaHRtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9MSUdIVE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBsaWdodE1hcDtcblx0dW5pZm9ybSBmbG9hdCBsaWdodE1hcEludGVuc2l0eTtcbiNlbmRpZiIsbGlnaHRzX2xhbWJlcnRfdmVydGV4OiJ2ZWMzIGRpZmZ1c2UgXHgzZCB2ZWMzKCAxLjAgKTtcbkdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnk7XG5nZW9tZXRyeS5wb3NpdGlvbiBceDNkIG12UG9zaXRpb24ueHl6O1xuZ2VvbWV0cnkubm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuZ2VvbWV0cnkudmlld0RpciBceDNkIG5vcm1hbGl6ZSggLW12UG9zaXRpb24ueHl6ICk7XG5HZW9tZXRyaWNDb250ZXh0IGJhY2tHZW9tZXRyeTtcbmJhY2tHZW9tZXRyeS5wb3NpdGlvbiBceDNkIGdlb21ldHJ5LnBvc2l0aW9uO1xuYmFja0dlb21ldHJ5Lm5vcm1hbCBceDNkIC1nZW9tZXRyeS5ub3JtYWw7XG5iYWNrR2VvbWV0cnkudmlld0RpciBceDNkIGdlb21ldHJ5LnZpZXdEaXI7XG52TGlnaHRGcm9udCBceDNkIHZlYzMoIDAuMCApO1xudkluZGlyZWN0RnJvbnQgXHgzZCB2ZWMzKCAwLjAgKTtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dkxpZ2h0QmFjayBceDNkIHZlYzMoIDAuMCApO1xuXHR2SW5kaXJlY3RCYWNrIFx4M2QgdmVjMyggMC4wICk7XG4jZW5kaWZcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XG5mbG9hdCBkb3ROTDtcbnZlYzMgZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuI2lmIE5VTV9QT0lOVF9MSUdIVFMgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggcG9pbnRMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0ZG90TkwgXHgzZCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlIFx4M2QgUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHR2TGlnaHRGcm9udCArXHgzZCBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2TGlnaHRCYWNrICtceDNkIHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1NQT1RfTElHSFRTIFx4M2UgMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdGRvdE5MIFx4M2QgZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSBceDNkIFBJICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0dkxpZ2h0RnJvbnQgK1x4M2Qgc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdFx0dkxpZ2h0QmFjayArXHgzZCBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9ESVJfTElHSFRTIFx4M2UgMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xuXHRcdGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHRkb3ROTCBceDNkIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgXHgzZCBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdHZMaWdodEZyb250ICtceDNkIHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZMaWdodEJhY2sgK1x4M2Qgc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWZcbiNpZiBOVU1fSEVNSV9MSUdIVFMgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xuXHRcdHZJbmRpcmVjdEZyb250ICtceDNkIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkgKTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2SW5kaXJlY3RCYWNrICtceDNkIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgYmFja0dlb21ldHJ5ICk7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZiIsCmxpZ2h0c19wYXJzX2JlZ2luOiJ1bmlmb3JtIHZlYzMgYW1iaWVudExpZ2h0Q29sb3I7XG51bmlmb3JtIHZlYzMgbGlnaHRQcm9iZVsgOSBdO1xudmVjMyBzaEdldElycmFkaWFuY2VBdCggaW4gdmVjMyBub3JtYWwsIGluIHZlYzMgc2hDb2VmZmljaWVudHNbIDkgXSApIHtcblx0ZmxvYXQgeCBceDNkIG5vcm1hbC54LCB5IFx4M2Qgbm9ybWFsLnksIHogXHgzZCBub3JtYWwuejtcblx0dmVjMyByZXN1bHQgXHgzZCBzaENvZWZmaWNpZW50c1sgMCBdICogMC44ODYyMjc7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgMSBdICogMi4wICogMC41MTE2NjQgKiB5O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDIgXSAqIDIuMCAqIDAuNTExNjY0ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyAzIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHg7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNCBdICogMi4wICogMC40MjkwNDMgKiB4ICogeTtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA1IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHkgKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDYgXSAqICggMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNyBdICogMi4wICogMC40MjkwNDMgKiB4ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA4IF0gKiAwLjQyOTA0MyAqICggeCAqIHggLSB5ICogeSApO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxudmVjMyBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBsaWdodFByb2JlWyA5IF0sIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnkgKSB7XG5cdHZlYzMgd29ybGROb3JtYWwgXHgzZCBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBnZW9tZXRyeS5ub3JtYWwsIHZpZXdNYXRyaXggKTtcblx0dmVjMyBpcnJhZGlhbmNlIFx4M2Qgc2hHZXRJcnJhZGlhbmNlQXQoIHdvcmxkTm9ybWFsLCBsaWdodFByb2JlICk7XG5cdHJldHVybiBpcnJhZGlhbmNlO1xufVxudmVjMyBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGFtYmllbnRMaWdodENvbG9yICkge1xuXHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBhbWJpZW50TGlnaHRDb2xvcjtcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0aXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0I2VuZGlmXG5cdHJldHVybiBpcnJhZGlhbmNlO1xufVxuI2lmIE5VTV9ESVJfTElHSFRTIFx4M2UgMFxuXHRzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodCB7XG5cdFx0dmVjMyBkaXJlY3Rpb247XG5cdFx0dmVjMyBjb2xvcjtcblx0XHRpbnQgc2hhZG93O1xuXHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0fTtcblx0dW5pZm9ybSBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHRzWyBOVU1fRElSX0xJR0hUUyBdO1xuXHR2b2lkIGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICkge1xuXHRcdGRpcmVjdExpZ2h0LmNvbG9yIFx4M2QgZGlyZWN0aW9uYWxMaWdodC5jb2xvcjtcblx0XHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gXHgzZCBkaXJlY3Rpb25hbExpZ2h0LmRpcmVjdGlvbjtcblx0XHRkaXJlY3RMaWdodC52aXNpYmxlIFx4M2QgdHJ1ZTtcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1BPSU5UX0xJR0hUUyBceDNlIDBcblx0c3RydWN0IFBvaW50TGlnaHQge1xuXHRcdHZlYzMgcG9zaXRpb247XG5cdFx0dmVjMyBjb2xvcjtcblx0XHRmbG9hdCBkaXN0YW5jZTtcblx0XHRmbG9hdCBkZWNheTtcblx0XHRpbnQgc2hhZG93O1xuXHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0XHRmbG9hdCBzaGFkb3dDYW1lcmFOZWFyO1xuXHRcdGZsb2F0IHNoYWRvd0NhbWVyYUZhcjtcblx0fTtcblx0dW5pZm9ybSBQb2ludExpZ2h0IHBvaW50TGlnaHRzWyBOVU1fUE9JTlRfTElHSFRTIF07XG5cdHZvaWQgZ2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIFBvaW50TGlnaHQgcG9pbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgKSB7XG5cdFx0dmVjMyBsVmVjdG9yIFx4M2QgcG9pbnRMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiBceDNkIG5vcm1hbGl6ZSggbFZlY3RvciApO1xuXHRcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgXHgzZCBsZW5ndGgoIGxWZWN0b3IgKTtcblx0XHRkaXJlY3RMaWdodC5jb2xvciBceDNkIHBvaW50TGlnaHQuY29sb3I7XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKlx4M2QgcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggbGlnaHREaXN0YW5jZSwgcG9pbnRMaWdodC5kaXN0YW5jZSwgcG9pbnRMaWdodC5kZWNheSApO1xuXHRcdGRpcmVjdExpZ2h0LnZpc2libGUgXHgzZCAoIGRpcmVjdExpZ2h0LmNvbG9yICFceDNkIHZlYzMoIDAuMCApICk7XG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9TUE9UX0xJR0hUUyBceDNlIDBcblx0c3RydWN0IFNwb3RMaWdodCB7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGRpcmVjdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGZsb2F0IGRpc3RhbmNlO1xuXHRcdGZsb2F0IGRlY2F5O1xuXHRcdGZsb2F0IGNvbmVDb3M7XG5cdFx0ZmxvYXQgcGVudW1icmFDb3M7XG5cdFx0aW50IHNoYWRvdztcblx0XHRmbG9hdCBzaGFkb3dCaWFzO1xuXHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcblx0XHR2ZWMyIHNoYWRvd01hcFNpemU7XG5cdH07XG5cdHVuaWZvcm0gU3BvdExpZ2h0IHNwb3RMaWdodHNbIE5VTV9TUE9UX0xJR0hUUyBdO1xuXHR2b2lkIGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIFNwb3RMaWdodCBzcG90TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICApIHtcblx0XHR2ZWMzIGxWZWN0b3IgXHgzZCBzcG90TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeS5wb3NpdGlvbjtcblx0XHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gXHgzZCBub3JtYWxpemUoIGxWZWN0b3IgKTtcblx0XHRmbG9hdCBsaWdodERpc3RhbmNlIFx4M2QgbGVuZ3RoKCBsVmVjdG9yICk7XG5cdFx0ZmxvYXQgYW5nbGVDb3MgXHgzZCBkb3QoIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgc3BvdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGlmICggYW5nbGVDb3MgXHgzZSBzcG90TGlnaHQuY29uZUNvcyApIHtcblx0XHRcdGZsb2F0IHNwb3RFZmZlY3QgXHgzZCBzbW9vdGhzdGVwKCBzcG90TGlnaHQuY29uZUNvcywgc3BvdExpZ2h0LnBlbnVtYnJhQ29zLCBhbmdsZUNvcyApO1xuXHRcdFx0ZGlyZWN0TGlnaHQuY29sb3IgXHgzZCBzcG90TGlnaHQuY29sb3I7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciAqXHgzZCBzcG90RWZmZWN0ICogcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggbGlnaHREaXN0YW5jZSwgc3BvdExpZ2h0LmRpc3RhbmNlLCBzcG90TGlnaHQuZGVjYXkgKTtcblx0XHRcdGRpcmVjdExpZ2h0LnZpc2libGUgXHgzZCB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciBceDNkIHZlYzMoIDAuMCApO1xuXHRcdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSBceDNkIGZhbHNlO1xuXHRcdH1cblx0fVxuI2VuZGlmXG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXHgzZSAwXG5cdHN0cnVjdCBSZWN0QXJlYUxpZ2h0IHtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdHZlYzMgcG9zaXRpb247XG5cdFx0dmVjMyBoYWxmV2lkdGg7XG5cdFx0dmVjMyBoYWxmSGVpZ2h0O1xuXHR9O1xuXHR1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMTtcdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18yO1xuXHR1bmlmb3JtIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodHNbIE5VTV9SRUNUX0FSRUFfTElHSFRTIF07XG4jZW5kaWZcbiNpZiBOVU1fSEVNSV9MSUdIVFMgXHgzZSAwXG5cdHN0cnVjdCBIZW1pc3BoZXJlTGlnaHQge1xuXHRcdHZlYzMgZGlyZWN0aW9uO1xuXHRcdHZlYzMgc2t5Q29sb3I7XG5cdFx0dmVjMyBncm91bmRDb2xvcjtcblx0fTtcblx0dW5pZm9ybSBIZW1pc3BoZXJlTGlnaHQgaGVtaXNwaGVyZUxpZ2h0c1sgTlVNX0hFTUlfTElHSFRTIF07XG5cdHZlYzMgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gSGVtaXNwaGVyZUxpZ2h0IGhlbWlMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSApIHtcblx0XHRmbG9hdCBkb3ROTCBceDNkIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoZW1pTGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZmxvYXQgaGVtaURpZmZ1c2VXZWlnaHQgXHgzZCAwLjUgKiBkb3ROTCArIDAuNTtcblx0XHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBtaXgoIGhlbWlMaWdodC5ncm91bmRDb2xvciwgaGVtaUxpZ2h0LnNreUNvbG9yLCBoZW1pRGlmZnVzZVdlaWdodCApO1xuXHRcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdFx0aXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gaXJyYWRpYW5jZTtcblx0fVxuI2VuZGlmIiwKbGlnaHRzX3Bob25nX2ZyYWdtZW50OiJCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWw7XG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgXHgzZCBkaWZmdXNlQ29sb3IucmdiO1xubWF0ZXJpYWwuc3BlY3VsYXJDb2xvciBceDNkIHNwZWN1bGFyO1xubWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgXHgzZCBzaGluaW5lc3M7XG5tYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoIFx4M2Qgc3BlY3VsYXJTdHJlbmd0aDsiLGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50OiJ2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbnN0cnVjdCBCbGlublBob25nTWF0ZXJpYWwge1xuXHR2ZWMzXHRkaWZmdXNlQ29sb3I7XG5cdHZlYzNcdHNwZWN1bGFyQ29sb3I7XG5cdGZsb2F0XHRzcGVjdWxhclNoaW5pbmVzcztcblx0ZmxvYXRcdHNwZWN1bGFyU3RyZW5ndGg7XG59O1xudm9pZCBSRV9EaXJlY3RfQmxpbm5QaG9uZyggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0I2lmZGVmIFRPT05cblx0XHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBnZXRHcmFkaWVudElycmFkaWFuY2UoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0I2Vsc2Vcblx0XHRmbG9hdCBkb3ROTCBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0XHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHQjZW5kaWZcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0aXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0I2VuZGlmXG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgK1x4M2QgaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgK1x4M2QgaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyApICogbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aDtcbn1cbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmcoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG59XG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X0JsaW5uUGhvbmdcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nXG4jZGVmaW5lIE1hdGVyaWFsX0xpZ2h0UHJvYmVMT0QoIG1hdGVyaWFsIClcdCgwKSIsCmxpZ2h0c19waHlzaWNhbF9mcmFnbWVudDoiUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbDtcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciBceDNkIGRpZmZ1c2VDb2xvci5yZ2IgKiAoIDEuMCAtIG1ldGFsbmVzc0ZhY3RvciApO1xubWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgXHgzZCBjbGFtcCggcm91Z2huZXNzRmFjdG9yLCAwLjA0LCAxLjAgKTtcbiNpZmRlZiBSRUZMRUNUSVZJVFlcblx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciBceDNkIG1peCggdmVjMyggTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAqIHBvdzIoIHJlZmxlY3Rpdml0eSApICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xuI2Vsc2Vcblx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciBceDNkIG1peCggdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcbiNlbmRpZlxuI2lmZGVmIENMRUFSQ09BVFxuXHRtYXRlcmlhbC5jbGVhcmNvYXQgXHgzZCBzYXR1cmF0ZSggY2xlYXJjb2F0ICk7XHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgXHgzZCBjbGFtcCggY2xlYXJjb2F0Um91Z2huZXNzLCAwLjA0LCAxLjAgKTtcbiNlbmRpZlxuI2lmZGVmIFVTRV9TSEVFTlxuXHRtYXRlcmlhbC5zaGVlbkNvbG9yIFx4M2Qgc2hlZW47XG4jZW5kaWYiLApsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudDoic3RydWN0IFBoeXNpY2FsTWF0ZXJpYWwge1xuXHR2ZWMzXHRkaWZmdXNlQ29sb3I7XG5cdGZsb2F0XHRzcGVjdWxhclJvdWdobmVzcztcblx0dmVjM1x0c3BlY3VsYXJDb2xvcjtcbiNpZmRlZiBDTEVBUkNPQVRcblx0ZmxvYXQgY2xlYXJjb2F0O1xuXHRmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7XG4jZW5kaWZcbiNpZmRlZiBVU0VfU0hFRU5cblx0dmVjMyBzaGVlbkNvbG9yO1xuI2VuZGlmXG59O1xuI2RlZmluZSBNQVhJTVVNX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMTZcbiNkZWZpbmUgREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCAwLjA0XG5mbG9hdCBjbGVhcmNvYXRESFJBcHByb3goIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkwgKSB7XG5cdHJldHVybiBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICsgKCAxLjAgLSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICkgKiAoIHBvdyggMS4wIC0gZG90TkwsIDUuMCApICogcG93KCAxLjAgLSByb3VnaG5lc3MsIDIuMCApICk7XG59XG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXHgzZSAwXG5cdHZvaWQgUkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsKCBjb25zdCBpbiBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRcdHZlYzMgbm9ybWFsIFx4M2QgZ2VvbWV0cnkubm9ybWFsO1xuXHRcdHZlYzMgdmlld0RpciBceDNkIGdlb21ldHJ5LnZpZXdEaXI7XG5cdFx0dmVjMyBwb3NpdGlvbiBceDNkIGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdHZlYzMgbGlnaHRQb3MgXHgzZCByZWN0QXJlYUxpZ2h0LnBvc2l0aW9uO1xuXHRcdHZlYzMgaGFsZldpZHRoIFx4M2QgcmVjdEFyZWFMaWdodC5oYWxmV2lkdGg7XG5cdFx0dmVjMyBoYWxmSGVpZ2h0IFx4M2QgcmVjdEFyZWFMaWdodC5oYWxmSGVpZ2h0O1xuXHRcdHZlYzMgbGlnaHRDb2xvciBceDNkIHJlY3RBcmVhTGlnaHQuY29sb3I7XG5cdFx0ZmxvYXQgcm91Z2huZXNzIFx4M2QgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3M7XG5cdFx0dmVjMyByZWN0Q29vcmRzWyA0IF07XG5cdFx0cmVjdENvb3Jkc1sgMCBdIFx4M2QgbGlnaHRQb3MgKyBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1x0XHRyZWN0Q29vcmRzWyAxIF0gXHgzZCBsaWdodFBvcyAtIGhhbGZXaWR0aCAtIGhhbGZIZWlnaHQ7XG5cdFx0cmVjdENvb3Jkc1sgMiBdIFx4M2QgbGlnaHRQb3MgLSBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xuXHRcdHJlY3RDb29yZHNbIDMgXSBceDNkIGxpZ2h0UG9zICsgaGFsZldpZHRoICsgaGFsZkhlaWdodDtcblx0XHR2ZWMyIHV2IFx4M2QgTFRDX1V2KCBub3JtYWwsIHZpZXdEaXIsIHJvdWdobmVzcyApO1xuXHRcdHZlYzQgdDEgXHgzZCB0ZXh0dXJlMkQoIGx0Y18xLCB1diApO1xuXHRcdHZlYzQgdDIgXHgzZCB0ZXh0dXJlMkQoIGx0Y18yLCB1diApO1xuXHRcdG1hdDMgbUludiBceDNkIG1hdDMoXG5cdFx0XHR2ZWMzKCB0MS54LCAwLCB0MS55ICksXG5cdFx0XHR2ZWMzKCAgICAwLCAxLCAgICAwICksXG5cdFx0XHR2ZWMzKCB0MS56LCAwLCB0MS53IClcblx0XHQpO1xuXHRcdHZlYzMgZnJlc25lbCBceDNkICggbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciAqIHQyLnggKyAoIHZlYzMoIDEuMCApIC0gbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciApICogdDIueSApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICtceDNkIGxpZ2h0Q29sb3IgKiBmcmVzbmVsICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtSW52LCByZWN0Q29vcmRzICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArXHgzZCBsaWdodENvbG9yICogbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtYXQzKCAxLjAgKSwgcmVjdENvb3JkcyApO1xuXHR9XG4jZW5kaWZcbnZvaWQgUkVfRGlyZWN0X1BoeXNpY2FsKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0ZmxvYXQgZG90TkwgXHgzZCBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdHZlYzMgaXJyYWRpYW5jZSBceDNkIGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdGlycmFkaWFuY2UgKlx4M2QgUEk7XG5cdCNlbmRpZlxuXHQjaWZkZWYgQ0xFQVJDT0FUXG5cdFx0ZmxvYXQgY2NEb3ROTCBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0XHR2ZWMzIGNjSXJyYWRpYW5jZSBceDNkIGNjRG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRcdGNjSXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0XHQjZW5kaWZcblx0XHRmbG9hdCBjbGVhcmNvYXRESFIgXHgzZCBtYXRlcmlhbC5jbGVhcmNvYXQgKiBjbGVhcmNvYXRESFJBcHByb3goIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgY2NEb3ROTCApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICtceDNkIGNjSXJyYWRpYW5jZSAqIG1hdGVyaWFsLmNsZWFyY29hdCAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyApO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGNsZWFyY29hdERIUiBceDNkIDAuMDtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfU0hFRU5cblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArXHgzZCAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfU2hlZW4oXG5cdFx0XHRtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyxcblx0XHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbixcblx0XHRcdGdlb21ldHJ5LFxuXHRcdFx0bWF0ZXJpYWwuc2hlZW5Db2xvclxuXHRcdCk7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgK1x4M2QgKCAxLjAgLSBjbGVhcmNvYXRESFIgKSAqIGlycmFkaWFuY2UgKiBCUkRGX1NwZWN1bGFyX0dHWCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5Lm5vcm1hbCwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MpO1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArXHgzZCAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbnZvaWQgUkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyByYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGNsZWFyY29hdFJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCkge1xuXHQjaWZkZWYgQ0xFQVJDT0FUXG5cdFx0ZmxvYXQgY2NEb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArXHgzZCBjbGVhcmNvYXRSYWRpYW5jZSAqIG1hdGVyaWFsLmNsZWFyY29hdCAqIEJSREZfU3BlY3VsYXJfR0dYX0Vudmlyb25tZW50KCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7XG5cdFx0ZmxvYXQgY2NEb3ROTCBceDNkIGNjRG90TlY7XG5cdFx0ZmxvYXQgY2xlYXJjb2F0REhSIFx4M2QgbWF0ZXJpYWwuY2xlYXJjb2F0ICogY2xlYXJjb2F0REhSQXBwcm94KCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIGNjRG90TkwgKTtcblx0I2Vsc2Vcblx0XHRmbG9hdCBjbGVhcmNvYXRESFIgXHgzZCAwLjA7XG5cdCNlbmRpZlxuXHRmbG9hdCBjbGVhcmNvYXRJbnYgXHgzZCAxLjAgLSBjbGVhcmNvYXRESFI7XG5cdHZlYzMgc2luZ2xlU2NhdHRlcmluZyBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWMzIG11bHRpU2NhdHRlcmluZyBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWMzIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZSBceDNkIGlycmFkaWFuY2UgKiBSRUNJUFJPQ0FMX1BJO1xuXHRCUkRGX1NwZWN1bGFyX011bHRpc2NhdHRlcmluZ19FbnZpcm9ubWVudCggZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLCBzaW5nbGVTY2F0dGVyaW5nLCBtdWx0aVNjYXR0ZXJpbmcgKTtcblx0dmVjMyBkaWZmdXNlIFx4M2QgbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogKCAxLjAgLSAoIHNpbmdsZVNjYXR0ZXJpbmcgKyBtdWx0aVNjYXR0ZXJpbmcgKSApO1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICtceDNkIGNsZWFyY29hdEludiAqIHJhZGlhbmNlICogc2luZ2xlU2NhdHRlcmluZztcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIG11bHRpU2NhdHRlcmluZyAqIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZTtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIGRpZmZ1c2UgKiBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2U7XG59XG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X1BoeXNpY2FsXG4jZGVmaW5lIFJFX0RpcmVjdF9SZWN0QXJlYVx0XHRSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWxcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbFxuI2RlZmluZSBSRV9JbmRpcmVjdFNwZWN1bGFyXHRcdFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWxcbmZsb2F0IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IGFtYmllbnRPY2NsdXNpb24sIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0cmV0dXJuIHNhdHVyYXRlKCBwb3coIGRvdE5WICsgYW1iaWVudE9jY2x1c2lvbiwgZXhwMiggLSAxNi4wICogcm91Z2huZXNzIC0gMS4wICkgKSAtIDEuMCArIGFtYmllbnRPY2NsdXNpb24gKTtcbn0iLApsaWdodHNfZnJhZ21lbnRfYmVnaW46IlxuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeTtcbmdlb21ldHJ5LnBvc2l0aW9uIFx4M2QgLSB2Vmlld1Bvc2l0aW9uO1xuZ2VvbWV0cnkubm9ybWFsIFx4M2Qgbm9ybWFsO1xuZ2VvbWV0cnkudmlld0RpciBceDNkIG5vcm1hbGl6ZSggdlZpZXdQb3NpdGlvbiApO1xuI2lmZGVmIENMRUFSQ09BVFxuXHRnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwgXHgzZCBjbGVhcmNvYXROb3JtYWw7XG4jZW5kaWZcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XG4jaWYgKCBOVU1fUE9JTlRfTElHSFRTIFx4M2UgMCApIFx4MjZceDI2IGRlZmluZWQoIFJFX0RpcmVjdCApXG5cdFBvaW50TGlnaHQgcG9pbnRMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xuXHRcdHBvaW50TGlnaHQgXHgzZCBwb2ludExpZ2h0c1sgaSBdO1xuXHRcdGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBwb2ludExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApIFx4MjZceDI2ICggVU5ST0xMRURfTE9PUF9JTkRFWCBceDNjIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIClcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqXHgzZCBhbGwoIGJ2ZWMyKCBwb2ludExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7XG5cdFx0I2VuZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiAoIE5VTV9TUE9UX0xJR0hUUyBceDNlIDAgKSBceDI2XHgyNiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxuXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHRzcG90TGlnaHQgXHgzZCBzcG90TGlnaHRzWyBpIF07XG5cdFx0Z2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggc3BvdExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApIFx4MjZceDI2ICggVU5ST0xMRURfTE9PUF9JTkRFWCBceDNjIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKVxuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICpceDNkIGFsbCggYnZlYzIoIHNwb3RMaWdodC5zaGFkb3csIGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdFx0I2VuZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiAoIE5VTV9ESVJfTElHSFRTIFx4M2UgMCApIFx4MjZceDI2IGRlZmluZWQoIFJFX0RpcmVjdCApXG5cdERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcblx0XHRkaXJlY3Rpb25hbExpZ2h0IFx4M2QgZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcblx0XHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSBceDI2XHgyNiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggXHgzYyBOVU1fRElSX0xJR0hUX1NIQURPV1MgKVxuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICpceDNkIGFsbCggYnZlYzIoIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93LCBkaXJlY3RMaWdodC52aXNpYmxlICkgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdFx0I2VuZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiAoIE5VTV9SRUNUX0FSRUFfTElHSFRTIFx4M2UgMCApIFx4MjZceDI2IGRlZmluZWQoIFJFX0RpcmVjdF9SZWN0QXJlYSApXG5cdFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fUkVDVF9BUkVBX0xJR0hUUzsgaSArKyApIHtcblx0XHRyZWN0QXJlYUxpZ2h0IFx4M2QgcmVjdEFyZWFMaWdodHNbIGkgXTtcblx0XHRSRV9EaXJlY3RfUmVjdEFyZWEoIHJlY3RBcmVhTGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcblx0fVxuI2VuZGlmXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcblx0dmVjMyBpYmxJcnJhZGlhbmNlIFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzMgaXJyYWRpYW5jZSBceDNkIGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7XG5cdGlycmFkaWFuY2UgK1x4M2QgZ2V0TGlnaHRQcm9iZUlycmFkaWFuY2UoIGxpZ2h0UHJvYmUsIGdlb21ldHJ5ICk7XG5cdCNpZiAoIE5VTV9IRU1JX0xJR0hUUyBceDNlIDAgKVxuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0XHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fSEVNSV9MSUdIVFM7IGkgKysgKSB7XG5cdFx0XHRpcnJhZGlhbmNlICtceDNkIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkgKTtcblx0XHR9XG5cdCNlbmRpZlxuI2VuZGlmXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXG5cdHZlYzMgcmFkaWFuY2UgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjMyBjbGVhcmNvYXRSYWRpYW5jZSBceDNkIHZlYzMoIDAuMCApO1xuI2VuZGlmIiwKbGlnaHRzX2ZyYWdtZW50X21hcHM6IiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHQjaWZkZWYgVVNFX0xJR0hUTUFQXG5cdFx0dmVjMyBsaWdodE1hcElycmFkaWFuY2UgXHgzZCB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XG5cdFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0XHRsaWdodE1hcElycmFkaWFuY2UgKlx4M2QgUEk7XG5cdFx0I2VuZGlmXG5cdFx0aXJyYWRpYW5jZSArXHgzZCBsaWdodE1hcElycmFkaWFuY2U7XG5cdCNlbmRpZlxuXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIFx4MjZceDI2IGRlZmluZWQoIFNUQU5EQVJEICkgXHgyNlx4MjYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXG5cdFx0aWJsSXJyYWRpYW5jZSArXHgzZCBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBnZW9tZXRyeSwgbWF4TWlwTGV2ZWwgKTtcblx0I2VuZGlmXG4jZW5kaWZcbiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgXHgyNlx4MjYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXG5cdHJhZGlhbmNlICtceDNkIGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5ub3JtYWwsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLCBtYXhNaXBMZXZlbCApO1xuXHQjaWZkZWYgQ0xFQVJDT0FUXG5cdFx0Y2xlYXJjb2F0UmFkaWFuY2UgK1x4M2QgZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCBtYXhNaXBMZXZlbCApO1xuXHQjZW5kaWZcbiNlbmRpZiIsCmxpZ2h0c19mcmFnbWVudF9lbmQ6IiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHRSRV9JbmRpcmVjdERpZmZ1c2UoIGlycmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxuXHRSRV9JbmRpcmVjdFNwZWN1bGFyKCByYWRpYW5jZSwgaWJsSXJyYWRpYW5jZSwgY2xlYXJjb2F0UmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcbiNlbmRpZiIsbG9nZGVwdGhidWZfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUYgKSBceDI2XHgyNiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUZfRVhUIClcblx0Z2xfRnJhZ0RlcHRoRVhUIFx4M2QgbG9nMiggdkZyYWdEZXB0aCApICogbG9nRGVwdGhCdWZGQyAqIDAuNTtcbiNlbmRpZiIsbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApIFx4MjZceDI2IGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKVxuXHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XG5cdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDtcbiNlbmRpZiIsCmxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXG5cdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXG5cdFx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcblx0I2VuZGlmXG4jZW5kaWYiLGxvZ2RlcHRoYnVmX3ZlcnRleDoiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxuXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxuXHRcdHZGcmFnRGVwdGggXHgzZCAxLjAgKyBnbF9Qb3NpdGlvbi53O1xuXHQjZWxzZVxuXHRcdGdsX1Bvc2l0aW9uLnogXHgzZCBsb2cyKCBtYXgoIEVQU0lMT04sIGdsX1Bvc2l0aW9uLncgKyAxLjAgKSApICogbG9nRGVwdGhCdWZGQyAtIDEuMDtcblx0XHRnbF9Qb3NpdGlvbi56ICpceDNkIGdsX1Bvc2l0aW9uLnc7XG5cdCNlbmRpZlxuI2VuZGlmIixtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTUFQXG5cdHZlYzQgdGV4ZWxDb2xvciBceDNkIHRleHR1cmUyRCggbWFwLCB2VXYgKTtcblx0dGV4ZWxDb2xvciBceDNkIG1hcFRleGVsVG9MaW5lYXIoIHRleGVsQ29sb3IgKTtcblx0ZGlmZnVzZUNvbG9yICpceDNkIHRleGVsQ29sb3I7XG4jZW5kaWYiLAptYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xuI2VuZGlmIixtYXBfcGFydGljbGVfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTUFQXG5cdHZlYzIgdXYgXHgzZCAoIHV2VHJhbnNmb3JtICogdmVjMyggZ2xfUG9pbnRDb29yZC54LCAxLjAgLSBnbF9Qb2ludENvb3JkLnksIDEgKSApLnh5O1xuXHR2ZWM0IG1hcFRleGVsIFx4M2QgdGV4dHVyZTJEKCBtYXAsIHV2ICk7XG5cdGRpZmZ1c2VDb2xvciAqXHgzZCBtYXBUZXhlbFRvTGluZWFyKCBtYXBUZXhlbCApO1xuI2VuZGlmIixtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xuXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XG4jZW5kaWYiLG1ldGFsbmVzc21hcF9mcmFnbWVudDoiZmxvYXQgbWV0YWxuZXNzRmFjdG9yIFx4M2QgbWV0YWxuZXNzO1xuI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcblx0dmVjNCB0ZXhlbE1ldGFsbmVzcyBceDNkIHRleHR1cmUyRCggbWV0YWxuZXNzTWFwLCB2VXYgKTtcblx0bWV0YWxuZXNzRmFjdG9yICpceDNkIHRleGVsTWV0YWxuZXNzLmI7XG4jZW5kaWYiLAptZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwO1xuI2VuZGlmIixtb3JwaG5vcm1hbF92ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTXG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMCAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07XG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMSAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAxIF07XG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMiAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMyAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07XG4jZW5kaWYiLG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX01PUlBIVEFSR0VUU1xuXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDggXTtcblx0I2Vsc2Vcblx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcblx0I2VuZGlmXG4jZW5kaWYiLAptb3JwaHRhcmdldF92ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQwIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0MSAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDIgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQzIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMyBdO1xuXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDQgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA0IF07XG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQ1IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNSBdO1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0NiAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDYgXTtcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDcgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA3IF07XG5cdCNlbmRpZlxuI2VuZGlmIiwKbm9ybWFsX2ZyYWdtZW50X2JlZ2luOiIjaWZkZWYgRkxBVF9TSEFERURcblx0dmVjMyBmZHggXHgzZCB2ZWMzKCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeCggdlZpZXdQb3NpdGlvbi55ICksIGRGZHgoIHZWaWV3UG9zaXRpb24ueiApICk7XG5cdHZlYzMgZmR5IFx4M2QgdmVjMyggZEZkeSggdlZpZXdQb3NpdGlvbi54ICksIGRGZHkoIHZWaWV3UG9zaXRpb24ueSApLCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnogKSApO1xuXHR2ZWMzIG5vcm1hbCBceDNkIG5vcm1hbGl6ZSggY3Jvc3MoIGZkeCwgZmR5ICkgKTtcbiNlbHNlXG5cdHZlYzMgbm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB2Tm9ybWFsICk7XG5cdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRub3JtYWwgXHgzZCBub3JtYWwgKiAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdCNlbmRpZlxuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2ZWMzIHRhbmdlbnQgXHgzZCBub3JtYWxpemUoIHZUYW5nZW50ICk7XG5cdFx0dmVjMyBiaXRhbmdlbnQgXHgzZCBub3JtYWxpemUoIHZCaXRhbmdlbnQgKTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR0YW5nZW50IFx4M2QgdGFuZ2VudCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHRcdGJpdGFuZ2VudCBceDNkIGJpdGFuZ2VudCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHQjZW5kaWZcblx0I2VuZGlmXG4jZW5kaWZcbnZlYzMgZ2VvbWV0cnlOb3JtYWwgXHgzZCBub3JtYWw7IiwKbm9ybWFsX2ZyYWdtZW50X21hcHM6IiNpZmRlZiBPQkpFQ1RTUEFDRV9OT1JNQUxNQVBcblx0bm9ybWFsIFx4M2QgdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcblx0I2lmZGVmIEZMSVBfU0lERURcblx0XHRub3JtYWwgXHgzZCAtIG5vcm1hbDtcblx0I2VuZGlmXG5cdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRub3JtYWwgXHgzZCBub3JtYWwgKiAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdCNlbmRpZlxuXHRub3JtYWwgXHgzZCBub3JtYWxpemUoIG5vcm1hbE1hdHJpeCAqIG5vcm1hbCApO1xuI2VsaWYgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdG1hdDMgdlRCTiBceDNkIG1hdDMoIHRhbmdlbnQsIGJpdGFuZ2VudCwgbm9ybWFsICk7XG5cdFx0dmVjMyBtYXBOIFx4M2QgdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcblx0XHRtYXBOLnh5IFx4M2Qgbm9ybWFsU2NhbGUgKiBtYXBOLnh5O1xuXHRcdG5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdlRCTiAqIG1hcE4gKTtcblx0I2Vsc2Vcblx0XHRub3JtYWwgXHgzZCBwZXJ0dXJiTm9ybWFsMkFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCwgbm9ybWFsU2NhbGUsIG5vcm1hbE1hcCApO1xuXHQjZW5kaWZcbiNlbGlmIGRlZmluZWQoIFVTRV9CVU1QTUFQIClcblx0bm9ybWFsIFx4M2QgcGVydHVyYk5vcm1hbEFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCwgZEhkeHlfZndkKCkgKTtcbiNlbmRpZiIsCm5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX05PUk1BTE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBub3JtYWxNYXA7XG5cdHVuaWZvcm0gdmVjMiBub3JtYWxTY2FsZTtcbiNlbmRpZlxuI2lmZGVmIE9CSkVDVFNQQUNFX05PUk1BTE1BUFxuXHR1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4O1xuI2VuZGlmXG4jaWYgISBkZWZpbmVkICggVVNFX1RBTkdFTlQgKSBceDI2XHgyNiAoIGRlZmluZWQgKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCAoIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQICkgKVxuXHR2ZWMzIHBlcnR1cmJOb3JtYWwyQXJiKCB2ZWMzIGV5ZV9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIG5vcm1hbFNjYWxlLCBpbiBzYW1wbGVyMkQgbm9ybWFsTWFwICkge1xuXHRcdHZlYzMgcTAgXHgzZCB2ZWMzKCBkRmR4KCBleWVfcG9zLnggKSwgZEZkeCggZXllX3Bvcy55ICksIGRGZHgoIGV5ZV9wb3MueiApICk7XG5cdFx0dmVjMyBxMSBceDNkIHZlYzMoIGRGZHkoIGV5ZV9wb3MueCApLCBkRmR5KCBleWVfcG9zLnkgKSwgZEZkeSggZXllX3Bvcy56ICkgKTtcblx0XHR2ZWMyIHN0MCBceDNkIGRGZHgoIHZVdi5zdCApO1xuXHRcdHZlYzIgc3QxIFx4M2QgZEZkeSggdlV2LnN0ICk7XG5cdFx0ZmxvYXQgc2NhbGUgXHgzZCBzaWduKCBzdDEudCAqIHN0MC5zIC0gc3QwLnQgKiBzdDEucyApO1xuXHRcdHZlYzMgUyBceDNkIG5vcm1hbGl6ZSggKCBxMCAqIHN0MS50IC0gcTEgKiBzdDAudCApICogc2NhbGUgKTtcblx0XHR2ZWMzIFQgXHgzZCBub3JtYWxpemUoICggLSBxMCAqIHN0MS5zICsgcTEgKiBzdDAucyApICogc2NhbGUgKTtcblx0XHR2ZWMzIE4gXHgzZCBub3JtYWxpemUoIHN1cmZfbm9ybSApO1xuXHRcdHZlYzMgbWFwTiBceDNkIHRleHR1cmUyRCggbm9ybWFsTWFwLCB2VXYgKS54eXogKiAyLjAgLSAxLjA7XG5cdFx0bWFwTi54eSAqXHgzZCBub3JtYWxTY2FsZTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2ZWMzIE5mcm9tU1QgXHgzZCBjcm9zcyggUywgVCApO1xuXHRcdFx0aWYoIGRvdCggTmZyb21TVCwgTiApIFx4M2UgMC4wICkge1xuXHRcdFx0XHRTICpceDNkIC0xLjA7XG5cdFx0XHRcdFQgKlx4M2QgLTEuMDtcblx0XHRcdH1cblx0XHQjZWxzZVxuXHRcdFx0bWFwTi54eSAqXHgzZCAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdFx0I2VuZGlmXG5cdFx0bWF0MyB0c24gXHgzZCBtYXQzKCBTLCBULCBOICk7XG5cdFx0cmV0dXJuIG5vcm1hbGl6ZSggdHNuICogbWFwTiApO1xuXHR9XG4jZW5kaWYiLApjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luOiIjaWZkZWYgQ0xFQVJDT0FUXG5cdHZlYzMgY2xlYXJjb2F0Tm9ybWFsIFx4M2QgZ2VvbWV0cnlOb3JtYWw7XG4jZW5kaWYiLGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwczoiI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdG1hdDMgdlRCTiBceDNkIG1hdDMoIHRhbmdlbnQsIGJpdGFuZ2VudCwgY2xlYXJjb2F0Tm9ybWFsICk7XG5cdFx0dmVjMyBtYXBOIFx4M2QgdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcblx0XHRtYXBOLnh5IFx4M2QgY2xlYXJjb2F0Tm9ybWFsU2NhbGUgKiBtYXBOLnh5O1xuXHRcdGNsZWFyY29hdE5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdlRCTiAqIG1hcE4gKTtcblx0I2Vsc2Vcblx0XHRjbGVhcmNvYXROb3JtYWwgXHgzZCBwZXJ0dXJiTm9ybWFsMkFyYiggLSB2Vmlld1Bvc2l0aW9uLCBjbGVhcmNvYXROb3JtYWwsIGNsZWFyY29hdE5vcm1hbFNjYWxlLCBjbGVhcmNvYXROb3JtYWxNYXAgKTtcblx0I2VuZGlmXG4jZW5kaWYiLApjbGVhcmNvYXRfbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXROb3JtYWxNYXA7XG5cdHVuaWZvcm0gdmVjMiBjbGVhcmNvYXROb3JtYWxTY2FsZTtcbiNlbmRpZiIscGFja2luZzoidmVjMyBwYWNrTm9ybWFsVG9SR0IoIGNvbnN0IGluIHZlYzMgbm9ybWFsICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCBub3JtYWwgKSAqIDAuNSArIDAuNTtcbn1cbnZlYzMgdW5wYWNrUkdCVG9Ob3JtYWwoIGNvbnN0IGluIHZlYzMgcmdiICkge1xuXHRyZXR1cm4gMi4wICogcmdiLnh5eiAtIDEuMDtcbn1cbmNvbnN0IGZsb2F0IFBhY2tVcHNjYWxlIFx4M2QgMjU2LiAvIDI1NS47Y29uc3QgZmxvYXQgVW5wYWNrRG93bnNjYWxlIFx4M2QgMjU1LiAvIDI1Ni47XG5jb25zdCB2ZWMzIFBhY2tGYWN0b3JzIFx4M2QgdmVjMyggMjU2LiAqIDI1Ni4gKiAyNTYuLCAyNTYuICogMjU2LiwgIDI1Ni4gKTtcbmNvbnN0IHZlYzQgVW5wYWNrRmFjdG9ycyBceDNkIFVucGFja0Rvd25zY2FsZSAvIHZlYzQoIFBhY2tGYWN0b3JzLCAxLiApO1xuY29uc3QgZmxvYXQgU2hpZnRSaWdodDggXHgzZCAxLiAvIDI1Ni47XG52ZWM0IHBhY2tEZXB0aFRvUkdCQSggY29uc3QgaW4gZmxvYXQgdiApIHtcblx0dmVjNCByIFx4M2QgdmVjNCggZnJhY3QoIHYgKiBQYWNrRmFjdG9ycyApLCB2ICk7XG5cdHIueXp3IC1ceDNkIHIueHl6ICogU2hpZnRSaWdodDg7XHRyZXR1cm4gciAqIFBhY2tVcHNjYWxlO1xufVxuZmxvYXQgdW5wYWNrUkdCQVRvRGVwdGgoIGNvbnN0IGluIHZlYzQgdiApIHtcblx0cmV0dXJuIGRvdCggdiwgVW5wYWNrRmFjdG9ycyApO1xufVxudmVjNCBlbmNvZGVIYWxmUkdCQSAoIHZlYzIgdiApIHtcblx0dmVjNCBlbmNvZGVkIFx4M2QgdmVjNCggMC4wICk7XG5cdGNvbnN0IHZlYzIgb2Zmc2V0IFx4M2QgdmVjMiggMS4wIC8gMjU1LjAsIDAuMCApO1xuXHRlbmNvZGVkLnh5IFx4M2QgdmVjMiggdi54LCBmcmFjdCggdi54ICogMjU1LjAgKSApO1xuXHRlbmNvZGVkLnh5IFx4M2QgZW5jb2RlZC54eSAtICggZW5jb2RlZC55eSAqIG9mZnNldCApO1xuXHRlbmNvZGVkLnp3IFx4M2QgdmVjMiggdi55LCBmcmFjdCggdi55ICogMjU1LjAgKSApO1xuXHRlbmNvZGVkLnp3IFx4M2QgZW5jb2RlZC56dyAtICggZW5jb2RlZC53dyAqIG9mZnNldCApO1xuXHRyZXR1cm4gZW5jb2RlZDtcbn1cbnZlYzIgZGVjb2RlSGFsZlJHQkEoIHZlYzQgdiApIHtcblx0cmV0dXJuIHZlYzIoIHYueCArICggdi55IC8gMjU1LjAgKSwgdi56ICsgKCB2LncgLyAyNTUuMCApICk7XG59XG5mbG9hdCB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiAoIHZpZXdaICsgbmVhciApIC8gKCBuZWFyIC0gZmFyICk7XG59XG5mbG9hdCBvcnRob2dyYXBoaWNEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGxpbmVhckNsaXBaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiBsaW5lYXJDbGlwWiAqICggbmVhciAtIGZhciApIC0gbmVhcjtcbn1cbmZsb2F0IHZpZXdaVG9QZXJzcGVjdGl2ZURlcHRoKCBjb25zdCBpbiBmbG9hdCB2aWV3WiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xuXHRyZXR1cm4gKCggbmVhciArIHZpZXdaICkgKiBmYXIgKSAvICgoIGZhciAtIG5lYXIgKSAqIHZpZXdaICk7XG59XG5mbG9hdCBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgaW52Q2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuICggbmVhciAqIGZhciApIC8gKCAoIGZhciAtIG5lYXIgKSAqIGludkNsaXBaIC0gZmFyICk7XG59IiwKcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudDoiI2lmZGVmIFBSRU1VTFRJUExJRURfQUxQSEFcblx0Z2xfRnJhZ0NvbG9yLnJnYiAqXHgzZCBnbF9GcmFnQ29sb3IuYTtcbiNlbmRpZiIscHJvamVjdF92ZXJ0ZXg6InZlYzQgbXZQb3NpdGlvbiBceDNkIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcbmdsX1Bvc2l0aW9uIFx4M2QgcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247IixkaXRoZXJpbmdfZnJhZ21lbnQ6IiNpZmRlZiBESVRIRVJJTkdcblx0Z2xfRnJhZ0NvbG9yLnJnYiBceDNkIGRpdGhlcmluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xuI2VuZGlmIixkaXRoZXJpbmdfcGFyc19mcmFnbWVudDoiI2lmZGVmIERJVEhFUklOR1xuXHR2ZWMzIGRpdGhlcmluZyggdmVjMyBjb2xvciApIHtcblx0XHRmbG9hdCBncmlkX3Bvc2l0aW9uIFx4M2QgcmFuZCggZ2xfRnJhZ0Nvb3JkLnh5ICk7XG5cdFx0dmVjMyBkaXRoZXJfc2hpZnRfUkdCIFx4M2QgdmVjMyggMC4yNSAvIDI1NS4wLCAtMC4yNSAvIDI1NS4wLCAwLjI1IC8gMjU1LjAgKTtcblx0XHRkaXRoZXJfc2hpZnRfUkdCIFx4M2QgbWl4KCAyLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCAtMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgZ3JpZF9wb3NpdGlvbiApO1xuXHRcdHJldHVybiBjb2xvciArIGRpdGhlcl9zaGlmdF9SR0I7XG5cdH1cbiNlbmRpZiIsCnJvdWdobmVzc21hcF9mcmFnbWVudDoiZmxvYXQgcm91Z2huZXNzRmFjdG9yIFx4M2Qgcm91Z2huZXNzO1xuI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcblx0dmVjNCB0ZXhlbFJvdWdobmVzcyBceDNkIHRleHR1cmUyRCggcm91Z2huZXNzTWFwLCB2VXYgKTtcblx0cm91Z2huZXNzRmFjdG9yICpceDNkIHRleGVsUm91Z2huZXNzLmc7XG4jZW5kaWYiLHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1JPVUdITkVTU01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCByb3VnaG5lc3NNYXA7XG4jZW5kaWYiLHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgc3BvdFNoYWRvd01hcFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2U3BvdFNoYWRvd0Nvb3JkWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgcG9pbnRTaGFkb3dNYXBbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0ZmxvYXQgdGV4dHVyZTJEQ29tcGFyZSggc2FtcGxlcjJEIGRlcHRocywgdmVjMiB1diwgZmxvYXQgY29tcGFyZSApIHtcblx0XHRyZXR1cm4gc3RlcCggY29tcGFyZSwgdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggZGVwdGhzLCB1diApICkgKTtcblx0fVxuXHR2ZWMyIHRleHR1cmUyRERpc3RyaWJ1dGlvbiggc2FtcGxlcjJEIHNoYWRvdywgdmVjMiB1diApIHtcblx0XHRyZXR1cm4gZGVjb2RlSGFsZlJHQkEoIHRleHR1cmUyRCggc2hhZG93LCB1diApICk7XG5cdH1cblx0ZmxvYXQgVlNNU2hhZG93IChzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICl7XG5cdFx0ZmxvYXQgb2NjbHVzaW9uIFx4M2QgMS4wO1xuXHRcdHZlYzIgZGlzdHJpYnV0aW9uIFx4M2QgdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzaGFkb3csIHV2ICk7XG5cdFx0ZmxvYXQgaGFyZF9zaGFkb3cgXHgzZCBzdGVwKCBjb21wYXJlICwgZGlzdHJpYnV0aW9uLnggKTtcblx0XHRpZiAoaGFyZF9zaGFkb3cgIVx4M2QgMS4wICkge1xuXHRcdFx0ZmxvYXQgZGlzdGFuY2UgXHgzZCBjb21wYXJlIC0gZGlzdHJpYnV0aW9uLnggO1xuXHRcdFx0ZmxvYXQgdmFyaWFuY2UgXHgzZCBtYXgoIDAuMDAwMDAsIGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKTtcblx0XHRcdGZsb2F0IHNvZnRuZXNzX3Byb2JhYmlsaXR5IFx4M2QgdmFyaWFuY2UgLyAodmFyaWFuY2UgKyBkaXN0YW5jZSAqIGRpc3RhbmNlICk7XHRcdFx0c29mdG5lc3NfcHJvYmFiaWxpdHkgXHgzZCBjbGFtcCggKCBzb2Z0bmVzc19wcm9iYWJpbGl0eSAtIDAuMyApIC8gKCAwLjk1IC0gMC4zICksIDAuMCwgMS4wICk7XHRcdFx0b2NjbHVzaW9uIFx4M2QgY2xhbXAoIG1heCggaGFyZF9zaGFkb3csIHNvZnRuZXNzX3Byb2JhYmlsaXR5ICksIDAuMCwgMS4wICk7XG5cdFx0fVxuXHRcdHJldHVybiBvY2NsdXNpb247XG5cdH1cblx0ZmxvYXQgdGV4dHVyZTJEU2hhZG93TGVycCggc2FtcGxlcjJEIGRlcHRocywgdmVjMiBzaXplLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkge1xuXHRcdGNvbnN0IHZlYzIgb2Zmc2V0IFx4M2QgdmVjMiggMC4wLCAxLjAgKTtcblx0XHR2ZWMyIHRleGVsU2l6ZSBceDNkIHZlYzIoIDEuMCApIC8gc2l6ZTtcblx0XHR2ZWMyIGNlbnRyb2lkVVYgXHgzZCAoIGZsb29yKCB1diAqIHNpemUgLSAwLjUgKSArIDAuNSApICogdGV4ZWxTaXplO1xuXHRcdGZsb2F0IGxiIFx4M2QgdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnh4LCBjb21wYXJlICk7XG5cdFx0ZmxvYXQgbHQgXHgzZCB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueHksIGNvbXBhcmUgKTtcblx0XHRmbG9hdCByYiBceDNkIHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC55eCwgY29tcGFyZSApO1xuXHRcdGZsb2F0IHJ0IFx4M2QgdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnl5LCBjb21wYXJlICk7XG5cdFx0dmVjMiBmIFx4M2QgZnJhY3QoIHV2ICogc2l6ZSArIDAuNSApO1xuXHRcdGZsb2F0IGEgXHgzZCBtaXgoIGxiLCBsdCwgZi55ICk7XG5cdFx0ZmxvYXQgYiBceDNkIG1peCggcmIsIHJ0LCBmLnkgKTtcblx0XHRmbG9hdCBjIFx4M2QgbWl4KCBhLCBiLCBmLnggKTtcblx0XHRyZXR1cm4gYztcblx0fVxuXHRmbG9hdCBnZXRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkICkge1xuXHRcdGZsb2F0IHNoYWRvdyBceDNkIDEuMDtcblx0XHRzaGFkb3dDb29yZC54eXogL1x4M2Qgc2hhZG93Q29vcmQudztcblx0XHRzaGFkb3dDb29yZC56ICtceDNkIHNoYWRvd0JpYXM7XG5cdFx0YnZlYzQgaW5GcnVzdHVtVmVjIFx4M2QgYnZlYzQgKCBzaGFkb3dDb29yZC54IFx4M2VceDNkIDAuMCwgc2hhZG93Q29vcmQueCBceDNjXHgzZCAxLjAsIHNoYWRvd0Nvb3JkLnkgXHgzZVx4M2QgMC4wLCBzaGFkb3dDb29yZC55IFx4M2NceDNkIDEuMCApO1xuXHRcdGJvb2wgaW5GcnVzdHVtIFx4M2QgYWxsKCBpbkZydXN0dW1WZWMgKTtcblx0XHRidmVjMiBmcnVzdHVtVGVzdFZlYyBceDNkIGJ2ZWMyKCBpbkZydXN0dW0sIHNoYWRvd0Nvb3JkLnogXHgzY1x4M2QgMS4wICk7XG5cdFx0Ym9vbCBmcnVzdHVtVGVzdCBceDNkIGFsbCggZnJ1c3R1bVRlc3RWZWMgKTtcblx0XHRpZiAoIGZydXN0dW1UZXN0ICkge1xuXHRcdCNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKVxuXHRcdFx0dmVjMiB0ZXhlbFNpemUgXHgzZCB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XG5cdFx0XHRmbG9hdCBkeDAgXHgzZCAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHkwIFx4M2QgLSB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR4MSBceDNkICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTEgXHgzZCArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHgyIFx4M2QgZHgwIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHkyIFx4M2QgZHkwIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHgzIFx4M2QgZHgxIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHkzIFx4M2QgZHkxIC8gMi4wO1xuXHRcdFx0c2hhZG93IFx4M2QgKFxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgzLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApXG5cdFx0XHQpICogKCAxLjAgLyAxNy4wICk7XG5cdFx0I2VsaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKVxuXHRcdFx0dmVjMiB0ZXhlbFNpemUgXHgzZCB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XG5cdFx0XHRmbG9hdCBkeDAgXHgzZCAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHkwIFx4M2QgLSB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR4MSBceDNkICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTEgXHgzZCArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0c2hhZG93IFx4M2QgKFxuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkxICksIHNoYWRvd0Nvb3JkLnogKVxuXHRcdFx0KSAqICggMS4wIC8gOS4wICk7XG5cdFx0I2VsaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfVlNNIClcblx0XHRcdHNoYWRvdyBceDNkIFZTTVNoYWRvdyggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApO1xuXHRcdCNlbHNlXG5cdFx0XHRzaGFkb3cgXHgzZCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XG5cdFx0I2VuZGlmXG5cdFx0fVxuXHRcdHJldHVybiBzaGFkb3c7XG5cdH1cblx0dmVjMiBjdWJlVG9VViggdmVjMyB2LCBmbG9hdCB0ZXhlbFNpemVZICkge1xuXHRcdHZlYzMgYWJzViBceDNkIGFicyggdiApO1xuXHRcdGZsb2F0IHNjYWxlVG9DdWJlIFx4M2QgMS4wIC8gbWF4KCBhYnNWLngsIG1heCggYWJzVi55LCBhYnNWLnogKSApO1xuXHRcdGFic1YgKlx4M2Qgc2NhbGVUb0N1YmU7XG5cdFx0diAqXHgzZCBzY2FsZVRvQ3ViZSAqICggMS4wIC0gMi4wICogdGV4ZWxTaXplWSApO1xuXHRcdHZlYzIgcGxhbmFyIFx4M2Qgdi54eTtcblx0XHRmbG9hdCBhbG1vc3RBVGV4ZWwgXHgzZCAxLjUgKiB0ZXhlbFNpemVZO1xuXHRcdGZsb2F0IGFsbW9zdE9uZSBceDNkIDEuMCAtIGFsbW9zdEFUZXhlbDtcblx0XHRpZiAoIGFic1YueiBceDNlXHgzZCBhbG1vc3RPbmUgKSB7XG5cdFx0XHRpZiAoIHYueiBceDNlIDAuMCApXG5cdFx0XHRcdHBsYW5hci54IFx4M2QgNC4wIC0gdi54O1xuXHRcdH0gZWxzZSBpZiAoIGFic1YueCBceDNlXHgzZCBhbG1vc3RPbmUgKSB7XG5cdFx0XHRmbG9hdCBzaWduWCBceDNkIHNpZ24oIHYueCApO1xuXHRcdFx0cGxhbmFyLnggXHgzZCB2LnogKiBzaWduWCArIDIuMCAqIHNpZ25YO1xuXHRcdH0gZWxzZSBpZiAoIGFic1YueSBceDNlXHgzZCBhbG1vc3RPbmUgKSB7XG5cdFx0XHRmbG9hdCBzaWduWSBceDNkIHNpZ24oIHYueSApO1xuXHRcdFx0cGxhbmFyLnggXHgzZCB2LnggKyAyLjAgKiBzaWduWSArIDIuMDtcblx0XHRcdHBsYW5hci55IFx4M2Qgdi56ICogc2lnblkgLSAyLjA7XG5cdFx0fVxuXHRcdHJldHVybiB2ZWMyKCAwLjEyNSwgMC4yNSApICogcGxhbmFyICsgdmVjMiggMC4zNzUsIDAuNzUgKTtcblx0fVxuXHRmbG9hdCBnZXRQb2ludFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQsIGZsb2F0IHNoYWRvd0NhbWVyYU5lYXIsIGZsb2F0IHNoYWRvd0NhbWVyYUZhciApIHtcblx0XHR2ZWMyIHRleGVsU2l6ZSBceDNkIHZlYzIoIDEuMCApIC8gKCBzaGFkb3dNYXBTaXplICogdmVjMiggNC4wLCAyLjAgKSApO1xuXHRcdHZlYzMgbGlnaHRUb1Bvc2l0aW9uIFx4M2Qgc2hhZG93Q29vcmQueHl6O1xuXHRcdGZsb2F0IGRwIFx4M2QgKCBsZW5ndGgoIGxpZ2h0VG9Qb3NpdGlvbiApIC0gc2hhZG93Q2FtZXJhTmVhciApIC8gKCBzaGFkb3dDYW1lcmFGYXIgLSBzaGFkb3dDYW1lcmFOZWFyICk7XHRcdGRwICtceDNkIHNoYWRvd0JpYXM7XG5cdFx0dmVjMyBiZDNEIFx4M2Qgbm9ybWFsaXplKCBsaWdodFRvUG9zaXRpb24gKTtcblx0XHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9WU00gKVxuXHRcdFx0dmVjMiBvZmZzZXQgXHgzZCB2ZWMyKCAtIDEsIDEgKSAqIHNoYWRvd1JhZGl1cyAqIHRleGVsU2l6ZS55O1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh4LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHgsIHRleGVsU2l6ZS55ICksIGRwIClcblx0XHRcdCkgKiAoIDEuMCAvIDkuMCApO1xuXHRcdCNlbHNlXG5cdFx0XHRyZXR1cm4gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSwgZHAgKTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmIiwKc2hhZG93bWFwX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRcdHVuaWZvcm0gbWF0NCBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRcdHVuaWZvcm0gbWF0NCBzcG90U2hhZG93TWF0cml4WyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZTcG90U2hhZG93Q29vcmRbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0XHR1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcbiNlbmRpZiIsCnNoYWRvd21hcF92ZXJ0ZXg6IiNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX0RJUl9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gXHgzZCBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgaSBdICogd29ybGRQb3NpdGlvbjtcblx0fVxuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1NQT1RfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHR2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gXHgzZCBzcG90U2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0dlBvaW50U2hhZG93Q29vcmRbIGkgXSBceDNkIHBvaW50U2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNlbmRpZlxuI2VuZGlmIiwKc2hhZG93bWFza19wYXJzX2ZyYWdtZW50OiJmbG9hdCBnZXRTaGFkb3dNYXNrKCkge1xuXHRmbG9hdCBzaGFkb3cgXHgzZCAxLjA7XG5cdCNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fRElSX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0ZGlyZWN0aW9uYWxMaWdodCBceDNkIGRpcmVjdGlvbmFsTGlnaHRzWyBpIF07XG5cdFx0c2hhZG93ICpceDNkIGJvb2woIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93ICkgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xuXHR9XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0U3BvdExpZ2h0IHNwb3RMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHNwb3RMaWdodCBceDNkIHNwb3RMaWdodHNbIGkgXTtcblx0XHRzaGFkb3cgKlx4M2QgYm9vbCggc3BvdExpZ2h0LnNoYWRvdyApID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdH1cblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHBvaW50TGlnaHQgXHgzZCBwb2ludExpZ2h0c1sgaSBdO1xuXHRcdHNoYWRvdyAqXHgzZCBib29sKCBwb2ludExpZ2h0LnNoYWRvdyApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xuXHR9XG5cdCNlbmRpZlxuXHQjZW5kaWZcblx0cmV0dXJuIHNoYWRvdztcbn0iLApza2luYmFzZV92ZXJ0ZXg6IiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0bWF0NCBib25lTWF0WCBceDNkIGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC54ICk7XG5cdG1hdDQgYm9uZU1hdFkgXHgzZCBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueSApO1xuXHRtYXQ0IGJvbmVNYXRaIFx4M2QgZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnogKTtcblx0bWF0NCBib25lTWF0VyBceDNkIGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC53ICk7XG4jZW5kaWYiLHNraW5uaW5nX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdHVuaWZvcm0gbWF0NCBiaW5kTWF0cml4O1xuXHR1bmlmb3JtIG1hdDQgYmluZE1hdHJpeEludmVyc2U7XG5cdCNpZmRlZiBCT05FX1RFWFRVUkVcblx0XHR1bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCBib25lVGV4dHVyZTtcblx0XHR1bmlmb3JtIGludCBib25lVGV4dHVyZVNpemU7XG5cdFx0bWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xuXHRcdFx0ZmxvYXQgaiBceDNkIGkgKiA0LjA7XG5cdFx0XHRmbG9hdCB4IFx4M2QgbW9kKCBqLCBmbG9hdCggYm9uZVRleHR1cmVTaXplICkgKTtcblx0XHRcdGZsb2F0IHkgXHgzZCBmbG9vciggaiAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKSApO1xuXHRcdFx0ZmxvYXQgZHggXHgzZCAxLjAgLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICk7XG5cdFx0XHRmbG9hdCBkeSBceDNkIDEuMCAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKTtcblx0XHRcdHkgXHgzZCBkeSAqICggeSArIDAuNSApO1xuXHRcdFx0dmVjNCB2MSBceDNkIHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMC41ICksIHkgKSApO1xuXHRcdFx0dmVjNCB2MiBceDNkIHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMS41ICksIHkgKSApO1xuXHRcdFx0dmVjNCB2MyBceDNkIHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMi41ICksIHkgKSApO1xuXHRcdFx0dmVjNCB2NCBceDNkIHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMy41ICksIHkgKSApO1xuXHRcdFx0bWF0NCBib25lIFx4M2QgbWF0NCggdjEsIHYyLCB2MywgdjQgKTtcblx0XHRcdHJldHVybiBib25lO1xuXHRcdH1cblx0I2Vsc2Vcblx0XHR1bmlmb3JtIG1hdDQgYm9uZU1hdHJpY2VzWyBNQVhfQk9ORVMgXTtcblx0XHRtYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7XG5cdFx0XHRtYXQ0IGJvbmUgXHgzZCBib25lTWF0cmljZXNbIGludChpKSBdO1xuXHRcdFx0cmV0dXJuIGJvbmU7XG5cdFx0fVxuXHQjZW5kaWZcbiNlbmRpZiIsCnNraW5uaW5nX3ZlcnRleDoiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHR2ZWM0IHNraW5WZXJ0ZXggXHgzZCBiaW5kTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuXHR2ZWM0IHNraW5uZWQgXHgzZCB2ZWM0KCAwLjAgKTtcblx0c2tpbm5lZCArXHgzZCBib25lTWF0WCAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lng7XG5cdHNraW5uZWQgK1x4M2QgYm9uZU1hdFkgKiBza2luVmVydGV4ICogc2tpbldlaWdodC55O1xuXHRza2lubmVkICtceDNkIGJvbmVNYXRaICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQuejtcblx0c2tpbm5lZCArXHgzZCBib25lTWF0VyAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnc7XG5cdHRyYW5zZm9ybWVkIFx4M2QgKCBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5uZWQgKS54eXo7XG4jZW5kaWYiLHNraW5ub3JtYWxfdmVydGV4OiIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdG1hdDQgc2tpbk1hdHJpeCBceDNkIG1hdDQoIDAuMCApO1xuXHRza2luTWF0cml4ICtceDNkIHNraW5XZWlnaHQueCAqIGJvbmVNYXRYO1xuXHRza2luTWF0cml4ICtceDNkIHNraW5XZWlnaHQueSAqIGJvbmVNYXRZO1xuXHRza2luTWF0cml4ICtceDNkIHNraW5XZWlnaHQueiAqIGJvbmVNYXRaO1xuXHRza2luTWF0cml4ICtceDNkIHNraW5XZWlnaHQudyAqIGJvbmVNYXRXO1xuXHRza2luTWF0cml4ICBceDNkIGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbk1hdHJpeCAqIGJpbmRNYXRyaXg7XG5cdG9iamVjdE5vcm1hbCBceDNkIHZlYzQoIHNraW5NYXRyaXggKiB2ZWM0KCBvYmplY3ROb3JtYWwsIDAuMCApICkueHl6O1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHRvYmplY3RUYW5nZW50IFx4M2QgdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdFRhbmdlbnQsIDAuMCApICkueHl6O1xuXHQjZW5kaWZcbiNlbmRpZiIsCnNwZWN1bGFybWFwX2ZyYWdtZW50OiJmbG9hdCBzcGVjdWxhclN0cmVuZ3RoO1xuI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxuXHR2ZWM0IHRleGVsU3BlY3VsYXIgXHgzZCB0ZXh0dXJlMkQoIHNwZWN1bGFyTWFwLCB2VXYgKTtcblx0c3BlY3VsYXJTdHJlbmd0aCBceDNkIHRleGVsU3BlY3VsYXIucjtcbiNlbHNlXG5cdHNwZWN1bGFyU3RyZW5ndGggXHgzZCAxLjA7XG4jZW5kaWYiLHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgc3BlY3VsYXJNYXA7XG4jZW5kaWYiLHRvbmVtYXBwaW5nX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVE9ORV9NQVBQSU5HIClcblx0Z2xfRnJhZ0NvbG9yLnJnYiBceDNkIHRvbmVNYXBwaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7XG4jZW5kaWYiLHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IiNpZm5kZWYgc2F0dXJhdGVcblx0I2RlZmluZSBzYXR1cmF0ZShhKSBjbGFtcCggYSwgMC4wLCAxLjAgKVxuI2VuZGlmXG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nV2hpdGVQb2ludDtcbnZlYzMgTGluZWFyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdHJldHVybiB0b25lTWFwcGluZ0V4cG9zdXJlICogY29sb3I7XG59XG52ZWMzIFJlaW5oYXJkVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICpceDNkIHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggY29sb3IgLyAoIHZlYzMoIDEuMCApICsgY29sb3IgKSApO1xufVxuI2RlZmluZSBVbmNoYXJ0ZWQySGVscGVyKCB4ICkgbWF4KCAoICggeCAqICggMC4xNSAqIHggKyAwLjEwICogMC41MCApICsgMC4yMCAqIDAuMDIgKSAvICggeCAqICggMC4xNSAqIHggKyAwLjUwICkgKyAwLjIwICogMC4zMCApICkgLSAwLjAyIC8gMC4zMCwgdmVjMyggMC4wICkgKVxudmVjMyBVbmNoYXJ0ZWQyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICpceDNkIHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggVW5jaGFydGVkMkhlbHBlciggY29sb3IgKSAvIFVuY2hhcnRlZDJIZWxwZXIoIHZlYzMoIHRvbmVNYXBwaW5nV2hpdGVQb2ludCApICkgKTtcbn1cbnZlYzMgT3B0aW1pemVkQ2luZW9uVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICpceDNkIHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdGNvbG9yIFx4M2QgbWF4KCB2ZWMzKCAwLjAgKSwgY29sb3IgLSAwLjAwNCApO1xuXHRyZXR1cm4gcG93KCAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDAuNSApICkgLyAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDEuNyApICsgMC4wNiApLCB2ZWMzKCAyLjIgKSApO1xufVxudmVjMyBBQ0VTRmlsbWljVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICpceDNkIHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggKCBjb2xvciAqICggMi41MSAqIGNvbG9yICsgMC4wMyApICkgLyAoIGNvbG9yICogKCAyLjQzICogY29sb3IgKyAwLjU5ICkgKyAwLjE0ICkgKTtcbn0iLAp1dl9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1VWXG5cdHZhcnlpbmcgdmVjMiB2VXY7XG4jZW5kaWYiLHV2X3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX1VWXG5cdHZhcnlpbmcgdmVjMiB2VXY7XG5cdHVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcbiNlbmRpZiIsdXZfdmVydGV4OiIjaWZkZWYgVVNFX1VWXG5cdHZVdiBceDNkICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XG4jZW5kaWYiLHV2Ml9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcblx0dmFyeWluZyB2ZWMyIHZVdjI7XG4jZW5kaWYiLHV2Ml9wYXJzX3ZlcnRleDoiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXG5cdGF0dHJpYnV0ZSB2ZWMyIHV2Mjtcblx0dmFyeWluZyB2ZWMyIHZVdjI7XG4jZW5kaWYiLHV2Ml92ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxuXHR2VXYyIFx4M2QgdXYyO1xuI2VuZGlmIiwKd29ybGRwb3NfdmVydGV4OiIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQoIERJU1RBTkNFICkgfHwgZGVmaW5lZCAoIFVTRV9TSEFET1dNQVAgKVxuXHR2ZWM0IHdvcmxkUG9zaXRpb24gXHgzZCBtb2RlbE1hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcbiNlbmRpZiIsYmFja2dyb3VuZF9mcmFnOiJ1bmlmb3JtIHNhbXBsZXIyRCB0MkQ7XG52YXJ5aW5nIHZlYzIgdlV2O1xudm9pZCBtYWluKCkge1xuXHR2ZWM0IHRleENvbG9yIFx4M2QgdGV4dHVyZTJEKCB0MkQsIHZVdiApO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCBtYXBUZXhlbFRvTGluZWFyKCB0ZXhDb2xvciApO1xuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG59IixiYWNrZ3JvdW5kX3ZlcnQ6InZhcnlpbmcgdmVjMiB2VXY7XG51bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XG52b2lkIG1haW4oKSB7XG5cdHZVdiBceDNkICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XG5cdGdsX1Bvc2l0aW9uIFx4M2QgdmVjNCggcG9zaXRpb24ueHksIDEuMCwgMS4wICk7XG59IiwKY3ViZV9mcmFnOiJ1bmlmb3JtIHNhbXBsZXJDdWJlIHRDdWJlO1xudW5pZm9ybSBmbG9hdCB0RmxpcDtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG52b2lkIG1haW4oKSB7XG5cdHZlYzQgdGV4Q29sb3IgXHgzZCB0ZXh0dXJlQ3ViZSggdEN1YmUsIHZlYzMoIHRGbGlwICogdldvcmxkRGlyZWN0aW9uLngsIHZXb3JsZERpcmVjdGlvbi55eiApICk7XG5cdGdsX0ZyYWdDb2xvciBceDNkIG1hcFRleGVsVG9MaW5lYXIoIHRleENvbG9yICk7XG5cdGdsX0ZyYWdDb2xvci5hICpceDNkIG9wYWNpdHk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcbn0iLGN1YmVfdmVydDoidmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZERpcmVjdGlvbiBceDNkIHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0Z2xfUG9zaXRpb24ueiBceDNkIGdsX1Bvc2l0aW9uLnc7XG59IiwKZGVwdGhfZnJhZzoiI2lmIERFUFRIX1BBQ0tJTkcgXHgzZFx4M2QgMzIwMFxuXHR1bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCAxLjAgKTtcblx0I2lmIERFUFRIX1BBQ0tJTkcgXHgzZFx4M2QgMzIwMFxuXHRcdGRpZmZ1c2VDb2xvci5hIFx4M2Qgb3BhY2l0eTtcblx0I2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaWYgREVQVEhfUEFDS0lORyBceDNkXHgzZCAzMjAwXG5cdFx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggdmVjMyggMS4wIC0gZ2xfRnJhZ0Nvb3JkLnogKSwgb3BhY2l0eSApO1xuXHQjZWxpZiBERVBUSF9QQUNLSU5HIFx4M2RceDNkIDMyMDFcblx0XHRnbF9GcmFnQ29sb3IgXHgzZCBwYWNrRGVwdGhUb1JHQkEoIGdsX0ZyYWdDb29yZC56ICk7XG5cdCNlbmRpZlxufSIsCmRlcHRoX3ZlcnQ6IiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0XHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHRcdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdFx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG59IiwKZGlzdGFuY2VSR0JBX2ZyYWc6IiNkZWZpbmUgRElTVEFOQ0VcbnVuaWZvcm0gdmVjMyByZWZlcmVuY2VQb3NpdGlvbjtcbnVuaWZvcm0gZmxvYXQgbmVhckRpc3RhbmNlO1xudW5pZm9ybSBmbG9hdCBmYXJEaXN0YW5jZTtcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4gKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIDEuMCApO1xuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdGZsb2F0IGRpc3QgXHgzZCBsZW5ndGgoIHZXb3JsZFBvc2l0aW9uIC0gcmVmZXJlbmNlUG9zaXRpb24gKTtcblx0ZGlzdCBceDNkICggZGlzdCAtIG5lYXJEaXN0YW5jZSApIC8gKCBmYXJEaXN0YW5jZSAtIG5lYXJEaXN0YW5jZSApO1xuXHRkaXN0IFx4M2Qgc2F0dXJhdGUoIGRpc3QgKTtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgcGFja0RlcHRoVG9SR0JBKCBkaXN0ICk7XG59IiwKZGlzdGFuY2VSR0JBX3ZlcnQ6IiNkZWZpbmUgRElTVEFOQ0VcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0XHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHRcdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdFx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdHZXb3JsZFBvc2l0aW9uIFx4M2Qgd29ybGRQb3NpdGlvbi54eXo7XG59IiwKZXF1aXJlY3RfZnJhZzoidW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0O1xudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG52b2lkIG1haW4oKSB7XG5cdHZlYzMgZGlyZWN0aW9uIFx4M2Qgbm9ybWFsaXplKCB2V29ybGREaXJlY3Rpb24gKTtcblx0dmVjMiBzYW1wbGVVVjtcblx0c2FtcGxlVVYueSBceDNkIGFzaW4oIGNsYW1wKCBkaXJlY3Rpb24ueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xuXHRzYW1wbGVVVi54IFx4M2QgYXRhbiggZGlyZWN0aW9uLnosIGRpcmVjdGlvbi54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcblx0dmVjNCB0ZXhDb2xvciBceDNkIHRleHR1cmUyRCggdEVxdWlyZWN0LCBzYW1wbGVVViApO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCBtYXBUZXhlbFRvTGluZWFyKCB0ZXhDb2xvciApO1xuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG59IiwKZXF1aXJlY3RfdmVydDoidmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZERpcmVjdGlvbiBceDNkIHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcbn0iLGxpbmVkYXNoZWRfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG51bmlmb3JtIGZsb2F0IGRhc2hTaXplO1xudW5pZm9ybSBmbG9hdCB0b3RhbFNpemU7XG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0aWYgKCBtb2QoIHZMaW5lRGlzdGFuY2UsIHRvdGFsU2l6ZSApIFx4M2UgZGFzaFNpemUgKSB7XG5cdFx0ZGlzY2FyZDtcblx0fVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHRvdXRnb2luZ0xpZ2h0IFx4M2QgZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLApsaW5lZGFzaGVkX3ZlcnQ6InVuaWZvcm0gZmxvYXQgc2NhbGU7XG5hdHRyaWJ1dGUgZmxvYXQgbGluZURpc3RhbmNlO1xudmFyeWluZyBmbG9hdCB2TGluZURpc3RhbmNlO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHR2TGluZURpc3RhbmNlIFx4M2Qgc2NhbGUgKiBsaW5lRGlzdGFuY2U7XG5cdHZlYzQgbXZQb3NpdGlvbiBceDNkIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcblx0Z2xfUG9zaXRpb24gXHgzZCBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCm1lc2hiYXNpY19mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYW9tYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NsaWdodG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9jb21tb25fcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Njb2xvcl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjc3BlY3VsYXJtYXBfZnJhZ21lbnRceDNlXG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0IFx4M2QgUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdCNpZmRlZiBVU0VfTElHSFRNQVBcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApLnh5eiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xuXHQjZWxzZVxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArXHgzZCB2ZWMzKCAxLjAgKTtcblx0I2VuZGlmXG5cdCNpbmNsdWRlIFx4M2Nhb21hcF9mcmFnbWVudFx4M2Vcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICpceDNkIGRpZmZ1c2VDb2xvci5yZ2I7XG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZTtcblx0I2luY2x1ZGUgXHgzY2Vudm1hcF9mcmFnbWVudFx4M2Vcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNoYmFzaWNfdmVydDoiI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2N1djJfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N1djJfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaWZkZWYgVVNFX0VOVk1BUFxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2Vcblx0I2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcbn0iLAptZXNobGFtYmVydF9mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnZhcnlpbmcgdmVjMyB2TGlnaHRGcm9udDtcbnZhcnlpbmcgdmVjMyB2SW5kaXJlY3RGcm9udDtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dmFyeWluZyB2ZWMzIHZMaWdodEJhY2s7XG5cdHZhcnlpbmcgdmVjMyB2SW5kaXJlY3RCYWNrO1xuI2VuZGlmXG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3BhY2tpbmdceDNlXG4jaW5jbHVkZSBceDNjZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYW9tYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NsaWdodG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2VtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2JzZGZzXHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0c19wYXJzX2JlZ2luXHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hc2tfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCBceDNkIFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSBceDNkIGVtaXNzaXZlO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Njb2xvcl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjc3BlY3VsYXJtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbWlzc2l2ZW1hcF9mcmFnbWVudFx4M2Vcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlIFx4M2QgZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArXHgzZCAoIGdsX0Zyb250RmFjaW5nICkgPyB2SW5kaXJlY3RGcm9udCA6IHZJbmRpcmVjdEJhY2s7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIHZJbmRpcmVjdEZyb250O1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2xpZ2h0bWFwX2ZyYWdtZW50XHgzZVxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKlx4M2QgQlJERl9EaWZmdXNlX0xhbWJlcnQoIGRpZmZ1c2VDb2xvci5yZ2IgKTtcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgXHgzZCAoIGdsX0Zyb250RmFjaW5nICkgPyB2TGlnaHRGcm9udCA6IHZMaWdodEJhY2s7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSBceDNkIHZMaWdodEZyb250O1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSAqXHgzZCBCUkRGX0RpZmZ1c2VfTGFtYmVydCggZGlmZnVzZUNvbG9yLnJnYiApICogZ2V0U2hhZG93TWFzaygpO1xuXHQjaW5jbHVkZSBceDNjYW9tYXBfZnJhZ21lbnRceDNlXG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfZnJhZ21lbnRceDNlXG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfZnJhZ21lbnRceDNlXG59IiwKbWVzaGxhbWJlcnRfdmVydDoiI2RlZmluZSBMQU1CRVJUXG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XG52YXJ5aW5nIHZlYzMgdkluZGlyZWN0RnJvbnQ7XG4jaWZkZWYgRE9VQkxFX1NJREVEXG5cdHZhcnlpbmcgdmVjMyB2TGlnaHRCYWNrO1xuXHR2YXJ5aW5nIHZlYzMgdkluZGlyZWN0QmFjaztcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2N1djJfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2JzZGZzXHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0c19wYXJzX2JlZ2luXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjdXYyX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGVmYXVsdG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2xhbWJlcnRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2hhZG93bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKbWVzaG1hdGNhcF9mcmFnOiIjZGVmaW5lIE1BVENBUFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG51bmlmb3JtIHNhbXBsZXIyRCBtYXRjYXA7XG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NhbHBoYW1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2J1bXBtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nub3JtYWxtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfbWFwc1x4M2Vcblx0dmVjMyB2aWV3RGlyIFx4M2Qgbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XG5cdHZlYzMgeCBceDNkIG5vcm1hbGl6ZSggdmVjMyggdmlld0Rpci56LCAwLjAsIC0gdmlld0Rpci54ICkgKTtcblx0dmVjMyB5IFx4M2QgY3Jvc3MoIHZpZXdEaXIsIHggKTtcblx0dmVjMiB1diBceDNkIHZlYzIoIGRvdCggeCwgbm9ybWFsICksIGRvdCggeSwgbm9ybWFsICkgKSAqIDAuNDk1ICsgMC41O1xuXHQjaWZkZWYgVVNFX01BVENBUFxuXHRcdHZlYzQgbWF0Y2FwQ29sb3IgXHgzZCB0ZXh0dXJlMkQoIG1hdGNhcCwgdXYgKTtcblx0XHRtYXRjYXBDb2xvciBceDNkIG1hdGNhcFRleGVsVG9MaW5lYXIoIG1hdGNhcENvbG9yICk7XG5cdCNlbHNlXG5cdFx0dmVjNCBtYXRjYXBDb2xvciBceDNkIHZlYzQoIDEuMCApO1xuXHQjZW5kaWZcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgZGlmZnVzZUNvbG9yLnJnYiAqIG1hdGNhcENvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNobWF0Y2FwX3ZlcnQ6IiNkZWZpbmUgTUFUQ0FQXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2luYmFzZV92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RlZmF1bHRub3JtYWxfdmVydGV4XHgzZVxuXHQjaWZuZGVmIEZMQVRfU0hBREVEXG5cdFx0dk5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcblx0I2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJvamVjdF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG59IiwKbWVzaHBob25nX2ZyYWc6IiNkZWZpbmUgUEhPTkdcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xudW5pZm9ybSB2ZWMzIHNwZWN1bGFyO1xudW5pZm9ybSBmbG9hdCBzaGluaW5lc3M7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3BhY2tpbmdceDNlXG4jaW5jbHVkZSBceDNjZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYW9tYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NsaWdodG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2VtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2dyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnNkZnNceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnVtcG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY25vcm1hbG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0IFx4M2QgUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlIFx4M2QgZW1pc3NpdmU7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9tYXBzXHgzZVxuXHQjaW5jbHVkZSBceDNjZW1pc3NpdmVtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfcGhvbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfZnJhZ21lbnRfbWFwc1x4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9lbmRceDNlXG5cdCNpbmNsdWRlIFx4M2Nhb21hcF9mcmFnbWVudFx4M2Vcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcblx0I2luY2x1ZGUgXHgzY2Vudm1hcF9mcmFnbWVudFx4M2Vcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RpdGhlcmluZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNocGhvbmdfdmVydDoiI2RlZmluZSBQSE9OR1xudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuI2VuZGlmXG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjdXYyX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGVmYXVsdG5vcm1hbF92ZXJ0ZXhceDNlXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZOb3JtYWwgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG4jZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdHZWaWV3UG9zaXRpb24gXHgzZCAtIG12UG9zaXRpb24ueHl6O1xuXHQjaW5jbHVkZSBceDNjd29ybGRwb3NfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZW52bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NoYWRvd21hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCm1lc2hwaHlzaWNhbF9mcmFnOiIjZGVmaW5lIFNUQU5EQVJEXG4jaWZkZWYgUEhZU0lDQUxcblx0I2RlZmluZSBSRUZMRUNUSVZJVFlcblx0I2RlZmluZSBDTEVBUkNPQVRcblx0I2RlZmluZSBUUkFOU1BBUkVOQ1lcbiNlbmRpZlxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XG51bmlmb3JtIGZsb2F0IHJvdWdobmVzcztcbnVuaWZvcm0gZmxvYXQgbWV0YWxuZXNzO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2lmZGVmIFRSQU5TUEFSRU5DWVxuXHR1bmlmb3JtIGZsb2F0IHRyYW5zcGFyZW5jeTtcbiNlbmRpZlxuI2lmZGVmIFJFRkxFQ1RJVklUWVxuXHR1bmlmb3JtIGZsb2F0IHJlZmxlY3Rpdml0eTtcbiNlbmRpZlxuI2lmZGVmIENMRUFSQ09BVFxuXHR1bmlmb3JtIGZsb2F0IGNsZWFyY29hdDtcblx0dW5pZm9ybSBmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7XG4jZW5kaWZcbiNpZmRlZiBVU0VfU0hFRU5cblx0dW5pZm9ybSB2ZWMzIHNoZWVuO1xuI2VuZGlmXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nhb21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nic2Rmc1x4M2VcbiNpbmNsdWRlIFx4M2NjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0c19wYXJzX2JlZ2luXHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2J1bXBtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nub3JtYWxtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGVhcmNvYXRfbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjcm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0IFx4M2QgUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlIFx4M2QgZW1pc3NpdmU7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nyb3VnaG5lc3NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtZXRhbG5lc3NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfbWFwc1x4M2Vcblx0I2luY2x1ZGUgXHgzY2NsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2NjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X21hcHNceDNlXG5cdCNpbmNsdWRlIFx4M2NlbWlzc2l2ZW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19waHlzaWNhbF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9tYXBzXHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2ZyYWdtZW50X2VuZFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FvbWFwX2ZyYWdtZW50XHgzZVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xuXHQjaWZkZWYgVFJBTlNQQVJFTkNZXG5cdFx0ZGlmZnVzZUNvbG9yLmEgKlx4M2Qgc2F0dXJhdGUoIDEuIC0gdHJhbnNwYXJlbmN5ICsgbGluZWFyVG9SZWxhdGl2ZUx1bWluYW5jZSggcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICkgKTtcblx0I2VuZGlmXG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfZnJhZ21lbnRceDNlXG59IiwKbWVzaHBoeXNpY2FsX3ZlcnQ6IiNkZWZpbmUgU1RBTkRBUkRcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2N1djJfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjdXYyX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGVmYXVsdG5vcm1hbF92ZXJ0ZXhceDNlXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZOb3JtYWwgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZUYW5nZW50IFx4M2Qgbm9ybWFsaXplKCB0cmFuc2Zvcm1lZFRhbmdlbnQgKTtcblx0XHR2Qml0YW5nZW50IFx4M2Qgbm9ybWFsaXplKCBjcm9zcyggdk5vcm1hbCwgdlRhbmdlbnQgKSAqIHRhbmdlbnQudyApO1xuXHQjZW5kaWZcbiNlbmRpZlxuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5pbmdfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcbn0iLApub3JtYWxfZnJhZzoiI2RlZmluZSBOT1JNQUxcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2J1bXBtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nub3JtYWxtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfbWFwc1x4M2Vcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggcGFja05vcm1hbFRvUkdCKCBub3JtYWwgKSwgb3BhY2l0eSApO1xufSIsCm5vcm1hbF92ZXJ0OiIjZGVmaW5lIE5PUk1BTFxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jZW5kaWZcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2tpbm5pbmdfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2VcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dlRhbmdlbnQgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkVGFuZ2VudCApO1xuXHRcdHZCaXRhbmdlbnQgXHgzZCBub3JtYWxpemUoIGNyb3NzKCB2Tm9ybWFsLCB2VGFuZ2VudCApICogdGFuZ2VudC53ICk7XG5cdCNlbmRpZlxuI2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJvamVjdF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfdmVydGV4XHgzZVxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG4jZW5kaWZcbn0iLApwb2ludHNfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfcGFydGljbGVfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Njb2xvcl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0b3V0Z29pbmdMaWdodCBceDNkIGRpZmZ1c2VDb2xvci5yZ2I7XG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIFx4M2NwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfZnJhZ21lbnRceDNlXG59IiwKcG9pbnRzX3ZlcnQ6InVuaWZvcm0gZmxvYXQgc2l6ZTtcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2Njb2xvcl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0Z2xfUG9pbnRTaXplIFx4M2Qgc2l6ZTtcblx0I2lmZGVmIFVTRV9TSVpFQVRURU5VQVRJT05cblx0XHRib29sIGlzUGVyc3BlY3RpdmUgXHgzZCAoIHByb2plY3Rpb25NYXRyaXhbIDIgXVsgMyBdIFx4M2RceDNkIC0gMS4wICk7XG5cdFx0aWYgKCBpc1BlcnNwZWN0aXZlICkgZ2xfUG9pbnRTaXplICpceDNkICggc2NhbGUgLyAtIG12UG9zaXRpb24ueiApO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCnNoYWRvd19mcmFnOiJ1bmlmb3JtIHZlYzMgY29sb3I7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3BhY2tpbmdceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnNkZnNceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFza19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBjb2xvciwgb3BhY2l0eSAqICggMS4wIC0gZ2V0U2hhZG93TWFzaygpICkgKTtcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLHNoYWRvd192ZXJ0OiIjaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjd29ybGRwb3NfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2hhZG93bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKc3ByaXRlX2ZyYWc6InVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHRvdXRnb2luZ0xpZ2h0IFx4M2QgZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsCnNwcml0ZV92ZXJ0OiJ1bmlmb3JtIGZsb2F0IHJvdGF0aW9uO1xudW5pZm9ybSB2ZWMyIGNlbnRlcjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0dmVjNCBtdlBvc2l0aW9uIFx4M2QgbW9kZWxWaWV3TWF0cml4ICogdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7XG5cdHZlYzIgc2NhbGU7XG5cdHNjYWxlLnggXHgzZCBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAwIF0ueCwgbW9kZWxNYXRyaXhbIDAgXS55LCBtb2RlbE1hdHJpeFsgMCBdLnogKSApO1xuXHRzY2FsZS55IFx4M2QgbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMSBdLngsIG1vZGVsTWF0cml4WyAxIF0ueSwgbW9kZWxNYXRyaXhbIDEgXS56ICkgKTtcblx0I2lmbmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OXG5cdFx0Ym9vbCBpc1BlcnNwZWN0aXZlIFx4M2QgKCBwcm9qZWN0aW9uTWF0cml4WyAyIF1bIDMgXSBceDNkXHgzZCAtIDEuMCApO1xuXHRcdGlmICggaXNQZXJzcGVjdGl2ZSApIHNjYWxlICpceDNkIC0gbXZQb3NpdGlvbi56O1xuXHQjZW5kaWZcblx0dmVjMiBhbGlnbmVkUG9zaXRpb24gXHgzZCAoIHBvc2l0aW9uLnh5IC0gKCBjZW50ZXIgLSB2ZWMyKCAwLjUgKSApICkgKiBzY2FsZTtcblx0dmVjMiByb3RhdGVkUG9zaXRpb247XG5cdHJvdGF0ZWRQb3NpdGlvbi54IFx4M2QgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggLSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTtcblx0cm90YXRlZFBvc2l0aW9uLnkgXHgzZCBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCArIGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55O1xuXHRtdlBvc2l0aW9uLnh5ICtceDNkIHJvdGF0ZWRQb3NpdGlvbjtcblx0Z2xfUG9zaXRpb24gXHgzZCBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSJ9LApZYT17Y29tbW9uOntkaWZmdXNlOnt2YWx1ZTpuZXcgSSgxNTY1ODczNCl9LG9wYWNpdHk6e3ZhbHVlOjF9LG1hcDp7dmFsdWU6bnVsbH0sdXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyBsfSxhbHBoYU1hcDp7dmFsdWU6bnVsbH19LHNwZWN1bGFybWFwOntzcGVjdWxhck1hcDp7dmFsdWU6bnVsbH19LGVudm1hcDp7ZW52TWFwOnt2YWx1ZTpudWxsfSxmbGlwRW52TWFwOnt2YWx1ZTotMX0scmVmbGVjdGl2aXR5Ont2YWx1ZToxfSxyZWZyYWN0aW9uUmF0aW86e3ZhbHVlOi45OH0sbWF4TWlwTGV2ZWw6e3ZhbHVlOjB9fSxhb21hcDp7YW9NYXA6e3ZhbHVlOm51bGx9LGFvTWFwSW50ZW5zaXR5Ont2YWx1ZToxfX0sbGlnaHRtYXA6e2xpZ2h0TWFwOnt2YWx1ZTpudWxsfSxsaWdodE1hcEludGVuc2l0eTp7dmFsdWU6MX19LGVtaXNzaXZlbWFwOntlbWlzc2l2ZU1hcDp7dmFsdWU6bnVsbH19LGJ1bXBtYXA6e2J1bXBNYXA6e3ZhbHVlOm51bGx9LGJ1bXBTY2FsZTp7dmFsdWU6MX19LG5vcm1hbG1hcDp7bm9ybWFsTWFwOnt2YWx1ZTpudWxsfSwKbm9ybWFsU2NhbGU6e3ZhbHVlOm5ldyBkKDEsMSl9fSxkaXNwbGFjZW1lbnRtYXA6e2Rpc3BsYWNlbWVudE1hcDp7dmFsdWU6bnVsbH0sZGlzcGxhY2VtZW50U2NhbGU6e3ZhbHVlOjF9LGRpc3BsYWNlbWVudEJpYXM6e3ZhbHVlOjB9fSxyb3VnaG5lc3NtYXA6e3JvdWdobmVzc01hcDp7dmFsdWU6bnVsbH19LG1ldGFsbmVzc21hcDp7bWV0YWxuZXNzTWFwOnt2YWx1ZTpudWxsfX0sZ3JhZGllbnRtYXA6e2dyYWRpZW50TWFwOnt2YWx1ZTpudWxsfX0sZm9nOntmb2dEZW5zaXR5Ont2YWx1ZToyLjVFLTR9LGZvZ05lYXI6e3ZhbHVlOjF9LGZvZ0Zhcjp7dmFsdWU6MkUzfSxmb2dDb2xvcjp7dmFsdWU6bmV3IEkoMTY3NzcyMTUpfX0sbGlnaHRzOnthbWJpZW50TGlnaHRDb2xvcjp7dmFsdWU6W119LGxpZ2h0UHJvYmU6e3ZhbHVlOltdfSxkaXJlY3Rpb25hbExpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7ZGlyZWN0aW9uOnt9LGNvbG9yOnt9LHNoYWRvdzp7fSxzaGFkb3dCaWFzOnt9LApzaGFkb3dSYWRpdXM6e30sc2hhZG93TWFwU2l6ZTp7fX19LGRpcmVjdGlvbmFsU2hhZG93TWFwOnt2YWx1ZTpbXX0sZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6e3ZhbHVlOltdfSxzcG90TGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSxwb3NpdGlvbjp7fSxkaXJlY3Rpb246e30sZGlzdGFuY2U6e30sY29uZUNvczp7fSxwZW51bWJyYUNvczp7fSxkZWNheTp7fSxzaGFkb3c6e30sc2hhZG93Qmlhczp7fSxzaGFkb3dSYWRpdXM6e30sc2hhZG93TWFwU2l6ZTp7fX19LHNwb3RTaGFkb3dNYXA6e3ZhbHVlOltdfSxzcG90U2hhZG93TWF0cml4Ont2YWx1ZTpbXX0scG9pbnRMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2NvbG9yOnt9LHBvc2l0aW9uOnt9LGRlY2F5Ont9LGRpc3RhbmNlOnt9LHNoYWRvdzp7fSxzaGFkb3dCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9LHNoYWRvd0NhbWVyYU5lYXI6e30sc2hhZG93Q2FtZXJhRmFyOnt9fX0sCnBvaW50U2hhZG93TWFwOnt2YWx1ZTpbXX0scG9pbnRTaGFkb3dNYXRyaXg6e3ZhbHVlOltdfSxoZW1pc3BoZXJlTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntkaXJlY3Rpb246e30sc2t5Q29sb3I6e30sZ3JvdW5kQ29sb3I6e319fSxyZWN0QXJlYUxpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7Y29sb3I6e30scG9zaXRpb246e30sd2lkdGg6e30saGVpZ2h0Ont9fX19LHBvaW50czp7ZGlmZnVzZTp7dmFsdWU6bmV3IEkoMTU2NTg3MzQpfSxvcGFjaXR5Ont2YWx1ZToxfSxzaXplOnt2YWx1ZToxfSxzY2FsZTp7dmFsdWU6MX0sbWFwOnt2YWx1ZTpudWxsfSx1dlRyYW5zZm9ybTp7dmFsdWU6bmV3IGx9fSxzcHJpdGU6e2RpZmZ1c2U6e3ZhbHVlOm5ldyBJKDE1NjU4NzM0KX0sb3BhY2l0eTp7dmFsdWU6MX0sY2VudGVyOnt2YWx1ZTpuZXcgZCguNSwuNSl9LHJvdGF0aW9uOnt2YWx1ZTowfSxtYXA6e3ZhbHVlOm51bGx9LHV2VHJhbnNmb3JtOnt2YWx1ZTpuZXcgbH19fSx1ZD0Ke2Jhc2ljOnt1bmlmb3JtczpJYihbWWEuY29tbW9uLFlhLnNwZWN1bGFybWFwLFlhLmVudm1hcCxZYS5hb21hcCxZYS5saWdodG1hcCxZYS5mb2ddKSx2ZXJ0ZXhTaGFkZXI6d2IubWVzaGJhc2ljX3ZlcnQsZnJhZ21lbnRTaGFkZXI6d2IubWVzaGJhc2ljX2ZyYWd9LGxhbWJlcnQ6e3VuaWZvcm1zOkliKFtZYS5jb21tb24sWWEuc3BlY3VsYXJtYXAsWWEuZW52bWFwLFlhLmFvbWFwLFlhLmxpZ2h0bWFwLFlhLmVtaXNzaXZlbWFwLFlhLmZvZyxZYS5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgSSgwKX19XSksdmVydGV4U2hhZGVyOndiLm1lc2hsYW1iZXJ0X3ZlcnQsZnJhZ21lbnRTaGFkZXI6d2IubWVzaGxhbWJlcnRfZnJhZ30scGhvbmc6e3VuaWZvcm1zOkliKFtZYS5jb21tb24sWWEuc3BlY3VsYXJtYXAsWWEuZW52bWFwLFlhLmFvbWFwLFlhLmxpZ2h0bWFwLFlhLmVtaXNzaXZlbWFwLFlhLmJ1bXBtYXAsWWEubm9ybWFsbWFwLFlhLmRpc3BsYWNlbWVudG1hcCxZYS5ncmFkaWVudG1hcCwKWWEuZm9nLFlhLmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyBJKDApfSxzcGVjdWxhcjp7dmFsdWU6bmV3IEkoMTExODQ4MSl9LHNoaW5pbmVzczp7dmFsdWU6MzB9fV0pLHZlcnRleFNoYWRlcjp3Yi5tZXNocGhvbmdfdmVydCxmcmFnbWVudFNoYWRlcjp3Yi5tZXNocGhvbmdfZnJhZ30sc3RhbmRhcmQ6e3VuaWZvcm1zOkliKFtZYS5jb21tb24sWWEuZW52bWFwLFlhLmFvbWFwLFlhLmxpZ2h0bWFwLFlhLmVtaXNzaXZlbWFwLFlhLmJ1bXBtYXAsWWEubm9ybWFsbWFwLFlhLmRpc3BsYWNlbWVudG1hcCxZYS5yb3VnaG5lc3NtYXAsWWEubWV0YWxuZXNzbWFwLFlhLmZvZyxZYS5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgSSgwKX0scm91Z2huZXNzOnt2YWx1ZTouNX0sbWV0YWxuZXNzOnt2YWx1ZTouNX0sZW52TWFwSW50ZW5zaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6d2IubWVzaHBoeXNpY2FsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6d2IubWVzaHBoeXNpY2FsX2ZyYWd9LAptYXRjYXA6e3VuaWZvcm1zOkliKFtZYS5jb21tb24sWWEuYnVtcG1hcCxZYS5ub3JtYWxtYXAsWWEuZGlzcGxhY2VtZW50bWFwLFlhLmZvZyx7bWF0Y2FwOnt2YWx1ZTpudWxsfX1dKSx2ZXJ0ZXhTaGFkZXI6d2IubWVzaG1hdGNhcF92ZXJ0LGZyYWdtZW50U2hhZGVyOndiLm1lc2htYXRjYXBfZnJhZ30scG9pbnRzOnt1bmlmb3JtczpJYihbWWEucG9pbnRzLFlhLmZvZ10pLHZlcnRleFNoYWRlcjp3Yi5wb2ludHNfdmVydCxmcmFnbWVudFNoYWRlcjp3Yi5wb2ludHNfZnJhZ30sZGFzaGVkOnt1bmlmb3JtczpJYihbWWEuY29tbW9uLFlhLmZvZyx7c2NhbGU6e3ZhbHVlOjF9LGRhc2hTaXplOnt2YWx1ZToxfSx0b3RhbFNpemU6e3ZhbHVlOjJ9fV0pLHZlcnRleFNoYWRlcjp3Yi5saW5lZGFzaGVkX3ZlcnQsZnJhZ21lbnRTaGFkZXI6d2IubGluZWRhc2hlZF9mcmFnfSxkZXB0aDp7dW5pZm9ybXM6SWIoW1lhLmNvbW1vbixZYS5kaXNwbGFjZW1lbnRtYXBdKSx2ZXJ0ZXhTaGFkZXI6d2IuZGVwdGhfdmVydCwKZnJhZ21lbnRTaGFkZXI6d2IuZGVwdGhfZnJhZ30sbm9ybWFsOnt1bmlmb3JtczpJYihbWWEuY29tbW9uLFlhLmJ1bXBtYXAsWWEubm9ybWFsbWFwLFlhLmRpc3BsYWNlbWVudG1hcCx7b3BhY2l0eTp7dmFsdWU6MX19XSksdmVydGV4U2hhZGVyOndiLm5vcm1hbF92ZXJ0LGZyYWdtZW50U2hhZGVyOndiLm5vcm1hbF9mcmFnfSxzcHJpdGU6e3VuaWZvcm1zOkliKFtZYS5zcHJpdGUsWWEuZm9nXSksdmVydGV4U2hhZGVyOndiLnNwcml0ZV92ZXJ0LGZyYWdtZW50U2hhZGVyOndiLnNwcml0ZV9mcmFnfSxiYWNrZ3JvdW5kOnt1bmlmb3Jtczp7dXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyBsfSx0MkQ6e3ZhbHVlOm51bGx9fSx2ZXJ0ZXhTaGFkZXI6d2IuYmFja2dyb3VuZF92ZXJ0LGZyYWdtZW50U2hhZGVyOndiLmJhY2tncm91bmRfZnJhZ30sY3ViZTp7dW5pZm9ybXM6e3RDdWJlOnt2YWx1ZTpudWxsfSx0RmxpcDp7dmFsdWU6LTF9LG9wYWNpdHk6e3ZhbHVlOjF9fSx2ZXJ0ZXhTaGFkZXI6d2IuY3ViZV92ZXJ0LApmcmFnbWVudFNoYWRlcjp3Yi5jdWJlX2ZyYWd9LGVxdWlyZWN0Ont1bmlmb3Jtczp7dEVxdWlyZWN0Ont2YWx1ZTpudWxsfX0sdmVydGV4U2hhZGVyOndiLmVxdWlyZWN0X3ZlcnQsZnJhZ21lbnRTaGFkZXI6d2IuZXF1aXJlY3RfZnJhZ30sZGlzdGFuY2VSR0JBOnt1bmlmb3JtczpJYihbWWEuY29tbW9uLFlhLmRpc3BsYWNlbWVudG1hcCx7cmVmZXJlbmNlUG9zaXRpb246e3ZhbHVlOm5ldyBnfSxuZWFyRGlzdGFuY2U6e3ZhbHVlOjF9LGZhckRpc3RhbmNlOnt2YWx1ZToxRTN9fV0pLHZlcnRleFNoYWRlcjp3Yi5kaXN0YW5jZVJHQkFfdmVydCxmcmFnbWVudFNoYWRlcjp3Yi5kaXN0YW5jZVJHQkFfZnJhZ30sc2hhZG93Ont1bmlmb3JtczpJYihbWWEubGlnaHRzLFlhLmZvZyx7Y29sb3I6e3ZhbHVlOm5ldyBJKDApfSxvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6d2Iuc2hhZG93X3ZlcnQsZnJhZ21lbnRTaGFkZXI6d2Iuc2hhZG93X2ZyYWd9fTt1ZC5waHlzaWNhbD0Ke3VuaWZvcm1zOkliKFt1ZC5zdGFuZGFyZC51bmlmb3Jtcyx7dHJhbnNwYXJlbmN5Ont2YWx1ZTowfSxjbGVhcmNvYXQ6e3ZhbHVlOjB9LGNsZWFyY29hdFJvdWdobmVzczp7dmFsdWU6MH0sc2hlZW46e3ZhbHVlOm5ldyBJKDApfSxjbGVhcmNvYXROb3JtYWxTY2FsZTp7dmFsdWU6bmV3IGQoMSwxKX0sY2xlYXJjb2F0Tm9ybWFsTWFwOnt2YWx1ZTpudWxsfX1dKSx2ZXJ0ZXhTaGFkZXI6d2IubWVzaHBoeXNpY2FsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6d2IubWVzaHBoeXNpY2FsX2ZyYWd9O2llLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHphLnByb3RvdHlwZSk7aWUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWllO3RkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7dGQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXRkO01kLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGsucHJvdG90eXBlKTtNZC5wcm90b3R5cGUuY29uc3RydWN0b3I9TWQ7TWQucHJvdG90eXBlLmlzQ3ViZVRleHR1cmU9CiEwO09iamVjdC5kZWZpbmVQcm9wZXJ0eShNZC5wcm90b3R5cGUsImltYWdlcyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmltYWdlfSxzZXQ6ZnVuY3Rpb24oYil7dGhpcy5pbWFnZT1ifX0pO0NmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGsucHJvdG90eXBlKTtDZi5wcm90b3R5cGUuY29uc3RydWN0b3I9Q2Y7Q2YucHJvdG90eXBlLmlzRGF0YVRleHR1cmUyREFycmF5PSEwO0RmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGsucHJvdG90eXBlKTtEZi5wcm90b3R5cGUuY29uc3RydWN0b3I9RGY7RGYucHJvdG90eXBlLmlzRGF0YVRleHR1cmUzRD0hMDt2YXIgcm49bmV3IGssYXI9bmV3IENmLGNyPW5ldyBEZixzbj1uZXcgTWQsbG49W10sbm49W10scW49bmV3IEZsb2F0MzJBcnJheSgxNikscG49bmV3IEZsb2F0MzJBcnJheSg5KSxvbj1uZXcgRmxvYXQzMkFycmF5KDQpO3RuLnByb3RvdHlwZS51cGRhdGVDYWNoZT1mdW5jdGlvbihiKXt2YXIgZT10aGlzLmNhY2hlO2IgaW5zdGFuY2VvZgpGbG9hdDMyQXJyYXkmJmUubGVuZ3RoIT09Yi5sZW5ndGgmJih0aGlzLmNhY2hlPW5ldyBGbG9hdDMyQXJyYXkoYi5sZW5ndGgpKTtJYyhlLGIpfTt1bi5wcm90b3R5cGUuc2V0VmFsdWU9ZnVuY3Rpb24oYixlLGgpe2Zvcih2YXIgbT10aGlzLnNlcSx1PTAsdz1tLmxlbmd0aDt1IT09dzsrK3Upe3ZhciBBPW1bdV07QS5zZXRWYWx1ZShiLGVbQS5pZF0saCl9fTt2YXIgb2s9LyhbXHdcZF9dKykoXF0pPyhcW3xcLik/L2c7bGUucHJvdG90eXBlLnNldFZhbHVlPWZ1bmN0aW9uKGIsZSxoLG0pe2U9dGhpcy5tYXBbZV07dm9pZCAwIT09ZSYmZS5zZXRWYWx1ZShiLGgsbSl9O2xlLnByb3RvdHlwZS5zZXRPcHRpb25hbD1mdW5jdGlvbihiLGUsaCl7ZT1lW2hdO3ZvaWQgMCE9PWUmJnRoaXMuc2V0VmFsdWUoYixoLGUpfTtsZS51cGxvYWQ9ZnVuY3Rpb24oYixlLGgsbSl7Zm9yKHZhciB1PTAsdz1lLmxlbmd0aDt1IT09dzsrK3Upe3ZhciBBPWVbdV0sRT1oW0EuaWRdOyExIT09RS5uZWVkc1VwZGF0ZSYmCkEuc2V0VmFsdWUoYixFLnZhbHVlLG0pfX07bGUuc2VxV2l0aFZhbHVlPWZ1bmN0aW9uKGIsZSl7Zm9yKHZhciBoPVtdLG09MCx1PWIubGVuZ3RoO20hPT11OysrbSl7dmFyIHc9YlttXTt3LmlkIGluIGUmJmgucHVzaCh3KX1yZXR1cm4gaH07dmFyIEdyPTAsUHI9MDttZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7bWUucHJvdG90eXBlLmNvbnN0cnVjdG9yPW1lO21lLnByb3RvdHlwZS5pc01lc2hEZXB0aE1hdGVyaWFsPSEwO21lLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMuZGVwdGhQYWNraW5nPWIuZGVwdGhQYWNraW5nO3RoaXMuc2tpbm5pbmc9Yi5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1iLm1vcnBoVGFyZ2V0czt0aGlzLm1hcD1iLm1hcDt0aGlzLmFscGhhTWFwPWIuYWxwaGFNYXA7dGhpcy5kaXNwbGFjZW1lbnRNYXA9Yi5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0KYi5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9Yi5kaXNwbGFjZW1lbnRCaWFzO3RoaXMud2lyZWZyYW1lPWIud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWIud2lyZWZyYW1lTGluZXdpZHRoO3JldHVybiB0aGlzfTtuZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7bmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPW5lO25lLnByb3RvdHlwZS5pc01lc2hEaXN0YW5jZU1hdGVyaWFsPSEwO25lLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMucmVmZXJlbmNlUG9zaXRpb24uY29weShiLnJlZmVyZW5jZVBvc2l0aW9uKTt0aGlzLm5lYXJEaXN0YW5jZT1iLm5lYXJEaXN0YW5jZTt0aGlzLmZhckRpc3RhbmNlPWIuZmFyRGlzdGFuY2U7dGhpcy5za2lubmluZz1iLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWIubW9ycGhUYXJnZXRzO3RoaXMubWFwPWIubWFwO3RoaXMuYWxwaGFNYXA9CmIuYWxwaGFNYXA7dGhpcy5kaXNwbGFjZW1lbnRNYXA9Yi5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1iLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1iLmRpc3BsYWNlbWVudEJpYXM7cmV0dXJuIHRoaXN9O0ZmLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoeS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpGZixpc0dyb3VwOiEwfSk7JGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjokZyxpc0FycmF5Q2FtZXJhOiEwfSk7dmFyIEhuPW5ldyBnLEluPW5ldyBnO09iamVjdC5hc3NpZ24ocWsucHJvdG90eXBlLGMucHJvdG90eXBlKTtPYmplY3QuYXNzaWduKEpuLnByb3RvdHlwZSxjLnByb3RvdHlwZSk7T2JqZWN0LmFzc2lnbih3aS5wcm90b3R5cGUse2lzRm9nRXhwMjohMCxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgd2kodGhpcy5jb2xvciwKdGhpcy5kZW5zaXR5KX0sdG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkZvZ0V4cDIiLGNvbG9yOnRoaXMuY29sb3IuZ2V0SGV4KCksZGVuc2l0eTp0aGlzLmRlbnNpdHl9fX0pO09iamVjdC5hc3NpZ24oeGkucHJvdG90eXBlLHtpc0ZvZzohMCxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgeGkodGhpcy5jb2xvcix0aGlzLm5lYXIsdGhpcy5mYXIpfSx0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiRm9nIixjb2xvcjp0aGlzLmNvbG9yLmdldEhleCgpLG5lYXI6dGhpcy5uZWFyLGZhcjp0aGlzLmZhcn19fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KE9lLnByb3RvdHlwZSwibmVlZHNVcGRhdGUiLHtzZXQ6ZnVuY3Rpb24oYil7ITA9PT1iJiZ0aGlzLnZlcnNpb24rK319KTtPYmplY3QuYXNzaWduKE9lLnByb3RvdHlwZSx7aXNJbnRlcmxlYXZlZEJ1ZmZlcjohMCxvblVwbG9hZENhbGxiYWNrOmZ1bmN0aW9uKCl7fSxzZXRBcnJheTpmdW5jdGlvbihiKXtpZihBcnJheS5pc0FycmF5KGIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuIik7CnRoaXMuY291bnQ9dm9pZCAwIT09Yj9iLmxlbmd0aC90aGlzLnN0cmlkZTowO3RoaXMuYXJyYXk9YjtyZXR1cm4gdGhpc30sc2V0RHluYW1pYzpmdW5jdGlvbihiKXt0aGlzLmR5bmFtaWM9YjtyZXR1cm4gdGhpc30sY29weTpmdW5jdGlvbihiKXt0aGlzLmFycmF5PW5ldyBiLmFycmF5LmNvbnN0cnVjdG9yKGIuYXJyYXkpO3RoaXMuY291bnQ9Yi5jb3VudDt0aGlzLnN0cmlkZT1iLnN0cmlkZTt0aGlzLmR5bmFtaWM9Yi5keW5hbWljO3JldHVybiB0aGlzfSxjb3B5QXQ6ZnVuY3Rpb24oYixlLGgpe2IqPXRoaXMuc3RyaWRlO2gqPWUuc3RyaWRlO2Zvcih2YXIgbT0wLHU9dGhpcy5zdHJpZGU7bTx1O20rKyl0aGlzLmFycmF5W2IrbV09ZS5hcnJheVtoK21dO3JldHVybiB0aGlzfSxzZXQ6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1lJiYoZT0wKTt0aGlzLmFycmF5LnNldChiLGUpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sCm9uVXBsb2FkOmZ1bmN0aW9uKGIpe3RoaXMub25VcGxvYWRDYWxsYmFjaz1iO3JldHVybiB0aGlzfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGJoLnByb3RvdHlwZSx7Y291bnQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGEuY291bnR9fSxhcnJheTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheX19fSk7T2JqZWN0LmFzc2lnbihiaC5wcm90b3R5cGUse2lzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6ITAsc2V0WDpmdW5jdGlvbihiLGUpe3RoaXMuZGF0YS5hcnJheVtiKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXRdPWU7cmV0dXJuIHRoaXN9LHNldFk6ZnVuY3Rpb24oYixlKXt0aGlzLmRhdGEuYXJyYXlbYip0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzFdPWU7cmV0dXJuIHRoaXN9LHNldFo6ZnVuY3Rpb24oYixlKXt0aGlzLmRhdGEuYXJyYXlbYip0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzJdPWU7cmV0dXJuIHRoaXN9LApzZXRXOmZ1bmN0aW9uKGIsZSl7dGhpcy5kYXRhLmFycmF5W2IqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCszXT1lO3JldHVybiB0aGlzfSxnZXRYOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbYip0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0XX0sZ2V0WTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W2IqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCsxXX0sZ2V0WjpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W2IqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCsyXX0sZ2V0VzpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W2IqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCszXX0sc2V0WFk6ZnVuY3Rpb24oYixlLGgpe2I9Yip0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0O3RoaXMuZGF0YS5hcnJheVtiKzBdPWU7dGhpcy5kYXRhLmFycmF5W2IrMV09aDtyZXR1cm4gdGhpc30sc2V0WFlaOmZ1bmN0aW9uKGIsCmUsaCxtKXtiPWIqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldDt0aGlzLmRhdGEuYXJyYXlbYiswXT1lO3RoaXMuZGF0YS5hcnJheVtiKzFdPWg7dGhpcy5kYXRhLmFycmF5W2IrMl09bTtyZXR1cm4gdGhpc30sc2V0WFlaVzpmdW5jdGlvbihiLGUsaCxtLHUpe2I9Yip0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0O3RoaXMuZGF0YS5hcnJheVtiKzBdPWU7dGhpcy5kYXRhLmFycmF5W2IrMV09aDt0aGlzLmRhdGEuYXJyYXlbYisyXT1tO3RoaXMuZGF0YS5hcnJheVtiKzNdPXU7cmV0dXJuIHRoaXN9fSk7cmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO3JlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1yZTtyZS5wcm90b3R5cGUuaXNTcHJpdGVNYXRlcmlhbD0hMDtyZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbihiKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLmNvbG9yLmNvcHkoYi5jb2xvcik7dGhpcy5tYXA9Yi5tYXA7dGhpcy5yb3RhdGlvbj0KYi5yb3RhdGlvbjt0aGlzLnNpemVBdHRlbnVhdGlvbj1iLnNpemVBdHRlbnVhdGlvbjtyZXR1cm4gdGhpc307dmFyIExmLFJoPW5ldyBnLHhnPW5ldyBnLHlnPW5ldyBnLE1mPW5ldyBkLGRoPW5ldyBkLE9uPW5ldyByLG5qPW5ldyBnLFNoPW5ldyBnLG9qPW5ldyBnLHRvPW5ldyBkLG5sPW5ldyBkLHVvPW5ldyBkO2NoLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoeS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpjaCxpc1Nwcml0ZTohMCxyYXljYXN0OmZ1bmN0aW9uKGIsZSl7bnVsbD09PWIuY2FtZXJhJiZjb25zb2xlLmVycm9yKCdUSFJFRS5TcHJpdGU6ICJSYXljYXN0ZXIuY2FtZXJhIiBuZWVkcyB0byBiZSBzZXQgaW4gb3JkZXIgdG8gcmF5Y2FzdCBhZ2FpbnN0IHNwcml0ZXMuJyk7eGcuc2V0RnJvbU1hdHJpeFNjYWxlKHRoaXMubWF0cml4V29ybGQpO09uLmNvcHkoYi5jYW1lcmEubWF0cml4V29ybGQpO3RoaXMubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoYi5jYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLAp0aGlzLm1hdHJpeFdvcmxkKTt5Zy5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tb2RlbFZpZXdNYXRyaXgpO2IuY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEmJiExPT09dGhpcy5tYXRlcmlhbC5zaXplQXR0ZW51YXRpb24mJnhnLm11bHRpcGx5U2NhbGFyKC15Zy56KTt2YXIgaD10aGlzLm1hdGVyaWFsLnJvdGF0aW9uO2lmKDAhPT1oKXt2YXIgbT1NYXRoLmNvcyhoKTt2YXIgdT1NYXRoLnNpbihoKX1oPXRoaXMuY2VudGVyO3lpKG5qLnNldCgtLjUsLS41LDApLHlnLGgseGcsdSxtKTt5aShTaC5zZXQoLjUsLS41LDApLHlnLGgseGcsdSxtKTt5aShvai5zZXQoLjUsLjUsMCkseWcsaCx4Zyx1LG0pO3RvLnNldCgwLDApO25sLnNldCgxLDApO3VvLnNldCgxLDEpO3ZhciB3PWIucmF5LmludGVyc2VjdFRyaWFuZ2xlKG5qLFNoLG9qLCExLFJoKTtpZihudWxsPT09dyYmKHlpKFNoLnNldCgtLjUsLjUsMCkseWcsaCx4Zyx1LG0pLG5sLnNldCgwLDEpLHc9Yi5yYXkuaW50ZXJzZWN0VHJpYW5nbGUobmosCm9qLFNoLCExLFJoKSxudWxsPT09dykpcmV0dXJuO3U9Yi5yYXkub3JpZ2luLmRpc3RhbmNlVG8oUmgpO3U8Yi5uZWFyfHx1PmIuZmFyfHxlLnB1c2goe2Rpc3RhbmNlOnUscG9pbnQ6UmguY2xvbmUoKSx1djpCLmdldFVWKFJoLG5qLFNoLG9qLHRvLG5sLHVvLG5ldyBkKSxmYWNlOm51bGwsb2JqZWN0OnRoaXN9KX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5tYXRlcmlhbCkpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7eS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dm9pZCAwIT09Yi5jZW50ZXImJnRoaXMuY2VudGVyLmNvcHkoYi5jZW50ZXIpO3JldHVybiB0aGlzfX0pO3ZhciBwaj1uZXcgZyx2bz1uZXcgZztlaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHkucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6ZWgsaXNMT0Q6ITAsY29weTpmdW5jdGlvbihiKXt5LnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYiwhMSk7Yj1iLmxldmVscztmb3IodmFyIGU9MCxoPWIubGVuZ3RoO2U8aDtlKyspe3ZhciBtPWJbZV07dGhpcy5hZGRMZXZlbChtLm9iamVjdC5jbG9uZSgpLG0uZGlzdGFuY2UpfXJldHVybiB0aGlzfSxhZGRMZXZlbDpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihlPTApO2U9TWF0aC5hYnMoZSk7Zm9yKHZhciBoPXRoaXMubGV2ZWxzLG09MDttPGgubGVuZ3RoJiYhKGU8aFttXS5kaXN0YW5jZSk7bSsrKTtoLnNwbGljZShtLDAse2Rpc3RhbmNlOmUsb2JqZWN0OmJ9KTt0aGlzLmFkZChiKTtyZXR1cm4gdGhpc30sZ2V0T2JqZWN0Rm9yRGlzdGFuY2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPXRoaXMubGV2ZWxzLGg9MSxtPWUubGVuZ3RoO2g8bSYmIShiPGVbaF0uZGlzdGFuY2UpO2grKyk7cmV0dXJuIGVbaC0xXS5vYmplY3R9LHJheWNhc3Q6ZnVuY3Rpb24oYixlKXtwai5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7dGhpcy5nZXRPYmplY3RGb3JEaXN0YW5jZShiLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhwaikpLnJheWNhc3QoYiwKZSl9LHVwZGF0ZTpmdW5jdGlvbihiKXt2YXIgZT10aGlzLmxldmVscztpZigxPGUubGVuZ3RoKXtwai5zZXRGcm9tTWF0cml4UG9zaXRpb24oYi5tYXRyaXhXb3JsZCk7dm8uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpO2I9cGouZGlzdGFuY2VUbyh2byk7ZVswXS5vYmplY3QudmlzaWJsZT0hMDtmb3IodmFyIGg9MSxtPWUubGVuZ3RoO2g8bTtoKyspaWYoYj49ZVtoXS5kaXN0YW5jZSllW2gtMV0ub2JqZWN0LnZpc2libGU9ITEsZVtoXS5vYmplY3QudmlzaWJsZT0hMDtlbHNlIGJyZWFrO2Zvcig7aDxtO2grKyllW2hdLm9iamVjdC52aXNpYmxlPSExfX0sdG9KU09OOmZ1bmN0aW9uKGIpe2I9eS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxiKTtiLm9iamVjdC5sZXZlbHM9W107Zm9yKHZhciBlPXRoaXMubGV2ZWxzLGg9MCxtPWUubGVuZ3RoO2g8bTtoKyspe3ZhciB1PWVbaF07Yi5vYmplY3QubGV2ZWxzLnB1c2goe29iamVjdDp1Lm9iamVjdC51dWlkLApkaXN0YW5jZTp1LmRpc3RhbmNlfSl9cmV0dXJuIGJ9fSk7ZmgucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpmaCxpc1NraW5uZWRNZXNoOiEwLGJpbmQ6ZnVuY3Rpb24oYixlKXt0aGlzLnNrZWxldG9uPWI7dm9pZCAwPT09ZSYmKHRoaXMudXBkYXRlTWF0cml4V29ybGQoITApLHRoaXMuc2tlbGV0b24uY2FsY3VsYXRlSW52ZXJzZXMoKSxlPXRoaXMubWF0cml4V29ybGQpO3RoaXMuYmluZE1hdHJpeC5jb3B5KGUpO3RoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZShlKX0scG9zZTpmdW5jdGlvbigpe3RoaXMuc2tlbGV0b24ucG9zZSgpfSxub3JtYWxpemVTa2luV2VpZ2h0czpmdW5jdGlvbigpe2Zvcih2YXIgYj1uZXcgbixlPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0LGg9MCxtPWUuY291bnQ7aDxtO2grKyl7Yi54PWUuZ2V0WChoKTtiLnk9ZS5nZXRZKGgpO2Iuej1lLmdldFooaCk7CmIudz1lLmdldFcoaCk7dmFyIHU9MS9iLm1hbmhhdHRhbkxlbmd0aCgpO0luZmluaXR5IT09dT9iLm11bHRpcGx5U2NhbGFyKHUpOmIuc2V0KDEsMCwwLDApO2Uuc2V0WFlaVyhoLGIueCxiLnksYi56LGIudyl9fSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihiKXt5YS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCh0aGlzLGIpOyJhdHRhY2hlZCI9PT10aGlzLmJpbmRNb2RlP3RoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSh0aGlzLm1hdHJpeFdvcmxkKToiZGV0YWNoZWQiPT09dGhpcy5iaW5kTW9kZT90aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmdldEludmVyc2UodGhpcy5iaW5kTWF0cml4KTpjb25zb2xlLndhcm4oIlRIUkVFLlNraW5uZWRNZXNoOiBVbnJlY29nbml6ZWQgYmluZE1vZGU6ICIrdGhpcy5iaW5kTW9kZSl9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuZ2VvbWV0cnksdGhpcy5tYXRlcmlhbCkpLmNvcHkodGhpcyl9fSk7CnZhciB3bz1uZXcgcixFcz1uZXcgcjtPYmplY3QuYXNzaWduKHppLnByb3RvdHlwZSx7Y2FsY3VsYXRlSW52ZXJzZXM6ZnVuY3Rpb24oKXt0aGlzLmJvbmVJbnZlcnNlcz1bXTtmb3IodmFyIGI9MCxlPXRoaXMuYm9uZXMubGVuZ3RoO2I8ZTtiKyspe3ZhciBoPW5ldyByO3RoaXMuYm9uZXNbYl0mJmguZ2V0SW52ZXJzZSh0aGlzLmJvbmVzW2JdLm1hdHJpeFdvcmxkKTt0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKGgpfX0scG9zZTpmdW5jdGlvbigpe3ZhciBiLGU7dmFyIGg9MDtmb3IoZT10aGlzLmJvbmVzLmxlbmd0aDtoPGU7aCsrKShiPXRoaXMuYm9uZXNbaF0pJiZiLm1hdHJpeFdvcmxkLmdldEludmVyc2UodGhpcy5ib25lSW52ZXJzZXNbaF0pO2g9MDtmb3IoZT10aGlzLmJvbmVzLmxlbmd0aDtoPGU7aCsrKWlmKGI9dGhpcy5ib25lc1toXSliLnBhcmVudCYmYi5wYXJlbnQuaXNCb25lPyhiLm1hdHJpeC5nZXRJbnZlcnNlKGIucGFyZW50Lm1hdHJpeFdvcmxkKSxiLm1hdHJpeC5tdWx0aXBseShiLm1hdHJpeFdvcmxkKSk6CmIubWF0cml4LmNvcHkoYi5tYXRyaXhXb3JsZCksYi5tYXRyaXguZGVjb21wb3NlKGIucG9zaXRpb24sYi5xdWF0ZXJuaW9uLGIuc2NhbGUpfSx1cGRhdGU6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5ib25lcyxlPXRoaXMuYm9uZUludmVyc2VzLGg9dGhpcy5ib25lTWF0cmljZXMsbT10aGlzLmJvbmVUZXh0dXJlLHU9MCx3PWIubGVuZ3RoO3U8dzt1Kyspd28ubXVsdGlwbHlNYXRyaWNlcyhiW3VdP2JbdV0ubWF0cml4V29ybGQ6RXMsZVt1XSksd28udG9BcnJheShoLDE2KnUpO3ZvaWQgMCE9PW0mJihtLm5lZWRzVXBkYXRlPSEwKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHppKHRoaXMuYm9uZXMsdGhpcy5ib25lSW52ZXJzZXMpfSxnZXRCb25lQnlOYW1lOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZT0wLGg9dGhpcy5ib25lcy5sZW5ndGg7ZTxoO2UrKyl7dmFyIG09dGhpcy5ib25lc1tlXTtpZihtLm5hbWU9PT1iKXJldHVybiBtfX19KTt4ay5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHkucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOnhrLGlzQm9uZTohMH0pO09iLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtPYi5wcm90b3R5cGUuY29uc3RydWN0b3I9T2I7T2IucHJvdG90eXBlLmlzTGluZUJhc2ljTWF0ZXJpYWw9ITA7T2IucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5jb2xvci5jb3B5KGIuY29sb3IpO3RoaXMubGluZXdpZHRoPWIubGluZXdpZHRoO3RoaXMubGluZWNhcD1iLmxpbmVjYXA7dGhpcy5saW5lam9pbj1iLmxpbmVqb2luO3JldHVybiB0aGlzfTt2YXIgeG89bmV3IGcseW89bmV3IGcsem89bmV3IHIscWo9bmV3IEQsVGg9bmV3IEY7bWMucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh5LnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOm1jLGlzTGluZTohMCxjb21wdXRlTGluZURpc3RhbmNlczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2VvbWV0cnk7aWYoYi5pc0J1ZmZlckdlb21ldHJ5KWlmKG51bGw9PT0KYi5pbmRleCl7Zm9yKHZhciBlPWIuYXR0cmlidXRlcy5wb3NpdGlvbixoPVswXSxtPTEsdT1lLmNvdW50O208dTttKyspeG8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLG0tMSkseW8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLG0pLGhbbV09aFttLTFdLGhbbV0rPXhvLmRpc3RhbmNlVG8oeW8pO2IuYWRkQXR0cmlidXRlKCJsaW5lRGlzdGFuY2UiLG5ldyBkYShoLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuIik7ZWxzZSBpZihiLmlzR2VvbWV0cnkpZm9yKGU9Yi52ZXJ0aWNlcyxoPWIubGluZURpc3RhbmNlcyxoWzBdPTAsbT0xLHU9ZS5sZW5ndGg7bTx1O20rKyloW21dPWhbbS0xXSxoW21dKz1lW20tMV0uZGlzdGFuY2VUbyhlW21dKTtyZXR1cm4gdGhpc30scmF5Y2FzdDpmdW5jdGlvbihiLGUpe3ZhciBoPWIubGluZVByZWNpc2lvbiwKbT10aGlzLmdlb21ldHJ5LHU9dGhpcy5tYXRyaXhXb3JsZDtudWxsPT09bS5ib3VuZGluZ1NwaGVyZSYmbS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtUaC5jb3B5KG0uYm91bmRpbmdTcGhlcmUpO1RoLmFwcGx5TWF0cml4NCh1KTtUaC5yYWRpdXMrPWg7aWYoITEhPT1iLnJheS5pbnRlcnNlY3RzU3BoZXJlKFRoKSl7em8uZ2V0SW52ZXJzZSh1KTtxai5jb3B5KGIucmF5KS5hcHBseU1hdHJpeDQoem8pO2gvPSh0aGlzLnNjYWxlLngrdGhpcy5zY2FsZS55K3RoaXMuc2NhbGUueikvMztoKj1oO3ZhciB3PW5ldyBnLEE9bmV3IGc7dT1uZXcgZzt2YXIgRT1uZXcgZyxHPXRoaXMmJnRoaXMuaXNMaW5lU2VnbWVudHM/MjoxO2lmKG0uaXNCdWZmZXJHZW9tZXRyeSl7dmFyIEo9bS5pbmRleCxRPW0uYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtpZihudWxsIT09Sil7Sj1KLmFycmF5O209MDtmb3IodmFyIFM9Si5sZW5ndGgtMTttPFM7bSs9Ryl7dmFyIFQ9SlttKzFdO3cuZnJvbUFycmF5KFEsCjMqSlttXSk7QS5mcm9tQXJyYXkoUSwzKlQpO1Q9cWouZGlzdGFuY2VTcVRvU2VnbWVudCh3LEEsRSx1KTtUPmh8fChFLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxUPWIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKEUpLFQ8Yi5uZWFyfHxUPmIuZmFyfHxlLnB1c2goe2Rpc3RhbmNlOlQscG9pbnQ6dS5jbG9uZSgpLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxpbmRleDptLGZhY2U6bnVsbCxmYWNlSW5kZXg6bnVsbCxvYmplY3Q6dGhpc30pKX19ZWxzZSBmb3IobT0wLFM9US5sZW5ndGgvMy0xO208UzttKz1HKXcuZnJvbUFycmF5KFEsMyptKSxBLmZyb21BcnJheShRLDMqbSszKSxUPXFqLmRpc3RhbmNlU3FUb1NlZ21lbnQodyxBLEUsdSksVD5ofHwoRS5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCksVD1iLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhFKSxUPGIubmVhcnx8VD5iLmZhcnx8ZS5wdXNoKHtkaXN0YW5jZTpULHBvaW50OnUuY2xvbmUoKS5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCksCmluZGV4Om0sZmFjZTpudWxsLGZhY2VJbmRleDpudWxsLG9iamVjdDp0aGlzfSkpfWVsc2UgaWYobS5pc0dlb21ldHJ5KWZvcih3PW0udmVydGljZXMsQT13Lmxlbmd0aCxtPTA7bTxBLTE7bSs9RylUPXFqLmRpc3RhbmNlU3FUb1NlZ21lbnQod1ttXSx3W20rMV0sRSx1KSxUPmh8fChFLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxUPWIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKEUpLFQ8Yi5uZWFyfHxUPmIuZmFyfHxlLnB1c2goe2Rpc3RhbmNlOlQscG9pbnQ6dS5jbG9uZSgpLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxpbmRleDptLGZhY2U6bnVsbCxmYWNlSW5kZXg6bnVsbCxvYmplY3Q6dGhpc30pKX19LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuZ2VvbWV0cnksdGhpcy5tYXRlcmlhbCkpLmNvcHkodGhpcyl9fSk7dmFyIHJqPW5ldyBnLHNqPW5ldyBnO1NiLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobWMucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOlNiLGlzTGluZVNlZ21lbnRzOiEwLGNvbXB1dGVMaW5lRGlzdGFuY2VzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZW9tZXRyeTtpZihiLmlzQnVmZmVyR2VvbWV0cnkpaWYobnVsbD09PWIuaW5kZXgpe2Zvcih2YXIgZT1iLmF0dHJpYnV0ZXMucG9zaXRpb24saD1bXSxtPTAsdT1lLmNvdW50O208dTttKz0yKXJqLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxtKSxzai5mcm9tQnVmZmVyQXR0cmlidXRlKGUsbSsxKSxoW21dPTA9PT1tPzA6aFttLTFdLGhbbSsxXT1oW21dK3JqLmRpc3RhbmNlVG8oc2opO2IuYWRkQXR0cmlidXRlKCJsaW5lRGlzdGFuY2UiLG5ldyBkYShoLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZVNlZ21lbnRzLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4iKTtlbHNlIGlmKGIuaXNHZW9tZXRyeSlmb3IoZT1iLnZlcnRpY2VzLGg9CmIubGluZURpc3RhbmNlcyxtPTAsdT1lLmxlbmd0aDttPHU7bSs9Milyai5jb3B5KGVbbV0pLHNqLmNvcHkoZVttKzFdKSxoW21dPTA9PT1tPzA6aFttLTFdLGhbbSsxXT1oW21dK3JqLmRpc3RhbmNlVG8oc2opO3JldHVybiB0aGlzfX0pO0FpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobWMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6QWksaXNMaW5lTG9vcDohMH0pO2NkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtjZC5wcm90b3R5cGUuY29uc3RydWN0b3I9Y2Q7Y2QucHJvdG90eXBlLmlzUG9pbnRzTWF0ZXJpYWw9ITA7Y2QucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5jb2xvci5jb3B5KGIuY29sb3IpO3RoaXMubWFwPWIubWFwO3RoaXMuc2l6ZT1iLnNpemU7dGhpcy5zaXplQXR0ZW51YXRpb249Yi5zaXplQXR0ZW51YXRpb247dGhpcy5tb3JwaFRhcmdldHM9Yi5tb3JwaFRhcmdldHM7CnJldHVybiB0aGlzfTt2YXIgQW89bmV3IHIsems9bmV3IEQsVWg9bmV3IEYsdGo9bmV3IGc7TmYucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh5LnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOk5mLGlzUG9pbnRzOiEwLHJheWNhc3Q6ZnVuY3Rpb24oYixlKXt2YXIgaD10aGlzLmdlb21ldHJ5LG09dGhpcy5tYXRyaXhXb3JsZCx1PWIucGFyYW1zLlBvaW50cy50aHJlc2hvbGQ7bnVsbD09PWguYm91bmRpbmdTcGhlcmUmJmguY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7VWguY29weShoLmJvdW5kaW5nU3BoZXJlKTtVaC5hcHBseU1hdHJpeDQobSk7VWgucmFkaXVzKz11O2lmKCExIT09Yi5yYXkuaW50ZXJzZWN0c1NwaGVyZShVaCkpaWYoQW8uZ2V0SW52ZXJzZShtKSx6ay5jb3B5KGIucmF5KS5hcHBseU1hdHJpeDQoQW8pLHUvPSh0aGlzLnNjYWxlLngrdGhpcy5zY2FsZS55K3RoaXMuc2NhbGUueikvMyx1Kj11LGguaXNCdWZmZXJHZW9tZXRyeSl7dmFyIHc9aC5pbmRleDsKaD1oLmF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7aWYobnVsbCE9PXcpe3ZhciBBPXcuYXJyYXk7dz0wO2Zvcih2YXIgRT1BLmxlbmd0aDt3PEU7dysrKXt2YXIgRz1BW3ddO3RqLmZyb21BcnJheShoLDMqRyk7eWsodGosRyx1LG0sYixlLHRoaXMpfX1lbHNlIGZvcih3PTAsQT1oLmxlbmd0aC8zO3c8QTt3KyspdGouZnJvbUFycmF5KGgsMyp3KSx5ayh0aix3LHUsbSxiLGUsdGhpcyl9ZWxzZSBmb3IoaD1oLnZlcnRpY2VzLHc9MCxBPWgubGVuZ3RoO3c8QTt3KyspeWsoaFt3XSx3LHUsbSxiLGUsdGhpcyl9LHVwZGF0ZU1vcnBoVGFyZ2V0czpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2VvbWV0cnk7aWYoYi5pc0J1ZmZlckdlb21ldHJ5KXtiPWIubW9ycGhBdHRyaWJ1dGVzO3ZhciBlPU9iamVjdC5rZXlzKGIpO2lmKDA8ZS5sZW5ndGgpe3ZhciBoPWJbZVswXV07aWYodm9pZCAwIT09aClmb3IodGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9W10sdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9Cnt9LGI9MCxlPWgubGVuZ3RoO2I8ZTtiKyspe3ZhciBtPWhbYl0ubmFtZXx8U3RyaW5nKGIpO3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goMCk7dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbbV09Yn19fWVsc2UgYj1iLm1vcnBoVGFyZ2V0cyx2b2lkIDAhPT1iJiYwPGIubGVuZ3RoJiZjb25zb2xlLmVycm9yKCJUSFJFRS5Qb2ludHMudXBkYXRlTW9ycGhUYXJnZXRzKCkgZG9lcyBub3Qgc3VwcG9ydCBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIil9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuZ2VvbWV0cnksdGhpcy5tYXRlcmlhbCkpLmNvcHkodGhpcyl9fSk7QWsucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShrLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkFrLGlzVmlkZW9UZXh0dXJlOiEwLHVwZGF0ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuaW1hZ2U7Yi5yZWFkeVN0YXRlPj0KYi5IQVZFX0NVUlJFTlRfREFUQSYmKHRoaXMubmVlZHNVcGRhdGU9ITApfX0pO09mLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGsucHJvdG90eXBlKTtPZi5wcm90b3R5cGUuY29uc3RydWN0b3I9T2Y7T2YucHJvdG90eXBlLmlzQ29tcHJlc3NlZFRleHR1cmU9ITA7Z2gucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoay5wcm90b3R5cGUpO2doLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1naDtnaC5wcm90b3R5cGUuaXNDYW52YXNUZXh0dXJlPSEwO2hoLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGsucHJvdG90eXBlKTtoaC5wcm90b3R5cGUuY29uc3RydWN0b3I9aGg7aGgucHJvdG90eXBlLmlzRGVwdGhUZXh0dXJlPSEwO1BmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7UGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPVBmO2loLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHphLnByb3RvdHlwZSk7aWgucHJvdG90eXBlLmNvbnN0cnVjdG9yPWloO1FmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7ClFmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1RZjtqaC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh6YS5wcm90b3R5cGUpO2poLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1qaDtGYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO0ZjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1GYztraC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh6YS5wcm90b3R5cGUpO2toLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1raDtSZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShGYy5wcm90b3R5cGUpO1JmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1SZjtsaC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh6YS5wcm90b3R5cGUpO2xoLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1saDtQZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShGYy5wcm90b3R5cGUpO1BlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1QZTttaC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh6YS5wcm90b3R5cGUpO21oLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj0KbWg7U2YucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRmMucHJvdG90eXBlKTtTZi5wcm90b3R5cGUuY29uc3RydWN0b3I9U2Y7bmgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoemEucHJvdG90eXBlKTtuaC5wcm90b3R5cGUuY29uc3RydWN0b3I9bmg7VGYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRmMucHJvdG90eXBlKTtUZi5wcm90b3R5cGUuY29uc3RydWN0b3I9VGY7b2gucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoemEucHJvdG90eXBlKTtvaC5wcm90b3R5cGUuY29uc3RydWN0b3I9b2g7UWUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTtRZS5wcm90b3R5cGUuY29uc3RydWN0b3I9UWU7UWUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBiPXhhLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLnBhdGg9dGhpcy5wYXJhbWV0ZXJzLnBhdGgudG9KU09OKCk7cmV0dXJuIGJ9O3BoLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHphLnByb3RvdHlwZSk7CnBoLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1waDtVZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO1VmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1VZjtxaC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh6YS5wcm90b3R5cGUpO3FoLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1xaDtWZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO1ZmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1WZjt2YXIgRnM9e3RyaWFuZ3VsYXRlOmZ1bmN0aW9uKGIsZSxoKXtoPWh8fDI7dmFyIG09ZSYmZS5sZW5ndGgsdT1tP2VbMF0qaDpiLmxlbmd0aCx3PVBuKGIsMCx1LGgsITApLEE9W107aWYoIXd8fHcubmV4dD09PXcucHJldilyZXR1cm4gQTttJiYodz0kcihiLGUsdyxoKSk7aWYoYi5sZW5ndGg+ODAqaCl7dmFyIEU9ZT1iWzBdO3ZhciBHPW09YlsxXTtmb3IodmFyIEo9aDtKPHU7Sis9aCl7dmFyIFE9YltKXTt2YXIgUz1iW0orMV07UTxFJiYoRT1RKTtTPEcmJihHPVMpOwpRPmUmJihlPVEpO1M+bSYmKG09Uyl9UT1NYXRoLm1heChlLUUsbS1HKTtRPTAhPT1RPzEvUTowfXRoKHcsQSxoLEUsRyxRKTtyZXR1cm4gQX19LE9kPXthcmVhOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZT1iLmxlbmd0aCxoPTAsbT1lLTEsdT0wO3U8ZTttPXUrKyloKz1iW21dLngqYlt1XS55LWJbdV0ueCpiW21dLnk7cmV0dXJuLjUqaH0saXNDbG9ja1dpc2U6ZnVuY3Rpb24oYil7cmV0dXJuIDA+T2QuYXJlYShiKX0sdHJpYW5ndWxhdGVTaGFwZTpmdW5jdGlvbihiLGUpe3ZhciBoPVtdLG09W10sdT1bXTtUbihiKTtVbihoLGIpO3ZhciB3PWIubGVuZ3RoO2UuZm9yRWFjaChUbik7Zm9yKGI9MDtiPGUubGVuZ3RoO2IrKyltLnB1c2godyksdys9ZVtiXS5sZW5ndGgsVW4oaCxlW2JdKTtlPUZzLnRyaWFuZ3VsYXRlKGgsbSk7Zm9yKGI9MDtiPGUubGVuZ3RoO2IrPTMpdS5wdXNoKGUuc2xpY2UoYixiKzMpKTtyZXR1cm4gdX19O1NlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHphLnByb3RvdHlwZSk7ClNlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1TZTtTZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGI9emEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO3JldHVybiBWbih0aGlzLnBhcmFtZXRlcnMuc2hhcGVzLHRoaXMucGFyYW1ldGVycy5vcHRpb25zLGIpfTt6ZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO3pkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj16ZDt6ZC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGI9eGEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO3JldHVybiBWbih0aGlzLnBhcmFtZXRlcnMuc2hhcGVzLHRoaXMucGFyYW1ldGVycy5vcHRpb25zLGIpfTt2YXIgaHM9e2dlbmVyYXRlVG9wVVY6ZnVuY3Rpb24oYixlLGgsbSx1KXtiPWVbMyptXTttPWVbMyptKzFdO3ZhciB3PWVbMyp1XTt1PWVbMyp1KzFdO3JldHVybltuZXcgZChlWzMqaF0sZVszKmgrMV0pLG5ldyBkKGIsbSksbmV3IGQodyx1KV19LGdlbmVyYXRlU2lkZVdhbGxVVjpmdW5jdGlvbihiLAplLGgsbSx1LHcpe2I9ZVszKmhdO3ZhciBBPWVbMypoKzFdO2g9ZVszKmgrMl07dmFyIEU9ZVszKm1dLEc9ZVszKm0rMV07bT1lWzMqbSsyXTt2YXIgSj1lWzMqdV0sUT1lWzMqdSsxXTt1PWVbMyp1KzJdO3ZhciBTPWVbMyp3XSxUPWVbMyp3KzFdO2U9ZVszKncrMl07cmV0dXJuLjAxPk1hdGguYWJzKEEtRyk/W25ldyBkKGIsMS1oKSxuZXcgZChFLDEtbSksbmV3IGQoSiwxLXUpLG5ldyBkKFMsMS1lKV06W25ldyBkKEEsMS1oKSxuZXcgZChHLDEtbSksbmV3IGQoUSwxLXUpLG5ldyBkKFQsMS1lKV19fTt2aC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh6YS5wcm90b3R5cGUpO3ZoLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj12aDtYZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh6ZC5wcm90b3R5cGUpO1hmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1YZjt3aC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh6YS5wcm90b3R5cGUpO3doLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj13aDtzZS5wcm90b3R5cGU9Ck9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTtzZS5wcm90b3R5cGUuY29uc3RydWN0b3I9c2U7eGgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoemEucHJvdG90eXBlKTt4aC5wcm90b3R5cGUuY29uc3RydWN0b3I9eGg7WWYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTtZZi5wcm90b3R5cGUuY29uc3RydWN0b3I9WWY7eWgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoemEucHJvdG90eXBlKTt5aC5wcm90b3R5cGUuY29uc3RydWN0b3I9eWg7WmYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTtaZi5wcm90b3R5cGUuY29uc3RydWN0b3I9WmY7VGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoemEucHJvdG90eXBlKTtUZS5wcm90b3R5cGUuY29uc3RydWN0b3I9VGU7VGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBiPXphLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtyZXR1cm4gV24odGhpcy5wYXJhbWV0ZXJzLnNoYXBlcywKYil9O1VlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7VWUucHJvdG90eXBlLmNvbnN0cnVjdG9yPVVlO1VlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYj14YS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7cmV0dXJuIFduKHRoaXMucGFyYW1ldGVycy5zaGFwZXMsYil9OyRmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7JGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPSRmO1ZlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHphLnByb3RvdHlwZSk7VmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPVZlO1BkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7UGQucHJvdG90eXBlLmNvbnN0cnVjdG9yPVBkO3poLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFZlLnByb3RvdHlwZSk7emgucHJvdG90eXBlLmNvbnN0cnVjdG9yPXpoO0FoLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFBkLnByb3RvdHlwZSk7QWgucHJvdG90eXBlLmNvbnN0cnVjdG9yPQpBaDtCaC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh6YS5wcm90b3R5cGUpO0JoLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1CaDthZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO2FnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hZzt2YXIgQ2M9T2JqZWN0LmZyZWV6ZSh7V2lyZWZyYW1lR2VvbWV0cnk6UGYsUGFyYW1ldHJpY0dlb21ldHJ5OmloLFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeTpRZixUZXRyYWhlZHJvbkdlb21ldHJ5OmtoLFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk6UmYsT2N0YWhlZHJvbkdlb21ldHJ5OmxoLE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeTpQZSxJY29zYWhlZHJvbkdlb21ldHJ5Om1oLEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnk6U2YsRG9kZWNhaGVkcm9uR2VvbWV0cnk6bmgsRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnk6VGYsUG9seWhlZHJvbkdlb21ldHJ5OmpoLFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeTpGYyxUdWJlR2VvbWV0cnk6b2gsClR1YmVCdWZmZXJHZW9tZXRyeTpRZSxUb3J1c0tub3RHZW9tZXRyeTpwaCxUb3J1c0tub3RCdWZmZXJHZW9tZXRyeTpVZixUb3J1c0dlb21ldHJ5OnFoLFRvcnVzQnVmZmVyR2VvbWV0cnk6VmYsVGV4dEdlb21ldHJ5OnZoLFRleHRCdWZmZXJHZW9tZXRyeTpYZixTcGhlcmVHZW9tZXRyeTp3aCxTcGhlcmVCdWZmZXJHZW9tZXRyeTpzZSxSaW5nR2VvbWV0cnk6eGgsUmluZ0J1ZmZlckdlb21ldHJ5OllmLFBsYW5lR2VvbWV0cnk6aWUsUGxhbmVCdWZmZXJHZW9tZXRyeTp0ZCxMYXRoZUdlb21ldHJ5OnloLExhdGhlQnVmZmVyR2VvbWV0cnk6WmYsU2hhcGVHZW9tZXRyeTpUZSxTaGFwZUJ1ZmZlckdlb21ldHJ5OlVlLEV4dHJ1ZGVHZW9tZXRyeTpTZSxFeHRydWRlQnVmZmVyR2VvbWV0cnk6emQsRWRnZXNHZW9tZXRyeTokZixDb25lR2VvbWV0cnk6emgsQ29uZUJ1ZmZlckdlb21ldHJ5OkFoLEN5bGluZGVyR2VvbWV0cnk6VmUsQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeTpQZCxDaXJjbGVHZW9tZXRyeTpCaCwKQ2lyY2xlQnVmZmVyR2VvbWV0cnk6YWcsQm94R2VvbWV0cnk6VWEsQm94QnVmZmVyR2VvbWV0cnk6WmF9KTtXZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7V2UucHJvdG90eXBlLmNvbnN0cnVjdG9yPVdlO1dlLnByb3RvdHlwZS5pc1NoYWRvd01hdGVyaWFsPSEwO1dlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMuY29sb3IuY29weShiLmNvbG9yKTtyZXR1cm4gdGhpc307YmcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodWIucHJvdG90eXBlKTtiZy5wcm90b3R5cGUuY29uc3RydWN0b3I9Ymc7YmcucHJvdG90eXBlLmlzUmF3U2hhZGVyTWF0ZXJpYWw9ITA7QWQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO0FkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1BZDtBZC5wcm90b3R5cGUuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD0hMDtBZC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihiKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYik7dGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIn07dGhpcy5jb2xvci5jb3B5KGIuY29sb3IpO3RoaXMucm91Z2huZXNzPWIucm91Z2huZXNzO3RoaXMubWV0YWxuZXNzPWIubWV0YWxuZXNzO3RoaXMubWFwPWIubWFwO3RoaXMubGlnaHRNYXA9Yi5saWdodE1hcDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PWIubGlnaHRNYXBJbnRlbnNpdHk7dGhpcy5hb01hcD1iLmFvTWFwO3RoaXMuYW9NYXBJbnRlbnNpdHk9Yi5hb01hcEludGVuc2l0eTt0aGlzLmVtaXNzaXZlLmNvcHkoYi5lbWlzc2l2ZSk7dGhpcy5lbWlzc2l2ZU1hcD1iLmVtaXNzaXZlTWFwO3RoaXMuZW1pc3NpdmVJbnRlbnNpdHk9Yi5lbWlzc2l2ZUludGVuc2l0eTt0aGlzLmJ1bXBNYXA9Yi5idW1wTWFwO3RoaXMuYnVtcFNjYWxlPWIuYnVtcFNjYWxlO3RoaXMubm9ybWFsTWFwPWIubm9ybWFsTWFwO3RoaXMubm9ybWFsTWFwVHlwZT1iLm5vcm1hbE1hcFR5cGU7dGhpcy5ub3JtYWxTY2FsZS5jb3B5KGIubm9ybWFsU2NhbGUpOwp0aGlzLmRpc3BsYWNlbWVudE1hcD1iLmRpc3BsYWNlbWVudE1hcDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPWIuZGlzcGxhY2VtZW50U2NhbGU7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPWIuZGlzcGxhY2VtZW50Qmlhczt0aGlzLnJvdWdobmVzc01hcD1iLnJvdWdobmVzc01hcDt0aGlzLm1ldGFsbmVzc01hcD1iLm1ldGFsbmVzc01hcDt0aGlzLmFscGhhTWFwPWIuYWxwaGFNYXA7dGhpcy5lbnZNYXA9Yi5lbnZNYXA7dGhpcy5lbnZNYXBJbnRlbnNpdHk9Yi5lbnZNYXBJbnRlbnNpdHk7dGhpcy5yZWZyYWN0aW9uUmF0aW89Yi5yZWZyYWN0aW9uUmF0aW87dGhpcy53aXJlZnJhbWU9Yi53aXJlZnJhbWU7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9Yi53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy53aXJlZnJhbWVMaW5lY2FwPWIud2lyZWZyYW1lTGluZWNhcDt0aGlzLndpcmVmcmFtZUxpbmVqb2luPWIud2lyZWZyYW1lTGluZWpvaW47dGhpcy5za2lubmluZz1iLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPQpiLm1vcnBoVGFyZ2V0czt0aGlzLm1vcnBoTm9ybWFscz1iLm1vcnBoTm9ybWFscztyZXR1cm4gdGhpc307WGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoQWQucHJvdG90eXBlKTtYZS5wcm90b3R5cGUuY29uc3RydWN0b3I9WGU7WGUucHJvdG90eXBlLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWw9ITA7WGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7QWQucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMuZGVmaW5lcz17U1RBTkRBUkQ6IiIsUEhZU0lDQUw6IiJ9O3RoaXMucmVmbGVjdGl2aXR5PWIucmVmbGVjdGl2aXR5O3RoaXMuY2xlYXJjb2F0PWIuY2xlYXJjb2F0O3RoaXMuY2xlYXJjb2F0Um91Z2huZXNzPWIuY2xlYXJjb2F0Um91Z2huZXNzO3RoaXMuc2hlZW49Yi5zaGVlbj8odGhpcy5zaGVlbnx8bmV3IEkpLmNvcHkoYi5zaGVlbik6bnVsbDt0aGlzLmNsZWFyY29hdE5vcm1hbE1hcD1iLmNsZWFyY29hdE5vcm1hbE1hcDt0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLmNvcHkoYi5jbGVhcmNvYXROb3JtYWxTY2FsZSk7CnRoaXMudHJhbnNwYXJlbmN5PWIudHJhbnNwYXJlbmN5O3JldHVybiB0aGlzfTtkZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7ZGQucHJvdG90eXBlLmNvbnN0cnVjdG9yPWRkO2RkLnByb3RvdHlwZS5pc01lc2hQaG9uZ01hdGVyaWFsPSEwO2RkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMuY29sb3IuY29weShiLmNvbG9yKTt0aGlzLnNwZWN1bGFyLmNvcHkoYi5zcGVjdWxhcik7dGhpcy5zaGluaW5lc3M9Yi5zaGluaW5lc3M7dGhpcy5tYXA9Yi5tYXA7dGhpcy5saWdodE1hcD1iLmxpZ2h0TWFwO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9Yi5saWdodE1hcEludGVuc2l0eTt0aGlzLmFvTWFwPWIuYW9NYXA7dGhpcy5hb01hcEludGVuc2l0eT1iLmFvTWFwSW50ZW5zaXR5O3RoaXMuZW1pc3NpdmUuY29weShiLmVtaXNzaXZlKTt0aGlzLmVtaXNzaXZlTWFwPWIuZW1pc3NpdmVNYXA7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT0KYi5lbWlzc2l2ZUludGVuc2l0eTt0aGlzLmJ1bXBNYXA9Yi5idW1wTWFwO3RoaXMuYnVtcFNjYWxlPWIuYnVtcFNjYWxlO3RoaXMubm9ybWFsTWFwPWIubm9ybWFsTWFwO3RoaXMubm9ybWFsTWFwVHlwZT1iLm5vcm1hbE1hcFR5cGU7dGhpcy5ub3JtYWxTY2FsZS5jb3B5KGIubm9ybWFsU2NhbGUpO3RoaXMuZGlzcGxhY2VtZW50TWFwPWIuZGlzcGxhY2VtZW50TWFwO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9Yi5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9Yi5kaXNwbGFjZW1lbnRCaWFzO3RoaXMuc3BlY3VsYXJNYXA9Yi5zcGVjdWxhck1hcDt0aGlzLmFscGhhTWFwPWIuYWxwaGFNYXA7dGhpcy5lbnZNYXA9Yi5lbnZNYXA7dGhpcy5jb21iaW5lPWIuY29tYmluZTt0aGlzLnJlZmxlY3Rpdml0eT1iLnJlZmxlY3Rpdml0eTt0aGlzLnJlZnJhY3Rpb25SYXRpbz1iLnJlZnJhY3Rpb25SYXRpbzt0aGlzLndpcmVmcmFtZT1iLndpcmVmcmFtZTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0KYi53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy53aXJlZnJhbWVMaW5lY2FwPWIud2lyZWZyYW1lTGluZWNhcDt0aGlzLndpcmVmcmFtZUxpbmVqb2luPWIud2lyZWZyYW1lTGluZWpvaW47dGhpcy5za2lubmluZz1iLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWIubW9ycGhUYXJnZXRzO3RoaXMubW9ycGhOb3JtYWxzPWIubW9ycGhOb3JtYWxzO3JldHVybiB0aGlzfTtZZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShkZC5wcm90b3R5cGUpO1llLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1ZZTtZZS5wcm90b3R5cGUuaXNNZXNoVG9vbk1hdGVyaWFsPSEwO1llLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe2RkLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLmdyYWRpZW50TWFwPWIuZ3JhZGllbnRNYXA7cmV0dXJuIHRoaXN9O1plLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtaZS5wcm90b3R5cGUuY29uc3RydWN0b3I9WmU7WmUucHJvdG90eXBlLmlzTWVzaE5vcm1hbE1hdGVyaWFsPQohMDtaZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbihiKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLmJ1bXBNYXA9Yi5idW1wTWFwO3RoaXMuYnVtcFNjYWxlPWIuYnVtcFNjYWxlO3RoaXMubm9ybWFsTWFwPWIubm9ybWFsTWFwO3RoaXMubm9ybWFsTWFwVHlwZT1iLm5vcm1hbE1hcFR5cGU7dGhpcy5ub3JtYWxTY2FsZS5jb3B5KGIubm9ybWFsU2NhbGUpO3RoaXMuZGlzcGxhY2VtZW50TWFwPWIuZGlzcGxhY2VtZW50TWFwO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9Yi5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9Yi5kaXNwbGFjZW1lbnRCaWFzO3RoaXMud2lyZWZyYW1lPWIud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWIud2lyZWZyYW1lTGluZXdpZHRoO3RoaXMuc2tpbm5pbmc9Yi5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1iLm1vcnBoVGFyZ2V0czt0aGlzLm1vcnBoTm9ybWFscz1iLm1vcnBoTm9ybWFscztyZXR1cm4gdGhpc307CiRlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTskZS5wcm90b3R5cGUuY29uc3RydWN0b3I9JGU7JGUucHJvdG90eXBlLmlzTWVzaExhbWJlcnRNYXRlcmlhbD0hMDskZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbihiKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLmNvbG9yLmNvcHkoYi5jb2xvcik7dGhpcy5tYXA9Yi5tYXA7dGhpcy5saWdodE1hcD1iLmxpZ2h0TWFwO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9Yi5saWdodE1hcEludGVuc2l0eTt0aGlzLmFvTWFwPWIuYW9NYXA7dGhpcy5hb01hcEludGVuc2l0eT1iLmFvTWFwSW50ZW5zaXR5O3RoaXMuZW1pc3NpdmUuY29weShiLmVtaXNzaXZlKTt0aGlzLmVtaXNzaXZlTWFwPWIuZW1pc3NpdmVNYXA7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT1iLmVtaXNzaXZlSW50ZW5zaXR5O3RoaXMuc3BlY3VsYXJNYXA9Yi5zcGVjdWxhck1hcDt0aGlzLmFscGhhTWFwPWIuYWxwaGFNYXA7dGhpcy5lbnZNYXA9CmIuZW52TWFwO3RoaXMuY29tYmluZT1iLmNvbWJpbmU7dGhpcy5yZWZsZWN0aXZpdHk9Yi5yZWZsZWN0aXZpdHk7dGhpcy5yZWZyYWN0aW9uUmF0aW89Yi5yZWZyYWN0aW9uUmF0aW87dGhpcy53aXJlZnJhbWU9Yi53aXJlZnJhbWU7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9Yi53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy53aXJlZnJhbWVMaW5lY2FwPWIud2lyZWZyYW1lTGluZWNhcDt0aGlzLndpcmVmcmFtZUxpbmVqb2luPWIud2lyZWZyYW1lTGluZWpvaW47dGhpcy5za2lubmluZz1iLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWIubW9ycGhUYXJnZXRzO3RoaXMubW9ycGhOb3JtYWxzPWIubW9ycGhOb3JtYWxzO3JldHVybiB0aGlzfTthZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7YWYucHJvdG90eXBlLmNvbnN0cnVjdG9yPWFmO2FmLnByb3RvdHlwZS5pc01lc2hNYXRjYXBNYXRlcmlhbD0hMDthZi5wcm90b3R5cGUuY29weT1mdW5jdGlvbihiKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYik7dGhpcy5kZWZpbmVzPXtNQVRDQVA6IiJ9O3RoaXMuY29sb3IuY29weShiLmNvbG9yKTt0aGlzLm1hdGNhcD1iLm1hdGNhcDt0aGlzLm1hcD1iLm1hcDt0aGlzLmJ1bXBNYXA9Yi5idW1wTWFwO3RoaXMuYnVtcFNjYWxlPWIuYnVtcFNjYWxlO3RoaXMubm9ybWFsTWFwPWIubm9ybWFsTWFwO3RoaXMubm9ybWFsTWFwVHlwZT1iLm5vcm1hbE1hcFR5cGU7dGhpcy5ub3JtYWxTY2FsZS5jb3B5KGIubm9ybWFsU2NhbGUpO3RoaXMuZGlzcGxhY2VtZW50TWFwPWIuZGlzcGxhY2VtZW50TWFwO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9Yi5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9Yi5kaXNwbGFjZW1lbnRCaWFzO3RoaXMuYWxwaGFNYXA9Yi5hbHBoYU1hcDt0aGlzLnNraW5uaW5nPWIuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9Yi5tb3JwaFRhcmdldHM7dGhpcy5tb3JwaE5vcm1hbHM9Yi5tb3JwaE5vcm1hbHM7cmV0dXJuIHRoaXN9O2JmLnByb3RvdHlwZT0KT2JqZWN0LmNyZWF0ZShPYi5wcm90b3R5cGUpO2JmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iZjtiZi5wcm90b3R5cGUuaXNMaW5lRGFzaGVkTWF0ZXJpYWw9ITA7YmYucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7T2IucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMuc2NhbGU9Yi5zY2FsZTt0aGlzLmRhc2hTaXplPWIuZGFzaFNpemU7dGhpcy5nYXBTaXplPWIuZ2FwU2l6ZTtyZXR1cm4gdGhpc307dmFyIEdzPU9iamVjdC5mcmVlemUoe1NoYWRvd01hdGVyaWFsOldlLFNwcml0ZU1hdGVyaWFsOnJlLFJhd1NoYWRlck1hdGVyaWFsOmJnLFNoYWRlck1hdGVyaWFsOnViLFBvaW50c01hdGVyaWFsOmNkLE1lc2hQaHlzaWNhbE1hdGVyaWFsOlhlLE1lc2hTdGFuZGFyZE1hdGVyaWFsOkFkLE1lc2hQaG9uZ01hdGVyaWFsOmRkLE1lc2hUb29uTWF0ZXJpYWw6WWUsTWVzaE5vcm1hbE1hdGVyaWFsOlplLE1lc2hMYW1iZXJ0TWF0ZXJpYWw6JGUsTWVzaERlcHRoTWF0ZXJpYWw6bWUsCk1lc2hEaXN0YW5jZU1hdGVyaWFsOm5lLE1lc2hCYXNpY01hdGVyaWFsOkwsTWVzaE1hdGNhcE1hdGVyaWFsOmFmLExpbmVEYXNoZWRNYXRlcmlhbDpiZixMaW5lQmFzaWNNYXRlcmlhbDpPYixNYXRlcmlhbDpNfSksamM9e2FycmF5U2xpY2U6ZnVuY3Rpb24oYixlLGgpe3JldHVybiBqYy5pc1R5cGVkQXJyYXkoYik/bmV3IGIuY29uc3RydWN0b3IoYi5zdWJhcnJheShlLHZvaWQgMCE9PWg/aDpiLmxlbmd0aCkpOmIuc2xpY2UoZSxoKX0sY29udmVydEFycmF5OmZ1bmN0aW9uKGIsZSxoKXtyZXR1cm4hYnx8IWgmJmIuY29uc3RydWN0b3I9PT1lP2I6Im51bWJlciI9PT10eXBlb2YgZS5CWVRFU19QRVJfRUxFTUVOVD9uZXcgZShiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChiKX0saXNUeXBlZEFycmF5OmZ1bmN0aW9uKGIpe3JldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoYikmJiEoYiBpbnN0YW5jZW9mIERhdGFWaWV3KX0sZ2V0S2V5ZnJhbWVPcmRlcjpmdW5jdGlvbihiKXtmb3IodmFyIGU9CmIubGVuZ3RoLGg9QXJyYXkoZSksbT0wO20hPT1lOysrbSloW21dPW07aC5zb3J0KGZ1bmN0aW9uKHUsdyl7cmV0dXJuIGJbdV0tYlt3XX0pO3JldHVybiBofSxzb3J0ZWRBcnJheTpmdW5jdGlvbihiLGUsaCl7Zm9yKHZhciBtPWIubGVuZ3RoLHU9bmV3IGIuY29uc3RydWN0b3IobSksdz0wLEE9MDtBIT09bTsrK3cpZm9yKHZhciBFPWhbd10qZSxHPTA7RyE9PWU7KytHKXVbQSsrXT1iW0UrR107cmV0dXJuIHV9LGZsYXR0ZW5KU09OOmZ1bmN0aW9uKGIsZSxoLG0pe2Zvcih2YXIgdT0xLHc9YlswXTt2b2lkIDAhPT13JiZ2b2lkIDA9PT13W21dOyl3PWJbdSsrXTtpZih2b2lkIDAhPT13KXt2YXIgQT13W21dO2lmKHZvaWQgMCE9PUEpaWYoQXJyYXkuaXNBcnJheShBKSl7ZG8gQT13W21dLHZvaWQgMCE9PUEmJihlLnB1c2gody50aW1lKSxoLnB1c2guYXBwbHkoaCxBKSksdz1iW3UrK107d2hpbGUodm9pZCAwIT09dyl9ZWxzZSBpZih2b2lkIDAhPT1BLnRvQXJyYXkpe2RvIEE9d1ttXSwKdm9pZCAwIT09QSYmKGUucHVzaCh3LnRpbWUpLEEudG9BcnJheShoLGgubGVuZ3RoKSksdz1iW3UrK107d2hpbGUodm9pZCAwIT09dyl9ZWxzZXtkbyBBPXdbbV0sdm9pZCAwIT09QSYmKGUucHVzaCh3LnRpbWUpLGgucHVzaChBKSksdz1iW3UrK107d2hpbGUodm9pZCAwIT09dyl9fX19O09iamVjdC5hc3NpZ24oS2MucHJvdG90eXBlLHtldmFsdWF0ZTpmdW5jdGlvbihiKXt2YXIgZT10aGlzLnBhcmFtZXRlclBvc2l0aW9ucyxoPXRoaXMuX2NhY2hlZEluZGV4LG09ZVtoXSx1PWVbaC0xXTthOntiOntjOntkOmlmKCEoYjxtKSl7Zm9yKHZhciB3PWgrMjs7KXtpZih2b2lkIDA9PT1tKXtpZihiPHUpYnJlYWsgZDt0aGlzLl9jYWNoZWRJbmRleD1oPWUubGVuZ3RoO3JldHVybiB0aGlzLmFmdGVyRW5kXyhoLTEsYix1KX1pZihoPT09dylicmVhazt1PW07bT1lWysraF07aWYoYjxtKWJyZWFrIGJ9bT1lLmxlbmd0aDticmVhayBjfWlmKGI+PXUpYnJlYWsgYTtlbHNle3c9ZVsxXTtiPHcmJgooaD0yLHU9dyk7Zm9yKHc9aC0yOzspe2lmKHZvaWQgMD09PXUpcmV0dXJuIHRoaXMuX2NhY2hlZEluZGV4PTAsdGhpcy5iZWZvcmVTdGFydF8oMCxiLG0pO2lmKGg9PT13KWJyZWFrO209dTt1PWVbLS1oLTFdO2lmKGI+PXUpYnJlYWsgYn1tPWg7aD0wfX1mb3IoO2g8bTspdT1oK20+Pj4xLGI8ZVt1XT9tPXU6aD11KzE7bT1lW2hdO3U9ZVtoLTFdO2lmKHZvaWQgMD09PXUpcmV0dXJuIHRoaXMuX2NhY2hlZEluZGV4PTAsdGhpcy5iZWZvcmVTdGFydF8oMCxiLG0pO2lmKHZvaWQgMD09PW0pcmV0dXJuIHRoaXMuX2NhY2hlZEluZGV4PWg9ZS5sZW5ndGgsdGhpcy5hZnRlckVuZF8oaC0xLHUsYil9dGhpcy5fY2FjaGVkSW5kZXg9aDt0aGlzLmludGVydmFsQ2hhbmdlZF8oaCx1LG0pfXJldHVybiB0aGlzLmludGVycG9sYXRlXyhoLHUsYixtKX0sc2V0dGluZ3M6bnVsbCxEZWZhdWx0U2V0dGluZ3NfOnt9LGdldFNldHRpbmdzXzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNldHRpbmdzfHwKdGhpcy5EZWZhdWx0U2V0dGluZ3NffSxjb3B5U2FtcGxlVmFsdWVfOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMucmVzdWx0QnVmZmVyLGg9dGhpcy5zYW1wbGVWYWx1ZXMsbT10aGlzLnZhbHVlU2l6ZTtiKj1tO2Zvcih2YXIgdT0wO3UhPT1tOysrdSllW3VdPWhbYit1XTtyZXR1cm4gZX0saW50ZXJwb2xhdGVfOmZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoImNhbGwgdG8gYWJzdHJhY3QgbWV0aG9kIik7fSxpbnRlcnZhbENoYW5nZWRfOmZ1bmN0aW9uKCl7fX0pO09iamVjdC5hc3NpZ24oS2MucHJvdG90eXBlLHtiZWZvcmVTdGFydF86S2MucHJvdG90eXBlLmNvcHlTYW1wbGVWYWx1ZV8sYWZ0ZXJFbmRfOktjLnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVffSk7QmkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShLYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpCaSxEZWZhdWx0U2V0dGluZ3NfOntlbmRpbmdTdGFydDoyNDAwLGVuZGluZ0VuZDoyNDAwfSxpbnRlcnZhbENoYW5nZWRfOmZ1bmN0aW9uKGIsCmUsaCl7dmFyIG09dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMsdT1iLTIsdz1iKzEsQT1tW3VdLEU9bVt3XTtpZih2b2lkIDA9PT1BKXN3aXRjaCh0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ1N0YXJ0KXtjYXNlIDI0MDE6dT1iO0E9MiplLWg7YnJlYWs7Y2FzZSAyNDAyOnU9bS5sZW5ndGgtMjtBPWUrbVt1XS1tW3UrMV07YnJlYWs7ZGVmYXVsdDp1PWIsQT1ofWlmKHZvaWQgMD09PUUpc3dpdGNoKHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nRW5kKXtjYXNlIDI0MDE6dz1iO0U9MipoLWU7YnJlYWs7Y2FzZSAyNDAyOnc9MTtFPWgrbVsxXS1tWzBdO2JyZWFrO2RlZmF1bHQ6dz1iLTEsRT1lfWI9LjUqKGgtZSk7bT10aGlzLnZhbHVlU2l6ZTt0aGlzLl93ZWlnaHRQcmV2PWIvKGUtQSk7dGhpcy5fd2VpZ2h0TmV4dD1iLyhFLWgpO3RoaXMuX29mZnNldFByZXY9dSptO3RoaXMuX29mZnNldE5leHQ9dyptfSxpbnRlcnBvbGF0ZV86ZnVuY3Rpb24oYixlLGgsbSl7dmFyIHU9dGhpcy5yZXN1bHRCdWZmZXIsCnc9dGhpcy5zYW1wbGVWYWx1ZXMsQT10aGlzLnZhbHVlU2l6ZTtiKj1BO3ZhciBFPWItQSxHPXRoaXMuX29mZnNldFByZXYsSj10aGlzLl9vZmZzZXROZXh0LFE9dGhpcy5fd2VpZ2h0UHJldixTPXRoaXMuX3dlaWdodE5leHQsVD0oaC1lKS8obS1lKTtoPVQqVDttPWgqVDtlPS1RKm0rMipRKmgtUSpUO1E9KDErUSkqbSsoLTEuNS0yKlEpKmgrKC0uNStRKSpUKzE7VD0oLTEtUykqbSsoMS41K1MpKmgrLjUqVDtTPVMqbS1TKmg7Zm9yKGg9MDtoIT09QTsrK2gpdVtoXT1lKndbRytoXStRKndbRStoXStUKndbYitoXStTKndbSitoXTtyZXR1cm4gdX19KTtDaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEtjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkNoLGludGVycG9sYXRlXzpmdW5jdGlvbihiLGUsaCxtKXt2YXIgdT10aGlzLnJlc3VsdEJ1ZmZlcix3PXRoaXMuc2FtcGxlVmFsdWVzLEE9dGhpcy52YWx1ZVNpemU7Yio9QTt2YXIgRT1iLUE7ZT0oaC1lKS8obS0KZSk7aD0xLWU7Zm9yKG09MDttIT09QTsrK20pdVttXT13W0UrbV0qaCt3W2IrbV0qZTtyZXR1cm4gdX19KTtDaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEtjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkNpLGludGVycG9sYXRlXzpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5jb3B5U2FtcGxlVmFsdWVfKGItMSl9fSk7T2JqZWN0LmFzc2lnbihvYyx7dG9KU09OOmZ1bmN0aW9uKGIpe3ZhciBlPWIuY29uc3RydWN0b3I7aWYodm9pZCAwIT09ZS50b0pTT04pZT1lLnRvSlNPTihiKTtlbHNle2U9e25hbWU6Yi5uYW1lLHRpbWVzOmpjLmNvbnZlcnRBcnJheShiLnRpbWVzLEFycmF5KSx2YWx1ZXM6amMuY29udmVydEFycmF5KGIudmFsdWVzLEFycmF5KX07dmFyIGg9Yi5nZXRJbnRlcnBvbGF0aW9uKCk7aCE9PWIuRGVmYXVsdEludGVycG9sYXRpb24mJihlLmludGVycG9sYXRpb249aCl9ZS50eXBlPWIuVmFsdWVUeXBlTmFtZTtyZXR1cm4gZX19KTtPYmplY3QuYXNzaWduKG9jLnByb3RvdHlwZSwKe2NvbnN0cnVjdG9yOm9jLFRpbWVCdWZmZXJUeXBlOkZsb2F0MzJBcnJheSxWYWx1ZUJ1ZmZlclR5cGU6RmxvYXQzMkFycmF5LERlZmF1bHRJbnRlcnBvbGF0aW9uOjIzMDEsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU6ZnVuY3Rpb24oYil7cmV0dXJuIG5ldyBDaSh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksYil9LEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjpmdW5jdGlvbihiKXtyZXR1cm4gbmV3IENoKHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSxiKX0sSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOmZ1bmN0aW9uKGIpe3JldHVybiBuZXcgQmkodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLGIpfSxzZXRJbnRlcnBvbGF0aW9uOmZ1bmN0aW9uKGIpe3N3aXRjaChiKXtjYXNlIDIzMDA6dmFyIGU9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTsKYnJlYWs7Y2FzZSAyMzAxOmU9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI7YnJlYWs7Y2FzZSAyMzAyOmU9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGh9aWYodm9pZCAwPT09ZSl7ZT0idW5zdXBwb3J0ZWQgaW50ZXJwb2xhdGlvbiBmb3IgIit0aGlzLlZhbHVlVHlwZU5hbWUrIiBrZXlmcmFtZSB0cmFjayBuYW1lZCAiK3RoaXMubmFtZTtpZih2b2lkIDA9PT10aGlzLmNyZWF0ZUludGVycG9sYW50KWlmKGIhPT10aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uKXRoaXMuc2V0SW50ZXJwb2xhdGlvbih0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uKTtlbHNlIHRocm93IEVycm9yKGUpO2NvbnNvbGUud2FybigiVEhSRUUuS2V5ZnJhbWVUcmFjazoiLGUpO3JldHVybiB0aGlzfXRoaXMuY3JlYXRlSW50ZXJwb2xhbnQ9ZTtyZXR1cm4gdGhpc30sZ2V0SW50ZXJwb2xhdGlvbjpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLmNyZWF0ZUludGVycG9sYW50KXtjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU6cmV0dXJuIDIzMDA7CmNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6cmV0dXJuIDIzMDE7Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDpyZXR1cm4gMjMwMn19LGdldFZhbHVlU2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlcy5sZW5ndGgvdGhpcy50aW1lcy5sZW5ndGh9LHNoaWZ0OmZ1bmN0aW9uKGIpe2lmKDAhPT1iKWZvcih2YXIgZT10aGlzLnRpbWVzLGg9MCxtPWUubGVuZ3RoO2ghPT1tOysraCllW2hdKz1iO3JldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihiKXtpZigxIT09Yilmb3IodmFyIGU9dGhpcy50aW1lcyxoPTAsbT1lLmxlbmd0aDtoIT09bTsrK2gpZVtoXSo9YjtyZXR1cm4gdGhpc30sdHJpbTpmdW5jdGlvbihiLGUpe2Zvcih2YXIgaD10aGlzLnRpbWVzLG09aC5sZW5ndGgsdT0wLHc9bS0xO3UhPT1tJiZoW3VdPGI7KSsrdTtmb3IoOy0xIT09dyYmaFt3XT5lOyktLXc7Kyt3O2lmKDAhPT11fHx3IT09bSl1Pj13JiYodz1NYXRoLm1heCh3LAoxKSx1PXctMSksYj10aGlzLmdldFZhbHVlU2l6ZSgpLHRoaXMudGltZXM9amMuYXJyYXlTbGljZShoLHUsdyksdGhpcy52YWx1ZXM9amMuYXJyYXlTbGljZSh0aGlzLnZhbHVlcyx1KmIsdypiKTtyZXR1cm4gdGhpc30sdmFsaWRhdGU6ZnVuY3Rpb24oKXt2YXIgYj0hMCxlPXRoaXMuZ2V0VmFsdWVTaXplKCk7MCE9PWUtTWF0aC5mbG9vcihlKSYmKGNvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IEludmFsaWQgdmFsdWUgc2l6ZSBpbiB0cmFjay4iLHRoaXMpLGI9ITEpO3ZhciBoPXRoaXMudGltZXM7ZT10aGlzLnZhbHVlczt2YXIgbT1oLmxlbmd0aDswPT09bSYmKGNvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFRyYWNrIGlzIGVtcHR5LiIsdGhpcyksYj0hMSk7Zm9yKHZhciB1PW51bGwsdz0wO3chPT1tO3crKyl7dmFyIEE9aFt3XTtpZigibnVtYmVyIj09PXR5cGVvZiBBJiZpc05hTihBKSl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVGltZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuIiwKdGhpcyx3LEEpO2I9ITE7YnJlYWt9aWYobnVsbCE9PXUmJnU+QSl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogT3V0IG9mIG9yZGVyIGtleXMuIix0aGlzLHcsQSx1KTtiPSExO2JyZWFrfXU9QX1pZih2b2lkIDAhPT1lJiZqYy5pc1R5cGVkQXJyYXkoZSkpZm9yKHc9MCxoPWUubGVuZ3RoO3chPT1oOysrdylpZihtPWVbd10saXNOYU4obSkpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlci4iLHRoaXMsdyxtKTtiPSExO2JyZWFrfXJldHVybiBifSxvcHRpbWl6ZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnRpbWVzLGU9dGhpcy52YWx1ZXMsaD10aGlzLmdldFZhbHVlU2l6ZSgpLG09MjMwMj09PXRoaXMuZ2V0SW50ZXJwb2xhdGlvbigpLHU9MSx3PWIubGVuZ3RoLTEsQT0xO0E8dzsrK0Epe3ZhciBFPSExLEc9YltBXTtpZihHIT09YltBKzFdJiYoMSE9PUF8fEchPT1HWzBdKSlpZihtKUU9ITA7CmVsc2V7dmFyIEo9QSpoLFE9Si1oLFM9SitoO2ZvcihHPTA7RyE9PWg7KytHKXt2YXIgVD1lW0orR107aWYoVCE9PWVbUStHXXx8VCE9PWVbUytHXSl7RT0hMDticmVha319fWlmKEUpe2lmKEEhPT11KWZvcihiW3VdPWJbQV0sRT1BKmgsSj11KmgsRz0wO0chPT1oOysrRyllW0orR109ZVtFK0ddOysrdX19aWYoMDx3KXtiW3VdPWJbd107RT13Kmg7Sj11Kmg7Zm9yKEc9MDtHIT09aDsrK0cpZVtKK0ddPWVbRStHXTsrK3V9dSE9PWIubGVuZ3RoJiYodGhpcy50aW1lcz1qYy5hcnJheVNsaWNlKGIsMCx1KSx0aGlzLnZhbHVlcz1qYy5hcnJheVNsaWNlKGUsMCx1KmgpKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgYj1qYy5hcnJheVNsaWNlKHRoaXMudGltZXMsMCksZT1qYy5hcnJheVNsaWNlKHRoaXMudmFsdWVzLDApO2I9bmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5uYW1lLGIsZSk7Yi5jcmVhdGVJbnRlcnBvbGFudD10aGlzLmNyZWF0ZUludGVycG9sYW50O3JldHVybiBifX0pOwpEaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG9jLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkRpLFZhbHVlVHlwZU5hbWU6ImJvb2wiLFZhbHVlQnVmZmVyVHlwZTpBcnJheSxEZWZhdWx0SW50ZXJwb2xhdGlvbjoyMzAwLEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjp2b2lkIDAsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOnZvaWQgMH0pO0VpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUob2MucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6RWksVmFsdWVUeXBlTmFtZToiY29sb3IifSk7Y2cucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShvYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpjZyxWYWx1ZVR5cGVOYW1lOiJudW1iZXIifSk7RmkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShLYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpGaSxpbnRlcnBvbGF0ZV86ZnVuY3Rpb24oYiwKZSxoLG0pe3ZhciB1PXRoaXMucmVzdWx0QnVmZmVyLHc9dGhpcy5zYW1wbGVWYWx1ZXMsQT10aGlzLnZhbHVlU2l6ZTtiKj1BO2U9KGgtZSkvKG0tZSk7Zm9yKGg9YitBO2IhPT1oO2IrPTQpZi5zbGVycEZsYXQodSwwLHcsYi1BLHcsYixlKTtyZXR1cm4gdX19KTtEaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG9jLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkRoLFZhbHVlVHlwZU5hbWU6InF1YXRlcm5pb24iLERlZmF1bHRJbnRlcnBvbGF0aW9uOjIzMDEsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOmZ1bmN0aW9uKGIpe3JldHVybiBuZXcgRmkodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLGIpfSxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6dm9pZCAwfSk7R2kucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShvYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpHaSxWYWx1ZVR5cGVOYW1lOiJzdHJpbmciLApWYWx1ZUJ1ZmZlclR5cGU6QXJyYXksRGVmYXVsdEludGVycG9sYXRpb246MjMwMCxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6dm9pZCAwLEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDp2b2lkIDB9KTtkZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG9jLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmRnLFZhbHVlVHlwZU5hbWU6InZlY3RvciJ9KTtPYmplY3QuYXNzaWduKFJjLHtwYXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGU9W10saD1iLnRyYWNrcyxtPTEvKGIuZnBzfHwxKSx1PTAsdz1oLmxlbmd0aDt1IT09dzsrK3UpZS5wdXNoKGpzKGhbdV0pLnNjYWxlKG0pKTtyZXR1cm4gbmV3IFJjKGIubmFtZSxiLmR1cmF0aW9uLGUpfSx0b0pTT046ZnVuY3Rpb24oYil7dmFyIGU9W10saD1iLnRyYWNrcztiPXtuYW1lOmIubmFtZSxkdXJhdGlvbjpiLmR1cmF0aW9uLHRyYWNrczplLHV1aWQ6Yi51dWlkfTtmb3IodmFyIG09MCx1PWgubGVuZ3RoO20hPT0KdTsrK20pZS5wdXNoKG9jLnRvSlNPTihoW21dKSk7cmV0dXJuIGJ9LENyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlOmZ1bmN0aW9uKGIsZSxoLG0pe2Zvcih2YXIgdT1lLmxlbmd0aCx3PVtdLEE9MDtBPHU7QSsrKXt2YXIgRT1bXSxHPVtdO0UucHVzaCgoQSt1LTEpJXUsQSwoQSsxKSV1KTtHLnB1c2goMCwxLDApO3ZhciBKPWpjLmdldEtleWZyYW1lT3JkZXIoRSk7RT1qYy5zb3J0ZWRBcnJheShFLDEsSik7Rz1qYy5zb3J0ZWRBcnJheShHLDEsSik7bXx8MCE9PUVbMF18fChFLnB1c2godSksRy5wdXNoKEdbMF0pKTt3LnB1c2goKG5ldyBjZygiLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1siK2VbQV0ubmFtZSsiXSIsRSxHKSkuc2NhbGUoMS9oKSl9cmV0dXJuIG5ldyBSYyhiLC0xLHcpfSxmaW5kQnlOYW1lOmZ1bmN0aW9uKGIsZSl7dmFyIGg9YjtBcnJheS5pc0FycmF5KGIpfHwoaD1iLmdlb21ldHJ5JiZiLmdlb21ldHJ5LmFuaW1hdGlvbnN8fGIuYW5pbWF0aW9ucyk7Zm9yKGI9CjA7YjxoLmxlbmd0aDtiKyspaWYoaFtiXS5uYW1lPT09ZSlyZXR1cm4gaFtiXTtyZXR1cm4gbnVsbH0sQ3JlYXRlQ2xpcHNGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZXM6ZnVuY3Rpb24oYixlLGgpe2Zvcih2YXIgbT17fSx1PS9eKFtcdy1dKj8pKFtcZF0rKSQvLHc9MCxBPWIubGVuZ3RoO3c8QTt3Kyspe3ZhciBFPWJbd10sRz1FLm5hbWUubWF0Y2godSk7aWYoRyYmMTxHLmxlbmd0aCl7dmFyIEo9R1sxXTsoRz1tW0pdKXx8KG1bSl09Rz1bXSk7Ry5wdXNoKEUpfX1iPVtdO2ZvcihKIGluIG0pYi5wdXNoKFJjLkNyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlKEosbVtKXSxlLGgpKTtyZXR1cm4gYn0scGFyc2VBbmltYXRpb246ZnVuY3Rpb24oYixlKXtmdW5jdGlvbiBoKGlhLGhhLHNhLHFhLHJhKXtpZigwIT09c2EubGVuZ3RoKXt2YXIgd2E9W10scGE9W107amMuZmxhdHRlbkpTT04oc2Esd2EscGEscWEpOzAhPT13YS5sZW5ndGgmJnJhLnB1c2gobmV3IGlhKGhhLHdhLHBhKSl9fQppZighYilyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQW5pbWF0aW9uQ2xpcDogTm8gYW5pbWF0aW9uIGluIEpTT05Mb2FkZXIgZGF0YS4iKSxudWxsO3ZhciBtPVtdLHU9Yi5uYW1lfHwiZGVmYXVsdCIsdz1iLmxlbmd0aHx8LTEsQT1iLmZwc3x8MzA7Yj1iLmhpZXJhcmNoeXx8W107Zm9yKHZhciBFPTA7RTxiLmxlbmd0aDtFKyspe3ZhciBHPWJbRV0ua2V5cztpZihHJiYwIT09Ry5sZW5ndGgpaWYoR1swXS5tb3JwaFRhcmdldHMpe3c9e307Zm9yKHZhciBKPTA7SjxHLmxlbmd0aDtKKyspaWYoR1tKXS5tb3JwaFRhcmdldHMpZm9yKHZhciBRPTA7UTxHW0pdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7USsrKXdbR1tKXS5tb3JwaFRhcmdldHNbUV1dPS0xO2Zvcih2YXIgUyBpbiB3KXt2YXIgVD1bXSxXPVtdO2ZvcihRPTA7USE9PUdbSl0ubW9ycGhUYXJnZXRzLmxlbmd0aDsrK1Epe3ZhciBYPUdbSl07VC5wdXNoKFgudGltZSk7Vy5wdXNoKFgubW9ycGhUYXJnZXQ9PT1TPzE6MCl9bS5wdXNoKG5ldyBjZygiLm1vcnBoVGFyZ2V0SW5mbHVlbmNlWyIrClMrIl0iLFQsVykpfXc9dy5sZW5ndGgqKEF8fDEpfWVsc2UgSj0iLmJvbmVzWyIrZVtFXS5uYW1lKyJdIixoKGRnLEorIi5wb3NpdGlvbiIsRywicG9zIixtKSxoKERoLEorIi5xdWF0ZXJuaW9uIixHLCJyb3QiLG0pLGgoZGcsSisiLnNjYWxlIixHLCJzY2wiLG0pfXJldHVybiAwPT09bS5sZW5ndGg/bnVsbDpuZXcgUmModSx3LG0pfX0pO09iamVjdC5hc3NpZ24oUmMucHJvdG90eXBlLHtyZXNldER1cmF0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPTAsZT0wLGg9dGhpcy50cmFja3MubGVuZ3RoO2UhPT1oOysrZSl7dmFyIG09dGhpcy50cmFja3NbZV07Yj1NYXRoLm1heChiLG0udGltZXNbbS50aW1lcy5sZW5ndGgtMV0pfXRoaXMuZHVyYXRpb249YjtyZXR1cm4gdGhpc30sdHJpbTpmdW5jdGlvbigpe2Zvcih2YXIgYj0wO2I8dGhpcy50cmFja3MubGVuZ3RoO2IrKyl0aGlzLnRyYWNrc1tiXS50cmltKDAsdGhpcy5kdXJhdGlvbik7cmV0dXJuIHRoaXN9LHZhbGlkYXRlOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQohMCxlPTA7ZTx0aGlzLnRyYWNrcy5sZW5ndGg7ZSsrKWI9YiYmdGhpcy50cmFja3NbZV0udmFsaWRhdGUoKTtyZXR1cm4gYn0sb3B0aW1pemU6ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDtiPHRoaXMudHJhY2tzLmxlbmd0aDtiKyspdGhpcy50cmFja3NbYl0ub3B0aW1pemUoKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtmb3IodmFyIGI9W10sZT0wO2U8dGhpcy50cmFja3MubGVuZ3RoO2UrKyliLnB1c2godGhpcy50cmFja3NbZV0uY2xvbmUoKSk7cmV0dXJuIG5ldyBSYyh0aGlzLm5hbWUsdGhpcy5kdXJhdGlvbixiKX19KTt2YXIgZ2Y9e2VuYWJsZWQ6ITEsZmlsZXM6e30sYWRkOmZ1bmN0aW9uKGIsZSl7ITEhPT10aGlzLmVuYWJsZWQmJih0aGlzLmZpbGVzW2JdPWUpfSxnZXQ6ZnVuY3Rpb24oYil7aWYoITEhPT10aGlzLmVuYWJsZWQpcmV0dXJuIHRoaXMuZmlsZXNbYl19LHJlbW92ZTpmdW5jdGlvbihiKXtkZWxldGUgdGhpcy5maWxlc1tiXX0sY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLmZpbGVzPQp7fX19LFhuPW5ldyBEaztPYmplY3QuYXNzaWduKEtiLnByb3RvdHlwZSx7bG9hZDpmdW5jdGlvbigpe30scGFyc2U6ZnVuY3Rpb24oKXt9LHNldENyb3NzT3JpZ2luOmZ1bmN0aW9uKGIpe3RoaXMuY3Jvc3NPcmlnaW49YjtyZXR1cm4gdGhpc30sc2V0UGF0aDpmdW5jdGlvbihiKXt0aGlzLnBhdGg9YjtyZXR1cm4gdGhpc30sc2V0UmVzb3VyY2VQYXRoOmZ1bmN0aW9uKGIpe3RoaXMucmVzb3VyY2VQYXRoPWI7cmV0dXJuIHRoaXN9fSk7S2IuSGFuZGxlcnM9e2hhbmRsZXJzOltdLGFkZDpmdW5jdGlvbihiLGUpe3RoaXMuaGFuZGxlcnMucHVzaChiLGUpfSxnZXQ6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPXRoaXMuaGFuZGxlcnMsaD0wLG09ZS5sZW5ndGg7aDxtO2grPTIpe3ZhciB1PWVbaCsxXTtpZihlW2hdLnRlc3QoYikpcmV0dXJuIHV9cmV0dXJuIG51bGx9fTt2YXIgbWQ9e307U2MucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShLYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpTYywKbG9hZDpmdW5jdGlvbihiLGUsaCxtKXt2b2lkIDA9PT1iJiYoYj0iIik7dm9pZCAwIT09dGhpcy5wYXRoJiYoYj10aGlzLnBhdGgrYik7Yj10aGlzLm1hbmFnZXIucmVzb2x2ZVVSTChiKTt2YXIgdT10aGlzLHc9Z2YuZ2V0KGIpO2lmKHZvaWQgMCE9PXcpcmV0dXJuIHUubWFuYWdlci5pdGVtU3RhcnQoYiksc2V0VGltZW91dChmdW5jdGlvbigpe2UmJmUodyk7dS5tYW5hZ2VyLml0ZW1FbmQoYil9LDApLHc7aWYodm9pZCAwIT09bWRbYl0pbWRbYl0ucHVzaCh7b25Mb2FkOmUsb25Qcm9ncmVzczpoLG9uRXJyb3I6bX0pO2Vsc2V7dmFyIEE9Yi5tYXRjaCgvXmRhdGE6KC4qPykoO2Jhc2U2NCk/LCguKikkLyk7aWYoQSl7aD1BWzFdO3ZhciBFPSEhQVsyXTtBPUFbM107QT1kZWNvZGVVUklDb21wb25lbnQoQSk7RSYmKEE9YXRvYihBKSk7dHJ5e3ZhciBHPSh0aGlzLnJlc3BvbnNlVHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk7c3dpdGNoKEcpe2Nhc2UgImFycmF5YnVmZmVyIjpjYXNlICJibG9iIjp2YXIgSj0KbmV3IFVpbnQ4QXJyYXkoQS5sZW5ndGgpO2ZvcihFPTA7RTxBLmxlbmd0aDtFKyspSltFXT1BLmNoYXJDb2RlQXQoRSk7dmFyIFE9ImJsb2IiPT09Rz9uZXcgQmxvYihbSi5idWZmZXJdLHt0eXBlOmh9KTpKLmJ1ZmZlcjticmVhaztjYXNlICJkb2N1bWVudCI6UT0obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKEEsaCk7YnJlYWs7Y2FzZSAianNvbiI6UT1KU09OLnBhcnNlKEEpO2JyZWFrO2RlZmF1bHQ6UT1BfXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlJiZlKFEpO3UubWFuYWdlci5pdGVtRW5kKGIpfSwwKX1jYXRjaChUKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bSYmbShUKTt1Lm1hbmFnZXIuaXRlbUVycm9yKGIpO3UubWFuYWdlci5pdGVtRW5kKGIpfSwwKX19ZWxzZXttZFtiXT1bXTttZFtiXS5wdXNoKHtvbkxvYWQ6ZSxvblByb2dyZXNzOmgsb25FcnJvcjptfSk7dmFyIFM9bmV3IFhNTEh0dHBSZXF1ZXN0O1Mub3BlbigiR0VUIixiLCEwKTtTLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLApmdW5jdGlvbihUKXt2YXIgVz10aGlzLnJlc3BvbnNlO2dmLmFkZChiLFcpO3ZhciBYPW1kW2JdO2RlbGV0ZSBtZFtiXTtpZigyMDA9PT10aGlzLnN0YXR1c3x8MD09PXRoaXMuc3RhdHVzKXswPT09dGhpcy5zdGF0dXMmJmNvbnNvbGUud2FybigiVEhSRUUuRmlsZUxvYWRlcjogSFRUUCBTdGF0dXMgMCByZWNlaXZlZC4iKTtmb3IodmFyIGlhPTAsaGE9WC5sZW5ndGg7aWE8aGE7aWErKyl7dmFyIHNhPVhbaWFdO2lmKHNhLm9uTG9hZClzYS5vbkxvYWQoVyl9fWVsc2V7aWE9MDtmb3IoaGE9WC5sZW5ndGg7aWE8aGE7aWErKylpZihzYT1YW2lhXSxzYS5vbkVycm9yKXNhLm9uRXJyb3IoVCk7dS5tYW5hZ2VyLml0ZW1FcnJvcihiKX11Lm1hbmFnZXIuaXRlbUVuZChiKX0sITEpO1MuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGZ1bmN0aW9uKFQpe2Zvcih2YXIgVz1tZFtiXSxYPTAsaWE9Vy5sZW5ndGg7WDxpYTtYKyspe3ZhciBoYT1XW1hdO2lmKGhhLm9uUHJvZ3Jlc3MpaGEub25Qcm9ncmVzcyhUKX19LAohMSk7Uy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oVCl7dmFyIFc9bWRbYl07ZGVsZXRlIG1kW2JdO2Zvcih2YXIgWD0wLGlhPVcubGVuZ3RoO1g8aWE7WCsrKXt2YXIgaGE9V1tYXTtpZihoYS5vbkVycm9yKWhhLm9uRXJyb3IoVCl9dS5tYW5hZ2VyLml0ZW1FcnJvcihiKTt1Lm1hbmFnZXIuaXRlbUVuZChiKX0sITEpO1MuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLGZ1bmN0aW9uKFQpe3ZhciBXPW1kW2JdO2RlbGV0ZSBtZFtiXTtmb3IodmFyIFg9MCxpYT1XLmxlbmd0aDtYPGlhO1grKyl7dmFyIGhhPVdbWF07aWYoaGEub25FcnJvciloYS5vbkVycm9yKFQpfXUubWFuYWdlci5pdGVtRXJyb3IoYik7dS5tYW5hZ2VyLml0ZW1FbmQoYil9LCExKTt2b2lkIDAhPT10aGlzLnJlc3BvbnNlVHlwZSYmKFMucmVzcG9uc2VUeXBlPXRoaXMucmVzcG9uc2VUeXBlKTt2b2lkIDAhPT10aGlzLndpdGhDcmVkZW50aWFscyYmKFMud2l0aENyZWRlbnRpYWxzPXRoaXMud2l0aENyZWRlbnRpYWxzKTsKUy5vdmVycmlkZU1pbWVUeXBlJiZTLm92ZXJyaWRlTWltZVR5cGUodm9pZCAwIT09dGhpcy5taW1lVHlwZT90aGlzLm1pbWVUeXBlOiJ0ZXh0L3BsYWluIik7Zm9yKEUgaW4gdGhpcy5yZXF1ZXN0SGVhZGVyKVMuc2V0UmVxdWVzdEhlYWRlcihFLHRoaXMucmVxdWVzdEhlYWRlcltFXSk7Uy5zZW5kKG51bGwpfXUubWFuYWdlci5pdGVtU3RhcnQoYik7cmV0dXJuIFN9fSxzZXRSZXNwb25zZVR5cGU6ZnVuY3Rpb24oYil7dGhpcy5yZXNwb25zZVR5cGU9YjtyZXR1cm4gdGhpc30sc2V0V2l0aENyZWRlbnRpYWxzOmZ1bmN0aW9uKGIpe3RoaXMud2l0aENyZWRlbnRpYWxzPWI7cmV0dXJuIHRoaXN9LHNldE1pbWVUeXBlOmZ1bmN0aW9uKGIpe3RoaXMubWltZVR5cGU9YjtyZXR1cm4gdGhpc30sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihiKXt0aGlzLnJlcXVlc3RIZWFkZXI9YjtyZXR1cm4gdGhpc319KTtFay5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEtiLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpFayxsb2FkOmZ1bmN0aW9uKGIsZSxoLG0pe3ZhciB1PXRoaXMsdz1uZXcgU2ModS5tYW5hZ2VyKTt3LnNldFBhdGgodS5wYXRoKTt3LmxvYWQoYixmdW5jdGlvbihBKXtlKHUucGFyc2UoSlNPTi5wYXJzZShBKSkpfSxoLG0pfSxwYXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGU9W10saD0wO2g8Yi5sZW5ndGg7aCsrKXt2YXIgbT1SYy5wYXJzZShiW2hdKTtlLnB1c2gobSl9cmV0dXJuIGV9fSk7RmsucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShLYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpGayxsb2FkOmZ1bmN0aW9uKGIsZSxoLG0pe2Z1bmN0aW9uIHUoVCl7Ry5sb2FkKGJbVF0sZnVuY3Rpb24oVyl7Vz13Ll9wYXJzZXIoVywhMCk7QVtUXT17d2lkdGg6Vy53aWR0aCxoZWlnaHQ6Vy5oZWlnaHQsZm9ybWF0OlcuZm9ybWF0LG1pcG1hcHM6Vy5taXBtYXBzfTtKKz0xOzY9PT1KJiYoMT09PVcubWlwbWFwQ291bnQmJihFLm1pbkZpbHRlcj0KMTAwNiksRS5mb3JtYXQ9Vy5mb3JtYXQsRS5uZWVkc1VwZGF0ZT0hMCxlJiZlKEUpKX0saCxtKX12YXIgdz10aGlzLEE9W10sRT1uZXcgT2Y7RS5pbWFnZT1BO3ZhciBHPW5ldyBTYyh0aGlzLm1hbmFnZXIpO0cuc2V0UGF0aCh0aGlzLnBhdGgpO0cuc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpO2lmKEFycmF5LmlzQXJyYXkoYikpZm9yKHZhciBKPTAsUT0wLFM9Yi5sZW5ndGg7UTxTOysrUSl1KFEpO2Vsc2UgRy5sb2FkKGIsZnVuY3Rpb24oVCl7VD13Ll9wYXJzZXIoVCwhMCk7aWYoVC5pc0N1YmVtYXApZm9yKHZhciBXPVQubWlwbWFwcy5sZW5ndGgvVC5taXBtYXBDb3VudCxYPTA7WDxXO1grKyl7QVtYXT17bWlwbWFwczpbXX07Zm9yKHZhciBpYT0wO2lhPFQubWlwbWFwQ291bnQ7aWErKylBW1hdLm1pcG1hcHMucHVzaChULm1pcG1hcHNbWCpULm1pcG1hcENvdW50K2lhXSksQVtYXS5mb3JtYXQ9VC5mb3JtYXQsQVtYXS53aWR0aD1ULndpZHRoLEFbWF0uaGVpZ2h0PVQuaGVpZ2h0fWVsc2UgRS5pbWFnZS53aWR0aD0KVC53aWR0aCxFLmltYWdlLmhlaWdodD1ULmhlaWdodCxFLm1pcG1hcHM9VC5taXBtYXBzOzE9PT1ULm1pcG1hcENvdW50JiYoRS5taW5GaWx0ZXI9MTAwNik7RS5mb3JtYXQ9VC5mb3JtYXQ7RS5uZWVkc1VwZGF0ZT0hMDtlJiZlKEUpfSxoLG0pO3JldHVybiBFfX0pO0hpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoS2IucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6SGksbG9hZDpmdW5jdGlvbihiLGUsaCxtKXt2YXIgdT10aGlzLHc9bmV3IEdiLEE9bmV3IFNjKHRoaXMubWFuYWdlcik7QS5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIik7QS5zZXRQYXRoKHRoaXMucGF0aCk7QS5sb2FkKGIsZnVuY3Rpb24oRSl7aWYoRT11Ll9wYXJzZXIoRSkpdm9pZCAwIT09RS5pbWFnZT93LmltYWdlPUUuaW1hZ2U6dm9pZCAwIT09RS5kYXRhJiYody5pbWFnZS53aWR0aD1FLndpZHRoLHcuaW1hZ2UuaGVpZ2h0PUUuaGVpZ2h0LHcuaW1hZ2UuZGF0YT1FLmRhdGEpLHcud3JhcFM9CnZvaWQgMCE9PUUud3JhcFM/RS53cmFwUzoxMDAxLHcud3JhcFQ9dm9pZCAwIT09RS53cmFwVD9FLndyYXBUOjEwMDEsdy5tYWdGaWx0ZXI9dm9pZCAwIT09RS5tYWdGaWx0ZXI/RS5tYWdGaWx0ZXI6MTAwNix3Lm1pbkZpbHRlcj12b2lkIDAhPT1FLm1pbkZpbHRlcj9FLm1pbkZpbHRlcjoxMDA4LHcuYW5pc290cm9weT12b2lkIDAhPT1FLmFuaXNvdHJvcHk/RS5hbmlzb3Ryb3B5OjEsdm9pZCAwIT09RS5mb3JtYXQmJih3LmZvcm1hdD1FLmZvcm1hdCksdm9pZCAwIT09RS50eXBlJiYody50eXBlPUUudHlwZSksdm9pZCAwIT09RS5taXBtYXBzJiYody5taXBtYXBzPUUubWlwbWFwcyksMT09PUUubWlwbWFwQ291bnQmJih3Lm1pbkZpbHRlcj0xMDA2KSx3Lm5lZWRzVXBkYXRlPSEwLGUmJmUodyxFKX0saCxtKTtyZXR1cm4gd319KTtlZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEtiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmVnLGxvYWQ6ZnVuY3Rpb24oYiwKZSxoLG0pe2Z1bmN0aW9uIHUoKXtHLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLHUsITEpO0cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHcsITEpO2dmLmFkZChiLHRoaXMpO2UmJmUodGhpcyk7QS5tYW5hZ2VyLml0ZW1FbmQoYil9ZnVuY3Rpb24gdyhKKXtHLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLHUsITEpO0cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHcsITEpO20mJm0oSik7QS5tYW5hZ2VyLml0ZW1FcnJvcihiKTtBLm1hbmFnZXIuaXRlbUVuZChiKX12b2lkIDAhPT10aGlzLnBhdGgmJihiPXRoaXMucGF0aCtiKTtiPXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKGIpO3ZhciBBPXRoaXMsRT1nZi5nZXQoYik7aWYodm9pZCAwIT09RSlyZXR1cm4gQS5tYW5hZ2VyLml0ZW1TdGFydChiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZSYmZShFKTtBLm1hbmFnZXIuaXRlbUVuZChiKX0sMCksRTt2YXIgRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLAoiaW1nIik7Ry5hZGRFdmVudExpc3RlbmVyKCJsb2FkIix1LCExKTtHLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix3LCExKTsiZGF0YToiIT09Yi5zdWJzdHIoMCw1KSYmdm9pZCAwIT09dGhpcy5jcm9zc09yaWdpbiYmKEcuY3Jvc3NPcmlnaW49dGhpcy5jcm9zc09yaWdpbik7QS5tYW5hZ2VyLml0ZW1TdGFydChiKTtHLnNyYz1iO3JldHVybiBHfX0pO0lpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoS2IucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6SWksbG9hZDpmdW5jdGlvbihiLGUsaCxtKXtmdW5jdGlvbiB1KEcpe0EubG9hZChiW0ddLGZ1bmN0aW9uKEope3cuaW1hZ2VzW0ddPUo7RSsrOzY9PT1FJiYody5uZWVkc1VwZGF0ZT0hMCxlJiZlKHcpKX0sdm9pZCAwLG0pfXZhciB3PW5ldyBNZCxBPW5ldyBlZyh0aGlzLm1hbmFnZXIpO0Euc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7QS5zZXRQYXRoKHRoaXMucGF0aCk7dmFyIEU9MDtmb3IoaD0KMDtoPGIubGVuZ3RoOysraCl1KGgpO3JldHVybiB3fX0pO0ppLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoS2IucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6SmksbG9hZDpmdW5jdGlvbihiLGUsaCxtKXt2YXIgdT1uZXcgayx3PW5ldyBlZyh0aGlzLm1hbmFnZXIpO3cuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7dy5zZXRQYXRoKHRoaXMucGF0aCk7dy5sb2FkKGIsZnVuY3Rpb24oQSl7dS5pbWFnZT1BO0E9MDxiLnNlYXJjaCgvXC5qcGU/ZygkfFw/KS9pKXx8MD09PWIuc2VhcmNoKC9eZGF0YTppbWFnZVwvanBlZy8pO3UuZm9ybWF0PUE/MTAyMjoxMDIzO3UubmVlZHNVcGRhdGU9ITA7dm9pZCAwIT09ZSYmZSh1KX0saCxtKTtyZXR1cm4gdX19KTtPYmplY3QuYXNzaWduKGFiLnByb3RvdHlwZSx7Z2V0UG9pbnQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlOiAuZ2V0UG9pbnQoKSBub3QgaW1wbGVtZW50ZWQuIik7cmV0dXJuIG51bGx9LApnZXRQb2ludEF0OmZ1bmN0aW9uKGIsZSl7Yj10aGlzLmdldFV0b1RtYXBwaW5nKGIpO3JldHVybiB0aGlzLmdldFBvaW50KGIsZSl9LGdldFBvaW50czpmdW5jdGlvbihiKXt2b2lkIDA9PT1iJiYoYj01KTtmb3IodmFyIGU9W10saD0wO2g8PWI7aCsrKWUucHVzaCh0aGlzLmdldFBvaW50KGgvYikpO3JldHVybiBlfSxnZXRTcGFjZWRQb2ludHM6ZnVuY3Rpb24oYil7dm9pZCAwPT09YiYmKGI9NSk7Zm9yKHZhciBlPVtdLGg9MDtoPD1iO2grKyllLnB1c2godGhpcy5nZXRQb2ludEF0KGgvYikpO3JldHVybiBlfSxnZXRMZW5ndGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldExlbmd0aHMoKTtyZXR1cm4gYltiLmxlbmd0aC0xXX0sZ2V0TGVuZ3RoczpmdW5jdGlvbihiKXt2b2lkIDA9PT1iJiYoYj10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyk7aWYodGhpcy5jYWNoZUFyY0xlbmd0aHMmJnRoaXMuY2FjaGVBcmNMZW5ndGhzLmxlbmd0aD09PWIrMSYmIXRoaXMubmVlZHNVcGRhdGUpcmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzOwp0aGlzLm5lZWRzVXBkYXRlPSExO3ZhciBlPVtdLGg9dGhpcy5nZXRQb2ludCgwKSxtLHU9MDtlLnB1c2goMCk7Zm9yKG09MTttPD1iO20rKyl7dmFyIHc9dGhpcy5nZXRQb2ludChtL2IpO3UrPXcuZGlzdGFuY2VUbyhoKTtlLnB1c2godSk7aD13fXJldHVybiB0aGlzLmNhY2hlQXJjTGVuZ3Rocz1lfSx1cGRhdGVBcmNMZW5ndGhzOmZ1bmN0aW9uKCl7dGhpcy5uZWVkc1VwZGF0ZT0hMDt0aGlzLmdldExlbmd0aHMoKX0sZ2V0VXRvVG1hcHBpbmc6ZnVuY3Rpb24oYixlKXt2YXIgaD10aGlzLmdldExlbmd0aHMoKSxtPWgubGVuZ3RoO2U9ZT9lOmIqaFttLTFdO2Zvcih2YXIgdT0wLHc9bS0xLEE7dTw9dzspaWYoYj1NYXRoLmZsb29yKHUrKHctdSkvMiksQT1oW2JdLWUsMD5BKXU9YisxO2Vsc2UgaWYoMDxBKXc9Yi0xO2Vsc2V7dz1iO2JyZWFrfWI9dztpZihoW2JdPT09ZSlyZXR1cm4gYi8obS0xKTt1PWhbYl07cmV0dXJuKGIrKGUtdSkvKGhbYisxXS11KSkvKG0tMSl9LGdldFRhbmdlbnQ6ZnVuY3Rpb24oYil7dmFyIGU9CmItMUUtNDtiKz0xRS00OzA+ZSYmKGU9MCk7MTxiJiYoYj0xKTtlPXRoaXMuZ2V0UG9pbnQoZSk7cmV0dXJuIHRoaXMuZ2V0UG9pbnQoYikuY2xvbmUoKS5zdWIoZSkubm9ybWFsaXplKCl9LGdldFRhbmdlbnRBdDpmdW5jdGlvbihiKXtiPXRoaXMuZ2V0VXRvVG1hcHBpbmcoYik7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudChiKX0sY29tcHV0ZUZyZW5ldEZyYW1lczpmdW5jdGlvbihiLGUpe3ZhciBoPW5ldyBnLG09W10sdT1bXSx3PVtdLEE9bmV3IGcsRT1uZXcgcixHO2ZvcihHPTA7Rzw9YjtHKyspe3ZhciBKPUcvYjttW0ddPXRoaXMuZ2V0VGFuZ2VudEF0KEopO21bR10ubm9ybWFsaXplKCl9dVswXT1uZXcgZzt3WzBdPW5ldyBnO0c9TnVtYmVyLk1BWF9WQUxVRTtKPU1hdGguYWJzKG1bMF0ueCk7dmFyIFE9TWF0aC5hYnMobVswXS55KSxTPU1hdGguYWJzKG1bMF0ueik7Sjw9RyYmKEc9SixoLnNldCgxLDAsMCkpO1E8PUcmJihHPVEsaC5zZXQoMCwxLDApKTtTPD1HJiZoLnNldCgwLAowLDEpO0EuY3Jvc3NWZWN0b3JzKG1bMF0saCkubm9ybWFsaXplKCk7dVswXS5jcm9zc1ZlY3RvcnMobVswXSxBKTt3WzBdLmNyb3NzVmVjdG9ycyhtWzBdLHVbMF0pO2ZvcihHPTE7Rzw9YjtHKyspdVtHXT11W0ctMV0uY2xvbmUoKSx3W0ddPXdbRy0xXS5jbG9uZSgpLEEuY3Jvc3NWZWN0b3JzKG1bRy0xXSxtW0ddKSxBLmxlbmd0aCgpPk51bWJlci5FUFNJTE9OJiYoQS5ub3JtYWxpemUoKSxoPU1hdGguYWNvcyhsYi5jbGFtcChtW0ctMV0uZG90KG1bR10pLC0xLDEpKSx1W0ddLmFwcGx5TWF0cml4NChFLm1ha2VSb3RhdGlvbkF4aXMoQSxoKSkpLHdbR10uY3Jvc3NWZWN0b3JzKG1bR10sdVtHXSk7aWYoITA9PT1lKWZvcihoPU1hdGguYWNvcyhsYi5jbGFtcCh1WzBdLmRvdCh1W2JdKSwtMSwxKSksaC89YiwwPG1bMF0uZG90KEEuY3Jvc3NWZWN0b3JzKHVbMF0sdVtiXSkpJiYoaD0taCksRz0xO0c8PWI7RysrKXVbR10uYXBwbHlNYXRyaXg0KEUubWFrZVJvdGF0aW9uQXhpcyhtW0ddLApoKkcpKSx3W0ddLmNyb3NzVmVjdG9ycyhtW0ddLHVbR10pO3JldHVybnt0YW5nZW50czptLG5vcm1hbHM6dSxiaW5vcm1hbHM6d319LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGIpe3RoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPWIuYXJjTGVuZ3RoRGl2aXNpb25zO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYj17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6IkN1cnZlIixnZW5lcmF0b3I6IkN1cnZlLnRvSlNPTiJ9fTtiLmFyY0xlbmd0aERpdmlzaW9ucz10aGlzLmFyY0xlbmd0aERpdmlzaW9ucztiLnR5cGU9dGhpcy50eXBlO3JldHVybiBifSxmcm9tSlNPTjpmdW5jdGlvbihiKXt0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz1iLmFyY0xlbmd0aERpdmlzaW9ucztyZXR1cm4gdGhpc319KTtMYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShhYi5wcm90b3R5cGUpO0xjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj0KTGM7TGMucHJvdG90eXBlLmlzRWxsaXBzZUN1cnZlPSEwO0xjLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihiLGUpe2U9ZXx8bmV3IGQ7Zm9yKHZhciBoPTIqTWF0aC5QSSxtPXRoaXMuYUVuZEFuZ2xlLXRoaXMuYVN0YXJ0QW5nbGUsdT1NYXRoLmFicyhtKTxOdW1iZXIuRVBTSUxPTjswPm07KW0rPWg7Zm9yKDttPmg7KW0tPWg7bTxOdW1iZXIuRVBTSUxPTiYmKG09dT8wOmgpOyEwIT09dGhpcy5hQ2xvY2t3aXNlfHx1fHwobT1tPT09aD8taDptLWgpO2g9dGhpcy5hU3RhcnRBbmdsZStiKm07Yj10aGlzLmFYK3RoaXMueFJhZGl1cypNYXRoLmNvcyhoKTt2YXIgdz10aGlzLmFZK3RoaXMueVJhZGl1cypNYXRoLnNpbihoKTswIT09dGhpcy5hUm90YXRpb24mJihoPU1hdGguY29zKHRoaXMuYVJvdGF0aW9uKSxtPU1hdGguc2luKHRoaXMuYVJvdGF0aW9uKSx1PWItdGhpcy5hWCx3LT10aGlzLmFZLGI9dSpoLXcqbSt0aGlzLmFYLHc9dSptK3cqaCt0aGlzLmFZKTtyZXR1cm4gZS5zZXQoYiwKdyl9O0xjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe2FiLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLmFYPWIuYVg7dGhpcy5hWT1iLmFZO3RoaXMueFJhZGl1cz1iLnhSYWRpdXM7dGhpcy55UmFkaXVzPWIueVJhZGl1czt0aGlzLmFTdGFydEFuZ2xlPWIuYVN0YXJ0QW5nbGU7dGhpcy5hRW5kQW5nbGU9Yi5hRW5kQW5nbGU7dGhpcy5hQ2xvY2t3aXNlPWIuYUNsb2Nrd2lzZTt0aGlzLmFSb3RhdGlvbj1iLmFSb3RhdGlvbjtyZXR1cm4gdGhpc307TGMucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBiPWFiLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLmFYPXRoaXMuYVg7Yi5hWT10aGlzLmFZO2IueFJhZGl1cz10aGlzLnhSYWRpdXM7Yi55UmFkaXVzPXRoaXMueVJhZGl1cztiLmFTdGFydEFuZ2xlPXRoaXMuYVN0YXJ0QW5nbGU7Yi5hRW5kQW5nbGU9dGhpcy5hRW5kQW5nbGU7Yi5hQ2xvY2t3aXNlPXRoaXMuYUNsb2Nrd2lzZTtiLmFSb3RhdGlvbj0KdGhpcy5hUm90YXRpb247cmV0dXJuIGJ9O0xjLnByb3RvdHlwZS5mcm9tSlNPTj1mdW5jdGlvbihiKXthYi5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCh0aGlzLGIpO3RoaXMuYVg9Yi5hWDt0aGlzLmFZPWIuYVk7dGhpcy54UmFkaXVzPWIueFJhZGl1czt0aGlzLnlSYWRpdXM9Yi55UmFkaXVzO3RoaXMuYVN0YXJ0QW5nbGU9Yi5hU3RhcnRBbmdsZTt0aGlzLmFFbmRBbmdsZT1iLmFFbmRBbmdsZTt0aGlzLmFDbG9ja3dpc2U9Yi5hQ2xvY2t3aXNlO3RoaXMuYVJvdGF0aW9uPWIuYVJvdGF0aW9uO3JldHVybiB0aGlzfTtmZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShMYy5wcm90b3R5cGUpO2ZnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1mZztmZy5wcm90b3R5cGUuaXNBcmNDdXJ2ZT0hMDt2YXIgdWo9bmV3IGcsb2w9bmV3IEdrLHBsPW5ldyBHayxxbD1uZXcgR2s7dWMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYWIucHJvdG90eXBlKTt1Yy5wcm90b3R5cGUuY29uc3RydWN0b3I9dWM7CnVjLnByb3RvdHlwZS5pc0NhdG11bGxSb21DdXJ2ZTM9ITA7dWMucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGIsZSl7ZT1lfHxuZXcgZzt2YXIgaD10aGlzLnBvaW50cyxtPWgubGVuZ3RoO2IqPW0tKHRoaXMuY2xvc2VkPzA6MSk7dmFyIHU9TWF0aC5mbG9vcihiKTtiLT11O3RoaXMuY2xvc2VkP3UrPTA8dT8wOihNYXRoLmZsb29yKE1hdGguYWJzKHUpL20pKzEpKm06MD09PWImJnU9PT1tLTEmJih1PW0tMixiPTEpO2lmKHRoaXMuY2xvc2VkfHwwPHUpdmFyIHc9aFsodS0xKSVtXTtlbHNlIHVqLnN1YlZlY3RvcnMoaFswXSxoWzFdKS5hZGQoaFswXSksdz11ajt2YXIgQT1oW3UlbV07dmFyIEU9aFsodSsxKSVtXTt0aGlzLmNsb3NlZHx8dSsyPG0/aD1oWyh1KzIpJW1dOih1ai5zdWJWZWN0b3JzKGhbbS0xXSxoW20tMl0pLmFkZChoW20tMV0pLGg9dWopO2lmKCJjZW50cmlwZXRhbCI9PT10aGlzLmN1cnZlVHlwZXx8ImNob3JkYWwiPT09dGhpcy5jdXJ2ZVR5cGUpe3ZhciBHPQoiY2hvcmRhbCI9PT10aGlzLmN1cnZlVHlwZT8uNTouMjU7bT1NYXRoLnBvdyh3LmRpc3RhbmNlVG9TcXVhcmVkKEEpLEcpO3U9TWF0aC5wb3coQS5kaXN0YW5jZVRvU3F1YXJlZChFKSxHKTtHPU1hdGgucG93KEUuZGlzdGFuY2VUb1NxdWFyZWQoaCksRyk7MUUtND51JiYodT0xKTsxRS00Pm0mJihtPXUpOzFFLTQ+RyYmKEc9dSk7b2wuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKHcueCxBLngsRS54LGgueCxtLHUsRyk7cGwuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKHcueSxBLnksRS55LGgueSxtLHUsRyk7cWwuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKHcueixBLnosRS56LGgueixtLHUsRyl9ZWxzZSJjYXRtdWxscm9tIj09PXRoaXMuY3VydmVUeXBlJiYob2wuaW5pdENhdG11bGxSb20ody54LEEueCxFLngsaC54LHRoaXMudGVuc2lvbikscGwuaW5pdENhdG11bGxSb20ody55LEEueSxFLnksaC55LHRoaXMudGVuc2lvbikscWwuaW5pdENhdG11bGxSb20ody56LEEueixFLnosCmgueix0aGlzLnRlbnNpb24pKTtlLnNldChvbC5jYWxjKGIpLHBsLmNhbGMoYikscWwuY2FsYyhiKSk7cmV0dXJuIGV9O3VjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe2FiLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLnBvaW50cz1bXTtmb3IodmFyIGU9MCxoPWIucG9pbnRzLmxlbmd0aDtlPGg7ZSsrKXRoaXMucG9pbnRzLnB1c2goYi5wb2ludHNbZV0uY2xvbmUoKSk7dGhpcy5jbG9zZWQ9Yi5jbG9zZWQ7dGhpcy5jdXJ2ZVR5cGU9Yi5jdXJ2ZVR5cGU7dGhpcy50ZW5zaW9uPWIudGVuc2lvbjtyZXR1cm4gdGhpc307dWMucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBiPWFiLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLnBvaW50cz1bXTtmb3IodmFyIGU9MCxoPXRoaXMucG9pbnRzLmxlbmd0aDtlPGg7ZSsrKWIucG9pbnRzLnB1c2godGhpcy5wb2ludHNbZV0udG9BcnJheSgpKTtiLmNsb3NlZD10aGlzLmNsb3NlZDtiLmN1cnZlVHlwZT10aGlzLmN1cnZlVHlwZTsKYi50ZW5zaW9uPXRoaXMudGVuc2lvbjtyZXR1cm4gYn07dWMucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGIpe2FiLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYik7dGhpcy5wb2ludHM9W107Zm9yKHZhciBlPTAsaD1iLnBvaW50cy5sZW5ndGg7ZTxoO2UrKyl7dmFyIG09Yi5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaCgobmV3IGcpLmZyb21BcnJheShtKSl9dGhpcy5jbG9zZWQ9Yi5jbG9zZWQ7dGhpcy5jdXJ2ZVR5cGU9Yi5jdXJ2ZVR5cGU7dGhpcy50ZW5zaW9uPWIudGVuc2lvbjtyZXR1cm4gdGhpc307ZWQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYWIucHJvdG90eXBlKTtlZC5wcm90b3R5cGUuY29uc3RydWN0b3I9ZWQ7ZWQucHJvdG90eXBlLmlzQ3ViaWNCZXppZXJDdXJ2ZT0hMDtlZC5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYixlKXtlPWV8fG5ldyBkO3ZhciBoPXRoaXMudjAsbT10aGlzLnYxLHU9dGhpcy52Mix3PXRoaXMudjM7ZS5zZXQoRmgoYiwKaC54LG0ueCx1Lngsdy54KSxGaChiLGgueSxtLnksdS55LHcueSkpO3JldHVybiBlfTtlZC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihiKXthYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy52MC5jb3B5KGIudjApO3RoaXMudjEuY29weShiLnYxKTt0aGlzLnYyLmNvcHkoYi52Mik7dGhpcy52My5jb3B5KGIudjMpO3JldHVybiB0aGlzfTtlZC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGI9YWIucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2IudjA9dGhpcy52MC50b0FycmF5KCk7Yi52MT10aGlzLnYxLnRvQXJyYXkoKTtiLnYyPXRoaXMudjIudG9BcnJheSgpO2IudjM9dGhpcy52My50b0FycmF5KCk7cmV0dXJuIGJ9O2VkLnByb3RvdHlwZS5mcm9tSlNPTj1mdW5jdGlvbihiKXthYi5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCh0aGlzLGIpO3RoaXMudjAuZnJvbUFycmF5KGIudjApO3RoaXMudjEuZnJvbUFycmF5KGIudjEpO3RoaXMudjIuZnJvbUFycmF5KGIudjIpOwp0aGlzLnYzLmZyb21BcnJheShiLnYzKTtyZXR1cm4gdGhpc307QmQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYWIucHJvdG90eXBlKTtCZC5wcm90b3R5cGUuY29uc3RydWN0b3I9QmQ7QmQucHJvdG90eXBlLmlzQ3ViaWNCZXppZXJDdXJ2ZTM9ITA7QmQucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGIsZSl7ZT1lfHxuZXcgZzt2YXIgaD10aGlzLnYwLG09dGhpcy52MSx1PXRoaXMudjIsdz10aGlzLnYzO2Uuc2V0KEZoKGIsaC54LG0ueCx1Lngsdy54KSxGaChiLGgueSxtLnksdS55LHcueSksRmgoYixoLnosbS56LHUueix3LnopKTtyZXR1cm4gZX07QmQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7YWIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMudjAuY29weShiLnYwKTt0aGlzLnYxLmNvcHkoYi52MSk7dGhpcy52Mi5jb3B5KGIudjIpO3RoaXMudjMuY29weShiLnYzKTtyZXR1cm4gdGhpc307QmQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBiPQphYi5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7Yi52MD10aGlzLnYwLnRvQXJyYXkoKTtiLnYxPXRoaXMudjEudG9BcnJheSgpO2IudjI9dGhpcy52Mi50b0FycmF5KCk7Yi52Mz10aGlzLnYzLnRvQXJyYXkoKTtyZXR1cm4gYn07QmQucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGIpe2FiLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYik7dGhpcy52MC5mcm9tQXJyYXkoYi52MCk7dGhpcy52MS5mcm9tQXJyYXkoYi52MSk7dGhpcy52Mi5mcm9tQXJyYXkoYi52Mik7dGhpcy52My5mcm9tQXJyYXkoYi52Myk7cmV0dXJuIHRoaXN9O0djLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGFiLnByb3RvdHlwZSk7R2MucHJvdG90eXBlLmNvbnN0cnVjdG9yPUdjO0djLnByb3RvdHlwZS5pc0xpbmVDdXJ2ZT0hMDtHYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYixlKXtlPWV8fG5ldyBkOzE9PT1iP2UuY29weSh0aGlzLnYyKTooZS5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSwKZS5tdWx0aXBseVNjYWxhcihiKS5hZGQodGhpcy52MSkpO3JldHVybiBlfTtHYy5wcm90b3R5cGUuZ2V0UG9pbnRBdD1mdW5jdGlvbihiLGUpe3JldHVybiB0aGlzLmdldFBvaW50KGIsZSl9O0djLnByb3RvdHlwZS5nZXRUYW5nZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudjIuY2xvbmUoKS5zdWIodGhpcy52MSkubm9ybWFsaXplKCl9O0djLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe2FiLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLnYxLmNvcHkoYi52MSk7dGhpcy52Mi5jb3B5KGIudjIpO3JldHVybiB0aGlzfTtHYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGI9YWIucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2IudjE9dGhpcy52MS50b0FycmF5KCk7Yi52Mj10aGlzLnYyLnRvQXJyYXkoKTtyZXR1cm4gYn07R2MucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGIpe2FiLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYik7dGhpcy52MS5mcm9tQXJyYXkoYi52MSk7CnRoaXMudjIuZnJvbUFycmF5KGIudjIpO3JldHVybiB0aGlzfTtmZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShhYi5wcm90b3R5cGUpO2ZkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1mZDtmZC5wcm90b3R5cGUuaXNMaW5lQ3VydmUzPSEwO2ZkLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihiLGUpe2U9ZXx8bmV3IGc7MT09PWI/ZS5jb3B5KHRoaXMudjIpOihlLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLGUubXVsdGlwbHlTY2FsYXIoYikuYWRkKHRoaXMudjEpKTtyZXR1cm4gZX07ZmQucHJvdG90eXBlLmdldFBvaW50QXQ9ZnVuY3Rpb24oYixlKXtyZXR1cm4gdGhpcy5nZXRQb2ludChiLGUpfTtmZC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihiKXthYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy52MS5jb3B5KGIudjEpO3RoaXMudjIuY29weShiLnYyKTtyZXR1cm4gdGhpc307ZmQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBiPWFiLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTsKYi52MT10aGlzLnYxLnRvQXJyYXkoKTtiLnYyPXRoaXMudjIudG9BcnJheSgpO3JldHVybiBifTtmZC5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYil7YWIucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxiKTt0aGlzLnYxLmZyb21BcnJheShiLnYxKTt0aGlzLnYyLmZyb21BcnJheShiLnYyKTtyZXR1cm4gdGhpc307Z2QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYWIucHJvdG90eXBlKTtnZC5wcm90b3R5cGUuY29uc3RydWN0b3I9Z2Q7Z2QucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmU9ITA7Z2QucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGIsZSl7ZT1lfHxuZXcgZDt2YXIgaD10aGlzLnYwLG09dGhpcy52MSx1PXRoaXMudjI7ZS5zZXQoRWgoYixoLngsbS54LHUueCksRWgoYixoLnksbS55LHUueSkpO3JldHVybiBlfTtnZC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihiKXthYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy52MC5jb3B5KGIudjApOwp0aGlzLnYxLmNvcHkoYi52MSk7dGhpcy52Mi5jb3B5KGIudjIpO3JldHVybiB0aGlzfTtnZC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGI9YWIucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2IudjA9dGhpcy52MC50b0FycmF5KCk7Yi52MT10aGlzLnYxLnRvQXJyYXkoKTtiLnYyPXRoaXMudjIudG9BcnJheSgpO3JldHVybiBifTtnZC5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYil7YWIucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxiKTt0aGlzLnYwLmZyb21BcnJheShiLnYwKTt0aGlzLnYxLmZyb21BcnJheShiLnYxKTt0aGlzLnYyLmZyb21BcnJheShiLnYyKTtyZXR1cm4gdGhpc307Q2QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYWIucHJvdG90eXBlKTtDZC5wcm90b3R5cGUuY29uc3RydWN0b3I9Q2Q7Q2QucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUzPSEwO0NkLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihiLGUpe2U9ZXx8Cm5ldyBnO3ZhciBoPXRoaXMudjAsbT10aGlzLnYxLHU9dGhpcy52MjtlLnNldChFaChiLGgueCxtLngsdS54KSxFaChiLGgueSxtLnksdS55KSxFaChiLGgueixtLnosdS56KSk7cmV0dXJuIGV9O0NkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe2FiLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLnYwLmNvcHkoYi52MCk7dGhpcy52MS5jb3B5KGIudjEpO3RoaXMudjIuY29weShiLnYyKTtyZXR1cm4gdGhpc307Q2QucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBiPWFiLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLnYwPXRoaXMudjAudG9BcnJheSgpO2IudjE9dGhpcy52MS50b0FycmF5KCk7Yi52Mj10aGlzLnYyLnRvQXJyYXkoKTtyZXR1cm4gYn07Q2QucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGIpe2FiLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYik7dGhpcy52MC5mcm9tQXJyYXkoYi52MCk7dGhpcy52MS5mcm9tQXJyYXkoYi52MSk7CnRoaXMudjIuZnJvbUFycmF5KGIudjIpO3JldHVybiB0aGlzfTtoZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShhYi5wcm90b3R5cGUpO2hkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1oZDtoZC5wcm90b3R5cGUuaXNTcGxpbmVDdXJ2ZT0hMDtoZC5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYixlKXtlPWV8fG5ldyBkO3ZhciBoPXRoaXMucG9pbnRzLG09KGgubGVuZ3RoLTEpKmI7Yj1NYXRoLmZsb29yKG0pO20tPWI7dmFyIHU9aFswPT09Yj9iOmItMV0sdz1oW2JdLEE9aFtiPmgubGVuZ3RoLTI/aC5sZW5ndGgtMTpiKzFdO2g9aFtiPmgubGVuZ3RoLTM/aC5sZW5ndGgtMTpiKzJdO2Uuc2V0KFluKG0sdS54LHcueCxBLngsaC54KSxZbihtLHUueSx3LnksQS55LGgueSkpO3JldHVybiBlfTtoZC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihiKXthYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5wb2ludHM9W107Zm9yKHZhciBlPTAsaD1iLnBvaW50cy5sZW5ndGg7ZTwKaDtlKyspdGhpcy5wb2ludHMucHVzaChiLnBvaW50c1tlXS5jbG9uZSgpKTtyZXR1cm4gdGhpc307aGQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBiPWFiLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLnBvaW50cz1bXTtmb3IodmFyIGU9MCxoPXRoaXMucG9pbnRzLmxlbmd0aDtlPGg7ZSsrKWIucG9pbnRzLnB1c2godGhpcy5wb2ludHNbZV0udG9BcnJheSgpKTtyZXR1cm4gYn07aGQucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGIpe2FiLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYik7dGhpcy5wb2ludHM9W107Zm9yKHZhciBlPTAsaD1iLnBvaW50cy5sZW5ndGg7ZTxoO2UrKyl7dmFyIG09Yi5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaCgobmV3IGQpLmZyb21BcnJheShtKSl9cmV0dXJuIHRoaXN9O3ZhciBybD1PYmplY3QuZnJlZXplKHtBcmNDdXJ2ZTpmZyxDYXRtdWxsUm9tQ3VydmUzOnVjLEN1YmljQmV6aWVyQ3VydmU6ZWQsQ3ViaWNCZXppZXJDdXJ2ZTM6QmQsCkVsbGlwc2VDdXJ2ZTpMYyxMaW5lQ3VydmU6R2MsTGluZUN1cnZlMzpmZCxRdWFkcmF0aWNCZXppZXJDdXJ2ZTpnZCxRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6Q2QsU3BsaW5lQ3VydmU6aGR9KTtRZC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGFiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlFkLGFkZDpmdW5jdGlvbihiKXt0aGlzLmN1cnZlcy5wdXNoKGIpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmN1cnZlc1swXS5nZXRQb2ludCgwKSxlPXRoaXMuY3VydmVzW3RoaXMuY3VydmVzLmxlbmd0aC0xXS5nZXRQb2ludCgxKTtiLmVxdWFscyhlKXx8dGhpcy5jdXJ2ZXMucHVzaChuZXcgR2MoZSxiKSl9LGdldFBvaW50OmZ1bmN0aW9uKGIpe3ZhciBlPWIqdGhpcy5nZXRMZW5ndGgoKSxoPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7Zm9yKGI9MDtiPGgubGVuZ3RoOyl7aWYoaFtiXT49ZSlyZXR1cm4gZT1oW2JdLWUsYj10aGlzLmN1cnZlc1tiXSxoPQpiLmdldExlbmd0aCgpLGIuZ2V0UG9pbnRBdCgwPT09aD8wOjEtZS9oKTtiKyt9cmV0dXJuIG51bGx9LGdldExlbmd0aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7cmV0dXJuIGJbYi5sZW5ndGgtMV19LHVwZGF0ZUFyY0xlbmd0aHM6ZnVuY3Rpb24oKXt0aGlzLm5lZWRzVXBkYXRlPSEwO3RoaXMuY2FjaGVMZW5ndGhzPW51bGw7dGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKX0sZ2V0Q3VydmVMZW5ndGhzOmZ1bmN0aW9uKCl7aWYodGhpcy5jYWNoZUxlbmd0aHMmJnRoaXMuY2FjaGVMZW5ndGhzLmxlbmd0aD09PXRoaXMuY3VydmVzLmxlbmd0aClyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM7Zm9yKHZhciBiPVtdLGU9MCxoPTAsbT10aGlzLmN1cnZlcy5sZW5ndGg7aDxtO2grKyllKz10aGlzLmN1cnZlc1toXS5nZXRMZW5ndGgoKSxiLnB1c2goZSk7cmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzPWJ9LGdldFNwYWNlZFBvaW50czpmdW5jdGlvbihiKXt2b2lkIDA9PT0KYiYmKGI9NDApO2Zvcih2YXIgZT1bXSxoPTA7aDw9YjtoKyspZS5wdXNoKHRoaXMuZ2V0UG9pbnQoaC9iKSk7dGhpcy5hdXRvQ2xvc2UmJmUucHVzaChlWzBdKTtyZXR1cm4gZX0sZ2V0UG9pbnRzOmZ1bmN0aW9uKGIpe2I9Ynx8MTI7Zm9yKHZhciBlPVtdLGgsbT0wLHU9dGhpcy5jdXJ2ZXM7bTx1Lmxlbmd0aDttKyspe3ZhciB3PXVbbV07dz13LmdldFBvaW50cyh3JiZ3LmlzRWxsaXBzZUN1cnZlPzIqYjp3JiYody5pc0xpbmVDdXJ2ZXx8dy5pc0xpbmVDdXJ2ZTMpPzE6dyYmdy5pc1NwbGluZUN1cnZlP2Iqdy5wb2ludHMubGVuZ3RoOmIpO2Zvcih2YXIgQT0wO0E8dy5sZW5ndGg7QSsrKXt2YXIgRT13W0FdO2gmJmguZXF1YWxzKEUpfHwoZS5wdXNoKEUpLGg9RSl9fXRoaXMuYXV0b0Nsb3NlJiYxPGUubGVuZ3RoJiYhZVtlLmxlbmd0aC0xXS5lcXVhbHMoZVswXSkmJmUucHVzaChlWzBdKTtyZXR1cm4gZX0sY29weTpmdW5jdGlvbihiKXthYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsCmIpO3RoaXMuY3VydmVzPVtdO2Zvcih2YXIgZT0wLGg9Yi5jdXJ2ZXMubGVuZ3RoO2U8aDtlKyspdGhpcy5jdXJ2ZXMucHVzaChiLmN1cnZlc1tlXS5jbG9uZSgpKTt0aGlzLmF1dG9DbG9zZT1iLmF1dG9DbG9zZTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKCl7dmFyIGI9YWIucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2IuYXV0b0Nsb3NlPXRoaXMuYXV0b0Nsb3NlO2IuY3VydmVzPVtdO2Zvcih2YXIgZT0wLGg9dGhpcy5jdXJ2ZXMubGVuZ3RoO2U8aDtlKyspYi5jdXJ2ZXMucHVzaCh0aGlzLmN1cnZlc1tlXS50b0pTT04oKSk7cmV0dXJuIGJ9LGZyb21KU09OOmZ1bmN0aW9uKGIpe2FiLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYik7dGhpcy5hdXRvQ2xvc2U9Yi5hdXRvQ2xvc2U7dGhpcy5jdXJ2ZXM9W107Zm9yKHZhciBlPTAsaD1iLmN1cnZlcy5sZW5ndGg7ZTxoO2UrKyl7dmFyIG09Yi5jdXJ2ZXNbZV07dGhpcy5jdXJ2ZXMucHVzaCgobmV3IHJsW20udHlwZV0pLmZyb21KU09OKG0pKX1yZXR1cm4gdGhpc319KTsKaWQucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShRZC5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjppZCxzZXRGcm9tUG9pbnRzOmZ1bmN0aW9uKGIpe3RoaXMubW92ZVRvKGJbMF0ueCxiWzBdLnkpO2Zvcih2YXIgZT0xLGg9Yi5sZW5ndGg7ZTxoO2UrKyl0aGlzLmxpbmVUbyhiW2VdLngsYltlXS55KX0sbW92ZVRvOmZ1bmN0aW9uKGIsZSl7dGhpcy5jdXJyZW50UG9pbnQuc2V0KGIsZSl9LGxpbmVUbzpmdW5jdGlvbihiLGUpe3ZhciBoPW5ldyBHYyh0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBkKGIsZSkpO3RoaXMuY3VydmVzLnB1c2goaCk7dGhpcy5jdXJyZW50UG9pbnQuc2V0KGIsZSl9LHF1YWRyYXRpY0N1cnZlVG86ZnVuY3Rpb24oYixlLGgsbSl7Yj1uZXcgZ2QodGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgZChiLGUpLG5ldyBkKGgsbSkpO3RoaXMuY3VydmVzLnB1c2goYik7dGhpcy5jdXJyZW50UG9pbnQuc2V0KGgsbSl9LGJlemllckN1cnZlVG86ZnVuY3Rpb24oYiwKZSxoLG0sdSx3KXtiPW5ldyBlZCh0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBkKGIsZSksbmV3IGQoaCxtKSxuZXcgZCh1LHcpKTt0aGlzLmN1cnZlcy5wdXNoKGIpO3RoaXMuY3VycmVudFBvaW50LnNldCh1LHcpfSxzcGxpbmVUaHJ1OmZ1bmN0aW9uKGIpe3ZhciBlPVt0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpXS5jb25jYXQoYik7ZT1uZXcgaGQoZSk7dGhpcy5jdXJ2ZXMucHVzaChlKTt0aGlzLmN1cnJlbnRQb2ludC5jb3B5KGJbYi5sZW5ndGgtMV0pfSxhcmM6ZnVuY3Rpb24oYixlLGgsbSx1LHcpe3RoaXMuYWJzYXJjKGIrdGhpcy5jdXJyZW50UG9pbnQueCxlK3RoaXMuY3VycmVudFBvaW50LnksaCxtLHUsdyl9LGFic2FyYzpmdW5jdGlvbihiLGUsaCxtLHUsdyl7dGhpcy5hYnNlbGxpcHNlKGIsZSxoLGgsbSx1LHcpfSxlbGxpcHNlOmZ1bmN0aW9uKGIsZSxoLG0sdSx3LEEsRSl7dGhpcy5hYnNlbGxpcHNlKGIrdGhpcy5jdXJyZW50UG9pbnQueCxlK3RoaXMuY3VycmVudFBvaW50LnksCmgsbSx1LHcsQSxFKX0sYWJzZWxsaXBzZTpmdW5jdGlvbihiLGUsaCxtLHUsdyxBLEUpe2I9bmV3IExjKGIsZSxoLG0sdSx3LEEsRSk7MDx0aGlzLmN1cnZlcy5sZW5ndGgmJihlPWIuZ2V0UG9pbnQoMCksZS5lcXVhbHModGhpcy5jdXJyZW50UG9pbnQpfHx0aGlzLmxpbmVUbyhlLngsZS55KSk7dGhpcy5jdXJ2ZXMucHVzaChiKTtiPWIuZ2V0UG9pbnQoMSk7dGhpcy5jdXJyZW50UG9pbnQuY29weShiKX0sY29weTpmdW5jdGlvbihiKXtRZC5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5jdXJyZW50UG9pbnQuY29weShiLmN1cnJlbnRQb2ludCk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBiPVFkLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLmN1cnJlbnRQb2ludD10aGlzLmN1cnJlbnRQb2ludC50b0FycmF5KCk7cmV0dXJuIGJ9LGZyb21KU09OOmZ1bmN0aW9uKGIpe1FkLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYik7dGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KGIuY3VycmVudFBvaW50KTsKcmV0dXJuIHRoaXN9fSk7dGUucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShpZC5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp0ZSxnZXRQb2ludHNIb2xlczpmdW5jdGlvbihiKXtmb3IodmFyIGU9W10saD0wLG09dGhpcy5ob2xlcy5sZW5ndGg7aDxtO2grKyllW2hdPXRoaXMuaG9sZXNbaF0uZ2V0UG9pbnRzKGIpO3JldHVybiBlfSxleHRyYWN0UG9pbnRzOmZ1bmN0aW9uKGIpe3JldHVybntzaGFwZTp0aGlzLmdldFBvaW50cyhiKSxob2xlczp0aGlzLmdldFBvaW50c0hvbGVzKGIpfX0sY29weTpmdW5jdGlvbihiKXtpZC5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5ob2xlcz1bXTtmb3IodmFyIGU9MCxoPWIuaG9sZXMubGVuZ3RoO2U8aDtlKyspdGhpcy5ob2xlcy5wdXNoKGIuaG9sZXNbZV0uY2xvbmUoKSk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBiPWlkLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLnV1aWQ9dGhpcy51dWlkOwpiLmhvbGVzPVtdO2Zvcih2YXIgZT0wLGg9dGhpcy5ob2xlcy5sZW5ndGg7ZTxoO2UrKyliLmhvbGVzLnB1c2godGhpcy5ob2xlc1tlXS50b0pTT04oKSk7cmV0dXJuIGJ9LGZyb21KU09OOmZ1bmN0aW9uKGIpe2lkLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYik7dGhpcy51dWlkPWIudXVpZDt0aGlzLmhvbGVzPVtdO2Zvcih2YXIgZT0wLGg9Yi5ob2xlcy5sZW5ndGg7ZTxoO2UrKyl7dmFyIG09Yi5ob2xlc1tlXTt0aGlzLmhvbGVzLnB1c2goKG5ldyBpZCkuZnJvbUpTT04obSkpfXJldHVybiB0aGlzfX0pO1ViLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoeS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpVYixpc0xpZ2h0OiEwLGNvcHk6ZnVuY3Rpb24oYil7eS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5jb2xvci5jb3B5KGIuY29sb3IpO3RoaXMuaW50ZW5zaXR5PWIuaW50ZW5zaXR5O3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYil7Yj0KeS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxiKTtiLm9iamVjdC5jb2xvcj10aGlzLmNvbG9yLmdldEhleCgpO2Iub2JqZWN0LmludGVuc2l0eT10aGlzLmludGVuc2l0eTt2b2lkIDAhPT10aGlzLmdyb3VuZENvbG9yJiYoYi5vYmplY3QuZ3JvdW5kQ29sb3I9dGhpcy5ncm91bmRDb2xvci5nZXRIZXgoKSk7dm9pZCAwIT09dGhpcy5kaXN0YW5jZSYmKGIub2JqZWN0LmRpc3RhbmNlPXRoaXMuZGlzdGFuY2UpO3ZvaWQgMCE9PXRoaXMuYW5nbGUmJihiLm9iamVjdC5hbmdsZT10aGlzLmFuZ2xlKTt2b2lkIDAhPT10aGlzLmRlY2F5JiYoYi5vYmplY3QuZGVjYXk9dGhpcy5kZWNheSk7dm9pZCAwIT09dGhpcy5wZW51bWJyYSYmKGIub2JqZWN0LnBlbnVtYnJhPXRoaXMucGVudW1icmEpO3ZvaWQgMCE9PXRoaXMuc2hhZG93JiYoYi5vYmplY3Quc2hhZG93PXRoaXMuc2hhZG93LnRvSlNPTigpKTtyZXR1cm4gYn19KTtLaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFViLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpLaSxpc0hlbWlzcGhlcmVMaWdodDohMCxjb3B5OmZ1bmN0aW9uKGIpe1ViLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLmdyb3VuZENvbG9yLmNvcHkoYi5ncm91bmRDb2xvcik7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmFzc2lnbihEZC5wcm90b3R5cGUse19wcm9qU2NyZWVuTWF0cml4Om5ldyByLF9saWdodFBvc2l0aW9uV29ybGQ6bmV3IGcsX2xvb2tUYXJnZXQ6bmV3IGcsZ2V0Vmlld3BvcnRDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl92aWV3cG9ydENvdW50fSxnZXRGcnVzdHVtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZydXN0dW19LHVwZGF0ZU1hdHJpY2VzOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuY2FtZXJhLGg9dGhpcy5tYXRyaXgsbT10aGlzLl9wcm9qU2NyZWVuTWF0cml4LHU9dGhpcy5fbG9va1RhcmdldCx3PXRoaXMuX2xpZ2h0UG9zaXRpb25Xb3JsZDt3LnNldEZyb21NYXRyaXhQb3NpdGlvbihiLm1hdHJpeFdvcmxkKTsKZS5wb3NpdGlvbi5jb3B5KHcpO3Uuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGIudGFyZ2V0Lm1hdHJpeFdvcmxkKTtlLmxvb2tBdCh1KTtlLnVwZGF0ZU1hdHJpeFdvcmxkKCk7bS5tdWx0aXBseU1hdHJpY2VzKGUucHJvamVjdGlvbk1hdHJpeCxlLm1hdHJpeFdvcmxkSW52ZXJzZSk7dGhpcy5fZnJ1c3R1bS5zZXRGcm9tTWF0cml4KG0pO2guc2V0KC41LDAsMCwuNSwwLC41LDAsLjUsMCwwLC41LC41LDAsMCwwLDEpO2gubXVsdGlwbHkoZS5wcm9qZWN0aW9uTWF0cml4KTtoLm11bHRpcGx5KGUubWF0cml4V29ybGRJbnZlcnNlKX0sZ2V0Vmlld3BvcnQ6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0c1tiXX0sZ2V0RnJhbWVFeHRlbnRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZyYW1lRXh0ZW50c30sY29weTpmdW5jdGlvbihiKXt0aGlzLmNhbWVyYT1iLmNhbWVyYS5jbG9uZSgpO3RoaXMuYmlhcz1iLmJpYXM7dGhpcy5yYWRpdXM9Yi5yYWRpdXM7dGhpcy5tYXBTaXplLmNvcHkoYi5tYXBTaXplKTsKcmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYj17fTswIT09dGhpcy5iaWFzJiYoYi5iaWFzPXRoaXMuYmlhcyk7MSE9PXRoaXMucmFkaXVzJiYoYi5yYWRpdXM9dGhpcy5yYWRpdXMpO2lmKDUxMiE9PXRoaXMubWFwU2l6ZS54fHw1MTIhPT10aGlzLm1hcFNpemUueSliLm1hcFNpemU9dGhpcy5tYXBTaXplLnRvQXJyYXkoKTtiLmNhbWVyYT10aGlzLmNhbWVyYS50b0pTT04oITEpLm9iamVjdDtkZWxldGUgYi5jYW1lcmEubWF0cml4O3JldHVybiBifX0pO0xpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGQucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6TGksaXNTcG90TGlnaHRTaGFkb3c6ITAsdXBkYXRlTWF0cmljZXM6ZnVuY3Rpb24oYixlLGgpe3ZhciBtPXRoaXMuY2FtZXJhLHU9MipsYi5SQUQyREVHKmIuYW5nbGUsdz10aGlzLm1hcFNpemUud2lkdGgvCnRoaXMubWFwU2l6ZS5oZWlnaHQsQT1iLmRpc3RhbmNlfHxtLmZhcjtpZih1IT09bS5mb3Z8fHchPT1tLmFzcGVjdHx8QSE9PW0uZmFyKW0uZm92PXUsbS5hc3BlY3Q9dyxtLmZhcj1BLG0udXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO0RkLnByb3RvdHlwZS51cGRhdGVNYXRyaWNlcy5jYWxsKHRoaXMsYixlLGgpfX0pO01pLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoVWIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6TWksaXNTcG90TGlnaHQ6ITAsY29weTpmdW5jdGlvbihiKXtVYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5kaXN0YW5jZT1iLmRpc3RhbmNlO3RoaXMuYW5nbGU9Yi5hbmdsZTt0aGlzLnBlbnVtYnJhPWIucGVudW1icmE7dGhpcy5kZWNheT1iLmRlY2F5O3RoaXMudGFyZ2V0PWIudGFyZ2V0LmNsb25lKCk7dGhpcy5zaGFkb3c9Yi5zaGFkb3cuY2xvbmUoKTtyZXR1cm4gdGhpc319KTtIay5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERkLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpIayxpc1BvaW50TGlnaHRTaGFkb3c6ITAsdXBkYXRlTWF0cmljZXM6ZnVuY3Rpb24oYixlLGgpe2U9dGhpcy5jYW1lcmE7dmFyIG09dGhpcy5tYXRyaXgsdT10aGlzLl9saWdodFBvc2l0aW9uV29ybGQsdz10aGlzLl9sb29rVGFyZ2V0LEE9dGhpcy5fcHJvalNjcmVlbk1hdHJpeDt1LnNldEZyb21NYXRyaXhQb3NpdGlvbihiLm1hdHJpeFdvcmxkKTtlLnBvc2l0aW9uLmNvcHkodSk7dy5jb3B5KGUucG9zaXRpb24pO3cuYWRkKHRoaXMuX2N1YmVEaXJlY3Rpb25zW2hdKTtlLnVwLmNvcHkodGhpcy5fY3ViZVVwc1toXSk7ZS5sb29rQXQodyk7ZS51cGRhdGVNYXRyaXhXb3JsZCgpO20ubWFrZVRyYW5zbGF0aW9uKC11LngsLXUueSwtdS56KTtBLm11bHRpcGx5TWF0cmljZXMoZS5wcm9qZWN0aW9uTWF0cml4LGUubWF0cml4V29ybGRJbnZlcnNlKTt0aGlzLl9mcnVzdHVtLnNldEZyb21NYXRyaXgoQSl9fSk7TmkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShVYi5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6TmksaXNQb2ludExpZ2h0OiEwLGNvcHk6ZnVuY3Rpb24oYil7VWIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMuZGlzdGFuY2U9Yi5kaXN0YW5jZTt0aGlzLmRlY2F5PWIuZGVjYXk7dGhpcy5zaGFkb3c9Yi5zaGFkb3cuY2xvbmUoKTtyZXR1cm4gdGhpc319KTtHaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEZiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkdoLGlzT3J0aG9ncmFwaGljQ2FtZXJhOiEwLGNvcHk6ZnVuY3Rpb24oYixlKXtGYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYixlKTt0aGlzLmxlZnQ9Yi5sZWZ0O3RoaXMucmlnaHQ9Yi5yaWdodDt0aGlzLnRvcD1iLnRvcDt0aGlzLmJvdHRvbT1iLmJvdHRvbTt0aGlzLm5lYXI9Yi5uZWFyO3RoaXMuZmFyPWIuZmFyO3RoaXMuem9vbT1iLnpvb207dGhpcy52aWV3PW51bGw9PT1iLnZpZXc/bnVsbDpPYmplY3QuYXNzaWduKHt9LGIudmlldyk7cmV0dXJuIHRoaXN9LApzZXRWaWV3T2Zmc2V0OmZ1bmN0aW9uKGIsZSxoLG0sdSx3KXtudWxsPT09dGhpcy52aWV3JiYodGhpcy52aWV3PXtlbmFibGVkOiEwLGZ1bGxXaWR0aDoxLGZ1bGxIZWlnaHQ6MSxvZmZzZXRYOjAsb2Zmc2V0WTowLHdpZHRoOjEsaGVpZ2h0OjF9KTt0aGlzLnZpZXcuZW5hYmxlZD0hMDt0aGlzLnZpZXcuZnVsbFdpZHRoPWI7dGhpcy52aWV3LmZ1bGxIZWlnaHQ9ZTt0aGlzLnZpZXcub2Zmc2V0WD1oO3RoaXMudmlldy5vZmZzZXRZPW07dGhpcy52aWV3LndpZHRoPXU7dGhpcy52aWV3LmhlaWdodD13O3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSxjbGVhclZpZXdPZmZzZXQ6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy52aWV3JiYodGhpcy52aWV3LmVuYWJsZWQ9ITEpO3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSx1cGRhdGVQcm9qZWN0aW9uTWF0cml4OmZ1bmN0aW9uKCl7dmFyIGI9KHRoaXMucmlnaHQtdGhpcy5sZWZ0KS8oMip0aGlzLnpvb20pLGU9KHRoaXMudG9wLQp0aGlzLmJvdHRvbSkvKDIqdGhpcy56b29tKSxoPSh0aGlzLnJpZ2h0K3RoaXMubGVmdCkvMixtPSh0aGlzLnRvcCt0aGlzLmJvdHRvbSkvMix1PWgtYjtoKz1iO2I9bStlO2U9bS1lO2lmKG51bGwhPT10aGlzLnZpZXcmJnRoaXMudmlldy5lbmFibGVkKXtoPXRoaXMuem9vbS8odGhpcy52aWV3LndpZHRoL3RoaXMudmlldy5mdWxsV2lkdGgpO2U9dGhpcy56b29tLyh0aGlzLnZpZXcuaGVpZ2h0L3RoaXMudmlldy5mdWxsSGVpZ2h0KTt2YXIgdz0odGhpcy5yaWdodC10aGlzLmxlZnQpL3RoaXMudmlldy53aWR0aDttPSh0aGlzLnRvcC10aGlzLmJvdHRvbSkvdGhpcy52aWV3LmhlaWdodDt1Kz10aGlzLnZpZXcub2Zmc2V0WC9oKnc7aD11K3RoaXMudmlldy53aWR0aC9oKnc7Yi09dGhpcy52aWV3Lm9mZnNldFkvZSptO2U9Yi10aGlzLnZpZXcuaGVpZ2h0L2UqbX10aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZU9ydGhvZ3JhcGhpYyh1LGgsYixlLHRoaXMubmVhcix0aGlzLmZhcik7dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKHRoaXMucHJvamVjdGlvbk1hdHJpeCl9LAp0b0pTT046ZnVuY3Rpb24oYil7Yj15LnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGIpO2Iub2JqZWN0Lnpvb209dGhpcy56b29tO2Iub2JqZWN0LmxlZnQ9dGhpcy5sZWZ0O2Iub2JqZWN0LnJpZ2h0PXRoaXMucmlnaHQ7Yi5vYmplY3QudG9wPXRoaXMudG9wO2Iub2JqZWN0LmJvdHRvbT10aGlzLmJvdHRvbTtiLm9iamVjdC5uZWFyPXRoaXMubmVhcjtiLm9iamVjdC5mYXI9dGhpcy5mYXI7bnVsbCE9PXRoaXMudmlldyYmKGIub2JqZWN0LnZpZXc9T2JqZWN0LmFzc2lnbih7fSx0aGlzLnZpZXcpKTtyZXR1cm4gYn19KTtPaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOk9pLGlzRGlyZWN0aW9uYWxMaWdodFNoYWRvdzohMCx1cGRhdGVNYXRyaWNlczpmdW5jdGlvbihiLGUsaCl7RGQucHJvdG90eXBlLnVwZGF0ZU1hdHJpY2VzLmNhbGwodGhpcyxiLGUsaCl9fSk7UGkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShVYi5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6UGksaXNEaXJlY3Rpb25hbExpZ2h0OiEwLGNvcHk6ZnVuY3Rpb24oYil7VWIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMudGFyZ2V0PWIudGFyZ2V0LmNsb25lKCk7dGhpcy5zaGFkb3c9Yi5zaGFkb3cuY2xvbmUoKTtyZXR1cm4gdGhpc319KTtRaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFViLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlFpLGlzQW1iaWVudExpZ2h0OiEwfSk7UmkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShVYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpSaSxpc1JlY3RBcmVhTGlnaHQ6ITAsY29weTpmdW5jdGlvbihiKXtVYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy53aWR0aD1iLndpZHRoO3RoaXMuaGVpZ2h0PWIuaGVpZ2h0O3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYil7Yj1VYi5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxiKTtiLm9iamVjdC53aWR0aD0KdGhpcy53aWR0aDtiLm9iamVjdC5oZWlnaHQ9dGhpcy5oZWlnaHQ7cmV0dXJuIGJ9fSk7U2kucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShLYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpTaSxsb2FkOmZ1bmN0aW9uKGIsZSxoLG0pe3ZhciB1PXRoaXMsdz1uZXcgU2ModS5tYW5hZ2VyKTt3LnNldFBhdGgodS5wYXRoKTt3LmxvYWQoYixmdW5jdGlvbihBKXtlKHUucGFyc2UoSlNPTi5wYXJzZShBKSkpfSxoLG0pfSxwYXJzZTpmdW5jdGlvbihiKXtmdW5jdGlvbiBlKEUpe3ZvaWQgMD09PWhbRV0mJmNvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWxMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlIixFKTtyZXR1cm4gaFtFXX12YXIgaD10aGlzLnRleHR1cmVzLG09bmV3IEdzW2IudHlwZV07dm9pZCAwIT09Yi51dWlkJiYobS51dWlkPWIudXVpZCk7dm9pZCAwIT09Yi5uYW1lJiYobS5uYW1lPWIubmFtZSk7dm9pZCAwIT09Yi5jb2xvciYmbS5jb2xvci5zZXRIZXgoYi5jb2xvcik7CnZvaWQgMCE9PWIucm91Z2huZXNzJiYobS5yb3VnaG5lc3M9Yi5yb3VnaG5lc3MpO3ZvaWQgMCE9PWIubWV0YWxuZXNzJiYobS5tZXRhbG5lc3M9Yi5tZXRhbG5lc3MpO3ZvaWQgMCE9PWIuZW1pc3NpdmUmJm0uZW1pc3NpdmUuc2V0SGV4KGIuZW1pc3NpdmUpO3ZvaWQgMCE9PWIuc3BlY3VsYXImJm0uc3BlY3VsYXIuc2V0SGV4KGIuc3BlY3VsYXIpO3ZvaWQgMCE9PWIuc2hpbmluZXNzJiYobS5zaGluaW5lc3M9Yi5zaGluaW5lc3MpO3ZvaWQgMCE9PWIuY2xlYXJjb2F0JiYobS5jbGVhcmNvYXQ9Yi5jbGVhcmNvYXQpO3ZvaWQgMCE9PWIuY2xlYXJjb2F0Um91Z2huZXNzJiYobS5jbGVhcmNvYXRSb3VnaG5lc3M9Yi5jbGVhcmNvYXRSb3VnaG5lc3MpO3ZvaWQgMCE9PWIudmVydGV4Q29sb3JzJiYobS52ZXJ0ZXhDb2xvcnM9Yi52ZXJ0ZXhDb2xvcnMpO3ZvaWQgMCE9PWIuZm9nJiYobS5mb2c9Yi5mb2cpO3ZvaWQgMCE9PWIuZmxhdFNoYWRpbmcmJihtLmZsYXRTaGFkaW5nPWIuZmxhdFNoYWRpbmcpOwp2b2lkIDAhPT1iLmJsZW5kaW5nJiYobS5ibGVuZGluZz1iLmJsZW5kaW5nKTt2b2lkIDAhPT1iLmNvbWJpbmUmJihtLmNvbWJpbmU9Yi5jb21iaW5lKTt2b2lkIDAhPT1iLnNpZGUmJihtLnNpZGU9Yi5zaWRlKTt2b2lkIDAhPT1iLm9wYWNpdHkmJihtLm9wYWNpdHk9Yi5vcGFjaXR5KTt2b2lkIDAhPT1iLnRyYW5zcGFyZW50JiYobS50cmFuc3BhcmVudD1iLnRyYW5zcGFyZW50KTt2b2lkIDAhPT1iLmFscGhhVGVzdCYmKG0uYWxwaGFUZXN0PWIuYWxwaGFUZXN0KTt2b2lkIDAhPT1iLmRlcHRoVGVzdCYmKG0uZGVwdGhUZXN0PWIuZGVwdGhUZXN0KTt2b2lkIDAhPT1iLmRlcHRoV3JpdGUmJihtLmRlcHRoV3JpdGU9Yi5kZXB0aFdyaXRlKTt2b2lkIDAhPT1iLmNvbG9yV3JpdGUmJihtLmNvbG9yV3JpdGU9Yi5jb2xvcldyaXRlKTt2b2lkIDAhPT1iLndpcmVmcmFtZSYmKG0ud2lyZWZyYW1lPWIud2lyZWZyYW1lKTt2b2lkIDAhPT1iLndpcmVmcmFtZUxpbmV3aWR0aCYmKG0ud2lyZWZyYW1lTGluZXdpZHRoPQpiLndpcmVmcmFtZUxpbmV3aWR0aCk7dm9pZCAwIT09Yi53aXJlZnJhbWVMaW5lY2FwJiYobS53aXJlZnJhbWVMaW5lY2FwPWIud2lyZWZyYW1lTGluZWNhcCk7dm9pZCAwIT09Yi53aXJlZnJhbWVMaW5lam9pbiYmKG0ud2lyZWZyYW1lTGluZWpvaW49Yi53aXJlZnJhbWVMaW5lam9pbik7dm9pZCAwIT09Yi5yb3RhdGlvbiYmKG0ucm90YXRpb249Yi5yb3RhdGlvbik7MSE9PWIubGluZXdpZHRoJiYobS5saW5ld2lkdGg9Yi5saW5ld2lkdGgpO3ZvaWQgMCE9PWIuZGFzaFNpemUmJihtLmRhc2hTaXplPWIuZGFzaFNpemUpO3ZvaWQgMCE9PWIuZ2FwU2l6ZSYmKG0uZ2FwU2l6ZT1iLmdhcFNpemUpO3ZvaWQgMCE9PWIuc2NhbGUmJihtLnNjYWxlPWIuc2NhbGUpO3ZvaWQgMCE9PWIucG9seWdvbk9mZnNldCYmKG0ucG9seWdvbk9mZnNldD1iLnBvbHlnb25PZmZzZXQpO3ZvaWQgMCE9PWIucG9seWdvbk9mZnNldEZhY3RvciYmKG0ucG9seWdvbk9mZnNldEZhY3Rvcj1iLnBvbHlnb25PZmZzZXRGYWN0b3IpOwp2b2lkIDAhPT1iLnBvbHlnb25PZmZzZXRVbml0cyYmKG0ucG9seWdvbk9mZnNldFVuaXRzPWIucG9seWdvbk9mZnNldFVuaXRzKTt2b2lkIDAhPT1iLnNraW5uaW5nJiYobS5za2lubmluZz1iLnNraW5uaW5nKTt2b2lkIDAhPT1iLm1vcnBoVGFyZ2V0cyYmKG0ubW9ycGhUYXJnZXRzPWIubW9ycGhUYXJnZXRzKTt2b2lkIDAhPT1iLm1vcnBoTm9ybWFscyYmKG0ubW9ycGhOb3JtYWxzPWIubW9ycGhOb3JtYWxzKTt2b2lkIDAhPT1iLmRpdGhlcmluZyYmKG0uZGl0aGVyaW5nPWIuZGl0aGVyaW5nKTt2b2lkIDAhPT1iLnZpc2libGUmJihtLnZpc2libGU9Yi52aXNpYmxlKTt2b2lkIDAhPT1iLnRvbmVNYXBwZWQmJihtLnRvbmVNYXBwZWQ9Yi50b25lTWFwcGVkKTt2b2lkIDAhPT1iLnVzZXJEYXRhJiYobS51c2VyRGF0YT1iLnVzZXJEYXRhKTtpZih2b2lkIDAhPT1iLnVuaWZvcm1zKWZvcih2YXIgdSBpbiBiLnVuaWZvcm1zKXt2YXIgdz1iLnVuaWZvcm1zW3VdO20udW5pZm9ybXNbdV09Cnt9O3N3aXRjaCh3LnR5cGUpe2Nhc2UgInQiOm0udW5pZm9ybXNbdV0udmFsdWU9ZSh3LnZhbHVlKTticmVhaztjYXNlICJjIjptLnVuaWZvcm1zW3VdLnZhbHVlPShuZXcgSSkuc2V0SGV4KHcudmFsdWUpO2JyZWFrO2Nhc2UgInYyIjptLnVuaWZvcm1zW3VdLnZhbHVlPShuZXcgZCkuZnJvbUFycmF5KHcudmFsdWUpO2JyZWFrO2Nhc2UgInYzIjptLnVuaWZvcm1zW3VdLnZhbHVlPShuZXcgZykuZnJvbUFycmF5KHcudmFsdWUpO2JyZWFrO2Nhc2UgInY0IjptLnVuaWZvcm1zW3VdLnZhbHVlPShuZXcgbikuZnJvbUFycmF5KHcudmFsdWUpO2JyZWFrO2Nhc2UgIm0zIjptLnVuaWZvcm1zW3VdLnZhbHVlPShuZXcgbCkuZnJvbUFycmF5KHcudmFsdWUpO2Nhc2UgIm00IjptLnVuaWZvcm1zW3VdLnZhbHVlPShuZXcgcikuZnJvbUFycmF5KHcudmFsdWUpO2JyZWFrO2RlZmF1bHQ6bS51bmlmb3Jtc1t1XS52YWx1ZT13LnZhbHVlfX12b2lkIDAhPT1iLmRlZmluZXMmJihtLmRlZmluZXM9Yi5kZWZpbmVzKTsKdm9pZCAwIT09Yi52ZXJ0ZXhTaGFkZXImJihtLnZlcnRleFNoYWRlcj1iLnZlcnRleFNoYWRlcik7dm9pZCAwIT09Yi5mcmFnbWVudFNoYWRlciYmKG0uZnJhZ21lbnRTaGFkZXI9Yi5mcmFnbWVudFNoYWRlcik7aWYodm9pZCAwIT09Yi5leHRlbnNpb25zKWZvcih2YXIgQSBpbiBiLmV4dGVuc2lvbnMpbS5leHRlbnNpb25zW0FdPWIuZXh0ZW5zaW9uc1tBXTt2b2lkIDAhPT1iLnNoYWRpbmcmJihtLmZsYXRTaGFkaW5nPTE9PT1iLnNoYWRpbmcpO3ZvaWQgMCE9PWIuc2l6ZSYmKG0uc2l6ZT1iLnNpemUpO3ZvaWQgMCE9PWIuc2l6ZUF0dGVudWF0aW9uJiYobS5zaXplQXR0ZW51YXRpb249Yi5zaXplQXR0ZW51YXRpb24pO3ZvaWQgMCE9PWIubWFwJiYobS5tYXA9ZShiLm1hcCkpO3ZvaWQgMCE9PWIubWF0Y2FwJiYobS5tYXRjYXA9ZShiLm1hdGNhcCkpO3ZvaWQgMCE9PWIuYWxwaGFNYXAmJihtLmFscGhhTWFwPWUoYi5hbHBoYU1hcCksbS50cmFuc3BhcmVudD0hMCk7dm9pZCAwIT09CmIuYnVtcE1hcCYmKG0uYnVtcE1hcD1lKGIuYnVtcE1hcCkpO3ZvaWQgMCE9PWIuYnVtcFNjYWxlJiYobS5idW1wU2NhbGU9Yi5idW1wU2NhbGUpO3ZvaWQgMCE9PWIubm9ybWFsTWFwJiYobS5ub3JtYWxNYXA9ZShiLm5vcm1hbE1hcCkpO3ZvaWQgMCE9PWIubm9ybWFsTWFwVHlwZSYmKG0ubm9ybWFsTWFwVHlwZT1iLm5vcm1hbE1hcFR5cGUpO3ZvaWQgMCE9PWIubm9ybWFsU2NhbGUmJih1PWIubm9ybWFsU2NhbGUsITE9PT1BcnJheS5pc0FycmF5KHUpJiYodT1bdSx1XSksbS5ub3JtYWxTY2FsZT0obmV3IGQpLmZyb21BcnJheSh1KSk7dm9pZCAwIT09Yi5kaXNwbGFjZW1lbnRNYXAmJihtLmRpc3BsYWNlbWVudE1hcD1lKGIuZGlzcGxhY2VtZW50TWFwKSk7dm9pZCAwIT09Yi5kaXNwbGFjZW1lbnRTY2FsZSYmKG0uZGlzcGxhY2VtZW50U2NhbGU9Yi5kaXNwbGFjZW1lbnRTY2FsZSk7dm9pZCAwIT09Yi5kaXNwbGFjZW1lbnRCaWFzJiYobS5kaXNwbGFjZW1lbnRCaWFzPWIuZGlzcGxhY2VtZW50Qmlhcyk7CnZvaWQgMCE9PWIucm91Z2huZXNzTWFwJiYobS5yb3VnaG5lc3NNYXA9ZShiLnJvdWdobmVzc01hcCkpO3ZvaWQgMCE9PWIubWV0YWxuZXNzTWFwJiYobS5tZXRhbG5lc3NNYXA9ZShiLm1ldGFsbmVzc01hcCkpO3ZvaWQgMCE9PWIuZW1pc3NpdmVNYXAmJihtLmVtaXNzaXZlTWFwPWUoYi5lbWlzc2l2ZU1hcCkpO3ZvaWQgMCE9PWIuZW1pc3NpdmVJbnRlbnNpdHkmJihtLmVtaXNzaXZlSW50ZW5zaXR5PWIuZW1pc3NpdmVJbnRlbnNpdHkpO3ZvaWQgMCE9PWIuc3BlY3VsYXJNYXAmJihtLnNwZWN1bGFyTWFwPWUoYi5zcGVjdWxhck1hcCkpO3ZvaWQgMCE9PWIuZW52TWFwJiYobS5lbnZNYXA9ZShiLmVudk1hcCkpO3ZvaWQgMCE9PWIuZW52TWFwSW50ZW5zaXR5JiYobS5lbnZNYXBJbnRlbnNpdHk9Yi5lbnZNYXBJbnRlbnNpdHkpO3ZvaWQgMCE9PWIucmVmbGVjdGl2aXR5JiYobS5yZWZsZWN0aXZpdHk9Yi5yZWZsZWN0aXZpdHkpO3ZvaWQgMCE9PWIucmVmcmFjdGlvblJhdGlvJiYobS5yZWZyYWN0aW9uUmF0aW89CmIucmVmcmFjdGlvblJhdGlvKTt2b2lkIDAhPT1iLmxpZ2h0TWFwJiYobS5saWdodE1hcD1lKGIubGlnaHRNYXApKTt2b2lkIDAhPT1iLmxpZ2h0TWFwSW50ZW5zaXR5JiYobS5saWdodE1hcEludGVuc2l0eT1iLmxpZ2h0TWFwSW50ZW5zaXR5KTt2b2lkIDAhPT1iLmFvTWFwJiYobS5hb01hcD1lKGIuYW9NYXApKTt2b2lkIDAhPT1iLmFvTWFwSW50ZW5zaXR5JiYobS5hb01hcEludGVuc2l0eT1iLmFvTWFwSW50ZW5zaXR5KTt2b2lkIDAhPT1iLmdyYWRpZW50TWFwJiYobS5ncmFkaWVudE1hcD1lKGIuZ3JhZGllbnRNYXApKTt2b2lkIDAhPT1iLmNsZWFyY29hdE5vcm1hbE1hcCYmKG0uY2xlYXJjb2F0Tm9ybWFsTWFwPWUoYi5jbGVhcmNvYXROb3JtYWxNYXApKTt2b2lkIDAhPT1iLmNsZWFyY29hdE5vcm1hbFNjYWxlJiYobS5jbGVhcmNvYXROb3JtYWxTY2FsZT0obmV3IGQpLmZyb21BcnJheShiLmNsZWFyY29hdE5vcm1hbFNjYWxlKSk7cmV0dXJuIG19LHNldFRleHR1cmVzOmZ1bmN0aW9uKGIpe3RoaXMudGV4dHVyZXM9CmI7cmV0dXJuIHRoaXN9fSk7dmFyIHNsPXtkZWNvZGVUZXh0OmZ1bmN0aW9uKGIpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIFRleHREZWNvZGVyKXJldHVybihuZXcgVGV4dERlY29kZXIpLmRlY29kZShiKTtmb3IodmFyIGU9IiIsaD0wLG09Yi5sZW5ndGg7aDxtO2grKyllKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGJbaF0pO3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShlKSl9Y2F0Y2godSl7cmV0dXJuIGV9fSxleHRyYWN0VXJsQmFzZTpmdW5jdGlvbihiKXt2YXIgZT1iLmxhc3RJbmRleE9mKCIvIik7cmV0dXJuLTE9PT1lPyIuLyI6Yi5zdWJzdHIoMCxlKzEpfX07VGkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpUaSxpc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5OiEwLGNvcHk6ZnVuY3Rpb24oYil7eGEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMubWF4SW5zdGFuY2VkQ291bnQ9CmIubWF4SW5zdGFuY2VkQ291bnQ7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYj14YS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7Yi5tYXhJbnN0YW5jZWRDb3VudD10aGlzLm1heEluc3RhbmNlZENvdW50O2IuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT0hMDtyZXR1cm4gYn19KTtVaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VWksaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6ITAsY29weTpmdW5jdGlvbihiKXtSLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9Yi5tZXNoUGVyQXR0cmlidXRlO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYj1SLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLm1lc2hQZXJBdHRyaWJ1dGU9CnRoaXMubWVzaFBlckF0dHJpYnV0ZTtiLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlPSEwO3JldHVybiBifX0pO1ZpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoS2IucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VmksbG9hZDpmdW5jdGlvbihiLGUsaCxtKXt2YXIgdT10aGlzLHc9bmV3IFNjKHUubWFuYWdlcik7dy5zZXRQYXRoKHUucGF0aCk7dy5sb2FkKGIsZnVuY3Rpb24oQSl7ZSh1LnBhcnNlKEpTT04ucGFyc2UoQSkpKX0saCxtKX0scGFyc2U6ZnVuY3Rpb24oYil7dmFyIGU9Yi5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5P25ldyBUaTpuZXcgeGEsaD1iLmRhdGEuaW5kZXg7aWYodm9pZCAwIT09aCl7dmFyIG09bmV3IHRsW2gudHlwZV0oaC5hcnJheSk7ZS5zZXRJbmRleChuZXcgUihtLDEpKX1oPWIuZGF0YS5hdHRyaWJ1dGVzO2Zvcih2YXIgdSBpbiBoKXt2YXIgdz1oW3VdO209bmV3IHRsW3cudHlwZV0ody5hcnJheSk7bT1uZXcgKHcuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU/ClVpOlIpKG0sdy5pdGVtU2l6ZSx3Lm5vcm1hbGl6ZWQpO3ZvaWQgMCE9PXcubmFtZSYmKG0ubmFtZT13Lm5hbWUpO2UuYWRkQXR0cmlidXRlKHUsbSl9dmFyIEE9Yi5kYXRhLm1vcnBoQXR0cmlidXRlcztpZihBKWZvcih1IGluIEEpe3ZhciBFPUFbdV0sRz1bXTtoPTA7Zm9yKHZhciBKPUUubGVuZ3RoO2g8SjtoKyspdz1FW2hdLG09bmV3IHRsW3cudHlwZV0ody5hcnJheSksbT1uZXcgUihtLHcuaXRlbVNpemUsdy5ub3JtYWxpemVkKSx2b2lkIDAhPT13Lm5hbWUmJihtLm5hbWU9dy5uYW1lKSxHLnB1c2gobSk7ZS5tb3JwaEF0dHJpYnV0ZXNbdV09R311PWIuZGF0YS5ncm91cHN8fGIuZGF0YS5kcmF3Y2FsbHN8fGIuZGF0YS5vZmZzZXRzO2lmKHZvaWQgMCE9PXUpZm9yKGg9MCx3PXUubGVuZ3RoO2ghPT13OysraCltPXVbaF0sZS5hZGRHcm91cChtLnN0YXJ0LG0uY291bnQsbS5tYXRlcmlhbEluZGV4KTtoPWIuZGF0YS5ib3VuZGluZ1NwaGVyZTt2b2lkIDAhPT1oJiYodT1uZXcgZywKdm9pZCAwIT09aC5jZW50ZXImJnUuZnJvbUFycmF5KGguY2VudGVyKSxlLmJvdW5kaW5nU3BoZXJlPW5ldyBGKHUsaC5yYWRpdXMpKTtiLm5hbWUmJihlLm5hbWU9Yi5uYW1lKTtiLnVzZXJEYXRhJiYoZS51c2VyRGF0YT1iLnVzZXJEYXRhKTtyZXR1cm4gZX19KTt2YXIgdGw9e0ludDhBcnJheSxVaW50OEFycmF5LFVpbnQ4Q2xhbXBlZEFycmF5OiJ1bmRlZmluZWQiIT09dHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5P1VpbnQ4Q2xhbXBlZEFycmF5OlVpbnQ4QXJyYXksSW50MTZBcnJheSxVaW50MTZBcnJheSxJbnQzMkFycmF5LFVpbnQzMkFycmF5LEZsb2F0MzJBcnJheSxGbG9hdDY0QXJyYXl9O1dpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoS2IucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6V2ksbG9hZDpmdW5jdGlvbihiLGUsaCxtKXt2YXIgdT10aGlzLHc9IiI9PT10aGlzLnBhdGg/c2wuZXh0cmFjdFVybEJhc2UoYik6dGhpcy5wYXRoO3RoaXMucmVzb3VyY2VQYXRoPQp0aGlzLnJlc291cmNlUGF0aHx8dzt3PW5ldyBTYyh1Lm1hbmFnZXIpO3cuc2V0UGF0aCh0aGlzLnBhdGgpO3cubG9hZChiLGZ1bmN0aW9uKEEpe3ZhciBFPW51bGw7dHJ5e0U9SlNPTi5wYXJzZShBKX1jYXRjaChHKXt2b2lkIDAhPT1tJiZtKEcpO2NvbnNvbGUuZXJyb3IoIlRIUkVFOk9iamVjdExvYWRlcjogQ2FuJ3QgcGFyc2UgIitiKyIuIixHLm1lc3NhZ2UpO3JldHVybn1BPUUubWV0YWRhdGE7dm9pZCAwPT09QXx8dm9pZCAwPT09QS50eXBlfHwiZ2VvbWV0cnkiPT09QS50eXBlLnRvTG93ZXJDYXNlKCk/Y29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0TG9hZGVyOiBDYW4ndCBsb2FkICIrYik6dS5wYXJzZShFLGUpfSxoLG0pfSxwYXJzZTpmdW5jdGlvbihiLGUpe3ZhciBoPXRoaXMucGFyc2VTaGFwZShiLnNoYXBlcyk7aD10aGlzLnBhcnNlR2VvbWV0cmllcyhiLmdlb21ldHJpZXMsaCk7dmFyIG09dGhpcy5wYXJzZUltYWdlcyhiLmltYWdlcyxmdW5jdGlvbigpe3ZvaWQgMCE9PQplJiZlKHUpfSk7bT10aGlzLnBhcnNlVGV4dHVyZXMoYi50ZXh0dXJlcyxtKTttPXRoaXMucGFyc2VNYXRlcmlhbHMoYi5tYXRlcmlhbHMsbSk7dmFyIHU9dGhpcy5wYXJzZU9iamVjdChiLm9iamVjdCxoLG0pO2IuYW5pbWF0aW9ucyYmKHUuYW5pbWF0aW9ucz10aGlzLnBhcnNlQW5pbWF0aW9ucyhiLmFuaW1hdGlvbnMpKTt2b2lkIDAhPT1iLmltYWdlcyYmMCE9PWIuaW1hZ2VzLmxlbmd0aHx8dm9pZCAwPT09ZXx8ZSh1KTtyZXR1cm4gdX0scGFyc2VTaGFwZTpmdW5jdGlvbihiKXt2YXIgZT17fTtpZih2b2lkIDAhPT1iKWZvcih2YXIgaD0wLG09Yi5sZW5ndGg7aDxtO2grKyl7dmFyIHU9KG5ldyB0ZSkuZnJvbUpTT04oYltoXSk7ZVt1LnV1aWRdPXV9cmV0dXJuIGV9LHBhcnNlR2VvbWV0cmllczpmdW5jdGlvbihiLGUpe3ZhciBoPXt9O2lmKHZvaWQgMCE9PWIpZm9yKHZhciBtPW5ldyBWaSx1PTAsdz1iLmxlbmd0aDt1PHc7dSsrKXt2YXIgQT1iW3VdO3N3aXRjaChBLnR5cGUpe2Nhc2UgIlBsYW5lR2VvbWV0cnkiOmNhc2UgIlBsYW5lQnVmZmVyR2VvbWV0cnkiOnZhciBFPQpuZXcgQ2NbQS50eXBlXShBLndpZHRoLEEuaGVpZ2h0LEEud2lkdGhTZWdtZW50cyxBLmhlaWdodFNlZ21lbnRzKTticmVhaztjYXNlICJCb3hHZW9tZXRyeSI6Y2FzZSAiQm94QnVmZmVyR2VvbWV0cnkiOmNhc2UgIkN1YmVHZW9tZXRyeSI6RT1uZXcgQ2NbQS50eXBlXShBLndpZHRoLEEuaGVpZ2h0LEEuZGVwdGgsQS53aWR0aFNlZ21lbnRzLEEuaGVpZ2h0U2VnbWVudHMsQS5kZXB0aFNlZ21lbnRzKTticmVhaztjYXNlICJDaXJjbGVHZW9tZXRyeSI6Y2FzZSAiQ2lyY2xlQnVmZmVyR2VvbWV0cnkiOkU9bmV3IENjW0EudHlwZV0oQS5yYWRpdXMsQS5zZWdtZW50cyxBLnRoZXRhU3RhcnQsQS50aGV0YUxlbmd0aCk7YnJlYWs7Y2FzZSAiQ3lsaW5kZXJHZW9tZXRyeSI6Y2FzZSAiQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSI6RT1uZXcgQ2NbQS50eXBlXShBLnJhZGl1c1RvcCxBLnJhZGl1c0JvdHRvbSxBLmhlaWdodCxBLnJhZGlhbFNlZ21lbnRzLEEuaGVpZ2h0U2VnbWVudHMsQS5vcGVuRW5kZWQsCkEudGhldGFTdGFydCxBLnRoZXRhTGVuZ3RoKTticmVhaztjYXNlICJDb25lR2VvbWV0cnkiOmNhc2UgIkNvbmVCdWZmZXJHZW9tZXRyeSI6RT1uZXcgQ2NbQS50eXBlXShBLnJhZGl1cyxBLmhlaWdodCxBLnJhZGlhbFNlZ21lbnRzLEEuaGVpZ2h0U2VnbWVudHMsQS5vcGVuRW5kZWQsQS50aGV0YVN0YXJ0LEEudGhldGFMZW5ndGgpO2JyZWFrO2Nhc2UgIlNwaGVyZUdlb21ldHJ5IjpjYXNlICJTcGhlcmVCdWZmZXJHZW9tZXRyeSI6RT1uZXcgQ2NbQS50eXBlXShBLnJhZGl1cyxBLndpZHRoU2VnbWVudHMsQS5oZWlnaHRTZWdtZW50cyxBLnBoaVN0YXJ0LEEucGhpTGVuZ3RoLEEudGhldGFTdGFydCxBLnRoZXRhTGVuZ3RoKTticmVhaztjYXNlICJEb2RlY2FoZWRyb25HZW9tZXRyeSI6Y2FzZSAiRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkiOmNhc2UgIkljb3NhaGVkcm9uR2VvbWV0cnkiOmNhc2UgIkljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkiOmNhc2UgIk9jdGFoZWRyb25HZW9tZXRyeSI6Y2FzZSAiT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5IjpjYXNlICJUZXRyYWhlZHJvbkdlb21ldHJ5IjpjYXNlICJUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IjpFPQpuZXcgQ2NbQS50eXBlXShBLnJhZGl1cyxBLmRldGFpbCk7YnJlYWs7Y2FzZSAiUmluZ0dlb21ldHJ5IjpjYXNlICJSaW5nQnVmZmVyR2VvbWV0cnkiOkU9bmV3IENjW0EudHlwZV0oQS5pbm5lclJhZGl1cyxBLm91dGVyUmFkaXVzLEEudGhldGFTZWdtZW50cyxBLnBoaVNlZ21lbnRzLEEudGhldGFTdGFydCxBLnRoZXRhTGVuZ3RoKTticmVhaztjYXNlICJUb3J1c0dlb21ldHJ5IjpjYXNlICJUb3J1c0J1ZmZlckdlb21ldHJ5IjpFPW5ldyBDY1tBLnR5cGVdKEEucmFkaXVzLEEudHViZSxBLnJhZGlhbFNlZ21lbnRzLEEudHVidWxhclNlZ21lbnRzLEEuYXJjKTticmVhaztjYXNlICJUb3J1c0tub3RHZW9tZXRyeSI6Y2FzZSAiVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkiOkU9bmV3IENjW0EudHlwZV0oQS5yYWRpdXMsQS50dWJlLEEudHVidWxhclNlZ21lbnRzLEEucmFkaWFsU2VnbWVudHMsQS5wLEEucSk7YnJlYWs7Y2FzZSAiVHViZUdlb21ldHJ5IjpjYXNlICJUdWJlQnVmZmVyR2VvbWV0cnkiOkU9Cm5ldyBDY1tBLnR5cGVdKChuZXcgcmxbQS5wYXRoLnR5cGVdKS5mcm9tSlNPTihBLnBhdGgpLEEudHVidWxhclNlZ21lbnRzLEEucmFkaXVzLEEucmFkaWFsU2VnbWVudHMsQS5jbG9zZWQpO2JyZWFrO2Nhc2UgIkxhdGhlR2VvbWV0cnkiOmNhc2UgIkxhdGhlQnVmZmVyR2VvbWV0cnkiOkU9bmV3IENjW0EudHlwZV0oQS5wb2ludHMsQS5zZWdtZW50cyxBLnBoaVN0YXJ0LEEucGhpTGVuZ3RoKTticmVhaztjYXNlICJQb2x5aGVkcm9uR2VvbWV0cnkiOmNhc2UgIlBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSI6RT1uZXcgQ2NbQS50eXBlXShBLnZlcnRpY2VzLEEuaW5kaWNlcyxBLnJhZGl1cyxBLmRldGFpbHMpO2JyZWFrO2Nhc2UgIlNoYXBlR2VvbWV0cnkiOmNhc2UgIlNoYXBlQnVmZmVyR2VvbWV0cnkiOkU9W107Zm9yKHZhciBHPTAsSj1BLnNoYXBlcy5sZW5ndGg7RzxKO0crKyl7dmFyIFE9ZVtBLnNoYXBlc1tHXV07RS5wdXNoKFEpfUU9bmV3IENjW0EudHlwZV0oRSxBLmN1cnZlU2VnbWVudHMpOwpicmVhaztjYXNlICJFeHRydWRlR2VvbWV0cnkiOmNhc2UgIkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSI6RT1bXTtHPTA7Zm9yKEo9QS5zaGFwZXMubGVuZ3RoO0c8SjtHKyspUT1lW0Euc2hhcGVzW0ddXSxFLnB1c2goUSk7Rz1BLm9wdGlvbnMuZXh0cnVkZVBhdGg7dm9pZCAwIT09RyYmKEEub3B0aW9ucy5leHRydWRlUGF0aD0obmV3IHJsW0cudHlwZV0pLmZyb21KU09OKEcpKTtFPW5ldyBDY1tBLnR5cGVdKEUsQS5vcHRpb25zKTticmVhaztjYXNlICJCdWZmZXJHZW9tZXRyeSI6Y2FzZSAiSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkiOkU9bS5wYXJzZShBKTticmVhaztjYXNlICJHZW9tZXRyeSI6IlRIUkVFImluIHdpbmRvdyYmIkxlZ2FjeUpTT05Mb2FkZXIiaW4gVEhSRUU/RT0obmV3IFRIUkVFLkxlZ2FjeUpTT05Mb2FkZXIpLnBhcnNlKEEsdGhpcy5yZXNvdXJjZVBhdGgpLmdlb21ldHJ5OmNvbnNvbGUuZXJyb3IoJ1RIUkVFLk9iamVjdExvYWRlcjogWW91IGhhdmUgdG8gaW1wb3J0IExlZ2FjeUpTT05Mb2FkZXIgaW4gb3JkZXIgbG9hZCBnZW9tZXRyeSBkYXRhIG9mIHR5cGUgIkdlb21ldHJ5Ii4nKTsKYnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oJ1RIUkVFLk9iamVjdExvYWRlcjogVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZSAiJytBLnR5cGUrJyInKTtjb250aW51ZX1FLnV1aWQ9QS51dWlkO3ZvaWQgMCE9PUEubmFtZSYmKEUubmFtZT1BLm5hbWUpOyEwPT09RS5pc0J1ZmZlckdlb21ldHJ5JiZ2b2lkIDAhPT1BLnVzZXJEYXRhJiYoRS51c2VyRGF0YT1BLnVzZXJEYXRhKTtoW0EudXVpZF09RX1yZXR1cm4gaH0scGFyc2VNYXRlcmlhbHM6ZnVuY3Rpb24oYixlKXt2YXIgaD17fSxtPXt9O2lmKHZvaWQgMCE9PWIpe3ZhciB1PW5ldyBTaTt1LnNldFRleHR1cmVzKGUpO2U9MDtmb3IodmFyIHc9Yi5sZW5ndGg7ZTx3O2UrKyl7dmFyIEE9YltlXTtpZigiTXVsdGlNYXRlcmlhbCI9PT1BLnR5cGUpe2Zvcih2YXIgRT1bXSxHPTA7RzxBLm1hdGVyaWFscy5sZW5ndGg7RysrKXt2YXIgSj1BLm1hdGVyaWFsc1tHXTt2b2lkIDA9PT1oW0oudXVpZF0mJihoW0oudXVpZF09dS5wYXJzZShKKSk7CkUucHVzaChoW0oudXVpZF0pfW1bQS51dWlkXT1FfWVsc2Ugdm9pZCAwPT09aFtBLnV1aWRdJiYoaFtBLnV1aWRdPXUucGFyc2UoQSkpLG1bQS51dWlkXT1oW0EudXVpZF19fXJldHVybiBtfSxwYXJzZUFuaW1hdGlvbnM6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPVtdLGg9MDtoPGIubGVuZ3RoO2grKyl7dmFyIG09YltoXSx1PVJjLnBhcnNlKG0pO3ZvaWQgMCE9PW0udXVpZCYmKHUudXVpZD1tLnV1aWQpO2UucHVzaCh1KX1yZXR1cm4gZX0scGFyc2VJbWFnZXM6ZnVuY3Rpb24oYixlKXtmdW5jdGlvbiBoKFQpe20ubWFuYWdlci5pdGVtU3RhcnQoVCk7cmV0dXJuIHcubG9hZChULGZ1bmN0aW9uKCl7bS5tYW5hZ2VyLml0ZW1FbmQoVCl9LHZvaWQgMCxmdW5jdGlvbigpe20ubWFuYWdlci5pdGVtRXJyb3IoVCk7bS5tYW5hZ2VyLml0ZW1FbmQoVCl9KX12YXIgbT10aGlzLHU9e307aWYodm9pZCAwIT09YiYmMDxiLmxlbmd0aCl7ZT1uZXcgRGsoZSk7dmFyIHc9bmV3IGVnKGUpO3cuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7CmU9MDtmb3IodmFyIEE9Yi5sZW5ndGg7ZTxBO2UrKyl7dmFyIEU9YltlXSxHPUUudXJsO2lmKEFycmF5LmlzQXJyYXkoRykpe3VbRS51dWlkXT1bXTtmb3IodmFyIEo9MCxRPUcubGVuZ3RoO0o8UTtKKyspe3ZhciBTPUdbSl07Uz0vXihcL1wvKXwoW2Etel0rOihcL1wvKT8pL2kudGVzdChTKT9TOm0ucmVzb3VyY2VQYXRoK1M7dVtFLnV1aWRdLnB1c2goaChTKSl9fWVsc2UgUz0vXihcL1wvKXwoW2Etel0rOihcL1wvKT8pL2kudGVzdChFLnVybCk/RS51cmw6bS5yZXNvdXJjZVBhdGgrRS51cmwsdVtFLnV1aWRdPWgoUyl9fXJldHVybiB1fSxwYXJzZVRleHR1cmVzOmZ1bmN0aW9uKGIsZSl7ZnVuY3Rpb24gaChHLEope2lmKCJudW1iZXIiPT09dHlwZW9mIEcpcmV0dXJuIEc7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VUZXh0dXJlOiBDb25zdGFudCBzaG91bGQgYmUgaW4gbnVtZXJpYyBmb3JtLiIsRyk7cmV0dXJuIEpbR119dmFyIG09e307aWYodm9pZCAwIT09CmIpZm9yKHZhciB1PTAsdz1iLmxlbmd0aDt1PHc7dSsrKXt2YXIgQT1iW3VdO3ZvaWQgMD09PUEuaW1hZ2UmJmNvbnNvbGUud2FybignVEhSRUUuT2JqZWN0TG9hZGVyOiBObyAiaW1hZ2UiIHNwZWNpZmllZCBmb3InLEEudXVpZCk7dm9pZCAwPT09ZVtBLmltYWdlXSYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBpbWFnZSIsQS5pbWFnZSk7dmFyIEU9QXJyYXkuaXNBcnJheShlW0EuaW1hZ2VdKT9uZXcgTWQoZVtBLmltYWdlXSk6bmV3IGsoZVtBLmltYWdlXSk7RS5uZWVkc1VwZGF0ZT0hMDtFLnV1aWQ9QS51dWlkO3ZvaWQgMCE9PUEubmFtZSYmKEUubmFtZT1BLm5hbWUpO3ZvaWQgMCE9PUEubWFwcGluZyYmKEUubWFwcGluZz1oKEEubWFwcGluZyxIcykpO3ZvaWQgMCE9PUEub2Zmc2V0JiZFLm9mZnNldC5mcm9tQXJyYXkoQS5vZmZzZXQpO3ZvaWQgMCE9PUEucmVwZWF0JiZFLnJlcGVhdC5mcm9tQXJyYXkoQS5yZXBlYXQpO3ZvaWQgMCE9PUEuY2VudGVyJiYKRS5jZW50ZXIuZnJvbUFycmF5KEEuY2VudGVyKTt2b2lkIDAhPT1BLnJvdGF0aW9uJiYoRS5yb3RhdGlvbj1BLnJvdGF0aW9uKTt2b2lkIDAhPT1BLndyYXAmJihFLndyYXBTPWgoQS53cmFwWzBdLEJvKSxFLndyYXBUPWgoQS53cmFwWzFdLEJvKSk7dm9pZCAwIT09QS5mb3JtYXQmJihFLmZvcm1hdD1BLmZvcm1hdCk7dm9pZCAwIT09QS50eXBlJiYoRS50eXBlPUEudHlwZSk7dm9pZCAwIT09QS5lbmNvZGluZyYmKEUuZW5jb2Rpbmc9QS5lbmNvZGluZyk7dm9pZCAwIT09QS5taW5GaWx0ZXImJihFLm1pbkZpbHRlcj1oKEEubWluRmlsdGVyLENvKSk7dm9pZCAwIT09QS5tYWdGaWx0ZXImJihFLm1hZ0ZpbHRlcj1oKEEubWFnRmlsdGVyLENvKSk7dm9pZCAwIT09QS5hbmlzb3Ryb3B5JiYoRS5hbmlzb3Ryb3B5PUEuYW5pc290cm9weSk7dm9pZCAwIT09QS5mbGlwWSYmKEUuZmxpcFk9QS5mbGlwWSk7dm9pZCAwIT09QS5wcmVtdWx0aXBseUFscGhhJiYoRS5wcmVtdWx0aXBseUFscGhhPQpBLnByZW11bHRpcGx5QWxwaGEpO3ZvaWQgMCE9PUEudW5wYWNrQWxpZ25tZW50JiYoRS51bnBhY2tBbGlnbm1lbnQ9QS51bnBhY2tBbGlnbm1lbnQpO21bQS51dWlkXT1FfXJldHVybiBtfSxwYXJzZU9iamVjdDpmdW5jdGlvbihiLGUsaCl7ZnVuY3Rpb24gbShKKXt2b2lkIDA9PT1lW0pdJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGdlb21ldHJ5IixKKTtyZXR1cm4gZVtKXX1mdW5jdGlvbiB1KEope2lmKHZvaWQgMCE9PUope2lmKEFycmF5LmlzQXJyYXkoSikpe2Zvcih2YXIgUT1bXSxTPTAsVD1KLmxlbmd0aDtTPFQ7UysrKXt2YXIgVz1KW1NdO3ZvaWQgMD09PWhbV10mJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwiLFcpO1EucHVzaChoW1ddKX1yZXR1cm4gUX12b2lkIDA9PT1oW0pdJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsIixKKTtyZXR1cm4gaFtKXX19CnN3aXRjaChiLnR5cGUpe2Nhc2UgIlNjZW5lIjp2YXIgdz1uZXcgejt2b2lkIDAhPT1iLmJhY2tncm91bmQmJk51bWJlci5pc0ludGVnZXIoYi5iYWNrZ3JvdW5kKSYmKHcuYmFja2dyb3VuZD1uZXcgSShiLmJhY2tncm91bmQpKTt2b2lkIDAhPT1iLmZvZyYmKCJGb2ciPT09Yi5mb2cudHlwZT93LmZvZz1uZXcgeGkoYi5mb2cuY29sb3IsYi5mb2cubmVhcixiLmZvZy5mYXIpOiJGb2dFeHAyIj09PWIuZm9nLnR5cGUmJih3LmZvZz1uZXcgd2koYi5mb2cuY29sb3IsYi5mb2cuZGVuc2l0eSkpKTticmVhaztjYXNlICJQZXJzcGVjdGl2ZUNhbWVyYSI6dz1uZXcgQWIoYi5mb3YsYi5hc3BlY3QsYi5uZWFyLGIuZmFyKTt2b2lkIDAhPT1iLmZvY3VzJiYody5mb2N1cz1iLmZvY3VzKTt2b2lkIDAhPT1iLnpvb20mJih3Lnpvb209Yi56b29tKTt2b2lkIDAhPT1iLmZpbG1HYXVnZSYmKHcuZmlsbUdhdWdlPWIuZmlsbUdhdWdlKTt2b2lkIDAhPT1iLmZpbG1PZmZzZXQmJih3LmZpbG1PZmZzZXQ9CmIuZmlsbU9mZnNldCk7dm9pZCAwIT09Yi52aWV3JiYody52aWV3PU9iamVjdC5hc3NpZ24oe30sYi52aWV3KSk7YnJlYWs7Y2FzZSAiT3J0aG9ncmFwaGljQ2FtZXJhIjp3PW5ldyBHaChiLmxlZnQsYi5yaWdodCxiLnRvcCxiLmJvdHRvbSxiLm5lYXIsYi5mYXIpO3ZvaWQgMCE9PWIuem9vbSYmKHcuem9vbT1iLnpvb20pO3ZvaWQgMCE9PWIudmlldyYmKHcudmlldz1PYmplY3QuYXNzaWduKHt9LGIudmlldykpO2JyZWFrO2Nhc2UgIkFtYmllbnRMaWdodCI6dz1uZXcgUWkoYi5jb2xvcixiLmludGVuc2l0eSk7YnJlYWs7Y2FzZSAiRGlyZWN0aW9uYWxMaWdodCI6dz1uZXcgUGkoYi5jb2xvcixiLmludGVuc2l0eSk7YnJlYWs7Y2FzZSAiUG9pbnRMaWdodCI6dz1uZXcgTmkoYi5jb2xvcixiLmludGVuc2l0eSxiLmRpc3RhbmNlLGIuZGVjYXkpO2JyZWFrO2Nhc2UgIlJlY3RBcmVhTGlnaHQiOnc9bmV3IFJpKGIuY29sb3IsYi5pbnRlbnNpdHksYi53aWR0aCxiLmhlaWdodCk7YnJlYWs7CmNhc2UgIlNwb3RMaWdodCI6dz1uZXcgTWkoYi5jb2xvcixiLmludGVuc2l0eSxiLmRpc3RhbmNlLGIuYW5nbGUsYi5wZW51bWJyYSxiLmRlY2F5KTticmVhaztjYXNlICJIZW1pc3BoZXJlTGlnaHQiOnc9bmV3IEtpKGIuY29sb3IsYi5ncm91bmRDb2xvcixiLmludGVuc2l0eSk7YnJlYWs7Y2FzZSAiU2tpbm5lZE1lc2giOmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyLnBhcnNlT2JqZWN0KCkgZG9lcyBub3Qgc3VwcG9ydCBTa2lubmVkTWVzaCB5ZXQuIik7Y2FzZSAiTWVzaCI6dz1tKGIuZ2VvbWV0cnkpO3ZhciBBPXUoYi5tYXRlcmlhbCk7dz13LmJvbmVzJiYwPHcuYm9uZXMubGVuZ3RoP25ldyBmaCh3LEEpOm5ldyB5YSh3LEEpO3ZvaWQgMCE9PWIuZHJhd01vZGUmJncuc2V0RHJhd01vZGUoYi5kcmF3TW9kZSk7YnJlYWs7Y2FzZSAiTE9EIjp3PW5ldyBlaDticmVhaztjYXNlICJMaW5lIjp3PW5ldyBtYyhtKGIuZ2VvbWV0cnkpLHUoYi5tYXRlcmlhbCksYi5tb2RlKTsKYnJlYWs7Y2FzZSAiTGluZUxvb3AiOnc9bmV3IEFpKG0oYi5nZW9tZXRyeSksdShiLm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSAiTGluZVNlZ21lbnRzIjp3PW5ldyBTYihtKGIuZ2VvbWV0cnkpLHUoYi5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UgIlBvaW50Q2xvdWQiOmNhc2UgIlBvaW50cyI6dz1uZXcgTmYobShiLmdlb21ldHJ5KSx1KGIubWF0ZXJpYWwpKTticmVhaztjYXNlICJTcHJpdGUiOnc9bmV3IGNoKHUoYi5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UgIkdyb3VwIjp3PW5ldyBGZjticmVhaztkZWZhdWx0Onc9bmV3IHl9dy51dWlkPWIudXVpZDt2b2lkIDAhPT1iLm5hbWUmJih3Lm5hbWU9Yi5uYW1lKTt2b2lkIDAhPT1iLm1hdHJpeD8ody5tYXRyaXguZnJvbUFycmF5KGIubWF0cml4KSx2b2lkIDAhPT1iLm1hdHJpeEF1dG9VcGRhdGUmJih3Lm1hdHJpeEF1dG9VcGRhdGU9Yi5tYXRyaXhBdXRvVXBkYXRlKSx3Lm1hdHJpeEF1dG9VcGRhdGUmJncubWF0cml4LmRlY29tcG9zZSh3LnBvc2l0aW9uLAp3LnF1YXRlcm5pb24sdy5zY2FsZSkpOih2b2lkIDAhPT1iLnBvc2l0aW9uJiZ3LnBvc2l0aW9uLmZyb21BcnJheShiLnBvc2l0aW9uKSx2b2lkIDAhPT1iLnJvdGF0aW9uJiZ3LnJvdGF0aW9uLmZyb21BcnJheShiLnJvdGF0aW9uKSx2b2lkIDAhPT1iLnF1YXRlcm5pb24mJncucXVhdGVybmlvbi5mcm9tQXJyYXkoYi5xdWF0ZXJuaW9uKSx2b2lkIDAhPT1iLnNjYWxlJiZ3LnNjYWxlLmZyb21BcnJheShiLnNjYWxlKSk7dm9pZCAwIT09Yi5jYXN0U2hhZG93JiYody5jYXN0U2hhZG93PWIuY2FzdFNoYWRvdyk7dm9pZCAwIT09Yi5yZWNlaXZlU2hhZG93JiYody5yZWNlaXZlU2hhZG93PWIucmVjZWl2ZVNoYWRvdyk7Yi5zaGFkb3cmJih2b2lkIDAhPT1iLnNoYWRvdy5iaWFzJiYody5zaGFkb3cuYmlhcz1iLnNoYWRvdy5iaWFzKSx2b2lkIDAhPT1iLnNoYWRvdy5yYWRpdXMmJih3LnNoYWRvdy5yYWRpdXM9Yi5zaGFkb3cucmFkaXVzKSx2b2lkIDAhPT1iLnNoYWRvdy5tYXBTaXplJiYKdy5zaGFkb3cubWFwU2l6ZS5mcm9tQXJyYXkoYi5zaGFkb3cubWFwU2l6ZSksdm9pZCAwIT09Yi5zaGFkb3cuY2FtZXJhJiYody5zaGFkb3cuY2FtZXJhPXRoaXMucGFyc2VPYmplY3QoYi5zaGFkb3cuY2FtZXJhKSkpO3ZvaWQgMCE9PWIudmlzaWJsZSYmKHcudmlzaWJsZT1iLnZpc2libGUpO3ZvaWQgMCE9PWIuZnJ1c3R1bUN1bGxlZCYmKHcuZnJ1c3R1bUN1bGxlZD1iLmZydXN0dW1DdWxsZWQpO3ZvaWQgMCE9PWIucmVuZGVyT3JkZXImJih3LnJlbmRlck9yZGVyPWIucmVuZGVyT3JkZXIpO3ZvaWQgMCE9PWIudXNlckRhdGEmJih3LnVzZXJEYXRhPWIudXNlckRhdGEpO3ZvaWQgMCE9PWIubGF5ZXJzJiYody5sYXllcnMubWFzaz1iLmxheWVycyk7aWYodm9pZCAwIT09Yi5jaGlsZHJlbil7QT1iLmNoaWxkcmVuO2Zvcih2YXIgRT0wO0U8QS5sZW5ndGg7RSsrKXcuYWRkKHRoaXMucGFyc2VPYmplY3QoQVtFXSxlLGgpKX1pZigiTE9EIj09PWIudHlwZSlmb3IoYj1iLmxldmVscyxBPQowO0E8Yi5sZW5ndGg7QSsrKXtFPWJbQV07dmFyIEc9dy5nZXRPYmplY3RCeVByb3BlcnR5KCJ1dWlkIixFLm9iamVjdCk7dm9pZCAwIT09RyYmdy5hZGRMZXZlbChHLEUuZGlzdGFuY2UpfXJldHVybiB3fX0pO3ZhciBIcz17VVZNYXBwaW5nOjMwMCxDdWJlUmVmbGVjdGlvbk1hcHBpbmc6MzAxLEN1YmVSZWZyYWN0aW9uTWFwcGluZzozMDIsRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc6MzAzLEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOjMwNCxTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZzozMDUsQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc6MzA2LEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOjMwN30sQm89e1JlcGVhdFdyYXBwaW5nOjFFMyxDbGFtcFRvRWRnZVdyYXBwaW5nOjEwMDEsTWlycm9yZWRSZXBlYXRXcmFwcGluZzoxMDAyfSxDbz17TmVhcmVzdEZpbHRlcjoxMDAzLE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyOjEwMDQsTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcjoxMDA1LApMaW5lYXJGaWx0ZXI6MTAwNixMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyOjEwMDcsTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyOjEwMDh9O0lrLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoS2IucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6SWssc2V0T3B0aW9uczpmdW5jdGlvbihiKXt0aGlzLm9wdGlvbnM9YjtyZXR1cm4gdGhpc30sbG9hZDpmdW5jdGlvbihiLGUsaCxtKXt2b2lkIDA9PT1iJiYoYj0iIik7dm9pZCAwIT09dGhpcy5wYXRoJiYoYj10aGlzLnBhdGgrYik7Yj10aGlzLm1hbmFnZXIucmVzb2x2ZVVSTChiKTt2YXIgdT10aGlzLHc9Z2YuZ2V0KGIpO2lmKHZvaWQgMCE9PXcpcmV0dXJuIHUubWFuYWdlci5pdGVtU3RhcnQoYiksc2V0VGltZW91dChmdW5jdGlvbigpe2UmJmUodyk7dS5tYW5hZ2VyLml0ZW1FbmQoYil9LDApLHc7ZmV0Y2goYikudGhlbihmdW5jdGlvbihBKXtyZXR1cm4gQS5ibG9iKCl9KS50aGVuKGZ1bmN0aW9uKEEpe3JldHVybiB2b2lkIDA9PT0KdS5vcHRpb25zP2NyZWF0ZUltYWdlQml0bWFwKEEpOmNyZWF0ZUltYWdlQml0bWFwKEEsdS5vcHRpb25zKX0pLnRoZW4oZnVuY3Rpb24oQSl7Z2YuYWRkKGIsQSk7ZSYmZShBKTt1Lm1hbmFnZXIuaXRlbUVuZChiKX0pLmNhdGNoKGZ1bmN0aW9uKEEpe20mJm0oQSk7dS5tYW5hZ2VyLml0ZW1FcnJvcihiKTt1Lm1hbmFnZXIuaXRlbUVuZChiKX0pO3UubWFuYWdlci5pdGVtU3RhcnQoYil9fSk7T2JqZWN0LmFzc2lnbihKay5wcm90b3R5cGUse21vdmVUbzpmdW5jdGlvbihiLGUpe3RoaXMuY3VycmVudFBhdGg9bmV3IGlkO3RoaXMuc3ViUGF0aHMucHVzaCh0aGlzLmN1cnJlbnRQYXRoKTt0aGlzLmN1cnJlbnRQYXRoLm1vdmVUbyhiLGUpfSxsaW5lVG86ZnVuY3Rpb24oYixlKXt0aGlzLmN1cnJlbnRQYXRoLmxpbmVUbyhiLGUpfSxxdWFkcmF0aWNDdXJ2ZVRvOmZ1bmN0aW9uKGIsZSxoLG0pe3RoaXMuY3VycmVudFBhdGgucXVhZHJhdGljQ3VydmVUbyhiLGUsaCxtKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbihiLAplLGgsbSx1LHcpe3RoaXMuY3VycmVudFBhdGguYmV6aWVyQ3VydmVUbyhiLGUsaCxtLHUsdyl9LHNwbGluZVRocnU6ZnVuY3Rpb24oYil7dGhpcy5jdXJyZW50UGF0aC5zcGxpbmVUaHJ1KGIpfSx0b1NoYXBlczpmdW5jdGlvbihiLGUpe2Z1bmN0aW9uIGgoaGEpe2Zvcih2YXIgc2E9W10scWE9MCxyYT1oYS5sZW5ndGg7cWE8cmE7cWErKyl7dmFyIHdhPWhhW3FhXSxwYT1uZXcgdGU7cGEuY3VydmVzPXdhLmN1cnZlcztzYS5wdXNoKHBhKX1yZXR1cm4gc2F9ZnVuY3Rpb24gbShoYSxzYSl7Zm9yKHZhciBxYT1zYS5sZW5ndGgscmE9ITEsd2E9cWEtMSxwYT0wO3BhPHFhO3dhPXBhKyspe3ZhciB2YT1zYVt3YV0sQ2E9c2FbcGFdLFZhPUNhLngtdmEueCxXYT1DYS55LXZhLnk7aWYoTWF0aC5hYnMoV2EpPk51bWJlci5FUFNJTE9OKXtpZigwPldhJiYodmE9c2FbcGFdLFZhPS1WYSxDYT1zYVt3YV0sV2E9LVdhKSwhKGhhLnk8dmEueXx8aGEueT5DYS55KSlpZihoYS55PT09dmEueSl7aWYoaGEueD09PQp2YS54KXJldHVybiEwfWVsc2V7d2E9V2EqKGhhLngtdmEueCktVmEqKGhhLnktdmEueSk7aWYoMD09PXdhKXJldHVybiEwOzA+d2F8fChyYT0hcmEpfX1lbHNlIGlmKGhhLnk9PT12YS55JiYoQ2EueDw9aGEueCYmaGEueDw9dmEueHx8dmEueDw9aGEueCYmaGEueDw9Q2EueCkpcmV0dXJuITB9cmV0dXJuIHJhfXZhciB1PU9kLmlzQ2xvY2tXaXNlLHc9dGhpcy5zdWJQYXRocztpZigwPT09dy5sZW5ndGgpcmV0dXJuW107aWYoITA9PT1lKXJldHVybiBoKHcpO2U9W107aWYoMT09PXcubGVuZ3RoKXt2YXIgQT13WzBdO3ZhciBFPW5ldyB0ZTtFLmN1cnZlcz1BLmN1cnZlcztlLnB1c2goRSk7cmV0dXJuIGV9dmFyIEc9IXUod1swXS5nZXRQb2ludHMoKSk7Rz1iPyFHOkc7RT1bXTt2YXIgSj1bXSxRPVtdLFM9MDtKW1NdPXZvaWQgMDtRW1NdPVtdO2Zvcih2YXIgVD0wLFc9dy5sZW5ndGg7VDxXO1QrKyl7QT13W1RdO3ZhciBYPUEuZ2V0UG9pbnRzKCk7dmFyIGlhPXUoWCk7KGlhPWI/IWlhOgppYSk/KCFHJiZKW1NdJiZTKyssSltTXT17czpuZXcgdGUscDpYfSxKW1NdLnMuY3VydmVzPUEuY3VydmVzLEcmJlMrKyxRW1NdPVtdKTpRW1NdLnB1c2goe2g6QSxwOlhbMF19KX1pZighSlswXSlyZXR1cm4gaCh3KTtpZigxPEoubGVuZ3RoKXtUPSExO2I9W107dT0wO2Zvcih3PUoubGVuZ3RoO3U8dzt1KyspRVt1XT1bXTt1PTA7Zm9yKHc9Si5sZW5ndGg7dTx3O3UrKylmb3IoQT1RW3VdLGlhPTA7aWE8QS5sZW5ndGg7aWErKyl7Rz1BW2lhXTtTPSEwO2ZvcihYPTA7WDxKLmxlbmd0aDtYKyspbShHLnAsSltYXS5wKSYmKHUhPT1YJiZiLnB1c2goe2Zyb21zOnUsdG9zOlgsaG9sZTppYX0pLFM/KFM9ITEsRVtYXS5wdXNoKEcpKTpUPSEwKTtTJiZFW3VdLnB1c2goRyl9MDxiLmxlbmd0aCYmKFR8fChRPUUpKX1UPTA7Zm9yKHU9Si5sZW5ndGg7VDx1O1QrKylmb3IoRT1KW1RdLnMsZS5wdXNoKEUpLGI9UVtUXSx3PTAsQT1iLmxlbmd0aDt3PEE7dysrKUUuaG9sZXMucHVzaChiW3ddLmgpOwpyZXR1cm4gZX19KTtPYmplY3QuYXNzaWduKEtrLnByb3RvdHlwZSx7aXNGb250OiEwLGdlbmVyYXRlU2hhcGVzOmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGU9MTAwKTt2YXIgaD1bXTtiPXJzKGIsZSx0aGlzLmRhdGEpO2U9MDtmb3IodmFyIG09Yi5sZW5ndGg7ZTxtO2UrKylBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShoLGJbZV0udG9TaGFwZXMoKSk7cmV0dXJuIGh9fSk7TGsucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShLYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpMayxsb2FkOmZ1bmN0aW9uKGIsZSxoLG0pe3ZhciB1PXRoaXMsdz1uZXcgU2ModGhpcy5tYW5hZ2VyKTt3LnNldFBhdGgodGhpcy5wYXRoKTt3LmxvYWQoYixmdW5jdGlvbihBKXt0cnl7dmFyIEU9SlNPTi5wYXJzZShBKX1jYXRjaChHKXtjb25zb2xlLndhcm4oIlRIUkVFLkZvbnRMb2FkZXI6IHR5cGVmYWNlLmpzIHN1cHBvcnQgaXMgYmVpbmcgZGVwcmVjYXRlZC4gVXNlIHR5cGVmYWNlLmpzb24gaW5zdGVhZC4iKSwKRT1KU09OLnBhcnNlKEEuc3Vic3RyaW5nKDY1LEEubGVuZ3RoLTIpKX1BPXUucGFyc2UoRSk7ZSYmZShBKX0saCxtKX0scGFyc2U6ZnVuY3Rpb24oYil7cmV0dXJuIG5ldyBLayhiKX19KTt2YXIgdmosUWs9e2dldENvbnRleHQ6ZnVuY3Rpb24oKXt2b2lkIDA9PT12aiYmKHZqPW5ldyAod2luZG93LkF1ZGlvQ29udGV4dHx8d2luZG93LndlYmtpdEF1ZGlvQ29udGV4dCkpO3JldHVybiB2an0sc2V0Q29udGV4dDpmdW5jdGlvbihiKXt2aj1ifX07WGkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShLYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpYaSxsb2FkOmZ1bmN0aW9uKGIsZSxoLG0pe3ZhciB1PW5ldyBTYyh0aGlzLm1hbmFnZXIpO3Uuc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpO3Uuc2V0UGF0aCh0aGlzLnBhdGgpO3UubG9hZChiLGZ1bmN0aW9uKHcpe3c9dy5zbGljZSgwKTtRay5nZXRDb250ZXh0KCkuZGVjb2RlQXVkaW9EYXRhKHcsZnVuY3Rpb24oQSl7ZShBKX0pfSwKaCxtKX19KTtPYmplY3QuYXNzaWduKFlpLnByb3RvdHlwZSx7aXNTcGhlcmljYWxIYXJtb25pY3MzOiEwLHNldDpmdW5jdGlvbihiKXtmb3IodmFyIGU9MDs5PmU7ZSsrKXRoaXMuY29lZmZpY2llbnRzW2VdLmNvcHkoYltlXSk7cmV0dXJuIHRoaXN9LHplcm86ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDs5PmI7YisrKXRoaXMuY29lZmZpY2llbnRzW2JdLnNldCgwLDAsMCk7cmV0dXJuIHRoaXN9LGdldEF0OmZ1bmN0aW9uKGIsZSl7dmFyIGg9Yi54LG09Yi55O2I9Yi56O3ZhciB1PXRoaXMuY29lZmZpY2llbnRzO2UuY29weSh1WzBdKS5tdWx0aXBseVNjYWxhciguMjgyMDk1KTtlLmFkZFNjYWxlKHVbMV0sLjQ4ODYwMyptKTtlLmFkZFNjYWxlKHVbMl0sLjQ4ODYwMypiKTtlLmFkZFNjYWxlKHVbM10sLjQ4ODYwMypoKTtlLmFkZFNjYWxlKHVbNF0sMS4wOTI1NDgqaCptKTtlLmFkZFNjYWxlKHVbNV0sMS4wOTI1NDgqbSpiKTtlLmFkZFNjYWxlKHVbNl0sLjMxNTM5MiooMypiKmItMSkpOwplLmFkZFNjYWxlKHVbN10sMS4wOTI1NDgqaCpiKTtlLmFkZFNjYWxlKHVbOF0sLjU0NjI3NCooaCpoLW0qbSkpO3JldHVybiBlfSxnZXRJcnJhZGlhbmNlQXQ6ZnVuY3Rpb24oYixlKXt2YXIgaD1iLngsbT1iLnk7Yj1iLno7dmFyIHU9dGhpcy5jb2VmZmljaWVudHM7ZS5jb3B5KHVbMF0pLm11bHRpcGx5U2NhbGFyKC44ODYyMjcpO2UuYWRkU2NhbGUodVsxXSwxLjAyMzMyOCptKTtlLmFkZFNjYWxlKHVbMl0sMS4wMjMzMjgqYik7ZS5hZGRTY2FsZSh1WzNdLDEuMDIzMzI4KmgpO2UuYWRkU2NhbGUodVs0XSwuODU4MDg2KmgqbSk7ZS5hZGRTY2FsZSh1WzVdLC44NTgwODYqbSpiKTtlLmFkZFNjYWxlKHVbNl0sLjc0MzEyNSpiKmItLjI0NzcwOCk7ZS5hZGRTY2FsZSh1WzddLC44NTgwODYqaCpiKTtlLmFkZFNjYWxlKHVbOF0sLjQyOTA0MyooaCpoLW0qbSkpO3JldHVybiBlfSxhZGQ6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPTA7OT5lO2UrKyl0aGlzLmNvZWZmaWNpZW50c1tlXS5hZGQoYi5jb2VmZmljaWVudHNbZV0pOwpyZXR1cm4gdGhpc30sc2NhbGU6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPTA7OT5lO2UrKyl0aGlzLmNvZWZmaWNpZW50c1tlXS5tdWx0aXBseVNjYWxhcihiKTtyZXR1cm4gdGhpc30sbGVycDpmdW5jdGlvbihiLGUpe2Zvcih2YXIgaD0wOzk+aDtoKyspdGhpcy5jb2VmZmljaWVudHNbaF0ubGVycChiLmNvZWZmaWNpZW50c1toXSxlKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZT0wOzk+ZTtlKyspaWYoIXRoaXMuY29lZmZpY2llbnRzW2VdLmVxdWFscyhiLmNvZWZmaWNpZW50c1tlXSkpcmV0dXJuITE7cmV0dXJuITB9LGNvcHk6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuc2V0KGIuY29lZmZpY2llbnRzKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGZyb21BcnJheTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihlPTApO2Zvcih2YXIgaD10aGlzLmNvZWZmaWNpZW50cyxtPTA7OT5tO20rKyloW21dLmZyb21BcnJheShiLAplKzMqbSk7cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1iJiYoYj1bXSk7dm9pZCAwPT09ZSYmKGU9MCk7Zm9yKHZhciBoPXRoaXMuY29lZmZpY2llbnRzLG09MDs5Pm07bSsrKWhbbV0udG9BcnJheShiLGUrMyptKTtyZXR1cm4gYn19KTtPYmplY3QuYXNzaWduKFlpLHtnZXRCYXNpc0F0OmZ1bmN0aW9uKGIsZSl7dmFyIGg9Yi54LG09Yi55O2I9Yi56O2VbMF09LjI4MjA5NTtlWzFdPS40ODg2MDMqbTtlWzJdPS40ODg2MDMqYjtlWzNdPS40ODg2MDMqaDtlWzRdPTEuMDkyNTQ4KmgqbTtlWzVdPTEuMDkyNTQ4Km0qYjtlWzZdPS4zMTUzOTIqKDMqYipiLTEpO2VbN109MS4wOTI1NDgqaCpiO2VbOF09LjU0NjI3NCooaCpoLW0qbSl9fSk7amQucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShVYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpqZCxpc0xpZ2h0UHJvYmU6ITAsY29weTpmdW5jdGlvbihiKXtVYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsCmIpO3RoaXMuc2guY29weShiLnNoKTt0aGlzLmludGVuc2l0eT1iLmludGVuc2l0eTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKGIpe3JldHVybiBVYi5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxiKX19KTtNay5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGpkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOk1rLGlzSGVtaXNwaGVyZUxpZ2h0UHJvYmU6ITAsY29weTpmdW5jdGlvbihiKXtqZC5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihiKXtyZXR1cm4gamQucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsYil9fSk7TmsucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShqZC5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpOayxpc0FtYmllbnRMaWdodFByb2JlOiEwLGNvcHk6ZnVuY3Rpb24oYil7amQucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYil7cmV0dXJuIGpkLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLApiKX19KTt2YXIgRG89bmV3IHIsRW89bmV3IHI7T2JqZWN0LmFzc2lnbihabi5wcm90b3R5cGUse3VwZGF0ZTpmdW5jdGlvbihiKXt2YXIgZT10aGlzLl9jYWNoZTtpZihlLmZvY3VzIT09Yi5mb2N1c3x8ZS5mb3YhPT1iLmZvdnx8ZS5hc3BlY3QhPT1iLmFzcGVjdCp0aGlzLmFzcGVjdHx8ZS5uZWFyIT09Yi5uZWFyfHxlLmZhciE9PWIuZmFyfHxlLnpvb20hPT1iLnpvb218fGUuZXllU2VwIT09dGhpcy5leWVTZXApe2UuZm9jdXM9Yi5mb2N1cztlLmZvdj1iLmZvdjtlLmFzcGVjdD1iLmFzcGVjdCp0aGlzLmFzcGVjdDtlLm5lYXI9Yi5uZWFyO2UuZmFyPWIuZmFyO2Uuem9vbT1iLnpvb207ZS5leWVTZXA9dGhpcy5leWVTZXA7dmFyIGg9Yi5wcm9qZWN0aW9uTWF0cml4LmNsb25lKCksbT1lLmV5ZVNlcC8yLHU9bSplLm5lYXIvZS5mb2N1cyx3PWUubmVhcipNYXRoLnRhbihsYi5ERUcyUkFEKmUuZm92Ki41KS9lLnpvb207RW8uZWxlbWVudHNbMTJdPS1tO0RvLmVsZW1lbnRzWzEyXT0KbTttPS13KmUuYXNwZWN0K3U7dmFyIEE9dyplLmFzcGVjdCt1O2guZWxlbWVudHNbMF09MiplLm5lYXIvKEEtbSk7aC5lbGVtZW50c1s4XT0oQSttKS8oQS1tKTt0aGlzLmNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5jb3B5KGgpO209LXcqZS5hc3BlY3QtdTtBPXcqZS5hc3BlY3QtdTtoLmVsZW1lbnRzWzBdPTIqZS5uZWFyLyhBLW0pO2guZWxlbWVudHNbOF09KEErbSkvKEEtbSk7dGhpcy5jYW1lcmFSLnByb2plY3Rpb25NYXRyaXguY29weShoKX10aGlzLmNhbWVyYUwubWF0cml4V29ybGQuY29weShiLm1hdHJpeFdvcmxkKS5tdWx0aXBseShFbyk7dGhpcy5jYW1lcmFSLm1hdHJpeFdvcmxkLmNvcHkoYi5tYXRyaXhXb3JsZCkubXVsdGlwbHkoRG8pfX0pO09iamVjdC5hc3NpZ24oT2sucHJvdG90eXBlLHtzdGFydDpmdW5jdGlvbigpe3RoaXMub2xkVGltZT10aGlzLnN0YXJ0VGltZT0oInVuZGVmaW5lZCI9PT10eXBlb2YgcGVyZm9ybWFuY2U/RGF0ZTpwZXJmb3JtYW5jZSkubm93KCk7CnRoaXMuZWxhcHNlZFRpbWU9MDt0aGlzLnJ1bm5pbmc9ITB9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLmdldEVsYXBzZWRUaW1lKCk7dGhpcy5hdXRvU3RhcnQ9dGhpcy5ydW5uaW5nPSExfSxnZXRFbGFwc2VkVGltZTpmdW5jdGlvbigpe3RoaXMuZ2V0RGVsdGEoKTtyZXR1cm4gdGhpcy5lbGFwc2VkVGltZX0sZ2V0RGVsdGE6ZnVuY3Rpb24oKXt2YXIgYj0wO2lmKHRoaXMuYXV0b1N0YXJ0JiYhdGhpcy5ydW5uaW5nKXJldHVybiB0aGlzLnN0YXJ0KCksMDtpZih0aGlzLnJ1bm5pbmcpe3ZhciBlPSgidW5kZWZpbmVkIj09PXR5cGVvZiBwZXJmb3JtYW5jZT9EYXRlOnBlcmZvcm1hbmNlKS5ub3coKTtiPShlLXRoaXMub2xkVGltZSkvMUUzO3RoaXMub2xkVGltZT1lO3RoaXMuZWxhcHNlZFRpbWUrPWJ9cmV0dXJuIGJ9fSk7dmFyIGhmPW5ldyBnLEZvPW5ldyBmLElzPW5ldyBnLGpmPW5ldyBnO1BrLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoeS5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6UGssZ2V0SW5wdXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYWlufSxyZW1vdmVGaWx0ZXI6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5maWx0ZXImJih0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmZpbHRlciksdGhpcy5maWx0ZXIuZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiksdGhpcy5maWx0ZXI9bnVsbCk7cmV0dXJuIHRoaXN9LGdldEZpbHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbHRlcn0sc2V0RmlsdGVyOmZ1bmN0aW9uKGIpe251bGwhPT10aGlzLmZpbHRlcj8odGhpcy5nYWluLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXIpLHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSk6dGhpcy5nYWluLmRpc2Nvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKTt0aGlzLmZpbHRlcj1iO3RoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuZmlsdGVyKTsKdGhpcy5maWx0ZXIuY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pO3JldHVybiB0aGlzfSxnZXRNYXN0ZXJWb2x1bWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWV9LHNldE1hc3RlclZvbHVtZTpmdW5jdGlvbihiKXt0aGlzLmdhaW4uZ2Fpbi5zZXRUYXJnZXRBdFRpbWUoYix0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKTtyZXR1cm4gdGhpc30sdXBkYXRlTWF0cml4V29ybGQ6ZnVuY3Rpb24oYil7eS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCh0aGlzLGIpO2I9dGhpcy5jb250ZXh0Lmxpc3RlbmVyO3ZhciBlPXRoaXMudXA7dGhpcy50aW1lRGVsdGE9dGhpcy5fY2xvY2suZ2V0RGVsdGEoKTt0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShoZixGbyxJcyk7amYuc2V0KDAsMCwtMSkuYXBwbHlRdWF0ZXJuaW9uKEZvKTtpZihiLnBvc2l0aW9uWCl7dmFyIGg9dGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lK3RoaXMudGltZURlbHRhOwpiLnBvc2l0aW9uWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShoZi54LGgpO2IucG9zaXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGhmLnksaCk7Yi5wb3NpdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoaGYueixoKTtiLmZvcndhcmRYLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGpmLngsaCk7Yi5mb3J3YXJkWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShqZi55LGgpO2IuZm9yd2FyZFoubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoamYueixoKTtiLnVwWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShlLngsaCk7Yi51cFkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoZS55LGgpO2IudXBaLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGUueixoKX1lbHNlIGIuc2V0UG9zaXRpb24oaGYueCxoZi55LGhmLnopLGIuc2V0T3JpZW50YXRpb24oamYueCxqZi55LGpmLnosZS54LGUueSxlLnopfX0pO2dnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoeS5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6Z2csZ2V0T3V0cHV0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2Fpbn0sc2V0Tm9kZVNvdXJjZTpmdW5jdGlvbihiKXt0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMTt0aGlzLnNvdXJjZVR5cGU9ImF1ZGlvTm9kZSI7dGhpcy5zb3VyY2U9Yjt0aGlzLmNvbm5lY3QoKTtyZXR1cm4gdGhpc30sc2V0TWVkaWFFbGVtZW50U291cmNlOmZ1bmN0aW9uKGIpe3RoaXMuaGFzUGxheWJhY2tDb250cm9sPSExO3RoaXMuc291cmNlVHlwZT0ibWVkaWFOb2RlIjt0aGlzLnNvdXJjZT10aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFFbGVtZW50U291cmNlKGIpO3RoaXMuY29ubmVjdCgpO3JldHVybiB0aGlzfSxzZXRCdWZmZXI6ZnVuY3Rpb24oYil7dGhpcy5idWZmZXI9Yjt0aGlzLnNvdXJjZVR5cGU9ImJ1ZmZlciI7dGhpcy5hdXRvcGxheSYmdGhpcy5wbGF5KCk7cmV0dXJuIHRoaXN9LHBsYXk6ZnVuY3Rpb24oKXtpZighMD09PXRoaXMuaXNQbGF5aW5nKWNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IEF1ZGlvIGlzIGFscmVhZHkgcGxheWluZy4iKTsKZWxzZSBpZighMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKWNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7ZWxzZXt2YXIgYj10aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7Yi5idWZmZXI9dGhpcy5idWZmZXI7Yi5sb29wPXRoaXMubG9vcDtiLm9uZW5kZWQ9dGhpcy5vbkVuZGVkLmJpbmQodGhpcyk7dGhpcy5zdGFydFRpbWU9dGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lO2Iuc3RhcnQodGhpcy5zdGFydFRpbWUsdGhpcy5vZmZzZXQsdGhpcy5kdXJhdGlvbik7dGhpcy5pc1BsYXlpbmc9ITA7dGhpcy5zb3VyY2U9Yjt0aGlzLnNldERldHVuZSh0aGlzLmRldHVuZSk7dGhpcy5zZXRQbGF5YmFja1JhdGUodGhpcy5wbGF5YmFja1JhdGUpO3JldHVybiB0aGlzLmNvbm5lY3QoKX19LHBhdXNlOmZ1bmN0aW9uKCl7aWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpOwplbHNlIHJldHVybiEwPT09dGhpcy5pc1BsYXlpbmcmJih0aGlzLnNvdXJjZS5zdG9wKCksdGhpcy5zb3VyY2Uub25lbmRlZD1udWxsLHRoaXMub2Zmc2V0Kz0odGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLXRoaXMuc3RhcnRUaW1lKSp0aGlzLnBsYXliYWNrUmF0ZSx0aGlzLmlzUGxheWluZz0hMSksdGhpc30sc3RvcDpmdW5jdGlvbigpe2lmKCExPT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wpY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTtlbHNlIHJldHVybiB0aGlzLnNvdXJjZS5zdG9wKCksdGhpcy5zb3VyY2Uub25lbmRlZD1udWxsLHRoaXMub2Zmc2V0PTAsdGhpcy5pc1BsYXlpbmc9ITEsdGhpc30sY29ubmVjdDpmdW5jdGlvbigpe2lmKDA8dGhpcy5maWx0ZXJzLmxlbmd0aCl7dGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pO2Zvcih2YXIgYj0xLGU9dGhpcy5maWx0ZXJzLmxlbmd0aDtiPGU7YisrKXRoaXMuZmlsdGVyc1tiLQoxXS5jb25uZWN0KHRoaXMuZmlsdGVyc1tiXSk7dGhpcy5maWx0ZXJzW3RoaXMuZmlsdGVycy5sZW5ndGgtMV0uY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKX1lbHNlIHRoaXMuc291cmNlLmNvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSk7cmV0dXJuIHRoaXN9LGRpc2Nvbm5lY3Q6ZnVuY3Rpb24oKXtpZigwPHRoaXMuZmlsdGVycy5sZW5ndGgpe3RoaXMuc291cmNlLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXJzWzBdKTtmb3IodmFyIGI9MSxlPXRoaXMuZmlsdGVycy5sZW5ndGg7YjxlO2IrKyl0aGlzLmZpbHRlcnNbYi0xXS5kaXNjb25uZWN0KHRoaXMuZmlsdGVyc1tiXSk7dGhpcy5maWx0ZXJzW3RoaXMuZmlsdGVycy5sZW5ndGgtMV0uZGlzY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKX1lbHNlIHRoaXMuc291cmNlLmRpc2Nvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSk7cmV0dXJuIHRoaXN9LGdldEZpbHRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWx0ZXJzfSxzZXRGaWx0ZXJzOmZ1bmN0aW9uKGIpe2J8fAooYj1bXSk7ITA9PT10aGlzLmlzUGxheWluZz8odGhpcy5kaXNjb25uZWN0KCksdGhpcy5maWx0ZXJzPWIsdGhpcy5jb25uZWN0KCkpOnRoaXMuZmlsdGVycz1iO3JldHVybiB0aGlzfSxzZXREZXR1bmU6ZnVuY3Rpb24oYil7dGhpcy5kZXR1bmU9YjtpZih2b2lkIDAhPT10aGlzLnNvdXJjZS5kZXR1bmUpcmV0dXJuITA9PT10aGlzLmlzUGxheWluZyYmdGhpcy5zb3VyY2UuZGV0dW5lLnNldFRhcmdldEF0VGltZSh0aGlzLmRldHVuZSx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKSx0aGlzfSxnZXREZXR1bmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZXR1bmV9LGdldEZpbHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEZpbHRlcnMoKVswXX0sc2V0RmlsdGVyOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnNldEZpbHRlcnMoYj9bYl06W10pfSxzZXRQbGF5YmFja1JhdGU6ZnVuY3Rpb24oYil7aWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpOwplbHNlIHJldHVybiB0aGlzLnBsYXliYWNrUmF0ZT1iLCEwPT09dGhpcy5pc1BsYXlpbmcmJnRoaXMuc291cmNlLnBsYXliYWNrUmF0ZS5zZXRUYXJnZXRBdFRpbWUodGhpcy5wbGF5YmFja1JhdGUsdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLC4wMSksdGhpc30sZ2V0UGxheWJhY2tSYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWJhY2tSYXRlfSxvbkVuZGVkOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITF9LGdldExvb3A6ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sPyhjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpLCExKTp0aGlzLmxvb3B9LHNldExvb3A6ZnVuY3Rpb24oYil7aWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO2Vsc2UgcmV0dXJuIHRoaXMubG9vcD0KYiwhMD09PXRoaXMuaXNQbGF5aW5nJiYodGhpcy5zb3VyY2UubG9vcD10aGlzLmxvb3ApLHRoaXN9LGdldFZvbHVtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZX0sc2V0Vm9sdW1lOmZ1bmN0aW9uKGIpe3RoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZShiLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpO3JldHVybiB0aGlzfX0pO3ZhciBrZj1uZXcgZyxHbz1uZXcgZixKcz1uZXcgZyxsZj1uZXcgZztSay5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGdnLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlJrLGdldE91dHB1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhbm5lcn0sZ2V0UmVmRGlzdGFuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYW5uZXIucmVmRGlzdGFuY2V9LHNldFJlZkRpc3RhbmNlOmZ1bmN0aW9uKGIpe3RoaXMucGFubmVyLnJlZkRpc3RhbmNlPWI7cmV0dXJuIHRoaXN9LGdldFJvbGxvZmZGYWN0b3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYW5uZXIucm9sbG9mZkZhY3Rvcn0sCnNldFJvbGxvZmZGYWN0b3I6ZnVuY3Rpb24oYil7dGhpcy5wYW5uZXIucm9sbG9mZkZhY3Rvcj1iO3JldHVybiB0aGlzfSxnZXREaXN0YW5jZU1vZGVsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFubmVyLmRpc3RhbmNlTW9kZWx9LHNldERpc3RhbmNlTW9kZWw6ZnVuY3Rpb24oYil7dGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbD1iO3JldHVybiB0aGlzfSxnZXRNYXhEaXN0YW5jZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhbm5lci5tYXhEaXN0YW5jZX0sc2V0TWF4RGlzdGFuY2U6ZnVuY3Rpb24oYil7dGhpcy5wYW5uZXIubWF4RGlzdGFuY2U9YjtyZXR1cm4gdGhpc30sc2V0RGlyZWN0aW9uYWxDb25lOmZ1bmN0aW9uKGIsZSxoKXt0aGlzLnBhbm5lci5jb25lSW5uZXJBbmdsZT1iO3RoaXMucGFubmVyLmNvbmVPdXRlckFuZ2xlPWU7dGhpcy5wYW5uZXIuY29uZU91dGVyR2Fpbj1oO3JldHVybiB0aGlzfSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihiKXt5LnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsCmIpO2lmKCEwIT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2x8fCExIT09dGhpcy5pc1BsYXlpbmcpaWYodGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2Uoa2YsR28sSnMpLGxmLnNldCgwLDAsMSkuYXBwbHlRdWF0ZXJuaW9uKEdvKSxiPXRoaXMucGFubmVyLGIucG9zaXRpb25YKXt2YXIgZT10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdGhpcy5saXN0ZW5lci50aW1lRGVsdGE7Yi5wb3NpdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoa2YueCxlKTtiLnBvc2l0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShrZi55LGUpO2IucG9zaXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGtmLnosZSk7Yi5vcmllbnRhdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobGYueCxlKTtiLm9yaWVudGF0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShsZi55LGUpO2Iub3JpZW50YXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGxmLnosZSl9ZWxzZSBiLnNldFBvc2l0aW9uKGtmLngsCmtmLnksa2YueiksYi5zZXRPcmllbnRhdGlvbihsZi54LGxmLnksbGYueil9fSk7T2JqZWN0LmFzc2lnbihTay5wcm90b3R5cGUse2dldEZyZXF1ZW5jeURhdGE6ZnVuY3Rpb24oKXt0aGlzLmFuYWx5c2VyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKHRoaXMuZGF0YSk7cmV0dXJuIHRoaXMuZGF0YX0sZ2V0QXZlcmFnZUZyZXF1ZW5jeTpmdW5jdGlvbigpe2Zvcih2YXIgYj0wLGU9dGhpcy5nZXRGcmVxdWVuY3lEYXRhKCksaD0wO2g8ZS5sZW5ndGg7aCsrKWIrPWVbaF07cmV0dXJuIGIvZS5sZW5ndGh9fSk7T2JqZWN0LmFzc2lnbihUay5wcm90b3R5cGUse2FjY3VtdWxhdGU6ZnVuY3Rpb24oYixlKXt2YXIgaD10aGlzLmJ1ZmZlcixtPXRoaXMudmFsdWVTaXplO2I9YiptK207dmFyIHU9dGhpcy5jdW11bGF0aXZlV2VpZ2h0O2lmKDA9PT11KXtmb3IodT0wO3UhPT1tOysrdSloW2IrdV09aFt1XTt1PWV9ZWxzZSB1Kz1lLHRoaXMuX21peEJ1ZmZlclJlZ2lvbihoLGIsMCxlL3UsbSk7dGhpcy5jdW11bGF0aXZlV2VpZ2h0PQp1fSxhcHBseTpmdW5jdGlvbihiKXt2YXIgZT10aGlzLnZhbHVlU2l6ZSxoPXRoaXMuYnVmZmVyO2I9YiplK2U7dmFyIG09dGhpcy5jdW11bGF0aXZlV2VpZ2h0LHU9dGhpcy5iaW5kaW5nO3RoaXMuY3VtdWxhdGl2ZVdlaWdodD0wOzE+bSYmdGhpcy5fbWl4QnVmZmVyUmVnaW9uKGgsYiwzKmUsMS1tLGUpO209ZTtmb3IodmFyIHc9ZStlO20hPT13OysrbSlpZihoW21dIT09aFttK2VdKXt1LnNldFZhbHVlKGgsYik7YnJlYWt9fSxzYXZlT3JpZ2luYWxTdGF0ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuYnVmZmVyLGU9dGhpcy52YWx1ZVNpemUsaD0zKmU7dGhpcy5iaW5kaW5nLmdldFZhbHVlKGIsaCk7Zm9yKHZhciBtPWU7bSE9PWg7KyttKWJbbV09YltoK20lZV07dGhpcy5jdW11bGF0aXZlV2VpZ2h0PTB9LHJlc3RvcmVPcmlnaW5hbFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5iaW5kaW5nLnNldFZhbHVlKHRoaXMuYnVmZmVyLDMqdGhpcy52YWx1ZVNpemUpfSxfc2VsZWN0OmZ1bmN0aW9uKGIsCmUsaCxtLHUpe2lmKC41PD1tKWZvcihtPTA7bSE9PXU7KyttKWJbZSttXT1iW2grbV19LF9zbGVycDpmdW5jdGlvbihiLGUsaCxtKXtmLnNsZXJwRmxhdChiLGUsYixlLGIsaCxtKX0sX2xlcnA6ZnVuY3Rpb24oYixlLGgsbSx1KXtmb3IodmFyIHc9MS1tLEE9MDtBIT09dTsrK0Epe3ZhciBFPWUrQTtiW0VdPWJbRV0qdytiW2grQV0qbX19fSk7dmFyIEtzPS9bXFtcXVwuOlwvXS9nLExzPSJbXiIrIlxcW1xcXVxcLjpcXC8iLnJlcGxhY2UoIlxcLiIsIiIpKyJdIixNcz0vKCg/OldDK1tcLzpdKSopLy5zb3VyY2UucmVwbGFjZSgiV0MiLCJbXlxcW1xcXVxcLjpcXC9dIiksTnM9LyhXQ09EKyk/Ly5zb3VyY2UucmVwbGFjZSgiV0NPRCIsTHMpLE9zPS8oPzpcLihXQyspKD86XFsoLispXF0pPyk/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLCJbXlxcW1xcXVxcLjpcXC9dIiksUHM9L1wuKFdDKykoPzpcWyguKylcXSk/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLCJbXlxcW1xcXVxcLjpcXC9dIiksUXM9Cm5ldyBSZWdFeHAoIl4iK01zK05zK09zK1BzKyIkIiksUnM9WyJtYXRlcmlhbCIsIm1hdGVyaWFscyIsImJvbmVzIl07T2JqZWN0LmFzc2lnbigkbi5wcm90b3R5cGUse2dldFZhbHVlOmZ1bmN0aW9uKGIsZSl7dGhpcy5iaW5kKCk7dmFyIGg9dGhpcy5fYmluZGluZ3NbdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfXTt2b2lkIDAhPT1oJiZoLmdldFZhbHVlKGIsZSl9LHNldFZhbHVlOmZ1bmN0aW9uKGIsZSl7Zm9yKHZhciBoPXRoaXMuX2JpbmRpbmdzLG09dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLHU9aC5sZW5ndGg7bSE9PXU7KyttKWhbbV0uc2V0VmFsdWUoYixlKX0sYmluZDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLl9iaW5kaW5ncyxlPXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxoPWIubGVuZ3RoO2UhPT1oOysrZSliW2VdLmJpbmQoKX0sdW5iaW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuX2JpbmRpbmdzLGU9dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLApoPWIubGVuZ3RoO2UhPT1oOysrZSliW2VdLnVuYmluZCgpfX0pO09iamVjdC5hc3NpZ24odmMse0NvbXBvc2l0ZTokbixjcmVhdGU6ZnVuY3Rpb24oYixlLGgpe3JldHVybiBiJiZiLmlzQW5pbWF0aW9uT2JqZWN0R3JvdXA/bmV3IHZjLkNvbXBvc2l0ZShiLGUsaCk6bmV3IHZjKGIsZSxoKX0sc2FuaXRpemVOb2RlTmFtZTpmdW5jdGlvbihiKXtyZXR1cm4gYi5yZXBsYWNlKC9ccy9nLCJfIikucmVwbGFjZShLcywiIil9LHBhcnNlVHJhY2tOYW1lOmZ1bmN0aW9uKGIpe3ZhciBlPVFzLmV4ZWMoYik7aWYoIWUpdGhyb3cgRXJyb3IoIlByb3BlcnR5QmluZGluZzogQ2Fubm90IHBhcnNlIHRyYWNrTmFtZTogIitiKTtlPXtub2RlTmFtZTplWzJdLG9iamVjdE5hbWU6ZVszXSxvYmplY3RJbmRleDplWzRdLHByb3BlcnR5TmFtZTplWzVdLHByb3BlcnR5SW5kZXg6ZVs2XX07dmFyIGg9ZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS5sYXN0SW5kZXhPZigiLiIpO2lmKHZvaWQgMCE9PWgmJi0xIT09Cmgpe3ZhciBtPWUubm9kZU5hbWUuc3Vic3RyaW5nKGgrMSk7LTEhPT1Scy5pbmRleE9mKG0pJiYoZS5ub2RlTmFtZT1lLm5vZGVOYW1lLnN1YnN0cmluZygwLGgpLGUub2JqZWN0TmFtZT1tKX1pZihudWxsPT09ZS5wcm9wZXJ0eU5hbWV8fDA9PT1lLnByb3BlcnR5TmFtZS5sZW5ndGgpdGhyb3cgRXJyb3IoIlByb3BlcnR5QmluZGluZzogY2FuIG5vdCBwYXJzZSBwcm9wZXJ0eU5hbWUgZnJvbSB0cmFja05hbWU6ICIrYik7cmV0dXJuIGV9LGZpbmROb2RlOmZ1bmN0aW9uKGIsZSl7aWYoIWV8fCIiPT09ZXx8InJvb3QiPT09ZXx8Ii4iPT09ZXx8LTE9PT1lfHxlPT09Yi5uYW1lfHxlPT09Yi51dWlkKXJldHVybiBiO2lmKGIuc2tlbGV0b24pe3ZhciBoPWIuc2tlbGV0b24uZ2V0Qm9uZUJ5TmFtZShlKTtpZih2b2lkIDAhPT1oKXJldHVybiBofWlmKGIuY2hpbGRyZW4pe3ZhciBtPWZ1bmN0aW9uKHUpe2Zvcih2YXIgdz0wO3c8dS5sZW5ndGg7dysrKXt2YXIgQT11W3ddO2lmKEEubmFtZT09PQplfHxBLnV1aWQ9PT1lKXJldHVybiBBO2lmKEE9bShBLmNoaWxkcmVuKSlyZXR1cm4gQX1yZXR1cm4gbnVsbH07aWYoYj1tKGIuY2hpbGRyZW4pKXJldHVybiBifXJldHVybiBudWxsfX0pO09iamVjdC5hc3NpZ24odmMucHJvdG90eXBlLHtfZ2V0VmFsdWVfdW5hdmFpbGFibGU6ZnVuY3Rpb24oKXt9LF9zZXRWYWx1ZV91bmF2YWlsYWJsZTpmdW5jdGlvbigpe30sQmluZGluZ1R5cGU6e0RpcmVjdDowLEVudGlyZUFycmF5OjEsQXJyYXlFbGVtZW50OjIsSGFzRnJvbVRvQXJyYXk6M30sVmVyc2lvbmluZzp7Tm9uZTowLE5lZWRzVXBkYXRlOjEsTWF0cml4V29ybGROZWVkc1VwZGF0ZToyfSxHZXR0ZXJCeUJpbmRpbmdUeXBlOltmdW5jdGlvbihiLGUpe2JbZV09dGhpcy5ub2RlW3RoaXMucHJvcGVydHlOYW1lXX0sZnVuY3Rpb24oYixlKXtmb3IodmFyIGg9dGhpcy5yZXNvbHZlZFByb3BlcnR5LG09MCx1PWgubGVuZ3RoO20hPT11OysrbSliW2UrK109aFttXX0sZnVuY3Rpb24oYixlKXtiW2VdPQp0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XX0sZnVuY3Rpb24oYixlKXt0aGlzLnJlc29sdmVkUHJvcGVydHkudG9BcnJheShiLGUpfV0sU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmc6W1tmdW5jdGlvbihiLGUpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT1iW2VdfSxmdW5jdGlvbihiLGUpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT1iW2VdO3RoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfSxmdW5jdGlvbihiLGUpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT1iW2VdO3RoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9XSxbZnVuY3Rpb24oYixlKXtmb3IodmFyIGg9dGhpcy5yZXNvbHZlZFByb3BlcnR5LG09MCx1PWgubGVuZ3RoO20hPT11OysrbSloW21dPWJbZSsrXX0sZnVuY3Rpb24oYixlKXtmb3IodmFyIGg9dGhpcy5yZXNvbHZlZFByb3BlcnR5LAptPTAsdT1oLmxlbmd0aDttIT09dTsrK20paFttXT1iW2UrK107dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9LGZ1bmN0aW9uKGIsZSl7Zm9yKHZhciBoPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eSxtPTAsdT1oLmxlbmd0aDttIT09dTsrK20paFttXT1iW2UrK107dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1dLFtmdW5jdGlvbihiLGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdPWJbZV19LGZ1bmN0aW9uKGIsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5W3RoaXMucHJvcGVydHlJbmRleF09YltlXTt0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH0sZnVuY3Rpb24oYixlKXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT1iW2VdO3RoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9XSxbZnVuY3Rpb24oYixlKXt0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KGIsCmUpfSxmdW5jdGlvbihiLGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoYixlKTt0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH0sZnVuY3Rpb24oYixlKXt0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KGIsZSk7dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1dXSxnZXRWYWx1ZTpmdW5jdGlvbihiLGUpe3RoaXMuYmluZCgpO3RoaXMuZ2V0VmFsdWUoYixlKX0sc2V0VmFsdWU6ZnVuY3Rpb24oYixlKXt0aGlzLmJpbmQoKTt0aGlzLnNldFZhbHVlKGIsZSl9LGJpbmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5vZGUsZT10aGlzLnBhcnNlZFBhdGgsaD1lLm9iamVjdE5hbWUsbT1lLnByb3BlcnR5TmFtZSx1PWUucHJvcGVydHlJbmRleDtifHwodGhpcy5ub2RlPWI9dmMuZmluZE5vZGUodGhpcy5yb290Tm9kZSxlLm5vZGVOYW1lKXx8dGhpcy5yb290Tm9kZSk7dGhpcy5nZXRWYWx1ZT10aGlzLl9nZXRWYWx1ZV91bmF2YWlsYWJsZTsKdGhpcy5zZXRWYWx1ZT10aGlzLl9zZXRWYWx1ZV91bmF2YWlsYWJsZTtpZihiKXtpZihoKXt2YXIgdz1lLm9iamVjdEluZGV4O3N3aXRjaChoKXtjYXNlICJtYXRlcmlhbHMiOmlmKCFiLm1hdGVyaWFsKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbCBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbC4iLHRoaXMpO3JldHVybn1pZighYi5tYXRlcmlhbC5tYXRlcmlhbHMpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsLm1hdGVyaWFscyBhcyBub2RlLm1hdGVyaWFsIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbHMgYXJyYXkuIix0aGlzKTtyZXR1cm59Yj1iLm1hdGVyaWFsLm1hdGVyaWFsczticmVhaztjYXNlICJib25lcyI6aWYoIWIuc2tlbGV0b24pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIGJvbmVzIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIHNrZWxldG9uLiIsCnRoaXMpO3JldHVybn1iPWIuc2tlbGV0b24uYm9uZXM7Zm9yKGg9MDtoPGIubGVuZ3RoO2grKylpZihiW2hdLm5hbWU9PT13KXt3PWg7YnJlYWt9YnJlYWs7ZGVmYXVsdDppZih2b2lkIDA9PT1iW2hdKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBvYmplY3ROYW1lIG9mIG5vZGUgdW5kZWZpbmVkLiIsdGhpcyk7cmV0dXJufWI9YltoXX1pZih2b2lkIDAhPT13KXtpZih2b2lkIDA9PT1iW3ddKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byBiaW5kIHRvIG9iamVjdEluZGV4IG9mIG9iamVjdE5hbWUsIGJ1dCBpcyB1bmRlZmluZWQuIix0aGlzLGIpO3JldHVybn1iPWJbd119fXc9YlttXTtpZih2b2lkIDA9PT13KWNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIHVwZGF0ZSBwcm9wZXJ0eSBmb3IgdHJhY2s6ICIrZS5ub2RlTmFtZSsiLiIrbSsiIGJ1dCBpdCB3YXNuJ3QgZm91bmQuIiwKYik7ZWxzZXtlPXRoaXMuVmVyc2lvbmluZy5Ob25lO3RoaXMudGFyZ2V0T2JqZWN0PWI7dm9pZCAwIT09Yi5uZWVkc1VwZGF0ZT9lPXRoaXMuVmVyc2lvbmluZy5OZWVkc1VwZGF0ZTp2b2lkIDAhPT1iLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUmJihlPXRoaXMuVmVyc2lvbmluZy5NYXRyaXhXb3JsZE5lZWRzVXBkYXRlKTtoPXRoaXMuQmluZGluZ1R5cGUuRGlyZWN0O2lmKHZvaWQgMCE9PXUpe2lmKCJtb3JwaFRhcmdldEluZmx1ZW5jZXMiPT09bSl7aWYoIWIuZ2VvbWV0cnkpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5LiIsdGhpcyk7cmV0dXJufWlmKGIuZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSl7aWYoIWIuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuIiwKdGhpcyk7cmV0dXJufWZvcihoPTA7aDx0aGlzLm5vZGUuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aDtoKyspaWYoYi5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb25baF0ubmFtZT09PXUpe3U9aDticmVha319ZWxzZXtpZighYi5nZW9tZXRyeS5tb3JwaFRhcmdldHMpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy4iLHRoaXMpO3JldHVybn1mb3IoaD0wO2g8dGhpcy5ub2RlLmdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGg7aCsrKWlmKGIuZ2VvbWV0cnkubW9ycGhUYXJnZXRzW2hdLm5hbWU9PT11KXt1PWg7YnJlYWt9fX1oPXRoaXMuQmluZGluZ1R5cGUuQXJyYXlFbGVtZW50O3RoaXMucmVzb2x2ZWRQcm9wZXJ0eT13O3RoaXMucHJvcGVydHlJbmRleD11fWVsc2Ugdm9pZCAwIT09CncuZnJvbUFycmF5JiZ2b2lkIDAhPT13LnRvQXJyYXk/KGg9dGhpcy5CaW5kaW5nVHlwZS5IYXNGcm9tVG9BcnJheSx0aGlzLnJlc29sdmVkUHJvcGVydHk9dyk6QXJyYXkuaXNBcnJheSh3KT8oaD10aGlzLkJpbmRpbmdUeXBlLkVudGlyZUFycmF5LHRoaXMucmVzb2x2ZWRQcm9wZXJ0eT13KTp0aGlzLnByb3BlcnR5TmFtZT1tO3RoaXMuZ2V0VmFsdWU9dGhpcy5HZXR0ZXJCeUJpbmRpbmdUeXBlW2hdO3RoaXMuc2V0VmFsdWU9dGhpcy5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZ1toXVtlXX19ZWxzZSBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byB1cGRhdGUgbm9kZSBmb3IgdHJhY2s6ICIrdGhpcy5wYXRoKyIgYnV0IGl0IHdhc24ndCBmb3VuZC4iKX0sdW5iaW5kOmZ1bmN0aW9uKCl7dGhpcy5ub2RlPW51bGw7dGhpcy5nZXRWYWx1ZT10aGlzLl9nZXRWYWx1ZV91bmJvdW5kO3RoaXMuc2V0VmFsdWU9dGhpcy5fc2V0VmFsdWVfdW5ib3VuZH19KTsKT2JqZWN0LmFzc2lnbih2Yy5wcm90b3R5cGUse19nZXRWYWx1ZV91bmJvdW5kOnZjLnByb3RvdHlwZS5nZXRWYWx1ZSxfc2V0VmFsdWVfdW5ib3VuZDp2Yy5wcm90b3R5cGUuc2V0VmFsdWV9KTtPYmplY3QuYXNzaWduKGFvLnByb3RvdHlwZSx7aXNBbmltYXRpb25PYmplY3RHcm91cDohMCxhZGQ6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5fb2JqZWN0cyxlPWIubGVuZ3RoLGg9dGhpcy5uQ2FjaGVkT2JqZWN0c18sbT10aGlzLl9pbmRpY2VzQnlVVUlELHU9dGhpcy5fcGF0aHMsdz10aGlzLl9wYXJzZWRQYXRocyxBPXRoaXMuX2JpbmRpbmdzLEU9QS5sZW5ndGgsRz12b2lkIDAsSj0wLFE9YXJndW1lbnRzLmxlbmd0aDtKIT09UTsrK0ope3ZhciBTPWFyZ3VtZW50c1tKXSxUPVMudXVpZCxXPW1bVF07aWYodm9pZCAwPT09Vyl7Vz1lKys7bVtUXT1XO2IucHVzaChTKTtUPTA7Zm9yKHZhciBYPUU7VCE9PVg7KytUKUFbVF0ucHVzaChuZXcgdmMoUyx1W1RdLHdbVF0pKX1lbHNlIGlmKFc8Cmgpe0c9YltXXTt2YXIgaWE9LS1oO1g9YltpYV07bVtYLnV1aWRdPVc7YltXXT1YO21bVF09aWE7YltpYV09UztUPTA7Zm9yKFg9RTtUIT09WDsrK1Qpe3ZhciBoYT1BW1RdLHNhPWhhW1ddO2hhW1ddPWhhW2lhXTt2b2lkIDA9PT1zYSYmKHNhPW5ldyB2YyhTLHVbVF0sd1tUXSkpO2hhW2lhXT1zYX19ZWxzZSBiW1ddIT09RyYmY29uc29sZS5lcnJvcigiVEhSRUUuQW5pbWF0aW9uT2JqZWN0R3JvdXA6IERpZmZlcmVudCBvYmplY3RzIHdpdGggdGhlIHNhbWUgVVVJRCBkZXRlY3RlZC4gQ2xlYW4gdGhlIGNhY2hlcyBvciByZWNyZWF0ZSB5b3VyIGluZnJhc3RydWN0dXJlIHdoZW4gcmVsb2FkaW5nIHNjZW5lcy4iKX10aGlzLm5DYWNoZWRPYmplY3RzXz1ofSxyZW1vdmU6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5fb2JqZWN0cyxlPXRoaXMubkNhY2hlZE9iamVjdHNfLGg9dGhpcy5faW5kaWNlc0J5VVVJRCxtPXRoaXMuX2JpbmRpbmdzLHU9bS5sZW5ndGgsdz0wLEE9YXJndW1lbnRzLmxlbmd0aDt3IT09CkE7Kyt3KXt2YXIgRT1hcmd1bWVudHNbd10sRz1FLnV1aWQsSj1oW0ddO2lmKHZvaWQgMCE9PUomJko+PWUpe3ZhciBRPWUrKyxTPWJbUV07aFtTLnV1aWRdPUo7YltKXT1TO2hbR109UTtiW1FdPUU7RT0wO2ZvcihHPXU7RSE9PUc7KytFKXtTPW1bRV07dmFyIFQ9U1tKXTtTW0pdPVNbUV07U1tRXT1UfX19dGhpcy5uQ2FjaGVkT2JqZWN0c189ZX0sdW5jYWNoZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLl9vYmplY3RzLGU9Yi5sZW5ndGgsaD10aGlzLm5DYWNoZWRPYmplY3RzXyxtPXRoaXMuX2luZGljZXNCeVVVSUQsdT10aGlzLl9iaW5kaW5ncyx3PXUubGVuZ3RoLEE9MCxFPWFyZ3VtZW50cy5sZW5ndGg7QSE9PUU7KytBKXt2YXIgRz1hcmd1bWVudHNbQV0udXVpZCxKPW1bR107aWYodm9pZCAwIT09SilpZihkZWxldGUgbVtHXSxKPGgpe0c9LS1oO3ZhciBRPWJbR10sUz0tLWUsVD1iW1NdO21bUS51dWlkXT1KO2JbSl09UTttW1QudXVpZF09RztiW0ddPVQ7Yi5wb3AoKTtRPQowO2ZvcihUPXc7USE9PVQ7KytRKXt2YXIgVz11W1FdLFg9V1tTXTtXW0pdPVdbR107V1tHXT1YO1cucG9wKCl9fWVsc2UgZm9yKFM9LS1lLFQ9YltTXSxtW1QudXVpZF09SixiW0pdPVQsYi5wb3AoKSxRPTAsVD13O1EhPT1UOysrUSlXPXVbUV0sV1tKXT1XW1NdLFcucG9wKCl9dGhpcy5uQ2FjaGVkT2JqZWN0c189aH0sc3Vic2NyaWJlXzpmdW5jdGlvbihiLGUpe3ZhciBoPXRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCxtPWhbYl0sdT10aGlzLl9iaW5kaW5ncztpZih2b2lkIDAhPT1tKXJldHVybiB1W21dO3ZhciB3PXRoaXMuX3BhdGhzLEE9dGhpcy5fcGFyc2VkUGF0aHMsRT10aGlzLl9vYmplY3RzLEc9dGhpcy5uQ2FjaGVkT2JqZWN0c18sSj1BcnJheShFLmxlbmd0aCk7bT11Lmxlbmd0aDtoW2JdPW07dy5wdXNoKGIpO0EucHVzaChlKTt1LnB1c2goSik7aD1HO2ZvcihtPUUubGVuZ3RoO2ghPT1tOysraClKW2hdPW5ldyB2YyhFW2hdLGIsZSk7cmV0dXJuIEp9LHVuc3Vic2NyaWJlXzpmdW5jdGlvbihiKXt2YXIgZT0KdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLGg9ZVtiXTtpZih2b2lkIDAhPT1oKXt2YXIgbT10aGlzLl9wYXRocyx1PXRoaXMuX3BhcnNlZFBhdGhzLHc9dGhpcy5fYmluZGluZ3MsQT13Lmxlbmd0aC0xLEU9d1tBXTtlW2JbQV1dPWg7d1toXT1FO3cucG9wKCk7dVtoXT11W0FdO3UucG9wKCk7bVtoXT1tW0FdO20ucG9wKCl9fX0pO09iamVjdC5hc3NpZ24oYm8ucHJvdG90eXBlLHtwbGF5OmZ1bmN0aW9uKCl7dGhpcy5fbWl4ZXIuX2FjdGl2YXRlQWN0aW9uKHRoaXMpO3JldHVybiB0aGlzfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5fbWl4ZXIuX2RlYWN0aXZhdGVBY3Rpb24odGhpcyk7cmV0dXJuIHRoaXMucmVzZXQoKX0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlZD0hMTt0aGlzLmVuYWJsZWQ9ITA7dGhpcy50aW1lPTA7dGhpcy5fbG9vcENvdW50PS0xO3RoaXMuX3N0YXJ0VGltZT1udWxsO3JldHVybiB0aGlzLnN0b3BGYWRpbmcoKS5zdG9wV2FycGluZygpfSxpc1J1bm5pbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmFibGVkJiYKIXRoaXMucGF1c2VkJiYwIT09dGhpcy50aW1lU2NhbGUmJm51bGw9PT10aGlzLl9zdGFydFRpbWUmJnRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbih0aGlzKX0saXNTY2hlZHVsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKHRoaXMpfSxzdGFydEF0OmZ1bmN0aW9uKGIpe3RoaXMuX3N0YXJ0VGltZT1iO3JldHVybiB0aGlzfSxzZXRMb29wOmZ1bmN0aW9uKGIsZSl7dGhpcy5sb29wPWI7dGhpcy5yZXBldGl0aW9ucz1lO3JldHVybiB0aGlzfSxzZXRFZmZlY3RpdmVXZWlnaHQ6ZnVuY3Rpb24oYil7dGhpcy53ZWlnaHQ9Yjt0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9dGhpcy5lbmFibGVkP2I6MDtyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCl9LGdldEVmZmVjdGl2ZVdlaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZmZlY3RpdmVXZWlnaHR9LGZhZGVJbjpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcoYiwwLDEpfSxmYWRlT3V0OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyhiLAoxLDApfSxjcm9zc0ZhZGVGcm9tOmZ1bmN0aW9uKGIsZSxoKXtiLmZhZGVPdXQoZSk7dGhpcy5mYWRlSW4oZSk7aWYoaCl7aD10aGlzLl9jbGlwLmR1cmF0aW9uO3ZhciBtPWIuX2NsaXAuZHVyYXRpb24sdT1oL207Yi53YXJwKDEsbS9oLGUpO3RoaXMud2FycCh1LDEsZSl9cmV0dXJuIHRoaXN9LGNyb3NzRmFkZVRvOmZ1bmN0aW9uKGIsZSxoKXtyZXR1cm4gYi5jcm9zc0ZhZGVGcm9tKHRoaXMsZSxoKX0sc3RvcEZhZGluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX3dlaWdodEludGVycG9sYW50O251bGwhPT1iJiYodGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9bnVsbCx0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoYikpO3JldHVybiB0aGlzfSxzZXRFZmZlY3RpdmVUaW1lU2NhbGU6ZnVuY3Rpb24oYil7dGhpcy50aW1lU2NhbGU9Yjt0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU9dGhpcy5wYXVzZWQ/MDpiO3JldHVybiB0aGlzLnN0b3BXYXJwaW5nKCl9LGdldEVmZmVjdGl2ZVRpbWVTY2FsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGV9LApzZXREdXJhdGlvbjpmdW5jdGlvbihiKXt0aGlzLnRpbWVTY2FsZT10aGlzLl9jbGlwLmR1cmF0aW9uL2I7cmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKX0sc3luY1dpdGg6ZnVuY3Rpb24oYil7dGhpcy50aW1lPWIudGltZTt0aGlzLnRpbWVTY2FsZT1iLnRpbWVTY2FsZTtyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpfSxoYWx0OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLndhcnAodGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlLDAsYil9LHdhcnA6ZnVuY3Rpb24oYixlLGgpe3ZhciBtPXRoaXMuX21peGVyLHU9bS50aW1lLHc9dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQsQT10aGlzLnRpbWVTY2FsZTtudWxsPT09dyYmKHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PXc9bS5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpKTttPXcucGFyYW1ldGVyUG9zaXRpb25zO3c9dy5zYW1wbGVWYWx1ZXM7bVswXT11O21bMV09dStoO3dbMF09Yi9BO3dbMV09ZS9BO3JldHVybiB0aGlzfSxzdG9wV2FycGluZzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtudWxsIT09YiYmKHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PW51bGwsdGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KGIpKTtyZXR1cm4gdGhpc30sZ2V0TWl4ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWl4ZXJ9LGdldENsaXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2xpcH0sZ2V0Um9vdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb2NhbFJvb3R8fHRoaXMuX21peGVyLl9yb290fSxfdXBkYXRlOmZ1bmN0aW9uKGIsZSxoLG0pe2lmKHRoaXMuZW5hYmxlZCl7dmFyIHU9dGhpcy5fc3RhcnRUaW1lO2lmKG51bGwhPT11KXtlPShiLXUpKmg7aWYoMD5lfHwwPT09aClyZXR1cm47dGhpcy5fc3RhcnRUaW1lPW51bGw7ZSo9aH1lKj10aGlzLl91cGRhdGVUaW1lU2NhbGUoYik7aD10aGlzLl91cGRhdGVUaW1lKGUpO2I9dGhpcy5fdXBkYXRlV2VpZ2h0KGIpO2lmKDA8Yil7ZT10aGlzLl9pbnRlcnBvbGFudHM7CnU9dGhpcy5fcHJvcGVydHlCaW5kaW5ncztmb3IodmFyIHc9MCxBPWUubGVuZ3RoO3chPT1BOysrdyllW3ddLmV2YWx1YXRlKGgpLHVbd10uYWNjdW11bGF0ZShtLGIpfX1lbHNlIHRoaXMuX3VwZGF0ZVdlaWdodChiKX0sX3VwZGF0ZVdlaWdodDpmdW5jdGlvbihiKXt2YXIgZT0wO2lmKHRoaXMuZW5hYmxlZCl7ZT10aGlzLndlaWdodDt2YXIgaD10aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtpZihudWxsIT09aCl7dmFyIG09aC5ldmFsdWF0ZShiKVswXTtlKj1tO2I+aC5wYXJhbWV0ZXJQb3NpdGlvbnNbMV0mJih0aGlzLnN0b3BGYWRpbmcoKSwwPT09bSYmKHRoaXMuZW5hYmxlZD0hMSkpfX1yZXR1cm4gdGhpcy5fZWZmZWN0aXZlV2VpZ2h0PWV9LF91cGRhdGVUaW1lU2NhbGU6ZnVuY3Rpb24oYil7dmFyIGU9MDtpZighdGhpcy5wYXVzZWQpe2U9dGhpcy50aW1lU2NhbGU7dmFyIGg9dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7aWYobnVsbCE9PWgpe3ZhciBtPWguZXZhbHVhdGUoYilbMF07CmUqPW07Yj5oLnBhcmFtZXRlclBvc2l0aW9uc1sxXSYmKHRoaXMuc3RvcFdhcnBpbmcoKSwwPT09ZT90aGlzLnBhdXNlZD0hMDp0aGlzLnRpbWVTY2FsZT1lKX19cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT1lfSxfdXBkYXRlVGltZTpmdW5jdGlvbihiKXt2YXIgZT10aGlzLnRpbWUrYixoPXRoaXMuX2NsaXAuZHVyYXRpb24sbT10aGlzLmxvb3AsdT10aGlzLl9sb29wQ291bnQsdz0yMjAyPT09bTtpZigwPT09YilyZXR1cm4tMT09PXU/ZTp3JiYxPT09KHUmMSk/aC1lOmU7aWYoMjIwMD09PW0pYTp7aWYoLTE9PT11JiYodGhpcy5fbG9vcENvdW50PTAsdGhpcy5fc2V0RW5kaW5ncyghMCwhMCwhMSkpLGU+PWgpZT1oO2Vsc2UgaWYoMD5lKWU9MDtlbHNle3RoaXMudGltZT1lO2JyZWFrIGF9dGhpcy5jbGFtcFdoZW5GaW5pc2hlZD90aGlzLnBhdXNlZD0hMDp0aGlzLmVuYWJsZWQ9ITE7dGhpcy50aW1lPWU7dGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7dHlwZToiZmluaXNoZWQiLAphY3Rpb246dGhpcyxkaXJlY3Rpb246MD5iPy0xOjF9KX1lbHNley0xPT09dSYmKDA8PWI/KHU9MCx0aGlzLl9zZXRFbmRpbmdzKCEwLDA9PT10aGlzLnJlcGV0aXRpb25zLHcpKTp0aGlzLl9zZXRFbmRpbmdzKDA9PT10aGlzLnJlcGV0aXRpb25zLCEwLHcpKTtpZihlPj1ofHwwPmUpe209TWF0aC5mbG9vcihlL2gpO2UtPWgqbTt1Kz1NYXRoLmFicyhtKTt2YXIgQT10aGlzLnJlcGV0aXRpb25zLXU7MD49QT8odGhpcy5jbGFtcFdoZW5GaW5pc2hlZD90aGlzLnBhdXNlZD0hMDp0aGlzLmVuYWJsZWQ9ITEsdGhpcy50aW1lPWU9MDxiP2g6MCx0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KHt0eXBlOiJmaW5pc2hlZCIsYWN0aW9uOnRoaXMsZGlyZWN0aW9uOjA8Yj8xOi0xfSkpOigxPT09QT8oYj0wPmIsdGhpcy5fc2V0RW5kaW5ncyhiLCFiLHcpKTp0aGlzLl9zZXRFbmRpbmdzKCExLCExLHcpLHRoaXMuX2xvb3BDb3VudD11LHRoaXMudGltZT1lLHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6Imxvb3AiLAphY3Rpb246dGhpcyxsb29wRGVsdGE6bX0pKX1lbHNlIHRoaXMudGltZT1lO2lmKHcmJjE9PT0odSYxKSlyZXR1cm4gaC1lfXJldHVybiBlfSxfc2V0RW5kaW5nczpmdW5jdGlvbihiLGUsaCl7dmFyIG09dGhpcy5faW50ZXJwb2xhbnRTZXR0aW5ncztoPyhtLmVuZGluZ1N0YXJ0PTI0MDEsbS5lbmRpbmdFbmQ9MjQwMSk6KG0uZW5kaW5nU3RhcnQ9Yj90aGlzLnplcm9TbG9wZUF0U3RhcnQ/MjQwMToyNDAwOjI0MDIsbS5lbmRpbmdFbmQ9ZT90aGlzLnplcm9TbG9wZUF0RW5kPzI0MDE6MjQwMDoyNDAyKX0sX3NjaGVkdWxlRmFkaW5nOmZ1bmN0aW9uKGIsZSxoKXt2YXIgbT10aGlzLl9taXhlcix1PW0udGltZSx3PXRoaXMuX3dlaWdodEludGVycG9sYW50O251bGw9PT13JiYodGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9dz1tLl9sZW5kQ29udHJvbEludGVycG9sYW50KCkpO209dy5wYXJhbWV0ZXJQb3NpdGlvbnM7dz13LnNhbXBsZVZhbHVlczttWzBdPXU7d1swXT1lO21bMV09dStiO3dbMV09Cmg7cmV0dXJuIHRoaXN9fSk7VWsucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlVrLF9iaW5kQWN0aW9uOmZ1bmN0aW9uKGIsZSl7dmFyIGg9Yi5fbG9jYWxSb290fHx0aGlzLl9yb290LG09Yi5fY2xpcC50cmFja3MsdT1tLmxlbmd0aCx3PWIuX3Byb3BlcnR5QmluZGluZ3M7Yj1iLl9pbnRlcnBvbGFudHM7dmFyIEE9aC51dWlkLEU9dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLEc9RVtBXTt2b2lkIDA9PT1HJiYoRz17fSxFW0FdPUcpO2ZvcihFPTA7RSE9PXU7KytFKXt2YXIgSj1tW0VdLFE9Si5uYW1lLFM9R1tRXTtpZih2b2lkIDA9PT1TKXtTPXdbRV07aWYodm9pZCAwIT09Uyl7bnVsbD09PVMuX2NhY2hlSW5kZXgmJigrK1MucmVmZXJlbmNlQ291bnQsdGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKFMsQSxRKSk7Y29udGludWV9Uz1uZXcgVGsodmMuY3JlYXRlKGgsUSxlJiZlLl9wcm9wZXJ0eUJpbmRpbmdzW0VdLmJpbmRpbmcucGFyc2VkUGF0aCksCkouVmFsdWVUeXBlTmFtZSxKLmdldFZhbHVlU2l6ZSgpKTsrK1MucmVmZXJlbmNlQ291bnQ7dGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKFMsQSxRKX13W0VdPVM7YltFXS5yZXN1bHRCdWZmZXI9Uy5idWZmZXJ9fSxfYWN0aXZhdGVBY3Rpb246ZnVuY3Rpb24oYil7aWYoIXRoaXMuX2lzQWN0aXZlQWN0aW9uKGIpKXtpZihudWxsPT09Yi5fY2FjaGVJbmRleCl7dmFyIGU9KGIuX2xvY2FsUm9vdHx8dGhpcy5fcm9vdCkudXVpZCxoPWIuX2NsaXAudXVpZCxtPXRoaXMuX2FjdGlvbnNCeUNsaXBbaF07dGhpcy5fYmluZEFjdGlvbihiLG0mJm0ua25vd25BY3Rpb25zWzBdKTt0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbihiLGgsZSl9ZT1iLl9wcm9wZXJ0eUJpbmRpbmdzO2g9MDtmb3IobT1lLmxlbmd0aDtoIT09bTsrK2gpe3ZhciB1PWVbaF07MD09PXUudXNlQ291bnQrKyYmKHRoaXMuX2xlbmRCaW5kaW5nKHUpLHUuc2F2ZU9yaWdpbmFsU3RhdGUoKSl9dGhpcy5fbGVuZEFjdGlvbihiKX19LApfZGVhY3RpdmF0ZUFjdGlvbjpmdW5jdGlvbihiKXtpZih0aGlzLl9pc0FjdGl2ZUFjdGlvbihiKSl7Zm9yKHZhciBlPWIuX3Byb3BlcnR5QmluZGluZ3MsaD0wLG09ZS5sZW5ndGg7aCE9PW07KytoKXt2YXIgdT1lW2hdOzA9PT0tLXUudXNlQ291bnQmJih1LnJlc3RvcmVPcmlnaW5hbFN0YXRlKCksdGhpcy5fdGFrZUJhY2tCaW5kaW5nKHUpKX10aGlzLl90YWtlQmFja0FjdGlvbihiKX19LF9pbml0TWVtb3J5TWFuYWdlcjpmdW5jdGlvbigpe3RoaXMuX2FjdGlvbnM9W107dGhpcy5fbkFjdGl2ZUFjdGlvbnM9MDt0aGlzLl9hY3Rpb25zQnlDbGlwPXt9O3RoaXMuX2JpbmRpbmdzPVtdO3RoaXMuX25BY3RpdmVCaW5kaW5ncz0wO3RoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZT17fTt0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzPVtdO3RoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzPTA7dmFyIGI9dGhpczt0aGlzLnN0YXRzPXthY3Rpb25zOntnZXQgdG90YWwoKXtyZXR1cm4gYi5fYWN0aW9ucy5sZW5ndGh9LApnZXQgaW5Vc2UoKXtyZXR1cm4gYi5fbkFjdGl2ZUFjdGlvbnN9fSxiaW5kaW5nczp7Z2V0IHRvdGFsKCl7cmV0dXJuIGIuX2JpbmRpbmdzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIGIuX25BY3RpdmVCaW5kaW5nc319LGNvbnRyb2xJbnRlcnBvbGFudHM6e2dldCB0b3RhbCgpe3JldHVybiBiLl9jb250cm9sSW50ZXJwb2xhbnRzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIGIuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzfX19fSxfaXNBY3RpdmVBY3Rpb246ZnVuY3Rpb24oYil7Yj1iLl9jYWNoZUluZGV4O3JldHVybiBudWxsIT09YiYmYjx0aGlzLl9uQWN0aXZlQWN0aW9uc30sX2FkZEluYWN0aXZlQWN0aW9uOmZ1bmN0aW9uKGIsZSxoKXt2YXIgbT10aGlzLl9hY3Rpb25zLHU9dGhpcy5fYWN0aW9uc0J5Q2xpcCx3PXVbZV07dm9pZCAwPT09dz8odz17a25vd25BY3Rpb25zOltiXSxhY3Rpb25CeVJvb3Q6e319LGIuX2J5Q2xpcENhY2hlSW5kZXg9MCx1W2VdPXcpOihlPQp3Lmtub3duQWN0aW9ucyxiLl9ieUNsaXBDYWNoZUluZGV4PWUubGVuZ3RoLGUucHVzaChiKSk7Yi5fY2FjaGVJbmRleD1tLmxlbmd0aDttLnB1c2goYik7dy5hY3Rpb25CeVJvb3RbaF09Yn0sX3JlbW92ZUluYWN0aXZlQWN0aW9uOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuX2FjdGlvbnMsaD1lW2UubGVuZ3RoLTFdLG09Yi5fY2FjaGVJbmRleDtoLl9jYWNoZUluZGV4PW07ZVttXT1oO2UucG9wKCk7Yi5fY2FjaGVJbmRleD1udWxsO2U9Yi5fY2xpcC51dWlkO2g9dGhpcy5fYWN0aW9uc0J5Q2xpcDttPWhbZV07dmFyIHU9bS5rbm93bkFjdGlvbnMsdz11W3UubGVuZ3RoLTFdLEE9Yi5fYnlDbGlwQ2FjaGVJbmRleDt3Ll9ieUNsaXBDYWNoZUluZGV4PUE7dVtBXT13O3UucG9wKCk7Yi5fYnlDbGlwQ2FjaGVJbmRleD1udWxsO2RlbGV0ZSBtLmFjdGlvbkJ5Um9vdFsoYi5fbG9jYWxSb290fHx0aGlzLl9yb290KS51dWlkXTswPT09dS5sZW5ndGgmJmRlbGV0ZSBoW2VdO3RoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24oYil9LApfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbjpmdW5jdGlvbihiKXtiPWIuX3Byb3BlcnR5QmluZGluZ3M7Zm9yKHZhciBlPTAsaD1iLmxlbmd0aDtlIT09aDsrK2Upe3ZhciBtPWJbZV07MD09PS0tbS5yZWZlcmVuY2VDb3VudCYmdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKG0pfX0sX2xlbmRBY3Rpb246ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5fYWN0aW9ucyxoPWIuX2NhY2hlSW5kZXgsbT10aGlzLl9uQWN0aXZlQWN0aW9ucysrLHU9ZVttXTtiLl9jYWNoZUluZGV4PW07ZVttXT1iO3UuX2NhY2hlSW5kZXg9aDtlW2hdPXV9LF90YWtlQmFja0FjdGlvbjpmdW5jdGlvbihiKXt2YXIgZT10aGlzLl9hY3Rpb25zLGg9Yi5fY2FjaGVJbmRleCxtPS0tdGhpcy5fbkFjdGl2ZUFjdGlvbnMsdT1lW21dO2IuX2NhY2hlSW5kZXg9bTtlW21dPWI7dS5fY2FjaGVJbmRleD1oO2VbaF09dX0sX2FkZEluYWN0aXZlQmluZGluZzpmdW5jdGlvbihiLGUsaCl7dmFyIG09dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLAp1PW1bZV0sdz10aGlzLl9iaW5kaW5nczt2b2lkIDA9PT11JiYodT17fSxtW2VdPXUpO3VbaF09YjtiLl9jYWNoZUluZGV4PXcubGVuZ3RoO3cucHVzaChiKX0sX3JlbW92ZUluYWN0aXZlQmluZGluZzpmdW5jdGlvbihiKXt2YXIgZT10aGlzLl9iaW5kaW5ncyxoPWIuYmluZGluZyxtPWgucm9vdE5vZGUudXVpZDtoPWgucGF0aDt2YXIgdT10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsdz11W21dLEE9ZVtlLmxlbmd0aC0xXTtiPWIuX2NhY2hlSW5kZXg7QS5fY2FjaGVJbmRleD1iO2VbYl09QTtlLnBvcCgpO2RlbGV0ZSB3W2hdOzA9PT1PYmplY3Qua2V5cyh3KS5sZW5ndGgmJmRlbGV0ZSB1W21dfSxfbGVuZEJpbmRpbmc6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5fYmluZGluZ3MsaD1iLl9jYWNoZUluZGV4LG09dGhpcy5fbkFjdGl2ZUJpbmRpbmdzKyssdT1lW21dO2IuX2NhY2hlSW5kZXg9bTtlW21dPWI7dS5fY2FjaGVJbmRleD1oO2VbaF09dX0sX3Rha2VCYWNrQmluZGluZzpmdW5jdGlvbihiKXt2YXIgZT0KdGhpcy5fYmluZGluZ3MsaD1iLl9jYWNoZUluZGV4LG09LS10aGlzLl9uQWN0aXZlQmluZGluZ3MsdT1lW21dO2IuX2NhY2hlSW5kZXg9bTtlW21dPWI7dS5fY2FjaGVJbmRleD1oO2VbaF09dX0sX2xlbmRDb250cm9sSW50ZXJwb2xhbnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLGU9dGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMrKyxoPWJbZV07dm9pZCAwPT09aCYmKGg9bmV3IENoKG5ldyBGbG9hdDMyQXJyYXkoMiksbmV3IEZsb2F0MzJBcnJheSgyKSwxLHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXIpLGguX19jYWNoZUluZGV4PWUsYltlXT1oKTtyZXR1cm4gaH0sX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50OmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsaD1iLl9fY2FjaGVJbmRleCxtPS0tdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMsdT1lW21dO2IuX19jYWNoZUluZGV4PQptO2VbbV09Yjt1Ll9fY2FjaGVJbmRleD1oO2VbaF09dX0sX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXI6bmV3IEZsb2F0MzJBcnJheSgxKSxjbGlwQWN0aW9uOmZ1bmN0aW9uKGIsZSl7dmFyIGg9ZXx8dGhpcy5fcm9vdCxtPWgudXVpZDtoPSJzdHJpbmciPT09dHlwZW9mIGI/UmMuZmluZEJ5TmFtZShoLGIpOmI7Yj1udWxsIT09aD9oLnV1aWQ6Yjt2YXIgdT10aGlzLl9hY3Rpb25zQnlDbGlwW2JdLHc9bnVsbDtpZih2b2lkIDAhPT11KXt3PXUuYWN0aW9uQnlSb290W21dO2lmKHZvaWQgMCE9PXcpcmV0dXJuIHc7dz11Lmtub3duQWN0aW9uc1swXTtudWxsPT09aCYmKGg9dy5fY2xpcCl9aWYobnVsbD09PWgpcmV0dXJuIG51bGw7ZT1uZXcgYm8odGhpcyxoLGUpO3RoaXMuX2JpbmRBY3Rpb24oZSx3KTt0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbihlLGIsbSk7cmV0dXJuIGV9LGV4aXN0aW5nQWN0aW9uOmZ1bmN0aW9uKGIsZSl7dmFyIGg9ZXx8dGhpcy5fcm9vdDtlPWgudXVpZDsKaD0ic3RyaW5nIj09PXR5cGVvZiBiP1JjLmZpbmRCeU5hbWUoaCxiKTpiO2I9dGhpcy5fYWN0aW9uc0J5Q2xpcFtoP2gudXVpZDpiXTtyZXR1cm4gdm9pZCAwIT09Yj9iLmFjdGlvbkJ5Um9vdFtlXXx8bnVsbDpudWxsfSxzdG9wQWxsQWN0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuX2FjdGlvbnMsZT10aGlzLl9uQWN0aXZlQWN0aW9ucyxoPXRoaXMuX2JpbmRpbmdzLG09dGhpcy5fbkFjdGl2ZUJpbmRpbmdzLHU9dGhpcy5fbkFjdGl2ZUJpbmRpbmdzPXRoaXMuX25BY3RpdmVBY3Rpb25zPTA7dSE9PWU7Kyt1KWJbdV0ucmVzZXQoKTtmb3IodT0wO3UhPT1tOysrdSloW3VdLnVzZUNvdW50PTA7cmV0dXJuIHRoaXN9LHVwZGF0ZTpmdW5jdGlvbihiKXtiKj10aGlzLnRpbWVTY2FsZTtmb3IodmFyIGU9dGhpcy5fYWN0aW9ucyxoPXRoaXMuX25BY3RpdmVBY3Rpb25zLG09dGhpcy50aW1lKz1iLHU9TWF0aC5zaWduKGIpLHc9dGhpcy5fYWNjdUluZGV4Xj0xLEE9MDtBIT09aDsrK0EpZVtBXS5fdXBkYXRlKG0sCmIsdSx3KTtiPXRoaXMuX2JpbmRpbmdzO2U9dGhpcy5fbkFjdGl2ZUJpbmRpbmdzO2ZvcihBPTA7QSE9PWU7KytBKWJbQV0uYXBwbHkodyk7cmV0dXJuIHRoaXN9LGdldFJvb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm9vdH0sdW5jYWNoZUNsaXA6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5fYWN0aW9ucztiPWIudXVpZDt2YXIgaD10aGlzLl9hY3Rpb25zQnlDbGlwLG09aFtiXTtpZih2b2lkIDAhPT1tKXttPW0ua25vd25BY3Rpb25zO2Zvcih2YXIgdT0wLHc9bS5sZW5ndGg7dSE9PXc7Kyt1KXt2YXIgQT1tW3VdO3RoaXMuX2RlYWN0aXZhdGVBY3Rpb24oQSk7dmFyIEU9QS5fY2FjaGVJbmRleCxHPWVbZS5sZW5ndGgtMV07QS5fY2FjaGVJbmRleD1udWxsO0EuX2J5Q2xpcENhY2hlSW5kZXg9bnVsbDtHLl9jYWNoZUluZGV4PUU7ZVtFXT1HO2UucG9wKCk7dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbihBKX1kZWxldGUgaFtiXX19LHVuY2FjaGVSb290OmZ1bmN0aW9uKGIpe2I9CmIudXVpZDt2YXIgZT10aGlzLl9hY3Rpb25zQnlDbGlwO2ZvcihtIGluIGUpe3ZhciBoPWVbbV0uYWN0aW9uQnlSb290W2JdO3ZvaWQgMCE9PWgmJih0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKGgpLHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKGgpKX12YXIgbT10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWVbYl07aWYodm9pZCAwIT09bSlmb3IodmFyIHUgaW4gbSliPW1bdV0sYi5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpLHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyhiKX0sdW5jYWNoZUFjdGlvbjpmdW5jdGlvbihiLGUpe2I9dGhpcy5leGlzdGluZ0FjdGlvbihiLGUpO251bGwhPT1iJiYodGhpcy5fZGVhY3RpdmF0ZUFjdGlvbihiKSx0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbihiKSl9fSk7WmkucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBaaSh2b2lkIDA9PT10aGlzLnZhbHVlLmNsb25lP3RoaXMudmFsdWU6dGhpcy52YWx1ZS5jbG9uZSgpKX07VmsucHJvdG90eXBlPQpPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoT2UucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VmssaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcjohMCxjb3B5OmZ1bmN0aW9uKGIpe09lLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9Yi5tZXNoUGVyQXR0cmlidXRlO3JldHVybiB0aGlzfX0pO09iamVjdC5hc3NpZ24oY28ucHJvdG90eXBlLHtsaW5lUHJlY2lzaW9uOjEsc2V0OmZ1bmN0aW9uKGIsZSl7dGhpcy5yYXkuc2V0KGIsZSl9LHNldEZyb21DYW1lcmE6ZnVuY3Rpb24oYixlKXtlJiZlLmlzUGVyc3BlY3RpdmVDYW1lcmE/KHRoaXMucmF5Lm9yaWdpbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oZS5tYXRyaXhXb3JsZCksdGhpcy5yYXkuZGlyZWN0aW9uLnNldChiLngsYi55LC41KS51bnByb2plY3QoZSkuc3ViKHRoaXMucmF5Lm9yaWdpbikubm9ybWFsaXplKCksdGhpcy5jYW1lcmE9ZSk6ZSYmZS5pc09ydGhvZ3JhcGhpY0NhbWVyYT8KKHRoaXMucmF5Lm9yaWdpbi5zZXQoYi54LGIueSwoZS5uZWFyK2UuZmFyKS8oZS5uZWFyLWUuZmFyKSkudW5wcm9qZWN0KGUpLHRoaXMucmF5LmRpcmVjdGlvbi5zZXQoMCwwLC0xKS50cmFuc2Zvcm1EaXJlY3Rpb24oZS5tYXRyaXhXb3JsZCksdGhpcy5jYW1lcmE9ZSk6Y29uc29sZS5lcnJvcigiVEhSRUUuUmF5Y2FzdGVyOiBVbnN1cHBvcnRlZCBjYW1lcmEgdHlwZS4iKX0saW50ZXJzZWN0T2JqZWN0OmZ1bmN0aW9uKGIsZSxoKXtoPWh8fFtdO1drKGIsdGhpcyxoLGUpO2guc29ydChlbyk7cmV0dXJuIGh9LGludGVyc2VjdE9iamVjdHM6ZnVuY3Rpb24oYixlLGgpe2g9aHx8W107aWYoITE9PT1BcnJheS5pc0FycmF5KGIpKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzOiBvYmplY3RzIGlzIG5vdCBhbiBBcnJheS4iKSxoO2Zvcih2YXIgbT0wLHU9Yi5sZW5ndGg7bTx1O20rKylXayhiW21dLHRoaXMsaCxlKTtoLnNvcnQoZW8pO3JldHVybiBofX0pOwpPYmplY3QuYXNzaWduKGZvLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGIsZSxoKXt0aGlzLnJhZGl1cz1iO3RoaXMucGhpPWU7dGhpcy50aGV0YT1oO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihiKXt0aGlzLnJhZGl1cz1iLnJhZGl1czt0aGlzLnBoaT1iLnBoaTt0aGlzLnRoZXRhPWIudGhldGE7cmV0dXJuIHRoaXN9LG1ha2VTYWZlOmZ1bmN0aW9uKCl7dGhpcy5waGk9TWF0aC5tYXgoMUUtNixNYXRoLm1pbihNYXRoLlBJLTFFLTYsdGhpcy5waGkpKTtyZXR1cm4gdGhpc30sc2V0RnJvbVZlY3RvcjM6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuc2V0RnJvbUNhcnRlc2lhbkNvb3JkcyhiLngsYi55LGIueil9LHNldEZyb21DYXJ0ZXNpYW5Db29yZHM6ZnVuY3Rpb24oYixlLGgpe3RoaXMucmFkaXVzPU1hdGguc3FydChiKmIrZSplK2gqaCk7MD09PXRoaXMucmFkaXVzP3RoaXMucGhpPQp0aGlzLnRoZXRhPTA6KHRoaXMudGhldGE9TWF0aC5hdGFuMihiLGgpLHRoaXMucGhpPU1hdGguYWNvcyhsYi5jbGFtcChlL3RoaXMucmFkaXVzLC0xLDEpKSk7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmFzc2lnbihnby5wcm90b3R5cGUse3NldDpmdW5jdGlvbihiLGUsaCl7dGhpcy5yYWRpdXM9Yjt0aGlzLnRoZXRhPWU7dGhpcy55PWg7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGIpe3RoaXMucmFkaXVzPWIucmFkaXVzO3RoaXMudGhldGE9Yi50aGV0YTt0aGlzLnk9Yi55O3JldHVybiB0aGlzfSxzZXRGcm9tVmVjdG9yMzpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKGIueCxiLnksYi56KX0sc2V0RnJvbUNhcnRlc2lhbkNvb3JkczpmdW5jdGlvbihiLGUsaCl7dGhpcy5yYWRpdXM9TWF0aC5zcXJ0KGIqYitoKmgpO3RoaXMudGhldGE9TWF0aC5hdGFuMihiLApoKTt0aGlzLnk9ZTtyZXR1cm4gdGhpc319KTt2YXIgSG89bmV3IGQ7T2JqZWN0LmFzc2lnbihYay5wcm90b3R5cGUse3NldDpmdW5jdGlvbihiLGUpe3RoaXMubWluLmNvcHkoYik7dGhpcy5tYXguY29weShlKTtyZXR1cm4gdGhpc30sc2V0RnJvbVBvaW50czpmdW5jdGlvbihiKXt0aGlzLm1ha2VFbXB0eSgpO2Zvcih2YXIgZT0wLGg9Yi5sZW5ndGg7ZTxoO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQoYltlXSk7cmV0dXJuIHRoaXN9LHNldEZyb21DZW50ZXJBbmRTaXplOmZ1bmN0aW9uKGIsZSl7ZT1Iby5jb3B5KGUpLm11bHRpcGx5U2NhbGFyKC41KTt0aGlzLm1pbi5jb3B5KGIpLnN1YihlKTt0aGlzLm1heC5jb3B5KGIpLmFkZChlKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy5taW4uY29weShiLm1pbik7dGhpcy5tYXguY29weShiLm1heCk7cmV0dXJuIHRoaXN9LAptYWtlRW1wdHk6ZnVuY3Rpb24oKXt0aGlzLm1pbi54PXRoaXMubWluLnk9SW5maW5pdHk7dGhpcy5tYXgueD10aGlzLm1heC55PS1JbmZpbml0eTtyZXR1cm4gdGhpc30saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueX0sZ2V0Q2VudGVyOmZ1bmN0aW9uKGIpe3ZvaWQgMD09PWImJihjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYj1uZXcgZCk7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP2Iuc2V0KDAsMCk6Yi5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9LGdldFNpemU6ZnVuY3Rpb24oYil7dm9pZCAwPT09YiYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmdldFNpemUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYj1uZXcgZCk7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP2Iuc2V0KDAsMCk6Yi5zdWJWZWN0b3JzKHRoaXMubWF4LAp0aGlzLm1pbil9LGV4cGFuZEJ5UG9pbnQ6ZnVuY3Rpb24oYil7dGhpcy5taW4ubWluKGIpO3RoaXMubWF4Lm1heChiKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlWZWN0b3I6ZnVuY3Rpb24oYil7dGhpcy5taW4uc3ViKGIpO3RoaXMubWF4LmFkZChiKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlTY2FsYXI6ZnVuY3Rpb24oYil7dGhpcy5taW4uYWRkU2NhbGFyKC1iKTt0aGlzLm1heC5hZGRTY2FsYXIoYik7cmV0dXJuIHRoaXN9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYil7cmV0dXJuIGIueDx0aGlzLm1pbi54fHxiLng+dGhpcy5tYXgueHx8Yi55PHRoaXMubWluLnl8fGIueT50aGlzLm1heC55PyExOiEwfSxjb250YWluc0JveDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5taW4ueDw9Yi5taW4ueCYmYi5tYXgueDw9dGhpcy5tYXgueCYmdGhpcy5taW4ueTw9Yi5taW4ueSYmYi5tYXgueTw9dGhpcy5tYXgueX0sZ2V0UGFyYW1ldGVyOmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmdldFBhcmFtZXRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSwKZT1uZXcgZCk7cmV0dXJuIGUuc2V0KChiLngtdGhpcy5taW4ueCkvKHRoaXMubWF4LngtdGhpcy5taW4ueCksKGIueS10aGlzLm1pbi55KS8odGhpcy5tYXgueS10aGlzLm1pbi55KSl9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYil7cmV0dXJuIGIubWF4Lng8dGhpcy5taW4ueHx8Yi5taW4ueD50aGlzLm1heC54fHxiLm1heC55PHRoaXMubWluLnl8fGIubWluLnk+dGhpcy5tYXgueT8hMTohMH0sY2xhbXBQb2ludDpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5jbGFtcFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGU9bmV3IGQpO3JldHVybiBlLmNvcHkoYikuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfSxkaXN0YW5jZVRvUG9pbnQ6ZnVuY3Rpb24oYil7cmV0dXJuIEhvLmNvcHkoYikuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpLnN1YihiKS5sZW5ndGgoKX0saW50ZXJzZWN0OmZ1bmN0aW9uKGIpe3RoaXMubWluLm1heChiLm1pbik7CnRoaXMubWF4Lm1pbihiLm1heCk7cmV0dXJuIHRoaXN9LHVuaW9uOmZ1bmN0aW9uKGIpe3RoaXMubWluLm1pbihiLm1pbik7dGhpcy5tYXgubWF4KGIubWF4KTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGIpe3RoaXMubWluLmFkZChiKTt0aGlzLm1heC5hZGQoYik7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihiKXtyZXR1cm4gYi5taW4uZXF1YWxzKHRoaXMubWluKSYmYi5tYXguZXF1YWxzKHRoaXMubWF4KX19KTt2YXIgSW89bmV3IGcsd2o9bmV3IGc7T2JqZWN0LmFzc2lnbihZay5wcm90b3R5cGUse3NldDpmdW5jdGlvbihiLGUpe3RoaXMuc3RhcnQuY29weShiKTt0aGlzLmVuZC5jb3B5KGUpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihiKXt0aGlzLnN0YXJ0LmNvcHkoYi5zdGFydCk7dGhpcy5lbmQuY29weShiLmVuZCk7cmV0dXJuIHRoaXN9LGdldENlbnRlcjpmdW5jdGlvbihiKXt2b2lkIDA9PT0KYiYmKGNvbnNvbGUud2FybigiVEhSRUUuTGluZTM6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYj1uZXcgZyk7cmV0dXJuIGIuYWRkVmVjdG9ycyh0aGlzLnN0YXJ0LHRoaXMuZW5kKS5tdWx0aXBseVNjYWxhciguNSl9LGRlbHRhOmZ1bmN0aW9uKGIpe3ZvaWQgMD09PWImJihjb25zb2xlLndhcm4oIlRIUkVFLkxpbmUzOiAuZGVsdGEoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYj1uZXcgZyk7cmV0dXJuIGIuc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KX0sZGlzdGFuY2VTcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuZW5kKX0sZGlzdGFuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvKHRoaXMuZW5kKX0sYXQ6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1lJiYoY29uc29sZS53YXJuKCJUSFJFRS5MaW5lMzogLmF0KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGU9Cm5ldyBnKTtyZXR1cm4gdGhpcy5kZWx0YShlKS5tdWx0aXBseVNjYWxhcihiKS5hZGQodGhpcy5zdGFydCl9LGNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXI6ZnVuY3Rpb24oYixlKXtJby5zdWJWZWN0b3JzKGIsdGhpcy5zdGFydCk7d2ouc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KTtiPXdqLmRvdChJbykvd2ouZG90KHdqKTtlJiYoYj1sYi5jbGFtcChiLDAsMSkpO3JldHVybiBifSxjbG9zZXN0UG9pbnRUb1BvaW50OmZ1bmN0aW9uKGIsZSxoKXtiPXRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcihiLGUpO3ZvaWQgMD09PWgmJihjb25zb2xlLndhcm4oIlRIUkVFLkxpbmUzOiAuY2xvc2VzdFBvaW50VG9Qb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxoPW5ldyBnKTtyZXR1cm4gdGhpcy5kZWx0YShoKS5tdWx0aXBseVNjYWxhcihiKS5hZGQodGhpcy5zdGFydCl9LGFwcGx5TWF0cml4NDpmdW5jdGlvbihiKXt0aGlzLnN0YXJ0LmFwcGx5TWF0cml4NChiKTsKdGhpcy5lbmQuYXBwbHlNYXRyaXg0KGIpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuc3RhcnQuZXF1YWxzKHRoaXMuc3RhcnQpJiZiLmVuZC5lcXVhbHModGhpcy5lbmQpfX0pO0hoLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHkucHJvdG90eXBlKTtIaC5wcm90b3R5cGUuY29uc3RydWN0b3I9SGg7SGgucHJvdG90eXBlLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0PSEwO3ZhciBIZD1uZXcgZyxZZD1uZXcgZyx1bD1uZXcgbCxTcz1bImEiLCJiIiwiYyJdO0loLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFNiLnByb3RvdHlwZSk7SWgucHJvdG90eXBlLmNvbnN0cnVjdG9yPUloO0loLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLm9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCghMCk7dWwuZ2V0Tm9ybWFsTWF0cml4KHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkKTt2YXIgYj10aGlzLm9iamVjdC5tYXRyaXhXb3JsZCxlPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbiwKaD10aGlzLm9iamVjdC5nZW9tZXRyeTtpZihoJiZoLmlzR2VvbWV0cnkpZm9yKHZhciBtPWgudmVydGljZXMsdT1oLmZhY2VzLHc9aD0wLEE9dS5sZW5ndGg7dzxBO3crKylmb3IodmFyIEU9dVt3XSxHPTAsSj1FLnZlcnRleE5vcm1hbHMubGVuZ3RoO0c8SjtHKyspe3ZhciBRPUUudmVydGV4Tm9ybWFsc1tHXTtIZC5jb3B5KG1bRVtTc1tHXV1dKS5hcHBseU1hdHJpeDQoYik7WWQuY29weShRKS5hcHBseU1hdHJpeDModWwpLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHRoaXMuc2l6ZSkuYWRkKEhkKTtlLnNldFhZWihoLEhkLngsSGQueSxIZC56KTtoKz0xO2Uuc2V0WFlaKGgsWWQueCxZZC55LFlkLnopO2grPTF9ZWxzZSBpZihoJiZoLmlzQnVmZmVyR2VvbWV0cnkpZm9yKG09aC5hdHRyaWJ1dGVzLnBvc2l0aW9uLHU9aC5hdHRyaWJ1dGVzLm5vcm1hbCxHPWg9MCxKPW0uY291bnQ7RzxKO0crKylIZC5zZXQobS5nZXRYKEcpLG0uZ2V0WShHKSxtLmdldFooRykpLmFwcGx5TWF0cml4NChiKSwKWWQuc2V0KHUuZ2V0WChHKSx1LmdldFkoRyksdS5nZXRaKEcpKSxZZC5hcHBseU1hdHJpeDModWwpLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHRoaXMuc2l6ZSkuYWRkKEhkKSxlLnNldFhZWihoLEhkLngsSGQueSxIZC56KSxoKz0xLGUuc2V0WFlaKGgsWWQueCxZZC55LFlkLnopLGgrPTE7ZS5uZWVkc1VwZGF0ZT0hMH07dmFyIEpvPW5ldyBnO2hnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHkucHJvdG90eXBlKTtoZy5wcm90b3R5cGUuY29uc3RydWN0b3I9aGc7aGcucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmNvbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMuY29uZS5tYXRlcmlhbC5kaXNwb3NlKCl9O2hnLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7dmFyIGI9dGhpcy5saWdodC5kaXN0YW5jZT90aGlzLmxpZ2h0LmRpc3RhbmNlOjFFMyxlPWIqTWF0aC50YW4odGhpcy5saWdodC5hbmdsZSk7CnRoaXMuY29uZS5zY2FsZS5zZXQoZSxlLGIpO0pvLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCk7dGhpcy5jb25lLmxvb2tBdChKbyk7dm9pZCAwIT09dGhpcy5jb2xvcj90aGlzLmNvbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpOnRoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpfTt2YXIgemU9bmV3IGcseGo9bmV3IHIsdmw9bmV3IHI7aWcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoU2IucHJvdG90eXBlKTtpZy5wcm90b3R5cGUuY29uc3RydWN0b3I9aWc7aWcucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkPWZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuYm9uZXMsaD10aGlzLmdlb21ldHJ5LG09aC5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7dmwuZ2V0SW52ZXJzZSh0aGlzLnJvb3QubWF0cml4V29ybGQpO2Zvcih2YXIgdT0wLHc9MDt1PGUubGVuZ3RoO3UrKyl7dmFyIEE9ZVt1XTtBLnBhcmVudCYmCkEucGFyZW50LmlzQm9uZSYmKHhqLm11bHRpcGx5TWF0cmljZXModmwsQS5tYXRyaXhXb3JsZCksemUuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHhqKSxtLnNldFhZWih3LHplLngsemUueSx6ZS56KSx4ai5tdWx0aXBseU1hdHJpY2VzKHZsLEEucGFyZW50Lm1hdHJpeFdvcmxkKSx6ZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oeGopLG0uc2V0WFlaKHcrMSx6ZS54LHplLnksemUueiksdys9Mil9aC5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikubmVlZHNVcGRhdGU9ITA7eS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCh0aGlzLGIpfTtqZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO2pnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1qZztqZy5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfTtqZy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5jb2xvcj8KdGhpcy5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik6dGhpcy5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpfTtrZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShtYy5wcm90b3R5cGUpO2tnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1rZztrZy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5zY2FsZS5zZXQoLjUqdGhpcy5saWdodC53aWR0aCwuNSp0aGlzLmxpZ2h0LmhlaWdodCwxKTtpZih2b2lkIDAhPT10aGlzLmNvbG9yKXRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpLHRoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpO2Vsc2V7dGhpcy5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpLm11bHRpcGx5U2NhbGFyKHRoaXMubGlnaHQuaW50ZW5zaXR5KTt2YXIgYj10aGlzLm1hdGVyaWFsLmNvbG9yLGU9TWF0aC5tYXgoYi5yLGIuZyxiLmIpOzE8ZSYmYi5tdWx0aXBseVNjYWxhcigxLwplKTt0aGlzLmNoaWxkcmVuWzBdLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5tYXRlcmlhbC5jb2xvcil9fTtrZy5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO3RoaXMuY2hpbGRyZW5bMF0uZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuZGlzcG9zZSgpfTt2YXIgVHM9bmV3IGcsS289bmV3IEksTG89bmV3IEk7bGcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeS5wcm90b3R5cGUpO2xnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1sZztsZy5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuY2hpbGRyZW5bMF0uZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuZGlzcG9zZSgpfTtsZy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jaGlsZHJlblswXTtpZih2b2lkIDAhPT10aGlzLmNvbG9yKXRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpOwplbHNle3ZhciBlPWIuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJjb2xvciIpO0tvLmNvcHkodGhpcy5saWdodC5jb2xvcik7TG8uY29weSh0aGlzLmxpZ2h0Lmdyb3VuZENvbG9yKTtmb3IodmFyIGg9MCxtPWUuY291bnQ7aDxtO2grKyl7dmFyIHU9aDxtLzI/S286TG87ZS5zZXRYWVooaCx1LnIsdS5nLHUuYil9ZS5uZWVkc1VwZGF0ZT0hMH1iLmxvb2tBdChUcy5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC5tYXRyaXhXb3JsZCkubmVnYXRlKCkpfTttZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO21nLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1tZzttZy5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfTttZy5wcm90b3R5cGUub25CZWZvcmVSZW5kZXI9ZnVuY3Rpb24oKXt0aGlzLnBvc2l0aW9uLmNvcHkodGhpcy5saWdodFByb2JlLnBvc2l0aW9uKTt0aGlzLnNjYWxlLnNldCgxLAoxLDEpLm11bHRpcGx5U2NhbGFyKHRoaXMuc2l6ZSk7dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5pbnRlbnNpdHkudmFsdWU9dGhpcy5saWdodFByb2JlLmludGVuc2l0eX07JGkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShTYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjokaSxjb3B5OmZ1bmN0aW9uKGIpe1NiLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLmdlb21ldHJ5LmNvcHkoYi5nZW9tZXRyeSk7dGhpcy5tYXRlcmlhbC5jb3B5KGIubWF0ZXJpYWwpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19KTthai5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTYi5wcm90b3R5cGUpO2FqLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hajtuZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShtYy5wcm90b3R5cGUpO25nLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1uZztuZy5wcm90b3R5cGUudXBkYXRlPQpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoWCxpYSxoYSxzYSl7aGE9KGlhLVgpL2hhO1cuc2V0WFlaKEcsMCwwLDApO0orKztmb3IoUT1YO1E8aWE7USs9aGEpUz1HK0osVy5zZXRYWVooUyxNYXRoLnNpbihRKSpoLDAsTWF0aC5jb3MoUSkqaCksVy5zZXRYWVooUysxLE1hdGguc2luKE1hdGgubWluKFEraGEsaWEpKSpoLDAsTWF0aC5jb3MoTWF0aC5taW4oUStoYSxpYSkpKmgpLFcuc2V0WFlaKFMrMiwwLDAsMCksSis9MztULmFkZEdyb3VwKEcsSixzYSk7Rys9SjtKPTB9dmFyIGU9dGhpcy5hdWRpbyxoPXRoaXMucmFuZ2UsbT10aGlzLmRpdmlzaW9uc0lubmVyQW5nbGUsdT10aGlzLmRpdmlzaW9uc091dGVyQW5nbGUsdz1sYi5kZWdUb1JhZChlLnBhbm5lci5jb25lSW5uZXJBbmdsZSk7ZT1sYi5kZWdUb1JhZChlLnBhbm5lci5jb25lT3V0ZXJBbmdsZSk7dmFyIEE9dy8yLEU9ZS8yLEc9MCxKPTAsUSxTLFQ9dGhpcy5nZW9tZXRyeSxXPVQuYXR0cmlidXRlcy5wb3NpdGlvbjtULmNsZWFyR3JvdXBzKCk7CmIoLUUsLUEsdSwwKTtiKC1BLEEsbSwxKTtiKEEsRSx1LDApO1cubmVlZHNVcGRhdGU9ITA7dz09PWUmJih0aGlzLm1hdGVyaWFsWzBdLnZpc2libGU9ITEpfTtuZy5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWxbMF0uZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWxbMV0uZGlzcG9zZSgpfTt2YXIgVmg9bmV3IGcseWo9bmV3IGcsTW89bmV3IGw7SmgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoU2IucHJvdG90eXBlKTtKaC5wcm90b3R5cGUuY29uc3RydWN0b3I9Smg7SmgucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMub2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTtNby5nZXROb3JtYWxNYXRyaXgodGhpcy5vYmplY3QubWF0cml4V29ybGQpO3ZhciBiPXRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkLGU9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGg9dGhpcy5vYmplY3QuZ2VvbWV0cnksbT0KaC52ZXJ0aWNlcztoPWguZmFjZXM7Zm9yKHZhciB1PTAsdz0wLEE9aC5sZW5ndGg7dzxBO3crKyl7dmFyIEU9aFt3XSxHPUUubm9ybWFsO1ZoLmNvcHkobVtFLmFdKS5hZGQobVtFLmJdKS5hZGQobVtFLmNdKS5kaXZpZGVTY2FsYXIoMykuYXBwbHlNYXRyaXg0KGIpO3lqLmNvcHkoRykuYXBwbHlNYXRyaXgzKE1vKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0aGlzLnNpemUpLmFkZChWaCk7ZS5zZXRYWVoodSxWaC54LFZoLnksVmgueik7dSs9MTtlLnNldFhZWih1LHlqLngseWoueSx5ai56KTt1Kz0xfWUubmVlZHNVcGRhdGU9ITB9O3ZhciBObz1uZXcgZyx6aj1uZXcgZyxPbz1uZXcgZztvZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5LnByb3RvdHlwZSk7b2cucHJvdG90eXBlLmNvbnN0cnVjdG9yPW9nO29nLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5saWdodFBsYW5lLmdlb21ldHJ5LmRpc3Bvc2UoKTt0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuZGlzcG9zZSgpOwp0aGlzLnRhcmdldExpbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5kaXNwb3NlKCl9O29nLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXtOby5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC5tYXRyaXhXb3JsZCk7emouc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkKTtPby5zdWJWZWN0b3JzKHpqLE5vKTt0aGlzLmxpZ2h0UGxhbmUubG9va0F0KHpqKTt2b2lkIDAhPT10aGlzLmNvbG9yPyh0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpLHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcikpOih0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSx0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSk7dGhpcy50YXJnZXRMaW5lLmxvb2tBdCh6aik7CnRoaXMudGFyZ2V0TGluZS5zY2FsZS56PU9vLmxlbmd0aCgpfTt2YXIgYmo9bmV3IGcsY2M9bmV3IEZiO0toLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFNiLnByb3RvdHlwZSk7S2gucHJvdG90eXBlLmNvbnN0cnVjdG9yPUtoO0toLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdlb21ldHJ5LGU9dGhpcy5wb2ludE1hcDtjYy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMuY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKTtlYygiYyIsZSxiLGNjLDAsMCwtMSk7ZWMoInQiLGUsYixjYywwLDAsMSk7ZWMoIm4xIixlLGIsY2MsLTEsLTEsLTEpO2VjKCJuMiIsZSxiLGNjLDEsLTEsLTEpO2VjKCJuMyIsZSxiLGNjLC0xLDEsLTEpO2VjKCJuNCIsZSxiLGNjLDEsMSwtMSk7ZWMoImYxIixlLGIsY2MsLTEsLTEsMSk7ZWMoImYyIixlLGIsY2MsMSwtMSwxKTtlYygiZjMiLGUsYixjYywtMSwxLDEpO2VjKCJmNCIsZSxiLGNjLDEsMSwxKTtlYygidTEiLAplLGIsY2MsLjcsMS4xLC0xKTtlYygidTIiLGUsYixjYywtLjcsMS4xLC0xKTtlYygidTMiLGUsYixjYywwLDIsLTEpO2VjKCJjZjEiLGUsYixjYywtMSwwLDEpO2VjKCJjZjIiLGUsYixjYywxLDAsMSk7ZWMoImNmMyIsZSxiLGNjLDAsLTEsMSk7ZWMoImNmNCIsZSxiLGNjLDAsMSwxKTtlYygiY24xIixlLGIsY2MsLTEsMCwtMSk7ZWMoImNuMiIsZSxiLGNjLDEsMCwtMSk7ZWMoImNuMyIsZSxiLGNjLDAsLTEsLTEpO2VjKCJjbjQiLGUsYixjYywwLDEsLTEpO2IuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLm5lZWRzVXBkYXRlPSEwfTt2YXIgQWo9bmV3IHg7UmQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoU2IucHJvdG90eXBlKTtSZC5wcm90b3R5cGUuY29uc3RydWN0b3I9UmQ7UmQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihiKXt2b2lkIDAhPT1iJiZjb25zb2xlLndhcm4oIlRIUkVFLkJveEhlbHBlcjogLnVwZGF0ZSgpIGhhcyBubyBsb25nZXIgYXJndW1lbnRzLiIpO3ZvaWQgMCE9PQp0aGlzLm9iamVjdCYmQWouc2V0RnJvbU9iamVjdCh0aGlzLm9iamVjdCk7aWYoIUFqLmlzRW1wdHkoKSl7Yj1Bai5taW47dmFyIGU9QWoubWF4LGg9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLG09aC5hcnJheTttWzBdPWUueDttWzFdPWUueTttWzJdPWUuejttWzNdPWIueDttWzRdPWUueTttWzVdPWUuejttWzZdPWIueDttWzddPWIueTttWzhdPWUuejttWzldPWUueDttWzEwXT1iLnk7bVsxMV09ZS56O21bMTJdPWUueDttWzEzXT1lLnk7bVsxNF09Yi56O21bMTVdPWIueDttWzE2XT1lLnk7bVsxN109Yi56O21bMThdPWIueDttWzE5XT1iLnk7bVsyMF09Yi56O21bMjFdPWUueDttWzIyXT1iLnk7bVsyM109Yi56O2gubmVlZHNVcGRhdGU9ITA7dGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKX19O1JkLnByb3RvdHlwZS5zZXRGcm9tT2JqZWN0PWZ1bmN0aW9uKGIpe3RoaXMub2JqZWN0PWI7dGhpcy51cGRhdGUoKTtyZXR1cm4gdGhpc307UmQucHJvdG90eXBlLmNvcHk9CmZ1bmN0aW9uKGIpe1NiLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLm9iamVjdD1iLm9iamVjdDtyZXR1cm4gdGhpc307UmQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfTtMaC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTYi5wcm90b3R5cGUpO0xoLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1MaDtMaC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQ9ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5ib3g7ZS5pc0VtcHR5KCl8fChlLmdldENlbnRlcih0aGlzLnBvc2l0aW9uKSxlLmdldFNpemUodGhpcy5zY2FsZSksdGhpcy5zY2FsZS5tdWx0aXBseVNjYWxhciguNSkseS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCh0aGlzLGIpKX07TWgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobWMucHJvdG90eXBlKTtNaC5wcm90b3R5cGUuY29uc3RydWN0b3I9TWg7TWgucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkPQpmdW5jdGlvbihiKXt2YXIgZT0tdGhpcy5wbGFuZS5jb25zdGFudDsxRS04Pk1hdGguYWJzKGUpJiYoZT0xRS04KTt0aGlzLnNjYWxlLnNldCguNSp0aGlzLnNpemUsLjUqdGhpcy5zaXplLGUpO3RoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuc2lkZT0wPmU/MTowO3RoaXMubG9va0F0KHRoaXMucGxhbmUubm9ybWFsKTt5LnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYil9O3ZhciBQbz1uZXcgZyxjaixaaztTZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5LnByb3RvdHlwZSk7U2QucHJvdG90eXBlLmNvbnN0cnVjdG9yPVNkO1NkLnByb3RvdHlwZS5zZXREaXJlY3Rpb249ZnVuY3Rpb24oYil7Ljk5OTk5PGIueT90aGlzLnF1YXRlcm5pb24uc2V0KDAsMCwwLDEpOi0uOTk5OTk+Yi55P3RoaXMucXVhdGVybmlvbi5zZXQoMSwwLDAsMCk6KFBvLnNldChiLnosMCwtYi54KS5ub3JtYWxpemUoKSx0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZShQbyxNYXRoLmFjb3MoYi55KSkpfTsKU2QucHJvdG90eXBlLnNldExlbmd0aD1mdW5jdGlvbihiLGUsaCl7dm9pZCAwPT09ZSYmKGU9LjIqYik7dm9pZCAwPT09aCYmKGg9LjIqZSk7dGhpcy5saW5lLnNjYWxlLnNldCgxLE1hdGgubWF4KDAsYi1lKSwxKTt0aGlzLmxpbmUudXBkYXRlTWF0cml4KCk7dGhpcy5jb25lLnNjYWxlLnNldChoLGUsaCk7dGhpcy5jb25lLnBvc2l0aW9uLnk9Yjt0aGlzLmNvbmUudXBkYXRlTWF0cml4KCl9O1NkLnByb3RvdHlwZS5zZXRDb2xvcj1mdW5jdGlvbihiKXt0aGlzLmxpbmUubWF0ZXJpYWwuY29sb3Iuc2V0KGIpO3RoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5zZXQoYil9O1NkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe3kucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIsITEpO3RoaXMubGluZS5jb3B5KGIubGluZSk7dGhpcy5jb25lLmNvcHkoYi5jb25lKTtyZXR1cm4gdGhpc307U2QucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfTsKTmgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoU2IucHJvdG90eXBlKTtOaC5wcm90b3R5cGUuY29uc3RydWN0b3I9Tmg7YWIuY3JlYXRlPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS5sb2coIlRIUkVFLkN1cnZlLmNyZWF0ZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQiKTtiLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGFiLnByb3RvdHlwZSk7Yi5wcm90b3R5cGUuY29uc3RydWN0b3I9YjtiLnByb3RvdHlwZS5nZXRQb2ludD1lO3JldHVybiBifTtPYmplY3QuYXNzaWduKFFkLnByb3RvdHlwZSx7Y3JlYXRlUG9pbnRzR2VvbWV0cnk6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVQb2ludHNHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLiIpO2I9dGhpcy5nZXRQb2ludHMoYik7cmV0dXJuIHRoaXMuY3JlYXRlR2VvbWV0cnkoYil9LGNyZWF0ZVNwYWNlZFBvaW50c0dlb21ldHJ5OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuQ3VydmVQYXRoOiAuY3JlYXRlU3BhY2VkUG9pbnRzR2VvbWV0cnkoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyggcG9pbnRzICkgaW5zdGVhZC4iKTsKYj10aGlzLmdldFNwYWNlZFBvaW50cyhiKTtyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeShiKX0sY3JlYXRlR2VvbWV0cnk6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLiIpO2Zvcih2YXIgZT1uZXcgemEsaD0wLG09Yi5sZW5ndGg7aDxtO2grKyl7dmFyIHU9YltoXTtlLnZlcnRpY2VzLnB1c2gobmV3IGcodS54LHUueSx1Lnp8fDApKX1yZXR1cm4gZX19KTtPYmplY3QuYXNzaWduKGlkLnByb3RvdHlwZSx7ZnJvbVBvaW50czpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLlBhdGg6IC5mcm9tUG9pbnRzKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbVBvaW50cygpLiIpO3RoaXMuc2V0RnJvbVBvaW50cyhiKX19KTtpby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh1Yy5wcm90b3R5cGUpOwpqby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh1Yy5wcm90b3R5cGUpOyRrLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHVjLnByb3RvdHlwZSk7T2JqZWN0LmFzc2lnbigkay5wcm90b3R5cGUse2luaXRGcm9tQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TcGxpbmU6IC5pbml0RnJvbUFycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sZ2V0Q29udHJvbFBvaW50c0FycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU3BsaW5lOiAuZ2V0Q29udHJvbFBvaW50c0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0scmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU3BsaW5lOiAucmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTskaS5wcm90b3R5cGUuc2V0Q29sb3JzPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuR3JpZEhlbHBlcjogc2V0Q29sb3JzKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCwgcGFzcyB0aGVtIGluIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkLiIpfTsKaWcucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNrZWxldG9uSGVscGVyOiB1cGRhdGUoKSBubyBsb25nZXIgbmVlZHMgdG8gYmUgY2FsbGVkLiIpfTtPYmplY3QuYXNzaWduKEtiLnByb3RvdHlwZSx7ZXh0cmFjdFVybEJhc2U6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5Mb2FkZXI6IC5leHRyYWN0VXJsQmFzZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5Mb2FkZXJVdGlscy5leHRyYWN0VXJsQmFzZSgpIGluc3RlYWQuIik7cmV0dXJuIHNsLmV4dHJhY3RVcmxCYXNlKGIpfX0pO09iamVjdC5hc3NpZ24oV2kucHJvdG90eXBlLHtzZXRUZXh0dXJlUGF0aDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogLnNldFRleHR1cmVQYXRoKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0UmVzb3VyY2VQYXRoKCkuIik7cmV0dXJuIHRoaXMuc2V0UmVzb3VyY2VQYXRoKGIpfX0pO09iamVjdC5hc3NpZ24oWGsucHJvdG90eXBlLAp7Y2VudGVyOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLiIpO3JldHVybiB0aGlzLmdldENlbnRlcihiKX0sZW1wdHk6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5lbXB0eSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmlzRW1wdHkoKS4iKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCl9LGlzSW50ZXJzZWN0aW9uQm94OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLiIpO3JldHVybiB0aGlzLmludGVyc2VjdHNCb3goYil9LHNpemU6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUoKS4iKTtyZXR1cm4gdGhpcy5nZXRTaXplKGIpfX0pO09iamVjdC5hc3NpZ24oeC5wcm90b3R5cGUsCntjZW50ZXI6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuIik7cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKGIpfSxlbXB0eTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLiIpO3JldHVybiB0aGlzLmlzRW1wdHkoKX0saXNJbnRlcnNlY3Rpb25Cb3g6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuIik7cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveChiKX0saXNJbnRlcnNlY3Rpb25TcGhlcmU6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuaXNJbnRlcnNlY3Rpb25TcGhlcmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzU3BoZXJlKCkuIik7cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZShiKX0sCnNpemU6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUoKS4iKTtyZXR1cm4gdGhpcy5nZXRTaXplKGIpfX0pO1lrLnByb3RvdHlwZS5jZW50ZXI9ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5MaW5lMzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLiIpO3JldHVybiB0aGlzLmdldENlbnRlcihiKX07T2JqZWN0LmFzc2lnbihsYix7cmFuZG9tMTY6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGg6IC5yYW5kb20xNigpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBNYXRoLnJhbmRvbSgpIGluc3RlYWQuIik7cmV0dXJuIE1hdGgucmFuZG9tKCl9LG5lYXJlc3RQb3dlck9mVHdvOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0aDogLm5lYXJlc3RQb3dlck9mVHdvKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZmxvb3JQb3dlck9mVHdvKCkuIik7CnJldHVybiBsYi5mbG9vclBvd2VyT2ZUd28oYil9LG5leHRQb3dlck9mVHdvOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0aDogLm5leHRQb3dlck9mVHdvKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY2VpbFBvd2VyT2ZUd28oKS4iKTtyZXR1cm4gbGIuY2VpbFBvd2VyT2ZUd28oYil9fSk7T2JqZWN0LmFzc2lnbihsLnByb3RvdHlwZSx7ZmxhdHRlblRvQXJyYXlPZmZzZXQ6ZnVuY3Rpb24oYixlKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDM6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuIik7cmV0dXJuIHRoaXMudG9BcnJheShiLGUpfSxtdWx0aXBseVZlY3RvcjM6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDMoIG1hdHJpeCApIGluc3RlYWQuIik7cmV0dXJuIGIuYXBwbHlNYXRyaXgzKHRoaXMpfSwKbXVsdGlwbHlWZWN0b3IzQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhcHBseVRvQnVmZmVyOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4MzogLmFwcGx5VG9CdWZmZXIoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZShiKX0sYXBwbHlUb1ZlY3RvcjNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDM6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtPYmplY3QuYXNzaWduKHIucHJvdG90eXBlLHtleHRyYWN0UG9zaXRpb246ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuZXh0cmFjdFBvc2l0aW9uKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY29weVBvc2l0aW9uKCkuIik7CnJldHVybiB0aGlzLmNvcHlQb3NpdGlvbihiKX0sZmxhdHRlblRvQXJyYXlPZmZzZXQ6ZnVuY3Rpb24oYixlKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuIik7cmV0dXJuIHRoaXMudG9BcnJheShiLGUpfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmdldFBvc2l0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLiIpO3JldHVybihuZXcgZykuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDMpfSxzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLnNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbigpLiIpOwpyZXR1cm4gdGhpcy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihiKX0sbXVsdGlwbHlUb0FycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlUb0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sbXVsdGlwbHlWZWN0b3IzOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLiIpO3JldHVybiBiLmFwcGx5TWF0cml4NCh0aGlzKX0sbXVsdGlwbHlWZWN0b3I0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yNCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLiIpO3JldHVybiBiLmFwcGx5TWF0cml4NCh0aGlzKX0sbXVsdGlwbHlWZWN0b3IzQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSwKcm90YXRlQXhpczpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMudHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLiIpO2IudHJhbnNmb3JtRGlyZWN0aW9uKHRoaXMpfSxjcm9zc1ZlY3RvcjpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5jcm9zc1ZlY3RvcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLiIpO3JldHVybiBiLmFwcGx5TWF0cml4NCh0aGlzKX0sdHJhbnNsYXRlOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLnRyYW5zbGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHJvdGF0ZVg6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlWCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHJvdGF0ZVk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlWSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LApyb3RhdGVaOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLnJvdGF0ZVooKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyb3RhdGVCeUF4aXM6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlQnlBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYXBwbHlUb0J1ZmZlcjpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5hcHBseVRvQnVmZmVyKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoYil9LGFwcGx5VG9WZWN0b3IzQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAuYXBwbHlUb1ZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LG1ha2VGcnVzdHVtOmZ1bmN0aW9uKGIsZSxoLG0sdSx3KXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tYWtlRnJ1c3R1bSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAubWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIGluc3RlYWQuIik7CnJldHVybiB0aGlzLm1ha2VQZXJzcGVjdGl2ZShiLGUsbSxoLHUsdyl9fSk7UmIucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uTGluZT1mdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLlBsYW5lOiAuaXNJbnRlcnNlY3Rpb25MaW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0xpbmUoKS4iKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzTGluZShiKX07Zi5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzPWZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBpcyBub3cgdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApIGluc3RlYWQuIik7cmV0dXJuIGIuYXBwbHlRdWF0ZXJuaW9uKHRoaXMpfTtPYmplY3QuYXNzaWduKEQucHJvdG90eXBlLHtpc0ludGVyc2VjdGlvbkJveDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLiIpOwpyZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KGIpfSxpc0ludGVyc2VjdGlvblBsYW5lOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25QbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNQbGFuZSgpLiIpO3JldHVybiB0aGlzLmludGVyc2VjdHNQbGFuZShiKX0saXNJbnRlcnNlY3Rpb25TcGhlcmU6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4iKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKGIpfX0pO09iamVjdC5hc3NpZ24oQi5wcm90b3R5cGUse2FyZWE6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAuYXJlYSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEFyZWEoKS4iKTtyZXR1cm4gdGhpcy5nZXRBcmVhKCl9LGJhcnljb29yZEZyb21Qb2ludDpmdW5jdGlvbihiLAplKXtjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAuYmFyeWNvb3JkRnJvbVBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QmFyeWNvb3JkKCkuIik7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKGIsZSl9LG1pZHBvaW50OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5taWRwb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE1pZHBvaW50KCkuIik7cmV0dXJuIHRoaXMuZ2V0TWlkcG9pbnQoYil9LG5vcm1hbDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAubm9ybWFsKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Tm9ybWFsKCkuIik7cmV0dXJuIHRoaXMuZ2V0Tm9ybWFsKGIpfSxwbGFuZTpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAucGxhbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRQbGFuZSgpLiIpO3JldHVybiB0aGlzLmdldFBsYW5lKGIpfX0pO09iamVjdC5hc3NpZ24oQiwKe2Jhcnljb29yZEZyb21Qb2ludDpmdW5jdGlvbihiLGUsaCxtLHUpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5iYXJ5Y29vcmRGcm9tUG9pbnQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRCYXJ5Y29vcmQoKS4iKTtyZXR1cm4gQi5nZXRCYXJ5Y29vcmQoYixlLGgsbSx1KX0sbm9ybWFsOmZ1bmN0aW9uKGIsZSxoLG0pe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5ub3JtYWwoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXROb3JtYWwoKS4iKTtyZXR1cm4gQi5nZXROb3JtYWwoYixlLGgsbSl9fSk7T2JqZWN0LmFzc2lnbih0ZS5wcm90b3R5cGUse2V4dHJhY3RBbGxQb2ludHM6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5TaGFwZTogLmV4dHJhY3RBbGxQb2ludHMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmV4dHJhY3RQb2ludHMoKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLmV4dHJhY3RQb2ludHMoYil9LGV4dHJ1ZGU6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5TaGFwZTogLmV4dHJ1ZGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXh0cnVkZUdlb21ldHJ5KCkgaW5zdGVhZC4iKTsKcmV0dXJuIG5ldyBTZSh0aGlzLGIpfSxtYWtlR2VvbWV0cnk6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5TaGFwZTogLm1ha2VHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBTaGFwZUdlb21ldHJ5KCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IFRlKHRoaXMsYil9fSk7T2JqZWN0LmFzc2lnbihkLnByb3RvdHlwZSx7ZnJvbUF0dHJpYnV0ZTpmdW5jdGlvbihiLGUsaCl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTtyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKGIsZSxoKX0sZGlzdGFuY2VUb01hbmhhdHRhbjpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5kaXN0YW5jZVRvTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuRGlzdGFuY2VUbygpLiIpO3JldHVybiB0aGlzLm1hbmhhdHRhbkRpc3RhbmNlVG8oYil9LApsZW5ndGhNYW5oYXR0YW46ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4iKTtyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKX19KTtPYmplY3QuYXNzaWduKGcucHJvdG90eXBlLHtzZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlZlY3RvcjM6IC5zZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBpbnN0ZWFkLiIpfSxzZXRFdWxlckZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuVmVjdG9yMzogLnNldEV1bGVyRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXVsZXIuc2V0RnJvbVF1YXRlcm5pb24oKSBpbnN0ZWFkLiIpfSxnZXRQb3NpdGlvbkZyb21NYXRyaXg6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZ2V0UG9zaXRpb25Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCkuIik7CnJldHVybiB0aGlzLnNldEZyb21NYXRyaXhQb3NpdGlvbihiKX0sZ2V0U2NhbGVGcm9tTWF0cml4OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmdldFNjYWxlRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhTY2FsZSgpLiIpO3JldHVybiB0aGlzLnNldEZyb21NYXRyaXhTY2FsZShiKX0sZ2V0Q29sdW1uRnJvbU1hdHJpeDpmdW5jdGlvbihiLGUpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmdldENvbHVtbkZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4Q29sdW1uKCkuIik7cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbihlLGIpfSxhcHBseVByb2plY3Rpb246ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuYXBwbHlQcm9qZWN0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5hcHBseU1hdHJpeDQoIG0gKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLmFwcGx5TWF0cml4NChiKX0sCmZyb21BdHRyaWJ1dGU6ZnVuY3Rpb24oYixlLGgpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuIik7cmV0dXJuIHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShiLGUsaCl9LGRpc3RhbmNlVG9NYW5oYXR0YW46ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZGlzdGFuY2VUb01hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkRpc3RhbmNlVG8oKS4iKTtyZXR1cm4gdGhpcy5tYW5oYXR0YW5EaXN0YW5jZVRvKGIpfSxsZW5ndGhNYW5oYXR0YW46ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4iKTtyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKX19KTtPYmplY3QuYXNzaWduKG4ucHJvdG90eXBlLAp7ZnJvbUF0dHJpYnV0ZTpmdW5jdGlvbihiLGUsaCl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3I0OiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTtyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKGIsZSxoKX0sbGVuZ3RoTWFuaGF0dGFuOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3I0OiAubGVuZ3RoTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuTGVuZ3RoKCkuIik7cmV0dXJuIHRoaXMubWFuaGF0dGFuTGVuZ3RoKCl9fSk7T2JqZWN0LmFzc2lnbih6YS5wcm90b3R5cGUse2NvbXB1dGVUYW5nZW50czpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sY29tcHV0ZUxpbmVEaXN0YW5jZXM6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5HZW9tZXRyeTogLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBpbnN0ZWFkLiIpfX0pOwpPYmplY3QuYXNzaWduKHkucHJvdG90eXBlLHtnZXRDaGlsZEJ5TmFtZTpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuZ2V0Q2hpbGRCeU5hbWUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRPYmplY3RCeU5hbWUoKS4iKTtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeU5hbWUoYil9LHJlbmRlckRlcHRoOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnJlbmRlckRlcHRoIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAucmVuZGVyT3JkZXIsIGluc3RlYWQuIil9LHRyYW5zbGF0ZTpmdW5jdGlvbihiLGUpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhlLGIpfSxnZXRXb3JsZFJvdGF0aW9uOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFJvdGF0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk9iamVjdDNELmdldFdvcmxkUXVhdGVybmlvbiggdGFyZ2V0ICkgaW5zdGVhZC4iKX19KTsKT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeS5wcm90b3R5cGUse2V1bGVyT3JkZXI6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuIik7cmV0dXJuIHRoaXMucm90YXRpb24ub3JkZXJ9LHNldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuZXVsZXJPcmRlciBpcyBub3cgLnJvdGF0aW9uLm9yZGVyLiIpO3RoaXMucm90YXRpb24ub3JkZXI9Yn19LHVzZVF1YXRlcm5pb246e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuIil9fX0pOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlaC5wcm90b3R5cGUse29iamVjdHM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTE9EOiAub2JqZWN0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5sZXZlbHMuIik7cmV0dXJuIHRoaXMubGV2ZWxzfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoemkucHJvdG90eXBlLCJ1c2VWZXJ0ZXhUZXh0dXJlIix7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbjogdXNlVmVydGV4VGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlNrZWxldG9uOiB1c2VWZXJ0ZXhUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIil9fSk7ZmgucHJvdG90eXBlLmluaXRCb25lcz1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNraW5uZWRNZXNoOiBpbml0Qm9uZXMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYWIucHJvdG90eXBlLAoiX19hcmNMZW5ndGhEaXZpc2lvbnMiLHtnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlOiAuX19hcmNMZW5ndGhEaXZpc2lvbnMgaXMgbm93IC5hcmNMZW5ndGhEaXZpc2lvbnMuIik7cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zfSxzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZTogLl9fYXJjTGVuZ3RoRGl2aXNpb25zIGlzIG5vdyAuYXJjTGVuZ3RoRGl2aXNpb25zLiIpO3RoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPWJ9fSk7QWIucHJvdG90eXBlLnNldExlbnM9ZnVuY3Rpb24oYixlKXtjb25zb2xlLndhcm4oIlRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhLnNldExlbnMgaXMgZGVwcmVjYXRlZC4gVXNlIC5zZXRGb2NhbExlbmd0aCBhbmQgLmZpbG1HYXVnZSBmb3IgYSBwaG90b2dyYXBoaWMgc2V0dXAuIik7dm9pZCAwIT09ZSYmKHRoaXMuZmlsbUdhdWdlPWUpO3RoaXMuc2V0Rm9jYWxMZW5ndGgoYil9O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFViLnByb3RvdHlwZSwKe29ubHlTaGFkb3c6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5vbmx5U2hhZG93IGhhcyBiZWVuIHJlbW92ZWQuIil9fSxzaGFkb3dDYW1lcmFGb3Y6e3NldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhRm92IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5mb3YuIik7dGhpcy5zaGFkb3cuY2FtZXJhLmZvdj1ifX0sc2hhZG93Q2FtZXJhTGVmdDp7c2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFMZWZ0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5sZWZ0LiIpO3RoaXMuc2hhZG93LmNhbWVyYS5sZWZ0PWJ9fSxzaGFkb3dDYW1lcmFSaWdodDp7c2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFSaWdodCBpcyBub3cgLnNoYWRvdy5jYW1lcmEucmlnaHQuIik7dGhpcy5zaGFkb3cuY2FtZXJhLnJpZ2h0PWJ9fSxzaGFkb3dDYW1lcmFUb3A6e3NldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVG9wIGlzIG5vdyAuc2hhZG93LmNhbWVyYS50b3AuIik7CnRoaXMuc2hhZG93LmNhbWVyYS50b3A9Yn19LHNoYWRvd0NhbWVyYUJvdHRvbTp7c2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFCb3R0b20gaXMgbm93IC5zaGFkb3cuY2FtZXJhLmJvdHRvbS4iKTt0aGlzLnNoYWRvdy5jYW1lcmEuYm90dG9tPWJ9fSxzaGFkb3dDYW1lcmFOZWFyOntzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYU5lYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLm5lYXIuIik7dGhpcy5zaGFkb3cuY2FtZXJhLm5lYXI9Yn19LHNoYWRvd0NhbWVyYUZhcjp7c2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZhci4iKTt0aGlzLnNoYWRvdy5jYW1lcmEuZmFyPWJ9fSxzaGFkb3dDYW1lcmFWaXNpYmxlOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVmlzaWJsZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkNhbWVyYUhlbHBlciggbGlnaHQuc2hhZG93LmNhbWVyYSApIGluc3RlYWQuIil9fSwKc2hhZG93Qmlhczp7c2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dCaWFzIGlzIG5vdyAuc2hhZG93LmJpYXMuIik7dGhpcy5zaGFkb3cuYmlhcz1ifX0sc2hhZG93RGFya25lc3M6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dEYXJrbmVzcyBoYXMgYmVlbiByZW1vdmVkLiIpfX0sc2hhZG93TWFwV2lkdGg6e3NldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93TWFwV2lkdGggaXMgbm93IC5zaGFkb3cubWFwU2l6ZS53aWR0aC4iKTt0aGlzLnNoYWRvdy5tYXBTaXplLndpZHRoPWJ9fSxzaGFkb3dNYXBIZWlnaHQ6e3NldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93TWFwSGVpZ2h0IGlzIG5vdyAuc2hhZG93Lm1hcFNpemUuaGVpZ2h0LiIpO3RoaXMuc2hhZG93Lm1hcFNpemUuaGVpZ2h0PWJ9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFIucHJvdG90eXBlLAp7bGVuZ3RoOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmxlbmd0aCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmNvdW50IGluc3RlYWQuIik7cmV0dXJuIHRoaXMuYXJyYXkubGVuZ3RofX0sY29weUluZGljZXNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmNvcHlJbmRpY2VzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfX0pO09iamVjdC5hc3NpZ24oeGEucHJvdG90eXBlLHthZGRJbmRleDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkSW5kZXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRJbmRleCgpLiIpO3RoaXMuc2V0SW5kZXgoYil9LGFkZERyYXdDYWxsOmZ1bmN0aW9uKGIsZSxoKXt2b2lkIDAhPT1oJiZjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkRHJhd0NhbGwoKSBubyBsb25nZXIgc3VwcG9ydHMgaW5kZXhPZmZzZXQuIik7CmNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGREcmF3Q2FsbCgpIGlzIG5vdyAuYWRkR3JvdXAoKS4iKTt0aGlzLmFkZEdyb3VwKGIsZSl9LGNsZWFyRHJhd0NhbGxzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNsZWFyRHJhd0NhbGxzKCkgaXMgbm93IC5jbGVhckdyb3VwcygpLiIpO3RoaXMuY2xlYXJHcm91cHMoKX0sY29tcHV0ZVRhbmdlbnRzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGNvbXB1dGVPZmZzZXRzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVPZmZzZXRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh4YS5wcm90b3R5cGUse2RyYXdjYWxsczp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5kcmF3Y2FsbHMgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ3JvdXBzLiIpOwpyZXR1cm4gdGhpcy5ncm91cHN9fSxvZmZzZXRzOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAub2Zmc2V0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuIik7cmV0dXJuIHRoaXMuZ3JvdXBzfX19KTtPYmplY3QuYXNzaWduKHpkLnByb3RvdHlwZSx7Z2V0QXJyYXlzOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiAuZ2V0QXJyYXlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYWRkU2hhcGVMaXN0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiAuYWRkU2hhcGVMaXN0KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYWRkU2hhcGU6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IC5hZGRTaGFwZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoWmkucHJvdG90eXBlLAp7ZHluYW1pYzp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5Vbmlmb3JtOiAuZHluYW1pYyBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4iKX19LG9uVXBkYXRlOnt2YWx1ZTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuVW5pZm9ybTogLm9uVXBkYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG9iamVjdC5vbkJlZm9yZVJlbmRlcigpIGluc3RlYWQuIik7cmV0dXJuIHRoaXN9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE0ucHJvdG90eXBlLHt3cmFwQXJvdW5kOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLiIpfX0sb3ZlcmRyYXc6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6IC5vdmVyZHJhdyBoYXMgYmVlbiByZW1vdmVkLiIpfSwKc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbDogLm92ZXJkcmF3IGhhcyBiZWVuIHJlbW92ZWQuIil9fSx3cmFwUkdCOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcFJHQiBoYXMgYmVlbiByZW1vdmVkLiIpO3JldHVybiBuZXcgSX19LHNoYWRpbmc6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLiIrdGhpcy50eXBlKyI6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLiIpO3RoaXMuZmxhdFNoYWRpbmc9MT09PWJ9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGRkLnByb3RvdHlwZSx7bWV0YWw6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw6IC5tZXRhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgaW5zdGVhZC4iKTsKcmV0dXJuITF9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw6IC5tZXRhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgaW5zdGVhZCIpfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh1Yi5wcm90b3R5cGUse2Rlcml2YXRpdmVzOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlc30sc2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuIFNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuIik7dGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzPWJ9fX0pO09iamVjdC5hc3NpZ24ocmsucHJvdG90eXBlLAp7Y2xlYXJUYXJnZXQ6ZnVuY3Rpb24oYixlLGgsbSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuY2xlYXJUYXJnZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnNldFJlbmRlclRhcmdldCgpIGFuZCAuY2xlYXIoKSBpbnN0ZWFkLiIpO3RoaXMuc2V0UmVuZGVyVGFyZ2V0KGIpO3RoaXMuY2xlYXIoZSxoLG0pfSxhbmltYXRlOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFuaW1hdGUoKSBpcyBub3cgLnNldEFuaW1hdGlvbkxvb3AoKS4iKTt0aGlzLnNldEFuaW1hdGlvbkxvb3AoYil9LGdldEN1cnJlbnRSZW5kZXJUYXJnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRDdXJyZW50UmVuZGVyVGFyZ2V0KCkgaXMgbm93IC5nZXRSZW5kZXJUYXJnZXQoKS4iKTtyZXR1cm4gdGhpcy5nZXRSZW5kZXJUYXJnZXQoKX0sZ2V0TWF4QW5pc290cm9weTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldE1heEFuaXNvdHJvcHkoKSBpcyBub3cgLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCkuIik7CnJldHVybiB0aGlzLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCl9LGdldFByZWNpc2lvbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldFByZWNpc2lvbigpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLnByZWNpc2lvbi4iKTtyZXR1cm4gdGhpcy5jYXBhYmlsaXRpZXMucHJlY2lzaW9ufSxyZXNldEdMU3RhdGU6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5yZXNldEdMU3RhdGUoKSBpcyBub3cgLnN0YXRlLnJlc2V0KCkuIik7cmV0dXJuIHRoaXMuc3RhdGUucmVzZXQoKX0sc3VwcG9ydHNGbG9hdFRleHR1cmVzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJPRVNfdGV4dHVyZV9mbG9hdCIpfSwKc3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlczpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSGFsZkZsb2F0VGV4dHVyZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKS4iKTtyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCgiT0VTX3RleHR1cmVfaGFsZl9mbG9hdCIpfSxzdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMiKX0sc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVMzVEM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKS4iKTsKcmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil9LHN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQzpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICkuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpfSxzdXBwb3J0c0JsZW5kTWluTWF4OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNCbGVuZE1pbk1heCgpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdFWFRfYmxlbmRfbWlubWF4JyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJFWFRfYmxlbmRfbWlubWF4Iil9LHN1cHBvcnRzVmVydGV4VGV4dHVyZXM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1ZlcnRleFRleHR1cmVzKCkgaXMgbm93IC5jYXBhYmlsaXRpZXMudmVydGV4VGV4dHVyZXMuIik7CnJldHVybiB0aGlzLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlc30sc3VwcG9ydHNJbnN0YW5jZWRBcnJheXM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0luc3RhbmNlZEFycmF5cygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIil9LGVuYWJsZVNjaXNzb3JUZXN0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmVuYWJsZVNjaXNzb3JUZXN0KCkgaXMgbm93IC5zZXRTY2lzc29yVGVzdCgpLiIpO3RoaXMuc2V0U2Npc3NvclRlc3QoYil9LGluaXRNYXRlcmlhbDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmluaXRNYXRlcmlhbCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGFkZFByZVBsdWdpbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFkZFByZVBsdWdpbigpIGhhcyBiZWVuIHJlbW92ZWQuIil9LAphZGRQb3N0UGx1Z2luOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWRkUG9zdFBsdWdpbigpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHVwZGF0ZVNoYWRvd01hcDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnVwZGF0ZVNoYWRvd01hcCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldEZhY2VDdWxsaW5nOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0RmFjZUN1bGxpbmcoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhbGxvY1RleHR1cmVVbml0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWxsb2NUZXh0dXJlVW5pdCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldFRleHR1cmU6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRUZXh0dXJlKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sc2V0VGV4dHVyZTJEOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZTJEKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sCnNldFRleHR1cmVDdWJlOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZUN1YmUoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxnZXRBY3RpdmVNaXBNYXBMZXZlbDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldEFjdGl2ZU1pcE1hcExldmVsKCkgaXMgbm93IC5nZXRBY3RpdmVNaXBtYXBMZXZlbCgpLiIpO3JldHVybiB0aGlzLmdldEFjdGl2ZU1pcG1hcExldmVsKCl9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMocmsucHJvdG90eXBlLHtzaGFkb3dNYXBFbmFibGVkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaGFkb3dNYXAuZW5hYmxlZH0sc2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEVuYWJsZWQgaXMgbm93IC5zaGFkb3dNYXAuZW5hYmxlZC4iKTt0aGlzLnNoYWRvd01hcC5lbmFibGVkPWJ9fSxzaGFkb3dNYXBUeXBlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaGFkb3dNYXAudHlwZX0sCnNldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBUeXBlIGlzIG5vdyAuc2hhZG93TWFwLnR5cGUuIik7dGhpcy5zaGFkb3dNYXAudHlwZT1ifX0sc2hhZG93TWFwQ3VsbEZhY2U6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9fSxjb250ZXh0OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5jb250ZXh0IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuZ2V0Q29udGV4dCgpIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuZ2V0Q29udGV4dCgpfX19KTsKT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRW4ucHJvdG90eXBlLHtjdWxsRmFjZTp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5jdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX0scmVuZGVyUmV2ZXJzZVNpZGVkOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyUmV2ZXJzZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX19LApyZW5kZXJTaW5nbGVTaWRlZDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclNpbmdsZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJTaW5nbGVTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhiYy5wcm90b3R5cGUse2FjdGl2ZUN1YmVGYWNlOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0Q3ViZTogLmFjdGl2ZUN1YmVGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIEl0IGlzIG5vdyB0aGUgc2Vjb25kIHBhcmFtZXRlciBvZiBXZWJHTFJlbmRlcmVyLnNldFJlbmRlclRhcmdldCgpLiIpfX0sCmFjdGl2ZU1pcE1hcExldmVsOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0Q3ViZTogLmFjdGl2ZU1pcE1hcExldmVsIGhhcyBiZWVuIHJlbW92ZWQuIEl0IGlzIG5vdyB0aGUgdGhpcmQgcGFyYW1ldGVyIG9mIFdlYkdMUmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCkuIil9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHAucHJvdG90eXBlLHt3cmFwUzp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBTfSxzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4iKTt0aGlzLnRleHR1cmUud3JhcFM9Yn19LHdyYXBUOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULiIpOwpyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBUfSxzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBUIGlzIG5vdyAudGV4dHVyZS53cmFwVC4iKTt0aGlzLnRleHR1cmUud3JhcFQ9Yn19LG1hZ0ZpbHRlcjp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLiIpO3JldHVybiB0aGlzLnRleHR1cmUubWFnRmlsdGVyfSxzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLiIpO3RoaXMudGV4dHVyZS5tYWdGaWx0ZXI9Yn19LG1pbkZpbHRlcjp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1pbkZpbHRlciBpcyBub3cgLnRleHR1cmUubWluRmlsdGVyLiIpO3JldHVybiB0aGlzLnRleHR1cmUubWluRmlsdGVyfSwKc2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4iKTt0aGlzLnRleHR1cmUubWluRmlsdGVyPWJ9fSxhbmlzb3Ryb3B5OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLmFuaXNvdHJvcHl9LHNldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4iKTt0aGlzLnRleHR1cmUuYW5pc290cm9weT1ifX0sb2Zmc2V0OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5vZmZzZXR9LApzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm9mZnNldCBpcyBub3cgLnRleHR1cmUub2Zmc2V0LiIpO3RoaXMudGV4dHVyZS5vZmZzZXQ9Yn19LHJlcGVhdDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnJlcGVhdCBpcyBub3cgLnRleHR1cmUucmVwZWF0LiIpO3JldHVybiB0aGlzLnRleHR1cmUucmVwZWF0fSxzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnJlcGVhdCBpcyBub3cgLnRleHR1cmUucmVwZWF0LiIpO3RoaXMudGV4dHVyZS5yZXBlYXQ9Yn19LGZvcm1hdDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LiIpO3JldHVybiB0aGlzLnRleHR1cmUuZm9ybWF0fSxzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LiIpOwp0aGlzLnRleHR1cmUuZm9ybWF0PWJ9fSx0eXBlOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLnR5cGV9LHNldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4iKTt0aGlzLnRleHR1cmUudHlwZT1ifX0sZ2VuZXJhdGVNaXBtYXBzOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZ2VuZXJhdGVNaXBtYXBzIGlzIG5vdyAudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHN9LHNldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZ2VuZXJhdGVNaXBtYXBzIGlzIG5vdyAudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMuIik7CnRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9Yn19fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMocWsucHJvdG90eXBlLHtzdGFuZGluZzp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJWUk1hbmFnZXI6IC5zdGFuZGluZyBoYXMgYmVlbiByZW1vdmVkLiIpfX0sdXNlckhlaWdodDp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJWUk1hbmFnZXI6IC51c2VySGVpZ2h0IGhhcyBiZWVuIHJlbW92ZWQuIil9fX0pO2dnLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IC5sb2FkIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5BdWRpb0xvYWRlciBpbnN0ZWFkLiIpO3ZhciBlPXRoaXM7KG5ldyBYaSkubG9hZChiLGZ1bmN0aW9uKGgpe2Uuc2V0QnVmZmVyKGgpfSk7cmV0dXJuIHRoaXN9O1NrLnByb3RvdHlwZS5nZXREYXRhPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpb0FuYWx5c2VyOiAuZ2V0RGF0YSgpIGlzIG5vdyAuZ2V0RnJlcXVlbmN5RGF0YSgpLiIpOwpyZXR1cm4gdGhpcy5nZXRGcmVxdWVuY3lEYXRhKCl9O1BiLnByb3RvdHlwZS51cGRhdGVDdWJlTWFwPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5DdWJlQ2FtZXJhOiAudXBkYXRlQ3ViZU1hcCgpIGlzIG5vdyAudXBkYXRlKCkuIik7cmV0dXJuIHRoaXMudXBkYXRlKGIsZSl9O3VlLmNyb3NzT3JpZ2luPXZvaWQgMDt1ZS5sb2FkVGV4dHVyZT1mdW5jdGlvbihiLGUsaCxtKXtjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlVXRpbHMubG9hZFRleHR1cmUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLlRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLiIpO3ZhciB1PW5ldyBKaTt1LnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pO2I9dS5sb2FkKGIsaCx2b2lkIDAsbSk7ZSYmKGIubWFwcGluZz1lKTtyZXR1cm4gYn07dWUubG9hZFRleHR1cmVDdWJlPWZ1bmN0aW9uKGIsZSxoLG0pe2NvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZUN1YmUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkN1YmVUZXh0dXJlTG9hZGVyKCkgaW5zdGVhZC4iKTsKdmFyIHU9bmV3IElpO3Uuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7Yj11LmxvYWQoYixoLHZvaWQgMCxtKTtlJiYoYi5tYXBwaW5nPWUpO3JldHVybiBifTt1ZS5sb2FkQ29tcHJlc3NlZFRleHR1cmU9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRERTTG9hZGVyIGluc3RlYWQuIil9O3VlLmxvYWRDb21wcmVzc2VkVGV4dHVyZUN1YmU9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZUN1YmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkREU0xvYWRlciBpbnN0ZWFkLiIpfTthLkFDRVNGaWxtaWNUb25lTWFwcGluZz01O2EuQWRkRXF1YXRpb249MTAwO2EuQWRkT3BlcmF0aW9uPTI7YS5BZGRpdGl2ZUJsZW5kaW5nPTI7YS5BbHBoYUZvcm1hdD0xMDIxO2EuQWx3YXlzRGVwdGg9CjE7YS5BbHdheXNTdGVuY2lsRnVuYz01MTk7YS5BbWJpZW50TGlnaHQ9UWk7YS5BbWJpZW50TGlnaHRQcm9iZT1OazthLkFuaW1hdGlvbkNsaXA9UmM7YS5BbmltYXRpb25Mb2FkZXI9RWs7YS5BbmltYXRpb25NaXhlcj1VazthLkFuaW1hdGlvbk9iamVjdEdyb3VwPWFvO2EuQW5pbWF0aW9uVXRpbHM9amM7YS5BcmNDdXJ2ZT1mZzthLkFycmF5Q2FtZXJhPSRnO2EuQXJyb3dIZWxwZXI9U2Q7YS5BdWRpbz1nZzthLkF1ZGlvQW5hbHlzZXI9U2s7YS5BdWRpb0NvbnRleHQ9UWs7YS5BdWRpb0xpc3RlbmVyPVBrO2EuQXVkaW9Mb2FkZXI9WGk7YS5BeGVzSGVscGVyPU5oO2EuQXhpc0hlbHBlcj1mdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkF4aXNIZWxwZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5BeGVzSGVscGVyLiIpO3JldHVybiBuZXcgTmgoYil9O2EuQmFja1NpZGU9MTthLkJhc2ljRGVwdGhQYWNraW5nPTMyMDA7YS5CYXNpY1NoYWRvd01hcD0wO2EuQmluYXJ5VGV4dHVyZUxvYWRlcj0KZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5CaW5hcnlUZXh0dXJlTG9hZGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuRGF0YVRleHR1cmVMb2FkZXIuIik7cmV0dXJuIG5ldyBIaShiKX07YS5Cb25lPXhrO2EuQm9vbGVhbktleWZyYW1lVHJhY2s9RGk7YS5Cb3VuZGluZ0JveEhlbHBlcj1mdW5jdGlvbihiLGUpe2NvbnNvbGUud2FybigiVEhSRUUuQm91bmRpbmdCb3hIZWxwZXIgaGFzIGJlZW4gZGVwcmVjYXRlZC4gQ3JlYXRpbmcgYSBUSFJFRS5Cb3hIZWxwZXIgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IFJkKGIsZSl9O2EuQm94Mj1YazthLkJveDM9eDthLkJveDNIZWxwZXI9TGg7YS5Cb3hCdWZmZXJHZW9tZXRyeT1aYTthLkJveEdlb21ldHJ5PVVhO2EuQm94SGVscGVyPVJkO2EuQnVmZmVyQXR0cmlidXRlPVI7YS5CdWZmZXJHZW9tZXRyeT14YTthLkJ1ZmZlckdlb21ldHJ5TG9hZGVyPVZpO2EuQnl0ZVR5cGU9MTAxMDthLkNhY2hlPWdmO2EuQ2FtZXJhPUZiO2EuQ2FtZXJhSGVscGVyPQpLaDthLkNhbnZhc1JlbmRlcmVyPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQ2FudmFzUmVuZGVyZXIgaGFzIGJlZW4gcmVtb3ZlZCIpfTthLkNhbnZhc1RleHR1cmU9Z2g7YS5DYXRtdWxsUm9tQ3VydmUzPXVjO2EuQ2luZW9uVG9uZU1hcHBpbmc9NDthLkNpcmNsZUJ1ZmZlckdlb21ldHJ5PWFnO2EuQ2lyY2xlR2VvbWV0cnk9Qmg7YS5DbGFtcFRvRWRnZVdyYXBwaW5nPTEwMDE7YS5DbG9jaz1PazthLkNsb3NlZFNwbGluZUN1cnZlMz1pbzthLkNvbG9yPUk7YS5Db2xvcktleWZyYW1lVHJhY2s9RWk7YS5Db21wcmVzc2VkVGV4dHVyZT1PZjthLkNvbXByZXNzZWRUZXh0dXJlTG9hZGVyPUZrO2EuQ29uZUJ1ZmZlckdlb21ldHJ5PUFoO2EuQ29uZUdlb21ldHJ5PXpoO2EuQ3ViZUNhbWVyYT1QYjthLkN1YmVHZW9tZXRyeT1VYTthLkN1YmVSZWZsZWN0aW9uTWFwcGluZz0zMDE7YS5DdWJlUmVmcmFjdGlvbk1hcHBpbmc9MzAyO2EuQ3ViZVRleHR1cmU9TWQ7YS5DdWJlVGV4dHVyZUxvYWRlcj0KSWk7YS5DdWJlVVZSZWZsZWN0aW9uTWFwcGluZz0zMDY7YS5DdWJlVVZSZWZyYWN0aW9uTWFwcGluZz0zMDc7YS5DdWJpY0JlemllckN1cnZlPWVkO2EuQ3ViaWNCZXppZXJDdXJ2ZTM9QmQ7YS5DdWJpY0ludGVycG9sYW50PUJpO2EuQ3VsbEZhY2VCYWNrPTE7YS5DdWxsRmFjZUZyb250PTI7YS5DdWxsRmFjZUZyb250QmFjaz0zO2EuQ3VsbEZhY2VOb25lPTA7YS5DdXJ2ZT1hYjthLkN1cnZlUGF0aD1RZDthLkN1c3RvbUJsZW5kaW5nPTU7YS5DeWxpbmRlckJ1ZmZlckdlb21ldHJ5PVBkO2EuQ3lsaW5kZXJHZW9tZXRyeT1WZTthLkN5bGluZHJpY2FsPWdvO2EuRGF0YVRleHR1cmU9R2I7YS5EYXRhVGV4dHVyZTJEQXJyYXk9Q2Y7YS5EYXRhVGV4dHVyZTNEPURmO2EuRGF0YVRleHR1cmVMb2FkZXI9SGk7YS5EZWNyZW1lbnRTdGVuY2lsT3A9NzY4MzthLkRlY3JlbWVudFdyYXBTdGVuY2lsT3A9MzQwNTY7YS5EZWZhdWx0TG9hZGluZ01hbmFnZXI9WG47YS5EZXB0aEZvcm1hdD0xMDI2OwphLkRlcHRoU3RlbmNpbEZvcm1hdD0xMDI3O2EuRGVwdGhUZXh0dXJlPWhoO2EuRGlyZWN0aW9uYWxMaWdodD1QaTthLkRpcmVjdGlvbmFsTGlnaHRIZWxwZXI9b2c7YS5EaXJlY3Rpb25hbExpZ2h0U2hhZG93PU9pO2EuRGlzY3JldGVJbnRlcnBvbGFudD1DaTthLkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5PVRmO2EuRG9kZWNhaGVkcm9uR2VvbWV0cnk9bmg7YS5Eb3VibGVTaWRlPTI7YS5Ec3RBbHBoYUZhY3Rvcj0yMDY7YS5Ec3RDb2xvckZhY3Rvcj0yMDg7YS5EeW5hbWljQnVmZmVyQXR0cmlidXRlPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5EeW5hbWljQnVmZmVyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKCkuc2V0RHluYW1pYyggdHJ1ZSApIGluc3RlYWQuIik7cmV0dXJuKG5ldyBSKGIsZSkpLnNldER5bmFtaWMoITApfTthLkVkZ2VzR2VvbWV0cnk9JGY7YS5FZGdlc0hlbHBlcj1mdW5jdGlvbihiLAplKXtjb25zb2xlLndhcm4oIlRIUkVFLkVkZ2VzSGVscGVyIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5FZGdlc0dlb21ldHJ5IGluc3RlYWQuIik7cmV0dXJuIG5ldyBTYihuZXcgJGYoYi5nZW9tZXRyeSksbmV3IE9iKHtjb2xvcjp2b2lkIDAhPT1lP2U6MTY3NzcyMTV9KSl9O2EuRWxsaXBzZUN1cnZlPUxjO2EuRXF1YWxEZXB0aD00O2EuRXF1YWxTdGVuY2lsRnVuYz01MTQ7YS5FcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZz0zMDM7YS5FcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZz0zMDQ7YS5FdWxlcj10O2EuRXZlbnREaXNwYXRjaGVyPWM7YS5FeHRydWRlQnVmZmVyR2VvbWV0cnk9emQ7YS5FeHRydWRlR2VvbWV0cnk9U2U7YS5GYWNlMz1LO2EuRmFjZTQ9ZnVuY3Rpb24oYixlLGgsbSx1LHcsQSl7Y29uc29sZS53YXJuKCJUSFJFRS5GYWNlNCBoYXMgYmVlbiByZW1vdmVkLiBBIFRIUkVFLkZhY2UzIHdpbGwgYmUgY3JlYXRlZCBpbnN0ZWFkLiIpO3JldHVybiBuZXcgSyhiLAplLGgsdSx3LEEpfTthLkZhY2VDb2xvcnM9MTthLkZhY2VOb3JtYWxzSGVscGVyPUpoO2EuRmlsZUxvYWRlcj1TYzthLkZsYXRTaGFkaW5nPTE7YS5GbG9hdDMyQXR0cmlidXRlPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5GbG9hdDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBkYShiLGUpfTthLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGU9ZGE7YS5GbG9hdDY0QXR0cmlidXRlPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5GbG9hdDY0QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBsYShiLGUpfTthLkZsb2F0NjRCdWZmZXJBdHRyaWJ1dGU9bGE7YS5GbG9hdFR5cGU9MTAxNTthLkZvZz14aTthLkZvZ0V4cDI9d2k7YS5Gb250PUtrOwphLkZvbnRMb2FkZXI9TGs7YS5Gcm9udEZhY2VEaXJlY3Rpb25DQ1c9MTthLkZyb250RmFjZURpcmVjdGlvbkNXPTA7YS5Gcm9udFNpZGU9MDthLkZydXN0dW09RWM7YS5HYW1tYUVuY29kaW5nPTMwMDc7YS5HZW9tZXRyeT16YTthLkdlb21ldHJ5VXRpbHM9e21lcmdlOmZ1bmN0aW9uKGIsZSxoKXtjb25zb2xlLndhcm4oIlRIUkVFLkdlb21ldHJ5VXRpbHM6IC5tZXJnZSgpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkubWVyZ2UoIGdlb21ldHJ5MiwgbWF0cml4LCBtYXRlcmlhbEluZGV4T2Zmc2V0ICkgaW5zdGVhZC4iKTtpZihlLmlzTWVzaCl7ZS5tYXRyaXhBdXRvVXBkYXRlJiZlLnVwZGF0ZU1hdHJpeCgpO3ZhciBtPWUubWF0cml4O2U9ZS5nZW9tZXRyeX1iLm1lcmdlKGUsbSxoKX0sY2VudGVyOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuR2VvbWV0cnlVdGlsczogLmNlbnRlcigpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkuY2VudGVyKCkgaW5zdGVhZC4iKTsKcmV0dXJuIGIuY2VudGVyKCl9fTthLkdyZWF0ZXJEZXB0aD02O2EuR3JlYXRlckVxdWFsRGVwdGg9NTthLkdyZWF0ZXJFcXVhbFN0ZW5jaWxGdW5jPTUxODthLkdyZWF0ZXJTdGVuY2lsRnVuYz01MTY7YS5HcmlkSGVscGVyPSRpO2EuR3JvdXA9RmY7YS5IYWxmRmxvYXRUeXBlPTEwMTY7YS5IZW1pc3BoZXJlTGlnaHQ9S2k7YS5IZW1pc3BoZXJlTGlnaHRIZWxwZXI9bGc7YS5IZW1pc3BoZXJlTGlnaHRQcm9iZT1NazthLkljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnk9U2Y7YS5JY29zYWhlZHJvbkdlb21ldHJ5PW1oO2EuSW1hZ2VCaXRtYXBMb2FkZXI9SWs7YS5JbWFnZUxvYWRlcj1lZzthLkltYWdlVXRpbHM9dWU7YS5JbW1lZGlhdGVSZW5kZXJPYmplY3Q9SGg7YS5JbmNyZW1lbnRTdGVuY2lsT3A9NzY4MjthLkluY3JlbWVudFdyYXBTdGVuY2lsT3A9MzQwNTU7YS5JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU9VWk7YS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT1UaTthLkluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyPQpWazthLkludDE2QXR0cmlidXRlPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5JbnQxNkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkludDE2QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IG1hKGIsZSl9O2EuSW50MTZCdWZmZXJBdHRyaWJ1dGU9bWE7YS5JbnQzMkF0dHJpYnV0ZT1mdW5jdGlvbihiLGUpe2NvbnNvbGUud2FybigiVEhSRUUuSW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBjYShiLGUpfTthLkludDMyQnVmZmVyQXR0cmlidXRlPWNhO2EuSW50OEF0dHJpYnV0ZT1mdW5jdGlvbihiLGUpe2NvbnNvbGUud2FybigiVEhSRUUuSW50OEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkludDhCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgVShiLAplKX07YS5JbnQ4QnVmZmVyQXR0cmlidXRlPVU7YS5JbnRUeXBlPTEwMTM7YS5JbnRlcmxlYXZlZEJ1ZmZlcj1PZTthLkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlPWJoO2EuSW50ZXJwb2xhbnQ9S2M7YS5JbnRlcnBvbGF0ZURpc2NyZXRlPTIzMDA7YS5JbnRlcnBvbGF0ZUxpbmVhcj0yMzAxO2EuSW50ZXJwb2xhdGVTbW9vdGg9MjMwMjthLkludmVydFN0ZW5jaWxPcD01Mzg2O2EuSlNPTkxvYWRlcj1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkpTT05Mb2FkZXIgaGFzIGJlZW4gcmVtb3ZlZC4iKX07YS5LZWVwU3RlbmNpbE9wPTc2ODA7YS5LZXlmcmFtZVRyYWNrPW9jO2EuTE9EPWVoO2EuTGF0aGVCdWZmZXJHZW9tZXRyeT1aZjthLkxhdGhlR2VvbWV0cnk9eWg7YS5MYXllcnM9djthLkxlbnNGbGFyZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkxlbnNGbGFyZSBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvb2JqZWN0cy9MZW5zZmxhcmUuanMiKX07CmEuTGVzc0RlcHRoPTI7YS5MZXNzRXF1YWxEZXB0aD0zO2EuTGVzc0VxdWFsU3RlbmNpbEZ1bmM9NTE1O2EuTGVzc1N0ZW5jaWxGdW5jPTUxMzthLkxpZ2h0PVViO2EuTGlnaHRQcm9iZT1qZDthLkxpZ2h0UHJvYmVIZWxwZXI9bWc7YS5MaWdodFNoYWRvdz1EZDthLkxpbmU9bWM7YS5MaW5lMz1ZazthLkxpbmVCYXNpY01hdGVyaWFsPU9iO2EuTGluZUN1cnZlPUdjO2EuTGluZUN1cnZlMz1mZDthLkxpbmVEYXNoZWRNYXRlcmlhbD1iZjthLkxpbmVMb29wPUFpO2EuTGluZVBpZWNlcz0xO2EuTGluZVNlZ21lbnRzPVNiO2EuTGluZVN0cmlwPTA7YS5MaW5lYXJFbmNvZGluZz0zRTM7YS5MaW5lYXJGaWx0ZXI9MTAwNjthLkxpbmVhckludGVycG9sYW50PUNoO2EuTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyPTEwMDg7YS5MaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyPTEwMDc7YS5MaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXI9MTAwODthLkxpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXI9MTAwNzsKYS5MaW5lYXJUb25lTWFwcGluZz0xO2EuTG9hZGVyPUtiO2EuTG9hZGVyVXRpbHM9c2w7YS5Mb2FkaW5nTWFuYWdlcj1EazthLkxvZ0x1dkVuY29kaW5nPTMwMDM7YS5Mb29wT25jZT0yMjAwO2EuTG9vcFBpbmdQb25nPTIyMDI7YS5Mb29wUmVwZWF0PTIyMDE7YS5MdW1pbmFuY2VBbHBoYUZvcm1hdD0xMDI1O2EuTHVtaW5hbmNlRm9ybWF0PTEwMjQ7YS5NT1VTRT17TEVGVDowLE1JRERMRToxLFJJR0hUOjIsUk9UQVRFOjAsRE9MTFk6MSxQQU46Mn07YS5NYXRlcmlhbD1NO2EuTWF0ZXJpYWxMb2FkZXI9U2k7YS5NYXRoPWxiO2EuTWF0cml4Mz1sO2EuTWF0cml4ND1yO2EuTWF4RXF1YXRpb249MTA0O2EuTWVzaD15YTthLk1lc2hCYXNpY01hdGVyaWFsPUw7YS5NZXNoRGVwdGhNYXRlcmlhbD1tZTthLk1lc2hEaXN0YW5jZU1hdGVyaWFsPW5lO2EuTWVzaEZhY2VNYXRlcmlhbD1mdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk1lc2hGYWNlTWF0ZXJpYWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGFuIEFycmF5IGluc3RlYWQuIik7CnJldHVybiBifTthLk1lc2hMYW1iZXJ0TWF0ZXJpYWw9JGU7YS5NZXNoTWF0Y2FwTWF0ZXJpYWw9YWY7YS5NZXNoTm9ybWFsTWF0ZXJpYWw9WmU7YS5NZXNoUGhvbmdNYXRlcmlhbD1kZDthLk1lc2hQaHlzaWNhbE1hdGVyaWFsPVhlO2EuTWVzaFN0YW5kYXJkTWF0ZXJpYWw9QWQ7YS5NZXNoVG9vbk1hdGVyaWFsPVllO2EuTWluRXF1YXRpb249MTAzO2EuTWlycm9yZWRSZXBlYXRXcmFwcGluZz0xMDAyO2EuTWl4T3BlcmF0aW9uPTE7YS5NdWx0aU1hdGVyaWFsPWZ1bmN0aW9uKGIpe3ZvaWQgMD09PWImJihiPVtdKTtjb25zb2xlLndhcm4oIlRIUkVFLk11bHRpTWF0ZXJpYWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGFuIEFycmF5IGluc3RlYWQuIik7Yi5pc011bHRpTWF0ZXJpYWw9ITA7Yi5tYXRlcmlhbHM9YjtiLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIGIuc2xpY2UoKX07cmV0dXJuIGJ9O2EuTXVsdGlwbHlCbGVuZGluZz00O2EuTXVsdGlwbHlPcGVyYXRpb249MDthLk5lYXJlc3RGaWx0ZXI9CjEwMDM7YS5OZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyPTEwMDU7YS5OZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlcj0xMDA0O2EuTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcj0xMDA1O2EuTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXI9MTAwNDthLk5ldmVyRGVwdGg9MDthLk5ldmVyU3RlbmNpbEZ1bmM9NTEyO2EuTm9CbGVuZGluZz0wO2EuTm9Db2xvcnM9MDthLk5vVG9uZU1hcHBpbmc9MDthLk5vcm1hbEJsZW5kaW5nPTE7YS5Ob3RFcXVhbERlcHRoPTc7YS5Ob3RFcXVhbFN0ZW5jaWxGdW5jPTUxNzthLk51bWJlcktleWZyYW1lVHJhY2s9Y2c7YS5PYmplY3QzRD15O2EuT2JqZWN0TG9hZGVyPVdpO2EuT2JqZWN0U3BhY2VOb3JtYWxNYXA9MTthLk9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeT1QZTthLk9jdGFoZWRyb25HZW9tZXRyeT1saDthLk9uZUZhY3Rvcj0yMDE7YS5PbmVNaW51c0RzdEFscGhhRmFjdG9yPTIwNzthLk9uZU1pbnVzRHN0Q29sb3JGYWN0b3I9MjA5O2EuT25lTWludXNTcmNBbHBoYUZhY3Rvcj0KMjA1O2EuT25lTWludXNTcmNDb2xvckZhY3Rvcj0yMDM7YS5PcnRob2dyYXBoaWNDYW1lcmE9R2g7YS5QQ0ZTaGFkb3dNYXA9MTthLlBDRlNvZnRTaGFkb3dNYXA9MjthLlBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeT1RZjthLlBhcmFtZXRyaWNHZW9tZXRyeT1paDthLlBhcnRpY2xlPWZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuUGFydGljbGUgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5TcHJpdGUuIik7cmV0dXJuIG5ldyBjaChiKX07YS5QYXJ0aWNsZUJhc2ljTWF0ZXJpYWw9ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZUJhc2ljTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4iKTtyZXR1cm4gbmV3IGNkKGIpfTthLlBhcnRpY2xlU3lzdGVtPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZVN5c3RlbSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50cy4iKTtyZXR1cm4gbmV3IE5mKGIsCmUpfTthLlBhcnRpY2xlU3lzdGVtTWF0ZXJpYWw9ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZVN5c3RlbU1hdGVyaWFsIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzTWF0ZXJpYWwuIik7cmV0dXJuIG5ldyBjZChiKX07YS5QYXRoPWlkO2EuUGVyc3BlY3RpdmVDYW1lcmE9QWI7YS5QbGFuZT1SYjthLlBsYW5lQnVmZmVyR2VvbWV0cnk9dGQ7YS5QbGFuZUdlb21ldHJ5PWllO2EuUGxhbmVIZWxwZXI9TWg7YS5Qb2ludENsb3VkPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzLiIpO3JldHVybiBuZXcgTmYoYixlKX07YS5Qb2ludENsb3VkTWF0ZXJpYWw9ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5Qb2ludENsb3VkTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4iKTtyZXR1cm4gbmV3IGNkKGIpfTthLlBvaW50TGlnaHQ9Ck5pO2EuUG9pbnRMaWdodEhlbHBlcj1qZzthLlBvaW50cz1OZjthLlBvaW50c01hdGVyaWFsPWNkO2EuUG9sYXJHcmlkSGVscGVyPWFqO2EuUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5PUZjO2EuUG9seWhlZHJvbkdlb21ldHJ5PWpoO2EuUG9zaXRpb25hbEF1ZGlvPVJrO2EuUG9zaXRpb25hbEF1ZGlvSGVscGVyPW5nO2EuUHJvcGVydHlCaW5kaW5nPXZjO2EuUHJvcGVydHlNaXhlcj1UazthLlF1YWRyYXRpY0JlemllckN1cnZlPWdkO2EuUXVhZHJhdGljQmV6aWVyQ3VydmUzPUNkO2EuUXVhdGVybmlvbj1mO2EuUXVhdGVybmlvbktleWZyYW1lVHJhY2s9RGg7YS5RdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQ9Rmk7YS5SRVZJU0lPTj0iMTA4IjthLlJHQkFEZXB0aFBhY2tpbmc9MzIwMTthLlJHQkFGb3JtYXQ9MTAyMzthLlJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQ9Mzc4MTk7YS5SR0JBX0FTVENfMTB4NV9Gb3JtYXQ9Mzc4MTY7YS5SR0JBX0FTVENfMTB4Nl9Gb3JtYXQ9Mzc4MTc7YS5SR0JBX0FTVENfMTB4OF9Gb3JtYXQ9CjM3ODE4O2EuUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdD0zNzgyMDthLlJHQkFfQVNUQ18xMngxMl9Gb3JtYXQ9Mzc4MjE7YS5SR0JBX0FTVENfNHg0X0Zvcm1hdD0zNzgwODthLlJHQkFfQVNUQ181eDRfRm9ybWF0PTM3ODA5O2EuUkdCQV9BU1RDXzV4NV9Gb3JtYXQ9Mzc4MTA7YS5SR0JBX0FTVENfNng1X0Zvcm1hdD0zNzgxMTthLlJHQkFfQVNUQ182eDZfRm9ybWF0PTM3ODEyO2EuUkdCQV9BU1RDXzh4NV9Gb3JtYXQ9Mzc4MTM7YS5SR0JBX0FTVENfOHg2X0Zvcm1hdD0zNzgxNDthLlJHQkFfQVNUQ184eDhfRm9ybWF0PTM3ODE1O2EuUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0PTM1ODQzO2EuUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0PTM1ODQyO2EuUkdCQV9TM1RDX0RYVDFfRm9ybWF0PTMzNzc3O2EuUkdCQV9TM1RDX0RYVDNfRm9ybWF0PTMzNzc4O2EuUkdCQV9TM1RDX0RYVDVfRm9ybWF0PTMzNzc5O2EuUkdCREVuY29kaW5nPTMwMDY7YS5SR0JFRW5jb2Rpbmc9MzAwMjthLlJHQkVGb3JtYXQ9CjEwMjM7YS5SR0JGb3JtYXQ9MTAyMjthLlJHQk0xNkVuY29kaW5nPTMwMDU7YS5SR0JNN0VuY29kaW5nPTMwMDQ7YS5SR0JfRVRDMV9Gb3JtYXQ9MzYxOTY7YS5SR0JfUFZSVENfMkJQUFYxX0Zvcm1hdD0zNTg0MTthLlJHQl9QVlJUQ180QlBQVjFfRm9ybWF0PTM1ODQwO2EuUkdCX1MzVENfRFhUMV9Gb3JtYXQ9MzM3NzY7YS5SYXdTaGFkZXJNYXRlcmlhbD1iZzthLlJheT1EO2EuUmF5Y2FzdGVyPWNvO2EuUmVjdEFyZWFMaWdodD1SaTthLlJlY3RBcmVhTGlnaHRIZWxwZXI9a2c7YS5SZWRGb3JtYXQ9MTAyODthLlJlaW5oYXJkVG9uZU1hcHBpbmc9MjthLlJlcGVhdFdyYXBwaW5nPTFFMzthLlJlcGxhY2VTdGVuY2lsT3A9NzY4MTthLlJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uPTEwMjthLlJpbmdCdWZmZXJHZW9tZXRyeT1ZZjthLlJpbmdHZW9tZXRyeT14aDthLlNjZW5lPXo7YS5TY2VuZVV0aWxzPXtjcmVhdGVNdWx0aU1hdGVyaWFsT2JqZWN0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2NlbmVVdGlscyBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvdXRpbHMvU2NlbmVVdGlscy5qcyIpfSwKZGV0YWNoOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2NlbmVVdGlscyBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvdXRpbHMvU2NlbmVVdGlscy5qcyIpfSxhdHRhY2g6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TY2VuZVV0aWxzIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy91dGlscy9TY2VuZVV0aWxzLmpzIil9fTthLlNoYWRlckNodW5rPXdiO2EuU2hhZGVyTGliPXVkO2EuU2hhZGVyTWF0ZXJpYWw9dWI7YS5TaGFkb3dNYXRlcmlhbD1XZTthLlNoYXBlPXRlO2EuU2hhcGVCdWZmZXJHZW9tZXRyeT1VZTthLlNoYXBlR2VvbWV0cnk9VGU7YS5TaGFwZVBhdGg9Sms7YS5TaGFwZVV0aWxzPU9kO2EuU2hvcnRUeXBlPTEwMTE7YS5Ta2VsZXRvbj16aTthLlNrZWxldG9uSGVscGVyPWlnO2EuU2tpbm5lZE1lc2g9Zmg7YS5TbW9vdGhTaGFkaW5nPTI7YS5TcGhlcmU9RjthLlNwaGVyZUJ1ZmZlckdlb21ldHJ5PXNlO2EuU3BoZXJlR2VvbWV0cnk9CndoO2EuU3BoZXJpY2FsPWZvO2EuU3BoZXJpY2FsSGFybW9uaWNzMz1ZaTthLlNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nPTMwNTthLlNwbGluZT0kazthLlNwbGluZUN1cnZlPWhkO2EuU3BsaW5lQ3VydmUzPWpvO2EuU3BvdExpZ2h0PU1pO2EuU3BvdExpZ2h0SGVscGVyPWhnO2EuU3BvdExpZ2h0U2hhZG93PUxpO2EuU3ByaXRlPWNoO2EuU3ByaXRlTWF0ZXJpYWw9cmU7YS5TcmNBbHBoYUZhY3Rvcj0yMDQ7YS5TcmNBbHBoYVNhdHVyYXRlRmFjdG9yPTIxMDthLlNyY0NvbG9yRmFjdG9yPTIwMjthLlN0ZXJlb0NhbWVyYT1abjthLlN0cmluZ0tleWZyYW1lVHJhY2s9R2k7YS5TdWJ0cmFjdEVxdWF0aW9uPTEwMTthLlN1YnRyYWN0aXZlQmxlbmRpbmc9MzthLlRPVUNIPXtST1RBVEU6MCxQQU46MSxET0xMWV9QQU46MixET0xMWV9ST1RBVEU6M307YS5UYW5nZW50U3BhY2VOb3JtYWxNYXA9MDthLlRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk9UmY7YS5UZXRyYWhlZHJvbkdlb21ldHJ5PQpraDthLlRleHRCdWZmZXJHZW9tZXRyeT1YZjthLlRleHRHZW9tZXRyeT12aDthLlRleHR1cmU9azthLlRleHR1cmVMb2FkZXI9Smk7YS5Ub3J1c0J1ZmZlckdlb21ldHJ5PVZmO2EuVG9ydXNHZW9tZXRyeT1xaDthLlRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5PVVmO2EuVG9ydXNLbm90R2VvbWV0cnk9cGg7YS5UcmlhbmdsZT1CO2EuVHJpYW5nbGVGYW5EcmF3TW9kZT0yO2EuVHJpYW5nbGVTdHJpcERyYXdNb2RlPTE7YS5UcmlhbmdsZXNEcmF3TW9kZT0wO2EuVHViZUJ1ZmZlckdlb21ldHJ5PVFlO2EuVHViZUdlb21ldHJ5PW9oO2EuVVZNYXBwaW5nPTMwMDthLlVpbnQxNkF0dHJpYnV0ZT1mdW5jdGlvbihiLGUpe2NvbnNvbGUud2FybigiVEhSRUUuVWludDE2QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDE2QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGFhKGIsZSl9O2EuVWludDE2QnVmZmVyQXR0cmlidXRlPWFhO2EuVWludDMyQXR0cmlidXRlPQpmdW5jdGlvbihiLGUpe2NvbnNvbGUud2FybigiVEhSRUUuVWludDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGZhKGIsZSl9O2EuVWludDMyQnVmZmVyQXR0cmlidXRlPWZhO2EuVWludDhBdHRyaWJ1dGU9ZnVuY3Rpb24oYixlKXtjb25zb2xlLndhcm4oIlRIUkVFLlVpbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDhCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgWShiLGUpfTthLlVpbnQ4QnVmZmVyQXR0cmlidXRlPVk7YS5VaW50OENsYW1wZWRBdHRyaWJ1dGU9ZnVuY3Rpb24oYixlKXtjb25zb2xlLndhcm4oIlRIUkVFLlVpbnQ4Q2xhbXBlZEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBiYShiLAplKX07YS5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU9YmE7YS5VbmNoYXJ0ZWQyVG9uZU1hcHBpbmc9MzthLlVuaWZvcm09Wmk7YS5Vbmlmb3Jtc0xpYj1ZYTthLlVuaWZvcm1zVXRpbHM9QnM7YS5VbnNpZ25lZEJ5dGVUeXBlPTEwMDk7YS5VbnNpZ25lZEludDI0OFR5cGU9MTAyMDthLlVuc2lnbmVkSW50VHlwZT0xMDE0O2EuVW5zaWduZWRTaG9ydDQ0NDRUeXBlPTEwMTc7YS5VbnNpZ25lZFNob3J0NTU1MVR5cGU9MTAxODthLlVuc2lnbmVkU2hvcnQ1NjVUeXBlPTEwMTk7YS5VbnNpZ25lZFNob3J0VHlwZT0xMDEyO2EuVlNNU2hhZG93TWFwPTM7YS5WZWN0b3IyPWQ7YS5WZWN0b3IzPWc7YS5WZWN0b3I0PW47YS5WZWN0b3JLZXlmcmFtZVRyYWNrPWRnO2EuVmVydGV4PWZ1bmN0aW9uKGIsZSxoKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlcnRleCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuVmVjdG9yMyBpbnN0ZWFkLiIpO3JldHVybiBuZXcgZyhiLGUsaCl9O2EuVmVydGV4Q29sb3JzPQoyO2EuVmVydGV4Tm9ybWFsc0hlbHBlcj1JaDthLlZpZGVvVGV4dHVyZT1BazthLldlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQ9cTthLldlYkdMUmVuZGVyVGFyZ2V0PXA7YS5XZWJHTFJlbmRlclRhcmdldEN1YmU9YmM7YS5XZWJHTFJlbmRlcmVyPXJrO2EuV2ViR0xVdGlscz1GbjthLldpcmVmcmFtZUdlb21ldHJ5PVBmO2EuV2lyZWZyYW1lSGVscGVyPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5XaXJlZnJhbWVIZWxwZXIgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLldpcmVmcmFtZUdlb21ldHJ5IGluc3RlYWQuIik7cmV0dXJuIG5ldyBTYihuZXcgUGYoYi5nZW9tZXRyeSksbmV3IE9iKHtjb2xvcjp2b2lkIDAhPT1lP2U6MTY3NzcyMTV9KSl9O2EuV3JhcEFyb3VuZEVuZGluZz0yNDAyO2EuWEhSTG9hZGVyPWZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuWEhSTG9hZGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuRmlsZUxvYWRlci4iKTsKcmV0dXJuIG5ldyBTYyhiKX07YS5aZXJvQ3VydmF0dXJlRW5kaW5nPTI0MDA7YS5aZXJvRmFjdG9yPTIwMDthLlplcm9TbG9wZUVuZGluZz0yNDAxO2EuWmVyb1N0ZW5jaWxPcD0wO2Euc1JHQkVuY29kaW5nPTMwMDE7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy9PcmJpdENvbnRyb2xzLmpzClRIUkVFLk9yYml0Q29udHJvbHM9ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKCl7cmV0dXJuIDIqTWF0aC5QSS82MC82MCpaLmF1dG9Sb3RhdGVTcGVlZH1mdW5jdGlvbiBmKCl7cmV0dXJuIE1hdGgucG93KC45NSxaLnpvb21TcGVlZCl9ZnVuY3Rpb24gZyh1YSl7WmEudGhldGEtPXVhfWZ1bmN0aW9uIGwodWEpe1phLnBoaS09dWF9ZnVuY3Rpb24gayh1YSl7Wi5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYT96Yi89dWE6Wi5vYmplY3QuaXNPcnRob2dyYXBoaWNDYW1lcmE/KFoub2JqZWN0Lnpvb209TWF0aC5tYXgoWi5taW5ab29tLE1hdGgubWluKFoubWF4Wm9vbSxaLm9iamVjdC56b29tKnVhKSksWi5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpLHViPSEwKTooY29uc29sZS53YXJuKCJXQVJOSU5HOiBPcmJpdENvbnRyb2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBkb2xseS96b29tIGRpc2FibGVkLiIpLFouZW5hYmxlWm9vbT0hMSl9ZnVuY3Rpb24gbih1YSl7Wi5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYT8KemIqPXVhOloub2JqZWN0LmlzT3J0aG9ncmFwaGljQ2FtZXJhPyhaLm9iamVjdC56b29tPU1hdGgubWF4KFoubWluWm9vbSxNYXRoLm1pbihaLm1heFpvb20sWi5vYmplY3Quem9vbS91YSkpLFoub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSx1Yj0hMCk6KGNvbnNvbGUud2FybigiV0FSTklORzogT3JiaXRDb250cm9scy5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gZG9sbHkvem9vbSBkaXNhYmxlZC4iKSxaLmVuYWJsZVpvb209ITEpfWZ1bmN0aW9uIHAodWEpe0ZiLnNldCh1YS5jbGllbnRYLHVhLmNsaWVudFkpfWZ1bmN0aW9uIHEodWEpe0VjLnNldCh1YS5jbGllbnRYLHVhLmNsaWVudFkpfWZ1bmN0aW9uIHIodWEpe2JjLnNldCh1YS5jbGllbnRYLHVhLmNsaWVudFkpfWZ1bmN0aW9uIHQodWEpe0FiLnNldCh1YS5jbGllbnRYLHVhLmNsaWVudFkpO1BiLnN1YlZlY3RvcnMoQWIsRmIpLm11bHRpcGx5U2NhbGFyKFoucm90YXRlU3BlZWQpO3VhPQpaLmRvbUVsZW1lbnQ9PT1kb2N1bWVudD9aLmRvbUVsZW1lbnQuYm9keTpaLmRvbUVsZW1lbnQ7ZygyKk1hdGguUEkqUGIueC91YS5jbGllbnRIZWlnaHQpO2woMipNYXRoLlBJKlBiLnkvdWEuY2xpZW50SGVpZ2h0KTtGYi5jb3B5KEFiKTtaLnVwZGF0ZSgpfWZ1bmN0aW9uIHYodWEpe3hjLnNldCh1YS5jbGllbnRYLHVhLmNsaWVudFkpO01lLnN1YlZlY3RvcnMoeGMsRWMpOzA8TWUueT9rKGYoKSk6MD5NZS55JiZuKGYoKSk7RWMuY29weSh4Yyk7Wi51cGRhdGUoKX1mdW5jdGlvbiB5KHVhKXtHYi5zZXQodWEuY2xpZW50WCx1YS5jbGllbnRZKTtSYi5zdWJWZWN0b3JzKEdiLGJjKS5tdWx0aXBseVNjYWxhcihaLnBhblNwZWVkKTtqZShSYi54LFJiLnkpO2JjLmNvcHkoR2IpO1oudXBkYXRlKCl9ZnVuY3Rpb24geigpe31mdW5jdGlvbiB4KHVhKXswPnVhLmRlbHRhWT9uKGYoKSk6MDx1YS5kZWx0YVkmJmsoZigpKTtaLnVwZGF0ZSgpfWZ1bmN0aW9uIEModWEpe3ZhciAkYj0hMTtzd2l0Y2godWEua2V5Q29kZSl7Y2FzZSBaLmtleXMuVVA6amUoMCwKWi5rZXlQYW5TcGVlZCk7JGI9ITA7YnJlYWs7Y2FzZSBaLmtleXMuQk9UVE9NOmplKDAsLVoua2V5UGFuU3BlZWQpOyRiPSEwO2JyZWFrO2Nhc2UgWi5rZXlzLkxFRlQ6amUoWi5rZXlQYW5TcGVlZCwwKTskYj0hMDticmVhaztjYXNlIFoua2V5cy5SSUdIVDpqZSgtWi5rZXlQYW5TcGVlZCwwKSwkYj0hMH0kYiYmKHVhLnByZXZlbnREZWZhdWx0KCksWi51cGRhdGUoKSl9ZnVuY3Rpb24gRih1YSl7MT09dWEudG91Y2hlcy5sZW5ndGg/RmIuc2V0KHVhLnRvdWNoZXNbMF0ucGFnZVgsdWEudG91Y2hlc1swXS5wYWdlWSk6RmIuc2V0KC41Kih1YS50b3VjaGVzWzBdLnBhZ2VYK3VhLnRvdWNoZXNbMV0ucGFnZVgpLC41Kih1YS50b3VjaGVzWzBdLnBhZ2VZK3VhLnRvdWNoZXNbMV0ucGFnZVkpKX1mdW5jdGlvbiBEKHVhKXsxPT11YS50b3VjaGVzLmxlbmd0aD9iYy5zZXQodWEudG91Y2hlc1swXS5wYWdlWCx1YS50b3VjaGVzWzBdLnBhZ2VZKTpiYy5zZXQoLjUqKHVhLnRvdWNoZXNbMF0ucGFnZVgrCnVhLnRvdWNoZXNbMV0ucGFnZVgpLC41Kih1YS50b3VjaGVzWzBdLnBhZ2VZK3VhLnRvdWNoZXNbMV0ucGFnZVkpKX1mdW5jdGlvbiBCKHVhKXt2YXIgJGI9dWEudG91Y2hlc1swXS5wYWdlWC11YS50b3VjaGVzWzFdLnBhZ2VYO3VhPXVhLnRvdWNoZXNbMF0ucGFnZVktdWEudG91Y2hlc1sxXS5wYWdlWTtFYy5zZXQoMCxNYXRoLnNxcnQoJGIqJGIrdWEqdWEpKX1mdW5jdGlvbiBJKHVhKXtaLmVuYWJsZVpvb20mJkIodWEpO1ouZW5hYmxlUGFuJiZEKHVhKX1mdW5jdGlvbiBPKHVhKXtaLmVuYWJsZVpvb20mJkIodWEpO1ouZW5hYmxlUm90YXRlJiZGKHVhKX1mdW5jdGlvbiBQKHVhKXsxPT11YS50b3VjaGVzLmxlbmd0aD9BYi5zZXQodWEudG91Y2hlc1swXS5wYWdlWCx1YS50b3VjaGVzWzBdLnBhZ2VZKTpBYi5zZXQoLjUqKHVhLnRvdWNoZXNbMF0ucGFnZVgrdWEudG91Y2hlc1sxXS5wYWdlWCksLjUqKHVhLnRvdWNoZXNbMF0ucGFnZVkrdWEudG91Y2hlc1sxXS5wYWdlWSkpO1BiLnN1YlZlY3RvcnMoQWIsCkZiKS5tdWx0aXBseVNjYWxhcihaLnJvdGF0ZVNwZWVkKTt1YT1aLmRvbUVsZW1lbnQ9PT1kb2N1bWVudD9aLmRvbUVsZW1lbnQuYm9keTpaLmRvbUVsZW1lbnQ7ZygyKk1hdGguUEkqUGIueC91YS5jbGllbnRIZWlnaHQpO2woMipNYXRoLlBJKlBiLnkvdWEuY2xpZW50SGVpZ2h0KTtGYi5jb3B5KEFiKX1mdW5jdGlvbiBIKHVhKXsxPT11YS50b3VjaGVzLmxlbmd0aD9HYi5zZXQodWEudG91Y2hlc1swXS5wYWdlWCx1YS50b3VjaGVzWzBdLnBhZ2VZKTpHYi5zZXQoLjUqKHVhLnRvdWNoZXNbMF0ucGFnZVgrdWEudG91Y2hlc1sxXS5wYWdlWCksLjUqKHVhLnRvdWNoZXNbMF0ucGFnZVkrdWEudG91Y2hlc1sxXS5wYWdlWSkpO1JiLnN1YlZlY3RvcnMoR2IsYmMpLm11bHRpcGx5U2NhbGFyKFoucGFuU3BlZWQpO2plKFJiLngsUmIueSk7YmMuY29weShHYil9ZnVuY3Rpb24gSyh1YSl7dmFyICRiPXVhLnRvdWNoZXNbMF0ucGFnZVgtdWEudG91Y2hlc1sxXS5wYWdlWDt1YT11YS50b3VjaGVzWzBdLnBhZ2VZLQp1YS50b3VjaGVzWzFdLnBhZ2VZO3hjLnNldCgwLE1hdGguc3FydCgkYiokYit1YSp1YSkpO01lLnNldCgwLE1hdGgucG93KHhjLnkvRWMueSxaLnpvb21TcGVlZCkpO2soTWUueSk7RWMuY29weSh4Yyl9ZnVuY3Rpb24gTSh1YSl7Wi5lbmFibGVab29tJiZLKHVhKTtaLmVuYWJsZVBhbiYmSCh1YSl9ZnVuY3Rpb24gTCh1YSl7Wi5lbmFibGVab29tJiZLKHVhKTtaLmVuYWJsZVJvdGF0ZSYmUCh1YSl9ZnVuY3Rpb24gUigpe31mdW5jdGlvbiBVKHVhKXtpZighMSE9PVouZW5hYmxlZCl7dWEucHJldmVudERlZmF1bHQoKTtaLmRvbUVsZW1lbnQuZm9jdXM/Wi5kb21FbGVtZW50LmZvY3VzKCk6d2luZG93LmZvY3VzKCk7c3dpdGNoKHVhLmJ1dHRvbil7Y2FzZSAwOnN3aXRjaChaLm1vdXNlQnV0dG9ucy5MRUZUKXtjYXNlIFRIUkVFLk1PVVNFLlJPVEFURTppZih1YS5jdHJsS2V5fHx1YS5tZXRhS2V5fHx1YS5zaGlmdEtleSl7aWYoITE9PT1aLmVuYWJsZVBhbilyZXR1cm47cih1YSk7R2E9CkJhLlBBTn1lbHNle2lmKCExPT09Wi5lbmFibGVSb3RhdGUpcmV0dXJuO3AodWEpO0dhPUJhLlJPVEFURX1icmVhaztjYXNlIFRIUkVFLk1PVVNFLlBBTjppZih1YS5jdHJsS2V5fHx1YS5tZXRhS2V5fHx1YS5zaGlmdEtleSl7aWYoITE9PT1aLmVuYWJsZVJvdGF0ZSlyZXR1cm47cCh1YSk7R2E9QmEuUk9UQVRFfWVsc2V7aWYoITE9PT1aLmVuYWJsZVBhbilyZXR1cm47cih1YSk7R2E9QmEuUEFOfWJyZWFrO2RlZmF1bHQ6R2E9QmEuTk9ORX1icmVhaztjYXNlIDE6c3dpdGNoKFoubW91c2VCdXR0b25zLk1JRERMRSl7Y2FzZSBUSFJFRS5NT1VTRS5ET0xMWTppZighMT09PVouZW5hYmxlWm9vbSlyZXR1cm47cSh1YSk7R2E9QmEuRE9MTFk7YnJlYWs7ZGVmYXVsdDpHYT1CYS5OT05FfWJyZWFrO2Nhc2UgMjpzd2l0Y2goWi5tb3VzZUJ1dHRvbnMuUklHSFQpe2Nhc2UgVEhSRUUuTU9VU0UuUk9UQVRFOmlmKCExPT09Wi5lbmFibGVSb3RhdGUpcmV0dXJuO3AodWEpO0dhPUJhLlJPVEFURTsKYnJlYWs7Y2FzZSBUSFJFRS5NT1VTRS5QQU46aWYoITE9PT1aLmVuYWJsZVBhbilyZXR1cm47cih1YSk7R2E9QmEuUEFOO2JyZWFrO2RlZmF1bHQ6R2E9QmEuTk9ORX19R2EhPT1CYS5OT05FJiYoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixZLCExKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIixiYSwhMSksWi5kaXNwYXRjaEV2ZW50KHhhKSl9fWZ1bmN0aW9uIFkodWEpe2lmKCExIT09Wi5lbmFibGVkKXN3aXRjaCh1YS5wcmV2ZW50RGVmYXVsdCgpLEdhKXtjYXNlIEJhLlJPVEFURTppZighMT09PVouZW5hYmxlUm90YXRlKWJyZWFrO3QodWEpO2JyZWFrO2Nhc2UgQmEuRE9MTFk6aWYoITE9PT1aLmVuYWJsZVpvb20pYnJlYWs7dih1YSk7YnJlYWs7Y2FzZSBCYS5QQU46ITEhPT1aLmVuYWJsZVBhbiYmeSh1YSl9fWZ1bmN0aW9uIGJhKHVhKXshMSE9PVouZW5hYmxlZCYmKHoodWEpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsClksITEpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGJhLCExKSxaLmRpc3BhdGNoRXZlbnQoeWEpLEdhPUJhLk5PTkUpfWZ1bmN0aW9uIG1hKHVhKXshMT09PVouZW5hYmxlZHx8ITE9PT1aLmVuYWJsZVpvb218fEdhIT09QmEuTk9ORSYmR2EhPT1CYS5ST1RBVEV8fCh1YS5wcmV2ZW50RGVmYXVsdCgpLHVhLnN0b3BQcm9wYWdhdGlvbigpLFouZGlzcGF0Y2hFdmVudCh4YSkseCh1YSksWi5kaXNwYXRjaEV2ZW50KHlhKSl9ZnVuY3Rpb24gYWEodWEpeyExIT09Wi5lbmFibGVkJiYhMSE9PVouZW5hYmxlS2V5cyYmITEhPT1aLmVuYWJsZVBhbiYmQyh1YSl9ZnVuY3Rpb24gY2EodWEpe2lmKCExIT09Wi5lbmFibGVkKXt1YS5wcmV2ZW50RGVmYXVsdCgpO3N3aXRjaCh1YS50b3VjaGVzLmxlbmd0aCl7Y2FzZSAxOnN3aXRjaChaLnRvdWNoZXMuT05FKXtjYXNlIFRIUkVFLlRPVUNILlJPVEFURTppZighMT09PVouZW5hYmxlUm90YXRlKXJldHVybjtGKHVhKTtHYT0KQmEuVE9VQ0hfUk9UQVRFO2JyZWFrO2Nhc2UgVEhSRUUuVE9VQ0guUEFOOmlmKCExPT09Wi5lbmFibGVQYW4pcmV0dXJuO0QodWEpO0dhPUJhLlRPVUNIX1BBTjticmVhaztkZWZhdWx0OkdhPUJhLk5PTkV9YnJlYWs7Y2FzZSAyOnN3aXRjaChaLnRvdWNoZXMuVFdPKXtjYXNlIFRIUkVFLlRPVUNILkRPTExZX1BBTjppZighMT09PVouZW5hYmxlWm9vbSYmITE9PT1aLmVuYWJsZVBhbilyZXR1cm47SSh1YSk7R2E9QmEuVE9VQ0hfRE9MTFlfUEFOO2JyZWFrO2Nhc2UgVEhSRUUuVE9VQ0guRE9MTFlfUk9UQVRFOmlmKCExPT09Wi5lbmFibGVab29tJiYhMT09PVouZW5hYmxlUm90YXRlKXJldHVybjtPKHVhKTtHYT1CYS5UT1VDSF9ET0xMWV9ST1RBVEU7YnJlYWs7ZGVmYXVsdDpHYT1CYS5OT05FfWJyZWFrO2RlZmF1bHQ6R2E9QmEuTk9ORX1HYSE9PUJhLk5PTkUmJlouZGlzcGF0Y2hFdmVudCh4YSl9fWZ1bmN0aW9uIGZhKHVhKXtpZighMSE9PVouZW5hYmxlZClzd2l0Y2godWEucHJldmVudERlZmF1bHQoKSwKdWEuc3RvcFByb3BhZ2F0aW9uKCksR2Epe2Nhc2UgQmEuVE9VQ0hfUk9UQVRFOmlmKCExPT09Wi5lbmFibGVSb3RhdGUpYnJlYWs7UCh1YSk7Wi51cGRhdGUoKTticmVhaztjYXNlIEJhLlRPVUNIX1BBTjppZighMT09PVouZW5hYmxlUGFuKWJyZWFrO0godWEpO1oudXBkYXRlKCk7YnJlYWs7Y2FzZSBCYS5UT1VDSF9ET0xMWV9QQU46aWYoITE9PT1aLmVuYWJsZVpvb20mJiExPT09Wi5lbmFibGVQYW4pYnJlYWs7TSh1YSk7Wi51cGRhdGUoKTticmVhaztjYXNlIEJhLlRPVUNIX0RPTExZX1JPVEFURTppZighMT09PVouZW5hYmxlWm9vbSYmITE9PT1aLmVuYWJsZVJvdGF0ZSlicmVhaztMKHVhKTtaLnVwZGF0ZSgpO2JyZWFrO2RlZmF1bHQ6R2E9QmEuTk9ORX19ZnVuY3Rpb24gZGEodWEpeyExIT09Wi5lbmFibGVkJiYoUih1YSksWi5kaXNwYXRjaEV2ZW50KHlhKSxHYT1CYS5OT05FKX1mdW5jdGlvbiBsYSh1YSl7ITEhPT1aLmVuYWJsZWQmJnVhLnByZXZlbnREZWZhdWx0KCl9dGhpcy5vYmplY3Q9CmE7dGhpcy5kb21FbGVtZW50PXZvaWQgMCE9PWM/Yzpkb2N1bWVudDt0aGlzLmVuYWJsZWQ9ITA7dGhpcy50YXJnZXQ9bmV3IFRIUkVFLlZlY3RvcjM7dGhpcy5taW5EaXN0YW5jZT0wO3RoaXMubWF4RGlzdGFuY2U9SW5maW5pdHk7dGhpcy5taW5ab29tPTA7dGhpcy5tYXhab29tPUluZmluaXR5O3RoaXMubWluUG9sYXJBbmdsZT0wO3RoaXMubWF4UG9sYXJBbmdsZT1NYXRoLlBJO3RoaXMubWluQXppbXV0aEFuZ2xlPS1JbmZpbml0eTt0aGlzLm1heEF6aW11dGhBbmdsZT1JbmZpbml0eTt0aGlzLmVuYWJsZURhbXBpbmc9ITE7dGhpcy5kYW1waW5nRmFjdG9yPS4wNTt0aGlzLmVuYWJsZVpvb209ITA7dGhpcy56b29tU3BlZWQ9MTt0aGlzLmVuYWJsZVJvdGF0ZT0hMDt0aGlzLnJvdGF0ZVNwZWVkPTE7dGhpcy5lbmFibGVQYW49ITA7dGhpcy5wYW5TcGVlZD0xO3RoaXMuc2NyZWVuU3BhY2VQYW5uaW5nPSExO3RoaXMua2V5UGFuU3BlZWQ9Nzt0aGlzLmF1dG9Sb3RhdGU9ITE7dGhpcy5hdXRvUm90YXRlU3BlZWQ9CjI7dGhpcy5lbmFibGVLZXlzPSEwO3RoaXMua2V5cz17TEVGVDozNyxVUDozOCxSSUdIVDozOSxCT1RUT006NDB9O3RoaXMubW91c2VCdXR0b25zPXtMRUZUOlRIUkVFLk1PVVNFLlJPVEFURSxNSURETEU6VEhSRUUuTU9VU0UuRE9MTFksUklHSFQ6VEhSRUUuTU9VU0UuUEFOfTt0aGlzLnRvdWNoZXM9e09ORTpUSFJFRS5UT1VDSC5ST1RBVEUsVFdPOlRIUkVFLlRPVUNILkRPTExZX1BBTn07dGhpcy50YXJnZXQwPXRoaXMudGFyZ2V0LmNsb25lKCk7dGhpcy5wb3NpdGlvbjA9dGhpcy5vYmplY3QucG9zaXRpb24uY2xvbmUoKTt0aGlzLnpvb20wPXRoaXMub2JqZWN0Lnpvb207dGhpcy5nZXRQb2xhckFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIFVhLnBoaX07dGhpcy5nZXRBemltdXRoYWxBbmdsZT1mdW5jdGlvbigpe3JldHVybiBVYS50aGV0YX07dGhpcy5zYXZlU3RhdGU9ZnVuY3Rpb24oKXtaLnRhcmdldDAuY29weShaLnRhcmdldCk7Wi5wb3NpdGlvbjAuY29weShaLm9iamVjdC5wb3NpdGlvbik7Clouem9vbTA9Wi5vYmplY3Quem9vbX07dGhpcy5yZXNldD1mdW5jdGlvbigpe1oudGFyZ2V0LmNvcHkoWi50YXJnZXQwKTtaLm9iamVjdC5wb3NpdGlvbi5jb3B5KFoucG9zaXRpb24wKTtaLm9iamVjdC56b29tPVouem9vbTA7Wi5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1ouZGlzcGF0Y2hFdmVudChGYSk7Wi51cGRhdGUoKTtHYT1CYS5OT05FfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciB1YT1uZXcgVEhSRUUuVmVjdG9yMywkYj0obmV3IFRIUkVFLlF1YXRlcm5pb24pLnNldEZyb21Vbml0VmVjdG9ycyhhLnVwLG5ldyBUSFJFRS5WZWN0b3IzKDAsMSwwKSksWmM9JGIuY2xvbmUoKS5pbnZlcnNlKCksTGQ9bmV3IFRIUkVFLlZlY3RvcjMsa2U9bmV3IFRIUkVFLlF1YXRlcm5pb247cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHFpPVoub2JqZWN0LnBvc2l0aW9uO3VhLmNvcHkocWkpLnN1YihaLnRhcmdldCk7dWEuYXBwbHlRdWF0ZXJuaW9uKCRiKTtVYS5zZXRGcm9tVmVjdG9yMyh1YSk7ClouYXV0b1JvdGF0ZSYmR2E9PT1CYS5OT05FJiZnKGQoKSk7Wi5lbmFibGVEYW1waW5nPyhVYS50aGV0YSs9WmEudGhldGEqWi5kYW1waW5nRmFjdG9yLFVhLnBoaSs9WmEucGhpKlouZGFtcGluZ0ZhY3Rvcik6KFVhLnRoZXRhKz1aYS50aGV0YSxVYS5waGkrPVphLnBoaSk7VWEudGhldGE9TWF0aC5tYXgoWi5taW5BemltdXRoQW5nbGUsTWF0aC5taW4oWi5tYXhBemltdXRoQW5nbGUsVWEudGhldGEpKTtVYS5waGk9TWF0aC5tYXgoWi5taW5Qb2xhckFuZ2xlLE1hdGgubWluKFoubWF4UG9sYXJBbmdsZSxVYS5waGkpKTtVYS5tYWtlU2FmZSgpO1VhLnJhZGl1cyo9emI7VWEucmFkaXVzPU1hdGgubWF4KFoubWluRGlzdGFuY2UsTWF0aC5taW4oWi5tYXhEaXN0YW5jZSxVYS5yYWRpdXMpKTshMD09PVouZW5hYmxlRGFtcGluZz9aLnRhcmdldC5hZGRTY2FsZWRWZWN0b3IoSWIsWi5kYW1waW5nRmFjdG9yKTpaLnRhcmdldC5hZGQoSWIpO3VhLnNldEZyb21TcGhlcmljYWwoVWEpO3VhLmFwcGx5UXVhdGVybmlvbihaYyk7CnFpLmNvcHkoWi50YXJnZXQpLmFkZCh1YSk7Wi5vYmplY3QubG9va0F0KFoudGFyZ2V0KTshMD09PVouZW5hYmxlRGFtcGluZz8oWmEudGhldGEqPTEtWi5kYW1waW5nRmFjdG9yLFphLnBoaSo9MS1aLmRhbXBpbmdGYWN0b3IsSWIubXVsdGlwbHlTY2FsYXIoMS1aLmRhbXBpbmdGYWN0b3IpKTooWmEuc2V0KDAsMCwwKSxJYi5zZXQoMCwwLDApKTt6Yj0xO3JldHVybiB1Ynx8TGQuZGlzdGFuY2VUb1NxdWFyZWQoWi5vYmplY3QucG9zaXRpb24pPnphfHw4KigxLWtlLmRvdChaLm9iamVjdC5xdWF0ZXJuaW9uKSk+emE/KFouZGlzcGF0Y2hFdmVudChGYSksTGQuY29weShaLm9iamVjdC5wb3NpdGlvbiksa2UuY29weShaLm9iamVjdC5xdWF0ZXJuaW9uKSx1Yj0hMSwhMCk6ITF9fSgpO3RoaXMuZGlzcG9zZT1mdW5jdGlvbigpe1ouZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsbGEsITEpO1ouZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLApVLCExKTtaLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2hlZWwiLG1hLCExKTtaLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsY2EsITEpO1ouZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsZGEsITEpO1ouZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLGZhLCExKTtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLFksITEpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGJhLCExKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsYWEsITEpfTt2YXIgWj10aGlzLEZhPXt0eXBlOiJjaGFuZ2UifSx4YT17dHlwZToic3RhcnQifSx5YT17dHlwZToiZW5kIn0sQmE9e05PTkU6LTEsUk9UQVRFOjAsRE9MTFk6MSxQQU46MixUT1VDSF9ST1RBVEU6MyxUT1VDSF9QQU46NCxUT1VDSF9ET0xMWV9QQU46NSxUT1VDSF9ET0xMWV9ST1RBVEU6Nn0sCkdhPUJhLk5PTkUsemE9MUUtNixVYT1uZXcgVEhSRUUuU3BoZXJpY2FsLFphPW5ldyBUSFJFRS5TcGhlcmljYWwsemI9MSxJYj1uZXcgVEhSRUUuVmVjdG9yMyx1Yj0hMSxGYj1uZXcgVEhSRUUuVmVjdG9yMixBYj1uZXcgVEhSRUUuVmVjdG9yMixQYj1uZXcgVEhSRUUuVmVjdG9yMixiYz1uZXcgVEhSRUUuVmVjdG9yMixHYj1uZXcgVEhSRUUuVmVjdG9yMixSYj1uZXcgVEhSRUUuVmVjdG9yMixFYz1uZXcgVEhSRUUuVmVjdG9yMix4Yz1uZXcgVEhSRUUuVmVjdG9yMixNZT1uZXcgVEhSRUUuVmVjdG9yMixpZT1mdW5jdGlvbigpe3ZhciB1YT1uZXcgVEhSRUUuVmVjdG9yMztyZXR1cm4gZnVuY3Rpb24oJGIsWmMpe3VhLnNldEZyb21NYXRyaXhDb2x1bW4oWmMsMCk7dWEubXVsdGlwbHlTY2FsYXIoLSRiKTtJYi5hZGQodWEpfX0oKSx0ZD1mdW5jdGlvbigpe3ZhciB1YT1uZXcgVEhSRUUuVmVjdG9yMztyZXR1cm4gZnVuY3Rpb24oJGIsWmMpeyEwPT09Wi5zY3JlZW5TcGFjZVBhbm5pbmc/CnVhLnNldEZyb21NYXRyaXhDb2x1bW4oWmMsMSk6KHVhLnNldEZyb21NYXRyaXhDb2x1bW4oWmMsMCksdWEuY3Jvc3NWZWN0b3JzKFoub2JqZWN0LnVwLHVhKSk7dWEubXVsdGlwbHlTY2FsYXIoJGIpO0liLmFkZCh1YSl9fSgpLGplPWZ1bmN0aW9uKCl7dmFyIHVhPW5ldyBUSFJFRS5WZWN0b3IzO3JldHVybiBmdW5jdGlvbigkYixaYyl7dmFyIExkPVouZG9tRWxlbWVudD09PWRvY3VtZW50P1ouZG9tRWxlbWVudC5ib2R5OlouZG9tRWxlbWVudDtpZihaLm9iamVjdC5pc1BlcnNwZWN0aXZlQ2FtZXJhKXt1YS5jb3B5KFoub2JqZWN0LnBvc2l0aW9uKS5zdWIoWi50YXJnZXQpO3ZhciBrZT11YS5sZW5ndGgoKTtrZSo9TWF0aC50YW4oWi5vYmplY3QuZm92LzIqTWF0aC5QSS8xODApO2llKDIqJGIqa2UvTGQuY2xpZW50SGVpZ2h0LFoub2JqZWN0Lm1hdHJpeCk7dGQoMipaYyprZS9MZC5jbGllbnRIZWlnaHQsWi5vYmplY3QubWF0cml4KX1lbHNlIFoub2JqZWN0LmlzT3J0aG9ncmFwaGljQ2FtZXJhPwooaWUoJGIqKFoub2JqZWN0LnJpZ2h0LVoub2JqZWN0LmxlZnQpL1oub2JqZWN0Lnpvb20vTGQuY2xpZW50V2lkdGgsWi5vYmplY3QubWF0cml4KSx0ZChaYyooWi5vYmplY3QudG9wLVoub2JqZWN0LmJvdHRvbSkvWi5vYmplY3Quem9vbS9MZC5jbGllbnRIZWlnaHQsWi5vYmplY3QubWF0cml4KSk6KGNvbnNvbGUud2FybigiV0FSTklORzogT3JiaXRDb250cm9scy5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gcGFuIGRpc2FibGVkLiIpLFouZW5hYmxlUGFuPSExKX19KCk7Wi5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IixsYSwhMSk7Wi5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsVSwhMSk7Wi5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndoZWVsIixtYSwhMSk7Wi5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLGNhLCExKTtaLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLApkYSwhMSk7Wi5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsZmEsITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixhYSwhMSk7dGhpcy51cGRhdGUoKX07VEhSRUUuT3JiaXRDb250cm9scy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShUSFJFRS5FdmVudERpc3BhdGNoZXIucHJvdG90eXBlKTtUSFJFRS5PcmJpdENvbnRyb2xzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1USFJFRS5PcmJpdENvbnRyb2xzO1RIUkVFLk1hcENvbnRyb2xzPWZ1bmN0aW9uKGEsYyl7VEhSRUUuT3JiaXRDb250cm9scy5jYWxsKHRoaXMsYSxjKTt0aGlzLm1vdXNlQnV0dG9ucy5MRUZUPVRIUkVFLk1PVVNFLlBBTjt0aGlzLm1vdXNlQnV0dG9ucy5SSUdIVD1USFJFRS5NT1VTRS5ST1RBVEU7dGhpcy50b3VjaGVzLk9ORT1USFJFRS5UT1VDSC5QQU47dGhpcy50b3VjaGVzLlRXTz1USFJFRS5UT1VDSC5ET0xMWV9ST1RBVEV9OwpUSFJFRS5NYXBDb250cm9scy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShUSFJFRS5FdmVudERpc3BhdGNoZXIucHJvdG90eXBlKTtUSFJFRS5NYXBDb250cm9scy5wcm90b3R5cGUuY29uc3RydWN0b3I9VEhSRUUuTWFwQ29udHJvbHM7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLWRpdmUvbGliL3Nwcml0ZS1hdGxhcy5qcwpjbGFzcyBXcCBleHRlbmRzIFRIUkVFLlRleHR1cmV7Y29uc3RydWN0b3IoYSxjLGQpe2NvbnN0IGY9TWF0aC5jZWlsKE1hdGguc3FydChhKSksZz1NYXRoLmNlaWwoYS9mKSxsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO2wud2lkdGg9YypmO2wuaGVpZ2h0PWQqZztjb25zdCBrPWwuZ2V0Q29udGV4dCgiMmQiKTtzdXBlcihsKTt0aGlzLmNhcGFjaXR5PWE7dGhpcy5pbWFnZVdpZHRoPWM7dGhpcy5pbWFnZUhlaWdodD1kO3RoaXMuc3ByaXRlQ29sdW1ucz1mO3RoaXMuc3ByaXRlUm93cz1nO3RoaXMuY2FudmFzPWw7dGhpcy5jb250ZXh0PWs7dGhpcy5tYWdGaWx0ZXI9dGhpcy5taW5GaWx0ZXI9VEhSRUUuTGluZWFyRmlsdGVyO3RoaXMuZHJhd1RpbWVvdXQ9NTA7dGhpcy53YWl0VGltZW91dD0xO3RoaXMuZHJhd1F1ZXVlPVtdO3RoaXMuaXNEcmF3UXVldWVkPSExO3RoaXMubGFzdENsZWFyVGltZXN0YW1wPTA7dGhpcy5jYWxsYmFja1F1ZXVlPVtdO3RoaXMucGVuZGluZ0ltYWdlQ291bnQ9CjA7dGhpcy5maXR0ZXI9bmV3IFZwKHt4Oi4xMjUqYyx5Oi4xMjUqZCx3aWR0aDouNzUqYyxoZWlnaHQ6Ljc1KmR9KX1jbGVhclF1ZXVlcygpe3RoaXMuZHJhd1F1ZXVlPVtdO3RoaXMuY2FsbGJhY2tRdWV1ZT1bXTt0aGlzLnBlbmRpbmdJbWFnZUNvdW50PTA7cmV0dXJuIHRoaXMubGFzdENsZWFyVGltZXN0YW1wPURhdGUubm93KCl9c2V0U3ByaXRlSW1hZ2VEYXRhKGEsYyxkKXt0aGlzLmRyYXdRdWV1ZS5wdXNoKHtzcHJpdGVJbmRleDphLHRpbWVzdGFtcDpEYXRlLm5vdygpLGltYWdlRGF0YTpjLGNhbGxiYWNrOmR9KTt0aGlzLnF1ZXVlRHJhdygpfXNldEF0bGFzVXJsKGEsYyxkKXtjb25zdCBmPXRoaXMuY2xlYXJRdWV1ZXMoKSxnPW5ldyBJbWFnZTt2b2lkIDAhPT1jJiYoZy5jcm9zc09yaWdpbj1jKTt0aGlzLnBlbmRpbmdJbWFnZUNvdW50Kys7Zy5vbmVycm9yPSgpPT57dGhpcy5sYXN0Q2xlYXJUaW1lc3RhbXA+Znx8dGhpcy5wZW5kaW5nSW1hZ2VDb3VudC0tfTtnLm9ubG9hZD0KKCk9PntpZighKHRoaXMubGFzdENsZWFyVGltZXN0YW1wPmYpJiYodGhpcy5wZW5kaW5nSW1hZ2VDb3VudC0tLHRoaXMudXBkYXRlUHJvcGVydGllc1RvTWF0Y2hJbWFnZURpbWVuc2lvbnMoZy53aWR0aCxnLmhlaWdodCksdGhpcy5jb250ZXh0LmRyYXdJbWFnZShnLDAsMCx0aGlzLmNhbnZhcy53aWR0aCx0aGlzLmNhbnZhcy5oZWlnaHQpLHRoaXMubmVlZHNVcGRhdGU9ITAsZCYmdGhpcy5jYWxsYmFja1F1ZXVlLnB1c2goe2NhbGxiYWNrOmQsYXJnczpbZ119KSx0aGlzLm9uRHJhd0ZpbmlzaGVkKSl0aGlzLm9uRHJhd0ZpbmlzaGVkKCl9O2cuc3JjPWF9dXBkYXRlUHJvcGVydGllc1RvTWF0Y2hJbWFnZURpbWVuc2lvbnMoYSxjKXtpZihhIT09dGhpcy5pbWFnZVdpZHRoKnRoaXMuc3ByaXRlQ29sdW1uc3x8YyE9PXRoaXMuaW1hZ2VIZWlnaHQqdGhpcy5zcHJpdGVSb3dzKXt2YXIgZD1hL3RoaXMuaW1hZ2VXaWR0aCxmPWMvdGhpcy5pbWFnZUhlaWdodDtpZihkKmY8dGhpcy5jYXBhY2l0eSl0aHJvdyBFcnJvcigiQXRsYXMgaW1hZ2UgdG9vIHNtYWxsIHRvIGFjY29tbW9kYXRlIGF0bGFzIGNhcGFjaXR5LiIpOwppZihkIT09TWF0aC5yb3VuZChkKXx8ZiE9PU1hdGgucm91bmQoZikpdGhyb3cgRXJyb3IoIkF0bGFzIGltYWdlIGRpbWVuc2lvbnMgZG8gbm90IGZpdCBzcHJpdGUgaW1hZ2UgZGltZW5zaW9ucy4iKTt0aGlzLnNwcml0ZUNvbHVtbnM9ZDt0aGlzLnNwcml0ZVJvd3M9Zjt0aGlzLmNhbnZhcy53aWR0aD1hO3RoaXMuY2FudmFzLmhlaWdodD1jfX1wb3N0UmVuZGVyKCl7aWYoISh0aGlzLmRyYXdRdWV1ZS5sZW5ndGh8fDA8dGhpcy5wZW5kaW5nSW1hZ2VDb3VudCkpZm9yKDt0aGlzLmNhbGxiYWNrUXVldWUubGVuZ3RoOyl7Y29uc3Qge2NhbGxiYWNrOmEsYXJnczpjfT10aGlzLmNhbGxiYWNrUXVldWUuc2hpZnQoKTthLmFwcGx5KG51bGwsYyl9fXF1ZXVlRHJhdygpe3RoaXMuaXNEcmF3UXVldWVkfHwodGhpcy5pc0RyYXdRdWV1ZWQ9ITAsc2V0VGltZW91dCgoKT0+e3RoaXMuaXNEcmF3UXVldWVkJiZ0aGlzLndvcmtPbkRyYXdKb2JzKCl9LHRoaXMud2FpdFRpbWVvdXQpKX13b3JrT25EcmF3Sm9icygpe3RoaXMuaXNEcmF3UXVldWVkPQohMTtjb25zdCBhPURhdGUubm93KCksYz1hKyh0aGlzLmRyYXdUaW1lb3V0fHxJbmZpbml0eSk7Zm9yKDt0aGlzLmRyYXdRdWV1ZS5sZW5ndGgmJkRhdGUubm93KCk8Yzspe2NvbnN0IHtzcHJpdGVJbmRleDpwLHRpbWVzdGFtcDpxLGltYWdlRGF0YTpyLGltYWdlOnQsY2FsbGJhY2s6dn09dGhpcy5kcmF3UXVldWUuc2hpZnQoKTtpZih0KXt2YXIgZD10aGlzLmltYWdlV2lkdGgsZj10aGlzLmltYWdlSGVpZ2h0LGc9cCV0aGlzLnNwcml0ZUNvbHVtbnMqZCxsPWYqTWF0aC5mbG9vcihwL3RoaXMuc3ByaXRlQ29sdW1ucyk7dGhpcy5jb250ZXh0LmNsZWFyUmVjdChnLGwsZCxmKTt0aGlzLmNvbnRleHQuZHJhd0ltYWdlKHQsZyxsLGQsZik7ImZ1bmN0aW9uIj09PXR5cGVvZiB2JiZ0aGlzLmNhbGxiYWNrUXVldWUucHVzaCh7Y2FsbGJhY2s6dixhcmdzOltwXX0pfWVsc2UgaWYociYmInRleHQiPT09ci50eXBlKXtkPXAldGhpcy5zcHJpdGVDb2x1bW5zKnRoaXMuaW1hZ2VXaWR0aDtmPXRoaXMuaW1hZ2VIZWlnaHQqCk1hdGguZmxvb3IocC90aGlzLnNwcml0ZUNvbHVtbnMpO3ZhciBrPWQrdGhpcy5pbWFnZVdpZHRoLzIsbj1mK3RoaXMuaW1hZ2VIZWlnaHQvMjtnPXRoaXMuZml0dGVyLmZpdChyLmRhdGErIiIpO2w9dGhpcy5jb250ZXh0O2wuY2xlYXJSZWN0KGQsZix0aGlzLmltYWdlV2lkdGgsdGhpcy5pbWFnZUhlaWdodCk7bC5zYXZlKCk7bC50cmFuc2xhdGUoayxuKTtsLnNjYWxlKHRoaXMuaW1hZ2VXaWR0aCx0aGlzLmltYWdlSGVpZ2h0KTtsLmJlZ2luUGF0aCgpO2wuYXJjKDAsMCwuNSwwLDIqTWF0aC5QSSk7bC5yZXN0b3JlKCk7bC5maWxsU3R5bGU9IiM1NTU1NTUiO2wuZmlsbCgpO2wuZmlsbFN0eWxlPSJ3aGl0ZSI7bC50ZXh0QmFzZWxpbmU9ImhhbmdpbmciO2wuZm9udD1gJHtyLnNwZWNpYWw/Iml0YWxpYyI6ImJvbGQifSAke2cuZm9udFNpemV9cHggJHsiJ1JvYm90byBNb25vJywgJ0NvbnNvbGFzJywgJ01lbmxvJywgbW9ub3NwYWNlIn1gO2s9Zy5saW5lcztmb3Iobj0wO248ay5sZW5ndGg7bisrKXtjb25zdCB5PQprW25dO2wuZmlsbFRleHQoeS50ZXh0LGQreS54LGYreS55LHkudGV4dC5sZW5ndGgqdGhpcy5maXR0ZXIuc2V0dGluZ3MuZ2x5cGhBc3BlY3RSYXRpbypnLmZvbnRTaXplKX0iZnVuY3Rpb24iPT09dHlwZW9mIHYmJnRoaXMuY2FsbGJhY2tRdWV1ZS5wdXNoKHtjYWxsYmFjazp2LGFyZ3M6W3BdfSl9ZWxzZSBpZihyKXtjb25zdCB5PW5ldyBJbWFnZTt0aGlzLnBlbmRpbmdJbWFnZUNvdW50Kys7eS5vbmxvYWQ9KCk9PnthPHRoaXMubGFzdENsZWFyVGltZXN0YW1wfHwodGhpcy5wZW5kaW5nSW1hZ2VDb3VudC0tLHRoaXMuZHJhd1F1ZXVlLnVuc2hpZnQoe3Nwcml0ZUluZGV4OnAsdGltZXN0YW1wOnEsaW1hZ2U6eSxjYWxsYmFjazp2fSksdGhpcy5xdWV1ZURyYXcoKSl9O3kub25lcnJvcj0oKT0+e2E8dGhpcy5sYXN0Q2xlYXJUaW1lc3RhbXB8fCh0aGlzLnBlbmRpbmdJbWFnZUNvdW50LS0sdGhpcy5kcmF3UXVldWUucHVzaCh7c3ByaXRlSW5kZXg6cCx0aW1lc3RhbXA6cSxpbWFnZURhdGE6ciwKY2FsbGJhY2s6dn0pLHRoaXMucXVldWVEcmF3KCkpfTt5LnNyYz0ic3ZnIj09PXIudHlwZT9VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtyLmRhdGFdLHt0eXBlOiJpbWFnZS9zdmcreG1sO2NoYXJzZXRceDNkdXRmLTgifSkpOmBkYXRhOiR7ci50eXBlfTtiYXNlNjQsJHtyLmRhdGF9YH19aWYodGhpcy5kcmF3UXVldWUubGVuZ3RofHwwPHRoaXMucGVuZGluZ0ltYWdlQ291bnQpdGhpcy5xdWV1ZURyYXcoKTtlbHNlIGlmKHRoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5vbkRyYXdGaW5pc2hlZCl0aGlzLm9uRHJhd0ZpbmlzaGVkKCl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9mYWNldHMtZGl2ZS9saWIvc3ByaXRlLW1hdGVyaWFsLmpzCmNsYXNzIFhwIGV4dGVuZHMgVEhSRUUuUmF3U2hhZGVyTWF0ZXJpYWx7Y29uc3RydWN0b3IoYSxjKXtzdXBlcih7dmVydGV4U2hhZGVyOiJcblxuICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4gIHByZWNpc2lvbiBoaWdocCBpbnQ7XG5cbiAgI2RlZmluZSBTSEFERVJfTkFNRSBTcHJpdGVNYXRlcmlhbFxuXG4gIC8vIFN0YW5kYXJkIHVuaWZvcm1zIHByb3ZpZGVkIGJ5IFRIUkVFLmpzIGZvciBwcm9qZWN0aW5nIHRocm91Z2ggdGhlIGNhbWVyYS5cbiAgdW5pZm9ybSBtYXQ0IG1vZGVsVmlld01hdHJpeDtcbiAgdW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7XG5cbiAgdW5pZm9ybSBmbG9hdCB0aW1lO1xuXG4gIHVuaWZvcm0gZmxvYXQgc3ByaXRlQ29sdW1ucztcbiAgdW5pZm9ybSBmbG9hdCBzcHJpdGVSb3dzO1xuXG4gIGF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uO1xuICBhdHRyaWJ1dGUgdmVjMyBiYXNlUG9zaXRpb247XG5cbiAgYXR0cmlidXRlIHZlYzQgY29sb3I7XG4gIGF0dHJpYnV0ZSB2ZWM0IGJhc2VDb2xvcjtcblxuICBhdHRyaWJ1dGUgZmxvYXQgb3BhY2l0eTtcbiAgYXR0cmlidXRlIGZsb2F0IGJhc2VPcGFjaXR5O1xuXG4gIGF0dHJpYnV0ZSBmbG9hdCB0aW1lc3RhbXA7XG4gIGF0dHJpYnV0ZSBmbG9hdCBiYXNlVGltZXN0YW1wO1xuXG4gIGF0dHJpYnV0ZSBmbG9hdCB2ZXJ0ZXhJbmRleDtcblxuICBhdHRyaWJ1dGUgZmxvYXQgdGV4dHVyZUluZGV4O1xuICBhdHRyaWJ1dGUgZmxvYXQgYmFzZVRleHR1cmVJbmRleDtcblxuICBhdHRyaWJ1dGUgZmxvYXQgdGV4dHVyZVRpbWVzdGFtcDtcbiAgYXR0cmlidXRlIGZsb2F0IGJhc2VUZXh0dXJlVGltZXN0YW1wO1xuXG4gIC8vIENvbXB1dGVkIFVWIGNvb3JkaW5hdGVzIGludG8gdGhlIGRlZmF1bHRUZXh0dXJlIGJhc2VkIG9uIHRoZSB2ZXJ0ZXhJbmRleC5cbiAgdmFyeWluZyB2ZWMyIHZEZWZhdWx0VXY7XG5cbiAgLy8gQ29tcHV0ZWQgVVYgY29vcmRpbmF0ZXMgaW50byB0aGUgc3ByaXRlIHRleHR1cmUgYXRsYXMuXG4gIHZhcnlpbmcgdmVjMiB2U3ByaXRlVXY7XG5cbiAgLy8gSW50ZXJwb2xhdGVkIGNvbG9yIHVzZWQgYnkgdGhlIGZyYWdtZW50IHNoYWRlci5cbiAgdmFyeWluZyB2ZWM0IHZDb2xvcjtcblxuICAvLyBJbnRlcnBvbGF0ZWQgb3BhY2l0eSB1c2VkIGJ5IHRoZSBmcmFnbWVudCBzaGFkZXIuXG4gIHZhcnlpbmcgZmxvYXQgdk9wYWNpdHk7XG5cbiAgLy8gRGVncmVlIG9mIG1peGluZyBiZXR3ZWVuIGJhc2UgYW5kIGN1cnJlbnQgdGV4dHVyZS5cbiAgdmFyeWluZyBmbG9hdCB2VGV4dHVyZU1peDtcblxuICBmbG9hdCBhcHBseUVhc2luZyhmbG9hdCB0KSB7XG4gICAgcmV0dXJuIHQgXHgzYyAwLjUgPyA0LjAgKiB0ICogdCAqIHQgOlxuICAgICAgNC4wICogKHQgLSAxLjApICogKHQgLSAxLjApICogKHQgLSAxLjApICsgMS4wO1xuICB9XG5cbiAgdm9pZCBtYWluKCkge1xuXG4gICAgLy8gQ29tcHV0ZSBkZWZhdWx0IFVWcy4gQSBceDNkXHgzZSAoMCwwKSwgQiBceDNkXHgzZSAoMSwwKSwgZXRjLlxuICAgIHZEZWZhdWx0VXYueCBceDNkIG1vZChmbG9vcigodmVydGV4SW5kZXggKyAxLjApIC8gMi4wKSwgMi4wKTtcbiAgICB2RGVmYXVsdFV2LnkgXHgzZCBtb2QoZmxvb3IodmVydGV4SW5kZXggLyAyLjApLCAyLjApO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHRoZSByb3cgYW5kIGNvbHVtbiBpbmRpY2VzIGZvciB0aGlzIHNwcml0ZS5cbiAgICBmbG9hdCBzcHJpdGVJbmRleCBceDNkIGZsb29yKHZlcnRleEluZGV4IC8gNC4wKSArIDAuNTtcbiAgICBmbG9hdCBjb2x1bW5JbmRleCBceDNkIGZsb29yKG1vZChzcHJpdGVJbmRleCwgc3ByaXRlQ29sdW1ucykpO1xuICAgIGZsb2F0IHJvd0luZGV4IFx4M2Qgc3ByaXRlUm93cyAtIDEuMCAtIGZsb29yKHNwcml0ZUluZGV4IC8gc3ByaXRlQ29sdW1ucyk7XG5cbiAgICAvLyBDb21wdXRlIHNwcml0ZSBVVnMgZnJvbSByb3cgYW5kIGNvbHVtbiBpbmRpY2VzLlxuICAgIHZTcHJpdGVVdi54IFx4M2QgKGNvbHVtbkluZGV4ICsgdkRlZmF1bHRVdi54KSAvIHNwcml0ZUNvbHVtbnM7XG4gICAgdlNwcml0ZVV2LnkgXHgzZCAocm93SW5kZXggKyB2RGVmYXVsdFV2LnkpIC8gc3ByaXRlUm93cztcblxuICAgIGZsb2F0IGJsZW5kIFx4M2QgYXBwbHlFYXNpbmcoc21vb3Roc3RlcChiYXNlVGltZXN0YW1wLCB0aW1lc3RhbXAsIHRpbWUpKTtcblxuICAgIHZUZXh0dXJlTWl4IFx4M2QgbWl4KGJhc2VUZXh0dXJlSW5kZXgsIHRleHR1cmVJbmRleCxcbiAgICAgICAgc21vb3Roc3RlcChiYXNlVGV4dHVyZVRpbWVzdGFtcCwgdGV4dHVyZVRpbWVzdGFtcCwgdGltZSkpO1xuXG4gICAgdkNvbG9yIFx4M2QgbWl4KGJhc2VDb2xvciwgY29sb3IsIGJsZW5kKTtcblxuICAgIHZPcGFjaXR5IFx4M2QgbWl4KGJhc2VPcGFjaXR5LCBvcGFjaXR5LCBibGVuZCk7XG5cbiAgICBnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKlxuICAgICAgICB2ZWM0KG1peChiYXNlUG9zaXRpb24sIHBvc2l0aW9uLCB2ZWMzKGJsZW5kKSksIDEuMCk7XG5cbiAgfVxuXG4iLApmcmFnbWVudFNoYWRlcjoiXG5cbiAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuICBwcmVjaXNpb24gaGlnaHAgaW50O1xuXG4gICNkZWZpbmUgU0hBREVSX05BTUUgU3ByaXRlTWF0ZXJpYWxcblxuICAvLyBMaWdodG5lc3MgdGhhdCBzaG91bGQgaWRlYWxseSBleGFjdGx5IG1hdGNoIHRoZSB2Q29sb3IuXG4gICNkZWZpbmUgVEFSR0VUX0xJR0hUTkVTUyAwLjZcblxuICB1bmlmb3JtIGZsb2F0IHRpbWU7XG5cbiAgdW5pZm9ybSBzYW1wbGVyMkQgZGVmYXVsdFRleHR1cmU7XG4gIHVuaWZvcm0gc2FtcGxlcjJEIHNwcml0ZUF0bGFzO1xuXG4gIHZhcnlpbmcgdmVjMiB2RGVmYXVsdFV2O1xuICB2YXJ5aW5nIHZlYzIgdlNwcml0ZVV2O1xuICB2YXJ5aW5nIHZlYzQgdkNvbG9yO1xuICB2YXJ5aW5nIGZsb2F0IHZPcGFjaXR5O1xuICB2YXJ5aW5nIGZsb2F0IHZUZXh0dXJlTWl4O1xuXG4gIC8vIENvbXB1dGUgcmVsYXRpdmUgbHVtaW5hbmNlIGZyb20gUkdCLlxuICBmbG9hdCByZ2JUb0wodmVjMyByZ2IpIHtcbiAgICByZXR1cm4gZG90KHJnYiwgdmVjMygwLjMsIDAuNTksIDAuMTEpKTtcbiAgfVxuXG4gIC8vIEFwcGx5IGx1bWluYW5jZSBlYXNpbmcuXG4gIGZsb2F0IGVhc2VMKGZsb2F0IGwpIHtcbiAgICByZXR1cm4gMS4wIC0gKDEuMCAtIGwpICogKDEuMCAtIGwpICogKDEuMCAtIGwpO1xuICB9XG5cbiAgdm9pZCBtYWluKCkge1xuICAgIGlmICh2T3BhY2l0eSBceDNjXHgzZCAwLjA1KSB7XG4gICAgICBkaXNjYXJkO1xuICAgIH1cblxuICAgIC8vIEludGVycG9sYXRlIGJldHdlZW4gZGVmYXVsdCB0ZXh0dXJlIGFuZCBzcHJpdGUgdGV4dHVyZS5cbiAgICB2ZWM0IGRlZmF1bHRDb2xvciBceDNkXG4gICAgICB2VGV4dHVyZU1peCBceDNjIDEuMCA/IHRleHR1cmUyRChkZWZhdWx0VGV4dHVyZSwgdkRlZmF1bHRVdikgOiB2ZWM0KDAuMCk7XG4gICAgdmVjNCBzcHJpdGVDb2xvciBceDNkXG4gICAgICB2VGV4dHVyZU1peCBceDNlIDAuMCA/IHRleHR1cmUyRChzcHJpdGVBdGxhcywgdlNwcml0ZVV2KSA6IHZlYzQoMC4wKTtcbiAgICB2ZWM0IG1peGVkQ29sb3IgXHgzZCBtaXgoZGVmYXVsdENvbG9yLCBzcHJpdGVDb2xvciwgdlRleHR1cmVNaXgpO1xuXG4gICAgLy8gTGlnaHRuZXNzIG9mIHRoZSBtaXhlZCBwaXhlbC5cbiAgICBmbG9hdCBtaXhlZEwgXHgzZCByZ2JUb0wobWl4ZWRDb2xvci5yZ2IpO1xuXG4gICAgLy8gVXNpbmcgdGhlIG1peGVkIGFuZCB0YXJnZXQgbGlnaHRuZXNzLCBkZXRlcm1pbmUgdGhlIGNvbG9yIHRoYXQncyBiZXR3ZWVuXG4gICAgLy8gYmxhY2ssIHZDb2xvciBhbmQgd2hpdGUuXG4gICAgdmVjMyBjb2xvciBceDNkIG1peGVkTCBceDNjIFRBUkdFVF9MSUdIVE5FU1MgP1xuICAgICAgICBtaXgodmVjMygwLjApLCB2Q29sb3IucmdiLCBlYXNlTChtaXhlZEwgLyBUQVJHRVRfTElHSFRORVNTKSkgOlxuICAgICAgICBtaXgodmVjMygxLjApLCB2Q29sb3IucmdiLFxuICAgICAgICAgICAgZWFzZUwoKDEuMCAtIG1peGVkTCkgLyAoMS4wIC0gVEFSR0VUX0xJR0hUTkVTUykpKTtcblxuICAgIHZlYzMgZmluYWxDb2xvciBceDNkIG1peChtaXhlZENvbG9yLnJnYiwgY29sb3IsIHZDb2xvci5hKTtcblxuICAgIC8vIEFwcGx5IG9wYWNpdHkuXG4gICAgZ2xfRnJhZ0NvbG9yIFx4M2QgdmVjNChmaW5hbENvbG9yLCBtaXhlZENvbG9yLmEgKiB2T3BhY2l0eSk7XG4gIH1cbiIsCnVuaWZvcm1zOnt0aW1lOnt0eXBlOiJmIix2YWx1ZTowfSxkZWZhdWx0VGV4dHVyZTp7dHlwZToidCIsdmFsdWU6YX0sc3ByaXRlQXRsYXM6e3R5cGU6InQiLHZhbHVlOmN9LHNwcml0ZUNvbHVtbnM6e3R5cGU6ImYiLHZhbHVlOmM/Yy5zcHJpdGVDb2x1bW5zOjF9LHNwcml0ZVJvd3M6e3R5cGU6ImYiLHZhbHVlOmM/Yy5zcHJpdGVSb3dzOjF9fSx0cmFuc3BhcmVudDohMH0pfWdldCB0aW1lKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMudGltZS52YWx1ZX1zZXQgdGltZShhKXt0aGlzLnVuaWZvcm1zLnRpbWUudmFsdWU9YX1nZXQgZGVmYXVsdFRleHR1cmUoKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy5kZWZhdWx0VGV4dHVyZS52YWx1ZX1zZXQgZGVmYXVsdFRleHR1cmUoYSl7dGhpcy51bmlmb3Jtcy5kZWZhdWx0VGV4dHVyZS52YWx1ZT1hfWdldCBzcHJpdGVBdGxhcygpe3JldHVybiB0aGlzLnVuaWZvcm1zLnNwcml0ZUF0bGFzLnZhbHVlfXNldCBzcHJpdGVBdGxhcyhhKXt0aGlzLnVuaWZvcm1zLnNwcml0ZUF0bGFzLnZhbHVlPQphfXVwZGF0ZUF0bGFzVW5pZm9ybXMoKXt0aGlzLnVuaWZvcm1zLnNwcml0ZUNvbHVtbnMudmFsdWU9dGhpcy5zcHJpdGVBdGxhcy5zcHJpdGVDb2x1bW5zO3RoaXMudW5pZm9ybXMuc3ByaXRlUm93cy52YWx1ZT10aGlzLnNwcml0ZUF0bGFzLnNwcml0ZVJvd3N9YXBwbHlFYXNpbmcoYSl7cmV0dXJuLjU+YT80KmEqYSphOjQqKGEtMSkqKGEtMSkqKGEtMSkrMX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2ZhY2V0cy1kaXZlL2xpYi9zcHJpdGUtbWVzaC5qcwpjbGFzcyBZcHtjb25zdHJ1Y3RvcihhLGMpe3RoaXMuX3Nwcml0ZU1lc2g9YTt0aGlzLl9zcHJpdGVJbmRleD1jfWdldCBzcHJpdGVNZXNoKCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2h9Z2V0IHNwcml0ZUluZGV4KCl7cmV0dXJuIHRoaXMuX3Nwcml0ZUluZGV4fWdldCB4KCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0WCh0aGlzLl9zcHJpdGVJbmRleCl9c2V0IHgoYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRYKHRoaXMuX3Nwcml0ZUluZGV4LGEpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0WSh0aGlzLl9zcHJpdGVJbmRleCl9c2V0IHkoYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRZKHRoaXMuX3Nwcml0ZUluZGV4LGEpfWdldCB6KCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0Wih0aGlzLl9zcHJpdGVJbmRleCl9c2V0IHooYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRaKHRoaXMuX3Nwcml0ZUluZGV4LGEpfWdldCByKCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0Uih0aGlzLl9zcHJpdGVJbmRleCl9c2V0IHIoYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRSKHRoaXMuX3Nwcml0ZUluZGV4LAphKX1nZXQgZygpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldEcodGhpcy5fc3ByaXRlSW5kZXgpfXNldCBnKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0Ryh0aGlzLl9zcHJpdGVJbmRleCxhKX1nZXQgYigpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldEIodGhpcy5fc3ByaXRlSW5kZXgpfXNldCBiKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0Qih0aGlzLl9zcHJpdGVJbmRleCxhKX1nZXQgYSgpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldEEodGhpcy5fc3ByaXRlSW5kZXgpfXNldCBhKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0QSh0aGlzLl9zcHJpdGVJbmRleCxhKX1nZXQgb3BhY2l0eSgpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldE9wYWNpdHkodGhpcy5fc3ByaXRlSW5kZXgpfXNldCBvcGFjaXR5KGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0T3BhY2l0eSh0aGlzLl9zcHJpdGVJbmRleCxhKX1nZXQgdGltZXN0YW1wKCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0VGltZXN0YW1wKHRoaXMuX3Nwcml0ZUluZGV4KX1zZXQgdGltZXN0YW1wKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0VGltZXN0YW1wKHRoaXMuX3Nwcml0ZUluZGV4LAphKX1nZXQgYmFzZVgoKXtyZXR1cm4gdGhpcy5fc3ByaXRlTWVzaC5nZXRCYXNlWCh0aGlzLl9zcHJpdGVJbmRleCl9c2V0IGJhc2VYKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0QmFzZVgodGhpcy5fc3ByaXRlSW5kZXgsYSl9Z2V0IGJhc2VZKCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0QmFzZVkodGhpcy5fc3ByaXRlSW5kZXgpfXNldCBiYXNlWShhKXt0aGlzLl9zcHJpdGVNZXNoLnNldEJhc2VZKHRoaXMuX3Nwcml0ZUluZGV4LGEpfWdldCBiYXNlWigpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldEJhc2VaKHRoaXMuX3Nwcml0ZUluZGV4KX1zZXQgYmFzZVooYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRCYXNlWih0aGlzLl9zcHJpdGVJbmRleCxhKX1nZXQgYmFzZVIoKXtyZXR1cm4gdGhpcy5fc3ByaXRlTWVzaC5nZXRCYXNlUih0aGlzLl9zcHJpdGVJbmRleCl9c2V0IGJhc2VSKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0QmFzZVIodGhpcy5fc3ByaXRlSW5kZXgsYSl9Z2V0IGJhc2VHKCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0QmFzZUcodGhpcy5fc3ByaXRlSW5kZXgpfXNldCBiYXNlRyhhKXt0aGlzLl9zcHJpdGVNZXNoLnNldEJhc2VHKHRoaXMuX3Nwcml0ZUluZGV4LAphKX1nZXQgYmFzZUIoKXtyZXR1cm4gdGhpcy5fc3ByaXRlTWVzaC5nZXRCYXNlQih0aGlzLl9zcHJpdGVJbmRleCl9c2V0IGJhc2VCKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0QmFzZUIodGhpcy5fc3ByaXRlSW5kZXgsYSl9Z2V0IGJhc2VBKCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0QmFzZUEodGhpcy5fc3ByaXRlSW5kZXgpfXNldCBiYXNlQShhKXt0aGlzLl9zcHJpdGVNZXNoLnNldEJhc2VBKHRoaXMuX3Nwcml0ZUluZGV4LGEpfWdldCBiYXNlT3BhY2l0eSgpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldEJhc2VPcGFjaXR5KHRoaXMuX3Nwcml0ZUluZGV4KX1zZXQgYmFzZU9wYWNpdHkoYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRCYXNlT3BhY2l0eSh0aGlzLl9zcHJpdGVJbmRleCxhKX1nZXQgYmFzZVRpbWVzdGFtcCgpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldEJhc2VUaW1lc3RhbXAodGhpcy5fc3ByaXRlSW5kZXgpfXNldCBiYXNlVGltZXN0YW1wKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0QmFzZVRpbWVzdGFtcCh0aGlzLl9zcHJpdGVJbmRleCwKYSl9Z2V0IHRleHR1cmVJbmRleCgpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldFRleHR1cmVJbmRleCh0aGlzLl9zcHJpdGVJbmRleCl9c2V0IHRleHR1cmVJbmRleChhKXt0aGlzLl9zcHJpdGVNZXNoLnNldFRleHR1cmVJbmRleCh0aGlzLl9zcHJpdGVJbmRleCxhKX1nZXQgYmFzZVRleHR1cmVJbmRleCgpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldEJhc2VUZXh0dXJlSW5kZXgodGhpcy5fc3ByaXRlSW5kZXgpfXNldCBiYXNlVGV4dHVyZUluZGV4KGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0QmFzZVRleHR1cmVJbmRleCh0aGlzLl9zcHJpdGVJbmRleCxhKX1nZXQgdGV4dHVyZVRpbWVzdGFtcCgpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldFRleHR1cmVUaW1lc3RhbXAodGhpcy5fc3ByaXRlSW5kZXgpfXNldCB0ZXh0dXJlVGltZXN0YW1wKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0VGV4dHVyZVRpbWVzdGFtcCh0aGlzLl9zcHJpdGVJbmRleCxhKX1nZXQgYmFzZVRleHR1cmVUaW1lc3RhbXAoKXtyZXR1cm4gdGhpcy5fc3ByaXRlTWVzaC5nZXRCYXNlVGV4dHVyZVRpbWVzdGFtcCh0aGlzLl9zcHJpdGVJbmRleCl9c2V0IGJhc2VUZXh0dXJlVGltZXN0YW1wKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0QmFzZVRleHR1cmVUaW1lc3RhbXAodGhpcy5fc3ByaXRlSW5kZXgsCmEpfXJlYmFzZShhKXt0aGlzLl9zcHJpdGVNZXNoLnJlYmFzZSh0aGlzLl9zcHJpdGVJbmRleCxhKX1zZXRTcHJpdGVJbWFnZURhdGEoYSxjKXt0aGlzLl9zcHJpdGVNZXNoLnNldFNwcml0ZUltYWdlRGF0YSh0aGlzLl9zcHJpdGVJbmRleCxhLGMpfXN3aXRjaFRleHR1cmVzKGEsYyl7dGhpcy5fc3ByaXRlTWVzaC5zd2l0Y2hUZXh0dXJlcyh0aGlzLl9zcHJpdGVJbmRleCxhLGMpfX0KY2xhc3MgWnAgZXh0ZW5kcyBUSFJFRS5NZXNoe2NvbnN0cnVjdG9yKGEsYz0zMixkPTMyKXtzdXBlcigpO3RoaXMuY2FwYWNpdHk9YTt0aGlzLmltYWdlV2lkdGg9Yzt0aGlzLmltYWdlSGVpZ2h0PWQ7dGhpcy5uZXh0SW5kZXg9MDt0aGlzLnNwcml0ZVdpZHRoPXRoaXMuaW1hZ2VXaWR0aC90aGlzLmltYWdlSGVpZ2h0O3RoaXMuc3ByaXRlSGVpZ2h0PTE7dGhpcy5nZW9tZXRyeT1uZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnk7dGhpcy5wb3NpdGlvbkRhdGE9bmV3IEZsb2F0MzJBcnJheSgxMiphKTt0aGlzLnBvc2l0aW9uQXR0cmlidXRlPW5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUodGhpcy5wb3NpdGlvbkRhdGEsMyk7dGhpcy5wb3NpdGlvbkF0dHJpYnV0ZS5zZXREeW5hbWljKCEwKTt0aGlzLmdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLHRoaXMucG9zaXRpb25BdHRyaWJ1dGUpO3RoaXMuYmFzZVBvc2l0aW9uRGF0YT1uZXcgRmxvYXQzMkFycmF5KDEyKmEpO3RoaXMuYmFzZVBvc2l0aW9uQXR0cmlidXRlPQpuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKHRoaXMuYmFzZVBvc2l0aW9uRGF0YSwzKTt0aGlzLmJhc2VQb3NpdGlvbkF0dHJpYnV0ZS5zZXREeW5hbWljKCEwKTt0aGlzLmdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgiYmFzZVBvc2l0aW9uIix0aGlzLmJhc2VQb3NpdGlvbkF0dHJpYnV0ZSk7dGhpcy5jb2xvckRhdGE9bmV3IFVpbnQ4QXJyYXkoMTYqYSk7dGhpcy5jb2xvckF0dHJpYnV0ZT1uZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKHRoaXMuY29sb3JEYXRhLDQpO3RoaXMuY29sb3JBdHRyaWJ1dGUubm9ybWFsaXplZD0hMDt0aGlzLmNvbG9yQXR0cmlidXRlLnNldER5bmFtaWMoITApO3RoaXMuZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCJjb2xvciIsdGhpcy5jb2xvckF0dHJpYnV0ZSk7dGhpcy5iYXNlQ29sb3JEYXRhPW5ldyBVaW50OEFycmF5KDE2KmEpO3RoaXMuYmFzZUNvbG9yQXR0cmlidXRlPW5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUodGhpcy5iYXNlQ29sb3JEYXRhLDQpO3RoaXMuYmFzZUNvbG9yQXR0cmlidXRlLm5vcm1hbGl6ZWQ9CiEwO3RoaXMuYmFzZUNvbG9yQXR0cmlidXRlLnNldER5bmFtaWMoITApO3RoaXMuZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCJiYXNlQ29sb3IiLHRoaXMuYmFzZUNvbG9yQXR0cmlidXRlKTt0aGlzLm9wYWNpdHlEYXRhPW5ldyBGbG9hdDMyQXJyYXkoNCphKTt0aGlzLm9wYWNpdHlBdHRyaWJ1dGU9bmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSh0aGlzLm9wYWNpdHlEYXRhLDEpO3RoaXMub3BhY2l0eUF0dHJpYnV0ZS5zZXREeW5hbWljKCEwKTt0aGlzLmdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgib3BhY2l0eSIsdGhpcy5vcGFjaXR5QXR0cmlidXRlKTt0aGlzLmJhc2VPcGFjaXR5RGF0YT1uZXcgRmxvYXQzMkFycmF5KDQqYSk7dGhpcy5iYXNlT3BhY2l0eUF0dHJpYnV0ZT1uZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKHRoaXMuYmFzZU9wYWNpdHlEYXRhLDEpO3RoaXMuYmFzZU9wYWNpdHlBdHRyaWJ1dGUuc2V0RHluYW1pYyghMCk7dGhpcy5nZW9tZXRyeS5hZGRBdHRyaWJ1dGUoImJhc2VPcGFjaXR5IiwKdGhpcy5iYXNlT3BhY2l0eUF0dHJpYnV0ZSk7dGhpcy50aW1lc3RhbXBEYXRhPW5ldyBGbG9hdDMyQXJyYXkoNCphKTt0aGlzLnRpbWVzdGFtcEF0dHJpYnV0ZT1uZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKHRoaXMudGltZXN0YW1wRGF0YSwxKTt0aGlzLnRpbWVzdGFtcEF0dHJpYnV0ZS5zZXREeW5hbWljKCEwKTt0aGlzLmdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgidGltZXN0YW1wIix0aGlzLnRpbWVzdGFtcEF0dHJpYnV0ZSk7dGhpcy5iYXNlVGltZXN0YW1wRGF0YT1uZXcgRmxvYXQzMkFycmF5KDQqYSk7dGhpcy5iYXNlVGltZXN0YW1wQXR0cmlidXRlPW5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUodGhpcy5iYXNlVGltZXN0YW1wRGF0YSwxKTt0aGlzLmJhc2VUaW1lc3RhbXBBdHRyaWJ1dGUuc2V0RHluYW1pYyghMCk7dGhpcy5nZW9tZXRyeS5hZGRBdHRyaWJ1dGUoImJhc2VUaW1lc3RhbXAiLHRoaXMuYmFzZVRpbWVzdGFtcEF0dHJpYnV0ZSk7dGhpcy5mYWNlSW5kZXhEYXRhPQpuZXcgVWludDMyQXJyYXkoNiphKTtmb3IodmFyIGY9MDtmPGE7ZisrKXt2YXIgZz02KmY7Y29uc3QgbD00KmY7dGhpcy5mYWNlSW5kZXhEYXRhW2crMF09bCswO3RoaXMuZmFjZUluZGV4RGF0YVtnKzFdPWwrMTt0aGlzLmZhY2VJbmRleERhdGFbZysyXT1sKzI7dGhpcy5mYWNlSW5kZXhEYXRhW2crM109bCswO3RoaXMuZmFjZUluZGV4RGF0YVtnKzRdPWwrMjt0aGlzLmZhY2VJbmRleERhdGFbZys1XT1sKzN9dGhpcy5mYWNlSW5kZXhBdHRyaWJ1dGU9bmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSh0aGlzLmZhY2VJbmRleERhdGEsMSk7dGhpcy5nZW9tZXRyeS5zZXRJbmRleCh0aGlzLmZhY2VJbmRleEF0dHJpYnV0ZSk7dGhpcy50ZXh0dXJlSW5kZXhEYXRhPW5ldyBGbG9hdDMyQXJyYXkoNCphKTt0aGlzLnRleHR1cmVJbmRleEF0dHJpYnV0ZT1uZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKHRoaXMudGV4dHVyZUluZGV4RGF0YSwxKTt0aGlzLnRleHR1cmVJbmRleEF0dHJpYnV0ZS5zZXREeW5hbWljKCEwKTsKdGhpcy5nZW9tZXRyeS5hZGRBdHRyaWJ1dGUoInRleHR1cmVJbmRleCIsdGhpcy50ZXh0dXJlSW5kZXhBdHRyaWJ1dGUpO3RoaXMuYmFzZVRleHR1cmVJbmRleERhdGE9bmV3IEZsb2F0MzJBcnJheSg0KmEpO3RoaXMuYmFzZVRleHR1cmVJbmRleEF0dHJpYnV0ZT1uZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKHRoaXMuYmFzZVRleHR1cmVJbmRleERhdGEsMSk7dGhpcy5iYXNlVGV4dHVyZUluZGV4QXR0cmlidXRlLnNldER5bmFtaWMoITApO3RoaXMuZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCJiYXNlVGV4dHVyZUluZGV4Iix0aGlzLmJhc2VUZXh0dXJlSW5kZXhBdHRyaWJ1dGUpO3RoaXMudGV4dHVyZVRpbWVzdGFtcERhdGE9bmV3IEZsb2F0MzJBcnJheSg0KmEpO3RoaXMudGV4dHVyZVRpbWVzdGFtcEF0dHJpYnV0ZT1uZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKHRoaXMudGV4dHVyZVRpbWVzdGFtcERhdGEsMSk7dGhpcy50ZXh0dXJlVGltZXN0YW1wQXR0cmlidXRlLnNldER5bmFtaWMoITApOwp0aGlzLmdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgidGV4dHVyZVRpbWVzdGFtcCIsdGhpcy50ZXh0dXJlVGltZXN0YW1wQXR0cmlidXRlKTt0aGlzLmJhc2VUZXh0dXJlVGltZXN0YW1wRGF0YT1uZXcgRmxvYXQzMkFycmF5KDQqYSk7dGhpcy5iYXNlVGV4dHVyZVRpbWVzdGFtcEF0dHJpYnV0ZT1uZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKHRoaXMuYmFzZVRleHR1cmVUaW1lc3RhbXBEYXRhLDEpO3RoaXMuYmFzZVRleHR1cmVUaW1lc3RhbXBBdHRyaWJ1dGUuc2V0RHluYW1pYyghMCk7dGhpcy5nZW9tZXRyeS5hZGRBdHRyaWJ1dGUoImJhc2VUZXh0dXJlVGltZXN0YW1wIix0aGlzLmJhc2VUZXh0dXJlVGltZXN0YW1wQXR0cmlidXRlKTtmPTQqYTt0aGlzLnZlcnRleEluZGV4RGF0YT1uZXcgRmxvYXQzMkFycmF5KGYpO2ZvcihnPTA7ZzxmO2crKyl0aGlzLnZlcnRleEluZGV4RGF0YVtnXT1nO3RoaXMudmVydGV4SW5kZXhBdHRyaWJ1dGU9bmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSh0aGlzLnZlcnRleEluZGV4RGF0YSwKMSk7dGhpcy5nZW9tZXRyeS5hZGRBdHRyaWJ1dGUoInZlcnRleEluZGV4Iix0aGlzLnZlcnRleEluZGV4QXR0cmlidXRlKTt0aGlzLmRlZmF1bHRUZXh0dXJlQ2FudmFzPXRoaXMuY3JlYXRlRGVmYXVsdFRleHR1cmVDYW52YXMoKTt0aGlzLmRlZmF1bHRUZXh0dXJlPW5ldyBUSFJFRS5UZXh0dXJlKHRoaXMuZGVmYXVsdFRleHR1cmVDYW52YXMpO3RoaXMuZGVmYXVsdFRleHR1cmUubWluRmlsdGVyPVRIUkVFLkxpbmVhckZpbHRlcjt0aGlzLmRlZmF1bHRUZXh0dXJlLm1hZ0ZpbHRlcj1USFJFRS5OZWFyZXN0RmlsdGVyO3RoaXMuZGVmYXVsdFRleHR1cmUubmVlZHNVcGRhdGU9ITA7dGhpcy5zcHJpdGVBdGxhcz1uZXcgV3AoYSxjLGQpO3RoaXMubWF0ZXJpYWw9bmV3IFhwKHRoaXMuZGVmYXVsdFRleHR1cmUsdGhpcy5zcHJpdGVBdGxhcyk7dGhpcy5vbkJlZm9yZVJlbmRlcj0oKT0+e3RoaXMubWF0ZXJpYWwudXBkYXRlQXRsYXNVbmlmb3JtcygpfTt0aGlzLnRpbWU9dGhpcy5jb25zdHJ1Y3Rpb25UaW1lc3RhbXA9CkRhdGUubm93KCk7dGhpcy5mcnVzdHVtQ3VsbGVkPSExfWNyZWF0ZVNwcml0ZSgpe3JldHVybiBuZXcgWXAodGhpcyx0aGlzLm5leHRJbmRleCsrKX1nZXQgdGltZSgpe3JldHVybiB0aGlzLm1hdGVyaWFsLnRpbWUrdGhpcy5jb25zdHJ1Y3Rpb25UaW1lc3RhbXB9c2V0IHRpbWUoYSl7dGhpcy5tYXRlcmlhbC50aW1lPWEtdGhpcy5jb25zdHJ1Y3Rpb25UaW1lc3RhbXB9Y3JlYXRlRGVmYXVsdFRleHR1cmVDYW52YXMoKXtjb25zdCBhPXRoaXMuZGVmYXVsdFRleHR1cmVDYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksYz1hLndpZHRoPXRoaXMuaW1hZ2VXaWR0aCxkPWEuaGVpZ2h0PXRoaXMuaW1hZ2VIZWlnaHQsZj1hLmdldENvbnRleHQoIjJkIiksZz1uZXcgSW1hZ2U7Zy5vbmxvYWQ9KCk9PntmLmRyYXdJbWFnZShnLDAsMCxjLGQpO3RoaXMuZGVmYXVsdFRleHR1cmUubmVlZHNVcGRhdGU9ITB9O2cuc3JjPVVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoWydcblx4M2NzdmcgdmVyc2lvblx4M2QiMS4xIlxuICAgICBiYXNlUHJvZmlsZVx4M2QiZnVsbCJcbiAgICAgd2lkdGhceDNkIjEyOCIgaGVpZ2h0XHgzZCIxMjgiXG4gICAgIHhtbG5zXHgzZCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyJcbiAgICAgeG1sbnM6eGxpbmtceDNkImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiXHgzZVxuICBceDNjZGVmc1x4M2VcbiAgICBceDNjbGluZWFyR3JhZGllbnQgaWRceDNkImxpbmVhckdyYWRpZW50Mzc3NCJceDNlXG4gICAgICBceDNjc3RvcFxuICAgICAgICAgc3R5bGVceDNkInN0b3AtY29sb3I6IzgwODA4MDtzdG9wLW9wYWNpdHk6MTsiXG4gICAgICAgICBvZmZzZXRceDNkIjAiIC9ceDNlXG4gICAgICBceDNjc3RvcFxuICAgICAgICAgc3R5bGVceDNkInN0b3AtY29sb3I6IzU1NTU1NTtzdG9wLW9wYWNpdHk6MTsiXG4gICAgICAgICBvZmZzZXRceDNkIjEiIC9ceDNlXG4gICAgXHgzYy9saW5lYXJHcmFkaWVudFx4M2VcbiAgICBceDNjcmFkaWFsR3JhZGllbnRcbiAgICAgICB4bGluazpocmVmXHgzZCIjbGluZWFyR3JhZGllbnQzNzc0IlxuICAgICAgIGlkXHgzZCJyYWRpYWxHcmFkaWVudDM3ODAiXG4gICAgICAgY3hceDNkIjgwIlxuICAgICAgIGN5XHgzZCI0MCJcbiAgICAgICBmeFx4M2QiODAiXG4gICAgICAgZnlceDNkIjQwIlxuICAgICAgIHJceDNkIjgwIlxuICAgICAgIGdyYWRpZW50VW5pdHNceDNkInVzZXJTcGFjZU9uVXNlIlxuICAgICAgIHNwcmVhZE1ldGhvZFx4M2QicGFkIiAvXHgzZVxuICBceDNjL2RlZnNceDNlXG4gIFx4M2NjaXJjbGUgY3hceDNkIjUwJSIgY3lceDNkIjUwJSIgclx4M2QiNTAlIiBmaWxsXHgzZCJ1cmwoI3JhZGlhbEdyYWRpZW50Mzc4MCkiIC9ceDNlXG5ceDNjL3N2Z1x4M2VcbiddLAp7dHlwZToiaW1hZ2Uvc3ZnK3htbDtjaGFyc2V0XHgzZHV0Zi04In0pKTtyZXR1cm4gYX1nZXRYKGEpe3JldHVybiB0aGlzLnBvc2l0aW9uRGF0YVsxMiphXX1zZXRYKGEsYyl7YSo9MTI7dGhpcy5wb3NpdGlvbkRhdGFbYSswXT1jO3RoaXMucG9zaXRpb25EYXRhW2ErM109Yyt0aGlzLnNwcml0ZVdpZHRoO3RoaXMucG9zaXRpb25EYXRhW2ErNl09Yyt0aGlzLnNwcml0ZVdpZHRoO3RoaXMucG9zaXRpb25EYXRhW2ErOV09Yzt0aGlzLnBvc2l0aW9uQXR0cmlidXRlLm5lZWRzVXBkYXRlPSEwfWdldFkoYSl7cmV0dXJuIHRoaXMucG9zaXRpb25EYXRhWzEyKmErMV19c2V0WShhLGMpe2EqPTEyO3RoaXMucG9zaXRpb25EYXRhW2ErMV09Yzt0aGlzLnBvc2l0aW9uRGF0YVthKzRdPWM7dGhpcy5wb3NpdGlvbkRhdGFbYSs3XT1jK3RoaXMuc3ByaXRlSGVpZ2h0O3RoaXMucG9zaXRpb25EYXRhW2ErMTBdPWMrdGhpcy5zcHJpdGVIZWlnaHQ7dGhpcy5wb3NpdGlvbkF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0KITB9Z2V0WihhKXtyZXR1cm4gdGhpcy5wb3NpdGlvbkRhdGFbMTIqYSsyXX1zZXRaKGEsYyl7YSo9MTI7dGhpcy5wb3NpdGlvbkRhdGFbYSsyXT1jO3RoaXMucG9zaXRpb25EYXRhW2ErNV09Yzt0aGlzLnBvc2l0aW9uRGF0YVthKzhdPWM7dGhpcy5wb3NpdGlvbkRhdGFbYSsxMV09Yzt0aGlzLnBvc2l0aW9uQXR0cmlidXRlLm5lZWRzVXBkYXRlPSEwfWdldFIoYSl7cmV0dXJuIHRoaXMuY29sb3JEYXRhWzE2KmFdfXNldFIoYSxjKXthKj0xNjt0aGlzLmNvbG9yRGF0YVthKzBdPWM7dGhpcy5jb2xvckRhdGFbYSs0XT1jO3RoaXMuY29sb3JEYXRhW2ErOF09Yzt0aGlzLmNvbG9yRGF0YVthKzEyXT1jO3RoaXMuY29sb3JBdHRyaWJ1dGUubmVlZHNVcGRhdGU9ITB9Z2V0RyhhKXtyZXR1cm4gdGhpcy5jb2xvckRhdGFbMTYqYSsxXX1zZXRHKGEsYyl7YSo9MTY7dGhpcy5jb2xvckRhdGFbYSsxXT1jO3RoaXMuY29sb3JEYXRhW2ErNV09Yzt0aGlzLmNvbG9yRGF0YVthKzldPWM7dGhpcy5jb2xvckRhdGFbYSsKMTNdPWM7dGhpcy5jb2xvckF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0hMH1nZXRCKGEpe3JldHVybiB0aGlzLmNvbG9yRGF0YVsxNiphKzJdfXNldEIoYSxjKXthKj0xNjt0aGlzLmNvbG9yRGF0YVthKzJdPWM7dGhpcy5jb2xvckRhdGFbYSs2XT1jO3RoaXMuY29sb3JEYXRhW2ErMTBdPWM7dGhpcy5jb2xvckRhdGFbYSsxNF09Yzt0aGlzLmNvbG9yQXR0cmlidXRlLm5lZWRzVXBkYXRlPSEwfWdldEEoYSl7cmV0dXJuIHRoaXMuY29sb3JEYXRhWzE2KmErM119c2V0QShhLGMpe2EqPTE2O3RoaXMuY29sb3JEYXRhW2ErM109Yzt0aGlzLmNvbG9yRGF0YVthKzddPWM7dGhpcy5jb2xvckRhdGFbYSsxMV09Yzt0aGlzLmNvbG9yRGF0YVthKzE1XT1jO3RoaXMuY29sb3JBdHRyaWJ1dGUubmVlZHNVcGRhdGU9ITB9Z2V0QmFzZVgoYSl7cmV0dXJuIHRoaXMuYmFzZVBvc2l0aW9uRGF0YVsxMiphXX1zZXRCYXNlWChhLGMpe2EqPTEyO3RoaXMuYmFzZVBvc2l0aW9uRGF0YVthKzBdPWM7dGhpcy5iYXNlUG9zaXRpb25EYXRhW2ErCjNdPWMrdGhpcy5zcHJpdGVXaWR0aDt0aGlzLmJhc2VQb3NpdGlvbkRhdGFbYSs2XT1jK3RoaXMuc3ByaXRlV2lkdGg7dGhpcy5iYXNlUG9zaXRpb25EYXRhW2ErOV09Yzt0aGlzLmJhc2VQb3NpdGlvbkF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0hMH1nZXRCYXNlWShhKXtyZXR1cm4gdGhpcy5iYXNlUG9zaXRpb25EYXRhWzEyKmErMV19c2V0QmFzZVkoYSxjKXthKj0xMjt0aGlzLmJhc2VQb3NpdGlvbkRhdGFbYSsxXT1jO3RoaXMuYmFzZVBvc2l0aW9uRGF0YVthKzRdPWM7dGhpcy5iYXNlUG9zaXRpb25EYXRhW2ErN109Yyt0aGlzLnNwcml0ZUhlaWdodDt0aGlzLmJhc2VQb3NpdGlvbkRhdGFbYSsxMF09Yyt0aGlzLnNwcml0ZUhlaWdodDt0aGlzLmJhc2VQb3NpdGlvbkF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0hMH1nZXRCYXNlWihhKXtyZXR1cm4gdGhpcy5iYXNlUG9zaXRpb25EYXRhWzEyKmErMl19c2V0QmFzZVooYSxjKXthKj0xMjt0aGlzLmJhc2VQb3NpdGlvbkRhdGFbYSsyXT1jOwp0aGlzLmJhc2VQb3NpdGlvbkRhdGFbYSs1XT1jO3RoaXMuYmFzZVBvc2l0aW9uRGF0YVthKzhdPWM7dGhpcy5iYXNlUG9zaXRpb25EYXRhW2ErMTFdPWM7dGhpcy5iYXNlUG9zaXRpb25BdHRyaWJ1dGUubmVlZHNVcGRhdGU9ITB9Z2V0QmFzZVIoYSl7cmV0dXJuIHRoaXMuYmFzZUNvbG9yRGF0YVsxNiphXX1zZXRCYXNlUihhLGMpe2EqPTE2O3RoaXMuYmFzZUNvbG9yRGF0YVthKzBdPWM7dGhpcy5iYXNlQ29sb3JEYXRhW2ErNF09Yzt0aGlzLmJhc2VDb2xvckRhdGFbYSs4XT1jO3RoaXMuYmFzZUNvbG9yRGF0YVthKzEyXT1jO3RoaXMuYmFzZUNvbG9yQXR0cmlidXRlLm5lZWRzVXBkYXRlPSEwfWdldEJhc2VHKGEpe3JldHVybiB0aGlzLmJhc2VDb2xvckRhdGFbMTYqYSsxXX1zZXRCYXNlRyhhLGMpe2EqPTE2O3RoaXMuYmFzZUNvbG9yRGF0YVthKzFdPWM7dGhpcy5iYXNlQ29sb3JEYXRhW2ErNV09Yzt0aGlzLmJhc2VDb2xvckRhdGFbYSs5XT1jO3RoaXMuYmFzZUNvbG9yRGF0YVthKwoxM109Yzt0aGlzLmJhc2VDb2xvckF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0hMH1nZXRCYXNlQihhKXtyZXR1cm4gdGhpcy5iYXNlQ29sb3JEYXRhWzE2KmErMl19c2V0QmFzZUIoYSxjKXthKj0xNjt0aGlzLmJhc2VDb2xvckRhdGFbYSsyXT1jO3RoaXMuYmFzZUNvbG9yRGF0YVthKzZdPWM7dGhpcy5iYXNlQ29sb3JEYXRhW2ErMTBdPWM7dGhpcy5iYXNlQ29sb3JEYXRhW2ErMTRdPWM7dGhpcy5iYXNlQ29sb3JBdHRyaWJ1dGUubmVlZHNVcGRhdGU9ITB9Z2V0QmFzZUEoYSl7cmV0dXJuIHRoaXMuYmFzZUNvbG9yRGF0YVsxNiphKzNdfXNldEJhc2VBKGEsYyl7YSo9MTY7dGhpcy5iYXNlQ29sb3JEYXRhW2ErM109Yzt0aGlzLmJhc2VDb2xvckRhdGFbYSs3XT1jO3RoaXMuYmFzZUNvbG9yRGF0YVthKzExXT1jO3RoaXMuYmFzZUNvbG9yRGF0YVthKzE1XT1jO3RoaXMuYmFzZUNvbG9yQXR0cmlidXRlLm5lZWRzVXBkYXRlPSEwfWdldE9wYWNpdHkoYSl7cmV0dXJuIHRoaXMub3BhY2l0eURhdGFbNCoKYV19c2V0T3BhY2l0eShhLGMpe2EqPTQ7dGhpcy5vcGFjaXR5RGF0YVthKzBdPWM7dGhpcy5vcGFjaXR5RGF0YVthKzFdPWM7dGhpcy5vcGFjaXR5RGF0YVthKzJdPWM7dGhpcy5vcGFjaXR5RGF0YVthKzNdPWM7dGhpcy5vcGFjaXR5QXR0cmlidXRlLm5lZWRzVXBkYXRlPSEwfWdldEJhc2VPcGFjaXR5KGEpe3JldHVybiB0aGlzLmJhc2VPcGFjaXR5RGF0YVs0KmFdfXNldEJhc2VPcGFjaXR5KGEsYyl7YSo9NDt0aGlzLmJhc2VPcGFjaXR5RGF0YVthKzBdPWM7dGhpcy5iYXNlT3BhY2l0eURhdGFbYSsxXT1jO3RoaXMuYmFzZU9wYWNpdHlEYXRhW2ErMl09Yzt0aGlzLmJhc2VPcGFjaXR5RGF0YVthKzNdPWM7dGhpcy5iYXNlT3BhY2l0eUF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0hMH1nZXRUaW1lc3RhbXAoYSl7cmV0dXJuIHRoaXMudGltZXN0YW1wRGF0YVs0KmFdK3RoaXMuY29uc3RydWN0aW9uVGltZXN0YW1wfXNldFRpbWVzdGFtcChhLGMpe2EqPTQ7Yy09dGhpcy5jb25zdHJ1Y3Rpb25UaW1lc3RhbXA7CnRoaXMudGltZXN0YW1wRGF0YVthKzBdPWM7dGhpcy50aW1lc3RhbXBEYXRhW2ErMV09Yzt0aGlzLnRpbWVzdGFtcERhdGFbYSsyXT1jO3RoaXMudGltZXN0YW1wRGF0YVthKzNdPWM7dGhpcy50aW1lc3RhbXBBdHRyaWJ1dGUubmVlZHNVcGRhdGU9ITB9Z2V0QmFzZVRpbWVzdGFtcChhKXtyZXR1cm4gdGhpcy5iYXNlVGltZXN0YW1wRGF0YVs0KmFdK3RoaXMuY29uc3RydWN0aW9uVGltZXN0YW1wfXNldEJhc2VUaW1lc3RhbXAoYSxjKXthKj00O2MtPXRoaXMuY29uc3RydWN0aW9uVGltZXN0YW1wO3RoaXMuYmFzZVRpbWVzdGFtcERhdGFbYSswXT1jO3RoaXMuYmFzZVRpbWVzdGFtcERhdGFbYSsxXT1jO3RoaXMuYmFzZVRpbWVzdGFtcERhdGFbYSsyXT1jO3RoaXMuYmFzZVRpbWVzdGFtcERhdGFbYSszXT1jO3RoaXMuYmFzZVRpbWVzdGFtcEF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0hMH1nZXRUZXh0dXJlSW5kZXgoYSl7cmV0dXJuIHRoaXMudGV4dHVyZUluZGV4RGF0YVs0KmFdfXNldFRleHR1cmVJbmRleChhLApjKXthKj00O3RoaXMudGV4dHVyZUluZGV4RGF0YVthKzBdPWM7dGhpcy50ZXh0dXJlSW5kZXhEYXRhW2ErMV09Yzt0aGlzLnRleHR1cmVJbmRleERhdGFbYSsyXT1jO3RoaXMudGV4dHVyZUluZGV4RGF0YVthKzNdPWM7dGhpcy50ZXh0dXJlSW5kZXhBdHRyaWJ1dGUubmVlZHNVcGRhdGU9ITB9Z2V0QmFzZVRleHR1cmVJbmRleChhKXtyZXR1cm4gdGhpcy5iYXNlVGV4dHVyZUluZGV4RGF0YVs0KmFdfXNldEJhc2VUZXh0dXJlSW5kZXgoYSxjKXthKj00O3RoaXMuYmFzZVRleHR1cmVJbmRleERhdGFbYSswXT1jO3RoaXMuYmFzZVRleHR1cmVJbmRleERhdGFbYSsxXT1jO3RoaXMuYmFzZVRleHR1cmVJbmRleERhdGFbYSsyXT1jO3RoaXMuYmFzZVRleHR1cmVJbmRleERhdGFbYSszXT1jO3RoaXMuYmFzZVRleHR1cmVJbmRleEF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0hMH1nZXRUZXh0dXJlVGltZXN0YW1wKGEpe3JldHVybiB0aGlzLnRleHR1cmVUaW1lc3RhbXBEYXRhWzQqYV0rdGhpcy5jb25zdHJ1Y3Rpb25UaW1lc3RhbXB9c2V0VGV4dHVyZVRpbWVzdGFtcChhLApjKXthKj00O2MtPXRoaXMuY29uc3RydWN0aW9uVGltZXN0YW1wO3RoaXMudGV4dHVyZVRpbWVzdGFtcERhdGFbYSswXT1jO3RoaXMudGV4dHVyZVRpbWVzdGFtcERhdGFbYSsxXT1jO3RoaXMudGV4dHVyZVRpbWVzdGFtcERhdGFbYSsyXT1jO3RoaXMudGV4dHVyZVRpbWVzdGFtcERhdGFbYSszXT1jO3RoaXMudGV4dHVyZVRpbWVzdGFtcEF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0hMH1nZXRCYXNlVGV4dHVyZVRpbWVzdGFtcChhKXtyZXR1cm4gdGhpcy5iYXNlVGV4dHVyZVRpbWVzdGFtcERhdGFbNCphXSt0aGlzLmNvbnN0cnVjdGlvblRpbWVzdGFtcH1zZXRCYXNlVGV4dHVyZVRpbWVzdGFtcChhLGMpe2EqPTQ7Yy09dGhpcy5jb25zdHJ1Y3Rpb25UaW1lc3RhbXA7dGhpcy5iYXNlVGV4dHVyZVRpbWVzdGFtcERhdGFbYSswXT1jO3RoaXMuYmFzZVRleHR1cmVUaW1lc3RhbXBEYXRhW2ErMV09Yzt0aGlzLmJhc2VUZXh0dXJlVGltZXN0YW1wRGF0YVthKzJdPWM7dGhpcy5iYXNlVGV4dHVyZVRpbWVzdGFtcERhdGFbYSsKM109Yzt0aGlzLmJhc2VUZXh0dXJlVGltZXN0YW1wQXR0cmlidXRlLm5lZWRzVXBkYXRlPSEwfXJlYmFzZShhLGMpe2M9dm9pZCAwPT09Yz90aGlzLnRpbWU6Yztjb25zdCBkPXRoaXMuZ2V0QmFzZVRpbWVzdGFtcChhKSxmPXRoaXMuZ2V0VGltZXN0YW1wKGEpLGc9Yz49Zj8xOmM8PWQ/MDp0aGlzLm1hdGVyaWFsLmFwcGx5RWFzaW5nKChjLWQpLyhmLWQpKSxsPShrLG4pPT5rKmcrbiooMS1nKTt0aGlzLnNldEJhc2VYKGEsbCh0aGlzLmdldFgoYSksdGhpcy5nZXRCYXNlWChhKSkpO3RoaXMuc2V0QmFzZVkoYSxsKHRoaXMuZ2V0WShhKSx0aGlzLmdldEJhc2VZKGEpKSk7dGhpcy5zZXRCYXNlWihhLGwodGhpcy5nZXRaKGEpLHRoaXMuZ2V0QmFzZVooYSkpKTt0aGlzLnNldEJhc2VSKGEsbCh0aGlzLmdldFIoYSksdGhpcy5nZXRCYXNlUihhKSkpO3RoaXMuc2V0QmFzZUcoYSxsKHRoaXMuZ2V0RyhhKSx0aGlzLmdldEJhc2VHKGEpKSk7dGhpcy5zZXRCYXNlQihhLGwodGhpcy5nZXRCKGEpLAp0aGlzLmdldEJhc2VCKGEpKSk7dGhpcy5zZXRCYXNlQShhLGwodGhpcy5nZXRBKGEpLHRoaXMuZ2V0QmFzZUEoYSkpKTt0aGlzLnNldEJhc2VPcGFjaXR5KGEsbCh0aGlzLmdldE9wYWNpdHkoYSksdGhpcy5nZXRCYXNlT3BhY2l0eShhKSkpO2M9Yz49Zj9jOmwoZixkKTt0aGlzLnNldEJhc2VUaW1lc3RhbXAoYSxjKX1zZXRTcHJpdGVJbWFnZURhdGEoYSxjLGQpe3RoaXMuc3ByaXRlQXRsYXMuc2V0U3ByaXRlSW1hZ2VEYXRhKGEsYyxkKX1zd2l0Y2hUZXh0dXJlcyhhLGMsZCl7Y29uc3QgZj10aGlzLmdldFRleHR1cmVJbmRleChhKTt0aGlzLnNldEJhc2VUZXh0dXJlSW5kZXgoYSxmKTt0aGlzLnNldFRleHR1cmVJbmRleChhLDA9PT1mPzE6MCk7dGhpcy5zZXRCYXNlVGV4dHVyZVRpbWVzdGFtcChhLGMpO3RoaXMuc2V0VGV4dHVyZVRpbWVzdGFtcChhLGQpfWZpbmRTcHJpdGVzKGEsYyl7Y29uc3QgZD1bXTtmb3IobGV0IGY9MDtmPHRoaXMuY2FwYWNpdHk7ZisrKXtjb25zdCBnPTEyKgpmO2E+PXRoaXMucG9zaXRpb25EYXRhW2crMF0mJmE8PXRoaXMucG9zaXRpb25EYXRhW2crNl0mJmM+PXRoaXMucG9zaXRpb25EYXRhW2crMV0mJmM8PXRoaXMucG9zaXRpb25EYXRhW2crN10mJmQucHVzaChmKX1yZXR1cm4gZH19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2ZhY2V0cy1kaXZlL2xpYi93b3JkdHJlZS5qcwpjb25zdCAkcD0vXGJbLSdcd10rXGIvZztmdW5jdGlvbiBhcShhKXtyZXR1cm5gJHt0eXBlb2YgYX1cdTAwMUYke2F9YH1mdW5jdGlvbiBicShhKXtyZXR1cm4gYS50b0xvd2VyQ2FzZSgpLm1hdGNoKCRwKXx8W119CmZ1bmN0aW9uIGNxKGEpe2lmKDI+YS52YWx1ZUNvdW50KXJldHVybiBudWxsO2Zvcih2YXIgYz0oZyxsKT0+e2ZvcihsZXQgaz0wO2s8Zy5sZW5ndGg7aysrKWxbZ1trXV09ITB9LGQ9e30sZj1hO2Y7KWMoZi5jb21tb25Xb3JkcyxkKSxmPWYucGFyZW50O2ZvcihmPTA7ZjxhLmNoaWxkcmVuLmxlbmd0aDtmKyspYyhhLmNoaWxkcmVuW2ZdLmNvbW1vbldvcmRzLGQpO2M9e307Zm9yKGNvbnN0IGcgaW4gYS52YWx1ZUhhc2gpe2NvbnN0IHtjb3VudDpsLHdvcmRzOmt9PWEudmFsdWVIYXNoW2ddO2Zvcihjb25zdCBuIGluIGspbiBpbiBkfHwoY1tuXT0oY1tuXXx8MCkrbCxjW25dPT09YS50b3RhbENvdW50JiYoYS5jb21tb25Xb3Jkcy5wdXNoKG4pLGRbbl09ITAsZGVsZXRlIGNbbl0pKX1hPW51bGw7ZD0wO2Zvcihjb25zdCBnIGluIGMpY1tnXT5kJiYoYT1nLGQ9Y1tnXSk7cmV0dXJuIGF9CmZ1bmN0aW9uIGRxKGEpe3ZhciBjPXtwYXJlbnQ6bnVsbCxjb21tb25Xb3JkczpbXSxsZXZlbDoxLG9yZGVyOjAsdG90YWxDb3VudDowLHZhbHVlSGFzaDp7fSx2YWx1ZUNvdW50OjAsbm9uVmFsdWVDb3VudDowLGNoaWxkcmVuOltdfTtjb25zdCBkPXtyb290OmMsbm9kZUhhc2g6e30saGlnaGVzdExldmVsOjEsbGV2ZWxIYXNoOnsxOmN9fTtmb3IodmFyIGYgaW4gYSl7aWYoIWEuaGFzT3duUHJvcGVydHkoZikpY29udGludWU7Y29uc3Qge3ZhbHVlOnEsY291bnQ6cix3b3Jkczp0fT1hW2ZdOyJzdHJpbmciPT09dHlwZW9mIHE/KGMudmFsdWVIYXNoW2ZdPXt2YWx1ZTpxLGNvdW50OnIsd29yZHM6dH0sYy52YWx1ZUNvdW50Kz1yKTpjLm5vblZhbHVlQ291bnQrPXI7Yy50b3RhbENvdW50Kz1yO2Qubm9kZUhhc2hbZl09Y31hPWMubGV2ZWw7aWYoYy5ub25WYWx1ZUNvdW50KXthKys7Zj17cGFyZW50OmMsY29tbW9uV29yZHM6W10sbGV2ZWw6YSxvcmRlcjowLHRvdGFsQ291bnQ6Yy5ub25WYWx1ZUNvdW50LAp2YWx1ZUhhc2g6e30sdmFsdWVDb3VudDowLG5vblZhbHVlQ291bnQ6Yy5ub25WYWx1ZUNvdW50LGNoaWxkcmVuOltdfTtjLm5vblZhbHVlQ291bnQ9MDtjLmNoaWxkcmVuLnB1c2goZik7ZC5oaWdoZXN0TGV2ZWw9YTtkLmxldmVsSGFzaFthXT1mO2Zvcih2YXIgZyBpbiBkLm5vZGVIYXNoKWcgaW4gYy52YWx1ZUhhc2h8fChkLm5vZGVIYXNoW2ddPWYpfWM9W2NdO2ZvcihnPXE9PnEudmFsdWVDb3VudCtxLm5vblZhbHVlQ291bnQ7MTAwPmEmJmMubGVuZ3RoOyl7Zj0wO3ZhciBsPWcoY1tmXSk7Zm9yKHZhciBrPTE7azxjLmxlbmd0aDtrKyspe2NvbnN0IHE9ZyhjW2tdKTtxPmwmJihmPWssbD1xKX1sPWNbZl07aWYoaz1jcShsKSl7YSsrO2Y9e3BhcmVudDpsLGNvbW1vbldvcmRzOltrXSxsZXZlbDphLG9yZGVyOjAsdG90YWxDb3VudDowLHZhbHVlSGFzaDp7fSx2YWx1ZUNvdW50OjAsbm9uVmFsdWVDb3VudDowLGNoaWxkcmVuOltdfTtsLmNoaWxkcmVuLnB1c2goZik7Yy5wdXNoKGYpOwpmb3IoY29uc3QgcSBpbiBsLnZhbHVlSGFzaCl7aWYoIWwudmFsdWVIYXNoLmhhc093blByb3BlcnR5KHEpKWNvbnRpbnVlO2NvbnN0IHt2YWx1ZTpyLGNvdW50OnQsd29yZHM6dn09bC52YWx1ZUhhc2hbcV07diYmayBpbiB2JiYoZi52YWx1ZUhhc2hbcV09e3ZhbHVlOnIsY291bnQ6dCx3b3Jkczp2fSxmLnZhbHVlQ291bnQrPXQsZi50b3RhbENvdW50Kz10LGRlbGV0ZSBsLnZhbHVlSGFzaFtxXSxsLnZhbHVlQ291bnQtPXQsZC5ub2RlSGFzaFtxXT1mLGQuaGlnaGVzdExldmVsPWEsZC5sZXZlbEhhc2hbYV09Zil9fWVsc2UgYy5zcGxpY2UoZiwxKX1sZXQgbj0wO2NvbnN0IHA9cT0+e3Eub3JkZXI9KytuO2ZvcihsZXQgcj0wO3I8cS5jaGlsZHJlbi5sZW5ndGg7cisrKXAocS5jaGlsZHJlbltyXSl9O3AoZC5yb290KTtyZXR1cm4gZH07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLWRpdmUvbGliL3N0YXRzLmpzCmZ1bmN0aW9uIGVxKGEpe2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuW107Y29uc3QgYz17fTtmb3IobGV0IGQ9MDtkPGEubGVuZ3RoO2QrKylpZihhW2RdKXtjb25zdCBmPU9iamVjdC5rZXlzKGFbZF0pO2ZvcihsZXQgZz0wO2c8Zi5sZW5ndGg7ZysrKWNbZltnXV09ITB9cmV0dXJuIE9iamVjdC5rZXlzKGMpfWNvbnN0IGZxPWE9PiJudW1iZXIiPT09dHlwZW9mIGEmJmE+PjA9PT1hOwpjbGFzcyBncXtjb25zdHJ1Y3Rvcigpe3RoaXMudW5pcXVlQ291bnQ9dGhpcy50b3RhbENvdW50PTA7dGhpcy52YWx1ZUhhc2g9e307dGhpcy5vdGhlckNvdW50PXRoaXMuc3RyaW5nQ291bnQ9dGhpcy5pbnRlZ2VyQ291bnQ9dGhpcy5udW1iZXJDb3VudD0wO3RoaXMuc3RyaW5nTGVuZ3Roc0NvdW50PXRoaXMuc3RyaW5nTWVhbkxlbmd0aD10aGlzLnN0cmluZ01heExlbmd0aD10aGlzLnN0cmluZ01pbkxlbmd0aD10aGlzLm51bWJlck1heD10aGlzLm51bWJlck1pbj1udWxsO3RoaXMuc3RyaW5nTGVuZ3Roc0hhc2g9e307dGhpcy50b3RhbFdvcmRDb3VudD10aGlzLm11bHRpd29yZENvdW50PTA7dGhpcy53b3JkQ291bnRzPXt9O3RoaXMudW5pcXVlV29yZENvdW50PTA7dGhpcy53b3JkVHJlZT1udWxsfWlzTnVtZXJpYygpe3JldHVybiAwPHRoaXMubnVtYmVyQ291bnQmJm51bGwhPT10aGlzLm51bWJlck1pbiYmbnVsbCE9PXRoaXMubnVtYmVyTWF4JiZ0aGlzLm51bWJlck1heD50aGlzLm51bWJlck1pbn1pc0ludGVnZXIoKXtyZXR1cm4gMDwKdGhpcy5udW1iZXJDb3VudCYmdGhpcy5pbnRlZ2VyQ291bnQ9PT10aGlzLm51bWJlckNvdW50fWFkZFZhbHVlKGEpe3RoaXMudG90YWxDb3VudCsrO2NvbnN0IGM9YXEoYSk7YyBpbiB0aGlzLnZhbHVlSGFzaHx8KHRoaXMudmFsdWVIYXNoW2NdPXt2YWx1ZTphLGNvdW50OjB9LHRoaXMudW5pcXVlQ291bnQrKyk7dGhpcy52YWx1ZUhhc2hbY10uY291bnQrKztzd2l0Y2godHlwZW9mIGEpe2Nhc2UgIm51bWJlciI6dGhpcy5pbmNvcnBvcmF0ZU51bWJlclZhbHVlKGEpO2JyZWFrO2Nhc2UgInN0cmluZyI6dGhpcy5pbmNvcnBvcmF0ZVN0cmluZ1ZhbHVlKGMsYSk7YnJlYWs7ZGVmYXVsdDp0aGlzLm90aGVyQ291bnQrK319aW5jb3Jwb3JhdGVOdW1iZXJWYWx1ZShhKXt0aGlzLm51bWJlckNvdW50Kys7ZnEoYSkmJnRoaXMuaW50ZWdlckNvdW50Kys7aXNOYU4oYSl8fCh0aGlzLm51bWJlck1pbj1udWxsPT09dGhpcy5udW1iZXJNaW4/YTpNYXRoLm1pbih0aGlzLm51bWJlck1pbixhKSx0aGlzLm51bWJlck1heD0KbnVsbD09PXRoaXMubnVtYmVyTWF4P2E6TWF0aC5tYXgodGhpcy5udW1iZXJNYXgsYSkpfWluY29ycG9yYXRlU3RyaW5nVmFsdWUoYSxjKXt0aGlzLnN0cmluZ0NvdW50Kys7dmFyIGQ9Yy5sZW5ndGg7ZCBpbiB0aGlzLnN0cmluZ0xlbmd0aHNIYXNofHwodGhpcy5zdHJpbmdMZW5ndGhzQ291bnQ9KHRoaXMuc3RyaW5nTGVuZ3Roc0NvdW50fHwwKSsxKTt0aGlzLnN0cmluZ0xlbmd0aHNIYXNoW2RdPSh0aGlzLnN0cmluZ0xlbmd0aHNIYXNoW2RdfHwwKSsxO3RoaXMuc3RyaW5nTWluTGVuZ3RoPW51bGw9PT10aGlzLnN0cmluZ01pbkxlbmd0aD9kOk1hdGgubWluKHRoaXMuc3RyaW5nTWluTGVuZ3RoLGQpO3RoaXMuc3RyaW5nTWF4TGVuZ3RoPW51bGw9PT10aGlzLnN0cmluZ01heExlbmd0aD9kOk1hdGgubWF4KHRoaXMuc3RyaW5nTWF4TGVuZ3RoLGQpO3RoaXMuc3RyaW5nTWVhbkxlbmd0aD0odGhpcy5zdHJpbmdNZWFuTGVuZ3RofHwwKSoodGhpcy5zdHJpbmdDb3VudC0xKS90aGlzLnN0cmluZ0NvdW50KwpkL3RoaXMuc3RyaW5nQ291bnQ7aWYoIXRoaXMudmFsdWVIYXNoW2FdLndvcmRzKXtjPWJxKGMudG9Mb3dlckNhc2UoKSk7MTxjLmxlbmd0aCYmKHRoaXMubXVsdGl3b3JkQ291bnQrKyx0aGlzLnRvdGFsV29yZENvdW50Kz1jLmxlbmd0aCk7ZD10aGlzLnZhbHVlSGFzaFthXS53b3Jkcz17fTtmb3IobGV0IGY9MDtmPGMubGVuZ3RoO2YrKyl7Y29uc3QgZz1jW2ZdO2RbZ109KGRbZ118fDApKzE7ZyBpbiB0aGlzLndvcmRDb3VudHN8fCh0aGlzLndvcmRDb3VudHNbZ109MCx0aGlzLnVuaXF1ZVdvcmRDb3VudCsrKX19YT10aGlzLnZhbHVlSGFzaFthXS53b3Jkcztmb3IoY29uc3QgZiBpbiBhKXRoaXMud29yZENvdW50c1tmXT0odGhpcy53b3JkQ291bnRzW2ZdfHwwKSsxfX0KZnVuY3Rpb24gaHEoYSl7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm57fTtjb25zdCBjPXt9O2ZvcihsZXQgZD0wO2Q8YS5sZW5ndGg7ZCsrKXtjb25zdCBmPWFbZF07aWYobnVsbD09Ziljb250aW51ZTtjb25zdCBnPU9iamVjdC5rZXlzKGYpO2ZvcihsZXQgbD0wO2w8Zy5sZW5ndGg7bCsrKXtjb25zdCBrPWdbbF0sbj1mW2tdO2sgaW4gY3x8KGNba109bmV3IGdxKTtjW2tdLmFkZFZhbHVlKG4pfX1mb3IoY29uc3QgZCBpbiBjKWE9Y1tkXSxhLm11bHRpd29yZENvdW50JiYoYS53b3JkVHJlZT1kcShhLnZhbHVlSGFzaCkpO3JldHVybiBjfTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9mYWNldHMtZGl2ZS9saWIvc3RyaW5nLWZvcm1hdC5qcwpmdW5jdGlvbiBpcShhKXtyZXR1cm4gYS5yZXBsYWNlKC8oW1xXX10pL2csIiQxXHUyMDBiIil9ZnVuY3Rpb24ganEoYSl7cmV0dXJuIDY1PmEubGVuZ3RoP2E6YS5zdWJzdHIoMCwzMCkrIi4uLiIrYS5zdWJzdHIoLTMwKX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLWRpdmUvY29tcG9uZW50cy9mYWNldHMtZGl2ZS12aXMvZmFjZXRzLWRpdmUtdmlzLmpzCi8qCgogQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4KCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KY29uc3Qga3E9e2JvdHRvbTo2LGxlZnQ6NixyaWdodDo2LHRvcDo2fSxscT17Ilx1ZmZmY09USEVSXHVmZmZjIjoib3RoZXIiLCJcdWZmZmNOT19XT1JEU1x1ZmZmYyI6Im5vbi13b3JkcyIsIlx1ZmZmY0FMTF9XT1JEU1x1ZmZmYyI6Im90aGVyIn0sbXE9YT0+bnVsbCE9PWEmJmEgaW4gbHE/e2xhYmVsOmxxW2FdLHNwZWNpYWw6ITB9OiJudW1iZXIiIT09dHlwZW9mIGEmJiJzdHJpbmciIT09dHlwZW9mIGE/e2xhYmVsOiIiK2Esc3BlY2lhbDohMH06e2xhYmVsOmpxKCIiK2EpLHNwZWNpYWw6ITF9LG5xPSIjNDI4NUY0ICNEQjQ0MzcgI0Y0QjQwMCAjMEY5RDU4ICNBQjQ3QkMgIzAwQUNDMSAjRkY3MDQzICM5RTlEMjQgIzVDNkJDMCAjRjA2MjkyICMwMDc5NkIgI0MyMTg1QiIuc3BsaXQoIiAiKSxvcT0iIzQyODVGNCAjMEY5RDU4ICMwMEFDQzEgIzlFOUQyNCAjNUM2QkMwICMwMDc5NkIgIzYwN0Q4QiIuc3BsaXQoIiAiKSxwcT0iI0RCNDQzNyAjRjRCNDAwICNBQjQ3QkMgI0YwNjI5MiAjQUI0N0JDICM3OTU1NDggI0ZGNzA0MyAjQzIxODVCIi5zcGxpdCgiICIpLApxcT0iIzQyODVGNCAjQzUzOTI5ICNGN0NCNEQgIzBCODA0MyAjNUUzNUIxICM4MERFRUEgI0ZGNzA0MyAjQzBDQTMzIi5zcGxpdCgiICIpLHJxPXsiYWxpZ25tZW50LWJhc2VsaW5lIjoibWlkZGxlIixmaWxsOiIjNDQ0NDQ0IiwiZm9udC1zaXplIjoxOCwiZm9udC1zdHlsZSI6Im5vcm1hbCIsInRleHQtYW5jaG9yIjoibWlkZGxlIix4OjAseTowfTtjbGFzcyBzcSBleHRlbmRzIEdwe30KY2xhc3MgdHF7Y29uc3RydWN0b3IoYSl7dGhpcy5lbGVtPWE7dGhpcy5lbmRUaW1lc3RhbXA9MDt0aGlzLnJlbmRlclF1ZXVlZD0hMTt0aGlzLmxhYmVscz1bXTt0aGlzLmF1dG9Db2xvckJ5PSExO3RoaXMuaG9yaXpvbnRhbEZhY2V0SW5mbz10aGlzLnZlcnRpY2FsRmFjZXRJbmZvPW51bGx9cmVhZHkoKXt0aGlzLmxheW91dD1uZXcgUnA7dGhpcy5ob2xkZXI9dGhpcy5lbGVtLiQuaG9sZGVyO3RoaXMuZWxlbS5zY29wZVN1YnRyZWUodGhpcy5ob2xkZXIsITApO3RoaXMuY2VsbEJhY2tncm91bmRTVkc9ZDMuc2VsZWN0KHRoaXMuaG9sZGVyKS5hcHBlbmQoInN2ZyIpLnN0eWxlKCJsZWZ0IiwwKS5zdHlsZSgicG9zaXRpb24iLCJhYnNvbHV0ZSIpLnN0eWxlKCJ0b3AiLDApO3RoaXMuY2VsbEJhY2tncm91bmRTVkdSb290PXRoaXMuY2VsbEJhY2tncm91bmRTVkcuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJyb290Iik7dGhpcy5jZWxsQmFja2dyb3VuZExheWVyPXRoaXMuY2VsbEJhY2tncm91bmRTVkdSb290LmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwKImxhYmVscyIpO3RoaXMuc2NlbmU9bmV3IFRIUkVFLlNjZW5lO3RoaXMuY2FtZXJhPW5ldyBUSFJFRS5PcnRob2dyYXBoaWNDYW1lcmEoMCwxMDAsMCwxMDAsLjEsMUUzKTt0cnl7dGhpcy5yZW5kZXJlcj1uZXcgVEhSRUUuV2ViR0xSZW5kZXJlcih7YWxwaGE6ITB9KSx0aGlzLnJlbmRlcmVyLnNldFBpeGVsUmF0aW8oKSxkMy5zZWxlY3QodGhpcy5yZW5kZXJlci5kb21FbGVtZW50KS5zdHlsZSgibGVmdCIsMCkuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpLnN0eWxlKCJwb3NpdGlvbiIsImFic29sdXRlIikuc3R5bGUoInRvcCIsMCksdGhpcy5ob2xkZXIuYXBwZW5kQ2hpbGQodGhpcy5yZW5kZXJlci5kb21FbGVtZW50KX1jYXRjaChhKXt9dGhpcy56b29tPWQzLnpvb20oKS5zY2FsZUV4dGVudChbMSw1MDBdKS5vbigiem9vbSIsdGhpcy56b29tZWQuYmluZCh0aGlzKSk7ZDMuc2VsZWN0KHRoaXMuZWxlbSkuY2FsbCh0aGlzLnpvb20pO3RoaXMubGFiZWxzQW5kQXhlc1NWRz0KZDMuc2VsZWN0KHRoaXMuaG9sZGVyKS5hcHBlbmQoInN2ZyIpLnN0eWxlKCJsZWZ0IiwwKS5zdHlsZSgicG9zaXRpb24iLCJhYnNvbHV0ZSIpLnN0eWxlKCJ0b3AiLDApO3RoaXMubGFiZWxzQW5kQXhlc1NWR1Jvb3Q9dGhpcy5sYWJlbHNBbmRBeGVzU1ZHLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwicm9vdCIpO3RoaXMubGFiZWxzTGF5ZXI9dGhpcy5sYWJlbHNBbmRBeGVzU1ZHUm9vdC5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxhYmVscyIpO3RoaXMuYXhlc0xheWVyPXRoaXMubGFiZWxzQW5kQXhlc1NWR1Jvb3QuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJheGVzIik7dGhpcy5jb21wYXJlZExheWVyPXRoaXMubGFiZWxzQW5kQXhlc1NWR1Jvb3QuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJjb21wYXJlZGJveGVzIik7dGhpcy5zZWxlY3RlZExheWVyPXRoaXMubGFiZWxzQW5kQXhlc1NWR1Jvb3QuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJzZWxlY3RlZGJveGVzIik7CnRoaXMubGFiZWxzQW5kQXhlc1NWRy5vbigiY2xpY2siLHRoaXMuY2xpY2tlZC5iaW5kKHRoaXMpKTt0aGlzLnJlbmRlcmVyfHwodGhpcy5sYWJlbHNBbmRBeGVzU1ZHLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLHRoaXMuY2VsbEJhY2tncm91bmRTVkcuc3R5bGUoImRpc3BsYXkiLCJub25lIiksZDMuc2VsZWN0KHRoaXMuaG9sZGVyKS5hcHBlbmQoInAiKS5hdHRyKCJjbGFzcyIsImVycm9yIikuc3R5bGUoImNvbG9yIiwiZGFya3JlZCIpLmh0bWwoJ1xuICAgICAgICAgICAgXHgzY3N0cm9uZ1x4M2VFUlJPUlx4M2Mvc3Ryb25nXHgzZTogRmFjZXRzIERpdmUgcmVxdWlyZXMgV2ViR0wsIGFuZCBpdCBpcyBub3RcbiAgICAgICAgICAgIGVuYWJsZWQgaW4geW91ciBicm93c2VyLiBTZWVcbiAgICAgICAgICAgIFx4M2NhIHJlbFx4M2Qibm9yZWZlcnJlciIgaHJlZlx4M2QiaHR0cDovL3dlYmdscmVwb3J0LmNvbS8iXHgzZVxuICAgICAgICAgICAgV2ViR0wgUmVwb3J0XHgzYy9hXHgzZSBmb3IgZGV0YWlscy5cbiAgICAgICAgICAnKSl9em9vbWVkKCl7Y29uc3Qge3g6YSwKeTpjLGs6ZH09ZDMuZXZlbnQudHJhbnNmb3JtLGY9dGhpcy5zY2FsZS9kO3RoaXMuY2FtZXJhLnRvcCo9Zjt0aGlzLmNhbWVyYS5sZWZ0Kj1mO3RoaXMuY2FtZXJhLnJpZ2h0Kj1mO3RoaXMuY2FtZXJhLmJvdHRvbSo9Zjt0aGlzLmNhbWVyYS5wb3NpdGlvbi5zZXQoLWEvZCxjL2QsdGhpcy5jYW1lcmEucG9zaXRpb24ueik7dGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO3RoaXMuc2NhbGU9ZDt0aGlzLnRyYW5zZm9ybVNWRygpO3RoaXMudXBkYXRlT2JqZWN0VmlzaWJpbGl0eSgpO3RoaXMucXVldWVSZW5kZXJTY2VuZSgpfWNsaWNrZWQoKXt2YXIgYT10aGlzLmVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz1kMy5ldmVudDthPXRoaXMuc3ByaXRlTWVzaC5maW5kU3ByaXRlcyh0aGlzLmNhbWVyYS5wb3NpdGlvbi54KyhjLmNsaWVudFgtYS5sZWZ0KS90aGlzLnNjYWxlLHRoaXMuY2FtZXJhLnBvc2l0aW9uLnktKGMuY2xpZW50WS1hLnRvcCkvdGhpcy5zY2FsZSk7CnZhciBkPXt9O2lmKGMuY3RybEtleSlmb3IoYz0wO2M8dGhpcy5lbGVtLnNlbGVjdGVkSW5kaWNlcy5sZW5ndGg7YysrKWRbdGhpcy5lbGVtLnNlbGVjdGVkSW5kaWNlc1tjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dPSEwO3RoaXMuZWxlbS5zZXQoInNlbGVjdGVkSW5kaWNlcyIsQXJyYXkuZnJvbShPYmplY3Qua2V5cyhkKS5tYXAoZj0+K2YpKSk7YT1bXTtmb3IoZD0wO2Q8dGhpcy5lbGVtLnNlbGVjdGVkSW5kaWNlcy5sZW5ndGg7ZCsrKWEucHVzaCh0aGlzLmVsZW0uZGF0YVt0aGlzLmVsZW0uc2VsZWN0ZWRJbmRpY2VzW2RdXSk7dGhpcy5lbGVtLnNldCgic2VsZWN0ZWREYXRhIixhKX1zZWxlY3RlZEluZGljZXNVcGRhdGVkKCl7dGhpcy5zcHJpdGVNZXNoJiZ0aGlzLnVwZGF0ZVNlbGVjdGVkQm94ZXMoKX1jb21wYXJlZEluZGljZXNVcGRhdGVkKCl7aWYodGhpcy5zcHJpdGVNZXNoKXt2YXIgYT1bXTtmb3IobGV0IGM9MDtjPHRoaXMuZWxlbS5jb21wYXJlZEluZGljZXMubGVuZ3RoO2MrKylhLnB1c2godGhpcy5lbGVtLmRhdGFbdGhpcy5lbGVtLmNvbXBhcmVkSW5kaWNlc1tjXV0pOwp0aGlzLmVsZW0uc2V0KCJjb21wYXJlZERhdGEiLGEpO3RoaXMudXBkYXRlQ29tcGFyZWRCb3hlcygpfX11cGRhdGVTZWxlY3RlZEJveGVzKCl7dmFyIGE9dGhpcy5lbGVtLnNlbGVjdGVkSW5kaWNlcy5tYXAoZD0+KHt4OnRoaXMuc3ByaXRlTWVzaC5nZXRYKGQpLHk6dGhpcy5zcHJpdGVNZXNoLmdldFkoZCl9KSk7YT10aGlzLnNlbGVjdGVkTGF5ZXIuc2VsZWN0QWxsKCIuc2VsZWN0ZWQiKS5kYXRhKGEpO3ZhciBjPWEuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJzZWxlY3RlZCIsITApLmF0dHIoInRyYW5zZm9ybSIsZD0+YHRyYW5zbGF0ZSgkey41KyhkLnh8fDApfSwkey41KyhkLnl8fDApfSkgc2NhbGUoJHszfSlgKS5zdHlsZSgib3BhY2l0eSIsMCk7Yy5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtLjUpLmF0dHIoInkiLC0uNSkuYXR0cigid2lkdGgiLDEpLmF0dHIoImhlaWdodCIsMSkuYXR0cigic3Ryb2tlIiwiIzQ4M2QwNiIpLmF0dHIoInN0cm9rZS1saW5lY2FwIiwKInJvdW5kIikuYXR0cigic3Ryb2tlLWxpbmVqb2luIiwicm91bmQiKS5hdHRyKCJzdHJva2Utb3BhY2l0eSIsMCkuYXR0cigic3Ryb2tlLXdpZHRoIiwuMykuYXR0cigiZmlsbC1vcGFjaXR5IiwwKTtjLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC0uNSkuYXR0cigieSIsLS41KS5hdHRyKCJ3aWR0aCIsMSkuYXR0cigiaGVpZ2h0IiwxKS5hdHRyKCJzdHJva2UiLCIjZmFkNDExIikuYXR0cigic3Ryb2tlLWxpbmVjYXAiLCJyb3VuZCIpLmF0dHIoInN0cm9rZS1saW5lam9pbiIsInJvdW5kIikuYXR0cigic3Ryb2tlLW9wYWNpdHkiLDApLmF0dHIoInN0cm9rZS13aWR0aCIsLjE1KS5hdHRyKCJmaWxsLW9wYWNpdHkiLDApO2M9Yy5tZXJnZShhKTtjLnRyYW5zaXRpb24oKS5hdHRyKCJ0cmFuc2Zvcm0iLGQ9PmB0cmFuc2xhdGUoJHsuNSsoZC54fHwwKX0sJHsuNSsoZC55fHwwKX0pIHNjYWxlKCR7Ljh9KWApLnN0eWxlKCJvcGFjaXR5IiwxKTtjLnNlbGVjdEFsbCgicmVjdCIpLmNsYXNzZWQoInJvdGF0ZSIsCiEwKS5hdHRyKCJzdHJva2Utb3BhY2l0eSIsMSk7YS5leGl0KCkudHJhbnNpdGlvbigpLnN0eWxlKCJvcGFjaXR5IiwwKS5yZW1vdmUoKX11cGRhdGVDb21wYXJlZEJveGVzKCl7dmFyIGE9dGhpcy5lbGVtLmNvbXBhcmVkSW5kaWNlcy5tYXAoZD0+KHt4OnRoaXMuc3ByaXRlTWVzaC5nZXRYKGQpLHk6dGhpcy5zcHJpdGVNZXNoLmdldFkoZCl9KSk7YT10aGlzLmNvbXBhcmVkTGF5ZXIuc2VsZWN0QWxsKCIuY29tcGFyZWQiKS5kYXRhKGEpO3ZhciBjPWEuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJjb21wYXJlZCIsITApLmF0dHIoInRyYW5zZm9ybSIsZD0+YHRyYW5zbGF0ZSgkey41KyhkLnh8fDApfSwkey41KyhkLnl8fDApfSkgc2NhbGUoJHszfSlgKS5zdHlsZSgib3BhY2l0eSIsMCk7Yy5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtLjUpLmF0dHIoInkiLC0uNSkuYXR0cigid2lkdGgiLDEpLmF0dHIoImhlaWdodCIsMSkuYXR0cigic3Ryb2tlIiwiIzQ0ZmY0NCIpLmF0dHIoInN0cm9rZS1saW5lY2FwIiwKInJvdW5kIikuYXR0cigic3Ryb2tlLWxpbmVqb2luIiwicm91bmQiKS5hdHRyKCJzdHJva2Utb3BhY2l0eSIsMCkuYXR0cigic3Ryb2tlLXdpZHRoIiwuMykuYXR0cigiZmlsbC1vcGFjaXR5IiwwKTtjLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC0uNSkuYXR0cigieSIsLS41KS5hdHRyKCJ3aWR0aCIsMSkuYXR0cigiaGVpZ2h0IiwxKS5hdHRyKCJzdHJva2UiLCIjMWQ2YjFkIikuYXR0cigic3Ryb2tlLWxpbmVjYXAiLCJyb3VuZCIpLmF0dHIoInN0cm9rZS1saW5lam9pbiIsInJvdW5kIikuYXR0cigic3Ryb2tlLW9wYWNpdHkiLDApLmF0dHIoInN0cm9rZS13aWR0aCIsLjE1KS5hdHRyKCJmaWxsLW9wYWNpdHkiLDApO2M9Yy5tZXJnZShhKTtjLnRyYW5zaXRpb24oKS5hdHRyKCJ0cmFuc2Zvcm0iLGQ9PmB0cmFuc2xhdGUoJHsuNSsoZC54fHwwKX0sJHsuNSsoZC55fHwwKX0pIHNjYWxlKCR7Ljh9KWApLnN0eWxlKCJvcGFjaXR5IiwxKTtjLnNlbGVjdEFsbCgicmVjdCIpLmNsYXNzZWQoInJvdGF0ZSIsCiEwKS5hdHRyKCJzdHJva2Utb3BhY2l0eSIsMSk7YS5leGl0KCkudHJhbnNpdGlvbigpLnN0eWxlKCJvcGFjaXR5IiwwKS5yZW1vdmUoKX1maXRUb1ZpZXdwb3J0KCl7Y29uc3QgYT10aGlzLmVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoYS53aWR0aCYmYS5oZWlnaHQpe3RoaXMubGF5b3V0LnZpZXdwb3J0LndpZHRoPWEud2lkdGg7dGhpcy5sYXlvdXQudmlld3BvcnQuaGVpZ2h0PWEuaGVpZ2h0O3RoaXMubGF5b3V0LnBhZGRpbmcuYm90dG9tPXRoaXMuZWxlbS5zY2VuZVBhZGRpbmc7dGhpcy5sYXlvdXQucGFkZGluZy5sZWZ0PXRoaXMuZWxlbS5zY2VuZVBhZGRpbmc7dGhpcy5sYXlvdXQucGFkZGluZy5yaWdodD10aGlzLmVsZW0uc2NlbmVQYWRkaW5nO3RoaXMubGF5b3V0LnBhZGRpbmcudG9wPXRoaXMuZWxlbS5zY2VuZVBhZGRpbmc7dGhpcy5sYXlvdXQuZ3JpZD17Ym90dG9tOjAsbGVmdDowLHJpZ2h0OnRoaXMuZ3JpZC53aWR0aCx0b3A6dGhpcy5ncmlkLmhlaWdodH07CmlmKHRoaXMubGFiZWxzLmxlbmd0aCl7dmFyIGM9MCxkPTAsZj0wLGc9MDt0aGlzLmxhYmVsc0xheWVyLnNlbGVjdEFsbCgiLmxhYmVsIikuZWFjaChmdW5jdGlvbihuKXt2YXIgcD1kMy5zZWxlY3QodGhpcykuc2VsZWN0KCIuY3VycmVudCIpLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCBxPW4uZWxlbWVudE1hcmdpbnx8e2JvdHRvbTowLGxlZnQ6MCxyaWdodDowLHRvcDowfSxyPXAuaGVpZ2h0K3EudG9wK3EuYm90dG9tO3A9cC53aWR0aCtxLmxlZnQrcS5yaWdodDtzd2l0Y2gobi5zaWRlKXtjYXNlIEZwLkJvdHRvbTpjPU1hdGgubWF4KGMscik7YnJlYWs7Y2FzZSBGcC5Ub3A6Zz1NYXRoLm1heChnLHIpO2JyZWFrO2Nhc2UgRnAuTGVmdDpkPU1hdGgubWF4KGQscCk7YnJlYWs7Y2FzZSBGcC5SaWdodDpmPU1hdGgubWF4KGYscCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIFNpZGUuIik7fX0pO3RoaXMubGF5b3V0LnBhZGRpbmcuYm90dG9tKz0KYzt0aGlzLmxheW91dC5wYWRkaW5nLmxlZnQrPWQ7dGhpcy5sYXlvdXQucGFkZGluZy5yaWdodCs9Zjt0aGlzLmxheW91dC5wYWRkaW5nLnRvcCs9Z310aGlzLmxheW91dC5yZWR1Y2VQYWRkaW5nVG9GaXRXaWR0aChhLndpZHRoKTt0aGlzLmxheW91dC5yZWR1Y2VQYWRkaW5nVG9GaXRIZWlnaHQoYS5oZWlnaHQpO3RoaXMuc2NhbGU9dGhpcy5sYXlvdXQuY29tcHV0ZVNjYWxlKCk7dmFyIHtwb3NpdGlvbjpsLGZydXN0dW06a309dGhpcy5sYXlvdXQuY29tcHV0ZUNhbWVyYSgpO3RoaXMuY2FtZXJhLmxlZnQ9ay5sZWZ0O3RoaXMuY2FtZXJhLnJpZ2h0PWsucmlnaHQ7dGhpcy5jYW1lcmEudG9wPWsudG9wO3RoaXMuY2FtZXJhLmJvdHRvbT1rLmJvdHRvbTt0aGlzLmNhbWVyYS5wb3NpdGlvbi5zZXQobC54LGwueSwxMDApO3RoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtkMy5zZWxlY3QodGhpcy5lbGVtKS5jYWxsKHRoaXMuem9vbS50cmFuc2Zvcm0sZDMuem9vbUlkZW50aXR5LnNjYWxlKHRoaXMuc2NhbGUpLnRyYW5zbGF0ZSgtdGhpcy5jYW1lcmEucG9zaXRpb24ueCwKdGhpcy5jYW1lcmEucG9zaXRpb24ueSkpO3RoaXMudHJhbnNmb3JtU1ZHKCk7dGhpcy51cGRhdGVPYmplY3RWaXNpYmlsaXR5KCk7dGhpcy5xdWV1ZVJlbmRlclNjZW5lKCl9ZWxzZSBzZXRUaW1lb3V0KCgpPT50aGlzLmZpdFRvVmlld3BvcnQoKSwxMDApfXpvb21Jbigpe3RoaXMuem9vbS5zY2FsZUJ5KGQzLnNlbGVjdCh0aGlzLmVsZW0pLDEuMSl9em9vbU91dCgpe3RoaXMuem9vbS5zY2FsZUJ5KGQzLnNlbGVjdCh0aGlzLmVsZW0pLDEvMS4xKX10cmFuc2Zvcm1TVkcoKXtjb25zdCBhPS10aGlzLmNhbWVyYS5wb3NpdGlvbi54KnRoaXMuc2NhbGUsYz10aGlzLmNhbWVyYS5wb3NpdGlvbi55KnRoaXMuc2NhbGU7dGhpcy5jZWxsQmFja2dyb3VuZFNWR1Jvb3QuYXR0cigidHJhbnNmb3JtIixgdHJhbnNsYXRlKCR7YX0sJHtjfSkgc2NhbGUoJHt0aGlzLnNjYWxlfSwkey10aGlzLnNjYWxlfSlgKTt0aGlzLmxhYmVsc0FuZEF4ZXNTVkdSb290LmF0dHIoInRyYW5zZm9ybSIsYHRyYW5zbGF0ZSgke2F9LCR7Y30pIHNjYWxlKCR7dGhpcy5zY2FsZX0sJHstdGhpcy5zY2FsZX0pYCk7CnRoaXMubGFiZWxzQW5kQXhlc1NWR1Jvb3Quc2VsZWN0QWxsKCIudW5zY2FsZSIpLmF0dHIoInRyYW5zZm9ybSIsYHNjYWxlKCR7MS90aGlzLnNjYWxlfSlgKTt0aGlzLmF4ZXNMYXllci5zZWxlY3RBbGwoIi5heGlzIikuc2VsZWN0KCJwYXRoIikuYXR0cigiZCIsZD0+ZC5wYXRoKHRoaXMuc2NhbGUpKS5hdHRyKCJzdHJva2Utd2lkdGgiLGQ9PmQuc3Ryb2tlV2lkdGgodGhpcy5zY2FsZSkpfWlzVmlzaWJsZShhLGMpe3JldHVybiBhLnNob3VsZEJlVmlzaWJsZShjLHRoaXMuc2NhbGUsdGhpcy5jYW1lcmEucG9zaXRpb24sdGhpcy5jYW1lcmEpfXVwZGF0ZU9iamVjdFZpc2liaWxpdHkoKXtjb25zdCBhPXRoaXM7dmFyIGM9dGhpcy5sYWJlbHNMYXllci5zZWxlY3RBbGwoIi5sYWJlbCIpO2NvbnN0IGQ9Yy5maWx0ZXIoZnVuY3Rpb24oZyl7cmV0dXJuKHZvaWQgMD09PWcudmlzaWJsZXx8IWcudmlzaWJsZSkmJmEuaXNWaXNpYmxlKGcsdGhpcyl9KS5lYWNoKGc9PmcudmlzaWJsZT0hMCksCmY9Yy5maWx0ZXIoZnVuY3Rpb24oZyl7cmV0dXJuKHZvaWQgMD09PWcudmlzaWJsZXx8Zy52aXNpYmxlKSYmIWEuaXNWaXNpYmxlKGcsdGhpcyl9KS5lYWNoKGc9PmcudmlzaWJsZT0hMSk7ZC5zZWxlY3RBbGwoIi5vcGFjaXR5IikudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRoaXMuZWxlbS50d2VlbkR1cmF0aW9uKS5hdHRyKCJvcGFjaXR5IiwxKTtmLnNlbGVjdEFsbCgiLm9wYWNpdHkiKS50cmFuc2l0aW9uKCkuZHVyYXRpb24odGhpcy5lbGVtLnR3ZWVuRHVyYXRpb24pLmF0dHIoIm9wYWNpdHkiLDApO2MuZmlsdGVyKGc9PiEhZy5zY2FsZURvd24pLnNlbGVjdEFsbCgiLnNjYWxlIikuYXR0cigidHJhbnNmb3JtIixnPT5gc2NhbGUoJHt0aGlzLnNjYWxlPGcubWluU2NhbGU/dGhpcy5zY2FsZS9nLm1pblNjYWxlOjF9KWApO2M9dGhpcy5heGVzTGF5ZXIuc2VsZWN0QWxsKCIuYXhpcyIpLmVhY2goZnVuY3Rpb24oZyl7Zy52aXNpYmxlPWEuaXNWaXNpYmxlKGcsdGhpcyl9KTtjLmZpbHRlcihnPT4KISFnLnZpc2libGUpLnNlbGVjdCgicGF0aCIpLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLmVsZW0udHdlZW5EdXJhdGlvbikuYXR0cigic3Ryb2tlLW9wYWNpdHkiLDEpO2MuZmlsdGVyKGc9PiFnLnZpc2libGUpLnNlbGVjdCgicGF0aCIpLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLmVsZW0udHdlZW5EdXJhdGlvbikuYXR0cigic3Ryb2tlLW9wYWNpdHkiLDApfWFkZFZlcnRpY2FsRmFjZXRMYWJlbHMoYSl7dGhpcy5lbGVtLnZlcnRpY2FsRmFjZXQgaW4gdGhpcy5zdGF0cyYmdGhpcy5ncmlkLmdldENvbHVtbih0aGlzLmdyaWQuaG9yaXpvbnRhbEtleXNbdGhpcy5ncmlkLmhvcml6b250YWxLZXlzLmxlbmd0aC0xXSkuZm9yRWFjaChjPT57Y29uc3QgZD10aGlzLnZlcnRpY2FsRmFjZXRJbmZvLmxhYmVsaW5nRnVuY3Rpb24oYy52ZXJ0aWNhbEtleSksZj1uZXcgc3E7Zi50ZXh0PWQubGFiZWw7Zi54PWMueCtjLndpZHRoO2YueT1jLmNvbnRlbnRZK2MuaW5uZXJIZWlnaHQvCjI7Zi5zaWRlPUZwLlJpZ2h0O2YuY2VsbD1jO2YuYXR0cmlidXRlcz17ImFsaWdubWVudC1iYXNlbGluZSI6Im1pZGRsZSIsZmlsbDoiIzY2NjY2NiIsImZvbnQtc2l6ZSI6cnFbImZvbnQtc2l6ZSJdLCJ0ZXh0LWFuY2hvciI6InN0YXJ0IiwiZm9udC1zdHlsZSI6ZC5zcGVjaWFsPyJpdGFsaWMiOiJub3JtYWwifTtmLm9mZnNldFBvc2l0aW9uPXt4Ojh9O2YubWluU2NhbGU9cnFbImZvbnQtc2l6ZSJdLyhjLmhlaWdodCt0aGlzLmdyaWQuY2VsbE1hcmdpbik7Zi5zY2FsZURvd249ITA7YS5wdXNoKGYpfSl9YWRkSG9yaXpvbnRhbEZhY2V0TGFiZWxzKGEpe3RoaXMuZWxlbS5ob3Jpem9udGFsRmFjZXQgaW4gdGhpcy5zdGF0cyYmdGhpcy5ncmlkLmdldFJvdyh0aGlzLmdyaWQudmVydGljYWxLZXlzW3RoaXMuZ3JpZC52ZXJ0aWNhbEtleXMubGVuZ3RoLTFdKS5mb3JFYWNoKGM9Pntjb25zdCBkPXRoaXMuaG9yaXpvbnRhbEZhY2V0SW5mby5sYWJlbGluZ0Z1bmN0aW9uKGMuaG9yaXpvbnRhbEtleSksCmY9bmV3IHNxO2YudGV4dD1kLmxhYmVsO2YueD1jLmNvbnRlbnRYK2MuaW5uZXJXaWR0aC8yO2YueT1jLnkrYy5oZWlnaHQ7Zi5zaWRlPUZwLlRvcDtmLmNlbGw9YztmLnJvdGF0ZT0tNDU7Zi5hdHRyaWJ1dGVzPXsiYWxpZ25tZW50LWJhc2VsaW5lIjoiaWRlb2dyYXBoaWMiLGZpbGw6IiNkZDY2MjIiLCJmb250LXNpemUiOnJxWyJmb250LXNpemUiXSwidGV4dC1hbmNob3IiOiJzdGFydCIsImZvbnQtc3R5bGUiOmQuc3BlY2lhbD8iaXRhbGljIjoibm9ybWFsIn07Zi5vZmZzZXRQb3NpdGlvbj17eDo4LHk6LTh9O2YubWluU2NhbGU9cnFbImZvbnQtc2l6ZSJdLyhjLndpZHRoK3RoaXMuZ3JpZC5jZWxsTWFyZ2luLzIpO2Yuc2NhbGVEb3duPSEwO2EucHVzaChmKX0pfWFkZFZlcnRpY2FsUG9zaXRpb25pbmdMYWJlbHMoYSl7aWYoInNjYXR0ZXIiPT09dGhpcy5lbGVtLnBvc2l0aW9uTW9kZSYmdGhpcy5lbGVtLnZlcnRpY2FsUG9zaXRpb24gaW4gdGhpcy5zdGF0cyl7dmFyIGM9dGhpcy5zdGF0c1t0aGlzLmVsZW0udmVydGljYWxQb3NpdGlvbl0sCmQ9dGhpcy5mb3JtYXROdW1iZXIoYy5udW1iZXJNaW4pLGY9dGhpcy5mb3JtYXROdW1iZXIoYy5udW1iZXJNYXgpLGc9KGQubGVuZ3RoKzMpLyhkLmxlbmd0aCtmLmxlbmd0aCs2KTt0aGlzLmdyaWQuZWFjaENlbGwobD0+e2lmKGwuaXRlbXMubGVuZ3RoKXtmb3IodmFyIGs9bC5zaWJsaW5ncy5sZWZ0OyEoIWt8fGsuaXRlbXMubGVuZ3RofHxrLnNpYmxpbmdzLmFib3ZlJiZrLnNpYmxpbmdzLmFib3ZlLml0ZW1zLmxlbmd0aCk7KWs9ay5zaWJsaW5ncy5sZWZ0O2s9az9rLmNvbnRlbnRYK2suaW5uZXJXaWR0aDotSW5maW5pdHk7dmFyIG49bC54KzgscD1sLmNvbnRlbnRZLHE9bC5jb250ZW50WStsLmlubmVySGVpZ2h0LHI9bmV3IHNxO3IuaWQ9YCR7bC5jb21wb3VuZEtleX0tbGVmdC1zdGFydGA7ci50ZXh0PWQ7ci54PWwueCs4O3IueT1sLnkrKHRoaXMuZWxlbS5ob3Jpem9udGFsUG9zaXRpb24/ODowKTtyLnNpZGU9RnAuTGVmdDtyLmNlbGw9bDtyLnJvdGF0ZT0tOTA7ci5hdHRyaWJ1dGVzPQp7ImFsaWdubWVudC1iYXNlbGluZSI6ImlkZW9ncmFwaGljIixmaWxsOiIjMjI1NWFhIiwiZm9udC1zaXplIjoxNiwidGV4dC1hbmNob3IiOiJzdGFydCJ9O3Iub2Zmc2V0UG9zaXRpb249e3g6a3EuYm90dG9tLHk6LWtxLnJpZ2h0fTtyLmJvdW5kaW5nQm94PXtib3R0b206cCxsZWZ0OmsscmlnaHQ6bix0b3A6cCtsLmlubmVySGVpZ2h0KihNYXRoLm1heChnLC4xKS0uMDUpfTtyLmVsZW1lbnRNYXJnaW49a3E7YS5wdXNoKHIpO3I9bmV3IHNxO3IuaWQ9YCR7bC5jb21wb3VuZEtleX0tbGVmdC1lbmRgO3IudGV4dD1mO3IueD1sLngrODtyLnk9bC55K2wuaGVpZ2h0O3Iuc2lkZT1GcC5MZWZ0O3IuY2VsbD1sO3Iucm90YXRlPS05MDtyLmF0dHJpYnV0ZXM9eyJhbGlnbm1lbnQtYmFzZWxpbmUiOiJpZGVvZ3JhcGhpYyIsZmlsbDoiIzIyNTVhYSIsImZvbnQtc2l6ZSI6MTYsInRleHQtYW5jaG9yIjoiZW5kIn07ci5vZmZzZXRQb3NpdGlvbj17eDota3EudG9wLHk6LWtxLnJpZ2h0fTtyLmJvdW5kaW5nQm94PQp7Ym90dG9tOnArbC5pbm5lckhlaWdodCooTWF0aC5taW4oZywuOSkrLjA1KSxsZWZ0OmsscmlnaHQ6bix0b3A6cX07ci5lbGVtZW50TWFyZ2luPWtxO2EucHVzaChyKX19KX19YWRkSG9yaXpvbnRhbFBvc2l0aW9uaW5nTGFiZWxzKGEpe2lmKCJzY2F0dGVyIj09PXRoaXMuZWxlbS5wb3NpdGlvbk1vZGUmJnRoaXMuZWxlbS5ob3Jpem9udGFsUG9zaXRpb24gaW4gdGhpcy5zdGF0cyl7dmFyIGM9dGhpcy5zdGF0c1t0aGlzLmVsZW0uaG9yaXpvbnRhbFBvc2l0aW9uXSxkPXRoaXMuZm9ybWF0TnVtYmVyKGMubnVtYmVyTWluKSxmPXRoaXMuZm9ybWF0TnVtYmVyKGMubnVtYmVyTWF4KSxnPShkLmxlbmd0aCszKS8oZC5sZW5ndGgrZi5sZW5ndGgrNik7dGhpcy5ncmlkLmVhY2hDZWxsKGw9PntpZihsLml0ZW1zLmxlbmd0aCl7Zm9yKHZhciBrPWwuc2libGluZ3MuYmVsb3c7ISgha3x8ay5pdGVtcy5sZW5ndGh8fGsuc2libGluZ3MucmlnaHQmJmsuc2libGluZ3MucmlnaHQuaXRlbXMubGVuZ3RoKTspaz0Kay5zaWJsaW5ncy5iZWxvdztrPWs/ay5jb250ZW50WStrLmlubmVySGVpZ2h0Oi1JbmZpbml0eTt2YXIgbj1sLmNvbnRlbnRZLHA9bC5jb250ZW50WCxxPXArbC5pbm5lcldpZHRoLHI9bmV3IHNxO3IuaWQ9YCR7bC5jb21wb3VuZEtleX0tYm90dG9tLXN0YXJ0YDtyLnRleHQ9ZDtyLng9bC54Kyh0aGlzLmVsZW0udmVydGljYWxQb3NpdGlvbj84OjApO3IueT1sLnkrODtyLnNpZGU9RnAuQm90dG9tO3IuY2VsbD1sO3IuYXR0cmlidXRlcz17ImFsaWdubWVudC1iYXNlbGluZSI6ImhhbmdpbmciLGZpbGw6IiMxMTg4NDQiLCJmb250LXNpemUiOjE2LCJ0ZXh0LWFuY2hvciI6InN0YXJ0In07ci5vZmZzZXRQb3NpdGlvbj17eDprcS5sZWZ0LHk6a3EudG9wfTtyLmJvdW5kaW5nQm94PXtib3R0b206ayxsZWZ0OnAscmlnaHQ6cCtsLmlubmVyV2lkdGgqKE1hdGgubWF4KGcsLjEpLS4wNSksdG9wOm59O3IuZWxlbWVudE1hcmdpbj1rcTthLnB1c2gocik7cj1uZXcgc3E7ci5pZD1gJHtsLmNvbXBvdW5kS2V5fS1ib3R0b20tZW5kYDsKci50ZXh0PWY7ci54PWwueCtsLndpZHRoO3IueT1sLnkrODtyLnNpZGU9RnAuQm90dG9tO3IuY2VsbD1sO3IuYXR0cmlidXRlcz17ImFsaWdubWVudC1iYXNlbGluZSI6ImhhbmdpbmciLGZpbGw6IiMxMTg4NDQiLCJmb250LXNpemUiOjE2LCJ0ZXh0LWFuY2hvciI6ImVuZCJ9O3Iub2Zmc2V0UG9zaXRpb249e3g6LWtxLnJpZ2h0LHk6a3EudG9wfTtyLmJvdW5kaW5nQm94PXtib3R0b206ayxsZWZ0OnArbC5pbm5lcldpZHRoKihNYXRoLm1pbihnLC45KSsuMDUpLHJpZ2h0OnEsdG9wOm59O3IuZWxlbWVudE1hcmdpbj1rcTthLnB1c2gocil9fSl9fWRldGVybWluZUxhYmVscygpe2NvbnN0IGE9W107dGhpcy5hZGRWZXJ0aWNhbEZhY2V0TGFiZWxzKGEpO3RoaXMuYWRkSG9yaXpvbnRhbEZhY2V0TGFiZWxzKGEpO3RoaXMuYWRkVmVydGljYWxQb3NpdGlvbmluZ0xhYmVscyhhKTt0aGlzLmFkZEhvcml6b250YWxQb3NpdGlvbmluZ0xhYmVscyhhKTtyZXR1cm4gYX11cGRhdGVDZWxsQmFja2dyb3VuZHMoKXt2YXIgYT0KdGhpcy5ncmlkLmdldENlbGxzKCkuZmlsdGVyKGM9PmMuaXRlbXMubGVuZ3RoKTthPXRoaXMuY2VsbEJhY2tncm91bmRMYXllci5zZWxlY3RBbGwoIi5jZWxsIikuZGF0YShhLGM9PmMuY29tcG91bmRLZXkpO2EuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsImNlbGwiKS5hdHRyKCJ4IixjPT5jLmNvbnRlbnRYfHwwKS5hdHRyKCJ5IixjPT5jLmNvbnRlbnRZfHwwKS5hdHRyKCJ3aWR0aCIsYz0+Yy5pbm5lcldpZHRofHwwKS5hdHRyKCJoZWlnaHQiLGM9PmMuaW5uZXJIZWlnaHR8fDApLmF0dHIoImZpbGwiLCIjZjhmOGY5IikuYXR0cigiZmlsbC1vcGFjaXR5IiwwKS5tZXJnZShhKS50cmFuc2l0aW9uKCkuZHVyYXRpb24odGhpcy5lbGVtLnR3ZWVuRHVyYXRpb24pLmF0dHIoIngiLGM9PmMuY29udGVudFh8fDApLmF0dHIoInkiLGM9PmMuY29udGVudFl8fDApLmF0dHIoIndpZHRoIixjPT5jLmlubmVyV2lkdGh8fDApLmF0dHIoImhlaWdodCIsYz0+Yy5pbm5lckhlaWdodHx8CjApLmF0dHIoImZpbGwtb3BhY2l0eSIsMSk7YS5leGl0KCkudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRoaXMuZWxlbS50d2VlbkR1cmF0aW9uKS5yZW1vdmUoKS5hdHRyKCJmaWxsLW9wYWNpdHkiLDApfXVwZGF0ZUF4ZXMoKXtjb25zdCBhPVtdOyJzdGFja2VkIiE9PXRoaXMuZWxlbS5wb3NpdGlvbk1vZGUmJnRoaXMuZ3JpZC5lYWNoQ2VsbChmPT57aWYoZi5pdGVtcy5sZW5ndGgpe2lmKHRoaXMuZWxlbS52ZXJ0aWNhbFBvc2l0aW9uKXtjb25zdCBnPW5ldyBRcChGcC5MZWZ0LGYpO2EucHVzaChnKX10aGlzLmVsZW0uaG9yaXpvbnRhbFBvc2l0aW9uJiYoZj1uZXcgUXAoRnAuQm90dG9tLGYpLGEucHVzaChmKSl9fSk7Y29uc3QgYz10aGlzLmF4ZXNMYXllci5zZWxlY3RBbGwoIi5heGlzIikuZGF0YShhLGY9PmYua2V5KCkpLGQ9Yy5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwiYXhpcyIpLmF0dHIoIm9wYWNpdHkiLDApO2QuYXBwZW5kKCJwYXRoIikuYXR0cigiZCIsZj0+CmYucGF0aCh0aGlzLnNjYWxlKSkuYXR0cigic3Ryb2tlIixmPT5mLnNpZGU9PT1GcC5MZWZ0PyIjMjI1NWFhIjoiIzExODg0NCIpLmF0dHIoInN0cm9rZS13aWR0aCIsZj0+Zi5zdHJva2VXaWR0aCh0aGlzLnNjYWxlKSkuYXR0cigic3Ryb2tlLW9wYWNpdHkiLDApLmF0dHIoImZpbGwiLCJub25lIik7ZC5tZXJnZShjKS50cmFuc2l0aW9uKCkuZHVyYXRpb24odGhpcy5lbGVtLnR3ZWVuRHVyYXRpb24pLmF0dHIoIm9wYWNpdHkiLDEpO2QubWVyZ2UoYykuc2VsZWN0KCJwYXRoIikudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRoaXMuZWxlbS50d2VlbkR1cmF0aW9uKS5hdHRyKCJkIixmPT5mLnBhdGgodGhpcy5zY2FsZSkpO2MuZXhpdCgpLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLmVsZW0udHdlZW5EdXJhdGlvbikucmVtb3ZlKCkuYXR0cigib3BhY2l0eSIsMCl9dXBkYXRlTGFiZWxzKCl7aWYodGhpcy5zY2FsZSl7dGhpcy5sYWJlbHM9dGhpcy5kZXRlcm1pbmVMYWJlbHMoKTt2YXIgYT0KdGhpcy5sYWJlbHNMYXllci5zZWxlY3RBbGwoIi5sYWJlbCIpLmRhdGEodGhpcy5sYWJlbHMsbD0+bC5pZHx8YCR7bC5zaWRlfS0ke2wudGV4dH1gKTthLmVhY2goZnVuY3Rpb24obCl7Y29uc3Qgaz1kMy5zZWxlY3QodGhpcyksbj1rLnNlbGVjdCgiLmN1cnJlbnQiKTtsLnRleHQhPT1uLnRleHQoKSYmKG4uYXR0cigiZmlsbC1vcGFjaXR5IiwwKSxrLnNlbGVjdCgiLm9sZCIpLmF0dHIoImZpbGwtb3BhY2l0eSIsMSkudGV4dChuLnRleHQoKSkpfSkuc2VsZWN0KCIuY3VycmVudCIpLnRleHQobD0+bC50ZXh0KTt2YXIgYz1sPT5rPT52b2lkIDA9PT1rLmF0dHJpYnV0ZXN8fHZvaWQgMD09PWsuYXR0cmlidXRlc1tsXT9ycVtsXTprLmF0dHJpYnV0ZXNbbF0sZD1hLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsYWJlbCIpLmF0dHIoInRyYW5zZm9ybSIsbD0+YHRyYW5zbGF0ZSgke2wueH0sJHtsLnl9KWApLGY9ZC5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImZsaXAiKS5hdHRyKCJ0cmFuc2Zvcm0iLAoic2NhbGUoMSwtMSkiKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInJvdGF0ZSIpLmF0dHIoInRyYW5zZm9ybSIsbD0+InJvdGF0ZSgiKygicm90YXRlImluIGw/bC5yb3RhdGU6MCkrIikiKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInVuc2NhbGUiKS5hdHRyKCJ0cmFuc2Zvcm0iLGBzY2FsZSgkezEvdGhpcy5zY2FsZX0pYCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJwb3NpdGlvbiIpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwib3BhY2l0eSBzY2FsZSIpLGc9Zi5hcHBlbmQoInRleHQiKS5hdHRyKCJjbGFzcyIsIm9sZCIpLmF0dHIoImZpbGwtb3BhY2l0eSIsMCk7Zj1mLmFwcGVuZCgidGV4dCIpLmF0dHIoImNsYXNzIiwiY3VycmVudCIpLmF0dHIoImZpbGwtb3BhY2l0eSIsMCkudGV4dChsPT5sLnRleHQpO2Zvcihjb25zdCBsIGluIHJxKXJxLmhhc093blByb3BlcnR5KGwpJiYoZy5hdHRyKGwsYyhsKSksZi5hdHRyKGwsYyhsKSkpO2c9ZC5tZXJnZShhKS50cmFuc2l0aW9uKCkuZHVyYXRpb24odGhpcy5lbGVtLnR3ZWVuRHVyYXRpb24pLmF0dHIoInRyYW5zZm9ybSIsCmw9PmB0cmFuc2xhdGUoJHtsLnh9LCR7bC55fSlgKTtnLnNlbGVjdCgiLnJvdGF0ZSIpLmF0dHIoInRyYW5zZm9ybSIsbD0+InJvdGF0ZSgiKygicm90YXRlImluIGw/bC5yb3RhdGU6MCkrIikiKTtnLmZpbHRlcihsPT4hIWwub2Zmc2V0UG9zaXRpb24pLnNlbGVjdCgiLnBvc2l0aW9uIikuYXR0cigidHJhbnNmb3JtIixsPT5gdHJhbnNsYXRlKCR7bC5vZmZzZXRQb3NpdGlvbi54fHwwfSwke2wub2Zmc2V0UG9zaXRpb24ueXx8MH0pYCk7ZD1nLnNlbGVjdCgiLm9sZCIpLmF0dHIoImZpbGwtb3BhY2l0eSIsMCk7Zz1nLnNlbGVjdCgiLmN1cnJlbnQiKS5hdHRyKCJmaWxsLW9wYWNpdHkiLDEpO2Zvcihjb25zdCBsIGluIHJxKXJxLmhhc093blByb3BlcnR5KGwpJiYoZC5hdHRyKGwsYyhsKSksZy5hdHRyKGwsYyhsKSkpO2EuZXhpdCgpLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLmVsZW0udHdlZW5EdXJhdGlvbikucmVtb3ZlKCkuc2VsZWN0KCIuY3VycmVudCIpLmF0dHIoImZpbGwtb3BhY2l0eSIsCjApfX1kYXRhQ2hhbmdlKCl7Y29uc3QgYT10aGlzLmVsZW0uZGF0YTtpZihhJiZhLmxlbmd0aCl7dGhpcy5yZXNpemVIYW5kbGVyKCk7dGhpcy5zdGF0cz1ocShhKTtpZih0aGlzLml0ZW1zKWlmKHRoaXMuaXRlbXMubGVuZ3RoIT09YS5sZW5ndGgpdGhpcy5pbml0aWFsaXplU3ByaXRlTWVzaCgpLHRoaXMudXBkYXRlSW1hZ2VGaWVsZE5hbWUoKTtlbHNlIGZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKXRoaXMuaXRlbXNbY10uZGF0YT1hW2NdO2Vsc2UgdGhpcy5pbml0aWFsaXplU3ByaXRlTWVzaCgpLHRoaXMucGlja0NvbG9yQnlGaWVsZCgpLHRoaXMucGlja1RleHREcmF3aW5nRmllbGQoKTt0aGlzLnVwZGF0ZUdyaWRGYWNldGluZygpO3RoaXMudXBkYXRlR3JpZEl0ZW1Qb3NpdGlvbnMoKTt0aGlzLnVwZGF0ZUNvbG9ycygpfX1pbml0aWFsaXplU3ByaXRlTWVzaCgpe3RoaXMuc3ByaXRlTWVzaCYmKHRoaXMuc2NlbmUucmVtb3ZlKHRoaXMuc3ByaXRlTWVzaCksdGhpcy5zcHJpdGVNZXNoLnNwcml0ZUF0bGFzLmNsZWFyUXVldWVzKCksCmRlbGV0ZSB0aGlzLnNwcml0ZU1lc2gpO2NvbnN0IGE9dGhpcy5lbGVtLmRhdGEsYz1hLmxlbmd0aDt2YXIgZD10aGlzLmVsZW0uc3ByaXRlSW1hZ2VXaWR0aCxmPXRoaXMuZWxlbS5zcHJpdGVJbWFnZUhlaWdodDtjb25zdCBnPWQvZjt0aGlzLnNwcml0ZU1lc2g9bmV3IFpwKGMsZCxmKTt0aGlzLnNjZW5lLmFkZCh0aGlzLnNwcml0ZU1lc2gpO3RoaXMuc3ByaXRlTWVzaC5zcHJpdGVBdGxhcy5vbkRyYXdGaW5pc2hlZD0oKT0+dGhpcy5xdWV1ZVJlbmRlclNjZW5lKCk7dGhpcy5pdGVtcz1bXTtkPU1hdGguY2VpbChNYXRoLnNxcnQoYykpO2Y9TWF0aC5jZWlsKGMvZCk7Zm9yKGxldCBsPTA7bDxjO2wrKyl7Y29uc3Qgaz10aGlzLnNwcml0ZU1lc2guY3JlYXRlU3ByaXRlKCk7ay54PWQvMjtrLnk9Zi8yO2sub3BhY2l0eT0wO2sudGltZXN0YW1wPURhdGUubm93KCk7ay5yZWJhc2Uoay50aW1lc3RhbXApO3RoaXMuaXRlbXMucHVzaCh7c3ByaXRlOmssZGF0YTphW2xdfSl9dGhpcy5ncmlkPQpuZXcgUHAodGhpcy5pdGVtcyk7dGhpcy5ncmlkLmNlbGxNYXJnaW49MTt0aGlzLmdyaWQuaXRlbUFzcGVjdFJhdGlvPWc7dGhpcy5ncmlkLml0ZW1Qb3NpdGlvblNldHRlcj0obCxrLG4pPT57Y29uc3QgcD1EYXRlLm5vdygpO2wuc3ByaXRlLnJlYmFzZShwKTtsLnNwcml0ZS54PWs7bC5zcHJpdGUueT1uO2wuc3ByaXRlLm9wYWNpdHk9MTtsLnNwcml0ZS50aW1lc3RhbXA9cCt0aGlzLmVsZW0udHdlZW5EdXJhdGlvbjt0aGlzLnJlbmRlclVudGlsKGwuc3ByaXRlLnRpbWVzdGFtcCl9fWZpbHRlcmVkRGF0YUluZGljZXNDaGFuZ2UoKXtjb25zdCBhPXRoaXMuZWxlbS5maWx0ZXJlZERhdGFJbmRpY2VzLGM9W107aWYoYSlmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGY9YVtkXTtmPHRoaXMuaXRlbXMubGVuZ3RoJiYoY1tmXT0hMCl9ZD1bXTtmPVtdO2NvbnN0IGc9RGF0ZS5ub3coKSxsPWcrdGhpcy5lbGVtLnR3ZWVuRHVyYXRpb247Zm9yKGxldCBrPTA7azx0aGlzLml0ZW1zLmxlbmd0aDtrKyspe2NvbnN0IG49CnRoaXMuaXRlbXNba107IWF8fGNba10/KGQucHVzaChuLmRhdGEpLGYucHVzaChuKSxuLnNwcml0ZS5vcGFjaXR5fHwobi5zcHJpdGUucmViYXNlKGcpLG4uc3ByaXRlLnRpbWVzdGFtcD1sLG4uc3ByaXRlLm9wYWNpdHk9MSkpOjA8bi5zcHJpdGUub3BhY2l0eSYmKG4uc3ByaXRlLnJlYmFzZShnKSxuLnNwcml0ZS50aW1lc3RhbXA9bCxuLnNwcml0ZS5vcGFjaXR5PTApfXRoaXMucmVuZGVyVW50aWwobCk7dGhpcy5zdGF0cz1ocShkKTt0aGlzLmdyaWQuaXRlbXM9Zjt0aGlzLnVwZGF0ZUdyaWRGYWNldGluZygpO3RoaXMudXBkYXRlR3JpZEl0ZW1Qb3NpdGlvbnMoKX1waWNrQ29sb3JCeUZpZWxkKCl7bGV0IGE9bnVsbCxjPUluZmluaXR5O2Zvcihjb25zdCBkIGluIHRoaXMuc3RhdHMpaWYodGhpcy5zdGF0cy5oYXNPd25Qcm9wZXJ0eShkKSl7Y29uc3QgZj10aGlzLnN0YXRzW2RdLGc9TWF0aC5hYnMoZi51bmlxdWVDb3VudC1ucS5sZW5ndGgpOzE8Zi51bmlxdWVDb3VudCYmZzxjJiYKKGE9ZCxjPWcpfWlzRmluaXRlKGMpJiZhIGluIHRoaXMuc3RhdHMmJih0aGlzLmF1dG9Db2xvckJ5PSEwLHRoaXMuZWxlbS5zZXQoImNvbG9yQnkiLGEpKX1waWNrVGV4dERyYXdpbmdGaWVsZCgpe2xldCBhPSIiLGM9LUluZmluaXR5O2Zvcihjb25zdCBmIGluIHRoaXMuc3RhdHMpaWYodGhpcy5zdGF0cy5oYXNPd25Qcm9wZXJ0eShmKSl7dmFyIGQ9dGhpcy5zdGF0c1tmXTtkPWQuc3RyaW5nQ291bnQrZC5zdHJpbmdMZW5ndGhzQ291bnQtZC50b3RhbENvdW50O2Q+YyYmKGE9ZixjPWQpfWlzRmluaXRlKGMpJiZhIGluIHRoaXMuc3RhdHMmJnRoaXMuZWxlbS5zZXQoImltYWdlRmllbGROYW1lIixhKX1xdWV1ZUF0bGFzVXJsQ2hhbmdlKCl7dGhpcy5hdGxhc1VybENoYW5nZVRpbWVyJiZjbGVhclRpbWVvdXQodGhpcy5hdGxhc1VybENoYW5nZVRpbWVyKTt0aGlzLmF0bGFzVXJsQ2hhbmdlVGltZXI9c2V0VGltZW91dCgoKT0+e3RoaXMuYXRsYXNVcmxDaGFuZ2VUaW1lciYmdGhpcy5hdGxhc1VybENoYW5nZSgpfSwKMTAwKX1hdGxhc1VybENoYW5nZSgpe2NsZWFyVGltZW91dCh0aGlzLmF0bGFzVXJsQ2hhbmdlVGltZXIpO2RlbGV0ZSB0aGlzLmF0bGFzVXJsQ2hhbmdlVGltZXI7aWYodGhpcy5zcHJpdGVNZXNoKXt2YXIgYT10aGlzLmVsZW0uYXRsYXNVcmw7YSYmYS5sZW5ndGgmJmEhPT10aGlzLmxhc3RBdGxhc1VybCYmKHRoaXMubGFzdEF0bGFzVXJsPWEsdGhpcy5yZXNldFNwcml0ZXNUb0RlZmF1bHRUZXh0dXJlKCksdGhpcy5zcHJpdGVNZXNoLnNwcml0ZUF0bGFzLnNldEF0bGFzVXJsKGEsdGhpcy5lbGVtLmNyb3NzT3JpZ2luLCgpPT57Y29uc3QgYz10aGlzLmVsZW0uZGF0YSxkPURhdGUubm93KCksZj1kK3RoaXMuZWxlbS5mYWRlRHVyYXRpb247Zm9yKGxldCBnPTA7YyYmZzxjLmxlbmd0aDtnKyspdGhpcy5zcHJpdGVNZXNoLnN3aXRjaFRleHR1cmVzKGcsZCxmKTt0aGlzLnJlbmRlclVudGlsKGYpO3RoaXMuaWdub3JlQ2hhbmdlPSEwO3RoaXMuZWxlbS5zZXQoImltYWdlRmllbGROYW1lIiwKIiIpO2RlbGV0ZSB0aGlzLmlnbm9yZUNoYW5nZTt0aGlzLmF1dG9Db2xvckJ5JiYodGhpcy5hdXRvQ29sb3JCeT0hMSx0aGlzLmVsZW0uc2V0KCJjb2xvckJ5IiwiIikpfSkpfWVsc2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuYXRsYXNVcmxDaGFuZ2UuYmluZCh0aGlzKSl9c3ByaXRlVXJsQ2hhbmdlKCl7Y29uc3QgYT10aGlzLmVsZW0uc3ByaXRlVXJsO2lmKGEpaWYodGhpcy5zcHJpdGVNZXNoKXtjb25zdCBjPW5ldyBJbWFnZTt2b2lkIDAhPT10aGlzLmVsZW0uY3Jvc3NPcmlnaW4mJihjLmNyb3NzT3JpZ2luPXRoaXMuZWxlbS5jcm9zc09yaWdpbik7Yy5vbmxvYWQ9KCk9Pntjb25zdCBkPXRoaXMuc3ByaXRlTWVzaC5kZWZhdWx0VGV4dHVyZUNhbnZhcyxmPWQuZ2V0Q29udGV4dCgiMmQiKTtmLmNsZWFyUmVjdCgwLDAsZC53aWR0aCxkLmhlaWdodCk7Zi5kcmF3SW1hZ2UoYywwLDAsZC53aWR0aCxkLmhlaWdodCk7dGhpcy5zcHJpdGVNZXNoLmRlZmF1bHRUZXh0dXJlLm5lZWRzVXBkYXRlPQohMDt0aGlzLnF1ZXVlUmVuZGVyU2NlbmUoKX07Yy5zcmM9YX1lbHNlIHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnNwcml0ZVVybENoYW5nZS5iaW5kKHRoaXMpKX11cGRhdGVHcmlkU3RhY2tpbmcoKXsic3RhY2tlZCI9PT10aGlzLmVsZW0ucG9zaXRpb25Nb2RlJiYodGhpcy5ncmlkLmNvbXB1dGVJdGVtUG9zaXRpb249TXAodGhpcy5lbGVtLnZlcnRpY2FsRmFjZXQ/Im1pZGRsZSI6ImJvdHRvbSIsdGhpcy5lbGVtLmhvcml6b250YWxGYWNldD8ibWlkZGxlIjoicmlnaHQiKSl9dXBkYXRlR3JpZEZhY2V0aW5nKCl7aWYodGhpcy5ncmlkKXt0aGlzLnVwZGF0ZUdyaWRTdGFja2luZygpO3ZhciBhPXRoaXMudmVydGljYWxGYWNldEluZm89dGhpcy5nZW5lcmF0ZUZhY2V0aW5nSW5mbyh0aGlzLmVsZW0udmVydGljYWxGYWNldCx0aGlzLmVsZW0udmVydGljYWxCdWNrZXRzLHRoaXMuZWxlbS52ZXJ0aWNhbEJhZ09mV29yZHMsITApO3RoaXMuZ3JpZC52ZXJ0aWNhbEZhY2V0PWEuZmFjZXRpbmdGdW5jdGlvbjsKdGhpcy5ncmlkLnZlcnRpY2FsS2V5Q29tcGFyZT1hLmtleUNvbXBhcmVGdW5jdGlvbjthPXRoaXMuaG9yaXpvbnRhbEZhY2V0SW5mbz10aGlzLmdlbmVyYXRlRmFjZXRpbmdJbmZvKHRoaXMuZWxlbS5ob3Jpem9udGFsRmFjZXQsdGhpcy5lbGVtLmhvcml6b250YWxCdWNrZXRzLHRoaXMuZWxlbS5ob3Jpem9udGFsQmFnT2ZXb3JkcywhMSk7dGhpcy5ncmlkLmhvcml6b250YWxGYWNldD1hLmZhY2V0aW5nRnVuY3Rpb247dGhpcy5ncmlkLmhvcml6b250YWxLZXlDb21wYXJlPWEua2V5Q29tcGFyZUZ1bmN0aW9uO3RoaXMuZWxlbS5maXRHcmlkQXNwZWN0UmF0aW9Ub1ZpZXdwb3J0PyhhPXRoaXMuZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0aGlzLmdyaWQudGFyZ2V0R3JpZEFzcGVjdFJhdGlvPWEmJmEud2lkdGgmJmEuaGVpZ2h0P2Eud2lkdGgvYS5oZWlnaHR8fDE6MSk6dGhpcy5ncmlkLnRhcmdldEdyaWRBc3BlY3RSYXRpbz0xO3RoaXMuZ3JpZC5hcnJhbmdlKCk7dGhpcy51cGRhdGVDZWxsQmFja2dyb3VuZHMoKTsKdGhpcy51cGRhdGVBeGVzKCk7dGhpcy51cGRhdGVMYWJlbHMoKTt0aGlzLnVwZGF0ZVNlbGVjdGVkQm94ZXMoKTt0aGlzLnVwZGF0ZUNvbXBhcmVkQm94ZXMoKTt0aGlzLmZpdFRvVmlld3BvcnQoKX19dXBkYXRlR3JpZEl0ZW1Qb3NpdGlvbnMoKXtpZih0aGlzLmdyaWQpe3RoaXMudXBkYXRlR3JpZFN0YWNraW5nKCk7dmFyIGE9dGhpcy5ncmlkLmNlbGxQYWRkaW5nLGM9T3AuVGlnaHQsZD1PcC5Vbmlmb3JtLGY9ITE7aWYoInN0YWNrZWQiPT09dGhpcy5lbGVtLnBvc2l0aW9uTW9kZSlmPXRoaXMuZ3JpZC52ZXJ0aWNhbEdyaWRBbGlnbm1lbnQhPT1jfHx0aGlzLmdyaWQuaG9yaXpvbnRhbEdyaWRBbGlnbm1lbnQhPT1jLHRoaXMuZ3JpZC52ZXJ0aWNhbEdyaWRBbGlnbm1lbnQ9Yyx0aGlzLmdyaWQuaG9yaXpvbnRhbEdyaWRBbGlnbm1lbnQ9Yyx0aGlzLmdyaWQuY2VsbFBhZGRpbmcudG9wPTAsdGhpcy5ncmlkLmNlbGxQYWRkaW5nLmxlZnQ9MCx0aGlzLmdyaWQuY2VsbFBhZGRpbmcucmlnaHQ9CjAsdGhpcy5ncmlkLmNlbGxQYWRkaW5nLmJvdHRvbT0wLHRoaXMuZ3JpZC5taW5DZWxsQXNwZWN0UmF0aW89MCx0aGlzLmdyaWQubWF4Q2VsbEFzcGVjdFJhdGlvPUluZmluaXR5O2Vsc2V7dGhpcy5lbGVtLnZlcnRpY2FsUG9zaXRpb24/KGY9dGhpcy5ncmlkLnZlcnRpY2FsR3JpZEFsaWdubWVudCE9PWQsdGhpcy5ncmlkLnZlcnRpY2FsR3JpZEFsaWdubWVudD1kKTooZj10aGlzLmdyaWQudmVydGljYWxHcmlkQWxpZ25tZW50IT09Yyx0aGlzLmdyaWQudmVydGljYWxHcmlkQWxpZ25tZW50PWMpO3RoaXMuZWxlbS5ob3Jpem9udGFsUG9zaXRpb24/KGY9Znx8dGhpcy5ncmlkLmhvcml6b250YWxHcmlkQWxpZ25tZW50IT09ZCx0aGlzLmdyaWQuaG9yaXpvbnRhbEdyaWRBbGlnbm1lbnQ9ZCk6KGY9Znx8dGhpcy5ncmlkLmhvcml6b250YWxHcmlkQWxpZ25tZW50IT09Yyx0aGlzLmdyaWQuaG9yaXpvbnRhbEdyaWRBbGlnbm1lbnQ9Yyk7Y29uc3QgZz10aGlzLmdlbmVyYXRlUG9zaXRpb25GdW5jdGlvbih0aGlzLmVsZW0uaG9yaXpvbnRhbFBvc2l0aW9uKXx8CktwLGw9dGhpcy5nZW5lcmF0ZVBvc2l0aW9uRnVuY3Rpb24odGhpcy5lbGVtLnZlcnRpY2FsUG9zaXRpb24pfHxMcDt0aGlzLmdyaWQuY29tcHV0ZUl0ZW1Qb3NpdGlvbj0oayxuLHAscSk9Pih7eDpnKGssbixwLHEpLHk6bChrLG4scCxxKX0pO2M9dGhpcy5lbGVtLnZlcnRpY2FsUG9zaXRpb24/ODowO2Q9dGhpcy5lbGVtLmhvcml6b250YWxQb3NpdGlvbj84OjA7Zj1mfHwwIT09YS50b3B8fGMhPT1hLmxlZnR8fDAhPT1hLnJpZ2h0fHxkIT09YS5ib3R0b207dGhpcy5ncmlkLmNlbGxQYWRkaW5nLnRvcD0wO3RoaXMuZ3JpZC5jZWxsUGFkZGluZy5yaWdodD0wO3RoaXMuZ3JpZC5jZWxsUGFkZGluZy5sZWZ0PWM7dGhpcy5ncmlkLmNlbGxQYWRkaW5nLmJvdHRvbT1kO3RoaXMuZ3JpZC5taW5DZWxsQXNwZWN0UmF0aW89MTt0aGlzLmdyaWQubWF4Q2VsbEFzcGVjdFJhdGlvPTJ9Zj8odGhpcy5ncmlkLmFycmFuZ2UoKSx0aGlzLnVwZGF0ZUNlbGxCYWNrZ3JvdW5kcygpKTp0aGlzLmdyaWQucG9zaXRpb25JdGVtcygpOwp0aGlzLnVwZGF0ZUF4ZXMoKTt0aGlzLnVwZGF0ZUxhYmVscygpO3RoaXMudXBkYXRlU2VsZWN0ZWRCb3hlcygpO3RoaXMudXBkYXRlQ29tcGFyZWRCb3hlcygpO3RoaXMuZml0VG9WaWV3cG9ydCgpfX1nZXRQYWxldHRlU291cmNlKCl7c3dpdGNoKHRoaXMuZWxlbS5wYWxldHRlQ2hvaWNlKXtjYXNlICJ3YXJtIjpyZXR1cm4gcHE7Y2FzZSAiY29vbCI6cmV0dXJuIG9xO2Nhc2UgImFzc2lzdCI6cmV0dXJuIHFxO2RlZmF1bHQ6cmV0dXJuIG5xfX11cGRhdGVTY2FsYXJQYWxldHRlKCl7Y29uc3QgYT10aGlzLmVsZW0uY29sb3JCeSxjPXRoaXMuc3RhdHNbYV07dmFyIGQ9dGhpcy5ncmlkLml0ZW1zLGY9ZDMucmdiKCIjQTUyNzE0IiksZz1kMy5zY2FsZUxpbmVhcigpO2cuZG9tYWluKFtjLm51bWJlck1pbixjLm51bWJlck1heF0pLnJhbmdlKFsid2hpdGUiLCIjMUMzQUE5Il0pO2NvbnN0IGw9W107Zm9yKHZhciBrPTA7azxkLmxlbmd0aDtrKyspe3ZhciBuPWRba107bj1hIGluIG4uZGF0YT8Kbi5kYXRhW2FdOk5hTjtuPSJudW1iZXIiIT09dHlwZW9mIG58fGlzTmFOKG4pP2Y6ZDMucmdiKGcobikpO2wucHVzaChuKX1kPXRoaXMuZ2VuZXJhdGVGYWNldGluZ0luZm8oYSw1LCExLCExKS5sYWJlbGluZ0Z1bmN0aW9uO2Y9ZDMuc2NhbGVMaW5lYXIoKTtmLmRvbWFpbihbMCw0XSkucmFuZ2UoWyJ3aGl0ZSIsIiMxQzNBQTkiXSk7Zz1bXTtmb3Ioaz00OzA8PWs7ay0tKW49ZChrKSxnLnB1c2goe2tleTprLGNvbG9yOmYoayksY29udGVudDpufSk7KGMub3RoZXJDb3VudHx8Yy5zdHJpbmdDb3VudHx8Yy50b3RhbENvdW50PHRoaXMuZ3JpZC5pdGVtcy5sZW5ndGgpJiZnLnB1c2goe2tleTpOYU4sY29sb3I6IiNBNTI3MTQiLGNvbnRlbnQ6e2xhYmVsOiJtaXNzaW5nIixzcGVjaWFsOiEwfX0pO3RoaXMuZWxlbS5zZXQoInBhbGV0dGUiLGcpO3RoaXMuZ3JpZC5jZWxsSXRlbUNvbXBhcmF0b3I9KHAscSk9PntpZighKGEgaW4gcC5kYXRhfHxhIGluIHEuZGF0YSkpcmV0dXJuIDA7aWYoIShhIGluCnAuZGF0YSkpcmV0dXJuLTE7aWYoIShhIGluIHEuZGF0YSkpcmV0dXJuIDE7cD1wLmRhdGFbYV07cT1xLmRhdGFbYV07aWYocD09PXEpcmV0dXJuIDA7Y29uc3Qgcj0ibnVtYmVyIiE9PXR5cGVvZiBwfHxpc05hTihwKSx0PSJudW1iZXIiIT09dHlwZW9mIHF8fGlzTmFOKHEpO3JldHVybiByJiZ0PzA6cj8tMTp0PzE6cC1xfTtyZXR1cm4gbH11cGRhdGVDYXRlZ29yaWNhbFBhbGV0dGUoYSl7Y29uc3QgYz10aGlzLmVsZW0uY29sb3JCeSxkPXRoaXMuc3RhdHNbY10sZj10aGlzLmdyaWQuaXRlbXMsZz1PYmplY3Qua2V5cyhkLnZhbHVlSGFzaCk7dGhpcy5lbGVtLnN0YWJsZUNvbG9ycz9nLnNvcnQoKTpnLnNvcnQoKHQsdik9PmQudmFsdWVIYXNoW3ZdLmNvdW50LWQudmFsdWVIYXNoW3RdLmNvdW50KTtjb25zdCBsPU1hdGgubWluKGEubGVuZ3RoLGcubGVuZ3RoKSxrPWcuc2xpY2UoMCxsKS5yZWR1Y2UoKHQsdix5KT0+e3Rbdl09eTtyZXR1cm4gdH0se30pLG49ZDMucmdiKCIjRjBGMEYwIiksCnA9YS5tYXAodD0+ZDMucmdiKHQpKTtsZXQgcT0hMTtjb25zdCByPVtdO2ZvcihsZXQgdD0wO3Q8Zi5sZW5ndGg7dCsrKXtjb25zdCB2PWFxKGZbdF0uZGF0YVtjXSk7cT1xfHwhKHYgaW4gayk7ci5wdXNoKHBba1t2XV18fG4pfWE9YS5zbGljZSgwLGwpLm1hcCgodCx2KT0+e3Y9ZC52YWx1ZUhhc2hbZ1t2XV0udmFsdWU7cmV0dXJue2tleTp2LGNvbG9yOnQsY29udGVudDp7bGFiZWw6disiIixzcGVjaWFsOiJudW1iZXIiIT09dHlwZW9mIHYmJiJzdHJpbmciIT09dHlwZW9mIHZ8fHYgaW4gbHF9fX0pO3EmJmEucHVzaCh7a2V5Om51bGwsY29sb3I6IiNGMEYwRjAiLGNvbnRlbnQ6e2xhYmVsOiJvdGhlciIsc3BlY2lhbDohMH19KTt0aGlzLmVsZW0uc2V0KCJwYWxldHRlIixhKTt0aGlzLmdyaWQuY2VsbEl0ZW1Db21wYXJhdG9yPSh0LHYpPT57aWYoIShjIGluIHQuZGF0YXx8YyBpbiB2LmRhdGEpKXJldHVybiAwO2lmKCEoYyBpbiB0LmRhdGEpKXJldHVybiAxO2lmKCEoYyBpbiB2LmRhdGEpKXJldHVybi0xOwp0PXQuZGF0YVtjXTt2PXYuZGF0YVtjXTtpZih0PT09dilyZXR1cm4gMDt0PWFxKHQpO3Y9YXEodik7cmV0dXJuIHQgaW4ga3x8diBpbiBrP3QgaW4gaz92IGluIGs/a1t0XS1rW3ZdOi0xOjE6MH07cmV0dXJuIHJ9dXBkYXRlQ29sb3JzKCl7aWYodGhpcy5ncmlkKXt2YXIgYT10aGlzLmVsZW0uY29sb3JCeTtpZihhIGluIHRoaXMuc3RhdHMpe2E9dGhpcy5zdGF0c1thXTt2YXIgYz10aGlzLmdldFBhbGV0dGVTb3VyY2UoKTthPWEudW5pcXVlQ291bnQ+Yy5sZW5ndGgmJmEuaXNOdW1lcmljKCk/dGhpcy51cGRhdGVTY2FsYXJQYWxldHRlKCk6dGhpcy51cGRhdGVDYXRlZ29yaWNhbFBhbGV0dGUoYyk7Yz10aGlzLmdyaWQuaXRlbXM7dmFyIGQ9RGF0ZS5ub3coKSxmPWQrdGhpcy5lbGVtLnR3ZWVuRHVyYXRpb247Zm9yKGxldCBnPTA7ZzxjLmxlbmd0aDtnKyspe2NvbnN0IGw9Y1tnXSxrPWFbZ107bC5zcHJpdGUucmViYXNlKGQpO2wuc3ByaXRlLnI9ay5yO2wuc3ByaXRlLmc9ay5nO2wuc3ByaXRlLmI9CmsuYjtsLnNwcml0ZS5hPTE4MDtsLnNwcml0ZS50aW1lc3RhbXA9Zn10aGlzLnJlbmRlclVudGlsKGYpO3RoaXMudXBkYXRlR3JpZEl0ZW1Qb3NpdGlvbnNBZnRlckNvbG9yQ2hhbmdlKCl9ZWxzZSB0aGlzLmNsZWFyQ29sb3JzKCl9fXVwZGF0ZUdyaWRJdGVtUG9zaXRpb25zQWZ0ZXJDb2xvckNoYW5nZSgpeyJzdGFja2VkIiE9PXRoaXMuZWxlbS5wb3NpdGlvbk1vZGUmJnRoaXMuZWxlbS52ZXJ0aWNhbFBvc2l0aW9uJiZ0aGlzLmVsZW0uaG9yaXpvbnRhbFBvc2l0aW9ufHx0aGlzLnVwZGF0ZUdyaWRJdGVtUG9zaXRpb25zKCl9Y2xlYXJDb2xvcnMoKXtjb25zdCBhPXRoaXMuZ3JpZC5pdGVtcyxjPURhdGUubm93KCksZD1jK3RoaXMuZWxlbS50d2VlbkR1cmF0aW9uO2ZvcihsZXQgZj0wO2Y8YS5sZW5ndGg7ZisrKXtjb25zdCBnPWFbZl07Zy5zcHJpdGUucmViYXNlKGMpO2cuc3ByaXRlLnI9MDtnLnNwcml0ZS5nPTA7Zy5zcHJpdGUuYj0wO2cuc3ByaXRlLmE9MDtnLnNwcml0ZS50aW1lc3RhbXA9CmR9dGhpcy5yZW5kZXJVbnRpbChkKTt0aGlzLmVsZW0uc2V0KCJwYWxldHRlIixbXSk7dGhpcy5ncmlkLmNlbGxJdGVtQ29tcGFyYXRvciYmKHRoaXMuZ3JpZC5jZWxsSXRlbUNvbXBhcmF0b3I9bnVsbCx0aGlzLnVwZGF0ZUdyaWRJdGVtUG9zaXRpb25zQWZ0ZXJDb2xvckNoYW5nZSgpKX1yZXNldFNwcml0ZXNUb0RlZmF1bHRUZXh0dXJlKCl7Y29uc3QgYT10aGlzLmdyaWQuaXRlbXM7dGhpcy5zcHJpdGVNZXNoLnNwcml0ZUF0bGFzLmNsZWFyUXVldWVzKCk7Y29uc3QgYz1EYXRlLm5vdygpLGQ9Yyt0aGlzLmVsZW0uZmFkZUR1cmF0aW9uO2ZvcihsZXQgZj0wO2Y8YS5sZW5ndGg7ZisrKXtjb25zdCBnPWFbZl07MDxnLnNwcml0ZS50ZXh0dXJlSW5kZXgmJmcuc3ByaXRlLnN3aXRjaFRleHR1cmVzKGMsZCl9dGhpcy5yZW5kZXJVbnRpbChkKX11cGRhdGVJbWFnZUZpZWxkTmFtZSgpe2lmKCF0aGlzLmlnbm9yZUNoYW5nZSYmdGhpcy5ncmlkKXt0aGlzLnJlc2V0U3ByaXRlc1RvRGVmYXVsdFRleHR1cmUoKTsKdmFyIGE9dGhpcy5lbGVtLmltYWdlRmllbGROYW1lO2lmKGEgaW4gdGhpcy5zdGF0cyl7dmFyIGM9dGhpcy5ncmlkLml0ZW1zO2ZvcihsZXQgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXtjb25zdCB7c3ByaXRlOmYsZGF0YTpnfT1jW2RdO2Yuc2V0U3ByaXRlSW1hZ2VEYXRhKHt0eXBlOiJ0ZXh0IixkYXRhOm1xKGdbYV0pLmxhYmVsfSwoKT0+e2NvbnN0IGw9RGF0ZS5ub3coKTtmLmJhc2VUZXh0dXJlVGltZXN0YW1wPWw7Zi5iYXNlVGV4dHVyZUluZGV4PTA7Zi50ZXh0dXJlVGltZXN0YW1wPWwrdGhpcy5lbGVtLnR3ZWVuRHVyYXRpb247Zi50ZXh0dXJlSW5kZXg9MTt0aGlzLnJlbmRlclVudGlsKGYudGV4dHVyZVRpbWVzdGFtcCl9KX19ZWxzZSBkZWxldGUgdGhpcy5sYXN0QXRsYXNVcmwsdGhpcy5xdWV1ZUF0bGFzVXJsQ2hhbmdlKCl9fWdlbmVyYXRlUG9zaXRpb25GdW5jdGlvbihhKXtjb25zdCBjPXRoaXMuc3RhdHNbYV07aWYoIWN8fCFjLmlzTnVtZXJpYygpKXJldHVybiBudWxsO2NvbnN0IGQ9CmMubnVtYmVyTWF4LWMubnVtYmVyTWluO3JldHVybiBmPT4oZi5kYXRhW2FdLWMubnVtYmVyTWluKS9kfWdlbmVyYXRlRmFjZXRpbmdJbmZvKGEsYyxkLGYpe2lmKCEoYSBpbiB0aGlzLnN0YXRzKSlyZXR1cm57ZmFjZXRpbmdGdW5jdGlvbjooKT0+bnVsbCxrZXlDb21wYXJlRnVuY3Rpb246KCk9PjAsbGFiZWxpbmdGdW5jdGlvbjptcX07Y29uc3QgZz10aGlzLnN0YXRzW2FdO2lmKGcud29yZFRyZWUmJjE8Zy53b3JkVHJlZS5oaWdoZXN0TGV2ZWwmJmQpcmV0dXJuIHRoaXMuZ2VuZXJhdGVCYWdPZldvcmRzRmFjZXRpbmdJbmZvKGEsYyxmKTtpZihnLnVuaXF1ZUNvdW50PD1jKXJldHVybntmYWNldGluZ0Z1bmN0aW9uOms9PmEgaW4gay5kYXRhP2suZGF0YVthXTpudWxsLGtleUNvbXBhcmVGdW5jdGlvbjpnLmlzTnVtZXJpYygpP0pwOmY/SXA6SHAsbGFiZWxpbmdGdW5jdGlvbjptcX07aWYoZy5pc051bWVyaWMoKSYmZy5udW1iZXJNYXghPT1nLm51bWJlck1pbilyZXR1cm4gdGhpcy5nZW5lcmF0ZU51bWVyaWNGYWNldGluZ0luZm8oYSwKYyk7ZD1PYmplY3Qua2V5cyhnLnZhbHVlSGFzaCk7ZC5zb3J0KChrLG4pPT5nLnZhbHVlSGFzaFtuXS5jb3VudC1nLnZhbHVlSGFzaFtrXS5jb3VudCk7Y29uc3QgbD1kLnNsaWNlKDAsYykucmVkdWNlKChrLG4pPT57a1tuXT0hMDtyZXR1cm4ga30se30pO3JldHVybntmYWNldGluZ0Z1bmN0aW9uOms9PntpZighKGEgaW4gay5kYXRhKSlyZXR1cm4gbnVsbDtrPWsuZGF0YVthXTtyZXR1cm4gYXEoaylpbiBsP2s6Ilx1ZmZmY09USEVSXHVmZmZjIn0sa2V5Q29tcGFyZUZ1bmN0aW9uOmY/SXA6SHAsbGFiZWxpbmdGdW5jdGlvbjptcX19Z2VuZXJhdGVCYWdPZldvcmRzRmFjZXRpbmdJbmZvKGEsYyxkKXtjb25zdCBmPXRoaXMuc3RhdHNbYV0ud29yZFRyZWUsZz1mLmxldmVsSGFzaDtyZXR1cm57ZmFjZXRpbmdGdW5jdGlvbjpsPT57aWYoIShhIGluIGwuZGF0YSkpcmV0dXJuIG51bGw7Zm9yKGw9Zi5ub2RlSGFzaFthcShsLmRhdGFbYV0pXTtsLnBhcmVudCYmbC5sZXZlbD5jOylsPWwucGFyZW50OwpyZXR1cm4gbC5sZXZlbH0sa2V5Q29tcGFyZUZ1bmN0aW9uOihsLGspPT57bD1nW2xdO2s9Z1trXTtpZih2b2lkIDA9PT1sJiZ2b2lkIDA9PT1rKXJldHVybiAwO2lmKHZvaWQgMD09PWwpcmV0dXJuLTE7aWYodm9pZCAwPT09aylyZXR1cm4gMTtpZihsLm5vblZhbHVlQ291bnQmJmsubm9uVmFsdWVDb3VudClyZXR1cm4gMDtpZihsLm5vblZhbHVlQ291bnQpcmV0dXJuLTE7aWYoay5ub25WYWx1ZUNvdW50KXJldHVybiAxO2s9ay5vcmRlci1sLm9yZGVyO3JldHVybiBkP2s6LWt9LGxhYmVsaW5nRnVuY3Rpb246bD0+e2w9Z1srbF07aWYoIWwucGFyZW50JiYhbC5jb21tb25Xb3Jkcy5sZW5ndGgpcmV0dXJue2xhYmVsOiJvdGhlciIsc3BlY2lhbDohMH07aWYobC5ub25WYWx1ZUNvdW50KXJldHVybntsYWJlbDoibm9uLXdvcmRzIixzcGVjaWFsOiEwfTtsZXQgaz1gICR7Ilx1MjAyMiJ9ICR7bC5jb21tb25Xb3Jkcy5qb2luKCIgIil9YDtmb3IobGV0IG49MDtuPGwuY2hpbGRyZW4ubGVuZ3RoO24rKylpZihsLmNoaWxkcmVuW25dLmxldmVsPgpjKXtrKz0iIFx1MjAyNiI7YnJlYWt9Zm9yKDtsLnBhcmVudDspbD1sLnBhcmVudCxsLmNvbW1vbldvcmRzLmxlbmd0aCYmKGs9YCAkeyJcdTIwMjIifSAke2wuY29tbW9uV29yZHMuam9pbigiICIpfSBgK2spO3JldHVybntsYWJlbDprfX19fWdlbmVyYXRlTnVtZXJpY0ZhY2V0aW5nSW5mbyhhLGMpe2NvbnN0IGQ9dGhpcy5zdGF0c1thXSxmPWQubnVtYmVyTWF4LWQubnVtYmVyTWluO3JldHVybntmYWNldGluZ0Z1bmN0aW9uOmc9PntpZighKGEgaW4gZy5kYXRhKSlyZXR1cm4gbnVsbDtnPWcuZGF0YVthXTtyZXR1cm4ibnVtYmVyIiE9PXR5cGVvZiBnP2c6aXNOYU4oZyk/ZzpNYXRoLm1pbihNYXRoLmZsb29yKGMqKGctZC5udW1iZXJNaW4pL2YpLGMtMSl9LGtleUNvbXBhcmVGdW5jdGlvbjpKcCxsYWJlbGluZ0Z1bmN0aW9uOmc9PntpZigibnVtYmVyIiE9PXR5cGVvZiBnfHxpc05hTigrZykpcmV0dXJuIG1xKGcpO2NvbnN0IGw9ZC5udW1iZXJNYXgtZC5udW1iZXJNaW4saz1nL2MqCmwrZC5udW1iZXJNaW47Zz0oMStnKS9jKmwrZC5udW1iZXJNaW47cmV0dXJuIGQuaXNJbnRlZ2VyKCk/e2xhYmVsOnRoaXMuZm9ybWF0UmFuZ2UoTWF0aC5jZWlsKGspLE1hdGguZmxvb3IoZykpfTp7bGFiZWw6dGhpcy5mb3JtYXRSYW5nZShrLGcpfX19fWZvcm1hdE51bWJlcihhKXtpZihudWxsPT09YSlyZXR1cm4ibnVsbCI7YT1wYXJzZUZsb2F0KGEudG9QcmVjaXNpb24oMykpO3JldHVybiAxRTM8PU1hdGguYWJzKGEpP2QzLmZvcm1hdCgicyIpKGEpOiIiK2F9Zm9ybWF0UmFuZ2UoYSxjKXtyZXR1cm5gJHt0aGlzLmZvcm1hdE51bWJlcihhKX0gXHUyMDE0ICR7dGhpcy5mb3JtYXROdW1iZXIoYyl9YH1nZXRLZXlzKCl7cmV0dXJuIGVxKHRoaXMuZWxlbS5kYXRhKS5zb3J0KCl9cmVuZGVyVW50aWwoYSl7dGhpcy5lbmRUaW1lc3RhbXA9TWF0aC5tYXgodGhpcy5lbmRUaW1lc3RhbXAsYSk7dGhpcy5xdWV1ZVJlbmRlclNjZW5lKCl9cmVzaXplSGFuZGxlcigpe2NvbnN0IGE9dGhpcy5lbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwphLndpZHRoJiZhLmhlaWdodD8odGhpcy5sYWJlbHNBbmRBeGVzU1ZHLmF0dHIoIndpZHRoIixhLndpZHRoKS5hdHRyKCJoZWlnaHQiLGEuaGVpZ2h0KSx0aGlzLmNlbGxCYWNrZ3JvdW5kU1ZHLmF0dHIoIndpZHRoIixhLndpZHRoKS5hdHRyKCJoZWlnaHQiLGEuaGVpZ2h0KSx0aGlzLnJlbmRlcmVyJiZ0aGlzLnJlbmRlcmVyLnNldFNpemUoYS53aWR0aCxhLmhlaWdodCksdGhpcy5jYW1lcmEucmlnaHQ9YS53aWR0aC90aGlzLnNjYWxlLHRoaXMuY2FtZXJhLmJvdHRvbT0tYS5oZWlnaHQvdGhpcy5zY2FsZSx0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCksdGhpcy5xdWV1ZVJlbmRlclNjZW5lKCkpOnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+dGhpcy5yZXNpemVIYW5kbGVyKCkpfXF1ZXVlUmVuZGVyU2NlbmUoKXt0aGlzLnJlbmRlclF1ZXVlZHx8KHRoaXMucmVuZGVyUXVldWVkPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMucmVuZGVyUXVldWVkJiYKdGhpcy5yZW5kZXJTY2VuZSgpfSkpfXJlbmRlclNjZW5lKCl7dGhpcy5yZW5kZXJRdWV1ZWQ9ITE7Y29uc3QgYT1EYXRlLm5vdygpO3RoaXMuZW5kVGltZXN0YW1wPmEmJnRoaXMucXVldWVSZW5kZXJTY2VuZSgpO2lmKHRoaXMuc3ByaXRlTWVzaCYmKHRoaXMuc3ByaXRlTWVzaC50aW1lPWEsODE+K1RIUkVFLlJFVklTSU9OJiZ0aGlzLnNwcml0ZU1lc2gub25CZWZvcmVSZW5kZXIpKXRoaXMuc3ByaXRlTWVzaC5vbkJlZm9yZVJlbmRlcigpO3RoaXMucmVuZGVyZXImJnRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsdGhpcy5jYW1lcmEpO3RoaXMuc3ByaXRlTWVzaCYmdGhpcy5zcHJpdGVNZXNoLnNwcml0ZUF0bGFzJiZ0aGlzLnNwcml0ZU1lc2guc3ByaXRlQXRsYXMucG9zdFJlbmRlcigpfX0KUG9seW1lcih7aXM6ImZhY2V0cy1kaXZlLXZpcyIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcl0scHJvcGVydGllczp7ZGF0YTp7dHlwZTpBcnJheSx2YWx1ZTpudWxsLG9ic2VydmVyOiJfZGF0YUNoYW5nZSJ9LGZpbHRlcmVkRGF0YUluZGljZXM6e3R5cGU6QXJyYXksdmFsdWU6bnVsbCxvYnNlcnZlcjoiX2ZpbHRlcmVkRGF0YUluZGljZXNDaGFuZ2UifSxhdGxhc1VybDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbCxvYnNlcnZlcjoiX3F1ZXVlQXRsYXNVcmxDaGFuZ2UifSxzcHJpdGVVcmw6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGwsb2JzZXJ2ZXI6Il9zcHJpdGVVcmxDaGFuZ2UifSxjcm9zc09yaWdpbjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sa2V5czp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITAscmVhZE9ubHk6ITB9LHN0YXRzOnt0eXBlOk9iamVjdCx2YWx1ZTp7fSxub3RpZnk6ITAscmVhZE9ubHk6ITB9LHNjZW5lUGFkZGluZzp7dHlwZTpOdW1iZXIsCnZhbHVlOjh9LHR3ZWVuRHVyYXRpb246e3R5cGU6TnVtYmVyLHZhbHVlOjYwMH0sZmFkZUR1cmF0aW9uOnt0eXBlOk51bWJlcix2YWx1ZToyMDB9LHNwcml0ZUltYWdlV2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjY0fSxzcHJpdGVJbWFnZUhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6NjR9LGdyaWRGYWNldGluZ1ZlcnRpY2FsTGFiZWxDb2xvcjp7dHlwZTpTdHJpbmcsdmFsdWU6IiM2NjY2NjYifSxncmlkRmFjZXRpbmdIb3Jpem9udGFsTGFiZWxDb2xvcjp7dHlwZTpTdHJpbmcsdmFsdWU6IiNkZDY2MjIifSxpdGVtUG9zaXRpb25pbmdWZXJ0aWNhbExhYmVsQ29sb3I6e3R5cGU6U3RyaW5nLHZhbHVlOiIjMjI1NWFhIn0saXRlbVBvc2l0aW9uaW5nSG9yaXpvbnRhbExhYmVsQ29sb3I6e3R5cGU6U3RyaW5nLHZhbHVlOiIjMTE4ODQ0In0sZml0R3JpZEFzcGVjdFJhdGlvVG9WaWV3cG9ydDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx2ZXJ0aWNhbEZhY2V0Ont0eXBlOlN0cmluZyx2YWx1ZToiIiwKb2JzZXJ2ZXI6Il91cGRhdGVHcmlkRmFjZXRpbmcifSx2ZXJ0aWNhbEJ1Y2tldHM6e3R5cGU6TnVtYmVyLHZhbHVlOjEwLG9ic2VydmVyOiJfdXBkYXRlR3JpZEZhY2V0aW5nIn0sdmVydGljYWxCYWdPZldvcmRzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il91cGRhdGVHcmlkRmFjZXRpbmcifSxob3Jpem9udGFsRmFjZXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG9ic2VydmVyOiJfdXBkYXRlR3JpZEZhY2V0aW5nIn0saG9yaXpvbnRhbEJ1Y2tldHM6e3R5cGU6TnVtYmVyLHZhbHVlOjEwLG9ic2VydmVyOiJfdXBkYXRlR3JpZEZhY2V0aW5nIn0saG9yaXpvbnRhbEJhZ09mV29yZHM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX3VwZGF0ZUdyaWRGYWNldGluZyJ9LHBvc2l0aW9uTW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsb2JzZXJ2ZXI6Il91cGRhdGVHcmlkSXRlbVBvc2l0aW9ucyJ9LHZlcnRpY2FsUG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOiIiLApvYnNlcnZlcjoiX3VwZGF0ZUdyaWRJdGVtUG9zaXRpb25zIn0saG9yaXpvbnRhbFBvc2l0aW9uOnt0eXBlOlN0cmluZyx2YWx1ZToiIixvYnNlcnZlcjoiX3VwZGF0ZUdyaWRJdGVtUG9zaXRpb25zIn0sY29sb3JCeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsb2JzZXJ2ZXI6Il91cGRhdGVDb2xvcnMiLG5vdGlmeTohMH0saW1hZ2VGaWVsZE5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG9ic2VydmVyOiJfdXBkYXRlSW1hZ2VGaWVsZE5hbWUiLG5vdGlmeTohMH0scGFsZXR0ZTp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITB9LHBhbGV0dGVDaG9pY2U6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGFuZGFyZCIsb2JzZXJ2ZXI6Il91cGRhdGVDb2xvcnMifSxzZWxlY3RlZERhdGE6e3R5cGU6QXJyYXksdmFsdWU6W10sbm90aWZ5OiEwfSxzZWxlY3RlZEluZGljZXM6e3R5cGU6QXJyYXksdmFsdWU6W10sbm90aWZ5OiEwLG9ic2VydmVyOiJfc2VsZWN0ZWRJbmRpY2VzVXBkYXRlZCJ9LGNvbXBhcmVkRGF0YTp7dHlwZTpBcnJheSwKdmFsdWU6W10sbm90aWZ5OiEwfSxjb21wYXJlZEluZGljZXM6e3R5cGU6QXJyYXksdmFsdWU6W10sbm90aWZ5OiEwLG9ic2VydmVyOiJfY29tcGFyZWRJbmRpY2VzVXBkYXRlZCJ9LHN0YWJsZUNvbG9yczp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfdXBkYXRlQ29sb3JzIn19LGxpc3RlbmVyczp7Imlyb24tcmVzaXplIjoiX29uSXJvblJlc2l6ZSJ9LGNyZWF0ZWQoKXt0aGlzLl9iYWNraW5nPW5ldyB0cSh0aGlzKX0scmVhZHkoKXt0aGlzLl9iYWNraW5nLnJlYWR5KCl9LF9kYXRhQ2hhbmdlKGEpe3RoaXMuX2JhY2tpbmcuc2NlbmU/KHRoaXMuX2JhY2tpbmcuZGF0YUNoYW5nZSgpLHRoaXMuX3NldEtleXModGhpcy5fYmFja2luZy5nZXRLZXlzKCkpLHRoaXMuX3NldFN0YXRzKHRoaXMuX2JhY2tpbmcuc3RhdHMpKTpyZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5fZGF0YUNoYW5nZS5iaW5kKHRoaXMsYSkpfSxfZmlsdGVyZWREYXRhSW5kaWNlc0NoYW5nZShhKXt0aGlzLl9iYWNraW5nLnNjZW5lJiYKdGhpcy5fYmFja2luZy5pdGVtcz8odGhpcy5fYmFja2luZy5maWx0ZXJlZERhdGFJbmRpY2VzQ2hhbmdlKCksdGhpcy5fc2V0S2V5cyh0aGlzLl9iYWNraW5nLmdldEtleXMoKSksdGhpcy5fc2V0U3RhdHModGhpcy5fYmFja2luZy5zdGF0cykpOnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9maWx0ZXJlZERhdGFJbmRpY2VzQ2hhbmdlLmJpbmQodGhpcyxhKSl9LF9xdWV1ZUF0bGFzVXJsQ2hhbmdlKCl7dGhpcy5fYmFja2luZy5xdWV1ZUF0bGFzVXJsQ2hhbmdlKCl9LF9zcHJpdGVVcmxDaGFuZ2UoKXt0aGlzLl9iYWNraW5nLnNwcml0ZVVybENoYW5nZSgpfSxfdXBkYXRlR3JpZEZhY2V0aW5nKCl7dGhpcy5fYmFja2luZy51cGRhdGVHcmlkRmFjZXRpbmcoKX0sX3VwZGF0ZUdyaWRJdGVtUG9zaXRpb25zKCl7dGhpcy5fYmFja2luZy51cGRhdGVHcmlkSXRlbVBvc2l0aW9ucygpfSxfdXBkYXRlQ29sb3JzKCl7dGhpcy5fYmFja2luZy51cGRhdGVDb2xvcnMoKX0sX3VwZGF0ZUltYWdlRmllbGROYW1lKCl7dGhpcy5fYmFja2luZy51cGRhdGVJbWFnZUZpZWxkTmFtZSgpfSwKX29uSXJvblJlc2l6ZSgpe3RoaXMuX2JhY2tpbmcucmVzaXplSGFuZGxlcigpfSxfc2VsZWN0ZWRJbmRpY2VzVXBkYXRlZCgpe3RoaXMuX2JhY2tpbmcuc2VsZWN0ZWRJbmRpY2VzVXBkYXRlZCgpfSxfY29tcGFyZWRJbmRpY2VzVXBkYXRlZCgpe3RoaXMuX2JhY2tpbmcuY29tcGFyZWRJbmRpY2VzVXBkYXRlZCgpfSxmaXRUb1ZpZXdwb3J0KCl7dGhpcy5fYmFja2luZy5maXRUb1ZpZXdwb3J0KCl9LHpvb21Jbigpe3RoaXMuX2JhY2tpbmcuem9vbUluKCl9LHpvb21PdXQoKXt0aGlzLl9iYWNraW5nLnpvb21PdXQoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9mYWNldHMtZGl2ZS9jb21wb25lbnRzL2ZhY2V0cy1kaXZlLWNvbnRyb2xzL2ZhY2V0cy1kaXZlLWNvbnRyb2xzLmpzClBvbHltZXIoe2lzOiJmYWNldHMtZGl2ZS1jb250cm9scyIscHJvcGVydGllczp7YXRsYXNVcmw6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxrZXlzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxzdGF0czp7dHlwZTpPYmplY3QsdmFsdWU6e319LHZlcnRpY2FsRmFjZXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0sdmVydGljYWxCdWNrZXRzOnt0eXBlOk51bWJlcix2YWx1ZToxMCxub3RpZnk6ITB9LHZlcnRpY2FsQmFnT2ZXb3Jkczp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0saG9yaXpvbnRhbEZhY2V0Ont0eXBlOlN0cmluZyx2YWx1ZToiIixub3RpZnk6ITB9LGhvcml6b250YWxCdWNrZXRzOnt0eXBlOk51bWJlcix2YWx1ZToxMCxub3RpZnk6ITB9LGhvcml6b250YWxCYWdPZldvcmRzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxwb3NpdGlvbk1vZGU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0UG9zaXRpb25Nb2RlKHZlcnRpY2FsUG9zaXRpb24sIGhvcml6b250YWxQb3NpdGlvbikiLApub3RpZnk6ITB9LHZlcnRpY2FsUG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0saG9yaXpvbnRhbFBvc2l0aW9uOnt0eXBlOlN0cmluZyx2YWx1ZToiIixub3RpZnk6ITB9LGNvbG9yQnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0saW1hZ2VGaWVsZE5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0scGFsZXR0ZTp7dHlwZTpBcnJheSx2YWx1ZTpbXX0scGFsZXR0ZUNob2ljZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0YW5kYXJkIixub3RpZnk6ITB9LGdyaWRGYWNldGluZ1ZlcnRpY2FsTGFiZWxDb2xvcjp7dHlwZTpTdHJpbmcsdmFsdWU6IiM2NjY2NjYiLG9ic2VydmVyOiJfdXBkYXRlQ1NTVmFycyJ9LGdyaWRGYWNldGluZ0hvcml6b250YWxMYWJlbENvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZToiI2RkNjYyMiIsb2JzZXJ2ZXI6Il91cGRhdGVDU1NWYXJzIn0saXRlbVBvc2l0aW9uaW5nVmVydGljYWxMYWJlbENvbG9yOnt0eXBlOlN0cmluZywKdmFsdWU6IiMyMjU1YWEiLG9ic2VydmVyOiJfdXBkYXRlQ1NTVmFycyJ9LGl0ZW1Qb3NpdGlvbmluZ0hvcml6b250YWxMYWJlbENvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZToiIzExODg0NCIsb2JzZXJ2ZXI6Il91cGRhdGVDU1NWYXJzIn19LF9nZXRJbWFnZUZpZWxkTmFtZURlZmF1bHRMYWJlbChhKXtyZXR1cm4gYT8iKGltYWdlKSI6IihkZWZhdWx0KSJ9LF9pc01vZGVTY2F0dGVyKGEpe3JldHVybiJzY2F0dGVyIj09PWF9LF9pc0tleU51bWVyaWMoYSl7cmV0dXJuIHRoaXMuc3RhdHMmJmEgaW4gdGhpcy5zdGF0cyYmdGhpcy5zdGF0c1thXS5pc051bWVyaWMoKX0sX2lzS2V5Q2F0ZWdvcmljYWwoYSl7cmV0dXJuIHRoaXMuc3RhdHMmJmEgaW4gdGhpcy5zdGF0cyYmIXRoaXMuc3RhdHNbYV0uaXNOdW1lcmljKCl9LF91cGRhdGVDU1NWYXJzKCl7dGhpcy51cGRhdGVTdHlsZXMoeyItLWdyaWQtZmFjZXRpbmctdmVydGljYWwtbGFiZWwtY29sb3IiOnRoaXMuZ3JpZEZhY2V0aW5nVmVydGljYWxMYWJlbENvbG9yLAoiLS1ncmlkLWZhY2V0aW5nLWhvcml6b250YWwtbGFiZWwtY29sb3IiOnRoaXMuZ3JpZEZhY2V0aW5nSG9yaXpvbnRhbExhYmVsQ29sb3IsIi0taXRlbS1wb3NpdGlvbmluZy12ZXJ0aWNhbC1sYWJlbC1jb2xvciI6dGhpcy5pdGVtUG9zaXRpb25pbmdWZXJ0aWNhbExhYmVsQ29sb3IsIi0taXRlbS1wb3NpdGlvbmluZy1ob3Jpem9udGFsLWxhYmVsLWNvbG9yIjp0aGlzLml0ZW1Qb3NpdGlvbmluZ0hvcml6b250YWxMYWJlbENvbG9yfSl9LF9icmVha1VwQW5kVHJ1bmNhdGUoYSl7cmV0dXJuIGlxKGpxKCIiK2EpKX0sX21heEJ1Y2tldHMoYSxjKXtjb25zdCBkPXRoaXMuc3RhdHM/dGhpcy5zdGF0c1thXTpudWxsO3JldHVybiBkP2MmJnRoaXMuX2hhc1dvcmRUcmVlKGEpP01hdGgubWluKDEwMCxkLndvcmRUcmVlLmhpZ2hlc3RMZXZlbCk6TWF0aC5taW4oMTAwLGQudW5pcXVlQ291bnQrMSk6MTAwfSxfaGFzV29yZFRyZWUoYSl7YT10aGlzLnN0YXRzP3RoaXMuc3RhdHNbYV06bnVsbDsKcmV0dXJuISFhJiYhIWEud29yZFRyZWUmJjE8YS53b3JkVHJlZS5oaWdoZXN0TGV2ZWx9LF9nZXRQb3NpdGlvbk1vZGUoYSxjKXtyZXR1cm4iIj09YSYmIiI9PWM/InN0YWNrZWQiOiJzY2F0dGVyIn0sX29wZW5PdmVyZmxvdygpe3RoaXMuJC5vdmVyZmxvd21lbnUucG9zaXRpb25FbGVtZW50PXRoaXMuJC5vdmVyZmxvd2J0bjt0aGlzLiQub3ZlcmZsb3dtZW51Lm9wZW4oKX0sX3Nob3VsZFNob3dPdmVyZmxvd01lbnUoYSxjLGQpe3JldHVybiB0aGlzLl9pc0tleUNhdGVnb3JpY2FsKGEpfHx0aGlzLl9oYXNXb3JkVHJlZShjKXx8dGhpcy5faGFzV29yZFRyZWUoZCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLWRpdmUvbGliL2luZm8tcmVuZGVyZXJzLmpzCmNvbnN0IHVxPShhLGMpPT57Y29uc3QgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkbCIpO2Zvcihjb25zdCBnIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShnKSl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZHQiKTtmLnRleHRDb250ZW50PWc7ZC5hcHBlbmRDaGlsZChmKTtmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRkIik7Zi50ZXh0Q29udGVudD1hW2ddO2QuYXBwZW5kQ2hpbGQoZil9Yy5hcHBlbmRDaGlsZChkKX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLWRpdmUvY29tcG9uZW50cy9mYWNldHMtZGl2ZS1pbmZvLWNhcmQvZmFjZXRzLWRpdmUtaW5mby1jYXJkLmpzClBvbHltZXIoe2lzOiJmYWNldHMtZGl2ZS1pbmZvLWNhcmQiLHByb3BlcnRpZXM6e2luZm9SZW5kZXJlcjp7dHlwZTpPYmplY3R9LHNlbGVjdGVkRGF0YTp7dHlwZTpBcnJheSx2YWx1ZTpbXSxvYnNlcnZlcjoiX3VwZGF0ZVNlbGVjdGVkIn19LHJlYWR5KCl7dGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLmhvbGRlciwhMCl9LF91cGRhdGVTZWxlY3RlZChhKXt0aGlzLiQuaG9sZGVyLmlubmVySFRNTD0iIjtpZihhKXt2YXIgYz10aGlzLmluZm9SZW5kZXJlcnx8dXE7Zm9yKGxldCBkPTA7ZDxhLmxlbmd0aDtkKyspe2NvbnN0IGY9YVtkXSxnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9IjEwMCUiO3RoaXMuJC5ob2xkZXIuYXBwZW5kQ2hpbGQoZyk7YyhmLGcpfX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLWRpdmUvY29tcG9uZW50cy9mYWNldHMtZGl2ZS1sZWdlbmQvZmFjZXRzLWRpdmUtbGVnZW5kLmpzClBvbHltZXIoe2lzOiJmYWNldHMtZGl2ZS1sZWdlbmQiLHByb3BlcnRpZXM6e2NvbG9yQnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG9ic2VydmVyOiJfb3BlbiJ9LHBhbGV0dGU6e3R5cGU6QXJyYXksdmFsdWU6W119LF9vcGVuZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LF9icmVha1VwQW5kVHJ1bmNhdGUoYSl7cmV0dXJuIGlxKGpxKCIiK2EpKX0sX2FueUNvbG9yKCl7cmV0dXJuISEodGhpcy5jb2xvckJ5JiZ0aGlzLnBhbGV0dGUmJnRoaXMucGFsZXR0ZS5sZW5ndGgpfSxfc3BlY2lhbENsYXNzKGEpe3JldHVybiBhPyJzcGVjaWFsIjoiIn0sX29wZW4oKXt0aGlzLl9vcGVuZWQ9ITB9LF90b2dnbGVPcGVuZWQoKXt0aGlzLl9vcGVuZWQ9IXRoaXMuX29wZW5lZH0sX2dldEljb24oYSl7cmV0dXJuIGE/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2ZhY2V0cy1kaXZlL2NvbXBvbmVudHMvZmFjZXRzLWRpdmUvZmFjZXRzLWRpdmUuanMKUG9seW1lcih7aXM6ImZhY2V0cy1kaXZlIixwcm9wZXJ0aWVzOntkYXRhOnt0eXBlOkFycmF5LHZhbHVlOm51bGwsbm90aWZ5OiEwfSxmaWx0ZXJlZERhdGFJbmRpY2VzOnt0eXBlOkFycmF5LHZhbHVlOm51bGx9LF9rZXlzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxzdGF0czp7dHlwZTpPYmplY3QsdmFsdWU6e30sbm90aWZ5OiEwfSxhdGxhc1VybDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbCxub3RpZnk6ITB9LHNwcml0ZVVybDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbCxub3RpZnk6ITB9LGNyb3NzT3JpZ2luOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsLG5vdGlmeTohMH0sc3ByaXRlSW1hZ2VXaWR0aDp7dHlwZTpOdW1iZXIsdmFsdWU6NjR9LHNwcml0ZUltYWdlSGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTo2NH0sZ3JpZEZhY2V0aW5nVmVydGljYWxMYWJlbENvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZToiIzY2NjY2NiJ9LGdyaWRGYWNldGluZ0hvcml6b250YWxMYWJlbENvbG9yOnt0eXBlOlN0cmluZywKdmFsdWU6IiNkZDY2MjIifSxpdGVtUG9zaXRpb25pbmdWZXJ0aWNhbExhYmVsQ29sb3I6e3R5cGU6U3RyaW5nLHZhbHVlOiIjMjI1NWFhIn0saXRlbVBvc2l0aW9uaW5nSG9yaXpvbnRhbExhYmVsQ29sb3I6e3R5cGU6U3RyaW5nLHZhbHVlOiIjMTE4ODQ0In0sZml0R3JpZEFzcGVjdFJhdGlvVG9WaWV3cG9ydDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx2ZXJ0aWNhbEZhY2V0Ont0eXBlOlN0cmluZyx2YWx1ZToiIixub3RpZnk6ITB9LHZlcnRpY2FsQnVja2V0czp7dHlwZTpOdW1iZXIsdmFsdWU6MTAsbm90aWZ5OiEwfSx2ZXJ0aWNhbEJhZ09mV29yZHM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LGhvcml6b250YWxGYWNldDp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsbm90aWZ5OiEwfSxob3Jpem9udGFsQnVja2V0czp7dHlwZTpOdW1iZXIsdmFsdWU6MTAsbm90aWZ5OiEwfSxob3Jpem9udGFsQmFnT2ZXb3Jkczp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sCnBvc2l0aW9uTW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0YWNrZWQiLG5vdGlmeTohMH0sdmVydGljYWxQb3NpdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsbm90aWZ5OiEwfSxob3Jpem9udGFsUG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0sY29sb3JCeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsbm90aWZ5OiEwfSxpbWFnZUZpZWxkTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsbm90aWZ5OiEwfSxfcGFsZXR0ZTp7dHlwZTpBcnJheSx2YWx1ZTpbXX0scGFsZXR0ZUNob2ljZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0YW5kYXJkIixub3RpZnk6ITB9LHNlbGVjdGVkRGF0YTp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITB9LHNlbGVjdGVkSW5kaWNlczp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITB9LGNvbXBhcmVkRGF0YTp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITB9LGNvbXBhcmVkSW5kaWNlczp7dHlwZTpBcnJheSx2YWx1ZTpbXSwKbm90aWZ5OiEwfSxoZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbHVlOm51bGwsb2JzZXJ2ZXI6Il91cGRhdGVIZWlnaHQifSxpbmZvUmVuZGVyZXI6e3R5cGU6T2JqZWN0fSxoaWRlSW5mb0NhcmQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sc3RhYmxlQ29sb3JzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxyZWFkeSgpe2NvbnN0IGE9dGhpcy4kO2EuZml0QnV0dG9uLm9uY2xpY2s9KCk9PmEudmlzLmZpdFRvVmlld3BvcnQoKTthLnpvb21JbkJ1dHRvbi5vbmNsaWNrPSgpPT5hLnZpcy56b29tSW4oKTthLnpvb21PdXRCdXR0b24ub25jbGljaz0oKT0+YS52aXMuem9vbU91dCgpO3RoaXMuaGlkZUluZm9DYXJkJiYoYS52aXMuc3R5bGUucmlnaHQ9IjAiKTt0aGlzLl91cGRhdGVIZWlnaHQoKX0sX3VwZGF0ZUhlaWdodCgpe251bGwhPT10aGlzLmhlaWdodCYmKHRoaXMuc3R5bGUuaGVpZ2h0PSJudW1iZXIiPT09dHlwZW9mIHRoaXMuaGVpZ2h0P3RoaXMuaGVpZ2h0KyJweCI6dGhpcy5oZWlnaHQpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2ZhY2V0cy1vdmVydmlldy9jb21tb24vZmVhdHVyZV9zdGF0aXN0aWNzX2dlbmVyYXRvci5qcwpjbGFzcyB2cXtjb25zdHJ1Y3Rvcigpe3RoaXMudmFscz1bXTt0aGlzLmNvdW50cz1bXX19ZnVuY3Rpb24gd3EoYSl7Y29uc3QgYz1uZXcgQmw7YS5mb3JFYWNoKGQ9Pntjb25zdCBmPXhxKGQuZGF0YSk7Zi5zZXROYW1lKGQubmFtZSk7Yy5nZXREYXRhc2V0c0xpc3QoKS5wdXNoKGYpfSk7cmV0dXJuIGN9CmZ1bmN0aW9uIHhxKGEpe2NvbnN0IGM9e307aWYobnVsbD09YSlyZXR1cm4gbmV3IEZsO2EuZm9yRWFjaCgoZCxmKT0+e2lmKG51bGwhPWQpe3ZhciBnPU9iamVjdC5rZXlzKGQpLGw9e307Zm9yKGxldCBrPTA7azxnLmxlbmd0aDtrKyspe2NvbnN0IG49Z1trXSxwPWRbbl07bFtuXT0hMDtuIGluIGN8fChjW25dPW5ldyB2cSxjW25dLm1pc3Npbmc9ZixjW25dLmNvdW50cz1bXSk7Im51bWJlciI9PT10eXBlb2YgcHx8InN0cmluZyI9PT10eXBlb2YgcD8oY1tuXS52YWxzLnB1c2gocCksY1tuXS5jb3VudHMucHVzaCgxKSk6cCBpbnN0YW5jZW9mIEFycmF5JiYoY1tuXS5jb3VudHMucHVzaChwLmxlbmd0aCksY1tuXS52YWxzLnB1c2goLi4ucCkpfU9iamVjdC5rZXlzKGMpLmZvckVhY2goaz0+e2sgaW4gbHx8KGNba10ubWlzc2luZys9MSl9KX19KTtPYmplY3Qua2V5cyhjKS5mb3JFYWNoKGQ9PntsZXQgZj0wLGc9MCxsPSExO2NbZF0udmFscy5mb3JFYWNoKGs9Pnsic3RyaW5nIj09PQp0eXBlb2Ygaz9mKz0xOihnKz0xLGw9bHx8IXlxKGspKX0pO2NbZF0udHlwZT1nPmY/bD8xOjA6Mn0pO3JldHVybiB6cShjLGEubGVuZ3RoKX1mdW5jdGlvbiB5cShhKXtyZXR1cm4gYT09PSthJiZhPT09KGF8MCl9ZnVuY3Rpb24genEoYSxjKXtjb25zdCBkPW5ldyBGbDtkLnNldE51bUV4YW1wbGVzKGMpO2Zvcihjb25zdCBmIGluIGEpe2lmKCFhLmhhc093blByb3BlcnR5KGYpKWNvbnRpbnVlO2NvbnN0IGc9bmV3IEhsO2QuZ2V0RmVhdHVyZXNMaXN0KCkucHVzaChnKTtjb25zdCBsPWFbZl07Zy5zZXROYW1lKGYpO2cuc2V0VHlwZShsLnR5cGUpOzE9PT1sLnR5cGV8fDA9PT1sLnR5cGU/Zy5zZXROdW1TdGF0cyhBcShsLnZhbHMsbC5jb3VudHMsYyxsLm1pc3NpbmcpKToyPT09bC50eXBlJiZnLnNldFN0cmluZ1N0YXRzKEJxKGwudmFscyxsLmNvdW50cyxjLGwubWlzc2luZykpfXJldHVybiBkfQpmdW5jdGlvbiBBcShhLGMsZCxmKXtjb25zdCBnPW5ldyBObDtnLnNldENvbW1vblN0YXRzKENxKGMsZCxmKSk7bGV0IGw9MCxrPTAsbj0wO2M9YS5maWx0ZXIodD0+Im51bWJlciI9PT10eXBlb2YgdCYmIWlzTmFOKHQpKS5tYXAodD0+K3QpLnNvcnQoKHQsdik9PnQtdik7MDxjLmxlbmd0aCYmKGcuc2V0TWluKGNbMF0pLGcuc2V0TWF4KGNbYy5sZW5ndGgtMV0pLGQ9TWF0aC5mbG9vcihjLmxlbmd0aC8yKSxnLnNldE1lZGlhbigwIT09Yy5sZW5ndGglMj9jW2RdOihjW2RdK2NbZC0xXSkvMikpO2MuZm9yRWFjaCh0PT57MD09PXQmJihuKz0xKTtsKz10O2srPXQqdH0pOzE8Yy5sZW5ndGgmJmcuc2V0U3RkRGV2KE1hdGguc3FydCgoay1sKmwvYy5sZW5ndGgpLyhjLmxlbmd0aC0xKSkpO2cuc2V0TWVhbihsL2EubGVuZ3RoKTtnLnNldE51bVplcm9zKG4pO2E9Yy5maWx0ZXIodD0+SW5maW5pdHkhPT10JiYtSW5maW5pdHkhPT10KTtkPWMuZmlsdGVyKHQ9PkluZmluaXR5PT09dCkubGVuZ3RoOwpmPWMuZmlsdGVyKHQ9Pi1JbmZpbml0eT09PXQpLmxlbmd0aDt2YXIgcD1hWzBdO2NvbnN0IHE9YVthLmxlbmd0aC0xXTtwPWQzLnJhbmdlKHAscSwocS1wKS8xMCk7cD1kMy5oaXN0b2dyYW0oKS50aHJlc2hvbGRzKHApKGEpO2xldCByPWcuYWRkSGlzdG9ncmFtcygpO3Iuc2V0VHlwZSgwKTtwLmZvckVhY2godD0+e2NvbnN0IHY9ci5hZGRCdWNrZXRzKCk7di5zZXRTYW1wbGVDb3VudCh0Lmxlbmd0aCk7di5zZXRMb3dWYWx1ZSh0LngwKTt2LnNldEhpZ2hWYWx1ZSh0LngxKX0pO3A9ci5nZXRCdWNrZXRzTGlzdCgpO2MubGVuZ3RoJiYtSW5maW5pdHk9PT1jWzBdJiYocFswXS5zZXRMb3dWYWx1ZSgtSW5maW5pdHkpLHBbMF0uc2V0U2FtcGxlQ291bnQocFswXS5nZXRTYW1wbGVDb3VudCgpK2YpKTtjLmxlbmd0aCYmSW5maW5pdHk9PT1jW2MubGVuZ3RoLTFdJiYocFtwLmxlbmd0aC0xXS5zZXRIaWdoVmFsdWUoSW5maW5pdHkpLHBbcC5sZW5ndGgtMV0uc2V0U2FtcGxlQ291bnQocFtwLmxlbmd0aC0KMV0uZ2V0U2FtcGxlQ291bnQoKStkKSk7cj1nLmFkZEhpc3RvZ3JhbXMoKTtEcShyLGEpO3JldHVybiBnfWZ1bmN0aW9uIERxKGEsYyl7dmFyIGQ9WzAsMTAsMjAsMzAsNDAsNTAsNjAsNzAsODAsOTAsMTAwXTtjb25zdCBmPWQubGVuZ3RoLTE7ZD1kLm1hcChsPT5FcShjLGwpKTthLnNldFR5cGUoMSk7Y29uc3QgZz1jLmxlbmd0aC9mO2ZvcihsZXQgbD0wO2w8ZjtsKyspe2NvbnN0IGs9YS5hZGRCdWNrZXRzKCk7ay5zZXRTYW1wbGVDb3VudChnKTtrLnNldExvd1ZhbHVlKGRbbF0pO2suc2V0SGlnaFZhbHVlKGRbbCsxXSl9fWZ1bmN0aW9uIEVxKGEsYyl7aWYoMD09PWEubGVuZ3RoKXJldHVybiBOYU47Yz1jLzEwMCooYS5sZW5ndGgtMSk7Y29uc3QgZD1NYXRoLmZsb29yKGMpO3JldHVybiBkPT09Yz9hW2NdOmFbZF0rKGFbZCsxXS1hW2RdKSooYy1kKX0KZnVuY3Rpb24gQnEoYSxjLGQsZil7Y29uc3QgZz1uZXcgUGw7Zy5zZXRDb21tb25TdGF0cyhDcShjLGQsZikpO2xldCBsPTA7Y29uc3Qgaz17fTthLmZvckVhY2gocT0+e3E9U3RyaW5nKHEpO2tbcV09KGtbcV18fDApKzE7bCs9cS5sZW5ndGh9KTswPGEubGVuZ3RoJiZnLnNldEF2Z0xlbmd0aChsL2EubGVuZ3RoKTthPVtdO2Zvcih2YXIgbiBpbiBrKWsuaGFzT3duUHJvcGVydHkobikmJmEucHVzaCh7c3RyOm4sY291bnQ6a1tuXX0pO2cuc2V0VW5pcXVlKGEubGVuZ3RoKTthPWEuc29ydCgocSxyKT0+ci5jb3VudC1xLmNvdW50KTtjb25zdCBwPW5ldyBibTtnLnNldFJhbmtIaXN0b2dyYW0ocCk7YS5sZW5ndGgmJihuPWcuYWRkVG9wVmFsdWVzKCksbi5zZXRWYWx1ZShhWzBdLnN0ciksbi5zZXRGcmVxdWVuY3koYVswXS5jb3VudCkpO2EuZm9yRWFjaCgocSxyKT0+e2NvbnN0IHQ9cC5hZGRCdWNrZXRzKCk7dC5zZXRTYW1wbGVDb3VudChxLmNvdW50KTt0LnNldExvd1Jhbmsocik7CnQuc2V0SGlnaFJhbmsocik7dC5zZXRMYWJlbChxLnN0cil9KTtyZXR1cm4gZ31mdW5jdGlvbiBDcShhLGMsZCl7Y29uc3QgZj1uZXcgWWw7bGV0IGc9SW5maW5pdHksbD0wLGs9MDthLmZvckVhY2gobj0+e248ZyYmKGc9bik7bj5sJiYobD1uKTtrKz1ufSk7Zi5zZXROdW1Ob25NaXNzaW5nKGMtZCk7Zi5zZXROdW1NaXNzaW5nKGQpO2Yuc2V0TWluTnVtVmFsdWVzKGcpO2Yuc2V0TWF4TnVtVmFsdWVzKGwpOzA8YS5sZW5ndGgmJmYuc2V0QXZnTnVtVmFsdWVzKGsvYS5sZW5ndGgpO2M9bmV3IFpsO2Yuc2V0TnVtVmFsdWVzSGlzdG9ncmFtKGMpO0RxKGMsYSk7cmV0dXJuIGZ9OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2ZhY2V0cy1vdmVydmlldy9jb21tb24vdXRpbHMuanMKY2xhc3MgRnF7fWNsYXNzIEdxe2NvbnN0cnVjdG9yKGEsYyxkLGYsZyxsLGssbil7dGhpcy5oaXN0TWFwPXt9O3RoaXMubmFtZT1hO2MmJih0aGlzLmhpc3RNYXBbSHEoITEsIlN0YW5kYXJkIildPWMpO2QmJih0aGlzLmhpc3RNYXBbSHEoITAsIlN0YW5kYXJkIildPWQpO2YmJih0aGlzLmhpc3RNYXBbSHEoITEsIlF1YW50aWxlcyIpXT1mKTtnJiYodGhpcy5oaXN0TWFwW0hxKCEwLCJRdWFudGlsZXMiKV09Zyk7bCYmKHRoaXMuaGlzdE1hcFtIcSghMSwiVmFsdWUgbGlzdCBsZW5ndGgiKV09bCk7ayYmKHRoaXMuaGlzdE1hcFtIcSghMSwiRmVhdHVyZSBsaXN0IGxlbmd0aCIpXT1rKTtuJiZPYmplY3Qua2V5cyhuKS5mb3JFYWNoKHA9PnRoaXMuaGlzdE1hcFtwXT1uW3BdKX19CmNsYXNzIElxe2NvbnN0cnVjdG9yKGEsYyxkLGYpe3RoaXMubmFtZT1hO3RoaXMuc3RyaW5nVmFsdWU9Yzt0aGlzLmxvd051bVZhbHVlPWQ7dGhpcy5oaWdoTnVtVmFsdWU9Zn1jbGVhcigpe3RoaXMuaGlnaE51bVZhbHVlPXRoaXMubG93TnVtVmFsdWU9dGhpcy5zdHJpbmdWYWx1ZT10aGlzLm5hbWU9dm9pZCAwfWVxdWFscyhhKXtyZXR1cm4gYT90aGlzLm5hbWU9PT1hLm5hbWUmJnRoaXMuc3RyaW5nVmFsdWU9PT1hLnN0cmluZ1ZhbHVlJiZ0aGlzLmxvd051bVZhbHVlPT09YS5sb3dOdW1WYWx1ZSYmdGhpcy5oaWdoTnVtVmFsdWU9PT1hLmhpZ2hOdW1WYWx1ZTohMX19CmZ1bmN0aW9uIFVzKGEpe2NvbnN0IGM9VnMoYSk7aWYoMD09PWMpcmV0dXJuIDA7Y29uc3QgZD1hLnJlZHVjZSgoZixnKT0+e2c9K2cuZ2V0U2FtcGxlQ291bnQoKXx8MDtpZigwPT09ZylyZXR1cm4gZjtnLz1jO3JldHVybiBmLWcqTWF0aC5sb2coZyl9LDApO3JldHVybiAwPT09ZD8wOmQvTWF0aC5sb2coYS5sZW5ndGgpfWZ1bmN0aW9uIFdzKGEsYyl7cmV0dXJuIGlzRmluaXRlKGEpJiYtMT09PWEudG9TdHJpbmcoKS5pbmRleE9mKCJlIik/KyhNYXRoLnJvdW5kKE51bWJlcihhKyJlKyIrYykpKyJlLSIrYyk6YX1mdW5jdGlvbiBYcyhhLGMsZCl7cmV0dXJuKGE9YS5oaXN0TWFwW0hxKGMsZCldKT9hLmdldEJ1Y2tldHNMaXN0KCk6W119ZnVuY3Rpb24gSHEoYSxjKXtjPW51bGw9PWM/IlN0YW5kYXJkIjpjO2EmJihjPSJ3ZWlnaHRlZCIrYyk7cmV0dXJuIGN9CmZ1bmN0aW9uIFZzKGEpe3JldHVybiBhLm1hcChjPT5jLmdldFNhbXBsZUNvdW50KCkpLnJlZHVjZSgoYyxkKT0+KCtkfHwwKStjLDApfWZ1bmN0aW9uIFlzKGEpe3JldHVybiBhLm1hcChjPT5WcyhYcyhjLCExKSkpfWZ1bmN0aW9uIFpzKGEpe2NvbnN0IGM9W107YS5mb3JFYWNoKGQ9PntkLmZvckVhY2goZj0+e2Y9JHMoZi5nZXRMYWJlbCgpKTstMT09PWMuaW5kZXhPZihmKSYmYy5wdXNoKGYpfSl9KTtyZXR1cm4gY31mdW5jdGlvbiAkcyhhKXtyZXR1cm4gbnVsbD09YXx8IiI9PT1hPyJcdTAwYTAiOmF9ZnVuY3Rpb24gYXQoYSl7cmV0dXJuIDA9PT1hLmxlbmd0aHx8aXNOYU4oK2EpP2E6JyInK2ErJyInfWZ1bmN0aW9uIGJ0KGEpe3JldHVybiBudWxsPT1hPzA6ImluZiI9PT1hP0luZmluaXR5OiItaW5mIj09PWE/LUluZmluaXR5OithfQpmdW5jdGlvbiBjdChhKXtsZXQgYz0wO3ZhciBkPTA7Y29uc3QgZj1kdChhKTthJiZhLmdldE51bVN0YXRzKCkmJihhPWEuZ2V0TnVtU3RhdHMoKSxjKz1idChhLmdldE51bVplcm9zKCkpKTtmJiYoZD1idChmLmdldE51bU1pc3NpbmcoKSksYys9ZCxkPWJ0KGYuZ2V0TnVtTm9uTWlzc2luZygpKStkKTtyZXR1cm4gMD09PWQ/MTpjL2R9CmZ1bmN0aW9uIGV0KGEpe2NvbnN0IGM9YS5tYXAoeT0+WHMoeSwhMSkpO3ZhciBkPW51bGw7Zm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspaWYoMDxjW2ZdLmxlbmd0aCl7ZD1jW2ZdWzBdO2JyZWFrfWlmKCFkKXJldHVybiAwO2Y9WXMoYSk7Zm9yKHZhciBnPTA7ZzxmLmxlbmd0aDtnKyspaWYoMD09PWZbZ10pcmV0dXJuIEluZmluaXR5O2c9MDtpZihkIGluc3RhbmNlb2YgZG0pe2Q9WnMoYyk7Zm9yKHZhciBsPTE7bDxhLmxlbmd0aDtsKyspe3ZhciBrPWNbMF0sbj1jW2xdLHA9MDtmb3IodmFyIHE9MDtxPGQubGVuZ3RoO3ErKyl7dmFyIHI9ZFtxXSx0PTA7bGV0IHk9MDtmb3IodmFyIHY9MDt2PGsubGVuZ3RoO3YrKylpZihrW3ZdLmdldExhYmVsKCk9PT1yKXt0PWtbdl0uZ2V0U2FtcGxlQ291bnQoKT9rW3ZdLmdldFNhbXBsZUNvdW50KCk6MDticmVha31mb3Iodj0wO3Y8bi5sZW5ndGg7disrKWlmKG5bdl0uZ2V0TGFiZWwoKT09PXIpe3k9blt2XS5nZXRTYW1wbGVDb3VudCgpPwpuW3ZdLmdldFNhbXBsZUNvdW50KCk6MDticmVha31wPWZ0KHAsdCxmWzBdLHksZltsXSl9Zz1NYXRoLm1heChnLHApfX1lbHNlIGZvcihkPTE7ZDxhLmxlbmd0aDtkKyspe2w9Y1swXTtrPWNbZF07bj0wO3A9TWF0aC5tYXgobC5sZW5ndGgsay5sZW5ndGgpO2ZvcihxPTA7cTxwO3ErKylyPXE8bC5sZW5ndGgmJmxbcV0uZ2V0U2FtcGxlQ291bnQoKT9sW3FdLmdldFNhbXBsZUNvdW50KCk6MCx0PXE8ay5sZW5ndGgmJmtbcV0uZ2V0U2FtcGxlQ291bnQoKT9rW3FdLmdldFNhbXBsZUNvdW50KCk6MCxuPWZ0KG4scixmWzBdLHQsZltkXSk7Zz1NYXRoLm1heChnLG4pfXJldHVybiBnfWZ1bmN0aW9uIGZ0KGEsYyxkLGYsZyl7Y29uc3QgbD1jL2QtZi9nO2M9Yy8oZCpkKStmLyhnKmcpO3JldHVybiBhKyhjP2wqbC9jOjApfWZ1bmN0aW9uIGd0KGEsYyl7cmV0dXJuIGM9PT1hP2MudG9Mb2NhbGVTdHJpbmcoKTphLnRvTG9jYWxlU3RyaW5nKCkrIi8iK2MudG9Mb2NhbGVTdHJpbmcoKX0KZnVuY3Rpb24gaHQoYSl7cmV0dXJuIG51bGwhPWEuZ2V0TnVtU3RhdHMoKX0KZnVuY3Rpb24gaXQoYSl7YS5nZXREYXRhc2V0c0xpc3QoKS5mb3JFYWNoKGM9PntjLmdldEZlYXR1cmVzTGlzdCgpLmZvckVhY2goZD0+e3ZhciBmPWQuZ2V0UGF0aCgpO251bGwhPWYmJihmPWYuZ2V0U3RlcExpc3QoKSxudWxsIT1mJiZkLnNldE5hbWUoZi5qb2luKCIvIikpKTtmPVtdO2lmKGQuZ2V0U3RyaW5nU3RhdHMoKSl7Y29uc3QgZz1kLmdldFN0cmluZ1N0YXRzKCkuZ2V0UmFua0hpc3RvZ3JhbSgpO2cmJmYucHVzaChnKTsoZD1kLmdldFN0cmluZ1N0YXRzKCkuZ2V0VG9wVmFsdWVzTGlzdCgpKSYmZC5mb3JFYWNoKGw9Pntjb25zdCBrPWwuZ2V0RGVwcmVjYXRlZEZyZXEoKTtrJiYhbC5nZXRGcmVxdWVuY3koKSYmbC5zZXRGcmVxdWVuY3koayl9KX1lbHNlIGQuZ2V0TnVtU3RhdHMoKSYmKGQ9ZC5nZXROdW1TdGF0cygpLmdldEhpc3RvZ3JhbXNMaXN0KCkpJiYoZj1mLmNvbmNhdChkKSk7Zi5mb3JFYWNoKGc9PnsoZz1nLmdldEJ1Y2tldHNMaXN0KCkpJiZnLmZvckVhY2gobD0+Cntjb25zdCBrPWwuZ2V0RGVwcmVjYXRlZENvdW50KCk7ayYmIWwuZ2V0U2FtcGxlQ291bnQoKSYmbC5zZXRTYW1wbGVDb3VudChrKX0pfSl9KX0pO3JldHVybiBhfQpmdW5jdGlvbiBqdChhKXtsZXQgYz0hMDthLmdldERhdGFzZXRzTGlzdCgpLmZvckVhY2goZD0+e2QuZ2V0RmVhdHVyZXNMaXN0KCkuZm9yRWFjaChmPT57bGV0IGc9W107aWYoZi5nZXRTdHJpbmdTdGF0cygpKXtjb25zdCBsPWYuZ2V0U3RyaW5nU3RhdHMoKS5nZXRSYW5rSGlzdG9ncmFtKCk7bCYmZy5wdXNoKGwpOyhmPWYuZ2V0U3RyaW5nU3RhdHMoKS5nZXRUb3BWYWx1ZXNMaXN0KCkpJiZmLmZvckVhY2goaz0+e2suZ2V0RGVwcmVjYXRlZEZyZXEoKSYmIWsuZ2V0RnJlcXVlbmN5KCkmJihjPSExKX0pfWVsc2UgZi5nZXROdW1TdGF0cygpJiYoZj1mLmdldE51bVN0YXRzKCkuZ2V0SGlzdG9ncmFtc0xpc3QoKSkmJihnPWcuY29uY2F0KGYpKTtnLmZvckVhY2gobD0+eyhsPWwuZ2V0QnVja2V0c0xpc3QoKSkmJmwuZm9yRWFjaChrPT57ay5nZXREZXByZWNhdGVkQ291bnQoKSYmIWsuZ2V0U2FtcGxlQ291bnQoKSYmKGM9ITEpfSl9KX0pfSk7cmV0dXJuIGN9CmZ1bmN0aW9uIGt0KGEpe2ZvcihsZXQgYz0wO2M8YS5nZXREYXRhc2V0c0xpc3QoKS5sZW5ndGg7YysrKXtjb25zdCBkPWEuZ2V0RGF0YXNldHNMaXN0KClbY107Zm9yKGxldCBmPTA7ZjxkLmdldEZlYXR1cmVzTGlzdCgpLmxlbmd0aDtmKyspe2NvbnN0IGc9ZC5nZXRGZWF0dXJlc0xpc3QoKVtmXTtpZihnLmdldFN0cmluZ1N0YXRzKCkpe2lmKGcuZ2V0U3RyaW5nU3RhdHMoKS5nZXRXZWlnaHRlZFN0cmluZ1N0YXRzKCkpcmV0dXJuITB9ZWxzZSBpZihnLmdldE51bVN0YXRzKCkmJmcuZ2V0TnVtU3RhdHMoKS5nZXRXZWlnaHRlZE51bWVyaWNTdGF0cygpKXJldHVybiEwfX1yZXR1cm4hMX0KZnVuY3Rpb24gbHQoYSl7Zm9yKGxldCBjPTA7YzxhLmdldERhdGFzZXRzTGlzdCgpLmxlbmd0aDtjKyspe2NvbnN0IGQ9YS5nZXREYXRhc2V0c0xpc3QoKVtjXTtmb3IobGV0IGY9MDtmPGQuZ2V0RmVhdHVyZXNMaXN0KCkubGVuZ3RoO2YrKyl7Y29uc3QgZz1kLmdldEZlYXR1cmVzTGlzdCgpW2ZdLmdldEN1c3RvbVN0YXRzTGlzdCgpO2lmKG51bGwhPWcmJjA8Zy5sZW5ndGgpcmV0dXJuITB9fXJldHVybiExfWZ1bmN0aW9uIG10KGEpe2ZvcihsZXQgZD0wO2Q8YS5nZXREYXRhc2V0c0xpc3QoKS5sZW5ndGg7ZCsrKXtjb25zdCBmPWEuZ2V0RGF0YXNldHNMaXN0KClbZF07Zm9yKGxldCBnPTA7ZzxmLmdldEZlYXR1cmVzTGlzdCgpLmxlbmd0aDtnKyspe3ZhciBjPWYuZ2V0RmVhdHVyZXNMaXN0KClbZ107aWYoKGM9ZHQoYykpJiZjLmdldEZlYXR1cmVMaXN0TGVuZ3RoSGlzdG9ncmFtKCkpcmV0dXJuITB9fXJldHVybiExfQpmdW5jdGlvbiBudChhKXtpZighYSlyZXR1cm4hMTtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKylpZihhW2NdLmhpc3RNYXBbSHEoITAsIlN0YW5kYXJkIildKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIG90KGEpe2lmKCFhKXJldHVybiExO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGFbY10uaGlzdE1hcC5RdWFudGlsZXMpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gcHQoYSl7aWYoIWEpcmV0dXJuITE7Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYVtjXS5oaXN0TWFwWyJWYWx1ZSBsaXN0IGxlbmd0aCJdKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIHF0KGEpe3JldHVybiBhP2EuZ2V0TnVtTm9uTWlzc2luZygpKmEuZ2V0QXZnTnVtVmFsdWVzKCk6MH0KZnVuY3Rpb24gcnQoYSl7c3dpdGNoKGEpe2Nhc2UgMDpyZXR1cm4iaW50IjtjYXNlIDE6cmV0dXJuImZpeGVkLWxlbmd0aCBpbnRzIjtjYXNlIDI6cmV0dXJuInZhcmlhYmxlLWxlbmd0aCBpbnRzIjtjYXNlIDM6cmV0dXJuImZsb2F0IjtjYXNlIDQ6cmV0dXJuImZpeGVkLWxlbmd0aCBmbG9hdHMiO2Nhc2UgNTpyZXR1cm4idmFyaWFibGUtbGVuZ3RoIGZsb2F0cyI7Y2FzZSA2OnJldHVybiJzdHJpbmciO2Nhc2UgNzpyZXR1cm4iZml4ZWQtbGVuZ3RoIHN0cmluZ3MiO2Nhc2UgODpyZXR1cm4idmFyaWFibGUtbGVuZ3RoIHN0cmluZ3MiO2Nhc2UgOTpyZXR1cm4iYnl0ZXMiO2Nhc2UgMTA6cmV0dXJuImZpeGVkLWxlbmd0aCBieXRlcyI7Y2FzZSAxMTpyZXR1cm4idmFyaWFibGUtbGVuZ3RoIGJ5dGVzIjtjYXNlIDEyOnJldHVybiJzdHJ1Y3QiO2Nhc2UgMTM6cmV0dXJuImZpeGVkLWxlbmd0aCBzdHJ1Y3QiO2Nhc2UgMTQ6cmV0dXJuInZhcmlhYmxlLWxlbmd0aCBzdHJ1Y3QiO2RlZmF1bHQ6cmV0dXJuInVua25vd24ifX0KZnVuY3Rpb24gc3QoYSxjKXtyZXR1cm4gMTU9PT1hP2M6MTY8PWF8fDE1PT09Yz9hOjM8PWEmJjU+PWEmJjM8PWMmJjU+PWN8fDA8PWEmJjI+PWEmJjA8PWMmJjI+PWN8fDY8PWEmJjg+PWEmJjY8PWMmJjg+PWN8fDk8PWEmJjExPj1hJiY5PD1jJiYxMT49Y3x8MTI8PWEmJjE0Pj1hJiYxMjw9YyYmMTQ+PWM/TWF0aC5tYXgoYSxjKToxNn1mdW5jdGlvbiB0dChhLGMpe3ZhciBkPTE1O2lmKG51bGwhPWMmJjAhPT1jLmdldE51bU5vbk1pc3NpbmcoKSl7bGV0IGY9ZD0hMTtjLmdldE1pbk51bVZhbHVlcygpPT09Yy5nZXRNYXhOdW1WYWx1ZXMoKSYmKDE9PT1jLmdldE1pbk51bVZhbHVlcygpP2Q9ITA6Zj0hMCk7ZD0xPT09YT9kPzM6Zj80OjU6MD09PWE/ZD8wOmY/MToyOjI9PT1hP2Q/NjpmPzc6ODozPT09YT9kPzk6Zj8xMDoxMTpkPzEyOmY/MTM6MTR9cmV0dXJuIGR9Y2xhc3MgdXR7fWNsYXNzIHZ0e31jbGFzcyB3dHt9CmZ1bmN0aW9uIHh0KGEpe2xldCBjPTAsZD0wO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWFbZl0ucmF3QnVja2V0cy5sZW5ndGg+YyYmKGM9YVtmXS5yYXdCdWNrZXRzLmxlbmd0aCxkPWYpO2Y9W107Zm9yKGxldCBnPTA7ZzxjO2crKyl7Y29uc3QgbD1uZXcgd3Q7bC52YWx1ZT1hW2RdLnJhd0J1Y2tldHNbZ10uZ2V0TGFiZWwoKTtsLmNvdW50cz1bXTtmb3IobGV0IGs9MDtrPGEubGVuZ3RoO2srKylhW2tdLnJhd0J1Y2tldHMubGVuZ3RoPD1nP2wuY291bnRzLnB1c2goMCk6bC5jb3VudHMucHVzaChhW2tdLnJhd0J1Y2tldHNbZ10uZ2V0U2FtcGxlQ291bnQoKSk7Zi5wdXNoKGwpfXJldHVybiBmfQpmdW5jdGlvbiB5dChhLGMpe2NvbnN0IGQ9W107Zm9yKGxldCBmPTA7ZjxjLmxlbmd0aDtmKyspe2NvbnN0IGc9bmV3IHd0LGw9Y1tmXTtnLnZhbHVlPWw7Zy5jb3VudHM9W107Zm9yKGxldCBrPTA7azxhLmxlbmd0aDtrKyspe2NvbnN0IG49YVtrXS5yYXdCdWNrZXRzO2xldCBwPS0xO2ZvcihsZXQgcT0wO3E8bi5sZW5ndGg7cSsrKWlmKG5bcV0uZ2V0TGFiZWwoKT09PWwpe3A9cTticmVha30tMT09PXA/Zy5jb3VudHMucHVzaCgwKTpnLmNvdW50cy5wdXNoKG5bcF0uZ2V0U2FtcGxlQ291bnQoKSl9ZC5wdXNoKGcpfXJldHVybiBkfXZhciB6dDsoZnVuY3Rpb24oYSl7YVthLkhJU1RPR1JBTT0wXT0iSElTVE9HUkFNIjthW2EuQkFSX0NIQVJUPTFdPSJCQVJfQ0hBUlQiO2FbYS5DVU1ESVNUX0NIQVJUPTJdPSJDVU1ESVNUX0NIQVJUIn0pKHp0fHwoenQ9e30pKTsKZnVuY3Rpb24gQXQoYSl7cmV0dXJuIlF1YW50aWxlcyI9PT1hfHwiVmFsdWUgbGlzdCBsZW5ndGgiPT09YXx8IkZlYXR1cmUgbGlzdCBsZW5ndGgiPT09YX1mdW5jdGlvbiBCdChhLGMsZCl7bGV0IGY9ITAsZz0wO2EuZm9yRWFjaChsPT57bC5oaXN0TWFwW2NdJiYobD1sLmhpc3RNYXBbY10uZ2V0QnVja2V0c0xpc3QoKSxnPU1hdGgubWF4KGcsbC5sZW5ndGgpLGwuZm9yRWFjaChrPT57ay5nZXRMb3dWYWx1ZXx8KGY9ITEpfSkpfSk7cmV0dXJuIGY/enQuSElTVE9HUkFNOmc+ZD96dC5DVU1ESVNUX0NIQVJUOnp0LkJBUl9DSEFSVH0KY2xhc3MgQ3R7Y29uc3RydWN0b3IoYSxjLGQpe3RoaXMuc3RyPWE7dGhpcy5jc3NDbGFzcz1jO3RoaXMuZnVsbFN0cj1kO3RoaXMuZnVsbFN0cnx8KHRoaXMuZnVsbFN0cj1hKX1hcHBlbmQoYSxjKXtjJiYodGhpcy5zdHIrPWMsdGhpcy5mdWxsU3RyKz1jKTt0aGlzLnN0cis9YS5zdHI7dGhpcy5mdWxsU3RyKz1hLmZ1bGxTdHI7dGhpcy5jc3NDbGFzcys9YS5jc3NDbGFzc319ZnVuY3Rpb24gRHQoYSl7Y29uc3QgYz1NYXRoLmFicyhhKTtyZXR1cm4oLjAxPmMmJjA8Y3x8MUU0PGMpJiZpc0Zpbml0ZShhKT9kMy5mb3JtYXQoIi4zcyIpKGEpLnJlcGxhY2UoL0ckLywiQiIpOmEudG9Mb2NhbGVTdHJpbmcoKX1mdW5jdGlvbiBFdChhLGMpe2NvbnN0IGQ9RHQoV3MoYnQoYSksMUU2PE1hdGguYWJzKGEpPzA6MikpO2M9RnQoYSxjLHZvaWQgMCk7cmV0dXJuIG5ldyBDdChkLGMsYS50b0xvY2FsZVN0cmluZyhbXSx7bWF4aW11bUZyYWN0aW9uRGlnaXRzOjl9KSl9CmZ1bmN0aW9uIEd0KGEsYyxkKXthPWJ0KGEpO2E9bnVsbCE9YSYmYz9hL2M6MDtjPS45OTk5OTk8YSYmMT5hPyJ+MTAwJSI6MUUtNj5hJiYwPGE/In4wJSI6V3MoMTAwKmEsMikrIiUiO2Q9RnQoYSwhMSxkKTtyZXR1cm4gbmV3IEN0KGMsZCwxMDAqYSsiJSIpfWZ1bmN0aW9uIEh0KGEsYyxkKXtjb25zdCBmPUR0KGEpO2M9RnQoYSxjLGQpO3JldHVybiBuZXcgQ3QoZixjLGEudG9Mb2NhbGVTdHJpbmcoKSl9ZnVuY3Rpb24gSXQoYSxjKXthPWF0KCRzKGEpKTtjPUZ0KGEsYyx2b2lkIDApO3JldHVybiBuZXcgQ3QoYSxjKX1mdW5jdGlvbiBGdChhLGMsZCl7Yz1jPyJkYXRhLXdlaWdodGVkICI6IiI7aWYoZCYmZChhKXx8Im51bWJlciI9PT10eXBlb2YgYSYmIWlzRmluaXRlKGEpKWMrPSJkYXRhLWVycm9yICI7cmV0dXJuIGN9CmZ1bmN0aW9uIEp0KGEsYyxkKXtjb25zdCBmPVtdO2YucHVzaChJdCgiY291bnQiKSk7Zi5wdXNoKEl0KCJtaXNzaW5nIikpO2E/KGYucHVzaChJdCgibWVhbiIsYykpLGYucHVzaChJdCgic3RkIGRldiIsYykpLGYucHVzaChJdCgiemVyb3MiKSksZi5wdXNoKEl0KCJtaW4iKSksZi5wdXNoKEl0KCJtZWRpYW4iLGMpKSxmLnB1c2goSXQoIm1heCIpKSk6KGYucHVzaChJdCgidW5pcXVlIikpLGYucHVzaChJdCgidG9wIixjKSksZi5wdXNoKEl0KCJmcmVxIHRvcCIsYykpLGYucHVzaChJdCgiYXZnIHN0ciBsZW4iKSkpO2QmJmYucHVzaChuZXcgQ3QoImN1c3RvbSIsImRhdGEtY3VzdG9tICIpKTtyZXR1cm4gZn0KZnVuY3Rpb24gZHQoYSl7cmV0dXJuIGE/YS5nZXROdW1TdGF0cygpP2EuZ2V0TnVtU3RhdHMoKS5nZXRDb21tb25TdGF0cygpOmEuZ2V0U3RyaW5nU3RhdHMoKT9hLmdldFN0cmluZ1N0YXRzKCkuZ2V0Q29tbW9uU3RhdHMoKTphLmdldEJ5dGVzU3RhdHMoKT9hLmdldEJ5dGVzU3RhdHMoKS5nZXRDb21tb25TdGF0cygpOmEuZ2V0U3RydWN0U3RhdHMoKT9hLmdldFN0cnVjdFN0YXRzKCkuZ2V0Q29tbW9uU3RhdHMoKTpudWxsOm51bGx9ZnVuY3Rpb24gS3QoYSl7Y29uc3QgYz1bXTthPyhjLnB1c2goSHQoYS5nZXROdW1Ob25NaXNzaW5nKCksITEsZD0+MD49ZCkpLGMucHVzaChHdChhLmdldE51bU1pc3NpbmcoKSxidChhLmdldE51bU5vbk1pc3NpbmcoKSkrYnQoYS5nZXROdW1NaXNzaW5nKCkpLGQ9Pi4wMjxkKSkpOihjLnB1c2goSHQoMCwhMSxkPT4wPj1kKSksYy5wdXNoKEd0KDEsMSxkPT4uMDI8ZCkpKTtyZXR1cm4gY30KZnVuY3Rpb24gTHQoYSxjLGQpe2NvbnN0IGY9W107aWYoYSkoZD1kP2EuZ2V0V2VpZ2h0ZWROdW1lcmljU3RhdHMoKTpudWxsKT8oZi5wdXNoKEV0KGQuZ2V0TWVhbigpLCEwKSksZi5wdXNoKEV0KGQuZ2V0U3RkRGV2KCksITApKSk6KGYucHVzaChFdChhLmdldE1lYW4oKSkpLGYucHVzaChFdChhLmdldFN0ZERldigpKSkpLGYucHVzaChHdChhLmdldE51bVplcm9zKCkscXQoYyksZz0+LjE8ZykpLGM9TXQoYSksZi5wdXNoKEV0KGM/TmFOOmEuZ2V0TWluKCkpKSxkP2YucHVzaChFdChkLmdldE1lZGlhbigpLCEwKSk6Zi5wdXNoKEV0KGEuZ2V0TWVkaWFuKCkpKSxmLnB1c2goRXQoYz9OYU46YS5nZXRNYXgoKSkpO2Vsc2UgZm9yKGE9MDs2PmE7YSsrKWYucHVzaChJdCgiLSIpKTtyZXR1cm4gZn0KZnVuY3Rpb24gTXQoYSl7aWYoIWEpcmV0dXJuITE7YT1hLmdldEhpc3RvZ3JhbXNMaXN0KCk7Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspaWYoMDxhW2NdLmdldE51bU5hbigpKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIE50KGEsYyl7Y29uc3QgZD1bXTtpZihhKXtjPWM/YS5nZXRXZWlnaHRlZFN0cmluZ1N0YXRzKCk6bnVsbDtkLnB1c2goSHQoYS5nZXRVbmlxdWUoKSkpO2NvbnN0IGY9Yz9jLmdldFRvcFZhbHVlc0xpc3QoKTphLmdldFRvcFZhbHVlc0xpc3QoKTtmJiYwPGYubGVuZ3RoPyhkLnB1c2goSXQoZlswXS5nZXRWYWx1ZSgpLCEhYykpLGQucHVzaChFdChmWzBdLmdldEZyZXF1ZW5jeSgpLCEhYykpKTooZC5wdXNoKEl0KCItIikpLGQucHVzaChJdCgiLSIpKSk7ZC5wdXNoKEV0KGEuZ2V0QXZnTGVuZ3RoKCkpKX1lbHNlIGZvcihhPTA7ND5hO2ErKylkLnB1c2goSXQoIi0iKSk7cmV0dXJuIGR9CmZ1bmN0aW9uIE90KGEpe2NvbnN0IGM9W107aWYoYSljLnB1c2goSHQoYS5nZXRVbmlxdWUoKSkpLGMucHVzaChJdCgiLSIpKSxjLnB1c2goSXQoIi0iKSksYy5wdXNoKEV0KGEuZ2V0QXZnTnVtQnl0ZXMoKSkpO2Vsc2UgZm9yKGE9MDs0PmE7YSsrKWMucHVzaChJdCgiLSIpKTtyZXR1cm4gY31mdW5jdGlvbiBQdChhKXtjb25zdCBjPVtdO2lmKGEmJjA8YS5sZW5ndGgpe2NvbnN0IGQ9bmV3IEN0KCIiLCJkYXRhLWN1c3RvbSAiKTthLmZvckVhY2goZj0+e2lmKCFmLmdldEhpc3RvZ3JhbSgpJiYhZi5nZXRSYW5rSGlzdG9ncmFtKCkpe3ZhciBnPWYuZ2V0TmFtZSgpOyIiIT09ZC5zdHImJihnPSJcbiIrZyk7ZC5hcHBlbmQoSXQoZykpO2YuZ2V0U3RyKCk/ZC5hcHBlbmQoSXQoZi5nZXRTdHIoKSksIjogIik6ZC5hcHBlbmQoRXQoZi5nZXROdW0oKSksIjogIil9fSk7Yy5wdXNoKGQpfWVsc2UgYy5wdXNoKG5ldyBDdCgiLSIsImRhdGEtY3VzdG9tICIpKTtyZXR1cm4gY30KZnVuY3Rpb24gUXQoYSxjLGQpe2lmKCFhKXJldHVybltdO2NvbnN0IGY9ZHQoYSk7bGV0IGc9S3QoZik7Zz1hLmdldE51bVN0YXRzKCk/Zy5jb25jYXQoTHQoYS5nZXROdW1TdGF0cygpLGYsYykpOmEuZ2V0U3RyaW5nU3RhdHMoKT9nLmNvbmNhdChOdChhLmdldFN0cmluZ1N0YXRzKCksYykpOmcuY29uY2F0KE90KGEuZ2V0Qnl0ZXNTdGF0cygpKSk7ZCYmKGc9Zy5jb25jYXQoUHQoYS5nZXRDdXN0b21TdGF0c0xpc3QoKSkpKTtyZXR1cm4gZ30KZnVuY3Rpb24gUnQoYSl7Y29uc3QgYz1hLm1hcCgoKT0+MCk7YS5mb3JFYWNoKChkLGYpPT57ZC5mb3JFYWNoKGc9PntjW2ZdKz1idChnLmdldFNhbXBsZUNvdW50KCkpfSl9KTtyZXR1cm4gYS5tYXAoKGQsZik9PmQubWFwKGc9PntpZihnIGluc3RhbmNlb2YgYW0pe3ZhciBsPW5ldyBhbTtsLnNldFNhbXBsZUNvdW50KGcuZ2V0U2FtcGxlQ291bnQoKS9jW2ZdKTtsLnNldExvd1ZhbHVlKGcuZ2V0TG93VmFsdWUoKSk7bC5zZXRIaWdoVmFsdWUoZy5nZXRIaWdoVmFsdWUoKSk7cmV0dXJuIGx9bD1uZXcgZG07bC5zZXRTYW1wbGVDb3VudChnLmdldFNhbXBsZUNvdW50KCkvY1tmXSk7bC5zZXRMb3dSYW5rKGcuZ2V0TG93UmFuaygpKTtsLnNldEhpZ2hSYW5rKGcuZ2V0SGlnaFJhbmsoKSk7bC5zZXRMYWJlbChnLmdldExhYmVsKCkpO3JldHVybiBsfSkpfTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9mYWNldHMtb3ZlcnZpZXcvY29tbW9uL292ZXJ2aWV3X2RhdGFfbW9kZWwuanMKY2xhc3MgU3R7Y29uc3RydWN0b3IoYSl7dGhpcy5kYXRhPWE7dGhpcy5jb2xvclNjYWxlPW5ldyBQbG90dGFibGUuU2NhbGVzLkNvbG9yO3RoaXMuY29sb3JTY2FsZS5kb21haW4oYS5nZXREYXRhc2V0c0xpc3QoKS5tYXAoYz0+Yy5nZXROYW1lKCkpKTt0aGlzLmNvbG9yU2NhbGUucmFuZ2UoIiM0Mjg1RjQgI0YwOTMwMCAjMEY5RDU4ICM5QzI3QjAgIzYwN0Q4QiAjMEI4MDQzICM3NTc1NzUiLnNwbGl0KCIgIikpO2lmKCFqdChhKSl0aHJvdyBFcnJvcigiaW5wdXQgcHJvdG8gaGFzIG5vdCBiZWVuIGNsZWFuZWQiKTt0aGlzLmZlYXR1cmVzQnlTcGVjPXRoaXMubWFrZUZlYXR1cmVCeVNwZWNMaXN0KCl9bWFrZUZlYXR1cmVCeVNwZWNMaXN0KCl7Y29uc3QgYT1bXTtmb3IobGV0IGM9MDsxNj5jO2MrKylhW2NdPVtdO3RoaXMuZ2V0VW5pcXVlRmVhdHVyZXMoKS5mb3JFYWNoKGM9Pntjb25zdCBkPXRoaXMuZ2V0RmVhdHVyZVNwZWNGb3JGZWF0dXJlKGMuZ2V0TmFtZSgpKTthW2RdLnB1c2goYy5nZXROYW1lKCkpfSk7CnJldHVybiBhfWdldE5vbkVtcHR5RmVhdHVyZVNwZWNMaXN0cygpe2NvbnN0IGE9W107Zm9yKGxldCBjPTA7MTY+YztjKyspaWYoMCE9PXRoaXMuZmVhdHVyZXNCeVNwZWNbY10ubGVuZ3RoKXtjb25zdCBkPW5ldyB1dDtkLmZlYXR1cmVzPXRoaXMuZmVhdHVyZXNCeVNwZWNbY107ZC5zcGVjPWM7YS5wdXNoKGQpfXJldHVybiBhfWdldEZlYXR1cmVTcGVjRm9yRmVhdHVyZShhKXtjb25zdCBjPXRoaXMuZ2V0RGF0YXNldE5hbWVzKCk7bGV0IGQ9MTU7Zm9yKGxldCBnPTA7ZzxjLmxlbmd0aDtnKyspe3ZhciBmPXRoaXMuZ2V0RmVhdHVyZShhLGNbZ10pO2Y9bnVsbD09Zj8xNTp0dChmLmdldFR5cGUoKSx0aGlzLmdldEZlYXR1cmVDb21tb25TdGF0cyhhLGNbZ10pKTtkPXN0KGQsZil9MTY9PT1kJiYoZD0xNSk7cmV0dXJuIGR9Z2V0RGF0YXNldEZlYXR1cmVTdGF0aXN0aWNzKCl7cmV0dXJuIHRoaXMuZGF0YX1nZXRDb2xvclNjYWxlKCl7cmV0dXJuIHRoaXMuY29sb3JTY2FsZX1nZXREYXRhc2V0TmFtZXMoKXtyZXR1cm4gdGhpcy5kYXRhPwp0aGlzLmRhdGEuZ2V0RGF0YXNldHNMaXN0KCkubWFwKGE9PmEuZ2V0TmFtZSgpKTpbXX1nZXREYXRhc2V0KGEpe2lmKCF0aGlzLmRhdGEpcmV0dXJuIG51bGw7Zm9yKGNvbnN0IGMgb2YgdGhpcy5kYXRhLmdldERhdGFzZXRzTGlzdCgpKWlmKGMuZ2V0TmFtZSgpPT09YSlyZXR1cm4gYztyZXR1cm4gbnVsbH1nZXRGZWF0dXJlKGEsYyl7aWYoIWF8fCF0aGlzLmRhdGEpcmV0dXJuIG51bGw7Yz10aGlzLmdldERhdGFzZXQoYyk7aWYoIWMpcmV0dXJuIG51bGw7Zm9yKGNvbnN0IGQgb2YgYy5nZXRGZWF0dXJlc0xpc3QoKSlpZihkLmdldE5hbWUoKT09PWEpcmV0dXJuIGQ7cmV0dXJuIG51bGx9Z2V0RXh0cmFIaXN0b2dyYW1OYW1lcyhhKXtpZighdGhpcy5kYXRhKXJldHVybltdO2E9YS5tYXAoZD0+ZC5nZXROYW1lKCkpO2NvbnN0IGM9e307Zm9yKGNvbnN0IGQgb2YgdGhpcy5kYXRhLmdldERhdGFzZXRzTGlzdCgpKWZvcihjb25zdCBmIG9mIGQuZ2V0RmVhdHVyZXNMaXN0KCkpaWYoLTEhPT0KYS5pbmRleE9mKGYuZ2V0TmFtZSgpKSYmKGYuZ2V0Q3VzdG9tU3RhdHNMaXN0KCkmJmYuZ2V0Q3VzdG9tU3RhdHNMaXN0KCkuZm9yRWFjaChnPT57aWYoZy5nZXRIaXN0b2dyYW0oKXx8Zy5nZXRSYW5rSGlzdG9ncmFtKCkpY1tnLmdldE5hbWUoKV09ITB9KSxmLmdldE51bVN0YXRzKCkpKXtjb25zdCBnPWYuZ2V0TnVtU3RhdHMoKS5nZXRIaXN0b2dyYW1zTGlzdCgpO2lmKGcpZm9yKGxldCBsPTA7bDxnLmxlbmd0aDtsKyspe2NvbnN0IGs9Z1tsXTtrLmdldE5hbWUoKSYmKGNbay5nZXROYW1lKCldPSEwKX19cmV0dXJuIE9iamVjdC5rZXlzKGMpfWdldEZlYXR1cmVDb21tb25TdGF0cyhhLGMpe2E9dGhpcy5nZXRGZWF0dXJlKGEsYyk7cmV0dXJuIG51bGw9PWE/bnVsbDpkdChhKX1nZXRGZWF0dXJlTmFtZXMoYSl7cmV0dXJuIGEmJnRoaXMuZGF0YT8oYT10aGlzLmdldERhdGFzZXQoYSkpP2EuZ2V0RmVhdHVyZXNMaXN0KCkubWFwKGM9PmMuZ2V0TmFtZSgpKTpbXTpudWxsfWdldEZlYXR1cmVJbmRleChhLApjKXtpZighdGhpcy5kYXRhKXJldHVybiBudWxsO2E9dGhpcy5nZXREYXRhc2V0KGEpO2lmKCFhKXJldHVybiBudWxsO2xldCBkPTA7Zm9yKGNvbnN0IGYgb2YgYS5nZXRGZWF0dXJlc0xpc3QoKSl7aWYoZi5nZXROYW1lKCk9PT1jKXJldHVybiBkOysrZH1yZXR1cm4gbnVsbH1nZXRVbmlxdWVGZWF0dXJlcygpe2lmKCF0aGlzLmRhdGEpcmV0dXJuW107Y29uc3QgYT17fTtmb3IoY29uc3QgYyBvZiB0aGlzLmRhdGEuZ2V0RGF0YXNldHNMaXN0KCkpZm9yKGNvbnN0IGQgb2YgYy5nZXRGZWF0dXJlc0xpc3QoKSlhW2QuZ2V0TmFtZSgpXT1kO3JldHVybiBPYmplY3Qua2V5cyhhKS5tYXAoYz0+YVtjXSl9Z2V0TnVtVW5pcXVlRmVhdHVyZXNCeVR5cGUoYSl7cmV0dXJuIHRoaXMuZ2V0VW5pcXVlRmVhdHVyZXMoKS5maWx0ZXIoYz0+aHQoYyk9PT1hKS5sZW5ndGh9ZmVhdHVyZUhhc1NpbmdsZVZhbHVlKGEpe2lmKCFhKXJldHVybiExO2lmKGEuZ2V0U3RyaW5nU3RhdHMoKSl7dmFyIGM9YS5nZXRTdHJpbmdTdGF0cygpLmdldFVuaXF1ZSgpOwpyZXR1cm4gMT09PWJ0KGMpfXJldHVybiBhLmdldEJ5dGVzU3RhdHMoKT8oYz1hLmdldEJ5dGVzU3RhdHMoKS5nZXRVbmlxdWUoKSwxPT09YnQoYykpOmEuZ2V0TnVtU3RhdHMoKT8oYz1hLmdldE51bVN0YXRzKCkuZ2V0TWluKCksYT1hLmdldE51bVN0YXRzKCkuZ2V0TWF4KCksbnVsbD09YyYmbnVsbD09YT8hMTpidChjKT09PWJ0KGEpKTohMX1mZWF0dXJlQWNyb3NzQWxsRGF0YXNldHNIYXNTaW5nbGVWYWx1ZShhKXtpZighYXx8IXRoaXMuZGF0YSlyZXR1cm4hMTtmb3IoY29uc3QgYyBvZiB0aGlzLmRhdGEuZ2V0RGF0YXNldHNMaXN0KCkpZm9yKGNvbnN0IGQgb2YgYy5nZXRGZWF0dXJlc0xpc3QoKSlpZihhPT09ZC5nZXROYW1lKCkmJiF0aGlzLmZlYXR1cmVIYXNTaW5nbGVWYWx1ZShkKSlyZXR1cm4hMTtyZXR1cm4hMH1nZXRGZWF0dXJlU2luZ2xlVmFsdWUoYSl7aWYobnVsbD09YSlyZXR1cm4iXHgzY251bGxceDNlIjtpZihhLmdldFN0cmluZ1N0YXRzKCkpcmV0dXJuIGE9YS5nZXRTdHJpbmdTdGF0cygpLmdldFRvcFZhbHVlc0xpc3QoKSwKbnVsbD09YXx8MD09PWEubGVuZ3RoPyJceDNjbnVsbFx4M2UiOmFbMF0uZ2V0VmFsdWUoKTtpZihhLmdldEJ5dGVzU3RhdHMoKSlyZXR1cm4gMD09PWEuZ2V0Qnl0ZXNTdGF0cygpLmdldFVuaXF1ZSgpPyJceDNjbnVsbFx4M2UiOiJceDNjYmluYXJ5IGRhdGFceDNlIjtpZihhLmdldE51bVN0YXRzKCkpe2NvbnN0IGM9YS5nZXROdW1TdGF0cygpLmdldE1pbigpO2lmKGMpcmV0dXJuIGJ0KGMpLnRvU3RyaW5nKCk7aWYoYT1hLmdldE51bVN0YXRzKCkuZ2V0TWF4KCkpcmV0dXJuIGJ0KGEpLnRvU3RyaW5nKCl9cmV0dXJuIlx4M2N1bmtub3duIHR5cGVceDNlIn1nZXREYXRhc2V0SGlzdG9ncmFtc0ZvckZlYXR1cmUoYSl7Y29uc3QgYz1bXTtpZih0aGlzLmRhdGEpZm9yKGNvbnN0IGwgb2YgdGhpcy5kYXRhLmdldERhdGFzZXRzTGlzdCgpKXtjb25zdCBrPWwuZ2V0TmFtZSgpO2xldCBuPW51bGwscD1udWxsLHE9bnVsbCxyPW51bGwsdD1udWxsLHY9bnVsbDtjb25zdCB5PXt9O2Zvcihjb25zdCB6IG9mIGwuZ2V0RmVhdHVyZXNMaXN0KCkpaWYoei5nZXROYW1lKCk9PT0KYSl7dmFyIGQ9dGhpcy5nZXRGZWF0dXJlQ29tbW9uU3RhdHMoYSxrKTtkJiYodD1kLmdldE51bVZhbHVlc0hpc3RvZ3JhbSgpLHY9ZC5nZXRGZWF0dXJlTGlzdExlbmd0aEhpc3RvZ3JhbSgpKTt6LmdldEN1c3RvbVN0YXRzTGlzdCgpJiZ6LmdldEN1c3RvbVN0YXRzTGlzdCgpLmZvckVhY2goeD0+e3guZ2V0SGlzdG9ncmFtKCk/eVt4LmdldE5hbWUoKV09eC5nZXRIaXN0b2dyYW0oKTp4LmdldFJhbmtIaXN0b2dyYW0oKSYmKHlbeC5nZXROYW1lKCldPXguZ2V0UmFua0hpc3RvZ3JhbSgpKX0pO2lmKHouZ2V0TnVtU3RhdHMoKSl7aWYoZD16LmdldE51bVN0YXRzKCkuZ2V0SGlzdG9ncmFtc0xpc3QoKSlmb3IodmFyIGY9MDtmPGQubGVuZ3RoO2YrKyl7dmFyIGc9ZFtmXTtnLmdldE5hbWUoKT95W2cuZ2V0TmFtZSgpXT1nOjA9PT1nLmdldFR5cGUoKT9uPWc6cT1nfWlmKHouZ2V0TnVtU3RhdHMoKS5nZXRXZWlnaHRlZE51bWVyaWNTdGF0cygpJiYoZD16LmdldE51bVN0YXRzKCkuZ2V0V2VpZ2h0ZWROdW1lcmljU3RhdHMoKS5nZXRIaXN0b2dyYW1zTGlzdCgpKSlmb3IoZj0KMDtmPGQubGVuZ3RoO2YrKylnPWRbZl0sMD09PWcuZ2V0VHlwZSgpP3A9ZzpyPWd9ZWxzZSB6LmdldFN0cmluZ1N0YXRzKCkmJihuPXouZ2V0U3RyaW5nU3RhdHMoKS5nZXRSYW5rSGlzdG9ncmFtKCksei5nZXRTdHJpbmdTdGF0cygpLmdldFdlaWdodGVkU3RyaW5nU3RhdHMoKSYmKHA9ei5nZXRTdHJpbmdTdGF0cygpLmdldFdlaWdodGVkU3RyaW5nU3RhdHMoKS5nZXRSYW5rSGlzdG9ncmFtKCkpKTticmVha31jLnB1c2gobmV3IEdxKGssbixwLHEscix0LHYseSkpfXJldHVybiBjfWRvZXNDb250YWluV2VpZ2h0ZWRTdGF0cygpe251bGw9PXRoaXMuY29udGFpbnNXZWlnaHRlZFN0YXRzJiYodGhpcy5jb250YWluc1dlaWdodGVkU3RhdHM9a3QodGhpcy5kYXRhKSk7cmV0dXJuIHRoaXMuY29udGFpbnNXZWlnaHRlZFN0YXRzfWRvZXNDb250YWluQ3VzdG9tU3RhdHMoKXtudWxsPT10aGlzLmNvbnRhaW5zQ3VzdG9tU3RhdHMmJih0aGlzLmNvbnRhaW5zQ3VzdG9tU3RhdHM9bHQodGhpcy5kYXRhKSk7CnJldHVybiB0aGlzLmNvbnRhaW5zQ3VzdG9tU3RhdHN9ZG9lc0NvbnRhaW5GZWF0dXJlTGlzdExlbmd0aERhdGEoKXtudWxsPT10aGlzLmNvbnRhaW5zRmVhdHVyZUxpc3RMZW5ndGhEYXRhJiYodGhpcy5jb250YWluc0ZlYXR1cmVMaXN0TGVuZ3RoRGF0YT1tdCh0aGlzLmRhdGEpKTtyZXR1cm4gdGhpcy5jb250YWluc0ZlYXR1cmVMaXN0TGVuZ3RoRGF0YX1nZXRDaGFydEFscGhhKCl7cmV0dXJuIDI8PXRoaXMuZ2V0RGF0YXNldE5hbWVzKCkubGVuZ3RoPy40OjF9Z2V0Q2hhcnRDb2xvclN0cmluZyhhKXthPXRoaXMuZ2V0Q29sb3JTY2FsZSgpLnNjYWxlKHRoaXMuZ2V0RGF0YXNldE5hbWVzKClbYV0pO2NvbnN0IGM9dGhpcy5nZXRDaGFydEFscGhhKCk7cmV0dXJuIGEucmVwbGFjZSgicmdiIiwicmdiYSIpLnJlcGxhY2UoIikiLCIsICIrYysiKSIpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLW92ZXJ2aWV3L2NvbW1vbi9wbG90dGFibGVfaGVscGVycy5qcwooZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhwKXtjb25zdCBxPVtdO2Zvcig7cCYmcCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50OylpZihxLnB1c2gocCkscC5hc3NpZ25lZFNsb3QpcD1wLmFzc2lnbmVkU2xvdDtlbHNlIGlmKHAucGFyZW50RWxlbWVudClwPXAucGFyZW50RWxlbWVudDtlbHNle2NvbnN0IHI9cC5wYXJlbnROb2RlO3A9ciBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQ/ci5ob3N0OnIhPT1wP3I6bnVsbH1yZXR1cm4gcX1mdW5jdGlvbiBkKHApe3ZhciBxPWMocCk7cD1mO2xldCByPW51bGw7Zm9yKGNvbnN0IHYgb2YgcSl7cT1QbG90dGFibGUuVXRpbHMuRE9NLmdldEVsZW1lbnRUcmFuc2Zvcm0odik7aWYobnVsbCE9cSl7dmFyIHQ9di5jbGllbnRXaWR0aC8yO2NvbnN0IHk9di5jbGllbnRIZWlnaHQvMjtwPVBsb3R0YWJsZS5VdGlscy5NYXRoLm11bHRpcGx5VHJhbnNsYXRlKHAsW3QseV0pO3A9UGxvdHRhYmxlLlV0aWxzLk1hdGgubXVsdGlwbHlNYXRyaXgocCxQbG90dGFibGUuVXRpbHMuTWF0aC5pbnZlcnRNYXRyaXgocSkpOwpwPVBsb3R0YWJsZS5VdGlscy5NYXRoLm11bHRpcGx5VHJhbnNsYXRlKHAsWy10LC15XSl9cT12LnNjcm9sbExlZnQ7dD12LnNjcm9sbFRvcDtpZihudWxsPT09cnx8dj09PXIpcS09di5vZmZzZXRMZWZ0K3YuY2xpZW50TGVmdCx0LT12Lm9mZnNldFRvcCt2LmNsaWVudFRvcCxyPXYub2Zmc2V0UGFyZW50O3A9UGxvdHRhYmxlLlV0aWxzLk1hdGgubXVsdGlwbHlUcmFuc2xhdGUocCxbcSx0XSl9cmV0dXJuIHB9Y29uc3QgZj1bMSwwLDAsMSwwLDBdO2NsYXNzIGcgZXh0ZW5kcyBQbG90dGFibGUuVXRpbHMuVHJhbnNsYXRvcntjb21wdXRlUG9zaXRpb24ocCxxKXtwPXt4OnAseTpxfTtxPWQodGhpcy5fcm9vdEVsZW1lbnQpO3JldHVybiBudWxsPT1xP3A6UGxvdHRhYmxlLlV0aWxzLk1hdGguYXBwbHlUcmFuc2Zvcm0ocSxwKX19Y2xhc3MgbCBleHRlbmRzIFBsb3R0YWJsZS5EaXNwYXRjaGVycy5Nb3VzZXtjb25zdHJ1Y3RvcihwKXtzdXBlcihwKTt0aGlzLl9ldmVudFRhcmdldD1wLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKTsKdGhpcy5fdHJhbnNsYXRvcj1uZXcgZyhwLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKSl9c3RhdGljIGdldERpc3BhdGNoZXIocCl7Y29uc3QgcT1wLnJvb3QoKS5yb290RWxlbWVudCgpO2xldCByPXFbbC5fRElTUEFUQ0hFUl9LRVldO3J8fChyPW5ldyBsKHApLHFbbC5fRElTUEFUQ0hFUl9LRVldPXIpO3JldHVybiByfX1jbGFzcyBrIGV4dGVuZHMgUGxvdHRhYmxlLkRpc3BhdGNoZXJzLlRvdWNoe2NvbnN0cnVjdG9yKHApe3N1cGVyKHApO3RoaXMuX2V2ZW50VGFyZ2V0PXAucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpO3RoaXMuX3RyYW5zbGF0b3I9bmV3IGcocC5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCkpfXN0YXRpYyBnZXREaXNwYXRjaGVyKHApe2NvbnN0IHE9cC5yb290KCkucm9vdEVsZW1lbnQoKTtsZXQgcj1xW2suX0RJU1BBVENIRVJfS0VZXTtyfHwocj1uZXcgayhwKSxxW2suX0RJU1BBVENIRVJfS0VZXT1yKTtyZXR1cm4gcn19Y2xhc3MgbiBleHRlbmRzIFBsb3R0YWJsZS5JbnRlcmFjdGlvbnMuUG9pbnRlcntfYW5jaG9yKCl7dGhpcy5faXNBbmNob3JlZD0KITA7dGhpcy5fbW91c2VEaXNwYXRjaGVyPWwuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj1rLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spfX1hLlBvaW50ZXJJbnRlcmFjdGlvbj1ufSkod2luZG93LnBsb3R0YWJsZV9oZWxwZXJzfHwod2luZG93LnBsb3R0YWJsZV9oZWxwZXJzPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLW92ZXJ2aWV3L2NvbXBvbmVudHMvZmFjZXRzLW92ZXJ2aWV3LXJvdy1zdGF0cy9mYWNldHMtb3ZlcnZpZXctcm93LXN0YXRzLmpzClBvbHltZXIoe2lzOiJmYWNldHMtb3ZlcnZpZXctcm93LXN0YXRzIixwcm9wZXJ0aWVzOntzdGF0czpPYmplY3Qsc2hvd1dlaWdodGVkOkJvb2xlYW4saGFzQ3VzdG9tOkJvb2xlYW4sZGF0YU1vZGVsOk9iamVjdCxkYXRhc2V0SW5kZXg6TnVtYmVyLGNvbXBhcmVNb2RlOkJvb2xlYW4sX2VudHJpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9nZXRFbnRyaWVzKHN0YXRzLCBzaG93V2VpZ2h0ZWQsIGhhc0N1c3RvbSkifX0sb2JzZXJ2ZXJzOlsiX2NvbG9yTGVnZW5kQm94KGRhdGFNb2RlbCwgZGF0YXNldEluZGV4LCBjb21wYXJlTW9kZSkiXSxfZ2V0RW50cmllczpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIFF0KGEsYyxkKX0sX2NvbG9yTGVnZW5kQm94OmZ1bmN0aW9uKGEsYyxkKXtjb25zdCBmPWQzLnNlbGVjdCh0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiI2xlZ2VuZC1ib3giKSk7Mj5hLmdldERhdGFzZXROYW1lcygpLmxlbmd0aCYmIWQ/Zi5zdHlsZSgidmlzaWJpbGl0eSIsCiJoaWRkZW4iKTooZi5zdHlsZSgidmlzaWJpbGl0eSIsbnVsbCksZi5zdHlsZSgiYmFja2dyb3VuZC1jb2xvciIsYS5nZXRDaGFydENvbG9yU3RyaW5nKGMpKSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLW92ZXJ2aWV3L2NvbXBvbmVudHMvZmFjZXRzLW92ZXJ2aWV3LXJvdy1sZWdlbmQvZmFjZXRzLW92ZXJ2aWV3LXJvdy1sZWdlbmQuanMKUG9seW1lcih7aXM6ImZhY2V0cy1vdmVydmlldy1yb3ctbGVnZW5kIixwcm9wZXJ0aWVzOntudW1lcmljOkJvb2xlYW4sc2hvd1dlaWdodGVkOkJvb2xlYW4saGFzQ3VzdG9tOkJvb2xlYW4sZGF0YU1vZGVsOk9iamVjdCxfZW50cmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEVudHJpZXMobnVtZXJpYywgc2hvd1dlaWdodGVkLCBoYXNDdXN0b20pIn19LF9nZXRFbnRyaWVzOmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gSnQoYSxjLGQpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2ZhY2V0cy1vdmVydmlldy9jb21wb25lbnRzL2ZhY2V0cy1vdmVydmlldy1jaGFydC9mYWNldHMtb3ZlcnZpZXctY2hhcnQuanMKUG9seW1lcih7aXM6ImZhY2V0cy1vdmVydmlldy1jaGFydCIscHJvcGVydGllczp7ZGF0YTp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il91cGRhdGVEYXRhIn0sZGF0YU1vZGVsOk9iamVjdCxmZWF0dXJlOlN0cmluZyxfbWF4QnVja2V0c0ZvckJhckNoYXJ0Ont0eXBlOk51bWJlcix2YWx1ZToxMCxyZWFkT25seTohMH0sX2NoYXJ0QWxwaGE6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LGxvZ1NjYWxlOkJvb2xlYW4sc2hvd1dlaWdodGVkOkJvb2xlYW4sc2hvd1BlcmNlbnRhZ2U6Qm9vbGVhbixjaGFydFNlbGVjdGlvbjp7dHlwZTpOdW1iZXIsb2JzZXJ2ZXI6Il91cGRhdGVDaGFydFNlbGVjdGlvbiJ9LHNlbGVjdGlvbjp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il91cGRhdGVTZWxlY3Rpb25WaXNpYmlsaXR5Iixub3RpZnk6ITB9LGV4cGFuZENoYXJ0OkJvb2xlYW4sX3NlbGVjdGlvbkVsZW06T2JqZWN0LF9taW5CYXJIZWlnaHRSYXRpbzp7dHlwZTpOdW1iZXIsdmFsdWU6LjAxLHJlYWRPbmx5OiEwfSwKX29uQ2xpY2s6T2JqZWN0LF9vbkNsaWNrRnVuY3Rpb246T2JqZWN0LF9vblBvaW50ZXI6T2JqZWN0LF9vblBvaW50ZXJFbnRlckZ1bmN0aW9uOk9iamVjdCxfb25Qb2ludGVyRXhpdEZ1bmN0aW9uOk9iamVjdCxfdGFibGVEYXRhOkFycmF5LF9zaG93VGFibGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NoYXJ0VHlwZTpPYmplY3QsX2NoYXJ0Q2xhc3M6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0Q2hhcnRDbGFzcyhfc2hvd1RhYmxlKSJ9LF9jaGFydFN2Z0NsYXNzOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2dldENoYXJ0U3ZnQ2xhc3MoZXhwYW5kQ2hhcnQpIn0sX3hBeGlzU3ZnQ2xhc3M6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0WEF4aXNTdmdDbGFzcyhleHBhbmRDaGFydCkifSxfdGFibGVEYXRhQ2xhc3M6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0VGFibGVEYXRhQ2xhc3MoZXhwYW5kQ2hhcnQpIn19LG9ic2VydmVyczpbIl9yZW5kZXIoZGF0YSwgbG9nU2NhbGUsIHNob3dXZWlnaHRlZCwgY2hhcnRTZWxlY3Rpb24sIF9zaG93VGFibGUsIGV4cGFuZENoYXJ0LCBzaG93UGVyY2VudGFnZSwgZGF0YU1vZGVsKSJdLApfdXBkYXRlRGF0YSgpe3RoaXMuX3Nob3dUYWJsZT0hMX0sX3VwZGF0ZUNoYXJ0U2VsZWN0aW9uKCl7dGhpcy5fc2hvd1RhYmxlPSExfSxfaGFzV2VpZ2h0ZWRIaXN0b2dyYW0oYSl7cmV0dXJuIG50KGEpfSxfaGFzUXVhbnRpbGVzKGEpe3JldHVybiBvdChhKX0sX2lzU3RyaW5nQ2hhcnQoYSxjKXtyZXR1cm4oYT09PXp0LkNVTURJU1RfQ0hBUlR8fGE9PT16dC5CQVJfQ0hBUlQpJiYiVmFsdWUgbGlzdCBsZW5ndGgiIT09YyYmIkZlYXR1cmUgbGlzdCBsZW5ndGgiIT09Y30sX2Rpc2FibGVMb2dDaGVja2JveChhLGMpe3JldHVybiBhfHwiU3RhbmRhcmQiIT09Y30sX3JlbmRlcihhLGMsZCxmLGcsbCxrLG4pe3RoaXMuX29uUG9pbnRlciYmKHRoaXMuX29uUG9pbnRlci5vZmZQb2ludGVyTW92ZSh0aGlzLl9vblBvaW50ZXJFbnRlckZ1bmN0aW9uKSx0aGlzLl9vblBvaW50ZXIub2ZmUG9pbnRlck1vdmUodGhpcy5fb25Qb2ludGVyRXhpdEZ1bmN0aW9uKSk7dGhpcy5fb25DbGljayYmdGhpcy5fb25DbGljay5vZmZDbGljayh0aGlzLl9vbkNsaWNrRnVuY3Rpb24pOwphJiYodGhpcy5fY2hhcnRBbHBoYT1uLmdldENoYXJ0QWxwaGEoKSxnPWEubWFwKHA9PnRoaXMuX2dldEJ1Y2tldHMocCxkLGYpKSx0aGlzLl9jaGFydFR5cGU9QnQoYSxmLHRoaXMuX21heEJ1Y2tldHNGb3JCYXJDaGFydCksYT1hLm1hcChwPT5wLm5hbWUpLCJWYWx1ZSBsaXN0IGxlbmd0aCI9PT1mfHwiRmVhdHVyZSBsaXN0IGxlbmd0aCI9PT1mfHwiUXVhbnRpbGVzIj09PWY/dGhpcy5fcmVuZGVyUXVhbnRpbGVDaGFydChnLGEsYyk6dGhpcy5fY2hhcnRUeXBlPT09enQuSElTVE9HUkFNP3RoaXMuX3JlbmRlckhpc3RvZ3JhbUNoYXJ0KGcsYSxjLGspOnRoaXMuX2NoYXJ0VHlwZT09PXp0LkNVTURJU1RfQ0hBUlQ/dGhpcy5fcmVuZGVyQ2RmQ2hhcnQoZyxhLGMpOnRoaXMuX3JlbmRlckJhckNoYXJ0KGcsYSxjLGspKX0sX3JlbmRlckhpc3RvZ3JhbUNoYXJ0KGEsYyxkLGYpe2NvbnN0IGc9W10sbD1uZXcgUGxvdHRhYmxlLlBsb3RzLlJlY3RhbmdsZTtsZXQgaz1JbmZpbml0eSxuPS1JbmZpbml0eSwKcD0wO2YmJihhPVJ0KGEpKTthLmZvckVhY2goKHYseSk9Pnt2LmZvckVhY2goej0+e2NvbnN0IHg9YnQoei5nZXRMb3dWYWx1ZSgpKSxDPWJ0KHouZ2V0SGlnaFZhbHVlKCkpO3o9YnQoei5nZXRTYW1wbGVDb3VudCgpKTt4PGsmJihrPXgpO0M+biYmKG49Qyk7ej5wJiYocD16KTtpc0Zpbml0ZSh4KSYmaXNGaW5pdGUoQykmJmcucHVzaChDLXgpfSk7bC5hZGREYXRhc2V0KG5ldyBQbG90dGFibGUuRGF0YXNldCh2LHtuYW1lOmNbeV19KSl9KTtsZXQgcT0wPGcubGVuZ3RoP2cucmVkdWNlKGZ1bmN0aW9uKHYseSl7cmV0dXJuIHYreX0pL2cubGVuZ3RoOjA7MD09PXEmJihxPTEpO2Y9W107aXNGaW5pdGUoaykmJihmLnB1c2goayksaXNGaW5pdGUobikmJmYucHVzaChuKSk7YT1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXI7MDxmLmxlbmd0aCYmYS5kb21haW4oZik7Zj10aGlzLl9nZXRTY2FsZShkKS5kb21haW4oWzBdKTtjb25zdCByPW5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKGEsCiJib3R0b20iKSx0PW5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKGYsImxlZnQiKTt0LmZvcm1hdHRlcih0aGlzLl9jaGFydEF4aXNTY2FsZUZvcm1hdHRlcigpKTtyLmZvcm1hdHRlcih0aGlzLl9jaGFydEF4aXNTY2FsZUZvcm1hdHRlcigpKTtsLngodj0+e2xldCB5PWJ0KHYuZ2V0TG93VmFsdWUoKSk7aWYoLUluZmluaXR5PT09eXx8eT09PXYuZ2V0SGlnaFZhbHVlKCkpdj1idCh2LmdldEhpZ2hWYWx1ZSgpKSxpc0Zpbml0ZSh2KT95PXYtcTooeT0wLC1JbmZpbml0eT09PXYmJih5LT1xKSk7cmV0dXJuIHl9LGEpLngyKHY9PntsZXQgeT1idCh2LmdldEhpZ2hWYWx1ZSgpKTtpZihJbmZpbml0eT09PXl8fHk9PT12LmdldExvd1ZhbHVlKCkpdj1idCh2LmdldExvd1ZhbHVlKCkpLGlzRmluaXRlKHYpP3k9ditxOih5PTAsSW5maW5pdHk9PT12JiYoeSs9cSkpO3JldHVybiB5fSkueSgoKT0+MCxmKS55Mih2PT50aGlzLl9nZXRDb3VudFdpdGhGbG9vcih2LHAsZCkpO2wuYXR0cigiZmlsbCIsCih2LHkseik9PnoubWV0YWRhdGEoKS5uYW1lLHRoaXMuZGF0YU1vZGVsLmdldENvbG9yU2NhbGUoKSkuYXR0cigib3BhY2l0eSIsdGhpcy5fY2hhcnRBbHBoYSk7dGhpcy5fcmVuZGVyQ2hhcnQobCxyLHQsbnVsbCxudWxsLHY9PmwuZW50aXRpZXNBdCh2KSx2PT5XcyhidCh2LmdldExvd1ZhbHVlKCkpLDIpLnRvTG9jYWxlU3RyaW5nKCkrIi0iK1dzKGJ0KHYuZ2V0SGlnaFZhbHVlKCkpLDIpLnRvTG9jYWxlU3RyaW5nKCkrIjogIitidCh2LmdldFNhbXBsZUNvdW50KCkpLnRvTG9jYWxlU3RyaW5nKCksdj0+bmV3IElxKHRoaXMuZmVhdHVyZSx2b2lkIDAsYnQodi5nZXRMb3dWYWx1ZSgpKSxidCh2LmdldEhpZ2hWYWx1ZSgpKSksdj0+di5hcHBlbmQoInJlY3QiKS5hdHRyKCJzdHJva2UiLCJibGFjayIpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigic3Ryb2tlLXdpZHRoIiwiMXB4IiksKHYseSk9PnYuYXR0cigieCIseS5wb3NpdGlvbi54LXkuc2VsZWN0aW9uLl9ncm91cHNbMF1bMF0ud2lkdGguYmFzZVZhbC52YWx1ZS8KMikuYXR0cigieSIseS5wb3NpdGlvbi55LXkuc2VsZWN0aW9uLl9ncm91cHNbMF1bMF0uaGVpZ2h0LmJhc2VWYWwudmFsdWUvMikuYXR0cigid2lkdGgiLHkuc2VsZWN0aW9uLl9ncm91cHNbMF1bMF0ud2lkdGguYmFzZVZhbC52YWx1ZSkuYXR0cigiaGVpZ2h0Iix5LnNlbGVjdGlvbi5fZ3JvdXBzWzBdWzBdLmhlaWdodC5iYXNlVmFsLnZhbHVlKSl9LF9yZW5kZXJRdWFudGlsZUNoYXJ0KGEsYyxkKXtjb25zdCBmPW5ldyBQbG90dGFibGUuUGxvdHMuTGluZSxnPW5ldyBQbG90dGFibGUuUGxvdHMuU2NhdHRlcjtsZXQgbD1JbmZpbml0eSxrPS1JbmZpbml0eTthLmZvckVhY2goKHEscik9Pntjb25zdCB0PVtdLHY9cS5sZW5ndGg7cS5mb3JFYWNoKCh5LHopPT57dmFyIHg9YnQoeS5nZXRMb3dWYWx1ZSgpKTtjb25zdCBDPWJ0KHkuZ2V0SGlnaFZhbHVlKCkpO3g8bCYmKGw9eCk7Qz5rJiYoaz1DKTt4PW5ldyBGcTt4LmJ1Y2tldD15O3guZGF0YXNldEluZGV4PXI7eC5xdWFudGlsZT0xMDAqCnovdjt0LnB1c2goeCl9KTtpZigwPHEubGVuZ3RoKXtjb25zdCB5PW5ldyBhbTt5LnNldExvd1ZhbHVlKHFbcS5sZW5ndGgtMV0uZ2V0SGlnaFZhbHVlKCkpO3kuc2V0SGlnaFZhbHVlKHFbcS5sZW5ndGgtMV0uZ2V0SGlnaFZhbHVlKCkpO3kuc2V0U2FtcGxlQ291bnQocVtxLmxlbmd0aC0xXS5nZXRTYW1wbGVDb3VudCgpKTtxPW5ldyBGcTtxLmJ1Y2tldD15O3EuZGF0YXNldEluZGV4PXI7cS5xdWFudGlsZT0xMDA7dC5wdXNoKHEpfWYuYWRkRGF0YXNldChuZXcgUGxvdHRhYmxlLkRhdGFzZXQodCx7bmFtZTpjW3JdfSkpO2cuYWRkRGF0YXNldChuZXcgUGxvdHRhYmxlLkRhdGFzZXQodCx7bmFtZTpjW3JdfSkpfSk7Y29uc3Qgbj1pc0Zpbml0ZShsKSYmaXNGaW5pdGUoayk/az09PWw/MTooay1sKS8xMDowO3ZhciBwPVtdO2lzRmluaXRlKGwpJiYocC5wdXNoKGwtbiksaXNGaW5pdGUoaykmJnAucHVzaChrK24pKTtkPXRoaXMuX2dldFNjYWxlKGQpOzA8cC5sZW5ndGgmJmQuZG9tYWluKHApOwpwPXRoaXMuX2dldFNjYWxlKCExKS5kb21haW4oWy1hLmxlbmd0aCsuNSwxXSk7YT1uZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyhkLCJib3R0b20iKTthLmZvcm1hdHRlcih0aGlzLl9jaGFydEF4aXNTY2FsZUZvcm1hdHRlcigpKTtmLngocT0+YnQocS5idWNrZXQuZ2V0TG93VmFsdWUoKSksZCkueShxPT4tMSpxLmRhdGFzZXRJbmRleCxwKTtnLngocT0+YnQocS5idWNrZXQuZ2V0TG93VmFsdWUoKSksZCkueShxPT4tcS5kYXRhc2V0SW5kZXgscCkuc2l6ZShxPT41MD09PXEucXVhbnRpbGU/MTU6OCkuc3ltYm9sKCgpPT5QbG90dGFibGUuU3ltYm9sRmFjdG9yaWVzLmNyb3NzKCkpO2YuYXR0cigic3Ryb2tlIiwiZ3JheSIpLmF0dHIoIm9wYWNpdHkiLHRoaXMuX2NoYXJ0QWxwaGEpO2cuYXR0cigiZmlsbCIsKHEscix0KT0+dC5tZXRhZGF0YSgpLm5hbWUsdGhpcy5kYXRhTW9kZWwuZ2V0Q29sb3JTY2FsZSgpKS5hdHRyKCJvcGFjaXR5Iix0aGlzLl9jaGFydEFscGhhKTtwPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5Hcm91cChbZiwKZ10pO3RoaXMuX3JlbmRlckNoYXJ0KHAsYSxudWxsLG51bGwsbnVsbCxxPT5nLmVudGl0aWVzQXQocSkscT0+cS5xdWFudGlsZSsiJTogIitXcyhidChxLmJ1Y2tldC5nZXRMb3dWYWx1ZSgpKSwyKS50b0xvY2FsZVN0cmluZygpLHE9Pm5ldyBJcSh0aGlzLmZlYXR1cmUsdm9pZCAwLGJ0KHEuYnVja2V0LmdldExvd1ZhbHVlKCkpLGJ0KHEuYnVja2V0LmdldEhpZ2hWYWx1ZSgpKSkscT0+cS5hcHBlbmQoImNpcmNsZSIpLmF0dHIoInIiLDMpLmF0dHIoInN0cm9rZSIsImJsYWNrIikuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJzdHJva2Utd2lkdGgiLCIxcHgiKSwocSxyKT0+cS5hdHRyKCJjeCIsci5wb3NpdGlvbi54KS5hdHRyKCJjeSIsci5wb3NpdGlvbi55KSl9LF9yZW5kZXJCYXJDaGFydChhLGMsZCxmKXtjb25zdCBnPVpzKGEpLGw9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO3ZhciBrPW5ldyBQbG90dGFibGUuU2NhbGVzLkNhdGVnb3J5O2NvbnN0IG49dGhpcy5fZ2V0U2NhbGUoZCk7CmsuZG9tYWluKGcpO2s9bmV3IFBsb3R0YWJsZS5BeGVzLkNhdGVnb3J5KGssImJvdHRvbSIpO2NvbnN0IHA9bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWMobiwibGVmdCIpO3AuZm9ybWF0dGVyKHRoaXMuX2NoYXJ0QXhpc1NjYWxlRm9ybWF0dGVyKCkpO2YmJihhPVJ0KGEpKTtsZXQgcT0wO2Y9YS5tYXAoKHQsdik9Pnt0LmZvckVhY2goej0+e3o9YnQoei5nZXRTYW1wbGVDb3VudCgpKTt6PnEmJihxPXopfSk7Y29uc3QgeT1uZXcgdnQ7eS5uYW1lPWNbdl07eS5yYXdCdWNrZXRzPXQ7cmV0dXJuIHl9KTt0aGlzLl90YWJsZURhdGE9eXQoZixnKTtjb25zdCByPW5ldyBQbG90dGFibGUuUGxvdHMuQmFyO2EuZm9yRWFjaCgodCx2KT0+ci5hZGREYXRhc2V0KG5ldyBQbG90dGFibGUuRGF0YXNldCh0LHtuYW1lOmNbdl19KSkpO3IueCh0PT5nLmluZGV4T2YoJHModC5nZXRMYWJlbCgpKSksbCkueSh0PT50aGlzLl9nZXRDb3VudFdpdGhGbG9vcih0LHEsZCksbik7ci5hdHRyKCJmaWxsIiwKKHQsdix5KT0+eS5tZXRhZGF0YSgpLm5hbWUsdGhpcy5kYXRhTW9kZWwuZ2V0Q29sb3JTY2FsZSgpKS5hdHRyKCJvcGFjaXR5Iix0aGlzLl9jaGFydEFscGhhKTt0aGlzLl9yZW5kZXJDaGFydChyLGsscCxudWxsLG51bGwsdD0+ci5lbnRpdGllc0F0KHQpLHQ9PiRzKHQuZ2V0TGFiZWwoKSkrIjogIitidCh0LmdldFNhbXBsZUNvdW50KCkpLnRvTG9jYWxlU3RyaW5nKCksdD0+bmV3IElxKHRoaXMuZmVhdHVyZSx0LmdldExhYmVsKCkpLHQ9PnQuYXBwZW5kKCJyZWN0IikuYXR0cigic3Ryb2tlIiwiYmxhY2siKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoInN0cm9rZS13aWR0aCIsIjFweCIpLCh0LHYpPT50LmF0dHIoIngiLHYucG9zaXRpb24ueC12LnNlbGVjdGlvbi5fZ3JvdXBzWzBdWzBdLndpZHRoLmJhc2VWYWwudmFsdWUvMikuYXR0cigieSIsdi5wb3NpdGlvbi55KS5hdHRyKCJ3aWR0aCIsdi5zZWxlY3Rpb24uX2dyb3Vwc1swXVswXS53aWR0aC5iYXNlVmFsLnZhbHVlKS5hdHRyKCJoZWlnaHQiLAp2LnNlbGVjdGlvbi5fZ3JvdXBzWzBdWzBdLmhlaWdodC5iYXNlVmFsLnZhbHVlKSl9LF9yZW5kZXJDZGZDaGFydChhLGMsZCl7Y29uc3QgZj1jLm1hcChyPT57cj10aGlzLmRhdGFNb2RlbC5nZXRGZWF0dXJlQ29tbW9uU3RhdHModGhpcy5mZWF0dXJlLHIpO3JldHVybiBudWxsIT1yP3IuZ2V0TnVtTm9uTWlzc2luZygpKnIuZ2V0QXZnTnVtVmFsdWVzKCk6MH0pLGc9WnMoYSksbD17fTtnLmZvckVhY2goKHIsdCk9PntsW3JdPXR9KTtjb25zdCBrPShuZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXIpLmRvbWFpbihbMF0pO2Q9dGhpcy5fZ2V0U2NhbGUoZCkuZG9tYWluKFswXSk7Y29uc3Qgbj1uZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyhrLCJib3R0b20iKSxwPW5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKGQsImxlZnQiKSxxPW5ldyBQbG90dGFibGUuUGxvdHMuTGluZTthPWEubWFwKChyLHQpPT57Y29uc3Qgdj1bXSx5PVtdLHo9W107bGV0IHg9LTE7ci5mb3JFYWNoKEM9PntDPQpDLmNsb25lTWVzc2FnZSgpO3oucHVzaChDKX0pOzA8dCYmei5zb3J0KChDLEYpPT5sWyRzKEMuZ2V0TGFiZWwoKSldLWxbJHMoRi5nZXRMYWJlbCgpKV0pO3ouZm9yRWFjaCgoQyxGKT0+e2NvbnN0IEQ9bFskcyhDLmdldExhYmVsKCkpXTtmb3IodmFyIEI9eCsxO0I8RDtCKyspe3ZhciBJPW5ldyBkbTtJLnNldExhYmVsKGdbQl0pO0kuc2V0TG93UmFuayhCKTtJLnNldEhpZ2hSYW5rKEIpOzA9PT12Lmxlbmd0aD9JLnNldFNhbXBsZUNvdW50KDApOkkuc2V0U2FtcGxlQ291bnQodlt2Lmxlbmd0aC0xXS5nZXRTYW1wbGVDb3VudCgpKTt2LnB1c2goSSk7ST1uZXcgZG07SS5zZXRMYWJlbChnW0JdKTtJLnNldExvd1JhbmsoQik7SS5zZXRIaWdoUmFuayhCKTtJLnNldFNhbXBsZUNvdW50KDApO3kucHVzaChJKX14PUQ7Qj1DLmNsb25lKCk7eS5wdXNoKEIpOzA9PT1GP0Muc2V0U2FtcGxlQ291bnQoYnQoQy5nZXRTYW1wbGVDb3VudCgpKS9mW3RdKTooRj0wPEQ/RC0xOkYtMSxDLnNldFNhbXBsZUNvdW50KGJ0KEMuZ2V0U2FtcGxlQ291bnQoKSkvCmZbdF0rYnQodltGXS5nZXRTYW1wbGVDb3VudCgpKSkpO0Muc2V0TG93UmFuayhEKTtDLnNldEhpZ2hSYW5rKEQpO3YucHVzaChDKX0pO3I9bmV3IHZ0O3IubmFtZT1jW3RdO3IucGVyY0J1Y2tldHM9djtyLnJhd0J1Y2tldHM9eTtyZXR1cm4gcn0pO3RoaXMuX3RhYmxlRGF0YT14dChhKTtmb3IoY29uc3QgciBvZiBhKXEuYWRkRGF0YXNldChuZXcgUGxvdHRhYmxlLkRhdGFzZXQoci5wZXJjQnVja2V0cyx7bmFtZTpyLm5hbWV9KSk7cS54KHI9PmJ0KHIuZ2V0TG93UmFuaygpKSxrKS55KHI9PmJ0KHIuZ2V0U2FtcGxlQ291bnQoKSksZCk7cS5hdHRyKCJzdHJva2UiLChyLHQsdik9PnYubWV0YWRhdGEoKS5uYW1lLHRoaXMuZGF0YU1vZGVsLmdldENvbG9yU2NhbGUoKSkuYXR0cigib3BhY2l0eSIsdGhpcy5fY2hhcnRBbHBoYSk7dGhpcy5fcmVuZGVyQ2hhcnQocSxuLHAsbnVsbCxudWxsLHI9PnEuZW50aXRpZXNBdChyKSxyPT4kcyhyLmdldExhYmVsKCkpKyI6ICIrV3MoYnQoci5nZXRTYW1wbGVDb3VudCgpKSwKNCkudG9Mb2NhbGVTdHJpbmcoKSxyPT5uZXcgSXEodGhpcy5mZWF0dXJlLHIuZ2V0TGFiZWwoKSkscj0+ci5hcHBlbmQoImNpcmNsZSIpLmF0dHIoInIiLDMpLmF0dHIoInN0cm9rZSIsImJsYWNrIikuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJzdHJva2Utd2lkdGgiLCIxcHgiKSwocix0KT0+ci5hdHRyKCJjeCIsdC5wb3NpdGlvbi54KS5hdHRyKCJjeSIsdC5wb3NpdGlvbi55KSl9LF9yZW5kZXJDaGFydChhLGMsZCxmLGcsbCxrLG4scCxxKXtpZighdGhpcy5fc2hvd1RhYmxlKXt2YXIgcj1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuVGFibGUoW1tnLGQsYV0sW251bGwsbnVsbCxudWxsXV0pLHQ9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLlRhYmxlKFtbbnVsbCxudWxsXSxbbnVsbCxjXV0pO1Bsb3R0YWJsZS5SZW5kZXJDb250cm9sbGVyLnJlbmRlclBvbGljeSgpO3ZhciB2PWQzLnNlbGVjdCh0aGlzLiQuY2hhcnQpLHk9ZDMuc2VsZWN0KHRoaXMuJC54YXhpcyksej1kMy5zZWxlY3QodGhpcy4kLnRvb2x0aXApOwp0aGlzLmFzeW5jKCgpPT57di5zZWxlY3RBbGwoIi5jb21wb25lbnQiKS5yZW1vdmUoKTt5LnNlbGVjdEFsbCgiLmNvbXBvbmVudCIpLnJlbW92ZSgpO3IucmVuZGVyVG8odGhpcy4kLmNoYXJ0KTt0aGlzLl9zZWxlY3Rpb25FbGVtPXAoYS5mb3JlZ3JvdW5kKCkpO3RoaXMuX3VwZGF0ZVNlbGVjdGlvblZpc2liaWxpdHkodGhpcy5zZWxlY3Rpb24pO3Yub24oIm1vdXNlZW50ZXIiLCgpPT57dGhpcy5fb25Qb2ludGVyPW5ldyBwbG90dGFibGVfaGVscGVycy5Qb2ludGVySW50ZXJhY3Rpb247dGhpcy5fb25Qb2ludGVyRW50ZXJGdW5jdGlvbj14PT57eD1sKHgpOzA8eC5sZW5ndGgmJih4PXgubWFwKEM9Pm51bGw9PUMuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWV8fDE9PT10aGlzLmRhdGFNb2RlbC5nZXREYXRhc2V0TmFtZXMoKS5sZW5ndGg/ayhDLmRhdHVtKTpDLmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKyI6ICIrayhDLmRhdHVtKSkuam9pbigiXG4iKSx6LnRleHQoeCksei5zdHlsZSgib3BhY2l0eSIsCiIxIikpfTt0aGlzLl9vblBvaW50ZXIub25Qb2ludGVyTW92ZSh0aGlzLl9vblBvaW50ZXJFbnRlckZ1bmN0aW9uKTt0aGlzLl9vblBvaW50ZXJFeGl0RnVuY3Rpb249ZnVuY3Rpb24oKXt6LnN0eWxlKCJvcGFjaXR5IiwiMCIpfTt0aGlzLl9vblBvaW50ZXIub25Qb2ludGVyRXhpdCh0aGlzLl9vblBvaW50ZXJFeGl0RnVuY3Rpb24pO3RoaXMuX29uUG9pbnRlci5hdHRhY2hUbyhhKTtpZigiVmFsdWUgbGlzdCBsZW5ndGgiIT09dGhpcy5jaGFydFNlbGVjdGlvbil7dGhpcy5fb25DbGljaz1uZXcgUGxvdHRhYmxlLkludGVyYWN0aW9ucy5DbGljaztjb25zdCB4PXRoaXM7dGhpcy5fb25DbGlja0Z1bmN0aW9uPUM9PntDPWwoQyk7MDxDLmxlbmd0aCYmKHEoeC5fc2VsZWN0aW9uRWxlbSxDWzBdKSxDPW4oQ1swXS5kYXR1bSkseC5fc2V0U2VsZWN0aW9uKEMpKX07dGhpcy5fb25DbGljay5vbkNsaWNrKHRoaXMuX29uQ2xpY2tGdW5jdGlvbik7dGhpcy5fb25DbGljay5hdHRhY2hUbyhhKX19KS5vbigibW91c2VsZWF2ZSIsCigpPT57dGhpcy5fb25Qb2ludGVyLmRldGFjaEZyb20oKTt0aGlzLl9vbkNsaWNrLmRldGFjaEZyb20oKX0pO251bGwhPWQmJnQuY29sdW1uUGFkZGluZyhyLmNvbXBvbmVudEF0KDEpLndpZHRoKCkrKHIuY29tcG9uZW50QXQoMCk/ci5jb21wb25lbnRBdCgwKS53aWR0aCgpOjApKTt0LnJlbmRlclRvKHRoaXMuJC54YXhpcyl9KX19LF9zZXRTZWxlY3Rpb24oYSl7YS5lcXVhbHModGhpcy5zZWxlY3Rpb24pJiZhLmNsZWFyKCk7dGhpcy5zZWxlY3Rpb249YTt0aGlzLmZpcmUoImZlYXR1cmUtc2VsZWN0Iix7c2VsZWN0aW9uOmF9KX0sX2dldEJ1Y2tldHMoYSxjLGQpe3JldHVybiBYcyhhLGMsZCl9LF9nZXRTY2FsZShhKXtyZXR1cm4gYT9uZXcgUGxvdHRhYmxlLlNjYWxlcy5Nb2RpZmllZExvZzpuZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXJ9LF9jaGFydEF4aXNTY2FsZUZvcm1hdHRlcigpe2NvbnN0IGE9UGxvdHRhYmxlLkZvcm1hdHRlcnMuc2hvcnRTY2FsZSgpO3JldHVybiBjPT4KMUUzPk1hdGguYWJzKGMpP1N0cmluZyhjKTphKGMpfSxfZ2V0Q291bnRXaXRoRmxvb3IoYSxjLGQpe2E9YnQoYS5nZXRTYW1wbGVDb3VudCgpKTshZCYmMDxhJiZhL2M8dGhpcy5fbWluQmFySGVpZ2h0UmF0aW8mJihhPWMqdGhpcy5fbWluQmFySGVpZ2h0UmF0aW8pO3JldHVybiBhfSxfdXBkYXRlU2VsZWN0aW9uVmlzaWJpbGl0eShhKXt0aGlzLl9zZWxlY3Rpb25FbGVtJiZ0aGlzLl9zZWxlY3Rpb25FbGVtLnN0eWxlKCJkaXNwbGF5IixudWxsPT1hfHxhLm5hbWUhPT10aGlzLmZlYXR1cmU/Im5vbmUiOiJpbmxpbmUiKX0sX3RvZ2dsZVNob3dUYWJsZSgpe3RoaXMuX3Nob3dUYWJsZT0hdGhpcy5fc2hvd1RhYmxlfSxfZ2V0Q2hhcnRDbGFzcyhhKXtyZXR1cm4gYT8iaGlkZWNoYXJ0Ijoic2hvd2NoYXJ0In0sX2dldFNob3dUYWJsZUJ1dHRvblRleHQoYSl7cmV0dXJuIGE/InNob3cgY2hhcnQiOiJzaG93IHJhdyBkYXRhIn0sX2dldENoYXJ0U3ZnQ2xhc3MoYSl7cmV0dXJuIGE/ImNoYXJ0LWJpZyI6CiJjaGFydC1zbWFsbCJ9LF9nZXRYQXhpc1N2Z0NsYXNzKGEpe3JldHVybiBhPyJ4YXhpcy1iaWciOiJ4YXhpcy1zbWFsbCJ9LF9nZXRUYWJsZURhdGFDbGFzcyhhKXtyZXR1cm4gYT8iZGF0YS1saXN0LWJpZyI6ImRhdGEtbGlzdC1zbWFsbCJ9LF9yb3dDbGljayhhKXt0aGlzLl9zZXRTZWxlY3Rpb24obmV3IElxKHRoaXMuZmVhdHVyZSxhLmN1cnJlbnRUYXJnZXQuZGF0YVZhbHVlKSl9LF9nZXRFbnRyeVJvd1ZhbHVlKGEpe3JldHVybiBhLnZhbHVlfSxfZ2V0RW50cnlSb3dDbGFzcyhhLGMpe2xldCBkPSJkaWFsb2ctcm93IjtudWxsIT1jJiZjLm5hbWU9PT10aGlzLmZlYXR1cmUmJmMuc3RyaW5nVmFsdWU9PT1hLnZhbHVlJiYoZCs9IiBzZWxlY3RlZCIpO3JldHVybiBkfSxfZ2V0Q291bnRDZWxsQ2xhc3MoYSl7cmV0dXJuImRhaWxvZy1yb3ctZW50cnkgY291bnQtY2VsbCIrKGE/IiB3ZWlnaHRlZC1jZWxsIjoiIil9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLW92ZXJ2aWV3L2NvbXBvbmVudHMvZmFjZXRzLW92ZXJ2aWV3LXRhYmxlL2ZhY2V0cy1vdmVydmlldy10YWJsZS5qcwpQb2x5bWVyKHtpczoiZmFjZXRzLW92ZXJ2aWV3LXRhYmxlIixwcm9wZXJ0aWVzOntkYXRhTW9kZWw6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfaGFuZGxlUmVzaXplIn0sZmVhdHVyZXM6e3R5cGU6QXJyYXksb2JzZXJ2ZXI6Il9oYW5kbGVSZXNpemUifSxmZWF0dXJlU2xpY2VTZWxlY3Rpb246e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sbnVtZXJpYzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxjb21wYXJlTW9kZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfbG9nU2NhbGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2V4cGFuZENoYXJ0czp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfaGFuZGxlUmVzaXplIn0sX3Nob3dXZWlnaHRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfc2hvd1BlcmNlbnRhZ2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NoYXJ0U2VsZWN0aW9uOnt0eXBlOlN0cmluZyx2YWx1ZToiU3RhbmRhcmQifSxfZW5hYmxlTG9nU2NhbGU6e3R5cGU6Qm9vbGVhbiwKdmFsdWU6ITB9LF9jaGFydFNlbGVjdGlvblR5cGVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZUNoYXJ0U2VsZWN0aW9uVHlwZXMobnVtZXJpYywgZGF0YU1vZGVsLCBmZWF0dXJlcykifSxfbWF4SGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTo4MDAscmVhZE9ubHk6ITB9LF9leHBhbmRlZFJvd0hlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MzMwLHJlYWRPbmx5OiEwfSxfcm93SGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZToxMDAscmVhZE9ubHk6ITB9fSxfaGFuZGxlUmVzaXplKCl7Y29uc3QgYT10aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiaXJvbi1saXN0Iik7YSYmdGhpcy5fZXhwYW5kZWRSb3dIZWlnaHQmJnRoaXMuX3Jvd0hlaWdodCYmdGhpcy5fbWF4SGVpZ2h0JiZ0aGlzLmZlYXR1cmVzJiYoYS5zdHlsZS5oZWlnaHQ9TWF0aC5taW4oKHRoaXMuZmVhdHVyZXM/dGhpcy5mZWF0dXJlcy5sZW5ndGg6MCkqKHRoaXMuX2V4cGFuZENoYXJ0cz90aGlzLl9leHBhbmRlZFJvd0hlaWdodDoKdGhpcy5fcm93SGVpZ2h0KSx0aGlzLl9tYXhIZWlnaHQpKyJweCIsYS5maXJlKCJpcm9uLXJlc2l6ZSIpKX0sX2NvbXB1dGVDaGFydFNlbGVjdGlvblR5cGVzKGEsYyxkKXtjb25zdCBmPVsiU3RhbmRhcmQiXTthJiZmLnB1c2goIlF1YW50aWxlcyIpOzAhPT1kLmxlbmd0aCYmcHQodGhpcy5fZ2V0Q2hhcnREYXRhKGMsZFswXSkpJiZmLnB1c2goIlZhbHVlIGxpc3QgbGVuZ3RoIik7Yy5kb2VzQ29udGFpbkZlYXR1cmVMaXN0TGVuZ3RoRGF0YSgpJiZmLnB1c2goIkZlYXR1cmUgbGlzdCBsZW5ndGgiKTtyZXR1cm4gZi5jb25jYXQoYy5nZXRFeHRyYUhpc3RvZ3JhbU5hbWVzKGQpKX0sYXR0YWNoZWQoKXtzZXRUaW1lb3V0KCgpPT57dGhpcy5faGFuZGxlUmVzaXplKCl9LDFFMyl9LF9jaGFydFNlbGVjdGlvbkhhc1F1YW50aWxlcyhhKXtyZXR1cm4gQXQoYSl9LF9nZXRUaXRsZShhKXtyZXR1cm4gYT8iTnVtZXJpYyI6IkNhdGVnb3JpY2FsIn0sX2dldEZlYXR1cmVOYW1lKGEpe3JldHVybiBhLmdldE5hbWUoKX0sCl9oYXNDdXN0b21TdGF0cyhhKXtyZXR1cm4gbnVsbD09YT8hMTphLmRvZXNDb250YWluQ3VzdG9tU3RhdHMoKX0sX2hhc011bHRpcGxlRGF0YXNldHMoYSl7cmV0dXJuIG51bGw9PWE/ITE6MTxhLmdldERhdGFzZXROYW1lcygpLmxlbmd0aH0sX2dldEFsbEN1c3RvbVN0YXRzKGEsYyl7Y29uc3QgZD1bXSxmPXt9O2EuZ2V0RGF0YXNldEZlYXR1cmVTdGF0aXN0aWNzKCkuZ2V0RGF0YXNldHNMaXN0KCkuZm9yRWFjaChnPT57Y29uc3QgbD1hLmdldEZlYXR1cmVJbmRleChnLmdldE5hbWUoKSxjLmdldE5hbWUoKSk7bnVsbCE9bCYmKGc9Zy5nZXRGZWF0dXJlc0xpc3QoKVtsXS5nZXRDdXN0b21TdGF0c0xpc3QoKSkmJmcuZm9yRWFjaChrPT57ZltrLmdldE5hbWUoKV18fChmW2suZ2V0TmFtZSgpXT0hMCxkLnB1c2goaykpfSl9KTtyZXR1cm4gZH0sX2dldERhdGFzZXRzKGEpe3JldHVybiBhP2EuZ2V0RGF0YXNldEZlYXR1cmVTdGF0aXN0aWNzKCkuZ2V0RGF0YXNldHNMaXN0KCk6bnVsbH0sCl9nZXRTdGF0cyhhLGMsZCl7cmV0dXJuIGEmJmMmJmQ/YS5nZXRGZWF0dXJlKGQuZ2V0TmFtZSgpLGMuZ2V0TmFtZSgpKTpudWxsfSxfZ2V0Q2hhcnREYXRhKGEsYyl7cmV0dXJuIGEmJmM/YS5nZXREYXRhc2V0SGlzdG9ncmFtc0ZvckZlYXR1cmUoYy5nZXROYW1lKCkpOltdfSxfZ2V0RmVhdHVyZUNvdW50VGV4dChhLGMsZCl7YT1hP2EuZ2V0TnVtVW5pcXVlRmVhdHVyZXNCeVR5cGUoYyk6MDtyZXR1cm4gZ3QoZC5sZW5ndGgsYSl9LF9oYXNXZWlnaHRlZEhpc3RvZ3JhbShhKXtyZXR1cm4gMD09PWEubGVuZ3RoPyExOm50KHRoaXMuX2dldENoYXJ0RGF0YSh0aGlzLmRhdGFNb2RlbCxhWzBdKSl9LF9nZXRDaGFydENsYXNzKGEpe2xldCBjPSJjaGFydC1jb2x1bW4gIjthfHwoYys9InRhYmxlLWNlbGwgIik7cmV0dXJuIGN9LF9nZXRUYWJsZVdyYXBwZXJDbGFzcyhhKXtyZXR1cm4gYSYmMCE9PWEubGVuZ3RoPyIiOiJoaWRkZW4ifSxfZ2V0VGFibGVSb3dDbGFzcyhhKXtyZXR1cm4gYT8KIm51bWVyaWMtcm93IjoiY2F0ZWdvcmljYWwtcm93In19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLXZhbGlkYXRvci1iZWhhdmlvci9pcm9uLXZhbGlkYXRvci1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvblZhbGlkYXRvckJlaGF2aW9yPXtyZWFkeTpmdW5jdGlvbigpe25ldyBQb2x5bWVyLklyb25NZXRhKHt0eXBlOiJ2YWxpZGF0b3IiLGtleTp0aGlzLmlzfHx0aGlzLmNvbnN0cnVjdG9yLmlzLHZhbHVlOnRoaXN9KX0sdmFsaWRhdGU6ZnVuY3Rpb24oKXt9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9mYWNldHMtb3ZlcnZpZXcvY29tcG9uZW50cy9mYWNldHMtb3ZlcnZpZXcvZmFjZXRzLW92ZXJ2aWV3LWZpbHRlci12YWxpZGF0b3IuaHRtbC5qcwpQb2x5bWVyKHtpczoiZmFjZXRzLW92ZXJ2aWV3LWZpbHRlci12YWxpZGF0b3IiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uVmFsaWRhdG9yQmVoYXZpb3JdLHZhbGlkYXRlOmZ1bmN0aW9uKGEpe3RyeXtyZXR1cm4gbmV3IFJlZ0V4cChhKSwhMH1jYXRjaChjKXtyZXR1cm4hMX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLW92ZXJ2aWV3L2NvbXBvbmVudHMvZmFjZXRzLW92ZXJ2aWV3L2ZhY2V0cy1vdmVydmlldy5qcwpQb2x5bWVyKHtpczoiZmFjZXRzLW92ZXJ2aWV3Iixwcm9wZXJ0aWVzOntzZWFyY2hTdHJpbmc6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX3NvcnRPcHRpb25zOkFycmF5LF9yZXZlcnNlT3JkZXI6Qm9vbGVhbixfc29ydE9yZGVyOnt0eXBlOk51bWJlcix2YWx1ZTowfSxwcm90b0lucHV0Ont0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3VwZGF0ZSJ9LGZlYXR1cmVTbGljZVNlbGVjdGlvbjp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxjb21wYXJlTW9kZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfZGF0YU1vZGVsOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfZmVhdHVyZVNwZWNBcnJheTp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEZlYXR1cmVTcGVjQXJyYXkoX2RhdGFNb2RlbCkifSxfZmVhdHVyZVNwZWNDaGVja2JveGVzOkFycmF5fSxfZ2V0RmVhdHVyZVNwZWNBcnJheShhKXtpZighYSlyZXR1cm5bXTtjb25zdCBjPVtdO2ZvcihsZXQgZD0wOzE2PmQ7ZCsrKWMucHVzaCghMCk7CnRoaXMuX2ZlYXR1cmVTcGVjQ2hlY2tib3hlcz1jO3JldHVybiBhLmdldE5vbkVtcHR5RmVhdHVyZVNwZWNMaXN0cygpfSxfZ2V0U3BlY0NoZWNrYm94VGV4dChhKXtyZXR1cm4gcnQoYS5zcGVjKSsiKCIrYS5mZWF0dXJlcy5sZW5ndGgrIikifSxfZ2V0U3BlY0NoZWNrYm94SWQoYSl7cmV0dXJuIFN0cmluZyhhLnNwZWMpfSxfZmVhdHVyZVNwZWNDaGVjayhhKXtpZihhKXtjb25zdCBjPVtdLGQ9K2EudGFyZ2V0LmlkO2ZvcihsZXQgZj0wOzE2PmY7ZisrKWQ9PT1mP2MucHVzaChhLnRhcmdldC5jaGVja2VkKTpjLnB1c2godGhpcy5fZmVhdHVyZVNwZWNDaGVja2JveGVzW2ZdKTt0aGlzLl9mZWF0dXJlU3BlY0NoZWNrYm94ZXM9Y319LF9jb252ZXJ0SW5wdXRUb1Byb3RvKGEpe2lmKCFhfHxhLmNvbnN0cnVjdG9yPT09T2JqZWN0JiYwPT09T2JqZWN0LmtleXMoYSkubGVuZ3RoKXJldHVybiBudWxsO2lmKGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBnbShhKTtpZigic3RyaW5nIj09PQp0eXBlb2YgYXx8YSBpbnN0YW5jZW9mIFN0cmluZyl7YT1hdG9iKGEpO2NvbnN0IGM9bmV3IFVpbnQ4QXJyYXkoYS5sZW5ndGgpO2ZvcihsZXQgZD0wO2Q8YS5sZW5ndGg7ZCsrKWNbZF09YS5jaGFyQ29kZUF0KGQpO3JldHVybiBnbShjKX1yZXR1cm4gYS5jb25zdHJ1Y3Rvcj09PU9iamVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBCbC5mcm9tT2JqZWN0P0JsLmZyb21PYmplY3QoYSk6YX0sX3VwZGF0ZSgpe3RoaXMuZmVhdHVyZVNsaWNlU2VsZWN0aW9uPW51bGw7bGV0IGE7e2NvbnN0IGY9dGhpcy5fY29udmVydElucHV0VG9Qcm90byh0aGlzLnByb3RvSW5wdXQpO2lmKCFmKXt0aGlzLl9kYXRhTW9kZWw9bnVsbDtyZXR1cm59YT1uZXcgU3QoaXQoZikpfXRoaXMuc2V0KCJfc29ydE9wdGlvbnMiLFt7bmFtZToiRmVhdHVyZSBvcmRlciIsbWFwOnt9fSx7bmFtZToiTm9uLXVuaWZvcm1pdHkiLG1hcDp7fX0se25hbWU6IkFscGhhYmV0aWNhbCIsbWFwOnt9fSx7bmFtZToiQW1vdW50IG1pc3NpbmcvemVybyIsCm1hcDp7fX1dKTtjb25zdCBjPWEuZ2V0RGF0YXNldEZlYXR1cmVTdGF0aXN0aWNzKCkuZ2V0RGF0YXNldHNMaXN0KCksZD0xPGMubGVuZ3RoO2QmJnRoaXMucHVzaCgiX3NvcnRPcHRpb25zIix7bmFtZToiRGlzdHJpYnV0aW9uIGRpc3RhbmNlIixtYXA6e319KTthLmdldFVuaXF1ZUZlYXR1cmVzKCkuZm9yRWFjaCgoZixnKT0+e3RoaXMuX3NvcnRPcHRpb25zWzBdLm1hcFtmLmdldE5hbWUoKV09ZztnPWEuZ2V0RGF0YXNldEhpc3RvZ3JhbXNGb3JGZWF0dXJlKGYuZ2V0TmFtZSgpKTt0aGlzLl9zb3J0T3B0aW9uc1sxXS5tYXBbZi5nZXROYW1lKCldPWcucmVkdWNlKChsLGspPT57az1rLmhpc3RNYXAuU3RhbmRhcmQ/VXMoay5oaXN0TWFwLlN0YW5kYXJkLmdldEJ1Y2tldHNMaXN0KCkpOjE7cmV0dXJuIE1hdGgubWluKGwsayl9LDEpO3RoaXMuX3NvcnRPcHRpb25zWzJdLm1hcFtmLmdldE5hbWUoKV09Zi5nZXROYW1lKCk7dGhpcy5fc29ydE9wdGlvbnNbM10ubWFwW2YuZ2V0TmFtZSgpXT0KYy5yZWR1Y2UoKGwsayk9PntrPXRoaXMuX2dldFN0YXRzKGEsayxmKTtrPS0xKmN0KGspO3JldHVybiBNYXRoLm1pbihsLGspfSwwKTtkJiYodGhpcy5fc29ydE9wdGlvbnNbNF0ubWFwW2YuZ2V0TmFtZSgpXT0tMSpldChnKSl9LHRoaXMpO3RoaXMuX2RhdGFNb2RlbD1hfSxfZ2V0U3RhdHMoYSxjLGQpe3JldHVybiBhJiZjJiZkP2EuZ2V0RmVhdHVyZShkLmdldE5hbWUoKSxjLmdldE5hbWUoKSk6bnVsbH0sX2dldFNvcnRGdW5jdGlvbihhLGMpe2NvbnN0IGQ9dGhpcy5fc29ydE9wdGlvbnNbYV0ubWFwLGY9Yz8tMToxO3JldHVybihnLGwpPT57Zz1kW2cuZ2V0TmFtZSgpXTtsPWRbbC5nZXROYW1lKCldO3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgZ3x8InVuZGVmaW5lZCI9PXR5cGVvZiBsPzA6ZiooZzxsPy0xOjEpfX0sX2dldEZpbHRlcihhKXtpZihhKXRyeXtjb25zdCBjPW5ldyBSZWdFeHAoYSwiaSIpO3JldHVybiBkPT5jLnRlc3QoZC5nZXROYW1lKCkpfWNhdGNoKGMpe3JldHVybiBudWxsfWVsc2UgcmV0dXJuIG51bGx9LApfZ2V0TnVtZXJpY0ZlYXR1cmVMaXN0SXRlbXMoYSxjLGQsZixnKXtyZXR1cm4gdGhpcy5fZ2V0RmVhdHVyZUxpc3RJdGVtcyhhLGMsZCxmLGcsITApfSxfZ2V0Tm9uTnVtZXJpY0ZlYXR1cmVMaXN0SXRlbXMoYSxjLGQsZixnKXtyZXR1cm4gdGhpcy5fZ2V0RmVhdHVyZUxpc3RJdGVtcyhhLGMsZCxmLGcsITEpfSxfZ2V0RmVhdHVyZUxpc3RJdGVtcyhhLGMsZCxmLGcsbCl7aWYoIWEpcmV0dXJuW107Y29uc3Qgaz10aGlzLl9nZXRGaWx0ZXIoYyk7Yz1hLmdldFVuaXF1ZUZlYXR1cmVzKCk7Yz1rP2MuZmlsdGVyKG49PmsobikmJmdbYS5nZXRGZWF0dXJlU3BlY0ZvckZlYXR1cmUobi5nZXROYW1lKCkpXSk6Yy5maWx0ZXIobj0+Z1thLmdldEZlYXR1cmVTcGVjRm9yRmVhdHVyZShuLmdldE5hbWUoKSldKTtjPWMuZmlsdGVyKG49Pmw/aHQobik6IWh0KG4pKTtyZXR1cm4gYy5zbGljZSgpLnNvcnQodGhpcy5fZ2V0U29ydEZ1bmN0aW9uKGQsZikpfSxfZ2V0Q29udHJvbHNXcmFwcGVyQ2xhc3MoYSl7cmV0dXJuIWF8fAoxPj1hLmdldFVuaXF1ZUZlYXR1cmVzKCkubGVuZ3RoPyJoaWRkZW4iOiIifSxfZ2V0RGF0YXNldE5hbWUoYSxjKXtyZXR1cm4gYS5nZXREYXRhc2V0TmFtZXMoKVtjXX0sX2dldExlZ2VuZEJveFN0eWxlKGEsYyl7cmV0dXJuImJhY2tncm91bmQtY29sb3I6IithLmdldENoYXJ0Q29sb3JTdHJpbmcoYyl9LF9nZXREYXRhc2V0cyhhKXtyZXR1cm4gYT9hLmdldERhdGFzZXRGZWF0dXJlU3RhdGlzdGljcygpLmdldERhdGFzZXRzTGlzdCgpOm51bGx9LF9oYXNNdWx0aXBsZURhdGFzZXRzKGEpe3JldHVybiBudWxsPT1hPyExOjE8YS5nZXREYXRhc2V0TmFtZXMoKS5sZW5ndGh9LGdldFN0YXRzUHJvdG8oYSl7cmV0dXJuIHdxKGEpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWV4YW1wbGUtdmlld2VyL3Z6LWV4YW1wbGUtdmlld2VyLmpzCnZhciBUdDsKKGZ1bmN0aW9uKCl7Y29uc3QgYT0vXmltYWdlXC8oW15cL10rXC8pKmVuY29kZWQkLyxjPVsxLDIwXTtQb2x5bWVyKHtpczoidnotZXhhbXBsZS12aWV3ZXIiLHByb3BlcnRpZXM6e2V4YW1wbGU6e3R5cGU6T2JqZWN0fSxzZXJpYWxpemVkRXhhbXBsZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6InVwZGF0ZUV4YW1wbGUifSxzZXJpYWxpemVkU2VxRXhhbXBsZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6InVwZGF0ZVNlcUV4YW1wbGUifSxqc29uOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiY3JlYXRlRXhhbXBsZXNGcm9tSnNvbiJ9LHNhbGllbmN5Ont0eXBlOk9iamVjdCx2YWx1ZTp7fX0sc2FsaWVuY3lKc29uU3RyaW5nOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiaGF2ZVNhbGllbmN5SnNvbiJ9LHJlYWRvbmx5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNlcU51bWJlcjp7dHlwZTpOdW1iZXIsdmFsdWU6MCxvYnNlcnZlcjoibmV3U2VxTnVtIn0saXNTZXF1ZW5jZTpCb29sZWFuLGNoYW5nZUNhbGxiYWNrVGltZXI6TnVtYmVyLAppZ25vcmVDaGFuZ2U6Qm9vbGVhbixtaW5TYWw6TnVtYmVyLG1heFNhbDpOdW1iZXIsc2hvd1NhbGllbmN5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LGltYWdlSW5mbzp7dHlwZTpPYmplY3QsdmFsdWU6e319LHdpbmRvd1dpZHRoOnt0eXBlOk51bWJlcix2YWx1ZToyNTZ9LHdpbmRvd0NlbnRlcjp7dHlwZTpOdW1iZXIsdmFsdWU6MTI4fSxzYWxpZW5jeUN1dG9mZjp7dHlwZTpOdW1iZXIsdmFsdWU6MH0saGFzSW1hZ2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sYWxsb3dJbWFnZUNvbnRyb2xzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGltYWdlU2NhbGVQZXJjZW50YWdlOnt0eXBlOk51bWJlcix2YWx1ZToxMDB9LGZlYXR1cmVzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiZ2V0RmVhdHVyZXMoZXhhbXBsZSkifSxmZWF0dXJlc0xpc3Q6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJnZXRGZWF0dXJlc0xpc3QoZmVhdHVyZXMsIGNvbXBhcmVGZWF0dXJlcykifSxzZXFGZWF0dXJlczp7dHlwZTpPYmplY3QsCmNvbXB1dGVkOiJnZXRTZXFGZWF0dXJlcyhleGFtcGxlKSJ9LHNlcUZlYXR1cmVzTGlzdDp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6ImdldEZlYXR1cmVzTGlzdChzZXFGZWF0dXJlcywgY29tcGFyZVNlcUZlYXR1cmVzKSJ9LG1heFNlcU51bWJlcjp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6ImdldE1heFNlcU51bWJlcihzZXFGZWF0dXJlc0xpc3QpIn0sY29sb3JzOk9iamVjdCxoaWdobGlnaHREaWZmZXJlbmNlczp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxkaXNwbGF5TW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImdyaWQifSxmZWF0dXJlU2VhcmNoVmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0sZmlsdGVyZWRGZWF0dXJlc0xpc3Q6e3R5cGU6T2JqZWN0fSxmaWx0ZXJlZFNlcUZlYXR1cmVzTGlzdDp7dHlwZTpPYmplY3R9LGZvY3VzZWRGZWF0dXJlTmFtZTpTdHJpbmcsZm9jdXNlZEZlYXR1cmVWYWx1ZUluZGV4Ok51bWJlcixmb2N1c2VkU2VxTnVtYmVyOk51bWJlciwKc2hvd0RlbGV0ZVZhbHVlQnV0dG9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGV4cGFuZGVkRmVhdHVyZXM6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxleHBhbmRBbGxGZWF0dXJlczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx6ZXJvSW5kZXg6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGNvbXBhcmVKc29uOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiY3JlYXRlQ29tcGFyZUV4YW1wbGVzRnJvbUpzb24ifSxjb21wYXJlRXhhbXBsZTp7dHlwZTpPYmplY3R9LGNvbXBhcmVGZWF0dXJlczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6ImdldEZlYXR1cmVzKGNvbXBhcmVFeGFtcGxlKSIsb2JzZXJ2ZXI6InVwZGF0ZUNvbXBhcmVNb2RlIn0sY29tcGFyZVNlcUZlYXR1cmVzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiZ2V0U2VxRmVhdHVyZXMoY29tcGFyZUV4YW1wbGUpIixvYnNlcnZlcjoidXBkYXRlQ29tcGFyZU1vZGUifSxzb3J0T3JkZXI6e3R5cGU6U3RyaW5nLHZhbHVlOiJhdHRyaWJ1dGlvbiJ9LApjb21wYXJlTW9kZTpCb29sZWFuLGNvbXBhcmVJbWFnZUluZm86e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxjb21wYXJlVGl0bGU6U3RyaW5nfSxvYnNlcnZlcnM6WyJkaXNwbGF5U2FsaWVuY3koc2FsaWVuY3ksIGV4YW1wbGUpIiwiaGF2ZVNhbGllbmN5KGZpbHRlcmVkRmVhdHVyZXNMaXN0LCBzYWxpZW5jeSwgY29sb3JzLCBzaG93U2FsaWVuY3ksIHNhbGllbmN5Q3V0b2ZmKSIsInNlcVNhbGllbmN5KHNlcU51bWJlciwgc2VxRmVhdHVyZXNMaXN0LCBzYWxpZW5jeSwgY29sb3JzLCBzaG93U2FsaWVuY3ksIHNhbGllbmN5Q3V0b2ZmKSIsInNldEZpbHRlcmVkRmVhdHVyZXNMaXN0KGZlYXR1cmVzTGlzdCwgZmVhdHVyZVNlYXJjaFZhbHVlLCBzYWxpZW5jeSwgc29ydE9yZGVyKSIsInNldEZpbHRlcmVkU2VxRmVhdHVyZXNMaXN0KHNlcUZlYXR1cmVzTGlzdCwgZmVhdHVyZVNlYXJjaFZhbHVlLCBzYWxpZW5jeSwgc29ydE9yZGVyKSJdLGlzRXhwYW5kZWQ6ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMuZXhwYW5kQWxsRmVhdHVyZXN8fAp0aGlzLnNhbml0aXplRmVhdHVyZShkKWluIHRoaXMuZXhwYW5kZWRGZWF0dXJlc30sdXBkYXRlRXhhbXBsZTpmdW5jdGlvbigpe3RoaXMuZGVzZXJpYWxpemVFeGFtcGxlKHRoaXMuc2VyaWFsaXplZEV4YW1wbGUsamspfSx1cGRhdGVTZXFFeGFtcGxlOmZ1bmN0aW9uKCl7dGhpcy5kZXNlcmlhbGl6ZUV4YW1wbGUodGhpcy5zZXJpYWxpemVkU2VxRXhhbXBsZSx5bCl9LHN0cmluZ1RvVWludDhBcnJheTpmdW5jdGlvbihkKXtyZXR1cm4obmV3IHdpbmRvdy5UZXh0RW5jb2RlcikuZW5jb2RlKGQpfSxkZXNlcmlhbGl6ZUV4YW1wbGU6ZnVuY3Rpb24oZCxmKXt0aGlzLmlnbm9yZUNoYW5nZXx8KGQ9dGhpcy5kZWNvZGVkU3RyaW5nVG9DaGFyQ29kZXMoYXRvYihkKSksdGhpcy5leGFtcGxlPWYoZCkpfSxnZXRGZWF0dXJlczpmdW5jdGlvbihkKXt0aGlzLmltYWdlSW5mbz17fTt0aGlzLmhhc0ltYWdlPSExO2lmKG51bGw9PWQpcmV0dXJuIG5ldyBNYXAoW10pO2lmKGQgaW5zdGFuY2VvZiBnaylyZXR1cm4gdGhpcy5pc1NlcXVlbmNlPQohMSxkLmhhc0ZlYXR1cmVzKCl8fGQuc2V0RmVhdHVyZXMobmV3IEhqKSxkLmdldEZlYXR1cmVzKCkuZ2V0RmVhdHVyZU1hcCgpO3RoaXMuaXNTZXF1ZW5jZT0hMDtkLmhhc0NvbnRleHQoKXx8ZC5zZXRDb250ZXh0KG5ldyBIaik7cmV0dXJuIGQuZ2V0Q29udGV4dCgpLmdldEZlYXR1cmVNYXAoKX0sZ2V0RmVhdHVyZXNMaXN0OmZ1bmN0aW9uKGQsZil7aWYobnVsbD09ZClyZXR1cm5bXTtjb25zdCBnPVtdLGw9e307bGV0IGs9ZC5rZXlzKCk7aWYoayl7bGV0IG49ay5uZXh0KCk7Zm9yKDshbi5kb25lOylnLnB1c2goe25hbWU6bi52YWx1ZSxmZWF0dXJlOmQuZ2V0KG4udmFsdWUpfSksbFtuLnZhbHVlXT0hMCxuPWsubmV4dCgpfWlmKG51bGw9PWYpcmV0dXJuIGc7aWYoaz1mLmtleXMoKSlmb3IoZD1rLm5leHQoKTshZC5kb25lOylkLnZhbHVlIGluIGx8fChnLnB1c2goe25hbWU6ZC52YWx1ZSxmZWF0dXJlOmYuZ2V0KGQudmFsdWUpfSksbFtkLnZhbHVlXT0hMCksZD1rLm5leHQoKTsKcmV0dXJuIGd9LGdldFNlcUZlYXR1cmVzOmZ1bmN0aW9uKGQpe3JldHVybiBudWxsPT1kfHxkIGluc3RhbmNlb2YgZ2s/bmV3IE1hcChbXSk6dGhpcy5leGFtcGxlLmdldEZlYXR1cmVMaXN0cygpLmdldEZlYXR1cmVMaXN0TWFwKCl9LHNldEZpbHRlcmVkRmVhdHVyZXNMaXN0OmZ1bmN0aW9uKGQsZixnLGwpe3RoaXMuZmlsdGVyZWRGZWF0dXJlc0xpc3Q9W107dGhpcy5maWx0ZXJlZEZlYXR1cmVzTGlzdD10aGlzLmdldEZpbHRlcmVkRmVhdHVyZXNMaXN0KGQsZixnLGwpfSxzZXRGaWx0ZXJlZFNlcUZlYXR1cmVzTGlzdDpmdW5jdGlvbihkLGYsZyxsKXt0aGlzLmZpbHRlcmVkU2VxRmVhdHVyZXNMaXN0PVtdO3RoaXMuZmlsdGVyZWRTZXFGZWF0dXJlc0xpc3Q9dGhpcy5nZXRGaWx0ZXJlZEZlYXR1cmVzTGlzdChkLGYsZyxsKX0sZ2V0RmlsdGVyZWRGZWF0dXJlc0xpc3Q6ZnVuY3Rpb24oZCxmLGcsbCl7aWYobnVsbCE9ZCl7dmFyIGs9ZCxuPWcmJjA8T2JqZWN0LmtleXMoZykubGVuZ3RoJiYKImFscGhhYmV0aWNhbCIhPWwscD1uP09iamVjdC5hc3NpZ24oe30sLi4uT2JqZWN0LmtleXMoZykubWFwKHE9Pih7W3FdOiJudW1iZXIiPT10eXBlb2YgZ1txXT9nW3FdOmdbcV0ucmVkdWNlKChyLHQpPT5yK3QsMCl9KSkpOnt9O2lmKCIiIT1mKXtjb25zdCBxPW5ldyBSZWdFeHAoZiwiaSIpO2s9ZC5maWx0ZXIocj0+cS50ZXN0KHIubmFtZSkpfXJldHVybiBrLnNvcnQoKHEscik9PntpZih0aGlzLmlzSW1hZ2UocS5uYW1lKSYmIXRoaXMuaXNJbWFnZShyLm5hbWUpKXJldHVybi0xO2lmKHRoaXMuaXNJbWFnZShyLm5hbWUpJiYhdGhpcy5pc0ltYWdlKHEubmFtZSkpcmV0dXJuIDE7aWYobil7aWYocS5uYW1lIGluIGcmJiEoci5uYW1lIGluIGcpKXJldHVybi0xO2lmKHIubmFtZSBpbiBnJiYhKHEubmFtZSBpbiBnKSlyZXR1cm4gMTt7Y29uc3QgdD0iYXR0cmlidXRpb24iPT1sP3Bbci5uYW1lXS1wW3EubmFtZV06InJldmVyc2UtYXR0cmlidXRpb24iPT1sP3BbcS5uYW1lXS1wW3IubmFtZV06Ck1hdGguYWJzKHBbci5uYW1lXSktTWF0aC5hYnMocFtxLm5hbWVdKTtpZigwIT10KXJldHVybiB0fX1yZXR1cm4gcS5uYW1lLmxvY2FsZUNvbXBhcmUoci5uYW1lKX0pfX0sZ2V0TWF4U2VxTnVtYmVyOmZ1bmN0aW9uKCl7bGV0IGQ9LTE7Zm9yKGNvbnN0IGYgb2YgdGhpcy5zZXFGZWF0dXJlc0xpc3Qpe2NvbnN0IGc9Zi5mZWF0dXJlO2cmJmcuZ2V0RmVhdHVyZUxpc3QoKS5sZW5ndGgtMT5kJiYoZD1nLmdldEZlYXR1cmVMaXN0KCkubGVuZ3RoLTEpfXJldHVybiBkfSxoYXZlU2FsaWVuY3lKc29uOmZ1bmN0aW9uKCl7dGhpcy5zYWxpZW5jeT1KU09OLnBhcnNlKHRoaXMuc2FsaWVuY3lKc29uU3RyaW5nKX0sc2VsZWN0QWxsOmZ1bmN0aW9uKGQpe3JldHVybiBkMy5zZWxlY3RBbGwoUG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKGQpKX0sZGlzcGxheVNhbGllbmN5OmZ1bmN0aW9uKGQpe2NvbnN0IGY9T2JqZWN0LmtleXMoZCksZz17fTtmb3IobGV0IGw9MDtsPApmLmxlbmd0aDtsKyspe2NvbnN0IGs9ZltsXTtsZXQgbj1kW2tdO0FycmF5LmlzQXJyYXkobil8fChuPVtuXSk7Z1trXT17ZmxvYXRMaXN0Ont2YWx1ZTpuLm1hcChwPT5kMy5mb3JtYXQoIi40ZiIpKHApKX19fXRoaXMuY29tcGFyZUpzb249dGhpcy5zYWxpZW5jeUpzb249e2ZlYXR1cmVzOntmZWF0dXJlOmd9fX0saGF2ZVNhbGllbmN5OmZ1bmN0aW9uKCl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLl9oYXZlU2FsaWVuY3lJbXBsKCkpfSxfdXNlTGlnaHRDb2xvcihkKXtkPShkLXRoaXMubWluU2FsKS8odGhpcy5tYXhTYWwtdGhpcy5taW5TYWwpO3JldHVybiAwPnRoaXMubWluU2FsJiYwPHRoaXMubWF4U2FsPy4zPmR8fC43PGQ6MD50aGlzLm1pblNhbD8uNj5kOi40PGR9LF9oYXZlU2FsaWVuY3lJbXBsOmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RBbGwoIi52YWx1ZS1waWxsIikuc3R5bGUoImJhY2tncm91bmQiLCIjZmZmIikuYXR0cigidGl0bGUiLCIiKS5zdHlsZSgiY29sb3IiLAoiIzNjNDA0MyIpO2lmKHRoaXMuZmlsdGVyZWRGZWF0dXJlc0xpc3QmJnRoaXMuc2FsaWVuY3kmJjAhPT1PYmplY3Qua2V5cyh0aGlzLnNhbGllbmN5KS5sZW5ndGgmJnRoaXMuY29sb3JzKWZvcihjb25zdCBmIG9mIHRoaXMuZmlsdGVyZWRGZWF0dXJlc0xpc3Qpe2NvbnN0IGc9dGhpcy5zYWxpZW5jeVtmLm5hbWVdO2lmKG51bGwhPWcpe3ZhciBkPUFycmF5LmlzQXJyYXkoZyk/KGwsayk9PnRoaXMuZ2V0Q29sb3JGb3JTYWxpZW5jeShnW2tdKTooKT0+dGhpcy5nZXRDb2xvckZvclNhbGllbmN5KGcpO3RoaXMuc2VsZWN0QWxsKGAuJHt0aGlzLnNhbml0aXplRmVhdHVyZShmLm5hbWUpfS52YWx1ZS1waWxsYCkuc3R5bGUoImJhY2tncm91bmQiLHRoaXMuc2hvd1NhbGllbmN5P2Q6KCk9PiIjZmZmIikuYXR0cigidGl0bGUiLChsLGspPT4iQXR0cmlidXRpb246ICIrZDMuZm9ybWF0KCIuNGYiKShBcnJheS5pc0FycmF5KGcpP2dba106ZykpLnN0eWxlKCJjb2xvciIsKGwsayk9PnRoaXMuX3VzZUxpZ2h0Q29sb3IoQXJyYXkuaXNBcnJheShnKT8KZ1trXTpnKT8iI2ZmZiI6IiMzYzQwNDMiKTtpZihBcnJheS5pc0FycmF5KGcpKXtkPWc7Y29uc3QgbD10aGlzLnNlbGVjdEFsbChgcGFwZXItYnV0dG9uLiR7dGhpcy5zYW5pdGl6ZUZlYXR1cmUoZi5uYW1lKX0udmFsdWUtcGlsbGApO2xldCBrPTA7Zm9yKGxldCBuPTE7bjxkLmxlbmd0aDtuKyspTWF0aC5hYnMoZFtuXSk+TWF0aC5hYnMoaykmJihrPWRbbl0pO2wuc3R5bGUoImJhY2tncm91bmQiLHRoaXMuc2hvd1NhbGllbmN5PygpPT50aGlzLmdldENvbG9yRm9yU2FsaWVuY3koayk6KCk9PiIjZmZmIil9fX19LG5ld1NlcU51bTpmdW5jdGlvbigpe3RoaXMuc2VxU2FsaWVuY3koKX0sc2VxU2FsaWVuY3k6ZnVuY3Rpb24oKXtpZih0aGlzLnNlcUZlYXR1cmVzTGlzdCYmdGhpcy5zYWxpZW5jeSYmMCE9PU9iamVjdC5rZXlzKHRoaXMuc2FsaWVuY3kpLmxlbmd0aCYmdGhpcy5jb2xvcnMpaWYodGhpcy5zZWxlY3RBbGwoIi52YWx1ZSBpbnB1dCIpLnNpemUoKTx0aGlzLnNlcUZlYXR1cmVzTGlzdC5sZW5ndGgpcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT4KdGhpcy5zZXFTYWxpZW5jeSgpKTtlbHNlIGZvcihjb25zdCBmIG9mIHRoaXMuc2VxRmVhdHVyZXNMaXN0KXt2YXIgZD10aGlzLnNhbGllbmN5W2YubmFtZV07aWYoIWQpY29udGludWU7Y29uc3QgZz1kW3RoaXMuc2VxTnVtYmVyXTtkPUFycmF5LmlzQXJyYXkoZyk/KGwsayk9PnRoaXMuZ2V0Q29sb3JGb3JTYWxpZW5jeShnW2tdKTooKT0+dGhpcy5nZXRDb2xvckZvclNhbGllbmN5KGcpO3RoaXMuc2VsZWN0QWxsKGAuJHt0aGlzLnNhbml0aXplRmVhdHVyZShmLm5hbWUpfSBpbnB1dGApLnN0eWxlKCJjb2xvciIsdGhpcy5zaG93U2FsaWVuY3k/ZDooKT0+ImJsYWNrIil9fSxnZXRGZWF0dXJlVmFsdWVzOmZ1bmN0aW9uKGQsZixnLGwpe3JldHVybihkPWw/dGhpcy5jb21wYXJlRmVhdHVyZXMuZ2V0KGQpOnRoaXMuZmVhdHVyZXMuZ2V0KGQpKT9kLmdldEJ5dGVzTGlzdCgpP2Y/ZC5nZXRCeXRlc0xpc3QoKS5nZXRWYWx1ZUxpc3QoKS5zbGljZSgpOmQuZ2V0Qnl0ZXNMaXN0KCkuZ2V0VmFsdWVMaXN0X2FzVTgoKS5tYXAoaz0+CnRoaXMuZGVjb2RlQnl0ZXNMaXN0U3RyaW5nKGssZykpOmQuZ2V0SW50NjRMaXN0KCk/ZC5nZXRJbnQ2NExpc3QoKS5nZXRWYWx1ZUxpc3QoKS5zbGljZSgpOmQuZ2V0RmxvYXRMaXN0KCk/ZC5nZXRGbG9hdExpc3QoKS5nZXRWYWx1ZUxpc3QoKS5zbGljZSgpOltdOltdfSxnZXRDb21wYXJlRmVhdHVyZVZhbHVlczpmdW5jdGlvbihkLGYsZyl7cmV0dXJuIHRoaXMuZ2V0RmVhdHVyZVZhbHVlcyhkLGYsZywhMCl9LGdldEZpcnN0RmVhdHVyZVZhbHVlOmZ1bmN0aW9uKGQpe3JldHVybiB0aGlzLmdldEZlYXR1cmVWYWx1ZXMoZClbMF19LGdldEZpcnN0Q29tcGFyZUZlYXR1cmVWYWx1ZTpmdW5jdGlvbihkKXtyZXR1cm4gdGhpcy5nZXRDb21wYXJlRmVhdHVyZVZhbHVlcyhkKVswXX0sZmVhdHVyZUhhc011bHRpcGxlVmFsdWVzOmZ1bmN0aW9uKGQpe3JldHVybiAxPHRoaXMuZ2V0RmVhdHVyZVZhbHVlcyhkKS5sZW5ndGh9LGNvbXBhcmVGZWF0dXJlSGFzTXVsdGlwbGVWYWx1ZXM6ZnVuY3Rpb24oZCl7cmV0dXJuIDE8CnRoaXMuZ2V0Q29tcGFyZUZlYXR1cmVWYWx1ZXMoZCkubGVuZ3RofSxnZXRTZXFGZWF0dXJlVmFsdWVzOmZ1bmN0aW9uKGQsZixnLGwsayl7ZD1rP3RoaXMuY29tcGFyZVNlcUZlYXR1cmVzLmdldChkKTp0aGlzLnNlcUZlYXR1cmVzLmdldChkKTtpZighZClyZXR1cm5bXTtkPWQuZ2V0RmVhdHVyZUxpc3QoKTtyZXR1cm4hZHx8ZC5sZW5ndGg8PWY/W106KGY9ZFtmXSk/Zi5nZXRCeXRlc0xpc3QoKT9nP2YuZ2V0Qnl0ZXNMaXN0KCkuZ2V0VmFsdWVMaXN0KCk6Zi5nZXRCeXRlc0xpc3QoKS5nZXRWYWx1ZUxpc3RfYXNVOCgpLm1hcChuPT50aGlzLmRlY29kZUJ5dGVzTGlzdFN0cmluZyhuLGwpKTpmLmdldEludDY0TGlzdCgpP2YuZ2V0SW50NjRMaXN0KCkuZ2V0VmFsdWVMaXN0KCk6Zi5nZXRGbG9hdExpc3QoKT9mLmdldEZsb2F0TGlzdCgpLmdldFZhbHVlTGlzdCgpOltdOltdfSxnZXRDb21wYXJlU2VxRmVhdHVyZVZhbHVlczpmdW5jdGlvbihkLGYsZyxsKXtyZXR1cm4gdGhpcy5nZXRTZXFGZWF0dXJlVmFsdWVzKGQsCmYsZyxsLCEwKX0sZ2V0Rmlyc3RTZXFGZWF0dXJlVmFsdWU6ZnVuY3Rpb24oZCxmKXtyZXR1cm4gdGhpcy5nZXRTZXFGZWF0dXJlVmFsdWVzKGQsZilbMF19LGdldEZpcnN0U2VxQ29tcGFyZUZlYXR1cmVWYWx1ZTpmdW5jdGlvbihkLGYpe3JldHVybiB0aGlzLmdldENvbXBhcmVTZXFGZWF0dXJlVmFsdWVzKGQsZilbMF19LHNlcUZlYXR1cmVIYXNNdWx0aXBsZVZhbHVlczpmdW5jdGlvbihkLGYpe3JldHVybiAxPHRoaXMuZ2V0U2VxRmVhdHVyZVZhbHVlcyhkLGYpLmxlbmd0aH0sY29tcGFyZVNlcUZlYXR1cmVIYXNNdWx0aXBsZVZhbHVlczpmdW5jdGlvbihkLGYpe3JldHVybiAxPHRoaXMuZ2V0Q29tcGFyZVNlcUZlYXR1cmVWYWx1ZXMoZCxmKS5sZW5ndGh9LGRlY29kZUJ5dGVzTGlzdFN0cmluZzpmdW5jdGlvbihkLGYpe3JldHVybiAzMjc2OEUzPGQubGVuZ3RoPyJTdHJpbmcgdG9vIGxhcmdlIHRvIGRpc3BsYXkiOmY/dGhpcy5kZWNvZGVCeXRlc0xpc3RUb1N0cmluZyhkKToobmV3IHdpbmRvdy5UZXh0RGVjb2RlcikuZGVjb2RlKGQpfSwKaXNCeXRlc0ZlYXR1cmU6ZnVuY3Rpb24oZCl7Y29uc3QgZj10aGlzLmZlYXR1cmVzLmdldChkKTtyZXR1cm4gZiYmZi5oYXNCeXRlc0xpc3QoKT8hMDooZD10aGlzLnNlcUZlYXR1cmVzLmdldChkKSkmJmQuZ2V0RmVhdHVyZUxpc3QoKVswXS5oYXNCeXRlc0xpc3QoKT8hMDohMX0sZ2V0SnNvbkZlYXR1cmU6ZnVuY3Rpb24oZCl7aWYoIXRoaXMuanNvbilyZXR1cm4gbnVsbDtpZih0aGlzLmpzb24uZmVhdHVyZXMmJnRoaXMuanNvbi5mZWF0dXJlcy5mZWF0dXJlKXt2YXIgZj10aGlzLmpzb24uZmVhdHVyZXMuZmVhdHVyZVtkXTtpZihmKXJldHVybiBmfXJldHVybiB0aGlzLmpzb24uY29udGV4dCYmdGhpcy5qc29uLmNvbnRleHQuZmVhdHVyZSYmKGY9dGhpcy5qc29uLmNvbnRleHQuZmVhdHVyZVtkXSk/Zjp0aGlzLmpzb24uZmVhdHVyZUxpc3RzJiZ0aGlzLmpzb24uZmVhdHVyZUxpc3RzLmZlYXR1cmVMaXN0P3RoaXMuanNvbi5mZWF0dXJlTGlzdHMuZmVhdHVyZUxpc3RbZF06bnVsbH0sCmdldEpzb25WYWx1ZUxpc3Q6ZnVuY3Rpb24oZCxmKXtkPXRoaXMuZ2V0SnNvbkZlYXR1cmUoZCk7aWYoIWQpcmV0dXJuIG51bGw7aXNOYU4oZil8fChkPWQuZmVhdHVyZVtmXSk7cmV0dXJuKGY9ZC5ieXRlc0xpc3R8fGQuaW50NjRMaXN0fHxkLmZsb2F0TGlzdCk/Zi52YWx1ZTpudWxsfSxnZXREYXRhRnJvbUVsZW06ZnVuY3Rpb24oZCl7Zm9yKDtudWxsPT1kLmRhdGFGZWF0dXJlOyl7aWYoIWQucGFyZW50RWxlbWVudCl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgYW5jZXN0b3IgY29udHJvbCBlbGVtZW50Iik7ZD1kLnBhcmVudEVsZW1lbnR9cmV0dXJue2ZlYXR1cmU6ZC5kYXRhRmVhdHVyZSx2YWx1ZUluZGV4OmQuZGF0YUluZGV4LHNlcU51bTpkLmRhdGFTZXFOdW19fSxnZXREYXRhRnJvbUV2ZW50OmZ1bmN0aW9uKGQpe3JldHVybiB0aGlzLmdldERhdGFGcm9tRWxlbShkLnRhcmdldCl9LGdldEZlYXR1cmVGcm9tRGF0YTpmdW5jdGlvbihkKXtpZihpc05hTihkLnNlcU51bSkpcmV0dXJuIHRoaXMuZmVhdHVyZXMuZ2V0KGQuZmVhdHVyZSk7CnZhciBmPXRoaXMuc2VxRmVhdHVyZXMuZ2V0KGQuZmVhdHVyZSk7aWYoZilyZXR1cm4oZj1mLmdldEZlYXR1cmVMaXN0KCkpP2ZbZC5zZXFOdW1dOnZvaWQgMH0sZ2V0VmFsdWVMaXN0RnJvbURhdGE6ZnVuY3Rpb24oZCl7cmV0dXJuIGlzTmFOKGQuc2VxTnVtKT90aGlzLmdldEZlYXR1cmVWYWx1ZXMoZC5mZWF0dXJlLCEwKTp0aGlzLmdldFNlcUZlYXR1cmVWYWx1ZXMoZC5mZWF0dXJlLGQuc2VxTnVtLCEwKX0sc2V0RmVhdHVyZVZhbHVlczpmdW5jdGlvbihkLGYpe2NvbnN0IGc9ZC5nZXRCeXRlc0xpc3QoKSxsPWQuZ2V0SW50NjRMaXN0KCk7ZD1kLmdldEZsb2F0TGlzdCgpO2c/Zy5zZXRWYWx1ZUxpc3QoZik6bD9sLnNldFZhbHVlTGlzdChmKTpkJiZkLnNldFZhbHVlTGlzdChmKX0sb25WYWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oZCl7Y29uc3QgZj1kLnRhcmdldDtkPXRoaXMuZ2V0RGF0YUZyb21FdmVudChkKTtjb25zdCBnPXRoaXMuZ2V0RmVhdHVyZUZyb21EYXRhKGQpLGw9dGhpcy5nZXRWYWx1ZUxpc3RGcm9tRGF0YShkKTsKaWYoZyl7aWYodGhpcy5pc0J5dGVzRmVhdHVyZShkLmZlYXR1cmUpKXt2YXIgaz10aGlzLnN0cmluZ1RvVWludDhBcnJheShmLnZhbHVlKTtsW2QudmFsdWVJbmRleF09azsoaz10aGlzLmdldEpzb25WYWx1ZUxpc3QoZC5mZWF0dXJlLGQuc2VxTnVtKSkmJihrW2QudmFsdWVJbmRleF09YnRvYShmLnZhbHVlKSl9ZWxzZSBsW2QudmFsdWVJbmRleF09K2YudmFsdWUsKGs9dGhpcy5nZXRKc29uVmFsdWVMaXN0KGQuZmVhdHVyZSxkLnNlcU51bSkpJiYoa1tkLnZhbHVlSW5kZXhdPStmLnZhbHVlKTt0aGlzLnNldEZlYXR1cmVWYWx1ZXMoZyxsKTt0aGlzLmV4YW1wbGVDaGFuZ2VkKCl9fSxvbklucHV0Rm9jdXM6ZnVuY3Rpb24oZCl7Y29uc3QgZj1kLnRhcmdldDtkPXRoaXMuZ2V0RGF0YUZyb21FdmVudChkKTt0aGlzLmZvY3VzZWRGZWF0dXJlTmFtZT1kLmZlYXR1cmU7dGhpcy5mb2N1c2VkRmVhdHVyZVZhbHVlSW5kZXg9ZC52YWx1ZUluZGV4O3RoaXMuZm9jdXNlZFNlcU51bWJlcj1kLnNlcU51bTsKdGhpcy4kLmRlbGV0ZXZhbHVlLnN0eWxlLnRvcD1mLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcC10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcC0yNSsicHgiO3RoaXMuJC5kZWxldGV2YWx1ZS5zdHlsZS5yaWdodD10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0LWYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQrMzArInB4Ijt0aGlzLnNob3dEZWxldGVWYWx1ZUJ1dHRvbj0hMH0sb25JbnB1dEJsdXI6ZnVuY3Rpb24oKXt0aGlzLnNob3dEZWxldGVWYWx1ZUJ1dHRvbj0hMX0sZGVsZXRlRmVhdHVyZTpmdW5jdGlvbihkKXtkPXRoaXMuZ2V0RGF0YUZyb21FdmVudChkKTt0aGlzLmZlYXR1cmVzLmRlbCYmdGhpcy5mZWF0dXJlcy5kZWwoZC5mZWF0dXJlKTt0aGlzLnNlcUZlYXR1cmVzLmRlbCYmdGhpcy5zZXFGZWF0dXJlcy5kZWwoZC5mZWF0dXJlKTt0aGlzLmRlbGV0ZUpzb25GZWF0dXJlKGQuZmVhdHVyZSk7dGhpcy5leGFtcGxlQ2hhbmdlZCgpOwp0aGlzLnJlZnJlc2hFeGFtcGxlVmlld2VyKCl9LGRlbGV0ZUpzb25GZWF0dXJlOmZ1bmN0aW9uKGQpe3RoaXMuanNvbiYmKHRoaXMuanNvbi5mZWF0dXJlcyYmdGhpcy5qc29uLmZlYXR1cmVzLmZlYXR1cmUmJmRlbGV0ZSB0aGlzLmpzb24uZmVhdHVyZXMuZmVhdHVyZVtkXSx0aGlzLmpzb24uY29udGV4dCYmdGhpcy5qc29uLmNvbnRleHQuZmVhdHVyZSYmZGVsZXRlIHRoaXMuanNvbi5jb250ZXh0LmZlYXR1cmVbZF0sdGhpcy5qc29uLmZlYXR1cmVMaXN0cyYmdGhpcy5qc29uLmZlYXR1cmVMaXN0cy5mZWF0dXJlTGlzdCYmZGVsZXRlIHRoaXMuanNvbi5mZWF0dXJlTGlzdHMuZmVhdHVyZUxpc3RbZF0pfSxkZWxldGVWYWx1ZTpmdW5jdGlvbihkKXtkPXRoaXMuZ2V0RGF0YUZyb21FdmVudChkKTtjb25zdCBmPXRoaXMuZ2V0RmVhdHVyZUZyb21EYXRhKGQpLGc9dGhpcy5nZXRWYWx1ZUxpc3RGcm9tRGF0YShkKTtpZihmKXtpZih0aGlzLmlzQnl0ZXNGZWF0dXJlKGQuZmVhdHVyZSkpe2NvbnN0IGw9CnRoaXMuZ2V0SnNvblZhbHVlTGlzdChkLmZlYXR1cmUsZC5zZXFOdW0pO2wmJmwuc3BsaWNlKGQudmFsdWVJbmRleCwxKX1nLnNwbGljZShkLnZhbHVlSW5kZXgsMSk7dGhpcy5zZXRGZWF0dXJlVmFsdWVzKGYsZyk7dGhpcy5leGFtcGxlQ2hhbmdlZCgpO3RoaXMucmVmcmVzaEV4YW1wbGVWaWV3ZXIoKX19LG9wZW5BZGRGZWF0dXJlRGlhbG9nOmZ1bmN0aW9uKCl7dGhpcy4kLmFkZEZlYXR1cmVEaWFsb2cub3BlbigpfSxhZGRGZWF0dXJlOmZ1bmN0aW9uKCl7aWYodGhpcy5qc29uKXt2YXIgZD1uZXcgRmo7aWYoImludCI9PT10aGlzLm5ld0ZlYXR1cmVUeXBlKXt2YXIgZj1bXTt2YXIgZz1uZXcgRGo7Zy5zZXRWYWx1ZUxpc3QoZik7ZC5zZXRJbnQ2NExpc3QoZyk7Zj17aW50NjRMaXN0Ont2YWx1ZTpmfX19ZWxzZSJmbG9hdCI9PT10aGlzLm5ld0ZlYXR1cmVUeXBlPyhmPVtdLGc9bmV3IEJqLGcuc2V0VmFsdWVMaXN0KGYpLGQuc2V0RmxvYXRMaXN0KGcpLGY9e2Zsb2F0TGlzdDp7dmFsdWU6Zn19KToKKGY9W10sZz1uZXcgbmksZy5zZXRWYWx1ZUxpc3QoZiksZC5zZXRCeXRlc0xpc3QoZyksZj17Ynl0ZXNMaXN0Ont2YWx1ZTpmfX0pO3RoaXMuZmVhdHVyZXMuc2V0KHRoaXMubmV3RmVhdHVyZU5hbWUsZCk7dGhpcy5hZGRKc29uRmVhdHVyZSh0aGlzLm5ld0ZlYXR1cmVOYW1lLGYpO3RoaXMubmV3RmVhdHVyZU5hbWU9IiI7dGhpcy5leGFtcGxlQ2hhbmdlZCgpO3RoaXMucmVmcmVzaEV4YW1wbGVWaWV3ZXIoKX19LGFkZEpzb25GZWF0dXJlOmZ1bmN0aW9uKGQsZil7dGhpcy5qc29uJiZ0aGlzLmpzb24uZmVhdHVyZXMmJnRoaXMuanNvbi5mZWF0dXJlcy5mZWF0dXJlP3RoaXMuanNvbi5mZWF0dXJlcy5mZWF0dXJlW2RdPWY6dGhpcy5qc29uJiZ0aGlzLmpzb24uY29udGV4dCYmdGhpcy5qc29uLmNvbnRleHQuZmVhdHVyZSYmKHRoaXMuanNvbi5jb250ZXh0LmZlYXR1cmVbZF09Zil9LGFkZFZhbHVlOmZ1bmN0aW9uKGQpe2Q9dGhpcy5nZXREYXRhRnJvbUV2ZW50KGQpO2NvbnN0IGY9CnRoaXMuZ2V0RmVhdHVyZUZyb21EYXRhKGQpLGc9dGhpcy5nZXRWYWx1ZUxpc3RGcm9tRGF0YShkKTtmJiYodGhpcy5pc0J5dGVzRmVhdHVyZShkLmZlYXR1cmUpP2cucHVzaCgiIik6Zy5wdXNoKDApLHRoaXMuc2V0RmVhdHVyZVZhbHVlcyhmLGcpLHRoaXMuZXhhbXBsZUNoYW5nZWQoKSx0aGlzLnJlZnJlc2hFeGFtcGxlVmlld2VyKCkpfSxyZWZyZXNoRXhhbXBsZVZpZXdlcjpmdW5jdGlvbigpe2NvbnN0IGQ9dGhpcy5leGFtcGxlO3RoaXMuaWdub3JlQ2hhbmdlPSEwO3RoaXMuZXhhbXBsZT1uZXcgZ2s7dGhpcy5pZ25vcmVDaGFuZ2U9ITE7c2V0VGltZW91dCgoKT0+e3RoaXMuZXhhbXBsZT1kO3RoaXMuaGF2ZVNhbGllbmN5KCl9LDApfSxleGFtcGxlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZmlyZSgiZXhhbXBsZS1jaGFuZ2UiLHtleGFtcGxlOnRoaXMuZXhhbXBsZX0pO2NsZWFyVGltZW91dCh0aGlzLmNoYW5nZUNhbGxiYWNrVGltZXIpO3RoaXMuY2hhbmdlQ2FsbGJhY2tUaW1lcj0Kc2V0VGltZW91dCh0aGlzLmNoYW5nZUNhbGxiYWNrLmJpbmQodGhpcyksMUUzKX0sY2hhbmdlQ2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLmlnbm9yZUNoYW5nZT0hMDt0aGlzLmlzU2VxdWVuY2UmJnRoaXMuc2VyaWFsaXplZFNlcUV4YW1wbGU/dGhpcy5zZXJpYWxpemVkU2VxRXhhbXBsZT1idG9hKHRoaXMuZGVjb2RlQnl0ZXNMaXN0U3RyaW5nKHRoaXMuZXhhbXBsZS5zZXJpYWxpemVCaW5hcnkoKSwhMCkpOnRoaXMuc2VyaWFsaXplZEV4YW1wbGUmJih0aGlzLnNlcmlhbGl6ZWRFeGFtcGxlPWJ0b2EodGhpcy5kZWNvZGVCeXRlc0xpc3RTdHJpbmcodGhpcy5leGFtcGxlLnNlcmlhbGl6ZUJpbmFyeSgpLCEwKSkpO3RoaXMuaWdub3JlQ2hhbmdlPSExfSxnZXRJbnB1dFBpbGxDbGFzczpmdW5jdGlvbihkLGYpe3JldHVybiB0aGlzLnNhbml0aXplRmVhdHVyZShkKSsiIHZhbHVlLXBpbGwiKygiZ3JpZCI9PWY/IiB2YWx1ZS1waWxsLWdyaWQiOiIgdmFsdWUtcGlsbC1zdGFja2VkIil9LApnZXRDb21wYXJlSW5wdXRDbGFzczpmdW5jdGlvbihkLGYsZyl7Zj0idmFsdWUtY29tcGFyZSIrKCJncmlkIj09Zj8iIHZhbHVlLXBpbGwtZ3JpZCI6IiB2YWx1ZS1waWxsLXN0YWNrZWQiKTtpZihudWxsIT1nKXtjb25zdCBsPXRoaXMuZ2V0RmVhdHVyZVZhbHVlcyhkLCEwKTtkPXRoaXMuZ2V0Q29tcGFyZUZlYXR1cmVWYWx1ZXMoZCwhMCk7Zj10aGlzLmhpZ2hsaWdodERpZmZlcmVuY2VzJiYoZz49bC5sZW5ndGh8fGc+PWQubGVuZ3RofHxsW2ddIT1kW2ddKT9mKyIgdmFsdWUtZGlmZmVyZW50IjpmKyIgdmFsdWUtc2FtZSJ9cmV0dXJuIGZ9LGdldFNlcUNvbXBhcmVJbnB1dENsYXNzOmZ1bmN0aW9uKGQsZixnLGwpe2Y9InZhbHVlLWNvbXBhcmUiKygiZ3JpZCI9PWY/IiB2YWx1ZS1waWxsLWdyaWQiOiIgdmFsdWUtcGlsbC1zdGFja2VkIik7aWYobnVsbCE9bCl7Y29uc3Qgaz10aGlzLmdldFNlcUZlYXR1cmVWYWx1ZXMoZCxnLCEwKTtkPXRoaXMuZ2V0Q29tcGFyZVNlcUZlYXR1cmVWYWx1ZXMoZCwKZywhMCk7Zj1sPj1rLmxlbmd0aHx8bD49ZC5sZW5ndGh8fGtbbF0hPWRbbF0/ZisiIHZhbHVlLWRpZmZlcmVudCI6ZisiIHZhbHVlLXNhbWUifXJldHVybiBmfSxzYW5pdGl6ZUZlYXR1cmU6ZnVuY3Rpb24oZCl7ZD1kLnRyaW0oKTtkLm1hdGNoKC9eW0EtWmEtel0uKiQvKXx8KGQ9Il8iK2QpO3JldHVybiBkLnJlcGxhY2UoL1tcL1wuI1xzXS9nLCJfIil9LGlzU2VxRXhhbXBsZTpmdW5jdGlvbihkKXtyZXR1cm4gMDw9ZH0saXNJbWFnZTpmdW5jdGlvbihkKXtyZXR1cm4gYS50ZXN0KGQpfSxnZXRJbWFnZVNyYzpmdW5jdGlvbihkKXt0aGlzLnNldHVwT25sb2FkQ2FsbGJhY2soZCk7cmV0dXJuIHRoaXMuZ2V0SW1hZ2VTcmNGb3JEYXRhKGQsdGhpcy5nZXRGZWF0dXJlVmFsdWVzKGQsITEsITApWzBdKX0sZ2V0Q29tcGFyZUltYWdlU3JjOmZ1bmN0aW9uKGQpe3RoaXMuc2V0dXBPbmxvYWRDYWxsYmFjayhkLCEwKTtyZXR1cm4gdGhpcy5nZXRJbWFnZVNyY0ZvckRhdGEoZCx0aGlzLmdldENvbXBhcmVGZWF0dXJlVmFsdWVzKGQsCiExLCEwKVswXSwhMCl9LGdldFNlcUltYWdlU3JjOmZ1bmN0aW9uKGQsZil7dGhpcy5zZXR1cE9ubG9hZENhbGxiYWNrKGQpO3JldHVybiB0aGlzLmdldEltYWdlU3JjRm9yRGF0YShkLHRoaXMuZ2V0U2VxRmVhdHVyZVZhbHVlcyhkLGYsITEsITApWzBdKX0sZ2V0Q29tcGFyZVNlcUltYWdlU3JjOmZ1bmN0aW9uKGQsZil7dGhpcy5zZXR1cE9ubG9hZENhbGxiYWNrKGQsITApO3JldHVybiB0aGlzLmdldEltYWdlU3JjRm9yRGF0YShkLHRoaXMuZ2V0Q29tcGFyZVNlcUZlYXR1cmVWYWx1ZXMoZCxmLCExLCEwKVswXSwhMCl9LHNldHVwT25sb2FkQ2FsbGJhY2s6ZnVuY3Rpb24oZCxmKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pntjb25zdCBnPXRoaXMuJCQoIiMiK3RoaXMuZ2V0SW1hZ2VJZChkLGYpKTtnLm9ubG9hZD10aGlzLmdldE9uTG9hZEZvckltYWdlKGQsZyxmKX0pfSxnZXRJbWFnZVNyY0ZvckRhdGE6ZnVuY3Rpb24oZCxmLGcpe2Q9YS5leGVjKGQpO2lmKG51bGw9PWQpcmV0dXJuIG51bGw7CmQ9ZFsxXXx8IiI7Zz1nP3RoaXMuZ2V0Q29tcGFyZUZlYXR1cmVWYWx1ZXMoImltYWdlIitkKyIvZm9ybWF0IiwhMSk6dGhpcy5nZXRGZWF0dXJlVmFsdWVzKCJpbWFnZSIrZCsiL2Zvcm1hdCIsITEpO2Q9ImpwZWciOzA8Zy5sZW5ndGgmJihkPWdbMF0udG9Mb3dlckNhc2UoKSk7cmV0dXJuImRhdGE6aW1hZ2UvIitkKyI7YmFzZTY0LCIrYnRvYShkZWNvZGVVUklDb21wb25lbnQoZW5jb2RlVVJJQ29tcG9uZW50KGYpKSl9LGdldEl0ZXJMZW5ndGg6ZnVuY3Rpb24oZCl7bGV0IGY9MDtpZihkKXtsZXQgZz1kLm5leHQoKTtmb3IoOyFnLmRvbmU7KWYrKyxnPWQubmV4dCgpfXJldHVybiBmfSx1cGRhdGVDb21wYXJlTW9kZTpmdW5jdGlvbigpe2xldCBkPSExO2lmKHRoaXMuY29tcGFyZUZlYXR1cmVzJiYwPHRoaXMuZ2V0SXRlckxlbmd0aCh0aGlzLmNvbXBhcmVGZWF0dXJlcy5rZXlzKCkpfHx0aGlzLmNvbXBhcmVTZXFGZWF0dXJlcyYmMDx0aGlzLmdldEl0ZXJMZW5ndGgodGhpcy5jb21wYXJlU2VxRmVhdHVyZXMua2V5cygpKSlkPQohMDt0aGlzLmNvbXBhcmVNb2RlPWR9LGNyZWF0ZUV4YW1wbGVzRnJvbUpzb246ZnVuY3Rpb24oZCl7dGhpcy5leGFtcGxlPXRoaXMuY3JlYXRlRXhhbXBsZXNGcm9tSnNvbkhlbHBlcihkKTt0aGlzLmNvbXBhcmVKc29uPXt9fSxjcmVhdGVDb21wYXJlRXhhbXBsZXNGcm9tSnNvbjpmdW5jdGlvbihkKXtpZighZHx8IU9iamVjdC5rZXlzKGQpLmxlbmd0aClpZih0aGlzLnNhbGllbmN5SnNvbilkPXRoaXMuc2FsaWVuY3lKc29uO2Vsc2V7dGhpcy5jb21wYXJlRXhhbXBsZT1udWxsO3JldHVybn10aGlzLmNvbXBhcmVFeGFtcGxlPXRoaXMuY3JlYXRlRXhhbXBsZXNGcm9tSnNvbkhlbHBlcihkKX0sY3JlYXRlRXhhbXBsZXNGcm9tSnNvbkhlbHBlcjpmdW5jdGlvbihkKXtpZighZClyZXR1cm4gbnVsbDsic3RyaW5nIj09PXR5cGVvZiB0aGlzLmpzb24mJihkPUpTT04ucGFyc2UodGhpcy5qc29uKSk7aWYoZC5mZWF0dXJlcyl7dmFyIGY9bmV3IGdrO2Yuc2V0RmVhdHVyZXModGhpcy5wYXJzZUZlYXR1cmVzKGQuZmVhdHVyZXMpKTsKcmV0dXJuIGZ9cmV0dXJuIGQuY29udGV4dHx8ZC5mZWF0dXJlTGlzdHM/KGY9bmV3IGhrLGQuY29udGV4dCYmZi5zZXRDb250ZXh0KHRoaXMucGFyc2VGZWF0dXJlcyhkLmNvbnRleHQpKSxkLmZlYXR1cmVMaXN0cyYmZi5zZXRGZWF0dXJlTGlzdHModGhpcy5wYXJzZUZlYXR1cmVMaXN0cyhkLmZlYXR1cmVMaXN0cykpLGYpOm5ldyBna30scGFyc2VGZWF0dXJlczpmdW5jdGlvbihkKXtjb25zdCBmPW5ldyBIajtmb3IoY29uc3QgZyBpbiBkLmZlYXR1cmUpaWYoZC5mZWF0dXJlLmhhc093blByb3BlcnR5KGcpKXtjb25zdCBsPWQuZmVhdHVyZVtnXTtmLmdldEZlYXR1cmVNYXAoKS5zZXQoZyx0aGlzLnBhcnNlRmVhdHVyZShsLHRoaXMuaXNJbWFnZShnKSkpfXJldHVybiBmfSxwYXJzZUZlYXR1cmVMaXN0czpmdW5jdGlvbihkKXtjb25zdCBmPW5ldyBLajtmb3IoY29uc3QgZyBpbiBkLmZlYXR1cmVMaXN0KWlmKGQuZmVhdHVyZUxpc3QuaGFzT3duUHJvcGVydHkoZykpe2NvbnN0IGw9CmQuZmVhdHVyZUxpc3RbZ10saz1uZXcgSWosbj1bXTtmb3IoY29uc3QgcCBpbiBsLmZlYXR1cmUpbC5mZWF0dXJlLmhhc093blByb3BlcnR5KHApJiZuLnB1c2godGhpcy5wYXJzZUZlYXR1cmUobC5mZWF0dXJlW3BdLHRoaXMuaXNJbWFnZShnKSkpO2suc2V0RmVhdHVyZUxpc3Qobik7Zi5nZXRGZWF0dXJlTGlzdE1hcCgpLnNldChnLGspfXJldHVybiBmfSxwYXJzZUZlYXR1cmU6ZnVuY3Rpb24oZCl7Y29uc3QgZj1uZXcgRmo7aWYoZC5mbG9hdExpc3Qpe3ZhciBnPW5ldyBCajtnLnNldFZhbHVlTGlzdChkLmZsb2F0TGlzdC52YWx1ZSk7Zi5zZXRGbG9hdExpc3QoZyl9ZWxzZSBkLmJ5dGVzTGlzdD8oZz1uZXcgbmksZC5ieXRlc0xpc3QudmFsdWUmJmcuc2V0VmFsdWVMaXN0KGQuYnl0ZXNMaXN0LnZhbHVlKSxmLnNldEJ5dGVzTGlzdChnKSk6ZC5pbnQ2NExpc3QmJihnPW5ldyBEaixnLnNldFZhbHVlTGlzdChkLmludDY0TGlzdC52YWx1ZSksZi5zZXRJbnQ2NExpc3QoZykpO3JldHVybiBmfSwKZ2V0SW1hZ2VJZDpmdW5jdGlvbihkLGYpe3JldHVybiBmP3RoaXMuZ2V0Q29tcGFyZUltYWdlSWQoZCk6dGhpcy5zYW5pdGl6ZUZlYXR1cmUoZCkrIl9pbWFnZSJ9LGdldENhbnZhc0lkOmZ1bmN0aW9uKGQsZil7cmV0dXJuIGY/dGhpcy5nZXRDb21wYXJlQ2FudmFzSWQoZCk6dGhpcy5zYW5pdGl6ZUZlYXR1cmUoZCkrIl9jYW52YXMifSxnZXRJbWFnZUNhcmRJZDpmdW5jdGlvbihkLGYpe3JldHVybiBmP3RoaXMuZ2V0Q29tcGFyZUltYWdlQ2FyZElkKGQpOnRoaXMuc2FuaXRpemVGZWF0dXJlKGQpKyJfY2FyZCJ9LGdldENvbXBhcmVJbWFnZUlkOmZ1bmN0aW9uKGQpe3JldHVybiB0aGlzLnNhbml0aXplRmVhdHVyZShkKSsiX2ltYWdlX2NvbXBhcmUifSxnZXRDb21wYXJlQ2FudmFzSWQ6ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMuc2FuaXRpemVGZWF0dXJlKGQpKyJfY2FudmFzX2NvbXBhcmUifSxnZXRDb21wYXJlSW1hZ2VDYXJkSWQ6ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMuc2FuaXRpemVGZWF0dXJlKGQpKwoiX2NhcmRfY29tcGFyZSJ9LGdldEZlYXR1cmVEaWFsb2dJZDpmdW5jdGlvbihkKXtyZXR1cm4gdGhpcy5zYW5pdGl6ZUZlYXR1cmUoZCkrIl9kaWFsb2cifSxmZWF0dXJlTW9yZUNsaWNrZWQ6ZnVuY3Rpb24oZCl7ZD1kLnNyY0VsZW1lbnQ7Y29uc3QgZj10aGlzLiQkKCIjIit0aGlzLnNhbml0aXplRmVhdHVyZShkLmRhdGFGZWF0dXJlKSsiX2RpYWxvZyIpO2YucG9zaXRpb25UYXJnZXQ9ZDtmLm9wZW4oKX0sZXhwYW5kRmVhdHVyZTpmdW5jdGlvbihkKXt0aGlzLnNldCgiZXhwYW5kZWRGZWF0dXJlcy4iK3RoaXMuc2FuaXRpemVGZWF0dXJlKGQuc3JjRWxlbWVudC5kYXRhRmVhdHVyZSksITApO3RoaXMucmVmcmVzaEV4YW1wbGVWaWV3ZXIoKX0sZGVjb2RlZFN0cmluZ1RvQ2hhckNvZGVzOmZ1bmN0aW9uKGQpe2NvbnN0IGY9bmV3IFVpbnQ4QXJyYXkoZC5sZW5ndGgpO2ZvcihsZXQgZz0wO2c8ZC5sZW5ndGg7KytnKWZbZ109ZC5jaGFyQ29kZUF0KGcpO3JldHVybiBmfSxoYW5kbGVJbWFnZVVwbG9hZDpmdW5jdGlvbihkKXt0aGlzLmhhbmRsZUZpbGVTZWxlY3QoZCwKdGhpcyl9LHVwbG9hZEltYWdlQ2xpY2tlZDpmdW5jdGlvbihkKXtkPXRoaXMuZ2V0RGF0YUZyb21FdmVudChkKTtjb25zdCBmPVBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvckFsbCgicGFwZXItaW5wdXQiKTtsZXQgZz1udWxsO2ZvcihsZXQgbD0wO2w8Zi5sZW5ndGg7bCsrKWlmKGZbbF0uZGF0YUZlYXR1cmU9PWQuZmVhdHVyZSl7Zz1mW2xdO2JyZWFrfWcmJmcuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCJpbnB1dCIpLmNsaWNrKCl9LGhhbmRsZUZpbGVTZWxlY3Q6ZnVuY3Rpb24oZCxmKXtkLnN0b3BQcm9wYWdhdGlvbigpO2QucHJldmVudERlZmF1bHQoKTtjb25zdCBnPWQudGFyZ2V0LGw9bmV3IEZpbGVSZWFkZXI7ZD1kLmRhdGFUcmFuc2Zlcj9kLmRhdGFUcmFuc2Zlci5maWxlczpkLnRhcmdldC5pbnB1dEVsZW1lbnQuaW5wdXRFbGVtZW50LmZpbGVzOzAhPT1kLmxlbmd0aCYmKGwuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKCk9Pntjb25zdCBrPWwucmVzdWx0LnN1YnN0cmluZygrbC5yZXN1bHQuaW5kZXhPZigiYmFzZTY0LCIpKwo3KTt2YXIgbj1mLmRlY29kZWRTdHJpbmdUb0NoYXJDb2RlcyhhdG9iKGspKTtjb25zdCBwPWYuZ2V0RGF0YUZyb21FbGVtKGcpLHE9Zi5nZXRGZWF0dXJlRnJvbURhdGEocCkscj1mLmdldFZhbHVlTGlzdEZyb21EYXRhKHApO2lmKHEpe3JbMF09bjtxLmdldEJ5dGVzTGlzdCgpLnNldFZhbHVlTGlzdChyKTsobj1mLmdldEpzb25WYWx1ZUxpc3QocC5mZWF0dXJlLHAuc2VxTnVtKSkmJihuWzBdPWspO2NvbnN0IHQ9bmV3IEltYWdlO2YuYWRkSW1hZ2VFbGVtZW50KHAuZmVhdHVyZSx0KTt0LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCgpPT57Zi5nZXRPbkxvYWRGb3JJbWFnZShwLmZlYXR1cmUsdCk7dmFyIHY9YS5leGVjKHAuZmVhdHVyZSlbMV18fCIiO2NvbnN0IHk9ImltYWdlIit2KyIvd2lkdGgiO3Y9ImltYWdlIit2KyIvaGVpZ2h0Ijtjb25zdCB6PWYuZ2V0RmVhdHVyZVZhbHVlcyh5LCExKSx4PWYuZ2V0RmVhdHVyZVZhbHVlcyh2LCExKTswPHoubGVuZ3RoJiYoelswXT0rdC53aWR0aCwKZi5mZWF0dXJlcy5nZXQoeSkuZ2V0SW50NjRMaXN0KCkuc2V0VmFsdWVMaXN0KHopKTswPHgubGVuZ3RoJiYoeFswXT0rdC5oZWlnaHQsZi5mZWF0dXJlcy5nZXQodikuZ2V0SW50NjRMaXN0KCkuc2V0VmFsdWVMaXN0KHgpKTtmLmV4YW1wbGVDaGFuZ2VkKCl9KTt0LnNyYz1sLnJlc3VsdH19LCExKSxsLnJlYWRBc0RhdGFVUkwoZFswXSkpfSxhZGREcmFnRHJvcEJlaGF2aW9yVG9DYW52YXM6ZnVuY3Rpb24oZCl7ZnVuY3Rpb24gZihrKXtrLnN0b3BQcm9wYWdhdGlvbigpO2sucHJldmVudERlZmF1bHQoKTtrLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0PSJjb3B5In1mdW5jdGlvbiBnKGspe2wuaGFuZGxlRmlsZVNlbGVjdChrLGwpfWNvbnN0IGw9dGhpczshdGhpcy5yZWFkb25seSYmZCYmKGQuYWRkRXZlbnRMaXN0ZW5lcigiZHJhZ292ZXIiLGYsITEpLGQuYWRkRXZlbnRMaXN0ZW5lcigiZHJvcCIsZywhMSkpfSxnZXRPbkxvYWRGb3JJbWFnZTpmdW5jdGlvbihkLGYsZyl7Y29uc3QgbD0KKGssbixwKT0+e2NvbnN0IHE9dGhpcy4kJCgiIyIrdGhpcy5nZXRDYW52YXNJZChrLHApKTtwfHx0aGlzLmFkZERyYWdEcm9wQmVoYXZpb3JUb0NhbnZhcyhxKTtpZihuJiZxKXtjb25zdCByPXEuZ2V0Q29udGV4dCgiMmQiKTtsZXQgdD10aGlzLmltYWdlU2NhbGVQZXJjZW50YWdlLzEwMDtpZighdGhpcy5hbGxvd0ltYWdlQ29udHJvbHMpe2xldCB6PXRoaXMuJCQoIiMiK3RoaXMuZ2V0SW1hZ2VDYXJkSWQoayxwKSkucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aC8yOzE2PHomJih6LT0xNik7ejxuLndpZHRoJiYodD16L24ud2lkdGgpfXEud2lkdGg9bi53aWR0aCp0O3EuaGVpZ2h0PW4uaGVpZ2h0KnQ7Y29uc3Qgdj16PT57ci5zYXZlKCk7ci5jbGVhclJlY3QoMCwwLHEud2lkdGgscS5oZWlnaHQpO3IudHJhbnNsYXRlKHoueCx6LnkpO3Iuc2NhbGUoei5rLHouayk7dGhpcy5yZW5kZXJJbWFnZU9uQ2FudmFzKHIscS53aWR0aCxxLmhlaWdodCxrLHApOwpyLnJlc3RvcmUoKX0seT1kMy56b29tKCkuc2NhbGVFeHRlbnQoYykub24oInpvb20iLCgpPT57dGhpcy5hZGRJbWFnZVRyYW5zZm9ybShrLGQzLmV2ZW50LnRyYW5zZm9ybSxwKTt2KGQzLmV2ZW50LnRyYW5zZm9ybSl9KTtkMy5zZWxlY3QocSkuY2FsbCh5KS5vbigiZGJsY2xpY2suem9vbSIsKCk9PmQzLnNlbGVjdChxKS5jYWxsKHkudHJhbnNmb3JtLGQzLnpvb21JZGVudGl0eSkpO3Iuc2F2ZSgpO3Iuc2NhbGUodCx0KTtyLmRyYXdJbWFnZShuLDAsMCk7ci5yZXN0b3JlKCk7dGhpcy5zZXRJbWFnZURhdHVtKHIscS53aWR0aCxxLmhlaWdodCxrLHApO3RoaXMucmVuZGVySW1hZ2VPbkNhbnZhcyhyLHEud2lkdGgscS5oZWlnaHQsayxwKTtwP3RoaXMuY29tcGFyZUltYWdlSW5mb1trXS50cmFuc2Zvcm0mJnYodGhpcy5jb21wYXJlSW1hZ2VJbmZvW2tdLnRyYW5zZm9ybSk6dGhpcy5pbWFnZUluZm9ba10udHJhbnNmb3JtJiZ2KHRoaXMuaW1hZ2VJbmZvW2tdLnRyYW5zZm9ybSl9ZWxzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PgpsKGssbixwKSl9O3RoaXMuYWRkSW1hZ2VFbGVtZW50KGQsZixnKTt0aGlzLmFkZEltYWdlT25Mb2FkKGQsbCxnKTtyZXR1cm4gbC5hcHBseSh0aGlzLFtkLGYsZ10pfSxhZGRJbWFnZU9uTG9hZDpmdW5jdGlvbihkLGYsZyl7dGhpcy5oYXNJbWFnZT0hMDtnPyh0aGlzLmNvbXBhcmVJbWFnZUluZm9bZF18fCh0aGlzLmNvbXBhcmVJbWFnZUluZm9bZF09e30pLHRoaXMuY29tcGFyZUltYWdlSW5mb1tkXS5vbmxvYWQ9Zik6KHRoaXMuaW1hZ2VJbmZvW2RdfHwodGhpcy5pbWFnZUluZm9bZF09e30pLHRoaXMuaW1hZ2VJbmZvW2RdLm9ubG9hZD1mKX0sYWRkSW1hZ2VEYXRhOmZ1bmN0aW9uKGQsZixnKXtnPyh0aGlzLmNvbXBhcmVJbWFnZUluZm9bZF18fCh0aGlzLmNvbXBhcmVJbWFnZUluZm9bZF09e30pLHRoaXMuY29tcGFyZUltYWdlSW5mb1tkXS5pbWFnZURhdGE9Zik6KHRoaXMuaW1hZ2VJbmZvW2RdfHwodGhpcy5pbWFnZUluZm9bZF09e30pLHRoaXMuaW1hZ2VJbmZvW2RdLmltYWdlRGF0YT0KZil9LGFkZEltYWdlRWxlbWVudDpmdW5jdGlvbihkLGYsZyl7Zz8odGhpcy5jb21wYXJlSW1hZ2VJbmZvW2RdfHwodGhpcy5jb21wYXJlSW1hZ2VJbmZvW2RdPXt9KSx0aGlzLmNvbXBhcmVJbWFnZUluZm9bZF0uaW1hZ2VFbGVtZW50PWYpOih0aGlzLmltYWdlSW5mb1tkXXx8KHRoaXMuaW1hZ2VJbmZvW2RdPXt9KSx0aGlzLmltYWdlSW5mb1tkXS5pbWFnZUVsZW1lbnQ9Zil9LGFkZEltYWdlR3JheXNjYWxlRGF0YTpmdW5jdGlvbihkLGYpe3RoaXMuaW1hZ2VJbmZvW2RdfHwodGhpcy5pbWFnZUluZm9bZF09e30pO3RoaXMuaW1hZ2VJbmZvW2RdLmltYWdlR3JheXNjYWxlRGF0YT1mfSxhZGRJbWFnZVRyYW5zZm9ybTpmdW5jdGlvbihkLGYsZyl7Zz8odGhpcy5jb21wYXJlSW1hZ2VJbmZvW2RdfHwodGhpcy5jb21wYXJlSW1hZ2VJbmZvW2RdPXt9KSx0aGlzLmNvbXBhcmVJbWFnZUluZm9bZF0udHJhbnNmb3JtPWYpOih0aGlzLmltYWdlSW5mb1tkXXx8KHRoaXMuaW1hZ2VJbmZvW2RdPQp7fSksdGhpcy5pbWFnZUluZm9bZF0udHJhbnNmb3JtPWYpfSxzZXRJbWFnZURhdHVtOmZ1bmN0aW9uKGQsZixnLGwsayl7aWYoZiYmZyYmKGQ9ZC5nZXRJbWFnZURhdGEoMCwwLGYsZyksZD1VaW50OENsYW1wZWRBcnJheS5mcm9tKGQuZGF0YSksdGhpcy5hZGRJbWFnZURhdGEobCxkLGspLHRoaXMuc2FsaWVuY3kmJnRoaXMuc2hvd1NhbGllbmN5JiZ0aGlzLnNhbGllbmN5W2xdJiYhaykpe2s9VWludDhDbGFtcGVkQXJyYXkuZnJvbShkKTtmb3IoZj0wO2Y8ZC5sZW5ndGg7Zis9NClnPShkW2ZdK2RbZisxXStkW2YrMl0pLzMsa1tmXT1nLGtbZisxXT1nLGtbZisyXT1nO3RoaXMuYWRkSW1hZ2VHcmF5c2NhbGVEYXRhKGwsayl9fSxjb250cmFzdEltYWdlOmZ1bmN0aW9uKGQsZixnKXtmPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFtnLS41LWYvMixnLS41KyhmLTEpLzJdKS5jbGFtcCghMCkucmFuZ2UoWzAsMjU1XSk7Zm9yKGc9MDtnPGQubGVuZ3RoO2crKykzIT09ZyU0JiYoZFtnXT0KZihkW2ddKSl9LHNob3dTYWxpZW5jeUZvclZhbHVlOmZ1bmN0aW9uKGQpe3JldHVybiBNYXRoLmFicyhkKT49TWF0aC5hYnMoMDw9ZD90aGlzLm1heFNhbDp0aGlzLm1pblNhbCkqdGhpcy5zYWxpZW5jeUN1dG9mZi8xMDB9LGdldENvbG9yRm9yU2FsaWVuY3k6ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMuc2hvd1NhbGllbmN5Rm9yVmFsdWUoZCk/dGhpcy5jb2xvcnMoZCk6IiNmZmYifSxhZGRTYWxpZW5jeVRvSW1hZ2U6ZnVuY3Rpb24oZCxmKXtBcnJheS5pc0FycmF5KGYpJiYwPGYubGVuZ3RoJiZBcnJheS5pc0FycmF5KGZbMF0pJiYoZj1mW3RoaXMuc2VxTnVtYmVyXSk7Y29uc3QgZz0xL01hdGgucG93KHRoaXMuaW1hZ2VTY2FsZVBlcmNlbnRhZ2UvMTAwLDIpO2ZvcihsZXQgaz0wO2s8ZC5sZW5ndGg7ays9NCl7dmFyIGw9TWF0aC5mbG9vcihrLzQqZyk7bD1BcnJheS5pc0FycmF5KGYpP2YubGVuZ3RoPmw/ZltsXTowOmY7Y29uc3Qgbj0uNSoodGhpcy5zaG93U2FsaWVuY3lGb3JWYWx1ZShsKT8KMDw9bD8wPT09dGhpcy5tYXhTYWw/MDpsL3RoaXMubWF4U2FsOmwvdGhpcy5taW5TYWw6MCkse3I6cCxnOnEsYjpyfT1kMy5yZ2IoMDxsP3RoaXMuY29sb3JzKHRoaXMubWF4U2FsKTp0aGlzLmNvbG9ycyh0aGlzLm1pblNhbCkpO2Rba109ZFtrXSooMS1uKStwKm47ZFtrKzFdPWRbaysxXSooMS1uKStxKm47ZFtrKzJdPWRbaysyXSooMS1uKStyKm59fSxyZW5kZXJJbWFnZU9uQ2FudmFzOmZ1bmN0aW9uKGQsZixnLGwsayl7aWYoZiYmZyl7dmFyIG49ZC5nZXRJbWFnZURhdGEoMCwwLGYsZyk7az9uLmRhdGEuc2V0KHRoaXMuY29tcGFyZUltYWdlSW5mb1tsXS5pbWFnZURhdGEpOm4uZGF0YS5zZXQodGhpcy5zYWxpZW5jeSYmdGhpcy5zaG93U2FsaWVuY3kmJnRoaXMuc2FsaWVuY3lbbF0/dGhpcy5pbWFnZUluZm9bbF0uaW1hZ2VHcmF5c2NhbGVEYXRhOnRoaXMuaW1hZ2VJbmZvW2xdLmltYWdlRGF0YSk7MjU2PT09dGhpcy53aW5kb3dXaWR0aCYmMTI4PT09dGhpcy53aW5kb3dDZW50ZXJ8fAp0aGlzLmNvbnRyYXN0SW1hZ2Uobi5kYXRhLHRoaXMud2luZG93V2lkdGgsdGhpcy53aW5kb3dDZW50ZXIpOyFrJiZ0aGlzLnNhbGllbmN5JiZ0aGlzLnNob3dTYWxpZW5jeSYmdGhpcy5zYWxpZW5jeVtsXSYmdGhpcy5hZGRTYWxpZW5jeVRvSW1hZ2Uobi5kYXRhLHRoaXMuc2FsaWVuY3lbbF0pO2w9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7bC53aWR0aD1mO2wuaGVpZ2h0PWc7bC5nZXRDb250ZXh0KCIyZCIpLnB1dEltYWdlRGF0YShuLDAsMCk7ZC5jbGVhclJlY3QoMCwwLGYsZyk7ZC5kcmF3SW1hZ2UobCwwLDApfX0sc2hvd1NhbENoZWNrYm94Q2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy5zaG93U2FsaWVuY3k9dGhpcy4kLnNhbENoZWNrYm94LmNoZWNrZWR9LHVwZGF0ZUltYWdlczpmdW5jdGlvbigpe2Zvcihjb25zdCBkIGluIHRoaXMuaW1hZ2VJbmZvKWlmKHRoaXMuaW1hZ2VJbmZvLmhhc093blByb3BlcnR5KGQpKXRoaXMuaW1hZ2VJbmZvW2RdLm9ubG9hZChkLHRoaXMuaW1hZ2VJbmZvW2RdLmltYWdlRWxlbWVudCl9LApzaG91bGRTaG93SW1hZ2VDb250cm9sczpmdW5jdGlvbihkLGYpe3JldHVybiBkJiZmfSxzaG91bGRFbmFibGVBZGRGZWF0dXJlOmZ1bmN0aW9uKGQpe3JldHVybiAwPGQubGVuZ3RofSxnZXREZWxldGVWYWx1ZUJ1dHRvbkNsYXNzOmZ1bmN0aW9uKGQsZil7cmV0dXJuIGR8fCFmPyJkZWxldGUtdmFsdWUtYnV0dG9uIGRlbGV0ZS12YWx1ZS1idXR0b24taGlkZGVuIjoiZGVsZXRlLXZhbHVlLWJ1dHRvbiJ9LGdldERlbGV0ZUZlYXR1cmVCdXR0b25DbGFzczpmdW5jdGlvbihkKXtyZXR1cm4gZD8iaGlkZS1jb250cm9scyI6ImRlbGV0ZS1mZWF0dXJlLWJ1dHRvbiJ9LGdldEFkZFZhbHVlQnV0dG9uQ2xhc3M6ZnVuY3Rpb24oZCl7cmV0dXJuIGQ/ImhpZGUtY29udHJvbHMiOiJhZGQtdmFsdWUtYnV0dG9uIn0sZ2V0QWRkRmVhdHVyZUJ1dHRvbkNsYXNzOmZ1bmN0aW9uKGQpe3JldHVybiBkPyJoaWRlLWNvbnRyb2xzIjoiYWRkLWZlYXR1cmUtYnV0dG9uIn0sZ2V0VXBsb2FkSW1hZ2VDbGFzczpmdW5jdGlvbihkKXtyZXR1cm4gZD8KImhpZGUtY29udHJvbHMiOiJ1cGxvYWQtaW1hZ2UtYnV0dG9uIn0sZ2V0Q29tcGFyZUhlYWRlckNsYXNzOmZ1bmN0aW9uKGQpe3JldHVybiBkPyJjb21wYXJlLXZhbHVlLXRleHQiOiJuby1jb21wYXJlLXZhbHVlLXRleHQifSxkZWNvZGVCeXRlc0xpc3RUb1N0cmluZzpmdW5jdGlvbihkKXtsZXQgZj0iIixnO2ZvcihnPTA7ZzxkLmxlbmd0aC8xNjM4NDtnKyspZis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGQuc2xpY2UoMTYzODQqZywxNjM4NCooZysxKSkpO3JldHVybiBmKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsZC5zbGljZSgxNjM4NCpnKSl9fSl9KShUdHx8KFR0PXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW50ZXJhY3RpdmUtaW5mZXJlbmNlLWRhc2hib2FyZC90Zi1pbnRlcmFjdGl2ZS1pbmZlcmVuY2UtZGFzaGJvYXJkLmh0bWwuanMKY29uc3QgVXQ9ZDMuaW50ZXJwb2xhdGVSZ2I7ZnVuY3Rpb24gVnQoYSl7YSYmYS5wYXJlbnRFbGVtZW50JiZhLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYSl9ZnVuY3Rpb24gV3QoYSl7cmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYSkpfQooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtaW50ZXJhY3RpdmUtaW5mZXJlbmNlLWRhc2hib2FyZCIscHJvcGVydGllczp7X3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFFvLlJlcXVlc3RNYW5hZ2VyfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFFvLkNhbmNlbGxlcn0sZXhhbXBsZXNQYXRoOnt0eXBlOlN0cmluZ30sbW9kZWxOYW1lOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoibW9kZWxOYW1lQ2hhbmdlZF8ifSxwYXJzZWRNb2RlbE5hbWVzOnt0eXBlOlN0cmluZ30saW5mZXJlbmNlQWRkcmVzczp7dHlwZTpTdHJpbmd9LG1vZGVsVHlwZTp7dHlwZTpTdHJpbmd9LG1vZGVsU2lnbmF0dXJlOnt0eXBlOlN0cmluZ30sbW9kZWxWZXJzaW9uOnt0eXBlOlN0cmluZ30sbWF4RXhhbXBsZXM6e3R5cGU6TnVtYmVyfSxsYWJlbFZvY2FiUGF0aDp7dHlwZTpTdHJpbmd9LG1heEluZmVyZW5jZUVudHJpZXNQZXJSdW46TnVtYmVyLG51bVByaW1hcnlCdWNrZXRzOnt0eXBlOk51bWJlciwKdmFsdWU6MixvYnNlcnZlcjoiYnJlYWtkb3duRmVhdHVyZVNlbGVjdGVkXyJ9LG51bVNlY29uZGFyeUJ1Y2tldHM6e3R5cGU6TnVtYmVyLHZhbHVlOjIsb2JzZXJ2ZXI6ImJyZWFrZG93bkZlYXR1cmVTZWxlY3RlZF8ifSxpbmZlcmVuY2VzOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoibmV3SW5mZXJlbmNlc18iLHZhbHVlOigpPT4oe30pfSxleHRyYU91dHB1dHM6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJuZXdFeHRyYU91dHB1dHNfIn0sYXR0cmlidXRpb25zOnt0eXBlOk9iamVjdCx2YWx1ZTp7aW5kaWNlczpbXSxhdHRyaWJ1dGlvbnM6W119LG9ic2VydmVyOiJuZXdBdHRyaWJ1dGlvbnNfIn0sbWluQXR0cmlidXRpb246e3R5cGU6TnVtYmVyLHZhbHVlOjB9LG1heEF0dHJpYnV0aW9uOnt0eXBlOk51bWJlcix2YWx1ZTowfSxhdHRyaWJ1dGlvbkNvbG9yU2NhbGU6T2JqZWN0LGV4YW1wbGVzQW5kSW5mZXJlbmNlczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W10sb2JzZXJ2ZXI6ImNvbXB1dGVTZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2UifSwKc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlOnt0eXBlOk9iamVjdH0sY291bnRlcmZhY3R1YWxFeGFtcGxlQW5kSW5mZXJlbmNlOnt0eXBlOk9iamVjdH0sdmlzZGF0YTp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LHNlbGVjdGVkOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXSxvYnNlcnZlcjoiY29tcHV0ZVNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZSJ9LGNvbXBhcmVkSW5kaWNlczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LGxhYmVsVm9jYWI6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSx1cGRhdGVkRXhhbXBsZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbWFnZUZlYXR1cmVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZToiaW1hZ2UvZW5jb2RlZCIscmVhZG9ubHk6ITB9LHN0YXRzOk9iamVjdCxzZWxlY3RlZEJyZWFrZG93bkZlYXR1cmU6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG9ic2VydmVyOiJicmVha2Rvd25GZWF0dXJlU2VsZWN0ZWRfIn0sc2VsZWN0ZWRTZWNvbmRCcmVha2Rvd25GZWF0dXJlOnt0eXBlOlN0cmluZywKdmFsdWU6IiIsb2JzZXJ2ZXI6ImJyZWFrZG93bkZlYXR1cmVTZWxlY3RlZF8ifSxjdXN0b21EaXN0YW5jZUZ1bmN0aW9uU2V0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6ImN1c3RvbURpc3RhbmNlRnVuY3Rpb25TZXRDaGFuZ2VkXyJ9LHNlbGVjdGVkTGFiZWxGZWF0dXJlOnt0eXBlOlN0cmluZyx2YWx1ZToiIixvYnNlcnZlcjoibGFiZWxGZWF0dXJlU2VsZWN0ZWRfIn0sbmVhcmVzdENvdW50ZXJmYWN0dWFsTW9kZWxJbmRleDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sYXR0cmlidXRpb25Nb2RlbEluZGV4Ont0eXBlOk51bWJlcix2YWx1ZTowLG9ic2VydmVyOiJzZXRBdHRyaWJ1dGlvbnMifSxpbmZlcmVuY2VTdGF0c186e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxmZWF0dXJlVmFsdWVUaHJlc2hvbGRzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXSxvYnNlcnZlcjoiZmVhdHVyZVZhbHVlVGhyZXNob2xkc0NoYW5nZWRfIn0sZmVhdHVyZVZhbHVlVGhyZXNob2xkc0luZGV4TWFwOk9iamVjdCwKZGVmYXVsdEluZmVyZW5jZUxhYmVsOnt0eXBlOk51bWJlcix2YWx1ZTowLG9ic2VydmVyOiJyZWZyZXNoSW5mZXJlbmNlc18ifSxvdmVyYWxsVGhyZXNob2xkczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LHNpZGVUYWJTZWxlY3RlZDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxvYnNlcnZlcjoic2lkZVRhYlNlbGVjdGVkQ2hhbmdlZF8ifSxsb2NhbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJsb2NhbENoYW5nZWRfIn0sbG9jYWxBdGxhc1VybDpTdHJpbmcscGFydGlhbERlcFBsb3RFbGlnaWJsZUZlYXR1cmVzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXSxvYnNlcnZlcjoicGFydGlhbERlcFBsb3RFbGlnaWJsZUZlYXR1cmVzU2V0In0scGFydGlhbERlcFBsb3RQZW5kaW5nRmVhdHVyZXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxleGFtcGxlRGlzcGxheU1vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGFja2VkIn0sZmVhdHVyZVNlYXJjaFZhbHVlOlN0cmluZyxpbmNvcnJlY3RQcmVkQ29zdFJhdGlvOnt0eXBlOk51bWJlciwKdmFsdWU6MSxvYnNlcnZlcjoiY29zdFJhdGlvQ2hhbmdlZF8ifSxtdWx0aUNsYXNzOnt0eXBlOkJvb2xlYW59LHNlcXVlbmNlRXhhbXBsZXM6e3R5cGU6Qm9vbGVhbn0sc2FtcGxpbmdPZGRzOnt0eXBlOk51bWJlcn0sdXNlUHJlZGljdEFwaTp7dHlwZTpCb29sZWFufSxwcmVkaWN0T3V0cHV0VGVuc29yOnt0eXBlOlN0cmluZ30scHJlZGljdElucHV0VGVuc29yOnt0eXBlOlN0cmluZ30sYXhpc1ByZWNpc2lvbjp7dHlwZTpOdW1iZXIsdmFsdWU6Mn0sZGlzdGFuY2VTdGF0c186e3R5cGU6T2JqZWN0fSxmYWNldERpc3RTd2l0Y2g6e3R5cGU6U3RyaW5nLHZhbHVlOiJMMSJ9LGZhY2V0RGlzdEZlYXR1cmVOYW1lOnt0eXBlOlN0cmluZ30sZmFjZXREaXN0RmVhdHVyZU5hbWVzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sZmFjZXREaXN0U2V0dGluZzp7dHlwZTpTdHJpbmcsdmFsdWU6ImNvbG9yQnkifSxleGFtcGxlU3RhdHVzU3RyOnt0eXBlOlN0cmluZyx2YWx1ZToiTm8gZGF0YXBvaW50cyBsb2FkZWQgeWV0In0sCnNlbGVjdGVkRXhhbXBsZU51bTp7dHlwZTpOdW1iZXIsdmFsdWU6IiIsb2JzZXJ2ZXI6InNlbGVjdGVkRXhhbXBsZUlucHV0Q2hhbmdlZF8ifSxzZWxlY3RlZEV4YW1wbGVNYXg6TnVtYmVyLG9wZW5lZENvbnRleHRUb29sczp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxvcGVuZWRQZXJmb3JtYW5jZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxvcGVuZWRUcnVlTGFiZWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sb3BlbmVkRXhwbG9yZXI6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sb3BlbmVkSW5mZXJlbmNlUmVzdWx0czp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxyZWdyZXNzaW9uRW50cmllc186e3R5cGU6QXJyYXl9LG5lYXJlc3RDb3VudGVyZmFjdHVhbERpc3Q6e3R5cGU6U3RyaW5nLHZhbHVlOiJMMSJ9LG1pbkNvdW50ZXJmYWN0dWFsVmFsdWVEaXN0Ok51bWJlcixtYXhDb3VudGVyZmFjdHVhbFZhbHVlRGlzdDpOdW1iZXIsdmlzTW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImRpdmUiLApvYnNlcnZlcjoidmlzTW9kZUNoYW5nZWRfIn0sb3B0aW1pemF0aW9uU2VsZWN0ZWQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJjdXN0b20iLG9ic2VydmVyOiJvcHRpbWl6YXRpb25TZWxlY3RlZENoYW5nZWRfIn0sY29tcGFyZVRpdGxlOnt0eXBlOlN0cmluZyx2YWx1ZToiQXR0cmlidXRpb24gdmFsdWUocykifSxhdHRyaWJ1dGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LGdsb2JhbFBkUGxvdHM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sbnVtTW9kZWxzOnt0eXBlOk51bWJlcixyZWFkT25seTohMH0sc2hvd05lYXJlc3RDb3VudGVyZmFjdHVhbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxzZWxlY3RlZEZlYXR1cmVTb3J0Ont0eXBlOlN0cmluZyx2YWx1ZToiQ291bnQiLG9ic2VydmVyOiJzZWxlY3RlZEZlYXR1cmVTb3J0Q2hhbmdlZF8ifSxwZFBsb3RDb2xvcnM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltkMy5jb2xvcigicmdiKDMxLCAxMTksIDE4MCkiKSxkMy5jb2xvcigicmdiKDI1NSwgMTI3LCAxNCkiKSwKZDMuY29sb3IoInJnYig0NCwgMTYwLCA0NCkiKSxkMy5jb2xvcigicmdiKDIxNCwgMzksIDQwKSIpLGQzLmNvbG9yKCJyZ2IoMTQ4LCAxMDMsIDE4OSkiKSxkMy5jb2xvcigicmdiKDE0MCwgODYsIDc1KSIpLGQzLmNvbG9yKCJyZ2IoMjI3LCAxMTksIDE5NCkiKSxkMy5jb2xvcigicmdiKDEyNywgMTI3LCAxMjcpIiksZDMuY29sb3IoInJnYigxODgsIDE4OSwgMzQpIiksZDMuY29sb3IoInJnYigyMywgMTkwLCAyMDcpIildfSxwZFBsb3RUcmFuc3BhcmVudENvbG9yczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W2QzLmNvbG9yKCJyZ2JhKDMxLCAxMTksIDE4MCwgMC4zKSIpLGQzLmNvbG9yKCJyZ2JhKDI1NSwgMTI3LCAxNCwgMC4zKSIpLGQzLmNvbG9yKCJyZ2JhKDQ0LCAxNjAsIDQ0LCAwLjMpIiksZDMuY29sb3IoInJnYmEoMjE0LCAzOSwgNDAsIDAuMykiKSxkMy5jb2xvcigicmdiYSgxNDgsIDEwMywgMTg5LCAwLjMpIiksZDMuY29sb3IoInJnYmEoMTQwLCA4NiwgNzUsIDAuMykiKSwKZDMuY29sb3IoInJnYmEoMjI3LCAxMTksIDE5NCwgMC4zKSIpLGQzLmNvbG9yKCJyZ2JhKDEyNywgMTI3LCAxMjcsIDAuMykiKSxkMy5jb2xvcigicmdiYSgxODgsIDE4OSwgMzQsIDAuMykiKSxkMy5jb2xvcigicmdiYSgyMywgMTkwLCAyMDcsIDAuMykiKV19LHJvY0N1cnZlQ29sb3JzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bZDMuY29sb3IoInJnYigxOCwgMTgxLCAyMDYpIiksZDMuY29sb3IoInJnYigyNTAsIDEyMCwgMjMpIildfSxyb2NDdXJ2ZUxpbmVDb2xvcnM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltkMy5jb2xvcigicmdiYSgxOCwgMTgxLCAyMDYsIDAuNikiKSxkMy5jb2xvcigicmdiYSgyNTAsIDEyMCwgMjMsIDAuNikiKV19LGNvbmZNYXRyaXhDb2xvcnM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltkMy5jb2xvcigicmdiKDE4LCAxODEsIDIwNikiKSxkMy5jb2xvcigicmdiKDI1MCwgMTIwLCAyMykiKV19LGFsbENvbmZNYXRyaXhMYWJlbHM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PgpbXX0sbG9hZGluZ0JhckhpZGRlbl86e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0saXNTb3J0aW5nRWxpZ2libGVGZWF0dXJlczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxleGFtcGxlRmVhdHVyZVNvcnRPcmRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6ImF0dHJpYnV0aW9uIn0sZmVhdHVyZUJ1Y2tldEVkZ2VzXzp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9fSxvYnNlcnZlcnM6WyJzZXRGYWNldERpc3RGZWF0dXJlTmFtZShmYWNldERpc3RTd2l0Y2gsIHNlbGVjdGVkKSIsIm5lYXJlc3RDb3VudGVyZmFjdHVhbFN0YXR1c0NoYW5nZWRfKHNob3dOZWFyZXN0Q291bnRlcmZhY3R1YWwsIG5lYXJlc3RDb3VudGVyZmFjdHVhbE1vZGVsSW5kZXgsIG5lYXJlc3RDb3VudGVyZmFjdHVhbERpc3QsIG1pbkNvdW50ZXJmYWN0dWFsVmFsdWVEaXN0KSJdLHJlbG9hZDpmdW5jdGlvbigpe30sb3BlbkRpYWxvZzpmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpO2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcigicGFwZXItZGlhbG9nIikub3BlbigpfSwKcmVhZHk6ZnVuY3Rpb24oKXtjb25zdCBhPWQzLnNlbGVjdCh0aGlzLiQuc2lkZSksYz1kMy5zZWxlY3QodGhpcy4kLmNlbnRlciksZD10aGlzLiQucmVzaXplcixmPXRoaXMsZz1kMy5kcmFnKCkub24oImRyYWciLCgpPT57bGV0IGw9ZDMubW91c2UoZC5wYXJlbnROb2RlLnBhcmVudE5vZGUpWzBdL2QucGFyZW50Tm9kZS5wYXJlbnROb2RlLm9mZnNldFdpZHRoKjEwMDtsPU1hdGgubWF4KGwsMjApO2Muc3R5bGUoIndpZHRoIiwxMDAtbCsiJSIpO2Euc3R5bGUoIndpZHRoIixsKyIlIik7Zi4kLmRpdmUuJC52aXMuX3VwZGF0ZUdyaWRGYWNldGluZygpO2YuJC5kaXZlLiQudmlzLl9vbklyb25SZXNpemUoKX0pO2QzLnNlbGVjdChkKS5jYWxsKGcpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoUW8uZ2V0Um91dGVyKCkucGx1Z2luc0xpc3RpbmcoKSkudGhlbihhPT57IndoYXRpZiJpbiBhP3RoaXMuJC5pbml0aWFsRGlhbG9nLmNsb3NlRGlhbG9nKCk6Cih0aGlzLiQuaW5mZXJlbmNlc2V0dGluZ3MuY2xvc2UoKSx0aGlzLiQuaW5pdGlhbERpYWxvZy5vcGVuTm9UZW5zb3JGbG93RGlhbG9nKCkpfSl9LHNldHRpbmdzQ2xpY2tlZF86ZnVuY3Rpb24oKXt0aGlzLiQuaW5mZXJlbmNlc2V0dGluZ3MudG9nZ2xlKCl9LGxvY2FsQ2hhbmdlZF86ZnVuY3Rpb24oKXt0aGlzLmxvY2FsJiZ0aGlzLmNsb3NlU2V0dGluZ3NfKCl9LG1vZGVsTmFtZUNoYW5nZWRfOmZ1bmN0aW9uKCl7dGhpcy5wYXJzZWRNb2RlbE5hbWVzPXRoaXMubW9kZWxOYW1lLnNwbGl0KCIsIikubWFwKGE9PmEudHJpbSgpKTtmb3IobGV0IGE9MDthPHRoaXMucGFyc2VkTW9kZWxOYW1lcy5sZW5ndGg7YSsrKXtjb25zdCBjPXRoaXMucGFyc2VkTW9kZWxOYW1lc1thXTtmb3IobGV0IGQ9YSsxO2Q8dGhpcy5wYXJzZWRNb2RlbE5hbWVzLmxlbmd0aDtkKyspdGhpcy5wYXJzZWRNb2RlbE5hbWVzW2RdPT1jJiYodGhpcy5wYXJzZWRNb2RlbE5hbWVzW2FdPWMrIiAiKyhhKzEpLHRoaXMucGFyc2VkTW9kZWxOYW1lc1tkXT0KYysiICIrKGQrMSkpfX0sY2xvc2VTZXR0aW5nc186ZnVuY3Rpb24oKXt0aGlzLiQuaW5mZXJlbmNlc2V0dGluZ3MuY2xvc2UoKX0sc2hvd0Rpc3RhbmNlQ2xpY2tlZF86ZnVuY3Rpb24oKXt0aGlzLiQuZGlzdGFuY2VkaWFsb2cudG9nZ2xlKCl9LGN1c3RvbURpc3RhbmNlRnVuY3Rpb25TZXRDaGFuZ2VkXzpmdW5jdGlvbigpe3RoaXMuZmFjZXREaXN0U3dpdGNoPXRoaXMuY3VzdG9tRGlzdGFuY2VGdW5jdGlvblNldD90aGlzLm5lYXJlc3RDb3VudGVyZmFjdHVhbERpc3Q9IkN1c3RvbSI6dGhpcy5uZWFyZXN0Q291bnRlcmZhY3R1YWxEaXN0PSJMMSJ9LHJlcXVlc3RBZGREaXN0YW5jZU1ldHJpYzpmdW5jdGlvbigpe2NvbnN0IGE9dGhpcy5zZWxlY3RlZFswXSxjPXtjYWxsYmFja1BhcmFtczp7ZmVhdHVyZU5hbWU6dGhpcy5mYWNldERpc3RGZWF0dXJlTmFtZX0sZGlzdGFuY2VQYXJhbXM6e319O2lmKHRoaXMubG9jYWwmJnRoaXMuY3VzdG9tRGlzdGFuY2VGdW5jdGlvblNldCl0aGlzLnJlcXVlc3REaXN0YW5jZVdpdGhDYWxsYmFjayhhLAoxLGMpO2Vsc2V7Y29uc3QgZD1bXSxmPSJMMiI9PXRoaXMuZmFjZXREaXN0U3dpdGNoO2ZvcihsZXQgZz0wO2c8dGhpcy52aXNkYXRhLmxlbmd0aDtnKyspZC5wdXNoKHRoaXMuZ2V0RGlzdCh0aGlzLnZpc2RhdGFbYV0sdGhpcy52aXNkYXRhW2ddLGYpKTt0aGlzLmZpbmFsaXplQWRkRGlzdGFuY2VNZXRyaWMoYSxkLGMuY2FsbGJhY2tQYXJhbXMpfX0saW52b2tlQ3VzdG9tRGlzdGFuY2VDYWxsYmFjazpmdW5jdGlvbihhKXtzd2l0Y2goYS5mdW5JZCl7Y2FzZSAwOnRoaXMuZmluYWxpemVDbG9zZXN0Q291bnRlcmZhY3R1YWwoYS5leEluZCxhLmRpc3RhbmNlcyxhLnBhcmFtcyk7YnJlYWs7Y2FzZSAxOnRoaXMuZmluYWxpemVBZGREaXN0YW5jZU1ldHJpYyhhLmV4SW5kLGEuZGlzdGFuY2VzLGEucGFyYW1zKX19LGZpbmFsaXplQWRkRGlzdGFuY2VNZXRyaWM6ZnVuY3Rpb24oYSxjLGQpe2E9ZC5mZWF0dXJlTmFtZTt0aGlzLmZhY2V0RGlzdEZlYXR1cmVOYW1lcy5wdXNoKGEpO2ZvcihkPQowO2Q8dGhpcy52aXNkYXRhLmxlbmd0aDtkKyspdGhpcy52aXNkYXRhW2RdW2FdPWNbZF07dGhpcy5yZWZyZXNoRGl2ZV8oKTsiY29sb3JCeSI9PXRoaXMuZmFjZXREaXN0U2V0dGluZz90aGlzLiQuZGl2ZS5jb2xvckJ5PWE6InZlcnRpY2FsRmFjZXQiPT10aGlzLmZhY2V0RGlzdFNldHRpbmc/dGhpcy4kLmRpdmUudmVydGljYWxGYWNldD1hOiJob3Jpem9udGFsRmFjZXQiPT10aGlzLmZhY2V0RGlzdFNldHRpbmc/dGhpcy4kLmRpdmUuaG9yaXpvbnRhbEZhY2V0PWE6InZlcnRpY2FsUG9zaXRpb24iPT10aGlzLmZhY2V0RGlzdFNldHRpbmc/dGhpcy4kLmRpdmUudmVydGljYWxQb3NpdGlvbj1hOiJob3Jpem9udGFsUG9zaXRpb24iPT10aGlzLmZhY2V0RGlzdFNldHRpbmcmJih0aGlzLiQuZGl2ZS5ob3Jpem9udGFsUG9zaXRpb249YSl9LHNldEZhY2V0RGlzdEZlYXR1cmVOYW1lOmZ1bmN0aW9uKGEsYyl7dGhpcy5mYWNldERpc3RGZWF0dXJlTmFtZT0iICIrYSsiIGRpc3RhbmNlIHRvIGRhdGFwb2ludCAiKwpjWzBdfSxuZWFyZXN0Q291bnRlcmZhY3R1YWxTdGF0dXNDaGFuZ2VkXzpmdW5jdGlvbihhKXthPyh0aGlzLmZpbmRDbG9zZXN0Q291bnRlcmZhY3R1YWxfKCksdGhpcy5jb21wYXJlVGl0bGU9IkNvdW50ZXJmYWN0dWFsIHZhbHVlKHMpIik6KHRoaXMuY29tcGFyZVRpdGxlPSJBdHRyaWJ1dGlvbiB2YWx1ZShzKSIsdGhpcy5jb21wYXJlZEluZGljZXM9W10sdGhpcy5jb3VudGVyZmFjdHVhbEV4YW1wbGVBbmRJbmZlcmVuY2U9bnVsbCx0aGlzLnJlZnJlc2hTZWxlY3RlZERhdGFwb2ludF8oKSl9LHJlZnJlc2hTZWxlY3RlZERhdGFwb2ludF86ZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMuc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlO3RoaXMuc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlPW51bGw7dGhpcy5zZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2U9YX0saXNTYW1lSW5mZXJlbmNlQ2xhc3NfOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuaXNSZWdyZXNzaW9uXyh0aGlzLm1vZGVsVHlwZSk/Ck1hdGguYWJzKGEtYyk8dGhpcy5taW5Db3VudGVyZmFjdHVhbFZhbHVlRGlzdDphPT09Y30sYWRqdXN0TWF4Q291bnRlcmZhY3R1YWxWYWx1ZURpc3RfOmZ1bmN0aW9uKGEsYyl7dGhpcy5tYXhDb3VudGVyZmFjdHVhbFZhbHVlRGlzdD1NYXRoLm1heCh0aGlzLnN0YXRzW2NdLm51bWJlck1heC10aGlzLnZpc2RhdGFbYV1bY10sdGhpcy52aXNkYXRhW2FdW2NdLXRoaXMuc3RhdHNbY10ubnVtYmVyTWluKX0sYWRqdXN0TWluQ291bnRlcmZhY3R1YWxWYWx1ZURpc3RfOmZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLmRpc3RhbmNlU3RhdHNfW3RoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2UgdmFsdWUiLHRoaXMubmVhcmVzdENvdW50ZXJmYWN0dWFsTW9kZWxJbmRleCldO3RoaXMubWluQ291bnRlcmZhY3R1YWxWYWx1ZURpc3Q9YT9hLnN0ZERldjowfSxmaW5hbGl6ZUNsb3Nlc3RDb3VudGVyZmFjdHVhbDpmdW5jdGlvbihhLGMpe2NvbnN0IGQ9dGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiIEluZmVyZW5jZSB2YWx1ZSIsCnRoaXMubmVhcmVzdENvdW50ZXJmYWN0dWFsTW9kZWxJbmRleCk7dGhpcy5pc1JlZ3Jlc3Npb25fKHRoaXMubW9kZWxUeXBlKSYmdGhpcy5hZGp1c3RNYXhDb3VudGVyZmFjdHVhbFZhbHVlRGlzdF8oYSxkKTtsZXQgZj1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksZz0tMTtmb3IobGV0IGw9MDtsPHRoaXMudmlzZGF0YS5sZW5ndGg7bCsrKXtpZihsPT09YXx8dGhpcy5pc1NhbWVJbmZlcmVuY2VDbGFzc18odGhpcy52aXNkYXRhW2FdW2RdLHRoaXMudmlzZGF0YVtsXVtkXSkpY29udGludWU7bGV0IGs9Y1tsXTtrPGYmJihmPWssZz1sKX0tMSE9ZyYmKHRoaXMuY29tcGFyZWRJbmRpY2VzPVtnXSx0aGlzLmNvdW50ZXJmYWN0dWFsRXhhbXBsZUFuZEluZmVyZW5jZT10aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1tnXSl9LGZpbmRDbG9zZXN0Q291bnRlcmZhY3R1YWxfOmZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLnNlbGVjdGVkWzBdO2lmKHRoaXMubG9jYWwmJnRoaXMuY3VzdG9tRGlzdGFuY2VGdW5jdGlvblNldCl0aGlzLnJlcXVlc3REaXN0YW5jZVdpdGhDYWxsYmFjayhhLAowLHtjYWxsYmFja1BhcmFtczp7fSxkaXN0YW5jZVBhcmFtczp7fX0pO2Vsc2V7dmFyIGM9dGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiIEluZmVyZW5jZSB2YWx1ZSIsdGhpcy5uZWFyZXN0Q291bnRlcmZhY3R1YWxNb2RlbEluZGV4KTt0aGlzLmlzUmVncmVzc2lvbl8odGhpcy5tb2RlbFR5cGUpJiZ0aGlzLmFkanVzdE1heENvdW50ZXJmYWN0dWFsVmFsdWVEaXN0XyhhLGMpO3ZhciBkPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxmPS0xO2ZvcihsZXQgZz0wO2c8dGhpcy52aXNkYXRhLmxlbmd0aDtnKyspe2lmKGc9PT1hfHx0aGlzLmlzU2FtZUluZmVyZW5jZUNsYXNzXyh0aGlzLnZpc2RhdGFbYV1bY10sdGhpcy52aXNkYXRhW2ddW2NdKSljb250aW51ZTtsZXQgbD10aGlzLmdldERpc3QodGhpcy52aXNkYXRhW2FdLHRoaXMudmlzZGF0YVtnXSwiTDIiPT10aGlzLm5lYXJlc3RDb3VudGVyZmFjdHVhbERpc3QpO2w8ZCYmKGQ9bCxmPWcpfS0xIT1mJiYodGhpcy5jb21wYXJlZEluZGljZXM9CltmXSx0aGlzLmNvdW50ZXJmYWN0dWFsRXhhbXBsZUFuZEluZmVyZW5jZT10aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1tmXSx0aGlzLmNvbXBhcmVUaXRsZT0iQ291bnRlcmZhY3R1YWwgdmFsdWUocykiKX19LHJlcXVlc3REaXN0YW5jZVdpdGhDYWxsYmFjazpmdW5jdGlvbihhLGMsZCl7dGhpcy5maXJlKCJjb21wdXRlLWN1c3RvbS1kaXN0YW5jZSIse2luZGV4OmEsY2FsbGJhY2s6YyxwYXJhbXM6ZH0pfSxnZXREaXN0OmZ1bmN0aW9uKGEsYyxkKXtsZXQgZj0wO2NvbnN0IGc9Wy4uLm5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGEpLC4uLk9iamVjdC5rZXlzKGMpXSldO2ZvcihsZXQgaz0wO2s8Zy5sZW5ndGg7aysrKXt2YXIgbD1nW2tdO2lmKHRoaXMuaXNDb21wdXRlZEtleVN0cl8obCl8fGw9PXRoaXMuc2VsZWN0ZWRMYWJlbEZlYXR1cmV8fHRoaXMuc3RhdHNbbF0udW5pcXVlQ291bnQ9PXRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzLmxlbmd0aHx8dGhpcy5pc0F0dHJpYnV0aW9uS2V5U3RyXyhsKSljb250aW51ZTsKbGV0IG49YVtsXSxwPWNbbF07QXJyYXkuaXNBcnJheShuKXx8KG49W25dKTtBcnJheS5pc0FycmF5KHApfHwocD1bcF0pO2NvbnN0IHE9TWF0aC5tYXgobi5sZW5ndGgscC5sZW5ndGgpO2xldCByPTA7Zm9yKGxldCB0PTA7dDxxO3QrKylyPXRoaXMuZGlzdGFuY2VTdGF0c19bbF0uaXNOdW1lcmljP3IrdGhpcy5nZXROdW1lcmljRGlzdChuW3RdLHBbdF0sdGhpcy5kaXN0YW5jZVN0YXRzX1tsXSk6cit0aGlzLmdldENhdGVnb3JpY2FsRGlzdChuW3RdLHBbdF0sdGhpcy5kaXN0YW5jZVN0YXRzX1tsXSk7bD1yL3E7ZCYmKGwqPWwpO2YrPWx9cmV0dXJuIGZ9LGdldE51bWVyaWNEaXN0OmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gbnVsbD09YXx8bnVsbD09Yz8xOmQuc3RkRGV2P01hdGguYWJzKChhLWMpL2Quc3RkRGV2KTowfSxnZXRDYXRlZ29yaWNhbERpc3Q6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiBudWxsPT1hfHxudWxsPT1jPzE6YT09Yz8wOmQucHJvYlNhbWVWYWx1ZX0sdmlzTW9kZUNoYW5nZWRfOmZ1bmN0aW9uKGEpeyJkaXZlIj09CmE/dGhpcy5oaWRlUGFydGlhbERlcGVuZGVuY2VQbG90c18oKTp0aGlzLnNob3dQYXJ0aWFsRGVwZW5kZW5jZVBsb3RzXygpfSxoaWRlUGFydGlhbERlcGVuZGVuY2VQbG90c186ZnVuY3Rpb24oKXt0aGlzLiQucGFydGlhbHBsb3Rob2xkZXIuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNob3dQYXJ0aWFsRGVwZW5kZW5jZVBsb3RzXzpmdW5jdGlvbigpe3RoaXMuJC5wYXJ0aWFscGxvdGhvbGRlci5zdHlsZS5kaXNwbGF5PSJmbGV4IjtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PnRoaXMucG9wdWxhdGVQZFRhYnMoKSl9LGFyZVRoZXJlUGRQbG90RmVhdHVyZXNfOmZ1bmN0aW9uKGEpe3JldHVybiBhJiYwPGEubGVuZ3RofSxzZWxlY3RlZEluZGljZXNDaGFuZ2VkXzpmdW5jdGlvbihhKXt0aGlzLnNlbGVjdGVkPWEuZGV0YWlsLnZhbHVlO3RoaXMuc2V0QXR0cmlidXRpb25zKCk7dGhpcy5zZWxlY3RlZERhdGFVcGRhdGVkXygpO3RoaXMuc2hvd05lYXJlc3RDb3VudGVyZmFjdHVhbCYmMCE9CnRoaXMuc2VsZWN0ZWQubGVuZ3RoP3RoaXMuZmluZENsb3Nlc3RDb3VudGVyZmFjdHVhbF8oKTp0aGlzLmNvbXBhcmVkSW5kaWNlcz1bXX0sc2VsZWN0TmV4dERhdGFwb2ludF86ZnVuY3Rpb24oKXt0aGlzLiQuZGl2ZS5zZWxlY3RlZEluZGljZXM9Wyh0aGlzLnNlbGVjdGVkWzBdKzEpJXRoaXMudmlzZGF0YS5sZW5ndGhdfSxzZWxlY3RQcmV2RGF0YXBvaW50XzpmdW5jdGlvbigpe3RoaXMuJC5kaXZlLnNlbGVjdGVkSW5kaWNlcz1bKCh0aGlzLnNlbGVjdGVkWzBdLTEpJXRoaXMudmlzZGF0YS5sZW5ndGgrdGhpcy52aXNkYXRhLmxlbmd0aCkldGhpcy52aXNkYXRhLmxlbmd0aF19LHNlbGVjdGVkRXhhbXBsZUlucHV0Q2hhbmdlZF86ZnVuY3Rpb24oYSl7bnVsbCE9YSYmIiIhPWEmJihhPSthLGlzTmFOKGEpfHwwPmF8fGE+PXRoaXMudmlzZGF0YS5sZW5ndGh8fCh0aGlzLiQuZGl2ZS5zZWxlY3RlZEluZGljZXM9W2FdKSl9LHNldEV4YW1wbGVDb2xsYXBzZWRfOmZ1bmN0aW9uKCl7dGhpcy5leGFtcGxlRGlzcGxheU1vZGU9CiJncmlkIjt0aGlzLiQkKCIjdmlld2VyIikuZXhwYW5kZWRGZWF0dXJlcz17fTt0aGlzLiQkKCIjdmlld2VyIikuZXhwYW5kQWxsRmVhdHVyZXM9ITE7dGhpcy4kJCgiI3ZpZXdlciIpLnJlZnJlc2hFeGFtcGxlVmlld2VyKCl9LHNldEV4YW1wbGVTaG93XzpmdW5jdGlvbigpe3RoaXMuZXhhbXBsZURpc3BsYXlNb2RlPSJncmlkIjt0aGlzLiQkKCIjdmlld2VyIikuZXhwYW5kQWxsRmVhdHVyZXM9ITB9LHNldEV4YW1wbGVFeHBhbmRlZF86ZnVuY3Rpb24oKXt0aGlzLmV4YW1wbGVEaXNwbGF5TW9kZT0ic3RhY2tlZCI7dGhpcy4kJCgiI3ZpZXdlciIpLmV4cGFuZEFsbEZlYXR1cmVzPSEwfSxzdGF0c0NoYW5nZWRfOmZ1bmN0aW9uKGEpe3RoaXMuc3RhdHM9YS5kZXRhaWwudmFsdWV9LGlzQmluYXJ5Q2xhc3NpZmljYXRpb25fOmZ1bmN0aW9uKGEsYyl7cmV0dXJuImNsYXNzaWZpY2F0aW9uIj09YSYmIWN9LGlzTXVsdGlDbGFzc186ZnVuY3Rpb24oYSxjKXtyZXR1cm4iY2xhc3NpZmljYXRpb24iPT0KYSYmY30saXNSZWdyZXNzaW9uXzpmdW5jdGlvbihhKXtyZXR1cm4icmVncmVzc2lvbiI9PWF9LHNob3VsZFNob3dGZWF0dXJlRHJvcGRvd25fOmZ1bmN0aW9uKGEpe3JldHVybiBhJiYwPE9iamVjdC5rZXlzKGEpLmxlbmd0aH0sc2hvdWxkU2hvd1NlY29uZEZlYXR1cmVEcm9wZG93bl86ZnVuY3Rpb24oYSl7cmV0dXJuIiIhPWF9LHNob3VsZFNob3dMYWJlbERyb3Bkb3duXzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmMDxPYmplY3Qua2V5cyhhKS5sZW5ndGh9LHNob3VsZEhpZGVNb2RlbFNlbGVjdG9yXzpmdW5jdGlvbihhKXtyZXR1cm4hKGEmJjE8YS5sZW5ndGgpfSxzaG91bGRTaG93T3ZlcmFsbFBlcmZDaGFydHNfOmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4iIiE9YSYmIiI9PWMmJm51bGwhPWR9LHNob3VsZFNob3dGZWF0dXJlUGVyZkNoYXJ0c186ZnVuY3Rpb24oYSxjLGQpe3JldHVybiIiIT1hJiYiIiE9YyYmbnVsbCE9ZH0sc2hvdWxkU2hvd0Nvc3RSYXRpb186ZnVuY3Rpb24oYSxjLApkKXtyZXR1cm4iIiE9YSYmdGhpcy5pc0JpbmFyeUNsYXNzaWZpY2F0aW9uXyhjLGQpfSxhcmVQYXJ0aWFsRGVwZW5kZW5jZVBsb3RzRW5hYmxlZF86ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmhhc1NlbGVjdGVkKGEpJiZ0aGlzLmFyZUV4YW1wbGVzRWRpdGFibGVfKGMsZCl9LGhhc1NlbGVjdGVkOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hfSxnZXRGZWF0dXJlTGlzdF86ZnVuY3Rpb24oYSl7YT1PYmplY3Qua2V5cyhhKS5maWx0ZXIoYz0+IXRoaXMuaXNDb21wdXRlZEtleVN0cl8oYykpLnNvcnQoKTthLnB1c2goIiIpO3JldHVybiBhfSxzdHJTdGFydHNXaXRoXzpmdW5jdGlvbihhLGMpe3JldHVybiAwPT1hLmxhc3RJbmRleE9mKGMsMCl9LGdldE1vZGVsTmFtZV86ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucGFyc2VkTW9kZWxOYW1lc1thXX0sc3RyV2l0aE1vZGVsTmFtZV86ZnVuY3Rpb24oYSxjKXtyZXR1cm4gMTx0aGlzLm51bU1vZGVscz9hKyIgIit0aGlzLmdldE1vZGVsTmFtZV8oYyk6CmF9LGF0dHJpYnV0aW9uU3RyV2l0aE1vZGVsTmFtZV86ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5oYXNNdWx0aXBsZU1vZGVsQXR0cmlidXRpb25zXyh0aGlzLmF0dHJpYnV0aW9ucyk/YSsiICIrdGhpcy5nZXRNb2RlbE5hbWVfKGMpOmF9LHVwZGF0ZU51bWJlck9mTW9kZWxzOmZ1bmN0aW9uKCl7dGhpcy5fc2V0TnVtTW9kZWxzKHRoaXMubW9kZWxOYW1lLnNwbGl0KCIsIikubGVuZ3RoKTt0aGlzLnNlbGVjdGVkU2Vjb25kQnJlYWtkb3duRmVhdHVyZT10aGlzLnNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZT10aGlzLnNlbGVjdGVkTGFiZWxGZWF0dXJlPSIiO2NvbnN0IGE9W107Zm9yKGxldCBjPTA7Yzx0aGlzLm51bU1vZGVscztjKyspYS5wdXNoKHt0aHJlc2hvbGQ6LjV9KTt0aGlzLnNldCgib3ZlcmFsbFRocmVzaG9sZHMiLGEpO3RoaXMuc2hvdWxkRGlzYWJsZUluZmVyQnV0dG9uXyh0aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlcyx0aGlzLm1vZGVsTmFtZSx0aGlzLmluZmVyZW5jZUFkZHJlc3MsCnRoaXMudXBkYXRlZEV4YW1wbGUpfHx0aGlzLmluZmVyQ2xpY2tlZF8oKX0saXNDb21wdXRlZEtleVN0cl86ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc3RyU3RhcnRzV2l0aF8oYSwiIEluZmVyZW5jZSB2YWx1ZSIpfHx0aGlzLnN0clN0YXJ0c1dpdGhfKGEsIiBJbmZlcmVuY2UgbGFiZWwiKXx8dGhpcy5zdHJTdGFydHNXaXRoXyhhLCIgSW5mZXJlbmNlIGNvcnJlY3QiKXx8dGhpcy5zdHJTdGFydHNXaXRoXyhhLCIgSW5mZXJlbmNlIGVycm9yIil8fHRoaXMuc3RyU3RhcnRzV2l0aF8oYSwiIEluZmVyZW5jZSBzY29yZSIpfHx0aGlzLnN0clN0YXJ0c1dpdGhfKGEsIiBJbmZlcmVuY2UgYWJzb2x1dGUgZXJyb3IiKXx8dGhpcy5zdHJTdGFydHNXaXRoXyhhLCIgSW5mZXJlbmNlIHNxdWFyZWQgZXJyb3IiKXx8IiBEYXRhcG9pbnQgSUQiPT1hfHwtMSE9dGhpcy5mYWNldERpc3RGZWF0dXJlTmFtZXMuaW5kZXhPZihhKX0saXNBdHRyaWJ1dGlvbktleVN0cl86ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc3RyU3RhcnRzV2l0aF8oYSwKImF0dHJpYnV0aW9uc19fIil9LGdldFNsaWNlS2V5XzpmdW5jdGlvbihhLGMsZCl7ZnVuY3Rpb24gZihsKXtpZihsJiZ2b2lkIDA9PT1hW2xdKXJldHVybiI/Ijtjb25zdCBrPWdbbF07aWYoaylmb3IobGV0IG49MTtuPGsubGVuZ3RoO24rKylpZihhW2xdPGtbbl18fGFbbF09PT1rW25dJiZuPT09ay5sZW5ndGgtMSlyZXR1cm4iWyIra1tuLTFdKyIsICIra1tuXSsobjxrLmxlbmd0aC0xPyIpIjoiXSIpO3JldHVybiBhW2xdfWNvbnN0IGc9dGhpcy5mZWF0dXJlQnVja2V0RWRnZXNfO3JldHVybiB0aGlzLmNyZWF0ZUNvbWJpbmVkVmFsdWVTdHJpbmdfKGYoYyksZihkKSl9LGJyZWFrZG93bkZlYXR1cmVTZWxlY3RlZF86ZnVuY3Rpb24oKXt0aGlzLnJlc2V0T3B0aW1pemF0aW9uU2VsZWN0ZWRfKCk7IiI9PXRoaXMuc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlJiYodGhpcy5zZWxlY3RlZFNlY29uZEJyZWFrZG93bkZlYXR1cmU9IiIpO3RoaXMuY2FsY3VsYXRlQnVja2V0RWRnZXNfKHRoaXMuc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlLAp0aGlzLm51bVByaW1hcnlCdWNrZXRzKTt0aGlzLmNhbGN1bGF0ZUJ1Y2tldEVkZ2VzXyh0aGlzLnNlbGVjdGVkU2Vjb25kQnJlYWtkb3duRmVhdHVyZSx0aGlzLm51bVNlY29uZGFyeUJ1Y2tldHMpO2NvbnN0IGE9W10sYz17fTt0aGlzLnZpc2RhdGEuZm9yRWFjaChkPT57Y29uc3QgZj10aGlzLmdldFNsaWNlS2V5XyhkLHRoaXMuc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlKTtkPXRoaXMuZ2V0U2xpY2VLZXlfKGQsdGhpcy5zZWxlY3RlZFNlY29uZEJyZWFrZG93bkZlYXR1cmUpO2NvbnN0IGc9dGhpcy5jcmVhdGVDb21iaW5lZFZhbHVlU3RyaW5nXyhmLGQpO2cgaW4gY3x8KGEucHVzaCh7dmFsdWU6Zix2YWx1ZTI6ZCx0aHJlc2hvbGQ6V3QodGhpcy5vdmVyYWxsVGhyZXNob2xkcyksb3BlbmVkOiExfSksY1tnXT1hLmxlbmd0aC0xKX0pO3RoaXMuc2V0KCJmZWF0dXJlVmFsdWVUaHJlc2hvbGRzIixhKTt0aGlzLnJlZnJlc2hJbmZlcmVuY2VzXyghMSl9LGZlYXR1cmVWYWx1ZVRocmVzaG9sZHNDaGFuZ2VkXzpmdW5jdGlvbihhKXtjb25zdCBjPQp7fTtmb3IobGV0IGQ9MDtkPGEubGVuZ3RoO2QrKyljW3RoaXMuY3JlYXRlQ29tYmluZWRWYWx1ZVN0cmluZ18oYVtkXS52YWx1ZSxhW2RdLnZhbHVlMildPWQ7dGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzSW5kZXhNYXA9Y30sbGFiZWxGZWF0dXJlU2VsZWN0ZWRfOmZ1bmN0aW9uKCl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy51cGRhdGVJbmZlcmVuY2VTdGF0c18oITApO3RoaXMucmVmcmVzaERpdmVfKCl9KX0sc2lkZVRhYlNlbGVjdGVkQ2hhbmdlZF86ZnVuY3Rpb24oYSl7aWYoMT09YSlyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pnt0aGlzLnVwZGF0ZUluZmVyZW5jZVN0YXRzXyghMCl9KTtlbHNlIGlmKDI9PWEpe2E9dGhpcy4kLm92ZXJ2aWV3LnF1ZXJ5U2VsZWN0b3JBbGwoImZhY2V0cy1vdmVydmlldy10YWJsZSIpO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKWFbY10uX2hhbmRsZVJlc2l6ZSgpfX0sdXBkYXRlSW5mZXJlbmNlU3RhdHNfOmZ1bmN0aW9uKGEpe2lmKHRoaXMuaW5mZXJlbmNlU3RhdHNfJiYKdGhpcy52aXNkYXRhJiYiIiE9dGhpcy5zZWxlY3RlZExhYmVsRmVhdHVyZSYmMCE9dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXMubGVuZ3RoJiZudWxsIT10aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1swXS5pbmZlcmVuY2VzJiZ0aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1swXS5pbmZlcmVuY2VzWzBdLmxlbmd0aD09dGhpcy5udW1Nb2RlbHMmJih0aGlzLmluZmVyZW5jZVN0YXRzXy5sZW5ndGg9PXRoaXMubnVtTW9kZWxzfHxhKSl7aWYoYSl7dmFyIGM9W10sZD1bXTtmb3IodmFyIGY9MDtmPHRoaXMubnVtTW9kZWxzO2YrKyl7dmFyIGc9e307aWYodGhpcy5pc0JpbmFyeUNsYXNzaWZpY2F0aW9uXyh0aGlzLm1vZGVsVHlwZSx0aGlzLm11bHRpQ2xhc3MpKXtnLnRocmVzaG9sZHM9W107Zm9yKHZhciBsPTA7MTAxPmw7bCsrKWcudGhyZXNob2xkcy5wdXNoKHtUUDowLEZQOjAsRk46MCxUTjowfSk7Zy5mYWNldGVkPXt9O2ZvcihsPTA7bDx0aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlcy5sZW5ndGg7bCsrKXt2YXIgaz0KdGhpcy52aXNkYXRhW2xdLG49bnVsbDtpZigiIiE9dGhpcy5zZWxlY3RlZEJyZWFrZG93bkZlYXR1cmUpe3ZhciBwPXRoaXMuZ2V0U2xpY2VLZXlfKGssdGhpcy5zZWxlY3RlZEJyZWFrZG93bkZlYXR1cmUsdGhpcy5zZWxlY3RlZFNlY29uZEJyZWFrZG93bkZlYXR1cmUpO249Zy5mYWNldGVkW3BdO2lmKCFuKXtnLmZhY2V0ZWRbcF09W107Zm9yKG49MDsxMDE+bjtuKyspZy5mYWNldGVkW3BdLnB1c2goe1RQOjAsRlA6MCxGTjowLFROOjB9KTtuPWcuZmFjZXRlZFtwXX19cD10aGlzLmdldENsYXNzaWZpY2F0aW9uQmVzdE5vblplcm8obCxmKTtmb3IodmFyIHE9MDsxMDA+PXEmJiEocT4xMDAqcC5zY29yZSk7cSsrKStrW3RoaXMuc2VsZWN0ZWRMYWJlbEZlYXR1cmVdPT0rcC5sYWJlbD8oZy50aHJlc2hvbGRzW3FdLlRQKz0xLG4mJihuW3FdLlRQKz0xKSk6KGcudGhyZXNob2xkc1txXS5GUCs9MSxuJiYobltxXS5GUCs9MSkpO2Zvcig7MTAwPj1xO3ErKyludWxsPT1rW3RoaXMuc2VsZWN0ZWRMYWJlbEZlYXR1cmVdfHwKMD09K2tbdGhpcy5zZWxlY3RlZExhYmVsRmVhdHVyZV0/KGcudGhyZXNob2xkc1txXS5UTis9MSxuJiYobltxXS5UTis9MSkpOihnLnRocmVzaG9sZHNbcV0uRk4rPTEsbiYmKG5bcV0uRk4rPTEpKX10aGlzLmFsbENvbmZNYXRyaXhMYWJlbHM9W107dGhpcy5jYWxjVGhyZXNob2xkU3RhdHMoZy50aHJlc2hvbGRzKTtmb3IodmFyIHIgaW4gZy5mYWNldGVkKWcuZmFjZXRlZC5oYXNPd25Qcm9wZXJ0eShyKSYmdGhpcy5jYWxjVGhyZXNob2xkU3RhdHMoZy5mYWNldGVkW3JdKX1lbHNlIGlmKHRoaXMuaXNNdWx0aUNsYXNzXyh0aGlzLm1vZGVsVHlwZSx0aGlzLm11bHRpQ2xhc3MpKXtnLnJlc3VsdHM9e307Zy5mYWNldGVkPXt9O2w9bmV3IFNldDtmb3Ioaz0wO2s8dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXMubGVuZ3RoO2srKyl7bj10aGlzLnZpc2RhdGFba107cD1udWxsOyIiIT10aGlzLnNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSYmKHE9dGhpcy5nZXRTbGljZUtleV8obix0aGlzLnNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSwKdGhpcy5zZWxlY3RlZFNlY29uZEJyZWFrZG93bkZlYXR1cmUpLHA9Zy5mYWNldGVkW3FdLHB8fChnLmZhY2V0ZWRbcV09e30scD1nLmZhY2V0ZWRbcV0pKTt2YXIgdD1nLnJlc3VsdHNbblt0aGlzLnNlbGVjdGVkTGFiZWxGZWF0dXJlXV07dHx8KGcucmVzdWx0c1tuW3RoaXMuc2VsZWN0ZWRMYWJlbEZlYXR1cmVdXT17fSx0PWcucmVzdWx0c1tuW3RoaXMuc2VsZWN0ZWRMYWJlbEZlYXR1cmVdXSk7cT10aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHZhbHVlIixmKTt2YXIgdj10W25bcV1dO2wuYWRkKFN0cmluZyhuW3FdKSk7bC5hZGQoU3RyaW5nKG5bdGhpcy5zZWxlY3RlZExhYmVsRmVhdHVyZV0pKTt0W25bcV1dPW51bGw9PXY/MTp0W25bcV1dKzE7cCYmKHQ9cFtuW3RoaXMuc2VsZWN0ZWRMYWJlbEZlYXR1cmVdXSx0fHwocFtuW3RoaXMuc2VsZWN0ZWRMYWJlbEZlYXR1cmVdXT17fSx0PXBbblt0aGlzLnNlbGVjdGVkTGFiZWxGZWF0dXJlXV0pLHRbbltxXV09bnVsbD09CnRbbltxXV0/MTp0W25bcV1dKzEpfXRoaXMuYWxsQ29uZk1hdHJpeExhYmVscz1BcnJheS5mcm9tKGwudmFsdWVzKCkpO2w9e307Zm9yKGs9MDtrPHRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzLmxlbmd0aDtrKyspZm9yKHA9dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXNba10sbj10aGlzLnZpc2RhdGFba11bdGhpcy5zZWxlY3RlZExhYmVsRmVhdHVyZV0udG9TdHJpbmcoKSxwPXAuaW5mZXJlbmNlc1twLmluZmVyZW5jZXMubGVuZ3RoLTFdW2ZdLHE9IiIhPXRoaXMuc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlP3RoaXMuZ2V0U2xpY2VLZXlfKHRoaXMudmlzZGF0YVtrXSx0aGlzLnNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSx0aGlzLnNlbGVjdGVkU2Vjb25kQnJlYWtkb3duRmVhdHVyZSk6IiIsKHEgaW4gbCl8fChsW3FdPXt9KSx0PTA7dDxwLmxlbmd0aDt0Kyspe3Y9cFt0XS5sYWJlbDtpZighKHYgaW4gbFtxXSkpe2xbcV1bdl09W107Zm9yKHZhciB5PTA7MTAwPj15O3krKylsW3FdW3ZdLnB1c2goe1RQOjAsCkZQOjAsRk46MCxUTjowfSl9eT0xMDAqcFt0XS5zY29yZTtsZXQgeD0iIjtmb3IobGV0IEM9MDsxMDA+PUM7QysrKXg9dj09PW4/eT5DPyJUUCI6IkZOIjp5PkM/IkZQIjoiVE4iLGxbcV1bdl1bQ11beF0rPTF9T2JqZWN0LnZhbHVlcyhsKS5mb3JFYWNoKHg9Pk9iamVjdC52YWx1ZXMoeCkuZm9yRWFjaCh0aGlzLmNhbGNUaHJlc2hvbGRTdGF0cykpO2cuYWxsVGhyZXNob2xkcz1sfWVsc2V7Zy5yZXN1bHRzPXtlcnJvcnM6W119O2cuZmFjZXRlZD17fTtmb3IobD0wO2w8dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXMubGVuZ3RoO2wrKyluPXRoaXMudmlzZGF0YVtsXSxrPW51bGwsIiIhPXRoaXMuc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlJiYocD10aGlzLmdldFNsaWNlS2V5XyhuLHRoaXMuc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlLHRoaXMuc2VsZWN0ZWRTZWNvbmRCcmVha2Rvd25GZWF0dXJlKSxrPWcuZmFjZXRlZFtwXSxrfHwoZy5mYWNldGVkW3BdPXtlcnJvcnM6W119LGs9Zy5mYWNldGVkW3BdKSksCm49blt0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHZhbHVlIixmKV0tblt0aGlzLnNlbGVjdGVkTGFiZWxGZWF0dXJlXSxnLnJlc3VsdHMuZXJyb3JzLnB1c2gobiksayYmay5lcnJvcnMucHVzaChuKTtkLnB1c2godGhpcy5maWxsSW5SZWdyZXNzaW9uU3RhdHMoZy5yZXN1bHRzLHRoaXMuZm9ybWF0Q2hhcnRLZXkoIkFsbCBkYXRhcG9pbnRzIixmLHRoaXMubnVtTW9kZWxzKSkpO2Zvcih2YXIgeiBpbiBnLmZhY2V0ZWQpZC5wdXNoKHRoaXMuZmlsbEluUmVncmVzc2lvblN0YXRzKGcuZmFjZXRlZFt6XSx0aGlzLmZvcm1hdENoYXJ0S2V5KHosZix0aGlzLm51bU1vZGVscykpKX1jLnB1c2goZyl9ZD10aGlzLnNvcnRSZWdyZXNzaW9uRW50cmllcyhkKTt0aGlzLnJlZ3Jlc3Npb25FbnRyaWVzXz1bXTt0aGlzLnJlZ3Jlc3Npb25FbnRyaWVzXz1kO3RoaXMuaW5mZXJlbmNlU3RhdHNfPWN9Yz10aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHM7dGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzPQpbXTt0aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHM9dGhpcy5zb3J0RmVhdHVyZVZhbHVlcyhjKTtpZih0aGlzLmlzQmluYXJ5Q2xhc3NpZmljYXRpb25fKHRoaXMubW9kZWxUeXBlLHRoaXMubXVsdGlDbGFzcykpe2ZvcihjPTA7Yzx0aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHMubGVuZ3RoO2MrKyl7ZD1bXTtmPVtdO2c9dGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzW2NdLnRocmVzaG9sZDtmb3Iocj0wO3I8Zy5sZW5ndGg7cisrKWQucHVzaCh0aGlzLmluZmVyZW5jZVN0YXRzX1tyXS5mYWNldGVkW3RoaXMuY3JlYXRlQ29tYmluZWRWYWx1ZVN0cmluZ18odGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzW2NdLnZhbHVlLHRoaXMuZmVhdHVyZVZhbHVlVGhyZXNob2xkc1tjXS52YWx1ZTIpXSksZi5wdXNoKGdbcl0udGhyZXNob2xkKTt0aGlzLnBsb3RDaGFydCh0aGlzLiQkKCIjIit0aGlzLmdldFJvY0NoYXJ0SWQoYykpLGQsZixhLCEwKTt0aGlzLnBsb3RDaGFydCh0aGlzLiQkKCIjIisKdGhpcy5nZXRQckNoYXJ0SWQoYykpLGQsZixhLCExKX1jPVtdO2Q9W107Zm9yKGY9MDtmPHRoaXMuaW5mZXJlbmNlU3RhdHNfLmxlbmd0aDtmKyspYy5wdXNoKHRoaXMuaW5mZXJlbmNlU3RhdHNfW2ZdLnRocmVzaG9sZHMpLGQucHVzaCh0aGlzLm92ZXJhbGxUaHJlc2hvbGRzW2ZdLnRocmVzaG9sZCk7dGhpcy5wbG90Q2hhcnQodGhpcy4kJCgiI3JvY2NoYXJ0IiksYyxkLGEsITApO3RoaXMucGxvdENoYXJ0KHRoaXMuJCQoIiNwcmNoYXJ0IiksYyxkLGEsITEpfWVsc2UgaWYodGhpcy5pc011bHRpQ2xhc3NfKHRoaXMubW9kZWxUeXBlLHRoaXMubXVsdGlDbGFzcykpZm9yKGQ9KGM9MDx0aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHMubGVuZ3RoKT90aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHMubWFwKHg9PnRoaXMuY3JlYXRlQ29tYmluZWRWYWx1ZVN0cmluZ18oeC52YWx1ZSx4LnZhbHVlMikpOlsiIl0sZj0wO2Y8ZC5sZW5ndGg7ZisrKWZvcihnPWRbZl0scj0wO3I8dGhpcy5hbGxDb25mTWF0cml4TGFiZWxzLmxlbmd0aDtyKyspe3o9CnRoaXMuYWxsQ29uZk1hdHJpeExhYmVsc1tyXTtsPVtdO2s9W107bj1jP3RoaXMuZmVhdHVyZVZhbHVlVGhyZXNob2xkc1tmXS50aHJlc2hvbGQ6dGhpcy5vdmVyYWxsVGhyZXNob2xkcztmb3IocD0wO3A8dGhpcy5pbmZlcmVuY2VTdGF0c18ubGVuZ3RoO3ArKylsLnB1c2godGhpcy5pbmZlcmVuY2VTdGF0c19bcF0uYWxsVGhyZXNob2xkc1tnXVt6XSksay5wdXNoKG5bcF0udGhyZXNob2xkKTt0aGlzLnBsb3RDaGFydCh0aGlzLiQkKCIjIit0aGlzLmdldFJvY0NoYXJ0TGFiZWxJZChyLGM/ZjoiIikpLGwsayxhLCEwKTt0aGlzLnBsb3RDaGFydCh0aGlzLiQkKCIjIit0aGlzLmdldFByQ2hhcnRMYWJlbElkKHIsYz9mOiIiKSksbCxrLGEsITEpfXRoaXMudXBkYXRlQ29ycmVjdG5lc3NfKCl9fSxzb3J0RmVhdHVyZVZhbHVlczpmdW5jdGlvbihhKXtjb25zdCBjPXRoaXMuaW5mZXJlbmNlU3RhdHNfWzBdO2E9YS5maWx0ZXIoZD0+dGhpcy5pc1JlZ3Jlc3Npb25fKHRoaXMubW9kZWxUeXBlKT8KMDx0aGlzLmdldFJlZ3Jlc3Npb25Db3VudChjLGQpOnRoaXMuaXNCaW5hcnlDbGFzc2lmaWNhdGlvbl8odGhpcy5tb2RlbFR5cGUsdGhpcy5tdWx0aUNsYXNzKT8wPHRoaXMuZ2V0QmluYXJ5Q2xhc3NpZmljYXRpb25Db3VudChjLGQpOjA8dGhpcy5nZXRNdWx0aWNsYXNzQ2xhc3NpZmljYXRpb25Db3VudChjLGQpKTtyZXR1cm4gYS5zb3J0KChkLGYpPT57aWYoIkNvdW50Ij09dGhpcy5zZWxlY3RlZEZlYXR1cmVTb3J0KXJldHVybiB0aGlzLmlzUmVncmVzc2lvbl8odGhpcy5tb2RlbFR5cGUpP3RoaXMuZ2V0UmVncmVzc2lvbkNvdW50KGMsZiktdGhpcy5nZXRSZWdyZXNzaW9uQ291bnQoYyxkKTp0aGlzLmlzQmluYXJ5Q2xhc3NpZmljYXRpb25fKHRoaXMubW9kZWxUeXBlLHRoaXMubXVsdGlDbGFzcyk/dGhpcy5nZXRCaW5hcnlDbGFzc2lmaWNhdGlvbkNvdW50KGMsZiktdGhpcy5nZXRCaW5hcnlDbGFzc2lmaWNhdGlvbkNvdW50KGMsZCk6dGhpcy5nZXRNdWx0aWNsYXNzQ2xhc3NpZmljYXRpb25Db3VudChjLApmKS10aGlzLmdldE11bHRpY2xhc3NDbGFzc2lmaWNhdGlvbkNvdW50KGMsZCk7aWYoIkFscGhhYmV0aWNhbCI9PXRoaXMuc2VsZWN0ZWRGZWF0dXJlU29ydClyZXR1cm4gZD10aGlzLmdldFByaW50YWJsZVZhbHVlXyhkKSxmPXRoaXMuZ2V0UHJpbnRhYmxlVmFsdWVfKGYpLCJbIj09PWRbMF0mJiJbIj09PWZbMF0/TnVtYmVyLnBhcnNlRmxvYXQoZC5zdWJzdHJpbmcoMSkpLU51bWJlci5wYXJzZUZsb2F0KGYuc3Vic3RyaW5nKDEpKTpkLmxvY2FsZUNvbXBhcmUoZik7aWYoIkFjY3VyYWN5Ij09dGhpcy5zZWxlY3RlZEZlYXR1cmVTb3J0KXJldHVybiB0aGlzLmlzQmluYXJ5Q2xhc3NpZmljYXRpb25fKHRoaXMubW9kZWxUeXBlLHRoaXMubXVsdGlDbGFzcyk/K3RoaXMuZ2V0QWNjdXJhY3lNb2RlbEluZGV4KHRoaXMuaW5mZXJlbmNlU3RhdHNfLGYudGhyZXNob2xkLDAsZiktK3RoaXMuZ2V0QWNjdXJhY3lNb2RlbEluZGV4KHRoaXMuaW5mZXJlbmNlU3RhdHNfLGQudGhyZXNob2xkLDAsCmQpOit0aGlzLmdldE11bHRpQ2xhc3NBY2N1cmFjeU1vZGVsSW5kZXgodGhpcy5pbmZlcmVuY2VTdGF0c18sMCxmKS0rdGhpcy5nZXRNdWx0aUNsYXNzQWNjdXJhY3lNb2RlbEluZGV4KHRoaXMuaW5mZXJlbmNlU3RhdHNfLDAsZCk7aWYoIkZhbHNlIHBvc2l0aXZlcyI9PXRoaXMuc2VsZWN0ZWRGZWF0dXJlU29ydClyZXR1cm4rdGhpcy5nZXRGUE1vZGVsSW5kZXgodGhpcy5pbmZlcmVuY2VTdGF0c18sZi50aHJlc2hvbGQsMCxmKS0rdGhpcy5nZXRGUE1vZGVsSW5kZXgodGhpcy5pbmZlcmVuY2VTdGF0c18sZC50aHJlc2hvbGQsMCxkKTtpZigiRmFsc2UgbmVnYXRpdmVzIj09dGhpcy5zZWxlY3RlZEZlYXR1cmVTb3J0KXJldHVybiB0aGlzLmdldEZOTW9kZWxJbmRleCgrdGhpcy5pbmZlcmVuY2VTdGF0c18sZi50aHJlc2hvbGQsMCxmKS0rdGhpcy5nZXRGTk1vZGVsSW5kZXgodGhpcy5pbmZlcmVuY2VTdGF0c18sZC50aHJlc2hvbGQsMCxkKX0pfSxzb3J0UmVncmVzc2lvbkVudHJpZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc29ydCgoYywKZCk9PntpZigiQ291bnQiPT10aGlzLnNlbGVjdGVkRmVhdHVyZVNvcnQpcmV0dXJuIGQuY291bnQtYy5jb3VudDtpZigiQWxwaGFiZXRpY2FsIj09dGhpcy5zZWxlY3RlZEZlYXR1cmVTb3J0KXJldHVybiJbIj09PWMubmFtZVswXSYmIlsiPT09ZC5uYW1lWzBdP051bWJlci5wYXJzZUZsb2F0KGMubmFtZS5zdWJzdHJpbmcoMSkpLU51bWJlci5wYXJzZUZsb2F0KGQubmFtZS5zdWJzdHJpbmcoMSkpOmMubmFtZS5sb2NhbGVDb21wYXJlKGQubmFtZSk7aWYoIk1lYW4gZXJyb3IiPT10aGlzLnNlbGVjdGVkRmVhdHVyZVNvcnQpcmV0dXJuIGQubWVhbkVycm9yLWMubWVhbkVycm9yO2lmKCJNZWFuIGFic29sdXRlIGVycm9yIj09dGhpcy5zZWxlY3RlZEZlYXR1cmVTb3J0KXJldHVybiBkLm1lYW5BYnNFcnJvci1jLm1lYW5BYnNFcnJvcjtpZigiTWVhbiBzcXVhcmVkIGVycm9yIj09dGhpcy5zZWxlY3RlZEZlYXR1cmVTb3J0KXJldHVybiBkLm1lYW5TcXVhcmVkRXJyb3ItYy5tZWFuU3F1YXJlZEVycm9yOwppZigiTWVkaWFuIGVycm9yIj09dGhpcy5zZWxlY3RlZEZlYXR1cmVTb3J0KXJldHVybiBkLm1lZGlhbkVycm9yLWMubWVkaWFuRXJyb3I7aWYoIk1lZGlhbiBhYnNvbHV0ZSBlcnJvciI9PXRoaXMuc2VsZWN0ZWRGZWF0dXJlU29ydClyZXR1cm4gZC5tZWRpYW5BYnNFcnJvci1jLm1lZGlhbkFic0Vycm9yO2lmKCJNZWRpYW4gc3F1YXJlZCBlcnJvciI9PXRoaXMuc2VsZWN0ZWRGZWF0dXJlU29ydClyZXR1cm4gZC5tZWRpYW5TcXVhcmVkRXJyb3ItYy5tZWRpYW5TcXVhcmVkRXJyb3J9KX0sZmlsbEluUmVncmVzc2lvblN0YXRzOmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZChrKXtyZXR1cm4gay5yZWR1Y2UoKG4scCk9Pm4rcCwwKS9rLmxlbmd0aH1mdW5jdGlvbiBmKGspe2lmKDA9PWsubGVuZ3RoKXJldHVybiBOYU47az1rLnNvcnQoKHAscSk9PnAtcSk7Y29uc3Qgbj1rLmxlbmd0aC8yO3JldHVybiAxPT1rLmxlbmd0aD9rWzBdOjA9PWsubGVuZ3RoJTI/a1tuXTooa1tNYXRoLmZsb29yKG4pXSsKa1tNYXRoLmNlaWwobildKS8yfWNvbnN0IGc9YS5lcnJvcnMubWFwKGs9Pk1hdGguYWJzKGspKSxsPWEuZXJyb3JzLm1hcChrPT5rKmspO3JldHVybntuYW1lOmMsbWVhbkVycm9yOmQoYS5lcnJvcnMpLG1lYW5BYnNFcnJvcjpkKGcpLG1lYW5TcXVhcmVkRXJyb3I6ZChsKSxtZWRpYW5FcnJvcjpmKGEuZXJyb3JzKSxtZWRpYW5BYnNFcnJvcjpmKGcpLG1lZGlhblNxdWFyZWRFcnJvcjpmKGwpLGNvdW50OmEuZXJyb3JzLmxlbmd0aH19LHBsb3RDaGFydDpmdW5jdGlvbihhLGMsZCxmLGcpe2lmKGMmJmNbMF0mJmEpe3ZhciBsPVtdLGs9W10sbj1nPyJGUFIiOiJUUFIiLHA9Zz8iVFBSIjoiUFBWIixxPWc/IkZQUiI6IlJlY2FsbCIscj1nPyJUUFIiOiJQcmVjaXNpb24iO2ZvcihsZXQgdD0wO3Q8Yy5sZW5ndGg7dCsrKXtsZXQgdj1udWxsO2NvbnN0IHk9Y1t0XS5tYXAoKHoseCk9PnsuNT54LTEwMCpkW3RdJiYodj17c3RlcDp6W25dLHNjYWxhcjp6W3BdLHRocmVzaG9sZDp4LzEwMH0pOwpyZXR1cm57c3RlcDp6W25dLHNjYWxhcjp6W3BdLHRocmVzaG9sZDp4LzEwMH19KS5yZXZlcnNlKCk7YS5zZXRTZXJpZXNEYXRhKHRoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIlRocmVzaG9sZCBzZXQiLHQpLFt2XSk7ZiYmKGEuc2V0U2VyaWVzRGF0YSh0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCJST0MiLHQpLHkpLGwucHVzaCh0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCJST0MiLHQpKSxsLnB1c2godGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiVGhyZXNob2xkIHNldCIsdCkpLGsucHVzaCh0aGlzLnJvY0N1cnZlTGluZUNvbG9yc1t0XSksay5wdXNoKHRoaXMucm9jQ3VydmVDb2xvcnNbdF0pKX1pZihmKXtjb25zdCB0PWQzLmZvcm1hdCgiLjJmIik7YS54QXhpc0Zvcm1hdHRlcj1kMy5mb3JtYXQoIi4yZiIpO2NvbnN0IHY9ZDMuZm9ybWF0KCIsLjEiKTtmPVt7dGl0bGU6IlRocmVzaG9sZCIsZXZhbHVhdGU6ZnVuY3Rpb24oeSl7cmV0dXJuIHQoeS5kYXR1bS50aHJlc2hvbGQpfX0se3RpdGxlOnIsCmV2YWx1YXRlOmZ1bmN0aW9uKHkpe3JldHVybiBnP3YoeS5kYXR1bS5zY2FsYXIpOnQoeS5kYXR1bS5zY2FsYXIpfX0se3RpdGxlOnEsZXZhbHVhdGU6ZnVuY3Rpb24oeSl7cmV0dXJuIGc/dih5LmRhdHVtLnN0ZXApOnQoeS5kYXR1bS5zdGVwKX19XTsxPGMubGVuZ3RoJiZmLnB1c2goe3RpdGxlOiJNb2RlbCIsZXZhbHVhdGU6ZnVuY3Rpb24oeSl7eT15LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lLnNwbGl0KCIgIik7cmV0dXJuIHlbeS5sZW5ndGgtMV19fSk7YS50b29sdGlwQ29sdW1ucz1mO2EuY29sb3JTY2FsZT0obmV3IFBsb3R0YWJsZS5TY2FsZXMuQ29sb3IpLnJhbmdlKGspO2EuY29sb3JTY2FsZS5kb21haW4obCk7YS5zZXRWaXNpYmxlU2VyaWVzKGwpfX19LGNhbGNUaHJlc2hvbGRTdGF0czpmdW5jdGlvbihhKXtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKylhW2NdLlRQUj0wPGFbY10uVFArYVtjXS5GTj9hW2NdLlRQLyhhW2NdLlRQK2FbY10uRk4pOjAsYVtjXS5GUFI9MDwKYVtjXS5GUCthW2NdLlROP2FbY10uRlAvKGFbY10uRlArYVtjXS5UTik6MCxhW2NdLlBQVj0wPGFbY10uVFArYVtjXS5GUD9hW2NdLlRQLyhhW2NdLlRQK2FbY10uRlApOjB9LG9wdGltaXphdGlvblNlbGVjdGVkQ2hhbmdlZF86ZnVuY3Rpb24oYSl7ImN1c3RvbSIhPWEmJigidW5hd2FyZSI9PWE/dGhpcy5vcHRpbWl6ZVRocmVzaG9sZENsaWNrZWRfKCk6Imdyb3VwIj09YT90aGlzLm9wdGltaXplRmFjZXRlZFRocmVzaG9sZHNDbGlja2VkXygpOiJkZW1vcGFyaXR5Ij09YT90aGlzLmRlbW9QYXJpdHlDbGlja2VkXygpOiJlcXVhbGFjYyI9PWE/dGhpcy5lcXVhbEFjY0NsaWNrZWRfKCk6ImVxdWFsb3BwIj09YSYmdGhpcy5lcXVhbE9wcG9DbGlja2VkXygpLHRoaXMudXBkYXRlSW5mZXJlbmNlU3RhdHNfKCEwKSl9LGNvc3RSYXRpb0NoYW5nZWRfOmZ1bmN0aW9uKCl7dGhpcy5yZXNldE9wdGltaXphdGlvblNlbGVjdGVkXygpfSxyZXNldE9wdGltaXphdGlvblNlbGVjdGVkXzpmdW5jdGlvbigpe2NvbnN0IGE9CnRoaXMuJCQoIiNjdXN0b210aHJlc2giKTtudWxsIT1hJiZhLmNsaWNrKCl9LG9wdGltaXplVGhyZXNob2xkQ2xpY2tlZF86ZnVuY3Rpb24oKXtmb3IobGV0IGE9MDthPHRoaXMuaW5mZXJlbmNlU3RhdHNfLmxlbmd0aDthKyspe2NvbnN0IGM9dGhpcy5maW5kT3B0aW1hbFRocmVzaG9sZF8odGhpcy5pbmZlcmVuY2VTdGF0c19bYV0udGhyZXNob2xkcyk7dGhpcy5zZXQoIm92ZXJhbGxUaHJlc2hvbGRzLiIrYSsiLnRocmVzaG9sZCIsYyk7aWYodGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzKWZvcihsZXQgZD0wO2Q8dGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzLmxlbmd0aDtkKyspdGhpcy5zZXQoImZlYXR1cmVWYWx1ZVRocmVzaG9sZHMuIitkKyIudGhyZXNob2xkLiIrYSsiLnRocmVzaG9sZCIsYyl9fSxvcHRpbWl6ZUZhY2V0ZWRUaHJlc2hvbGRzQ2xpY2tlZF86ZnVuY3Rpb24oKXtmb3IobGV0IGE9MDthPHRoaXMuaW5mZXJlbmNlU3RhdHNfLmxlbmd0aDthKyspe2NvbnN0IGM9Ck9iamVjdC5rZXlzKHRoaXMuaW5mZXJlbmNlU3RhdHNfW2FdLmZhY2V0ZWQpO2ZvcihsZXQgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMuc2V0KCJmZWF0dXJlVmFsdWVUaHJlc2hvbGRzLiIrZCsiLnRocmVzaG9sZC4iK2ErIi50aHJlc2hvbGQiLHRoaXMuZmluZE9wdGltYWxUaHJlc2hvbGRfKHRoaXMuaW5mZXJlbmNlU3RhdHNfW2FdLmZhY2V0ZWRbY1tkXV0pKX19LGZpbmRPcHRpbWFsVGhyZXNob2xkXzpmdW5jdGlvbihhKXtsZXQgYz1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksZD0wO2ZvcihsZXQgZj0wO2Y8YS5sZW5ndGg7ZisrKXtjb25zdCBnPXRoaXMuZ2V0Q29zdChhW2ZdKTtnPD1jJiYoYz1nLGQ9Zil9cmV0dXJuIGQvMTAwfSxlcXVhbE9wcG9DbGlja2VkXzpmdW5jdGlvbigpe3RoaXMuZ2V0QmVzdFRocmVzaG9sZHNCeUZhaXJuZXNzTWVhc3VyZV8oYT0+YS5UUC8oYS5UUCthLkZOKSl9LGVxdWFsQWNjQ2xpY2tlZF86ZnVuY3Rpb24oKXt0aGlzLmdldEJlc3RUaHJlc2hvbGRzQnlGYWlybmVzc01lYXN1cmVfKGE9PgooYS5UUCthLlROKS8oYS5UUCthLkZQK2EuVE4rYS5GTikpfSxkZW1vUGFyaXR5Q2xpY2tlZF86ZnVuY3Rpb24oKXt0aGlzLmdldEJlc3RUaHJlc2hvbGRzQnlGYWlybmVzc01lYXN1cmVfKGE9PihhLlRQK2EuRlApLyhhLlRQK2EuRlArYS5UTithLkZOKSl9LGdldEJlc3RUaHJlc2hvbGRzQnlGYWlybmVzc01lYXN1cmVfOmZ1bmN0aW9uKGEpe2ZvcihsZXQgZD0wO2Q8dGhpcy5pbmZlcmVuY2VTdGF0c18ubGVuZ3RoO2QrKyl7dmFyIGM9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO2xldCBmPW51bGw7Y29uc3QgZz10aGlzLmluZmVyZW5jZVN0YXRzX1tkXSxsPU9iamVjdC5rZXlzKGcuZmFjZXRlZCksaz1nLmZhY2V0ZWRbbFswXV07Zm9yKGxldCBuPTA7bjxrLmxlbmd0aDtuKyspe2NvbnN0IHA9YShrW25dKSxxPVtuXTtsZXQgcj10aGlzLmdldENvc3Qoa1tuXSk7Zm9yKGxldCB0PTE7dDxsLmxlbmd0aDt0Kyspe2NvbnN0IHY9Zy5mYWNldGVkW2xbdF1dLHk9dGhpcy50aHJlc2hvbGRDbG9zZXN0VG9NZWFzdXJlKHYsCnAsYSk7cS5wdXNoKHkpO3IrPXRoaXMuZ2V0Q29zdCh2W3ldKX1yPD1jJiYoYz1yLGY9cSl9Zm9yKGM9MDtjPGwubGVuZ3RoO2MrKyl0aGlzLnNldCgiZmVhdHVyZVZhbHVlVGhyZXNob2xkcy4iK3RoaXMuZmVhdHVyZVZhbHVlVGhyZXNob2xkc0luZGV4TWFwW2xbY11dKyIudGhyZXNob2xkLiIrZCsiLnRocmVzaG9sZCIsZltjXS8xMDApfX0sZ2V0Q29zdDpmdW5jdGlvbihhKXtyZXR1cm4gYS5GUCp0aGlzLmluY29ycmVjdFByZWRDb3N0UmF0aW8rYS5GTn0sdGhyZXNob2xkQ2xvc2VzdFRvTWVhc3VyZTpmdW5jdGlvbihhLGMsZCl7bGV0IGY9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGc9MDtmb3IobGV0IGs9MDtrPGEubGVuZ3RoO2srKyl7dmFyIGw9ZChhW2tdKTtsPU1hdGguYWJzKGwtYyk7bDw9ZiYmKGc9ayxmPWwpfXJldHVybiBnfSxnZXRDbGFzc2lmaWNhdGlvbkJlc3ROb25aZXJvOmZ1bmN0aW9uKGEsYyl7bGV0IGQ9MDtjb25zdCBmPXRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzW2FdLmluZmVyZW5jZXMubGVuZ3RoLQoxO2ZvcihsZXQgZz0wO2c8dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXNbYV0uaW5mZXJlbmNlc1tmXVtjXS5sZW5ndGg7ZysrKWlmKDAhPT0rdGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXNbYV0uaW5mZXJlbmNlc1tmXVtjXVtnXS5sYWJlbCl7ZD1nO2JyZWFrfXJldHVybiB0aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1thXS5pbmZlcmVuY2VzW2ZdW2NdW2RdfSxnZXRDb25mdXNpb25Db3VudHNNb2RlbEluZGV4OmZ1bmN0aW9uKGEsYyxkLGYpe3JldHVybiB0aGlzLm92ZXJhbGxUaHJlc2hvbGRzLmxlbmd0aCE9dGhpcy5udW1Nb2RlbHN8fHRoaXMuaW5mZXJlbmNlU3RhdHNfLmxlbmd0aCE9dGhpcy5udW1Nb2RlbHM/e306dGhpcy5nZXRDb25mdXNpb25Db3VudHModGhpcy5pbmZlcmVuY2VTdGF0c19bZF0sY1tkXS50aHJlc2hvbGQsZil9LGdldFRvdGFsRW50cmllc0luQ29uZkNvdW50czpmdW5jdGlvbihhKXtpZihudWxsPT1hKXJldHVybiAwO2xldCBjPTA7Y29uc3QgZD1PYmplY3Qua2V5cyhhKTsKZm9yKGxldCBmPTA7ZjxkLmxlbmd0aDtmKyspe2NvbnN0IGc9YVtkW2ZdXSxsPU9iamVjdC5rZXlzKGcpO2ZvcihsZXQgaz0wO2s8bC5sZW5ndGg7aysrKWMrPWdbbFtrXV19cmV0dXJuIGN9LGdldEZQTW9kZWxJbmRleDpmdW5jdGlvbihhLGMsZCxmKXthPXRoaXMuZ2V0Q29uZnVzaW9uQ291bnRzTW9kZWxJbmRleChhLGMsZCxmKTtpZigwPT1PYmplY3Qua2V5cyhhKS5sZW5ndGgpcmV0dXJuIG51bGw7Yz1hLk5vLlllcztyZXR1cm4gZDMuZm9ybWF0KCIsLjFmIikoYy90aGlzLmdldFRvdGFsRW50cmllc0luQ29uZkNvdW50cyhhKSoxMDApfSxnZXRGTk1vZGVsSW5kZXg6ZnVuY3Rpb24oYSxjLGQsZil7YT10aGlzLmdldENvbmZ1c2lvbkNvdW50c01vZGVsSW5kZXgoYSxjLGQsZik7aWYoMD09T2JqZWN0LmtleXMoYSkubGVuZ3RoKXJldHVybiAwO2M9YS5ZZXMuTm87cmV0dXJuIGQzLmZvcm1hdCgiLC4xZiIpKGMvdGhpcy5nZXRUb3RhbEVudHJpZXNJbkNvbmZDb3VudHMoYSkqMTAwKX0sCmdldEFjY3VyYWN5TW9kZWxJbmRleDpmdW5jdGlvbihhLGMsZCxmKXthPXRoaXMuZ2V0Q29uZnVzaW9uQ291bnRzTW9kZWxJbmRleChhLGMsZCxmKTtpZigwPT1PYmplY3Qua2V5cyhhKS5sZW5ndGgpcmV0dXJuIDA7Yz1hLlllcy5ZZXMrYS5Oby5ObztyZXR1cm4gZDMuZm9ybWF0KCIsLjFmIikoYy90aGlzLmdldFRvdGFsRW50cmllc0luQ29uZkNvdW50cyhhKSoxMDApfSxnZXRGMU1vZGVsSW5kZXg6ZnVuY3Rpb24oYSxjLGQsZil7Y29uc3QgZz1kMy5mb3JtYXQoIiwuMmYiKTtkPXRoaXMuZ2V0Q29uZnVzaW9uQ291bnRzTW9kZWxJbmRleChhLGMsZCxmKTtpZigwPT1PYmplY3Qua2V5cyhkKS5sZW5ndGgpcmV0dXJuIDA7YT1kLlllcy5ZZXM7Yz1kLk5vLlllcztkPWQuWWVzLk5vO2lmKDA9PWEpcmV0dXJuIDAhPWN8fDAhPWQ/ZygwKTpnKDEpO2M9YS8oYStjKTthLz1hK2Q7cmV0dXJuIGcoMipjKmEvKGMrYSkpfSxnZXRGZWF0dXJlVmFsdWVDb3VudDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuZ2V0VG90YWxFbnRyaWVzSW5Db25mQ291bnRzKHRoaXMuZ2V0Q29uZnVzaW9uQ291bnRzTW9kZWxJbmRleChhLApjLDAsZCkpfSxnZXRDb25mdXNpb25NYXRyaXhMYWJlbDpmdW5jdGlvbihhLGMpe3JldHVybiAyPmM/IiI6dGhpcy5nZXRNb2RlbE5hbWVfKGEpfSxnZXRDb25mdXNpb25NYXRyaXhDb2xvcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5jb25mTWF0cml4Q29sb3JzW2FdfSxnZXRDb25mdXNpb25Db3VudHMoYSxjLGQpe2xldCBmPW51bGwsZz1udWxsO251bGwhPWQmJihmPWQudmFsdWUsZz1kLnZhbHVlMik7cmV0dXJue05vOntObzp0aGlzLmdldENvbmZNYXRyaXhWYWx1ZShhLGMsIlROIixmLGcpLFllczp0aGlzLmdldENvbmZNYXRyaXhWYWx1ZShhLGMsIkZQIixmLGcpfSxZZXM6e05vOnRoaXMuZ2V0Q29uZk1hdHJpeFZhbHVlKGEsYywiRk4iLGYsZyksWWVzOnRoaXMuZ2V0Q29uZk1hdHJpeFZhbHVlKGEsYywiVFAiLGYsZyl9fX0sZ2V0Q29uZk1hdHJpeFZhbHVlOmZ1bmN0aW9uKGEsYyxkLGYsZyl7Yz1NYXRoLmZsb29yKDEwMCpjKTtpZighYS50aHJlc2hvbGRzKXJldHVybiAwO2lmKG51bGw9PT0KZilyZXR1cm4gYS50aHJlc2hvbGRzW2NdW2RdO2Y9dGhpcy5jcmVhdGVDb21iaW5lZFZhbHVlU3RyaW5nXyhmLGcpO3JldHVybiBudWxsPT1hLmZhY2V0ZWRbZl0/MDphLmZhY2V0ZWRbZl1bY11bZF19LGdldE11bHRpQ2xhc3NDb25mTWF0cml4OmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gMD09YS5sZW5ndGg/e306bnVsbD09ZD9hW2NdLnJlc3VsdHM6YVtjXS5mYWNldGVkW3RoaXMuZ2V0UHJpbnRhYmxlVmFsdWVfKGQpXX0sZ2V0TXVsdGlDbGFzc0ZlYXR1cmVWYWx1ZUNvdW50OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuZ2V0VG90YWxFbnRyaWVzSW5Db25mQ291bnRzKHRoaXMuZ2V0TXVsdGlDbGFzc0NvbmZNYXRyaXgoYSwwLGMpKX0sZ2V0TXVsdGlDbGFzc0FjY3VyYWN5TW9kZWxJbmRleDpmdW5jdGlvbihhLGMsZCl7YT10aGlzLmdldE11bHRpQ2xhc3NDb25mTWF0cml4KGEsYyxkKTtpZihudWxsPT1hKXJldHVybiBudWxsO2M9MDtkPU9iamVjdC5rZXlzKGEpO2ZvcihsZXQgZj0KMDtmPGQubGVuZ3RoO2YrKyl7Y29uc3QgZz1hW2RbZl1dLGw9T2JqZWN0LmtleXMoZyk7Zm9yKGxldCBrPTA7azxsLmxlbmd0aDtrKyspZFtmXT09bFtrXSYmKGMrPWdbbFtrXV0pfXJldHVybiBkMy5mb3JtYXQoIiwuMWYiKShjL3RoaXMuZ2V0VG90YWxFbnRyaWVzSW5Db25mQ291bnRzKGEpKjEwMCl9LGdldEluZmVyZW5jZVN0YXQ6ZnVuY3Rpb24oYSxjLGQsZil7YT1jP2EuZmFjZXRlZFt0aGlzLmdldFByaW50YWJsZVZhbHVlXyhjKV06YS5yZXN1bHRzO2lmKCFhKXJldHVybiBudWxsO2Q9ZChhKTtyZXR1cm4gZj9mKGQpOmR9LGdldFJlZ3Jlc3Npb25NZWFuOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuZ2V0SW5mZXJlbmNlU3RhdChhLGMsZD0+ZC5tZWFuLGQzLmZvcm1hdCgiLjNmIikpfSxnZXRSZWdyZXNzaW9uQWJzTWVhbjpmdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLmdldEluZmVyZW5jZVN0YXQoYSxjLGQ9PmQuYWJzTWVhbixkMy5mb3JtYXQoIi4zZiIpKX0sZ2V0UmVncmVzc2lvblNxdWFyZWRNZWFuOmZ1bmN0aW9uKGEsCmMpe3JldHVybiB0aGlzLmdldEluZmVyZW5jZVN0YXQoYSxjLGQ9PmQuc3F1YXJlZE1lYW4sZDMuZm9ybWF0KCIuM2YiKSl9LGdldFJlZ3Jlc3Npb25Db3VudDpmdW5jdGlvbihhLGMpe2E9dGhpcy5nZXRJbmZlcmVuY2VTdGF0KGEsYyxkPT5kLmVycm9ycy5sZW5ndGgsbnVsbCk7cmV0dXJuIG51bGw9PWE/MDphfSxnZXRCaW5hcnlDbGFzc2lmaWNhdGlvbkNvdW50OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuZ2V0SW5mZXJlbmNlU3RhdChhLGMsZD0+T2JqZWN0LnZhbHVlcyhkWzBdKS5yZWR1Y2UoKGYsZyk9PmYrZyksbnVsbCl9LGdldE11bHRpY2xhc3NDbGFzc2lmaWNhdGlvbkNvdW50OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuZ2V0SW5mZXJlbmNlU3RhdChhLGMsZD0+T2JqZWN0LnZhbHVlcyhkKS5yZWR1Y2UoKGYsZyk9PntsZXQgbD0wO2NvbnN0IGs9T2JqZWN0LmtleXMoZyk7Zm9yKGxldCBuPTA7bjxrLmxlbmd0aDtuKyspbCs9Z1trW25dXTtyZXR1cm4gZitsfSwwKSwKbnVsbCl9LGdldFJvY0NoYXJ0SWQ6ZnVuY3Rpb24oYSl7cmV0dXJuInJvY2NoYXJ0IithfSxnZXRSb2NDaGFydExhYmVsSWQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5nZXRSb2NDaGFydElkKGMpKyItIithfSxnZXRMYWJlbDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5sYWJlbFZvY2FiW2FdfHxhfSxnZXRQckNoYXJ0SWQ6ZnVuY3Rpb24oYSl7cmV0dXJuInByY2hhcnQiK2F9LGdldFByQ2hhcnRMYWJlbElkOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuZ2V0UHJDaGFydElkKGMpKyItIithfSxnZXRQcmludGFibGVWYWx1ZV86ZnVuY3Rpb24oYSl7bGV0IGM7Yz1hLnZhbHVlfHwwPT09YS52YWx1ZT9TdHJpbmcoYS52YWx1ZSk6Ilx4M2NmZWF0dXJlIHZhbHVlIG1pc3NpbmdceDNlIjtpZigiIj09dGhpcy5zZWxlY3RlZFNlY29uZEJyZWFrZG93bkZlYXR1cmUpcmV0dXJuIGM7Yys9Ii8iO3JldHVybiBjPWEudmFsdWUyfHwwPT09YS52YWx1ZTI/YythLnZhbHVlMjpjKyJceDNjZmVhdHVyZSB2YWx1ZSBtaXNzaW5nXHgzZSJ9LApnZXRGZWF0dXJlTmFtZV86ZnVuY3Rpb24oYSl7cmV0dXJuIDA9PT1hLmxlbmd0aD8iXHgzY25vbmVceDNlIjphfSxnZXRMYWJlbGVkTW9kZWxOYW1lXzpmdW5jdGlvbihhKXtyZXR1cm4iTW9kZWw6ICIrYX0sZ2V0Q2xhc3NOYW1lXzpmdW5jdGlvbihhKXtyZXR1cm4gMD09PWEubGVuZ3RoPyJceDNjbm9uZVx4M2UiOmF9LHNob3VsZFNob3dPdmVyYWxsVGhyZXNob2xkZXJfOmZ1bmN0aW9uKGEpe3JldHVybiAwPT09YS5sZW5ndGh9LGNvbXB1dGVTZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2U6ZnVuY3Rpb24oKXt0aGlzLmNvdW50ZXJmYWN0dWFsRXhhbXBsZUFuZEluZmVyZW5jZT1udWxsO3RoaXMuc2VsZWN0ZWQmJnRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzPyh0aGlzLnNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZT0wPHRoaXMuc2VsZWN0ZWQubGVuZ3RoP3RoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzW3RoaXMuc2VsZWN0ZWRbMF1dOm51bGwsbnVsbD09dGhpcy5zZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2U/CnRoaXMuZ2xvYmFsUGRQbG90cz0hMDoodGhpcy5nbG9iYWxQZFBsb3RzPSExLCJkaXZlIiE9dGhpcy52aXNNb2RlJiZ0aGlzLnNob3dQYXJ0aWFsRGVwZW5kZW5jZVBsb3RzXygpKSk6dGhpcy5zZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2U9bnVsbH0sc2V0QXR0cmlidXRpb25zOmZ1bmN0aW9uKCl7aWYodGhpcy5zZWxlY3RlZCYmMCE9dGhpcy5zZWxlY3RlZC5sZW5ndGgpe3ZhciBhPXt9LGM9dGhpcy52aXNkYXRhW3RoaXMuc2VsZWN0ZWRbMF1dLGQ9dGhpcy5hdHRyaWJ1dGlvblN0cldpdGhNb2RlbE5hbWVfKCIiLHRoaXMuYXR0cmlidXRpb25Nb2RlbEluZGV4KSxmPW5ldyBSZWdFeHAoImF0dHJpYnV0aW9uc19fKC4qKSIrZCk7ZD1uZXcgUmVnRXhwKCJhdHRyaWJ1dGlvbnNfXyguKilfa2V5cyIrZCk7Zm9yKGxldCBsIGluIGMpe3ZhciBnPWYuZXhlYyhsKTtpZihnKXtnPW5ldyBSZWdFeHAoIl4oZmVhdHVyZXNfXyk/IitnWzFdKyIkIik7Zm9yKGxldCBrIGluIGMpaWYoZy50ZXN0KGspKXthW2tdPQpjW2xdO2JyZWFrfX1pZihnPWQuZXhlYyhsKSl7Zz1uZXcgUmVnRXhwKCJeKGZlYXR1cmVzX18pPyIrZ1sxXSsiJCIpO2ZvcihsZXQgayBpbiBjKWlmKGcudGVzdChrKSl7Zz1jW2xdO2NvbnN0IG49Y1tsLnJlcGxhY2UoIl9rZXlzIiwiX3ZhbHVlcyIpXSxwPUFycmF5LmFwcGx5KG51bGwsQXJyYXkoQXJyYXkuaXNBcnJheShjW2tdKT9jW2tdLmxlbmd0aDoxKSkubWFwKE51bWJlci5wcm90b3R5cGUudmFsdWVPZiwwKTtmb3IobGV0IHE9MDtxPGcubGVuZ3RoO3ErKyl7bGV0IHI9Y1trXS5pbmRleE9mKGdbcV0pOy0xIT1yJiYocFtyXT1uW3FdKX1hW2tdPXA7YnJlYWt9fX10aGlzLmF0dHJpYnV0aW9uPWF9fSxzaG91bGREaXNhYmxlR2V0RXhhbXBsZXNCdXR0b25fOmZ1bmN0aW9uKGEpe3JldHVybiAwPT1hLmxlbmd0aH0sc2hvdWxkRGlzYWJsZUluZmVyQnV0dG9uXzpmdW5jdGlvbihhLGMsZCxmKXtyZXR1cm4gMD09YS5sZW5ndGh8fDA9PWMubGVuZ3RofHwwPT1kLmxlbmd0aHx8IWZ9LAphcmVFeGFtcGxlc0VkaXRhYmxlXzpmdW5jdGlvbihhLGMpe3JldHVybiAwIT1hLmxlbmd0aCYmMCE9Yy5sZW5ndGh9LG5ld0luZmVyZW5jZXNfOmZ1bmN0aW9uKCl7dGhpcy5sb2FkaW5nQmFySGlkZGVuXz0hMDt0aGlzLnVwZGF0ZUluZmVyZW5jZXNfKCEwKTtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PnRoaXMudXBkYXRlSW5mZXJlbmNlU3RhdHNfKCEwKSl9LHJlZnJlc2hJbmZlcmVuY2VzTm9SZWdlbl86ZnVuY3Rpb24oKXt0aGlzLnJlZnJlc2hJbmZlcmVuY2VzXyghMCk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLnVwZGF0ZUluZmVyZW5jZVN0YXRzXyghMCkpfSxyZWZyZXNoSW5mZXJlbmNlc186ZnVuY3Rpb24oYSl7dGhpcy51cGRhdGVJbmZlcmVuY2VzXyghMSk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLnVwZGF0ZUluZmVyZW5jZVN0YXRzXyghYSkpfSx1cGRhdGVJbmZlcmVuY2VzXzpmdW5jdGlvbihhKXtpZih0aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlcyYmCnRoaXMuaW5mZXJlbmNlcy5pbmRpY2VzJiYwIT10aGlzLmluZmVyZW5jZXMuaW5kaWNlcy5sZW5ndGgmJnRoaXMuaW5mZXJlbmNlcy5yZXN1bHRzLmxlbmd0aD09dGhpcy5udW1Nb2RlbHMpe3ZhciBjPXt9LGQ9ISF0aGlzLmluZmVyZW5jZXMucmVzdWx0c1swXS5jbGFzc2lmaWNhdGlvblJlc3VsdDtmb3IobGV0IGs9MDtrPHRoaXMuaW5mZXJlbmNlcy5pbmRpY2VzLmxlbmd0aDtrKyspaWYoZCl7Y1t0aGlzLmluZmVyZW5jZXMuaW5kaWNlc1trXV09W107Zm9yKHZhciBmPTA7Zjx0aGlzLmluZmVyZW5jZXMucmVzdWx0cy5sZW5ndGg7ZisrKXtjb25zdCBuPXRoaXMuaW5mZXJlbmNlcy5yZXN1bHRzW2ZdLmNsYXNzaWZpY2F0aW9uUmVzdWx0O2ZvcihsZXQgcD0wO3A8bi5jbGFzc2lmaWNhdGlvbnNba10uY2xhc3Nlcy5sZW5ndGg7cCsrKSIiPT1uLmNsYXNzaWZpY2F0aW9uc1trXS5jbGFzc2VzW3BdLmxhYmVsJiYobi5jbGFzc2lmaWNhdGlvbnNba10uY2xhc3Nlc1twXS5sYWJlbD1wLnRvU3RyaW5nKCkpOwpjW3RoaXMuaW5mZXJlbmNlcy5pbmRpY2VzW2tdXVtmXT1uLmNsYXNzaWZpY2F0aW9uc1trXS5jbGFzc2VzLnNvcnQoKHAscSk9PnEuc2NvcmUtcC5zY29yZSl9fWVsc2UgZm9yKGNbdGhpcy5pbmZlcmVuY2VzLmluZGljZXNba11dPVtdLGY9MDtmPHRoaXMuaW5mZXJlbmNlcy5yZXN1bHRzLmxlbmd0aDtmKyspY1t0aGlzLmluZmVyZW5jZXMuaW5kaWNlc1trXV1bZl09W3tsYWJlbDoiIixzY29yZTp0aGlzLmluZmVyZW5jZXMucmVzdWx0c1tmXS5yZWdyZXNzaW9uUmVzdWx0LnJlZ3Jlc3Npb25zW2tdLnZhbHVlfV07dGhpcy5zZXQoImV4YW1wbGVzQW5kSW5mZXJlbmNlcyIsdGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXMubWFwKGZ1bmN0aW9uKGssbil7bGV0IHA9ay5pbmZlcmVuY2VzP2suaW5mZXJlbmNlczpbXTtjW25dJiZhJiYocD1wLmNvbmNhdChbY1tuXV0pKTtyZXR1cm57ZXhhbXBsZTprLmV4YW1wbGUsaW5mZXJlbmNlczpwLGNoYW5nZWQ6ay5jaGFuZ2VkLG9yaWc6ay5vcmlnfX0pKTsKdmFyIGc9dGhpcyxsPSExO3RoaXMudmlzZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGssbil7aWYoZClnLnNldEl0ZW1JbmZlcmVuY2VWYWx1ZShrLG4sZy5zZWxlY3RlZEJyZWFrZG93bkZlYXR1cmUsZy5zZWxlY3RlZFNlY29uZEJyZWFrZG93bkZlYXR1cmUpO2Vsc2UgZm9yKHZhciBwPTA7cDxnLm51bU1vZGVscztwKyspa1tnLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHZhbHVlIixwKV09Zy5leGFtcGxlc0FuZEluZmVyZW5jZXNbbl0uaW5mZXJlbmNlc1tnLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1tuXS5pbmZlcmVuY2VzLmxlbmd0aC0xXVtwXVswXS5zY29yZTtpZihkJiYwPGcubGFiZWxWb2NhYi5sZW5ndGgpe2ZvcihwPTA7cDxnLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1tuXS5pbmZlcmVuY2VzLmxlbmd0aDtwKyspZm9yKGxldCBxPTA7cTxnLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1tuXS5pbmZlcmVuY2VzW3BdLmxlbmd0aDtxKyspZm9yKGxldCByPTA7cjxnLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1tuXS5pbmZlcmVuY2VzW3BdW3FdLmxlbmd0aDtyKyspZy5leGFtcGxlc0FuZEluZmVyZW5jZXNbbl0uaW5mZXJlbmNlc1twXVtxXVtyXS52b2NhYkxhYmVsPQpnLmxhYmVsVm9jYWJbZy5leGFtcGxlc0FuZEluZmVyZW5jZXNbbl0uaW5mZXJlbmNlc1twXVtxXVtyXS5sYWJlbF07Zm9yKG49MDtuPGcubnVtTW9kZWxzO24rKylrW2cuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2UgbGFiZWwiLG4pXT1nLmxhYmVsVm9jYWJba1tnLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHZhbHVlIixuKV1dO2w9ITB9fSk7dGhpcy51cGRhdGVDb3JyZWN0bmVzc18oKTt0aGlzLnJlZnJlc2hEaXZlXygpO3RoaXMuaW5mZXJlbmNlcy5pbmRpY2VzLmxlbmd0aD09dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXMubGVuZ3RoJiYodGhpcy4kLmRpdmUuY29sb3JCeT1sP3RoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2UgbGFiZWwiLDApOnRoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2UgdmFsdWUiLDApLHRoaXMuaXNSZWdyZXNzaW9uXyh0aGlzLm1vZGVsVHlwZSk/KHRoaXMuJC5kaXZlLmhvcml6b250YWxQb3NpdGlvbj10aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHZhbHVlIiwKMCksMTx0aGlzLm51bU1vZGVscyYmKHRoaXMuJC5kaXZlLnZlcnRpY2FsUG9zaXRpb249dGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiIEluZmVyZW5jZSB2YWx1ZSIsMSkpKTp0aGlzLmlzQmluYXJ5Q2xhc3NpZmljYXRpb25fKHRoaXMubW9kZWxUeXBlLHRoaXMubXVsdGlDbGFzcykmJigxPT10aGlzLm51bU1vZGVscz90aGlzLiQuZGl2ZS52ZXJ0aWNhbFBvc2l0aW9uPXRoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2Ugc2NvcmUiLDApOih0aGlzLiQuZGl2ZS5ob3Jpem9udGFsUG9zaXRpb249dGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiIEluZmVyZW5jZSBzY29yZSIsMCksdGhpcy4kLmRpdmUudmVydGljYWxQb3NpdGlvbj10aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHNjb3JlIiwxKSkpKTt0aGlzLnVwZGF0ZWRFeGFtcGxlPSExfX0saGFzQXR0cmlidXRpb25zXzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmMCE9T2JqZWN0LmtleXMoYS5hdHRyaWJ1dGlvbnMpLmxlbmd0aCYmCm51bGwhPWEuYXR0cmlidXRpb25zWzBdfSxoYXNNdWx0aXBsZU1vZGVsQXR0cmlidXRpb25zXzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmMTxPYmplY3Qua2V5cyhhLmF0dHJpYnV0aW9ucykubGVuZ3RoJiZudWxsIT1hLmF0dHJpYnV0aW9uc1swXSYmbnVsbCE9YS5hdHRyaWJ1dGlvbnNbMV19LG5ld0V4dHJhT3V0cHV0c186ZnVuY3Rpb24oYSl7dmFyIGM9W107Zm9yKHZhciBkPTA7ZDxhLmV4dHJhLmxlbmd0aDtkKyspbnVsbCE9YS5leHRyYVtkXSYmImF0dHJpYnV0aW9ucyJpbiBhLmV4dHJhW2RdJiZjLnB1c2goYS5leHRyYVtkXS5hdHRyaWJ1dGlvbnMpOzA8Yy5sZW5ndGgmJih0aGlzLmF0dHJpYnV0aW9ucz17aW5kaWNlczphLmluZGljZXMsYXR0cmlidXRpb25zOmN9KTtmb3IoYz0wO2M8YS5pbmRpY2VzLmxlbmd0aDtjKyspe2Q9YS5pbmRpY2VzW2NdO2NvbnN0IGw9T2JqZWN0LmFzc2lnbih7fSx0aGlzLnZpc2RhdGFbZF0pO2ZvcihsZXQgaz0wO2s8YS5leHRyYS5sZW5ndGg7aysrKXtpZihudWxsPT0KYS5leHRyYVtrXSljb250aW51ZTtjb25zdCBuPU9iamVjdC5rZXlzKGEuZXh0cmFba10pO2ZvcihsZXQgcD0wO3A8bi5sZW5ndGg7cCsrKXt2YXIgZj1uW3BdO2lmKCJhdHRyaWJ1dGlvbnMiPT1mKWNvbnRpbnVlO2xldCBxPWEuZXh0cmFba11bZl1bY107Zj10aGlzLnN0cldpdGhNb2RlbE5hbWVfKGYsayk7bFtmXT1xO0FycmF5LmlzQXJyYXkocSl8fChxPVtxXSk7Y29uc3Qgcj0wPHEubGVuZ3RoJiYoInN0cmluZyI9PXR5cGVvZiBxWzBdfHxxWzBdaW5zdGFuY2VvZiBTdHJpbmcpO3ZhciBnPUpTT04uc3RyaW5naWZ5KHRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzW2RdLmV4YW1wbGUpO2c9SlNPTi5wYXJzZShnKTtnLmZlYXR1cmVzLmZlYXR1cmVbZl09cj97Ynl0ZXNMaXN0Ont2YWx1ZTpxfX06e2Zsb2F0TGlzdDp7dmFsdWU6cX19O3RoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzW2RdLmV4YW1wbGU9Z319dGhpcy5zZXQoYHZpc2RhdGEuJHtkfWAsbCl9dGhpcy5yZWZyZXNoRGl2ZV8oKTsKdGhpcy5jb21wdXRlU2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlKCk7dGhpcy5yZWZyZXNoU2VsZWN0ZWREYXRhcG9pbnRfKCl9LG5ld0F0dHJpYnV0aW9uc186ZnVuY3Rpb24oYSl7aWYodGhpcy5oYXNBdHRyaWJ1dGlvbnNfKGEpKXtmb3IobGV0IGQ9MDtkPGEuaW5kaWNlcy5sZW5ndGg7ZCsrKXtjb25zdCBmPWEuaW5kaWNlc1tkXSxnPU9iamVjdC5hc3NpZ24oe30sdGhpcy52aXNkYXRhW2ZdKTtmb3IobGV0IGw9MDtsPGEuYXR0cmlidXRpb25zLmxlbmd0aDtsKyspe2NvbnN0IGs9bnVsbD09YS5hdHRyaWJ1dGlvbnNbbF0/e306YS5hdHRyaWJ1dGlvbnNbbF1bZF0sbj1PYmplY3Qua2V5cyhrKTtmb3IobGV0IHA9MDtwPG4ubGVuZ3RoO3ArKyl7dmFyIGM9dGhpcy5hdHRyaWJ1dGlvblN0cldpdGhNb2RlbE5hbWVfKCJhdHRyaWJ1dGlvbnNfXyIrbltwXSxsKTtBcnJheS5pc0FycmF5KGtbbltwXV0pJiYyPT1rW25bcF1dLmxlbmd0aCYmQXJyYXkuaXNBcnJheShrW25bcF1dWzBdKT8KKGdbImF0dHJpYnV0aW9uc19fIituW3BdKyJfa2V5cyJdPWtbbltwXV1bMF0sYz10aGlzLmF0dHJpYnV0aW9uU3RyV2l0aE1vZGVsTmFtZV8oImF0dHJpYnV0aW9uc19fIituW3BdKyJfdmFsdWVzIixsKSxnW2NdPWtbbltwXV1bMV0pOmdbY109a1tuW3BdXTtjPUFycmF5LmlzQXJyYXkoZ1tjXSk/Z1tjXTpbZ1tjXV07Zm9yKGxldCBxPTA7cTxjLmxlbmd0aDtxKyspY1txXT50aGlzLm1heEF0dHJpYnV0aW9uJiYodGhpcy5tYXhBdHRyaWJ1dGlvbj1jW3FdKSxjW3FdPHRoaXMubWluQXR0cmlidXRpb24mJih0aGlzLm1pbkF0dHJpYnV0aW9uPWNbcV0pfX10aGlzLnNldChgdmlzZGF0YS4ke2Z9YCxnKX0wPnRoaXMubWluQXR0cmlidXRpb24mJnRoaXMubWF4QXR0cmlidXRpb24+TWF0aC5hYnModGhpcy5taW5BdHRyaWJ1dGlvbik/dGhpcy5taW5BdHRyaWJ1dGlvbj0tMSp0aGlzLm1heEF0dHJpYnV0aW9uOjA8dGhpcy5tYXhBdHRyaWJ1dGlvbiYmTWF0aC5hYnModGhpcy5taW5BdHRyaWJ1dGlvbik+CnRoaXMubWF4QXR0cmlidXRpb24mJih0aGlzLm1heEF0dHJpYnV0aW9uPS0xKnRoaXMubWluQXR0cmlidXRpb24pO3RoaXMuc2V0QXR0cmlidXRpb25zKCk7dGhpcy5jcmVhdGVBdHRyaWJ1dGlvbkxlZ2VuZCgpO3RoaXMucmVmcmVzaERpdmVfKCl9fSxjcmVhdGVBdHRyaWJ1dGlvbkxlZ2VuZDpmdW5jdGlvbigpe3ZhciBhPVtdLGM9W107MD50aGlzLm1pbkF0dHJpYnV0aW9uJiYoYS5wdXNoKHRoaXMubWluQXR0cmlidXRpb24pLGMucHVzaCgiIzk0M0E0MyIpLGEucHVzaCh0aGlzLm1pbkF0dHJpYnV0aW9uLzUpLGMucHVzaCgiI0M3Njk2RSIpKTthLnB1c2goMCk7Yy5wdXNoKCIjRkZEOEMzIik7MDx0aGlzLm1heEF0dHJpYnV0aW9uJiYoYS5wdXNoKHRoaXMubWF4QXR0cmlidXRpb24vNSksYy5wdXNoKCIjNkE5RUE3IiksYS5wdXNoKHRoaXMubWF4QXR0cmlidXRpb24pLGMucHVzaCgiIzNENzA3OCIpKTt0aGlzLmF0dHJpYnV0aW9uQ29sb3JTY2FsZT1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihhKS5pbnRlcnBvbGF0ZShVdCkuY2xhbXAoITApLnJhbmdlKGMpOwp2YXIgZD1Qb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3IoIiNhdHRyaWJ1dGlvbkxlZ2VuZCIpO2QzLnNlbGVjdChkKS5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTtkPWQzLnNlbGVjdChkKS5hcHBlbmQoImciKTtjb25zdCBmPWQuYXBwZW5kKCJkZWZzIikuYXBwZW5kKCJsaW5lYXJHcmFkaWVudCIpLmF0dHIoImlkIiwidnpleGFtcGxldmlld2VyZ3JhZGllbnQiKS5hdHRyKCJ4MSIsIjAlIikuYXR0cigieTEiLCIwJSIpLmF0dHIoIngyIiwiMTAwJSIpLmF0dHIoInkyIiwiMCUiKS5hdHRyKCJzcHJlYWRNZXRob2QiLCJwYWQiKSxnPVtdOzU9PWMubGVuZ3RoPyhnLnB1c2godGhpcy5taW5BdHRyaWJ1dGlvbi8yKSxnLnB1c2goMCksZy5wdXNoKHRoaXMubWF4QXR0cmlidXRpb24vMikpOjA+dGhpcy5taW5BdHRyaWJ1dGlvbj8oZy5wdXNoKHRoaXMubWluQXR0cmlidXRpb24vNCozKSxnLnB1c2godGhpcy5taW5BdHRyaWJ1dGlvbi8yKSxnLnB1c2godGhpcy5taW5BdHRyaWJ1dGlvbi8KNCkpOihnLnB1c2godGhpcy5tYXhBdHRyaWJ1dGlvbi80KSxnLnB1c2godGhpcy5tYXhBdHRyaWJ1dGlvbi8yKSxnLnB1c2godGhpcy5tYXhBdHRyaWJ1dGlvbi80KjMpKTtjb25zdCBsPWFbMF0saz1hW2EubGVuZ3RoLTFdLWw7YT1hLm1hcChuPT5NYXRoLnJvdW5kKChuLWwpL2sqMTAwKSsiJSIpO2QzLnppcChhLGMpLmZvckVhY2gobj0+e2YuYXBwZW5kKCJzdG9wIikuYXR0cigib2Zmc2V0IixuWzBdKS5hdHRyKCJzdG9wLWNvbG9yIixuWzFdKS5hdHRyKCJzdG9wLW9wYWNpdHkiLDEpfSk7ZC5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4MSIsMCkuYXR0cigieTEiLDApLmF0dHIoIndpZHRoIiwxNjApLmF0dHIoImhlaWdodCIsOCkuc3R5bGUoImZpbGwiLCJ1cmwoI3Z6ZXhhbXBsZXZpZXdlcmdyYWRpZW50KSIpO2M9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oW3RoaXMubWluQXR0cmlidXRpb24sdGhpcy5tYXhBdHRyaWJ1dGlvbl0pLnJhbmdlKFswLDE2MF0pO2M9ZDMuYXhpc0JvdHRvbShjKS50aWNrVmFsdWVzKGcpLnRpY2tTaXplKDQpLnRpY2tGb3JtYXQoZDMuZm9ybWF0KCIuMWYiKSk7CmQuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsZWdlbmQgYXhpcyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLDgpIikuc3R5bGUoImZvbnQiLCI5cHgiKS5jYWxsKGMpfSxzZXRJdGVtSW5mZXJlbmNlVmFsdWU6ZnVuY3Rpb24oYSxjLGQpe3ZhciBmPXRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzW2NdLmluZmVyZW5jZXMubGVuZ3RoLTE7aWYodGhpcy5tdWx0aUNsYXNzKWZvcihkPTA7ZDx0aGlzLm51bU1vZGVscztkKyspYVt0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHZhbHVlIixkKV09dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXNbY10uaW5mZXJlbmNlc1tmXVtkXVswXS5sYWJlbDtlbHNlIGZvcihmPXRoaXMub3ZlcmFsbFRocmVzaG9sZHMsMCE9PWQubGVuZ3RoJiYoZj10aGlzLmdldFNsaWNlS2V5XyhhLHRoaXMuc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlLHRoaXMuc2VsZWN0ZWRTZWNvbmRCcmVha2Rvd25GZWF0dXJlKSxmPXRoaXMuZmVhdHVyZVZhbHVlVGhyZXNob2xkc1t0aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHNJbmRleE1hcFtmXV0udGhyZXNob2xkKSwKZD0wO2Q8dGhpcy5udW1Nb2RlbHM7ZCsrKXtjb25zdCBnPXRoaXMuZ2V0Q2xhc3NpZmljYXRpb25CZXN0Tm9uWmVybyhjLGQpO2FbdGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiIEluZmVyZW5jZSBzY29yZSIsZCldPWcuc2NvcmU7YVt0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHZhbHVlIixkKV09Zy5zY29yZT49ZltkXS50aHJlc2hvbGQ/Zy5sYWJlbDp0aGlzLmRlZmF1bHRJbmZlcmVuY2VMYWJlbC50b1N0cmluZygpfX0sY3JlYXRlQ29tYmluZWRWYWx1ZVN0cmluZ186ZnVuY3Rpb24oYSxjKXthPXZvaWQgMD09PWF8fG51bGw9PT1hPyIiOmE7cmV0dXJuIHZvaWQgMD09PWN8fG51bGw9PT1jfHwiIj09PWM/YTphKyIvIitjfSx1cGRhdGVDb3JyZWN0bmVzc186ZnVuY3Rpb24oKXtpZih0aGlzLnNlbGVjdGVkTGFiZWxGZWF0dXJlJiZ0aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlcylmb3IobGV0IGE9MDthPHRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzLmxlbmd0aDthKyspe2NvbnN0IGM9CnRoaXMudmlzZGF0YVthXTtmb3IobGV0IGQ9MDtkPHRoaXMubnVtTW9kZWxzO2QrKykiY2xhc3NpZmljYXRpb24iPT10aGlzLm1vZGVsVHlwZT9jW3RoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2UgY29ycmVjdCIsZCldPWNbdGhpcy5zZWxlY3RlZExhYmVsRmVhdHVyZV09PWNbdGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiIEluZmVyZW5jZSB2YWx1ZSIsZCldPyJjb3JyZWN0IjoiaW5jb3JyZWN0IjooY1t0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIGVycm9yIixkKV09Y1t0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHZhbHVlIixkKV0tY1t0aGlzLnNlbGVjdGVkTGFiZWxGZWF0dXJlXSxjW3RoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2UgYWJzb2x1dGUgZXJyb3IiLGQpXT1NYXRoLmFicyhjW3RoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2UgZXJyb3IiLGQpXSksY1t0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHNxdWFyZWQgZXJyb3IiLApkKV09Y1t0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIGVycm9yIixkKV0qY1t0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIGVycm9yIixkKV0pfX0saW5mZXJDbGlja2VkXzpmdW5jdGlvbigpe2NvbnN0IGE9e2luZmVyZW5jZV9hZGRyZXNzOnRoaXMuaW5mZXJlbmNlQWRkcmVzcyxtb2RlbF9uYW1lOnRoaXMubW9kZWxOYW1lLG1vZGVsX3R5cGU6dGhpcy5tb2RlbFR5cGUsbW9kZWxfdmVyc2lvbjp0aGlzLm1vZGVsVmVyc2lvbixtb2RlbF9zaWduYXR1cmU6dGhpcy5tb2RlbFNpZ25hdHVyZSxsYWJlbF92b2NhYl9wYXRoOnRoaXMubGFiZWxWb2NhYlBhdGgsdXNlX3ByZWRpY3Q6dGhpcy51c2VQcmVkaWN0QXBpLHByZWRpY3Rfb3V0cHV0X3RlbnNvcjp0aGlzLnByZWRpY3RPdXRwdXRUZW5zb3IscHJlZGljdF9pbnB1dF90ZW5zb3I6dGhpcy5wcmVkaWN0SW5wdXRUZW5zb3J9O3RoaXMubG9hZGluZ0JhckhpZGRlbl89ITE7aWYoIXRoaXMubG9jYWwpe2NvbnN0IGM9CnRoaXMubWFrZVVybF8oIi9kYXRhL3BsdWdpbi93aGF0aWYvaW5mZXIiLGEpO3RoaXMubWFrZUFzeW5jUmVxdWVzdF8oYyxkPT57dGhpcy5sb2FkaW5nQmFySGlkZGVuXz0hMDt0aGlzLmxhYmVsVm9jYWI9SlNPTi5wYXJzZShkLnZhbHVlLnZvY2FiKTt0aGlzLmluZmVyZW5jZXM9SlNPTi5wYXJzZShkLnZhbHVlLmluZmVyZW5jZXMpfSxudWxsLCJtb2RlbCBpbmZlcmVuY2UiKX10aGlzLmZpcmUoImluZmVyLWV4YW1wbGVzIixhKX0sZXhhbXBsZUNoYW5nZV86ZnVuY3Rpb24oYSl7dmFyIGM9MD09dGhpcy5zZWxlY3RlZC5sZW5ndGg/MDp0aGlzLnNlbGVjdGVkWzBdO3RoaXMuc2V0KCJzZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2UuY2hhbmdlZCIsITApO3RoaXMudXBkYXRlRXhhbXBsZV8oSlNPTi5zdHJpbmdpZnkoYS50YXJnZXQuanNvbiksYyk7dGhpcy4kJCgiIyIrdGhpcy5nZXRJbmZlcmVuY2VIb2xkZXJJZF8oKSkuaW5mZXJlbmNlPW51bGw7dGhpcy52aXNkYXRhW2NdPXRoaXMuZXhhbXBsZVRvRGF0YVBvaW50XyhhLnRhcmdldC5qc29uLApjKTt0aGlzLnNob3dOZWFyZXN0Q291bnRlcmZhY3R1YWw9ITE7dGhpcy5yZWZyZXNoRGl2ZV8oKTt0aGlzLnVwZGF0ZWRFeGFtcGxlPSEwO3RoaXMuc2VsZWN0ZWREYXRhVXBkYXRlZF8oKX0scmVmcmVzaERpdmVJbXBsXzpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlzZGF0YTt0aGlzLnZpc2RhdGE9W107dGhpcy52aXNkYXRhPWE7dGhpcy5zZWxlY3RlZEV4YW1wbGVNYXg9dGhpcy52aXNkYXRhLmxlbmd0aC0xO3RoaXMuJC5vdmVydmlldy5wcm90b0lucHV0PXRoaXMuJC5vdmVydmlldy5nZXRTdGF0c1Byb3RvKFt7bmFtZToiIixkYXRhOmF9XSk7dGhpcy5jYWxjdWxhdGVEaXN0YW5jZVN0YXRzXyh0aGlzLiQub3ZlcnZpZXcucHJvdG9JbnB1dC50b09iamVjdCgpKTt0aGlzLmlzUmVncmVzc2lvbl8odGhpcy5tb2RlbFR5cGUpJiZ0aGlzLmFkanVzdE1pbkNvdW50ZXJmYWN0dWFsVmFsdWVEaXN0XygpO2E9dGhpcy4kLmRpdmUuc2VsZWN0ZWREYXRhO3RoaXMuJC5kaXZlLnNlbGVjdGVkRGF0YT0KW107dGhpcy4kLmRpdmUuc2VsZWN0ZWREYXRhPWE7dGhpcy51cGRhdGVTcHJpdGUoKX0scmVmcmVzaERpdmVfOmZ1bmN0aW9uKCl7dGhpcy5kZWJvdW5jZSgicmVmcmVzaERpdmVEZWJvdW5jZSIsKCk9PnRoaXMucmVmcmVzaERpdmVJbXBsXygpLDUwMCl9LGNhbGN1bGF0ZURpc3RhbmNlU3RhdHNfOmZ1bmN0aW9uKGEpe3RoaXMuZGlzdGFuY2VTdGF0c189e307Zm9yKGxldCBjPTA7YzxhLmRhdGFzZXRzTGlzdFswXS5mZWF0dXJlc0xpc3QubGVuZ3RoO2MrKyl7Y29uc3QgZD1hLmRhdGFzZXRzTGlzdFswXS5mZWF0dXJlc0xpc3RbY10sZj1kLm5hbWU7dGhpcy5kaXN0YW5jZVN0YXRzX1tmXT17aXNOdW1lcmljOm51bGwhPWQubnVtU3RhdHN9O2lmKHRoaXMuZGlzdGFuY2VTdGF0c19bZl0uaXNOdW1lcmljKXRoaXMuZGlzdGFuY2VTdGF0c19bZl0uc3RkRGV2PWQubnVtU3RhdHMuc3RkRGV2O2Vsc2V7bGV0IGc9MDtjb25zdCBsPWQuc3RyaW5nU3RhdHMucmFua0hpc3RvZ3JhbS5idWNrZXRzTGlzdDsKZm9yKGxldCBrPTA7azxsLmxlbmd0aDtrKyspe2NvbnN0IG49bFtrXS5zYW1wbGVDb3VudC9kLnN0cmluZ1N0YXRzLmNvbW1vblN0YXRzLm51bU5vbk1pc3Npbmc7Zys9bipufXRoaXMuZGlzdGFuY2VTdGF0c19bZl0ucHJvYlNhbWVWYWx1ZT1nfX19LGlzTnVtZXJpY0ZlYXR1cmVfOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZ0aGlzLmRpc3RhbmNlU3RhdHNfJiZ0aGlzLmRpc3RhbmNlU3RhdHNfW2FdJiZ0aGlzLmRpc3RhbmNlU3RhdHNfW2FdLmlzTnVtZXJpY30sY2FsY3VsYXRlQnVja2V0RWRnZXNfOmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZChwKXtjb25zdCBxPS1NYXRoLmZsb29yKE1hdGgubG9nMTAoaykpKzE7cmV0dXJuIE1hdGgucm91bmQocCpNYXRoLnBvdygxMCxxKSkvTWF0aC5wb3coMTAscSl9aWYoIXRoaXMuaXNOdW1lcmljRmVhdHVyZV8oYSl8fHRoaXMuc3RhdHNbYV0udW5pcXVlQ291bnQ8PWN8fHRoaXMuZmVhdHVyZUJ1Y2tldEVkZ2VzX1thXSYmdGhpcy5mZWF0dXJlQnVja2V0RWRnZXNfW2FdLmxlbmd0aD09CmMrMSlkZWxldGUgdGhpcy5mZWF0dXJlQnVja2V0RWRnZXNfW2FdO2Vsc2V7dmFyIGY9dGhpcy5zdGF0c1thXS5udW1iZXJNaW4sZz10aGlzLnN0YXRzW2FdLm51bWJlck1heCxsPShnLWYpL2Msaz10aGlzLmRpc3RhbmNlU3RhdHNfW2FdLnN0ZERldixuPVtdO24ucHVzaChmKTtmb3IobGV0IHA9MTtwPGM7cCsrKW4ucHVzaChkKGYrcCpsKSk7bi5wdXNoKGcpO3RoaXMuZmVhdHVyZUJ1Y2tldEVkZ2VzX1thXT1ufX0sdXBkYXRlRXhhbXBsZV86ZnVuY3Rpb24oYSxjKXt0aGlzLmZpcmUoInVwZGF0ZS1leGFtcGxlIix7ZXhhbXBsZTphLGluZGV4OmN9KTtpZighdGhpcy5sb2NhbCl7dmFyIGQ9dGhpcy5tYWtlVXJsXygiL2RhdGEvcGx1Z2luL3doYXRpZi91cGRhdGVfZXhhbXBsZSIsbnVsbCk7dGhpcy5tYWtlQXN5bmNSZXF1ZXN0XyhkLG51bGwse2V4YW1wbGU6YSxpbmRleDpjfSwiZGF0YXBvaW50IHVwZGF0ZSIpfX0sZ2V0SW5mZXJlbmNlSG9sZGVySWRfOmZ1bmN0aW9uKCl7cmV0dXJuImluZmVyZW5jZV8ifSwKbWFrZVVybF86ZnVuY3Rpb24oYSxjKXtjJiYoYSs9Ij8iK09iamVjdC5rZXlzKGMpLm1hcChkPT5kKyJceDNkIitlbmNvZGVVUklDb21wb25lbnQoY1tkXSkpLmpvaW4oIlx4MjYiKSk7cmV0dXJuIGF9LHNob3dUb2FzdF86ZnVuY3Rpb24oYSl7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItdG9hc3QiKTtjLmR1cmF0aW9uPTFFNDtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGMpO2MudGV4dD1hO2Muc2hvdygpO2NvbnNvbGUuZXJyb3IoYSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe3RoaXMuc2hvd1RvYXN0XyhhKTt0aGlzLmV4YW1wbGVTdGF0dXNTdHI9YTt0aGlzLmxvYWRpbmdCYXJIaWRkZW5fPSEwO3RoaXMuaXNTb3J0aW5nRWxpZ2libGVGZWF0dXJlcz0hMX0sbWFrZUFzeW5jUmVxdWVzdF86ZnVuY3Rpb24oYSxjLGQsZixnKXtnPXZvaWQgMD09PWc/KCk9Pnt9Omc7Y29uc3QgbD10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoaz0+e2suY2FuY2VsbGVkfHwKKGsudmFsdWUmJmsudmFsdWUuZXJyb3I/KHRoaXMuaGFuZGxlRXJyb3Ioay52YWx1ZS5lcnJvciksbnVsbCE9ZyYmZygpKTpjJiZjKGspKX0pO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSxkKS50aGVuKGwpLmNhdGNoKGs9Pnt0aGlzLmhhbmRsZUVycm9yKGBSZXF1ZXN0IGZvciAke2Z9IGZhaWxlZDogJHtrfWApO251bGwhPWcmJmcoKX0pfSxkYXRhUG9pbnRWYWx1ZUZyb21GZWF0dXJlXzpmdW5jdGlvbihhLGMpe2xldCBkPW51bGw7YS5pbnQ2NExpc3Q/ZD1hLmludDY0TGlzdC52YWx1ZTphLmZsb2F0TGlzdD9kPWEuZmxvYXRMaXN0LnZhbHVlOmEuYnl0ZXNMaXN0JiZhLmJ5dGVzTGlzdC52YWx1ZSYmKGQ9YS5ieXRlc0xpc3QudmFsdWUubWFwKGY9PntpZigxRTU8Zi5sZW5ndGgpcmV0dXJuIkVSUk9SOiBzdHJpbmcgbm90IGRlY29kZWQgZHVlIHRvIGxlbmd0aCI7dHJ5e3JldHVybiBhdG9iKGYpfWNhdGNoKGcpe3JldHVybiBjb25zb2xlLmVycm9yKCJFcnJvciBkZWNvZGluZyBzdHJpbmc6ICIrCmcpLCJFUlJPUjogZXJyb3IgZGVjb2Rpbmcgc3RyaW5nIn19KSk7cmV0dXJuIGMmJmQmJjE9PWQubGVuZ3RoPyhhPWRbMF0saXNOYU4oYSk/YTpOdW1iZXIoYSkpOmR9LGV4YW1wbGVUb0RhdGFQb2ludF86ZnVuY3Rpb24oYSxjKXtjb25zdCBkPXt9O3ZhciBmPWEuZmVhdHVyZXN8fGEuY29udGV4dCxnPWYmJiJmZWF0dXJlImluIGY/T2JqZWN0LmtleXMoZi5mZWF0dXJlKTpbXTtmb3IodmFyIGwgaW4gZyl7dmFyIGs9Z1srbF07aWYoayE9dGhpcy5pbWFnZUZlYXR1cmVOYW1lKXt2YXIgbj10aGlzLmRhdGFQb2ludFZhbHVlRnJvbUZlYXR1cmVfKGYuZmVhdHVyZVtrXSwhMCk7bnVsbCE9biYmKGRba109bil9fWY9ImZlYXR1cmVMaXN0cyJpbiBhP09iamVjdC5rZXlzKGEuZmVhdHVyZUxpc3RzLmZlYXR1cmVMaXN0KTpbXTtmb3IoY29uc3QgcCBpbiBmKXtnPWZbK3BdO2w9YS5mZWF0dXJlTGlzdHMuZmVhdHVyZUxpc3RbZ10uZmVhdHVyZTtrPVtdO2ZvcihuPTA7bjxsLmxlbmd0aDtuKyspe2NvbnN0IHE9CnRoaXMuZGF0YVBvaW50VmFsdWVGcm9tRmVhdHVyZV8obFtuXSwhMSk7cSYmKGs9ay5jb25jYXQocSkpfWRbZ109a31kWyIgRGF0YXBvaW50IElEIl09YztyZXR1cm4gZH0sZ2V0RXhhbXBsZXNBbmRDbG9zZVNldHRpbmdzXzpmdW5jdGlvbigpe3RoaXMuc2V0dGluZ3NDbGlja2VkXygpO3RoaXMudXBkYXRlTnVtYmVyT2ZNb2RlbHMoKTt0aGlzLmdldEV4YW1wbGVzXygpfSxzaG93TW9kZWxOdW1iZXJzXzpmdW5jdGlvbigpe3JldHVybiAxPj10aGlzLm51bU1vZGVsc30sdXBkYXRlRXhhbXBsZUNvbnRlbnRzOmZ1bmN0aW9uKGEsYyl7dGhpcy5leGFtcGxlU3RhdHVzU3RyPWEubGVuZ3RoKyIgZGF0YXBvaW50cyBsb2FkZWQiO3RoaXMuJC5ub2V4YW1wbGVzLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMubG9hZGluZ0JhckhpZGRlbl89ITA7dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXM9YS5tYXAoZnVuY3Rpb24oZil7cmV0dXJue2V4YW1wbGU6SlNPTi5wYXJzZShmKSxjaGFuZ2VkOiExLApvcmlnOkpTT04ucGFyc2UoZil9fSk7dGhpcy51cGRhdGVkRXhhbXBsZT0hMDtjb25zdCBkPXRoaXM7dGhpcy52aXNkYXRhPXRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzLm1hcChmdW5jdGlvbihmLGcpe3JldHVybiBkLmV4YW1wbGVUb0RhdGFQb2ludF8oZi5leGFtcGxlLGcpfSk7dGhpcy4kLmRpdmUuYXRsYXNVcmw9IiI7dGhpcy4kLmRpdmUuaW1hZ2VGaWVsZE5hbWU9IiI7dGhpcy5oYXNTcHJpdGU9Yzt0aGlzLnJlZnJlc2hEaXZlXygpO3RoaXMuc2hvdWxkRGlzYWJsZUluZmVyQnV0dG9uXyh0aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlcyx0aGlzLm1vZGVsTmFtZSx0aGlzLmluZmVyZW5jZUFkZHJlc3MsdGhpcy51cGRhdGVkRXhhbXBsZSl8fHRoaXMuaW5mZXJDbGlja2VkXygpO3RoaXMuc2V0SW5mZXJlbmNlRnJvbUV4YW1wbGVEYXRhKCl9LHNldEluZmVyZW5jZUZyb21FeGFtcGxlRGF0YTpmdW5jdGlvbigpe2lmKDA8dGhpcy52aXNkYXRhLmxlbmd0aClpZihudWxsIT10aGlzLnZpc2RhdGFbMF0ucHJlZGljdGlvbnNfX3Byb2JhYmlsaXRpZXMpe3ZhciBhPQp7fSxjPUFycmF5LmFwcGx5KG51bGwse2xlbmd0aDp0aGlzLnZpc2RhdGEubGVuZ3RofSkubWFwKE51bWJlci5jYWxsLE51bWJlcik7YS5pbmRpY2VzPWM7YS5yZXN1bHRzPVt7Y2xhc3NpZmljYXRpb25SZXN1bHQ6e2NsYXNzaWZpY2F0aW9uczpbXX19XTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKylhLnJlc3VsdHNbMF0uY2xhc3NpZmljYXRpb25SZXN1bHQuY2xhc3NpZmljYXRpb25zW2RdPXtjbGFzc2VzOlt7bGFiZWw6IjAiLHNjb3JlOnRoaXMudmlzZGF0YVtkXS5wcmVkaWN0aW9uc19fcHJvYmFiaWxpdGllc1swXX0se2xhYmVsOiIxIixzY29yZTp0aGlzLnZpc2RhdGFbZF0ucHJlZGljdGlvbnNfX3Byb2JhYmlsaXRpZXNbMV19XX07dGhpcy5pbmZlcmVuY2VzPWF9ZWxzZSBpZihudWxsIT10aGlzLnZpc2RhdGFbMF0ucHJlZGljdGlvbnMpe2E9e307Yz1BcnJheS5hcHBseShudWxsLHtsZW5ndGg6dGhpcy52aXNkYXRhLmxlbmd0aH0pLm1hcChOdW1iZXIuY2FsbCxOdW1iZXIpOwphLmluZGljZXM9YzthLnJlc3VsdHM9W3tyZWdyZXNzaW9uUmVzdWx0OntyZWdyZXNzaW9uczpbXX19XTtmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCsrKWEucmVzdWx0c1swXS5yZWdyZXNzaW9uUmVzdWx0LnJlZ3Jlc3Npb25zW2RdPXt2YWx1ZTp0aGlzLnZpc2RhdGFbZF0ucHJlZGljdGlvbnN9O3RoaXMuaW5mZXJlbmNlcz1hfX0sZ2V0RXhhbXBsZXNfOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5tYWtlVXJsXygiL2RhdGEvcGx1Z2luL3doYXRpZi9leGFtcGxlc19mcm9tX3BhdGgiLHtleGFtcGxlc19wYXRoOnRoaXMuZXhhbXBsZXNQYXRoLG1heF9leGFtcGxlczp0aGlzLm1heEV4YW1wbGVzLHNhbXBsaW5nX29kZHM6dGhpcy5zYW1wbGluZ09kZHMsc2VxdWVuY2VfZXhhbXBsZXM6dGhpcy5zZXF1ZW5jZUV4YW1wbGVzfSk7dGhpcy5leGFtcGxlU3RhdHVzU3RyPSJMb2FkaW5nIGRhdGFwb2ludHMuLi4iO3RoaXMubWFrZUFzeW5jUmVxdWVzdF8oYSxjPT57dGhpcy51cGRhdGVFeGFtcGxlQ29udGVudHMoYy52YWx1ZS5leGFtcGxlcywKYy52YWx1ZS5zcHJpdGUpfSxudWxsLCJkYXRhcG9pbnQgbG9hZCIpO3RoaXMubG9hZGluZ0JhckhpZGRlbl89ITF9LHVwZGF0ZVNwcml0ZTpmdW5jdGlvbigpe3RoaXMuaGFzU3ByaXRlJiYodGhpcy4kLmRpdmUuYXRsYXNVcmw9bnVsbCx0aGlzLiQuZGl2ZS5hdGxhc1VybD10aGlzLmxvY2FsP3RoaXMubG9jYWxBdGxhc1VybDp0aGlzLm1ha2VVcmxfKCIvZGF0YS9wbHVnaW4vd2hhdGlmL3Nwcml0ZSIse30pKX0sc2VsZWN0ZWREYXRhVXBkYXRlZF86ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkRXhhbXBsZU51bT0wPHRoaXMuc2VsZWN0ZWQubGVuZ3RoP3RoaXMuc2VsZWN0ZWRbMF06IiI7dGhpcy52aXNkYXRhJiYwPHRoaXMudmlzZGF0YS5sZW5ndGgmJih0aGlzLnBhcnRpYWxEZXBQbG90UGVuZGluZ0ZlYXR1cmVzPVtdKX0sY29weURhdGFwb2ludF86ZnVuY3Rpb24oKXt2YXIgYT1KU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZS5leGFtcGxlKTthPQp7ZXhhbXBsZTpKU09OLnBhcnNlKGEpLGNoYW5nZWQ6ITEsb3JpZzpKU09OLnBhcnNlKGEpfTt0aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlcy5wdXNoKGEpO3RoaXMuc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlPWE7dGhpcy52aXNkYXRhLnB1c2godGhpcy5leGFtcGxlVG9EYXRhUG9pbnRfKGEuZXhhbXBsZSx0aGlzLnZpc2RhdGEubGVuZ3RoKSk7YT10aGlzLnNlbGVjdGVkWzBdO3RoaXMuc2hvd05lYXJlc3RDb3VudGVyZmFjdHVhbD0hMTt0aGlzLnNlbGVjdGVkWzBdPXRoaXMudmlzZGF0YS5sZW5ndGgtMTt0aGlzLnNlbGVjdGVkRGF0YVVwZGF0ZWRfKCk7dGhpcy51cGRhdGVkRXhhbXBsZT0hMDt0aGlzLmZpcmUoImR1cGxpY2F0ZS1leGFtcGxlIix7aW5kZXg6YX0pO3RoaXMubG9jYWw/dGhpcy5yZWZyZXNoRGl2ZV8oKTooYT10aGlzLm1ha2VVcmxfKCIvZGF0YS9wbHVnaW4vd2hhdGlmL2R1cGxpY2F0ZV9leGFtcGxlIix7aW5kZXg6YX0pLHRoaXMubWFrZUFzeW5jUmVxdWVzdF8oYSwKKCk9Pnt0aGlzLnJlZnJlc2hEaXZlXygpfSxudWxsLCJkYXRhcG9pbnQgZHVwbGljYXRpb24iKSl9LGRlbGV0ZURhdGFwb2ludERpYWxvZ186ZnVuY3Rpb24oKXt0aGlzLiQuZGVsZXRlZGlhbG9nLm9wZW4oKX0sZGVsZXRlRGF0YXBvaW50XzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2VsZWN0ZWRbMF07dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXMuc3BsaWNlKGEsMSk7dGhpcy52aXNkYXRhLnNwbGljZShhLDEpO2ZvcihsZXQgYz1hO2M8dGhpcy52aXNkYXRhLmxlbmd0aDtjKyspdGhpcy52aXNkYXRhW2NdWyIgRGF0YXBvaW50IElEIl09Yzt0aGlzLmNvbXBhcmVkSW5kaWNlcz1bXTt0aGlzLnNlbGVjdGVkPVtdO3RoaXMuc2VsZWN0ZWREYXRhVXBkYXRlZF8oKTt0aGlzLmZpcmUoImRlbGV0ZS1leGFtcGxlIix7aW5kZXg6YX0pO3RoaXMuJC5kaXZlLnNlbGVjdGVkSW5kaWNlcz1bXTt0aGlzLmxvY2FsP3RoaXMucmVmcmVzaERpdmVfKCk6KGE9dGhpcy5tYWtlVXJsXygiL2RhdGEvcGx1Z2luL3doYXRpZi9kZWxldGVfZXhhbXBsZSIsCntpbmRleDphfSksdGhpcy5tYWtlQXN5bmNSZXF1ZXN0XyhhLCgpPT57dGhpcy5yZWZyZXNoRGl2ZV8oKX0sbnVsbCwiZGF0YXBvaW50IGRlbGV0ZSIpKX0sc2hvdWxkRGlzYWJsZVJlc2V0XzpmdW5jdGlvbihhKXtyZXR1cm4hYX0scmVzZXREYXRhcG9pbnRfOmZ1bmN0aW9uKCl7dGhpcy5zZXQoInNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZS5leGFtcGxlIix7fSk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5zZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2UuY2hhbmdlZD0hMTtjb25zdCBhPUpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlLm9yaWcpO3RoaXMuc2V0KCJzZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2UuZXhhbXBsZSIsSlNPTi5wYXJzZShhKSk7dGhpcy52aXNkYXRhW3RoaXMuc2VsZWN0ZWRbMF1dPXRoaXMuZXhhbXBsZVRvRGF0YVBvaW50Xyh0aGlzLnNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZS5leGFtcGxlLAp0aGlzLnNlbGVjdGVkWzBdKTt0aGlzLnVwZGF0ZWRFeGFtcGxlPSEwO3RoaXMudXBkYXRlRXhhbXBsZV8oYSx0aGlzLnNlbGVjdGVkWzBdKTt0aGlzLnJlZnJlc2hEaXZlXygpfSl9LGFkZENoYXJ0OmZ1bmN0aW9uKGEsYyxkKXtsZXQgZixnPWQ7aWYodGhpcy5pc011bHRpQ2xhc3NfKHRoaXMubW9kZWxUeXBlLHRoaXMubXVsdGlDbGFzcykpe2c9W107Zm9yKGxldCBrPTA7azxkLmxlbmd0aDtrKyspe2xldCBuPXt9O2lmKE9iamVjdC5rZXlzKGRba10pLmxlbmd0aD5OdW1iZXIodGhpcy5tYXhJbmZlcmVuY2VFbnRyaWVzUGVyUnVuKSl7dmFyIGw9dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXNbdGhpcy5zZWxlY3RlZCYmMDx0aGlzLnNlbGVjdGVkLmxlbmd0aD90aGlzLnNlbGVjdGVkWzBdOjBdO2w9bC5pbmZlcmVuY2VzW2wuaW5mZXJlbmNlcy5sZW5ndGgtMV1ba10uc2xpY2UoMCx0aGlzLm1heEluZmVyZW5jZUVudHJpZXNQZXJSdW4pO2ZvcihsZXQgcD0wO3A8bC5sZW5ndGg7cCsrKXtjb25zdCBxPQpsW3BdLmxhYmVsO25bcV09ZFtrXVtxXX19ZWxzZSBuPWRba107Zy5wdXNoKG4pfX0ibnVtZXJpYyI9PWE/Zj10aGlzLm1ha2VMaW5lQ2hhcnQoYyxnKToiY2F0ZWdvcmljYWwiPT1hP2Y9dGhpcy5tYWtlQmFyQ2hhcnQoYyxnKTpjb25zb2xlLmVycm9yKCJVbmtub3duIGNoYXJ0VHlwZTogIithKTthPXRoaXMuZmVhdHVyZUNvbnRhaW5lckJ5TmFtZShjKS5xdWVyeVNlbGVjdG9yKCIudGYtY2F0ZWdvcnktcGFuZS1jb250ZW50Iik7UG9seW1lci5kb20oYSkuYXBwZW5kQ2hpbGQoZik7Yz10aGlzLnBhcnRpYWxEZXBQbG90UGVuZGluZ0ZlYXR1cmVzLmluZGV4T2YoYyk7LTE8YyYmdGhpcy5wYXJ0aWFsRGVwUGxvdFBlbmRpbmdGZWF0dXJlcy5zcGxpY2UoYywxKX0sZ2V0U2ltcGxlQXhpc0Zvcm1hdHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gUGxvdHRhYmxlLkZvcm1hdHRlcnMuZ2VuZXJhbChhKX0sbWFrZUJhckNoYXJ0OmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZChyLHQpe3JldHVybnt4OnIuc3RlcD09CnQ/ci5zdGVwKyIgLSBvcmlnaW5hbCB2YWx1ZSI6ci5zdGVwLHk6ci5zY2FsYXJ9fWZ1bmN0aW9uIGYocix0LHYpe3JldHVybnt4OnIuc3RlcD09dD9yLnN0ZXArIiAtIG9yaWdpbmFsIHZhbHVlIjpyLnN0ZXAsc2NhbGFyOnIuc2NhbGFyLHk6dn19bGV0IGc9IiI7dmFyIGw9Y1swXTshdGhpcy5nbG9iYWxQZFBsb3RzJiYoYT10aGlzLmNyZWF0ZVBkRW50cnlGb3JDdXJyZW50VmFsdWUoYSxsLDApKSYmKGc9YS5zdGVwKTtjb25zdCBrPXt9LG49e307Xy5mb3JFYWNoKGMsKHIsdCk9PntfLmZvckVhY2gociwodix5KT0+e25bdGhpcy5mb3JtYXRDaGFydEtleSh5LHQsYy5sZW5ndGgpXT1fLm1hcCh2LHo9PmQoeixnKSkuc29ydCgoeix4KT0+eC55LXoueSk7dGhpcy5pc0JpbmFyeUNsYXNzaWZpY2F0aW9uXyh0aGlzLm1vZGVsVHlwZSx0aGlzLm11bHRpQ2xhc3MpJiYoa1t0aGlzLmZvcm1hdENoYXJ0S2V5KHksdCxjLmxlbmd0aCldPV8ubWFwKHYsej0+Zih6LGcsdGhpcy5vdmVyYWxsVGhyZXNob2xkc1t0XS50aHJlc2hvbGQpKS5zb3J0KCh6LAp4KT0+eC5zY2FsYXItei5zY2FsYXIpKX0pfSk7Y29uc3QgcD0kby5tdWx0aXNjYWxlRm9ybWF0dGVyKCRvLllfVE9PTFRJUF9GT1JNQVRURVJfUFJFQ0lTSU9OKTtsPVt7dGl0bGU6IkluZmVyZW5jZSB2YWx1ZSIsZXZhbHVhdGU6cj0+e3I9dGhpcy5zcGxpdENoYXJ0S2V5KHIua2V5LGMubGVuZ3RoKS5sYWJlbDtpZighaXNOYU4ocikmJjA8ci5sZW5ndGgmJnRoaXMubGFiZWxWb2NhYil7Y29uc3QgdD0rcjt0PHRoaXMubGFiZWxWb2NhYi5sZW5ndGgmJjA8PXQmJihyKz0iICgiK3RoaXMubGFiZWxWb2NhYlt0XSsiKSIpfXJldHVybiByfX0se3RpdGxlOiJGZWF0dXJlIHZhbHVlIixldmFsdWF0ZTpyPT5yLnZhbHVlLnh9LHt0aXRsZToiU2NvcmUiLGV2YWx1YXRlOnI9PnAoci52YWx1ZS55KX1dOzI8PWMubGVuZ3RoJiZsLnB1c2goe3RpdGxlOiJNb2RlbCIsZXZhbHVhdGU6cj0+dGhpcy5zcGxpdENoYXJ0S2V5KHIua2V5LGMubGVuZ3RoKS5tb2RlbH0pO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CmEuY2xhc3NMaXN0LmFkZCgicGQtaG9sZGVyIik7Y29uc3QgcT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2ei1iYXItY2hhcnQiKTtxLmNvbG9yU2NhbGU9KG5ldyBQbG90dGFibGUuU2NhbGVzLkNvbG9yKS5yYW5nZSh0aGlzLnBkUGxvdENvbG9ycyk7cS5saW5lc0NvbG9yU2NhbGU9KG5ldyBQbG90dGFibGUuU2NhbGVzLkNvbG9yKS5yYW5nZSh0aGlzLnBkUGxvdFRyYW5zcGFyZW50Q29sb3JzKTtxLmRhdGE9bjtxLmxpbmVzPWs7cS50b29sdGlwQ29sdW1ucz1sO2EuYXBwZW5kQ2hpbGQocSk7bD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLmNsYXNzTGlzdC5hZGQoInBkLXktbGFiZWwiKTtsLmlubmVyVGV4dD10aGlzLmlzUmVncmVzc2lvbl8odGhpcy5tb2RlbFR5cGUpPyJJbmZlcmVuY2UgdmFsdWUiOiJJbmZlcmVuY2Ugc2NvcmUiO2EuYXBwZW5kQ2hpbGQobCk7cmV0dXJuIGF9LHNwbGl0Q2hhcnRLZXk6ZnVuY3Rpb24oYSxjKXtsZXQgZD1hLGY9IiI7Mjw9YyYmKGM9CmEuaW5kZXhPZigiKG1vZGVsIiksZD1hLnN1YnN0cmluZygwLGMpLGY9YS5zdWJzdHJpbmcoYys3LGEubGFzdEluZGV4T2YoIikiKSkpO3JldHVybntsYWJlbDpkLG1vZGVsOmZ9fSxmb3JtYXRDaGFydEtleTpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIDE9PWQ/YTphKyIgKG1vZGVsICIrdGhpcy5nZXRNb2RlbE5hbWVfKGMpKyIpIn0sbWFrZUxpbmVDaGFydDpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGQodil7cmV0dXJuIE51bWJlci5pc05hTih2KT8iTmFOIjpuKHYpfWNvbnN0IGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJwZC1ob2xkZXIiKTtjb25zdCBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZ6LWxpbmUtY2hhcnQyIiksbD1bXTt2YXIgaz1bXTtjb25zdCBuPSRvLm11bHRpc2NhbGVGb3JtYXR0ZXIoJG8uWV9UT09MVElQX0ZPUk1BVFRFUl9QUkVDSVNJT04pOyJjbGFzc2lmaWNhdGlvbiI9PXRoaXMubW9kZWxUeXBlJiYoZy5kZWZhdWx0WVJhbmdlPQpbMCwxXSk7dmFyIHA9W3t0aXRsZToiSW5mZXJlbmNlIHZhbHVlIixldmFsdWF0ZTp2PT57dj10aGlzLnNwbGl0Q2hhcnRLZXkodi5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSxjLmxlbmd0aCkubGFiZWw7aWYoIWlzTmFOKHYpJiYwPHYubGVuZ3RoJiZ0aGlzLmxhYmVsVm9jYWIpe2NvbnN0IHk9K3Y7eTx0aGlzLmxhYmVsVm9jYWIubGVuZ3RoJiYwPD15JiYodis9IiAoIit0aGlzLmxhYmVsVm9jYWJbeV0rIikiKX1yZXR1cm4gdn19LHt0aXRsZToiRmVhdHVyZSB2YWx1ZSIsZXZhbHVhdGU6dj0+ZCh2LmRhdHVtLnN0ZXApfSx7dGl0bGU6IlNjb3JlIixldmFsdWF0ZTp2PT5kKHYuZGF0dW0uc2NhbGFyKX1dOzI8PWMubGVuZ3RoJiZwLnB1c2goe3RpdGxlOiJNb2RlbCIsZXZhbHVhdGU6dj0+dGhpcy5zcGxpdENoYXJ0S2V5KHYuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUsYy5sZW5ndGgpLm1vZGVsfSk7Zy50b29sdGlwQ29sdW1ucz1wO2NvbnN0IHE9W107bGV0IHI9MDtmb3IobGV0IHY9CjA7djxjLmxlbmd0aDt2Kyspe2NvbnN0IHk9Y1t2XTtwPV8ua2V5cyh5KTtyPXYqcC5sZW5ndGg7cC5mb3JFYWNoKHo9PntsLnB1c2godGhpcy5wZFBsb3RDb2xvcnNbcisrXSk7Y29uc3QgeD10aGlzLmZvcm1hdENoYXJ0S2V5KHosdixjLmxlbmd0aCk7Zy5zZXRTZXJpZXNEYXRhKHgseVt6XSk7cS5wdXNoKHgpfSk7cj12KnAubGVuZ3RoO2lmKCF0aGlzLmdsb2JhbFBkUGxvdHMmJihwPXRoaXMuY3JlYXRlUGRFbnRyeUZvckN1cnJlbnRWYWx1ZShhLHksdikpKXt2YXIgdD10aGlzLmZvcm1hdENoYXJ0S2V5KF8ua2V5cyh5KVswXSsiIC0gb3JpZ2luYWwgdmFsdWUgIix2LGMubGVuZ3RoKTtnLnNldFNlcmllc0RhdGEodCxbcF0pO3EucHVzaCh0KTtsLnB1c2godGhpcy5wZFBsb3RDb2xvcnNbcl0uYnJpZ2h0ZXIoKSl9dGhpcy5pc0JpbmFyeUNsYXNzaWZpY2F0aW9uXyh0aGlzLm1vZGVsVHlwZSx0aGlzLm11bHRpQ2xhc3MpJiYocD10aGlzLmZvcm1hdENoYXJ0S2V5KCJjbGFzc2lmaWNhdGlvbiB0aHJlc2hvbGQiLAp2LGMubGVuZ3RoKSx0PWNbMF1bXy5rZXlzKGNbMF0pXS5tYXAoej0+KHtzdGVwOnouc3RlcCxzY2FsYXI6dGhpcy5vdmVyYWxsVGhyZXNob2xkc1t2XS50aHJlc2hvbGR9KSksbC5wdXNoKHRoaXMucGRQbG90VHJhbnNwYXJlbnRDb2xvcnNbcl0pLGcuc2V0U2VyaWVzRGF0YShwLHQpLGsucHVzaChwKSxxLnB1c2gocCkpfWcuY29sb3JTY2FsZT0obmV3IFBsb3R0YWJsZS5TY2FsZXMuQ29sb3IpLnJhbmdlKGwpO2cueEF4aXNGb3JtYXR0ZXI9dGhpcy5nZXRTaW1wbGVBeGlzRm9ybWF0dGVyKHRoaXMuYXhpc1ByZWNpc2lvbik7Zy55QXhpc0Zvcm1hdHRlcj10aGlzLmdldFNpbXBsZUF4aXNGb3JtYXR0ZXIodGhpcy5heGlzUHJlY2lzaW9uKTtnLnNlcmllc1dpdGhvdXRUb29sdGlwcz1rO2cuY29sb3JTY2FsZS5kb21haW4ocSk7Zy5zZXRWaXNpYmxlU2VyaWVzKHEpO2YuYXBwZW5kQ2hpbGQoZyk7az1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtrLmNsYXNzTGlzdC5hZGQoInBkLXktbGFiZWwiKTsKay5pbm5lclRleHQ9dGhpcy5pc1JlZ3Jlc3Npb25fKHRoaXMubW9kZWxUeXBlKT8iSW5mZXJlbmNlIHZhbHVlIjoiSW5mZXJlbmNlIHNjb3JlIjtmLmFwcGVuZENoaWxkKGspO2s9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ay5jbGFzc0xpc3QuYWRkKCJwZC14LWxhYmVsIik7ay5pbm5lclRleHQ9YTtmLmFwcGVuZENoaWxkKGspO3JldHVybiBmfSxjcmVhdGVQZEVudHJ5Rm9yQ3VycmVudFZhbHVlOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZj1fLmtleXMoYylbMF07Y29uc3QgZz1mLmluZGV4T2YoImluZGV4Iik7Yz0rZjt2YXIgbD0wOy0xPGcmJihjPStmLnN1YnN0cmluZygwLGYuaW5kZXhPZigiICIpKSxsPStmLnN1YnN0cmluZyhnKzYsZi5pbmRleE9mKCIpIikpKTthPXRoaXMudmlzZGF0YVt0aGlzLnNlbGVjdGVkWzBdXVthXTtBcnJheS5pc0FycmF5KGEpJiYoYT1hW2xdKTtkPXRoaXMuc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlLmluZmVyZW5jZXNbdGhpcy5zZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2UuaW5mZXJlbmNlcy5sZW5ndGgtCjFdW2RdO2w9LTE7Zm9yKGY9MDtmPGQubGVuZ3RoO2YrKylpZihkW2ZdLmxhYmVsPT1jLnRvU3RyaW5nKCl8fCIiPT1kW2ZdLmxhYmVsKXtsPWRbZl0uc2NvcmU7YnJlYWt9cmV0dXJuLTE9PWw/bnVsbDp7c3RlcDphLHNjYWxhcjpsfX0sZGVsZXRlUGRQbG90UHJvZ3Jlc3M6ZnVuY3Rpb24oYSl7YT10aGlzLmZlYXR1cmVDb250YWluZXJCeU5hbWUoYSkucXVlcnlTZWxlY3RvckFsbCgicGFwZXItcHJvZ3Jlc3MiKTtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKylWdChhW2NdKX0sbWFrZUNoYXJ0Rm9yRmVhdHVyZTpmdW5jdGlvbihhLGMsZCl7dGhpcy5kZWxldGVQZFBsb3RQcm9ncmVzcyhjKTtkLmZvckVhY2goZj0+dGhpcy5hZGRDaGFydChhLGMsZikpfSxnZXRJbmZlcmVuY2VWaXN1YWxpemF0aW9uOmZ1bmN0aW9uKGEsYyl7Yz17ZmVhdHVyZV9uYW1lOmEsaW5mZXJlbmNlX2FkZHJlc3M6dGhpcy5pbmZlcmVuY2VBZGRyZXNzLG1vZGVsX25hbWU6dGhpcy5tb2RlbE5hbWUsbW9kZWxfdHlwZTp0aGlzLm1vZGVsVHlwZSwKbW9kZWxfdmVyc2lvbjp0aGlzLm1vZGVsVmVyc2lvbixtb2RlbF9zaWduYXR1cmU6dGhpcy5tb2RlbFNpZ25hdHVyZSx4X21pbjp0aGlzLmdldFVuaXF1ZUJ5RXZlbnQoYywiLngtbWluIikudmFsdWUseF9tYXg6dGhpcy5nZXRVbmlxdWVCeUV2ZW50KGMsIi54LW1heCIpLnZhbHVlLGZlYXR1cmVfaW5kZXhfcGF0dGVybjp0aGlzLmdldFVuaXF1ZUJ5RXZlbnQoYywiLmZlYXR1cmUtaW5kZXgtcGF0dGVybiIpLnZhbHVlLGV4YW1wbGVfaW5kZXg6dGhpcy5nbG9iYWxQZFBsb3RzPy0xOnRoaXMuc2VsZWN0ZWRbMF0sdXNlX3ByZWRpY3Q6dGhpcy51c2VQcmVkaWN0QXBpLHByZWRpY3Rfb3V0cHV0X3RlbnNvcjp0aGlzLnByZWRpY3RPdXRwdXRUZW5zb3IscHJlZGljdF9pbnB1dF90ZW5zb3I6dGhpcy5wcmVkaWN0SW5wdXRUZW5zb3J9O3RoaXMubG9jYWw/dGhpcy5maXJlKCJpbmZlci1tdXRhbnRzIixjKTooYz1Rby5hZGRQYXJhbXMoIi9kYXRhL3BsdWdpbi93aGF0aWYvaW5mZXJfbXV0YW50cyIsCmMpLHRoaXMubWFrZUFzeW5jUmVxdWVzdF8oYywoZj0+dGhpcy5tYWtlQ2hhcnRGb3JGZWF0dXJlKGYudmFsdWUuY2hhcnRUeXBlLGEsZi52YWx1ZS5kYXRhKSkuYmluZCh0aGlzKSxudWxsLCJwbG90IGNyZWF0aW9uIiwoKCk9PnRoaXMuaGFuZGxlQ2hhcnRFcnJvckZvckZlYXR1cmUoYSkpLmJpbmQodGhpcykpKTtjPXRoaXMuZmVhdHVyZUNvbnRhaW5lckJ5TmFtZShhKS5xdWVyeVNlbGVjdG9yKCIudGYtY2F0ZWdvcnktcGFuZS1jb250ZW50Iik7Y29uc3QgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwYXBlci1wcm9ncmVzcyIpO2Quc2V0QXR0cmlidXRlKCJpbmRldGVybWluYXRlIiwhMCk7ZC5zZXRBdHRyaWJ1dGUoImNsYXNzIiwicGRwbG90LXByb2dyZXNzIik7UG9seW1lci5kb20oYykuYXBwZW5kQ2hpbGQoZCl9LGhhbmRsZUNoYXJ0RXJyb3JGb3JGZWF0dXJlOmZ1bmN0aW9uKGEpe2NvbnN0IGM9dGhpcy5wYXJ0aWFsRGVwUGxvdFBlbmRpbmdGZWF0dXJlcy5pbmRleE9mKGEpOwotMTxjJiZ0aGlzLnBhcnRpYWxEZXBQbG90UGVuZGluZ0ZlYXR1cmVzLnNwbGljZShjLDEpO3RoaXMuZGVsZXRlUGRQbG90UHJvZ3Jlc3MoYSl9LHNob3VsZEhpZGVGZWF0dXJlSW5kaWNlc1NlbGVjdG9yOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIWN8fDA9PWMubGVuZ3RofHwhdGhpcy52aXNkYXRhfHx0aGlzLnZpc2RhdGEubGVuZ3RoPD1jWzBdPyEwOiFBcnJheS5pc0FycmF5KHRoaXMudmlzZGF0YVtjWzBdXVthXSl9LHNob3VsZEhpZGVQZElucHV0Q29udGFpbmVyOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuc2hvdWxkSGlkZUZlYXR1cmVJbmRpY2VzU2VsZWN0b3IoYS5uYW1lLGMpJiZhLnNhbXBsZXM/ITA6ITF9LGZlYXR1cmVDb250YWluZXJCeU5hbWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuJCQoJ1tkYXRhLWZlYXR1cmUtbmFtZVx4M2QiJythKyciXScpfSxmZWF0dXJlQ29udGFpbmVyQnlFdmVudDpmdW5jdGlvbihhKXtmb3IoYT1hLnRhcmdldDshYS5jbGFzc0xpc3QuY29udGFpbnMoImZlYXR1cmUtY29udGFpbmVyIik7KWE9CmEucGFyZW50Tm9kZTtyZXR1cm4gYX0sZ2V0VW5pcXVlQnlFdmVudChhLGMpe3JldHVybiB0aGlzLmZlYXR1cmVDb250YWluZXJCeUV2ZW50KGEpLnF1ZXJ5U2VsZWN0b3IoYyl9LHBhcnRpYWxEZXBQbG90RWxpZ2libGVGZWF0dXJlc1NldDpmdW5jdGlvbihhKXt0aGlzLmlzU29ydGluZ0VsaWdpYmxlRmVhdHVyZXM9ITE7YSYmMCE9YS5sZW5ndGgmJnNldFRpbWVvdXQoKCk9Pnt0aGlzLiQkKCIucGQtZW50cnktY29udGFpbmVyIikuaGlkZGVuJiZ0aGlzLiQkKCIudGYtY2F0ZWdvcnktcGFuZSIpLmNsaWNrKCl9LDEwMCl9LGNhdGVnb3J5UGFuZUNsaWNrZWQ6ZnVuY3Rpb24oYSl7Y29uc3QgYz10aGlzLmZlYXR1cmVDb250YWluZXJCeUV2ZW50KGEpO2MucXVlcnlTZWxlY3RvcigiLnBkLWVudHJ5LWNvbnRhaW5lciIpLmhhc0F0dHJpYnV0ZSgiaGlkZGVuIik/KHRoaXMuZHJhd1BkQ2hhcnRzXyhhKSx0aGlzLnNob3dQZEVsZW1lbnRfKGMpKTp0aGlzLmhpZGVQZEVsZW1lbnRfKGMpfSwKZHJhd1BkQ2hhcnRzXzpmdW5jdGlvbihhKXtjb25zdCBjPWEubW9kZWwuZ2V0KCJpdGVtIikubmFtZTstMTx0aGlzLnBhcnRpYWxEZXBQbG90UGVuZGluZ0ZlYXR1cmVzLmluZGV4T2YoYyl8fCh0aGlzLnBhcnRpYWxEZXBQbG90UGVuZGluZ0ZlYXR1cmVzLnB1c2goYyksdGhpcy5nZXRJbmZlcmVuY2VWaXN1YWxpemF0aW9uKGMsYSkpfSxjbGVhclBkRWxlbWVudENoYXJ0c186ZnVuY3Rpb24oYSl7YS5xdWVyeVNlbGVjdG9yQWxsKCIucGQtaG9sZGVyIikuZm9yRWFjaChmdW5jdGlvbihjKXtWdChjKX0pfSxoaWRlUGRFbGVtZW50XzpmdW5jdGlvbihhKXt2YXIgYz1hLnF1ZXJ5U2VsZWN0b3IoIi5wZC1lbnRyeS1jb250YWluZXIiKTt0aGlzLmNsZWFyUGRFbGVtZW50Q2hhcnRzXyhjKTtjLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwhMCk7Yz1hLnF1ZXJ5U2VsZWN0b3IoIi5wZC1yb3ctYXJyb3ciKTtjLmNsYXNzTGlzdC5yZW1vdmUoIm5vcm1hbC1pY29uIik7Yy5jbGFzc0xpc3QuYWRkKCJyb3RhdGVkLWljb24iKTsKYT1hLnF1ZXJ5U2VsZWN0b3IoIi5wZXJmLXRhYmxlLWVudHJ5Iik7YS5jbGFzc0xpc3QuYWRkKCJwZXJmLXRhYmxlLXJvdyIpO2EuY2xhc3NMaXN0LnJlbW92ZSgicGVyZi10YWJsZS1yb3ctZXhwYW5kZWQiKX0sc2hvd1BkRWxlbWVudF86ZnVuY3Rpb24oYSl7YS5xdWVyeVNlbGVjdG9yKCIucGQtZW50cnktY29udGFpbmVyIikucmVtb3ZlQXR0cmlidXRlKCJoaWRkZW4iKTtjb25zdCBjPWEucXVlcnlTZWxlY3RvcigiLnBkLXJvdy1hcnJvdyIpO2MuY2xhc3NMaXN0LmFkZCgibm9ybWFsLWljb24iKTtjLmNsYXNzTGlzdC5yZW1vdmUoInJvdGF0ZWQtaWNvbiIpO2E9YS5xdWVyeVNlbGVjdG9yKCIucGVyZi10YWJsZS1lbnRyeSIpO2EuY2xhc3NMaXN0LnJlbW92ZSgicGVyZi10YWJsZS1yb3ciKTthLmNsYXNzTGlzdC5hZGQoInBlcmYtdGFibGUtcm93LWV4cGFuZGVkIil9LGhpZGVBbGxQZEVsZW1lbnRzXzpmdW5jdGlvbigpe2NvbnN0IGE9UG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCIuZmVhdHVyZS1jb250YWluZXIiKTsKZm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspdGhpcy5oaWRlUGRFbGVtZW50XyhhW2NdKX0scGRJbnB1dENoYW5nZWQ6ZnVuY3Rpb24oYSl7Y29uc3QgYz17dGFyZ2V0OmEudGFyZ2V0LG1vZGVsOmEubW9kZWx9O3RoaXMuZGVib3VuY2UoInBkSW5wdXRDaGFuZ2VkRGVib3VuY2UiLCgpPT50aGlzLnBkSW5wdXRDaGFuZ2VkSW1wbChjKSw1MDApfSxwZElucHV0Q2hhbmdlZEltcGw6ZnVuY3Rpb24oYSl7dGhpcy5jbGVhclBkRWxlbWVudENoYXJ0c18odGhpcy5nZXRVbmlxdWVCeUV2ZW50KGEsIi50Zi1jYXRlZ29yeS1wYW5lLWNvbnRlbnQiKSk7dGhpcy5kcmF3UGRDaGFydHNfKGEpfSxwb3B1bGF0ZVBkVGFiczpmdW5jdGlvbigpe3RoaXMuaGlkZUFsbFBkRWxlbWVudHNfKCk7aWYodGhpcy5sb2NhbCl0aGlzLmZpcmUoImdldC1lbGlnaWJsZS1mZWF0dXJlcyIpO2Vsc2V7Y29uc3QgYT1Rby5hZGRQYXJhbXMoIi9kYXRhL3BsdWdpbi93aGF0aWYvZWxpZ2libGVfZmVhdHVyZXMiLHt9KTsKdGhpcy5tYWtlQXN5bmNSZXF1ZXN0XyhhLGM9Pnt0aGlzLnNldCgicGFydGlhbERlcFBsb3RFbGlnaWJsZUZlYXR1cmVzIixjLnZhbHVlKX0sbnVsbCwicGxvdCBzZXR1cCIpfX0sc29ydFBkRmVhdHVyZXNfOmZ1bmN0aW9uKCl7dGhpcy5oaWRlQWxsUGRFbGVtZW50c18oKTt2YXIgYT17ZXhhbXBsZV9pbmRleDp0aGlzLmdsb2JhbFBkUGxvdHM/LTE6dGhpcy5zZWxlY3RlZFswXSxpbmZlcmVuY2VfYWRkcmVzczp0aGlzLmluZmVyZW5jZUFkZHJlc3MsbW9kZWxfbmFtZTp0aGlzLm1vZGVsTmFtZSxtb2RlbF90eXBlOnRoaXMubW9kZWxUeXBlLG1vZGVsX3ZlcnNpb246dGhpcy5tb2RlbFZlcnNpb24sbW9kZWxfc2lnbmF0dXJlOnRoaXMubW9kZWxTaWduYXR1cmUsdXNlX3ByZWRpY3Q6dGhpcy51c2VQcmVkaWN0QXBpLHByZWRpY3Rfb3V0cHV0X3RlbnNvcjp0aGlzLnByZWRpY3RPdXRwdXRUZW5zb3IscHJlZGljdF9pbnB1dF90ZW5zb3I6dGhpcy5wcmVkaWN0SW5wdXRUZW5zb3J9O3RoaXMuaXNTb3J0aW5nRWxpZ2libGVGZWF0dXJlcz0KITA7dGhpcy5sb2NhbD8oYS5mZWF0dXJlcz10aGlzLnBhcnRpYWxEZXBQbG90RWxpZ2libGVGZWF0dXJlcyx0aGlzLmZpcmUoInNvcnQtZWxpZ2libGUtZmVhdHVyZXMiLGEpKTooYT1Rby5hZGRQYXJhbXMoIi9kYXRhL3BsdWdpbi93aGF0aWYvc29ydF9lbGlnaWJsZV9mZWF0dXJlcyIsYSksdGhpcy5tYWtlQXN5bmNSZXF1ZXN0XyhhLGM9Pnt0aGlzLnNldCgicGFydGlhbERlcFBsb3RFbGlnaWJsZUZlYXR1cmVzIixjLnZhbHVlKX0sbnVsbCwicGxvdCBvcmRlcmluZyIsKCgpPT57dGhpcy5pc1NvcnRpbmdFbGlnaWJsZUZlYXR1cmVzPSExfSkuYmluZCh0aGlzKSkpfSxzaG91bGREaXNhYmxlU29ydEZlYXR1cmVzQnV0dG9uOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGN8fG51bGw9PWF8fDA9PWEubGVuZ3RofSx0b2dnbGVUcnVlTGFiZWxTZXR1cDpmdW5jdGlvbigpe3RoaXMuJC5jb2xsYXBzZXRydWVsYWJlbC50b2dnbGUoKX0sdG9nZ2xlRXhwbG9yZXJTZXR1cDpmdW5jdGlvbigpe3RoaXMuJCQoIiNjb2xsYXBzZWV4cGxvcmVyIikudG9nZ2xlKCl9LAp0b2dnbGVDb250ZXh0VG9vbHM6ZnVuY3Rpb24oKXt0aGlzLiQuY29sbGFwc2Vjb250ZXh0dG9vbHMudG9nZ2xlKCl9LHRvZ2dsZVBlcmZvcm1hbmNlOmZ1bmN0aW9uKCl7dGhpcy4kLmNvbGxhcHNlcGVyZm9ybWFuY2UudG9nZ2xlKCl9LHRvZ2dsZUluZmVyZW5jZVJlc3VsdHM6ZnVuY3Rpb24oKXt0aGlzLiQkKCIjY29sbGFwc2VpbmZlcmVuY2UiKS50b2dnbGUoKX0sZ2V0RXhwYW5kQ29sbGFwc2VJY29uOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJleHBhbmQtbGVzcyI6ImV4cGFuZC1tb3JlIn0sZ2V0RXhwYW5kQ29sbGFwc2VQZXJmSWNvbkNsYXNzOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJub3JtYWwtaWNvbiI6InJvdGF0ZWQtaWNvbiJ9LGdldFBlcmZUYWJsZVJvd0NsYXNzOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJwZXJmLXRhYmxlLXJvdy1leHBhbmRlZCI6InBlcmYtdGFibGUtcm93In0sZ2V0UGVyZlRhYmxlTW9kZWxDbGFzczpmdW5jdGlvbihhKXtyZXR1cm4gMj5hPyJwZXJmLXRhYmxlLW1vZGVsLXNpbmdsZSI6CiJwZXJmLXRhYmxlLW1vZGVsIn0sZ2V0RGF0YXBvaW50RWRpdG9yVGl0bGU6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5nZXRTZWN0aW9uVGl0bGUoIkVkaXQiLGEsYyl9LGdldEluZmVyVGl0bGU6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5nZXRTZWN0aW9uVGl0bGUoIkluZmVyIixhLGMpfSxnZXRTZWN0aW9uVGl0bGU6ZnVuY3Rpb24oYSxjLGQpe251bGwhPWMmJiIiIT09YyYmKGE9bnVsbCE9ZCYmMDxkLmxlbmd0aD9hKygiIC0gRGF0YXBvaW50cyAiK2MrIiBhbmQgIitkWzBdKTphKygiIC0gRGF0YXBvaW50ICIrYykpO3JldHVybiBhfSx0b2dnbGVQZXJmUm93OmZ1bmN0aW9uKGEpe2ZvcihhPWEudGFyZ2V0O251bGwhPWEmJiFhLmRhdGFzZXQuaW5kZXg7KWE9YS5wYXJlbnROb2RlO251bGwhPWEmJihhPWEuZGF0YXNldC5pbmRleCx0aGlzLnNldCgiZmVhdHVyZVZhbHVlVGhyZXNob2xkcy4iK2ErIi5vcGVuZWQiLCF0aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHNbYV0ub3BlbmVkKSwKdGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzW2FdLm9wZW5lZCYmcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLnVwZGF0ZUluZmVyZW5jZVN0YXRzXyghMCkpKX0sZ2V0UGVyZm9ybWFuY2VUYWJUaXRsZTpmdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLmlzQmluYXJ5Q2xhc3NpZmljYXRpb25fKGEsYyk/IlBlcmZvcm1hbmNlIFx4MjYgRmFpcm5lc3MiOiJQZXJmb3JtYW5jZSJ9LGdldFBlcmZUYWJsZVRpdGxlOmZ1bmN0aW9uKGEsYyxkLGYpe2xldCBnPXRoaXMuZ2V0UHJpbnRhYmxlT3B0aW1pemF0aW9uTmFtZShkKTtpZihudWxsPT1hfHwwPT1hLmxlbmd0aClyZXR1cm4iY3VzdG9tIj09ZD8iRXhwbG9yZSBvdmVyYWxsIHBlcmZvcm1hbmNlIjpnO251bGwhPWMmJjAhPWMubGVuZ3RoJiYoYSs9Ii8iK2MpO3JldHVybiBnKyIgZm9yICIrZi5sZW5ndGgrIiB2YWx1ZXMgb2YgIithfSxnZXROb1RocmVzaG9sZFBlcmZUYWJsZVRpdGxlOmZ1bmN0aW9uKGEsYyxkKXtpZihudWxsPT0KYXx8MD09YS5sZW5ndGgpcmV0dXJuIkV4cGxvcmUgb3ZlcmFsbCBwZXJmb3JtYW5jZSI7bnVsbCE9YyYmMCE9Yy5sZW5ndGgmJihhKz0iLyIrYyk7cmV0dXJuIGErIiAoIitkLmxlbmd0aCsiIHZhbHVlcykifSxnZXRQcmludGFibGVPcHRpbWl6YXRpb25OYW1lOmZ1bmN0aW9uKGEpe3JldHVybiJjdXN0b20iPT1hPyJDdXN0b20gdGhyZXNob2xkcyI6InVuYXdhcmUiPT1hPyJPcHRpbWFsIHNpbmdsZSB0aHJlc2hvbGQiOiJkZW1vcGFyaXR5Ij09YT8iRGVtb2dyYXBoaWMgcGFyaXR5IHRocmVzaG9sZHMiOiJlcXVhbG9wcCI9PWE/IkVxdWFsIG9wcG9ydHVuaXR5IHRocmVzaG9sZHMiOiJlcXVhbGFjYyI9PWE/IkVxdWFsIGFjY3VyYWN5IHRocmVzaG9sZHMiOiJPcHRpbWFsIGdyb3VwIHRocmVzaG9sZHMifSxnZXRGZWF0dXJlU29ydEJ5OmZ1bmN0aW9uKGEsYyl7bGV0IGQ9WyJDb3VudCIsIkFscGhhYmV0aWNhbCJdO3JldHVybiBkPXRoaXMuaXNCaW5hcnlDbGFzc2lmaWNhdGlvbl8oYSwKYyk/ZC5jb25jYXQoWyJBY2N1cmFjeSIsIkZhbHNlIHBvc2l0aXZlcyIsIkZhbHNlIG5lZ2F0aXZlcyJdKTp0aGlzLmlzTXVsdGlDbGFzc18oYSxjKT9kLmNvbmNhdChbIkFjY3VyYWN5Il0pOmQuY29uY2F0KCJNZWFuIGVycm9yO01lZGlhbiBlcnJvcjtNZWFuIGFic29sdXRlIGVycm9yO01lZGlhbiBhYnNvbHV0ZSBlcnJvcjtNZWFuIHNxdWFyZWQgZXJyb3I7TWVkaWFuIHNxdWFyZWQgZXJyb3IiLnNwbGl0KCI7IikpfSxzZWxlY3RlZEZlYXR1cmVTb3J0Q2hhbmdlZF86ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHM7dGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzPVtdO3RoaXMuZmVhdHVyZVZhbHVlVGhyZXNob2xkcz10aGlzLnNvcnRGZWF0dXJlVmFsdWVzKGEpO251bGwhPXRoaXMucmVncmVzc2lvbkVudHJpZXNfJiYoYT10aGlzLnJlZ3Jlc3Npb25FbnRyaWVzXyx0aGlzLnJlZ3Jlc3Npb25FbnRyaWVzXz1bXSx0aGlzLnJlZ3Jlc3Npb25FbnRyaWVzXz0KdGhpcy5zb3J0UmVncmVzc2lvbkVudHJpZXMoYSkpfSxnZXRTbGlkZXJDbGFzczpmdW5jdGlvbihhKXtyZXR1cm4ic2xpZGVyICIrKDA9PWE/InNsaWRlci1tb2RlbC1vbmUiOiJzbGlkZXItbW9kZWwtdHdvIil9LGZvcm1hdEVycm9yOmZ1bmN0aW9uKGEpe3JldHVybiBkMy5mb3JtYXQoIi4zZiIpKGEpfSxleHBhbmRBbGxQZXJmb3JtYW5jZTpmdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuZmVhdHVyZVZhbHVlVGhyZXNob2xkcyl7Zm9yKGxldCBhPTA7YTx0aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHMubGVuZ3RoO2ErKyl0aGlzLnNldCgiZmVhdHVyZVZhbHVlVGhyZXNob2xkcy4iK2ErIi5vcGVuZWQiLCEwKTtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PnRoaXMudXBkYXRlSW5mZXJlbmNlU3RhdHNfKCEwKSl9fSxjb2xsYXBzZUFsbFBlcmZvcm1hbmNlOmZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzKWZvcihsZXQgYT0wO2E8dGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzLmxlbmd0aDthKyspdGhpcy5zZXQoImZlYXR1cmVWYWx1ZVRocmVzaG9sZHMuIisKYSsiLm9wZW5lZCIsITEpfSxnZXRQZXJmVGFibGVFbnRyeUNsYXNzOmZ1bmN0aW9uKGEpe2xldCBjPSJwZXJmLXRhYmxlLWVudHJ5IHBlcmYtdGFibGUtcm93ICI7ImludGVyZXN0aW5nbmVzcyJpbiBhJiYwPT1hLmludGVyZXN0aW5nbmVzcyYmKGMrPSJwZXJmLXRhYmxlLWVudHJ5LXRyaXZpYWwiKTtyZXR1cm4gY319KTtZby5yZWdpc3RlckRhc2hib2FyZCh7cGx1Z2luOiJ3aGF0aWYiLGVsZW1lbnROYW1lOiJ0Zi1pbnRlcmFjdGl2ZS1pbmZlcmVuY2UtZGFzaGJvYXJkIix0YWJOYW1lOiJXaGF0LUlmIFRvb2wifSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtdXRpbHMvdGYtaHBhcmFtcy11dGlscy5odG1sLmpzCihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGYoQil7cmV0dXJuIiIhPT1CLmRpc3BsYXlOYW1lJiZ2b2lkIDAhPT1CLmRpc3BsYXlOYW1lP0IuZGlzcGxheU5hbWU6Qi5uYW1lfWZ1bmN0aW9uIGcoQil7aWYoIiIhPT1CLmRpc3BsYXlOYW1lJiZ2b2lkIDAhPT1CLmRpc3BsYXlOYW1lKXJldHVybiBCLmRpc3BsYXlOYW1lO2xldCBJPUIubmFtZS5ncm91cDtCPUIubmFtZS50YWc7dm9pZCAwPT09SSYmKEk9IiIpO3ZvaWQgMD09PUImJihCPSIiKTtyZXR1cm4iIj09PUk/QjpJKyIuIitCfWZ1bmN0aW9uIGwoQil7cmV0dXJuIEIuaHBhcmFtQ29sdW1ucy5sZW5ndGh9ZnVuY3Rpb24gayhCKXtyZXR1cm4gQi5tZXRyaWNDb2x1bW5zLmxlbmd0aH1mdW5jdGlvbiBuKEIsSSl7cmV0dXJuIEJbSV19ZnVuY3Rpb24gcChCLEkpe3JldHVybiBCLmZpbmQoTz0+Xy5pc0VxdWFsKE8ubmFtZSxJKSl9ZnVuY3Rpb24gcShCLEksTyl7cmV0dXJuIEkuaHBhcmFtc1tCLmhwYXJhbUNvbHVtbnNbT10uaHBhcmFtSW5mby5uYW1lXX0KZnVuY3Rpb24gcihCLEksTyl7Qj1wKEkubWV0cmljVmFsdWVzLEIubWV0cmljQ29sdW1uc1tPXS5tZXRyaWNJbmZvLm5hbWUpO3JldHVybiB2b2lkIDA9PT1CP3ZvaWQgMDpCLnZhbHVlfWZ1bmN0aW9uIHQoQixJLE8pe3JldHVybiBPPEIuaHBhcmFtQ29sdW1ucy5sZW5ndGg/cShCLEksTyk6cihCLEksTy1CLmhwYXJhbUNvbHVtbnMubGVuZ3RoKX1mdW5jdGlvbiB2KEIpe3JldHVybiBCLmhwYXJhbUluZm9zLmxlbmd0aH1mdW5jdGlvbiB5KEIpe3JldHVybiBCLm1ldHJpY0luZm9zLmxlbmd0aH1mdW5jdGlvbiB6KEIsSSxPKXtyZXR1cm4gSS5ocGFyYW1zW0IuaHBhcmFtSW5mb3NbT10ubmFtZV19ZnVuY3Rpb24geChCLEksTyl7Qj1wKEkubWV0cmljVmFsdWVzLEIubWV0cmljSW5mb3NbT10ubmFtZSk7cmV0dXJuIHZvaWQgMD09PUI/dm9pZCAwOkIudmFsdWV9ZnVuY3Rpb24gQyhCLEksTyl7cmV0dXJuIE88Qi5ocGFyYW1JbmZvcy5sZW5ndGg/eihCLEksTyk6eChCLEksTy1CLmhwYXJhbUluZm9zLmxlbmd0aCl9CmZ1bmN0aW9uIEYoQil7cmV0dXJuIF8uaXNOdW1iZXIoQik/Qi50b1ByZWNpc2lvbig1KTp2b2lkIDA9PT1CPyIiOkIudG9TdHJpbmcoKX1mdW5jdGlvbiBEKEIsSSl7cmV0dXJuIEIqQitJKkl9ZC5ocGFyYW1OYW1lPWY7ZC5tZXRyaWNOYW1lPWc7ZC5zY2hlbWFDb2x1bW5OYW1lPWZ1bmN0aW9uKEIsSSl7cmV0dXJuIEk8Qi5ocGFyYW1Db2x1bW5zLmxlbmd0aD9mKEIuaHBhcmFtQ29sdW1uc1tJXS5ocGFyYW1JbmZvKTpnKEIubWV0cmljQ29sdW1uc1tJLUIuaHBhcmFtQ29sdW1ucy5sZW5ndGhdLm1ldHJpY0luZm8pfTtkLm51bUhQYXJhbXM9bDtkLm51bU1ldHJpY3M9aztkLm51bUNvbHVtbnM9ZnVuY3Rpb24oQil7cmV0dXJuIGwoQikrayhCKX07ZC5ocGFyYW1WYWx1ZUJ5TmFtZT1uO2QubWV0cmljVmFsdWVCeU5hbWU9cDtkLmhwYXJhbVZhbHVlQnlJbmRleD1xO2QubWV0cmljVmFsdWVCeUluZGV4PXI7ZC5jb2x1bW5WYWx1ZUJ5SW5kZXg9dDtkLm51bWVyaWNDb2x1bW5FeHRlbnQ9CmZ1bmN0aW9uKEIsSSxPKXtyZXR1cm4gZDMuZXh0ZW50KEksUD0+dChCLFAsTykpfTtkLmdldEFic29sdXRlQ29sdW1uSW5kZXg9ZnVuY3Rpb24oQixJLE8pe2lmKE88SS5ocGFyYW1JbmZvcy5sZW5ndGgpQj1CLmhwYXJhbUNvbHVtbnMuZmluZEluZGV4KFA9PlAuaHBhcmFtSW5mby5uYW1lPT09SS5ocGFyYW1JbmZvc1tPXS5uYW1lKTtlbHNle2NvbnN0IFA9SS5tZXRyaWNJbmZvc1tPLUkuaHBhcmFtSW5mb3MubGVuZ3RoXS5uYW1lO0I9Qi5ocGFyYW1Db2x1bW5zLmxlbmd0aCtCLm1ldHJpY0NvbHVtbnMuZmluZEluZGV4KEg9PkgubWV0cmljSW5mby5uYW1lPT09UCl9Y29uc29sZS5hc3NlcnQoLTEhPT1CKTtyZXR1cm4gQn07ZC5zY2hlbWFWaXNpYmxlQ29sdW1uTmFtZT1mdW5jdGlvbihCLEkpe3JldHVybiBJPEIuaHBhcmFtSW5mb3MubGVuZ3RoP2YoQi5ocGFyYW1JbmZvc1tJXSk6ZyhCLm1ldHJpY0luZm9zW0ktQi5ocGFyYW1JbmZvcy5sZW5ndGhdKX07ZC5udW1WaXNpYmxlSFBhcmFtcz0KdjtkLm51bVZpc2libGVNZXRyaWNzPXk7ZC5udW1WaXNpYmxlQ29sdW1ucz1mdW5jdGlvbihCKXtyZXR1cm4gdihCKSt5KEIpfTtkLnZpc2libGVOdW1lcmljQ29sdW1uRXh0ZW50PWZ1bmN0aW9uKEIsSSxPKXtyZXR1cm4gZDMuZXh0ZW50KEksUD0+QyhCLFAsTykpfTtkLnByZXR0eVByaW50SFBhcmFtVmFsdWVCeU5hbWU9ZnVuY3Rpb24oQixJKXtyZXR1cm4gRihuKEIsSSkpfTtkLnByZXR0eVByaW50TWV0cmljVmFsdWVCeU5hbWU9ZnVuY3Rpb24oQixJKXtyZXR1cm4gRihwKEIsSSkpfTtkLnNlc3Npb25Hcm91cFdpdGhOYW1lPWZ1bmN0aW9uKEIsSSl7cmV0dXJuIEIuZmluZChPPT5PLm5hbWU9PT1JKX07ZC5ocGFyYW1WYWx1ZUJ5VmlzaWJsZUluZGV4PXo7ZC5tZXRyaWNWYWx1ZUJ5VmlzaWJsZUluZGV4PXg7ZC5jb2x1bW5WYWx1ZUJ5VmlzaWJsZUluZGV4PUM7ZC5wcmV0dHlQcmludD1GO2QubDJOb3JtU3F1YXJlZD1EO2QuZXVjbGlkZWFuRGlzdD1mdW5jdGlvbihCLEksTyxQKXtyZXR1cm4gTWF0aC5zcXJ0KEQoQi0KTyxJLVApKX07ZC5wb2ludFRvUmVjdGFuZ2xlRGlzdD1mdW5jdGlvbihCLEksTyxQLEgsSyl7aWYoQjxPJiZJPFApcmV0dXJuIGQuZXVjbGlkZWFuRGlzdChCLEksTyxQKTtpZihPPD1CJiZCPEgmJkk8UClyZXR1cm4gUC1JO2lmKEg8PUImJkk8UClyZXR1cm4gZC5ldWNsaWRlYW5EaXN0KEIsSSxILFApO2lmKEI8TyYmUDw9SSYmSTxLKXJldHVybiBPLUI7aWYoTzw9QiYmQjxIJiZQPD1JJiZJPEspcmV0dXJuIDA7aWYoSDw9QiYmUDw9SSYmSTxLKXJldHVybiBCLUg7aWYoQjxPJiZLPD1JKXJldHVybiBkLmV1Y2xpZGVhbkRpc3QoQixJLE8sSyk7aWYoTzw9QiYmQjxIJiZLPD1JKXJldHVybiBJLUs7aWYoSDw9QiYmSzw9SSlyZXR1cm4gZC5ldWNsaWRlYW5EaXN0KEIsSSxILEspO3Rocm93IlBvaW50ICh4LHkpIG11c3QgYmUgaW4gb25lIG9mIHRoZSByZWdpb25zIGRlZmluZWQgYWJvdmUuIjt9O2QudHJhbnNsYXRlU3RyPWZ1bmN0aW9uKEIsSSl7cmV0dXJuIHZvaWQgMD09PUk/InRyYW5zbGF0ZSgiKwpCKyIpIjoidHJhbnNsYXRlKCIrQisiLCIrSSsiKSJ9O2Qucm90YXRlU3RyPWZ1bmN0aW9uKEIsSSl7bGV0IE89InJvdGF0ZSg5MCI7dm9pZCAwIT09QiYmdm9pZCAwIT09SSYmKE89TysiLCIrQisiLCIrSSk7cmV0dXJuIE8rIikifTtkLmlzTnVsbE9yVW5kZWZpbmVkPWZ1bmN0aW9uKEIpe3JldHVybiBudWxsPT09Qnx8dm9pZCAwPT09Qn07ZC5xdWFkVHJlZVZpc2l0UG9pbnRzSW5SZWN0PWZ1bmN0aW9uKEIsSSxPLFAsSCxLKXtCLnZpc2l0KChNLEwsUixVLFkpPT57aWYodm9pZCAwPT09TS5sZW5ndGgpe2RvIEw9Qi54KCkoTS5kYXRhKSxSPUIueSgpKE0uZGF0YSksSTw9TCYmTDxQJiZPPD1SJiZSPEgmJksoTS5kYXRhKTt3aGlsZShNPU0ubmV4dCk7cmV0dXJuITB9cmV0dXJuIEw+PVB8fFU8PUl8fFI+PUh8fFk8PU99KX07ZC5xdWFkVHJlZVZpc2l0UG9pbnRzSW5EaXNrPWZ1bmN0aW9uKEIsSSxPLFAsSCl7Qi52aXNpdCgoSyxNLEwsUixVKT0+e2lmKHZvaWQgMD09PUsubGVuZ3RoKXtkbyBNPQpCLngoKShLLmRhdGEpLEw9Qi55KCkoSy5kYXRhKSxNPWQuZXVjbGlkZWFuRGlzdChJLE8sTSxMKSxNPD1QJiZIKEsuZGF0YSxNKTt3aGlsZShLPUsubmV4dCk7cmV0dXJuITB9cmV0dXJuIGQucG9pbnRUb1JlY3RhbmdsZURpc3QoSSxPLE0sTCxSLFUpPlB9KX07ZC5maWx0ZXJTZXQ9ZnVuY3Rpb24oQixJKXtjb25zdCBPPW5ldyBTZXQ7Qi5mb3JFYWNoKFA9PntJKFApJiZPLmFkZChQKX0pO3JldHVybiBPfTtkLnNldEFycmF5T2JzZXJ2YWJseT1mdW5jdGlvbihCLEkpe2NvbnN0IE89Qi5nZXQoInNlc3Npb25Hcm91cHMiLEIpO0FycmF5LmlzQXJyYXkoTyk/Qi5zcGxpY2UuYXBwbHkoQixbInNlc3Npb25Hcm91cHMiLDAsTy5sZW5ndGhdLmNvbmNhdChJKSk6Qi5zZXQoInNlc3Npb25Hcm91cHMiLEkpfTtkLmhhc2hPZlN0cmluZz1mdW5jdGlvbihCKXtsZXQgST0wO2ZvcihsZXQgTz0wO088Qi5sZW5ndGg7KytPKUk9MzEqSStCLmNoYXJDb2RlQXQoTykmNDI5NDk2NzI5NTtyZXR1cm4gSSsKTWF0aC5wb3coMiwzMSl9fSkoYy51dGlsc3x8KGMudXRpbHM9e30pKX0pKGEuaHBhcmFtc3x8KGEuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1zcGxpdC1sYXlvdXQvdmFhZGluLXNwbGl0LWxheW91dC5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tc3BsaXQtbGF5b3V0IixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOnt2ZXJ0aWNhbDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMX0sX3ByZXZpb3VzUHJpbWFyeVBvaW50ZXJFdmVudHM6U3RyaW5nLF9wcmV2aW91c1NlY29uZGFyeVBvaW50ZXJFdmVudHM6U3RyaW5nfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPVBvbHltZXIuZG9tKHRoaXMpLm9ic2VydmVOb2Rlcyh0aGlzLl9wcm9jZXNzQ2hpbGRyZW4pfSxkZXRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuZG9tKHRoaXMpLnVub2JzZXJ2ZU5vZGVzKHRoaXMuX29ic2VydmVyKX0sX3Byb2Nlc3NDaGlsZHJlbjpmdW5jdGlvbigpe3RoaXMuZ2V0RWZmZWN0aXZlQ2hpbGRyZW4oKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2xhc3NMaXN0LmNvbnRhaW5zKCJzcGxpdHRlci1oYW5kbGUiKT8KKFBvbHltZXIuZG9tKGEpLnNldEF0dHJpYnV0ZSgic2xvdCIsImhhbmRsZSIpLCExKTohMH0pLmZvckVhY2goZnVuY3Rpb24oYSxjKXswPT09Yz8odGhpcy5fcHJpbWFyeUNoaWxkPWEsUG9seW1lci5kb20oYSkuc2V0QXR0cmlidXRlKCJzbG90IiwicHJpbWFyeSIpKToxPT1jPyh0aGlzLl9zZWNvbmRhcnlDaGlsZD1hLFBvbHltZXIuZG9tKGEpLnNldEF0dHJpYnV0ZSgic2xvdCIsInNlY29uZGFyeSIpKTpQb2x5bWVyLmRvbShhKS5yZW1vdmVBdHRyaWJ1dGUoInNsb3QiKX0uYmluZCh0aGlzKSl9LF9zZXRGbGV4QmFzaXM6ZnVuY3Rpb24oYSxjLGQpe2M9TWF0aC5tYXgoMCxNYXRoLm1pbihjLGQpKTswPT09YyYmKGM9MUUtNik7YS5zdHlsZS5mbGV4PSIxIDEgIitjKyJweCJ9LF9vbkhhbmRsZVRyYWNrOmZ1bmN0aW9uKGEpe2lmKHRoaXMuX3ByaW1hcnlDaGlsZCYmdGhpcy5fc2Vjb25kYXJ5Q2hpbGQpe3ZhciBjPXRoaXMudmVydGljYWw/ImhlaWdodCI6IndpZHRoIjsic3RhcnQiPT09CmEuZGV0YWlsLnN0YXRlPyh0aGlzLl9zdGFydFNpemU9e2NvbnRhaW5lcjp0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2NdLXRoaXMuJC5zcGxpdHRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtjXSxwcmltYXJ5OnRoaXMuX3ByaW1hcnlDaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtjXSxzZWNvbmRhcnk6dGhpcy5fc2Vjb25kYXJ5Q2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbY119LHRoaXMuX3ByZXZpb3VzUHJpbWFyeVBvaW50ZXJFdmVudHM9dGhpcy5fcHJpbWFyeUNoaWxkLnN0eWxlLnBvaW50ZXJFdmVudHMsdGhpcy5fcHJldmlvdXNTZWNvbmRhcnlQb2ludGVyRXZlbnRzPXRoaXMuX3NlY29uZGFyeUNoaWxkLnN0eWxlLnBvaW50ZXJFdmVudHMsdGhpcy5fcHJpbWFyeUNoaWxkLnN0eWxlLnBvaW50ZXJFdmVudHM9Im5vbmUiLHRoaXMuX3NlY29uZGFyeUNoaWxkLnN0eWxlLnBvaW50ZXJFdmVudHM9Im5vbmUiKTooYz10aGlzLnZlcnRpY2FsP2EuZGV0YWlsLmR5OgphLmRldGFpbC5keCx0aGlzLl9zZXRGbGV4QmFzaXModGhpcy5fcHJpbWFyeUNoaWxkLHRoaXMuX3N0YXJ0U2l6ZS5wcmltYXJ5K2MsdGhpcy5fc3RhcnRTaXplLmNvbnRhaW5lciksdGhpcy5fc2V0RmxleEJhc2lzKHRoaXMuX3NlY29uZGFyeUNoaWxkLHRoaXMuX3N0YXJ0U2l6ZS5zZWNvbmRhcnktYyx0aGlzLl9zdGFydFNpemUuY29udGFpbmVyKSx0aGlzLm5vdGlmeVJlc2l6ZSgpLCJlbmQiPT09YS5kZXRhaWwuc3RhdGUmJihkZWxldGUgdGhpcy5fc3RhcnRTaXplLHRoaXMuX3ByaW1hcnlDaGlsZC5zdHlsZS5wb2ludGVyRXZlbnRzPXRoaXMuX3ByZXZpb3VzUHJpbWFyeVBvaW50ZXJFdmVudHMsdGhpcy5fc2Vjb25kYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cz10aGlzLl9wcmV2aW91c1NlY29uZGFyeVBvaW50ZXJFdmVudHMpKX19LF9wcmV2ZW50RGVmYXVsdDpmdW5jdGlvbihhKXthLnByZXZlbnREZWZhdWx0KCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1xdWVyeS1wYW5lL3RmLWhwYXJhbXMtcXVlcnktcGFuZS5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXF1ZXJ5LXBhbmUiLHByb3BlcnRpZXM6e2JhY2tlbmQ6T2JqZWN0LGV4cGVyaW1lbnROYW1lOlN0cmluZyxjb25maWd1cmF0aW9uOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHtzY2hlbWE6e2hwYXJhbUNvbHVtbnM6W10sbWV0cmljQ29sdW1uczpbXX0sY29sdW1uc1Zpc2liaWxpdHk6W10sdmlzaWJsZVNjaGVtYTp7aHBhcmFtSW5mb3M6W10sbWV0cmljSW5mb3M6W119fSkscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxzZXNzaW9uR3JvdXBzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXSxyZWFkT25seTohMCxub3RpZnk6ITB9LF9leHBlcmltZW50Ok9iamVjdCxfaHBhcmFtczpBcnJheSxfbWV0cmljczpBcnJheSxfc3RhdHVzZXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9Plt7dmFsdWU6IlNUQVRVU19VTktOT1dOIixkaXNwbGF5TmFtZToiVW5rbm93biIsYWxsb3dlZDohMH0se3ZhbHVlOiJTVEFUVVNfU1VDQ0VTUyIsZGlzcGxheU5hbWU6IlN1Y2Nlc3MiLAphbGxvd2VkOiEwfSx7dmFsdWU6IlNUQVRVU19GQUlMVVJFIixkaXNwbGF5TmFtZToiRmFpbHVyZSIsYWxsb3dlZDohMH0se3ZhbHVlOiJTVEFUVVNfUlVOTklORyIsZGlzcGxheU5hbWU6IlJ1bm5pbmciLGFsbG93ZWQ6ITB9XX0sX2dldEV4cGVyaW1lbnRSZXNvbHZlZDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFByb21pc2UoYT0+e3RoaXMuX3Jlc29sdmVHZXRFeHBlcmltZW50PWF9KX19LF9yZXNvbHZlR2V0RXhwZXJpbWVudDpGdW5jdGlvbixfbGlzdFNlc3Npb25Hcm91cHNDYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUW8uQ2FuY2VsbGVyfSxfc29ydEJ5SW5kZXg6TnVtYmVyLF9zb3J0RGlyZWN0aW9uOk51bWJlcixfcGFnZVNpemVJbnB1dDp7dHlwZTpPYmplY3QsdmFsdWU6e3ZhbHVlOiIxMDAiLGludmFsaWQ6ITF9fSxfcGFnZU51bWJlcklucHV0Ont0eXBlOk9iamVjdCx2YWx1ZTp7dmFsdWU6IjEiLGludmFsaWQ6ITF9fSwKX3BhZ2VDb3VudFN0cjp7dHlwZTpTdHJpbmcsdmFsdWU6Ij8ifSxfdG90YWxTZXNzaW9uR3JvdXBzQ291bnRTdHI6U3RyaW5nfSxvYnNlcnZlcnM6WyJfY29tcHV0ZUV4cGVyaW1lbnRBbmRSZWxhdGVkUHJvcHMoYmFja2VuZCwgZXhwZXJpbWVudE5hbWUpIiwiX3VwZGF0ZUNvbmZpZ3VyYXRpb24oX2hwYXJhbXMuKiwgX21ldHJpY3MuKikiXSxyZWxvYWQoKXt0aGlzLl9xdWVyeVNlcnZlcigpfSxfY29tcHV0ZUV4cGVyaW1lbnRBbmRSZWxhdGVkUHJvcHMoKXtjb25zdCBhPXRmLmhwYXJhbXMudXRpbHM7YS5pc051bGxPclVuZGVmaW5lZCh0aGlzLmJhY2tlbmQpfHxhLmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuZXhwZXJpbWVudE5hbWUpfHx0aGlzLmJhY2tlbmQuZ2V0RXhwZXJpbWVudCh7ZXhwZXJpbWVudE5hbWU6dGhpcy5leHBlcmltZW50TmFtZX0pLnRoZW4oYz0+e18uaXNFcXVhbChjLHRoaXMuX2V4cGVyaW1lbnQpfHwodGhpcy5zZXQoIl9leHBlcmltZW50IixjKSx0aGlzLl9jb21wdXRlSFBhcmFtcygpLAp0aGlzLl9jb21wdXRlTWV0cmljcygpLHRoaXMuX3F1ZXJ5U2VydmVyKCksdGhpcy5fcmVzb2x2ZUdldEV4cGVyaW1lbnQoKSl9KX0sX2NvbXB1dGVIUGFyYW1zKCl7Y29uc3QgYT1bXTt0aGlzLl9leHBlcmltZW50LmhwYXJhbUluZm9zLmZvckVhY2goKGMsZCk9Pntjb25zdCBmPXtpbmZvOmMsZGlzcGxheWVkOjU+ZCxmaWx0ZXI6e319O2YuaW5mby5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluRGlzY3JldGUiKT8oZi5maWx0ZXIuZG9tYWluRGlzY3JldGU9W10sZi5pbmZvLmRvbWFpbkRpc2NyZXRlLmZvckVhY2goZz0+e2YuZmlsdGVyLmRvbWFpbkRpc2NyZXRlLnB1c2goe3ZhbHVlOmcsY2hlY2tlZDohMH0pfSkpOiJEQVRBX1RZUEVfQk9PTCI9PT1mLmluZm8udHlwZT9mLmZpbHRlci5kb21haW5EaXNjcmV0ZT1be3ZhbHVlOiExLGNoZWNrZWQ6ITB9LHt2YWx1ZTohMCxjaGVja2VkOiEwfV06IkRBVEFfVFlQRV9GTE9BVDY0Ij09PWYuaW5mby50eXBlP2YuZmlsdGVyLmludGVydmFsPXttaW46e3ZhbHVlOiIiLAppbnZhbGlkOiExfSxtYXg6e3ZhbHVlOiIiLGludmFsaWQ6ITF9fToiREFUQV9UWVBFX1NUUklORyI9PT1mLmluZm8udHlwZT9mLmZpbHRlci5yZWdleHA9IiI6Y29uc29sZS53YXJuKCJ1bmtub3duIGhwYXJhbS5pbmZvLnR5cGU6ICVzIixmLmluZm8udHlwZSk7YS5wdXNoKGYpfSk7dGhpcy5zZXQoIl9ocGFyYW1zIixhKX0sX2NvbXB1dGVNZXRyaWNzKCl7Y29uc3QgYT1bXTt0aGlzLl9leHBlcmltZW50Lm1ldHJpY0luZm9zLmZvckVhY2goKGMsZCk9PnthLnB1c2goe2luZm86YyxmaWx0ZXI6e2ludGVydmFsOnttaW46e3ZhbHVlOiIiLGludmFsaWQ6ITF9LG1heDp7dmFsdWU6IiIsaW52YWxpZDohMX19fSxkaXNwbGF5ZWQ6NT5kfSl9KTt0aGlzLnNldCgiX21ldHJpY3MiLGEpfSxfY29tcHV0ZVNjaGVtYSgpe3JldHVybiB0aGlzLl9ocGFyYW1zJiZ0aGlzLl9tZXRyaWNzP3tocGFyYW1Db2x1bW5zOnRoaXMuX2hwYXJhbXMubWFwKGE9Pih7aHBhcmFtSW5mbzphLmluZm99KSksbWV0cmljQ29sdW1uczp0aGlzLl9tZXRyaWNzLm1hcChhPT4KKHttZXRyaWNJbmZvOmEuaW5mb30pKX06e2hwYXJhbUNvbHVtbnM6W10sbWV0cmljQ29sdW1uczpbXX19LF91cGRhdGVDb25maWd1cmF0aW9uKCl7dGhpcy5kZWJvdW5jZSgiX3VwZGF0ZUNvbmZpZ3VyYXRpb24iLCgpPT57dGhpcy5fc2V0Q29uZmlndXJhdGlvbih7c2NoZW1hOnRoaXMuX2NvbXB1dGVTY2hlbWEoKSxjb2x1bW5zVmlzaWJpbGl0eTp0aGlzLl9jb21wdXRlQ29sdW1uc1Zpc2liaWxpdHkoKSx2aXNpYmxlU2NoZW1hOnRoaXMuX2NvbXB1dGVWaXNpYmxlU2NoZW1hKCl9KX0pfSxfY29tcHV0ZUNvbHVtbnNWaXNpYmlsaXR5KCl7cmV0dXJuIHRoaXMuX2hwYXJhbXMmJnRoaXMuX21ldHJpY3M/dGhpcy5faHBhcmFtcy5tYXAoYT0+YS5kaXNwbGF5ZWQpLmNvbmNhdCh0aGlzLl9tZXRyaWNzLm1hcChhPT5hLmRpc3BsYXllZCkpOltdfSxfY29tcHV0ZVZpc2libGVTY2hlbWEoKXtpZighdGhpcy5faHBhcmFtc3x8IXRoaXMuX21ldHJpY3MpcmV0dXJue2hwYXJhbUluZm9zOltdLAptZXRyaWNJbmZvczpbXX07Y29uc3QgYT10aGlzLl9ocGFyYW1zLmZpbHRlcihkPT5kLmRpc3BsYXllZCkubWFwKGQ9PmQuaW5mbyksYz10aGlzLl9tZXRyaWNzLmZpbHRlcihkPT5kLmRpc3BsYXllZCkubWFwKGQ9PmQuaW5mbyk7cmV0dXJue2hwYXJhbUluZm9zOmEsbWV0cmljSW5mb3M6Y319LF9xdWVyeVNlcnZlcigpe3RoaXMuZGVib3VuY2UoInF1ZXJ5U2VydmVyIiwoKT0+dGhpcy5fcXVlcnlTZXJ2ZXJOb0RlYm91bmNlKCksMTAwKX0sX3F1ZXJ5U2VydmVyTm9EZWJvdW5jZSgpe3JldHVybiB0aGlzLl9zZW5kTGlzdFNlc3Npb25Hcm91cHNSZXF1ZXN0KCkudGhlbih0aGlzLl9saXN0U2Vzc2lvbkdyb3Vwc0NhbmNlbGxlci5jYW5jZWxsYWJsZSgoe3ZhbHVlOmEsY2FuY2VsbGVkOmN9KT0+e2N8fCgwPD1hLnRvdGFsU2l6ZT8odGhpcy5zZXQoIl9wYWdlQ291bnRTdHIiLFN0cmluZyhNYXRoLmNlaWwoYS50b3RhbFNpemUvK3RoaXMuX3BhZ2VTaXplSW5wdXQudmFsdWUpKSksdGhpcy5zZXQoIl90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0ciIsCmEudG90YWxTaXplKSk6KHRoaXMuc2V0KCJfcGFnZUNvdW50U3RyIiwiPyIpLHRoaXMuc2V0KCJfdG90YWxTZXNzaW9uR3JvdXBzQ291bnRTdHIiLCJVbmtub3duIikpLHRmLmhwYXJhbXMudXRpbHMuc2V0QXJyYXlPYnNlcnZhYmx5KHRoaXMsYS5zZXNzaW9uR3JvdXBzKSl9KSl9LF9zZW5kTGlzdFNlc3Npb25Hcm91cHNSZXF1ZXN0KCl7Y29uc3QgYT10aGlzLl9idWlsZExpc3RTZXNzaW9uR3JvdXBzUmVxdWVzdCgpO2lmKG51bGwhPT1hKXJldHVybiB0aGlzLl9saXN0U2Vzc2lvbkdyb3Vwc0NhbmNlbGxlci5jYW5jZWxBbGwoKSx0aGlzLmJhY2tlbmQubGlzdFNlc3Npb25Hcm91cHMoYSl9LF9idWlsZExpc3RTZXNzaW9uR3JvdXBzUmVxdWVzdCgpe2Z1bmN0aW9uIGEocCl7dmFyIHE9ZC5nZXQocCsiLm1pbi52YWx1ZSIpO2NvbnNvbGUuYXNzZXJ0KHZvaWQgMCE9PXEpO3E9IiI9PT1xPyItSW5maW5pdHkiOitxO2Quc2V0KHArIi5taW4uaW52YWxpZCIsaXNOYU4ocSkpO2Y9ZiYmIWlzTmFOKHEpOwp2YXIgcj1kLmdldChwKyIubWF4LnZhbHVlIik7Y29uc29sZS5hc3NlcnQodm9pZCAwIT09cik7cj0iIj09PXI/IkluZmluaXR5IjorcjtkLnNldChwKyIubWF4LmludmFsaWQiLGlzTmFOKHIpKTtmPWYmJiFpc05hTihyKTtyZXR1cm4gaXNOYU4ocSl8fGlzTmFOKHIpP251bGw6e21pblZhbHVlOnEsbWF4VmFsdWU6cn19ZnVuY3Rpb24gYyhwKXt2YXIgcT1kLmdldChwKyIudmFsdWUiKTtjb25zb2xlLmFzc2VydCh2b2lkIDAhPT1xKTtxPStxO2NvbnN0IHI9TnVtYmVyLmlzSW50ZWdlcihxKSYmMDxxO2Quc2V0KHArIi5pbnZhbGlkIiwhcik7Zj1mJiZyO3JldHVybiByP3E6bnVsbH1jb25zdCBkPXRoaXM7bGV0IGY9ITA7Y29uc3QgZz10aGlzLl9zdGF0dXNlcy5maWx0ZXIocD0+cC5hbGxvd2VkKS5tYXAocD0+cC52YWx1ZSk7bGV0IGw9W107dGhpcy5faHBhcmFtcy5mb3JFYWNoKChwLHEpPT57bGV0IHI9e2hwYXJhbTpwLmluZm8ubmFtZX07aWYocC5maWx0ZXIuZG9tYWluRGlzY3JldGUpci5maWx0ZXJEaXNjcmV0ZT0KW10scC5maWx0ZXIuZG9tYWluRGlzY3JldGUuZm9yRWFjaCh0PT57dC5jaGVja2VkJiZyLmZpbHRlckRpc2NyZXRlLnB1c2godC52YWx1ZSl9KTtlbHNlIGlmKHAuZmlsdGVyLmludGVydmFsKXIuZmlsdGVySW50ZXJ2YWw9YSgiX2hwYXJhbXMuIitxKyIuZmlsdGVyLmludGVydmFsIik7ZWxzZSBpZihwLmZpbHRlci5yZWdleHApci5maWx0ZXJSZWdleHA9cC5maWx0ZXIucmVnZXhwO2Vsc2UgcmV0dXJuIGNvbnNvbGUuZXJyb3IoImhwYXJhbS5maWx0ZXIgd2l0aCBubyBkb21haW5EaXNjcmV0ZSwgaW50ZXJ2YWwgb3IgcmVnZXhwIHByb3BlcnRpZXMgc2V0OiAlcyIscCksbnVsbDtsLnB1c2gocil9KTt0aGlzLl9tZXRyaWNzLmZvckVhY2goKHAscSk9PntwPXttZXRyaWM6cC5pbmZvLm5hbWUsZmlsdGVySW50ZXJ2YWw6YSgiX21ldHJpY3MuIitxKyIuZmlsdGVyLmludGVydmFsIil9O2wucHVzaChwKX0pO2lmKHZvaWQgMCE9PXRoaXMuX3NvcnRCeUluZGV4JiZ2b2lkIDAhPT10aGlzLl9zb3J0RGlyZWN0aW9uKXtpZighKHRoaXMuX3NvcnRCeUluZGV4IGluCmwpKXJldHVybiBjb25zb2xlLmVycm9yKCJObyBjb2x1bW4gaW4gY29sUGFyYW1zIHdpdGggaW5kZXggc29ydEJ5SW5kZXg6ICVzIix0aGlzLl9zb3J0QnlJbmRleCksbnVsbDtsW3RoaXMuX3NvcnRCeUluZGV4XS5vcmRlcj0wPT09dGhpcy5fc29ydERpcmVjdGlvbj8iT1JERVJfQVNDIjoiT1JERVJfREVTQyJ9Y29uc3Qgaz1jKCJfcGFnZU51bWJlcklucHV0Iiksbj1jKCJfcGFnZVNpemVJbnB1dCIpO3JldHVybiBmP3tleHBlcmltZW50TmFtZTp0aGlzLmV4cGVyaW1lbnROYW1lLGFsbG93ZWRTdGF0dXNlczpnLGNvbFBhcmFtczpsLHN0YXJ0SW5kZXg6biooay0xKSxzbGljZVNpemU6bn06bnVsbH0sX21ldHJpY1NvcnRCeUluZGV4KGEpe3JldHVybiBhK3RoaXMuX2hwYXJhbXMubGVuZ3RofSxfaHBhcmFtTmFtZTp0Zi5ocGFyYW1zLnV0aWxzLmhwYXJhbU5hbWUsX21ldHJpY05hbWU6dGYuaHBhcmFtcy51dGlscy5tZXRyaWNOYW1lLF9wcmV0dHlQcmludDp0Zi5ocGFyYW1zLnV0aWxzLnByZXR0eVByaW50fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaGVhZGVyLXBhbmVsL3BhcGVyLWhlYWRlci1wYW5lbC5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBhPXtzY3JvbGw6ITB9LGM9e3N0YW5kYXJkOjIsd2F0ZXJmYWxsOjEsIndhdGVyZmFsbC10YWxsIjoxfSxkPXsid2F0ZXJmYWxsLXRhbGwiOiEwfTtQb2x5bWVyKHtpczoicGFwZXItaGVhZGVyLXBhbmVsIixwcm9wZXJ0aWVzOnttb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToic3RhbmRhcmQiLG9ic2VydmVyOiJfbW9kZUNoYW5nZWQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sc2hhZG93Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHRhbGxDbGFzczp7dHlwZTpTdHJpbmcsdmFsdWU6InRhbGwifSxhdFRvcDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLG5vdGlmeTohMCxyZWFkT25seTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxvYnNlcnZlcnM6WyJfY29tcHV0ZURyb3BTaGFkb3dIaWRkZW4oYXRUb3AsIG1vZGUsIHNoYWRvdykiXSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2FkZExpc3RlbmVyKCk7dGhpcy5fa2VlcFNjcm9sbGluZ1N0YXRlKCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVtb3ZlTGlzdGVuZXIoKX0sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxIYW5kbGVyPXRoaXMuX3Njcm9sbC5iaW5kKHRoaXMpO2NvbnNvbGUud2Fybih0aGlzLmlzLCJpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGFwcC1sYXlvdXQgaW5zdGVhZCEiKX0sZ2V0IGhlYWRlcigpe3JldHVybiBQb2x5bWVyLmRvbSh0aGlzLiQuaGVhZGVyU2xvdCkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpWzBdfSxnZXQgc2Nyb2xsZXIoKXtyZXR1cm4gdGhpcy5fZ2V0U2Nyb2xsZXJGb3JNb2RlKHRoaXMubW9kZSl9LGdldCB2aXNpYmxlU2hhZG93KCl7cmV0dXJuIHRoaXMuJC5kcm9wU2hhZG93LmNsYXNzTGlzdC5jb250YWlucygiaGFzLXNoYWRvdyIpfSxfY29tcHV0ZURyb3BTaGFkb3dIaWRkZW46ZnVuY3Rpb24oZixnKXtnPWNbZ107dGhpcy5zaGFkb3c/dGhpcy50b2dnbGVDbGFzcygiaGFzLXNoYWRvdyIsITAsdGhpcy4kLmRyb3BTaGFkb3cpOjI9PT1nP3RoaXMudG9nZ2xlQ2xhc3MoImhhcy1zaGFkb3ciLCEwLHRoaXMuJC5kcm9wU2hhZG93KToKMSE9PWd8fGY/dGhpcy50b2dnbGVDbGFzcygiaGFzLXNoYWRvdyIsITEsdGhpcy4kLmRyb3BTaGFkb3cpOnRoaXMudG9nZ2xlQ2xhc3MoImhhcy1zaGFkb3ciLCEwLHRoaXMuJC5kcm9wU2hhZG93KX0sX2NvbXB1dGVNYWluQ29udGFpbmVyQ2xhc3M6ZnVuY3Rpb24oZil7dmFyIGc9e307Zy5mbGV4PSJjb3ZlciIhPT1mO3JldHVybiBPYmplY3Qua2V5cyhnKS5maWx0ZXIoZnVuY3Rpb24obCl7cmV0dXJuIGdbbF19KS5qb2luKCIgIil9LF9hZGRMaXN0ZW5lcjpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLnNjcm9sbEhhbmRsZXIpfSxfcmVtb3ZlTGlzdGVuZXI6ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdGhpcy5zY3JvbGxIYW5kbGVyKX0sX21vZGVDaGFuZ2VkOmZ1bmN0aW9uKGYsZyl7dmFyIGw9dGhpcy5oZWFkZXI7bCYmKGRbZ10mJiFkW2ZdPyhsLmNsYXNzTGlzdC5yZW1vdmUodGhpcy50YWxsQ2xhc3MpLAp0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7bC5jbGFzc0xpc3QucmVtb3ZlKCJhbmltYXRlIil9LDIwMCkpOnRoaXMudG9nZ2xlQ2xhc3MoImFuaW1hdGUiLGRbZl0sbCkpO3RoaXMuX2tlZXBTY3JvbGxpbmdTdGF0ZSgpfSxfa2VlcFNjcm9sbGluZ1N0YXRlOmZ1bmN0aW9uKCl7dmFyIGY9dGhpcy5zY3JvbGxlcixnPXRoaXMuaGVhZGVyO3RoaXMuX3NldEF0VG9wKDA9PT1mLnNjcm9sbFRvcCk7ZyYmdGhpcy50YWxsQ2xhc3MmJmRbdGhpcy5tb2RlXSYmdGhpcy50b2dnbGVDbGFzcyh0aGlzLnRhbGxDbGFzcyx0aGlzLmF0VG9wfHxnLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLnRhbGxDbGFzcykmJmYuc2Nyb2xsSGVpZ2h0PHRoaXMub2Zmc2V0SGVpZ2h0LGcpfSxfc2Nyb2xsOmZ1bmN0aW9uKCl7dGhpcy5fa2VlcFNjcm9sbGluZ1N0YXRlKCk7dGhpcy5maXJlKCJjb250ZW50LXNjcm9sbCIse3RhcmdldDp0aGlzLnNjcm9sbGVyfSx7YnViYmxlczohMX0pfSxfZ2V0U2Nyb2xsZXJGb3JNb2RlOmZ1bmN0aW9uKGYpe3JldHVybiBhW2ZdPwp0aGlzOnRoaXMuJC5tYWluQ29udGFpbmVyfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10b29sYmFyL3BhcGVyLXRvb2xiYXIuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdG9vbGJhciIsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6InRvb2xiYXIifSxwcm9wZXJ0aWVzOntib3R0b21KdXN0aWZ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sanVzdGlmeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LG1pZGRsZUp1c3RpZnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0scmVhZHk6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4odGhpcy5pcywiaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBhcHAtbGF5b3V0IGluc3RlYWQhIil9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXI9dGhpcy5fb2JzZXJ2ZSh0aGlzKTt0aGlzLl91cGRhdGVBcmlhTGFiZWxsZWRCeSgpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiZ0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCl9LF9vYnNlcnZlOmZ1bmN0aW9uKGEpe3ZhciBjPW5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQXJpYUxhYmVsbGVkQnkoKX0uYmluZCh0aGlzKSk7CmMub2JzZXJ2ZShhLHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pO3JldHVybiBjfSxfdXBkYXRlQXJpYUxhYmVsbGVkQnk6ZnVuY3Rpb24oKXtQb2x5bWVyLmRvbS5mbHVzaCgpO2Zvcih2YXIgYT1bXSxjPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKFBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvckFsbCgic2xvdCIpKS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoUG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJjb250ZW50IikpKSxkLGY9MDtkPWNbZl07ZisrKXtkPVBvbHltZXIuZG9tKGQpLmdldERpc3RyaWJ1dGVkTm9kZXMoKTtmb3IodmFyIGcsbD0wO2c9ZFtsXTtsKyspaWYoZy5jbGFzc0xpc3QmJmcuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0aXRsZSIpKWlmKGcuaWQpYS5wdXNoKGcuaWQpO2Vsc2V7dmFyIGs9InBhcGVyLXRvb2xiYXItbGFiZWwtIitNYXRoLmZsb29yKDFFNCpNYXRoLnJhbmRvbSgpKTtnLmlkPWs7YS5wdXNoKGspfX0wPAphLmxlbmd0aCYmdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsYS5qb2luKCIgIikpfSxfY29tcHV0ZUJhckV4dHJhQ2xhc3NlczpmdW5jdGlvbihhKXtyZXR1cm4gYT9hKygianVzdGlmaWVkIj09PWE/IiI6Ii1qdXN0aWZpZWQiKToiIn19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scy90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scyIscHJvcGVydGllczp7Y29uZmlndXJhdGlvbjpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheSxvcHRpb25zOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9jb25maWd1cmF0aW9uQ2hhbmdlZChjb25maWd1cmF0aW9uLiopIiwiX3Vuc2VsZWN0RGlzYWJsZWRMb2dTY2FsZXMoc2Vzc2lvbkdyb3Vwcy4qKSJdLF9jb25maWd1cmF0aW9uQ2hhbmdlZCgpe2NvbnN0IGE9dGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEsYz10aGlzLmNvbmZpZ3VyYXRpb24uc2NoZW1hLGQ9e2NvbHVtbnM6YS5ocGFyYW1JbmZvcy5tYXAoKGYsZyk9Pih7bmFtZTp0Zi5ocGFyYW1zLnV0aWxzLmhwYXJhbU5hbWUoZiksaW5kZXg6ZyxhYnNvbHV0ZUluZGV4OnRmLmhwYXJhbXMudXRpbHMuZ2V0QWJzb2x1dGVDb2x1bW5JbmRleChjLGEsZyksc2NhbGU6dGhpcy5faXNOdW1lcmljQ29sdW1uKGcpPwoiTElORUFSIjoiTk9OX05VTUVSSUMifSkpLmNvbmNhdChhLm1ldHJpY0luZm9zLm1hcCgoZixnKT0+e2crPWEuaHBhcmFtSW5mb3MubGVuZ3RoO3JldHVybntzY2FsZToiTElORUFSIixuYW1lOnRmLmhwYXJhbXMudXRpbHMubWV0cmljTmFtZShmKSxpbmRleDpnLGFic29sdXRlSW5kZXg6dGYuaHBhcmFtcy51dGlscy5nZXRBYnNvbHV0ZUNvbHVtbkluZGV4KGMsYSxnKX19KSksbWluQ29sb3I6IiMwMDAwRkYiLG1heENvbG9yOiIjRkYwMDAwIixjb25maWd1cmF0aW9uOnRoaXMuY29uZmlndXJhdGlvbn07dGhpcy5zZXQoIm9wdGlvbnMiLGQpO1BvbHltZXIuZG9tLmZsdXNoKCk7dGhpcy5zZXQoIm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4Iix0aGlzLl9kZWZhdWx0Q29sb3JCeUNvbHVtbkluZGV4KCkpfSxfdW5zZWxlY3REaXNhYmxlZExvZ1NjYWxlcygpe251bGwhPT10aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5jb2x1bW5zLmZvckVhY2goYT0+e2NvbnN0IGM9Im9wdGlvbnMuY29sdW1ucy4iKwphLmluZGV4O3RoaXMuX2FsbG93TG9nU2NhbGUoYSl8fCJMT0ciIT09YS5zY2FsZXx8dGhpcy5zZXQoYysiLnNjYWxlIiwiTElORUFSIil9KX0sX2FsbG93TG9nU2NhbGUoYSl7aWYoIXRoaXMuX2lzTnVtZXJpY0NvbHVtbihhLmluZGV4KXx8IXRoaXMuc2Vzc2lvbkdyb3VwcylyZXR1cm4hMTtjb25zdCBbYyxkXT10Zi5ocGFyYW1zLnV0aWxzLnZpc2libGVOdW1lcmljQ29sdW1uRXh0ZW50KHRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLHRoaXMuc2Vzc2lvbkdyb3VwcyxhLmluZGV4KTtyZXR1cm4gMDxjfHwwPmR9LF9pc051bWVyaWNDb2x1bW4oYSl7cmV0dXJuIGE+PXRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zLmxlbmd0aHx8IkRBVEFfVFlQRV9GTE9BVDY0Ij09PXRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zW2FdLnR5cGV9LF9kZWZhdWx0Q29sb3JCeUNvbHVtbkluZGV4KCl7aWYoMDx0aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvcy5sZW5ndGgpcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zLmxlbmd0aDsKY29uc3QgYT10aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvcy5maW5kSW5kZXgoYz0+IkRBVEFfVFlQRV9GTE9BVDY0Ij09PWMudHlwZSk7aWYoLTEhPT1hKXJldHVybiBhfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWFjdGl2ZS1pdGVtLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkFjdGl2ZUl0ZW1CZWhhdmlvcj17cHJvcGVydGllczp7YWN0aXZlSXRlbTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHZhbHVlOm51bGx9fSxsaXN0ZW5lcnM6eyJjZWxsLWFjdGl2YXRlIjoiX2FjdGl2YXRlSXRlbSJ9LG9ic2VydmVyczpbIl9hY3RpdmVJdGVtQ2hhbmdlZChhY3RpdmVJdGVtKSJdLF9hY3RpdmF0ZUl0ZW06ZnVuY3Rpb24oYSl7dmFyIGM9YS5kZXRhaWwubW9kZWwuaXRlbTt0aGlzLmFjdGl2ZUl0ZW09dGhpcy5hY3RpdmVJdGVtIT09Yz9jOm51bGw7YS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX0sX2FjdGl2ZUl0ZW1DaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEl0ZW1zJiZ0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMuZm9yRWFjaChmdW5jdGlvbihhKXt0aGlzLl91cGRhdGVJdGVtKGEsYS5pdGVtKX0uYmluZCh0aGlzKSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC10YWJsZS1zY3JvbGwtYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVTY3JvbGxCZWhhdmlvckltcGw9e3Byb3BlcnRpZXM6e192aWR4T2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZTowfSxpb3M6e3R5cGU6Qm9vbGVhbix2YWx1ZTpuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OmhvbmV8YWQ7KD86IFU7KT8gQ1BVKSBPUyAoXGQrKS8pLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sZml4ZWRTZWN0aW9uczp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxjb21wdXRlZDoiX2hhc0ZpeGVkU2VjdGlvbnMoc2Nyb2xsYmFyV2lkdGgpIn0sX2Zyb3plbkNlbGxzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxzY3JvbGxpbmc6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsVGFyZ2V0PXRoaXMuJC50YWJsZX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLmxpc3Rlbih0aGlzLnNjcm9sbFRhcmdldCwid2hlZWwiLAoiX29uV2hlZWwiKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnVubGlzdGVuKHRoaXMuc2Nyb2xsVGFyZ2V0LCJ3aGVlbCIsIl9vbldoZWVsIil9LHNjcm9sbFRvU2NhbGVkSW5kZXg6ZnVuY3Rpb24oYSl7dGhpcy5fcGVuZGluZ1Njcm9sbFRvU2NhbGVkSW5kZXg9bnVsbDt0aGlzLiQuaXRlbXMuc3R5bGUuYm9yZGVyVG9wV2lkdGh8fCh0aGlzLl9wZW5kaW5nU2Nyb2xsVG9TY2FsZWRJbmRleD1hKTthPU1hdGgubWluKE1hdGgubWF4KGEsMCksdGhpcy5zaXplLTEpO3RoaXMuJC50YWJsZS5zY3JvbGxUb3A9YS90aGlzLnNpemUqdGhpcy4kLnRhYmxlLnNjcm9sbEhlaWdodDt0aGlzLl9zY3JvbGxIYW5kbGVyKCk7dGhpcy5zY3JvbGxUb0luZGV4KGEtdGhpcy5fdmlkeE9mZnNldCk7dGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbih0aGlzLl9zY3JvbGxQb3NpdGlvbik7dGhpcy5fc2Nyb2xsSGFuZGxlcigpO3RoaXMuX3ZpZHhPZmZzZXQrdGhpcy5sYXN0VmlzaWJsZUluZGV4PT09dGhpcy5zaXplLQoxJiYodGhpcy4kLnRhYmxlLnNjcm9sbFRvcD10aGlzLiQudGFibGUuc2Nyb2xsSGVpZ2h0LXRoaXMuJC50YWJsZS5vZmZzZXRIZWlnaHQsdGhpcy5fc2Nyb2xsSGFuZGxlcigpKX0sX2hhc0ZpeGVkU2VjdGlvbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0VkZ2UvKSYmMD09PWF9LF9vbldoZWVsOmZ1bmN0aW9uKGEpe2lmKCFhLmN0cmxLZXkmJiF0aGlzLl9oYXNTY3JvbGxlZEFuY2VzdG9yKGEudGFyZ2V0LGEuZGVsdGFYLGEuZGVsdGFZKSl7dmFyIGM9dGhpcy4kLnRhYmxlLGQ9YS5kZWx0YVk7MT09PWEuZGVsdGFNb2RlJiYoZCo9Z3JpZC4kLnNjcm9sbGVyLl9waHlzaWNhbEF2ZXJhZ2UpO3ZhciBmPU1hdGguYWJzKGEuZGVsdGFYKStNYXRoLmFicyhkKTt0aGlzLl9jYW5TY3JvbGwoYyxhLmRlbHRhWCxkKT8oYS5wcmV2ZW50RGVmYXVsdCgpLGMuc2Nyb2xsVG9wKz1kLGMuc2Nyb2xsTGVmdCs9YS5kZWx0YVgsdGhpcy5fc2Nyb2xsSGFuZGxlcigpLAp0aGlzLl9oYXNSZXNpZHVhbE1vbWVudHVtPSEwLHRoaXMuX2lnbm9yZU5ld1doZWVsPXRoaXMuZGVib3VuY2UoImlnbm9yZS1uZXctd2hlZWwiLGZ1bmN0aW9uKCl7dGhpcy5faWdub3JlTmV3V2hlZWw9bnVsbH0sNTAwKSk6dGhpcy5faGFzUmVzaWR1YWxNb21lbnR1bSYmZjw9dGhpcy5fcHJldmlvdXNNb21lbnR1bXx8dGhpcy5faWdub3JlTmV3V2hlZWw/YS5wcmV2ZW50RGVmYXVsdCgpOmY+dGhpcy5fcHJldmlvdXNNb21lbnR1bSYmKHRoaXMuX2hhc1Jlc2lkdWFsTW9tZW50dW09ITEpO3RoaXMuX3ByZXZpb3VzTW9tZW50dW09Zn19LF9oYXNTY3JvbGxlZEFuY2VzdG9yOmZ1bmN0aW9uKGEsYyxkKXtpZih0aGlzLl9jYW5TY3JvbGwoYSxjLGQpKXJldHVybiEwO2lmKCJ2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQiIT09YS5sb2NhbE5hbWUmJmEhPT10aGlzJiZhLnBhcmVudEVsZW1lbnQpcmV0dXJuIHRoaXMuX2hhc1Njcm9sbGVkQW5jZXN0b3IoYS5wYXJlbnRFbGVtZW50LGMsZCl9LApfY2FuU2Nyb2xsOmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gMDxkJiZhLnNjcm9sbFRvcDxhLnNjcm9sbEhlaWdodC1hLm9mZnNldEhlaWdodHx8MD5kJiYwPGEuc2Nyb2xsVG9wfHwwPGMmJmEuc2Nyb2xsTGVmdDxhLnNjcm9sbFdpZHRoLWEub2Zmc2V0V2lkdGh8fDA+YyYmMDxhLnNjcm9sbExlZnR9LF9zY3JvbGxIYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIGE9TWF0aC5tYXgoMCxNYXRoLm1pbih0aGlzLl9tYXhTY3JvbGxUb3AsdGhpcy5fc2Nyb2xsVG9wKSksYz1hLXRoaXMuX3Njcm9sbFBvc2l0aW9uLGQ9dGhpcy5fcmF0aW8sZj0wLGc9dGhpcy5faGlkZGVuQ29udGVudFNpemUsbD1kLGs9W107dGhpcy5fc2Nyb2xsUG9zaXRpb249YTt0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPW51bGw7dmFyIG49dGhpcy5fc2Nyb2xsQm90dG9tO3ZhciBwPXRoaXMuX3BoeXNpY2FsQm90dG9tO2lmKE1hdGguYWJzKGMpPnRoaXMuX3BoeXNpY2FsU2l6ZSl0aGlzLl9waHlzaWNhbFRvcCs9CmMsZj1NYXRoLnJvdW5kKGMvdGhpcy5fcGh5c2ljYWxBdmVyYWdlKTtlbHNlIGlmKDA+Yyl7dmFyIHE9YS10aGlzLl9waHlzaWNhbFRvcDtrPXRoaXMuX3ZpcnR1YWxTdGFydDt2YXIgcj1bXTt2YXIgdD10aGlzLl9waHlzaWNhbEVuZDtmb3IobD1xL2c7bDxkJiZmPHRoaXMuX3BoeXNpY2FsQ291bnQmJjA8ay1mJiZwLXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudCh0KT5uOylxPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudCh0KSxsKz1xL2cscC09cSxyLnB1c2godCksZisrLHQ9MD09PXQ/dGhpcy5fcGh5c2ljYWxDb3VudC0xOnQtMTtrPXI7Zj0tZn1lbHNlIGlmKDA8Yyl7dmFyIHY9dGhpcy5fdmlydHVhbEVuZCx5PXRoaXMuX3ZpcnR1YWxDb3VudC0xO3I9W107dD10aGlzLl9waHlzaWNhbFN0YXJ0O2ZvcihsPShwLW4pL2c7bDxkJiZmPHRoaXMuX3BoeXNpY2FsQ291bnQmJnYrZjx5JiZ0aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQodCk8CmE7KXE9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KHQpLGwrPXEvZyx0aGlzLl9waHlzaWNhbFRvcCs9cSxyLnB1c2godCksZisrLHQ9KHQrMSkldGhpcy5fcGh5c2ljYWxDb3VudH10aGlzLl92aXJ0dWFsQ291bnQ8dGhpcy5zaXplJiZ0aGlzLl9hZGp1c3RWaXJ0dWFsSW5kZXhPZmZzZXQoYyk7MD09PWY/KHA8bnx8dGhpcy5fcGh5c2ljYWxUb3A+YSkmJnRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKCk6KHRoaXMuX3ZpcnR1YWxTdGFydCs9Zix0aGlzLl9waHlzaWNhbFN0YXJ0Kz1mLHRoaXMuX3VwZGF0ZShyLGspKTt0aGlzLl90cmFuc2xhdGVTdGF0aW9uYXJ5RWxlbWVudHMoKTt0aGlzLmhhc0F0dHJpYnV0ZSgicmVvcmRlcmluZyIpfHwodGhpcy5zY3JvbGxpbmc9ITApO3RoaXMuZGVib3VuY2UoInZhYWRpbi1ncmlkLXNjcm9sbGluZyIsZnVuY3Rpb24oKXt0aGlzLnNjcm9sbGluZz0hMTt0aGlzLl9yZW9yZGVyUm93cygpfSwxMDApfSxfYWRqdXN0VmlydHVhbEluZGV4T2Zmc2V0OmZ1bmN0aW9uKGEpe2lmKDFFNDwKTWF0aC5hYnMoYSkpdGhpcy5fbm9TY2FsZT90aGlzLl9ub1NjYWxlPSExOihhPU1hdGgucm91bmQodGhpcy5fc2Nyb2xsUG9zaXRpb24vdGhpcy5fc2Nyb2xsSGVpZ2h0KjFFMykvMUUzLHRoaXMuX3ZpZHhPZmZzZXQ9TWF0aC5yb3VuZChhKnRoaXMuc2l6ZS1hKnRoaXMuX3ZpcnR1YWxDb3VudCksMD09PXRoaXMuX3Njcm9sbFRvcCYmdGhpcy5zY3JvbGxUb0luZGV4KDApKTtlbHNle2E9dGhpcy5fdmlkeE9mZnNldHx8MDswPT09dGhpcy5fc2Nyb2xsVG9wPyh0aGlzLl92aWR4T2Zmc2V0PTAsYSE9PXRoaXMuX3ZpZHhPZmZzZXQmJnRoaXMuc2Nyb2xsVG9JbmRleCgwKSk6MUUzPnRoaXMuZmlyc3RWaXNpYmxlSW5kZXgmJjA8dGhpcy5fdmlkeE9mZnNldCYmKHRoaXMuX3ZpZHhPZmZzZXQtPU1hdGgubWluKHRoaXMuX3ZpZHhPZmZzZXQsMTAwKSx0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5maXJzdFZpc2libGVJbmRleCsoYS10aGlzLl92aWR4T2Zmc2V0KSsxKSx0aGlzLl9ub1NjYWxlPQohMCk7dmFyIGM9dGhpcy5zaXplLXRoaXMuX3ZpcnR1YWxDb3VudDt0aGlzLl9zY3JvbGxUb3A+PXRoaXMuX21heFNjcm9sbFRvcD8odGhpcy5fdmlkeE9mZnNldD1jLGEhPT10aGlzLl92aWR4T2Zmc2V0JiZ0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5fdmlydHVhbENvdW50KSk6dGhpcy5maXJzdFZpc2libGVJbmRleD50aGlzLl92aXJ0dWFsQ291bnQtMUUzJiZ0aGlzLl92aWR4T2Zmc2V0PGMmJih0aGlzLl92aWR4T2Zmc2V0Kz1NYXRoLm1pbihjLXRoaXMuX3ZpZHhPZmZzZXQsMTAwKSx0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5maXJzdFZpc2libGVJbmRleC0odGhpcy5fdmlkeE9mZnNldC1hKSksdGhpcy5fbm9TY2FsZT0hMCl9fSxfcmVvcmRlclJvd3M6ZnVuY3Rpb24oKXt2YXIgYT1Qb2x5bWVyLmRvbSh0aGlzLiQuaXRlbXMpLGM9YS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtcm93IiksZD1jLmxlbmd0aC0oY1swXS5pbmRleC0odGhpcy5fdmlydHVhbFN0YXJ0K3RoaXMuX3ZpZHhPZmZzZXQpKTsKaWYoZDxjLmxlbmd0aC8yKWZvcih2YXIgZj0wO2Y8ZDtmKyspYS5hcHBlbmRDaGlsZChjW2ZdKTtlbHNlIGZvcig7ZDxjLmxlbmd0aDtkKyspYS5pbnNlcnRCZWZvcmUoY1tkXSxjWzBdKX0sX2Zyb3plbkNlbGxzQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZGVib3VuY2UoImNhY2hlLWVsZW1lbnRzIixmdW5jdGlvbigpe1BvbHltZXIuZG9tKHRoaXMuZG9tSG9zdC5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtY2VsbCIpLmZvckVhY2goZnVuY3Rpb24oYSl7YS5zdHlsZS50cmFuc2Zvcm09IiJ9KTt0aGlzLl9mcm96ZW5DZWxscz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChQb2x5bWVyLmRvbSh0aGlzLmRvbUhvc3Qucm9vdCkucXVlcnlTZWxlY3RvckFsbCgiW2Zyb3plbl0iKSk7dGhpcy5fdHJhbnNsYXRlU3RhdGlvbmFyeUVsZW1lbnRzKCl9KTt0aGlzLl91cGRhdGVMYXN0RnJvemVuKCl9LF91cGRhdGVMYXN0RnJvemVuOmZ1bmN0aW9uKCl7aWYodGhpcy5jb2x1bW5UcmVlKXt2YXIgYT0KdGhpcy5jb2x1bW5UcmVlW3RoaXMuY29sdW1uVHJlZS5sZW5ndGgtMV0uc2xpY2UoMCk7YS5zb3J0KGZ1bmN0aW9uKGQsZil7cmV0dXJuIGQuX29yZGVyLWYuX29yZGVyfSk7dmFyIGM9YS5yZWR1Y2UoZnVuY3Rpb24oZCxmLGcpe2YuX2xhc3RGcm96ZW49ITE7cmV0dXJuIGYuZnJvemVuJiYhZi5oaWRkZW4/ZzpkfSx2b2lkIDApO3ZvaWQgMCE9PWMmJihhW2NdLl9sYXN0RnJvemVuPSEwKX19LF90cmFuc2xhdGVTdGF0aW9uYXJ5RWxlbWVudHM6ZnVuY3Rpb24oKXt0aGlzLmZpeGVkU2VjdGlvbnM/KHRoaXMuJC5pdGVtcy5zdHlsZS50cmFuc2Zvcm09dGhpcy5fZ2V0VHJhbnNsYXRlKC10aGlzLl9zY3JvbGxMZWZ0fHwwLC10aGlzLl9zY3JvbGxUb3B8fDApLHRoaXMuJC5mb290ZXIuc3R5bGUudHJhbnNmb3JtPXRoaXMuJC5oZWFkZXIuc3R5bGUudHJhbnNmb3JtPXRoaXMuX2dldFRyYW5zbGF0ZSgtdGhpcy5fc2Nyb2xsTGVmdHx8MCwwKSk6dGhpcy4kLmZvb3Rlci5zdHlsZS50cmFuc2Zvcm09CnRoaXMuJC5oZWFkZXIuc3R5bGUudHJhbnNmb3JtPXRoaXMuX2dldFRyYW5zbGF0ZSgwLHRoaXMuX3Njcm9sbFRvcCk7Zm9yKHZhciBhPXRoaXMuX2dldFRyYW5zbGF0ZSh0aGlzLl9zY3JvbGxMZWZ0LDApLGM9MDtjPHRoaXMuX2Zyb3plbkNlbGxzLmxlbmd0aDtjKyspdGhpcy5fZnJvemVuQ2VsbHNbY10uc3R5bGUudHJhbnNmb3JtPWF9LF9nZXRUcmFuc2xhdGU6ZnVuY3Rpb24oYSxjKXtyZXR1cm4idHJhbnNsYXRlKCIrYSsicHgsIitjKyJweCkifX07dmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVTY3JvbGxCZWhhdmlvcj1bUG9seW1lci5Jcm9uU2Nyb2xsVGFyZ2V0QmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVTY3JvbGxCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWNlbGwtY2xpY2stYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuQ2VsbENsaWNrQmVoYXZpb3I9e2xpc3RlbmVyczp7Y2xpY2s6Il9vbkNsaWNrIn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9jZWxsQ29udGVudEZvY3VzSGFuZGxlcj1mdW5jdGlvbihhKXthLnRhcmdldCE9PXRoaXMuX2NlbGxDb250ZW50JiZ0aGlzLmZpcmUoImNlbGwtY29udGVudC1mb2N1cyIse2NlbGw6dGhpc30pfS5iaW5kKHRoaXMpO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2NlbGxDb250ZW50Rm9jdXNIYW5kbGVyLCEwKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9jZWxsQ29udGVudEZvY3VzSGFuZGxlciwhMCl9LF9vbkNsaWNrOmZ1bmN0aW9uKGEpeyJ2YWFkaW4tZ3JpZC1zb3J0ZXIiIT09dGhpcy5sb2NhbE5hbWUmJnRoaXMuZmlyZSgiY2VsbC1mb2N1cyIse2NlbGw6dGhpc30pO2lmKHRoaXMuX2NlbGxDbGljayl7dmFyIGM9UG9seW1lci5kb20oYSkubG9jYWxUYXJnZXQ7CmMuZ2V0RGlzdHJpYnV0ZWROb2RlcyYmKGM9UG9seW1lci5kb20oYykuZ2V0RGlzdHJpYnV0ZWROb2RlcygpWzBdKTt2YXIgZD1Qb2x5bWVyLmRvbShhKS5wYXRoO2Q9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZCwwLGQuaW5kZXhPZihjKSsxKTtjLmNvbnRhaW5zKHRoaXMudGFyZ2V0JiZ0aGlzLnRhcmdldC5yb290LmFjdGl2ZUVsZW1lbnR8fGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpfHxkLnNvbWUodGhpcy5faXNGb2N1c2FibGUpfHx0aGlzLl9jZWxsQ2xpY2soYSl9fSxfaXNGb2N1c2FibGU6ZnVuY3Rpb24oYSl7dmFyIGM9UG9seW1lci5kb20oYSkucGFyZW50Tm9kZTtjPS0xIT09QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChQb2x5bWVyLmRvbShjKS5xdWVyeVNlbGVjdG9yQWxsKCJbdGFiaW5kZXhdLCBidXR0b24sIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBvYmplY3QsIGlmcmFtZSwgbGFiZWwsIGFbaHJlZl0sIGFyZWFbaHJlZl0iKSxhKTtyZXR1cm4hYS5kaXNhYmxlZCYmCmN9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC10YWJsZS1jZWxsLmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGE9e3Byb3BlcnRpZXM6e2NvbHVtbjpPYmplY3QsZXhwYW5kZWQ6Qm9vbGVhbixmbGV4R3JvdzpOdW1iZXIsY29sU3BhbjpOdW1iZXIsZm9jdXNlZDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sZnJvemVuOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSxsYXN0RnJvemVuOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSxoaWRkZW46e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGluc3RhbmNlOk9iamVjdCxpbmRleDpOdW1iZXIsaXRlbTpPYmplY3Qsc2VsZWN0ZWQ6Qm9vbGVhbix0ZW1wbGF0ZTpPYmplY3QsdGFyZ2V0Ok9iamVjdCx3aWR0aDpTdHJpbmcsb3JkZXI6TnVtYmVyLHJlb3JkZXJTdGF0dXM6e3R5cGU6U3RyaW5nLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX2NoaWxkQ29sdW1uczpBcnJheSxfY2VsbENvbnRlbnQ6T2JqZWN0LF9pbnNlcnRpb25Qb2ludDpPYmplY3QsCl90ZW1wbGF0aXplcjpPYmplY3R9LG9ic2VydmVyczoiX2NvbHVtbkNoYW5nZWQoY29sdW1uKTtfY2VsbEF0dGFjaGVkKGNvbHVtbiwgaXNBdHRhY2hlZCk7X2V4cGFuZGVkQ2hhbmdlZChleHBhbmRlZCwgaW5zdGFuY2UpO19mbGV4R3Jvd0NoYW5nZWQoZmxleEdyb3cpO19pbmRleENoYW5nZWQoaW5kZXgsIGluc3RhbmNlKTtfaXRlbUNoYW5nZWQoaXRlbSwgaW5zdGFuY2UpO19pbnN0YW5jZUNoYW5nZWQoaW5zdGFuY2UsIHRhcmdldCk7X3NlbGVjdGVkQ2hhbmdlZChzZWxlY3RlZCwgaW5zdGFuY2UpO190b2dnbGVDb250ZW50KGlzQXR0YWNoZWQsIF9jZWxsQ29udGVudCwgX2luc2VydGlvblBvaW50KTtfdG9nZ2xlSW5zdGFuY2UoaXNBdHRhY2hlZCwgX3RlbXBsYXRpemVyLCBpbnN0YW5jZSk7X3dpZHRoQ2hhbmdlZCh3aWR0aCk7X29yZGVyQ2hhbmdlZChvcmRlcik7X3Zpc2libGVDaGlsZENvbHVtbnNDaGFuZ2VkKF92aXNpYmxlQ2hpbGRDb2x1bW5zKTtfY2hpbGRDb2x1bW5zQ2hhbmdlZChfY2hpbGRDb2x1bW5zKSIuc3BsaXQoIjsiKSwKcmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmNsYXNzTGlzdC5hZGQoInZhYWRpbi1ncmlkLWNlbGwiKTshMT09PVBvbHltZXIuU2V0dGluZ3MudXNlU2hhZG93JiYodGhpcy5jbGFzc0xpc3QuYWRkKCJzdHlsZS1zY29wZSIpLHRoaXMuY2xhc3NMaXN0LmFkZCgidmFhZGluLWdyaWQiKSl9LF9jb2x1bW5DaGFuZ2VkOmZ1bmN0aW9uKGMpe3RoaXMuZmxleEdyb3c9Yy5mbGV4R3Jvdzt0aGlzLmZyb3plbj1jLmZyb3plbjt0aGlzLmxhc3RGcm96ZW49Yy5fbGFzdEZyb3plbjt0aGlzLmhlYWRlclRlbXBsYXRlPWMuaGVhZGVyVGVtcGxhdGU7dGhpcy5mb290ZXJUZW1wbGF0ZT1jLmZvb3RlclRlbXBsYXRlO3RoaXMudGVtcGxhdGU9Yy50ZW1wbGF0ZTt0aGlzLndpZHRoPWMud2lkdGg7dGhpcy5oaWRkZW49Yy5oaWRkZW47dGhpcy5yZXNpemFibGU9Yy5yZXNpemFibGU7dGhpcy5fY2hpbGRDb2x1bW5zPWMuX2NoaWxkQ29sdW1uczt0aGlzLm9yZGVyPWMuX29yZGVyO2MuY29sU3BhbiYmKHRoaXMuY29sU3Bhbj0KYy5jb2xTcGFuKTt0aGlzLmxpc3RlbihjLCJwcm9wZXJ0eS1jaGFuZ2VkIiwiX2NvbHVtblByb3BDaGFuZ2VkIil9LF9jZWxsQXR0YWNoZWQ6ZnVuY3Rpb24oYyxkKXt2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kJiYoZD90aGlzLmxpc3RlbihjLCJwcm9wZXJ0eS1jaGFuZ2VkIiwiX2NvbHVtblByb3BDaGFuZ2VkIik6dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuaXNBdHRhY2hlZHx8dGhpcy51bmxpc3RlbihjLCJwcm9wZXJ0eS1jaGFuZ2VkIiwiX2NvbHVtblByb3BDaGFuZ2VkIil9KSl9LF9jb2x1bW5Qcm9wQ2hhbmdlZDpmdW5jdGlvbihjKXtjLnRhcmdldD09dGhpcy5jb2x1bW4mJih0aGlzW2MuZGV0YWlsLnBhdGhdPWMuZGV0YWlsLnZhbHVlKX0sX2V4cGFuZGVkQ2hhbmdlZDpmdW5jdGlvbihjLGQpe3ZvaWQgMCE9PWMmJnZvaWQgMCE9PWQmJihkLl9fZXhwYW5kZWRfXz1jLGQuZXhwYW5kZWQ9Yyl9LF9mbGV4R3Jvd0NoYW5nZWQ6ZnVuY3Rpb24oYyl7dGhpcy5zdHlsZS5mbGV4R3Jvdz0KY30sX2luZGV4Q2hhbmdlZDpmdW5jdGlvbihjLGQpe3ZvaWQgMCE9PWMmJnZvaWQgMCE9PWQmJihkLmluZGV4PWMpfSxfaXRlbUNoYW5nZWQ6ZnVuY3Rpb24oYyxkKXt2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kJiYoZC5pdGVtPWMpfSxfc2VsZWN0ZWRDaGFuZ2VkOmZ1bmN0aW9uKGMsZCl7dm9pZCAwIT09YyYmdm9pZCAwIT09ZCYmKGQuX19zZWxlY3RlZF9fPWMsZC5zZWxlY3RlZD1jKX0sX2NoaWxkQ29sdW1uc0NoYW5nZWQ6ZnVuY3Rpb24oYyl7dGhpcy5jb2xTcGFuPWMubGVuZ3RofSxfdG9nZ2xlQ29udGVudDpmdW5jdGlvbihjLGQsZil7dm9pZCAwIT09YyYmdm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKGM/KFBvbHltZXIuZG9tKGQpLnBhcmVudE5vZGUhPT10aGlzLnRhcmdldCYmUG9seW1lci5kb20odGhpcy50YXJnZXQpLmFwcGVuZENoaWxkKGQpLFBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGYpKTp0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5pc0F0dGFjaGVkfHxQb2x5bWVyLmRvbShkKS5wYXJlbnROb2RlIT09CnRoaXMudGFyZ2V0fHxQb2x5bWVyLmRvbSh0aGlzLnRhcmdldCkucmVtb3ZlQ2hpbGQoZCl9KSl9LF90b2dnbGVJbnN0YW5jZTpmdW5jdGlvbihjLGQsZil7dm9pZCAwIT09YyYmdm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKGM/ZC5hZGRJbnN0YW5jZShmKTpkLnJlbW92ZUluc3RhbmNlKGYpKX0sX3dpZHRoQ2hhbmdlZDpmdW5jdGlvbihjKXt0aGlzLnN0eWxlLndpZHRoPWN9LF9vcmRlckNoYW5nZWQ6ZnVuY3Rpb24oYyl7dGhpcy5zdHlsZS5vcmRlcj1jfSxfdGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGMpe3RoaXMuaW5zdGFuY2U9Yy50ZW1wbGF0aXplci5jcmVhdGVJbnN0YW5jZSgpO3RoaXMuX3RlbXBsYXRpemVyPWMudGVtcGxhdGl6ZXJ9LF9pbnN0YW5jZUNoYW5nZWQ6ZnVuY3Rpb24oYyxkKXt2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kJiYodGhpcy5zdHlsZS5oZWlnaHQ9IiIsdGhpcy5fY2VsbENvbnRlbnQ9dGhpcy5fY2VsbENvbnRlbnR8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLWNlbGwtY29udGVudCIpLApjPSJ2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQtIisodmFhZGluLmVsZW1lbnRzLmdyaWQuX2NvbnRlbnRJbmRleD12YWFkaW4uZWxlbWVudHMuZ3JpZC5fY29udGVudEluZGV4KzF8fDApLHRoaXMuX2NlbGxDb250ZW50LmlubmVySFRNTD0iIixQb2x5bWVyLmRvbSh0aGlzLl9jZWxsQ29udGVudCkuYXBwZW5kQ2hpbGQodGhpcy5pbnN0YW5jZS5yb290KSx0aGlzLl9jZWxsQ29udGVudC5zZXRBdHRyaWJ1dGUoImlkIixjKSxQb2x5bWVyLkVsZW1lbnQ/KHRoaXMuX2NlbGxDb250ZW50LnNldEF0dHJpYnV0ZSgic2xvdCIsYyksdGhpcy5faW5zZXJ0aW9uUG9pbnQ9dGhpcy5faW5zZXJ0aW9uUG9pbnR8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNsb3QiKSx0aGlzLl9pbnNlcnRpb25Qb2ludC5zZXRBdHRyaWJ1dGUoIm5hbWUiLGMpKToodGhpcy5faW5zZXJ0aW9uUG9pbnQ9dGhpcy5faW5zZXJ0aW9uUG9pbnR8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNvbnRlbnQiKSx0aGlzLl9pbnNlcnRpb25Qb2ludC5zZXRBdHRyaWJ1dGUoInNlbGVjdCIsCiIjIitjKSkpfX07UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLWNlbGwiLGJlaGF2aW9yczpbYSx2YWFkaW4uZWxlbWVudHMuZ3JpZC5DZWxsQ2xpY2tCZWhhdmlvcl0sb2JzZXJ2ZXJzOlsiX3RlbXBsYXRlQ2hhbmdlZCh0ZW1wbGF0ZSkiXSxfY2VsbENsaWNrOmZ1bmN0aW9uKGMpe2MuZGVmYXVsdFByZXZlbnRlZHx8dGhpcy5maXJlKCJjZWxsLWFjdGl2YXRlIix7bW9kZWw6dGhpcy5pbnN0YW5jZX0pfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXItY2VsbCIscHJvcGVydGllczp7aGVhZGVyVGVtcGxhdGU6T2JqZWN0LHJlc2l6YWJsZTpCb29sZWFuLGNvbHVtblJlc2l6aW5nOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfX0sYmVoYXZpb3JzOlthLHZhYWRpbi5lbGVtZW50cy5ncmlkLkNlbGxDbGlja0JlaGF2aW9yXSxvYnNlcnZlcnM6WyJfaGVhZGVyVGVtcGxhdGVDaGFuZ2VkKGhlYWRlclRlbXBsYXRlKSIsIl9pc0VtcHR5Q2hhbmdlZChfaXNFbXB0eSwgaXNBdHRhY2hlZCkiLAoiX3Jlc2l6YWJsZUNoYW5nZWQocmVzaXphYmxlKSJdLGxpc3RlbmVyczp7bW91c2Vkb3duOiJfY2FuY2VsTW91c2VEb3duT25SZXNpemUiLG1vdXNlbW92ZToiX2VuYWJsZURyYWciLG1vdXNlb3V0OiJfZGlzYWJsZURyYWciLHRvdWNoc3RhcnQ6Il9vblRvdWNoU3RhcnQiLHRvdWNobW92ZToiX29uVG91Y2hNb3ZlIix0b3VjaGVuZDoiX29uVG91Y2hFbmQiLGNvbnRleHRtZW51OiJfb25Db250ZXh0TWVudSJ9LF9vbkNvbnRleHRNZW51OmZ1bmN0aW9uKGMpe3RoaXMuX3Jlb3JkZXJHaG9zdCYmYy5wcmV2ZW50RGVmYXVsdCgpfSxfb25Ub3VjaFN0YXJ0OmZ1bmN0aW9uKGMpe2MudGFyZ2V0IT09dGhpcy5fcmVzaXplSGFuZGxlJiZ0aGlzLnRhcmdldC5jb2x1bW5SZW9yZGVyaW5nQWxsb3dlZCYmKHRoaXMuX3N0YXJ0UmVvcmRlclRpbWVvdXQ9c2V0VGltZW91dCh0aGlzLl9zdGFydFJlb3JkZXIuYmluZCh0aGlzLGMpLDEwMCkpfSxfc3RhcnRSZW9yZGVyOmZ1bmN0aW9uKGMpe3RoaXMuX3Jlb3JkZXJHaG9zdD0KdGhpcy5fZ2V0R2hvc3QoKTt0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUudmlzaWJpbGl0eT0idmlzaWJsZSI7dmFyIGQ9bmV3IEN1c3RvbUV2ZW50KCJkcmFnc3RhcnQiLHtidWJibGVzOiEwfSk7dGhpcy5fY2VsbENvbnRlbnQuZGlzcGF0Y2hFdmVudChkKTt0aGlzLl9yZW9yZGVyWFk9e3g6Yy50b3VjaGVzWzBdLmNsaWVudFgtdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LHk6Yy50b3VjaGVzWzBdLmNsaWVudFktdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3B9O3RoaXMuX3VwZGF0ZUdob3N0UG9zaXRpb24oYy50b3VjaGVzWzBdLmNsaWVudFgsYy50b3VjaGVzWzBdLmNsaWVudFkpfSxfb25Ub3VjaE1vdmU6ZnVuY3Rpb24oYyl7aWYodGhpcy5fcmVvcmRlckdob3N0KXtjLnByZXZlbnREZWZhdWx0KCk7dmFyIGQ9bmV3IEN1c3RvbUV2ZW50KCJkcmFnb3ZlciIse2J1YmJsZXM6ITB9KTtkLmNsaWVudFg9Yy50b3VjaGVzWzBdLmNsaWVudFg7ZC5jbGllbnRZPQpjLnRvdWNoZXNbMF0uY2xpZW50WTt2YXIgZj10aGlzLl9jb250ZW50RnJvbVBvaW50KGQuY2xpZW50WCxkLmNsaWVudFkpO2YmJmYuZGlzcGF0Y2hFdmVudChkKTt0aGlzLl91cGRhdGVHaG9zdFBvc2l0aW9uKGMudG91Y2hlc1swXS5jbGllbnRYLGMudG91Y2hlc1swXS5jbGllbnRZKX1lbHNlIGNsZWFyVGltZW91dCh0aGlzLl9zdGFydFJlb3JkZXJUaW1lb3V0KX0sX3VwZGF0ZUdob3N0UG9zaXRpb246ZnVuY3Rpb24oYyxkKXtjLT10aGlzLl9yZW9yZGVyWFkueDtkPWQtdGhpcy5fcmVvcmRlclhZLnktNTA7dmFyIGY9cGFyc2VJbnQodGhpcy5fcmVvcmRlckdob3N0LnN0eWxlLmxlZnR8fDApLGc9cGFyc2VJbnQodGhpcy5fcmVvcmRlckdob3N0LnN0eWxlLnRvcHx8MCksbD10aGlzLl9yZW9yZGVyR2hvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dGhpcy5fcmVvcmRlckdob3N0LnN0eWxlLmxlZnQ9Zi0obC5sZWZ0LWMpKyJweCI7dGhpcy5fcmVvcmRlckdob3N0LnN0eWxlLnRvcD0KZy0obC50b3AtZCkrInB4In0sX29uVG91Y2hFbmQ6ZnVuY3Rpb24oYyl7Y2xlYXJUaW1lb3V0KHRoaXMuX3N0YXJ0UmVvcmRlclRpbWVvdXQpO3RoaXMuX3Jlb3JkZXJHaG9zdCYmKGMucHJldmVudERlZmF1bHQoKSxjPW5ldyBDdXN0b21FdmVudCgiZHJhZ2VuZCIse2J1YmJsZXM6ITB9KSx0aGlzLmRpc3BhdGNoRXZlbnQoYyksdGhpcy5fcmVvcmRlckdob3N0LnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIsdGhpcy5fcmVvcmRlckdob3N0PW51bGwpfSxfY29udGVudEZyb21Qb2ludDpmdW5jdGlvbihjLGQpe2lmKFBvbHltZXIuU2V0dGluZ3MudXNlU2hhZG93KXt2YXIgZj10aGlzLnRhcmdldC4kLnNjcm9sbGVyO2YudG9nZ2xlQXR0cmlidXRlKCJuby1jb250ZW50LXBvaW50ZXItZXZlbnRzIiwhMCk7Yz10aGlzLmRvbUhvc3Qucm9vdC5lbGVtZW50RnJvbVBvaW50KGMsZCk7Zi50b2dnbGVBdHRyaWJ1dGUoIm5vLWNvbnRlbnQtcG9pbnRlci1ldmVudHMiLCExKTtpZihjJiZjLmdldENvbnRlbnRDaGlsZHJlbilyZXR1cm4gYy5nZXRDb250ZW50Q2hpbGRyZW4oUG9seW1lci5FbGVtZW50Pwoic2xvdCI6ImNvbnRlbnQiKVswXX1lbHNlIHJldHVybiBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGMsZCl9LF9nZXRHaG9zdDpmdW5jdGlvbigpe3ZhciBjPXRoaXMudGFyZ2V0LiQuc2Nyb2xsZXIuJC5yZW9yZGVyZ2hvc3Q7Yy5pbm5lclRleHQ9dGhpcy5fY2VsbENvbnRlbnQuaW5uZXJUZXh0O3ZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuX2NlbGxDb250ZW50KTsiYm94U2l6aW5nIGRpc3BsYXkgd2lkdGggaGVpZ2h0IGJhY2tncm91bmQgYWxpZ25JdGVtcyBwYWRkaW5nIGJvcmRlciBmbGV4LWRpcmVjdGlvbiBvdmVyZmxvdyIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGYpe2Muc3R5bGVbZl09ZFtmXX0sdGhpcyk7cmV0dXJuIGN9LF9lbmFibGVEcmFnOmZ1bmN0aW9uKCl7dGhpcy5fY2VsbENvbnRlbnQuZHJhZ2dhYmxlPXRoaXMudGFyZ2V0LmNvbHVtblJlb3JkZXJpbmdBbGxvd2VkJiYhd2luZG93LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCl9LF9kaXNhYmxlRHJhZzpmdW5jdGlvbigpe3RoaXMuX2NlbGxDb250ZW50LmRyYWdnYWJsZT0KITF9LF9jYW5jZWxNb3VzZURvd25PblJlc2l6ZTpmdW5jdGlvbihjKXtjLnRhcmdldD09PXRoaXMuX3Jlc2l6ZUhhbmRsZSYmYy5wcmV2ZW50RGVmYXVsdCgpfSxfcmVzaXphYmxlQ2hhbmdlZDpmdW5jdGlvbihjKXtjPyh0aGlzLl9yZXNpemVIYW5kbGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5fcmVzaXplSGFuZGxlLmNsYXNzTGlzdC5hZGQoInZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlIiksdGhpcy5saXN0ZW4odGhpcy5fcmVzaXplSGFuZGxlLCJ0cmFjayIsIl9vblRyYWNrIiksUG9seW1lci5kb20odGhpcykuYXBwZW5kQ2hpbGQodGhpcy5fcmVzaXplSGFuZGxlKSk6dGhpcy5fcmVzaXplSGFuZGxlJiYodGhpcy51bmxpc3Rlbih0aGlzLl9yZXNpemVIYW5kbGUsInRyYWNrIiwiX29uVHJhY2siKSxQb2x5bWVyLmRvbSh0aGlzKS5yZW1vdmVDaGlsZCh0aGlzLl9yZXNpemVIYW5kbGUpKX0sX29uVHJhY2s6ZnVuY3Rpb24oYyl7dGhpcy5jb2x1bW5SZXNpemluZz0KITA7dmFyIGQ9dGhpcy5jb2x1bW47InZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCI9PT1kLmxvY2FsTmFtZSYmKGQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZC5fY2hpbGRDb2x1bW5zLDApLnNvcnQoZnVuY3Rpb24obCxrKXtyZXR1cm4gbC5fb3JkZXItay5fb3JkZXJ9KS5maWx0ZXIoZnVuY3Rpb24obCl7cmV0dXJuIWwuaGlkZGVufSkucG9wKCkpO3ZhciBmPXRoaXMuX2dldEhlYWRlckNlbGxCeUNvbHVtbihkKTtpZihmLm9mZnNldFdpZHRoKXt2YXIgZz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShmLl9jZWxsQ29udGVudCk7ZC53aWR0aD1NYXRoLm1heCgxMCtwYXJzZUludChnLnBhZGRpbmdMZWZ0KStwYXJzZUludChnLnBhZGRpbmdSaWdodCksZi5vZmZzZXRXaWR0aCtjLmRldGFpbC54LWYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQpKyJweCI7ZC5mbGV4R3Jvdz0wfUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKFBvbHltZXIuZG9tKHRoaXMucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50KS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtcm93Omxhc3QtY2hpbGQgLnZhYWRpbi1ncmlkLWNlbGwiKSkuc29ydChmdW5jdGlvbihsLAprKXtyZXR1cm4gbC5jb2x1bW4uX29yZGVyLWsuY29sdW1uLl9vcmRlcn0pLmZvckVhY2goZnVuY3Rpb24obCxrLG4pe2s8bi5pbmRleE9mKGYpJiYobC5jb2x1bW4ud2lkdGg9bC5vZmZzZXRXaWR0aCsicHgiLGwuY29sdW1uLmZsZXhHcm93PTApfSk7dGhpcy5jb2x1bW5SZXNpemluZyYmImVuZCI9PT1jLmRldGFpbC5zdGF0ZSYmKHRoaXMuY29sdW1uUmVzaXppbmc9ITEpO3RoaXMuZmlyZSgiY29sdW1uLXJlc2l6aW5nIil9LF9nZXRIZWFkZXJDZWxsQnlDb2x1bW46ZnVuY3Rpb24oYyl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChQb2x5bWVyLmRvbSh0aGlzLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCkucXVlcnlTZWxlY3RvckFsbCgiLnZhYWRpbi1ncmlkLXJvdzpsYXN0LWNoaWxkIC52YWFkaW4tZ3JpZC1jZWxsIiksZnVuY3Rpb24oZCl7cmV0dXJuIGQuY29sdW1uPT09Y30pWzBdfSxfaGVhZGVyVGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGMpe3ZvaWQgMCE9PQpjJiYobnVsbD09PWN8fCF0aGlzLl9pc0NvbHVtblJvdyYmInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCIhPT10aGlzLmNvbHVtbi5sb2NhbE5hbWU/KHRoaXMuaW5zdGFuY2U9e3Jvb3Q6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iil9LHRoaXMuX2lzRW1wdHk9ITApOih0aGlzLmluc3RhbmNlPWMudGVtcGxhdGl6ZXIuY3JlYXRlSW5zdGFuY2UoKSx0aGlzLl90ZW1wbGF0aXplcj1jLnRlbXBsYXRpemVyLHRoaXMuX2lzRW1wdHk9ITEpKX0sX2lzRW1wdHlDaGFuZ2VkOmZ1bmN0aW9uKGMsZCl7ZCYmdGhpcy5maXJlKCJjZWxsLWVtcHR5LWNoYW5nZWQiKX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtZm9vdGVyLWNlbGwiLHByb3BlcnRpZXM6e2Zvb3RlclRlbXBsYXRlOk9iamVjdH0sYmVoYXZpb3JzOlthLHZhYWRpbi5lbGVtZW50cy5ncmlkLkNlbGxDbGlja0JlaGF2aW9yXSxvYnNlcnZlcnM6WyJfZm9vdGVyVGVtcGxhdGVDaGFuZ2VkKGZvb3RlclRlbXBsYXRlKSIsCiJfaXNFbXB0eUNoYW5nZWQoX2lzRW1wdHksIGlzQXR0YWNoZWQpIl0sX2Zvb3RlclRlbXBsYXRlQ2hhbmdlZDpmdW5jdGlvbihjKXt2b2lkIDAhPT1jJiYobnVsbD09PWN8fCF0aGlzLl9pc0NvbHVtblJvdyYmInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCIhPT10aGlzLmNvbHVtbi5sb2NhbE5hbWU/KHRoaXMuaW5zdGFuY2U9e3Jvb3Q6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iil9LHRoaXMuX2lzRW1wdHk9ITApOih0aGlzLmluc3RhbmNlPWMudGVtcGxhdGl6ZXIuY3JlYXRlSW5zdGFuY2UoKSx0aGlzLl90ZW1wbGF0aXplcj1jLnRlbXBsYXRpemVyLHRoaXMuX2lzRW1wdHk9ITEpKX0sX2lzRW1wdHlDaGFuZ2VkOmZ1bmN0aW9uKGMsZCl7ZCYmdGhpcy5maXJlKCJjZWxsLWVtcHR5LWNoYW5nZWQiKX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtc2l6ZXItY2VsbCIsYmVoYXZpb3JzOlthXX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1zaXplci5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC1zaXplciIscHJvcGVydGllczp7Y29sdW1uVHJlZTpBcnJheSx0b3A6TnVtYmVyLF9jb2x1bW5zOkFycmF5fSxvYnNlcnZlcnM6WyJfY29sdW1uVHJlZUNoYW5nZWQoY29sdW1uVHJlZSkiLCJfdG9wQ2hhbmdlZCh0b3ApIl0sX2NvbHVtblRyZWVDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuX2NvbHVtbnM9YVthLmxlbmd0aC0xXX0sX3RvcENoYW5nZWQ6ZnVuY3Rpb24oYSl7dGhpcy5zdHlsZS50b3A9YSsicHgifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLW91dGVyLXNjcm9sbGVyLmh0bWwuanMKUG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLW91dGVyLXNjcm9sbGVyIixwcm9wZXJ0aWVzOntzY3JvbGxUYXJnZXQ6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfc2Nyb2xsVGFyZ2V0Q2hhbmdlZCJ9LHBhc3N0aHJvdWdoOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiEwfX0sbGlzdGVuZXJzOntzY3JvbGw6Il9zeW5jU2Nyb2xsVGFyZ2V0In0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLmxpc3Rlbih0aGlzLmRvbUhvc3QsIm1vdXNlbW92ZSIsIl9vbk1vdXNlTW92ZSIpO3RoaXMuc3R5bGUud2Via2l0T3ZlcmZsb3dTY3JvbGxpbmc9InRvdWNoIn0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnVubGlzdGVuKHRoaXMuZG9tSG9zdCwibW91c2Vtb3ZlIiwiX29uTW91c2VNb3ZlIil9LF9zY3JvbGxUYXJnZXRDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7YyYmdGhpcy51bmxpc3RlbihjLCJzY3JvbGwiLCJfc3luY091dGVyU2Nyb2xsZXIiKTt0aGlzLmxpc3RlbihhLAoic2Nyb2xsIiwiX3N5bmNPdXRlclNjcm9sbGVyIil9LF9vbk1vdXNlTW92ZTpmdW5jdGlvbihhKXt0aGlzLnBhc3N0aHJvdWdoPWEub2Zmc2V0WTw9dGhpcy5jbGllbnRIZWlnaHQmJmEub2Zmc2V0WDw9dGhpcy5jbGllbnRXaWR0aH0sX3N5bmNPdXRlclNjcm9sbGVyOmZ1bmN0aW9uKCl7dGhpcy5fc3luY2luZ1Njcm9sbFRhcmdldHx8KHRoaXMuX3N5bmNpbmdPdXRlclNjcm9sbGVyPSEwLHRoaXMuc2Nyb2xsVG9wPXRoaXMuZG9tSG9zdC5fc2Nyb2xsVG9wLHRoaXMuc2Nyb2xsTGVmdD10aGlzLmRvbUhvc3QuX3Njcm9sbExlZnQpO3RoaXMuX3N5bmNpbmdTY3JvbGxUYXJnZXQ9ITF9LF9zeW5jU2Nyb2xsVGFyZ2V0OmZ1bmN0aW9uKCl7dGhpcy5fc3luY2luZ091dGVyU2Nyb2xsZXJ8fCh0aGlzLl9zeW5jaW5nU2Nyb2xsVGFyZ2V0PSEwLHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcD10aGlzLnNjcm9sbFRvcCx0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxMZWZ0PXRoaXMuc2Nyb2xsTGVmdCwKdGhpcy5kb21Ib3N0Ll9zY3JvbGxIYW5kbGVyKCkpO3RoaXMuX3N5bmNpbmdPdXRlclNjcm9sbGVyPSExfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWZvY3VzYWJsZS1jZWxsLWNvbnRhaW5lci1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5Gb2N1c2FibGVDZWxsQ29udGFpbmVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2ZvY3VzZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9mb2N1c2VkUm93Ok9iamVjdCxfZm9jdXNlZFJvd0luZGV4Ok51bWJlcixfZm9jdXNlZENlbGw6T2JqZWN0LF9mb2N1c2VkQ2VsbEluZGV4Ok51bWJlcixfbGFzdEZvY3VzZWRDZWxsOk9iamVjdH0sb2JzZXJ2ZXJzOlsiX2Fubm91bmNlRm9jdXNlZENlbGwoX2ZvY3VzZWRDZWxsLCBmb2N1c2VkKSIsIl9kaXNwYXRjaEV2ZW50cyhfZm9jdXNlZENlbGwsIGZvY3VzZWQpIiwiX2ZvY3VzZWRDZWxsQ2hhbmdlZChfZm9jdXNlZFJvd0luZGV4LCBfZm9jdXNlZENlbGxJbmRleCkiXSxfYW5ub3VuY2VGb2N1c2VkQ2VsbDpmdW5jdGlvbihhLGMpe3ZvaWQgMCE9PWEmJnZvaWQgMCE9PWMmJnRoaXMuZG9tSG9zdC5uYXZpZ2F0aW5nJiZjJiYoYz1Qb2x5bWVyLkVsZW1lbnQ/YS5fY2VsbENvbnRlbnQuZ2V0QXR0cmlidXRlKCJzbG90Iik6CmEuX2NlbGxDb250ZW50LmlkLCJ2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IiE9PXRoaXMuaXN8fGEuaGFzQXR0cmlidXRlKCJkZXRhaWxzY2VsbCIpfHwoYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKFBvbHltZXIuZG9tKGEucGFyZW50RWxlbWVudCkucXVlcnlTZWxlY3RvckFsbCgiLnZhYWRpbi1ncmlkLWNlbGwiKSxhKSxjPXRoaXMuZG9tSG9zdC4kLmhlYWRlci5sYXN0RWxlbWVudENoaWxkLmNoaWxkcmVuW2FdLl9jZWxsQ29udGVudC5pZCsiICIrYyksdGhpcy5kb21Ib3N0LiQuZm9vdGVyRm9jdXNUcmFwLmFjdGl2ZVRhcmdldD1jKX0sX2Rpc3BhdGNoRXZlbnRzOmZ1bmN0aW9uKGEsYyl7dm9pZCAwIT09YSYmdm9pZCAwIT09YyYmKHRoaXMuX2xhc3RGb2N1c2VkQ2VsbCYmKHRoaXMuX2xhc3RGb2N1c2VkQ2VsbC5fY2VsbENvbnRlbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImNlbGwtZm9jdXNvdXQiKSksdGhpcy5fbGFzdEZvY3VzZWRDZWxsPXZvaWQgMCksCmMmJihhLl9jZWxsQ29udGVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY2VsbC1mb2N1c2luIikpLHRoaXMuX2xhc3RGb2N1c2VkQ2VsbD1hKSl9LF9mb2N1c2VkQ2VsbENoYW5nZWQ6ZnVuY3Rpb24oYSxjKXt2b2lkIDAhPT1hJiZ2b2lkIDAhPT1jJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKFBvbHltZXIuZG9tKHRoaXMpLmNoaWxkcmVuLGZ1bmN0aW9uKGQsZil7ZC5mb2N1c2VkPWY9PT1hO2QuZm9jdXNlZCYmKHRoaXMuX2ZvY3VzZWRSb3c9ZCx0aGlzLl9mb2N1c2VkQ2VsbEluZGV4PU1hdGgubWluKGMsZC5jaGlsZHJlbi5sZW5ndGgtMSksdGhpcy5fZm9jdXNlZENlbGw9ZC5jaGlsZHJlblt0aGlzLl9mb2N1c2VkQ2VsbEluZGV4XSk7ZC5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGcsbCl7Zy5mb2N1c2VkPWw9PT10aGlzLl9mb2N1c2VkQ2VsbEluZGV4fS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9LGZvY3VzTGVmdDpmdW5jdGlvbigpe2lmKCF0aGlzLl9mb2N1c2VkQ2VsbC5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIikpe3ZhciBhPQp0aGlzLl92aXNpYmxlQ2VsbEluZGV4ZXMoKTswPGEubGVuZ3RoJiYodGhpcy5fZm9jdXNlZENlbGxJbmRleD1hW01hdGgubWF4KDAsYS5pbmRleE9mKHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXgpLTEpXSl9fSxmb2N1c0Rvd246ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5taW4odGhpcy5fZm9jdXNlZFJvd0luZGV4KzEsdGhpcy5jaGlsZHJlbi5sZW5ndGgtMSl9LF92aXNpYmxlQ2VsbEluZGV4ZXM6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLl9mb2N1c2VkUm93JiZ0aGlzLl9mb2N1c2VkUm93LmNoaWxkcmVuKXtmb3IodmFyIGM9dGhpcy5fZm9jdXNlZFJvdy5jaGlsZHJlbixkPTA7ZDxjLmxlbmd0aDtkKyspY1tkXS5oaWRkZW58fGNbZF09PT10aGlzLl9mb2N1c2VkUm93Ll9yb3dEZXRhaWxzQ2VsbHx8YS5wdXNoKGQpO2Euc29ydChmdW5jdGlvbihmLGcpe3JldHVybiBjW2ZdLmNvbHVtbi5fb3JkZXI8Y1tnXS5jb2x1bW4uX29yZGVyPy0xOjF9KX1yZXR1cm4gYX0sCmZvY3VzUGFnZURvd246ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5taW4odGhpcy5fZm9jdXNlZFJvd0luZGV4KzEwLHRoaXMuY2hpbGRyZW4ubGVuZ3RoLTEpfSxmb2N1c1BhZ2VVcDpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD1NYXRoLm1heCgwLHRoaXMuX2ZvY3VzZWRSb3dJbmRleC0xMCl9LGZvY3VzUmlnaHQ6ZnVuY3Rpb24oKXtpZighdGhpcy5fZm9jdXNlZENlbGwuaGFzQXR0cmlidXRlKCJkZXRhaWxzY2VsbCIpKXt2YXIgYT10aGlzLl92aXNpYmxlQ2VsbEluZGV4ZXMoKTswPGEubGVuZ3RoJiYodGhpcy5fZm9jdXNlZENlbGxJbmRleD1hW01hdGgubWluKGEuaW5kZXhPZih0aGlzLl9mb2N1c2VkQ2VsbEluZGV4KSsxLGEubGVuZ3RoLTEpXSl9fSxmb2N1c1VwOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PU1hdGgubWF4KDAsdGhpcy5fZm9jdXNlZFJvd0luZGV4LTEpfSxmb2N1c0hvbWU6ZnVuY3Rpb24oKXtpZighdGhpcy5fZm9jdXNlZENlbGwuaGFzQXR0cmlidXRlKCJkZXRhaWxzY2VsbCIpKXt2YXIgYT0KdGhpcy5fdmlzaWJsZUNlbGxJbmRleGVzKCk7MDxhLmxlbmd0aCYmKHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXg9YVswXSl9fSxmb2N1c0VuZDpmdW5jdGlvbigpe2lmKCF0aGlzLl9mb2N1c2VkQ2VsbC5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIikpe3ZhciBhPXRoaXMuX3Zpc2libGVDZWxsSW5kZXhlcygpOzA8YS5sZW5ndGgmJih0aGlzLl9mb2N1c2VkQ2VsbEluZGV4PWFbYS5sZW5ndGgtMV0pfX0sZm9jdXNGaXJzdDpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD0wO3RoaXMuZm9jdXNIb21lKCl9LGZvY3VzTGFzdDpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD10aGlzLmNoaWxkcmVuLmxlbmd0aC0xO3RoaXMuZm9jdXNFbmQoKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlci1mb290ZXIuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYT17cHJvcGVydGllczp7Y29sdW1uVHJlZTpBcnJheSx0YXJnZXQ6T2JqZWN0LF9yb3dzOkFycmF5fSxvYnNlcnZlcnM6WyJfY29sdW1uVHJlZUNoYW5nZWQoY29sdW1uVHJlZSwgdGFyZ2V0KSIsIl9yb3dzQ2hhbmdlZChfcm93cykiXSxfY29sdW1uVHJlZUNoYW5nZWQ6ZnVuY3Rpb24oYyxkKXtpZih2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kKXt0aGlzLl9yb3dzJiZ0aGlzLl9yb3dzLmZvckVhY2goZnVuY3Rpb24oayl7UG9seW1lci5kb20oaykuaW5uZXJIVE1MPSIifSk7Zm9yKHZhciBmPVtdLGc9MDtnPGMubGVuZ3RoO2crKyl7dmFyIGw9dGhpcy5fY3JlYXRlUm93KCk7bC50YXJnZXQ9ZDtsLl9pc0NvbHVtblJvdz1nPT1jLmxlbmd0aC0xO2wuY29sdW1ucz1jW2ddO2YucHVzaChsKX10aGlzLl9yb3dzPSJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXIiPT09dGhpcy5sb2NhbE5hbWU/ZjpmLnJldmVyc2UoKX19LF9yb3dzQ2hhbmdlZDpmdW5jdGlvbihjKXtQb2x5bWVyLmRvbSh0aGlzKS5pbm5lckhUTUw9CiIiO2MuZm9yRWFjaChmdW5jdGlvbihkKXtQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZChkKX0uYmluZCh0aGlzKSl9fTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIixiZWhhdmlvcnM6W2EsdmFhZGluLmVsZW1lbnRzLmdyaWQuRm9jdXNhYmxlQ2VsbENvbnRhaW5lckJlaGF2aW9yXSxfY3JlYXRlUm93OmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlci1yb3ciKX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtYm9keSIsYmVoYXZpb3JzOlt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Gb2N1c2FibGVDZWxsQ29udGFpbmVyQmVoYXZpb3JdLG9ic2VydmVyczpbIl9hbm5vdW5jZUZvY3VzZWRSb3coX2ZvY3VzZWRSb3cpIl0sX2Fubm91bmNlRm9jdXNlZFJvdzpmdW5jdGlvbihjKXt0aGlzLmZpcmUoImlyb24tYW5ub3VuY2UiLHt0ZXh0OiJSb3cgIisoYy5pbmRleCsxKSsiIG9mICIrCnRoaXMuZG9tSG9zdC5zaXplfSl9LF9tb3ZlRm9jdXNUb0RldGFpbHNDZWxsOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZENlbGwuZm9jdXNlZD0hMTt0aGlzLl9mb2N1c2VkUm93Ll9yb3dEZXRhaWxzQ2VsbC5mb2N1c2VkPSEwO3RoaXMuX2ZvY3VzZWRDZWxsPXRoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsfSxfZm9jdXNlZFJvd0hhc0RldGFpbHNDZWxsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZvY3VzZWRSb3cmJnRoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsJiZ0aGlzLl9mb2N1c2VkQ2VsbCE9PXRoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsfSxmb2N1c0Rvd246ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SGFzRGV0YWlsc0NlbGwoKT90aGlzLl9tb3ZlRm9jdXNUb0RldGFpbHNDZWxsKCk6dGhpcy5fZm9jdXNlZFJvd0luZGV4PU1hdGgubWluKHRoaXMuX2ZvY3VzZWRSb3dJbmRleCsxLHRoaXMuZG9tSG9zdC5zaXplLTEpfSxmb2N1c1VwOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvdyYmCnRoaXMuX2ZvY3VzZWRDZWxsPT09dGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGw/dGhpcy5fZm9jdXNlZENlbGxDaGFuZ2VkKHRoaXMuX2ZvY3VzZWRSb3dJbmRleCx0aGlzLl9mb2N1c2VkQ2VsbEluZGV4KToodGhpcy5fZm9jdXNlZFJvd0luZGV4PU1hdGgubWF4KDAsdGhpcy5fZm9jdXNlZFJvd0luZGV4LTEpLHRoaXMuX2ZvY3VzZWRSb3dIYXNEZXRhaWxzQ2VsbCgpJiZ0aGlzLl9tb3ZlRm9jdXNUb0RldGFpbHNDZWxsKCkpfSxmb2N1c0xhc3Q6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SW5kZXg9dGhpcy5kb21Ib3N0LnNpemUtMTt0aGlzLmZvY3VzRW5kKCl9LF9mb2N1c2VkQ2VsbENoYW5nZWQ6ZnVuY3Rpb24oYyxkKXt2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKFBvbHltZXIuZG9tKHRoaXMpLmNoaWxkcmVuLGZ1bmN0aW9uKGYpe2YuZm9jdXNlZD1mLmluZGV4PT09YztmLmluZGV4PT09YyYmKHRoaXMuX2ZvY3VzZWRSb3c9CmYsdGhpcy5fZm9jdXNlZENlbGw9Zi5jaGlsZHJlbltkXSk7Zi5pdGVyYXRlQ2VsbHMoZnVuY3Rpb24oZyxsKXtnLmZvY3VzZWQ9bD09PWR9KX0uYmluZCh0aGlzKSl9fSk7UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciIsYmVoYXZpb3JzOlthLHZhYWRpbi5lbGVtZW50cy5ncmlkLkZvY3VzYWJsZUNlbGxDb250YWluZXJCZWhhdmlvcl0sX2NyZWF0ZVJvdzpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXItcm93Iil9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLWZvY3VzLXRyYXAuaHRtbC5qcwpQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtZm9jdXMtdHJhcCIsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImdyaWRjZWxsIn0scHJvcGVydGllczp7YWN0aXZlVGFyZ2V0Ont0eXBlOlN0cmluZyxvYnNlcnZlcjoiX2FjdGl2ZVRhcmdldENoYW5nZWQifX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9wcmltYXJ5PVBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvcigiLnByaW1hcnkiKTt0aGlzLl9zZWNvbmRhcnk9UG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yKCIuc2Vjb25kYXJ5Iik7aWYoUG9seW1lci5TZXR0aW5ncy51c2VOYXRpdmVTaGFkb3d8fFBvbHltZXIuU2V0dGluZ3MudXNlU2hhZG93KVBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKHRoaXMuX3NlY29uZGFyeSksUG9seW1lci5kb20odGhpcykuYXBwZW5kQ2hpbGQodGhpcy5fcHJpbWFyeSl9LGZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZCE9PXRoaXMuX3ByaW1hcnk/dGhpcy5fcHJpbWFyeS5mb2N1cygpOgp0aGlzLl9zZWNvbmRhcnkuZm9jdXMoKX0sX29uQmFpdEZvY3VzOmZ1bmN0aW9uKGEpe3RoaXMuX2ZvY3VzZWQ9YS50YXJnZXQ7dGhpcy5fbW92aW5nRm9jdXNJbnRlcm5hbGx5fHwodGhpcy5maXJlKCJmb2N1cy1nYWluZWQiKSx0aGlzLl9wcmltYXJ5LnRhYkluZGV4PS0xKX0sX29uQmFpdEJsdXI6ZnVuY3Rpb24oKXt0aGlzLl9tb3ZpbmdGb2N1c0ludGVybmFsbHl8fCh0aGlzLmZpcmUoImZvY3VzLWxvc3QiKSx0aGlzLl9wcmltYXJ5LnRhYkluZGV4PTApfSxfYWN0aXZlVGFyZ2V0Q2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLl9tb3ZpbmdGb2N1c0ludGVybmFsbHk9ITA7dGhpcy5fZm9jdXNlZD09PXRoaXMuX3ByaW1hcnk/KHRoaXMuX3NlY29uZGFyeS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsYSksdGhpcy5fc2Vjb25kYXJ5LmZvY3VzKCkpOih0aGlzLl9wcmltYXJ5LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5IixhKSx0aGlzLl9wcmltYXJ5LmZvY3VzKCkpOwp0aGlzLl9tb3ZpbmdGb2N1c0ludGVybmFsbHk9ITF9LF9yZWFubm91bmNlOmZ1bmN0aW9uKCl7dGhpcy5fbW92aW5nRm9jdXNJbnRlcm5hbGx5PSEwO3RoaXMuX2ZvY3VzZWQ9PT10aGlzLl9wcmltYXJ5Pyh0aGlzLl9zZWNvbmRhcnkuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsbGVkYnkiLHRoaXMuYWN0aXZlVGFyZ2V0KSx0aGlzLl9zZWNvbmRhcnkuZm9jdXMoKSk6KHRoaXMuX3ByaW1hcnkuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsbGVkYnkiLHRoaXMuYWN0aXZlVGFyZ2V0KSx0aGlzLl9wcmltYXJ5LmZvY3VzKCkpO3RoaXMuX21vdmluZ0ZvY3VzSW50ZXJuYWxseT0hMX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC10YWJsZS1yb3cuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYT17cHJvcGVydGllczp7YWN0aXZlOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExfSxjb2x1bW5zOkFycmF5LGluZGV4Ok51bWJlcixjZWxsczp7dmFsdWU6W119LHRhcmdldDpPYmplY3QsZXhwYW5kZWQ6e3ZhbHVlOiExfSxmb2N1c2VkOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSxpdGVtOk9iamVjdCxzZWxlY3RlZDp7cmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfcm93RGV0YWlsc0NlbGw6T2JqZWN0LHJvd0RldGFpbHNUZW1wbGF0ZTpPYmplY3R9LG9ic2VydmVyczoiX2NvbHVtbnNDaGFuZ2VkKGNvbHVtbnMsIHRhcmdldCk7X2luZGV4Q2hhbmdlZChpbmRleCwgY2VsbHMpO19pdGVtQ2hhbmdlZChpdGVtLCBjZWxscyk7X2l0ZW1DaGFuZ2VkRm9yRGV0YWlscyhpdGVtLCBfcm93RGV0YWlsc0NlbGwpO19yb3dEZXRhaWxzQ2hhbmdlZChleHBhbmRlZCwgcm93RGV0YWlsc1RlbXBsYXRlLCB0YXJnZXQpO19yb3dEZXRhaWxzQ2VsbEluZGV4Q2hhbmdlZChfcm93RGV0YWlsc0NlbGwsIGluZGV4KTtfcm93RGV0YWlsc0NlbGxDaGFuZ2VkKF9yb3dEZXRhaWxzQ2VsbCwgdGFyZ2V0KTtfc2VsZWN0ZWRDaGFuZ2VkKHNlbGVjdGVkLCBjZWxscyk7X3NlbGVjdGVkQ2hhbmdlZEZvckRldGFpbHMoc2VsZWN0ZWQsIF9yb3dEZXRhaWxzQ2VsbCkiLnNwbGl0KCI7IiksCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5jbGFzc0xpc3QuYWRkKCJ2YWFkaW4tZ3JpZC1yb3ciKTshMT09PVBvbHltZXIuU2V0dGluZ3MudXNlU2hhZG93JiYodGhpcy5jbGFzc0xpc3QuYWRkKCJzdHlsZS1zY29wZSIpLHRoaXMuY2xhc3NMaXN0LmFkZCgidmFhZGluLWdyaWQiKSl9LGl0ZXJhdGVDZWxsczpmdW5jdGlvbihjKXt0aGlzLmNlbGxzLmZvckVhY2goYyk7dGhpcy5fcm93RGV0YWlsc0NlbGwmJmModGhpcy5fcm93RGV0YWlsc0NlbGwpfSxfcm93RGV0YWlsc0NoYW5nZWQ6ZnVuY3Rpb24oYyxkLGYpe2lmKHZvaWQgMCE9PWMmJnZvaWQgMCE9PWQmJnZvaWQgMCE9PWYpe2lmKGMpe3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLXRhYmxlLWNlbGwiKTtnLnNldEF0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiLCEwKTtnLmZyb3plbj0hMDtnLnRhcmdldD1mO2cudGVtcGxhdGU9ZDtnLnRvZ2dsZUF0dHJpYnV0ZSgibGFzdGNvbHVtbiIsITApO1BvbHltZXIuZG9tKHRoaXMucm9vdCkuYXBwZW5kQ2hpbGQoZyk7ClBvbHltZXIuZG9tLmZsdXNoKCk7dGhpcy5fcm93RGV0YWlsc0NlbGw9Z31lbHNlIHRoaXMuX3Jvd0RldGFpbHNDZWxsJiYoUG9seW1lci5kb20odGhpcy5yb290KS5yZW1vdmVDaGlsZCh0aGlzLl9yb3dEZXRhaWxzQ2VsbCksdGhpcy5fcm93RGV0YWlsc0NlbGw9bnVsbCk7dGhpcy5pdGVyYXRlQ2VsbHMoZnVuY3Rpb24obCl7bC5leHBhbmRlZD1jfSk7dGhpcy50YXJnZXQuJC5zY3JvbGxlci5fZnJvemVuQ2VsbHNDaGFuZ2VkKCl9fSxfdXBkYXRlUm93VmlzaWJpbGl0eTpmdW5jdGlvbigpe3RoaXMuaGlkZGVuPXRoaXMuY2VsbHMuZXZlcnkoZnVuY3Rpb24oYyl7cmV0dXJuIGMuX2lzRW1wdHl9KX0sX3Jvd0RldGFpbHNDZWxsQ2hhbmdlZDpmdW5jdGlvbihjLGQpe3ZvaWQgMCE9PWMmJnZvaWQgMCE9PWQmJmQuJC5zY3JvbGxlci5fdXBkYXRlKCl9LF9yb3dEZXRhaWxzQ2VsbEluZGV4Q2hhbmdlZDpmdW5jdGlvbihjLGQpe3ZvaWQgMCE9PWMmJnZvaWQgMCE9PWQmJihjPyhjLmluZGV4PQpkLFBvbHltZXIuZG9tLmZsdXNoKCksdGhpcy51cGRhdGVSb3dEZXRhaWxzQ2VsbE1ldHJpY3MoKSk6dGhpcy5zdHlsZS5wYWRkaW5nQm90dG9tPSIiKX0sdXBkYXRlUm93RGV0YWlsc0NlbGxNZXRyaWNzOmZ1bmN0aW9uKCl7dGhpcy5fcm93RGV0YWlsc0NlbGwmJih0aGlzLnRhcmdldCYmdGhpcy50YXJnZXQuX29ic2VydmVyJiZ0aGlzLnRhcmdldC5fb2JzZXJ2ZXIuZmx1c2gmJnRoaXMudGFyZ2V0Ll9vYnNlcnZlci5mbHVzaCgpLHRoaXMuX3Jvd0RldGFpbHNDZWxsLnN0eWxlLmhlaWdodD0iIix0aGlzLnN0eWxlLnBhZGRpbmdCb3R0b209dGhpcy5fcm93RGV0YWlsc0NlbGwuc3R5bGUuaGVpZ2h0PXRoaXMuX3Jvd0RldGFpbHNDZWxsLmNsaWVudEhlaWdodCsicHgiKX0sX2NvbHVtbnNDaGFuZ2VkOmZ1bmN0aW9uKGMsZCl7aWYodm9pZCAwIT09YyYmdm9pZCAwIT09ZCl7UG9seW1lci5kb20odGhpcykuaW5uZXJIVE1MPSIiO3ZhciBmPVtdO2MuZm9yRWFjaChmdW5jdGlvbihnKXt2YXIgbD0KIl8iK3RoaXMuaXMucmVwbGFjZSgvLS9nLCJfIikrIl9jZWxscyI7bD1nW2xdPWdbbF18fFtdO3ZhciBrPWwuZmlsdGVyKGZ1bmN0aW9uKHApe3JldHVybiFQb2x5bWVyLmRvbShwKS5wYXJlbnROb2RlfSlbMF07aWYoIWspe2s9dGhpcy5fY3JlYXRlQ2VsbCgpO3ZhciBuPUFycmF5LnByb3RvdHlwZS5zb21lLmNhbGwodGhpcy50YXJnZXQucXVlcnlTZWxlY3RvckFsbCgiZG9tLXJlcGVhdCIpLGZ1bmN0aW9uKHApe3JldHVybiFwLnJlc3RhbXB9KTsobj1ufHwidmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLXJvdyI9PT10aGlzLmlzfHwidmFhZGluLWdyaWQtdGFibGUtZm9vdGVyLXJvdyI9PT10aGlzLmlzKXx8bC5wdXNoKGspfWsuaW5kZXg9dGhpcy5pbmRleDtrLnRhcmdldD10aGlzLnRhcmdldDtrLl9pc0NvbHVtblJvdz10aGlzLl9pc0NvbHVtblJvdztrLmNvbHVtbj1nO2suZXhwYW5kZWQ9dGhpcy5leHBhbmRlZDtQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZChrKTtmLnB1c2goayl9LmJpbmQodGhpcykpOwp0aGlzLmNlbGxzPWZ9fSxfaW5kZXhDaGFuZ2VkOmZ1bmN0aW9uKGMsZCl7dm9pZCAwIT09YyYmdm9pZCAwIT09ZCYmZC5mb3JFYWNoKGZ1bmN0aW9uKGYpe2YuaW5kZXg9Y30pfSxfaXRlbUNoYW5nZWQ6ZnVuY3Rpb24oYyxkKXt2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kJiZkLmZvckVhY2goZnVuY3Rpb24oZil7Zi5pdGVtPWN9KX0sX2l0ZW1DaGFuZ2VkRm9yRGV0YWlsczpmdW5jdGlvbihjLGQpe3ZvaWQgMCE9PWMmJnZvaWQgMCE9PWQmJmQmJihkLml0ZW09Yyl9LF9zZWxlY3RlZENoYW5nZWQ6ZnVuY3Rpb24oYyxkKXt2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kJiZkLmZvckVhY2goZnVuY3Rpb24oZil7Zi5zZWxlY3RlZD1jfSl9LF9zZWxlY3RlZENoYW5nZWRGb3JEZXRhaWxzOmZ1bmN0aW9uKGMsZCl7dm9pZCAwIT09YyYmdm9pZCAwIT09ZCYmZCYmKGQuc2VsZWN0ZWQ9Yyl9LHVwZGF0ZUxhc3RDb2x1bW46ZnVuY3Rpb24oKXt0aGlzLmNlbGxzLnNsaWNlKDApLnNvcnQoZnVuY3Rpb24oYywKZCl7cmV0dXJuIGMuY29sdW1uLl9vcmRlci1kLmNvbHVtbi5fb3JkZXJ9KS5mb3JFYWNoKGZ1bmN0aW9uKGMsZCxmKXtjLnRvZ2dsZUF0dHJpYnV0ZSgibGFzdGNvbHVtbiIsZD09PWYubGVuZ3RoLTEpfSl9fTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtcm93IixiZWhhdmlvcnM6W2FdLF9jcmVhdGVDZWxsOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLXRhYmxlLWNlbGwiKX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLXJvdyIsYmVoYXZpb3JzOlthXSxvYnNlcnZlcnM6WyJfdXBkYXRlUm93VmlzaWJpbGl0eShjb2x1bW5zKSJdLGxpc3RlbmVyczp7ImNlbGwtZW1wdHktY2hhbmdlZCI6Il91cGRhdGVSb3dWaXNpYmlsaXR5In0sX2NyZWF0ZUNlbGw6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLWNlbGwiKX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtZm9vdGVyLXJvdyIsCmJlaGF2aW9yczpbYV0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZVJvd1Zpc2liaWxpdHkoY29sdW1ucykiXSxsaXN0ZW5lcnM6eyJjZWxsLWVtcHR5LWNoYW5nZWQiOiJfdXBkYXRlUm93VmlzaWJpbGl0eSJ9LF9jcmVhdGVDZWxsOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1jZWxsIil9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRlbXBsYXRpemVyLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307dmFhZGluLmVsZW1lbnRzLmdyaWQuVGVtcGxhdGl6ZXI9ZnVuY3Rpb24oKXt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5UZW1wbGF0aXplcj1Qb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGVtcGxhdGl6ZXIiLGJlaGF2aW9yczpbUG9seW1lci5UZW1wbGF0aXplcl0scHJvcGVydGllczp7ZGF0YUhvc3Q6T2JqZWN0LHRlbXBsYXRlOk9iamVjdCxfdGVtcGxhdGVJbnN0YW5jZXM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LF9wYXJlbnRQYXRoVmFsdWVzOnt2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX19LG9ic2VydmVyczpbIl90ZW1wbGF0ZUluc3RhbmNlc0NoYW5nZWQoX3RlbXBsYXRlSW5zdGFuY2VzLiosIF9wYXJlbnRQYXRoVmFsdWVzLiopIl0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX3BhcmVudE1vZGVsPSEwO3RoaXMuX2luc3RhbmNlUHJvcHM9e2V4cGFuZGVkOiEwLGluZGV4OiEwLGl0ZW06ITAsc2VsZWN0ZWQ6ITB9fSxjcmVhdGVJbnN0YW5jZTpmdW5jdGlvbigpe3RoaXMuX2Vuc3VyZVRlbXBsYXRpemVkKCk7dmFyIGE9dGhpcy5zdGFtcCh7fSk7CnRoaXMuYWRkSW5zdGFuY2UoYSk7cmV0dXJuIGF9LGFkZEluc3RhbmNlOmZ1bmN0aW9uKGEpey0xPT09dGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMuaW5kZXhPZihhKSYmdGhpcy5wdXNoKCJfdGVtcGxhdGVJbnN0YW5jZXMiLGEpfSxyZW1vdmVJbnN0YW5jZTpmdW5jdGlvbihhKXt0aGlzLnNwbGljZSgiX3RlbXBsYXRlSW5zdGFuY2VzIix0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5pbmRleE9mKGEpLDEpfSxfZW5zdXJlVGVtcGxhdGl6ZWQ6ZnVuY3Rpb24oKXt0aGlzLnRlbXBsYXRlLl90ZW1wbGF0aXplZHx8KHRoaXMudGVtcGxhdGUuX3RlbXBsYXRpemVkPSEwLHRoaXMudGVtcGxhdGl6ZSh0aGlzLnRlbXBsYXRlKSx0aGlzLl9wYXJlbnRQcm9wcz10aGlzLl9wYXJlbnRQcm9wc3x8e30sUG9seW1lci5FbGVtZW50fHxPYmplY3Qua2V5cyh0aGlzLl9wYXJlbnRQcm9wcykuZm9yRWFjaChmdW5jdGlvbigpe30sdGhpcykpfSxfZm9yd2FyZEluc3RhbmNlUHJvcDpmdW5jdGlvbihhLGMsZCl7dm9pZCAwIT09CmFbIl9fIitjKyJfXyJdJiZhWyJfXyIrYysiX18iXSE9PWQmJnRoaXMuZmlyZSgidGVtcGxhdGUtaW5zdGFuY2UtY2hhbmdlZCIse3Byb3A6Yyx2YWx1ZTpkLGluc3Q6YX0pfSxfZm9yd2FyZEluc3RhbmNlUGF0aDpmdW5jdGlvbihhLGMsZCl7MCE9PWMuaW5kZXhPZigiaXRlbS4iKXx8dGhpcy5fc3VwcHJlc3NJdGVtQ2hhbmdlRXZlbnR8fHRoaXMuZmlyZSgiaXRlbS1jaGFuZ2VkIix7aXRlbTphLml0ZW0scGF0aDpjLnN1YnN0cmluZyg1KSx2YWx1ZTpkfSl9LF9ub3RpZnlJbnN0YW5jZVByb3BWMjpmdW5jdGlvbihhLGMsZCl7dGhpcy5fZm9yd2FyZEluc3RhbmNlUHJvcChhLGMsZCk7dGhpcy5fZm9yd2FyZEluc3RhbmNlUGF0aChhLGMsZCl9LF9mb3J3YXJkUGFyZW50UHJvcDpmdW5jdGlvbihhLGMpe3RoaXMuX3BhcmVudFBhdGhWYWx1ZXNbYV09Yzt0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5mb3JFYWNoKGZ1bmN0aW9uKGQpe2Quc2V0KGEsYyl9LHRoaXMpfSxfZm9yd2FyZFBhcmVudFBhdGg6ZnVuY3Rpb24oYSwKYyl7dGhpcy5zZXQoWyJfcGFyZW50UGF0aFZhbHVlcyIsYV0sYyk7dGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbihkKXtkLm5vdGlmeVBhdGgoYSxjKX0sdGhpcyl9LF9mb3J3YXJkSG9zdFByb3BWMjpmdW5jdGlvbihhLGMpe3RoaXMuX2ZvcndhcmRQYXJlbnRQcm9wKGEsYyk7dGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMmJnRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmZvckVhY2goZnVuY3Rpb24oZCl7ZC5ub3RpZnlQYXRoKGEsYyl9LHRoaXMpfSxfdGVtcGxhdGVJbnN0YW5jZXNDaGFuZ2VkOmZ1bmN0aW9uKGEpe2lmKCJfdGVtcGxhdGVJbnN0YW5jZXMiPT09YS5wYXRoKXt2YXIgYz0wO3ZhciBkPXRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmxlbmd0aH1lbHNlIGlmKCJfdGVtcGxhdGVJbnN0YW5jZXMuc3BsaWNlcyI9PT1hLnBhdGgpYz1hLnZhbHVlLmluZGV4LGQ9YS52YWx1ZS5hZGRlZENvdW50O2Vsc2UgcmV0dXJuO09iamVjdC5rZXlzKHRoaXMuX3BhcmVudFBhdGhWYWx1ZXN8fAp7fSkuZm9yRWFjaChmdW5jdGlvbihmKXtmb3IodmFyIGc9YztnPGMrZDtnKyspdGhpcy5fdGVtcGxhdGVJbnN0YW5jZXNbZ10uc2V0KGYsdGhpcy5fcGFyZW50UGF0aFZhbHVlc1tmXSl9LHRoaXMpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXJvdy1kZXRhaWxzLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLlJvd0RldGFpbHNCZWhhdmlvcj17cHJvcGVydGllczp7ZXhwYW5kZWRJdGVtczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LGxpc3RlbmVyczp7InRlbXBsYXRlLWluc3RhbmNlLWNoYW5nZWQiOiJfdGVtcGxhdGVJbnN0YW5jZUNoYW5nZWRFeHBhbmRlZCJ9LG9ic2VydmVyczpbIl9leHBhbmRlZEl0ZW1zQ2hhbmdlZChleHBhbmRlZEl0ZW1zLiosIGRhdGFQcm92aWRlcikiLCJfcm93RGV0YWlsc1RlbXBsYXRlQ2hhbmdlZChfcm93RGV0YWlsc1RlbXBsYXRlKSJdLF9leHBhbmRlZEl0ZW1zQ2hhbmdlZDpmdW5jdGlvbihhLGMpe3ZvaWQgMCE9PWEmJnZvaWQgMCE9PWMmJih0aGlzLl9mbHVzaEl0ZW1zRGVib3VuY2VyKCksdGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEl0ZW1zJiZ0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMuZm9yRWFjaChmdW5jdGlvbihkKXtkLmV4cGFuZGVkPXRoaXMuX2lzRXhwYW5kZWQoZC5pdGVtKX0uYmluZCh0aGlzKSkpfSwKX3Jvd0RldGFpbHNUZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYSl7dmFyIGM9bmV3IHZhYWRpbi5lbGVtZW50cy5ncmlkLlRlbXBsYXRpemVyO2MuZGF0YUhvc3Q9dGhpcy5kYXRhSG9zdDtjLl9pbnN0YW5jZVByb3BzPXtleHBhbmRlZDohMCxpbmRleDohMCxpdGVtOiEwLHNlbGVjdGVkOiEwfTtQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLmFwcGVuZENoaWxkKGMpO2MudGVtcGxhdGU9YTthLnRlbXBsYXRpemVyPWN9LF9pc0V4cGFuZGVkOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmV4cGFuZGVkSXRlbXMmJi0xIT09dGhpcy5leHBhbmRlZEl0ZW1zLmluZGV4T2YoYSl9LGV4cGFuZEl0ZW06ZnVuY3Rpb24oYSl7dGhpcy5faXNFeHBhbmRlZChhKXx8dGhpcy5wdXNoKCJleHBhbmRlZEl0ZW1zIixhKX0sY29sbGFwc2VJdGVtOmZ1bmN0aW9uKGEpe3RoaXMuX2lzRXhwYW5kZWQoYSkmJnRoaXMuc3BsaWNlKCJleHBhbmRlZEl0ZW1zIix0aGlzLmV4cGFuZGVkSXRlbXMuaW5kZXhPZihhKSwxKX0sCl90ZW1wbGF0ZUluc3RhbmNlQ2hhbmdlZEV4cGFuZGVkOmZ1bmN0aW9uKGEpeyJleHBhbmRlZCI9PT1hLmRldGFpbC5wcm9wJiYoYS5kZXRhaWwudmFsdWU/dGhpcy5leHBhbmRJdGVtKGEuZGV0YWlsLmluc3QuaXRlbSk6dGhpcy5jb2xsYXBzZUl0ZW0oYS5kZXRhaWwuaW5zdC5pdGVtKSxhLnN0b3BQcm9wYWdhdGlvbigpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWRhdGEtcHJvdmlkZXItYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuRGF0YVByb3ZpZGVyQmVoYXZpb3I9e2xpc3RlbmVyczp7Iml0ZW0tY2hhbmdlZCI6Il90ZW1wbGF0ZUl0ZW1DaGFuZ2VkIn0scHJvcGVydGllczp7cGFnZVNpemU6e3R5cGU6TnVtYmVyLHZhbHVlOjUwLG9ic2VydmVyOiJfcGFnZVNpemVDaGFuZ2VkIn0sZGF0YVByb3ZpZGVyOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9kYXRhUHJvdmlkZXJDaGFuZ2VkIn0sX2xvYWRpbmc6Qm9vbGVhbixfY2FjaGU6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fSxfcGVuZGluZ1JlcXVlc3RzOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX19LF90ZW1wbGF0ZUl0ZW1DaGFuZ2VkOmZ1bmN0aW9uKGEpe3ZhciBjPWEuZGV0YWlsLml0ZW07QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChQb2x5bWVyLmRvbSh0aGlzLiQuaXRlbXMpLmNoaWxkcmVuLGZ1bmN0aW9uKGQpe2QuaXRlbT09PWMmJmQuaXRlcmF0ZUNlbGxzKGZ1bmN0aW9uKGYpe2YuX3RlbXBsYXRpemVyLl9zdXBwcmVzc0l0ZW1DaGFuZ2VFdmVudD0KITA7Zi5pbnN0YW5jZS5ub3RpZnlQYXRoKCJpdGVtLiIrYS5kZXRhaWwucGF0aCxhLmRldGFpbC52YWx1ZSk7Zi5fdGVtcGxhdGl6ZXIuX3N1cHByZXNzSXRlbUNoYW5nZUV2ZW50PSExfSl9KX0sX2dldENhY2hlZEl0ZW06ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fZ2V0UGFnZUZvckluZGV4KGEpLGQ9dGhpcy5fY2FjaGUmJnRoaXMuX2NhY2hlW2NdO3JldHVybiBkP2RbYS1jKnRoaXMucGFnZVNpemVdOm51bGx9LF9nZXRJdGVtOmZ1bmN0aW9uKGEsYyl7dGhpcy5fdXBkYXRlSXRlbShjLHRoaXMuX2dldENhY2hlZEl0ZW0oYSkpO3RoaXMuX2VhZ2VybHlMb2FkUGFnZXMoKTt2YXIgZD10aGlzLl91bmNhY2hlZFBhZ2VzRm9yUGh5c2ljYWxJdGVtcygpOzA8ZC5sZW5ndGgmJih0aGlzLl9sb2FkaW5nPSEwLHRoaXMuZGVib3VuY2UoImxvYWQiLGZ1bmN0aW9uKCl7ZC5mb3JFYWNoKGZ1bmN0aW9uKGYpe3RoaXMuX2xvYWRQYWdlKGYpfS5iaW5kKHRoaXMpKX0sMTAwKSl9LF9jYWNoZWRQYWdlc0ZvclBoeXNpY2FsSXRlbXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFnZXNGb3JQaHlzaWNhbEl0ZW1zKCkuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDAhPT0KdGhpcy5fY2FjaGUmJnZvaWQgMCE9PXRoaXMuX2NhY2hlW2FdfS5iaW5kKHRoaXMpKX0sX3VuY2FjaGVkUGFnZXNGb3JQaHlzaWNhbEl0ZW1zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhZ2VzRm9yUGh5c2ljYWxJdGVtcygpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fY2FjaGUmJnZvaWQgMD09PXRoaXMuX2NhY2hlW2FdfS5iaW5kKHRoaXMpKX0sX2VhZ2VybHlMb2FkUGFnZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9jYWNoZWRQYWdlc0ZvclBoeXNpY2FsSXRlbXMoKS5zbGljZSgwKTtpZigwPGEubGVuZ3RoKXthLnNvcnQoZnVuY3Rpb24oZCxmKXtyZXR1cm4gZD5mfSk7dmFyIGM9TWF0aC5taW4oYVthLmxlbmd0aC0xXSsxLE1hdGgubWF4KDAsTWF0aC5mbG9vcih0aGlzLnNpemUvdGhpcy5wYWdlU2l6ZSktMSkpO3RoaXMuX2xvYWRQYWdlKE1hdGgubWF4KDAsYVswXS0xKSk7dGhpcy5fbG9hZFBhZ2UoYyl9fSxfcGFnZXNGb3JQaHlzaWNhbEl0ZW1zOmZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMuX2dldFBhZ2VGb3JJbmRleCh0aGlzLiQuc2Nyb2xsZXIuZmlyc3RWaXNpYmxlSW5kZXgrCnRoaXMuJC5zY3JvbGxlci5fdmlkeE9mZnNldCldLmNvbmNhdCh0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLmluZGV4fSkubWFwKGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9nZXRQYWdlRm9ySW5kZXgoYS5pbmRleCl9LmJpbmQodGhpcykpKS5yZWR1Y2UoZnVuY3Rpb24oYSxjKXstMT09PWEuaW5kZXhPZihjKSYmYS5wdXNoKGMpO3JldHVybiBhfSxbXSl9LF91cGRhdGVJdGVtczpmdW5jdGlvbihhLGMpe2Zvcih2YXIgZD0wO2Q8dGhpcy5wYWdlU2l6ZTtkKyspe3ZhciBmPXRoaXMuJC5zY3JvbGxlci5fdmlydHVhbEluZGV4VG9JdGVtW2EqdGhpcy5wYWdlU2l6ZStkXTtmJiYodGhpcy5fdXBkYXRlSXRlbShmLGNbZF0pLHRoaXMuZGVib3VuY2UoInVwZGF0ZS1oZWlnaHRzIixmdW5jdGlvbigpe3RoaXMuJC5zY3JvbGxlci5fdXBkYXRlTWV0cmljcygpO3RoaXMuJC5zY3JvbGxlci5fcG9zaXRpb25JdGVtcygpO3RoaXMuJC5zY3JvbGxlci5fdXBkYXRlU2Nyb2xsZXJTaXplKCl9LAoxKSl9fSxfbG9hZFBhZ2U6ZnVuY3Rpb24oYSxjKXtjPWN8fHRoaXMuX3VwZGF0ZUl0ZW1zLmJpbmQodGhpcyk7aWYoIXRoaXMuX2NhY2hlW2FdJiYhdGhpcy5fcGVuZGluZ1JlcXVlc3RzW2FdJiZ0aGlzLmRhdGFQcm92aWRlcil7dGhpcy5fcGVuZGluZ1JlcXVlc3RzW2FdPSEwO3ZhciBkPXtwYWdlOmEscGFnZVNpemU6dGhpcy5wYWdlU2l6ZSxzb3J0T3JkZXJzOnRoaXMuX21hcFNvcnRlcnMoKSxmaWx0ZXJzOnRoaXMuX21hcEZpbHRlcnMoKX07dGhpcy5kYXRhUHJvdmlkZXIoZCxmdW5jdGlvbihmKXt0aGlzLl9jYWNoZVthXT1mO2RlbGV0ZSB0aGlzLl9wZW5kaW5nUmVxdWVzdHNbYV07YyhhLGYpO3RoaXMuX2xvYWRpbmc9MDx0aGlzLl9wZW5kaW5nUmVxdWVzdHMubGVuZ3RoO3RoaXMuZGVib3VuY2UoImNoZWNrLXNpemUiLHRoaXMuX2NoZWNrU2l6ZSwyRTMpfS5iaW5kKHRoaXMpKX19LF9nZXRQYWdlRm9ySW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguZmxvb3IoYS90aGlzLnBhZ2VTaXplKX0sCmNsZWFyQ2FjaGU6ZnVuY3Rpb24oKXt0aGlzLl9jYWNoZT17fTt0aGlzLl9wZW5kaW5nUmVxdWVzdHM9e307dGhpcy4kLnNjcm9sbGVyLmhhc0RhdGEmJnRoaXMuJC5zY3JvbGxlci5fdXBkYXRlKCk7dGhpcy5fZmx1c2hJdGVtc0RlYm91bmNlcigpfSxfZmx1c2hJdGVtc0RlYm91bmNlcjpmdW5jdGlvbigpe3RoaXMuZmx1c2hEZWJvdW5jZXIoImxvYWQiKX0sX3BhZ2VTaXplQ2hhbmdlZDpmdW5jdGlvbihhLGMpe3ZvaWQgMCE9PWMmJmEhPT1jJiZ0aGlzLmNsZWFyQ2FjaGUoKX0sX2NoZWNrU2l6ZTpmdW5jdGlvbigpe3ZvaWQgMD09PXRoaXMuc2l6ZSYmY29uc29sZS53YXJuKCdUaGUgXHgzY3ZhYWRpbi1ncmlkXHgzZSBuZWVkcyBhIHZhbHVlIGZvciAic2l6ZSIgcHJvcGVydHkgaW4gb3JkZXIgdG8gZGlzcGxheSByb3dzLicpfSxfZGF0YVByb3ZpZGVyQ2hhbmdlZDpmdW5jdGlvbihhLGMpe3ZvaWQgMCE9PWMmJnRoaXMuY2xlYXJDYWNoZSgpO3RoaXMuJC5zY3JvbGxlci5oYXNEYXRhfHwKKHRoaXMuX2xvYWRpbmc9ITAsdGhpcy5fbG9hZFBhZ2UoMCxmdW5jdGlvbigpe3RoaXMuJC5zY3JvbGxlci5oYXNEYXRhPSEwfS5iaW5kKHRoaXMpKSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1zZWxlY3Rpb24tYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuU2VsZWN0aW9uQmVoYXZpb3I9e3Byb3BlcnRpZXM6e3NlbGVjdGVkSXRlbXM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LG9ic2VydmVyczpbIl9zZWxlY3RlZEl0ZW1zQ2hhbmdlZChzZWxlY3RlZEl0ZW1zLiopIl0sbGlzdGVuZXJzOnsidGVtcGxhdGUtaW5zdGFuY2UtY2hhbmdlZCI6Il90ZW1wbGF0ZUluc3RhbmNlQ2hhbmdlZFNlbGVjdGlvbiJ9LF90ZW1wbGF0ZUluc3RhbmNlQ2hhbmdlZFNlbGVjdGlvbjpmdW5jdGlvbihhKXtpZigic2VsZWN0ZWQiPT09YS5kZXRhaWwucHJvcCl7dmFyIGM9YS5kZXRhaWwuaW5zdC5pdGVtOyh0aGlzLl9pc1NlbGVjdGVkKGMpP3RoaXMuZGVzZWxlY3RJdGVtOnRoaXMuc2VsZWN0SXRlbSkuYmluZCh0aGlzKShjKTt0aGlzLmZpcmUoImlyb24tYW5ub3VuY2UiLHt0ZXh0Oih0aGlzLl9pc1NlbGVjdGVkKGMpPyJTZWxlY3RlZCI6IkRlc2VsZWN0ZWQiKSsiIFJvdyAiKwooYS5kZXRhaWwuaW5zdC5pbmRleCsxKSsiIG9mICIrdGhpcy5zaXplfSk7YS5zdG9wUHJvcGFnYXRpb24oKX19LF9pc1NlbGVjdGVkOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNlbGVjdGVkSXRlbXMmJi0xPHRoaXMuc2VsZWN0ZWRJdGVtcy5pbmRleE9mKGEpfSxzZWxlY3RJdGVtOmZ1bmN0aW9uKGEpe2E9dGhpcy5fdGFrZUl0ZW0oYSk7dGhpcy5faXNTZWxlY3RlZChhKXx8dGhpcy5wdXNoKCJzZWxlY3RlZEl0ZW1zIixhKX0sZGVzZWxlY3RJdGVtOmZ1bmN0aW9uKGEpe2E9dGhpcy5fdGFrZUl0ZW0oYSk7YT10aGlzLnNlbGVjdGVkSXRlbXMuaW5kZXhPZihhKTstMTxhJiZ0aGlzLnNwbGljZSgic2VsZWN0ZWRJdGVtcyIsYSwxKX0sX3RvZ2dsZUl0ZW06ZnVuY3Rpb24oYSl7YT10aGlzLl90YWtlSXRlbShhKTstMT09PXRoaXMuc2VsZWN0ZWRJdGVtcy5pbmRleE9mKGEpP3RoaXMuc2VsZWN0SXRlbShhKTp0aGlzLmRlc2VsZWN0SXRlbShhKX0sX3Rha2VJdGVtOmZ1bmN0aW9uKGEpe3JldHVybiJudW1iZXIiPT09CnR5cGVvZiBhJiYwPD1hJiZ0aGlzLml0ZW1zJiZ0aGlzLml0ZW1zLmxlbmd0aD5hP3RoaXMuaXRlbXNbYV06YX0sX3NlbGVjdGVkSXRlbXNDaGFuZ2VkOmZ1bmN0aW9uKGEpeyF0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXN8fCJzZWxlY3RlZEl0ZW1zIiE9PWEucGF0aCYmInNlbGVjdGVkSXRlbXMuc3BsaWNlcyIhPT1hLnBhdGh8fHRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGMpe2Muc2VsZWN0ZWQ9dGhpcy5faXNTZWxlY3RlZChjLml0ZW0pfS5iaW5kKHRoaXMpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWtleWJvYXJkLW5hdmlnYXRpb24tYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVLZXlib2FyZEJlaGF2aW9ySW1wbD17aG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImFwcGxpY2F0aW9uIix0YWJpbmRleDowfSxrZXlCaW5kaW5nczp7ImN0cmwraG9tZSI6Il9vbkN0cmxIb21lIiwiY3RybCtlbmQiOiJfb25DdHJsRW5kIixkb3duOiJfb25BcnJvd0Rvd24iLGVuZDoiX29uRW5kIixlbnRlcjoiX29uRW50ZXIiLGVzYzoiX29uRXNjYXBlIixmMjoiX29uRjIiLGhvbWU6Il9vbkhvbWUiLGxlZnQ6Il9vbkFycm93TGVmdCIscGFnZWRvd246Il9vblBhZ2VEb3duIixwYWdldXA6Il9vblBhZ2VVcCIscmlnaHQ6Il9vbkFycm93UmlnaHQiLHNwYWNlOiJfb25TcGFjZSIsdGFiOiJfb25UYWIiLHVwOiJfb25BcnJvd1VwIn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLnJlcXVlc3RBdmFpbGFiaWxpdHkoKX0scHJvcGVydGllczp7X3ZpcnR1YWxGb2N1czp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il92aXJ0dWFsRm9jdXNDaGFuZ2VkIn0sCmludGVyYWN0aW5nOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExfSxuYXZpZ2F0aW5nOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExfX0sbGlzdGVuZXJzOntmb2N1czoiX29uRm9jdXMiLCJjZWxsLWZvY3VzIjoiX29uQ2VsbEZvY3VzIiwiY2VsbC1jb250ZW50LWZvY3VzIjoiX29uQ2VsbENvbnRlbnRGb2N1cyJ9LHJlYWR5OmZ1bmN0aW9uKCl7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oYSl7OT09PWEua2V5Q29kZSYmKHRoaXMuX3RhYmJlZD0hMCk7OT09PWEua2V5Q29kZSYmYS5zaGlmdEtleSYmKHRoaXMuX3NoaWZ0VGFiYmVkPSEwKX0uYmluZCh0aGlzKSwhMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLGZ1bmN0aW9uKGEpezk9PT1hLmtleUNvZGUmJih0aGlzLl90YWJiZWQ9ITEpOzk9PT1hLmtleUNvZGUmJmEuc2hpZnRLZXkmJih0aGlzLl9zaGlmdFRhYmJlZD0KITEpfS5iaW5kKHRoaXMpLCEwKX0sX2lzRm9vdGVyVmlzaWJsZTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuJC5mb290ZXIuX3Jvd3MuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiFhLmhpZGRlbn0pLmxlbmd0aH0sX29uRm9jdXM6ZnVuY3Rpb24oKXt0aGlzLl90YWJiZWQmJiF0aGlzLl9zaGlmdFRhYmJlZCYmdGhpcy5fYWN0aXZhdGVOYXZpZ2F0aW9uKCl9LF9hY3RpdmF0ZU5hdmlnYXRpb246ZnVuY3Rpb24oKXt0aGlzLiQuZm9vdGVyRm9jdXNUcmFwLmZvY3VzKCl9LF9vbkZvY3Vzb3V0OmZ1bmN0aW9uKCl7dGhpcy5pbnRlcmFjdGluZz10aGlzLm5hdmlnYXRpbmc9ITF9LF9vbkZvb3RlckZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5uYXZpZ2F0aW5nPSEwO3RoaXMuaW50ZXJhY3Rpbmc9ITE7dGhpcy5fdmlydHVhbEZvY3VzPXRoaXMuX3ZpcnR1YWxGb2N1c3x8KHRoaXMuX3NoaWZ0VGFiYmVkP3RoaXMuX2lzRm9vdGVyVmlzaWJsZSgpP3RoaXMuJC5mb290ZXI6dGhpcy4kLml0ZW1zOgp0aGlzLiQuaGVhZGVyKX0sX3ZpcnR1YWxGb2N1c0NoYW5nZWQ6ZnVuY3Rpb24oYSxjKXtjJiYoYy5mb2N1c2VkPSExKTthJiYoYS5fZm9jdXNlZENlbGxJbmRleD1hLl9mb2N1c2VkQ2VsbEluZGV4fHwwLGEuX2ZvY3VzZWRSb3dJbmRleD1hLl9mb2N1c2VkUm93SW5kZXh8fDAsYS5mb2N1c2VkPSEwLGE9PT10aGlzLiQuaXRlbXMmJnRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSl9LF9vblRhYjpmdW5jdGlvbihhKXtpZighdGhpcy5pbnRlcmFjdGluZyYmdGhpcy5fdmlydHVhbEZvY3VzKWlmKHRoaXMubmF2aWdhdGluZylpZihhLmRldGFpbC5rZXlib2FyZEV2ZW50LnNoaWZ0S2V5KXN3aXRjaCh0aGlzLl92aXJ0dWFsRm9jdXMpe2Nhc2UgdGhpcy4kLmZvb3Rlcjp0aGlzLl92aXJ0dWFsRm9jdXM9dGhpcy4kLml0ZW1zO2EucHJldmVudERlZmF1bHQoKTticmVhaztjYXNlIHRoaXMuJC5pdGVtczp0aGlzLl92aXJ0dWFsRm9jdXM9dGhpcy4kLmhlYWRlcjthLnByZXZlbnREZWZhdWx0KCk7CmJyZWFrO2Nhc2UgdGhpcy4kLmhlYWRlcjp0aGlzLmZvY3VzKCksdGhpcy5fdmlydHVhbEZvY3VzPW51bGx9ZWxzZSBzd2l0Y2godGhpcy5fdmlydHVhbEZvY3VzKXtjYXNlIHRoaXMuJC5oZWFkZXI6dGhpcy5fdmlydHVhbEZvY3VzPXRoaXMuJC5pdGVtczthLnByZXZlbnREZWZhdWx0KCk7YnJlYWs7Y2FzZSB0aGlzLiQuaXRlbXM6dGhpcy5faXNGb290ZXJWaXNpYmxlKCk/KHRoaXMuX3ZpcnR1YWxGb2N1cz10aGlzLiQuZm9vdGVyLGEucHJldmVudERlZmF1bHQoKSk6dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuX3ZpcnR1YWxGb2N1cz1udWxsfSwxKTticmVhaztjYXNlIHRoaXMuJC5mb290ZXI6dGhpcy5fdmlydHVhbEZvY3VzPW51bGx9ZWxzZSB0aGlzLl9hY3RpdmF0ZU5hdmlnYXRpb24oKSxhLnByZXZlbnREZWZhdWx0KCl9LF9pc0Fib3ZlVmlld3BvcnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZmlyc3RWaXNpYmxlSW5kZXg+YX0sX29uQXJyb3dEb3duOmZ1bmN0aW9uKGEpe3RoaXMuaW50ZXJhY3Rpbmd8fAooYS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNEb3duKCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX3Njcm9sbFBhZ2VEb3duOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kLmhlYWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPXRoaXMuJC5mb290ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsVG9wKz1jLnRvcC1hLmJvdHRvbTt0aGlzLiQuc2Nyb2xsZXIuX3Njcm9sbEhhbmRsZXIoKX0sX29uUGFnZURvd246ZnVuY3Rpb24oYSl7dGhpcy5pbnRlcmFjdGluZ3x8KGEucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzPT09dGhpcy4kLml0ZW1zPyhhPXRoaXMuJC5zY3JvbGxlci5sYXN0VmlzaWJsZUluZGV4LHRoaXMuX3Njcm9sbFBhZ2VEb3duKCksdGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkUm93SW5kZXgrPQp0aGlzLiQuc2Nyb2xsZXIubGFzdFZpc2libGVJbmRleC1hfHx0aGlzLiQuc2Nyb2xsZXIubGFzdFZpc2libGVJbmRleC10aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3dJbmRleCx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpOnRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c1BhZ2VEb3duKCkpfSxfc2Nyb2xsUGFnZVVwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kLmhlYWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPXRoaXMuJC5mb290ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsVG9wLT1jLnRvcC1hLmJvdHRvbTt0aGlzLiQuc2Nyb2xsZXIuX3Njcm9sbEhhbmRsZXIoKX0sX29uUGFnZVVwOmZ1bmN0aW9uKGEpe3RoaXMuaW50ZXJhY3Rpbmd8fChhLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cz09PXRoaXMuJC5pdGVtcz8oYT10aGlzLiQuc2Nyb2xsZXIubGFzdFZpc2libGVJbmRleCwKdGhpcy5fc2Nyb2xsUGFnZVVwKCksdGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkUm93SW5kZXgtPWEtdGhpcy4kLnNjcm9sbGVyLmxhc3RWaXNpYmxlSW5kZXh8fHRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZFJvd0luZGV4LHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSk6dGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzUGFnZVVwKCkpfSxfb25BcnJvd1VwOmZ1bmN0aW9uKGEpe3RoaXMuaW50ZXJhY3Rpbmd8fChhLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c1VwKCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uQXJyb3dSaWdodDpmdW5jdGlvbihhKXt0aGlzLmludGVyYWN0aW5nfHwoYS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNSaWdodCgpLHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSl9LApfb25BcnJvd0xlZnQ6ZnVuY3Rpb24oYSl7dGhpcy5pbnRlcmFjdGluZ3x8KGEucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzTGVmdCgpLHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSl9LF9vbkhvbWU6ZnVuY3Rpb24oYSl7dGhpcy5pbnRlcmFjdGluZ3x8KGEucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzSG9tZSgpLHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSl9LF9vbkVuZDpmdW5jdGlvbihhKXt0aGlzLmludGVyYWN0aW5nfHwoYS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNFbmQoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfbW92ZUZvY3VzVG9Gb2N1c1RhcmdldDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZENlbGwuX2NlbGxDb250ZW50OwooYT1hLnF1ZXJ5U2VsZWN0b3IoIltmb2N1cy10YXJnZXRdIil8fGEuZmlyc3RFbGVtZW50Q2hpbGQpJiZhLmZvY3VzKCl9LF9vbkVudGVyOmZ1bmN0aW9uKGEpe3RoaXMuaW50ZXJhY3Rpbmc/ImlucHV0Ij09PWEuZGV0YWlsLmtleWJvYXJkRXZlbnQudGFyZ2V0LmxvY2FsTmFtZSYmInRleHQiPT09YS5kZXRhaWwua2V5Ym9hcmRFdmVudC50YXJnZXQudHlwZSYmdGhpcy4kLmZvb3RlckZvY3VzVHJhcC5mb2N1cygpOihhLnByZXZlbnREZWZhdWx0KCksdGhpcy5fbW92ZUZvY3VzVG9Gb2N1c1RhcmdldCgpKX0sX29uRXNjYXBlOmZ1bmN0aW9uKCl7dGhpcy5pbnRlcmFjdGluZz90aGlzLiQuZm9vdGVyRm9jdXNUcmFwLmZvY3VzKCk6dGhpcy5uYXZpZ2F0aW5nJiYodGhpcy5uYXZpZ2F0aW5nPSExKX0sX29uRjI6ZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuaW50ZXJhY3Rpbmc/dGhpcy4kLmZvb3RlckZvY3VzVHJhcC5mb2N1cygpOnRoaXMuX21vdmVGb2N1c1RvRm9jdXNUYXJnZXQoKX0sCl9vbkN0cmxIb21lOmZ1bmN0aW9uKGEpe3RoaXMuaW50ZXJhY3Rpbmd8fChhLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0ZpcnN0KCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uQ3RybEVuZDpmdW5jdGlvbihhKXt0aGlzLmludGVyYWN0aW5nfHwoYS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNMYXN0KCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uU3BhY2U6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuaW50ZXJhY3Rpbmcpe2EucHJldmVudERlZmF1bHQoKTthPXRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZENlbGw7dmFyIGM9YS5nZXRDb250ZW50Q2hpbGRyZW4oUG9seW1lci5FbGVtZW50PyJzbG90IjoiY29udGVudCIpWzBdLmZpcnN0RWxlbWVudENoaWxkO2M/Yy5jbGljaygpOnRoaXMubmF2aWdhdGluZyYmCnRoaXMuZmlyZSgiY2VsbC1hY3RpdmF0ZSIse21vZGVsOmEuaW5zdGFuY2V9KX19LF9vbkNlbGxDb250ZW50Rm9jdXM6ZnVuY3Rpb24oYSl7dGhpcy5pbnRlcmFjdGluZz0hMDt0aGlzLl9vbkNlbGxGb2N1cyhhKX0sX29uQ2VsbEZvY3VzOmZ1bmN0aW9uKGEpe2E9YS5kZXRhaWwuY2VsbDt2YXIgYz1hLnBhcmVudEVsZW1lbnQsZD1jLnBhcmVudEVsZW1lbnQsZj1BcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKFBvbHltZXIuZG9tKGQpLmNoaWxkcmVuLGMpO2Q9PT10aGlzLiQuaXRlbXMmJihmPWMuaW5kZXgpO2QuX2ZvY3VzZWRSb3dJbmRleD1mO2QuX2ZvY3VzZWRDZWxsSW5kZXg9QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChQb2x5bWVyLmRvbShjKS5jaGlsZHJlbixhKTt0aGlzLl92aXJ0dWFsRm9jdXM9ZDthLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSYmKGQuX2ZvY3VzZWRDZWxsSW5kZXg9MCxkLl9tb3ZlRm9jdXNUb0RldGFpbHNDZWxsKCkpfSxfZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydDpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLiQuc2Nyb2xsZXIuX3ZpZHhPZmZzZXQrdGhpcy4kLnNjcm9sbGVyLl92aXJ0dWFsU3RhcnQsYz10aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3dJbmRleDt0aGlzLl92aXJ0dWFsRm9jdXM9PT10aGlzLiQuaXRlbXMmJihjPGF8fGM+YSt0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsQ291bnQpJiYodGhpcy4kLnNjcm9sbGVyLnNjcm9sbFRvU2NhbGVkSW5kZXgoYyksdGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkQ2VsbENoYW5nZWQoYyx0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRDZWxsSW5kZXgpKTt0aGlzLl9lbnN1cmVFbGVtZW50SW5WaWV3cG9ydCh0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRDZWxsKX0sX2Vuc3VyZUVsZW1lbnRJblZpZXdwb3J0OmZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYodGhpcy5fdmlydHVhbEZvY3VzPT09dGhpcy4kLml0ZW1zKXt2YXIgZD10aGlzLiQuZm9vdGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCwKZj10aGlzLiQuaGVhZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTtjLmJvdHRvbT5kP3RoaXMuJC5zY3JvbGxlci4kLnRhYmxlLnNjcm9sbFRvcCs9Yy5ib3R0b20tZDpjLnRvcDxmJiYodGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsVG9wKz1jLnRvcC1mKX1pZighYS5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIikpe2E9dGhpcy4kLnNjcm9sbGVyLiQudGFibGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQ7ZD10aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O2lmKGY9dGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkUm93LnF1ZXJ5U2VsZWN0b3IoIltsYXN0LWZyb3plbl0iKSlkPWYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQ7Yy5yaWdodD5hP3RoaXMuJC5zY3JvbGxlci4kLnRhYmxlLnNjcm9sbExlZnQrPWMucmlnaHQtYTpjLmxlZnQ8ZCYmKHRoaXMuJC5zY3JvbGxlci4kLnRhYmxlLnNjcm9sbExlZnQrPQpjLmxlZnQtZCl9fX07dmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVLZXlib2FyZEJlaGF2aW9yPVt2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUtleWJvYXJkQmVoYXZpb3JJbXBsLFBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3JdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWNvbHVtbi1yZW9yZGVyaW5nLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307dmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uUmVvcmRlcmluZ0JlaGF2aW9yPXtwcm9wZXJ0aWVzOntjb2x1bW5SZW9yZGVyaW5nQWxsb3dlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX19Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUNvbHVtblJlb3JkZXJpbmdCZWhhdmlvcj17cHJvcGVydGllczp7X29yZGVyQmFzZVNjb3BlOnt0eXBlOk51bWJlcix2YWx1ZToxRTd9fSxsaXN0ZW5lcnM6e2RyYWdzdGFydDoiX29uRHJhZ1N0YXJ0IixkcmFnb3ZlcjoiX29uRHJhZ092ZXIiLGRyYWdlbmQ6Il9vbkRyYWdFbmQifSxvYnNlcnZlcnM6WyJfdXBkYXRlT3JkZXJzKGNvbHVtblRyZWUsIGNvbHVtblRyZWUuKikiXSxfdXBkYXRlT3JkZXJzOmZ1bmN0aW9uKGEsYyl7dm9pZCAwIT09YSYmdm9pZCAwIT09YyYmYVswXS5mb3JFYWNoKGZ1bmN0aW9uKGQsZil7ZC5fb3JkZXI9KGYrMSkqdGhpcy5fb3JkZXJCYXNlU2NvcGV9LHRoaXMpfSxfb25EcmFnU3RhcnQ6ZnVuY3Rpb24oYSl7aWYoInZhYWRpbi1ncmlkLWNlbGwtY29udGVudCI9PT1hLnRhcmdldC5sb2NhbE5hbWUpe3ZhciBjPXRoaXMuX2dldENlbGxCeUNlbGxDb250ZW50KGEudGFyZ2V0KTtjJiYodGhpcy50b2dnbGVBdHRyaWJ1dGUoInJlb3JkZXJpbmciLAohMCksdGhpcy5fZHJhZ2dlZENvbHVtbj1jLmNvbHVtbix0aGlzLl9zZXRTaWJsaW5nc1Jlb3JkZXJTdGF0dXModGhpcy5fZHJhZ2dlZENvbHVtbiwiYWxsb3dlZCIpLHRoaXMuX2RyYWdnZWRDb2x1bW4uX3Jlb3JkZXJTdGF0dXM9ImRyYWdnaW5nIixhLmRhdGFUcmFuc2ZlciYmKGEuZGF0YVRyYW5zZmVyLnNldERhdGEoInRleHQiLCIiKSxhLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkPSJtb3ZlIiksdGhpcy5fYXV0b1Njcm9sbGVyKCkpfX0sX3NldFNpYmxpbmdzUmVvcmRlclN0YXR1czpmdW5jdGlvbihhLGMpe0FycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChQb2x5bWVyLmRvbShQb2x5bWVyLmRvbShhKS5wYXJlbnROb2RlKS5jaGlsZHJlbixmdW5jdGlvbihkKXtyZXR1cm4vY29sdW1uLy50ZXN0KGQubG9jYWxOYW1lKSYmdGhpcy5faXNTd2FwQWxsb3dlZChkLGEpfSx0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2QuX3Jlb3JkZXJTdGF0dXM9Y30pfSxfb25EcmFnT3ZlcjpmdW5jdGlvbihhKXtpZih0aGlzLl9kcmFnZ2VkQ29sdW1uKXt2YXIgYz0KKFBvbHltZXIuRWxlbWVudD9hLmNvbXBvc2VkUGF0aCgpOlBvbHltZXIuZG9tKGEpLnBhdGgpLmZpbHRlcihmdW5jdGlvbihkKXtyZXR1cm4idmFhZGluLWdyaWQtY2VsbC1jb250ZW50Ij09PWQubG9jYWxOYW1lfSlbMF07YyYmKGEucHJldmVudERlZmF1bHQoKSxjPXRoaXMuX2dldENlbGxCeUNlbGxDb250ZW50KGMpLChjPXRoaXMuX2dldFRhcmdldENvbHVtbihjLHRoaXMuX2RyYWdnZWRDb2x1bW4pKSYmdGhpcy5faXNTd2FwQWxsb3dlZCh0aGlzLl9kcmFnZ2VkQ29sdW1uLGMpJiZ0aGlzLl9pc1N3YXBwYWJsZUJ5UG9zaXRpb24oYyxhLmNsaWVudFgpJiZ0aGlzLl9zd2FwQ29sdW1uT3JkZXJzKHRoaXMuX2RyYWdnZWRDb2x1bW4sYyksdGhpcy5fbGFzdERyYWdDbGllbnRYPWEuY2xpZW50WCl9fSxfYXV0b1Njcm9sbGVyOmZ1bmN0aW9uKCl7aWYodGhpcy5fbGFzdERyYWdDbGllbnRYKXt2YXIgYT10aGlzLl9sYXN0RHJhZ0NsaWVudFgtdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCsKNTAsYz10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtdGhpcy5fbGFzdERyYWdDbGllbnRYKzUwOzA8YT90aGlzLiQudGFibGUuc2Nyb2xsTGVmdCs9YS8xMDowPGMmJih0aGlzLiQudGFibGUuc2Nyb2xsTGVmdC09Yy8xMCk7dGhpcy5fc2Nyb2xsSGFuZGxlcigpfXRoaXMuX2RyYWdnZWRDb2x1bW4mJnRoaXMuYXN5bmModGhpcy5fYXV0b1Njcm9sbGVyLDEwKX0sX29uRHJhZ0VuZDpmdW5jdGlvbigpe3RoaXMuX2RyYWdnZWRDb2x1bW4mJih0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgicmVvcmRlcmluZyIsITEpLHRoaXMuX2RyYWdnZWRDb2x1bW4uX3Jlb3JkZXJTdGF0dXM9IiIsdGhpcy5fc2V0U2libGluZ3NSZW9yZGVyU3RhdHVzKHRoaXMuX2RyYWdnZWRDb2x1bW4sIiIpLHRoaXMuX2xhc3REcmFnQ2xpZW50WD10aGlzLl9kcmFnZ2VkQ29sdW1uPW51bGwpfSxfaXNTd2FwQWxsb3dlZDpmdW5jdGlvbihhLGMpe2lmKGEmJmMpe3ZhciBkPWEucGFyZW50RWxlbWVudD09PWMucGFyZW50RWxlbWVudCwKZj1hLmZyb3plbj09PWMuZnJvemVuO3JldHVybiBhIT09YyYmZCYmZn19LF9pc1N3YXBwYWJsZUJ5UG9zaXRpb246ZnVuY3Rpb24oYSxjKXt2YXIgZD1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoUG9seW1lci5kb20odGhpcy4kLmhlYWRlcikucXVlcnlTZWxlY3RvckFsbCgiLnZhYWRpbi1ncmlkLWNlbGwiKSxmdW5jdGlvbihnKXtyZXR1cm4gZy5jb2x1bW49PT1hfSlbMF0sZj10aGlzLiQuaGVhZGVyLnF1ZXJ5U2VsZWN0b3IoIltyZW9yZGVyLXN0YXR1c1x4M2RkcmFnZ2luZ10iKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4gZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0PmYubGVmdD9jPmQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQtZi53aWR0aDpjPGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCtmLndpZHRofSxfZ2V0Q2VsbEJ5Q2VsbENvbnRlbnQ6ZnVuY3Rpb24oYSl7aWYoUG9seW1lci5FbGVtZW50KXJldHVybiBhLmFzc2lnbmVkU2xvdC5wYXJlbnROb2RlOwphPVBvbHltZXIuZG9tKGEpLmdldERlc3RpbmF0aW9uSW5zZXJ0aW9uUG9pbnRzKClbMF07cmV0dXJuIFBvbHltZXIuZG9tKGEpLnBhcmVudE5vZGV9LF9zd2FwQ29sdW1uT3JkZXJzOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9YS5fb3JkZXI7YS5fb3JkZXI9Yy5fb3JkZXI7Yy5fb3JkZXI9ZDt0aGlzLl91cGRhdGVMYXN0RnJvemVuKCk7dGhpcy5fdXBkYXRlTGFzdENvbHVtbigpfSxfZ2V0VGFyZ2V0Q29sdW1uOmZ1bmN0aW9uKGEsYyl7aWYoYSYmYyl7Zm9yKHZhciBkPWEuY29sdW1uO2QucGFyZW50RWxlbWVudCE9PWMucGFyZW50RWxlbWVudCYmZCE9PXRoaXMudGFyZ2V0OylkPWQucGFyZW50RWxlbWVudDtyZXR1cm4gZC5wYXJlbnRFbGVtZW50PT09Yy5wYXJlbnRFbGVtZW50P2Q6YS5jb2x1bW59fX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvaXJvbi1saXN0LWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLklyb25MaXN0QmVoYXZpb3JJbXBsPWZ1bmN0aW9uKCl7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpob25lfGFkOyg/OiBVOyk/IENQVSkgT1MgKFxkKykvKSxjPWEmJjg8PWFbMV07cmV0dXJue2lzOiJpcm9uLWxpc3QiLHByb3BlcnRpZXM6e21heFBoeXNpY2FsQ291bnQ6e3R5cGU6TnVtYmVyLHZhbHVlOjUwMH0sYXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpdGVtIn0saW5kZXhBczp7dHlwZTpTdHJpbmcsdmFsdWU6ImluZGV4In19LF9yYXRpbzouNSxfc2Nyb2xsZXJQYWRkaW5nVG9wOjAsX3Njcm9sbFBvc2l0aW9uOjAsX3BoeXNpY2FsU2l6ZTowLF9waHlzaWNhbEF2ZXJhZ2U6MCxfcGh5c2ljYWxBdmVyYWdlQ291bnQ6MCxfcGh5c2ljYWxUb3A6MCxfdmlydHVhbENvdW50OjAsX3BoeXNpY2FsSW5kZXhGb3JLZXk6bnVsbCxfZXN0U2Nyb2xsSGVpZ2h0OjAsX3Njcm9sbEhlaWdodDowLF92aWV3cG9ydEhlaWdodDowLF92aWV3cG9ydFdpZHRoOjAsCl9waHlzaWNhbEl0ZW1zOm51bGwsX3BoeXNpY2FsU2l6ZXM6bnVsbCxfZmlyc3RWaXNpYmxlSW5kZXhWYWw6bnVsbCxfbGFzdFZpc2libGVJbmRleFZhbDpudWxsLF9jb2xsZWN0aW9uOm51bGwsX2l0ZW1zUmVuZGVyZWQ6ITEsX2xhc3RQYWdlOm51bGwsX21heFBhZ2VzOjMsX2l0ZW1zUGVyUm93OjEsX2l0ZW1XaWR0aDowLF9yb3dIZWlnaHQ6MCxnZXQgX3BoeXNpY2FsQm90dG9tKCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3BoeXNpY2FsU2l6ZX0sZ2V0IF9zY3JvbGxCb3R0b20oKXtyZXR1cm4gdGhpcy5fc2Nyb2xsUG9zaXRpb24rdGhpcy5fdmlld3BvcnRIZWlnaHR9LGdldCBfdmlydHVhbEVuZCgpe3JldHVybiB0aGlzLl92aXJ0dWFsU3RhcnQrdGhpcy5fcGh5c2ljYWxDb3VudC0xfSxnZXQgX2hpZGRlbkNvbnRlbnRTaXplKCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsU2l6ZS10aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF9tYXhTY3JvbGxUb3AoKXtyZXR1cm4gdGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LQp0aGlzLl92aWV3cG9ydEhlaWdodCt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3B9LF9taW5WaXJ0dWFsU3RhcnQ6MCxnZXQgX21heFZpcnR1YWxTdGFydCgpe3JldHVybiBNYXRoLm1heCgwLHRoaXMuX3ZpcnR1YWxDb3VudC10aGlzLl9waHlzaWNhbENvdW50KX0sX3ZpcnR1YWxTdGFydFZhbDowLHNldCBfdmlydHVhbFN0YXJ0KGQpe3RoaXMuX3ZpcnR1YWxTdGFydFZhbD1NYXRoLm1pbih0aGlzLl9tYXhWaXJ0dWFsU3RhcnQsTWF0aC5tYXgodGhpcy5fbWluVmlydHVhbFN0YXJ0LGQpKX0sZ2V0IF92aXJ0dWFsU3RhcnQoKXtyZXR1cm4gdGhpcy5fdmlydHVhbFN0YXJ0VmFsfHwwfSxfcGh5c2ljYWxTdGFydFZhbDowLHNldCBfcGh5c2ljYWxTdGFydChkKXt0aGlzLl9waHlzaWNhbFN0YXJ0VmFsPWQldGhpcy5fcGh5c2ljYWxDb3VudDswPnRoaXMuX3BoeXNpY2FsU3RhcnRWYWwmJih0aGlzLl9waHlzaWNhbFN0YXJ0VmFsPXRoaXMuX3BoeXNpY2FsQ291bnQrdGhpcy5fcGh5c2ljYWxTdGFydFZhbCk7CnRoaXMuX3BoeXNpY2FsRW5kPSh0aGlzLl9waHlzaWNhbFN0YXJ0K3RoaXMuX3BoeXNpY2FsQ291bnQtMSkldGhpcy5fcGh5c2ljYWxDb3VudH0sZ2V0IF9waHlzaWNhbFN0YXJ0KCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsU3RhcnRWYWx8fDB9LF9waHlzaWNhbENvdW50VmFsOjAsc2V0IF9waHlzaWNhbENvdW50KGQpe3RoaXMuX3BoeXNpY2FsQ291bnRWYWw9ZDt0aGlzLl9waHlzaWNhbEVuZD0odGhpcy5fcGh5c2ljYWxTdGFydCt0aGlzLl9waHlzaWNhbENvdW50LTEpJXRoaXMuX3BoeXNpY2FsQ291bnR9LGdldCBfcGh5c2ljYWxDb3VudCgpe3JldHVybiB0aGlzLl9waHlzaWNhbENvdW50VmFsfSxfcGh5c2ljYWxFbmQ6MCxnZXQgX29wdFBoeXNpY2FsU2l6ZSgpe3JldHVybiB0aGlzLl92aWV3cG9ydEhlaWdodCp0aGlzLl9tYXhQYWdlc30sZ2V0IF9vcHRQaHlzaWNhbENvdW50KCl7cmV0dXJuIHRoaXMuX2VzdFJvd3NJblZpZXcqdGhpcy5faXRlbXNQZXJSb3cqdGhpcy5fbWF4UGFnZXN9LApnZXQgX2lzVmlzaWJsZSgpe3JldHVybiB0aGlzLnNjcm9sbFRhcmdldCYmISghdGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0V2lkdGgmJiF0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRIZWlnaHQpfSxnZXQgZmlyc3RWaXNpYmxlSW5kZXgoKXtpZihudWxsPT09dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWwpe3ZhciBkPU1hdGguZmxvb3IodGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wKTt0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD10aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24oZixnKXtkKz10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQoZik7aWYoZD50aGlzLl9zY3JvbGxQb3NpdGlvbilyZXR1cm4gZ30pfHwwfXJldHVybiB0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbH0sZ2V0IGxhc3RWaXNpYmxlSW5kZXgoKXtpZihudWxsPT09dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbCl7dmFyIGQ9dGhpcy5fcGh5c2ljYWxUb3A7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKGYsCmcpe2lmKGQ8dGhpcy5fc2Nyb2xsQm90dG9tKXRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9ZztlbHNlIHJldHVybiEwO2QrPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChmKX0pfXJldHVybiB0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsfSxnZXQgX2RlZmF1bHRTY3JvbGxUYXJnZXQoKXtyZXR1cm4gdGhpc30sZ2V0IF92aXJ0dWFsUm93Q291bnQoKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuX3ZpcnR1YWxDb3VudC90aGlzLl9pdGVtc1BlclJvdyl9LGdldCBfZXN0Um93c0luVmlldygpe3JldHVybiBNYXRoLmNlaWwodGhpcy5fdmlld3BvcnRIZWlnaHQvdGhpcy5fcm93SGVpZ2h0KX0sZ2V0IF9waHlzaWNhbFJvd3MoKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuX3BoeXNpY2FsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMudXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzKCk7dGhpcy5fcmVuZGVyKCk7dGhpcy5saXN0ZW4odGhpcywiaXJvbi1yZXNpemUiLAoiX3Jlc2l6ZUhhbmRsZXIiKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9pdGVtc1JlbmRlcmVkPSExO3RoaXMudW5saXN0ZW4odGhpcywiaXJvbi1yZXNpemUiLCJfcmVzaXplSGFuZGxlciIpfSx1cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXM6ZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3A9dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzPzA6cGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcylbInBhZGRpbmctdG9wIl18fDAsMTApO3RoaXMuX3ZpZXdwb3J0SGVpZ2h0PXRoaXMuX3Njcm9sbFRhcmdldEhlaWdodH0sX3VwZGF0ZTpmdW5jdGlvbihkLGYpe3RoaXMuX2Fzc2lnbk1vZGVscyhkKTt0aGlzLl91cGRhdGVNZXRyaWNzKGQpO2lmKGYpZm9yKDtmLmxlbmd0aDspZD1mLnBvcCgpLHRoaXMuX3BoeXNpY2FsVG9wLT10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQoZCk7dGhpcy5fcG9zaXRpb25JdGVtcygpO3RoaXMuX3VwZGF0ZVNjcm9sbGVyU2l6ZSgpOwp0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgpfSxfaW5jcmVhc2VQb29sSWZOZWVkZWQ6ZnVuY3Rpb24oKXtpZigwPT09dGhpcy5fdmlld3BvcnRIZWlnaHQpcmV0dXJuITE7dmFyIGQ9dGhpcy5fcGh5c2ljYWxTaXplcy5yZWR1Y2UoZnVuY3Rpb24oZyxsKXtyZXR1cm4gZysobHx8MTAwKX0sMCksZj1kPnRoaXMuX3ZpZXdwb3J0SGVpZ2h0O2lmKGQ+PXRoaXMuX29wdFBoeXNpY2FsU2l6ZSYmZilyZXR1cm4hMTtkPU1hdGguZmxvb3IodGhpcy5fcGh5c2ljYWxTaXplL3RoaXMuX3ZpZXdwb3J0SGVpZ2h0KTswPT09ZD90aGlzLl9kZWJvdW5jZVRlbXBsYXRlKHRoaXMuX2luY3JlYXNlUG9vbC5iaW5kKHRoaXMsTWF0aC5yb3VuZCguNSp0aGlzLl9waHlzaWNhbENvdW50KSkpOnRoaXMuX2xhc3RQYWdlIT09ZCYmZj9Qb2x5bWVyLmRvbS5hZGREZWJvdW5jZXIodGhpcy5kZWJvdW5jZSgiX2RlYm91bmNlVGVtcGxhdGUiLHRoaXMuX2luY3JlYXNlUG9vbC5iaW5kKHRoaXMsdGhpcy5faXRlbXNQZXJSb3cpLAoxNikpOnRoaXMuX2RlYm91bmNlVGVtcGxhdGUodGhpcy5faW5jcmVhc2VQb29sLmJpbmQodGhpcyxNYXRoLmNlaWwodGhpcy5fdmlld3BvcnRIZWlnaHQvKHRoaXMuX3BoeXNpY2FsU2l6ZS90aGlzLl9waHlzaWNhbENvdW50KSp0aGlzLl9tYXhQYWdlcy10aGlzLl9waHlzaWNhbENvdW50KXx8MSkpO3RoaXMuX2xhc3RQYWdlPWQ7cmV0dXJuITB9LF9kZWJvdW5jZVRlbXBsYXRlOmZ1bmN0aW9uKGQpe1BvbHltZXIuZG9tLmFkZERlYm91bmNlcih0aGlzLmRlYm91bmNlKCJfZGVib3VuY2VUZW1wbGF0ZSIsZCkpfSxfaW5jcmVhc2VQb29sOmZ1bmN0aW9uKGQpe3ZhciBmPXRoaXMuX3BoeXNpY2FsQ291bnQ7ZD1NYXRoLm1pbih0aGlzLl9waHlzaWNhbENvdW50K2QsdGhpcy5fdmlydHVhbENvdW50LXRoaXMuX3ZpcnR1YWxTdGFydCxNYXRoLm1heCh0aGlzLm1heFBoeXNpY2FsQ291bnQsMjUpKS1mOzA+PWR8fChbXS5wdXNoLmFwcGx5KHRoaXMuX3BoeXNpY2FsSXRlbXMsdGhpcy5fY3JlYXRlUG9vbChkKSksCltdLnB1c2guYXBwbHkodGhpcy5fcGh5c2ljYWxTaXplcyxBcnJheShkKSksdGhpcy5fcGh5c2ljYWxDb3VudD1mK2QsdGhpcy5fdXBkYXRlKCkpfSxfcmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGQ9MDx0aGlzLl92aXJ0dWFsQ291bnR8fDA8dGhpcy5fcGh5c2ljYWxDb3VudDt0aGlzLmlzQXR0YWNoZWQmJiF0aGlzLl9pdGVtc1JlbmRlcmVkJiZ0aGlzLl9pc1Zpc2libGUmJmQmJih0aGlzLl9sYXN0UGFnZT0wLHRoaXMuX3VwZGF0ZSgpLHRoaXMuX2l0ZW1zUmVuZGVyZWQ9ITApfSxfaXRlcmF0ZUl0ZW1zOmZ1bmN0aW9uKGQsZil7dmFyIGcsbDtpZigyPT09YXJndW1lbnRzLmxlbmd0aCYmZilmb3IobD0wO2w8Zi5sZW5ndGg7bCsrKXt2YXIgaz1mW2xdO3ZhciBuPXRoaXMuX2NvbXB1dGVWaWR4KGspO2lmKG51bGwhPShnPWQuY2FsbCh0aGlzLGssbikpKXJldHVybiBnfWVsc2V7az10aGlzLl9waHlzaWNhbFN0YXJ0O2ZvcihuPXRoaXMuX3ZpcnR1YWxTdGFydDtrPHRoaXMuX3BoeXNpY2FsQ291bnQ7aysrLApuKyspaWYobnVsbCE9KGc9ZC5jYWxsKHRoaXMsayxuKSkpcmV0dXJuIGc7Zm9yKGs9MDtrPHRoaXMuX3BoeXNpY2FsU3RhcnQ7aysrLG4rKylpZihudWxsIT0oZz1kLmNhbGwodGhpcyxrLG4pKSlyZXR1cm4gZ319LF9jb21wdXRlVmlkeDpmdW5jdGlvbihkKXtyZXR1cm4gZD49dGhpcy5fcGh5c2ljYWxTdGFydD90aGlzLl92aXJ0dWFsU3RhcnQrKGQtdGhpcy5fcGh5c2ljYWxTdGFydCk6dGhpcy5fdmlydHVhbFN0YXJ0Kyh0aGlzLl9waHlzaWNhbENvdW50LXRoaXMuX3BoeXNpY2FsU3RhcnQpK2R9LF91cGRhdGVNZXRyaWNzOmZ1bmN0aW9uKGQpe3RoaXMuc2Nyb2xsaW5nJiZQb2x5bWVyLmRvbS5mbHVzaCgpO3ZhciBmPTAsZz0wLGw9dGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQsaz10aGlzLl9waHlzaWNhbEF2ZXJhZ2U7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKG4pe2crPXRoaXMuX3BoeXNpY2FsU2l6ZXNbbl18fDA7dGhpcy5fcGh5c2ljYWxTaXplc1tuXT10aGlzLl9waHlzaWNhbEl0ZW1zW25dLm9mZnNldEhlaWdodDsKZis9dGhpcy5fcGh5c2ljYWxTaXplc1tuXTt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCs9dGhpcy5fcGh5c2ljYWxTaXplc1tuXT8xOjB9LGQpO3RoaXMuX3ZpZXdwb3J0SGVpZ2h0PXRoaXMuX3Njcm9sbFRhcmdldEhlaWdodDt0aGlzLl9waHlzaWNhbFNpemU9dGhpcy5fcGh5c2ljYWxTaXplK2YtZzt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCE9PWwmJih0aGlzLl9waHlzaWNhbEF2ZXJhZ2U9TWF0aC5yb3VuZCgoaypsK2YpL3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50KSl9LF9wb3NpdGlvbkl0ZW1zOmZ1bmN0aW9uKCl7dGhpcy5fYWRqdXN0U2Nyb2xsUG9zaXRpb24oKTt2YXIgZD10aGlzLl9waHlzaWNhbFRvcDt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24oZil7dGhpcy5fcGh5c2ljYWxJdGVtc1tmXS5zdHlsZS50cmFuc2Zvcm09dGhpcy5fZ2V0VHJhbnNsYXRlKDAsZCk7ZCs9dGhpcy5fcGh5c2ljYWxTaXplc1tmXX0pfSxfZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50OmZ1bmN0aW9uKGQpe3JldHVybiB0aGlzLl9waHlzaWNhbFNpemVzW2RdfSwKX3Nob3VsZFJlbmRlck5leHRSb3c6ZnVuY3Rpb24oZCl7cmV0dXJuIGQldGhpcy5faXRlbXNQZXJSb3c9PT10aGlzLl9pdGVtc1BlclJvdy0xfSxfYWRqdXN0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgZD0wPT09dGhpcy5fdmlydHVhbFN0YXJ0P3RoaXMuX3BoeXNpY2FsVG9wOk1hdGgubWluKHRoaXMuX3Njcm9sbFBvc2l0aW9uK3RoaXMuX3BoeXNpY2FsVG9wLDApO2QmJih0aGlzLl9waHlzaWNhbFRvcC09ZCxjfHwwPT09dGhpcy5fcGh5c2ljYWxUb3B8fHRoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24odGhpcy5fc2Nyb2xsVG9wLWQpKX0sX3Jlc2V0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oZCl7dGhpcy5zY3JvbGxUYXJnZXQmJih0aGlzLl9zY3JvbGxQb3NpdGlvbj10aGlzLl9zY3JvbGxUb3A9ZCl9LF91cGRhdGVTY3JvbGxlclNpemU6ZnVuY3Rpb24oZCl7dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0PXRoaXMuX3BoeXNpY2FsQm90dG9tK01hdGgubWF4KHRoaXMuX3ZpcnR1YWxDb3VudC0KdGhpcy5fcGh5c2ljYWxDb3VudC10aGlzLl92aXJ0dWFsU3RhcnQsMCkqdGhpcy5fcGh5c2ljYWxBdmVyYWdlO2lmKChkPShkPWR8fDA9PT10aGlzLl9zY3JvbGxIZWlnaHQpfHx0aGlzLl9zY3JvbGxQb3NpdGlvbj49dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3BoeXNpY2FsU2l6ZSl8fE1hdGguYWJzKHRoaXMuX2VzdFNjcm9sbEhlaWdodC10aGlzLl9zY3JvbGxIZWlnaHQpPj10aGlzLl9vcHRQaHlzaWNhbFNpemUpdGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodD10aGlzLl9lc3RTY3JvbGxIZWlnaHQrInB4Iix0aGlzLl9zY3JvbGxIZWlnaHQ9dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0fSxzY3JvbGxUb0luZGV4OmZ1bmN0aW9uKGQpe1BvbHltZXIuZG9tLmZsdXNoKCk7ZD1NYXRoLm1pbihNYXRoLm1heChkLDApLHRoaXMuX3ZpcnR1YWxDb3VudC0xKTtpZighdGhpcy5faXNJbmRleFJlbmRlcmVkKGQpfHxkPj10aGlzLl9tYXhWaXJ0dWFsU3RhcnQpdGhpcy5fdmlydHVhbFN0YXJ0PQpkLTE7dGhpcy5fYXNzaWduTW9kZWxzKCk7dGhpcy5fdXBkYXRlTWV0cmljcygpO3RoaXMuX3BoeXNpY2FsVG9wPU1hdGguZmxvb3IodGhpcy5fdmlydHVhbFN0YXJ0L3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2U7Zm9yKHZhciBmPXRoaXMuX3BoeXNpY2FsU3RhcnQsZz10aGlzLl92aXJ0dWFsU3RhcnQsbD0wLGs9dGhpcy5faGlkZGVuQ29udGVudFNpemU7ZzxkJiZsPD1rOylsKz10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQoZiksZj0oZisxKSV0aGlzLl9waHlzaWNhbENvdW50LGcrKzt0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoITApO3RoaXMuX3Bvc2l0aW9uSXRlbXMoKTt0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKHRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbGVyUGFkZGluZ1RvcCtsKTt0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgpO3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9Cm51bGx9LF9yZXNldEF2ZXJhZ2U6ZnVuY3Rpb24oKXt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudD10aGlzLl9waHlzaWNhbEF2ZXJhZ2U9MH0sX3Jlc2l6ZUhhbmRsZXI6ZnVuY3Rpb24oKXtQb2x5bWVyLmRvbS5hZGREZWJvdW5jZXIodGhpcy5kZWJvdW5jZSgiX2RlYm91bmNlVGVtcGxhdGUiLGZ1bmN0aW9uKCl7dGhpcy51cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXMoKTt0aGlzLl9yZW5kZXIoKTt0aGlzLl9pdGVtc1JlbmRlcmVkJiZ0aGlzLl9waHlzaWNhbEl0ZW1zJiZ0aGlzLl9pc1Zpc2libGUmJih0aGlzLl9yZXNldEF2ZXJhZ2UoKSx0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5maXJzdFZpc2libGVJbmRleCkpfS5iaW5kKHRoaXMpLDEpKX0sdXBkYXRlU2l6ZUZvckl0ZW06ZnVuY3Rpb24oZCl7ZD10aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5W2RdO251bGwhPWQmJih0aGlzLl91cGRhdGVNZXRyaWNzKFtkXSksdGhpcy5fcG9zaXRpb25JdGVtcygpKX0sX2lzSW5kZXhSZW5kZXJlZDpmdW5jdGlvbihkKXtyZXR1cm4gZD49CnRoaXMuX3ZpcnR1YWxTdGFydCYmZDw9dGhpcy5fdmlydHVhbEVuZH0sX2lzSW5kZXhWaXNpYmxlOmZ1bmN0aW9uKGQpe3JldHVybiBkPj10aGlzLmZpcnN0VmlzaWJsZUluZGV4JiZkPD10aGlzLmxhc3RWaXNpYmxlSW5kZXh9fX0oKTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Jcm9uTGlzdEJlaGF2aW9yPVtQb2x5bWVyLlRlbXBsYXRpemVyLFBvbHltZXIuSXJvblNjcm9sbFRhcmdldEJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLklyb25MaXN0QmVoYXZpb3JJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC10YWJsZS5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZSIsYmVoYXZpb3JzOlt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Jcm9uTGlzdEJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlU2Nyb2xsQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVDb2x1bW5SZW9yZGVyaW5nQmVoYXZpb3IsUG9seW1lci5UZW1wbGF0aXplcl0scHJvcGVydGllczp7c2l6ZTpOdW1iZXIsY29sdW1uVHJlZTpBcnJheSxiaW5kRGF0YTpGdW5jdGlvbixyb3dEZXRhaWxzVGVtcGxhdGU6T2JqZWN0LGNvbHVtblJlb3JkZXJpbmdBbGxvd2VkOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSxzYWZhcmk6e3R5cGU6Qm9vbGVhbix2YWx1ZTovXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfSxzY3JvbGxiYXJXaWR0aDp7dHlwZTpOdW1iZXIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKYS5zdHlsZS53aWR0aD0iMTAwcHgiO2Euc3R5bGUuaGVpZ2h0PSIxMDBweCI7YS5zdHlsZS5vdmVyZmxvdz0ic2Nyb2xsIjthLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7YS5zdHlsZS50b3A9Ii05OTk5cHgiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGM9YS5vZmZzZXRXaWR0aC1hLmNsaWVudFdpZHRoO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7cmV0dXJuIGN9fSx0YXJnZXQ6T2JqZWN0LGhhc0RhdGE6Qm9vbGVhbn0sb2JzZXJ2ZXJzOlsiX2NvbHVtblRyZWVDaGFuZ2VkKGNvbHVtblRyZWUsIF9waHlzaWNhbEl0ZW1zLCBfcGh5c2ljYWxDb3VudFZhbCkiLCJfc2l6ZUNoYW5nZWQoc2l6ZSwgYmluZERhdGEsIGhhc0RhdGEpIiwiX3Jvd0RldGFpbHNUZW1wbGF0ZUNoYW5nZWQocm93RGV0YWlsc1RlbXBsYXRlLCBfcGh5c2ljYWxJdGVtcywgX3BoeXNpY2FsQ291bnRWYWwpIl0sbGlzdGVuZXJzOnsicHJvcGVydHktY2hhbmdlZCI6Il9jb2x1bW5Qcm9wQ2hhbmdlZCIsCmFuaW1hdGlvbmVuZDoiX29uQW5pbWF0aW9uRW5kIiwiY29sdW1uLXJlc2l6aW5nIjoiX29uQ29sdW1uUmVzaXplIn0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLiQ9dGhpcy4kfHx7fTt0aGlzLiQuaGVhZGVyPXRoaXMuZG9tSG9zdC4kLmhlYWRlcjt0aGlzLiQuaXRlbXM9dGhpcy5kb21Ib3N0LiQuaXRlbXM7dGhpcy4kLmZvb3Rlcj10aGlzLmRvbUhvc3QuJC5mb290ZXJ9LF9vbkNvbHVtblJlc2l6ZTpmdW5jdGlvbigpe3RoaXMudG9nZ2xlQXR0cmlidXRlKCJjb2x1bW4tcmVzaXppbmciLHRoaXMuJC5oZWFkZXIucXVlcnlTZWxlY3RvcigiW2NvbHVtbi1yZXNpemluZ10iKSk7dGhpcy5fZ3JpZFJlc2l6ZUhhbmRsZXIoKX0sX29uQW5pbWF0aW9uRW5kOmZ1bmN0aW9uKGEpey9hcHBlYXIvLnRlc3QoYS5hbmltYXRpb25OYW1lKSYmKHRoaXMuX3JlbmRlcigpLHRoaXMuX3VwZGF0ZUhlYWRlckZvb3Rlck1ldHJpY3MoKSxhLnN0b3BQcm9wYWdhdGlvbigpKX0sX2NvbHVtblByb3BDaGFuZ2VkOmZ1bmN0aW9uKGEpeyJoZWFkZXJUZW1wbGF0ZSI9PT0KYS5kZXRhaWwucGF0aCYmdGhpcy50b2dnbGVBdHRyaWJ1dGUoImhhcy10ZW1wbGF0ZXMiLCEwLHRoaXMuJC5oZWFkZXIpOyJmb290ZXJUZW1wbGF0ZSI9PT1hLmRldGFpbC5wYXRoJiZ0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgiaGFzLXRlbXBsYXRlcyIsITAsdGhpcy4kLmZvb3Rlcik7L2Zyb3plbnxoaWRkZW4vLnRlc3QoYS5kZXRhaWwucGF0aCkmJnRoaXMuX2Zyb3plbkNlbGxzQ2hhbmdlZCgpOyJoaWRkZW4iPT09YS5kZXRhaWwucGF0aCYmdGhpcy5fZ3JpZFJlc2l6ZUhhbmRsZXIoKX0sX2hpZGVPdXRlclNjcm9sbGVyOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIDA9PT1hJiYhY30sX2hpZGVUYWJsZU92ZXJmbG93OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIDA9PT1hJiZjfSxfcm93RGV0YWlsc1RlbXBsYXRlQ2hhbmdlZDpmdW5jdGlvbihhLGMsZCl7dm9pZCAwIT09YSYmYyYmdm9pZCAwIT09ZCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjLGZ1bmN0aW9uKGYpe2Yucm93RGV0YWlsc1RlbXBsYXRlPQphfSl9LF9jb2x1bW5UcmVlQ2hhbmdlZDpmdW5jdGlvbihhLGMsZCl7dm9pZCAwIT09YSYmYyYmdm9pZCAwIT09ZCYmKFBvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLHRoaXMuX3VwZGF0ZSksdGhpcy5fZnJvemVuQ2VsbHNDaGFuZ2VkKCksdGhpcy5faGFzVGVtcGxhdGVzQ2hhbmdlZChhKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGMsZnVuY3Rpb24oZil7Zi5jb2x1bW5zPWFbYS5sZW5ndGgtMV19KSx0aGlzLl9ncmlkUmVzaXplSGFuZGxlcigpLFBvbHltZXIuZG9tLmZsdXNoKHRoaXMpLHRoaXMuX3VwZGF0ZUxhc3RDb2x1bW4oKSl9LF91cGRhdGVMYXN0Q29sdW1uOmZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChQb2x5bWVyLmRvbSh0aGlzLmRvbUhvc3Qucm9vdCkucXVlcnlTZWxlY3RvckFsbCgiLnZhYWRpbi1ncmlkLXJvdyIpLGZ1bmN0aW9uKGEpe2EudXBkYXRlTGFzdENvbHVtbigpfSl9LF91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzOmZ1bmN0aW9uKCl7dGhpcy5fcGh5c2ljYWxTaXplcyYmClBvbHltZXIuZG9tLmZsdXNoKCk7dGhpcy5fdXBkYXRlSGVhZGVyRm9vdGVyTWV0cmljc1N5bmMoKTtQb2x5bWVyLlJlbmRlclN0YXR1cy5hZnRlck5leHRSZW5kZXIodGhpcy4kLmhlYWRlcixmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUhlYWRlckZvb3Rlck1ldHJpY3NTeW5jKCk7dGhpcy5fcGVuZGluZ1Njcm9sbFRvU2NhbGVkSW5kZXgmJnRoaXMuc2Nyb2xsVG9TY2FsZWRJbmRleCh0aGlzLl9wZW5kaW5nU2Nyb2xsVG9TY2FsZWRJbmRleCl9LmJpbmQodGhpcykpfSxfdXBkYXRlSGVhZGVyRm9vdGVyTWV0cmljc1N5bmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiQuaGVhZGVyLmNsaWVudEhlaWdodCsicHgiLGM9dGhpcy4kLmZvb3Rlci5jbGllbnRIZWlnaHQrInB4IjtbdGhpcy4kLm91dGVyc2l6ZXIsdGhpcy4kLmZpeGVkc2l6ZXIsdGhpcy4kLml0ZW1zXS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2Quc3R5bGUuYm9yZGVyVG9wV2lkdGg9YTtkLnN0eWxlLmJvcmRlckJvdHRvbVdpZHRoPQpjfSl9LF9oYXNUZW1wbGF0ZXNDaGFuZ2VkOmZ1bmN0aW9uKGEpe3ZhciBjPSExLGQ9ITE7YS5mb3JFYWNoKGZ1bmN0aW9uKGYpe3JldHVybiBmLmZvckVhY2goZnVuY3Rpb24oZyl7Yz1jfHxnLmhlYWRlclRlbXBsYXRlO2Q9ZHx8Zy5mb290ZXJUZW1wbGF0ZX0pfSk7dGhpcy50b2dnbGVBdHRyaWJ1dGUoImhhcy10ZW1wbGF0ZXMiLGMsdGhpcy4kLmhlYWRlcik7dGhpcy50b2dnbGVBdHRyaWJ1dGUoImhhcy10ZW1wbGF0ZXMiLGQsdGhpcy4kLmZvb3Rlcil9LF9jcmVhdGVQb29sOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1BcnJheShhKSxkPTA7ZDxhO2QrKyl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtcm93Iik7Zi50YXJnZXQ9dGhpcy5kb21Ib3N0O2NbZF09ZjtmLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwiIik7UG9seW1lci5kb20odGhpcy4kLml0ZW1zKS5hcHBlbmRDaGlsZChmKX1yZXR1cm4gY30sX3NpemVDaGFuZ2VkOmZ1bmN0aW9uKGEsCmMsZCl7aWYodm9pZCAwIT09YSYmdm9pZCAwIT09YyYmdm9pZCAwIT09ZCl7dmFyIGY9dGhpcy5fc2Nyb2xsVG9wLGc9dGhpcy5maXJzdFZpc2libGVJbmRleCt0aGlzLl92aWR4T2Zmc2V0O3RoaXMuX3ZpcnR1YWxDb3VudD1NYXRoLm1pbihhLDFFNSk7dGhpcy5fcGh5c2ljYWxJbmRleEZvcktleT17fTt0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPW51bGw7dGhpcy5fdmlkeE9mZnNldD0wO3RoaXMuX3BoeXNpY2FsSXRlbXN8fCh0aGlzLl9waHlzaWNhbENvdW50PU1hdGgubWF4KDEsTWF0aC5taW4oMjUsdGhpcy5fdmlydHVhbENvdW50KSksdGhpcy5fcGh5c2ljYWxJdGVtcz10aGlzLl9jcmVhdGVQb29sKHRoaXMuX3BoeXNpY2FsQ291bnQpLHRoaXMuX3BoeXNpY2FsU2l6ZXM9QXJyYXkodGhpcy5fcGh5c2ljYWxDb3VudCkpO3RoaXMuX2l0ZW1zUmVuZGVyZWQ9ITE7dGhpcy5fZGVib3VuY2VUZW1wbGF0ZShmdW5jdGlvbigpe3RoaXMuX3JlbmRlcigpOwp0aGlzLl92aWV3cG9ydEhlaWdodCYmKHRoaXMuc2Nyb2xsVG9TY2FsZWRJbmRleChNYXRoLm1pbihnLHRoaXMuc2l6ZSkpLHRoaXMuX3Njcm9sbFRvcD1mLHRoaXMuX3Njcm9sbEhhbmRsZXIoKSx0aGlzLmZsdXNoRGVib3VuY2VyKCJ2YWFkaW4tZ3JpZC1zY3JvbGxpbmciKSl9KX19LF9hc3NpZ25Nb2RlbHM6ZnVuY3Rpb24oYSl7dGhpcy5fdmlydHVhbEluZGV4VG9JdGVtPXRoaXMuX3ZpcnR1YWxJbmRleFRvSXRlbXx8e307dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKGMsZCl7Yz10aGlzLl9waHlzaWNhbEl0ZW1zW2NdO2MuaW5kZXgmJmRlbGV0ZSB0aGlzLl92aXJ0dWFsSW5kZXhUb0l0ZW1bYy5pbmRleF07Yy5pbmRleD1kK3RoaXMuX3ZpZHhPZmZzZXQ7dGhpcy5fdmlydHVhbEluZGV4VG9JdGVtW2MuaW5kZXhdPWM7Yy50b2dnbGVBdHRyaWJ1dGUoIm9kZCIsYy5pbmRleCUyKTtjLnRvZ2dsZUF0dHJpYnV0ZSgibGFzdHJvdyIsYy5pbmRleD09PXRoaXMuc2l6ZS0xKTtjLnRvZ2dsZUF0dHJpYnV0ZSgiaGlkZGVuIiwKYy5pbmRleD49dGhpcy5zaXplKTt0aGlzLmJpbmREYXRhKGMuaW5kZXgsYyl9LGEpfSxfZ3JpZFJlc2l6ZUhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzKCk7dGhpcy5fcGh5c2ljYWxTaXplcyYmKHRoaXMuX3BoeXNpY2FsSXRlbXMuZm9yRWFjaChmdW5jdGlvbihhKXthLnVwZGF0ZVJvd0RldGFpbHNDZWxsTWV0cmljcygpfSksdGhpcy5kZWJvdW5jZSgidmFhZGluLWdyaWQtcmVzaXppbmciLGZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlKCl9LmJpbmQodGhpcyksMSkpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWNvbHVtbi5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5CYXNlQmVoYXZpb3I9e3Byb3BlcnRpZXM6e3Jlc2l6YWJsZTp7dHlwZTpCb29sZWFuLHZhbHVlOmZ1bmN0aW9uKCl7aWYoInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCIhPT10aGlzLmxvY2FsTmFtZSl7dmFyIGE9UG9seW1lci5kb20odGhpcykucGFyZW50Tm9kZTtyZXR1cm4gYSYmInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCI9PT1hLmxvY2FsTmFtZT9hLnJlc2l6YWJsZXx8ITE6ITF9fX0saGVhZGVyVGVtcGxhdGU6e3R5cGU6T2JqZWN0fSxmb290ZXJUZW1wbGF0ZTp7dHlwZTpPYmplY3R9LGZyb3plbjp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0saGlkZGVuOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSxfbGFzdEZyb3plbjp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0sX29yZGVyOk51bWJlcixfcmVvcmRlclN0YXR1czpCb29sZWFufSxvYnNlcnZlcnM6WyJfZm9vdGVyVGVtcGxhdGVDaGFuZ2VkKGZvb3RlclRlbXBsYXRlKSIsCiJfaGVhZGVyVGVtcGxhdGVDaGFuZ2VkKGhlYWRlclRlbXBsYXRlKSIsIl9sYXN0RnJvemVuQ2hhbmdlZChfbGFzdEZyb3plbikiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShjKXswPD1jLmFkZGVkTm9kZXMubGVuZ3RoJiYodGhpcy5oZWFkZXJUZW1wbGF0ZT10aGlzLl9wcmVwYXJlSGVhZGVyVGVtcGxhdGUoKSx0aGlzLmZvb3RlclRlbXBsYXRlPXRoaXMuX3ByZXBhcmVGb290ZXJUZW1wbGF0ZSgpLHRoaXMudGVtcGxhdGU9dGhpcy5fcHJlcGFyZUJvZHlUZW1wbGF0ZSgpKX10aGlzLl90ZW1wbGF0ZU9ic2VydmVyPVBvbHltZXIuRWxlbWVudD9uZXcgUG9seW1lci5GbGF0dGVuZWROb2Rlc09ic2VydmVyKHRoaXMsYSk6UG9seW1lci5kb20odGhpcykub2JzZXJ2ZU5vZGVzKGEpfSxfcHJlcGFyZUhlYWRlclRlbXBsYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ByZXBhcmVUZW1wbGF0aXplcih0aGlzLl9maW5kVGVtcGxhdGUoInRlbXBsYXRlLmhlYWRlciIpfHxudWxsLAp7fSl9LF9wcmVwYXJlRm9vdGVyVGVtcGxhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJlcGFyZVRlbXBsYXRpemVyKHRoaXMuX2ZpbmRUZW1wbGF0ZSgidGVtcGxhdGUuZm9vdGVyIil8fG51bGwse30pfSxfcHJlcGFyZUJvZHlUZW1wbGF0ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcmVwYXJlVGVtcGxhdGl6ZXIodGhpcy5fZmluZFRlbXBsYXRlKCJ0ZW1wbGF0ZTpub3QoLmhlYWRlcik6bm90KC5mb290ZXIpIix7fSkpfSxfcHJlcGFyZVRlbXBsYXRpemVyOmZ1bmN0aW9uKGEsYyl7aWYoYSYmIWEudGVtcGxhdGl6ZXIpe3ZhciBkPW5ldyB2YWFkaW4uZWxlbWVudHMuZ3JpZC5UZW1wbGF0aXplcjtkLmRhdGFIb3N0PXRoaXMuZGF0YUhvc3Q7ZC5faW5zdGFuY2VQcm9wcz1jfHxkLl9pbnN0YW5jZVByb3BzO2QudGVtcGxhdGU9YTthLnRlbXBsYXRpemVyPWR9cmV0dXJuIGF9LF9zZWxlY3RGaXJzdFRlbXBsYXRlOmZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoUG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3RvckFsbChhKSwKZnVuY3Rpb24oYyl7cmV0dXJuIFBvbHltZXIuZG9tKGMpLnBhcmVudE5vZGU9PT10aGlzfS5iaW5kKHRoaXMpKVswXX0sX2ZpbmRUZW1wbGF0ZTpmdW5jdGlvbihhKXsoYT10aGlzLl9zZWxlY3RGaXJzdFRlbXBsYXRlKGEpKSYmdGhpcy5kYXRhSG9zdCYmKGEuX3Jvb3REYXRhSG9zdD10aGlzLmRhdGFIb3N0Ll9yb290RGF0YUhvc3R8fHRoaXMuZGF0YUhvc3QpO3JldHVybiBhfSxfaGVhZGVyVGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6ImhlYWRlclRlbXBsYXRlIix2YWx1ZTphfSl9LF9mb290ZXJUZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYSl7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoiZm9vdGVyVGVtcGxhdGUiLHZhbHVlOmF9KX0sX2ZsZXhHcm93Q2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJmbGV4R3JvdyIsdmFsdWU6YX0pfSxfd2lkdGhDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIsCntwYXRoOiJ3aWR0aCIsdmFsdWU6YX0pfSxfbGFzdEZyb3plbkNoYW5nZWQ6ZnVuY3Rpb24oYSl7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoibGFzdEZyb3plbiIsdmFsdWU6YX0pfX07CnZhYWRpbi5lbGVtZW50cy5ncmlkLkNvbHVtbkJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7d2lkdGg6e3R5cGU6U3RyaW5nLHZhbHVlOiIxMDBweCJ9LGZsZXhHcm93Ont0eXBlOk51bWJlcix2YWx1ZToxfSx0ZW1wbGF0ZTp7dHlwZTpPYmplY3R9fSxvYnNlcnZlcnM6Il9mbGV4R3Jvd0NoYW5nZWQoZmxleEdyb3cpO193aWR0aENoYW5nZWQod2lkdGgpO190ZW1wbGF0ZUNoYW5nZWQodGVtcGxhdGUpO19mcm96ZW5DaGFuZ2VkKGZyb3plbiwgaXNBdHRhY2hlZCk7X2hpZGRlbkNoYW5nZWQoaGlkZGVuKTtfb3JkZXJDaGFuZ2VkKF9vcmRlcik7X3Jlb3JkZXJTdGF0dXNDaGFuZ2VkKF9yZW9yZGVyU3RhdHVzKTtfcmVzaXphYmxlQ2hhbmdlZChyZXNpemFibGUpIi5zcGxpdCgiOyIpLF9mcm96ZW5DaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7dm9pZCAwIT09YSYmdm9pZCAwIT09YyYmKHZvaWQgMD09PXRoaXMuX29sZEZyb3plbiYmITE9PT1hfHx0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLAp7cGF0aDoiZnJvemVuIix2YWx1ZTphfSksdGhpcy5fb2xkRnJvemVuPWEpfSxfdGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGEpe2EmJmEudGVtcGxhdGl6ZXImJlBvbHltZXIuZG9tKHRoaXMucm9vdCkuYXBwZW5kQ2hpbGQoYS50ZW1wbGF0aXplcik7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoidGVtcGxhdGUiLHZhbHVlOmF9LHtidWJibGVzOiExfSl9LF9oaWRkZW5DaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6ImhpZGRlbiIsdmFsdWU6YX0pfSxfb3JkZXJDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6Im9yZGVyIix2YWx1ZTphfSl9LF9yZW9yZGVyU3RhdHVzQ2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJyZW9yZGVyU3RhdHVzIix2YWx1ZTphfSl9LF9yZXNpemFibGVDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIsCntwYXRoOiJyZXNpemFibGUiLHZhbHVlOmF9KX19O3ZhYWRpbi5lbGVtZW50cy5ncmlkLkNvbHVtbkJlaGF2aW9yPVt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5CYXNlQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uQmVoYXZpb3JJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1jb2x1bW4uaHRtbC0yLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC1jb2x1bW4iLGJlaGF2aW9yczpbdmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uQmVoYXZpb3JdfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtYXJyYXktZGF0YS1wcm92aWRlci1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5BcnJheURhdGFQcm92aWRlckJlaGF2aW9yPXtwcm9wZXJ0aWVzOntpdGVtczpBcnJheX0sb2JzZXJ2ZXJzOlsiX2l0ZW1zQ2hhbmdlZChpdGVtcywgaXRlbXMuKikiXSxfaXRlbXNDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7dm9pZCAwIT09YSYmdm9pZCAwIT09YyYmKHRoaXMuc2l6ZT0oYXx8W10pLmxlbmd0aCx0aGlzLmRhdGFQcm92aWRlcj10aGlzLmRhdGFQcm92aWRlcnx8dGhpcy5fYXJyYXlEYXRhUHJvdmlkZXIsdGhpcy5jbGVhckNhY2hlKCkpfSxfYXJyYXlEYXRhUHJvdmlkZXI6ZnVuY3Rpb24oYSxjKXt2YXIgZD0odGhpcy5pdGVtc3x8W10pLnNsaWNlKDApO3RoaXMuX2NoZWNrUGF0aHModGhpcy5fZmlsdGVycywiZmlsdGVyaW5nIixkKSYmKGQ9dGhpcy5fZmlsdGVyKGQpKTt0aGlzLnNpemU9ZC5sZW5ndGg7YS5zb3J0T3JkZXJzLmxlbmd0aCYmdGhpcy5fY2hlY2tQYXRocyh0aGlzLl9zb3J0ZXJzLCJzb3J0aW5nIixkKSYmKGQ9ZC5zb3J0KHRoaXMuX211bHRpU29ydC5iaW5kKHRoaXMpKSk7CnZhciBmPWEucGFnZSphLnBhZ2VTaXplO2MoZC5zbGljZShmLGYrYS5wYWdlU2l6ZSksZC5sZW5ndGgpfSxfY2hlY2tQYXRoczpmdW5jdGlvbihhLGMsZCl7aWYoIWQubGVuZ3RoKXJldHVybiExO3ZhciBmPSEwLGc7Zm9yKGcgaW4gYSl7dmFyIGw9YVtnXS5wYXRoO2lmKGwmJi0xIT09bC5pbmRleE9mKCIuIikpe3ZhciBrPWwucmVwbGFjZSgvXC5bXlwuXSokLywiIik7dm9pZCAwPT09UG9seW1lci5CYXNlLmdldChrLGRbMF0pJiYoY29uc29sZS53YXJuKCdQYXRoICInK2wrJyIgdXNlZCBmb3IgJytjKyIgZG9lcyBub3QgZXhpc3QgaW4gYWxsIG9mIHRoZSBpdGVtcywgIitjKyIgaXMgZGlzYWJsZWQuIiksZj0hMSl9fXJldHVybiBmfSxfbXVsdGlTb3J0OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuX3NvcnRlcnMubWFwKGZ1bmN0aW9uKGQpe3JldHVybiJhc2MiPT09ZC5kaXJlY3Rpb24/dGhpcy5fY29tcGFyZShQb2x5bWVyLkJhc2UuZ2V0KGQucGF0aCxhKSxQb2x5bWVyLkJhc2UuZ2V0KGQucGF0aCwKYykpOiJkZXNjIj09PWQuZGlyZWN0aW9uP3RoaXMuX2NvbXBhcmUoUG9seW1lci5CYXNlLmdldChkLnBhdGgsYyksUG9seW1lci5CYXNlLmdldChkLnBhdGgsYSkpOjB9LHRoaXMpLnJlZHVjZShmdW5jdGlvbihkLGYpe3JldHVybiBkP2Q6Zn0sMCl9LF9ub3JtYWxpemVFbXB0eVZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiAwPD1bdm9pZCAwLG51bGxdLmluZGV4T2YoYSk/IiI6aXNOYU4oYSk/YS50b1N0cmluZygpOmF9LF9jb21wYXJlOmZ1bmN0aW9uKGEsYyl7YT10aGlzLl9ub3JtYWxpemVFbXB0eVZhbHVlKGEpO2M9dGhpcy5fbm9ybWFsaXplRW1wdHlWYWx1ZShjKTtyZXR1cm4gYTxjPy0xOmE+Yz8xOjB9LF9maWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGMpe3JldHVybiAwPT09dGhpcy5fZmlsdGVycy5maWx0ZXIoZnVuY3Rpb24oZCl7cmV0dXJuLTE9PT10aGlzLl9ub3JtYWxpemVFbXB0eVZhbHVlKFBvbHltZXIuQmFzZS5nZXQoZC5wYXRoLGMpKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihkLnZhbHVlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSl9LmJpbmQodGhpcykpLmxlbmd0aH0sCnRoaXMpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtZHluYW1pYy1jb2x1bW5zLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkR5bmFtaWNDb2x1bW5zQmVoYXZpb3I9e3JlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fYWRkTm9kZU9ic2VydmVyKCl9LF9oYXNDb2x1bW5Hcm91cHM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCI9PT1hW2NdLmxvY2FsTmFtZSlyZXR1cm4hMDtyZXR1cm4hMX0sX2dldENoaWxkQ29sdW1uczpmdW5jdGlvbihhKXtyZXR1cm4gUG9seW1lci5kb20oYSkucXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKCJ2YWFkaW4tZ3JpZC1jb2x1bW4sIHZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCwgdmFhZGluLWdyaWQtc2VsZWN0aW9uLWNvbHVtbiIpfSxfZmxhdHRlbkNvbHVtbkdyb3VwczpmdW5jdGlvbihhKXtyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYyl7cmV0dXJuInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCI9PT1jLmxvY2FsTmFtZT90aGlzLl9nZXRDaGlsZENvbHVtbnMoYyk6W2NdfSx0aGlzKS5yZWR1Y2UoZnVuY3Rpb24oYywKZCl7cmV0dXJuIGMuY29uY2F0KGQpfSxbXSl9LF9nZXRDb2x1bW5UcmVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGM9dGhpcy5xdWVyeUFsbEVmZmVjdGl2ZUNoaWxkcmVuKCJ2YWFkaW4tZ3JpZC1jb2x1bW4sIHZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCwgdmFhZGluLWdyaWQtc2VsZWN0aW9uLWNvbHVtbiIpOzspe2EucHVzaChjKTtpZighdGhpcy5faGFzQ29sdW1uR3JvdXBzKGMpKWJyZWFrO2M9dGhpcy5fZmxhdHRlbkNvbHVtbkdyb3VwcyhjKX1yZXR1cm4gYX0sX3VwZGF0ZUNvbHVtblRyZWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9nZXRDb2x1bW5UcmVlKCk7dGhpcy5fYXJyYXlFcXVhbHMoYSx0aGlzLl9jb2x1bW5UcmVlKXx8KHRoaXMuX2NvbHVtblRyZWU9YSl9LF9hZGROb2RlT2JzZXJ2ZXI6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlcj1Qb2x5bWVyLmRvbSh0aGlzKS5vYnNlcnZlTm9kZXMoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhkKXtyZXR1cm4gZC5ub2RlVHlwZT09PQpOb2RlLkVMRU1FTlRfTk9ERSYmL152YWFkaW4tZ3JpZC0oY29sdW1ufHNlbGVjdGlvbikvaS50ZXN0KGQubG9jYWxOYW1lKX0oMDxhLmFkZGVkTm9kZXMuZmlsdGVyKGMpLmxlbmd0aHx8MDxhLnJlbW92ZWROb2Rlcy5maWx0ZXIoYykubGVuZ3RoKSYmdGhpcy5fdXBkYXRlQ29sdW1uVHJlZSgpOyhQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZVNoYWRvd3x8UG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cpJiZQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZCh0aGlzLiQuZm9vdGVyRm9jdXNUcmFwKTt0aGlzLmRlYm91bmNlKCJjaGVjay1pbXBvcnRzIix0aGlzLl9jaGVja0ltcG9ydHMsMkUzKX0uYmluZCh0aGlzKSl9LF9hcnJheUVxdWFsczpmdW5jdGlvbihhLGMpe2lmKCFhfHwhY3x8YS5sZW5ndGghPWMubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgZD0wLGY9YS5sZW5ndGg7ZDxmO2QrKylpZihhW2RdaW5zdGFuY2VvZiBBcnJheSYmY1tkXWluc3RhbmNlb2YgQXJyYXkpe2lmKCF0aGlzLl9hcnJheUVxdWFscyhhW2RdLApjW2RdKSlyZXR1cm4hMX1lbHNlIGlmKGFbZF0hPWNbZF0pcmV0dXJuITE7cmV0dXJuITB9LF9jaGVja0ltcG9ydHM6ZnVuY3Rpb24oKXtbInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCIsInZhYWRpbi1ncmlkLXNvcnRlciIsInZhYWRpbi1ncmlkLWZpbHRlciIsInZhYWRpbi1ncmlkLXNlbGVjdGlvbi1jb2x1bW4iXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBjPVBvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3IoYSk7IWN8fChQb2x5bWVyLmlzSW5zdGFuY2U/UG9seW1lci5pc0luc3RhbmNlKGMpOmMgaW5zdGFuY2VvZiBQb2x5bWVyLkVsZW1lbnQpfHxjb25zb2xlLndhcm4oIk1ha2Ugc3VyZSB5b3UgaGF2ZSBpbXBvcnRlZCB0aGUgcmVxdWlyZWQgbW9kdWxlIGZvciBceDNjIithKyJceDNlIGVsZW1lbnQuIil9LHRoaXMpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtc29ydC1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5Tb3J0QmVoYXZpb3I9e3Byb3BlcnRpZXM6e211bHRpU29ydDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfc29ydGVyczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX3ByZXZpb3VzU29ydGVyczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LGxpc3RlbmVyczp7InNvcnRlci1jaGFuZ2VkIjoiX29uU29ydGVyQ2hhbmdlZCJ9LHJlYWR5OmZ1bmN0aW9uKCl7UG9seW1lci5FbGVtZW50JiYhUG9seW1lci5TZXR0aW5ncy51c2VOYXRpdmVTaGFkb3cmJnRoaXMuYXN5bmMoZnVuY3Rpb24oKXt2YXIgYT1Qb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yQWxsKCJ2YWFkaW4tZ3JpZC1zb3J0ZXIiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGEsZnVuY3Rpb24oYyl7Yy5maXJlJiZjLmZpcmUoInNvcnRlci1jaGFuZ2VkIil9KX0pfSxfb25Tb3J0ZXJDaGFuZ2VkOmZ1bmN0aW9uKGEpe3ZhciBjPQphLnRhcmdldDt0aGlzLl9yZW1vdmVBcnJheUl0ZW0odGhpcy5fc29ydGVycyxjKTtjLl9vcmRlcj1udWxsO3RoaXMubXVsdGlTb3J0PyhjLmRpcmVjdGlvbiYmdGhpcy5fc29ydGVycy51bnNoaWZ0KGMpLHRoaXMuX3NvcnRlcnMuZm9yRWFjaChmdW5jdGlvbihkLGYpe2QuX29yZGVyPTE8dGhpcy5fc29ydGVycy5sZW5ndGg/ZjpudWxsfSx0aGlzKSk6KHRoaXMuX3NvcnRlcnMuZm9yRWFjaChmdW5jdGlvbihkKXtkLl9vcmRlcj1udWxsO2QuZGlyZWN0aW9uPW51bGx9KSxjLmRpcmVjdGlvbiYmKHRoaXMuX3NvcnRlcnM9W2NdKSk7YS5zdG9wUHJvcGFnYXRpb24oKTt0aGlzLmRhdGFQcm92aWRlciYmSlNPTi5zdHJpbmdpZnkodGhpcy5fcHJldmlvdXNTb3J0ZXJzKSE9PUpTT04uc3RyaW5naWZ5KHRoaXMuX21hcFNvcnRlcnMoKSkmJnRoaXMuY2xlYXJDYWNoZSgpO3RoaXMuX3ByZXZpb3VzU29ydGVycz10aGlzLl9tYXBTb3J0ZXJzKCl9LF9tYXBTb3J0ZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NvcnRlcnMubWFwKGZ1bmN0aW9uKGEpe3JldHVybntwYXRoOmEucGF0aCwKZGlyZWN0aW9uOmEuZGlyZWN0aW9ufX0pfSxfcmVtb3ZlQXJyYXlJdGVtOmZ1bmN0aW9uKGEsYyl7Yz1hLmluZGV4T2YoYyk7LTE8YyYmYS5zcGxpY2UoYywxKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWZpbHRlci1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkLkZpbHRlckJlaGF2aW9yPXtwcm9wZXJ0aWVzOntfZmlsdGVyczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LGxpc3RlbmVyczp7ImZpbHRlci1jaGFuZ2VkIjoiX2ZpbHRlckNoYW5nZWQifSxfZmlsdGVyQ2hhbmdlZDpmdW5jdGlvbihhKXstMT09PXRoaXMuX2ZpbHRlcnMuaW5kZXhPZihhLnRhcmdldCkmJnRoaXMuX2ZpbHRlcnMucHVzaChhLnRhcmdldCk7YS5zdG9wUHJvcGFnYXRpb24oKTt0aGlzLmRhdGFQcm92aWRlciYmdGhpcy5jbGVhckNhY2hlKCl9LF9tYXBGaWx0ZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZpbHRlcnMubWFwKGZ1bmN0aW9uKGEpe3JldHVybntwYXRoOmEucGF0aCx2YWx1ZTphLnZhbHVlfX0pfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQuaHRtbC5qcwpQb2x5bWVyKHtpczoidmFhZGluLWdyaWQiLHByb3BlcnRpZXM6e19jb2x1bW5UcmVlOnt0eXBlOkFycmF5LG5vdGlmeTohMH0sc2l6ZTpOdW1iZXIsX3Jvd0RldGFpbHNUZW1wbGF0ZTpPYmplY3QsX2JpbmREYXRhOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRJdGVtLmJpbmQodGhpcyl9fX0sYmVoYXZpb3JzOltQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLFBvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLkFjdGl2ZUl0ZW1CZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5Sb3dEZXRhaWxzQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuRGF0YVByb3ZpZGVyQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuRHluYW1pY0NvbHVtbnNCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5BcnJheURhdGFQcm92aWRlckJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLlNlbGVjdGlvbkJlaGF2aW9yLAp2YWFkaW4uZWxlbWVudHMuZ3JpZC5Tb3J0QmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuRmlsdGVyQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uUmVvcmRlcmluZ0JlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlS2V5Ym9hcmRCZWhhdmlvcl0sbGlzdGVuZXJzOnsicHJvcGVydHktY2hhbmdlZCI6Il9jb2x1bW5Qcm9wQ2hhbmdlZCIsImlyb24tcmVzaXplIjoiX2dyaWRSZXNpemVIYW5kbGVyIn0sX3VwZGF0ZUl0ZW06ZnVuY3Rpb24oYSxjKXthLnN0eWxlLm1pbkhlaWdodD1jPyIiOnRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxBdmVyYWdlKyJweCI7YS5pdGVtPWM7YS5zZWxlY3RlZD10aGlzLl9pc1NlbGVjdGVkKGMpO2EuZXhwYW5kZWQ9dGhpcy5faXNFeHBhbmRlZChjKTthLmFjdGl2ZT1udWxsIT09YyYmYz09dGhpcy5hY3RpdmVJdGVtO2EuZm9jdXNlZD1hLmluZGV4PT09dGhpcy4kLml0ZW1zLl9mb2N1c2VkUm93SW5kZXh9LF9nZXRDb250ZW50VGFyZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LApyZWFkeTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUNvbHVtblRyZWUoKTt0aGlzLl9yb3dEZXRhaWxzVGVtcGxhdGU9UG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3RvcigidGVtcGxhdGUucm93LWRldGFpbHMiKXx8dm9pZCAwO3RoaXMuJC5zY3JvbGxlci50YXJnZXQ9dGhpcztudWxsPT09ZG9jdW1lbnQuZG9jdHlwZSYmY29uc29sZS53YXJuKCdceDNjdmFhZGluLWdyaWRceDNlIHJlcXVpcmVzIHRoZSAic3RhbmRhcmRzIG1vZGUiIGRlY2xhcmF0aW9uLiBQbGVhc2UgYWRkIFx4M2MhRE9DVFlQRSBodG1sXHgzZSB0byB0aGUgSFRNTCBkb2N1bWVudC4nKX0sX2NvbHVtblByb3BDaGFuZ2VkOmZ1bmN0aW9uKGEpeyJfY2hpbGRDb2x1bW5zIj09PWEuZGV0YWlsLnBhdGgmJnRoaXMuX3VwZGF0ZUNvbHVtblRyZWUoKTthLnN0b3BQcm9wYWdhdGlvbigpfSxfZ3JpZFJlc2l6ZUhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLiQuc2Nyb2xsZXIuX2dyaWRSZXNpemVIYW5kbGVyKCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHMvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHMuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHMiLHByb3BlcnRpZXM6e2JhY2tlbmQ6T2JqZWN0LGV4cGVyaW1lbnROYW1lOlN0cmluZyx2aXNpYmxlU2NoZW1hOk9iamVjdCxzZXNzaW9uR3JvdXA6T2JqZWN0LF94VHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6JG8uWFR5cGUuU1RFUH0sX25vTXVsdGlFeHBlcmltZW50czp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaW5kZXhPZlNlc3Npb246T2JqZWN0LF9zZXNzaW9uR3JvdXBOYW1lSGFzaDpOdW1iZXIsX3JlcXVlc3REYXRhOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKHt0YWc6YSxydW46Y30pPT50aGlzLmJhY2tlbmQubGlzdE1ldHJpY0V2YWxzKHtleHBlcmltZW50TmFtZTp0aGlzLmV4cGVyaW1lbnROYW1lLHNlc3Npb25OYW1lOmMsbWV0cmljTmFtZTphfSl9fSxfY29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57c2NhbGU6YT0+e2E9SlNPTi5wYXJzZShhKVsxXTsKYT10aGlzLl9pbmRleE9mU2Vzc2lvbi5nZXQoYSk7Y29uc3QgYz1Yby5zdGFuZGFyZDtyZXR1cm4gY1sodGhpcy5fc2Vzc2lvbkdyb3VwTmFtZUhhc2grYSklYy5sZW5ndGhdfX19fX0sYmVoYXZpb3JzOltQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcl0sbGlzdGVuZXJzOnsiaXJvbi1yZXNpemUiOiJyZWRyYXcifSxvYnNlcnZlcnM6WyJfc2Vzc2lvbkdyb3VwQ2hhbmdlZChzZXNzaW9uR3JvdXAuKikiXSxyZWRyYXcoKXtQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3JBbGwoInRmLXNjYWxhci1jYXJkIikuZm9yRWFjaChhPT5hLnJlZHJhdygpKX0sX3Nlc3Npb25Hcm91cENoYW5nZWQoKXt0aGlzLnNlc3Npb25Hcm91cD8odGhpcy5faW5kZXhPZlNlc3Npb249bmV3IE1hcCh0aGlzLnNlc3Npb25Hcm91cC5zZXNzaW9ucy5tYXAoKGEsYyk9PlthLm5hbWUsY10pKSx0aGlzLl9zZXNzaW9uR3JvdXBOYW1lSGFzaD10Zi5ocGFyYW1zLnV0aWxzLmhhc2hPZlN0cmluZyh0aGlzLnNlc3Npb25Hcm91cC5uYW1lKSk6Cih0aGlzLl9pbmRleE9mU2Vzc2lvbj1uZXcgTWFwLHRoaXMuX3Nlc3Npb25Hcm91cE5hbWVIYXNoPTApO1BvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvckFsbCgidGYtc2NhbGFyLWNhcmQiKS5mb3JFYWNoKGE9Pntjb25zdCBjPWEuZ2V0KCJ0YWciKTthLnNldCgidGFnIiwiIik7YS5zZXQoInRhZyIsYyl9KX0sX2hhdmVNZXRyaWNzKCl7cmV0dXJuIHRoaXMudmlzaWJsZVNjaGVtYSYmQXJyYXkuaXNBcnJheSh0aGlzLnZpc2libGVTY2hlbWEubWV0cmljSW5mb3MpJiYwPHRoaXMudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvcy5sZW5ndGh9LF9oYXZlTWV0cmljc0FuZFNlc3Npb25Hcm91cCgpe3JldHVybiB0aGlzLnNlc3Npb25Hcm91cCYmdGhpcy5faGF2ZU1ldHJpY3MoKX0sX2NvbXB1dGVTZXJpZXNGb3JTZXNzaW9uR3JvdXBNZXRyaWMoYSxjKXtyZXR1cm4gbnVsbD09PWF8fG51bGw9PT1jP1tdOmEuc2Vzc2lvbnMuZmlsdGVyKGQ9PnZvaWQgMCE9PXRmLmhwYXJhbXMudXRpbHMubWV0cmljVmFsdWVCeU5hbWUoZC5tZXRyaWNWYWx1ZXMsCmMubmFtZSkpLm1hcChkPT4oe3RhZzpjLm5hbWUscnVuOmQubmFtZX0pKX0sX2NvbXB1dGVUYWdNZXRhZGF0YShhKXtyZXR1cm57ZGlzcGxheU5hbWU6dGYuaHBhcmFtcy51dGlscy5tZXRyaWNOYW1lKGEpLGRlc2NyaXB0aW9uOmEuZGVzY3JpcHRpb258fCIifX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXRhYmxlLXZpZXcvdGYtaHBhcmFtcy10YWJsZS12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtdGFibGUtdmlldyIscHJvcGVydGllczp7dmlzaWJsZVNjaGVtYTpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheSxlbmFibGVTaG93TWV0cmljczpCb29sZWFuLGJhY2tlbmQ6T2JqZWN0LGV4cGVyaW1lbnROYW1lOlN0cmluZ30sb2JzZXJ2ZXJzOlsiX3Zpc2libGVTY2hlbWFPclNlc3Npb25Hcm91cHNDaGFuZ2VkKHZpc2libGVTY2hlbWEuKiwgc2Vzc2lvbkdyb3Vwcy4qKSJdLF92aXNpYmxlU2NoZW1hT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZCgpe2NvbnN0IGE9dGhpcy4kLnNlc3Npb25Hcm91cHNUYWJsZS5nZXQoImV4cGFuZGVkSXRlbXMiKTt0aGlzLiQuc2Vzc2lvbkdyb3Vwc1RhYmxlLnNldCgiZXhwYW5kZWRJdGVtcyIsW10pO1BvbHltZXIuZG9tLmZsdXNoKCk7Y29uc3QgYz1uZXcgTWFwO3RoaXMuc2Vzc2lvbkdyb3Vwcy5mb3JFYWNoKGQ9PntjLnNldChkLm5hbWUsZCl9KTt0aGlzLiQuc2Vzc2lvbkdyb3Vwc1RhYmxlLnNldCgiZXhwYW5kZWRJdGVtcyIsCmEubWFwKGQ9PmMuZ2V0KGQubmFtZSkpLmZpbHRlcihCb29sZWFuKSl9LF9ocGFyYW1OYW1lOnRmLmhwYXJhbXMudXRpbHMuaHBhcmFtTmFtZSxfbWV0cmljTmFtZTp0Zi5ocGFyYW1zLnV0aWxzLm1ldHJpY05hbWUsX3Nlc3Npb25Hcm91cEhQYXJhbShhLGMpe3JldHVybiBudWxsIT1hJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYS5ocGFyYW1zLGMpP3RmLmhwYXJhbXMudXRpbHMucHJldHR5UHJpbnQoYS5ocGFyYW1zW2NdKToiIn0sX3Nlc3Npb25Hcm91cE1ldHJpYyhhLGMpe2lmKG51bGw9PWEpcmV0dXJuIG51bGw7Zm9yKGxldCBkPTA7ZDxhLm1ldHJpY1ZhbHVlcy5sZW5ndGg7KytkKXtsZXQgZj1hLm1ldHJpY1ZhbHVlc1tkXTtpZihmLm5hbWUuZ3JvdXA9PT1jLmdyb3VwJiZmLm5hbWUudGFnPT1jLnRhZylyZXR1cm4gdGYuaHBhcmFtcy51dGlscy5wcmV0dHlQcmludChmLnZhbHVlKX1yZXR1cm4iIn0sX3Jvd051bWJlcihhKXtyZXR1cm4gYSsxfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtdmFsdWVzIixwcm9wZXJ0aWVzOntzZXNzaW9uR3JvdXA6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LHZpc2libGVTY2hlbWE6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9fSxfcHJvcGVydGllc0FyZVBvcHVsYXRlZDpmdW5jdGlvbihhLGMpe3JldHVybiB2b2lkIDAhPT1hJiZudWxsIT09YSYmdm9pZCAwIT09YyYmbnVsbCE9PWN9LF9zaW5nbGV0b25TZXNzaW9uR3JvdXBzOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT09YXx8dm9pZCAwPT09YT9bXTpbYV19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtcGxvdC91dGlscy5odG1sLmpzCihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGYoZyxsLGspe2Z1bmN0aW9uIG4oKXtpZigwPT09Zy5sZW5ndGgpcmV0dXJuWzEsMl07Y29uc3QgW3AscV09ZDMuZXh0ZW50KGcpO3JldHVybiBwIT09cT9bcCxxXTowPHA/Wy41KnAsMS41KnBdOjA+cD9bMS41KnAsLjUqcF06Wy0xLDFdfWlmKCJMSU5FQVIiPT09aylyZXR1cm4gZDMuc2NhbGVMaW5lYXIoKS5kb21haW4obigpKS5yYW5nZShbbCwwXSk7aWYoIkxPRyI9PT1rKXJldHVybiBrPW4oKSwwPj1rWzBdJiYwPD1rWzFdP2YoZyxsLCJMSU5FQVIiKTpkMy5zY2FsZUxvZygpLmRvbWFpbihrKS5yYW5nZShbbCwwXSk7aWYoIlFVQU5USUxFIj09PWspcmV0dXJuIGs9ZDMucmFuZ2UoMjApLm1hcChwPT5sLXAqbC8xOSksMD09PWcubGVuZ3RoJiYoZz1bMV0pLGQzLnNjYWxlUXVhbnRpbGUoKS5kb21haW4oXy51bmlxKGcpKS5yYW5nZShrKTtpZigiTk9OX05VTUVSSUMiPT09aylyZXR1cm4gZDMuc2NhbGVQb2ludCgpLmRvbWFpbihfLnVuaXEoZy5zb3J0KCkpKS5yYW5nZShbbCwKMF0pLnBhZGRpbmcoLjEpO3Rocm93IFJhbmdlRXJyb3IoIlVua25vd24gc2NhbGU6ICIrayk7fWQuZmluZENsb3Nlc3RQYXRoPWZ1bmN0aW9uKGcsbCxrKXtmdW5jdGlvbiBuKHoseCxDLEYpe2NvbnN0IEQ9ei1DLEI9eC1GO0M9cC1DO0Y9cS1GO2NvbnN0IEk9KEQqQytCKkYpLyhEKkQrQipCKTtyZXR1cm4gMD49ST9hLmhwYXJhbXMudXRpbHMubDJOb3JtU3F1YXJlZChDLEYpOjE8PUk/YS5ocGFyYW1zLnV0aWxzLmwyTm9ybVNxdWFyZWQoei1wLHgtcSk6YS5ocGFyYW1zLnV0aWxzLmwyTm9ybVNxdWFyZWQoQy1JKkQsRi1JKkIpfWlmKDI+bC5sZW5ndGgpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIkxlc3MgdGhhbiB0d28gYXhlcyBpbiBwYXJhbGxlbCBjb29yZGluYXRlcyBwbG90LiIpLG51bGw7Y29uc3QgcD1rWzBdLHE9a1sxXTtpZihwPD1sWzBdfHxwPj1sW2wubGVuZ3RoLTFdKXJldHVybiBudWxsO2NvbnN0IHI9Xy5zb3J0ZWRJbmRleChsLHApO2NvbnNvbGUuYXNzZXJ0KDA8cik7CmNvbnNvbGUuYXNzZXJ0KHI8bC5sZW5ndGgpO2NvbnN0IHQ9ci0xO2xldCB2PW51bGwseT1udWxsO2cuZm9yRWFjaCh6PT57Y29uc3QgeD1uKHouY29udHJvbFBvaW50c1t0XVswXSx6LmNvbnRyb2xQb2ludHNbdF1bMV0sei5jb250cm9sUG9pbnRzW3JdWzBdLHouY29udHJvbFBvaW50c1tyXVsxXSk7MTAwPHh8fCEobnVsbD09PXZ8fHg8dil8fCh2PXgseT16KX0pO3JldHVybiB5fTtkLnBvaW50U2NhbGVJbnZlcnNlSW1hZ2U9ZnVuY3Rpb24oZyxsLGspe3JldHVybiBnLmRvbWFpbigpLmZpbHRlcihuPT57bj1nKG4pO3JldHVybiBsPD1uJiZuPD1rfSl9O2QucXVhbnRpbGVTY2FsZUludmVyc2VJbWFnZT1mdW5jdGlvbihnLGwsayl7Y29uc3Qgbj1nLnJhbmdlKCkscD1uLmZpbHRlcihxPT5sPD1xJiZxPD1rKS5tYXAocT0+e2NvbnN0IHI9Zy5pbnZlcnRFeHRlbnQocSk7cmV0dXJuIHE9PT1uW24ubGVuZ3RoLTFdP1tyWzBdLHJbMV0rMV06cn0pO3JldHVybiAwPT1wLmxlbmd0aD9bMCwKMF06ZDMuZXh0ZW50KGQzLm1lcmdlKHApKX07ZC5jb250aW51b3VzU2NhbGVJbnZlcnNlSW1hZ2U9ZnVuY3Rpb24oZyxsLGspe3JldHVybltnLmludmVydChsKSxnLmludmVydChrKV0uc29ydCgobixwKT0+bi1wKX07ZC5jcmVhdGVBeGlzU2NhbGU9Zn0pKGMucGFyYWxsZWxfY29vcmRzX3Bsb3R8fChjLnBhcmFsbGVsX2Nvb3Jkc19wbG90PXt9KSl9KShhLmhwYXJhbXN8fChhLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L2F4ZXMuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7ZnVuY3Rpb24gZihyKXtyZXR1cm4gbnVsbCE9PXIuc291cmNlRXZlbnR9bGV0IGc7KGZ1bmN0aW9uKHIpe3IuTElORUFSPSJMSU5FQVIiO3IuTE9HPSJMT0ciO3IuUVVBTlRJTEU9IlFVQU5USUxFIjtyLk5PTl9OVU1FUklDPSJOT05fTlVNRVJJQyJ9KShnPWQuU2NhbGVUeXBlfHwoZC5TY2FsZVR5cGU9e30pKTtjbGFzcyBse2lzUGFzc2luZygpe3JldHVybiEwfX1jbGFzcyBre2NvbnN0cnVjdG9yKHIsdCx2LHkpe3RoaXMuX2xvd2VyPXI7dGhpcy5fdXBwZXI9dDt0aGlzLl9sb3dlck9wZW49djt0aGlzLl91cHBlck9wZW49eX1pc1Bhc3Npbmcocil7cmV0dXJuIHRoaXMuX2JlZm9yZSh0aGlzLl9sb3dlcixyLCF0aGlzLl9sb3dlck9wZW4pJiZ0aGlzLl9iZWZvcmUocix0aGlzLl91cHBlciwhdGhpcy5fdXBwZXJPcGVuKX1fYmVmb3JlKHIsdCx2KXtyZXR1cm4gdj9yPD10OnI8dH19Y2xhc3Mgbntjb25zdHJ1Y3RvcihyKXt0aGlzLl9kb21haW5TZXQ9CnJ9aXNQYXNzaW5nKHIpe3JldHVybi0xIT09dGhpcy5fZG9tYWluU2V0LmZpbmRJbmRleCh0PT50PT09cil9fWNsYXNzIHB7Y29uc3RydWN0b3Iocix0LHYseSl7dGhpcy5fc3ZnUHJvcHM9cjt0aGlzLl9zY2hlbWE9dDt0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXI9djt0aGlzLl9jb2xJbmRleD15O3RoaXMuX2lzRGlzcGxheWVkPSExO3RoaXMuX3NjYWxlVHlwZT10aGlzLl95U2NhbGU9bnVsbDt0aGlzLnNldEJydXNoU2VsZWN0aW9uKG51bGwpfWNvbEluZGV4KCl7cmV0dXJuIHRoaXMuX2NvbEluZGV4fXlTY2FsZSgpe3JldHVybiB0aGlzLl95U2NhbGV9c2NhbGVUeXBlKCl7cmV0dXJuIHRoaXMuX3NjYWxlVHlwZX1icnVzaFNlbGVjdGlvbigpe3JldHVybiB0aGlzLl9icnVzaFNlbGVjdGlvbn1pc0Rpc3BsYXllZCgpe3JldHVybiB0aGlzLl9pc0Rpc3BsYXllZH1zZXRCcnVzaFNlbGVjdGlvbihyKXt0aGlzLl9icnVzaFNlbGVjdGlvbj1yO3RoaXMuX2JydXNoRmlsdGVyPXRoaXMuX2J1aWxkQnJ1c2hGaWx0ZXIodGhpcy5icnVzaFNlbGVjdGlvbigpLAp0aGlzLnNjYWxlVHlwZSgpLHRoaXMueVNjYWxlKCkpfXNldERvbWFpbkFuZFNjYWxlKHIsdCl7dGhpcy5fc2NhbGVUeXBlPXQ7dGhpcy5feVNjYWxlPWEuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5jcmVhdGVBeGlzU2NhbGUoci5zbGljZSgpLHRoaXMuX3N2Z1Byb3BzLmhlaWdodCx0aGlzLnNjYWxlVHlwZSgpKTt0aGlzLl9icnVzaEZpbHRlcj10aGlzLl9idWlsZEJydXNoRmlsdGVyKHRoaXMuYnJ1c2hTZWxlY3Rpb24oKSx0aGlzLnNjYWxlVHlwZSgpLHRoaXMueVNjYWxlKCkpfWJydXNoRmlsdGVyKCl7cmV0dXJuIHRoaXMuX2JydXNoRmlsdGVyfXVwZGF0ZURPTShyKXt2YXIgdD1kMy5heGlzTGVmdCh0aGlzLnlTY2FsZSgpKTt0aGlzLnNjYWxlVHlwZSgpPT09Zy5RVUFOVElMRSYmKHQ9dC50aWNrVmFsdWVzKHRoaXMueVNjYWxlKCkucXVhbnRpbGVzKCkpLnRpY2tGb3JtYXQoZDMuZm9ybWF0KCItLjZnIikpKTt2YXIgdj1kMy5zZWxlY3Qocik7di5zZWxlY3RBbGwoImciKS5yZW1vdmUoKTsKdi5hcHBlbmQoImciKS5jbGFzc2VkKCJheGlzIiwhMCkuY2FsbCh0KS5hcHBlbmQoInRleHQiKS5jbGFzc2VkKCJheGlzLXRpdGxlIiwhMCkuc3R5bGUoImN1cnNvciIsIm1vdmUiKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5hdHRyKCJ5IiwtOSkudGV4dCh5PT5hLmhwYXJhbXMudXRpbHMuc2NoZW1hQ29sdW1uTmFtZSh0aGlzLl9zY2hlbWEseSkpO3YuY2FsbChkMy5kcmFnKCkub24oInN0YXJ0IiwoKT0+e3Iuc2V0QXR0cmlidXRlKCJpcy1kcmFnZ2luZyIsIiIpO3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkRyYWdTdGFydCh0aGlzLmNvbEluZGV4KCkpfSkub24oImRyYWciLCgpPT50aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25EcmFnKGQzLmV2ZW50LngpKS5vbigiZW5kIiwoKT0+e3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkRyYWdFbmQoKTtyLnJlbW92ZUF0dHJpYnV0ZSgiaXMtZHJhZ2dpbmciKX0pKTt0PWQzLmJydXNoWSgpLmV4dGVudChbWy04LDBdLApbOCx0aGlzLl9zdmdQcm9wcy5oZWlnaHQrMV1dKS5vbigic3RhcnQiLCgpPT57ZihkMy5ldmVudCkmJihyLnNldEF0dHJpYnV0ZSgiaXMtYnJ1c2hpbmciLCIiKSx0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25CcnVzaENoYW5nZWQodGhpcy5jb2xJbmRleCgpKSl9KS5vbigiYnJ1c2giLCgpPT57aWYoZihkMy5ldmVudCkpdGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uQnJ1c2hDaGFuZ2VkKHRoaXMuY29sSW5kZXgoKSl9KS5vbigiZW5kIiwoKT0+e2YoZDMuZXZlbnQpJiYodGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uQnJ1c2hDaGFuZ2VkKHRoaXMuY29sSW5kZXgoKSksci5yZW1vdmVBdHRyaWJ1dGUoImlzLWJydXNoaW5nIikpfSk7dj1kMy5zZWxlY3QocikuYXBwZW5kKCJnIikuY2xhc3NlZCgiYnJ1c2giLCEwKTt2LmNhbGwodCk7dC5tb3ZlKHYsdGhpcy5icnVzaFNlbGVjdGlvbigpKX1zZXREaXNwbGF5ZWQocil7dGhpcy5faXNEaXNwbGF5ZWQ9cn1fYnVpbGRCcnVzaEZpbHRlcihyLAp0LHYpe2lmKG51bGw9PT1yKXJldHVybiBuZXcgbDtpZihudWxsPT09dClyZXR1cm4gY29uc29sZS5lcnJvcigiU2NhbGUgdHlwZSBpcyBudWxsLCBidXQgYnJ1c2hTZWxlY3Rpb24gaXNuJ3Q6ICIsciksbmV3IGw7c3dpdGNoKHQpe2Nhc2UgZy5MSU5FQVI6Y2FzZSBnLkxPRzp7Y29uc3QgW3ksel09YS5ocGFyYW1zLnBhcmFsbGVsX2Nvb3Jkc19wbG90LmNvbnRpbnVvdXNTY2FsZUludmVyc2VJbWFnZSh2LHJbMF0sclsxXSk7cmV0dXJuIG5ldyBrKHkseiwhMSwhMSl9Y2FzZSBnLlFVQU5USUxFOntjb25zdCBbeSx6XT1hLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QucXVhbnRpbGVTY2FsZUludmVyc2VJbWFnZSh2LHJbMF0sclsxXSk7cmV0dXJuIG5ldyBrKHkseiwhMSwhMCl9Y2FzZSBnLk5PTl9OVU1FUklDOnJldHVybiBuZXcgbihhLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QucG9pbnRTY2FsZUludmVyc2VJbWFnZSh2LHJbMF0sclsxXSkpfWNvbnNvbGUuZXJyb3IoIlVua25vd24gc2NhbGUgdHlwZTogIiwKdCk7cmV0dXJuIG5ldyBsfX1kLkF4aXM9cDtjbGFzcyBxe2NvbnN0cnVjdG9yKHIsdCx2KXt0aGlzLl9zdmdQcm9wcz1yO3RoaXMuX3NjaGVtYT10O3RoaXMuX2F4ZXM9dGhpcy5fY3JlYXRlQXhlcyh2KTt0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucz1kMy5zY2FsZVBvaW50KCkucmFuZ2UoWzEsdGhpcy5fc3ZnUHJvcHMud2lkdGgtMV0pLnBhZGRpbmcoLjUpO3RoaXMuX2RyYWdnZWRBeGlzPW51bGw7dGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoImcuYXhpcy1wYXJlbnQiKS5yZW1vdmUoKTt0aGlzLl9wYXJlbnRzU2VsPXRoaXMuX3N2Z1Byb3BzLnN2Z0cuc2VsZWN0QWxsKCIuYXhpcy1wYXJlbnQiKX11cGRhdGVBeGVzKHIsdCl7Y29uc29sZS5hc3NlcnQoIXRoaXMuaXNBeGlzRHJhZ2dpbmcoKSk7Y29uc3Qgdj1uZXcgU2V0O3IuY29sdW1ucy5mb3JFYWNoKHo9Pntjb25zdCB4PXouYWJzb2x1dGVJbmRleDtsZXQgQz10aGlzLl9heGVzW3hdO0Muc2V0RGlzcGxheWVkKCEwKTsKY29uc3QgRj10Lm1hcChEPT5hLmhwYXJhbXMudXRpbHMuY29sdW1uVmFsdWVCeUluZGV4KHRoaXMuX3NjaGVtYSxELHgpKTtDLnNldERvbWFpbkFuZFNjYWxlKEYsei5zY2FsZSk7di5hZGQoeCl9KTt0aGlzLl9heGVzLmZvckVhY2goej0+e3YuaGFzKHouY29sSW5kZXgoKSl8fHouc2V0RGlzcGxheWVkKCExKX0pO3RoaXMuX3VwZGF0ZVN0YXRpb25hcnlBeGVzUG9zaXRpb25zKHYpO3RoaXMuX3BhcmVudHNTZWw9dGhpcy5fcGFyZW50c1NlbC5kYXRhKEFycmF5LmZyb20odiksej0+eik7dGhpcy5fcGFyZW50c1NlbC5leGl0KCkucmVtb3ZlKCk7dGhpcy5fcGFyZW50c1NlbD10aGlzLl9wYXJlbnRzU2VsLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgiYXhpcy1wYXJlbnQiLCEwKS5tZXJnZSh0aGlzLl9wYXJlbnRzU2VsKTtjb25zdCB5PXRoaXM7dGhpcy5fcGFyZW50c1NlbC5jYWxsKHo9PnRoaXMuX3VwZGF0ZUF4ZXNQb3NpdGlvbnNJbkRPTSh6KSkuZWFjaChmdW5jdGlvbih6KXt5Ll9heGVzW3pdLnVwZGF0ZURPTSh0aGlzKX0pfW1hcFZpc2libGVBeGVzKHIpe3JldHVybiB0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4oKS5tYXAodD0+CnIodGhpcy5nZXRBeGlzUG9zaXRpb24odCksdGhpcy5fYXhlc1t0XSkpfWFsbFZpc2libGVBeGVzU2F0aXNmeShyKXtyZXR1cm4gdGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKCkuZXZlcnkodD0+cih0aGlzLmdldEF4aXNQb3NpdGlvbih0KSx0aGlzLl9heGVzW3RdKSl9Z2V0QXhpc0ZvckNvbEluZGV4KHIpe3JldHVybiB0aGlzLl9heGVzW3JdfWRyYWdTdGFydChyKXtjb25zb2xlLmFzc2VydCghdGhpcy5pc0F4aXNEcmFnZ2luZygpKTtjb25zb2xlLmFzc2VydCh0aGlzLl9heGVzW3JdLmlzRGlzcGxheWVkKCkpO3RoaXMuX2RyYWdnZWRBeGlzPXRoaXMuX2F4ZXNbcl07dGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbj10aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucyhyKX1kcmFnKHIpe3RoaXMuX2RyYWdnZWRBeGlzUG9zaXRpb249cj1NYXRoLm1pbihNYXRoLm1heChyLDApLHRoaXMuX3N2Z1Byb3BzLndpZHRoKTtyPXRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbigpOwpyLnNvcnQoKHQsdik9PnRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHQpLXRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHYpKTt0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4ocik7dGhpcy5fdXBkYXRlQXhlc1Bvc2l0aW9uc0luRE9NKHRoaXMuX3BhcmVudHNTZWwpfWRyYWdFbmQoKXtjb25zb2xlLmFzc2VydCh0aGlzLmlzQXhpc0RyYWdnaW5nKCkpO3RoaXMuX2RyYWdnZWRBeGlzPXRoaXMuX2RyYWdnZWRBeGlzUG9zaXRpb249bnVsbDt0aGlzLl91cGRhdGVBeGVzUG9zaXRpb25zSW5ET00odGhpcy5fcGFyZW50c1NlbC50cmFuc2l0aW9uKCkuZHVyYXRpb24oNTAwKSl9aXNBeGlzRHJhZ2dpbmcoKXtyZXR1cm4gbnVsbCE9PXRoaXMuX2RyYWdnZWRBeGlzfWdldEF4aXNQb3NpdGlvbihyKXtyZXR1cm4gbnVsbCE9PXRoaXMuX2RyYWdnZWRBeGlzJiZ0aGlzLl9kcmFnZ2VkQXhpcy5jb2xJbmRleCgpPT09cj90aGlzLl9kcmFnZ2VkQXhpc1Bvc2l0aW9uOnRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zKHIpfV91cGRhdGVTdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucyhyKXt2YXIgdD0KdGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKCkuZmlsdGVyKHY9PnIuaGFzKHYpKTt0PUFycmF5LmZyb20obmV3IFNldChbLi4udCwuLi5BcnJheS5mcm9tKHIpXSkpO3RoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbih0KX1fdXBkYXRlQXhlc1Bvc2l0aW9uc0luRE9NKHIpe3IuYXR0cigidHJhbnNmb3JtIix0PT5hLmhwYXJhbXMudXRpbHMudHJhbnNsYXRlU3RyKHRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHQpKSl9X2NyZWF0ZUF4ZXMocil7cmV0dXJuIGQzLnJhbmdlKGEuaHBhcmFtcy51dGlscy5udW1Db2x1bW5zKHRoaXMuX3NjaGVtYSkpLm1hcCh0PT5uZXcgcCh0aGlzLl9zdmdQcm9wcyx0aGlzLl9zY2hlbWEscix0KSl9fWQuQXhlc0NvbGxlY3Rpb249cX0pKGMucGFyYWxsZWxfY29vcmRzX3Bsb3R8fChjLnBhcmFsbGVsX2Nvb3Jkc19wbG90PXt9KSl9KShhLmhwYXJhbXN8fChhLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L2xpbmVzLmpzCihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKGQpe2xldCBmOyhmdW5jdGlvbihrKXtrW2suRk9SRUdST1VORD0wXT0iRk9SRUdST1VORCI7a1trLkJBQ0tHUk9VTkQ9MV09IkJBQ0tHUk9VTkQifSkoZj1kLkxpbmVUeXBlfHwoZC5MaW5lVHlwZT17fSkpO2NsYXNzIGd7Y29uc3RydWN0b3Ioayl7dm9pZCAwPT09ayYmKGs9ZDMuc2VsZWN0QWxsKG51bGwpKTtjb25zb2xlLmFzc2VydCgxPj1rLnNpemUoKSk7dGhpcy5fc2Vzc2lvbkdyb3VwU2VsPWt9c2Vzc2lvbkdyb3VwKCl7cmV0dXJuIDE9PT10aGlzLl9zZXNzaW9uR3JvdXBTZWwuc2l6ZSgpP3RoaXMuX3Nlc3Npb25Hcm91cFNlbC5kYXR1bSgpOm51bGx9aXNOdWxsKCl7cmV0dXJuIG51bGw9PT10aGlzLnNlc3Npb25Hcm91cCgpfXNlbGVjdGlvbigpe3JldHVybiB0aGlzLl9zZXNzaW9uR3JvdXBTZWx9ZXF1YWxzVG8oayl7cmV0dXJuIHRoaXMuaXNOdWxsKCk/ay5pc051bGwoKTprLmlzTnVsbCgpPyExOmsuc2Vzc2lvbkdyb3VwKCkubmFtZT09CnRoaXMuc2Vzc2lvbkdyb3VwKCkubmFtZX19ZC5TZXNzaW9uR3JvdXBIYW5kbGU9ZztjbGFzcyBse2NvbnN0cnVjdG9yKGssbixwKXt0aGlzLl9zdmdQcm9wcz1rO3RoaXMuX3NjaGVtYT1uO3RoaXMuX2F4ZXNDb2xsZWN0aW9uPXA7dGhpcy5fc2Vzc2lvbkdyb3Vwcz1bXTt0aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgiZy5iYWNrZ3JvdW5kIikucmVtb3ZlKCk7dGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoImcuZm9yZWdyb3VuZCIpLnJlbW92ZSgpO3RoaXMuX2JnUGF0aHNTZWw9dGhpcy5fc3ZnUHJvcHMuc3ZnRy5hcHBlbmQoImciKS5jbGFzc2VkKCJiYWNrZ3JvdW5kIiwhMCkuc2VsZWN0QWxsKCJwYXRoIik7dGhpcy5fZmdQYXRoc1NlbD10aGlzLl9zdmdQcm9wcy5zdmdHLmFwcGVuZCgiZyIpLmNsYXNzZWQoImZvcmVncm91bmQiLCEwKS5zZWxlY3RBbGwoInBhdGgiKTt0aGlzLl91cGRhdGVWaXNpYmxlRmdQYXRoc1NlbCgpO3RoaXMuX3BlYWtlZFNlc3Npb25Hcm91cEhhbmRsZT0KbmV3IGc7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGU9bmV3IGc7dGhpcy5fZDNsaW5lPWQzLmxpbmUoKS5jdXJ2ZShkMy5jdXJ2ZUxpbmVhcil9Z2V0U2Vzc2lvbkdyb3VwSGFuZGxlKGspe3JldHVybiBudWxsPT09a3x8dm9pZCAwPT09az9uZXcgZzpuZXcgZyh0aGlzLl9mZ1BhdGhzU2VsLmZpbHRlcihuPT5uLm5hbWU9PT1rLm5hbWUpKX1oaWRlQmFja2dyb3VuZExpbmVzKCl7dGhpcy5fYmdQYXRoc1NlbC5hdHRyKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9c2hvd0JhY2tncm91bmRMaW5lcygpe3RoaXMuX2JnUGF0aHNTZWwuYXR0cigidmlzaWJpbGl0eSIsbnVsbCl9cGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCl7cmV0dXJuIHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cEhhbmRsZX1zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpe3JldHVybiB0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZX1yZWNvbXB1dGVDb250cm9sUG9pbnRzKGssbj0wKXsoaz09PWYuRk9SRUdST1VORD8KdGhpcy5fZmdQYXRoc1NlbDp0aGlzLl9iZ1BhdGhzU2VsKS50cmFuc2l0aW9uKCkuZHVyYXRpb24obikuYXR0cigiZCIscD0+dGhpcy5fcGF0aERBdHRyaWJ1dGUocCkpO2s9PT1mLkZPUkVHUk9VTkQmJndpbmRvdy5zZXRUaW1lb3V0KCgpPT57Y29uc3QgcD10aGlzO3RoaXMuX2ZnUGF0aHNTZWwuZWFjaChmdW5jdGlvbihxKXtwLl9zZXRDb250cm9sUG9pbnRzUHJvcGVydHkodGhpcyxxKX0pfSl9cmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpe3RoaXMuX2ZnUGF0aHNTZWwuY2xhc3NlZCgiaW52aXNpYmxlLXBhdGgiLGs9PiF0aGlzLl9heGVzQ29sbGVjdGlvbi5hbGxWaXNpYmxlQXhlc1NhdGlzZnkoKG4scCk9PnAuYnJ1c2hGaWx0ZXIoKS5pc1Bhc3NpbmcoYS5ocGFyYW1zLnV0aWxzLmNvbHVtblZhbHVlQnlJbmRleCh0aGlzLl9zY2hlbWEsayxwLmNvbEluZGV4KCkpKSkpO3RoaXMuX3VwZGF0ZVZpc2libGVGZ1BhdGhzU2VsKCl9c2V0Rm9yZWdyb3VuZExpbmVzQ29sb3IoaywKbixwKXtrPXRoaXMuX2NyZWF0ZUxpbmVDb2xvckZ1bmN0aW9uKGssbixwKTt0aGlzLl9mZ1BhdGhzU2VsLmF0dHIoInN0cm9rZSIsayl9cmVkcmF3KGssbixwLHEpe2NvbnN0IHI9dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlc3Npb25Hcm91cCgpLHQ9dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2Vzc2lvbkdyb3VwKCk7dGhpcy5fc2Vzc2lvbkdyb3Vwcz1rO3RoaXMuX2ZnUGF0aHNTZWw9dGhpcy5fcmVjb21wdXRlUGF0aFNlbGVjdGlvbih0aGlzLl9mZ1BhdGhzU2VsKTt0aGlzLl9iZ1BhdGhzU2VsPXRoaXMuX3JlY29tcHV0ZVBhdGhTZWxlY3Rpb24odGhpcy5fYmdQYXRoc1NlbCk7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlPXRoaXMuZ2V0U2Vzc2lvbkdyb3VwSGFuZGxlKHIpO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlPXRoaXMuZ2V0U2Vzc2lvbkdyb3VwSGFuZGxlKHQpO3RoaXMucmVjb21wdXRlQ29udHJvbFBvaW50cyhmLkZPUkVHUk9VTkQpOwp0aGlzLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoZi5CQUNLR1JPVU5EKTt0aGlzLnJlY29tcHV0ZUZvcmVncm91bmRMaW5lc1Zpc2liaWxpdHkoKTt0aGlzLnNldEZvcmVncm91bmRMaW5lc0NvbG9yKG4scCxxKX11cGRhdGVQZWFrZWRTZXNzaW9uR3JvdXAoayl7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInBlYWtlZC1wYXRoIiwhMSk7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlPWs7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInBlYWtlZC1wYXRoIiwhMCl9Y2xlYXJQZWFrZWRTZXNzaW9uR3JvdXAoKXt0aGlzLnVwZGF0ZVBlYWtlZFNlc3Npb25Hcm91cChuZXcgZyl9dXBkYXRlU2VsZWN0ZWRTZXNzaW9uR3JvdXAoayl7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgic2VsZWN0ZWQtcGF0aCIsITEpO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlPQprO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInNlbGVjdGVkLXBhdGgiLCEwKX1maW5kQ2xvc2VzdFNlc3Npb25Hcm91cChrLG4pe2NvbnN0IHA9dGhpcy5fYXhlc0NvbGxlY3Rpb24ubWFwVmlzaWJsZUF4ZXMocT0+cSk7az1hLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QuZmluZENsb3Nlc3RQYXRoKHRoaXMuX3Zpc2libGVGZ1BhdGhzU2VsLm5vZGVzKCkscCxbayxuXSk7cmV0dXJuIG51bGw9PT1rP25ldyBnOm5ldyBnKGQzLnNlbGVjdChrKSl9X2NyZWF0ZUxpbmVDb2xvckZ1bmN0aW9uKGssbixwKXtpZihudWxsPT09aylyZXR1cm4oKT0+InJlZCI7Y29uc3QgcT1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihhLmhwYXJhbXMudXRpbHMubnVtZXJpY0NvbHVtbkV4dGVudCh0aGlzLl9zY2hlbWEsdGhpcy5fc2Vzc2lvbkdyb3VwcyxrKSkucmFuZ2UoW24scF0pLmludGVycG9sYXRlKGQzLmludGVycG9sYXRlTGFiKTtyZXR1cm4gcj0+CnEoYS5ocGFyYW1zLnV0aWxzLmNvbHVtblZhbHVlQnlJbmRleCh0aGlzLl9zY2hlbWEscixrKSl9X3JlY29tcHV0ZVBhdGhTZWxlY3Rpb24oayl7az1rLmRhdGEodGhpcy5fc2Vzc2lvbkdyb3VwcyxuPT5uLm5hbWUpO2suZXhpdCgpLnJlbW92ZSgpO3JldHVybiBrLmVudGVyKCkuYXBwZW5kKCJwYXRoIikubWVyZ2Uoayl9X3NldENvbnRyb2xQb2ludHNQcm9wZXJ0eShrLG4pe2suY29udHJvbFBvaW50cz10aGlzLl9jb21wdXRlQ29udHJvbFBvaW50cyhuKX1fY29tcHV0ZUNvbnRyb2xQb2ludHMoayl7cmV0dXJuIHRoaXMuX2F4ZXNDb2xsZWN0aW9uLm1hcFZpc2libGVBeGVzKChuLHApPT5bbixwLnlTY2FsZSgpKGEuaHBhcmFtcy51dGlscy5jb2x1bW5WYWx1ZUJ5SW5kZXgodGhpcy5fc2NoZW1hLGsscC5jb2xJbmRleCgpKSldKX1fcGF0aERBdHRyaWJ1dGUoayl7cmV0dXJuIHRoaXMuX2QzbGluZSh0aGlzLl9jb21wdXRlQ29udHJvbFBvaW50cyhrKSl9X3VwZGF0ZVZpc2libGVGZ1BhdGhzU2VsKCl7dGhpcy5fdmlzaWJsZUZnUGF0aHNTZWw9CnRoaXMuX2ZnUGF0aHNTZWwuZmlsdGVyKCI6bm90KC5pbnZpc2libGUtcGF0aCkiKX19ZC5MaW5lc0NvbGxlY3Rpb249bH0pKGMucGFyYWxsZWxfY29vcmRzX3Bsb3R8fChjLnBhcmFsbGVsX2Nvb3Jkc19wbG90PXt9KSl9KShhLmhwYXJhbXN8fChhLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L2ludGVyYWN0aW9uX21hbmFnZXIuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7Y2xhc3MgZntjb25zdHJ1Y3RvcihsLGspe3RoaXMuc3ZnPWQzLnNlbGVjdChsKTtsPTEwMCprKzIwO3RoaXMuc3ZnLmF0dHIoInZpZXdCb3giLGAwIDAgJHtsfSAkezI0MH1gKTt0aGlzLnN2Zy5hdHRyKCJwcmVzZXJ2ZUFzcGVjdFJhdGlvIiwieE1pZFlNaWQiKTt0aGlzLnN2Zy5zdHlsZSgibWluLXdpZHRoIixsKyJweCIpO3RoaXMuc3ZnLnN0eWxlKCJtaW4taGVpZ2h0IiwiMjQwcHgiKTt0aGlzLndpZHRoPWwtMTAtMTA7dGhpcy5oZWlnaHQ9MjAwO3RoaXMuc3ZnRz10aGlzLnN2Zy5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLGEuaHBhcmFtcy51dGlscy50cmFuc2xhdGVTdHIoMTAsMzApKX19ZC5TVkdQcm9wZXJ0aWVzPWY7Y2xhc3MgZ3tjb25zdHJ1Y3RvcihsLGssbixwKXt0aGlzLl9zdmdQcm9wcz1sO3RoaXMuX3NjaGVtYT1rO3RoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQj1uO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCPQpwO3RoaXMuX2F4ZXNDb2xsZWN0aW9uPW5ldyBkLkF4ZXNDb2xsZWN0aW9uKGwsayx0aGlzKTt0aGlzLl9saW5lc0NvbGxlY3Rpb249bmV3IGQuTGluZXNDb2xsZWN0aW9uKGwsayx0aGlzLl9heGVzQ29sbGVjdGlvbik7dGhpcy5fc3ZnUHJvcHMuc3ZnLm9uKCJjbGljayIsKCk9PnRoaXMub25DbGljaygpKS5vbigibW91c2Vtb3ZlIG1vdXNlZW50ZXIiLCgpPT57Y29uc3QgW3Escl09ZDMubW91c2UodGhpcy5fc3ZnUHJvcHMuc3ZnRy5ub2RlKCkpO3RoaXMub25Nb3VzZU1vdmVkKHEscil9KS5vbigibW91c2VsZWF2ZSIsKCk9PnRoaXMub25Nb3VzZUxlYXZlKCkpfW9uRHJhZ1N0YXJ0KGwpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmRyYWdTdGFydChsKTt0aGlzLl9saW5lc0NvbGxlY3Rpb24uaGlkZUJhY2tncm91bmRMaW5lcygpfW9uRHJhZyhsKXt0aGlzLl9heGVzQ29sbGVjdGlvbi5kcmFnKGwpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGQuTGluZVR5cGUuRk9SRUdST1VORCl9b25EcmFnRW5kKCl7dGhpcy5fYXhlc0NvbGxlY3Rpb24uZHJhZ0VuZCgpOwp0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVjb21wdXRlQ29udHJvbFBvaW50cyhkLkxpbmVUeXBlLkZPUkVHUk9VTkQsNTAwKTt3aW5kb3cuc2V0VGltZW91dCgoKT0+e3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGQuTGluZVR5cGUuQkFDS0dST1VORCk7dGhpcy5fbGluZXNDb2xsZWN0aW9uLnNob3dCYWNrZ3JvdW5kTGluZXMoKX0sNTAwKX1vbkJydXNoQ2hhbmdlZChsKXt0aGlzLl9heGVzQ29sbGVjdGlvbi5nZXRBeGlzRm9yQ29sSW5kZXgobCkuc2V0QnJ1c2hTZWxlY3Rpb24oZDMuZXZlbnQuc2VsZWN0aW9uKTt0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpfW9uTW91c2VNb3ZlZChsLGspe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi51cGRhdGVQZWFrZWRTZXNzaW9uR3JvdXAodGhpcy5fbGluZXNDb2xsZWN0aW9uLmZpbmRDbG9zZXN0U2Vzc2lvbkdyb3VwKGwsaykpO3RoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCkpfW9uTW91c2VMZWF2ZSgpe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5pc051bGwoKXx8Cih0aGlzLl9saW5lc0NvbGxlY3Rpb24uY2xlYXJQZWFrZWRTZXNzaW9uR3JvdXAoKSx0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ0IobnVsbCkpfW9uQ2xpY2soKXt0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCk9PT10aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKT90aGlzLl9saW5lc0NvbGxlY3Rpb24udXBkYXRlU2VsZWN0ZWRTZXNzaW9uR3JvdXAobmV3IGQuU2Vzc2lvbkdyb3VwSGFuZGxlKTp0aGlzLl9saW5lc0NvbGxlY3Rpb24udXBkYXRlU2VsZWN0ZWRTZXNzaW9uR3JvdXAodGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpKTt0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSl9b25PcHRpb25zT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZChsLAprKXt0aGlzLl9heGVzQ29sbGVjdGlvbi51cGRhdGVBeGVzKGwsayk7Y29uc3Qgbj10aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkscD10aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKTt0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVkcmF3KGssdm9pZCAwIT09bC5jb2xvckJ5Q29sdW1uSW5kZXg/bC5jb2x1bW5zW2wuY29sb3JCeUNvbHVtbkluZGV4XS5hYnNvbHV0ZUluZGV4Om51bGwsbC5taW5Db2xvcixsLm1heENvbG9yKTtuLmVxdWFsc1RvKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSl8fHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCkpO3AuZXF1YWxzVG8odGhpcy5fbGluZXNDb2xsZWN0aW9uLnNlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlKCkpfHwKdGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ0IodGhpcy5fbGluZXNDb2xsZWN0aW9uLnNlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCkpfXNjaGVtYSgpe3JldHVybiB0aGlzLl9zY2hlbWF9fWQuSW50ZXJhY3Rpb25NYW5hZ2VyPWd9KShjLnBhcmFsbGVsX2Nvb3Jkc19wbG90fHwoYy5wYXJhbGxlbF9jb29yZHNfcGxvdD17fSkpfSkoYS5ocGFyYW1zfHwoYS5ocGFyYW1zPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtcGxvdC90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QiLHByb3BlcnRpZXM6e3Nlc3Npb25Hcm91cHM6QXJyYXksb3B0aW9uczpPYmplY3Qsc2VsZWN0ZWRTZXNzaW9uR3JvdXA6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGwscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxjbG9zZXN0U2Vzc2lvbkdyb3VwOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0scmVkcmF3Q291bnQ6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF92YWxpZFNlc3Npb25Hcm91cHM6QXJyYXksX2ludGVyYWN0aW9uTWFuYWdlcjpPYmplY3R9LG9ic2VydmVyczpbIl9vcHRpb25zT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZChvcHRpb25zLiosIHNlc3Npb25Hcm91cHMuKikiXSxfb3B0aW9uc09yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQoKXtpZihudWxsIT09dGhpcy5vcHRpb25zKXt2YXIgYT10aGlzLm9wdGlvbnMuY29uZmlndXJhdGlvbjtpZih2b2lkIDA9PT10aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXJ8fAohXy5pc0VxdWFsKHRoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5zY2hlbWEoKSxhLnNjaGVtYSkpe2QzLnNlbGVjdCh0aGlzLiQuc3ZnKS5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTtjb25zdCBjPW5ldyB0Zi5ocGFyYW1zLnBhcmFsbGVsX2Nvb3Jkc19wbG90LlNWR1Byb3BlcnRpZXModGhpcy4kLnN2Zyx0Zi5ocGFyYW1zLnV0aWxzLm51bUNvbHVtbnMoYS5zY2hlbWEpKTt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuc3ZnLCEwKTt0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXI9bmV3IHRmLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QuSW50ZXJhY3Rpb25NYW5hZ2VyKGMsYS5zY2hlbWEsZD0+dGhpcy5jbG9zZXN0U2Vzc2lvbkdyb3VwQ2hhbmdlZChkKSxkPT50aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZChkKSl9dGhpcy5fY29tcHV0ZVZhbGlkU2Vzc2lvbkdyb3VwcygpO3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbk9wdGlvbnNPclNlc3Npb25Hcm91cHNDaGFuZ2VkKHRoaXMub3B0aW9ucywKdGhpcy5fdmFsaWRTZXNzaW9uR3JvdXBzKTt0aGlzLnJlZHJhd0NvdW50Kyt9fSxjbG9zZXN0U2Vzc2lvbkdyb3VwQ2hhbmdlZChhKXt0aGlzLl9zZXRDbG9zZXN0U2Vzc2lvbkdyb3VwKGEpfSxzZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWQoYSl7dGhpcy5fc2V0U2VsZWN0ZWRTZXNzaW9uR3JvdXAoYSl9LF9jb21wdXRlVmFsaWRTZXNzaW9uR3JvdXBzKCl7Y29uc3QgYT10Zi5ocGFyYW1zLnV0aWxzO2lmKHZvaWQgMD09PXRoaXMuc2Vzc2lvbkdyb3Vwcyl0aGlzLl92YWxpZFNlc3Npb25Hcm91cHM9dm9pZCAwO2Vsc2V7dmFyIGM9dGhpcy5vcHRpb25zLmNvbmZpZ3VyYXRpb24uc2NoZW1hO3RoaXMuX3ZhbGlkU2Vzc2lvbkdyb3Vwcz10aGlzLnNlc3Npb25Hcm91cHMuZmlsdGVyKGQ9Pntmb3IobGV0IGY9MDtmPGEubnVtQ29sdW1ucyhjKTsrK2YpaWYodGhpcy5vcHRpb25zLmNvbmZpZ3VyYXRpb24uY29sdW1uc1Zpc2liaWxpdHlbZl0mJnZvaWQgMD09PWEuY29sdW1uVmFsdWVCeUluZGV4KGMsCmQsZikpcmV0dXJuITE7cmV0dXJuITB9KX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldy90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXciLHByb3BlcnRpZXM6e2JhY2tlbmQ6T2JqZWN0LGV4cGVyaW1lbnROYW1lOlN0cmluZyxjb25maWd1cmF0aW9uOk9iamVjdCxzZXNzaW9uR3JvdXBzOkFycmF5fSxfY2xvc2VzdE9yU2VsZWN0ZWQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gbnVsbCE9PWE/YTpjfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90L3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90Iixwcm9wZXJ0aWVzOnt2aXNpYmxlU2NoZW1hOk9iamVjdCxzZXNzaW9uR3JvdXBzOkFycmF5LG9wdGlvbnM6T2JqZWN0LHNlbGVjdGVkU2Vzc2lvbkdyb3VwOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sY2xvc2VzdFNlc3Npb25Hcm91cDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbCxyZWFkT25seTohMCxub3RpZnk6ITB9LF9jb250YWluZXI6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9zdmc6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LHdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTowfSxoZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF9icnVzaGVkQ2VsbEluZGV4Ont0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfYnJ1c2hTZWxlY3Rpb246e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6WyJfc2Vzc2lvbkdyb3Vwc0NoYW5nZWQoc2Vzc2lvbkdyb3Vwcy4qKSIsCiJfdmlzaWJsZVNjaGVtYUNoYW5nZWQodmlzaWJsZVNjaGVtYS4qKSIsIl9yZWRyYXcob3B0aW9ucy4qKSJdLHJlYWR5KCl7dGhpcy5fY29udGFpbmVyPXRoaXMuJC5jb250YWluZXI7dGhpcy5fc3ZnPWQzLnNlbGVjdCh0aGlzLiQuc3ZnKTt0aGlzLl9yZWRyYXcoKX0sX3Nlc3Npb25Hcm91cHNDaGFuZ2VkKCl7bnVsbCE9PXRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXAmJnRoaXMuX3NldFNlbGVjdGVkU2Vzc2lvbkdyb3VwKHRmLmhwYXJhbXMudXRpbHMuc2Vzc2lvbkdyb3VwV2l0aE5hbWUodGhpcy5zZXNzaW9uR3JvdXBzLHRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXAubmFtZSl8fG51bGwpO3RoaXMuX3JlZHJhdygpfSxfdmlzaWJsZVNjaGVtYUNoYW5nZWQoKXt0aGlzLl9icnVzaFNlbGVjdGlvbj10aGlzLl9icnVzaGVkQ2VsbEluZGV4PW51bGw7dGhpcy5fcmVkcmF3KCl9LF9yZWRyYXcoKXt0aGlzLmRlYm91bmNlKCJfcmVkcmF3IiwoKT0+e2NvbnN0IGE9dGYuaHBhcmFtcy51dGlsczsKdGhpcy53aWR0aD1NYXRoLm1heCgxNTAqYS5udW1WaXNpYmxlQ29sdW1ucyh0aGlzLnZpc2libGVTY2hlbWEpLDEyMDApO3RoaXMuaGVpZ2h0PU1hdGgubWF4KDExMi41KmEubnVtVmlzaWJsZU1ldHJpY3ModGhpcy52aXNpYmxlU2NoZW1hKSw0ODApO3RoaXMuX2NvbnRhaW5lci5zdHlsZS53aWR0aD10aGlzLndpZHRoKyJweCI7dGhpcy5fY29udGFpbmVyLnN0eWxlLmhlaWdodD10aGlzLmhlaWdodCsicHgiO3RoaXMuX3N2Zy5hdHRyKCJ3aWR0aCIsdGhpcy53aWR0aCkuYXR0cigiaGVpZ2h0Iix0aGlzLmhlaWdodCk7dGhpcy5fc3ZnLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpO3RoaXMuX2RyYXcoKX0sMTAwKX0sX2RyYXcoKXtmdW5jdGlvbiBhKGxhKXtyZXR1cm4ieC1heGlzLWNsaXAtcGF0aC0iK2xhfWZ1bmN0aW9uIGMobGEpe3JldHVybiJ4LWxhYmVsLWNsaXAtcGF0aC0iK2xhfWZ1bmN0aW9uIGQobGEpe3JldHVybiJ5LWF4aXMtY2xpcC1wYXRoLSIrbGF9ZnVuY3Rpb24gZihsYSl7cmV0dXJuInktbGFiZWwtY2xpcC1wYXRoLSIrCmxhfWZ1bmN0aW9uIGcobGEsWixGYSx4YSx5YSl7RmE9TWF0aC5mbG9vcihGYS94YSk7eGE9Wi5zY2FsZSgpO2lmKCJRVUFOVElMRSI9PT15YSl7bGV0IEJhPXhhLnF1YW50aWxlcygpO0JhPWQzLnJhbmdlKDAsQmEubGVuZ3RoLE1hdGguY2VpbChCYS5sZW5ndGgvRmEpKS5tYXAoR2E9PkJhW0dhXSk7Wi50aWNrVmFsdWVzKEJhKS50aWNrRm9ybWF0KGQzLmZvcm1hdCgiLS4yZyIpKX0iTElORUFSIiE9PXlhJiYiTE9HIiE9PXlhfHxaLnRpY2tzKEZhKTtsYS5jYWxsKFopO2xhLnNlbGVjdEFsbCgiLmRvbWFpbiIpLnJlbW92ZSgpO2xhLnNlbGVjdEFsbCgiLnRpY2sgbGluZSIpLmF0dHIoInN0cm9rZSIsIiNkZGQiKX1mdW5jdGlvbiBsKGxhLFope3JldHVybiBQW1pdKHguX2NvbFZhbHVlKGxhLFopKX1mdW5jdGlvbiBrKGxhLFope3JldHVybiBIW1pdKHguX21ldHJpY1ZhbHVlKGxhLFopKX1mdW5jdGlvbiBuKGxhLFope2NvbnN0IEZhPVtdO1VbbGFdW1pdLmVhY2goZnVuY3Rpb24oKXtGYS5wdXNoKHRoaXMpfSk7CnJldHVybiBkMy5xdWFkdHJlZSgpLngoeGE9PmQzLnNlbGVjdCh4YSkuZGF0dW0oKS54KS55KHhhPT5kMy5zZWxlY3QoeGEpLmRhdHVtKCkueSkuYWRkQWxsKEZhKX1mdW5jdGlvbiBwKCl7bGV0IGxhPW5ldyBTZXQoUi5ub2RlcygpKTt2KCl8fChsYT1xKHguX2JydXNoZWRDZWxsSW5kZXgseC5fYnJ1c2hTZWxlY3Rpb24pKTtkMy5zZWxlY3RBbGwoQXJyYXkuZnJvbSh6LmZpbHRlclNldChsYSxaPT4hYWEuaGFzKFopKSkpLmF0dHIoImZpbGwiLEwpO2QzLnNlbGVjdEFsbChBcnJheS5mcm9tKHouZmlsdGVyU2V0KGFhLFo9PiFsYS5oYXMoWikpKSkuYXR0cigiZmlsbCIsIiNkZGQiKTthYT1sYX1mdW5jdGlvbiBxKGxhLFope2NvbnNvbGUuYXNzZXJ0KG51bGwhPT1sYSk7Y29uc29sZS5hc3NlcnQobnVsbCE9PVopO2NvbnN0IFtGYSx4YV09bGEseWE9bmV3IFNldDt6LnF1YWRUcmVlVmlzaXRQb2ludHNJblJlY3QoYmFbRmFdW3hhXSxaWzBdWzBdLFpbMF1bMV0sWlsxXVswXSxaWzFdWzFdLApCYT0+e2QzLnNlbGVjdChCYSkuZGF0dW0oKS5zZXNzaW9uR3JvdXBNYXJrZXJzLmZvckVhY2goR2E9Pnt5YS5hZGQoR2EpfSl9KTtyZXR1cm4geWF9ZnVuY3Rpb24gcihsYSl7Y29uc3QgWj1kMy5icnVzaFNlbGVjdGlvbihsYSk7IXQoKSYmbnVsbD09PVp8fHQoKSYmbGE9PT1tYS5ub2RlKCkmJl8uaXNFcXVhbChaLHguX2JydXNoU2VsZWN0aW9uKXx8KHguX2JydXNoU2VsZWN0aW9uPVosbnVsbCE9PVo/KG1hPWQzLnNlbGVjdChsYSkseC5fYnJ1c2hlZENlbGxJbmRleD1tYS5kYXR1bSgpKToobWE9bnVsbCx4Ll9icnVzaGVkQ2VsbEluZGV4PW51bGwpLHAoKSl9ZnVuY3Rpb24gdCgpe3JldHVybiBudWxsIT09eC5fYnJ1c2hlZENlbGxJbmRleCYmbnVsbCE9PXguX2JydXNoU2VsZWN0aW9ufWZ1bmN0aW9uIHYoKXtyZXR1cm4hdCgpfHx4Ll9icnVzaFNlbGVjdGlvblswXVswXT09PXguX2JydXNoU2VsZWN0aW9uWzFdWzBdfHx4Ll9icnVzaFNlbGVjdGlvblswXVsxXT09PXguX2JydXNoU2VsZWN0aW9uWzFdWzFdfQpmdW5jdGlvbiB5KGxhLFosRmEseGEseWEpe2xldCBCYT1JbmZpbml0eSxHYT1udWxsO3oucXVhZFRyZWVWaXNpdFBvaW50c0luRGlzayhiYVtsYV1bWl0sRmEseGEseWEsKHphLFVhKT0+e2FhLmhhcyh6YSkmJlVhPEJhJiYoemE9ZDMuc2VsZWN0KHphKS5kYXR1bSgpLEJhPVVhLEdhPXphLnNlc3Npb25Hcm91cCl9KTtyZXR1cm4gbnVsbD09PUdhP251bGw6ZDMuc2VsZWN0QWxsKFkuZ2V0KEdhKSl9Y29uc3Qgej10Zi5ocGFyYW1zLnV0aWxzLHg9dGhpcztpZih0aGlzLnNlc3Npb25Hcm91cHMmJjAhPXRoaXMuc2Vzc2lvbkdyb3Vwcy5sZW5ndGgmJnRoaXMudmlzaWJsZVNjaGVtYSYmMCE9dGhpcy52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zLmxlbmd0aCl7dmFyIEM9ZDMucmFuZ2Uoei5udW1WaXNpYmxlQ29sdW1ucyh4LnZpc2libGVTY2hlbWEpKSxGPWQzLnJhbmdlKHoubnVtVmlzaWJsZU1ldHJpY3MoeC52aXNpYmxlU2NoZW1hKSksRD1kMy5zY2FsZUJhbmQoKS5kb21haW4oQykucmFuZ2UoWzg1LAp0aGlzLndpZHRoLTEtNV0pLnBhZGRpbmdJbm5lciguMSksQj1kMy5zY2FsZUJhbmQoKS5kb21haW4oRikucmFuZ2UoW3RoaXMuaGVpZ2h0LTEtNS01MCw1XSkucGFkZGluZ0lubmVyKC4xKSxJPUQuYmFuZHdpZHRoKCksTz1CLmJhbmR3aWR0aCgpLFA9Qy5tYXAobGE9PnguX2NlbGxTY2FsZShsYSxbMCxJLTFdKSksSD1GLm1hcChsYT0+eC5fY2VsbFNjYWxlKGxhK3oubnVtVmlzaWJsZUhQYXJhbXMoeC52aXNpYmxlU2NoZW1hKSxbTy0xLDBdKSksSz10aGlzLl9zdmcuc2VsZWN0QWxsKCIueC1heGlzIikuZGF0YShDKS5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoIngtYXhpcyIsITApLmF0dHIoInRyYW5zZm9ybSIsbGE9PnoudHJhbnNsYXRlU3RyKEQobGEpLDApKTtLLmFwcGVuZCgiY2xpcFBhdGgiKS5hdHRyKCJpZCIsYSkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLTUpLmF0dHIoInkiLDApLmF0dHIoIndpZHRoIixJKzEwKS5hdHRyKCJoZWlnaHQiLHguaGVpZ2h0LTI1KTsKSy5hcHBlbmQoImNsaXBQYXRoIikuYXR0cigiaWQiLGMpLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLDApLmF0dHIoInkiLHguaGVpZ2h0LTI1KS5hdHRyKCJ3aWR0aCIsSSkuYXR0cigiaGVpZ2h0IiwyNSk7Sy5hcHBlbmQoImciKS5hdHRyKCJjbGlwLXBhdGgiLGxhPT4idXJsKCMiK2EobGEpKyIpIikuZWFjaChmdW5jdGlvbihsYSl7ZDMuc2VsZWN0KHRoaXMpLmNhbGwoZyxkMy5heGlzQm90dG9tKFBbbGFdKS50aWNrU2l6ZSh4LmhlaWdodC01MCksSSw0MCx4Lm9wdGlvbnMuY29sdW1uc1tsYV0uc2NhbGUpfSk7Sy5hcHBlbmQoImciKS5jbGFzc2VkKCJ4LWF4aXMtbGFiZWwiLCEwKS5hdHRyKCJjbGlwLXBhdGgiLGxhPT4idXJsKCMiK2MobGEpKyIpIikuYXBwZW5kKCJ0ZXh0IikuYXR0cigidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5hdHRyKCJ4IixJLzIpLmF0dHIoInkiLHguaGVpZ2h0LTEtMTIuNSkudGV4dChsYT0+ei5zY2hlbWFWaXNpYmxlQ29sdW1uTmFtZSh4LnZpc2libGVTY2hlbWEsCmxhKSkuYXBwZW5kKCJ0aXRsZSIpLnRleHQobGE9Pnouc2NoZW1hVmlzaWJsZUNvbHVtbk5hbWUoeC52aXNpYmxlU2NoZW1hLGxhKSk7Sz10aGlzLl9zdmcuc2VsZWN0QWxsKCIueS1heGlzIikuZGF0YShGKS5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoInktYXhpcyIsITApLmF0dHIoInRyYW5zZm9ybSIsbGE9PnoudHJhbnNsYXRlU3RyKHgud2lkdGgtMSxCKGxhKSkpO0suYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImlkIixkKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtKHgud2lkdGgtNDAtMSkpLmF0dHIoInkiLC01KS5hdHRyKCJ3aWR0aCIseC53aWR0aC00MCkuYXR0cigiaGVpZ2h0IixPKzEwKTtLLmFwcGVuZCgiY2xpcFBhdGgiKS5hdHRyKCJpZCIsZikuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLSh4LndpZHRoLTEpKS5hdHRyKCJ5IiwwKS5hdHRyKCJ3aWR0aCIsNDApLmF0dHIoImhlaWdodCIsTyk7Sy5hcHBlbmQoImciKS5hdHRyKCJjbGlwLXBhdGgiLGxhPT4idXJsKCMiKwpkKGxhKSsiKSIpLmVhY2goZnVuY3Rpb24obGEpe2QzLnNlbGVjdCh0aGlzKS5jYWxsKGcsZDMuYXhpc0xlZnQoSFtsYV0pLnRpY2tTaXplKHgud2lkdGgtODApLE8sMjAseC5vcHRpb25zLmNvbHVtbnNbbGErei5udW1WaXNpYmxlSFBhcmFtcyh4LnZpc2libGVTY2hlbWEpXS5zY2FsZSl9KTtLLmFwcGVuZCgiZyIpLmNsYXNzZWQoInktYXhpcy1sYWJlbCIsITApLmF0dHIoImNsaXAtcGF0aCIsbGE9PiJ1cmwoIyIrZihsYSkrIikiKS5hcHBlbmQoInRleHQiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLmF0dHIoIngiLC0oeC53aWR0aC0yMC0xKSkuYXR0cigieSIsTy8yKS5hdHRyKCJ0cmFuc2Zvcm0iLHoucm90YXRlU3RyKC0oeC53aWR0aC0yMC0xKSxPLzIpKS50ZXh0KGxhPT56Lm1ldHJpY05hbWUoeC52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zW2xhXSkpLmFwcGVuZCgidGl0bGUiKS50ZXh0KGxhPT56Lm1ldHJpY05hbWUoeC52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zW2xhXSkpOwpLPXRoaXMuX3N2Zy5zZWxlY3RBbGwoIi5jZWxsIikuZGF0YShkMy5jcm9zcyhDLEYpKS5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoImNlbGwiLCEwKS5hdHRyKCJ0cmFuc2Zvcm0iLChbbGEsWl0pPT56LnRyYW5zbGF0ZVN0cihEKGxhKSxCKFopKSk7Sy5hcHBlbmQoImciKS5jbGFzc2VkKCJmcmFtZSIsITApLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC01KS5hdHRyKCJ5IiwtNSkuYXR0cigid2lkdGgiLEkrMTApLmF0dHIoImhlaWdodCIsTysxMCkuYXR0cigic3Ryb2tlIiwiIzAwMCIpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigic2hhcGUtcmVuZGVyaW5nIiwiY3Jpc3BFZGdlcyIpO3ZhciBNPW51bGw7dm9pZCAwIT09eC5vcHRpb25zLmNvbG9yQnlDb2x1bW5JbmRleCYmKE09ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4odGhpcy5fY29sRXh0ZW50KHRoaXMub3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgpKS5yYW5nZShbdGhpcy5vcHRpb25zLm1pbkNvbG9yLHRoaXMub3B0aW9ucy5tYXhDb2xvcl0pLmludGVycG9sYXRlKGQzLmludGVycG9sYXRlTGFiKSk7CnZhciBMPXZvaWQgMD09PXgub3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXg/KCk9PiJyZWQiOih7c2Vzc2lvbkdyb3VwOmxhfSk9Pk0odGhpcy5fY29sVmFsdWUobGEseC5vcHRpb25zLmNvbG9yQnlDb2x1bW5JbmRleCkpLFtSLFUsWV09ZnVuY3Rpb24obGEsWil7Y29uc3QgRmE9bGEuc2VsZWN0QWxsKCIuZGF0YS1tYXJrZXIiKS5kYXRhKChbeWEsQmFdKT0+eC5zZXNzaW9uR3JvdXBzLmZpbHRlcihHYT0+dm9pZCAwIT09eC5fY29sVmFsdWUoR2EseWEpJiZ2b2lkIDAhPT14Ll9tZXRyaWNWYWx1ZShHYSxCYSkpLm1hcChHYT0+KHtjb2w6eWEsbWV0cmljOkJhLHNlc3Npb25Hcm91cDpHYSx4OmwoR2EseWEpLHk6ayhHYSxCYSksc2Vzc2lvbkdyb3VwTWFya2VyczpudWxsfSkpKS5lbnRlcigpLmFwcGVuZCgiY2lyY2xlIikuY2xhc3NlZCgiZGF0YS1tYXJrZXIiLCEwKS5hdHRyKCJjeCIsKHt4OnlhfSk9PnlhKS5hdHRyKCJjeSIsKHt5OnlhfSk9PnlhKS5hdHRyKCJyIiwyKS5hdHRyKCJmaWxsIiwKWikseGE9bmV3IE1hcDt4LnNlc3Npb25Hcm91cHMuZm9yRWFjaCh5YT0+e3hhLnNldCh5YSxbXSl9KTtGYS5lYWNoKGZ1bmN0aW9uKHlhKXt4YS5nZXQoeWEuc2Vzc2lvbkdyb3VwKS5wdXNoKHRoaXMpfSk7RmEuZWFjaCh5YT0+e2NvbnN0IEJhPXhhLmdldCh5YS5zZXNzaW9uR3JvdXApO3lhLnNlc3Npb25Hcm91cE1hcmtlcnM9bmV3IFNldChCYSl9KTtsYT1DLm1hcCh5YT0+Ri5tYXAoQmE9PkZhLmZpbHRlcihHYT0+R2EuY29sPT15YSYmR2EubWV0cmljPT1CYSkpKTtyZXR1cm5bRmEsbGEseGFdfShLLmFwcGVuZCgiZyIpLEwpLGJhPUMubWFwKGxhPT5GLm1hcChaPT5uKGxhLFopKSksbWE9bnVsbDt0KCkmJihtYT1LLmZpbHRlcihsYT0+Xy5pc0VxdWFsKGxhLHguX2JydXNoZWRDZWxsSW5kZXgpKSxjb25zb2xlLmFzc2VydCgxPT1tYS5zaXplKCksbWEpKTt2YXIgYWE9bmV3IFNldChSLm5vZGVzKCkpO3AoKTt2YXIgY2E9ZDMuYnJ1c2goKS5leHRlbnQoW1stNCwtNF0sW0ktMSs1LQoxLE8tMSs1LTFdXSkub24oInN0YXJ0IixmdW5jdGlvbigpe3QoKSYmbWEubm9kZSgpIT10aGlzJiZjYS5tb3ZlKG1hLG51bGwpO3IodGhpcyl9KS5vbigiYnJ1c2giLGZ1bmN0aW9uKCl7cih0aGlzKX0pLm9uKCJlbmQiLGZ1bmN0aW9uKCl7cih0aGlzKX0pO0suY2FsbChjYSk7dCgpJiZjYS5tb3ZlKG1hLHguX2JydXNoU2VsZWN0aW9uKTt2YXIgZmE9bnVsbCxkYT1udWxsO251bGwhPT10aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwJiYoZGE9ZDMuc2VsZWN0QWxsKFkuZ2V0KHRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXApKS5jbGFzc2VkKCJzZWxlY3RlZC1tYXJrZXIiLCEwKSk7Sy5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dmFyIGxhPWZhPT09ZGE/bnVsbDpmYTtsYSE9PWRhJiYobnVsbCE9PWRhJiZkYS5jbGFzc2VkKCJzZWxlY3RlZC1tYXJrZXIiLCExKSxkYT1sYSxudWxsIT09ZGEmJmRhLmNsYXNzZWQoInNlbGVjdGVkLW1hcmtlciIsITApLGxhPW51bGw9PT1kYT9udWxsOmRhLmRhdHVtKCkuc2Vzc2lvbkdyb3VwLAp4Ll9zZXRTZWxlY3RlZFNlc3Npb25Hcm91cChsYSkpfSkub24oIm1vdXNlbW92ZSBtb3VzZWVudGVyIixmdW5jdGlvbihbbGEsWl0pe2NvbnN0IFtGYSx4YV09ZDMubW91c2UodGhpcyk7bGE9eShsYSxaLEZhLHhhLDIwKTtmYSE9PWxhJiYobnVsbCE9PWZhJiZmYS5jbGFzc2VkKCJjbG9zZXN0LW1hcmtlciIsITEpLGZhPWxhLG51bGwhPT1mYT8oZmEuY2xhc3NlZCgiY2xvc2VzdC1tYXJrZXIiLCEwKSx4Ll9zZXRDbG9zZXN0U2Vzc2lvbkdyb3VwKGZhLmRhdHVtKCkuc2Vzc2lvbkdyb3VwKSk6eC5fc2V0Q2xvc2VzdFNlc3Npb25Hcm91cChudWxsKSl9KS5vbigibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXtudWxsIT09ZmEmJihmYS5jbGFzc2VkKCJjbG9zZXN0LW1hcmtlciIsITEpLGZhPW51bGwseC5fc2V0Q2xvc2VzdFNlc3Npb25Hcm91cChudWxsKSl9KTt0aGlzLl9zdmcuc2VsZWN0QWxsKCIqIikuY2xhc3NlZCgidGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QiLCEwKX19LApfY2VsbFNjYWxlKGEsYyl7dmFyIGQ9dGhpcy5fY29sRXh0ZW50KGEpO2NvbnN0IGY9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oZCkucmFuZ2UoYyk7aWYoIkxJTkVBUiI9PT10aGlzLm9wdGlvbnMuY29sdW1uc1thXS5zY2FsZSlyZXR1cm4gZjtpZigiTE9HIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW2FdLnNjYWxlKXJldHVybiAwPj1kWzBdJiYwPD1kWzFdP2Y6ZDMuc2NhbGVMb2coKS5kb21haW4oZCkucmFuZ2UoYyk7aWYoIlFVQU5USUxFIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW2FdLnNjYWxlKXtjb25zdCBnPShjWzFdLWNbMF0pLzE5O2Q9ZDMucmFuZ2UoMjApLm1hcChsPT5jWzBdK2cqbCk7cmV0dXJuIGQzLnNjYWxlUXVhbnRpbGUoKS5kb21haW4oXy51bmlxKHRoaXMuc2Vzc2lvbkdyb3Vwcy5tYXAobD0+dGhpcy5fY29sVmFsdWUobCxhKSkpKS5yYW5nZShkKX1pZigiTk9OX05VTUVSSUMiPT09dGhpcy5vcHRpb25zLmNvbHVtbnNbYV0uc2NhbGUpcmV0dXJuIGQzLnNjYWxlUG9pbnQoKS5kb21haW4oXy51bmlxKHRoaXMuc2Vzc2lvbkdyb3Vwcy5tYXAoZz0+CnRoaXMuX2NvbFZhbHVlKGcsYSkpLnNvcnQoKSkpLnJhbmdlKGMpLnBhZGRpbmcoLjEpO3Rocm93IlVua25vd24gc2NhbGUgZm9yIGNvbHVtbjogIithKyIuIG9wdGlvbnM6ICIrdGhpcy5vcHRpb25zO30sX2NvbFZhbHVlKGEsYyl7cmV0dXJuIHRmLmhwYXJhbXMudXRpbHMuY29sdW1uVmFsdWVCeVZpc2libGVJbmRleCh0aGlzLnZpc2libGVTY2hlbWEsYSxjKX0sX21ldHJpY1ZhbHVlKGEsYyl7cmV0dXJuIHRmLmhwYXJhbXMudXRpbHMubWV0cmljVmFsdWVCeVZpc2libGVJbmRleCh0aGlzLnZpc2libGVTY2hlbWEsYSxjKX0sX2NvbEV4dGVudChhKXtyZXR1cm4gdGYuaHBhcmFtcy51dGlscy52aXNpYmxlTnVtZXJpY0NvbHVtbkV4dGVudCh0aGlzLnZpc2libGVTY2hlbWEsdGhpcy5zZXNzaW9uR3JvdXBzLGEpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3L3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Iixwcm9wZXJ0aWVzOntiYWNrZW5kOk9iamVjdCxleHBlcmltZW50TmFtZTpTdHJpbmcsY29uZmlndXJhdGlvbjpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheX0sX2Nsb3Nlc3RPclNlbGVjdGVkOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIG51bGwhPT1hP2E6Y319KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXNlc3Npb25zLXBhbmUvdGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2Vzc2lvbnMtcGFuZSIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsaGVscFVybDpTdHJpbmcsYnVnUmVwb3J0VXJsOlN0cmluZyxleHBlcmltZW50TmFtZTpTdHJpbmcsY29uZmlndXJhdGlvbjpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheSxfc2VsZWN0ZWRUYWI6e3R5cGU6TnVtYmVyLHZhbHVlOjB9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtZ29vZ2xlLWFuYWx5dGljcy10cmFja2VyL3RmLWhwYXJhbXMtZ29vZ2xlLWFuYWx5dGljcy10cmFja2VyLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWhwYXJhbXMtZ29vZ2xlLWFuYWx5dGljcy10cmFja2VyIixoYW5kbGVFdmVudDpmdW5jdGlvbigpe319KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1tYWluL3RmLWhwYXJhbXMtbWFpbi5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLW1haW4iLHByb3BlcnRpZXM6e2JhY2tlbmQ6T2JqZWN0LGV4cGVyaW1lbnROYW1lOlN0cmluZyx0cmFja2luZ0lkOlN0cmluZyxoZWxwVXJsOlN0cmluZyxidWdSZXBvcnRVcmw6U3RyaW5nLF9jb25maWd1cmF0aW9uOk9iamVjdCxfc2Vzc2lvbkdyb3VwczpBcnJheSxfdGhyb3R0bGVkU2VuZEV2ZW50VG9HQTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+Xy50aHJvdHRsZShmdW5jdGlvbigpe3RoaXMuX2hhbmRsZUdBRXZlbnQoe2RldGFpbDp7aGl0VHlwZToiZXZlbnQiLGV2ZW50Q2F0ZWdvcnk6IlVzZXJJbnRlcmFjdGlvbiIsZXZlbnRMYWJlbDoiRXhwZXJpbWVudDogIit0aGlzLmV4cGVyaW1lbnROYW1lfX0pfSw2RTQse2xlYWRpbmc6ITB9KX19LGxpc3RlbmVyczp7bW91c2Vtb3ZlOiJfc2VuZEV2ZW50VG9HQSIsdGFwOiJfc2VuZEV2ZW50VG9HQSIsImdvb2dsZS1hbmFseXRpY3MtdHJhY2tpbmciOiJfaGFuZGxlR0FFdmVudCJ9LGF0dGFjaGVkKCl7dGhpcy5faGFuZGxlR0FFdmVudCh7ZGV0YWlsOntoaXRUeXBlOiJwYWdldmlldyJ9fSl9LApyZWxvYWQoKXt0aGlzLiRbInF1ZXJ5LXBhbmUiXS5yZWxvYWQoKX0sX3NlbmRFdmVudFRvR0EoKXt0aGlzLl90aHJvdHRsZWRTZW5kRXZlbnRUb0dBKHRoaXMpfSxfaGFuZGxlR0FFdmVudChhKXt0aGlzLiQudHJhY2tlci5oYW5kbGVFdmVudChhKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLWJhY2tlbmQvdGYtaHBhcmFtcy1iYWNrZW5kLmh0bWwuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXtjbGFzcyBke2NvbnN0cnVjdG9yKGYsZyxsPSEwKXt0aGlzLl9hcGlVcmw9Zjt0aGlzLl9yZXF1ZXN0TWFuYWdlcj1nO3RoaXMuX3VzZUh0dHBHZXQ9bH1nZXRFeHBlcmltZW50KGYpe3JldHVybiB0aGlzLl9zZW5kUmVxdWVzdCgiZXhwZXJpbWVudCIsZil9bGlzdFNlc3Npb25Hcm91cHMoZil7cmV0dXJuIHRoaXMuX3NlbmRSZXF1ZXN0KCJzZXNzaW9uX2dyb3VwcyIsZil9bGlzdE1ldHJpY0V2YWxzKGYpe3JldHVybiB0aGlzLl9zZW5kUmVxdWVzdCgibWV0cmljX2V2YWxzIixmKX1fc2VuZFJlcXVlc3QoZixnKXtpZih0aGlzLl91c2VIdHRwR2V0KXJldHVybiBnPWVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShnKSksdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0aGlzLl9hcGlVcmwrIi8iK2YrIj9yZXF1ZXN0XHgzZCIrZyk7Y29uc3QgbD1uZXcgUW8uUmVxdWVzdE9wdGlvbnM7bC53aXRoQ3JlZGVudGlhbHM9ITA7CmwubWV0aG9kVHlwZT0iUE9TVCI7bC5jb250ZW50VHlwZT0idGV4dC9wbGFpbiI7bC5ib2R5PUpTT04uc3RyaW5naWZ5KGcpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0V2l0aE9wdGlvbnModGhpcy5fYXBpVXJsKyIvIitmLGwpfX1jLkJhY2tlbmQ9ZH0pKGEuaHBhcmFtc3x8KGEuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtZGFzaGJvYXJkL3RmLWhwYXJhbXMtZGFzaGJvYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWhwYXJhbXMtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfYmFja2VuZDp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB0Zi5ocGFyYW1zLkJhY2tlbmQoUW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImhwYXJhbXMiLCIiKSxuZXcgUW8uUmVxdWVzdE1hbmFnZXIsISEod2luZG93LlRFTlNPUkJPQVJEX0VOVnx8e30pLklOX0NPTEFCKX19LHJlbG9hZCgpe3RoaXMuJFsiaHBhcmFtcy1tYWluIl0ucmVsb2FkKCl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltcG9ydHMvYXJyYXktYnVmZmVyLWRhdGEtcHJvdmlkZXIuanMKdmFyIFh0OwooZnVuY3Rpb24oYSl7YS5FcnJvckNvZGVzPXtDQU5DRUxMRUQ6MX07Y29uc3QgYz17VkVSVEVYOjEsRkFDRToyLENPTE9SOjN9LGQ9e1ZFUlRFWDoiZmxvYXQzMiIsRkFDRToiaW50MzIiLENPTE9SOiJ1aW50OCJ9O2NsYXNzIGZ7Y29uc3RydWN0b3IoZyl7dGhpcy5fcmVxdWVzdE1hbmFnZXI9Zzt0aGlzLl9jYW5jZWxsZXI9bmV3IFFvLkNhbmNlbGxlcn1yZWxvYWQoZyxsLGspe3RoaXMuX2NhbmNlbGxlci5jYW5jZWxBbGwoKTtyZXR1cm4gdGhpcy5fZmV0Y2hNZXRhZGF0YShnLGwsayl9X2ZldGNoRGF0YUJ5U3RlcChnLGwsayxuLHAscSl7ZnVuY3Rpb24gcih0KXtsZXQgdj1bXTtmb3IobGV0IHk9MDt5PHQubGVuZ3RoLzM7eSsrKXtsZXQgej1bXTtmb3IobGV0IHg9MDszPng7eCsrKXoucHVzaCh0WzMqeSt4XSk7di5wdXNoKHopfXJldHVybiB2fWc9UW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoIm1lc2giLCIvZGF0YSIsbmV3IFVSTFNlYXJjaFBhcmFtcyh7dGFnOmwscnVuOmcsCmNvbnRlbnRfdHlwZTprLHNhbXBsZTpuLHN0ZXA6cH0pKTtsPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZSh0PT57aWYodC5jYW5jZWxsZWQpcmV0dXJuIFByb21pc2UucmVqZWN0KHtjb2RlOmEuRXJyb3JDb2Rlcy5DQU5DRUxMRUQsbWVzc2FnZToiUmVzcG9uc2Ugd2FzIGludmFsaWRhdGVkLiJ9KTt0PXQudmFsdWU7c3dpdGNoKGspe2Nhc2UgIlZFUlRFWCI6cS52ZXJ0aWNlcz1yKG5ldyBGbG9hdDMyQXJyYXkodCkpO2JyZWFrO2Nhc2UgIkZBQ0UiOnEuZmFjZXM9cihuZXcgSW50MzJBcnJheSh0KSk7YnJlYWs7Y2FzZSAiQ09MT1IiOnEuY29sb3JzPXIobmV3IFVpbnQ4QXJyYXkodCkpfXJldHVybiBxfSk7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLmZldGNoKGcsbnVsbCwiYXJyYXlidWZmZXIiLGRba10pLnRoZW4odD0+dC5hcnJheUJ1ZmZlcigpKS50aGVuKGwpfWZldGNoRGF0YShnLGwsayxuKXtsZXQgcD1bXSxxPW5ldyBNYXA7T2JqZWN0LmtleXMoYykuZm9yRWFjaChyPT4Ke2cuY29tcG9uZW50cyYxPDxjW3JdJiZwLnB1c2godGhpcy5fZmV0Y2hEYXRhQnlTdGVwKGwsayxyLG4sZy5zdGVwLHEpKX0pO3JldHVybiBQcm9taXNlLmFsbChwKX1fZmV0Y2hNZXRhZGF0YShnLGwsayl7dGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO2c9UW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoIm1lc2giLCIvbWVzaGVzIixuZXcgVVJMU2VhcmNoUGFyYW1zKHt0YWc6bCxydW46ZyxzYW1wbGU6a30pKTtsPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShuPT5uLmNhbmNlbGxlZD9Qcm9taXNlLnJlamVjdCh7Y29kZTphLkVycm9yQ29kZXMuQ0FOQ0VMTEVELG1lc3NhZ2U6IlJlc3BvbnNlIHdhcyBpbnZhbGlkYXRlZC4ifSk6bi52YWx1ZSk7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLmZldGNoKGcpLnRoZW4obj0+bi5qc29uKCkpLnRoZW4obCkudGhlbih0aGlzLl9wcm9jZXNzTWV0YWRhdGEuYmluZCh0aGlzKSl9X3Byb2Nlc3NNZXRhZGF0YShnKXtpZihnKXt2YXIgbD0KbmV3IE1hcDtmb3IobGV0IG49MDtuPGcubGVuZ3RoO24rKyl7bGV0IHA9Z1tuXTtsLmhhcyhwLnN0ZXApfHxsLnNldChwLnN0ZXAsW10pO2wuZ2V0KHAuc3RlcCkucHVzaChwKX12YXIgaz1bXTtsLmZvckVhY2gobj0+e249dGhpcy5fY3JlYXRlU3RlcERhdHVtKG5bMF0pO2sucHVzaChuKX0pO3JldHVybiBrfX1fY3JlYXRlU3RlcERhdHVtKGcpe3JldHVybnt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKmcud2FsbF90aW1lKSxzdGVwOmcuc3RlcCxjb25maWc6Zy5jb25maWcsY29udGVudF90eXBlOmcuY29udGVudF90eXBlLGNvbXBvbmVudHM6Zy5jb21wb25lbnRzfX19YS5BcnJheUJ1ZmZlckRhdGFQcm92aWRlcj1mfSkoWHR8fChYdD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltcG9ydHMvbWVzaC12aWV3ZXIuanMKKGZ1bmN0aW9uKGEpe2NsYXNzIGMgZXh0ZW5kcyBUSFJFRS5FdmVudERpc3BhdGNoZXJ7Y29uc3RydWN0b3IoZCl7c3VwZXIoKTt0aGlzLl9sYXN0TWVzaD1udWxsO3RoaXMuX2Nsb2NrPW5ldyBUSFJFRS5DbG9jazt0aGlzLl9jYW52YXNTaXplPW51bGw7dGhpcy5fcnVuQ29sb3I9ZH1faXNPYmplY3QoZCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBkJiZudWxsIT1kJiYhQXJyYXkuaXNBcnJheShkKX1fYXBwbHlEZWZhdWx0cyhkLGYpe2xldCBnPXt9O2Q9W2QsZl07Zm9yKGY9MDtmPGQubGVuZ3RoO2YrKyl7Y29uc3QgbD1kW2ZdO2ZvcihsZXQgayBpbiBsKXtjb25zdCBuPWsgaW4gZzt0aGlzLl9pc09iamVjdChsW2tdKT9nW2tdPXRoaXMuX2FwcGx5RGVmYXVsdHMoZ1trXXx8e30sbFtrXSk6bnx8KGdba109bFtrXSl9fXJldHVybiBnfV9jcmVhdGVXb3JsZChkLGYpe3RoaXMuaXNSZWFkeSgpfHwodGhpcy5fc2NlbmU9bmV3IFRIUkVFLlNjZW5lLHRoaXMuX2NhbWVyYT1kPW5ldyBUSFJFRVtkLmNhbWVyYS5jbHNdKGQuY2FtZXJhLmZvdiwKdGhpcy5fY2FudmFzU2l6ZS53aWR0aC90aGlzLl9jYW52YXNTaXplLmhlaWdodCxkLmNhbWVyYS5uZWFyLGQuY2FtZXJhLmZhciksZj1uZXcgVEhSRUUuT3JiaXRDb250cm9scyhkLGYpLGYubG9va1NwZWVkPS40LGYubW92ZW1lbnRTcGVlZD0yMCxmLm5vRmx5PSEwLGYubG9va1ZlcnRpY2FsPSEwLGYuY29uc3RyYWluVmVydGljYWw9ITAsZi52ZXJ0aWNhbE1pbj0xLGYudmVydGljYWxNYXg9MixmLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsdGhpcy5fb25DYW1lcmFQb3NpdGlvbkNoYW5nZS5iaW5kKHRoaXMpKSx0aGlzLl9jYW1lcmFDb250cm9scz1mLHRoaXMuX3JlbmRlcmVyPW5ldyBUSFJFRS5XZWJHTFJlbmRlcmVyKHthbnRpYWxpYXM6ITB9KSx0aGlzLl9yZW5kZXJlci5zZXRQaXhlbFJhdGlvKCksdGhpcy5fcmVuZGVyZXIuc2V0U2l6ZSh0aGlzLl9jYW52YXNTaXplLndpZHRoLHRoaXMuX2NhbnZhc1NpemUuaGVpZ2h0KSx0aGlzLl9yZW5kZXJlci5zZXRDbGVhckNvbG9yKDE2Nzc3MjE1LAoxKSl9X2NsZWFyU2NlbmUoKXtmb3IoOzA8dGhpcy5fc2NlbmUuY2hpbGRyZW4ubGVuZ3RoOyl0aGlzLl9zY2VuZS5yZW1vdmUodGhpcy5fc2NlbmUuY2hpbGRyZW5bMF0pfWdldFJlbmRlcmVyKCl7cmV0dXJuIHRoaXMuX3JlbmRlcmVyfWdldENhbWVyYUNvbnRyb2xzKCl7cmV0dXJuIHRoaXMuX2NhbWVyYUNvbnRyb2xzfWlzUmVhZHkoKXtyZXR1cm4hIXRoaXMuX2NhbWVyYSYmISF0aGlzLl9jYW1lcmFDb250cm9sc31nZXRDYW1lcmFQb3NpdGlvbigpe3JldHVybntmYXI6dGhpcy5fY2FtZXJhLmZhcixwb3NpdGlvbjp0aGlzLl9jYW1lcmEucG9zaXRpb24uY2xvbmUoKSx0YXJnZXQ6dGhpcy5fY2FtZXJhQ29udHJvbHMudGFyZ2V0LmNsb25lKCl9fXNldENhbnZhc1NpemUoZCl7dGhpcy5fY2FudmFzU2l6ZT1kfWRyYXcoKXt0aGlzLl9hbmltYXRpb25GcmFtZUluZGV4JiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9hbmltYXRpb25GcmFtZUluZGV4KTt0aGlzLl9jYW1lcmEuYXNwZWN0PQp0aGlzLl9jYW52YXNTaXplLndpZHRoL3RoaXMuX2NhbnZhc1NpemUuaGVpZ2h0O3RoaXMuX2NhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7dGhpcy5fcmVuZGVyZXIuc2V0U2l6ZSh0aGlzLl9jYW52YXNTaXplLndpZHRoLHRoaXMuX2NhbnZhc1NpemUuaGVpZ2h0KTtjb25zdCBkPWZ1bmN0aW9uKCl7dmFyIGY9dGhpcy5fY2xvY2suZ2V0RGVsdGEoKTt0aGlzLl9jYW1lcmFDb250cm9scy51cGRhdGUoZik7dGhpcy5fYW5pbWF0aW9uRnJhbWVJbmRleD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZCk7dGhpcy5fcmVuZGVyZXIucmVuZGVyKHRoaXMuX3NjZW5lLHRoaXMuX2NhbWVyYSl9LmJpbmQodGhpcyk7ZCgpfXVwZGF0ZVNjZW5lKGQsZil7bGV0IGc9e307ImNvbmZpZyJpbiBkJiZkLmNvbmZpZyYmKGc9SlNPTi5wYXJzZShkLmNvbmZpZykpO3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiYmVmb3JlVXBkYXRlU2NlbmUifSk7Zz10aGlzLl9hcHBseURlZmF1bHRzKGcse2NhbWVyYTp7Y2xzOiJQZXJzcGVjdGl2ZUNhbWVyYSIsCmZvdjo3NSxuZWFyOi4xLGZhcjoxRTN9LGxpZ2h0czpbe2NsczoiQW1iaWVudExpZ2h0Iixjb2xvcjoiI2ZmZmZmZiIsaW50ZW5zaXR5Oi43NX0se2NsczoiRGlyZWN0aW9uYWxMaWdodCIsY29sb3I6IiNmZmZmZmYiLGludGVuc2l0eTouNzUscG9zaXRpb246WzAsLTEsMl19XX0pO3RoaXMuX2NyZWF0ZVdvcmxkKGcsZik7dGhpcy5fY2xlYXJTY2VuZSgpO3RoaXMuX2NyZWF0ZUxpZ2h0cyh0aGlzLl9zY2VuZSxnKTt0aGlzLl9jcmVhdGVHZW9tZXRyeShkLGcpO3RoaXMuZHJhdygpfXJlc2V0Vmlldygpe2lmKHRoaXMuaXNSZWFkeSgpKXt0aGlzLl9jYW1lcmFDb250cm9scy5yZXNldCgpO2lmKCFkJiZ0aGlzLl9sYXN0TWVzaCl2YXIgZD10aGlzLl9sYXN0TWVzaDtkJiYodGhpcy5fZml0T2JqZWN0VG9WaWV3cG9ydChkKSx0aGlzLl9sYXN0TWVzaD1kKTt0aGlzLl9jYW1lcmFDb250cm9scy51cGRhdGUoKX19X2NyZWF0ZUdlb21ldHJ5KGQsZil7ZD1kLm1lc2g7ZC52ZXJ0aWNlcyYmZC5mYWNlcyYmCmQuZmFjZXMubGVuZ3RoP3RoaXMuX2NyZWF0ZU1lc2goZCxmKTp0aGlzLl9jcmVhdGVQb2ludENsb3VkKGQsZil9X2NyZWF0ZVBvaW50Q2xvdWQoZCxmKXt2YXIgZz1kLnZlcnRpY2VzO2Q9ZC5jb2xvcnM7bGV0IGw9e21hdGVyaWFsOntjbHM6IlBvaW50c01hdGVyaWFsIixzaXplOi4wMDV9fTtkJiZkLmxlbmd0aD09Zy5sZW5ndGg/bC5tYXRlcmlhbC52ZXJ0ZXhDb2xvcnM9VEhSRUUuVmVydGV4Q29sb3JzOmwubWF0ZXJpYWwuY29sb3I9dGhpcy5fcnVuQ29sb3I7Zj10aGlzLl9hcHBseURlZmF1bHRzKGYsbCk7dmFyIGs9bmV3IFRIUkVFLkdlb21ldHJ5O2cuZm9yRWFjaChmdW5jdGlvbihuKXt2YXIgcD1uZXcgVEhSRUUuVmVjdG9yMyhuWzBdLG5bMV0sblsyXSk7cC54PTEqblswXTtwLnk9MSpuWzFdO3Auej0xKm5bMl07ay52ZXJ0aWNlcy5wdXNoKHApfSk7ZCYmZC5sZW5ndGg9PWcubGVuZ3RoJiZkLmZvckVhY2goZnVuY3Rpb24obil7bj1uZXcgVEhSRUUuQ29sb3IoblswXS8yNTUsCm5bMV0vMjU1LG5bMl0vMjU1KTtrLmNvbG9ycy5wdXNoKG4pfSk7Zz1uZXcgVEhSRUVbZi5tYXRlcmlhbC5jbHNdKGYubWF0ZXJpYWwpO2c9bmV3IFRIUkVFLlBvaW50cyhrLGcpO3RoaXMuX3NjZW5lLmFkZChnKTt0aGlzLl9sYXN0TWVzaD1nfXNldENhbWVyYVZpZXdwb2ludChkLGYsZyl7dGhpcy5fc2lsZW50PSEwO3RoaXMuX2NhbWVyYS5mYXI9Zjt0aGlzLl9jYW1lcmEucG9zaXRpb24uc2V0KGQueCxkLnksZC56KTt0aGlzLl9jYW1lcmEubG9va0F0KGcuY2xvbmUoKSk7dGhpcy5fY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTt0aGlzLl9jYW1lcmFDb250cm9scy50YXJnZXQ9Zy5jbG9uZSgpO3RoaXMuX2NhbWVyYUNvbnRyb2xzLnVwZGF0ZSgpO3RoaXMuX3NpbGVudD0hMX1fb25DYW1lcmFQb3NpdGlvbkNoYW5nZShkKXt0aGlzLl9zaWxlbnR8fHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiY2FtZXJhUG9zaXRpb25DaGFuZ2UiLGV2ZW50OmR9KX1fZml0T2JqZWN0VG9WaWV3cG9ydChkKXt2YXIgZj0KbmV3IFRIUkVFLkJveDM7Zi5zZXRGcm9tT2JqZWN0KGQpO2Q9Zi5jZW50ZXIoKTt2YXIgZz1mLnNpemUoKTtnPTEuMjUqTWF0aC5hYnMoTWF0aC5tYXgoZy54LGcueSxnLnopLygyKk1hdGgudGFuKE1hdGguUEkvMTgwKnRoaXMuX2NhbWVyYS5mb3YvMikpKTtmPWYubWluLno7dGhpcy5zZXRDYW1lcmFWaWV3cG9pbnQoe3g6ZC54LHk6ZC55LHo6Z30sMyooMD5mPy1mK2c6Zy1mKSxkKX1fY3JlYXRlTWVzaChkLGYpe3ZhciBnPWQudmVydGljZXM7Y29uc3QgbD1kLmZhY2VzLGs9ZC5jb2xvcnM7ZD10aGlzLl9hcHBseURlZmF1bHRzKGYse21hdGVyaWFsOntjbHM6Ik1lc2hTdGFuZGFyZE1hdGVyaWFsIixjb2xvcjoiI2EwYTBhMCIscm91Z2huZXNzOjEsbWV0YWxuZXNzOjB9fSk7bGV0IG49bmV3IFRIUkVFLkdlb21ldHJ5O2cuZm9yRWFjaChmdW5jdGlvbihwKXtsZXQgcT1uZXcgVEhSRUUuVmVjdG9yMyhwWzBdLHBbMV0scFsyXSk7cS54PTEqcFswXTtxLnk9MSpwWzFdO3Euej0xKnBbMl07Cm4udmVydGljZXMucHVzaChxKX0pO2wuZm9yRWFjaChmdW5jdGlvbihwKXtsZXQgcT1uZXcgVEhSRUUuRmFjZTMocFswXSxwWzFdLHBbMl0pO2lmKGsmJmsubGVuZ3RoKXtwPVtrW3BbMF1dLGtbcFsxXV0sa1twWzJdXV07Zm9yKGxldCB0PTA7dDxwLmxlbmd0aDt0Kyspe3ZhciByPXBbdF07cj1uZXcgVEhSRUUuQ29sb3IoclswXS8yNTUsclsxXS8yNTUsclsyXS8yNTUpO3EudmVydGV4Q29sb3JzLnB1c2gocil9fW4uZmFjZXMucHVzaChxKX0pO2smJmsubGVuZ3RoJiYoZC5tYXRlcmlhbD1kLm1hdGVyaWFsfHx7fSxkLm1hdGVyaWFsLnZlcnRleENvbG9ycz1USFJFRS5WZXJ0ZXhDb2xvcnMpO24uY2VudGVyKCk7bi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtuLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7Zz1uZXcgVEhSRUVbZC5tYXRlcmlhbC5jbHNdKGQubWF0ZXJpYWwpO2c9bmV3IFRIUkVFLk1lc2gobixnKTtnLmNhc3RTaGFkb3c9ITA7Zy5yZWNlaXZlU2hhZG93PSEwO3RoaXMuX3NjZW5lLmFkZChnKTsKdGhpcy5fbGFzdE1lc2g9Z31fY3JlYXRlTGlnaHRzKGQsZil7Zm9yKGxldCBnPTA7ZzxmLmxpZ2h0cy5sZW5ndGg7ZysrKXtjb25zdCBsPWYubGlnaHRzW2ddO2xldCBrPW5ldyBUSFJFRVtsLmNsc10obC5jb2xvcixsLmludGVuc2l0eSk7bC5wb3NpdGlvbiYmay5wb3NpdGlvbi5zZXQobC5wb3NpdGlvblswXSxsLnBvc2l0aW9uWzFdLGwucG9zaXRpb25bMl0pO2QuYWRkKGspfX19YS5NZXNoVmlld2VyPWN9KShYdHx8KFh0PXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtbWVzaC1kYXNoYm9hcmQvbWVzaC1sb2FkZXIuanMKKGZ1bmN0aW9uKGEpe1BvbHltZXIoe2lzOiJ0Zi1tZXNoLWxvYWRlciIscHJvcGVydGllczp7cnVuOlN0cmluZyx0YWc6U3RyaW5nLHNhbXBsZTpOdW1iZXIsb2ZTYW1wbGVzOk51bWJlcixzZWxlY3RlZFZpZXc6e3R5cGU6U3RyaW5nLHZhbHVlOiJhbGwifSxhY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0scmVxdWVzdE1hbmFnZXI6T2JqZWN0LF9tZXNoVmlld2VyOnt0eXBlOk9iamVjdH0sX2RhdGFQcm92aWRlcjp7dHlwZTpPYmplY3R9LF9jb2xvclNjYWxlRnVuY3Rpb246e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5Yby5ydW5zQ29sb3JTY2FsZX0sX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0sX3N0ZXBzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXSxub3RpZnk6ITB9LF9zdGVwSW5kZXg6e3R5cGU6TnVtYmVyLG5vdGlmeTohMH0sX2N1cnJlbnRTdGVwOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2NvbXB1dGVDdXJyZW50U3RlcChfc3RlcHMsIF9zdGVwSW5kZXgpIn0sCl9tZXNoVmlld2VyQXR0YWNoZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NhbWVyYVBvc2l0aW9uSW5pdGlhbGl6ZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3N0ZXBWYWx1ZTp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlU3RlcFZhbHVlKF9jdXJyZW50U3RlcCkifSxfY3VycmVudFdhbGxUaW1lOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVDdXJyZW50V2FsbFRpbWUoX2N1cnJlbnRTdGVwKSJ9LF9pc01lc2hMb2FkaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVuLCB0YWcsIGFjdGl2ZSwgX2RhdGFQcm92aWRlciwgX21lc2hWaWV3ZXIpIiwiX3VwZGF0ZVNjZW5lKF9jdXJyZW50U3RlcC4qLCBfbWVzaFZpZXdlcikiLCJfZGVib3VuY2VkRmV0Y2hNZXNoKF9jdXJyZW50U3RlcCkiLCJfdXBkYXRlVmlldyhzZWxlY3RlZFZpZXcpIl0sX2NvbXB1dGVSdW5Db2xvcjpmdW5jdGlvbihjKXtyZXR1cm4gdGhpcy5fY29sb3JTY2FsZUZ1bmN0aW9uKGMpfSwKYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9kYXRhUHJvdmlkZXI9bmV3IGEuQXJyYXlCdWZmZXJEYXRhUHJvdmlkZXIodGhpcy5yZXF1ZXN0TWFuYWdlcik7Y29uc3QgYz1uZXcgYS5NZXNoVmlld2VyKHRoaXMuX3J1bkNvbG9yKTtjLmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZVVwZGF0ZVNjZW5lIix0aGlzLl91cGRhdGVDYW52YXNTaXplLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2FtZXJhUG9zaXRpb25DaGFuZ2UiLHRoaXMuX29uQ2FtZXJhUG9zaXRpb25DaGFuZ2UuYmluZCh0aGlzKSk7dGhpcy5fbWVzaFZpZXdlcj1jfSxyZWxvYWQ6ZnVuY3Rpb24oKXt0aGlzLmFjdGl2ZSYmdGhpcy5fZGF0YVByb3ZpZGVyJiYodGhpcy5zZXQoIl9pc01lc2hMb2FkaW5nIiwhMCksdGhpcy5fZGF0YVByb3ZpZGVyLnJlbG9hZCh0aGlzLnJ1bix0aGlzLnRhZyx0aGlzLnNhbXBsZSkudGhlbihjPT57YyYmKHRoaXMuc2V0KCJfc3RlcHMiLGMpLHRoaXMuc2V0KCJfc3RlcEluZGV4IiwKYy5sZW5ndGgtMSkpfSkuY2F0Y2goYz0+e2lmKCFjfHwhYy5jb2RlfHxjLmNvZGUhPWEuRXJyb3JDb2Rlcy5DQU5DRUxMRUQpdGhyb3cgRXJyb3IoY3x8IlJlc3BvbnNlIHByb2Nlc3NpbmcgZmFpbGVkLiIpO30pKX0sX3VwZGF0ZVNjZW5lOmZ1bmN0aW9uKCl7Y29uc3QgYz10aGlzLl9jdXJyZW50U3RlcDtjJiZjLm1lc2gmJih0aGlzLl9tZXNoVmlld2VyLnVwZGF0ZVNjZW5lKGMsdGhpcyksdGhpcy5fY2FtZXJhUG9zaXRpb25Jbml0aWFsaXplZHx8KHRoaXMuX21lc2hWaWV3ZXIucmVzZXRWaWV3KCksdGhpcy5fY2FtZXJhUG9zaXRpb25Jbml0aWFsaXplZD0hMCksdGhpcy5fbWVzaFZpZXdlckF0dGFjaGVkfHwodGhpcy5yb290LmFwcGVuZENoaWxkKHRoaXMuX21lc2hWaWV3ZXIuZ2V0UmVuZGVyZXIoKS5kb21FbGVtZW50KSx0aGlzLl9tZXNoVmlld2VyQXR0YWNoZWQ9ITApKX0sX2RlYm91bmNlZEZldGNoTWVzaCgpe3RoaXMuZGVib3VuY2UoImZldGNoTWVzaCIsKCk9PnRoaXMuX21heWJlRmV0Y2hNZXNoKCksCjEwMCl9LF9tYXliZUZldGNoTWVzaCgpe2NvbnN0IGM9dGhpcztyZXR1cm4gQmIoZnVuY3Rpb24qKCl7Y29uc3QgZD1jLl9jdXJyZW50U3RlcDtpZihkJiYhZC5tZXNoJiYhZC5tZXNoRmV0Y2hpbmcpe2QubWVzaEZldGNoaW5nPSEwO2MuX2lzTWVzaExvYWRpbmc9ITA7dHJ5e2NvbnN0IGY9eWllbGQgYy5fZGF0YVByb3ZpZGVyLmZldGNoRGF0YShkLGMucnVuLGMudGFnLGMuc2FtcGxlKTtkLm1lc2g9ZlswXTtjLm5vdGlmeVBhdGgoIl9jdXJyZW50U3RlcC5tZXNoIil9Y2F0Y2goZil7aWYoIWZ8fCFmLmNvZGV8fGYuY29kZSE9YS5FcnJvckNvZGVzLkNBTkNFTExFRCl0aHJvdyBmPWZ8fCJSZXNwb25zZSBwcm9jZXNzaW5nIGZhaWxlZC4iLEVycm9yKGYpO31maW5hbGx5e2MuX2lzTWVzaExvYWRpbmc9ITEsZC5tZXNoRmV0Y2hpbmc9ITF9fX0pfSxfb25DYW1lcmFQb3NpdGlvbkNoYW5nZTpmdW5jdGlvbigpe2lmKHRoaXMuX21lc2hWaWV3ZXIuaXNSZWFkeSgpKXt2YXIgYz1uZXcgQ3VzdG9tRXZlbnQoImNhbWVyYS1wb3NpdGlvbi1jaGFuZ2UiLAp7ZGV0YWlsOnRoaXMuX21lc2hWaWV3ZXIuZ2V0Q2FtZXJhUG9zaXRpb24oKX0pO3RoaXMuZGlzcGF0Y2hFdmVudChjKX19LHNldENhbWVyYVZpZXdwb2ludDpmdW5jdGlvbihjLGQsZil7dGhpcy5fbWVzaFZpZXdlci5zZXRDYW1lcmFWaWV3cG9pbnQoYyxkLGYpfSxfdXBkYXRlQ2FudmFzU2l6ZTpmdW5jdGlvbigpe2NvbnN0IGM9dGhpcy5vZmZzZXRXaWR0aCxkPXRoaXMuJCQoIi50Zi1tZXNoLWxvYWRlci1oZWFkZXIiKS5vZmZzZXRIZWlnaHQ7dGhpcy5fbWVzaFZpZXdlci5zZXRDYW52YXNTaXplKHt3aWR0aDpjLGhlaWdodDpjLWR9KX0scmVkcmF3OmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQ2FudmFzU2l6ZSgpO3RoaXMuaXNDb25uZWN0ZWQmJnRoaXMuX21lc2hWaWV3ZXIuZHJhdygpfSxfaGFzQXRMZWFzdE9uZVN0ZXA6ZnVuY3Rpb24oYyl7cmV0dXJuISFjJiYwPGMubGVuZ3RofSxfaGFzTXVsdGlwbGVTdGVwczpmdW5jdGlvbihjKXtyZXR1cm4hIWMmJjE8Yy5sZW5ndGh9LF9jb21wdXRlQ3VycmVudFN0ZXA6ZnVuY3Rpb24oYywKZCl7cmV0dXJuIGNbZF18fG51bGx9LF9jb21wdXRlU3RlcFZhbHVlOmZ1bmN0aW9uKGMpe3JldHVybiBjP2Muc3RlcDowfSxfY29tcHV0ZUN1cnJlbnRXYWxsVGltZTpmdW5jdGlvbihjKXtyZXR1cm4gYz9kcC5mb3JtYXREYXRlKGMud2FsbF90aW1lKToiIn0sX2dldE1heFN0ZXBJbmRleDpmdW5jdGlvbihjKXtyZXR1cm4gYy5sZW5ndGgtMX0sX2dldFNhbXBsZVRleHQ6ZnVuY3Rpb24oYyl7cmV0dXJuIFN0cmluZyhjKzEpfSxfaGFzTXVsdGlwbGVTYW1wbGVzOmZ1bmN0aW9uKGMpe3JldHVybiAxPGN9LF91cGRhdGVWaWV3OmZ1bmN0aW9uKGMpe3RoaXMuX21lc2hWaWV3ZXImJiJhbGwiPT1jJiZ0aGlzLl9tZXNoVmlld2VyLnJlc2V0VmlldygpfSx0b0xvY2FsZVN0cmluZ186ZnVuY3Rpb24oYyl7cmV0dXJuIGMudG9Mb2NhbGVTdHJpbmcoKX19KX0pKFh0fHwoWHQ9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1tZXNoLWRhc2hib2FyZC90Zi1tZXNoLWRhc2hib2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJtZXNoLWRhc2hib2FyZCIscHJvcGVydGllczp7X3NlbGVjdGVkUnVuczpBcnJheSxfcnVuVG9UYWdJbmZvOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6Ii4qIn0sX3NlbGVjdGVkVmlldzp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLHZhbHVlOiJhbGwifSxfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZ0luZm8sIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIpIn0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFFvLlJlcXVlc3RNYW5hZ2VyfX0scmVhZHkoKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIiwoKT0+e3RoaXMuX2hhbmRsZVdpbmRvd1Jlc2l6ZSgpfSwhMSk7dGhpcy5yZWxvYWQoKX0sX2dldEFsbENoaWxkcmVuKCl7cmV0dXJuIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1tZXNoLWxvYWRlciIpfSwKX29uQ2FtZXJhUG9zaXRpb25DaGFuZ2VkKGEpeyJzaGFyZSI9PXRoaXMuX3NlbGVjdGVkVmlldyYmdGhpcy5fZ2V0QWxsQ2hpbGRyZW4oKS5mb3JFYWNoKGM9PnthLnRhcmdldCE9YyYmYy5zZXRDYW1lcmFWaWV3cG9pbnQoYS5kZXRhaWwucG9zaXRpb24sYS5kZXRhaWwuZmFyLGEuZGV0YWlsLnRhcmdldCl9KX0sX3Nob3VsZE9wZW4oYSl7cmV0dXJuIDI+PWF9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4odGhpcy5fcmVsb2FkTWVzaGVzLmJpbmQodGhpcykpfSxfaGFuZGxlV2luZG93UmVzaXplKCl7dGhpcy5fZ2V0QWxsQ2hpbGRyZW4oKS5mb3JFYWNoKGE9PnthLnJlZHJhdygpfSl9LF9mZXRjaFRhZ3MoKXtjb25zdCBhPVFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJtZXNoIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChhKS50aGVuKGM9PntpZighXy5pc0VxdWFsKGMsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGQ9Xy5tYXBWYWx1ZXMoYywKZj0+T2JqZWN0LmtleXMoZikpO2Q9UW8uZ2V0VGFncyhkKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWQubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsYyl9fSl9LF9yZWxvYWRNZXNoZXMoKXt0aGlzLl9nZXRBbGxDaGlsZHJlbigpLmZvckVhY2goYT0+e2EucmVsb2FkKCl9KX0sX21ha2VDYXRlZ29yaWVzKGEsYyxkKXtmdW5jdGlvbiBmKGwpe2NvbnN0IGs9YVtsLnJ1bl1bbC50YWddLnNhbXBsZXM7cmV0dXJuIF8ucmFuZ2UoaykubWFwKG49Pk9iamVjdC5hc3NpZ24oe30sbCx7c2FtcGxlOm4sb2ZTYW1wbGVzOmt9KSl9Y29uc3QgZz1fLm1hcFZhbHVlcyhhLGw9Pk9iamVjdC5rZXlzKGwpKTtyZXR1cm4gUm8uY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhnLGMsZCkubWFwKGw9Pk9iamVjdC5hc3NpZ24oe30sbCx7aXRlbXM6W10uY29uY2F0LmFwcGx5KFtdLGwuaXRlbXMubWFwKGYpKX0pKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcGx1Z2luLXV0aWwvbWVzc2FnZS5qcwpmcD10aGlzJiZ0aGlzLl9fYXdhaXRlcnx8ZnVuY3Rpb24oYSxjLGQsZil7cmV0dXJuIG5ldyAoZHx8KGQ9UHJvbWlzZSkpKGZ1bmN0aW9uKGcsbCl7ZnVuY3Rpb24gayhxKXt0cnl7cChmLm5leHQocSkpfWNhdGNoKHIpe2wocil9fWZ1bmN0aW9uIG4ocSl7dHJ5e3AoZlsidGhyb3ciXShxKSl9Y2F0Y2gocil7bChyKX19ZnVuY3Rpb24gcChxKXtxLmRvbmU/ZyhxLnZhbHVlKToobmV3IGQoZnVuY3Rpb24ocil7cihxLnZhbHVlKX0pKS50aGVuKGssbil9cCgoZj1mLmFwcGx5KGEsY3x8W10pKS5uZXh0KCkpfSl9O3ZhciBZdDsKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7Y2xhc3MgZntjb25zdHJ1Y3RvcihnKXt0aGlzLnBvcnQ9Zzt0aGlzLmlkPTA7dGhpcy5yZXNwb25zZVdhaXRzPW5ldyBNYXA7dGhpcy5saXN0ZW5lcnM9bmV3IE1hcDt0aGlzLnBvcnQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbD0+dGhpcy5vbk1lc3NhZ2UobCkpfWxpc3RlbihnLGwpe3RoaXMubGlzdGVuZXJzLnNldChnLGwpfXVubGlzdGVuKGcpe3RoaXMubGlzdGVuZXJzLmRlbGV0ZShnKX1vbk1lc3NhZ2UoZyl7cmV0dXJuIGZwKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXt2YXIgbD1KU09OLnBhcnNlKGcuZGF0YSk7Y29uc3Qgaz1sLnR5cGUsbj1sLmlkLHA9bC5wYXlsb2FkO3ZhciBxPWwuZXJyb3I7aWYobC5pc1JlcGx5KXtpZih0aGlzLnJlc3BvbnNlV2FpdHMuaGFzKG4pKXt2YXIge3Jlc29sdmU6cixyZWplY3Q6dH09dGhpcy5yZXNwb25zZVdhaXRzLmdldChuKTt0aGlzLnJlc3BvbnNlV2FpdHMuZGVsZXRlKG4pOwpxP3QoRXJyb3IocSkpOnIocCl9fWVsc2V7cT1sPW51bGw7aWYodGhpcy5saXN0ZW5lcnMuaGFzKGspKXtjb25zdCB2PXRoaXMubGlzdGVuZXJzLmdldChrKTt0cnl7bD15aWVsZCB2KHApfWNhdGNoKHkpe3E9eX19dGhpcy5wb3N0TWVzc2FnZSh7WyJ0eXBlIl06ayxbImlkIl06bixbInBheWxvYWQiXTpsLFsiZXJyb3IiXTpxLFsiaXNSZXBseSJdOiEwfSl9fSl9cG9zdE1lc3NhZ2UoZyl7dGhpcy5wb3J0LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGcpKX1zZW5kTWVzc2FnZShnKXtjb25zdCBsPXRoaXMuaWQrKzt0aGlzLnBvc3RNZXNzYWdlKHt0eXBlOiJleHBlcmltZW50YWwuUnVuc0NoYW5nZWQiLGlkOmwscGF5bG9hZDpnLGVycm9yOm51bGwsaXNSZXBseTohMX0pO3JldHVybiBuZXcgUHJvbWlzZSgoayxuKT0+e3RoaXMucmVzcG9uc2VXYWl0cy5zZXQobCx7cmVzb2x2ZTprLHJlamVjdDpufSl9KX19ZC5JUEM9Zn0pKGMuRE9fTk9UX1VTRV9JTlRFUk5BTHx8KGMuRE9fTk9UX1VTRV9JTlRFUk5BTD0Ke30pKX0pKGEubGlifHwoYS5saWI9e30pKX0pKFl0fHwoWXQ9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wbHVnaW4tdXRpbC9wbHVnaW4taG9zdC1pcGMuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXtmdW5jdGlvbiBkKGssbil7Y29uc3QgcD1uZXcgYS5saWIuRE9fTk9UX1VTRV9JTlRFUk5BTC5JUEMoayk7Zi5hZGQocCk7bC5zZXQocCxuKTtrLnN0YXJ0KCk7Zm9yKGNvbnN0IFtxLHJdb2YgZylwLmxpc3RlbihxLHIpfWNvbnN0IGY9bmV3IFNldCxnPW5ldyBNYXAsbD1uZXcgTWFwO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixrPT57aWYoImV4cGVyaW1lbnRhbC5ib290c3RyYXAiPT09ay5kYXRhKXt2YXIgbj1rLnBvcnRzWzBdO24mJihrPWsuc291cmNlP2suc291cmNlLmZyYW1lRWxlbWVudDpudWxsKSYmZChuLGspfX0pO2MuYnJvYWRjYXN0PWZ1bmN0aW9uKCl7dmFyIGs9UW8ucnVuc1N0b3JlLmdldFJ1bnMoKTtmb3IodmFyIG4gb2YgZilsLmdldChuKS5pc0Nvbm5lY3RlZHx8KGYuZGVsZXRlKG4pLGwuZGVsZXRlKG4pKTtuPVsuLi5mXS5tYXAocD0+cC5zZW5kTWVzc2FnZShrKSk7cmV0dXJuIFByb21pc2UuYWxsKG4pfTsKYy5saXN0ZW49ZnVuY3Rpb24oayxuKXtnLnNldChrLG4pO2Zvcihjb25zdCBwIG9mIGYpcC5saXN0ZW4oayxuKX07Yy51bmxpc3Rlbj1mdW5jdGlvbihrKXtnLmRlbGV0ZShrKTtmb3IoY29uc3QgbiBvZiBmKW4udW5saXN0ZW4oayl9fSkoYS5ob3N0fHwoYS5ob3N0PXt9KSl9KShZdHx8KFl0PXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcGx1Z2luLXV0aWwvcnVucy1ob3N0LWltcGwuanMKWXQuaG9zdC5saXN0ZW4oImV4cGVyaW1lbnRhbC5HZXRSdW5zIiwoKT0+UW8ucnVuc1N0b3JlLmdldFJ1bnMoKSk7UW8ucnVuc1N0b3JlLmFkZExpc3RlbmVyKCgpPT5ZdC5ob3N0LmJyb2FkY2FzdCgpKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi10ZW5zb3Jib2FyZC9hdXRvUmVsb2FkQmVoYXZpb3IuanMKKGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoKXtyZXR1cm4obmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKSkuaGFzKCJfRGlzYWJsZUF1dG9SZWxvYWQiKX1hLkFVVE9SRUxPQURfTE9DQUxTVE9SQUdFX0tFWT0iVEYuVGVuc29yQm9hcmQuYXV0b1JlbG9hZEVuYWJsZWQiO2EuQXV0b1JlbG9hZEJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthdXRvUmVsb2FkRW5hYmxlZDp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfYXV0b1JlbG9hZE9ic2VydmVyIix2YWx1ZTooKT0+e3ZhciBkPXdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShhLkFVVE9SRUxPQURfTE9DQUxTVE9SQUdFX0tFWSk7cmV0dXJuInRydWUiPT09ZHx8bnVsbD09ZH19LF9hdXRvUmVsb2FkSWQ6e3R5cGU6TnVtYmVyfSxhdXRvUmVsb2FkSW50ZXJ2YWxTZWNzOnt0eXBlOk51bWJlcix2YWx1ZTozMH19LGRldGFjaGVkOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLl9hdXRvUmVsb2FkSWQpfSwKX2F1dG9SZWxvYWRPYnNlcnZlcjpmdW5jdGlvbihkKXt3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oYS5BVVRPUkVMT0FEX0xPQ0FMU1RPUkFHRV9LRVksZCk7ZCYmIWMoKT90aGlzLl9hdXRvUmVsb2FkSWQ9d2luZG93LnNldFRpbWVvdXQoKCk9PnRoaXMuX2RvQXV0b1JlbG9hZCgpLDFFMyp0aGlzLmF1dG9SZWxvYWRJbnRlcnZhbFNlY3MpOndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fYXV0b1JlbG9hZElkKX0sX2RvQXV0b1JlbG9hZDpmdW5jdGlvbigpe2lmKG51bGw9PXRoaXMucmVsb2FkKXRocm93IEVycm9yKCJBdXRvUmVsb2FkQmVoYXZpb3IgcmVxdWlyZXMgYSByZWxvYWQgbWV0aG9kIik7dGhpcy5yZWxvYWQoKTt0aGlzLl9hdXRvUmVsb2FkSWQ9d2luZG93LnNldFRpbWVvdXQoKCk9PnRoaXMuX2RvQXV0b1JlbG9hZCgpLDFFMyp0aGlzLmF1dG9SZWxvYWRJbnRlcnZhbFNlY3MpfX19KShZb3x8KFlvPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtdGVuc29yYm9hcmQvdGYtdGVuc29yYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtdGVuc29yYm9hcmQiLGJlaGF2aW9yczpbWW8uQXV0b1JlbG9hZEJlaGF2aW9yXSxwcm9wZXJ0aWVzOnticmFuZDp7dHlwZTpTdHJpbmcsdmFsdWU6IlRlbnNvckJvYXJkLVgifSx0aXRsZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il91cGRhdGVUaXRsZSJ9LHJvdXRlcjp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il91cGRhdGVSb3V0ZXIifSxkZW1vRGlyOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSx1c2VIYXNoOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGRpc2FibGVkRGFzaGJvYXJkczp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9kYXNoYm9hcmREYXRhOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZURhc2hib2FyZERhdGEoX2Rhc2hib2FyZFJlZ2lzdHJ5KSJ9LF9kYXNoYm9hcmRSZWdpc3RyeTp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlRGFzaGJvYXJkUmVnaXN0cnkoX3BsdWdpbnNMaXN0aW5nKSJ9LF9wbHVnaW5zTGlzdGluZzp7dHlwZTpPYmplY3QsCnZhbHVlOigpPT4oe30pfSxfYWN0aXZlRGFzaGJvYXJkczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2NvbXB1dGVBY3RpdmVEYXNoYm9hcmQoX2Rhc2hib2FyZERhdGEsIF9wbHVnaW5zTGlzdGluZykifSxfYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6WW8uQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZS5OT1RfTE9BREVEfSxfYWN0aXZlRGFzaGJvYXJkc05vdExvYWRlZDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNOb3RMb2FkZWQoX2FjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUpIn0sX2FjdGl2ZURhc2hib2FyZHNMb2FkZWQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVBY3RpdmVEYXNoYm9hcmRzTG9hZGVkKF9hY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlKSJ9LF9hY3RpdmVEYXNoYm9hcmRzRmFpbGVkVG9Mb2FkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc0ZhaWxlZFRvTG9hZChfYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZSkifSwKX3Nob3dOb0Rhc2hib2FyZHNNZXNzYWdlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlU2hvd05vRGFzaGJvYXJkc01lc3NhZ2UoX2FjdGl2ZURhc2hib2FyZHNMb2FkZWQsIF9hY3RpdmVEYXNoYm9hcmRzLCBfc2VsZWN0ZWREYXNoYm9hcmQpIn0sX3Nob3dOb1N1Y2hEYXNoYm9hcmRNZXNzYWdlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlU2hvd05vU3VjaERhc2hib2FyZE1lc3NhZ2UoX2FjdGl2ZURhc2hib2FyZHNMb2FkZWQsIF9kYXNoYm9hcmRSZWdpc3RyeSwgX3NlbGVjdGVkRGFzaGJvYXJkKSJ9LF9zZWxlY3RlZERhc2hib2FyZDp7dHlwZTpTdHJpbmcsdmFsdWU6VG8uZ2V0U3RyaW5nKFRvLlRBQil8fG51bGwsb2JzZXJ2ZXI6Il9zZWxlY3RlZERhc2hib2FyZENoYW5nZWQifSxfZGFzaGJvYXJkVG9NYXliZVJlbW92ZTpTdHJpbmcsX2Rhc2hib2FyZENvbnRhaW5lcnNTdGFtcGVkOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX2lzUmVsb2FkRGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbiwKdmFsdWU6ITF9LF9sYXN0UmVsb2FkVGltZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im5vdCB5ZXQgbG9hZGVkIn0sX2xhc3RSZWxvYWRUaW1lU2hvcnQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJOb3QgeWV0IGxvYWRlZCJ9LF9kYXRhTG9jYXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBRby5SZXF1ZXN0TWFuYWdlcn0sX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBRby5DYW5jZWxsZXJ9LF9yZWZyZXNoaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJfdXBkYXRlU2VsZWN0ZWREYXNoYm9hcmRGcm9tQWN0aXZlKF9zZWxlY3RlZERhc2hib2FyZCwgX2FjdGl2ZURhc2hib2FyZHMpIiwiX2Vuc3VyZVNlbGVjdGVkRGFzaGJvYXJkU3RhbXBlZChfZGFzaGJvYXJkUmVnaXN0cnksIF9kYXNoYm9hcmRDb250YWluZXJzU3RhbXBlZCwgX2FjdGl2ZURhc2hib2FyZHMsIF9zZWxlY3RlZERhc2hib2FyZCkiXSwKX2FjdGl2ZURhc2hib2FyZHNVcGRhdGVkKCl7fSxfaXNEYXNoYm9hcmRBY3RpdmUoYSxjLGQpe3JldHVybiAwPD0oYXx8IiIpLnNwbGl0KCIsIikuaW5kZXhPZihkLnBsdWdpbil8fCEoY3x8W10pLmluY2x1ZGVzKGQucGx1Z2luKT8hMTohMH0sX2lzRGFzaGJvYXJkSW5hY3RpdmUoYSxjLGQpe3JldHVybiAwPD0oYXx8IiIpLnNwbGl0KCIsIikuaW5kZXhPZihkLnBsdWdpbik/ITE6KGN8fFtdKS5pbmNsdWRlcyhkLnBsdWdpbik/ITE6ITB9LF9pbmFjdGl2ZURhc2hib2FyZHNFeGlzdChhLGMsZCl7aWYoIWQpcmV0dXJuITE7Y29uc3QgZj1uZXcgU2V0O2EuZm9yRWFjaChnPT57Zi5hZGQoZy5wbHVnaW4pfSk7KGN8fCIiKS5zcGxpdCgiLCIpLmZvckVhY2goZz0+e2YuZGVsZXRlKGcucGx1Z2luKX0pO2QuZm9yRWFjaChnPT57Zi5kZWxldGUoZyl9KTtyZXR1cm4gMDxmLnNpemV9LF9nZXREYXNoYm9hcmRGcm9tSW5kZXgoYSxjKXtyZXR1cm4gYVtjXX0sX3NlbGVjdGVkU3RhdHVzKGEsCmMpe3JldHVybiBhPT09Y30sX3NlbGVjdGVkRGFzaGJvYXJkQ2hhbmdlZChhKXthPWF8fCIiO1RvLnNldFN0cmluZyhUby5UQUIsYSk7bGV0IGM9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO2MrPWMuZW5kc1dpdGgoIi8iKT9hOiIvIithO2dhKCJzZXQiLCJwYWdlIixjKTtnYSgic2VuZCIsInBhZ2V2aWV3Iil9LF91cGRhdGVTZWxlY3RlZERhc2hib2FyZEZyb21BY3RpdmUoYSxjKXtjJiZudWxsPT1hJiYoYT1jWzBdfHxudWxsLG51bGwhPWEmJihUby5zZXRTdHJpbmcoVG8uVEFCLGEse3VzZUxvY2F0aW9uUmVwbGFjZTohMH0pLHRoaXMuX3NlbGVjdGVkRGFzaGJvYXJkPWEpKX0sX3VwZGF0ZVNlbGVjdGVkRGFzaGJvYXJkRnJvbUhhc2goKXtjb25zdCBhPVRvLmdldFN0cmluZyhUby5UQUIpO3RoaXMuc2V0KCJfc2VsZWN0ZWREYXNoYm9hcmQiLGF8fG51bGwpfSxfZW5zdXJlU2VsZWN0ZWREYXNoYm9hcmRTdGFtcGVkKGEsYyxkLGYpe2lmKGQmJmYmJmNbZl0mJihjPXRoaXMuX2Rhc2hib2FyZFRvTWF5YmVSZW1vdmUsCnRoaXMuX2Rhc2hib2FyZFRvTWF5YmVSZW1vdmU9ZixjJiZjIT1mJiZhW2NdLnJlbW92ZURvbSYmKGM9dGhpcy4kJChgLmRhc2hib2FyZC1jb250YWluZXJbZGF0YS1kYXNoYm9hcmQ9JHtjfV1gKSxjLmZpcnN0Q2hpbGQmJmMuZmlyc3RDaGlsZC5yZW1vdmUoKSksYz10aGlzLiQkKGAuZGFzaGJvYXJkLWNvbnRhaW5lcltkYXRhLWRhc2hib2FyZD0ke2Z9XWApKSl7YT1hW2ZdO2lmKDA9PT1jLmNoaWxkcmVuLmxlbmd0aClzd2l0Y2goZD1hLmxvYWRpbmdNZWNoYW5pc20sZC50eXBlKXtjYXNlICJDVVNUT01fRUxFTUVOVCI6Zj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGQuZWxlbWVudE5hbWUpO2YuaWQ9ImRhc2hib2FyZCI7Yy5hcHBlbmRDaGlsZChmKTticmVhaztjYXNlICJJRlJBTUUiOnRoaXMuX3JlbmRlclBsdWdpbklmcmFtZShjLGYsZCk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIkludmFyaWFudCB2aW9sYXRpb246IixkKX10aGlzLnNldCgiX2lzUmVsb2FkRGlzYWJsZWQiLAphLmRpc2FibGVSZWxvYWQpfX0sX3JlbmRlclBsdWdpbklmcmFtZShhLGMpe2NvbnN0IGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7ZC5pZD0iZGFzaGJvYXJkIjtjb25zdCBmPW5ldyBVUkwoImRhdGEvcGx1Z2luX2VudHJ5Lmh0bWwiLHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtmLnNlYXJjaFBhcmFtcy5zZXQoIm5hbWUiLGMpO2Quc2V0QXR0cmlidXRlKCJzcmMiLGYudG9TdHJpbmcoKSk7YS5hcHBlbmRDaGlsZChkKX0sX3NlbGVjdGVkRGFzaGJvYXJkQ29tcG9uZW50KCl7cmV0dXJuIHRoaXMuJCQoYC5kYXNoYm9hcmQtY29udGFpbmVyW2RhdGEtZGFzaGJvYXJkPSR7dGhpcy5fc2VsZWN0ZWREYXNoYm9hcmR9XSAjZGFzaGJvYXJkYCl9LHJlYWR5KCl7U28uc2V0VXNlSGFzaCh0aGlzLnVzZUhhc2gpO3RoaXMuX3VwZGF0ZVNlbGVjdGVkRGFzaGJvYXJkRnJvbUhhc2goKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGFzaGNoYW5nZSIsKCk9Pnt0aGlzLl91cGRhdGVTZWxlY3RlZERhc2hib2FyZEZyb21IYXNoKCl9LAohMSk7UW8uZW52aXJvbm1lbnRTdG9yZS5hZGRMaXN0ZW5lcigoKT0+e3RoaXMuX2RhdGFMb2NhdGlvbj1Rby5lbnZpcm9ubWVudFN0b3JlLmdldERhdGFMb2NhdGlvbigpO2NvbnN0IGE9UW8uZW52aXJvbm1lbnRTdG9yZS5nZXRXaW5kb3dUaXRsZSgpO2EmJih3aW5kb3cuZG9jdW1lbnQudGl0bGU9YSl9KTt0aGlzLl9yZWxvYWREYXRhKCk7dGhpcy5fbGFzdFJlbG9hZFRpbWU9KG5ldyBEYXRlKS50b1N0cmluZygpfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZCgpe3JldHVybiB0aGlzLl9kYXNoYm9hcmREYXRhP3RoaXMuX2Rhc2hib2FyZERhdGEubWFwKGE9PmEucGx1Z2luKS5maWx0ZXIoYT0+e2E9dGhpcy5fcGx1Z2luc0xpc3RpbmdbYV07cmV0dXJuImJvb2xlYW4iPT09dHlwZW9mIGE/YTphJiZhLmVuYWJsZWR9KTpbXX0sX29uVGVtcGxhdGVDaGFuZ2VkKCl7Y29uc3QgYT17fTtmb3IoY29uc3QgYyBvZiB0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmRhc2hib2FyZC1jb250YWluZXIiKSlhW2MuZGF0YXNldC5kYXNoYm9hcmRdPQohMDt0aGlzLl9kYXNoYm9hcmRDb250YWluZXJzU3RhbXBlZD1hfSxfY29tcHV0ZURhc2hib2FyZFJlZ2lzdHJ5KGEpe2NvbnN0IGM9e307Zm9yKGNvbnN0IFtmLGddb2YgT2JqZWN0LmVudHJpZXMoWW8uZGFzaGJvYXJkUmVnaXN0cnkpKWNbZl09e3BsdWdpbjpnLnBsdWdpbixsb2FkaW5nTWVjaGFuaXNtOnt0eXBlOiJDVVNUT01fRUxFTUVOVCIsZWxlbWVudE5hbWU6Zy5lbGVtZW50TmFtZX0sdGFiTmFtZTpnLnRhYk5hbWUudG9VcHBlckNhc2UoKSxkaXNhYmxlUmVsb2FkOmcuaXNSZWxvYWREaXNhYmxlZHx8ITEscmVtb3ZlRG9tOmcucmVtb3ZlRG9tfHwhMX07aWYobnVsbCE9YSlmb3IoY29uc3QgW2YsZ11vZiBPYmplY3QuZW50cmllcyhhKSlpZigiYm9vbGVhbiIhPT10eXBlb2YgZyl7c3dpdGNoKGcubG9hZGluZ19tZWNoYW5pc20udHlwZSl7Y2FzZSAiTk9ORSI6bnVsbD09Y1tmXSYmY29uc29sZS53YXJuKCJQbHVnaW4gaGFzIG5vIGxvYWRpbmcgbWVjaGFuaXNtIGFuZCBubyBiYWtlZC1pbiByZWdpc3RyeSBlbnRyeTogJXMiLApmKTtjb250aW51ZTtjYXNlICJDVVNUT01fRUxFTUVOVCI6dmFyIGQ9e3R5cGU6IkNVU1RPTV9FTEVNRU5UIixlbGVtZW50TmFtZTpnLmxvYWRpbmdfbWVjaGFuaXNtLmVsZW1lbnRfbmFtZX07YnJlYWs7Y2FzZSAiSUZSQU1FIjpkPXt0eXBlOiJJRlJBTUUiLG1vZHVsZVBhdGg6Zy5sb2FkaW5nX21lY2hhbmlzbS5tb2R1bGVfcGF0aH07YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlVua25vd24gbG9hZGluZyBtZWNoYW5pc20gZm9yIHBsdWdpbiAlczogJXMiLGYsZy5sb2FkaW5nX21lY2hhbmlzbSk7Y29udGludWV9bnVsbD09ZCYmY29uc29sZS5lcnJvcigiSW52YXJpYW50IHZpb2xhdGlvbjogbG9hZGluZ01lY2hhbmlzbSBpcyAlcyBmb3IgJXMiLGQsZik7Y1tmXT17cGx1Z2luOmYsbG9hZGluZ01lY2hhbmlzbTpkLHRhYk5hbWU6Zy50YWJfbmFtZS50b1VwcGVyQ2FzZSgpLGRpc2FibGVSZWxvYWQ6Zy5kaXNhYmxlX3JlbG9hZCxyZW1vdmVEb206Zy5yZW1vdmVfZG9tfX1kPXt9Owpmb3IoY29uc3QgZiBvZiBPYmplY3Qua2V5cyhhKSljW2ZdJiYoZFtmXT1jW2ZdKTtPYmplY3QuYXNzaWduKGQsYyk7cmV0dXJuIGR9LF9jb21wdXRlRGFzaGJvYXJkRGF0YShhKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyhhKX0sX2ZldGNoUGx1Z2luc0xpc3RpbmcoKXt0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7Y29uc3QgYT10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoYz0+e2MuY2FuY2VsbGVkfHwodGhpcy5fcGx1Z2luc0xpc3Rpbmc9Yy52YWx1ZSx0aGlzLl9hY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlPVlvLkFjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUuTE9BREVEKX0pO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KFFvLmdldFJvdXRlcigpLnBsdWdpbnNMaXN0aW5nKCkpLnRoZW4oYSwoKT0+e3RoaXMuX2FjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGU9PT1Zby5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLk5PVF9MT0FERUQ/dGhpcy5fYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZT0KWW8uQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZS5GQUlMRUQ6Y29uc29sZS53YXJuKCJGYWlsZWQgdG8gcmVsb2FkIHRoZSBzZXQgb2YgYWN0aXZlIHBsdWdpbnM7IHVzaW5nIG9sZCB2YWx1ZS4iKX0pfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNOb3RMb2FkZWQoYSl7cmV0dXJuIGE9PT1Zby5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLk5PVF9MT0FERUR9LF9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc0xvYWRlZChhKXtyZXR1cm4gYT09PVlvLkFjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUuTE9BREVEfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNGYWlsZWRUb0xvYWQoYSl7cmV0dXJuIGE9PT1Zby5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLkZBSUxFRH0sX2NvbXB1dGVTaG93Tm9EYXNoYm9hcmRzTWVzc2FnZShhLGMsZCl7cmV0dXJuIGEmJjA9PT1jLmxlbmd0aCYmbnVsbD09ZH0sX2NvbXB1dGVTaG93Tm9TdWNoRGFzaGJvYXJkTWVzc2FnZShhLGMsZCl7cmV0dXJuIGEmJiEhZCYmCm51bGw9PWNbZF19LF91cGRhdGVSb3V0ZXIoYSl7UW8uc2V0Um91dGVyKGEpfSxfdXBkYXRlVGl0bGUoYSl7YSYmdGhpcy5zZXQoImJyYW5kIixhKX0scmVsb2FkKCl7dGhpcy5faXNSZWxvYWREaXNhYmxlZHx8KHRoaXMuX3JlbG9hZERhdGEoKS50aGVuKCgpPT57Y29uc3QgYT10aGlzLl9zZWxlY3RlZERhc2hib2FyZENvbXBvbmVudCgpO2EmJmEucmVsb2FkJiZhLnJlbG9hZCgpfSksdGhpcy5fbGFzdFJlbG9hZFRpbWU9KG5ldyBEYXRlKS50b1N0cmluZygpKX0sX3JlbG9hZERhdGEoKXt0aGlzLl9yZWZyZXNoaW5nPSEwO3JldHVybiBQcm9taXNlLmFsbChbdGhpcy5fZmV0Y2hQbHVnaW5zTGlzdGluZygpLFFvLmVudmlyb25tZW50U3RvcmUucmVmcmVzaCgpLFFvLnJ1bnNTdG9yZS5yZWZyZXNoKCksUW8uZXhwZXJpbWVudHNTdG9yZS5yZWZyZXNoKCldKS50aGVuKCgpPT57dGhpcy5fbGFzdFJlbG9hZFRpbWVTaG9ydD0obmV3IERhdGUpLnRvTG9jYWxlRGF0ZVN0cmluZyh2b2lkIDAsCnttb250aDoibG9uZyIsZGF5OiJudW1lcmljIixob3VyOiJudW1lcmljIixtaW51dGU6Im51bWVyaWMiLHNlY29uZDoibnVtZXJpYyJ9KX0pLmZpbmFsbHkoKCk9Pnt0aGlzLl9yZWZyZXNoaW5nPSExfSl9LF9nZXREYXRhUmVmcmVzaGluZ0NsYXNzKCl7cmV0dXJuIHRoaXMuX3JlZnJlc2hpbmc/InJlZnJlc2hpbmciOiIifSxvcGVuU2V0dGluZ3MoKXt0aGlzLiQuc2V0dGluZ3Mub3BlbigpO3RoaXMuJC5wYWdpbmF0aW9uTGltaXRJbnB1dC52YWx1ZT1Xby5nZXRMaW1pdCgpfSxfcGFnaW5hdGlvbkxpbWl0VmFsaWRhdGUoYSl7YS50YXJnZXQudmFsaWRhdGUoKX0sX3BhZ2luYXRpb25MaW1pdENoYW5nZWQoYSl7YT1OdW1iZXIucGFyc2VJbnQoYS50YXJnZXQudmFsdWUsMTApO2E9PT0rYSYmMDxhJiZXby5zZXRMaW1pdChhKX19KTsK", + "ok": true, + "headers": [ + [ + "content-type", + "application/javascript; charset=utf-8" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/font-roboto/RxZJdnzeo3R5zSexge8UUZBw1xU1rKptJj_0jans920.woff2": { + "data": "d09GMgABAAAAACokAA4AAAAAUkQAACnNAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGmQbmXocg0oGYACGTBEMCu1A1wwLg14AATYCJAOHNgQgBYMAByAbO0QF3Bhn2DiAgX12b1EEGwcBhTGLomxQFmT/lwnmGE77wayn0NBAJAPXITeLlQAVKYYKjM1mpr7CgS0HNgpkY1bqRLvLsXy3dA8XPXqvM/yN+w2v2FOlAb85QmOf5P7Az633/wJaSkUwMImTqgk4GDAic6S4MSrGqFakDCocigoYRBqEHnCIYBIGGExRT1Qeqv3690x3z90AwCasSP6ngswqFUVYHrB8VBQAKcYder52r1wzByMHJRZ//0+nNV9g+H/GsveOK0AqSpwZGZI47CReYMFvJOfQ2hTNUVES1lvdXXeyFKh29/XX4ACRY/9vTgMuqbMdO2B5UFAD4VG4vRkzpRE/HAS4Jss5uTZKgIn5b///mp923r+ZD/x22f0pcYRbsj0ne84XpsZN7mQyee9lwgszWcwvZJLFD4WkECjkFyHriuAA87NMWVUCV9VTC6S6tsdX+ApZK4nU+gqn6ipcefja71ffCTv/vpktBbH4Q8OmUzIhiS6SSKLxDYn4I3iKlCraxSKRmLCxMhnQLaUZLPeL70z9PLvdGe4aJpgghNJhdNDfIYfbP4Zrr4IRvQYW1AHHsRm/MoBA8QMAALCA4nacDoQBD4hYsRCpUiHSpUMwMSGyZUPkyoe4rB6qxyYEAgXAC0AAAgCBiIUA4KZAB3a3PfY7jNipySXnETvz4unnEjtv7bILiMECgG+hS5x7+iUX4AR8gRVUUNx1liijpQ3akVwcN9akGiFf5sfC53+NGKbR5WqKVWK9kAti+AS1eOOOyCvDaIwf8afMcFGbPJk65ZRuuRKVi5n34MXC5+eY8DF3ego/YaXaA/kGJCdNqR9aLDwevIQdJ0mKNBnyFChToUqNBoJTtOk4zZgJM5as2bDlwIkLV+48lSpzznk9evW57Y677uk3YNCQYfc98NAjk55Y9MySZa+9sWLVmnUbNiE0xggsAhGnnKBtjyf2QAgPTgoEFh8Jtbt2fBCTGwppEGEglZ5H9iEjajJmypb9zQ7WcvY+F29zpybfh8pFRalEVy+iPrfdcde9rn89b9acef9Z6HrqQ4ueWbLsjRWr1qx3vfW+d9770LXhbZuHCFeD868+CuUUv9RhOBpeRLDSKRtpW+4JClYxVTYdM1P8F5yw4yEH/bl6XJhQCcKlImFqL9vlsPiIpJtgDl7nnTDswuvDCv+DO1fDk/MxTTZl2ozHg0XCE4hnXuaoUGRvMwJjpuxnZEv+3pQmUBk753x56pZFeGbJ8s2IMhXxINvIiBgzZS/fU4ueWbJ8N5ZJIjmllGuC4g0HW6/PDdHeZGVFrFqzPhRHACMh5SpUzmRow4YNGzamMFQ4soqMGDNtbEWyl05HornGI/8uT9miZ5Ysd70RacWqNeumCoS86xhHXc3Jp1y9CINvDOn62prjoEx81Jz3IVIDWX7co1E3yT++FWYmuuNgIacdlV09TGcJJhPrX4ppsGwDXfCvkmLgAFmk6LCYxAftHyxYL1O0P9FCx9PR3lipv92N96FztJm7THzvXYCZF1CGmPHV7zjxlE+yUMyjYlkzeXrN1+XDXy7mZ4SaH3nFQ7Ww4uDmIe7T/PFaC3qFyJcS82v/iTr6GwvR3ze+XD27dfVbnYZQeRFxzohzSVz399nlr3kVWPXOwUJ5dHBrvN8bC/o9RRmDNlxKMCFjXvucAiWWoH0uC9Id0GRlZgrJ2SxOo/NX1BHQbaQBUf96uxZTd36ybZDQD2eu0GhiDfZmfDlc0VzFOlV8wKy9uuc9zoT+etNtsqFheWuKpVn11wnNyFUttlZgbJzVYnwrmDBpqX3O62J0xc3aVeaABaXbnkaGt5Tna0TncyyvCyiVfDTfNg2Tskx1qffMM0NtN69smvOiem3QnIGRMuk1rbqfMN9WYlYX54kVN9Zr843PpJvb6ivMNl+RmEB/BdWcgMMDITBSlFAjGMdJwzpJBRcNOoQYINvHmOh+Zu4HWLNzkAM9wsX9KDcejslxl1SqgpTK+nJ6LJP32jr7AVDWFUr1sbAX9oI4EVeZok7QfSSpICmKkKY4cpSbPOWhQPdQpggVKkKD8tGk3AhUzCkqSosK0Ka8dOguBhTPkHIg8915deAkWMcGli0ohh3l4ECFuVAublSIO+XiQfnlCI7BobVXOYT4INHaqwJUXCUV1+OO6HUPqn/XBA0YhnPfJMSUx7g9IXde/1qA99R9t0XLOL0eivXGOox6LVwgCIKWCEHQPYSoiOMCDwv1DyhKju6lTFGqFKXO+RXrwA1csBuEYRfwgABq5RhDmLJAVAIMYC0Me1CEI+XlzHGKeeAEnBafdFBUHkXlD0UUK7FHQxAEERAEEUvELYg9ALxA1QMUuICHcCSXIboBRsXRb32AMzlHPf3L87pFpik149XgSKLrYiABJiQbu7XX0EZ3qpa5pRm10HWgNpbmvXY2psKEBVBRiYumxxD0yfF+4RFhcOKf8uTBydDgQG9QA2iNNAqnhUWBFCuRLAAGylcAEIhW6rsQekPBdeKnxE2kSncIhFMQTwLtqlUHw4S5y9CmoHva/VBPrVxRoSAQJgJKgoic9kRheIYBERIBcwcACx1JTRqgQScM5u6itHBr0qhBsxat2rTrgDEjYrt2VZyzqFi6XHNdtxtQ2CIOaKHU/e2ri+Ee7MoA2fSUxbwhIBp/6EsBkrpI3jbygQfuiQiOrDHBHxAwqwyQgDwGALBLnUWCBAxYjpb9+Roy/wk3QM6CbfsB0CABSxQAnySXXv93+42ZtuaTv23HZhtjsRhL87XmG8w3mW8+33q+NN/tvsvue+KI0PgLi4TLN3UaMG7Gus+UbHrWnK8332j4spfb2B4r9owh3GMQ/P1r9sv3jkH4J/6/8X/35zeIF4eOyoczmc/Yz+9yx8tGBoAK8xg3HB/3Xk/VY2LM+/9p0k2ZNuOxJxgy/GvWnHn/WcCUORZ+dZZsb73z3gcbcmziBQDI4H0igCRkjW8HQ0ISbLrkpsva+aYOt3TqF2HAqN40JtW4af1pRo/H5k34z4I0Ty2b8twLDC+t+jetYVr3ydP0WaYvtr323Q9ZfvrtbfojJ/2tNjOyY0BujRxSHRqQl9GXAgoy+mFAYUY/DiiqJdZsXwtAMZBYr30DAKVAYqNqk4BzWWLzgAtZYuuAylpiWbUUUJUldguoyRKXBdRmiScCLuYjazwIlyBQnNDxd6jn4zYgH2sRfLeGyBuBeX8dvQgt3Aq6mTwCBwO5ip6gBxjoGBZbM34NE52ChI4XgbqSgsMohHqFmIhSL8HR1+qELePMETQQxH8ATAWSCRJ80KkVSFyshn4rVqc4xO4K9/sBbZUfGmjTrPCOlAJr8aYOsysMEbR4GDZjo5nqxAmguf2d+5ll4+q6dZTUZq1hMoksN66UXJTBBGyt+DrbhMcLq9Bk+7CpxVTXjuuYlC46w3z6kfH9bpWmwC9ElhFLbSMmAlXH7IyhWaYUCy19n4kkfj+MNwH1CXMxzHzrLGoTEVEJIpwww/SO24xCz4blyGgkPPISNVwJHMS8s9eaLgV7MO1MMFVxzgWKDObEffRpbR65hHZghKBm46hPHQIbxBUaIedU2SrMOQQSCxSYE85BZDigzEa1QKgIKEMqmHOWKIr7/orgvAATAUj2mnDy/ahrDOXUW7VsRjmHFUELlLgbeqsOaSaMtOVts1bo7cfGG5ZmMnzyvz7a9D8A49yfhKY0fT2zRlfuOMrMoba1d2Hf2SfChT0yvB6uDam/YVYHeti3rIR00JWgXBrYWqccXULUgWBDLc56ozkbZOKZwbkbwr43STuwCuPa2d9GGGB7Fc7RbV2Y1ryEAPZ+fo+bAVMVWitQuWZzibW7iEwCHXQ7lilW/mPjcU90+t1SKzITRy0tdDnD32eBJegGqTt8gwv7C7U0By0yLHifOEbuQI/HKbSqiN2A7cIrLxEuI4jzhl62d8SsW0WgmoflnBB4zekZkQIL7kLPmy8SnYVExDCJn/vsvX46iwidi74aH8QGlQbnqrSnHdb+O9sslbarcTLIeXWoS3vjlXrP/Atapqv5ib+Vp+qjuFwuDUd/fyHu9CVTIq+qFWJV1Ca09xxlk3lq/Sq37HDeHFvIRQz0Bit3uYQ2MH0kRGaKWNr6gj0uyh0nEF3uif0c7nh4lCgrKdH9hQwYPB6dSzZHuxICRr/dIPICn1SQxKhh5hC5lEbayfHCibqcyA3ZtYkTVgm64xjTZc9SxrTlX5q0if+LMeMTHtRHRueOGGKjMO15oLHaiPWlWmRl/IO10evXz7Uh09LcSPILgN4V8uqJuvCbsexNLzoP3QgU4zJftrAt4TZuhNhSaFJDq30QNy+xijFVzLR5y1ZKXp6namdX7u3I6Z6K8vco9tBP1UZPnALuwG2CMSEhWTElyCqRQIzcxyntYtKFHuO26n2pAIJzuhqKmVWMk0lxlhMvhrOMcQYnpoV7MSCclFSNxvg5F/MSasrgQr4o9P/8ce7LjPQpQTUxFy4xpt29wJlYCQSLskVnUbXUlJD+kq+gImoiUOysTerfknkgSGBDUDKkls/jNmRXBzLzuE4Pph76s3u6BjIpbNN2/uUtpLEO4NfUee3hd2ICHNJIbu7KwOJmXM0OKEjTZcEy+gJZO1A8QqI9juOkuT8zAuZZP3b47Ea8GRr/Yqom6GrAfgurEO3uc8eXUoGKktCRgBAsVnVIoJf9NmMuK5NrsY9ALjf2gU9eNkQ3qYUTAKnCxlt0ZamUlmPRKIzah/3WyZgfmmfwywWHYariaOMQdaAnLtycQZ5AEUKtcuPbwWIRiIXc0guTOqWrEHyCxSaVinmQAkGenh5YyHy4OjCmRFbrOukQ0opaxEEb9LTnu4pMNA5oajIR6FNAvzNYBLI5H1jCNkosMq20DStOahu6Tl25xsb5RqciLQK1kSpeRs15JKSgo+2DBNpTgyY1mugTZwLBQyFZ2LYikcEqfUfXzD5bqRfbmJc7cYYTstDGs2DiLeG4oBCqhtfubuK8OpzZGwftSZqHgjNcMqO0bGJkQTvYWwXWjfQkKZ/6Gt0O9Ma9RrPA7FkHm4ogchaY4T0BfhuQpl0SlqxIwD6dfNlAQepRTVGp5sm+1YGJbv55UKec+VpxVrICAWlg8rr/IVfIahPZWyD4cFFDlIMc+CTZ15JKxmYxJL5x33PQTi4/jNDXsEHs6OL1DQlR6YioBK1LayaotNggHdb6wZHpOYgdxN2h7EuKiQ2Cu82lamU02Q63JmZzS29vUgECR0IeX+G5RNlpnEnO7QNnchXLXsAOlQQHHeTBg7EsUtguvOiQEKbkgjf0n6GjHfqwIC4SWja8GiY+QtaysAIH+Xtc/S34rotjyJiIgZU5ikRm+iLHHqKCu1qwRWEv3fudKN0MuGkIb7vVjGeHHxCp9OWJ6ErT2plncvoXMmdytfNnJjFy1gw9xNMkd0saBFfI4o1358aFbq/Y7HG+0KmQY85AZYiQxA0RN7R7GoFWI0woIEO6jdfg5/lv1W9L8MdgGrzibDAjUzPbmi3IYPDcUi4SpawuXitn7HSA2yOtc0ts4mgYWjYsiSiVXBuGBQjXZXxxpS2Jq6yBdvXRk6hLpa/aV6B4YBjv08cEdkBW/TjBgnZNauhzxqZs3IZtaqmJYIwCdm2CuAwGScMv6WjknojNJSYEDVznSdIe4CUSKBCkndAmwd2jkRJS/wOiqKUozXfWEQvrk2GMFeh/k3cHmd+e5nwHpxKCSAEShab0a9gp/nOaf2S/o/xG9ll8TwiBm+JxaYSCbbEJObCxpFX4W0prjI5tAu+5849d5//w4G4tCb/Zm21f/T+Nbt3FsPz5tFFX9NlIbH+MUDEgQNPWNDZJoT5NdbIxox4IqtKPpOXydp7MulwVpi68NL3QjJdbr8VparAvCppfbCLx6mT+zMWP3/nLtb88S5po6i/tPz5fgrJign1I+C8ng+NvE7413p9rF168tNQhevfryFZSZJG3V0igtyMl6O9ysaVvgGqGS8vU4x6h4YtDo7tnP42xk5KyqVHRYYBXqWC0NOfkNTdnG6U3N+VkdtbnteAMzOxO65jaGRsbmNknmTiQDx9VYHY0ZGa1N+ST0xqbRVsbs1uw+hYOOkQjG1NTQ3NbbR0zW5Pf7ATySWpUAhnss/zDmi+ftaPolRu2TY+xLj7oy3F1rQgy9SGLmmrRS//lS2yb2xGz9qqistCVV0fiKdba0at0F5p/aiJS2moXkBRu+nbeQdPeSo9s6wkCN9L3MS9ieyHZcj2+9pNhhq58fh6l8yaHGNjLty5eiJdnZuh+NoqrBqvTz2Orv9swifLM8rOdS0p795yfyM/+IJ+ZrP3pVDKTYxpEhh8pOKo1y1L5Ha/zu0tFqbapOo5zFQVfP9S1p9gfZN4cTnie0LXRlfQ8qXwDaslp5pouMkwwuPsMOiE4aBZsOflG+ED4727GZgRNYxN9XVNjqrEZDCT0H52X7Qe9I/6E9zqfNz6qoQo7hPeaXz69V0QVtoQnI+7F0SO60X6TR2fG42gRPegI/N26X+yk+swhIP7btCIQRHWqtgyiJvtGpxYmsjNiZl/SSme/zt4Ji/uYe943oR5EfcllEZB2JjQoNCrSJzHSlR0ZfWs2gLH4Y3HYJ6Hd5x+6VMLVuBHe9WdPeF70sb1S6GFnUulRZzPjmYVAUOK4MXxDn61Pw5dKkhZ+SWJaEr0OQcdji2X+J/qSrn6ayTNrXK+e/51eTOBfc/d+4AuOj/SLTLiYk5FdGavnesQG1Hbfun/wIcp+umecGndz8Pmu/55jhWYX+XVxtsnULo8PN60YzgdNTK5k3ltIvMyZ3AAkf+lj/tJ/txSbX4a/APGYQkhYo4f8GZW4W9QBzMuFp9hX/bT43ghFd/nQxpC+T08fTX56yqdsHZrCmE1KDwtJSF6Kiz+44xkW1xdC9fcLpfWF0kDxtXdsSt3AG95nRWffzaXmLyFkYf0c3xov9MD9o/Po6sQzfuNk2yPGnpfTh58ktDOyE5tANdr8BVvFmjaoYk1lgw6b1+OBR5THfQ94Fx/8+pMaQh1UQ6ifwL0tQ7dm6M75BLKHm4+LQ5CXLRthbUwO33/58Fbd+Zq4GF0TpJCtdsrY6DQxgiXDv0ihT/A8P5cl7t3QuqBkyjQ1KTn3SXBi15Uk3FBBuF2KtIOuspLQaEZA2iKuQyBSJ5M4IjfcFcW5wfM5x+3gjWm7m5JfjmeNTykE/wmZd3no/oT7OI/gcnfKl+2fAYtdlacfU3kzjfOs1Tw9Dtic3BCSj8idAS1FWxWaDccRf9abIzQWp+/BxieuUAY4Fvs7MjriF3Ix8B/aoRRWwiT+2bfdReP76Bm04DfrWNneH9EMik9onGfaNlh0Le5++w/2ZydnfaE8OpE1Vawp0HL9y3Hc3o87gtUlOQUNrM/I29SN5u915eUZwlWyP5KdgzJtdaceGU/Xayq0jHL7rYg1jM/+QN5ab07+HAGdqByHgdsPegDH6nrUXeIA2teCTYJ/A45V8+hSlwlYwl2LgL3B127ta6hQQSejTE5FibMPfNr/6oc0nqOV9RXdiNwYw3YNWTseODkgBdYpsPNZbubQi/z2yPXYgYs7lzpH5DLsHv9+jP02v/J9dXKHGkUNC4hh0kGVWt851nI32nLbW34r7WccHf7nJBTdL39QUjEWHBhliem7iam4kUWM/VI0VWzF54bYrLdoykuh+WAdCb8fK+PiuvyukOrm4/sF1q+vzZfqCbVf7xJpP3caZmzmzhkItfsJtZYTYXYHu3UTaa7vAeS93ec+XGNz99/tivYf+A04luzXg78fz4tu/j75QCEzPykmujAvEVEH65Jr02lyNKefQ3Wlql8fGbLOE13d/MS/sdu3fjfXnfSd/UYPV1NLqlVBTPHgBw12eq/mS/JGElUMPfh2af/CphSmRNIYyekID2g8pnsxAz2DA4ljCfdZB9+sVmxGZE4l7UQVpGQkZAV7WpVSbP0mUzwbI2/umf9Uy0ktmcz+nVCXeYHBoIApdmVs5dfK0KN0MJ1jTb6V4v/+/3HuzUc7UyWlF4qOqYxBmdbeY2f3SIyyvkk0sHaD1eUgfqzRr9041pagnaRgtyT7OrL5i/+YoaCf4SxIlV5R5Dt26/HgsqTGbs3dJ4aWex4fg/DfFl2iB9MrRP+IHiyt2Aep97kfaNXLixA3Hh26BIdHZxoA79hwtwI4nlQAYsD6fAIv+xngqaASOJ5U3m0CvGMTiNs1dj2akplvk56fBM2U/vL+cpAoe/yAT243YP7wGJyNaa6b7M3ugJ5P5WQ7dz8v22AbItuZVvnAMfHeq3to+9sSKQdBtNMoyeD/R+mZme4Ohm42QDoitPNSevRecBYPdQnwwH4mKP7a2KvjnFt4VvzV6NrT2feIeRej4luQNtDocKUHY8xXMX60zvv+tDdcxzH7vnNIrQxuvcTdXMW4RdPdopNboUOSldQOFsf+X5cbbg+my7ABD0s8EaHpN++9V9z60pDUQyvXZ0zppZZHJ/eBk/D6wSNbB68k/HmVn7v8eR/qM8ydUV1FbwpipiUQvRYo3KSLfnG5AgnTQhyxZxLgCbOhu8G3e3y4m0gWxN2lq3Ze91rqXmKC9bGdjZMjvcEp3KHP9s1xfntFf+1DsIwqjmDUx+amJRsHUa/e+yz75Vsdoy+61DBxST+uNIZxF/YMj0Rn33TB5gyz+yK93DxKyKk4NuCBLZLZBDYiqmG4XvkGaaiTjRiGRrC3nlDZWN95kTQz4KQQi6bXidRmn02HhHsPXftVUw8Zq2PFQ3ei90GytP9z2iNCwEeeYYw9tWygNcxf7xxFBsbZA4HOnkG2QU4iZFhlT2Dv3SvRihZgE2D3CgGfQC8atsGlPWTfDXTy8S8lM1A2ASxOXEz88yar7JnAPu63nJfifq1kn1sVUvizxdmUfWc7q7+3Pq8/lp57B0io0K83MgPXKFSEDbjFl1xhlNSesZcn8F9wV1LuxpQT417qJp6jpvWBxfE/69JjN4KT+CgLgFtk7wRHtA69k9v61ph2h1pkELdhQCugMnrhH2W378pNmskrbMJbXIxjXrXKAVg8rkshfVe2kbzh2JT34fbNoY/9F9iGgW4OVn7GOhru2gd0rjhYxDqWfOkeyZj2PNvkvYG1p7v5evkagdicLkd/d7+bDv60TMsdmz3moqr+17qvcYDCAIWSOMrqnhy+y+6bauvSTuJiE1bh54v8tvhfe6mEf/fWE3aApGjZ9n5TiEqYWF97szYhxCBsdr5efn0LACd9+U1E7I/x/ndm/gy//TFjEV7YHj1bxoitPPcR2FT9cueJm5uemMURt70jqnhIHiQOhV88Ni8+YlkJXoFePnjPuVeD1wZfz6LXu5evKsrntqvjfi68andpd30zh/vZrg52fE2Av9cEYotXNTB/ZtZv2N+wfz+N+XNVQz73hlLXSu/Eq6FrQ69Gb19b6VYC82Eh1t3nBSYJ6hey9CROkMwC7QbbbiyWmTAIRel6hyVJthF20FL+GGGgiABNXYNsoqtHNtFQJ5vo6ZJNwKLDmR6Is1zBZI48KhZ/P/H+5uGHB5f2zz08dPPwq4mXNeI9/2GqVvCeNKrr2i51ILOS2mHH4K9mnrbrgfv7HtgEyYS74nsuj1dxfHnw89259ac93zyDgjycA1KDOL+ojwNpJqQ26eGDmsSU9LxCZpZv1ehEaH1hSV5hflFl1MBQJbWoNL+o9Byl9sGgd1VOXn6RRlp8TNjkXerSXVro5MfQh3eoz+9SQx/CEWFLnBef3f33FfI58uflZXdkVc6r5KhU/HC4LwiZfOKr4hOr26tgNDje0+rE9O3t4Bt9v31oYfoLhFfRs2LzPCzNM1z61G4r3Q1zuxDW0+xMVCRl+rUKPVz7zPPyEZtSlBwTn+NhY0d3SAscjHSuUAqzEjEVD5FMsPaxL5O7pvIiSo5mnekFuDkHJT1SNInkRyJF65EmFD78Ow0Gr+0qOi8T78x2n+m8N1tb115fXu3lauPkFpAZTYsOzHB1drbyaWA0lu8XbK27KFBXdciu8pBAI1Go5fwha4GmB33OJmMpxmN9zmV9zuSJoUGj8dvO4DkgQDKzTohOiwsOb4rpCFBOpuoaKSm08wV1pmRlXyhiaHnvs/JMlbI92pxNMQX7U4pOoHU4egIb30YCh4WrNVsLPJzAEY9FF+vzNvsutDETaXQd4n7l8Do86ZxA1eAlM10985qMQgM3bTVDQ4Ib5INKA+/V2qsgShuhXKhZOl8ZGlZZuVRdQ8lU1TdUVdE3pZBNg4zIID2c7jjuyFhg+I/7xy4IH/tlPWINXZV+ifuxkQEkGTsVgq6uWh+1uSKzsCr5bEiwv7dDbuRZEBgJs2Z4H7XTUSCeONrnWx+fVnglJpjOVCqTKqCwEgszW5PO9J3QV9E6PSbjnwFuIKwGu0XkhkFUn5CA5DmlUpoJMUJswgu8vSulNNZMbWgLcIvA4LRa4/w9P8f1Z+0w4FiQf59gbM40MSecMjcm6poagzbaUC5WEtxGq8Jn6RnKycgaHrHEHsoBpLKXMCFfEh4tDBxU70v3htT6BxuNLt4eqqm9O1zXifVxC7OycAkBLytvtzBLC7fQAKCVIfEqRUYWAcHOXhQPbzdnp2Df1e/efpwemno10dNQecXVzZzMFSWyraZhaMKISRWvjAnQIiGN33b7lu0RFVXWy1GmwPljo/uF75+3VgyMFcsEs5BTumOytJzw4Do1jEgggs2RjdXr2V2fbuJS3lK0OTQUSJorJwl3Xhst8HMoaCrZqh4ArVMDptOGyYd8CQ52mRutevc4Gv85c7D0mLlq8Lbo96oojSX65avg5sS44Ef21kk24Fhbi2vbiUWpz3PTYxGI27KeX9mcuj3f16Ij5q0fuZsoeZJo21VqlWXattAzZtV6wklh6GHSMTVvZ3uSooFLR6ZVppVT4oS5tauXVQ9mGyy8RH7nXiKazdkyWeNXq2s32971k109Apxco5z0vgiV7PSMvghnpDHHkdlN9EP2Lc6c8zXMbIrmoFGDgfrMabWUHkIm4cHjkUCE7mGo62ahdG3dNyl7V9LIwTOhsaByfO9vzmKbxkT8SnFezqvExFdZ5ZFrkwmMkkgXhebE2IdM89C2M4nWl6VNhjYVWczrdPPQgjXkb6pukZTTVJ6U1xQekTXeAaQow6+zX7e79I1No4xN9EmzWqZNsXU3CYaR3KUETWNjGzamzLVRHA8bFhT7Tw9XEMtm2t35ALnkU3NqsnxLtfq0t4zXqma7V5yNZZpukk6XlOOz+oEUJfT9tdxQEf3iHJfY0sHRrNHXx/Fb2Ma03mh2iGlsAhuiZsC3UTi2ibOklBdpIbQXCXKXN8c3Crv9Mvg7PeEwcNtIYb9vIK/GGT7Xy51TcFttsGsGXE784Jd7+TODRbS96R4K85voRlYrd05RDc25QNpQ0aLGUOcRMeZ7bkdGx/YbvpPoF87WjN5YekbPQCPzbgwts1dHoM+eniUcc2NfRGQsqKh84BkuryqrGuTjFy6E3QEy7slxrQl0L+8EemtSnMC0vC5RTp54WkFOR89HRw9Uae/Ck4q9JFOCTrWJnTCSK+MITyr31LzkrHLCSR4EG8XizVwYaGHFXA54BswA91eIN3NOQ4tr53ICg2agXTrO3C4JLS1dzAA3/2lgaSeZ22Wh1fcX+yBE7YyC73dikrljPqb84eJNX/8l4EzHeMbE+AXSY3yOe0RHB/rGRCFucEp0u6DpUIbwoYwm2HW95UX9rtguhJbQ/1cOQu3KLj9cx5W2inAPCfGH9P0pcPwQB9Ke354yH1IH759/xH5TGAfFH/kf9j9/uY2zzjffL8UPdLbCchm/u208JBNICr4x6JplVXLYYt+xiWz5qAhfL2/9ue45ZqDncpXLT/vzmYz0uG4oObvzx+8NN+eHRuJI8oBbZa8+R1MFHn98IlP+bIbNpDKnhJbvVeKqEqcWh9wmuIa+YTTXfRvYon2xpqWopLaltqKmpqO46GJ7bR9PCy0Kre1poUdgLgDPY5z+j4KHpud5z7rbdQGcMaE/7lIX+7bmwDtJuXzjnJ1w6SI5PTcjLuZKRV5qezri04u1jqIlauiR9EhkOHr0yIXiLA9eb0P9EBozP47eVMEsbW2sUnzyaf15ebOs7tG1Y8XJqiQDNSp0tNm0jdgkdZ+LgXNEaqRaulYK5VJsQV5dTEhKulakGjW4kpaaVkkTP6S65UKUp/wdbp1rdRhxkJT32gVrqroaLknM7MSYljpG7uUG5Nyp/54tvADh0sIYa582i6MGRrpEFWWiuab6KRJcy7vdejvud/wYOrmrQ3UPZzdAdj4bsl16trMHJwj9C8BBaPxKa5K4nayl8ATWSLdXfZuqajai9urlaXVLWl1S43gaFezUNHGc2viWGFVqfMapNI6ZqJrQkGIdrVlpSR2gMlMI5Rq69DmzV4hdMrcHAWfs9BAoTZU2Z769bOXxZc3VFkp4xWibBOFYwgTorrQA9CHSRO6XW+RWuU1ulzugk+IJJrd2XG6lfjva1JwnrQ15Fhg+vshoU78zxce0UticGgUkldh2f/wL0iv1vW3a8KS1TM8CWeMproOsp/4470mj6lkw1MdTho+p9Irw0VTODQiyMjyVlWFRVoYll3JHw5maAiAoawJL1qzs8owCRFg7UwQYHKuvA6APmyGAR8X+5eSiA+FGlKvISqHXVEyywqAtG9PLQDYOESOUrdi5bKecB7mT9W/92UnbzKds/CivQ1ggaPNaTYebto+Dm7It2LtszSNuSJ/mqPEUqaYzG67KzmDhcq440LVTrjHdCbAH3C3KLoZujDGxdgHfzSH/3ziKTf8HIG18azVlTW7R07J2d0c5mZEt3MkFd2eAu7W3sVJe7p0CX/6/fltthFVFKkqjtj7zaoWWRHyaxBAL0BcngJzxrUs1ANWoinudxTTyo7X3vEkF7WDJOkHMB/f2PmpRAYPiGEZh1PFXRQ6uOCwmCQHcLjO1QlaXT8roV1cmYLFRH/qIMoDdb6ZdyDqrc40JgDyupesAej3axsPANaHW0d+K3v6VKQO4dWcnBYyNfnCmBlndj15UYmvdLQVZXYXCAbDvSi53l78mgAvp6tvmI7ycB8vFRn4rC7Z0d8UzgaupqRsZLwDkzv5TIUDPRtu4pZzR/x9ttS/uo2IB5q++zRLVtCeAC/F3TemP0Fvzeym4EC8U3sW+Oa/B+37nEQDoFmu8ZrzdTlxV63fOfcsBAMDIT4LbAYC5ZvPd/8f+n1vebbmzALigAAAQwHHeYgTAdW6gdaFbBSKcajPz+Ekgi2VtdCuFUcG/XvOq0KvaX/LtBzg0FzbxQEo8IZXZxItGvw3ZH5eQQ0tmykBTWTCTZmJNLIkKSSU0YkCCXm33OCStrZMrQacrTnHJSMkVWjMprt2WUOdV1jUFdIKyYhLzf/dFofSrNUJPXZ0h23k0yS4yQ7itdzJmqjhwsrzqj+7MMqlnKY2qS+yyhGbcFLoA6XqJo95gFYoY6USEG+HNc6lmNUzcTbHsuFSqhFJgWYx5103ZxjzZymZTZ8QGj8RAxo2ShcMjb9pOU86KrQLkSLnRmOFGDjONFpx1CXp+s6dvOVx4h3IVL7nbxFUagep8f8S7NVocxKxEfnWDR6/hXkQ87T9Z9YNLZnCf9Dlmsfx8zbHCJMebeqYquSWXCc/YpjXvmnpUiazbSnKTQegpCAFh2s9hSjah52vufYbz9A+ryVFgrtCbZYzt0mfeGYLrgbJalzUNMqomgVWMVFks67y0EFM46+Y3I3DNNWVxTUwuiOvSaiYFqW2Ab7tDuU1RShGhKY6YnJTioazeKCeihEYwu6wmG9tUK49HpautZqJ1h+zsKPQcWAqIKVEnqsSSmJtqnhheK9M0WhgtmepO47uVyu7QWpqtDIeIjQmvctt4GOq3VGnMpi5Rs9OaD+OCoIJ9ijAlxEZ3q8K2cSvUZp3SmC0KHW3jbeojAD4qtIcFXFQPgB+g0B3g59viFAADqeUBeIDyWIQYj2NR/GIqMalKLI7FOYHJ8JDbG+VnZwxJhEixogQLFIRKghIFiqMigSxCBQ3lf2Jj4XzJMV2HhIZtGOJsxPx3x1+U6Iz5JTk2Ivg0hJqUYJ7IBqMJo7HA0wrlnUoclChnBYvwhxO5lcrUnXqV0epC08uiW50qEoH8CHRHjrfInPkG3P3JiRAlkIUK83VE+Guys6hlxhiJAQu2q5B9cEhhYPBIf8/JTwAA", + "ok": true, + "headers": [ + [ + "content-type", + "application/octet-stream" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/runs": { + "data": "WyIyMDIwMDMzMS0wNjQ2MzcvdHJhaW4iLCAiMjAyMDAzMzEtMDY0NjM3L3ZhbGlkYXRpb24iXQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/environment": { + "data": "eyJkYXRhX2xvY2F0aW9uIjogImxvZ3MvZml0IiwgIndpbmRvd190aXRsZSI6ICIifQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugins_listing": { + "data": "eyJzY2FsYXJzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IHRydWUsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJzY2FsYXJzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1zY2FsYXItZGFzaGJvYXJkIn19LCAiY3VzdG9tX3NjYWxhcnMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJDdXN0b20gU2NhbGFycyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQifX0sICJpbWFnZXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJpbWFnZXMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWltYWdlLWRhc2hib2FyZCJ9fSwgImF1ZGlvIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiYXVkaW8iLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWF1ZGlvLWRhc2hib2FyZCJ9fSwgImRlYnVnZ2VyIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiZGVidWdnZXIiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWRlYnVnZ2VyLWRhc2hib2FyZCJ9fSwgImdyYXBocyI6IHsiZGlzYWJsZV9yZWxvYWQiOiB0cnVlLCAiZW5hYmxlZCI6IHRydWUsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJncmFwaHMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWdyYXBoLWRhc2hib2FyZCJ9fSwgImRpc3RyaWJ1dGlvbnMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogdHJ1ZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogImRpc3RyaWJ1dGlvbnMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWRpc3RyaWJ1dGlvbi1kYXNoYm9hcmQifX0sICJoaXN0b2dyYW1zIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IHRydWUsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJoaXN0b2dyYW1zIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1oaXN0b2dyYW0tZGFzaGJvYXJkIn19LCAidGV4dCI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogInRleHQiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLXRleHQtZGFzaGJvYXJkIn19LCAicHJfY3VydmVzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiUFIgQ3VydmVzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1wci1jdXJ2ZS1kYXNoYm9hcmQifX0sICJwcm9maWxlIjogeyJkaXNhYmxlX3JlbG9hZCI6IHRydWUsICJlbmFibGVkIjogdHJ1ZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogInByb2ZpbGUiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLXByb2ZpbGUtZGFzaGJvYXJkIn19LCAiYmVob2xkZXIiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogdHJ1ZSwgInRhYl9uYW1lIjogImJlaG9sZGVyIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1iZWhvbGRlci1kYXNoYm9hcmQifX0sICJ3aGF0aWYiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJXaGF0LUlmIFRvb2wiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWludGVyYWN0aXZlLWluZmVyZW5jZS1kYXNoYm9hcmQifX0sICJocGFyYW1zIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiaHBhcmFtcyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtaHBhcmFtcy1kYXNoYm9hcmQifX0sICJtZXNoIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAibWVzaCIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAibWVzaC1kYXNoYm9hcmQifX0sICJwcm9qZWN0b3IiOiB7ImRpc2FibGVfcmVsb2FkIjogdHJ1ZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogInByb2plY3RvciIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJJRlJBTUUiLCAibW9kdWxlX3BhdGgiOiAiL2RhdGEvcGx1Z2luL3Byb2plY3Rvci9pbmRleC5qcyJ9fX0=", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/experiments": { + "data": "W10=", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/tags": { + "data": "eyIyMDIwMDMzMS0wNjQ2MzcvdmFsaWRhdGlvbiI6IHsiZXBvY2hfbG9zcyI6IHsiZGlzcGxheU5hbWUiOiAiZXBvY2hfbG9zcyIsICJkZXNjcmlwdGlvbiI6ICIifSwgImVwb2NoX2FjY3VyYWN5IjogeyJkaXNwbGF5TmFtZSI6ICJlcG9jaF9hY2N1cmFjeSIsICJkZXNjcmlwdGlvbiI6ICIifX0sICIyMDIwMDMzMS0wNjQ2MzcvdHJhaW4iOiB7ImVwb2NoX2xvc3MiOiB7ImRpc3BsYXlOYW1lIjogImVwb2NoX2xvc3MiLCAiZGVzY3JpcHRpb24iOiAiIn0sICJlcG9jaF9hY2N1cmFjeSI6IHsiZGlzcGxheU5hbWUiOiAiZXBvY2hfYWNjdXJhY3kiLCAiZGVzY3JpcHRpb24iOiAiIn19fQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=epoch_accuracy&run=20200331-064637%2Ftrain": { + "data": "W1sxNTg1NjM3MjA2LjAxNjYsIDAsIDAuOTM0ODQ5OTc3NDkzMjg2MV0sIFsxNTg1NjM3MjEzLjQ5OTgwNSwgMSwgMC45NzA1ODMzMTk2NjQwMDE1XSwgWzE1ODU2MzcyMjEuMTU1ODU4LCAyLCAwLjk3ODM4MzM2MjI5MzI0MzRdLCBbMTU4NTYzNzIyOC42NzgwNTksIDMsIDAuOTgyNzgzMzE3NTY1OTE4XSwgWzE1ODU2MzcyMzYuMjY1MDE5LCA0LCAwLjk4NjA1MDAwOTcyNzQ3OF1d", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=epoch_loss&run=20200331-064637%2Fvalidation": { + "data": "W1sxNTg1NjM3MjA2LjAxNzQxNSwgMCwgMC4xMDUxMDg2NzA4OTAzMzEyN10sIFsxNTg1NjM3MjEzLjUwMDIxLCAxLCAwLjA4MDk4MTU1MjYwMDg2MDZdLCBbMTU4NTYzNzIyMS4xNTYyMjYsIDIsIDAuMDY5NzUwMzMxMzQyMjIwM10sIFsxNTg1NjM3MjI4LjY3ODM4LCAzLCAwLjA2ODg1NzkxNTY5OTQ4MTk2XSwgWzE1ODU2MzcyMzYuMjY1MzY1LCA0LCAwLjA3NDAzMTM5NzcwMDMwOTc1XV0=", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=epoch_loss&run=20200331-064637%2Ftrain": { + "data": "W1sxNTg1NjM3MjA2LjAxNjI3MiwgMCwgMC4yMTg2ODMxMzg0ODk3MjMyXSwgWzE1ODU2MzcyMTMuNDk4MDQsIDEsIDAuMDk1NDQwODc5NDY0MTQ5NDhdLCBbMTU4NTYzNzIyMS4xNTU0OTcsIDIsIDAuMDY5ODMyNjM3OTA2MDc0NTJdLCBbMTU4NTYzNzIyOC42Nzc3NDksIDMsIDAuMDUzMjE0NTAxNTg5NTM2NjddLCBbMTU4NTYzNzIzNi4yNjQ2MzgsIDQsIDAuMDQ0MzQxNDIyNjE3NDM1NDU1XV0=", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6006/data/plugin/scalars/scalars?tag=epoch_accuracy&run=20200331-064637%2Fvalidation": { + "data": "W1sxNTg1NjM3MjA2LjAxNzYzNCwgMCwgMC45Njk2MDAwMjE4MzkxNDE4XSwgWzE1ODU2MzcyMTMuNTAwNDM3LCAxLCAwLjk3NDA5OTk5MzcwNTc0OTVdLCBbMTU4NTYzNzIyMS4xNTY0NDgsIDIsIDAuOTc4Mjk5OTc1Mzk1MjAyNl0sIFsxNTg1NjM3MjI4LjY3ODU4MSwgMywgMC45Nzg1MDAwMDg1ODMwNjg4XSwgWzE1ODU2MzcyMzYuMjY1NTg2LCA0LCAwLjk3ODEwMDAwMTgxMTk4MTJdXQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 821 + }, + "outputId": "eeeae4ca-9663-4ee3-aab8-73ccf8379970" }, - "cell_type": "code", "source": [ "%tensorboard --logdir logs/fit" ], - "execution_count": 0, - "outputs": [] + "execution_count": 8, + "outputs": [ + { + "output_type": "display_data", + "data": { + "application/javascript": [ + "\n", + " (async () => {\n", + " const url = await google.colab.kernel.proxyPort(6006, {\"cache\": true});\n", + " const iframe = document.createElement('iframe');\n", + " iframe.src = url;\n", + " iframe.setAttribute('width', '100%');\n", + " iframe.setAttribute('height', '800');\n", + " iframe.setAttribute('frameborder', 0);\n", + " document.body.appendChild(iframe);\n", + " })();\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + } + ] }, { + "cell_type": "markdown", "metadata": { "id": "MCsoUNb6YhGc", "colab_type": "text" }, - "cell_type": "markdown", "source": [ "" ] }, { + "cell_type": "markdown", "metadata": { "id": "Gi4PaRm39of2", "colab_type": "text" }, - "cell_type": "markdown", "source": [ "A brief overview of the dashboards shown (tabs in top navigation bar):\n", "\n", @@ -321,21 +488,21 @@ ] }, { + "cell_type": "markdown", "metadata": { "id": "nB718NOH95yG", "colab_type": "text" }, - "cell_type": "markdown", "source": [ "## Using TensorBoard with other methods" ] }, { + "cell_type": "markdown", "metadata": { "id": "IKNt0nWs-Ekt", "colab_type": "text" }, - "cell_type": "markdown", "source": [ "When training with methods such as [`tf.GradientTape()`](https://www.tensorflow.org/api_docs/python/tf/GradientTape), use `tf.summary` to log the required information.\n", "\n", @@ -343,12 +510,12 @@ ] }, { + "cell_type": "code", "metadata": { "id": "nnHx4DsMezy1", "colab_type": "code", "colab": {} }, - "cell_type": "code", "source": [ "train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))\n", "test_dataset = tf.data.Dataset.from_tensor_slices((x_test, y_test))\n", @@ -360,22 +527,22 @@ "outputs": [] }, { + "cell_type": "markdown", "metadata": { "id": "SzpmTmJafJ10", "colab_type": "text" }, - "cell_type": "markdown", "source": [ "The training code follows the [advanced quickstart](https://www.tensorflow.org/tutorials/quickstart/advanced) tutorial, but shows how to log metrics to TensorBoard. Choose loss and optimizer:" ] }, { + "cell_type": "code", "metadata": { "id": "H2Y5-aPbAANs", "colab_type": "code", "colab": {} }, - "cell_type": "code", "source": [ "loss_object = tf.keras.losses.SparseCategoricalCrossentropy()\n", "optimizer = tf.keras.optimizers.Adam()" @@ -384,22 +551,22 @@ "outputs": [] }, { + "cell_type": "markdown", "metadata": { "id": "cKhIIDj9Hbfy", "colab_type": "text" }, - "cell_type": "markdown", "source": [ "Create stateful metrics that can be used to accumulate values during training and logged at any point:" ] }, { + "cell_type": "code", "metadata": { "id": "jD0tEWrgH0TL", "colab_type": "code", "colab": {} }, - "cell_type": "code", "source": [ "# Define our metrics\n", "train_loss = tf.keras.metrics.Mean('train_loss', dtype=tf.float32)\n", @@ -411,22 +578,22 @@ "outputs": [] }, { + "cell_type": "markdown", "metadata": { "id": "szw_KrgOg-OT", "colab_type": "text" }, - "cell_type": "markdown", "source": [ "Define the training and test functions:" ] }, { + "cell_type": "code", "metadata": { "id": "TTWcJO35IJgK", "colab_type": "code", "colab": {} }, - "cell_type": "code", "source": [ "def train_step(model, optimizer, x_train, y_train):\n", " with tf.GradientTape() as tape:\n", @@ -449,22 +616,22 @@ "outputs": [] }, { + "cell_type": "markdown", "metadata": { "id": "nucPZBKPJR3A", "colab_type": "text" }, - "cell_type": "markdown", "source": [ "Set up summary writers to write the summaries to disk in a different logs directory:" ] }, { + "cell_type": "code", "metadata": { "id": "3Qp-exmbWf4w", "colab_type": "code", "colab": {} }, - "cell_type": "code", "source": [ "current_time = datetime.datetime.now().strftime(\"%Y%m%d-%H%M%S\")\n", "train_log_dir = 'logs/gradient_tape/' + current_time + '/train'\n", @@ -476,26 +643,26 @@ "outputs": [] }, { + "cell_type": "markdown", "metadata": { "id": "qgUJgDdKWUKF", "colab_type": "text" }, - "cell_type": "markdown", "source": [ "Start training. Use `tf.summary.scalar()` to log metrics (loss and accuracy) during training/testing within the scope of the summary writers to write the summaries to disk. You have control over which metrics to log and how often to do it. Other `tf.summary` functions enable logging other types of data." ] }, { + "cell_type": "code", "metadata": { "id": "odWvHPpKJvb_", "colab_type": "code", + "outputId": "e6a5f6a8-7375-4832-e6e2-b4c71c4189e4", "colab": { "base_uri": "https://localhost:8080/", - "height": 102 - }, - "outputId": "cff49dc7-2c87-4ea0-f36f-f0af948d7a65" + "height": 122 + } }, - "cell_type": "code", "source": [ "model = create_model() # reset our model\n", "\n", @@ -527,63 +694,250 @@ " train_accuracy.reset_states()\n", " test_accuracy.reset_states()" ], - "execution_count": 13, + "execution_count": 14, "outputs": [ { "output_type": "stream", "text": [ - "Epoch 1, Loss: 0.24321186542510986, Accuracy: 92.84333801269531, Test Loss: 0.13006582856178284, Test Accuracy: 95.9000015258789\n", - "Epoch 2, Loss: 0.10446818172931671, Accuracy: 96.84833526611328, Test Loss: 0.08867532759904861, Test Accuracy: 97.1199951171875\n", - "Epoch 3, Loss: 0.07096975296735764, Accuracy: 97.80166625976562, Test Loss: 0.07875105738639832, Test Accuracy: 97.48999786376953\n", - "Epoch 4, Loss: 0.05380449816584587, Accuracy: 98.34166717529297, Test Loss: 0.07712937891483307, Test Accuracy: 97.56999969482422\n", - "Epoch 5, Loss: 0.041443776339292526, Accuracy: 98.71833038330078, Test Loss: 0.07514958828687668, Test Accuracy: 97.5\n" + "Epoch 1, Loss: 0.246790811419487, Accuracy: 92.85832977294922, Test Loss: 0.10949963331222534, Test Accuracy: 96.77000427246094\n", + "Epoch 2, Loss: 0.10359371453523636, Accuracy: 96.91999816894531, Test Loss: 0.08636220544576645, Test Accuracy: 97.19000244140625\n", + "Epoch 3, Loss: 0.07199089974164963, Accuracy: 97.79166412353516, Test Loss: 0.08041884005069733, Test Accuracy: 97.48999786376953\n", + "Epoch 4, Loss: 0.0548027865588665, Accuracy: 98.27333068847656, Test Loss: 0.06653563678264618, Test Accuracy: 97.86000061035156\n", + "Epoch 5, Loss: 0.04302898421883583, Accuracy: 98.63333129882812, Test Loss: 0.06645355373620987, Test Accuracy: 98.0\n" ], "name": "stdout" } ] }, { + "cell_type": "markdown", "metadata": { "id": "JikosQ84fzcA", "colab_type": "text" }, - "cell_type": "markdown", "source": [ "Open TensorBoard again, this time pointing it at the new log directory. We could have also started TensorBoard to monitor training while it progresses." ] }, { + "cell_type": "code", "metadata": { "id": "-Iue509kgOyE", "colab_type": "code", - "colab": {} + "colab": { + "resources": { + "https://localhost:6007/": { + "data": "PCFkb2N0eXBlIGh0bWw+PCEtLQpAbGljZW5zZQpDb3B5cmlnaHQgMjAxNiBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLT48bWV0YSBjaGFyc2V0PSJ1dGYtOCI+Cjx0aXRsZT5UZW5zb3JCb2FyZDwvdGl0bGU+CjxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNUUFBQURFQ0FNQUFBRDNlSDVaQUFBQUJHZEJUVUVBQUxHUEMveGhCUUFBQUFGelVrZENBSzdPSE9rQUFBRC9VRXhVUmZGbEtmYUVMdkZtS2ZOeUsvNjdOdldBTGY2OE52NjlOdk54Sy8yME5meXlOUDIyTmZOMEsvSnJLdnFoTXYyek5mMjVOZjI0TmYyM05mZU9ML3l6TlB5dk5QSm9LdmlXTVBtZU1mTjFLL1dCTGZlUEwvRm5LZmVNTC9xbE12UjdMUG1jTWZlTEwvYUpMdlI1TFBGb0tmSnVLdlIzTFA2Nk52eXdOUGVOTC9WL0xmYUlMdjIxTmYyNk5mTnpLL052Sy9SNkxQbWFNZnl4TlBxZk12VitMZnVyTS9pU01QbWJNZkp2S3ZtZE1mdW1NL3FpTXZtWk1meXROUEpxS3Z5c05QTjJLL2lZTVBOd0svdXBNL0p0S3ZKc0t2aVZNUGFITHZhR0x2SnBLdlI4TFBhS0x2cWtNdnVxTS9hRkx2UjRMUHVvTS9pVE1QV0RMZmlSTVBtWU1YUzBuZ2tBQUFMb1NVUkJWSGphN2RybmN0cEFGSWJoRlVJU1NLSjNNS1lhMCt5NHhUVzk5MzcvMTVKa0pobFRqaHJTckhSbXZ1Zi9hczZMMFlMRkNnRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1CSjZuamVucXNwemduUHJzckdYOVpwaTJ0Q3JtbmM2K2RZTnRoVlk1V3BNbXhRTFdQZE1zT3VZVnd6TmozZWkydDNtUXdhVjQzQkpQRENTMk5iSjVhRWV1WC8rOXFjalFPdGZGSWtJa3J2WTJnNE1WY21PQnNGV2Jvd0tPL2tOeWo2MmdScEpjRGFQQmx4THIxQjB6ZEcwQy84THpiSmlKcnNodXZ5MWd6bEE5K3JEOG1Ja3V5SUpqRkUzL2Rxbll3b1NtN0lVRVBvRC93dXQ4aUlndVNJRGpsRnhlL3lmWEw1dnVTSTIxQlRaTExoWG9PSUxNTzhIeHdhL0w4YkkwTGZtVWRoR293YjJadlQwZTU3cEZORGdCMDZJbFZ5am1tSUJsMlQvbmw5Unc2U0Q5R2dTRy9RMHVRa2FXM1hobW92S1EzZUZRNE4yVW85T1ExZUZac05lcmY3dlArck80cmhtWTFMZzN2RlZvUDgrOEJYZzFzRm53Ym5DazROVGhXOEd1aUtCRGRrVlZ0VE5Gdk5lbFZzTnFUYnlXbklPTTJvZVRSb3lXdndtcEpIZy91Y1hCcmNKdVhUNER3cnB3WmkydnkwVkN4OFl0WGcvRDJiVTRPZml1UTNlRmZFMktENGJmQ3FpTE5COTkzZ1hzR2x3YTJDVDROekJhY0dJVlE2WXNpcFFkaDB4RWRPRFVLakl4clNwODhvblo4emJiRkxnMURvaUZPNUJYdkRHdjJNeTkvSmhVVDhKVVpUSTB5RGFOSExCeklidnFURE5ZaFVpVncva2RqUTFrTTJDSEZEUGpLVytLenlSVEYwZy9nYTl3OXkrZkFOUXB4dlg4Q1UrTnk3RlVXRGVGM1krZzNsUk9JZjRrMFVEWDllQ3l2TzUzMVB5WWhIZ2E5enZQWkpVNWI3M1kvZVhqOEh2OUQ0OG42SGFGNUxiY2pSdDhUWlR0ZGE1TTFEZlhuYmtYMUMwU0hDRkt6UUI1RmU4b3A0R05HTkhhdnZaRVNiVndUNXI2VzF4eXVDUEJZM1k5WWdEcXprbkgvZTNZZk56enVMMzBsMEllYnJaNWtLdHVESVh0MW44NjhFVDZrZjMvNDl0THZyQ2NaeUY4UHUyMTVkQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFjUEliTnJCaE9hQlh1Y29BQUFBQVNVVk9SSzVDWUlJPSI+CjxsaW5rIHJlbD0iYXBwbGUtdG91Y2gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNUUFBQURFQ0FNQUFBRDNlSDVaQUFBQUJHZEJUVUVBQUxHUEMveGhCUUFBQUFGelVrZENBSzdPSE9rQUFBRC9VRXhVUmZGbEtmYUVMdkZtS2ZOeUsvNjdOdldBTGY2OE52NjlOdk54Sy8yME5meXlOUDIyTmZOMEsvSnJLdnFoTXYyek5mMjVOZjI0TmYyM05mZU9ML3l6TlB5dk5QSm9LdmlXTVBtZU1mTjFLL1dCTGZlUEwvRm5LZmVNTC9xbE12UjdMUG1jTWZlTEwvYUpMdlI1TFBGb0tmSnVLdlIzTFA2Nk52eXdOUGVOTC9WL0xmYUlMdjIxTmYyNk5mTnpLL052Sy9SNkxQbWFNZnl4TlBxZk12VitMZnVyTS9pU01QbWJNZkp2S3ZtZE1mdW1NL3FpTXZtWk1meXROUEpxS3Z5c05QTjJLL2lZTVBOd0svdXBNL0p0S3ZKc0t2aVZNUGFITHZhR0x2SnBLdlI4TFBhS0x2cWtNdnVxTS9hRkx2UjRMUHVvTS9pVE1QV0RMZmlSTVBtWU1YUzBuZ2tBQUFMb1NVUkJWSGphN2RybmN0cEFGSWJoRlVJU1NLSjNNS1lhMCt5NHhUVzk5MzcvMTVKa0pobFRqaHJTckhSbXZ1Zi9hczZMMFlMRkNnRUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU1CSjZuamVucXNwemduUHJzckdYOVpwaTJ0Q3JtbmM2K2RZTnRoVlk1V3BNbXhRTFdQZE1zT3VZVnd6TmozZWkydDNtUXdhVjQzQkpQRENTMk5iSjVhRWV1WC8rOXFjalFPdGZGSWtJa3J2WTJnNE1WY21PQnNGV2Jvd0tPL2tOeWo2MmdScEpjRGFQQmx4THIxQjB6ZEcwQy84THpiSmlKcnNodXZ5MWd6bEE5K3JEOG1Ja3V5SUpqRkUzL2Rxbll3b1NtN0lVRVBvRC93dXQ4aUlndVNJRGpsRnhlL3lmWEw1dnVTSTIxQlRaTExoWG9PSUxNTzhIeHdhL0w4YkkwTGZtVWRoR293YjJadlQwZTU3cEZORGdCMDZJbFZ5am1tSUJsMlQvbmw5Unc2U0Q5R2dTRy9RMHVRa2FXM1hobW92S1EzZUZRNE4yVW85T1ExZUZac05lcmY3dlArck80cmhtWTFMZzN2RlZvUDgrOEJYZzFzRm53Ym5DazROVGhXOEd1aUtCRGRrVlZ0VE5Gdk5lbFZzTnFUYnlXbklPTTJvZVRSb3lXdndtcEpIZy91Y1hCcmNKdVhUNER3cnB3WmkydnkwVkN4OFl0WGcvRDJiVTRPZml1UTNlRmZFMktENGJmQ3FpTE5COTkzZ1hzR2x3YTJDVDROekJhY0dJVlE2WXNpcFFkaDB4RWRPRFVLakl4clNwODhvblo4emJiRkxnMURvaUZPNUJYdkRHdjJNeTkvSmhVVDhKVVpUSTB5RGFOSExCeklidnFURE5ZaFVpVncva2RqUTFrTTJDSEZEUGpLVytLenlSVEYwZy9nYTl3OXkrZkFOUXB4dlg4Q1UrTnk3RlVXRGVGM1krZzNsUk9JZjRrMFVEWDllQ3l2TzUzMVB5WWhIZ2E5enZQWkpVNWI3M1kvZVhqOEh2OUQ0OG42SGFGNUxiY2pSdDhUWlR0ZGE1TTFEZlhuYmtYMUMwU0hDRkt6UUI1RmU4b3A0R05HTkhhdnZaRVNiVndUNXI2VzF4eXVDUEJZM1k5WWdEcXprbkgvZTNZZk56enVMMzBsMEllYnJaNWtLdHVESVh0MW44NjhFVDZrZjMvNDl0THZyQ2NaeUY4UHUyMTVkQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFjUEliTnJCaE9hQlh1Y29BQUFBQVNVVk9SSzVDWUlJPSI+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8c3R5bGU+CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vdVlFQ01Lb0hjTzl4MXdkbWJ5SEltMy1fa2Y2QnlZTzZDTFlkQjRIUUUtWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL3NUZGFBNmowUHNiOTIwVmp2LW1yekgtX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9fVllGeC1zODI0a1hxX1VsMkJIcVlILV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by90bmo0U0I2RE5iZGFRbnNNOENGcUJYLV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9vTU1nZlpNUXRoT3J5UW85bjIyZGN1dnZEaW4xcEs4YUt0ZUxwZVo1YzBBLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9Lc19jVnhpQ2l3VVdWc0ZXRkEzQmpuLV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL05KNHZ4bGdXd1diRXN2MThkQWhxbm4tX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vaXNaLXdiQ1hOS0FibmpvNl9Ud0hUb1gwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vNzdGWEZqUmJHek40YUNyU0ZobGgzb1gwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8valNOMkNHVkRiY1Z5Q25mSmZqU2RmSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9VWDZpNEp4UURtM2ZWVGMxQ1B1d3FvWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL2QtNklZcGxPRm9jQ2FjS3p4d1hTT0pCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vOTd1YWh4aXFaUm9uY0JhQ0VJM2FXNFgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL1B3WmMtWWJJTDQxNHdCOXJCMUlBUFlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQzE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0NfWnJhUjJUZzh3Mmx6bTdrTE5MMC13LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDd3RfUm02OTFMVGViS2ZZMlprS1NtSS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDMUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDNGdwOVE4Z2JZcmhxR2xSYXZfSVhmay53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDNkU4a000eFdSMV8xYllVUlJvalJHYy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0M5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PcFhVcVRvMFVnUVFoR2pfU0ZkTFdCa0F6NHJZbjQ3WnkycnZpZ1dRZjZ3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vV3hyWEphMEMzS2R0QzdsTWFmRzRkUmtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL2NES2hSYVhuUVRPVmJhb3h3ZE9yOXhrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzFoWmYwMlBPQU5oMzJrMlZrZ0VvVUJrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3ZQY3luU0wwcUhxXzZkWDdsS1ZCeVhZaGpiU3B2YzQ3ZWU2eFJfODBIbncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3ZTenVsZktTSzBMTGpqZmVheGNSRWhrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vSzIzY3hXVlRySUZENkRKc0VWaTA3UmtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL0ZsNHkwUWRPeHl5VEhFR01YWDhrY1lYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vMGVDNmZsMDZsdVhFWVdwQlNKdlhDSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9JM1Mxd3NnU2c5WUN1clY2UFVrVE9ZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vLUwxNEprMDZtNnBVSEItNW1YUVFuWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL0hnbzEzay10ZlNwbjBxaTFTRmRVZlpCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9QcnUzM3FqU2hwWlNtRzN6NlZZd25ZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9OWURXQmRENGdJcTI2RzVYWWJIc0ZJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdF9acmFSMlRnOHcybHptN2tMTkwwLXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdHd0X1JtNjkxTFRlYktmWTJaa0tTbUkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0MUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQ0Z3A5UThnYllyaHFHbFJhdl9JWGZrLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDZFOGtNNHhXUjFfMWJZVVJSb2pSR2Mud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQ5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9vSGkzMGt3UVd2cENXcUFoekhjQ1NJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vWkxxS2VlbFliQVRHNjBFcFpCU0R5NFgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL214OVVjazZ1QjYzVklLRlluRU1YcllYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL3JHdkhkSm5yMmw3NXFiMFlORDlOeUlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL1J4WkpkbnplbzNSNXpTZXhnZThVVVpCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL29PZUZ3Wk5sclRlZnpMWW1sVlYxVUlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vbWJtaHByTUg2OVppNmVFUEJZVkZoWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMFY0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwZlpyYVIyVGc4dzJsem03a0xOTDAtdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBRdF9SbTY5MUxUZWJLZlkyWmtLU21JLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwVkJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMFlncDlROGdiWXJocUdsUmF2X0lYZmsud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBhRThrTTR4V1IxXzFiWVVSUm9qUkdjLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBkRGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWV9acmFSMlRnOHcybHptN2tMTkwwLXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWXd0X1JtNjkxTFRlYktmWTJaa0tTbUkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZMUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFk0Z3A5UThnYllyaHFHbFJhdl9JWGZrLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTZFOGtNNHhXUjFfMWJZVVJSb2pSR2Mud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFk5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6MXgtTTFJMXc1T01pcW5WRjh4QkxoVS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5Rnp3WGFBWHVwNW1abGZLNnhSTHJoc2NvLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGenduNldxeG8teHd4aWxEWFBVOGNoVlUud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5RnoxVDdhSkxLNm5LcG4zNklNd1RjTU1jLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6Xzc5X1p1VXhDaWdNMkRlc3BUbkZhdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGejRnZDlPRVBVQ04zQWRZVzBlOHRhdDQud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGejhiSVFTWVpuV0xhV0M5UU5DcFRLX1Uud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQo8L3N0eWxlPgoKCjxzdHlsZT4KICBodG1sLAogIGJvZHkgewogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGhlaWdodDogMTAwJTsKICAgIGZvbnQtZmFtaWx5OiBSb2JvdG8sIHNhbnMtc2VyaWY7CiAgfQo8L3N0eWxlPgoKCgoKCgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIFtoaWRkZW5dIHsKICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKCiAgICAgIC0tbGF5b3V0OiB7CiAgICAgICAgZGlzcGxheTogLW1zLWZsZXhib3g7CiAgICAgICAgZGlzcGxheTogLXdlYmtpdC1mbGV4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH07CgogICAgICAtLWxheW91dC1pbmxpbmU6IHsKICAgICAgICBkaXNwbGF5OiAtbXMtaW5saW5lLWZsZXhib3g7CiAgICAgICAgZGlzcGxheTogLXdlYmtpdC1pbmxpbmUtZmxleDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWhvcml6b250YWw6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaG9yaXpvbnRhbC1yZXZlcnNlOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXZlcnRpY2FsOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXZlcnRpY2FsLXJldmVyc2U6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtd3JhcDogewogICAgICAgIC1tcy1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtd3JhcC1yZXZlcnNlOiB7CiAgICAgICAgLW1zLWZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LWF1dG86IHsKICAgICAgICAtbXMtZmxleDogMSAxIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDEgYXV0bzsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtbm9uZTogewogICAgICAgIC1tcy1mbGV4OiBub25lOwogICAgICAgIC13ZWJraXQtZmxleDogbm9uZTsKICAgICAgICBmbGV4OiBub25lOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleDogewogICAgICAgIC1tcy1mbGV4OiAxIDEgMC4wMDAwMDAwMDFweDsKICAgICAgICAtd2Via2l0LWZsZXg6IDE7CiAgICAgICAgZmxleDogMTsKICAgICAgICAtd2Via2l0LWZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgICAgZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtMjogewogICAgICAgIC1tcy1mbGV4OiAyOwogICAgICAgIC13ZWJraXQtZmxleDogMjsKICAgICAgICBmbGV4OiAyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC0zOiB7CiAgICAgICAgLW1zLWZsZXg6IDM7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAzOwogICAgICAgIGZsZXg6IDM7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTQ6IHsKICAgICAgICAtbXMtZmxleDogNDsKICAgICAgICAtd2Via2l0LWZsZXg6IDQ7CiAgICAgICAgZmxleDogNDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtNTogewogICAgICAgIC1tcy1mbGV4OiA1OwogICAgICAgIC13ZWJraXQtZmxleDogNTsKICAgICAgICBmbGV4OiA1OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC02OiB7CiAgICAgICAgLW1zLWZsZXg6IDY7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA2OwogICAgICAgIGZsZXg6IDY7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTc6IHsKICAgICAgICAtbXMtZmxleDogNzsKICAgICAgICAtd2Via2l0LWZsZXg6IDc7CiAgICAgICAgZmxleDogNzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtODogewogICAgICAgIC1tcy1mbGV4OiA4OwogICAgICAgIC13ZWJraXQtZmxleDogODsKICAgICAgICBmbGV4OiA4OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC05OiB7CiAgICAgICAgLW1zLWZsZXg6IDk7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA5OwogICAgICAgIGZsZXg6IDk7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTEwOiB7CiAgICAgICAgLW1zLWZsZXg6IDEwOwogICAgICAgIC13ZWJraXQtZmxleDogMTA7CiAgICAgICAgZmxleDogMTA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTExOiB7CiAgICAgICAgLW1zLWZsZXg6IDExOwogICAgICAgIC13ZWJraXQtZmxleDogMTE7CiAgICAgICAgZmxleDogMTE7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTEyOiB7CiAgICAgICAgLW1zLWZsZXg6IDEyOwogICAgICAgIC13ZWJraXQtZmxleDogMTI7CiAgICAgICAgZmxleDogMTI7CiAgICAgIH07CgogICAgICAvKiBhbGlnbm1lbnQgaW4gY3Jvc3MgYXhpcyAqLwoKICAgICAgLS1sYXlvdXQtc3RhcnQ6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlcjogewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIH07CgogICAgICAtLWxheW91dC1lbmQ6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWJhc2VsaW5lOiB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGJhc2VsaW5lOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgfTsKCiAgICAgIC8qIGFsaWdubWVudCBpbiBtYWluIGF4aXMgKi8KCiAgICAgIC0tbGF5b3V0LXN0YXJ0LWp1c3RpZmllZDogewogICAgICAgIC1tcy1mbGV4LXBhY2s6IHN0YXJ0OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlci1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWVuZC1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBlbmQ7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1hcm91bmQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogZGlzdHJpYnV0ZTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazoganVzdGlmeTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXItY2VudGVyOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgfTsKCiAgICAgIC8qIHNlbGYgYWxpZ25tZW50ICovCgogICAgICAtLWxheW91dC1zZWxmLXN0YXJ0OiB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zZWxmLWNlbnRlcjogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1lbmQ6IHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXNlbGYtc3RyZXRjaDogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICBhbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1iYXNlbGluZTogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICB9OwoKICAgICAgLyogbXVsdGktbGluZSBhbGlnbm1lbnQgaW4gbWFpbiBheGlzICovCgogICAgICAtLWxheW91dC1zdGFydC1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBzdGFydDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWVuZC1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBlbmQ7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXItYWxpZ25lZDogewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogY2VudGVyOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYmV0d2Vlbi1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBqdXN0aWZ5OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYXJvdW5kLWFsaWduZWQ6IHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGRpc3RyaWJ1dGU7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH07CgogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgT3RoZXIgTGF5b3V0CiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAtLWxheW91dC1ibG9jazogewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaW52aXNpYmxlOiB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1yZWxhdGl2ZTogewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZpdDogewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zY3JvbGw6IHsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH07CgogICAgICAtLWxheW91dC1mdWxsYmxlZWQ6IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgfTsKCiAgICAgIC8qIGZpeGVkIHBvc2l0aW9uICovCgogICAgICAtLWxheW91dC1maXhlZC10b3A6IHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1maXhlZC1yaWdodDogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml4ZWQtYm90dG9tOiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml4ZWQtbGVmdDogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH07CgogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItcmlwcGxlIj4KCiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CgogICAgICAgIC8qIFNlZSBQb2x5bWVyRWxlbWVudHMvcGFwZXItYmVoYXZpb3JzL2lzc3Vlcy8zNC4gT24gbm9uLUNocm9tZSBicm93c2VycywKICAgICAgICAgKiBjcmVhdGluZyBhIG5vZGUgKHdpdGggYSBwb3NpdGlvbjphYnNvbHV0ZSkgaW4gdGhlIG1pZGRsZSBvZiBhbiBldmVudAogICAgICAgICAqIGhhbmRsZXIgImludGVycnVwdHMiIHRoYXQgZXZlbnQgaGFuZGxlciAod2hpY2ggaGFwcGVucyB3aGVuIHRoZQogICAgICAgICAqIHJpcHBsZSBpcyBjcmVhdGVkIG9uIGRlbWFuZCkgKi8KICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2FuaW1hdGluZ10pIHsKICAgICAgICAvKiBUaGlzIHJlc29sdmVzIGEgcmVuZGVyaW5nIGlzc3VlIGluIENocm9tZSAoYXMgb2YgNDApIHdoZXJlIHRoZQogICAgICAgICAgIHJpcHBsZSBpcyBub3QgcHJvcGVybHkgY2xpcHBlZCBieSBpdHMgcGFyZW50ICh3aGljaCBtYXkgaGF2ZQogICAgICAgICAgIHJvdW5kZWQgY29ybmVycykuIFNlZTogaHR0cDovL2pzYmluLmNvbS90ZW1leGEvNAoKICAgICAgICAgICBOb3RlOiBXZSBvbmx5IGFwcGx5IHRoaXMgc3R5bGUgY29uZGl0aW9uYWxseS4gT3RoZXJ3aXNlLCB0aGUgYnJvd3NlcgogICAgICAgICAgIHdpbGwgY3JlYXRlIGEgbmV3IGNvbXBvc2l0aW5nIGxheWVyIGZvciBldmVyeSByaXBwbGUgZWxlbWVudCBvbiB0aGUKICAgICAgICAgICBwYWdlLCBhbmQgdGhhdCB3b3VsZCBiZSBiYWQuICovCiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOwogICAgICB9CgogICAgICAjYmFja2dyb3VuZCwKICAgICAgI3dhdmVzLAogICAgICAud2F2ZS1jb250YWluZXIsCiAgICAgIC53YXZlIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAjYmFja2dyb3VuZCwKICAgICAgLndhdmUgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgICN3YXZlcywKICAgICAgLndhdmUgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC53YXZlLWNvbnRhaW5lciwKICAgICAgLndhdmUgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNpcmNsZSkgI2JhY2tncm91bmQsCiAgICAgIDpob3N0KC5jaXJjbGUpICN3YXZlcyB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICB9CgogICAgICA6aG9zdCguY2lyY2xlKSAud2F2ZS1jb250YWluZXIgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iYmFja2dyb3VuZCI+PC9kaXY+CiAgICA8ZGl2IGlkPSJ3YXZlcyI+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CgogICAgICAtLXNoYWRvdy10cmFuc2l0aW9uOiB7CiAgICAgICAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjI4cyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctbm9uZTogewogICAgICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICAgIH07CgogICAgICAvKiBmcm9tIGh0dHA6Ly9jb2RlcGVuLmlvL3NoeW5kbWFuL3Blbi9jNTM5NGRkZjJlOGIyYTVjOTE4NTkwNGI1NzQyMWNkYiAqLwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDJweCAwIHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCAxcHggNXB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tM2RwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAzcHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCA4cHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi00ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDRweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgMXB4IDEwcHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi02ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDZweCAxMHB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCAxOHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi0xMmRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAxMnB4IDE2cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCA0cHggMjJweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgIDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgIDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTI0ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLW1hdGVyaWFsLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCwgaHRtbCB7CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbDogewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0xOiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTI6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tNGRwOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi02ZHA7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi00OiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLThkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTU6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDsKICAgICAgICB9OwogICAgICB9CiAgICAgIDpob3N0KC5wYXBlci1tYXRlcmlhbCksIC5wYXBlci1tYXRlcmlhbCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWw7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMSJdKSwgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMSJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIyIl0pLCAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIyIl0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOwogICAgICB9CiAgICAgIDpob3N0KC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjMiXSksIC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjMiXSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTM7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iNCJdKSwgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iNCJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI1Il0pLCAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI1Il0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1idXR0b24iPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLW1hdGVyaWFsLXN0eWxlcyI+CiAgICAgIC8qIE5lZWQgdG8gc3BlY2lmeSB0aGUgc2FtZSBzcGVjaWZpY2l0eSBhcyB0aGUgc3R5bGVzIGltcG9ydGVkIGZyb20gcGFwZXItbWF0ZXJpYWwuICovCiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG1pbi13aWR0aDogNS4xNGVtOwogICAgICAgIG1hcmdpbjogMCAwLjI5ZW07CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgICAgZm9udDogaW5oZXJpdDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIG91dGxpbmUtd2lkdGg6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHotaW5kZXg6IDA7CiAgICAgICAgcGFkZGluZzogMC43ZW0gMC41N2VtOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbjsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMSJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTE7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjIiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIzIl0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iNCJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjUiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgOmhvc3QoW3JhaXNlZF0ua2V5Ym9hcmQtZm9jdXMpIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1idXR0b24tcmFpc2VkLWtleWJvYXJkLWZvY3VzOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtyYWlzZWRdKS5rZXlib2FyZC1mb2N1cykgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1mbGF0LWtleWJvYXJkLWZvY3VzOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgYmFja2dyb3VuZDogI2VhZWFlYTsKICAgICAgICBjb2xvcjogI2E4YThhODsKICAgICAgICBjdXJzb3I6IGF1dG87CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2FuaW1hdGVkXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy10cmFuc2l0aW9uOwogICAgICB9CgogICAgICBwYXBlci1yaXBwbGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1idXR0b24taW5rLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewoKICAgICAgLyogTWF0ZXJpYWwgRGVzaWduIGNvbG9yIHBhbGV0dGUgZm9yIEdvb2dsZSBwcm9kdWN0cyAqLwoKICAgICAgLS1nb29nbGUtcmVkLTEwMDogI2Y0YzdjMzsKICAgICAgLS1nb29nbGUtcmVkLTMwMDogI2U2N2M3MzsKICAgICAgLS1nb29nbGUtcmVkLTUwMDogI2RiNDQzNzsKICAgICAgLS1nb29nbGUtcmVkLTcwMDogI2M1MzkyOTsKCiAgICAgIC0tZ29vZ2xlLWJsdWUtMTAwOiAjYzZkYWZjOwogICAgICAtLWdvb2dsZS1ibHVlLTMwMDogIzdiYWFmNzsKICAgICAgLS1nb29nbGUtYmx1ZS01MDA6ICM0Mjg1ZjQ7CiAgICAgIC0tZ29vZ2xlLWJsdWUtNzAwOiAjMzM2N2Q2OwoKICAgICAgLS1nb29nbGUtZ3JlZW4tMTAwOiAjYjdlMWNkOwogICAgICAtLWdvb2dsZS1ncmVlbi0zMDA6ICM1N2JiOGE7CiAgICAgIC0tZ29vZ2xlLWdyZWVuLTUwMDogIzBmOWQ1ODsKICAgICAgLS1nb29nbGUtZ3JlZW4tNzAwOiAjMGI4MDQzOwoKICAgICAgLS1nb29nbGUteWVsbG93LTEwMDogI2ZjZThiMjsKICAgICAgLS1nb29nbGUteWVsbG93LTMwMDogI2Y3Y2I0ZDsKICAgICAgLS1nb29nbGUteWVsbG93LTUwMDogI2Y0YjQwMDsKICAgICAgLS1nb29nbGUteWVsbG93LTcwMDogI2YwOTMwMDsKCiAgICAgIC0tZ29vZ2xlLWdyZXktMTAwOiAjZjVmNWY1OwogICAgICAtLWdvb2dsZS1ncmV5LTMwMDogI2UwZTBlMDsKICAgICAgLS1nb29nbGUtZ3JleS01MDA6ICM5ZTllOWU7CiAgICAgIC0tZ29vZ2xlLWdyZXktNzAwOiAjNjE2MTYxOwoKICAgICAgLyogTWF0ZXJpYWwgRGVzaWduIGNvbG9yIHBhbGV0dGUgZnJvbSBvbmxpbmUgc3BlYyBkb2N1bWVudCAqLwoKICAgICAgLS1wYXBlci1yZWQtNTA6ICNmZmViZWU7CiAgICAgIC0tcGFwZXItcmVkLTEwMDogI2ZmY2RkMjsKICAgICAgLS1wYXBlci1yZWQtMjAwOiAjZWY5YTlhOwogICAgICAtLXBhcGVyLXJlZC0zMDA6ICNlNTczNzM7CiAgICAgIC0tcGFwZXItcmVkLTQwMDogI2VmNTM1MDsKICAgICAgLS1wYXBlci1yZWQtNTAwOiAjZjQ0MzM2OwogICAgICAtLXBhcGVyLXJlZC02MDA6ICNlNTM5MzU7CiAgICAgIC0tcGFwZXItcmVkLTcwMDogI2QzMmYyZjsKICAgICAgLS1wYXBlci1yZWQtODAwOiAjYzYyODI4OwogICAgICAtLXBhcGVyLXJlZC05MDA6ICNiNzFjMWM7CiAgICAgIC0tcGFwZXItcmVkLWExMDA6ICNmZjhhODA7CiAgICAgIC0tcGFwZXItcmVkLWEyMDA6ICNmZjUyNTI7CiAgICAgIC0tcGFwZXItcmVkLWE0MDA6ICNmZjE3NDQ7CiAgICAgIC0tcGFwZXItcmVkLWE3MDA6ICNkNTAwMDA7CgogICAgICAtLXBhcGVyLXBpbmstNTA6ICNmY2U0ZWM7CiAgICAgIC0tcGFwZXItcGluay0xMDA6ICNmOGJiZDA7CiAgICAgIC0tcGFwZXItcGluay0yMDA6ICNmNDhmYjE7CiAgICAgIC0tcGFwZXItcGluay0zMDA6ICNmMDYyOTI7CiAgICAgIC0tcGFwZXItcGluay00MDA6ICNlYzQwN2E7CiAgICAgIC0tcGFwZXItcGluay01MDA6ICNlOTFlNjM7CiAgICAgIC0tcGFwZXItcGluay02MDA6ICNkODFiNjA7CiAgICAgIC0tcGFwZXItcGluay03MDA6ICNjMjE4NWI7CiAgICAgIC0tcGFwZXItcGluay04MDA6ICNhZDE0NTc7CiAgICAgIC0tcGFwZXItcGluay05MDA6ICM4ODBlNGY7CiAgICAgIC0tcGFwZXItcGluay1hMTAwOiAjZmY4MGFiOwogICAgICAtLXBhcGVyLXBpbmstYTIwMDogI2ZmNDA4MTsKICAgICAgLS1wYXBlci1waW5rLWE0MDA6ICNmNTAwNTc7CiAgICAgIC0tcGFwZXItcGluay1hNzAwOiAjYzUxMTYyOwoKICAgICAgLS1wYXBlci1wdXJwbGUtNTA6ICNmM2U1ZjU7CiAgICAgIC0tcGFwZXItcHVycGxlLTEwMDogI2UxYmVlNzsKICAgICAgLS1wYXBlci1wdXJwbGUtMjAwOiAjY2U5M2Q4OwogICAgICAtLXBhcGVyLXB1cnBsZS0zMDA6ICNiYTY4Yzg7CiAgICAgIC0tcGFwZXItcHVycGxlLTQwMDogI2FiNDdiYzsKICAgICAgLS1wYXBlci1wdXJwbGUtNTAwOiAjOWMyN2IwOwogICAgICAtLXBhcGVyLXB1cnBsZS02MDA6ICM4ZTI0YWE7CiAgICAgIC0tcGFwZXItcHVycGxlLTcwMDogIzdiMWZhMjsKICAgICAgLS1wYXBlci1wdXJwbGUtODAwOiAjNmExYjlhOwogICAgICAtLXBhcGVyLXB1cnBsZS05MDA6ICM0YTE0OGM7CiAgICAgIC0tcGFwZXItcHVycGxlLWExMDA6ICNlYTgwZmM7CiAgICAgIC0tcGFwZXItcHVycGxlLWEyMDA6ICNlMDQwZmI7CiAgICAgIC0tcGFwZXItcHVycGxlLWE0MDA6ICNkNTAwZjk7CiAgICAgIC0tcGFwZXItcHVycGxlLWE3MDA6ICNhYTAwZmY7CgogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTUwOiAjZWRlN2Y2OwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTEwMDogI2QxYzRlOTsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS0yMDA6ICNiMzlkZGI7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtMzAwOiAjOTU3NWNkOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTQwMDogIzdlNTdjMjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS01MDA6ICM2NzNhYjc7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtNjAwOiAjNWUzNWIxOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTcwMDogIzUxMmRhODsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS04MDA6ICM0NTI3YTA7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtOTAwOiAjMzExYjkyOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWExMDA6ICNiMzg4ZmY7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtYTIwMDogIzdjNGRmZjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS1hNDAwOiAjNjUxZmZmOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWE3MDA6ICM2MjAwZWE7CgogICAgICAtLXBhcGVyLWluZGlnby01MDogI2U4ZWFmNjsKICAgICAgLS1wYXBlci1pbmRpZ28tMTAwOiAjYzVjYWU5OwogICAgICAtLXBhcGVyLWluZGlnby0yMDA6ICM5ZmE4ZGE7CiAgICAgIC0tcGFwZXItaW5kaWdvLTMwMDogIzc5ODZjYjsKICAgICAgLS1wYXBlci1pbmRpZ28tNDAwOiAjNWM2YmMwOwogICAgICAtLXBhcGVyLWluZGlnby01MDA6ICMzZjUxYjU7CiAgICAgIC0tcGFwZXItaW5kaWdvLTYwMDogIzM5NDlhYjsKICAgICAgLS1wYXBlci1pbmRpZ28tNzAwOiAjMzAzZjlmOwogICAgICAtLXBhcGVyLWluZGlnby04MDA6ICMyODM1OTM7CiAgICAgIC0tcGFwZXItaW5kaWdvLTkwMDogIzFhMjM3ZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTEwMDogIzhjOWVmZjsKICAgICAgLS1wYXBlci1pbmRpZ28tYTIwMDogIzUzNmRmZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTQwMDogIzNkNWFmZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTcwMDogIzMwNGZmZTsKCiAgICAgIC0tcGFwZXItYmx1ZS01MDogI2UzZjJmZDsKICAgICAgLS1wYXBlci1ibHVlLTEwMDogI2JiZGVmYjsKICAgICAgLS1wYXBlci1ibHVlLTIwMDogIzkwY2FmOTsKICAgICAgLS1wYXBlci1ibHVlLTMwMDogIzY0YjVmNjsKICAgICAgLS1wYXBlci1ibHVlLTQwMDogIzQyYTVmNTsKICAgICAgLS1wYXBlci1ibHVlLTUwMDogIzIxOTZmMzsKICAgICAgLS1wYXBlci1ibHVlLTYwMDogIzFlODhlNTsKICAgICAgLS1wYXBlci1ibHVlLTcwMDogIzE5NzZkMjsKICAgICAgLS1wYXBlci1ibHVlLTgwMDogIzE1NjVjMDsKICAgICAgLS1wYXBlci1ibHVlLTkwMDogIzBkNDdhMTsKICAgICAgLS1wYXBlci1ibHVlLWExMDA6ICM4MmIxZmY7CiAgICAgIC0tcGFwZXItYmx1ZS1hMjAwOiAjNDQ4YWZmOwogICAgICAtLXBhcGVyLWJsdWUtYTQwMDogIzI5NzlmZjsKICAgICAgLS1wYXBlci1ibHVlLWE3MDA6ICMyOTYyZmY7CgogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtNTA6ICNlMWY1ZmU7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0xMDA6ICNiM2U1ZmM7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0yMDA6ICM4MWQ0ZmE7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0zMDA6ICM0ZmMzZjc7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS00MDA6ICMyOWI2ZjY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS01MDA6ICMwM2E5ZjQ7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS02MDA6ICMwMzliZTU7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS03MDA6ICMwMjg4ZDE7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS04MDA6ICMwMjc3YmQ7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS05MDA6ICMwMTU3OWI7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hMTAwOiAjODBkOGZmOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtYTIwMDogIzQwYzRmZjsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLWE0MDA6ICMwMGIwZmY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hNzAwOiAjMDA5MWVhOwoKICAgICAgLS1wYXBlci1jeWFuLTUwOiAjZTBmN2ZhOwogICAgICAtLXBhcGVyLWN5YW4tMTAwOiAjYjJlYmYyOwogICAgICAtLXBhcGVyLWN5YW4tMjAwOiAjODBkZWVhOwogICAgICAtLXBhcGVyLWN5YW4tMzAwOiAjNGRkMGUxOwogICAgICAtLXBhcGVyLWN5YW4tNDAwOiAjMjZjNmRhOwogICAgICAtLXBhcGVyLWN5YW4tNTAwOiAjMDBiY2Q0OwogICAgICAtLXBhcGVyLWN5YW4tNjAwOiAjMDBhY2MxOwogICAgICAtLXBhcGVyLWN5YW4tNzAwOiAjMDA5N2E3OwogICAgICAtLXBhcGVyLWN5YW4tODAwOiAjMDA4MzhmOwogICAgICAtLXBhcGVyLWN5YW4tOTAwOiAjMDA2MDY0OwogICAgICAtLXBhcGVyLWN5YW4tYTEwMDogIzg0ZmZmZjsKICAgICAgLS1wYXBlci1jeWFuLWEyMDA6ICMxOGZmZmY7CiAgICAgIC0tcGFwZXItY3lhbi1hNDAwOiAjMDBlNWZmOwogICAgICAtLXBhcGVyLWN5YW4tYTcwMDogIzAwYjhkNDsKCiAgICAgIC0tcGFwZXItdGVhbC01MDogI2UwZjJmMTsKICAgICAgLS1wYXBlci10ZWFsLTEwMDogI2IyZGZkYjsKICAgICAgLS1wYXBlci10ZWFsLTIwMDogIzgwY2JjNDsKICAgICAgLS1wYXBlci10ZWFsLTMwMDogIzRkYjZhYzsKICAgICAgLS1wYXBlci10ZWFsLTQwMDogIzI2YTY5YTsKICAgICAgLS1wYXBlci10ZWFsLTUwMDogIzAwOTY4ODsKICAgICAgLS1wYXBlci10ZWFsLTYwMDogIzAwODk3YjsKICAgICAgLS1wYXBlci10ZWFsLTcwMDogIzAwNzk2YjsKICAgICAgLS1wYXBlci10ZWFsLTgwMDogIzAwNjk1YzsKICAgICAgLS1wYXBlci10ZWFsLTkwMDogIzAwNGQ0MDsKICAgICAgLS1wYXBlci10ZWFsLWExMDA6ICNhN2ZmZWI7CiAgICAgIC0tcGFwZXItdGVhbC1hMjAwOiAjNjRmZmRhOwogICAgICAtLXBhcGVyLXRlYWwtYTQwMDogIzFkZTliNjsKICAgICAgLS1wYXBlci10ZWFsLWE3MDA6ICMwMGJmYTU7CgogICAgICAtLXBhcGVyLWdyZWVuLTUwOiAjZThmNWU5OwogICAgICAtLXBhcGVyLWdyZWVuLTEwMDogI2M4ZTZjOTsKICAgICAgLS1wYXBlci1ncmVlbi0yMDA6ICNhNWQ2YTc7CiAgICAgIC0tcGFwZXItZ3JlZW4tMzAwOiAjODFjNzg0OwogICAgICAtLXBhcGVyLWdyZWVuLTQwMDogIzY2YmI2YTsKICAgICAgLS1wYXBlci1ncmVlbi01MDA6ICM0Y2FmNTA7CiAgICAgIC0tcGFwZXItZ3JlZW4tNjAwOiAjNDNhMDQ3OwogICAgICAtLXBhcGVyLWdyZWVuLTcwMDogIzM4OGUzYzsKICAgICAgLS1wYXBlci1ncmVlbi04MDA6ICMyZTdkMzI7CiAgICAgIC0tcGFwZXItZ3JlZW4tOTAwOiAjMWI1ZTIwOwogICAgICAtLXBhcGVyLWdyZWVuLWExMDA6ICNiOWY2Y2E7CiAgICAgIC0tcGFwZXItZ3JlZW4tYTIwMDogIzY5ZjBhZTsKICAgICAgLS1wYXBlci1ncmVlbi1hNDAwOiAjMDBlNjc2OwogICAgICAtLXBhcGVyLWdyZWVuLWE3MDA6ICMwMGM4NTM7CgogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTUwOiAjZjFmOGU5OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTEwMDogI2RjZWRjODsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi0yMDA6ICNjNWUxYTU7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tMzAwOiAjYWVkNTgxOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTQwMDogIzljY2M2NTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi01MDA6ICM4YmMzNGE7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tNjAwOiAjN2NiMzQyOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTcwMDogIzY4OWYzODsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi04MDA6ICM1NThiMmY7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tOTAwOiAjMzM2OTFlOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWExMDA6ICNjY2ZmOTA7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tYTIwMDogI2IyZmY1OTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi1hNDAwOiAjNzZmZjAzOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWE3MDA6ICM2NGRkMTc7CgogICAgICAtLXBhcGVyLWxpbWUtNTA6ICNmOWZiZTc7CiAgICAgIC0tcGFwZXItbGltZS0xMDA6ICNmMGY0YzM7CiAgICAgIC0tcGFwZXItbGltZS0yMDA6ICNlNmVlOWM7CiAgICAgIC0tcGFwZXItbGltZS0zMDA6ICNkY2U3NzU7CiAgICAgIC0tcGFwZXItbGltZS00MDA6ICNkNGUxNTc7CiAgICAgIC0tcGFwZXItbGltZS01MDA6ICNjZGRjMzk7CiAgICAgIC0tcGFwZXItbGltZS02MDA6ICNjMGNhMzM7CiAgICAgIC0tcGFwZXItbGltZS03MDA6ICNhZmI0MmI7CiAgICAgIC0tcGFwZXItbGltZS04MDA6ICM5ZTlkMjQ7CiAgICAgIC0tcGFwZXItbGltZS05MDA6ICM4Mjc3MTc7CiAgICAgIC0tcGFwZXItbGltZS1hMTAwOiAjZjRmZjgxOwogICAgICAtLXBhcGVyLWxpbWUtYTIwMDogI2VlZmY0MTsKICAgICAgLS1wYXBlci1saW1lLWE0MDA6ICNjNmZmMDA7CiAgICAgIC0tcGFwZXItbGltZS1hNzAwOiAjYWVlYTAwOwoKICAgICAgLS1wYXBlci15ZWxsb3ctNTA6ICNmZmZkZTc7CiAgICAgIC0tcGFwZXIteWVsbG93LTEwMDogI2ZmZjljNDsKICAgICAgLS1wYXBlci15ZWxsb3ctMjAwOiAjZmZmNTlkOwogICAgICAtLXBhcGVyLXllbGxvdy0zMDA6ICNmZmYxNzY7CiAgICAgIC0tcGFwZXIteWVsbG93LTQwMDogI2ZmZWU1ODsKICAgICAgLS1wYXBlci15ZWxsb3ctNTAwOiAjZmZlYjNiOwogICAgICAtLXBhcGVyLXllbGxvdy02MDA6ICNmZGQ4MzU7CiAgICAgIC0tcGFwZXIteWVsbG93LTcwMDogI2ZiYzAyZDsKICAgICAgLS1wYXBlci15ZWxsb3ctODAwOiAjZjlhODI1OwogICAgICAtLXBhcGVyLXllbGxvdy05MDA6ICNmNTdmMTc7CiAgICAgIC0tcGFwZXIteWVsbG93LWExMDA6ICNmZmZmOGQ7CiAgICAgIC0tcGFwZXIteWVsbG93LWEyMDA6ICNmZmZmMDA7CiAgICAgIC0tcGFwZXIteWVsbG93LWE0MDA6ICNmZmVhMDA7CiAgICAgIC0tcGFwZXIteWVsbG93LWE3MDA6ICNmZmQ2MDA7CgogICAgICAtLXBhcGVyLWFtYmVyLTUwOiAjZmZmOGUxOwogICAgICAtLXBhcGVyLWFtYmVyLTEwMDogI2ZmZWNiMzsKICAgICAgLS1wYXBlci1hbWJlci0yMDA6ICNmZmUwODI7CiAgICAgIC0tcGFwZXItYW1iZXItMzAwOiAjZmZkNTRmOwogICAgICAtLXBhcGVyLWFtYmVyLTQwMDogI2ZmY2EyODsKICAgICAgLS1wYXBlci1hbWJlci01MDA6ICNmZmMxMDc7CiAgICAgIC0tcGFwZXItYW1iZXItNjAwOiAjZmZiMzAwOwogICAgICAtLXBhcGVyLWFtYmVyLTcwMDogI2ZmYTAwMDsKICAgICAgLS1wYXBlci1hbWJlci04MDA6ICNmZjhmMDA7CiAgICAgIC0tcGFwZXItYW1iZXItOTAwOiAjZmY2ZjAwOwogICAgICAtLXBhcGVyLWFtYmVyLWExMDA6ICNmZmU1N2Y7CiAgICAgIC0tcGFwZXItYW1iZXItYTIwMDogI2ZmZDc0MDsKICAgICAgLS1wYXBlci1hbWJlci1hNDAwOiAjZmZjNDAwOwogICAgICAtLXBhcGVyLWFtYmVyLWE3MDA6ICNmZmFiMDA7CgogICAgICAtLXBhcGVyLW9yYW5nZS01MDogI2ZmZjNlMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtMTAwOiAjZmZlMGIyOwogICAgICAtLXBhcGVyLW9yYW5nZS0yMDA6ICNmZmNjODA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTMwMDogI2ZmYjc0ZDsKICAgICAgLS1wYXBlci1vcmFuZ2UtNDAwOiAjZmZhNzI2OwogICAgICAtLXBhcGVyLW9yYW5nZS01MDA6ICNmZjk4MDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTYwMDogI2ZiOGMwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtNzAwOiAjZjU3YzAwOwogICAgICAtLXBhcGVyLW9yYW5nZS04MDA6ICNlZjZjMDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTkwMDogI2U2NTEwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTEwMDogI2ZmZDE4MDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTIwMDogI2ZmYWI0MDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTQwMDogI2ZmOTEwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTcwMDogI2ZmNjUwMDsKCiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNTA6ICNmYmU5ZTc7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtMTAwOiAjZmZjY2JjOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTIwMDogI2ZmYWI5MTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS0zMDA6ICNmZjhhNjU7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNDAwOiAjZmY3MDQzOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTUwMDogI2ZmNTcyMjsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS02MDA6ICNmNDUxMWU7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNzAwOiAjZTY0YTE5OwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTgwMDogI2Q4NDMxNTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS05MDA6ICNiZjM2MGM7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTEwMDogI2ZmOWU4MDsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS1hMjAwOiAjZmY2ZTQwOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLWE0MDA6ICNmZjNkMDA7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTcwMDogI2RkMmMwMDsKCiAgICAgIC0tcGFwZXItYnJvd24tNTA6ICNlZmViZTk7CiAgICAgIC0tcGFwZXItYnJvd24tMTAwOiAjZDdjY2M4OwogICAgICAtLXBhcGVyLWJyb3duLTIwMDogI2JjYWFhNDsKICAgICAgLS1wYXBlci1icm93bi0zMDA6ICNhMTg4N2Y7CiAgICAgIC0tcGFwZXItYnJvd24tNDAwOiAjOGQ2ZTYzOwogICAgICAtLXBhcGVyLWJyb3duLTUwMDogIzc5NTU0ODsKICAgICAgLS1wYXBlci1icm93bi02MDA6ICM2ZDRjNDE7CiAgICAgIC0tcGFwZXItYnJvd24tNzAwOiAjNWQ0MDM3OwogICAgICAtLXBhcGVyLWJyb3duLTgwMDogIzRlMzQyZTsKICAgICAgLS1wYXBlci1icm93bi05MDA6ICMzZTI3MjM7CgogICAgICAtLXBhcGVyLWdyZXktNTA6ICNmYWZhZmE7CiAgICAgIC0tcGFwZXItZ3JleS0xMDA6ICNmNWY1ZjU7CiAgICAgIC0tcGFwZXItZ3JleS0yMDA6ICNlZWVlZWU7CiAgICAgIC0tcGFwZXItZ3JleS0zMDA6ICNlMGUwZTA7CiAgICAgIC0tcGFwZXItZ3JleS00MDA6ICNiZGJkYmQ7CiAgICAgIC0tcGFwZXItZ3JleS01MDA6ICM5ZTllOWU7CiAgICAgIC0tcGFwZXItZ3JleS02MDA6ICM3NTc1NzU7CiAgICAgIC0tcGFwZXItZ3JleS03MDA6ICM2MTYxNjE7CiAgICAgIC0tcGFwZXItZ3JleS04MDA6ICM0MjQyNDI7CiAgICAgIC0tcGFwZXItZ3JleS05MDA6ICMyMTIxMjE7CgogICAgICAtLXBhcGVyLWJsdWUtZ3JleS01MDogI2VjZWZmMTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktMTAwOiAjY2ZkOGRjOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS0yMDA6ICNiMGJlYzU7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTMwMDogIzkwYTRhZTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNDAwOiAjNzg5MDljOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS01MDA6ICM2MDdkOGI7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTYwMDogIzU0NmU3YTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNzAwOiAjNDU1YTY0OwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS04MDA6ICMzNzQ3NGY7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTkwMDogIzI2MzIzODsKCiAgICAgIC8qIG9wYWNpdHkgZm9yIGRhcmsgdGV4dCBvbiBhIGxpZ2h0IGJhY2tncm91bmQgKi8KICAgICAgLS1kYXJrLWRpdmlkZXItb3BhY2l0eTogMC4xMjsKICAgICAgLS1kYXJrLWRpc2FibGVkLW9wYWNpdHk6IDAuMzg7IC8qIG9yIGhpbnQgdGV4dCBvciBpY29uICovCiAgICAgIC0tZGFyay1zZWNvbmRhcnktb3BhY2l0eTogMC41NDsKICAgICAgLS1kYXJrLXByaW1hcnktb3BhY2l0eTogMC44NzsKCiAgICAgIC8qIG9wYWNpdHkgZm9yIGxpZ2h0IHRleHQgb24gYSBkYXJrIGJhY2tncm91bmQgKi8KICAgICAgLS1saWdodC1kaXZpZGVyLW9wYWNpdHk6IDAuMTI7CiAgICAgIC0tbGlnaHQtZGlzYWJsZWQtb3BhY2l0eTogMC4zOyAvKiBvciBoaW50IHRleHQgb3IgaWNvbiAqLwogICAgICAtLWxpZ2h0LXNlY29uZGFyeS1vcGFjaXR5OiAwLjc7CiAgICAgIC0tbGlnaHQtcHJpbWFyeS1vcGFjaXR5OiAxLjA7CgogICAgfQoKICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KCgoKCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CiAgICAgIC8qCiAgICAgICAqIFlvdSBjYW4gdXNlIHRoZXNlIGdlbmVyaWMgdmFyaWFibGVzIGluIHlvdXIgZWxlbWVudHMgZm9yIGVhc3kgdGhlbWluZy4KICAgICAgICogRm9yIGV4YW1wbGUsIGlmIGFsbCB5b3VyIGVsZW1lbnRzIHVzZSBgLS1wcmltYXJ5LXRleHQtY29sb3JgIGFzIGl0cyBtYWluCiAgICAgICAqIGNvbG9yLCB0aGVuIHN3aXRjaGluZyBmcm9tIGEgbGlnaHQgdG8gYSBkYXJrIHRoZW1lIGlzIGp1c3QgYSBtYXR0ZXIgb2YKICAgICAgICogY2hhbmdpbmcgdGhlIHZhbHVlIG9mIGAtLXByaW1hcnktdGV4dC1jb2xvcmAgaW4geW91ciBhcHBsaWNhdGlvbi4KICAgICAgICovCiAgICAgIC0tcHJpbWFyeS10ZXh0LWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS10ZXh0LWNvbG9yKTsKICAgICAgLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLWJhY2tncm91bmQtY29sb3IpOwogICAgICAtLXNlY29uZGFyeS10ZXh0LWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS1zZWNvbmRhcnktY29sb3IpOwogICAgICAtLWRpc2FibGVkLXRleHQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLWRpc2FibGVkLWNvbG9yKTsKICAgICAgLS1kaXZpZGVyLWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS1kaXZpZGVyLWNvbG9yKTsKICAgICAgLS1lcnJvci1jb2xvcjogdmFyKC0tcGFwZXItZGVlcC1vcmFuZ2UtYTcwMCk7CgogICAgICAvKgogICAgICAgKiBQcmltYXJ5IGFuZCBhY2NlbnQgY29sb3JzLiBBbHNvIHNlZSBjb2xvci5odG1sIGZvciBtb3JlIGNvbG9ycy4KICAgICAgICovCiAgICAgIC0tcHJpbWFyeS1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTUwMCk7CiAgICAgIC0tbGlnaHQtcHJpbWFyeS1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTEwMCk7CiAgICAgIC0tZGFyay1wcmltYXJ5LWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNzAwKTsKCiAgICAgIC0tYWNjZW50LWNvbG9yOiB2YXIoLS1wYXBlci1waW5rLWEyMDApOwogICAgICAtLWxpZ2h0LWFjY2VudC1jb2xvcjogdmFyKC0tcGFwZXItcGluay1hMTAwKTsKICAgICAgLS1kYXJrLWFjY2VudC1jb2xvcjogdmFyKC0tcGFwZXItcGluay1hNDAwKTsKCgogICAgICAvKgogICAgICAgKiBNYXRlcmlhbCBEZXNpZ24gTGlnaHQgYmFja2dyb3VuZCB0aGVtZQogICAgICAgKi8KICAgICAgLS1saWdodC10aGVtZS1iYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwogICAgICAtLWxpZ2h0LXRoZW1lLWJhc2UtY29sb3I6ICMwMDAwMDA7CiAgICAgIC0tbGlnaHQtdGhlbWUtdGV4dC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICAtLWxpZ2h0LXRoZW1lLXNlY29uZGFyeS1jb2xvcjogIzczNzM3MzsgIC8qIGZvciBzZWNvbmRhcnkgdGV4dCBhbmQgaWNvbnMgKi8KICAgICAgLS1saWdodC10aGVtZS1kaXNhYmxlZC1jb2xvcjogIzliOWI5YjsgIC8qIGRpc2FibGVkL2hpbnQgdGV4dCAqLwogICAgICAtLWxpZ2h0LXRoZW1lLWRpdmlkZXItY29sb3I6ICNkYmRiZGI7CgogICAgICAvKgogICAgICAgKiBNYXRlcmlhbCBEZXNpZ24gRGFyayBiYWNrZ3JvdW5kIHRoZW1lCiAgICAgICAqLwogICAgICAtLWRhcmstdGhlbWUtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICAtLWRhcmstdGhlbWUtYmFzZS1jb2xvcjogI2ZmZmZmZjsKICAgICAgLS1kYXJrLXRoZW1lLXRleHQtY29sb3I6ICNmZmZmZmY7CiAgICAgIC0tZGFyay10aGVtZS1zZWNvbmRhcnktY29sb3I6ICNiY2JjYmM7ICAvKiBmb3Igc2Vjb25kYXJ5IHRleHQgYW5kIGljb25zICovCiAgICAgIC0tZGFyay10aGVtZS1kaXNhYmxlZC1jb2xvcjogIzY0NjQ2NDsgIC8qIGRpc2FibGVkL2hpbnQgdGV4dCAqLwogICAgICAtLWRhcmstdGhlbWUtZGl2aWRlci1jb2xvcjogIzNjM2MzYzsKCiAgICAgIC8qCiAgICAgICAqIERlcHJlY2F0ZWQgdmFsdWVzIGJlY2F1c2Ugb2YgdGhlaXIgY29uZnVzaW5nIG5hbWVzLgogICAgICAgKi8KICAgICAgLS10ZXh0LXByaW1hcnktY29sb3I6IHZhcigtLWRhcmstdGhlbWUtdGV4dC1jb2xvcik7CiAgICAgIC0tZGVmYXVsdC1wcmltYXJ5LWNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yKTsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItY2hlY2tib3giPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplOiB2YXIoLS1wYXBlci1jaGVja2JveC1zaXplLCAxOHB4KTsKICAgICAgICAvKiAtMXB4IGlzIGEgc2VudGluZWwgZm9yIHRoZSBkZWZhdWx0IGFuZCBpcyByZXBsYWNlZCBpbiBgYXR0YWNoZWRgLiAqLwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZTogdmFyKC0tcGFwZXItY2hlY2tib3gtaW5rLXNpemUsIC0xcHgpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgbGluZS1oZWlnaHQ6IDA7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5oaWRkZW4gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgICNjaGVja2JveENvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKTsKICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSk7CiAgICAgICAgbWluLXdpZHRoOiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpOwogICAgICAgIG1hcmdpbjogdmFyKC0tcGFwZXItY2hlY2tib3gtbWFyZ2luLCBpbml0aWFsKTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdmFyKC0tcGFwZXItY2hlY2tib3gtdmVydGljYWwtYWxpZ24sIG1pZGRsZSk7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWJhY2tncm91bmQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgfQoKICAgICAgI2luayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwoKICAgICAgICAvKiBDZW50ZXIgdGhlIHJpcHBsZSBpbiB0aGUgY2hlY2tib3ggYnkgbmVnYXRpdmUgb2Zmc2V0dGluZyBpdCBieQogICAgICAgICAqIChpbmtXaWR0aCAtIHJpcHBsZVdpZHRoKSAvIDIgKi8KICAgICAgICB0b3A6IGNhbGMoMHB4IC0gKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpIC0gdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKSkgLyAyKTsKICAgICAgICBsZWZ0OiBjYWxjKDBweCAtICh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplKSAtIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpIC8gMik7CiAgICAgICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIG9wYWNpdHk6IDAuNjsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI2luazpkaXIocnRsKSB7CiAgICAgICAgcmlnaHQ6IGNhbGMoMHB4IC0gKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpIC0gdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKSkgLyAyKTsKICAgICAgICBsZWZ0OiBhdXRvOwogICAgICB9CgogICAgICAjaW5rW2NoZWNrZWRdIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgfQoKICAgICAgI2NoZWNrYm94IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYm9yZGVyOiBzb2xpZCAycHg7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMTQwbXMsIGJvcmRlci1jb2xvciAxNDBtczsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDE0MG1zLCBib3JkZXItY29sb3IgMTQwbXM7CiAgICAgIH0KCiAgICAgIC8qIGNoZWNrYm94IGNoZWNrZWQgYW5pbWF0aW9ucyAqLwogICAgICAjY2hlY2tib3guY2hlY2tlZCAjY2hlY2ttYXJrIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogY2hlY2ttYXJrLWV4cGFuZCAxNDBtcyBlYXNlLW91dCBmb3J3YXJkczsKICAgICAgICBhbmltYXRpb246IGNoZWNrbWFyay1leHBhbmQgMTQwbXMgZWFzZS1vdXQgZm9yd2FyZHM7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBjaGVja21hcmstZXhwYW5kIHsKICAgICAgICAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCwgMCkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSwgMSkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgY2hlY2ttYXJrLWV4cGFuZCB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLCAwKSByb3RhdGUoNDVkZWcpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNjaGVja2JveC5jaGVja2VkIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgICNjaGVja21hcmsgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMzYlOwogICAgICAgIGhlaWdodDogNzAlOwogICAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7CiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgICAgICBib3JkZXItbGVmdDogbm9uZTsKICAgICAgICBib3JkZXItcmlnaHQtd2lkdGg6IGNhbGMoMi8xNSAqIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpOwogICAgICAgIGJvcmRlci1ib3R0b20td2lkdGg6IGNhbGMoMi8xNSAqIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpOwogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2ttYXJrLWNvbG9yLCB3aGl0ZSk7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiA5NyUgODYlOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDk3JSA4NiU7CiAgICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7IC8qIHByb3RlY3QgYWdhaW5zdCBwYWdlLWxldmVsIGJveC1zaXppbmcgKi8KICAgICAgfQoKICAgICAgI2NoZWNrbWFyazpkaXIocnRsKSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiA1MCUgMTQlOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDUwJSAxNCU7CiAgICAgIH0KCiAgICAgIC8qIGxhYmVsICovCiAgICAgICNjaGVja2JveExhYmVsIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1wYXBlci1jaGVja2JveC1sYWJlbC1zcGFjaW5nLCA4cHgpOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgICAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWNoZWNrYm94LWxhYmVsOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pICNjaGVja2JveExhYmVsIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY2hlY2tlZC1jb2xvciwgdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1jaGVja2JveC1sYWJlbC1jaGVja2VkOwogICAgICB9CgogICAgICAjY2hlY2tib3hMYWJlbDpkaXIocnRsKSB7CiAgICAgICAgcGFkZGluZy1yaWdodDogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtc3BhY2luZywgOHB4KTsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDA7CiAgICAgIH0KCiAgICAgICNjaGVja2JveExhYmVsW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIGRpc2FibGVkIHN0YXRlICovCgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjY2hlY2tib3ggewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF1bY2hlY2tlZF0pICNjaGVja2JveCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNjaGVja2JveExhYmVsICB7CiAgICAgICAgb3BhY2l0eTogMC42NTsKICAgICAgfQoKICAgICAgLyogaW52YWxpZCBzdGF0ZSAqLwogICAgICAjY2hlY2tib3guaW52YWxpZDpub3QoLmNoZWNrZWQpIHsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWVycm9yLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9ImNoZWNrYm94Q29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0iY2hlY2tib3giIGNsYXNzJD0iW1tfY29tcHV0ZUNoZWNrYm94Q2xhc3MoY2hlY2tlZCwgaW52YWxpZCldXSI+CiAgICAgICAgPGRpdiBpZD0iY2hlY2ttYXJrIiBjbGFzcyQ9IltbX2NvbXB1dGVDaGVja21hcmtDbGFzcyhjaGVja2VkKV1dIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjaGVja2JveExhYmVsIj48c2xvdD48L3Nsb3Q+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24taWNvbiI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWlubGluZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CgogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgogICAgICAgIGZpbGw6IHZhcigtLWlyb24taWNvbi1maWxsLWNvbG9yLCBjdXJyZW50Y29sb3IpOwogICAgICAgIHN0cm9rZTogdmFyKC0taXJvbi1pY29uLXN0cm9rZS1jb2xvciwgbm9uZSk7CgogICAgICAgIHdpZHRoOiB2YXIoLS1pcm9uLWljb24td2lkdGgsIDI0cHgpOwogICAgICAgIGhlaWdodDogdmFyKC0taXJvbi1pY29uLWhlaWdodCwgMjRweCk7CiAgICAgICAgQGFwcGx5IC0taXJvbi1pY29uOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWExMXktYW5ub3VuY2VyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIGNsaXA6IHJlY3QoMHB4LDBweCwwcHgsMHB4KTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgYXJpYS1saXZlJD0iW1ttb2RlXV0iPltbX3RleHRdXTwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24taW5wdXQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzbG90IGlkPSJjb250ZW50Ij48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewoKICAgICAgLyogU2hhcmVkIFN0eWxlcyAqLwogICAgICAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U6IHsKICAgICAgICBmb250LWZhbWlseTogJ1JvYm90bycsICdOb3RvJywgc2Fucy1zZXJpZjsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb21tb24tY29kZTogewogICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCAnQ29uc29sYXMnLCAnTWVubG8nLCBtb25vc3BhY2U7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29tbW9uLWV4cGVuc2l2ZS1rZXJuaW5nOiB7CiAgICAgICAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOiB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9OwoKICAgICAgLyogTWF0ZXJpYWwgRm9udCBTdHlsZXMgKi8KCiAgICAgIC0tcGFwZXItZm9udC1kaXNwbGF5NDogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDExMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiAzMDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDQ0ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDEyMHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWRpc3BsYXkzOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogNTZweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtLjAyNmVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiA2MHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWRpc3BsYXkyOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiA0NXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDE4ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDQ4cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtZGlzcGxheTE6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDM0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLS4wMWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiA0MHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWhlYWRsaW5lOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDEyZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDMycHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtdGl0bGU6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI4cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtc3ViaGVhZDogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWJvZHkyOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtYm9keTE6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jYXB0aW9uOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAxMWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LW1lbnU6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtYnV0dG9uOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAxOGVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29kZTI6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1jb2RlOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb2RlMTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWNvZGU7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9OwoKICAgIH0KCiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWlucHV0LWNoYXItY291bnRlciI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGZsb2F0OiByaWdodDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jYXB0aW9uOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNoYXItY291bnRlcjsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpkaXIocnRsKSkgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzcGFuPltbX2NoYXJDb3VudGVyU3RyXV08L3NwYW4+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItc2hhcmVkLWlucHV0LXN0eWxlOiB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiB0byBtYWtlIGEgc3RhY2tpbmcgY29udGV4dCAqLwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm94LXNoYWRvdzogbm9uZTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgfTsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dC1jb250YWluZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDhweCAwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgOmhvc3QoW2lubGluZV0pIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBvcGFjaXR5OiAwLjMzOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jYXB0aW9uOwogICAgICB9CgogICAgICAudW5kZXJsaW5lIHsKICAgICAgICBoZWlnaHQ6IDJweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5mb2N1c2VkLWxpbmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgwLDEsMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZTNkKDAsMSwxKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1mb2N1czsKICAgICAgfQoKICAgICAgLnVuZGVybGluZS5pcy1oaWdobGlnaHRlZCAuZm9jdXNlZC1saW5lIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAudW5kZXJsaW5lLmlzLWludmFsaWQgLmZvY3VzZWQtbGluZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW52YWxpZC1jb2xvciwgdmFyKC0tZXJyb3ItY29sb3IpKTsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAudW5mb2N1c2VkLWxpbmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItdW5kZXJsaW5lOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudW5mb2N1c2VkLWxpbmUgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBkYXNoZWQ7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgLmlucHV0LXdyYXBwZXIgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtcmVsYXRpdmU7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZvbnQ6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuMjVzLCB3aWR0aCAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXMsIHdpZHRoIDAuMjVzOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7CiAgICAgICAgLyogRml4IGZvciBzYWZhcmkgbm90IGZvY3VzaW5nIDAtaGVpZ2h0IGRhdGUvdGltZSBpbnB1dHMgd2l0aCAtd2Via2l0LWFwcGVyYW5jZTogbm9uZTsgKi8KICAgICAgICBtaW4taGVpZ2h0OiAxcHg7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTc1JSkgc2NhbGUoMC43NSk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC03NSUpIHNjYWxlKDAuNzUpOwoKICAgICAgICAvKiBTaW5jZSB3ZSBzY2FsZSB0byA3NS8xMDAgb2YgdGhlIHNpemUsIHdlIGFjdHVhbGx5IGhhdmUgMTAwLzc1IG9mIHRoZQogICAgICAgIG9yaWdpbmFsIHNwYWNlIG5vdyBhdmFpbGFibGUgKi8KICAgICAgICB3aWR0aDogMTMzJTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsLWZsb2F0aW5nOwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIC5pbnB1dC1jb250ZW50LmxhYmVsLWlzLWZsb2F0aW5nIDo6c2xvdHRlZChsYWJlbCksCiAgICAgIDpob3N0KDpkaXIocnRsKSkgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtZmxvYXRpbmcgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1sYWJlbCkgewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGxlZnQ6IGF1dG87CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWwtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWRkZW4gOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtaGlkZGVuIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtbGFiZWwpIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpcm9uLWlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWlucHV0KSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXNoYXJlZC1pbnB1dC1zdHlsZTsKICAgICAgICAvKiBUaGUgYXBwbHkgc2hpbSBkb2Vzbid0IGFwcGx5IHRoZSBuZXN0ZWQgY29sb3IgY3VzdG9tIHByb3BlcnR5LAogICAgICAgICAgc28gd2UgaGF2ZSB0byByZS1hcHBseSBpdCBoZXJlLiAqLwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24taW5wdXQpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCh0ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtaW5wdXQpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1pbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1pbnB1dCkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1pbnZhbGlkOwogICAgICB9CgogICAgICAucHJlZml4IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1ub25lOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LXByZWZpeDsKICAgICAgfQoKICAgICAgLnN1ZmZpeCA6OnNsb3R0ZWQoKikgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtbm9uZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtc3VmZml4OwogICAgICB9CgogICAgICAvKiBGaXJlZm94IHNldHMgYSBtaW4td2lkdGggb24gdGhlIGlucHV0LCB3aGljaCBjYW4gY2F1c2UgbGF5b3V0IGlzc3VlcyAqLwogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoaW5wdXQpIHsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZCh0ZXh0YXJlYSkgewogICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgfQoKICAgICAgLmFkZC1vbi1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5hZGQtb24tY29udGVudC5pcy1pbnZhbGlkIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuYWRkLW9uLWNvbnRlbnQuaXMtaGlnaGxpZ2h0ZWQgOjpzbG90dGVkKCopIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciIgYXJpYS1oaWRkZW49InRydWUiIGhpZGRlbj0iW1tub0xhYmVsRmxvYXRdXSI+Jm5ic3A7PC9kaXY+CgogICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgIDxzcGFuIGNsYXNzPSJwcmVmaXgiPjxzbG90IG5hbWU9InByZWZpeCI+PC9zbG90Pjwvc3Bhbj4KCiAgICAgIDxkaXYgY2xhc3MkPSJbW19jb21wdXRlSW5wdXRDb250ZW50Q2xhc3Mobm9MYWJlbEZsb2F0LGFsd2F5c0Zsb2F0TGFiZWwsZm9jdXNlZCxpbnZhbGlkLF9pbnB1dEhhc0NvbnRlbnQpXV0iIGlkPSJsYWJlbEFuZElucHV0Q29udGFpbmVyIj4KICAgICAgICA8c2xvdCBuYW1lPSJsYWJlbCI+PC9zbG90PgogICAgICAgIDxzbG90IG5hbWU9ImlucHV0Ij48L3Nsb3Q+CiAgICAgIDwvZGl2PgoKICAgICAgPHNwYW4gY2xhc3M9InN1ZmZpeCI+PHNsb3QgbmFtZT0ic3VmZml4Ij48L3Nsb3Q+PC9zcGFuPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcyQ9IltbX2NvbXB1dGVVbmRlcmxpbmVDbGFzcyhmb2N1c2VkLGludmFsaWQpXV0iPgogICAgICA8ZGl2IGNsYXNzPSJ1bmZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzJD0iW1tfY29tcHV0ZUFkZE9uQ29udGVudENsYXNzKGZvY3VzZWQsaW52YWxpZCldXSI+CiAgICAgIDxzbG90IG5hbWU9ImFkZC1vbiI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWlucHV0LWVycm9yIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWludmFsaWQtY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY2FwdGlvbjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1lcnJvcjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDowOwogICAgICAgIHJpZ2h0OjA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgewogICAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgICAgIH07CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtmb2N1c2VkXSkgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBpbnB1dCB7CiAgICAgICAgLyogRmlyZWZveCBzZXRzIGEgbWluLXdpZHRoIG9uIHRoZSBpbnB1dCwgd2hpY2ggY2FuIGNhdXNlIGxheW91dCBpc3N1ZXMgKi8KICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC8qIEluIDEueCwgdGhlIDxpbnB1dD4gaXMgZGlzdHJpYnV0ZWQgdG8gcGFwZXItaW5wdXQtY29udGFpbmVyLCB3aGljaCBzdHlsZXMgaXQuCiAgICAgIEluIDIueCB0aGUgPGlyb24taW5wdXQ+IGlzIGRpc3RyaWJ1dGVkIHRvIHBhcGVyLWlucHV0LWNvbnRhaW5lciwgd2hpY2ggc3R5bGVzCiAgICAgIGl0LCBidXQgaW4gb3JkZXIgZm9yIHRoaXMgdG8gd29yayBjb3JyZWN0bHksIHdlIG5lZWQgdG8gcmVzZXQgc29tZQogICAgICBvZiB0aGUgbmF0aXZlIGlucHV0J3MgcHJvcGVydGllcyB0byBpbmhlcml0IChmcm9tIHRoZSBpcm9uLWlucHV0KSAqLwogICAgICBpcm9uLWlucHV0ID4gaW5wdXQgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1zaGFyZWQtaW5wdXQtc3R5bGU7CiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7CiAgICAgICAgZm9udC1zaXplOiBpbmhlcml0OwogICAgICAgIGxldHRlci1zcGFjaW5nOiBpbmhlcml0OwogICAgICAgIHdvcmQtc3BhY2luZzogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LXNoYWRvdzogaW5oZXJpdDsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICBjdXJzb3I6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIGlucHV0OmRpc2FibGVkIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLAogICAgICBpbnB1dDo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICBpbnB1dDo6LXdlYmtpdC1jbGVhci1idXR0b24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3IgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvcjsKICAgICAgfQoKICAgICAgaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0Oi1tb3otcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICBpbnB1dDo6LW1zLWNsZWFyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbXMtcmV2ZWFsIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtcmV2ZWFsOwogICAgICB9CgogICAgICBpbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGxhYmVsIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaW5wdXQtY29udGFpbmVyIGlkPSJjb250YWluZXIiIG5vLWxhYmVsLWZsb2F0PSJbW25vTGFiZWxGbG9hdF1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsKGFsd2F5c0Zsb2F0TGFiZWwscGxhY2Vob2xkZXIpXV0iIGF1dG8tdmFsaWRhdGUkPSJbW2F1dG9WYWxpZGF0ZV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaW52YWxpZD0iW1tpbnZhbGlkXV0iPgoKICAgICAgPHNsb3QgbmFtZT0icHJlZml4IiBzbG90PSJwcmVmaXgiPjwvc2xvdD4KCiAgICAgIDxsYWJlbCBoaWRkZW4kPSJbWyFsYWJlbF1dIiBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9yJD0iW1tfaW5wdXRJZF1dIiBzbG90PSJsYWJlbCI+W1tsYWJlbF1dPC9sYWJlbD4KCiAgICAgIDxzcGFuIGlkPSJ0ZW1wbGF0ZS1wbGFjZWhvbGRlciI+PC9zcGFuPgoKICAgICAgPHNsb3QgbmFtZT0ic3VmZml4IiBzbG90PSJzdWZmaXgiPjwvc2xvdD4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlcnJvck1lc3NhZ2VdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWVycm9yIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIiBzbG90PSJhZGQtb24iPltbZXJyb3JNZXNzYWdlXV08L3BhcGVyLWlucHV0LWVycm9yPgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJDb3VudGVyXV0iPgogICAgICAgIDxwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgc2xvdD0iYWRkLW9uIj48L3BhcGVyLWlucHV0LWNoYXItY291bnRlcj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KICA8L3RlbXBsYXRlPgoKICAKICA8dGVtcGxhdGUgaWQ9InYwIj4KICAgIDxpbnB1dCBpcz0iaXJvbi1pbnB1dCIgc2xvdD0iaW5wdXQiIGNsYXNzPSJpbnB1dC1lbGVtZW50IiBpZCQ9IltbX2lucHV0SWRdXSIgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdGl0bGUkPSJbW3RpdGxlXV0iIGJpbmQtdmFsdWU9Int7dmFsdWV9fSIgaW52YWxpZD0ie3tpbnZhbGlkfX0iIHByZXZlbnQtaW52YWxpZC1pbnB1dD0iW1twcmV2ZW50SW52YWxpZElucHV0XV0iIGFsbG93ZWQtcGF0dGVybj0iW1thbGxvd2VkUGF0dGVybl1dIiB2YWxpZGF0b3I9IltbdmFsaWRhdG9yXV0iIHR5cGUkPSJbW3R5cGVdXSIgcGF0dGVybiQ9IltbcGF0dGVybl1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgbWluJD0iW1ttaW5dXSIgbWF4JD0iW1ttYXhdXSIgc3RlcCQ9Iltbc3RlcF1dIiBuYW1lJD0iW1tuYW1lXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgbGlzdCQ9IltbbGlzdF1dIiBzaXplJD0iW1tzaXplXV0iIGF1dG9jYXBpdGFsaXplJD0iW1thdXRvY2FwaXRhbGl6ZV1dIiBhdXRvY29ycmVjdCQ9IltbYXV0b2NvcnJlY3RdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiIHRhYmluZGV4JD0iW1t0YWJJbmRleF1dIiBhdXRvc2F2ZSQ9IltbYXV0b3NhdmVdXSIgcmVzdWx0cyQ9IltbcmVzdWx0c11dIiBhY2NlcHQkPSJbW2FjY2VwdF1dIiBtdWx0aXBsZSQ9IltbbXVsdGlwbGVdXSI+CiAgPC90ZW1wbGF0ZT4KCiAgPHRlbXBsYXRlIGlkPSJ2MSI+CiAgICAKICAgIDxpcm9uLWlucHV0IGJpbmQtdmFsdWU9Int7dmFsdWV9fSIgc2xvdD0iaW5wdXQiIGNsYXNzPSJpbnB1dC1lbGVtZW50IiBpZCQ9IltbX2lucHV0SWRdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgYWxsb3dlZC1wYXR0ZXJuPSJbW2FsbG93ZWRQYXR0ZXJuXV0iIGludmFsaWQ9Int7aW52YWxpZH19IiB2YWxpZGF0b3I9IltbdmFsaWRhdG9yXV0iPgogICAgICA8aW5wdXQgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdGl0bGUkPSJbW3RpdGxlXV0iIHR5cGUkPSJbW3R5cGVdXSIgcGF0dGVybiQ9IltbcGF0dGVybl1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgbWluJD0iW1ttaW5dXSIgbWF4JD0iW1ttYXhdXSIgc3RlcCQ9Iltbc3RlcF1dIiBuYW1lJD0iW1tuYW1lXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgbGlzdCQ9IltbbGlzdF1dIiBzaXplJD0iW1tzaXplXV0iIGF1dG9jYXBpdGFsaXplJD0iW1thdXRvY2FwaXRhbGl6ZV1dIiBhdXRvY29ycmVjdCQ9IltbYXV0b2NvcnJlY3RdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiIHRhYmluZGV4JD0iW1t0YWJJbmRleF1dIiBhdXRvc2F2ZSQ9IltbYXV0b3NhdmVdXSIgcmVzdWx0cyQ9IltbcmVzdWx0c11dIiBhY2NlcHQkPSJbW2FjY2VwdF1dIiBtdWx0aXBsZSQ9IltbbXVsdGlwbGVdXSI+CiAgICA8L2lyb24taW5wdXQ+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1vdmVybGF5LWJhY2tkcm9wIj4KCiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pcm9uLW92ZXJsYXktYmFja2Ryb3AtYmFja2dyb3VuZC1jb2xvciwgIzAwMCk7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnM7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0taXJvbi1vdmVybGF5LWJhY2tkcm9wOwogICAgICB9CgogICAgICA6aG9zdCgub3BlbmVkKSB7CiAgICAgICAgb3BhY2l0eTogdmFyKC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLW9wYWNpdHksIDAuNik7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAgICAgQGFwcGx5IC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLW9wZW5lZDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1kcm9wZG93biI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CgogICAgICAjY29udGVudFdyYXBwZXIgOjpzbG90dGVkKCopIHsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQoKICAgICAgI2NvbnRlbnRXcmFwcGVyLmFuaW1hdGluZyA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iY29udGVudFdyYXBwZXIiPgogICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItbWVudS1idXR0b24iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgY3Vyc29yOiBhdXRvOwogICAgICAgIGNvbG9yOiB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWVudS1idXR0b24tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlyb24tZHJvcGRvd24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWRyb3Bkb3duOwogICAgICB9CgogICAgICAuZHJvcGRvd24tY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CgogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItbWVudS1idXR0b24tZHJvcGRvd24tYmFja2dyb3VuZCwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWNvbnRlbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbC1hbGlnbj0idG9wIl0pIC5kcm9wZG93bi1jb250ZW50IHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICAgIG1hcmdpbi10b3A6IC0xMHB4OwogICAgICAgIHRvcDogMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZlcnRpY2FsLWFsaWduPSJib3R0b20iXSkgLmRyb3Bkb3duLWNvbnRlbnQgewogICAgICAgIGJvdHRvbTogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAtMTBweDsKICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICB9CgogICAgICAjdHJpZ2dlciB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InRyaWdnZXIiIG9uLXRhcD0idG9nZ2xlIj4KICAgICAgPHNsb3QgbmFtZT0iZHJvcGRvd24tdHJpZ2dlciI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGlyb24tZHJvcGRvd24gaWQ9ImRyb3Bkb3duIiBvcGVuZWQ9Int7b3BlbmVkfX0iIGhvcml6b250YWwtYWxpZ249IltbaG9yaXpvbnRhbEFsaWduXV0iIHZlcnRpY2FsLWFsaWduPSJbW3ZlcnRpY2FsQWxpZ25dXSIgZHluYW1pYy1hbGlnbj0iW1tkeW5hbWljQWxpZ25dXSIgaG9yaXpvbnRhbC1vZmZzZXQ9IltbaG9yaXpvbnRhbE9mZnNldF1dIiB2ZXJ0aWNhbC1vZmZzZXQ9IltbdmVydGljYWxPZmZzZXRdXSIgbm8tb3ZlcmxhcD0iW1tub092ZXJsYXBdXSIgb3Blbi1hbmltYXRpb24tY29uZmlnPSJbW29wZW5BbmltYXRpb25Db25maWddXSIgY2xvc2UtYW5pbWF0aW9uLWNvbmZpZz0iW1tjbG9zZUFuaW1hdGlvbkNvbmZpZ11dIiBuby1hbmltYXRpb25zPSJbW25vQW5pbWF0aW9uc11dIiBmb2N1cy10YXJnZXQ9IltbX2Ryb3Bkb3duQ29udGVudF1dIiBhbGxvdy1vdXRzaWRlLXNjcm9sbD0iW1thbGxvd091dHNpZGVTY3JvbGxdXSIgcmVzdG9yZS1mb2N1cy1vbi1jbG9zZT0iW1tyZXN0b3JlRm9jdXNPbkNsb3NlXV0iIG9uLWlyb24tb3ZlcmxheS1jYW5jZWxlZD0iX19vbklyb25PdmVybGF5Q2FuY2VsZWQiPgogICAgICA8ZGl2IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIGNsYXNzPSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgICA8L2Rpdj4KICAgIDwvaXJvbi1kcm9wZG93bj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGlyb24taWNvbnNldC1zdmcgbmFtZT0icGFwZXItZHJvcGRvd24tbWVudSIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iYXJyb3ctZHJvcC1kb3duIj48cGF0aCBkPSJNNyAxMGw1IDUgNS01eiI+PC9wYXRoPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+CgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1kcm9wZG93bi1tZW51LXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKCiAgICAgICAgLyogTk9URShjZGF0YSk6IEJvdGggdmFsdWVzIGFyZSBuZWVkZWQsIHNpbmNlIHNvbWUgcGhvbmVzIHJlcXVpcmUgdGhlCiAgICAgICAgICogdmFsdWUgdG8gYmUgYHRyYW5zcGFyZW50YC4KICAgICAgICAgKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwwLDAsMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIH07CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LWRpc2FibGVkOwogICAgICB9CgogICAgICA6aG9zdChbbm9pbmtdKSBwYXBlci1yaXBwbGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtuby1sYWJlbC1mbG9hdF0pIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgdG9wOiA4cHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgdG9wOiAxMnB4OwogICAgICAgIGxlZnQ6IDBweDsKICAgICAgICBib3R0b206IDhweDsKICAgICAgICByaWdodDogMHB4OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LXJpcHBsZTsKICAgICAgfQoKICAgICAgcGFwZXItbWVudS1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDA7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZHJvcGRvd24tbWVudS1pbnB1dDsKICAgICAgfQoKICAgICAgaXJvbi1pY29uIHsKICAgICAgICBjb2xvcjogdmFyKC0tZGlzYWJsZWQtdGV4dC1jb2xvcik7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtaWNvbjsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItZHJvcGRvd24tbWVudSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLWRyb3Bkb3duLW1lbnUtc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KCiAgICAKICAgIDxzcGFuIHJvbGU9ImJ1dHRvbiI+PC9zcGFuPgogICAgPHBhcGVyLW1lbnUtYnV0dG9uIGlkPSJtZW51QnV0dG9uIiB2ZXJ0aWNhbC1hbGlnbj0iW1t2ZXJ0aWNhbEFsaWduXV0iIGhvcml6b250YWwtYWxpZ249IltbaG9yaXpvbnRhbEFsaWduXV0iIGR5bmFtaWMtYWxpZ249IltbZHluYW1pY0FsaWduXV0iIHZlcnRpY2FsLW9mZnNldD0iW1tfY29tcHV0ZU1lbnVWZXJ0aWNhbE9mZnNldChub0xhYmVsRmxvYXQsIHZlcnRpY2FsT2Zmc2V0KV1dIiBkaXNhYmxlZD0iW1tkaXNhYmxlZF1dIiBuby1hbmltYXRpb25zPSJbW25vQW5pbWF0aW9uc11dIiBvbi1pcm9uLXNlbGVjdD0iX29uSXJvblNlbGVjdCIgb24taXJvbi1kZXNlbGVjdD0iX29uSXJvbkRlc2VsZWN0IiBvcGVuZWQ9Int7b3BlbmVkfX0iIGNsb3NlLW9uLWFjdGl2YXRlIGFsbG93LW91dHNpZGUtc2Nyb2xsPSJbW2FsbG93T3V0c2lkZVNjcm9sbF1dIiByZXN0b3JlLWZvY3VzLW9uLWNsb3NlPSJbW3Jlc3RvcmVGb2N1c09uQ2xvc2VdXSI+CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi10cmlnZ2VyIiBzbG90PSJkcm9wZG93bi10cmlnZ2VyIj4KICAgICAgICA8cGFwZXItcmlwcGxlPjwvcGFwZXItcmlwcGxlPgogICAgICAgIAogICAgICAgIDxwYXBlci1pbnB1dCB0eXBlPSJ0ZXh0IiBpbnZhbGlkPSJbW2ludmFsaWRdXSIgcmVhZG9ubHkgZGlzYWJsZWQ9IltbZGlzYWJsZWRdXSIgdmFsdWU9IltbdmFsdWVdXSIgcGxhY2Vob2xkZXI9IltbcGxhY2Vob2xkZXJdXSIgZXJyb3ItbWVzc2FnZT0iW1tlcnJvck1lc3NhZ2VdXSIgYWx3YXlzLWZsb2F0LWxhYmVsPSJbW2Fsd2F5c0Zsb2F0TGFiZWxdXSIgbm8tbGFiZWwtZmxvYXQ9Iltbbm9MYWJlbEZsb2F0XV0iIGxhYmVsPSJbW2xhYmVsXV0iPgogICAgICAgICAgCiAgICAgICAgICA8aXJvbi1pY29uIGljb249InBhcGVyLWRyb3Bkb3duLW1lbnU6YXJyb3ctZHJvcC1kb3duIiBzdWZmaXggc2xvdD0ic3VmZml4Ij48L2lyb24taWNvbj4KICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8L2Rpdj4KICAgICAgPHNsb3QgaWQ9ImNvbnRlbnQiIG5hbWU9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPjwvc2xvdD4KICAgIDwvcGFwZXItbWVudS1idXR0b24+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItbGlzdGJveCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogOHB4IDA7CgogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLWxpc3Rib3gtYmFja2dyb3VuZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWxpc3Rib3gtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1saXN0Ym94OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pdGVtLXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QsIC5wYXBlci1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tcGFwZXItaXRlbS1taW4taGVpZ2h0LCA0OHB4KTsKICAgICAgICBwYWRkaW5nOiAwcHggMTZweDsKICAgICAgfQoKICAgICAgLnBhcGVyLWl0ZW0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgICBib3JkZXI6bm9uZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSwgLnBhcGVyLWl0ZW1baGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICA6aG9zdCguaXJvbi1zZWxlY3RlZCksIC5wYXBlci1pdGVtLmlyb24tc2VsZWN0ZWQgewogICAgICAgIGZvbnQtd2VpZ2h0OiB2YXIoLS1wYXBlci1pdGVtLXNlbGVjdGVkLXdlaWdodCwgYm9sZCk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0tc2VsZWN0ZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pLCAucGFwZXItaXRlbVtkaXNhYmxlZF0gewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pdGVtLWRpc2FibGVkLWNvbG9yLCB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cyksIC5wYXBlci1pdGVtOmZvY3VzIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3V0bGluZTogMDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1mb2N1c2VkOwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpOmJlZm9yZSwgLnBhcGVyLWl0ZW06Zm9jdXM6YmVmb3JlIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwoKICAgICAgICBiYWNrZ3JvdW5kOiBjdXJyZW50Q29sb3I7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tZGFyay1kaXZpZGVyLW9wYWNpdHkpOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLWZvY3VzZWQtYmVmb3JlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pdGVtIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItaXRlbS1zaGFyZWQtc3R5bGVzIj4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1zdWJoZWFkOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1iYWNrZW5kIj4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1zdG9yYWdlIj4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGFnLWZpbHRlcmVyIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItaW5wdXQgbm8tbGFiZWwtZmxvYXQgbGFiZWw9IkZpbHRlciB0YWdzIChyZWd1bGFyIGV4cHJlc3Npb25zIHN1cHBvcnRlZCkiIHZhbHVlPSJ7e190YWdGaWx0ZXJ9fSIgY2xhc3M9InNlYXJjaC1pbnB1dCI+CiAgICAgIDxpcm9uLWljb24gcHJlZml4IGljb249InNlYXJjaCIgc2xvdD0icHJlZml4Ij48L2lyb24taWNvbj4KICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDEwcHggNXB4IDEwcHggMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmxheW91dC5ob3Jpem9udGFsLAogICAgICAubGF5b3V0LnZlcnRpY2FsIHsKICAgICAgICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmxheW91dC5pbmxpbmUgewogICAgICAgIGRpc3BsYXk6IC1tcy1pbmxpbmUtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWlubGluZS1mbGV4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICB9CgogICAgICAubGF5b3V0Lmhvcml6b250YWwgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CgogICAgICAubGF5b3V0LnZlcnRpY2FsIHsKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgLmxheW91dC53cmFwIHsKICAgICAgICAtbXMtZmxleC13cmFwOiB3cmFwOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwOwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfQoKICAgICAgLmxheW91dC5uby13cmFwIHsKICAgICAgICAtbXMtZmxleC13cmFwOiBub3dyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXIsCiAgICAgIC5sYXlvdXQuY2VudGVyLWNlbnRlciB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItanVzdGlmaWVkLAogICAgICAubGF5b3V0LmNlbnRlci1jZW50ZXIgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAuZmxleCB7CiAgICAgICAgLW1zLWZsZXg6IDEgMSAwLjAwMDAwMDAwMXB4OwogICAgICAgIC13ZWJraXQtZmxleDogMTsKICAgICAgICBmbGV4OiAxOwogICAgICAgIC13ZWJraXQtZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgICBmbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICB9CgogICAgICAuZmxleC1hdXRvIHsKICAgICAgICAtbXMtZmxleDogMSAxIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDEgYXV0bzsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfQoKICAgICAgLmZsZXgtbm9uZSB7CiAgICAgICAgLW1zLWZsZXg6IG5vbmU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiBub25lOwogICAgICAgIGZsZXg6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgtcmV2ZXJzZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAubGF5b3V0Lmhvcml6b250YWwtcmV2ZXJzZSwKICAgICAgLmxheW91dC52ZXJ0aWNhbC1yZXZlcnNlIHsKICAgICAgICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmxheW91dC5ob3Jpem9udGFsLXJldmVyc2UgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICB9CgogICAgICAubGF5b3V0LnZlcnRpY2FsLXJldmVyc2UgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICB9CgogICAgICAubGF5b3V0LndyYXAtcmV2ZXJzZSB7CiAgICAgICAgLW1zLWZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgtYWxpZ25tZW50Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC8qKgogICAgICAgKiBBbGlnbm1lbnQgaW4gY3Jvc3MgYXhpcy4KICAgICAgICovCiAgICAgIC5sYXlvdXQuc3RhcnQgewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBzdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAubGF5b3V0LmNlbnRlciwKICAgICAgLmxheW91dC5jZW50ZXItY2VudGVyIHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmVuZCB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYmFzZWxpbmUgewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBbGlnbm1lbnQgaW4gbWFpbiBheGlzLgogICAgICAgKi8KICAgICAgLmxheW91dC5zdGFydC1qdXN0aWZpZWQgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IHN0YXJ0OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItanVzdGlmaWVkLAogICAgICAubGF5b3V0LmNlbnRlci1jZW50ZXIgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmVuZC1qdXN0aWZpZWQgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGVuZDsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLmxheW91dC5hcm91bmQtanVzdGlmaWVkIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBkaXN0cmlidXRlOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuanVzdGlmaWVkIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBqdXN0aWZ5OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlbGYgYWxpZ25tZW50LgogICAgICAgKi8KICAgICAgLnNlbGYtc3RhcnQgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAuc2VsZi1jZW50ZXIgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICB9CgogICAgICAuc2VsZi1lbmQgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICB9CgogICAgICAuc2VsZi1zdHJldGNoIHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgICAgYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgfQoKICAgICAgLnNlbGYtYmFzZWxpbmUgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICB9CgogICAgICAvKioKICAgICAgICogbXVsdGktbGluZSBhbGlnbm1lbnQgaW4gbWFpbiBheGlzLgogICAgICAgKi8KICAgICAgLmxheW91dC5zdGFydC1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IHN0YXJ0OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAubGF5b3V0LmVuZC1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGVuZDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItYWxpZ25lZCB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBjZW50ZXI7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYmV0d2Vlbi1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGp1c3RpZnk7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYXJvdW5kLWFsaWduZWQgewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogZGlzdHJpYnV0ZTsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Cgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1mbGV4LWZhY3RvcnMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmZsZXgsCiAgICAgIC5mbGV4LTEgewogICAgICAgIC1tcy1mbGV4OiAxIDEgMC4wMDAwMDAwMDFweDsKICAgICAgICAtd2Via2l0LWZsZXg6IDE7CiAgICAgICAgZmxleDogMTsKICAgICAgICAtd2Via2l0LWZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgICAgZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgfQoKICAgICAgLmZsZXgtMiB7CiAgICAgICAgLW1zLWZsZXg6IDI7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAyOwogICAgICAgIGZsZXg6IDI7CiAgICAgIH0KCiAgICAgIC5mbGV4LTMgewogICAgICAgIC1tcy1mbGV4OiAzOwogICAgICAgIC13ZWJraXQtZmxleDogMzsKICAgICAgICBmbGV4OiAzOwogICAgICB9CgogICAgICAuZmxleC00IHsKICAgICAgICAtbXMtZmxleDogNDsKICAgICAgICAtd2Via2l0LWZsZXg6IDQ7CiAgICAgICAgZmxleDogNDsKICAgICAgfQoKICAgICAgLmZsZXgtNSB7CiAgICAgICAgLW1zLWZsZXg6IDU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA1OwogICAgICAgIGZsZXg6IDU7CiAgICAgIH0KCiAgICAgIC5mbGV4LTYgewogICAgICAgIC1tcy1mbGV4OiA2OwogICAgICAgIC13ZWJraXQtZmxleDogNjsKICAgICAgICBmbGV4OiA2OwogICAgICB9CgogICAgICAuZmxleC03IHsKICAgICAgICAtbXMtZmxleDogNzsKICAgICAgICAtd2Via2l0LWZsZXg6IDc7CiAgICAgICAgZmxleDogNzsKICAgICAgfQoKICAgICAgLmZsZXgtOCB7CiAgICAgICAgLW1zLWZsZXg6IDg7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA4OwogICAgICAgIGZsZXg6IDg7CiAgICAgIH0KCiAgICAgIC5mbGV4LTkgewogICAgICAgIC1tcy1mbGV4OiA5OwogICAgICAgIC13ZWJraXQtZmxleDogOTsKICAgICAgICBmbGV4OiA5OwogICAgICB9CgogICAgICAuZmxleC0xMCB7CiAgICAgICAgLW1zLWZsZXg6IDEwOwogICAgICAgIC13ZWJraXQtZmxleDogMTA7CiAgICAgICAgZmxleDogMTA7CiAgICAgIH0KCiAgICAgIC5mbGV4LTExIHsKICAgICAgICAtbXMtZmxleDogMTE7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxMTsKICAgICAgICBmbGV4OiAxMTsKICAgICAgfQoKICAgICAgLmZsZXgtMTIgewogICAgICAgIC1tcy1mbGV4OiAxMjsKICAgICAgICAtd2Via2l0LWZsZXg6IDEyOwogICAgICAgIGZsZXg6IDEyOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1wb3NpdGlvbmluZyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuYmxvY2sgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaW52aXNpYmxlIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLnJlbGF0aXZlIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIGJvZHkuZnVsbGJsZWVkIHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgfQoKICAgICAgLnNjcm9sbCB7CiAgICAgICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAvKiBmaXhlZCBwb3NpdGlvbiAqLwogICAgICAuZml4ZWQtYm90dG9tLAogICAgICAuZml4ZWQtbGVmdCwKICAgICAgLmZpeGVkLXJpZ2h0LAogICAgICAuZml4ZWQtdG9wIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KCiAgICAgIC5maXhlZC10b3AgewogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtcmlnaHQgewogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgIH0KCiAgICAgIC5maXhlZC1ib3R0b20gewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtbGVmdCB7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogIDpyb290IHsKICAgIC0tdGItb3JhbmdlLXdlYWs6ICNmZmE3MjY7CiAgICAtLXRiLW9yYW5nZS1zdHJvbmc6ICNmNTdjMDA7CiAgICAtLXRiLW9yYW5nZS1kYXJrOiAjZGM3MzIwOwogICAgLS10Yi1ncmV5LWRhcmtlcjogI2UyZTJlMjsKICAgIC0tdGItZ3JleS1saWdodGVyOiAjZjNmM2YzOwogICAgLS10Yi11aS1kYXJrLWFjY2VudDogIzc1NzU3NTsKICAgIC0tdGItdWktbGlnaHQtYWNjZW50OiAjZTBlMGUwOwogICAgLS10Yi1ncmFwaC1mYWRlZDogI2UwZDRiMzsKICB9Cjwvc3R5bGU+CgoKPGRvbS1tb2R1bGUgaWQ9ImRhc2hib2FyZC1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9Imlyb24tZmxleCI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIC0tc2lkZWJhci12ZXJ0aWNhbC1wYWRkaW5nOiAxNXB4OwogICAgICAgIC0tc2lkZWJhci1sZWZ0LXBhZGRpbmc6IDMwcHg7CiAgICAgIH0KCiAgICAgIFtzbG90PSdzaWRlYmFyJ10gewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIHBhZGRpbmc6IDVweCAwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CgogICAgICB0Zi1ydW5zLXNlbGVjdG9yIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgbGVmdDogdmFyKC0tc2lkZWJhci1sZWZ0LXBhZGRpbmcpOwogICAgICAgIG1heC1oZWlnaHQ6IGNhbGMoMTAwJSAtIHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgKiAyKTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgfQoKICAgICAgLnNlYXJjaC1pbnB1dCB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDVweCAwIDEwcHg7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gewogICAgICAgIGJvcmRlci10b3A6IHNvbGlkIDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpOwogICAgICAgIHBhZGRpbmc6IHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgMAogICAgICAgICAgdmFyKC0tc2lkZWJhci12ZXJ0aWNhbC1wYWRkaW5nKSB2YXIoLS1zaWRlYmFyLWxlZnQtcGFkZGluZyk7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuc2lkZWJhci1zZWN0aW9uOmZpcnN0LW9mLXR5cGUgewogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbjpsYXN0LW9mLXR5cGUgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAuc2lkZWJhci1zZWN0aW9uIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgbWFyZ2luOiA1cHg7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmZpcnN0LW9mLXR5cGUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmxhc3Qtb2YtdHlwZSB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6Zmlyc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgcGFkZGluZy10b3A6IDA7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMDsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbiBoMyB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktODAwKTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBtYXJnaW46IDEwcHggMCA1cHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTVweDsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJzY3JvbGxiYXItc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICB9CgogICAgICAuc2Nyb2xsYmFyOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMCAycHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICB9CiAgICAgIC5zY3JvbGxiYXIgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRhc2hib2FyZC1sYXlvdXQiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9InNpZGViYXIiPgogICAgICA8c2xvdCBuYW1lPSJzaWRlYmFyIj48L3Nsb3Q+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjZW50ZXIiPgogICAgICA8c2xvdCBuYW1lPSJjZW50ZXIiIGNsYXNzPSJzY29sbGJhciI+PC9zbG90PgogICAgPC9kaXY+CiAgICA8c3R5bGUgaW5jbHVkZT0ic2Nyb2xsYmFyLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgI3NpZGViYXIgewogICAgICAgIGZsZXg6IDAgMCB2YXIoLS10Zi1kYXNoYm9hcmQtbGF5b3V0LXNpZGViYXItYmFzaXMsIDI1JSk7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG1heC13aWR0aDogdmFyKC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1heC13aWR0aCwgMzUwcHgpOwogICAgICAgIG1pbi13aWR0aDogdmFyKC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1pbi13aWR0aCwgMjcwcHgpOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KCiAgICAgICNjZW50ZXIgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgOjpzbG90dGVkKFtzbG90PSdjZW50ZXInXSkgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAudGYtZ3JhcGgtZGFzaGJvYXJkICNjZW50ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1vcHRpb24tc2VsZWN0b3IiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9IndyYXAiPgogICAgICA8aDM+W1tuYW1lXV08L2gzPgogICAgICA8ZGl2IGNsYXNzPSJjb250ZW50LXdyYXBwZXIiPjxzbG90Pjwvc2xvdD48L2Rpdj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCguc2VsZWN0ZWQpIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIGgzIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIG1hcmdpbjogMCAwIDVweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWNvbGxhcHNlIj4KCiAgPHRlbXBsYXRlPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLWlyb24tY29sbGFwc2UtdHJhbnNpdGlvbi1kdXJhdGlvbiwgMzAwbXMpOwogICAgICAgIC8qIFNhZmFyaSAxMCBuZWVkcyB0aGlzIHByb3BlcnR5IHByZWZpeGVkIHRvIGNvcnJlY3RseSBhcHBseSB0aGUgY3VzdG9tIHByb3BlcnR5ICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1pcm9uLWNvbGxhcHNlLXRyYW5zaXRpb24tZHVyYXRpb24sIDMwMG1zKTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmlyb24tY29sbGFwc2UtY2xvc2VkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdCguaXJvbi1jb2xsYXBzZS1vcGVuZWQpKSB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CgogIDwvdGVtcGxhdGU+Cgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3BhbmVSZW5kZXJlZF1dIiBpZD0iaWZSZW5kZXJlZCI+CiAgICAgIDxidXR0b24gY2xhc3M9ImhlYWRpbmciIG9uLXRhcD0iX3RvZ2dsZVBhbmUiIG9wZW4tYnV0dG9uJD0iW1tvcGVuZWRdXSI+CiAgICAgICAgPHNwYW4gY2xhc3M9Im5hbWUiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1NlYXJjaFJlc3VsdHNdXSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNDb21wb3NpdGVTZWFyY2goY2F0ZWdvcnkpXV0iPgogICAgICAgICAgICAgIDxzcGFuPlRhZ3MgbWF0Y2hpbmcgbXVsdGlwbGUgZXhwZXJpbWVudHM8L3NwYW4+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0ludmFsaWRTZWFyY2hSZXN1bHRzXV0iPgogICAgICAgICAgICAgICAgPHNwYW4+Jm5ic3A7PHN0cm9uZz4obWFsZm9ybWVkIHJlZ3VsYXIgZXhwcmVzc2lvbik8L3N0cm9uZz48L3NwYW4+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaXNDb21wb3NpdGVTZWFyY2goY2F0ZWdvcnkpXV0iPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsaWdodCI+VGFncyBtYXRjaGluZyAvPC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS1uYW1lIiB0aXRsZSQ9IltbY2F0ZWdvcnkubmFtZV1dIj5bW2NhdGVnb3J5Lm5hbWVdXTwvc3Bhbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGlnaHQiPi88L3NwYW4+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5XV0iPgogICAgICAgICAgICAgICAgPHNwYW4+IChhbGwgdGFncyk8L3NwYW4+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzSW52YWxpZFNlYXJjaFJlc3VsdHNdXSI+CiAgICAgICAgICAgICAgICA8c3Bhbj4gPHN0cm9uZz4obWFsZm9ybWVkIHJlZ3VsYXIgZXhwcmVzc2lvbik8L3N0cm9uZz48L3NwYW4+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9pc1NlYXJjaFJlc3VsdHNdXSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS1uYW1lIiB0aXRsZSQ9IltbY2F0ZWdvcnkubmFtZV1dIj5bW2NhdGVnb3J5Lm5hbWVdXTwvc3Bhbj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJjb3VudCI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlXV0iPgogICAgICAgICAgICA8c3Bhbj5bW19jb3VudF1dPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iZXhwYW5kLW1vcmUiIGNsYXNzPSJleHBhbmQtYXJyb3ciPjwvaXJvbi1pY29uPgogICAgICAgIDwvc3Bhbj4KICAgICAgPC9idXR0b24+CiAgICAgIAogICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9Iltbb3BlbmVkXV0iIG5vLWFuaW1hdGlvbj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgICAgIDxzcGFuIGlkPSJ0b3Atb2YtY29udGFpbmVyIj48L3NwYW4+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX211bHRpcGxlUGFnZXNFeGlzdF1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmlnLXBhZ2UtYnV0dG9ucyIgc3R5bGU9Im1hcmdpbi1ib3R0b206IDEwcHg7Ij4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIG9uLXRhcD0iX3BlcmZvcm1QcmV2aW91c1BhZ2UiIGRpc2FibGVkJD0iW1shX2hhc1ByZXZpb3VzUGFnZV1dIj5QcmV2aW91cyBwYWdlPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBvbi10YXA9Il9wZXJmb3JtTmV4dFBhZ2UiIGRpc2FibGVkJD0iW1shX2hhc05leHRQYWdlXV0iPk5leHQgcGFnZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgICAgPGRpdiBpZD0iaXRlbXMiPgogICAgICAgICAgICA8c2xvdCBuYW1lPSJpdGVtcyI+PC9zbG90PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX211bHRpcGxlUGFnZXNFeGlzdF1dIj4KICAgICAgICAgICAgPGRpdiBpZD0iY29udHJvbHMtY29udGFpbmVyIj4KICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmc6IDAgNXB4Ij4KICAgICAgICAgICAgICAgIFBhZ2UKICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBpZD0icGFnZS1pbnB1dCIgdHlwZT0ibnVtYmVyIiBuby1sYWJlbC1mbG9hdCBtaW49IjEiIG1heD0iW1tfcGFnZUNvdW50XV0iIHZhbHVlPSJbW19wYWdlSW5wdXRWYWx1ZV1dIiBvbi1pbnB1dD0iX2hhbmRsZVBhZ2VJbnB1dEV2ZW50IiBvbi1jaGFuZ2U9Il9oYW5kbGVQYWdlQ2hhbmdlRXZlbnQiIG9uLWZvY3VzPSJfaGFuZGxlUGFnZUZvY3VzRXZlbnQiIG9uLWJsdXI9Il9oYW5kbGVQYWdlQmx1ckV2ZW50Ij48L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgb2YgW1tfcGFnZUNvdW50XV0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJiaWctcGFnZS1idXR0b25zIiBzdHlsZT0ibWFyZ2luLXRvcDogMTBweDsiPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gb24tdGFwPSJfcGVyZm9ybVByZXZpb3VzUGFnZSIgZGlzYWJsZWQkPSJbWyFfaGFzUHJldmlvdXNQYWdlXV0iPlByZXZpb3VzIHBhZ2U8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIG9uLXRhcD0iX3BlcmZvcm1OZXh0UGFnZSIgZGlzYWJsZWQkPSJbWyFfaGFzTmV4dFBhZ2VdXSI+TmV4dCBwYWdlPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbjogMCA1cHggMXB4IDEwcHg7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmaXJzdC1vZi10eXBlKSB7CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoOmxhc3Qtb2YtdHlwZSkgewogICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZvbnQtc2l6ZTogMTVweDsKICAgICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgICBib3gtc2hhZG93OiAwIDFweCA1cHggcmdiYSgwLCAwLCAwLCAwLjIpOwogICAgICAgIHBhZGRpbmc6IDEwcHggMTVweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9CgogICAgICAuaGVhZGluZzo6LW1vei1mb2N1cy1pbm5lciB7CiAgICAgICAgcGFkZGluZzogMTBweCAxNXB4OwogICAgICB9CgogICAgICBbb3Blbi1idXR0b25dIHsKICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDAgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgW29wZW4tYnV0dG9uXSAuZXhwYW5kLWFycm93IHsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZVooMTgwZGVnKTsKICAgICAgfQoKICAgICAgLm5hbWUgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5saWdodCB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgfQoKICAgICAgLmNhdGVnb3J5LW5hbWUgewogICAgICAgIHdoaXRlLXNwYWNlOiBwcmU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBwYWRkaW5nOiAycHggMDsKICAgICAgfQoKICAgICAgLmNvdW50IHsKICAgICAgICBtYXJnaW46IDAgNXB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS01MDApOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBmbGV4OiBub25lOwogICAgICB9CgogICAgICAuaGVhZGluZzo6LW1vei1mb2N1cy1pbm5lciB7CiAgICAgICAgcGFkZGluZzogMTBweCAxNXB4OwogICAgICB9CgogICAgICAuY29udGVudCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDJweDsKICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMnB4OwogICAgICAgIGJvcmRlci10b3A6IG5vbmU7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RlZGVkZTsKICAgICAgICBwYWRkaW5nOiAxNXB4OwogICAgICB9CgogICAgICAubGlnaHQgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTUwMCk7CiAgICAgIH0KCiAgICAgICNjb250cm9scy1jb250YWluZXIgewogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNjb250cm9scy1jb250YWluZXIgcGFwZXItYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIC5iaWctcGFnZS1idXR0b25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAuYmlnLXBhZ2UtYnV0dG9ucyBwYXBlci1idXR0b24gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgZmxleC1iYXNpczogMDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICB9CgogICAgICAuYmlnLXBhZ2UtYnV0dG9ucyBwYXBlci1idXR0b25bZGlzYWJsZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICB9CgogICAgICBzbG90IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CgogICAgICAjcGFnZS1pbnB1dCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiB2YXIoLS10Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldy1wYWdlLWlucHV0LXdpZHRoLCAxMDAlKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWRpYWxvZy1zaGFyZWQtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDI0cHggNDBweDsKCiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItZGlhbG9nLWJhY2tncm91bmQtY29sb3IsIHZhcigtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvcikpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1kaWFsb2ctY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWJvZHkxOwogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kaWFsb2c7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKCopIHsKICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDAgMjRweDsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoLm5vLXBhZGRpbmcpIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKjpmaXJzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi10b3A6IDI0cHg7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKCo6bGFzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgIH0KCiAgICAgIC8qIEluIDEueCwgdGhpcyBzZWxlY3RvciB3YXMgYDpob3N0ID4gOjpjb250ZW50IGgyYC4gSW4gMi54IDxzbG90PiBhbGxvd3MKICAgICAgdG8gc2VsZWN0IGRpcmVjdCBjaGlsZHJlbiBvbmx5LCB3aGljaCBpbmNyZWFzZXMgdGhlIHdlaWdodCBvZiB0aGlzCiAgICAgIHNlbGVjdG9yLCBzbyB3ZSBoYXZlIHRvIHJlLWRlZmluZSBmaXJzdC1jaGlsZC9sYXN0LWNoaWxkIG1hcmdpbnMgYmVsb3cuICovCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKGgyKSB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1hcmdpbjogMDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC10aXRsZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kaWFsb2ctdGl0bGU7CiAgICAgIH0KCiAgICAgIC8qIEFwcGx5IG1peGluIGFnYWluLCBpbiBjYXNlIGl0IHNldHMgbWFyZ2luLXRvcC4gKi8KICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoaDI6Zmlyc3QtY2hpbGQpIHsKICAgICAgICBtYXJnaW4tdG9wOiAyNHB4OwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy10aXRsZTsKICAgICAgfQoKICAgICAgLyogQXBwbHkgbWl4aW4gYWdhaW4sIGluIGNhc2UgaXQgc2V0cyBtYXJnaW4tYm90dG9tLiAqLwogICAgICA6aG9zdCA+IDo6c2xvdHRlZChoMjpsYXN0LWNoaWxkKSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kaWFsb2ctdGl0bGU7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKC5wYXBlci1kaWFsb2ctYnV0dG9ucyksCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKC5idXR0b25zKSB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHBhZGRpbmc6IDhweCA4cHggOHB4IDI0cHg7CiAgICAgICAgbWFyZ2luOiAwOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZGlhbG9nLWJ1dHRvbi1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZW5kLWp1c3RpZmllZDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1kaWFsb2ciPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJwYXBlci1kaWFsb2ctc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWNvbG9yLXNjYWxlIj4KICAKICAKPC9kb20tbW9kdWxlPgoKCgoKPGlyb24taWNvbnNldC1zdmcgbmFtZT0iaWNvbnMiIHNpemU9IjI0Ij4KPHN2Zz48ZGVmcz4KPGcgaWQ9IjNkLXJvdGF0aW9uIj48cGF0aCBkPSJNNy41MiAyMS40OEM0LjI1IDE5Ljk0IDEuOTEgMTYuNzYgMS41NSAxM0guMDVDLjU2IDE5LjE2IDUuNzEgMjQgMTIgMjRsLjY2LS4wMy0zLjgxLTMuODEtMS4zMyAxLjMyem0uODktNi41MmMtLjE5IDAtLjM3LS4wMy0uNTItLjA4LS4xNi0uMDYtLjI5LS4xMy0uNC0uMjQtLjExLS4xLS4yLS4yMi0uMjYtLjM3LS4wNi0uMTQtLjA5LS4zLS4wOS0uNDdoLTEuM2MwIC4zNi4wNy42OC4yMS45NS4xNC4yNy4zMy41LjU2LjY5LjI0LjE4LjUxLjMyLjgyLjQxLjMuMS42Mi4xNS45Ni4xNS4zNyAwIC43Mi0uMDUgMS4wMy0uMTUuMzItLjEuNi0uMjUuODMtLjQ0cy40Mi0uNDMuNTUtLjcyYy4xMy0uMjkuMi0uNjEuMi0uOTcgMC0uMTktLjAyLS4zOC0uMDctLjU2LS4wNS0uMTgtLjEyLS4zNS0uMjMtLjUxLS4xLS4xNi0uMjQtLjMtLjQtLjQzLS4xNy0uMTMtLjM3LS4yMy0uNjEtLjMxLjItLjA5LjM3LS4yLjUyLS4zMy4xNS0uMTMuMjctLjI3LjM3LS40Mi4xLS4xNS4xNy0uMy4yMi0uNDYuMDUtLjE2LjA3LS4zMi4wNy0uNDggMC0uMzYtLjA2LS42OC0uMTgtLjk2LS4xMi0uMjgtLjI5LS41MS0uNTEtLjY5LS4yLS4xOS0uNDctLjMzLS43Ny0uNDNDOS4xIDguMDUgOC43NiA4IDguMzkgOGMtLjM2IDAtLjY5LjA1LTEgLjE2LS4zLjExLS41Ny4yNi0uNzkuNDUtLjIxLjE5LS4zOC40MS0uNTEuNjctLjEyLjI2LS4xOC41NC0uMTguODVoMS4zYzAtLjE3LjAzLS4zMi4wOS0uNDVzLjE0LS4yNS4yNS0uMzRjLjExLS4wOS4yMy0uMTcuMzgtLjIyLjE1LS4wNS4zLS4wOC40OC0uMDguNCAwIC43LjEuODkuMzEuMTkuMi4yOS40OS4yOS44NiAwIC4xOC0uMDMuMzQtLjA4LjQ5LS4wNS4xNS0uMTQuMjctLjI1LjM3LS4xMS4xLS4yNS4xOC0uNDEuMjQtLjE2LjA2LS4zNi4wOS0uNTguMDlINy41djEuMDNoLjc3Yy4yMiAwIC40Mi4wMi42LjA3cy4zMy4xMy40NS4yM2MuMTIuMTEuMjIuMjQuMjkuNC4wNy4xNi4xLjM1LjEuNTcgMCAuNDEtLjEyLjcyLS4zNS45My0uMjMuMjMtLjU1LjMzLS45NS4zM3ptOC41NS01LjkyYy0uMzItLjMzLS43LS41OS0xLjE0LS43Ny0uNDMtLjE4LS45Mi0uMjctMS40Ni0uMjdIMTJ2OGgyLjNjLjU1IDAgMS4wNi0uMDkgMS41MS0uMjcuNDUtLjE4Ljg0LS40MyAxLjE2LS43Ni4zMi0uMzMuNTctLjczLjc0LTEuMTkuMTctLjQ3LjI2LS45OS4yNi0xLjU3di0uNGMwLS41OC0uMDktMS4xLS4yNi0xLjU3LS4xOC0uNDctLjQzLS44Ny0uNzUtMS4yem0tLjM5IDMuMTZjMCAuNDItLjA1Ljc5LS4xNCAxLjEzLS4xLjMzLS4yNC42Mi0uNDMuODUtLjE5LjIzLS40My40MS0uNzEuNTMtLjI5LjEyLS42Mi4xOC0uOTkuMThoLS45MVY5LjEyaC45N2MuNzIgMCAxLjI3LjIzIDEuNjQuNjkuMzguNDYuNTcgMS4xMi41NyAxLjk5di40ek0xMiAwbC0uNjYuMDMgMy44MSAzLjgxIDEuMzMtMS4zM2MzLjI3IDEuNTUgNS42MSA0LjcyIDUuOTYgOC40OGgxLjVDMjMuNDQgNC44NCAxOC4yOSAwIDEyIDB6IiAvPjwvZz4KPGcgaWQ9ImFjY2Vzc2liaWxpdHkiPjxwYXRoIGQ9Ik0xMiAyYzEuMSAwIDIgLjkgMiAycy0uOSAyLTIgMi0yLS45LTItMiAuOS0yIDItMnptOSA3aC02djEzaC0ydi02aC0ydjZIOVY5SDNWN2gxOHYyeiIgLz48L2c+CjxnIGlkPSJhY2Nlc3NpYmxlIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjQiIHI9IjIiIC8+PHBhdGggZD0iTTE5IDEzdi0yYy0xLjU0LjAyLTMuMDktLjc1LTQuMDctMS44M2wtMS4yOS0xLjQzYy0uMTctLjE5LS4zOC0uMzQtLjYxLS40NS0uMDEgMC0uMDEtLjAxLS4wMi0uMDFIMTNjLS4zNS0uMi0uNzUtLjMtMS4xOS0uMjZDMTAuNzYgNy4xMSAxMCA4LjA0IDEwIDkuMDlWMTVjMCAxLjEuOSAyIDIgMmg1djVoMnYtNS41YzAtMS4xLS45LTItMi0yaC0zdi0zLjQ1YzEuMjkgMS4wNyAzLjI1IDEuOTQgNSAxLjk1em0tNi4xNyA1Yy0uNDEgMS4xNi0xLjUyIDItMi44MyAyLTEuNjYgMC0zLTEuMzQtMy0zIDAtMS4zMS44NC0yLjQxIDItMi44M1YxMi4xYy0yLjI4LjQ2LTQgMi40OC00IDQuOSAwIDIuNzYgMi4yNCA1IDUgNSAyLjQyIDAgNC40NC0xLjcyIDQuOS00aC0yLjA3eiIgLz48L2c+CjxnIGlkPSJhY2NvdW50LWJhbGFuY2UiPjxwYXRoIGQ9Ik00IDEwdjdoM3YtN0g0em02IDB2N2gzdi03aC0zek0yIDIyaDE5di0zSDJ2M3ptMTQtMTJ2N2gzdi03aC0zem0tNC41LTlMMiA2djJoMTlWNmwtOS41LTV6IiAvPjwvZz4KPGcgaWQ9ImFjY291bnQtYmFsYW5jZS13YWxsZXQiPjxwYXRoIGQ9Ik0yMSAxOHYxYzAgMS4xLS45IDItMiAySDVjLTEuMTEgMC0yLS45LTItMlY1YzAtMS4xLjg5LTIgMi0yaDE0YzEuMSAwIDIgLjkgMiAydjFoLTljLTEuMTEgMC0yIC45LTIgMnY4YzAgMS4xLjg5IDIgMiAyaDl6bS05LTJoMTBWOEgxMnY4em00LTIuNWMtLjgzIDAtMS41LS42Ny0xLjUtMS41cy42Ny0xLjUgMS41LTEuNSAxLjUuNjcgMS41IDEuNS0uNjcgMS41LTEuNSAxLjV6IiAvPjwvZz4KPGcgaWQ9ImFjY291bnQtYm94Ij48cGF0aCBkPSJNMyA1djE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJINWMtMS4xMSAwLTIgLjktMiAyem0xMiA0YzAgMS42Ni0xLjM0IDMtMyAzcy0zLTEuMzQtMy0zIDEuMzQtMyAzLTMgMyAxLjM0IDMgM3ptLTkgOGMwLTIgNC0zLjEgNi0zLjFzNiAxLjEgNiAzLjF2MUg2di0xeiIgLz48L2c+CjxnIGlkPSJhY2NvdW50LWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgM2MxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgMy0zLTEuMzQtMy0zIDEuMzQtMyAzLTN6bTAgMTQuMmMtMi41IDAtNC43MS0xLjI4LTYtMy4yMi4wMy0xLjk5IDQtMy4wOCA2LTMuMDggMS45OSAwIDUuOTcgMS4wOSA2IDMuMDgtMS4yOSAxLjk0LTMuNSAzLjIyLTYgMy4yMnoiIC8+PC9nPgo8ZyBpZD0iYWRkIj48cGF0aCBkPSJNMTkgMTNoLTZ2NmgtMnYtNkg1di0yaDZWNWgydjZoNnYyeiIgLz48L2c+CjxnIGlkPSJhZGQtYWxlcnQiPjxwYXRoIGQ9Ik0xMC4wMSAyMS4wMWMwIDEuMS44OSAxLjk5IDEuOTkgMS45OXMxLjk5LS44OSAxLjk5LTEuOTloLTMuOTh6bTguODctNC4xOVYxMWMwLTMuMjUtMi4yNS01Ljk3LTUuMjktNi42OXYtLjcyQzEzLjU5IDIuNzEgMTIuODggMiAxMiAycy0xLjU5LjcxLTEuNTkgMS41OXYuNzJDNy4zNyA1LjAzIDUuMTIgNy43NSA1LjEyIDExdjUuODJMMyAxOC45NFYyMGgxOHYtMS4wNmwtMi4xMi0yLjEyek0xNiAxMy4wMWgtM3YzaC0ydi0zSDhWMTFoM1Y4aDJ2M2gzdjIuMDF6IiAvPjwvZz4KPGcgaWQ9ImFkZC1ib3giPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tMiAxMGgtNHY0aC0ydi00SDd2LTJoNFY3aDJ2NGg0djJ6IiAvPjwvZz4KPGcgaWQ9ImFkZC1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem01IDExaC00djRoLTJ2LTRIN3YtMmg0VjdoMnY0aDR2MnoiIC8+PC9nPgo8ZyBpZD0iYWRkLWNpcmNsZS1vdXRsaW5lIj48cGF0aCBkPSJNMTMgN2gtMnY0SDd2Mmg0djRoMnYtNGg0di0yaC00Vjd6bS0xLTVDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJhZGQtc2hvcHBpbmctY2FydCI+PHBhdGggZD0iTTExIDloMlY2aDNWNGgtM1YxaC0ydjNIOHYyaDN2M3ptLTQgOWMtMS4xIDAtMS45OS45LTEuOTkgMlM1LjkgMjIgNyAyMnMyLS45IDItMi0uOS0yLTItMnptMTAgMGMtMS4xIDAtMS45OS45LTEuOTkgMnMuODkgMiAxLjk5IDIgMi0uOSAyLTItLjktMi0yLTJ6bS05LjgzLTMuMjVsLjAzLS4xMi45LTEuNjNoNy40NWMuNzUgMCAxLjQxLS40MSAxLjc1LTEuMDNsMy44Ni03LjAxTDE5LjQyIDRoLS4wMWwtMS4xIDItMi43NiA1SDguNTNsLS4xMy0uMjdMNi4xNiA2bC0uOTUtMi0uOTQtMkgxdjJoMmwzLjYgNy41OS0xLjM1IDIuNDVjLS4xNi4yOC0uMjUuNjEtLjI1Ljk2IDAgMS4xLjkgMiAyIDJoMTJ2LTJINy40MmMtLjEzIDAtLjI1LS4xMS0uMjUtLjI1eiIgLz48L2c+CjxnIGlkPSJhbGFybSI+PHBhdGggZD0iTTIyIDUuNzJsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek03Ljg4IDMuMzlMNi42IDEuODYgMiA1LjcxbDEuMjkgMS41MyA0LjU5LTMuODV6TTEyLjUgOEgxMXY2bDQuNzUgMi44NS43NS0xLjIzLTQtMi4zN1Y4ek0xMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5YzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0wIDE2Yy0zLjg3IDAtNy0zLjEzLTctN3MzLjEzLTcgNy03IDcgMy4xMyA3IDctMy4xMyA3LTcgN3oiIC8+PC9nPgo8ZyBpZD0iYWxhcm0tYWRkIj48cGF0aCBkPSJNNy44OCAzLjM5TDYuNiAxLjg2IDIgNS43MWwxLjI5IDEuNTMgNC41OS0zLjg1ek0yMiA1LjcybC00LjYtMy44Ni0xLjI5IDEuNTMgNC42IDMuODZMMjIgNS43MnpNMTIgNGMtNC45NyAwLTkgNC4wMy05IDlzNC4wMiA5IDkgOWM0Ljk3IDAgOS00LjAzIDktOXMtNC4wMy05LTktOXptMCAxNmMtMy44NyAwLTctMy4xMy03LTdzMy4xMy03IDctNyA3IDMuMTMgNyA3LTMuMTMgNy03IDd6bTEtMTFoLTJ2M0g4djJoM3YzaDJ2LTNoM3YtMmgtM1Y5eiIgLz48L2c+CjxnIGlkPSJhbGFybS1vZmYiPjxwYXRoIGQ9Ik0xMiA2YzMuODcgMCA3IDMuMTMgNyA3IDAgLjg0LS4xNiAxLjY1LS40MyAyLjRsMS41MiAxLjUyYy41OC0xLjE5LjkxLTIuNTEuOTEtMy45MiAwLTQuOTctNC4wMy05LTktOS0xLjQxIDAtMi43My4zMy0zLjkyLjkxTDkuNiA2LjQzQzEwLjM1IDYuMTYgMTEuMTYgNiAxMiA2em0xMC0uMjhsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek0yLjkyIDIuMjlMMS42NSAzLjU3IDIuOTggNC45bC0xLjExLjkzIDEuNDIgMS40MiAxLjExLS45NC44LjhDMy44MyA4LjY5IDMgMTAuNzUgMyAxM2MwIDQuOTcgNC4wMiA5IDkgOSAyLjI1IDAgNC4zMS0uODMgNS44OS0yLjJsMi4yIDIuMiAxLjI3LTEuMjdMMy44OSAzLjI3bC0uOTctLjk4em0xMy41NSAxNi4xQzE1LjI2IDE5LjM5IDEzLjcgMjAgMTIgMjBjLTMuODcgMC03LTMuMTMtNy03IDAtMS43LjYxLTMuMjYgMS42MS00LjQ3bDkuODYgOS44NnpNOC4wMiAzLjI4TDYuNiAxLjg2bC0uODYuNzEgMS40MiAxLjQyLjg2LS43MXoiIC8+PC9nPgo8ZyBpZD0iYWxhcm0tb24iPjxwYXRoIGQ9Ik0yMiA1LjcybC00LjYtMy44Ni0xLjI5IDEuNTMgNC42IDMuODZMMjIgNS43MnpNNy44OCAzLjM5TDYuNiAxLjg2IDIgNS43MWwxLjI5IDEuNTMgNC41OS0zLjg1ek0xMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5YzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0wIDE2Yy0zLjg3IDAtNy0zLjEzLTctN3MzLjEzLTcgNy03IDcgMy4xMyA3IDctMy4xMyA3LTcgN3ptLTEuNDYtNS40N0w4LjQxIDEyLjRsLTEuMDYgMS4wNiAzLjE4IDMuMTggNi02LTEuMDYtMS4wNi00LjkzIDQuOTV6IiAvPjwvZz4KPGcgaWQ9ImFsbC1vdXQiPjxwYXRoIGQ9Ik0xNi4yMSA0LjE2bDQgNHYtNHptNCAxMmwtNCA0aDR6bS0xMiA0bC00LTR2NHptLTQtMTJsNC00aC00em0xMi45NS0uOTVjLTIuNzMtMi43My03LjE3LTIuNzMtOS45IDBzLTIuNzMgNy4xNyAwIDkuOSA3LjE3IDIuNzMgOS45IDAgMi43My03LjE2IDAtOS45em0tMS4xIDguOGMtMi4xMyAyLjEzLTUuNTcgMi4xMy03LjcgMHMtMi4xMy01LjU3IDAtNy43IDUuNTctMi4xMyA3LjcgMCAyLjEzIDUuNTcgMCA3Ljd6IiAvPjwvZz4KPGcgaWQ9ImFuZHJvaWQiPjxwYXRoIGQ9Ik02IDE4YzAgLjU1LjQ1IDEgMSAxaDF2My41YzAgLjgzLjY3IDEuNSAxLjUgMS41czEuNS0uNjcgMS41LTEuNVYxOWgydjMuNWMwIC44My42NyAxLjUgMS41IDEuNXMxLjUtLjY3IDEuNS0xLjVWMTloMWMuNTUgMCAxLS40NSAxLTFWOEg2djEwek0zLjUgOEMyLjY3IDggMiA4LjY3IDIgOS41djdjMCAuODMuNjcgMS41IDEuNSAxLjVTNSAxNy4zMyA1IDE2LjV2LTdDNSA4LjY3IDQuMzMgOCAzLjUgOHptMTcgMGMtLjgzIDAtMS41LjY3LTEuNSAxLjV2N2MwIC44My42NyAxLjUgMS41IDEuNXMxLjUtLjY3IDEuNS0xLjV2LTdjMC0uODMtLjY3LTEuNS0xLjUtMS41em0tNC45Ny01Ljg0bDEuMy0xLjNjLjItLjIuMi0uNTEgMC0uNzEtLjItLjItLjUxLS4yLS43MSAwbC0xLjQ4IDEuNDhDMTMuODUgMS4yMyAxMi45NSAxIDEyIDFjLS45NiAwLTEuODYuMjMtMi42Ni42M0w3Ljg1LjE1Yy0uMi0uMi0uNTEtLjItLjcxIDAtLjIuMi0uMi41MSAwIC43MWwxLjMxIDEuMzFDNi45NyAzLjI2IDYgNS4wMSA2IDdoMTJjMC0xLjk5LS45Ny0zLjc1LTIuNDctNC44NHpNMTAgNUg5VjRoMXYxem01IDBoLTFWNGgxdjF6IiAvPjwvZz4KPGcgaWQ9ImFubm91bmNlbWVudCI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tNyA5aC0yVjVoMnY2em0wIDRoLTJ2LTJoMnYyeiIgLz48L2c+CjxnIGlkPSJhcHBzIj48cGF0aCBkPSJNNCA4aDRWNEg0djR6bTYgMTJoNHYtNGgtNHY0em0tNiAwaDR2LTRINHY0em0wLTZoNHYtNEg0djR6bTYgMGg0di00aC00djR6bTYtMTB2NGg0VjRoLTR6bS02IDRoNFY0aC00djR6bTYgNmg0di00aC00djR6bTAgNmg0di00aC00djR6IiAvPjwvZz4KPGcgaWQ9ImFyY2hpdmUiPjxwYXRoIGQ9Ik0yMC41NCA1LjIzbC0xLjM5LTEuNjhDMTguODggMy4yMSAxOC40NyAzIDE4IDNINmMtLjQ3IDAtLjg4LjIxLTEuMTYuNTVMMy40NiA1LjIzQzMuMTcgNS41NyAzIDYuMDIgMyA2LjVWMTljMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2LjVjMC0uNDgtLjE3LS45My0uNDYtMS4yN3pNMTIgMTcuNUw2LjUgMTJIMTB2LTJoNHYyaDMuNUwxMiAxNy41ek01LjEyIDVsLjgxLTFoMTJsLjk0IDFINS4xMnoiIC8+PC9nPgo8ZyBpZD0iYXJyb3ctYmFjayI+PHBhdGggZD0iTTIwIDExSDcuODNsNS41OS01LjU5TDEyIDRsLTggOCA4IDggMS40MS0xLjQxTDcuODMgMTNIMjB2LTJ6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWRvd253YXJkIj48cGF0aCBkPSJNMjAgMTJsLTEuNDEtMS40MUwxMyAxNi4xN1Y0aC0ydjEyLjE3bC01LjU4LTUuNTlMNCAxMmw4IDggOC04eiIgLz48L2c+CjxnIGlkPSJhcnJvdy1kcm9wLWRvd24iPjxwYXRoIGQ9Ik03IDEwbDUgNSA1LTV6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWRyb3AtZG93bi1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDEybC00LTRoOGwtNCA0eiIgLz48L2c+CjxnIGlkPSJhcnJvdy1kcm9wLXVwIj48cGF0aCBkPSJNNyAxNGw1LTUgNSA1eiIgLz48L2c+CjxnIGlkPSJhcnJvdy1mb3J3YXJkIj48cGF0aCBkPSJNMTIgNGwtMS40MSAxLjQxTDE2LjE3IDExSDR2MmgxMi4xN2wtNS41OCA1LjU5TDEyIDIwbDgtOHoiIC8+PC9nPgo8ZyBpZD0iYXJyb3ctdXB3YXJkIj48cGF0aCBkPSJNNCAxMmwxLjQxIDEuNDFMMTEgNy44M1YyMGgyVjcuODNsNS41OCA1LjU5TDIwIDEybC04LTgtOCA4eiIgLz48L2c+CjxnIGlkPSJhc3BlY3QtcmF0aW8iPjxwYXRoIGQ9Ik0xOSAxMmgtMnYzaC0zdjJoNXYtNXpNNyA5aDNWN0g1djVoMlY5em0xNC02SDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOTloMTh2MTQuMDJ6IiAvPjwvZz4KPGcgaWQ9ImFzc2Vzc21lbnQiPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNOSAxN0g3di03aDJ2N3ptNCAwaC0yVjdoMnYxMHptNCAwaC0ydi00aDJ2NHoiIC8+PC9nPgo8ZyBpZD0iYXNzaWdubWVudCI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0yIDE0SDd2LTJoN3Yyem0zLTRIN3YtMmgxMHYyem0wLTRIN1Y3aDEwdjJ6IiAvPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtaW5kIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTAgNGMxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgMy0zLTEuMzQtMy0zIDEuMzQtMyAzLTN6bTYgMTJINnYtMS40YzAtMiA0LTMuMSA2LTMuMXM2IDEuMSA2IDMuMVYxOXoiIC8+PC9nPgo8ZyBpZD0iYXNzaWdubWVudC1sYXRlIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNiAxNWgtMnYtMmgydjJ6bTAtNGgtMlY4aDJ2NnptLTEtOWMtLjU1IDAtMS0uNDUtMS0xcy40NS0xIDEtMSAxIC40NSAxIDEtLjQ1IDEtMSAxeiIgLz48L2c+CjxnIGlkPSJhc3NpZ25tZW50LXJldHVybiI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem00IDEyaC00djNsLTUtNSA1LTV2M2g0djR6IiAvPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtcmV0dXJuZWQiPjxwYXRoIGQ9Ik0xOSAzaC00LjE4QzE0LjQgMS44NCAxMy4zIDEgMTIgMWMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMCAxNWwtNS01aDNWOWg0djRoM2wtNSA1eiIgLz48L2c+CjxnIGlkPSJhc3NpZ25tZW50LXR1cm5lZC1pbiI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0tMiAxNGwtNC00IDEuNDEtMS40MUwxMCAxNC4xN2w2LjU5LTYuNTlMMTggOWwtOCA4eiIgLz48L2c+CjxnIGlkPSJhdHRhY2htZW50Ij48cGF0aCBkPSJNMiAxMi41QzIgOS40NiA0LjQ2IDcgNy41IDdIMThjMi4yMSAwIDQgMS43OSA0IDRzLTEuNzkgNC00IDRIOS41QzguMTIgMTUgNyAxMy44OCA3IDEyLjVTOC4xMiAxMCA5LjUgMTBIMTd2Mkg5LjQxYy0uNTUgMC0uNTUgMSAwIDFIMThjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0ySDcuNUM1LjU3IDkgNCAxMC41NyA0IDEyLjVTNS41NyAxNiA3LjUgMTZIMTd2Mkg3LjVDNC40NiAxOCAyIDE1LjU0IDIgMTIuNXoiIC8+PC9nPgo8ZyBpZD0iYXV0b3JlbmV3Ij48cGF0aCBkPSJNMTIgNnYzbDQtNC00LTR2M2MtNC40MiAwLTggMy41OC04IDggMCAxLjU3LjQ2IDMuMDMgMS4yNCA0LjI2TDYuNyAxNC44Yy0uNDUtLjgzLS43LTEuNzktLjctMi44IDAtMy4zMSAyLjY5LTYgNi02em02Ljc2IDEuNzRMMTcuMyA5LjJjLjQ0Ljg0LjcgMS43OS43IDIuOCAwIDMuMzEtMi42OSA2LTYgNnYtM2wtNCA0IDQgNHYtM2M0LjQyIDAgOC0zLjU4IDgtOCAwLTEuNTctLjQ2LTMuMDMtMS4yNC00LjI2eiIgLz48L2c+CjxnIGlkPSJiYWNrc3BhY2UiPjxwYXRoIGQ9Ik0yMiAzSDdjLS42OSAwLTEuMjMuMzUtMS41OS44OEwwIDEybDUuNDEgOC4xMWMuMzYuNTMuOS44OSAxLjU5Ljg5aDE1YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS0zIDEyLjU5TDE3LjU5IDE3IDE0IDEzLjQxIDEwLjQxIDE3IDkgMTUuNTkgMTIuNTkgMTIgOSA4LjQxIDEwLjQxIDcgMTQgMTAuNTkgMTcuNTkgNyAxOSA4LjQxIDE1LjQxIDEyIDE5IDE1LjU5eiIgLz48L2c+CjxnIGlkPSJiYWNrdXAiPjxwYXRoIGQ9Ik0xOS4zNSAxMC4wNEMxOC42NyA2LjU5IDE1LjY0IDQgMTIgNCA5LjExIDQgNi42IDUuNjQgNS4zNSA4LjA0IDIuMzQgOC4zNiAwIDEwLjkxIDAgMTRjMCAzLjMxIDIuNjkgNiA2IDZoMTNjMi43NiAwIDUtMi4yNCA1LTUgMC0yLjY0LTIuMDUtNC43OC00LjY1LTQuOTZ6TTE0IDEzdjRoLTR2LTRIN2w1LTUgNSA1aC0zeiIgLz48L2c+CjxnIGlkPSJibG9jayI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6TTQgMTJjMC00LjQyIDMuNTgtOCA4LTggMS44NSAwIDMuNTUuNjMgNC45IDEuNjlMNS42OSAxNi45QzQuNjMgMTUuNTUgNCAxMy44NSA0IDEyem04IDhjLTEuODUgMC0zLjU1LS42My00LjktMS42OUwxOC4zMSA3LjFDMTkuMzcgOC40NSAyMCAxMC4xNSAyMCAxMmMwIDQuNDItMy41OCA4LTggOHoiIC8+PC9nPgo8ZyBpZD0iYm9vayI+PHBhdGggZD0iTTE4IDJINmMtMS4xIDAtMiAuOS0yIDJ2MTZjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek02IDRoNXY4bC0yLjUtMS41TDYgMTJWNHoiIC8+PC9nPgo8ZyBpZD0iYm9va21hcmsiPjxwYXRoIGQ9Ik0xNyAzSDdjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNSAyMWw3LTMgNyAzVjVjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9ImJvb2ttYXJrLWJvcmRlciI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnptMCAxNWwtNS0yLjE4TDcgMThWNWgxMHYxM3oiIC8+PC9nPgo8ZyBpZD0iYnVnLXJlcG9ydCI+PHBhdGggZD0iTTIwIDhoLTIuODFjLS40NS0uNzgtMS4wNy0xLjQ1LTEuODItMS45NkwxNyA0LjQxIDE1LjU5IDNsLTIuMTcgMi4xN0MxMi45NiA1LjA2IDEyLjQ5IDUgMTIgNWMtLjQ5IDAtLjk2LjA2LTEuNDEuMTdMOC40MSAzIDcgNC40MWwxLjYyIDEuNjNDNy44OCA2LjU1IDcuMjYgNy4yMiA2LjgxIDhINHYyaDIuMDljLS4wNS4zMy0uMDkuNjYtLjA5IDF2MUg0djJoMnYxYzAgLjM0LjA0LjY3LjA5IDFINHYyaDIuODFjMS4wNCAxLjc5IDIuOTcgMyA1LjE5IDNzNC4xNS0xLjIxIDUuMTktM0gyMHYtMmgtMi4wOWMuMDUtLjMzLjA5LS42Ni4wOS0xdi0xaDJ2LTJoLTJ2LTFjMC0uMzQtLjA0LS42Ny0uMDktMUgyMFY4em0tNiA4aC00di0yaDR2MnptMC00aC00di0yaDR2MnoiIC8+PC9nPgo8ZyBpZD0iYnVpbGQiPjxwYXRoIGQ9Ik0yMi43IDE5bC05LjEtOS4xYy45LTIuMy40LTUtMS41LTYuOS0yLTItNS0yLjQtNy40LTEuM0w5IDYgNiA5IDEuNiA0LjdDLjQgNy4xLjkgMTAuMSAyLjkgMTIuMWMxLjkgMS45IDQuNiAyLjQgNi45IDEuNWw5LjEgOS4xYy40LjQgMSAuNCAxLjQgMGwyLjMtMi4zYy41LS40LjUtMS4xLjEtMS40eiIgLz48L2c+CjxnIGlkPSJjYWNoZWQiPjxwYXRoIGQ9Ik0xOSA4bC00IDRoM2MwIDMuMzEtMi42OSA2LTYgNi0xLjAxIDAtMS45Ny0uMjUtMi44LS43bC0xLjQ2IDEuNDZDOC45NyAxOS41NCAxMC40MyAyMCAxMiAyMGM0LjQyIDAgOC0zLjU4IDgtOGgzbC00LTR6TTYgMTJjMC0zLjMxIDIuNjktNiA2LTYgMS4wMSAwIDEuOTcuMjUgMi44LjdsMS40Ni0xLjQ2QzE1LjAzIDQuNDYgMTMuNTcgNCAxMiA0Yy00LjQyIDAtOCAzLjU4LTggOEgxbDQgNCA0LTRINnoiIC8+PC9nPgo8ZyBpZD0iY2FtZXJhLWVuaGFuY2UiPjxwYXRoIGQ9Ik05IDNMNy4xNyA1SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMmgtMy4xN0wxNSAzSDl6bTMgMTVjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1em0wLTFsMS4yNS0yLjc1TDE2IDEzbC0yLjc1LTEuMjVMMTIgOWwtMS4yNSAyLjc1TDggMTNsMi43NSAxLjI1eiIgLz48L2c+CjxnIGlkPSJjYW5jZWwiPjxwYXRoIGQ9Ik0xMiAyQzYuNDcgMiAyIDYuNDcgMiAxMnM0LjQ3IDEwIDEwIDEwIDEwLTQuNDcgMTAtMTBTMTcuNTMgMiAxMiAyem01IDEzLjU5TDE1LjU5IDE3IDEyIDEzLjQxIDguNDEgMTcgNyAxNS41OSAxMC41OSAxMiA3IDguNDEgOC40MSA3IDEyIDEwLjU5IDE1LjU5IDcgMTcgOC40MSAxMy40MSAxMiAxNyAxNS41OXoiIC8+PC9nPgo8ZyBpZD0iY2FyZC1naWZ0Y2FyZCI+PHBhdGggZD0iTTIwIDZoLTIuMThjLjExLS4zMS4xOC0uNjUuMTgtMSAwLTEuNjYtMS4zNC0zLTMtMy0xLjA1IDAtMS45Ni41NC0yLjUgMS4zNWwtLjUuNjctLjUtLjY4QzEwLjk2IDIuNTQgMTAuMDUgMiA5IDIgNy4zNCAyIDYgMy4zNCA2IDVjMCAuMzUuMDcuNjkuMTggMUg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS01LTJjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXpNOSA0Yy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTExIDE1SDR2LTJoMTZ2MnptMC01SDRWOGg1LjA4TDcgMTAuODMgOC42MiAxMiAxMSA4Ljc2bDEtMS4zNiAxIDEuMzZMMTUuMzggMTIgMTcgMTAuODMgMTQuOTIgOEgyMHY2eiIgLz48L2c+CjxnIGlkPSJjYXJkLW1lbWJlcnNoaXAiPjxwYXRoIGQ9Ik0yMCAySDRjLTEuMTEgMC0yIC44OS0yIDJ2MTFjMCAxLjExLjg5IDIgMiAyaDR2NWw0LTIgNCAydi01aDRjMS4xMSAwIDItLjg5IDItMlY0YzAtMS4xMS0uODktMi0yLTJ6bTAgMTNINHYtMmgxNnYyem0wLTVINFY0aDE2djZ6IiAvPjwvZz4KPGcgaWQ9ImNhcmQtdHJhdmVsIj48cGF0aCBkPSJNMjAgNmgtM1Y0YzAtMS4xMS0uODktMi0yLTJIOWMtMS4xMSAwLTIgLjg5LTIgMnYySDRjLTEuMTEgMC0yIC44OS0yIDJ2MTFjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWOGMwLTEuMTEtLjg5LTItMi0yek05IDRoNnYySDlWNHptMTEgMTVINHYtMmgxNnYyem0wLTVINFY4aDN2MmgyVjhoNnYyaDJWOGgzdjZ6IiAvPjwvZz4KPGcgaWQ9ImNoYW5nZS1oaXN0b3J5Ij48cGF0aCBkPSJNMTIgNy43N0wxOC4zOSAxOEg1LjYxTDEyIDcuNzdNMTIgNEwyIDIwaDIwTDEyIDR6IiAvPjwvZz4KPGcgaWQ9ImNoZWNrIj48cGF0aCBkPSJNOSAxNi4xN0w0LjgzIDEybC0xLjQyIDEuNDFMOSAxOSAyMSA3bC0xLjQxLTEuNDF6IiAvPjwvZz4KPGcgaWQ9ImNoZWNrLWJveCI+PHBhdGggZD0iTTE5IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS45IDItMlY1YzAtMS4xLS44OS0yLTItMnptLTkgMTRsLTUtNSAxLjQxLTEuNDFMMTAgMTQuMTdsNy41OS03LjU5TDE5IDhsLTkgOXoiIC8+PC9nPgo8ZyBpZD0iY2hlY2stYm94LW91dGxpbmUtYmxhbmsiPjxwYXRoIGQ9Ik0xOSA1djE0SDVWNWgxNG0wLTJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJjaGVjay1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0tMiAxNWwtNS01IDEuNDEtMS40MUwxMCAxNC4xN2w3LjU5LTcuNTlMMTkgOGwtOSA5eiIgLz48L2c+CjxnIGlkPSJjaGV2cm9uLWxlZnQiPjxwYXRoIGQ9Ik0xNS40MSA3LjQxTDE0IDZsLTYgNiA2IDYgMS40MS0xLjQxTDEwLjgzIDEyeiIgLz48L2c+CjxnIGlkPSJjaGV2cm9uLXJpZ2h0Ij48cGF0aCBkPSJNMTAgNkw4LjU5IDcuNDEgMTMuMTcgMTJsLTQuNTggNC41OUwxMCAxOGw2LTZ6IiAvPjwvZz4KPGcgaWQ9ImNocm9tZS1yZWFkZXItbW9kZSI+PHBhdGggZD0iTTEzIDEyaDd2MS41aC03em0wLTIuNWg3VjExaC03em0wIDVoN1YxNmgtN3pNMjEgNEgzYy0xLjEgMC0yIC45LTIgMnYxM2MwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgMTVoLTlWNmg5djEzeiIgLz48L2c+CjxnIGlkPSJjbGFzcyI+PHBhdGggZD0iTTE4IDJINmMtMS4xIDAtMiAuOS0yIDJ2MTZjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek02IDRoNXY4bC0yLjUtMS41TDYgMTJWNHoiIC8+PC9nPgo8ZyBpZD0iY2xlYXIiPjxwYXRoIGQ9Ik0xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6IiAvPjwvZz4KPGcgaWQ9ImNsb3NlIj48cGF0aCBkPSJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyeiIgLz48L2c+CjxnIGlkPSJjbG91ZCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnoiIC8+PC9nPgo8ZyBpZD0iY2xvdWQtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptNC41IDE0SDhjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTNsLjE0LjAxQzguNTggOC4yOCAxMC4xMyA3IDEyIDdjMi4yMSAwIDQgMS43OSA0IDRoLjVjMS4zOCAwIDIuNSAxLjEyIDIuNSAyLjVTMTcuODggMTYgMTYuNSAxNnoiIC8+PC9nPgo8ZyBpZD0iY2xvdWQtZG9uZSI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTAgMTdsLTMuNS0zLjUgMS40MS0xLjQxTDEwIDE0LjE3IDE1LjE4IDlsMS40MSAxLjQxTDEwIDE3eiIgLz48L2c+CjxnIGlkPSJjbG91ZC1kb3dubG9hZCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTcgMTNsLTUgNS01LTVoM1Y5aDR2NGgzeiIgLz48L2c+CjxnIGlkPSJjbG91ZC1vZmYiPjxwYXRoIGQ9Ik0xOS4zNSAxMC4wNEMxOC42NyA2LjU5IDE1LjY0IDQgMTIgNGMtMS40OCAwLTIuODUuNDMtNC4wMSAxLjE3bDEuNDYgMS40NkMxMC4yMSA2LjIzIDExLjA4IDYgMTIgNmMzLjA0IDAgNS41IDIuNDYgNS41IDUuNXYuNUgxOWMxLjY2IDAgMyAxLjM0IDMgMyAwIDEuMTMtLjY0IDIuMTEtMS41NiAyLjYybDEuNDUgMS40NUMyMy4xNiAxOC4xNiAyNCAxNi42OCAyNCAxNWMwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMyA1LjI3bDIuNzUgMi43NEMyLjU2IDguMTUgMCAxMC43NyAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDExLjczbDIgMkwyMSAyMC43MyA0LjI3IDQgMyA1LjI3ek03LjczIDEwbDggOEg2Yy0yLjIxIDAtNC0xLjc5LTQtNHMxLjc5LTQgNC00aDEuNzN6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkLXF1ZXVlIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xOSAxOEg2Yy0yLjIxIDAtNC0xLjc5LTQtNHMxLjc5LTQgNC00aC43MUM3LjM3IDcuNjkgOS40OCA2IDEyIDZjMy4wNCAwIDUuNSAyLjQ2IDUuNSA1LjV2LjVIMTljMS42NiAwIDMgMS4zNCAzIDNzLTEuMzQgMy0zIDN6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkLXVwbG9hZCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTQgMTN2NGgtNHYtNEg3bDUtNSA1IDVoLTN6IiAvPjwvZz4KPGcgaWQ9ImNvZGUiPjxwYXRoIGQ9Ik05LjQgMTYuNkw0LjggMTJsNC42LTQuNkw4IDZsLTYgNiA2IDYgMS40LTEuNHptNS4yIDBsNC42LTQuNi00LjYtNC42TDE2IDZsNiA2LTYgNi0xLjQtMS40eiIgLz48L2c+CjxnIGlkPSJjb21wYXJlLWFycm93cyI+PHBhdGggZD0iTTkuMDEgMTRIMnYyaDcuMDF2M0wxMyAxNWwtMy45OS00djN6bTUuOTgtMXYtM0gyMlY4aC03LjAxVjVMMTEgOWwzLjk5IDR6IiAvPjwvZz4KPGcgaWQ9ImNvbnRlbnQtY29weSI+PHBhdGggZD0iTTE2IDFINGMtMS4xIDAtMiAuOS0yIDJ2MTRoMlYzaDEyVjF6bTMgNEg4Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDExYzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6bTAgMTZIOFY3aDExdjE0eiIgLz48L2c+CjxnIGlkPSJjb250ZW50LWN1dCI+PHBhdGggZD0iTTkuNjQgNy42NGMuMjMtLjUuMzYtMS4wNS4zNi0xLjY0IDAtMi4yMS0xLjc5LTQtNC00UzIgMy43OSAyIDZzMS43OSA0IDQgNGMuNTkgMCAxLjE0LS4xMyAxLjY0LS4zNkwxMCAxMmwtMi4zNiAyLjM2QzcuMTQgMTQuMTMgNi41OSAxNCA2IDE0Yy0yLjIxIDAtNCAxLjc5LTQgNHMxLjc5IDQgNCA0IDQtMS43OSA0LTRjMC0uNTktLjEzLTEuMTQtLjM2LTEuNjRMMTIgMTRsNyA3aDN2LTFMOS42NCA3LjY0ek02IDhjLTEuMSAwLTItLjg5LTItMnMuOS0yIDItMiAyIC44OSAyIDItLjkgMi0yIDJ6bTAgMTJjLTEuMSAwLTItLjg5LTItMnMuOS0yIDItMiAyIC44OSAyIDItLjkgMi0yIDJ6bTYtNy41Yy0uMjggMC0uNS0uMjItLjUtLjVzLjIyLS41LjUtLjUuNS4yMi41LjUtLjIyLjUtLjUuNXpNMTkgM2wtNiA2IDIgMiA3LTdWM3oiIC8+PC9nPgo8ZyBpZD0iY29udGVudC1wYXN0ZSI+PHBhdGggZD0iTTE5IDJoLTQuMThDMTQuNC44NCAxMy4zIDAgMTIgMGMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptNyAxOEg1VjRoMnYzaDEwVjRoMnYxNnoiIC8+PC9nPgo8ZyBpZD0iY29weXJpZ2h0Ij48cGF0aCBkPSJNMTAuMDggMTAuODZjLjA1LS4zMy4xNi0uNjIuMy0uODdzLjM0LS40Ni41OS0uNjJjLjI0LS4xNS41NC0uMjIuOTEtLjIzLjIzLjAxLjQ0LjA1LjYzLjEzLjIuMDkuMzguMjEuNTIuMzZzLjI1LjMzLjM0LjUzLjEzLjQyLjE0LjY0aDEuNzljLS4wMi0uNDctLjExLS45LS4yOC0xLjI5cy0uNC0uNzMtLjctMS4wMS0uNjYtLjUtMS4wOC0uNjYtLjg4LS4yMy0xLjM5LS4yM2MtLjY1IDAtMS4yMi4xMS0xLjcuMzRzLS44OC41My0xLjIuOTItLjU2Ljg0LS43MSAxLjM2UzggMTEuMjkgOCAxMS44N3YuMjdjMCAuNTguMDggMS4xMi4yMyAxLjY0cy4zOS45Ny43MSAxLjM1LjcyLjY5IDEuMi45MSAxLjA1LjM0IDEuNy4zNGMuNDcgMCAuOTEtLjA4IDEuMzItLjIzcy43Ny0uMzYgMS4wOC0uNjMuNTYtLjU4Ljc0LS45NC4yOS0uNzQuMy0xLjE1aC0xLjc5Yy0uMDEuMjEtLjA2LjQtLjE1LjU4cy0uMjEuMzMtLjM2LjQ2LS4zMi4yMy0uNTIuM2MtLjE5LjA3LS4zOS4wOS0uNi4xLS4zNi0uMDEtLjY2LS4wOC0uODktLjIzLS4yNS0uMTYtLjQ1LS4zNy0uNTktLjYycy0uMjUtLjU1LS4zLS44OC0uMDgtLjY3LS4wOC0xdi0uMjdjMC0uMzUuMDMtLjY4LjA4LTEuMDF6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJjcmVhdGUiPjxwYXRoIGQ9Ik0zIDE3LjI1VjIxaDMuNzVMMTcuODEgOS45NGwtMy43NS0zLjc1TDMgMTcuMjV6TTIwLjcxIDcuMDRjLjM5LS4zOS4zOS0xLjAyIDAtMS40MWwtMi4zNC0yLjM0Yy0uMzktLjM5LTEuMDItLjM5LTEuNDEgMGwtMS44MyAxLjgzIDMuNzUgMy43NSAxLjgzLTEuODN6IiAvPjwvZz4KPGcgaWQ9ImNyZWF0ZS1uZXctZm9sZGVyIj48cGF0aCBkPSJNMjAgNmgtOGwtMi0ySDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE4YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjhjMC0xLjExLS44OS0yLTItMnptLTEgOGgtM3YzaC0ydi0zaC0zdi0yaDNWOWgydjNoM3YyeiIgLz48L2c+CjxnIGlkPSJjcmVkaXQtY2FyZCI+PHBhdGggZD0iTTIwIDRINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMThjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWNmMwLTEuMTEtLjg5LTItMi0yem0wIDE0SDR2LTZoMTZ2NnptMC0xMEg0VjZoMTZ2MnoiIC8+PC9nPgo8ZyBpZD0iZGFzaGJvYXJkIj48cGF0aCBkPSJNMyAxM2g4VjNIM3YxMHptMCA4aDh2LTZIM3Y2em0xMCAwaDhWMTFoLTh2MTB6bTAtMTh2Nmg4VjNoLTh6IiAvPjwvZz4KPGcgaWQ9ImRhdGUtcmFuZ2UiPjxwYXRoIGQ9Ik05IDExSDd2Mmgydi0yem00IDBoLTJ2Mmgydi0yem00IDBoLTJ2Mmgydi0yem0yLTdoLTFWMmgtMnYySDhWMkg2djJINWMtMS4xMSAwLTEuOTkuOS0xLjk5IDJMMyAyMGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDE2SDVWOWgxNHYxMXoiIC8+PC9nPgo8ZyBpZD0iZGVsZXRlIj48cGF0aCBkPSJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyek0xOSA0aC0zLjVsLTEtMWgtNWwtMSAxSDV2MmgxNFY0eiIgLz48L2c+CjxnIGlkPSJkZWxldGUtZm9yZXZlciI+PHBhdGggZD0iTTYgMTljMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjdINnYxMnptMi40Ni03LjEybDEuNDEtMS40MUwxMiAxMi41OWwyLjEyLTIuMTIgMS40MSAxLjQxTDEzLjQxIDE0bDIuMTIgMi4xMi0xLjQxIDEuNDFMMTIgMTUuNDFsLTIuMTIgMi4xMi0xLjQxLTEuNDFMMTAuNTkgMTRsLTIuMTMtMi4xMnpNMTUuNSA0bC0xLTFoLTVsLTEgMUg1djJoMTRWNHoiIC8+PC9nPgo8ZyBpZD0iZGVsZXRlLXN3ZWVwIj48cGF0aCBkPSJNMTUgMTZoNHYyaC00em0wLThoN3YyaC03em0wIDRoNnYyaC02ek0zIDE4YzAgMS4xLjkgMiAyIDJoNmMxLjEgMCAyLS45IDItMlY4SDN2MTB6TTE0IDVoLTNsLTEtMUg2TDUgNUgydjJoMTJ6IiAvPjwvZz4KPGcgaWQ9ImRlc2NyaXB0aW9uIj48cGF0aCBkPSJNMTQgMkg2Yy0xLjEgMC0xLjk5LjktMS45OSAyTDQgMjBjMCAxLjEuODkgMiAxLjk5IDJIMThjMS4xIDAgMi0uOSAyLTJWOGwtNi02em0yIDE2SDh2LTJoOHYyem0wLTRIOHYtMmg4djJ6bS0zLTVWMy41TDE4LjUgOUgxM3oiIC8+PC9nPgo8ZyBpZD0iZG5zIj48cGF0aCBkPSJNMjAgMTNINGMtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTZjLjU1IDAgMS0uNDUgMS0xdi02YzAtLjU1LS40NS0xLTEtMXpNNyAxOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6TTIwIDNINGMtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTZjLjU1IDAgMS0uNDUgMS0xVjRjMC0uNTUtLjQ1LTEtMS0xek03IDljLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyeiIgLz48L2c+CjxnIGlkPSJkb25lIj48cGF0aCBkPSJNOSAxNi4yTDQuOCAxMmwtMS40IDEuNEw5IDE5IDIxIDdsLTEuNC0xLjRMOSAxNi4yeiIgLz48L2c+CjxnIGlkPSJkb25lLWFsbCI+PHBhdGggZD0iTTE4IDdsLTEuNDEtMS40MS02LjM0IDYuMzQgMS40MSAxLjQxTDE4IDd6bTQuMjQtMS40MUwxMS42NiAxNi4xNyA3LjQ4IDEybC0xLjQxIDEuNDFMMTEuNjYgMTlsMTItMTItMS40Mi0xLjQxek0uNDEgMTMuNDFMNiAxOWwxLjQxLTEuNDFMMS44MyAxMiAuNDEgMTMuNDF6IiAvPjwvZz4KPGcgaWQ9ImRvbnV0LWxhcmdlIj48cGF0aCBkPSJNMTEgNS4wOFYyYy01IC41LTkgNC44MS05IDEwczQgOS41IDkgMTB2LTMuMDhjLTMtLjQ4LTYtMy40LTYtNi45MnMzLTYuNDQgNi02Ljkyek0xOC45NyAxMUgyMmMtLjQ3LTUtNC04LjUzLTktOXYzLjA4QzE2IDUuNTEgMTguNTQgOCAxOC45NyAxMXpNMTMgMTguOTJWMjJjNS0uNDcgOC41My00IDktOWgtMy4wM2MtLjQzIDMtMi45NyA1LjQ5LTUuOTcgNS45MnoiIC8+PC9nPgo8ZyBpZD0iZG9udXQtc21hbGwiPjxwYXRoIGQ9Ik0xMSA5LjE2VjJjLTUgLjUtOSA0Ljc5LTkgMTBzNCA5LjUgOSAxMHYtNy4xNmMtMS0uNDEtMi0xLjUyLTItMi44NHMxLTIuNDMgMi0yLjg0ek0xNC44NiAxMUgyMmMtLjQ4LTQuNzUtNC04LjUzLTktOXY3LjE2YzEgLjMgMS41Mi45OCAxLjg2IDEuODR6TTEzIDE0Ljg0VjIyYzUtLjQ3IDguNTItNC4yNSA5LTloLTcuMTRjLS4zNC44Ni0uODYgMS41NC0xLjg2IDEuODR6IiAvPjwvZz4KPGcgaWQ9ImRyYWZ0cyI+PHBhdGggZD0iTTIxLjk5IDhjMC0uNzItLjM3LTEuMzUtLjk0LTEuN0wxMiAxIDIuOTUgNi4zQzIuMzggNi42NSAyIDcuMjggMiA4djEwYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJsLS4wMS0xMHpNMTIgMTNMMy43NCA3Ljg0IDEyIDNsOC4yNiA0Ljg0TDEyIDEzeiIgLz48L2c+CjxnIGlkPSJlamVjdCI+PHBhdGggZD0iTTUgMTdoMTR2Mkg1em03LTEyTDUuMzMgMTVoMTMuMzR6IiAvPjwvZz4KPGcgaWQ9ImVycm9yIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMSAxNWgtMnYtMmgydjJ6bTAtNGgtMlY3aDJ2NnoiIC8+PC9nPgo8ZyBpZD0iZXJyb3Itb3V0bGluZSI+PHBhdGggZD0iTTExIDE1aDJ2MmgtMnptMC04aDJ2NmgtMnptLjk5LTVDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6TTEyIDIwYy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiIC8+PC9nPgo8ZyBpZD0iZXVyby1zeW1ib2wiPjxwYXRoIGQ9Ik0xNSAxOC41Yy0yLjUxIDAtNC42OC0xLjQyLTUuNzYtMy41SDE1di0ySDguNThjLS4wNS0uMzMtLjA4LS42Ni0uMDgtMXMuMDMtLjY3LjA4LTFIMTVWOUg5LjI0QzEwLjMyIDYuOTIgMTIuNSA1LjUgMTUgNS41YzEuNjEgMCAzLjA5LjU5IDQuMjMgMS41N0wyMSA1LjNDMTkuNDEgMy44NyAxNy4zIDMgMTUgM2MtMy45MiAwLTcuMjQgMi41MS04LjQ4IDZIM3YyaDMuMDZjLS4wNC4zMy0uMDYuNjYtLjA2IDEgMCAuMzQuMDIuNjcuMDYgMUgzdjJoMy41MmMxLjI0IDMuNDkgNC41NiA2IDguNDggNiAyLjMxIDAgNC40MS0uODcgNi0yLjNsLTEuNzgtMS43N2MtMS4xMy45OC0yLjYgMS41Ny00LjIyIDEuNTd6IiAvPjwvZz4KPGcgaWQ9ImV2ZW50Ij48cGF0aCBkPSJNMTcgMTJoLTV2NWg1di01ek0xNiAxdjJIOFYxSDZ2Mkg1Yy0xLjExIDAtMS45OS45LTEuOTkgMkwzIDE5YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJoLTFWMWgtMnptMyAxOEg1VjhoMTR2MTF6IiAvPjwvZz4KPGcgaWQ9ImV2ZW50LXNlYXQiPjxwYXRoIGQ9Ik00IDE4djNoM3YtM2gxMHYzaDN2LTZINHptMTUtOGgzdjNoLTN6TTIgMTBoM3YzSDJ6bTE1IDNIN1Y1YzAtMS4xLjktMiAyLTJoNmMxLjEgMCAyIC45IDIgMnY4eiIgLz48L2c+CjxnIGlkPSJleGl0LXRvLWFwcCI+PHBhdGggZD0iTTEwLjA5IDE1LjU5TDExLjUgMTdsNS01LTUtNS0xLjQxIDEuNDFMMTIuNjcgMTFIM3YyaDkuNjdsLTIuNTggMi41OXpNMTkgM0g1Yy0xLjExIDAtMiAuOS0yIDJ2NGgyVjVoMTR2MTRINXYtNEgzdjRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0iZXhwYW5kLWxlc3MiPjxwYXRoIGQ9Ik0xMiA4bC02IDYgMS40MSAxLjQxTDEyIDEwLjgzbDQuNTkgNC41OEwxOCAxNHoiIC8+PC9nPgo8ZyBpZD0iZXhwYW5kLW1vcmUiPjxwYXRoIGQ9Ik0xNi41OSA4LjU5TDEyIDEzLjE3IDcuNDEgOC41OSA2IDEwbDYgNiA2LTZ6IiAvPjwvZz4KPGcgaWQ9ImV4cGxvcmUiPjxwYXRoIGQ9Ik0xMiAxMC45Yy0uNjEgMC0xLjEuNDktMS4xIDEuMXMuNDkgMS4xIDEuMSAxLjFjLjYxIDAgMS4xLS40OSAxLjEtMS4xcy0uNDktMS4xLTEuMS0xLjF6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTIuMTkgMTIuMTlMNiAxOGwzLjgxLTguMTlMMTggNmwtMy44MSA4LjE5eiIgLz48L2c+CjxnIGlkPSJleHRlbnNpb24iPjxwYXRoIGQ9Ik0yMC41IDExSDE5VjdjMC0xLjEtLjktMi0yLTJoLTRWMy41QzEzIDIuMTIgMTEuODggMSAxMC41IDFTOCAyLjEyIDggMy41VjVINGMtMS4xIDAtMS45OS45LTEuOTkgMnYzLjhIMy41YzEuNDkgMCAyLjcgMS4yMSAyLjcgMi43cy0xLjIxIDIuNy0yLjcgMi43SDJWMjBjMCAxLjEuOSAyIDIgMmgzLjh2LTEuNWMwLTEuNDkgMS4yMS0yLjcgMi43LTIuNyAxLjQ5IDAgMi43IDEuMjEgMi43IDIuN1YyMkgxN2MxLjEgMCAyLS45IDItMnYtNGgxLjVjMS4zOCAwIDIuNS0xLjEyIDIuNS0yLjVTMjEuODggMTEgMjAuNSAxMXoiIC8+PC9nPgo8ZyBpZD0iZmFjZSI+PHBhdGggZD0iTTkgMTEuNzVjLS42OSAwLTEuMjUuNTYtMS4yNSAxLjI1cy41NiAxLjI1IDEuMjUgMS4yNSAxLjI1LS41NiAxLjI1LTEuMjUtLjU2LTEuMjUtMS4yNS0xLjI1em02IDBjLS42OSAwLTEuMjUuNTYtMS4yNSAxLjI1cy41NiAxLjI1IDEuMjUgMS4yNSAxLjI1LS41NiAxLjI1LTEuMjUtLjU2LTEuMjUtMS4yNS0xLjI1ek0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOCAwLS4yOS4wMi0uNTguMDUtLjg2IDIuMzYtMS4wNSA0LjIzLTIuOTggNS4yMS01LjM3QzExLjA3IDguMzMgMTQuMDUgMTAgMTcuNDIgMTBjLjc4IDAgMS41My0uMDkgMi4yNS0uMjYuMjEuNzEuMzMgMS40Ny4zMyAyLjI2IDAgNC40MS0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJmYXZvcml0ZSI+PHBhdGggZD0iTTEyIDIxLjM1bC0xLjQ1LTEuMzJDNS40IDE1LjM2IDIgMTIuMjggMiA4LjUgMiA1LjQyIDQuNDIgMyA3LjUgM2MxLjc0IDAgMy40MS44MSA0LjUgMi4wOUMxMy4wOSAzLjgxIDE0Ljc2IDMgMTYuNSAzIDE5LjU4IDMgMjIgNS40MiAyMiA4LjVjMCAzLjc4LTMuNCA2Ljg2LTguNTUgMTEuNTRMMTIgMjEuMzV6IiAvPjwvZz4KPGcgaWQ9ImZhdm9yaXRlLWJvcmRlciI+PHBhdGggZD0iTTE2LjUgM2MtMS43NCAwLTMuNDEuODEtNC41IDIuMDlDMTAuOTEgMy44MSA5LjI0IDMgNy41IDMgNC40MiAzIDIgNS40MiAyIDguNWMwIDMuNzggMy40IDYuODYgOC41NSAxMS41NEwxMiAyMS4zNWwxLjQ1LTEuMzJDMTguNiAxNS4zNiAyMiAxMi4yOCAyMiA4LjUgMjIgNS40MiAxOS41OCAzIDE2LjUgM3ptLTQuNCAxNS41NWwtLjEuMS0uMS0uMUM3LjE0IDE0LjI0IDQgMTEuMzkgNCA4LjUgNCA2LjUgNS41IDUgNy41IDVjMS41NCAwIDMuMDQuOTkgMy41NyAyLjM2aDEuODdDMTMuNDYgNS45OSAxNC45NiA1IDE2LjUgNWMyIDAgMy41IDEuNSAzLjUgMy41IDAgMi44OS0zLjE0IDUuNzQtNy45IDEwLjA1eiIgLz48L2c+CjxnIGlkPSJmZWVkYmFjayI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tNyAxMmgtMnYtMmgydjJ6bTAtNGgtMlY2aDJ2NHoiIC8+PC9nPgo8ZyBpZD0iZmlsZS1kb3dubG9hZCI+PHBhdGggZD0iTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXoiIC8+PC9nPgo8ZyBpZD0iZmlsZS11cGxvYWQiPjxwYXRoIGQ9Ik05IDE2aDZ2LTZoNGwtNy03LTcgN2g0em0tNCAyaDE0djJINXoiIC8+PC9nPgo8ZyBpZD0iZmlsdGVyLWxpc3QiPjxwYXRoIGQ9Ik0xMCAxOGg0di0yaC00djJ6TTMgNnYyaDE4VjZIM3ptMyA3aDEydi0ySDZ2MnoiIC8+PC9nPgo8ZyBpZD0iZmluZC1pbi1wYWdlIj48cGF0aCBkPSJNMjAgMTkuNTlWOGwtNi02SDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAyMGMwIDEuMS44OSAyIDEuOTkgMkgxOGMuNDUgMCAuODUtLjE1IDEuMTktLjRsLTQuNDMtNC40M2MtLjguNTItMS43NC44My0yLjc2LjgzLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNWMwIDEuMDItLjMxIDEuOTYtLjgzIDIuNzVMMjAgMTkuNTl6TTkgMTNjMCAxLjY2IDEuMzQgMyAzIDNzMy0xLjM0IDMtMy0xLjM0LTMtMy0zLTMgMS4zNC0zIDN6IiAvPjwvZz4KPGcgaWQ9ImZpbmQtcmVwbGFjZSI+PHBhdGggZD0iTTExIDZjMS4zOCAwIDIuNjMuNTYgMy41NCAxLjQ2TDEyIDEwaDZWNGwtMi4wNSAyLjA1QzE0LjY4IDQuNzggMTIuOTMgNCAxMSA0Yy0zLjUzIDAtNi40MyAyLjYxLTYuOTIgNkg2LjFjLjQ2LTIuMjggMi40OC00IDQuOS00em01LjY0IDkuMTRjLjY2LS45IDEuMTItMS45NyAxLjI4LTMuMTRIMTUuOWMtLjQ2IDIuMjgtMi40OCA0LTQuOSA0LTEuMzggMC0yLjYzLS41Ni0zLjU0LTEuNDZMMTAgMTJINHY2bDIuMDUtMi4wNUM3LjMyIDE3LjIyIDkuMDcgMTggMTEgMThjMS41NSAwIDIuOTgtLjUxIDQuMTQtMS4zNkwyMCAyMS40OSAyMS40OSAyMGwtNC44NS00Ljg2eiIgLz48L2c+CjxnIGlkPSJmaW5nZXJwcmludCI+PHBhdGggZD0iTTE3LjgxIDQuNDdjLS4wOCAwLS4xNi0uMDItLjIzLS4wNkMxNS42NiAzLjQyIDE0IDMgMTIuMDEgM2MtMS45OCAwLTMuODYuNDctNS41NyAxLjQxLS4yNC4xMy0uNTQuMDQtLjY4LS4yLS4xMy0uMjQtLjA0LS41NS4yLS42OEM3LjgyIDIuNTIgOS44NiAyIDEyLjAxIDJjMi4xMyAwIDMuOTkuNDcgNi4wMyAxLjUyLjI1LjEzLjM0LjQzLjIxLjY3LS4wOS4xOC0uMjYuMjgtLjQ0LjI4ek0zLjUgOS43MmMtLjEgMC0uMi0uMDMtLjI5LS4wOS0uMjMtLjE2LS4yOC0uNDctLjEyLS43Ljk5LTEuNCAyLjI1LTIuNSAzLjc1LTMuMjdDOS45OCA0LjA0IDE0IDQuMDMgMTcuMTUgNS42NWMxLjUuNzcgMi43NiAxLjg2IDMuNzUgMy4yNS4xNi4yMi4xMS41NC0uMTIuNy0uMjMuMTYtLjU0LjExLS43LS4xMi0uOS0xLjI2LTIuMDQtMi4yNS0zLjM5LTIuOTQtMi44Ny0xLjQ3LTYuNTQtMS40Ny05LjQuMDEtMS4zNi43LTIuNSAxLjctMy40IDIuOTYtLjA4LjE0LS4yMy4yMS0uMzkuMjF6bTYuMjUgMTIuMDdjLS4xMyAwLS4yNi0uMDUtLjM1LS4xNS0uODctLjg3LTEuMzQtMS40My0yLjAxLTIuNjQtLjY5LTEuMjMtMS4wNS0yLjczLTEuMDUtNC4zNCAwLTIuOTcgMi41NC01LjM5IDUuNjYtNS4zOXM1LjY2IDIuNDIgNS42NiA1LjM5YzAgLjI4LS4yMi41LS41LjVzLS41LS4yMi0uNS0uNWMwLTIuNDItMi4wOS00LjM5LTQuNjYtNC4zOS0yLjU3IDAtNC42NiAxLjk3LTQuNjYgNC4zOSAwIDEuNDQuMzIgMi43Ny45MyAzLjg1LjY0IDEuMTUgMS4wOCAxLjY0IDEuODUgMi40Mi4xOS4yLjE5LjUxIDAgLjcxLS4xMS4xLS4yNC4xNS0uMzcuMTV6bTcuMTctMS44NWMtMS4xOSAwLTIuMjQtLjMtMy4xLS44OS0xLjQ5LTEuMDEtMi4zOC0yLjY1LTIuMzgtNC4zOSAwLS4yOC4yMi0uNS41LS41cy41LjIyLjUuNWMwIDEuNDEuNzIgMi43NCAxLjk0IDMuNTYuNzEuNDggMS41NC43MSAyLjU0LjcxLjI0IDAgLjY0LS4wMyAxLjA0LS4xLjI3LS4wNS41My4xMy41OC40MS4wNS4yNy0uMTMuNTMtLjQxLjU4LS41Ny4xMS0xLjA3LjEyLTEuMjEuMTJ6TTE0LjkxIDIyYy0uMDQgMC0uMDktLjAxLS4xMy0uMDItMS41OS0uNDQtMi42My0xLjAzLTMuNzItMi4xLTEuNC0xLjM5LTIuMTctMy4yNC0yLjE3LTUuMjIgMC0xLjYyIDEuMzgtMi45NCAzLjA4LTIuOTQgMS43IDAgMy4wOCAxLjMyIDMuMDggMi45NCAwIDEuMDcuOTMgMS45NCAyLjA4IDEuOTRzMi4wOC0uODcgMi4wOC0xLjk0YzAtMy43Ny0zLjI1LTYuODMtNy4yNS02LjgzLTIuODQgMC01LjQ0IDEuNTgtNi42MSA0LjAzLS4zOS44MS0uNTkgMS43Ni0uNTkgMi44IDAgLjc4LjA3IDIuMDEuNjcgMy42MS4xLjI2LS4wMy41NS0uMjkuNjQtLjI2LjEtLjU1LS4wNC0uNjQtLjI5LS40OS0xLjMxLS43My0yLjYxLS43My0zLjk2IDAtMS4yLjIzLTIuMjkuNjgtMy4yNCAxLjMzLTIuNzkgNC4yOC00LjYgNy41MS00LjYgNC41NSAwIDguMjUgMy41MSA4LjI1IDcuODMgMCAxLjYyLTEuMzggMi45NC0zLjA4IDIuOTRzLTMuMDgtMS4zMi0zLjA4LTIuOTRjMC0xLjA3LS45My0xLjk0LTIuMDgtMS45NHMtMi4wOC44Ny0yLjA4IDEuOTRjMCAxLjcxLjY2IDMuMzEgMS44NyA0LjUxLjk1Ljk0IDEuODYgMS40NiAzLjI3IDEuODUuMjcuMDcuNDIuMzUuMzUuNjEtLjA1LjIzLS4yNi4zOC0uNDcuMzh6IiAvPjwvZz4KPGcgaWQ9ImZpcnN0LXBhZ2UiPjxwYXRoIGQ9Ik0xOC40MSAxNi41OUwxMy44MiAxMmw0LjU5LTQuNTlMMTcgNmwtNiA2IDYgNnpNNiA2aDJ2MTJINnoiIC8+PC9nPgo8ZyBpZD0iZmxhZyI+PHBhdGggZD0iTTE0LjQgNkwxNCA0SDV2MTdoMnYtN2g1LjZsLjQgMmg3VjZ6IiAvPjwvZz4KPGcgaWQ9ImZsaWdodC1sYW5kIj48cGF0aCBkPSJNMi41IDE5aDE5djJoLTE5em03LjE4LTUuNzNsNC4zNSAxLjE2IDUuMzEgMS40MmMuOC4yMSAxLjYyLS4yNiAxLjg0LTEuMDYuMjEtLjgtLjI2LTEuNjItMS4wNi0xLjg0bC01LjMxLTEuNDItMi43Ni05LjAyTDEwLjEyIDJ2OC4yOEw1LjE1IDguOTVsLS45My0yLjMyLTEuNDUtLjM5djUuMTdsMS42LjQzIDUuMzEgMS40M3oiIC8+PC9nPgo8ZyBpZD0iZmxpZ2h0LXRha2VvZmYiPjxwYXRoIGQ9Ik0yLjUgMTloMTl2MmgtMTl6bTE5LjU3LTkuMzZjLS4yMS0uOC0xLjA0LTEuMjgtMS44NC0xLjA2TDE0LjkyIDEwbC02LjktNi40My0xLjkzLjUxIDQuMTQgNy4xNy00Ljk3IDEuMzMtMS45Ny0xLjU0LTEuNDUuMzkgMS44MiAzLjE2Ljc3IDEuMzMgMS42LS40MyA1LjMxLTEuNDIgNC4zNS0xLjE2TDIxIDExLjQ5Yy44MS0uMjMgMS4yOC0xLjA1IDEuMDctMS44NXoiIC8+PC9nPgo8ZyBpZD0iZmxpcC10by1iYWNrIj48cGF0aCBkPSJNOSA3SDd2MmgyVjd6bTAgNEg3djJoMnYtMnptMC04Yy0xLjExIDAtMiAuOS0yIDJoMlYzem00IDEyaC0ydjJoMnYtMnptNi0xMnYyaDJjMC0xLjEtLjktMi0yLTJ6bS02IDBoLTJ2MmgyVjN6TTkgMTd2LTJIN2MwIDEuMS44OSAyIDIgMnptMTAtNGgydi0yaC0ydjJ6bTAtNGgyVjdoLTJ2MnptMCA4YzEuMSAwIDItLjkgMi0yaC0ydjJ6TTUgN0gzdjEyYzAgMS4xLjg5IDIgMiAyaDEydi0ySDVWN3ptMTAtMmgyVjNoLTJ2MnptMCAxMmgydi0yaC0ydjJ6IiAvPjwvZz4KPGcgaWQ9ImZsaXAtdG8tZnJvbnQiPjxwYXRoIGQ9Ik0zIDEzaDJ2LTJIM3Yyem0wIDRoMnYtMkgzdjJ6bTIgNHYtMkgzYzAgMS4xLjg5IDIgMiAyek0zIDloMlY3SDN2MnptMTIgMTJoMnYtMmgtMnYyem00LTE4SDljLTEuMTEgMC0yIC45LTIgMnYxMGMwIDEuMS44OSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDEySDlWNWgxMHYxMHptLTggNmgydi0yaC0ydjJ6bS00IDBoMnYtMkg3djJ6IiAvPjwvZz4KPGcgaWQ9ImZvbGRlciI+PHBhdGggZD0iTTEwIDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWOGMwLTEuMS0uOS0yLTItMmgtOGwtMi0yeiIgLz48L2c+CjxnIGlkPSJmb2xkZXItb3BlbiI+PHBhdGggZD0iTTIwIDZoLThsLTItMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yem0wIDEySDRWOGgxNnYxMHoiIC8+PC9nPgo8ZyBpZD0iZm9sZGVyLXNoYXJlZCI+PHBhdGggZD0iTTIwIDZoLThsLTItMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yem0tNSAzYzEuMSAwIDIgLjkgMiAycy0uOSAyLTIgMi0yLS45LTItMiAuOS0yIDItMnptNCA4aC04di0xYzAtMS4zMyAyLjY3LTIgNC0yczQgLjY3IDQgMnYxeiIgLz48L2c+CjxnIGlkPSJmb250LWRvd25sb2FkIj48cGF0aCBkPSJNOS45MyAxMy41aDQuMTRMMTIgNy45OHpNMjAgMkg0Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS00LjA1IDE2LjVsLTEuMTQtM0g5LjE3bC0xLjEyIDNINS45Nmw1LjExLTEzaDEuODZsNS4xMSAxM2gtMi4wOXoiIC8+PC9nPgo8ZyBpZD0iZm9yd2FyZCI+PHBhdGggZD0iTTEyIDhWNGw4IDgtOCA4di00SDRWOHoiIC8+PC9nPgo8ZyBpZD0iZnVsbHNjcmVlbiI+PHBhdGggZD0iTTcgMTRINXY1aDV2LTJIN3YtM3ptLTItNGgyVjdoM1Y1SDV2NXptMTIgN2gtM3YyaDV2LTVoLTJ2M3pNMTQgNXYyaDN2M2gyVjVoLTV6IiAvPjwvZz4KPGcgaWQ9ImZ1bGxzY3JlZW4tZXhpdCI+PHBhdGggZD0iTTUgMTZoM3YzaDJ2LTVINXYyem0zLThINXYyaDVWNUg4djN6bTYgMTFoMnYtM2gzdi0yaC01djV6bTItMTFWNWgtMnY1aDVWOGgtM3oiIC8+PC9nPgo8ZyBpZD0iZy10cmFuc2xhdGUiPjxwYXRoIGQ9Ik0yMCA1aC05LjEyTDEwIDJINGMtMS4xIDAtMiAuOS0yIDJ2MTNjMCAxLjEuOSAyIDIgMmg3bDEgM2g4YzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6TTcuMTcgMTQuNTljLTIuMjUgMC00LjA5LTEuODMtNC4wOS00LjA5czEuODMtNC4wOSA0LjA5LTQuMDljMS4wNCAwIDEuOTkuMzcgMi43NCAxLjA3bC4wNy4wNi0xLjIzIDEuMTgtLjA2LS4wNWMtLjI5LS4yNy0uNzgtLjU5LTEuNTItLjU5LTEuMzEgMC0yLjM4IDEuMDktMi4zOCAyLjQyczEuMDcgMi40MiAyLjM4IDIuNDJjMS4zNyAwIDEuOTYtLjg3IDIuMTItMS40Nkg3LjA4VjkuOTFoMy45NWwuMDEuMDdjLjA0LjIxLjA1LjQuMDUuNjEgMCAyLjM1LTEuNjEgNC0zLjkyIDR6bTYuMDMtMS43MWMuMzMuNi43NCAxLjE4IDEuMTkgMS43bC0uNTQuNTMtLjY1LTIuMjN6bS43Ny0uNzZoLS45OWwtLjMxLTEuMDRoMy45OXMtLjM0IDEuMzEtMS41NiAyLjc0Yy0uNTItLjYyLS44OS0xLjIzLTEuMTMtMS43ek0yMSAyMGMwIC41NS0uNDUgMS0xIDFoLTdsMi0yLS44MS0yLjc3LjkyLS45MkwxNy43OSAxOGwuNzMtLjczLTIuNzEtMi42OGMuOS0xLjAzIDEuNi0yLjI1IDEuOTItMy41MUgxOXYtMS4wNGgtMy42NFY5aC0xLjA0djEuMDRoLTEuOTZMMTEuMTggNkgyMGMuNTUgMCAxIC40NSAxIDF2MTN6IiAvPjwvZz4KPGcgaWQ9ImdhdmVsIj48cGF0aCBkPSJNMSAyMWgxMnYySDF6TTUuMjQ1IDguMDdsMi44My0yLjgyNyAxNC4xNCAxNC4xNDItMi44MjggMi44Mjh6TTEyLjMxNyAxbDUuNjU3IDUuNjU2LTIuODMgMi44My01LjY1NC01LjY2ek0zLjgyNSA5LjQ4NWw1LjY1NyA1LjY1Ny0yLjgyOCAyLjgyOC01LjY1Ny01LjY1N3oiIC8+PC9nPgo8ZyBpZD0iZ2VzdHVyZSI+PHBhdGggZD0iTTQuNTkgNi44OWMuNy0uNzEgMS40LTEuMzUgMS43MS0xLjIyLjUuMiAwIDEuMDMtLjMgMS41Mi0uMjUuNDItMi44NiAzLjg5LTIuODYgNi4zMSAwIDEuMjguNDggMi4zNCAxLjM0IDIuOTguNzUuNTYgMS43NC43MyAyLjY0LjQ2IDEuMDctLjMxIDEuOTUtMS40IDMuMDYtMi43NyAxLjIxLTEuNDkgMi44My0zLjQ0IDQuMDgtMy40NCAxLjYzIDAgMS42NSAxLjAxIDEuNzYgMS43OS0zLjc4LjY0LTUuMzggMy42Ny01LjM4IDUuMzcgMCAxLjcgMS40NCAzLjA5IDMuMjEgMy4wOSAxLjYzIDAgNC4yOS0xLjMzIDQuNjktNi4xSDIxdi0yLjVoLTIuNDdjLS4xNS0xLjY1LTEuMDktNC4yLTQuMDMtNC4yLTIuMjUgMC00LjE4IDEuOTEtNC45NCAyLjg0LS41OC43My0yLjA2IDIuNDgtMi4yOSAyLjcyLS4yNS4zLS42OC44NC0xLjExLjg0LS40NSAwLS43Mi0uODMtLjM2LTEuOTIuMzUtMS4wOSAxLjQtMi44NiAxLjg1LTMuNTIuNzgtMS4xNCAxLjMtMS45MiAxLjMtMy4yOEM4Ljk1IDMuNjkgNy4zMSAzIDYuNDQgMyA1LjEyIDMgMy45NyA0IDMuNzIgNC4yNWMtLjM2LjM2LS42Ni42Ni0uODguOTNsMS43NSAxLjcxem05LjI5IDExLjY2Yy0uMzEgMC0uNzQtLjI2LS43NC0uNzIgMC0uNi43My0yLjIgMi44Ny0yLjc2LS4zIDIuNjktMS40MyAzLjQ4LTIuMTMgMy40OHoiIC8+PC9nPgo8ZyBpZD0iZ2V0LWFwcCI+PHBhdGggZD0iTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXoiIC8+PC9nPgo8ZyBpZD0iZ2lmIj48cGF0aCBkPSJNMTEuNSA5SDEzdjZoLTEuNXpNOSA5SDZjLS42IDAtMSAuNS0xIDF2NGMwIC41LjQgMSAxIDFoM2MuNiAwIDEtLjUgMS0xdi0ySDguNXYxLjVoLTJ2LTNIMTBWMTBjMC0uNS0uNC0xLTEtMXptMTAgMS41VjloLTQuNXY2SDE2di0yaDJ2LTEuNWgtMnYtMXoiIC8+PC9nPgo8ZyBpZD0iZ3JhZGUiPjxwYXRoIGQ9Ik0xMiAxNy4yN0wxOC4xOCAyMWwtMS42NC03LjAzTDIyIDkuMjRsLTcuMTktLjYxTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMXoiIC8+PC9nPgo8ZyBpZD0iZ3JvdXAtd29yayI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6TTggMTcuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6TTkuNSA4YzAtMS4zOCAxLjEyLTIuNSAyLjUtMi41czIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNVM5LjUgOS4zOCA5LjUgOHptNi41IDkuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6IiAvPjwvZz4KPGcgaWQ9ImhlbHAiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE3aC0ydi0yaDJ2MnptMi4wNy03Ljc1bC0uOS45MkMxMy40NSAxMi45IDEzIDEzLjUgMTMgMTVoLTJ2LS41YzAtMS4xLjQ1LTIuMSAxLjE3LTIuODNsMS4yNC0xLjI2Yy4zNy0uMzYuNTktLjg2LjU5LTEuNDEgMC0xLjEtLjktMi0yLTJzLTIgLjktMiAySDhjMC0yLjIxIDEuNzktNCA0LTRzNCAxLjc5IDQgNGMwIC44OC0uMzYgMS42OC0uOTMgMi4yNXoiIC8+PC9nPgo8ZyBpZD0iaGVscC1vdXRsaW5lIj48cGF0aCBkPSJNMTEgMThoMnYtMmgtMnYyem0xLTE2QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHptMC0xNGMtMi4yMSAwLTQgMS43OS00IDRoMmMwLTEuMS45LTIgMi0yczIgLjkgMiAyYzAgMi0zIDEuNzUtMyA1aDJjMC0yLjI1IDMtMi41IDMtNSAwLTIuMjEtMS43OS00LTQtNHoiIC8+PC9nPgo8ZyBpZD0iaGlnaGxpZ2h0LW9mZiI+PHBhdGggZD0iTTE0LjU5IDhMMTIgMTAuNTkgOS40MSA4IDggOS40MSAxMC41OSAxMiA4IDE0LjU5IDkuNDEgMTYgMTIgMTMuNDEgMTQuNTkgMTYgMTYgMTQuNTkgMTMuNDEgMTIgMTYgOS40MSAxNC41OSA4ek0xMiAyQzYuNDcgMiAyIDYuNDcgMiAxMnM0LjQ3IDEwIDEwIDEwIDEwLTQuNDcgMTAtMTBTMTcuNTMgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiIC8+PC9nPgo8ZyBpZD0iaGlzdG9yeSI+PHBhdGggZD0iTTEzIDNjLTQuOTcgMC05IDQuMDMtOSA5SDFsMy44OSAzLjg5LjA3LjE0TDkgMTJINmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuOTMgMC0zLjY4LS43OS00Ljk0LTIuMDZsLTEuNDIgMS40MkM4LjI3IDE5Ljk5IDEwLjUxIDIxIDEzIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0tMSA1djVsNC4yOCAyLjU0LjcyLTEuMjEtMy41LTIuMDhWOEgxMnoiIC8+PC9nPgo8ZyBpZD0iaG9tZSI+PHBhdGggZD0iTTEwIDIwdi02aDR2Nmg1di04aDNMMTIgMyAyIDEyaDN2OHoiIC8+PC9nPgo8ZyBpZD0iaG91cmdsYXNzLWVtcHR5Ij48cGF0aCBkPSJNNiAydjZoLjAxTDYgOC4wMSAxMCAxMmwtNCA0IC4wMS4wMUg2VjIyaDEydi01Ljk5aC0uMDFMMTggMTZsLTQtNCA0LTMuOTktLjAxLS4wMUgxOFYySDZ6bTEwIDE0LjVWMjBIOHYtMy41bDQtNCA0IDR6bS00LTVsLTQtNFY0aDh2My41bC00IDR6IiAvPjwvZz4KPGcgaWQ9ImhvdXJnbGFzcy1mdWxsIj48cGF0aCBkPSJNNiAydjZoLjAxTDYgOC4wMSAxMCAxMmwtNCA0IC4wMS4wMUg2VjIyaDEydi01Ljk5aC0uMDFMMTggMTZsLTQtNCA0LTMuOTktLjAxLS4wMUgxOFYySDZ6IiAvPjwvZz4KPGcgaWQ9Imh0dHAiPjxwYXRoIGQ9Ik00LjUgMTFoLTJWOUgxdjZoMS41di0yLjVoMlYxNUg2VjlINC41djJ6bTIuNS0uNWgxLjVWMTVIMTB2LTQuNWgxLjVWOUg3djEuNXptNS41IDBIMTRWMTVoMS41di00LjVIMTdWOWgtNC41djEuNXptOS0xLjVIMTh2NmgxLjV2LTJoMmMuOCAwIDEuNS0uNyAxLjUtMS41di0xYzAtLjgtLjctMS41LTEuNS0xLjV6bTAgMi41aC0ydi0xaDJ2MXoiIC8+PC9nPgo8ZyBpZD0iaHR0cHMiPjxwYXRoIGQ9Ik0xOCA4aC0xVjZjMC0yLjc2LTIuMjQtNS01LTVTNyAzLjI0IDcgNnYySDZjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWMTBjMC0xLjEtLjktMi0yLTJ6bS02IDljLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyem0zLjEtOUg4LjlWNmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMSAxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXYyeiIgLz48L2c+CjxnIGlkPSJpbXBvcnRhbnQtZGV2aWNlcyI+PHBhdGggZD0iTTIzIDExLjAxTDE4IDExYy0uNTUgMC0xIC40NS0xIDF2OWMwIC41NS40NSAxIDEgMWg1Yy41NSAwIDEtLjQ1IDEtMXYtOWMwLS41NS0uNDUtLjk5LTEtLjk5ek0yMyAyMGgtNXYtN2g1djd6TTIwIDJIMkMuODkgMiAwIDIuODkgMCA0djEyYzAgMS4xLjg5IDIgMiAyaDd2Mkg3djJoOHYtMmgtMnYtMmgydi0ySDJWNGgxOHY1aDJWNGMwLTEuMTEtLjktMi0yLTJ6bS04LjAzIDdMMTEgNmwtLjk3IDNIN2wyLjQ3IDEuNzYtLjk0IDIuOTEgMi40Ny0xLjggMi40NyAxLjgtLjk0LTIuOTFMMTUgOWgtMy4wM3oiIC8+PC9nPgo8ZyBpZD0iaW5ib3giPjxwYXRoIGQ9Ik0xOSAzSDQuOTljLTEuMTEgMC0xLjk4Ljg5LTEuOTggMkwzIDE5YzAgMS4xLjg4IDIgMS45OSAySDE5YzEuMSAwIDItLjkgMi0yVjVjMC0xLjExLS45LTItMi0yem0wIDEyaC00YzAgMS42Ni0xLjM1IDMtMyAzcy0zLTEuMzQtMy0zSDQuOTlWNUgxOXYxMHoiIC8+PC9nPgo8ZyBpZD0iaW5kZXRlcm1pbmF0ZS1jaGVjay1ib3giPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTIgMTBIN3YtMmgxMHYyeiIgLz48L2c+CjxnIGlkPSJpbmZvIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMSAxNWgtMnYtNmgydjZ6bTAtOGgtMlY3aDJ2MnoiIC8+PC9nPgo8ZyBpZD0iaW5mby1vdXRsaW5lIj48cGF0aCBkPSJNMTEgMTdoMnYtNmgtMnY2em0xLTE1QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHpNMTEgOWgyVjdoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iaW5wdXQiPjxwYXRoIGQ9Ik0yMSAzLjAxSDNjLTEuMSAwLTIgLjktMiAyVjloMlY0Ljk5aDE4djE0LjAzSDNWMTVIMXY0LjAxYzAgMS4xLjkgMS45OCAyIDEuOThoMThjMS4xIDAgMi0uODggMi0xLjk4di0xNGMwLTEuMTEtLjktMi0yLTJ6TTExIDE2bDQtNC00LTR2M0gxdjJoMTB2M3oiIC8+PC9nPgo8ZyBpZD0iaW52ZXJ0LWNvbG9ycyI+PHBhdGggZD0iTTE3LjY2IDcuOTNMMTIgMi4yNyA2LjM0IDcuOTNjLTMuMTIgMy4xMi0zLjEyIDguMTkgMCAxMS4zMUM3LjkgMjAuOCA5Ljk1IDIxLjU4IDEyIDIxLjU4YzIuMDUgMCA0LjEtLjc4IDUuNjYtMi4zNCAzLjEyLTMuMTIgMy4xMi04LjE5IDAtMTEuMzF6TTEyIDE5LjU5Yy0xLjYgMC0zLjExLS42Mi00LjI0LTEuNzZDNi42MiAxNi42OSA2IDE1LjE5IDYgMTMuNTlzLjYyLTMuMTEgMS43Ni00LjI0TDEyIDUuMXYxNC40OXoiIC8+PC9nPgo8ZyBpZD0ibGFiZWwiPjxwYXRoIGQ9Ik0xNy42MyA1Ljg0QzE3LjI3IDUuMzMgMTYuNjcgNSAxNiA1TDUgNS4wMUMzLjkgNS4wMSAzIDUuOSAzIDd2MTBjMCAxLjEuOSAxLjk5IDIgMS45OUwxNiAxOWMuNjcgMCAxLjI3LS4zMyAxLjYzLS44NEwyMiAxMmwtNC4zNy02LjE2eiIgLz48L2c+CjxnIGlkPSJsYWJlbC1vdXRsaW5lIj48cGF0aCBkPSJNMTcuNjMgNS44NEMxNy4yNyA1LjMzIDE2LjY3IDUgMTYgNUw1IDUuMDFDMy45IDUuMDEgMyA1LjkgMyA3djEwYzAgMS4xLjkgMS45OSAyIDEuOTlMMTYgMTljLjY3IDAgMS4yNy0uMzMgMS42My0uODRMMjIgMTJsLTQuMzctNi4xNnpNMTYgMTdINVY3aDExbDMuNTUgNUwxNiAxN3oiIC8+PC9nPgo8ZyBpZD0ibGFuZ3VhZ2UiPjxwYXRoIGQ9Ik0xMS45OSAyQzYuNDcgMiAyIDYuNDggMiAxMnM0LjQ3IDEwIDkuOTkgMTBDMTcuNTIgMjIgMjIgMTcuNTIgMjIgMTJTMTcuNTIgMiAxMS45OSAyem02LjkzIDZoLTIuOTVjLS4zMi0xLjI1LS43OC0yLjQ1LTEuMzgtMy41NiAxLjg0LjYzIDMuMzcgMS45MSA0LjMzIDMuNTZ6TTEyIDQuMDRjLjgzIDEuMiAxLjQ4IDIuNTMgMS45MSAzLjk2aC0zLjgyYy40My0xLjQzIDEuMDgtMi43NiAxLjkxLTMuOTZ6TTQuMjYgMTRDNC4xIDEzLjM2IDQgMTIuNjkgNCAxMnMuMS0xLjM2LjI2LTJoMy4zOGMtLjA4LjY2LS4xNCAxLjMyLS4xNCAyIDAgLjY4LjA2IDEuMzQuMTQgMkg0LjI2em0uODIgMmgyLjk1Yy4zMiAxLjI1Ljc4IDIuNDUgMS4zOCAzLjU2LTEuODQtLjYzLTMuMzctMS45LTQuMzMtMy41NnptMi45NS04SDUuMDhjLjk2LTEuNjYgMi40OS0yLjkzIDQuMzMtMy41NkM4LjgxIDUuNTUgOC4zNSA2Ljc1IDguMDMgOHpNMTIgMTkuOTZjLS44My0xLjItMS40OC0yLjUzLTEuOTEtMy45NmgzLjgyYy0uNDMgMS40My0xLjA4IDIuNzYtMS45MSAzLjk2ek0xNC4zNCAxNEg5LjY2Yy0uMDktLjY2LS4xNi0xLjMyLS4xNi0yIDAtLjY4LjA3LTEuMzUuMTYtMmg0LjY4Yy4wOS42NS4xNiAxLjMyLjE2IDIgMCAuNjgtLjA3IDEuMzQtLjE2IDJ6bS4yNSA1LjU2Yy42LTEuMTEgMS4wNi0yLjMxIDEuMzgtMy41NmgyLjk1Yy0uOTYgMS42NS0yLjQ5IDIuOTMtNC4zMyAzLjU2ek0xNi4zNiAxNGMuMDgtLjY2LjE0LTEuMzIuMTQtMiAwLS42OC0uMDYtMS4zNC0uMTQtMmgzLjM4Yy4xNi42NC4yNiAxLjMxLjI2IDJzLS4xIDEuMzYtLjI2IDJoLTMuMzh6IiAvPjwvZz4KPGcgaWQ9Imxhc3QtcGFnZSI+PHBhdGggZD0iTTUuNTkgNy40MUwxMC4xOCAxMmwtNC41OSA0LjU5TDcgMThsNi02LTYtNnpNMTYgNmgydjEyaC0yeiIgLz48L2c+CjxnIGlkPSJsYXVuY2giPjxwYXRoIGQ9Ik0xOSAxOUg1VjVoN1YzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnYtN2gtMnY3ek0xNCAzdjJoMy41OWwtOS44MyA5LjgzIDEuNDEgMS40MUwxOSA2LjQxVjEwaDJWM2gtN3oiIC8+PC9nPgo8ZyBpZD0ibGlnaHRidWxiLW91dGxpbmUiPjxwYXRoIGQ9Ik05IDIxYzAgLjU1LjQ1IDEgMSAxaDRjLjU1IDAgMS0uNDUgMS0xdi0xSDl2MXptMy0xOUM4LjE0IDIgNSA1LjE0IDUgOWMwIDIuMzggMS4xOSA0LjQ3IDMgNS43NFYxN2MwIC41NS40NSAxIDEgMWg2Yy41NSAwIDEtLjQ1IDEtMXYtMi4yNmMxLjgxLTEuMjcgMy0zLjM2IDMtNS43NCAwLTMuODYtMy4xNC03LTctN3ptMi44NSAxMS4xbC0uODUuNlYxNmgtNHYtMi4zbC0uODUtLjZDNy44IDEyLjE2IDcgMTAuNjMgNyA5YzAtMi43NiAyLjI0LTUgNS01czUgMi4yNCA1IDVjMCAxLjYzLS44IDMuMTYtMi4xNSA0LjF6IiAvPjwvZz4KPGcgaWQ9ImxpbmUtc3R5bGUiPjxwYXRoIGQ9Ik0zIDE2aDV2LTJIM3Yyem02LjUgMGg1di0yaC01djJ6bTYuNSAwaDV2LTJoLTV2MnpNMyAyMGgydi0ySDN2MnptNCAwaDJ2LTJIN3Yyem00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyek0zIDEyaDh2LTJIM3Yyem0xMCAwaDh2LTJoLTh2MnpNMyA0djRoMThWNEgzeiIgLz48L2c+CjxnIGlkPSJsaW5lLXdlaWdodCI+PHBhdGggZD0iTTMgMTdoMTh2LTJIM3Yyem0wIDNoMTh2LTFIM3Yxem0wLTdoMTh2LTNIM3Yzem0wLTl2NGgxOFY0SDN6IiAvPjwvZz4KPGcgaWQ9ImxpbmsiPjxwYXRoIGQ9Ik0zLjkgMTJjMC0xLjcxIDEuMzktMy4xIDMuMS0zLjFoNFY3SDdjLTIuNzYgMC01IDIuMjQtNSA1czIuMjQgNSA1IDVoNHYtMS45SDdjLTEuNzEgMC0zLjEtMS4zOS0zLjEtMy4xek04IDEzaDh2LTJIOHYyem05LTZoLTR2MS45aDRjMS43MSAwIDMuMSAxLjM5IDMuMSAzLjFzLTEuMzkgMy4xLTMuMSAzLjFoLTRWMTdoNGMyLjc2IDAgNS0yLjI0IDUtNXMtMi4yNC01LTUtNXoiIC8+PC9nPgo8ZyBpZD0ibGlzdCI+PHBhdGggZD0iTTMgMTNoMnYtMkgzdjJ6bTAgNGgydi0ySDN2MnptMC04aDJWN0gzdjJ6bTQgNGgxNHYtMkg3djJ6bTAgNGgxNHYtMkg3djJ6TTcgN3YyaDE0VjdIN3oiIC8+PC9nPgo8ZyBpZD0ibG9jayI+PHBhdGggZD0iTTE4IDhoLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2djJINmMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlYxMGMwLTEuMS0uOS0yLTItMnptLTYgOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6bTMuMS05SDguOVY2YzAtMS43MSAxLjM5LTMuMSAzLjEtMy4xIDEuNzEgMCAzLjEgMS4zOSAzLjEgMy4xdjJ6IiAvPjwvZz4KPGcgaWQ9ImxvY2stb3BlbiI+PHBhdGggZD0iTTEyIDE3YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptNi05aC0xVjZjMC0yLjc2LTIuMjQtNS01LTVTNyAzLjI0IDcgNmgxLjljMC0xLjcxIDEuMzktMy4xIDMuMS0zLjEgMS43MSAwIDMuMSAxLjM5IDMuMSAzLjF2Mkg2Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjEwYzAtMS4xLS45LTItMi0yem0wIDEySDZWMTBoMTJ2MTB6IiAvPjwvZz4KPGcgaWQ9ImxvY2stb3V0bGluZSI+PHBhdGggZD0iTTEyIDE3YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptNi05aC0xVjZjMC0yLjc2LTIuMjQtNS01LTVTNyAzLjI0IDcgNnYySDZjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWMTBjMC0xLjEtLjktMi0yLTJ6TTguOSA2YzAtMS43MSAxLjM5LTMuMSAzLjEtMy4xczMuMSAxLjM5IDMuMSAzLjF2Mkg4LjlWNnpNMTggMjBINlYxMGgxMnYxMHoiIC8+PC9nPgo8ZyBpZD0ibG93LXByaW9yaXR5Ij48cGF0aCBkPSJNMTQgNWg4djJoLTh6bTAgNS41aDh2MmgtOHptMCA1LjVoOHYyaC04ek0yIDExLjVDMiAxNS4wOCA0LjkyIDE4IDguNSAxOEg5djJsMy0zLTMtM3YyaC0uNUM2LjAyIDE2IDQgMTMuOTggNCAxMS41UzYuMDIgNyA4LjUgN0gxMlY1SDguNUM0LjkyIDUgMiA3LjkyIDIgMTEuNXoiIC8+PC9nPgo8ZyBpZD0ibG95YWx0eSI+PHBhdGggZD0iTTIxLjQxIDExLjU4bC05LTlDMTIuMDUgMi4yMiAxMS41NSAyIDExIDJINGMtMS4xIDAtMiAuOS0yIDJ2N2MwIC41NS4yMiAxLjA1LjU5IDEuNDJsOSA5Yy4zNi4zNi44Ni41OCAxLjQxLjU4LjU1IDAgMS4wNS0uMjIgMS40MS0uNTlsNy03Yy4zNy0uMzYuNTktLjg2LjU5LTEuNDEgMC0uNTUtLjIzLTEuMDYtLjU5LTEuNDJ6TTUuNSA3QzQuNjcgNyA0IDYuMzMgNCA1LjVTNC42NyA0IDUuNSA0IDcgNC42NyA3IDUuNSA2LjMzIDcgNS41IDd6bTExLjc3IDguMjdMMTMgMTkuNTRsLTQuMjctNC4yN0M4LjI4IDE0LjgxIDggMTQuMTkgOCAxMy41YzAtMS4zOCAxLjEyLTIuNSAyLjUtMi41LjY5IDAgMS4zMi4yOCAxLjc3Ljc0bC43My43Mi43My0uNzNjLjQ1LS40NSAxLjA4LS43MyAxLjc3LS43MyAxLjM4IDAgMi41IDEuMTIgMi41IDIuNSAwIC42OS0uMjggMS4zMi0uNzMgMS43N3oiIC8+PC9nPgo8ZyBpZD0ibWFpbCI+PHBhdGggZD0iTTIwIDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptMCA0bC04IDUtOC01VjZsOCA1IDgtNXYyeiIgLz48L2c+CjxnIGlkPSJtYXJrdW5yZWFkIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDRsLTggNS04LTVWNmw4IDUgOC01djJ6IiAvPjwvZz4KPGcgaWQ9Im1hcmt1bnJlYWQtbWFpbGJveCI+PHBhdGggZD0iTTIwIDZIMTB2Nkg4VjRoNlYwSDZ2Nkg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9Im1lbnUiPjxwYXRoIGQ9Ik0zIDE4aDE4di0ySDN2MnptMC01aDE4di0ySDN2MnptMC03djJoMThWNkgzeiIgLz48L2c+CjxnIGlkPSJtb3JlLWhvcml6Ij48cGF0aCBkPSJNNiAxMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTEyIDBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0tNiAwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ibW9yZS12ZXJ0Ij48cGF0aCBkPSJNMTIgOGMxLjEgMCAyLS45IDItMnMtLjktMi0yLTItMiAuOS0yIDIgLjkgMiAyIDJ6bTAgMmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAgNmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9Im1vdG9yY3ljbGUiPjxwYXRoIGQ9Ik0xOS40NCA5LjAzTDE1LjQxIDVIMTF2MmgzLjU5bDIgMkg1Yy0yLjggMC01IDIuMi01IDVzMi4yIDUgNSA1YzIuNDYgMCA0LjQ1LTEuNjkgNC45LTRoMS42NWwyLjc3LTIuNzdjLS4yMS41NC0uMzIgMS4xNC0uMzIgMS43NyAwIDIuOCAyLjIgNSA1IDVzNS0yLjIgNS01YzAtMi42NS0xLjk3LTQuNzctNC41Ni00Ljk3ek03LjgyIDE1QzcuNCAxNi4xNSA2LjI4IDE3IDUgMTdjLTEuNjMgMC0zLTEuMzctMy0zczEuMzctMyAzLTNjMS4yOCAwIDIuNC44NSAyLjgyIDJINXYyaDIuODJ6TTE5IDE3Yy0xLjY2IDAtMy0xLjM0LTMtM3MxLjM0LTMgMy0zIDMgMS4zNCAzIDMtMS4zNCAzLTMgM3oiIC8+PC9nPgo8ZyBpZD0ibW92ZS10by1pbmJveCI+PHBhdGggZD0iTTE5IDNINC45OWMtMS4xMSAwLTEuOTguOS0xLjk4IDJMMyAxOWMwIDEuMS44OCAyIDEuOTkgMkgxOWMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDEyaC00YzAgMS42Ni0xLjM1IDMtMyAzcy0zLTEuMzQtMy0zSDQuOTlWNUgxOXYxMHptLTMtNWgtMlY3aC00djNIOGw0IDQgNC00eiIgLz48L2c+CjxnIGlkPSJuZXh0LXdlZWsiPjxwYXRoIGQ9Ik0yMCA3aC00VjVjMC0uNTUtLjIyLTEuMDUtLjU5LTEuNDFDMTUuMDUgMy4yMiAxNC41NSAzIDE0IDNoLTRjLTEuMSAwLTIgLjktMiAydjJINGMtMS4xIDAtMiAuOS0yIDJ2MTFjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY5YzAtMS4xLS45LTItMi0yek0xMCA1aDR2MmgtNFY1em0xIDEzLjVsLTEtMSAzLTMtMy0zIDEtMSA0IDQtNCA0eiIgLz48L2c+CjxnIGlkPSJub3RlLWFkZCI+PHBhdGggZD0iTTE0IDJINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDIwYzAgMS4xLjg5IDIgMS45OSAySDE4YzEuMSAwIDItLjkgMi0yVjhsLTYtNnptMiAxNGgtM3YzaC0ydi0zSDh2LTJoM3YtM2gydjNoM3Yyem0tMy03VjMuNUwxOC41IDlIMTN6IiAvPjwvZz4KPGcgaWQ9Im9mZmxpbmUtcGluIj48cGF0aCBkPSJNMTIgMkM2LjUgMiAyIDYuNSAyIDEyczQuNSAxMCAxMCAxMCAxMC00LjUgMTAtMTBTMTcuNSAyIDEyIDJ6bTUgMTZIN3YtMmgxMHYyem0tNi43LTRMNyAxMC43bDEuNC0xLjQgMS45IDEuOSA1LjMtNS4zTDE3IDcuMyAxMC4zIDE0eiIgLz48L2c+CjxnIGlkPSJvcGFjaXR5Ij48cGF0aCBkPSJNMTcuNjYgOEwxMiAyLjM1IDYuMzQgOEM0Ljc4IDkuNTYgNCAxMS42NCA0IDEzLjY0cy43OCA0LjExIDIuMzQgNS42NyAzLjYxIDIuMzUgNS42NiAyLjM1IDQuMS0uNzkgNS42Ni0yLjM1UzIwIDE1LjY0IDIwIDEzLjY0IDE5LjIyIDkuNTYgMTcuNjYgOHpNNiAxNGMuMDEtMiAuNjItMy4yNyAxLjc2LTQuNEwxMiA1LjI3bDQuMjQgNC4zOEMxNy4zOCAxMC43NyAxNy45OSAxMiAxOCAxNEg2eiIgLz48L2c+CjxnIGlkPSJvcGVuLWluLWJyb3dzZXIiPjxwYXRoIGQ9Ik0xOSA0SDVjLTEuMTEgMC0yIC45LTIgMnYxMmMwIDEuMS44OSAyIDIgMmg0di0ySDVWOGgxNHYxMGgtNHYyaDRjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uODktMi0yLTJ6bS03IDZsLTQgNGgzdjZoMnYtNmgzbC00LTR6IiAvPjwvZz4KPGcgaWQ9Im9wZW4taW4tbmV3Ij48cGF0aCBkPSJNMTkgMTlINVY1aDdWM0g1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJ2LTdoLTJ2N3pNMTQgM3YyaDMuNTlsLTkuODMgOS44MyAxLjQxIDEuNDFMMTkgNi40MVYxMGgyVjNoLTd6IiAvPjwvZz4KPGcgaWQ9Im9wZW4td2l0aCI+PHBhdGggZD0iTTEwIDloNFY2aDNsLTUtNS01IDVoM3Yzem0tMSAxSDZWN2wtNSA1IDUgNXYtM2gzdi00em0xNCAybC01LTV2M2gtM3Y0aDN2M2w1LTV6bS05IDNoLTR2M0g3bDUgNSA1LTVoLTN2LTN6IiAvPjwvZz4KPGcgaWQ9InBhZ2V2aWV3Ij48cGF0aCBkPSJNMTEuNSA5QzEwLjEyIDkgOSAxMC4xMiA5IDExLjVzMS4xMiAyLjUgMi41IDIuNSAyLjUtMS4xMiAyLjUtMi41UzEyLjg4IDkgMTEuNSA5ek0yMCA0SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptLTMuMjEgMTQuMjFsLTIuOTEtMi45MWMtLjY5LjQ0LTEuNTEuNy0yLjM5LjdDOS4wMSAxNiA3IDEzLjk5IDcgMTEuNVM5LjAxIDcgMTEuNSA3IDE2IDkuMDEgMTYgMTEuNWMwIC44OC0uMjYgMS42OS0uNyAyLjM5bDIuOTEgMi45LTEuNDIgMS40MnoiIC8+PC9nPgo8ZyBpZD0icGFuLXRvb2wiPjxwYXRoIGQ9Ik0yMyA1LjVWMjBjMCAyLjItMS44IDQtNCA0aC03LjNjLTEuMDggMC0yLjEtLjQzLTIuODUtMS4xOUwxIDE0LjgzczEuMjYtMS4yMyAxLjMtMS4yNWMuMjItLjE5LjQ5LS4yOS43OS0uMjkuMjIgMCAuNDIuMDYuNi4xNi4wNC4wMSA0LjMxIDIuNDYgNC4zMSAyLjQ2VjRjMC0uODMuNjctMS41IDEuNS0xLjVTMTEgMy4xNyAxMSA0djdoMVYxLjVjMC0uODMuNjctMS41IDEuNS0xLjVTMTUgLjY3IDE1IDEuNVYxMWgxVjIuNWMwLS44My42Ny0xLjUgMS41LTEuNXMxLjUuNjcgMS41IDEuNVYxMWgxVjUuNWMwLS44My42Ny0xLjUgMS41LTEuNXMxLjUuNjcgMS41IDEuNXoiIC8+PC9nPgo8ZyBpZD0icGF5bWVudCI+PHBhdGggZD0iTTIwIDRINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMThjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWNmMwLTEuMTEtLjg5LTItMi0yem0wIDE0SDR2LTZoMTZ2NnptMC0xMEg0VjZoMTZ2MnoiIC8+PC9nPgo8ZyBpZD0icGVybS1jYW1lcmEtbWljIj48cGF0aCBkPSJNMjAgNWgtMy4xN0wxNSAzSDlMNy4xNyA1SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoN3YtMi4wOWMtMi44My0uNDgtNS0yLjk0LTUtNS45MWgyYzAgMi4yMSAxLjc5IDQgNCA0czQtMS43OSA0LTRoMmMwIDIuOTctMi4xNyA1LjQzLTUgNS45MVYyMWg3YzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6bS02IDhjMCAxLjEtLjkgMi0yIDJzLTItLjktMi0yVjljMC0xLjEuOS0yIDItMnMyIC45IDIgMnY0eiIgLz48L2c+CjxnIGlkPSJwZXJtLWNvbnRhY3QtY2FsZW5kYXIiPjxwYXRoIGQ9Ik0xOSAzaC0xVjFoLTJ2Mkg4VjFINnYySDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAzYzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptNiAxMkg2di0xYzAtMiA0LTMuMSA2LTMuMXM2IDEuMSA2IDMuMXYxeiIgLz48L2c+CjxnIGlkPSJwZXJtLWRhdGEtc2V0dGluZyI+PHBhdGggZD0iTTE4Ljk5IDExLjVjLjM0IDAgLjY3LjAzIDEgLjA3TDIwIDAgMCAyMGgxMS41NmMtLjA0LS4zMy0uMDctLjY2LS4wNy0xIDAtNC4xNCAzLjM2LTcuNSA3LjUtNy41em0zLjcxIDcuOTljLjAyLS4xNi4wNC0uMzIuMDQtLjQ5IDAtLjE3LS4wMS0uMzMtLjA0LS40OWwxLjA2LS44M2MuMDktLjA4LjEyLS4yMS4wNi0uMzJsLTEtMS43M2MtLjA2LS4xMS0uMTktLjE1LS4zMS0uMTFsLTEuMjQuNWMtLjI2LS4yLS41NC0uMzctLjg1LS40OWwtLjE5LTEuMzJjLS4wMS0uMTItLjEyLS4yMS0uMjQtLjIxaC0yYy0uMTIgMC0uMjMuMDktLjI1LjIxbC0uMTkgMS4zMmMtLjMuMTMtLjU5LjI5LS44NS40OWwtMS4yNC0uNWMtLjExLS4wNC0uMjQgMC0uMzEuMTFsLTEgMS43M2MtLjA2LjExLS4wNC4yNC4wNi4zMmwxLjA2LjgzYy0uMDIuMTYtLjAzLjMyLS4wMy40OSAwIC4xNy4wMS4zMy4wMy40OWwtMS4wNi44M2MtLjA5LjA4LS4xMi4yMS0uMDYuMzJsMSAxLjczYy4wNi4xMS4xOS4xNS4zMS4xMWwxLjI0LS41Yy4yNi4yLjU0LjM3Ljg1LjQ5bC4xOSAxLjMyYy4wMi4xMi4xMi4yMS4yNS4yMWgyYy4xMiAwIC4yMy0uMDkuMjUtLjIxbC4xOS0xLjMyYy4zLS4xMy41OS0uMjkuODQtLjQ5bDEuMjUuNWMuMTEuMDQuMjQgMCAuMzEtLjExbDEtMS43M2MuMDYtLjExLjAzLS4yNC0uMDYtLjMybC0xLjA3LS44M3ptLTMuNzEgMS4wMWMtLjgzIDAtMS41LS42Ny0xLjUtMS41cy42Ny0xLjUgMS41LTEuNSAxLjUuNjcgMS41IDEuNS0uNjcgMS41LTEuNSAxLjV6IiAvPjwvZz4KPGcgaWQ9InBlcm0tZGV2aWNlLWluZm9ybWF0aW9uIj48cGF0aCBkPSJNMTMgN2gtMnYyaDJWN3ptMCA0aC0ydjZoMnYtNnptNC05Ljk5TDcgMWMtMS4xIDAtMiAuOS0yIDJ2MThjMCAxLjEuOSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTEuOTktMi0xLjk5ek0xNyAxOUg3VjVoMTB2MTR6IiAvPjwvZz4KPGcgaWQ9InBlcm0taWRlbnRpdHkiPjxwYXRoIGQ9Ik0xMiA1LjljMS4xNiAwIDIuMS45NCAyLjEgMi4xcy0uOTQgMi4xLTIuMSAyLjFTOS45IDkuMTYgOS45IDhzLjk0LTIuMSAyLjEtMi4xbTAgOWMyLjk3IDAgNi4xIDEuNDYgNi4xIDIuMXYxLjFINS45VjE3YzAtLjY0IDMuMTMtMi4xIDYuMS0yLjFNMTIgNEM5Ljc5IDQgOCA1Ljc5IDggOHMxLjc5IDQgNCA0IDQtMS43OSA0LTQtMS43OS00LTQtNHptMCA5Yy0yLjY3IDAtOCAxLjM0LTggNHYzaDE2di0zYzAtMi42Ni01LjMzLTQtOC00eiIgLz48L2c+CjxnIGlkPSJwZXJtLW1lZGlhIj48cGF0aCBkPSJNMiA2SDB2NWguMDFMMCAyMGMwIDEuMS45IDIgMiAyaDE4di0ySDJWNnptMjAtMmgtOGwtMi0ySDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAxNmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6TTcgMTVsNC41LTYgMy41IDQuNTEgMi41LTMuMDFMMjEgMTVIN3oiIC8+PC9nPgo8ZyBpZD0icGVybS1waG9uZS1tc2ciPjxwYXRoIGQ9Ik0yMCAxNS41Yy0xLjI1IDAtMi40NS0uMi0zLjU3LS41Ny0uMzUtLjExLS43NC0uMDMtMS4wMi4yNGwtMi4yIDIuMmMtMi44My0xLjQ0LTUuMTUtMy43NS02LjU5LTYuNThsMi4yLTIuMjFjLjI4LS4yNy4zNi0uNjYuMjUtMS4wMUM4LjcgNi40NSA4LjUgNS4yNSA4LjUgNGMwLS41NS0uNDUtMS0xLTFINGMtLjU1IDAtMSAuNDUtMSAxIDAgOS4zOSA3LjYxIDE3IDE3IDE3IC41NSAwIDEtLjQ1IDEtMXYtMy41YzAtLjU1LS40NS0xLTEtMXpNMTIgM3YxMGwzLTNoNlYzaC05eiIgLz48L2c+CjxnIGlkPSJwZXJtLXNjYW4td2lmaSI+PHBhdGggZD0iTTEyIDNDNi45NSAzIDMuMTUgNC44NSAwIDcuMjNMMTIgMjIgMjQgNy4yNUMyMC44NSA0Ljg3IDE3LjA1IDMgMTIgM3ptMSAxM2gtMnYtNmgydjZ6bS0yLThWNmgydjJoLTJ6IiAvPjwvZz4KPGcgaWQ9InBldHMiPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjkuNSIgcj0iMi41IiAvPjxjaXJjbGUgY3g9IjkiIGN5PSI1LjUiIHI9IjIuNSIgLz48Y2lyY2xlIGN4PSIxNSIgY3k9IjUuNSIgcj0iMi41IiAvPjxjaXJjbGUgY3g9IjE5LjUiIGN5PSI5LjUiIHI9IjIuNSIgLz48cGF0aCBkPSJNMTcuMzQgMTQuODZjLS44Ny0xLjAyLTEuNi0xLjg5LTIuNDgtMi45MS0uNDYtLjU0LTEuMDUtMS4wOC0xLjc1LTEuMzItLjExLS4wNC0uMjItLjA3LS4zMy0uMDktLjI1LS4wNC0uNTItLjA0LS43OC0uMDRzLS41MyAwLS43OS4wNWMtLjExLjAyLS4yMi4wNS0uMzMuMDktLjcuMjQtMS4yOC43OC0xLjc1IDEuMzItLjg3IDEuMDItMS42IDEuODktMi40OCAyLjkxLTEuMzEgMS4zMS0yLjkyIDIuNzYtMi42MiA0Ljc5LjI5IDEuMDIgMS4wMiAyLjAzIDIuMzMgMi4zMi43My4xNSAzLjA2LS40NCA1LjU0LS40NGguMThjMi40OCAwIDQuODEuNTggNS41NC40NCAxLjMxLS4yOSAyLjA0LTEuMzEgMi4zMy0yLjMyLjMxLTIuMDQtMS4zLTMuNDktMi42MS00Ljh6IiAvPjwvZz4KPGcgaWQ9InBpY3R1cmUtaW4tcGljdHVyZSI+PHBhdGggZD0iTTE5IDdoLTh2Nmg4Vjd6bTItNEgzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDEuOTggMiAxLjk4aDE4YzEuMSAwIDItLjg4IDItMS45OFY1YzAtMS4xLS45LTItMi0yem0wIDE2LjAxSDNWNC45OGgxOHYxNC4wM3oiIC8+PC9nPgo8ZyBpZD0icGljdHVyZS1pbi1waWN0dXJlLWFsdCI+PHBhdGggZD0iTTE5IDExaC04djZoOHYtNnptNCA4VjQuOThDMjMgMy44OCAyMi4xIDMgMjEgM0gzYy0xLjEgMC0yIC44OC0yIDEuOThWMTljMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMnptLTIgLjAySDNWNC45N2gxOHYxNC4wNXoiIC8+PC9nPgo8ZyBpZD0icGxheS1mb3Itd29yayI+PHBhdGggZD0iTTExIDV2NS41OUg3LjVsNC41IDQuNSA0LjUtNC41SDEzVjVoLTJ6bS01IDljMCAzLjMxIDIuNjkgNiA2IDZzNi0yLjY5IDYtNmgtMmMwIDIuMjEtMS43OSA0LTQgNHMtNC0xLjc5LTQtNEg2eiIgLz48L2c+CjxnIGlkPSJwb2x5bWVyIj48cGF0aCBkPSJNMTkgNGgtNEw3LjExIDE2LjYzIDQuNSAxMiA5IDRINUwuNSAxMiA1IDIwaDRsNy44OS0xMi42M0wxOS41IDEyIDE1IDIwaDRsNC41LTh6IiAvPjwvZz4KPGcgaWQ9InBvd2VyLXNldHRpbmdzLW5ldyI+PHBhdGggZD0iTTEzIDNoLTJ2MTBoMlYzem00LjgzIDIuMTdsLTEuNDIgMS40MkMxNy45OSA3Ljg2IDE5IDkuODEgMTkgMTJjMCAzLjg3LTMuMTMgNy03IDdzLTctMy4xMy03LTdjMC0yLjE5IDEuMDEtNC4xNCAyLjU4LTUuNDJMNi4xNyA1LjE3QzQuMjMgNi44MiAzIDkuMjYgMyAxMmMwIDQuOTcgNC4wMyA5IDkgOXM5LTQuMDMgOS05YzAtMi43NC0xLjIzLTUuMTgtMy4xNy02LjgzeiIgLz48L2c+CjxnIGlkPSJwcmVnbmFudC13b21hbiI+PHBhdGggZD0iTTkgNGMwLTEuMTEuODktMiAyLTJzMiAuODkgMiAyLS44OSAyLTIgMi0yLS44OS0yLTJ6bTcgOWMtLjAxLTEuMzQtLjgzLTIuNTEtMi0zIDAtMS42Ni0xLjM0LTMtMy0zcy0zIDEuMzQtMyAzdjdoMnY1aDN2LTVoM3YtNHoiIC8+PC9nPgo8ZyBpZD0icHJpbnQiPjxwYXRoIGQ9Ik0xOSA4SDVjLTEuNjYgMC0zIDEuMzQtMyAzdjZoNHY0aDEydi00aDR2LTZjMC0xLjY2LTEuMzQtMy0zLTN6bS0zIDExSDh2LTVoOHY1em0zLTdjLS41NSAwLTEtLjQ1LTEtMXMuNDUtMSAxLTEgMSAuNDUgMSAxLS40NSAxLTEgMXptLTEtOUg2djRoMTJWM3oiIC8+PC9nPgo8ZyBpZD0icXVlcnktYnVpbGRlciI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6TTEyIDIwYy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHptLjUtMTNIMTF2Nmw1LjI1IDMuMTUuNzUtMS4yMy00LjUtMi42N3oiIC8+PC9nPgo8ZyBpZD0icXVlc3Rpb24tYW5zd2VyIj48cGF0aCBkPSJNMjEgNmgtMnY5SDZ2MmMwIC41NS40NSAxIDEgMWgxMWw0IDRWN2MwLS41NS0uNDUtMS0xLTF6bS00IDZWM2MwLS41NS0uNDUtMS0xLTFIM2MtLjU1IDAtMSAuNDUtMSAxdjE0bDQtNGgxMGMuNTUgMCAxLS40NSAxLTF6IiAvPjwvZz4KPGcgaWQ9InJhZGlvLWJ1dHRvbi1jaGVja2VkIj48cGF0aCBkPSJNMTIgN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNSA1LTIuMjQgNS01LTIuMjQtNS01LTV6bTAtNUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MiAwLTgtMy41OC04LThzMy41OC04IDgtOCA4IDMuNTggOCA4LTMuNTggOC04IDh6IiAvPjwvZz4KPGcgaWQ9InJhZGlvLWJ1dHRvbi11bmNoZWNrZWQiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiIC8+PC9nPgo8ZyBpZD0icmVjZWlwdCI+PHBhdGggZD0iTTE4IDE3SDZ2LTJoMTJ2MnptMC00SDZ2LTJoMTJ2MnptMC00SDZWN2gxMnYyek0zIDIybDEuNS0xLjVMNiAyMmwxLjUtMS41TDkgMjJsMS41LTEuNUwxMiAyMmwxLjUtMS41TDE1IDIybDEuNS0xLjVMMTggMjJsMS41LTEuNUwyMSAyMlYybC0xLjUgMS41TDE4IDJsLTEuNSAxLjVMMTUgMmwtMS41IDEuNUwxMiAybC0xLjUgMS41TDkgMiA3LjUgMy41IDYgMiA0LjUgMy41IDMgMnYyMHoiIC8+PC9nPgo8ZyBpZD0icmVjb3JkLXZvaWNlLW92ZXIiPjxjaXJjbGUgY3g9IjkiIGN5PSI5IiByPSI0IiAvPjxwYXRoIGQ9Ik05IDE1Yy0yLjY3IDAtOCAxLjM0LTggNHYyaDE2di0yYzAtMi42Ni01LjMzLTQtOC00em03Ljc2LTkuNjRsLTEuNjggMS42OWMuODQgMS4xOC44NCAyLjcxIDAgMy44OWwxLjY4IDEuNjljMi4wMi0yLjAyIDIuMDItNS4wNyAwLTcuMjd6TTIwLjA3IDJsLTEuNjMgMS42M2MyLjc3IDMuMDIgMi43NyA3LjU2IDAgMTAuNzRMMjAuMDcgMTZjMy45LTMuODkgMy45MS05Ljk1IDAtMTR6IiAvPjwvZz4KPGcgaWQ9InJlZGVlbSI+PHBhdGggZD0iTTIwIDZoLTIuMThjLjExLS4zMS4xOC0uNjUuMTgtMSAwLTEuNjYtMS4zNC0zLTMtMy0xLjA1IDAtMS45Ni41NC0yLjUgMS4zNWwtLjUuNjctLjUtLjY4QzEwLjk2IDIuNTQgMTAuMDUgMiA5IDIgNy4zNCAyIDYgMy4zNCA2IDVjMCAuMzUuMDcuNjkuMTggMUg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS01LTJjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXpNOSA0Yy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTExIDE1SDR2LTJoMTZ2MnptMC01SDRWOGg1LjA4TDcgMTAuODMgOC42MiAxMiAxMSA4Ljc2bDEtMS4zNiAxIDEuMzZMMTUuMzggMTIgMTcgMTAuODMgMTQuOTIgOEgyMHY2eiIgLz48L2c+CjxnIGlkPSJyZWRvIj48cGF0aCBkPSJNMTguNCAxMC42QzE2LjU1IDguOTkgMTQuMTUgOCAxMS41IDhjLTQuNjUgMC04LjU4IDMuMDMtOS45NiA3LjIyTDMuOSAxNmMxLjA1LTMuMTkgNC4wNS01LjUgNy42LTUuNSAxLjk1IDAgMy43My43MiA1LjEyIDEuODhMMTMgMTZoOVY3bC0zLjYgMy42eiIgLz48L2c+CjxnIGlkPSJyZWZyZXNoIj48cGF0aCBkPSJNMTcuNjUgNi4zNUMxNi4yIDQuOSAxNC4yMSA0IDEyIDRjLTQuNDIgMC03Ljk5IDMuNTgtNy45OSA4czMuNTcgOCA3Ljk5IDhjMy43MyAwIDYuODQtMi41NSA3LjczLTZoLTIuMDhjLS44MiAyLjMzLTMuMDQgNC01LjY1IDQtMy4zMSAwLTYtMi42OS02LTZzMi42OS02IDYtNmMxLjY2IDAgMy4xNC42OSA0LjIyIDEuNzhMMTMgMTFoN1Y0bC0yLjM1IDIuMzV6IiAvPjwvZz4KPGcgaWQ9InJlbW92ZSI+PHBhdGggZD0iTTE5IDEzSDV2LTJoMTR2MnoiIC8+PC9nPgo8ZyBpZD0icmVtb3ZlLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTUgMTFIN3YtMmgxMHYyeiIgLz48L2c+CjxnIGlkPSJyZW1vdmUtY2lyY2xlLW91dGxpbmUiPjxwYXRoIGQ9Ik03IDExdjJoMTB2LTJIN3ptNS05QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiIC8+PC9nPgo8ZyBpZD0icmVtb3ZlLXNob3BwaW5nLWNhcnQiPjxwYXRoIGQ9Ik0yMi43MyAyMi43M0wyLjc3IDIuNzcgMiAybC0uNzMtLjczTDAgMi41NGw0LjM5IDQuMzkgMi4yMSA0LjY2LTEuMzUgMi40NWMtLjE2LjI4LS4yNS42MS0uMjUuOTYgMCAxLjEuOSAyIDIgMmg3LjQ2bDEuMzggMS4zOGMtLjUuMzYtLjgzLjk1LS44MyAxLjYyIDAgMS4xLjg5IDIgMS45OSAyIC42NyAwIDEuMjYtLjMzIDEuNjItLjg0TDIxLjQ2IDI0bDEuMjctMS4yN3pNNy40MiAxNWMtLjE0IDAtLjI1LS4xMS0uMjUtLjI1bC4wMy0uMTIuOS0xLjYzaDIuMzZsMiAySDcuNDJ6bTguMTMtMmMuNzUgMCAxLjQxLS40MSAxLjc1LTEuMDNsMy41OC02LjQ5Yy4wOC0uMTQuMTItLjMxLjEyLS40OCAwLS41NS0uNDUtMS0xLTFINi41NGw5LjAxIDl6TTcgMThjLTEuMSAwLTEuOTkuOS0xLjk5IDJTNS45IDIyIDcgMjJzMi0uOSAyLTItLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9InJlb3JkZXIiPjxwYXRoIGQ9Ik0zIDE1aDE4di0ySDN2MnptMCA0aDE4di0ySDN2MnptMC04aDE4VjlIM3Yyem0wLTZ2MmgxOFY1SDN6IiAvPjwvZz4KPGcgaWQ9InJlcGx5Ij48cGF0aCBkPSJNMTAgOVY1bC03IDcgNyA3di00LjFjNSAwIDguNSAxLjYgMTEgNS4xLTEtNS00LTEwLTExLTExeiIgLz48L2c+CjxnIGlkPSJyZXBseS1hbGwiPjxwYXRoIGQ9Ik03IDhWNWwtNyA3IDcgN3YtM2wtNC00IDQtNHptNiAxVjVsLTcgNyA3IDd2LTQuMWM1IDAgOC41IDEuNiAxMSA1LjEtMS01LTQtMTAtMTEtMTF6IiAvPjwvZz4KPGcgaWQ9InJlcG9ydCI+PHBhdGggZD0iTTE1LjczIDNIOC4yN0wzIDguMjd2Ny40Nkw4LjI3IDIxaDcuNDZMMjEgMTUuNzNWOC4yN0wxNS43MyAzek0xMiAxNy4zYy0uNzIgMC0xLjMtLjU4LTEuMy0xLjMgMC0uNzIuNTgtMS4zIDEuMy0xLjMuNzIgMCAxLjMuNTggMS4zIDEuMyAwIC43Mi0uNTggMS4zLTEuMyAxLjN6bTEtNC4zaC0yVjdoMnY2eiIgLz48L2c+CjxnIGlkPSJyZXBvcnQtcHJvYmxlbSI+PHBhdGggZD0iTTEgMjFoMjJMMTIgMiAxIDIxem0xMi0zaC0ydi0yaDJ2MnptMC00aC0ydi00aDJ2NHoiIC8+PC9nPgo8ZyBpZD0icmVzdG9yZSI+PHBhdGggZD0iTTEzIDNjLTQuOTcgMC05IDQuMDMtOSA5SDFsMy44OSAzLjg5LjA3LjE0TDkgMTJINmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuOTMgMC0zLjY4LS43OS00Ljk0LTIuMDZsLTEuNDIgMS40MkM4LjI3IDE5Ljk5IDEwLjUxIDIxIDEzIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0tMSA1djVsNC4yOCAyLjU0LjcyLTEuMjEtMy41LTIuMDhWOEgxMnoiIC8+PC9nPgo8ZyBpZD0icmVzdG9yZS1wYWdlIj48cGF0aCBkPSJNMTQgMkg2Yy0xLjEgMC0xLjk5LjktMS45OSAyTDQgMjBjMCAxLjEuODkgMiAxLjk5IDJIMThjMS4xIDAgMi0uOSAyLTJWOGwtNi02em0tMiAxNmMtMi4wNSAwLTMuODEtMS4yNC00LjU4LTNoMS43MWMuNjMuOSAxLjY4IDEuNSAyLjg3IDEuNSAxLjkzIDAgMy41LTEuNTcgMy41LTMuNVMxMy45MyA5LjUgMTIgOS41Yy0xLjM1IDAtMi41Mi43OC0zLjEgMS45bDEuNiAxLjZoLTRWOWwxLjMgMS4zQzguNjkgOC45MiAxMC4yMyA4IDEyIDhjMi43NiAwIDUgMi4yNCA1IDVzLTIuMjQgNS01IDV6IiAvPjwvZz4KPGcgaWQ9InJvb20iPjxwYXRoIGQ9Ik0xMiAyQzguMTMgMiA1IDUuMTMgNSA5YzAgNS4yNSA3IDEzIDcgMTNzNy03Ljc1IDctMTNjMC0zLjg3LTMuMTMtNy03LTd6bTAgOS41Yy0xLjM4IDAtMi41LTEuMTItMi41LTIuNXMxLjEyLTIuNSAyLjUtMi41IDIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNXoiIC8+PC9nPgo8ZyBpZD0icm91bmRlZC1jb3JuZXIiPjxwYXRoIGQ9Ik0xOSAxOWgydjJoLTJ2LTJ6bTAtMmgydi0yaC0ydjJ6TTMgMTNoMnYtMkgzdjJ6bTAgNGgydi0ySDN2MnptMC04aDJWN0gzdjJ6bTAtNGgyVjNIM3Yyem00IDBoMlYzSDd2MnptOCAxNmgydi0yaC0ydjJ6bS00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyem0tOCAwaDJ2LTJIN3Yyem0tNCAwaDJ2LTJIM3Yyek0yMSA4YzAtMi43Ni0yLjI0LTUtNS01aC01djJoNWMxLjY1IDAgMyAxLjM1IDMgM3Y1aDJWOHoiIC8+PC9nPgo8ZyBpZD0icm93aW5nIj48cGF0aCBkPSJNOC41IDE0LjVMNCAxOWwxLjUgMS41TDkgMTdoMmwtMi41LTIuNXpNMTUgMWMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTYgMjAuMDFMMTggMjRsLTIuOTktMy4wMVYxOS41bC03LjEtNy4wOWMtLjMxLjA1LS42MS4wNy0uOTEuMDd2LTIuMTZjMS42Ni4wMyAzLjYxLS44NyA0LjY3LTIuMDRsMS40LTEuNTVjLjE5LS4yMS40My0uMzguNjktLjUuMjktLjE0LjYyLS4yMy45Ni0uMjNoLjAzQzE1Ljk5IDYuMDEgMTcgNy4wMiAxNyA4LjI2djUuNzVjMCAuODQtLjM1IDEuNjEtLjkyIDIuMTZsLTMuNTgtMy41OHYtMi4yN2MtLjYzLjUyLTEuNDMgMS4wMi0yLjI5IDEuMzlMMTYuNSAxOEgxOGwzIDMuMDF6IiAvPjwvZz4KPGcgaWQ9InNhdmUiPjxwYXRoIGQ9Ik0xNyAzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY3bC00LTR6bS01IDE2Yy0xLjY2IDAtMy0xLjM0LTMtM3MxLjM0LTMgMy0zIDMgMS4zNCAzIDMtMS4zNCAzLTMgM3ptMy0xMEg1VjVoMTB2NHoiIC8+PC9nPgo8ZyBpZD0ic2NoZWR1bGUiPjxwYXRoIGQ9Ik0xMS45OSAyQzYuNDcgMiAyIDYuNDggMiAxMnM0LjQ3IDEwIDkuOTkgMTBDMTcuNTIgMjIgMjIgMTcuNTIgMjIgMTJTMTcuNTIgMiAxMS45OSAyek0xMiAyMGMtNC40MiAwLTgtMy41OC04LThzMy41OC04IDgtOCA4IDMuNTggOCA4LTMuNTggOC04IDh6bS41LTEzSDExdjZsNS4yNSAzLjE1Ljc1LTEuMjMtNC41LTIuNjd6IiAvPjwvZz4KPGcgaWQ9InNlYXJjaCI+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6IiAvPjwvZz4KPGcgaWQ9InNlbGVjdC1hbGwiPjxwYXRoIGQ9Ik0zIDVoMlYzYy0xLjEgMC0yIC45LTIgMnptMCA4aDJ2LTJIM3Yyem00IDhoMnYtMkg3djJ6TTMgOWgyVjdIM3Yyem0xMC02aC0ydjJoMlYzem02IDB2MmgyYzAtMS4xLS45LTItMi0yek01IDIxdi0ySDNjMCAxLjEuOSAyIDIgMnptLTItNGgydi0ySDN2MnpNOSAzSDd2MmgyVjN6bTIgMThoMnYtMmgtMnYyem04LThoMnYtMmgtMnYyem0wIDhjMS4xIDAgMi0uOSAyLTJoLTJ2MnptMC0xMmgyVjdoLTJ2MnptMCA4aDJ2LTJoLTJ2MnptLTQgNGgydi0yaC0ydjJ6bTAtMTZoMlYzaC0ydjJ6TTcgMTdoMTBWN0g3djEwem0yLThoNnY2SDlWOXoiIC8+PC9nPgo8ZyBpZD0ic2VuZCI+PHBhdGggZD0iTTIuMDEgMjFMMjMgMTIgMi4wMSAzIDIgMTBsMTUgMi0xNSAyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncyI+PHBhdGggZD0iTTE5LjQzIDEyLjk4Yy4wNC0uMzIuMDctLjY0LjA3LS45OHMtLjAzLS42Ni0uMDctLjk4bDIuMTEtMS42NWMuMTktLjE1LjI0LS40Mi4xMi0uNjRsLTItMy40NmMtLjEyLS4yMi0uMzktLjMtLjYxLS4yMmwtMi40OSAxYy0uNTItLjQtMS4wOC0uNzMtMS42OS0uOThsLS4zOC0yLjY1QzE0LjQ2IDIuMTggMTQuMjUgMiAxNCAyaC00Yy0uMjUgMC0uNDYuMTgtLjQ5LjQybC0uMzggMi42NWMtLjYxLjI1LTEuMTcuNTktMS42OS45OGwtMi40OS0xYy0uMjMtLjA5LS40OSAwLS42MS4yMmwtMiAzLjQ2Yy0uMTMuMjItLjA3LjQ5LjEyLjY0bDIuMTEgMS42NWMtLjA0LjMyLS4wNy42NS0uMDcuOThzLjAzLjY2LjA3Ljk4bC0yLjExIDEuNjVjLS4xOS4xNS0uMjQuNDItLjEyLjY0bDIgMy40NmMuMTIuMjIuMzkuMy42MS4yMmwyLjQ5LTFjLjUyLjQgMS4wOC43MyAxLjY5Ljk4bC4zOCAyLjY1Yy4wMy4yNC4yNC40Mi40OS40Mmg0Yy4yNSAwIC40Ni0uMTguNDktLjQybC4zOC0yLjY1Yy42MS0uMjUgMS4xNy0uNTkgMS42OS0uOThsMi40OSAxYy4yMy4wOS40OSAwIC42MS0uMjJsMi0zLjQ2Yy4xMi0uMjIuMDctLjQ5LS4xMi0uNjRsLTIuMTEtMS42NXpNMTIgMTUuNWMtMS45MyAwLTMuNS0xLjU3LTMuNS0zLjVzMS41Ny0zLjUgMy41LTMuNSAzLjUgMS41NyAzLjUgMy41LTEuNTcgMy41LTMuNSAzLjV6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWFwcGxpY2F0aW9ucyI+PHBhdGggZD0iTTEyIDEwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptNy03SDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uOSAyLTJWNWMwLTEuMS0uODktMi0yLTJ6bS0xLjc1IDljMCAuMjMtLjAyLjQ2LS4wNS42OGwxLjQ4IDEuMTZjLjEzLjExLjE3LjMuMDguNDVsLTEuNCAyLjQyYy0uMDkuMTUtLjI3LjIxLS40My4xNWwtMS43NC0uN2MtLjM2LjI4LS43Ni41MS0xLjE4LjY5bC0uMjYgMS44NWMtLjAzLjE3LS4xOC4zLS4zNS4zaC0yLjhjLS4xNyAwLS4zMi0uMTMtLjM1LS4yOWwtLjI2LTEuODVjLS40My0uMTgtLjgyLS40MS0xLjE4LS42OWwtMS43NC43Yy0uMTYuMDYtLjM0IDAtLjQzLS4xNWwtMS40LTIuNDJjLS4wOS0uMTUtLjA1LS4zNC4wOC0uNDVsMS40OC0xLjE2Yy0uMDMtLjIzLS4wNS0uNDYtLjA1LS42OSAwLS4yMy4wMi0uNDYuMDUtLjY4bC0xLjQ4LTEuMTZjLS4xMy0uMTEtLjE3LS4zLS4wOC0uNDVsMS40LTIuNDJjLjA5LS4xNS4yNy0uMjEuNDMtLjE1bDEuNzQuN2MuMzYtLjI4Ljc2LS41MSAxLjE4LS42OWwuMjYtMS44NWMuMDMtLjE3LjE4LS4zLjM1LS4zaDIuOGMuMTcgMCAuMzIuMTMuMzUuMjlsLjI2IDEuODVjLjQzLjE4LjgyLjQxIDEuMTguNjlsMS43NC0uN2MuMTYtLjA2LjM0IDAgLjQzLjE1bDEuNCAyLjQyYy4wOS4xNS4wNS4zNC0uMDguNDVsLTEuNDggMS4xNmMuMDMuMjMuMDUuNDYuMDUuNjl6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWJhY2t1cC1yZXN0b3JlIj48cGF0aCBkPSJNMTQgMTJjMC0xLjEtLjktMi0yLTJzLTIgLjktMiAyIC45IDIgMiAyIDItLjkgMi0yem0tMi05Yy00Ljk3IDAtOSA0LjAzLTkgOUgwbDQgNCA0LTRINWMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuNTEgMC0yLjkxLS40OS00LjA2LTEuM2wtMS40MiAxLjQ0QzguMDQgMjAuMyA5Ljk0IDIxIDEyIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05eiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1ibHVldG9vdGgiPjxwYXRoIGQ9Ik0xMSAyNGgydi0yaC0ydjJ6bS00IDBoMnYtMkg3djJ6bTggMGgydi0yaC0ydjJ6bTIuNzEtMTguMjlMMTIgMGgtMXY3LjU5TDYuNDEgMyA1IDQuNDEgMTAuNTkgMTAgNSAxNS41OSA2LjQxIDE3IDExIDEyLjQxVjIwaDFsNS43MS01LjcxLTQuMy00LjI5IDQuMy00LjI5ek0xMyAzLjgzbDEuODggMS44OEwxMyA3LjU5VjMuODN6bTEuODggMTAuNDZMMTMgMTYuMTd2LTMuNzZsMS44OCAxLjg4eiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1icmlnaHRuZXNzIj48cGF0aCBkPSJNMjEgM0gzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTYuMDFIM1Y0Ljk5aDE4djE0LjAyek04IDE2aDIuNWwxLjUgMS41IDEuNS0xLjVIMTZ2LTIuNWwxLjUtMS41LTEuNS0xLjVWOGgtMi41TDEyIDYuNSAxMC41IDhIOHYyLjVMNi41IDEyIDggMTMuNVYxNnptNC03YzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzVjl6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWNlbGwiPjxwYXRoIGQ9Ik03IDI0aDJ2LTJIN3Yyem00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyek0xNiAuMDFMOCAwQzYuOSAwIDYgLjkgNiAydjE2YzAgMS4xLjkgMiAyIDJoOGMxLjEgMCAyLS45IDItMlYyYzAtMS4xLS45LTEuOTktMi0xLjk5ek0xNiAxNkg4VjRoOHYxMnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtZXRoZXJuZXQiPjxwYXRoIGQ9Ik03Ljc3IDYuNzZMNi4yMyA1LjQ4LjgyIDEybDUuNDEgNi41MiAxLjU0LTEuMjhMMy40MiAxMmw0LjM1LTUuMjR6TTcgMTNoMnYtMkg3djJ6bTEwLTJoLTJ2Mmgydi0yem0tNiAyaDJ2LTJoLTJ2MnptNi43Ny03LjUybC0xLjU0IDEuMjhMMjAuNTggMTJsLTQuMzUgNS4yNCAxLjU0IDEuMjhMMjMuMTggMTJsLTUuNDEtNi41MnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtaW5wdXQtYW50ZW5uYSI+PHBhdGggZD0iTTEyIDVjLTMuODcgMC03IDMuMTMtNyA3aDJjMC0yLjc2IDIuMjQtNSA1LTVzNSAyLjI0IDUgNWgyYzAtMy44Ny0zLjEzLTctNy03em0xIDkuMjljLjg4LS4zOSAxLjUtMS4yNiAxLjUtMi4yOSAwLTEuMzgtMS4xMi0yLjUtMi41LTIuNVM5LjUgMTAuNjIgOS41IDEyYzAgMS4wMi42MiAxLjkgMS41IDIuMjl2My4zTDcuNTkgMjEgOSAyMi40MWwzLTMgMyAzTDE2LjQxIDIxIDEzIDE3LjU5di0zLjN6TTEyIDFDNS45MyAxIDEgNS45MyAxIDEyaDJjMC00Ljk3IDQuMDMtOSA5LTlzOSA0LjAzIDkgOWgyYzAtNi4wNy00LjkzLTExLTExLTExeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1jb21wb25lbnQiPjxwYXRoIGQ9Ik01IDJjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NEgxdjZoNlY2SDVWMnptNCAxNGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThjMS4xNi0uNDEgMi0xLjUxIDItMi44MnYtMkg5djJ6bS04IDBjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4QzYuMTYgMTguNCA3IDE3LjMgNyAxNnYtMkgxdjJ6TTIxIDZWMmMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0aC0ydjZoNlY2aC0yem0tOC00YzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRIOXY2aDZWNmgtMlYyem00IDE0YzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOGMxLjE2LS40MSAyLTEuNTEgMi0yLjgydi0yaC02djJ6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWlucHV0LWNvbXBvc2l0ZSI+PHBhdGggZD0iTTUgMmMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0SDF2Nmg2VjZINVYyem00IDE0YzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOGMxLjE2LS40MSAyLTEuNTEgMi0yLjgydi0ySDl2MnptLTggMGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThDNi4xNiAxOC40IDcgMTcuMyA3IDE2di0ySDF2MnpNMjEgNlYyYzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRoLTJ2Nmg2VjZoLTJ6bS04LTRjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NEg5djZoNlY2aC0yVjJ6bTQgMTRjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4YzEuMTYtLjQxIDItMS41MSAyLTIuODJ2LTJoLTZ2MnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtaW5wdXQtaGRtaSI+PHBhdGggZD0iTTE4IDdWNGMwLTEuMS0uOS0yLTItMkg4Yy0xLjEgMC0yIC45LTIgMnYzSDV2NmwzIDZ2M2g4di0zbDMtNlY3aC0xek04IDRoOHYzaC0yVjVoLTF2MmgtMlY1aC0xdjJIOFY0eiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1zdmlkZW8iPjxwYXRoIGQ9Ik04IDExLjVjMC0uODMtLjY3LTEuNS0xLjUtMS41UzUgMTAuNjcgNSAxMS41IDUuNjcgMTMgNi41IDEzIDggMTIuMzMgOCAxMS41em03LTVjMC0uODMtLjY3LTEuNS0xLjUtMS41aC0zQzkuNjcgNSA5IDUuNjcgOSA2LjVTOS42NyA4IDEwLjUgOGgzYy44MyAwIDEuNS0uNjcgMS41LTEuNXpNOC41IDE1Yy0uODMgMC0xLjUuNjctMS41IDEuNVM3LjY3IDE4IDguNSAxOHMxLjUtLjY3IDEuNS0xLjVTOS4zMyAxNSA4LjUgMTV6TTEyIDFDNS45MyAxIDEgNS45MyAxIDEyczQuOTMgMTEgMTEgMTEgMTEtNC45MyAxMS0xMVMxOC4wNyAxIDEyIDF6bTAgMjBjLTQuOTYgMC05LTQuMDQtOS05czQuMDQtOSA5LTkgOSA0LjA0IDkgOS00LjA0IDktOSA5em01LjUtMTFjLS44MyAwLTEuNS42Ny0xLjUgMS41cy42NyAxLjUgMS41IDEuNSAxLjUtLjY3IDEuNS0xLjUtLjY3LTEuNS0xLjUtMS41em0tMiA1Yy0uODMgMC0xLjUuNjctMS41IDEuNXMuNjcgMS41IDEuNSAxLjUgMS41LS42NyAxLjUtMS41LS42Ny0xLjUtMS41LTEuNXoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3Mtb3ZlcnNjYW4iPjxwYXRoIGQ9Ik0xMi4wMSA1LjVMMTAgOGg0bC0xLjk5LTIuNXpNMTggMTB2NGwyLjUtMS45OUwxOCAxMHpNNiAxMGwtMi41IDIuMDFMNiAxNHYtNHptOCA2aC00bDIuMDEgMi41TDE0IDE2em03LTEzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOTloMTh2MTQuMDJ6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLXBob25lIj48cGF0aCBkPSJNMTMgOWgtMnYyaDJWOXptNCAwaC0ydjJoMlY5em0zIDYuNWMtMS4yNSAwLTIuNDUtLjItMy41Ny0uNTctLjM1LS4xMS0uNzQtLjAzLTEuMDIuMjRsLTIuMiAyLjJjLTIuODMtMS40NC01LjE1LTMuNzUtNi41OS02LjU4bDIuMi0yLjIxYy4yOC0uMjcuMzYtLjY2LjI1LTEuMDFDOC43IDYuNDUgOC41IDUuMjUgOC41IDRjMC0uNTUtLjQ1LTEtMS0xSDRjLS41NSAwLTEgLjQ1LTEgMSAwIDkuMzkgNy42MSAxNyAxNyAxNyAuNTUgMCAxLS40NSAxLTF2LTMuNWMwLS41NS0uNDUtMS0xLTF6TTE5IDl2MmgyVjloLTJ6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLXBvd2VyIj48cGF0aCBkPSJNNyAyNGgydi0ySDd2MnptNCAwaDJ2LTJoLTJ2MnptMi0yMmgtMnYxMGgyVjJ6bTMuNTYgMi40NGwtMS40NSAxLjQ1QzE2Ljg0IDYuOTQgMTggOC44MyAxOCAxMWMwIDMuMzEtMi42OSA2LTYgNnMtNi0yLjY5LTYtNmMwLTIuMTcgMS4xNi00LjA2IDIuODgtNS4xMkw3LjQ0IDQuNDRDNS4zNiA1Ljg4IDQgOC4yOCA0IDExYzAgNC40MiAzLjU4IDggOCA4czgtMy41OCA4LThjMC0yLjcyLTEuMzYtNS4xMi0zLjQ0LTYuNTZ6TTE1IDI0aDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtcmVtb3RlIj48cGF0aCBkPSJNMTUgOUg5Yy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoNmMuNTUgMCAxLS40NSAxLTFWMTBjMC0uNTUtLjQ1LTEtMS0xem0tMyA2Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnpNNy4wNSA2LjA1bDEuNDEgMS40MUM5LjM3IDYuNTYgMTAuNjIgNiAxMiA2czIuNjMuNTYgMy41NCAxLjQ2bDEuNDEtMS40MUMxNS42OCA0Ljc4IDEzLjkzIDQgMTIgNHMtMy42OC43OC00Ljk1IDIuMDV6TTEyIDBDOC45NiAwIDYuMjEgMS4yMyA0LjIyIDMuMjJsMS40MSAxLjQxQzcuMjYgMy4wMSA5LjUxIDIgMTIgMnM0Ljc0IDEuMDEgNi4zNiAyLjY0bDEuNDEtMS40MUMxNy43OSAxLjIzIDE1LjA0IDAgMTIgMHoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3Mtdm9pY2UiPjxwYXRoIGQ9Ik03IDI0aDJ2LTJIN3Yyem01LTExYzEuNjYgMCAyLjk5LTEuMzQgMi45OS0zTDE1IDRjMC0xLjY2LTEuMzQtMy0zLTNTOSAyLjM0IDkgNHY2YzAgMS42NiAxLjM0IDMgMyAzem0tMSAxMWgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6bTQtMTRoLTEuN2MwIDMtMi41NCA1LjEtNS4zIDUuMVM2LjcgMTMgNi43IDEwSDVjMCAzLjQxIDIuNzIgNi4yMyA2IDYuNzJWMjBoMnYtMy4yOGMzLjI4LS40OSA2LTMuMzEgNi02LjcyeiIgLz48L2c+CjxnIGlkPSJzaG9wIj48cGF0aCBkPSJNMTYgNlY0YzAtMS4xMS0uODktMi0yLTJoLTRjLTEuMTEgMC0yIC44OS0yIDJ2MkgydjEzYzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjZoLTZ6bS02LTJoNHYyaC00VjR6TTkgMThWOWw3LjUgNEw5IDE4eiIgLz48L2c+CjxnIGlkPSJzaG9wLXR3byI+PHBhdGggZD0iTTMgOUgxdjExYzAgMS4xMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uODkgMi0ySDNWOXptMTUtNFYzYzAtMS4xMS0uODktMi0yLTJoLTRjLTEuMTEgMC0yIC44OS0yIDJ2Mkg1djExYzAgMS4xMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uODkgMi0yVjVoLTV6bS02LTJoNHYyaC00VjN6bTAgMTJWOGw1LjUgMy01LjUgNHoiIC8+PC9nPgo8ZyBpZD0ic2hvcHBpbmctYmFza2V0Ij48cGF0aCBkPSJNMTcuMjEgOWwtNC4zOC02LjU2Yy0uMTktLjI4LS41MS0uNDItLjgzLS40Mi0uMzIgMC0uNjQuMTQtLjgzLjQzTDYuNzkgOUgyYy0uNTUgMC0xIC40NS0xIDEgMCAuMDkuMDEuMTguMDQuMjdsMi41NCA5LjI3Yy4yMy44NCAxIDEuNDYgMS45MiAxLjQ2aDEzYy45MiAwIDEuNjktLjYyIDEuOTMtMS40NmwyLjU0LTkuMjdMMjMgMTBjMC0uNTUtLjQ1LTEtMS0xaC00Ljc5ek05IDlsMy00LjRMMTUgOUg5em0zIDhjLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyeiIgLz48L2c+CjxnIGlkPSJzaG9wcGluZy1jYXJ0Ij48cGF0aCBkPSJNNyAxOGMtMS4xIDAtMS45OS45LTEuOTkgMlM1LjkgMjIgNyAyMnMyLS45IDItMi0uOS0yLTItMnpNMSAydjJoMmwzLjYgNy41OS0xLjM1IDIuNDVjLS4xNi4yOC0uMjUuNjEtLjI1Ljk2IDAgMS4xLjkgMiAyIDJoMTJ2LTJINy40MmMtLjE0IDAtLjI1LS4xMS0uMjUtLjI1bC4wMy0uMTIuOS0xLjYzaDcuNDVjLjc1IDAgMS40MS0uNDEgMS43NS0xLjAzbDMuNTgtNi40OWMuMDgtLjE0LjEyLS4zMS4xMi0uNDggMC0uNTUtLjQ1LTEtMS0xSDUuMjFsLS45NC0ySDF6bTE2IDE2Yy0xLjEgMC0xLjk5LjktMS45OSAycy44OSAyIDEuOTkgMiAyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ic29ydCI+PHBhdGggZD0iTTMgMThoNnYtMkgzdjJ6TTMgNnYyaDE4VjZIM3ptMCA3aDEydi0ySDN2MnoiIC8+PC9nPgo8ZyBpZD0ic3BlYWtlci1ub3RlcyI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek04IDE0SDZ2LTJoMnYyem0wLTNINlY5aDJ2MnptMC0zSDZWNmgydjJ6bTcgNmgtNXYtMmg1djJ6bTMtM2gtOFY5aDh2MnptMC0zaC04VjZoOHYyeiIgLz48L2c+CjxnIGlkPSJzcGVha2VyLW5vdGVzLW9mZiI+PHBhdGggZD0iTTEwLjU0IDExbC0uNTQtLjU0TDcuNTQgOCA2IDYuNDYgMi4zOCAyLjg0IDEuMjcgMS43MyAwIDNsMi4wMSAyLjAxTDIgMjJsNC00aDlsNS43MyA1LjczTDIyIDIyLjQ2IDE3LjU0IDE4bC03LTd6TTggMTRINnYtMmgydjJ6bS0yLTNWOWwyIDJINnptMTQtOUg0LjA4TDEwIDcuOTJWNmg4djJoLTcuOTJsMSAxSDE4djJoLTQuOTJsNi45OSA2Ljk5QzIxLjE0IDE3Ljk1IDIyIDE3LjA4IDIyIDE2VjRjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9InNwZWxsY2hlY2siPjxwYXRoIGQ9Ik0xMi40NSAxNmgyLjA5TDkuNDMgM0g3LjU3TDIuNDYgMTZoMi4wOWwxLjEyLTNoNS42NGwxLjE0IDN6bS02LjAyLTVMOC41IDUuNDggMTAuNTcgMTFINi40M3ptMTUuMTYuNTlsLTguMDkgOC4wOUw5LjgzIDE2bC0xLjQxIDEuNDEgNS4wOSA1LjA5TDIzIDEzbC0xLjQxLTEuNDF6IiAvPjwvZz4KPGcgaWQ9InN0YXIiPjxwYXRoIGQ9Ik0xMiAxNy4yN0wxOC4xOCAyMWwtMS42NC03LjAzTDIyIDkuMjRsLTcuMTktLjYxTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMXoiIC8+PC9nPgo8ZyBpZD0ic3Rhci1ib3JkZXIiPjxwYXRoIGQ9Ik0yMiA5LjI0bC03LjE5LS42MkwxMiAyIDkuMTkgOC42MyAyIDkuMjRsNS40NiA0LjczTDUuODIgMjEgMTIgMTcuMjcgMTguMTggMjFsLTEuNjMtNy4wM0wyMiA5LjI0ek0xMiAxNS40bC0zLjc2IDIuMjcgMS00LjI4LTMuMzItMi44OCA0LjM4LS4zOEwxMiA2LjFsMS43MSA0LjA0IDQuMzguMzgtMy4zMiAyLjg4IDEgNC4yOEwxMiAxNS40eiIgLz48L2c+CjxnIGlkPSJzdGFyLWhhbGYiPjxwYXRoIGQ9Ik0yMiA5LjI0bC03LjE5LS42MkwxMiAyIDkuMTkgOC42MyAyIDkuMjRsNS40NiA0LjczTDUuODIgMjEgMTIgMTcuMjcgMTguMTggMjFsLTEuNjMtNy4wM0wyMiA5LjI0ek0xMiAxNS40VjYuMWwxLjcxIDQuMDQgNC4zOC4zOC0zLjMyIDIuODggMSA0LjI4TDEyIDE1LjR6IiAvPjwvZz4KPGcgaWQ9InN0YXJzIj48cGF0aCBkPSJNMTEuOTkgMkM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnptNC4yNCAxNkwxMiAxNS40NSA3Ljc3IDE4bDEuMTItNC44MS0zLjczLTMuMjMgNC45Mi0uNDJMMTIgNWwxLjkyIDQuNTMgNC45Mi40Mi0zLjczIDMuMjNMMTYuMjMgMTh6IiAvPjwvZz4KPGcgaWQ9InN0b3JlIj48cGF0aCBkPSJNMjAgNEg0djJoMTZWNHptMSAxMHYtMmwtMS01SDRsLTEgNXYyaDF2NmgxMHYtNmg0djZoMnYtNmgxem0tOSA0SDZ2LTRoNnY0eiIgLz48L2c+CjxnIGlkPSJzdWJkaXJlY3RvcnktYXJyb3ctbGVmdCI+PHBhdGggZD0iTTExIDlsMS40MiAxLjQyTDguODMgMTRIMThWNGgydjEySDguODNsMy41OSAzLjU4TDExIDIxbC02LTYgNi02eiIgLz48L2c+CjxnIGlkPSJzdWJkaXJlY3RvcnktYXJyb3ctcmlnaHQiPjxwYXRoIGQ9Ik0xOSAxNWwtNiA2LTEuNDItMS40MkwxNS4xNyAxNkg0VjRoMnYxMGg5LjE3bC0zLjU5LTMuNThMMTMgOWw2IDZ6IiAvPjwvZz4KPGcgaWQ9InN1YmplY3QiPjxwYXRoIGQ9Ik0xNCAxN0g0djJoMTB2LTJ6bTYtOEg0djJoMTZWOXpNNCAxNWgxNnYtMkg0djJ6TTQgNXYyaDE2VjVINHoiIC8+PC9nPgo8ZyBpZD0ic3VwZXJ2aXNvci1hY2NvdW50Ij48cGF0aCBkPSJNMTYuNSAxMmMxLjM4IDAgMi40OS0xLjEyIDIuNDktMi41UzE3Ljg4IDcgMTYuNSA3QzE1LjEyIDcgMTQgOC4xMiAxNCA5LjVzMS4xMiAyLjUgMi41IDIuNXpNOSAxMWMxLjY2IDAgMi45OS0xLjM0IDIuOTktM1MxMC42NiA1IDkgNUM3LjM0IDUgNiA2LjM0IDYgOHMxLjM0IDMgMyAzem03LjUgM2MtMS44MyAwLTUuNS45Mi01LjUgMi43NVYxOWgxMXYtMi4yNWMwLTEuODMtMy42Ny0yLjc1LTUuNS0yLjc1ek05IDEzYy0yLjMzIDAtNyAxLjE3LTcgMy41VjE5aDd2LTIuMjVjMC0uODUuMzMtMi4zNCAyLjM3LTMuNDdDMTAuNSAxMy4xIDkuNjYgMTMgOSAxM3oiIC8+PC9nPgo8ZyBpZD0ic3dhcC1ob3JpeiI+PHBhdGggZD0iTTYuOTkgMTFMMyAxNWwzLjk5IDR2LTNIMTR2LTJINi45OXYtM3pNMjEgOWwtMy45OS00djNIMTB2Mmg3LjAxdjNMMjEgOXoiIC8+PC9nPgo8ZyBpZD0ic3dhcC12ZXJ0Ij48cGF0aCBkPSJNMTYgMTcuMDFWMTBoLTJ2Ny4wMWgtM0wxNSAyMWw0LTMuOTloLTN6TTkgM0w1IDYuOTloM1YxNGgyVjYuOTloM0w5IDN6IiAvPjwvZz4KPGcgaWQ9InN3YXAtdmVydGljYWwtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnpNNi41IDlMMTAgNS41IDEzLjUgOUgxMXY0SDlWOUg2LjV6bTExIDZMMTQgMTguNSAxMC41IDE1SDEzdi00aDJ2NGgyLjV6IiAvPjwvZz4KPGcgaWQ9InN5c3RlbS11cGRhdGUtYWx0Ij48cGF0aCBkPSJNMTIgMTYuNWw0LTRoLTN2LTloLTJ2OUg4bDQgNHptOS0xM2gtNnYxLjk5aDZ2MTQuMDNIM1Y1LjQ5aDZWMy41SDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJ2LTE0YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJ0YWIiPjxwYXRoIGQ9Ik0yMSAzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkgzVjVoMTB2NGg4djEweiIgLz48L2c+CjxnIGlkPSJ0YWItdW5zZWxlY3RlZCI+PHBhdGggZD0iTTEgOWgyVjdIMXYyem0wIDRoMnYtMkgxdjJ6bTAtOGgyVjNjLTEuMSAwLTIgLjktMiAyem04IDE2aDJ2LTJIOXYyem0tOC00aDJ2LTJIMXYyem0yIDR2LTJIMWMwIDEuMS45IDIgMiAyek0yMSAzaC04djZoMTBWNWMwLTEuMS0uOS0yLTItMnptMCAxNGgydi0yaC0ydjJ6TTkgNWgyVjNIOXYyek01IDIxaDJ2LTJINXYyek01IDVoMlYzSDV2MnptMTYgMTZjMS4xIDAgMi0uOSAyLTJoLTJ2MnptMC04aDJ2LTJoLTJ2MnptLTggOGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6IiAvPjwvZz4KPGcgaWQ9InRleHQtZm9ybWF0Ij48cGF0aCBkPSJNNSAxN3YyaDE0di0ySDV6bTQuNS00LjJoNWwuOSAyLjJoMi4xTDEyLjc1IDRoLTEuNUw2LjUgMTVoMi4xbC45LTIuMnpNMTIgNS45OEwxMy44NyAxMWgtMy43NEwxMiA1Ljk4eiIgLz48L2c+CjxnIGlkPSJ0aGVhdGVycyI+PHBhdGggZD0iTTE4IDN2MmgtMlYzSDh2Mkg2VjNINHYxOGgydi0yaDJ2Mmg4di0yaDJ2MmgyVjNoLTJ6TTggMTdINnYtMmgydjJ6bTAtNEg2di0yaDJ2MnptMC00SDZWN2gydjJ6bTEwIDhoLTJ2LTJoMnYyem0wLTRoLTJ2LTJoMnYyem0wLTRoLTJWN2gydjJ6IiAvPjwvZz4KPGcgaWQ9InRodW1iLWRvd24iPjxwYXRoIGQ9Ik0xNSAzSDZjLS44MyAwLTEuNTQuNS0xLjg0IDEuMjJsLTMuMDIgNy4wNWMtLjA5LjIzLS4xNC40Ny0uMTQuNzN2MS45MWwuMDEuMDFMMSAxNGMwIDEuMS45IDIgMiAyaDYuMzFsLS45NSA0LjU3LS4wMy4zMmMwIC40MS4xNy43OS40NCAxLjA2TDkuODMgMjNsNi41OS02LjU5Yy4zNi0uMzYuNTgtLjg2LjU4LTEuNDFWNWMwLTEuMS0uOS0yLTItMnptNCAwdjEyaDRWM2gtNHoiIC8+PC9nPgo8ZyBpZD0idGh1bWItdXAiPjxwYXRoIGQ9Ik0xIDIxaDRWOUgxdjEyem0yMi0xMWMwLTEuMS0uOS0yLTItMmgtNi4zMWwuOTUtNC41Ny4wMy0uMzJjMC0uNDEtLjE3LS43OS0uNDQtMS4wNkwxNC4xNyAxIDcuNTkgNy41OUM3LjIyIDcuOTUgNyA4LjQ1IDcgOXYxMGMwIDEuMS45IDIgMiAyaDljLjgzIDAgMS41NC0uNSAxLjg0LTEuMjJsMy4wMi03LjA1Yy4wOS0uMjMuMTQtLjQ3LjE0LS43M3YtMS45MWwtLjAxLS4wMUwyMyAxMHoiIC8+PC9nPgo8ZyBpZD0idGh1bWJzLXVwLWRvd24iPjxwYXRoIGQ9Ik0xMiA2YzAtLjU1LS40NS0xLTEtMUg1LjgybC42Ni0zLjE4LjAyLS4yM2MwLS4zMS0uMTMtLjU5LS4zMy0uOEw1LjM4IDAgLjQ0IDQuOTRDLjE3IDUuMjEgMCA1LjU5IDAgNnY2LjVjMCAuODMuNjcgMS41IDEuNSAxLjVoNi43NWMuNjIgMCAxLjE1LS4zOCAxLjM4LS45MWwyLjI2LTUuMjljLjA3LS4xNy4xMS0uMzYuMTEtLjU1VjZ6bTEwLjUgNGgtNi43NWMtLjYyIDAtMS4xNS4zOC0xLjM4LjkxbC0yLjI2IDUuMjljLS4wNy4xNy0uMTEuMzYtLjExLjU1VjE4YzAgLjU1LjQ1IDEgMSAxaDUuMThsLS42NiAzLjE4LS4wMi4yNGMwIC4zMS4xMy41OS4zMy44bC43OS43OCA0Ljk0LTQuOTRjLjI3LS4yNy40NC0uNjUuNDQtMS4wNnYtNi41YzAtLjgzLS42Ny0xLjUtMS41LTEuNXoiIC8+PC9nPgo8ZyBpZD0idGltZWxpbmUiPjxwYXRoIGQ9Ik0yMyA4YzAgMS4xLS45IDItMiAyLS4xOCAwLS4zNS0uMDItLjUxLS4wN2wtMy41NiAzLjU1Yy4wNS4xNi4wNy4zNC4wNy41MiAwIDEuMS0uOSAyLTIgMnMtMi0uOS0yLTJjMC0uMTguMDItLjM2LjA3LS41MmwtMi41NS0yLjU1Yy0uMTYuMDUtLjM0LjA3LS41Mi4wN3MtLjM2LS4wMi0uNTItLjA3bC00LjU1IDQuNTZjLjA1LjE2LjA3LjMzLjA3LjUxIDAgMS4xLS45IDItMiAycy0yLS45LTItMiAuOS0yIDItMmMuMTggMCAuMzUuMDIuNTEuMDdsNC41Ni00LjU1QzguMDIgOS4zNiA4IDkuMTggOCA5YzAtMS4xLjktMiAyLTJzMiAuOSAyIDJjMCAuMTgtLjAyLjM2LS4wNy41MmwyLjU1IDIuNTVjLjE2LS4wNS4zNC0uMDcuNTItLjA3cy4zNi4wMi41Mi4wN2wzLjU1LTMuNTZDMTkuMDIgOC4zNSAxOSA4LjE4IDE5IDhjMC0xLjEuOS0yIDItMnMyIC45IDIgMnoiIC8+PC9nPgo8ZyBpZD0idG9jIj48cGF0aCBkPSJNMyA5aDE0VjdIM3Yyem0wIDRoMTR2LTJIM3Yyem0wIDRoMTR2LTJIM3Yyem0xNiAwaDJ2LTJoLTJ2MnptMC0xMHYyaDJWN2gtMnptMCA2aDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0idG9kYXkiPjxwYXRoIGQ9Ik0xOSAzaC0xVjFoLTJ2Mkg4VjFINnYySDVjLTEuMTEgMC0xLjk5LjktMS45OSAyTDMgMTljMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkg1VjhoMTR2MTF6TTcgMTBoNXY1SDd6IiAvPjwvZz4KPGcgaWQ9InRvbGwiPjxwYXRoIGQ9Ik0xNSA0Yy00LjQyIDAtOCAzLjU4LTggOHMzLjU4IDggOCA4IDgtMy41OCA4LTgtMy41OC04LTgtOHptMCAxNGMtMy4zMSAwLTYtMi42OS02LTZzMi42OS02IDYtNiA2IDIuNjkgNiA2LTIuNjkgNi02IDZ6TTMgMTJjMC0yLjYxIDEuNjctNC44MyA0LTUuNjVWNC4yNkMzLjU1IDUuMTUgMSA4LjI3IDEgMTJzMi41NSA2Ljg1IDYgNy43NHYtMi4wOWMtMi4zMy0uODItNC0zLjA0LTQtNS42NXoiIC8+PC9nPgo8ZyBpZD0idG91Y2gtYXBwIj48cGF0aCBkPSJNOSAxMS4yNFY3LjVDOSA2LjEyIDEwLjEyIDUgMTEuNSA1UzE0IDYuMTIgMTQgNy41djMuNzRjMS4yMS0uODEgMi0yLjE4IDItMy43NEMxNiA1LjAxIDEzLjk5IDMgMTEuNSAzUzcgNS4wMSA3IDcuNWMwIDEuNTYuNzkgMi45MyAyIDMuNzR6bTkuODQgNC42M2wtNC41NC0yLjI2Yy0uMTctLjA3LS4zNS0uMTEtLjU0LS4xMUgxM3YtNmMwLS44My0uNjctMS41LTEuNS0xLjVTMTAgNi42NyAxMCA3LjV2MTAuNzRsLTMuNDMtLjcyYy0uMDgtLjAxLS4xNS0uMDMtLjI0LS4wMy0uMzEgMC0uNTkuMTMtLjc5LjMzbC0uNzkuOCA0Ljk0IDQuOTRjLjI3LjI3LjY1LjQ0IDEuMDYuNDRoNi43OWMuNzUgMCAxLjMzLS41NSAxLjQ0LTEuMjhsLjc1LTUuMjdjLjAxLS4wNy4wMi0uMTQuMDItLjIgMC0uNjItLjM4LTEuMTYtLjkxLTEuMzh6IiAvPjwvZz4KPGcgaWQ9InRyYWNrLWNoYW5nZXMiPjxwYXRoIGQ9Ik0xOS4wNyA0LjkzbC0xLjQxIDEuNDFDMTkuMSA3Ljc5IDIwIDkuNzkgMjAgMTJjMCA0LjQyLTMuNTggOC04IDhzLTgtMy41OC04LThjMC00LjA4IDMuMDUtNy40NCA3LTcuOTN2Mi4wMkM4LjE2IDYuNTcgNiA5LjAzIDYgMTJjMCAzLjMxIDIuNjkgNiA2IDZzNi0yLjY5IDYtNmMwLTEuNjYtLjY3LTMuMTYtMS43Ni00LjI0bC0xLjQxIDEuNDFDMTUuNTUgOS45IDE2IDEwLjkgMTYgMTJjMCAyLjIxLTEuNzkgNC00IDRzLTQtMS43OS00LTRjMC0xLjg2IDEuMjgtMy40MSAzLTMuODZ2Mi4xNGMtLjYuMzUtMSAuOTgtMSAxLjcyIDAgMS4xLjkgMiAyIDJzMi0uOSAyLTJjMC0uNzQtLjQtMS4zOC0xLTEuNzJWMmgtMUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwYzAtMi43Ni0xLjEyLTUuMjYtMi45My03LjA3eiIgLz48L2c+CjxnIGlkPSJ0cmFuc2xhdGUiPjxwYXRoIGQ9Ik0xMi44NyAxNS4wN2wtMi41NC0yLjUxLjAzLS4wM2MxLjc0LTEuOTQgMi45OC00LjE3IDMuNzEtNi41M0gxN1Y0aC03VjJIOHYySDF2MS45OWgxMS4xN0MxMS41IDcuOTIgMTAuNDQgOS43NSA5IDExLjM1IDguMDcgMTAuMzIgNy4zIDkuMTkgNi42OSA4aC0yYy43MyAxLjYzIDEuNzMgMy4xNyAyLjk4IDQuNTZsLTUuMDkgNS4wMkw0IDE5bDUtNSAzLjExIDMuMTEuNzYtMi4wNHpNMTguNSAxMGgtMkwxMiAyMmgybDEuMTItM2g0Ljc1TDIxIDIyaDJsLTQuNS0xMnptLTIuNjIgN2wxLjYyLTQuMzNMMTkuMTIgMTdoLTMuMjR6IiAvPjwvZz4KPGcgaWQ9InRyZW5kaW5nLWRvd24iPjxwYXRoIGQ9Ik0xNiAxOGwyLjI5LTIuMjktNC44OC00Ljg4LTQgNEwyIDcuNDEgMy40MSA2bDYgNiA0LTQgNi4zIDYuMjlMMjIgMTJ2NnoiIC8+PC9nPgo8ZyBpZD0idHJlbmRpbmctZmxhdCI+PHBhdGggZD0iTTIyIDEybC00LTR2M0gzdjJoMTV2M3oiIC8+PC9nPgo8ZyBpZD0idHJlbmRpbmctdXAiPjxwYXRoIGQ9Ik0xNiA2bDIuMjkgMi4yOS00Ljg4IDQuODgtNC00TDIgMTYuNTkgMy40MSAxOGw2LTYgNCA0IDYuMy02LjI5TDIyIDEyVjZ6IiAvPjwvZz4KPGcgaWQ9InR1cm5lZC1pbiI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0idHVybmVkLWluLW5vdCI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnptMCAxNWwtNS0yLjE4TDcgMThWNWgxMHYxM3oiIC8+PC9nPgo8ZyBpZD0idW5hcmNoaXZlIj48cGF0aCBkPSJNMjAuNTUgNS4yMmwtMS4zOS0xLjY4QzE4Ljg4IDMuMjEgMTguNDcgMyAxOCAzSDZjLS40NyAwLS44OC4yMS0xLjE1LjU1TDMuNDYgNS4yMkMzLjE3IDUuNTcgMyA2LjAxIDMgNi41VjE5YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjYuNWMwLS40OS0uMTctLjkzLS40NS0xLjI4ek0xMiA5LjVsNS41IDUuNUgxNHYyaC00di0ySDYuNUwxMiA5LjV6TTUuMTIgNWwuODItMWgxMmwuOTMgMUg1LjEyeiIgLz48L2c+CjxnIGlkPSJ1bmRvIj48cGF0aCBkPSJNMTIuNSA4Yy0yLjY1IDAtNS4wNS45OS02LjkgMi42TDIgN3Y5aDlsLTMuNjItMy42MmMxLjM5LTEuMTYgMy4xNi0xLjg4IDUuMTItMS44OCAzLjU0IDAgNi41NSAyLjMxIDcuNiA1LjVsMi4zNy0uNzhDMjEuMDggMTEuMDMgMTcuMTUgOCAxMi41IDh6IiAvPjwvZz4KPGcgaWQ9InVuZm9sZC1sZXNzIj48cGF0aCBkPSJNNy40MSAxOC41OUw4LjgzIDIwIDEyIDE2LjgzIDE1LjE3IDIwbDEuNDEtMS40MUwxMiAxNGwtNC41OSA0LjU5em05LjE4LTEzLjE4TDE1LjE3IDQgMTIgNy4xNyA4LjgzIDQgNy40MSA1LjQxIDEyIDEwbDQuNTktNC41OXoiIC8+PC9nPgo8ZyBpZD0idW5mb2xkLW1vcmUiPjxwYXRoIGQ9Ik0xMiA1LjgzTDE1LjE3IDlsMS40MS0xLjQxTDEyIDMgNy40MSA3LjU5IDguODMgOSAxMiA1Ljgzem0wIDEyLjM0TDguODMgMTVsLTEuNDEgMS40MUwxMiAyMWw0LjU5LTQuNTlMMTUuMTcgMTUgMTIgMTguMTd6IiAvPjwvZz4KPGcgaWQ9InVwZGF0ZSI+PHBhdGggZD0iTTIxIDEwLjEyaC02Ljc4bDIuNzQtMi44MmMtMi43My0yLjctNy4xNS0yLjgtOS44OC0uMS0yLjczIDIuNzEtMi43MyA3LjA4IDAgOS43OSAyLjczIDIuNzEgNy4xNSAyLjcxIDkuODggMEMxOC4zMiAxNS42NSAxOSAxNC4wOCAxOSAxMi4xaDJjMCAxLjk4LS44OCA0LjU1LTIuNjQgNi4yOS0zLjUxIDMuNDgtOS4yMSAzLjQ4LTEyLjcyIDAtMy41LTMuNDctMy41My05LjExLS4wMi0xMi41OCAzLjUxLTMuNDcgOS4xNC0zLjQ3IDEyLjY1IDBMMjEgM3Y3LjEyek0xMi41IDh2NC4yNWwzLjUgMi4wOC0uNzIgMS4yMUwxMSAxM1Y4aDEuNXoiIC8+PC9nPgo8ZyBpZD0idmVyaWZpZWQtdXNlciI+PHBhdGggZD0iTTEyIDFMMyA1djZjMCA1LjU1IDMuODQgMTAuNzQgOSAxMiA1LjE2LTEuMjYgOS02LjQ1IDktMTJWNWwtOS00em0tMiAxNmwtNC00IDEuNDEtMS40MUwxMCAxNC4xN2w2LjU5LTYuNTlMMTggOWwtOCA4eiIgLz48L2c+CjxnIGlkPSJ2aWV3LWFnZW5kYSI+PHBhdGggZD0iTTIwIDEzSDNjLS41NSAwLTEgLjQ1LTEgMXY2YzAgLjU1LjQ1IDEgMSAxaDE3Yy41NSAwIDEtLjQ1IDEtMXYtNmMwLS41NS0uNDUtMS0xLTF6bTAtMTBIM2MtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTdjLjU1IDAgMS0uNDUgMS0xVjRjMC0uNTUtLjQ1LTEtMS0xeiIgLz48L2c+CjxnIGlkPSJ2aWV3LWFycmF5Ij48cGF0aCBkPSJNNCAxOGgzVjVINHYxM3pNMTggNXYxM2gzVjVoLTN6TTggMThoOVY1SDh2MTN6IiAvPjwvZz4KPGcgaWQ9InZpZXctY2Fyb3VzZWwiPjxwYXRoIGQ9Ik03IDE5aDEwVjRIN3YxNXptLTUtMmg0VjZIMnYxMXpNMTggNnYxMWg0VjZoLTR6IiAvPjwvZz4KPGcgaWQ9InZpZXctY29sdW1uIj48cGF0aCBkPSJNMTAgMThoNVY1aC01djEzem0tNiAwaDVWNUg0djEzek0xNiA1djEzaDVWNWgtNXoiIC8+PC9nPgo8ZyBpZD0idmlldy1kYXkiPjxwYXRoIGQ9Ik0yIDIxaDE5di0zSDJ2M3pNMjAgOEgzYy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxN2MuNTUgMCAxLS40NSAxLTFWOWMwLS41NS0uNDUtMS0xLTF6TTIgM3YzaDE5VjNIMnoiIC8+PC9nPgo8ZyBpZD0idmlldy1oZWFkbGluZSI+PHBhdGggZD0iTTQgMTVoMTZ2LTJINHYyem0wIDRoMTZ2LTJINHYyem0wLThoMTZWOUg0djJ6bTAtNnYyaDE2VjVINHoiIC8+PC9nPgo8ZyBpZD0idmlldy1saXN0Ij48cGF0aCBkPSJNNCAxNGg0di00SDR2NHptMCA1aDR2LTRINHY0ek00IDloNFY1SDR2NHptNSA1aDEydi00SDl2NHptMCA1aDEydi00SDl2NHpNOSA1djRoMTJWNUg5eiIgLz48L2c+CjxnIGlkPSJ2aWV3LW1vZHVsZSI+PHBhdGggZD0iTTQgMTFoNVY1SDR2NnptMCA3aDV2LTZINHY2em02IDBoNXYtNmgtNXY2em02IDBoNXYtNmgtNXY2em0tNi03aDVWNWgtNXY2em02LTZ2Nmg1VjVoLTV6IiAvPjwvZz4KPGcgaWQ9InZpZXctcXVpbHQiPjxwYXRoIGQ9Ik0xMCAxOGg1di02aC01djZ6bS02IDBoNVY1SDR2MTN6bTEyIDBoNXYtNmgtNXY2ek0xMCA1djZoMTFWNUgxMHoiIC8+PC9nPgo8ZyBpZD0idmlldy1zdHJlYW0iPjxwYXRoIGQ9Ik00IDE4aDE3di02SDR2NnpNNCA1djZoMTdWNUg0eiIgLz48L2c+CjxnIGlkPSJ2aWV3LXdlZWsiPjxwYXRoIGQ9Ik02IDVIM2MtLjU1IDAtMSAuNDUtMSAxdjEyYzAgLjU1LjQ1IDEgMSAxaDNjLjU1IDAgMS0uNDUgMS0xVjZjMC0uNTUtLjQ1LTEtMS0xem0xNCAwaC0zYy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoM2MuNTUgMCAxLS40NSAxLTFWNmMwLS41NS0uNDUtMS0xLTF6bS03IDBoLTNjLS41NSAwLTEgLjQ1LTEgMXYxMmMwIC41NS40NSAxIDEgMWgzYy41NSAwIDEtLjQ1IDEtMVY2YzAtLjU1LS40NS0xLTEtMXoiIC8+PC9nPgo8ZyBpZD0idmlzaWJpbGl0eSI+PHBhdGggZD0iTTEyIDQuNUM3IDQuNSAyLjczIDcuNjEgMSAxMmMxLjczIDQuMzkgNiA3LjUgMTEgNy41czkuMjctMy4xMSAxMS03LjVjLTEuNzMtNC4zOS02LTcuNS0xMS03LjV6TTEyIDE3Yy0yLjc2IDAtNS0yLjI0LTUtNXMyLjI0LTUgNS01IDUgMi4yNCA1IDUtMi4yNCA1LTUgNXptMC04Yy0xLjY2IDAtMyAxLjM0LTMgM3MxLjM0IDMgMyAzIDMtMS4zNCAzLTMtMS4zNC0zLTMtM3oiIC8+PC9nPgo8ZyBpZD0idmlzaWJpbGl0eS1vZmYiPjxwYXRoIGQ9Ik0xMiA3YzIuNzYgMCA1IDIuMjQgNSA1IDAgLjY1LS4xMyAxLjI2LS4zNiAxLjgzbDIuOTIgMi45MmMxLjUxLTEuMjYgMi43LTIuODkgMy40My00Ljc1LTEuNzMtNC4zOS02LTcuNS0xMS03LjUtMS40IDAtMi43NC4yNS0zLjk4LjdsMi4xNiAyLjE2QzEwLjc0IDcuMTMgMTEuMzUgNyAxMiA3ek0yIDQuMjdsMi4yOCAyLjI4LjQ2LjQ2QzMuMDggOC4zIDEuNzggMTAuMDIgMSAxMmMxLjczIDQuMzkgNiA3LjUgMTEgNy41IDEuNTUgMCAzLjAzLS4zIDQuMzgtLjg0bC40Mi40MkwxOS43MyAyMiAyMSAyMC43MyAzLjI3IDMgMiA0LjI3ek03LjUzIDkuOGwxLjU1IDEuNTVjLS4wNS4yMS0uMDguNDMtLjA4LjY1IDAgMS42NiAxLjM0IDMgMyAzIC4yMiAwIC40NC0uMDMuNjUtLjA4bDEuNTUgMS41NWMtLjY3LjMzLTEuNDEuNTMtMi4yLjUzLTIuNzYgMC01LTIuMjQtNS01IDAtLjc5LjItMS41My41My0yLjJ6bTQuMzEtLjc4bDMuMTUgMy4xNS4wMi0uMTZjMC0xLjY2LTEuMzQtMy0zLTNsLS4xNy4wMXoiIC8+PC9nPgo8ZyBpZD0id2FybmluZyI+PHBhdGggZD0iTTEgMjFoMjJMMTIgMiAxIDIxem0xMi0zaC0ydi0yaDJ2MnptMC00aC0ydi00aDJ2NHoiIC8+PC9nPgo8ZyBpZD0id2F0Y2gtbGF0ZXIiPjxwYXRoIGQ9Ik0xMiAyQzYuNSAyIDIgNi41IDIgMTJzNC41IDEwIDEwIDEwIDEwLTQuNSAxMC0xMFMxNy41IDIgMTIgMnptNC4yIDE0LjJMMTEgMTNWN2gxLjV2NS4ybDQuNSAyLjctLjggMS4zeiIgLz48L2c+CjxnIGlkPSJ3ZWVrZW5kIj48cGF0aCBkPSJNMjEgMTBjLTEuMSAwLTIgLjktMiAydjNINXYtM2MwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDJ2NWMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0ydi01YzAtMS4xLS45LTItMi0yem0tMy01SDZjLTEuMSAwLTIgLjktMiAydjIuMTVjMS4xNi40MSAyIDEuNTEgMiAyLjgyVjE0aDEydi0yLjAzYzAtMS4zLjg0LTIuNCAyLTIuODJWN2MwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0id29yayI+PHBhdGggZD0iTTIwIDZoLTRWNGMwLTEuMTEtLjg5LTItMi0yaC00Yy0xLjExIDAtMiAuODktMiAydjJINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMTljMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWOGMwLTEuMTEtLjg5LTItMi0yem0tNiAwaC00VjRoNHYyeiIgLz48L2c+CjxnIGlkPSJ5b3V0dWJlLXNlYXJjaGVkLWZvciI+PHBhdGggZD0iTTE3LjAxIDE0aC0uOGwtLjI3LS4yN2MuOTgtMS4xNCAxLjU3LTIuNjEgMS41Ny00LjIzIDAtMy41OS0yLjkxLTYuNS02LjUtNi41cy02LjUgMy02LjUgNi41SDJsMy44NCA0IDQuMTYtNEg2LjUxQzYuNTEgNyA4LjUzIDUgMTEuMDEgNXM0LjUgMi4wMSA0LjUgNC41YzAgMi40OC0yLjAyIDQuNS00LjUgNC41LS42NSAwLTEuMjYtLjE0LTEuODItLjM4TDcuNzEgMTUuMWMuOTcuNTcgMi4wOS45IDMuMy45IDEuNjEgMCAzLjA4LS41OSA0LjIyLTEuNTdsLjI3LjI3di43OWw1LjAxIDQuOTlMMjIgMTlsLTQuOTktNXoiIC8+PC9nPgo8ZyBpZD0iem9vbS1pbiI+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6bTIuNS00aC0ydjJIOXYtMkg3VjloMlY3aDF2MmgydjF6IiAvPjwvZz4KPGcgaWQ9Inpvb20tb3V0Ij48cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHpNNyA5aDV2MUg3eiIgLz48L2c+CjwvZGVmcz48L3N2Zz4KPC9pcm9uLWljb25zZXQtc3ZnPgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItaWNvbi1idXR0b24iPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB6LWluZGV4OiAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwoKICAgICAgICB3aWR0aDogNDBweDsKICAgICAgICBoZWlnaHQ6IDQwcHg7CgogICAgICAgIC8qIE5PVEU6IEJvdGggdmFsdWVzIGFyZSBuZWVkZWQsIHNpbmNlIHNvbWUgcGhvbmVzIHJlcXVpcmUgdGhlIHZhbHVlIHRvIGJlIGB0cmFuc3BhcmVudGAuICovCiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CgogICAgICAgIC8qIEJlY2F1c2Ugb2YgcG9seW1lci8yNTU4LCB0aGlzIHN0eWxlIGhhcyBsb3dlciBzcGVjaWZpY2l0eSB0aGFuICogKi8KICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94ICFpbXBvcnRhbnQ7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWljb24tYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdCAjaW5rIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaWNvbi1idXR0b24taW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjY7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaWNvbi1idXR0b24tZGlzYWJsZWQtdGV4dCwgdmFyKC0tZGlzYWJsZWQtdGV4dC1jb2xvcikpOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIGN1cnNvcjogYXV0bzsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaWNvbi1idXR0b24tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICA6aG9zdCg6aG92ZXIpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pY29uLWJ1dHRvbi1ob3ZlcjsKICAgICAgfQoKICAgICAgaXJvbi1pY29uIHsKICAgICAgICAtLWlyb24taWNvbi13aWR0aDogMTAwJTsKICAgICAgICAtLWlyb24taWNvbi1oZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGlyb24taWNvbiBpZD0iaWNvbiIgc3JjPSJbW3NyY11dIiBpY29uPSJbW2ljb25dXSIgYWx0JD0iW1thbHRdXSI+PC9pcm9uLWljb24+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icnVuLWNvbG9yLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIFtjb2xvci1jbGFzcz0nbGlnaHQtYmx1ZSddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1saWdodC1ibHVlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtOTAwKTsKICAgICAgfQogICAgICBbY29sb3ItY2xhc3M9J3JlZCddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXJlZC01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXJlZC01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1yZWQtOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXJlZC05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0nZ3JlZW4nXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1ncmVlbi01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWdyZWVuLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWdyZWVuLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1ncmVlbi05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0ncHVycGxlJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXB1cnBsZS05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSd0ZWFsJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXRlYWwtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0ncGluayddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXBpbmstNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1waW5rLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXBpbmstOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXBpbmstOTAwKTsKICAgICAgfQogICAgICBbY29sb3ItY2xhc3M9J29yYW5nZSddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1vcmFuZ2UtOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0nYnJvd24nXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1icm93bi01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWJyb3duLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWJyb3duLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1icm93bi05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0naW5kaWdvJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWluZGlnby05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTkwMCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLW11bHRpLWNoZWNrYm94Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0ic2Nyb2xsYmFyLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InJ1bi1jb2xvci1zdHlsZSI+PC9zdHlsZT4KCiAgICA8cGFwZXItaW5wdXQgaWQ9Im5hbWVzLXJlZ2V4IiBuby1sYWJlbC1mbG9hdCBsYWJlbD0iV3JpdGUgYSByZWdleCB0byBmaWx0ZXIgcnVucyIgdmFsdWU9IltbcmVnZXhdXSIgb24tYmluZC12YWx1ZS1jaGFuZ2VkPSJfZGVib3VuY2VkUmVnZXhDaGFuZ2UiPjwvcGFwZXItaW5wdXQ+CiAgICA8ZGl2IGlkPSJvdXRlci1jb250YWluZXIiIGNsYXNzPSJzY3JvbGxiYXIiPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW25hbWVzTWF0Y2hpbmdSZWdleF1dIiBvbi1kb20tY2hhbmdlPSJzeW5jaHJvbml6ZUNvbG9ycyI+CiAgICAgICAgPGRpdiBjbGFzcz0ibmFtZS1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iaWNvbi1jb250YWluZXIgY2hlY2tib3gtY29udGFpbmVyIHZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciI+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjbGFzcz0iY2hlY2tib3ggdmVydGljYWwtYWxpZ24tY2VudGVyIiBpZCQ9ImNoZWNrYm94LVtbaXRlbV1dIiBuYW1lPSJbW2l0ZW1dXSIgY2hlY2tlZCQ9IltbX2lzQ2hlY2tlZChpdGVtLCBzZWxlY3Rpb25TdGF0ZS4qKV1dIiBvbi1jaGFuZ2U9Il9jaGVja2JveENoYW5nZSI+PC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaWNvbi1jb250YWluZXIgaXNvbGF0b3ItY29udGFpbmVyIHZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciI+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJyYWRpby1idXR0b24tdW5jaGVja2VkIiBjbGFzcz0iaXNvbGF0b3IgdmVydGljYWwtYWxpZ24tY2VudGVyIiBvbi10YXA9Il9pc29sYXRlTmFtZSIgbmFtZT0iW1tpdGVtXV0iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9Iml0ZW0tbGFiZWwtY29udGFpbmVyIj4KICAgICAgICAgICAgPHNwYW4+W1tpdGVtXV08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICB9CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgI291dGVyLWNvbnRhaW5lciB7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgfQogICAgICAubmFtZS1yb3cgewogICAgICAgIHBhZGRpbmctdG9wOiA1cHg7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDVweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgLyogbWFrZXMgd3JhcHBpbmcgb2YgaHlwZXJwYXJhbSBzdHJpbmdzIGJldHRlciAqLwogICAgICB9CiAgICAgIC5pY29uLWNvbnRhaW5lciB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHBhZGRpbmctbGVmdDogMnB4OwogICAgICB9CiAgICAgIC5jaGVja2JveCB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAycHg7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICB9CiAgICAgIC5pc29sYXRvciB7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICAgIHBhZGRpbmc6IDBweDsKICAgICAgfQogICAgICAuaXNvbGF0b3ItY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDZweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgIH0KICAgICAgLmNoZWNrYm94LWNvbnRhaW5lciB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAycHg7CiAgICAgIH0KICAgICAgLml0ZW0tbGFiZWwtY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDVweDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgd2lkdGg6IDBweDsgLyogaGFjayB0byBnZXQgdGhlIGZsZXgtZ3JvdyB0byB3b3JrIHByb3Blcmx5ICovCiAgICAgIH0KICAgICAgLnRvb2x0aXAtdmFsdWUtY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgfQogICAgICAudmVydGljYWwtYWxpZ24tY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CiAgICAgIC52ZXJ0aWNhbC1hbGlnbi1jb250YWluZXIgLnZlcnRpY2FsLWFsaWduLWNlbnRlciB7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICB9CiAgICAgIC52ZXJ0aWNhbC1hbGlnbi1jb250YWluZXIgLnZlcnRpY2FsLWFsaWduLXRvcCB7CiAgICAgICAgYWxpZ24tc2VsZjogc3RhcnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXdici1zdHJpbmciPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfcGFydHNdXSIgYXM9InBhcnQiPltbcGFydF1dPHdicj48L3RlbXBsYXRlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXJ1bnMtc2VsZWN0b3IiPgogIDx0ZW1wbGF0ZT4KICAgIDxwYXBlci1kaWFsb2cgd2l0aC1iYWNrZHJvcCBpZD0iZGF0YS1sb2NhdGlvbi1kaWFsb2ciPgogICAgICA8aDI+RGF0YSBMb2NhdGlvbjwvaDI+CiAgICAgIDx0Zi13YnItc3RyaW5nIHZhbHVlPSJbW2RhdGFMb2NhdGlvbl1dIiAvPgogICAgPC9wYXBlci1kaWFsb2c+CiAgICA8ZGl2IGlkPSJ0b3AtdGV4dCI+CiAgICAgIDxoMyBpZD0idG9vbHRpcC1oZWxwIiBjbGFzcz0idG9vbHRpcC1jb250YWluZXIiPlJ1bnM8L2gzPgogICAgPC9kaXY+CiAgICA8dGYtbXVsdGktY2hlY2tib3ggaWQ9Im11bHRpQ2hlY2tib3giIG5hbWVzPSJbW3J1bnNdXSIgc2VsZWN0aW9uLXN0YXRlPSJ7e3J1blNlbGVjdGlvblN0YXRlfX0iIG91dC1zZWxlY3RlZD0ie3tzZWxlY3RlZFJ1bnN9fSIgcmVnZXg9Int7cmVnZXhJbnB1dH19IiBjb2xvcmluZz0iW1tjb2xvcmluZ11dIj48L3RmLW11bHRpLWNoZWNrYm94PgogICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIGlkPSJ0b2dnbGUtYWxsIiBvbi10YXA9Il90b2dnbGVBbGwiPgogICAgICBUb2dnbGUgQWxsIFJ1bnMKICAgIDwvcGFwZXItYnV0dG9uPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2RhdGFMb2NhdGlvbl1dIj4KICAgICAgPGRpdiBpZD0iZGF0YS1sb2NhdGlvbiI+CiAgICAgICAgPHRmLXdici1zdHJpbmcgdmFsdWU9IltbX2NsaXBwZWREYXRhTG9jYXRpb25dXSIgLz48dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nob3VsZFNob3dFeHBhbmREYXRhTG9jYXRpb25CdXR0b24oZGF0YUxvY2F0aW9uLCBfZGF0YUxvY2F0aW9uQ2xpcExlbmd0aCldXSI+PGEgaHJlZj0iIiBvbi1jbGljaz0iX29wZW5EYXRhTG9jYXRpb25EaWFsb2ciPuKApjwvYT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTBweDsKICAgICAgfQogICAgICAjdG9wLXRleHQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxNnB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktODAwKTsKICAgICAgfQogICAgICB0Zi1tdWx0aS1jaGVja2JveCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAueC1idXR0b24gewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtaGVscCB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktODAwKTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICB9CiAgICAgIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgIH0KICAgICAgI2RhdGEtbG9jYXRpb24gewogICAgICAgIGNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIG1hcmdpbjogNXB4IDAgMCAwOwogICAgICAgIG1heC13aWR0aDogMjg4cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1zcGlubmVyLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAvKgogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgIC8qIFNUWUxFUyBGT1IgVEhFIFNQSU5ORVIgKi8KICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgICAgLyoKICAgICAgICogQ29uc3RhbnRzOgogICAgICAgKiAgICAgIEFSQ1NJWkUgICAgID0gMjcwIGRlZ3JlZXMgKGFtb3VudCBvZiBjaXJjbGUgdGhlIGFyYyB0YWtlcyB1cCkKICAgICAgICogICAgICBBUkNUSU1FICAgICA9IDEzMzNtcyAodGltZSBpdCB0YWtlcyB0byBleHBhbmQgYW5kIGNvbnRyYWN0IGFyYykKICAgICAgICogICAgICBBUkNTVEFSVFJPVCA9IDIxNiBkZWdyZWVzIChob3cgbXVjaCB0aGUgc3RhcnQgbG9jYXRpb24gb2YgdGhlIGFyYwogICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIHJvdGF0ZSBlYWNoIHRpbWUsIDIxNiBnaXZlcyB1cyBhCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1IHBvaW50ZWQgc3RhciBzaGFwZSAoaXQncyAzNjAvNSAqIDMpLgogICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGEgNyBwb2ludGVkIHN0YXIsIHdlIG1pZ2h0IGRvCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNjAvNyAqIDMgPSAxNTQuMjg2KQogICAgICAgKiAgICAgIFNIUklOS19USU1FID0gNDAwbXMKICAgICAgICovCgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMjhweDsKICAgICAgICBoZWlnaHQ6IDI4cHg7CgogICAgICAgIC8qIDM2MCAqIEFSQ1RJTUUgLyAoQVJDU1RBUlRST1QgKyAoMzYwLUFSQ1NJWkUpKSAqLwogICAgICAgIC0tcGFwZXItc3Bpbm5lci1jb250YWluZXItcm90YXRpb24tZHVyYXRpb246IDE1NjhtczsKCiAgICAgICAgLyogQVJDVElNRSAqLwogICAgICAgIC0tcGFwZXItc3Bpbm5lci1leHBhbmQtY29udHJhY3QtZHVyYXRpb246IDEzMzNtczsKCiAgICAgICAgLyogNCAqIEFSQ1RJTUUgKi8KICAgICAgICAtLXBhcGVyLXNwaW5uZXItZnVsbC1jeWNsZS1kdXJhdGlvbjogNTMzMm1zOwoKICAgICAgICAvKiBTSFJJTktfVElNRSAqLwogICAgICAgIC0tcGFwZXItc3Bpbm5lci1jb29sZG93bi1kdXJhdGlvbjogNDAwbXM7CiAgICAgIH0KCiAgICAgICNzcGlubmVyQ29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CgogICAgICAgIC8qIFRoZSBzcGlubmVyIGRvZXMgbm90IGhhdmUgYW55IGNvbnRlbnRzIHRoYXQgd291bGQgaGF2ZSB0byBiZQogICAgICAgICAqIGZsaXBwZWQgaWYgdGhlIGRpcmVjdGlvbiBjaGFuZ2VzLiBBbHdheXMgdXNlIGx0ciBzbyB0aGF0IHRoZQogICAgICAgICAqIHN0eWxlIHdvcmtzIG91dCBjb3JyZWN0bHkgaW4gYm90aCBjYXNlcy4gKi8KICAgICAgICBkaXJlY3Rpb246IGx0cjsKICAgICAgfQoKICAgICAgI3NwaW5uZXJDb250YWluZXIuYWN0aXZlIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogY29udGFpbmVyLXJvdGF0ZSB2YXIoLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbikgbGluZWFyIGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbjogY29udGFpbmVyLXJvdGF0ZSB2YXIoLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbikgbGluZWFyIGluZmluaXRlOwogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgY29udGFpbmVyLXJvdGF0ZSB7CiAgICAgICAgdG8geyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZykgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGNvbnRhaW5lci1yb3RhdGUgewogICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKSB9CiAgICAgIH0KCiAgICAgIC5zcGlubmVyLWxheWVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNTAwKSk7CiAgICAgIH0KCiAgICAgIC5sYXllci0xIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1sYXllci0xLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS01MDApKTsKICAgICAgfQoKICAgICAgLmxheWVyLTIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWxheWVyLTItY29sb3IsIHZhcigtLWdvb2dsZS1yZWQtNTAwKSk7CiAgICAgIH0KCiAgICAgIC5sYXllci0zIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1sYXllci0zLWNvbG9yLCB2YXIoLS1nb29nbGUteWVsbG93LTUwMCkpOwogICAgICB9CgogICAgICAubGF5ZXItNCB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNwaW5uZXItbGF5ZXItNC1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZWVuLTUwMCkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogSU1QT1JUQU5UIE5PVEUgQUJPVVQgQ1NTIEFOSU1BVElPTiBQUk9QRVJUSUVTIChrZWFudWxlZSk6CiAgICAgICAqCiAgICAgICAqIGlPUyBTYWZhcmkgKHRlc3RlZCBvbiBpT1MgOC4xKSBkb2VzIG5vdCBoYW5kbGUgYW5pbWF0aW9uLWRlbGF5IHZlcnkgd2VsbCAtIGl0IGRvZXNuJ3QKICAgICAgICogZ3VhcmFudGVlIHRoYXQgdGhlIGFuaW1hdGlvbiB3aWxsIHN0YXJ0IF9leGFjdGx5XyBhZnRlciB0aGF0IHZhbHVlLiBTbyB3ZSBhdm9pZCB1c2luZwogICAgICAgKiBhbmltYXRpb24tZGVsYXkgYW5kIGluc3RlYWQgc2V0IGN1c3RvbSBrZXlmcmFtZXMgZm9yIGVhY2ggY29sb3IgKGFzIGxheWVyLTJ1bmRhbnQgYXMgaXQKICAgICAgICogc2VlbXMpLgogICAgICAgKi8KICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllciB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci1zcGlubmVyLWZ1bGwtY3ljbGUtZHVyYXRpb24pOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZTsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZnVsbC1jeWNsZS1kdXJhdGlvbik7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpOwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5hY3RpdmUgLnNwaW5uZXItbGF5ZXIubGF5ZXItMSB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlLCBsYXllci0xLWZhZGUtaW4tb3V0OwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTEtZmFkZS1pbi1vdXQ7CiAgICAgIH0KCiAgICAgIC5hY3RpdmUgLnNwaW5uZXItbGF5ZXIubGF5ZXItMiB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlLCBsYXllci0yLWZhZGUtaW4tb3V0OwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTItZmFkZS1pbi1vdXQ7CiAgICAgIH0KCiAgICAgIC5hY3RpdmUgLnNwaW5uZXItbGF5ZXIubGF5ZXItMyB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlLCBsYXllci0zLWZhZGUtaW4tb3V0OwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTMtZmFkZS1pbi1vdXQ7CiAgICAgIH0KCiAgICAgIC5hY3RpdmUgLnNwaW5uZXItbGF5ZXIubGF5ZXItNCB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlLCBsYXllci00LWZhZGUtaW4tb3V0OwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTQtZmFkZS1pbi1vdXQ7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBmaWxsLXVuZmlsbC1yb3RhdGUgewogICAgICAgIDEyLjUlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpIH0gLyogMC41ICogQVJDU0laRSAqLwogICAgICAgIDI1JSAgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpIH0gLyogMSAgICogQVJDU0laRSAqLwogICAgICAgIDM3LjUlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg0MDVkZWcpIH0gLyogMS41ICogQVJDU0laRSAqLwogICAgICAgIDUwJSAgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg1NDBkZWcpIH0gLyogMiAgICogQVJDU0laRSAqLwogICAgICAgIDYyLjUlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg2NzVkZWcpIH0gLyogMi41ICogQVJDU0laRSAqLwogICAgICAgIDc1JSAgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg4MTBkZWcpIH0gLyogMyAgICogQVJDU0laRSAqLwogICAgICAgIDg3LjUlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg5NDVkZWcpIH0gLyogMy41ICogQVJDU0laRSAqLwogICAgICAgIHRvICAgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMDgwZGVnKSB9IC8qIDQgICAqIEFSQ1NJWkUgKi8KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBmaWxsLXVuZmlsbC1yb3RhdGUgewogICAgICAgIDEyLjUlIHsgdHJhbnNmb3JtOiByb3RhdGUoMTM1ZGVnKSB9IC8qIDAuNSAqIEFSQ1NJWkUgKi8KICAgICAgICAyNSUgICB7IHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZykgfSAvKiAxICAgKiBBUkNTSVpFICovCiAgICAgICAgMzcuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSg0MDVkZWcpIH0gLyogMS41ICogQVJDU0laRSAqLwogICAgICAgIDUwJSAgIHsgdHJhbnNmb3JtOiByb3RhdGUoNTQwZGVnKSB9IC8qIDIgICAqIEFSQ1NJWkUgKi8KICAgICAgICA2Mi41JSB7IHRyYW5zZm9ybTogcm90YXRlKDY3NWRlZykgfSAvKiAyLjUgKiBBUkNTSVpFICovCiAgICAgICAgNzUlICAgeyB0cmFuc2Zvcm06IHJvdGF0ZSg4MTBkZWcpIH0gLyogMyAgICogQVJDU0laRSAqLwogICAgICAgIDg3LjUlIHsgdHJhbnNmb3JtOiByb3RhdGUoOTQ1ZGVnKSB9IC8qIDMuNSAqIEFSQ1NJWkUgKi8KICAgICAgICB0byAgICB7IHRyYW5zZm9ybTogcm90YXRlKDEwODBkZWcpIH0gLyogNCAgICogQVJDU0laRSAqLwogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbGF5ZXItMS1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICAyNSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICAyNiUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA4OSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDEgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGxheWVyLTEtZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgMjUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgMjYlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgODklIHsgb3BhY2l0eTogMCB9CiAgICAgICAgOTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAxIH0KICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGxheWVyLTItZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgMTUlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgMjUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNTElIHsgb3BhY2l0eTogMCB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBsYXllci0yLWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDE1JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDI1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDUwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDUxJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci0zLWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDQwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDUwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDc1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDc2JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItMy1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA0MCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA1MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA3NSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA3NiUgeyBvcGFjaXR5OiAwIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbGF5ZXItNC1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA2NSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA3NSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGxheWVyLTQtZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgNjUlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgNzUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgOTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgLmNpcmNsZS1jbGlwcGVyIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiA1MCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXRjaCB0aGUgZ2FwIHRoYXQgYXBwZWFyIGJldHdlZW4gdGhlIHR3byBhZGphY2VudCBkaXYuY2lyY2xlLWNsaXBwZXIgd2hpbGUgdGhlCiAgICAgICAqIHNwaW5uZXIgaXMgcm90YXRpbmcgKGFwcGVhcnMgb24gQ2hyb21lIDUwLCBTYWZhcmkgOS4xLjEsIGFuZCBFZGdlKS4KICAgICAgICovCiAgICAgIC5zcGlubmVyLWxheWVyOjphZnRlciB7CiAgICAgICAgbGVmdDogNDUlOwogICAgICAgIHdpZHRoOiAxMCU7CiAgICAgICAgYm9yZGVyLXRvcC1zdHlsZTogc29saWQ7CiAgICAgIH0KCiAgICAgIC5zcGlubmVyLWxheWVyOjphZnRlciwKICAgICAgLmNpcmNsZS1jbGlwcGVyOjphZnRlciB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvcmRlci13aWR0aDogdmFyKC0tcGFwZXItc3Bpbm5lci1zdHJva2Utd2lkdGgsIDNweCk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICB9CgogICAgICAuY2lyY2xlLWNsaXBwZXI6OmFmdGVyIHsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgd2lkdGg6IDIwMCU7CiAgICAgICAgYm9yZGVyLXN0eWxlOiBzb2xpZDsKICAgICAgICBib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuY2lyY2xlLWNsaXBwZXIubGVmdDo6YWZ0ZXIgewogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTI5ZGVnKTsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMjlkZWcpOwogICAgICB9CgogICAgICAuY2lyY2xlLWNsaXBwZXIucmlnaHQ6OmFmdGVyIHsKICAgICAgICBsZWZ0OiAtMTAwJTsKICAgICAgICBib3JkZXItbGVmdC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC0xMjlkZWcpOwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC0xMjlkZWcpOwogICAgICB9CgogICAgICAuYWN0aXZlIC5nYXAtcGF0Y2g6OmFmdGVyLAogICAgICAuYWN0aXZlIC5jaXJjbGUtY2xpcHBlcjo6YWZ0ZXIgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci1zcGlubmVyLWV4cGFuZC1jb250cmFjdC1kdXJhdGlvbik7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZXhwYW5kLWNvbnRyYWN0LWR1cmF0aW9uKTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIC5hY3RpdmUgLmNpcmNsZS1jbGlwcGVyLmxlZnQ6OmFmdGVyIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBsZWZ0LXNwaW47CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGxlZnQtc3BpbjsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuY2lyY2xlLWNsaXBwZXIucmlnaHQ6OmFmdGVyIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiByaWdodC1zcGluOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiByaWdodC1zcGluOwogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbGVmdC1zcGluIHsKICAgICAgICAwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTMwZGVnKSB9CiAgICAgICAgNTAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNWRlZykgfQogICAgICAgIHRvIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBsZWZ0LXNwaW4gewogICAgICAgIDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoMTMwZGVnKSB9CiAgICAgICAgNTAlIHsgdHJhbnNmb3JtOiByb3RhdGUoLTVkZWcpIH0KICAgICAgICB0byB7IHRyYW5zZm9ybTogcm90YXRlKDEzMGRlZykgfQogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgcmlnaHQtc3BpbiB7CiAgICAgICAgMCUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC0xMzBkZWcpIH0KICAgICAgICA1MCUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDVkZWcpIH0KICAgICAgICB0byB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIHJpZ2h0LXNwaW4gewogICAgICAgIDAlIHsgdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfQogICAgICAgIDUwJSB7IHRyYW5zZm9ybTogcm90YXRlKDVkZWcpIH0KICAgICAgICB0byB7IHRyYW5zZm9ybTogcm90YXRlKC0xMzBkZWcpIH0KICAgICAgfQoKICAgICAgI3NwaW5uZXJDb250YWluZXIuY29vbGRvd24gewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGUsIGZhZGUtb3V0IHZhcigtLXBhcGVyLXNwaW5uZXItY29vbGRvd24tZHVyYXRpb24pIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTsKICAgICAgICBhbmltYXRpb246IGNvbnRhaW5lci1yb3RhdGUgdmFyKC0tcGFwZXItc3Bpbm5lci1jb250YWluZXItcm90YXRpb24tZHVyYXRpb24pIGxpbmVhciBpbmZpbml0ZSwgZmFkZS1vdXQgdmFyKC0tcGFwZXItc3Bpbm5lci1jb29sZG93bi1kdXJhdGlvbikgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpOwogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgZmFkZS1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBmYWRlLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1zcGlubmVyLWxpdGUiPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLXNwaW5uZXItc3R5bGVzIj48L3N0eWxlPgoKICAgIDxkaXYgaWQ9InNwaW5uZXJDb250YWluZXIiIGNsYXNzLW5hbWU9IltbX19jb21wdXRlQ29udGFpbmVyQ2xhc3NlcyhhY3RpdmUsIF9fY29vbGluZ0Rvd24pXV0iIG9uLWFuaW1hdGlvbmVuZD0iX19yZXNldCIgb24td2Via2l0LWFuaW1hdGlvbi1lbmQ9Il9fcmVzZXQiPgogICAgICA8ZGl2IGNsYXNzPSJzcGlubmVyLWxheWVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciBsZWZ0Ij48L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciByaWdodCI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8c3R5bGU+Ci5wbG90dGFibGUtY29sb3JzLTAgewogIGJhY2tncm91bmQtY29sb3I6ICM1Mjc5Yzc7IC8qIElORElHTyAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0xIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmQzNzNlOyAvKiBDT1JBTF9SRUQgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtMiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzYzYzI2MTsgLyogRkVSTiAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0zIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFkNDE5OyAvKiBCUklHSFRfU1VOICovCn0KCi5wbG90dGFibGUtY29sb3JzLTQgewogIGJhY2tncm91bmQtY29sb3I6ICMyYzJiNmY7IC8qIEpBQ0FSVEEgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNSB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNzkzOTsgLyogQlVSTklOR19PUkFOR0UgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNiB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2RiMmU2NTsgLyogQ0VSSVNFX1JFRCAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy03IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTljZTUwOyAvKiBDT05JRkVSICovCn0KCi5wbG90dGFibGUtY29sb3JzLTggewogIGJhY2tncm91bmQtY29sb3I6ICM5NjI1NjU7IC8qIFJPWUFMX0hFQVRIICovCn0KCi5wbG90dGFibGUtY29sb3JzLTkgewogIGJhY2tncm91bmQtY29sb3I6ICMwNmNjY2M7IC8qIFJPQklOU19FR0dfQkxVRSAqLwp9CgovKioKICogVXNlci1zdXBwbGllZCByZW5kZXJUbyBlbGVtZW50LgogKi8KLnBsb3R0YWJsZSB7CiAgZGlzcGxheTogYmxvY2s7IC8qIG11c3QgYmUgYmxvY2sgZWxlbWVudHMgZm9yIHdpZHRoL2hlaWdodCBjYWxjdWxhdGlvbnMgdG8gd29yayBpbiBGaXJlZm94LiAqLwogIHBvaW50ZXItZXZlbnRzOiB2aXNpYmxlRmlsbDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgLyoqCiAgICogUHJlIDMuMCwgdXNlcnMgY291bGQgc2V0IHRoZSBkaW1lbnNpb24gb2YgdGhlIHJvb3QgZWxlbWVudCBpbiB0d28gd2F5czogZWl0aGVyIHVzaW5nIENTUwogICAqIChpbmxpbmUgb3IgdGhyb3VnaCBhIHN0eWxlc2hlZXQpLCBvciB1c2luZyB0aGUgU1ZHIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzLiBCeSBkZWZhdWx0LCB3ZQogICAqIHNldCB0aGUgU1ZHIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzIHRvIDEwMCUuCiAgICoKICAgKiBQb3N0IDMuMCB0aGUgcm9vdCBlbGVtZW50IGlzIGFsd2F5cyBhIG5vcm1hbCBkaXYgYW5kIHRoZSBvbmx5IHdheSB0byBzZXQgdGhlIGRpbWVuc2lvbnMgaXMKICAgKiB0byB1c2UgQ1NTLiBUbyByZXBsaWNhdGUgdGhlICIxMDAlLWJ5LWRlZmF1bHQiIGJlaGF2aW9yLCB3ZSBhcHBseSB3aWR0aC9oZWlnaHQgMTAwJS4KICAgKi8KICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7Cn0KCi8qKgogKiBUaGUgX2VsZW1lbnQgdGhhdCByb290cyBlYWNoIENvbXBvbmVudCdzIERPTS4KICovCi5wbG90dGFibGUgLmNvbXBvbmVudCB7CiAgLyogQWxsb3cgY29tcG9uZW50cyB0byBiZSBwb3NpdGlvbmVkIHdpdGggZXhwbGljaXQgbGVmdC90b3Avd2lkdGgvaGVpZ2h0IHN0eWxlcyAqLwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKfQoKLnBsb3R0YWJsZSAuYmFja2dyb3VuZC1jb250YWluZXIsCi5wbG90dGFibGUgLmNvbnRlbnQsCi5wbG90dGFibGUgLmZvcmVncm91bmQtY29udGFpbmVyIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwp9CgovKioKICogRG9uJ3QgYWxsb3cgc3ZnIGVsZW1lbnRzIGFib3ZlIHRoZSBjb250ZW50IHRvIHN0ZWFsIGV2ZW50cwogKi8KLnBsb3R0YWJsZSAuZm9yZWdyb3VuZC1jb250YWluZXIgewogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoucGxvdHRhYmxlIC5jb21wb25lbnQtb3ZlcmZsb3ctaGlkZGVuIHsKICBvdmVyZmxvdzogaGlkZGVuOwp9CgoucGxvdHRhYmxlIC5jb21wb25lbnQtb3ZlcmZsb3ctdmlzaWJsZSB7CiAgb3ZlcmZsb3c6IHZpc2libGU7Cn0KCi5wbG90dGFibGUgLnBsb3QtY2FudmFzLWNvbnRhaW5lciB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5wbG90dGFibGUgLnBsb3QtY2FudmFzIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgLyoqCiAgICogUGxheSB3ZWxsIHdpdGggZGVmZXJyZWQgcmVuZGVyaW5nLgogICAqLwogIHRyYW5zZm9ybS1vcmlnaW46IDBweCAwcHggMHB4Owp9CgoucGxvdHRhYmxlIHRleHQgewogIHRleHQtcmVuZGVyaW5nOiBnZW9tZXRyaWNQcmVjaXNpb247Cn0KCi5wbG90dGFibGUgLmxhYmVsIHRleHQgewogIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmOwogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLmJhci1sYWJlbC10ZXh0LWFyZWEgdGV4dCB7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4Owp9CgoucGxvdHRhYmxlIC5sYWJlbC1hcmVhIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxNHB4Owp9CgoucGxvdHRhYmxlIC5saWdodC1sYWJlbCB0ZXh0IHsKICBmaWxsOiB3aGl0ZTsKfQoKLnBsb3R0YWJsZSAuZGFyay1sYWJlbCB0ZXh0IHsKICBmaWxsOiAjMzIzMTNGOwp9CgoucGxvdHRhYmxlIC5vZmYtYmFyLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLnN0YWNrZWQtYmFyLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1zdHlsZTogbm9ybWFsOwp9CgoucGxvdHRhYmxlIC5zdGFja2VkLWJhci1wbG90IC5vZmYtYmFyLWxhYmVsIHsKICAvKiBIQUNLSEFDSyAjMjc5NTogY29ycmVjdCBvZmYtYmFyIGxhYmVsIGxvZ2ljIHRvIGJlIGltcGxlbWVudGVkIG9uIFN0YWNrZWRCYXIgKi8KICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKfQoKLnBsb3R0YWJsZSAuYXhpcy1sYWJlbCB0ZXh0IHsKICBmb250LXNpemU6IDEwcHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgbGV0dGVyLXNwYWNpbmc6IDFweDsKICBsaW5lLWhlaWdodDogbm9ybWFsOwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCi5wbG90dGFibGUgLnRpdGxlLWxhYmVsIHRleHQgewogIGZvbnQtc2l6ZTogMjBweDsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnBsb3R0YWJsZSAuYXhpcyBsaW5lLmJhc2VsaW5lIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLmF4aXMgbGluZS50aWNrLW1hcmsgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuYXhpcyB0ZXh0IHsKICBmaWxsOiAjMzIzMTNGOwogIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmOwogIGZvbnQtc2l6ZTogMTJweDsKICBmb250LXdlaWdodDogMjAwOwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tY2lyY2xlIHsKICBmaWxsOiB3aGl0ZTsKICBzdHJva2Utd2lkdGg6IDFweDsKICBzdHJva2U6ICNDQ0M7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tbGluZSB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5heGlzIC5hbm5vdGF0aW9uLXJlY3QgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKICBmaWxsOiB3aGl0ZTsKfQoKLnBsb3R0YWJsZSAuYmFyLXBsb3QgLmJhc2VsaW5lIHsKICBzdHJva2U6ICM5OTk7Cn0KCi5wbG90dGFibGUgLmdyaWRsaW5lcyBsaW5lIHsKICBzdHJva2U6ICMzQzNDM0M7IC8qIGhhY2toYWNrOiBncmlkbGluZXMgc2hvdWxkIGJlIHNvbGlkOyBzZWUgIzgyMCAqLwogIG9wYWNpdHk6IDAuMjU7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLnNlbGVjdGlvbi1ib3gtbGF5ZXIgLnNlbGVjdGlvbi1hcmVhIHsKICBmaWxsOiBibGFjazsKICBmaWxsLW9wYWNpdHk6IDAuMDM7CiAgc3Ryb2tlOiAjQ0NDOwp9Ci8qIERyYWdCb3hMYXllciAqLwoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZSAuZHJhZy1lZGdlLWxyIHsKICBjdXJzb3I6IGV3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci55LXJlc2l6YWJsZSAuZHJhZy1lZGdlLXRiIHsKICBjdXJzb3I6IG5zLXJlc2l6ZTsKfQoKLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLXRsIHsKICBjdXJzb3I6IG53c2UtcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci10ciB7CiAgY3Vyc29yOiBuZXN3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItYmwgewogIGN1cnNvcjogbmVzdy1yZXNpemU7Cn0KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLWJyIHsKICBjdXJzb3I6IG53c2UtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci5tb3ZhYmxlIC5zZWxlY3Rpb24tYXJlYSB7CiAgY3Vyc29yOiBtb3ZlOyAvKiBJRSBmYWxsYmFjayAqLwogIGN1cnNvcjogLW1vei1ncmFiOwogIGN1cnNvcjogLXdlYmtpdC1ncmFiOwogIGN1cnNvcjogZ3JhYjsKfQoKLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIubW92YWJsZSAuc2VsZWN0aW9uLWFyZWE6YWN0aXZlIHsKICBjdXJzb3I6IC1tb3otZ3JhYmJpbmc7CiAgY3Vyc29yOiAtd2Via2l0LWdyYWJiaW5nOwogIGN1cnNvcjogZ3JhYmJpbmc7Cn0KLyogL0RyYWdCb3hMYXllciAqLwoKLnBsb3R0YWJsZSAuZ3VpZGUtbGluZS1sYXllciBsaW5lLmd1aWRlLWxpbmUgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuZHJhZy1saW5lLWxheWVyLmVuYWJsZWQudmVydGljYWwgbGluZS5kcmFnLWVkZ2UgewogIGN1cnNvcjogZXctcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC5ob3Jpem9udGFsIGxpbmUuZHJhZy1lZGdlIHsKICBjdXJzb3I6IG5zLXJlc2l6ZTsKfQoKLnBsb3R0YWJsZSAubGVnZW5kIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLmludGVycG9sYXRlZC1jb2xvci1sZWdlbmQgcmVjdC5zd2F0Y2gtYm91bmRpbmctYm94IHsKICBmaWxsOiBub25lOwogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLnBsb3R0YWJsZSAud2F0ZXJmYWxsLXBsb3QgbGluZS5jb25uZWN0b3IgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAucGllLXBsb3QgLmFyYy5vdXRsaW5lIHsKICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwp9Cjwvc3R5bGU+Cgo8ZG9tLW1vZHVsZSBpZD0icGxvdHRhYmxlLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+Ci5wbG90dGFibGUtY29sb3JzLTAgewogIGJhY2tncm91bmQtY29sb3I6ICM1Mjc5Yzc7IC8qIElORElHTyAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0xIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmQzNzNlOyAvKiBDT1JBTF9SRUQgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtMiB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzYzYzI2MTsgLyogRkVSTiAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0zIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFkNDE5OyAvKiBCUklHSFRfU1VOICovCn0KCi5wbG90dGFibGUtY29sb3JzLTQgewogIGJhY2tncm91bmQtY29sb3I6ICMyYzJiNmY7IC8qIEpBQ0FSVEEgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNSB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNzkzOTsgLyogQlVSTklOR19PUkFOR0UgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNiB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2RiMmU2NTsgLyogQ0VSSVNFX1JFRCAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy03IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTljZTUwOyAvKiBDT05JRkVSICovCn0KCi5wbG90dGFibGUtY29sb3JzLTggewogIGJhY2tncm91bmQtY29sb3I6ICM5NjI1NjU7IC8qIFJPWUFMX0hFQVRIICovCn0KCi5wbG90dGFibGUtY29sb3JzLTkgewogIGJhY2tncm91bmQtY29sb3I6ICMwNmNjY2M7IC8qIFJPQklOU19FR0dfQkxVRSAqLwp9CgovKioKICogVXNlci1zdXBwbGllZCByZW5kZXJUbyBlbGVtZW50LgogKi8KLnBsb3R0YWJsZSB7CiAgZGlzcGxheTogYmxvY2s7IC8qIG11c3QgYmUgYmxvY2sgZWxlbWVudHMgZm9yIHdpZHRoL2hlaWdodCBjYWxjdWxhdGlvbnMgdG8gd29yayBpbiBGaXJlZm94LiAqLwogIHBvaW50ZXItZXZlbnRzOiB2aXNpYmxlRmlsbDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgLyoqCiAgICogUHJlIDMuMCwgdXNlcnMgY291bGQgc2V0IHRoZSBkaW1lbnNpb24gb2YgdGhlIHJvb3QgZWxlbWVudCBpbiB0d28gd2F5czogZWl0aGVyIHVzaW5nIENTUwogICAqIChpbmxpbmUgb3IgdGhyb3VnaCBhIHN0eWxlc2hlZXQpLCBvciB1c2luZyB0aGUgU1ZHIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzLiBCeSBkZWZhdWx0LCB3ZQogICAqIHNldCB0aGUgU1ZHIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzIHRvIDEwMCUuCiAgICoKICAgKiBQb3N0IDMuMCB0aGUgcm9vdCBlbGVtZW50IGlzIGFsd2F5cyBhIG5vcm1hbCBkaXYgYW5kIHRoZSBvbmx5IHdheSB0byBzZXQgdGhlIGRpbWVuc2lvbnMgaXMKICAgKiB0byB1c2UgQ1NTLiBUbyByZXBsaWNhdGUgdGhlICIxMDAlLWJ5LWRlZmF1bHQiIGJlaGF2aW9yLCB3ZSBhcHBseSB3aWR0aC9oZWlnaHQgMTAwJS4KICAgKi8KICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7Cn0KCi8qKgogKiBUaGUgX2VsZW1lbnQgdGhhdCByb290cyBlYWNoIENvbXBvbmVudCdzIERPTS4KICovCi5wbG90dGFibGUgLmNvbXBvbmVudCB7CiAgLyogQWxsb3cgY29tcG9uZW50cyB0byBiZSBwb3NpdGlvbmVkIHdpdGggZXhwbGljaXQgbGVmdC90b3Avd2lkdGgvaGVpZ2h0IHN0eWxlcyAqLwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKfQoKLnBsb3R0YWJsZSAuYmFja2dyb3VuZC1jb250YWluZXIsCi5wbG90dGFibGUgLmNvbnRlbnQsCi5wbG90dGFibGUgLmZvcmVncm91bmQtY29udGFpbmVyIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwp9CgovKioKICogRG9uJ3QgYWxsb3cgc3ZnIGVsZW1lbnRzIGFib3ZlIHRoZSBjb250ZW50IHRvIHN0ZWFsIGV2ZW50cwogKi8KLnBsb3R0YWJsZSAuZm9yZWdyb3VuZC1jb250YWluZXIgewogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoucGxvdHRhYmxlIC5jb21wb25lbnQtb3ZlcmZsb3ctaGlkZGVuIHsKICBvdmVyZmxvdzogaGlkZGVuOwp9CgoucGxvdHRhYmxlIC5jb21wb25lbnQtb3ZlcmZsb3ctdmlzaWJsZSB7CiAgb3ZlcmZsb3c6IHZpc2libGU7Cn0KCi5wbG90dGFibGUgLnBsb3QtY2FudmFzLWNvbnRhaW5lciB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5wbG90dGFibGUgLnBsb3QtY2FudmFzIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgLyoqCiAgICogUGxheSB3ZWxsIHdpdGggZGVmZXJyZWQgcmVuZGVyaW5nLgogICAqLwogIHRyYW5zZm9ybS1vcmlnaW46IDBweCAwcHggMHB4Owp9CgoucGxvdHRhYmxlIHRleHQgewogIHRleHQtcmVuZGVyaW5nOiBnZW9tZXRyaWNQcmVjaXNpb247Cn0KCi5wbG90dGFibGUgLmxhYmVsIHRleHQgewogIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmOwogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLmJhci1sYWJlbC10ZXh0LWFyZWEgdGV4dCB7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4Owp9CgoucGxvdHRhYmxlIC5sYWJlbC1hcmVhIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxNHB4Owp9CgoucGxvdHRhYmxlIC5saWdodC1sYWJlbCB0ZXh0IHsKICBmaWxsOiB3aGl0ZTsKfQoKLnBsb3R0YWJsZSAuZGFyay1sYWJlbCB0ZXh0IHsKICBmaWxsOiAjMzIzMTNGOwp9CgoucGxvdHRhYmxlIC5vZmYtYmFyLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLnN0YWNrZWQtYmFyLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1zdHlsZTogbm9ybWFsOwp9CgoucGxvdHRhYmxlIC5zdGFja2VkLWJhci1wbG90IC5vZmYtYmFyLWxhYmVsIHsKICAvKiBIQUNLSEFDSyAjMjc5NTogY29ycmVjdCBvZmYtYmFyIGxhYmVsIGxvZ2ljIHRvIGJlIGltcGxlbWVudGVkIG9uIFN0YWNrZWRCYXIgKi8KICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKfQoKLnBsb3R0YWJsZSAuYXhpcy1sYWJlbCB0ZXh0IHsKICBmb250LXNpemU6IDEwcHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgbGV0dGVyLXNwYWNpbmc6IDFweDsKICBsaW5lLWhlaWdodDogbm9ybWFsOwogIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Cn0KCi5wbG90dGFibGUgLnRpdGxlLWxhYmVsIHRleHQgewogIGZvbnQtc2l6ZTogMjBweDsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnBsb3R0YWJsZSAuYXhpcyBsaW5lLmJhc2VsaW5lIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLmF4aXMgbGluZS50aWNrLW1hcmsgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuYXhpcyB0ZXh0IHsKICBmaWxsOiAjMzIzMTNGOwogIGZvbnQtZmFtaWx5OiAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmOwogIGZvbnQtc2l6ZTogMTJweDsKICBmb250LXdlaWdodDogMjAwOwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tY2lyY2xlIHsKICBmaWxsOiB3aGl0ZTsKICBzdHJva2Utd2lkdGg6IDFweDsKICBzdHJva2U6ICNDQ0M7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tbGluZSB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5heGlzIC5hbm5vdGF0aW9uLXJlY3QgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKICBmaWxsOiB3aGl0ZTsKfQoKLnBsb3R0YWJsZSAuYmFyLXBsb3QgLmJhc2VsaW5lIHsKICBzdHJva2U6ICM5OTk7Cn0KCi5wbG90dGFibGUgLmdyaWRsaW5lcyBsaW5lIHsKICBzdHJva2U6ICMzQzNDM0M7IC8qIGhhY2toYWNrOiBncmlkbGluZXMgc2hvdWxkIGJlIHNvbGlkOyBzZWUgIzgyMCAqLwogIG9wYWNpdHk6IDAuMjU7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLnNlbGVjdGlvbi1ib3gtbGF5ZXIgLnNlbGVjdGlvbi1hcmVhIHsKICBmaWxsOiBibGFjazsKICBmaWxsLW9wYWNpdHk6IDAuMDM7CiAgc3Ryb2tlOiAjQ0NDOwp9Ci8qIERyYWdCb3hMYXllciAqLwoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZSAuZHJhZy1lZGdlLWxyIHsKICBjdXJzb3I6IGV3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci55LXJlc2l6YWJsZSAuZHJhZy1lZGdlLXRiIHsKICBjdXJzb3I6IG5zLXJlc2l6ZTsKfQoKLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLXRsIHsKICBjdXJzb3I6IG53c2UtcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci10ciB7CiAgY3Vyc29yOiBuZXN3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItYmwgewogIGN1cnNvcjogbmVzdy1yZXNpemU7Cn0KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLWJyIHsKICBjdXJzb3I6IG53c2UtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci5tb3ZhYmxlIC5zZWxlY3Rpb24tYXJlYSB7CiAgY3Vyc29yOiBtb3ZlOyAvKiBJRSBmYWxsYmFjayAqLwogIGN1cnNvcjogLW1vei1ncmFiOwogIGN1cnNvcjogLXdlYmtpdC1ncmFiOwogIGN1cnNvcjogZ3JhYjsKfQoKLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIubW92YWJsZSAuc2VsZWN0aW9uLWFyZWE6YWN0aXZlIHsKICBjdXJzb3I6IC1tb3otZ3JhYmJpbmc7CiAgY3Vyc29yOiAtd2Via2l0LWdyYWJiaW5nOwogIGN1cnNvcjogZ3JhYmJpbmc7Cn0KLyogL0RyYWdCb3hMYXllciAqLwoKLnBsb3R0YWJsZSAuZ3VpZGUtbGluZS1sYXllciBsaW5lLmd1aWRlLWxpbmUgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuZHJhZy1saW5lLWxheWVyLmVuYWJsZWQudmVydGljYWwgbGluZS5kcmFnLWVkZ2UgewogIGN1cnNvcjogZXctcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC5ob3Jpem9udGFsIGxpbmUuZHJhZy1lZGdlIHsKICBjdXJzb3I6IG5zLXJlc2l6ZTsKfQoKLnBsb3R0YWJsZSAubGVnZW5kIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLmludGVycG9sYXRlZC1jb2xvci1sZWdlbmQgcmVjdC5zd2F0Y2gtYm91bmRpbmctYm94IHsKICBmaWxsOiBub25lOwogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLnBsb3R0YWJsZSAud2F0ZXJmYWxsLXBsb3QgbGluZS5jb25uZWN0b3IgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAucGllLXBsb3QgLmFyYy5vdXRsaW5lIHsKICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwp9Cjwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZ6LWNoYXJ0LXRvb2x0aXAiPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZ6LXBhbi16b29tLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC5oZWxwIHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogMXM7CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAxczsKICAgICAgICBhbmltYXRpb24tbmFtZTogZmFkZS1vdXQ7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgzMCwgMzAsIDMwLCAwLjYpOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgICB0b3A6IDA7CiAgICAgIH0KCiAgICAgIC5oZWxwID4gc3BhbiB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBmYWRlLW91dCB7CiAgICAgICAgMCUgewogICAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB9CgogICAgICAgIDEwMCUgewogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idnotbGluZS1jaGFydDIiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImNoYXJ0ZGl2Ij48L2Rpdj4KICAgIDx2ei1jaGFydC10b29sdGlwIGlkPSJ0b29sdGlwIiBwb3NpdGlvbj0iW1t0b29sdGlwUG9zaXRpb25dXSIgY29udGVudC1jb21wb25lbnQtbmFtZT0idnotbGluZS1jaGFydC10b29sdGlwIj48L3Z6LWNoYXJ0LXRvb2x0aXA+CiAgICA8c3R5bGUgaW5jbHVkZT0icGxvdHRhYmxlLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZ6LXBhbi16b29tLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQogICAgICBkaXYgewogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgIH0KCiAgICAgICNjaGFydGRpdiAubWFpbiB7CiAgICAgICAgY3Vyc29yOiBjcm9zc2hhaXI7CiAgICAgIH0KCiAgICAgIDpob3N0KC5wYW5rZXkpICNjaGFydGRpdiA6bm90KC5kcmFnLXpvb21pbmcpIC5tYWluIHsKICAgICAgICBjdXJzb3I6IC13ZWJraXQtZ3JhYjsKICAgICAgICBjdXJzb3I6IGdyYWI7CiAgICAgIH0KCiAgICAgIDpob3N0KC5tb3VzZWRvd24pICNjaGFydGRpdiAucGFubmluZyAubWFpbiB7CiAgICAgICAgY3Vyc29yOiAtd2Via2l0LWdyYWJiaW5nOwogICAgICAgIGN1cnNvcjogZ3JhYmJpbmc7CiAgICAgIH0KCiAgICAgICNjaGFydGRpdiBsaW5lLmd1aWRlLWxpbmUgewogICAgICAgIHN0cm9rZTogIzk5OTsKICAgICAgICBzdHJva2Utd2lkdGg6IDEuNXB4OwogICAgICB9CiAgICAgICNjaGFydGRpdjpob3ZlciB7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgLmdob3N0IHsKICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKICAKICAKICAKPC9kb20tbW9kdWxlPgoKPGRvbS1tb2R1bGUgaWQ9InZ6LWxpbmUtY2hhcnQtdG9vbHRpcCI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0iY29udGVudCI+CiAgICAgIDx0YWJsZT4KICAgICAgICA8dGhlYWQ+PC90aGVhZD4KICAgICAgICA8dGJvZHk+PC90Ym9keT4KICAgICAgPC90YWJsZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5jb250ZW50IHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuOCk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIHRhYmxlIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNGVtOwogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICB9CgogICAgICB0aGVhZCB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CgogICAgICB0Ym9keSB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMXB4OwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgIHRkIHsKICAgICAgICBwYWRkaW5nOiAwIDVweDsKICAgICAgfQoKICAgICAgLnN3YXRjaCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMThweDsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgfQoKICAgICAgLmNsb3Nlc3QgLnN3YXRjaCB7CiAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMnB4ICNmZmY7CiAgICAgIH0KCiAgICAgIHRoIHsKICAgICAgICBwYWRkaW5nOiAwIDVweDsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CgogICAgICAuZGlzdGFudCB0ZDpub3QoLnN3YXRjaCkgewogICAgICAgIG9wYWNpdHk6IDAuODsKICAgICAgfQoKICAgICAgLmdob3N0IHsKICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0iY2hhcnQtYW5kLXNwaW5uZXItY29udGFpbmVyIj4KICAgICAgPHZ6LWxpbmUtY2hhcnQyIGlkPSJjaGFydCIgZGF0YS1sb2FkaW5nJD0iW1tkYXRhTG9hZGluZ11dIiBjb2xvci1zY2FsZT0iW1tjb2xvclNjYWxlXV0iIGRlZmF1bHQteC1yYW5nZT0iW1tkZWZhdWx0WFJhbmdlXV0iIGRlZmF1bHQteS1yYW5nZT0iW1tkZWZhdWx0WVJhbmdlXV0iIGZpbGwtYXJlYT0iW1tmaWxsQXJlYV1dIiBpZ25vcmUteS1vdXRsaWVycz0iW1tpZ25vcmVZT3V0bGllcnNdXSIgb24tY2hhcnQtYXR0YWNoZWQ9Il9vbkNoYXJ0QXR0YWNoZWQiIHNtb290aGluZy1lbmFibGVkPSJbW3Ntb290aGluZ0VuYWJsZWRdXSIgc21vb3RoaW5nLXdlaWdodD0iW1tzbW9vdGhpbmdXZWlnaHRdXSIgc3ltYm9sLWZ1bmN0aW9uPSJbW3N5bWJvbEZ1bmN0aW9uXV0iIHRvb2x0aXAtY29sdW1ucz0iW1t0b29sdGlwQ29sdW1uc11dIiB0b29sdGlwLXBvc2l0aW9uPSJbW3Rvb2x0aXBQb3NpdGlvbl1dIiB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iIHgtY29tcG9uZW50cy1jcmVhdGlvbi1tZXRob2Q9IltbeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZF1dIiB4LXR5cGU9IltbeFR5cGVdXSIgeS12YWx1ZS1hY2Nlc3Nvcj0iW1t5VmFsdWVBY2Nlc3Nvcl1dIj48L3Z6LWxpbmUtY2hhcnQyPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbZGF0YUxvYWRpbmddXSI+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZy1zcGlubmVyLWNvbnRhaW5lciI+CiAgICAgICAgICA8cGFwZXItc3Bpbm5lci1saXRlIGFjdGl2ZT48L3BhcGVyLXNwaW5uZXItbGl0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgOmhvc3QoW19tYXliZS1yZW5kZXJlZC1pbi1iYWQtc3RhdGVdKSB2ei1saW5lLWNoYXJ0IHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgICNjaGFydC1hbmQtc3Bpbm5lci1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgI2xvYWRpbmctc3Bpbm5lci1jb250YWluZXIgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgICB0b3A6IDA7CiAgICAgIH0KCiAgICAgIHZ6LWxpbmUtY2hhcnQyIHsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIH0KCiAgICAgIHZ6LWxpbmUtY2hhcnQyW2RhdGEtbG9hZGluZ10gewogICAgICAgIG9wYWNpdHk6IDAuMzsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItZGlhbG9nLXNjcm9sbGFibGUiPgoKICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXJlbGF0aXZlOwogICAgICB9CgogICAgICA6aG9zdCguaXMtc2Nyb2xsZWQ6bm90KDpmaXJzdC1jaGlsZCkpOjpiZWZvcmUgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBoZWlnaHQ6IDFweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1kaXZpZGVyLWNvbG9yKTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNhbi1zY3JvbGw6bm90KC5zY3JvbGxlZC10by1ib3R0b20pOm5vdCg6bGFzdC1jaGlsZCkpOjphZnRlciB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGhlaWdodDogMXB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRpdmlkZXItY29sb3IpOwogICAgICB9CgogICAgICAuc2Nyb2xsYWJsZSB7CiAgICAgICAgcGFkZGluZzogMCAyNHB4OwoKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtc2Nyb2xsOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy1zY3JvbGxhYmxlOwogICAgICB9CgogICAgICAuZml0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InNjcm9sbGFibGUiIGNsYXNzPSJzY3JvbGxhYmxlIiBvbi1zY3JvbGw9InVwZGF0ZVNjcm9sbFN0YXRlIj4KICAgICAgPHNsb3Q+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT4KCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1tYXJrZG93bi12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJtYXJrZG93biIgaW5uZXItaC10LW0tbD0iW1todG1sXV0iPjwvZGl2PgogICAgPHN0eWxlPgogICAgICAvKgogICAgICAgKiBSZWR1Y2UgdG9wbW9zdCBhbmQgYm90dG9tbW9zdCBtYXJnaW5zIGZyb20gMTZweCB0byAwLjNlbSAocmVuZGVycwogICAgICAgKiBhdCBhYm91dCA0LjhweCkgdG8ga2VlcCB0aGUgbGF5b3V0IGNvbXBhY3QuIFRoaXMgaW1wcm92ZXMgdGhlCiAgICAgICAqIGFwcGVhcmFuY2Ugd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBsaW5lIG9mIHRleHQ7IHN0YW5kYXJkIE1hcmtkb3duCiAgICAgICAqIHJlbmRlcmVycyB3aWxsIHN0aWxsIGluY2x1ZGUgYSBgPHA+YCBlbGVtZW50LgogICAgICAgKgogICAgICAgKiBCeSB0YXJnZXRpbmcgb25seSB0aGUgdG9wLWxldmVsLCBleHRyZW1hbCBlbGVtZW50cywgd2UgcHJlc2VydmUgYW55CiAgICAgICAqIGFjdHVhbCBwYXJhZ3JhcGggYnJlYWtzIGFuZCBvbmx5IGNoYW5nZSB0aGUgcGFkZGluZyBhZ2FpbnN0IHRoZQogICAgICAgKiBjb21wb25lbnQgZWRnZXMuCiAgICAgICAqLwogICAgICAjbWFya2Rvd24gPiBwOmZpcnN0LWNoaWxkIHsKICAgICAgICBtYXJnaW4tdG9wOiAwLjNlbTsKICAgICAgfQogICAgICAjbWFya2Rvd24gPiBwOmxhc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi1ib3R0b206IDAuM2VtOwogICAgICB9CgogICAgICAvKiBQbGVhc2FudCBzdHlsZXMgZm9yIE1hcmtkb3duIHRhYmxlcy4gKi8KICAgICAgI21hcmtkb3duIHRhYmxlIHsKICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgICB9CiAgICAgICNtYXJrZG93biB0YWJsZSB0aCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgfQogICAgICAjbWFya2Rvd24gdGFibGUgdGgsCiAgICAgICNtYXJrZG93biB0YWJsZSB0ZCB7CiAgICAgICAgcGFkZGluZzogNnB4IDEzcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RmZTJlNTsKICAgICAgfQogICAgICAjbWFya2Rvd24gdGFibGUgdHIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjNmNiZDE7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKPGRvbS1tb2R1bGUgaWQ9InRmLWNhcmQtaGVhZGluZy1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICBmaWdjYXB0aW9uIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLyoqIEhvcml6b250YWwgbGluZSBvZiBsYWJlbHMuICovCiAgICAgIC5oZWFkaW5nLXJvdyB7CiAgICAgICAgbWFyZ2luLXRvcDogLTRweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CgogICAgICAvKiogUGllY2Ugb2YgdGV4dCBpbiB0aGUgZmlndXJlIGNhcHRpb24uICovCiAgICAgIC5oZWFkaW5nLWxhYmVsIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KCiAgICAgIC8qKiBNYWtlcyBsYWJlbCBzaG93IG9uIHRoZSByaWdodC4gKi8KICAgICAgLmhlYWRpbmctcmlnaHQgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWNhcmQtaGVhZGluZyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgPGZpZ2NhcHRpb24gY2xhc3M9ImNvbnRlbnQiPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbmFtZUxhYmVsXV0iPgogICAgICAgICAgICA8ZGl2IGl0ZW1wcm9wPSJuYW1lIiBjbGFzcz0iaGVhZGluZy1sYWJlbCBuYW1lIj4KICAgICAgICAgICAgICBbW19uYW1lTGFiZWxdXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbcnVuXV0iPgogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIDxzcGFuPgogICAgICAgICAgICAgIDxzcGFuIGl0ZW1wcm9wPSJydW4iIGlkPSJoZWFkaW5nLXJ1biIgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCBydW4iPltbcnVuXV08L3NwYW4+CiAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW190YWdMYWJlbF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCI+CiAgICAgICAgICAgICAgdGFnOiA8c3BhbiBpdGVtcHJvcD0idGFnIj5bW190YWdMYWJlbF1dPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHNsb3Q+PC9zbG90PgogICAgICA8L2ZpZ2NhcHRpb24+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tkZXNjcmlwdGlvbl1dIj4KICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaW5mbyIgb24tdGFwPSJfdG9nZ2xlRGVzY3JpcHRpb25EaWFsb2ciIHRpdGxlPSJTaG93IHN1bW1hcnkgZGVzY3JpcHRpb24iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxwYXBlci1kaWFsb2cgaWQ9ImRlc2NyaXB0aW9uRGlhbG9nIiBuby1vdmVybGFwIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJhdXRvIj4KICAgICAgICA8cGFwZXItZGlhbG9nLXNjcm9sbGFibGU+CiAgICAgICAgICA8dGYtbWFya2Rvd24tdmlldyBodG1sPSJbW2Rlc2NyaXB0aW9uXV0iPjwvdGYtbWFya2Rvd24tdmlldz4KICAgICAgICA8L3BhcGVyLWRpYWxvZy1zY3JvbGxhYmxlPgogICAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDwvZGl2PgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWNhcmQtaGVhZGluZy1zdHlsZSI+CiAgICAgIC5jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KICAgICAgLmNvbnRlbnQgewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLm5hbWUgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQogICAgICAucnVuIHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIHBhZGRpbmc6IDFweCA0cHggMnB4OwogICAgICB9CiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgcGFwZXItZGlhbG9nLXNjcm9sbGFibGUgewogICAgICAgIG1heC13aWR0aDogNjQwcHg7CiAgICAgIH0KICAgICAgI2hlYWRpbmctcnVuIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Zi1jYXJkLWhlYWRpbmctYmFja2dyb3VuZC1jb2xvcik7CiAgICAgICAgY29sb3I6IHZhcigtLXRmLWNhcmQtaGVhZGluZy1jb2xvcik7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZG93bmxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQ9InRydWUiIGxhYmVsPSJydW4gdG8gZG93bmxvYWQiIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X3J1bn19Ij4KICAgICAgPHBhcGVyLWxpc3Rib3ggc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tydW5zXV0iPgogICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPltbaXRlbV1dPC9wYXBlci1pdGVtPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfcnVuXV0iPgogICAgICA8YSBkb3dubG9hZD0iW1tfY3N2TmFtZSh0YWcsIF9ydW4pXV0iIGhyZWY9IltbX2NzdlVybCh0YWcsIF9ydW4sIHVybEZuKV1dIj5DU1Y8L2E+PGEgZG93bmxvYWQ9IltbX2pzb25OYW1lKHRhZywgX3J1bildXSIgaHJlZj0iW1tfanNvblVybCh0YWcsIF9ydW4sIHVybEZuKV1dIj5KU09OPC9hPgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgIH0KICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgd2lkdGg6IDEwMHB4OwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgfQogICAgICB9CiAgICAgIGEgewogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBtYXJnaW46IDAgMC4yZW07CiAgICAgIH0KICAgICAgcGFwZXItaW5wdXQgewogICAgICAgIGZvbnQtc2l6ZTogMjJweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1zY2FsYXItY2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyB0YWc9IltbdGFnXV0iIGRpc3BsYXktbmFtZT0iW1t0YWdNZXRhZGF0YS5kaXNwbGF5TmFtZV1dIiBkZXNjcmlwdGlvbj0iW1t0YWdNZXRhZGF0YS5kZXNjcmlwdGlvbl1dIj48L3RmLWNhcmQtaGVhZGluZz4KICAgIDxkaXYgaWQ9InRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIj4KICAgICAgPHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiBjb2xvci1zY2FsZT0iW1tfZ2V0Q29sb3JTY2FsZShjb2xvclNjYWxlKV1dIiBkYXRhLXNlcmllcz0iW1tfZ2V0RGF0YVNlcmllcyhkYXRhVG9Mb2FkLiopXV0iIGRhdGEtdG8tbG9hZD0iW1tkYXRhVG9Mb2FkXV0iIGdldC1kYXRhLWxvYWQtbmFtZT0iW1tfZ2V0RGF0YUxvYWROYW1lXV0iIGdldC1kYXRhLWxvYWQtdXJsPSJbW2dldERhdGFMb2FkVXJsXV0iIHJlcXVlc3QtZGF0YT0iW1tyZXF1ZXN0RGF0YV1dIiBpZ25vcmUteS1vdXRsaWVycz0iW1tpZ25vcmVZT3V0bGllcnNdXSIgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19sb2FkRGF0YUNhbGxiYWNrXV0iIGxvYWQta2V5PSJbW3RhZ11dIiBsb2ctc2NhbGUtYWN0aXZlPSJbW19sb2dTY2FsZUFjdGl2ZV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIgc21vb3RoaW5nLWVuYWJsZWQ9Iltbc21vb3RoaW5nRW5hYmxlZF1dIiBzbW9vdGhpbmctd2VpZ2h0PSJbW3Ntb290aGluZ1dlaWdodF1dIiB0YWctbWV0YWRhdGE9IltbdGFnTWV0YWRhdGFdXSIgdG9vbHRpcC1jb2x1bW5zPSJbW190b29sdGlwQ29sdW1uc11dIiB0b29sdGlwLXBvc2l0aW9uPSJhdXRvIiB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iIHgtdHlwZT0iW1t4VHlwZV1dIj4KICAgICAgPC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJidXR0b25zIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIgaWNvbj0iZnVsbHNjcmVlbiIgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGljb249ImxpbmUtd2VpZ2h0IiBvbi10YXA9Il90b2dnbGVMb2dTY2FsZSIgdGl0bGU9IlRvZ2dsZSB5LWF4aXMgbG9nIHNjYWxlIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ic2V0dGluZ3Mtb3ZlcnNjYW4iIG9uLXRhcD0iX3Jlc2V0RG9tYWluIiB0aXRsZT0iRml0IGRvbWFpbiB0byBkYXRhIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd0Rvd25sb2FkTGlua3NdXSI+CiAgICAgICAgPHBhcGVyLW1lbnUtYnV0dG9uIG9uLXBhcGVyLWRyb3Bkb3duLW9wZW49Il91cGRhdGVEb3dubG9hZExpbmsiPgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGNsYXNzPSJkcm9wZG93bi10cmlnZ2VyIiBzbG90PSJkcm9wZG93bi10cmlnZ2VyIiBpY29uPSJmaWxlLWRvd25sb2FkIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICA8cGFwZXItaXRlbT4KICAgICAgICAgICAgICA8YSBpZD0ic3ZnTGluayIgZG93bmxvYWQ9IltbdGFnXV0uc3ZnIj4KICAgICAgICAgICAgICAgIERvd25sb2FkIEN1cnJlbnQgQ2hhcnQgYXMgU1ZHCiAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgPC9wYXBlci1tZW51LWJ1dHRvbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHNwYW4gc3R5bGU9ImZsZXgtZ3JvdzogMSI+PC9zcGFuPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd0Rvd25sb2FkTGlua3NdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZG93bmxvYWQtbGlua3MiPgogICAgICAgICAgPHRmLWRvd25sb2FkZXIgcnVucz0iW1tfcnVuc0Zyb21EYXRhKGRhdGFUb0xvYWQpXV0iIHRhZz0iW1t0YWddXSIgdXJsLWZuPSJbW19kb3dubG9hZFVybEZuXV0iPjwvdGYtZG93bmxvYWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgbWFyZ2luOiA1cHg7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDMzMHB4OwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgI3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICB9CgogICAgICAjdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjAwcHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHRmLWNhcmQtaGVhZGluZyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgfQoKICAgICAgI2J1dHRvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgYSB7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBtYXJnaW46IDJweDsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgfQoKICAgICAgcGFwZXItbWVudS1idXR0b24gewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KICAgICAgcGFwZXItaXRlbSBhIHsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXByb2dyZXNzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMjAwcHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSwgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1wcm9ncmVzcy1jb250YWluZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjcHJvZ3Jlc3NDb250YWluZXIsCiAgICAgIC8qIHRoZSBzdHJpcGUgZm9yIHRoZSBpbmRldGVybWluYXRlIGFuaW1hdGlvbiovCiAgICAgIC5pbmRldGVybWluYXRlOjphZnRlciB7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1wYXBlci1wcm9ncmVzcy1oZWlnaHQsIDRweCk7CiAgICAgIH0KCiAgICAgICNwcmltYXJ5UHJvZ3Jlc3MsCiAgICAgICNzZWNvbmRhcnlQcm9ncmVzcywKICAgICAgLmluZGV0ZXJtaW5hdGU6OmFmdGVyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICB9CgogICAgICAjcHJvZ3Jlc3NDb250YWluZXIsCiAgICAgIC5pbmRldGVybWluYXRlOjphZnRlciB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JleS0zMDApKTsKICAgICAgfQoKICAgICAgOmhvc3QoLnRyYW5zaXRpbmcpICNwcmltYXJ5UHJvZ3Jlc3MsCiAgICAgIDpob3N0KC50cmFuc2l0aW5nKSAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm07CiAgICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtOwoKICAgICAgICAvKiBEdXJhdGlvbiAqLwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi1kdXJhdGlvbiwgMC4wOHMpOwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tZHVyYXRpb24sIDAuMDhzKTsKCiAgICAgICAgLyogVGltaW5nIGZ1bmN0aW9uICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24sIGVhc2UpOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbiwgZWFzZSk7CgogICAgICAgIC8qIERlbGF5ICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLWRlbGF5LCAwcyk7CiAgICAgICAgdHJhbnNpdGlvbi1kZWxheTogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi1kZWxheSwgMHMpOwogICAgICB9CgogICAgICAjcHJpbWFyeVByb2dyZXNzLAogICAgICAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDApOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDApOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KCiAgICAgICNwcmltYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWFjdGl2ZS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZWVuLTUwMCkpOwogICAgICB9CgogICAgICAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZWVuLTEwMCkpOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjcHJpbWFyeVByb2dyZXNzIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1wcm9ncmVzcy1kaXNhYmxlZC1hY3RpdmUtY29sb3IsIHZhcigtLWdvb2dsZS1ncmV5LTUwMCkpOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWRpc2FibGVkLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZXktMzAwKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KDpub3QoW2Rpc2FibGVkXSkpICNwcmltYXJ5UHJvZ3Jlc3MuaW5kZXRlcm1pbmF0ZSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgY2VudGVyOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLWJhciB2YXIoLS1wYXBlci1wcm9ncmVzcy1pbmRldGVybWluYXRlLWN5Y2xlLWR1cmF0aW9uLCAycykgbGluZWFyIGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbjogaW5kZXRlcm1pbmF0ZS1iYXIgdmFyKC0tcGFwZXItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZS1jeWNsZS1kdXJhdGlvbiwgMnMpIGxpbmVhciBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdChbZGlzYWJsZWRdKSkgI3ByaW1hcnlQcm9ncmVzcy5pbmRldGVybWluYXRlOjphZnRlciB7CiAgICAgICAgY29udGVudDogIiI7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CgogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLXNwbGl0dGVyIHZhcigtLXBhcGVyLXByb2dyZXNzLWluZGV0ZXJtaW5hdGUtY3ljbGUtZHVyYXRpb24sIDJzKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLXNwbGl0dGVyIHZhcigtLXBhcGVyLXByb2dyZXNzLWluZGV0ZXJtaW5hdGUtY3ljbGUtZHVyYXRpb24sIDJzKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBpbmRldGVybWluYXRlLWJhciB7CiAgICAgICAgMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKC0xMDAlKTsKICAgICAgICB9CiAgICAgICAgNTAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgfQogICAgICAgIDc1JSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoLjI4LC42MiwuMzcsLjkxKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDApIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUtc3BsaXR0ZXIgewogICAgICAgIDAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKC0xMjUlKTsKICAgICAgICB9CiAgICAgICAgMzAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKC0xMjUlKTsKICAgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKC40MiwwLC42LC44KTsKICAgICAgICB9CiAgICAgICAgOTAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKDEyNSUpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKDEyNSUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBpbmRldGVybWluYXRlLWJhciB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgtMTAwJSk7CiAgICAgICAgfQogICAgICAgIDUwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICB9CiAgICAgICAgNzUlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKC4yOCwuNjIsLjM3LC45MSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMCkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUtc3BsaXR0ZXIgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgtMTI1JSk7CiAgICAgICAgfQogICAgICAgIDMwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoLTEyNSUpOwogICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKC40MiwwLC42LC44KTsKICAgICAgICB9CiAgICAgICAgOTAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgxMjUlKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoMTI1JSk7CiAgICAgICAgfQogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InByb2dyZXNzQ29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0ic2Vjb25kYXJ5UHJvZ3Jlc3MiIGhpZGRlbiQ9IltbX2hpZGVTZWNvbmRhcnlQcm9ncmVzcyhzZWNvbmRhcnlSYXRpbyldXSI+PC9kaXY+CiAgICAgIDxkaXYgaWQ9InByaW1hcnlQcm9ncmVzcyI+PC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItc2xpZGVyIj4KICA8dGVtcGxhdGUgc3RyaXAtd2hpdGVzcGFjZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtanVzdGlmaWVkOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgd2lkdGg6IDIwMHB4OwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWFjdGl2ZS1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNzAwKSk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1zZWNvbmRhcnktY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1zZWNvbmRhcnktY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTMwMCkpOwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtZGlzYWJsZWQtYWN0aXZlLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItZGlzYWJsZWQtYWN0aXZlLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtZGlzYWJsZWQtc2Vjb25kYXJ5LWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItZGlzYWJsZWQtc2Vjb25kYXJ5LWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0OiB2YXIoLS1wYXBlci1zbGlkZXItaGVpZ2h0LCAycHgpOwogICAgICB9CgogICAgICAvKiBmb2N1cyBzaG93cyB0aGUgcmlwcGxlICovCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBOT1RFKGtlYW51bGVlKTogVGhvdWdoIDpob3N0LWNvbnRleHQgaXMgbm90IHVuaXZlcnNhbGx5IHN1cHBvcnRlZCwgc29tZSBwYWdlcwogICAgICAgKiBzdGlsbCByZWx5IG9uIHBhcGVyLXNsaWRlciBiZWluZyBmbGlwcGVkIHdoZW4gZGlyPSJydGwiIGlzIHNldCBvbiBib2R5LiBGb3IgZnVsbAogICAgICAgKiBjb21wYXRhYmlsaXR5LCBkaXI9InJ0bCIgbXVzdCBiZSBleHBsaWNpdGx5IHNldCBvbiBwYXBlci1zbGlkZXIuCiAgICAgICAqLwogICAgICA6ZGlyKHJ0bCkgI3NsaWRlckNvbnRhaW5lciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgtMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLTEpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogTk9URShrZWFudWxlZSk6IFRoaXMgaXMgc2VwYXJhdGUgZnJvbSB0aGUgcnVsZSBhYm92ZSBiZWNhdXNlIDpob3N0LWNvbnRleHQgbWF5CiAgICAgICAqIG5vdCBiZSByZWNvZ25pemVkLgogICAgICAgKi8KICAgICAgOmhvc3QoW2Rpcj0icnRsIl0pICNzbGlkZXJDb250YWluZXIgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLTEpOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC0xKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE5PVEUoa2VhbnVsZWUpOiBOZWVkZWQgdG8gb3ZlcnJpZGUgdGhlIDpob3N0LWNvbnRleHQgcnVsZSAod2hlcmUgc3VwcG9ydGVkKQogICAgICAgKiB0byBzdXBwb3J0IExUUiBzbGlkZXJzIGluIFJUTCBwYWdlcy4KICAgICAgICovCiAgICAgIDpob3N0KFtkaXI9Imx0ciJdKSAjc2xpZGVyQ29udGFpbmVyIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDEpOwogICAgICB9CgogICAgICAjc2xpZGVyQ29udGFpbmVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDMwcHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpKTsKICAgICAgICBtYXJnaW4tbGVmdDogY2FsYygxNXB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IGNhbGMoMTVweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICAgIH0KCiAgICAgICNzbGlkZXJDb250YWluZXI6Zm9jdXMgewogICAgICAgIG91dGxpbmU6IDA7CiAgICAgIH0KCiAgICAgICNzbGlkZXJDb250YWluZXIuZWRpdGFibGUgewogICAgICAgIG1hcmdpbi10b3A6IDEycHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDsKICAgICAgfQoKICAgICAgLmJhci1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnJpbmcgPiAuYmFyLWNvbnRhaW5lciB7CiAgICAgICAgbGVmdDogY2FsYyg1cHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4xOHMgZWFzZTsKICAgICAgfQoKICAgICAgLnJpbmcuZXhwYW5kLmRyYWdnaW5nID4gLmJhci1jb250YWluZXIgewogICAgICAgIHRyYW5zaXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIC5yaW5nLmV4cGFuZDpub3QoLnBpbikgPiAuYmFyLWNvbnRhaW5lciB7CiAgICAgICAgbGVmdDogY2FsYyg4cHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgICB9CgogICAgICAjc2xpZGVyQmFyIHsKICAgICAgICBwYWRkaW5nOiAxNXB4IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWJhci1jb2xvciwgdHJhbnNwYXJlbnQpOwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtY29udGFpbmVyLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItY29udGFpbmVyLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpOwogICAgICB9CgogICAgICAuc2xpZGVyLW1hcmtlcnMgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IGNhbGMoMTRweCArIHZhcigtLXBhcGVyLXNsaWRlci1oZWlnaHQsMnB4KS8yKTsKICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCk7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogLTFweDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICB9CgogICAgICAuc2xpZGVyLW1hcmtlciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgIH0KICAgICAgLnNsaWRlci1tYXJrZXJzOjphZnRlciwKICAgICAgLnNsaWRlci1tYXJrZXI6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW4tbGVmdDogLTFweDsKICAgICAgICB3aWR0aDogMnB4OwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3IsICMwMDApOwogICAgICB9CgogICAgICAuc2xpZGVyLWtub2IgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgICBtYXJnaW4tbGVmdDogY2FsYygtMTVweCAtIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICAgICAgd2lkdGg6IGNhbGMoMzBweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkpOwogICAgICAgIGhlaWdodDogY2FsYygzMHB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KSk7CiAgICAgIH0KCiAgICAgIC50cmFuc2l0aW5nID4gLnNsaWRlci1rbm9iIHsKICAgICAgICB0cmFuc2l0aW9uOiBsZWZ0IDAuMDhzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYjpmb2N1cyB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgLnNsaWRlci1rbm9iLmRyYWdnaW5nIHsKICAgICAgICB0cmFuc2l0aW9uOiBub25lOwogICAgICB9CgogICAgICAuc25hcHMgPiAuc2xpZGVyLWtub2IuZHJhZ2dpbmcgewogICAgICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuMDhzIGVhc2U7CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMDhzIGVhc2U7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgICAgbWFyZ2luOiAxMHB4OwogICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgLSAyMHB4KTsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDIwcHgpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNzAwKSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwoKICAgICAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKCiAgICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm0sIGJhY2tncm91bmQtY29sb3IsIGJvcmRlcjsKICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIGJhY2tncm91bmQtY29sb3IsIGJvcmRlcjsKICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjE4czsKICAgICAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsKICAgICAgfQoKICAgICAgLmV4cGFuZDpub3QoLnBpbikgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXIgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLjUpOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS41KTsKICAgICAgfQoKICAgICAgLnJpbmcgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yLCB0cmFuc3BhcmVudCk7CiAgICAgICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICB9CgogICAgICAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNzAwKSk7CiAgICAgIH0KCiAgICAgIC5waW4gPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogIiI7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xM3B4OwogICAgICAgIHdpZHRoOiAyNnB4OwogICAgICAgIGhlaWdodDogMjZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCUgNTAlIDUwJSAwOwoKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC00NWRlZykgc2NhbGUoMCkgdHJhbnNsYXRlKDApOwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC00NWRlZykgc2NhbGUoMCkgdHJhbnNsYXRlKDApOwogICAgICB9CgogICAgICAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSwKICAgICAgLnNsaWRlci1rbm9iLWlubmVyOjphZnRlciB7CiAgICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gLjE4cyBlYXNlLCBiYWNrZ3JvdW5kLWNvbG9yIC4xOHMgZWFzZTsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gLjE4cyBlYXNlLCBiYWNrZ3JvdW5kLWNvbG9yIC4xOHMgZWFzZTsKICAgICAgfQoKICAgICAgLnBpbi5yaW5nID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjpiZWZvcmUgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgIH0KCiAgICAgIC5waW4uZXhwYW5kID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjpiZWZvcmUgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgxKSB0cmFuc2xhdGUoMTdweCwgLTE3cHgpOwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC00NWRlZykgc2NhbGUoMSkgdHJhbnNsYXRlKDE3cHgsIC0xN3B4KTsKICAgICAgfQoKICAgICAgLnBpbiA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lcjo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6IGF0dHIodmFsdWUpOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMTZweDsKICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItZm9udC1jb2xvciwgI2ZmZik7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwoKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCkgdHJhbnNsYXRlKDApOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCkgdHJhbnNsYXRlKDApOwogICAgICB9CgogICAgICAucGluLmV4cGFuZCA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lcjo6YWZ0ZXIgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKSB0cmFuc2xhdGUoMCwgLTE3cHgpOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSkgdHJhbnNsYXRlKDAsIC0xN3B4KTsKICAgICAgfQoKICAgICAgLyogcGFwZXItaW5wdXQgKi8KICAgICAgLnNsaWRlci1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDUwcHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgQGFwcGx5IC0tcGFwZXItc2xpZGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDsKICAgICAgICB9OwogICAgICAgIEBhcHBseSAtLXBhcGVyLXNsaWRlci1pbnB1dDsKICAgICAgfQoKICAgICAgLyogZGlzYWJsZWQgc3RhdGUgKi8KICAgICAgI3NsaWRlckNvbnRhaW5lci5kaXNhYmxlZCB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5kaXNhYmxlZCA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWRpc2FibGVkLWtub2ItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tcGFwZXItc2xpZGVyLWRpc2FibGVkLWtub2ItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoMC43NSwgMC43NSwgMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZTNkKDAuNzUsIDAuNzUsIDEpOwogICAgICB9CgogICAgICAuZGlzYWJsZWQucmluZyA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJzbGlkZXJDb250YWluZXIiIGNsYXNzJD0iW1tfZ2V0Q2xhc3NOYW1lcyhkaXNhYmxlZCwgcGluLCBzbmFwcywgaW1tZWRpYXRlVmFsdWUsIG1pbiwgZXhwYW5kLCBkcmFnZ2luZywgdHJhbnNpdGluZywgZWRpdGFibGUpXV0iPgogICAgICA8ZGl2IGNsYXNzPSJiYXItY29udGFpbmVyIj4KICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIGlkPSJzbGlkZXJCYXIiIGFyaWEtaGlkZGVuPSJ0cnVlIiBtaW49IltbbWluXV0iIG1heD0iW1ttYXhdXSIgc3RlcD0iW1tzdGVwXV0iIHZhbHVlPSJbW2ltbWVkaWF0ZVZhbHVlXV0iIHNlY29uZGFyeS1wcm9ncmVzcz0iW1tzZWNvbmRhcnlQcm9ncmVzc11dIiBvbi1kb3duPSJfYmFyZG93biIgb24tdXA9Il9yZXNldEtub2IiIG9uLXRyYWNrPSJfYmFydHJhY2siIG9uLXRhcD0iX2JhcmNsaWNrIj4KICAgICAgICA8L3BhcGVyLXByb2dyZXNzPgogICAgICA8L2Rpdj4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzbmFwc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItbWFya2VycyI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW21hcmtlcnNdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1tYXJrZXIiPjwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgIDxkaXYgaWQ9InNsaWRlcktub2IiIGNsYXNzPSJzbGlkZXIta25vYiIgb24tZG93bj0iX2tub2Jkb3duIiBvbi11cD0iX3Jlc2V0S25vYiIgb24tdHJhY2s9Il9vblRyYWNrIiBvbi10cmFuc2l0aW9uZW5kPSJfa25vYlRyYW5zaXRpb25FbmQiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLWtub2ItaW5uZXIiIHZhbHVlJD0iW1tpbW1lZGlhdGVWYWx1ZV1dIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbZWRpdGFibGVdXSI+CiAgICAgIDxwYXBlci1pbnB1dCBpZD0iaW5wdXQiIHR5cGU9Im51bWJlciIgc3RlcD0iW1tzdGVwXV0iIG1pbj0iW1ttaW5dXSIgbWF4PSJbW21heF1dIiBjbGFzcz0ic2xpZGVyLWlucHV0IiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdmFsdWU9IltbaW1tZWRpYXRlVmFsdWVdXSIgb24tY2hhbmdlPSJfY2hhbmdlVmFsdWUiIG9uLWtleWRvd249Il9pbnB1dEtleURvd24iIG5vLWxhYmVsLWZsb2F0PgogICAgICA8L3BhcGVyLWlucHV0PgogICAgPC90ZW1wbGF0ZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1zbW9vdGhpbmctaW5wdXQiPgogIDx0ZW1wbGF0ZT4KICAgIDxoMyBjbGFzcz0idGl0bGUiPlNtb290aGluZzwvaDM+CiAgICA8ZGl2IGNsYXNzPSJzbW9vdGhpbmctYmxvY2siPgogICAgICA8cGFwZXItc2xpZGVyIGlkPSJzbGlkZXIiIGltbWVkaWF0ZS12YWx1ZT0ie3tfaW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXJ9fSIgbWF4PSJbW21heF1dIiBtaW49IltbbWluXV0iIHBpbiBzdGVwPSJbW3N0ZXBdXSIgdHlwZT0ibnVtYmVyIiB2YWx1ZT0ie3t3ZWlnaHR9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgIDxwYXBlci1pbnB1dCBpZD0iaW5wdXQiIGxhYmVsPSJ3ZWlnaHQiIG5vLWxhYmVsLWZsb2F0IHZhbHVlPSJ7e19pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXR9fSIgdHlwZT0ibnVtYmVyIiBzdGVwPSJbW3N0ZXBdXSIgbWluPSJbW21pbl1dIiBtYXg9IltbbWF4XV0iPjwvcGFwZXItaW5wdXQ+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnRpdGxlIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KCiAgICAgIC5zbW9vdGhpbmctYmxvY2sgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIGZsZXgtZ3JvdzogMjsKICAgICAgfQoKICAgICAgcGFwZXItaW5wdXQgewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIH0KICAgICAgICB3aWR0aDogNjBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1zY2FsYXItZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxpbmUtaXRlbSI+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBpZD0ic2hvdy1kb3dubG9hZC1saW5rcyIgY2hlY2tlZD0ie3tfc2hvd0Rvd25sb2FkTGlua3N9fSI+U2hvdyBkYXRhIGRvd25sb2FkIGxpbmtzPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGlkPSJpZ25vcmUteS1vdXRsaWVyIiBjaGVja2VkPSJ7e19pZ25vcmVZT3V0bGllcnN9fSI+SWdub3JlIG91dGxpZXJzIGluIGNoYXJ0IHNjYWxpbmc8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGlkPSJ0b29sdGlwLXNvcnRpbmciPgogICAgICAgICAgICA8ZGl2PlRvb2x0aXAgc29ydGluZyBtZXRob2Q6PC9kaXY+CiAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0IHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X3Rvb2x0aXBTb3J0aW5nTWV0aG9kfX0iPgogICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0iMCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5kZWZhdWx0PC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+ZGVzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmFzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPm5lYXJlc3Q8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXNtb290aGluZy1pbnB1dCB3ZWlnaHQ9Int7X3Ntb290aGluZ1dlaWdodH19IiBzdGVwPSIwLjAwMSIgbWluPSIwIiBtYXg9IjAuOTk5Ij48L3RmLXNtb290aGluZy1pbnB1dD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLW9wdGlvbi1zZWxlY3RvciBpZD0ieC10eXBlLXNlbGVjdG9yIiBuYW1lPSJIb3Jpem9udGFsIEF4aXMiIHNlbGVjdGVkLWlkPSJ7e194VHlwZX19Ij4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPjxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPjxwYXBlci1idXR0b24gaWQ9IndhbGxfdGltZSI+d2FsbDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPC90Zi1vcHRpb24tc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBzY2FsYXIgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgc2NhbGFyIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICAKICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIiBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSIgZ2V0LWNhdGVnb3J5LWl0ZW0ta2V5PSJbW19nZXRDYXRlZ29yeUl0ZW1LZXldXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLXNjYWxhci1jYXJkIGFjdGl2ZT0iW1thY3RpdmVdXSIgZGF0YS10by1sb2FkPSJbW2l0ZW0uc2VyaWVzXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW19pZ25vcmVZT3V0bGllcnNdXSIgbXVsdGktZXhwZXJpbWVudHM9IltbX2dldE11bHRpRXhwZXJpbWVudHMoZGF0YVNlbGVjdGlvbildXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIiBzaG93LWRvd25sb2FkLWxpbmtzPSJbW19zaG93RG93bmxvYWRMaW5rc11dIiBzbW9vdGhpbmctZW5hYmxlZD0iW1tfc21vb3RoaW5nRW5hYmxlZF1dIiBzbW9vdGhpbmctd2VpZ2h0PSJbW19zbW9vdGhpbmdXZWlnaHRdXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShjYXRlZ29yeSwgX3J1blRvVGFnSW5mbywgaXRlbSldXSIgdGFnPSJbW2l0ZW0udGFnXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbX3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iIHgtdHlwZT0iW1tfeFR5cGVdXSI+PC90Zi1zY2FsYXItY2FyZD4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAjdG9vbHRpcC1zb3J0aW5nIHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi10b3A6IDE1cHg7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CiAgICAgIC5saW5lLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmctdG9wOiA1cHg7CiAgICAgIH0KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgICAgLmNlbnRlciB7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWN1c3RvbS1zY2FsYXItY2FyZC1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgbWFyZ2luOiA1cHggMTBweDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IDMzMHB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0ZXh0LXRvcDsKICAgICAgfQoKICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgOmhvc3QoW19leHBhbmRlZF0pICN0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiA0MDBweDsKICAgICAgfQoKICAgICAgaDEgewogICAgICAgIGZvbnQtc2l6ZTogMTlweDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CgogICAgICAjdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjAwcHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNidXR0b25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uW3NlbGVjdGVkXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIGEgewogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luOiAycHg7CiAgICAgIH0KCiAgICAgIC5kb3dubG9hZC1saW5rcyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICB3aWR0aDogMTAwcHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIGRpc3BsYXktbmFtZT0iW1tfdGl0bGVEaXNwbGF5U3RyaW5nXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgPGRpdiBpZD0idGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIiPgogICAgICA8dGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciBpZD0ibG9hZGVyIiBhY3RpdmU9IltbYWN0aXZlXV0iIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlXV0iIGRhdGEtc2VyaWVzPSJbW19zZXJpZXNOYW1lc11dIiBnZXQtZGF0YS1sb2FkLXVybD0iW1tfZGF0YVVybF1dIiBmaWxsLWFyZWE9IltbX2ZpbGxBcmVhXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBsb2FkLWtleT0iW1tfdGFnRmlsdGVyXV0iIGRhdGEtdG8tbG9hZD0iW1tydW5zXV0iIGxvZy1zY2FsZS1hY3RpdmU9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGxvYWQtZGF0YS1jYWxsYmFjaz0iW1tfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbihtYXJnaW5DaGFydFNlcmllcyldXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW3JlcXVlc3RNYW5hZ2VyXV0iIHN5bWJvbC1mdW5jdGlvbj0iW1tfY3JlYXRlU3ltYm9sRnVuY3Rpb24oKV1dIiB0b29sdGlwLWNvbHVtbnM9IltbX3Rvb2x0aXBDb2x1bW5zXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC10eXBlPSJbW3hUeXBlXV0iPgogICAgICA8L3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXI+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImJ1dHRvbnMiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfbG9nU2NhbGVBY3RpdmVdXSIgaWNvbj0ibGluZS13ZWlnaHQiIG9uLXRhcD0iX3RvZ2dsZUxvZ1NjYWxlIiB0aXRsZT0iVG9nZ2xlIHktYXhpcyBsb2cgc2NhbGUiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncy1vdmVyc2NhbiIgb24tdGFwPSJfcmVzZXREb21haW4iIHRpdGxlPSJGaXQgZG9tYWluIHRvIGRhdGEiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxzcGFuIHN0eWxlPSJmbGV4LWdyb3c6IDEiPjwvc3Bhbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dEb3dubG9hZExpbmtzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImRvd25sb2FkLWxpbmtzIj4KICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0ic2VyaWVzIHRvIGRvd25sb2FkIiBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWR9fSI+CiAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zZXJpZXNOYW1lc11dIiBhcz0iZGF0YVNlcmllc05hbWUiPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPltbZGF0YVNlcmllc05hbWVdXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICA8YSBkb3dubG9hZD0iW1tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkXV0uY3N2IiBocmVmPSJbW19jc3ZVcmwoX25hbWVUb0RhdGFTZXJpZXMsIF9kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWQpXV0iPkNTVjwvYT4KICAgICAgICAgIDxhIGRvd25sb2FkPSJbW19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWRdXS5qc29uIiBocmVmPSJbW19qc29uVXJsKF9uYW1lVG9EYXRhU2VyaWVzLCBfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkKV1dIj5KU09OPC9hPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CgogICAgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX21pc3NpbmdUYWdzLmxlbmd0aF1dIj4KICAgICAgPGRpdiBjbGFzcz0iY29sbGFwc2libGUtbGlzdC10aXRsZSI+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249IltbX2dldFRvZ2dsZUNvbGxhcHNpYmxlSWNvbihfbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZCldXSIgb24tY2xpY2s9Il90b2dnbGVNaXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbiIgY2xhc3M9InRvZ2dsZS1jb2xsYXBzaWJsZS1idXR0b24iPgogICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNvbGxhcHNpYmxlLXRpdGxlLXRleHQiPgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJpY29uczplcnJvciI+PC9pcm9uLWljb24+IE1pc3NpbmcgVGFncwogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZF1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJlcnJvci1jb250ZW50Ij4KICAgICAgICAgIDxpcm9uLWljb24gY2xhc3M9ImVycm9yLWljb24iIGljb249Imljb25zOmVycm9yIj48L2lyb24taWNvbj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX21pc3NpbmdUYWdzXV0iIGFzPSJtaXNzaW5nRW50cnkiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtaXNzaW5nLXRhZ3MtZm9yLXJ1bi1jb250YWluZXIiPgogICAgICAgICAgICAgIFJ1biAiW1ttaXNzaW5nRW50cnkucnVuXV0iIGxhY2tzIGRhdGEgZm9yIHRhZ3MKICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW21pc3NpbmdFbnRyeS50YWdzXV0iIGFzPSJ0YWciPgogICAgICAgICAgICAgICAgICA8bGk+W1t0YWddXTwvbGk+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgPC90ZW1wbGF0ZT4KCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3RhZ0ZpbHRlckludmFsaWRdXSI+CiAgICAgIDxkaXYgY2xhc3M9ImVycm9yLWNvbnRlbnQiPgogICAgICAgIDxpcm9uLWljb24gY2xhc3M9ImVycm9yLWljb24iIGljb249Imljb25zOmVycm9yIj48L2lyb24taWNvbj4KICAgICAgICBUaGlzIHJlZ3VsYXIgZXhwcmVzaW9uIGlzIGludmFsaWQ6PGJyPgogICAgICAgIDxzcGFuIGNsYXNzPSJpbnZhbGlkLXJlZ2V4Ij5bW190YWdGaWx0ZXJdXTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc3RlcHNNaXNtYXRjaF1dIj4KICAgICAgPGRpdiBjbGFzcz0iZXJyb3ItY29udGVudCI+CiAgICAgICAgPGlyb24taWNvbiBjbGFzcz0iZXJyb3ItaWNvbiIgaWNvbj0iaWNvbnM6ZXJyb3IiPjwvaXJvbi1pY29uPgogICAgICAgIFRoZSBzdGVwcyBmb3IgdmFsdWUsIGxvd2VyLCBhbmQgdXBwZXIgdGFncyBkbyBub3QgbWF0Y2g6CiAgICAgICAgPHVsPgogICAgICAgICAgPGxpPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0idGFnLW5hbWUiPltbX3N0ZXBzTWlzbWF0Y2guc2VyaWVzT2JqZWN0LnZhbHVlXV08L3NwYW4+OgogICAgICAgICAgICBbW19zZXBhcmF0ZVdpdGhDb21tYXMoX3N0ZXBzTWlzbWF0Y2gudmFsdWVTdGVwcyldXQogICAgICAgICAgPC9saT4KICAgICAgICAgIDxsaT4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRhZy1uYW1lIj5bW19zdGVwc01pc21hdGNoLnNlcmllc09iamVjdC5sb3dlcl1dPC9zcGFuPjoKICAgICAgICAgICAgW1tfc2VwYXJhdGVXaXRoQ29tbWFzKF9zdGVwc01pc21hdGNoLmxvd2VyU3RlcHMpXV0KICAgICAgICAgIDwvbGk+CiAgICAgICAgICA8bGk+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0YWctbmFtZSI+W1tfc3RlcHNNaXNtYXRjaC5zZXJpZXNPYmplY3QudXBwZXJdXTwvc3Bhbj46CiAgICAgICAgICAgIFtbX3NlcGFyYXRlV2l0aENvbW1hcyhfc3RlcHNNaXNtYXRjaC51cHBlclN0ZXBzKV1dCiAgICAgICAgICA8L2xpPgogICAgICAgIDwvdWw+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KCiAgICA8ZGl2IGlkPSJtYXRjaGVzLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgY2xhc3M9ImNvbGxhcHNpYmxlLWxpc3QtdGl0bGUiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249IltbX2dldFRvZ2dsZUNvbGxhcHNpYmxlSWNvbihfbWF0Y2hlc0xpc3RPcGVuZWQpXV0iIG9uLWNsaWNrPSJfdG9nZ2xlTWF0Y2hlc09wZW4iIGNsYXNzPSJ0b2dnbGUtbWF0Y2hlcy1idXR0b24iPgogICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8c3BhbiBjbGFzcz0iY29sbGFwc2libGUtdGl0bGUtdGV4dCI+CiAgICAgICAgICBNYXRjaGVzIChbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSkKICAgICAgICA8L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nlcmllc05hbWVzLmxlbmd0aF1dIj4KICAgICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9IltbX21hdGNoZXNMaXN0T3BlbmVkXV0iPgogICAgICAgICAgPGRpdiBpZD0ibWF0Y2hlcy1saXN0Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfc2VyaWVzTmFtZXNdXSIgYXM9InNlcmllc05hbWUiIGlkPSJtYXRjaC1saXN0LXJlcGVhdCIgb24tZG9tLWNoYW5nZT0iX21hdGNoTGlzdEVudHJ5Q29sb3JVcGRhdGVkIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYXRjaC1saXN0LWVudHJ5Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtYXRjaC1lbnRyeS1zeW1ib2wiPgogICAgICAgICAgICAgICAgICBbW19kZXRlcm1pbmVTeW1ib2woX25hbWVUb0RhdGFTZXJpZXMsIHNlcmllc05hbWUpXV0KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgIFtbc2VyaWVzTmFtZV1dCiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY3VzdG9tLXNjYWxhci1jYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAuZXJyb3ItY29udGVudCB7CiAgICAgICAgYmFja2dyb3VuZDogI2YwMDsKICAgICAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgMCAwOwogICAgICAgIHBhZGRpbmc6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5lcnJvci1pY29uIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICAgIG1hcmdpbjogMCBhdXRvIDVweCBhdXRvOwogICAgICB9CgogICAgICAuaW52YWxpZC1yZWdleCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5lcnJvci1jb250ZW50IHVsIHsKICAgICAgICBtYXJnaW46IDFweCAwIDAgMDsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAxOXB4OwogICAgICB9CgogICAgICAudGFnLW5hbWUgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CgogICAgICAuY29sbGFwc2libGUtbGlzdC10aXRsZSB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgNXB4IDA7CiAgICAgIH0KCiAgICAgIC5jb2xsYXBzaWJsZS10aXRsZS10ZXh0IHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CgogICAgICAjbWF0Y2hlcy1saXN0IHsKICAgICAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CgogICAgICAubWF0Y2gtbGlzdC1lbnRyeSB7CiAgICAgICAgbWFyZ2luOiAwIDAgNXB4IDA7CiAgICAgIH0KCiAgICAgIC5tYXRjaC1lbnRyeS1zeW1ib2wgewogICAgICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgc2Fucy1zZXJpZjsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5taXNzaW5nLXRhZ3MtZm9yLXJ1bi1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogOHB4IDAgMCAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWN1c3RvbS1zY2FsYXItbXVsdGktbGluZS1jaGFydC1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIGRpc3BsYXktbmFtZT0iW1tfdGl0bGVEaXNwbGF5U3RyaW5nXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgPGRpdiBpZD0idGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIiPgogICAgICA8dGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciBpZD0ibG9hZGVyIiBhY3RpdmU9IltbYWN0aXZlXV0iIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlXV0iIGRhdGEtc2VyaWVzPSJbW19zZXJpZXNOYW1lc11dIiBnZXQtZGF0YS1sb2FkLXVybD0iW1tfZGF0YVVybF1dIiBpZ25vcmUteS1vdXRsaWVycz0iW1tpZ25vcmVZT3V0bGllcnNdXSIgbG9hZC1rZXk9IltbX3RhZ0ZpbHRlcl1dIiBkYXRhLXRvLWxvYWQ9IltbcnVuc11dIiBsb2ctc2NhbGUtYWN0aXZlPSJbW19sb2dTY2FsZUFjdGl2ZV1dIiBsb2FkLWRhdGEtY2FsbGJhY2s9IltbX2NyZWF0ZVByb2Nlc3NEYXRhRnVuY3Rpb24oKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIgc21vb3RoaW5nLWVuYWJsZWQ9Iltbc21vb3RoaW5nRW5hYmxlZF1dIiBzbW9vdGhpbmctd2VpZ2h0PSJbW3Ntb290aGluZ1dlaWdodF1dIiBzeW1ib2wtZnVuY3Rpb249IltbX2NyZWF0ZVN5bWJvbEZ1bmN0aW9uKCldXSIgdG9vbHRpcC1zb3J0aW5nLW1ldGhvZD0iW1t0b29sdGlwU29ydGluZ01ldGhvZF1dIiB4LXR5cGU9IltbeFR5cGVdXSI+CiAgICAgIDwvdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlcj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iYnV0dG9ucyI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2V4cGFuZGVkXV0iIGljb249ImZ1bGxzY3JlZW4iIG9uLXRhcD0iX3RvZ2dsZUV4cGFuZGVkIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19sb2dTY2FsZUFjdGl2ZV1dIiBpY29uPSJsaW5lLXdlaWdodCIgb24tdGFwPSJfdG9nZ2xlTG9nU2NhbGUiIHRpdGxlPSJUb2dnbGUgeS1heGlzIGxvZyBzY2FsZSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InNldHRpbmdzLW92ZXJzY2FuIiBvbi10YXA9Il9yZXNldERvbWFpbiIgdGl0bGU9IkZpdCBkb21haW4gdG8gZGF0YSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHNwYW4gc3R5bGU9ImZsZXgtZ3JvdzogMSI+PC9zcGFuPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd0Rvd25sb2FkTGlua3NdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZG93bmxvYWQtbGlua3MiPgogICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQ9InRydWUiIGxhYmVsPSJzZXJpZXMgdG8gZG93bmxvYWQiIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZH19Ij4KICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3Nlcmllc05hbWVzXV0iIGFzPSJkYXRhU2VyaWVzTmFtZSI+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+W1tkYXRhU2VyaWVzTmFtZV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDxhIGRvd25sb2FkPSJbW19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWRdXS5jc3YiIGhyZWY9IltbX2NzdlVybChfbmFtZVRvRGF0YVNlcmllcywgX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZCldXSI+Q1NWPC9hPgogICAgICAgICAgPGEgZG93bmxvYWQ9IltbX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZF1dLmpzb24iIGhyZWY9IltbX2pzb25VcmwoX25hbWVUb0RhdGFTZXJpZXMsIF9kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWQpXV0iPkpTT048L2E+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9Im1hdGNoZXMtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0ibWF0Y2hlcy1saXN0LXRpdGxlIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nlcmllc05hbWVzLmxlbmd0aF1dIj4KICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJbW19nZXRUb2dnbGVNYXRjaGVzSWNvbihfbWF0Y2hlc0xpc3RPcGVuZWQpXV0iIG9uLWNsaWNrPSJfdG9nZ2xlTWF0Y2hlc09wZW4iIGNsYXNzPSJ0b2dnbGUtbWF0Y2hlcy1idXR0b24iPgogICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8c3BhbiBjbGFzcz0ibWF0Y2hlcy10ZXh0Ij4KICAgICAgICAgIE1hdGNoZXMgKFtbX3Nlcmllc05hbWVzLmxlbmd0aF1dKQogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbWF0Y2hlc0xpc3RPcGVuZWRdXSI+CiAgICAgICAgICA8ZGl2IGlkPSJtYXRjaGVzLWxpc3QiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zZXJpZXNOYW1lc11dIiBhcz0ic2VyaWVzTmFtZSIgaWQ9Im1hdGNoLWxpc3QtcmVwZWF0IiBvbi1kb20tY2hhbmdlPSJfbWF0Y2hMaXN0RW50cnlDb2xvclVwZGF0ZWQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1hdGNoLWxpc3QtZW50cnkiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1hdGNoLWVudHJ5LXN5bWJvbCI+CiAgICAgICAgICAgICAgICAgIFtbX2RldGVybWluZVN5bWJvbChfbmFtZVRvRGF0YVNlcmllcywgc2VyaWVzTmFtZSldXQogICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgW1tzZXJpZXNOYW1lXV0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1jdXN0b20tc2NhbGFyLWNhcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgICNtYXRjaGVzLWxpc3QtdGl0bGUgewogICAgICAgIG1hcmdpbjogMTBweCAwIDVweCAwOwogICAgICB9CgogICAgICAjbWF0Y2hlcy1saXN0IHsKICAgICAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CgogICAgICAubWF0Y2gtbGlzdC1lbnRyeSB7CiAgICAgICAgbWFyZ2luOiAwIDAgNXB4IDA7CiAgICAgIH0KCiAgICAgIC5tYXRjaC1lbnRyeS1zeW1ib2wgewogICAgICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgc2Fucy1zZXJpZjsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5tYXRjaGVzLXRleHQgewogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7X3Nob3dEb3dubG9hZExpbmtzfX0iPlNob3cgZGF0YSBkb3dubG9hZCBsaW5rczwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxpbmUtaXRlbSI+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e19pZ25vcmVZT3V0bGllcnN9fSI+SWdub3JlIG91dGxpZXJzIGluIGNoYXJ0IHNjYWxpbmc8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGlkPSJ0b29sdGlwLXNvcnRpbmciPgogICAgICAgICAgICA8ZGl2IGlkPSJ0b29sdGlwLXNvcnRpbmctbGFiZWwiPlRvb2x0aXAgc29ydGluZyBtZXRob2Q6PC9kaXY+CiAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0IHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X3Rvb2x0aXBTb3J0aW5nTWV0aG9kfX0iPgogICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0iMCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5kZWZhdWx0PC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+ZGVzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmFzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPm5lYXJlc3Q8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXNtb290aGluZy1pbnB1dCB3ZWlnaHQ9Int7X3Ntb290aGluZ1dlaWdodH19IiBzdGVwPSIwLjAwMSIgbWluPSIwIiBtYXg9IjEiPjwvdGYtc21vb3RoaW5nLWlucHV0PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ4LXR5cGUtc2VsZWN0b3IiIG5hbWU9Ikhvcml6b250YWwgQXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3hUeXBlfX0iPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0icmVsYXRpdmUiPnJlbGF0aXZlPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiIGlkPSJjYXRlZ29yaWVzLWNvbnRhaW5lciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+VGhlIGN1c3RvbSBzY2FsYXJzIGRhc2hib2FyZCBpcyBpbmFjdGl2ZS48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDxvbD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVuJ3QgbGFpZCBvdXQgdGhlIGRhc2hib2FyZC48L2xpPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IHNjYWxhciBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC9vbD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIFRvIGxheSBvdXQgdGhlIGRhc2hib2FyZCwgcGFzcyBhIDxjb2RlPkxheW91dDwvY29kZT4gcHJvdG9idWZmZXIKICAgICAgICAgICAgICB0byB0aGUgPGNvZGU+c2V0X2xheW91dDwvY29kZT4gbWV0aG9kLiBGb3IgZXhhbXBsZSwKICAgICAgICAgICAgCiAgICAgICAgICAgIDxwcmU+ZnJvbSB0ZW5zb3Jib2FyZCBpbXBvcnQgc3VtbWFyeQpmcm9tIHRlbnNvcmJvYXJkLnBsdWdpbnMuY3VzdG9tX3NjYWxhciBpbXBvcnQgbGF5b3V0X3BiMgouLi4KIyBUaGlzIGFjdGlvbiBkb2VzIG5vdCBoYXZlIHRvIGJlIHBlcmZvcm1lZCBhdCBldmVyeSBzdGVwLCBzbyB0aGUgYWN0aW9uIGlzIG5vdAojIHRha2VuIGNhcmUgb2YgYnkgYW4gb3AgaW4gdGhlIGdyYXBoLiBXZSBvbmx5IG5lZWQgdG8gc3BlY2lmeSB0aGUgbGF5b3V0IG9uY2UKIyAoaW5zdGVhZCBvZiBwZXIgc3RlcCkuCmxheW91dF9zdW1tYXJ5ID0gc3VtbWFyeV9saWIuY3VzdG9tX3NjYWxhcl9wYihsYXlvdXRfcGIyLkxheW91dCgKICBjYXRlZ29yeT1bCiAgICBsYXlvdXRfcGIyLkNhdGVnb3J5KAogICAgICB0aXRsZT0nbG9zc2VzJywKICAgICAgY2hhcnQ9WwogICAgICAgICAgbGF5b3V0X3BiMi5DaGFydCgKICAgICAgICAgICAgICB0aXRsZT0nbG9zc2VzJywKICAgICAgICAgICAgICBtdWx0aWxpbmU9bGF5b3V0X3BiMi5NdWx0aWxpbmVDaGFydENvbnRlbnQoCiAgICAgICAgICAgICAgICB0YWc9W3InbG9zcy4qJ10sCiAgICAgICAgICAgICAgKSksCiAgICAgICAgICBsYXlvdXRfcGIyLkNoYXJ0KAogICAgICAgICAgICAgIHRpdGxlPSdiYXonLAogICAgICAgICAgICAgIG1hcmdpbj1sYXlvdXRfcGIyLk1hcmdpbkNoYXJ0Q29udGVudCgKICAgICAgICAgICAgICAgIHNlcmllcz1bCiAgICAgICAgICAgICAgICAgIGxheW91dF9wYjIuTWFyZ2luQ2hhcnRDb250ZW50LlNlcmllcygKICAgICAgICAgICAgICAgICAgICB2YWx1ZT0nbG9zcy9iYXovc2NhbGFyX3N1bW1hcnknLAogICAgICAgICAgICAgICAgICAgIGxvd2VyPSdiYXpfbG93ZXIvYmF6L3NjYWxhcl9zdW1tYXJ5JywKICAgICAgICAgICAgICAgICAgICB1cHBlcj0nYmF6X3VwcGVyL2Jhei9zY2FsYXJfc3VtbWFyeScpLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICApKSwKICAgICAgXSksCiAgICBsYXlvdXRfcGIyLkNhdGVnb3J5KAogICAgICB0aXRsZT0ndHJpZyBmdW5jdGlvbnMnLAogICAgICBjaGFydD1bCiAgICAgICAgICBsYXlvdXRfcGIyLkNoYXJ0KAogICAgICAgICAgICAgIHRpdGxlPSd3YXZlIHRyaWcgZnVuY3Rpb25zJywKICAgICAgICAgICAgICBtdWx0aWxpbmU9bGF5b3V0X3BiMi5NdWx0aWxpbmVDaGFydENvbnRlbnQoCiAgICAgICAgICAgICAgICB0YWc9W3IndHJpZ0Z1bmN0aW9ucy9jb3NpbmUnLCByJ3RyaWdGdW5jdGlvbnMvc2luZSddLAogICAgICAgICAgICAgICkpLAogICAgICAgICAgIyBUaGUgcmFuZ2Ugb2YgdGFuZ2VudCBpcyBkaWZmZXJlbnQuIExldCdzIGdpdmUgaXQgaXRzIG93biBjaGFydC4KICAgICAgICAgIGxheW91dF9wYjIuQ2hhcnQoCiAgICAgICAgICAgICAgdGl0bGU9J3RhbicsCiAgICAgICAgICAgICAgbXVsdGlsaW5lPWxheW91dF9wYjIuTXVsdGlsaW5lQ2hhcnRDb250ZW50KAogICAgICAgICAgICAgICAgdGFnPVtyJ3RyaWdGdW5jdGlvbnMvdGFuZ2VudCddLAogICAgICAgICAgICAgICkpLAogICAgICBdLAogICAgICAjIFRoaXMgY2F0ZWdvcnkgd2UgY2FyZSBsZXNzIGFib3V0LiBMZXQncyBtYWtlIGl0IGluaXRpYWxseSBjbG9zZWQuCiAgICAgIGNsb3NlZD1UcnVlKSwKICBdKSkKd3JpdGVyLmFkZF9zdW1tYXJ5KGxheW91dF9zdW1tYXJ5KQo8L3ByZT4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyBhcz0iY2hhcnQiIGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGRpc2FibGUtcGFnaW5hdGlvbiBpbml0aWFsLW9wZW5lZD0iW1tjYXRlZ29yeS5tZXRhZGF0YS5vcGVuZWRdXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJ0Lm11bHRpbGluZV1dIj4KICAgICAgICAgICAgICAgICAgICA8dGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQgYWN0aXZlPSJbW2FjdGl2ZV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIHJ1bnM9IltbX3NlbGVjdGVkUnVuc11dIiB0aXRsZT0iW1tjaGFydC50aXRsZV1dIiB4LXR5cGU9IltbX3hUeXBlXV0iIHNtb290aGluZy1lbmFibGVkPSJbW19zbW9vdGhpbmdFbmFibGVkXV0iIHNtb290aGluZy13ZWlnaHQ9IltbX3Ntb290aGluZ1dlaWdodF1dIiB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW19pZ25vcmVZT3V0bGllcnNdXSIgc2hvdy1kb3dubG9hZC1saW5rcz0iW1tfc2hvd0Rvd25sb2FkTGlua3NdXSIgdGFnLXJlZ2V4ZXM9IltbY2hhcnQubXVsdGlsaW5lLnRhZ11dIj48L3RmLWN1c3RvbS1zY2FsYXItbXVsdGktbGluZS1jaGFydC1jYXJkPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbY2hhcnQubWFyZ2luXV0iPgogICAgICAgICAgICAgICAgICAgIDx0Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkIGFjdGl2ZT0iW1thY3RpdmVdXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIiBydW5zPSJbW19zZWxlY3RlZFJ1bnNdXSIgdGl0bGU9IltbY2hhcnQudGl0bGVdXSIgeC10eXBlPSJbW194VHlwZV1dIiB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW19pZ25vcmVZT3V0bGllcnNdXSIgc2hvdy1kb3dubG9hZC1saW5rcz0iW1tfc2hvd0Rvd25sb2FkTGlua3NdXSIgbWFyZ2luLWNoYXJ0LXNlcmllcz0iW1tjaGFydC5tYXJnaW4uc2VyaWVzXV0iPjwvdGYtY3VzdG9tLXNjYWxhci1tYXJnaW4tY2hhcnQtY2FyZD4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgICN0b29sdGlwLXNvcnRpbmcgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogMTVweDsKICAgICAgfQogICAgICAjdG9vbHRpcC1zb3J0aW5nIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICB3aWR0aDogMTA1cHg7CiAgICAgIH0KICAgICAgLmxpbmUtaXRlbSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1pbWFnZS1sb2FkZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgdGFnPSJbW3RhZ11dIiBydW49IltbcnVuXV0iIGRpc3BsYXktbmFtZT0iW1t0YWdNZXRhZGF0YS5kaXNwbGF5TmFtZV1dIiBkZXNjcmlwdGlvbj0iW1t0YWdNZXRhZGF0YS5kZXNjcmlwdGlvbl1dIiBjb2xvcj0iW1tfcnVuQ29sb3JdXSI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVTYW1wbGVzXV0iPgogICAgICAgIDxkaXY+c2FtcGxlOiBbW19zYW1wbGVUZXh0XV0gb2YgW1tvZlNhbXBsZXNdXTwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc0F0TGVhc3RPbmVTdGVwXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwiPgogICAgICAgICAgICBzdGVwCiAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+W1tfdG9Mb2NhbGVTdHJpbmcoX3N0ZXBWYWx1ZSldXTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCBoZWFkaW5nLXJpZ2h0IGRhdGV0aW1lIj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19jdXJyZW50V2FsbFRpbWVdXSI+CiAgICAgICAgICAgICAgW1tfY3VycmVudFdhbGxUaW1lXV0KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwgcmlnaHQiPgogICAgICAgICAgICA8cGFwZXItc3Bpbm5lci1saXRlIGFjdGl2ZSBoaWRkZW4kPSJbWyFfaXNJbWFnZUxvYWRpbmddXSI+CiAgICAgICAgICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVTdGVwc11dIj4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLXNsaWRlciBpZD0ic3RlcHMiIGltbWVkaWF0ZS12YWx1ZT0ie3tfc3RlcEluZGV4fX0iIG1heD0iW1tfbWF4U3RlcEluZGV4XV0iIG1heC1tYXJrZXJzPSJbW19tYXhTdGVwSW5kZXhdXSIgc25hcHMgc3RlcD0iMSIgdmFsdWU9Int7X3N0ZXBJbmRleH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdGYtY2FyZC1oZWFkaW5nPgoKICAgIAogICAgPGEgaWQ9Im1haW4taW1hZ2UtY29udGFpbmVyIiByb2xlPSJidXR0b24iIGFyaWEtbGFiZWw9IlRvZ2dsZSBhY3R1YWwgc2l6ZSIgYXJpYS1leHBhbmRlZCQ9IltbX2dldEFyaWFFeHBhbmRlZChhY3R1YWxTaXplKV1dIiBvbi10YXA9Il9oYW5kbGVUYXAiPjwvYT4KCiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICAgICAgLyoqIE1ha2UgYnV0dG9uIGEgZGl2LiAqLwogICAgICBidXR0b24gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICAgICAgYm9yZGVyOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC8qKiBGaXJlZm94OiBHZXQgcmlkIG9mIGRvdHRlZCBsaW5lIGluc2lkZSBidXR0b24uICovCiAgICAgIGJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciB7CiAgICAgICAgYm9yZGVyOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC8qKiBGaXJlZm94OiBTaW11bGF0ZSBDaHJvbWUncyBvdXRlciBnbG93IG9uIGJ1dHRvbiB3aGVuIGZvY3VzZWQuICovCiAgICAgIGJ1dHRvbjotbW96LWZvY3VzcmluZyB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3gtc2hhZG93OiAwcHggMHB4IDFweCAycHggSGlnaGxpZ2h0OwogICAgICB9CgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWFyZ2luOiAwIDE1cHggNDBweCAwOwogICAgICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICAgIH0KCiAgICAgIC8qKiBXaGVuIGFjdHVhbCBzaXplIHNob3duIGlzIG9uLCB1c2UgdGhlIGFjdHVhbCBpbWFnZSB3aWR0aC4gKi8KICAgICAgOmhvc3QoW2FjdHVhbC1zaXplXSkgewogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgfQoKICAgICAgOmhvc3QoW2FjdHVhbC1zaXplXSkgI21haW4taW1hZ2UtY29udGFpbmVyIHsKICAgICAgICBtYXgtaGVpZ2h0OiBub25lOwogICAgICAgIHdpZHRoOiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbYWN0dWFsLXNpemVdKSAjbWFpbi1pbWFnZS1jb250YWluZXIgaW1nIHsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgfQoKICAgICAgcGFwZXItc3Bpbm5lci1saXRlIHsKICAgICAgICB3aWR0aDogMTRweDsKICAgICAgICBoZWlnaHQ6IDE0cHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRleHQtYm90dG9tOwogICAgICAgIC0tcGFwZXItc3Bpbm5lci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgIH0KCiAgICAgICNzdGVwcyB7CiAgICAgICAgaGVpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbjogMCAwIDAgLTE1cHg7CiAgICAgICAgLyoKICAgICAgICAgKiAzMSBjb21lcyBmcm9tIGFkZGluZyBhIHBhZGRpbmcgb2YgMTVweCBmcm9tIGJvdGggc2lkZXMgb2YgdGhlCiAgICAgICAgICogcGFwZXItc2xpZGVyLCBzdWJ0cmFjdGluZyAxcHggc28gdGhhdCB0aGUgc2xpZGVyIHdpZHRoIGFsaWducwogICAgICAgICAqIHdpdGggdGhlIGltYWdlICh0aGUgbGFzdCBzbGlkZXIgbWFya2VyIHRha2VzIHVwIDFweCksIGFuZAogICAgICAgICAqIGFkZGluZyAycHggdG8gYWNjb3VudCBmb3IgYSBib3JkZXIgb2YgMXB4IG9uIGJvdGggc2lkZXMgb2YKICAgICAgICAgKiB0aGUgaW1hZ2UuIDMwIC0gMSArIDIuCiAgICAgICAgICovCiAgICAgICAgd2lkdGg6IGNhbGMoMTAwJSArIDMxcHgpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgfQoKICAgICAgI21haW4taW1hZ2UtY29udGFpbmVyIHsKICAgICAgICBtYXgtaGVpZ2h0OiAxMDI0cHg7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgICNtYWluLWltYWdlLWNvbnRhaW5lciBpbWcgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBpbWFnZS1yZW5kZXJpbmc6IC1tb3otY3Jpc3AtZWRnZXM7CiAgICAgICAgaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQ7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgY29sb3I6ICMyMTk2ZjM7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTAwJTsKICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CiAgICAgIHBhcGVyLWljb24tYnV0dG9uW3NlbGVjdGVkXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgfQogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1pbWFnZS1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7X2FjdHVhbFNpemV9fSI+U2hvdyBhY3R1YWwgaW1hZ2Ugc2l6ZTwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGgzIGNsYXNzPSJ0b29sdGlwLWNvbnRhaW5lciI+QnJpZ2h0bmVzcyBhZGp1c3RtZW50PC9oMz4KICAgICAgICAgIDxkaXYgY2xhc3M9InJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciI+CiAgICAgICAgICAgIDxwYXBlci1zbGlkZXIgbWluPSIwIiBtYXg9IjIiIHNuYXBzIHBpbiBzdGVwPSIwLjAxIiB2YWx1ZT0ie3tfYnJpZ2h0bmVzc0FkanVzdG1lbnR9fSIgaW1tZWRpYXRlLXZhbHVlPSJ7e19icmlnaHRuZXNzQWRqdXN0bWVudH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIG9uLXRhcD0iX3Jlc2V0QnJpZ2h0bmVzcyIgZGlzYWJsZWQ9IltbX2JyaWdodG5lc3NJc0RlZmF1bHRdXSI+UmVzZXQ8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8aDMgY2xhc3M9InRvb2x0aXAtY29udGFpbmVyIj5Db250cmFzdCBhZGp1c3RtZW50PC9oMz4KICAgICAgICAgIDxkaXYgY2xhc3M9InJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciI+CiAgICAgICAgICAgIDxwYXBlci1zbGlkZXIgbWluPSIwIiBtYXg9IjUwMCIgc25hcHMgcGluIHN0ZXA9IjEiIHZhbHVlPSJ7e19jb250cmFzdFBlcmNlbnRhZ2V9fSIgaW1tZWRpYXRlLXZhbHVlPSJ7e19jb250cmFzdFBlcmNlbnRhZ2V9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gY2xhc3M9IngtYnV0dG9uIiBvbi10YXA9Il9yZXNldENvbnRyYXN0IiBkaXNhYmxlZD0iW1tfY29udHJhc3RJc0RlZmF1bHRdXSI+UmVzZXQ8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBpZD0icnVucy1zZWxlY3RvciIgc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPjwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBpbWFnZSBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBpbWFnZSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1pbWFnZS1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiBydW49IltbaXRlbS5ydW5dXSIgdGFnPSJbW2l0ZW0udGFnXV0iIHNhbXBsZT0iW1tpdGVtLnNhbXBsZV1dIiBvZi1zYW1wbGVzPSJbW2l0ZW0ub2ZTYW1wbGVzXV0iIHRhZy1tZXRhZGF0YT0iW1tfdGFnTWV0YWRhdGEoX3J1blRvVGFnSW5mbywgaXRlbS5ydW4sIGl0ZW0udGFnKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIGFjdHVhbC1zaXplPSJbW19hY3R1YWxTaXplXV0iIGJyaWdodG5lc3MtYWRqdXN0bWVudD0iW1tfYnJpZ2h0bmVzc0FkanVzdG1lbnRdXSIgY29udHJhc3QtcGVyY2VudGFnZT0iW1tfY29udHJhc3RQZXJjZW50YWdlXV0iPjwvdGYtaW1hZ2UtbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLnJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAucmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIHBhcGVyLXNsaWRlciB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICAgIC5yZXNldHRhYmxlLXNsaWRlci1jb250YWluZXIgcGFwZXItYnV0dG9uIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgLnJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciBwYXBlci1idXR0b25bZGlzYWJsZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB1bnNldDsKICAgICAgfQogICAgICAueC1idXR0b24gewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgIH0KICAgICAgaDMgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTgwMCk7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWF1ZGlvLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyB0YWc9IltbdGFnXV0iIHJ1bj0iW1tydW5dXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iIGNvbG9yPSJbW19ydW5Db2xvcl1dIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVNhbXBsZXNdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCI+CiAgICAgICAgICAgIHNhbXBsZTogW1tfc2FtcGxlVGV4dF1dIG9mIFtbdG90YWxTYW1wbGVzXV0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc0F0TGVhc3RPbmVTdGVwXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwiPgogICAgICAgICAgICBzdGVwIDxzdHJvbmc+W1tfY3VycmVudERhdHVtLnN0ZXBdXTwvc3Ryb25nPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2N1cnJlbnREYXR1bS53YWxsX3RpbWVdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCI+CiAgICAgICAgICAgICAgW1tfY3VycmVudERhdHVtLndhbGxfdGltZV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVN0ZXBzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InN0ZXBzIiBpbW1lZGlhdGUtdmFsdWU9Int7X3N0ZXBJbmRleH19IiBtYXg9IltbX21heFN0ZXBJbmRleF1dIiBtYXgtbWFya2Vycz0iW1tfbWF4U3RlcEluZGV4XV0iIHNuYXBzIHN0ZXA9IjEiIHZhbHVlPSJ7e19zdGVwSW5kZXh9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXBdXSI+CiAgICAgIDxhdWRpbyBjb250cm9scyBzcmMkPSJbW19jdXJyZW50RGF0dW0udXJsXV0iIHR5cGUkPSJbW19jdXJyZW50RGF0dW0uY29udGVudFR5cGVdXSI+PC9hdWRpbz4KICAgICAgPHRmLW1hcmtkb3duLXZpZXcgaHRtbD0iW1tfY3VycmVudERhdHVtLmxhYmVsXV0iPjwvdGYtbWFya2Rvd24tdmlldz4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJtYWluLWF1ZGlvLWNvbnRhaW5lciI+PC9kaXY+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWNhcmQtaGVhZGluZy1zdHlsZSI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMzUwcHg7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3I6ICM0MjQyNDI7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgICNzdGVwcyB7CiAgICAgICAgaGVpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbjogMCAwIDAgLTE1cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBwYWRkaW5nOiAwIDVweDsgLyogc28gdGhlIHNsaWRlciBrbm9iIGRvZXNuJ3QgYnV0dCBvdXQgKi8KICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWF1ZGlvLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBpZD0icnVucy1zZWxlY3RvciIgc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPjwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBhdWRpbyBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBhdWRpbyBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1hdWRpby1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiBydW49IltbaXRlbS5ydW5dXSIgdGFnPSJbW2l0ZW0udGFnXV0iIHNhbXBsZT0iW1tpdGVtLnNhbXBsZV1dIiB0b3RhbC1zYW1wbGVzPSJbW2l0ZW0udG90YWxTYW1wbGVzXV0iIHRhZy1tZXRhZGF0YT0iW1tfdGFnTWV0YWRhdGEoX3J1blRvVGFnSW5mbywgaXRlbS5ydW4sIGl0ZW0udGFnKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iPjwvdGYtYXVkaW8tbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24tYXV0b2dyb3ctdGV4dGFyZWEiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkOwogICAgICAgIHBhZGRpbmc6IDJweDsKICAgICAgICAtbW96LWFwcGVhcmFuY2U6IHRleHRhcmVhOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogdGV4dGFyZWE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLm1pcnJvci10ZXh0IHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgcmVzaXplOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgLyogc2VlIGNvbW1lbnRzIGluIHRlbXBsYXRlICovCiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdDsKICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0OwogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTo6LW1vei1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0taXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYS1wbGFjZWhvbGRlcjsKICAgICAgfQoKICAgICAgdGV4dGFyZWE6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIAogICAgCiAgICA8ZGl2IGlkPSJtaXJyb3IiIGNsYXNzPSJtaXJyb3ItdGV4dCIgYXJpYS1oaWRkZW49InRydWUiPiZuYnNwOzwvZGl2PgoKICAgIAogICAgPGRpdiBjbGFzcz0idGV4dGFyZWEtY29udGFpbmVyIGZpdCI+CiAgICAgIDx0ZXh0YXJlYSBpZD0idGV4dGFyZWEiIG5hbWUkPSJbW25hbWVdXSIgYXJpYS1sYWJlbCQ9IltbbGFiZWxdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgcGxhY2Vob2xkZXIkPSJbW3BsYWNlaG9sZGVyXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIHJvd3MkPSJbW3Jvd3NdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSI+PC90ZXh0YXJlYT4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItdGV4dGFyZWEiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgbGFiZWwgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pbnB1dC1jb250YWluZXIgbm8tbGFiZWwtZmxvYXQkPSJbW25vTGFiZWxGbG9hdF1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsKGFsd2F5c0Zsb2F0TGFiZWwscGxhY2Vob2xkZXIpXV0iIGF1dG8tdmFsaWRhdGUkPSJbW2F1dG9WYWxpZGF0ZV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaW52YWxpZD0iW1tpbnZhbGlkXV0iPgoKICAgICAgPGxhYmVsIGhpZGRlbiQ9IltbIWxhYmVsXV0iIGFyaWEtaGlkZGVuPSJ0cnVlIiBmb3IkPSJbW19pbnB1dElkXV0iIHNsb3Q9ImxhYmVsIj5bW2xhYmVsXV08L2xhYmVsPgoKICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3M9InBhcGVyLWlucHV0LWlucHV0IiBzbG90PSJpbnB1dCIgaWQkPSJbW19pbnB1dElkXV0iIGFyaWEtbGFiZWxsZWRieSQ9IltbX2FyaWFMYWJlbGxlZEJ5XV0iIGFyaWEtZGVzY3JpYmVkYnkkPSJbW19hcmlhRGVzY3JpYmVkQnldXSIgYmluZC12YWx1ZT0ie3t2YWx1ZX19IiBpbnZhbGlkPSJ7e2ludmFsaWR9fSIgdmFsaWRhdG9yJD0iW1t2YWxpZGF0b3JdXSIgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIGF1dG9jb21wbGV0ZSQ9IltbYXV0b2NvbXBsZXRlXV0iIGF1dG9mb2N1cyQ9IltbYXV0b2ZvY3VzXV0iIGlucHV0bW9kZSQ9IltbaW5wdXRtb2RlXV0iIG5hbWUkPSJbW25hbWVdXSIgcGxhY2Vob2xkZXIkPSJbW3BsYWNlaG9sZGVyXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgYXV0b2NhcGl0YWxpemUkPSJbW2F1dG9jYXBpdGFsaXplXV0iIHJvd3MkPSJbW3Jvd3NdXSIgbWF4LXJvd3MkPSJbW21heFJvd3NdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiPjwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlcnJvck1lc3NhZ2VdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWVycm9yIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIiBzbG90PSJhZGQtb24iPltbZXJyb3JNZXNzYWdlXV08L3BhcGVyLWlucHV0LWVycm9yPgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJDb3VudGVyXV0iPgogICAgICAgIDxwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgc2xvdD0iYWRkLW9uIj48L3BhcGVyLWlucHV0LWNoYXItY291bnRlcj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItdG9hc3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2FzdC1iYWNrZ3JvdW5kLWNvbG9yLCAjMzIzMjMyKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9hc3QtY29sb3IsICNmMWYxZjEpOwogICAgICAgIG1pbi1oZWlnaHQ6IDQ4cHg7CiAgICAgICAgbWluLXdpZHRoOiAyODhweDsKICAgICAgICBwYWRkaW5nOiAxNnB4IDI0cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3gtc2hhZG93OiAwIDJweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMjYpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBtYXJnaW46IDEycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuM3MsIG9wYWNpdHkgMC4zczsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcywgb3BhY2l0eSAwLjNzOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwcHgpOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDBweCk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNhcHN1bGUpIHsKICAgICAgICBib3JkZXItcmFkaXVzOiAyNHB4OwogICAgICB9CgogICAgICA6aG9zdCguZml0LWJvdHRvbSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1pbi13aWR0aDogMDsKICAgICAgICBib3JkZXItcmFkaXVzOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQoKICAgICAgOmhvc3QoLnBhcGVyLXRvYXN0LW9wZW4pIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNwYW4gaWQ9ImxhYmVsIj57e3RleHR9fTwvc3Bhbj4KICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10b2dnbGUtYnV0dG9uIj4KICA8dGVtcGxhdGUgc3RyaXAtd2hpdGVzcGFjZT4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6bm9uZTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1iYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIG9wYWNpdHk6IDAuNDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIGxpbmVhciAuMDhzOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhci1jb2xvciwgIzAwMDAwMCk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhcjsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1idXR0b24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IC0zcHg7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC42KTsKICAgICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSBsaW5lYXIgLjA4cywgYmFja2dyb3VuZC1jb2xvciBsaW5lYXIgLjA4czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gbGluZWFyIC4wOHMsIGJhY2tncm91bmQtY29sb3IgbGluZWFyIC4wOHM7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLXVuY2hlY2tlZC1idXR0b24tY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNTApKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi11bmNoZWNrZWQtYnV0dG9uOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbi5kcmFnZ2luZyB7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBub25lOwogICAgICAgIHRyYW5zaXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjaGVja2VkXTpub3QoW2Rpc2FibGVkXSkpIC50b2dnbGUtYmFyIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJhci1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYmFyOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudG9nZ2xlLWJhciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKICAgICAgICBvcGFjaXR5OiAwLjEyOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDE2cHgsIDApOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDE2cHgsIDApOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF06bm90KFtkaXNhYmxlZF0pKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJ1dHRvbi1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2JkYmRiZDsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAudG9nZ2xlLWluayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogLTE0cHg7CiAgICAgICAgbGVmdDogLTE0cHg7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgYm90dG9tOiBhdXRvOwogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluazsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAudG9nZ2xlLWluayB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWluazsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDM2cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICAgIC8qIFRoZSB0b2dnbGUgYnV0dG9uIGhhcyBhbiBhYnNvbHV0ZSBwb3NpdGlvbiBvZiAtM3B4OyBUaGUgZXh0cmEgMXB4CiAgICAgICAgLyogYWNjb3VudHMgZm9yIHRoZSB0b2dnbGUgYnV0dG9uIHNoYWRvdyBib3guICovCiAgICAgICAgbWFyZ2luOiA0cHggMXB4OwogICAgICB9CgogICAgICAudG9nZ2xlLWxhYmVsIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWxhYmVsLXNwYWNpbmcsIDhweCk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICAvKiBpbnZhbGlkIHN0YXRlICovCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1iYXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1iYXItY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1idXR0b24gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1idXR0b24tY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1pbmsgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWludmFsaWQtaW5rLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJ0b2dnbGVCYXIiIGNsYXNzPSJ0b2dnbGUtYmFyIj48L2Rpdj4KICAgICAgPGRpdiBpZD0idG9nZ2xlQnV0dG9uIiBjbGFzcz0idG9nZ2xlLWJ1dHRvbiI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJ0b2dnbGUtbGFiZWwiPjxzbG90Pjwvc2xvdD48L2Rpdj4KCiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1taW5pbWFwIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgbGluZWFyOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdCguaGlkZGVuKSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgY2FudmFzIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OwogICAgICB9CgogICAgICByZWN0IHsKICAgICAgICBmaWxsOiB3aGl0ZTsKICAgICAgICBzdHJva2U6ICMxMTExMTE7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxcHg7CiAgICAgICAgZmlsbC1vcGFjaXR5OiAwOwogICAgICAgIGZpbHRlcjogdXJsKCNtaW5pbWFwRHJvcFNoYWRvdyk7CiAgICAgICAgY3Vyc29yOiBtb3ZlOwogICAgICB9CgogICAgICBzdmcgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzdmc+CiAgICAgIDxkZWZzPgogICAgICAgIDxmaWx0ZXIgaWQ9Im1pbmltYXBEcm9wU2hhZG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTUwJSIgaGVpZ2h0PSIxNTAlIj4KICAgICAgICAgIDxmZW9mZnNldCByZXN1bHQ9Im9mZk91dCIgaW49IlNvdXJjZUdyYXBoaWMiIGR4PSIxIiBkeT0iMSI+PC9mZW9mZnNldD4KICAgICAgICAgIDxmZWNvbG9ybWF0cml4IHJlc3VsdD0ibWF0cml4T3V0IiBpbj0ib2ZmT3V0IiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMC4xIDAgMCAwIDAgMCAwLjEgMCAwIDAgMCAwIDAuMSAwIDAgMCAwIDAgMC41IDAiPjwvZmVjb2xvcm1hdHJpeD4KICAgICAgICAgIDxmZWdhdXNzaWFuYmx1ciByZXN1bHQ9ImJsdXJPdXQiIGluPSJtYXRyaXhPdXQiIHN0ZGRldmlhdGlvbj0iMiI+PC9mZWdhdXNzaWFuYmx1cj4KICAgICAgICAgIDxmZWJsZW5kIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImJsdXJPdXQiIG1vZGU9Im5vcm1hbCI+PC9mZWJsZW5kPgogICAgICAgIDwvZmlsdGVyPgogICAgICA8L2RlZnM+CiAgICAgIDxyZWN0PjwvcmVjdD4KICAgIDwvc3ZnPgogICAgPGNhbnZhcyBjbGFzcz0iZmlyc3QiPjwvY2FudmFzPgogICAgCiAgICA8Y2FudmFzIGNsYXNzPSJzZWNvbmQiPjwvY2FudmFzPgogICAgPGNhbnZhcyBjbGFzcz0iZG93bmxvYWQiPjwvY2FudmFzPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLXNjZW5lIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNzdmcgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgZm9udC1mYW1pbHk6IFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2hpZGRlbiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyogLS0tIE5vZGUgYW5kIGFubm90YXRpb24tbm9kZSBmb3IgTWV0YW5vZGUgLS0tICovCgogICAgICAubWV0YSA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubWV0YSA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogaHNsKDAsIDAlLCA3MCUpOwogICAgICB9CiAgICAgIC5ub2RlLm1ldGEuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgICAgLm5vZGUubWV0YS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLmFubm90YXRpb24ubWV0YS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAuYW5ub3RhdGlvbi5tZXRhLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgfQogICAgICAubWV0YS5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubWV0YS5zZWxlY3RlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubm9kZS5tZXRhLnNlbGVjdGVkLmV4cGFuZGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIHN0cm9rZTogcmVkOwogICAgICAgIHN0cm9rZS13aWR0aDogMzsKICAgICAgfQogICAgICAuYW5ub3RhdGlvbi5tZXRhLnNlbGVjdGVkID4gLm5vZGVzaGFwZSA+IHJlY3QsCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CiAgICAgIC5ub2RlLm1ldGEuc2VsZWN0ZWQuZXhwYW5kZWQuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZC5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCwKICAgICAgLmZhZGVkIHJlY3QsCiAgICAgIC5mYWRlZCBlbGxpcHNlLAogICAgICAuZmFkZWQgcGF0aCwKICAgICAgLmZhZGVkIHVzZSwKICAgICAgI3JlY3RIYXRjaCBsaW5lLAogICAgICAjZWxsaXBzZUhhdGNoIGxpbmUgewogICAgICAgIGNvbG9yOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBwYXRoIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweCAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuZmFkZWQgcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBlbGxpcHNlLAogICAgICAuZmFkZWQgdXNlIHsKICAgICAgICBmaWxsOiB1cmwoI2VsbGlwc2VIYXRjaCkgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLmZhZGVkIHRleHQgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC8qIFJ1bGVzIHVzZWQgZm9yIGlucHV0LXRyYWNpbmcuICovCiAgICAgIC5pbnB1dC1oaWdobGlnaHQgPiAqID4gcmVjdCwKICAgICAgLmlucHV0LWhpZ2hsaWdodCA+ICogPiBlbGxpcHNlLAogICAgICAuaW5wdXQtaGlnaGxpZ2h0ID4gKiA+IHVzZSB7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZmY5ODAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qICAtIEZhZGVkIG5vbi1pbnB1dCBzdHlsaW5nICovCiAgICAgIC5ub24taW5wdXQgPiAqID4gcmVjdCwKLm5vbi1pbnB1dCA+ICogPiBlbGxpcHNlLAoubm9uLWlucHV0ID4gKiA+IHVzZSwKLyogRm9yIENvbnN0IG5vZGVzLiAqLwoubm9uLWlucHV0ID4gKiA+IC5jb25zdGFudDpub3QoW2NsYXNzKj0iaW5wdXQtaGlnaGxpZ2h0Il0pID4KICAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSwKLyogRm9yIHN0eWxpbmcgb2YgYW5ub3RhdGlvbiBub2RlcyBvZiBub24taW5wdXQgbm9kZXMuICovCi5ub24taW5wdXQgPiBnID4gLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiBpbmhlcml0OwogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIC5ub24taW5wdXQgcGF0aCB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAubm9uLWlucHV0ID4gLm5vZGVzaGFwZSA+IHJlY3QsCi5ub24taW5wdXQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCwKLyogRm9yIHN0eWxpbmcgb2YgYW5ub3RhdGlvbiBub2RlcyBvZiBub24taW5wdXQgbm9kZXMuICovCi5ub24taW5wdXQgPiBnID4gLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5ub24taW5wdXQgZWxsaXBzZSwKICAgICAgLm5vbi1pbnB1dCB1c2UgewogICAgICAgIGZpbGw6IHVybCgjZWxsaXBzZUhhdGNoKSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAubm9uLWlucHV0ID4gdGV4dCB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLm5vbi1pbnB1dCAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgICB9CgogICAgICAubm9uLWlucHV0IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZS5yZWZsaW5lIHsKICAgICAgICBtYXJrZXItc3RhcnQ6IHVybCgjcmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgICAgfQoKICAgICAgLyogSW5wdXQgZWRnZXMuICovCiAgICAgIC5pbnB1dC1lZGdlLWhpZ2hsaWdodCA+IHRleHQgewogICAgICAgIGZpbGw6IGJsYWNrICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgLmlucHV0LWhpZ2hsaWdodCA+IC5pbi1hbm5vdGF0aW9ucyA+IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZSwKICAgICAgLmlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZAogICAgICAgID4gLmluLWFubm90YXRpb25zCiAgICAgICAgPiAuYW5ub3RhdGlvbgogICAgICAgID4gLmFubm90YXRpb24tZWRnZSB7CiAgICAgICAgc3Ryb2tlOiAjOTk5ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIE5vbi1pbnB1dCBlZGdlcy4gKi8KICAgICAgLm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCwKLm5vbi1pbnB1dCA+IGcgPiAuYW5ub3RhdGlvbiA+IHBhdGgsCi8qIEFubm90YXRpb24gc3R5bGVzIChsYWJlbCBhbmQgZWRnZXMgcmVzcGVjdGl2ZWx5KS4gKi8KLm5vbi1pbnB1dCA+IGcgPgouYW5ub3RhdGlvbjpub3QoLmlucHV0LWhpZ2hsaWdodCk6bm90KC5pbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQpID4KLmFubm90YXRpb24tbGFiZWwKLyouYW5ub3RhdGlvbi1lZGdlKi8KIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qIC0tLSBPcCBOb2RlIC0tLSAqLwoKICAgICAgLm9wID4gLm5vZGVzaGFwZSA+IC5ub2RlY29sb3J0YXJnZXQsCiAgICAgIC5vcCA+IC5hbm5vdGF0aW9uLW5vZGUgPiAubm9kZWNvbG9ydGFyZ2V0IHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgICBzdHJva2U6ICNjY2M7CiAgICAgIH0KCiAgICAgIC5vcC5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiAubm9kZWNvbG9ydGFyZ2V0LAogICAgICAub3Auc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gLm5vZGVjb2xvcnRhcmdldCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CgogICAgICAub3AuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gLm5vZGVjb2xvcnRhcmdldCwKICAgICAgLm9wLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IC5ub2RlY29sb3J0YXJnZXQgewogICAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgICAgfQoKICAgICAgLyogLS0tIFNlcmllcyBOb2RlIC0tLSAqLwoKICAgICAgLyogQnkgZGVmYXVsdCwgZG9uJ3Qgc2hvdyB0aGUgc2VyaWVzIGJhY2tncm91bmQgPHJlY3Q+LiAqLwogICAgICAuc2VyaWVzID4gLm5vZGVzaGFwZSA+IHJlY3QgewogICAgICAgIGZpbGw6IGhzbCgwLCAwJSwgNzAlKTsKICAgICAgICBmaWxsLW9wYWNpdHk6IDA7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogNSwgNTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC8qIE9uY2UgZXhwYW5kZWQsIHNob3cgdGhlIHNlcmllcyBiYWNrZ3JvdW5kIDxyZWN0PiBhbmQgaGlkZSB0aGUgPHVzZT4uICovCiAgICAgIC5zZXJpZXMuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgICAgZmlsbC1vcGFjaXR5OiAwLjE1OwogICAgICAgIHN0cm9rZTogaHNsKDAsIDAlLCA3MCUpOwogICAgICAgIHN0cm9rZS1vcGFjaXR5OiAxOwogICAgICB9CiAgICAgIC5zZXJpZXMuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gdXNlIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qKgogKiBUT0RPOiBTaW1wbGlmeSB0aGlzIGJ5IGFwcGx5aW5nIGEgc3RhYmxlIGNsYXNzIG5hbWUgdG8gYWxsIDxnPgogKiBlbGVtZW50cyB0aGF0IGN1cnJlbnRseSBoYXZlIGVpdGhlciB0aGUgbm9kZXNoYXBlIG9yIGFubm90YXRpb24tbm9kZSBjbGFzc2VzLgogKi8KICAgICAgLnNlcmllcyA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6ICNjY2M7CiAgICAgIH0KICAgICAgLnNlcmllcy5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMuaGlnaGxpZ2h0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLnNlcmllcy5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KCiAgICAgIC5zZXJpZXMuc2VsZWN0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbi5zZXJpZXMuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBCcmlkZ2UgTm9kZSAtLS0gKi8KICAgICAgLmJyaWRnZSA+IC5ub2Rlc2hhcGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6ICNmMGY7CiAgICAgICAgb3BhY2l0eTogMC4yOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBTdHJ1Y3R1cmFsIEVsZW1lbnRzIC0tLSAqLwogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUuc3RydWN0dXJhbCB7CiAgICAgICAgc3Ryb2tlOiAjZjBmOwogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiBSZWZlcmVuY2UgRWRnZSAqLwogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUucmVmZXJlbmNlZWRnZSB7CiAgICAgICAgc3Ryb2tlOiAjZmZiNzRkOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBTZXJpZXMgTm9kZXMgLS0tICovCgogICAgICAvKiBIaWRlIHRoZSByZWN0IGZvciBhIHNlcmllcycgYW5ub3RhdGlvbi4gKi8KICAgICAgLnNlcmllcyA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiAtLS0gTm9kZSBsYWJlbCAtLS0gKi8KCiAgICAgIC5ub2RlID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmaWxsOiAjNDQ0OwogICAgICB9CgogICAgICAubWV0YS5leHBhbmRlZCA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDlweDsKICAgICAgfQoKICAgICAgLnNlcmllcyA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDhweDsKICAgICAgfQoKICAgICAgLm9wID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogNnB4OwogICAgICB9CgogICAgICAuYnJpZGdlID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5ub2RlLm1ldGEuZXhwYW5kZWQgPiB0ZXh0Lm5vZGVsYWJlbCB7CiAgICAgICAgY3Vyc29yOiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuaGlnaGxpZ2h0ZWQgPiB0ZXh0LmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZpbGw6ICM1MGEzZjc7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiB0ZXh0LmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZpbGw6ICM0Mjg1ZjQ7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBBbm5vdGF0aW9uIC0tLSAqLwoKICAgICAgLyogb25seSBhcHBsaWVkIGZvciBhbm5vdGF0aW9ucyB0aGF0IGFyZSBub3Qgc3VtbWFyeSBvciBjb25zdGFudC4KKC5zdW1tYXJ5LCAuY29uc3RhbnQgZ2V0cyBvdmVycmlkZGVuIGJlbG93KSAqLwogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLW5vZGUgPiAqIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDAuNTsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiAxLCAxOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbi5zdW1tYXJ5ID4gLmFubm90YXRpb24tbm9kZSA+ICosCiAgICAgIC5hbm5vdGF0aW9uLmNvbnN0YW50ID4gLmFubm90YXRpb24tbm9kZSA+ICogewogICAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiBub25lOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjYWFhOwogICAgICAgIHN0cm9rZS13aWR0aDogMC41OwogICAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQpOwogICAgICB9CgogICAgICAuZmFkZWQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlIHsKICAgICAgICBtYXJrZXItZW5kOiB1cmwoI2Fubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgICAgfQoKICAgICAgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICAgIG1hcmtlci1zdGFydDogdXJsKCNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQpOwogICAgICB9CgogICAgICAuZmFkZWQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICAgIG1hcmtlci1zdGFydDogdXJsKCNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWNvbnRyb2wtZWRnZSB7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMSwgMTsKICAgICAgfQoKICAgICAgI2Fubm90YXRpb24tYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjYWFhOwogICAgICB9CgogICAgICAjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQgewogICAgICAgIGZpbGw6ICNlMGQ0YjM7CiAgICAgIH0KCiAgICAgICNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQgewogICAgICAgIGZpbGw6ICNhYWE7CiAgICAgIH0KCiAgICAgICNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQgewogICAgICAgIGZpbGw6ICNlMGQ0YjM7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogNXB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWxhYmVsLmFubm90YXRpb24tZWxsaXBzaXMgewogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgLyogSGlkZSBhbm5vdGF0aW9ucyBvbiBleHBhbmRlZCBtZXRhIG5vZGVzIHNpbmNlIHRoZXkncmUgcmVkdW5kYW50LiAqLwogICAgICAuZXhwYW5kZWQgPiAuaW4tYW5ub3RhdGlvbnMsCiAgICAgIC5leHBhbmRlZCA+IC5vdXQtYW5ub3RhdGlvbnMgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBBbm5vdGF0aW9uOiBDb25zdGFudCAtLS0gKi8KCiAgICAgIC5jb25zdGFudCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjODQ4NDg0OwogICAgICB9CgogICAgICAuY29uc3RhbnQuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSB7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgIH0KCiAgICAgIC5jb25zdGFudC5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgICAgfQoKICAgICAgLyogLS0tIEFubm90YXRpb246IFN1bW1hcnkgLS0tICovCgogICAgICAuc3VtbWFyeSA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogI2RiNDQzNzsKICAgICAgICBzdHJva2U6ICNkYjQ0Mzc7CiAgICAgIH0KCiAgICAgIC5zdW1tYXJ5LnNlbGVjdGVkID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICAgIGZpbGw6ICNhNTI3MTQ7CiAgICAgICAgc3Ryb2tlOiAjYTUyNzE0OwogICAgICB9CgogICAgICAuc3VtbWFyeS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgICAgfQoKICAgICAgLyogLS0tIEVkZ2UgLS0tICovCgogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjYmJiOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDAuNzU7CiAgICAgIH0KCiAgICAgIC5lZGdlIC5zZWxlY3RhYmxlZWRnZSB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAuc2VsZWN0ZWRlZGdlID4gcGF0aC5lZGdlbGluZSB7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIHN0cm9rZTogI2YwMDsKICAgICAgfQoKICAgICAgLmVkZ2Uuc2VsZWN0ZWRlZGdlIHRleHQgewogICAgICAgIGZpbGw6ICMwMDA7CiAgICAgIH0KCiAgICAgIC8qIExhYmVscyBzaG93aW5nIHRlbnNvciBzaGFwZXMgb24gZWRnZXMgKi8KICAgICAgLmVkZ2UgPiB0ZXh0IHsKICAgICAgICBmb250LXNpemU6IDMuNXB4OwogICAgICAgIGZpbGw6ICM2NjY7CiAgICAgIH0KCiAgICAgIC5kYXRhZmxvdy1hcnJvd2hlYWQgewogICAgICAgIGZpbGw6ICNiYmI7CiAgICAgIH0KCiAgICAgIC5yZWZlcmVuY2UtYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjZmZiNzRkOwogICAgICB9CgogICAgICAuc2VsZWN0ZWQtYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjZjAwOwogICAgICB9CgogICAgICAuZWRnZSAuY29udHJvbC1kZXAgewogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDIsIDI7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBHcm91cCBub2RlIGV4cGFuZC9jb2xsYXBzZSBidXR0b24gLS0tICovCgogICAgICAvKiBIaWRlcyBleHBhbmQvY29sbGFwc2UgYnV0dG9ucyB3aGVuIGEgbm9kZSBpc24ndCBleHBhbmRlZCBvciBoaWdobGlnaHRlZC4gVXNpbmcKICAgaW5jcmVkaWJseSBzbWFsbCBvcGFjaXR5IHNvIHRoYXQgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgPGc+IHBhcmVudCBzdGlsbCB0YWtlcwogICB0aGlzIGNvbnRhaW5lciBpbnRvIGFjY291bnQgZXZlbiB3aGVuIGl0IGlzbid0IHZpc2libGUgKi8KICAgICAgLm5vZGU6bm90KC5oaWdobGlnaHRlZCk6bm90KC5leHBhbmRlZCkgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciB7CiAgICAgICAgb3BhY2l0eTogMC4wMTsKICAgICAgfQogICAgICAubm9kZS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgICAgLmJ1dHRvbmNpcmNsZSB7CiAgICAgICAgZmlsbDogI2U3ODExZDsKICAgICAgfQogICAgICAuYnV0dG9uY2lyY2xlOmhvdmVyIHsKICAgICAgICBmaWxsOiAjYjk2NzE3OwogICAgICB9CiAgICAgIC5leHBhbmRidXR0b24sCiAgICAgIC5jb2xsYXBzZWJ1dHRvbiB7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgfQogICAgICAvKiBEbyBub3QgbGV0IHRoZSBwYXRoIGVsZW1lbnRzIGluIHRoZSBidXR0b24gdGFrZSBwb2ludGVyIGZvY3VzICovCiAgICAgIC5ub2RlID4gLm5vZGVzaGFwZSA+IC5idXR0b25jb250YWluZXIgPiAuZXhwYW5kYnV0dG9uLAogICAgICAubm9kZSA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyID4gLmNvbGxhcHNlYnV0dG9uIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgICAvKiBPbmx5IHNob3cgdGhlIGV4cGFuZCBidXR0b24gd2hlbiBhIG5vZGUgaXMgY29sbGFwc2VkIGFuZCBvbmx5IHNob3cgdGhlCiAgIGNvbGxhcHNlIGJ1dHRvbiB3aGVuIGEgbm9kZSBpcyBleHBhbmRlZC4gKi8KICAgICAgLm5vZGUuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5leHBhbmRidXR0b24gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLm5vZGU6bm90KC5leHBhbmRlZCkgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5jb2xsYXBzZWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLXN0YXRzIHsKICAgICAgICBmb250LXNpemU6IDRweDsKICAgICAgICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwgcmVjdCB7CiAgICAgICAgZmlsdGVyOiB1cmwoI2hlYWx0aC1waWxsLXNoYWRvdyk7CiAgICAgICAgcng6IDM7CiAgICAgICAgcnk6IDM7CiAgICAgIH0KCiAgICAgIC50aXRsZUNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHRvcDogMjBweDsKICAgICAgfQoKICAgICAgLnRpdGxlLAogICAgICAuYXV4VGl0bGUsCiAgICAgIC5mdW5jdGlvbkxpYnJhcnlUaXRsZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICAjbWluaW1hcCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAyMHB4OwogICAgICAgIGJvdHRvbTogMjBweDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q0ZDRkNDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB1bCB7CiAgICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB1bCBsaSB7CiAgICAgICAgcGFkZGluZzogNHB4IDE2cHg7CiAgICAgIH0KCiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0idGl0bGVDb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJ0aXRsZSIgY2xhc3M9InRpdGxlIj5NYWluIEdyYXBoPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImF1eFRpdGxlIiBjbGFzcz0iYXV4VGl0bGUiPkF1eGlsaWFyeSBOb2RlczwvZGl2PgogICAgICA8ZGl2IGlkPSJmdW5jdGlvbkxpYnJhcnlUaXRsZSIgY2xhc3M9ImZ1bmN0aW9uTGlicmFyeVRpdGxlIj4KICAgICAgICBGdW5jdGlvbnMKICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdmcgaWQ9InN2ZyI+CiAgICAgIDxkZWZzPgogICAgICAgIAogICAgICAgIDxwYXRoIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXBhdGgiIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIgLz4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1zbWFsbCIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iNSIgbWFya2VyaGVpZ2h0PSI1IiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3JlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1tZWRpdW0iIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjEzIiBtYXJrZXJoZWlnaHQ9IjEzIiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3JlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1sYXJnZSIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iMTYiIG1hcmtlcmhlaWdodD0iMTYiIHJlZng9IjIiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIiBtYXJrZXJ1bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgY2xhc3M9InJlZmVyZW5jZS1hcnJvd2hlYWQiIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXhsYXJnZSIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iMjAiIG1hcmtlcmhlaWdodD0iMjAiIHJlZng9IjIiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIiBtYXJrZXJ1bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgoKICAgICAgICAKICAgICAgICA8cGF0aCBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLXBhdGgiIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIgLz4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtc21hbGwiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iMiIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiIG1hcmtlcnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbWVkaXVtIiB2aWV3Ym94PSIwIDAgMTAgMTAiIG1hcmtlcndpZHRoPSIxMyIgbWFya2VyaGVpZ2h0PSIxMyIgcmVmeD0iMiIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiIG1hcmtlcnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbGFyZ2UiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjE2IiBtYXJrZXJoZWlnaHQ9IjE2IiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgY2xhc3M9ImRhdGFmbG93LWFycm93aGVhZCIgaWQ9ImRhdGFmbG93LWFycm93aGVhZC14bGFyZ2UiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjIwIiBtYXJrZXJoZWlnaHQ9IjIwIiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgoKICAgICAgICAKICAgICAgICA8bWFya2VyIGlkPSJhbm5vdGF0aW9uLWFycm93aGVhZCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iNSIgcmVmeT0iMi41IiBvcmllbnQ9ImF1dG8iPgogICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCA1LDIuNSBMIDAsNSBMIDAsMCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGlkPSJhbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iNSIgcmVmeT0iMi41IiBvcmllbnQ9ImF1dG8iPgogICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCA1LDIuNSBMIDAsNSBMIDAsMCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGlkPSJyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQiIG1hcmtlcndpZHRoPSI1IiBtYXJrZXJoZWlnaHQ9IjUiIHJlZng9IjAiIHJlZnk9IjIuNSIgb3JpZW50PSJhdXRvIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0gNSwwIEwgMCwyLjUgTCA1LDUgTCA1LDAiIC8+CiAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgPG1hcmtlciBpZD0icmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkIiBtYXJrZXJ3aWR0aD0iNSIgbWFya2VyaGVpZ2h0PSI1IiByZWZ4PSIwIiByZWZ5PSIyLjUiIG9yaWVudD0iYXV0byI+CiAgICAgICAgICA8cGF0aCBkPSJNIDUsMCBMIDAsMi41IEwgNSw1IEwgNSwwIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLXN0YW1wIiByeD0iNy41IiByeT0iMyIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHJ4PSI1IiByeT0iMiIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtdmVydGljYWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iOSIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjYiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSIzIiAvPgogICAgICAgIDwvZz4KICAgICAgICAKICAgICAgICA8ZyBpZD0ib3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTYiIHk9IjQiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxMiIgeT0iNCIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjQiIC8+CiAgICAgICAgPC9nPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtYW5ub3RhdGlvbi1zdGFtcCI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjkiIHk9IjIiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjciIHk9IjIiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjUiIHk9IjIiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxzdmcgaWQ9InN1bW1hcnktaWNvbiIgZmlsbD0iIzg0ODQ4NCIgaGVpZ2h0PSIxMiIgdmlld2JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMTIiPgogICAgICAgICAgPHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIgLz4KICAgICAgICA8L3N2Zz4KCiAgICAgICAgCiAgICAgICAgPHBhdHRlcm4gaWQ9InJlY3RIYXRjaCIgcGF0dGVybnRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiIHdpZHRoPSI1IiBoZWlnaHQ9IjUiIHBhdHRlcm51bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiIC8+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIDxwYXR0ZXJuIGlkPSJlbGxpcHNlSGF0Y2giIHBhdHRlcm50cmFuc2Zvcm09InJvdGF0ZSg0NSAwIDApIiB3aWR0aD0iMiIgaGVpZ2h0PSIyIiBwYXR0ZXJudW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDxsaW5lIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIyIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxIiAvPgogICAgICAgIDwvcGF0dGVybj4KCiAgICAgICAgCiAgICAgICAgPGZpbHRlciBpZD0iaGVhbHRoLXBpbGwtc2hhZG93IiB4PSItNDAlIiB5PSItNDAlIiB3aWR0aD0iMTgwJSIgaGVpZ2h0PSIxODAlIj4KICAgICAgICAgIDxmZWdhdXNzaWFuYmx1ciBpbj0iU291cmNlQWxwaGEiIHN0ZERldmlhdGlvbj0iMC44IiAvPgogICAgICAgICAgPGZlb2Zmc2V0IGR4PSIwIiBkeT0iMCIgcmVzdWx0PSJvZmZzZXRibHVyIiAvPgogICAgICAgICAgPGZlZmxvb2QgZmxvb2QtY29sb3I9IiMwMDAwMDAiIC8+CiAgICAgICAgICA8ZmVjb21wb3NpdGUgaW4yPSJvZmZzZXRibHVyIiBvcGVyYXRvcj0iaW4iIC8+CiAgICAgICAgICA8ZmVtZXJnZT4KICAgICAgICAgICAgPGZlbWVyZ2Vub2RlIC8+CiAgICAgICAgICAgIDxmZW1lcmdlbm9kZSBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgICAgICAgIDwvZmVtZXJnZT4KICAgICAgICA8L2ZpbHRlcj4KICAgICAgPC9kZWZzPgogICAgICAKICAgICAgPHJlY3QgZmlsbD0id2hpdGUiIHdpZHRoPSIxMDAwMCIgaGVpZ2h0PSIxMDAwMCI+PC9yZWN0PgogICAgICA8ZyBpZD0icm9vdCI+PC9nPgogICAgPC9zdmc+CiAgICA8dGYtZ3JhcGgtbWluaW1hcCBpZD0ibWluaW1hcCI+PC90Zi1ncmFwaC1taW5pbWFwPgogICAgPGRpdiBpZD0iY29udGV4dE1lbnUiIGNsYXNzPSJjb250ZXh0LW1lbnUiPjwvZGl2PgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgIH0KCiAgICAgIC52ZXJ0aWNhbCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIEBhcHBseSAtLWxheW91dC12ZXJ0aWNhbDsKICAgICAgfQoKICAgICAgLmF1dG8gewogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LWF1dG87CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICBwYXBlci1idXR0b24gewogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgPGRpdiBjbGFzcz0idmVydGljYWwiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1t0aXRsZV1dIj4KICAgICAgICAgIDxoMj5bW3RpdGxlXV08L2gyPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRmLWdyYXBoLXNjZW5lIGlkPSJzY2VuZSIgY2xhc3M9ImF1dG8iIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iIGhpZ2hsaWdodGVkLW5vZGU9IltbX2dldFZpc2libGUoaGlnaGxpZ2h0ZWROb2RlKV1dIiBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiBzZWxlY3RlZC1lZGdlPSJ7e3NlbGVjdGVkRWRnZX19IiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHByb2dyZXNzPSJbW3Byb2dyZXNzXV0iIG5vZGUtY29udGV4dC1tZW51LWl0ZW1zPSJbW25vZGVDb250ZXh0TWVudUl0ZW1zXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0ie3toZWFsdGhQaWxsU3RlcEluZGV4fX0iIGhhbmRsZS1lZGdlLXNlbGVjdGVkPSJbW2hhbmRsZUVkZ2VTZWxlY3RlZF1dIiB0cmFjZS1pbnB1dHM9IltbdHJhY2VJbnB1dHNdXSI+PC90Zi1ncmFwaC1zY2VuZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9ImNvbnRpbnVlLWJ1dHRvbiIgb24tY2xpY2s9Il9jb250aW51ZUJ1dHRvbkNhbGxiYWNrIj4KICAgICAgPHNwYW4+W1tfY29udGludWVCdXR0b25UZXh0XV08L3NwYW4+CiAgICA8L3BhcGVyLWJ1dHRvbj4KICAgIDxwYXBlci1kaWFsb2cgd2l0aC1iYWNrZHJvcCBpZD0iY29udGludWVEaWFsb2ciPgogICAgICA8aDI+Q29udGludWUuLi48L2gyPgogICAgICA8ZGl2IGNsYXNzPSJjb250aW51ZS10by10eXBlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250aW51ZS10by10eXBlLW5hbWUiPgogICAgICAgICAgT3ZlciBTZXNzaW9uIFJ1bnM6CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJjb250aW51ZU51bSIgY2xhc3M9ImlucHV0LWJveCIgbGFiZWw9Ik51bWJlciBvZiBTZXNzaW9uIFJ1bnMgKGluY2x1ZGluZyB0aGUgY3VycmVudCBvbmUpOiIgYWx3YXlzLWZsb2F0LWxhYmVsIHR5cGU9Im51bWJlciIgbWluPSIxIiBzdGVwPSIxIiB2YWx1ZT0ie3tjb250aW51ZU51bX19Ij48L3BhcGVyLWlucHV0PgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0iZ28tYnV0dG9uIiBpY29uPSJhcnJvdy1mb3J3YXJkIiB0aXRsZT0iU2Vzc2lvbiBSdW5zIEdvIiBvbi10YXA9Il9zZXNzaW9uUnVuR29CdXR0b25DYWxsYmFjayI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRpbnVlLXRvLXR5cGUiPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRpbnVlLXRvLXR5cGUtbmFtZSI+CiAgICAgICAgICBUaWxsIENvbmRpdGlvbiBNZXQgYnkgV2F0Y2hlZCBUZW5zb3IKICAgICAgICA8L2Rpdj4KICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBpZD0idGVuc29yQ29uZGl0aW9uRHJvcGRvd24iIGNsYXNzPSJpbnB1dC1ib3giIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0iVGVuc29yIENvbmRpdGlvbiIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfc2VsZWN0ZWRUZW5zb3JDb25kaXRpb259fSI+CiAgICAgICAgICAKICAgICAgICAgIDxwYXBlci1saXN0Ym94IGlkPSJ0ZW5zb3JDb25kaXRpb25NZW51IiBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5Db250YWlucyArLy3iiJ4gb3IgTmFOPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+Q29udGFpbnMgKy8t4oiePC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+Q29udGFpbnMgTmFOPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWF4ICZndDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5NYXggJmx0OzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPk1pbiAmZ3Q7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWluICZsdDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5NYXggLSBNaW4gJmd0OzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPk1heCAtIE1pbiAmbHQ7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWVhbiAmZ3Q7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWVhbiAmbHQ7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+U3RhbmRhcmQgZGV2aWF0aW9uICZndDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5TdGFuZGFyZCBkZXZpYXRpb24gJmx0OzwvcGFwZXItaXRlbT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGNsYXNzPSJnby1idXR0b24iIGljb249ImFycm93LWZvcndhcmQiIHRpdGxlPSJUZW5zb3IgQ29uZGl0aW9uIEdvIiBvbi10YXA9Il90ZW5zb3JDb250aW51ZUdvQnV0dG9uQ2FsbGJhY2siPgogICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJyZWYtdmFsdWUiIGNsYXNzPSJpbnB1dC1ib3giIGxhYmVsPSJSZWZlcmVuY2UgdmFsdWUgdG8gY29tcGFyZSB0byIgdHlwZT0ibnVtYmVyIiB2YWx1ZT0ie3tfdGVuc29yQ29uZGl0aW9uUmVmVmFsdWV9fSIgaGlkZGVuPSJbW19pc1JlZlZhbHVlSW5wdXRIaWRkZW5dXSI+CiAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IC5jb250aW51ZS10by10eXBlLW5hbWUgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIDpob3N0IHBhcGVyLWRpYWxvZyB7CiAgICAgICAgd2lkdGg6IDM2dnc7CiAgICAgIH0KICAgICAgOmhvc3QgLmlucHV0LWJveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogODAlOwogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgfQogICAgICA6aG9zdCAuZ28tYnV0dG9uIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDE1JTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWluaXRpYWwtZGlhbG9nIj4KICA8dGVtcGxhdGU+CiAgICAKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfb3Blbl1dIj4KICAgICAgPGRpdiBpZD0iZGFzaGJvYXJkLWJhY2tkcm9wIj48L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8cGFwZXItZGlhbG9nIGlkPSJkaWFsb2ciIG5vLWNhbmNlbC1vbi1vdXRzaWRlLWNsaWNrIG5vLWNhbmNlbC1vbi1lc2Mta2V5IG9wZW5lZD0ie3tfb3Blbn19Ij4KICAgICAgPGgyIGlkPSJkaWFsb2ctdGl0bGUiPltbX3RpdGxlXV08L2gyPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc0N1c3RvbU1lc3NhZ2VdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iY3VzdG9tLW1lc3NhZ2UiPltbX2N1c3RvbU1lc3NhZ2VdXTwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9oYXNDdXN0b21NZXNzYWdlXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWV4YW1wbGUtc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uLXRpdGxlIj4KICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvU2Vzc2lvbiIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+dGYuU2Vzc2lvbjwvYT46CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlLXNuaXBwZXQiPmltcG9ydCB0ZW5zb3JmbG93IGFzIHRmCmZyb20gdGVuc29yZmxvdy5weXRob24gaW1wb3J0IGRlYnVnIGFzIHRmX2RlYnVnCgpzZXNzID0gdGYuU2Vzc2lvbigpCnNlc3MgPSB0Zl9kZWJ1Zy5UZW5zb3JCb2FyZERlYnVnV3JhcHBlclNlc3Npb24oc2VzcywgIltbX2hvc3RdXTpbW19wb3J0XV0iKQpzZXNzLnJ1bihteV9mZXRjaGVzKQogICAgICAgICAgPC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1leGFtcGxlLXNlY3Rpb24tdGl0bGUiPgogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL3Byb2dyYW1tZXJzX2d1aWRlL2VzdGltYXRvcnMiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPkVzdGltYXRvcjwvYT4KICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL3RyYWluL01vbml0b3JlZFNlc3Npb24iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPk1vbml0b3JlZFNlc3Npb248L2E+OgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZS1zbmlwcGV0Ij5pbXBvcnQgdGVuc29yZmxvdyBhcyB0Zgpmcm9tIHRlbnNvcmZsb3cucHl0aG9uIGltcG9ydCBkZWJ1ZyBhcyB0Zl9kZWJ1ZwoKaG9vayA9IHRmX2RlYnVnLlRlbnNvckJvYXJkRGVidWdIb29rKCJbW19ob3N0XV06W1tfcG9ydF1dIikKbXlfZXN0aW1hdG9yLmZpdCh4PXhfZGF0YSwgeT15X2RhdGEsIHN0ZXBzPTEwMDAsIG1vbml0b3JzPVtob29rXSkKICAgICAgICAgICAgPC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1leGFtcGxlLXNlY3Rpb24tdGl0bGUiPgogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8va2VyYXMuaW8vbW9kZWxzL21vZGVsLyIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+S2VyYXMgTW9kZWw8L2E+OgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZS1zbmlwcGV0Ij5pbXBvcnQgdGVuc29yZmxvdyBhcyB0Zgpmcm9tIHRlbnNvcmZsb3cucHl0aG9uIGltcG9ydCBkZWJ1ZyBhcyB0Zl9kZWJ1ZwppbXBvcnQga2VyYXMKCmtlcmFzLmJhY2tlbmQuc2V0X3Nlc3Npb24oCiAgICB0Zl9kZWJ1Zy5UZW5zb3JCb2FyZERlYnVnV3JhcHBlclNlc3Npb24odGYuU2Vzc2lvbigpLCAiW1tfaG9zdF1dOltbX3BvcnRdXSIpKQojIERlZmluZSB5b3VyIGtlcmFzIG1vZGVsLCBjYWxsZWQgIm1vZGVsIi4KbW9kZWwuZml0KC4uLikKICAgICAgICAgICAgPC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvcGFwZXItZGlhbG9nPgogICAgPHN0eWxlPgogICAgICAvKiogV2UgcmVseSBvbiBhIHNlcGFyYXRlIGBfaGlkZGVuYCBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRpcmVjdGx5IG1ha2luZyB1c2UKICAgICAgICAgIG9mIHRoZSBgX29wZW5gIGF0dHJpYnV0ZSBiZWNhdXNlIHRoaXMgQ1NTIHNwZWNpZmljYXRpb24gbWF5IHN0cmFuZ2VseQogICAgICAgICAgYWZmZWN0IG90aGVyIGVsZW1lbnRzIHRocm91Z2hvdXQgVGVuc29yQm9hcmQuIFNlZSAjODk5LiAqLwogICAgICA6aG9zdChbX2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIDpob3N0LAogICAgICAjZGFzaGJvYXJkLWJhY2tkcm9wIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAjZGFzaGJvYXJkLWJhY2tkcm9wIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICAgIH0KCiAgICAgIC5jb2RlLWV4YW1wbGUgewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICB9CiAgICAgIC5jb2RlLWV4YW1wbGUtc2VjdGlvbiB7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgLmNvZGUtZXhhbXBsZS1zZWN0aW9uLXRpdGxlIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAuY29kZS1zbmlwcGV0IHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDFlbTsKICAgICAgfQoKICAgICAgI2RpYWxvZy10aXRsZSB7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgIC5jdXN0b20tbWVzc2FnZSB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZGVidWdnZXItcmVzaXplciI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0iYmFycyI+CiAgICAgIDxkaXYgY2xhc3M9ImJhcnMtcm90YXRvciI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImJhcnMtdGV4dCI+fCB8PC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdChbX3Jlc2l6ZXItaWRlbnRpZmllcl0pIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYmFja2dyb3VuZDogI2NjYzsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2lzLWhvcml6b250YWxdKSB7CiAgICAgICAgY3Vyc29yOiByb3ctcmVzaXplOwogICAgICAgIGhlaWdodDogMTBweDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICA6aG9zdChbX2lzLXZlcnRpY2FsXSkgewogICAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgICByaWdodDogLTE1cHg7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgfQoKICAgICAgLmJhcnMgewogICAgICAgIHdpZHRoOiA4MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDUwJTsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgZm9udC1zaXplOiA1cHg7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgIH0KCiAgICAgIC8qKiBUaGlzIGJsb2NrIHByZXZlbnRzIHRoZSBiYXJzIHJvdGF0b3IgZnJvbSBoYXZpbmcgYSBoZWlnaHQgdGhhdCBpcwogICAgICAgICAgdGhlIGVudGlyZSB2aWV3cG9ydCwgdGh1cyBvY2NsdWRpbmcgaXQgYW5kIGdpdmluZyBpdCBhbiB1bmRlc2lyZWQgY3Vyc29yCiAgICAgICAgICB2YWx1ZS4gKi8KICAgICAgLmJhcnMtcm90YXRvciB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICA6aG9zdChbaXMtaG9yaXpvbnRhbF0pIC5iYXJzLXJvdGF0b3IgewogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKICAgICAgfQoKICAgICAgLmJhcnMtdGV4dCB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVkoMTUpOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1vcC1zZWxlY3RvciI+CiAgPHRlbXBsYXRlPgogICAgPGRpdj4KICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgaWQ9ImZpbHRlci1tb2RlIiBuby1sYWJlbC1mbG9hdD0idHJ1ZSIgbGFiZWw9IkZpbHRlciBNb2RlIiBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19maWx0ZXJNb2RlfX0iPgogICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5Ob2RlIE5hbWU8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+T3AgVHlwZTwvcGFwZXItaXRlbT4KICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJmaWx0ZXItaW5wdXQiIGxhYmVsPSJGaWx0ZXIgUmVnZXgiIGFsd2F5cy1mbG9hdC1sYWJlbCB2YWx1ZT0ie3tfZmlsdGVySW5wdXR9fSI+PC9wYXBlci1pbnB1dD4KICAgIDwvZGl2PgogICAgPHBhcGVyLXNwaW5uZXItbGl0ZSBhY3RpdmUgY2xhc3M9InNwaW5uZXIiIGlkPSJsb2FkaW5nLXNwaW5uZXIiIGhpZGRlbj0iW1shX2lzTG9hZGluZ11dIj4KICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgPGRpdiBpZD0ic2VsZWN0b3ItaGllcmFyY2h5Ij48L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLmluZGVudGVkLWxldmVsLWNvbnRhaW5lciAuY29udGVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogMCAwIDAgMjBweDsKICAgICAgfQoKICAgICAgLmxldmVsLWNvbnRhaW5lciBpcm9uLWNvbGxhcHNlIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAyMHB4OwogICAgICB9CgogICAgICBwYXBlci1jaGVja2JveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiAxOHB4OwogICAgICAgIGhlaWdodDogMThweDsKICAgICAgICBtYXJnaW46IDAgOHB4IDAgMDsKICAgICAgfQoKICAgICAgLm9wLXR5cGUgewogICAgICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7CiAgICAgICAgY29sb3I6ICM0NDQ7CiAgICAgIH0KCiAgICAgIC5vcC10aXRsZS1sZWFmIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5vcC10aXRsZS1sZWFmOmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQoKICAgICAgLnBhcnRpYWwtY2hlY2tib3ggewogICAgICAgIGJhY2tncm91bmQ6ICNmNTdjMDA7CiAgICAgIH0KCiAgICAgIC5ub2RlLWV4cGFuZC1idXR0b24gewogICAgICAgIG1hcmdpbjogMCAwIDAgLTEzcHg7CiAgICAgIH0KCiAgICAgIC5sZXZlbC10aXRsZS10ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgICAgICBtYXJnaW46IDAgMCAwIC0xcHg7CiAgICAgIH0KCiAgICAgIC5vcC1kZXNjcmlwdGlvbiB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDMwMDsKICAgICAgICBtYXJnaW46IDAgMCAwIDI3cHg7CiAgICAgICAgcGFkZGluZzogMTBweCAwOwogICAgICB9CgogICAgICAuc3Bpbm5lciB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgICNmaWx0ZXItbW9kZSB7CiAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgI2ZpbHRlci1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDI1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmhpZ2hsaWdodGVkIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CiAgICAgIC5oaWdobGlnaHRlZCA+IC5vcC10eXBlIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CgogICAgICAjc2VsZWN0b3ItaGllcmFyY2h5IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1zZXNzaW9uLXJ1bnMtdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0ic2Vzc2lvbi1ydW5zLWRpdiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlNlc3Npb24gUnVuczwvZGl2PgogICAgICA8dGFibGUgaWQ9InNlc3Npb24tcnVucy10YWJsZSIgYWxpZ249ImxlZnQiIGNsYXNzPSJzZXNzaW9uLXJ1bnMtdGFibGUiPgogICAgICAgIDx0ciBhbGlnbj0ibGVmdCI+CiAgICAgICAgICA8dGg+RmVlZHM8L3RoPgogICAgICAgICAgPHRoPkZldGNoZXM8L3RoPgogICAgICAgICAgPHRoPlRhcmdldHM8L3RoPgogICAgICAgICAgPHRoPiMoRGV2aWNlcyk8L3RoPgogICAgICAgICAgPHRoPkNvdW50PC90aD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiAyMHB4IDA7CiAgICAgIH0KCiAgICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDExMCU7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgOmhvc3QgLmluZGVudGVkLWxldmVsLWNvbnRhaW5lciAuY29udGVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogMCAwIDAgMTBweDsKICAgICAgfQoKICAgICAgLyogVE9ETyhjYWlzKTogVGhpcyBuZWVkcyB3b3JrOiB0aGUgdGFibGUgc2hvdWxkbid0IGdldCB0b28gd2lkZSB3aGVuCiAgICAgICAgIHRoZXJlIGFyZSBtYW55IGZlZWRzL2ZldGNoZXMvdGFyZ3RlIG5hbWVzLiAqLwogICAgICAuc2Vzc2lvbi1ydW5zLXRhYmxlIHsKICAgICAgICBhbGlnbi1jb250ZW50OiBsZWZ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBsZWZ0OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgZm9udC1zaXplOiA5MCU7CiAgICAgICAgYm9yZGVyLXN0eWxlOiBzb2xpZCAxcHggYmxhY2s7CiAgICAgICAgdGFibGUtbGF5b3V0OiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgYm94LXNoYWRvdzogM3B4IDNweCAjZGRkOwogICAgICB9CiAgICAgIC5hY3RpdmUtc2Vzc2lvbi1ydW4gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZTA7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLnNvbGUtYWN0aXZlLXNlc3Npb24tcnVuIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTcyLCAyMzIsIDE4OCk7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5ub2RlLW9yLXRlbnNvci1lbGVtZW50IHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub2RlLW9yLXRlbnNvci1lbGVtZW50OmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNvdXJjZS1jb2RlLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImZ1bGxTdGFja0RpYWxvZyIgaGlkZGVuJD0iW1shX2Z1bGxTdGFja1Nob3duXV0iPgogICAgICA8ZGl2IGlkPSJmdWxsLXN0YWNrLXRpdGxlIj4KICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iZmlsdGVyLWxpc3QiIGRpc2FibGVkPSJ0cnVlIj4KICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIEZ1bGwgU3RhY2sgVHJhY2Ugb2YgTm9kZToKICAgICAgICA8ZGl2IGlkPSJmdWxsLXN0YWNrLW5vZGUtbmFtZSI+IltbX2Z1bGxTdGFja05vZGVOYW1lXV0iPC9kaXY+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImNsb3NlIiBpZD0iY2xvc2UtZnVsbC1zdGFjay1idXR0b24iIHRpdGxlPSJDbG9zZSBGdWxsIFN0YWNrIiBvbi10YXA9Il9jbG9zZUZ1bGxTdGFja0RpYWxvZyI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDx1bCBpZD0iZnVsbC1zdGFjay1jb250ZW50Ij48L3VsPgogICAgPC9kaXY+CiAgICA8cGFwZXItdGFicyBpZD0ic291cmNlLWZpbGVzLXRhYnMiIHNlbGVjdGVkPSJ7e19maWxlUGF0aFNlbGVjdGVkfX0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zaG9ydEZpbGVQYXRoc11dIj4KICAgICAgICA8cGFwZXItdGFiIGlkPSJbW2l0ZW0uaWRdXSI+W1tpdGVtLm5hbWVdXTwvcGFwZXItdGFiPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9wYXBlci10YWJzPgogICAgPGRpdiBpZD0ic291cmNlLWZpbGUtY29udGVudCIgY2xhc3M9InNvdXJjZS1jb250ZW50Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfZmlsZUxpbmVzXV0iPgogICAgICAgIDxkaXYgY2xhc3MkPSJ7e2l0ZW0uc291cmNlQ2xhc3N9fSIgaWQ9InNvdXJjZS1saW5lLVtbaXRlbS5saW5lbm9dXSI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic291cmNlLWxpbmUtbnVtYmVyIiBpZD0ic291cmNlLWxpbmVuby1bW2l0ZW0ubGluZW5vXV0iPgogICAgICAgICAgICBbW2l0ZW0ubGluZW5vXV0KICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJzb3VyY2UtbGluZS1ub2RlLXRvZ2dsZSIgaWQ9InNvdXJjZS1saW5lLW5vZGUtdG9nZ2xlLVtbaXRlbS5saW5lbm9dXSI+CiAgICAgICAgICAgIFtbaXRlbS5udW1Ob2Rlc11dCiAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic291cmNlLWxpbmUtdGV4dCIgaWQ9InNvdXJjZS1saW5lLXRleHQtW1tpdGVtLmxpbmVub11dIj4KICAgICAgICAgICAgW1tpdGVtLnRleHRdXQogICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPGRpdiBjbGFzcz0ic291cmNlLWxpbmUtbm9kZXMiIGlkPSJzb3VyY2UtbGluZS1ub2Rlcy1bW2l0ZW0ubGluZW5vXV0iPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgICNzb3VyY2UtZmlsZXMtdGFicyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogOCU7CiAgICAgIH0KICAgICAgLnNvdXJjZS1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiA5MCU7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDkwJTsKICAgICAgICBvdmVyZmxvdy14OiBzY3JvbGw7CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICB9CiAgICAgIC5zb3VyY2UtY29udGVudCA6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmMDA7CiAgICAgIH0KICAgICAgLmhpZ2hsaWdodGVkLXNvdXJjZS1saW5lIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1udW1iZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBjb2xvcjogbGlnaHRibHVlOwogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1ub2RlLXRvZ2dsZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGNvbG9yOiBibHVlOwogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAuc291cmNlLWxpbmUtbm9kZXMgewogICAgICAgIHBhZGRpbmctbGVmdDogNGVtOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgICBtYXJnaW4tdG9wOiAwZW07CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMGVtOwogICAgICAgIG1hcmdpbi1yaWdodDogMWVtOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1ub2RlLWVudHJ5IHsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDFlbTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7CiAgICAgIH0KICAgICAgLnNvdXJjZS1saW5lLW5vZGVzIHNwYW4gewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7CiAgICAgIH0KICAgICAgLnNvdXJjZS1saW5lLXRleHQgewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgICAgI2Z1bGxTdGFja0RpYWxvZyB7CiAgICAgICAgei1pbmRleDogMTAwMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAxMCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIHdpZHRoOiA0NSU7CiAgICAgICAgaGVpZ2h0OiA4NSU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgZ3JheTsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggI2RkZDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICAgICNmdWxsLXN0YWNrLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDExMCU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgICNmdWxsLXN0YWNrLW5vZGUtbmFtZSB7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgIH0KICAgICAgOmhvc3QgI2Z1bGwtc3RhY2stY29udGVudCB7CiAgICAgICAgcGFkZGluZy10b3A6IDFlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTsKICAgICAgICBtYXJnaW4tdG9wOiAwLjVlbTsKICAgICAgICBmb250LXNpemU6IDkwJTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KICAgICAgLnN0YWNrLWZyYW1lLWNsaWNrYWJsZSB7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC5zdGFjay1mcmFtZS1ub25jbGlja2FibGUgewogICAgICAgIGNvbG9yOiAjNTU1OwogICAgICB9CiAgICAgICNjbG9zZS1mdWxsLXN0YWNrLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGVuc29yLWRhdGEtc3VtbWFyeSI+CiAgPHRlbXBsYXRlPgogICAgPHNwYW4gY2xhc3M9InNlY3Rpb24tdGl0bGUiPlRlbnNvciBWYWx1ZSBPdmVydmlldzwvc3Bhbj4KICAgIDxkaXYgaWQ9InRlbnNvci1kYXRhLWRpdiIgY2xhc3M9InRlbnNvci1kYXRhLWRpdiI+CiAgICAgIDx0YWJsZSBpZD0idGVuc29yLWRhdGEtdGFibGUiIGFsaWduPSJsZWZ0IiBjbGFzcz0idGVuc29yLWRhdGEtdGFibGUiPgogICAgICAgIDx0aGVhZD4KICAgICAgICAgIDx0ciBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAgIDx0aD5UZW5zb3I8L3RoPgogICAgICAgICAgICA8dGg+Q291bnQ8L3RoPgogICAgICAgICAgICA8dGg+RFR5cGU8L3RoPgogICAgICAgICAgICA8dGg+U2hhcGU8L3RoPgogICAgICAgICAgICA8dGggd2lkdGg9IjI1JSI+VmFsdWU8L3RoPgogICAgICAgICAgICA8dGggd2lkdGg9IjI1JSI+CiAgICAgICAgICAgICAgSGVhbHRoIFBpbGwKICAgICAgICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBpZD0ic2hvdy1oZWFsdGgtcGlsbHMiIGNoZWNrZWQ9Int7X2hlYWx0aFBpbGxzRW5hYmxlZH19Ij4KICAgICAgICAgICAgICA8L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLWNhcmQ+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFsdGgtcGlsbC1sZWdlbmQiIGlkPSJoZWFsdGgtcGlsbC1sZWdlbmQiPjwvZGl2PgogICAgICAgICAgICAgIDwvcGFwZXItY2FyZD4KICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgPHRoIHdpZHRoPSI1JSI+PC90aD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90aGVhZD4KICAgICAgICA8dGJvZHk+PC90Ym9keT4KICAgICAgPC90YWJsZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCAjdGVuc29yLWRhdGEtZGl2IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMTAlOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIDpob3N0IC5pbmRlbnRlZC1sZXZlbC1jb250YWluZXIgLmNvbnRlbnQtY29udGFpbmVyIHsKICAgICAgICBtYXJnaW46IDAgMCAwIDEwcHg7CiAgICAgIH0KICAgICAgOmhvc3QgLnRlbnNvci1kYXRhLXRhYmxlIHsKICAgICAgICBhbGlnbi1jb250ZW50OiBsZWZ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBsZWZ0OwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwYWRkaW5nLXRvcDogM3B4OwogICAgICAgIHBhZGRpbmctbGVmdDogM3B4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgICBib3gtc2hhZG93OiAzcHggM3B4ICNkZGQ7CiAgICAgIH0KICAgICAgOmhvc3QgI3RlbnNvci1kYXRhLXRhYmxlIHRoIHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CiAgICAgIDpob3N0IC5hY3RpdmUtdGVuc29yIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGJvcmRlcjogc29saWQgMXB4ICM4ODg7CiAgICAgIH0KICAgICAgOmhvc3QgLmhpZ2hsaWdodGVkIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CiAgICAgIDpob3N0IC5oZWFsdGgtcGlsbC1sZWdlbmQgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIDpob3N0ICNzaG93LWhlYWx0aC1waWxscyB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIC52YWx1ZS1leHBhbnNpb24tbGluayB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC52YWx1ZS1leHBhbnNpb24tbGluayA6aG92ZXIgewogICAgICAgIGNvbG9yOiBibHVlOwogICAgICB9CiAgICAgIC5oZWFsdGgtcGlsbCA6aG92ZXIgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAudGVuc29yLW5hbWUgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAudGVuc29yLW5hbWUgOmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxzdHlsZT4vKiBDb3B5cmlnaHQgMjAxOSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLnRlbnNvci13aWRnZXQgewogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxNHB4OwogIG92ZXJmbG93LXg6IGhpZGRlbjsKICBvdmVyZmxvdy15OiBoaWRkZW47CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgoudGVuc29yLXdpZGdldC1kaW0gewogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKICBtYXJnaW4tbGVmdDogMTVweDsKICBtYXJnaW4tcmlnaHQ6IDE1cHg7CiAgcGFkZGluZzogMnB4Owp9CgoudGVuc29yLXdpZGdldC1kaW0tY29tbWEgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMTJweDsKICBoZWlnaHQ6IDE0cHg7CiAgbGluZS1oZWlnaHQ6IDE0cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1oaWdobGlnaHRlZCB7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDEwMCwgMTgwLCAyNTUpOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC1kaW0tYnJhY2tldHMgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0Owp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24gewogIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgYm94LXNoYWRvdzogMnB4IDJweCAycHggI2IwYjBiMDsKICBjdXJzb3I6IHBvaW50ZXI7CiAgd2lkdGg6IDE4MHB4OwogIHotaW5kZXg6IDEwMDA7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0gewogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTgwLCAxODAsIDE4MCk7CiAgZm9udC1zaXplOiAxMnB4OwogIHBhZGRpbmc6IDNweDsKICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUgewogIGJhY2tncm91bmQtY29sb3I6IHJnYigxMDAsIDE4MCwgMjU1KTsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1kaXNhYmxlZCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKfQoKLnRlbnNvci13aWRnZXQtZHR5cGUgewogIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICBjb2xvcjogcmdiKDYwLCA2MCwgNjApOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDhwdDsKICBoZWlnaHQ6IDQ4cHg7CiAgbGluZS1oZWlnaHQ6IDIycHg7CiAgbWF4LWhlaWdodDogMjJweDsKICBwYWRkaW5nLWxlZnQ6IDE0cHg7CiAgcGFkZGluZy1yaWdodDogMTBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLnRlbnNvci13aWRnZXQtZHR5cGUtbGFiZWwgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7Cn0KCi50ZW5zb3Itd2lkZ2V0LWhlYWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MiwgMjUyLCAyNTIpOwogIGJveC1zaGFkb3c6IDJweCAycHggMnB4ICNiMGIwYjA7CiAgaGVpZ2h0OiA0MHB4OwogIGxpbmUtaGVpZ2h0OiA0MHB4OwogIG1heC1oZWlnaHQ6IDQwcHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDEwMCU7Cn0KCi50ZW5zb3Itd2lkZ2V0LWluZm8gewogIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICBjb2xvcjogcmdiKDAsIDAsIDI1NSk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0OwogIGhlaWdodDogMjJweDsKICBsaW5lLWhlaWdodDogMjJweDsKICBtYXJnaW4tbGVmdDogOHB4OwogIG1heC1oZWlnaHQ6IDIycHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KCi50ZW5zb3Itd2lkZ2V0LW1lbnUtdGh1bWIgewogIGNvbG9yOiByZ2IoMzIsIDMzLCAzNik7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXdlaWdodDogYm9sZDsKICBmb250LXNpemU6IDE2cHg7CiAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC1tZW51LXRodW1iOmhvdmVyIHsKICBjb2xvcjogcmdiKDIyNywgMTE2LCAwKTsKfQoKLnRlbnNvci13aWRnZXQtc2hhcGUgewogIGNvbG9yOiByZ2IoNjAsIDYwLCA2MCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIG1hcmdpbi1sZWZ0OiAxMnB4Owp9CgoudGVuc29yLXdpZGdldC1zaGFwZS1sYWJlbCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNoYXBlLXZhbHVlIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNsaWNpbmctZ3JvdXAgewogIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTAsIDI1MCwgMjUwKTsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiKDE5MCwgMTkwLCAxOTApOwogIGRpc3BsYXk6IGJsb2NrOwogIGhlaWdodDogMThweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgcGFkZGluZy1ib3R0b206IDVweDsKICBwYWRkaW5nLXRvcDogNXB4Owp9CgoudGVuc29yLXdpZGdldC10ZW5zb3ItbmFtZSB7CiAgY29sb3I6IGJsYWNrOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnRlbnNvci13aWRnZXQtbGVmdC1ydWxlci10aWNrIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ydWxlci1iYWNrZ3JvdW5kLWNvbG9yKTsKICBib3JkZXItYm90dG9tOiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGJvcmRlci10b3A6IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm94LXNoYWRvdzogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBjb2xvcjogcmdiKDExMCwgMTEwLCAxMTApOwogIGN1cnNvcjogcG9pbnRlcjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMjlweDsKICBsaW5lLWhlaWdodDogMjlweDsKICBtYXJnaW4tbGVmdDogMHB4OwogIG1heC13aWR0aDogNDVweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdG9wLXJ1bGVyIHsKICBoZWlnaHQ6IDI0cHg7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcCB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI0MCwgMjQwLCAyNDApOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICBib3gtc2hhZG93OiAxcHggMXB4IDFweCAjYjBiMGIwOwogIGRpc3BsYXk6IG5vbmU7CiAgZm9udC1zaXplOiAxM3B4OwogIHBhZGRpbmc6IDVweDsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgd2lkdGg6IDI0MHB4Owp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWNvbG9yYmFyIHsKICBoZWlnaHQ6IDI0cHg7CiAgd2lkdGg6IDk1JTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC1pbmRpY2VzIHsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC12YWx1ZSB7CiAgbWFyZ2luLXRvcDogMjBweDsKfQoKLnRlbnNvci13aWRnZXQtdG9wLXJ1bGVyLXRpY2sgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJ1bGVyLWJhY2tncm91bmQtY29sb3IpOwogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXJpZ2h0OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGNvbG9yOiByZ2IoMTEwLCAxMTAsIDExMCk7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAyNHB4OwogIGxpbmUtaGVpZ2h0OiAyNHB4OwogIHBhZGRpbmctcmlnaHQ6IDJweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2IHsKICBib3JkZXItYm90dG9tOiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGJvcmRlci1yaWdodDogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogODAlOwogIGhlaWdodDogMjRweDsKICBsaW5lLWhlaWdodDogMjRweDsKICBtYXgtd2lkdGg6IDQ1cHg7CiAgcGFkZGluZy1yaWdodDogMnB4OwogIHRleHQtYWxpZ246IHJpZ2h0OwogIHVzZXItc2VsZWN0OiBub25lOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDQ1cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24gewogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWJvdHRvbSB7CiAgYm9yZGVyLWJvdHRvbTogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1sZWZ0IHsKICBib3JkZXItbGVmdDogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1yaWdodCB7CiAgYm9yZGVyLXJpZ2h0OiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXRvcCB7CiAgYm9yZGVyLXRvcDogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtc2VjdGlvbiB7CiAgLS1ib3JkZXItc3R5bGU6IDFweCBzb2xpZCByZ2IoMTQwLCAxNDAsIDE0MCk7CiAgLS1ydWxlci1iYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjEwLCAyMTAsIDIxMCk7CiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLWtodG1sLXVzZXItc2VsZWN0OiBub25lOwogIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsKICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1yb3cgewogIGhlaWdodDogMjVweDsKICBsaW5lLWhlaWdodDogMjVweDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Cjwvc3R5bGU+Cgo8ZG9tLW1vZHVsZSBpZD0idGVuc29yLXdpZGdldC1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPi8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoudGVuc29yLXdpZGdldCB7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDE0cHg7CiAgb3ZlcmZsb3cteDogaGlkZGVuOwogIG92ZXJmbG93LXk6IGhpZGRlbjsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbSB7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAxNHB4OwogIGxpbmUtaGVpZ2h0OiAxNHB4OwogIG1hcmdpbi1sZWZ0OiAxNXB4OwogIG1hcmdpbi1yaWdodDogMTVweDsKICBwYWRkaW5nOiAycHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1jb21tYSB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKfQoKLnRlbnNvci13aWRnZXQtZGltLWhpZ2hsaWdodGVkIHsKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTAwLCAxODAsIDI1NSk7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1icmFja2V0cyB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4cHQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93biB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxMjgsIDEyOCwgMTI4KTsKICBib3gtc2hhZG93OiAycHggMnB4IDJweCAjYjBiMGIwOwogIGN1cnNvcjogcG9pbnRlcjsKICB3aWR0aDogMTgwcHg7CiAgei1pbmRleDogMTAwMDsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbSB7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYigxODAsIDE4MCwgMTgwKTsKICBmb250LXNpemU6IDEycHg7CiAgcGFkZGluZzogM3B4OwogIHVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDEwMCwgMTgwLCAyNTUpOwp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWRpc2FibGVkIHsKICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpOwp9CgoudGVuc29yLXdpZGdldC1kdHlwZSB7CiAgYWxpZ24tY29udGVudDogY2VudGVyOwogIGNvbG9yOiByZ2IoNjAsIDYwLCA2MCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0OwogIGhlaWdodDogNDhweDsKICBsaW5lLWhlaWdodDogMjJweDsKICBtYXgtaGVpZ2h0OiAyMnB4OwogIHBhZGRpbmctbGVmdDogMTRweDsKICBwYWRkaW5nLXJpZ2h0OiAxMHB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9CgoudGVuc29yLXdpZGdldC1kdHlwZS1sYWJlbCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKfQoKLnRlbnNvci13aWRnZXQtaGVhZGVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjUyLCAyNTIsIDI1Mik7CiAgYm94LXNoYWRvdzogMnB4IDJweCAycHggI2IwYjBiMDsKICBoZWlnaHQ6IDQwcHg7CiAgbGluZS1oZWlnaHQ6IDQwcHg7CiAgbWF4LWhlaWdodDogNDBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogMTAwJTsKfQoKLnRlbnNvci13aWRnZXQtaW5mbyB7CiAgYWxpZ24tY29udGVudDogY2VudGVyOwogIGNvbG9yOiByZ2IoMCwgMCwgMjU1KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4cHQ7CiAgaGVpZ2h0OiAyMnB4OwogIGxpbmUtaGVpZ2h0OiAyMnB4OwogIG1hcmdpbi1sZWZ0OiA4cHg7CiAgbWF4LWhlaWdodDogMjJweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLnRlbnNvci13aWRnZXQtbWVudS10aHVtYiB7CiAgY29sb3I6IHJnYigzMiwgMzMsIDM2KTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtc2l6ZTogMTZweDsKICBtYXJnaW4tbGVmdDogMTBweDsKICBtYXJnaW4tcmlnaHQ6IDVweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LW1lbnUtdGh1bWI6aG92ZXIgewogIGNvbG9yOiByZ2IoMjI3LCAxMTYsIDApOwp9CgoudGVuc29yLXdpZGdldC1zaGFwZSB7CiAgY29sb3I6IHJnYig2MCwgNjAsIDYwKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgbWFyZ2luLWxlZnQ6IDEycHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNoYXBlLWxhYmVsIHsKICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnRlbnNvci13aWRnZXQtc2hhcGUtdmFsdWUgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnRlbnNvci13aWRnZXQtc2xpY2luZy1ncm91cCB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MCwgMjUwLCAyNTApOwogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTkwLCAxOTAsIDE5MCk7CiAgZGlzcGxheTogYmxvY2s7CiAgaGVpZ2h0OiAxOHB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBwYWRkaW5nLWJvdHRvbTogNXB4OwogIHBhZGRpbmctdG9wOiA1cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXRlbnNvci1uYW1lIHsKICBjb2xvcjogYmxhY2s7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC1sZWZ0LXJ1bGVyLXRpY2sgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJ1bGVyLWJhY2tncm91bmQtY29sb3IpOwogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXRvcDogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBib3gtc2hhZG93OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGNvbG9yOiByZ2IoMTEwLCAxMTAsIDExMCk7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAyOXB4OwogIGxpbmUtaGVpZ2h0OiAyOXB4OwogIG1hcmdpbi1sZWZ0OiAwcHg7CiAgbWF4LXdpZHRoOiA0NXB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiA0NXB4Owp9CgoudGVuc29yLXdpZGdldC10b3AtcnVsZXIgewogIGhlaWdodDogMjRweDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQwLCAyNDAsIDI0MCk7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogIGJveC1zaGFkb3c6IDFweCAxcHggMXB4ICNiMGIwYjA7CiAgZGlzcGxheTogbm9uZTsKICBmb250LXNpemU6IDEzcHg7CiAgcGFkZGluZzogNXB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB3aWR0aDogMjQwcHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLXRvb2x0aXAtY29sb3JiYXIgewogIGhlaWdodDogMjRweDsKICB3aWR0aDogOTUlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWluZGljZXMgewogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLXZhbHVlIHsKICBtYXJnaW4tdG9wOiAyMHB4Owp9CgoudGVuc29yLXdpZGdldC10b3AtcnVsZXItdGljayB7CiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcnVsZXItYmFja2dyb3VuZC1jb2xvcik7CiAgYm9yZGVyLWJvdHRvbTogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBib3JkZXItcmlnaHQ6IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgY29sb3I6IHJnYigxMTAsIDExMCwgMTEwKTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMTJweDsKICBoZWlnaHQ6IDI0cHg7CiAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgcGFkZGluZy1yaWdodDogMnB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiA0NXB4Owp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYgewogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXJpZ2h0OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGN1cnNvcjogcG9pbnRlcjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4MCU7CiAgaGVpZ2h0OiAyNHB4OwogIGxpbmUtaGVpZ2h0OiAyNHB4OwogIG1heC13aWR0aDogNDVweDsKICBwYWRkaW5nLXJpZ2h0OiAycHg7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbiB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tYm90dG9tIHsKICBib3JkZXItYm90dG9tOiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWxlZnQgewogIGJvcmRlci1sZWZ0OiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXJpZ2h0IHsKICBib3JkZXItcmlnaHQ6IDAuNXB4IHNvbGlkIGJsdWU7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tdG9wIHsKICBib3JkZXItdG9wOiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1zZWN0aW9uIHsKICAtLWJvcmRlci1zdHlsZTogMXB4IHNvbGlkIHJnYigxNDAsIDE0MCwgMTQwKTsKICAtLXJ1bGVyLWJhY2tncm91bmQtY29sb3I6IHJnYigyMTAsIDIxMCwgMjEwKTsKICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAta2h0bWwtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lOwogIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLXJvdyB7CiAgaGVpZ2h0OiAyNXB4OwogIGxpbmUtaGVpZ2h0OiAyNXB4OwogIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWxpbmUtY2hhcnQiPgogIDx0ZW1wbGF0ZT4KICAgIDx2ei1saW5lLWNoYXJ0MiB4LWNvbXBvbmVudHMtY3JlYXRpb24tbWV0aG9kPSJbW19saW5lQ2hhcnRYQ29tcG9uZW50c0NyZWF0aW9uTWV0aG9kXV0iIHktdmFsdWUtYWNjZXNzb3I9IltbX2xpbmVDaGFydFlWYWx1ZUFjY2Vzc29yXV0iIHRvb2x0aXAtY29sdW1ucz0iW1tfbGluZUNoYXJ0VG9vbHRpcENvbHVtbnNdXSIgc21vb3RoaW5nLWVuYWJsZWQ9IltbX2xpbmVDaGFydFNtb290aGluZ0VuYWJsZWRdXSI+PC92ei1saW5lLWNoYXJ0Mj4KICAgIDxzdHlsZT4KICAgICAgdnotbGluZS1jaGFydDIgewogICAgICAgIGhlaWdodDogMzAwcHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi10ZW5zb3ItdmFsdWUtdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLXRvYXN0IGlkPSJ0ZW5zb3JWYWx1ZVRvYXN0IiB0ZXh0PSIiIGFsd2F5cy1vbi10b3A+PC9wYXBlci10b2FzdD4KICAgIDx0YWJsZSBjbGFzcz0idGVuc29yLXZhbHVlLXZpZXctdGFibGUiPgogICAgICA8dHI+CiAgICAgICAgPHRkIGNvbHNwYW49IjIiPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gaWQ9InRlbnNvci1uYW1lIiBvbi10YXA9InRlbnNvck5hbWVDYWxsYmFjayI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRlbnNvci1uYW1lLXRleHQiPltbdGVuc29yTmFtZV1dPC9zcGFuPgogICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJjbG9zZSIgY2xhc3M9InZhbHVlLXZpZXctaWNvbi1idXR0b24iIGlkPSJ2YWx1ZS12aWV3LWljb24tYnV0dG9uIiB0aXRsZT0iQ2xvc2UiIG9uLXRhcD0iY2xvc2VCdXR0b25DYWxsYmFjayI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImZvcndhcmQiIGNsYXNzPSJ2YWx1ZS12aWV3LWljb24tYnV0dG9uIiBpZD0idmFsdWUtdmlldy1pY29uLWJ1dHRvbiIgdGl0bGU9IkNvbnRpbnVlIHRvIiBvbi10YXA9ImNvbnRpbnVlVG9CdXR0b25DYWxsYmFjayI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0ciBjbGFzcz0idGVuc29yLXZhbHVlLXZhbHVlLXRyIj4KICAgICAgICA8dGQ+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3VzZVRlbnNvcldpZGdldF1dIj4KICAgICAgICAgICAgPGRpdiBpZD0idGVuc29yLXdpZGdldCI+PC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX3VzZVRlbnNvcldpZGdldF1dIj4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gaWQ9ImRlYnVnLW9wIj48L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGNsYXNzPSJpbmxpbmUgdmFsdWUtY2FyZC1pbnB1dCIgbGFiZWw9IlNsaWNpbmciIGlkPSJzbGljaW5nIiB2YWx1ZT0ie3tzbGljaW5nfX0iIG9uLWNoYW5nZT0icmVmcmVzaCI+CiAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGNsYXNzPSJpbmxpbmUgdmFsdWUtY2FyZC1pbnB1dCIgbGFiZWw9IlRpbWUgSW5kaWNlcyIgaWQ9InRpbWUtaW5kaWNlcyIgdmFsdWU9Int7dGltZUluZGljZXN9fSIgb24tY2hhbmdlPSJyZWZyZXNoIj4KICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBpZD0idGltZS1pbmRpY2VzLXRvZ2dsZS1idXR0b24iIGNsYXNzPSJ0ZW5zb3ItdmFsdWUtYnV0dG9ucyIgb24tY2xpY2s9Il90aW1lSW5kaWNlc1RvZ2dsZUJ1dHRvbkNhbGxiYWNrIj5GdWxsIEhpc3Rvcnk8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgPC9kaXY+PC90ZW1wbGF0ZT48L3RkPjx0ZCBjbGFzcz0idGVuc29yLXZhbHVlLXZpZXctdGQiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1ZhbHVlU2NhbGFyXV0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgY2xhc3M9ImlubGluZSIgbGFiZWw9IlNjYWxhciBWYWx1ZSIgaWQ9InZhbHVlLXNjYWxhciIgdmFsdWU9IltbX2RhdGFTY2FsYXJdXSI+CiAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1ZhbHVlTGluZUNoYXJ0XV0iPgogICAgICAgICAgICAgICAgICA8dGYtZGVidWdnZXItbGluZS1jaGFydCBkYXRhPSJbW19saW5lQ2hhcnREYXRhXV0iPjwvdGYtZGVidWdnZXItbGluZS1jaGFydD4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVmFsdWVJbWFnZV1dIj4KICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz0idmFsdWUtaW1hZ2UiIGhlaWdodD0iMjUwcHgiIHdpZHRoPSIyNTBweCIgc3JjJD0iW1tfZGF0YUltYWdlU3JjXV0iPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAKICAgICAgICAgIAogICAgICAgIAogICAgICA8L3RyPgogICAgPC90YWJsZT4KCiAgICA8c3R5bGUgaW5jbHVkZT0idGVuc29yLXdpZGdldC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLnRlbnNvci12YWx1ZS1idXR0b25zIHsKICAgICAgICBoZWlnaHQ6IDc1JTsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgIH0KICAgICAgLnRlbnNvci12YWx1ZS12aWV3LXRhYmxlIHsKICAgICAgICB3aWR0aDogNTAwcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLXRhYmxlOwogICAgICAgIGJvcmRlci1zcGFjaW5nOiA1cHg7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogM3B4OwogICAgICAgIHBhZGRpbmctbGVmdDogM3B4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4OwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggMXB4IDFweCAjZDhkOGQ4OwogICAgICB9CiAgICAgIC50ZW5zb3ItdmFsdWUtdmlldy10ZCB7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICB9CiAgICAgIC52YWx1ZS1jYXJkLWlucHV0IHsKICAgICAgICB3aWR0aDogMTUwcHg7CiAgICAgIH0KICAgICAgI3RlbnNvci1uYW1lIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiA1MCU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC50ZW5zb3ItbmFtZS10ZXh0IHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQogICAgICAjZGVidWctb3AgewogICAgICAgIGZvbnQtc2l6ZTogOTAlOwogICAgICB9CiAgICAgIC52YWx1ZS1pbWFnZSB7CiAgICAgICAgaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQ7CiAgICAgIH0KICAgICAgLnZhbHVlLXZpZXctaWNvbi1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgd2lkdGg6IDIwJTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiA5MCU7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgIH0KICAgICAgI3RlbnNvci13aWRnZXQgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICAgICAgICAvKiBib3gtc2l6aW5nOiBjb250ZW50LWJveDsKICAgICAgICAtbW96LWJveC1zaXppbmc6IGNvbnRlbnQtYm94OwogICAgICAgIC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3g7ICovCiAgICAgICAgaGVpZ2h0OiAyODBweDsKICAgICAgICB3aWR0aDogNDg0cHg7CiAgICAgIH0KICAgICAgI3NsaWNpbmcsCiAgICAgICN0aW1lLWluZGljZXMgewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLXRlbnNvci12YWx1ZS1tdWx0aS12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJtdWx0aVZpZXciPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5UZW5zb3IgVmFsdWVzPC9kaXY+CiAgICAgIDxkaXYgaWQ9Im11bHRpLXRlbnNvci12aWV3LWNvbnRhaW5lciI+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnNlY3Rpb24tdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAjbXVsdGlWaWV3IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogICAgICAgIHBhZGRpbmctdG9wOiAzcHg7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAzcHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogM3B4OwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggI2VlZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLXRvYXN0IGlkPSJ0b2FzdCIgdGV4dD0iIiBhbHdheXMtb24tdG9wPjwvcGFwZXItdG9hc3Q+CiAgICA8dGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2cgaWQ9ImluaXRpYWxEaWFsb2ciPjwvdGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2c+CiAgICAKICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIiBpZD0ibGVmdC1wYW5lIj4KICAgICAgICA8ZGl2IGlkPSJub2RlLWVudHJpZXMiIGNsYXNzPSJub2RlLWVudHJpZXMiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVidWdnZXItc2VjdGlvbi10aXRsZSI+UnVudGltZSBOb2RlIExpc3Q8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1zb3VyY2UtY29kZSI+CiAgICAgICAgICAgIFNob3cgQ29kZToKICAgICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2xhc3M9InRvZ2dsZS1zb3VyY2UtY29kZSIgaWQ9InNob3ctc291cmNlLWNvZGUiIGNoZWNrZWQ9Int7X3NvdXJjZUNvZGVTaG93bn19Ij48L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0Zi1vcC1zZWxlY3RvciBkZWJ1Zy13YXRjaGVzPSJbW19kZWJ1Z1dhdGNoZXNdXSIgZGVidWctd2F0Y2gtY2hhbmdlPSJbW19jcmVhdGVEZWJ1Z1dhdGNoQ2hhbmdlSGFuZGxlcigpXV0iIG5vZGUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgZm9yY2UtZXhwYW5kLWFuZC1jaGVjay1ub2RlLW5hbWU9IltbX2ZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZV1dIiBmb3JjZS1leHBhbmQtbm9kZS1uYW1lPSJbW19mb3JjZUV4cGFuZE5vZGVOYW1lXV0iPgogICAgICAgICAgPC90Zi1vcC1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJzb3VyY2UtY29kZS12aWV3LWRpdiIgY2xhc3M9InNvdXJjZS1jb2RlLXZpZXctZGl2IiBoaWRkZW4kPSJ7eyFfc291cmNlQ29kZVNob3dufX0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVidWdnZXItc2VjdGlvbi10aXRsZSI+U291cmNlIENvZGU8L2Rpdj4KICAgICAgICAgIDx0Zi1zb3VyY2UtY29kZS12aWV3IGlkPSJzb3VyY2VDb2RlVmlldyIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIiBkZWJ1Zy13YXRjaGVzPSJbW19kZWJ1Z1dhdGNoZXNdXSIgZm9jdXMtbm9kZS1uYW1lPSJbW19zb3VyY2VGb2N1c05vZGVOYW1lXV0iIG5vZGUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgY29udGludWUtdG8tbm9kZT0iW1tfY3JlYXRlQ29udGludWVUb05vZGVIYW5kbGVyKCldXSI+PC90Zi1zb3VyY2UtY29kZS12aWV3PgogICAgICAgIDwvZGl2PgogICAgICAgIDx0Zi1kZWJ1Z2dlci1yZXNpemVyIGN1cnJlbnQtbGVuZ3RoPSJ7e19sZWZ0UGFuZVdpZHRofX0iIG1pbi1sZW5ndGg9IltbX21pbmxlZnRQYW5lV2lkdGhdXSIgbWF4LWxlbmd0aD0iW1tfbWF4bGVmdFBhbmVXaWR0aF1dIj4KICAgICAgICA8L3RmLWRlYnVnZ2VyLXJlc2l6ZXI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDx0Zi1zZXNzaW9uLXJ1bnMtdmlldyBpZD0ic2Vzc2lvblJ1bnNWaWV3IiBsYXRlc3Qtc2Vzc2lvbi1ydW49IltbX2xhdGVzdFNlc3Npb25SdW5dXSIgc2Vzc2lvbi1ydW4ta2V5LXRvLWRldmljZS1uYW1lcz0iW1tfc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc11dIiBzb2xlLWFjdGl2ZT0iW1tfc2Vzc2lvblJ1blNvbGVBY3RpdmVdXSIgbm9kZS1vci10ZW5zb3ItY2xpY2tlZD0iW1tfY3JlYXRlRmVlZEZldGNoVGFyZ2V0Q2xpY2tlZEhhbmRsZXIoKV1dIj4KICAgICAgICAgIDwvdGYtc2Vzc2lvbi1ydW5zLXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9ucy1jb250YWluZXIiPgogICAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9ImNvbnRpbnVlLWJ1dHRvbiIgb24tY2xpY2s9Il9zdGVwIj4KICAgICAgICAgICAgPHNwYW4+W1tfc3RlcEJ1dHRvblRleHRdXTwvc3Bhbj4KICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPHRmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZyBpZD0iY29udGludWVEaWFsb2ciIHNlc3Npb24tcnVuLWdvPSJbW19jcmVhdGVTZXNzaW9uUnVuR28oKV1dIiB0ZW5zb3ItY29uZGl0aW9uLWdvPSJbW19jcmVhdGVUZW5zb3JDb25kaXRpb25HbygpXV0iIGZvcmNlLWNvbnRpbnVhdGlvbi1zdG9wPSJbW19jcmVhdGVGb3JjZUNvbnRpbnVhdGlvblN0b3AoKV1dIj4KICAgICAgICAgIDwvdGYtZGVidWdnZXItY29udGludWUtZGlhbG9nPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgICA8dGYtZ3JhcGgtbG9hZGVyIGlkPSJsb2FkZXIiIG91dC1ncmFwaC1oaWVyYXJjaHk9Int7Z3JhcGhIaWVyYXJjaHl9fSIgb3V0LWdyYXBoPSJ7e2dyYXBofX0iIG91dC1zdGF0cz0ie3tzdGF0c319IiBwcm9ncmVzcz0ie3tfZ3JhcGhQcm9ncmVzc319Ij48L3RmLWdyYXBoLWxvYWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIiBpZD0iY2VudGVyLWNvbnRlbnQiPgogICAgICAgIDxkaXYgaWQ9InRvcC1yaWdodC1xdWFkcmFudCI+CiAgICAgICAgICA8cGFwZXItdGFicyBzZWxlY3RlZD0ie3tfdG9wUmlnaHRTZWxlY3RlZH19Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfdG9wUmlnaHRUYWJzXV0iPgogICAgICAgICAgICAgIDxwYXBlci10YWIgaWQ9IltbaXRlbS5pZF1dIj5bW2l0ZW0ubmFtZV1dPC9wYXBlci10YWI+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3BhcGVyLXRhYnM+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJydW50aW1lLWdyYXBoLWRldmljZSI+CiAgICAgICAgICAgIDxzcGFuIGlkPSJydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIj4gPC9zcGFuPgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBpZD0iYWN0aXZlLXJ1bnRpbWUtZ3JhcGgtZGV2aWNlLW5hbWUiIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0iRGV2aWNlIG5hbWUiIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWV9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfYWN0aXZlU2Vzc2lvblJ1bkRldmljZXNdXSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5bW2l0ZW1dXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgY2xhc3M9InNwaW5uZXIiIGlkPSJ0b3AtcmlnaHQtc3Bpbm5lciIgaGlkZGVuPSJbWyFfYnVzeV1dIiBhY3RpdmU9IltbX2J1c3ldXSI+CiAgICAgICAgICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgaWQ9InRvcC1yaWdodC1wcm9ncmVzcy1iYXIiIHZhbHVlPSIwIj48L3BhcGVyLXByb2dyZXNzPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZV1dIj4KICAgICAgICAgICAgPGRpdiBpZD0iZ3JhcGgtY29udGFpbmVyIj4KICAgICAgICAgICAgICA8dGYtZ3JhcGggaWQ9ImdyYXBoIiBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgYmFzaWMtZ3JhcGg9IltbZ3JhcGhdXSIgc3RhdHM9Iltbc3RhdHNdXSIgcHJvZ3Jlc3M9Int7X2dyYXBoUHJvZ3Jlc3N9fSIgY29sb3ItYnk9InN0cnVjdHVyZSIgY29sb3ItYnktcGFyYW1zPSJ7e2NvbG9yQnlQYXJhbXN9fSIgcmVuZGVyLWhpZXJhcmNoeT0ie3tfcmVuZGVySGllcmFyY2h5fX0iIG5vZGUtY29udGV4dC1tZW51LWl0ZW1zPSJbW19jcmVhdGVOb2RlQ29udGV4dE1lbnVJdGVtcygpXV0iPjwvdGYtZ3JhcGg+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGV4dC1tZW51Ij48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1RvcFJpZ2h0VGVuc29yVmFsdWVzQWN0aXZlXV0iPgogICAgICAgICAgICA8dGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXcgaWQ9InRlbnNvclZhbHVlTXVsdGlWaWV3IiBjb250aW51ZS10by1jYWxsYmFjaz0iW1tfY3JlYXRlQ29udGludWVUb0NhbGxiYWNrKCldXSIgdGVuc29yLW5hbWUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgZ2V0LWhlYWx0aC1waWxsPSJbW19jcmVhdGVHZXRIZWFsdGhQaWxsKCldXSI+CiAgICAgICAgICAgIDwvdGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8dGYtZGVidWdnZXItcmVzaXplciBpcy1ob3Jpem9udGFsPSJ0cnVlIiBjdXJyZW50LWxlbmd0aD0ie3tfdG9wUmlnaHRRdWFkcmFudEhlaWdodH19IiBtaW4tbGVuZ3RoPSJbW19taW5Ub3BSaWdodFF1YWRyYW50SGVpZ2h0XV0iIG1heC1sZW5ndGg9IltbX21heFRvcFJpZ2h0UXVhZHJhbnRIZWlnaHRdXSI+CiAgICAgICAgPC90Zi1kZWJ1Z2dlci1yZXNpemVyPgoKICAgICAgICA8ZGl2IGlkPSJ0ZW5zb3ItZGF0YSIgY2xhc3M9InRlbnNvci1kYXRhIj4KICAgICAgICAgIDx0Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5IGlkPSJ0ZW5zb3JEYXRhU3VtbWFyeSIgbGF0ZXN0LXRlbnNvci1kYXRhPSJbW19sYXRlc3RUZW5zb3JEYXRhXV0iIGV4cGFuZC1oYW5kbGVyPSJbW19jcmVhdGVUZW5zb3JEYXRhRXhwYW5kSGFuZGxlcigpXV0iIGNvbnRpbnVlLXRvLWNhbGxiYWNrPSJbW19jcmVhdGVDb250aW51ZVRvQ2FsbGJhY2soKV1dIiBoaWdobGlnaHRlZC1ub2RlLW5hbWU9IltbX2hpZ2hsaWdodE5vZGVOYW1lXV0iIHRlbnNvci1uYW1lLWNsaWNrZWQ9IltbX2NyZWF0ZU5vZGVDbGlja2VkSGFuZGxlcigpXV0iIGdldC1oZWFsdGgtcGlsbD0iW1tfY3JlYXRlR2V0SGVhbHRoUGlsbCgpXV0iPgogICAgICAgICAgPC90Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIHBhcGVyLXRvYXN0IHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMTAlOwogICAgICAgIHdpZHRoOiA0MHZ3OwogICAgICAgIG1hcmdpbi1sZWZ0OiAzMHZ3OwogICAgICB9CiAgICAgIHRmLWRhc2hib2FyZC1sYXlvdXQgewogICAgICAgIC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLWJhc2lzOiBhdXRvOwogICAgICAgIC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1heC13aWR0aDogbm9uZTsKICAgICAgICAtLXRmLWRhc2hib2FyZC1sYXlvdXQtc2lkZWJhci1taW4td2lkdGg6IG5vbmU7CiAgICAgIH0KICAgICAgLmRlYnVnZ2VyLXNlY3Rpb24tdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICBwYXBlci10YWJzIHsKICAgICAgICBjb2xvcjogIzU1NTsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIHBhcGVyLXRhYi5pcm9uLXNlbGVjdGVkIHsKICAgICAgICBjb2xvcjogYmxhY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgI2luaXRpYWxEaWFsb2cgewogICAgICAgIC8qKiBUaGlzIG1hdGNoZXMgdGhlIGRlZmF1bHQgei1pbmRleCBvZiBwYXBlci1kaWFsb2cgYmFja2Ryb3BzLiAqLwogICAgICAgIHotaW5kZXg6IDEwMjsKICAgICAgfQogICAgICAvKiogUmVzaXplIHRoZSByZWdpb24gZm9yIHRoZSBncmFwaCBhcyB0aGUgdXNlciByZXNpemVzIHRoZSByZWdpb24uICovCiAgICAgICNncmFwaC1jb250YWluZXIgewogICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gMTIwcHgpOwogICAgICAgIC8qKiBDbGlwIHRoZSBtaW5pbWFwIGlmIHRoZSBoZWlnaHQgb2YgdGhlIGdyYXBoIGNvbnRhaW5lciBpcyBzbWFsbC4gKi8KICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAjZ3JhcGggewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICB9CiAgICAgICN0b29sdGlwLXNvcnRpbmctbGFiZWwgewogICAgICAgIG1hcmdpbi10b3A6IDEzcHg7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CiAgICAgICN4LXR5cGUtc2VsZWN0b3IgcGFwZXItYnV0dG9uIHsKICAgICAgICBtYXJnaW46IDVweCAzcHg7CiAgICAgIH0KICAgICAgLnJ1bnRpbWUtZ3JhcGgtZGV2aWNlIHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CiAgICAgICNydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIHsKICAgICAgICBmb250LXNpemU6IDg1JTsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgICNhY3RpdmUtcnVudGltZS1ncmFwaC1kZXZpY2UtbmFtZSB7CiAgICAgICAgZm9udC1zaXplOiA4NSU7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAjdG9wLXJpZ2h0LXByb2dyZXNzLWJhciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KICAgICAgLmxpbmUtaXRlbSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICAuc2lkZWJhciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXg6IHZpc2libGU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIC5jZW50ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgdGYtZGVidWdnZXItcmVzaXplciB7CiAgICAgICAgcmlnaHQ6IC0xMHB4OwogICAgICB9CiAgICAgICNjZW50ZXItY29udGVudCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CiAgICAgIC8qKiBUaGUgcmVzaXplciBzaG91bGQgaGF2ZSBubyBzcGFjZSB0byB0aGUgbGVmdCBvZiBpdC4gKi8KICAgICAgI2NlbnRlci1jb250ZW50IHRmLWRlYnVnZ2VyLXJlc2l6ZXJbaXMtaG9yaXpvbnRhbF0gewogICAgICAgIG1hcmdpbi1sZWZ0OiAtMjNweDsKICAgICAgfQogICAgICAuY29udGV4dC1tZW51IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWluLXdpZHRoOiAxNTBweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZDRkNGQ0OwogICAgICB9CiAgICAgIC5zcGlubmVyIHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgICAubm9kZS1lbnRyaWVzIHsKICAgICAgICBib3gtc2hhZG93OiAzcHggM3B4ICNkZGQ7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBoZWlnaHQ6IDgwJTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuc291cmNlLWNvZGUtdmlldy1kaXYgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDQwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgYm94LXNoYWRvdzogM3B4IDNweCAjZGRkOwogICAgICB9CiAgICAgICNzZXNzaW9uUnVuc1ZpZXcgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiAyNXZoOwogICAgICB9CiAgICAgIC5idXR0b25zLWNvbnRhaW5lciB7CiAgICAgICAgcGFkZGluZzogMjBweCAwOwogICAgICB9CiAgICAgICN0ZW5zb3ItZGF0YSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHBhZGRpbmc6IDIwcHggMDsKICAgICAgICBtYXJnaW46IDAgMCAyMHB4IDA7CiAgICAgIH0KICAgICAgI3RlbnNvckRhdGFTdW1tYXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICB9CiAgICAgICN0b3AtcmlnaHQtcXVhZHJhbnQgewogICAgICAgIGhlaWdodDogNjYlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CiAgICAgIC50b2dnbGUtc291cmNlLWNvZGUgewogICAgICAgIG1hcmdpbi1yaWdodDogMWVtOwogICAgICAgIGZvbnQtc2l6ZTogODAlOwogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQogICAgICAuY29udGV4dC1tZW51IHVsIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGkgewogICAgICAgIHBhZGRpbmc6IDRweCAxNnB4OwogICAgICB9CiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDIwMHB4OwogICAgICB9CiAgICAgIC5pbmxpbmUsCiAgICAgIHBhcGVyLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydCB7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1tYXRlcmlhbC1zaGFyZWQtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjEiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMmRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIyIl0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTRkcDsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMyJdKSB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi02ZHA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjQiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSI1Il0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTE2ZHA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLW1hdGVyaWFsIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItbWF0ZXJpYWwtc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoW2FuaW1hdGVkXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy10cmFuc2l0aW9uOwogICAgICB9CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLWRlYnVnZ2VyLWRhdGEtY2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtbGVnZW5kIHsKICAgICAgICBwYWRkaW5nOiAxNXB4OwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtbGVnZW5kIGgyIHsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgewogICAgICAgIG1hcmdpbjogMTBweCAxMHB4IDEwcHggMDsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLWVudHJ5IC5jb2xvci1wcmV2aWV3IHsKICAgICAgICB3aWR0aDogMjZweDsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtYXJnaW46IDAgMTBweCAwIDA7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAuY29sb3ItbGFiZWwsCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAudGVuc29yLWNvdW50IHsKICAgICAgICBjb2xvcjogIzc3NzsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMjJweDsKICAgICAgICBsaW5lLWhlaWdodDogMjZweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgLnRlbnNvci1jb3VudCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CgogICAgICAjaGVhbHRoLXBpbGwtc3RlcC1zbGlkZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1hcmdpbjogMCAwIDAgLTE1cHg7CiAgICAgICAgLyogMzEgY29tZXMgZnJvbSBhZGRpbmcgYSBwYWRkaW5nIG9mIDE1cHggZnJvbSBib3RoIHNpZGVzIG9mIHRoZSBwYXBlci1zbGlkZXIsIHN1YnRyYWN0aW5nCiAgICogMXB4IHNvIHRoYXQgdGhlIHNsaWRlciB3aWR0aCBhbGlnbnMgd2l0aCB0aGUgaW1hZ2UgKHRoZSBsYXN0IHNsaWRlciBtYXJrZXIgdGFrZXMgdXAgMXB4KSwKICAgKiBhbmQgYWRkaW5nIDJweCB0byBhY2NvdW50IGZvciBhIGJvcmRlciBvZiAxcHggb24gYm90aCBzaWRlcyBvZiB0aGUgaW1hZ2UuIDMwIC0gMSArIDIuCiAgICogQXBwYXJlbnRseSwgdGhlIHBhcGVyLXNsaWRlciBsYWNrcyBhIG1peGluIGZvciB0aG9zZSBwYWRkaW5nIHZhbHVlcy4gKi8KICAgICAgICB3aWR0aDogY2FsYygxMDAlICsgMzFweCk7CiAgICAgIH0KCiAgICAgICNoZWFsdGgtcGlsbHMtbG9hZGluZy1zcGlubmVyIHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQoKICAgICAgI2hlYWx0aC1waWxsLXN0ZXAtbnVtYmVyLWlucHV0IHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlLWNvbnRhaW5lciB7CiAgICAgICAgbWF4LWhlaWdodDogNDAwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgICNudW1lcmljLWFsZXJ0cy10YWJsZSB7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlIHRkIHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAjbnVtZXJpYy1hbGVydHMtdGFibGUgLmZpcnN0LW9mZmVuc2UtdGQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmZpcnN0LW9mZmVuc2UtdGQgewogICAgICAgIHdpZHRoOiA4MHB4OwogICAgICB9CgogICAgICAudGVuc29yLWRldmljZS10ZCB7CiAgICAgICAgbWF4LXdpZHRoOiAxNDBweDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KCiAgICAgIC50ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGUgewogICAgICAgIGNvbG9yOiAjMjY2MjM2OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KCiAgICAgIC50ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGU6aG92ZXIgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5kZXZpY2Utc2VjdGlvbi13aXRoaW4tdGFibGUgewogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAubWluaS1oZWFsdGgtcGlsbCB7CiAgICAgICAgd2lkdGg6IDEzMHB4OwogICAgICB9CgogICAgICAubWluaS1oZWFsdGgtcGlsbCA+IGRpdiB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgfQoKICAgICAgI2V2ZW50LWNvdW50cy10aCB7CiAgICAgICAgcGFkZGluZzogMCAwIDAgMTBweDsKICAgICAgfQoKICAgICAgLm5lZ2F0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24gewogICAgICAgIGJhY2tncm91bmQ6IHJnYigyNTUsIDE0MSwgMCk7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5wb3NpdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMCwgNjIsIDIxMik7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5uYW4tbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMjA0LCA0NywgNDQpOwogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICB9CgogICAgICAubmVnYXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiwKICAgICAgLnBvc2l0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24sCiAgICAgIC5uYW4tbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1hcmdpbjogMCAwIDAgMTBweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5uby1udW1lcmljLWFsZXJ0cy1ub3RpZmljYXRpb24gewogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGNsYXNzPSJjYXJkIGhlYWx0aC1waWxsLWxlZ2VuZCI+CiAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICBFbmFibGUgYWxsIChub3QganVzdCBzYW1wbGVkKSBzdGVwcy4gUmVxdWlyZXMgc2xvdyBkaXNrIHJlYWQuCiAgICAgIDwvZGl2PgogICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBpZD0iZW5hYmxlQWxsU3RlcHNNb2RlVG9nZ2xlIiBjaGVja2VkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSI+CiAgICAgIDwvcGFwZXItdG9nZ2xlLWJ1dHRvbj4KICAgICAgPGgyPgogICAgICAgIFN0ZXAgb2YgSGVhbHRoIFBpbGxzOgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1thbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9ImhlYWx0aC1waWxsLXN0ZXAtbnVtYmVyLWlucHV0IiBtaW49IjAiIG1heD0iW1tfYmlnZ2VzdFN0ZXBFdmVyU2Vlbl1dIiB2YWx1ZT0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwOjppbnB1dH19Ij4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shYWxsU3RlcHNNb2RlRW5hYmxlZF1dIj4KICAgICAgICAgIFtbX2N1cnJlbnRTdGVwRGlzcGxheVZhbHVlXV0KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlIGhpZGRlbiQ9IltbIWFyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBpZD0iaGVhbHRoLXBpbGxzLWxvYWRpbmctc3Bpbm5lciI+PC9wYXBlci1zcGlubmVyLWxpdGU+CiAgICAgIDwvaDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1thbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9ImhlYWx0aC1waWxsLXN0ZXAtc2xpZGVyIiBpbW1lZGlhdGUtdmFsdWU9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19IiBtYXg9IltbX2JpZ2dlc3RTdGVwRXZlclNlZW5dXSIgc25hcHMgc3RlcD0iMSIgdmFsdWU9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFhbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbWF4U3RlcEluZGV4XV0iPgogICAgICAgICAgPHBhcGVyLXNsaWRlciBpZD0iaGVhbHRoLXBpbGwtc3RlcC1zbGlkZXIiIGltbWVkaWF0ZS12YWx1ZT0ie3toZWFsdGhQaWxsU3RlcEluZGV4fX0iIG1heD0iW1tfbWF4U3RlcEluZGV4XV0iIHNuYXBzIHN0ZXA9IjEiIHZhbHVlPSJ7e2hlYWx0aFBpbGxTdGVwSW5kZXh9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGgyPgogICAgICAgIEhlYWx0aCBQaWxsCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hlYWx0aFBpbGxWYWx1ZXNGb3JTZWxlY3RlZE5vZGVdXSI+CiAgICAgICAgICBDb3VudHMgZm9yIFNlbGVjdGVkIE5vZGUKICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shaGVhbHRoUGlsbFZhbHVlc0ZvclNlbGVjdGVkTm9kZV1dIj4KICAgICAgICAgIExlZ2VuZAogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvaDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbaGVhbHRoUGlsbEVudHJpZXNdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhbHRoLXBpbGwtZW50cnkiPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItcHJldmlldyIgc3R5bGU9ImJhY2tncm91bmQ6W1tpdGVtLmJhY2tncm91bmRfY29sb3JdXSI+PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sYWJlbCI+W1tpdGVtLmxhYmVsXV08L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRlbnNvci1jb3VudCI+CiAgICAgICAgICAgIFtbX2NvbXB1dGVUZW5zb3JDb3VudFN0cmluZyhoZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlLAogICAgICAgICAgICBpbmRleCldXQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxkaXYgaGlkZGVuJD0iW1shX2hhc0RlYnVnZ2VyTnVtZXJpY0FsZXJ0cyhkZWJ1Z2dlck51bWVyaWNBbGVydHMpXV0iPgogICAgICAgIDxoMiBpZD0ibnVtZXJpYy1hbGVydHMtaGVhZGVyIj5OdW1lcmljIEFsZXJ0czwvaDI+CiAgICAgICAgPHA+CiAgICAgICAgICBBbGVydHMgYXJlIHNvcnRlZCBmcm9tIHRvcCB0byBib3R0b20gYnkgaW5jcmVhc2luZyB0aW1lc3RhbXAuCiAgICAgICAgCiAgICAgICAgPGRpdiBpZD0ibnVtZXJpYy1hbGVydHMtdGFibGUtY29udGFpbmVyIj4KICAgICAgICAgIDx0YWJsZSBpZD0ibnVtZXJpYy1hbGVydHMtdGFibGUiPgogICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRoPkZpcnN0IE9mZmVuc2U8L3RoPgogICAgICAgICAgICAgICAgPHRoPlRlbnNvciAoRGV2aWNlKTwvdGg+CiAgICAgICAgICAgICAgICA8dGggaWQ9ImV2ZW50LWNvdW50cy10aCI+RXZlbnQgQ291bnRzPC90aD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICA8dGJvZHkgaWQ9Im51bWVyaWMtYWxlcnRzLWJvZHkiPjwvdGJvZHk+CiAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaGFzRGVidWdnZXJOdW1lcmljQWxlcnRzKGRlYnVnZ2VyTnVtZXJpY0FsZXJ0cyldXSI+CiAgICAgICAgPHAgY2xhc3M9Im5vLW51bWVyaWMtYWxlcnRzLW5vdGlmaWNhdGlvbiI+CiAgICAgICAgICBObyBudW1lcmljIGFsZXJ0cyBzbyBmYXIuIFRoYXQgaXMgbGlrZWx5IGdvb2QuIEFsZXJ0cyBpbmRpY2F0ZSB0aGUKICAgICAgICAgIHByZXNlbmNlIG9mIE5hTiBvciAoKy8tKSBJbmZpbml0eSB2YWx1ZXMsIHdoaWNoIG1heSBiZSBjb25jZXJuaW5nLgogICAgICAgIAogICAgICA8L3RlbXBsYXRlPgogICAgPC9wYXBlci1tYXRlcmlhbD4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWxpc3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBAbWVkaWEgb25seSBzY3JlZW4gYW5kICgtd2Via2l0LW1heC1kZXZpY2UtcGl4ZWwtcmF0aW86IDEpIHsKICAgICAgICA6aG9zdCB7CiAgICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICAgIH0KICAgICAgfQoKICAgICAgI2l0ZW1zIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWxpc3QtaXRlbXMtY29udGFpbmVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdChbZ3JpZF0pKSAjaXRlbXMgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjaXRlbXMgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8YXJyYXktc2VsZWN0b3IgaWQ9InNlbGVjdG9yIiBpdGVtcz0ie3tpdGVtc319IiBzZWxlY3RlZD0ie3tzZWxlY3RlZEl0ZW1zfX0iIHNlbGVjdGVkLWl0ZW09Int7c2VsZWN0ZWRJdGVtfX0iPjwvYXJyYXktc2VsZWN0b3I+CgogICAgPGRpdiBpZD0iaXRlbXMiPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KCiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWl0ZW0tYm9keSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsgLyogbmVlZGVkIGZvciB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcyB0byB3b3JrIG9uIGZmICovCiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItanVzdGlmaWVkOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgICB9CgogICAgICA6aG9zdChbdHdvLWxpbmVdKSB7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXR3by1saW5lLW1pbi1oZWlnaHQsIDcycHgpOwogICAgICB9CgogICAgICA6aG9zdChbdGhyZWUtbGluZV0pIHsKICAgICAgICBtaW4taGVpZ2h0OiB2YXIoLS1wYXBlci1pdGVtLWJvZHktdGhyZWUtbGluZS1taW4taGVpZ2h0LCA4OHB4KTsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoW3NlY29uZGFyeV0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWJvZHkxOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXNlY29uZGFyeS1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1ib2R5LXNlY29uZGFyeTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtaWNvbiI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAwOwogICAgICB9CgogICAgICAuZmFkZWQtcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpOwogICAgICB9CgogICAgICAuZmFkZWQtZWxsaXBzZSB7CiAgICAgICAgZmlsbDogdXJsKCNlbGxpcHNlSGF0Y2gpOwogICAgICB9CgogICAgICAuZmFkZWQtcmVjdCwKICAgICAgLmZhZGVkLWVsbGlwc2UsCiAgICAgIC5mYWRlZC1zZXJpZXMgewogICAgICAgIHN0cm9rZTogdmFyKC0tdGItZ3JhcGgtZmFkZWQpICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgI3JlY3RIYXRjaCBsaW5lLAogICAgICAjZWxsaXBzZUhhdGNoIGxpbmUgewogICAgICAgIGNvbG9yOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICAKICAgIDxzdmcgaGVpZ2h0PSIwIiB3aWR0aD0iMCIgaWQ9InN2Z0RlZnMiPgogICAgICA8ZGVmcz4KICAgICAgICAKICAgICAgICA8cGF0dGVybiBpZD0icmVjdEhhdGNoIiBwYXR0ZXJudHJhbnNmb3JtPSJyb3RhdGUoNDUgMCAwKSIgd2lkdGg9IjUiIGhlaWdodD0iNSIgcGF0dGVybnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8bGluZSB4MT0iMCIgeTE9IjAiIHgyPSIwIiB5Mj0iNSIgc3R5bGU9InN0cm9rZS13aWR0aDogMSIgLz4KICAgICAgICA8L3BhdHRlcm4+CiAgICAgICAgPHBhdHRlcm4gaWQ9ImVsbGlwc2VIYXRjaCIgcGF0dGVybnRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiIHdpZHRoPSIyIiBoZWlnaHQ9IjIiIHBhdHRlcm51bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjIiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiIC8+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLXN0YW1wIiByeD0iNy41IiByeT0iMyIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHJ4PSI1IiByeT0iMiIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtdmVydGljYWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iOSIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjYiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSIzIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZyBpZD0ib3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTYiIHk9IjQiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxMiIgeT0iNCIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjQiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnIGlkPSJzdW1tYXJ5LWljb24iIGZpbGw9IiM4NDg0ODQiIGhlaWdodD0iMTIiIHZpZXdib3g9IjAgMCAyNCAyNCIgd2lkdGg9IjEyIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNOSAxN0g3di03aDJ2N3ptNCAwaC0yVjdoMnYxMHptNCAwaC0ydi00aDJ2NHoiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2RlZnM+CiAgICA8L3N2Zz4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNUeXBlKHR5cGUsICdDT05TVCcpXV0iPgogICAgICA8c3ZnIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxMCAxMCI+CiAgICAgICAgPGNpcmNsZSBjeD0iNSIgY3k9IjUiIHI9IjMiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiAvPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnU1VNTUFSWScpXV0iPgogICAgICA8c3ZnIHdpZHRoJD0iW1toZWlnaHRdXSIgaGVpZ2h0JD0iW1toZWlnaHRdXSIgdmlld2JveD0iMCAwIDI0IDI0IiBmaWxsPSIjODQ4NDg0Ij4KICAgICAgICA8cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6TTkgMTdIN3YtN2gydjd6bTQgMGgtMlY3aDJ2MTB6bTQgMGgtMnYtNGgydjR6IiAvPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnT1AnKV1dIj4KICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMTYgOCI+CiAgICAgICAgPHVzZSB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdlbGxpcHNlJyl9fSIgeD0iOCIgeT0iNCIgLz4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ01FVEEnKV1dIj4KICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMzcgMTYiPgogICAgICAgIDxyZWN0IHg9IjEiIHk9IjEiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdyZWN0Jyl9fSIgc3Ryb2tlLXdpZHRoPSIycHgiIGhlaWdodD0iMTQiIHdpZHRoPSIzNSIgcng9IjUiIHJ5PSI1IiAvPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnU0VSSUVTJyldXSI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1t2ZXJ0aWNhbF1dIj4KICAgICAgICA8c3ZnIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxNiAxNSI+CiAgICAgICAgICA8dXNlIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bGluazpocmVmPSIjb3Atc2VyaWVzLXZlcnRpY2FsLXN0YW1wIiBmaWxsJD0iW1tfZmlsbF1dIiBzdHJva2UkPSJbW19zdHJva2VdXSIgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGZhZGVkLCAnc2VyaWVzJyl9fSIgeD0iMCIgeT0iMiIgLz4KICAgICAgICA8L3N2Zz4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyF2ZXJ0aWNhbF1dIj4KICAgICAgICA8c3ZnIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAyNCAxMCI+CiAgICAgICAgICA8dXNlIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bGluazpocmVmPSIjb3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdzZXJpZXMnKX19IiB4PSIwIiB5PSIxIiAvPgogICAgICAgIDwvc3ZnPgogICAgICA8L3RlbXBsYXRlPgogICAgPC90ZW1wbGF0ZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ub2RlLWljb24iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgdGYtZ3JhcGgtaWNvbiB7CiAgICAgICAgLS10Yi1ncmFwaC1mYWRlZDogdmFyKC0tdGItZ3JhcGgtZmFkZWQpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHRmLWdyYXBoLWljb24gaWQ9Imljb24iIHR5cGU9IltbX2dldFR5cGUobm9kZSwgc3VtbWFyeSwgY29uc3QsIHR5cGUpXV0iIGhlaWdodD0iW1toZWlnaHRdXSIgZmlsbC1vdmVycmlkZT0iW1tfZmlsbE92ZXJyaWRlXV0iIHN0cm9rZS1vdmVycmlkZT0iW1tfZ2V0U3Ryb2tlT3ZlcnJpZGUoX2ZpbGxPdmVycmlkZSldXSIgZmFkZWQ9IltbX2dldEZhZGVkKHJlbmRlckluZm8pXV0iIHZlcnRpY2FsPSJbW19pc1ZlcnRpY2FsKG5vZGUsIHZlcnRpY2FsKV1dIj48L3RmLWdyYXBoLWljb24+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAjbGlzdC1pdGVtIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBjb2xvcjogIzU2NTY1NjsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICAjbGlzdC1pdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1nb29nbGUteWVsbG93LTEwMCk7CiAgICAgIH0KCiAgICAgIC5jbGlja2FibGUgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuIHsKICAgICAgICBtYXJnaW4tbGVmdDogNDBweDsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbS5leGNsdWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuLmVkZ2UtbGFiZWwgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDNweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgICAgfQoKICAgICAgLm5vZGUtaWNvbiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMXB4OwogICAgICAgIGxlZnQ6IDJweDsKICAgICAgfQoKICAgICAgLmZhZGVkIHNwYW4gewogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1ncmFwaC1mYWRlZCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0ibGlzdC1pdGVtIiBvbi1tb3VzZW92ZXI9Il9ub2RlTGlzdGVuZXIiIG9uLW1vdXNlb3V0PSJfbm9kZUxpc3RlbmVyIiBvbi1jbGljaz0iX25vZGVMaXN0ZW5lciI+CiAgICAgIDxkaXYgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGl0ZW1SZW5kZXJJbmZvKX19Ij4KICAgICAgICA8dGYtbm9kZS1pY29uIGNsYXNzPSJub2RlLWljb24iIGhlaWdodD0iMTIiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIgbm9kZT0iW1tpdGVtTm9kZV1dIiByZW5kZXItaW5mbz0iW1tpdGVtUmVuZGVySW5mb11dIiB0ZW1wbGF0ZS1pbmRleD0iW1t0ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgIDwvdGYtbm9kZS1pY29uPgogICAgICAgIDxzcGFuIHRpdGxlJD0iW1tuYW1lXV0iPltbbmFtZV1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBtYXgtaGVpZ2h0OiA1MDBweDsKICAgICAgfQoKICAgICAgLmluY29tcGF0aWJsZS1vcHMtbGlzdCB7CiAgICAgICAgaGVpZ2h0OiAzNTBweDsKICAgICAgICBtYXgtaGVpZ2h0OiA0MDBweDsKICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICBpcm9uLWxpc3QgewogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICB9CgogICAgICBwYXBlci1pdGVtIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGJhY2tncm91bmQ6ICNlOWU5ZTk7CiAgICAgIH0KCiAgICAgIHBhcGVyLWl0ZW0tYm9keVt0d28tbGluZV0gewogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHggNHB4OwogICAgICB9CgogICAgICAuZXhwYW5kZWRJbmZvIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLm5vZGUtbmFtZSB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgZm9udC1zaXplOiAxNHB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC5zdWJ0aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMnB0OwogICAgICAgIGNvbG9yOiAjNWU1ZTVlOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5ub24tY29udHJvbC1saXN0LWl0ZW0gewogICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKICAgICAgfQoKICAgICAgZGl2Lm9wLWNvbXBhdC1kaXNwbGF5IHsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgc3ZnLm9wLWNvbXBhdCB7CiAgICAgICAgd2lkdGg6IDI1MHB4OwogICAgICAgIGhlaWdodDogMjVweDsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgZGl2Lm9wLWNvbXBhdC12YWx1ZSB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY29sb3I6IGJsYWNrOwogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pdGVtPgogICAgICA8cGFwZXItaXRlbS1ib2R5IHR3by1saW5lPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ie3tfZ2V0VG9nZ2xlSWNvbihfZXhwYW5kZWQpfX0iIG9uLWNsaWNrPSJfdG9nZ2xlRXhwYW5kZWQiIGNsYXNzPSJ0b2dnbGUtYnV0dG9uIj4KICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJub2RlLW5hbWUiIGlkPSJub2RldGl0bGUiPltbbm9kZVRpdGxlXV08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHNlY29uZGFyeT4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1YnRpdGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3AtY29tcGF0LWRpc3BsYXkiPgogICAgICAgICAgICAgIDxzdmcgY2xhc3M9Im9wLWNvbXBhdCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDI1MCAyNSI+CiAgICAgICAgICAgICAgICA8ZGVmcz4KICAgICAgICAgICAgICAgICAgPGxpbmVhcmdyYWRpZW50IGlkPSJvcC1jb21wYXQtZmlsbCI+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yJD0iW1tfb3BDb21wYXRDb2xvcl1dIj48L3N0b3A+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0JD0iW1tfb3BDb21wYXRTY29yZV1dIiBzdG9wLWNvbG9yJD0iW1tfb3BDb21wYXRDb2xvcl1dIj48L3N0b3A+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0JD0iW1tfb3BDb21wYXRTY29yZV1dIiBzdG9wLWNvbG9yJD0iW1tfb3BJbmNvbXBhdENvbG9yXV0iPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3IkPSJbW19vcEluY29tcGF0Q29sb3IgXV0iPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgPC9saW5lYXJncmFkaWVudD4KICAgICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICAgIDxyZWN0IGhlaWdodD0iMjUiIHdpZHRoPSIyNTAiIHJ4PSI1IiByeT0iNSIgc3R5bGU9ImZpbGw6IHVybCgnI29wLWNvbXBhdC1maWxsJyk7IiAvPgogICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wLWNvbXBhdC12YWx1ZSI+W1tfb3BDb21wYXRTY29yZUxhYmVsXV08L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9wYXBlci1pdGVtLWJvZHk+CiAgICA8L3BhcGVyLWl0ZW0+CgogICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19leHBhbmRlZH19Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19leHBhbmRlZH19IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJleHBhbmRlZEluZm8iPgogICAgICAgICAgSW5jb21wYXRpYmxlIE9wZXJhdGlvbnM6ICg8c3Bhbj5bW190b3RhbEluY29tcGF0T3BzXV08L3NwYW4+KQogICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0iaW5jb21wYXRpYmxlLW9wcy1saXN0IiBpZD0iaW5jb21wYXRpYmxlT3BzTGlzdCIgaXRlbXM9IltbX2luY29tcGF0aWJsZU9wTm9kZXNdXSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICA8dGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbSBjbGFzcz0ibm9uLWNvbnRyb2wtbGlzdC1pdGVtIiBpdGVtLW5vZGU9IltbaXRlbV1dIiBpdGVtLXJlbmRlci1pbmZvPSJbW19nZXRSZW5kZXJJbmZvKGl0ZW0ubmFtZSwgcmVuZGVySGllcmFyY2h5KV1dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIGl0ZW0tdHlwZT0iaW5jb21wYXRpYmxlLW9wcyI+CiAgICAgICAgICAgICAgPC90Zi1ncmFwaC1vcC1jb21wYXQtbGlzdC1pdGVtPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2lyb24tY29sbGFwc2U+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtbm9kZS1saXN0LWl0ZW0iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgI2xpc3QtaXRlbSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgY29sb3I6ICM1NjU2NTY7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ29vZ2xlLXllbGxvdy0xMDApOwogICAgICB9CgogICAgICAuY2xpY2thYmxlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3BhbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDQwcHg7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0uZXhjbHVkZWQgc3BhbiB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3Bhbi5lZGdlLWxhYmVsIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiAzcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICAgIH0KCiAgICAgIC5ub2RlLWljb24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDFweDsKICAgICAgICBsZWZ0OiAycHg7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogdmFyKC0tdGItZ3JhcGgtZmFkZWQpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBpZD0ibGlzdC1pdGVtIiBvbi1tb3VzZW92ZXI9Il9ub2RlTGlzdGVuZXIiIG9uLW1vdXNlb3V0PSJfbm9kZUxpc3RlbmVyIiBvbi1jbGljaz0iX25vZGVMaXN0ZW5lciI+CiAgICAgIDxkaXYgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGl0ZW1SZW5kZXJJbmZvKX19Ij4KICAgICAgICA8dGYtbm9kZS1pY29uIGNsYXNzPSJub2RlLWljb24iIGhlaWdodD0iMTIiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIgbm9kZT0iW1tpdGVtTm9kZV1dIiByZW5kZXItaW5mbz0iW1tpdGVtUmVuZGVySW5mb11dIiB0ZW1wbGF0ZS1pbmRleD0iW1t0ZW1wbGF0ZUluZGV4XV0iPjwvdGYtbm9kZS1pY29uPgogICAgICAgIDxzcGFuIHRpdGxlJD0iW1tuYW1lXV0iPltbbmFtZV1dPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJlZGdlLWxhYmVsIj5bW2VkZ2VMYWJlbF1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLW5vZGUtaW5mbyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuc3ViLWxpc3QtZ3JvdXAgewogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgZm9udC1zaXplOiAxMnB0OwogICAgICAgIHBhZGRpbmctYm90dG9tOiA4cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdCB7CiAgICAgICAgbWF4LWhlaWdodDogMzAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICB9CgogICAgICAuYXR0ci1sZWZ0IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICB3aWR0aDogMzAlOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBjb2xvcjogIzU2NTY1NjsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgfQoKICAgICAgLmF0dHItcmlnaHQgewogICAgICAgIG1hcmdpbi1sZWZ0OiAzMCU7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIGNvbG9yOiAjNTY1NjU2OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZSB7CiAgICAgICAgZGlzcGxheTogdGFibGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZS1yb3cgewogICAgICAgIGRpc3BsYXk6IHRhYmxlLXJvdzsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0LXRhYmxlLXJvdyAuc3ViLWxpc3QtdGFibGUtY2VsbDpsYXN0LWNoaWxkIHsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0LXRhYmxlLWNlbGwgewogICAgICAgIGNvbG9yOiAjNTY1NjU2OwogICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbWF4LXdpZHRoOiAyMDBweDsKICAgICAgICBwYWRkaW5nOiAwIDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaXRlbSB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBiYWNrZ3JvdW5kOiAjZTllOWU5OwogICAgICB9CgogICAgICBwYXBlci1pdGVtLWJvZHlbdHdvLWxpbmVdIHsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4IDRweDsKICAgICAgfQoKICAgICAgLmV4cGFuZGVkSW5mbyB7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sRGVwcyB7CiAgICAgICAgcGFkZGluZzogMCAwIDAgOHB4OwogICAgICB9CgogICAgICAubm9kZS1uYW1lIHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBmb250LXNpemU6IDE0cHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQoKICAgICAgLm5vZGUtaWNvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CgogICAgICAuc3VidGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICBjb2xvcjogIzVlNWU1ZTsKICAgICAgfQoKICAgICAgLmNvbnRyb2xMaW5lIHsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1idXR0b24gewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAuY29udHJvbC10b2dnbGUtYnV0dG9uIHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAudG9nZ2xlLWluY2x1ZGUtZ3JvdXAgewogICAgICAgIHBhZGRpbmctdG9wOiA0cHg7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtaW5jbHVkZSB7CiAgICAgICAgbWFyZ2luOiA1cHggNnB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMHB0OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtaW5jbHVkZTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ29vZ2xlLXllbGxvdy0xMDApOwogICAgICB9CgogICAgICAubm9uLWNvbnRyb2wtbGlzdC1pdGVtIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8cGFwZXItaXRlbT4KICAgICAgPHBhcGVyLWl0ZW0tYm9keSB0d28tbGluZT4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Int7X2dldFRvZ2dsZUljb24oX2V4cGFuZGVkKX19IiBvbi1jbGljaz0iX3RvZ2dsZUV4cGFuZGVkIiBjbGFzcz0idG9nZ2xlLWJ1dHRvbiI+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm9kZS1uYW1lIiBpZD0ibm9kZXRpdGxlIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHNlY29uZGFyeT4KICAgICAgICAgIDx0Zi1ub2RlLWljb24gY2xhc3M9Im5vZGUtaWNvbiIgbm9kZT0iW1tfbm9kZV1dIiByZW5kZXItaW5mbz0iW1tfZ2V0UmVuZGVySW5mbyhub2RlTmFtZSwgcmVuZGVySGllcmFyY2h5KV1dIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iPjwvdGYtbm9kZS1pY29uPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19ub2RlLm9wfX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWJ0aXRsZSI+CiAgICAgICAgICAgICAgT3BlcmF0aW9uOgogICAgICAgICAgICAgIDxzcGFuPltbX25vZGUub3BdXTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19ub2RlLm1ldGFncmFwaH19Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3VidGl0bGUiPgogICAgICAgICAgICAgIFN1YmdyYXBoOgogICAgICAgICAgICAgIDxzcGFuPltbX25vZGUuY2FyZGluYWxpdHldXTwvc3Bhbj4gbm9kZXMKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3BhcGVyLWl0ZW0tYm9keT4KICAgIDwvcGFwZXItaXRlbT4KICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0ie3tfZXhwYW5kZWR9fSI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfZXhwYW5kZWR9fSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZXhwYW5kZWRJbmZvIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIGF0dHJpYnV0ZXMiPgogICAgICAgICAgICBBdHRyaWJ1dGVzICg8c3Bhbj5bW19hdHRyaWJ1dGVzLmxlbmd0aF1dPC9zcGFuPikKICAgICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0ic3ViLWxpc3QiIGlkPSJhdHRyaWJ1dGVzTGlzdCIgaXRlbXM9IltbX2F0dHJpYnV0ZXNdXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYXR0ci1sZWZ0Ij5bW2l0ZW0ua2V5XV08L2Rpdj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYXR0ci1yaWdodCI+W1tpdGVtLnZhbHVlXV08L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvaXJvbi1saXN0PgogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19kZXZpY2V9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIGRldmljZSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYXR0ci1sZWZ0Ij5EZXZpY2U8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLXJpZ2h0Ij5bW19kZXZpY2VdXTwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgcHJlZGVjZXNzb3JzIj4KICAgICAgICAgICAgSW5wdXRzICg8c3Bhbj5bW190b3RhbFByZWRlY2Vzc29yc11dPC9zcGFuPikKICAgICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0ic3ViLWxpc3QiIGlkPSJpbnB1dHNMaXN0IiBpdGVtcz0iW1tfcHJlZGVjZXNzb3JzLnJlZ3VsYXJdXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGVkZ2UtbGFiZWw9IltbaXRlbS5lZGdlTGFiZWxdXSIgaXRlbS1yZW5kZXItaW5mbz0iW1tpdGVtLnJlbmRlckluZm9dXSIgbmFtZT0iW1tpdGVtLm5hbWVdXSIgaXRlbS10eXBlPSJwcmVkZWNlc3NvcnMiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSI+CiAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvaXJvbi1saXN0PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3ByZWRlY2Vzc29ycy5jb250cm9sLmxlbmd0aF1dIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sRGVwcyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sTGluZSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJ7e19nZXRUb2dnbGVJY29uKF9vcGVuZWRDb250cm9sUHJlZCl9fSIgb24tY2xpY2s9Il90b2dnbGVDb250cm9sUHJlZCIgY2xhc3M9ImNvbnRyb2wtdG9nZ2xlLWJ1dHRvbiI+CiAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgIENvbnRyb2wgZGVwZW5kZW5jaWVzCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0ie3tfb3BlbmVkQ29udHJvbFByZWR9fSIgbm8tYW5pbWF0aW9uPgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X29wZW5lZENvbnRyb2xQcmVkfX0iIHJlc3RhbXA9InRydWUiPgogICAgICAgICAgICAgICAgICAgIDxpcm9uLWxpc3QgY2xhc3M9InN1Yi1saXN0IiBpdGVtcz0iW1tfcHJlZGVjZXNzb3JzLmNvbnRyb2xdXSI+CiAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0Zi1ub2RlLWxpc3QtaXRlbSBjYXJkLW5vZGU9IltbX25vZGVdXSIgaXRlbS1ub2RlPSJbW2l0ZW0ubm9kZV1dIiBpdGVtLXJlbmRlci1pbmZvPSJbW2l0ZW0ucmVuZGVySW5mb11dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiBpdGVtLXR5cGU9InByZWRlY2Vzc29ycyIgY29sb3ItYnk9IltbY29sb3JCeV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90Zi1ub2RlLWxpc3QtaXRlbT4KICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC1ncm91cCBzdWNjZXNzb3JzIj4KICAgICAgICAgICAgT3V0cHV0cyAoPHNwYW4+W1tfdG90YWxTdWNjZXNzb3JzXV08L3NwYW4+KQogICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaWQ9Im91dHB1dHNMaXN0IiBpdGVtcz0iW1tfc3VjY2Vzc29ycy5yZWd1bGFyXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1ub2RlLWxpc3QtaXRlbSBjbGFzcz0ibm9uLWNvbnRyb2wtbGlzdC1pdGVtIiBjYXJkLW5vZGU9IltbX25vZGVdXSIgaXRlbS1ub2RlPSJbW2l0ZW0ubm9kZV1dIiBlZGdlLWxhYmVsPSJbW2l0ZW0uZWRnZUxhYmVsXV0iIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iIG5hbWU9IltbaXRlbS5uYW1lXV0iIGl0ZW0tdHlwZT0ic3VjY2Vzc29yIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgICAgICAgICAgPC90Zi1ub2RlLWxpc3QtaXRlbT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zdWNjZXNzb3JzLmNvbnRyb2wubGVuZ3RoXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xEZXBzIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xMaW5lIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Int7X2dldFRvZ2dsZUljb24oX29wZW5lZENvbnRyb2xTdWNjKX19IiBvbi1jbGljaz0iX3RvZ2dsZUNvbnRyb2xTdWNjIiBjbGFzcz0iY29udHJvbC10b2dnbGUtYnV0dG9uIj4KICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgQ29udHJvbCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19vcGVuZWRDb250cm9sU3VjY319IiBuby1hbmltYXRpb24+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfb3BlbmVkQ29udHJvbFN1Y2N9fSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0ic3ViLWxpc3QiIGl0ZW1zPSJbW19zdWNjZXNzb3JzLmNvbnRyb2xdXSI+CiAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0Zi1ub2RlLWxpc3QtaXRlbSBjYXJkLW5vZGU9IltbX25vZGVdXSIgaXRlbS1ub2RlPSJbW2l0ZW0ubm9kZV1dIiBpdGVtLXJlbmRlci1pbmZvPSJbW2l0ZW0ucmVuZGVySW5mb11dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiBpdGVtLXR5cGU9InN1Y2Nlc3NvcnMiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGYtbm9kZS1saXN0LWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgIDwvaXJvbi1saXN0PgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2hhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzfX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC1ncm91cCBub2RlLXN0YXRzIj4KICAgICAgICAgICAgICBOb2RlIFN0YXRzCiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19ub2RlU3RhdHMudG90YWxCeXRlc319Ij4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtcm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1jZWxsIj5NZW1vcnk8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1jZWxsIj4KICAgICAgICAgICAgICAgICAgICAgIFtbX25vZGVTdGF0c0Zvcm1hdHRlZEJ5dGVzXV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19nZXRUb3RhbE1pY3Jvcyhfbm9kZVN0YXRzKX19Ij4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtcm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1jZWxsIj5Db21wdXRlIFRpbWU8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1jZWxsIj4KICAgICAgICAgICAgICAgICAgICAgIFtbX25vZGVTdGF0c0Zvcm1hdHRlZENvbXB1dGVUaW1lXV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19ub2RlU3RhdHMub3V0cHV0U2l6ZX19Ij4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtcm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1jZWxsIj5UZW5zb3IgT3V0cHV0IFNpemVzPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e19ub2RlU3RhdHNGb3JtYXR0ZWRPdXRwdXRTaXplc319Ij4KICAgICAgICAgICAgICAgICAgICAgICAgW1tpdGVtXV0gPGJyPgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19mdW5jdGlvblVzYWdlcy5sZW5ndGhdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIHByZWRlY2Vzc29ycyI+CiAgICAgICAgICAgICAgVXNhZ2VzIG9mIHRoZSBGdW5jdGlvbiAoPHNwYW4+W1tfZnVuY3Rpb25Vc2FnZXMubGVuZ3RoXV08L3NwYW4+KQogICAgICAgICAgICAgIDxpcm9uLWxpc3QgY2xhc3M9InN1Yi1saXN0IiBpZD0iZnVuY3Rpb25Vc2FnZXNMaXN0IiBpdGVtcz0iW1tfZnVuY3Rpb25Vc2FnZXNdXSI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDx0Zi1ub2RlLWxpc3QtaXRlbSBjbGFzcz0ibm9uLWNvbnRyb2wtbGlzdC1pdGVtIiBjYXJkLW5vZGU9IltbX25vZGVdXSIgaXRlbS1ub2RlPSJbW2l0ZW1dXSIgbmFtZT0iW1tpdGVtLm5hbWVdXSIgaXRlbS10eXBlPSJmdW5jdGlvblVzYWdlcyIgY29sb3ItYnk9IltbY29sb3JCeV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIj4KICAgICAgICAgICAgICAgICAgPC90Zi1ub2RlLWxpc3QtaXRlbT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9pc0xpYnJhcnlGdW5jdGlvbihfbm9kZSldXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1pbmNsdWRlLWdyb3VwIj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBjbGFzcz0idG9nZ2xlLWluY2x1ZGUiIG9uLWNsaWNrPSJfdG9nZ2xlSW5jbHVkZSI+CiAgICAgICAgICAgICAgICA8c3Bhbj5bW19hdXhCdXR0b25UZXh0XV08L3NwYW4+CiAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2lzSW5TZXJpZXMoX25vZGUpfX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2dnbGUtaW5jbHVkZS1ncm91cCI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9InRvZ2dsZS1pbmNsdWRlIiBvbi1jbGljaz0iX3RvZ2dsZUdyb3VwIj4KICAgICAgICAgICAgICAgIDxzcGFuPltbX2dyb3VwQnV0dG9uVGV4dF1dPC9zcGFuPgogICAgICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2lyb24tY29sbGFwc2U+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtaW5mbyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1heC1oZWlnaHQ6IDY1MHB4OwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e3NlbGVjdGVkTm9kZX19Ij4KICAgICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9ImNhcmQiPgogICAgICAgIDx0Zi1ub2RlLWluZm8gZ3JhcGgtaGllcmFyY2h5PSJbW2dyYXBoSGllcmFyY2h5XV0iIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iIGZsYXQtZ3JhcGg9IltbZ3JhcGhdXSIgbm9kZS1uYW1lPSJbW3NlbGVjdGVkTm9kZV1dIiBub2RlLWluY2x1ZGU9Iltbc2VsZWN0ZWROb2RlSW5jbHVkZV1dIiBoaWdobGlnaHRlZC1ub2RlPSJ7e2hpZ2hsaWdodGVkTm9kZX19IiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iPgogICAgICAgIDwvdGYtbm9kZS1pbmZvPgogICAgICA8L3BhcGVyLW1hdGVyaWFsPgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICdvcF9jb21wYXRpYmlsaXR5JyldXSI+CiAgICAgIDx0Zi1ncmFwaC1vcC1jb21wYXQtY2FyZCBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgaGllcmFyY2h5LXBhcmFtcz0iW1toaWVyYXJjaHlQYXJhbXNdXSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIgY29sb3ItYnk9IltbY29sb3JCeV1dIiBub2RlLXRpdGxlPSJbW2NvbXBhdE5vZGVUaXRsZV1dIj4KICAgICAgPC90Zi1ncmFwaC1vcC1jb21wYXQtY2FyZD4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hlYWx0aFBpbGxzQXZhaWxhYmxlKGRlYnVnZ2VyRGF0YUVuYWJsZWQsIG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMpXV0iPgogICAgICA8dGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iIGRlYnVnZ2VyLW51bWVyaWMtYWxlcnRzPSJbW2RlYnVnZ2VyTnVtZXJpY0FsZXJ0c11dIiBub2RlLW5hbWVzLXRvLWhlYWx0aC1waWxscz0iW1tub2RlTmFtZXNUb0hlYWx0aFBpbGxzXV0iIHNlbGVjdGVkLW5vZGU9Int7c2VsZWN0ZWROb2RlfX0iIGhpZ2hsaWdodGVkLW5vZGU9Int7aGlnaGxpZ2h0ZWROb2RlfX0iIGFyZS1oZWFsdGgtcGlsbHMtbG9hZGluZz0iW1thcmVIZWFsdGhQaWxsc0xvYWRpbmddXSIgYWxsLXN0ZXBzLW1vZGUtZW5hYmxlZD0ie3thbGxTdGVwc01vZGVFbmFibGVkfX0iIHNwZWNpZmljLWhlYWx0aC1waWxsLXN0ZXA9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19IiBoZWFsdGgtcGlsbC1zdGVwLWluZGV4PSJ7e2hlYWx0aFBpbGxTdGVwSW5kZXh9fSI+CiAgICAgIDwvdGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkPgogICAgPC90ZW1wbGF0ZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOjpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgL2RlZXAvIC5jbG9zZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBsZWZ0OiAxNXB4OwogICAgICAgIGJvdHRvbTogMTVweDsKICAgICAgfQoKICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5jb250YWluZXIubG9hZGluZyB7CiAgICAgICAgY3Vyc29yOiBwcm9ncmVzczsKICAgICAgICBvcGFjaXR5OiAwLjE7CiAgICAgIH0KCiAgICAgIC5jb250YWluZXIubG9hZGluZy5lcnJvciB7CiAgICAgICAgY3Vyc29yOiBhdXRvOwogICAgICB9CgogICAgICAjaW5mbyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiA1cHg7CiAgICAgICAgdG9wOiA1cHg7CiAgICAgICAgcGFkZGluZzogMHB4OwogICAgICAgIG1heC13aWR0aDogMzgwcHg7CiAgICAgICAgbWluLXdpZHRoOiAzMjBweDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOSk7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CiAgICAgIH0KCiAgICAgICNtYWluIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgICNwcm9ncmVzcy1iYXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDQwcHg7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KCiAgICAgICNwcm9ncmVzcy1tc2cgewogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICB9CgogICAgICBwYXBlci1wcm9ncmVzcyB7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtaGVpZ2h0OiA2cHg7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1hY3RpdmUtY29sb3I6ICNmMzkxM2U7CiAgICAgIH0KCiAgICAgIC5jb250ZXh0LW1lbnUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlMmUyZTI7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtaW4td2lkdGg6IDE1MHB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkNGQ0ZDQ7CiAgICAgIH0KCiAgICAgIC9kZWVwLyAuY29udGV4dC1tZW51IHVsIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CgogICAgICAvZGVlcC8gLmNvbnRleHQtbWVudSB1bCBsaSB7CiAgICAgICAgcGFkZGluZzogNHB4IDE2cHg7CiAgICAgIH0KCiAgICAgIC9kZWVwLyAuY29udGV4dC1tZW51IHVsIGxpOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjM5MTNlOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNOb3RDb21wbGV0ZShwcm9ncmVzcyldXSI+CiAgICAgIDxkaXYgaWQ9InByb2dyZXNzLWJhciI+CiAgICAgICAgPGRpdiBpZD0icHJvZ3Jlc3MtbXNnIj5bW3Byb2dyZXNzLm1zZ11dPC9kaXY+CiAgICAgICAgPHBhcGVyLXByb2dyZXNzIHZhbHVlPSJbW3Byb2dyZXNzLnZhbHVlXV0iPjwvcGFwZXItcHJvZ3Jlc3M+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDxkaXYgY2xhc3MkPSJbW19nZXRDb250YWluZXJDbGFzcyhwcm9ncmVzcyldXSI+CiAgICAgIDxkaXYgaWQ9Im1haW4iPgogICAgICAgIDx0Zi1ncmFwaCBpZD0iZ3JhcGgiIGdyYXBoLWhpZXJhcmNoeT0ie3tncmFwaEhpZXJhcmNoeX19IiBiYXNpYy1ncmFwaD0iW1tncmFwaF1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW2hpZXJhcmNoeVBhcmFtc11dIiByZW5kZXItaGllcmFyY2h5PSJ7e3JlbmRlckhpZXJhcmNoeX19IiBkZXZpY2VzLWZvci1zdGF0cz0iW1tkZXZpY2VzRm9yU3RhdHNdXSIgc3RhdHM9Iltbc3RhdHNdXSIgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIgaGlnaGxpZ2h0ZWQtbm9kZT0ie3tfaGlnaGxpZ2h0ZWROb2RlfX0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJ7e2NvbG9yQnlQYXJhbXN9fSIgcHJvZ3Jlc3M9Int7cHJvZ3Jlc3N9fSIgZWRnZS1sYWJlbC1mdW5jdGlvbj0iW1tlZGdlTGFiZWxGdW5jdGlvbl1dIiBlZGdlLXdpZHRoLWZ1bmN0aW9uPSJbW2VkZ2VXaWR0aEZ1bmN0aW9uXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0iW1toZWFsdGhQaWxsU3RlcEluZGV4XV0iIGhhbmRsZS1ub2RlLXNlbGVjdGVkPSJbW2hhbmRsZU5vZGVTZWxlY3RlZF1dIiBoYW5kbGUtZWRnZS1zZWxlY3RlZD0iW1toYW5kbGVFZGdlU2VsZWN0ZWRdXSIgdHJhY2UtaW5wdXRzPSJbW3RyYWNlSW5wdXRzXV0iPjwvdGYtZ3JhcGg+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGlkPSJpbmZvIj4KICAgICAgICA8dGYtZ3JhcGgtaW5mbyBpZD0iZ3JhcGgtaW5mbyIgdGl0bGU9InNlbGVjdGVkIiBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgaGllcmFyY2h5LXBhcmFtcz0iW1toaWVyYXJjaHlQYXJhbXNdXSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIgZ3JhcGg9IltbZ3JhcGhdXSIgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIgc2VsZWN0ZWQtbm9kZS1pbmNsdWRlPSJ7e19zZWxlY3RlZE5vZGVJbmNsdWRlfX0iIGhpZ2hsaWdodGVkLW5vZGU9Int7X2hpZ2hsaWdodGVkTm9kZX19IiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIGNvbG9yLWJ5LXBhcmFtcz0iW1tjb2xvckJ5UGFyYW1zXV0iIGRlYnVnZ2VyLWRhdGEtZW5hYmxlZD0iW1tkZWJ1Z2dlckRhdGFFbmFibGVkXV0iIGFyZS1oZWFsdGgtcGlsbHMtbG9hZGluZz0iW1thcmVIZWFsdGhQaWxsc0xvYWRpbmddXSIgZGVidWdnZXItbnVtZXJpYy1hbGVydHM9IltbZGVidWdnZXJOdW1lcmljQWxlcnRzXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgYWxsLXN0ZXBzLW1vZGUtZW5hYmxlZD0ie3thbGxTdGVwc01vZGVFbmFibGVkfX0iIHNwZWNpZmljLWhlYWx0aC1waWxsLXN0ZXA9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19IiBoZWFsdGgtcGlsbC1zdGVwLWluZGV4PSJ7e2hlYWx0aFBpbGxTdGVwSW5kZXh9fSIgY29tcGF0LW5vZGUtdGl0bGU9IltbY29tcGF0Tm9kZVRpdGxlXV0iIG9uLW5vZGUtdG9nZ2xlLWluY2x1c2lvbj0iX29uTm9kZUluY2x1c2lvblRvZ2dsZWQiIG9uLW5vZGUtdG9nZ2xlLXNlcmllc2dyb3VwPSJfb25Ob2RlU2VyaWVzR3JvdXBUb2dnbGVkIj48L3RmLWdyYXBoLWluZm8+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1yYWRpby1idXR0b24iPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGxpbmUtaGVpZ2h0OiAwOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1zaXplOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tc2l6ZSwgMTZweCk7CiAgICAgICAgLyogLTFweCBpcyBhIHNlbnRpbmVsIGZvciB0aGUgZGVmYXVsdCBhbmQgaXMgcmVwbGFjZSBpbiBgYXR0YWNoZWRgLiAqLwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemU6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZSwgLTFweCk7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgICNyYWRpb0NvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWlubGluZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemUpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24tc2l6ZSk7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItcmFkaW8tYnV0dG9uLXJhZGlvLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgI2luayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICB3aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgb3BhY2l0eTogMC42OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgIH0KCiAgICAgICNpbmtbY2hlY2tlZF0gewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgfQoKICAgICAgI29mZlJhZGlvLCAjb25SYWRpbyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgfQoKICAgICAgI29mZlJhZGlvIHsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWJhY2tncm91bmQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4yOHM7CiAgICAgIH0KCiAgICAgICNvblJhZGlvIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIGVhc2UgMC4yOHM7CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIGVhc2UgMC4yOHM7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAjb2ZmUmFkaW8gewogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAjb25SYWRpbyB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuNSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjUpOwogICAgICB9CgogICAgICAjcmFkaW9MYWJlbCB7CiAgICAgICAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbC1zcGFjaW5nLCAxMHB4KTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWw7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjaGVja2VkXSkgI3JhZGlvTGFiZWwgewogICAgICAgIEBhcHBseSAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbC1jaGVja2VkOwogICAgICB9CgogICAgICAjcmFkaW9MYWJlbDpkaXIocnRsKSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWwtc3BhY2luZywgMTBweCk7CiAgICAgIH0KCiAgICAgICNyYWRpb0xhYmVsW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIGRpc2FibGVkIHN0YXRlICovCgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjb2ZmUmFkaW8gewogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdW2NoZWNrZWRdKSAjb25SYWRpbyB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjcmFkaW9MYWJlbCB7CiAgICAgICAgLyogc2xpZ2h0bHkgZGFya2VyIHRoYW4gdGhlIGJ1dHRvbiwgc28gdGhhdCBpdCdzIHJlYWRhYmxlICovCiAgICAgICAgb3BhY2l0eTogMC42NTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJyYWRpb0NvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9Im9mZlJhZGlvIj48L2Rpdj4KICAgICAgPGRpdiBpZD0ib25SYWRpbyI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJyYWRpb0xhYmVsIj48c2xvdD48L3Nsb3Q+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1yYWRpby1ncm91cCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICA6aG9zdCA6OnNsb3R0ZWQoKikgewogICAgICAgIHBhZGRpbmc6IHZhcigtLXBhcGVyLXJhZGlvLWdyb3VwLWl0ZW0tcGFkZGluZywgMTJweCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXRvb2x0aXAiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIHotaW5kZXg6IDEwMDI7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIH0KCiAgICAgICN0b29sdGlwIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvb2x0aXAtYmFja2dyb3VuZCwgIzYxNjE2MSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvb2x0aXAtdGV4dC1jb2xvciwgd2hpdGUpOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcDsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZVNjYWxlVXAgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC4wKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lU2NhbGVEb3duIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMCk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZUZhZGVJbk9wYWNpdHkgewogICAgICAgIDAlIHsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZUZhZGVPdXRPcGFjaXR5IHsKICAgICAgICAwJSB7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVTbGlkZURvd25JbiB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMDAwcHgpOwogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgICAgMTAlIHsKICAgICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lU2xpZGVEb3duT3V0IHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICAgIDEwJSB7CiAgICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMDAwcHgpOwogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5mYWRlLWluLWFuaW1hdGlvbiB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktaW4sIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVGYWRlSW5PcGFjaXR5OwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24taW4sIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLmZhZGUtb3V0LWFuaW1hdGlvbiB7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQsIDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lRmFkZU91dE9wYWNpdHk7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLnNjYWxlLXVwLWFuaW1hdGlvbiB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LWluLCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lU2NhbGVVcDsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLWluLCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5zY2FsZS1kb3duLWFuaW1hdGlvbiB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZVNjYWxlRG93bjsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuc2xpZGUtZG93bi1hbmltYXRpb24gewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjAwMHB4KTsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVTbGlkZURvd25JbjsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjAsIDAuMCwgMC4yLCAxKTsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24tb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5zbGlkZS1kb3duLWFuaW1hdGlvbi1vdXQgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZVNsaWRlRG93bk91dDsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMSwgMSk7CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuY2FuY2VsLWFuaW1hdGlvbiB7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAtMzBzICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIFRoYW5rcyBJRSAxMC4gKi8KCiAgICAgIC5oaWRkZW4gewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJ0b29sdGlwIiBjbGFzcz0iaGlkZGVuIj4KICAgICAgPHNsb3Q+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1ub2RlLXNlYXJjaCI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0ic2VhcmNoLWNvbnRhaW5lciI+CiAgICAgIDxwYXBlci1pbnB1dCBpZD0icnVucy1yZWdleCIgbGFiZWw9IlNlYXJjaCBub2Rlcy4gUmVnZXhlcyBzdXBwb3J0ZWQuIiB2YWx1ZT0ie3tfcmF3UmVnZXhJbnB1dH19Ij4KICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPGRpdiBpZD0ic2VhcmNoLXJlc3VsdHMtYW5jaG9yIj4KICAgICAgICA8ZGl2IGlkPSJzZWFyY2gtcmVzdWx0cyI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19yZWdleE1hdGNoZXNdXSI+CiAgICAgICAgICAgIDxkaXYgaWQ9InNlYXJjaC1tYXRjaCIgb24tY2xpY2s9Il9tYXRjaENsaWNrZWQiPltbaXRlbV1dPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAjc2VhcmNoLWNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgIH0KCiAgICAgICNydW5zLXJlZ2V4IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI3NlYXJjaC1yZXN1bHRzLWFuY2hvciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjc2VhcmNoLXJlc3VsdHMgewogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfQoKICAgICAgI3NlYXJjaC1tYXRjaCB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgcGFkZGluZzogM3B4OwogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGRpcmVjdGlvbjogcnRsOwogICAgICB9CgogICAgICAjc2VhcmNoLW1hdGNoOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi1vcmFuZ2Utd2Vhayk7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtY29udHJvbHMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGNvbG9yOiBncmF5OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIC0tcGFwZXItZHJvcGRvd24tbWVudS1pbnB1dDogewogICAgICAgICAgcGFkZGluZzogMDsKICAgICAgICAgIGNvbG9yOiBncmF5OwogICAgICAgIH0KICAgICAgICAtLWlyb24taWNvbi13aWR0aDogMTVweDsKICAgICAgICAtLWlyb24taWNvbi1oZWlnaHQ6IDE1cHg7CiAgICAgICAgLS1wcmltYXJ5LXRleHQtY29sb3I6IGdyYXk7CiAgICAgICAgLS1wYXBlci1pdGVtLW1pbi1oZWlnaHQ6IDMwcHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLWJ1dHRvbltyYWlzZWRdLmtleWJvYXJkLWZvY3VzIHsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CgogICAgICAucnVuLWRyb3Bkb3duIHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lcjogewogICAgICAgICAgcGFkZGluZzogOHB4IDAgOHB4IDEwcHg7CiAgICAgICAgfQogICAgICB9CgogICAgICAuY29sb3ItZHJvcGRvd24gewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyOiB7CiAgICAgICAgICBwYWRkaW5nOiA5cHggMCAwIDEzcHg7CiAgICAgICAgfQogICAgICB9CgogICAgICB0YWJsZSB7CiAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgICAgICBib3JkZXItc3BhY2luZzogMDsKICAgICAgfQoKICAgICAgdGFibGUgdGQgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAuYWxsY29udHJvbHMgewogICAgICAgIHBhZGRpbmc6IDAgMjBweCAyMHB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CgogICAgICAubGVnZW5kLWhvbGRlciB7CiAgICAgICAgYmFja2dyb3VuZDogI2U5ZTllOTsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2NjYzsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGNvbG9yOiAjNTU1OwogICAgICAgIHBhZGRpbmc6IDE1cHggMjBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1sZWdlbmQtYnV0dG9uIHsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAudG9nZ2xlLWxlZ2VuZC10ZXh0IHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CgogICAgICBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDVweDsKICAgICAgfQogICAgICBzdmcuaWNvbiwKICAgICAgdGYtZ3JhcGgtaWNvbiB7CiAgICAgICAgd2lkdGg6IDYwcHg7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICB9CiAgICAgIC5kb21haW5WYWx1ZXMgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgICAgd2lkdGg6IDE2NXB4OwogICAgICB9CiAgICAgIC5kb21haW5TdGFydCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgLmRvbWFpbkVuZCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CiAgICAgIC5jb2xvckJveCB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5pbWFnZS1pY29uIHsKICAgICAgICB3aWR0aDogMjRweDsKICAgICAgICBoZWlnaHQ6IDI0cHg7CiAgICAgIH0KCiAgICAgIC5oZWxwLWljb24gewogICAgICAgIGhlaWdodDogMTVweDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLmdyYXkgewogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAudGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBtYXJnaW46IDhweCA1cHggOHB4IDA7CiAgICAgICAgY29sb3I6IGJsYWNrOwogICAgICB9CiAgICAgIC50aXRsZSBzbWFsbCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgfQogICAgICAuZGV2aWNlTGlzdCwKICAgICAgLnhsYUNsdXN0ZXJMaXN0IHsKICAgICAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CgogICAgICAjZmlsZSB7CiAgICAgICAgcGFkZGluZzogOHB4IDA7CiAgICAgIH0KCiAgICAgIC5jb2xvci1sZWdlbmQtcm93IHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGNsZWFyOiBib3RoOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQoKICAgICAgLmNvbG9yLWxlZ2VuZC1yb3cgLmxhYmVsLAogICAgICAuY29sb3ItbGVnZW5kLXJvdyBzdmcsCiAgICAgIC5jb2xvci1sZWdlbmQtcm93IHRmLWdyYXBoLWljb24gewogICAgICAgIGZsZXg6IDAgMCA0MHB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMjBweDsKICAgICAgfQoKICAgICAgLmRldmljZXMtY2hlY2tib3ggaW5wdXQgewogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQoKICAgICAgLmNvbnRyb2wtaG9sZGVyIC5pY29uLWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbjogMCAtNXB4OwogICAgICAgIHBhZGRpbmc6IDVweDsKICAgICAgfQoKICAgICAgLmJ1dHRvbi10ZXh0IHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgIH0KCiAgICAgIC51cGxvYWQtYnV0dG9uIHsKICAgICAgICB3aWR0aDogMTY1cHg7CiAgICAgICAgaGVpZ2h0OiAyNXB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICAgIG1hcmdpbi10b3A6IDRweDsKICAgICAgfQoKICAgICAgLmJ1dHRvbi1pY29uIHsKICAgICAgICB3aWR0aDogMjZweDsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS01MDApOwogICAgICB9CgogICAgICAuaGlkZGVuLWlucHV0IHsKICAgICAgICBoZWlnaHQ6IDBweDsKICAgICAgICB3aWR0aDogMHB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5hbGxjb250cm9scyAuY29udHJvbC1ob2xkZXIgewogICAgICAgIGNsZWFyOiBib3RoOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9CgogICAgICAuYWxsY29udHJvbHMgLmNvbnRyb2wtaG9sZGVyIHBhcGVyLXJhZGlvLWdyb3VwIHsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KCiAgICAgIHNwYW4uY291bnRlciB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGNvbG9yOiBncmF5OwogICAgICB9CgogICAgICAucnVucyBwYXBlci1pdGVtIHsKICAgICAgICAtLXBhcGVyLWl0ZW06IHsKICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgfQogICAgICB9CgogICAgICB0YWJsZS5jb250cm9sLWhvbGRlciB7CiAgICAgICAgYm9yZGVyOiAwOwogICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICAgIH0KCiAgICAgIHRhYmxlLnRmLWdyYXBoLWNvbnRyb2xzIHRkLmlucHV0LWVsZW1lbnQtdGFibGUtZGF0YSB7CiAgICAgICAgcGFkZGluZzogMCAwIDAgMjBweDsKICAgICAgfQoKICAgICAgLnNwYWNlciB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CgogICAgICAuY29sb3ItdGV4dCB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyoqIE92ZXJyaWRlIGlubGluZSBzdHlsZXMgdGhhdCBzdXBwcmVzcyBwb2ludGVyIGV2ZW50cyBmb3IgZGlzYWJsZWQgYnV0dG9ucy4gT3RoZXJ3aXNlLCB0aGUgKi8KICAgICAgLyogIHRvb2x0aXBzIGRvIG5vdCBhcHBlYXIuICovCiAgICAgIHBhcGVyLXJhZGlvLWdyb3VwIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG8gIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLmxlZ2VuZC1jbGFyaWZpZXIgewogICAgICAgIGNvbG9yOiAjMjY2MjM2OwogICAgICAgIGN1cnNvcjogaGVscDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KCiAgICAgIC5sZWdlbmQtY2xhcmlmaWVyIHBhcGVyLXRvb2x0aXAgewogICAgICAgIHdpZHRoOiAxNTBweDsKICAgICAgfQoKICAgICAgLyoqIE90aGVyd2lzZSwgcG9seW1lciBVSSBjb250cm9scyBhcHBlYXIgYXRvcCBub2RlIHNlYXJjaC4gKi8KICAgICAgdGYtZ3JhcGgtbm9kZS1zZWFyY2ggewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGNsYXNzPSJhbGxjb250cm9scyI+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8dGYtZ3JhcGgtbm9kZS1zZWFyY2ggc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSI+PC90Zi1ncmFwaC1ub2RlLXNlYXJjaD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJpY29uLWJ1dHRvbiIgb24tdGFwPSJfZml0IiBhbHQ9IkZpdCB0byBzY3JlZW4iPgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJhc3BlY3QtcmF0aW8iIGNsYXNzPSJidXR0b24taWNvbiI+PC9pcm9uLWljb24+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iYnV0dG9uLXRleHQiPkZpdCB0byBTY3JlZW48L3NwYW4+CiAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0iaWNvbi1idXR0b24iIG9uLWNsaWNrPSJkb3dubG9hZCIgYWx0PSJEb3dubG9hZCBQTkciPgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJmaWxlLWRvd25sb2FkIiBjbGFzcz0iYnV0dG9uLWljb24iPjwvaXJvbi1pY29uPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImJ1dHRvbi10ZXh0Ij5Eb3dubG9hZCBQTkc8L3NwYW4+CiAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgPGEgaHJlZj0iIyIgaWQ9ImdyYXBoZG93bmxvYWQiIGNsYXNzPSJ0aXRsZSIgZG93bmxvYWQ9ImdyYXBoLnBuZyI+PC9hPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIgcnVucyI+CiAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPgogICAgICAgICAgUnVuIDxzcGFuIGNsYXNzPSJjb3VudGVyIj4oW1tkYXRhc2V0cy5sZW5ndGhdXSk8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQgbm8tYW5pbWF0aW9ucyBub2luayBob3Jpem9udGFsLWFsaWduPSJsZWZ0IiBjbGFzcz0icnVuLWRyb3Bkb3duIj4KICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRSdW5JbmRleH19IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tkYXRhc2V0c11dIj4KICAgICAgICAgICAgICA8cGFwZXItaXRlbT5bW2l0ZW0ubmFtZV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93U2Vzc2lvblJ1bnNEcm9wZG93bl1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+CiAgICAgICAgICAgIFRhZwogICAgICAgICAgICA8c3BhbiBjbGFzcz0iY291bnRlciI+KFtbX251bVRhZ3MoZGF0YXNldHMsIF9zZWxlY3RlZFJ1bkluZGV4KV1dKTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQgbm8tYW5pbWF0aW9ucyBob3Jpem9udGFsLWFsaWduPSJsZWZ0IiBub2luayBjbGFzcz0icnVuLWRyb3Bkb3duIj4KICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e19zZWxlY3RlZFRhZ0luZGV4fX0iIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2dldFRhZ3MoZGF0YXNldHMsIF9zZWxlY3RlZFJ1bkluZGV4KV1dIj4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPltbaXRlbS5kaXNwbGF5TmFtZV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dVcGxvYWRCdXR0b25dXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPlVwbG9hZDwvZGl2PgogICAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9InVwbG9hZC1idXR0b24iIG9uLWNsaWNrPSJfZ2V0RmlsZSIgdGl0bGU9IlVwbG9hZCBhIGdyYXBoIHBidHh0IGZpbGUgdG8gdmlldyB0aGUgZ3JhcGgiPgogICAgICAgICAgICBDaG9vc2UgRmlsZQogICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoaWRkZW4taW5wdXQiPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgaWQ9ImZpbGUiIG5hbWU9ImZpbGUiIG9uLWNoYW5nZT0iX3VwZGF0ZUZpbGVJbnB1dCIgYWNjZXB0PSIucGJ0eHQiPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8cGFwZXItcmFkaW8tZ3JvdXAgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkR3JhcGhUeXBlfX0iPgogICAgICAgICAgCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9Im9wX2dyYXBoIiBkaXNhYmxlZD0iW1tfZ2V0U2VsZWN0aW9uT3BHcmFwaERpc2FibGVkKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCwgX3NlbGVjdGVkVGFnSW5kZXgpXV0iPkdyYXBoPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9ImNvbmNlcHR1YWxfZ3JhcGgiIGRpc2FibGVkPSJbW19nZXRTZWxlY3Rpb25Db25jZXB0dWFsR3JhcGhEaXNhYmxlZChkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4KV1dIj5Db25jZXB0dWFsIEdyYXBoPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9InByb2ZpbGUiIGRpc2FibGVkPSJbW19nZXRTZWxlY3Rpb25Qcm9maWxlRGlzYWJsZWQoZGF0YXNldHMsIF9zZWxlY3RlZFJ1bkluZGV4LCBfc2VsZWN0ZWRUYWdJbmRleCldXSI+UHJvZmlsZTwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxwYXBlci10b2dnbGUtYnV0dG9uIGNoZWNrZWQ9Int7dHJhY2VJbnB1dHN9fSIgY2xhc3M9InRpdGxlIj4KICAgICAgICAgICAgVHJhY2UgaW5wdXRzCiAgICAgICAgICA8L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaGVhbHRoUGlsbHNGZWF0dXJlRW5hYmxlZF1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBjaGVja2VkPSJ7e2hlYWx0aFBpbGxzVG9nZ2xlZE9ufX0iIGNsYXNzPSJ0aXRsZSI+U2hvdyBoZWFsdGggcGlsbHM8L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+Q29sb3I8L2Rpdj4KICAgICAgICA8cGFwZXItcmFkaW8tZ3JvdXAgc2VsZWN0ZWQ9Int7Y29sb3JCeX19Ij4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0ic3RydWN0dXJlIj5TdHJ1Y3R1cmU8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9ImRldmljZSI+RGV2aWNlPC9wYXBlci1yYWRpby1idXR0b24+CgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ieGxhLWNsdXN0ZXItcmFkaW8tYnV0dG9uIiBuYW1lPSJ4bGFfY2x1c3RlciIgZGlzYWJsZWQ9IltbIV94bGFDbHVzdGVyc1Byb3ZpZGVkKHJlbmRlckhpZXJhcmNoeSldXSI+CiAgICAgICAgICAgIFhMQSBDbHVzdGVyCiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgZm9yPSJ4bGEtY2x1c3Rlci1yYWRpby1idXR0b24iIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgQ29sb3JpbmcgYnkgWExBIGNsdXN0ZXIgaXMgb25seSBlbmFibGVkIGlmIGF0IGxlYXN0IDEgb3Agc3BlY2lmaWVzCiAgICAgICAgICAgIGFuIFhMQSBjbHVzdGVyLgogICAgICAgICAgPC9wYXBlci10b29sdGlwPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9ImNvbXB1dGUtdGltZS1yYWRpby1idXR0b24iIG5hbWU9ImNvbXB1dGVfdGltZSIgZGlzYWJsZWQ9IltbIXN0YXRzXV0iPgogICAgICAgICAgICBDb21wdXRlIHRpbWUKICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9ImNvbXB1dGUtdGltZS1yYWRpby1idXR0b24iIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgQ29sb3JpbmcgYnkgY29tcHV0ZSB0aW1lIGlzIG9ubHkgZW5hYmxlZCBpZiB0aGUgUnVuTWV0YWRhdGEgcHJvdG8gaXMKICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSBGaWxlV3JpdGVyIHdoZW4gYSBzcGVjaWZpYyBzZXNzaW9uIGlzIHJ1bi4KICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJtZW1vcnktcmFkaW8tYnV0dG9uIiBuYW1lPSJtZW1vcnkiIGRpc2FibGVkPSJbWyFzdGF0c11dIj4KICAgICAgICAgICAgTWVtb3J5CiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgZm9yPSJtZW1vcnktcmFkaW8tYnV0dG9uIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgIENvbG9yaW5nIGJ5IG1lbW9yeSBpcyBvbmx5IGVuYWJsZWQgaWYgdGhlIFJ1bk1ldGFkYXRhIHByb3RvIGlzCiAgICAgICAgICAgIHBhc3NlZCB0byB0aGUgRmlsZVdyaXRlciB3aGVuIGEgc3BlY2lmaWMgc2Vzc2lvbiBpcyBydW4uCiAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0idHB1LWNvbXBhdGliaWxpdHktcmFkaW8tYnV0dG9uIiBuYW1lPSJvcF9jb21wYXRpYmlsaXR5Ij4KICAgICAgICAgICAgVFBVIENvbXBhdGliaWxpdHkKICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9InRwdS1jb21wYXRpYmlsaXR5LXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICBDb2xvcmluZyBieSB3aGV0aGVyIGFuIG9wZXJhdGlvbiBpcyBjb21wYXRpYmxlIGZvciB0aGUgVFBVIGRldmljZS4KICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgogICAgICAgIDxzcGFuIGNsYXNzPSJzcGFjZXIiPjwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXY+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0dyYWRpZW50Q29sb3Jpbmcoc3RhdHMsIGNvbG9yQnkpXV0iPgogICAgICAgICAgPHN2ZyB3aWR0aD0iMTQwIiBoZWlnaHQ9IjIwIiBzdHlsZT0ibWFyZ2luOiAwIDVweCIgY2xhc3M9ImNvbG9yLXRleHQiPgogICAgICAgICAgICA8ZGVmcz4KICAgICAgICAgICAgICA8bGluZWFyZ3JhZGllbnQgaWQ9ImxpbmVhckdyYWRpZW50IiB4MT0iMCUiIHkxPSIwJSIgeDI9IjEwMCUiIHkyPSIwJSI+CiAgICAgICAgICAgICAgICA8c3RvcCBjbGFzcz0ic3RhcnQiIG9mZnNldD0iMCUiIHN0b3AtY29sb3IkPSJbW19jdXJyZW50R3JhZGllbnRQYXJhbXMuc3RhcnRDb2xvcl1dIiAvPgogICAgICAgICAgICAgICAgPHN0b3AgY2xhc3M9ImVuZCIgb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yJD0iW1tfY3VycmVudEdyYWRpZW50UGFyYW1zLmVuZENvbG9yXV0iIC8+CiAgICAgICAgICAgICAgPC9saW5lYXJncmFkaWVudD4KICAgICAgICAgICAgPC9kZWZzPgogICAgICAgICAgICA8cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMTM1IiBoZWlnaHQ9IjIwIiBmaWxsPSJ1cmwoI2xpbmVhckdyYWRpZW50KSIgc3Ryb2tlPSJibGFjayIgLz4KICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgPGRpdiBjbGFzcz0iZG9tYWluVmFsdWVzIGNvbG9yLXRleHQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkb21haW5TdGFydCI+W1tfY3VycmVudEdyYWRpZW50UGFyYW1zLm1pblZhbHVlXV08L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZG9tYWluRW5kIj5bW19jdXJyZW50R3JhZGllbnRQYXJhbXMubWF4VmFsdWVdXTwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8YnIgc3R5bGU9ImNsZWFyOiBib3RoIj4KICAgICAgICAgIDxkaXY+RGV2aWNlcyBpbmNsdWRlZCBpbiBzdGF0czo8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRldmljZUxpc3QiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jdXJyZW50RGV2aWNlc11dIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93IGRldmljZXMtY2hlY2tib3giPgogICAgICAgICAgICAgICAgPHNwYW4+PGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZSQ9IltbaXRlbS5kZXZpY2VdXSIgY2hlY2tlZCQ9IltbaXRlbS51c2VkXV0iIG9uLWNsaWNrPSJfZGV2aWNlQ2hlY2tib3hDbGlja2VkIj48L3NwYW4+CiAgICAgICAgICAgICAgICA8c3Bhbj5bW2l0ZW0uc3VmZml4XV08L3NwYW4+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaXRlbS5pZ25vcmVkTXNnXV0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaGVscCIgY2xhc3M9ImhlbHAtaWNvbiI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiIGFuaW1hdGlvbi1kZWxheT0iMCI+W1tpdGVtLmlnbm9yZWRNc2ddXTwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICdzdHJ1Y3R1cmUnKV1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLXRleHQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGFiZWwiPgogICAgICAgICAgICAgICAgY29sb3JzCiAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPnNhbWUgc3Vic3RydWN0dXJlPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iTUVUQSIgaGVpZ2h0PSIxNiIgZmlsbC1vdmVycmlkZT0iI2VlZSIgc3Ryb2tlLW92ZXJyaWRlPSIjYTZhNmE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+dW5pcXVlIHN1YnN0cnVjdHVyZTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICdkZXZpY2UnKV1dIj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2N1cnJlbnREZXZpY2VQYXJhbXNdXSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJNRVRBIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSJbW2l0ZW0uY29sb3JdXSIgc3Ryb2tlLW92ZXJyaWRlPSIjYTZhNmE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5bW2l0ZW0uZGV2aWNlXV08L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik1FVEEiIGhlaWdodD0iMTYiIGZpbGwtb3ZlcnJpZGU9IiNlZWUiIHN0cm9rZS1vdmVycmlkZT0iI2E2YTZhNiI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPnVua25vd24gZGV2aWNlPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ3hsYV9jbHVzdGVyJyldXSI+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jdXJyZW50WGxhQ2x1c3RlclBhcmFtc11dIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICAgIDxzdmc+CiAgICAgICAgICAgICAgICAgIDx1c2UgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhsaW5rOmhyZWY9IiN1bmZpbGxlZC1yZWN0IiB4PSIwIiB5PSIwIiBzdHlsZT0iZmlsbDpbW2l0ZW0uY29sb3JdXSIgLz4KICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+W1tpdGVtLnhsYV9jbHVzdGVyXV08L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgIDxzdmc+CiAgICAgICAgICAgICAgICA8dXNlIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bGluazpocmVmPSIjZ3JleS1yZWN0IiB4PSIwIiB5PSIwIiAvPgogICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPnVua25vd24gWExBIGNsdXN0ZXI8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2VxdWFscyhjb2xvckJ5LCAnb3BfY29tcGF0aWJpbGl0eScpXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItdGV4dCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik9QIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSIjMGY5ZDU4IiBzdHJva2Utb3ZlcnJpZGU9IiNjY2MiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5WYWxpZCBPcDwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik9QIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSIjZGI0NDM3IiBzdHJva2Utb3ZlcnJpZGU9IiNjY2MiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5JbnZhbGlkIE9wPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zdGF0c05vdE51bGwoc3RhdHMpXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik1FVEEiIGhlaWdodD0iMTYiIGZhZGVkPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+dW51c2VkIHN1YnN0cnVjdHVyZTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtaG9sZGVyIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249IltbX2dldFRvZ2dsZUxlZ2VuZEljb24oX2xlZ2VuZE9wZW5lZCldXSIgb24tY2xpY2s9Il90b2dnbGVMZWdlbmRPcGVuIiBjbGFzcz0idG9nZ2xlLWxlZ2VuZC1idXR0b24iPgogICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8c3BhbiBjbGFzcz0idG9nZ2xlLWxlZ2VuZC10ZXh0Ij4KICAgICAgICBbW19nZXRUb2dnbGVUZXh0KF9sZWdlbmRPcGVuZWQpXV0KICAgICAgPC9zcGFuPgogICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9IltbX2xlZ2VuZE9wZW5lZF1dIj4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHRhYmxlPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkPjxkaXYgY2xhc3M9InRpdGxlIj5HcmFwaDwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgPHRkPigqID0gZXhwYW5kYWJsZSk8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iTUVUQSIgaGVpZ2h0PSIxNiIgZmlsbC1vdmVycmlkZT0iI2Q5ZDlkOSIgc3Ryb2tlLW92ZXJyaWRlPSIjY2NjIj48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBOYW1lc3BhY2U8c3BhbiBjbGFzcz0iZ3JheSI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBFbmNhcHN1bGF0ZXMgYSBzZXQgb2Ygbm9kZXMuIE5hbWVzcGFjZSBpcyBoaWVyYXJjaGljYWwgYW5kCiAgICAgICAgICAgICAgICAgICAgYmFzZWQgb24gc2NvcGUuCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJPUCIgaGVpZ2h0PSIxNiI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgT3BOb2RlCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgTm9kZSB0aGF0IHBlcmZvcm1zIGFuIG9wZXJhdGlvbi4gVGhlc2Ugbm9kZXMgY2Fubm90IGV4cGFuZC4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9IlNFUklFUyIgaGVpZ2h0PSIxNiI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgVW5jb25uZWN0ZWQgc2VyaWVzPHNwYW4gY2xhc3M9ImdyYXkiPio8L3NwYW4+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2Ugb2YgbnVtYmVyZWQgbm9kZXMgdGhhdCBhcmUgbm90IGNvbm5lY3RlZCB0byBlYWNoCiAgICAgICAgICAgICAgICAgICAgb3RoZXIuCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJTRVJJRVMiIGhlaWdodD0iMTYiIHZlcnRpY2FsPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIENvbm5lY3RlZCBzZXJpZXM8c3BhbiBjbGFzcz0iZ3JheSI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBvZiBudW1iZXJlZCBub2RlcyB0aGF0IGFyZSBjb25uZWN0ZWQgdG8gZWFjaCBvdGhlci4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iPgogICAgICAgICAgICAgICAgICA8Y2lyY2xlIGZpbGw9IndoaXRlIiBzdHJva2U9IiM4NDg0ODQiIGN4PSIxMCIgY3k9IjEwIiByPSI1IiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBDb25zdGFudAogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIE5vZGUgdGhhdCBvdXRwdXRzIGEgY29uc3RhbnQgdmFsdWUuCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJTVU1NQVJZIiBoZWlnaHQ9IjIwIj48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBTdW1tYXJ5CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgTm9kZSB0aGF0IGNvbGxlY3RzIGRhdGEgZm9yIHZpc3VhbGl6YXRpb24gd2l0aGluCiAgICAgICAgICAgICAgICAgICAgVGVuc29yQm9hcmQuCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJpY29uIiBoZWlnaHQ9IjE1cHgiIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxNSAxNSI+CiAgICAgICAgICAgICAgICAgIDxkZWZzPgogICAgICAgICAgICAgICAgICAgIDxtYXJrZXIgaWQ9ImRhdGFmbG93LWFycm93aGVhZC1sZWdlbmQiIGZpbGw9IiNiYmIiIG1hcmtlcndpZHRoPSIxMCIgbWFya2VyaGVpZ2h0PSIxMCIgcmVmeD0iOSIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPgogICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCAxMCw1IEwgMCwxMCBDIDMsNyAzLDMgMCwwIiAvPgogICAgICAgICAgICAgICAgICAgIDwvbWFya2VyPgogICAgICAgICAgICAgICAgICA8L2RlZnM+CiAgICAgICAgICAgICAgICAgIDxwYXRoIG1hcmtlci1lbmQ9InVybCgjZGF0YWZsb3ctYXJyb3doZWFkLWxlZ2VuZCkiIHN0cm9rZT0iI2JiYiIgZD0iTTIgOSBsIDI5IDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgLz4KICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgRGF0YWZsb3cgZWRnZQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIEVkZ2Ugc2hvd2luZyB0aGUgZGF0YSBmbG93IGJldHdlZW4gb3BlcmF0aW9ucy4gRWRnZXMgZmxvdwogICAgICAgICAgICAgICAgICAgIHVwd2FyZHMgdW5sZXNzIGFycm93aGVhZHMgc3BlY2lmeSBvdGhlcndpc2UuCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJpY29uIiBoZWlnaHQ9IjE1cHgiIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxNSAxNSI+CiAgICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZT0iI2JiYiIgZD0iTTIgOSBsIDI5IDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWRhc2hhcnJheT0iMiwgMiIgLz4KICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgQ29udHJvbCBkZXBlbmRlbmN5IGVkZ2UKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBFZGdlIHNob3dpbmcgdGhlIGNvbnRyb2wgZGVwZW5kZW5jeSBiZXR3ZWVuIG9wZXJhdGlvbnMuCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJpY29uIiBoZWlnaHQ9IjE1cHgiIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxNSAxNSI+CiAgICAgICAgICAgICAgICAgIDxkZWZzPgogICAgICAgICAgICAgICAgICAgIDxtYXJrZXIgaWQ9InJlZmVyZW5jZS1hcnJvd2hlYWQtbGVnZW5kIiBmaWxsPSIjRkZCNzREIiBtYXJrZXJ3aWR0aD0iMTAiIG1hcmtlcmhlaWdodD0iMTAiIHJlZng9IjkiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIgLz4KICAgICAgICAgICAgICAgICAgICA8L21hcmtlcj4KICAgICAgICAgICAgICAgICAgPC9kZWZzPgogICAgICAgICAgICAgICAgICA8cGF0aCBtYXJrZXItZW5kPSJ1cmwoI3JlZmVyZW5jZS1hcnJvd2hlYWQtbGVnZW5kKSIgc3Ryb2tlPSIjRkZCNzREIiBkPSJNMiA5IGwgMjkgMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBSZWZlcmVuY2UgZWRnZQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIEVkZ2Ugc2hvd2luZyB0aGF0IHRoZSBvdXRnb2luZyBvcGVyYXRpb24gbm9kZSBjYW4gbXV0YXRlIHRoZQogICAgICAgICAgICAgICAgICAgIGluY29taW5nIHRlbnNvci4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWRpYWxvZyBpZD0iZXJyb3ItZGlhbG9nIiB3aXRoLWJhY2tkcm9wPjwvcGFwZXItZGlhbG9nPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhc2V0c1N0YXRlKF9kYXRhc2V0c0ZldGNoZWQsIF9kYXRhc2V0cywgJ0VNUFRZJyldXSI+CiAgICAgIDxkaXYgc3R5bGU9Im1heC13aWR0aDogNTQwcHg7IG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsiPgogICAgICAgIDxoMz5ObyBncmFwaCBkZWZpbml0aW9uIGZpbGVzIHdlcmUgZm91bmQuPC9oMz4KICAgICAgICA8cD4KICAgICAgICAgIFRvIHN0b3JlIGEgZ3JhcGgsIGNyZWF0ZSBhCiAgICAgICAgICA8Y29kZT50Zi5zdW1tYXJ5LkZpbGVXcml0ZXI8L2NvZGU+CiAgICAgICAgICBhbmQgcGFzcyB0aGUgZ3JhcGggZWl0aGVyIHZpYSB0aGUgY29uc3RydWN0b3IsIG9yIGJ5IGNhbGxpbmcgaXRzCiAgICAgICAgICA8Y29kZT5hZGRfZ3JhcGgoKTwvY29kZT4gbWV0aG9kLiBZb3UgbWF5IHdhbnQgdG8gY2hlY2sgb3V0IHRoZQogICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvZ3JhcGhfdml6Ij5ncmFwaCB2aXN1YWxpemVyIHR1dG9yaWFsPC9hPi4KICAgICAgICAKCiAgICAgICAgPHA+CiAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0byBhZGQKICAgICAgICAgIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgIAoKICAgICAgICA8cD4KICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgCiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFzZXRzU3RhdGUoZGF0YXNldHNGZXRjaGVkLCBfZGF0YXNldHMsICdQUkVTRU5UJyldXSI+CiAgICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICAgIDx0Zi1ncmFwaC1jb250cm9scyBpZD0iY29udHJvbHMiIGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIiBkZXZpY2VzLWZvci1zdGF0cz0ie3tfZGV2aWNlc0ZvclN0YXRzfX0iIGNvbG9yLWJ5LXBhcmFtcz0iW1tfY29sb3JCeVBhcmFtc11dIiBzdGF0cz0iW1tfc3RhdHNdXSIgY29sb3ItYnk9Int7X2NvbG9yQnl9fSIgZGF0YXNldHM9IltbX2RhdGFzZXRzXV0iIHJlbmRlci1oaWVyYXJjaHk9IltbX3JlbmRlckhpZXJhcmNoeV1dIiBzZWxlY3Rpb249Int7X3NlbGVjdGlvbn19IiBzZWxlY3RlZC1maWxlPSJ7e19zZWxlY3RlZEZpbGV9fSIgc2VsZWN0ZWQtbm9kZT0ie3tfc2VsZWN0ZWROb2RlfX0iIGhlYWx0aC1waWxscy1mZWF0dXJlLWVuYWJsZWQ9IltbX2RlYnVnZ2VyRGF0YUVuYWJsZWRdXSIgaGVhbHRoLXBpbGxzLXRvZ2dsZWQtb249Int7aGVhbHRoUGlsbHNUb2dnbGVkT259fSIgb24tZml0LXRhcD0iX2ZpdCIgdHJhY2UtaW5wdXRzPSJ7e190cmFjZUlucHV0c319Ij48L3RmLWdyYXBoLWNvbnRyb2xzPgogICAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICAgIDx0Zi1ncmFwaC1kYXNoYm9hcmQtbG9hZGVyIGlkPSJsb2FkZXIiIGRhdGFzZXRzPSJbW19kYXRhc2V0c11dIiBzZWxlY3Rpb249IltbX3NlbGVjdGlvbl1dIiBzZWxlY3RlZC1maWxlPSJbW19zZWxlY3RlZEZpbGVdXSIgb3V0LWdyYXBoLWhpZXJhcmNoeT0ie3tfZ3JhcGhIaWVyYXJjaHl9fSIgb3V0LWdyYXBoPSJ7e19ncmFwaH19IiBvdXQtc3RhdHM9Int7X3N0YXRzfX0iIHByb2dyZXNzPSJ7e19wcm9ncmVzc319IiBoaWVyYXJjaHktcGFyYW1zPSJbW19oaWVyYXJjaHlQYXJhbXNdXSIgY29tcGF0aWJpbGl0eS1wcm92aWRlcj0iW1tfY29tcGF0aWJpbGl0eVByb3ZpZGVyXV0iPjwvdGYtZ3JhcGgtZGFzaGJvYXJkLWxvYWRlcj4KICAgICAgICAgIDx0Zi1ncmFwaC1ib2FyZCBpZD0iZ3JhcGhib2FyZCIgZGV2aWNlcy1mb3Itc3RhdHM9IltbX2RldmljZXNGb3JTdGF0c11dIiBjb2xvci1ieT0iW1tfY29sb3JCeV1dIiBjb2xvci1ieS1wYXJhbXM9Int7X2NvbG9yQnlQYXJhbXN9fSIgZ3JhcGgtaGllcmFyY2h5PSJbW19ncmFwaEhpZXJhcmNoeV1dIiBncmFwaD0iW1tfZ3JhcGhdXSIgaGllcmFyY2h5LXBhcmFtcz0iW1tfaGllcmFyY2h5UGFyYW1zXV0iIHByb2dyZXNzPSJbW19wcm9ncmVzc11dIiBkZWJ1Z2dlci1kYXRhLWVuYWJsZWQ9IltbX2RlYnVnZ2VyRGF0YUVuYWJsZWRdXSIgYXJlLWhlYWx0aC1waWxscy1sb2FkaW5nPSJbW19hcmVIZWFsdGhQaWxsc0xvYWRpbmddXSIgZGVidWdnZXItbnVtZXJpYy1hbGVydHM9IltbX2RlYnVnZ2VyTnVtZXJpY0FsZXJ0c11dIiBub2RlLW5hbWVzLXRvLWhlYWx0aC1waWxscz0iW1tfbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIiBhbGwtc3RlcHMtbW9kZS1lbmFibGVkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSIgc3BlY2lmaWMtaGVhbHRoLXBpbGwtc3RlcD0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9IltbX2hlYWx0aFBpbGxTdGVwSW5kZXhdXSIgcmVuZGVyLWhpZXJhcmNoeT0ie3tfcmVuZGVySGllcmFyY2h5fX0iIHNlbGVjdGVkLW5vZGU9Int7X3NlbGVjdGVkTm9kZX19IiBzdGF0cz0iW1tfc3RhdHNdXSIgdHJhY2UtaW5wdXRzPSJbW190cmFjZUlucHV0c11dIj48L3RmLWdyYXBoLWJvYXJkPgogICAgICAgIDwvZGl2PgogICAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCAvZGVlcC8gewogICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvJywgc2Fucy1zZXJpZjsKICAgICAgfQoKICAgICAgLnNpZGViYXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAuY2VudGVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICBwYXBlci1kaWFsb2cgewogICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idnotZGlzdHJpYnV0aW9uLWNoYXJ0Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGxvdHRhYmxlLXN0eWxlIj48L3N0eWxlPgogICAgPGRpdiBpZD0iY2hhcnRkaXYiPjwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgICNjaGFydGRpdiB7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1kaXN0cmlidXRpb24tbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgcnVuPSJbW3J1bl1dIiBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSIgY29sb3I9IltbX3J1bkNvbG9yXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgCiAgICA8dnotZGlzdHJpYnV0aW9uLWNoYXJ0IGlkPSJjaGFydCIgeC10eXBlPSJbW3hUeXBlXV0iIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlXV0iPjwvdnotZGlzdHJpYnV0aW9uLWNoYXJ0PgogICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IHJvdzsiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHdpZHRoOiAzMzBweDsKICAgICAgICBoZWlnaHQ6IDIzNXB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDcwMHB4OwogICAgICAgIGhlaWdodDogNTAwcHg7CiAgICAgIH0KCiAgICAgIHZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIHsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICB0Zi1jYXJkLWhlYWRpbmcgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ4VHlwZVNlbGVjdG9yIiBuYW1lPSJIb3Jpem9udGFsIGF4aXMiIHNlbGVjdGVkLWlkPSJ7e194VHlwZX19Ij4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBkaXN0cmlidXRpb24gZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgWW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBoaXN0b2dyYW0gZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLgogICAgICAgICAgICAgICAgKEhpc3RvZ3JhbXMgYW5kIGRpc3RyaWJ1dGlvbnMgYm90aCB1c2UgdGhlIGhpc3RvZ3JhbSBzdW1tYXJ5CiAgICAgICAgICAgICAgICBvcGVyYXRpb24uKQogICAgICAgICAgICAgIDwvbGk+CgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICAKICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIiBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLWRpc3RyaWJ1dGlvbi1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiBydW49IltbaXRlbS5ydW5dXSIgdGFnPSJbW2l0ZW0udGFnXV0iIHRhZy1tZXRhZGF0YT0iW1tfdGFnTWV0YWRhdGEoX3J1blRvVGFnSW5mbywgaXRlbS5ydW4sIGl0ZW0udGFnKV1dIiB4LXR5cGU9IltbX3hUeXBlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSI+PC90Zi1kaXN0cmlidXRpb24tbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idnotaGlzdG9ncmFtLXRpbWVzZXJpZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9InRvb2x0aXAiPjxzcGFuPjwvc3Bhbj48L2Rpdj4KICAgIDxzdmcgaWQ9InN2ZyI+CiAgICAgIDxnPgogICAgICAgIDxnIGNsYXNzPSJheGlzIHgiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0iYXhpcyB5Ij48L2c+CiAgICAgICAgPGcgY2xhc3M9ImF4aXMgeSBzbGljZSI+PC9nPgogICAgICAgIDxnIGNsYXNzPSJzdGFnZSI+CiAgICAgICAgICA8cmVjdCBjbGFzcz0iYmFja2dyb3VuZCI+PC9yZWN0PgogICAgICAgIDwvZz4KICAgICAgICA8ZyBjbGFzcz0ieC1heGlzLWhvdmVyIj48L2c+CiAgICAgICAgPGcgY2xhc3M9InktYXhpcy1ob3ZlciI+PC9nPgogICAgICAgIDxnIGNsYXNzPSJ5LXNsaWNlLWF4aXMtaG92ZXIiPjwvZz4KICAgICAgPC9nPgogICAgPC9zdmc+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIHN2ZyB7CiAgICAgICAgZm9udC1mYW1pbHk6IHJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgIH0KCiAgICAgICN0b29sdGlwIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgIH0KCiAgICAgIC5iYWNrZ3JvdW5kIHsKICAgICAgICBmaWxsLW9wYWNpdHk6IDA7CiAgICAgICAgZmlsbDogcmVkOwogICAgICB9CgogICAgICAuaGlzdG9ncmFtIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLmhvdmVyIHsKICAgICAgICBmb250LXNpemU6IDlweDsKICAgICAgICBkb21pbmFudC1iYXNlbGluZTogbWlkZGxlOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC5ob3ZlciBjaXJjbGUgewogICAgICAgIHN0cm9rZTogd2hpdGU7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuNTsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQoKICAgICAgLmhvdmVyIHRleHQgewogICAgICAgIGZpbGw6IGJsYWNrOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC5ob3Zlci5ob3Zlci1jbG9zZXN0IGNpcmNsZSB7CiAgICAgICAgZmlsbDogYmxhY2sgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLmhvdmVyLmhvdmVyLWNsb3Nlc3QgdGV4dCB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmJhc2VsaW5lIHsKICAgICAgICBzdHJva2U6IGJsYWNrOwogICAgICAgIHN0cm9rZS1vcGFjaXR5OiAwLjE7CiAgICAgIH0KCiAgICAgIC5vdXRsaW5lIHsKICAgICAgICBmaWxsOiBub25lOwogICAgICAgIHN0cm9rZTogd2hpdGU7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuNTsKICAgICAgfQoKICAgICAgLm91dGxpbmUub3V0bGluZS1ob3ZlciB7CiAgICAgICAgc3Ryb2tlOiBibGFjayAhaW1wb3J0YW50OwogICAgICAgIHN0cm9rZS1vcGFjaXR5OiAxOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyLAogICAgICAueS1heGlzLWhvdmVyLAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLngtYXhpcy1ob3ZlciAubGFiZWwsCiAgICAgIC55LWF4aXMtaG92ZXIgLmxhYmVsLAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIC5sYWJlbCB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgdGV4dC1hbmNob3I6IGVuZDsKICAgICAgfQoKICAgICAgLngtYXhpcy1ob3ZlciB0ZXh0IHsKICAgICAgICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogICAgICB9CgogICAgICAueS1heGlzLWhvdmVyIHRleHQsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgdGV4dCB7CiAgICAgICAgdGV4dC1hbmNob3I6IHN0YXJ0OwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIGxpbmUsCiAgICAgIC55LWF4aXMtaG92ZXIgbGluZSwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciBsaW5lIHsKICAgICAgICBzdHJva2U6IGJsYWNrOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIHJlY3QsCiAgICAgIC55LWF4aXMtaG92ZXIgcmVjdCwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciByZWN0IHsKICAgICAgICBmaWxsOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLmF4aXMgewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgfQoKICAgICAgLmF4aXMgcGF0aC5kb21haW4gewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5heGlzIC50aWNrIGxpbmUgewogICAgICAgIHN0cm9rZTogI2RkZDsKICAgICAgfQoKICAgICAgLmF4aXMuc2xpY2UgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC5heGlzLnNsaWNlIC50aWNrIGxpbmUgewogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDI7CiAgICAgIH0KCiAgICAgIC5zbWFsbCAuYXhpcyB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIC5zbWFsbCAuYXhpcyAudGljazpmaXJzdC1vZi10eXBlIHRleHQgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5zbWFsbCAuYXhpcyAudGljazpsYXN0LW9mLXR5cGUgdGV4dCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLm1lZGl1bSAuYXhpcyB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIC5tZWRpdW0gLmF4aXMgLnRpY2s6bnRoLWNoaWxkKDJuICsgMSkgdGV4dCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLmxhcmdlIC5heGlzIHRleHQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLmxhcmdlIC5heGlzIC50aWNrOm50aC1jaGlsZCgybiArIDEpIHRleHQgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaGlzdG9ncmFtLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyB0YWc9IltbdGFnXV0iIHJ1bj0iW1tydW5dXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iIGNvbG9yPSJbW19ydW5Db2xvcl1dIj48L3RmLWNhcmQtaGVhZGluZz4KICAgIAogICAgPHZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIGlkPSJjaGFydCIgdGltZS1wcm9wZXJ0eT0iW1t0aW1lUHJvcGVydHldXSIgbW9kZT0iW1toaXN0b2dyYW1Nb2RlXV0iIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlRnVuY3Rpb25dXSI+PC92ei1oaXN0b2dyYW0tdGltZXNlcmllcz4KICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiByb3c7Ij4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIgaWNvbj0iZnVsbHNjcmVlbiIgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB3aWR0aDogMzMwcHg7CiAgICAgICAgaGVpZ2h0OiAyMzVweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDsKICAgICAgfQogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgewogICAgICAgIHdpZHRoOiA3MDBweDsKICAgICAgICBoZWlnaHQ6IDUwMHB4OwogICAgICB9CgogICAgICB2ei1oaXN0b2dyYW0tdGltZXNlcmllcyB7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uW3NlbGVjdGVkXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgfQoKICAgICAgdGYtY2FyZC1oZWFkaW5nIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICAgIHdpZHRoOiA5MCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaGlzdG9ncmFtLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9Imhpc3RvZ3JhbU1vZGVTZWxlY3RvciIgbmFtZT0iSGlzdG9ncmFtIG1vZGUiIHNlbGVjdGVkLWlkPSJ7e19oaXN0b2dyYW1Nb2RlfX0iPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJvdmVybGF5Ij5vdmVybGF5PC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9Im9mZnNldCI+b2Zmc2V0PC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLW9wdGlvbi1zZWxlY3RvciBpZD0idGltZVByb3BlcnR5U2VsZWN0b3IiIG5hbWU9Ik9mZnNldCB0aW1lIGF4aXMiIHNlbGVjdGVkLWlkPSJ7e190aW1lUHJvcGVydHl9fSI+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InN0ZXAiPnN0ZXA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0icmVsYXRpdmUiPnJlbGF0aXZlPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9IndhbGxfdGltZSI+d2FsbDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPC90Zi1vcHRpb24tc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBoaXN0b2dyYW0gZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgWW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBoaXN0b2dyYW0gZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLgogICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtaGlzdG9ncmFtLWxvYWRlciBydW49IltbaXRlbS5ydW5dXSIgdGFnPSJbW2l0ZW0udGFnXV0iIGFjdGl2ZT0iW1thY3RpdmVdXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iIHRpbWUtcHJvcGVydHk9IltbX3RpbWVQcm9wZXJ0eV1dIiBoaXN0b2dyYW0tbW9kZT0iW1tfaGlzdG9ncmFtTW9kZV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iPjwvdGYtaGlzdG9ncmFtLWxvYWRlcj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi10ZXh0LWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyBydW49IltbcnVuXV0iIHRhZz0iW1t0YWddXSIgY29sb3I9IltbX3J1bkNvbG9yXV0iPgogICAgPC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8cGFwZXItbWF0ZXJpYWwgZWxldmF0aW9uPSIxIiBpZD0ic3RlcHMtY29udGFpbmVyIiBjbGFzcz0iY29udGFpbmVyIHNjcm9sbGJhciIgc3R5bGU9ImJvcmRlci1jb2xvcjogW1tfcnVuQ29sb3JdXSI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3RleHRzXV0iPgogICAgICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGNsYXNzPSJzdGVwLWNvbnRhaW5lciI+CiAgICAgICAgICBzdGVwIDxzcGFuIGNsYXNzPSJzdGVwLXZhbHVlIj5bW19mb3JtYXRTdGVwKGl0ZW0uc3RlcCldXTwvc3Bhbj4KICAgICAgICA8L3BhcGVyLW1hdGVyaWFsPgogICAgICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGNsYXNzPSJ0ZXh0Ij4KICAgICAgICAgIDx0Zi1tYXJrZG93bi12aWV3IGh0bWw9IltbaXRlbS50ZXh0XV0iPjwvdGYtbWFya2Rvd24tdmlldz4KICAgICAgICA8L3BhcGVyLW1hdGVyaWFsPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9wYXBlci1tYXRlcmlhbD4KICAgIDxzdHlsZSBpbmNsdWRlPSJzY3JvbGxiYXItc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICAgIC5zY3JvbGxiYXIgewogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KICAgICAgI3N0ZXBzLWNvbnRhaW5lciB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIC8qIGNvbG9yIGNvbXB1dGVkIGFuZCBzZXQgYXMgaW5saW5lIHN0eWxlICovOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1heC1oZWlnaHQ6IDUwMHB4OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IDEwcHg7CiAgICAgIH0KICAgICAgLnRleHQgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDAgM3B4IDNweCAzcHg7CiAgICAgICAgcGFkZGluZzogNXB4OwogICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgICAgLnN0ZXAtY29udGFpbmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICAgIGJvcmRlci1ib3R0b206IG5vbmU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4IDNweCAwIDA7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgICBtYXJnaW4tbGVmdDogLTFweDsgLyogdG8gY29ycmVjdCBmb3IgYm9yZGVyICovCiAgICAgICAgcGFkZGluZzogM3B4OwogICAgICB9CiAgICAgIC5zdGVwLWNvbnRhaW5lcjpub3QoOmZpcnN0LWNoaWxkKSB7CiAgICAgICAgbWFyZ2luLXRvcDogMTVweDsKICAgICAgfQoKICAgICAgdGYtY2FyZC1oZWFkaW5nIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXRleHQtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyB0ZXh0IGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IHRleHQgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtdGV4dC1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiB0YWc9IltbaXRlbS50YWddXSIgcnVuPSJbW2l0ZW0ucnVuXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSI+PC90Zi10ZXh0LWxvYWRlcj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1wci1jdXJ2ZS1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgoKICAgIDx0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIHgtY29tcG9uZW50cy1jcmVhdGlvbi1tZXRob2Q9IltbX3hDb21wb25lbnRzQ3JlYXRpb25NZXRob2RdXSIgeS12YWx1ZS1hY2Nlc3Nvcj0iW1tfeVZhbHVlQWNjZXNzb3JdXSIgdG9vbHRpcC1jb2x1bW5zPSJbW190b29sdGlwQ29sdW1uc11dIiBjb2xvci1zY2FsZT0iW1tfY29sb3JTY2FsZUZ1bmN0aW9uXV0iIGRlZmF1bHQteC1yYW5nZT0iW1tfZGVmYXVsdFhSYW5nZV1dIiBkZWZhdWx0LXktcmFuZ2U9IltbX2RlZmF1bHRZUmFuZ2VdXSIgc21vb3RoaW5nLWVuYWJsZWQ9IltbX3Ntb290aGluZ0VuYWJsZWRdXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW3JlcXVlc3RNYW5hZ2VyXV0iIGRhdGEtdG8tbG9hZD0iW1tydW5zXV0iIGRhdGEtc2VyaWVzPSJbW3J1bnNdXSIgbG9hZC1rZXk9IltbdGFnXV0iIGdldC1kYXRhLWxvYWQtdXJsPSJbW19kYXRhVXJsXV0iIGxvYWQtZGF0YS1jYWxsYmFjaz0iW1tfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpXV0iIGFjdGl2ZT0iW1thY3RpdmVdXSI+PC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgoKICAgIDxkaXYgaWQ9ImJ1dHRvbnMtcm93Ij4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIgaWNvbj0iZnVsbHNjcmVlbiIgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncy1vdmVyc2NhbiIgb24tdGFwPSJfcmVzZXREb21haW4iIHRpdGxlPSJSZXNldCBheGVzIHRvIFswLCAxXS4iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJzdGVwLWxlZ2VuZCI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3J1bnNXaXRoU3RlcEF2YWlsYWJsZV1dIiBhcz0icnVuIj4KICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWJveCIgc3R5bGU9ImJhY2tncm91bmQ6IFtbX2NvbXB1dGVSdW5Db2xvcihydW4pXV07Ij48L2Rpdj4KICAgICAgICAgIFtbcnVuXV0gaXMgYXQKICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGVwLWxhYmVsLXRleHQiPgogICAgICAgICAgICBzdGVwIFtbX2NvbXB1dGVDdXJyZW50U3RlcEZvclJ1bihfcnVuVG9QckN1cnZlRW50cnksIHJ1bildXSA8L3NwYW4+PGJyPgogICAgICAgICAgPHNwYW4gY2xhc3M9IndhbGwtdGltZS1sYWJlbC10ZXh0Ij4KICAgICAgICAgICAgKFtbX2NvbXB1dGVDdXJyZW50V2FsbFRpbWVGb3JSdW4oX3J1blRvUHJDdXJ2ZUVudHJ5LCBydW4pXV0pCiAgICAgICAgICA8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgd2lkdGg6IDUwMHB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNXB4OwogICAgICB9CiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciB7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIgewogICAgICAgIGhlaWdodDogNjAwcHg7CiAgICAgIH0KICAgICAgI2J1dHRvbnMtcm93IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KICAgICAgI2J1dHRvbnMtcm93IHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KICAgICAgI2J1dHRvbnMtcm93IHBhcGVyLWljb24tYnV0dG9uW3NlbGVjdGVkXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgfQogICAgICAjc3RlcC1sZWdlbmQgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZm9udC1zaXplOiAwLjhlbTsKICAgICAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IDAgMCAwIDEwcHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLmxlZ2VuZC1yb3cgewogICAgICAgIG1hcmdpbjogNXB4IDAgNXB4IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLmNvbG9yLWJveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDFweDsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgICBoZWlnaHQ6IDEwcHg7CiAgICAgIH0KICAgICAgLnN0ZXAtbGFiZWwtdGV4dCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLndhbGwtdGltZS1sYWJlbC10ZXh0IHsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgICBmb250LXNpemU6IDAuOGVtOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3IiPgogIDx0ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3J1bnNXaXRoU2xpZGVyc11dIiBhcz0icnVuIj4KICAgICAgPGRpdiBjbGFzcz0icnVuLXdpZGdldCI+CiAgICAgICAgPGRpdiBjbGFzcz0icnVuLWRpc3BsYXktY29udGFpbmVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InJ1bi1jb2xvci1ib3giIHN0eWxlPSJiYWNrZ3JvdW5kOltbX2NvbXB1dGVDb2xvckZvclJ1bihydW4pXV07Ij48L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InJ1bi10ZXh0Ij4KICAgICAgICAgICAgW1tydW5dXQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic3RlcC1kaXNwbGF5LWNvbnRhaW5lciI+CiAgICAgICAgICBbW19jb21wdXRlVGltZVRleHRGb3JSdW4ocnVuVG9BdmFpbGFibGVUaW1lRW50cmllcywgX3J1blRvU3RlcEluZGV4LAogICAgICAgICAgcnVuLCB0aW1lRGlzcGxheVR5cGUpXV0KICAgICAgICA8L2Rpdj4KICAgICAgICA8cGFwZXItc2xpZGVyIGRhdGEtcnVuJD0iW1tydW5dXSIgc3RlcD0iMSIgdHlwZT0ibnVtYmVyIiBtaW49IjAiIG1heD0iW1tfY29tcHV0ZU1heFN0ZXBJbmRleEZvclJ1bihydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzLCBydW4pXV0iIHZhbHVlPSJbW19nZXRTdGVwKF9ydW5Ub1N0ZXBJbmRleCwgcnVuKV1dIiBvbi1pbW1lZGlhdGUtdmFsdWUtY2hhbmdlZD0iX3NsaWRlclZhbHVlQ2hhbmdlZCI+PC9wYXBlci1zbGlkZXI+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLnJ1bi13aWRnZXQgewogICAgICAgIG1hcmdpbjogMTBweCAwIDAgMDsKICAgICAgfQogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIG1hcmdpbjogLThweCAwIDAgLTE1cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLnN0ZXAtZGlzcGxheS1jb250YWluZXIgewogICAgICAgIGZvbnQtc2l6ZTogMC45ZW07CiAgICAgICAgbWFyZ2luOiAwIDE1cHggMCAwOwogICAgICB9CiAgICAgIC5ydW4tdGV4dCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIC5ydW4tY29sb3ItYm94IHsKICAgICAgICB3aWR0aDogMTJweDsKICAgICAgICBoZWlnaHQ6IDEycHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1wci1jdXJ2ZS1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLW9wdGlvbi1zZWxlY3RvciBpZD0idGltZS10eXBlLXNlbGVjdG9yIiBuYW1lPSJUaW1lIERpc3BsYXkgVHlwZSIgc2VsZWN0ZWQtaWQ9Int7X3RpbWVEaXNwbGF5VHlwZX19Ij4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPjxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPjxwYXBlci1idXR0b24gaWQ9IndhbGxfdGltZSI+d2FsbDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPC90Zi1vcHRpb24tc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19ydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIiBpZD0ic3RlcHMtc2VsZWN0b3ItY29udGFpbmVyIj4KICAgICAgICAgICAgPHRmLXByLWN1cnZlLXN0ZXBzLXNlbGVjdG9yIHJ1bnM9IltbX3JlbGV2YW50U2VsZWN0ZWRSdW5zXV0iIHJ1bi10by1zdGVwPSJ7e19ydW5Ub1N0ZXB9fSIgcnVuLXRvLWF2YWlsYWJsZS10aW1lLWVudHJpZXM9IltbX3J1blRvQXZhaWxhYmxlVGltZUVudHJpZXNdXSIgdGltZS1kaXNwbGF5LXR5cGU9IltbX3RpbWVEaXNwbGF5VHlwZV1dIj48L3RmLXByLWN1cnZlLXN0ZXBzLXNlbGVjdG9yPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHByZWNpc2lvbuKAk3JlY2FsbCBjdXJ2ZSBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IHByZWNpc2lvbuKAk3JlY2FsbCBkYXRhIHRvIHlvdXIgZXZlbnQKICAgICAgICAgICAgICAgIGZpbGVzLgogICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgVGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICAKICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIiBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSIgZ2V0LWNhdGVnb3J5LWl0ZW0ta2V5PSJbW19nZXRDYXRlZ29yeUl0ZW1LZXldXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLXByLWN1cnZlLWNhcmQgYWN0aXZlPSJbW2FjdGl2ZV1dIiBydW5zPSJbW2l0ZW0ucnVuc11dIiB0YWc9IltbaXRlbS50YWddXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1bnMsIGl0ZW0udGFnKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIHJ1bi10by1zdGVwLWNhcD0iW1tfcnVuVG9TdGVwXV0iPjwvdGYtcHItY3VydmUtY2FyZD4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICAvKiogRG8gbm90IGxldCB0aGUgc3RlcHMgc2VsZWN0b3Igb2NjbHVkZSB0aGUgcnVuIHNlbGVjdG9yLiAqLwogICAgICAjc3RlcHMtc2VsZWN0b3ItY29udGFpbmVyIHsKICAgICAgICBtYXgtaGVpZ2h0OiA0MCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItc3Bpbm5lciI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItc3Bpbm5lci1zdHlsZXMiPjwvc3R5bGU+CgogICAgPGRpdiBpZD0ic3Bpbm5lckNvbnRhaW5lciIgY2xhc3MtbmFtZT0iW1tfX2NvbXB1dGVDb250YWluZXJDbGFzc2VzKGFjdGl2ZSwgX19jb29saW5nRG93bildXSIgb24tYW5pbWF0aW9uZW5kPSJfX3Jlc2V0IiBvbi13ZWJraXQtYW5pbWF0aW9uLWVuZD0iX19yZXNldCI+CiAgICAgIDxkaXYgY2xhc3M9InNwaW5uZXItbGF5ZXIgbGF5ZXItMSI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgbGVmdCI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgcmlnaHQiPjwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9InNwaW5uZXItbGF5ZXIgbGF5ZXItMiI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgbGVmdCI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgcmlnaHQiPjwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9InNwaW5uZXItbGF5ZXIgbGF5ZXItMyI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgbGVmdCI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgcmlnaHQiPjwvZGl2PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9InNwaW5uZXItbGF5ZXIgbGF5ZXItNCI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgbGVmdCI+PC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgcmlnaHQiPjwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9ImlucHV0LXBpcGVsaW5lLWFuYWx5emVyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGxvdHRhYmxlLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAuc2VjdGlvbi1oZWFkZXIgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMjAwJTsKICAgICAgfQogICAgICAuc3ViLXNlY3Rpb24taGVhZGVyIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBmb250LXNpemU6IDE1MCU7CiAgICAgIH0KICAgICAgI3N1bW1hcnktaG9zdCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLmhpZ2hsaWdodGVkLXRleHQgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMTIwJTsKICAgICAgfQogICAgICAuc3RkZGV2LXRleHQgewogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgICBvcGFjaXR5OiAwLjc7CiAgICAgIH0KICAgICAgLmxlZnQtcGFuZSB7CiAgICAgICAgd2lkdGg6IDMwJTsKICAgICAgfQogICAgICAucmlnaHQtcGFuZSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgfQogICAgICAudGFibGUtc3R5bGUgewogICAgICAgIHRhYmxlLWxheW91dDogZml4ZWQ7CiAgICAgICAgd2lkdGg6IDk1JTsKICAgICAgfQogICAgICAucGVyZm9ybWFuY2UtdGFibGUgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICAgIC54LWF4aXMtdGl0bGUgewogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTsKICAgICAgfQogICAgICAueS1heGlzLXRpdGxlIHsKICAgICAgICB3cml0aW5nLW1vZGU6IGJ0LXJsOwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7CiAgICAgIH0KICAgICAgI3JlY29tbWVuZGF0aW9uX2RldGFpbHMgewogICAgICAgIGNvbG9yOiBncmVlbjsKICAgICAgfQogICAgICAjcmVjb21tZW5kYXRpb25fZGV0YWlscyBhIHsKICAgICAgICBjb2xvcjogI2ZmMzNjYzsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQogICAgICAjc3VtbWFyeV9jb25jbHVzaW9uIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZGVyOwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgICBjb2xvcjogdmFyKC0tc3VtbWFyeS1jb2xvciwgZ3JlZW4pOwogICAgICB9CiAgICAgICNzdW1tYXJ5X25leHRzdGVwIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZGVyOwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgICBjb2xvcjogZ3JlZW47CiAgICAgIH0KICAgICAgI3JlY29tbWVuZGF0aW9uX3RpdGxlIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZGVyOwogICAgICAgIGZvbnQtc3R5bGU6IG5vcm1hbDsKICAgICAgICBjb2xvcjogYmxhY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2PgogICAgICA8ZGl2IGlkPSJzZWN0aW9uX3N1bW1hcnkiPgogICAgICAgIDxkaXYgaWQ9InRpdGxlX3N1bW1hcnkiPgogICAgICAgICAgPHAgY2xhc3M9InNlY3Rpb24taGVhZGVyIj4KICAgICAgICAgICAgU2VjdGlvbiAxOiBTdW1tYXJ5IG9mIGlucHV0LXBpcGVsaW5lIGFuYWx5c2lzCiAgICAgICAgICAKICAgICAgICA8L2Rpdj4KICAgICAgICA8cD48c3BhbiBpZD0ic3VtbWFyeV9jb25jbHVzaW9uIj5bW19zdW1tYXJ5X2NvbmNsdXNpb25dXTwvc3Bhbj4KICAgICAgICA8cD4KICAgICAgICAgIDxzcGFuIGlkPSJyZWNvbW1lbmRhdGlvbl90aXRsZSI+UmVjb21tZW5kYXRpb24gZm9yIG5leHQgc3RlcDogPC9zcGFuPjxzcGFuIGlkPSJzdW1tYXJ5X25leHRzdGVwIj5bW19zdW1tYXJ5X25leHRzdGVwXV08L3NwYW4+CiAgICAgICAgCiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGlkPSJzZWN0aW9uX2RldmljZV9zaWRlX2FuYWx5c2lzIiBoaWRkZW49IltbIV9zaG93X2RldmljZV9zaWRlX2FuYWx5c2lzXV0iPgogICAgICAgIDxkaXYgaWQ9InRpdGxlX2RldmljZV9zaWRlX2FuYWx5c2lzIj4KICAgICAgICAgIDxwIGNsYXNzPSJzZWN0aW9uLWhlYWRlciI+U2VjdGlvbiAyOiBEZXZpY2Utc2lkZSBhbmFseXNpcyBkZXRhaWxzCiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0ic2VjdGlvbl9kZXZpY2Vfc3RlcF90aW1lIj4KICAgICAgICAgIDxkaXYgaWQ9InRpdGxlX2RldmljZV9zdGVwX3RpbWUiPgogICAgICAgICAgICA8cCBjbGFzcz0ic3ViLXNlY3Rpb24taGVhZGVyIj5TZWN0aW9uIDIuMTogRGV2aWNlIHN0ZXAgdGltZQogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8dGFibGUgY2xhc3M9InRhYmxlLXN0eWxlIj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZCBjbGFzcz0ibGVmdC1wYW5lIj4KICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJoaWdobGlnaHRlZC10ZXh0Ij4KICAgICAgICAgICAgICAgICAgICBEZXZpY2Ugc3RlcC10aW1lIHN0YXRpc3RpY3MgKGluIG1zKQogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgIDxzcGFuPjxiPkF2ZXJhZ2U6PC9iPiA8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxzcGFuPltbX3N0ZXB0aW1lX21zX2F2ZXJhZ2VdXSBtcyA8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzdGRkZXYtdGV4dCI+KM+DID0gW1tfc3RlcHRpbWVfbXNfc3RkZGV2XV0gbXMpPC9zcGFuPgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICAgPHNwYW4+PGI+UmFuZ2U6PC9iPiA8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxzcGFuPltbX3N0ZXB0aW1lX21zX21pbmltdW1dXSAtIFtbX3N0ZXB0aW1lX21zX21heGltdW1dXQogICAgICAgICAgICAgICAgICAgIG1zPC9zcGFuPgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz0ieS1heGlzLXRpdGxlIj5taWxsaXNlY29uZHM8L2Rpdj48L3RkPgogICAgICAgICAgICAgIDx0ZCBjbGFzcz0icmlnaHQtcGFuZSI+CiAgICAgICAgICAgICAgICA8dnotbGluZS1jaGFydDIgaWQ9ImRldmljZV9zdGVwX2NoYXJ0IiBzdHlsZT0iaGVpZ2h0OjMwMHB4OyI+PC92ei1saW5lLWNoYXJ0Mj4KICAgICAgICAgICAgICAgIDxkaXY+PHAgY2xhc3M9IngtYXhpcy10aXRsZSI+dHJhaW5pbmcgc3RlcCBudW1iZXI8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJzZWN0aW9uX2RldmljZV9pbmZlZWRkZXFfdGltZSI+CiAgICAgICAgICA8ZGl2IGlkPSJ0aXRsZV9kZXZpY2VfaW5mZWVkZGVxX3RpbWUiPgogICAgICAgICAgICA8cCBjbGFzcz0ic3ViLXNlY3Rpb24taGVhZGVyIj4KICAgICAgICAgICAgICA8c3Bhbj5TZWN0aW9uIDIuMjogUmFuZ2Ugb2YgZGV2aWNlIHRpbWUgd2FpdGluZyBmb3IgaW5wdXQgZGF0YQogICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICA8c3Bhbj48aSBzdHlsZT0ib3BhY2l0eTowLjUiPmFjcm9zcyBjb3JlczwvaT4gYXQgZWFjaCBzdGVwIDwvc3Bhbj4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0YWJsZSBjbGFzcz0idGFibGUtc3R5bGUiPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJsZWZ0LXBhbmUiPgogICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJoaWdobGlnaHRlZC10ZXh0Ij4lIG9mIGRldmljZSBzdGVwIHRpbWUgd2FpdGluZyBmb3IgaW5wdXQgZGF0YTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHNwYW4+CiAgICAgICAgICAgICAgICAgICAgKGF2ZXJhZ2Ugb3ZlciB0aGUgbWF4aW11bSB3YWl0aW5nIHRpbWUgYWNyb3NzIGNvcmVzIGF0IGVhY2gKICAgICAgICAgICAgICAgICAgICBzdGVwKTwvc3Bhbj4KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgIDxzcGFuPjxiPkF2ZXJhZ2U6PC9iPiA8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxzcGFuPltbX2luZmVlZF9wZXJjZW50X2F2ZXJhZ2VdXSAlIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InN0ZGRldi10ZXh0Ij4oz4MgPSBbW19pbmZlZWRfcGVyY2VudF9zdGRkZXZdXSAlKTwvc3Bhbj4KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgIDxzcGFuPjxiPlJhbmdlOjwvYj4gPC9zcGFuPgogICAgICAgICAgICAgICAgICA8c3Bhbj5bW19pbmZlZWRfcGVyY2VudF9taW5pbXVtXV0gLSBbW19pbmZlZWRfcGVyY2VudF9tYXhpbXVtXV0KICAgICAgICAgICAgICAgICAgICAlPC9zcGFuPgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ5LWF4aXMtdGl0bGUiPjxwPiUgb2YgZGV2aWNlIHN0ZXAgdGltZTwvZGl2PgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkIGNsYXNzPSJyaWdodC1wYW5lIj4KICAgICAgICAgICAgICAgIDx2ei1saW5lLWNoYXJ0MiBpZD0iZGV2aWNlX2luZmVlZF9jaGFydCIgc3R5bGU9ImhlaWdodDozMDBweDsiPjwvdnotbGluZS1jaGFydDI+CiAgICAgICAgICAgICAgICA8ZGl2PjxwIGNsYXNzPSJ4LWF4aXMtdGl0bGUiPnRyYWluaW5nIHN0ZXAgbnVtYmVyPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGlkPSJzZWN0aW9uX2hvc3Rfc2lkZV9hbmFseXNpcyI+CiAgICAgICAgPGRpdiBpZD0idGl0bGVfaG9zdF9zaWRlX2FuYWx5c2lzIj4KICAgICAgICAgIDxwIGNsYXNzPSJzZWN0aW9uLWhlYWRlciI+U2VjdGlvbiAzOiBIb3N0LXNpZGUgYW5hbHlzaXMgZGV0YWlscwogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaGlkZGVuJD0iW1shX3Nob3dfaG9zdF9zaWRlX2NoYXJ0XV0iPgogICAgICAgICAgPGRpdiBzdHlsZT0iaGVpZ2h0OjMwMHB4OyIgaWQ9Imhvc3Rfc2lkZV9jaGFydCI+PC9kaXY+CiAgICAgICAgICA8cD4KICAgICAgICAgICAgPHNwYW4+PGI+V2hhdCBjYW4gYmUgZG9uZSB0byByZWR1Y2UgYWJvdmUgY29tcG9uZW50cyBvZiB0aGUgaG9zdCBpbnB1dAogICAgICAgICAgICAgICAgdGltZTo8L2I+PC9zcGFuPgogICAgICAgICAgCiAgICAgICAgICA8ZGl2IGlkPSJyZWNvbW1lbmRhdGlvbl9kZXRhaWxzIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGhpZGRlbiQ9IltbX3Nob3dfaG9zdF9zaWRlX2NoYXJ0XV0iPgogICAgICAgICAgSG9zdCBzaWRlIGFuYWx5c2lzIGNhbiBub3QgYmUgZG9uZSB3aXRob3V0IGluc3RydW1lbnRhdGlvbi4KICAgICAgICA8L2Rpdj4KICAgICAgICA8cD4KICAgICAgICAgIENsaWNrIHRoZSAiU2hvdyIgYnV0dG9uIGJlbG93IHRvIHNlZSB0aGUgc291cmNlIGRhdGEgb2YgdGhlIGJyZWFrZG93bi4KICAgICAgICAKICAgICAgICA8YnV0dG9uIG9uLWNsaWNrPSJvbkNsaWNrIj5bW190b2dnbGVfYnV0dG9uX3RleHRdXTwvYnV0dG9uPgogICAgICAgIDx0YWJsZSBjbGFzcz0icGVyZm9ybWFuY2UtdGFibGUiIGhpZGRlbiQ9IltbIV9zaG93X2hvc3Rfc2lkZV90YWJsZV1dIj4KICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgPHRyPjx0aD5JbnB1dCBPcDwvdGg+CiAgICAgICAgICAgIDx0aD5Db3VudDwvdGg+CiAgICAgICAgICAgIDx0aD5Ub3RhbCBUaW1lIChpbiBtcyk8L3RoPgogICAgICAgICAgICA8dGg+VG90YWwgVGltZSAoYXMgJSBvZiB0b3RhbCBpbnB1dC1wcm9jZXNzaW5nIHRpbWUpPC90aD4KICAgICAgICAgICAgPHRoPlRvdGFsIFNlbGYgVGltZSAoaW4gbXMpPC90aD4KICAgICAgICAgICAgPHRoPlRvdGFsIFNlbGYgVGltZSAoYXMgJSBvZiB0b3RhbCBpbnB1dC1wcm9jZXNzaW5nIHRpbWUpPC90aD4KICAgICAgICAgICAgPHRoPkNhdGVnb3J5PC90aD4KICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICA8dGJvZHkgaWQ9Imhvc3Rfc2lkZV90YWJsZV9jb250ZW50Ij48L3Rib2R5PgogICAgICAgIDwvdGFibGU+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1pbWFnZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjYmFzZVVSSUFuY2hvciB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgI3NpemVkSW1nRGl2IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwcHg7CiAgICAgICAgcmlnaHQ6IDBweDsKICAgICAgICBib3R0b206IDBweDsKICAgICAgICBsZWZ0OiAwcHg7CgogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgICNpbWcgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiB2YXIoLS1pcm9uLWltYWdlLXdpZHRoLCBhdXRvKTsKICAgICAgICBoZWlnaHQ6IHZhcigtLWlyb24taW1hZ2UtaGVpZ2h0LCBhdXRvKTsKICAgICAgfQoKICAgICAgOmhvc3QoW3NpemluZ10pICNzaXplZEltZ0RpdiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtzaXppbmddKSAjaW1nIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAjcGxhY2Vob2xkZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDBweDsKICAgICAgICByaWdodDogMHB4OwogICAgICAgIGJvdHRvbTogMHB4OwogICAgICAgIGxlZnQ6IDBweDsKCiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDsKICAgICAgICBvcGFjaXR5OiAxOwoKICAgICAgICBAYXBwbHkgLS1pcm9uLWltYWdlLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICAjcGxhY2Vob2xkZXIuZmFkZWQtb3V0IHsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuNXMgbGluZWFyOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGEgaWQ9ImJhc2VVUklBbmNob3IiIGhyZWY9IiMiPjwvYT4KICAgIDxkaXYgaWQ9InNpemVkSW1nRGl2IiByb2xlPSJpbWciIGhpZGRlbiQ9IltbX2NvbXB1dGVJbWdEaXZIaWRkZW4oc2l6aW5nKV1dIiBhcmlhLWhpZGRlbiQ9IltbX2NvbXB1dGVJbWdEaXZBUklBSGlkZGVuKGFsdCldXSIgYXJpYS1sYWJlbCQ9IltbX2NvbXB1dGVJbWdEaXZBUklBTGFiZWwoYWx0LCBzcmMpXV0iPjwvZGl2PgogICAgPGltZyBpZD0iaW1nIiBhbHQkPSJbW2FsdF1dIiBoaWRkZW4kPSJbW19jb21wdXRlSW1nSGlkZGVuKHNpemluZyldXSIgY3Jvc3NvcmlnaW4kPSJbW2Nyb3Nzb3JpZ2luXV0iIG9uLWxvYWQ9Il9pbWdPbkxvYWQiIG9uLWVycm9yPSJfaW1nT25FcnJvciI+CiAgICA8ZGl2IGlkPSJwbGFjZWhvbGRlciIgaGlkZGVuJD0iW1tfY29tcHV0ZVBsYWNlaG9sZGVySGlkZGVuKHByZWxvYWQsIGZhZGUsIGxvYWRpbmcsIGxvYWRlZCldXSIgY2xhc3MkPSJbW19jb21wdXRlUGxhY2Vob2xkZXJDbGFzc05hbWUocHJlbG9hZCwgZmFkZSwgbG9hZGluZywgbG9hZGVkKV1dIj48L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItY2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLW1hdGVyaWFsLXN0eWxlcyI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItY2FyZC1iYWNrZ3JvdW5kLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3IpKTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItY2FyZDsKICAgICAgfQoKICAgICAgLyogSUUgMTAgc3VwcG9ydCBmb3IgSFRNTDUgaGlkZGVuIGF0dHIgKi8KICAgICAgOmhvc3QoW2hpZGRlbl0pLCBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaGVhZGVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogaW5oZXJpdDsKICAgICAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogaW5oZXJpdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1jYXJkLWhlYWRlcjsKICAgICAgfQoKICAgICAgLmhlYWRlciBpcm9uLWltYWdlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAtLWlyb24taW1hZ2Utd2lkdGg6IDEwMCU7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWNhcmQtaGVhZGVyLWltYWdlOwogICAgICB9CgogICAgICAuaGVhZGVyIC50aXRsZS10ZXh0IHsKICAgICAgICBwYWRkaW5nOiAxNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMjRweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1jYXJkLWhlYWRlci1jb2xvciwgIzAwMCk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWNhcmQtaGVhZGVyLXRleHQ7CiAgICAgIH0KCiAgICAgIC5oZWFkZXIgLnRpdGxlLXRleHQub3Zlci1pbWFnZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMHB4OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1jYXJkLWhlYWRlci1pbWFnZS10ZXh0OwogICAgICB9CgogICAgICA6aG9zdCA6OnNsb3R0ZWQoLmNhcmQtY29udGVudCkgewogICAgICAgIHBhZGRpbmc6IDE2cHg7CiAgICAgICAgcG9zaXRpb246cmVsYXRpdmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWNhcmQtY29udGVudDsKICAgICAgfQoKICAgICAgOmhvc3QgOjpzbG90dGVkKC5jYXJkLWFjdGlvbnMpIHsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2U4ZThlODsKICAgICAgICBwYWRkaW5nOiA1cHggMTZweDsKICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItY2FyZC1hY3Rpb25zOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIxIl0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMiJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTI7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjMiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0zOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSI0Il0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iNSJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iaGVhZGVyIj4KICAgICAgPGlyb24taW1hZ2UgaGlkZGVuJD0iW1shaW1hZ2VdXSIgYXJpYS1oaWRkZW4kPSJbW19pc0hpZGRlbihpbWFnZSldXSIgc3JjPSJbW2ltYWdlXV0iIGFsdD0iW1thbHRdXSIgcGxhY2Vob2xkZXI9IltbcGxhY2Vob2xkZXJJbWFnZV1dIiBwcmVsb2FkPSJbW3ByZWxvYWRJbWFnZV1dIiBmYWRlPSJbW2ZhZGVJbWFnZV1dIj48L2lyb24taW1hZ2U+CiAgICAgIDxkaXYgaGlkZGVuJD0iW1shaGVhZGluZ11dIiBjbGFzcyQ9InRpdGxlLXRleHQgW1tfY29tcHV0ZUhlYWRpbmdDbGFzcyhpbWFnZSldXSI+W1toZWFkaW5nXV08L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJvdmVydmlldy1wYWdlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLWNhcmQgewogICAgICAgIG1hcmdpbjogNXB4OwogICAgICAgIC0tcGFwZXItY2FyZC1oZWFkZXItY29sb3I6ICNmNWY1ZjU7CiAgICAgICAgLS1wYXBlci1jYXJkLWhlYWRlcjogewogICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzQyODVmNDsKICAgICAgICB9CiAgICAgIH0KICAgICAgLmZsZXgtaG9yaXpvbnRhbCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgIH0KICAgICAgLnN0ZXB0aW1lLWF2ZXJhZ2UgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgICBjb2xvcjogdmFyKC0tc3VtbWFyeS1jb2xvciwgZ3JlZW4pOwogICAgICB9CiAgICAgIC50YWJsZS1zdHlsZSB7CiAgICAgICAgdGFibGUtbGF5b3V0OiBhdXRvOwogICAgICAgIHdpZHRoOiA5NSU7CiAgICAgIH0KICAgICAgLnRvcC1vcHMtdGFibGUgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICAgIHZ6LWxpbmUtY2hhcnQyLnN0ZXAtZ3JhcGggewogICAgICAgIHdpZHRoOiA4NjBweDsKICAgICAgICBoZWlnaHQ6IDIwMHB4OwogICAgICB9CiAgICAgIC54LWF4aXMtdGl0bGUgewogICAgICAgIHdpZHRoOiA4MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIHRleHQtdHJhbnNmb3JtOiBjYXBpdGFsaXplOwogICAgICB9CiAgICAgIC55LWF4aXMtdGl0bGUgewogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICAgIHdyaXRpbmctbW9kZTogYnQtcmw7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTsKICAgICAgfQogICAgICBkaXYuYm90dGxlbmVjay1zdGF0ZW1lbnQgewogICAgICAgIGNvbG9yOiB2YXIoLS1zdW1tYXJ5LWNvbG9yLCBncmVlbik7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGRlcjsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgIH0KICAgICAgZGl2LmVycm9yTWVzc2FnZSB7CiAgICAgICAgY29sb3I6IHJlZDsKICAgICAgICBmb250LXNpemU6IDAuNWNtOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkZXI7CiAgICAgICAgbWFyZ2luLXRvcDogMC41Y207CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41Y207CiAgICAgIH0KICAgICAgZGl2LmJvdHRsZW5lY2tUaXBzIHsKICAgICAgICBjb2xvcjogIzAwMDAwMDsKICAgICAgfQogICAgICBkaXYuYm90dGxlbmVja1RpcHMgYSB7CiAgICAgICAgY29sb3I6ICNmZjMzY2M7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KICAgICAgZGl2LmRvY3VtZW50YXRpb25UaXBzIHsKICAgICAgICBjb2xvcjogIzY2NjY5OTsKICAgICAgfQogICAgICBkaXYuZG9jdW1lbnRhdGlvblRpcHMgYSB7CiAgICAgICAgY29sb3I6ICMzM2NjMDA7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGNsYXNzPSJlcnJvck1lc3NhZ2UiIGhpZGRlbj0iW1shX2Vycm9yX21lc3NhZ2VdXSI+CiAgICAgIDxzcGFuPltbX2Vycm9yX21lc3NhZ2VdXTwvc3Bhbj4KICAgIDwvZGl2PgogICAgPGRpdiBoaWRkZW49IltbX2Vycm9yX21lc3NhZ2VdXSI+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciBmbGV4LWhvcml6b250YWwiPgogICAgICAgIDxwYXBlci1jYXJkIGhlYWRpbmc9IlBlcmZvcm1hbmNlIFN1bW1hcnkiPgogICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1jb250ZW50Ij4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgPGI+QXZlcmFnZSBzdGVwIHRpbWU8L2I+IChsb3dlciBpcyBiZXR0ZXIpOgogICAgICAgICAgICAgIDxiPjxzcGFuIGNsYXNzPSJzdGVwdGltZS1hdmVyYWdlIj5bW19zdGVwdGltZV9tc19hdmVyYWdlXV0gbXM8L3NwYW4+CiAgICAgICAgICAgICAgPC9iPgogICAgICAgICAgICAgIDxpIHN0eWxlPSJvcGFjaXR5OjAuNyI+KHN0YW5kYXJkIGRldmlhdGlvbiA9CiAgICAgICAgICAgICAgICA8c3Bhbj5bW19zdGVwdGltZV9tc19zdGRkZXZdXTwvc3Bhbj4gbXMpPC9pPgogICAgICAgICAgICAKICAgICAgICAgICAgPHVsIGhpZGRlbiQ9IltbIV9pbmZlZWRfbXNfYXZlcmFnZV1dIj4KICAgICAgICAgICAgICA8bGk+QXZlcmFnZSBpbmZlZWQ6IDxzcGFuPltbX2luZmVlZF9tc19hdmVyYWdlXV08L3NwYW4+IG1zPC9saT4KICAgICAgICAgICAgICA8bGk+QXZlcmFnZSBjb21wdXRlOiA8c3Bhbj5bW19jb21wdXRlX21zX2F2ZXJhZ2VdXTwvc3Bhbj4gbXM8L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICA8Yj5Ib3N0IGlkbGUgdGltZTwvYj4gKGxvd2VyIGlzIGJldHRlcik6CiAgICAgICAgICAgICAgPHNwYW4+W1tfaG9zdF9pZGxlX3RpbWVfcGVyY2VudF1dPC9zcGFuPgogICAgICAgICAgICAKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgPGI+VFBVIGlkbGUgdGltZTwvYj4gKGxvd2VyIGlzIGJldHRlcik6CiAgICAgICAgICAgICAgPHNwYW4+W1tfZGV2aWNlX2lkbGVfdGltZV9wZXJjZW50XV08L3NwYW4+CiAgICAgICAgICAgIAogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICA8Yj5VdGlsaXphdGlvbiBvZiBUUFUgTWF0cml4IFVuaXRzPC9iPiAoaGlnaGVyIGlzIGJldHRlcik6CiAgICAgICAgICAgICAgPHNwYW4+W1tfbXh1X3V0aWxpemF0aW9uX3BlcmNlbnRdXTwvc3Bhbj4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3BhcGVyLWNhcmQ+CiAgICAgICAgPHBhcGVyLWNhcmQgaGVhZGluZz0iU3RlcC10aW1lIEdyYXBoIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtY29udGVudCIgaGlkZGVuPSJbWyFfc2hvd19zdGVwX3RpbWVfZ3JhcGhdXSI+CiAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0idGFibGUtc3R5bGUiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPSJ5LWF4aXMtdGl0bGUiPm1pbGxpc2Vjb25kczwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIDx2ei1saW5lLWNoYXJ0MiBjbGFzcz0ic3RlcC1ncmFwaCIgaWQ9ImRldmljZV9zdGVwX2NoYXJ0Ij4KICAgICAgICAgICAgICAgICAgPC92ei1saW5lLWNoYXJ0Mj4KICAgICAgICAgICAgICAgICAgPGRpdj48cCBjbGFzcz0ieC1heGlzLXRpdGxlIj50cmFpbmluZyBzdGVwIG51bWJlcjwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9wYXBlci1jYXJkPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIGZsZXgtaG9yaXpvbnRhbCI+CiAgICAgICAgPHBhcGVyLWNhcmQgaGVhZGluZyQ9IltbX3RvcF9vcHNfaGVhZGluZ11dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtY29udGVudCI+CiAgICAgICAgICAgIDxidXR0b24gb24tY2xpY2s9Im9uQ2xpY2tUb3BPcHMiPltbX3RvcF9vcHNfYnV0dG9uX3RleHRdXTwvYnV0dG9uPgogICAgICAgICAgICA8dGhyZWFkPgogICAgICAgICAgICAgICAgPC90aHJlYWQ+PHRhYmxlIGNsYXNzPSJ0b3Atb3BzLXRhYmxlIiBoaWRkZW4kPSJbWyFfc2hvd190b3Bfb3BzX3RhYmxlXV0iPgogICAgICAgICAgICAgIDx0cj48dGg+VGltZSAoJSk8L3RoPgogICAgICAgICAgICAgICAgPHRoPkN1bXVsYXRpdmUgdGltZSAoJSk8L3RoPgogICAgICAgICAgICAgICAgPHRoPkNhdGVnb3J5PC90aD4KICAgICAgICAgICAgICAgIDx0aD5PcGVyYXRpb248L3RoPgogICAgICAgICAgICAgICAgPHRoPkdGbG9wcy9zZWM8L3RoPgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIDx0Ym9keSBpZD0idG9wX29wc190YWJsZV9jb250ZW50Ij48L3Rib2R5PgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9wYXBlci1jYXJkPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIGZsZXgtaG9yaXpvbnRhbCI+CiAgICAgICAgPHBhcGVyLWNhcmQgaGVhZGluZz0iUnVuIEVudmlyb25tZW50Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtY29udGVudCI+CiAgICAgICAgICAgIDxwPjxiPk51bWJlciBvZiBIb3N0cyB1c2VkPC9iPjogPHNwYW4+W1tfaG9zdF9jb3VudF1dPC9zcGFuPgogICAgICAgICAgICA8cD48Yj5UUFUgdHlwZTwvYj46IENsb3VkIFRQVQogICAgICAgICAgICA8cD48Yj5OdW1iZXIgb2YgVFBVIGNvcmVzPC9iPjogPHNwYW4+IFtbX3RwdV9jb3JlX2NvdW50XV08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3BhcGVyLWNhcmQ+CiAgICAgICAgPHBhcGVyLWNhcmQgaGVhZGluZz0iUmVjb21tZW5kYXRpb24gZm9yIE5leHQgU3RlcHMiPgogICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1jb250ZW50Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iYm90dGxlbmVjay1zdGF0ZW1lbnQiPjxzcGFuPltbX3N0YXRlbWVudF1dPC9zcGFuPjwvZGl2PgogICAgICAgICAgICA8ZGl2IGlkPSJob3N0X3NpZGVfdGlwcyI+PC9kaXY+CiAgICAgICAgICAgIDxkaXYgaWQ9ImRldmljZV9zaWRlX3RpcHMiPjwvZGl2PgogICAgICAgICAgICA8ZGl2IGlkPSJkb2N1bWVudGF0aW9uX3RpcHMiPjwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9wYXBlci1jYXJkPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtb3AtdGFibGUtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgICN0aW1lLAogICAgICAjd2FzdGVkLAogICAgICAjdXRpbGl6YXRpb24gewogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICB9CiAgICAgICNuYW1lIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiA0MCU7CiAgICAgIH0KICAgICAgI3JvdywKICAgICAgI2hlYWRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CiAgICAgICNyb3cgPiAqLAogICAgICAjaGVhZGVyID4gKiB7CiAgICAgICAgcGFkZGluZzogMC41ZW07CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CiAgICAgICNoZWFkZXIgPiAqIHsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMDsKICAgICAgfQogICAgICAjcHJvdmVuYW5jZSB7CiAgICAgICAgZmxleDogMSAxIDAgIWltcG9ydGFudDsKICAgICAgfQogICAgICAjdXRpbGl6YXRpb24gewogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtb3AtdGFibGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1vcC10YWJsZS1zdHlsZXMiPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgIH0KICAgICAgI2hlYWRlciB7CiAgICAgICAgZm9udC1zaXplOiBzbWFsbGVyOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICAgIHBhZGRpbmctYm90dG9tOiAwLjI1ZW07CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM2NjY7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICAgIC8qIE1hdGNoIGluZGVudGVkIG5hbWVzICovCiAgICAgICNoZWFkZXIgPiAjbmFtZSB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAyZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8c3BhbiBpZD0idGltZSI+VGltZTwvc3Bhbj4KICAgICAgPHNwYW4gaWQ9Indhc3RlZCI+V2FzdGVkPC9zcGFuPgogICAgICA8c3BhbiBpZD0ibmFtZSI+TmFtZTwvc3Bhbj4KICAgICAgPHNwYW4gaWQ9InByb3ZlbmFuY2UiPlRlbnNvckZsb3cgT3A8L3NwYW4+CiAgICAgIDxzcGFuIGlkPSJ1dGlsaXphdGlvbiI+RkxPUFM8L3NwYW4+CiAgICA8L2Rpdj4KICAgIDx0Zi1vcC10YWJsZS1lbnRyeSBub2RlPSJbW3Jvb3ROb2RlXV0iIGhlYWRlci1ob3Zlcj0iW1tfb25IZWFkZXJIb3Zlcl1dIiBoZWFkZXItY2xpY2s9IltbX29uSGVhZGVyQ2xpY2tdXSIgY2hpbGRyZW4tY291bnQ9Int7Y2hpbGRyZW5Db3VudH19IiBzaG93LXA5MD0ie3tzaG93UDkwfX0iIGJ5LXdhc3RlPSJ7e2J5V2FzdGV9fSIgZXhwYW5kZWQ9InRydWUiPgogICAgPC90Zi1vcC10YWJsZS1lbnRyeT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1vcC10YWJsZS1lbnRyeSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InRmLW9wLXRhYmxlLXN0eWxlcyI+CiAgICAgICNyb3cgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIDAgcmdiYSgwLCAwLCAwLCAwLjA2KTsKICAgICAgICB6LWluZGV4OiAwOwogICAgICB9CiAgICAgICNiYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgei1pbmRleDogLTE7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2NkZTsKICAgICAgfQogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgOmhvc3QoLnNlbGVjdGVkKSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA0KTsKICAgICAgfQogICAgICA6aG9zdCguc2VsZWN0ZWQpID4gI3JvdyB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgI3Jvdzpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjA1KTsKICAgICAgfQogICAgICAjZGlzY2xvc3VyZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiAxZW07CiAgICAgIH0KICAgICAgI25hbWUgewogICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgICAgIH0KICAgICAgI3RpbWUsCiAgICAgICN3YXN0ZWQsCiAgICAgICN1dGlsaXphdGlvbiB7CiAgICAgICAgZm9udC1zaXplOiBzbWFsbGVyOwogICAgICB9CiAgICAgIC8qIFV0aWxpemF0aW9uIGhhcyBhIGJhY2tncm91bmQgY29sb3IsIHNvIGl0IHN0cmV0Y2hlcyB0byBmaWxsIHRoZSByb3cuCiAgICAgICAgIEl0cyB0ZXh0IGlzIGluIGFuIGlubmVyIGRpdiB0aGF0IHJlbWFpbnMgdmVydGljYWxseSBjZW50ZXJlZC4gKi8KICAgICAgI3V0aWxpemF0aW9uIHsKICAgICAgICBhbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICB9CiAgICAgICN1dGlsaXphdGlvbiBkaXYgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB0b3A6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7CiAgICAgIH0KCiAgICAgIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGlkPSJyb3ciIG9uLWNsaWNrPSJfaGFuZGxlSGVhZGVyQ2xpY2siIG9uLW1vdXNlZW50ZXI9Il9oYW5kbGVIZWFkZXJNb3VzZUVudGVyIiBvbi1tb3VzZWxlYXZlPSJfaGFuZGxlSGVhZGVyTW91c2VMZWF2ZSIgaGlkZGVuPSJbWyFsZXZlbF1dIj4KICAgICAgPGRpdiBpZD0iYmFyIiBzdHlsZSQ9IndpZHRoOnt7X2JhcldpZHRoKG5vZGUpfX0iPjwvZGl2PgogICAgICA8c3BhbiBpZD0idGltZSI+e3tfcGVyY2VudChub2RlKX19PC9zcGFuPgogICAgICA8c3BhbiBpZD0id2FzdGVkIj57e190aW1lV2FzdGVkKG5vZGUpfX08L3NwYW4+CiAgICAgIDxzcGFuIGlkPSJuYW1lIiBzdHlsZSQ9InBhZGRpbmctbGVmdDpbW2xldmVsXV1lbTsiPgogICAgICAgIDxzcGFuIGlkPSJkaXNjbG9zdXJlIj4KICAgICAgICAgIDxzcGFuIGhpZGRlbj0iW1shbm9kZS5jaGlsZHJlbi5sZW5ndGhdXSI+CiAgICAgICAgICAgIDxzcGFuIGhpZGRlbj0iW1tleHBhbmRlZF1dIj7ilrY8L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGhpZGRlbj0iW1shZXhwYW5kZWRdXSI+4pa8PC9zcGFuPgogICAgICAgICAgPC9zcGFuPiA8L3NwYW4+e3tub2RlLm5hbWV9fQogICAgICA8L3NwYW4+CiAgICAgIDxzcGFuIGlkPSJwcm92ZW5hbmNlIj57e19wcm92ZW5hbmNlKG5vZGUpfX0mbmJzcDs8L3NwYW4+CiAgICAgIDxzcGFuIGlkPSJ1dGlsaXphdGlvbiIgaGlkZGVuPSJbWyFfaGFzRmxvcHMobm9kZSldXSIgc3R5bGUkPSJiYWNrZ3JvdW5kLWNvbG9yOnt7X2ZsYW1lQ29sb3Iobm9kZSl9fSI+CiAgICAgICAge3tfdXRpbGl6YXRpb24obm9kZSl9fTwvc3Bhbj4KICAgIDwvZGl2PgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2V4cGFuZGVkXV0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e19nZXRLQ2hpbGRyZW4obm9kZSwgY2hpbGRyZW5Db3VudCwgc2hvd1A5MCwgbGV2ZWwpfX0iIHNvcnQ9IltbX3NvcnQoYnlXYXN0ZSldXSI+CiAgICAgICAgPHRmLW9wLXRhYmxlLWVudHJ5IG5vZGU9IltbaXRlbV1dIiBjaGlsZHJlbi1jb3VudD0ie3tjaGlsZHJlbkNvdW50fX0iIHNob3ctcDkwPSJ7e3Nob3dQOTB9fSIgYnktd2FzdGU9Int7YnlXYXN0ZX19IiBsZXZlbD0ie3tfbmV4dExldmVsKGxldmVsKX19IiBoZWFkZXItaG92ZXI9Int7aGVhZGVySG92ZXJ9fSIgaGVhZGVyLWNsaWNrPSJ7e2hlYWRlckNsaWNrfX0iPgogICAgICAgIDwvdGYtb3AtdGFibGUtZW50cnk+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTGVmdG91dChub2RlLCBjaGlsZHJlbkNvdW50LCBsZXZlbCldXSI+CiAgICAgICAgPHNwYW4gaWQ9Im5hbWUiIHN0eWxlJD0icGFkZGluZy1sZWZ0OltbX2dldFBhZGRpbmdMZWZ0KGxldmVsKV1dZW07Ij4KICAgICAgICAgIFtbX251bUxlZnRvdXQobm9kZSwgY2hpbGRyZW5Db3VudCldXSBjYXRlZ29yaWVzIG9yIG9wcyBoYXZlIGJlZW4gbGVmdAogICAgICAgICAgb3V0LgogICAgICAgIDwvc3Bhbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdGVtcGxhdGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtb3AtYmFyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxLjVlbTsKICAgICAgICBsaW5lLWhlaWdodDogMS41ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICAmbmJzcDtbW19wZXJjZW50KHZhbHVlKV1dCiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1vcC1kZXRhaWxzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLWNhcmQgewogICAgICAgIC0tcGFwZXItY2FyZC1oZWFkZXItY29sb3I6IHdoaXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICAgIHRmLW9wLWJhciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgI3N1YmhlYWRlciB7CiAgICAgICAgcGFkZGluZzogMCAxNnB4IDZweDsKICAgICAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB0b3A6IC0xMHB4OwogICAgICB9CiAgICAgIC5jYXJkLWNvbnRlbnQgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgIH0KICAgICAgLmNhcmQtY29udGVudCA+IGRpdiB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMWVtOwogICAgICB9CiAgICAgIC5leHByZXNzaW9uIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgICAgLnVuYXZhaWxhYmxlIHsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQgewogICAgICAgIGRpc3BsYXk6IHRhYmxlOwogICAgICAgIHdpZHRoOiA1MCU7CiAgICAgICAgYm9yZGVyLXNwYWNpbmc6IDFlbSAwLjNlbTsKICAgICAgfQogICAgICAubGF5b3V0ID4gKiB7CiAgICAgICAgZGlzcGxheTogdGFibGUtcm93OwogICAgICB9CiAgICAgIC5sYXlvdXQgPiAqID4gKiB7CiAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbDsKICAgICAgfQogICAgICAubGF5b3V0IC5zaXplLAogICAgICAubGF5b3V0IC5zaXplLXggewogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQogICAgICAubGF5b3V0IC5zaXplLXggewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGNvbG9yOiAjODg4OwogICAgICB9CiAgICAgIC5sYXlvdXQgLnNlbWFudGljcyB7CiAgICAgICAgZm9udC1zaXplOiBzbWFsbGVyOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGNvbG9yOiAjNDhjOwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgICAubGF5b3V0IC5hbGlnbm1lbnQgewogICAgICAgIC8qIE1ha2UgdGhlIGJhY2tncm91bmQgZXh0ZW5kIG91dHNpZGUgdGhlIGJveCAqLwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBwYWRkaW5nOiAwLjVlbTsKICAgICAgICBtYXJnaW4tdG9wOiAtMC41ZW07CiAgICAgICAgd2lkdGg6IDUwJTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHBhcGVyLWNhcmQgaWQ9ImNhcmQiIGhlYWRpbmc9Iltbbm9kZS5uYW1lXV0iIGVsZXZhdGlvbj0iMiI+CiAgICAgIDxkaXYgaWQ9InN1YmhlYWRlciI+W1tfc3ViaGVhZGVyKG5vZGUpXV08L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2FyZC1jb250ZW50Ij4KICAgICAgICA8ZGl2IGhpZGRlbj0iW1shX2hhc0Zsb3BzKG5vZGUpXV0iPgogICAgICAgICAgPGI+RkxPUFMgdXRpbGl6YXRpb246IDwvYj4KICAgICAgICAgIDx0Zi1vcC1iYXIgY29sb3I9IltbX2Zsb3BzQ29sb3Iobm9kZSldXSIgdmFsdWU9IltbX3V0aWxpemF0aW9uKG5vZGUpXV0iPjwvdGYtb3AtYmFyPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaGlkZGVuPSJbWyFfaGFzTWVtb3J5VXRpbGl6YXRpb24obm9kZSldXSI+CiAgICAgICAgICA8Yj5NZW1vcnkgYmFuZHdpZHRoIHV0aWxpemF0aW9uOiA8L2I+CiAgICAgICAgICA8dGYtb3AtYmFyIGNvbG9yPSJbW19id0NvbG9yKG5vZGUpXV0iIHZhbHVlPSJbW19tZW1vcnlVdGlsaXphdGlvbihub2RlKV1dIj48L3RmLW9wLWJhcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJ1bmF2YWlsYWJsZSIgaGlkZGVuPSJbWyFfZnVzZWQobm9kZSldXSI+CiAgICAgICAgICBQZXJmb3JtYW5jZSBpbmZvcm1hdGlvbiBmb3IgaW5kaXZpZHVhbCBmdXNlZCBvcGVyYXRpb25zIGlzIG5vdAogICAgICAgICAgYXZhaWxhYmxlLgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InVuYXZhaWxhYmxlIiBoaWRkZW49IltbIW5vZGUuY2F0ZWdvcnldXSI+CiAgICAgICAgICBTZWxlY3QgaXRlbXMgd2l0aGluIHRoaXMgY2F0ZWdvcnkgZm9yIHBlcmZvcm1hbmNlIGRldGFpbHMuCiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBoaWRkZW49IltbIW5vZGUueGxhLmV4cHJlc3Npb25dXSI+CiAgICAgICAgICA8Yj5YTEEgRXhwcmVzc2lvbjogPC9iPgogICAgICAgICAgPGNvZGUgY2xhc3M9ImV4cHJlc3Npb24iPltbbm9kZS54bGEuZXhwcmVzc2lvbl1dPC9jb2RlPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaGlkZGVuPSJbWyFub2RlLnhsYS5wcm92ZW5hbmNlXV0iPgogICAgICAgICAgPGI+VGVuc29yRmxvdyBOYW1lOiA8L2I+CiAgICAgICAgICA8Y29kZSBjbGFzcz0iZXhwcmVzc2lvbiI+W1tub2RlLnhsYS5wcm92ZW5hbmNlXV08L2NvZGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBoaWRkZW49IltbIW5vZGUueGxhLmxheW91dF1dIj4KICAgICAgICAgIDxiPkxheW91dDogPC9iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0IiBoaWRkZW49IltbIW5vZGUueGxhLmxheW91dF1dIj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tub2RlLnhsYS5sYXlvdXQuZGltZW5zaW9uc11dIj4KICAgICAgICAgICAgICA8ZGl2IGhpZGRlbj0iW1shaW5kZXhdXSI+PHNwYW4gY2xhc3M9InNpemUteCI+w5c8L3NwYW4+PC9kaXY+CiAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzaXplIj5bW2l0ZW0uc2l6ZV1dPC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InNlbWFudGljcyI+W1tpdGVtLnNlbWFudGljc11dPC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImFsaWdubWVudCIgc3R5bGUkPSJiYWNrZ3JvdW5kLWNvbG9yOltbX2RpbWVuc2lvbkNvbG9yKGl0ZW0pXV0iPltbX2RpbWVuc2lvbkhpbnQoaXRlbSldXTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvcGFwZXItY2FyZD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLW9wLXByb2ZpbGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi1yaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgI2NvbnRyb2wgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1mbG93OiByb3cgbm93cmFwOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIHBhZGRpbmc6IDAuNWVtOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207CiAgICAgICAgdGV4dC1hbGlnbjogYm90dG9tOwogICAgICB9CiAgICAgIC5jb250cm9sUm93TGVmdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWZsb3c6IHJvdyBub3dyYXA7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBsaW5lLWhlaWdodDogNTBweDsKICAgICAgICB0ZXh0LWFsaWduOiBib3R0b207CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICB9CiAgICAgIC5jb250cm9sUm93UmlnaHQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1mbG93OiByb3cgbm93cmFwOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgbGluZS1oZWlnaHQ6IDUwcHg7CiAgICAgICAgdGV4dC1hbGlnbjogYm90dG9tOwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgIH0KICAgICAgcGFwZXItc2xpZGVyIHsKICAgICAgICAtLXBhcGVyLXNsaWRlci1pbnB1dDogewogICAgICAgICAgd2lkdGg6IDEwMHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLXNsaWRlci1oZWlnaHQ6IDNweDsKICAgICAgfQogICAgICAjZGVzY3JpcHRpb24gewogICAgICAgIG1hcmdpbi1ib3R0b206IDJlbTsKICAgICAgICB3aWR0aDogNjAwcHg7CiAgICAgIH0KICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGNsYXNzPSJ0Zi1vcC1wcm9maWxlIj4KICAgICAgPGgzPgogICAgICAgIE92ZXJhbGwgVFBVIEZMT1BTIHV0aWxpemF0aW9uIGlzCiAgICAgICAgPHNwYW4gc3R5bGUkPSJjb2xvcjpbW19mbG9wc0NvbG9yKF9yb290KV1dIj4KICAgICAgICAgIFtbX3V0aWxpemF0aW9uUGVyY2VudChfcm9vdCldXTwvc3Bhbj4KICAgICAgICAsIG1lbW9yeSBiYW5kd2lkdGggdXRpbGl6YXRpb24gaXMKICAgICAgICA8c3BhbiBzdHlsZSQ9ImNvbG9yOltbX2J3Q29sb3IoX3Jvb3QpXV0iPgogICAgICAgICAgW1tfbWVtb3J5VXRpbGl6YXRpb25QZXJjZW50KF9yb290KV1dPC9zcGFuPgogICAgICA8L2gzPgogICAgICA8ZGl2IGlkPSJkZXNjcmlwdGlvbiI+CiAgICAgICAgPHA+CiAgICAgICAgICBNb2RpZnlpbmcgeW91ciBtb2RlbCdzIGFyY2hpdGVjdHVyZSwgZGF0YSBkaW1lbnNpb25zLCBhbmQgaW1wcm92aW5nCiAgICAgICAgICB0aGUgZWZmaWNpZW5jeSBvZiBDUFUgb3BlcmF0aW9ucyBtYXkgaGVscCByZWFjaCB0aGUgVFBVJ3MgRkxPUFMKICAgICAgICAgIHBvdGVudGlhbC4KICAgICAgICAKICAgICAgICA8cD4KICAgICAgICAgICJJZGxlIiByZXByZXNlbnRzIHRoZSBwb3J0aW9uIG9mIHRoZSB0b3RhbCBleGVjdXRpb24gdGltZSBvbiBkZXZpY2UKICAgICAgICAgIHRoYXQgaXMgaWRsZS4gV2FzdGVkIHRpbWUgaXMgZGVmaW5lZCBieQogICAgICAgICAgPGNvZGU+UnVudGltZUZyYWN0aW9uICogKDEgLSBtYXgoRmxvcHNVdGlsaXphdGlvbiwKICAgICAgICAgICAgTWVtb3J5VXRpbGl6YXRpb24pKTwvY29kZT4uCiAgICAgICAgCiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGlkPSJjb250cm9sIj4KICAgICAgICA8c3BhbiBjbGFzcz0iY29udHJvbFJvd0xlZnQiIGhpZGRlbiQ9IltbIV9oYXNUd29Qcm9maWxlc11dIj5CeSBQcm9ncmFtCiAgICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBjaGVja2VkPSJ7e2lzQnlDYXRlZ29yeX19Ij4gPC9wYXBlci10b2dnbGUtYnV0dG9uPkJ5IENhdGVnb3J5PC9zcGFuPgogICAgICAgIAogICAgICAgIDxzcGFuIGNsYXNzPSJjb250cm9sUm93TGVmdCI+U2hvdyB0b3AKICAgICAgICAgIDxwYXBlci1zbGlkZXIgbWluPSIxMCIgbWF4PSIxMDAiIHNuYXBzIHN0ZXA9IjEwIiB2YWx1ZT0ie3tjaGlsZHJlbkNvdW50fX0iIGVkaXRhYmxlPgogICAgICAgICAgPC9wYXBlci1zbGlkZXI+b3BzPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJjb250cm9sUm93UmlnaHQiPiZuYnNwOwogICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2hlY2tlZD0ie3tieVdhc3RlfX0iPiA8L3BhcGVyLXRvZ2dsZS1idXR0b24+U29ydAogICAgICAgICAgYnkgd2FzdGVkIHRpbWU8L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNvbnRyb2xSb3dSaWdodCI+b2ZmJm5ic3A7CiAgICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBjaGVja2VkPSJ7e3Nob3dQOTB9fSI+IDwvcGFwZXItdG9nZ2xlLWJ1dHRvbj5Ub3AKICAgICAgICAgIDkwJTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDx0Zi1vcC10YWJsZSByb290LW5vZGU9IltbX3Jvb3RdXSIgYWN0aXZlPSJ7e2FjdGl2ZX19IiBieS13YXN0ZT0ie3tieVdhc3RlfX0iIHNob3ctcDkwPSJ7e3Nob3dQOTB9fSIgY2hpbGRyZW4tY291bnQ9Int7Y2hpbGRyZW5Db3VudH19Ij4KICAgICAgPC90Zi1vcC10YWJsZT4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJtdi1saW5lLWNoYXJ0Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGxvdHRhYmxlLXN0eWxlIj48L3N0eWxlPgogICAgPGRpdiBjbGFzcz0ibXYtbGluZS1jaGFydCI+CiAgICAgIDxoMj5Xb3JraW5nIFNwYWNlIFNpemUgKE1pQikgdnMgUHJvZ3JhbSBPcmRlciAoSExPIFNlcXVlbmNlKTwvaDI+CiAgICAgIDxkaXYgaWQ9ImNoYXJ0ZGl2IiBzdHlsZT0id2lkdGg6MTIwMHB4O2hlaWdodDozODRweCI+PC9kaXY+CiAgICAgIDxkaXYgaWQ9Im1heGhlYXAtZGV0YWlscyI+CiAgICAgICAgPGVtPkhvdmVyIG92ZXIgYSBiYXIgZm9yIGJ1ZmZlciBkZXRhaWxzIHRvIGFwcGVhciBvbiB0aGUgbGVmdC48L2VtPgogICAgICA8L2Rpdj4KICAgICAgPGgzPkJ5IFByb2dyYW0gT3JkZXI8L2gzPgogICAgICA8ZGl2IGlkPSJtYXhoZWFwY2hhcnQiIHN0eWxlPSJ3aWR0aDoxMjAwcHg7aGVpZ2h0OjIwMHB4Ij48L2Rpdj4KICAgICAgPGgzPkJ5IFNpemU8L2gzPgogICAgICA8ZGl2IGlkPSJtYXhoZWFwc2l6ZWNoYXJ0IiBzdHlsZT0id2lkdGg6MTIwMHB4O2hlaWdodDoyMDBweCI+PC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1tdi1iYXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjVlbTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9ImJ1ZmZlci1kZXRhaWxzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLWNhcmQgewogICAgICAgIC0tcGFwZXItY2FyZC1oZWFkZXItY29sb3I6IHdoaXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICAgIHRmLW12LWJhciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgI3N1YmhlYWRlciB7CiAgICAgICAgcGFkZGluZzogMCAxNnB4IDZweDsKICAgICAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB0b3A6IC0xMHB4OwogICAgICB9CiAgICAgIC5jYXJkLWNvbnRlbnQgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgIH0KICAgICAgLmNhcmQtY29udGVudCA+IGRpdiB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMWVtOwogICAgICB9CiAgICAgIC5leHByZXNzaW9uIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8cGFwZXItY2FyZCBpZD0iY2FyZCIgaGVhZGluZz0iW1tub2RlLmluc3RydWN0aW9uTmFtZV1dIiBoaWRkZW49IltbIW5vZGVdXSIgZWxldmF0aW9uPSIyIj4KICAgICAgPGRpdiBpZD0ic3ViaGVhZGVyIj5bW19zdWJoZWFkZXIobm9kZSldXTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjYXJkLWNvbnRlbnQiPgogICAgICAgIDxkaXYgaGlkZGVuPSJbWyFzaXplXV0iPgogICAgICAgICAgPGg0PlNpemU6IDxzcGFuPltbc2l6ZV1dPC9zcGFuPjxiPiBNaUI8L2I+PC9oND4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGhpZGRlbj0iW1shdW5wYWRkZWRTaXplXV0iPgogICAgICAgICAgPGI+VW5wYWRkZWQgU2l6ZTogPC9iPjxzcGFuPltbdW5wYWRkZWRTaXplXV08L3NwYW4+PGI+IE1pQjwvYj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGhpZGRlbj0iW1shcGFkZGluZ11dIj4KICAgICAgICAgIDxiPkV4dHJhIG1lbW9yeSBkdWUgdG8gcGFkZGluZzogPC9iPjxzcGFuPltbcGFkZGluZ11dPC9zcGFuPjxiPiBNaUI8L2I+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBoaWRkZW49IltbIWV4cGFuc2lvbl1dIj4KICAgICAgICAgIDxiPkV4cGFuc2lvbjogPC9iPjxzcGFuPltbZXhwYW5zaW9uXV08L3NwYW4+PGI+WDwvYj4KICAgICAgICAgIDx0Zi1tdi1iYXIgdmFsdWU9IltbdXRpbGl6YXRpb25dXSI+PC90Zi1tdi1iYXI+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBoaWRkZW49IltbIW5vZGUuc2hhcGVdXSI+CiAgICAgICAgICA8Yj5TaGFwZSAoYW5kIG1pbm9yLXRvLW1ham9yIG9yZGVyKTogPC9iPgogICAgICAgICAgPGNvZGUgY2xhc3M9ImV4cHJlc3Npb24iPltbbm9kZS5zaGFwZV1dPC9jb2RlPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaGlkZGVuPSJbWyFub2RlLnRmT3BOYW1lXV0iPgogICAgICAgICAgPGI+VGYgT3AgTmFtZTogPC9iPgogICAgICAgICAgPGNvZGUgY2xhc3M9ImV4cHJlc3Npb24iPltbbm9kZS50Zk9wTmFtZV1dPC9jb2RlPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaGlkZGVuPSJbWyFub2RlLmdyb3VwTmFtZV1dIj4KICAgICAgICAgIDxiPkFsbG9jYXRpb24gVHlwZTogPC9iPjxzcGFuPltbbm9kZS5ncm91cE5hbWVdXTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWNhcmQ+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJtZW1vcnktdmlld2VyLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgb3ZlcmZsb3cteDogYXV0bzsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAjZGVzY3JpcHRpb24gewogICAgICAgIG1hcmdpbi1ib3R0b206IDJlbTsKICAgICAgICB3aWR0aDogNjAwcHg7CiAgICAgIH0KICAgICAgbXYtbGluZS1jaGFydCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0ibWVtb3J5LXZpZXdlci1kYXNoYm9hcmQiIHN0eWxlPSJvdmVyZmxvdzphdXRvIj4KICAgICAgPGgzPk1vZHVsZSBuYW1lOiA8c3Bhbj5bW21vZHVsZU5hbWVfXV08L3NwYW4+PC9oMz4KICAgICAgPGgzPgogICAgICAgIFBlYWsgbWVtb3J5IGFsbG9jYXRpb24gaXMgPHNwYW4+e3twZWFrSGVhcFNpemVNaUJffX08L3NwYW4+IE1pQgogICAgICAgIDxzcGFuIHN0eWxlPSJmb250LXNpemU6MjBweCIgaGlkZGVuPSJ7eyF1bnBhZGRlZFBlYWtIZWFwU2l6ZU1pQl99fSI+KCB7e3VucGFkZGVkUGVha0hlYXBTaXplTWlCX319IE1pQiB3aXRob3V0IHBhZGRpbmcpPC9zcGFuPgogICAgICA8L2gzPgogICAgICA8ZGl2IGlkPSJkZXNjcmlwdGlvbiI+CiAgICAgICAgPHA+CiAgICAgICAgICBNb2RpZnlpbmcgeW91ciBtb2RlbCdzIGFyY2hpdGVjdHVyZSwgYmF0Y2ggc2l6ZSBhbmQgZGF0YSBkaW1lbnRpb25zCiAgICAgICAgICBtYXkgaGVscCByZWR1Y2UgdGhlIG1lbW9yeSBmb290cHJpbnQuCiAgICAgICAgCiAgICAgIDwvZGl2PgogICAgICA8bXYtbGluZS1jaGFydCBkYXRhPSJ7e3VzYWdlfX0iIGFjdGl2ZT0ie3thY3RpdmV9fSI+PC9tdi1saW5lLWNoYXJ0PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0iZGV0YWlscy1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLWNhcmQgewogICAgICAgIG1heC1oZWlnaHQ6IDUwdmg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICAtLXBhcGVyLWNhcmQtaGVhZGVyLWNvbG9yOiB3aGl0ZTsKICAgICAgICAtLXBhcGVyLWNhcmQtaGVhZGVyOiB7CiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTc4LCAzNCwgMzQpOwogICAgICAgIH0KICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLmNhcmQtY29udGVudCA+IGRpdiB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMWVtOwogICAgICAgIHRvcDogLTVweDsKICAgICAgfQoKICAgICAgLnZhbHVlIHsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CgogICAgICAuaW5mbyB7CiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CgogICAgICAuY29kZS1zdHlsZSB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8cGFwZXItY2FyZCBpZD0iY2FyZCIgaGVhZGluZz0iW1tfbmFtZV1dIiBoaWRkZW49IltbIV9uYW1lXV0iIGVsZXZhdGlvbj0iMiI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Iltbbm9kZXNdXSIgYXM9Im5vZGUiPgogICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtY29udGVudCBpbmZvIj4KICAgICAgICAgIDxkaXYgaGlkZGVuPSJbW19pc1N0ZXAobm9kZSldXSI+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIERhdGEgVHJhbnNmZXJyZWQ6CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InZhbHVlIj5bW19zaXplTWlCKG5vZGUuZGF0YVNpemUpXV0gTWlCPC9zcGFuPgogICAgICAgICAgICAKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgTGF0ZW5jeToKICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idmFsdWUiPltbX2Zvcm1hdChub2RlLmR1cmF0aW9uVXMpXV0gwrVzPC9zcGFuPgogICAgICAgICAgICAKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgQlc6CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InZhbHVlIj4KICAgICAgICAgICAgICAgIFtbX2JhbmR3aWR0aChub2RlLmRhdGFTaXplLCBub2RlLmR1cmF0aW9uVXMpXV0gR2lCL3M8L3NwYW4+CiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGhpZGRlbj0iW1shX2lzQ2hhbm5lbChub2RlKV1dIj4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgU2VuZCBEZWxheToKICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0idmFsdWUiPltbX2Zvcm1hdChub2RlLnNlbmREZWxheVVzKV1dIMK1czwvc3Bhbj4KICAgICAgICAgICAgCiAgICAgICAgICAgIDxwPkhsbyBOYW1lczoKICAgICAgICAgICAgPGNvZGUgY2xhc3M9ImNvZGUtc3R5bGUiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Iltbbm9kZS5obG9OYW1lc11dIj4KICAgICAgICAgICAgICAgICJbW2l0ZW1dXSIKICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2NvZGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgaGlkZGVuPSJbWyFfaGFzUmVwbGljYUdyb3Vwcyhub2RlKV1dIj4KICAgICAgICAgICAgPHA+UmVwbGljYSBHcm91cHMKICAgICAgICAgICAgPGNvZGUgY2xhc3M9ImNvZGUtc3R5bGUiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Iltbbm9kZS5yZXBsaWNhR3JvdXBzXV0iPgogICAgICAgICAgICAgICAge1tbaXRlbS5yZXBsaWNhSWRzXV19PGJyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvY29kZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBoaWRkZW49IltbIV9pc1N0ZXAobm9kZSldXSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Iltbc3RlcEJyZWFrZG93bkxheWVyc11dIj4KICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIFtbaXRlbS5sYWJlbF1dOgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InZhbHVlIj4KICAgICAgICAgICAgICAgICAgW1tfZ2V0U3RlcEJyZWFrZG93blZhbHVlKG5vZGUsIGl0ZW0ua2V5KV1dIMK1cwogICAgICAgICAgICAgICAgICBbW19nZXRTdGVwQnJlYWtkb3duUGN0KG5vZGUsIGl0ZW0ua2V5KV1dPC9zcGFuPgogICAgICAgICAgICAgIAogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3BhcGVyLWNhcmQ+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJzdGFjay1iYXItY2hhcnQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi1yaWdodDogMS41ZW07CiAgICAgIH0KCiAgICAgIC5heGlzIHRleHQgewogICAgICAgIGZvbnQ6IDE0cHggc2Fucy1zZXJpZjsKICAgICAgfQoKICAgICAgLnN2Zy1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogOTAlOyAvKiBhc3BlY3QgcmF0aW8gKi8KICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICB3aWR0aDogOTAlOwogICAgICB9CgogICAgICAuc3ZnLWNvbnRlbnQtcmVzcG9uc2l2ZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9InN0YWNrLWJhci1jaGFydCI+CiAgICAgIDxkaXYgaWQ9ImNoYXJ0Ij48L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRvcG9sb2d5LWdyYXBoIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICAgIC5mbGV4LWhvcml6b250YWwgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICB9CgogICAgICAuZmxleGNoaWxkIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleDsKICAgICAgfQoKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi1yaWdodDogMS41ZW07CiAgICAgIH0KCiAgICAgIC5jZWxscyB7CiAgICAgICAgZmlsbDogI2FhYTsKICAgICAgfQoKICAgICAgLmxhYmVsIHsKICAgICAgICBmb250OiAyNHB4IHNhbnMtc2VyaWY7CiAgICAgICAgdGV4dC1hbmNob3I6IHN0YXJ0OwogICAgICB9CgogICAgICAvKiBkaXNhYmxlIHRleHQgc2VsZWN0aW9uICovCiAgICAgIHN2ZyAqOjpzZWxlY3Rpb24sCiAgICAgIHN2ZyAqOjotbW96LXNlbGVjdGlvbiwKICAgICAgc3ZnICo6Oi13ZWJraXQtc2VsZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgcmVjdC5zZWxlY3Rpb24gewogICAgICAgIGZpbGw6IHRyYW5zcGFyZW50OwogICAgICAgIHN0cm9rZTogIzMzMzsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiA0cHg7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuNTsKICAgICAgfQoKICAgICAgcmVjdC5ib3JkZXJlZCB7CiAgICAgICAgc3Ryb2tlOiAjZTZlNmU2OwogICAgICAgIHN0cm9rZS13aWR0aDogMnB4OwogICAgICB9CgogICAgICByZWN0LmNlbGwtYm9yZGVyIHsKICAgICAgICBzdHJva2U6ICNlZWU7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAwLjNweDsKICAgICAgfQoKICAgICAgcmVjdC5jZWxsLXNlbGVjdGVkIHsKICAgICAgICBzdHJva2U6IHJnYig1MSwgMTAyLCAxNTMpOwogICAgICAgIHN0cm9rZS13aWR0aDogMC41cHg7CiAgICAgIH0KCiAgICAgIHJlY3QuY2VsbC1ob3ZlciB7CiAgICAgICAgc3Ryb2tlOiAjZjAwOwogICAgICAgIHN0cm9rZS13aWR0aDogMC4zcHg7CiAgICAgIH0KCiAgICAgICN0b29sdGlwIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgICAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgICAgLW1vei1ib3JkZXItcmFkaXVzOiAxMHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgICAgLXdlYmtpdC1ib3gtc2hhZG93OiA0cHggNHB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICAgIC1tb3otYm94LXNoYWRvdzogNHB4IDRweCAxMHB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgICBib3gtc2hhZG93OiA0cHggNHB4IDEwcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMjAwcHg7CiAgICAgIH0KCiAgICAgICN0b29sdGlwLmhpZGRlbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgI3Rvb2x0aXAgcCB7CiAgICAgICAgZm9udDogMTJweCBzYW5zLXNlcmlmOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfQoKICAgICAgI292ZXJ2aWV3IHsKICAgICAgICBtYXJnaW4tbGVmdDogMjBweDsKICAgICAgfQoKICAgICAgcGFwZXItaXRlbTpob3Zlci5tZW51LW9wdGlvbiB7CiAgICAgICAgYmFja2dyb3VuZDogI2UwZTBlMDsKICAgICAgfQoKICAgICAgcGFwZXItc2xpZGVyIHsKICAgICAgICAtLXBhcGVyLXNsaWRlci1pbnB1dDogewogICAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICAgIH0KICAgICAgfQoKICAgICAgLm1ldHJpY3MtYnV0dG9uIHsKICAgICAgICBoZWlnaHQ6IDYwcHg7CiAgICAgICAgd2lkdGg6IDYwcHg7CiAgICAgIH0KCiAgICAgIC50b3BvLWhlYWRlciB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLXJvdy1sZWZ0IHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1mbG93OiByb3cgbm93cmFwOwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgICBsaW5lLWhlaWdodDogNTBweDsKICAgICAgICBtYXJnaW4tbGVmdDogMTZweDsKICAgICAgICB0ZXh0LWFsaWduOiBib3R0b207CiAgICAgIH0KCiAgICAgIC5tZXRyaWNzLWxhYmVsIHsKICAgICAgICBwYWRkaW5nOiAwLjVlbTsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICB9CgogICAgICAudG9wby10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGxpbmUtaGVpZ2h0OiAzMnB4OwogICAgICAgIHRleHQtYWxpZ246IGJvdHRvbTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOwogICAgICB9CgogICAgICAjY29udGFpbmVyIHsKICAgICAgICAvKiBUb29sdGlwIHNob3VsZCBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgY29udGFpbmVyLiAqLwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9InRvcG9sb2d5LWdyYXBoIj4KICAgICAgPGRpdiBjbGFzcz0idG9wby1oZWFkZXIgY29udGFpbmVyIGZsZXgtaG9yaXpvbnRhbCI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1yb3ctbGVmdCB0b3BvLXRpdGxlIj4KICAgICAgICAgIHt7X3RwdVR5cGV9fSB7e190b3RhbENvcmVDb3VudH19CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNvbnRyb2wtcm93LWxlZnQgbWV0cmljcy1sYWJlbCI+CiAgICAgICAgICBbW19nZXRTZWxlY3RlZE1ldHJpY0xhYmVsKG1ldHJpY3MsIHNlbGVjdGVkTWV0cmljSWR4KV1dPC9zcGFuPgogICAgICAgIDxwYXBlci1tZW51LWJ1dHRvbiBjbG9zZS1vbi1hY3RpdmF0ZT0idHJ1ZSI+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gcmFpc2VkIGljb249ImFycm93LWRyb3AtZG93biIgc2xvdD0iZHJvcGRvd24tdHJpZ2dlciIgY2xhc3M9ImRyb3Bkb3duLXRyaWdnZXIgbWV0cmljcy1idXR0b24iPgogICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tzZWxlY3RlZE1ldHJpY0lkeH19Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1ttZXRyaWNzXV0iPgogICAgICAgICAgICAgIDxwYXBlci1pdGVtIHZhbHVlPSJbW2l0ZW0ua2V5XV0iPltbaXRlbS5sYWJlbF1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgIDwvcGFwZXItbWVudS1idXR0b24+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICAgIDxkaXYgaWQ9InRwZ3JhcGgiPjwvZGl2PgogICAgICAgIDxkaXYgaWQ9InRvb2x0aXAiIGNsYXNzPSJoaWRkZW4iPgogICAgICAgICAgPHA+PHNwYW4gaWQ9InZhbHVlIj48L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJwb2Qtdmlld2VyLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxLjVlbTsKICAgICAgfQoKICAgICAgI2NvbnRyb2wgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1mbG93OiByb3cgbm93cmFwOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBwYWRkaW5nOiAwLjVlbTsKICAgICAgICB0ZXh0LWFsaWduOiBib3R0b207CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOwogICAgICB9CgogICAgICAuY29udHJvbC1yb3ctbGVmdCB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZmxvdzogcm93IG5vd3JhcDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgbGluZS1oZWlnaHQ6IDUwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDE2cHg7CiAgICAgICAgdGV4dC1hbGlnbjogYm90dG9tOwogICAgICB9CgogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIC0tcGFwZXItc2xpZGVyLWlucHV0OiB7CiAgICAgICAgICB3aWR0aDogMTAwcHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItc2xpZGVyLWhlaWdodDogM3B4OwogICAgICB9CgogICAgICAuc3RlcC1udW0tdGV4dCB7CiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIHBhZGRpbmctbGVmdDogMWVtOwogICAgICB9CgogICAgICAuc3RhY2stdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMjRweDsKICAgICAgICBsaW5lLWhlaWdodDogMzJweDsKICAgICAgfQoKICAgICAgLmJhci1jaGFydCB7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgICN0aXRsZSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5lcnJvci1tZXNzYWdlIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICAgIGZvbnQtc2l6ZTogMzJweDsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBtYXJnaW4tbGVmdDogMTZweDsKICAgICAgICBtYXJnaW4tdG9wOiAzMnB4OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0iZXJyb3ItbWVzc2FnZSIgaGlkZGVuPSJbWyFfZXJyb3JNZXNzYWdlXV0iPgogICAgICA8c3Bhbj5bW19lcnJvck1lc3NhZ2VdXTwvc3Bhbj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iY29udHJvbCIgaGlkZGVuPSJbW19lcnJvck1lc3NhZ2VdXSI+CiAgICAgIAogICAgICA8c3BhbiBjbGFzcz0iY29udHJvbC1yb3ctbGVmdCI+UGxlYXNlIHNlbGVjdCBhIHN0ZXAKICAgICAgICA8cGFwZXItc2xpZGVyIG1pbj0iMCIgbWF4PSJbW19tYXhTdGVwSWRdXSIgc25hcHMgc3RlcD0iMSIgdmFsdWU9Int7Y3VyU3RlcElkfX0iPgogICAgICAgIDwvcGFwZXItc2xpZGVyPgogICAgICAgIDxzcGFuIGNsYXNzPSJzdGVwLW51bS10ZXh0Ij5TdGVwIFtbX2dldFN0ZXBOdW0oX3BvZFN0YXRzTWFwKV1dPC9zcGFuPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9InBvZC12aWV3ZXItZGFzaGJvYXJkIiBoaWRkZW49IltbX2Vycm9yTWVzc2FnZV1dIj4KICAgICAgPGRpdiBpZD0idG9wby1ncmFwaCI+CiAgICAgICAgPHRvcG9sb2d5LWdyYXBoIHJ1bi1lbnZpcm9ubWVudD0iW1tfcnVuRW52aXJvbm1lbnRdXSIgZGF0YT0iW1tfcG9kU3RhdHNNYXBdXSIgbWV0cmljcz0iW1tfc3RlcEJyZWFrZG93bkxheWVyc11dIiBhY3RpdmUtYmFyPSJbW2FjdGl2ZUJhcl1dIj4KICAgICAgICA8L3RvcG9sb2d5LWdyYXBoPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBpZD0iY2hhbm5lbC1iYXJzIiBjbGFzcz0iYmFyLWNoYXJ0IiBoaWRkZW49IltbIV9jaGFubmVsRGJdXSI+CiAgICAgICAgPGRpdiBpZD0idGl0bGUiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3RhY2stdGl0bGUiPkxhdGVuY3kgb2YgU2VuZCBhbmQgUmVjdiBjaGFubmVsczwvZGl2PgogICAgICAgICAgPHA+KHgtYXhpczogY2hhbm5lbCBpZCwgeS1heGlzOiB0aW1lICjCtXMpKQogICAgICAgIDwvZGl2PgogICAgICAgIDxzdGFjay1iYXItY2hhcnQgZGF0YT0iW1tfY2hhbm5lbERiXV0iIHN0YWNrLWxheWVycz0iW1tfY2hhbm5lbExheWVyc11dIiB4LWRvbWFpbi1mdW5jPSJbW19jaGFubmVsRnVuY11dIiBhY3RpdmUtYmFyPSJ7e2FjdGl2ZUJhcn19Ij48L3N0YWNrLWJhci1jaGFydD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImFsbC1yZWR1Y2UtYmFycyIgY2xhc3M9ImJhci1jaGFydCIgaGlkZGVuPSJbWyFfYWxsUmVkdWNlRGJdXSI+CiAgICAgICAgPGRpdiBpZD0idGl0bGUiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3RhY2stdGl0bGUiPgogICAgICAgICAgICBEdXJhdGlvbiBvZiBhbGwtcmVkdWNlIG9wIG9yIGN1c3RvbSBmdXNpb24gZm9yIGFsbC1yZWR1Y2UKICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHA+CiAgICAgICAgICAgICh4LWF4aXM6IHNob3J0IG5hbWVzIGZvciBhbGwtcmVkdWNlcyBvcHMgKGEjKSBvciBmdXNpb24gKGYjKSwKICAgICAgICAgICAgeS1heGlzOiB0aW1lICjCtXMpKQogICAgICAgICAgCiAgICAgICAgPC9kaXY+CiAgICAgICAgPHN0YWNrLWJhci1jaGFydCBkYXRhPSJbW19hbGxSZWR1Y2VEYl1dIiBzdGFjay1sYXllcnM9IltbX2FsbFJlZHVjZUxheWVyc11dIiB4LWRvbWFpbi1mdW5jPSJbW19hbGxSZWR1Y2VGdW5jXV0iIGFjdGl2ZS1iYXI9Int7YWN0aXZlQmFyfX0iPjwvc3RhY2stYmFyLWNoYXJ0PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBpZD0ic3RhY2stYmFycyIgY2xhc3M9ImJhci1jaGFydCIgaGlkZGVuPSJbWyFfc3RlcFN0YXRzXV0iPgogICAgICAgIDxkaXYgaWQ9InRpdGxlIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN0YWNrLXRpdGxlIj5TdGVwIGJyZWFrZG93bjwvZGl2PgogICAgICAgICAgPHA+KHgtYXhpczogZ2xvYmFsIGNoaXAgaWQsIGNvcmUgaWQsIHktYXhpczogdGltZSAowrVzKSkKICAgICAgICA8L2Rpdj4KICAgICAgICA8c3RhY2stYmFyLWNoYXJ0IGRhdGE9IltbX3N0ZXBTdGF0c11dIiBzdGFjay1sYXllcnM9IltbX3N0ZXBCcmVha2Rvd25MYXllcnNdXSIgeC1kb21haW4tZnVuYz0iW1tfc3RlcEJyZWFrZG93bkZ1bmNdXSIgYWN0aXZlLWJhcj0ie3thY3RpdmVCYXJ9fSI+PC9zdGFjay1iYXItY2hhcnQ+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJnb29nbGUtY2hhcnQtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogLW1zLWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogNDAwcHg7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgfQoKICAgICAgOmhvc3QoW3R5cGU9J2dhdWdlJ10pIHsKICAgICAgICB3aWR0aDogMzAwcHg7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgfQoKICAgICAgI2NoYXJ0ZGl2IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJnb29nbGUtY2hhcnQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJnb29nbGUtY2hhcnQtc3R5bGVzIj48L3N0eWxlPgogICAgPGdvb2dsZS1jaGFydC1sb2FkZXIgaWQ9ImxvYWRlciIgdHlwZT0iW1t0eXBlXV0iPjwvZ29vZ2xlLWNoYXJ0LWxvYWRlcj4KICAgIDxkaXYgaWQ9ImNoYXJ0ZGl2Ij48L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0iZ29vZ2xlLWNoYXJ0LWRlbW8iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgY29kZSB7CiAgICAgICAgY29sb3I6ICMwMDcwMDA7CiAgICAgIH0KICAgICAgZ29vZ2xlLWNoYXJ0IHsKICAgICAgICBoZWlnaHQ6IDMwMHB4OwogICAgICAgIHdpZHRoOiA0MDBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgaWQ9ImRlbW8tYm9keSI+CiAgICAgIDxwPgogICAgICAgIFdlYnNpdGUgdHJhZmZpYyBkYXRhIGJ5IGNvdW50cnkgZnJvbSBhbiBleHRlcm5hbCBKU09OIHJlc291cmNlIHdoZXJlIHRoZQogICAgICAgIGRhdGEgaXMgaW4gcmF3IERhdGFUYWJsZSBmb3JtYXQuCiAgICAgIAogICAgICA8Z29vZ2xlLWNoYXJ0IHR5cGU9ImNvbHVtbiIgb3B0aW9ucz0ieyZxdW90O3RpdGxlJnF1b3Q7OiAmcXVvdDtWaXNpdG9ycyBieSBDb3VudHJ5JnF1b3Q7LCAmcXVvdDtsZWdlbmQmcXVvdDs6ICZxdW90O25vbmUmcXVvdDt9IiBkYXRhPSJbW19kYXRhXV0iPgogICAgICA8L2dvb2dsZS1jaGFydD4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXBsdWdpbi1kaWFsb2ciPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19vcGVuXV0iPgogICAgICA8ZGl2IGlkPSJkYXNoYm9hcmQtYmFja2Ryb3AiPjwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDxwYXBlci1kaWFsb2cgaWQ9ImRpYWxvZyIgbW9kYWwgb3BlbmVkPSJ7e19vcGVufX0iIHdpdGgtYmFja2Ryb3A9IltbX3VzZU5hdGl2ZUJhY2tkcm9wXV0iPgogICAgICA8aDIgaWQ9ImRpYWxvZy10aXRsZSI+W1tfdGl0bGVdXTwvaDI+CiAgICAgIDxkaXYgY2xhc3M9ImN1c3RvbS1tZXNzYWdlIj5bW19jdXN0b21NZXNzYWdlXV08L2Rpdj4KICAgIDwvcGFwZXItZGlhbG9nPgogICAgPHN0eWxlPgogICAgICAvKiogV2UgcmVseSBvbiBhIHNlcGFyYXRlIGBfaGlkZGVuYCBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRpcmVjdGx5IG1ha2luZyB1c2UKICAgICAgICAgIG9mIHRoZSBgX29wZW5gIGF0dHJpYnV0ZSBiZWNhdXNlIHRoaXMgQ1NTIHNwZWNpZmljYXRpb24gbWF5IHN0cmFuZ2VseQogICAgICAgICAgYWZmZWN0IG90aGVyIGVsZW1lbnRzIHRocm91Z2hvdXQgVGVuc29yQm9hcmQuIFNlZSAjODk5LiAqLwogICAgICAjZGFzaGJvYXJkLWJhY2tkcm9wIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAjZGlhbG9nLXRpdGxlIHsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTVweDsKICAgICAgfQoKICAgICAgLmN1c3RvbS1tZXNzYWdlIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1wcm9maWxlLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLXRvYXN0IGlkPSJ0b2FzdCIgZHVyYXRpb249IjAiIHRleHQ9IiIgYWx3YXlzLW9uLXRvcD4KICAgICAgPHBhcGVyLWJ1dHRvbiBvbmNsaWNrPSJ0b2FzdC50b2dnbGUoKSIgY2xhc3M9InllbGxvdy1idXR0b24iPkNsb3NlIG5vdyE8L3BhcGVyLWJ1dHRvbj4KICAgIDwvcGFwZXItdG9hc3Q+CiAgICA8dGYtcGx1Z2luLWRpYWxvZyBpZD0iaW5pdGlhbERpYWxvZyI+PC90Zi1wbHVnaW4tZGlhbG9nPgogICAgPHBhcGVyLWRpYWxvZyBpZD0iY2FwdHVyZVByb2ZpbGVEaWFsb2ciIG1vZGFsPgogICAgICA8cGFwZXItaW5wdXQgbGFiZWw9IlByb2ZpbGVyIFNlcnZpY2UgVVJMIG9yIFRQVSBuYW1lIiBhbHdheXMtZmxvYXQtbGFiZWwgcGxhY2Vob2xkZXI9ImxvY2FsaG9zdDo2MDA5IiB2YWx1ZT0ie3tfcHJvZmlsZXJTZXJ2aWNlQWRkcmVzc319IiBhdXRvLXZhbGlkYXRlIHJlcXVpcmVkPjwvcGFwZXItaW5wdXQ+CiAgICAgIDxsYWJlbCBpZD0icHJvZmlsZXItYWRkcmVzcy10eXBlLWxhYmVsIj5BZGRyZXNzIFR5cGU6PC9sYWJlbD4KICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIHNlbGVjdGVkPSJ7e19wcm9maWxlclNlcnZpY2VBZGRyZXNzVHlwZX19IiBhcmlhLWxhYmVsbGVkYnk9InByb2ZpbGVyLWFkZHJlc3MtdHlwZS1sYWJlbCI+CiAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJpcC1hZGRyZXNzIj5JUCBBZGRyZXNzPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJ0cHUtbmFtZSI+VFBVIE5hbWU8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgPHBhcGVyLWlucHV0IGxhYmVsPSJQcm9maWxpbmcgRHVyYXRpb24gKG1pbGxpc2Vjb25kcykiIGFsd2F5cy1mbG9hdC1sYWJlbCB0eXBlPSJudW1iZXIiIG1pbj0iMSIgbWF4PSI2MDAwMDAiIGF1dG8tdmFsaWRhdGUgcGF0dGVybj0iWzAtOV0rIiBlcnJvci1tZXNzYWdlPSJJbnB1dCBpcyBub3QgYW4gaW50ZWdlciBiZXR3ZWVuIDEgdG8gNjAwMDAwIiByZXF1aXJlZCB2YWx1ZT0ie3tfcHJvZmlsZUR1cmF0aW9ufX0iPjwvcGFwZXItaW5wdXQ+CgogICAgICA8cGFwZXItaW5wdXQgbGFiZWw9IkF1dG9tYXRpY2FsbHkgcmV0cnkgTiB0aW1lcyB3aGVuIG5vIHRyYWNlIGV2ZW50IGlzIGNvbGxlY3RlZCIgYWx3YXlzLWZsb2F0LWxhYmVsIHR5cGU9Im51bWJlciIgbWluPSIwIiBtYXg9IjEwMCIgYXV0by12YWxpZGF0ZSBwYXR0ZXJuPSJbMC05XSsiIGVycm9yLW1lc3NhZ2U9IklucHV0IGlzIG5vdCBhbiBpbnRlZ2VyIGJldHdlZW4gMCB0byAxMDAiIHJlcXVpcmVkIHZhbHVlPSJ7e19wcm9maWxlTnVtUmV0cnl9fSI+PC9wYXBlci1pbnB1dD4KCiAgICAgIDxkaXYgaGlkZGVuPSJ7eyFfc2hvdWxkU2hvd1RwdU9wdGlvbnMoX3Byb2ZpbGVyU2VydmljZUFkZHJlc3NUeXBlKX19Ij4KICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tfcHJvZmlsZUluY2x1ZGVEYXRhc2V0T3BzfX0iPlRyYWNlIGRhdGFzZXQgb3BzPC9wYXBlci1jaGVja2JveD4KICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9IlN1YnNldCBvZiB3b3JrZXIgVFBVcyB0byBwcm9maWxlIChvcHRpb25hbCkiIGFsd2F5cy1mbG9hdC1sYWJlbCBwbGFjZWhvbGRlcj0iTGlzdCBvZiBJUHMsIGUuZy4gMTAuNC4xLjIsMTAuNC4xLjMiIHZhbHVlPSJ7e19wcm9maWxlV29ya2VyTGlzdH19Ij48L3BhcGVyLWlucHV0PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iYnV0dG9ucyI+CiAgICAgICAgPHBhcGVyLWJ1dHRvbiBkaWFsb2ctY29uZmlybSByYWlzZWQgb24tdGFwPSJfY2FwdHVyZVByb2ZpbGUiIGRpc2FibGVkJD0iW1tfc2hvdWxkRGlzYWJsZUNhcHR1cmVQcm9maWxlQnV0dG9uKF9wcm9maWxlclNlcnZpY2VBZGRyZXNzLCBfcHJvZmlsZUR1cmF0aW9uLCBfcHJvZmlsZU51bVJldHJ5KV1dIj4KICAgICAgICAgIENhcHR1cmU8L3BhcGVyLWJ1dHRvbj4KICAgICAgICA8cGFwZXItYnV0dG9uIGRpYWxvZy1jb25maXJtPkNsb3NlPC9wYXBlci1idXR0b24+CiAgICAgIDwvZGl2PgogICAgPC9wYXBlci1kaWFsb2c+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzU3RhdGUoX3RvcExldmVsU3RhdGUsICdMT0FESU5HJyldXSI+CiAgICAgIDxkaXYgaWQ9InByb2dyZXNzLWJhciI+CiAgICAgICAgPGRpdiBpZD0icHJvZ3Jlc3MtbXNnIj5bW3Byb2dyZXNzLm1zZ11dPC9kaXY+CiAgICAgICAgPHBhcGVyLXByb2dyZXNzIHZhbHVlPSJbW3Byb2dyZXNzLnZhbHVlXV0iPjwvcGFwZXItcHJvZ3Jlc3M+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNTdGF0ZShfdG9wTGV2ZWxTdGF0ZSwgJ0RBVEFfTk9UX0ZPVU5EJyldXSI+CiAgICAgIDxkaXYgc3R5bGU9Im1heC13aWR0aDogNTQwcHg7IG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsiPgogICAgICAgIDxoMz5ObyBwcm9maWxlIGRhdGEgd2FzIGZvdW5kLjwvaDM+CgogICAgICAgIDxwYXBlci1idXR0b24gcmFpc2VkIG9uLXRhcD0iX29wZW5DYXB0dXJlUHJvZmlsZURpYWxvZyI+Q2FwdHVyZSBQcm9maWxlPC9wYXBlci1idXR0b24+CiAgICAgICAgPHBhcGVyLXNwaW5uZXIgY2xhc3M9ImNhcHR1cmUtc3Bpbm5lciIgYWN0aXZlPSJbW19jYXB0dXJpbmdQcm9maWxlXV0iPjwvcGFwZXItc3Bpbm5lcj4KCiAgICAgICAgPHA+CiAgICAgICAgICBJZiB5b3UgaGF2ZSBhIG1vZGVsIHJ1bm5pbmcgb24gQ1BVLCBHUFUsIG9yIEdvb2dsZSBDbG91ZCBUUFUsIHlvdSBtYXkKICAgICAgICAgIGJlIGFibGUgdG8gdXNlIHRoZSBhYm92ZSBidXR0b24gdG8gY2FwdHVyZSBhIHByb2ZpbGUuCiAgICAgICAgCgogICAgICAgIDxwPgogICAgICAgICAgSWYgeW914oCZcmUgYSBDUFUgb3IgR1BVIHVzZXIsIHBsZWFzZSB1c2UgdGhlIElQIGFkZHJlc3Mgb3B0aW9uLiBZb3UgbWF5CiAgICAgICAgICB3YW50IHRvIGNoZWNrIG91dCB0aGUKICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vY29sYWIucmVzZWFyY2guZ29vZ2xlLmNvbS9naXRodWIvdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9kb2NzL3IyL3RlbnNvcmJvYXJkX3Byb2ZpbGluZ19rZXJhcy5pcHluYiIgcmVsPSJub29wZW5lciIgdGFyZ2V0PSJfYmxhbmsiPnR1dG9yaWFsPC9hPgogICAgICAgICAgb24gaG93IHRvIHN0YXJ0IGEgVGVuc29yRmxvdyBwcm9maWxlciBzZXJ2ZXIgYW5kIHByb2ZpbGUgYSBLZXJhcyBtb2RlbAogICAgICAgICAgb24gYSBHUFUuCiAgICAgICAgCgogICAgICAgIDxwPgogICAgICAgICAgSWYgeW91J3JlIGEgVFBVIHVzZXIsIHBsZWFzZSB1c2UgdGhlIFRQVSBuYW1lIG9wdGlvbiBhbmQgeW91IG1heSB3YW50CiAgICAgICAgICB0byBjaGVjayBvdXQgdGhlCiAgICAgICAgICA8YSBocmVmPSJodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vdHB1L2RvY3MvY2xvdWQtdHB1LXRvb2xzIiByZWw9Im5vb3BlbmVyIiB0YXJnZXQ9Il9ibGFuayI+dHV0b3JpYWw8L2E+CiAgICAgICAgICBvbiBob3cgdG8gaW50ZXJwcmV0aW5nIHRoZSBwcm9maWxpbmcgcmVzdWx0cy4KICAgICAgICAKCiAgICAgICAgPHA+CiAgICAgICAgICBJZiB5b3UgdGhpbmsgcHJvZmlsaW5nIGlzIGRvbmUgcHJvcGVybHksIHBsZWFzZSBzZWUgdGhlIHBhZ2Ugb2YKICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS90cHUvZG9jcy90cm91Ymxlc2hvb3RpbmciIHJlbD0ibm9vcGVuZXIiIHRhcmdldD0iX2JsYW5rIj5Hb29nbGUgQ2xvdWQgVFBVIFRyb3VibGVzaG9vdGluZyBhbmQgRkFRPC9hPgogICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgCiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNTdGF0ZShfdG9wTGV2ZWxTdGF0ZSwgJ0FDVElWRScpXV0iPgogICAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImFsbGNvbnRyb2xzIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBvbi10YXA9Il9vcGVuQ2FwdHVyZVByb2ZpbGVEaWFsb2ciPkNhcHR1cmUgUHJvZmlsZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1zcGlubmVyIGNsYXNzPSJjYXB0dXJlLXNwaW5uZXIiIGFjdGl2ZT0iW1tfY2FwdHVyaW5nUHJvZmlsZV1dIj48L3BhcGVyLXNwaW5uZXI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICAgICAgICAgIFJ1bnMgPHNwYW4gY2xhc3M9ImNvdW50ZXIiPihbW19kYXRhc2V0cy5sZW5ndGhdXSk8L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQgbm8tYW5pbWF0aW9ucyBub2luayBob3Jpem9udGFsLWFsaWduPSJsZWZ0Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGlkPSJsaXN0X2JveF9ydW4iIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e3NlbGVjdGVkRGF0YXNldEluZGV4fX0iPgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWQ9InJ1bl9pdGVtcyIgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19kYXRhc2V0c11dIj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5bW2l0ZW0ubmFtZV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPgogICAgICAgICAgICAgICAgVG9vbHMgPHNwYW4gY2xhc3M9ImNvdW50ZXIiPihbW19hY3RpdmVUb29sc0xpc3QubGVuZ3RoXV0pPC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0IG5vLWFuaW1hdGlvbnMgbm9pbmsgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCI+CiAgICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBpZD0ibGlzdF9ib3hfdG9vbCIgc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7c2VsZWN0ZWRUb29sSW5kZXh9fSI+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZD0idG9vbF9pdGVtcyIgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19hY3RpdmVUb29sc0xpc3RdXSI+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+W1tpdGVtXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2hhc0FjdGl2ZVRvb2xzKCldXSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+Tm9uZTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICAgICAgICAgIEhvc3RzIDxzcGFuIGNsYXNzPSJjb3VudGVyIj4oW1tfYWN0aXZlSG9zdHNMaXN0Lmxlbmd0aF1dKTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdCBuby1hbmltYXRpb25zIG5vaW5rIGhvcml6b250YWwtYWxpZ249ImxlZnQiPgogICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggaWQ9Imxpc3RfYm94X2hvc3QiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e3NlbGVjdGVkSG9zdEluZGV4fX0iPgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaWQ9Imhvc3RfaXRlbXMiIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfYWN0aXZlSG9zdHNMaXN0XV0iPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPltbX2dldEhvc3REaXNwbGF5TmFtZShpdGVtKV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBkZXRhaWxzLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0N1cnJlbnRUb29sKF90b29sSW5TY29wZSwgJ29wX3Byb2ZpbGUnKV1dIiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICAgICAgICAgIDx0Zi1vcC1kZXRhaWxzIGhpZGRlbj0iW1shX2FjdGl2ZU9wRGV0YWlsc11dIiBub2RlPSJbW19hY3RpdmVPcERldGFpbHNdXSI+PC90Zi1vcC1kZXRhaWxzPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0N1cnJlbnRUb29sKF90b29sSW5TY29wZSwgJ21lbW9yeV92aWV3ZXInKV1dIiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICAgICAgICAgIDxidWZmZXItZGV0YWlscyBoaWRkZW49IltbIV9hY3RpdmVCdWZmZXJEZXRhaWxzXV0iIG5vZGU9IltbX2FjdGl2ZUJ1ZmZlckRldGFpbHNdXSI+PC9idWZmZXItZGV0YWlscz4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNDdXJyZW50VG9vbChfdG9vbEluU2NvcGUsICdwb2Rfdmlld2VyJyldXSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgICAgICA8ZGV0YWlscy1jYXJkIGhpZGRlbj0iW1shX2FjdGl2ZVBvZERldGFpbHNdXSIgbm9kZXM9IltbX2FjdGl2ZVBvZERldGFpbHNdXSI+PC9kZXRhaWxzLWNhcmQ+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzQ3VycmVudFRvb2woX3Rvb2xJblNjb3BlLCAndHJhY2Vfdmlld2VyJyldXSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgIDxpZnJhbWUgaWQ9InR2X2lmcmFtZSIgaGVpZ2h0PSIxMDAlIiB3aWR0aD0iMTAwJSIgc3JjJD0iW1tfdHJhY2VEYXRhVXJsXV0iPgogICAgICAgICAgICA8L2lmcmFtZT4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzQ3VycmVudFRvb2woX3Rvb2xJblNjb3BlLCAnb3BfcHJvZmlsZScpXV0iIHJlc3RhbXA9InRydWUiPgogICAgICAgICAgICA8dGYtb3AtcHJvZmlsZSBfZGF0YT0iW1tfb3BQcm9maWxlRGF0YV1dIiBhY3RpdmU9Int7X2FjdGl2ZU9wRGV0YWlsc319Ij48L3RmLW9wLXByb2ZpbGU+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0N1cnJlbnRUb29sKF90b29sSW5TY29wZSwgJ2lucHV0X3BpcGVsaW5lX2FuYWx5emVyJyldXSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgIDxpbnB1dC1waXBlbGluZS1hbmFseXplciBfZGF0YT0iW1tfaW5wdXRQaXBlbGluZURhdGFdXSI+PC9pbnB1dC1waXBlbGluZS1hbmFseXplcj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzQ3VycmVudFRvb2woX3Rvb2xJblNjb3BlLCAnb3ZlcnZpZXdfcGFnZScpXV0iIHJlc3RhbXA9InRydWUiPgogICAgICAgICAgICA8b3ZlcnZpZXctcGFnZSBfZGF0YT0iW1tfb3ZlcnZpZXdQYWdlRGF0YV1dIj48L292ZXJ2aWV3LXBhZ2U+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0N1cnJlbnRUb29sKF90b29sSW5TY29wZSwgJ3BvZF92aWV3ZXInKV1dIiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICAgICAgPHBvZC12aWV3ZXItZGFzaGJvYXJkIGRhdGE9IltbX3BvZFZpZXdlckRhdGFdXSIgYWN0aXZlLWRldGFpbHM9Int7X2FjdGl2ZVBvZERldGFpbHN9fSI+PC9wb2Qtdmlld2VyLWRhc2hib2FyZD4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzQ3VycmVudFRvb2woX3Rvb2xJblNjb3BlLCAnbWVtb3J5X3ZpZXdlcicpXV0iIHJlc3RhbXA9InRydWUiPgogICAgICAgICAgICA8bWVtb3J5LXZpZXdlci1kYXNoYm9hcmQgX2RhdGE9IltbX21lbW9yeVZpZXdlckRhdGFdXSIgYWN0aXZlPSJ7e19hY3RpdmVCdWZmZXJEZXRhaWxzfX0iPjwvbWVtb3J5LXZpZXdlci1kYXNoYm9hcmQ+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0N1cnJlbnRUb29sKF90b29sSW5TY29wZSwgJ2dvb2dsZV9jaGFydF9kZW1vJyldXSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgIDxnb29nbGUtY2hhcnQtZGVtbyBfZGF0YT0iW1tfZ29vZ2xlQ2hhcnREZW1vRGF0YV1dIj48L2dvb2dsZS1jaGFydC1kZW1vPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CgogICAgPHN0eWxlPgogICAgICAuY2VudGVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIGlmcmFtZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CiAgICAgICNwcm9ncmVzcy1iYXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDQwcHg7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KICAgICAgI3Byb2dyZXNzLW1zZyB7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgfQogICAgICBwYXBlci1wcm9ncmVzcyB7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtaGVpZ2h0OiA2cHg7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1hY3RpdmUtY29sb3I6ICNmMzkxM2U7CiAgICAgIH0KICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLmRldGFpbHMtY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiA1cHg7CiAgICAgIH0KICAgICAgdGYtb3AtZGV0YWlscywKICAgICAgYnVmZmVyLWRldGFpbHMsCiAgICAgIGRldGFpbHMtY2FyZCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQogICAgICAueWVsbG93LWJ1dHRvbiB7CiAgICAgICAgY29sb3I6ICNlZWZmNDE7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgIH0KICAgICAgLmNhcHR1cmUtc3Bpbm5lciB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiA1cHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1iZWhvbGRlci12aWRlbyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0iY29udGFpbmVyIj4KICAgICAgPGltZyBpZD0idmlkZW8iIHNyYyQ9IltbX2ltYWdlVVJMXV0iPgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICBpbWcgewogICAgICAgIGltYWdlLXJlbmRlcmluZzogcGl4ZWxhdGVkOwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWJlaG9sZGVyLWluZm8iPgogIDx0ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2l0ZW1zXV0iPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLWluZm8iIHN0eWxlJD0iaGVpZ2h0OiBbW2l0ZW0uaGVpZ2h0XV1weCI+CiAgICAgICAgPHVsPgogICAgICAgICAgPGxpPltbaXRlbS5uYW1lXV08L2xpPgogICAgICAgICAgPGxpPnNoYXBlOiBbW2l0ZW0uc2hhcGVdXTwvbGk+CiAgICAgICAgICA8bGk+cmFuZ2U6IFsgW1tpdGVtLm1pbl1dLCBbW2l0ZW0ubWF4XV0gXTwvbGk+CiAgICAgICAgICA8bGk+bWVhbjogW1tpdGVtLm1lYW5dXTwvbGk+CiAgICAgICAgPC91bD4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgoKICAgIDxzdHlsZT4KICAgICAgLnNlY3Rpb24taW5mbyB7CiAgICAgICAgbWFyZ2luOiAwIDAgNXB4IDA7CiAgICAgIH0KICAgICAgLnNlY3Rpb24taW5mbyB1bCB7CiAgICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtYmVob2xkZXItZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtcGx1Z2luLWRpYWxvZyBpZD0iaW5pdGlhbERpYWxvZyI+PC90Zi1wbHVnaW4tZGlhbG9nPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8cCBjbGFzcz0iY29udHJvbHMtZGlzYWJsZWQtbWVzc2FnZSI+CiAgICAgICAgICAgICAgQ29udHJvbHMgZGlzYWJsZWQ6IGRpcmVjdG9yeSBpcyBub3Qgd3JpdGVhYmxlLgogICAgICAgICAgICAKICAgICAgICAgICAgPHAgY2xhc3M9ImRpc2NsYWltZXIiPgogICAgICAgICAgICAgIEJlaG9sZGVyIHJlcXVpcmVzIHdyaXRlIGFjY2VzcyB0byB0aGUgbG9nIGRpcmVjdG9yeSBpbiBvcmRlciB0bwogICAgICAgICAgICAgIGNvbW11bmljYXRlIHZpc3VhbGl6YXRpb24gY2hhbmdlcyB0byB0aGUgPGNvZGU+QmVob2xkZXI8L2NvZGU+CiAgICAgICAgICAgICAgaW5zdGFuY2UgaW4geW91ciBtb2RlbC4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8aDM+VmFsdWVzPC9oMz4KICAgICAgICAgIDxwYXBlci1yYWRpby1ncm91cCBpZD0idmFsdWVzU2VsZWN0b3IiIHNlbGVjdGVkPSJ7e192YWx1ZXN9fSI+CiAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0idHJhaW5hYmxlX3ZhcmlhYmxlcyIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgIDxwcmU+dGYudHJhaW5hYmxlX3ZhcmlhYmxlcygpPC9wcmU+CiAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJvcHRpb24tYXJyYXlzIiBuYW1lPSJhcnJheXMiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICA8cHJlPmIudXBkYXRlKGFycmF5cz1bTlBfQVJSQVlTXSk8L3ByZT4KICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9Im9wdGlvbi1mcmFtZXMiIG5hbWU9ImZyYW1lcyIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgIDxwcmU+Yi51cGRhdGUoZnJhbWU9TlBfQVJSQVkpPC9wcmU+CiAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3ZhbHVlc05vdEZyYW1lKF92YWx1ZXMpXV0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tfc2hvd0FsbH19IiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+U2hvdyBhbGwgZGF0YSA8aT4oY2FuIGJlIHJlc291cmNlIGludGVuc2l2ZSk8L2k+PC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdmFsdWVzTm90RnJhbWUoX3ZhbHVlcyldXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8aDM+TW9kZTwvaDM+CiAgICAgICAgICAgIDxwYXBlci1yYWRpby1ncm91cCBpZD0ibW9kZVNlbGVjdG9yIiBzZWxlY3RlZD0ie3tfbW9kZX19Ij4KICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9ImN1cnJlbnQiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICAgIGN1cnJlbnQgdmFsdWVzCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJ2YXJpYW5jZSIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgICAgdmFyaWFuY2Ugb3ZlciB0cmFpbiBzdGVwcwogICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3ZhcmlhbmNlU2VsZWN0ZWQoX21vZGUpXV0iPgogICAgICAgICAgICAgIDxoND5WYXJpYW5jZSB0aW1lc3RlcHM6IHt7X3dpbmRvd1NpemV9fTwvaDQ+CiAgICAgICAgICAgICAgPHBhcGVyLXNsaWRlciBpZD0id2luZG93U2xpZGVyIiB2YWx1ZT0ie3tfd2luZG93U2l6ZX19IiB0eXBlPSJudW1iZXIiIHN0ZXA9IjEiIG1pbj0iMiIgbWF4PSIyMCIgcGluPSJ0cnVlIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgPC9wYXBlci1zbGlkZXI+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8aDM+SW1hZ2Ugc2NhbGluZzwvaDM+CiAgICAgICAgICAgIDxwYXBlci1yYWRpby1ncm91cCBpZD0ic2NhbGluZ1NlbGVjdG9yIiBzZWxlY3RlZD0ie3tfc2NhbGluZ319Ij4KICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJvcHRpb24tbGF5ZXIiIG5hbWU9ImxheWVyIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgICBwZXIgc2VjdGlvbgogICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGZvcj0ib3B0aW9uLWxheWVyIiBwb3NpdGlvbj0icmlnaHQiPgogICAgICAgICAgICAgICAgQmxhY2sgaXMgdGhlIGxvd2VzdCB2YWx1ZSBpbiB0aGF0IHNlY3Rpb24sIHdoaXRlIGlzIHRoYXQgbGFyZ2VzdAogICAgICAgICAgICAgICAgdmFsdWUgaW4gdGhhdCBzZWN0aW9uLgogICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KCiAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ib3B0aW9uLW5ldHdvcmsiIG5hbWU9Im5ldHdvcmsiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICAgIGFsbCBzZWN0aW9ucwogICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGZvcj0ib3B0aW9uLW5ldHdvcmsiIHBvc2l0aW9uPSJyaWdodCI+CiAgICAgICAgICAgICAgICBCbGFjayBpcyB0aGUgc21hbGxlc3QgdmFsdWUgaW4gYWxsIHNlY3Rpb25zLCB3aGl0ZSBpcyB0aGUKICAgICAgICAgICAgICAgIGxhcmdlc3QgdmFsdWUgaW4gYWxsIHNlY3Rpb25zLgogICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KCiAgICAgICAgICAgIDxkaXYgaWQ9ImNvbG9ybWFwLXNlbGVjdGlvbiI+CiAgICAgICAgICAgICAgPGRpdiBpZD0iY29sb3JtYXAtc2VsZWN0aW9uLWxhYmVsIj5Db2xvcm1hcDo8L2Rpdj4KICAgICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdCBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19jb2xvcm1hcH19IiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0iMCI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPm1hZ21hPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5pbmZlcm5vPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5wbGFzbWE8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPnZpcmlkaXM8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmdyYXlzY2FsZTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxoMz5VcGRhdGVzIHBlciBzZWNvbmQ6IHt7X0ZQU319PC9oMz4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9IkZQU1NsaWRlciIgdmFsdWU9Int7X0ZQU319IiB0eXBlPSJudW1iZXIiIHN0ZXA9IjEiIG1pbj0iMCIgbWF4PSIzMCIgcGluPSJ0cnVlIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICA8L3BhcGVyLXNsaWRlcj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gY2xhc3M9IngtYnV0dG9uIiBpZD0icmVjb3JkX2J1dHRvbiIgb24tdGFwPSJfdG9nZ2xlUmVjb3JkIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgW1tfcmVjb3JkVGV4dF1dCiAgICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8cCBjbGFzcz0iZGlzY2xhaW1lciI+CiAgICAgICAgICAgIE5vdGU6IEJlaG9sZGVyIGN1cnJlbnRseSBvbmx5IHdvcmtzIHdlbGwgb24gbG9jYWwgZmlsZSBzeXN0ZW1zLgogICAgICAgICAgCiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaXNfYWN0aXZlXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIEJlaG9sZGVyIGRhdGEgd2FzIGZvdW5kLjwvaDM+CgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91ciBzY3JpcHQgaXNuJ3QgcnVubmluZy48L2xpPgogICAgICAgICAgICAgIDxsaT5Zb3UgYXJlbid0IGNhbGxpbmcgPGNvZGU+YmVob2xkZXIudXBkYXRlKCk8L2NvZGU+LjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBUbyB1c2UgQmVob2xkZXIsIGltcG9ydCBhbmQgaW5zdGFudGlhdGUgdGhlCiAgICAgICAgICAgICAgPGNvZGU+QmVob2xkZXI8L2NvZGU+IGNsYXNzLCBhbmQgY2FsbCBpdHMKICAgICAgICAgICAgICA8Y29kZT51cGRhdGU8L2NvZGU+IG1ldGhvZCB3aXRoIGEgPGNvZGU+U2Vzc2lvbjwvY29kZT4gYXJndW1lbnQKICAgICAgICAgICAgICBhZnRlciBldmVyeSB0cmFpbiBzdGVwOgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwcmU+ZnJvbSB0ZW5zb3Jib2FyZC5wbHVnaW5zLmJlaG9sZGVyIGltcG9ydCBCZWhvbGRlcgpiZWhvbGRlciA9IEJlaG9sZGVyKExPR19ESVJFQ1RPUlkpCgojIGluc2lkZSB0cmFpbiBsb29wCmJlaG9sZGVyLnVwZGF0ZSgKICBzZXNzaW9uPXNlc3MsCiAgYXJyYXlzPWxpc3Rfb2ZfbnBfYXJyYXlzLCAgIyBvcHRpb25hbCBhcmd1bWVudAogIGZyYW1lPXR3b19kaW1lbnNpb25hbF9ucF9hcnJheSwgICMgb3B0aW9uYWwgYXJndW1lbnQKKTwvcHJlPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB1c2luZyA8Y29kZT50Zi50cmFpbi5Nb25pdG9yZWRTZXNzaW9uPC9jb2RlPiwgeW91IGNhbiB1c2UKICAgICAgICAgICAgICA8Y29kZT5CZWhvbGRlckhvb2s8L2NvZGU+OgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwcmU+ZnJvbSB0ZW5zb3Jib2FyZC5wbHVnaW5zLmJlaG9sZGVyIGltcG9ydCBCZWhvbGRlckhvb2sKYmVob2xkZXJfaG9vayA9IEJlaG9sZGVySG9vayhMT0dfRElSRUNUT1JZKQp3aXRoIE1vbml0b3JlZFNlc3Npb24oLi4uLCBob29rcz1bYmVob2xkZXJfaG9va10pIGFzIHNlc3M6CiAgc2Vzcy5ydW4odHJhaW5fb3ApPC9wcmU+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgZXZlcnl0aGluZyBpcyBzZXQgdXAgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci90ZW5zb3Jib2FyZC9wbHVnaW5zL2JlaG9sZGVyL1JFQURNRS5tZCI+dGhlIFJFQURNRTwvYT4KICAgICAgICAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cCBjbGFzcz0iZGlzY2xhaW1lciI+CiAgICAgICAgICAgICAgTm90ZTogQmVob2xkZXIgY3VycmVudGx5IG9ubHkgd29ya3Mgd2VsbCBvbiBsb2NhbCBmaWxlIHN5c3RlbXMuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc19hY3RpdmVdXSI+CiAgICAgICAgICA8dGYtYmVob2xkZXItdmlkZW8gaWQ9InZpZGVvIiBmcHM9IltbX0ZQU11dIj48L3RmLWJlaG9sZGVyLXZpZGVvPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdmFsdWVzTm90RnJhbWUoX3ZhbHVlcyldXSI+CiAgICAgICAgICAgIDx0Zi1iZWhvbGRlci1pbmZvIGlkPSJpbmZvIiBmcHM9IltbX0ZQU11dIj4gPC90Zi1iZWhvbGRlci1pbmZvPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5jZW50ZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMDsKICAgICAgfQoKICAgICAgcGFwZXItY2hlY2tib3ggewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItcmFkaW8tYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIHBhZGRpbmc6IDVweDsKCiAgICAgICAgLS1wYXBlci1yYWRpby1idXR0b24tcmFkaW8tY29udGFpbmVyOiB7CiAgICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB9CgogICAgICAgIC0tcGFwZXItcmFkaW8tYnV0dG9uLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgfQogICAgICB9CgogICAgICBwYXBlci1yYWRpby1ncm91cCB7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICBmbGV4LWdyb3c6IDI7CiAgICAgIH0KCiAgICAgIHByZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lOwogICAgICB9CgogICAgICBwYXBlci1idXR0b24jcmVjb3JkX2J1dHRvbiB7CiAgICAgICAgY29sb3I6ICNkMzJmMmY7CiAgICAgIH0KCiAgICAgIHBhcGVyLWJ1dHRvbiNyZWNvcmRfYnV0dG9uLmlzLXJlY29yZGluZyB7CiAgICAgICAgYmFja2dyb3VuZDogI2QzMmYyZjsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24uYmVob2xkZXItZGFzaGJvYXJkOmxhc3QtY2hpbGQgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQoKICAgICAgI2NvbG9ybWFwLXNlbGVjdGlvbiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KCiAgICAgICNjb2xvcm1hcC1zZWxlY3Rpb24tbGFiZWwgewogICAgICAgIG1hcmdpbi10b3A6IDEzcHg7CiAgICAgIH0KCiAgICAgICNjb2xvcm1hcC1zZWxlY3Rpb24gcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIHdpZHRoOiAxMDVweDsKICAgICAgfQoKICAgICAgaDQgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIG1hcmdpbjogNXB4IDA7CiAgICAgIH0KCiAgICAgIHAuZGlzY2xhaW1lciB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICB9CgogICAgICBwLmNvbnRyb2xzLWRpc2FibGVkLW1lc3NhZ2UgewogICAgICAgIGNvbG9yOiAjYzAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CgogICAgICAuc2lkZWJhciB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGlyb24taWNvbnNldC1zdmcgbmFtZT0iYXYiIHNpemU9IjI0Ij4KPHN2Zz48ZGVmcz4KPGcgaWQ9ImFkZC10by1xdWV1ZSI+PHBhdGggZD0iTTIxIDNIM2MtMS4xMSAwLTIgLjg5LTIgMnYxMmMwIDEuMS44OSAyIDIgMmg1djJoOHYtMmg1YzEuMSAwIDEuOTktLjkgMS45OS0yTDIzIDVjMC0xLjExLS45LTItMi0yem0wIDE0SDNWNWgxOHYxMnptLTUtN3YyaC0zdjNoLTJ2LTNIOHYtMmgzVjdoMnYzaDN6IiAvPjwvZz4KPGcgaWQ9ImFpcnBsYXkiPjxwYXRoIGQ9Ik02IDIyaDEybC02LTZ6TTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmg0di0ySDNWNWgxOHYxMmgtNHYyaDRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0iYWxidW0iPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE0LjVjLTIuNDkgMC00LjUtMi4wMS00LjUtNC41UzkuNTEgNy41IDEyIDcuNXM0LjUgMi4wMSA0LjUgNC41LTIuMDEgNC41LTQuNSA0LjV6bTAtNS41Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6IiAvPjwvZz4KPGcgaWQ9ImFydC10cmFjayI+PHBhdGggZD0iTTIyIDEzaC04di0yaDh2MnptMC02aC04djJoOFY3em0tOCAxMGg4di0yaC04djJ6bS0yLTh2NmMwIDEuMS0uOSAyLTIgMkg0Yy0xLjEgMC0yLS45LTItMlY5YzAtMS4xLjktMiAyLTJoNmMxLjEgMCAyIC45IDIgMnptLTEuNSA2bC0yLjI1LTMtMS43NSAyLjI2LTEuMjUtMS41MUwzLjUgMTVoN3oiIC8+PC9nPgo8ZyBpZD0iYXYtdGltZXIiPjxwYXRoIGQ9Ik0xMSAxN2MwIC41NS40NSAxIDEgMXMxLS40NSAxLTEtLjQ1LTEtMS0xLTEgLjQ1LTEgMXptMC0xNHY0aDJWNS4wOGMzLjM5LjQ5IDYgMy4zOSA2IDYuOTIgMCAzLjg3LTMuMTMgNy03IDdzLTctMy4xMy03LTdjMC0xLjY4LjU5LTMuMjIgMS41OC00LjQyTDEyIDEzbDEuNDEtMS40MS02LjgtNi44di4wMkM0LjQyIDYuNDUgMyA5LjA1IDMgMTJjMCA0Ljk3IDQuMDIgOSA5IDkgNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTloLTF6bTcgOWMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMSAuNDUgMSAxIDEgMS0uNDUgMS0xek02IDEyYzAgLjU1LjQ1IDEgMSAxczEtLjQ1IDEtMS0uNDUtMS0xLTEtMSAuNDUtMSAxeiIgLz48L2c+CjxnIGlkPSJicmFuZGluZy13YXRlcm1hcmsiPjxwYXRoIGQ9Ik0yMSAzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNmgtOXYtNmg5djZ6IiAvPjwvZz4KPGcgaWQ9ImNhbGwtdG8tYWN0aW9uIj48cGF0aCBkPSJNMjEgM0gzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTZIM3YtM2gxOHYzeiIgLz48L2c+CjxnIGlkPSJjbG9zZWQtY2FwdGlvbiI+PHBhdGggZD0iTTE5IDRINWMtMS4xMSAwLTIgLjktMiAydjEyYzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bS04IDdIOS41di0uNWgtMnYzaDJWMTNIMTF2MWMwIC41NS0uNDUgMS0xIDFIN2MtLjU1IDAtMS0uNDUtMS0xdi00YzAtLjU1LjQ1LTEgMS0xaDNjLjU1IDAgMSAuNDUgMSAxdjF6bTcgMGgtMS41di0uNWgtMnYzaDJWMTNIMTh2MWMwIC41NS0uNDUgMS0xIDFoLTNjLS41NSAwLTEtLjQ1LTEtMXYtNGMwLS41NS40NS0xIDEtMWgzYy41NSAwIDEgLjQ1IDEgMXYxeiIgLz48L2c+CjxnIGlkPSJlcXVhbGl6ZXIiPjxwYXRoIGQ9Ik0xMCAyMGg0VjRoLTR2MTZ6bS02IDBoNHYtOEg0djh6TTE2IDl2MTFoNFY5aC00eiIgLz48L2c+CjxnIGlkPSJleHBsaWNpdCI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNCA2aC00djJoNHYyaC00djJoNHYySDlWN2g2djJ6IiAvPjwvZz4KPGcgaWQ9ImZhc3QtZm9yd2FyZCI+PHBhdGggZD0iTTQgMThsOC41LTZMNCA2djEyem05LTEydjEybDguNS02TDEzIDZ6IiAvPjwvZz4KPGcgaWQ9ImZhc3QtcmV3aW5kIj48cGF0aCBkPSJNMTEgMThWNmwtOC41IDYgOC41IDZ6bS41LTZsOC41IDZWNmwtOC41IDZ6IiAvPjwvZz4KPGcgaWQ9ImZlYXR1cmVkLXBsYXktbGlzdCI+PHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tOSA4SDNWOWg5djJ6bTAtNEgzVjVoOXYyeiIgLz48L2c+CjxnIGlkPSJmZWF0dXJlZC12aWRlbyI+PHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tOSA5SDNWNWg5djd6IiAvPjwvZz4KPGcgaWQ9ImZpYmVyLWR2ciI+PHBhdGggZD0iTTE3LjUgMTAuNWgydjFoLTJ6bS0xMyAwaDJ2M2gtMnpNMjEgM0gzYy0xLjExIDAtMiAuODktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE4YzEuMTEgMCAyLS45IDItMlY1YzAtMS4xMS0uODktMi0yLTJ6TTggMTMuNWMwIC44NS0uNjUgMS41LTEuNSAxLjVIM1Y5aDMuNWMuODUgMCAxLjUuNjUgMS41IDEuNXYzem00LjYyIDEuNWgtMS41TDkuMzcgOWgxLjVsMSAzLjQzIDEtMy40M2gxLjVsLTEuNzUgNnpNMjEgMTEuNWMwIC42LS40IDEuMTUtLjkgMS40TDIxIDE1aC0xLjVsLS44NS0ySDE3LjV2MkgxNlY5aDMuNWMuODUgMCAxLjUuNjUgMS41IDEuNXYxeiIgLz48L2c+CjxnIGlkPSJmaWJlci1tYW51YWwtcmVjb3JkIj48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI4IiAvPjwvZz4KPGcgaWQ9ImZpYmVyLW5ldyI+PHBhdGggZD0iTTIwIDRINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMThjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWNmMwLTEuMTEtLjg5LTItMi0yek04LjUgMTVINy4zbC0yLjU1LTMuNVYxNUgzLjVWOWgxLjI1bDIuNSAzLjVWOUg4LjV2NnptNS00Ljc0SDExdjEuMTJoMi41djEuMjZIMTF2MS4xMWgyLjVWMTVoLTRWOWg0djEuMjZ6bTcgMy43NGMwIC41NS0uNDUgMS0xIDFoLTRjLS41NSAwLTEtLjQ1LTEtMVY5aDEuMjV2NC41MWgxLjEzVjkuOTloMS4yNXYzLjUxaDEuMTJWOWgxLjI1djV6IiAvPjwvZz4KPGcgaWQ9ImZpYmVyLXBpbiI+PHBhdGggZD0iTTUuNSAxMC41aDJ2MWgtMnpNMjAgNEg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY2YzAtMS4xMS0uODktMi0yLTJ6TTkgMTEuNWMwIC44NS0uNjUgMS41LTEuNSAxLjVoLTJ2Mkg0VjloMy41Yy44NSAwIDEuNS42NSAxLjUgMS41djF6bTMuNSAzLjVIMTFWOWgxLjV2NnptNy41IDBoLTEuMmwtMi41NS0zLjVWMTVIMTVWOWgxLjI1bDIuNSAzLjVWOUgyMHY2eiIgLz48L2c+CjxnIGlkPSJmaWJlci1zbWFydC1yZWNvcmQiPjxnPjxjaXJjbGUgY3g9IjkiIGN5PSIxMiIgcj0iOCIgLz48cGF0aCBkPSJNMTcgNC4yNnYyLjA5YzIuMzMuODIgNCAzLjA0IDQgNS42NXMtMS42NyA0LjgzLTQgNS42NXYyLjA5YzMuNDUtLjg5IDYtNC4wMSA2LTcuNzRzLTIuNTUtNi44NS02LTcuNzR6IiAvPjwvZz48L2c+CjxnIGlkPSJmb3J3YXJkLTEwIj48cGF0aCBkPSJNNCAxM2MwIDQuNCAzLjYgOCA4IDhzOC0zLjYgOC04aC0yYzAgMy4zLTIuNyA2LTYgNnMtNi0yLjctNi02IDIuNy02IDYtNnY0bDUtNS01LTV2NGMtNC40IDAtOCAzLjYtOCA4em02LjggM0gxMHYtMy4zTDkgMTN2LS43bDEuOC0uNmguMVYxNnptNC4zLTEuOGMwIC4zIDAgLjYtLjEuOGwtLjMuNnMtLjMuMy0uNS4zLS40LjEtLjYuMS0uNCAwLS42LS4xLS4zLS4yLS41LS4zLS4yLS4zLS4zLS42LS4xLS41LS4xLS44di0uN2MwLS4zIDAtLjYuMS0uOGwuMy0uNnMuMy0uMy41LS4zLjQtLjEuNi0uMS40IDAgLjYuMS4zLjIuNS4zLjIuMy4zLjYuMS41LjEuOHYuN3ptLS44LS44di0uNXMtLjEtLjItLjEtLjMtLjEtLjEtLjItLjItLjItLjEtLjMtLjEtLjIgMC0uMy4xbC0uMi4ycy0uMS4yLS4xLjN2MnMuMS4yLjEuMy4xLjEuMi4yLjIuMS4zLjEuMiAwIC4zLS4xbC4yLS4ycy4xLS4yLjEtLjN2LTEuNXoiIC8+PC9nPgo8ZyBpZD0iZm9yd2FyZC0zMCI+PHBhdGggZD0iTTkuNiAxMy41aC40Yy4yIDAgLjQtLjEuNS0uMnMuMi0uMi4yLS40di0uMnMtLjEtLjEtLjEtLjItLjEtLjEtLjItLjFoLS41cy0uMS4xLS4yLjEtLjEuMS0uMS4ydi4yaC0xYzAtLjIgMC0uMy4xLS41cy4yLS4zLjMtLjQuMy0uMi40LS4yLjQtLjEuNS0uMWMuMiAwIC40IDAgLjYuMXMuMy4xLjUuMi4yLjIuMy40LjEuMy4xLjV2LjNzLS4xLjItLjEuMy0uMS4yLS4yLjItLjIuMS0uMy4yYy4yLjEuNC4yLjUuNHMuMi40LjIuNmMwIC4yIDAgLjQtLjEuNXMtLjIuMy0uMy40LS4zLjItLjUuMi0uNC4xLS42LjFjLS4yIDAtLjQgMC0uNS0uMXMtLjMtLjEtLjUtLjItLjItLjItLjMtLjQtLjEtLjQtLjEtLjZoLjh2LjJzLjEuMS4xLjIuMS4xLjIuMWguNXMuMS0uMS4yLS4xLjEtLjEuMS0uMnYtLjVzLS4xLS4xLS4xLS4yLS4xLS4xLS4yLS4xaC0uNnYtLjd6bTUuNy43YzAgLjMgMCAuNi0uMS44bC0uMy42cy0uMy4zLS41LjMtLjQuMS0uNi4xLS40IDAtLjYtLjEtLjMtLjItLjUtLjMtLjItLjMtLjMtLjYtLjEtLjUtLjEtLjh2LS43YzAtLjMgMC0uNi4xLS44bC4zLS42cy4zLS4zLjUtLjMuNC0uMS42LS4xLjQgMCAuNi4xLjMuMi41LjMuMi4zLjMuNi4xLjUuMS44di43em0tLjktLjh2LS41cy0uMS0uMi0uMS0uMy0uMS0uMS0uMi0uMi0uMi0uMS0uMy0uMS0uMiAwLS4zLjFsLS4yLjJzLS4xLjItLjEuM3Yycy4xLjIuMS4zLjEuMS4yLjIuMi4xLjMuMS4yIDAgLjMtLjFsLjItLjJzLjEtLjIuMS0uM3YtMS41ek00IDEzYzAgNC40IDMuNiA4IDggOHM4LTMuNiA4LThoLTJjMCAzLjMtMi43IDYtNiA2cy02LTIuNy02LTYgMi43LTYgNi02djRsNS01LTUtNXY0Yy00LjQgMC04IDMuNi04IDh6IiAvPjwvZz4KPGcgaWQ9ImZvcndhcmQtNSI+PHBhdGggZD0iTTQgMTNjMCA0LjQgMy42IDggOCA4czgtMy42IDgtOGgtMmMwIDMuMy0yLjcgNi02IDZzLTYtMi43LTYtNiAyLjctNiA2LTZ2NGw1LTUtNS01djRjLTQuNCAwLTggMy42LTggOHptNi43LjlsLjItMi4yaDIuNHYuN2gtMS43bC0uMS45cy4xIDAgLjEtLjEuMSAwIC4xLS4xLjEgMCAuMiAwaC4yYy4yIDAgLjQgMCAuNS4xcy4zLjIuNC4zLjIuMy4zLjUuMS40LjEuNmMwIC4yIDAgLjQtLjEuNXMtLjEuMy0uMy41LS4zLjItLjUuMy0uNC4xLS42LjFjLS4yIDAtLjQgMC0uNS0uMXMtLjMtLjEtLjUtLjItLjItLjItLjMtLjQtLjEtLjMtLjEtLjVoLjhjMCAuMi4xLjMuMi40cy4yLjEuNC4xYy4xIDAgLjIgMCAuMy0uMWwuMi0uMnMuMS0uMi4xLS4zdi0uNmwtLjEtLjItLjItLjJzLS4yLS4xLS4zLS4xaC0uMnMtLjEgMC0uMi4xLS4xIDAtLjEuMS0uMS4xLS4xLjFoLS42eiIgLz48L2c+CjxnIGlkPSJnYW1lcyI+PHBhdGggZD0iTTE1IDcuNVYySDl2NS41bDMgMyAzLTN6TTcuNSA5SDJ2Nmg1LjVsMy0zLTMtM3pNOSAxNi41VjIyaDZ2LTUuNWwtMy0zLTMgM3pNMTYuNSA5bC0zIDMgMyAzSDIyVjloLTUuNXoiIC8+PC9nPgo8ZyBpZD0iaGQiPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tOCAxMkg5LjV2LTJoLTJ2Mkg2VjloMS41djIuNWgyVjlIMTF2NnptMi02aDRjLjU1IDAgMSAuNDUgMSAxdjRjMCAuNTUtLjQ1IDEtMSAxaC00Vjl6bTEuNSA0LjVoMnYtM2gtMnYzeiIgLz48L2c+CjxnIGlkPSJoZWFyaW5nIj48cGF0aCBkPSJNMTcgMjBjLS4yOSAwLS41Ni0uMDYtLjc2LS4xNS0uNzEtLjM3LTEuMjEtLjg4LTEuNzEtMi4zOC0uNTEtMS41Ni0xLjQ3LTIuMjktMi4zOS0zLS43OS0uNjEtMS42MS0xLjI0LTIuMzItMi41M0M5LjI5IDEwLjk4IDkgOS45MyA5IDljMC0yLjggMi4yLTUgNS01czUgMi4yIDUgNWgyYzAtMy45My0zLjA3LTctNy03UzcgNS4wNyA3IDljMCAxLjI2LjM4IDIuNjUgMS4wNyAzLjkuOTEgMS42NSAxLjk4IDIuNDggMi44NSAzLjE1LjgxLjYyIDEuMzkgMS4wNyAxLjcxIDIuMDUuNiAxLjgyIDEuMzcgMi44NCAyLjczIDMuNTUuNTEuMjMgMS4wNy4zNSAxLjY0LjM1IDIuMjEgMCA0LTEuNzkgNC00aC0yYzAgMS4xLS45IDItMiAyek03LjY0IDIuNjRMNi4yMiAxLjIyQzQuMjMgMy4yMSAzIDUuOTYgMyA5czEuMjMgNS43OSAzLjIyIDcuNzhsMS40MS0xLjQxQzYuMDEgMTMuNzQgNSAxMS40OSA1IDlzMS4wMS00Ljc0IDIuNjQtNi4zNnpNMTEuNSA5YzAgMS4zOCAxLjEyIDIuNSAyLjUgMi41czIuNS0xLjEyIDIuNS0yLjUtMS4xMi0yLjUtMi41LTIuNS0yLjUgMS4xMi0yLjUgMi41eiIgLz48L2c+CjxnIGlkPSJoaWdoLXF1YWxpdHkiPjxwYXRoIGQ9Ik0xOSA0SDVjLTEuMTEgMC0yIC45LTIgMnYxMmMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0tOCAxMUg5LjV2LTJoLTJ2Mkg2VjloMS41djIuNWgyVjlIMTF2NnptNy0xYzAgLjU1LS40NSAxLTEgMWgtLjc1djEuNWgtMS41VjE1SDE0Yy0uNTUgMC0xLS40NS0xLTF2LTRjMC0uNTUuNDUtMSAxLTFoM2MuNTUgMCAxIC40NSAxIDF2NHptLTMuNS0uNWgydi0zaC0ydjN6IiAvPjwvZz4KPGcgaWQ9ImxpYnJhcnktYWRkIj48cGF0aCBkPSJNNCA2SDJ2MTRjMCAxLjEuOSAyIDIgMmgxNHYtMkg0VjZ6bTE2LTRIOGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tMSA5aC00djRoLTJ2LTRIOVY5aDRWNWgydjRoNHYyeiIgLz48L2c+CjxnIGlkPSJsaWJyYXJ5LWJvb2tzIj48cGF0aCBkPSJNNCA2SDJ2MTRjMCAxLjEuOSAyIDIgMmgxNHYtMkg0VjZ6bTE2LTRIOGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tMSA5SDlWOWgxMHYyem0tNCA0SDl2LTJoNnYyem00LThIOVY1aDEwdjJ6IiAvPjwvZz4KPGcgaWQ9ImxpYnJhcnktbXVzaWMiPjxwYXRoIGQ9Ik0yMCAySDhjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTIgNWgtM3Y1LjVjMCAxLjM4LTEuMTIgMi41LTIuNSAyLjVTMTAgMTMuODggMTAgMTIuNXMxLjEyLTIuNSAyLjUtMi41Yy41NyAwIDEuMDguMTkgMS41LjUxVjVoNHYyek00IDZIMnYxNGMwIDEuMS45IDIgMiAyaDE0di0ySDRWNnoiIC8+PC9nPgo8ZyBpZD0ibG9vcCI+PHBhdGggZD0iTTEyIDRWMUw4IDVsNCA0VjZjMy4zMSAwIDYgMi42OSA2IDYgMCAxLjAxLS4yNSAxLjk3LS43IDIuOGwxLjQ2IDEuNDZDMTkuNTQgMTUuMDMgMjAgMTMuNTcgMjAgMTJjMC00LjQyLTMuNTgtOC04LTh6bTAgMTRjLTMuMzEgMC02LTIuNjktNi02IDAtMS4wMS4yNS0xLjk3LjctMi44TDUuMjQgNy43NEM0LjQ2IDguOTcgNCAxMC40MyA0IDEyYzAgNC40MiAzLjU4IDggOCA4djNsNC00LTQtNHYzeiIgLz48L2c+CjxnIGlkPSJtaWMiPjxwYXRoIGQ9Ik0xMiAxNGMxLjY2IDAgMi45OS0xLjM0IDIuOTktM0wxNSA1YzAtMS42Ni0xLjM0LTMtMy0zUzkgMy4zNCA5IDV2NmMwIDEuNjYgMS4zNCAzIDMgM3ptNS4zLTNjMCAzLTIuNTQgNS4xLTUuMyA1LjFTNi43IDE0IDYuNyAxMUg1YzAgMy40MSAyLjcyIDYuMjMgNiA2LjcyVjIxaDJ2LTMuMjhjMy4yOC0uNDggNi0zLjMgNi02LjcyaC0xLjd6IiAvPjwvZz4KPGcgaWQ9Im1pYy1ub25lIj48cGF0aCBkPSJNMTIgMTRjMS42NiAwIDIuOTktMS4zNCAyLjk5LTNMMTUgNWMwLTEuNjYtMS4zNC0zLTMtM1M5IDMuMzQgOSA1djZjMCAxLjY2IDEuMzQgMyAzIDN6bS0xLjItOS4xYzAtLjY2LjU0LTEuMiAxLjItMS4yLjY2IDAgMS4yLjU0IDEuMiAxLjJsLS4wMSA2LjJjMCAuNjYtLjUzIDEuMi0xLjE5IDEuMi0uNjYgMC0xLjItLjU0LTEuMi0xLjJWNC45em02LjUgNi4xYzAgMy0yLjU0IDUuMS01LjMgNS4xUzYuNyAxNCA2LjcgMTFINWMwIDMuNDEgMi43MiA2LjIzIDYgNi43MlYyMWgydi0zLjI4YzMuMjgtLjQ4IDYtMy4zIDYtNi43MmgtMS43eiIgLz48L2c+CjxnIGlkPSJtaWMtb2ZmIj48cGF0aCBkPSJNMTkgMTFoLTEuN2MwIC43NC0uMTYgMS40My0uNDMgMi4wNWwxLjIzIDEuMjNjLjU2LS45OC45LTIuMDkuOS0zLjI4em0tNC4wMi4xN2MwLS4wNi4wMi0uMTEuMDItLjE3VjVjMC0xLjY2LTEuMzQtMy0zLTNTOSAzLjM0IDkgNXYuMThsNS45OCA1Ljk5ek00LjI3IDNMMyA0LjI3bDYuMDEgNi4wMVYxMWMwIDEuNjYgMS4zMyAzIDIuOTkgMyAuMjIgMCAuNDQtLjAzLjY1LS4wOGwxLjY2IDEuNjZjLS43MS4zMy0xLjUuNTItMi4zMS41Mi0yLjc2IDAtNS4zLTIuMS01LjMtNS4xSDVjMCAzLjQxIDIuNzIgNi4yMyA2IDYuNzJWMjFoMnYtMy4yOGMuOTEtLjEzIDEuNzctLjQ1IDIuNTQtLjlMMTkuNzMgMjEgMjEgMTkuNzMgNC4yNyAzeiIgLz48L2c+CjxnIGlkPSJtb3ZpZSI+PHBhdGggZD0iTTE4IDRsMiA0aC0zbC0yLTRoLTJsMiA0aC0zbC0yLTRIOGwyIDRIN0w1IDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNGgtNHoiIC8+PC9nPgo8ZyBpZD0ibXVzaWMtdmlkZW8iPjxwYXRoIGQ9Ik0yMSAzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkgzVjVoMTh2MTR6TTggMTVjMC0xLjY2IDEuMzQtMyAzLTMgLjM1IDAgLjY5LjA3IDEgLjE4VjZoNXYyaC0zdjcuMDNjLS4wMiAxLjY0LTEuMzUgMi45Ny0zIDIuOTctMS42NiAwLTMtMS4zNC0zLTN6IiAvPjwvZz4KPGcgaWQ9Im5ldy1yZWxlYXNlcyI+PHBhdGggZD0iTTIzIDEybC0yLjQ0LTIuNzguMzQtMy42OC0zLjYxLS44Mi0xLjg5LTMuMThMMTIgMyA4LjYgMS41NCA2LjcxIDQuNzJsLTMuNjEuODEuMzQgMy42OEwxIDEybDIuNDQgMi43OC0uMzQgMy42OSAzLjYxLjgyIDEuODkgMy4xOEwxMiAyMWwzLjQgMS40NiAxLjg5LTMuMTggMy42MS0uODItLjM0LTMuNjhMMjMgMTJ6bS0xMCA1aC0ydi0yaDJ2MnptMC00aC0yVjdoMnY2eiIgLz48L2c+CjxnIGlkPSJub3QtaW50ZXJlc3RlZCI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDIgMC04LTMuNTgtOC04IDAtMS44NS42My0zLjU1IDEuNjktNC45TDE2LjkgMTguMzFDMTUuNTUgMTkuMzcgMTMuODUgMjAgMTIgMjB6bTYuMzEtMy4xTDcuMSA1LjY5QzguNDUgNC42MyAxMC4xNSA0IDEyIDRjNC40MiAwIDggMy41OCA4IDggMCAxLjg1LS42MyAzLjU1LTEuNjkgNC45eiIgLz48L2c+CjxnIGlkPSJub3RlIj48cGF0aCBkPSJNMjIgMTBsLTYtNkg0Yy0xLjEgMC0yIC45LTIgMnYxMi4wMWMwIDEuMS45IDEuOTkgMiAxLjk5bDE2LS4wMWMxLjEgMCAyLS44OSAyLTEuOTl2LTh6bS03LTQuNWw1LjUgNS41SDE1VjUuNXoiIC8+PC9nPgo8ZyBpZD0icGF1c2UiPjxwYXRoIGQ9Ik02IDE5aDRWNUg2djE0em04LTE0djE0aDRWNWgtNHoiIC8+PC9nPgo8ZyBpZD0icGF1c2UtY2lyY2xlLWZpbGxlZCI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bS0xIDE0SDlWOGgydjh6bTQgMGgtMlY4aDJ2OHoiIC8+PC9nPgo8ZyBpZD0icGF1c2UtY2lyY2xlLW91dGxpbmUiPjxwYXRoIGQ9Ik05IDE2aDJWOEg5djh6bTMtMTRDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4em0xLTRoMlY4aC0ydjh6IiAvPjwvZz4KPGcgaWQ9InBsYXktYXJyb3ciPjxwYXRoIGQ9Ik04IDV2MTRsMTEtN3oiIC8+PC9nPgo8ZyBpZD0icGxheS1jaXJjbGUtZmlsbGVkIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptLTIgMTQuNXYtOWw2IDQuNS02IDQuNXoiIC8+PC9nPgo8ZyBpZD0icGxheS1jaXJjbGUtb3V0bGluZSI+PHBhdGggZD0iTTEwIDE2LjVsNi00LjUtNi00LjV2OXpNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6IiAvPjwvZz4KPGcgaWQ9InBsYXlsaXN0LWFkZCI+PHBhdGggZD0iTTE0IDEwSDJ2MmgxMnYtMnptMC00SDJ2MmgxMlY2em00IDh2LTRoLTJ2NGgtNHYyaDR2NGgydi00aDR2LTJoLTR6TTIgMTZoOHYtMkgydjJ6IiAvPjwvZz4KPGcgaWQ9InBsYXlsaXN0LWFkZC1jaGVjayI+PHBhdGggZD0iTTE0IDEwSDJ2MmgxMnYtMnptMC00SDJ2MmgxMlY2ek0yIDE2aDh2LTJIMnYyem0xOS41LTQuNUwyMyAxM2wtNi45OSA3LTQuNTEtNC41TDEzIDE0bDMuMDEgMyA1LjQ5LTUuNXoiIC8+PC9nPgo8ZyBpZD0icGxheWxpc3QtcGxheSI+PHBhdGggZD0iTTE5IDlIMnYyaDE3Vjl6bTAtNEgydjJoMTdWNXpNMiAxNWgxM3YtMkgydjJ6bTE1LTJ2Nmw1LTMtNS0zeiIgLz48L2c+CjxnIGlkPSJxdWV1ZSI+PHBhdGggZD0iTTQgNkgydjE0YzAgMS4xLjkgMiAyIDJoMTR2LTJINFY2em0xNi00SDhjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTEgOWgtNHY0aC0ydi00SDlWOWg0VjVoMnY0aDR2MnoiIC8+PC9nPgo8ZyBpZD0icXVldWUtbXVzaWMiPjxwYXRoIGQ9Ik0xNSA2SDN2MmgxMlY2em0wIDRIM3YyaDEydi0yek0zIDE2aDh2LTJIM3Yyek0xNyA2djguMThjLS4zMS0uMTEtLjY1LS4xOC0xLS4xOC0xLjY2IDAtMyAxLjM0LTMgM3MxLjM0IDMgMyAzIDMtMS4zNCAzLTNWOGgzVjZoLTV6IiAvPjwvZz4KPGcgaWQ9InF1ZXVlLXBsYXktbmV4dCI+PHBhdGggZD0iTTIxIDNIM2MtMS4xMSAwLTIgLjg5LTIgMnYxMmMwIDEuMS44OSAyIDIgMmg1djJoOHYtMmgydi0ySDNWNWgxOHY4aDJWNWMwLTEuMTEtLjktMi0yLTJ6bS04IDdWN2gtMnYzSDh2MmgzdjNoMnYtM2gzdi0yaC0zem0xMSA4bC00LjUgNC41TDE4IDIxbDMtMy0zLTMgMS41LTEuNUwyNCAxOHoiIC8+PC9nPgo8ZyBpZD0icmFkaW8iPjxwYXRoIGQ9Ik0zLjI0IDYuMTVDMi41MSA2LjQzIDIgNy4xNyAyIDh2MTJjMCAxLjEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjkgMi0yVjhjMC0xLjExLS44OS0yLTItMkg4LjNsOC4yNi0zLjM0TDE1Ljg4IDEgMy4yNCA2LjE1ek03IDIwYy0xLjY2IDAtMy0xLjM0LTMtM3MxLjM0LTMgMy0zIDMgMS4zNCAzIDMtMS4zNCAzLTMgM3ptMTMtOGgtMnYtMmgtMnYySDRWOGgxNnY0eiIgLz48L2c+CjxnIGlkPSJyZWNlbnQtYWN0b3JzIj48cGF0aCBkPSJNMjEgNXYxNGgyVjVoLTJ6bS00IDE0aDJWNWgtMnYxNHpNMTQgNUgyYy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoMTJjLjU1IDAgMS0uNDUgMS0xVjZjMC0uNTUtLjQ1LTEtMS0xek04IDcuNzVjMS4yNCAwIDIuMjUgMS4wMSAyLjI1IDIuMjVTOS4yNCAxMi4yNSA4IDEyLjI1IDUuNzUgMTEuMjQgNS43NSAxMCA2Ljc2IDcuNzUgOCA3Ljc1ek0xMi41IDE3aC05di0uNzVjMC0xLjUgMy0yLjI1IDQuNS0yLjI1czQuNS43NSA0LjUgMi4yNVYxN3oiIC8+PC9nPgo8ZyBpZD0icmVtb3ZlLWZyb20tcXVldWUiPjxwYXRoIGQ9Ik0yMSAzSDNjLTEuMTEgMC0yIC44OS0yIDJ2MTJjMCAxLjEuODkgMiAyIDJoNXYyaDh2LTJoNWMxLjEgMCAxLjk5LS45IDEuOTktMkwyMyA1YzAtMS4xMS0uOS0yLTItMnptMCAxNEgzVjVoMTh2MTJ6bS01LTd2Mkg4di0yaDh6IiAvPjwvZz4KPGcgaWQ9InJlcGVhdCI+PHBhdGggZD0iTTcgN2gxMHYzbDQtNC00LTR2M0g1djZoMlY3em0xMCAxMEg3di0zbC00IDQgNCA0di0zaDEydi02aC0ydjR6IiAvPjwvZz4KPGcgaWQ9InJlcGVhdC1vbmUiPjxwYXRoIGQ9Ik03IDdoMTB2M2w0LTQtNC00djNINXY2aDJWN3ptMTAgMTBIN3YtM2wtNCA0IDQgNHYtM2gxMnYtNmgtMnY0em0tNC0yVjloLTFsLTIgMXYxaDEuNXY0SDEzeiIgLz48L2c+CjxnIGlkPSJyZXBsYXkiPjxwYXRoIGQ9Ik0xMiA1VjFMNyA2bDUgNVY3YzMuMzEgMCA2IDIuNjkgNiA2cy0yLjY5IDYtNiA2LTYtMi42OS02LTZINGMwIDQuNDIgMy41OCA4IDggOHM4LTMuNTggOC04LTMuNTgtOC04LTh6IiAvPjwvZz4KPGcgaWQ9InJlcGxheS0xMCI+PHBhdGggZD0iTTEyIDVWMUw3IDZsNSA1VjdjMy4zIDAgNiAyLjcgNiA2cy0yLjcgNi02IDYtNi0yLjctNi02SDRjMCA0LjQgMy42IDggOCA4czgtMy42IDgtOC0zLjYtOC04LTh6bS0xLjEgMTFIMTB2LTMuM0w5IDEzdi0uN2wxLjgtLjZoLjFWMTZ6bTQuMy0xLjhjMCAuMyAwIC42LS4xLjhsLS4zLjZzLS4zLjMtLjUuMy0uNC4xLS42LjEtLjQgMC0uNi0uMS0uMy0uMi0uNS0uMy0uMi0uMy0uMy0uNi0uMS0uNS0uMS0uOHYtLjdjMC0uMyAwLS42LjEtLjhsLjMtLjZzLjMtLjMuNS0uMy40LS4xLjYtLjEuNCAwIC42LjFjLjIuMS4zLjIuNS4zcy4yLjMuMy42LjEuNS4xLjh2Ljd6bS0uOS0uOHYtLjVzLS4xLS4yLS4xLS4zLS4xLS4xLS4yLS4yLS4yLS4xLS4zLS4xLS4yIDAtLjMuMWwtLjIuMnMtLjEuMi0uMS4zdjJzLjEuMi4xLjMuMS4xLjIuMi4yLjEuMy4xLjIgMCAuMy0uMWwuMi0uMnMuMS0uMi4xLS4zdi0xLjV6IiAvPjwvZz4KPGcgaWQ9InJlcGxheS0zMCI+PHBhdGggZD0iTTEyIDVWMUw3IDZsNSA1VjdjMy4zIDAgNiAyLjcgNiA2cy0yLjcgNi02IDYtNi0yLjctNi02SDRjMCA0LjQgMy42IDggOCA4czgtMy42IDgtOC0zLjYtOC04LTh6bS0yLjQgOC41aC40Yy4yIDAgLjQtLjEuNS0uMnMuMi0uMi4yLS40di0uMnMtLjEtLjEtLjEtLjItLjEtLjEtLjItLjFoLS41cy0uMS4xLS4yLjEtLjEuMS0uMS4ydi4yaC0xYzAtLjIgMC0uMy4xLS41cy4yLS4zLjMtLjQuMy0uMi40LS4yLjQtLjEuNS0uMWMuMiAwIC40IDAgLjYuMXMuMy4xLjUuMi4yLjIuMy40LjEuMy4xLjV2LjNzLS4xLjItLjEuMy0uMS4yLS4yLjItLjIuMS0uMy4yYy4yLjEuNC4yLjUuNHMuMi40LjIuNmMwIC4yIDAgLjQtLjEuNXMtLjIuMy0uMy40LS4zLjItLjUuMi0uNC4xLS42LjFjLS4yIDAtLjQgMC0uNS0uMXMtLjMtLjEtLjUtLjItLjItLjItLjMtLjQtLjEtLjQtLjEtLjZoLjh2LjJzLjEuMS4xLjIuMS4xLjIuMWguNXMuMS0uMS4yLS4xLjEtLjEuMS0uMnYtLjVzLS4xLS4xLS4xLS4yLS4xLS4xLS4yLS4xaC0uNnYtLjd6bTUuNy43YzAgLjMgMCAuNi0uMS44bC0uMy42cy0uMy4zLS41LjMtLjQuMS0uNi4xLS40IDAtLjYtLjEtLjMtLjItLjUtLjMtLjItLjMtLjMtLjYtLjEtLjUtLjEtLjh2LS43YzAtLjMgMC0uNi4xLS44bC4zLS42cy4zLS4zLjUtLjMuNC0uMS42LS4xLjQgMCAuNi4xLjMuMi41LjMuMi4zLjMuNi4xLjUuMS44di43em0tLjgtLjh2LS41YzAtLjEtLjEtLjItLjEtLjNzLS4xLS4xLS4yLS4yLS4yLS4xLS4zLS4xLS4yIDAtLjMuMWwtLjIuMnMtLjEuMi0uMS4zdjJzLjEuMi4xLjMuMS4xLjIuMi4yLjEuMy4xLjIgMCAuMy0uMWwuMi0uMnMuMS0uMi4xLS4zdi0xLjV6IiAvPjwvZz4KPGcgaWQ9InJlcGxheS01Ij48cGF0aCBkPSJNMTIgNVYxTDcgNmw1IDVWN2MzLjMgMCA2IDIuNyA2IDZzLTIuNyA2LTYgNi02LTIuNy02LTZINGMwIDQuNCAzLjYgOCA4IDhzOC0zLjYgOC04LTMuNi04LTgtOHptLTEuMyA4LjlsLjItMi4yaDIuNHYuN2gtMS43bC0uMS45cy4xIDAgLjEtLjEuMSAwIC4xLS4xLjEgMCAuMiAwaC4yYy4yIDAgLjQgMCAuNS4xcy4zLjIuNC4zLjIuMy4zLjUuMS40LjEuNmMwIC4yIDAgLjQtLjEuNXMtLjEuMy0uMy41LS4zLjItLjQuMy0uNC4xLS42LjFjLS4yIDAtLjQgMC0uNS0uMXMtLjMtLjEtLjUtLjItLjItLjItLjMtLjQtLjEtLjMtLjEtLjVoLjhjMCAuMi4xLjMuMi40cy4yLjEuNC4xYy4xIDAgLjIgMCAuMy0uMWwuMi0uMnMuMS0uMi4xLS4zdi0uNmwtLjEtLjItLjItLjJzLS4yLS4xLS4zLS4xaC0uMnMtLjEgMC0uMi4xLS4xIDAtLjEuMS0uMS4xLS4xLjFoLS43eiIgLz48L2c+CjxnIGlkPSJzaHVmZmxlIj48cGF0aCBkPSJNMTAuNTkgOS4xN0w1LjQxIDQgNCA1LjQxbDUuMTcgNS4xNyAxLjQyLTEuNDF6TTE0LjUgNGwyLjA0IDIuMDRMNCAxOC41OSA1LjQxIDIwIDE3Ljk2IDcuNDYgMjAgOS41VjRoLTUuNXptLjMzIDkuNDFsLTEuNDEgMS40MSAzLjEzIDMuMTNMMTQuNSAyMEgyMHYtNS41bC0yLjA0IDIuMDQtMy4xMy0zLjEzeiIgLz48L2c+CjxnIGlkPSJza2lwLW5leHQiPjxwYXRoIGQ9Ik02IDE4bDguNS02TDYgNnYxMnpNMTYgNnYxMmgyVjZoLTJ6IiAvPjwvZz4KPGcgaWQ9InNraXAtcHJldmlvdXMiPjxwYXRoIGQ9Ik02IDZoMnYxMkg2em0zLjUgNmw4LjUgNlY2eiIgLz48L2c+CjxnIGlkPSJzbG93LW1vdGlvbi12aWRlbyI+PHBhdGggZD0iTTEzLjA1IDkuNzlMMTAgNy41djlsMy4wNS0yLjI5TDE2IDEyem0wIDBMMTAgNy41djlsMy4wNS0yLjI5TDE2IDEyem0wIDBMMTAgNy41djlsMy4wNS0yLjI5TDE2IDEyek0xMSA0LjA3VjIuMDVjLTIuMDEuMi0zLjg0IDEtNS4zMiAyLjIxTDcuMSA1LjY5YzEuMTEtLjg2IDIuNDQtMS40NCAzLjktMS42MnpNNS42OSA3LjFMNC4yNiA1LjY4QzMuMDUgNy4xNiAyLjI1IDguOTkgMi4wNSAxMWgyLjAyYy4xOC0xLjQ2Ljc2LTIuNzkgMS42Mi0zLjl6TTQuMDcgMTNIMi4wNWMuMiAyLjAxIDEgMy44NCAyLjIxIDUuMzJsMS40My0xLjQzYy0uODYtMS4xLTEuNDQtMi40My0xLjYyLTMuODl6bTEuNjEgNi43NEM3LjE2IDIwLjk1IDkgMjEuNzUgMTEgMjEuOTV2LTIuMDJjLTEuNDYtLjE4LTIuNzktLjc2LTMuOS0xLjYybC0xLjQyIDEuNDN6TTIyIDEyYzAgNS4xNi0zLjkyIDkuNDItOC45NSA5Ljk1di0yLjAyQzE2Ljk3IDE5LjQxIDIwIDE2LjA1IDIwIDEycy0zLjAzLTcuNDEtNi45NS03LjkzVjIuMDVDMTguMDggMi41OCAyMiA2Ljg0IDIyIDEyeiIgLz48L2c+CjxnIGlkPSJzbm9vemUiPjxwYXRoIGQ9Ik03Ljg4IDMuMzlMNi42IDEuODYgMiA1LjcxbDEuMjkgMS41MyA0LjU5LTMuODV6TTIyIDUuNzJsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek0xMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5YzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0wIDE2Yy0zLjg3IDAtNy0zLjEzLTctN3MzLjEzLTcgNy03IDcgMy4xMyA3IDctMy4xMyA3LTcgN3ptLTMtOWgzLjYzTDkgMTUuMlYxN2g2di0yaC0zLjYzTDE1IDEwLjhWOUg5djJ6IiAvPjwvZz4KPGcgaWQ9InNvcnQtYnktYWxwaGEiPjxwYXRoIGQ9Ik0xNC45NCA0LjY2aC00LjcybDIuMzYtMi4zNnptLTQuNjkgMTQuNzFoNC42NmwtMi4zMyAyLjMzek02LjEgNi4yN0wxLjYgMTcuNzNoMS44NGwuOTItMi40NWg1LjExbC45MiAyLjQ1aDEuODRMNy43NCA2LjI3SDYuMXptLTEuMTMgNy4zN2wxLjk0LTUuMTggMS45NCA1LjE4SDQuOTd6bTEwLjc2IDIuNWg2LjEydjEuNTloLTguNTN2LTEuMjlsNS45Mi04LjU2aC01Ljg4di0xLjZoOC4zdjEuMjZsLTUuOTMgOC42eiIgLz48L2c+CjxnIGlkPSJzdG9wIj48cGF0aCBkPSJNNiA2aDEydjEySDZ6IiAvPjwvZz4KPGcgaWQ9InN1YnNjcmlwdGlvbnMiPjxwYXRoIGQ9Ik0yMCA4SDRWNmgxNnYyem0tMi02SDZ2MmgxMlYyem00IDEwdjhjMCAxLjEtLjkgMi0yIDJINGMtMS4xIDAtMi0uOS0yLTJ2LThjMC0xLjEuOS0yIDItMmgxNmMxLjEgMCAyIC45IDIgMnptLTYgNGwtNi0zLjI3djYuNTNMMTYgMTZ6IiAvPjwvZz4KPGcgaWQ9InN1YnRpdGxlcyI+PHBhdGggZD0iTTIwIDRINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yek00IDEyaDR2Mkg0di0yem0xMCA2SDR2LTJoMTB2MnptNiAwaC00di0yaDR2MnptMC00SDEwdi0yaDEwdjJ6IiAvPjwvZz4KPGcgaWQ9InN1cnJvdW5kLXNvdW5kIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6TTcuNzYgMTYuMjRsLTEuNDEgMS40MUM0Ljc4IDE2LjEgNCAxNC4wNSA0IDEyYzAtMi4wNS43OC00LjEgMi4zNC01LjY2bDEuNDEgMS40MUM2LjU5IDguOTMgNiAxMC40NiA2IDEycy41OSAzLjA3IDEuNzYgNC4yNHpNMTIgMTZjLTIuMjEgMC00LTEuNzktNC00czEuNzktNCA0LTQgNCAxLjc5IDQgNC0xLjc5IDQtNCA0em01LjY2IDEuNjZsLTEuNDEtMS40MUMxNy40MSAxNS4wNyAxOCAxMy41NCAxOCAxMnMtLjU5LTMuMDctMS43Ni00LjI0bDEuNDEtMS40MUMxOS4yMiA3LjkgMjAgOS45NSAyMCAxMmMwIDIuMDUtLjc4IDQuMS0yLjM0IDUuNjZ6TTEyIDEwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0idmlkZW8tY2FsbCI+PHBhdGggZD0iTTE3IDEwLjVWN2MwLS41NS0uNDUtMS0xLTFINGMtLjU1IDAtMSAuNDUtMSAxdjEwYzAgLjU1LjQ1IDEgMSAxaDEyYy41NSAwIDEtLjQ1IDEtMXYtMy41bDQgNHYtMTFsLTQgNHpNMTQgMTNoLTN2M0g5di0zSDZ2LTJoM1Y4aDJ2M2gzdjJ6IiAvPjwvZz4KPGcgaWQ9InZpZGVvLWxhYmVsIj48cGF0aCBkPSJNMjEgM0gzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTNIM1Y1aDE4djExeiIgLz48L2c+CjxnIGlkPSJ2aWRlby1saWJyYXJ5Ij48cGF0aCBkPSJNNCA2SDJ2MTRjMCAxLjEuOSAyIDIgMmgxNHYtMkg0VjZ6bTE2LTRIOGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tOCAxMi41di05bDYgNC41LTYgNC41eiIgLz48L2c+CjxnIGlkPSJ2aWRlb2NhbSI+PHBhdGggZD0iTTE3IDEwLjVWN2MwLS41NS0uNDUtMS0xLTFINGMtLjU1IDAtMSAuNDUtMSAxdjEwYzAgLjU1LjQ1IDEgMSAxaDEyYy41NSAwIDEtLjQ1IDEtMXYtMy41bDQgNHYtMTFsLTQgNHoiIC8+PC9nPgo8ZyBpZD0idmlkZW9jYW0tb2ZmIj48cGF0aCBkPSJNMjEgNi41bC00IDRWN2MwLS41NS0uNDUtMS0xLTFIOS44MkwyMSAxNy4xOFY2LjV6TTMuMjcgMkwyIDMuMjcgNC43MyA2SDRjLS41NSAwLTEgLjQ1LTEgMXYxMGMwIC41NS40NSAxIDEgMWgxMmMuMjEgMCAuMzktLjA4LjU0LS4xOEwxOS43MyAyMSAyMSAxOS43MyAzLjI3IDJ6IiAvPjwvZz4KPGcgaWQ9InZvbHVtZS1kb3duIj48cGF0aCBkPSJNMTguNSAxMmMwLTEuNzctMS4wMi0zLjI5LTIuNS00LjAzdjguMDVjMS40OC0uNzMgMi41LTIuMjUgMi41LTQuMDJ6TTUgOXY2aDRsNSA1VjRMOSA5SDV6IiAvPjwvZz4KPGcgaWQ9InZvbHVtZS1tdXRlIj48cGF0aCBkPSJNNyA5djZoNGw1IDVWNGwtNSA1SDd6IiAvPjwvZz4KPGcgaWQ9InZvbHVtZS1vZmYiPjxwYXRoIGQ9Ik0xNi41IDEyYzAtMS43Ny0xLjAyLTMuMjktMi41LTQuMDN2Mi4yMWwyLjQ1IDIuNDVjLjAzLS4yLjA1LS40MS4wNS0uNjN6bTIuNSAwYzAgLjk0LS4yIDEuODItLjU0IDIuNjRsMS41MSAxLjUxQzIwLjYzIDE0LjkxIDIxIDEzLjUgMjEgMTJjMC00LjI4LTIuOTktNy44Ni03LTguNzd2Mi4wNmMyLjg5Ljg2IDUgMy41NCA1IDYuNzF6TTQuMjcgM0wzIDQuMjcgNy43MyA5SDN2Nmg0bDUgNXYtNi43M2w0LjI1IDQuMjVjLS42Ny41Mi0xLjQyLjkzLTIuMjUgMS4xOHYyLjA2YzEuMzgtLjMxIDIuNjMtLjk1IDMuNjktMS44MUwxOS43MyAyMSAyMSAxOS43M2wtOS05TDQuMjcgM3pNMTIgNEw5LjkxIDYuMDkgMTIgOC4xOFY0eiIgLz48L2c+CjxnIGlkPSJ2b2x1bWUtdXAiPjxwYXRoIGQ9Ik0zIDl2Nmg0bDUgNVY0TDcgOUgzem0xMy41IDNjMC0xLjc3LTEuMDItMy4yOS0yLjUtNC4wM3Y4LjA1YzEuNDgtLjczIDIuNS0yLjI1IDIuNS00LjAyek0xNCAzLjIzdjIuMDZjMi44OS44NiA1IDMuNTQgNSA2Ljcxcy0yLjExIDUuODUtNSA2LjcxdjIuMDZjNC4wMS0uOTEgNy00LjQ5IDctOC43N3MtMi45OS03Ljg2LTctOC43N3oiIC8+PC9nPgo8ZyBpZD0id2ViIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0tNSAxNEg0di00aDExdjR6bTAtNUg0VjloMTF2NHptNSA1aC00VjloNHY5eiIgLz48L2c+CjxnIGlkPSJ3ZWItYXNzZXQiPjxwYXRoIGQ9Ik0xOSA0SDVjLTEuMTEgMC0yIC45LTIgMnYxMmMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS44OS0yLTItMnptMCAxNEg1VjhoMTR2MTB6IiAvPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+CgoKCjxpcm9uLWljb25zZXQtc3ZnIG5hbWU9ImNvbW11bmljYXRpb24iIHNpemU9IjI0Ij4KPHN2Zz48ZGVmcz4KPGcgaWQ9ImJ1c2luZXNzIj48cGF0aCBkPSJNMTIgN1YzSDJ2MThoMjBWN0gxMnpNNiAxOUg0di0yaDJ2MnptMC00SDR2LTJoMnYyem0wLTRINFY5aDJ2MnptMC00SDRWNWgydjJ6bTQgMTJIOHYtMmgydjJ6bTAtNEg4di0yaDJ2MnptMC00SDhWOWgydjJ6bTAtNEg4VjVoMnYyem0xMCAxMmgtOHYtMmgydi0yaC0ydi0yaDJ2LTJoLTJWOWg4djEwem0tMi04aC0ydjJoMnYtMnptMCA0aC0ydjJoMnYtMnoiIC8+PC9nPgo8ZyBpZD0iY2FsbCI+PHBhdGggZD0iTTYuNjIgMTAuNzljMS40NCAyLjgzIDMuNzYgNS4xNCA2LjU5IDYuNTlsMi4yLTIuMmMuMjctLjI3LjY3LS4zNiAxLjAyLS4yNCAxLjEyLjM3IDIuMzMuNTcgMy41Ny41Ny41NSAwIDEgLjQ1IDEgMVYyMGMwIC41NS0uNDUgMS0xIDEtOS4zOSAwLTE3LTcuNjEtMTctMTcgMC0uNTUuNDUtMSAxLTFoMy41Yy41NSAwIDEgLjQ1IDEgMSAwIDEuMjUuMiAyLjQ1LjU3IDMuNTcuMTEuMzUuMDMuNzQtLjI1IDEuMDJsLTIuMiAyLjJ6IiAvPjwvZz4KPGcgaWQ9ImNhbGwtZW5kIj48cGF0aCBkPSJNMTIgOWMtMS42IDAtMy4xNS4yNS00LjYuNzJ2My4xYzAgLjM5LS4yMy43NC0uNTYuOS0uOTguNDktMS44NyAxLjEyLTIuNjYgMS44NS0uMTguMTgtLjQzLjI4LS43LjI4LS4yOCAwLS41My0uMTEtLjcxLS4yOUwuMjkgMTMuMDhjLS4xOC0uMTctLjI5LS40Mi0uMjktLjcgMC0uMjguMTEtLjUzLjI5LS43MUMzLjM0IDguNzggNy40NiA3IDEyIDdzOC42NiAxLjc4IDExLjcxIDQuNjdjLjE4LjE4LjI5LjQzLjI5LjcxIDAgLjI4LS4xMS41My0uMjkuNzFsLTIuNDggMi40OGMtLjE4LjE4LS40My4yOS0uNzEuMjktLjI3IDAtLjUyLS4xMS0uNy0uMjgtLjc5LS43NC0xLjY5LTEuMzYtMi42Ny0xLjg1LS4zMy0uMTYtLjU2LS41LS41Ni0uOXYtMy4xQzE1LjE1IDkuMjUgMTMuNiA5IDEyIDl6IiAvPjwvZz4KPGcgaWQ9ImNhbGwtbWFkZSI+PHBhdGggZD0iTTkgNXYyaDYuNTlMNCAxOC41OSA1LjQxIDIwIDE3IDguNDFWMTVoMlY1eiIgLz48L2c+CjxnIGlkPSJjYWxsLW1lcmdlIj48cGF0aCBkPSJNMTcgMjAuNDFMMTguNDEgMTkgMTUgMTUuNTkgMTMuNTkgMTcgMTcgMjAuNDF6TTcuNSA4SDExdjUuNTlMNS41OSAxOSA3IDIwLjQxbDYtNlY4aDMuNUwxMiAzLjUgNy41IDh6IiAvPjwvZz4KPGcgaWQ9ImNhbGwtbWlzc2VkIj48cGF0aCBkPSJNMTkuNTkgN0wxMiAxNC41OSA2LjQxIDlIMTFWN0gzdjhoMnYtNC41OWw3IDcgOS05eiIgLz48L2c+CjxnIGlkPSJjYWxsLW1pc3NlZC1vdXRnb2luZyI+PHBhdGggZD0iTTMgOC40MWw5IDkgNy03VjE1aDJWN2gtOHYyaDQuNTlMMTIgMTQuNTkgNC40MSA3IDMgOC40MXoiIC8+PC9nPgo8ZyBpZD0iY2FsbC1yZWNlaXZlZCI+PHBhdGggZD0iTTIwIDUuNDFMMTguNTkgNCA3IDE1LjU5VjlINXYxMGgxMHYtMkg4LjQxeiIgLz48L2c+CjxnIGlkPSJjYWxsLXNwbGl0Ij48cGF0aCBkPSJNMTQgNGwyLjI5IDIuMjktMi44OCAyLjg4IDEuNDIgMS40MiAyLjg4LTIuODhMMjAgMTBWNHptLTQgMEg0djZsMi4yOS0yLjI5IDQuNzEgNC43VjIwaDJ2LTguNDFsLTUuMjktNS4zeiIgLz48L2c+CjxnIGlkPSJjaGF0Ij48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTYgOWgxMnYySDZWOXptOCA1SDZ2LTJoOHYyem00LTZINlY2aDEydjJ6IiAvPjwvZz4KPGcgaWQ9ImNoYXQtYnViYmxlIj48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0yIC45LTIgMnYxOGw0LTRoMTRjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0iY2hhdC1idWJibGUtb3V0bGluZSI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMiAuOS0yIDJ2MThsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bTAgMTRINmwtMiAyVjRoMTZ2MTJ6IiAvPjwvZz4KPGcgaWQ9ImNsZWFyLWFsbCI+PHBhdGggZD0iTTUgMTNoMTR2LTJINXYyem0tMiA0aDE0di0ySDN2MnpNNyA3djJoMTRWN0g3eiIgLz48L2c+CjxnIGlkPSJjb21tZW50Ij48cGF0aCBkPSJNMjEuOTkgNGMwLTEuMS0uODktMi0xLjk5LTJINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNGw0IDQtLjAxLTE4ek0xOCAxNEg2di0yaDEydjJ6bTAtM0g2VjloMTJ2MnptMC0zSDZWNmgxMnYyeiIgLz48L2c+CjxnIGlkPSJjb250YWN0LW1haWwiPjxwYXRoIGQ9Ik0yMSA4VjdsLTMgMi0zLTJ2MWwzIDIgMy0yem0xLTVIMkMuOSAzIDAgMy45IDAgNXYxNGMwIDEuMS45IDIgMiAyaDIwYzEuMSAwIDEuOTktLjkgMS45OS0yTDI0IDVjMC0xLjEtLjktMi0yLTJ6TTggNmMxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgMy0zLTEuMzQtMy0zIDEuMzQtMyAzLTN6bTYgMTJIMnYtMWMwLTIgNC0zLjEgNi0zLjFzNiAxLjEgNiAzLjF2MXptOC02aC04VjZoOHY2eiIgLz48L2c+CjxnIGlkPSJjb250YWN0LXBob25lIj48cGF0aCBkPSJNMjIgM0gyQy45IDMgMCAzLjkgMCA1djE0YzAgMS4xLjkgMiAyIDJoMjBjMS4xIDAgMS45OS0uOSAxLjk5LTJMMjQgNWMwLTEuMS0uOS0yLTItMnpNOCA2YzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptNiAxMkgydi0xYzAtMiA0LTMuMSA2LTMuMXM2IDEuMSA2IDMuMXYxem0zLjg1LTRoMS42NEwyMSAxNmwtMS45OSAxLjk5Yy0xLjMxLS45OC0yLjI4LTIuMzgtMi43My0zLjk5LS4xOC0uNjQtLjI4LTEuMzEtLjI4LTJzLjEtMS4zNi4yOC0yYy40NS0xLjYyIDEuNDItMy4wMSAyLjczLTMuOTlMMjEgOGwtMS41MSAyaC0xLjY0Yy0uMjIuNjMtLjM1IDEuMy0uMzUgMnMuMTMgMS4zNy4zNSAyeiIgLz48L2c+CjxnIGlkPSJjb250YWN0cyI+PHBhdGggZD0iTTIwIDBINHYyaDE2VjB6TTQgMjRoMTZ2LTJINHYyek0yMCA0SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptLTggMi43NWMxLjI0IDAgMi4yNSAxLjAxIDIuMjUgMi4yNXMtMS4wMSAyLjI1LTIuMjUgMi4yNVM5Ljc1IDEwLjI0IDkuNzUgOSAxMC43NiA2Ljc1IDEyIDYuNzV6TTE3IDE3SDd2LTEuNWMwLTEuNjcgMy4zMy0yLjUgNS0yLjVzNSAuODMgNSAyLjVWMTd6IiAvPjwvZz4KPGcgaWQ9ImRpYWxlci1zaXAiPjxwYXRoIGQ9Ik0xNyAzaC0xdjVoMVYzem0tMiAyaC0yVjRoMlYzaC0zdjNoMnYxaC0ydjFoM1Y1em0zLTJ2NWgxVjZoMlYzaC0zem0yIDJoLTFWNGgxdjF6bTAgMTAuNWMtMS4yNSAwLTIuNDUtLjItMy41Ny0uNTctLjM1LS4xMS0uNzQtLjAzLTEuMDEuMjRsLTIuMiAyLjJjLTIuODMtMS40NC01LjE1LTMuNzUtNi41OS02LjU5bDIuMi0yLjIxYy4yNy0uMjYuMzUtLjY1LjI0LTFDOC43IDYuNDUgOC41IDUuMjUgOC41IDRjMC0uNTUtLjQ1LTEtMS0xSDRjLS41NSAwLTEgLjQ1LTEgMSAwIDkuMzkgNy42MSAxNyAxNyAxNyAuNTUgMCAxLS40NSAxLTF2LTMuNWMwLS41NS0uNDUtMS0xLTF6IiAvPjwvZz4KPGcgaWQ9ImRpYWxwYWQiPjxwYXRoIGQ9Ik0xMiAxOWMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6TTYgMWMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAgNmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAgNmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTEyLThjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0yLTIgLjktMiAyIC45IDIgMiAyem0tNiA4Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptNiAwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptMC02Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptLTYgMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAtNmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9ImVtYWlsIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDRsLTggNS04LTVWNmw4IDUgOC01djJ6IiAvPjwvZz4KPGcgaWQ9ImZvcnVtIj48cGF0aCBkPSJNMjEgNmgtMnY5SDZ2MmMwIC41NS40NSAxIDEgMWgxMWw0IDRWN2MwLS41NS0uNDUtMS0xLTF6bS00IDZWM2MwLS41NS0uNDUtMS0xLTFIM2MtLjU1IDAtMSAuNDUtMSAxdjE0bDQtNGgxMGMuNTUgMCAxLS40NSAxLTF6IiAvPjwvZz4KPGcgaWQ9ImltcG9ydC1jb250YWN0cyI+PHBhdGggZD0iTTIxIDVjLTEuMTEtLjM1LTIuMzMtLjUtMy41LS41LTEuOTUgMC00LjA1LjQtNS41IDEuNS0xLjQ1LTEuMS0zLjU1LTEuNS01LjUtMS41UzIuNDUgNC45IDEgNnYxNC42NWMwIC4yNS4yNS41LjUuNS4xIDAgLjE1LS4wNS4yNS0uMDVDMy4xIDIwLjQ1IDUuMDUgMjAgNi41IDIwYzEuOTUgMCA0LjA1LjQgNS41IDEuNSAxLjM1LS44NSAzLjgtMS41IDUuNS0xLjUgMS42NSAwIDMuMzUuMyA0Ljc1IDEuMDUuMS4wNS4xNS4wNS4yNS4wNS4yNSAwIC41LS4yNS41LS41VjZjLS42LS40NS0xLjI1LS43NS0yLTF6bTAgMTMuNWMtMS4xLS4zNS0yLjMtLjUtMy41LS41LTEuNyAwLTQuMTUuNjUtNS41IDEuNVY4YzEuMzUtLjg1IDMuOC0xLjUgNS41LTEuNSAxLjIgMCAyLjQuMTUgMy41LjV2MTEuNXoiIC8+PC9nPgo8ZyBpZD0iaW1wb3J0LWV4cG9ydCI+PHBhdGggZD0iTTkgM0w1IDYuOTloM1YxNGgyVjYuOTloM0w5IDN6bTcgMTQuMDFWMTBoLTJ2Ny4wMWgtM0wxNSAyMWw0LTMuOTloLTN6IiAvPjwvZz4KPGcgaWQ9ImludmVydC1jb2xvcnMtb2ZmIj48cGF0aCBkPSJNMjAuNjUgMjAuODdsLTIuMzUtMi4zNS02LjMtNi4yOS0zLjU2LTMuNTctMS40Mi0xLjQxTDQuMjcgNC41IDMgNS43N2wyLjc4IDIuNzhjLTIuNTUgMy4xNC0yLjM2IDcuNzYuNTYgMTAuNjlDNy45IDIwLjggOS45NSAyMS41OCAxMiAyMS41OGMxLjc5IDAgMy41Ny0uNTkgNS4wMy0xLjc4bDIuNyAyLjdMMjEgMjEuMjNsLS4zNS0uMzZ6TTEyIDE5LjU5Yy0xLjYgMC0zLjExLS42Mi00LjI0LTEuNzZDNi42MiAxNi42OSA2IDE1LjE5IDYgMTMuNTljMC0xLjMyLjQzLTIuNTcgMS4yMS0zLjZMMTIgMTQuNzd2NC44MnpNMTIgNS4xdjQuNThsNy4yNSA3LjI2YzEuMzctMi45Ni44NC02LjU3LTEuNi05LjAxTDEyIDIuMjdsLTMuNyAzLjcgMS40MSAxLjQxTDEyIDUuMXoiIC8+PC9nPgo8ZyBpZD0ibGl2ZS1oZWxwIj48cGF0aCBkPSJNMTkgMkg1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoNGwzIDMgMy0zaDRjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTYgMTZoLTJ2LTJoMnYyem0yLjA3LTcuNzVsLS45LjkyQzEzLjQ1IDExLjkgMTMgMTIuNSAxMyAxNGgtMnYtLjVjMC0xLjEuNDUtMi4xIDEuMTctMi44M2wxLjI0LTEuMjZjLjM3LS4zNi41OS0uODYuNTktMS40MSAwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDJIOGMwLTIuMjEgMS43OS00IDQtNHM0IDEuNzkgNCA0YzAgLjg4LS4zNiAxLjY4LS45MyAyLjI1eiIgLz48L2c+CjxnIGlkPSJsb2NhdGlvbi1vZmYiPjxwYXRoIGQ9Ik0xMiA2LjVjMS4zOCAwIDIuNSAxLjEyIDIuNSAyLjUgMCAuNzQtLjMzIDEuMzktLjgzIDEuODVsMy42MyAzLjYzYy45OC0xLjg2IDEuNy0zLjggMS43LTUuNDggMC0zLjg3LTMuMTMtNy03LTctMS45OCAwLTMuNzYuODMtNS4wNCAyLjE1bDMuMTkgMy4xOWMuNDYtLjUyIDEuMTEtLjg0IDEuODUtLjg0em00LjM3IDkuNmwtNC42My00LjYzLS4xMS0uMTFMMy4yNyAzIDIgNC4yN2wzLjE4IDMuMThDNS4wNyA3Ljk1IDUgOC40NyA1IDljMCA1LjI1IDcgMTMgNyAxM3MxLjY3LTEuODUgMy4zOC00LjM1TDE4LjczIDIxIDIwIDE5LjczbC0zLjYzLTMuNjN6IiAvPjwvZz4KPGcgaWQ9ImxvY2F0aW9uLW9uIj48cGF0aCBkPSJNMTIgMkM4LjEzIDIgNSA1LjEzIDUgOWMwIDUuMjUgNyAxMyA3IDEzczctNy43NSA3LTEzYzAtMy44Ny0zLjEzLTctNy03em0wIDkuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6IiAvPjwvZz4KPGcgaWQ9Im1haWwtb3V0bGluZSI+PHBhdGggZD0iTTIwIDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptMCAxNEg0VjhsOCA1IDgtNXYxMHptLTgtN0w0IDZoMTZsLTggNXoiIC8+PC9nPgo8ZyBpZD0ibWVzc2FnZSI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tMiAxMkg2di0yaDEydjJ6bTAtM0g2VjloMTJ2MnptMC0zSDZWNmgxMnYyeiIgLz48L2c+CjxnIGlkPSJuby1zaW0iPjxwYXRoIGQ9Ik0xOC45OSA1YzAtMS4xLS44OS0yLTEuOTktMmgtN0w3LjY2IDUuMzQgMTkgMTYuNjggMTguOTkgNXpNMy42NSAzLjg4TDIuMzggNS4xNSA1IDcuNzdWMTljMCAxLjEuOSAyIDIgMmgxMC4wMWMuMzUgMCAuNjctLjEuOTYtLjI2bDEuODggMS44OCAxLjI3LTEuMjdMMy42NSAzLjg4eiIgLz48L2c+CjxnIGlkPSJwaG9uZSI+PHBhdGggZD0iTTYuNjIgMTAuNzljMS40NCAyLjgzIDMuNzYgNS4xNCA2LjU5IDYuNTlsMi4yLTIuMmMuMjctLjI3LjY3LS4zNiAxLjAyLS4yNCAxLjEyLjM3IDIuMzMuNTcgMy41Ny41Ny41NSAwIDEgLjQ1IDEgMVYyMGMwIC41NS0uNDUgMS0xIDEtOS4zOSAwLTE3LTcuNjEtMTctMTcgMC0uNTUuNDUtMSAxLTFoMy41Yy41NSAwIDEgLjQ1IDEgMSAwIDEuMjUuMiAyLjQ1LjU3IDMuNTcuMTEuMzUuMDMuNzQtLjI1IDEuMDJsLTIuMiAyLjJ6IiAvPjwvZz4KPGcgaWQ9InBob25lbGluay1lcmFzZSI+PHBhdGggZD0iTTEzIDguMmwtMS0xLTQgNC00LTQtMSAxIDQgNC00IDQgMSAxIDQtNCA0IDQgMS0xLTQtNCA0LTR6TTE5IDFIOWMtMS4xIDAtMiAuOS0yIDJ2M2gyVjRoMTB2MTZIOXYtMkg3djNjMCAxLjEuOSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJwaG9uZWxpbmstbG9jayI+PHBhdGggZD0iTTE5IDFIOWMtMS4xIDAtMiAuOS0yIDJ2M2gyVjRoMTB2MTZIOXYtMkg3djNjMCAxLjEuOSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTItMi0yem0tOC4yIDEwVjkuNUMxMC44IDguMSA5LjQgNyA4IDdTNS4yIDguMSA1LjIgOS41VjExYy0uNiAwLTEuMi42LTEuMiAxLjJ2My41YzAgLjcuNiAxLjMgMS4yIDEuM2g1LjVjLjcgMCAxLjMtLjYgMS4zLTEuMnYtMy41YzAtLjctLjYtMS4zLTEuMi0xLjN6bS0xLjMgMGgtM1Y5LjVjMC0uOC43LTEuMyAxLjUtMS4zczEuNS41IDEuNSAxLjNWMTF6IiAvPjwvZz4KPGcgaWQ9InBob25lbGluay1yaW5nIj48cGF0aCBkPSJNMjAuMSA3LjdsLTEgMWMxLjggMS44IDEuOCA0LjYgMCA2LjVsMSAxYzIuNS0yLjMgMi41LTYuMSAwLTguNXpNMTggOS44bC0xIDFjLjUuNy41IDEuNiAwIDIuM2wxIDFjMS4yLTEuMiAxLjItMyAwLTQuM3pNMTQgMUg0Yy0xLjEgMC0yIC45LTIgMnYxOGMwIDEuMS45IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgMTlINFY0aDEwdjE2eiIgLz48L2c+CjxnIGlkPSJwaG9uZWxpbmstc2V0dXAiPjxwYXRoIGQ9Ik0xMS44IDEyLjV2LTFsMS4xLS44Yy4xLS4xLjEtLjIuMS0uM2wtMS0xLjdjLS4xLS4xLS4yLS4yLS4zLS4xbC0xLjMuNGMtLjMtLjItLjYtLjQtLjktLjVsLS4yLTEuM2MwLS4xLS4xLS4yLS4zLS4ySDdjLS4xIDAtLjIuMS0uMy4ybC0uMiAxLjNjLS4zLjEtLjYuMy0uOS41bC0xLjMtLjVjLS4xIDAtLjIgMC0uMy4xbC0xIDEuN2MtLjEuMSAwIC4yLjEuM2wxLjEuOHYxbC0xLjEuOGMtLjEuMi0uMS4zLS4xLjRsMSAxLjdjLjEuMS4yLjIuMy4xbDEuNC0uNGMuMy4yLjYuNC45LjVsLjIgMS4zYy0uMS4xLjEuMi4yLjJoMmMuMSAwIC4yLS4xLjMtLjJsLjItMS4zYy4zLS4xLjYtLjMuOS0uNWwxLjMuNWMuMSAwIC4yIDAgLjMtLjFsMS0xLjdjLjEtLjEgMC0uMi0uMS0uM2wtMS4xLS45ek04IDE0Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnpNMTkgMUg5Yy0xLjEgMC0yIC45LTIgMnYzaDJWNGgxMHYxNkg5di0ySDd2M2MwIDEuMS45IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9InBvcnRhYmxlLXdpZmktb2ZmIj48cGF0aCBkPSJNMTcuNTYgMTQuMjRjLjI4LS42OS40NC0xLjQ1LjQ0LTIuMjQgMC0zLjMxLTIuNjktNi02LTYtLjc5IDAtMS41NS4xNi0yLjI0LjQ0bDEuNjIgMS42MmMuMi0uMDMuNDEtLjA2LjYyLS4wNiAyLjIxIDAgNCAxLjc5IDQgNCAwIC4yMS0uMDIuNDItLjA1LjYzbDEuNjEgMS42MXpNMTIgNGM0LjQyIDAgOCAzLjU4IDggOCAwIDEuMzUtLjM1IDIuNjItLjk1IDMuNzRsMS40NyAxLjQ3QzIxLjQ2IDE1LjY5IDIyIDEzLjkxIDIyIDEyYzAtNS41Mi00LjQ4LTEwLTEwLTEwLTEuOTEgMC0zLjY5LjU1LTUuMjEgMS40N2wxLjQ2IDEuNDZDOS4zNyA0LjM0IDEwLjY1IDQgMTIgNHpNMy4yNyAyLjVMMiAzLjc3bDIuMSAyLjFDMi43OSA3LjU3IDIgOS42OSAyIDEyYzAgMy43IDIuMDEgNi45MiA0Ljk5IDguNjVsMS0xLjczQzUuNjEgMTcuNTMgNCAxNC45NiA0IDEyYzAtMS43Ni41Ny0zLjM4IDEuNTMtNC42OWwxLjQzIDEuNDRDNi4zNiA5LjY4IDYgMTAuOCA2IDEyYzAgMi4yMiAxLjIxIDQuMTUgMyA1LjE5bDEtMS43NGMtMS4xOS0uNy0yLTEuOTctMi0zLjQ1IDAtLjY1LjE3LTEuMjUuNDQtMS43OWwxLjU4IDEuNThMMTAgMTJjMCAxLjEuOSAyIDIgMmwuMjEtLjAyLjAxLjAxIDcuNTEgNy41MUwyMSAyMC4yMyA0LjI3IDMuNWwtMS0xeiIgLz48L2c+CjxnIGlkPSJwcmVzZW50LXRvLWFsbCI+PHBhdGggZD0iTTIxIDNIM2MtMS4xMSAwLTIgLjg5LTIgMnYxNGMwIDEuMTEuODkgMiAyIDJoMThjMS4xMSAwIDItLjg5IDItMlY1YzAtMS4xMS0uODktMi0yLTJ6bTAgMTYuMDJIM1Y0Ljk4aDE4djE0LjA0ek0xMCAxMkg4bDQtNCA0IDRoLTJ2NGgtNHYtNHoiIC8+PC9nPgo8ZyBpZD0icmluZy12b2x1bWUiPjxwYXRoIGQ9Ik0yMy43MSAxNi42N0MyMC42NiAxMy43OCAxNi41NCAxMiAxMiAxMiA3LjQ2IDEyIDMuMzQgMTMuNzguMjkgMTYuNjdjLS4xOC4xOC0uMjkuNDMtLjI5LjcxIDAgLjI4LjExLjUzLjI5LjcxbDIuNDggMi40OGMuMTguMTguNDMuMjkuNzEuMjkuMjcgMCAuNTItLjExLjctLjI4Ljc5LS43NCAxLjY5LTEuMzYgMi42Ni0xLjg1LjMzLS4xNi41Ni0uNS41Ni0uOXYtMy4xYzEuNDUtLjQ4IDMtLjczIDQuNi0uNzNzMy4xNS4yNSA0LjYuNzJ2My4xYzAgLjM5LjIzLjc0LjU2LjkuOTguNDkgMS44NyAxLjEyIDIuNjYgMS44NS4xOC4xOC40My4yOC43LjI4LjI4IDAgLjUzLS4xMS43MS0uMjlsMi40OC0yLjQ4Yy4xOC0uMTguMjktLjQzLjI5LS43MSAwLS4yNy0uMTEtLjUyLS4yOS0uN3pNMjEuMTYgNi4yNmwtMS40MS0xLjQxLTMuNTYgMy41NSAxLjQxIDEuNDFzMy40NS0zLjUyIDMuNTYtMy41NXpNMTMgMmgtMnY1aDJWMnpNNi40IDkuODFMNy44MSA4LjQgNC4yNiA0Ljg0IDIuODQgNi4yNmMuMTEuMDMgMy41NiAzLjU1IDMuNTYgMy41NXoiIC8+PC9nPgo8ZyBpZD0icnNzLWZlZWQiPjxjaXJjbGUgY3g9IjYuMTgiIGN5PSIxNy44MiIgcj0iMi4xOCIgLz48cGF0aCBkPSJNNCA0LjQ0djIuODNjNy4wMyAwIDEyLjczIDUuNyAxMi43MyAxMi43M2gyLjgzYzAtOC41OS02Ljk3LTE1LjU2LTE1LjU2LTE1LjU2em0wIDUuNjZ2Mi44M2MzLjkgMCA3LjA3IDMuMTcgNy4wNyA3LjA3aDIuODNjMC01LjQ3LTQuNDMtOS45LTkuOS05Ljl6IiAvPjwvZz4KPGcgaWQ9InNjcmVlbi1zaGFyZSI+PHBhdGggZD0iTTIwIDE4YzEuMSAwIDEuOTktLjkgMS45OS0yTDIyIDZjMC0xLjExLS45LTItMi0ySDRjLTEuMTEgMC0yIC44OS0yIDJ2MTBjMCAxLjEuODkgMiAyIDJIMHYyaDI0di0yaC00em0tNy0zLjUzdi0yLjE5Yy0yLjc4IDAtNC42MS44NS02IDIuNzIuNTYtMi42NyAyLjExLTUuMzMgNi01Ljg3VjdsNCAzLjczLTQgMy43NHoiIC8+PC9nPgo8ZyBpZD0ic3BlYWtlci1waG9uZSI+PHBhdGggZD0iTTcgNy4wN0w4LjQzIDguNWMuOTEtLjkxIDIuMTgtMS40OCAzLjU3LTEuNDhzMi42Ni41NyAzLjU3IDEuNDhMMTcgNy4wN0MxNS43MiA1Ljc5IDEzLjk1IDUgMTIgNXMtMy43Mi43OS01IDIuMDd6TTEyIDFDOC45OCAxIDYuMjQgMi4yMyA0LjI1IDQuMjFsMS40MSAxLjQxQzcuMjggNCA5LjUzIDMgMTIgM3M0LjcyIDEgNi4zNCAyLjYybDEuNDEtMS40MUMxNy43NiAyLjIzIDE1LjAyIDEgMTIgMXptMi44NiA5LjAxTDkuMTQgMTBDOC41MSAxMCA4IDEwLjUxIDggMTEuMTR2OS43MWMwIC42My41MSAxLjE0IDEuMTQgMS4xNGg1LjcxYy42MyAwIDEuMTQtLjUxIDEuMTQtMS4xNHYtOS43MWMuMDEtLjYzLS41LTEuMTMtMS4xMy0xLjEzek0xNSAyMEg5di04aDZ2OHoiIC8+PC9nPgo8ZyBpZD0ic3RheS1jdXJyZW50LWxhbmRzY2FwZSI+PHBhdGggZD0iTTEuMDEgN0wxIDE3YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMkgzYy0xLjEgMC0xLjk5LjktMS45OSAyek0xOSA3djEwSDVWN2gxNHoiIC8+PC9nPgo8ZyBpZD0ic3RheS1jdXJyZW50LXBvcnRyYWl0Ij48cGF0aCBkPSJNMTcgMS4wMUw3IDFjLTEuMSAwLTEuOTkuOS0xLjk5IDJ2MThjMCAxLjEuODkgMiAxLjk5IDJoMTBjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0xLjk5LTItMS45OXpNMTcgMTlIN1Y1aDEwdjE0eiIgLz48L2c+CjxnIGlkPSJzdGF5LXByaW1hcnktbGFuZHNjYXBlIj48cGF0aCBkPSJNMS4wMSA3TDEgMTdjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0ySDNjLTEuMSAwLTEuOTkuOS0xLjk5IDJ6TTE5IDd2MTBINVY3aDE0eiIgLz48L2c+CjxnIGlkPSJzdGF5LXByaW1hcnktcG9ydHJhaXQiPjxwYXRoIGQ9Ik0xNyAxLjAxTDcgMWMtMS4xIDAtMS45OS45LTEuOTkgMnYxOGMwIDEuMS44OSAyIDEuOTkgMmgxMGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTEuOTktMi0xLjk5ek0xNyAxOUg3VjVoMTB2MTR6IiAvPjwvZz4KPGcgaWQ9InN0b3Atc2NyZWVuLXNoYXJlIj48cGF0aCBkPSJNMjEuMjIgMTguMDJsMiAySDI0di0yaC0yLjc4em0uNzctMmwuMDEtMTBjMC0xLjExLS45LTItMi0ySDcuMjJsNS4yMyA1LjIzYy4xOC0uMDQuMzYtLjA3LjU1LS4xVjcuMDJsNCAzLjczLTEuNTggMS40NyA1LjU0IDUuNTRjLjYxLS4zMyAxLjAzLS45OSAxLjAzLTEuNzR6TTIuMzkgMS43M0wxLjExIDNsMS41NCAxLjU0Yy0uNC4zNi0uNjUuODktLjY1IDEuNDh2MTBjMCAxLjEuODkgMiAyIDJIMHYyaDE4LjEzbDIuNzEgMi43MSAxLjI3LTEuMjdMMi4zOSAxLjczek03IDE1LjAyYy4zMS0xLjQ4LjkyLTIuOTUgMi4wNy00LjA2bDEuNTkgMS41OWMtMS41NC4zOC0yLjcgMS4xOC0zLjY2IDIuNDd6IiAvPjwvZz4KPGcgaWQ9InN3YXAtY2FsbHMiPjxwYXRoIGQ9Ik0xOCA0bC00IDRoM3Y3YzAgMS4xLS45IDItMiAycy0yLS45LTItMlY4YzAtMi4yMS0xLjc5LTQtNC00UzUgNS43OSA1IDh2N0gybDQgNCA0LTRIN1Y4YzAtMS4xLjktMiAyLTJzMiAuOSAyIDJ2N2MwIDIuMjEgMS43OSA0IDQgNHM0LTEuNzkgNC00VjhoM2wtNC00eiIgLz48L2c+CjxnIGlkPSJ0ZXh0c21zIj48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTkgMTFIN1Y5aDJ2MnptNCAwaC0yVjloMnYyem00IDBoLTJWOWgydjJ6IiAvPjwvZz4KPGcgaWQ9InZvaWNlbWFpbCI+PHBhdGggZD0iTTE4LjUgNkMxNS40NiA2IDEzIDguNDYgMTMgMTEuNWMwIDEuMzMuNDcgMi41NSAxLjI2IDMuNUg5Ljc0Yy43OS0uOTUgMS4yNi0yLjE3IDEuMjYtMy41QzExIDguNDYgOC41NCA2IDUuNSA2UzAgOC40NiAwIDExLjUgMi40NiAxNyA1LjUgMTdoMTNjMy4wNCAwIDUuNS0yLjQ2IDUuNS01LjVTMjEuNTQgNiAxOC41IDZ6bS0xMyA5QzMuNTcgMTUgMiAxMy40MyAyIDExLjVTMy41NyA4IDUuNSA4IDkgOS41NyA5IDExLjUgNy40MyAxNSA1LjUgMTV6bTEzIDBjLTEuOTMgMC0zLjUtMS41Ny0zLjUtMy41UzE2LjU3IDggMTguNSA4IDIyIDkuNTcgMjIgMTEuNSAyMC40MyAxNSAxOC41IDE1eiIgLz48L2c+CjxnIGlkPSJ2cG4ta2V5Ij48cGF0aCBkPSJNMTIuNjUgMTBDMTEuODMgNy42NyA5LjYxIDYgNyA2Yy0zLjMxIDAtNiAyLjY5LTYgNnMyLjY5IDYgNiA2YzIuNjEgMCA0LjgzLTEuNjcgNS42NS00SDE3djRoNHYtNGgydi00SDEyLjY1ek03IDE0Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnoiIC8+PC9nPgo8L2RlZnM+PC9zdmc+CjwvaXJvbi1pY29uc2V0LXN2Zz4KCgoKCjxpcm9uLWljb25zZXQtc3ZnIG5hbWU9ImVkaXRvciIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iYXR0YWNoLWZpbGUiPjxwYXRoIGQ9Ik0xNi41IDZ2MTEuNWMwIDIuMjEtMS43OSA0LTQgNHMtNC0xLjc5LTQtNFY1YzAtMS4zOCAxLjEyLTIuNSAyLjUtMi41czIuNSAxLjEyIDIuNSAyLjV2MTAuNWMwIC41NS0uNDUgMS0xIDFzLTEtLjQ1LTEtMVY2SDEwdjkuNWMwIDEuMzggMS4xMiAyLjUgMi41IDIuNXMyLjUtMS4xMiAyLjUtMi41VjVjMC0yLjIxLTEuNzktNC00LTRTNyAyLjc5IDcgNXYxMi41YzAgMy4wNCAyLjQ2IDUuNSA1LjUgNS41czUuNS0yLjQ2IDUuNS01LjVWNmgtMS41eiIgLz48L2c+CjxnIGlkPSJhdHRhY2gtbW9uZXkiPjxwYXRoIGQ9Ik0xMS44IDEwLjljLTIuMjctLjU5LTMtMS4yLTMtMi4xNSAwLTEuMDkgMS4wMS0xLjg1IDIuNy0xLjg1IDEuNzggMCAyLjQ0Ljg1IDIuNSAyLjFoMi4yMWMtLjA3LTEuNzItMS4xMi0zLjMtMy4yMS0zLjgxVjNoLTN2Mi4xNmMtMS45NC40Mi0zLjUgMS42OC0zLjUgMy42MSAwIDIuMzEgMS45MSAzLjQ2IDQuNyA0LjEzIDIuNS42IDMgMS40OCAzIDIuNDEgMCAuNjktLjQ5IDEuNzktMi43IDEuNzktMi4wNiAwLTIuODctLjkyLTIuOTgtMi4xaC0yLjJjLjEyIDIuMTkgMS43NiAzLjQyIDMuNjggMy44M1YyMWgzdi0yLjE1YzEuOTUtLjM3IDMuNS0xLjUgMy41LTMuNTUgMC0yLjg0LTIuNDMtMy44MS00LjctNC40eiIgLz48L2c+CjxnIGlkPSJib3JkZXItYWxsIj48cGF0aCBkPSJNMyAzdjE4aDE4VjNIM3ptOCAxNkg1di02aDZ2NnptMC04SDVWNWg2djZ6bTggOGgtNnYtNmg2djZ6bTAtOGgtNlY1aDZ2NnoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLWJvdHRvbSI+PHBhdGggZD0iTTkgMTFIN3YyaDJ2LTJ6bTQgNGgtMnYyaDJ2LTJ6TTkgM0g3djJoMlYzem00IDhoLTJ2Mmgydi0yek01IDNIM3YyaDJWM3ptOCA0aC0ydjJoMlY3em00IDRoLTJ2Mmgydi0yem0tNC04aC0ydjJoMlYzem00IDBoLTJ2MmgyVjN6bTIgMTBoMnYtMmgtMnYyem0wIDRoMnYtMmgtMnYyek01IDdIM3YyaDJWN3ptMTQtNHYyaDJWM2gtMnptMCA2aDJWN2gtMnYyek01IDExSDN2Mmgydi0yek0zIDIxaDE4di0ySDN2MnptMi02SDN2Mmgydi0yeiIgLz48L2c+CjxnIGlkPSJib3JkZXItY2xlYXIiPjxwYXRoIGQ9Ik03IDVoMlYzSDd2MnptMCA4aDJ2LTJIN3Yyem0wIDhoMnYtMkg3djJ6bTQtNGgydi0yaC0ydjJ6bTAgNGgydi0yaC0ydjJ6bS04IDBoMnYtMkgzdjJ6bTAtNGgydi0ySDN2MnptMC00aDJ2LTJIM3Yyem0wLTRoMlY3SDN2MnptMC00aDJWM0gzdjJ6bTggOGgydi0yaC0ydjJ6bTggNGgydi0yaC0ydjJ6bTAtNGgydi0yaC0ydjJ6bTAgOGgydi0yaC0ydjJ6bTAtMTJoMlY3aC0ydjJ6bS04IDBoMlY3aC0ydjJ6bTgtNnYyaDJWM2gtMnptLTggMmgyVjNoLTJ2MnptNCAxNmgydi0yaC0ydjJ6bTAtOGgydi0yaC0ydjJ6bTAtOGgyVjNoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLWNvbG9yIj48cGF0aCBkPSJNMTcuNzUgN0wxNCAzLjI1bC0xMCAxMFYxN2gzLjc1bDEwLTEwem0yLjk2LTIuOTZjLjM5LS4zOS4zOS0xLjAyIDAtMS40MUwxOC4zNy4yOWMtLjM5LS4zOS0xLjAyLS4zOS0xLjQxIDBMMTUgMi4yNSAxOC43NSA2bDEuOTYtMS45NnoiIC8+PHBhdGggZmlsbC1vcGFjaXR5PSIuMzYiIGQ9Ik0wIDIwaDI0djRIMHoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLWhvcml6b250YWwiPjxwYXRoIGQ9Ik0zIDIxaDJ2LTJIM3Yyek01IDdIM3YyaDJWN3pNMyAxN2gydi0ySDN2MnptNCA0aDJ2LTJIN3Yyek01IDNIM3YyaDJWM3ptNCAwSDd2MmgyVjN6bTggMGgtMnYyaDJWM3ptLTQgNGgtMnYyaDJWN3ptMC00aC0ydjJoMlYzem02IDE0aDJ2LTJoLTJ2MnptLTggNGgydi0yaC0ydjJ6bS04LThoMTh2LTJIM3Yyek0xOSAzdjJoMlYzaC0yem0wIDZoMlY3aC0ydjJ6bS04IDhoMnYtMmgtMnYyem00IDRoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyeiIgLz48L2c+CjxnIGlkPSJib3JkZXItaW5uZXIiPjxwYXRoIGQ9Ik0zIDIxaDJ2LTJIM3Yyem00IDBoMnYtMkg3djJ6TTUgN0gzdjJoMlY3ek0zIDE3aDJ2LTJIM3Yyek05IDNIN3YyaDJWM3pNNSAzSDN2MmgyVjN6bTEyIDBoLTJ2MmgyVjN6bTIgNmgyVjdoLTJ2MnptMC02djJoMlYzaC0yem0tNCAxOGgydi0yaC0ydjJ6TTEzIDNoLTJ2OEgzdjJoOHY4aDJ2LThoOHYtMmgtOFYzem02IDE4aDJ2LTJoLTJ2MnptMC00aDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLWxlZnQiPjxwYXRoIGQ9Ik0xMSAyMWgydi0yaC0ydjJ6bTAtNGgydi0yaC0ydjJ6bTAtMTJoMlYzaC0ydjJ6bTAgNGgyVjdoLTJ2MnptMCA0aDJ2LTJoLTJ2MnptLTQgOGgydi0ySDd2MnpNNyA1aDJWM0g3djJ6bTAgOGgydi0ySDd2MnptLTQgOGgyVjNIM3YxOHpNMTkgOWgyVjdoLTJ2MnptLTQgMTJoMnYtMmgtMnYyem00LTRoMnYtMmgtMnYyem0wLTE0djJoMlYzaC0yem0wIDEwaDJ2LTJoLTJ2MnptMCA4aDJ2LTJoLTJ2MnptLTQtOGgydi0yaC0ydjJ6bTAtOGgyVjNoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLW91dGVyIj48cGF0aCBkPSJNMTMgN2gtMnYyaDJWN3ptMCA0aC0ydjJoMnYtMnptNCAwaC0ydjJoMnYtMnpNMyAzdjE4aDE4VjNIM3ptMTYgMTZINVY1aDE0djE0em0tNi00aC0ydjJoMnYtMnptLTQtNEg3djJoMnYtMnoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLXJpZ2h0Ij48cGF0aCBkPSJNNyAyMWgydi0ySDd2MnpNMyA1aDJWM0gzdjJ6bTQgMGgyVjNIN3Yyem0wIDhoMnYtMkg3djJ6bS00IDhoMnYtMkgzdjJ6bTggMGgydi0yaC0ydjJ6bS04LThoMnYtMkgzdjJ6bTAgNGgydi0ySDN2MnptMC04aDJWN0gzdjJ6bTggOGgydi0yaC0ydjJ6bTQtNGgydi0yaC0ydjJ6bTQtMTB2MThoMlYzaC0yem0tNCAxOGgydi0yaC0ydjJ6bTAtMTZoMlYzaC0ydjJ6bS00IDhoMnYtMmgtMnYyem0wLThoMlYzaC0ydjJ6bTAgNGgyVjdoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLXN0eWxlIj48cGF0aCBkPSJNMTUgMjFoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyek03IDIxaDJ2LTJIN3Yyem00IDBoMnYtMmgtMnYyem04LTRoMnYtMmgtMnYyem0wLTRoMnYtMmgtMnYyek0zIDN2MThoMlY1aDE2VjNIM3ptMTYgNmgyVjdoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iYm9yZGVyLXRvcCI+PHBhdGggZD0iTTcgMjFoMnYtMkg3djJ6bTAtOGgydi0ySDd2MnptNCAwaDJ2LTJoLTJ2MnptMCA4aDJ2LTJoLTJ2MnptLTgtNGgydi0ySDN2MnptMCA0aDJ2LTJIM3Yyem0wLThoMnYtMkgzdjJ6bTAtNGgyVjdIM3Yyem04IDhoMnYtMmgtMnYyem04LThoMlY3aC0ydjJ6bTAgNGgydi0yaC0ydjJ6TTMgM3YyaDE4VjNIM3ptMTYgMTRoMnYtMmgtMnYyem0tNCA0aDJ2LTJoLTJ2MnpNMTEgOWgyVjdoLTJ2MnptOCAxMmgydi0yaC0ydjJ6bS00LThoMnYtMmgtMnYyeiIgLz48L2c+CjxnIGlkPSJib3JkZXItdmVydGljYWwiPjxwYXRoIGQ9Ik0zIDloMlY3SDN2MnptMC00aDJWM0gzdjJ6bTQgMTZoMnYtMkg3djJ6bTAtOGgydi0ySDd2MnptLTQgMGgydi0ySDN2MnptMCA4aDJ2LTJIM3Yyem0wLTRoMnYtMkgzdjJ6TTcgNWgyVjNIN3Yyem0xMiAxMmgydi0yaC0ydjJ6bS04IDRoMlYzaC0ydjE4em04IDBoMnYtMmgtMnYyem0wLThoMnYtMmgtMnYyem0wLTEwdjJoMlYzaC0yem0wIDZoMlY3aC0ydjJ6bS00LTRoMlYzaC0ydjJ6bTAgMTZoMnYtMmgtMnYyem0wLThoMnYtMmgtMnYyeiIgLz48L2c+CjxnIGlkPSJidWJibGUtY2hhcnQiPjxjaXJjbGUgY3g9IjcuMiIgY3k9IjE0LjQiIHI9IjMuMiIgLz48Y2lyY2xlIGN4PSIxNC44IiBjeT0iMTgiIHI9IjIiIC8+PGNpcmNsZSBjeD0iMTUuMiIgY3k9IjguOCIgcj0iNC44IiAvPjwvZz4KPGcgaWQ9ImRyYWctaGFuZGxlIj48cGF0aCBkPSJNMjAgOUg0djJoMTZWOXpNNCAxNWgxNnYtMkg0djJ6IiAvPjwvZz4KPGcgaWQ9ImZvcm1hdC1hbGlnbi1jZW50ZXIiPjxwYXRoIGQ9Ik03IDE1djJoMTB2LTJIN3ptLTQgNmgxOHYtMkgzdjJ6bTAtOGgxOHYtMkgzdjJ6bTQtNnYyaDEwVjdIN3pNMyAzdjJoMThWM0gzeiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtYWxpZ24tanVzdGlmeSI+PHBhdGggZD0iTTMgMjFoMTh2LTJIM3Yyem0wLTRoMTh2LTJIM3Yyem0wLTRoMTh2LTJIM3Yyem0wLTRoMThWN0gzdjJ6bTAtNnYyaDE4VjNIM3oiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LWFsaWduLWxlZnQiPjxwYXRoIGQ9Ik0xNSAxNUgzdjJoMTJ2LTJ6bTAtOEgzdjJoMTJWN3pNMyAxM2gxOHYtMkgzdjJ6bTAgOGgxOHYtMkgzdjJ6TTMgM3YyaDE4VjNIM3oiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LWFsaWduLXJpZ2h0Ij48cGF0aCBkPSJNMyAyMWgxOHYtMkgzdjJ6bTYtNGgxMnYtMkg5djJ6bS02LTRoMTh2LTJIM3Yyem02LTRoMTJWN0g5djJ6TTMgM3YyaDE4VjNIM3oiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LWJvbGQiPjxwYXRoIGQ9Ik0xNS42IDEwLjc5Yy45Ny0uNjcgMS42NS0xLjc3IDEuNjUtMi43OSAwLTIuMjYtMS43NS00LTQtNEg3djE0aDcuMDRjMi4wOSAwIDMuNzEtMS43IDMuNzEtMy43OSAwLTEuNTItLjg2LTIuODItMi4xNS0zLjQyek0xMCA2LjVoM2MuODMgMCAxLjUuNjcgMS41IDEuNXMtLjY3IDEuNS0xLjUgMS41aC0zdi0zem0zLjUgOUgxMHYtM2gzLjVjLjgzIDAgMS41LjY3IDEuNSAxLjVzLS42NyAxLjUtMS41IDEuNXoiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LWNsZWFyIj48cGF0aCBkPSJNMy4yNyA1TDIgNi4yN2w2Ljk3IDYuOTdMNi41IDE5aDNsMS41Ny0zLjY2TDE2LjczIDIxIDE4IDE5LjczIDMuNTUgNS4yNyAzLjI3IDV6TTYgNXYuMThMOC44MiA4aDIuNGwtLjcyIDEuNjggMi4xIDIuMUwxNC4yMSA4SDIwVjVINnoiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LWNvbG9yLWZpbGwiPjxwYXRoIGQ9Ik0xNi41NiA4Ljk0TDcuNjIgMCA2LjIxIDEuNDFsMi4zOCAyLjM4LTUuMTUgNS4xNWMtLjU5LjU5LS41OSAxLjU0IDAgMi4xMmw1LjUgNS41Yy4yOS4yOS42OC40NCAxLjA2LjQ0cy43Ny0uMTUgMS4wNi0uNDRsNS41LTUuNWMuNTktLjU4LjU5LTEuNTMgMC0yLjEyek01LjIxIDEwTDEwIDUuMjEgMTQuNzkgMTBINS4yMXpNMTkgMTEuNXMtMiAyLjE3LTIgMy41YzAgMS4xLjkgMiAyIDJzMi0uOSAyLTJjMC0xLjMzLTItMy41LTItMy41eiIgLz48cGF0aCBmaWxsLW9wYWNpdHk9Ii4zNiIgZD0iTTAgMjBoMjR2NEgweiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtY29sb3ItcmVzZXQiPjxwYXRoIGQ9Ik0xOCAxNGMwLTQtNi0xMC44LTYtMTAuOHMtMS4zMyAxLjUxLTIuNzMgMy41Mmw4LjU5IDguNTljLjA5LS40Mi4xNC0uODYuMTQtMS4zMXptLS44OCAzLjEyTDEyLjUgMTIuNSA1LjI3IDUuMjcgNCA2LjU1bDMuMzIgMy4zMkM2LjU1IDExLjMyIDYgMTIuNzkgNiAxNGMwIDMuMzEgMi42OSA2IDYgNiAxLjUyIDAgMi45LS41NyAzLjk2LTEuNWwyLjYzIDIuNjMgMS4yNy0xLjI3LTIuNzQtMi43NHoiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LWNvbG9yLXRleHQiPjxwYXRoIGZpbGwtb3BhY2l0eT0iLjM2IiBkPSJNMCAyMGgyNHY0SDB6IiAvPjxwYXRoIGQ9Ik0xMSAzTDUuNSAxN2gyLjI1bDEuMTItM2g2LjI1bDEuMTIgM2gyLjI1TDEzIDNoLTJ6bS0xLjM4IDlMMTIgNS42NyAxNC4zOCAxMkg5LjYyeiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtaW5kZW50LWRlY3JlYXNlIj48cGF0aCBkPSJNMTEgMTdoMTB2LTJIMTF2MnptLTgtNWw0IDRWOGwtNCA0em0wIDloMTh2LTJIM3Yyek0zIDN2MmgxOFYzSDN6bTggNmgxMFY3SDExdjJ6bTAgNGgxMHYtMkgxMXYyeiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtaW5kZW50LWluY3JlYXNlIj48cGF0aCBkPSJNMyAyMWgxOHYtMkgzdjJ6TTMgOHY4bDQtNC00LTR6bTggOWgxMHYtMkgxMXYyek0zIDN2MmgxOFYzSDN6bTggNmgxMFY3SDExdjJ6bTAgNGgxMHYtMkgxMXYyeiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtaXRhbGljIj48cGF0aCBkPSJNMTAgNHYzaDIuMjFsLTMuNDIgOEg2djNoOHYtM2gtMi4yMWwzLjQyLThIMThWNHoiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LWxpbmUtc3BhY2luZyI+PHBhdGggZD0iTTYgN2gyLjVMNSAzLjUgMS41IDdINHYxMEgxLjVMNSAyMC41IDguNSAxN0g2Vjd6bTQtMnYyaDEyVjVIMTB6bTAgMTRoMTJ2LTJIMTB2MnptMC02aDEydi0ySDEwdjJ6IiAvPjwvZz4KPGcgaWQ9ImZvcm1hdC1saXN0LWJ1bGxldGVkIj48cGF0aCBkPSJNNCAxMC41Yy0uODMgMC0xLjUuNjctMS41IDEuNXMuNjcgMS41IDEuNSAxLjUgMS41LS42NyAxLjUtMS41LS42Ny0xLjUtMS41LTEuNXptMC02Yy0uODMgMC0xLjUuNjctMS41IDEuNVMzLjE3IDcuNSA0IDcuNSA1LjUgNi44MyA1LjUgNiA0LjgzIDQuNSA0IDQuNXptMCAxMmMtLjgzIDAtMS41LjY4LTEuNSAxLjVzLjY4IDEuNSAxLjUgMS41IDEuNS0uNjggMS41LTEuNS0uNjctMS41LTEuNS0xLjV6TTcgMTloMTR2LTJIN3Yyem0wLTZoMTR2LTJIN3Yyem0wLTh2MmgxNFY1SDd6IiAvPjwvZz4KPGcgaWQ9ImZvcm1hdC1saXN0LW51bWJlcmVkIj48cGF0aCBkPSJNMiAxN2gydi41SDN2MWgxdi41SDJ2MWgzdi00SDJ2MXptMS05aDFWNEgydjFoMXYzem0tMSAzaDEuOEwyIDEzLjF2LjloM3YtMUgzLjJMNSAxMC45VjEwSDJ2MXptNS02djJoMTRWNUg3em0wIDE0aDE0di0ySDd2MnptMC02aDE0di0ySDd2MnoiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LXBhaW50Ij48cGF0aCBkPSJNMTggNFYzYzAtLjU1LS40NS0xLTEtMUg1Yy0uNTUgMC0xIC40NS0xIDF2NGMwIC41NS40NSAxIDEgMWgxMmMuNTUgMCAxLS40NSAxLTFWNmgxdjRIOXYxMWMwIC41NS40NSAxIDEgMWgyYy41NSAwIDEtLjQ1IDEtMXYtOWg4VjRoLTN6IiAvPjwvZz4KPGcgaWQ9ImZvcm1hdC1xdW90ZSI+PHBhdGggZD0iTTYgMTdoM2wyLTRWN0g1djZoM3ptOCAwaDNsMi00VjdoLTZ2NmgzeiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtc2hhcGVzIj48cGF0aCBkPSJNMjMgN1YxaC02djJIN1YxSDF2NmgydjEwSDF2Nmg2di0yaDEwdjJoNnYtNmgtMlY3aDJ6TTMgM2gydjJIM1Yzem0yIDE4SDN2LTJoMnYyem0xMi0ySDd2LTJINVY3aDJWNWgxMHYyaDJ2MTBoLTJ2MnptNCAyaC0ydi0yaDJ2MnpNMTkgNVYzaDJ2MmgtMnptLTUuMjcgOWgtMy40OWwtLjczIDJINy44OWwzLjQtOWgxLjRsMy40MSA5aC0xLjYzbC0uNzQtMnptLTMuMDQtMS4yNmgyLjYxTDEyIDguOTFsLTEuMzEgMy44M3oiIC8+PC9nPgo8ZyBpZD0iZm9ybWF0LXNpemUiPjxwYXRoIGQ9Ik05IDR2M2g1djEyaDNWN2g1VjRIOXptLTYgOGgzdjdoM3YtN2gzVjlIM3YzeiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtc3RyaWtldGhyb3VnaCI+PHBhdGggZD0iTTEwIDE5aDR2LTNoLTR2M3pNNSA0djNoNXYzaDRWN2g1VjRINXpNMyAxNGgxOHYtMkgzdjJ6IiAvPjwvZz4KPGcgaWQ9ImZvcm1hdC10ZXh0ZGlyZWN0aW9uLWwtdG8tciI+PHBhdGggZD0iTTkgMTB2NWgyVjRoMnYxMWgyVjRoMlYySDlDNi43OSAyIDUgMy43OSA1IDZzMS43OSA0IDQgNHptMTIgOGwtNC00djNINXYyaDEydjNsNC00eiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtdGV4dGRpcmVjdGlvbi1yLXRvLWwiPjxwYXRoIGQ9Ik0xMCAxMHY1aDJWNGgydjExaDJWNGgyVjJoLThDNy43OSAyIDYgMy43OSA2IDZzMS43OSA0IDQgNHptLTIgN3YtM2wtNCA0IDQgNHYtM2gxMnYtMkg4eiIgLz48L2c+CjxnIGlkPSJmb3JtYXQtdW5kZXJsaW5lZCI+PHBhdGggZD0iTTEyIDE3YzMuMzEgMCA2LTIuNjkgNi02VjNoLTIuNXY4YzAgMS45My0xLjU3IDMuNS0zLjUgMy41UzguNSAxMi45MyA4LjUgMTFWM0g2djhjMCAzLjMxIDIuNjkgNiA2IDZ6bS03IDJ2MmgxNHYtMkg1eiIgLz48L2c+CjxnIGlkPSJmdW5jdGlvbnMiPjxwYXRoIGQ9Ik0xOCA0SDZ2Mmw2LjUgNkw2IDE4djJoMTJ2LTNoLTdsNS01LTUtNWg3eiIgLz48L2c+CjxnIGlkPSJoaWdobGlnaHQiPjxwYXRoIGQ9Ik02IDE0bDMgM3Y1aDZ2LTVsMy0zVjlINnptNS0xMmgydjNoLTJ6TTMuNSA1Ljg3NUw0LjkxNCA0LjQ2bDIuMTIgMi4xMjJMNS42MiA3Ljk5N3ptMTMuNDYuNzFsMi4xMjMtMi4xMiAxLjQxNCAxLjQxNEwxOC4zNzUgOHoiIC8+PC9nPgo8ZyBpZD0iaW5zZXJ0LWNoYXJ0Ij48cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6TTkgMTdIN3YtN2gydjd6bTQgMGgtMlY3aDJ2MTB6bTQgMGgtMnYtNGgydjR6IiAvPjwvZz4KPGcgaWQ9Imluc2VydC1jb21tZW50Ij48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE0bDQgNFY0YzAtMS4xLS45LTItMi0yem0tMiAxMkg2di0yaDEydjJ6bTAtM0g2VjloMTJ2MnptMC0zSDZWNmgxMnYyeiIgLz48L2c+CjxnIGlkPSJpbnNlcnQtZHJpdmUtZmlsZSI+PHBhdGggZD0iTTYgMmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDIwYzAgMS4xLjg5IDIgMS45OSAySDE4YzEuMSAwIDItLjkgMi0yVjhsLTYtNkg2em03IDdWMy41TDE4LjUgOUgxM3oiIC8+PC9nPgo8ZyBpZD0iaW5zZXJ0LWVtb3RpY29uIj48cGF0aCBkPSJNMTEuOTkgMkM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnpNMTIgMjBjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4em0zLjUtOWMuODMgMCAxLjUtLjY3IDEuNS0xLjVTMTYuMzMgOCAxNS41IDggMTQgOC42NyAxNCA5LjVzLjY3IDEuNSAxLjUgMS41em0tNyAwYy44MyAwIDEuNS0uNjcgMS41LTEuNVM5LjMzIDggOC41IDggNyA4LjY3IDcgOS41IDcuNjcgMTEgOC41IDExem0zLjUgNi41YzIuMzMgMCA0LjMxLTEuNDYgNS4xMS0zLjVINi44OWMuOCAyLjA0IDIuNzggMy41IDUuMTEgMy41eiIgLz48L2c+CjxnIGlkPSJpbnNlcnQtaW52aXRhdGlvbiI+PHBhdGggZD0iTTE3IDEyaC01djVoNXYtNXpNMTYgMXYySDhWMUg2djJINWMtMS4xMSAwLTEuOTkuOS0xLjk5IDJMMyAxOWMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yaC0xVjFoLTJ6bTMgMThINVY4aDE0djExeiIgLz48L2c+CjxnIGlkPSJpbnNlcnQtbGluayI+PHBhdGggZD0iTTMuOSAxMmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMWg0VjdIN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNWg0di0xLjlIN2MtMS43MSAwLTMuMS0xLjM5LTMuMS0zLjF6TTggMTNoOHYtMkg4djJ6bTktNmgtNHYxLjloNGMxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXMtMS4zOSAzLjEtMy4xIDMuMWgtNFYxN2g0YzIuNzYgMCA1LTIuMjQgNS01cy0yLjI0LTUtNS01eiIgLz48L2c+CjxnIGlkPSJpbnNlcnQtcGhvdG8iPjxwYXRoIGQ9Ik0yMSAxOVY1YzAtMS4xLS45LTItMi0ySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJ6TTguNSAxMy41bDIuNSAzLjAxTDE0LjUgMTJsNC41IDZINWwzLjUtNC41eiIgLz48L2c+CjxnIGlkPSJsaW5lYXItc2NhbGUiPjxwYXRoIGQ9Ik0xOS41IDkuNWMtMS4wMyAwLTEuOS42Mi0yLjI5IDEuNWgtMi45MmMtLjM5LS44OC0xLjI2LTEuNS0yLjI5LTEuNXMtMS45LjYyLTIuMjkgMS41SDYuNzljLS4zOS0uODgtMS4yNi0xLjUtMi4yOS0xLjVDMy4xMiA5LjUgMiAxMC42MiAyIDEyczEuMTIgMi41IDIuNSAyLjVjMS4wMyAwIDEuOS0uNjIgMi4yOS0xLjVoMi45MmMuMzkuODggMS4yNiAxLjUgMi4yOSAxLjVzMS45LS42MiAyLjI5LTEuNWgyLjkyYy4zOS44OCAxLjI2IDEuNSAyLjI5IDEuNSAxLjM4IDAgMi41LTEuMTIgMi41LTIuNXMtMS4xMi0yLjUtMi41LTIuNXoiIC8+PC9nPgo8ZyBpZD0ibWVyZ2UtdHlwZSI+PHBhdGggZD0iTTE3IDIwLjQxTDE4LjQxIDE5IDE1IDE1LjU5IDEzLjU5IDE3IDE3IDIwLjQxek03LjUgOEgxMXY1LjU5TDUuNTkgMTkgNyAyMC40MWw2LTZWOGgzLjVMMTIgMy41IDcuNSA4eiIgLz48L2c+CjxnIGlkPSJtb2RlLWNvbW1lbnQiPjxwYXRoIGQ9Ik0yMS45OSA0YzAtMS4xLS44OS0yLTEuOTktMkg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE0bDQgNC0uMDEtMTh6IiAvPjwvZz4KPGcgaWQ9Im1vZGUtZWRpdCI+PHBhdGggZD0iTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC0yLjM0LTIuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0xLjgzIDEuODMgMy43NSAzLjc1IDEuODMtMS44M3oiIC8+PC9nPgo8ZyBpZD0ibW9uZXRpemF0aW9uLW9uIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMS40MSAxNi4wOVYyMGgtMi42N3YtMS45M2MtMS43MS0uMzYtMy4xNi0xLjQ2LTMuMjctMy40aDEuOTZjLjEgMS4wNS44MiAxLjg3IDIuNjUgMS44NyAxLjk2IDAgMi40LS45OCAyLjQtMS41OSAwLS44My0uNDQtMS42MS0yLjY3LTIuMTQtMi40OC0uNi00LjE4LTEuNjItNC4xOC0zLjY3IDAtMS43MiAxLjM5LTIuODQgMy4xMS0zLjIxVjRoMi42N3YxLjk1YzEuODYuNDUgMi43OSAxLjg2IDIuODUgMy4zOUgxNC4zYy0uMDUtMS4xMS0uNjQtMS44Ny0yLjIyLTEuODctMS41IDAtMi40LjY4LTIuNCAxLjY0IDAgLjg0LjY1IDEuMzkgMi42NyAxLjkxczQuMTggMS4zOSA0LjE4IDMuOTFjLS4wMSAxLjgzLTEuMzggMi44My0zLjEyIDMuMTZ6IiAvPjwvZz4KPGcgaWQ9Im1vbmV5LW9mZiI+PHBhdGggZD0iTTEyLjUgNi45YzEuNzggMCAyLjQ0Ljg1IDIuNSAyLjFoMi4yMWMtLjA3LTEuNzItMS4xMi0zLjMtMy4yMS0zLjgxVjNoLTN2Mi4xNmMtLjUzLjEyLTEuMDMuMy0xLjQ4LjU0bDEuNDcgMS40N2MuNDEtLjE3LjkxLS4yNyAxLjUxLS4yN3pNNS4zMyA0LjA2TDQuMDYgNS4zMyA3LjUgOC43N2MwIDIuMDggMS41NiAzLjIxIDMuOTEgMy45MWwzLjUxIDMuNTFjLS4zNC40OC0xLjA1LjkxLTIuNDIuOTEtMi4wNiAwLTIuODctLjkyLTIuOTgtMi4xaC0yLjJjLjEyIDIuMTkgMS43NiAzLjQyIDMuNjggMy44M1YyMWgzdi0yLjE1Yy45Ni0uMTggMS44Mi0uNTUgMi40NS0xLjEybDIuMjIgMi4yMiAxLjI3LTEuMjdMNS4zMyA0LjA2eiIgLz48L2c+CjxnIGlkPSJtdWx0aWxpbmUtY2hhcnQiPjxwYXRoIGQ9Ik0yMiA2LjkybC0xLjQxLTEuNDEtMi44NSAzLjIxQzE1LjY4IDYuNCAxMi44MyA1IDkuNjEgNSA2LjcyIDUgNC4wNyA2LjE2IDIgOGwxLjQyIDEuNDJDNS4xMiA3LjkzIDcuMjcgNyA5LjYxIDdjMi43NCAwIDUuMDkgMS4yNiA2Ljc3IDMuMjRsLTIuODggMy4yNC00LTRMMiAxNi45OWwxLjUgMS41IDYtNi4wMSA0IDQgNC4wNS00LjU1Yy43NSAxLjM1IDEuMjUgMi45IDEuNDQgNC41NUgyMWMtLjIyLTIuMy0uOTUtNC4zOS0yLjA0LTYuMTRMMjIgNi45MnoiIC8+PC9nPgo8ZyBpZD0icGllLWNoYXJ0Ij48cGF0aCBkPSJNMTEgMnYyMGMtNS4wNy0uNS05LTQuNzktOS0xMHMzLjkzLTkuNSA5LTEwem0yLjAzIDB2OC45OUgyMmMtLjQ3LTQuNzQtNC4yNC04LjUyLTguOTctOC45OXptMCAxMS4wMVYyMmM0Ljc0LS40NyA4LjUtNC4yNSA4Ljk3LTguOTloLTguOTd6IiAvPjwvZz4KPGcgaWQ9InBpZS1jaGFydC1vdXRsaW5lZCI+PHBhdGggZD0iTTEyIDJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyem0xIDIuMDdjMy42MS40NSA2LjQ4IDMuMzMgNi45MyA2LjkzSDEzVjQuMDd6TTQgMTJjMC00LjA2IDMuMDctNy40NCA3LTcuOTN2MTUuODdjLTMuOTMtLjUtNy0zLjg4LTctNy45NHptOSA3LjkzVjEzaDYuOTNjLS40NSAzLjYxLTMuMzIgNi40OC02LjkzIDYuOTN6IiAvPjwvZz4KPGcgaWQ9InB1Ymxpc2giPjxwYXRoIGQ9Ik01IDR2MmgxNFY0SDV6bTAgMTBoNHY2aDZ2LTZoNGwtNy03LTcgN3oiIC8+PC9nPgo8ZyBpZD0ic2hvcnQtdGV4dCI+PHBhdGggZD0iTTQgOWgxNnYySDR6bTAgNGgxMHYySDR6IiAvPjwvZz4KPGcgaWQ9InNob3ctY2hhcnQiPjxwYXRoIGQ9Ik0zLjUgMTguNDlsNi02LjAxIDQgNEwyMiA2LjkybC0xLjQxLTEuNDEtNy4wOSA3Ljk3LTQtNEwyIDE2Ljk5eiIgLz48L2c+CjxnIGlkPSJzcGFjZS1iYXIiPjxwYXRoIGQ9Ik0xOCA5djRINlY5SDR2NmgxNlY5eiIgLz48L2c+CjxnIGlkPSJzdHJpa2V0aHJvdWdoLXMiPjxwYXRoIGQ9Ik03LjI0IDguNzVjLS4yNi0uNDgtLjM5LTEuMDMtLjM5LTEuNjcgMC0uNjEuMTMtMS4xNi40LTEuNjcuMjYtLjUuNjMtLjkzIDEuMTEtMS4yOS40OC0uMzUgMS4wNS0uNjMgMS43LS44My42Ni0uMTkgMS4zOS0uMjkgMi4xOC0uMjkuODEgMCAxLjU0LjExIDIuMjEuMzQuNjYuMjIgMS4yMy41NCAxLjY5Ljk0LjQ3LjQuODMuODggMS4wOCAxLjQzLjI1LjU1LjM4IDEuMTUuMzggMS44MWgtMy4wMWMwLS4zMS0uMDUtLjU5LS4xNS0uODUtLjA5LS4yNy0uMjQtLjQ5LS40NC0uNjgtLjItLjE5LS40NS0uMzMtLjc1LS40NC0uMy0uMS0uNjYtLjE2LTEuMDYtLjE2LS4zOSAwLS43NC4wNC0xLjAzLjEzLS4yOS4wOS0uNTMuMjEtLjcyLjM2LS4xOS4xNi0uMzQuMzQtLjQ0LjU1LS4xLjIxLS4xNS40My0uMTUuNjYgMCAuNDguMjUuODguNzQgMS4yMS4zOC4yNS43Ny40OCAxLjQxLjdINy4zOWMtLjA1LS4wOC0uMTEtLjE3LS4xNS0uMjV6TTIxIDEydi0ySDN2Mmg5LjYyYy4xOC4wNy40LjE0LjU1LjIuMzcuMTcuNjYuMzQuODcuNTEuMjEuMTcuMzUuMzYuNDMuNTcuMDcuMi4xMS40My4xMS42OSAwIC4yMy0uMDUuNDUtLjE0LjY2LS4wOS4yLS4yMy4zOC0uNDIuNTMtLjE5LjE1LS40Mi4yNi0uNzEuMzUtLjI5LjA4LS42My4xMy0xLjAxLjEzLS40MyAwLS44My0uMDQtMS4xOC0uMTNzLS42Ni0uMjMtLjkxLS40MmMtLjI1LS4xOS0uNDUtLjQ0LS41OS0uNzUtLjE0LS4zMS0uMjUtLjc2LS4yNS0xLjIxSDYuNGMwIC41NS4wOCAxLjEzLjI0IDEuNTguMTYuNDUuMzcuODUuNjUgMS4yMS4yOC4zNS42LjY2Ljk4LjkyLjM3LjI2Ljc4LjQ4IDEuMjIuNjUuNDQuMTcuOS4zIDEuMzguMzkuNDguMDguOTYuMTMgMS40NC4xMy44IDAgMS41My0uMDkgMi4xOC0uMjhzMS4yMS0uNDUgMS42Ny0uNzljLjQ2LS4zNC44Mi0uNzcgMS4wNy0xLjI3cy4zOC0xLjA3LjM4LTEuNzFjMC0uNi0uMS0xLjE0LS4zMS0xLjYxLS4wNS0uMTEtLjExLS4yMy0uMTctLjMzSDIxeiIgLz48L2c+CjxnIGlkPSJ0ZXh0LWZpZWxkcyI+PHBhdGggZD0iTTIuNSA0djNoNXYxMmgzVjdoNVY0aC0xM3ptMTkgNWgtOXYzaDN2N2gzdi03aDNWOXoiIC8+PC9nPgo8ZyBpZD0idGl0bGUiPjxwYXRoIGQ9Ik01IDR2M2g1LjV2MTJoM1Y3SDE5VjR6IiAvPjwvZz4KPGcgaWQ9InZlcnRpY2FsLWFsaWduLWJvdHRvbSI+PHBhdGggZD0iTTE2IDEzaC0zVjNoLTJ2MTBIOGw0IDQgNC00ek00IDE5djJoMTZ2LTJINHoiIC8+PC9nPgo8ZyBpZD0idmVydGljYWwtYWxpZ24tY2VudGVyIj48cGF0aCBkPSJNOCAxOWgzdjRoMnYtNGgzbC00LTQtNCA0em04LTE0aC0zVjFoLTJ2NEg4bDQgNCA0LTR6TTQgMTF2MmgxNnYtMkg0eiIgLz48L2c+CjxnIGlkPSJ2ZXJ0aWNhbC1hbGlnbi10b3AiPjxwYXRoIGQ9Ik04IDExaDN2MTBoMlYxMWgzbC00LTQtNCA0ek00IDN2MmgxNlYzSDR6IiAvPjwvZz4KPGcgaWQ9IndyYXAtdGV4dCI+PHBhdGggZD0iTTQgMTloNnYtMkg0djJ6TTIwIDVINHYyaDE2VjV6bS0zIDZINHYyaDEzLjI1YzEuMSAwIDIgLjkgMiAycy0uOSAyLTIgMkgxNXYtMmwtMyAzIDMgM3YtMmgyYzIuMjEgMCA0LTEuNzkgNC00cy0xLjc5LTQtNC00eiIgLz48L2c+CjwvZGVmcz48L3N2Zz4KPC9pcm9uLWljb25zZXQtc3ZnPgoKCgo8aXJvbi1pY29uc2V0LXN2ZyBuYW1lPSJoYXJkd2FyZSIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iY2FzdCI+PHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2M2gyVjVoMTh2MTRoLTd2Mmg3YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6TTEgMTh2M2gzYzAtMS42Ni0xLjM0LTMtMy0zem0wLTR2MmMyLjc2IDAgNSAyLjI0IDUgNWgyYzAtMy44Ny0zLjEzLTctNy03em0wLTR2MmM0Ljk3IDAgOSA0LjAzIDkgOWgyYzAtNi4wOC00LjkzLTExLTExLTExeiIgLz48L2c+CjxnIGlkPSJjYXN0LWNvbm5lY3RlZCI+PHBhdGggZD0iTTEgMTh2M2gzYzAtMS42Ni0xLjM0LTMtMy0zem0wLTR2MmMyLjc2IDAgNSAyLjI0IDUgNWgyYzAtMy44Ny0zLjEzLTctNy03em0xOC03SDV2MS42M2MzLjk2IDEuMjggNy4wOSA0LjQxIDguMzcgOC4zN0gxOVY3ek0xIDEwdjJjNC45NyAwIDkgNC4wMyA5IDloMmMwLTYuMDgtNC45My0xMS0xMS0xMXptMjAtN0gzYy0xLjEgMC0yIC45LTIgMnYzaDJWNWgxOHYxNGgtN3YyaDdjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0iY29tcHV0ZXIiPjxwYXRoIGQ9Ik0yMCAxOGMxLjEgMCAxLjk5LS45IDEuOTktMkwyMiA2YzAtMS4xLS45LTItMi0ySDRjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJIMHYyaDI0di0yaC00ek00IDZoMTZ2MTBINFY2eiIgLz48L2c+CjxnIGlkPSJkZXNrdG9wLW1hYyI+PHBhdGggZD0iTTIxIDJIM2MtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmg3bC0yIDN2MWg4di0xbC0yLTNoN2MxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0wIDEySDNWNGgxOHYxMHoiIC8+PC9nPgo8ZyBpZD0iZGVza3RvcC13aW5kb3dzIj48cGF0aCBkPSJNMjEgMkgzYy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDd2Mkg4djJoOHYtMmgtMnYtMmg3YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bTAgMTRIM1Y0aDE4djEyeiIgLz48L2c+CjxnIGlkPSJkZXZlbG9wZXItYm9hcmQiPjxwYXRoIGQ9Ik0yMiA5VjdoLTJWNWMwLTEuMS0uOS0yLTItMkg0Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0ydi0yaDJ2LTJoLTJ2LTJoMnYtMmgtMlY5aDJ6bS00IDEwSDRWNWgxNHYxNHpNNiAxM2g1djRINnptNi02aDR2M2gtNHpNNiA3aDV2NUg2em02IDRoNHY2aC00eiIgLz48L2c+CjxnIGlkPSJkZXZpY2UtaHViIj48cGF0aCBkPSJNMTcgMTZsLTQtNFY4LjgyQzE0LjE2IDguNCAxNSA3LjMgMTUgNmMwLTEuNjYtMS4zNC0zLTMtM1M5IDQuMzQgOSA2YzAgMS4zLjg0IDIuNCAyIDIuODJWMTJsLTQgNEgzdjVoNXYtMy4wNWw0LTQuMiA0IDQuMlYyMWg1di01aC00eiIgLz48L2c+CjxnIGlkPSJkZXZpY2VzLW90aGVyIj48cGF0aCBkPSJNMyA2aDE4VjRIM2MtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmg0di0ySDNWNnptMTAgNkg5djEuNzhjLS42MS41NS0xIDEuMzMtMSAyLjIycy4zOSAxLjY3IDEgMi4yMlYyMGg0di0xLjc4Yy42MS0uNTUgMS0xLjM0IDEtMi4yMnMtLjM5LTEuNjctMS0yLjIyVjEyem0tMiA1LjVjLS44MyAwLTEuNS0uNjctMS41LTEuNXMuNjctMS41IDEuNS0xLjUgMS41LjY3IDEuNSAxLjUtLjY3IDEuNS0xLjUgMS41ek0yMiA4aC02Yy0uNSAwLTEgLjUtMSAxdjEwYzAgLjUuNSAxIDEgMWg2Yy41IDAgMS0uNSAxLTFWOWMwLS41LS41LTEtMS0xem0tMSAxMGgtNHYtOGg0djh6IiAvPjwvZz4KPGcgaWQ9ImRvY2siPjxwYXRoIGQ9Ik04IDIzaDh2LTJIOHYyem04LTIxLjk5TDggMWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMS45OS0yLTEuOTl6TTE2IDE1SDhWNWg4djEweiIgLz48L2c+CjxnIGlkPSJnYW1lcGFkIj48cGF0aCBkPSJNMTUgNy41VjJIOXY1LjVsMyAzIDMtM3pNNy41IDlIMnY2aDUuNWwzLTMtMy0zek05IDE2LjVWMjJoNnYtNS41bC0zLTMtMyAzek0xNi41IDlsLTMgMyAzIDNIMjJWOWgtNS41eiIgLz48L2c+CjxnIGlkPSJoZWFkc2V0Ij48cGF0aCBkPSJNMTIgMWMtNC45NyAwLTkgNC4wMy05IDl2N2MwIDEuNjYgMS4zNCAzIDMgM2gzdi04SDV2LTJjMC0zLjg3IDMuMTMtNyA3LTdzNyAzLjEzIDcgN3YyaC00djhoM2MxLjY2IDAgMy0xLjM0IDMtM3YtN2MwLTQuOTctNC4wMy05LTktOXoiIC8+PC9nPgo8ZyBpZD0iaGVhZHNldC1taWMiPjxwYXRoIGQ9Ik0xMiAxYy00Ljk3IDAtOSA0LjAzLTkgOXY3YzAgMS42NiAxLjM0IDMgMyAzaDN2LThINXYtMmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3djJoLTR2OGg0djFoLTd2Mmg2YzEuNjYgMCAzLTEuMzQgMy0zVjEwYzAtNC45Ny00LjAzLTktOS05eiIgLz48L2c+CjxnIGlkPSJrZXlib2FyZCI+PHBhdGggZD0iTTIwIDVINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE3YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnptLTkgM2gydjJoLTJWOHptMCAzaDJ2MmgtMnYtMnpNOCA4aDJ2Mkg4Vjh6bTAgM2gydjJIOHYtMnptLTEgMkg1di0yaDJ2MnptMC0zSDVWOGgydjJ6bTkgN0g4di0yaDh2MnptMC00aC0ydi0yaDJ2MnptMC0zaC0yVjhoMnYyem0zIDNoLTJ2LTJoMnYyem0wLTNoLTJWOGgydjJ6IiAvPjwvZz4KPGcgaWQ9ImtleWJvYXJkLWFycm93LWRvd24iPjxwYXRoIGQ9Ik03LjQxIDcuODRMMTIgMTIuNDJsNC41OS00LjU4TDE4IDkuMjVsLTYgNi02LTZ6IiAvPjwvZz4KPGcgaWQ9ImtleWJvYXJkLWFycm93LWxlZnQiPjxwYXRoIGQ9Ik0xNS40MSAxNi4wOWwtNC41OC00LjU5IDQuNTgtNC41OUwxNCA1LjVsLTYgNiA2IDZ6IiAvPjwvZz4KPGcgaWQ9ImtleWJvYXJkLWFycm93LXJpZ2h0Ij48cGF0aCBkPSJNOC41OSAxNi4zNGw0LjU4LTQuNTktNC41OC00LjU5TDEwIDUuNzVsNiA2LTYgNnoiIC8+PC9nPgo8ZyBpZD0ia2V5Ym9hcmQtYXJyb3ctdXAiPjxwYXRoIGQ9Ik03LjQxIDE1LjQxTDEyIDEwLjgzbDQuNTkgNC41OEwxOCAxNGwtNi02LTYgNnoiIC8+PC9nPgo8ZyBpZD0ia2V5Ym9hcmQtYmFja3NwYWNlIj48cGF0aCBkPSJNMjEgMTFINi44M2wzLjU4LTMuNTlMOSA2bC02IDYgNiA2IDEuNDEtMS40MUw2LjgzIDEzSDIxeiIgLz48L2c+CjxnIGlkPSJrZXlib2FyZC1jYXBzbG9jayI+PHBhdGggZD0iTTEyIDguNDFMMTYuNTkgMTMgMTggMTEuNTlsLTYtNi02IDZMNy40MSAxMyAxMiA4LjQxek02IDE4aDEydi0ySDZ2MnoiIC8+PC9nPgo8ZyBpZD0ia2V5Ym9hcmQtaGlkZSI+PHBhdGggZD0iTTIwIDNINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE1YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTkgM2gydjJoLTJWNnptMCAzaDJ2MmgtMlY5ek04IDZoMnYySDhWNnptMCAzaDJ2Mkg4Vjl6bS0xIDJINVY5aDJ2MnptMC0zSDVWNmgydjJ6bTkgN0g4di0yaDh2MnptMC00aC0yVjloMnYyem0wLTNoLTJWNmgydjJ6bTMgM2gtMlY5aDJ2MnptMC0zaC0yVjZoMnYyem0tNyAxNWw0LTRIOGw0IDR6IiAvPjwvZz4KPGcgaWQ9ImtleWJvYXJkLXJldHVybiI+PHBhdGggZD0iTTE5IDd2NEg1LjgzbDMuNTgtMy41OUw4IDZsLTYgNiA2IDYgMS40MS0xLjQxTDUuODMgMTNIMjFWN3oiIC8+PC9nPgo8ZyBpZD0ia2V5Ym9hcmQtdGFiIj48cGF0aCBkPSJNMTEuNTkgNy40MUwxNS4xNyAxMUgxdjJoMTQuMTdsLTMuNTkgMy41OUwxMyAxOGw2LTYtNi02LTEuNDEgMS40MXpNMjAgNnYxMmgyVjZoLTJ6IiAvPjwvZz4KPGcgaWQ9ImtleWJvYXJkLXZvaWNlIj48cGF0aCBkPSJNMTIgMTVjMS42NiAwIDIuOTktMS4zNCAyLjk5LTNMMTUgNmMwLTEuNjYtMS4zNC0zLTMtM1M5IDQuMzQgOSA2djZjMCAxLjY2IDEuMzQgMyAzIDN6bTUuMy0zYzAgMy0yLjU0IDUuMS01LjMgNS4xUzYuNyAxNSA2LjcgMTJINWMwIDMuNDIgMi43MiA2LjIzIDYgNi43MlYyMmgydi0zLjI4YzMuMjgtLjQ4IDYtMy4zIDYtNi43MmgtMS43eiIgLz48L2c+CjxnIGlkPSJsYXB0b3AiPjxwYXRoIGQ9Ik0yMCAxOGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0ySDRjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJIMHYyaDI0di0yaC00ek00IDZoMTZ2MTBINFY2eiIgLz48L2c+CjxnIGlkPSJsYXB0b3AtY2hyb21lYm9vayI+PHBhdGggZD0iTTIyIDE4VjNIMnYxNUgwdjJoMjR2LTJoLTJ6bS04IDBoLTR2LTFoNHYxem02LTNINFY1aDE2djEweiIgLz48L2c+CjxnIGlkPSJsYXB0b3AtbWFjIj48cGF0aCBkPSJNMjAgMThjMS4xIDAgMS45OS0uOSAxLjk5LTJMMjIgNWMwLTEuMS0uOS0yLTItMkg0Yy0xLjEgMC0yIC45LTIgMnYxMWMwIDEuMS45IDIgMiAySDBjMCAxLjEuOSAyIDIgMmgyMGMxLjEgMCAyLS45IDItMmgtNHpNNCA1aDE2djExSDRWNXptOCAxNGMtLjU1IDAtMS0uNDUtMS0xcy40NS0xIDEtMSAxIC40NSAxIDEtLjQ1IDEtMSAxeiIgLz48L2c+CjxnIGlkPSJsYXB0b3Atd2luZG93cyI+PHBhdGggZD0iTTIwIDE4di0xYzEuMSAwIDEuOTktLjkgMS45OS0yTDIyIDVjMC0xLjEtLjktMi0yLTJINGMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMnYxSDB2MmgyNHYtMmgtNHpNNCA1aDE2djEwSDRWNXoiIC8+PC9nPgo8ZyBpZD0ibWVtb3J5Ij48cGF0aCBkPSJNMTUgOUg5djZoNlY5em0tMiA0aC0ydi0yaDJ2MnptOC0yVjloLTJWN2MwLTEuMS0uOS0yLTItMmgtMlYzaC0ydjJoLTJWM0g5djJIN2MtMS4xIDAtMiAuOS0yIDJ2MkgzdjJoMnYySDN2MmgydjJjMCAxLjEuOSAyIDIgMmgydjJoMnYtMmgydjJoMnYtMmgyYzEuMSAwIDItLjkgMi0ydi0yaDJ2LTJoLTJ2LTJoMnptLTQgNkg3VjdoMTB2MTB6IiAvPjwvZz4KPGcgaWQ9Im1vdXNlIj48cGF0aCBkPSJNMTMgMS4wN1Y5aDdjMC00LjA4LTMuMDUtNy40NC03LTcuOTN6TTQgMTVjMCA0LjQyIDMuNTggOCA4IDhzOC0zLjU4IDgtOHYtNEg0djR6bTctMTMuOTNDNy4wNSAxLjU2IDQgNC45MiA0IDloN1YxLjA3eiIgLz48L2c+CjxnIGlkPSJwaG9uZS1hbmRyb2lkIj48cGF0aCBkPSJNMTYgMUg4QzYuMzQgMSA1IDIuMzQgNSA0djE2YzAgMS42NiAxLjM0IDMgMyAzaDhjMS42NiAwIDMtMS4zNCAzLTNWNGMwLTEuNjYtMS4zNC0zLTMtM3ptLTIgMjBoLTR2LTFoNHYxem0zLjI1LTNINi43NVY0aDEwLjV2MTR6IiAvPjwvZz4KPGcgaWQ9InBob25lLWlwaG9uZSI+PHBhdGggZD0iTTE1LjUgMWgtOEM2LjEyIDEgNSAyLjEyIDUgMy41djE3QzUgMjEuODggNi4xMiAyMyA3LjUgMjNoOGMxLjM4IDAgMi41LTEuMTIgMi41LTIuNXYtMTdDMTggMi4xMiAxNi44OCAxIDE1LjUgMXptLTQgMjFjLS44MyAwLTEuNS0uNjctMS41LTEuNXMuNjctMS41IDEuNS0xLjUgMS41LjY3IDEuNSAxLjUtLjY3IDEuNS0xLjUgMS41em00LjUtNEg3VjRoOXYxNHoiIC8+PC9nPgo8ZyBpZD0icGhvbmVsaW5rIj48cGF0aCBkPSJNNCA2aDE4VjRINGMtMS4xIDAtMiAuOS0yIDJ2MTFIMHYzaDE0di0zSDRWNnptMTkgMmgtNmMtLjU1IDAtMSAuNDUtMSAxdjEwYzAgLjU1LjQ1IDEgMSAxaDZjLjU1IDAgMS0uNDUgMS0xVjljMC0uNTUtLjQ1LTEtMS0xem0tMSA5aC00di03aDR2N3oiIC8+PC9nPgo8ZyBpZD0icGhvbmVsaW5rLW9mZiI+PHBhdGggZD0iTTIyIDZWNEg2LjgybDIgMkgyMnpNMS45MiAxLjY1TC42NSAyLjkybDEuODIgMS44MkMyLjE4IDUuMDggMiA1LjUyIDIgNnYxMUgwdjNoMTcuNzNsMi4zNSAyLjM1IDEuMjctMS4yN0wzLjg5IDMuNjIgMS45MiAxLjY1ek00IDYuMjdMMTQuNzMgMTdINFY2LjI3ek0yMyA4aC02Yy0uNTUgMC0xIC40NS0xIDF2NC4xOGwyIDJWMTBoNHY3aC0yLjE4bDMgM0gyM2MuNTUgMCAxLS40NSAxLTFWOWMwLS41NS0uNDUtMS0xLTF6IiAvPjwvZz4KPGcgaWQ9InBvd2VyLWlucHV0Ij48cGF0aCBkPSJNMiA5djJoMTlWOUgyem0wIDZoNXYtMkgydjJ6bTcgMGg1di0ySDl2MnptNyAwaDV2LTJoLTV2MnoiIC8+PC9nPgo8ZyBpZD0icm91dGVyIj48cGF0aCBkPSJNMjAuMiA1LjlsLjgtLjhDMTkuNiAzLjcgMTcuOCAzIDE2IDNzLTMuNi43LTUgMi4xbC44LjhDMTMgNC44IDE0LjUgNC4yIDE2IDQuMnMzIC42IDQuMiAxLjd6bS0uOS44Yy0uOS0uOS0yLjEtMS40LTMuMy0xLjRzLTIuNC41LTMuMyAxLjRsLjguOGMuNy0uNyAxLjYtMSAyLjUtMSAuOSAwIDEuOC4zIDIuNSAxbC44LS44ek0xOSAxM2gtMlY5aC0ydjRINWMtMS4xIDAtMiAuOS0yIDJ2NGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0ydi00YzAtMS4xLS45LTItMi0yek04IDE4SDZ2LTJoMnYyem0zLjUgMGgtMnYtMmgydjJ6bTMuNSAwaC0ydi0yaDJ2MnoiIC8+PC9nPgo8ZyBpZD0ic2Nhbm5lciI+PHBhdGggZD0iTTE5LjggMTAuN0w0LjIgNWwtLjcgMS45TDE3LjYgMTJINWMtMS4xIDAtMiAuOS0yIDJ2NGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0ydi01LjVjMC0uOC0uNS0xLjYtMS4yLTEuOHpNNyAxN0g1di0yaDJ2MnptMTIgMEg5di0yaDEwdjJ6IiAvPjwvZz4KPGcgaWQ9InNlY3VyaXR5Ij48cGF0aCBkPSJNMTIgMUwzIDV2NmMwIDUuNTUgMy44NCAxMC43NCA5IDEyIDUuMTYtMS4yNiA5LTYuNDUgOS0xMlY1bC05LTR6bTAgMTAuOTloN2MtLjUzIDQuMTItMy4yOCA3Ljc5LTcgOC45NFYxMkg1VjYuM2w3LTMuMTF2OC44eiIgLz48L2c+CjxnIGlkPSJzaW0tY2FyZCI+PHBhdGggZD0iTTE5Ljk5IDRjMC0xLjEtLjg5LTItMS45OS0yaC04TDQgOHYxMmMwIDEuMS45IDIgMiAyaDEyLjAxYzEuMSAwIDEuOTktLjkgMS45OS0ybC0uMDEtMTZ6TTkgMTlIN3YtMmgydjJ6bTggMGgtMnYtMmgydjJ6bS04LTRIN3YtNGgydjR6bTQgNGgtMnYtNGgydjR6bTAtNmgtMnYtMmgydjJ6bTQgMmgtMnYtNGgydjR6IiAvPjwvZz4KPGcgaWQ9InNtYXJ0cGhvbmUiPjxwYXRoIGQ9Ik0xNyAxLjAxTDcgMWMtMS4xIDAtMiAuOS0yIDJ2MThjMCAxLjEuOSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTEuOTktMi0xLjk5ek0xNyAxOUg3VjVoMTB2MTR6IiAvPjwvZz4KPGcgaWQ9InNwZWFrZXIiPjxwYXRoIGQ9Ik0xNyAySDdjLTEuMSAwLTIgLjktMiAydjE2YzAgMS4xLjkgMS45OSAyIDEuOTlMMTcgMjJjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTUgMmMxLjEgMCAyIC45IDIgMnMtLjkgMi0yIDJjLTEuMTEgMC0yLS45LTItMnMuODktMiAyLTJ6bTAgMTZjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1em0wLThjLTEuNjYgMC0zIDEuMzQtMyAzczEuMzQgMyAzIDMgMy0xLjM0IDMtMy0xLjM0LTMtMy0zeiIgLz48L2c+CjxnIGlkPSJzcGVha2VyLWdyb3VwIj48cGF0aCBkPSJNMTguMiAxSDkuOEM4LjgxIDEgOCAxLjgxIDggMi44djE0LjRjMCAuOTkuODEgMS43OSAxLjggMS43OWw4LjQuMDFjLjk5IDAgMS44LS44MSAxLjgtMS44VjIuOGMwLS45OS0uODEtMS44LTEuOC0xLjh6TTE0IDNjMS4xIDAgMiAuODkgMiAycy0uOSAyLTIgMi0yLS44OS0yLTIgLjktMiAyLTJ6bTAgMTMuNWMtMi4yMSAwLTQtMS43OS00LTRzMS43OS00IDQtNCA0IDEuNzkgNCA0LTEuNzkgNC00IDR6IiAvPjxjaXJjbGUgY3g9IjE0IiBjeT0iMTIuNSIgcj0iMi41IiAvPjxwYXRoIGQ9Ik02IDVINHYxNmMwIDEuMS44OSAyIDIgMmgxMHYtMkg2VjV6IiAvPjwvZz4KPGcgaWQ9InRhYmxldCI+PHBhdGggZD0iTTIxIDRIM2MtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAxLjk5LS45IDEuOTktMkwyMyA2YzAtMS4xLS45LTItMi0yem0tMiAxNEg1VjZoMTR2MTJ6IiAvPjwvZz4KPGcgaWQ9InRhYmxldC1hbmRyb2lkIj48cGF0aCBkPSJNMTggMEg2QzQuMzQgMCAzIDEuMzQgMyAzdjE4YzAgMS42NiAxLjM0IDMgMyAzaDEyYzEuNjYgMCAzLTEuMzQgMy0zVjNjMC0xLjY2LTEuMzQtMy0zLTN6bS00IDIyaC00di0xaDR2MXptNS4yNS0zSDQuNzVWM2gxNC41djE2eiIgLz48L2c+CjxnIGlkPSJ0YWJsZXQtbWFjIj48cGF0aCBkPSJNMTguNSAwaC0xNEMzLjEyIDAgMiAxLjEyIDIgMi41djE5QzIgMjIuODggMy4xMiAyNCA0LjUgMjRoMTRjMS4zOCAwIDIuNS0xLjEyIDIuNS0yLjV2LTE5QzIxIDEuMTIgMTkuODggMCAxOC41IDB6bS03IDIzYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVzLjY3LTEuNSAxLjUtMS41IDEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXptNy41LTRINFYzaDE1djE2eiIgLz48L2c+CjxnIGlkPSJ0b3lzIj48cGF0aCBkPSJNMTIgMTJjMC0zIDIuNS01LjUgNS41LTUuNVMyMyA5IDIzIDEySDEyem0wIDBjMCAzLTIuNSA1LjUtNS41IDUuNVMxIDE1IDEgMTJoMTF6bTAgMGMtMyAwLTUuNS0yLjUtNS41LTUuNVM5IDEgMTIgMXYxMXptMCAwYzMgMCA1LjUgMi41IDUuNSA1LjVTMTUgMjMgMTIgMjNWMTJ6IiAvPjwvZz4KPGcgaWQ9InR2Ij48cGF0aCBkPSJNMjEgM0gzYy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDV2Mmg4di0yaDVjMS4xIDAgMS45OS0uOSAxLjk5LTJMMjMgNWMwLTEuMS0uOS0yLTItMnptMCAxNEgzVjVoMTh2MTJ6IiAvPjwvZz4KPGcgaWQ9InZpZGVvZ2FtZS1hc3NldCI+PHBhdGggZD0iTTIxIDZIM2MtMS4xIDAtMiAuOS0yIDJ2OGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bS0xMCA3SDh2M0g2di0zSDN2LTJoM1Y4aDJ2M2gzdjJ6bTQuNSAyYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVzLjY3LTEuNSAxLjUtMS41IDEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXptNC0zYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVTMTguNjcgOSAxOS41IDlzMS41LjY3IDEuNSAxLjUtLjY3IDEuNS0xLjUgMS41eiIgLz48L2c+CjxnIGlkPSJ3YXRjaCI+PHBhdGggZD0iTTIwIDEyYzAtMi41NC0xLjE5LTQuODEtMy4wNC02LjI3TDE2IDBIOGwtLjk1IDUuNzNDNS4xOSA3LjE5IDQgOS40NSA0IDEyczEuMTkgNC44MSAzLjA1IDYuMjdMOCAyNGg4bC45Ni01LjczQzE4LjgxIDE2LjgxIDIwIDE0LjU0IDIwIDEyek02IDEyYzAtMy4zMSAyLjY5LTYgNi02czYgMi42OSA2IDYtMi42OSA2LTYgNi02LTIuNjktNi02eiIgLz48L2c+CjwvZGVmcz48L3N2Zz4KPC9pcm9uLWljb25zZXQtc3ZnPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLXBhZ2VzIj4KCiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKDpub3Qoc2xvdCk6bm90KC5pcm9uLXNlbGVjdGVkKSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXRhYiI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWlubGluZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItanVzdGlmaWVkOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LWF1dG87CgogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBwYWRkaW5nOiAwIDEycHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWI7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtsaW5rXSkgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC50YWItY29udGVudCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4xcyBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDEsIDEpOwogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItY2VudGVyOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LWF1dG87CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiLWNvbnRlbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpub3QoLmlyb24tc2VsZWN0ZWQpKSA+IC50YWItY29udGVudCB7CiAgICAgICAgb3BhY2l0eTogMC44OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWItY29udGVudC11bnNlbGVjdGVkOwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpIC50YWItY29udGVudCB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICBmb250LXdlaWdodDogNzAwOwogICAgICB9CgogICAgICBwYXBlci1yaXBwbGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10YWItaW5rLCB2YXIoLS1wYXBlci15ZWxsb3ctYTEwMCkpOwogICAgICB9CgogICAgICAudGFiLWNvbnRlbnQgPiA6OnNsb3R0ZWQoYSkgewogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LWF1dG87CgogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGNsYXNzPSJ0YWItY29udGVudCI+CiAgICAgIDxzbG90Pjwvc2xvdD4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgo8aXJvbi1pY29uc2V0LXN2ZyBuYW1lPSJwYXBlci10YWJzIiBzaXplPSIyNCI+Cjxzdmc+PGRlZnM+CjxnIGlkPSJjaGV2cm9uLWxlZnQiPjxwYXRoIGQ9Ik0xNS40MSA3LjQxTDE0IDZsLTYgNiA2IDYgMS40MS0xLjQxTDEwLjgzIDEyeiIgLz48L2c+CjxnIGlkPSJjaGV2cm9uLXJpZ2h0Ij48cGF0aCBkPSJNMTAgNkw4LjU5IDcuNDEgMTMuMTcgMTJsLTQuNTggNC41OUwxMCAxOGw2LTZ6IiAvPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXRhYnMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwoKICAgICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwoKICAgICAgICAvKiBOT1RFOiBCb3RoIHZhbHVlcyBhcmUgbmVlZGVkLCBzaW5jZSBzb21lIHBob25lcyByZXF1aXJlIHRoZSB2YWx1ZSB0byBiZSBgdHJhbnNwYXJlbnRgLiAqLwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTsKICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWJzOwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbC1yZXZlcnNlOwogICAgICB9CgogICAgICAjdGFic0NvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWJzLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgLW1vei1mbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIC1tcy1mbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFicy1jb250ZW50OwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQuc2Nyb2xsYWJsZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudDpub3QoLnNjcm9sbGFibGUpLAogICAgICAjdGFic0NvbnRlbnQuc2Nyb2xsYWJsZS5maXQtY29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUuZml0LWNvbnRhaW5lciB7CiAgICAgICAgbWluLXdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQuc2Nyb2xsYWJsZS5maXQtY29udGFpbmVyID4gOjpzbG90dGVkKCopIHsKICAgICAgICAvKiBJRSAtIHByZXZlbnQgdGFicyBmcm9tIGNvbXByZXNzaW5nIHdoZW4gdGhleSBzaG91bGQgc2Nyb2xsLiAqLwogICAgICAgIC1tcy1mbGV4OiAxIDAgYXV0bzsKICAgICAgICAtd2Via2l0LWZsZXg6IDEgMCBhdXRvOwogICAgICAgIGZsZXg6IDEgMCBhdXRvOwogICAgICB9CgogICAgICAuaGlkZGVuIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAubm90LXZpc2libGUgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgd2lkdGg6IDQ4cHg7CiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgbWFyZ2luOiAwIDRweDsKICAgICAgfQoKICAgICAgI3NlbGVjdGlvbkJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGhlaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgdmFyKC0tcGFwZXItdGFicy1zZWxlY3Rpb24tYmFyLWNvbG9yLCB2YXIoLS1wYXBlci15ZWxsb3ctYTEwMCkpOwogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm07CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWJzLXNlbGVjdGlvbi1iYXI7CiAgICAgIH0KCiAgICAgICNzZWxlY3Rpb25CYXIuYWxpZ24tYm90dG9tIHsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiBhdXRvOwogICAgICB9CgogICAgICAjc2VsZWN0aW9uQmFyLmV4cGFuZCB7CiAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4xNXM7CiAgICAgICAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMSwgMSk7CiAgICAgIH0KCiAgICAgICNzZWxlY3Rpb25CYXIuY29udHJhY3QgewogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMThzOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wLCAwLjAsIDAuMiwgMSk7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudCA+IDo6c2xvdHRlZCg6bm90KCNzZWxlY3Rpb25CYXIpKSB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJwYXBlci10YWJzOmNoZXZyb24tbGVmdCIgY2xhc3MkPSJbW19jb21wdXRlU2Nyb2xsQnV0dG9uQ2xhc3MoX2xlZnRIaWRkZW4sIHNjcm9sbGFibGUsIGhpZGVTY3JvbGxCdXR0b25zKV1dIiBvbi11cD0iX29uU2Nyb2xsQnV0dG9uVXAiIG9uLWRvd249Il9vbkxlZnRTY3JvbGxCdXR0b25Eb3duIiB0YWJpbmRleD0iLTEiPjwvcGFwZXItaWNvbi1idXR0b24+CgogICAgPGRpdiBpZD0idGFic0NvbnRhaW5lciIgb24tdHJhY2s9Il9zY3JvbGwiIG9uLWRvd249Il9kb3duIj4KICAgICAgPGRpdiBpZD0idGFic0NvbnRlbnQiIGNsYXNzJD0iW1tfY29tcHV0ZVRhYnNDb250ZW50Q2xhc3Moc2Nyb2xsYWJsZSwgZml0Q29udGFpbmVyKV1dIj4KICAgICAgICA8ZGl2IGlkPSJzZWxlY3Rpb25CYXIiIGNsYXNzJD0iW1tfY29tcHV0ZVNlbGVjdGlvbkJhckNsYXNzKG5vQmFyLCBhbGlnbkJvdHRvbSldXSIgb24tdHJhbnNpdGlvbmVuZD0iX29uQmFyVHJhbnNpdGlvbkVuZCI+PC9kaXY+CiAgICAgICAgPHNsb3Q+PC9zbG90PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJwYXBlci10YWJzOmNoZXZyb24tcmlnaHQiIGNsYXNzJD0iW1tfY29tcHV0ZVNjcm9sbEJ1dHRvbkNsYXNzKF9yaWdodEhpZGRlbiwgc2Nyb2xsYWJsZSwgaGlkZVNjcm9sbEJ1dHRvbnMpXV0iIG9uLXVwPSJfb25TY3JvbGxCdXR0b25VcCIgb24tZG93bj0iX29uUmlnaHRTY3JvbGxCdXR0b25Eb3duIiB0YWJpbmRleD0iLTEiPjwvcGFwZXItaWNvbi1idXR0b24+CgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1pbmZlcmVuY2UtcGFuZWwiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpZD0ibGludGVyLXBhcGVyLWJ1dHRvbi1zdHlsZSI+CiAgICAgIC8qKgogICAgICAgKiBUaGlzIHN0eWxlIHByZXNlcnZlcyB0aGUgc3R5bGluZyBwcmV2aW91cyB0bwogICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vUG9seW1lckVsZW1lbnRzL3BhcGVyLWJ1dHRvbi9wdWxsLzExNQogICAgICAgKiBUaGlzIGNoYW5nZSBjYW4gYnJlYWsgdGhlIGxheW91dCBvZiBwYXBlci1idXR0b24gY29udGVudC4KICAgICAgICogUmVtb3ZlIHRoaXMgc3R5bGUgdG8gYXBwbHkgdGhlIGNoYW5nZS4KICAgICAgICovCiAgICAgIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQogICAgICB0Zi1vcHRpb24tc2VsZWN0b3IgLm1vZGVsLXR5cGUtYnV0dG9uIHsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgfQogICAgICAuZmxleC1ob2xkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KICAgICAgLnRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDMycHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsKICAgICAgfQogICAgICAuaGVscC1pY29uIHsKICAgICAgICB3aWR0aDogMTVweDsKICAgICAgICBoZWlnaHQ6IDE1cHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBjb2xvcjogIzc1NzU3NTsKICAgICAgfQogICAgICAudG9vbHRpcCB7CiAgICAgICAgd2lkdGg6IDUwMHB4OwogICAgICB9CiAgICAgIC5pbnB1dC1pbi1yb3cgewogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgfQogICAgICAuZmxleC1ncm93IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLm1vZGVsLXR5cGUtbGFiZWwgewogICAgICAgIHBhZGRpbmctdG9wOiAxMHB4OwogICAgICB9CiAgICAgIC5hZGQtbW9kZWwtYnV0dG9uLWhvbGRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAuY2hlY2tib3ggewogICAgICAgIG1hcmdpbi10b3A6IDMwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgICAgLnByZWRpY3QtY2hlY2tib3ggewogICAgICAgIG1hcmdpbi10b3A6IDQzcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgICAgcGFwZXItaW5wdXQgewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yOiAjZjU3YzAwOwogICAgICB9CiAgICAgIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWNvbG9yOiAjM2M0MDQzOwogICAgICAgIC0tcGFwZXItcmFkaW8tYnV0dG9uLXVuY2hlY2tlZC1pbmstY29sb3I6ICMzYzQwNDM7CiAgICAgICAgLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1jb2xvcjogIzNjNDA0MzsKICAgICAgICAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1jaGVja2VkLWluay1jb2xvcjogIzNjNDA0MzsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9InRpdGxlIj5TZXQgdXAgeW91ciBkYXRhIGFuZCBtb2RlbDwvZGl2PgogICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCBsYWJlbD0iSW5mZXJlbmNlIGFkZHJlc3MiIHBsYWNlaG9sZGVyPSJbW2luZmVyZW5jZUFkZHJlc3MxXV0iIHZhbHVlPSJ7e2luZmVyZW5jZUFkZHJlc3MxfX0iPgogICAgPC9wYXBlci1pbnB1dD4KICAgIDxkaXYgY2xhc3M9ImZsZXgtaG9sZGVyIj4KICAgICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCBsYWJlbD0iTW9kZWwgbmFtZSIgcGxhY2Vob2xkZXI9IltbbW9kZWxOYW1lMV1dIiB2YWx1ZT0ie3ttb2RlbE5hbWUxfX0iIGNsYXNzPSJpbnB1dC1pbi1yb3ciPgogICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8cGFwZXItaW5wdXQgYWx3YXlzLWZsb2F0LWxhYmVsIGxhYmVsPSJNb2RlbCB2ZXJzaW9uIChvcHRpb25hbCkiIHBsYWNlaG9sZGVyPSJbW21vZGVsVmVyc2lvbjFdXSIgdmFsdWU9Int7bW9kZWxWZXJzaW9uMX19IiBjbGFzcz0iaW5wdXQtaW4tcm93Ij4KICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCBsYWJlbD0iTW9kZWwgc2lnbmF0dXJlIChvcHRpb25hbCkiIHBsYWNlaG9sZGVyPSJbW21vZGVsU2lnbmF0dXJlMV1dIiB2YWx1ZT0ie3ttb2RlbFNpZ25hdHVyZTF9fSIgY2xhc3M9ImlucHV0LWluLXJvdyI+CiAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8L2Rpdj4KICAgIDxkaXYgaGlkZGVuJD0ie3toaWRlTW9kZWxQYW5lMn19Ij4KICAgICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCBsYWJlbD0iSW5mZXJlbmNlIGFkZHJlc3MiIHBsYWNlaG9sZGVyPSJbW2luZmVyZW5jZUFkZHJlc3MyXV0iIHZhbHVlPSJ7e2luZmVyZW5jZUFkZHJlc3MyfX0iPgogICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8ZGl2IGNsYXNzPSJmbGV4LWhvbGRlciI+CiAgICAgICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCBsYWJlbD0iTW9kZWwgbmFtZSIgcGxhY2Vob2xkZXI9IltbbW9kZWxOYW1lMl1dIiB2YWx1ZT0ie3ttb2RlbE5hbWUyfX0iIGNsYXNzPSJpbnB1dC1pbi1yb3ciPgogICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCBsYWJlbD0iTW9kZWwgdmVyc2lvbiAob3B0aW9uYWwpIiBwbGFjZWhvbGRlcj0iW1ttb2RlbFZlcnNpb24yXV0iIHZhbHVlPSJ7e21vZGVsVmVyc2lvbjJ9fSIgY2xhc3M9ImlucHV0LWluLXJvdyI+CiAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICA8cGFwZXItaW5wdXQgYWx3YXlzLWZsb2F0LWxhYmVsIGxhYmVsPSJNb2RlbCBzaWduYXR1cmUgKG9wdGlvbmFsKSIgcGxhY2Vob2xkZXI9IltbbW9kZWxTaWduYXR1cmUyXV0iIHZhbHVlPSJ7e21vZGVsU2lnbmF0dXJlMn19IiBjbGFzcz0iaW5wdXQtaW4tcm93Ij4KICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iYWRkLW1vZGVsLWJ1dHRvbi1ob2xkZXIiIGhpZGRlbiQ9Int7IWhpZGVNb2RlbFBhbmUyfX0iPgogICAgICA8cGFwZXItYnV0dG9uIG9uLXRhcD0iYWRkTW9kZWxDbGlja2VkXyIgY2xhc3M9Im1haW4tYnV0dG9uIj4KICAgICAgICBBZGQgYW5vdGhlciBtb2RlbCBmb3IgY29tcGFyaXNvbgogICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iZmxleC1ob2xkZXIiPgogICAgICA8ZGl2PgogICAgICAgIDxkaXYgY2xhc3M9Im1vZGVsLXR5cGUtbGFiZWwiPk1vZGVsIFR5cGU8L2Rpdj4KICAgICAgICA8cGFwZXItcmFkaW8tZ3JvdXAgc2VsZWN0ZWQ9Int7bW9kZWxUeXBlfX0iPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJjbGFzc2lmaWNhdGlvbiI+Q2xhc3NpZmljYXRpb248L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0icmVncmVzc2lvbiI+UmVncmVzc2lvbjwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgIDwvZGl2PgogICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3t1c2VQcmVkaWN0QXBpfX0iIGNsYXNzPSJwcmVkaWN0LWNoZWNrYm94Ij4KICAgICAgICBVc2VzIFByZWRpY3QgQVBJCiAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImZsZXgtaG9sZGVyIj4KICAgICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCBsYWJlbD0iSW5wdXQgdGVuc29yIG5hbWUiIHBsYWNlaG9sZGVyPSJbW3ByZWRpY3RJbnB1dFRlbnNvcl1dIiB2YWx1ZT0ie3twcmVkaWN0SW5wdXRUZW5zb3J9fSIgY2xhc3M9ImlucHV0LWluLXJvdyIgaGlkZGVuJD0iW1tzaG91bGREaXNhYmxlUHJlZGljdFRlbnNvckNvbnRyb2xzXyh1c2VQcmVkaWN0QXBpKV1dIj4KICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCBsYWJlbD0iT3V0cHV0IHRlbnNvciBuYW1lIiBwbGFjZWhvbGRlcj0iW1twcmVkaWN0T3V0cHV0VGVuc29yXV0iIHZhbHVlPSJ7e3ByZWRpY3RPdXRwdXRUZW5zb3J9fSIgY2xhc3M9ImlucHV0LWluLXJvdyIgaGlkZGVuJD0iW1tzaG91bGREaXNhYmxlUHJlZGljdFRlbnNvckNvbnRyb2xzXyh1c2VQcmVkaWN0QXBpKV1dIj4KICAgICAgPC9wYXBlci1pbnB1dD4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iZmxleC1ob2xkZXIiPgogICAgICA8cGFwZXItaW5wdXQgYWx3YXlzLWZsb2F0LWxhYmVsIGxhYmVsPSJQYXRoIHRvIGV4YW1wbGVzIiB2YWx1ZT0ie3tleGFtcGxlc1BhdGh9fSIgY2xhc3M9ImZsZXgtZ3JvdyI+CiAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e3NlcXVlbmNlRXhhbXBsZXN9fSIgY2xhc3M9ImNoZWNrYm94Ij4KICAgICAgICBTZXF1ZW5jZUV4YW1wbGVzCiAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImZsZXgtaG9sZGVyIj4KICAgICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCB0eXBlPSJudW1iZXIiIGNsYXNzPSJpbnB1dC1pbi1yb3cgZmxleC1ncm93IiBsYWJlbD0iTWF4aW11bSBudW1iZXIgb2YgZXhhbXBsZXMgdG8gbG9hZCIgcGxhY2Vob2xkZXI9IltbbWF4RXhhbXBsZXNdXSIgdmFsdWU9Int7bWF4RXhhbXBsZXN9fSI+CiAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgIDxwYXBlci1pbnB1dCBhbHdheXMtZmxvYXQtbGFiZWwgdHlwZT0ibnVtYmVyIiBjbGFzcz0iaW5wdXQtaW4tcm93IGZsZXgtZ3JvdyIgbGFiZWw9IlNhbXBsaW5nIHJhdGlvICgwLjIgPSBzYW1wbGUgfjIwJSBvZiBleGFtcGxlcykiIHBsYWNlaG9sZGVyPSJbW3NhbXBsaW5nT2Rkc11dIiB2YWx1ZT0ie3tzYW1wbGluZ09kZHN9fSI+CiAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8L2Rpdj4KICAgIDxwYXBlci1pbnB1dCBhbHdheXMtZmxvYXQtbGFiZWwgbGFiZWw9IlBhdGggdG8gbGFiZWwgZGljdGlvbmFyeSAob3B0aW9uYWwpIiBwbGFjZWhvbGRlcj0iW1tsYWJlbFZvY2FiUGF0aF1dIiB2YWx1ZT0ie3tsYWJlbFZvY2FiUGF0aH19IiBkaXNhYmxlZD0iW1tzaG91bGREaXNhYmxlQ2xhc3NpZmljYXRpb25Db250cm9sc18obW9kZWxUeXBlKV1dIj4KICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8ZGl2IGNsYXNzPSJmbGV4LWhvbGRlciI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJoZWxwIiBjbGFzcz0iaGVscC1pY29uIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8ZGl2Pk1hcHMgcHJlZGljdGVkIGNsYXNzIGluZGljZXMgdG8gbGFiZWxzIGZyb20gdGV4dCBmaWxlPC9kaXY+CiAgICAgIDxwYXBlci10b29sdGlwIGNsYXNzPSJ0b29sdGlwIiBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJib3R0b20iIG9mZnNldD0iMCI+CiAgICAgICAgQW4gb3B0aW9uYWwgdGV4dCBmaWxlIGZvciB1c2Ugd2l0aCB0aGUgcmVzdWx0cyBvZiBhIGNsYXNzaWZpY2F0aW9uCiAgICAgICAgbW9kZWwuIENsYXNzaWZpY2F0aW9uIG1vZGVscyByZXR1cm4gcHJlZGljdGVkIGNsYXNzZXMgYXMgaW5kaWNlcy4gSWYgYQogICAgICAgIHZvY2FiIGZpbGUgaXMgcHJvdmlkZWQsIGVhY2ggcHJlZGljdGVkIGNsYXNzIGluZGV4IHdpbGwgYmUgbWFwcGVkIHRvIGEKICAgICAgICBsYWJlbCBmcm9tIHRoaXMgZmlsZSBmb3IgdXNlIGluIHRoZSBkaXNwbGF5LiBFYWNoIGxpbmUgaW4gdGhlIGZpbGUKICAgICAgICBjb3JyZXNwb25kcyB0byBhIGxhYmVsLCB3aXRoIHRoZSBmaXJzdCBsaW5lIGNvcnJlc3BvbmRpbmcgdG8gY2xhc3MgaW5kZXgKICAgICAgICAwLgogICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImZsZXgtaG9sZGVyIj4KICAgICAgPHBhcGVyLWlucHV0IGFsd2F5cy1mbG9hdC1sYWJlbCB0eXBlPSJudW1iZXIiIGxhYmVsPSJNYXggY2xhc3NlcyB0byBkaXNwbGF5IiBwbGFjZWhvbGRlcj0iW1ttYXhDbGFzc2VzVG9EaXNwbGF5XV0iIHZhbHVlPSJ7e21heENsYXNzZXNUb0Rpc3BsYXl9fSIgY2xhc3M9ImlucHV0LWluLXJvdyIgZGlzYWJsZWQ9Iltbc2hvdWxkRGlzYWJsZU11bHRpQ2xhc3NDb250cm9sc18obXVsdGlDbGFzcyldXSI+CiAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgIDxwYXBlci1jaGVja2JveCBkaXNhYmxlZD0iW1tzaG91bGREaXNhYmxlQ2xhc3NpZmljYXRpb25Db250cm9sc18obW9kZWxUeXBlKV1dIiBjaGVja2VkPSJ7e211bHRpQ2xhc3N9fSIgY2xhc3M9ImNoZWNrYm94Ij4KICAgICAgICBNdWx0aS1jbGFzcyBjbGFzc2lmaWNhdGlvbiBtb2RlbAogICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2ei1iYXItY2hhcnQiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9InRvb2x0aXAiPgogICAgICA8dGFibGU+CiAgICAgICAgPHRoZWFkPgogICAgICAgICAgPHRyIGlkPSJ0b29sdGlwLXRhYmxlLWhlYWRlci1yb3ciPjwvdHI+CiAgICAgICAgPC90aGVhZD4KICAgICAgICA8dGJvZHk+PC90Ym9keT4KICAgICAgPC90YWJsZT4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iY2hhcnRkaXYiPjwvZGl2PgogICAgPHN0eWxlIGluY2x1ZGU9InBsb3R0YWJsZS1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CiAgICAgIGRpdiB7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgfQogICAgICB0ZCB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiA1cHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogNXB4OwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CiAgICAgICN0b29sdGlwIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBib3gtc2hhZG93OiAwIDFweCA0cHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuOCk7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBsaW5lLWhlaWdodDogMS40ZW07CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIHotaW5kZXg6IDU7CiAgICAgICAgY3Vyc29yOiBub25lOwogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgIH0KICAgICAgLnN3YXRjaCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHdpZHRoOiAxNHB4OwogICAgICAgIGhlaWdodDogMTRweDsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDApOwogICAgICB9CiAgICAgIC5jbG9zZXN0IC5zd2F0Y2ggewogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHdoaXRlOwogICAgICB9CiAgICAgIHRoIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDVweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiA1cHg7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWNvbmZ1c2lvbi1tYXRyaXgiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgdGFibGUgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICB0ZCB7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KICAgICAgdGgsCiAgICAgIHRkIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgcGFkZGluZzogM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KICAgICAgLmZsZXggewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICB9CiAgICAgIC5wcmVkLWxhYmVsIHsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgfQogICAgICAudG90YWwtbGFiZWwgewogICAgICAgIGNvbG9yOiAjNWY2MzY4OwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CiAgICAgIC50b3RhbC1jZWxsIHsKICAgICAgICBjb2xvcjogIzVmNjM2ODsKICAgICAgfQogICAgICAuYWN0dWFsLWxhYmVsIHsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgIH0KICAgICAgLm4tbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOwogICAgICB9CiAgICAgIC52YWx1ZS1jZWxsIHsKICAgICAgICBjb2xvcjogIzIwMjEyNDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBsaWdodGdyZXk7CiAgICAgIH0KICAgICAgLnBhcmVudGhldGljYWwgewogICAgICAgIHBhZGRpbmctcmlnaHQ6IDVweDsKICAgICAgICB3aWR0aDogNTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgaWQ9ImhvbGRlciI+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaW5mZXJlbmNlLXZpZXdlciI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLnJ1bnMtaG9sZGVyIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogMjAwcHg7CiAgICAgIH0KICAgICAgLnJvdyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgIH0KICAgICAgLmhlYWRlciB7CiAgICAgICAgY29sb3I6ICM4MDg2OGI7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIHBhZGRpbmc6IDRweCAwOwogICAgICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDFweCAjZGFkY2UwOwogICAgICAgIGJvcmRlci10b3A6IHNvbGlkIDFweCAjZGFkY2UwOwogICAgICB9CiAgICAgIC5kYXJrLXJvdy1vbmUgewogICAgICAgIGJhY2tncm91bmQ6ICNjYmYwZjg7CiAgICAgIH0KICAgICAgLmRhcmstcm93LXR3byB7CiAgICAgICAgYmFja2dyb3VuZDogI2ZmZjNlMDsKICAgICAgfQogICAgICAud2hpdGUtcm93IHsKICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgICAgfQogICAgICAubWFya2VyIHsKICAgICAgICBmbGV4OiAwLjU7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICAgIH0KICAgICAgLm1hcmtlci5tYXJrLW9uZSB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwN2I4MzsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDFweDsKICAgICAgfQogICAgICAubWFya2VyLm1hcmstdHdvIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmY5ODAwOwogICAgICAgIHBhZGRpbmctbGVmdDogMXB4OwogICAgICB9CiAgICAgIC5ydW4gewogICAgICAgIGZsZXg6IDEwOwogICAgICB9CiAgICAgIC5tdWx0aS1tb2RlbCB7CiAgICAgICAgZmxleDogMTA7CiAgICAgIH0KICAgICAgLm9uZS1tb2RlbCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAuc2hvdy1sYWJlbCB7CiAgICAgICAgZmxleDogMjA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIC5uby1sYWJlbCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAuc2NvcmUgewogICAgICAgIGZsZXg6IDEwOwogICAgICB9CiAgICAgIC5hcnJvdyB7CiAgICAgICAgZmxleDogMjsKICAgICAgfQogICAgICAuZGVsdGEgewogICAgICAgIGZsZXg6IDEwOwogICAgICB9CiAgICAgIC50ZXh0IHsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgIH0KICAgICAgLmdyZWVuIHsKICAgICAgICBjb2xvcjogZ3JlZW47CiAgICAgIH0KICAgICAgLnJlZCB7CiAgICAgICAgY29sb3I6IHJlZDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9InJvdyBoZWFkZXIiPgogICAgICA8ZGl2IGNsYXNzPSJtYXJrZXIiPjwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJydW4iPlJ1bjwvZGl2PgogICAgICA8ZGl2IGNsYXNzJD0iW1tnZXRNb2RlbEhlYWRlckNsYXNzKGluZmVyZW5jZXMpXV0iPk1vZGVsPC9kaXY+CiAgICAgIDxkaXYgY2xhc3MkPSJbW2dldExhYmVsSGVhZGVyQ2xhc3MobW9kZWxUeXBlKV1dIj5MYWJlbDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzY29yZSI+W1tnZXRTY29yZUxhYmVsKG1vZGVsVHlwZSldXTwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJhcnJvdyI+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImRlbHRhIj5EZWx0YTwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJydW5zLWhvbGRlciI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbaW5mZXJlbmNlc11dIiBhcz0ibW9kZWxzSW5mZXJlbmNlIiBpbmRleC1hcz0icnVuaW5kZXgiPgogICAgICAgIDxkaXYgY2xhc3M9InJvd3MtZm9yLXJ1biI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW21vZGVsc0luZmVyZW5jZV1dIiBhcz0iaW5mZXJlbmNlIiBpbmRleC1hcz0ibW9kZWxpbmRleCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbZ2V0SW5mZXJlbmNlTGlzdChpbmZlcmVuY2UsIG1heEVudHJpZXNQZXJSdW4pXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3MkPSJbW2dldFJvd0NsYXNzKHJ1bmluZGV4LCBpbmZlcmVuY2VzLCBtb2RlbGluZGV4KV1dIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3MkPSJbW2dldE1hcmtlckNsYXNzKHJ1bmluZGV4LCBpbmZlcmVuY2VzLCBtb2RlbGluZGV4KV1dIj48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJ1biB0ZXh0Ij5bW2dldFJ1bk51bWJlcihydW5pbmRleCldXTwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcyQ9IltbZ2V0TW9kZWxDbGFzcyhpbmZlcmVuY2VzKV1dIj4KICAgICAgICAgICAgICAgICAgPGRpdj5bW2dldE1vZGVsTmFtZShtb2RlbE5hbWVzLCBtb2RlbGluZGV4KV1dPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3MkPSJbW2dldExhYmVsQ2xhc3MobW9kZWxUeXBlKV1dIj4KICAgICAgICAgICAgICAgICAgPGRpdj5bW2dldExhYmVsKGl0ZW0pXV08L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2NvcmUgdGV4dCI+W1tnZXRQcmludGFibGVTY29yZShpdGVtLnNjb3JlKV1dPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhcnJvdyI+CiAgICAgICAgICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iW1tnZXRJY29uKHJ1bmluZGV4LCBpbmRleCwgbW9kZWxpbmRleCldXSIgY2xhc3MkPSJbW2dldEljb25DbGFzcyhydW5pbmRleCwgaW5kZXgsIG1vZGVsaW5kZXgpXV0iPgogICAgICAgICAgICAgICAgICA8L2lyb24taWNvbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVsdGEgdGV4dCI+CiAgICAgICAgICAgICAgICAgIFtbZ2V0UHJpbnRhYmxlRGVsdGEocnVuaW5kZXgsIGluZGV4LCBtb2RlbGluZGV4KV1dCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9ImZhY2V0cy1kaXZlLXZpcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLmxhYmVscyB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWhlYWRsaW5lOwogICAgICB9CiAgICAgIC5yb3RhdGUgewogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDEuNSwgMC41OwogICAgICAgIGFuaW1hdGlvbjogcm90YXRlIDFzIGxpbmVhciBpbmZpbml0ZTsKICAgICAgfQogICAgICBAa2V5ZnJhbWVzIHJvdGF0ZSB7CiAgICAgICAgZnJvbSB7CiAgICAgICAgICBzdHJva2UtZGFzaG9mZnNldDogMDsKICAgICAgICB9CiAgICAgICAgdG8gewogICAgICAgICAgc3Ryb2tlLWRhc2hvZmZzZXQ6IDI7CiAgICAgICAgfQogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBpZD0iaG9sZGVyIj4KICAgICAgCiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0iZmFjZXRzLWRpdmUtY29udHJvbHMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgLm1haW4tY29udHJvbHMgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDYwcHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgIH0KCiAgICAgIC5vdmVyZmxvdy1ob2xkZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgICB9CgogICAgICAjb3ZlcmZsb3dtZW51IHsKICAgICAgICBtYXJnaW46IDAgNDBweDsKICAgICAgfQoKICAgICAgLm92ZXJmbG93LWRpdiB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICAub3ZlcmZsb3ctY2hlY2tib3ggewogICAgICAgIG1hcmdpbjogOHB4IDA7CiAgICAgICAgcGFkZGluZwogICAgICB9CgogICAgICAuZHJvcGRvd24taG9sZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIHdpZHRoOiAxNTBweDsKICAgICAgICBtYXJnaW46IDAgMTBweDsKICAgICAgfQoKICAgICAgLmRyb3Bkb3duLXRyaWdnZXIgewogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5leHBhbmQtYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzliOWI5YjsKICAgICAgICAtLXBhcGVyLWljb24tYnV0dG9uLWluay1jb2xvcjogIzliOWI5YjsKICAgICAgfQogICAgICBwYXBlci1tZW51IHBhcGVyLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIGZvbnQtc2l6ZTogMTIuNXB4OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgcGFwZXItaXRlbSB7CiAgICAgICAgcGFkZGluZzogMCAxNHB4OwogICAgICAgIC0tcGFwZXItaXRlbS1taW4taGVpZ2h0OiAzNnB4OwogICAgICB9CiAgICAgIHBhcGVyLWRyb3Bkb3duLW1lbnUgcGFwZXItaXRlbSB7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNjY2M7CiAgICAgIH0KCiAgICAgICN2ZXJ0aWNhbEZhY2V0IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgY29sb3I6IHZhcigtLWdyaWQtZmFjZXRpbmctdmVydGljYWwtbGFiZWwtY29sb3IpOwogICAgICAgIH07CiAgICAgIH0KICAgICAgI2hvcml6b250YWxGYWNldCB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGNvbG9yOiB2YXIoLS1ncmlkLWZhY2V0aW5nLWhvcml6b250YWwtbGFiZWwtY29sb3IpOwogICAgICAgIH07CiAgICAgIH0KICAgICAgI3ZlcnRpY2FsUG9zaXRpb24gewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBjb2xvcjogdmFyKC0taXRlbS1wb3NpdGlvbmluZy12ZXJ0aWNhbC1sYWJlbC1jb2xvcik7CiAgICAgICAgfTsKICAgICAgfQogICAgICAjaG9yaXpvbnRhbFBvc2l0aW9uIHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgY29sb3I6IHZhcigtLWl0ZW0tcG9zaXRpb25pbmctaG9yaXpvbnRhbC1sYWJlbC1jb2xvcik7CiAgICAgICAgfTsKICAgICAgfQogICAgICAudmVydGljYWwtZmFjZXQgewogICAgICAgIGNvbG9yOiB2YXIoLS1ncmlkLWZhY2V0aW5nLXZlcnRpY2FsLWxhYmVsLWNvbG9yKTsKICAgICAgfQogICAgICAuaG9yaXpvbnRhbC1mYWNldCB7CiAgICAgICAgY29sb3I6IHZhcigtLWdyaWQtZmFjZXRpbmctaG9yaXpvbnRhbC1sYWJlbC1jb2xvcik7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLXBvc2l0aW9uIHsKICAgICAgICBjb2xvcjogdmFyKC0taXRlbS1wb3NpdGlvbmluZy12ZXJ0aWNhbC1sYWJlbC1jb2xvcik7CiAgICAgIH0KICAgICAgLmhvcml6b250YWwtcG9zaXRpb24gewogICAgICAgIGNvbG9yOiB2YXIoLS1pdGVtLXBvc2l0aW9uaW5nLWhvcml6b250YWwtbGFiZWwtY29sb3IpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9Im1haW4tY29udHJvbHMiPgogICAgICAgIDxkaXYgY2xhc3M9ImRyb3Bkb3duLWhvbGRlciBob3Jpem9udGFsLWZhY2V0Ij4KICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgaWQ9Imhvcml6b250YWxGYWNldCIgbGFiZWw9IkJpbm5pbmcgfCBYLUF4aXMiIGNsYXNzPSJmYWNldC1zZWxlY3RvciI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e2hvcml6b250YWxGYWNldH19IiBhdHRyLWZvci1zZWxlY3RlZD0idmFsdWUiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IiI+KG5vbmUpPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1trZXlzXV0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSB2YWx1ZT0iW1tpdGVtXV0iPltbX2JyZWFrVXBBbmRUcnVuY2F0ZShpdGVtKV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tob3Jpem9udGFsRmFjZXRdXSI+CiAgICAgICAgICA8cGFwZXItaW5wdXQgdHlwZT0ibnVtYmVyIiBtaW49IjEiIG1heD0iW1tfbWF4QnVja2V0cyhob3Jpem9udGFsRmFjZXQsIGhvcml6b250YWxCYWdPZldvcmRzKV1dIiB2YWx1ZT0ie3tob3Jpem9udGFsQnVja2V0c319IiBsYWJlbD0iQ291bnQiPgogICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgIDxkaXYgY2xhc3M9ImRyb3Bkb3duLWhvbGRlciB2ZXJ0aWNhbC1mYWNldCI+CiAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgaWQ9InZlcnRpY2FsRmFjZXQiIGxhYmVsPSJCaW5uaW5nIHwgWS1BeGlzIiBjbGFzcz0iZmFjZXQtc2VsZWN0b3IiPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e3ZlcnRpY2FsRmFjZXR9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9InZhbHVlIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IiI+KG5vbmUpPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2tleXNdXSI+CiAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IltbaXRlbV1dIj5bW19icmVha1VwQW5kVHJ1bmNhdGUoaXRlbSldXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgIDwvZGl2PgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3ZlcnRpY2FsRmFjZXRdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0IHR5cGU9Im51bWJlciIgbWluPSIxIiBtYXg9IltbX21heEJ1Y2tldHModmVydGljYWxGYWNldCx2ZXJ0aWNhbEJhZ09mV29yZHMpXV0iIHZhbHVlPSJ7e3ZlcnRpY2FsQnVja2V0c319IiBsYWJlbD0iQ291bnQiPgogICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgIDwvdGVtcGxhdGU+CgogICAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi1ob2xkZXIiPgogICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGlkPSJjb2xvckJ5IiBsYWJlbD0iQ29sb3IgQnkiPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e2NvbG9yQnl9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9InZhbHVlIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IiI+KG5vbmUpPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2tleXNdXSI+CiAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IltbaXRlbV1dIj5bW2l0ZW1dXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZHJvcGRvd24taG9sZGVyIj4KICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBpZD0iaW1hZ2VGaWVsZE5hbWUiIGxhYmVsPSJMYWJlbCBCeSI+CiAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7aW1hZ2VGaWVsZE5hbWV9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9InZhbHVlIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IiI+CiAgICAgICAgICAgICAgW1tfZ2V0SW1hZ2VGaWVsZE5hbWVEZWZhdWx0TGFiZWwoYXRsYXNVcmwpXV0KICAgICAgICAgICAgPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2tleXNdXSI+CiAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IltbaXRlbV1dIj5bW2l0ZW1dXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iZHJvcGRvd24taG9sZGVyIGhvcml6b250YWwtcG9zaXRpb24iPgogICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGlkPSJob3Jpem9udGFsUG9zaXRpb24iIGxhYmVsPSJTY2F0dGVyIHwgWC1BeGlzIiBjbGFzcz0icG9zaXRpb24tc2VsZWN0b3IiPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e2hvcml6b250YWxQb3NpdGlvbn19IiBhdHRyLWZvci1zZWxlY3RlZD0idmFsdWUiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICA8cGFwZXItaXRlbSB2YWx1ZT0iIj4oZGVmYXVsdCk8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Iltba2V5c11dIiBmaWx0ZXI9Il9pc0tleU51bWVyaWMiPgogICAgICAgICAgICAgIDxwYXBlci1pdGVtIHZhbHVlPSJbW2l0ZW1dXSI+W1tpdGVtXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICA8L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9ImRyb3Bkb3duLWhvbGRlciB2ZXJ0aWNhbC1wb3NpdGlvbiI+CiAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgaWQ9InZlcnRpY2FsUG9zaXRpb24iIGxhYmVsPSJTY2F0dGVyIHwgWS1BeGlzIiBjbGFzcz0icG9zaXRpb24tc2VsZWN0b3IiPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e3ZlcnRpY2FsUG9zaXRpb259fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9InZhbHVlIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9IiI+KGRlZmF1bHQpPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2tleXNdXSIgZmlsdGVyPSJfaXNLZXlOdW1lcmljIj4KICAgICAgICAgICAgICA8cGFwZXItaXRlbSB2YWx1ZT0iW1tpdGVtXV0iPltbaXRlbV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9Im92ZXJmbG93LWhvbGRlciI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2hvdWxkU2hvd092ZXJmbG93TWVudShjb2xvckJ5LCB2ZXJ0aWNhbEZhY2V0LCBob3Jpem9udGFsRmFjZXQpXV0iPgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0iZHJvcGRvd24tdHJpZ2dlciIgaWNvbj0ibW9yZS12ZXJ0IiBhbHQ9Im1vcmUtdmVydCIgaWQ9Im92ZXJmbG93YnRuIiBvbi1jbGljaz0iX29wZW5PdmVyZmxvdyI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHBhcGVyLWRpYWxvZyBpZD0ib3ZlcmZsb3dtZW51IiBuby1vdmVybGFwIGhvcml6b250YWwtYWxpZ249InJpZ2h0IiB2ZXJ0aWNhbC1hbGlnbj0idG9wIj4KICAgICAgICA8ZGl2IGNsYXNzPSJvdmVyZmxvdy1kaXYiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19pc0tleUNhdGVnb3JpY2FsKGNvbG9yQnkpfX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi1ob2xkZXIiPgogICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGlkPSJwYWxldHRlQ2hvaWNlIiBsYWJlbD0iRGlzcGxheSB8IENvbG9yIFBhbGV0dGUiPgogICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e3BhbGV0dGVDaG9pY2V9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9InZhbHVlIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9InN0YW5kYXJkIj5zdGFuZGFyZDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gdmFsdWU9Indhcm0iPndhcm08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIHZhbHVlPSJjb29sIj5jb29sPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSB2YWx1ZT0iYXNzaXN0Ij5hc3Npc3Q8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc1dvcmRUcmVlKHZlcnRpY2FsRmFjZXQpXV0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2xhc3M9Im92ZXJmbG93LWNoZWNrYm94IiBjaGVja2VkPSJ7e3ZlcnRpY2FsQmFnT2ZXb3Jkc319Ij4KICAgICAgICAgICAgICBYLUF4aXMgQmFnIG9mIHdvcmRzCiAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzV29yZFRyZWUoaG9yaXpvbnRhbEZhY2V0KV1dIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNsYXNzPSJvdmVyZmxvdy1jaGVja2JveCIgY2hlY2tlZD0ie3tob3Jpem9udGFsQmFnT2ZXb3Jkc319Ij4KICAgICAgICAgICAgICBZLUF4aXMgQmFnIG9mIHdvcmRzCiAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9ImZhY2V0cy1kaXZlLWluZm8tY2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgfQogICAgICBkdCB7CiAgICAgICAgY29sb3I6ICM5ZTdjNjU7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CiAgICAgIGRkIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1jb2RlOwogICAgICAgIGNvbG9yOiAjNTEzNzI2OwogICAgICAgIG1hcmdpbjogMCAwIDE2cHggMDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgaWQ9ImhvbGRlciI+PC9kaXY+CiAgICAKICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJmYWNldHMtZGl2ZS1sZWdlbmQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgIH0KCiAgICAgIC5sZWdlbmQgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNhOWE5YTk7CiAgICAgICAgbWluLXdpZHRoOiAyMDBweDsKICAgICAgfQoKICAgICAgLnRvcGJhciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIGJhY2tncm91bmQ6ICNFNkU2RkE7CiAgICAgIH0KCiAgICAgIC5leHBhbmQtYnV0dG9uIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgfQoKICAgICAgLmxlZ2VuZC1ib2R5IHsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2E5YTlhOTsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgIH0KCiAgICAgIC5sZWdlbmQgLmxheW91dC1yb3cgewogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQogICAgICAubGVnZW5kIC5sYXlvdXQtcm93IHNwYW4gewogICAgICAgIG1hcmdpbjogMnB4IDAgMCA4cHg7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBMZWdlbmQgdGFibGUgc2hpbS4gUG9seW1lcidzIGRvbS1yZXBlYXQgZmVhdHVyZSBoYXMgYSBrbm93biBpc3N1ZSBpbgogICAgICAgKiB3aGljaCBpdCBkb2Vzbid0IHdvcmsgd2l0aCA8dHI+IGVsZW1lbnRzIGluc2lkZSBvZiBhIDx0YWJsZT4uIFNvCiAgICAgICAqIGluc3RlYWQsIHdlIHVzZSBDU1Mgd2l0aCBjbGFzc2VkIGRpdnMgdG8gYWNoaWV2ZSB0YWJsZSBiZWhhdmlvci4KICAgICAgICovCiAgICAgIC5sZWdlbmQtdGFibGUgewogICAgICAgIGRpc3BsYXk6IHRhYmxlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAycHg7CiAgICAgIH0KICAgICAgLmxlZ2VuZC1yb3cgewogICAgICAgIGRpc3BsYXk6IHRhYmxlLXJvdzsKICAgICAgfQogICAgICAubGVnZW5kLWNlbGwgewogICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb2xvciBsZWdlbmQuCiAgICAgICAqLwogICAgICAubGVnZW5kIC5jb2xvciB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CiAgICAgIC5sZWdlbmQgLmNvbG9yIGlyb24taWNvbiB7CiAgICAgICAgLS1pcm9uLWljb24td2lkdGg6IDE2cHg7CiAgICAgICAgLS1pcm9uLWljb24taGVpZ2h0OiAxNnB4OwogICAgICAgIG1hcmdpbjogMCAycHg7CiAgICAgIH0KICAgICAgLmxlZ2VuZCAuY29sb3IgaXJvbi1pY29uW2ZpbGw9IiNmZmZmZmYiXSB7CiAgICAgICAgYmFja2dyb3VuZDogI2RkZGRkZDsKICAgICAgfQogICAgICAubGVnZW5kIC5jb2xvciBzcGFuIHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KICAgICAgLmxlZ2VuZCAuc3BlY2lhbCB7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICB9CgogICAgICAubGVnZW5kIGgyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgY29sb3I6ICM0ZjQyM2U7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CiAgICAgIC5sZWdlbmQgLmNvbG9yLWJ5LWZpZWxkIHsKICAgICAgICBjb2xvcjogIzk2OGU4YzsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXNpemU6IDEyLjVweDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIG1hcmdpbjogMnB4IDAgNHB4IDIwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2FueUNvbG9yKGNvbG9yQnksIHBhbGV0dGUpXV0iPgogICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQiPgogICAgICAgIDxkaXYgY2xhc3M9InRvcGJhciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+TGVnZW5kPC9kaXY+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gY2xhc3M9ImV4cGFuZC1idXR0b24iIG9uLWNsaWNrPSJfdG9nZ2xlT3BlbmVkIiBpY29uPSJbW19nZXRJY29uKF9vcGVuZWQpXV0iPgogICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8aXJvbi1jb2xsYXBzZSBpZD0iY29sbGFwc2UiIG9wZW5lZD0ie3tfb3BlbmVkfX0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWJvZHkiPgogICAgICAgICAgICA8aDI+Q29sb3JzPC9oMj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWJ5LWZpZWxkIj4KICAgICAgICAgICAgICBieSBbW19icmVha1VwQW5kVHJ1bmNhdGUoY29sb3JCeSldXQogICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIHBvc2l0aW9uPSJ0b3AiPltbY29sb3JCeV1dPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICA8L3NwYW4+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtdGFibGUiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbcGFsZXR0ZV1dIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1yb3cgY29sb3IiPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2VsbCI+CiAgICAgICAgICAgICAgICAgICAgPGlyb24taWNvbiBpY29uPSJhdjpmaWJlci1tYW51YWwtcmVjb3JkIiBmaWxsJD0iW1tpdGVtLmNvbG9yXV0iIHN0eWxlJD0iZmlsbDpbW2l0ZW0uY29sb3JdXSI+PC9pcm9uLWljb24+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2VsbCI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3MkPSJbW19zcGVjaWFsQ2xhc3MoaXRlbS5jb250ZW50LnNwZWNpYWwpXV0iPgogICAgICAgICAgICAgICAgICAgICAgW1tfYnJlYWtVcEFuZFRydW5jYXRlKGl0ZW0uY29udGVudC5sYWJlbCldXQogICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBwb3NpdGlvbj0idG9wIj5bW2l0ZW0uY29udGVudC5sYWJlbF1dPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9ImZhY2V0cy1kaXZlIj4KICA8dGVtcGxhdGU+CgogICAgPHN0eWxlPgogICAgICAvKioKICAgICAgICogcGFwZXItaW5wdXQtY29udGFpbmVyIHVzZXMgYW4gZWxlbWVudCBjb250YWluaW5nIG9ubHkgJm5ic3A7IGZvcgogICAgICAgKiBzcGFjaW5nIHB1cnBvc2VzLiBBZ2dyZXNzaXZlIHZ1bGNhbml6ZXJzIHNvbWV0aW1lcyByZW1vdmUgdGhpcyBjb250ZW50LgogICAgICAgKiBUaGlzIENTUyBydWxlIGZvcmNlcyB0aGUgY29udGFpbmluZyBlbGVtZW50IHRvIGhhdmUgdGhlIGNvcnJlY3QgaGVpZ2h0CiAgICAgICAqIGluIGVpdGhlciBjYXNlLgogICAgICAgKi8KICAgICAgOmhvc3QgcGFwZXItaW5wdXQtY29udGFpbmVyID4gLmZsb2F0ZWQtbGFiZWwtcGxhY2Vob2xkZXIgewogICAgICAgIG1pbi1oZWlnaHQ6IDIwcHg7CiAgICAgIH0KCiAgICAgIDpob3N0IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmZmZmOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICAgIC5maWxsIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgLm1haW4gewogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIH0KICAgICAgZmFjZXRzLWRpdmUtY29udHJvbHMgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZDNkM2QzOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBoZWlnaHQ6IDYwcHg7CiAgICAgIH0KICAgICAgLnJvdyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CiAgICAgIGZhY2V0cy1kaXZlLWxlZ2VuZCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMTRweDsKICAgICAgICByaWdodDogMjRweDsKICAgICAgfQogICAgICAuem9vbS1jb250cm9scyB7CiAgICAgICAgYm90dG9tOiAxNHB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KICAgICAgLnpvb20tY29udHJvbHMgcGFwZXItYnV0dG9uIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTdlN2U3OwogICAgICAgIGNsZWFyOiBsZWZ0OwogICAgICAgIGNvbG9yOiAjMmIyYjJiOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIG1hcmdpbjogNHB4IDhweDsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICB9CiAgICAgIGZhY2V0cy1kaXZlLWluZm8tY2FyZCB7CiAgICAgICAgYmFja2dyb3VuZDogI2ZmZjhmNDsKICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNjNmM2YzY7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgd2lkdGg6IDI0MHB4OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9ImZpbGwgbWFpbiI+CiAgICAgIDxmYWNldHMtZGl2ZS1jb250cm9scyBpZD0iY29udHJvbHMiIGF0bGFzLXVybD0iW1thdGxhc1VybF1dIiBrZXlzPSJbW19rZXlzXV0iIHN0YXRzPSJbW3N0YXRzXV0iIHZlcnRpY2FsLWZhY2V0PSJ7e3ZlcnRpY2FsRmFjZXR9fSIgdmVydGljYWwtYnVja2V0cz0ie3t2ZXJ0aWNhbEJ1Y2tldHN9fSIgdmVydGljYWwtYmFnLW9mLXdvcmRzPSJ7e3ZlcnRpY2FsQmFnT2ZXb3Jkc319IiBob3Jpem9udGFsLWZhY2V0PSJ7e2hvcml6b250YWxGYWNldH19IiBob3Jpem9udGFsLWJ1Y2tldHM9Int7aG9yaXpvbnRhbEJ1Y2tldHN9fSIgaG9yaXpvbnRhbC1iYWctb2Ytd29yZHM9Int7aG9yaXpvbnRhbEJhZ09mV29yZHN9fSIgcG9zaXRpb24tbW9kZT0ie3twb3NpdGlvbk1vZGV9fSIgdmVydGljYWwtcG9zaXRpb249Int7dmVydGljYWxQb3NpdGlvbn19IiBob3Jpem9udGFsLXBvc2l0aW9uPSJ7e2hvcml6b250YWxQb3NpdGlvbn19IiBjb2xvci1ieT0ie3tjb2xvckJ5fX0iIGltYWdlLWZpZWxkLW5hbWU9Int7aW1hZ2VGaWVsZE5hbWV9fSIgcGFsZXR0ZT0iW1tfcGFsZXR0ZV1dIiBwYWxldHRlLWNob2ljZT0ie3twYWxldHRlQ2hvaWNlfX0iIGdyaWQtZmFjZXRpbmctdmVydGljYWwtbGFiZWwtY29sb3I9IltbZ3JpZEZhY2V0aW5nVmVydGljYWxMYWJlbENvbG9yXV0iIGdyaWQtZmFjZXRpbmctaG9yaXpvbnRhbC1sYWJlbC1jb2xvcj0iW1tncmlkRmFjZXRpbmdIb3Jpem9udGFsTGFiZWxDb2xvcl1dIiBpdGVtLXBvc2l0aW9uaW5nLXZlcnRpY2FsLWxhYmVsLWNvbG9yPSJbW2l0ZW1Qb3NpdGlvbmluZ1ZlcnRpY2FsTGFiZWxDb2xvcl1dIiBpdGVtLXBvc2l0aW9uaW5nLWhvcml6b250YWwtbGFiZWwtY29sb3I9IltbaXRlbVBvc2l0aW9uaW5nSG9yaXpvbnRhbExhYmVsQ29sb3JdXSI+PC9mYWNldHMtZGl2ZS1jb250cm9scz4KCiAgICAgIDxkaXYgY2xhc3M9ImZpbGwgcm93Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJmaWxsIj4KICAgICAgICAgIDxmYWNldHMtZGl2ZS12aXMgaWQ9InZpcyIgY2xhc3M9ImZpbGwiIGRhdGE9IltbZGF0YV1dIiBmaWx0ZXJlZC1kYXRhLWluZGljZXM9IltbZmlsdGVyZWREYXRhSW5kaWNlc11dIiBhdGxhcy11cmw9IltbYXRsYXNVcmxdXSIgc3ByaXRlLXVybD0iW1tzcHJpdGVVcmxdXSIgY3Jvc3Mtb3JpZ2luPSJbW2Nyb3NzT3JpZ2luXV0iIGtleXM9Int7X2tleXN9fSIgc3RhdHM9Int7c3RhdHN9fSIgc3ByaXRlLWltYWdlLXdpZHRoPSJbW3Nwcml0ZUltYWdlV2lkdGhdXSIgc3ByaXRlLWltYWdlLWhlaWdodD0iW1tzcHJpdGVJbWFnZUhlaWdodF1dIiB2ZXJ0aWNhbC1mYWNldD0iW1t2ZXJ0aWNhbEZhY2V0XV0iIHZlcnRpY2FsLWJ1Y2tldHM9IltbdmVydGljYWxCdWNrZXRzXV0iIHZlcnRpY2FsLWJhZy1vZi13b3Jkcz0iW1t2ZXJ0aWNhbEJhZ09mV29yZHNdXSIgaG9yaXpvbnRhbC1mYWNldD0iW1tob3Jpem9udGFsRmFjZXRdXSIgaG9yaXpvbnRhbC1idWNrZXRzPSJbW2hvcml6b250YWxCdWNrZXRzXV0iIGhvcml6b250YWwtYmFnLW9mLXdvcmRzPSJbW2hvcml6b250YWxCYWdPZldvcmRzXV0iIHBvc2l0aW9uLW1vZGU9IltbcG9zaXRpb25Nb2RlXV0iIHZlcnRpY2FsLXBvc2l0aW9uPSJbW3ZlcnRpY2FsUG9zaXRpb25dXSIgaG9yaXpvbnRhbC1wb3NpdGlvbj0iW1tob3Jpem9udGFsUG9zaXRpb25dXSIgY29sb3ItYnk9Int7Y29sb3JCeX19IiBpbWFnZS1maWVsZC1uYW1lPSJ7e2ltYWdlRmllbGROYW1lfX0iIHBhbGV0dGU9Int7X3BhbGV0dGV9fSIgcGFsZXR0ZS1jaG9pY2U9IltbcGFsZXR0ZUNob2ljZV1dIiBncmlkLWZhY2V0aW5nLXZlcnRpY2FsLWxhYmVsLWNvbG9yPSJ7e2dyaWRGYWNldGluZ1ZlcnRpY2FsTGFiZWxDb2xvcn19IiBncmlkLWZhY2V0aW5nLWhvcml6b250YWwtbGFiZWwtY29sb3I9Int7Z3JpZEZhY2V0aW5nSG9yaXpvbnRhbExhYmVsQ29sb3J9fSIgaXRlbS1wb3NpdGlvbmluZy12ZXJ0aWNhbC1sYWJlbC1jb2xvcj0ie3tpdGVtUG9zaXRpb25pbmdWZXJ0aWNhbExhYmVsQ29sb3J9fSIgaXRlbS1wb3NpdGlvbmluZy1ob3Jpem9udGFsLWxhYmVsLWNvbG9yPSJ7e2l0ZW1Qb3NpdGlvbmluZ0hvcml6b250YWxMYWJlbENvbG9yfX0iIGZpdC1ncmlkLWFzcGVjdC1yYXRpby10by12aWV3cG9ydD0iW1tmaXRHcmlkQXNwZWN0UmF0aW9Ub1ZpZXdwb3J0XV0iIHNlbGVjdGVkLWRhdGE9Int7c2VsZWN0ZWREYXRhfX0iIHNlbGVjdGVkLWluZGljZXM9Int7c2VsZWN0ZWRJbmRpY2VzfX0iIGNvbXBhcmVkLWRhdGE9Int7Y29tcGFyZWREYXRhfX0iIGNvbXBhcmVkLWluZGljZXM9Int7Y29tcGFyZWRJbmRpY2VzfX0iIHN0YWJsZS1jb2xvcnM9Iltbc3RhYmxlQ29sb3JzXV0iPjwvZmFjZXRzLWRpdmUtdmlzPgoKICAgICAgICAgIDxkaXYgY2xhc3M9Inpvb20tY29udHJvbHMiPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBpZD0iem9vbUluQnV0dG9uIj4KICAgICAgICAgICAgICA8aXJvbi1pY29uIGljb249Imljb25zOmFkZCI+PC9pcm9uLWljb24+CiAgICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBpZD0iem9vbU91dEJ1dHRvbiI+CiAgICAgICAgICAgICAgPGlyb24taWNvbiBpY29uPSJpY29uczpyZW1vdmUiPjwvaXJvbi1pY29uPgogICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgaWQ9ImZpdEJ1dHRvbiI+CiAgICAgICAgICAgICAgPGlyb24taWNvbiBpY29uPSJpY29uczphc3BlY3QtcmF0aW8iPjwvaXJvbi1pY29uPgogICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxmYWNldHMtZGl2ZS1sZWdlbmQgaWQ9ImxlZ2VuZCIgY29sb3ItYnk9IltbY29sb3JCeV1dIiBwYWxldHRlPSJbW19wYWxldHRlXV0iPgogICAgICAgICAgPC9mYWNldHMtZGl2ZS1sZWdlbmQ+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shaGlkZUluZm9DYXJkXV0iPgogICAgICAgICAgPGZhY2V0cy1kaXZlLWluZm8tY2FyZCBpZD0iaW5mb0NhcmQiIHNlbGVjdGVkLWRhdGE9Iltbc2VsZWN0ZWREYXRhXV0iIGluZm8tcmVuZGVyZXI9IltbaW5mb1JlbmRlcmVyXV0iPgogICAgICAgICAgPC9mYWNldHMtZGl2ZS1pbmZvLWNhcmQ+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9ImZhY2V0cy1vdmVydmlldy1yb3ctc3RhdHMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KICAgICAgLmRhdGEtZXJyb3IgewogICAgICAgIGNvbG9yOiByZWQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLmRhdGEtd2VpZ2h0ZWQgewogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQogICAgICAudGFibGUtcm93IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDRweDsKICAgICAgfQogICAgICAudGFibGUtY2VsbCB7CiAgICAgICAgbWluLXdpZHRoOiA3MHB4OwogICAgICAgIG1heC13aWR0aDogNzBweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiA0cHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAuZGF0YS1jdXN0b20gewogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAxNTBweDsKICAgICAgICB3aGl0ZS1zcGFjZTogcHJlOzsKICAgICAgfQogICAgICAjbGVnZW5kLWJveCB7CiAgICAgICAgd2lkdGg6IDZweDsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDRweDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9InRhYmxlLXJvdyI+CiAgICAgIDxkaXYgaWQ9ImxlZ2VuZC1ib3giPjwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19lbnRyaWVzXV0iPgogICAgICAgIDxkaXYgY2xhc3MkPSJbW2l0ZW0uY3NzQ2xhc3NdXSB0YWJsZS1jZWxsIiB0aXRsZT0iW1tpdGVtLmZ1bGxTdHJdXSI+W1tpdGVtLnN0cl1dPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9ImZhY2V0cy1vdmVydmlldy1yb3ctbGVnZW5kIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC50YWJsZS1yb3cgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSg2MSwxNDAsMjA3LDAuMSk7CiAgICAgICAgYm9yZGVyLWxlZnQ6IHNvbGlkIDAuNXB4IHJnYmEoMCwwLDAsMC4xKTsKICAgICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAwLjVweCByZ2JhKDAsMCwwLDAuMSk7CiAgICAgIH0KICAgICAgLnRhYmxlLWNlbGwgewogICAgICAgIHBhZGRpbmc6IDIwcHggNHB4IDhweCAwOwogICAgICAgIG1pbi13aWR0aDogNjlweDsKICAgICAgICBtYXgtd2lkdGg6IDY5cHg7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiAzMDA7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAwLjVweCByZ2JhKDAsMCwwLDAuMSk7CiAgICAgIH0KICAgICAgLmRhdGEtd2VpZ2h0ZWQgewogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQogICAgICAuZGF0YS1jdXN0b20gewogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAxNTBweDsKICAgICAgfQogICAgICAubGVnZW5kLXNwYWNlIHsKICAgICAgICB3aWR0aDogNnB4OwogICAgICAgIGhlaWdodDogOHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiA0cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1yb3ciPgogICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtc3BhY2UiPjwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19lbnRyaWVzXV0iPgogICAgICAgIDxkaXYgY2xhc3MkPSJbW2l0ZW0uY3NzQ2xhc3NdXSB0YWJsZS1jZWxsIj5bW2l0ZW0uc3RyXV08L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9ImZhY2V0cy1vdmVydmlldy1jaGFydCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBsb3R0YWJsZS1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLnBsb3R0YWJsZS5jaGFydC1zbWFsbCB7CiAgICAgICAgaGVpZ2h0OiA0NnB4OwogICAgICAgIHdpZHRoOiAyNTBweDsKICAgICAgfQogICAgICAucGxvdHRhYmxlLnhheGlzLXNtYWxsewogICAgICAgIGhlaWdodDogMzBweDsKICAgICAgICB3aWR0aDogMjUwcHg7CiAgICAgIH0KICAgICAgLnBsb3R0YWJsZS5jaGFydC1iaWcgewogICAgICAgIGhlaWdodDogMjAwcHg7CiAgICAgICAgd2lkdGg6IDU1MHB4OwogICAgICB9CiAgICAgIC5wbG90dGFibGUueGF4aXMtYmlnIHsKICAgICAgICBoZWlnaHQ6IDUwcHg7CiAgICAgICAgd2lkdGg6IDU1MHB4OwogICAgICB9CiAgICAgICNzaG93X3RhYmxlX2J1dHRvbiB7CiAgICAgICAgbWFyZ2luOiAwIDAgMCA1cHg7CiAgICAgICAgcGFkZGluZzogMCAzcHg7CiAgICAgICAgZm9udC1zaXplOiA3cHQ7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2QzZDNkMzsKICAgICAgfQogICAgICAuZGlhbG9nLXJvdy1lbnRyeSB7CiAgICAgICAgcGFkZGluZzogMCAxMHB4IDAgMDsKICAgICAgfQogICAgICAudGFibGUtaGVhZGVyIHsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7CiAgICAgIH0KICAgICAgLmRpYWxvZy1yb3csIC5kaWFsb2ctaGVhZGVyLXJvdyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAuZGlhbG9nLXJvdy5zZWxlY3RlZCB7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2sKICAgICAgfQogICAgICAuZGlhbG9nLXJvdzpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0QwRDBEMDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgICAgLmRpYWxvZy10YWJsZSB7CiAgICAgICAgY2xlYXI6IGxlZnQ7CiAgICAgIH0KICAgICAgLmxhYmVsLWNlbGwgewogICAgICAgIHdpZHRoOiA5MHB4OwogICAgICAgIG1heC13aWR0aDogOTBweDsKICAgICAgICBtaW4td2lkdGg6IDkwcHg7CiAgICAgICAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKICAgICAgfQogICAgICAubm9uLW92ZXJmbG93LWxhYmVsLWNlbGwgewogICAgICAgIHdpZHRoOiA5MHB4OwogICAgICAgIG1heC13aWR0aDogOTBweDsKICAgICAgICBtaW4td2lkdGg6IDkwcHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CiAgICAgIC5jb3VudC1jZWxsIHsKICAgICAgICB3aWR0aDogMTAwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAxMDBweDsKICAgICAgICBtaW4td2lkdGg6IDEwMHB4OwogICAgICAgIG92ZXJmbG93LXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgICAgLndlaWdodGVkLWNlbGwgewogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQogICAgICAuZGF0YS1saXN0LXNtYWxsIHsKICAgICAgICBoZWlnaHQ6IDYwcHg7CiAgICAgIH0KICAgICAgLmRhdGEtbGlzdC1iaWcgewogICAgICAgIGhlaWdodDogMTgwcHg7CiAgICAgICAgd2lkdGg6IDU1MHB4OwogICAgICB9CiAgICAgIC5oaWRlY2hhcnQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLnNob3djaGFydCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lOwogICAgICB9CiAgICAgICN0b29sdGlwIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b29sdGlwLWJhY2tncm91bmQsICM2MTYxNjEpOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgIHBvaW50ZXItZXZlbnRzOm5vbmU7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0ZXh0LWFsaWduOmNlbnRlcjsKICAgICAgICBwYWRkaW5nOiA2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgICBtYXJnaW4tbGVmdDogNTBweDsKICAgICAgICB3aGl0ZS1zcGFjZTogcHJlOwogICAgICAgIHRvcDogMHB4OwogICAgICB9CiAgICAgIC50b3BsZXZlbCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgcGFkZGluZy10b3A6IDRweDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9InRvcGxldmVsIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1N0cmluZ0NoYXJ0KF9jaGFydFR5cGUsIGNoYXJ0U2VsZWN0aW9uKV1dIj4KICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzaG93X3RhYmxlX2J1dHRvbiIgb24tY2xpY2s9Il90b2dnbGVTaG93VGFibGUiPltbX2dldFNob3dUYWJsZUJ1dHRvblRleHQoX3Nob3dUYWJsZSldXTwvcGFwZXItYnV0dG9uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8ZGl2IGNsYXNzJD0iW1tfY2hhcnRDbGFzc11dIj4KICAgICAgICA8ZGl2IGlkPSJjaGFydCIgY2xhc3MkPSJbW19jaGFydFN2Z0NsYXNzXV0iPjwvZGl2PgogICAgICAgIDxkaXYgaWQ9InhheGlzIiBjbGFzcyQ9IltbX3hBeGlzU3ZnQ2xhc3NdXSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nob3dUYWJsZV1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGFibGUiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLWhlYWRlci1yb3ciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctcm93LWVudHJ5IHRhYmxlLWhlYWRlciBsYWJlbC1jZWxsIj5WYWx1ZTwvZGl2PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2RhdGFdXSIgYXM9ImRhdGEiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy1yb3ctZW50cnkgdGFibGUtaGVhZGVyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5vbi1vdmVyZmxvdy1sYWJlbC1jZWxsIj5bW2RhdGEubmFtZV1dPC9kaXY+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxpcm9uLWxpc3QgaXRlbXM9IltbX3RhYmxlRGF0YV1dIiBhcz0iZW50cnkiIGNsYXNzJD0iW1tfdGFibGVEYXRhQ2xhc3NdXSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzJD0iW1tfZ2V0RW50cnlSb3dDbGFzcyhlbnRyeSwgc2VsZWN0aW9uKV1dIiBvbi10YXA9Il9yb3dDbGljayIgZGF0YS12YWx1ZT0iW1tfZ2V0RW50cnlSb3dWYWx1ZShlbnRyeSldXSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctcm93LWVudHJ5IGxhYmVsLWNlbGwiPltbZW50cnkudmFsdWVdXTwvZGl2PgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tlbnRyeS5jb3VudHNdXSIgYXM9ImNvdW50Ij4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcyQ9IltbX2dldENvdW50Q2VsbENsYXNzKHNob3dXZWlnaHRlZCldXSI+W1tjb3VudF1dPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPGlyb24tbGlzdD4KICAgICAgICA8L2lyb24tbGlzdD48L2lyb24tbGlzdD48L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBpZD0idG9vbHRpcCI+PC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJmYWNldHMtb3ZlcnZpZXctdGFibGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQogICAgICAuZmVhdHVyZS1uYW1lIHsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIG1heC13aWR0aDogNDgwcHg7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIG1hcmdpbjogMCAwIDRweCA0cHg7CiAgICAgIH0KICAgICAgLnRhYmxlLW5hbWUgewogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgd29yZC13cmFwOmJyZWFrLXdvcmQ7CiAgICAgICAgcGFkZGluZzogNHB4IDAgNHB4IDhweDsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDYxLDE0MCwyMDcsMC4zKTsKICAgICAgICBib3JkZXI6IHNvbGlkIDAuNXB4IHJnYmEoMCwwLDAsMC4xKTsKICAgICAgfQogICAgICAuZmVhdHVyZS1pcm9uLWxpc3QgewogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbiAhaW1wb3J0YW50OwogICAgICAgIGhlaWdodDogODAwcHg7CiAgICAgIH0KICAgICAgLmNoYXJ0LWNvbHVtbiB7CiAgICAgICAgd2lkdGg6IDI4MHB4OwogICAgICAgIG1pbi13aWR0aDogMjgwcHg7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CiAgICAgIC5jaGFydC1jb2x1bW4uaGVhZGVyLWNlbGwgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoNjEsMTQwLDIwNywwLjEpOwogICAgICAgIGJvcmRlci10b3A6IHNvbGlkIDAuNXB4IHJnYmEoMCwwLDAsMC4xKTsKICAgICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAwLjVweCByZ2JhKDAsMCwwLDAuMSk7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiBzb2xpZCAwLjVweCByZ2JhKDAsMCwwLDAuMSk7CiAgICAgICAgcGFkZGluZy1sZWZ0OiA4cHg7CiAgICAgIH0KICAgICAgLm51bWVyaWMtcm93IHsKICAgICAgICBtaW4taGVpZ2h0OiA4MHB4OwogICAgICAgIGRpc3BsYXk6IHRhYmxlLXJvdzsKICAgICAgfQogICAgICAuY2F0ZWdvcmljYWwtcm93IHsKICAgICAgICBtaW4taGVpZ2h0OiA5OHB4OwogICAgICAgIGRpc3BsYXk6IHRhYmxlLXJvdzsKICAgICAgfQogICAgICAudGFibGUtY2VsbCB7CiAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBsaW5lLWhlaWdodDogMS4yZW07CiAgICAgIH0KICAgICAgLmNoYXJ0LWNvbHVtbi50YWJsZS1jZWxsIHsKICAgICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICAgICAgcGFkZGluZzogMTBweCAwIDAgMjBweAogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgfQogICAgICAuaGVhZGVyLWNlbGwgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtaW4taGVpZ2h0OiA2MHB4OwogICAgICB9CiAgICAgIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXNpemU6IDEycHg7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1sYWJlbC1zcGFjaW5nOiAycHg7CiAgICAgIH0KICAgICAgLmNvbnRyb2wtaG9sZGVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICAgIC5jaGVja2JveC1ob2xkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDJweDsKICAgICAgfQogICAgICAuY2hhcnQtY2hlY2tib3ggewogICAgICAgIHBhZGRpbmctcmlnaHQ6IDhweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgIH0KICAgICAgI3dlaWdodGJveCB7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICB9CiAgICAgIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAxNTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbCAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIH0KICAgICAgfQogICAgICAuaGlkZGVuIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcyQ9IltbX2dldFRhYmxlV3JhcHBlckNsYXNzKGZlYXR1cmVzKV1dIj4KICAgICAgPGRpdiBjbGFzcz0iaGVhZGVyLXJvdyI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGVyLWNlbGwgdGFibGUtY2VsbCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1uYW1lIj5bW19nZXRUaXRsZShudW1lcmljKV1dIEZlYXR1cmVzIChbW19nZXRGZWF0dXJlQ291bnRUZXh0KGRhdGFNb2RlbCwgbnVtZXJpYywgZmVhdHVyZXMpXV0pCiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxmYWNldHMtb3ZlcnZpZXctcm93LWxlZ2VuZCBudW1lcmljPSJbW251bWVyaWNdXSIgc2hvdy13ZWlnaHRlZD0iW1tfc2hvd1dlaWdodGVkXV0iIGhhcy1jdXN0b209IltbX2hhc0N1c3RvbVN0YXRzKGRhdGFNb2RlbCldXSIgZGF0YS1tb2RlbD0iW1tkYXRhTW9kZWxdXSI+CiAgICAgICAgICA8L2ZhY2V0cy1vdmVydmlldy1yb3ctbGVnZW5kPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNlbGwgY2hhcnQtY29sdW1uIGhlYWRlci1jZWxsIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IkNoYXJ0IHRvIHNob3ciPgogICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tfY2hhcnRTZWxlY3Rpb259fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9InZhbHVlIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NoYXJ0U2VsZWN0aW9uVHlwZXNdXSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIHZhbHVlPSJbW2l0ZW1dXSI+W1tpdGVtXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjaGVja2JveC1ob2xkZXIiPgogICAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjbGFzcz0iY2hhcnQtY2hlY2tib3giIGlkPSJsb2dib3giIGNoZWNrZWQ9Int7X2xvZ1NjYWxlfX0iPmxvZzwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNsYXNzPSJjaGFydC1jaGVja2JveCIgaWQ9ImV4cGFuZGJveCIgY2hlY2tlZD0ie3tfZXhwYW5kQ2hhcnRzfX0iPmV4cGFuZDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNXZWlnaHRlZEhpc3RvZ3JhbShmZWF0dXJlcyldXSI+CiAgICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2xhc3M9ImNoYXJ0LWNoZWNrYm94IiBpZD0id2VpZ2h0Ym94IiBjaGVja2VkPSJ7e19zaG93V2VpZ2h0ZWR9fSI+d2VpZ2h0ZWQ8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZURhdGFzZXRzKGRhdGFNb2RlbCldXSI+CiAgICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2xhc3M9ImNoYXJ0LWNoZWNrYm94IiBpZD0icGVyY2VudGJveCIgY2hlY2tlZD0ie3tfc2hvd1BlcmNlbnRhZ2V9fSIgZGlzYWJsZWQ9IltbX2NoYXJ0U2VsZWN0aW9uSGFzUXVhbnRpbGVzKF9jaGFydFNlbGVjdGlvbildXSI+cGVyY2VudGFnZXM8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8aXJvbi1saXN0IGl0ZW1zPSJbW2ZlYXR1cmVzXV0iIGFzPSJmZWF0dXJlIiBjbGFzcz0iZmVhdHVyZS1pcm9uLWxpc3QiPgogICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgIDxkaXYgY2xhc3MkPSJbW19nZXRUYWJsZVJvd0NsYXNzKG51bWVyaWMpXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jZWxsIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLW5hbWUiPltbX2dldEZlYXR1cmVOYW1lKGZlYXR1cmUpXV08L2Rpdj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19nZXREYXRhc2V0cyhkYXRhTW9kZWwpXV0iIGFzPSJkYXRhc2V0IiBpbmRleC1hcz0iZGF0YXNldEluZGV4Ij4KICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgIDxmYWNldHMtb3ZlcnZpZXctcm93LXN0YXRzIHN0YXRzPSJbW19nZXRTdGF0cyhkYXRhTW9kZWwsIGRhdGFzZXQsIGZlYXR1cmUpXV0iIGN1c3RvbS1zdGF0cz0iW1tfZ2V0QWxsQ3VzdG9tU3RhdHMoZGF0YU1vZGVsLCBmZWF0dXJlKV1dIiBzaG93LXdlaWdodGVkPSJbW19zaG93V2VpZ2h0ZWRdXSIgaGFzLWN1c3RvbT0iW1tfaGFzQ3VzdG9tU3RhdHMoZGF0YU1vZGVsKV1dIiBkYXRhLW1vZGVsPSJbW2RhdGFNb2RlbF1dIiBkYXRhc2V0LWluZGV4PSJbW2RhdGFzZXRJbmRleF1dIiBjb21wYXJlLW1vZGU9IltbY29tcGFyZU1vZGVdXSI+CiAgICAgICAgICAgICAgICAgIDwvZmFjZXRzLW92ZXJ2aWV3LXJvdy1zdGF0cz4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzJD0iW1tfZ2V0Q2hhcnRDbGFzcyhfZXhwYW5kQ2hhcnRzKV1dIj4KICAgICAgICAgICAgICA8ZmFjZXRzLW92ZXJ2aWV3LWNoYXJ0IGRhdGE9IltbX2dldENoYXJ0RGF0YShkYXRhTW9kZWwsIGZlYXR1cmUpXV0iIGRhdGEtbW9kZWw9IltbZGF0YU1vZGVsXV0iIGZlYXR1cmU9IltbX2dldEZlYXR1cmVOYW1lKGZlYXR1cmUpXV0iIHNlbGVjdGlvbj0ie3tmZWF0dXJlU2xpY2VTZWxlY3Rpb259fSIgbG9nLXNjYWxlPSJbW19sb2dTY2FsZV1dIiBzaG93LXdlaWdodGVkPSJbW19zaG93V2VpZ2h0ZWRdXSIgc2hvdy1wZXJjZW50YWdlPSJbW19zaG93UGVyY2VudGFnZV1dIiBjaGFydC1zZWxlY3Rpb249IltbX2NoYXJ0U2VsZWN0aW9uXV0iIGV4cGFuZC1jaGFydD0iW1tfZXhwYW5kQ2hhcnRzXV0iPgogICAgICAgICAgICAgIDwvZmFjZXRzLW92ZXJ2aWV3LWNoYXJ0PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvaXJvbi1saXN0PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0iZmFjZXRzLW92ZXJ2aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlCiAgICAgICAgZm9udC1zaXplOiAxMHB0OwogICAgICB9CiAgICAgIC5jb250cm9scyB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyMzQsMjM0LDIzNCwwLjIpOwogICAgICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDAuNXB4IHJnYmEoMCwwLDAsMC4yKTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGhlaWdodDogNjBweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7CgogICAgICB9CiAgICAgIC5mZWF0dXJlLWNoZWNrYm94ZXMgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjM0LDIzNCwyMzQsMC4yKTsKICAgICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAwLjVweCByZ2JhKDAsMCwwLDAuMik7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgcGFkZGluZzogIDhweCAwIDhweCAyMHB4OwogICAgICB9CiAgICAgIC5mZWF0dXJlLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIHBhZGRpbmc6IDAgMCAwIDE2cHg7CiAgICAgIH0KICAgICAgcGFwZXItY2hlY2tib3ggewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQogICAgICAuaW5wdXQtY29udHJvbCB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWwgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9OwogICAgICB9CiAgICAgIC5mZWF0dXJlcy10ZXh0IHsKICAgICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgICBwYWRkaW5nOiAxcHggMCAwIDA7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CiAgICAgIC5sZWZ0LWRyb3Bkb3duIHsKICAgICAgICBwYWRkaW5nOiAwIDEwcHggMCAwOwogICAgICB9CiAgICAgIC5taWRkbGUtY2hlY2tib3ggewogICAgICAgIG1hcmdpbi10b3A6IDMwcHg7CiAgICAgICAgcGFkZGluZzogMCAxMHB4OwogICAgICB9CiAgICAgIC5yaWdodC1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDMwMHB4OwogICAgICAgIHBhZGRpbmc6IDAgMTBweDsKICAgICAgfQogICAgICAuZmVhdHVyZS1pcm9uLWxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDgwMHB4OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CiAgICAgIC5mZWF0dXJlLWNvbHVtbiB7CiAgICAgICAgd2lkdGg6IDIwMHB4OwogICAgICAgIG1heC13aWR0aDogMjAwcHg7CiAgICAgICAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CiAgICAgIC5sZWdlbmQtY29sdW1uIHsKICAgICAgICB3aWR0aDogMTIwcHg7CiAgICAgIH0KICAgICAgLnN0YXRzLWNvbHVtbiB7CiAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICAgIG1heC13aWR0aDogMTUwcHg7CiAgICAgICAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQogICAgICAuY2hhcnQtY29sdW1uIHsKICAgICAgICB3aWR0aDogNTgwcHg7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CiAgICAgIC50YWJsZS1yb3cgewogICAgICAgIGRpc3BsYXk6IHRhYmxlLXJvdzsKICAgICAgfQogICAgICAudGFibGUtY2VsbCB7CiAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgIHBhZGRpbmc6IDEwcHggNXB4IDAKICAgICAgfQogICAgICAuY2hhcnQtY29sdW1uLnRhYmxlLWNlbGwgewogICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICBwYWRkaW5nOiAxMHB4IDAgMCAyMHB4CiAgICAgIH0KICAgICAgLmhlYWRlci1yb3cgewogICAgICAgIGNsZWFyOiBib3RoOwogICAgICB9CiAgICAgIC5oZWFkZXItcm93ID4gLnRhYmxlLWNlbGwgewogICAgICAgIGZvbnQtc2l6ZTogMTRwdDsKICAgICAgICBwYWRkaW5nOiAwIDVweCAwOwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazsKICAgICAgfQogICAgICAuc3RhdHMtaGVhZGVyLXRleHQgewogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CiAgICAgIC5jaGFydC1oZWFkZXItdGV4dCB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CiAgICAgIC50YWJsZS1ob2xkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICAgICAgbWFyZ2luLWxlZnQ6IDMwcHg7CiAgICAgIH0KICAgICAgLnRhYmxlLWxlZnQgewogICAgICAgIG1hcmdpbjogMjBweCAyMHB4IDAgMDsKICAgICAgfQogICAgICAudGFibGUtcmlnaHQgewogICAgICAgIG1hcmdpbjogMjBweCAwIDAgMDsKICAgICAgfQogICAgICAuaGlkZGVuIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIC5sZWdlbmQtaG9sZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG1hcmdpbjogOHB4IDAgMCAzOHB4OwogICAgICB9CiAgICAgIC5sZWdlbmQtYm94IHsKICAgICAgICB3aWR0aDogOHB4OwogICAgICAgIGhlaWdodDogOHB4OwogICAgICAgIG1hcmdpbi10b3A6IDZweDsKICAgICAgfQogICAgICAubGVnZW5kLXJvdyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAubGVnZW5kLW5hbWUgewogICAgICAgIG1hcmdpbjogM3B4IDEwcHggMCA1cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICB9CiAgICAgIC8qIEdpdmUgbWluIGhlaWdodCB0byBwbGFjZWhvbGRlciBpbiBwYXBlci1pbnB1dCB0byBnZXQgYXJvdW5kIGNvbGFiIGVtYmVkZGluZwogICAgICAgKiBhbGlnbm1lbnQgaXNzdWUuCiAgICAgICAqLwogICAgICA6aG9zdCBwYXBlci1pbnB1dC1jb250YWluZXIgPiAuZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciB7CiAgICAgICAgbWluLWhlaWdodDogMjBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU1vZGVsXV0iPgogICAgICA8ZGl2IGNsYXNzJD0iW1tfZ2V0Q29udHJvbHNXcmFwcGVyQ2xhc3MoX2RhdGFNb2RlbCldXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbHMiPgogICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgY2xhc3M9ImxlZnQtZHJvcGRvd24gaW5wdXQtY29udHJvbCIgbGFiZWw9IlNvcnQgYnkiPgogICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7X3NvcnRPcmRlcn19IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zb3J0T3B0aW9uc11dIiBhcz0ib3B0aW9uIj4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPltbb3B0aW9uLm5hbWVdXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICA8cGFwZXItY2hlY2tib3ggbm9pbmsgY2xhc3M9Im1pZGRsZS1jaGVja2JveCIgY2hlY2tlZD0ie3tfcmV2ZXJzZU9yZGVyfX0iPgogICAgICAgICAgICBSZXZlcnNlIG9yZGVyCiAgICAgICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPHBhcGVyLWlucHV0IGNsYXNzPSJyaWdodC1pbnB1dCBpbnB1dC1jb250cm9sIiBsYWJlbD0iRmVhdHVyZSBzZWFyY2ggKHJlZ2V4IGVuYWJsZWQpIiB2YWx1ZT0ie3tzZWFyY2hTdHJpbmd9fSIgYXV0by12YWxpZGF0ZT0idHJ1ZSIgdmFsaWRhdG9yPSJmaWx0ZXItdmFsaWRhdG9yIj4KICAgICAgICAgICAgPGZhY2V0cy1vdmVydmlldy1maWx0ZXItdmFsaWRhdG9yIHZhbGlkYXRvci1uYW1lPSJmaWx0ZXItdmFsaWRhdG9yIj4KICAgICAgICAgICAgPC9mYWNldHMtb3ZlcnZpZXctZmlsdGVyLXZhbGlkYXRvcj4KICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1jaGVja2JveGVzIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImZlYXR1cmVzLXRleHQiPkZlYXR1cmVzOiA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2ZlYXR1cmVTcGVjQXJyYXldXSIgYXM9InNwZWNBbmRMaXN0Ij4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBub2luayBjaGVja2VkPSJ0cnVlIiBjbGFzcz0iZmVhdHVyZS1jaGVja2JveCIgaWQ9IltbX2dldFNwZWNDaGVja2JveElkKHNwZWNBbmRMaXN0KV1dIiBvbi1jaGFuZ2U9Il9mZWF0dXJlU3BlY0NoZWNrIj4KICAgICAgICAgICAgICBbW19nZXRTcGVjQ2hlY2tib3hUZXh0KHNwZWNBbmRMaXN0KV1dCiAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZURhdGFzZXRzKF9kYXRhTW9kZWwpXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1ob2xkZXIiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfZ2V0RGF0YXNldHMoX2RhdGFNb2RlbCldXSIgYXM9ImRhdGFzZXQiIGluZGV4LWFzPSJkYXRhc2V0SW5kZXgiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtYm94IiBzdHlsZT0iW1tfZ2V0TGVnZW5kQm94U3R5bGUoX2RhdGFNb2RlbCwgZGF0YXNldEluZGV4KV1dIj48L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtbmFtZSI+W1tfZ2V0RGF0YXNldE5hbWUoX2RhdGFNb2RlbCwgZGF0YXNldEluZGV4KV1dPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBjbGFzcz0idGFibGUtaG9sZGVyIj4KICAgICAgICA8ZmFjZXRzLW92ZXJ2aWV3LXRhYmxlIGZlYXR1cmVzPSJbW19nZXROdW1lcmljRmVhdHVyZUxpc3RJdGVtcyhfZGF0YU1vZGVsLCBzZWFyY2hTdHJpbmcsIF9zb3J0T3JkZXIsIF9yZXZlcnNlT3JkZXIsIF9mZWF0dXJlU3BlY0NoZWNrYm94ZXMpXV0iIGRhdGEtbW9kZWw9IltbX2RhdGFNb2RlbF1dIiBmZWF0dXJlLXNsaWNlLXNlbGVjdGlvbj0ie3tmZWF0dXJlU2xpY2VTZWxlY3Rpb259fSIgbnVtZXJpYz0idHJ1ZSIgY2xhc3M9InRhYmxlLWxlZnQiIGNvbXBhcmUtbW9kZT0iW1tjb21wYXJlTW9kZV1dIj4KICAgICAgICA8L2ZhY2V0cy1vdmVydmlldy10YWJsZT4KICAgICAgICA8ZmFjZXRzLW92ZXJ2aWV3LXRhYmxlIGZlYXR1cmVzPSJbW19nZXROb25OdW1lcmljRmVhdHVyZUxpc3RJdGVtcyhfZGF0YU1vZGVsLCBzZWFyY2hTdHJpbmcsIF9zb3J0T3JkZXIsIF9yZXZlcnNlT3JkZXIsIF9mZWF0dXJlU3BlY0NoZWNrYm94ZXMpXV0iIGRhdGEtbW9kZWw9IltbX2RhdGFNb2RlbF1dIiBmZWF0dXJlLXNsaWNlLXNlbGVjdGlvbj0ie3tmZWF0dXJlU2xpY2VTZWxlY3Rpb259fSIgY2xhc3M9InRhYmxlLXJpZ2h0IiBjb21wYXJlLW1vZGU9IltbY29tcGFyZU1vZGVdXSI+CiAgICAgICAgPC9mYWNldHMtb3ZlcnZpZXctdGFibGU+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idnotZXhhbXBsZS12aWV3ZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpZD0ibGludGVyLXBhcGVyLWJ1dHRvbi1zdHlsZSI+CiAgICAgIC8qKgogICAgICAgKiBUaGlzIHN0eWxlIHByZXNlcnZlcyB0aGUgc3R5bGluZyBwcmV2aW91cyB0bwogICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vUG9seW1lckVsZW1lbnRzL3BhcGVyLWJ1dHRvbi9wdWxsLzExNQogICAgICAgKiBUaGlzIGNoYW5nZSBjYW4gYnJlYWsgdGhlIGxheW91dCBvZiBwYXBlci1idXR0b24gY29udGVudC4KICAgICAgICogUmVtb3ZlIHRoaXMgc3R5bGUgdG8gYXBwbHkgdGhlIGNoYW5nZSwgbW9yZSBkZXRhaWxzIGF0IGIvNzA1MjgzNTYuCiAgICAgICAqLwogICAgICBwYXBlci1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLnNlcS1mZWF0IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTZweDsKICAgICAgfQoKICAgICAgLnZhbHVlLWxpc3QgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuc2xpZGVyLWhvbGRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLnNsaWRlci1sYWJlbCB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5vdXRlciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgIC5pbWFnZSB7CiAgICAgICAgLyogPGltZz4gZWxlbWVudHMgYXJlIHVzZWQgdG8gbG9hZCB0byBhIGNhbnZhcyBzbyB0aGV5IGFyZW4ndCBkaXNwbGF5ZWQuICovCiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLmZsZXgtY29udHJvbHMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAudmFsdWUtcGlsbHMtaG9sZGVyIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1iYXNpczogMTAwJTsKICAgICAgfQoKICAgICAgaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSB7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZmZmZmZjsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgY29sb3I6ICMzYzQwNDM7CiAgICAgIH0KCiAgICAgIGlyb24tYXV0b2dyb3ctdGV4dGFyZWEudmFsdWUtc2FtZSB7CiAgICAgICAgY29sb3I6ICM1ZjYzNjg7CiAgICAgIH0KCiAgICAgIGlyb24tYXV0b2dyb3ctdGV4dGFyZWEudmFsdWUtZGlmZmVyZW50IHsKICAgICAgICBjb2xvcjogIzM0YTg1MzsKICAgICAgICAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE6IHsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgfQogICAgICB9CgogICAgICAudmFsdWUtcGlsbCB7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgICBtYXJnaW46IDRweDsKICAgICAgICBwYWRkaW5nOiA0cHggOHB4OwogICAgICAgIGNvbG9yOiAjM2M0MDQzOwogICAgICB9CgogICAgICAudmFsdWUtcGlsbDpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogI2Y4ZjlmYTsKICAgICAgfQoKICAgICAgLnZhbHVlLXBpbGxbZm9jdXNlZF0gewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNmZmViM2I7CiAgICAgICAgYmFja2dyb3VuZDogI2Y4ZjlmYTsKICAgICAgfQoKICAgICAgLnZhbHVlLWNvbXBhcmUgewogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgcGFkZGluZzogNHB4IDhweDsKICAgICAgfQoKICAgICAgLnZhbHVlLXBpbGwtc3RhY2tlZCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgbWFyZ2luOiA0cHggNHB4IDRweCAwOwogICAgICAgIHBhZGRpbmc6IDJweDsKICAgICAgfQoKICAgICAgLnZhbHVlLXBpbGwtZ3JpZCB7CiAgICAgICAgd2lkdGg6IDEyMHB4OwogICAgICAgIG1hcmdpbjogNHB4IDhweCA0cHggMDsKICAgICAgfQoKICAgICAgLmZlYXR1cmUtbmFtZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDRweDsKICAgICAgICBtYXJnaW46IDRweCAyMHB4IDRweCA4cHg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGNvbG9yOiAjODA4NjhiOwogICAgICB9CgogICAgICAuZmVhdHVyZS1uYW1lLXRleHQgewogICAgICAgIHdpZHRoOiAzMDBweDsKICAgICAgICBtYXgtd2lkdGg6IDMwMHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi10b3A6IDRweDsKICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgICBsaW5lLWhlaWdodDogMS42ZW07CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiA4cHg7CiAgICAgIH0KCiAgICAgIC5mZWF0dXJlLW5hbWUtaGVhZGVyLXRleHQgewogICAgICAgIHdpZHRoOiAzMDBweDsKICAgICAgICBtYXgtd2lkdGg6IDMwMHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgY29sb3I6ICMyMDIxMjQ7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjhlbTsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICB9CgogICAgICAuZmVhdHVyZS1uYW1lLmZlYXR1cmUtbmFtZS1oZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDRweCA0cHggMHB4IDRweDsKICAgICAgICBiYWNrZ3JvdW5kOiAjZjhmOWZhOwogICAgICAgIG1hcmdpbjogMHB4OwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZThlYWVkOwogICAgICB9CgogICAgICAuc2xpZGVyIHsKICAgICAgICAtLXBhcGVyLXNsaWRlci1pbnB1dDogewogICAgICAgICAgd2lkdGg6IDEwMHB4OwogICAgICAgIH0KICAgICAgfQoKICAgICAgLmhpZGUtY29udHJvbHMgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5pbmRlbnQgewogICAgICAgIG1hcmdpbi1sZWZ0OiAxNnB4OwogICAgICB9CgogICAgICAuc2NhbGUtbGFiZWwgewogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICB9CgogICAgICAud2luZG93aW5nLWxhYmVsIHsKICAgICAgICB3aWR0aDogMTEwcHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLXRvZ2dsZS1idXR0b24gewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5leHBhbmQtYnV0dG9uLWhvbGRlciB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgfQoKICAgICAgLmRlbGV0ZS12YWx1ZS1idXR0b24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZlNjAzOwogICAgICAgIGNvbG9yOiAjNWY2MzY4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICAgICAgbWF4LXdpZHRoOiAyNHB4OwogICAgICAgIG1heC1oZWlnaHQ6IDI0cHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBtYXJnaW4tdG9wOiAycHg7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXM7CiAgICAgIH0KCiAgICAgIC5kZWxldGUtdmFsdWUtYnV0dG9uLmRlbGV0ZS12YWx1ZS1idXR0b24taGlkZGVuIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zLCB2aXNpYmlsaXR5IDIwMG1zOwogICAgICB9CgogICAgICAuZGVsZXRlLWZlYXR1cmUtYnV0dG9uIHsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIG1hcmdpbi1sZWZ0OiA0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogMHB4OwogICAgICB9CgogICAgICAuYWRkLXZhbHVlLWJ1dHRvbiB7CiAgICAgICAgbWFyZ2luLXRvcDogMnB4OwogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIG1pbi1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWluLXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgY29sb3I6ICM4MDg2OGI7CiAgICAgIH0KCiAgICAgIC5hZGQtZmVhdHVyZS1idXR0b24gewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgIH0KCiAgICAgIC51cGxvYWQtaW1hZ2UtYnV0dG9uIHsKICAgICAgICBtYXJnaW46IDAgMCAwIDVweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIGhlaWdodDogMTZweDsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgIH0KCiAgICAgIC5pbWFnZWNhcmQgewogICAgICAgIG1hcmdpbjogNHB4OwogICAgICB9CgogICAgICAuaW1hZ2Utc2NhbGUtYnV0dG9uIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KCiAgICAgIC5zYWxpZW5jeS1sZWdlbmQtbGFiZWwgewogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgfQoKICAgICAgLmZlYXR1cmUtZGlhbG9nIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIH0KCiAgICAgIC5mZWF0dXJlLWRpYWxvZy1idXR0b24gewogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIC5pbWFnZS1ib3R0b20tYmFyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kOiAjM2M0MDQzOwogICAgICB9CgogICAgICAuaW1hZ2UtdXBsb2FkLWlucHV0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAuc3BhY2UtZm9yLW1vcmUtYnV0dG9uIHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgfQoKICAgICAgLnZhbHVlLWhlYWRlci10ZXh0IHsKICAgICAgICBtaW4td2lkdGg6IDEzMHB4OwogICAgICAgIHdpZHRoOiAxMzBweDsKICAgICAgICBjb2xvcjogIzIwMjEyNDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDEuOGVtOwogICAgICB9CgogICAgICBwYXBlci1kaWFsb2cgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RhZGNlMDsKICAgICAgICBjb2xvcjogdmFyKC0tdGItb3JhbmdlLWRhcmspOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICAgIG1hcmdpbjogNXB4OwogICAgICB9CgogICAgICAuY29udHJvbC1idXR0b25bZGlzYWJsZWRdIHsKICAgICAgICBjb2xvcjogI2RhZGNlMDsKICAgICAgfQoKICAgICAgLnZhbHVlLXRleHQgewogICAgICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjZmZlYjNiOwogICAgICB9CgogICAgICAuY29tcGFyZS12YWx1ZS10ZXh0IHsKICAgICAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgIzM0YTg1MzsKICAgICAgfQoKICAgICAgLm5vLWNvbXBhcmUtdmFsdWUtdGV4dCB7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgY2xhc3M9Im91dGVyIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dTZWFyY2hCb3hdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0IHZhbHVlPSJ7e2ZlYXR1cmVTZWFyY2hWYWx1ZX19IiBsYWJlbD0iU2VhcmNoIiBjbGFzcz0iZmlsdGVyLWlucHV0IiBuby1sYWJlbC1mbG9hdD4KICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iaWNvbnM6c2VhcmNoIiBwcmVmaXg+PC9pcm9uLWljb24+CiAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1uYW1lIGZlYXR1cmUtbmFtZS1oZWFkZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImZlYXR1cmUtbmFtZS1oZWFkZXItdGV4dCI+RmVhdHVyZTwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InZhbHVlLXBpbGxzLWhvbGRlciBmbGV4LWNvbnRyb2xzIHZhbHVlLWhlYWRlci10ZXh0Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9InZhbHVlLXRleHQiPlZhbHVlKHMpPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NvbXBhcmVNb2RlXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0idmFsdWUtcGlsbHMtaG9sZGVyIGZsZXgtY29udHJvbHMgdmFsdWUtaGVhZGVyLXRleHQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzJD0iW1tnZXRDb21wYXJlSGVhZGVyQ2xhc3MoaGlnaGxpZ2h0RGlmZmVyZW5jZXMpXV0iPgogICAgICAgICAgICAgIFtbY29tcGFyZVRpdGxlXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDxkaXYgY2xhc3M9InNwYWNlLWZvci1tb3JlLWJ1dHRvbiI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2ZpbHRlcmVkRmVhdHVyZXNMaXN0XV0iIGFzPSJmZWF0Ij4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaXNJbWFnZShmZWF0Lm5hbWUpXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1uYW1lIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1uYW1lLXRleHQiPltbZmVhdC5uYW1lXV08L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idmFsdWUtcGlsbHMtaG9sZGVyIj4KICAgICAgICAgICAgICA8cGFwZXItY2FyZCBpZD0iW1tnZXRJbWFnZUNhcmRJZChmZWF0Lm5hbWUpXV0iIGNsYXNzPSJpbWFnZWNhcmQiPgogICAgICAgICAgICAgICAgPGltZyBjbGFzcz0iaW1hZ2UiIHNyYyQ9IltbZ2V0SW1hZ2VTcmMoZmVhdC5uYW1lKV1dIiBpZD0iW1tnZXRJbWFnZUlkKGZlYXQubmFtZSldXSI+CiAgICAgICAgICAgICAgICA8Y2FudmFzIGlkPSJbW2dldENhbnZhc0lkKGZlYXQubmFtZSldXSIgZGF0YS1mZWF0dXJlPSJbW2ZlYXQubmFtZV1dIj48L2NhbnZhcz4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG91bGRTaG93SW1hZ2VDb250cm9scyhoYXNJbWFnZSwgYWxsb3dJbWFnZUNvbnRyb2xzKV1dIj4KICAgICAgICAgICAgICAgICAgPGRpdj5JbWFnZSB3aW5kb3dpbmcgKGNvbnRyYXN0KTwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItaG9sZGVyIGluZGVudCI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLWxhYmVsIHdpbmRvd2luZy1sYWJlbCI+CiAgICAgICAgICAgICAgICAgICAgICBXaW5kb3cgY2VudGVyOgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1zbGlkZXIgY2xhc3M9InNsaWRlciIgZWRpdGFibGU9InRydWUiIG1heD0iMjU1IiBpbW1lZGlhdGUtdmFsdWU9Int7d2luZG93Q2VudGVyfX0iIHZhbHVlPSJbW3dpbmRvd0NlbnRlcl1dIj4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1ob2xkZXIgaW5kZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItbGFiZWwgd2luZG93aW5nLWxhYmVsIj4KICAgICAgICAgICAgICAgICAgICAgIFdpbmRvdyB3aWR0aDoKICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItc2xpZGVyIGNsYXNzPSJzbGlkZXIiIGVkaXRhYmxlPSJ0cnVlIiBtYXg9IjUxMiIgbWluPSIxIiBpbW1lZGlhdGUtdmFsdWU9Int7d2luZG93V2lkdGh9fSIgdmFsdWU9Iltbd2luZG93V2lkdGhdXSI+CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1zbGlkZXI+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4LWNvbnRyb2xzIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzY2FsZS1sYWJlbCI+SW1hZ2Ugc2NhbGUgcGVyY2VudGFnZTo8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbm8tbGFiZWwtZmxvYXQgdHlwZT0ibnVtYmVyIiBtaW49IjEwIiBtYXg9IjUwMCIgdmFsdWU9Int7aW1hZ2VTY2FsZVBlcmNlbnRhZ2V9fSI+CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJpbWFnZS1zY2FsZS1idXR0b24iIG9uLWNsaWNrPSJ1cGRhdGVJbWFnZXMiPgogICAgICAgICAgICAgICAgICAgICAgc2V0CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImltYWdlLWJvdHRvbS1iYXIiPgogICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gY2xhc3MkPSJbW2dldFVwbG9hZEltYWdlQ2xhc3MocmVhZG9ubHkpXV0iIGljb249ImZpbGUtdXBsb2FkIiBvbi1jbGljaz0idXBsb2FkSW1hZ2VDbGlja2VkIiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iIHRpdGxlPSJVcGxvYWQgaW1hZ2UiPgogICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgY2xhc3M9ImltYWdlLXVwbG9hZC1pbnB1dCIgdHlwZT0iZmlsZSIgb24tY2hhbmdlPSJoYW5kbGVJbWFnZVVwbG9hZCIgZGF0YS1mZWF0dXJlPSJbW2ZlYXQubmFtZV1dIiBkYXRhLWluZGV4PSJbW2luZGV4XV0iPgogICAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC9wYXBlci1jYXJkPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NvbXBhcmVNb2RlXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InZhbHVlLXBpbGxzLWhvbGRlciI+CiAgICAgICAgICAgICAgICA8cGFwZXItY2FyZCBpZD0iW1tnZXRDb21wYXJlSW1hZ2VDYXJkSWQoZmVhdC5uYW1lKV1dIiBjbGFzcz0iaW1hZ2VjYXJkIj4KICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz0iaW1hZ2UiIHNyYyQ9IltbZ2V0Q29tcGFyZUltYWdlU3JjKGZlYXQubmFtZSldXSIgaWQ9IltbZ2V0Q29tcGFyZUltYWdlSWQoZmVhdC5uYW1lKV1dIj4KICAgICAgICAgICAgICAgICAgPGNhbnZhcyBpZD0iW1tnZXRDb21wYXJlQ2FudmFzSWQoZmVhdC5uYW1lKV1dIiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iPjwvY2FudmFzPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbWFnZS1ib3R0b20tYmFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvcGFwZXItY2FyZD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Im1vcmUtaG9yaXoiIGNsYXNzJD0iW1tnZXRBZGRWYWx1ZUJ1dHRvbkNsYXNzKHJlYWRvbmx5KV1dIiBvbi1jbGljaz0iZmVhdHVyZU1vcmVDbGlja2VkIiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1kaWFsb2cgaWQ9IltbZ2V0RmVhdHVyZURpYWxvZ0lkKGZlYXQubmFtZSldXSIgaG9yaXpvbnRhbC1hbGlnbj0icmlnaHQiIHZlcnRpY2FsLWFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZlYXR1cmUtZGlhbG9nIj4KICAgICAgICAgICAgICAgIDxwYXBlci1idXR0b24gZGF0YS1mZWF0dXJlPSJbW2ZlYXQubmFtZV1dIiBvbi1jbGljaz0iZGVsZXRlRmVhdHVyZSIgY2xhc3M9ImZlYXR1cmUtZGlhbG9nLWJ1dHRvbiI+CiAgICAgICAgICAgICAgICAgIERlbGV0ZSBmZWF0dXJlCiAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shaXNJbWFnZShmZWF0Lm5hbWUpXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1uYW1lIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1uYW1lLXRleHQiPltbZmVhdC5uYW1lXV08L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleC1jb250cm9scyB2YWx1ZS1waWxscy1ob2xkZXIiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpc0V4cGFuZGVkKGZlYXQubmFtZSwgZXhwYW5kQWxsRmVhdHVyZXMpXV0iPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tnZXRGZWF0dXJlVmFsdWVzKGZlYXQubmFtZSldXSIgYXM9InZhbHVlIj4KICAgICAgICAgICAgICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3MkPSJbW2dldElucHV0UGlsbENsYXNzKGZlYXQubmFtZSwgZGlzcGxheU1vZGUpXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiBvbi1pbnB1dD0ib25WYWx1ZUNoYW5nZWQiIG9uLWZvY3VzPSJvbklucHV0Rm9jdXMiIG9uLWJsdXI9Im9uSW5wdXRCbHVyIiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iIGRhdGEtaW5kZXg9IltbaW5kZXhdXSIgdmFsdWU9IltbdmFsdWVdXSI+CiAgICAgICAgICAgICAgICAgIDwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWlzRXhwYW5kZWQoZmVhdC5uYW1lLCBleHBhbmRBbGxGZWF0dXJlcyldXSI+CiAgICAgICAgICAgICAgICA8aXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSBjbGFzcyQ9IltbZ2V0SW5wdXRQaWxsQ2xhc3MoZmVhdC5uYW1lLCBkaXNwbGF5TW9kZSldXSIgcmVhZG9ubHkkPSJbW3JlYWRvbmx5XV0iIG9uLWlucHV0PSJvblZhbHVlQ2hhbmdlZCIgb24tZm9jdXM9Im9uSW5wdXRGb2N1cyIgb24tYmx1cj0ib25JbnB1dEJsdXIiIGRhdGEtZmVhdHVyZT0iW1tmZWF0Lm5hbWVdXSIgZGF0YS1pbmRleD0iW1t6ZXJvSW5kZXhdXSIgdmFsdWU9IltbZ2V0Rmlyc3RGZWF0dXJlVmFsdWUoZmVhdC5uYW1lKV1dIj4KICAgICAgICAgICAgICAgIDwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tmZWF0dXJlSGFzTXVsdGlwbGVWYWx1ZXMoZmVhdC5uYW1lKV1dIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iIG9uLWNsaWNrPSJleHBhbmRGZWF0dXJlIiBjbGFzcyQ9IltbZ2V0SW5wdXRQaWxsQ2xhc3MoZmVhdC5uYW1lLCBkaXNwbGF5TW9kZSldXSI+CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NvbXBhcmVNb2RlXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgtY29udHJvbHMgdmFsdWUtcGlsbHMtaG9sZGVyIj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpc0V4cGFuZGVkKGZlYXQubmFtZSwgZXhwYW5kQWxsRmVhdHVyZXMpXV0iPgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2dldENvbXBhcmVGZWF0dXJlVmFsdWVzKGZlYXQubmFtZSldXSIgYXM9InZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8aXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSBjbGFzcyQ9IltbZ2V0Q29tcGFyZUlucHV0Q2xhc3MoZmVhdC5uYW1lLCBkaXNwbGF5TW9kZSwgaW5kZXgpXV0iIHJlYWRvbmx5IHZhbHVlPSJbW3ZhbHVlXV0iPgogICAgICAgICAgICAgICAgICAgIDwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWlzRXhwYW5kZWQoZmVhdC5uYW1lLCBleHBhbmRBbGxGZWF0dXJlcyldXSI+CiAgICAgICAgICAgICAgICAgIDxpcm9uLWF1dG9ncm93LXRleHRhcmVhIGNsYXNzJD0iW1tnZXRDb21wYXJlSW5wdXRDbGFzcyhmZWF0Lm5hbWUsIGRpc3BsYXlNb2RlLCB6ZXJvSW5kZXgpXV0iIHJlYWRvbmx5IHZhbHVlPSJbW2dldEZpcnN0Q29tcGFyZUZlYXR1cmVWYWx1ZShmZWF0Lm5hbWUpXV0iPgogICAgICAgICAgICAgICAgICA8L2lyb24tYXV0b2dyb3ctdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tjb21wYXJlRmVhdHVyZUhhc011bHRpcGxlVmFsdWVzKGZlYXQubmFtZSldXSI+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iIG9uLWNsaWNrPSJleHBhbmRGZWF0dXJlIiBjbGFzcyQ9IltbZ2V0Q29tcGFyZUlucHV0Q2xhc3MoZmVhdC5uYW1lLCBkaXNwbGF5TW9kZSldXSI+CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ibW9yZS1ob3JpeiIgY2xhc3MkPSJbW2dldEFkZFZhbHVlQnV0dG9uQ2xhc3MocmVhZG9ubHkpXV0iIG9uLWNsaWNrPSJmZWF0dXJlTW9yZUNsaWNrZWQiIGRhdGEtZmVhdHVyZT0iW1tmZWF0Lm5hbWVdXSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBpZD0iW1tnZXRGZWF0dXJlRGlhbG9nSWQoZmVhdC5uYW1lKV1dIiBob3Jpem9udGFsLWFsaWduPSJyaWdodCIgdmVydGljYWwtYWxpZ249ImJvdHRvbSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1kaWFsb2ciPgogICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iIG9uLWNsaWNrPSJkZWxldGVGZWF0dXJlIiBjbGFzcz0iZmVhdHVyZS1kaWFsb2ctYnV0dG9uIj4KICAgICAgICAgICAgICAgICAgRGVsZXRlIGZlYXR1cmUKICAgICAgICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBkYXRhLWZlYXR1cmU9IltbZmVhdC5uYW1lXV0iIG9uLWNsaWNrPSJhZGRWYWx1ZSIgY2xhc3M9ImZlYXR1cmUtZGlhbG9nLWJ1dHRvbiI+CiAgICAgICAgICAgICAgICAgIEFkZCBmZWF0dXJlIHZhbHVlCiAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaXNTZXFFeGFtcGxlKG1heFNlcU51bWJlcildXSI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLWhvbGRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItbGFiZWwiPlNlcXVlbmNlIE51bWJlcjo8L2Rpdj4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgY2xhc3M9InNsaWRlciIgZWRpdGFibGU9InRydWUiIG1heD0iW1ttYXhTZXFOdW1iZXJdXSIgdmFsdWU9Int7c2VxTnVtYmVyfX0iPgogICAgICAgICAgPC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tmaWx0ZXJlZFNlcUZlYXR1cmVzTGlzdF1dIiBhcz0ic2VxZmVhdCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzZXFmZWF0Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2lzSW1hZ2Uoc2VxZmVhdC5uYW1lKV1dIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLW5hbWUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1uYW1lLXRleHQiPltbc2VxZmVhdC5uYW1lXV08L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InZhbHVlLXBpbGxzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1jYXJkIGlkPSJbW2dldEltYWdlQ2FyZElkKHNlcWZlYXQubmFtZSldXSIgY2xhc3M9ImltYWdlY2FyZCI+CiAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz0iaW1hZ2UiIHNyYyQ9IltbZ2V0U2VxSW1hZ2VTcmMoc2VxZmVhdC5uYW1lLCBzZXFOdW1iZXIpXV0iIGlkPSJbW2dldEltYWdlSWQoc2VxZmVhdC5uYW1lKV1dIj4KICAgICAgICAgICAgICAgICAgICA8Y2FudmFzIGlkPSJbW2dldENhbnZhc0lkKHNlcWZlYXQubmFtZSldXSIgZGF0YS1mZWF0dXJlPSJbW3NlcWZlYXQubmFtZV1dIiBkYXRhLXNlcS1udW09Iltbc2VxTnVtYmVyXV0iPjwvY2FudmFzPgogICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG91bGRTaG93SW1hZ2VDb250cm9scyhoYXNJbWFnZSwgYWxsb3dJbWFnZUNvbnRyb2xzKV1dIj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImltYWdlLWNvbnRyb2xzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5JbWFnZSB3aW5kb3dpbmcgKGNvbnRyYXN0KTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItaG9sZGVyIGluZGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLWxhYmVsIHdpbmRvd2luZy1sYWJlbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3cgY2VudGVyOgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1zbGlkZXIgY2xhc3M9InNsaWRlciIgZWRpdGFibGU9InRydWUiIG1heD0iMjU1IiBpbW1lZGlhdGUtdmFsdWU9Int7d2luZG93Q2VudGVyfX0iIHZhbHVlPSJbW3dpbmRvd0NlbnRlcl1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1ob2xkZXIgaW5kZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItbGFiZWwgd2luZG93aW5nLWxhYmVsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvdyB3aWR0aDoKICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItc2xpZGVyIGNsYXNzPSJzbGlkZXIiIGVkaXRhYmxlPSJ0cnVlIiBtYXg9IjUxMiIgbWluPSIxIiBpbW1lZGlhdGUtdmFsdWU9Int7d2luZG93V2lkdGh9fSIgdmFsdWU9Iltbd2luZG93V2lkdGhdXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1zbGlkZXI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4LWNvbnRyb2xzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzY2FsZS1sYWJlbCI+SW1hZ2Ugc2NhbGUgcGVyY2VudGFnZTo8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbm8tbGFiZWwtZmxvYXQgdHlwZT0ibnVtYmVyIiBtaW49IjEwIiBtYXg9IjUwMCIgdmFsdWU9Int7aW1hZ2VTY2FsZVBlcmNlbnRhZ2V9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJpbWFnZS1zY2FsZS1idXR0b24iIG9uLWNsaWNrPSJ1cGRhdGVJbWFnZXMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbWFnZS1ib3R0b20tYmFyIj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcyQ9IltbZ2V0VXBsb2FkSW1hZ2VDbGFzcyhyZWFkb25seSldXSIgaWNvbj0iZmlsZS11cGxvYWQiIG9uLWNsaWNrPSJ1cGxvYWRJbWFnZUNsaWNrZWQiIGRhdGEtZmVhdHVyZT0iW1tzZXFmZWF0Lm5hbWVdXSIgdGl0bGU9IlVwbG9hZCBpbWFnZSI+CiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGNsYXNzPSJpbWFnZS11cGxvYWQtaW5wdXQiIHR5cGU9ImZpbGUiIG9uLWNoYW5nZT0iaGFuZGxlSW1hZ2VVcGxvYWQiIGRhdGEtZmVhdHVyZT0iW1tzZXFmZWF0Lm5hbWVdXSIgZGF0YS1pbmRleD0iW1tpbmRleF1dIiBkYXRhLXNlcS1udW09Iltbc2VxTnVtYmVyXV0iPgogICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9wYXBlci1jYXJkPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbY29tcGFyZU1vZGVdXSI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InZhbHVlLXBpbGxzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWNhcmQgaWQ9IltbZ2V0Q29tcGFyZUltYWdlQ2FyZElkKHNlcWZlYXQubmFtZSldXSIgY2xhc3M9ImltYWdlY2FyZCI+CiAgICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPSJpbWFnZSIgc3JjJD0iW1tnZXRDb21wYXJlU2VxSW1hZ2VTcmMoc2VxZmVhdC5uYW1lLCBzZXFOdW1iZXIpXV0iIGlkPSJbW2dldENvbXBhcmVJbWFnZUlkKHNlcWZlYXQubmFtZSldXSI+CiAgICAgICAgICAgICAgICAgICAgICA8Y2FudmFzIGlkPSJbW2dldENvbXBhcmVDYW52YXNJZChzZXFmZWF0Lm5hbWUpXV0iIGRhdGEtZmVhdHVyZT0iW1tzZXFmZWF0Lm5hbWVdXSIgZGF0YS1zZXEtbnVtPSJbW3NlcU51bWJlcl1dIj48L2NhbnZhcz4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImltYWdlLWJvdHRvbS1iYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItY2FyZD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Im1vcmUtaG9yaXoiIGNsYXNzJD0iW1tnZXRBZGRWYWx1ZUJ1dHRvbkNsYXNzKHJlYWRvbmx5KV1dIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBkYXRhLWZlYXR1cmU9Iltbc2VxZmVhdC5uYW1lXV0iIG9uLWNsaWNrPSJkZWxldGVGZWF0dXJlIj4KICAgICAgICAgICAgICAgICAgICBEZWxldGUgZmVhdHVyZQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWlzSW1hZ2Uoc2VxZmVhdC5uYW1lKV1dIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLW5hbWUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmVhdHVyZS1uYW1lLXRleHQiPltbc2VxZmVhdC5uYW1lXV08L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgtY29udHJvbHMgdmFsdWUtcGlsbHMtaG9sZGVyIj4KICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2lzRXhwYW5kZWQoc2VxZmVhdC5uYW1lLCBleHBhbmRBbGxGZWF0dXJlcyldXSI+CiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tnZXRTZXFGZWF0dXJlVmFsdWVzKHNlcWZlYXQubmFtZSwgc2VxTnVtYmVyKV1dIiBhcz0ic2VxdmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3MkPSJbW2dldElucHV0UGlsbENsYXNzKHNlcWZlYXQubmFtZSwgZGlzcGxheU1vZGUpXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiBvbi1pbnB1dD0ib25WYWx1ZUNoYW5nZWQiIG9uLWZvY3VzPSJvbklucHV0Rm9jdXMiIG9uLWJsdXI9Im9uSW5wdXRCbHVyIiBkYXRhLWZlYXR1cmU9Iltbc2VxZmVhdC5uYW1lXV0iIGRhdGEtaW5kZXg9IltbaW5kZXhdXSIgZGF0YS1zZXEtbnVtPSJbW3NlcU51bWJlcl1dIiB2YWx1ZT0iW1tzZXF2YWx1ZV1dIj4KICAgICAgICAgICAgICAgICAgICAgIDwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWlzRXhwYW5kZWQoc2VxZmVhdC5uYW1lLCBleHBhbmRBbGxGZWF0dXJlcyldXSI+CiAgICAgICAgICAgICAgICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3MkPSJbW2dldElucHV0UGlsbENsYXNzKHNlcWZlYXQubmFtZSwgZGlzcGxheU1vZGUpXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiBvbi1pbnB1dD0ib25WYWx1ZUNoYW5nZWQiIG9uLWZvY3VzPSJvbklucHV0Rm9jdXMiIG9uLWJsdXI9Im9uSW5wdXRCbHVyIiBkYXRhLWZlYXR1cmU9Iltbc2VxZmVhdC5uYW1lXV0iIGRhdGEtaW5kZXg9IltbemVyb0luZGV4XV0iIGRhdGEtc2VxLW51bT0iW1tzZXFOdW1iZXJdXSIgdmFsdWU9IltbZ2V0Rmlyc3RTZXFGZWF0dXJlVmFsdWUoc2VxZmVhdC5uYW1lLCBzZXFOdW1iZXIpXV0iPgogICAgICAgICAgICAgICAgICAgIDwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2VxRmVhdHVyZUhhc011bHRpcGxlVmFsdWVzKHNlcWZlYXQubmFtZSwgc2VxTnVtYmVyKV1dIj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1idXR0b24gZGF0YS1mZWF0dXJlPSJbW3NlcWZlYXQubmFtZV1dIiBvbi1jbGljaz0iZXhwYW5kRmVhdHVyZSIgY2xhc3MkPSJbW2dldElucHV0UGlsbENsYXNzKHNlcWZlYXQubmFtZSwgZGlzcGxheU1vZGUpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tjb21wYXJlTW9kZV1dIj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleC1jb250cm9scyB2YWx1ZS1waWxscy1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpc0V4cGFuZGVkKHNlcWZlYXQubmFtZSwgZXhwYW5kQWxsRmVhdHVyZXMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tnZXRDb21wYXJlU2VxRmVhdHVyZVZhbHVlcyhzZXFmZWF0Lm5hbWUsIHNlcU51bWJlcildXSIgYXM9InNlcXZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3MkPSJbW2dldFNlcUNvbXBhcmVJbnB1dENsYXNzKHNlcWZlYXQubmFtZSwgZGlzcGxheU1vZGUsIHNlcU51bWJlciwgaW5kZXgpXV0iIHJlYWRvbmx5IHZhbHVlPSJbW3NlcXZhbHVlXV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L2lyb24tYXV0b2dyb3ctdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFpc0V4cGFuZGVkKHNlcWZlYXQubmFtZSwgZXhwYW5kQWxsRmVhdHVyZXMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3MkPSJbW2dldFNlcUNvbXBhcmVJbnB1dENsYXNzKHNlcWZlYXQubmFtZSwgZGlzcGxheU1vZGUsIHNlcU51bWJlciwgemVyb0luZGV4KV1dIiByZWFkb25seSB2YWx1ZT0iW1tnZXRGaXJzdENvbXBhcmVTZXFGZWF0dXJlVmFsdWUoc2VxZmVhdC5uYW1lLCBzZXFOdW1iZXIpXV0iPgogICAgICAgICAgICAgICAgICAgICAgPC9pcm9uLWF1dG9ncm93LXRleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NvbXBhcmVTZXFGZWF0dXJlSGFzTXVsdGlwbGVWYWx1ZXMoc2VxZmVhdC5uYW1lLCBzZXFOdW1iZXIpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGRhdGEtZmVhdHVyZT0iW1tzZXFmZWF0Lm5hbWVdXSIgb24tY2xpY2s9ImV4cGFuZEZlYXR1cmUiIGNsYXNzJD0iW1tnZXRTZXFDb21wYXJlSW5wdXRDbGFzcyhzZXFmZWF0Lm5hbWUsIGRpc3BsYXlNb2RlLCBzZXFOdW1iZXIpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Im1vcmUtaG9yaXoiIGNsYXNzJD0iW1tnZXRBZGRWYWx1ZUJ1dHRvbkNsYXNzKHJlYWRvbmx5KV1dIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBkYXRhLWZlYXR1cmU9Iltbc2VxZmVhdC5uYW1lXV0iIG9uLWNsaWNrPSJkZWxldGVGZWF0dXJlIj4KICAgICAgICAgICAgICAgICAgICBEZWxldGUgZmVhdHVyZQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBkYXRhLWZlYXR1cmU9Iltbc2VxZmVhdC5uYW1lXV0iIGRhdGEtc2VxLW51bT0iW1tzZXFOdW1iZXJdXSIgb24tY2xpY2s9ImFkZFZhbHVlIiBjbGFzcz0iZmVhdHVyZS1kaWFsb2ctYnV0dG9uIj4KICAgICAgICAgICAgICAgICAgICBBZGQgZmVhdHVyZSB2YWx1ZQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIG9uLWNsaWNrPSJvcGVuQWRkRmVhdHVyZURpYWxvZyIgaWNvbj0iYWRkIiB0aXRsZT0iQWRkIGZlYXR1cmUiIGNsYXNzJD0iW1tnZXRBZGRWYWx1ZUJ1dHRvbkNsYXNzKHJlYWRvbmx5KV1dIj4KICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgogICAgPHBhcGVyLWljb24tYnV0dG9uIGlkPSJkZWxldGV2YWx1ZSIgaWNvbj0iZGVsZXRlIiBjbGFzcyQ9IltbZ2V0RGVsZXRlVmFsdWVCdXR0b25DbGFzcyhyZWFkb25seSwgc2hvd0RlbGV0ZVZhbHVlQnV0dG9uKV1dIiBkYXRhLWZlYXR1cmU9IltbZm9jdXNlZEZlYXR1cmVOYW1lXV0iIGRhdGEtaW5kZXg9IltbZm9jdXNlZEZlYXR1cmVWYWx1ZUluZGV4XV0iIGRhdGEtc2VxLW51bT0iW1tmb2N1c2VkU2VxTnVtYmVyXV0iIG9uLWNsaWNrPSJkZWxldGVWYWx1ZSIgdGl0bGU9IkRlbGV0ZSB2YWx1ZSI+CiAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgPHBhcGVyLWRpYWxvZyBpZD0iYWRkRmVhdHVyZURpYWxvZyI+CiAgICAgIDxoMj5BZGQgRmVhdHVyZTwvaDI+CiAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iRmVhdHVyZSBuYW1lIiB2YWx1ZT0ie3tuZXdGZWF0dXJlTmFtZX19Ij48L3BhcGVyLWlucHV0PgogICAgICA8cGFwZXItcmFkaW8tZ3JvdXAgc2VsZWN0ZWQ9Int7bmV3RmVhdHVyZVR5cGV9fSI+CiAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJpbnQiPkludDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iZmxvYXQiPkZsb2F0PC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJieXRlcyI+Qnl0ZXM8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgPHBhcGVyLWJ1dHRvbiBkaWFsb2ctZGlzbWlzcyBjbGFzcz0iY29udHJvbC1idXR0b24iIG9uLWNsaWNrPSJhZGRGZWF0dXJlIiBkaXNhYmxlZD0iW1shc2hvdWxkRW5hYmxlQWRkRmVhdHVyZShuZXdGZWF0dXJlTmFtZSldXSI+CiAgICAgICAgQ3JlYXRlCiAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgPC9wYXBlci1kaWFsb2c+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1pbnRlcmFjdGl2ZS1pbmZlcmVuY2UtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaWQ9ImxpbnRlci1wYXBlci1idXR0b24tc3R5bGUiPgogICAgICAvKioKICAgICAgICogVGhpcyBzdHlsZSBwcmVzZXJ2ZXMgdGhlIHN0eWxpbmcgcHJldmlvdXMgdG8KICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL1BvbHltZXJFbGVtZW50cy9wYXBlci1idXR0b24vcHVsbC8xMTUKICAgICAgICogVGhpcyBjaGFuZ2UgY2FuIGJyZWFrIHRoZSBsYXlvdXQgb2YgcGFwZXItYnV0dG9uIGNvbnRlbnQuCiAgICAgICAqIFJlbW92ZSB0aGlzIHN0eWxlIHRvIGFwcGx5IHRoZSBjaGFuZ2UsIG1vcmUgZGV0YWlscyBhdCBiLzcwNTI4MzU2LgogICAgICAgKi8KICAgICAgcGFwZXItYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8nLCAnTm90bycsIHNhbnMtc2VyaWY7CiAgICAgICAgLS1wYXBlci10YWItaW5rOiB2YXIoLS10Yi1vcmFuZ2UtZGFyayk7CiAgICAgICAgLS13aXQtY29sb3ItZ3JheTMwMDogI2RhZGNlMDsKICAgICAgfQoKICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgI2NsYXNzaWZpY2F0aW9uIHsKICAgICAgICB3aWR0aDogNDAlOwogICAgICB9CgogICAgICAuZXhhbXBsZS1ob2xkZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuaW5mZXJlbmNlLXNlY3Rpb24taG9sZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG1hcmdpbi10b3A6IDZweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDZweDsKICAgICAgfQoKICAgICAgLmluZmVyZW5jZS1zZWN0aW9uIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgIH0KCiAgICAgIC5pbmZlcmVuY2Utdmlld2VyIHsKICAgICAgICBtYXgtaGVpZ2h0OiAzNSU7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CgogICAgICAuY29tcGFyZS1pbmZlcmVuY2Utdmlld2VyIHsKICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgfQoKICAgICAgLnRmLW9wdGlvbi1zZWxlY3Rvci0wIC5jb250ZW50LXdyYXBwZXIudGYtb3B0aW9uLXNlbGVjdG9yID4gKiB7CiAgICAgICAgd2lkdGg6IDQwJTsKICAgICAgfQoKICAgICAgcGFwZXItcHJvZ3Jlc3MgewogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtYWN0aXZlLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA2MHB4OwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5wZHBsb3QtcHJvZ3Jlc3MgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAubm9leGFtcGxlcyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNzVweDsKICAgICAgICBsZWZ0OiAzMHB4OwogICAgICB9CgogICAgICAuY2VudGVyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5pbmZvLXRleHQgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4yNXB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1hcmdpbjogMTJweCBhdXRvOwogICAgICB9CgogICAgICAucGQtaW5mby10ZXh0IHsKICAgICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgICAgY29sb3I6ICMzYzQwNDM7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgICAgcGFkZGluZy10b3A6IDEycHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogNHB4OwogICAgICAgIHBhZGRpbmctbGVmdDogMTJweDsKICAgICAgfQoKICAgICAgLnBkLW5vLWZlYXR1cmVzLXRleHQgewogICAgICAgIGZvbnQtc2l6ZTogMThweDsKICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgICBwYWRkaW5nOiAxMnB4IDQ4cHg7CiAgICAgIH0KCiAgICAgIC5hY2NlcHQtYnV0dG9uLWhvbGRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgIH0KCiAgICAgIC5zZXR0aW5ncy1idXR0b24gewogICAgICAgIG1hcmdpbi10b3A6IDRweDsKICAgICAgfQoKICAgICAgLmRhdGFwb2ludC1yaWdodC1jb250cm9scy1ob2xkZXIgLmNvbnRyb2wgewogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICB9CgogICAgICAuYnV0dG9uIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgMCAwOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLmJ1dHRvbltkaXNhYmxlZF0gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNjY2M7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1hbmQtdG9vbHRpcCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmxhYmVsLXZvY2FiLXBhdGgtaW5wdXQgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQoKICAgICAgLnRocmVzaG9sZC1kcm9wZG93biB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogMTZweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgY29sb3I6ICMzYzQwNDM7CiAgICAgICAgfQogICAgICB9CgogICAgICAuc2hvcnQtZHJvcGRvd24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMTAwcHg7CiAgICAgICAgbWluLXdpZHRoOiA1MHB4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDVweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgY29sb3I6ICMzYzQwNDM7CiAgICAgICAgfQogICAgICB9CgogICAgICAuc2xpZGVyLWxhYmVsIHsKICAgICAgICBtYXJnaW4tdG9wOiA4cHg7CiAgICAgIH0KCiAgICAgIC5mYWNldC1sYWJlbCB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItdW5kZXJsaW5lOiB7CiAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5zbGlkZXIgewogICAgICAgIHdpZHRoOiAyODBweDsKICAgICAgICAtLXBhcGVyLXNsaWRlci1pbnB1dDogewogICAgICAgICAgd2lkdGg6IDgwcHg7CiAgICAgICAgfQogICAgICB9CgogICAgICAuc2xpZGVyLW1vZGVsLW9uZSB7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogIzEyYjVjZTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3I6ICMxMmI1Y2U7CiAgICAgIH0KCiAgICAgIC5zbGlkZXItbW9kZWwtdHdvIHsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiAjZmE3ODE3OwogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogI2ZhNzgxNzsKICAgICAgfQoKICAgICAgcGFwZXItZGlhbG9nLmluZmVyZW5jZS1zZXR0aW5ncyB7CiAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgICB3aWR0aDogNDAlOwogICAgICAgIG1heC13aWR0aDogNDAlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgfQoKICAgICAgLmRhc2hib2FyZC1sYXlvdXQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAuY2VudGVyIHsKICAgICAgICB3aWR0aDogNjAlOwogICAgICB9CgogICAgICAuc2lkZS1ob2xkZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogNDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIC5zaWRlLWNvbnRlbnQgewogICAgICAgIHBhZGRpbmctbGVmdDogNXB4OwogICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgLSAxMHB4KTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIH0KCiAgICAgIC5zaWRlLXRhYnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA1MHB4KTsKICAgICAgfQoKICAgICAgLmRhdGFwb2ludC10YWIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgIC5jb25maWctdGFiIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAuY29uZmlnLXNpZGUtY29udGVudCB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiA1cHg7CiAgICAgICAgd2lkdGg6IDMwJTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgfQoKICAgICAgLmNvbmZpZy1tYWluLWNvbnRlbnQgewogICAgICAgIHdpZHRoOiA3MCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGJhY2tncm91bmQ6ICNmOGY5ZmE7CiAgICAgIH0KCiAgICAgIC5zdGF0cy10YWIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgIC5wZC10YWIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHBhZGRpbmc6IDVweCAxMHB4OwogICAgICB9CgogICAgICAucGQtcGxvdHMtaGVhZGVyIHsKICAgICAgICBoZWlnaHQ6IDUycHg7CiAgICAgICAgbWluLWhlaWdodDogNTJweDsKICAgICAgICBtYXgtaGVpZ2h0OiA1MnB4OwogICAgICAgIGJvcmRlci1ib3R0b206IHNvbGlkIDJweCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5wZHBsb3RzLWhvbGRlciB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIG92ZXJmbG93LXk6IG92ZXJsYXk7CiAgICAgICAgYmFja2dyb3VuZDogI2Y4ZjlmYTsKICAgICAgfQoKICAgICAgLnBkLXJhbmdlLWh5cGhlbiB7CiAgICAgICAgcGFkZGluZy1yaWdodDogNnB4OwogICAgICAgIHBhZGRpbmctdG9wOiA4cHg7CiAgICAgIH0KCiAgICAgIC5wZC1yYW5nZS1jb250cm9sIHsKICAgICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggI2ZjYzkzNDsKICAgICAgICBib3JkZXItdG9wOiBub25lOwogICAgICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgICAgIGJvcmRlci1yaWdodDogbm9uZTsKICAgICAgICBoZWlnaHQ6IDM2cHg7CiAgICAgICAgd2lkdGg6IDEwNHB4OwogICAgICAgIG1hcmdpbi1yaWdodDogNnB4OwogICAgICB9CgogICAgICAjb3ZlcnZpZXcgewogICAgICAgIG1heC1oZWlnaHQ6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAuaW5mZXJlbmNlLWhlYWRlci5oZWFkaW5nIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZTRmN2ZiOwogICAgICB9CgogICAgICAucmlnaHQtc2lkZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgLnJpZ2h0LXNpZGUtcGVyZm9ybWFuY2UtdGFiIHsKICAgICAgICBtYXJnaW46IDRweDsKICAgICAgfQoKICAgICAgdGYtY29uZnVzaW9uLW1hdHJpeCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIC5kYXRhcG9pbnQtY29udHJvbHMtaG9sZGVyLmRhdGFwb2ludC1jb250cm9sLWJ1dHRvbnMtaG9sZGVyIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgfQoKICAgICAgLmRhdGFwb2ludC1jb250cm9scy1ob2xkZXIuZGF0YXBvaW50LWNvbnRyb2wtc2VhcmNoLWhvbGRlciB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAxMHB4OwogICAgICB9CgogICAgICAuZGF0YXBvaW50LWNvbnRyb2xzLWhvbGRlciB7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgbWFyZ2luLWxlZnQ6IDFweDsKICAgICAgfQoKICAgICAgLmRhdGFwb2ludC1sZWZ0LWNvbnRyb2xzLWhvbGRlciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KCiAgICAgIC5kYXRhcG9pbnQtcmlnaHQtY29udHJvbHMtaG9sZGVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAudGYtY2F0ZWdvcnktcGFuZSB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CgogICAgICAudGYtY2F0ZWdvcnktcGFuZS1jb250ZW50IHsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0td2l0LWNvbG9yLWdyYXkzMDApOwogICAgICAgIGJvcmRlci10b3A6IG5vbmU7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMnB4OwogICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAycHg7CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgIH0KCiAgICAgIDpob3N0IHZ6LWxpbmUtY2hhcnQyIHsKICAgICAgICBtYXJnaW46IDEycHggMTJweCAxMnB4IDI0cHg7CiAgICAgICAgaGVpZ2h0OiAxODBweDsKICAgICAgICB3aWR0aDogMzAwcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICA6aG9zdCB2ei1iYXItY2hhcnQgewogICAgICAgIG1hcmdpbjogMTJweCAxMnB4IDEycHggMjRweDsKICAgICAgICBoZWlnaHQ6IDI0MHB4OwogICAgICAgIHdpZHRoOiA0NTBweDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIC5wZC1pbnB1dC1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBwYWRkaW5nOiAxMnB4IDQ4cHggMjRweCAyNHB4OwogICAgICAgIGJhY2tncm91bmQ6ICNmZWY3ZTA7CiAgICAgICAgYm9yZGVyOiBzb2xpZCAxcHggI2ZkZTI5MzsKICAgICAgfQoKICAgICAgLnN0eWxlLWlucHV0IHsKICAgICAgICB3aWR0aDogNTBweDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLmZlYXR1cmUtY29udGFpbmVyLWhvbGRlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgLmRhdGFwb2ludC1jb250cm9sLWZpbHRlci1pbnB1dCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIG1heC13aWR0aDogNjAlOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyOiB7CiAgICAgICAgICBwYWRkaW5nOiA0cHggNnB4IDJweCA0cHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGNvbG9yOiAjODA4NjhiOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLmRhdGFwb2ludC1jb250cm9sLWZpbHRlci1pbnB1dCBpcm9uLWljb24gewogICAgICAgIGNvbG9yOiAjOWJhMGE2OwogICAgICB9CgogICAgICAuZmVhdHVyZS1zZWFyY2gtaW5wdXQgewogICAgICAgIHBhZGRpbmctdG9wOiAzcHg7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIG1heC13aWR0aDogMTUwcHg7CiAgICAgIH0KCiAgICAgIC5udW0tYnVja2V0cy1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDQ1cHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA4cHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0td2l0LWNvbG9yLWdyYXkzMDApOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1vcmFuZ2UtZGFyayk7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgbWFyZ2luOiA1cHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLWJ1dHRvbltkaXNhYmxlZF0gewogICAgICAgIGNvbG9yOiAjNWY2MzY4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmNGY0ZjQ7CiAgICAgIH0KCiAgICAgIC5tYWluLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLWRhcmspOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXRiLW9yYW5nZS1kYXJrKTsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgbWFyZ2luOiA1cHg7CiAgICAgIH0KCiAgICAgIC5tYWluLWJ1dHRvbltkaXNhYmxlZF0gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JheTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBsaWdodGdyYXk7CiAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgIH0KCiAgICAgIC5vcHRpbWl6ZS10aHJlc2hvbGQtYnV0dG9uIHsKICAgICAgICBtYXJnaW46IDVweCAwOwogICAgICAgIHdpZHRoOiAxNTBweDsKICAgICAgICBtaW4td2lkdGg6IDE1MHB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTZweDsKICAgICAgfQoKICAgICAgLmNsb3NlLXBhcnRpYWwtZGVwcy1idXR0b24gewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgfQoKICAgICAgcGFwZXItdGFicyB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAtLXBhcGVyLXRhYnMtc2VsZWN0aW9uLWJhci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLWRhcmspOwogICAgICB9CgogICAgICBwYXBlci10YWIgewogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIHBhZGRpbmc6IDAgMjRweDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4xcHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXRhYjpub3QoLmlyb24tc2VsZWN0ZWQpIHsKICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgfQoKICAgICAgcGFwZXItdGFiLmlyb24tc2VsZWN0ZWQgewogICAgICAgIGNvbG9yOiAjMjAyMTI0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC5wZXJmcy1ob2xkZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIG1hcmdpbjogNHB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLnBlcmYtaG9sZGVyIHsKICAgICAgICBtYXJnaW46IDhweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5wZXJmLWN1cnZlLXgtbGFiZWwgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3R0b206IDJweDsKICAgICAgICBsZWZ0OiAxMzhweDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY29sb3I6ICM1ZjYzNjg7CiAgICAgICAgcGFkZGluZzogMHB4OwogICAgICAgIHdpZHRoOiAxMjBweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5wZXJmLWN1cnZlLXktbGFiZWwgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OiA0NHB4OwogICAgICAgIGJvdHRvbTogNTRweDsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgYm90dG9tOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBjb2xvcjogIzVmNjM2ODsKICAgICAgICB3aWR0aDogMTIwcHg7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAuZmxleCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLnNwYWNlLWJldHdlZW4gewogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQoKICAgICAgLmZsZXgtd3JhcCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KCiAgICAgIC5vcHRpbWl6ZS10ZXh0IHsKICAgICAgICBtYXJnaW46IDVweCAwOwogICAgICAgIGNvbG9yOiBncmV5OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQoKICAgICAgLnRocmVzaG9sZC1jb3N0LWlucHV0IHsKICAgICAgICB3aWR0aDogMTUwcHg7CiAgICAgICAgbWluLXdpZHRoOiAxNTBweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDE2cHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGNvbG9yOiAjM2M0MDQzOwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgY29sb3I6ICM4MDg2OGI7CiAgICAgICAgfQogICAgICB9CgogICAgICAuYm9sZCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQoKICAgICAgLmluZGVudCB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5mZWF0dXJlLWJyZWFrZG93biB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEycHg7CiAgICAgIH0KCiAgICAgIC5vcHRpbWl6ZS1zZWxlY3Rpb24tYnV0dG9uIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KCiAgICAgIC5yZWctdGFibGUtY2F0ZWdvcnkgewogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIC5yZWctdGFibGUtdmFsdWUgewogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CgogICAgICAuc3ViZmVhdHVyZS10YWJsZSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgIH0KCiAgICAgIC5jb3VudGVyZmFjdHVhbC1idXR0b24taW50cm8gewogICAgICAgIHBhZGRpbmc6IDdweCAwIDAgMTBweDsKICAgICAgfQoKICAgICAgLm1haW4tdmVydGljYWwgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAubWFpbi1ib3R0b20tYmFyIHsKICAgICAgICBoZWlnaHQ6IDUycHg7CiAgICAgICAgbWluLWhlaWdodDogNTJweDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAvKiBib3gtc2hhZG93OiAwIDJweCA1cHggZ3JleTsKICAgICAgICBtYXJnaW4tYm90dG9tOiAzcHg7ICovCiAgICAgICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4ICNkYWRjZTA7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9CgogICAgICAubWFpbi1jb250ZW50IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5kaXN0LXN3aXRjaCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CgogICAgICAuZGlzdGFuY2UtdmlzLWRyb3Bkb3duIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CgogICAgICAjZGlzdGFuY2VkaWFsb2cgewogICAgICAgIHdpZHRoOiAzMCU7CiAgICAgIH0KCiAgICAgICNkaXN0YW5jZWRpYWxvZyAuYnV0dG9ucyB7CiAgICAgICAgY29sb3I6ICNmNTdjMDA7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGNvbG9yOiAjM2M0MDQzOwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtY29sb3I6ICMzYzQwNDM7CiAgICAgICAgLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWluay1jb2xvcjogIzNjNDA0MzsKICAgICAgICAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1jaGVja2VkLWNvbG9yOiAjM2M0MDQzOwogICAgICAgIC0tcGFwZXItcmFkaW8tYnV0dG9uLWNoZWNrZWQtaW5rLWNvbG9yOiAjM2M0MDQzOwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgY29sb3I6ICM1ZjYzNjg7CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uW2Rpc2FibGVkXSB7CiAgICAgICAgY29sb3I6ICM5YWEwYTY7CiAgICAgIH0KCiAgICAgIC5yZXNpemVyIHsKICAgICAgICBkaXNwbGF5OiB0YWJsZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDhweDsKICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAuZXhhbXBsZS1zdGF0dXMgewogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBjb2xvcjogIzVmNjM2ODsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgcGFkZGluZy10b3A6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5leGFtcGxlLWlkLWxhYmVsIHsKICAgICAgICBwYWRkaW5nOiA5cHggNXB4IDlweCAwOwogICAgICB9CgogICAgICAuZXhhbXBsZS1pZC1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDcwcHg7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgfQoKICAgICAgLmhlYWRpbmctYW5kLWNhcmQgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGxpZ2h0Z3JheTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgICAgcGFkZGluZy10b3A6IDFweDsKICAgICAgfQoKICAgICAgLmVkaXRvci1oZWFkaW5nLWFuZC1jYXJkIHsKICAgICAgICBmbGV4OiAxOwogICAgICAgIG92ZXJmbG93LXk6IG92ZXJsYXk7CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nIHsKICAgICAgICBjb2xvcjogIzVmNjM2ODsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogMTBweCA4cHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZlZjdlMDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0td2l0LWNvbG9yLWdyYXkzMDApOwogICAgICAgIGJvcmRlci10b3A6IG5vbmU7CiAgICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiBub25lOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQoKICAgICAgLmNhcmQgewogICAgICAgIHBhZGRpbmc6IDAgMTBweCA1cHg7CiAgICAgIH0KCiAgICAgIC5uby1wYWRkaW5nLWNhcmQgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC50b29sdGlwIHsKICAgICAgICAtLXBhcGVyLXRvb2x0aXA6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci10b29sdGlwLWRlbGF5LW91dDogMjAwMG1zOwogICAgICB9CgogICAgICAuY29tbWVudC1pY29uIHsKICAgICAgICB3aWR0aDogMzBweDsKICAgICAgICBoZWlnaHQ6IDMwcHg7CiAgICAgICAgbWluLXdpZHRoOiAzMHB4OwogICAgICAgIG1pbi1oZWlnaHQ6IDMwcHg7CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgICBjb2xvcjogdmFyKC0tdGItb3JhbmdlLWRhcmspOwogICAgICB9CgogICAgICAuYXJyb3ctaWNvbiB7CiAgICAgICAgd2lkdGg6IDUwcHg7CiAgICAgICAgaGVpZ2h0OiA1MHB4OwogICAgICAgIG1pbi13aWR0aDogNTBweDsKICAgICAgICBtaW4taGVpZ2h0OiA1MHB4OwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1vcmFuZ2UtZGFyayk7CiAgICAgIH0KCiAgICAgIC5wZC1hcnJvdy1pY29uIHsKICAgICAgICB3aWR0aDogNDBweDsKICAgICAgICBoZWlnaHQ6IDQwcHg7CiAgICAgICAgbWluLXdpZHRoOiA0MHB4OwogICAgICAgIG1pbi1oZWlnaHQ6IDQwcHg7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICAgIGNvbG9yOiBncmV5OwogICAgICB9CgogICAgICAucGQtdG9nZ2xlIHsKICAgICAgICBtYXJnaW46IDAgOHB4IDAgMjBweDsKICAgICAgfQoKICAgICAgLnBkLWVudHJ5LWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQoKICAgICAgLmluZm8taWNvbiB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIG1pbi13aWR0aDogMjBweDsKICAgICAgICBtaW4taGVpZ2h0OiAyMHB4OwogICAgICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICAgICAgY29sb3I6IGdyZXk7CiAgICAgIH0KCiAgICAgIC5pbmZvLWljb24uY2YtaW5mby1pY29uIHsKICAgICAgICBtYXJnaW4tdG9wOiAxMnB4OwogICAgICB9CgogICAgICAuaW5mby1pY29uLnRocmVzaC1pbmZvLWljb24gewogICAgICAgIG1hcmdpbi10b3A6IC0zcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQoKICAgICAgLmluZm8taWNvbi5wZC1pbmZvLWljb24gewogICAgICAgIG1hcmdpbi10b3A6IDE1cHg7CiAgICAgIH0KCiAgICAgIC5pbmZvLWljb24udGhyZXNob2xkLWluZm8taWNvbiB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiA1cHg7CiAgICAgIH0KCiAgICAgIC5pbmZvLWljb24ucGVyZm9ybWFuY2UtaW5mby1pY29uIHsKICAgICAgICBtYXJnaW4tdG9wOiAxOHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDVweDsKICAgICAgfQoKICAgICAgLm5vLXBhZGRpbmcgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5yZXNpemUtaWNvbiB7CiAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICAgIGNvbG9yOiBncmV5OwogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICAgIGhlaWdodDogMTBweDsKICAgICAgICBtaW4td2lkdGg6IDEwcHg7CiAgICAgICAgbWluLWhlaWdodDogMTBweDsKICAgICAgfQoKICAgICAgLmhlbHAtdGV4dCB7CiAgICAgICAgY29sb3I6ICM1ZjYzNjg7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1heC13aWR0aDogMjAwcHg7CiAgICAgIH0KCiAgICAgIC5oZWxwLXRpdGxlIHsKICAgICAgICBjb2xvcjogIzAwN2I3YzsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICB9CgogICAgICAuaGVscC10aXRsZS1tYXJnaW4gewogICAgICAgIG1hcmdpbi10b3A6IDE0cHg7CiAgICAgIH0KCiAgICAgIC5oZWxwLXRpdGxlLW1hcmdpbi1idXR0b24gewogICAgICAgIG1hcmdpbi10b3A6IDRweDsKICAgICAgfQoKICAgICAgLmhlbHAtdGl0bGUtbWFyZ2luLXRpdGxlIHsKICAgICAgICBtYXJnaW4tdG9wOiA3cHg7CiAgICAgIH0KCiAgICAgIC5kaWFsb2ctbGluayB7CiAgICAgICAgY29sb3I6ICM1ZjYzNjg7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5wZXJmLWN1cnZlLXRleHQgewogICAgICAgIGNvbG9yOiAjM2M0MDQzOwogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBtYXJnaW4tbGVmdDogNDRweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAtMTBweDsKICAgICAgfQoKICAgICAgLmNvbmYtdGV4dCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgICAgIGNvbG9yOiAjM2M0MDQzOwogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgfQoKICAgICAgLmRpYWxvZy10ZXh0IHsKICAgICAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQoKICAgICAgLmRpYWxvZy10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC50aXRsZS13aWR0aCB7CiAgICAgICAgd2lkdGg6IDI1MHB4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDE2cHg7CiAgICAgIH0KCiAgICAgIC5kYXRhcG9pbnQtaW5mby1ob2xkZXIgewogICAgICAgIG1hcmdpbjogMjRweCBhdXRvOwogICAgICAgIG1heC13aWR0aDogMzgwcHg7CiAgICAgICAgcGFkZGluZzogMjRweDsKICAgICAgfQoKICAgICAgLm9uYm9hcmRpbmctaGVhZGVyIHsKICAgICAgICBjb2xvcjogIzIwMjEyNDsKICAgICAgICBmb250LXNpemU6IDIycHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjhweDsKICAgICAgfQoKICAgICAgLm9uYm9hcmRpbmctdGV4dCB7CiAgICAgICAgY29sb3I6ICMzYzQwNDM7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLWluZm8taGVhZGVyIHsKICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLWluZm8tdGV4dCB7CiAgICAgICAgY29sb3I6ICMzYzQwNDM7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgICAgbWF4LXdpZHRoOiA0NjBweDsKICAgICAgfQoKICAgICAgLmJ1dHRvbi1wcmVmaXgtbGFiZWwgewogICAgICAgIG1hcmdpbjogMTJweCAwIDAgMTJweDsKICAgICAgICBjb2xvcjogZ3JleTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KCiAgICAgIC5ib3JkZXItcmlnaHQgewogICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgfQoKICAgICAgcGFwZXItZGlhbG9nIHsKICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgICAgIG1heC13aWR0aDogNjAwcHg7CiAgICAgIH0KCiAgICAgIC5tYWluLWJ1dHRvbi5ydW4tYnV0dG9uIHsKICAgICAgICBwYWRkaW5nOiA1cHg7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CgogICAgICAuZG9jLWltYWdlIHsKICAgICAgICB3aWR0aDogMTI4cHg7CiAgICAgICAgaGVpZ2h0OiA5NnB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgfQoKICAgICAgLmNvbnRyb2wtZGl2aWRlciB7CiAgICAgICAgbWFyZ2luOiA1cHggMCA1cHggNXB4OwogICAgICAgIHdpZHRoOiA1cHg7CiAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgIH0KCiAgICAgIC5vcHRpbWl6YXRpb24tcmFkaW8gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDdweDsKICAgICAgfQoKICAgICAgLm9wdGltaXphdGlvbi1yYWRpby1ncm91cCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgLmluZmVyLWluZm8gewogICAgICAgIG1hcmdpbi1sZWZ0OiAzMHB4OwogICAgICB9CgogICAgICAuc2Nyb2xsLXggewogICAgICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICAgIH0KCiAgICAgIC5wZXJmLXRhYmxlLWNsaWNrYWJsZSB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAucGVyZi10YWJsZS10aXRsZS1yb3cgewogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgICBtaW4taGVpZ2h0OiA1MnB4OwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQogICAgICAucGVyZi10YWJsZS10aXRsZSB7CiAgICAgICAgY29sb3I6ICMzYzQwNDM7CiAgICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiAxNHB4OwogICAgICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgICAgIH0KICAgICAgLnBlcmYtdGFibGUtc29ydC1tZW51IHsKICAgICAgICBtYXJnaW4tdG9wOiAtMTBweDsKICAgICAgfQogICAgICAucGVyZi10YWJsZS1oZWFkZXIgewogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgY29sb3I6ICM4MDg2OGI7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxNnB4OwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjI1OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgICBtaW4taGVpZ2h0OiBtaW4tY29udGVudDsKICAgICAgICBwYWRkaW5nLXRvcDogMTJweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogNHB4OwogICAgICB9CgogICAgICAucGVyZi10YWJsZS1lbnRyaWVzLWhvbGRlciB7CiAgICAgICAgb3ZlcmZsb3cteTogb3ZlcmxheTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KCiAgICAgIC5wZXJmLXRhYmxlLWVudHJ5IHsKICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgICAgICBjb2xvcjogIzNjNDA0MzsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogc29saWQgMXB4IHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgfQoKICAgICAgLnBlcmYtdGFibGUtZW50cnkucGVyZi10YWJsZS1lbnRyeS10cml2aWFsIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZjRmNGY0OwogICAgICB9CgogICAgICAucGVyZi10YWJsZS1lbnRyeS1leHBhbmRlZCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgbWFyZ2luOiAwIDEycHg7CiAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXdpdC1jb2xvci1ncmF5MzAwKTsKICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgIH0KCiAgICAgIC5wZXJmLXRhYmxlLXJvdyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5wZXJmLXRhYmxlLXJvdy1leHBhbmRlZCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0td2l0LWNvbG9yLWdyYXkzMDApOwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS13aXQtY29sb3ItZ3JheTMwMCk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDJweCAwIHJnYmEoNjAsIDY0LCA2NywgMC4zKSwKICAgICAgICAgIDAgMXB4IDNweCAxcHggcmdiYSg2MCwgNjQsIDY3LCAwLjE1KTsKICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5wZXJmLXRhYmxlLXRleHQtZW50cnkgewogICAgICAgIGhlaWdodDogNDBweDsKICAgICAgICBwYWRkaW5nLXRvcDogMTZweDsKICAgICAgfQogICAgICAucGVyZi10YWJsZS1udW0tZW50cnkgewogICAgICAgIGhlaWdodDogNDBweDsKICAgICAgICBwYWRkaW5nLXRvcDogMTZweDsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQogICAgICAucGVyZi10YWJsZS1hcnJvdyB7CiAgICAgICAgbWluLXdpZHRoOiA0MHB4OwogICAgICAgIHdpZHRoOiA0MHB4OwogICAgICAgIG1hcmdpbi10b3A6IDhweDsKICAgICAgfQogICAgICAucGVyZi10YWJsZS12YWwgewogICAgICAgIHdpZHRoOiAzMCU7CiAgICAgIH0KICAgICAgLnBlcmYtdGFibGUtY291bnQgewogICAgICAgIHdpZHRoOiAxMCU7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyMHB4OwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CiAgICAgIC5wZXJmLXRhYmxlLW1vZGVsIHsKICAgICAgICBtaW4td2lkdGg6IDEwMHB4OwogICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgfQogICAgICAucGVyZi10YWJsZS1tb2RlbC1zaW5nbGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLnBlcmYtdGFibGUtdGhyZXNob2xkIHsKICAgICAgICB3aWR0aDogMjgwcHg7CiAgICAgICAgbWluLXdpZHRoOiAyODBweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnBlcmYtdGFibGUtZXJyb3IgewogICAgICAgIHdpZHRoOiAxNSU7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KICAgICAgLnBlcmYtdGFibGUtc3EtZXJyb3IgewogICAgICAgIHdpZHRoOiAxNSU7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyMHB4OwogICAgICB9CiAgICAgIC5wZXJmLXRhYmxlLWZwIHsKICAgICAgICB3aWR0aDogMTUlOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CiAgICAgIC5wZXJmLXRhYmxlLWZuIHsKICAgICAgICB3aWR0aDogMTUlOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CiAgICAgIC5wZXJmLXRhYmxlLWFjYyB7CiAgICAgICAgd2lkdGg6IDE1JTsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7CiAgICAgIH0KICAgICAgLnBlcmYtdGFibGUtZjEgewogICAgICAgIHdpZHRoOiAxMCU7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyMHB4OwogICAgICB9CiAgICAgIC5wZXJmLWJ1dHRvbiB7CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgfQoKICAgICAgLnBlcmYtc29ydC1ib3ggewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICB9CiAgICAgIC5jb3VudGVyZmFjdHVhbC10b2dnbGUgewogICAgICAgIG1hcmdpbjogNHB4IDRweCA0cHggNnB4OwogICAgICAgIHBhZGRpbmctdG9wOiA0cHg7CiAgICAgICAgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYmFyLWNvbG9yOiAjODFjOTk1OwogICAgICB9CiAgICAgIC5jb3VudGVyZmFjdHVhbC1kZWx0YSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDZweDsKICAgICAgfQogICAgICAuY291bnRlcmZhY3R1YWwtZGVsdGEgbGFiZWwgewogICAgICAgIHBhZGRpbmctdG9wOiAxMnB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiA4cHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA0cHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGNvbG9yOiByZ2IoNjAsIDY0LCA2Nyk7CiAgICAgIH0KICAgICAgLmNvdW50ZXJmYWN0dWFsLWRlbHRhIHBhcGVyLXNsaWRlciB7CiAgICAgICAgaGVpZ2h0OiA0MHB4OwogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogIzgxYzk5NTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiAjODFjOTk1OwogICAgICAgIC0tcGFwZXItc2xpZGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgY29sb3I6IHJnYig2MCwgNjQsIDY3KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLmRhdGFwb2ludC1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjAyMTI0OwogICAgICAgIGJhY2tncm91bmQ6ICNmZGUyOTM7CiAgICAgIH0KICAgICAgLmluZmVyLWJ1dHRvbiB7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgIGJhY2tncm91bmQ6ICMxMjhlYWY7CiAgICAgIH0KICAgICAgLmZsZXgtZ3JvdyB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICAgIC5mbGV4LXJvdy1yZXZlcnNlIHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgIH0KICAgICAgLnRocmVzaG9sZC1pbmZvLWhvbGRlciB7CiAgICAgICAgbWFyZ2luLXRvcDogLTJweDsKICAgICAgfQogICAgICAudGFicyB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAzMnB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICB9CiAgICAgIC5yb3RhdGVkLWljb24gewogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7CiAgICAgIH0KICAgICAgLmRhdGFwb2ludC1jb250cm9sLWJ1dHRvbiB7CiAgICAgICAgd2lkdGg6IDI4cHg7CiAgICAgICAgaGVpZ2h0OiAyOHB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgIH0KICAgICAgLnBkLWhvbGRlciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAzMDBweDsKICAgICAgfQogICAgICAucGQteS1sYWJlbCB7CiAgICAgICAgY29sb3I6ICM1ZjYzNjg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGxlZnQ6IC0yMHB4OwogICAgICAgIHBhZGRpbmc6IDBweDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA4MHB4OwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7CiAgICAgIH0KICAgICAgLnBkLXgtbGFiZWwgewogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBjb2xvcjogIzVmNjM2ODsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBwYWRkaW5nOiAwIDAgMCA0MHB4OwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQogICAgICBwYXBlci10b2dnbGUtYnV0dG9uIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYnV0dG9uLWNvbG9yOiB3aGl0ZTsKICAgICAgICAtLXBhcGVyLXRvZ2dsZS1idXR0b24tbGFiZWwtY29sb3I6ICMzYzQwNDM7CiAgICAgIH0KICAgICAgLmJ1dHRvbi1hbmQtcHJvZ3Jlc3MtaG9sZGVyIHsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIC5zb3J0LXByb2dyZXNzIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA4cHg7CiAgICAgICAgbGVmdDogN3B4OwogICAgICAgIHdpZHRoOiAyMjBweDsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWFjdGl2ZS1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgIH0KICAgICAgI2F0dHJpYnV0aW9uTGVnZW5kIHsKICAgICAgICB3aWR0aDogMTYwcHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIG1hcmdpbi10b3A6IDhweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDhweDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDx0Zi1wbHVnaW4tZGlhbG9nIGlkPSJpbml0aWFsRGlhbG9nIj48L3RmLXBsdWdpbi1kaWFsb2c+CiAgICA8cGFwZXItZGlhbG9nIGlkPSJpbmZlcmVuY2VzZXR0aW5ncyIgY2xhc3M9ImluZmVyZW5jZS1zZXR0aW5ncyIgb3BlbmVkPSJbWyFsb2NhbF1dIj4KICAgICAgPHRmLWluZmVyZW5jZS1wYW5lbCBpbmZlcmVuY2UtYWRkcmVzcz0ie3tpbmZlcmVuY2VBZGRyZXNzfX0iIG1vZGVsLW5hbWU9Int7bW9kZWxOYW1lfX0iIGV4YW1wbGVzLXBhdGg9Int7ZXhhbXBsZXNQYXRofX0iIG1vZGVsLXR5cGU9Int7bW9kZWxUeXBlfX0iIG1vZGVsLXZlcnNpb249Int7bW9kZWxWZXJzaW9ufX0iIG1vZGVsLXNpZ25hdHVyZT0ie3ttb2RlbFNpZ25hdHVyZX19IiBtYXgtZXhhbXBsZXM9Int7bWF4RXhhbXBsZXN9fSIgbGFiZWwtdm9jYWItcGF0aD0ie3tsYWJlbFZvY2FiUGF0aH19IiBtdWx0aS1jbGFzcz0ie3ttdWx0aUNsYXNzfX0iIHNhbXBsaW5nLW9kZHM9Int7c2FtcGxpbmdPZGRzfX0iIHNlcXVlbmNlLWV4YW1wbGVzPSJ7e3NlcXVlbmNlRXhhbXBsZXN9fSIgbWF4LWNsYXNzZXMtdG8tZGlzcGxheT0ie3ttYXhJbmZlcmVuY2VFbnRyaWVzUGVyUnVufX0iIHVzZS1wcmVkaWN0LWFwaT0ie3t1c2VQcmVkaWN0QXBpfX0iIHByZWRpY3Qtb3V0cHV0LXRlbnNvcj0ie3twcmVkaWN0T3V0cHV0VGVuc29yfX0iIHByZWRpY3QtaW5wdXQtdGVuc29yPSJ7e3ByZWRpY3RJbnB1dFRlbnNvcn19Ij4KICAgICAgPC90Zi1pbmZlcmVuY2UtcGFuZWw+CiAgICAgIDxkaXYgY2xhc3M9ImFjY2VwdC1idXR0b24taG9sZGVyIj4KICAgICAgICA8cGFwZXItYnV0dG9uIG9uLXRhcD0iZ2V0RXhhbXBsZXNBbmRDbG9zZVNldHRpbmdzXyIgY2xhc3M9Im1haW4tYnV0dG9uIiBkaXNhYmxlZCQ9Iltbc2hvdWxkRGlzYWJsZUdldEV4YW1wbGVzQnV0dG9uXyhleGFtcGxlc1BhdGgsIG1heEV4YW1wbGVzKV1dIj4KICAgICAgICAgIEFjY2VwdAogICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgIDxwYXBlci1idXR0b24gZGlhbG9nLWRpc21pc3MgY2xhc3M9ImNvbnRyb2wtYnV0dG9uIj5DYW5jZWw8L3BhcGVyLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxwYXBlci1kaWFsb2cgaWQ9ImRlbGV0ZWRpYWxvZyI+CiAgICAgIDxwPkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhlIHNlbGVjdGVkIGRhdGFwb2ludD8KICAgICAgPGRpdiBjbGFzcz0iYnV0dG9ucyI+CiAgICAgICAgPHBhcGVyLWJ1dHRvbiBkaWFsb2ctZGlzbWlzcyBjbGFzcz0iY29udHJvbC1idXR0b24iPkNhbmNlbDwvcGFwZXItYnV0dG9uPgogICAgICAgIDxwYXBlci1idXR0b24gZGlhbG9nLWNvbmZpcm0gYXV0b2ZvY3VzIG9uLXRhcD0iZGVsZXRlRGF0YXBvaW50XyIgY2xhc3M9Im1haW4tYnV0dG9uIj5EZWxldGU8L3BhcGVyLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxwYXBlci1kaWFsb2cgaWQ9ImRpc3RhbmNlZGlhbG9nIj4KICAgICAgPGgyPlNob3cgc2ltaWxhcml0eSB0byBzZWxlY3RlZCBkYXRhcG9pbnQ8L2gyPgogICAgICA8cGFwZXItaW5wdXQgdmFsdWU9Int7ZmFjZXREaXN0RmVhdHVyZU5hbWV9fSIgbGFiZWw9Ik1ldHJpYyBuYW1lIiBjbGFzcz0iZGF0YXBvaW50LWNvbnRyb2wtZmlsdGVyLWlucHV0Ij4KICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPGRpdiBjbGFzcz0icmFkaW9sYWJlbCI+RGlzdGFuY2UgdHlwZTwvZGl2PgogICAgICA8cGFwZXItcmFkaW8tZ3JvdXAgY2xhc3M9ImRpc3Qtc3dpdGNoIiBzZWxlY3RlZD0ie3tmYWNldERpc3RTd2l0Y2h9fSI+CiAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBjbGFzcz0iZGlzdC1yYWRpbyIgbmFtZT0iTDEiIGRpc2FibGVkJD0iW1tjdXN0b21EaXN0YW5jZUZ1bmN0aW9uU2V0XV0iPkwxPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBjbGFzcz0iZGlzdC1yYWRpbyIgbmFtZT0iTDIiIGRpc2FibGVkJD0iW1tjdXN0b21EaXN0YW5jZUZ1bmN0aW9uU2V0XV0iPkwyPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBjbGFzcz0iZGlzdC1yYWRpbyIgbmFtZT0iQ3VzdG9tIiBoaWRkZW4kPSJbWyFjdXN0b21EaXN0YW5jZUZ1bmN0aW9uU2V0XV0iPlVzZXItc3BlY2lmaWVkPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGxhYmVsPSJBcHBseSB0byBkYXRhcG9pbnRzIHZpc3VhbGl6YXRpb24iIGNsYXNzPSJ0aHJlc2hvbGQtZHJvcGRvd24gZGlzdGFuY2UtdmlzLWRyb3Bkb3duIj4KICAgICAgICA8cGFwZXItbGlzdGJveCBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tmYWNldERpc3RTZXR0aW5nfX0iIGF0dHItZm9yLXNlbGVjdGVkPSJuYW1lIj4KICAgICAgICAgIDxwYXBlci1pdGVtIG5hbWU9ImNvbG9yQnkiPkNvbG9yIEJ5PC9wYXBlci1pdGVtPgogICAgICAgICAgPHBhcGVyLWl0ZW0gbmFtZT0iaG9yaXpvbnRhbEZhY2V0Ij5YLUF4aXMgQmlubmluZzwvcGFwZXItaXRlbT4KICAgICAgICAgIDxwYXBlci1pdGVtIG5hbWU9InZlcnRpY2FsRmFjZXQiPlktQXhpcyBCaW5uaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgPHBhcGVyLWl0ZW0gbmFtZT0iaG9yaXpvbnRhbFBvc2l0aW9uIj5YLUF4aXMgU2NhdHRlcjwvcGFwZXItaXRlbT4KICAgICAgICAgIDxwYXBlci1pdGVtIG5hbWU9InZlcnRpY2FsUG9zaXRpb24iPlktQXhpcyBTY2F0dGVyPC9wYXBlci1pdGVtPgogICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICA8ZGl2IGNsYXNzPSJidXR0b25zIj4KICAgICAgICA8cGFwZXItYnV0dG9uIGRpYWxvZy1kaXNtaXNzIGNsYXNzPSJjb250cm9sLWJ1dHRvbiI+Q2FuY2VsPC9wYXBlci1idXR0b24+CiAgICAgICAgPHBhcGVyLWJ1dHRvbiBkaWFsb2ctY29uZmlybSBhdXRvZm9jdXMgb24tdGFwPSJyZXF1ZXN0QWRkRGlzdGFuY2VNZXRyaWMiIGNsYXNzPSJtYWluLWJ1dHRvbiI+QXBwbHk8L3BhcGVyLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxkaXYgY2xhc3M9ImRhc2hib2FyZC1sYXlvdXQiPgogICAgICA8ZGl2IGNsYXNzPSJtYWluLXZlcnRpY2FsIj4KICAgICAgICA8ZGl2IGNsYXNzPSJtYWluLWNvbnRlbnQiPgogICAgICAgICAgPGRpdiBjbGFzcz0ibWFpbi1ib3R0b20tYmFyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGF0YXBvaW50LWxlZnQtY29udHJvbHMtaG9sZGVyIj4KICAgICAgICAgICAgICA8cGFwZXItdGFicyBjbGFzcz0idGFicyIgbm9pbmsgc2VsZWN0ZWQ9Int7c2lkZVRhYlNlbGVjdGVkfX0iPgogICAgICAgICAgICAgICAgPHBhcGVyLXRhYj5EYXRhcG9pbnQgZWRpdG9yPC9wYXBlci10YWI+CiAgICAgICAgICAgICAgICA8cGFwZXItdGFiPltbZ2V0UGVyZm9ybWFuY2VUYWJUaXRsZShtb2RlbFR5cGUsIG11bHRpQ2xhc3MpXV08L3BhcGVyLXRhYj4KICAgICAgICAgICAgICAgIDxwYXBlci10YWI+RmVhdHVyZXM8L3BhcGVyLXRhYj4KICAgICAgICAgICAgICA8L3BhcGVyLXRhYnM+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhcG9pbnQtcmlnaHQtY29udHJvbHMtaG9sZGVyIj4KICAgICAgICAgICAgICA8YSB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9ImNvbnRyb2wiIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL3RyZWUvbWFzdGVyL3RlbnNvcmJvYXJkL3BsdWdpbnMvaW50ZXJhY3RpdmVfaW5mZXJlbmNlL1JFQURNRS5tZCIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIj4KICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJoZWxwLW91dGxpbmUiIGNsYXNzPSJzZXR0aW5ncy1idXR0b24iIHRpdGxlPSJXaGF0LUlmIFRvb2wgZG9jdW1lbnRhdGlvbiI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InNldHRpbmdzIiBvbi10YXA9InNldHRpbmdzQ2xpY2tlZF8iIGNsYXNzPSJzZXR0aW5ncy1idXR0b24gY29udHJvbCIgdGl0bGU9IldoYXQtSWYgVG9vbCBzZXR0aW5ncyIgZGlzYWJsZWQkPSJbW2xvY2FsXV0iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZXhhbXBsZS1zdGF0dXMiPltbZXhhbXBsZVN0YXR1c1N0cl1dPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8aXJvbi1wYWdlcyBjbGFzcz0ic2lkZS10YWJzIiBzZWxlY3RlZD0ie3tzaWRlVGFiU2VsZWN0ZWR9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRhdGFwb2ludC10YWIiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGUtaG9sZGVyIiBpZD0ic2lkZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWFuZC1jYXJkIj4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJoZWFkaW5nIiBvbi10YXA9InRvZ2dsZUNvbnRleHRUb29scyI+CiAgICAgICAgICAgICAgICAgICAgICBWaXN1YWxpemUKICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJpZ2h0LXNpZGUgcmlnaHQtc2lkZS1wZXJmb3JtYW5jZS10YWIiPgogICAgICAgICAgICAgICAgICAgICAgICA8aXJvbi1pY29uIGljb249IltbZ2V0RXhwYW5kQ29sbGFwc2VJY29uKG9wZW5lZENvbnRleHRUb29scyldXSIgY2xhc3M9ImV4cGFuZC1jb2xsYXBzZS1idXR0b24iPjwvaXJvbi1pY29uPgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2UgY2xhc3M9Im5vLXBhZGRpbmctY2FyZCIgaWQ9ImNvbGxhcHNlY29udGV4dHRvb2xzIiBvcGVuZWQ9Int7b3BlbmVkQ29udGV4dFRvb2xzfX0iPgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIHNlbGVjdGVkPSJ7e3Zpc01vZGV9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iZGl2ZSI+RGF0YXBvaW50czwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9InBkIj5QYXJ0aWFsIGRlcGVuZGVuY2UgcGxvdHM8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4LXdyYXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJTZWxlY3QgYSBkYXRhcG9pbnQgdG8gdXNlIHRoaXMgZmVhdHVyZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2xhc3M9ImNvdW50ZXJmYWN0dWFsLXRvZ2dsZSIgY2hlY2tlZD0ie3tzaG93TmVhcmVzdENvdW50ZXJmYWN0dWFsfX0iIGRpc2FibGVkJD0iW1shaGFzU2VsZWN0ZWQoc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3cgbmVhcmVzdCBjb3VudGVyZmFjdHVhbCBkYXRhcG9pbnQKICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaW5mby1vdXRsaW5lIiBjbGFzcz0iaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kaWFsb2cgY2xhc3M9ImRpYWxvZy10ZXh0IiBob3Jpem9udGFsLWFsaWduPSJhdXRvIiB2ZXJ0aWNhbC1hbGlnbj0iYXV0byI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lYXJlc3QgY291bnRlcmZhY3R1YWwgKG5laWdoYm9yIG9mIGRpZmZlcmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NpZmljYXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBhcmVzIHRoZSBzZWxlY3RlZCBkYXRhcG9pbnQgd2l0aCBpdHMgbmVhcmVzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVpZ2hib3IgZnJvbSBhIGRpZmZlcmVudCBjbGFzc2lmaWNhdGlvbiB1c2luZyBMMSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgTDIgZGlzdGFuY2UuIElmIGEgY3VzdG9tIGRpc3RhbmNlIGZ1bmN0aW9uIGlzIHNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IHVzZXMgdGhhdCBmdW5jdGlvbiBpbnN0ZWFkLgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIHNlbGVjdGVkPSJ7e25lYXJlc3RDb3VudGVyZmFjdHVhbERpc3R9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJMMSIgZGlzYWJsZWQkPSJbW2N1c3RvbURpc3RhbmNlRnVuY3Rpb25TZXRdXSI+TDE8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9IkwyIiBkaXNhYmxlZCQ9IltbY3VzdG9tRGlzdGFuY2VGdW5jdGlvblNldF1dIj5MMjwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iQ3VzdG9tIiBoaWRkZW4kPSJbWyFjdXN0b21EaXN0YW5jZUZ1bmN0aW9uU2V0XV0iPlVzZXItc3BlY2lmaWVkPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpc1JlZ3Jlc3Npb25fKG1vZGVsVHlwZSldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iTWluaW11bSBkaXN0YW5jZSBpbiBpbmZlcnJlZCB2YWx1ZSB0byBjb25zaWRlciBjb3VudGVyZmFjdHVhbCIgY2xhc3M9ImNvdW50ZXJmYWN0dWFsLWRlbHRhIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5UaHJlc2hvbGQ8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImluZm8tb3V0bGluZSIgY2xhc3M9ImluZm8taWNvbiBuby1wYWRkaW5nIiBvbi10YXA9Im9wZW5EaWFsb2ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kaWFsb2cgY2xhc3M9ImRpYWxvZy10ZXh0IiBob3Jpem9udGFsLWFsaWduPSJhdXRvIiB2ZXJ0aWNhbC1hbGlnbj0iYXV0byI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRlcmZhY3R1YWwgdGhyZXNob2xkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciByZWdyZXNzaW9uLCBhIG5laWdoYm9yIHBvaW50IGlzIGNvbnNpZGVyZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBhIGRpZmZlcmVudCBjbGFzc2lmaWNhdGlvbiBpZiB0aGUgZGlmZmVyZW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGluZmVycmVkIHZhbHVlIGlzIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCB0aHJlc2hvbGQuPGJyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB0aHJlc2hvbGQgaXMgaW5pdGlhbGl6ZWQgdG8gdGhlIHN0YW5kYXJkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWF0aW9uIG9mIHRoZSBpbmZlcnJlZCB2YWx1ZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItc2xpZGVyIGVkaXRhYmxlIHZhbHVlPSJ7e21pbkNvdW50ZXJmYWN0dWFsVmFsdWVEaXN0fX0iIG1heD0iW1ttYXhDb3VudGVyZmFjdHVhbFZhbHVlRGlzdF1dIiBkaXNhYmxlZCQ9IltbIXNob3dOZWFyZXN0Q291bnRlcmZhY3R1YWxdXSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGxhYmVsPSJNb2RlbDoiIG5vLWxhYmVsLWZsb2F0IGNsYXNzPSJzaG9ydC1kcm9wZG93biIgaGlkZGVuJD0iW1tzaG91bGRIaWRlTW9kZWxTZWxlY3Rvcl8ocGFyc2VkTW9kZWxOYW1lcyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e25lYXJlc3RDb3VudGVyZmFjdHVhbE1vZGVsSW5kZXh9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW3BhcnNlZE1vZGVsTmFtZXNdXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPltbZ2V0TGFiZWxlZE1vZGVsTmFtZV8oaXRlbSldXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IlNlbGVjdCBhIGRhdGFwb2ludCB0byB1c2UgdGhpcyBmZWF0dXJlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0iY29udHJvbC1idXR0b24gZGF0YXBvaW50LWJ1dHRvbiIgZGlzYWJsZWQkPSJbWyFoYXNTZWxlY3RlZChzZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2UpXV0iIG9uLXRhcD0ic2hvd0Rpc3RhbmNlQ2xpY2tlZF8iIGFsdD0iU2hvdyBzaW1pbGFyaXR5IHRvIHNlbGVjdGVkIGRhdGFwb2ludCIgdGl0bGU9IlNob3cgc2ltaWxhcml0eSB0byBzZWxlY3RlZCBkYXRhcG9pbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvdyBzaW1pbGFyaXR5IHRvIHNlbGVjdGVkIGRhdGFwb2ludAogICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvLW91dGxpbmUiIGNsYXNzPSJpbmZvLWljb24gY2YtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImF1dG8iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvdyBzaW1pbGFyaXR5IHRvIHNlbGVjdGVkIGRhdGFwb2ludAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxjdWxhdGVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzZWxlY3RlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhcG9pbnQgYW5kIGFsbCBvdGhlciBkYXRhcG9pbnRzIGFuZCBzaG93cyB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBkYXRhcG9pbnRzIHZpc3VhbGl6YXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWFuZC1jYXJkIGVkaXRvci1oZWFkaW5nLWFuZC1jYXJkIj4KICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJoZWFkaW5nIj4KICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0RGF0YXBvaW50RWRpdG9yVGl0bGUoc2VsZWN0ZWRFeGFtcGxlTnVtLAogICAgICAgICAgICAgICAgICAgICAgY29tcGFyZWRJbmRpY2VzKV1dCiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibm8tcGFkZGluZy1jYXJkIj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRhdGFwb2ludC1jb250cm9scy1ob2xkZXIgZGF0YXBvaW50LWNvbnRyb2wtYnV0dG9ucy1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhcG9pbnQtbGVmdC1jb250cm9scy1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0iZGF0YXBvaW50LWNvbnRyb2wtYnV0dG9uIiBpY29uPSJjaGV2cm9uLWxlZnQiIGRpc2FibGVkJD0iW1shaGFzU2VsZWN0ZWQoc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlKV1dIiBvbi10YXA9InNlbGVjdFByZXZEYXRhcG9pbnRfIiBhbHQ9InNlbGVjdCBwcmV2aW91cyBkYXRhcG9pbnQiIHRpdGxlPSJTZWxlY3QgcHJldmlvdXMgZGF0YXBvaW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0iZGF0YXBvaW50LWNvbnRyb2wtYnV0dG9uIiBpY29uPSJjaGV2cm9uLXJpZ2h0IiBkaXNhYmxlZCQ9IltbIWhhc1NlbGVjdGVkKHNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZSldXSIgb24tdGFwPSJzZWxlY3ROZXh0RGF0YXBvaW50XyIgYWx0PSJzZWxlY3QgbmV4dCBkYXRhcG9pbnQiIHRpdGxlPSJTZWxlY3QgbmV4dCBkYXRhcG9pbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iRWRpdCBhIGRhdGFwb2ludCB0byB1c2UgdGhpcyBmZWF0dXJlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0iZGF0YXBvaW50LWNvbnRyb2wtYnV0dG9uIiBpY29uPSJoaXN0b3J5IiBvbi10YXA9InJlc2V0RGF0YXBvaW50XyIgYWx0PSJ1bmRvIGNoYW5nZXMiIHRpdGxlPSJVbmRvIGNoYW5nZXMiIGRpc2FibGVkJD0iW1tzaG91bGREaXNhYmxlUmVzZXRfKHNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZS5jaGFuZ2VkKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iU2VsZWN0IGEgZGF0YXBvaW50IHRvIHVzZSB0aGlzIGZlYXR1cmUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGNsYXNzPSJkYXRhcG9pbnQtY29udHJvbC1idXR0b24iIGljb249ImNvbnRlbnQtY29weSIgZGlzYWJsZWQkPSJbWyFoYXNTZWxlY3RlZChzZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2UpXV0iIG9uLXRhcD0iY29weURhdGFwb2ludF8iIGFsdD0iZHVwbGljYXRlIGRhdGFwb2ludCIgdGl0bGU9IkR1cGxpY2F0ZSBkYXRhcG9pbnQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSJTZWxlY3QgYSBkYXRhcG9pbnQgdG8gdXNlIHRoaXMgZmVhdHVyZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gY2xhc3M9ImRhdGFwb2ludC1jb250cm9sLWJ1dHRvbiIgaWNvbj0iZGVsZXRlIiBkaXNhYmxlZCQ9IltbIWhhc1NlbGVjdGVkKHNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZSldXSIgb24tdGFwPSJkZWxldGVEYXRhcG9pbnREaWFsb2dfIiBhbHQ9ImRlbGV0ZSBkYXRhcG9pbnQiIHRpdGxlPSJEZWxldGUgZGF0YXBvaW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1kaXZpZGVyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgdmFsdWU9Int7ZmVhdHVyZVNlYXJjaFZhbHVlfX0iIGxhYmVsPSJTZWFyY2ggZmVhdHVyZXMiIGNsYXNzPSJkYXRhcG9pbnQtY29udHJvbC1maWx0ZXItaW5wdXQgZmVhdHVyZS1zZWFyY2gtaW5wdXQiIGRpc2FibGVkJD0iW1shaGFzU2VsZWN0ZWQoc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlKV1dIiBuby1sYWJlbC1mbG9hdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iaWNvbnM6c2VhcmNoIiBzbG90PSJwcmVmaXgiPjwvaXJvbi1pY29uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleCIgaGlkZGVuPSJbWyFoYXNBdHRyaWJ1dGlvbnNfKGF0dHJpYnV0aW9ucyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWRpdmlkZXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IkZlYXR1cmUgc29ydCBvcmRlciIgY2xhc3M9InNob3J0LWRyb3Bkb3duIiBuby1sYWJlbC1mbG9hdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7ZXhhbXBsZUZlYXR1cmVTb3J0T3JkZXJ9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9Im5hbWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5hbWU9ImFscGhhYmV0aWNhbCI+QWxwaGFiZXRpY2FsPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5hbWU9ImF0dHJpYnV0aW9uIj5BdHRyaWJ1dGlvbnM8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbmFtZT0icmV2ZXJzZS1hdHRyaWJ1dGlvbiI+UmV2ZXJzZSBhdHRyaWJ1dGlvbnM8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbmFtZT0iYWJzb2x1dGUtYXR0cmlidXRpb24iPkFic29sdXRlIGF0dHJpYnV0aW9uczwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyBpZD0iYXR0cmlidXRpb25MZWdlbmQiPjwvc3ZnPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9Ik1vZGVsOiIgbm8tbGFiZWwtZmxvYXQgY2xhc3M9InNob3J0LWRyb3Bkb3duIiBoaWRkZW4kPSJbWyFoYXNNdWx0aXBsZU1vZGVsQXR0cmlidXRpb25zXyhhdHRyaWJ1dGlvbnMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7YXR0cmlidXRpb25Nb2RlbEluZGV4fX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbcGFyc2VkTW9kZWxOYW1lc11dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPltbZ2V0TGFiZWxlZE1vZGVsTmFtZV8oaXRlbSldXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhcG9pbnQtcmlnaHQtY29udHJvbHMtaG9sZGVyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hhc1NlbGVjdGVkKHNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZSldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImV4YW1wbGUtYW5kLWluZmVyZW5jZS1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDx2ei1leGFtcGxlLXZpZXdlciBjbGFzcz0iZXhhbXBsZS1ob2xkZXIiIGpzb249Int7c2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlLmV4YW1wbGV9fSIgY29tcGFyZS1qc29uPSJ7e2NvdW50ZXJmYWN0dWFsRXhhbXBsZUFuZEluZmVyZW5jZS5leGFtcGxlfX0iIG9uLWV4YW1wbGUtY2hhbmdlPSJleGFtcGxlQ2hhbmdlXyIgaWQ9InZpZXdlciIgZGlzcGxheS1tb2RlPSJbW2V4YW1wbGVEaXNwbGF5TW9kZV1dIiBmZWF0dXJlLXNlYXJjaC12YWx1ZT0ie3tmZWF0dXJlU2VhcmNoVmFsdWV9fSIgY29tcGFyZS10aXRsZT0iW1tjb21wYXJlVGl0bGVdXSIgc2FsaWVuY3k9IltbYXR0cmlidXRpb25dXSIgc2hvdy1zYWxpZW5jeSByZWFkb25seT0iW1shYXJlRXhhbXBsZXNFZGl0YWJsZV8obW9kZWxOYW1lLCBpbmZlcmVuY2VBZGRyZXNzKV1dIiBzb3J0LW9yZGVyPSJbW2V4YW1wbGVGZWF0dXJlU29ydE9yZGVyXV0iIG1pbi1zYWw9IltbbWluQXR0cmlidXRpb25dXSIgbWF4LXNhbD0iW1ttYXhBdHRyaWJ1dGlvbl1dIiBjb2xvcnM9IltbYXR0cmlidXRpb25Db2xvclNjYWxlXV0iIGhpZ2hsaWdodC1kaWZmZXJlbmNlcz0iW1tzaG93TmVhcmVzdENvdW50ZXJmYWN0dWFsXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvdnotZXhhbXBsZS12aWV3ZXI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shaGFzU2VsZWN0ZWQoc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGF0YXBvaW50LWluZm8taG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXRhcG9pbnQtaW5mby1jb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXggc3BhY2UtYmV0d2VlbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9uYm9hcmRpbmctaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3QgYSBkYXRhcG9pbnQgdG8gYmVnaW4gZXhwbG9yaW5nIG1vZGVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3IgZm9yIHlvdXIgc2VsZWN0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ib25ib2FyZGluZy10ZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImJvbGQiPkVkaXQgYW5kIEluZmVyOjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRpdCB5b3VyIGRhdGFwb2ludCBoZXJlIGFuZCBydW4gaW5mZXJlbmNlIGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZlciB0YWJsZSB0byBzZWUgZGlmZmVyZW5jZXMgaW4gbW9kZWwgYmVoYXZpb3IuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9uYm9hcmRpbmctdGV4dCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJib2xkIj5WaXN1YWxpemU6PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2ggYmV0d2VlbiB2aXN1YWxpemluZyBkYXRhcG9pbnRzIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsb3JpbmcgcGFydGlhbCBkZXBlbmRlbmNlIHBsb3RzIHRvIGdhaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWdodHMgaW50byB5b3VyIG1vZGVsJ3MgYmVoYXZpb3IuIEV4cGxvcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcmZhY3R1YWxzIG9yIHNlZSBob3cgc2ltaWxhciAob3IgZGlmZmVyZW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzdCBvZiB5b3VyIGRhdGFzZXQgaXMgZnJvbSB5b3VyIHNlbGVjdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmZlcmVuY2Utc2VjdGlvbi1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImluZmVyZW5jZS1zZWN0aW9uIj4KICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImluZmVyZW5jZS1oZWFkZXIgaGVhZGluZyIgb24tdGFwPSJ0b2dnbGVJbmZlcmVuY2VSZXN1bHRzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0SW5mZXJUaXRsZShzZWxlY3RlZEV4YW1wbGVOdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlZEluZGljZXMpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyaWdodC1zaWRlIHJpZ2h0LXNpZGUtcGVyZm9ybWFuY2UtdGFiIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iW1tnZXRFeHBhbmRDb2xsYXBzZUljb24ob3BlbmVkSW5mZXJlbmNlUmVzdWx0cyldXSIgY2xhc3M9ImV4cGFuZC1jb2xsYXBzZS1idXR0b24iPjwvaXJvbi1pY29uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2UgY2xhc3M9Im5vLXBhZGRpbmctY2FyZCIgaWQ9ImNvbGxhcHNlaW5mZXJlbmNlIiBvcGVuZWQ9Int7b3BlbmVkSW5mZXJlbmNlUmVzdWx0c319Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iRWRpdCBhIGRhdGFwb2ludCB0byB1c2UgdGhpcyBmZWF0dXJlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIG9uLXRhcD0iaW5mZXJDbGlja2VkXyIgY2xhc3M9ImNvbnRyb2wtYnV0dG9uIGluZmVyLWJ1dHRvbiBmbGV4LWdyb3ciIGRpc2FibGVkJD0iW1tzaG91bGREaXNhYmxlSW5mZXJCdXR0b25fKGV4YW1wbGVzQW5kSW5mZXJlbmNlcywgbW9kZWxOYW1lLCBpbmZlcmVuY2VBZGRyZXNzLCB1cGRhdGVkRXhhbXBsZSldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW4gaW5mZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaGFzU2VsZWN0ZWQoc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Zi1pbmZlcmVuY2Utdmlld2VyIGNsYXNzPSJpbmZlcmVuY2Utdmlld2VyIiBpbmZlcmVuY2VzPSJbW3NlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZS5pbmZlcmVuY2VzXV0iIGlkJD0iW1tnZXRJbmZlcmVuY2VIb2xkZXJJZF8oKV1dIiBtb2RlbC10eXBlPSJbW21vZGVsVHlwZV1dIiBtb2RlbC1uYW1lcz0iW1twYXJzZWRNb2RlbE5hbWVzXV0iIG1heC1lbnRyaWVzLXBlci1ydW49IltbbWF4SW5mZXJlbmNlRW50cmllc1BlclJ1bl1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGYtaW5mZXJlbmNlLXZpZXdlcj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tjb3VudGVyZmFjdHVhbEV4YW1wbGVBbmRJbmZlcmVuY2VdXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGYtaW5mZXJlbmNlLXZpZXdlciBjbGFzcz0iaW5mZXJlbmNlLXZpZXdlciBjb21wYXJlLWluZmVyZW5jZS12aWV3ZXIiIGluZmVyZW5jZXM9IltbY291bnRlcmZhY3R1YWxFeGFtcGxlQW5kSW5mZXJlbmNlLmluZmVyZW5jZXNdXSIgbW9kZWwtdHlwZT0iW1ttb2RlbFR5cGVdXSIgbW9kZWwtbmFtZXM9IltbcGFyc2VkTW9kZWxOYW1lc11dIiBtYXgtZW50cmllcy1wZXItcnVuPSJbW21heEluZmVyZW5jZUVudHJpZXNQZXJSdW5dXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RmLWluZmVyZW5jZS12aWV3ZXI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXNpemVyIiBpZD0icmVzaXplciI+CiAgICAgICAgICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iYXY6cGF1c2UiIGNsYXNzPSJyZXNpemUtaWNvbiI+PC9pcm9uLWljb24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciIgaWQ9ImNlbnRlciI+CiAgICAgICAgICAgICAgICA8ZmFjZXRzLWRpdmUgaWQ9ImRpdmUiIGRhdGE9IltbdmlzZGF0YV1dIiBzZWxlY3RlZC1pbmRpY2VzPSJbW3NlbGVjdGVkXV0iIGNvbXBhcmVkLWluZGljZXM9IltbY29tcGFyZWRJbmRpY2VzXV0iIG9uLXNlbGVjdGVkLWluZGljZXMtY2hhbmdlZD0ic2VsZWN0ZWRJbmRpY2VzQ2hhbmdlZF8iIG9uLXN0YXRzLWNoYW5nZWQ9InN0YXRzQ2hhbmdlZF8iIGhpZGUtaW5mby1jYXJkPSJ0cnVlIiBzcHJpdGUtaW1hZ2Utd2lkdGg9IjMyIiBzcHJpdGUtaW1hZ2UtaGVpZ2h0PSIzMiIgZml0LWdyaWQtYXNwZWN0LXJhdGlvLXRvLXZpZXdwb3J0PSJ0cnVlIiBzdGFibGUtY29sb3JzPSJ0cnVlIj4KICAgICAgICAgICAgICAgIDwvZmFjZXRzLWRpdmU+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJub2V4YW1wbGVzIiBjbGFzcz0ibm9leGFtcGxlcyBpbmZvLXRleHQiPgogICAgICAgICAgICAgICAgICBEYXRhcG9pbnRzIGFuZCB0aGVpciBpbmZlcmVuY2UgcmVzdWx0cyB3aWxsIGJlIGRpc3BsYXllZCBoZXJlLgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgaW5kZXRlcm1pbmF0ZSBpZD0icHJvZ3Jlc3MiIGhpZGRlbj0iW1tsb2FkaW5nQmFySGlkZGVuX11dIj4KICAgICAgICAgICAgICAgIDwvcGFwZXItcHJvZ3Jlc3M+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLWNvbnRhaW5lci1ob2xkZXIiIGlkPSJwYXJ0aWFscGxvdGhvbGRlciI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBkLXBsb3RzLWhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleCI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZC1pbmZvLXRleHQiPlBhcnRpYWwgRGVwZW5kZW5jZSBQbG90czwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImluZm8tb3V0bGluZSIgY2xhc3M9ImluZm8taWNvbiBwZC1pbmZvLWljb24gbm8tcGFkZGluZyIgb24tdGFwPSJvcGVuRGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImF1dG8iPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPlBhcnRpYWwgRGVwZW5kZW5jZSBQbG90czwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpYWwgZGVwZW5kZW5jZSBwbG90cyB2aXN1YWxpemUgdGhlIGNoYW5nZSBpbgogICAgICAgICAgICAgICAgICAgICAgICAgIGluZmVyZW5jZSByZXN1bHRzIGZvciBldmVyeSBmZWF0dXJlLCBhcyB0aGUgdmFsdWUgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBmZWF0dXJlIGlzIGNoYW5nZWQgdG8gZGlmZmVyZW50IHZhbGlkIHZhbHVlcy4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIG51bWVyaWMgZmVhdHVyZXMsIHlvdSBjYW4gc2V0IHRoZSBtaW5pbXVtIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW0gdmFsdWVzIHRvIHBsb3QuCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBzdHJpbmcgZmVhdHVyZXMsIHRoZSBtb3N0IHBvcHVsYXIgZmVhdHVyZSB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgc2hvd24gYXMgYWx0ZXJuYXRpdmVzIHRvIHRoZSBmZWF0dXJlIHZhbHVlIGZvciB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCBkYXRhcG9pbnQuCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBmZWF0dXJlcyB3aXRoIG11bHRpcGxlIGZlYXR1cmUgdmFsdWVzIHBlcgogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFwb2ludCwgYSBzaW5nbGUgcGxvdCBpcyBzaG93biBmb3IgZm9yIGVhY2ggZmVhdHVyZQogICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGluIHRoZSBzZWxlY3RlZCBkYXRhcG9pbnQuIFlvdSBjYW4gb3ZlcnJpZGUKICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBmZWF0dXJlIHZhbHVlcyBoYXZlIHBsb3RzIGNyZWF0ZWQgZm9yIHRoZW0gYnkKICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5aW5nIHRoZSBpbmRpY2VzIHRvIHNob3duIHBhcnRpYWwgZGVwZW5kZW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RzIGZvciwgaWYgdGhlIGRhdGFwb2ludCBjb250YWlucyBtdWx0aXBsZSBmZWF0dXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIGZvciBhIGZlYXR1cmUuCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIFdoZW4gdGhlIGdsb2JhbCB0b2dnbGUgaXMgdHVybmVkIG9uLCB0aGUgcGxvdHMgc2hvdwogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhdmVyYWdlIGVmZmVjdCBvZiByZXBlYXRlZGx5IGNoYW5naW5nIGEgc2luZ2xlCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZSBhY3Jvc3MgYWxsIGRhdGFwb2ludHMuIFdoZW4gaXQgaXMgdHVybmVkIG9mZiwKICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGxvdHMgc2hvdyB0aGUgZWZmZWN0IG9mIGEgcmVwZWF0ZWRseSBjaGFuZ2luZyBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlIGZlYXR1cmUgb24gdGhlIHNlbGVjdGVkIGRhdGFwb2ludC4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b24tYW5kLXByb2dyZXNzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJjb250cm9sLWJ1dHRvbiBkYXRhcG9pbnQtYnV0dG9uIiBkaXNhYmxlZCQ9Iltbc2hvdWxkRGlzYWJsZVNvcnRGZWF0dXJlc0J1dHRvbihwYXJ0aWFsRGVwUGxvdEVsaWdpYmxlRmVhdHVyZXMsIGlzU29ydGluZ0VsaWdpYmxlRmVhdHVyZXMpXV0iIG9uLXRhcD0ic29ydFBkRmVhdHVyZXNfIiBhbHQ9IlNvcnQgZmVhdHVyZXMgYnkgaW50ZXJlc3RpbmduZXNzIiB0aXRsZT0iU29ydCBmZWF0dXJlcyBieSBpbnRlcmVzdGluZ25lc3MiPgogICAgICAgICAgICAgICAgICAgICAgICBTb3J0IGZlYXR1cmVzIGJ5IGludGVyZXN0aW5nbmVzcwogICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgY2xhc3M9InNvcnQtcHJvZ3Jlc3MiIGhpZGRlbj0iW1shaXNTb3J0aW5nRWxpZ2libGVGZWF0dXJlc11dIiBpbmRldGVybWluYXRlPjwvcGFwZXItcHJvZ3Jlc3M+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2xhc3M9InBkLXRvZ2dsZSIgY2hlY2tlZD0ie3tnbG9iYWxQZFBsb3RzfX0iIG9uLWNoYW5nZT0iaGlkZUFsbFBkRWxlbWVudHNfIiBkaXNhYmxlZCQ9IltbIWhhc1NlbGVjdGVkKHNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZSldXSI+CiAgICAgICAgICAgICAgICAgICAgICBHbG9iYWwgcGFydGlhbCBkZXBlbmRlbmNlIHBsb3RzCiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci10b2dnbGUtYnV0dG9uPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFhcmVUaGVyZVBkUGxvdEZlYXR1cmVzXyhwYXJ0aWFsRGVwUGxvdEVsaWdpYmxlRmVhdHVyZXMpXV0iPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBkLW5vLWZlYXR1cmVzLXRleHQiPgogICAgICAgICAgICAgICAgICAgICAgVGhlIGxvYWRlZCBkYXRhc2V0IGhhcyBubyBmZWF0dXJlcyB0byBzaG93IHBhcnRpYWwKICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2UgcGxvdHMgZm9yLgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZHBsb3RzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1twYXJ0aWFsRGVwUGxvdEVsaWdpYmxlRmVhdHVyZXNdXSI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmZWF0dXJlLWNvbnRhaW5lciIgZGF0YS1mZWF0dXJlLW5hbWUkPSJbW2l0ZW0ubmFtZV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcyQ9IltbZ2V0UGVyZlRhYmxlRW50cnlDbGFzcyhpdGVtKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWFycm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0icGQtcm93LWFycm93IHJvdGF0ZWQtaWNvbiIgaWNvbj0iYXJyb3ctZHJvcC1kb3duIiBvbi10YXA9ImNhdGVnb3J5UGFuZUNsaWNrZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS12YWwgcGVyZi10YWJsZS1jbGlja2FibGUgdGYtY2F0ZWdvcnktcGFuZSBwZXJmLXRhYmxlLXRleHQtZW50cnkiIG9uLXRhcD0iY2F0ZWdvcnlQYW5lQ2xpY2tlZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2l0ZW0ubmFtZV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZC1lbnRyeS1jb250YWluZXIgcGVyZi10YWJsZS1lbnRyeS1leHBhbmRlZCIgaGlkZGVuPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBkLWlucHV0LWNvbnRhaW5lciIgaGlkZGVuJD0iW1tzaG91bGRIaWRlUGRJbnB1dENvbnRhaW5lcihpdGVtLCBzZWxlY3RlZCldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyYW5nZS1pbnB1dC1jb250YWluZXIiIGhpZGRlbiQ9IltbaXRlbS5zYW1wbGVzXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmZvLXRleHQiIHRpdGxlPSJUaGUgcmFuZ2Ugb2YgdmFsdWVzIHRvIHRlc3QgKGRlZmF1bHQgdmFsdWVzIGFyZSBhdXRvbWF0aWNhbGx5IGluZmVycmVkKS4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCByYW5nZSBvZiB2YWx1ZXMgdG8gdGVzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9InN0eWxlLWlucHV0IHgtbWluIHBkLXJhbmdlLWNvbnRyb2wiIHZhbHVlPSJbW2l0ZW0ub2JzZXJ2ZWRNaW5dXSIgdGl0bGU9IlRoZSBtaW5pbXVtIHZhbHVlIHRvIHRlc3QgKGRlZmF1bHQgdmFsdWUgaXMgYXV0b21hdGljYWxseSBpbmZlcnJlZCkuIiBvbi1pbnB1dD0icGRJbnB1dENoYW5nZWQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBkLXJhbmdlLWh5cGhlbiI+LTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGNsYXNzPSJzdHlsZS1pbnB1dCB4LW1heCBwZC1yYW5nZS1jb250cm9sIiB2YWx1ZT0iW1tpdGVtLm9ic2VydmVkTWF4XV0iIHRpdGxlPSJUaGUgbWF4aW11bSB2YWx1ZSB0byB0ZXN0IChkZWZhdWx0IHZhbHVlIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQpLiIgb24taW5wdXQ9InBkSW5wdXRDaGFuZ2VkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZlYXR1cmUtaW5kZXgtY29udGFpbmVyIiBoaWRkZW4kPSJbW3Nob3VsZEhpZGVGZWF0dXJlSW5kaWNlc1NlbGVjdG9yKGl0ZW0ubmFtZSwgc2VsZWN0ZWQpXV0iIHRpdGxlPSJBbiBvcHRpb25hbCBwcmludGVyLXBhZ2Utc3R5bGUgcGF0dGVybiBsaWtlICcwLDIsNC02JyB0byBzZWxlY3QgdGhlIGluZGljZXMgb2YgdGhlIGZlYXR1cmUgdmFsdWVzIHRvIGdlbmVyYXRlIHBsb3RzIGZvci4gVXNlZnVsIGZvciBmZWF0dXJlcyB3aXRoIG1hbnkgcmVwZWF0ZWQgZmllbGRzLiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImluZm8tdGV4dCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IGZlYXR1cmUgaW5kaWNlcyA8aT4ob3B0aW9uYWwpPC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJzdHlsZS1pbnB1dCBmZWF0dXJlLWluZGV4LXBhdHRlcm4gcGQtcmFuZ2UtY29udHJvbCIgb24taW5wdXQ9InBkSW5wdXRDaGFuZ2VkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InRmLWNhdGVnb3J5LXBhbmUtY29udGVudCI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbmZpZy10YWIiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbmZpZy1zaWRlLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1hbmQtY2FyZCI+CiAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImluZmVyZW5jZS1oZWFkZXIgaGVhZGluZyIgb24tdGFwPSJ0b2dnbGVUcnVlTGFiZWxTZXR1cCI+CiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJlCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icmlnaHQtc2lkZSByaWdodC1zaWRlLXBlcmZvcm1hbmNlLXRhYiI+CiAgICAgICAgICAgICAgICAgICAgICA8aXJvbi1pY29uIGljb249IltbZ2V0RXhwYW5kQ29sbGFwc2VJY29uKG9wZW5lZFRydWVMYWJlbCldXSIgY2xhc3M9ImV4cGFuZC1jb2xsYXBzZS1idXR0b24iPjwvaXJvbi1pY29uPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2UgY2xhc3M9ImNhcmQiIGlkPSJjb2xsYXBzZXRydWVsYWJlbCIgb3BlbmVkPSJ7e29wZW5lZFRydWVMYWJlbH19Ij4KICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvdWxkU2hvd0xhYmVsRHJvcGRvd25fKHN0YXRzKV1dIj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgiPgogICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iR3JvdW5kIFRydXRoIEZlYXR1cmUiIGNsYXNzPSJ0aHJlc2hvbGQtZHJvcGRvd24iPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e3NlbGVjdGVkTGFiZWxGZWF0dXJlfX0iIGF0dHItZm9yLXNlbGVjdGVkPSJuYW1lIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbZ2V0RmVhdHVyZUxpc3RfKHN0YXRzKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbmFtZT0iW1tpdGVtXV0iPltbZ2V0RmVhdHVyZU5hbWVfKGl0ZW0pXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlbHAtdGl0bGUgaGVscC10aXRsZS1tYXJnaW4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hhdCBpcyBncm91bmQgdHJ1dGg/CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVscC10ZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBmZWF0dXJlIHRoYXQgeW91ciBtb2RlbCBpcyB0cnlpbmcgdG8gcHJlZGljdC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRpYWxvZy1saW5rIiBvbi10YXA9Im9wZW5EaWFsb2ciPk1vcmUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJhdXRvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdW5kIFRydXRoIEZlYXR1cmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGRhdGFwb2ludHMgY29udGFpbiBhIGZlYXR1cmUgdGhhdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50cyB0aGUgZ3JvdW5kIHRydXRoIGZvciB3aGF0IHRoZSBtb2RlbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYXR0ZW1wdGluZyB0byBwcmVkaWN0LCB0aGVuIHNlbGVjdGluZyB0aGF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlIGhlcmUgYWxsb3dzIHRoZSB0b29sIHRvIGludmVzdGlnYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIG1vZGVsIGJ5IGNvbXBhcmluZyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsJ3MgcmVzdWx0cyB0byB0aGUgZ3JvdW5kIHRydXRoIGZlYXR1cmUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvdWxkU2hvd0Nvc3RSYXRpb18oc2VsZWN0ZWRMYWJlbEZlYXR1cmUsIG1vZGVsVHlwZSwgbXVsdGlDbGFzcyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCB2YWx1ZT0ie3tpbmNvcnJlY3RQcmVkQ29zdFJhdGlvfX0iIGxhYmVsPSJDb3N0IFJhdGlvIChGUC9GTikiIHR5cGU9Im51bWJlciIgY2xhc3M9InRocmVzaG9sZC1jb3N0LWlucHV0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWxwLXRpdGxlIGhlbHAtdGl0bGUtbWFyZ2luIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hhdCBpcyBjb3N0IHJhdGlvPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWxwLXRleHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBjb3N0IG9mIGZhbHNlIHBvc2l0aXZlcyByZWxhdGl2ZSB0byBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlcy4gUmVxdWlyZWQgZm9yIG9wdGltaXphdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZGlhbG9nLWxpbmsiIG9uLXRhcD0ib3BlbkRpYWxvZyI+TW9yZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJhdXRvIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoYXQgaXMgY29zdCByYXRpbz8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB0ZWxscyB0aGUgdG9vbCBob3cgdG8gb3B0aW1pemUgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uIHRocmVzaG9sZHMgd2hlbiB5b3UgdXNlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb24gc3RyYXRlZ3kgY29udHJvbHMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDAgPSBmYWxzZSBwb3NpdGl2ZXMgYXJlIGVxdWFsbHkgYXMgY29zdGx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGZhbHNlIG5lZ2F0aXZlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC4wMCA9IGZhbHNlIHBvc2l0aXZlcyBhcmUgNCB0aW1lcyBtb3JlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3RseSB0aGFuIGZhbHNlIG5lZ2F0aXZlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1ID0gZmFsc2UgbmVnYXRpdmVzIGFyZSA0IHRpbWVzIG1vcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zdGx5IHRoYW4gZmFsc2UgcG9zaXRpdmVzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG91bGRTaG93RmVhdHVyZURyb3Bkb3duXyhzdGF0cyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZsZXgiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGxhYmVsPSJTbGljZSBieSIgY2xhc3M9InRocmVzaG9sZC1kcm9wZG93biI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tzZWxlY3RlZEJyZWFrZG93bkZlYXR1cmV9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9Im5hbWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2dldEZlYXR1cmVMaXN0XyhzdGF0cyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbmFtZT0iW1tpdGVtXV0iPltbZ2V0RmVhdHVyZU5hbWVfKGl0ZW0pXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpc051bWVyaWNGZWF0dXJlXyhzZWxlY3RlZEJyZWFrZG93bkZlYXR1cmUpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IG1pbj0iMiIgdmFsdWU9Int7bnVtUHJpbWFyeUJ1Y2tldHN9fSIgbGFiZWw9IkJ1Y2tldHMiIHR5cGU9Im51bWJlciIgY2xhc3M9Im51bS1idWNrZXRzLWlucHV0Ij48L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlbHAtdGl0bGUgaGVscC10aXRsZS1tYXJnaW4iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGF0IGRvZXMgc2xpY2luZyBkbz8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVscC10ZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93cyBwZXJmb3JtYW5jZSBmb3IgZWFjaCB2YWx1ZSBvZiB0aGUgc2VsZWN0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3VsZFNob3dTZWNvbmRGZWF0dXJlRHJvcGRvd25fKHNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iU2xpY2UgYnkgKHNlY29uZGFyeSkiIGNsYXNzPSJ0aHJlc2hvbGQtZHJvcGRvd24iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tzZWxlY3RlZFNlY29uZEJyZWFrZG93bkZlYXR1cmV9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9Im5hbWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbZ2V0RmVhdHVyZUxpc3RfKHN0YXRzKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5hbWU9IltbaXRlbV1dIj5bW2dldEZlYXR1cmVOYW1lXyhpdGVtKV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpc051bWVyaWNGZWF0dXJlXyhzZWxlY3RlZFNlY29uZEJyZWFrZG93bkZlYXR1cmUpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbWluPSIyIiB2YWx1ZT0ie3tudW1TZWNvbmRhcnlCdWNrZXRzfX0iIGxhYmVsPSJCdWNrZXRzIiB0eXBlPSJudW1iZXIiIGNsYXNzPSJudW0tYnVja2V0cy1pbnB1dCI+PC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2lzQmluYXJ5Q2xhc3NpZmljYXRpb25fKG1vZGVsVHlwZSwgbXVsdGlDbGFzcyldXSI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctYW5kLWNhcmQiPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImluZmVyZW5jZS1oZWFkZXIgaGVhZGluZyIgb24tdGFwPSJ0b2dnbGVFeHBsb3JlclNldHVwIj4KICAgICAgICAgICAgICAgICAgICAgIEZhaXJuZXNzCiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyaWdodC1zaWRlIHJpZ2h0LXNpZGUtcGVyZm9ybWFuY2UtdGFiIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlyb24taWNvbiBpY29uPSJbW2dldEV4cGFuZENvbGxhcHNlSWNvbihvcGVuZWRFeHBsb3JlcildXSIgY2xhc3M9ImV4cGFuZC1jb2xsYXBzZS1idXR0b24iPjwvaXJvbi1pY29uPgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2UgY2xhc3M9ImNhcmQiIGlkPSJjb2xsYXBzZWV4cGxvcmVyIiBvcGVuZWQ9Int7b3BlbmVkRXhwbG9yZXJ9fSI+CiAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvdWxkU2hvd0ZlYXR1cmVEcm9wZG93bl8oc3RhdHMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWluZm8taGVhZGVyIGhlbHAtdGl0bGUtbWFyZ2luLWJ1dHRvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwbHkgYW4gb3B0aW1pemF0aW9uIHN0cmF0ZWd5CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWluZm8tdGV4dCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0IGEgc3RyYXRlZ3kgdG8gc2V0IGNsYXNzaWZpY2F0aW9uIHRocmVzaG9sZHMKICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiB0aGUgc2V0IGNvc3QgcmF0aW8gYW5kIGRhdGEgc2xpY2VzLiBNYW51YWxseQogICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVyaW5nIHRocmVzaG9sZHMgb3IgY2hhbmdpbmcgY29zdCByYXRpbyB3aWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBiYWNrIHRvIGN1c3RvbSB0aHJlc2hvbGRzLgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGNsYXNzPSJvcHRpbWl6YXRpb24tcmFkaW8tZ3JvdXAiIHNlbGVjdGVkPSJ7e29wdGltaXphdGlvblNlbGVjdGVkfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iY3VzdG9tIiBjbGFzcz0ib3B0aW1pemF0aW9uLXJhZGlvIiBpZD0iY3VzdG9tdGhyZXNoIj5DdXN0b20gdGhyZXNob2xkcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImluZm8tb3V0bGluZSIgY2xhc3M9ImluZm8taWNvbiB0aHJlc2gtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPkN1c3RvbSB0aHJlc2hvbGRzPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHlvdXIgb3duIHRocmVzaG9sZHMgdXNpbmcgdGhlIHRocmVzaG9sZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWRlcnMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJ1bmF3YXJlIiBjbGFzcz0ib3B0aW1pemF0aW9uLXJhZGlvIj5TaW5nbGUgdGhyZXNob2xkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaW5mby1vdXRsaW5lIiBjbGFzcz0iaW5mby1pY29uIHRocmVzaC1pbmZvLWljb24gbm8tcGFkZGluZyIgb24tdGFwPSJvcGVuRGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImJvdHRvbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+U2luZ2xlIHRocmVzaG9sZDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGltaXplIGEgc2luZ2xlIHRocmVzaG9sZCBmb3IgYWxsIGRhdGFwb2ludHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGNvc3QgcmF0aW8uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJkZW1vcGFyaXR5IiBjbGFzcz0ib3B0aW1pemF0aW9uLXJhZGlvIiBkaXNhYmxlZCQ9IltbIXNob3VsZFNob3dGZWF0dXJlUGVyZkNoYXJ0c18oc2VsZWN0ZWRMYWJlbEZlYXR1cmUsIHNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSwgaW5mZXJlbmNlcyldXSI+RGVtb2dyYXBoaWMgcGFyaXR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaW5mby1vdXRsaW5lIiBjbGFzcz0iaW5mby1pY29uIHRocmVzaC1pbmZvLWljb24gbm8tcGFkZGluZyIgb24tdGFwPSJvcGVuRGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImJvdHRvbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+RGVtb2dyYXBoaWMgcGFyaXR5PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW1pemUgYSB0aHJlc2hvbGQgcGVyIHNsaWNlIGJhc2VkIG9uIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBjb3N0IHJhdGlvLCBlbnN1cmluZyB0aGUgZGlmZmVyZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VzIGFjaGlldmUgZGVtb2dyYXBoaWMgcGFydHkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbW9ncmFwaGljIHBhcml0eSBtZWFucyB0aGF0IHNpbWlsYXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlcyBvZiBkYXRhcG9pbnRzIGZyb20gZWFjaCBzbGljZSBhcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0ZWQgYXMgcG9zaXRpdmUgY2xhc3NpZmljYXRpb25zLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iZXF1YWxvcHAiIGNsYXNzPSJvcHRpbWl6YXRpb24tcmFkaW8iIGRpc2FibGVkJD0iW1shc2hvdWxkU2hvd0ZlYXR1cmVQZXJmQ2hhcnRzXyhzZWxlY3RlZExhYmVsRmVhdHVyZSwgc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlLCBpbmZlcmVuY2VzKV1dIj5FcXVhbCBvcHBvcnR1bml0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImluZm8tb3V0bGluZSIgY2xhc3M9ImluZm8taWNvbiB0aHJlc2gtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPkVxdWFsIG9wcG9ydHVuaXR5PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW1pemUgYSB0aHJlc2hvbGQgcGVyIHNsaWNlIGJhc2VkIG9uIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBjb3N0IHJhdGlvLCBlbnN1cmluZyB0aGUgZGlmZmVyZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VzIGFjaGlldmUgZXF1YWwgb3Bwb3J0dW5pdHkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVxdWFsIG9wcG9ydHVuaXR5IG1lYW5zIHRoYXQgYW1vbmcgdGhvc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhcG9pbnRzIHdpdGggdGhlIHBvc2l0aXZlIGdyb3VuZCB0cnV0aCBsYWJlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBhIHNpbWlsYXIgcGVyY2VudGFnZSBvZiBwb3NpdGl2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3Rpb25zIGluIGVhY2ggc2xpY2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJlcXVhbGFjYyIgY2xhc3M9Im9wdGltaXphdGlvbi1yYWRpbyIgZGlzYWJsZWQkPSJbWyFzaG91bGRTaG93RmVhdHVyZVBlcmZDaGFydHNfKHNlbGVjdGVkTGFiZWxGZWF0dXJlLCBzZWxlY3RlZEJyZWFrZG93bkZlYXR1cmUsIGluZmVyZW5jZXMpXV0iPkVxdWFsIGFjY3VyYWN5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaW5mby1vdXRsaW5lIiBjbGFzcz0iaW5mby1pY29uIHRocmVzaC1pbmZvLWljb24gbm8tcGFkZGluZyIgb24tdGFwPSJvcGVuRGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImJvdHRvbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+RXF1YWwgYWNjdXJhY3k8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpbWl6ZSBhIHRocmVzaG9sZCBwZXIgc2xpY2UgYmFzZWQgb24gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGNvc3QgcmF0aW8sIGVuc3VyaW5nIHRoZSBkaWZmZXJlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZXMgYWNoaWV2ZSBlcXVhbCBhY2N1cmFjeS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXF1YWwgYWNjdXJhY3kgbWVhbnMgdGhhdCB0aGVyZSBpcyBhIHNpbWlsYXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlIG9mIGNvcnJlY3QgcHJlZGljdGlvbnMgaW4gZWFjaCBzbGljZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9Imdyb3VwIiBjbGFzcz0ib3B0aW1pemF0aW9uLXJhZGlvIiBkaXNhYmxlZCQ9IltbIXNob3VsZFNob3dGZWF0dXJlUGVyZkNoYXJ0c18oc2VsZWN0ZWRMYWJlbEZlYXR1cmUsIHNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSwgaW5mZXJlbmNlcyldXSI+R3JvdXAgdGhyZXNob2xkcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImluZm8tb3V0bGluZSIgY2xhc3M9ImluZm8taWNvbiB0aHJlc2gtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPkdyb3VwIHRocmVzaG9sZHM8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpbWl6ZSBhIHNlcGFyYXRlIHRocmVzaG9sZCBmb3IgZWFjaCBzbGljZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgY29zdCByYXRpby4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29uZmlnLW1haW4tY29udGVudCI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaXNCaW5hcnlDbGFzc2lmaWNhdGlvbl8obW9kZWxUeXBlLCBtdWx0aUNsYXNzKV1dIiByZXN0YW1wPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXRpdGxlLXJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleCI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRQZXJmVGFibGVUaXRsZShzZWxlY3RlZEJyZWFrZG93bkZlYXR1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU2Vjb25kQnJlYWtkb3duRmVhdHVyZSwgb3B0aW1pemF0aW9uU2VsZWN0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVWYWx1ZVRocmVzaG9sZHMpXV0KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImluZm8tb3V0bGluZSIgY2xhc3M9ImluZm8taWNvbiBwZXJmb3JtYW5jZS1pbmZvLWljb24gbm8tcGFkZGluZyIgb24tdGFwPSJvcGVuRGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImF1dG8iPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzaWZpY2F0aW9uIFBlcmZvcm1hbmNlIFRhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0aGUgZ3JvdW5kIHRydXRoIGZlYXR1cmUgdG8gZXhwbG9yZSBtb2RlbAogICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlIGluY2x1ZGluZyBST0MgY3VydmVzIGFuZCBjb25mdXNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaWNlcy4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgU2xpY2UgdGhlIGRhdGFzZXQgYnkgZmVhdHVyZXMgYW5kIGV4cGxvcmUgbW9kZWwKICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZSBieSBzbGljZS4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIHRoZSBmYWlybmVzcyBvcHRpbWl6YXRpb24gc3RyYXRlZ2llcyBhbmQgc2VlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgIGltcGFjdCBvbiB0aGUgdGhyZXNob2xkcyBhbmQgcGVyZm9ybWFuY2Ugb2YgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaXZpZHVhbCBzbGljZXMuCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi1zb3J0LWJveCI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0idW5mb2xkLW1vcmUiIGNsYXNzPSJwZXJmLWJ1dHRvbiIgb24tdGFwPSJleHBhbmRBbGxQZXJmb3JtYW5jZSIgYWx0PSJleHBhbmQgYWxsIHNsaWNlcyIgdGl0bGU9IkV4cGFuZCBhbGwgc2xpY2VzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InVuZm9sZC1sZXNzIiBjbGFzcz0icGVyZi1idXR0b24iIG9uLXRhcD0iY29sbGFwc2VBbGxQZXJmb3JtYW5jZSIgYWx0PSJjb2xsYXBzZSBhbGwgc2xpY2VzIiB0aXRsZT0iQ29sbGFwc2UgYWxsIHNsaWNlcyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGxhYmVsPSJTb3J0IGJ5IiBjbGFzcz0idGhyZXNob2xkLWRyb3Bkb3duIHBlcmYtdGFibGUtc29ydC1tZW51Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7c2VsZWN0ZWRGZWF0dXJlU29ydH19IiBhdHRyLWZvci1zZWxlY3RlZD0ibmFtZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tnZXRGZWF0dXJlU29ydEJ5KG1vZGVsVHlwZSwgbXVsdGlDbGFzcyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBuYW1lPSJbW2l0ZW1dXSI+W1tpdGVtXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtYXJyb3ciPgogICAgICAgICAgICAgICAgICAgICAgPGlyb24taWNvbiBjbGFzcz0iZXhwYW5kLWNvbGxhcHNlLWJ1dHRvbiI+PC9pcm9uLWljb24+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS12YWwiPkZlYXR1cmUgVmFsdWU8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWNvdW50Ij5Db3VudDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3MkPSJbW2dldFBlcmZUYWJsZU1vZGVsQ2xhc3MobnVtTW9kZWxzKV1dIj4KICAgICAgICAgICAgICAgICAgICAgIE1vZGVsCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS10aHJlc2hvbGQgZmxleCI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlRocmVzaG9sZDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0idGhyZXNob2xkLWluZm8taG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImluZm8tb3V0bGluZSIgY2xhc3M9ImluZm8taWNvbiB0aHJlc2hvbGQtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kaWFsb2cgY2xhc3M9ImRpYWxvZy10ZXh0IiBob3Jpem9udGFsLWFsaWduPSJhdXRvIiB2ZXJ0aWNhbC1hbGlnbj0iYXV0byI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvcmluZyBDbGFzc2lmaWNhdGlvbiBQZXJmb3JtYW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgdGhpcyBzbGlkZXIgdG8gYWRqdXN0IHRoZSBjbGFzc2lmaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkIGZvciB0aGlzIHNsaWNlLiBJbmZlcmVuY2UgdmFsdWVzIGF0IG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm92ZSB0aGlzIHRocmVzaG9sZCBhcmUgY29uc2lkZXJlZCBhIHBvc2l0aXZlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbiwgd2hpbGUgaW5mZXJlbmNlIHZhbHVlcyBiZWxvdyB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQgYXJlIGNvbnNpZGVyZWQgYSBuZWdhdGl2ZSBjbGFzc2lmaWNhdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWZwIj5GYWxzZSBQb3NpdGl2ZXMgKCUpPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1mbiI+RmFsc2UgTmVnYXRpdmVzICglKTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtYWNjIj5BY2N1cmFjeSAoJSk8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWYxIj5GMTwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1lbnRyaWVzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tmZWF0dXJlVmFsdWVUaHJlc2hvbGRzXV0iIGFzPSJmZWF0dXJlVmFsdWVUaHJlc2hvbGQiPgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3MkPSJbW2dldFBlcmZUYWJsZVJvd0NsYXNzKGZlYXR1cmVWYWx1ZVRocmVzaG9sZC5vcGVuZWQpXV0iIGRhdGEtaW5kZXgkPSJbW2luZGV4XV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtYXJyb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGNsYXNzJD0iW1tnZXRFeHBhbmRDb2xsYXBzZVBlcmZJY29uQ2xhc3MoZmVhdHVyZVZhbHVlVGhyZXNob2xkLm9wZW5lZCldXSIgaWNvbj0iYXJyb3ctZHJvcC1kb3duIiBvbi10YXA9InRvZ2dsZVBlcmZSb3ciPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS12YWwgcGVyZi10YWJsZS1jbGlja2FibGUgcGVyZi10YWJsZS10ZXh0LWVudHJ5IiBvbi10YXA9InRvZ2dsZVBlcmZSb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRQcmludGFibGVWYWx1ZV8oZmVhdHVyZVZhbHVlVGhyZXNob2xkKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1jb3VudCBwZXJmLXRhYmxlLWNsaWNrYWJsZSBwZXJmLXRhYmxlLW51bS1lbnRyeSIgb24tdGFwPSJ0b2dnbGVQZXJmUm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0RmVhdHVyZVZhbHVlQ291bnQoaW5mZXJlbmNlU3RhdHNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVZhbHVlVGhyZXNob2xkLnRocmVzaG9sZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVWYWx1ZVRocmVzaG9sZCldXQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3MkPSJbW2dldFBlcmZUYWJsZU1vZGVsQ2xhc3MobnVtTW9kZWxzKV1dIiBvbi10YXA9InRvZ2dsZVBlcmZSb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tmZWF0dXJlVmFsdWVUaHJlc2hvbGQudGhyZXNob2xkfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXRleHQtZW50cnkgcGVyZi10YWJsZS1jbGlja2FibGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0TW9kZWxOYW1lXyhpbmRleCldXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS10aHJlc2hvbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tmZWF0dXJlVmFsdWVUaHJlc2hvbGQudGhyZXNob2xkfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItc2xpZGVyIGNsYXNzJD0iW1tnZXRTbGlkZXJDbGFzcyhpbmRleCldXSIgZWRpdGFibGU9InRydWUiIG1pbj0iMCIgbWF4PSIxIiBzdGVwPSIwLjAxIiBpbW1lZGlhdGUtdmFsdWU9Int7aXRlbS50aHJlc2hvbGR9fSIgdmFsdWU9IltbaXRlbS50aHJlc2hvbGRdXSIgb24tdmFsdWUtY2hhbmdlZD0icmVmcmVzaEluZmVyZW5jZXNOb1JlZ2VuXyIgb24taW1tZWRpYXRlLXZhbHVlLWNoYW5nZWQ9InJlZnJlc2hJbmZlcmVuY2VzTm9SZWdlbl8iIG9uLWRvd249InJlc2V0T3B0aW1pemF0aW9uU2VsZWN0ZWRfIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1zbGlkZXI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZnAgcGVyZi10YWJsZS1jbGlja2FibGUiIG9uLXRhcD0idG9nZ2xlUGVyZlJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e2ZlYXR1cmVWYWx1ZVRocmVzaG9sZC50aHJlc2hvbGR9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtbnVtLWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2dldEZQTW9kZWxJbmRleChpbmZlcmVuY2VTdGF0c18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVZhbHVlVGhyZXNob2xkLnRocmVzaG9sZCwgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVZhbHVlVGhyZXNob2xkKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWZuIHBlcmYtdGFibGUtY2xpY2thYmxlIiBvbi10YXA9InRvZ2dsZVBlcmZSb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tmZWF0dXJlVmFsdWVUaHJlc2hvbGQudGhyZXNob2xkfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLW51bS1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRGTk1vZGVsSW5kZXgoaW5mZXJlbmNlU3RhdHNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVWYWx1ZVRocmVzaG9sZC50aHJlc2hvbGQsIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVWYWx1ZVRocmVzaG9sZCldXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1hY2MgcGVyZi10YWJsZS1jbGlja2FibGUiIG9uLXRhcD0idG9nZ2xlUGVyZlJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e2ZlYXR1cmVWYWx1ZVRocmVzaG9sZC50aHJlc2hvbGR9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtbnVtLWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2dldEFjY3VyYWN5TW9kZWxJbmRleChpbmZlcmVuY2VTdGF0c18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVZhbHVlVGhyZXNob2xkLnRocmVzaG9sZCwgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVZhbHVlVGhyZXNob2xkKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWYxIHBlcmYtdGFibGUtY2xpY2thYmxlIiBvbi10YXA9InRvZ2dsZVBlcmZSb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tmZWF0dXJlVmFsdWVUaHJlc2hvbGQudGhyZXNob2xkfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLW51bS1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRGMU1vZGVsSW5kZXgoaW5mZXJlbmNlU3RhdHNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVWYWx1ZVRocmVzaG9sZC50aHJlc2hvbGQsIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVWYWx1ZVRocmVzaG9sZCldXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9Int7ZmVhdHVyZVZhbHVlVGhyZXNob2xkLm9wZW5lZH19Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1lbnRyeS1leHBhbmRlZCBmbGV4LXJvdy1yZXZlcnNlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvdWxkU2hvd0ZlYXR1cmVQZXJmQ2hhcnRzXyhzZWxlY3RlZExhYmVsRmVhdHVyZSwgc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlLCBpbmZlcmVuY2VzKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmZzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtaG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXRleHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9DIGN1cnZlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaW5mby1vdXRsaW5lIiBjbGFzcz0iaW5mby1pY29uIHRocmVzaG9sZC1pbmZvLWljb24gbm8tcGFkZGluZyIgb24tdGFwPSJvcGVuRGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0icmlnaHQiIHZlcnRpY2FsLWFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPlJPQyBjdXJ2ZTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgcmVjZWl2ZXIgb3BlcmF0aW5nIGNoYXJhY3RlcmlzdGljIChST0MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VydmUgcGxvdHMgdGhlIHRydWUgcG9zaXRpdmUgcmF0ZSAoVFBSKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnYWluc3QgdGhlIGZhbHNlIHBvc2l0aXZlIHJhdGUgKEZQUikgYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpb3VzIGNsYXNzaWZpY2F0aW9uIHRocmVzaG9sZHMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi1jdXJ2ZS14LWxhYmVsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlIHBvc2l0aXZlIHJhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXktbGFiZWwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSBwb3NpdGl2ZSByYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZ6LWxpbmUtY2hhcnQyIGlkPSJbW2dldFJvY0NoYXJ0SWQoaW5kZXgpXV0iIHgtYXhpcy1mb3JtYXR0ZXI9IltbZ2V0U2ltcGxlQXhpc0Zvcm1hdHRlcihheGlzUHJlY2lzaW9uKV1dIiB5LWF4aXMtZm9ybWF0dGVyPSJbW2dldFNpbXBsZUF4aXNGb3JtYXR0ZXIoYXhpc1ByZWNpc2lvbildXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC92ei1saW5lLWNoYXJ0Mj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtaG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXRleHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFIgY3VydmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvLW91dGxpbmUiIGNsYXNzPSJpbmZvLWljb24gdGhyZXNob2xkLWluZm8taWNvbiBuby1wYWRkaW5nIiBvbi10YXA9Im9wZW5EaWFsb2ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kaWFsb2cgY2xhc3M9ImRpYWxvZy10ZXh0IiBob3Jpem9udGFsLWFsaWduPSJyaWdodCIgdmVydGljYWwtYWxpZ249ImJvdHRvbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+UFIgY3VydmU8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIHByZWNpc2lvbi1yZWNhbGwgKFBSKSBjdXJ2ZSBwbG90cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbiBhZ2FpbnN0IHJlY2FsbCBhdCB2YXJpb3VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NpZmljYXRpb24gdGhyZXNob2xkcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXgtbGFiZWwiPlJlY2FsbDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtY3VydmUteS1sYWJlbCI+UHJlY2lzaW9uPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZ6LWxpbmUtY2hhcnQyIGlkPSJbW2dldFByQ2hhcnRJZChpbmRleCldXSIgeC1heGlzLWZvcm1hdHRlcj0iW1tnZXRTaW1wbGVBeGlzRm9ybWF0dGVyKGF4aXNQcmVjaXNpb24pXV0iIHktYXhpcy1mb3JtYXR0ZXI9IltbZ2V0U2ltcGxlQXhpc0Zvcm1hdHRlcihheGlzUHJlY2lzaW9uKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Z6LWxpbmUtY2hhcnQyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbmYtdGV4dCI+Q29uZnVzaW9uIG1hdHJpeDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7ZmVhdHVyZVZhbHVlVGhyZXNob2xkLnRocmVzaG9sZH19Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Zi1jb25mdXNpb24tbWF0cml4IGNvdW50cz0iW1tnZXRDb25mdXNpb25Db3VudHNNb2RlbEluZGV4KGluZmVyZW5jZVN0YXRzXywgZmVhdHVyZVZhbHVlVGhyZXNob2xkLnRocmVzaG9sZCwgaW5kZXgsIGZlYXR1cmVWYWx1ZVRocmVzaG9sZCldXSIgbGFiZWw9IltbZ2V0Q29uZnVzaW9uTWF0cml4TGFiZWwoaW5kZXgsIG51bU1vZGVscyldXSIgYmFja2dyb3VuZD0iW1tnZXRDb25mdXNpb25NYXRyaXhDb2xvcihpbmRleCldXSIgYWxsLWl0ZW1zPSJbW2FsbENvbmZNYXRyaXhMYWJlbHNdXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RmLWNvbmZ1c2lvbi1tYXRyaXg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG91bGRTaG93T3ZlcmFsbFRocmVzaG9sZGVyXyhzZWxlY3RlZEJyZWFrZG93bkZlYXR1cmUpXV0iPgogICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtcm93LWV4cGFuZGVkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWFycm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJhcnJvdy1kcm9wLWRvd24iIG9uLXRhcD0idG9nZ2xlUGVyZlJvdyIgZGlzYWJsZWQ+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXZhbCBwZXJmLXRhYmxlLXRleHQtZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIGRhdGFwb2ludHMKICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWNvdW50IHBlcmYtdGFibGUtbnVtLWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0RmVhdHVyZVZhbHVlQ291bnQoaW5mZXJlbmNlU3RhdHNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmFsbFRocmVzaG9sZHMpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzJD0iW1tnZXRQZXJmVGFibGVNb2RlbENsYXNzKG51bU1vZGVscyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e292ZXJhbGxUaHJlc2hvbGRzfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXRleHQtZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0TW9kZWxOYW1lXyhpbmRleCldXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS10aHJlc2hvbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tvdmVyYWxsVGhyZXNob2xkc319Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXNsaWRlciBjbGFzcyQ9IltbZ2V0U2xpZGVyQ2xhc3MoaW5kZXgpXV0iIGVkaXRhYmxlPSJ0cnVlIiBtaW49IjAiIG1heD0iMSIgc3RlcD0iMC4wMSIgaW1tZWRpYXRlLXZhbHVlPSJ7e2l0ZW0udGhyZXNob2xkfX0iIHZhbHVlPSJbW2l0ZW0udGhyZXNob2xkXV0iIG9uLXZhbHVlLWNoYW5nZWQ9InJlZnJlc2hJbmZlcmVuY2VzTm9SZWdlbl8iIG9uLWltbWVkaWF0ZS12YWx1ZS1jaGFuZ2VkPSJyZWZyZXNoSW5mZXJlbmNlc05vUmVnZW5fIiBvbi1kb3duPSJyZXNldE9wdGltaXphdGlvblNlbGVjdGVkXyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItc2xpZGVyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWZwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7b3ZlcmFsbFRocmVzaG9sZHN9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtbnVtLWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2dldEZQTW9kZWxJbmRleChpbmZlcmVuY2VTdGF0c18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmFsbFRocmVzaG9sZHMsIGluZGV4KV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWZuIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7b3ZlcmFsbFRocmVzaG9sZHN9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtbnVtLWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2dldEZOTW9kZWxJbmRleChpbmZlcmVuY2VTdGF0c18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmFsbFRocmVzaG9sZHMsIGluZGV4KV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWFjYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e292ZXJhbGxUaHJlc2hvbGRzfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLW51bS1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRBY2N1cmFjeU1vZGVsSW5kZXgoaW5mZXJlbmNlU3RhdHNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJhbGxUaHJlc2hvbGRzLCBpbmRleCldXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1mMSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e292ZXJhbGxUaHJlc2hvbGRzfX0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLW51bS1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRGMU1vZGVsSW5kZXgoaW5mZXJlbmNlU3RhdHNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJhbGxUaHJlc2hvbGRzLCBpbmRleCldXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWVudHJ5LWV4cGFuZGVkIGZsZXgtcm93LXJldmVyc2UiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvdWxkU2hvd092ZXJhbGxQZXJmQ2hhcnRzXyhzZWxlY3RlZExhYmVsRmVhdHVyZSwgc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlLCBpbmZlcmVuY2VzKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmcy1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXRleHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJPQyBjdXJ2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvLW91dGxpbmUiIGNsYXNzPSJpbmZvLWljb24gdGhyZXNob2xkLWluZm8taWNvbiBuby1wYWRkaW5nIiBvbi10YXA9Im9wZW5EaWFsb2ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249InJpZ2h0IiB2ZXJ0aWNhbC1hbGlnbj0iYm90dG9tIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+Uk9DIGN1cnZlPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIHJlY2VpdmVyIG9wZXJhdGluZyBjaGFyYWN0ZXJpc3RpYyAoUk9DKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZSBwbG90cyB0aGUgdHJ1ZSBwb3NpdGl2ZSByYXRlIChUUFIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnYWluc3QgdGhlIGZhbHNlIHBvc2l0aXZlIHJhdGUgKEZQUikgYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaW91cyBjbGFzc2lmaWNhdGlvbiB0aHJlc2hvbGRzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXgtbGFiZWwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlIHBvc2l0aXZlIHJhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtY3VydmUteS1sYWJlbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSBwb3NpdGl2ZSByYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dnotbGluZS1jaGFydDIgaWQ9InJvY2NoYXJ0IiB4LWF4aXMtZm9ybWF0dGVyPSJbW2dldFNpbXBsZUF4aXNGb3JtYXR0ZXIoYXhpc1ByZWNpc2lvbildXSIgeS1heGlzLWZvcm1hdHRlcj0iW1tnZXRTaW1wbGVBeGlzRm9ybWF0dGVyKGF4aXNQcmVjaXNpb24pXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Z6LWxpbmUtY2hhcnQyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtY3VydmUtdGV4dCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFIgY3VydmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaW5mby1vdXRsaW5lIiBjbGFzcz0iaW5mby1pY29uIHRocmVzaG9sZC1pbmZvLWljb24gbm8tcGFkZGluZyIgb24tdGFwPSJvcGVuRGlhbG9nIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kaWFsb2cgY2xhc3M9ImRpYWxvZy10ZXh0IiBob3Jpem9udGFsLWFsaWduPSJyaWdodCIgdmVydGljYWwtYWxpZ249ImJvdHRvbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkaWFsb2ctdGl0bGUiPlBSIGN1cnZlPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIHByZWNpc2lvbi1yZWNhbGwgKFBSKSBjdXJ2ZSBwbG90cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24gYWdhaW5zdCByZWNhbGwgYXQgdmFyaW91cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbiB0aHJlc2hvbGRzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXgtbGFiZWwiPlJlY2FsbDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXktbGFiZWwiPlByZWNpc2lvbjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dnotbGluZS1jaGFydDIgaWQ9InByY2hhcnQiIHgtYXhpcy1mb3JtYXR0ZXI9IltbZ2V0U2ltcGxlQXhpc0Zvcm1hdHRlcihheGlzUHJlY2lzaW9uKV1dIiB5LWF4aXMtZm9ybWF0dGVyPSJbW2dldFNpbXBsZUF4aXNGb3JtYXR0ZXIoYXhpc1ByZWNpc2lvbildXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdnotbGluZS1jaGFydDI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtaG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29uZi10ZXh0Ij5Db25mdXNpb24gbWF0cml4PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7b3ZlcmFsbFRocmVzaG9sZHN9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRmLWNvbmZ1c2lvbi1tYXRyaXggY291bnRzPSJbW2dldENvbmZ1c2lvbkNvdW50c01vZGVsSW5kZXgoaW5mZXJlbmNlU3RhdHNfLCBvdmVyYWxsVGhyZXNob2xkcywgaW5kZXgpXV0iIGxhYmVsPSJbW2dldENvbmZ1c2lvbk1hdHJpeExhYmVsKGluZGV4LCBudW1Nb2RlbHMpXV0iIGJhY2tncm91bmQ9IltbZ2V0Q29uZnVzaW9uTWF0cml4Q29sb3IoaW5kZXgpXV0iIGFsbC1pdGVtcz0iW1thbGxDb25mTWF0cml4TGFiZWxzXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGYtY29uZnVzaW9uLW1hdHJpeD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2lzTXVsdGlDbGFzc18obW9kZWxUeXBlLCBtdWx0aUNsYXNzKV1dIiByZXN0YW1wPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXRpdGxlLXJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleCI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXROb1RocmVzaG9sZFBlcmZUYWJsZVRpdGxlKHNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRTZWNvbmRCcmVha2Rvd25GZWF0dXJlLAogICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlVmFsdWVUaHJlc2hvbGRzKV1dCiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvLW91dGxpbmUiIGNsYXNzPSJpbmZvLWljb24gcGVyZm9ybWFuY2UtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJhdXRvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc2lmaWNhdGlvbiBQZXJmb3JtYW5jZSBUYWJsZQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhlIGdyb3VuZCB0cnV0aCBmZWF0dXJlIHRvIGV4cGxvcmUgbW9kZWwKICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZSBpbmNsdWRpbmcgY29uZnVzaW9uIG1hdHJpY2VzLgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICBTbGljZSB0aGUgZGF0YXNldCBhbmQgZXhwbG9yZSBtb2RlbCBwZXJmb3JtYW5jZSBieQogICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlLgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtc29ydC1ib3giPgogICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InVuZm9sZC1tb3JlIiBjbGFzcz0icGVyZi1idXR0b24iIG9uLXRhcD0iZXhwYW5kQWxsUGVyZm9ybWFuY2UiIGFsdD0iZXhwYW5kIGFsbCBzbGljZXMiIHRpdGxlPSJFeHBhbmQgYWxsIHNsaWNlcyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJ1bmZvbGQtbGVzcyIgY2xhc3M9InBlcmYtYnV0dG9uIiBvbi10YXA9ImNvbGxhcHNlQWxsUGVyZm9ybWFuY2UiIGFsdD0iY29sbGFwc2UgYWxsIHNsaWNlcyIgdGl0bGU9IkNvbGxhcHNlIGFsbCBzbGljZXMiPgogICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iU29ydCBieSIgY2xhc3M9InRocmVzaG9sZC1kcm9wZG93biBwZXJmLXRhYmxlLXNvcnQtbWVudSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e3NlbGVjdGVkRmVhdHVyZVNvcnR9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9Im5hbWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbZ2V0RmVhdHVyZVNvcnRCeShtb2RlbFR5cGUsIG11bHRpQ2xhc3MpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbmFtZT0iW1tpdGVtXV0iPltbaXRlbV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtaGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWFycm93Ij48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXZhbCI+RmVhdHVyZSBWYWx1ZTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtY291bnQiPkNvdW50PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcyQ9IltbZ2V0UGVyZlRhYmxlTW9kZWxDbGFzcyhudW1Nb2RlbHMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgTW9kZWwKICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWFjYyI+QWNjdXJhY3k8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZW50cmllcy1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbZmVhdHVyZVZhbHVlVGhyZXNob2xkc11dIiBhcz0iZmVhdHVyZVZhbHVlVGhyZXNob2xkIj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzJD0iW1tnZXRQZXJmVGFibGVSb3dDbGFzcyhmZWF0dXJlVmFsdWVUaHJlc2hvbGQub3BlbmVkKV1dIiBkYXRhLWluZGV4JD0iW1tpbmRleF1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWFycm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcyQ9IltbZ2V0RXhwYW5kQ29sbGFwc2VQZXJmSWNvbkNsYXNzKGZlYXR1cmVWYWx1ZVRocmVzaG9sZC5vcGVuZWQpXV0iIGljb249ImFycm93LWRyb3AtZG93biIgb24tdGFwPSJ0b2dnbGVQZXJmUm93Ij48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtdmFsIHBlcmYtdGFibGUtY2xpY2thYmxlIHBlcmYtdGFibGUtdGV4dC1lbnRyeSIgb24tdGFwPSJ0b2dnbGVQZXJmUm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZ2V0UHJpbnRhYmxlVmFsdWVfKGZlYXR1cmVWYWx1ZVRocmVzaG9sZCldXQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtY291bnQgcGVyZi10YWJsZS1udW0tZW50cnkgcGVyZi10YWJsZS1jbGlja2FibGUgcGVyZi10YWJsZS10ZXh0LWVudHJ5IiBvbi10YXA9InRvZ2dsZVBlcmZSb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRNdWx0aUNsYXNzRmVhdHVyZVZhbHVlQ291bnQoaW5mZXJlbmNlU3RhdHNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZVZhbHVlVGhyZXNob2xkKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcyQ9IltbZ2V0UGVyZlRhYmxlTW9kZWxDbGFzcyhudW1Nb2RlbHMpXV0iIG9uLXRhcD0idG9nZ2xlUGVyZlJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e2ZlYXR1cmVWYWx1ZVRocmVzaG9sZC50aHJlc2hvbGR9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtdGV4dC1lbnRyeSBwZXJmLXRhYmxlLWNsaWNrYWJsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRNb2RlbE5hbWVfKGluZGV4KV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWFjYyBwZXJmLXRhYmxlLWNsaWNrYWJsZSIgb24tdGFwPSJ0b2dnbGVQZXJmUm93Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7ZmVhdHVyZVZhbHVlVGhyZXNob2xkLnRocmVzaG9sZH19Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS10ZXh0LWVudHJ5IHBlcmYtdGFibGUtbnVtLWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2dldE11bHRpQ2xhc3NBY2N1cmFjeU1vZGVsSW5kZXgoaW5mZXJlbmNlU3RhdHNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBmZWF0dXJlVmFsdWVUaHJlc2hvbGQpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e2ZlYXR1cmVWYWx1ZVRocmVzaG9sZC5vcGVuZWR9fSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZW50cnktZXhwYW5kZWQgZmxleC1yb3ctcmV2ZXJzZSBzY3JvbGwteCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3VsZFNob3dGZWF0dXJlUGVyZkNoYXJ0c18oc2VsZWN0ZWRMYWJlbEZlYXR1cmUsIHNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSwgaW5mZXJlbmNlcyldXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmcy1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29uZi10ZXh0Ij5Db25mdXNpb24gbWF0cml4PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tpbmZlcmVuY2VTdGF0c19dXSIgYXM9ImluZmVyZW5jZVN0YXQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRmLWNvbmZ1c2lvbi1tYXRyaXggY291bnRzPSJbW2dldE11bHRpQ2xhc3NDb25mTWF0cml4KGluZmVyZW5jZVN0YXRzXywgaW5kZXgsIGZlYXR1cmVWYWx1ZVRocmVzaG9sZCldXSIgbGFiZWw9IltbZ2V0Q29uZnVzaW9uTWF0cml4TGFiZWwoaW5kZXgsIG51bU1vZGVscyldXSIgYmFja2dyb3VuZD0iW1tnZXRDb25mdXNpb25NYXRyaXhDb2xvcihpbmRleCldXSIgYWxsLWl0ZW1zPSJbW2FsbENvbmZNYXRyaXhMYWJlbHNdXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RmLWNvbmZ1c2lvbi1tYXRyaXg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbYWxsQ29uZk1hdHJpeExhYmVsc11dIiBhcz0ibGFiZWwiIGluZGV4LWFzPSJsYWJlbEluZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmZzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi1jdXJ2ZS10ZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9DIGN1cnZlIGZvciBbW2dldExhYmVsKGxhYmVsSW5kKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvLW91dGxpbmUiIGNsYXNzPSJpbmZvLWljb24gdGhyZXNob2xkLWluZm8taWNvbiBuby1wYWRkaW5nIiBvbi10YXA9Im9wZW5EaWFsb2ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0icmlnaHQiIHZlcnRpY2FsLWFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST0MgY3VydmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSByZWNlaXZlciBvcGVyYXRpbmcgY2hhcmFjdGVyaXN0aWMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChST0MpIGN1cnZlIHBsb3RzIHRoZSB0cnVlIHBvc2l0aXZlIHJhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUUFIpIGFnYWluc3QgdGhlIGZhbHNlIHBvc2l0aXZlIHJhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGUFIpIGF0IHZhcmlvdXMgY2xhc3NpZmljYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZHMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciB0aGlzIG11bHRpLWNsYXNzIGNsYXNzaWZpY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ibGVtLCB3ZSBwbG90IG9uZSBST0MgY3VydmUgZm9yIGVhY2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzLCBhdCBlYWNoIHRpbWUgY29uc2lkZXJpbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBpbiBxdWVzdGlvbiBhcyB0aGUgcG9zaXRpdmUgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYWxsIHRoZSBvdGhlcnMgYXMgbmVnYXRpdmVzICg8aT5pLmUuPC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGk+YmluYXJpemVkPC9pPiB2ZXJzaW9ucyBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JsZW0pLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi1jdXJ2ZS14LWxhYmVsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UgcG9zaXRpdmUgcmF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXktbGFiZWwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlIHBvc2l0aXZlIHJhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZ6LWxpbmUtY2hhcnQyIGlkPSJbW2dldFJvY0NoYXJ0TGFiZWxJZChsYWJlbEluZCwgaW5kZXgpXV0iIHgtYXhpcy1mb3JtYXR0ZXI9IltbZ2V0U2ltcGxlQXhpc0Zvcm1hdHRlcihheGlzUHJlY2lzaW9uKV1dIiB5LWF4aXMtZm9ybWF0dGVyPSJbW2dldFNpbXBsZUF4aXNGb3JtYXR0ZXIoYXhpc1ByZWNpc2lvbildXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Z6LWxpbmUtY2hhcnQyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtaG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtY3VydmUtdGV4dCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSIGN1cnZlIGZvciBbW2dldExhYmVsKGxhYmVsSW5kKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvLW91dGxpbmUiIGNsYXNzPSJpbmZvLWljb24gdGhyZXNob2xkLWluZm8taWNvbiBuby1wYWRkaW5nIiBvbi10YXA9Im9wZW5EaWFsb2ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItZGlhbG9nIGNsYXNzPSJkaWFsb2ctdGV4dCIgaG9yaXpvbnRhbC1hbGlnbj0icmlnaHQiIHZlcnRpY2FsLWFsaWduPSJib3R0b20iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+UFIgY3VydmU8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBwcmVjaXNpb24tcmVjYWxsIChQUikgY3VydmUgcGxvdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbiBhZ2FpbnN0IHJlY2FsbCBhdCB2YXJpb3VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbiB0aHJlc2hvbGRzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdGhpcyBtdWx0aS1jbGFzcyBjbGFzc2lmaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmxlbSwgd2UgcGxvdCBvbmUgUFIgY3VydmUgZm9yIGVhY2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzLCBhdCBlYWNoIHRpbWUgY29uc2lkZXJpbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBpbiBxdWVzdGlvbiBhcyB0aGUgcG9zaXRpdmUgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYWxsIHRoZSBvdGhlcnMgYXMgbmVnYXRpdmVzICg8aT5pLmUuPC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGk+YmluYXJpemVkPC9pPiB2ZXJzaW9ucyBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JsZW0pLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWRpYWxvZz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi1jdXJ2ZS14LWxhYmVsIj5SZWNhbGw8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtY3VydmUteS1sYWJlbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZWNpc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dnotbGluZS1jaGFydDIgaWQ9IltbZ2V0UHJDaGFydExhYmVsSWQobGFiZWxJbmQsIGluZGV4KV1dIiB4LWF4aXMtZm9ybWF0dGVyPSJbW2dldFNpbXBsZUF4aXNGb3JtYXR0ZXIoYXhpc1ByZWNpc2lvbildXSIgeS1heGlzLWZvcm1hdHRlcj0iW1tnZXRTaW1wbGVBeGlzRm9ybWF0dGVyKGF4aXNQcmVjaXNpb24pXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC92ei1saW5lLWNoYXJ0Mj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3VsZFNob3dPdmVyYWxsVGhyZXNob2xkZXJfKHNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSldXSI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1yb3ctZXhwYW5kZWQiPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtYXJyb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImFycm93LWRyb3AtZG93biIgb24tdGFwPSJ0b2dnbGVQZXJmUm93IiBkaXNhYmxlZD48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtdmFsIHBlcmYtdGFibGUtdGV4dC1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgZGF0YXBvaW50cwogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtY291bnQgcGVyZi10YWJsZS1udW0tZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXRNdWx0aUNsYXNzRmVhdHVyZVZhbHVlQ291bnQoaW5mZXJlbmNlU3RhdHNfKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcyQ9IltbZ2V0UGVyZlRhYmxlTW9kZWxDbGFzcyhudW1Nb2RlbHMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tvdmVyYWxsVGhyZXNob2xkc319Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS10ZXh0LWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2dldE1vZGVsTmFtZV8oaW5kZXgpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtYWNjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbaW5mZXJlbmNlU3RhdHNfXV0iIGFzPSJpbmZlcmVuY2VTdGF0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS10ZXh0LWVudHJ5IHBlcmYtdGFibGUtbnVtLWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2dldE11bHRpQ2xhc3NBY2N1cmFjeU1vZGVsSW5kZXgoaW5mZXJlbmNlU3RhdHNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZW50cnktZXhwYW5kZWQgZmxleC1yb3ctcmV2ZXJzZSBzY3JvbGwteCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG91bGRTaG93T3ZlcmFsbFBlcmZDaGFydHNfKHNlbGVjdGVkTGFiZWxGZWF0dXJlLCBzZWxlY3RlZEJyZWFrZG93bkZlYXR1cmUsIGluZmVyZW5jZXMpXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmZzLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbmYtdGV4dCI+Q29uZnVzaW9uIG1hdHJpeDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2luZmVyZW5jZVN0YXRzX11dIiBhcz0iaW5mZXJlbmNlU3RhdCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRmLWNvbmZ1c2lvbi1tYXRyaXggY291bnRzPSJbW2dldE11bHRpQ2xhc3NDb25mTWF0cml4KGluZmVyZW5jZVN0YXRzXywgaW5kZXgpXV0iIGxhYmVsPSJbW2dldENvbmZ1c2lvbk1hdHJpeExhYmVsKGluZGV4LCBudW1Nb2RlbHMpXV0iIGJhY2tncm91bmQ9IltbZ2V0Q29uZnVzaW9uTWF0cml4Q29sb3IoaW5kZXgpXV0iIGFsbC1pdGVtcz0iW1thbGxDb25mTWF0cml4TGFiZWxzXV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGYtY29uZnVzaW9uLW1hdHJpeD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbYWxsQ29uZk1hdHJpeExhYmVsc11dIiBhcz0ibGFiZWwiIGluZGV4LWFzPSJsYWJlbEluZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmcy1ob2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWhvbGRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi1jdXJ2ZS10ZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJPQyBjdXJ2ZSBmb3IgW1tnZXRMYWJlbChsYWJlbEluZCldXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImluZm8tb3V0bGluZSIgY2xhc3M9ImluZm8taWNvbiB0aHJlc2hvbGQtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249InJpZ2h0IiB2ZXJ0aWNhbC1hbGlnbj0iYm90dG9tIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj5ST0MgY3VydmU8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIHJlY2VpdmVyIG9wZXJhdGluZyBjaGFyYWN0ZXJpc3RpYyAoUk9DKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlIHBsb3RzIHRoZSB0cnVlIHBvc2l0aXZlIHJhdGUgKFRQUikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2FpbnN0IHRoZSBmYWxzZSBwb3NpdGl2ZSByYXRlIChGUFIpIGF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaW91cyBjbGFzc2lmaWNhdGlvbiB0aHJlc2hvbGRzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdGhpcyBtdWx0aS1jbGFzcyBjbGFzc2lmaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JsZW0sIHdlIHBsb3Qgb25lIFJPQyBjdXJ2ZSBmb3IgZWFjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzLCBhdCBlYWNoIHRpbWUgY29uc2lkZXJpbmcgdGhlIGNsYXNzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gcXVlc3Rpb24gYXMgdGhlIHBvc2l0aXZlIG9uZSBhbmQgYWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG90aGVycyBhcyBuZWdhdGl2ZXMgKDxpPmkuZS48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGk+YmluYXJpemVkPC9pPiB2ZXJzaW9ucyBvZiB0aGUgcHJvYmxlbSkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi1jdXJ2ZS14LWxhYmVsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlIHBvc2l0aXZlIHJhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXktbGFiZWwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSBwb3NpdGl2ZSByYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZ6LWxpbmUtY2hhcnQyIGlkPSJbW2dldFJvY0NoYXJ0TGFiZWxJZChsYWJlbCwgJycpXV0iIHgtYXhpcy1mb3JtYXR0ZXI9IltbZ2V0U2ltcGxlQXhpc0Zvcm1hdHRlcihheGlzUHJlY2lzaW9uKV1dIiB5LWF4aXMtZm9ybWF0dGVyPSJbW2dldFNpbXBsZUF4aXNGb3JtYXR0ZXIoYXhpc1ByZWNpc2lvbildXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC92ei1saW5lLWNoYXJ0Mj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtaG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXRleHQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFIgY3VydmUgZm9yIFtbZ2V0TGFiZWwobGFiZWxJbmQpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvLW91dGxpbmUiIGNsYXNzPSJpbmZvLWljb24gdGhyZXNob2xkLWluZm8taWNvbiBuby1wYWRkaW5nIiBvbi10YXA9Im9wZW5EaWFsb2ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1kaWFsb2cgY2xhc3M9ImRpYWxvZy10ZXh0IiBob3Jpem9udGFsLWFsaWduPSJyaWdodCIgdmVydGljYWwtYWxpZ249ImJvdHRvbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRpYWxvZy10aXRsZSI+UFIgY3VydmU8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIHByZWNpc2lvbi1yZWNhbGwgKFBSKSBjdXJ2ZSBwbG90cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbiBhZ2FpbnN0IHJlY2FsbCBhdCB2YXJpb3VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NpZmljYXRpb24gdGhyZXNob2xkcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIHRoaXMgbXVsdGktY2xhc3MgY2xhc3NpZmljYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ibGVtLCB3ZSBwbG90IG9uZSBQUiBjdXJ2ZSBmb3IgZWFjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzLCBhdCBlYWNoIHRpbWUgY29uc2lkZXJpbmcgdGhlIGNsYXNzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gcXVlc3Rpb24gYXMgdGhlIHBvc2l0aXZlIG9uZSBhbmQgYWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG90aGVycyBhcyBuZWdhdGl2ZXMgKDxpPmkuZS48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGk+YmluYXJpemVkPC9pPiB2ZXJzaW9ucyBvZiB0aGUgcHJvYmxlbSkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi1jdXJ2ZS14LWxhYmVsIj5SZWNhbGw8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLWN1cnZlLXktbGFiZWwiPlByZWNpc2lvbjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ei1saW5lLWNoYXJ0MiBpZD0iW1tnZXRQckNoYXJ0TGFiZWxJZChsYWJlbCwgJycpXV0iIHgtYXhpcy1mb3JtYXR0ZXI9IltbZ2V0U2ltcGxlQXhpc0Zvcm1hdHRlcihheGlzUHJlY2lzaW9uKV1dIiB5LWF4aXMtZm9ybWF0dGVyPSJbW2dldFNpbXBsZUF4aXNGb3JtYXR0ZXIoYXhpc1ByZWNpc2lvbildXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC92ei1saW5lLWNoYXJ0Mj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2lzUmVncmVzc2lvbl8obW9kZWxUeXBlKV1dIiByZXN0YW1wPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXRpdGxlLXJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZmxleCI+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgW1tnZXROb1RocmVzaG9sZFBlcmZUYWJsZVRpdGxlKHNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRTZWNvbmRCcmVha2Rvd25GZWF0dXJlLAogICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlVmFsdWVUaHJlc2hvbGRzKV1dCiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvLW91dGxpbmUiIGNsYXNzPSJpbmZvLWljb24gcGVyZm9ybWFuY2UtaW5mby1pY29uIG5vLXBhZGRpbmciIG9uLXRhcD0ib3BlbkRpYWxvZyI+CiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWRpYWxvZyBjbGFzcz0iZGlhbG9nLXRleHQiIGhvcml6b250YWwtYWxpZ249ImF1dG8iIHZlcnRpY2FsLWFsaWduPSJhdXRvIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGlhbG9nLXRpdGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdyZXNzaW9uIFBlcmZvcm1hbmNlIFRhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0aGUgZ3JvdW5kIHRydXRoIGZlYXR1cmUgdG8gZXhwbG9yZSBtb2RlbAogICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlLgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICBTbGljZSB0aGUgZGF0YXNldCBhbmQgZXhwbG9yZSBtb2RlbCBwZXJmb3JtYW5jZSBieQogICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlLgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IGxhYmVsPSJTb3J0IGJ5IiBjbGFzcz0idGhyZXNob2xkLWRyb3Bkb3duIHBlcmYtdGFibGUtc29ydC1tZW51Ij4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e3NlbGVjdGVkRmVhdHVyZVNvcnR9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9Im5hbWUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2dldEZlYXR1cmVTb3J0QnkobW9kZWxUeXBlLCBtdWx0aUNsYXNzKV1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBuYW1lPSJbW2l0ZW1dXSI+W1tpdGVtXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtYXJyb3ciPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtdmFsIj5GZWF0dXJlIFZhbHVlPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1jb3VudCI+Q291bnQ8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWVycm9yIj5NZWFuIGVycm9yPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1lcnJvciI+TWVkaWFuIGVycm9yPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1lcnJvciI+TWVhbiBhYnNvbHV0ZSBlcnJvcjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZXJyb3IiPk1lZGlhbiBhYnNvbHV0ZSBlcnJvcjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtc3EtZXJyb3IiPk1lYW4gc3F1YXJlZCBlcnJvcjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtc3EtZXJyb3IiPk1lZGlhbiBzcXVhcmVkIGVycm9yPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWVudHJpZXMtaG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW3JlZ3Jlc3Npb25FbnRyaWVzX11dIj4KICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1hcnJvdyI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS12YWwgcGVyZi10YWJsZS10ZXh0LWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbaXRlbS5uYW1lXV0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWNvdW50IHBlcmYtdGFibGUtbnVtLWVudHJ5IHBlcmYtdGFibGUtdGV4dC1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2l0ZW0uY291bnRdXQogICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBlcmYtdGFibGUtZXJyb3IgcGVyZi10YWJsZS1udW0tZW50cnkgcGVyZi10YWJsZS10ZXh0LWVudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbZm9ybWF0RXJyb3IoaXRlbS5tZWFuRXJyb3IpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWVycm9yIHBlcmYtdGFibGUtbnVtLWVudHJ5IHBlcmYtdGFibGUtdGV4dC1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2Zvcm1hdEVycm9yKGl0ZW0ubWVkaWFuRXJyb3IpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLWVycm9yIHBlcmYtdGFibGUtbnVtLWVudHJ5IHBlcmYtdGFibGUtdGV4dC1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2Zvcm1hdEVycm9yKGl0ZW0ubWVhbkFic0Vycm9yKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1zcS1lcnJvciBwZXJmLXRhYmxlLW51bS1lbnRyeSBwZXJmLXRhYmxlLXRleHQtZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tmb3JtYXRFcnJvcihpdGVtLm1lZGlhbkFic0Vycm9yKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icGVyZi10YWJsZS1lcnJvciBwZXJmLXRhYmxlLW51bS1lbnRyeSBwZXJmLXRhYmxlLXRleHQtZW50cnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1tmb3JtYXRFcnJvcihpdGVtLm1lYW5TcXVhcmVkRXJyb3IpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwZXJmLXRhYmxlLXNxLWVycm9yIHBlcmYtdGFibGUtbnVtLWVudHJ5IHBlcmYtdGFibGUtdGV4dC1lbnRyeSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbW2Zvcm1hdEVycm9yKGl0ZW0ubWVkaWFuU3F1YXJlZEVycm9yKV1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3RhdHMtdGFiIj4KICAgICAgICAgICAgICA8ZmFjZXRzLW92ZXJ2aWV3IGlkPSJvdmVydmlldyIgc2VhcmNoLXN0cmluZz0ie3tmZWF0dXJlU2VhcmNoVmFsdWV9fSI+PC9mYWNldHMtb3ZlcnZpZXc+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9pcm9uLXBhZ2VzPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tc3BsaXQtbGF5b3V0Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbF0pIHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICA6aG9zdCA6OnNsb3R0ZWQoKikgewogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdCA+ICNzcGxpdHRlciB7CiAgICAgICAgZmxleDogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgICBtaW4td2lkdGg6IDhweDsKICAgICAgICBtaW4taGVpZ2h0OiA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGl2aWRlci1jb2xvciwgI2NjYyk7CiAgICAgICAgZmlsbDogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yLCAjZmZmKTsKICAgICAgICBAYXBwbHkgLS12YWFkaW4tc3BsaXQtbGF5b3V0LXNwbGl0dGVyOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFt2ZXJ0aWNhbF0pKSA+ICNzcGxpdHRlciB7CiAgICAgICAgY3Vyc29yOiBldy1yZXNpemU7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbF0pID4gI3NwbGl0dGVyIHsKICAgICAgICBjdXJzb3I6IG5zLXJlc2l6ZTsKICAgICAgfQoKICAgICAgI2hhbmRsZSwKICAgICAgI3NwbGl0dGVyIDo6c2xvdHRlZChbc2xvdD1oYW5kbGVdKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZlcnRpY2FsXSkgPiAjc3BsaXR0ZXIgI2hhbmRsZSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgcm90YXRlKDkwZGVnKTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzbG90IGlkPSJwcmltYXJ5IiBuYW1lPSJwcmltYXJ5Ij48L3Nsb3Q+CiAgICA8ZGl2IGlkPSJzcGxpdHRlciIgb24tdHJhY2s9Il9vbkhhbmRsZVRyYWNrIiBvbi1kb3duPSJfcHJldmVudERlZmF1bHQiPgogICAgICA8c2xvdCBuYW1lPSJoYW5kbGUiPgogICAgICAgIDxzdmcgaWQ9ImhhbmRsZSIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIj4KICAgICAgICAgIDxyZWN0IHg9IjE5IiB5PSI4IiB3aWR0aD0iMiIgaGVpZ2h0PSIyNCI+PC9yZWN0PgogICAgICAgIDwvc3ZnPgogICAgICA8L3Nsb3Q+CiAgICA8L2Rpdj4KICAgIDxzbG90IGlkPSJzZWNvbmRhcnkiIG5hbWU9InNlY29uZGFyeSI+PC9zbG90PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1xdWVyeS1wYW5lIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJwYW5lIj4KICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWwgaWQ9Imh5cGVycGFyYW1ldGVycy1tZXRyaWNzLXN0YXR1c2VzIj4KICAgICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsIGlkPSJoeXBlcnBhcmFtZXRlcnMtbWV0cmljcyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24gaHlwZXJwYXJhbWV0ZXJzIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5IeXBlcnBhcmFtZXRlcnM8L2Rpdj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e19ocGFyYW1zfX0iIGFzPSJocGFyYW0iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaHBhcmFtIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7aHBhcmFtLmRpc3BsYXllZH19IiBjbGFzcz0iaHBhcmFtLWNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICBbW19ocGFyYW1OYW1lKGhwYXJhbS5pbmZvKV1dCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hwYXJhbS5maWx0ZXIuZG9tYWluRGlzY3JldGVdXSI+CiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tocGFyYW0uZmlsdGVyLmRvbWFpbkRpc2NyZXRlXV0iPgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7aXRlbS5jaGVja2VkfX0iIGNsYXNzPSJkaXNjcmV0ZS12YWx1ZS1jaGVja2JveCIgb24tY2hhbmdlPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICBbW19wcmV0dHlQcmludChpdGVtLnZhbHVlKV1dCiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaHBhcmFtLmZpbHRlci5pbnRlcnZhbF1dIj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9Ik1pbiIgdmFsdWU9Int7aHBhcmFtLmZpbHRlci5pbnRlcnZhbC5taW4udmFsdWV9fSIgYWxsb3dlZF9wYXR0ZXJuPSJbMC05LmVcLV0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgZXJyb3ItbWVzc2FnZT0iSW52YWxpZCBpbnB1dCIgaW52YWxpZD0iW1tocGFyYW0uZmlsdGVyLmludGVydmFsLm1pbi5pbnZhbGlkXV0iIHBsYWNlaG9sZGVyPSItaW5maW5pdHkiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGxhYmVsPSJNYXgiIHZhbHVlPSJ7e2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWwubWF4LnZhbHVlfX0iIGFsbG93ZWRfcGF0dGVybj0iWzAtOS5lXC1dIiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiIGludmFsaWQ9IltbaHBhcmFtLmZpbHRlci5pbnRlcnZhbC5tYXguaW52YWxpZF1dIiBwbGFjZWhvbGRlcj0iK2luZmluaXR5Ij4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hwYXJhbS5maWx0ZXIucmVnZXhwXV0iPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iUmVndWxhciBleHByZXNzaW9uIiB2YWx1ZT0ie3tocGFyYW0uZmlsdGVyLnJlZ2V4cH19IiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBtZXRyaWNzIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5NZXRyaWNzPC9kaXY+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tfbWV0cmljc319IiBhcz0ibWV0cmljIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1ldHJpYyI+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3ttZXRyaWMuZGlzcGxheWVkfX0iIGNsYXNzPSJtZXRyaWMtY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgIFtbX21ldHJpY05hbWUobWV0cmljLmluZm8pXV0KICAgICAgICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5saW5lLWVsZW1lbnQiPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iTWluIiB2YWx1ZT0ie3ttZXRyaWMuZmlsdGVyLmludGVydmFsLm1pbi52YWx1ZX19IiBhbGxvd2VkLXBhdHRlcm49IlswLTkuZVwtXSIgb24tdmFsdWUtY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIiBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IiBpbnZhbGlkPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWluLmludmFsaWR9fSIgcGxhY2Vob2xkZXI9Ii1pbmZpbml0eSI+CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50Ij4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9Ik1heCIgYWxsb3dlZC1wYXR0ZXJuPSJbMC05LmVcLV0iIHZhbHVlPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWF4LnZhbHVlfX0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgZXJyb3ItbWVzc2FnZT0iSW52YWxpZCBpbnB1dCIgaW52YWxpZD0ie3ttZXRyaWMuZmlsdGVyLmludGVydmFsLm1heC5pbnZhbGlkfX0iIHBsYWNlaG9sZGVyPSIraW5maW5pdHkiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIHN0YXR1cyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlN0YXR1czwvZGl2PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zdGF0dXNlc11dIiBhcz0ic3RhdHVzIj4KICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tzdGF0dXMuYWxsb3dlZH19IiBvbi1jaGFuZ2U9Il9xdWVyeVNlcnZlciI+CiAgICAgICAgICAgICAgICBbW3N0YXR1cy5kaXNwbGF5TmFtZV1dCiAgICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbCBpZD0ic29ydGluZy1wYWdpbmciPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBzb3J0aW5nIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+U29ydGluZzwvZGl2PgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iU29ydCBieSIgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiIGhvcml6b250YWwtYWxpZ249ImxlZnQiPgogICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tfc29ydEJ5SW5kZXh9fSIgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfaHBhcmFtc11dIiBhcz0iaHBhcmFtIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgW1tfaHBhcmFtTmFtZShocGFyYW0uaW5mbyldXQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfbWV0cmljc11dIiBhcz0ibWV0cmljIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgW1tfbWV0cmljTmFtZShtZXRyaWMuaW5mbyldXQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iRGlyZWN0aW9uIiBvbi1zZWxlY3RlZC1pdGVtLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e19zb3J0RGlyZWN0aW9ufX0iPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+QXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+RGVzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBwYWdpbmciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5QYWdpbmc8L2Rpdj4KICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICBOdW1iZXIgb2YgbWF0Y2hpbmcgc2Vzc2lvbiBncm91cHM6IFtbX3RvdGFsU2Vzc2lvbkdyb3Vwc0NvdW50U3RyXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50IHBhZ2UtbnVtYmVyLWlucHV0Ij4KICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9IlBhZ2UgIyIgdmFsdWU9Int7X3BhZ2VOdW1iZXJJbnB1dC52YWx1ZX19IiBhbGxvd2VkLXBhdHRlcm49IlswLTldIiBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IiBpbnZhbGlkPSJbW19wYWdlTnVtYmVySW5wdXQuaW52YWxpZF1dIiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgPGRpdiBzbG90PSJzdWZmaXgiIGNsYXNzPSJwYWdlLXN1ZmZpeCI+LyBbW19wYWdlQ291bnRTdHJdXTwvZGl2PgogICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmxpbmUtZWxlbWVudCBwYWdlLXNpemUtaW5wdXQiPgogICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iTWF4ICMgb2Ygc2Vzc2lvbiBncm91cHMgcGVyIHBhZ2U6IiB2YWx1ZT0ie3tfcGFnZVNpemVJbnB1dC52YWx1ZX19IiBhbGxvd2VkLXBhdHRlcm49IlswLTldIiBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IiBpbnZhbGlkPSJbW19wYWdlU2l6ZUlucHV0LmludmFsaWRdXSIgb24tdmFsdWUtY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIj4KICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgPC92YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIC5wYW5lIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIC5zZWN0aW9uIHsKICAgICAgICBtYXJnaW46IDVweCAxMHB4IDVweCAxMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KICAgICAgLnNlY3Rpb24tdGl0bGUgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIG1hcmdpbi1ib3R0b206IDdweDsKICAgICAgfQogICAgICAjaHlwZXJwYXJhbWV0ZXJzLW1ldHJpY3Mtc3RhdHVzZXMgewogICAgICAgIGZsZXgtYmFzaXM6IDcwJTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgI2h5cGVycGFyYW1ldGVycy1tZXRyaWNzIHsKICAgICAgICBmbGV4LWJhc2lzOiA5MCU7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICAgIC5oeXBlcnBhcmFtZXRlcnMgewogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICAgIC5tZXRyaWNzIHsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAuc3RhdHVzZXMgewogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CiAgICAgICNzb3J0aW5nLXBhZ2luZyB7CiAgICAgICAgZmxleC1iYXNpczogMzAlOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICAuc29ydGluZyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgLnBhZ2luZyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgLmRpc2NyZXRlLXZhbHVlLWNoZWNrYm94LAogICAgICAubWV0cmljLWNoZWNrYm94LAogICAgICAuaHBhcmFtLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAuZGlzY3JldGUtdmFsdWUtY2hlY2tib3ggewogICAgICAgIG1hcmdpbi1sZWZ0OiAyMHB4OwogICAgICB9CiAgICAgIC5ocGFyYW0sCiAgICAgIC5tZXRyaWMgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5pbmxpbmUtZWxlbWVudCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiA0MCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgICAgLnBhZ2UtbnVtYmVyLWlucHV0IHsKICAgICAgICB3aWR0aDogMjAlOwogICAgICB9CiAgICAgIC5wYWdlLXNpemUtaW5wdXQgewogICAgICAgIHdpZHRoOiA2MCU7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIHBhcGVyLWxpc3Rib3ggewogICAgICAgIG1heC1oZWlnaHQ6IDE1ZW07CiAgICAgIH0KICAgICAgLnBhZ2Utc3VmZml4IHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItaGVhZGVyLXBhbmVsIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtdmVydGljYWw7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWw7CiAgICAgIH0KCiAgICAgICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgICB9CgogICAgICAjbWFpblBhbmVsIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtdmVydGljYWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLWJvZHk7CiAgICAgIH0KCiAgICAgICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtY29udGFpbmVyOwogICAgICB9CgogICAgICAvKgogICAgICAgKiBtb2RlOiBzY3JvbGwKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPXNjcm9sbF0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtc2Nyb2xsLWNvbnRhaW5lcjsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgOmhvc3QoW21vZGU9c2Nyb2xsXSkgewogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogY292ZXIKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPWNvdmVyXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1jb3Zlci1jb250YWluZXI7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQoKICAgICAgOmhvc3QoW21vZGU9Y292ZXJdKSAjbWFpblBhbmVsIHsKICAgICAgICBwb3NpdGlvbjogc3RhdGljOwogICAgICB9CgogICAgICAvKgogICAgICAgKiBtb2RlOiBzdGFuZGFyZAogICAgICAgKi8KICAgICAgOmhvc3QoW21vZGU9c3RhbmRhcmRdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXN0YW5kYXJkLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogc2VhbWVkCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1zZWFtZWRdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXNlYW1lZC1jb250YWluZXI7CiAgICAgIH0KCgogICAgICAvKgogICAgICAgKiBtb2RlOiB3YXRlcmZhbGwKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPXdhdGVyZmFsbF0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtd2F0ZXJmYWxsLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogd2F0ZXJmYWxsLXRhbGwKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPXdhdGVyZmFsbC10YWxsXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC13YXRlcmZhbGwtdGFsbC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgICNkcm9wU2hhZG93IHsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuNXM7CiAgICAgICAgaGVpZ2h0OiA2cHg7CiAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMHB4IDVweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXNoYWRvdzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI2Ryb3BTaGFkb3cuaGFzLXNoYWRvdyB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgI21haW5Db250YWluZXIgPiA6OnNsb3R0ZWQoLmZpdCkgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KCiAgICA8L3N0eWxlPgoKICAgIDxzbG90IGlkPSJoZWFkZXJTbG90IiBuYW1lPSJoZWFkZXIiPjwvc2xvdD4KCiAgICA8ZGl2IGlkPSJtYWluUGFuZWwiPgogICAgICA8ZGl2IGlkPSJtYWluQ29udGFpbmVyIiBjbGFzcyQ9IltbX2NvbXB1dGVNYWluQ29udGFpbmVyQ2xhc3MobW9kZSldXSI+CiAgICAgICAgPHNsb3Q+PC9zbG90PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBpZD0iZHJvcFNoYWRvdyI+PC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10b29sYmFyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQ6IHZhcigtLXBhcGVyLXRvb2xiYXItaGVpZ2h0LCA2NHB4KTsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQ6IHZhcigtLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0LCA1NnB4KTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItaGVpZ2h0KTsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci10b29sYmFyLWJhY2tncm91bmQsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9vbGJhci1jb2xvciwgdmFyKC0tZGFyay10aGVtZS10ZXh0LWNvbG9yKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhcjsKICAgICAgfQoKICAgICAgOmhvc3QoLmFuaW1hdGUpIHsKICAgICAgICB0cmFuc2l0aW9uOiB2YXIoLS1wYXBlci10b29sYmFyLXRyYW5zaXRpb24sIGhlaWdodCAwLjE4cyBlYXNlLWluKTsKICAgICAgfQoKICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQpICogMik7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci1tZWRpdW07CiAgICAgIH0KCiAgICAgIDpob3N0KC50YWxsKSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQpICogMyk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci10YWxsOwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLWhlaWdodCk7CiAgICAgICAgcGFkZGluZzogMCAxNnB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci1jb250ZW50OwogICAgICB9CgogICAgICAvKgogICAgICAgKiBUT0RPOiBXaGVyZSBzaG91bGQgbWVkaWEgcXVlcnkgYnJlYWtwb2ludHMgbGl2ZSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBlbGVtZW50cz8KICAgICAgICovCgogICAgICBAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpIHsKICAgICAgICA6aG9zdCB7CiAgICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQpOwogICAgICAgIH0KCiAgICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSB7CiAgICAgICAgICBoZWlnaHQ6IGNhbGModmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCkgKiAyKTsKICAgICAgICB9CgogICAgICAgIDpob3N0KC50YWxsKSB7CiAgICAgICAgICBoZWlnaHQ6IGNhbGModmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCkgKiAzKTsKICAgICAgICB9CgogICAgICAgIC50b29sYmFyLXRvb2xzIHsKICAgICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAjdG9wQmFyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC8qIG1pZGRsZSBiYXIgKi8KICAgICAgI21pZGRsZUJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICA6aG9zdCgudGFsbCkgI21pZGRsZUJhciwKICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSAjbWlkZGxlQmFyIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDAlKTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwJSk7CiAgICAgIH0KCiAgICAgIC8qIGJvdHRvbSBiYXIgKi8KICAgICAgI2JvdHRvbUJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICAvKgogICAgICAgKiBtYWtlIGVsZW1lbnRzIChlLmcuIGJ1dHRvbnMpIHJlc3BvbmQgdG8gbW91c2UvdG91Y2ggZXZlbnRzCiAgICAgICAqCiAgICAgICAqIGAudG9vbGJhci10b29sc2AgZGlzYWJsZXMgdG91Y2ggZXZlbnRzIHNvIG11bHRpcGxlIHRvb2xiYXJzIGNhbiBzdGFjayBhbmQgbm90CiAgICAgICAqIGFic29yYiBldmVudHMuIEFsbCBjaGlsZHJlbiBtdXN0IGhhdmUgcG9pbnRlciBldmVudHMgcmUtZW5hYmxlZCB0byB3b3JrIGFzCiAgICAgICAqIGV4cGVjdGVkLgogICAgICAgKi8KICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoKjpub3QoW2Rpc2FibGVkXSkpIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLXRvb2xzID4gOjpzbG90dGVkKC50aXRsZSkgewogICAgICAgIG1hcmdpbi1sZWZ0OiA1NnB4OwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZChwYXBlci1pY29uLWJ1dHRvbiArIC50aXRsZSkgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVGhlIC0tcGFwZXItdG9vbGJhci10aXRsZSBtaXhpbiBpcyBhcHBsaWVkIGhlcmUgaW5zdGVhZCBvZiBhYm92ZSB0bwogICAgICAgKiBmaXggdGhlIGlzc3VlIHdpdGggbWFyZ2luLWxlZnQgYmVpbmcgaWdub3JlZCBkdWUgdG8gY3NzIG9yZGVyaW5nLgogICAgICAgKi8KICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci10aXRsZTsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQocGFwZXItaWNvbi1idXR0b25baWNvbj1tZW51XSkgewogICAgICAgIG1hcmdpbi1yaWdodDogMjRweDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLmZpdCkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IGF1dG87CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAvKiBUT0RPKG5vbXMpOiBVbnRpbCB3ZSBoYXZlIGEgYmV0dGVyIHNvbHV0aW9uIGZvciBjbGFzc2VzIHRoYXQgZG9uJ3QgdXNlCiAgICAgICAqIC9kZWVwLyBjcmVhdGUgb3VyIG93bi4KICAgICAgICovCiAgICAgIC5zdGFydC1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1zdGFydC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5jZW50ZXItanVzdGlmaWVkIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgfQoKICAgICAgLmVuZC1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1lbmQtanVzdGlmaWVkOwogICAgICB9CgogICAgICAuYXJvdW5kLWp1c3RpZmllZCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWFyb3VuZC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1qdXN0aWZpZWQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0idG9wQmFyIiBjbGFzcyQ9InRvb2xiYXItdG9vbHMgW1tfY29tcHV0ZUJhckV4dHJhQ2xhc3NlcyhqdXN0aWZ5KV1dIj4KICAgICAgPHNsb3QgbmFtZT0idG9wIj48L3Nsb3Q+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJtaWRkbGVCYXIiIGNsYXNzJD0idG9vbGJhci10b29scyBbW19jb21wdXRlQmFyRXh0cmFDbGFzc2VzKG1pZGRsZUp1c3RpZnkpXV0iPgogICAgICA8c2xvdCBuYW1lPSJtaWRkbGUiPjwvc2xvdD4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9ImJvdHRvbUJhciIgY2xhc3MkPSJ0b29sYmFyLXRvb2xzIFtbX2NvbXB1dGVCYXJFeHRyYUNsYXNzZXMoYm90dG9tSnVzdGlmeSldXSI+CiAgICAgIDxzbG90IG5hbWU9ImJvdHRvbSI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1zY2FsZS1hbmQtY29sb3ItY29udHJvbHMiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtcGFuZWwiPgogICAgICAKICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IkNvbG9yIGJ5IiBpZD0iY29sb3JCeURyb3BEb3duTWVudSIgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCI+CiAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e29wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4fX0iIGlkPSJjb2xvckJ5TGlzdEJveCI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW29wdGlvbnMuY29sdW1uc11dIiBhcz0iY29sdW1uIiBpZD0iY29sb3JCeUNvbHVtblRlbXBsYXRlIj4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gZGlzYWJsZWQ9IltbIV9pc051bWVyaWNDb2x1bW4oY29sdW1uLmluZGV4KV1dIj4KICAgICAgICAgICAgICBbW2NvbHVtbi5uYW1lXV0KICAgICAgICAgICAgPC9wYXBlci1pdGVtPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KCiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJjb2x1bW5zLWNvbnRhaW5lciI+CiAgICAgICAgCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tvcHRpb25zLmNvbHVtbnN9fSIgYXM9ImNvbHVtbiI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzTnVtZXJpY0NvbHVtbihjb2x1bW4uaW5kZXgpXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2x1bW4iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbHVtbi10aXRsZSI+CiAgICAgICAgICAgICAgICBbW2NvbHVtbi5uYW1lXV0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGNsYXNzPSJzY2FsZS1yYWRpby1ncm91cCIgc2VsZWN0ZWQ9Int7Y29sdW1uLnNjYWxlfX0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9IkxJTkVBUiI+CiAgICAgICAgICAgICAgICAgICAgTGluZWFyCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ibG9nU2NhbGVCdXR0b25fW1tjb2x1bW4ubmFtZV1dIiBuYW1lPSJMT0ciIGRpc2FibGVkPSJbWyFfYWxsb3dMb2dTY2FsZShjb2x1bW4sIHNlc3Npb25Hcm91cHMuKildXSI+CiAgICAgICAgICAgICAgICAgICAgTG9nYXJpdGhtaWMKICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iUVVBTlRJTEUiPgogICAgICAgICAgICAgICAgICAgIFF1YW50aWxlCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLmNvbnRyb2wtcGFuZWwgewogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CiAgICAgIC5jb2x1bW4gewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgICAgICBib3JkZXI6IHNvbGlkIDFweCBkYXJrZ3JheTsKICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgIH0KICAgICAgLmNvbHVtbi10aXRsZSB7CiAgICAgICAgLyogRml0IGV2ZXJ5IHRpdGxlIGluIG9uZSBsaW5lIHNvIHRoZSByYWRpbyBib3hlcyBhbGlnbiB2ZXJ0aWNhbGx5LiAqLwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KICAgICAgLmNvbHVtbnMtY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KICAgICAgLnNjYWxlLXJhZGlvLWdyb3VwIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgcGFkZGluZzogMnB4OwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIHBhcGVyLWxpc3Rib3ggewogICAgICAgIG1heC1oZWlnaHQ6IDE1ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWFjdGl2ZS1pdGVtLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tZ3JpZC10YWJsZSAudmFhZGluLWdyaWQtcm93W2FjdGl2ZV0gLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1ib2R5LXJvdy1hY3RpdmUtY2VsbCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS10YWJsZS1zY3JvbGwtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgICN0YWJsZSB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgICAgICB6LWluZGV4OiAtMjsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbaW9zXSAjdGFibGUgewogICAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdICN0YWJsZSB7CiAgICAgICAgdHJhbnNmb3JtOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS1zY3JvbGwtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IHsKICAgICAgICB6LWluZGV4OiAtMTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdIHsKICAgICAgICAvKiBBbnkgdmFsdWUgb3RoZXIgdGhhbiDigJhub25l4oCZIGZvciB0aGUgdHJhbnNmb3JtIHJlc3VsdHMgaW4gdGhlIGNyZWF0aW9uIG9mIGJvdGggYSBzdGFja2luZyBjb250ZXh0IGFuZAogICAgICAgIGEgY29udGFpbmluZyBibG9jay4gVGhlIG9iamVjdCBhY3RzIGFzIGEgY29udGFpbmluZyBibG9jayBmb3IgZml4ZWQgcG9zaXRpb25lZCBkZXNjZW5kYW50cy4gKi8KICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciwKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdIHZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtmaXhlZC1zZWN0aW9uc10gdmFhZGluLWdyaWQtdGFibGUtYm9keSNpdGVtcyB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtY2VsbCI+PC9kb20tbW9kdWxlPgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLWNlbGwiPjwvZG9tLW1vZHVsZT4KPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1jZWxsIj48L2RvbS1tb2R1bGU+Cjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1zaXplci1jZWxsIj48L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtc2l6ZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAuY2VsbCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDA7CiAgICAgICAgZm9udC1zaXplOiAxcHg7CiAgICAgICAgbWFyZ2luLXRvcDogLTFlbTsKICAgICAgfQoKICAgICAgLmNlbGxbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jb2x1bW5zXV0iIGFzPSJjb2x1bW4iPgogICAgICA8dmFhZGluLWdyaWQtc2l6ZXItY2VsbCBjbGFzcz0iY2VsbCIgY29sdW1uPSJbW2NvbHVtbl1dIj4mbmJzcDs8L3ZhYWRpbi1ncmlkLXNpemVyLWNlbGw+CiAgICA8L3RlbXBsYXRlPgoKICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLW91dGVyLXNjcm9sbGVyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbcGFzc3Rocm91Z2hdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpb3NdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGFsbDsKICAgICAgICB6LWluZGV4OiAtMzsKICAgICAgfQoKICAgICAgOmhvc3QoW2lvc11bc2Nyb2xsaW5nXSkgewogICAgICAgIHotaW5kZXg6IDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgoKICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgOmhvc3QgewogICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgei1pbmRleDogLTM7CiAgICAgICBoZWlnaHQ6IDA7CiAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgIH0KCiAgICAgOmhvc3QoOmZvY3VzKSwKICAgICAucHJpbWFyeTpmb2N1cywKICAgICA6OnNsb3R0ZWQoLnByaW1hcnk6Zm9jdXMpLAogICAgIC5zZWNvbmRhcnk6Zm9jdXMsCiAgICAgOjpzbG90dGVkKC5zZWNvbmRhcnk6Zm9jdXMpIHsKICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgfQogICAgPC9zdHlsZT4KCiAgICAKICAgIDxkaXYgY2xhc3M9InByaW1hcnkiIHRhYmluZGV4PSIwIiByb2xlPSJncmlkY2VsbCIgb24tZm9jdXM9Il9vbkJhaXRGb2N1cyIgb24tYmx1cj0iX29uQmFpdEJsdXIiPjxkaXYgYXJpYS1oaWRkZW49InRydWUiPiZuYnNwOzwvZGl2PjwvZGl2PgogICAgPGRpdiBjbGFzcz0ic2Vjb25kYXJ5IiB0YWJpbmRleD0iLTEiIHJvbGU9ImdyaWRjZWxsIiBvbi1mb2N1cz0iX29uQmFpdEZvY3VzIiBvbi1ibHVyPSJfb25CYWl0Qmx1ciI+PGRpdiBhcmlhLWhpZGRlbj0idHJ1ZSI+Jm5ic3A7PC9kaXY+PC9kaXY+CgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXJvdyI+PC9kb20tbW9kdWxlPgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLXJvdyI+PC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1yb3ctZGV0YWlscy1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgW2RldGFpbHNjZWxsXSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXJvdy1kZXRhaWxzLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAudmFhZGluLWdyaWQtY2VsbFtkZXRhaWxzY2VsbF0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtYm9keS1yb3ctZGV0YWlscy1jZWxsKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtZGF0YS1wcm92aWRlci10aGVtYWJpbGl0eS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KCiAgICAgIC8qIEFuaW0gKi8KICAgICAgQGtleWZyYW1lcyB2YWFkaW4tZ3JpZC1zcGluLTM2MCB7CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgIH0KICAgICAgfQogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgdmFhZGluLWdyaWQtc3Bpbi0zNjAgewogICAgICAgIDEwMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNzcGlubmVyIHsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wcmltYXJ5LWNvbG9yLCAjMDNBOUY0KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItdG9wLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtOHB4OwogICAgICAgIG1hcmdpbi10b3A6IC04cHg7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtbG9hZGluZy1zcGlubmVyKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2xvYWRpbmddKSAjc3Bpbm5lciB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogdmFhZGluLWdyaWQtc3Bpbi0zNjAgNDAwbXMgbGluZWFyIGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbjogdmFhZGluLWdyaWQtc3Bpbi0zNjAgNDAwbXMgbGluZWFyIGluZmluaXRlOwogICAgICB9CgogICAgICA6aG9zdChbbG9hZGluZ10pICNpdGVtcyB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tdGhlbWFiaWxpdHktc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3dbc2VsZWN0ZWRdIC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS0xMDAsIHJnYigyNDMsIDI0MywgMjQzKSk7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtYm9keS1yb3ctc2VsZWN0ZWQtY2VsbCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLW5hdmlnYXRpb24tdGhlbWFiaWxpdHktc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0KDpmb2N1cyksCiAgICAgICN0YWJsZTpmb2N1cyB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW25hdmlnYXRpbmddOm5vdChbaW50ZXJhY3RpbmddKSkgW2ZvY3VzZWRdID4gLnZhYWRpbi1ncmlkLXJvd1tmb2N1c2VkXSA+IFtmb2N1c2VkXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgM3B4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1mb2N1c2VkLWNlbGwpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWNvbHVtbi1yZW9yZGVyaW5nLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtyZW9yZGVyaW5nXSAudmFhZGluLWdyaWQtY2VsbCB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQoKICAgICAgOmhvc3QoW3Jlb3JkZXJpbmddKSAudmFhZGluLWdyaWQtY2VsbFtyZW9yZGVyLXN0YXR1cz0iZHJhZ2dpbmciXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcHJpbWFyeS1jb2xvciwgIzAwMCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlW3Jlb3JkZXJpbmddIC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAzMDBtczsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgb3BhY2l0eTogMC44OwogICAgICB9CgogICAgICAjc2Nyb2xsZXIgLnZhYWRpbi1ncmlkLWNlbGxbcmVvcmRlci1zdGF0dXM9ImFsbG93ZWQiXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIC52YWFkaW4tZ3JpZC1jZWxsW3Jlb3JkZXItc3RhdHVzPSJkcmFnZ2luZyJdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LWNvbG9yLCAjMDAwKTsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIC52YWFkaW4tZ3JpZC1jZWxsW3Jlb3JkZXItc3RhdHVzPSJkcmFnZ2luZyJdIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBvcGFjaXR5OiAwLjk1OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgoKICAgICAgQGtleWZyYW1lcyBhcHBlYXIgewogICAgICAgIHRvIHsKICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgfQogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGFuaW1hdGlvbjogMW1zIGFwcGVhcjsKICAgICAgfQoKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1tYXgtZGV2aWNlLXBpeGVsLXJhdGlvOiAxKSB7CiAgICAgICAgOmhvc3QgewogICAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNpdGVtcyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjaXRlbXMgewogICAgICAgIGJvcmRlci10b3A6IDAgc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgI2l0ZW1zID4gLnZhYWRpbi1ncmlkLXJvdyB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIC52YWFkaW4tZ3JpZC1jZWxsLAogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXIgLnZhYWRpbi1ncmlkLWNlbGwgewogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNlbGwgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CgogICAgICAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMzVweDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICAgIH0KCiAgICAgIFtsYXN0Y29sdW1uXSAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSwKICAgICAgW2xhc3QtZnJvemVuXSAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSB7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlb3JkZXJpbmctYWxsb3dlZF0gI2hlYWRlciwKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlc2l6aW5nXSB7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlc2l6aW5nXSB7CiAgICAgICAgY3Vyc29yOiBjb2wtcmVzaXplOwogICAgICB9CgogICAgICAudmFhZGluLWdyaWQtcm93Om5vdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIFtmcm96ZW5dIHsKICAgICAgICB6LWluZGV4OiAyOwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbbm8tY29udGVudC1wb2ludGVyLWV2ZW50c10gLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS10YWJsZS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoW2lvc11bY29sdW1uLXJlc2l6aW5nXSkgI291dGVyc2Nyb2xsZXIgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgICNmaXhlZHNpemVyLAogICAgICAjb3V0ZXJzaXplciB7CiAgICAgICAgYm9yZGVyLXRvcDogMCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItYm90dG9tOiAwIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAjdGFibGUgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CgogICAgICAjdGFibGVbb3ZlcmZsb3ctaGlkZGVuXSwKICAgICAgI291dGVyc2Nyb2xsZXJbb3ZlcmZsb3ctaGlkZGVuXSB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtc2l6ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI3NpemVyd3JhcHBlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IC0xMDA7CiAgICAgIH0KCiAgICAgICNyZW9yZGVyZ2hvc3QgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY29sdW1uKSwKICAgICAgOjpzbG90dGVkKHZhYWRpbi1ncmlkLXNlbGVjdGlvbi1jb2x1bW4pLAogICAgICA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY29sdW1uLWdyb3VwKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgoKICAgICAgLyogRGVmYXVsdCBib3JkZXJzICovCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciAudmFhZGluLWdyaWQtcm93Omxhc3QtY2hpbGQgLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIC52YWFkaW4tZ3JpZC1yb3c6Zmlyc3QtY2hpbGQgLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtYm9keSAudmFhZGluLWdyaWQtcm93Om5vdChbbGFzdHJvd10pIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tZGl2aWRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7CiAgICAgIH0KCiAgICAgIFtsYXN0LWZyb3plbl0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4wOCkpOwogICAgICB9CgogICAgICAvKiBDb2x1bW4gcmVzaXplIGhhbmRsZSAqLwoKICAgICAgLnZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlIHsKICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1jb2x1bW4tcmVzaXplLWhhbmRsZSk7CiAgICAgIH0KCiAgICAgIC8qIENlbGxzICovCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3cgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciAudmFhZGluLWdyaWQtcm93IC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1oZWFkZXItY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciAudmFhZGluLWdyaWQtcm93IC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1mb290ZXItY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWJvZHkgLnZhYWRpbi1ncmlkLXJvdyAudmFhZGluLWdyaWQtY2VsbDpub3QoW2RldGFpbHNjZWxsXSkgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWJvZHktY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWJvZHkgW29kZF0gLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1ib2R5LXJvdy1vZGQtY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3cgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pW2xhc3QtZnJvemVuXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtY2VsbC1sYXN0LWZyb3plbik7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlOm5vdChbc2Nyb2xsaW5nXSkgdmFhZGluLWdyaWQtdGFibGUtYm9keSAudmFhZGluLWdyaWQtcm93OmhvdmVyIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1ib2R5LXJvdy1ob3Zlci1jZWxsKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUgLnZhYWRpbi1ncmlkLXJvdyAudmFhZGluLWdyaWQtY2VsbC52YWFkaW4tZ3JpZC1jZWxsW2xhc3Rjb2x1bW5dIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBib3JkZXItcmlnaHQ6IG5vbmU7CiAgICAgIH0KCiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZSI+CiAgPHRlbXBsYXRlPgogICAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtdGFibGUtdGFibGUtc2Nyb2xsLXN0eWxlcyI+PC9zdHlsZT4KICAgICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXRhYmxlLXN0eWxlcyI+PC9zdHlsZT4KCiAgICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1kYXRhLXByb3ZpZGVyLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KCiAgICAgIDxkaXYgaWQ9InNwaW5uZXIiPjwvZGl2PgogICAgICA8ZGl2IGlkPSJ0YWJsZSIgdGFiaW5kZXg9Ii0xIiBvdmVyZmxvdy1oaWRkZW4kPSJbW19oaWRlVGFibGVPdmVyZmxvdyhzY3JvbGxiYXJXaWR0aCwgc2FmYXJpKV1dIj4KICAgICAgICA8ZGl2IGlkPSJzaXplcndyYXBwZXIiPgogICAgICAgICAgPHZhYWRpbi1ncmlkLXNpemVyIGlkPSJmaXhlZHNpemVyIiB0b3A9IltbX2VzdFNjcm9sbEhlaWdodF1dIiBjb2x1bW4tdHJlZT0iW1tjb2x1bW5UcmVlXV0iPjwvdmFhZGluLWdyaWQtc2l6ZXI+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHNsb3QgbmFtZT0iaGVhZGVyIj48L3Nsb3Q+CiAgICAgICAgPHNsb3QgbmFtZT0iaXRlbXMiPjwvc2xvdD4KICAgICAgICA8c2xvdCBuYW1lPSJmb290ZXIiPjwvc2xvdD4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGlkPSJyZW9yZGVyZ2hvc3QiPjwvZGl2PgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXIgaWQ9Im91dGVyc2Nyb2xsZXIiIHNjcm9sbC10YXJnZXQ9Iltbc2Nyb2xsVGFyZ2V0XV0iIG92ZXJmbG93LWhpZGRlbiQ9IltbX2hpZGVPdXRlclNjcm9sbGVyKHNjcm9sbGJhcldpZHRoLCBzYWZhcmkpXV0iIGlvcyQ9IltbaW9zXV0iIHNjcm9sbGluZyQ9Iltbc2Nyb2xsaW5nXV0iPgogICAgICA8dmFhZGluLWdyaWQtc2l6ZXIgaWQ9Im91dGVyc2l6ZXIiIHRvcD0iW1tfZXN0U2Nyb2xsSGVpZ2h0XV0iIGNvbHVtbi10cmVlPSJbW2NvbHVtblRyZWVdXSI+PC92YWFkaW4tZ3JpZC1zaXplcj4KICAgIDwvdmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXI+CiAgICA8c2xvdD48L3Nsb3Q+CiAgICA8c2xvdCBuYW1lPSJmb290ZXJGb2N1c1RyYXAiPjwvc2xvdD4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWNvbHVtbiI+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvciwgI2ZmZik7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXNjcm9sbC1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtcm93LWRldGFpbHMtc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXN0eWxlcyI+PC9zdHlsZT4KCiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtdGFibGUtdGhlbWFiaWxpdHktc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXNlbGVjdGlvbi10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtbmF2aWdhdGlvbi10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtYWN0aXZlLWl0ZW0tdGhlbWFiaWxpdHktc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXJvdy1kZXRhaWxzLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1jb2x1bW4tcmVvcmRlcmluZy10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CgogICAgPHZhYWRpbi1ncmlkLXRhYmxlIGlkPSJzY3JvbGxlciIgbG9hZGluZyQ9IltbX2xvYWRpbmddXSIgYmluZC1kYXRhPSJbW19iaW5kRGF0YV1dIiBzaXplPSJbW3NpemVdXSIgY29sdW1uLXRyZWU9IltbX2NvbHVtblRyZWVdXSIgcm93LWRldGFpbHMtdGVtcGxhdGU9IltbX3Jvd0RldGFpbHNUZW1wbGF0ZV1dIiBjb2x1bW4tcmVvcmRlcmluZy1hbGxvd2VkPSJbW2NvbHVtblJlb3JkZXJpbmdBbGxvd2VkXV0iPgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIGlkPSJoZWFkZXIiIHNsb3Q9ImhlYWRlciIgdGFyZ2V0PSJbW19nZXRDb250ZW50VGFyZ2V0KCldXSIgY29sdW1uLXRyZWU9IltbX2NvbHVtblRyZWVdXSI+PC92YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXI+CiAgICAgIDx2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IGlkPSJpdGVtcyIgc2xvdD0iaXRlbXMiPjwvdmFhZGluLWdyaWQtdGFibGUtYm9keT4KICAgICAgPHZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciBpZD0iZm9vdGVyIiBzbG90PSJmb290ZXIiIHRhcmdldD0iW1tfZ2V0Q29udGVudFRhcmdldCgpXV0iIGNvbHVtbi10cmVlPSJbW19jb2x1bW5UcmVlXV0iPjwvdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyPgoKICAgICAgCiAgICAgIDxzbG90IG5hbWU9ImZvb3RlckZvY3VzVHJhcCI+PC9zbG90PgoKICAgICAgCiAgICAgIAogICAgICA8c2xvdD48L3Nsb3Q+CgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtZm9jdXMtdHJhcCBpZD0iZm9vdGVyRm9jdXNUcmFwIiBzbG90PSJmb290ZXJGb2N1c1RyYXAiIG9uLWZvY3VzLWdhaW5lZD0iX29uRm9vdGVyRm9jdXMiIG9uLWZvY3VzLWxvc3Q9Il9vbkZvY3Vzb3V0Ij4KICAgICAgPC92YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwPgogICAgPC92YWFkaW4tZ3JpZC10YWJsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgPHRlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFzZXNzaW9uR3JvdXBdXSI+CiAgICAgIDxkaXY+CiAgICAgICAgPGgzPk5vIHNlc3Npb24gZ3JvdXAgc2VsZWN0ZWQ8L2gzPgogICAgICAgIDxwPlBsZWFzZSBzZWxlY3QgYSBzZXNzaW9uIGdyb3VwIHRvIHNlZSBpdHMgbWV0cmljLWdyYXBocyBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9oYXZlTWV0cmljcyh2aXNpYmxlU2NoZW1hLiopXV0iPgogICAgICA8ZGl2PgogICAgICAgIDxoMz5ObyBtZXRyaWNzIGFyZSBlbmFibGVkPC9oMz4KICAgICAgICA8cD5QbGVhc2UgZW5hYmxlIHNvbWUgbWV0cmljcyB0byBzZWUgY29udGVudCBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJsYXlvdXQgaG9yaXpvbnRhbCB3cmFwIHNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGF2ZU1ldHJpY3NBbmRTZXNzaW9uR3JvdXAodmlzaWJsZVNjaGVtYS4qLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25Hcm91cCldXSI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1t2aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zXV0iIGFzPSJtZXRyaWNJbmZvIj4KICAgICAgICAgIAogICAgICAgICAgPHRmLXNjYWxhci1jYXJkIGNsYXNzPSJzY2FsYXItY2FyZCIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIgZGF0YS10by1sb2FkPSJbW19jb21wdXRlU2VyaWVzRm9yU2Vzc2lvbkdyb3VwTWV0cmljKHNlc3Npb25Hcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNJbmZvKV1dIiB0YWc9IltbbWV0cmljSW5mby5uYW1lLnRhZ11dIiB0YWctbWV0YWRhdGE9IltbX2NvbXB1dGVUYWdNZXRhZGF0YShtZXRyaWNJbmZvKV1dIiB4LXR5cGU9IltbX3hUeXBlXV0iIG11bHRpLWV4cGVyaW1lbnRzPSJbW19ub011bHRpRXhwZXJpbWVudHNdXSIgcmVxdWVzdC1kYXRhPSJbW19yZXF1ZXN0RGF0YV1dIiBhY3RpdmU+CiAgICAgICAgICA8L3RmLXNjYWxhci1jYXJkPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KICAgIAogICAgPHN0eWxlIGluY2x1ZGU9Imlyb24tZmxleCI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLXRhYmxlLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDx2YWFkaW4tZ3JpZCBjbGFzcz0ic2Vzc2lvbi1ncm91cC10YWJsZSIgaWQ9InNlc3Npb25Hcm91cHNUYWJsZSIgY29sdW1uLXJlb3JkZXJpbmctYWxsb3dlZCBpdGVtcz0iW1tzZXNzaW9uR3JvdXBzXV0iPgogICAgICA8dmFhZGluLWdyaWQtY29sdW1uIGZsZXgtZ3Jvdz0iMCIgd2lkdGg9IjEwZW0iIHJlc2l6YWJsZT4KICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXIgdGFibGUtY2VsbCI+VHJpYWwgSUQ8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNlbGwiPltbaXRlbS5uYW1lXV08L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2VuYWJsZVNob3dNZXRyaWNzXV0iPgogICAgICAgIDx2YWFkaW4tZ3JpZC1jb2x1bW4gZmxleC1ncm93PSIwIiB3aWR0aD0iNWVtIiByZXNpemFibGU+CiAgICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj5TaG93IE1ldHJpY3M8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjbGFzcz0idGFibGUtY2VsbCIgY2hlY2tlZD0ie3tleHBhbmRlZH19Ij4KICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC92YWFkaW4tZ3JpZC1jb2x1bW4+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbdmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvc11dIiBhcz0iaHBhcmFtSW5mbyIgaW5kZXgtYXM9ImhwYXJhbUluZGV4Ij4KICAgICAgICA8dmFhZGluLWdyaWQtY29sdW1uIGZsZXgtZ3Jvdz0iMiIgd2lkdGg9IjEwZW0iIHJlc2l6YWJsZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBjbGFzcz0iaGVhZGVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIHRhYmxlLWNlbGwiPgogICAgICAgICAgICAgIFtbX2hwYXJhbU5hbWUoaHBhcmFtSW5mbyldXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNlbGwiPgogICAgICAgICAgICAgIFtbX3Nlc3Npb25Hcm91cEhQYXJhbShpdGVtLCBocGFyYW1JbmZvLm5hbWUpXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdmFhZGluLWdyaWQtY29sdW1uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e3Zpc2libGVTY2hlbWEubWV0cmljSW5mb3N9fSIgYXM9Im1ldHJpY0luZm8iIGluZGV4LWFzPSJtZXRyaWNJbmRleCI+CiAgICAgICAgPHZhYWRpbi1ncmlkLWNvbHVtbiBmbGV4LWdyb3c9IjIiIHdpZHRoPSIxMGVtIiByZXNpemFibGU+CiAgICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj4KICAgICAgICAgICAgICBbW19tZXRyaWNOYW1lKG1ldHJpY0luZm8pXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jZWxsIj4KICAgICAgICAgICAgICBbW19zZXNzaW9uR3JvdXBNZXRyaWMoaXRlbSwgbWV0cmljSW5mby5uYW1lKV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGNsYXNzPSJyb3ctZGV0YWlscyI+CiAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgc2Vzc2lvbi1ncm91cD0iW1tpdGVtXV0iIHZpc2libGUtc2NoZW1hPSJbW3Zpc2libGVTY2hlbWFdXSIgY2xhc3M9InNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscz4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdmFhZGluLWdyaWQ+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLnRhYmxlLWNlbGwgewogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAudGFibGUtaGVhZGVyIHsKICAgICAgICAvKiBsaW5lLWJyZWFrIG92ZXJmbG93aW5nIGNvbHVtbiBoZWFkZXJzICovCiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIC5zZXNzaW9uLWdyb3VwLXRhYmxlIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlc3Npb24tZ3JvdXAtZGV0YWlscyB7CiAgICAgICAgaGVpZ2h0OiAzNjBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMiPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19wcm9wZXJ0aWVzQXJlUG9wdWxhdGVkKHZpc2libGVTY2hlbWEsIHNlc3Npb25Hcm91cCldXSI+CiAgICAgIAogICAgICA8dGYtaHBhcmFtcy10YWJsZS12aWV3IHZpc2libGUtc2NoZW1hPSJbW3Zpc2libGVTY2hlbWFdXSIgc2Vzc2lvbi1ncm91cHM9IltbX3NpbmdsZXRvblNlc3Npb25Hcm91cHMoc2Vzc2lvbkdyb3VwKV1dIj4KICAgICAgPC90Zi1ocGFyYW1zLXRhYmxlLXZpZXc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfcHJvcGVydGllc0FyZVBvcHVsYXRlZCh2aXNpYmxlU2NoZW1hLCBzZXNzaW9uR3JvdXApXV0iPgogICAgICA8ZGl2PgogICAgICAgIENsaWNrIG9yIGhvdmVyIG92ZXIgYSBzZXNzaW9uIGdyb3VwIHRvIGRpc3BsYXkgaXRzIHZhbHVlcyBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImNvbnRhaW5lciI+CiAgICAgIDxzdmcgaWQ9InN2ZyI+PC9zdmc+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIHN2ZyB7CiAgICAgICAgZm9udDogMTBweCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAuYmFja2dyb3VuZCBwYXRoIHsKICAgICAgICBmaWxsOiBub25lOwogICAgICAgIHN0cm9rZTogI2RkZDsKICAgICAgICBzaGFwZS1yZW5kZXJpbmc6IGNyaXNwRWRnZXM7CiAgICAgIH0KCiAgICAgIC5mb3JlZ3JvdW5kIHBhdGggewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuNzsKICAgICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIH0KCiAgICAgIC8qIFdpbGwgYmUgc2V0IG9uIGZvcmVncm91bmQgcGF0aHMgdGhhdCBhcmUgbm90ICJjb250YWluZWQiIGluIHRoZSBjdXJyZW50CiAgICAgICAgIGF4ZXMgYnJ1c2hlcy4gSWYgbm8gYnJ1c2hlcyBhcmUgc2V0LCBubyBwYXRoIHdpbGwgaGF2ZSB0aGlzIGNsYXNzLiAqLwogICAgICAuZm9yZWdyb3VuZCAuaW52aXNpYmxlLXBhdGggewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIFN0eWxlIGZvciB0aGUgcGF0aCBjbG9zZXN0IHRvIHRoZSBtb3VzZSBwb2ludGVyICh0eXBpY2FsbHkgd2lsbCBiZWNvbWUKICAgICAgdGhlIHNlbGVjdGVkIHBhdGggd2hlbiB0aGUgdXNlciBjbGlja3MpLiAqLwogICAgICAuZm9yZWdyb3VuZCAucGVha2VkLXBhdGggewogICAgICAgIHN0cm9rZS13aWR0aDogMzsKICAgICAgfQoKICAgICAgLyogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwYXRoIGNsYXNzLiBXZSB1c2UgIWltcG9ydGFudCB0byBvdmVycmlkZSB0aGUKICAgICAgICAgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBjb2xvciBvZiBhIHBhdGguICovCiAgICAgIC5mb3JlZ3JvdW5kIC5zZWxlY3RlZC1wYXRoIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDMgIWltcG9ydGFudDsKICAgICAgICBzdHJva2U6ICMwZjAgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgI2NvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICBzdmcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmF4aXMgdGV4dCB7CiAgICAgICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI2ZmZiwgMXB4IDAgMCAjZmZmLCAwIC0xcHggMCAjZmZmLCAtMXB4IDAgMCAjZmZmOwogICAgICAgIGZpbGw6ICMwMDA7CiAgICAgICAgY3Vyc29yOiBtb3ZlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAogIAogIAogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPGRpdiBjbGFzcz0icGFuZSI+CiAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsPgogICAgICAgIAogICAgICAgIDx0Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scyBpZD0iY29udHJvbHMiIGNsYXNzPSJzZWN0aW9uIiBjb25maWd1cmF0aW9uPSJbW2NvbmZpZ3VyYXRpb25dXSIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBvcHRpb25zPSJ7e19vcHRpb25zfX0iPgogICAgICAgIDwvdGYtaHBhcmFtcy1zY2FsZS1hbmQtY29sb3ItY29udHJvbHM+CiAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgICAKICAgICAgICAgIDx0Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90IGlkPSJwbG90IiBjbGFzcz0ic2VjdGlvbiIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBzZWxlY3RlZC1zZXNzaW9uLWdyb3VwPSJ7e19zZWxlY3RlZEdyb3VwfX0iIGNsb3Nlc3Qtc2Vzc2lvbi1ncm91cD0ie3tfY2xvc2VzdEdyb3VwfX0iIG9wdGlvbnM9IltbX29wdGlvbnNdXSI+CiAgICAgICAgICA8L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3Q+CiAgICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbD4KICAgICAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMgaWQ9InZhbHVlcyIgY2xhc3M9InNlY3Rpb24iIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIiBzZXNzaW9uLWdyb3VwPSJbW19jbG9zZXN0T3JTZWxlY3RlZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xvc2VzdEdyb3VwLCBfc2VsZWN0ZWRHcm91cCldXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcz4KICAgICAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzIGlkPSJkZXRhaWxzIiBjbGFzcz0ic2VjdGlvbiIgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiBzZXNzaW9uLWdyb3VwPSJbW19zZWxlY3RlZEdyb3VwXV0iIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIj4KICAgICAgICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscz4KICAgICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgLnBhbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgfQogICAgICAjY29udHJvbHMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICNwbG90IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgICAjdmFsdWVzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDk1cHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjZGV0YWlscyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICA8c3ZnIGlkPSJzdmciPjwvc3ZnPgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgc3ZnIHsKICAgICAgICBmb250OiAxMHB4IHNhbnMtc2VyaWY7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjbG9zZXN0IGRhdGEgcG9pbnQgbWFya2VyIHRvIHRoZSBtb3VzZSBwb2ludGVyLiBXZSB1c2UgIWltcG9ydGFudAogICAgICAgICB0byBvdmVycmlkZSB0aGUgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBzdHlsZSBvZiBhIG1hcmtlci4KICAgICAgKi8KICAgICAgLmNsb3Nlc3QtbWFya2VyIHsKICAgICAgICByOiA2ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0YSBwb2ludCBtYXJrZXIuIFdlIHVzZSAhaW1wb3J0YW50IHRvCiAgICAgICAgIG92ZXJyaWRlIHRoZSBpbmxpbmUgc3R5bGUgdGhhdCBzZXRzIHRoZSByZWd1bGFyIHN0eWxlIG9mIGEgbWFya2VyLiAqLwogICAgICAuc2VsZWN0ZWQtbWFya2VyIHsKICAgICAgICByOiA2ICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogIzBmMCAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJwYW5lIj4KICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgCiAgICAgICAgPHRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzIGNsYXNzPSJzZWN0aW9uIiBpZD0iY29udHJvbHMiIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iIG9wdGlvbnM9Int7X29wdGlvbnN9fSI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scz4KICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbD4KICAgICAgICAgIAogICAgICAgICAgPHRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90IGNsYXNzPSJzZWN0aW9uIiBpZD0icGxvdCIgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIgc2VsZWN0ZWQtc2Vzc2lvbi1ncm91cD0ie3tfc2VsZWN0ZWRHcm91cH19IiBjbG9zZXN0LXNlc3Npb24tZ3JvdXA9Int7X2Nsb3Nlc3RHcm91cH19IiBvcHRpb25zPSJbW19vcHRpb25zXV0iPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtcGxvdD4KICAgICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsPgogICAgICAgICAgICA8dGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcyBjbGFzcz0ic2VjdGlvbiIgaWQ9InZhbHVlcyIgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iIHNlc3Npb24tZ3JvdXA9IltbX2Nsb3Nlc3RPclNlbGVjdGVkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xvc2VzdEdyb3VwLCBfc2VsZWN0ZWRHcm91cCldXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcz4KICAgICAgICAgICAgCiAgICAgICAgICAgIDx0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyBjbGFzcz0ic2VjdGlvbiIgaWQ9ImRldGFpbHMiIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgc2Vzc2lvbi1ncm91cD0iW1tfc2VsZWN0ZWRHcm91cF1dIiB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHM+CiAgICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgICAgPC92YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnBhbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgfQogICAgICAjY29udHJvbHMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICNwbG90IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjdmFsdWVzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDk1cHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjZGV0YWlscyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItaGVhZGVyLXBhbmVsPgogICAgICA8cGFwZXItdG9vbGJhciBzbG90PSJoZWFkZXIiIGNsYXNzPSJ0YWItYmFyIj4KICAgICAgICA8cGFwZXItdGFicyBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRUYWJ9fSIgc2xvdD0idG9wIj4KICAgICAgICAgIAogICAgICAgICAgPHBhcGVyLXRhYiB2aWV3LWlkPSJ0YWJsZS12aWV3Ij4KICAgICAgICAgICAgVEFCTEUgVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8cGFwZXItdGFiIHZpZXctaWQ9InBhcmFsbGVsLWNvb3Jkcy12aWV3Ij4KICAgICAgICAgICAgUEFSQUxMRUwgQ09PUkRJTkFURVMgVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8cGFwZXItdGFiIHZpZXctaWQ9InNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldyI+CiAgICAgICAgICAgIFNDQVRURVIgUExPVCBNQVRSSVggVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWxwLWFuZC1mZWVkYmFjayI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tidWdSZXBvcnRVcmxdXSI+CiAgICAgICAgICAgICAgPGEgaHJlZiQ9IltbYnVnUmVwb3J0VXJsXV0iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPgogICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0iYnVnLXJlcG9ydCIgcmFpc2VkIHRpdGxlPSJTZW5kIGEgYnVnIHJlcG9ydCBvciBmZWF0dXJlIHJlcXVlc3QiPgogICAgICAgICAgICAgICAgICBCdWcgUmVwb3J0IC8gRmVhdHVyZSBSZXF1ZXN0CiAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1toZWxwVXJsXV0iPgogICAgICAgICAgICAgIDxhIGhyZWYkPSJbW2hlbHBVcmxdXSIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+CiAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaGVscC1vdXRsaW5lIiB0aXRsZT0iVmlldyBkb2N1bWVudGF0aW9uIj4KICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9wYXBlci10YWJzPgogICAgICA8L3BhcGVyLXRvb2xiYXI+CiAgICAgIDxpcm9uLXBhZ2VzIHNlbGVjdGVkPSJbW19zZWxlY3RlZFRhYl1dIiBjbGFzcz0iZml0IHRhYi12aWV3Ij4KICAgICAgICA8ZGl2IGlkPSIwIiBjbGFzcz0idGFiIj4KICAgICAgICAgIDx0Zi1ocGFyYW1zLXRhYmxlLXZpZXcgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBlbmFibGUtc2hvdy1tZXRyaWNzPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXRhYmxlLXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iMSIgY2xhc3M9InRhYiI+CiAgICAgICAgICA8dGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldyBiYWNrZW5kPSJbW2JhY2tlbmRdXSIgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy12aWV3PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaWQ9IjIiIGNsYXNzPSJ0YWIiPgogICAgICAgICAgPHRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3IGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgY29uZmlndXJhdGlvbj0iW1tjb25maWd1cmF0aW9uXV0iIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSI+CiAgICAgICAgICA8L3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3PgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tcGFnZXM+CiAgICA8L3BhcGVyLWhlYWRlci1wYW5lbD4KCiAgICA8c3R5bGU+CiAgICAgIC50YWItdmlldyB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIC50YWItYmFyIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoCiAgICAgICAgICAtLXRiLXRvb2xiYXItYmFja2dyb3VuZC1jb2xvciwKICAgICAgICAgIHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpCiAgICAgICAgKTsKICAgICAgfQogICAgICAudGFiIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgcGFwZXItdGFicyB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAtLXBhcGVyLXRhYnMtc2VsZWN0aW9uLWJhci1jb2xvcjogd2hpdGU7CiAgICAgICAgLS1wYXBlci10YWJzLWNvbnRlbnQ6IHsKICAgICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAgIH0KICAgICAgfQogICAgICB0Zi1ocGFyYW1zLXRhYmxlLXZpZXcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAuaGVscC1hbmQtZmVlZGJhY2sgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyAvKiBFbnN1cmUgdGhhdCBpY29ucyBzdGF5IGFsaWduZWQgKi8KICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICAgICNidWctcmVwb3J0IHsKICAgICAgICBib3JkZXI6IHNvbGlkIGJsYWNrOwogICAgICAgIGJhY2tncm91bmQ6IHJlZDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmRzOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBtYXgtd2lkdGg6IDE1MHB4OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KICAgICAgLmhlbHAtYW5kLWZlZWRiYWNrIGEgewogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLW1haW4iPgogIDx0ZW1wbGF0ZT4KICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8dGYtaHBhcmFtcy1xdWVyeS1wYW5lIGlkPSJxdWVyeS1wYW5lIiBiYWNrZW5kPSJbW2JhY2tlbmRdXSIgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iIGNvbmZpZ3VyYXRpb249Int7X2NvbmZpZ3VyYXRpb259fSIgc2Vzc2lvbi1ncm91cHM9Int7X3Nlc3Npb25Hcm91cHN9fSI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXF1ZXJ5LXBhbmU+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbnMtcGFuZSBpZD0ic2Vzc2lvbnMtcGFuZSIgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGhlbHAtdXJsPSJbW2hlbHBVcmxdXSIgYnVnLXJlcG9ydC11cmw9IltbYnVnUmVwb3J0VXJsXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiBjb25maWd1cmF0aW9uPSJbW19jb25maWd1cmF0aW9uXV0iIHNlc3Npb24tZ3JvdXBzPSJbW19zZXNzaW9uR3JvdXBzXV0iPgogICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lPgogICAgICA8L2Rpdj4KICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgIDx0Zi1ocGFyYW1zLWdvb2dsZS1hbmFseXRpY3MtdHJhY2tlciBpZD0idHJhY2tlciIgdHJhY2tpbmctaWQ9IltbdHJhY2tpbmdJZF1dIiBuYW1lPSJ0Zl9ocGFyYW1zIj4KICAgIDwvdGYtaHBhcmFtcy1nb29nbGUtYW5hbHl0aWNzLXRyYWNrZXI+CgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tc3BsaXQtbGF5b3V0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLnNpZGViYXIgewogICAgICAgIHdpZHRoOiAyMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBtaW4td2lkdGg6IDEwJTsKICAgICAgfQoKICAgICAgLmNlbnRlciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIHdpZHRoOiA4MCU7CiAgICAgIH0KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPHRmLWhwYXJhbXMtbWFpbiBpZD0iaHBhcmFtcy1tYWluIiBiYWNrZW5kPSJbW19iYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iIj4KICAgIDwvdGYtaHBhcmFtcy1tYWluPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtbWVzaC1sb2FkZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgY29sb3I9IltbX3J1bkNvbG9yXV0iIGNsYXNzPSJ0Zi1tZXNoLWxvYWRlci1oZWFkZXIiPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU2FtcGxlcyhvZlNhbXBsZXMpXV0iPgogICAgICAgIDxkaXY+c2FtcGxlOiBbW19nZXRTYW1wbGVUZXh0KHNhbXBsZSldXSBvZiBbW29mU2FtcGxlc11dPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXAoX3N0ZXBzKV1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgc3RlcAogICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiPltbdG9Mb2NhbGVTdHJpbmdfKF9zdGVwVmFsdWUpXV08L3NwYW4+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfY3VycmVudFdhbGxUaW1lXV0iPgogICAgICAgICAgICAgIFtbX2N1cnJlbnRXYWxsVGltZV1dCiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIHJpZ2h0Ij4KICAgICAgICAgICAgPHBhcGVyLXNwaW5uZXItbGl0ZSBhY3RpdmUgaGlkZGVuJD0iW1shX2lzTWVzaExvYWRpbmddXSI+CiAgICAgICAgICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVTdGVwcyhfc3RlcHMpXV0iPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItc2xpZGVyIGlkPSJzdGVwcyIgaW1tZWRpYXRlLXZhbHVlPSJ7e19zdGVwSW5kZXh9fSIgbWF4PSJbW19nZXRNYXhTdGVwSW5kZXgoX3N0ZXBzKV1dIiBtYXgtbWFya2Vycz0iW1tfZ2V0TWF4U3RlcEluZGV4KF9zdGVwcyldXSIgc25hcHMgc3RlcD0iMSIgdmFsdWU9Int7X3N0ZXBJbmRleH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdGYtY2FyZC1oZWFkaW5nPgogICAgPHN0eWxlPgogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAxcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxcHg7CiAgICAgIH0KICAgICAgLnRmLW1lc2gtbG9hZGVyLWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDVweDsKICAgICAgfQogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJtZXNoLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgc2xvdD0ic2lkZWJhciIgY2xhc3M9ImFsbC1jb250cm9scyI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHZpZXctY29udHJvbCI+CiAgICAgICAgICA8aDMgY2xhc3M9InRpdGxlIj5Qb2ludCBvZiB2aWV3PC9oMz4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDxwYXBlci1yYWRpby1ncm91cCBpZD0idmlldy1yYWRpby1ncm91cCIgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkVmlld319Ij4KICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJhbGwtcmFkaW8tYnV0dG9uIiBuYW1lPSJhbGwiPgogICAgICAgICAgICAgICAgRGlzcGxheSBhbGwgcG9pbnRzCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9ImFsbC1yYWRpby1idXR0b24iIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgIFpvb20gYW5kIGNlbnRlciBjYW1lcmEgdG8gZGlzcGxheSBhbGwgcG9pbnRzIGF0IG9uY2UuIE5vdGUsIHRoYXQKICAgICAgICAgICAgICAgIHNvbWUgcG9pbnRzIGNvdWxkIGJlIHRvbyBmYXIgKGkuZS4gdG9vIHNtYWxsKSB0byBiZSB2aXNpYmxlLgogICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJ1c2VyLXJhZGlvLWJ1dHRvbiIgbmFtZT0idXNlciI+CiAgICAgICAgICAgICAgICBDdXJyZW50IHZpZXcKICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0idXNlci1yYWRpby1idXR0b24iIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgIEtlZXAgY3VycmVudCBjYW1lcmEgcG9zaXRpb24gYW5kIHpvb20gbGV2ZWwuCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9InNoYXJlLXJhZGlvLWJ1dHRvbiIgbmFtZT0ic2hhcmUiPgogICAgICAgICAgICAgICAgU2hhcmUgdmlld3BvaW50CiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9InNoYXJlLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgU2hhcmUgdmlld3BvaW50IGFtb25nIGFsbCBjYW1lcmFzLgogICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBydW5zLXNlbGVjdG9yIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBwb2ludCBjbG91ZCBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IHBvaW50IGNsb3VkIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy4KICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICAKICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIiBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLW1lc2gtbG9hZGVyIGFjdGl2ZT0iW1thY3RpdmVdXSIgc2VsZWN0ZWQtdmlldz0iW1tfc2VsZWN0ZWRWaWV3XV0iIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgc2FtcGxlPSJbW2l0ZW0uc2FtcGxlXV0iIG9mLXNhbXBsZXM9IltbaXRlbS5vZlNhbXBsZXNdXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIiBjbGFzcz0idGYtbWVzaC1sb2FkZXItY29udGFpbmVyIiBvbi1jYW1lcmEtcG9zaXRpb24tY2hhbmdlPSJfb25DYW1lcmFQb3NpdGlvbkNoYW5nZWQiPgogICAgICAgICAgICAgICAgPC90Zi1tZXNoLWxvYWRlcj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDVweDsKICAgICAgfQogICAgICAuc2lkZWJhci1zZWN0aW9uIGgzLnRpdGxlIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KCiAgICAgIC5ydW5zLXNlbGVjdG9yIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KCiAgICAgIHRmLXJ1bnMtc2VsZWN0b3IgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIC52aWV3LWNvbnRyb2wgewogICAgICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC52aWV3LWNvbnRyb2wgaDMudGl0bGUgewogICAgICAgIHBhZGRpbmctdG9wOiAxNnB4OwogICAgICAgIHBhZGRpbmctYm90dG9tOiAxNnB4OwogICAgICB9CgogICAgICAuYWxsY29udHJvbHMgLnZpZXctY29udHJvbCBwYXBlci1yYWRpby1ncm91cCB7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICB9CiAgICAgIC8qIExheW91dCBtdXN0IGJlIGhvcml6b250YWwsIGkuZS4gaXRlbXMgYXJyYW5nZWQgaW4gYSByb3cuIElmIGl0ZW1zIGNhbm5vdCBmaXQgaW4gYSByb3csCiAgICAgICAqIHRoZXkgc2hvdWxkIGJlIG1vdmVkIHRvIG5leHQgbGluZS4gQWxsIGl0ZW1zIG11c3QgYmUgc3F1YXJlIGF0IGFsbCB0aW1lcy4gTWluaW11bSBzaXplIG9mCiAgICAgICAqIHRoZSBpdGVtIGlzIDQ4MHB4LiBUaGlzIG1lYW5zIHRoYXQgbWF4aW11bSBzaXplIG9mIHRoZSBpdGVtIG11c3QgYmUgNDgwcHggKyA0NzlweCA9IDk1OXB4LgogICAgICAgKiAqLwogICAgICAuaG9yaXpvbnRhbCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfQogICAgICB0Zi1tZXNoLWxvYWRlciB7CiAgICAgICAgd2lkdGg6IDQ4MHB4OwogICAgICAgIGZsZXgtYmFzaXM6IDQ4MHB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi10ZW5zb3Jib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWRpYWxvZyB3aXRoLWJhY2tkcm9wIGlkPSJzZXR0aW5ncyI+CiAgICAgIDxoMj5TZXR0aW5nczwvaDI+CiAgICAgIDxwYXBlci1jaGVja2JveCBpZD0iYXV0by1yZWxvYWQtY2hlY2tib3giIGNoZWNrZWQ9Int7YXV0b1JlbG9hZEVuYWJsZWR9fSI+CiAgICAgICAgUmVsb2FkIGRhdGEgZXZlcnkgPHNwYW4+W1thdXRvUmVsb2FkSW50ZXJ2YWxTZWNzXV08L3NwYW4+cy4KICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJwYWdpbmF0aW9uTGltaXRJbnB1dCIgbGFiZWw9IlBhZ2luYXRpb24gbGltaXQiIGFsd2F5cy1mbG9hdC1sYWJlbCB0eXBlPSJudW1iZXIiIG1pbj0iMSIgc3RlcD0iMSIgb24tY2hhbmdlPSJfcGFnaW5hdGlvbkxpbWl0Q2hhbmdlZCIgb24tdmFsdWUtY2hhbmdlZD0iX3BhZ2luYXRpb25MaW1pdFZhbGlkYXRlIj48L3BhcGVyLWlucHV0PgogICAgPC9wYXBlci1kaWFsb2c+CiAgICA8cGFwZXItaGVhZGVyLXBhbmVsPgogICAgICA8cGFwZXItdG9vbGJhciBpZD0idG9vbGJhciIgc2xvdD0iaGVhZGVyIiBjbGFzcz0iaGVhZGVyIj4KICAgICAgICA8ZGl2IGlkPSJ0b29sYmFyLWNvbnRlbnQiIHNsb3Q9InRvcCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b29sYmFyLXRpdGxlIj5bW2JyYW5kXV08L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfYWN0aXZlRGFzaGJvYXJkc05vdExvYWRlZF1dIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRvb2xiYXItbWVzc2FnZSI+CiAgICAgICAgICAgICAgTG9hZGluZyBhY3RpdmUgZGFzaGJvYXJkc+KApgogICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19hY3RpdmVEYXNoYm9hcmRzTG9hZGVkXV0iPgogICAgICAgICAgICA8cGFwZXItdGFicyBub2luayBzY3JvbGxhYmxlIHNlbGVjdGVkPSJ7e19zZWxlY3RlZERhc2hib2FyZH19IiBhdHRyLWZvci1zZWxlY3RlZD0iZGF0YS1kYXNoYm9hcmQiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2Rhc2hib2FyZERhdGFdXSIgYXM9ImRhc2hib2FyZERhdHVtIj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNEYXNoYm9hcmRBY3RpdmUoZGlzYWJsZWREYXNoYm9hcmRzLCBfYWN0aXZlRGFzaGJvYXJkcywgZGFzaGJvYXJkRGF0dW0pXV0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItdGFiIGRhdGEtZGFzaGJvYXJkJD0iW1tkYXNoYm9hcmREYXR1bS5wbHVnaW5dXSIgdGl0bGU9IltbZGFzaGJvYXJkRGF0dW0udGFiTmFtZV1dIj4KICAgICAgICAgICAgICAgICAgICBbW2Rhc2hib2FyZERhdHVtLnRhYk5hbWVdXQogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRhYj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9wYXBlci10YWJzPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2luYWN0aXZlRGFzaGJvYXJkc0V4aXN0KF9kYXNoYm9hcmREYXRhLCBkaXNhYmxlZERhc2hib2FyZHMsIF9hY3RpdmVEYXNoYm9hcmRzKV1dIj4KICAgICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iSU5BQ1RJVkUiIG5vLWxhYmVsLWZsb2F0IG5vaW5rIHN0eWxlPSJtYXJnaW4tbGVmdDogMTJweCI+CiAgICAgICAgICAgICAgICA8cGFwZXItbGlzdGJveCBpZD0iaW5hY3RpdmUtZGFzaGJvYXJkcy1tZW51IiBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tfc2VsZWN0ZWREYXNoYm9hcmR9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9ImRhdGEtZGFzaGJvYXJkIj4KICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfZGFzaGJvYXJkRGF0YV1dIiBhcz0iZGFzaGJvYXJkRGF0dW0iPgogICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNEYXNoYm9hcmRJbmFjdGl2ZShkaXNhYmxlZERhc2hib2FyZHMsIF9hY3RpdmVEYXNoYm9hcmRzLCBkYXNoYm9hcmREYXR1bSldXSIgcmVzdGFtcD4KICAgICAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIGRhdGEtZGFzaGJvYXJkJD0iW1tkYXNoYm9hcmREYXR1bS5wbHVnaW5dXSI+W1tkYXNoYm9hcmREYXR1bS50YWJOYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPGRpdiBjbGFzcz0iZ2xvYmFsLWFjdGlvbnMiPgogICAgICAgICAgICA8c2xvdCBuYW1lPSJpbmplY3RlZC1oZWFkZXItaXRlbXMiPjwvc2xvdD4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGlkPSJyZWxvYWQtYnV0dG9uIiBjbGFzcyQ9IltbX2dldERhdGFSZWZyZXNoaW5nQ2xhc3MoX3JlZnJlc2hpbmcpXV0iIGRpc2FibGVkJD0iW1tfaXNSZWxvYWREaXNhYmxlZF1dIiBpY29uPSJyZWZyZXNoIiBvbi10YXA9InJlbG9hZCIgdGl0bGUkPSJMYXN0IHVwZGF0ZWQ6IFtbX2xhc3RSZWxvYWRUaW1lU2hvcnRdXSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InNldHRpbmdzIiBvbi10YXA9Im9wZW5TZXR0aW5ncyIgaWQ9InNldHRpbmdzLWJ1dHRvbiI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiIHRhYmluZGV4PSItMSIgdGFyZ2V0PSJfYmxhbmsiPgogICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJoZWxwLW91dGxpbmUiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgIDwvYT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3BhcGVyLXRvb2xiYXI+CgogICAgICA8ZGl2IGlkPSJjb250ZW50LXBhbmUiIGNsYXNzPSJmaXQiPgogICAgICAgIDxzbG90IG5hbWU9ImluamVjdGVkLW92ZXJ2aWV3Ij48L3Nsb3Q+CiAgICAgICAgPGRpdiBpZD0iY29udGVudCI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2FjdGl2ZURhc2hib2FyZHNGYWlsZWRUb0xvYWRdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Indhcm5pbmctbWVzc2FnZSI+CiAgICAgICAgICAgICAgPGgzPkZhaWxlZCB0byBsb2FkIHRoZSBzZXQgb2YgYWN0aXZlIGRhc2hib2FyZHMuPC9oMz4KICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIFRoaXMgY2FuIG9jY3VyIGlmIHRoZSBUZW5zb3JCb2FyZCBiYWNrZW5kIGlzIG5vIGxvbmdlciBydW5uaW5nLgogICAgICAgICAgICAgICAgUGVyaGFwcyB0aGlzIHBhZ2UgaXMgY2FjaGVkPwogICAgICAgICAgICAgIAoKICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIElmIHlvdSB0aGluayB0aGF0IHlvdeKAmXZlIGZpeGVkIHRoZSBwcm9ibGVtLCBjbGljayB0aGUgcmVsb2FkCiAgICAgICAgICAgICAgICBidXR0b24gaW4gdGhlIHRvcC1yaWdodC4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1thdXRvUmVsb2FkRW5hYmxlZF1dIj4KICAgICAgICAgICAgICAgICAgV2XigJlsbCB0cnkgdG8gcmVsb2FkIGV2ZXJ5CiAgICAgICAgICAgICAgICAgIFtbYXV0b1JlbG9hZEludGVydmFsU2Vjc11dJm5ic3A7c2Vjb25kcyBhcyB3ZWxsLgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICA8aT5MYXN0IHJlbG9hZDogW1tfbGFzdFJlbG9hZFRpbWVdXTwvaT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YUxvY2F0aW9uXV0iPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPjxwPgogICAgICAgICAgICAgICAgICAgIDxpPkxvZyBkaXJlY3Rvcnk6CiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iZGF0YV9sb2NhdGlvbiI+W1tfZGF0YUxvY2F0aW9uXV08L3NwYW4+PC9pPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nob3dOb0Rhc2hib2FyZHNNZXNzYWdlXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nLW1lc3NhZ2UiPgogICAgICAgICAgICAgIDxoMz5ObyBkYXNoYm9hcmRzIGFyZSBhY3RpdmUgZm9yIHRoZSBjdXJyZW50IGRhdGEgc2V0LjwvaDM+CiAgICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOgogICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICAgIAoKICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIDxpPkxhc3QgcmVsb2FkOiBbW19sYXN0UmVsb2FkVGltZV1dPC9pPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTG9jYXRpb25dXSI+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+PHA+CiAgICAgICAgICAgICAgICAgICAgPGk+RGF0YSBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJkYXRhX2xvY2F0aW9uIj5bW19kYXRhTG9jYXRpb25dXTwvc3Bhbj48L2k+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2hvd05vU3VjaERhc2hib2FyZE1lc3NhZ2VdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Indhcm5pbmctbWVzc2FnZSI+CiAgICAgICAgICAgICAgPGgzPgogICAgICAgICAgICAgICAgVGhlcmXigJlzIG5vIGRhc2hib2FyZCBieSB0aGUgbmFtZSBvZgogICAgICAgICAgICAgICAg4oCcPHR0PltbX3NlbGVjdGVkRGFzaGJvYXJkXV08L3R0Pi7igJ0KICAgICAgICAgICAgICA8L2gzPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZF1dIj4KICAgICAgICAgICAgICAgIDxwPllvdSBjYW4gc2VsZWN0IGEgZGFzaGJvYXJkIGZyb20gdGhlIGxpc3QgYWJvdmUuPC90ZW1wbGF0ZT4KCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICA8aT5MYXN0IHJlbG9hZDogW1tfbGFzdFJlbG9hZFRpbWVdXTwvaT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YUxvY2F0aW9uXV0iPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPjxwPgogICAgICAgICAgICAgICAgICAgIDxpPkRhdGEgbG9jYXRpb246CiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iZGF0YV9sb2NhdGlvbiI+W1tfZGF0YUxvY2F0aW9uXV08L3NwYW4+PC9pPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGlkPSJkYXNoYm9hcmRzLXRlbXBsYXRlIiBpdGVtcz0iW1tfZGFzaGJvYXJkRGF0YV1dIiBhcz0iZGFzaGJvYXJkRGF0dW0iIG9uLWRvbS1jaGFuZ2U9Il9vblRlbXBsYXRlQ2hhbmdlZCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRhc2hib2FyZC1jb250YWluZXIiIGRhdGEtZGFzaGJvYXJkJD0iW1tkYXNoYm9hcmREYXR1bS5wbHVnaW5dXSIgZGF0YS1zZWxlY3RlZCQ9IltbX3NlbGVjdGVkU3RhdHVzKF9zZWxlY3RlZERhc2hib2FyZCwgZGFzaGJvYXJkRGF0dW0ucGx1Z2luKV1dIj4KICAgICAgICAgICAgICAKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvcGFwZXItaGVhZGVyLXBhbmVsPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTEwMCk7CiAgICAgIH0KCiAgICAgICN0b29sYmFyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoCiAgICAgICAgICAtLXRiLXRvb2xiYXItYmFja2dyb3VuZC1jb2xvciwKICAgICAgICAgIHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpCiAgICAgICAgKTsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtMC4wMjVlbTsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGRpc3BsYXk6IHZhcigtLXRiLXRvb2xiYXItdGl0bGUtZGlzcGxheSwgYmxvY2spOwogICAgICB9CgogICAgICAudG9vbGJhci1tZXNzYWdlIHsKICAgICAgICBvcGFjaXR5OiAwLjc7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIHBhcGVyLXRhYnMgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgLS1wYXBlci10YWJzLXNlbGVjdGlvbi1iYXItY29sb3I6IHdoaXRlOwogICAgICAgIC0tcGFwZXItdGFicy1jb250ZW50OiB7CiAgICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgfQogICAgICB9CgogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yOiB3aGl0ZTsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1jb2xvcjogd2hpdGU7CiAgICAgICAgLS1wYXBlci1kcm9wZG93bi1tZW51LWljb246IHsKICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1kcm9wZG93bi1tZW51LWlucHV0OiB7CiAgICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgfQogICAgICB9CgogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHBhcGVyLWl0ZW0gewogICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgIH0KCiAgICAgICNpbmFjdGl2ZS1kYXNoYm9hcmRzLW1lbnUgewogICAgICAgIC0tcGFwZXItbGlzdGJveC1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoCiAgICAgICAgICAtLXRiLXRvb2xiYXItYmFja2dyb3VuZC1jb2xvciwKICAgICAgICAgIHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpCiAgICAgICAgKTsKICAgICAgICAtLXBhcGVyLWxpc3Rib3gtY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAuZ2xvYmFsLWFjdGlvbnMgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyAvKiBFbnN1cmUgdGhhdCBpY29ucyBzdGF5IGFsaWduZWQgKi8KICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAuZ2xvYmFsLWFjdGlvbnMgYSB7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAjdG9vbGJhci1jb250ZW50IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgICAjY29udGVudC1wYW5lIHsKICAgICAgICBhbGlnbi1pdGVtczogc3RyZXRjaDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3RyZXRjaDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2NvbnRlbnQgewogICAgICAgIGZsZXg6IDEgMTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAuZGFzaGJvYXJkLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAvKiBIaWRlIHVuc2VsZWN0ZWQgZGFzaGJvYXJkcy4gV2Ugc3RpbGwgZGlzcGxheSB0aGVtIHdpdGhpbiBhIGNvbnRhaW5lcgogICAgICAgICBvZiBoZWlnaHQgMCBzaW5jZSBQbG90dGFibGUgcHJvZHVjZXMgZGVnZW5lcmF0ZSBjaGFydHMgd2hlbiBjaGFydHMgYXJlCiAgICAgICAgIHJlbG9hZGVkIHdoaWxlIG5vdCBkaXNwbGF5ZWQuICovCiAgICAgIC5kYXNoYm9hcmQtY29udGFpbmVyOm5vdChbZGF0YS1zZWxlY3RlZF0pIHsKICAgICAgICBtYXgtaGVpZ2h0OiAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIC8qKiBXZSBmdXJ0aGVyIG1ha2UgY29udGFpbmVycyBpbnZpc2libGUuIFNvbWUgZWxlbWVudHMgbWF5IGFuY2hvciB0bwogICAgICAgICAgICB0aGUgdmlld3BvcnQgaW5zdGVhZCBvZiB0aGUgY29udGFpbmVyLCBpbiB3aGljaCBjYXNlIHNldHRpbmcgdGhlIG1heAogICAgICAgICAgICBoZWlnaHQgaGVyZSB0byAwIHdpbGwgbm90IGhpZGUgdGhlbS4gKi8KICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5kYXNoYm9hcmQtY29udGFpbmVyIGlmcmFtZSB7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLndhcm5pbmctbWVzc2FnZSB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KCiAgICAgIFtkaXNhYmxlZF0gewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgIH0KCiAgICAgICNyZWxvYWQtYnV0dG9uLnJlZnJlc2hpbmcgewogICAgICAgIGFuaW1hdGlvbjogcm90YXRlIDJzIGxpbmVhciBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyByb3RhdGUgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOwogICAgICAgIH0KICAgICAgICA1MCUgewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAogIAo8L2RvbS1tb2R1bGU+Cgo8Ym9keT4KICA8dGYtdGVuc29yYm9hcmQgdXNlLWhhc2ggYnJhbmQ9IlRlbnNvckJvYXJkIj48L3RmLXRlbnNvcmJvYXJkPgoKPHNjcmlwdCBzcmM9ImluZGV4LmpzIj48L3NjcmlwdD4=", + "ok": true, + "headers": [ + [ + "content-type", + "text/html; charset=utf-8" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6007/index.js": { + "data": "Ly8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvYmFzZS5qcwp2YXIgTjtmdW5jdGlvbiB0YShhKXt2YXIgYz0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBjPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYysrXX06e2RvbmU6ITB9fX1mdW5jdGlvbiBNYShhKXtyZXR1cm57bmV4dDp0YShhKX19ZnVuY3Rpb24gY2IoYSl7dmFyIGM9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmYVtTeW1ib2wuaXRlcmF0b3JdO3JldHVybiBjP2MuY2FsbChhKTpNYShhKX12YXIgZ2I9ZnVuY3Rpb24oYSl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdz09PWE/YToidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbCYmbnVsbCE9Z2xvYmFsP2dsb2JhbDphfSh0aGlzKSxpYj0iZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnRpZXM/T2JqZWN0LmRlZmluZVByb3BlcnR5OmZ1bmN0aW9uKGEsYyxkKXthIT1BcnJheS5wcm90b3R5cGUmJmEhPU9iamVjdC5wcm90b3R5cGUmJihhW2NdPWQudmFsdWUpfTsKZnVuY3Rpb24gcGIoYSxjKXtpZihjKXt2YXIgZD1nYjthPWEuc3BsaXQoIi4iKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoLTE7ZisrKXt2YXIgZz1hW2ZdO2cgaW4gZHx8KGRbZ109e30pO2Q9ZFtnXX1hPWFbYS5sZW5ndGgtMV07Zj1kW2FdO2M9YyhmKTtjIT1mJiZudWxsIT1jJiZpYihkLGEse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpjfSl9fQpwYigiUHJvbWlzZSIsZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhuKXt0aGlzLnN0YXRlXz0wO3RoaXMucmVzdWx0Xz12b2lkIDA7dGhpcy5vblNldHRsZWRDYWxsYmFja3NfPVtdO3ZhciBwPXRoaXMuY3JlYXRlUmVzb2x2ZUFuZFJlamVjdF8oKTt0cnl7bihwLnJlc29sdmUscC5yZWplY3QpfWNhdGNoKHEpe3AucmVqZWN0KHEpfX1mdW5jdGlvbiBkKCl7dGhpcy5iYXRjaF89bnVsbH1mdW5jdGlvbiBmKG4pe3N3aXRjaCh0eXBlb2Ygbil7Y2FzZSAib2JqZWN0IjpyZXR1cm4gbnVsbCE9bjtjYXNlICJmdW5jdGlvbiI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gZyhuKXtyZXR1cm4gbiBpbnN0YW5jZW9mIGM/bjpuZXcgYyhmdW5jdGlvbihwKXtwKG4pfSl9aWYoYSlyZXR1cm4gYTtkLnByb3RvdHlwZS5hc3luY0V4ZWN1dGU9ZnVuY3Rpb24obil7aWYobnVsbD09dGhpcy5iYXRjaF8pe3RoaXMuYmF0Y2hfPVtdO3ZhciBwPXRoaXM7dGhpcy5hc3luY0V4ZWN1dGVGdW5jdGlvbihmdW5jdGlvbigpe3AuZXhlY3V0ZUJhdGNoXygpfSl9dGhpcy5iYXRjaF8ucHVzaChuKX07CnZhciBsPWdiLnNldFRpbWVvdXQ7ZC5wcm90b3R5cGUuYXN5bmNFeGVjdXRlRnVuY3Rpb249ZnVuY3Rpb24obil7bChuLDApfTtkLnByb3RvdHlwZS5leGVjdXRlQmF0Y2hfPWZ1bmN0aW9uKCl7Zm9yKDt0aGlzLmJhdGNoXyYmdGhpcy5iYXRjaF8ubGVuZ3RoOyl7dmFyIG49dGhpcy5iYXRjaF87dGhpcy5iYXRjaF89W107Zm9yKHZhciBwPTA7cDxuLmxlbmd0aDsrK3Ape3ZhciBxPW5bcF07bltwXT1udWxsO3RyeXtxKCl9Y2F0Y2gocil7dGhpcy5hc3luY1Rocm93XyhyKX19fXRoaXMuYmF0Y2hfPW51bGx9O2QucHJvdG90eXBlLmFzeW5jVGhyb3dfPWZ1bmN0aW9uKG4pe3RoaXMuYXN5bmNFeGVjdXRlRnVuY3Rpb24oZnVuY3Rpb24oKXt0aHJvdyBuO30pfTtjLnByb3RvdHlwZS5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0Xz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4ocil7cmV0dXJuIGZ1bmN0aW9uKHQpe3F8fChxPSEwLHIuY2FsbChwLHQpKX19dmFyIHA9dGhpcyxxPSExO3JldHVybntyZXNvbHZlOm4odGhpcy5yZXNvbHZlVG9fKSwKcmVqZWN0Om4odGhpcy5yZWplY3RfKX19O2MucHJvdG90eXBlLnJlc29sdmVUb189ZnVuY3Rpb24obil7bj09PXRoaXM/dGhpcy5yZWplY3RfKG5ldyBUeXBlRXJyb3IoIkEgUHJvbWlzZSBjYW5ub3QgcmVzb2x2ZSB0byBpdHNlbGYiKSk6biBpbnN0YW5jZW9mIGM/dGhpcy5zZXR0bGVTYW1lQXNQcm9taXNlXyhuKTpmKG4pP3RoaXMucmVzb2x2ZVRvTm9uUHJvbWlzZU9ial8obik6dGhpcy5mdWxmaWxsXyhuKX07Yy5wcm90b3R5cGUucmVzb2x2ZVRvTm9uUHJvbWlzZU9ial89ZnVuY3Rpb24obil7dmFyIHA9dm9pZCAwO3RyeXtwPW4udGhlbn1jYXRjaChxKXt0aGlzLnJlamVjdF8ocSk7cmV0dXJufSJmdW5jdGlvbiI9PXR5cGVvZiBwP3RoaXMuc2V0dGxlU2FtZUFzVGhlbmFibGVfKHAsbik6dGhpcy5mdWxmaWxsXyhuKX07Yy5wcm90b3R5cGUucmVqZWN0Xz1mdW5jdGlvbihuKXt0aGlzLnNldHRsZV8oMixuKX07Yy5wcm90b3R5cGUuZnVsZmlsbF89ZnVuY3Rpb24obil7dGhpcy5zZXR0bGVfKDEsCm4pfTtjLnByb3RvdHlwZS5zZXR0bGVfPWZ1bmN0aW9uKG4scCl7aWYoMCE9dGhpcy5zdGF0ZV8pdGhyb3cgRXJyb3IoIkNhbm5vdCBzZXR0bGUoIituKyIsICIrcCsiKTogUHJvbWlzZSBhbHJlYWR5IHNldHRsZWQgaW4gc3RhdGUiK3RoaXMuc3RhdGVfKTt0aGlzLnN0YXRlXz1uO3RoaXMucmVzdWx0Xz1wO3RoaXMuZXhlY3V0ZU9uU2V0dGxlZENhbGxiYWNrc18oKX07Yy5wcm90b3R5cGUuZXhlY3V0ZU9uU2V0dGxlZENhbGxiYWNrc189ZnVuY3Rpb24oKXtpZihudWxsIT10aGlzLm9uU2V0dGxlZENhbGxiYWNrc18pe2Zvcih2YXIgbj0wO248dGhpcy5vblNldHRsZWRDYWxsYmFja3NfLmxlbmd0aDsrK24pay5hc3luY0V4ZWN1dGUodGhpcy5vblNldHRsZWRDYWxsYmFja3NfW25dKTt0aGlzLm9uU2V0dGxlZENhbGxiYWNrc189bnVsbH19O3ZhciBrPW5ldyBkO2MucHJvdG90eXBlLnNldHRsZVNhbWVBc1Byb21pc2VfPWZ1bmN0aW9uKG4pe3ZhciBwPXRoaXMuY3JlYXRlUmVzb2x2ZUFuZFJlamVjdF8oKTsKbi5jYWxsV2hlblNldHRsZWRfKHAucmVzb2x2ZSxwLnJlamVjdCl9O2MucHJvdG90eXBlLnNldHRsZVNhbWVBc1RoZW5hYmxlXz1mdW5jdGlvbihuLHApe3ZhciBxPXRoaXMuY3JlYXRlUmVzb2x2ZUFuZFJlamVjdF8oKTt0cnl7bi5jYWxsKHAscS5yZXNvbHZlLHEucmVqZWN0KX1jYXRjaChyKXtxLnJlamVjdChyKX19O2MucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24obixwKXtmdW5jdGlvbiBxKHkseil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHk/ZnVuY3Rpb24oeCl7dHJ5e3IoeSh4KSl9Y2F0Y2goQyl7dChDKX19Onp9dmFyIHIsdCx2PW5ldyBjKGZ1bmN0aW9uKHkseil7cj15O3Q9en0pO3RoaXMuY2FsbFdoZW5TZXR0bGVkXyhxKG4scikscShwLHQpKTtyZXR1cm4gdn07Yy5wcm90b3R5cGUuY2F0Y2g9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMudGhlbih2b2lkIDAsbil9O2MucHJvdG90eXBlLmNhbGxXaGVuU2V0dGxlZF89ZnVuY3Rpb24obixwKXtmdW5jdGlvbiBxKCl7c3dpdGNoKHIuc3RhdGVfKXtjYXNlIDE6bihyLnJlc3VsdF8pOwpicmVhaztjYXNlIDI6cChyLnJlc3VsdF8pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlVuZXhwZWN0ZWQgc3RhdGU6ICIrci5zdGF0ZV8pO319dmFyIHI9dGhpcztudWxsPT10aGlzLm9uU2V0dGxlZENhbGxiYWNrc18/ay5hc3luY0V4ZWN1dGUocSk6dGhpcy5vblNldHRsZWRDYWxsYmFja3NfLnB1c2gocSl9O2MucmVzb2x2ZT1nO2MucmVqZWN0PWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgYyhmdW5jdGlvbihwLHEpe3Eobil9KX07Yy5yYWNlPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgYyhmdW5jdGlvbihwLHEpe2Zvcih2YXIgcj1jYihuKSx0PXIubmV4dCgpOyF0LmRvbmU7dD1yLm5leHQoKSlnKHQudmFsdWUpLmNhbGxXaGVuU2V0dGxlZF8ocCxxKX0pfTtjLmFsbD1mdW5jdGlvbihuKXt2YXIgcD1jYihuKSxxPXAubmV4dCgpO3JldHVybiBxLmRvbmU/ZyhbXSk6bmV3IGMoZnVuY3Rpb24ocix0KXtmdW5jdGlvbiB2KHgpe3JldHVybiBmdW5jdGlvbihDKXt5W3hdPUM7ei0tOzA9PQp6JiZyKHkpfX12YXIgeT1bXSx6PTA7ZG8geS5wdXNoKHZvaWQgMCkseisrLGcocS52YWx1ZSkuY2FsbFdoZW5TZXR0bGVkXyh2KHkubGVuZ3RoLTEpLHQpLHE9cC5uZXh0KCk7d2hpbGUoIXEuZG9uZSl9KX07cmV0dXJuIGN9KTtwYigiUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseSIsZnVuY3Rpb24oYSl7cmV0dXJuIGE/YTpmdW5jdGlvbihjKXtyZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uKGQpe3JldHVybiBQcm9taXNlLnJlc29sdmUoYygpKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGR9KX0sZnVuY3Rpb24oZCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShjKCkpLnRoZW4oZnVuY3Rpb24oKXt0aHJvdyBkO30pfSl9fSk7CmZ1bmN0aW9uIHZiKGEpe2Z1bmN0aW9uIGMoZil7cmV0dXJuIGEubmV4dChmKX1mdW5jdGlvbiBkKGYpe3JldHVybiBhLnRocm93KGYpfXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihmLGcpe2Z1bmN0aW9uIGwoayl7ay5kb25lP2Yoay52YWx1ZSk6UHJvbWlzZS5yZXNvbHZlKGsudmFsdWUpLnRoZW4oYyxkKS50aGVuKGwsZyl9bChhLm5leHQoKSl9KX1mdW5jdGlvbiBCYihhKXtyZXR1cm4gdmIoYSgpKX1mdW5jdGlvbiBDYihhKXtyZXR1cm4gdm9pZCAwIT09YX1mdW5jdGlvbiBIYihhKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGF9CmZ1bmN0aW9uIExiKGEpe3ZhciBjPXR5cGVvZiBhO2lmKCJvYmplY3QiPT1jKWlmKGEpe2lmKGEgaW5zdGFuY2VvZiBBcnJheSlyZXR1cm4iYXJyYXkiO2lmKGEgaW5zdGFuY2VvZiBPYmplY3QpcmV0dXJuIGM7dmFyIGQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGEpO2lmKCJbb2JqZWN0IFdpbmRvd10iPT1kKXJldHVybiJvYmplY3QiO2lmKCJbb2JqZWN0IEFycmF5XSI9PWR8fCJudW1iZXIiPT10eXBlb2YgYS5sZW5ndGgmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5zcGxpY2UmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoInNwbGljZSIpKXJldHVybiJhcnJheSI7aWYoIltvYmplY3QgRnVuY3Rpb25dIj09ZHx8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmNhbGwmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmIWEucHJvcGVydHlJc0VudW1lcmFibGUoImNhbGwiKSlyZXR1cm4iZnVuY3Rpb24ifWVsc2UgcmV0dXJuIm51bGwiOwplbHNlIGlmKCJmdW5jdGlvbiI9PWMmJiJ1bmRlZmluZWQiPT10eXBlb2YgYS5jYWxsKXJldHVybiJvYmplY3QiO3JldHVybiBjfWZ1bmN0aW9uIE1iKGEpe3JldHVybiBudWxsPT09YX1mdW5jdGlvbiBRYihhKXtyZXR1cm4iYXJyYXkiPT1MYihhKX1mdW5jdGlvbiBUYihhLGMpe2Z1bmN0aW9uIGQoKXt9ZC5wcm90b3R5cGU9Yy5wcm90b3R5cGU7YS5zdXBlckNsYXNzXz1jLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgZDthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EuYmFzZT1mdW5jdGlvbihmLGcsbCl7Zm9yKHZhciBrPUFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMiksbj0yO248YXJndW1lbnRzLmxlbmd0aDtuKyspa1tuLTJdPWFyZ3VtZW50c1tuXTtyZXR1cm4gYy5wcm90b3R5cGVbZ10uYXBwbHkoZixrKX19OwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy90cmFuc2l0aW9uYWxmb3J3YXJkZGVjbGFyYXRpb25zLmpzCi8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2RlYnVnL2Vycm9yLmpzCmZ1bmN0aW9uIFZiKGEpe2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsVmIpO2Vsc2V7dmFyIGM9RXJyb3IoKS5zdGFjaztjJiYodGhpcy5zdGFjaz1jKX1hJiYodGhpcy5tZXNzYWdlPVN0cmluZyhhKSk7dGhpcy5yZXBvcnRFcnJvclRvU2VydmVyPSEwfVRiKFZiLEVycm9yKTtWYi5wcm90b3R5cGUubmFtZT0iQ3VzdG9tRXJyb3IiOwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9kb20vbm9kZXR5cGUuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvYXNzZXJ0cy9hc3NlcnRzLmpzCmZ1bmN0aW9uIFhiKGEsYyl7VmIuY2FsbCh0aGlzLFpiKGEsYykpO3RoaXMubWVzc2FnZVBhdHRlcm49YX1UYihYYixWYik7WGIucHJvdG90eXBlLm5hbWU9IkFzc2VydGlvbkVycm9yIjtmdW5jdGlvbiBhYyhhKXt0aHJvdyBhO31mdW5jdGlvbiBaYihhLGMpe2E9YS5zcGxpdCgiJXMiKTtmb3IodmFyIGQ9IiIsZj1hLmxlbmd0aC0xLGc9MDtnPGY7ZysrKWQrPWFbZ10rKGc8Yy5sZW5ndGg/Y1tnXToiJXMiKTtyZXR1cm4gZCthW2ZdfWZ1bmN0aW9uIGRjKGEsYyl7YWMobmV3IFhiKCJGYWlsdXJlIisoYT8iOiAiK2E6IiIpLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSkpfTsKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvYXJyYXkvYXJyYXkuanMKdmFyIGdjPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoP2Z1bmN0aW9uKGEsYyl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChhLGMsdm9pZCAwKX06ZnVuY3Rpb24oYSxjKXtmb3IodmFyIGQ9YS5sZW5ndGgsZj1IYihhKT9hLnNwbGl0KCIiKTphLGc9MDtnPGQ7ZysrKWcgaW4gZiYmYy5jYWxsKHZvaWQgMCxmW2ddLGcsYSl9LGhjPUFycmF5LnByb3RvdHlwZS5tYXA/ZnVuY3Rpb24oYSxjKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKGEsYyx2b2lkIDApfTpmdW5jdGlvbihhLGMpe2Zvcih2YXIgZD1hLmxlbmd0aCxmPUFycmF5KGQpLGc9SGIoYSk/YS5zcGxpdCgiIik6YSxsPTA7bDxkO2wrKylsIGluIGcmJihmW2xdPWMuY2FsbCh2b2lkIDAsZ1tsXSxsLGEpKTtyZXR1cm4gZn07CmZ1bmN0aW9uIGtjKGEsYyxkKXtyZXR1cm4gMj49YXJndW1lbnRzLmxlbmd0aD9BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLGMpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsYyxkKX07Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2NyeXB0L2NyeXB0LmpzCmZ1bmN0aW9uIGxjKGEpe2lmKDgxOTI+PWEubGVuZ3RoKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsYSk7Zm9yKHZhciBjPSIiLGQ9MDtkPGEubGVuZ3RoO2QrPTgxOTIpYys9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGtjKGEsZCxkKzgxOTIpKTtyZXR1cm4gY307Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2RvbS9hc3NlcnRzLmpzCi8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2Z1bmN0aW9ucy9mdW5jdGlvbnMuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvZG9tL2h0bWxlbGVtZW50LmpzCi8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2RvbS90YWduYW1lLmpzCi8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL29iamVjdC9vYmplY3QuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvZG9tL3RhZ3MuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvaHRtbC90cnVzdGVkdHlwZXMuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvc3RyaW5nL3R5cGVkc3RyaW5nLmpzCi8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL3N0cmluZy9jb25zdC5qcwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9odG1sL3NhZmVzY3JpcHQuanMKZnVuY3Rpb24gcWMoKXt0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVTY3JpcHRXcmFwcGVkVmFsdWVfPSIiO3RoaXMuU0FGRV9TQ1JJUFRfVFlQRV9NQVJLRVJfR09PR19IVE1MX1NFQ1VSSVRZX1BSSVZBVEVfPXJjfXFjLnByb3RvdHlwZS5pbXBsZW1lbnRzR29vZ1N0cmluZ1R5cGVkU3RyaW5nPSEwO3ZhciByYz17fTtxYy5wcm90b3R5cGUuZ2V0VHlwZWRTdHJpbmdWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVTY3JpcHRXcmFwcGVkVmFsdWVfLnRvU3RyaW5nKCl9O3FjLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJTYWZlU2NyaXB0eyIrdGhpcy5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VTYWZlU2NyaXB0V3JhcHBlZFZhbHVlXysifSJ9OwpxYy5wcm90b3R5cGUuaW5pdFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlXz1mdW5jdGlvbihhKXt0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVTY3JpcHRXcmFwcGVkVmFsdWVfPWE7cmV0dXJuIHRoaXN9OyhmdW5jdGlvbihhKXtyZXR1cm4obmV3IHFjKS5pbml0U2VjdXJpdHlQcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VfKGEpfSkoIiIpOwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9mcy91cmwuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvaTE4bi9iaWRpLmpzCi8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2h0bWwvdHJ1c3RlZHJlc291cmNldXJsLmpzCi8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL3N0cmluZy9pbnRlcm5hbC5qcwpmdW5jdGlvbiBzYyhhKXtyZXR1cm4vXltcc1x4YTBdKiQvLnRlc3QoYSl9ZnVuY3Rpb24gdGMoYSl7cmV0dXJuLTEhPSJceDNkLiIuaW5kZXhPZihhKX07Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2h0bWwvc2FmZXVybC5qcwpmdW5jdGlvbiB3Yygpe3RoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVVybFdyYXBwZWRWYWx1ZV89IiI7dGhpcy5TQUZFX1VSTF9UWVBFX01BUktFUl9HT09HX0hUTUxfU0VDVVJJVFlfUFJJVkFURV89RGN9Tj13Yy5wcm90b3R5cGU7Ti5pbXBsZW1lbnRzR29vZ1N0cmluZ1R5cGVkU3RyaW5nPSEwO04uZ2V0VHlwZWRTdHJpbmdWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVVcmxXcmFwcGVkVmFsdWVfLnRvU3RyaW5nKCl9O04uaW1wbGVtZW50c0dvb2dJMThuQmlkaURpcmVjdGlvbmFsU3RyaW5nPSEwO04uZ2V0RGlyZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIDF9O04udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iU2FmZVVybHsiK3RoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVVybFdyYXBwZWRWYWx1ZV8rIn0ifTt2YXIgRGM9e307CihmdW5jdGlvbihhKXt2YXIgYz1uZXcgd2M7Yy5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VTYWZlVXJsV3JhcHBlZFZhbHVlXz1hO3JldHVybiBjfSkoImFib3V0OmJsYW5rIik7Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2h0bWwvc2FmZXN0eWxlLmpzCmZ1bmN0aW9uIE5jKCl7dGhpcy5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VTYWZlU3R5bGVXcmFwcGVkVmFsdWVfPSIiO3RoaXMuU0FGRV9TVFlMRV9UWVBFX01BUktFUl9HT09HX0hUTUxfU0VDVVJJVFlfUFJJVkFURV89T2N9TmMucHJvdG90eXBlLmltcGxlbWVudHNHb29nU3RyaW5nVHlwZWRTdHJpbmc9ITA7dmFyIE9jPXt9O05jLnByb3RvdHlwZS5nZXRUeXBlZFN0cmluZ1ZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVN0eWxlV3JhcHBlZFZhbHVlX307TmMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlNhZmVTdHlsZXsiK3RoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZVN0eWxlV3JhcHBlZFZhbHVlXysifSJ9OwpOYy5wcm90b3R5cGUuaW5pdFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlXz1mdW5jdGlvbihhKXt0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVTdHlsZVdyYXBwZWRWYWx1ZV89YTtyZXR1cm4gdGhpc307KGZ1bmN0aW9uKGEpe3JldHVybihuZXcgTmMpLmluaXRTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZV8oYSl9KSgiIik7Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2h0bWwvc2FmZXN0eWxlc2hlZXQuanMKZnVuY3Rpb24gUGMoKXt0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVTdHlsZVNoZWV0V3JhcHBlZFZhbHVlXz0iIjt0aGlzLlNBRkVfU1RZTEVfU0hFRVRfVFlQRV9NQVJLRVJfR09PR19IVE1MX1NFQ1VSSVRZX1BSSVZBVEVfPVRjfVBjLnByb3RvdHlwZS5pbXBsZW1lbnRzR29vZ1N0cmluZ1R5cGVkU3RyaW5nPSEwO3ZhciBUYz17fTtQYy5wcm90b3R5cGUuZ2V0VHlwZWRTdHJpbmdWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVTdHlsZVNoZWV0V3JhcHBlZFZhbHVlX307UGMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlNhZmVTdHlsZVNoZWV0eyIrdGhpcy5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VTYWZlU3R5bGVTaGVldFdyYXBwZWRWYWx1ZV8rIn0ifTsKUGMucHJvdG90eXBlLmluaXRTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZV89ZnVuY3Rpb24oYSl7dGhpcy5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VTYWZlU3R5bGVTaGVldFdyYXBwZWRWYWx1ZV89YTtyZXR1cm4gdGhpc307KGZ1bmN0aW9uKGEpe3JldHVybihuZXcgUGMpLmluaXRTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZV8oYSl9KSgiIik7Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2xhYnMvdXNlcmFnZW50L3V0aWwuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvbGFicy91c2VyYWdlbnQvYnJvd3Nlci5qcwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9odG1sL3NhZmVodG1sLmpzCmZ1bmN0aW9uIFVjKCl7dGhpcy5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VTYWZlSHRtbFdyYXBwZWRWYWx1ZV89IiI7dGhpcy5TQUZFX0hUTUxfVFlQRV9NQVJLRVJfR09PR19IVE1MX1NFQ1VSSVRZX1BSSVZBVEVfPVZjO3RoaXMuZGlyXz1udWxsfU49VWMucHJvdG90eXBlO04uaW1wbGVtZW50c0dvb2dJMThuQmlkaURpcmVjdGlvbmFsU3RyaW5nPSEwO04uZ2V0RGlyZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlyX307Ti5pbXBsZW1lbnRzR29vZ1N0cmluZ1R5cGVkU3RyaW5nPSEwO04uZ2V0VHlwZWRTdHJpbmdWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByaXZhdGVEb05vdEFjY2Vzc09yRWxzZVNhZmVIdG1sV3JhcHBlZFZhbHVlXy50b1N0cmluZygpfTtOLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlNhZmVIdG1seyIrdGhpcy5wcml2YXRlRG9Ob3RBY2Nlc3NPckVsc2VTYWZlSHRtbFdyYXBwZWRWYWx1ZV8rIn0ifTt2YXIgVmM9e307CmZ1bmN0aW9uIFdjKGEpeyhuZXcgVWMpLmluaXRTZWN1cml0eVByaXZhdGVEb05vdEFjY2Vzc09yRWxzZV8oYSwwKX1VYy5wcm90b3R5cGUuaW5pdFNlY3VyaXR5UHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlXz1mdW5jdGlvbihhLGMpe3RoaXMucHJpdmF0ZURvTm90QWNjZXNzT3JFbHNlU2FmZUh0bWxXcmFwcGVkVmFsdWVfPWE7dGhpcy5kaXJfPWM7cmV0dXJuIHRoaXN9O1djKCJceDNjIURPQ1RZUEUgaHRtbFx4M2UiKTtXYygiIik7V2MoIlx4M2Niclx4M2UiKTsKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvaHRtbC91bmNoZWNrZWRjb252ZXJzaW9ucy5qcwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9kb20vc2FmZS5qcwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9zdHJpbmcvc3RyaW5nLmpzCi8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2xhYnMvdXNlcmFnZW50L2VuZ2luZS5qcwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9sYWJzL3VzZXJhZ2VudC9wbGF0Zm9ybS5qcwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9yZWZsZWN0L3JlZmxlY3QuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9qYXZhc2NyaXB0X2Nsb3N1cmVfbGlicmFyeS9jbG9zdXJlL2dvb2cvdXNlcmFnZW50L3VzZXJhZ2VudC5qcwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy91c2VyYWdlbnQvcHJvZHVjdC5qcwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9jcnlwdC9iYXNlNjQuanMKZnVuY3Rpb24gWGMoYSl7cmV0dXJuIHRjKGEpfXZhciBZYz17fSxuZD1udWxsO2Z1bmN0aW9uIG9kKGEsYyl7ITE9PT1jfHx2b2lkIDA9PT1jP2M9MDohMD09PWMmJihjPTMpO3BkKCk7Yz1ZY1tjXTtmb3IodmFyIGQ9W10sZj0wO2Y8YS5sZW5ndGg7Zis9Myl7dmFyIGc9YVtmXSxsPWYrMTxhLmxlbmd0aCxrPWw/YVtmKzFdOjAsbj1mKzI8YS5sZW5ndGgscD1uP2FbZisyXTowLHE9Zz4+MjtnPShnJjMpPDw0fGs+PjQ7az0oayYxNSk8PDJ8cD4+NjtwJj02MztufHwocD02NCxsfHwoaz02NCkpO2QucHVzaChjW3FdLGNbZ10sY1trXXx8IiIsY1twXXx8IiIpfXJldHVybiBkLmpvaW4oIiIpfQpmdW5jdGlvbiBxZChhKXt2YXIgYz1hLmxlbmd0aCxkPTMqYy80O2QlMz9kPU1hdGguZmxvb3IoZCk6WGMoYVtjLTFdKSYmKGQ9WGMoYVtjLTJdKT9kLTI6ZC0xKTt2YXIgZj1uZXcgVWludDhBcnJheShkKSxnPTA7cmQoYSxmdW5jdGlvbihsKXtmW2crK109bH0pO3JldHVybiBmLnN1YmFycmF5KDAsZyl9ZnVuY3Rpb24gcmQoYSxjKXtmdW5jdGlvbiBkKHApe2Zvcig7ZjxhLmxlbmd0aDspe3ZhciBxPWEuY2hhckF0KGYrKykscj1uZFtxXTtpZihudWxsIT1yKXJldHVybiByO2lmKCFzYyhxKSl0aHJvdyBFcnJvcigiVW5rbm93biBiYXNlNjQgZW5jb2RpbmcgYXQgY2hhcjogIitxKTt9cmV0dXJuIHB9cGQoKTtmb3IodmFyIGY9MDs7KXt2YXIgZz1kKC0xKSxsPWQoMCksaz1kKDY0KSxuPWQoNjQpO2lmKDY0PT09biYmLTE9PT1nKWJyZWFrO2MoZzw8MnxsPj40KTs2NCE9ayYmKGMobDw8NCYyNDB8az4+MiksNjQhPW4mJmMoazw8NiYxOTJ8bikpfX0KZnVuY3Rpb24gcGQoKXtpZighbmQpe25kPXt9O2Zvcih2YXIgYT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiLnNwbGl0KCIiKSxjPVsiKy9ceDNkIiwiKy8iLCItX1x4M2QiLCItXy4iLCItXyJdLGQ9MDs1PmQ7ZCsrKXt2YXIgZj1hLmNvbmNhdChjW2RdLnNwbGl0KCIiKSk7WWNbZF09Zjtmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl7dmFyIGw9ZltnXTt2b2lkIDA9PT1uZFtsXSYmKG5kW2xdPWcpfX19fTsKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9wcm90b2J1Zl9qcy9iaW5hcnkvYXJpdGguanMKZnVuY3Rpb24gc2QoYSxjKXt0aGlzLmxvPWE7dGhpcy5oaT1jfU49c2QucHJvdG90eXBlO04uY21wPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmhpPGEuaGl8fHRoaXMuaGk9PWEuaGkmJnRoaXMubG88YS5sbz8tMTp0aGlzLmhpPT1hLmhpJiZ0aGlzLmxvPT1hLmxvPzA6MX07Ti5yaWdodFNoaWZ0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBzZCgodGhpcy5sbz4+PjF8KHRoaXMuaGkmMSk8PDMxKT4+PjAsdGhpcy5oaT4+PjE+Pj4wKX07Ti5sZWZ0U2hpZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHNkKHRoaXMubG88PDE+Pj4wLCh0aGlzLmhpPDwxfHRoaXMubG8+Pj4zMSk+Pj4wKX07Ti5tc2I9ZnVuY3Rpb24oKXtyZXR1cm4hISh0aGlzLmhpJjIxNDc0ODM2NDgpfTtOLmxzYj1mdW5jdGlvbigpe3JldHVybiEhKHRoaXMubG8mMSl9O04uemVybz1mdW5jdGlvbigpe3JldHVybiAwPT10aGlzLmxvJiYwPT10aGlzLmhpfTsKTi5hZGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBzZCgodGhpcy5sbythLmxvJjQyOTQ5NjcyOTUpPj4+MD4+PjAsKCh0aGlzLmhpK2EuaGkmNDI5NDk2NzI5NSk+Pj4wKSsoNDI5NDk2NzI5Njw9dGhpcy5sbythLmxvPzE6MCk+Pj4wKX07Ti5zdWI9ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBzZCgodGhpcy5sby1hLmxvJjQyOTQ5NjcyOTUpPj4+MD4+PjAsKCh0aGlzLmhpLWEuaGkmNDI5NDk2NzI5NSk+Pj4wKS0oMD50aGlzLmxvLWEubG8/MTowKT4+PjApfTtmdW5jdGlvbiBJZChhKXt2YXIgYz1hJjY1NTM1LGQ9YT4+PjE2O2E9MTAqYys2NTUzNiooMCpjJjY1NTM1KSs2NTUzNiooMTAqZCY2NTUzNSk7Zm9yKGM9MCpkKygwKmM+Pj4xNikrKDEwKmQ+Pj4xNik7NDI5NDk2NzI5Njw9YTspYS09NDI5NDk2NzI5NixjKz0xO3JldHVybiBuZXcgc2QoYT4+PjAsYz4+PjApfQpOLm11bD1mdW5jdGlvbigpe3ZhciBhPUlkKHRoaXMubG8pLGM9SWQodGhpcy5oaSk7Yy5oaT1jLmxvO2MubG89MDtyZXR1cm4gYS5hZGQoYyl9O04uZGl2PWZ1bmN0aW9uKCl7Zm9yKHZhciBhPW5ldyBzZCgwLDApLGM9bmV3IHNkKHRoaXMubG8sdGhpcy5oaSksZD1uZXcgc2QoMTAsMCksZj1uZXcgc2QoMSwwKTshZC5tc2IoKTspZD1kLmxlZnRTaGlmdCgpLGY9Zi5sZWZ0U2hpZnQoKTtmb3IoOyFmLnplcm8oKTspMD49ZC5jbXAoYykmJihhPWEuYWRkKGYpLGM9Yy5zdWIoZCkpLGQ9ZC5yaWdodFNoaWZ0KCksZj1mLnJpZ2h0U2hpZnQoKTtyZXR1cm5bYSxjXX07Ti50b1N0cmluZz1mdW5jdGlvbigpe2Zvcih2YXIgYT0iIixjPXRoaXM7IWMuemVybygpOyl7Yz1jLmRpdigpO3ZhciBkPWNbMF07YT1jWzFdLmxvK2E7Yz1kfSIiPT1hJiYoYT0iMCIpO3JldHVybiBhfTsKZnVuY3Rpb24gSmQoYSl7Zm9yKHZhciBjPW5ldyBzZCgwLDApLGQ9bmV3IHNkKDAsMCksZj0wO2Y8YS5sZW5ndGg7ZisrKXtpZigiMCI+YVtmXXx8IjkiPGFbZl0pcmV0dXJuIG51bGw7ZC5sbz1wYXJzZUludChhW2ZdLDEwKTtjPWMubXVsKCkuYWRkKGQpfXJldHVybiBjfU4uY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHNkKHRoaXMubG8sdGhpcy5oaSl9O2Z1bmN0aW9uIEtkKGEsYyl7dGhpcy5sbz1hO3RoaXMuaGk9Y31LZC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgS2QoKHRoaXMubG8rYS5sbyY0Mjk0OTY3Mjk1KT4+PjA+Pj4wLCgodGhpcy5oaSthLmhpJjQyOTQ5NjcyOTUpPj4+MCkrKDQyOTQ5NjcyOTY8PXRoaXMubG8rYS5sbz8xOjApPj4+MCl9OwpLZC5wcm90b3R5cGUuc3ViPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgS2QoKHRoaXMubG8tYS5sbyY0Mjk0OTY3Mjk1KT4+PjA+Pj4wLCgodGhpcy5oaS1hLmhpJjQyOTQ5NjcyOTUpPj4+MCktKDA+dGhpcy5sby1hLmxvPzE6MCk+Pj4wKX07S2QucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBLZCh0aGlzLmxvLHRoaXMuaGkpfTtLZC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgYT0wIT0odGhpcy5oaSYyMTQ3NDgzNjQ4KSxjPW5ldyBzZCh0aGlzLmxvLHRoaXMuaGkpO2EmJihjPShuZXcgc2QoMCwwKSkuc3ViKGMpKTtyZXR1cm4oYT8iLSI6IiIpK2MudG9TdHJpbmcoKX07ZnVuY3Rpb24gWmQoYSl7dmFyIGM9MDxhLmxlbmd0aCYmIi0iPT1hWzBdO2MmJihhPWEuc3Vic3RyaW5nKDEpKTthPUpkKGEpO2lmKG51bGw9PT1hKXJldHVybiBudWxsO2MmJihhPShuZXcgc2QoMCwwKSkuc3ViKGEpKTtyZXR1cm4gbmV3IEtkKGEubG8sYS5oaSl9OwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX3Byb3RvYnVmX2pzL2JpbmFyeS9jb25zdGFudHMuanMKZnVuY3Rpb24gJGQoYSl7c3dpdGNoKGEpe2Nhc2UgNTpjYXNlIDM6Y2FzZSAxMzpjYXNlIDQ6Y2FzZSAxNzpjYXNlIDE4OmNhc2UgODpjYXNlIDE0OmNhc2UgMzE6cmV0dXJuIDA7Y2FzZSAxOmNhc2UgNjpjYXNlIDE2OmNhc2UgMzA6cmV0dXJuIDE7Y2FzZSA5OmNhc2UgMTE6Y2FzZSAxMjpyZXR1cm4gMjtjYXNlIDI6Y2FzZSA3OmNhc2UgMTU6cmV0dXJuIDU7ZGVmYXVsdDpyZXR1cm4tMX19OwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX3Byb3RvYnVmX2pzL2JpbmFyeS91dGlscy5qcwp2YXIgYWU9MCxiZT0wO2Z1bmN0aW9uIGNlKGEpe3ZhciBjPWE+Pj4wO2E9TWF0aC5mbG9vcigoYS1jKS80Mjk0OTY3Mjk2KT4+PjA7YWU9YztiZT1hfWZ1bmN0aW9uIGRlKGEpe3ZhciBjPTA+YTthPU1hdGguYWJzKGEpO3ZhciBkPWE+Pj4wO2E9TWF0aC5mbG9vcigoYS1kKS80Mjk0OTY3Mjk2KTthPj4+PTA7YyYmKGE9fmE+Pj4wLGQ9KH5kPj4+MCkrMSw0Mjk0OTY3Mjk1PGQmJihkPTAsYSsrLDQyOTQ5NjcyOTU8YSYmKGE9MCkpKTthZT1kO2JlPWF9ZnVuY3Rpb24gZWUoYSl7dmFyIGM9MD5hO2E9MipNYXRoLmFicyhhKTtjZShhKTthPWFlO3ZhciBkPWJlO2MmJigwPT1hPzA9PWQ/ZD1hPTQyOTQ5NjcyOTU6KGQtLSxhPTQyOTQ5NjcyOTUpOmEtLSk7YWU9YTtiZT1kfQpmdW5jdGlvbiBmZShhKXt2YXIgYz0wPmE/MTowO2E9Yz8tYTphO2lmKDA9PT1hKTA8MS9hP2FlPWJlPTA6KGJlPTAsYWU9MjE0NzQ4MzY0OCk7ZWxzZSBpZihpc05hTihhKSliZT0wLGFlPTIxNDc0ODM2NDc7ZWxzZSBpZigzLjQwMjgyMzQ2NjM4NTI4ODZFMzg8YSliZT0wLGFlPShjPDwzMXwyMTM5MDk1MDQwKT4+PjA7ZWxzZSBpZigxLjE3NTQ5NDM1MDgyMjI4NzVFLTM4PmEpYT1NYXRoLnJvdW5kKGEvTWF0aC5wb3coMiwtMTQ5KSksYmU9MCxhZT0oYzw8MzF8YSk+Pj4wO2Vsc2V7dmFyIGQ9TWF0aC5mbG9vcihNYXRoLmxvZyhhKS9NYXRoLkxOMik7YSo9TWF0aC5wb3coMiwtZCk7YT1NYXRoLnJvdW5kKDgzODg2MDgqYSkmODM4ODYwNztiZT0wO2FlPShjPDwzMXxkKzEyNzw8MjN8YSk+Pj4wfX0KZnVuY3Rpb24gZ2UoYSl7dmFyIGM9MD5hPzE6MDthPWM/LWE6YTtpZigwPT09YSliZT0wPDEvYT8wOjIxNDc0ODM2NDgsYWU9MDtlbHNlIGlmKGlzTmFOKGEpKWJlPTIxNDc0ODM2NDcsYWU9NDI5NDk2NzI5NTtlbHNlIGlmKDEuNzk3NjkzMTM0ODYyMzE1N0UzMDg8YSliZT0oYzw8MzF8MjE0NjQzNTA3Mik+Pj4wLGFlPTA7ZWxzZSBpZigyLjIyNTA3Mzg1ODUwNzIwMTRFLTMwOD5hKWEvPU1hdGgucG93KDIsLTEwNzQpLGJlPShjPDwzMXxhLzQyOTQ5NjcyOTYpPj4+MCxhZT1hPj4+MDtlbHNle3ZhciBkPU1hdGguZmxvb3IoTWF0aC5sb2coYSkvTWF0aC5MTjIpOzEwMjQ9PWQmJihkPTEwMjMpO2EqPU1hdGgucG93KDIsLWQpO2JlPShjPDwzMXxkKzEwMjM8PDIwfDEwNDg1NzYqYSYxMDQ4NTc1KT4+PjA7YWU9NDUwMzU5OTYyNzM3MDQ5NiphPj4+MH19CmZ1bmN0aW9uIGhlKGEpe3ZhciBjPWEuY2hhckNvZGVBdCg0KSxkPWEuY2hhckNvZGVBdCg1KSxmPWEuY2hhckNvZGVBdCg2KSxnPWEuY2hhckNvZGVBdCg3KTthZT1hLmNoYXJDb2RlQXQoMCkrKGEuY2hhckNvZGVBdCgxKTw8OCkrKGEuY2hhckNvZGVBdCgyKTw8MTYpKyhhLmNoYXJDb2RlQXQoMyk8PDI0KT4+PjA7YmU9YysoZDw8OCkrKGY8PDE2KSsoZzw8MjQpPj4+MH1mdW5jdGlvbiBBZShhLGMpe3JldHVybiA0Mjk0OTY3Mjk2KmMrYX1mdW5jdGlvbiBCZShhLGMpe3ZhciBkPWMmMjE0NzQ4MzY0ODtkJiYoYT1+YSsxPj4+MCxjPX5jPj4+MCwwPT1hJiYoYz1jKzE+Pj4wKSk7YT1BZShhLGMpO3JldHVybiBkPy1hOmF9ZnVuY3Rpb24gQ2UoYSxjKXt2YXIgZD1hJjE7YT0oYT4+PjF8Yzw8MzEpPj4+MDtjPj4+PTE7ZCYmKGE9YSsxPj4+MCwwPT1hJiYoYz1jKzE+Pj4wKSk7YT1BZShhLGMpO3JldHVybiBkPy1hOmF9CmZ1bmN0aW9uIERlKGEpe3ZhciBjPTIqKGE+PjMxKSsxLGQ9YT4+PjIzJjI1NTthJj04Mzg4NjA3O3JldHVybiAyNTU9PWQ/YT9OYU46SW5maW5pdHkqYzowPT1kP2MqTWF0aC5wb3coMiwtMTQ5KSphOmMqTWF0aC5wb3coMixkLTE1MCkqKGErTWF0aC5wb3coMiwyMykpfWZ1bmN0aW9uIEVlKGEsYyl7dmFyIGQ9MiooYz4+MzEpKzEsZj1jPj4+MjAmMjA0NzthPTQyOTQ5NjcyOTYqKGMmMTA0ODU3NSkrYTtyZXR1cm4gMjA0Nz09Zj9hP05hTjpJbmZpbml0eSpkOjA9PWY/ZCpNYXRoLnBvdygyLC0xMDc0KSphOmQqTWF0aC5wb3coMixmLTEwNzUpKihhKzQ1MDM1OTk2MjczNzA0OTYpfWZ1bmN0aW9uIEZlKGEsYyl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYT4+PjAmMjU1LGE+Pj44JjI1NSxhPj4+MTYmMjU1LGE+Pj4yNCYyNTUsYz4+PjAmMjU1LGM+Pj44JjI1NSxjPj4+MTYmMjU1LGM+Pj4yNCYyNTUpfXZhciBHZT0iMDEyMzQ1Njc4OWFiY2RlZiIuc3BsaXQoIiIpOwpmdW5jdGlvbiBIZShhLGMpe2Z1bmN0aW9uIGQobil7Zm9yKHZhciBwPTFFNyxxPTA7Nz5xO3ErKyl7cC89MTA7dmFyIHI9bi9wJTEwPj4+MDtpZigwIT1yfHxsKWw9ITAsays9Z1tyXX19aWYoMjA5NzE1MT49YylyZXR1cm4iIisoNDI5NDk2NzI5NipjK2EpO3ZhciBmPShhPj4+MjR8Yzw8OCk+Pj4wJjE2Nzc3MjE1O2M9Yz4+MTYmNjU1MzU7YT0oYSYxNjc3NzIxNSkrNjc3NzIxNipmKzY3MTA2NTYqYztmKz04MTQ3NDk3KmM7Yyo9MjsxRTc8PWEmJihmKz1NYXRoLmZsb29yKGEvMUU3KSxhJT0xRTcpOzFFNzw9ZiYmKGMrPU1hdGguZmxvb3IoZi8xRTcpLGYlPTFFNyk7dmFyIGc9R2UsbD0hMSxrPSIiOyhjfHxsKSYmZChjKTsoZnx8bCkmJmQoZik7KGF8fGwpJiZkKGEpO3JldHVybiBrfWZ1bmN0aW9uIG1mKGEsYyl7dmFyIGQ9YyYyMTQ3NDgzNjQ4O2QmJihhPX5hKzE+Pj4wLGM9fmMrKDA9PWE/MTowKT4+PjApO2E9SGUoYSxjKTtyZXR1cm4gZD8iLSIrYTphfQpmdW5jdGlvbiBuZihhKXtmdW5jdGlvbiBjKGssbil7Zm9yKHZhciBwPTA7OD5wJiYoMSE9PWt8fDA8bik7cCsrKW49aypnW3BdK24sZ1twXT1uJjI1NSxuPj4+PTh9ZnVuY3Rpb24gZCgpe2Zvcih2YXIgaz0wOzg+aztrKyspZ1trXT1+Z1trXSYyNTV9dmFyIGY9ITE7Ii0iPT09YVswXSYmKGY9ITAsYT1hLnNsaWNlKDEpKTtmb3IodmFyIGc9WzAsMCwwLDAsMCwwLDAsMF0sbD0wO2w8YS5sZW5ndGg7bCsrKWMoMTAsR2UuaW5kZXhPZihhW2xdKSk7ZiYmKGQoKSxjKDEsMSkpO3JldHVybiBsYyhnKX0KZnVuY3Rpb24gb2YoYSl7aWYoYS5jb25zdHJ1Y3Rvcj09PVVpbnQ4QXJyYXkpcmV0dXJuIGE7aWYoYS5jb25zdHJ1Y3Rvcj09PUFycmF5QnVmZmVyKXJldHVybiBuZXcgVWludDhBcnJheShhKTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEJ1ZmZlciYmYS5jb25zdHJ1Y3Rvcj09PUJ1ZmZlcilyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYSk7aWYoYS5jb25zdHJ1Y3Rvcj09PUFycmF5KXJldHVybiBuZXcgVWludDhBcnJheShhKTtpZihhLmNvbnN0cnVjdG9yPT09U3RyaW5nKXJldHVybiBxZChhKTtkYygiVHlwZSBub3QgY29udmVydGlibGUgdG8gVWludDhBcnJheS4iKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCl9OwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX3Byb3RvYnVmX2pzL2JpbmFyeS9kZWNvZGVyLmpzCmZ1bmN0aW9uIHBmKGEsYyxkKXt0aGlzLmJ5dGVzXz1udWxsO3RoaXMudGVtcEhpZ2hfPXRoaXMudGVtcExvd189dGhpcy5jdXJzb3JfPXRoaXMuZW5kXz10aGlzLnN0YXJ0Xz0wO3RoaXMuZXJyb3JfPSExO2EmJnRoaXMuc2V0QmxvY2soYSxjLGQpfXZhciBxZj1bXTtmdW5jdGlvbiByZihhLGMsZCl7aWYocWYubGVuZ3RoKXt2YXIgZj1xZi5wb3AoKTthJiZmLnNldEJsb2NrKGEsYyxkKTtyZXR1cm4gZn1yZXR1cm4gbmV3IHBmKGEsYyxkKX1OPXBmLnByb3RvdHlwZTtOLmZyZWU9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCk7MTAwPnFmLmxlbmd0aCYmcWYucHVzaCh0aGlzKX07Ti5jbG9uZT1mdW5jdGlvbigpe3JldHVybiByZih0aGlzLmJ5dGVzXyx0aGlzLnN0YXJ0Xyx0aGlzLmVuZF8tdGhpcy5zdGFydF8pfTtOLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5ieXRlc189bnVsbDt0aGlzLmN1cnNvcl89dGhpcy5lbmRfPXRoaXMuc3RhcnRfPTA7dGhpcy5lcnJvcl89ITF9OwpOLmdldEJ1ZmZlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmJ5dGVzX307Ti5zZXRCbG9jaz1mdW5jdGlvbihhLGMsZCl7dGhpcy5ieXRlc189b2YoYSk7dGhpcy5zdGFydF89Q2IoYyk/YzowO3RoaXMuZW5kXz1DYihkKT90aGlzLnN0YXJ0XytkOnRoaXMuYnl0ZXNfLmxlbmd0aDt0aGlzLmN1cnNvcl89dGhpcy5zdGFydF99O04uZ2V0RW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5kX307Ti5zZXRFbmQ9ZnVuY3Rpb24oYSl7dGhpcy5lbmRfPWF9O04ucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmN1cnNvcl89dGhpcy5zdGFydF99O04uZ2V0Q3Vyc29yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3Vyc29yX307Ti5zZXRDdXJzb3I9ZnVuY3Rpb24oYSl7dGhpcy5jdXJzb3JfPWF9O04uYWR2YW5jZT1mdW5jdGlvbihhKXt0aGlzLmN1cnNvcl8rPWF9O04uYXRFbmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJzb3JfPT10aGlzLmVuZF99OwpOLnBhc3RFbmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJzb3JfPnRoaXMuZW5kX307Ti5nZXRFcnJvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yX3x8MD50aGlzLmN1cnNvcl98fHRoaXMuY3Vyc29yXz50aGlzLmVuZF99OwpOLnJlYWRTcGxpdFZhcmludDY0Xz1mdW5jdGlvbigpe2Zvcih2YXIgYSxjPTAsZCxmPTA7ND5mO2YrKylpZihhPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXysrXSxjfD0oYSYxMjcpPDw3KmYsMTI4PmEpe3RoaXMudGVtcExvd189Yz4+PjA7dGhpcy50ZW1wSGlnaF89MDtyZXR1cm59YT10aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rK107Y3w9KGEmMTI3KTw8Mjg7ZD0wfChhJjEyNyk+PjQ7aWYoMTI4PmEpdGhpcy50ZW1wTG93Xz1jPj4+MCx0aGlzLnRlbXBIaWdoXz1kPj4+MDtlbHNle2ZvcihmPTA7NT5mO2YrKylpZihhPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXysrXSxkfD0oYSYxMjcpPDw3KmYrMywxMjg+YSl7dGhpcy50ZW1wTG93Xz1jPj4+MDt0aGlzLnRlbXBIaWdoXz1kPj4+MDtyZXR1cm59ZGMoIkZhaWxlZCB0byByZWFkIHZhcmludCwgZW5jb2RpbmcgaXMgaW52YWxpZC4iKTt0aGlzLmVycm9yXz0hMH19OwpOLnNraXBWYXJpbnQ9ZnVuY3Rpb24oKXtmb3IoO3RoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yX10mMTI4Oyl0aGlzLmN1cnNvcl8rKzt0aGlzLmN1cnNvcl8rK307Ti51bnNraXBWYXJpbnQ9ZnVuY3Rpb24oYSl7Zm9yKDsxMjg8YTspdGhpcy5jdXJzb3JfLS0sYT4+Pj03O3RoaXMuY3Vyc29yXy0tfTsKTi5yZWFkVW5zaWduZWRWYXJpbnQzMj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYnl0ZXNfO3ZhciBjPWFbdGhpcy5jdXJzb3JfKzBdO3ZhciBkPWMmMTI3O2lmKDEyOD5jKXJldHVybiB0aGlzLmN1cnNvcl8rPTEsZDtjPWFbdGhpcy5jdXJzb3JfKzFdO2R8PShjJjEyNyk8PDc7aWYoMTI4PmMpcmV0dXJuIHRoaXMuY3Vyc29yXys9MixkO2M9YVt0aGlzLmN1cnNvcl8rMl07ZHw9KGMmMTI3KTw8MTQ7aWYoMTI4PmMpcmV0dXJuIHRoaXMuY3Vyc29yXys9MyxkO2M9YVt0aGlzLmN1cnNvcl8rM107ZHw9KGMmMTI3KTw8MjE7aWYoMTI4PmMpcmV0dXJuIHRoaXMuY3Vyc29yXys9NCxkO2M9YVt0aGlzLmN1cnNvcl8rNF07ZHw9KGMmMTUpPDwyODtpZigxMjg+YylyZXR1cm4gdGhpcy5jdXJzb3JfKz01LGQ+Pj4wO3RoaXMuY3Vyc29yXys9NTsxMjg8PWFbdGhpcy5jdXJzb3JfKytdJiYxMjg8PWFbdGhpcy5jdXJzb3JfKytdJiYxMjg8PWFbdGhpcy5jdXJzb3JfKytdJiYxMjg8PWFbdGhpcy5jdXJzb3JfKytdJiYKdGhpcy5jdXJzb3JfKys7cmV0dXJuIGR9O04ucmVhZFNpZ25lZFZhcmludDMyPXBmLnByb3RvdHlwZS5yZWFkVW5zaWduZWRWYXJpbnQzMjtOLnJlYWRVbnNpZ25lZFZhcmludDMyU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFVuc2lnbmVkVmFyaW50MzIoKS50b1N0cmluZygpfTtOLnJlYWRTaWduZWRWYXJpbnQzMlN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRTaWduZWRWYXJpbnQzMigpLnRvU3RyaW5nKCl9O04ucmVhZFppZ3phZ1ZhcmludDMyPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5yZWFkVW5zaWduZWRWYXJpbnQzMigpO3JldHVybiBhPj4+MV4tKGEmMSl9O04ucmVhZFVuc2lnbmVkVmFyaW50NjQ9ZnVuY3Rpb24oKXt0aGlzLnJlYWRTcGxpdFZhcmludDY0XygpO3JldHVybiBBZSh0aGlzLnRlbXBMb3dfLHRoaXMudGVtcEhpZ2hfKX07Ck4ucmVhZFVuc2lnbmVkVmFyaW50NjRTdHJpbmc9ZnVuY3Rpb24oKXt0aGlzLnJlYWRTcGxpdFZhcmludDY0XygpO3JldHVybiBIZSh0aGlzLnRlbXBMb3dfLHRoaXMudGVtcEhpZ2hfKX07Ti5yZWFkU2lnbmVkVmFyaW50NjQ9ZnVuY3Rpb24oKXt0aGlzLnJlYWRTcGxpdFZhcmludDY0XygpO3JldHVybiBCZSh0aGlzLnRlbXBMb3dfLHRoaXMudGVtcEhpZ2hfKX07Ti5yZWFkU2lnbmVkVmFyaW50NjRTdHJpbmc9ZnVuY3Rpb24oKXt0aGlzLnJlYWRTcGxpdFZhcmludDY0XygpO3JldHVybiBtZih0aGlzLnRlbXBMb3dfLHRoaXMudGVtcEhpZ2hfKX07Ti5yZWFkWmlnemFnVmFyaW50NjQ9ZnVuY3Rpb24oKXt0aGlzLnJlYWRTcGxpdFZhcmludDY0XygpO3JldHVybiBDZSh0aGlzLnRlbXBMb3dfLHRoaXMudGVtcEhpZ2hfKX07Ti5yZWFkWmlnemFnVmFyaW50NjRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkWmlnemFnVmFyaW50NjQoKS50b1N0cmluZygpfTsKTi5yZWFkVWludDg9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rMF07dGhpcy5jdXJzb3JfKz0xO3JldHVybiBhfTtOLnJlYWRVaW50MTY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rMF0sYz10aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rMV07dGhpcy5jdXJzb3JfKz0yO3JldHVybiBhPDwwfGM8PDh9O04ucmVhZFVpbnQzMj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXyswXSxjPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXysxXSxkPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXysyXSxmPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXyszXTt0aGlzLmN1cnNvcl8rPTQ7cmV0dXJuKGE8PDB8Yzw8OHxkPDwxNnxmPDwyNCk+Pj4wfTtOLnJlYWRVaW50NjQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJlYWRVaW50MzIoKSxjPXRoaXMucmVhZFVpbnQzMigpO3JldHVybiBBZShhLGMpfTsKTi5yZWFkVWludDY0U3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5yZWFkVWludDMyKCksYz10aGlzLnJlYWRVaW50MzIoKTtyZXR1cm4gSGUoYSxjKX07Ti5yZWFkSW50OD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXyswXTt0aGlzLmN1cnNvcl8rPTE7cmV0dXJuIGE8PDI0Pj4yNH07Ti5yZWFkSW50MTY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rMF0sYz10aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rMV07dGhpcy5jdXJzb3JfKz0yO3JldHVybihhPDwwfGM8PDgpPDwxNj4+MTZ9O04ucmVhZEludDMyPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfKzBdLGM9dGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfKzFdLGQ9dGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfKzJdLGY9dGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfKzNdO3RoaXMuY3Vyc29yXys9NDtyZXR1cm4gYTw8MHxjPDw4fGQ8PDE2fGY8PDI0fTsKTi5yZWFkSW50NjQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJlYWRVaW50MzIoKSxjPXRoaXMucmVhZFVpbnQzMigpO3JldHVybiBCZShhLGMpfTtOLnJlYWRJbnQ2NFN0cmluZz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucmVhZFVpbnQzMigpLGM9dGhpcy5yZWFkVWludDMyKCk7cmV0dXJuIG1mKGEsYyl9O04ucmVhZEZsb2F0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5yZWFkVWludDMyKCk7cmV0dXJuIERlKGEpfTtOLnJlYWREb3VibGU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJlYWRVaW50MzIoKSxjPXRoaXMucmVhZFVpbnQzMigpO3JldHVybiBFZShhLGMpfTtOLnJlYWRCb29sPWZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8rK119O04ucmVhZEVudW09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkU2lnbmVkVmFyaW50MzIoKX07Ck4ucmVhZFN0cmluZz1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmJ5dGVzXyxkPXRoaXMuY3Vyc29yXzthPWQrYTtmb3IodmFyIGY9W10sZz0iIjtkPGE7KXt2YXIgbD1jW2QrK107aWYoMTI4PmwpZi5wdXNoKGwpO2Vsc2UgaWYoMTkyPmwpY29udGludWU7ZWxzZSBpZigyMjQ+bCl7dmFyIGs9Y1tkKytdO2YucHVzaCgobCYzMSk8PDZ8ayY2Myl9ZWxzZSBpZigyNDA+bCl7az1jW2QrK107dmFyIG49Y1tkKytdO2YucHVzaCgobCYxNSk8PDEyfChrJjYzKTw8NnxuJjYzKX1lbHNlIGlmKDI0OD5sKXtrPWNbZCsrXTtuPWNbZCsrXTt2YXIgcD1jW2QrK107bD0obCY3KTw8MTh8KGsmNjMpPDwxMnwobiY2Myk8PDZ8cCY2MztsLT02NTUzNjtmLnB1c2goKGw+PjEwJjEwMjMpKzU1Mjk2LChsJjEwMjMpKzU2MzIwKX04MTkyPD1mLmxlbmd0aCYmKGcrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxmKSxmLmxlbmd0aD0wKX1nKz1sYyhmKTt0aGlzLmN1cnNvcl89ZDtyZXR1cm4gZ307Ck4ucmVhZFN0cmluZ1dpdGhMZW5ndGg9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnJlYWRVbnNpZ25lZFZhcmludDMyKCk7cmV0dXJuIHRoaXMucmVhZFN0cmluZyhhKX07Ti5yZWFkQnl0ZXM9ZnVuY3Rpb24oYSl7aWYoMD5hfHx0aGlzLmN1cnNvcl8rYT50aGlzLmJ5dGVzXy5sZW5ndGgpcmV0dXJuIHRoaXMuZXJyb3JfPSEwLGRjKCJJbnZhbGlkIGJ5dGUgbGVuZ3RoISIpLG5ldyBVaW50OEFycmF5KDApO3ZhciBjPXRoaXMuYnl0ZXNfLnN1YmFycmF5KHRoaXMuY3Vyc29yXyx0aGlzLmN1cnNvcl8rYSk7dGhpcy5jdXJzb3JfKz1hO3JldHVybiBjfTtOLnJlYWRWYXJpbnRIYXNoNjQ9ZnVuY3Rpb24oKXt0aGlzLnJlYWRTcGxpdFZhcmludDY0XygpO3JldHVybiBGZSh0aGlzLnRlbXBMb3dfLHRoaXMudGVtcEhpZ2hfKX07Ck4ucmVhZEZpeGVkSGFzaDY0PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ieXRlc18sYz10aGlzLmN1cnNvcl8sZD1hW2MrMF0sZj1hW2MrMV0sZz1hW2MrMl0sbD1hW2MrM10saz1hW2MrNF0sbj1hW2MrNV0scD1hW2MrNl07YT1hW2MrN107dGhpcy5jdXJzb3JfKz04O3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGQsZixnLGwsayxuLHAsYSl9OwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX3Byb3RvYnVmX2pzL2JpbmFyeS9lbmNvZGVyLmpzCmZ1bmN0aW9uIHNmKCl7dGhpcy5idWZmZXJfPVtdfU49c2YucHJvdG90eXBlO04ubGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYnVmZmVyXy5sZW5ndGh9O04uZW5kPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5idWZmZXJfO3RoaXMuYnVmZmVyXz1bXTtyZXR1cm4gYX07Ti53cml0ZVNwbGl0VmFyaW50NjQ9ZnVuY3Rpb24oYSxjKXtmb3IoOzA8Y3x8MTI3PGE7KXRoaXMuYnVmZmVyXy5wdXNoKGEmMTI3fDEyOCksYT0oYT4+Pjd8Yzw8MjUpPj4+MCxjPj4+PTc7dGhpcy5idWZmZXJfLnB1c2goYSl9O04ud3JpdGVTcGxpdEZpeGVkNjQ9ZnVuY3Rpb24oYSxjKXt0aGlzLndyaXRlVWludDMyKGEpO3RoaXMud3JpdGVVaW50MzIoYyl9O04ud3JpdGVVbnNpZ25lZFZhcmludDMyPWZ1bmN0aW9uKGEpe2Zvcig7MTI3PGE7KXRoaXMuYnVmZmVyXy5wdXNoKGEmMTI3fDEyOCksYT4+Pj03O3RoaXMuYnVmZmVyXy5wdXNoKGEpfTsKTi53cml0ZVNpZ25lZFZhcmludDMyPWZ1bmN0aW9uKGEpe2lmKDA8PWEpdGhpcy53cml0ZVVuc2lnbmVkVmFyaW50MzIoYSk7ZWxzZXtmb3IodmFyIGM9MDs5PmM7YysrKXRoaXMuYnVmZmVyXy5wdXNoKGEmMTI3fDEyOCksYT4+PTc7dGhpcy5idWZmZXJfLnB1c2goMSl9fTtOLndyaXRlVW5zaWduZWRWYXJpbnQ2ND1mdW5jdGlvbihhKXtkZShhKTt0aGlzLndyaXRlU3BsaXRWYXJpbnQ2NChhZSxiZSl9O04ud3JpdGVTaWduZWRWYXJpbnQ2ND1mdW5jdGlvbihhKXtkZShhKTt0aGlzLndyaXRlU3BsaXRWYXJpbnQ2NChhZSxiZSl9O04ud3JpdGVaaWd6YWdWYXJpbnQzMj1mdW5jdGlvbihhKXt0aGlzLndyaXRlVW5zaWduZWRWYXJpbnQzMigoYTw8MV5hPj4zMSk+Pj4wKX07Ti53cml0ZVppZ3phZ1ZhcmludDY0PWZ1bmN0aW9uKGEpe2VlKGEpO3RoaXMud3JpdGVTcGxpdFZhcmludDY0KGFlLGJlKX07Ck4ud3JpdGVaaWd6YWdWYXJpbnQ2NFN0cmluZz1mdW5jdGlvbihhKXt0aGlzLndyaXRlWmlnemFnVmFyaW50NjQocGFyc2VJbnQoYSwxMCkpfTtOLndyaXRlVWludDg9ZnVuY3Rpb24oYSl7dGhpcy5idWZmZXJfLnB1c2goYT4+PjAmMjU1KX07Ti53cml0ZVVpbnQxNj1mdW5jdGlvbihhKXt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+MCYyNTUpO3RoaXMuYnVmZmVyXy5wdXNoKGE+Pj44JjI1NSl9O04ud3JpdGVVaW50MzI9ZnVuY3Rpb24oYSl7dGhpcy5idWZmZXJfLnB1c2goYT4+PjAmMjU1KTt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+OCYyNTUpO3RoaXMuYnVmZmVyXy5wdXNoKGE+Pj4xNiYyNTUpO3RoaXMuYnVmZmVyXy5wdXNoKGE+Pj4yNCYyNTUpfTtOLndyaXRlVWludDY0PWZ1bmN0aW9uKGEpe2NlKGEpO3RoaXMud3JpdGVVaW50MzIoYWUpO3RoaXMud3JpdGVVaW50MzIoYmUpfTtOLndyaXRlSW50OD1mdW5jdGlvbihhKXt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+MCYyNTUpfTsKTi53cml0ZUludDE2PWZ1bmN0aW9uKGEpe3RoaXMuYnVmZmVyXy5wdXNoKGE+Pj4wJjI1NSk7dGhpcy5idWZmZXJfLnB1c2goYT4+PjgmMjU1KX07Ti53cml0ZUludDMyPWZ1bmN0aW9uKGEpe3RoaXMuYnVmZmVyXy5wdXNoKGE+Pj4wJjI1NSk7dGhpcy5idWZmZXJfLnB1c2goYT4+PjgmMjU1KTt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+MTYmMjU1KTt0aGlzLmJ1ZmZlcl8ucHVzaChhPj4+MjQmMjU1KX07Ti53cml0ZUludDY0PWZ1bmN0aW9uKGEpe2RlKGEpO3RoaXMud3JpdGVTcGxpdEZpeGVkNjQoYWUsYmUpfTtOLndyaXRlSW50NjRTdHJpbmc9ZnVuY3Rpb24oYSl7aGUobmYoYSkpO3RoaXMud3JpdGVTcGxpdEZpeGVkNjQoYWUsYmUpfTtOLndyaXRlRmxvYXQ9ZnVuY3Rpb24oYSl7ZmUoYSk7dGhpcy53cml0ZVVpbnQzMihhZSl9O04ud3JpdGVEb3VibGU9ZnVuY3Rpb24oYSl7Z2UoYSk7dGhpcy53cml0ZVVpbnQzMihhZSk7dGhpcy53cml0ZVVpbnQzMihiZSl9OwpOLndyaXRlQm9vbD1mdW5jdGlvbihhKXt0aGlzLmJ1ZmZlcl8ucHVzaChhPzE6MCl9O04ud3JpdGVFbnVtPWZ1bmN0aW9uKGEpe3RoaXMud3JpdGVTaWduZWRWYXJpbnQzMihhKX07Ti53cml0ZUJ5dGVzPWZ1bmN0aW9uKGEpe3RoaXMuYnVmZmVyXy5wdXNoLmFwcGx5KHRoaXMuYnVmZmVyXyxhKX07Ti53cml0ZVZhcmludEhhc2g2ND1mdW5jdGlvbihhKXtoZShhKTt0aGlzLndyaXRlU3BsaXRWYXJpbnQ2NChhZSxiZSl9O04ud3JpdGVGaXhlZEhhc2g2ND1mdW5jdGlvbihhKXtoZShhKTt0aGlzLndyaXRlVWludDMyKGFlKTt0aGlzLndyaXRlVWludDMyKGJlKX07Ck4ud3JpdGVTdHJpbmc9ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMuYnVmZmVyXy5sZW5ndGgsZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZj1hLmNoYXJDb2RlQXQoZCk7aWYoMTI4PmYpdGhpcy5idWZmZXJfLnB1c2goZik7ZWxzZSBpZigyMDQ4PmYpdGhpcy5idWZmZXJfLnB1c2goZj4+NnwxOTIpLHRoaXMuYnVmZmVyXy5wdXNoKGYmNjN8MTI4KTtlbHNlIGlmKDY1NTM2PmYpaWYoNTUyOTY8PWYmJjU2MzE5Pj1mJiZkKzE8YS5sZW5ndGgpe3ZhciBnPWEuY2hhckNvZGVBdChkKzEpOzU2MzIwPD1nJiY1NzM0Mz49ZyYmKGY9MTAyNCooZi01NTI5NikrZy01NjMyMCs2NTUzNix0aGlzLmJ1ZmZlcl8ucHVzaChmPj4xOHwyNDApLHRoaXMuYnVmZmVyXy5wdXNoKGY+PjEyJjYzfDEyOCksdGhpcy5idWZmZXJfLnB1c2goZj4+NiY2M3wxMjgpLHRoaXMuYnVmZmVyXy5wdXNoKGYmNjN8MTI4KSxkKyspfWVsc2UgdGhpcy5idWZmZXJfLnB1c2goZj4+MTJ8MjI0KSx0aGlzLmJ1ZmZlcl8ucHVzaChmPj4KNiY2M3wxMjgpLHRoaXMuYnVmZmVyXy5wdXNoKGYmNjN8MTI4KX1yZXR1cm4gdGhpcy5idWZmZXJfLmxlbmd0aC1jfTsKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9wcm90b2J1Zl9qcy9iaW5hcnkvcmVhZGVyLmpzCmZ1bmN0aW9uIHVmKGEsYyxkKXt0aGlzLmRlY29kZXJfPXJmKGEsYyxkKTt0aGlzLmZpZWxkQ3Vyc29yXz10aGlzLmRlY29kZXJfLmdldEN1cnNvcigpO3RoaXMubmV4dFdpcmVUeXBlXz10aGlzLm5leHRGaWVsZF89LTE7dGhpcy5lcnJvcl89ITE7dGhpcy5yZWFkQ2FsbGJhY2tzXz1udWxsfXZhciB2Zj1bXTtOPXVmLnByb3RvdHlwZTtOLmFsbG9jPWZ1bmN0aW9uKGEsYyxkKXtpZih2Zi5sZW5ndGgpe3ZhciBmPXZmLnBvcCgpO2EmJmYuZGVjb2Rlcl8uc2V0QmxvY2soYSxjLGQpO3JldHVybiBmfXJldHVybiBuZXcgdWYoYSxjLGQpfTtOLmZyZWU9ZnVuY3Rpb24oKXt0aGlzLmRlY29kZXJfLmNsZWFyKCk7dGhpcy5uZXh0V2lyZVR5cGVfPXRoaXMubmV4dEZpZWxkXz0tMTt0aGlzLmVycm9yXz0hMTt0aGlzLnJlYWRDYWxsYmFja3NfPW51bGw7MTAwPnZmLmxlbmd0aCYmdmYucHVzaCh0aGlzKX07Ti5nZXRGaWVsZEN1cnNvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpZWxkQ3Vyc29yX307Ck4uZ2V0Q3Vyc29yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8uZ2V0Q3Vyc29yKCl9O04uZ2V0QnVmZmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8uZ2V0QnVmZmVyKCl9O04uZ2V0RmllbGROdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uZXh0RmllbGRffTtOLmdldFdpcmVUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmV4dFdpcmVUeXBlX307Ti5pc0VuZEdyb3VwPWZ1bmN0aW9uKCl7cmV0dXJuIDQ9PXRoaXMubmV4dFdpcmVUeXBlX307Ti5nZXRFcnJvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yX3x8dGhpcy5kZWNvZGVyXy5nZXRFcnJvcigpfTtOLnNldEJsb2NrPWZ1bmN0aW9uKGEsYyxkKXt0aGlzLmRlY29kZXJfLnNldEJsb2NrKGEsYyxkKTt0aGlzLm5leHRXaXJlVHlwZV89dGhpcy5uZXh0RmllbGRfPS0xfTsKTi5yZXNldD1mdW5jdGlvbigpe3RoaXMuZGVjb2Rlcl8ucmVzZXQoKTt0aGlzLm5leHRXaXJlVHlwZV89dGhpcy5uZXh0RmllbGRfPS0xfTtOLmFkdmFuY2U9ZnVuY3Rpb24oYSl7dGhpcy5kZWNvZGVyXy5hZHZhbmNlKGEpfTsKTi5uZXh0RmllbGQ9ZnVuY3Rpb24oKXtpZih0aGlzLmRlY29kZXJfLmF0RW5kKCkpcmV0dXJuITE7aWYodGhpcy5nZXRFcnJvcigpKXJldHVybiBkYygiRGVjb2RlciBoaXQgYW4gZXJyb3IiKSwhMTt0aGlzLmZpZWxkQ3Vyc29yXz10aGlzLmRlY29kZXJfLmdldEN1cnNvcigpO3ZhciBhPXRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50MzIoKSxjPWE+Pj4zO2EmPTc7aWYoMCE9YSYmNSE9YSYmMSE9YSYmMiE9YSYmMyE9YSYmNCE9YSlyZXR1cm4gZGMoIkludmFsaWQgd2lyZSB0eXBlOiAlcyAoYXQgcG9zaXRpb24gJXMpIixhLHRoaXMuZmllbGRDdXJzb3JfKSx0aGlzLmVycm9yXz0hMCwhMTt0aGlzLm5leHRGaWVsZF89Yzt0aGlzLm5leHRXaXJlVHlwZV89YTtyZXR1cm4hMH07Ti51bnNraXBIZWFkZXI9ZnVuY3Rpb24oKXt0aGlzLmRlY29kZXJfLnVuc2tpcFZhcmludCh0aGlzLm5leHRGaWVsZF88PDN8dGhpcy5uZXh0V2lyZVR5cGVfKX07Ck4uc2tpcE1hdGNoaW5nRmllbGRzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uZXh0RmllbGRfO2Zvcih0aGlzLnVuc2tpcEhlYWRlcigpO3RoaXMubmV4dEZpZWxkKCkmJnRoaXMuZ2V0RmllbGROdW1iZXIoKT09YTspdGhpcy5za2lwRmllbGQoKTt0aGlzLmRlY29kZXJfLmF0RW5kKCl8fHRoaXMudW5za2lwSGVhZGVyKCl9O04uc2tpcFZhcmludEZpZWxkPWZ1bmN0aW9uKCl7MCE9dGhpcy5uZXh0V2lyZVR5cGVfPyhkYygiSW52YWxpZCB3aXJlIHR5cGUgZm9yIHNraXBWYXJpbnRGaWVsZCIpLHRoaXMuc2tpcEZpZWxkKCkpOnRoaXMuZGVjb2Rlcl8uc2tpcFZhcmludCgpfTtOLnNraXBEZWxpbWl0ZWRGaWVsZD1mdW5jdGlvbigpe2lmKDIhPXRoaXMubmV4dFdpcmVUeXBlXylkYygiSW52YWxpZCB3aXJlIHR5cGUgZm9yIHNraXBEZWxpbWl0ZWRGaWVsZCIpLHRoaXMuc2tpcEZpZWxkKCk7ZWxzZXt2YXIgYT10aGlzLmRlY29kZXJfLnJlYWRVbnNpZ25lZFZhcmludDMyKCk7dGhpcy5kZWNvZGVyXy5hZHZhbmNlKGEpfX07Ck4uc2tpcEZpeGVkMzJGaWVsZD1mdW5jdGlvbigpezUhPXRoaXMubmV4dFdpcmVUeXBlXz8oZGMoIkludmFsaWQgd2lyZSB0eXBlIGZvciBza2lwRml4ZWQzMkZpZWxkIiksdGhpcy5za2lwRmllbGQoKSk6dGhpcy5kZWNvZGVyXy5hZHZhbmNlKDQpfTtOLnNraXBGaXhlZDY0RmllbGQ9ZnVuY3Rpb24oKXsxIT10aGlzLm5leHRXaXJlVHlwZV8/KGRjKCJJbnZhbGlkIHdpcmUgdHlwZSBmb3Igc2tpcEZpeGVkNjRGaWVsZCIpLHRoaXMuc2tpcEZpZWxkKCkpOnRoaXMuZGVjb2Rlcl8uYWR2YW5jZSg4KX07Ck4uc2tpcEdyb3VwPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uZXh0RmllbGRfO2Rve2lmKCF0aGlzLm5leHRGaWVsZCgpKXtkYygiVW5tYXRjaGVkIHN0YXJ0LWdyb3VwIHRhZzogc3RyZWFtIEVPRiIpO3RoaXMuZXJyb3JfPSEwO2JyZWFrfWlmKDQ9PXRoaXMubmV4dFdpcmVUeXBlXyl7dGhpcy5uZXh0RmllbGRfIT1hJiYoZGMoIlVubWF0Y2hlZCBlbmQtZ3JvdXAgdGFnIiksdGhpcy5lcnJvcl89ITApO2JyZWFrfXRoaXMuc2tpcEZpZWxkKCl9d2hpbGUoMSl9O04uc2tpcEZpZWxkPWZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMubmV4dFdpcmVUeXBlXyl7Y2FzZSAwOnRoaXMuc2tpcFZhcmludEZpZWxkKCk7YnJlYWs7Y2FzZSAxOnRoaXMuc2tpcEZpeGVkNjRGaWVsZCgpO2JyZWFrO2Nhc2UgMjp0aGlzLnNraXBEZWxpbWl0ZWRGaWVsZCgpO2JyZWFrO2Nhc2UgNTp0aGlzLnNraXBGaXhlZDMyRmllbGQoKTticmVhaztjYXNlIDM6dGhpcy5za2lwR3JvdXAoKTticmVhaztkZWZhdWx0OmRjKCJJbnZhbGlkIHdpcmUgZW5jb2RpbmcgZm9yIGZpZWxkLiIpfX07Ck4ucmVnaXN0ZXJSZWFkQ2FsbGJhY2s9ZnVuY3Rpb24oYSxjKXtNYih0aGlzLnJlYWRDYWxsYmFja3NfKSYmKHRoaXMucmVhZENhbGxiYWNrc189e30pO3RoaXMucmVhZENhbGxiYWNrc19bYV09Y307Ti5ydW5SZWFkQ2FsbGJhY2s9ZnVuY3Rpb24oYSl7cmV0dXJuKDAsdGhpcy5yZWFkQ2FsbGJhY2tzX1thXSkodGhpcyl9OwpOLnJlYWRBbnk9ZnVuY3Rpb24oYSl7dGhpcy5uZXh0V2lyZVR5cGVfPSRkKGEpO3N3aXRjaChhKXtjYXNlIDE6cmV0dXJuIHRoaXMucmVhZERvdWJsZSgpO2Nhc2UgMjpyZXR1cm4gdGhpcy5yZWFkRmxvYXQoKTtjYXNlIDM6cmV0dXJuIHRoaXMucmVhZEludDY0KCk7Y2FzZSA0OnJldHVybiB0aGlzLnJlYWRVaW50NjQoKTtjYXNlIDU6cmV0dXJuIHRoaXMucmVhZEludDMyKCk7Y2FzZSA2OnJldHVybiB0aGlzLnJlYWRGaXhlZDY0KCk7Y2FzZSA3OnJldHVybiB0aGlzLnJlYWRGaXhlZDMyKCk7Y2FzZSA4OnJldHVybiB0aGlzLnJlYWRCb29sKCk7Y2FzZSA5OnJldHVybiB0aGlzLnJlYWRTdHJpbmcoKTtjYXNlIDEwOmRjKCJHcm91cCBmaWVsZCB0eXBlIG5vdCBzdXBwb3J0ZWQgaW4gcmVhZEFueSgpIik7Y2FzZSAxMTpkYygiTWVzc2FnZSBmaWVsZCB0eXBlIG5vdCBzdXBwb3J0ZWQgaW4gcmVhZEFueSgpIik7Y2FzZSAxMjpyZXR1cm4gdGhpcy5yZWFkQnl0ZXMoKTtjYXNlIDEzOnJldHVybiB0aGlzLnJlYWRVaW50MzIoKTsKY2FzZSAxNDpyZXR1cm4gdGhpcy5yZWFkRW51bSgpO2Nhc2UgMTU6cmV0dXJuIHRoaXMucmVhZFNmaXhlZDMyKCk7Y2FzZSAxNjpyZXR1cm4gdGhpcy5yZWFkU2ZpeGVkNjQoKTtjYXNlIDE3OnJldHVybiB0aGlzLnJlYWRTaW50MzIoKTtjYXNlIDE4OnJldHVybiB0aGlzLnJlYWRTaW50NjQoKTtjYXNlIDMwOnJldHVybiB0aGlzLnJlYWRGaXhlZEhhc2g2NCgpO2Nhc2UgMzE6cmV0dXJuIHRoaXMucmVhZFZhcmludEhhc2g2NCgpO2RlZmF1bHQ6ZGMoIkludmFsaWQgZmllbGQgdHlwZSBpbiByZWFkQW55KCkiKX1yZXR1cm4gMH07Ti5yZWFkTWVzc2FnZT1mdW5jdGlvbihhLGMpe3ZhciBkPXRoaXMuZGVjb2Rlcl8uZ2V0RW5kKCksZj10aGlzLmRlY29kZXJfLnJlYWRVbnNpZ25lZFZhcmludDMyKCk7Zj10aGlzLmRlY29kZXJfLmdldEN1cnNvcigpK2Y7dGhpcy5kZWNvZGVyXy5zZXRFbmQoZik7YyhhLHRoaXMpO3RoaXMuZGVjb2Rlcl8uc2V0Q3Vyc29yKGYpO3RoaXMuZGVjb2Rlcl8uc2V0RW5kKGQpfTsKTi5yZWFkR3JvdXA9ZnVuY3Rpb24oYSxjLGQpe2QoYyx0aGlzKTt0aGlzLmVycm9yX3x8ND09dGhpcy5uZXh0V2lyZVR5cGVffHwoZGMoIkdyb3VwIHN1Ym1lc3NhZ2UgZGlkIG5vdCBlbmQgd2l0aCBhbiBFTkRfR1JPVVAgdGFnIiksdGhpcy5lcnJvcl89ITApfTtOLmdldEZpZWxkRGVjb2Rlcj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50MzIoKSxjPXRoaXMuZGVjb2Rlcl8uZ2V0Q3Vyc29yKCksZD1jK2E7YT1yZih0aGlzLmRlY29kZXJfLmdldEJ1ZmZlcigpLGMsYSk7dGhpcy5kZWNvZGVyXy5zZXRDdXJzb3IoZCk7cmV0dXJuIGF9O04ucmVhZEludDMyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFNpZ25lZFZhcmludDMyKCl9O04ucmVhZEludDMyU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFNpZ25lZFZhcmludDMyU3RyaW5nKCl9O04ucmVhZEludDY0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFNpZ25lZFZhcmludDY0KCl9OwpOLnJlYWRJbnQ2NFN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRTaWduZWRWYXJpbnQ2NFN0cmluZygpfTtOLnJlYWRVaW50MzI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMigpfTtOLnJlYWRVaW50MzJTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMlN0cmluZygpfTtOLnJlYWRVaW50NjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQ2NCgpfTtOLnJlYWRVaW50NjRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQ2NFN0cmluZygpfTtOLnJlYWRTaW50MzI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkWmlnemFnVmFyaW50MzIoKX07Ti5yZWFkU2ludDY0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFppZ3phZ1ZhcmludDY0KCl9OwpOLnJlYWRTaW50NjRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkWmlnemFnVmFyaW50NjRTdHJpbmcoKX07Ti5yZWFkRml4ZWQzMj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRVaW50MzIoKX07Ti5yZWFkRml4ZWQ2ND1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRVaW50NjQoKX07Ti5yZWFkRml4ZWQ2NFN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRVaW50NjRTdHJpbmcoKX07Ti5yZWFkU2ZpeGVkMzI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkSW50MzIoKX07Ti5yZWFkU2ZpeGVkMzJTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkSW50MzIoKS50b1N0cmluZygpfTtOLnJlYWRTZml4ZWQ2ND1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRJbnQ2NCgpfTtOLnJlYWRTZml4ZWQ2NFN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRJbnQ2NFN0cmluZygpfTsKTi5yZWFkRmxvYXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkRmxvYXQoKX07Ti5yZWFkRG91YmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZERvdWJsZSgpfTtOLnJlYWRCb29sPWZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLmRlY29kZXJfLnJlYWRVbnNpZ25lZFZhcmludDMyKCl9O04ucmVhZEVudW09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkU2lnbmVkVmFyaW50NjQoKX07Ti5yZWFkU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMigpO3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRTdHJpbmcoYSl9O04ucmVhZEJ5dGVzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMigpO3JldHVybiB0aGlzLmRlY29kZXJfLnJlYWRCeXRlcyhhKX07Ti5yZWFkVmFyaW50SGFzaDY0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFZhcmludEhhc2g2NCgpfTsKTi5yZWFkRml4ZWRIYXNoNjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkRml4ZWRIYXNoNjQoKX07Ti5yZWFkUGFja2VkRmllbGRfPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50MzIoKTtjPXRoaXMuZGVjb2Rlcl8uZ2V0Q3Vyc29yKCkrYztmb3IodmFyIGQ9W107dGhpcy5kZWNvZGVyXy5nZXRDdXJzb3IoKTxjOylkLnB1c2goYS5jYWxsKHRoaXMuZGVjb2Rlcl8pKTtyZXR1cm4gZH07Ti5yZWFkUGFja2VkSW50MzI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFNpZ25lZFZhcmludDMyKX07Ti5yZWFkUGFja2VkSW50MzJTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFNpZ25lZFZhcmludDMyU3RyaW5nKX07Ti5yZWFkUGFja2VkSW50NjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFNpZ25lZFZhcmludDY0KX07Ck4ucmVhZFBhY2tlZEludDY0U3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRTaWduZWRWYXJpbnQ2NFN0cmluZyl9O04ucmVhZFBhY2tlZFVpbnQzMj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMil9O04ucmVhZFBhY2tlZFVpbnQzMlN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMlN0cmluZyl9O04ucmVhZFBhY2tlZFVpbnQ2ND1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQ2NCl9O04ucmVhZFBhY2tlZFVpbnQ2NFN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQ2NFN0cmluZyl9OwpOLnJlYWRQYWNrZWRTaW50MzI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFppZ3phZ1ZhcmludDMyKX07Ti5yZWFkUGFja2VkU2ludDY0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRaaWd6YWdWYXJpbnQ2NCl9O04ucmVhZFBhY2tlZFNpbnQ2NFN0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkWmlnemFnVmFyaW50NjRTdHJpbmcpfTtOLnJlYWRQYWNrZWRGaXhlZDMyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRVaW50MzIpfTtOLnJlYWRQYWNrZWRGaXhlZDY0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRVaW50NjQpfTtOLnJlYWRQYWNrZWRGaXhlZDY0U3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRVaW50NjRTdHJpbmcpfTsKTi5yZWFkUGFja2VkU2ZpeGVkMzI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZEludDMyKX07Ti5yZWFkUGFja2VkU2ZpeGVkNjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZEludDY0KX07Ti5yZWFkUGFja2VkU2ZpeGVkNjRTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZEludDY0U3RyaW5nKX07Ti5yZWFkUGFja2VkRmxvYXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZEZsb2F0KX07Ti5yZWFkUGFja2VkRG91YmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWREb3VibGUpfTtOLnJlYWRQYWNrZWRCb29sPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRCb29sKX07Ck4ucmVhZFBhY2tlZEVudW09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZEVudW0pfTtOLnJlYWRQYWNrZWRWYXJpbnRIYXNoNjQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFZhcmludEhhc2g2NCl9O04ucmVhZFBhY2tlZEZpeGVkSGFzaDY0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRGaXhlZEhhc2g2NCl9OwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX3Byb3RvYnVmX2pzL2JpbmFyeS93cml0ZXIuanMKZnVuY3Rpb24gd2YoKXt0aGlzLmJsb2Nrc189W107dGhpcy50b3RhbExlbmd0aF89MDt0aGlzLmVuY29kZXJfPW5ldyBzZjt0aGlzLmJvb2ttYXJrc189W119Tj13Zi5wcm90b3R5cGU7Ti5hcHBlbmRVaW50OEFycmF5Xz1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmVuY29kZXJfLmVuZCgpO3RoaXMuYmxvY2tzXy5wdXNoKGMpO3RoaXMuYmxvY2tzXy5wdXNoKGEpO3RoaXMudG90YWxMZW5ndGhfKz1jLmxlbmd0aCthLmxlbmd0aH07Ti5iZWdpbkRlbGltaXRlZF89ZnVuY3Rpb24oYSl7dGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDIpO2E9dGhpcy5lbmNvZGVyXy5lbmQoKTt0aGlzLmJsb2Nrc18ucHVzaChhKTt0aGlzLnRvdGFsTGVuZ3RoXys9YS5sZW5ndGg7YS5wdXNoKHRoaXMudG90YWxMZW5ndGhfKTtyZXR1cm4gYX07Ck4uZW5kRGVsaW1pdGVkXz1mdW5jdGlvbihhKXt2YXIgYz1hLnBvcCgpO2ZvcihjPXRoaXMudG90YWxMZW5ndGhfK3RoaXMuZW5jb2Rlcl8ubGVuZ3RoKCktYzsxMjc8YzspYS5wdXNoKGMmMTI3fDEyOCksYz4+Pj03LHRoaXMudG90YWxMZW5ndGhfKys7YS5wdXNoKGMpO3RoaXMudG90YWxMZW5ndGhfKyt9O04ud3JpdGVTZXJpYWxpemVkTWVzc2FnZT1mdW5jdGlvbihhLGMsZCl7dGhpcy5hcHBlbmRVaW50OEFycmF5XyhhLnN1YmFycmF5KGMsZCkpfTtOLm1heWJlV3JpdGVTZXJpYWxpemVkTWVzc2FnZT1mdW5jdGlvbihhLGMsZCl7bnVsbCE9YSYmbnVsbCE9YyYmbnVsbCE9ZCYmdGhpcy53cml0ZVNlcmlhbGl6ZWRNZXNzYWdlKGEsYyxkKX07Ti5yZXNldD1mdW5jdGlvbigpe3RoaXMuYmxvY2tzXz1bXTt0aGlzLmVuY29kZXJfLmVuZCgpO3RoaXMudG90YWxMZW5ndGhfPTA7dGhpcy5ib29rbWFya3NfPVtdfTsKTi5nZXRSZXN1bHRCdWZmZXI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9bmV3IFVpbnQ4QXJyYXkodGhpcy50b3RhbExlbmd0aF8rdGhpcy5lbmNvZGVyXy5sZW5ndGgoKSksYz10aGlzLmJsb2Nrc18sZD1jLmxlbmd0aCxmPTAsZz0wO2c8ZDtnKyspe3ZhciBsPWNbZ107YS5zZXQobCxmKTtmKz1sLmxlbmd0aH1jPXRoaXMuZW5jb2Rlcl8uZW5kKCk7YS5zZXQoYyxmKTt0aGlzLmJsb2Nrc189W2FdO3JldHVybiBhfTtOLmdldFJlc3VsdEJhc2U2NFN0cmluZz1mdW5jdGlvbihhKXtyZXR1cm4gb2QodGhpcy5nZXRSZXN1bHRCdWZmZXIoKSxhKX07Ti5iZWdpblN1Yk1lc3NhZ2U9ZnVuY3Rpb24oYSl7dGhpcy5ib29rbWFya3NfLnB1c2godGhpcy5iZWdpbkRlbGltaXRlZF8oYSkpfTtOLmVuZFN1Yk1lc3NhZ2U9ZnVuY3Rpb24oKXt0aGlzLmVuZERlbGltaXRlZF8odGhpcy5ib29rbWFya3NfLnBvcCgpKX07Ck4ud3JpdGVGaWVsZEhlYWRlcl89ZnVuY3Rpb24oYSxjKXt0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQzMig4KmErYyl9OwpOLndyaXRlQW55PWZ1bmN0aW9uKGEsYyxkKXtzd2l0Y2goYSl7Y2FzZSAxOnRoaXMud3JpdGVEb3VibGUoYyxkKTticmVhaztjYXNlIDI6dGhpcy53cml0ZUZsb2F0KGMsZCk7YnJlYWs7Y2FzZSAzOnRoaXMud3JpdGVJbnQ2NChjLGQpO2JyZWFrO2Nhc2UgNDp0aGlzLndyaXRlVWludDY0KGMsZCk7YnJlYWs7Y2FzZSA1OnRoaXMud3JpdGVJbnQzMihjLGQpO2JyZWFrO2Nhc2UgNjp0aGlzLndyaXRlRml4ZWQ2NChjLGQpO2JyZWFrO2Nhc2UgNzp0aGlzLndyaXRlRml4ZWQzMihjLGQpO2JyZWFrO2Nhc2UgODp0aGlzLndyaXRlQm9vbChjLGQpO2JyZWFrO2Nhc2UgOTp0aGlzLndyaXRlU3RyaW5nKGMsZCk7YnJlYWs7Y2FzZSAxMDpkYygiR3JvdXAgZmllbGQgdHlwZSBub3Qgc3VwcG9ydGVkIGluIHdyaXRlQW55KCkiKTticmVhaztjYXNlIDExOmRjKCJNZXNzYWdlIGZpZWxkIHR5cGUgbm90IHN1cHBvcnRlZCBpbiB3cml0ZUFueSgpIik7YnJlYWs7Y2FzZSAxMjp0aGlzLndyaXRlQnl0ZXMoYywKZCk7YnJlYWs7Y2FzZSAxMzp0aGlzLndyaXRlVWludDMyKGMsZCk7YnJlYWs7Y2FzZSAxNDp0aGlzLndyaXRlRW51bShjLGQpO2JyZWFrO2Nhc2UgMTU6dGhpcy53cml0ZVNmaXhlZDMyKGMsZCk7YnJlYWs7Y2FzZSAxNjp0aGlzLndyaXRlU2ZpeGVkNjQoYyxkKTticmVhaztjYXNlIDE3OnRoaXMud3JpdGVTaW50MzIoYyxkKTticmVhaztjYXNlIDE4OnRoaXMud3JpdGVTaW50NjQoYyxkKTticmVhaztjYXNlIDMwOnRoaXMud3JpdGVGaXhlZEhhc2g2NChjLGQpO2JyZWFrO2Nhc2UgMzE6dGhpcy53cml0ZVZhcmludEhhc2g2NChjLGQpO2JyZWFrO2RlZmF1bHQ6ZGMoIkludmFsaWQgZmllbGQgdHlwZSBpbiB3cml0ZUFueSgpIil9fTtOLndyaXRlVW5zaWduZWRWYXJpbnQzMl89ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiYodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDApLHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKGMpKX07Ck4ud3JpdGVTaWduZWRWYXJpbnQzMl89ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiYodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDApLHRoaXMuZW5jb2Rlcl8ud3JpdGVTaWduZWRWYXJpbnQzMihjKSl9O04ud3JpdGVVbnNpZ25lZFZhcmludDY0Xz1mdW5jdGlvbihhLGMpe251bGwhPWMmJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMCksdGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50NjQoYykpfTtOLndyaXRlU2lnbmVkVmFyaW50NjRfPWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwwKSx0aGlzLmVuY29kZXJfLndyaXRlU2lnbmVkVmFyaW50NjQoYykpfTtOLndyaXRlWmlnemFnVmFyaW50MzJfPWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwwKSx0aGlzLmVuY29kZXJfLndyaXRlWmlnemFnVmFyaW50MzIoYykpfTsKTi53cml0ZVppZ3phZ1ZhcmludDY0Xz1mdW5jdGlvbihhLGMpe251bGwhPWMmJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMCksdGhpcy5lbmNvZGVyXy53cml0ZVppZ3phZ1ZhcmludDY0KGMpKX07Ti53cml0ZVppZ3phZ1ZhcmludDY0U3RyaW5nXz1mdW5jdGlvbihhLGMpe251bGwhPWMmJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMCksdGhpcy5lbmNvZGVyXy53cml0ZVppZ3phZ1ZhcmludDY0U3RyaW5nKGMpKX07Ti53cml0ZUludDMyPWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmdGhpcy53cml0ZVNpZ25lZFZhcmludDMyXyhhLGMpfTtOLndyaXRlSW50MzJTdHJpbmc9ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiZ0aGlzLndyaXRlU2lnbmVkVmFyaW50MzJfKGEscGFyc2VJbnQoYywxMCkpfTtOLndyaXRlSW50NjQ9ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiZ0aGlzLndyaXRlU2lnbmVkVmFyaW50NjRfKGEsYyl9OwpOLndyaXRlSW50NjRTdHJpbmc9ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiYoYz1aZChjKSx0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMCksdGhpcy5lbmNvZGVyXy53cml0ZVNwbGl0VmFyaW50NjQoYy5sbyxjLmhpKSl9O04ud3JpdGVVaW50MzI9ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiZ0aGlzLndyaXRlVW5zaWduZWRWYXJpbnQzMl8oYSxjKX07Ti53cml0ZVVpbnQzMlN0cmluZz1mdW5jdGlvbihhLGMpe251bGwhPWMmJnRoaXMud3JpdGVVbnNpZ25lZFZhcmludDMyXyhhLHBhcnNlSW50KGMsMTApKX07Ti53cml0ZVVpbnQ2ND1mdW5jdGlvbihhLGMpe251bGwhPWMmJnRoaXMud3JpdGVVbnNpZ25lZFZhcmludDY0XyhhLGMpfTtOLndyaXRlVWludDY0U3RyaW5nPWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmKGM9SmQoYyksdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDApLHRoaXMuZW5jb2Rlcl8ud3JpdGVTcGxpdFZhcmludDY0KGMubG8sYy5oaSkpfTsKTi53cml0ZVNpbnQzMj1mdW5jdGlvbihhLGMpe251bGwhPWMmJnRoaXMud3JpdGVaaWd6YWdWYXJpbnQzMl8oYSxjKX07Ti53cml0ZVNpbnQ2ND1mdW5jdGlvbihhLGMpe251bGwhPWMmJnRoaXMud3JpdGVaaWd6YWdWYXJpbnQ2NF8oYSxjKX07Ti53cml0ZVNpbnQ2NFN0cmluZz1mdW5jdGlvbihhLGMpe251bGwhPWMmJnRoaXMud3JpdGVaaWd6YWdWYXJpbnQ2NFN0cmluZ18oYSxjKX07Ti53cml0ZUZpeGVkMzI9ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiYodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDUpLHRoaXMuZW5jb2Rlcl8ud3JpdGVVaW50MzIoYykpfTtOLndyaXRlRml4ZWQ2ND1mdW5jdGlvbihhLGMpe251bGwhPWMmJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMSksdGhpcy5lbmNvZGVyXy53cml0ZVVpbnQ2NChjKSl9OwpOLndyaXRlRml4ZWQ2NFN0cmluZz1mdW5jdGlvbihhLGMpe251bGwhPWMmJihjPUpkKGMpLHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwxKSx0aGlzLmVuY29kZXJfLndyaXRlU3BsaXRGaXhlZDY0KGMubG8sYy5oaSkpfTtOLndyaXRlU2ZpeGVkMzI9ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiYodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDUpLHRoaXMuZW5jb2Rlcl8ud3JpdGVJbnQzMihjKSl9O04ud3JpdGVTZml4ZWQ2ND1mdW5jdGlvbihhLGMpe251bGwhPWMmJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMSksdGhpcy5lbmNvZGVyXy53cml0ZUludDY0KGMpKX07Ti53cml0ZVNmaXhlZDY0U3RyaW5nPWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmKGM9WmQoYyksdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDEpLHRoaXMuZW5jb2Rlcl8ud3JpdGVTcGxpdEZpeGVkNjQoYy5sbyxjLmhpKSl9OwpOLndyaXRlRmxvYXQ9ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiYodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDUpLHRoaXMuZW5jb2Rlcl8ud3JpdGVGbG9hdChjKSl9O04ud3JpdGVEb3VibGU9ZnVuY3Rpb24oYSxjKXtudWxsIT1jJiYodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDEpLHRoaXMuZW5jb2Rlcl8ud3JpdGVEb3VibGUoYykpfTtOLndyaXRlQm9vbD1mdW5jdGlvbihhLGMpe251bGwhPWMmJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMCksdGhpcy5lbmNvZGVyXy53cml0ZUJvb2woYykpfTtOLndyaXRlRW51bT1mdW5jdGlvbihhLGMpe251bGwhPWMmJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMCksdGhpcy5lbmNvZGVyXy53cml0ZVNpZ25lZFZhcmludDMyKGMpKX07Ti53cml0ZVN0cmluZz1mdW5jdGlvbihhLGMpe251bGwhPWMmJihhPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpLHRoaXMuZW5jb2Rlcl8ud3JpdGVTdHJpbmcoYyksdGhpcy5lbmREZWxpbWl0ZWRfKGEpKX07Ck4ud3JpdGVCeXRlcz1mdW5jdGlvbihhLGMpe251bGwhPWMmJihjPW9mKGMpLHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwyKSx0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQzMihjLmxlbmd0aCksdGhpcy5hcHBlbmRVaW50OEFycmF5XyhjKSl9O04ud3JpdGVNZXNzYWdlPWZ1bmN0aW9uKGEsYyxkKXtudWxsIT1jJiYoYT10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKSxkKGMsdGhpcyksdGhpcy5lbmREZWxpbWl0ZWRfKGEpKX07Ti53cml0ZU1lc3NhZ2VTZXQ9ZnVuY3Rpb24oYSxjLGQpe251bGwhPWMmJih0aGlzLndyaXRlRmllbGRIZWFkZXJfKDEsMyksdGhpcy53cml0ZUZpZWxkSGVhZGVyXygyLDApLHRoaXMuZW5jb2Rlcl8ud3JpdGVTaWduZWRWYXJpbnQzMihhKSxhPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKDMpLGQoYyx0aGlzKSx0aGlzLmVuZERlbGltaXRlZF8oYSksdGhpcy53cml0ZUZpZWxkSGVhZGVyXygxLDQpKX07Ck4ud3JpdGVHcm91cD1mdW5jdGlvbihhLGMsZCl7bnVsbCE9YyYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwzKSxkKGMsdGhpcyksdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDQpKX07Ti53cml0ZUZpeGVkSGFzaDY0PWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwxKSx0aGlzLmVuY29kZXJfLndyaXRlRml4ZWRIYXNoNjQoYykpfTtOLndyaXRlVmFyaW50SGFzaDY0PWZ1bmN0aW9uKGEsYyl7bnVsbCE9YyYmKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwwKSx0aGlzLmVuY29kZXJfLndyaXRlVmFyaW50SGFzaDY0KGMpKX07Ti53cml0ZVJlcGVhdGVkSW50MzI9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMud3JpdGVTaWduZWRWYXJpbnQzMl8oYSxjW2RdKX07Ck4ud3JpdGVSZXBlYXRlZEludDMyU3RyaW5nPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLndyaXRlSW50MzJTdHJpbmcoYSxjW2RdKX07Ti53cml0ZVJlcGVhdGVkSW50NjQ9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMud3JpdGVTaWduZWRWYXJpbnQ2NF8oYSxjW2RdKX07Ti53cml0ZVJlcGVhdGVkSW50NjRTdHJpbmc9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMud3JpdGVJbnQ2NFN0cmluZyhhLGNbZF0pfTtOLndyaXRlUmVwZWF0ZWRVaW50MzI9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMud3JpdGVVbnNpZ25lZFZhcmludDMyXyhhLGNbZF0pfTsKTi53cml0ZVJlcGVhdGVkVWludDMyU3RyaW5nPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLndyaXRlVWludDMyU3RyaW5nKGEsY1tkXSl9O04ud3JpdGVSZXBlYXRlZFVpbnQ2ND1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZVVuc2lnbmVkVmFyaW50NjRfKGEsY1tkXSl9O04ud3JpdGVSZXBlYXRlZFVpbnQ2NFN0cmluZz1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZVVpbnQ2NFN0cmluZyhhLGNbZF0pfTtOLndyaXRlUmVwZWF0ZWRTaW50MzI9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMud3JpdGVaaWd6YWdWYXJpbnQzMl8oYSxjW2RdKX07Ck4ud3JpdGVSZXBlYXRlZFNpbnQ2ND1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZVppZ3phZ1ZhcmludDY0XyhhLGNbZF0pfTtOLndyaXRlUmVwZWF0ZWRTaW50NjRTdHJpbmc9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMud3JpdGVaaWd6YWdWYXJpbnQ2NFN0cmluZ18oYSxjW2RdKX07Ti53cml0ZVJlcGVhdGVkRml4ZWQzMj1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZUZpeGVkMzIoYSxjW2RdKX07Ti53cml0ZVJlcGVhdGVkRml4ZWQ2ND1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZUZpeGVkNjQoYSxjW2RdKX07Ck4ud3JpdGVSZXBlYXRlZEZpeGVkNjRTdHJpbmc9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMud3JpdGVGaXhlZDY0U3RyaW5nKGEsY1tkXSl9O04ud3JpdGVSZXBlYXRlZFNmaXhlZDMyPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLndyaXRlU2ZpeGVkMzIoYSxjW2RdKX07Ti53cml0ZVJlcGVhdGVkU2ZpeGVkNjQ9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMud3JpdGVTZml4ZWQ2NChhLGNbZF0pfTtOLndyaXRlUmVwZWF0ZWRTZml4ZWQ2NFN0cmluZz1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZVNmaXhlZDY0U3RyaW5nKGEsY1tkXSl9OwpOLndyaXRlUmVwZWF0ZWRGbG9hdD1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZUZsb2F0KGEsY1tkXSl9O04ud3JpdGVSZXBlYXRlZERvdWJsZT1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZURvdWJsZShhLGNbZF0pfTtOLndyaXRlUmVwZWF0ZWRCb29sPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLndyaXRlQm9vbChhLGNbZF0pfTtOLndyaXRlUmVwZWF0ZWRFbnVtPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLndyaXRlRW51bShhLGNbZF0pfTtOLndyaXRlUmVwZWF0ZWRTdHJpbmc9ZnVuY3Rpb24oYSl7aWYobnVsbCE9YSlmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyl0aGlzLndyaXRlU3RyaW5nKDEsYVtjXSl9OwpOLndyaXRlUmVwZWF0ZWRCeXRlcz1mdW5jdGlvbihhKXtpZihudWxsIT1hKWZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKXRoaXMud3JpdGVCeXRlcygxLGFbY10pfTtOLndyaXRlUmVwZWF0ZWRNZXNzYWdlPWZ1bmN0aW9uKGEsYyxkKXtpZihudWxsIT1jKWZvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKXt2YXIgZz10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKTtkKGNbZl0sdGhpcyk7dGhpcy5lbmREZWxpbWl0ZWRfKGcpfX07Ti53cml0ZVJlcGVhdGVkR3JvdXA9ZnVuY3Rpb24oYSxjLGQpe2lmKG51bGwhPWMpZm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDMpLGQoY1tmXSx0aGlzKSx0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsNCl9O04ud3JpdGVSZXBlYXRlZEZpeGVkSGFzaDY0PWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9Yylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLndyaXRlRml4ZWRIYXNoNjQoYSxjW2RdKX07Ck4ud3JpdGVSZXBlYXRlZFZhcmludEhhc2g2ND1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy53cml0ZVZhcmludEhhc2g2NChhLGNbZF0pfTtOLndyaXRlUGFja2VkSW50MzI9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aCl7YT10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLmVuY29kZXJfLndyaXRlU2lnbmVkVmFyaW50MzIoY1tkXSk7dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07Ti53cml0ZVBhY2tlZEludDMyU3RyaW5nPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9YyYmYy5sZW5ndGgpe2E9dGhpcy5iZWdpbkRlbGltaXRlZF8oYSk7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspdGhpcy5lbmNvZGVyXy53cml0ZVNpZ25lZFZhcmludDMyKHBhcnNlSW50KGNbZF0sMTApKTt0aGlzLmVuZERlbGltaXRlZF8oYSl9fTsKTi53cml0ZVBhY2tlZEludDY0PWZ1bmN0aW9uKGEpe2lmKG51bGwhPWEmJmEubGVuZ3RoKXtmb3IodmFyIGM9dGhpcy5iZWdpbkRlbGltaXRlZF8oMSksZD0wO2Q8YS5sZW5ndGg7ZCsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVTaWduZWRWYXJpbnQ2NChhW2RdKTt0aGlzLmVuZERlbGltaXRlZF8oYyl9fTtOLndyaXRlUGFja2VkSW50NjRTdHJpbmc9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aCl7YT10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGY9WmQoY1tkXSk7dGhpcy5lbmNvZGVyXy53cml0ZVNwbGl0VmFyaW50NjQoZi5sbyxmLmhpKX10aGlzLmVuZERlbGltaXRlZF8oYSl9fTsKTi53cml0ZVBhY2tlZFVpbnQzMj1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKGNbZF0pO3RoaXMuZW5kRGVsaW1pdGVkXyhhKX19O04ud3JpdGVQYWNrZWRVaW50MzJTdHJpbmc9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aCl7YT10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQzMihwYXJzZUludChjW2RdLDEwKSk7dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07Ck4ud3JpdGVQYWNrZWRVaW50NjQ9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aCl7YT10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQ2NChjW2RdKTt0aGlzLmVuZERlbGltaXRlZF8oYSl9fTtOLndyaXRlUGFja2VkVWludDY0U3RyaW5nPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9YyYmYy5sZW5ndGgpe2E9dGhpcy5iZWdpbkRlbGltaXRlZF8oYSk7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspe3ZhciBmPUpkKGNbZF0pO3RoaXMuZW5jb2Rlcl8ud3JpdGVTcGxpdFZhcmludDY0KGYubG8sZi5oaSl9dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07Ck4ud3JpdGVQYWNrZWRTaW50MzI9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aCl7YT10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLmVuY29kZXJfLndyaXRlWmlnemFnVmFyaW50MzIoY1tkXSk7dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07Ti53cml0ZVBhY2tlZFNpbnQ2ND1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVaaWd6YWdWYXJpbnQ2NChjW2RdKTt0aGlzLmVuZERlbGltaXRlZF8oYSl9fTsKTi53cml0ZVBhY2tlZFNpbnQ2NFN0cmluZz1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVaaWd6YWdWYXJpbnQ2NChwYXJzZUludChjW2RdLDEwKSk7dGhpcy5lbmREZWxpbWl0ZWRfKGEpfX07Ti53cml0ZVBhY2tlZEZpeGVkMzI9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aClmb3IodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDIpLHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKDQqYy5sZW5ndGgpLGE9MDthPGMubGVuZ3RoO2ErKyl0aGlzLmVuY29kZXJfLndyaXRlVWludDMyKGNbYV0pfTsKTi53cml0ZVBhY2tlZEZpeGVkNjQ9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aClmb3IodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDIpLHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKDgqYy5sZW5ndGgpLGE9MDthPGMubGVuZ3RoO2ErKyl0aGlzLmVuY29kZXJfLndyaXRlVWludDY0KGNbYV0pfTtOLndyaXRlUGFja2VkRml4ZWQ2NFN0cmluZz1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKWZvcih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMiksdGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50MzIoOCpjLmxlbmd0aCksYT0wO2E8Yy5sZW5ndGg7YSsrKXt2YXIgZD1KZChjW2FdKTt0aGlzLmVuY29kZXJfLndyaXRlU3BsaXRGaXhlZDY0KGQubG8sZC5oaSl9fTsKTi53cml0ZVBhY2tlZFNmaXhlZDMyPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9YyYmYy5sZW5ndGgpZm9yKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwyKSx0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQzMig0KmMubGVuZ3RoKSxhPTA7YTxjLmxlbmd0aDthKyspdGhpcy5lbmNvZGVyXy53cml0ZUludDMyKGNbYV0pfTtOLndyaXRlUGFja2VkU2ZpeGVkNjQ9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aClmb3IodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDIpLHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKDgqYy5sZW5ndGgpLGE9MDthPGMubGVuZ3RoO2ErKyl0aGlzLmVuY29kZXJfLndyaXRlSW50NjQoY1thXSl9OwpOLndyaXRlUGFja2VkU2ZpeGVkNjRTdHJpbmc9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aClmb3IodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDIpLHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKDgqYy5sZW5ndGgpLGE9MDthPGMubGVuZ3RoO2ErKyl0aGlzLmVuY29kZXJfLndyaXRlSW50NjRTdHJpbmcoY1thXSl9O04ud3JpdGVQYWNrZWRGbG9hdD1mdW5jdGlvbihhKXtpZihudWxsIT1hJiZhLmxlbmd0aCl7dGhpcy53cml0ZUZpZWxkSGVhZGVyXygxLDIpO3RoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKDQqYS5sZW5ndGgpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKXRoaXMuZW5jb2Rlcl8ud3JpdGVGbG9hdChhW2NdKX19OwpOLndyaXRlUGFja2VkRG91YmxlPWZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9YyYmYy5sZW5ndGgpZm9yKHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oYSwyKSx0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQzMig4KmMubGVuZ3RoKSxhPTA7YTxjLmxlbmd0aDthKyspdGhpcy5lbmNvZGVyXy53cml0ZURvdWJsZShjW2FdKX07Ti53cml0ZVBhY2tlZEJvb2w9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aClmb3IodGhpcy53cml0ZUZpZWxkSGVhZGVyXyhhLDIpLHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKGMubGVuZ3RoKSxhPTA7YTxjLmxlbmd0aDthKyspdGhpcy5lbmNvZGVyXy53cml0ZUJvb2woY1thXSl9OwpOLndyaXRlUGFja2VkRW51bT1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKXthPXRoaXMuYmVnaW5EZWxpbWl0ZWRfKGEpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVFbnVtKGNbZF0pO3RoaXMuZW5kRGVsaW1pdGVkXyhhKX19O04ud3JpdGVQYWNrZWRGaXhlZEhhc2g2ND1mdW5jdGlvbihhLGMpe2lmKG51bGwhPWMmJmMubGVuZ3RoKWZvcih0aGlzLndyaXRlRmllbGRIZWFkZXJfKGEsMiksdGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50MzIoOCpjLmxlbmd0aCksYT0wO2E8Yy5sZW5ndGg7YSsrKXRoaXMuZW5jb2Rlcl8ud3JpdGVGaXhlZEhhc2g2NChjW2FdKX07Ck4ud3JpdGVQYWNrZWRWYXJpbnRIYXNoNjQ9ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jJiZjLmxlbmd0aCl7YT10aGlzLmJlZ2luRGVsaW1pdGVkXyhhKTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLmVuY29kZXJfLndyaXRlVmFyaW50SGFzaDY0KGNbZF0pO3RoaXMuZW5kRGVsaW1pdGVkXyhhKX19OwovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX3Byb3RvYnVmX2pzL21hcC5qcwpmdW5jdGlvbiB4ZihhLGMpe3RoaXMuYXJyXz1hO3RoaXMudmFsdWVDdG9yXz1jO3RoaXMubWFwXz17fTt0aGlzLmFyckNsZWFuPSEwOzA8dGhpcy5hcnJfLmxlbmd0aCYmdGhpcy5sb2FkRnJvbUFycmF5XygpfXhmLnByb3RvdHlwZS5sb2FkRnJvbUFycmF5Xz1mdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5hcnJfLmxlbmd0aDthKyspe3ZhciBjPXRoaXMuYXJyX1thXSxkPWNbMF07dGhpcy5tYXBfW2QudG9TdHJpbmcoKV09bmV3IHlmKGQsY1sxXSl9dGhpcy5hcnJDbGVhbj0hMH07CnhmLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7aWYodGhpcy5hcnJDbGVhbil7aWYodGhpcy52YWx1ZUN0b3JfKXt2YXIgYT10aGlzLm1hcF8sYztmb3IoYyBpbiBhKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGMpKXt2YXIgZD1hW2NdLnZhbHVlV3JhcHBlcjtkJiZkLnRvQXJyYXkoKX19fWVsc2V7dGhpcy5hcnJfLmxlbmd0aD0wO2E9dGhpcy5zdHJpbmdLZXlzXygpO2Euc29ydCgpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBmPXRoaXMubWFwX1thW2NdXTsoZD1mLnZhbHVlV3JhcHBlcikmJmQudG9BcnJheSgpO3RoaXMuYXJyXy5wdXNoKFtmLmtleSxmLnZhbHVlXSl9dGhpcy5hcnJDbGVhbj0hMH1yZXR1cm4gdGhpcy5hcnJffTsKeGYucHJvdG90eXBlLnRvT2JqZWN0PWZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBkPXRoaXMudG9BcnJheSgpLGY9W10sZz0wO2c8ZC5sZW5ndGg7ZysrKXt2YXIgbD10aGlzLm1hcF9bZFtnXVswXS50b1N0cmluZygpXTt0aGlzLndyYXBFbnRyeV8obCk7dmFyIGs9bC52YWx1ZVdyYXBwZXI7az9mLnB1c2goW2wua2V5LGMoYSxrKV0pOmYucHVzaChbbC5rZXksbC52YWx1ZV0pfXJldHVybiBmfTtmdW5jdGlvbiB6ZyhhKXt0aGlzLmlkeF89MDt0aGlzLmFycl89YX16Zy5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlkeF88dGhpcy5hcnJfLmxlbmd0aD97ZG9uZTohMSx2YWx1ZTp0aGlzLmFycl9bdGhpcy5pZHhfKytdfTp7ZG9uZTohMCx2YWx1ZTp2b2lkIDB9fTsidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmKHpnLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KTtOPXhmLnByb3RvdHlwZTtOLmdldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0cmluZ0tleXNfKCkubGVuZ3RofTsKTi5jbGVhcj1mdW5jdGlvbigpe3RoaXMubWFwXz17fTt0aGlzLmFyckNsZWFuPSExfTtOLmRlbD1mdW5jdGlvbihhKXthPWEudG9TdHJpbmcoKTt2YXIgYz10aGlzLm1hcF8uaGFzT3duUHJvcGVydHkoYSk7ZGVsZXRlIHRoaXMubWFwX1thXTt0aGlzLmFyckNsZWFuPSExO3JldHVybiBjfTtOLmdldEVudHJ5TGlzdD1mdW5jdGlvbigpe3ZhciBhPVtdLGM9dGhpcy5zdHJpbmdLZXlzXygpO2Muc29ydCgpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgZj10aGlzLm1hcF9bY1tkXV07YS5wdXNoKFtmLmtleSxmLnZhbHVlXSl9cmV0dXJuIGF9O04uZW50cmllcz1mdW5jdGlvbigpe3ZhciBhPVtdLGM9dGhpcy5zdHJpbmdLZXlzXygpO2Muc29ydCgpO2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgZj10aGlzLm1hcF9bY1tkXV07YS5wdXNoKFtmLmtleSx0aGlzLndyYXBFbnRyeV8oZildKX1yZXR1cm4gbmV3IHpnKGEpfTsKTi5rZXlzPWZ1bmN0aW9uKCl7dmFyIGE9W10sYz10aGlzLnN0cmluZ0tleXNfKCk7Yy5zb3J0KCk7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspYS5wdXNoKHRoaXMubWFwX1tjW2RdXS5rZXkpO3JldHVybiBuZXcgemcoYSl9O04udmFsdWVzPWZ1bmN0aW9uKCl7dmFyIGE9W10sYz10aGlzLnN0cmluZ0tleXNfKCk7Yy5zb3J0KCk7Zm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspYS5wdXNoKHRoaXMud3JhcEVudHJ5Xyh0aGlzLm1hcF9bY1tkXV0pKTtyZXR1cm4gbmV3IHpnKGEpfTtOLmZvckVhY2g9ZnVuY3Rpb24oYSxjKXt2YXIgZD10aGlzLnN0cmluZ0tleXNfKCk7ZC5zb3J0KCk7Zm9yKHZhciBmPTA7ZjxkLmxlbmd0aDtmKyspe3ZhciBnPXRoaXMubWFwX1tkW2ZdXTthLmNhbGwoYyx0aGlzLndyYXBFbnRyeV8oZyksZy5rZXksdGhpcyl9fTsKTi5zZXQ9ZnVuY3Rpb24oYSxjKXt2YXIgZD1uZXcgeWYoYSk7dGhpcy52YWx1ZUN0b3JfPyhkLnZhbHVlV3JhcHBlcj1jLGQudmFsdWU9Yy50b0FycmF5KCkpOmQudmFsdWU9Yzt0aGlzLm1hcF9bYS50b1N0cmluZygpXT1kO3RoaXMuYXJyQ2xlYW49ITE7cmV0dXJuIHRoaXN9O04ud3JhcEVudHJ5Xz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy52YWx1ZUN0b3JfPyhhLnZhbHVlV3JhcHBlcnx8KGEudmFsdWVXcmFwcGVyPW5ldyB0aGlzLnZhbHVlQ3Rvcl8oYS52YWx1ZSkpLGEudmFsdWVXcmFwcGVyKTphLnZhbHVlfTtOLmdldD1mdW5jdGlvbihhKXtpZihhPXRoaXMubWFwX1thLnRvU3RyaW5nKCldKXJldHVybiB0aGlzLndyYXBFbnRyeV8oYSl9O04uaGFzPWZ1bmN0aW9uKGEpe3JldHVybiBhLnRvU3RyaW5nKClpbiB0aGlzLm1hcF99OwpOLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbihhLGMsZCxmLGcpe3ZhciBsPXRoaXMuc3RyaW5nS2V5c18oKTtsLnNvcnQoKTtmb3IodmFyIGs9MDtrPGwubGVuZ3RoO2srKyl7dmFyIG49dGhpcy5tYXBfW2xba11dO2MuYmVnaW5TdWJNZXNzYWdlKGEpO2QuY2FsbChjLDEsbi5rZXkpO3RoaXMudmFsdWVDdG9yXz9mLmNhbGwoYywyLHRoaXMud3JhcEVudHJ5XyhuKSxnKTpmLmNhbGwoYywyLG4udmFsdWUpO2MuZW5kU3ViTWVzc2FnZSgpfX07ZnVuY3Rpb24gQWcoYSxjLGQpe2Zvcih2YXIgZj11Zi5wcm90b3R5cGUucmVhZFN0cmluZyxnPXVmLnByb3RvdHlwZS5yZWFkTWVzc2FnZSxsPSIiLGs9dm9pZCAwO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspe3ZhciBuPWMuZ2V0RmllbGROdW1iZXIoKTsxPT1uP2w9Zi5jYWxsKGMpOjI9PW4mJihhLnZhbHVlQ3Rvcl8/KGs9bmV3IGEudmFsdWVDdG9yXyxnLmNhbGwoYyxrLGQpKTprPWcuY2FsbChjKSl9YS5zZXQobCxrKX0KTi5zdHJpbmdLZXlzXz1mdW5jdGlvbigpe3ZhciBhPXRoaXMubWFwXyxjPVtdLGQ7Zm9yKGQgaW4gYSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxkKSYmYy5wdXNoKGQpO3JldHVybiBjfTtmdW5jdGlvbiB5ZihhLGMpe3RoaXMua2V5PWE7dGhpcy52YWx1ZT1jO3RoaXMudmFsdWVXcmFwcGVyPXZvaWQgMH07Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfcHJvdG9idWZfanMvbWVzc2FnZS5qcwpmdW5jdGlvbiBCZygpe312YXIgQ2c9ImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXk7QmcucHJvdG90eXBlLmdldEpzUGJNZXNzYWdlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZXNzYWdlSWRffTtmdW5jdGlvbiBEZyhhLGMpe3JldHVybiBjK2EuYXJyYXlJbmRleE9mZnNldF99ZnVuY3Rpb24gRWcoYSxjKXtyZXR1cm4gYy1hLmFycmF5SW5kZXhPZmZzZXRffQpmdW5jdGlvbiBGZyhhLGMsZCxmKXthLndyYXBwZXJzXz1udWxsO2N8fChjPVtdKTthLm1lc3NhZ2VJZF89dm9pZCAwO2EuYXJyYXlJbmRleE9mZnNldF89LTE7YS5hcnJheT1jO0dnKGEpO2EuY29udmVydGVkUHJpbWl0aXZlRmllbGRzXz17fTtpZihkKWZvcihjPTA7YzxkLmxlbmd0aDtjKyspe3ZhciBnPWRbY107ZzxhLnBpdm90Xz8oZz1EZyhhLGcpLGEuYXJyYXlbZ109YS5hcnJheVtnXXx8SGcpOihJZyhhKSxhLmV4dGVuc2lvbk9iamVjdF9bZ109YS5leHRlbnNpb25PYmplY3RfW2ddfHxIZyl9aWYoZiYmZi5sZW5ndGgpZm9yKGM9MDtjPGYubGVuZ3RoO2MrKylKZyhhLGZbY10pfXZhciBIZz1PYmplY3QuZnJlZXplP09iamVjdC5mcmVlemUoW10pOltdO2Z1bmN0aW9uIEtnKGEpe3JldHVybiBRYihhKX1mdW5jdGlvbiBMZyhhKXtyZXR1cm4gbnVsbCE9PWEmJiJvYmplY3QiPT10eXBlb2YgYSYmIUtnKGEpJiYhKENnJiZhIGluc3RhbmNlb2YgVWludDhBcnJheSl9CmZ1bmN0aW9uIEdnKGEpe3ZhciBjPWEuYXJyYXkubGVuZ3RoO2lmKGMpey0tYzt2YXIgZD1hLmFycmF5W2NdO2lmKExnKGQpKXthLnBpdm90Xz1FZyhhLGMpO2EuZXh0ZW5zaW9uT2JqZWN0Xz1kO3JldHVybn19YS5waXZvdF89TnVtYmVyLk1BWF9WQUxVRX1mdW5jdGlvbiBJZyhhKXt2YXIgYz1EZyhhLGEucGl2b3RfKTthLmFycmF5W2NdfHwoYS5leHRlbnNpb25PYmplY3RfPWEuYXJyYXlbY109e30pfWZ1bmN0aW9uIE1nKGEsYyxkKXtmb3IodmFyIGY9W10sZz0wO2c8YS5sZW5ndGg7ZysrKWZbZ109Yy5jYWxsKGFbZ10sZCxhW2ddKTtyZXR1cm4gZn1mdW5jdGlvbiBOZyhhLGMpe2lmKGM8YS5waXZvdF8pe2M9RGcoYSxjKTt2YXIgZD1hLmFycmF5W2NdO3JldHVybiBkPT09SGc/YS5hcnJheVtjXT1bXTpkfWlmKGEuZXh0ZW5zaW9uT2JqZWN0XylyZXR1cm4gZD1hLmV4dGVuc2lvbk9iamVjdF9bY10sZD09PUhnP2EuZXh0ZW5zaW9uT2JqZWN0X1tjXT1bXTpkfQpmdW5jdGlvbiBPZyhhLGMpe3JldHVybiBOZyhhLGMpfWZ1bmN0aW9uIFBnKGEsYyl7YT1OZyhhLGMpO3JldHVybiBudWxsPT1hP2E6K2F9ZnVuY3Rpb24gUWcoYSl7dmFyIGM9T2coYSwxKTthLmNvbnZlcnRlZFByaW1pdGl2ZUZpZWxkc198fChhLmNvbnZlcnRlZFByaW1pdGl2ZUZpZWxkc189e30pO2lmKCFhLmNvbnZlcnRlZFByaW1pdGl2ZUZpZWxkc19bMV0pe2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKWNbZF09K2NbZF07YS5jb252ZXJ0ZWRQcmltaXRpdmVGaWVsZHNfWzFdPSEwfXJldHVybiBjfWZ1bmN0aW9uIFJnKGEpe2lmKG51bGw9PWF8fEhiKGEpKXJldHVybiBhO2lmKENnJiZhIGluc3RhbmNlb2YgVWludDhBcnJheSlyZXR1cm4gb2QoYSk7ZGMoIkNhbm5vdCBjb2VyY2UgdG8gYjY0IHN0cmluZzogIitMYihhKSk7cmV0dXJuIG51bGx9CmZ1bmN0aW9uIFNnKGEpe2lmKG51bGw9PWF8fGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBhO2lmKEhiKGEpKXJldHVybiBxZChhKTtkYygiQ2Fubm90IGNvZXJjZSB0byBVaW50OEFycmF5OiAiK0xiKGEpKTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBUZyhhKXtVZyhhKTtyZXR1cm4hYS5sZW5ndGh8fEhiKGFbMF0pP2E6aGMoYSxSZyl9ZnVuY3Rpb24gVmcoYSl7VWcoYSk7cmV0dXJuIWEubGVuZ3RofHxhWzBdaW5zdGFuY2VvZiBVaW50OEFycmF5P2E6aGMoYSxTZyl9ZnVuY3Rpb24gVWcoYSl7aWYoYSYmMTxhLmxlbmd0aCl7dmFyIGM9TGIoYVswXSk7Z2MoYSxmdW5jdGlvbihkKXtMYihkKSE9YyYmZGMoIkluY29uc2lzdGVudCB0eXBlIGluIEpTUEIgcmVwZWF0ZWQgZmllbGQgYXJyYXkuIEdvdCAiK0xiKGQpKyIgZXhwZWN0ZWQgIitjKX0pfX1mdW5jdGlvbiBXZyhhLGMsZCl7YT1OZyhhLGMpO3JldHVybiBudWxsPT1hP2Q6YX0KZnVuY3Rpb24gWGcoYSxjKXthPVBnKGEsYyk7cmV0dXJuIG51bGw9PWE/MDphfWZ1bmN0aW9uIFdoKGEsYyxkKXthLndyYXBwZXJzX3x8KGEud3JhcHBlcnNfPXt9KTtpZigxIGluIGEud3JhcHBlcnNfKXJldHVybiBhLndyYXBwZXJzX1sxXTtpZighYylyZXR1cm4gYz1OZyhhLDEpLGN8fChjPVtdLFhoKGEsMSxjKSksYS53cmFwcGVyc19bMV09bmV3IHhmKGMsZCl9ZnVuY3Rpb24gWGgoYSxjLGQpe2M8YS5waXZvdF8/YS5hcnJheVtEZyhhLGMpXT1kOihJZyhhKSxhLmV4dGVuc2lvbk9iamVjdF9bY109ZCl9ZnVuY3Rpb24gWWgoYSxjLGQpe1poKGEsYyxkLDApfWZ1bmN0aW9uICRoKGEsYyxkKXtaaChhLGMsZCwwKX1mdW5jdGlvbiBhaShhLGMsZCl7WmgoYSxjLGQsIiIpfWZ1bmN0aW9uIGJpKGEsYyxkKXtaaChhLGMsZCwwKX1mdW5jdGlvbiBaaChhLGMsZCxmKXtkIT09Zj9YaChhLGMsZCk6YS5hcnJheVtEZyhhLGMpXT1udWxsfQpmdW5jdGlvbiBjaShhLGMsZCl7YT1PZyhhLDEpO3ZvaWQgMCE9ZD9hLnNwbGljZShkLDAsYyk6YS5wdXNoKGMpfWZ1bmN0aW9uIGRpKGEsYyxkLGYpeyhkPUpnKGEsZCkpJiZkIT09YyYmdm9pZCAwIT09ZiYmKGEud3JhcHBlcnNfJiZkIGluIGEud3JhcHBlcnNfJiYoYS53cmFwcGVyc19bZF09dm9pZCAwKSxYaChhLGQsdm9pZCAwKSk7WGgoYSxjLGYpfWZ1bmN0aW9uIEpnKGEsYyl7Zm9yKHZhciBkLGYsZz0wO2c8Yy5sZW5ndGg7ZysrKXt2YXIgbD1jW2ddLGs9TmcoYSxsKTtudWxsIT1rJiYoZD1sLGY9ayxYaChhLGwsdm9pZCAwKSl9cmV0dXJuIGQ/KFhoKGEsZCxmKSxkKTowfWZ1bmN0aW9uIGVpKGEsYyxkKXthLndyYXBwZXJzX3x8KGEud3JhcHBlcnNfPXt9KTtpZighYS53cmFwcGVyc19bZF0pe3ZhciBmPU5nKGEsZCk7ZiYmKGEud3JhcHBlcnNfW2RdPW5ldyBjKGYpKX1yZXR1cm4gYS53cmFwcGVyc19bZF19CmZ1bmN0aW9uIGZpKGEsYyxkKXtnaShhLGMsZCk7Yz1hLndyYXBwZXJzX1tkXTtjPT1IZyYmKGM9YS53cmFwcGVyc19bZF09W10pO3JldHVybiBjfWZ1bmN0aW9uIGdpKGEsYyxkKXthLndyYXBwZXJzX3x8KGEud3JhcHBlcnNfPXt9KTtpZighYS53cmFwcGVyc19bZF0pe2Zvcih2YXIgZj1PZyhhLGQpLGc9W10sbD0wO2w8Zi5sZW5ndGg7bCsrKWdbbF09bmV3IGMoZltsXSk7YS53cmFwcGVyc19bZF09Z319ZnVuY3Rpb24gaGkoYSxjLGQpe2Eud3JhcHBlcnNffHwoYS53cmFwcGVyc189e30pO3ZhciBmPWQ/ZC50b0FycmF5KCk6ZDthLndyYXBwZXJzX1tjXT1kO1hoKGEsYyxmKX1mdW5jdGlvbiBpaShhLGMsZCxmKXthLndyYXBwZXJzX3x8KGEud3JhcHBlcnNfPXt9KTt2YXIgZz1mP2YudG9BcnJheSgpOmY7YS53cmFwcGVyc19bY109ZjtkaShhLGMsZCxnKX0KZnVuY3Rpb24gamkoYSxjLGQpe2Eud3JhcHBlcnNffHwoYS53cmFwcGVyc189e30pO2Q9ZHx8W107Zm9yKHZhciBmPVtdLGc9MDtnPGQubGVuZ3RoO2crKylmW2ddPWRbZ10udG9BcnJheSgpO2Eud3JhcHBlcnNfW2NdPWQ7WGgoYSxjLGYpfWZ1bmN0aW9uIGtpKGEsYyxkLGYsZyl7Z2koYSxmLGMpO3ZhciBsPWEud3JhcHBlcnNfW2NdO2x8fChsPWEud3JhcHBlcnNfW2NdPVtdKTtkPWQ/ZDpuZXcgZjthPU9nKGEsYyk7dm9pZCAwIT1nPyhsLnNwbGljZShnLDAsZCksYS5zcGxpY2UoZywwLGQudG9BcnJheSgpKSk6KGwucHVzaChkKSxhLnB1c2goZC50b0FycmF5KCkpKTtyZXR1cm4gZH1OPUJnLnByb3RvdHlwZTsKTi5zeW5jTWFwRmllbGRzXz1mdW5jdGlvbigpe2lmKHRoaXMud3JhcHBlcnNfKWZvcih2YXIgYSBpbiB0aGlzLndyYXBwZXJzXyl7dmFyIGM9dGhpcy53cmFwcGVyc19bYV07aWYoUWIoYykpZm9yKHZhciBkPTA7ZDxjLmxlbmd0aDtkKyspY1tkXSYmY1tkXS50b0FycmF5KCk7ZWxzZSBjJiZjLnRvQXJyYXkoKX19O04udG9BcnJheT1mdW5jdGlvbigpe3RoaXMuc3luY01hcEZpZWxkc18oKTtyZXR1cm4gdGhpcy5hcnJheX07Ti50b1N0cmluZz1mdW5jdGlvbigpe3RoaXMuc3luY01hcEZpZWxkc18oKTtyZXR1cm4gdGhpcy5hcnJheS50b1N0cmluZygpfTsKTi5nZXRFeHRlbnNpb249ZnVuY3Rpb24oYSl7aWYodGhpcy5leHRlbnNpb25PYmplY3RfKXt0aGlzLndyYXBwZXJzX3x8KHRoaXMud3JhcHBlcnNfPXt9KTt2YXIgYz1hLmZpZWxkSW5kZXg7aWYoYS5pc1JlcGVhdGVkKXtpZihhLmlzTWVzc2FnZVR5cGUoKSlyZXR1cm4gdGhpcy53cmFwcGVyc19bY118fCh0aGlzLndyYXBwZXJzX1tjXT1oYyh0aGlzLmV4dGVuc2lvbk9iamVjdF9bY118fFtdLGZ1bmN0aW9uKGQpe3JldHVybiBuZXcgYS5jdG9yKGQpfSkpLHRoaXMud3JhcHBlcnNfW2NdfWVsc2UgaWYoYS5pc01lc3NhZ2VUeXBlKCkpcmV0dXJuIXRoaXMud3JhcHBlcnNfW2NdJiZ0aGlzLmV4dGVuc2lvbk9iamVjdF9bY10mJih0aGlzLndyYXBwZXJzX1tjXT1uZXcgYS5jdG9yKHRoaXMuZXh0ZW5zaW9uT2JqZWN0X1tjXSkpLHRoaXMud3JhcHBlcnNfW2NdO3JldHVybiB0aGlzLmV4dGVuc2lvbk9iamVjdF9bY119fTsKTi5zZXRFeHRlbnNpb249ZnVuY3Rpb24oYSxjKXt0aGlzLndyYXBwZXJzX3x8KHRoaXMud3JhcHBlcnNfPXt9KTtJZyh0aGlzKTt2YXIgZD1hLmZpZWxkSW5kZXg7YS5pc1JlcGVhdGVkPyhjPWN8fFtdLGEuaXNNZXNzYWdlVHlwZSgpPyh0aGlzLndyYXBwZXJzX1tkXT1jLHRoaXMuZXh0ZW5zaW9uT2JqZWN0X1tkXT1oYyhjLGZ1bmN0aW9uKGYpe3JldHVybiBmLnRvQXJyYXkoKX0pKTp0aGlzLmV4dGVuc2lvbk9iamVjdF9bZF09Yyk6YS5pc01lc3NhZ2VUeXBlKCk/KHRoaXMud3JhcHBlcnNfW2RdPWMsdGhpcy5leHRlbnNpb25PYmplY3RfW2RdPWM/Yy50b0FycmF5KCk6Yyk6dGhpcy5leHRlbnNpb25PYmplY3RfW2RdPWM7cmV0dXJuIHRoaXN9O04uY2xvbmVNZXNzYWdlPWZ1bmN0aW9uKCl7cmV0dXJuIGxpKHRoaXMpfTtOLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIGxpKHRoaXMpfTsKZnVuY3Rpb24gbGkoYSl7cmV0dXJuIG5ldyBhLmNvbnN0cnVjdG9yKG1pKGEudG9BcnJheSgpKSl9ZnVuY3Rpb24gbWkoYSl7aWYoUWIoYSkpe2Zvcih2YXIgYz1BcnJheShhLmxlbmd0aCksZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZj1hW2RdO251bGwhPWYmJihjW2RdPSJvYmplY3QiPT10eXBlb2YgZj9taShmKTpmKX1yZXR1cm4gY31pZihDZyYmYSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpcmV0dXJuIG5ldyBVaW50OEFycmF5KGEpO2M9e307Zm9yKGQgaW4gYSlmPWFbZF0sbnVsbCE9ZiYmKGNbZF09Im9iamVjdCI9PXR5cGVvZiBmP21pKGYpOmYpO3JldHVybiBjfTsKLy8jIHNvdXJjZVVSTD1idWlsZDovZXh0ZXJuYWwvY29tX2dvb2dsZV9wcm90b2J1Zl9qcy9kZWJ1Zy5qcwovLyMgc291cmNlVVJMPWJ1aWxkOi9iYXplbC1vdXQvaG9zdC9iaW4vZXh0ZXJuYWwvb3JnX3RlbnNvcmZsb3cvdGVuc29yZmxvdy9jb3JlL2V4YW1wbGVfcHJvdG9zLmpzCmZ1bmN0aW9uIG5pKGEpe0ZnKHRoaXMsYSxvaSxudWxsKX1UYihuaSxCZyk7ZnVuY3Rpb24gQmooYSl7RmcodGhpcyxhLENqLG51bGwpfVRiKEJqLEJnKTtmdW5jdGlvbiBEaihhKXtGZyh0aGlzLGEsRWosbnVsbCl9VGIoRGosQmcpO2Z1bmN0aW9uIEZqKGEpe0ZnKHRoaXMsYSxudWxsLEdqKX1UYihGaixCZyk7ZnVuY3Rpb24gSGooYSl7RmcodGhpcyxhLG51bGwsbnVsbCl9VGIoSGosQmcpO2Z1bmN0aW9uIElqKGEpe0ZnKHRoaXMsYSxKaixudWxsKX1UYihJaixCZyk7ZnVuY3Rpb24gS2ooYSl7RmcodGhpcyxhLG51bGwsbnVsbCl9VGIoS2osQmcpO3ZhciBvaT1bMV07Tj1uaS5wcm90b3R5cGU7Ti50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gTGooYSx0aGlzKX07ZnVuY3Rpb24gTGooYSxjKXt2YXIgZD17dmFsdWVMaXN0OmMuZ2V0VmFsdWVMaXN0X2FzQjY0KCl9O2EmJihkLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBkfQpmdW5jdGlvbiBNaihhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9Yy5yZWFkQnl0ZXMoKTthLmFkZFZhbHVlKGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1OLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyB3ZjtOaih0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTtmdW5jdGlvbiBOaihhLGMpe2E9YS5nZXRWYWx1ZUxpc3RfYXNVOCgpOzA8YS5sZW5ndGgmJmMud3JpdGVSZXBlYXRlZEJ5dGVzKGEpfU4uZ2V0VmFsdWVMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIE9nKHRoaXMsMSl9O04uZ2V0VmFsdWVMaXN0X2FzQjY0PWZ1bmN0aW9uKCl7cmV0dXJuIFRnKHRoaXMuZ2V0VmFsdWVMaXN0KCkpfTtOLmdldFZhbHVlTGlzdF9hc1U4PWZ1bmN0aW9uKCl7cmV0dXJuIFZnKHRoaXMuZ2V0VmFsdWVMaXN0KCkpfTsKTi5zZXRWYWx1ZUxpc3Q9ZnVuY3Rpb24oYSl7WGgodGhpcywxLGF8fFtdKX07Ti5hZGRWYWx1ZT1mdW5jdGlvbihhLGMpe2NpKHRoaXMsYSxjKX07Ti5jbGVhclZhbHVlTGlzdD1mdW5jdGlvbigpe3RoaXMuc2V0VmFsdWVMaXN0KFtdKX07dmFyIENqPVsxXTtOPUJqLnByb3RvdHlwZTtOLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBPaihhLHRoaXMpfTtmdW5jdGlvbiBPaihhLGMpe3ZhciBkLGY9e3ZhbHVlTGlzdDpudWxsPT0oZD1RZyhjKSk/dm9pZCAwOmR9O2EmJihmLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBmfWZ1bmN0aW9uIFBqKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1jLnJlYWRQYWNrZWRGbG9hdCgpO2Euc2V0VmFsdWVMaXN0KGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX0KTi5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgd2Y7UWoodGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07ZnVuY3Rpb24gUWooYSxjKXthPWEuZ2V0VmFsdWVMaXN0KCk7MDxhLmxlbmd0aCYmYy53cml0ZVBhY2tlZEZsb2F0KGEpfU4uZ2V0VmFsdWVMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIFFnKHRoaXMpfTtOLnNldFZhbHVlTGlzdD1mdW5jdGlvbihhKXtYaCh0aGlzLDEsYXx8W10pfTtOLmFkZFZhbHVlPWZ1bmN0aW9uKGEsYyl7Y2kodGhpcyxhLGMpfTtOLmNsZWFyVmFsdWVMaXN0PWZ1bmN0aW9uKCl7dGhpcy5zZXRWYWx1ZUxpc3QoW10pfTt2YXIgRWo9WzFdO049RGoucHJvdG90eXBlO04udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIFJqKGEsdGhpcyl9O2Z1bmN0aW9uIFJqKGEsYyl7dmFyIGQsZj17dmFsdWVMaXN0Om51bGw9PShkPU9nKGMsMSkpP3ZvaWQgMDpkfTthJiYoZi4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZn0KZnVuY3Rpb24gU2ooYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPWMucmVhZFBhY2tlZEludDY0KCk7YS5zZXRWYWx1ZUxpc3QoZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfU4uc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IHdmO1RqKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9O2Z1bmN0aW9uIFRqKGEsYyl7YT1hLmdldFZhbHVlTGlzdCgpOzA8YS5sZW5ndGgmJmMud3JpdGVQYWNrZWRJbnQ2NChhKX1OLmdldFZhbHVlTGlzdD1mdW5jdGlvbigpe3JldHVybiBPZyh0aGlzLDEpfTtOLnNldFZhbHVlTGlzdD1mdW5jdGlvbihhKXtYaCh0aGlzLDEsYXx8W10pfTtOLmFkZFZhbHVlPWZ1bmN0aW9uKGEsYyl7Y2kodGhpcyxhLGMpfTtOLmNsZWFyVmFsdWVMaXN0PWZ1bmN0aW9uKCl7dGhpcy5zZXRWYWx1ZUxpc3QoW10pfTsKdmFyIEdqPVtbMSwyLDNdXTtOPUZqLnByb3RvdHlwZTtOLmdldEtpbmRDYXNlPWZ1bmN0aW9uKCl7cmV0dXJuIEpnKHRoaXMsR2pbMF0pfTtOLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBVaihhLHRoaXMpfTtmdW5jdGlvbiBVaihhLGMpe3ZhciBkLGY9e2J5dGVzTGlzdDooZD1jLmdldEJ5dGVzTGlzdCgpKSYmTGooYSxkKSxmbG9hdExpc3Q6KGQ9Yy5nZXRGbG9hdExpc3QoKSkmJk9qKGEsZCksaW50NjRMaXN0OihkPWMuZ2V0SW50NjRMaXN0KCkpJiZSaihhLGQpfTthJiYoZi4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZn0KZnVuY3Rpb24gVmooYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPW5ldyBuaTtjLnJlYWRNZXNzYWdlKGQsTWopO2Euc2V0Qnl0ZXNMaXN0KGQpO2JyZWFrO2Nhc2UgMjpkPW5ldyBCajtjLnJlYWRNZXNzYWdlKGQsUGopO2Euc2V0RmxvYXRMaXN0KGQpO2JyZWFrO2Nhc2UgMzpkPW5ldyBEajtjLnJlYWRNZXNzYWdlKGQsU2opO2Euc2V0SW50NjRMaXN0KGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1OLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyB3ZjtXaih0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTsKZnVuY3Rpb24gV2ooYSxjKXt2YXIgZD1hLmdldEJ5dGVzTGlzdCgpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDEsZCxOaik7ZD1hLmdldEZsb2F0TGlzdCgpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDIsZCxRaik7ZD1hLmdldEludDY0TGlzdCgpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDMsZCxUail9Ti5nZXRCeXRlc0xpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gZWkodGhpcyxuaSwxKX07Ti5zZXRCeXRlc0xpc3Q9ZnVuY3Rpb24oYSl7aWkodGhpcywxLEdqWzBdLGEpfTtOLmNsZWFyQnl0ZXNMaXN0PWZ1bmN0aW9uKCl7dGhpcy5zZXRCeXRlc0xpc3Qodm9pZCAwKX07Ti5oYXNCeXRlc0xpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9TmcodGhpcywxKX07Ti5nZXRGbG9hdExpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gZWkodGhpcyxCaiwyKX07Ti5zZXRGbG9hdExpc3Q9ZnVuY3Rpb24oYSl7aWkodGhpcywyLEdqWzBdLGEpfTtOLmNsZWFyRmxvYXRMaXN0PWZ1bmN0aW9uKCl7dGhpcy5zZXRGbG9hdExpc3Qodm9pZCAwKX07Ck4uaGFzRmxvYXRMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPU5nKHRoaXMsMil9O04uZ2V0SW50NjRMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIGVpKHRoaXMsRGosMyl9O04uc2V0SW50NjRMaXN0PWZ1bmN0aW9uKGEpe2lpKHRoaXMsMyxHalswXSxhKX07Ti5jbGVhckludDY0TGlzdD1mdW5jdGlvbigpe3RoaXMuc2V0SW50NjRMaXN0KHZvaWQgMCl9O04uaGFzSW50NjRMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPU5nKHRoaXMsMyl9O0hqLnByb3RvdHlwZS50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gWGooYSx0aGlzKX07ZnVuY3Rpb24gWGooYSxjKXt2YXIgZCxmPXtmZWF0dXJlTWFwOihkPWMuZ2V0RmVhdHVyZU1hcCgpKT9kLnRvT2JqZWN0KGEsVWopOltdfTthJiYoZi4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZn0KZnVuY3Rpb24gWWooYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPWEuZ2V0RmVhdHVyZU1hcCgpO2MucmVhZE1lc3NhZ2UoZCxmdW5jdGlvbihmLGcpe0FnKGYsZyxWail9KTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9SGoucHJvdG90eXBlLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyB3Zjtaaih0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTtmdW5jdGlvbiBaaihhLGMpeyhhPWEuZ2V0RmVhdHVyZU1hcCghMCkpJiYwPGEuZ2V0TGVuZ3RoKCkmJmEuc2VyaWFsaXplQmluYXJ5KDEsYyx3Zi5wcm90b3R5cGUud3JpdGVTdHJpbmcsd2YucHJvdG90eXBlLndyaXRlTWVzc2FnZSxXail9SGoucHJvdG90eXBlLmdldEZlYXR1cmVNYXA9ZnVuY3Rpb24oYSl7cmV0dXJuIFdoKHRoaXMsYSxGail9OwpIai5wcm90b3R5cGUuY2xlYXJGZWF0dXJlTWFwPWZ1bmN0aW9uKCl7dGhpcy5nZXRGZWF0dXJlTWFwKCkuY2xlYXIoKX07dmFyIEpqPVsxXTtOPUlqLnByb3RvdHlwZTtOLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBhayhhLHRoaXMpfTtmdW5jdGlvbiBhayhhLGMpe3ZhciBkPXtmZWF0dXJlTGlzdDpNZyhjLmdldEZlYXR1cmVMaXN0KCksVWosYSl9O2EmJihkLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBkfWZ1bmN0aW9uIGJrKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1uZXcgRmo7Yy5yZWFkTWVzc2FnZShkLFZqKTthLmFkZEZlYXR1cmUoZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfU4uc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IHdmO2NrKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9OwpmdW5jdGlvbiBjayhhLGMpe2E9YS5nZXRGZWF0dXJlTGlzdCgpOzA8YS5sZW5ndGgmJmMud3JpdGVSZXBlYXRlZE1lc3NhZ2UoMSxhLFdqKX1OLmdldEZlYXR1cmVMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIGZpKHRoaXMsRmosMSl9O04uc2V0RmVhdHVyZUxpc3Q9ZnVuY3Rpb24oYSl7amkodGhpcywxLGEpfTtOLmFkZEZlYXR1cmU9ZnVuY3Rpb24oYSxjKXtyZXR1cm4ga2kodGhpcywxLGEsRmosYyl9O04uY2xlYXJGZWF0dXJlTGlzdD1mdW5jdGlvbigpe3RoaXMuc2V0RmVhdHVyZUxpc3QoW10pfTtLai5wcm90b3R5cGUudG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIGRrKGEsdGhpcyl9O2Z1bmN0aW9uIGRrKGEsYyl7dmFyIGQsZj17ZmVhdHVyZUxpc3RNYXA6KGQ9Yy5nZXRGZWF0dXJlTGlzdE1hcCgpKT9kLnRvT2JqZWN0KGEsYWspOltdfTthJiYoZi4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZn0KZnVuY3Rpb24gZWsoYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPWEuZ2V0RmVhdHVyZUxpc3RNYXAoKTtjLnJlYWRNZXNzYWdlKGQsZnVuY3Rpb24oZixnKXtBZyhmLGcsYmspfSk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfUtqLnByb3RvdHlwZS5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgd2Y7ZmsodGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07ZnVuY3Rpb24gZmsoYSxjKXsoYT1hLmdldEZlYXR1cmVMaXN0TWFwKCEwKSkmJjA8YS5nZXRMZW5ndGgoKSYmYS5zZXJpYWxpemVCaW5hcnkoMSxjLHdmLnByb3RvdHlwZS53cml0ZVN0cmluZyx3Zi5wcm90b3R5cGUud3JpdGVNZXNzYWdlLGNrKX1Lai5wcm90b3R5cGUuZ2V0RmVhdHVyZUxpc3RNYXA9ZnVuY3Rpb24oYSl7cmV0dXJuIFdoKHRoaXMsYSxJail9OwpLai5wcm90b3R5cGUuY2xlYXJGZWF0dXJlTGlzdE1hcD1mdW5jdGlvbigpe3RoaXMuZ2V0RmVhdHVyZUxpc3RNYXAoKS5jbGVhcigpfTtmdW5jdGlvbiBnayhhKXtGZyh0aGlzLGEsbnVsbCxudWxsKX1UYihnayxCZyk7ZnVuY3Rpb24gaGsoYSl7RmcodGhpcyxhLG51bGwsbnVsbCl9VGIoaGssQmcpO049Z2sucHJvdG90eXBlO04udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIGlrKGEsdGhpcyl9O2Z1bmN0aW9uIGlrKGEsYyl7dmFyIGQsZj17ZmVhdHVyZXM6KGQ9Yy5nZXRGZWF0dXJlcygpKSYmWGooYSxkKX07YSYmKGYuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGZ9ZnVuY3Rpb24gamsoYSl7YT1uZXcgdWYoYSk7dmFyIGM9bmV3IGdrO3JldHVybiBrayhjLGEpfQpmdW5jdGlvbiBrayhhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9bmV3IEhqO2MucmVhZE1lc3NhZ2UoZCxZaik7YS5zZXRGZWF0dXJlcyhkKTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9Ti5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgd2Y7d2wodGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07ZnVuY3Rpb24gd2woYSxjKXthPWEuZ2V0RmVhdHVyZXMoKTtudWxsIT1hJiZjLndyaXRlTWVzc2FnZSgxLGEsWmopfU4uZ2V0RmVhdHVyZXM9ZnVuY3Rpb24oKXtyZXR1cm4gZWkodGhpcyxIaiwxKX07Ti5zZXRGZWF0dXJlcz1mdW5jdGlvbihhKXtoaSh0aGlzLDEsYSl9O04uY2xlYXJGZWF0dXJlcz1mdW5jdGlvbigpe3RoaXMuc2V0RmVhdHVyZXModm9pZCAwKX07Ck4uaGFzRmVhdHVyZXM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9TmcodGhpcywxKX07Tj1oay5wcm90b3R5cGU7Ti50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4geGwoYSx0aGlzKX07ZnVuY3Rpb24geGwoYSxjKXt2YXIgZCxmPXtjb250ZXh0OihkPWMuZ2V0Q29udGV4dCgpKSYmWGooYSxkKSxmZWF0dXJlTGlzdHM6KGQ9Yy5nZXRGZWF0dXJlTGlzdHMoKSkmJmRrKGEsZCl9O2EmJihmLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBmfWZ1bmN0aW9uIHlsKGEpe2E9bmV3IHVmKGEpO3ZhciBjPW5ldyBoaztyZXR1cm4gemwoYyxhKX0KZnVuY3Rpb24gemwoYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPW5ldyBIajtjLnJlYWRNZXNzYWdlKGQsWWopO2Euc2V0Q29udGV4dChkKTticmVhaztjYXNlIDI6ZD1uZXcgS2o7Yy5yZWFkTWVzc2FnZShkLGVrKTthLnNldEZlYXR1cmVMaXN0cyhkKTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9Ti5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgd2Y7QWwodGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07ZnVuY3Rpb24gQWwoYSxjKXt2YXIgZD1hLmdldENvbnRleHQoKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSgxLGQsWmopO2Q9YS5nZXRGZWF0dXJlTGlzdHMoKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSgyLGQsZmspfU4uZ2V0Q29udGV4dD1mdW5jdGlvbigpe3JldHVybiBlaSh0aGlzLEhqLDEpfTsKTi5zZXRDb250ZXh0PWZ1bmN0aW9uKGEpe2hpKHRoaXMsMSxhKX07Ti5jbGVhckNvbnRleHQ9ZnVuY3Rpb24oKXt0aGlzLnNldENvbnRleHQodm9pZCAwKX07Ti5oYXNDb250ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPU5nKHRoaXMsMSl9O04uZ2V0RmVhdHVyZUxpc3RzPWZ1bmN0aW9uKCl7cmV0dXJuIGVpKHRoaXMsS2osMil9O04uc2V0RmVhdHVyZUxpc3RzPWZ1bmN0aW9uKGEpe2hpKHRoaXMsMixhKX07Ti5jbGVhckZlYXR1cmVMaXN0cz1mdW5jdGlvbigpe3RoaXMuc2V0RmVhdHVyZUxpc3RzKHZvaWQgMCl9O04uaGFzRmVhdHVyZUxpc3RzPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPU5nKHRoaXMsMil9OwovLyMgc291cmNlVVJMPWJ1aWxkOi9iYXplbC1vdXQvaG9zdC9iaW4vZXh0ZXJuYWwvYWlfZ29vZ2xlX3BhaXJfZmFjZXRzL2ZhY2V0c19vdmVydmlldy9wcm90by9mZWF0dXJlX3N0YXRpc3RpY3NfcHJvdG8uanMKZnVuY3Rpb24gQmwoYSl7RmcodGhpcyxhLENsLG51bGwpfVRiKEJsLEJnKTtmdW5jdGlvbiBEbChhKXtGZyh0aGlzLGEsRWwsbnVsbCl9VGIoRGwsQmcpO2Z1bmN0aW9uIEZsKGEpe0ZnKHRoaXMsYSxHbCxudWxsKX1UYihGbCxCZyk7ZnVuY3Rpb24gSGwoYSl7RmcodGhpcyxhLElsLEpsKX1UYihIbCxCZyk7ZnVuY3Rpb24gS2woYSl7RmcodGhpcyxhLG51bGwsbnVsbCl9VGIoS2wsQmcpO2Z1bmN0aW9uIExsKGEpe0ZnKHRoaXMsYSxudWxsLE1sKX1UYihMbCxCZyk7ZnVuY3Rpb24gTmwoYSl7RmcodGhpcyxhLE9sLG51bGwpfVRiKE5sLEJnKTtmdW5jdGlvbiBQbChhKXtGZyh0aGlzLGEsUWwsbnVsbCl9VGIoUGwsQmcpO2Z1bmN0aW9uIFJsKGEpe0ZnKHRoaXMsYSxudWxsLG51bGwpfVRiKFJsLEJnKTtmdW5jdGlvbiBTbChhKXtGZyh0aGlzLGEsVGwsbnVsbCl9VGIoU2wsQmcpO2Z1bmN0aW9uIFVsKGEpe0ZnKHRoaXMsYSxWbCxudWxsKX1UYihVbCxCZyk7CmZ1bmN0aW9uIFdsKGEpe0ZnKHRoaXMsYSxudWxsLG51bGwpfVRiKFdsLEJnKTtmdW5jdGlvbiBYbChhKXtGZyh0aGlzLGEsbnVsbCxudWxsKX1UYihYbCxCZyk7ZnVuY3Rpb24gWWwoYSl7RmcodGhpcyxhLG51bGwsbnVsbCl9VGIoWWwsQmcpO2Z1bmN0aW9uIFpsKGEpe0ZnKHRoaXMsYSwkbCxudWxsKX1UYihabCxCZyk7ZnVuY3Rpb24gYW0oYSl7RmcodGhpcyxhLG51bGwsbnVsbCl9VGIoYW0sQmcpO2Z1bmN0aW9uIGJtKGEpe0ZnKHRoaXMsYSxjbSxudWxsKX1UYihibSxCZyk7ZnVuY3Rpb24gZG0oYSl7RmcodGhpcyxhLG51bGwsbnVsbCl9VGIoZG0sQmcpO3ZhciBDbD1bMV07Tj1CbC5wcm90b3R5cGU7Ti50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gZW0oYSx0aGlzKX07ZnVuY3Rpb24gZW0oYSxjKXt2YXIgZD17ZGF0YXNldHNMaXN0Ok1nKGMuZ2V0RGF0YXNldHNMaXN0KCksZm0sYSl9O2EmJihkLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBkfQpmdW5jdGlvbiBnbShhKXthPW5ldyB1ZihhKTt2YXIgYz1uZXcgQmw7cmV0dXJuIGhtKGMsYSl9ZnVuY3Rpb24gaG0oYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPW5ldyBGbDtjLnJlYWRNZXNzYWdlKGQsaW0pO2EuYWRkRGF0YXNldHMoZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfU4uc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IHdmO2ptKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9O2Z1bmN0aW9uIGptKGEsYyl7YT1hLmdldERhdGFzZXRzTGlzdCgpOzA8YS5sZW5ndGgmJmMud3JpdGVSZXBlYXRlZE1lc3NhZ2UoMSxhLGttKX1OLmdldERhdGFzZXRzTGlzdD1mdW5jdGlvbigpe3JldHVybiBmaSh0aGlzLEZsLDEpfTtOLnNldERhdGFzZXRzTGlzdD1mdW5jdGlvbigpe2ppKHRoaXMsMSxbXSl9OwpOLmFkZERhdGFzZXRzPWZ1bmN0aW9uKGEpe2tpKHRoaXMsMSxhLEZsLHZvaWQgMCl9O04uY2xlYXJEYXRhc2V0c0xpc3Q9ZnVuY3Rpb24oKXt0aGlzLnNldERhdGFzZXRzTGlzdCgpfTt2YXIgRWw9WzFdO049RGwucHJvdG90eXBlO04udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIGxtKGEsdGhpcyl9O2Z1bmN0aW9uIGxtKGEsYyl7dmFyIGQsZj17c3RlcExpc3Q6bnVsbD09KGQ9T2coYywxKSk/dm9pZCAwOmR9O2EmJihmLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBmfWZ1bmN0aW9uIG1tKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1jLnJlYWRTdHJpbmcoKTthLmFkZFN0ZXAoZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfU4uc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IHdmO25tKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9OwpmdW5jdGlvbiBubShhLGMpe2E9YS5nZXRTdGVwTGlzdCgpOzA8YS5sZW5ndGgmJmMud3JpdGVSZXBlYXRlZFN0cmluZyhhKX1OLmdldFN0ZXBMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIE9nKHRoaXMsMSl9O04uc2V0U3RlcExpc3Q9ZnVuY3Rpb24oKXtYaCh0aGlzLDEsW10pfTtOLmFkZFN0ZXA9ZnVuY3Rpb24oYSl7Y2kodGhpcyxhLHZvaWQgMCl9O04uY2xlYXJTdGVwTGlzdD1mdW5jdGlvbigpe3RoaXMuc2V0U3RlcExpc3QoKX07dmFyIEdsPVszXTtOPUZsLnByb3RvdHlwZTtOLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBmbShhLHRoaXMpfTtmdW5jdGlvbiBmbShhLGMpe3ZhciBkPXtuYW1lOldnKGMsMSwiIiksbnVtRXhhbXBsZXM6V2coYywyLDApLHdlaWdodGVkTnVtRXhhbXBsZXM6WGcoYyw0KSxmZWF0dXJlc0xpc3Q6TWcoYy5nZXRGZWF0dXJlc0xpc3QoKSxvbSxhKX07YSYmKGQuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGR9CmZ1bmN0aW9uIGltKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1jLnJlYWRTdHJpbmcoKTthLnNldE5hbWUoZCk7YnJlYWs7Y2FzZSAyOmQ9Yy5yZWFkVWludDY0KCk7YS5zZXROdW1FeGFtcGxlcyhkKTticmVhaztjYXNlIDQ6ZD1jLnJlYWREb3VibGUoKTthLnNldFdlaWdodGVkTnVtRXhhbXBsZXMoZCk7YnJlYWs7Y2FzZSAzOmQ9bmV3IEhsO2MucmVhZE1lc3NhZ2UoZCxwbSk7YS5hZGRGZWF0dXJlcyhkKTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9Ti5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgd2Y7a20odGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07CmZ1bmN0aW9uIGttKGEsYyl7dmFyIGQ9YS5nZXROYW1lKCk7MDxkLmxlbmd0aCYmYy53cml0ZVN0cmluZygxLGQpO2Q9YS5nZXROdW1FeGFtcGxlcygpOzAhPT1kJiZjLndyaXRlVWludDY0KDIsZCk7ZD1hLmdldFdlaWdodGVkTnVtRXhhbXBsZXMoKTswIT09ZCYmYy53cml0ZURvdWJsZSg0LGQpO2Q9YS5nZXRGZWF0dXJlc0xpc3QoKTswPGQubGVuZ3RoJiZjLndyaXRlUmVwZWF0ZWRNZXNzYWdlKDMsZCxxbSl9Ti5nZXROYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFdnKHRoaXMsMSwiIil9O04uc2V0TmFtZT1mdW5jdGlvbihhKXthaSh0aGlzLDEsYSl9O04uZ2V0TnVtRXhhbXBsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gV2codGhpcywyLDApfTtOLnNldE51bUV4YW1wbGVzPWZ1bmN0aW9uKGEpe1loKHRoaXMsMixhKX07Ti5nZXRXZWlnaHRlZE51bUV4YW1wbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIFhnKHRoaXMsNCl9OwpOLnNldFdlaWdodGVkTnVtRXhhbXBsZXM9ZnVuY3Rpb24oYSl7JGgodGhpcyw0LGEpfTtOLmdldEZlYXR1cmVzTGlzdD1mdW5jdGlvbigpe3JldHVybiBmaSh0aGlzLEhsLDMpfTtOLnNldEZlYXR1cmVzTGlzdD1mdW5jdGlvbigpe2ppKHRoaXMsMyxbXSl9O04uYWRkRmVhdHVyZXM9ZnVuY3Rpb24oYSl7a2kodGhpcywzLGEsSGwsdm9pZCAwKX07Ti5jbGVhckZlYXR1cmVzTGlzdD1mdW5jdGlvbigpe3RoaXMuc2V0RmVhdHVyZXNMaXN0KCl9O3ZhciBJbD1bNl0sSmw9W1sxLDhdLFszLDQsNSw3XV07Tj1IbC5wcm90b3R5cGU7Ti5nZXRGaWVsZElkQ2FzZT1mdW5jdGlvbigpe3JldHVybiBKZyh0aGlzLEpsWzBdKX07Ti5nZXRTdGF0c0Nhc2U9ZnVuY3Rpb24oKXtyZXR1cm4gSmcodGhpcyxKbFsxXSl9O04udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIG9tKGEsdGhpcyl9OwpmdW5jdGlvbiBvbShhLGMpe3ZhciBkLGY9e25hbWU6V2coYywxLCIiKSxwYXRoOihkPWMuZ2V0UGF0aCgpKSYmbG0oYSxkKSx0eXBlOldnKGMsMiwwKSxudW1TdGF0czooZD1jLmdldE51bVN0YXRzKCkpJiZybShhLGQpLHN0cmluZ1N0YXRzOihkPWMuZ2V0U3RyaW5nU3RhdHMoKSkmJnNtKGEsZCksYnl0ZXNTdGF0czooZD1jLmdldEJ5dGVzU3RhdHMoKSkmJnRtKGEsZCksc3RydWN0U3RhdHM6KGQ9Yy5nZXRTdHJ1Y3RTdGF0cygpKSYmdW0oYSxkKSxjdXN0b21TdGF0c0xpc3Q6TWcoYy5nZXRDdXN0b21TdGF0c0xpc3QoKSx2bSxhKX07YSYmKGYuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGZ9CmZ1bmN0aW9uIHBtKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1jLnJlYWRTdHJpbmcoKTthLnNldE5hbWUoZCk7YnJlYWs7Y2FzZSA4OmQ9bmV3IERsO2MucmVhZE1lc3NhZ2UoZCxtbSk7YS5zZXRQYXRoKGQpO2JyZWFrO2Nhc2UgMjpkPWMucmVhZEVudW0oKTthLnNldFR5cGUoZCk7YnJlYWs7Y2FzZSAzOmQ9bmV3IE5sO2MucmVhZE1lc3NhZ2UoZCx3bSk7YS5zZXROdW1TdGF0cyhkKTticmVhaztjYXNlIDQ6ZD1uZXcgUGw7Yy5yZWFkTWVzc2FnZShkLHhtKTthLnNldFN0cmluZ1N0YXRzKGQpO2JyZWFrO2Nhc2UgNTpkPW5ldyBXbDtjLnJlYWRNZXNzYWdlKGQseW0pO2Euc2V0Qnl0ZXNTdGF0cyhkKTticmVhaztjYXNlIDc6ZD1uZXcgWGw7Yy5yZWFkTWVzc2FnZShkLHptKTthLnNldFN0cnVjdFN0YXRzKGQpO2JyZWFrO2Nhc2UgNjpkPW5ldyBMbDtjLnJlYWRNZXNzYWdlKGQsQW0pOwphLmFkZEN1c3RvbVN0YXRzKGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1OLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyB3ZjtxbSh0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTsKZnVuY3Rpb24gcW0oYSxjKXt2YXIgZD1OZyhhLDEpO251bGwhPWQmJmMud3JpdGVTdHJpbmcoMSxkKTtkPWEuZ2V0UGF0aCgpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDgsZCxubSk7ZD1hLmdldFR5cGUoKTswIT09ZCYmYy53cml0ZUVudW0oMixkKTtkPWEuZ2V0TnVtU3RhdHMoKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSgzLGQsQm0pO2Q9YS5nZXRTdHJpbmdTdGF0cygpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDQsZCxDbSk7ZD1hLmdldEJ5dGVzU3RhdHMoKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSg1LGQsRG0pO2Q9YS5nZXRTdHJ1Y3RTdGF0cygpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDcsZCxFbSk7ZD1hLmdldEN1c3RvbVN0YXRzTGlzdCgpOzA8ZC5sZW5ndGgmJmMud3JpdGVSZXBlYXRlZE1lc3NhZ2UoNixkLEZtKX1OLmdldE5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4gV2codGhpcywxLCIiKX07Ti5zZXROYW1lPWZ1bmN0aW9uKGEpe2RpKHRoaXMsMSxKbFswXSxhKX07Ck4uY2xlYXJOYW1lPWZ1bmN0aW9uKCl7ZGkodGhpcywxLEpsWzBdLHZvaWQgMCl9O04uaGFzTmFtZT1mdW5jdGlvbigpe3JldHVybiBudWxsIT1OZyh0aGlzLDEpfTtOLmdldFBhdGg9ZnVuY3Rpb24oKXtyZXR1cm4gZWkodGhpcyxEbCw4KX07Ti5zZXRQYXRoPWZ1bmN0aW9uKGEpe2lpKHRoaXMsOCxKbFswXSxhKX07Ti5jbGVhclBhdGg9ZnVuY3Rpb24oKXt0aGlzLnNldFBhdGgodm9pZCAwKX07Ti5oYXNQYXRoPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPU5nKHRoaXMsOCl9O04uZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiBXZyh0aGlzLDIsMCl9O04uc2V0VHlwZT1mdW5jdGlvbihhKXtiaSh0aGlzLDIsYSl9O04uZ2V0TnVtU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gZWkodGhpcyxObCwzKX07Ti5zZXROdW1TdGF0cz1mdW5jdGlvbihhKXtpaSh0aGlzLDMsSmxbMV0sYSl9O04uY2xlYXJOdW1TdGF0cz1mdW5jdGlvbigpe3RoaXMuc2V0TnVtU3RhdHModm9pZCAwKX07Ck4uaGFzTnVtU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9TmcodGhpcywzKX07Ti5nZXRTdHJpbmdTdGF0cz1mdW5jdGlvbigpe3JldHVybiBlaSh0aGlzLFBsLDQpfTtOLnNldFN0cmluZ1N0YXRzPWZ1bmN0aW9uKGEpe2lpKHRoaXMsNCxKbFsxXSxhKX07Ti5jbGVhclN0cmluZ1N0YXRzPWZ1bmN0aW9uKCl7dGhpcy5zZXRTdHJpbmdTdGF0cyh2b2lkIDApfTtOLmhhc1N0cmluZ1N0YXRzPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPU5nKHRoaXMsNCl9O04uZ2V0Qnl0ZXNTdGF0cz1mdW5jdGlvbigpe3JldHVybiBlaSh0aGlzLFdsLDUpfTtOLnNldEJ5dGVzU3RhdHM9ZnVuY3Rpb24oYSl7aWkodGhpcyw1LEpsWzFdLGEpfTtOLmNsZWFyQnl0ZXNTdGF0cz1mdW5jdGlvbigpe3RoaXMuc2V0Qnl0ZXNTdGF0cyh2b2lkIDApfTtOLmhhc0J5dGVzU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9TmcodGhpcyw1KX07Ck4uZ2V0U3RydWN0U3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gZWkodGhpcyxYbCw3KX07Ti5zZXRTdHJ1Y3RTdGF0cz1mdW5jdGlvbihhKXtpaSh0aGlzLDcsSmxbMV0sYSl9O04uY2xlYXJTdHJ1Y3RTdGF0cz1mdW5jdGlvbigpe3RoaXMuc2V0U3RydWN0U3RhdHModm9pZCAwKX07Ti5oYXNTdHJ1Y3RTdGF0cz1mdW5jdGlvbigpe3JldHVybiBudWxsIT1OZyh0aGlzLDcpfTtOLmdldEN1c3RvbVN0YXRzTGlzdD1mdW5jdGlvbigpe3JldHVybiBmaSh0aGlzLExsLDYpfTtOLnNldEN1c3RvbVN0YXRzTGlzdD1mdW5jdGlvbigpe2ppKHRoaXMsNixbXSl9O04uYWRkQ3VzdG9tU3RhdHM9ZnVuY3Rpb24oYSl7a2kodGhpcyw2LGEsTGwsdm9pZCAwKX07Ti5jbGVhckN1c3RvbVN0YXRzTGlzdD1mdW5jdGlvbigpe3RoaXMuc2V0Q3VzdG9tU3RhdHNMaXN0KCl9O049S2wucHJvdG90eXBlO04udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIEdtKGEsdGhpcyl9OwpmdW5jdGlvbiBHbShhLGMpe3ZhciBkPXtudW1Ob25NaXNzaW5nOlhnKGMsMSksbnVtTWlzc2luZzpYZyhjLDIpLGF2Z051bVZhbHVlczpYZyhjLDMpLHRvdE51bVZhbHVlczpYZyhjLDQpfTthJiYoZC4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZH1mdW5jdGlvbiBIbShhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9Yy5yZWFkRG91YmxlKCk7YS5zZXROdW1Ob25NaXNzaW5nKGQpO2JyZWFrO2Nhc2UgMjpkPWMucmVhZERvdWJsZSgpO2Euc2V0TnVtTWlzc2luZyhkKTticmVhaztjYXNlIDM6ZD1jLnJlYWREb3VibGUoKTthLnNldEF2Z051bVZhbHVlcyhkKTticmVhaztjYXNlIDQ6ZD1jLnJlYWREb3VibGUoKTthLnNldFRvdE51bVZhbHVlcyhkKTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9Ck4uc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IHdmO0ltKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9O2Z1bmN0aW9uIEltKGEsYyl7dmFyIGQ9YS5nZXROdW1Ob25NaXNzaW5nKCk7MCE9PWQmJmMud3JpdGVEb3VibGUoMSxkKTtkPWEuZ2V0TnVtTWlzc2luZygpOzAhPT1kJiZjLndyaXRlRG91YmxlKDIsZCk7ZD1hLmdldEF2Z051bVZhbHVlcygpOzAhPT1kJiZjLndyaXRlRG91YmxlKDMsZCk7ZD1hLmdldFRvdE51bVZhbHVlcygpOzAhPT1kJiZjLndyaXRlRG91YmxlKDQsZCl9Ti5nZXROdW1Ob25NaXNzaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIFhnKHRoaXMsMSl9O04uc2V0TnVtTm9uTWlzc2luZz1mdW5jdGlvbihhKXskaCh0aGlzLDEsYSl9O04uZ2V0TnVtTWlzc2luZz1mdW5jdGlvbigpe3JldHVybiBYZyh0aGlzLDIpfTtOLnNldE51bU1pc3Npbmc9ZnVuY3Rpb24oYSl7JGgodGhpcywyLGEpfTsKTi5nZXRBdmdOdW1WYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gWGcodGhpcywzKX07Ti5zZXRBdmdOdW1WYWx1ZXM9ZnVuY3Rpb24oYSl7JGgodGhpcywzLGEpfTtOLmdldFRvdE51bVZhbHVlcz1mdW5jdGlvbigpe3JldHVybiBYZyh0aGlzLDQpfTtOLnNldFRvdE51bVZhbHVlcz1mdW5jdGlvbihhKXskaCh0aGlzLDQsYSl9O3ZhciBNbD1bWzIsMyw0LDVdXTtOPUxsLnByb3RvdHlwZTtOLmdldFZhbENhc2U9ZnVuY3Rpb24oKXtyZXR1cm4gSmcodGhpcyxNbFswXSl9O04udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIHZtKGEsdGhpcyl9OwpmdW5jdGlvbiB2bShhLGMpe3ZhciBkLGY9e25hbWU6V2coYywxLCIiKSxudW06WGcoYywyKSxzdHI6V2coYywzLCIiKSxoaXN0b2dyYW06KGQ9Yy5nZXRIaXN0b2dyYW0oKSkmJkptKGEsZCkscmFua0hpc3RvZ3JhbTooZD1jLmdldFJhbmtIaXN0b2dyYW0oKSkmJkttKGEsZCl9O2EmJihmLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBmfQpmdW5jdGlvbiBBbShhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9Yy5yZWFkU3RyaW5nKCk7YS5zZXROYW1lKGQpO2JyZWFrO2Nhc2UgMjpkPWMucmVhZERvdWJsZSgpO2Euc2V0TnVtKGQpO2JyZWFrO2Nhc2UgMzpkPWMucmVhZFN0cmluZygpO2Euc2V0U3RyKGQpO2JyZWFrO2Nhc2UgNDpkPW5ldyBabDtjLnJlYWRNZXNzYWdlKGQsTG0pO2Euc2V0SGlzdG9ncmFtKGQpO2JyZWFrO2Nhc2UgNTpkPW5ldyBibTtjLnJlYWRNZXNzYWdlKGQsTW0pO2Euc2V0UmFua0hpc3RvZ3JhbShkKTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9Ti5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgd2Y7Rm0odGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07CmZ1bmN0aW9uIEZtKGEsYyl7dmFyIGQ9YS5nZXROYW1lKCk7MDxkLmxlbmd0aCYmYy53cml0ZVN0cmluZygxLGQpO2Q9TmcoYSwyKTtudWxsIT1kJiZjLndyaXRlRG91YmxlKDIsZCk7ZD1OZyhhLDMpO251bGwhPWQmJmMud3JpdGVTdHJpbmcoMyxkKTtkPWEuZ2V0SGlzdG9ncmFtKCk7bnVsbCE9ZCYmYy53cml0ZU1lc3NhZ2UoNCxkLE5tKTtkPWEuZ2V0UmFua0hpc3RvZ3JhbSgpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDUsZCxPbSl9Ti5nZXROYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFdnKHRoaXMsMSwiIil9O04uc2V0TmFtZT1mdW5jdGlvbihhKXthaSh0aGlzLDEsYSl9O04uZ2V0TnVtPWZ1bmN0aW9uKCl7cmV0dXJuIFhnKHRoaXMsMil9O04uc2V0TnVtPWZ1bmN0aW9uKGEpe2RpKHRoaXMsMixNbFswXSxhKX07Ti5jbGVhck51bT1mdW5jdGlvbigpe2RpKHRoaXMsMixNbFswXSx2b2lkIDApfTtOLmhhc051bT1mdW5jdGlvbigpe3JldHVybiBudWxsIT1OZyh0aGlzLDIpfTsKTi5nZXRTdHI9ZnVuY3Rpb24oKXtyZXR1cm4gV2codGhpcywzLCIiKX07Ti5zZXRTdHI9ZnVuY3Rpb24oYSl7ZGkodGhpcywzLE1sWzBdLGEpfTtOLmNsZWFyU3RyPWZ1bmN0aW9uKCl7ZGkodGhpcywzLE1sWzBdLHZvaWQgMCl9O04uaGFzU3RyPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPU5nKHRoaXMsMyl9O04uZ2V0SGlzdG9ncmFtPWZ1bmN0aW9uKCl7cmV0dXJuIGVpKHRoaXMsWmwsNCl9O04uc2V0SGlzdG9ncmFtPWZ1bmN0aW9uKGEpe2lpKHRoaXMsNCxNbFswXSxhKX07Ti5jbGVhckhpc3RvZ3JhbT1mdW5jdGlvbigpe3RoaXMuc2V0SGlzdG9ncmFtKHZvaWQgMCl9O04uaGFzSGlzdG9ncmFtPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPU5nKHRoaXMsNCl9O04uZ2V0UmFua0hpc3RvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBlaSh0aGlzLGJtLDUpfTtOLnNldFJhbmtIaXN0b2dyYW09ZnVuY3Rpb24oYSl7aWkodGhpcyw1LE1sWzBdLGEpfTtOLmNsZWFyUmFua0hpc3RvZ3JhbT1mdW5jdGlvbigpe3RoaXMuc2V0UmFua0hpc3RvZ3JhbSh2b2lkIDApfTsKTi5oYXNSYW5rSGlzdG9ncmFtPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPU5nKHRoaXMsNSl9O3ZhciBPbD1bOF07Tj1ObC5wcm90b3R5cGU7Ti50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gcm0oYSx0aGlzKX07ZnVuY3Rpb24gcm0oYSxjKXt2YXIgZCxmPXtjb21tb25TdGF0czooZD1jLmdldENvbW1vblN0YXRzKCkpJiZQbShhLGQpLG1lYW46WGcoYywyKSxzdGREZXY6WGcoYywzKSxudW1aZXJvczpXZyhjLDQsMCksbWluOlhnKGMsNSksbWVkaWFuOlhnKGMsNiksbWF4OlhnKGMsNyksaGlzdG9ncmFtc0xpc3Q6TWcoYy5nZXRIaXN0b2dyYW1zTGlzdCgpLEptLGEpLHdlaWdodGVkTnVtZXJpY1N0YXRzOihkPWMuZ2V0V2VpZ2h0ZWROdW1lcmljU3RhdHMoKSkmJlFtKGEsZCl9O2EmJihmLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBmfQpmdW5jdGlvbiB3bShhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9bmV3IFlsO2MucmVhZE1lc3NhZ2UoZCxSbSk7YS5zZXRDb21tb25TdGF0cyhkKTticmVhaztjYXNlIDI6ZD1jLnJlYWREb3VibGUoKTthLnNldE1lYW4oZCk7YnJlYWs7Y2FzZSAzOmQ9Yy5yZWFkRG91YmxlKCk7YS5zZXRTdGREZXYoZCk7YnJlYWs7Y2FzZSA0OmQ9Yy5yZWFkVWludDY0KCk7YS5zZXROdW1aZXJvcyhkKTticmVhaztjYXNlIDU6ZD1jLnJlYWREb3VibGUoKTthLnNldE1pbihkKTticmVhaztjYXNlIDY6ZD1jLnJlYWREb3VibGUoKTthLnNldE1lZGlhbihkKTticmVhaztjYXNlIDc6ZD1jLnJlYWREb3VibGUoKTthLnNldE1heChkKTticmVhaztjYXNlIDg6ZD1uZXcgWmw7Yy5yZWFkTWVzc2FnZShkLExtKTthLmFkZEhpc3RvZ3JhbXMoZCk7YnJlYWs7Y2FzZSA5OmQ9bmV3IFNsO2MucmVhZE1lc3NhZ2UoZCwKU20pO2Euc2V0V2VpZ2h0ZWROdW1lcmljU3RhdHMoZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfU4uc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IHdmO0JtKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9OwpmdW5jdGlvbiBCbShhLGMpe3ZhciBkPWEuZ2V0Q29tbW9uU3RhdHMoKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSgxLGQsVG0pO2Q9YS5nZXRNZWFuKCk7MCE9PWQmJmMud3JpdGVEb3VibGUoMixkKTtkPWEuZ2V0U3RkRGV2KCk7MCE9PWQmJmMud3JpdGVEb3VibGUoMyxkKTtkPWEuZ2V0TnVtWmVyb3MoKTswIT09ZCYmYy53cml0ZVVpbnQ2NCg0LGQpO2Q9YS5nZXRNaW4oKTswIT09ZCYmYy53cml0ZURvdWJsZSg1LGQpO2Q9YS5nZXRNZWRpYW4oKTswIT09ZCYmYy53cml0ZURvdWJsZSg2LGQpO2Q9YS5nZXRNYXgoKTswIT09ZCYmYy53cml0ZURvdWJsZSg3LGQpO2Q9YS5nZXRIaXN0b2dyYW1zTGlzdCgpOzA8ZC5sZW5ndGgmJmMud3JpdGVSZXBlYXRlZE1lc3NhZ2UoOCxkLE5tKTtkPWEuZ2V0V2VpZ2h0ZWROdW1lcmljU3RhdHMoKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSg5LGQsVW0pfU4uZ2V0Q29tbW9uU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gZWkodGhpcyxZbCwxKX07Ck4uc2V0Q29tbW9uU3RhdHM9ZnVuY3Rpb24oYSl7aGkodGhpcywxLGEpfTtOLmNsZWFyQ29tbW9uU3RhdHM9ZnVuY3Rpb24oKXt0aGlzLnNldENvbW1vblN0YXRzKHZvaWQgMCl9O04uaGFzQ29tbW9uU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9TmcodGhpcywxKX07Ti5nZXRNZWFuPWZ1bmN0aW9uKCl7cmV0dXJuIFhnKHRoaXMsMil9O04uc2V0TWVhbj1mdW5jdGlvbihhKXskaCh0aGlzLDIsYSl9O04uZ2V0U3RkRGV2PWZ1bmN0aW9uKCl7cmV0dXJuIFhnKHRoaXMsMyl9O04uc2V0U3RkRGV2PWZ1bmN0aW9uKGEpeyRoKHRoaXMsMyxhKX07Ti5nZXROdW1aZXJvcz1mdW5jdGlvbigpe3JldHVybiBXZyh0aGlzLDQsMCl9O04uc2V0TnVtWmVyb3M9ZnVuY3Rpb24oYSl7WWgodGhpcyw0LGEpfTtOLmdldE1pbj1mdW5jdGlvbigpe3JldHVybiBYZyh0aGlzLDUpfTtOLnNldE1pbj1mdW5jdGlvbihhKXskaCh0aGlzLDUsYSl9OwpOLmdldE1lZGlhbj1mdW5jdGlvbigpe3JldHVybiBYZyh0aGlzLDYpfTtOLnNldE1lZGlhbj1mdW5jdGlvbihhKXskaCh0aGlzLDYsYSl9O04uZ2V0TWF4PWZ1bmN0aW9uKCl7cmV0dXJuIFhnKHRoaXMsNyl9O04uc2V0TWF4PWZ1bmN0aW9uKGEpeyRoKHRoaXMsNyxhKX07Ti5nZXRIaXN0b2dyYW1zTGlzdD1mdW5jdGlvbigpe3JldHVybiBmaSh0aGlzLFpsLDgpfTtOLnNldEhpc3RvZ3JhbXNMaXN0PWZ1bmN0aW9uKGEpe2ppKHRoaXMsOCxhKX07Ti5hZGRIaXN0b2dyYW1zPWZ1bmN0aW9uKGEpe3JldHVybiBraSh0aGlzLDgsYSxabCx2b2lkIDApfTtOLmNsZWFySGlzdG9ncmFtc0xpc3Q9ZnVuY3Rpb24oKXt0aGlzLnNldEhpc3RvZ3JhbXNMaXN0KFtdKX07Ti5nZXRXZWlnaHRlZE51bWVyaWNTdGF0cz1mdW5jdGlvbigpe3JldHVybiBlaSh0aGlzLFNsLDkpfTtOLnNldFdlaWdodGVkTnVtZXJpY1N0YXRzPWZ1bmN0aW9uKGEpe2hpKHRoaXMsOSxhKX07Ck4uY2xlYXJXZWlnaHRlZE51bWVyaWNTdGF0cz1mdW5jdGlvbigpe3RoaXMuc2V0V2VpZ2h0ZWROdW1lcmljU3RhdHModm9pZCAwKX07Ti5oYXNXZWlnaHRlZE51bWVyaWNTdGF0cz1mdW5jdGlvbigpe3JldHVybiBudWxsIT1OZyh0aGlzLDkpfTt2YXIgUWw9WzNdO1BsLnByb3RvdHlwZS50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gc20oYSx0aGlzKX07ZnVuY3Rpb24gc20oYSxjKXt2YXIgZCxmPXtjb21tb25TdGF0czooZD1jLmdldENvbW1vblN0YXRzKCkpJiZQbShhLGQpLHVuaXF1ZTpXZyhjLDIsMCksdG9wVmFsdWVzTGlzdDpNZyhjLmdldFRvcFZhbHVlc0xpc3QoKSxWbSxhKSxhdmdMZW5ndGg6WGcoYyw0KSxyYW5rSGlzdG9ncmFtOihkPWMuZ2V0UmFua0hpc3RvZ3JhbSgpKSYmS20oYSxkKSx3ZWlnaHRlZFN0cmluZ1N0YXRzOihkPWMuZ2V0V2VpZ2h0ZWRTdHJpbmdTdGF0cygpKSYmV20oYSxkKX07YSYmKGYuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGZ9CmZ1bmN0aW9uIHhtKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1uZXcgWWw7Yy5yZWFkTWVzc2FnZShkLFJtKTthLnNldENvbW1vblN0YXRzKGQpO2JyZWFrO2Nhc2UgMjpkPWMucmVhZFVpbnQ2NCgpO2Euc2V0VW5pcXVlKGQpO2JyZWFrO2Nhc2UgMzpkPW5ldyBSbDtjLnJlYWRNZXNzYWdlKGQsWG0pO2EuYWRkVG9wVmFsdWVzKGQpO2JyZWFrO2Nhc2UgNDpkPWMucmVhZEZsb2F0KCk7YS5zZXRBdmdMZW5ndGgoZCk7YnJlYWs7Y2FzZSA1OmQ9bmV3IGJtO2MucmVhZE1lc3NhZ2UoZCxNbSk7YS5zZXRSYW5rSGlzdG9ncmFtKGQpO2JyZWFrO2Nhc2UgNjpkPW5ldyBVbDtjLnJlYWRNZXNzYWdlKGQsWW0pO2Euc2V0V2VpZ2h0ZWRTdHJpbmdTdGF0cyhkKTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9ClBsLnByb3RvdHlwZS5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgd2Y7Q20odGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07ZnVuY3Rpb24gQ20oYSxjKXt2YXIgZD1hLmdldENvbW1vblN0YXRzKCk7bnVsbCE9ZCYmYy53cml0ZU1lc3NhZ2UoMSxkLFRtKTtkPWEuZ2V0VW5pcXVlKCk7MCE9PWQmJmMud3JpdGVVaW50NjQoMixkKTtkPWEuZ2V0VG9wVmFsdWVzTGlzdCgpOzA8ZC5sZW5ndGgmJmMud3JpdGVSZXBlYXRlZE1lc3NhZ2UoMyxkLFptKTtkPWEuZ2V0QXZnTGVuZ3RoKCk7MCE9PWQmJmMud3JpdGVGbG9hdCg0LGQpO2Q9YS5nZXRSYW5rSGlzdG9ncmFtKCk7bnVsbCE9ZCYmYy53cml0ZU1lc3NhZ2UoNSxkLE9tKTtkPWEuZ2V0V2VpZ2h0ZWRTdHJpbmdTdGF0cygpO251bGwhPWQmJmMud3JpdGVNZXNzYWdlKDYsZCwkbSl9Tj1SbC5wcm90b3R5cGU7Ti50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gVm0oYSx0aGlzKX07CmZ1bmN0aW9uIFZtKGEsYyl7dmFyIGQ9e2RlcHJlY2F0ZWRGcmVxOldnKGMsMSwwKSx2YWx1ZTpXZyhjLDIsIiIpLGZyZXF1ZW5jeTpYZyhjLDMpfTthJiYoZC4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZH1mdW5jdGlvbiBYbShhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9Yy5yZWFkVWludDY0KCk7YS5zZXREZXByZWNhdGVkRnJlcShkKTticmVhaztjYXNlIDI6ZD1jLnJlYWRTdHJpbmcoKTthLnNldFZhbHVlKGQpO2JyZWFrO2Nhc2UgMzpkPWMucmVhZERvdWJsZSgpO2Euc2V0RnJlcXVlbmN5KGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1OLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyB3ZjtabSh0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTsKZnVuY3Rpb24gWm0oYSxjKXt2YXIgZD1hLmdldERlcHJlY2F0ZWRGcmVxKCk7MCE9PWQmJmMud3JpdGVVaW50NjQoMSxkKTtkPWEuZ2V0VmFsdWUoKTswPGQubGVuZ3RoJiZjLndyaXRlU3RyaW5nKDIsZCk7ZD1hLmdldEZyZXF1ZW5jeSgpOzAhPT1kJiZjLndyaXRlRG91YmxlKDMsZCl9Ti5nZXREZXByZWNhdGVkRnJlcT1mdW5jdGlvbigpe3JldHVybiBXZyh0aGlzLDEsMCl9O04uc2V0RGVwcmVjYXRlZEZyZXE9ZnVuY3Rpb24oYSl7WWgodGhpcywxLGEpfTtOLmdldFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIFdnKHRoaXMsMiwiIil9O04uc2V0VmFsdWU9ZnVuY3Rpb24oYSl7YWkodGhpcywyLGEpfTtOLmdldEZyZXF1ZW5jeT1mdW5jdGlvbigpe3JldHVybiBYZyh0aGlzLDMpfTtOLnNldEZyZXF1ZW5jeT1mdW5jdGlvbihhKXskaCh0aGlzLDMsYSl9O049UGwucHJvdG90eXBlO04uZ2V0Q29tbW9uU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gZWkodGhpcyxZbCwxKX07Ck4uc2V0Q29tbW9uU3RhdHM9ZnVuY3Rpb24oYSl7aGkodGhpcywxLGEpfTtOLmNsZWFyQ29tbW9uU3RhdHM9ZnVuY3Rpb24oKXt0aGlzLnNldENvbW1vblN0YXRzKHZvaWQgMCl9O04uaGFzQ29tbW9uU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9TmcodGhpcywxKX07Ti5nZXRVbmlxdWU9ZnVuY3Rpb24oKXtyZXR1cm4gV2codGhpcywyLDApfTtOLnNldFVuaXF1ZT1mdW5jdGlvbihhKXtZaCh0aGlzLDIsYSl9O04uZ2V0VG9wVmFsdWVzTGlzdD1mdW5jdGlvbigpe3JldHVybiBmaSh0aGlzLFJsLDMpfTtOLnNldFRvcFZhbHVlc0xpc3Q9ZnVuY3Rpb24oYSl7amkodGhpcywzLGEpfTtOLmFkZFRvcFZhbHVlcz1mdW5jdGlvbihhKXtyZXR1cm4ga2kodGhpcywzLGEsUmwsdm9pZCAwKX07Ti5jbGVhclRvcFZhbHVlc0xpc3Q9ZnVuY3Rpb24oKXt0aGlzLnNldFRvcFZhbHVlc0xpc3QoW10pfTtOLmdldEF2Z0xlbmd0aD1mdW5jdGlvbigpe3JldHVybiBYZyh0aGlzLDQpfTsKTi5zZXRBdmdMZW5ndGg9ZnVuY3Rpb24oYSl7JGgodGhpcyw0LGEpfTtOLmdldFJhbmtIaXN0b2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gZWkodGhpcyxibSw1KX07Ti5zZXRSYW5rSGlzdG9ncmFtPWZ1bmN0aW9uKGEpe2hpKHRoaXMsNSxhKX07Ti5jbGVhclJhbmtIaXN0b2dyYW09ZnVuY3Rpb24oKXt0aGlzLnNldFJhbmtIaXN0b2dyYW0odm9pZCAwKX07Ti5oYXNSYW5rSGlzdG9ncmFtPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPU5nKHRoaXMsNSl9O04uZ2V0V2VpZ2h0ZWRTdHJpbmdTdGF0cz1mdW5jdGlvbigpe3JldHVybiBlaSh0aGlzLFVsLDYpfTtOLnNldFdlaWdodGVkU3RyaW5nU3RhdHM9ZnVuY3Rpb24oYSl7aGkodGhpcyw2LGEpfTtOLmNsZWFyV2VpZ2h0ZWRTdHJpbmdTdGF0cz1mdW5jdGlvbigpe3RoaXMuc2V0V2VpZ2h0ZWRTdHJpbmdTdGF0cyh2b2lkIDApfTtOLmhhc1dlaWdodGVkU3RyaW5nU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9TmcodGhpcyw2KX07CnZhciBUbD1bNF07Tj1TbC5wcm90b3R5cGU7Ti50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gUW0oYSx0aGlzKX07ZnVuY3Rpb24gUW0oYSxjKXt2YXIgZD17bWVhbjpYZyhjLDEpLHN0ZERldjpYZyhjLDIpLG1lZGlhbjpYZyhjLDMpLGhpc3RvZ3JhbXNMaXN0Ok1nKGMuZ2V0SGlzdG9ncmFtc0xpc3QoKSxKbSxhKX07YSYmKGQuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGR9CmZ1bmN0aW9uIFNtKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1jLnJlYWREb3VibGUoKTthLnNldE1lYW4oZCk7YnJlYWs7Y2FzZSAyOmQ9Yy5yZWFkRG91YmxlKCk7YS5zZXRTdGREZXYoZCk7YnJlYWs7Y2FzZSAzOmQ9Yy5yZWFkRG91YmxlKCk7YS5zZXRNZWRpYW4oZCk7YnJlYWs7Y2FzZSA0OmQ9bmV3IFpsO2MucmVhZE1lc3NhZ2UoZCxMbSk7YS5hZGRIaXN0b2dyYW1zKGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1OLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyB3ZjtVbSh0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTsKZnVuY3Rpb24gVW0oYSxjKXt2YXIgZD1hLmdldE1lYW4oKTswIT09ZCYmYy53cml0ZURvdWJsZSgxLGQpO2Q9YS5nZXRTdGREZXYoKTswIT09ZCYmYy53cml0ZURvdWJsZSgyLGQpO2Q9YS5nZXRNZWRpYW4oKTswIT09ZCYmYy53cml0ZURvdWJsZSgzLGQpO2Q9YS5nZXRIaXN0b2dyYW1zTGlzdCgpOzA8ZC5sZW5ndGgmJmMud3JpdGVSZXBlYXRlZE1lc3NhZ2UoNCxkLE5tKX1OLmdldE1lYW49ZnVuY3Rpb24oKXtyZXR1cm4gWGcodGhpcywxKX07Ti5zZXRNZWFuPWZ1bmN0aW9uKGEpeyRoKHRoaXMsMSxhKX07Ti5nZXRTdGREZXY9ZnVuY3Rpb24oKXtyZXR1cm4gWGcodGhpcywyKX07Ti5zZXRTdGREZXY9ZnVuY3Rpb24oYSl7JGgodGhpcywyLGEpfTtOLmdldE1lZGlhbj1mdW5jdGlvbigpe3JldHVybiBYZyh0aGlzLDMpfTtOLnNldE1lZGlhbj1mdW5jdGlvbihhKXskaCh0aGlzLDMsYSl9O04uZ2V0SGlzdG9ncmFtc0xpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gZmkodGhpcyxabCw0KX07Ck4uc2V0SGlzdG9ncmFtc0xpc3Q9ZnVuY3Rpb24oYSl7amkodGhpcyw0LGEpfTtOLmFkZEhpc3RvZ3JhbXM9ZnVuY3Rpb24oYSl7cmV0dXJuIGtpKHRoaXMsNCxhLFpsLHZvaWQgMCl9O04uY2xlYXJIaXN0b2dyYW1zTGlzdD1mdW5jdGlvbigpe3RoaXMuc2V0SGlzdG9ncmFtc0xpc3QoW10pfTt2YXIgVmw9WzFdO049VWwucHJvdG90eXBlO04udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIFdtKGEsdGhpcyl9O2Z1bmN0aW9uIFdtKGEsYyl7dmFyIGQsZj17dG9wVmFsdWVzTGlzdDpNZyhjLmdldFRvcFZhbHVlc0xpc3QoKSxWbSxhKSxyYW5rSGlzdG9ncmFtOihkPWMuZ2V0UmFua0hpc3RvZ3JhbSgpKSYmS20oYSxkKX07YSYmKGYuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGZ9CmZ1bmN0aW9uIFltKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1uZXcgUmw7Yy5yZWFkTWVzc2FnZShkLFhtKTthLmFkZFRvcFZhbHVlcyhkKTticmVhaztjYXNlIDI6ZD1uZXcgYm07Yy5yZWFkTWVzc2FnZShkLE1tKTthLnNldFJhbmtIaXN0b2dyYW0oZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfU4uc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IHdmOyRtKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9O2Z1bmN0aW9uICRtKGEsYyl7dmFyIGQ9YS5nZXRUb3BWYWx1ZXNMaXN0KCk7MDxkLmxlbmd0aCYmYy53cml0ZVJlcGVhdGVkTWVzc2FnZSgxLGQsWm0pO2Q9YS5nZXRSYW5rSGlzdG9ncmFtKCk7bnVsbCE9ZCYmYy53cml0ZU1lc3NhZ2UoMixkLE9tKX0KTi5nZXRUb3BWYWx1ZXNMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIGZpKHRoaXMsUmwsMSl9O04uc2V0VG9wVmFsdWVzTGlzdD1mdW5jdGlvbihhKXtqaSh0aGlzLDEsYSl9O04uYWRkVG9wVmFsdWVzPWZ1bmN0aW9uKGEpe3JldHVybiBraSh0aGlzLDEsYSxSbCx2b2lkIDApfTtOLmNsZWFyVG9wVmFsdWVzTGlzdD1mdW5jdGlvbigpe3RoaXMuc2V0VG9wVmFsdWVzTGlzdChbXSl9O04uZ2V0UmFua0hpc3RvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBlaSh0aGlzLGJtLDIpfTtOLnNldFJhbmtIaXN0b2dyYW09ZnVuY3Rpb24oYSl7aGkodGhpcywyLGEpfTtOLmNsZWFyUmFua0hpc3RvZ3JhbT1mdW5jdGlvbigpe3RoaXMuc2V0UmFua0hpc3RvZ3JhbSh2b2lkIDApfTtOLmhhc1JhbmtIaXN0b2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9TmcodGhpcywyKX07Tj1XbC5wcm90b3R5cGU7Ti50b09iamVjdD1mdW5jdGlvbihhKXtyZXR1cm4gdG0oYSx0aGlzKX07CmZ1bmN0aW9uIHRtKGEsYyl7dmFyIGQsZj17Y29tbW9uU3RhdHM6KGQ9Yy5nZXRDb21tb25TdGF0cygpKSYmUG0oYSxkKSx1bmlxdWU6V2coYywyLDApLGF2Z051bUJ5dGVzOlhnKGMsMyksbWluTnVtQnl0ZXM6WGcoYyw0KSxtYXhOdW1CeXRlczpYZyhjLDUpfTthJiYoZi4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZn0KZnVuY3Rpb24geW0oYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPW5ldyBZbDtjLnJlYWRNZXNzYWdlKGQsUm0pO2Euc2V0Q29tbW9uU3RhdHMoZCk7YnJlYWs7Y2FzZSAyOmQ9Yy5yZWFkVWludDY0KCk7YS5zZXRVbmlxdWUoZCk7YnJlYWs7Y2FzZSAzOmQ9Yy5yZWFkRmxvYXQoKTthLnNldEF2Z051bUJ5dGVzKGQpO2JyZWFrO2Nhc2UgNDpkPWMucmVhZEZsb2F0KCk7YS5zZXRNaW5OdW1CeXRlcyhkKTticmVhaztjYXNlIDU6ZD1jLnJlYWRGbG9hdCgpO2Euc2V0TWF4TnVtQnl0ZXMoZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfU4uc2VyaWFsaXplQmluYXJ5PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IHdmO0RtKHRoaXMsYSk7cmV0dXJuIGEuZ2V0UmVzdWx0QnVmZmVyKCl9OwpmdW5jdGlvbiBEbShhLGMpe3ZhciBkPWEuZ2V0Q29tbW9uU3RhdHMoKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSgxLGQsVG0pO2Q9YS5nZXRVbmlxdWUoKTswIT09ZCYmYy53cml0ZVVpbnQ2NCgyLGQpO2Q9YS5nZXRBdmdOdW1CeXRlcygpOzAhPT1kJiZjLndyaXRlRmxvYXQoMyxkKTtkPWEuZ2V0TWluTnVtQnl0ZXMoKTswIT09ZCYmYy53cml0ZUZsb2F0KDQsZCk7ZD1hLmdldE1heE51bUJ5dGVzKCk7MCE9PWQmJmMud3JpdGVGbG9hdCg1LGQpfU4uZ2V0Q29tbW9uU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gZWkodGhpcyxZbCwxKX07Ti5zZXRDb21tb25TdGF0cz1mdW5jdGlvbihhKXtoaSh0aGlzLDEsYSl9O04uY2xlYXJDb21tb25TdGF0cz1mdW5jdGlvbigpe3RoaXMuc2V0Q29tbW9uU3RhdHModm9pZCAwKX07Ti5oYXNDb21tb25TdGF0cz1mdW5jdGlvbigpe3JldHVybiBudWxsIT1OZyh0aGlzLDEpfTtOLmdldFVuaXF1ZT1mdW5jdGlvbigpe3JldHVybiBXZyh0aGlzLDIsMCl9OwpOLnNldFVuaXF1ZT1mdW5jdGlvbihhKXtZaCh0aGlzLDIsYSl9O04uZ2V0QXZnTnVtQnl0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gWGcodGhpcywzKX07Ti5zZXRBdmdOdW1CeXRlcz1mdW5jdGlvbihhKXskaCh0aGlzLDMsYSl9O04uZ2V0TWluTnVtQnl0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gWGcodGhpcyw0KX07Ti5zZXRNaW5OdW1CeXRlcz1mdW5jdGlvbihhKXskaCh0aGlzLDQsYSl9O04uZ2V0TWF4TnVtQnl0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gWGcodGhpcyw1KX07Ti5zZXRNYXhOdW1CeXRlcz1mdW5jdGlvbihhKXskaCh0aGlzLDUsYSl9O049WGwucHJvdG90eXBlO04udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIHVtKGEsdGhpcyl9O2Z1bmN0aW9uIHVtKGEsYyl7dmFyIGQsZj17Y29tbW9uU3RhdHM6KGQ9Yy5nZXRDb21tb25TdGF0cygpKSYmUG0oYSxkKX07YSYmKGYuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGZ9CmZ1bmN0aW9uIHptKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1uZXcgWWw7Yy5yZWFkTWVzc2FnZShkLFJtKTthLnNldENvbW1vblN0YXRzKGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1OLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyB3ZjtFbSh0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTtmdW5jdGlvbiBFbShhLGMpe2E9YS5nZXRDb21tb25TdGF0cygpO251bGwhPWEmJmMud3JpdGVNZXNzYWdlKDEsYSxUbSl9Ti5nZXRDb21tb25TdGF0cz1mdW5jdGlvbigpe3JldHVybiBlaSh0aGlzLFlsLDEpfTtOLnNldENvbW1vblN0YXRzPWZ1bmN0aW9uKGEpe2hpKHRoaXMsMSxhKX07Ti5jbGVhckNvbW1vblN0YXRzPWZ1bmN0aW9uKCl7dGhpcy5zZXRDb21tb25TdGF0cyh2b2lkIDApfTsKTi5oYXNDb21tb25TdGF0cz1mdW5jdGlvbigpe3JldHVybiBudWxsIT1OZyh0aGlzLDEpfTtOPVlsLnByb3RvdHlwZTtOLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBQbShhLHRoaXMpfTsKZnVuY3Rpb24gUG0oYSxjKXt2YXIgZCxmPXtudW1Ob25NaXNzaW5nOldnKGMsMSwwKSxudW1NaXNzaW5nOldnKGMsMiwwKSxtaW5OdW1WYWx1ZXM6V2coYywzLDApLG1heE51bVZhbHVlczpXZyhjLDQsMCksYXZnTnVtVmFsdWVzOlhnKGMsNSksdG90TnVtVmFsdWVzOldnKGMsOCwwKSxudW1WYWx1ZXNIaXN0b2dyYW06KGQ9Yy5nZXROdW1WYWx1ZXNIaXN0b2dyYW0oKSkmJkptKGEsZCksd2VpZ2h0ZWRDb21tb25TdGF0czooZD1jLmdldFdlaWdodGVkQ29tbW9uU3RhdHMoKSkmJkdtKGEsZCksZmVhdHVyZUxpc3RMZW5ndGhIaXN0b2dyYW06KGQ9Yy5nZXRGZWF0dXJlTGlzdExlbmd0aEhpc3RvZ3JhbSgpKSYmSm0oYSxkKX07YSYmKGYuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGZ9CmZ1bmN0aW9uIFJtKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1jLnJlYWRVaW50NjQoKTthLnNldE51bU5vbk1pc3NpbmcoZCk7YnJlYWs7Y2FzZSAyOmQ9Yy5yZWFkVWludDY0KCk7YS5zZXROdW1NaXNzaW5nKGQpO2JyZWFrO2Nhc2UgMzpkPWMucmVhZFVpbnQ2NCgpO2Euc2V0TWluTnVtVmFsdWVzKGQpO2JyZWFrO2Nhc2UgNDpkPWMucmVhZFVpbnQ2NCgpO2Euc2V0TWF4TnVtVmFsdWVzKGQpO2JyZWFrO2Nhc2UgNTpkPWMucmVhZEZsb2F0KCk7YS5zZXRBdmdOdW1WYWx1ZXMoZCk7YnJlYWs7Y2FzZSA4OmQ9Yy5yZWFkVWludDY0KCk7YS5zZXRUb3ROdW1WYWx1ZXMoZCk7YnJlYWs7Y2FzZSA2OmQ9bmV3IFpsO2MucmVhZE1lc3NhZ2UoZCxMbSk7YS5zZXROdW1WYWx1ZXNIaXN0b2dyYW0oZCk7YnJlYWs7Y2FzZSA3OmQ9bmV3IEtsO2MucmVhZE1lc3NhZ2UoZCxIbSk7YS5zZXRXZWlnaHRlZENvbW1vblN0YXRzKGQpOwpicmVhaztjYXNlIDk6ZD1uZXcgWmw7Yy5yZWFkTWVzc2FnZShkLExtKTthLnNldEZlYXR1cmVMaXN0TGVuZ3RoSGlzdG9ncmFtKGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1OLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyB3ZjtUbSh0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTsKZnVuY3Rpb24gVG0oYSxjKXt2YXIgZD1hLmdldE51bU5vbk1pc3NpbmcoKTswIT09ZCYmYy53cml0ZVVpbnQ2NCgxLGQpO2Q9YS5nZXROdW1NaXNzaW5nKCk7MCE9PWQmJmMud3JpdGVVaW50NjQoMixkKTtkPWEuZ2V0TWluTnVtVmFsdWVzKCk7MCE9PWQmJmMud3JpdGVVaW50NjQoMyxkKTtkPWEuZ2V0TWF4TnVtVmFsdWVzKCk7MCE9PWQmJmMud3JpdGVVaW50NjQoNCxkKTtkPWEuZ2V0QXZnTnVtVmFsdWVzKCk7MCE9PWQmJmMud3JpdGVGbG9hdCg1LGQpO2Q9YS5nZXRUb3ROdW1WYWx1ZXMoKTswIT09ZCYmYy53cml0ZVVpbnQ2NCg4LGQpO2Q9YS5nZXROdW1WYWx1ZXNIaXN0b2dyYW0oKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSg2LGQsTm0pO2Q9YS5nZXRXZWlnaHRlZENvbW1vblN0YXRzKCk7bnVsbCE9ZCYmYy53cml0ZU1lc3NhZ2UoNyxkLEltKTtkPWEuZ2V0RmVhdHVyZUxpc3RMZW5ndGhIaXN0b2dyYW0oKTtudWxsIT1kJiZjLndyaXRlTWVzc2FnZSg5LGQsTm0pfQpOLmdldE51bU5vbk1pc3Npbmc9ZnVuY3Rpb24oKXtyZXR1cm4gV2codGhpcywxLDApfTtOLnNldE51bU5vbk1pc3Npbmc9ZnVuY3Rpb24oYSl7WWgodGhpcywxLGEpfTtOLmdldE51bU1pc3Npbmc9ZnVuY3Rpb24oKXtyZXR1cm4gV2codGhpcywyLDApfTtOLnNldE51bU1pc3Npbmc9ZnVuY3Rpb24oYSl7WWgodGhpcywyLGEpfTtOLmdldE1pbk51bVZhbHVlcz1mdW5jdGlvbigpe3JldHVybiBXZyh0aGlzLDMsMCl9O04uc2V0TWluTnVtVmFsdWVzPWZ1bmN0aW9uKGEpe1loKHRoaXMsMyxhKX07Ti5nZXRNYXhOdW1WYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gV2codGhpcyw0LDApfTtOLnNldE1heE51bVZhbHVlcz1mdW5jdGlvbihhKXtZaCh0aGlzLDQsYSl9O04uZ2V0QXZnTnVtVmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIFhnKHRoaXMsNSl9O04uc2V0QXZnTnVtVmFsdWVzPWZ1bmN0aW9uKGEpeyRoKHRoaXMsNSxhKX07Ck4uZ2V0VG90TnVtVmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIFdnKHRoaXMsOCwwKX07Ti5zZXRUb3ROdW1WYWx1ZXM9ZnVuY3Rpb24oYSl7WWgodGhpcyw4LGEpfTtOLmdldE51bVZhbHVlc0hpc3RvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBlaSh0aGlzLFpsLDYpfTtOLnNldE51bVZhbHVlc0hpc3RvZ3JhbT1mdW5jdGlvbihhKXtoaSh0aGlzLDYsYSl9O04uY2xlYXJOdW1WYWx1ZXNIaXN0b2dyYW09ZnVuY3Rpb24oKXt0aGlzLnNldE51bVZhbHVlc0hpc3RvZ3JhbSh2b2lkIDApfTtOLmhhc051bVZhbHVlc0hpc3RvZ3JhbT1mdW5jdGlvbigpe3JldHVybiBudWxsIT1OZyh0aGlzLDYpfTtOLmdldFdlaWdodGVkQ29tbW9uU3RhdHM9ZnVuY3Rpb24oKXtyZXR1cm4gZWkodGhpcyxLbCw3KX07Ti5zZXRXZWlnaHRlZENvbW1vblN0YXRzPWZ1bmN0aW9uKGEpe2hpKHRoaXMsNyxhKX07Ti5jbGVhcldlaWdodGVkQ29tbW9uU3RhdHM9ZnVuY3Rpb24oKXt0aGlzLnNldFdlaWdodGVkQ29tbW9uU3RhdHModm9pZCAwKX07Ck4uaGFzV2VpZ2h0ZWRDb21tb25TdGF0cz1mdW5jdGlvbigpe3JldHVybiBudWxsIT1OZyh0aGlzLDcpfTtOLmdldEZlYXR1cmVMaXN0TGVuZ3RoSGlzdG9ncmFtPWZ1bmN0aW9uKCl7cmV0dXJuIGVpKHRoaXMsWmwsOSl9O04uc2V0RmVhdHVyZUxpc3RMZW5ndGhIaXN0b2dyYW09ZnVuY3Rpb24oYSl7aGkodGhpcyw5LGEpfTtOLmNsZWFyRmVhdHVyZUxpc3RMZW5ndGhIaXN0b2dyYW09ZnVuY3Rpb24oKXt0aGlzLnNldEZlYXR1cmVMaXN0TGVuZ3RoSGlzdG9ncmFtKHZvaWQgMCl9O04uaGFzRmVhdHVyZUxpc3RMZW5ndGhIaXN0b2dyYW09ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9TmcodGhpcyw5KX07dmFyICRsPVszXTtabC5wcm90b3R5cGUudG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIEptKGEsdGhpcyl9OwpmdW5jdGlvbiBKbShhLGMpe3ZhciBkPXtudW1OYW46V2coYywxLDApLG51bVVuZGVmaW5lZDpXZyhjLDIsMCksYnVja2V0c0xpc3Q6TWcoYy5nZXRCdWNrZXRzTGlzdCgpLGFuLGEpLHR5cGU6V2coYyw0LDApLG5hbWU6V2coYyw1LCIiKX07YSYmKGQuJGpzcGJNZXNzYWdlSW5zdGFuY2U9Yyk7cmV0dXJuIGR9CmZ1bmN0aW9uIExtKGEsYyl7Zm9yKDtjLm5leHRGaWVsZCgpJiYhYy5pc0VuZEdyb3VwKCk7KXN3aXRjaChjLmdldEZpZWxkTnVtYmVyKCkpe2Nhc2UgMTp2YXIgZD1jLnJlYWRVaW50NjQoKTthLnNldE51bU5hbihkKTticmVhaztjYXNlIDI6ZD1jLnJlYWRVaW50NjQoKTthLnNldE51bVVuZGVmaW5lZChkKTticmVhaztjYXNlIDM6ZD1uZXcgYW07Yy5yZWFkTWVzc2FnZShkLGJuKTthLmFkZEJ1Y2tldHMoZCk7YnJlYWs7Y2FzZSA0OmQ9Yy5yZWFkRW51bSgpO2Euc2V0VHlwZShkKTticmVhaztjYXNlIDU6ZD1jLnJlYWRTdHJpbmcoKTthLnNldE5hbWUoZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfVpsLnByb3RvdHlwZS5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgd2Y7Tm0odGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07CmZ1bmN0aW9uIE5tKGEsYyl7dmFyIGQ9YS5nZXROdW1OYW4oKTswIT09ZCYmYy53cml0ZVVpbnQ2NCgxLGQpO2Q9YS5nZXROdW1VbmRlZmluZWQoKTswIT09ZCYmYy53cml0ZVVpbnQ2NCgyLGQpO2Q9YS5nZXRCdWNrZXRzTGlzdCgpOzA8ZC5sZW5ndGgmJmMud3JpdGVSZXBlYXRlZE1lc3NhZ2UoMyxkLGNuKTtkPWEuZ2V0VHlwZSgpOzAhPT1kJiZjLndyaXRlRW51bSg0LGQpO2Q9YS5nZXROYW1lKCk7MDxkLmxlbmd0aCYmYy53cml0ZVN0cmluZyg1LGQpfU49YW0ucHJvdG90eXBlO04udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIGFuKGEsdGhpcyl9O2Z1bmN0aW9uIGFuKGEsYyl7dmFyIGQ9e2xvd1ZhbHVlOlhnKGMsMSksaGlnaFZhbHVlOlhnKGMsMiksZGVwcmVjYXRlZENvdW50OldnKGMsMywwKSxzYW1wbGVDb3VudDpYZyhjLDQpfTthJiYoZC4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZH0KZnVuY3Rpb24gYm4oYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPWMucmVhZERvdWJsZSgpO2Euc2V0TG93VmFsdWUoZCk7YnJlYWs7Y2FzZSAyOmQ9Yy5yZWFkRG91YmxlKCk7YS5zZXRIaWdoVmFsdWUoZCk7YnJlYWs7Y2FzZSAzOmQ9Yy5yZWFkVWludDY0KCk7YS5zZXREZXByZWNhdGVkQ291bnQoZCk7YnJlYWs7Y2FzZSA0OmQ9Yy5yZWFkRG91YmxlKCk7YS5zZXRTYW1wbGVDb3VudChkKTticmVhaztkZWZhdWx0OmMuc2tpcEZpZWxkKCl9cmV0dXJuIGF9Ti5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgd2Y7Y24odGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07CmZ1bmN0aW9uIGNuKGEsYyl7dmFyIGQ9YS5nZXRMb3dWYWx1ZSgpOzAhPT1kJiZjLndyaXRlRG91YmxlKDEsZCk7ZD1hLmdldEhpZ2hWYWx1ZSgpOzAhPT1kJiZjLndyaXRlRG91YmxlKDIsZCk7ZD1hLmdldERlcHJlY2F0ZWRDb3VudCgpOzAhPT1kJiZjLndyaXRlVWludDY0KDMsZCk7ZD1hLmdldFNhbXBsZUNvdW50KCk7MCE9PWQmJmMud3JpdGVEb3VibGUoNCxkKX1OLmdldExvd1ZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIFhnKHRoaXMsMSl9O04uc2V0TG93VmFsdWU9ZnVuY3Rpb24oYSl7JGgodGhpcywxLGEpfTtOLmdldEhpZ2hWYWx1ZT1mdW5jdGlvbigpe3JldHVybiBYZyh0aGlzLDIpfTtOLnNldEhpZ2hWYWx1ZT1mdW5jdGlvbihhKXskaCh0aGlzLDIsYSl9O04uZ2V0RGVwcmVjYXRlZENvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIFdnKHRoaXMsMywwKX07Ti5zZXREZXByZWNhdGVkQ291bnQ9ZnVuY3Rpb24oYSl7WWgodGhpcywzLGEpfTsKTi5nZXRTYW1wbGVDb3VudD1mdW5jdGlvbigpe3JldHVybiBYZyh0aGlzLDQpfTtOLnNldFNhbXBsZUNvdW50PWZ1bmN0aW9uKGEpeyRoKHRoaXMsNCxhKX07Tj1abC5wcm90b3R5cGU7Ti5nZXROdW1OYW49ZnVuY3Rpb24oKXtyZXR1cm4gV2codGhpcywxLDApfTtOLnNldE51bU5hbj1mdW5jdGlvbihhKXtZaCh0aGlzLDEsYSl9O04uZ2V0TnVtVW5kZWZpbmVkPWZ1bmN0aW9uKCl7cmV0dXJuIFdnKHRoaXMsMiwwKX07Ti5zZXROdW1VbmRlZmluZWQ9ZnVuY3Rpb24oYSl7WWgodGhpcywyLGEpfTtOLmdldEJ1Y2tldHNMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIGZpKHRoaXMsYW0sMyl9O04uc2V0QnVja2V0c0xpc3Q9ZnVuY3Rpb24oYSl7amkodGhpcywzLGEpfTtOLmFkZEJ1Y2tldHM9ZnVuY3Rpb24oYSl7cmV0dXJuIGtpKHRoaXMsMyxhLGFtLHZvaWQgMCl9O04uY2xlYXJCdWNrZXRzTGlzdD1mdW5jdGlvbigpe3RoaXMuc2V0QnVja2V0c0xpc3QoW10pfTsKTi5nZXRUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIFdnKHRoaXMsNCwwKX07Ti5zZXRUeXBlPWZ1bmN0aW9uKGEpe2JpKHRoaXMsNCxhKX07Ti5nZXROYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFdnKHRoaXMsNSwiIil9O04uc2V0TmFtZT1mdW5jdGlvbihhKXthaSh0aGlzLDUsYSl9O3ZhciBjbT1bMV07Ym0ucHJvdG90eXBlLnRvT2JqZWN0PWZ1bmN0aW9uKGEpe3JldHVybiBLbShhLHRoaXMpfTtmdW5jdGlvbiBLbShhLGMpe3ZhciBkPXtidWNrZXRzTGlzdDpNZyhjLmdldEJ1Y2tldHNMaXN0KCksZG4sYSksbmFtZTpXZyhjLDIsIiIpfTthJiYoZC4kanNwYk1lc3NhZ2VJbnN0YW5jZT1jKTtyZXR1cm4gZH0KZnVuY3Rpb24gTW0oYSxjKXtmb3IoO2MubmV4dEZpZWxkKCkmJiFjLmlzRW5kR3JvdXAoKTspc3dpdGNoKGMuZ2V0RmllbGROdW1iZXIoKSl7Y2FzZSAxOnZhciBkPW5ldyBkbTtjLnJlYWRNZXNzYWdlKGQsZW4pO2EuYWRkQnVja2V0cyhkKTticmVhaztjYXNlIDI6ZD1jLnJlYWRTdHJpbmcoKTthLnNldE5hbWUoZCk7YnJlYWs7ZGVmYXVsdDpjLnNraXBGaWVsZCgpfXJldHVybiBhfWJtLnByb3RvdHlwZS5zZXJpYWxpemVCaW5hcnk9ZnVuY3Rpb24oKXt2YXIgYT1uZXcgd2Y7T20odGhpcyxhKTtyZXR1cm4gYS5nZXRSZXN1bHRCdWZmZXIoKX07ZnVuY3Rpb24gT20oYSxjKXt2YXIgZD1hLmdldEJ1Y2tldHNMaXN0KCk7MDxkLmxlbmd0aCYmYy53cml0ZVJlcGVhdGVkTWVzc2FnZSgxLGQsZm4pO2Q9YS5nZXROYW1lKCk7MDxkLmxlbmd0aCYmYy53cml0ZVN0cmluZygyLGQpfU49ZG0ucHJvdG90eXBlO04udG9PYmplY3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIGRuKGEsdGhpcyl9OwpmdW5jdGlvbiBkbihhLGMpe3ZhciBkPXtsb3dSYW5rOldnKGMsMSwwKSxoaWdoUmFuazpXZyhjLDIsMCksZGVwcmVjYXRlZENvdW50OldnKGMsMywwKSxsYWJlbDpXZyhjLDQsIiIpLHNhbXBsZUNvdW50OlhnKGMsNSl9O2EmJihkLiRqc3BiTWVzc2FnZUluc3RhbmNlPWMpO3JldHVybiBkfQpmdW5jdGlvbiBlbihhLGMpe2Zvcig7Yy5uZXh0RmllbGQoKSYmIWMuaXNFbmRHcm91cCgpOylzd2l0Y2goYy5nZXRGaWVsZE51bWJlcigpKXtjYXNlIDE6dmFyIGQ9Yy5yZWFkVWludDY0KCk7YS5zZXRMb3dSYW5rKGQpO2JyZWFrO2Nhc2UgMjpkPWMucmVhZFVpbnQ2NCgpO2Euc2V0SGlnaFJhbmsoZCk7YnJlYWs7Y2FzZSAzOmQ9Yy5yZWFkVWludDY0KCk7YS5zZXREZXByZWNhdGVkQ291bnQoZCk7YnJlYWs7Y2FzZSA0OmQ9Yy5yZWFkU3RyaW5nKCk7YS5zZXRMYWJlbChkKTticmVhaztjYXNlIDU6ZD1jLnJlYWREb3VibGUoKTthLnNldFNhbXBsZUNvdW50KGQpO2JyZWFrO2RlZmF1bHQ6Yy5za2lwRmllbGQoKX1yZXR1cm4gYX1OLnNlcmlhbGl6ZUJpbmFyeT1mdW5jdGlvbigpe3ZhciBhPW5ldyB3Zjtmbih0aGlzLGEpO3JldHVybiBhLmdldFJlc3VsdEJ1ZmZlcigpfTsKZnVuY3Rpb24gZm4oYSxjKXt2YXIgZD1hLmdldExvd1JhbmsoKTswIT09ZCYmYy53cml0ZVVpbnQ2NCgxLGQpO2Q9YS5nZXRIaWdoUmFuaygpOzAhPT1kJiZjLndyaXRlVWludDY0KDIsZCk7ZD1hLmdldERlcHJlY2F0ZWRDb3VudCgpOzAhPT1kJiZjLndyaXRlVWludDY0KDMsZCk7ZD1hLmdldExhYmVsKCk7MDxkLmxlbmd0aCYmYy53cml0ZVN0cmluZyg0LGQpO2Q9YS5nZXRTYW1wbGVDb3VudCgpOzAhPT1kJiZjLndyaXRlRG91YmxlKDUsZCl9Ti5nZXRMb3dSYW5rPWZ1bmN0aW9uKCl7cmV0dXJuIFdnKHRoaXMsMSwwKX07Ti5zZXRMb3dSYW5rPWZ1bmN0aW9uKGEpe1loKHRoaXMsMSxhKX07Ti5nZXRIaWdoUmFuaz1mdW5jdGlvbigpe3JldHVybiBXZyh0aGlzLDIsMCl9O04uc2V0SGlnaFJhbms9ZnVuY3Rpb24oYSl7WWgodGhpcywyLGEpfTtOLmdldERlcHJlY2F0ZWRDb3VudD1mdW5jdGlvbigpe3JldHVybiBXZyh0aGlzLDMsMCl9OwpOLnNldERlcHJlY2F0ZWRDb3VudD1mdW5jdGlvbihhKXtZaCh0aGlzLDMsYSl9O04uZ2V0TGFiZWw9ZnVuY3Rpb24oKXtyZXR1cm4gV2codGhpcyw0LCIiKX07Ti5zZXRMYWJlbD1mdW5jdGlvbihhKXthaSh0aGlzLDQsYSl9O04uZ2V0U2FtcGxlQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gWGcodGhpcyw1KX07Ti5zZXRTYW1wbGVDb3VudD1mdW5jdGlvbihhKXskaCh0aGlzLDUsYSl9O049Ym0ucHJvdG90eXBlO04uZ2V0QnVja2V0c0xpc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gZmkodGhpcyxkbSwxKX07Ti5zZXRCdWNrZXRzTGlzdD1mdW5jdGlvbihhKXtqaSh0aGlzLDEsYSl9O04uYWRkQnVja2V0cz1mdW5jdGlvbihhKXtyZXR1cm4ga2kodGhpcywxLGEsZG0sdm9pZCAwKX07Ti5jbGVhckJ1Y2tldHNMaXN0PWZ1bmN0aW9uKCl7dGhpcy5zZXRCdWNrZXRzTGlzdChbXSl9O04uZ2V0TmFtZT1mdW5jdGlvbigpe3JldHVybiBXZyh0aGlzLDIsIiIpfTsKTi5zZXROYW1lPWZ1bmN0aW9uKGEpe2FpKHRoaXMsMixhKX07Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2RlcHMuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovL2FuYWx5dGljcy5odG1sLmpzCndpbmRvdy5nYT1mdW5jdGlvbigpe307CgovLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci8vCi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAovLwovLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgovLyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiFmdW5jdGlvbihhLGIpe3ZhciBjPXt9LGQ9e30sZT17fSxmPW51bGw7IWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtpZigibnVtYmVyIj09dHlwZW9mIGEpcmV0dXJuIGE7dmFyIGI9e307Zm9yKHZhciBjIGluIGEpYltjXT1hW2NdO3JldHVybiBifWZ1bmN0aW9uIGQoKXt0aGlzLl9kZWxheT0wLHRoaXMuX2VuZERlbGF5PTAsdGhpcy5fZmlsbD0ibm9uZSIsdGhpcy5faXRlcmF0aW9uU3RhcnQ9MCx0aGlzLl9pdGVyYXRpb25zPTEsdGhpcy5fZHVyYXRpb249MCx0aGlzLl9wbGF5YmFja1JhdGU9MSx0aGlzLl9kaXJlY3Rpb249Im5vcm1hbCIsdGhpcy5fZWFzaW5nPSJsaW5lYXIiLHRoaXMuX2Vhc2luZ0Z1bmN0aW9uPXd9ZnVuY3Rpb24gZSgpe3JldHVybiBhLmlzRGVwcmVjYXRlZCgiSW52YWxpZCB0aW1pbmcgaW5wdXRzIiwiMjAxNi0wMy0wMiIsIlR5cGVFcnJvciBleGNlcHRpb25zIHdpbGwgYmUgdGhyb3duIGluc3RlYWQuIiwhMCl9ZnVuY3Rpb24gZihiLGMsZSl7dmFyIGY9bmV3IGQ7cmV0dXJuIGMmJihmLmZpbGw9ImJvdGgiLGYuZHVyYXRpb249ImF1dG8iKSwibnVtYmVyIiE9dHlwZW9mIGJ8fGlzTmFOKGIpP3ZvaWQgMCE9PWImJk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGIpLmZvckVhY2goZnVuY3Rpb24oYyl7aWYoImF1dG8iIT1iW2NdKXtpZigoIm51bWJlciI9PXR5cGVvZiBmW2NdfHwiZHVyYXRpb24iPT1jKSYmKCJudW1iZXIiIT10eXBlb2YgYltjXXx8aXNOYU4oYltjXSkpKXJldHVybjtpZigiZmlsbCI9PWMmJi0xPT11LmluZGV4T2YoYltjXSkpcmV0dXJuO2lmKCJkaXJlY3Rpb24iPT1jJiYtMT09di5pbmRleE9mKGJbY10pKXJldHVybjtpZigicGxheWJhY2tSYXRlIj09YyYmMSE9PWJbY10mJmEuaXNEZXByZWNhdGVkKCJBbmltYXRpb25FZmZlY3RUaW1pbmcucGxheWJhY2tSYXRlIiwiMjAxNC0xMS0yOCIsIlVzZSBBbmltYXRpb24ucGxheWJhY2tSYXRlIGluc3RlYWQuIikpcmV0dXJuO2ZbY109YltjXX19KTpmLmR1cmF0aW9uPWIsZn1mdW5jdGlvbiBnKGEpe3JldHVybiJudW1iZXIiPT10eXBlb2YgYSYmKGE9aXNOYU4oYSk/e2R1cmF0aW9uOjB9OntkdXJhdGlvbjphfSksYX1mdW5jdGlvbiBoKGIsYyl7cmV0dXJuIGI9YS5udW1lcmljVGltaW5nVG9PYmplY3QoYiksZihiLGMpfWZ1bmN0aW9uIGkoYSxiLGMsZCl7cmV0dXJuIDA+YXx8YT4xfHwwPmN8fGM+MT93OmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGYoYSxiLGMpe3JldHVybiAzKmEqKDEtYykqKDEtYykqYyszKmIqKDEtYykqYypjK2MqYypjfWlmKDA9PWV8fDE9PWUpcmV0dXJuIGU7Zm9yKHZhciBnPTAsaD0xOzspe3ZhciBpPShnK2gpLzIsaj1mKGEsYyxpKTtpZihNYXRoLmFicyhlLWopPDFlLTQpcmV0dXJuIGYoYixkLGkpO2U+aj9nPWk6aD1pfX19ZnVuY3Rpb24gaihhLGIpe3JldHVybiBmdW5jdGlvbihjKXtpZihjPj0xKXJldHVybiAxO3ZhciBkPTEvYTtyZXR1cm4gYys9YipkLGMtYyVkfX1mdW5jdGlvbiBrKGEpe0J8fChCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlKSxCLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uPSIiLEIuYW5pbWF0aW9uVGltaW5nRnVuY3Rpb249YTt2YXIgYj1CLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uO2lmKCIiPT1iJiZlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcihhKyIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIGVhc2luZyIpO3ZhciBjPUQuZXhlYyhiKTtpZihjKXJldHVybiBpLmFwcGx5KHRoaXMsYy5zbGljZSgxKS5tYXAoTnVtYmVyKSk7dmFyIGQ9RS5leGVjKGIpO2lmKGQpcmV0dXJuIGooTnVtYmVyKGRbMV0pLHtzdGFydDp4LG1pZGRsZTp5LGVuZDp6fVtkWzJdXSk7dmFyIGY9QVtiXTtyZXR1cm4gZj9mOnd9ZnVuY3Rpb24gbChhKXtyZXR1cm4gTWF0aC5hYnMobShhKS9hLnBsYXliYWNrUmF0ZSl9ZnVuY3Rpb24gbShhKXtyZXR1cm4gYS5kdXJhdGlvbiphLml0ZXJhdGlvbnN9ZnVuY3Rpb24gbihhLGIsYyl7cmV0dXJuIG51bGw9PWI/RjpiPGMuZGVsYXk/RzpiPj1jLmRlbGF5K2E/SDpJfWZ1bmN0aW9uIG8oYSxiLGMsZCxlKXtzd2l0Y2goZCl7Y2FzZSBHOnJldHVybiJiYWNrd2FyZHMiPT1ifHwiYm90aCI9PWI/MDpudWxsO2Nhc2UgSTpyZXR1cm4gYy1lO2Nhc2UgSDpyZXR1cm4iZm9yd2FyZHMiPT1ifHwiYm90aCI9PWI/YTpudWxsO2Nhc2UgRjpyZXR1cm4gbnVsbH19ZnVuY3Rpb24gcChhLGIsYyxkKXtyZXR1cm4oZC5wbGF5YmFja1JhdGU8MD9iLWE6YikqZC5wbGF5YmFja1JhdGUrY31mdW5jdGlvbiBxKGEsYixjLGQsZSl7cmV0dXJuIGM9PT0xLzB8fGM9PT0tKDEvMCl8fGMtZD09YiYmZS5pdGVyYXRpb25zJiYoZS5pdGVyYXRpb25zK2UuaXRlcmF0aW9uU3RhcnQpJTE9PTA/YTpjJWF9ZnVuY3Rpb24gcihhLGIsYyxkKXtyZXR1cm4gMD09PWM/MDpiPT1hP2QuaXRlcmF0aW9uU3RhcnQrZC5pdGVyYXRpb25zLTE6TWF0aC5mbG9vcihjL2EpfWZ1bmN0aW9uIHMoYSxiLGMsZCl7dmFyIGU9YSUyPj0xLGY9Im5vcm1hbCI9PWQuZGlyZWN0aW9ufHxkLmRpcmVjdGlvbj09KGU/ImFsdGVybmF0ZS1yZXZlcnNlIjoiYWx0ZXJuYXRlIiksZz1mP2M6Yi1jLGg9Zy9iO3JldHVybiBiKmQuX2Vhc2luZ0Z1bmN0aW9uKGgpfWZ1bmN0aW9uIHQoYSxiLGMpe3ZhciBkPW4oYSxiLGMpLGU9byhhLGMuZmlsbCxiLGQsYy5kZWxheSk7aWYobnVsbD09PWUpcmV0dXJuIG51bGw7aWYoMD09PWEpcmV0dXJuIGQ9PT1HPzA6MTt2YXIgZj1jLml0ZXJhdGlvblN0YXJ0KmMuZHVyYXRpb24sZz1wKGEsZSxmLGMpLGg9cShjLmR1cmF0aW9uLG0oYyksZyxmLGMpLGk9cihjLmR1cmF0aW9uLGgsZyxjKTtyZXR1cm4gcyhpLGMuZHVyYXRpb24saCxjKS9jLmR1cmF0aW9ufXZhciB1PSJiYWNrd2FyZHN8Zm9yd2FyZHN8Ym90aHxub25lIi5zcGxpdCgifCIpLHY9InJldmVyc2V8YWx0ZXJuYXRlfGFsdGVybmF0ZS1yZXZlcnNlIi5zcGxpdCgifCIpLHc9ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O2QucHJvdG90eXBlPXtfc2V0TWVtYmVyOmZ1bmN0aW9uKGIsYyl7dGhpc1siXyIrYl09Yyx0aGlzLl9lZmZlY3QmJih0aGlzLl9lZmZlY3QuX3RpbWluZ0lucHV0W2JdPWMsdGhpcy5fZWZmZWN0Ll90aW1pbmc9YS5ub3JtYWxpemVUaW1pbmdJbnB1dCh0aGlzLl9lZmZlY3QuX3RpbWluZ0lucHV0KSx0aGlzLl9lZmZlY3QuYWN0aXZlRHVyYXRpb249YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbih0aGlzLl9lZmZlY3QuX3RpbWluZyksdGhpcy5fZWZmZWN0Ll9hbmltYXRpb24mJnRoaXMuX2VmZmVjdC5fYW5pbWF0aW9uLl9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbigpKX0sZ2V0IHBsYXliYWNrUmF0ZSgpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9LHNldCBkZWxheShhKXt0aGlzLl9zZXRNZW1iZXIoImRlbGF5IixhKX0sZ2V0IGRlbGF5KCl7cmV0dXJuIHRoaXMuX2RlbGF5fSxzZXQgZW5kRGVsYXkoYSl7dGhpcy5fc2V0TWVtYmVyKCJlbmREZWxheSIsYSl9LGdldCBlbmREZWxheSgpe3JldHVybiB0aGlzLl9lbmREZWxheX0sc2V0IGZpbGwoYSl7dGhpcy5fc2V0TWVtYmVyKCJmaWxsIixhKX0sZ2V0IGZpbGwoKXtyZXR1cm4gdGhpcy5fZmlsbH0sc2V0IGl0ZXJhdGlvblN0YXJ0KGEpe2lmKChpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIml0ZXJhdGlvblN0YXJ0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLCByZWNlaXZlZDogIit0aW1pbmcuaXRlcmF0aW9uU3RhcnQpO3RoaXMuX3NldE1lbWJlcigiaXRlcmF0aW9uU3RhcnQiLGEpfSxnZXQgaXRlcmF0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy5faXRlcmF0aW9uU3RhcnR9LHNldCBkdXJhdGlvbihhKXtpZigiYXV0byIhPWEmJihpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoImR1cmF0aW9uIG11c3QgYmUgbm9uLW5lZ2F0aXZlIG9yIGF1dG8sIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiZHVyYXRpb24iLGEpfSxnZXQgZHVyYXRpb24oKXtyZXR1cm4gdGhpcy5fZHVyYXRpb259LHNldCBkaXJlY3Rpb24oYSl7dGhpcy5fc2V0TWVtYmVyKCJkaXJlY3Rpb24iLGEpfSxnZXQgZGlyZWN0aW9uKCl7cmV0dXJuIHRoaXMuX2RpcmVjdGlvbn0sc2V0IGVhc2luZyhhKXt0aGlzLl9lYXNpbmdGdW5jdGlvbj1rKGEpLHRoaXMuX3NldE1lbWJlcigiZWFzaW5nIixhKX0sZ2V0IGVhc2luZygpe3JldHVybiB0aGlzLl9lYXNpbmd9LHNldCBpdGVyYXRpb25zKGEpe2lmKChpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIml0ZXJhdGlvbnMgbXVzdCBiZSBub24tbmVnYXRpdmUsIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiaXRlcmF0aW9ucyIsYSl9LGdldCBpdGVyYXRpb25zKCl7cmV0dXJuIHRoaXMuX2l0ZXJhdGlvbnN9fTt2YXIgeD0xLHk9LjUsej0wLEE9e2Vhc2U6aSguMjUsLjEsLjI1LDEpLCJlYXNlLWluIjppKC40MiwwLDEsMSksImVhc2Utb3V0IjppKDAsMCwuNTgsMSksImVhc2UtaW4tb3V0IjppKC40MiwwLC41OCwxKSwic3RlcC1zdGFydCI6aigxLHgpLCJzdGVwLW1pZGRsZSI6aigxLHkpLCJzdGVwLWVuZCI6aigxLHopfSxCPW51bGwsQz0iXFxzKigtP1xcZCtcXC4/XFxkKnwtP1xcLlxcZCspXFxzKiIsRD1uZXcgUmVnRXhwKCJjdWJpYy1iZXppZXJcXCgiK0MrIiwiK0MrIiwiK0MrIiwiK0MrIlxcKSIpLEU9L3N0ZXBzXChccyooXGQrKVxzKixccyooc3RhcnR8bWlkZGxlfGVuZClccypcKS8sRj0wLEc9MSxIPTIsST0zO2EuY2xvbmVUaW1pbmdJbnB1dD1jLGEubWFrZVRpbWluZz1mLGEubnVtZXJpY1RpbWluZ1RvT2JqZWN0PWcsYS5ub3JtYWxpemVUaW1pbmdJbnB1dD1oLGEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb249bCxhLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbj10LGEuY2FsY3VsYXRlUGhhc2U9bixhLnRvVGltaW5nRnVuY3Rpb249a30oYyxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYSBpbiBqP2pbYV1bYl18fGI6Yn1mdW5jdGlvbiBkKGEsYixkKXt2YXIgZT1nW2FdO2lmKGUpe2guc3R5bGVbYV09Yjtmb3IodmFyIGYgaW4gZSl7dmFyIGk9ZVtmXSxqPWguc3R5bGVbaV07ZFtpXT1jKGksail9fWVsc2UgZFthXT1jKGEsYil9ZnVuY3Rpb24gZShhKXt2YXIgYj1bXTtmb3IodmFyIGMgaW4gYSlpZighKGMgaW5bImVhc2luZyIsIm9mZnNldCIsImNvbXBvc2l0ZSJdKSl7dmFyIGQ9YVtjXTtBcnJheS5pc0FycmF5KGQpfHwoZD1bZF0pO2Zvcih2YXIgZSxmPWQubGVuZ3RoLGc9MDtmPmc7ZysrKWU9e30sIm9mZnNldCJpbiBhP2Uub2Zmc2V0PWEub2Zmc2V0OjE9PWY/ZS5vZmZzZXQ9MTplLm9mZnNldD1nLyhmLTEpLCJlYXNpbmciaW4gYSYmKGUuZWFzaW5nPWEuZWFzaW5nKSwiY29tcG9zaXRlImluIGEmJihlLmNvbXBvc2l0ZT1hLmNvbXBvc2l0ZSksZVtjXT1kW2ddLGIucHVzaChlKX1yZXR1cm4gYi5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEub2Zmc2V0LWIub2Zmc2V0fSksYn1mdW5jdGlvbiBmKGEpe2Z1bmN0aW9uIGIoKXt2YXIgYT1jLmxlbmd0aDtudWxsPT1jW2EtMV0ub2Zmc2V0JiYoY1thLTFdLm9mZnNldD0xKSxhPjEmJm51bGw9PWNbMF0ub2Zmc2V0JiYoY1swXS5vZmZzZXQ9MCk7Zm9yKHZhciBiPTAsZD1jWzBdLm9mZnNldCxlPTE7YT5lO2UrKyl7dmFyIGY9Y1tlXS5vZmZzZXQ7aWYobnVsbCE9Zil7Zm9yKHZhciBnPTE7ZS1iPmc7ZysrKWNbYitnXS5vZmZzZXQ9ZCsoZi1kKSpnLyhlLWIpO2I9ZSxkPWZ9fX1pZihudWxsPT1hKXJldHVybltdO3dpbmRvdy5TeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmQXJyYXkucHJvdG90eXBlLmZyb20mJmFbU3ltYm9sLml0ZXJhdG9yXSYmKGE9QXJyYXkuZnJvbShhKSksQXJyYXkuaXNBcnJheShhKXx8KGE9ZShhKSk7Zm9yKHZhciBjPWEubWFwKGZ1bmN0aW9uKGEpe3ZhciBiPXt9O2Zvcih2YXIgYyBpbiBhKXt2YXIgZT1hW2NdO2lmKCJvZmZzZXQiPT1jKXtpZihudWxsIT1lJiYoZT1OdW1iZXIoZSksIWlzRmluaXRlKGUpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJrZXlmcmFtZSBvZmZzZXRzIG11c3QgYmUgbnVtYmVycy4iKX1lbHNle2lmKCJjb21wb3NpdGUiPT1jKXRocm93e3R5cGU6RE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLG5hbWU6Ik5vdFN1cHBvcnRlZEVycm9yIixtZXNzYWdlOiJhZGQgY29tcG9zaXRpbmcgaXMgbm90IHN1cHBvcnRlZCJ9O2U9IiIrZX1kKGMsZSxiKX1yZXR1cm4gdm9pZCAwPT1iLm9mZnNldCYmKGIub2Zmc2V0PW51bGwpLGJ9KSxmPSEwLGc9LSgxLzApLGg9MDtoPGMubGVuZ3RoO2grKyl7dmFyIGk9Y1toXS5vZmZzZXQ7aWYobnVsbCE9aSl7aWYoZz5pKXRocm93e2NvZGU6RE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUixuYW1lOiJJbnZhbGlkTW9kaWZpY2F0aW9uRXJyb3IiLG1lc3NhZ2U6IktleWZyYW1lcyBhcmUgbm90IGxvb3NlbHkgc29ydGVkIGJ5IG9mZnNldC4gU29ydCBvciBzcGVjaWZ5IG9mZnNldHMuIn07Zz1pfWVsc2UgZj0hMX1yZXR1cm4gYz1jLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXQ+PTAmJmEub2Zmc2V0PD0xfSksZnx8YigpLGN9dmFyIGc9e2JhY2tncm91bmQ6WyJiYWNrZ3JvdW5kSW1hZ2UiLCJiYWNrZ3JvdW5kUG9zaXRpb24iLCJiYWNrZ3JvdW5kU2l6ZSIsImJhY2tncm91bmRSZXBlYXQiLCJiYWNrZ3JvdW5kQXR0YWNobWVudCIsImJhY2tncm91bmRPcmlnaW4iLCJiYWNrZ3JvdW5kQ2xpcCIsImJhY2tncm91bmRDb2xvciJdLGJvcmRlcjpbImJvcmRlclRvcENvbG9yIiwiYm9yZGVyVG9wU3R5bGUiLCJib3JkZXJUb3BXaWR0aCIsImJvcmRlclJpZ2h0Q29sb3IiLCJib3JkZXJSaWdodFN0eWxlIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbUNvbG9yIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21XaWR0aCIsImJvcmRlckxlZnRDb2xvciIsImJvcmRlckxlZnRTdHlsZSIsImJvcmRlckxlZnRXaWR0aCJdLGJvcmRlckJvdHRvbTpbImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21Db2xvciJdLGJvcmRlckNvbG9yOlsiYm9yZGVyVG9wQ29sb3IiLCJib3JkZXJSaWdodENvbG9yIiwiYm9yZGVyQm90dG9tQ29sb3IiLCJib3JkZXJMZWZ0Q29sb3IiXSxib3JkZXJMZWZ0OlsiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyTGVmdFN0eWxlIiwiYm9yZGVyTGVmdENvbG9yIl0sYm9yZGVyUmFkaXVzOlsiYm9yZGVyVG9wTGVmdFJhZGl1cyIsImJvcmRlclRvcFJpZ2h0UmFkaXVzIiwiYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMiLCJib3JkZXJCb3R0b21MZWZ0UmFkaXVzIl0sYm9yZGVyUmlnaHQ6WyJib3JkZXJSaWdodFdpZHRoIiwiYm9yZGVyUmlnaHRTdHlsZSIsImJvcmRlclJpZ2h0Q29sb3IiXSxib3JkZXJUb3A6WyJib3JkZXJUb3BXaWR0aCIsImJvcmRlclRvcFN0eWxlIiwiYm9yZGVyVG9wQ29sb3IiXSxib3JkZXJXaWR0aDpbImJvcmRlclRvcFdpZHRoIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyTGVmdFdpZHRoIl0sZmxleDpbImZsZXhHcm93IiwiZmxleFNocmluayIsImZsZXhCYXNpcyJdLGZvbnQ6WyJmb250RmFtaWx5IiwiZm9udFNpemUiLCJmb250U3R5bGUiLCJmb250VmFyaWFudCIsImZvbnRXZWlnaHQiLCJsaW5lSGVpZ2h0Il0sbWFyZ2luOlsibWFyZ2luVG9wIiwibWFyZ2luUmlnaHQiLCJtYXJnaW5Cb3R0b20iLCJtYXJnaW5MZWZ0Il0sb3V0bGluZTpbIm91dGxpbmVDb2xvciIsIm91dGxpbmVTdHlsZSIsIm91dGxpbmVXaWR0aCJdLHBhZGRpbmc6WyJwYWRkaW5nVG9wIiwicGFkZGluZ1JpZ2h0IiwicGFkZGluZ0JvdHRvbSIsInBhZGRpbmdMZWZ0Il19LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiZGl2IiksaT17dGhpbjoiMXB4IixtZWRpdW06IjNweCIsdGhpY2s6IjVweCJ9LGo9e2JvcmRlckJvdHRvbVdpZHRoOmksYm9yZGVyTGVmdFdpZHRoOmksYm9yZGVyUmlnaHRXaWR0aDppLGJvcmRlclRvcFdpZHRoOmksZm9udFNpemU6eyJ4eC1zbWFsbCI6IjYwJSIsIngtc21hbGwiOiI3NSUiLHNtYWxsOiI4OSUiLG1lZGl1bToiMTAwJSIsbGFyZ2U6IjEyMCUiLCJ4LWxhcmdlIjoiMTUwJSIsInh4LWxhcmdlIjoiMjAwJSJ9LGZvbnRXZWlnaHQ6e25vcm1hbDoiNDAwIixib2xkOiI3MDAifSxvdXRsaW5lV2lkdGg6aSx0ZXh0U2hhZG93Ontub25lOiIwcHggMHB4IDBweCB0cmFuc3BhcmVudCJ9LGJveFNoYWRvdzp7bm9uZToiMHB4IDBweCAwcHggMHB4IHRyYW5zcGFyZW50In19O2EuY29udmVydFRvQXJyYXlGb3JtPWUsYS5ub3JtYWxpemVLZXlmcmFtZXM9Zn0oYyxmKSxmdW5jdGlvbihhKXt2YXIgYj17fTthLmlzRGVwcmVjYXRlZD1mdW5jdGlvbihhLGMsZCxlKXt2YXIgZj1lPyJhcmUiOiJpcyIsZz1uZXcgRGF0ZSxoPW5ldyBEYXRlKGMpO3JldHVybiBoLnNldE1vbnRoKGguZ2V0TW9udGgoKSszKSxoPmc/KGEgaW4gYnx8Y29uc29sZS53YXJuKCJXZWIgQW5pbWF0aW9uczogIithKyIgIitmKyIgZGVwcmVjYXRlZCBhbmQgd2lsbCBzdG9wIHdvcmtpbmcgb24gIitoLnRvRGF0ZVN0cmluZygpKyIuICIrZCksYlthXT0hMCwhMSk6ITB9LGEuZGVwcmVjYXRlZD1mdW5jdGlvbihiLGMsZCxlKXt2YXIgZj1lPyJhcmUiOiJpcyI7aWYoYS5pc0RlcHJlY2F0ZWQoYixjLGQsZSkpdGhyb3cgbmV3IEVycm9yKGIrIiAiK2YrIiBubyBsb25nZXIgc3VwcG9ydGVkLiAiK2QpfX0oYyksZnVuY3Rpb24oKXtpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYW5pbWF0ZSl7dmFyIGE9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFuaW1hdGUoW10sMCksYj0hMDtpZihhJiYoYj0hMSwicGxheXxjdXJyZW50VGltZXxwYXVzZXxyZXZlcnNlfHBsYXliYWNrUmF0ZXxjYW5jZWx8ZmluaXNofHN0YXJ0VGltZXxwbGF5U3RhdGUiLnNwbGl0KCJ8IikuZm9yRWFjaChmdW5jdGlvbihjKXt2b2lkIDA9PT1hW2NdJiYoYj0hMCl9KSksIWIpcmV0dXJufSFmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXtmb3IodmFyIGI9e30sYz0wO2M8YS5sZW5ndGg7YysrKWZvcih2YXIgZCBpbiBhW2NdKWlmKCJvZmZzZXQiIT1kJiYiZWFzaW5nIiE9ZCYmImNvbXBvc2l0ZSIhPWQpe3ZhciBlPXtvZmZzZXQ6YVtjXS5vZmZzZXQsZWFzaW5nOmFbY10uZWFzaW5nLHZhbHVlOmFbY11bZF19O2JbZF09YltkXXx8W10sYltkXS5wdXNoKGUpfWZvcih2YXIgZiBpbiBiKXt2YXIgZz1iW2ZdO2lmKDAhPWdbMF0ub2Zmc2V0fHwxIT1nW2cubGVuZ3RoLTFdLm9mZnNldCl0aHJvd3t0eXBlOkRPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUixuYW1lOiJOb3RTdXBwb3J0ZWRFcnJvciIsbWVzc2FnZToiUGFydGlhbCBrZXlmcmFtZXMgYXJlIG5vdCBzdXBwb3J0ZWQifX1yZXR1cm4gYn1mdW5jdGlvbiBlKGMpe3ZhciBkPVtdO2Zvcih2YXIgZSBpbiBjKWZvcih2YXIgZj1jW2VdLGc9MDtnPGYubGVuZ3RoLTE7ZysrKXt2YXIgaD1mW2ddLm9mZnNldCxpPWZbZysxXS5vZmZzZXQsaj1mW2ddLnZhbHVlLGs9ZltnKzFdLnZhbHVlLGw9ZltnXS5lYXNpbmc7aD09aSYmKDE9PWk/aj1rOms9aiksZC5wdXNoKHtzdGFydFRpbWU6aCxlbmRUaW1lOmksZWFzaW5nOmEudG9UaW1pbmdGdW5jdGlvbihsP2w6ImxpbmVhciIpLHByb3BlcnR5OmUsaW50ZXJwb2xhdGlvbjpiLnByb3BlcnR5SW50ZXJwb2xhdGlvbihlLGosayl9KX1yZXR1cm4gZC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3RhcnRUaW1lLWIuc3RhcnRUaW1lfSksZH1iLmNvbnZlcnRFZmZlY3RJbnB1dD1mdW5jdGlvbihjKXt2YXIgZj1hLm5vcm1hbGl6ZUtleWZyYW1lcyhjKSxnPWQoZiksaD1lKGcpO3JldHVybiBmdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpaC5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIDA+PWMmJjA9PWEuc3RhcnRUaW1lfHxjPj0xJiYxPT1hLmVuZFRpbWV8fGM+PWEuc3RhcnRUaW1lJiZjPD1hLmVuZFRpbWV9KS5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPWMtZC5zdGFydFRpbWUsZj1kLmVuZFRpbWUtZC5zdGFydFRpbWUsZz0wPT1mPzA6ZC5lYXNpbmcoZS9mKTtiLmFwcGx5KGEsZC5wcm9wZXJ0eSxkLmludGVycG9sYXRpb24oZykpfSk7ZWxzZSBmb3IodmFyIGQgaW4gZykib2Zmc2V0IiE9ZCYmImVhc2luZyIhPWQmJiJjb21wb3NpdGUiIT1kJiZiLmNsZWFyKGEsZCl9fX0oYyxkLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3JldHVybiBhLnJlcGxhY2UoLy0oLikvZyxmdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9KX1mdW5jdGlvbiBlKGEsYixjKXtoW2NdPWhbY118fFtdLGhbY10ucHVzaChbYSxiXSl9ZnVuY3Rpb24gZihhLGIsYyl7Zm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspe3ZhciBnPWNbZl07ZShhLGIsZChnKSl9fWZ1bmN0aW9uIGcoYyxlLGYpe3ZhciBnPWM7Ly0vLnRlc3QoYykmJiFhLmlzRGVwcmVjYXRlZCgiSHlwaGVuYXRlZCBwcm9wZXJ0eSBuYW1lcyIsIjIwMTYtMDMtMjIiLCJVc2UgY2FtZWxDYXNlIGluc3RlYWQuIiwhMCkmJihnPWQoYykpLCJpbml0aWFsIiE9ZSYmImluaXRpYWwiIT1mfHwoImluaXRpYWwiPT1lJiYoZT1pW2ddKSwiaW5pdGlhbCI9PWYmJihmPWlbZ10pKTtmb3IodmFyIGo9ZT09Zj9bXTpoW2ddLGs9MDtqJiZrPGoubGVuZ3RoO2srKyl7dmFyIGw9altrXVswXShlKSxtPWpba11bMF0oZik7aWYodm9pZCAwIT09bCYmdm9pZCAwIT09bSl7dmFyIG49altrXVsxXShsLG0pO2lmKG4pe3ZhciBvPWIuSW50ZXJwb2xhdGlvbi5hcHBseShudWxsLG4pO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gMD09YT9lOjE9PWE/ZjpvKGEpfX19fXJldHVybiBiLkludGVycG9sYXRpb24oITEsITAsZnVuY3Rpb24oYSl7cmV0dXJuIGE/ZjplfSl9dmFyIGg9e307Yi5hZGRQcm9wZXJ0aWVzSGFuZGxlcj1mO3ZhciBpPXtiYWNrZ3JvdW5kQ29sb3I6InRyYW5zcGFyZW50IixiYWNrZ3JvdW5kUG9zaXRpb246IjAlIDAlIixib3JkZXJCb3R0b21Db2xvcjoiY3VycmVudENvbG9yIixib3JkZXJCb3R0b21MZWZ0UmFkaXVzOiIwcHgiLGJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzOiIwcHgiLGJvcmRlckJvdHRvbVdpZHRoOiIzcHgiLGJvcmRlckxlZnRDb2xvcjoiY3VycmVudENvbG9yIixib3JkZXJMZWZ0V2lkdGg6IjNweCIsYm9yZGVyUmlnaHRDb2xvcjoiY3VycmVudENvbG9yIixib3JkZXJSaWdodFdpZHRoOiIzcHgiLGJvcmRlclNwYWNpbmc6IjJweCIsYm9yZGVyVG9wQ29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyVG9wTGVmdFJhZGl1czoiMHB4Iixib3JkZXJUb3BSaWdodFJhZGl1czoiMHB4Iixib3JkZXJUb3BXaWR0aDoiM3B4Iixib3R0b206ImF1dG8iLGNsaXA6InJlY3QoMHB4LCAwcHgsIDBweCwgMHB4KSIsY29sb3I6ImJsYWNrIixmb250U2l6ZToiMTAwJSIsZm9udFdlaWdodDoiNDAwIixoZWlnaHQ6ImF1dG8iLGxlZnQ6ImF1dG8iLGxldHRlclNwYWNpbmc6Im5vcm1hbCIsbGluZUhlaWdodDoiMTIwJSIsbWFyZ2luQm90dG9tOiIwcHgiLG1hcmdpbkxlZnQ6IjBweCIsbWFyZ2luUmlnaHQ6IjBweCIsbWFyZ2luVG9wOiIwcHgiLG1heEhlaWdodDoibm9uZSIsbWF4V2lkdGg6Im5vbmUiLG1pbkhlaWdodDoiMHB4IixtaW5XaWR0aDoiMHB4IixvcGFjaXR5OiIxLjAiLG91dGxpbmVDb2xvcjoiaW52ZXJ0IixvdXRsaW5lT2Zmc2V0OiIwcHgiLG91dGxpbmVXaWR0aDoiM3B4IixwYWRkaW5nQm90dG9tOiIwcHgiLHBhZGRpbmdMZWZ0OiIwcHgiLHBhZGRpbmdSaWdodDoiMHB4IixwYWRkaW5nVG9wOiIwcHgiLHJpZ2h0OiJhdXRvIix0ZXh0SW5kZW50OiIwcHgiLHRleHRTaGFkb3c6IjBweCAwcHggMHB4IHRyYW5zcGFyZW50Iix0b3A6ImF1dG8iLHRyYW5zZm9ybToiIix2ZXJ0aWNhbEFsaWduOiIwcHgiLHZpc2liaWxpdHk6InZpc2libGUiLHdpZHRoOiJhdXRvIix3b3JkU3BhY2luZzoibm9ybWFsIix6SW5kZXg6ImF1dG8ifTtiLnByb3BlcnR5SW50ZXJwb2xhdGlvbj1nfShjLGQsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYil7dmFyIGM9YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihiKSxkPWZ1bmN0aW9uKGQpe3JldHVybiBhLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihjLGQsYil9O3JldHVybiBkLl90b3RhbER1cmF0aW9uPWIuZGVsYXkrYytiLmVuZERlbGF5LGQuX2lzQ3VycmVudD1mdW5jdGlvbihkKXt2YXIgZT1hLmNhbGN1bGF0ZVBoYXNlKGMsZCxiKTtyZXR1cm4gZT09PVBoYXNlQWN0aXZlfHxlPT09UGhhc2VCZWZvcmV9LGR9Yi5LZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihjLGUsZixnKXt2YXIgaCxpPWQoYS5ub3JtYWxpemVUaW1pbmdJbnB1dChmKSksaj1iLmNvbnZlcnRFZmZlY3RJbnB1dChlKSxrPWZ1bmN0aW9uKCl7aihjLGgpfTtyZXR1cm4gay5fdXBkYXRlPWZ1bmN0aW9uKGEpe3JldHVybiBoPWkoYSksbnVsbCE9PWh9LGsuX2NsZWFyPWZ1bmN0aW9uKCl7aihjLG51bGwpfSxrLl9oYXNTYW1lVGFyZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBjPT09YX0say5faXNDdXJyZW50PWkuX2lzQ3VycmVudCxrLl90b3RhbER1cmF0aW9uPWkuX3RvdGFsRHVyYXRpb24say5faWQ9ZyxrfSxiLk51bGxFZmZlY3Q9ZnVuY3Rpb24oYSl7dmFyIGI9ZnVuY3Rpb24oKXthJiYoYSgpLGE9bnVsbCl9O3JldHVybiBiLl91cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sYi5fdG90YWxEdXJhdGlvbj0wLGIuX2lzQ3VycmVudD1mdW5jdGlvbigpe3JldHVybiExfSxiLl9oYXNTYW1lVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuITF9LGJ9fShjLGQsZiksZnVuY3Rpb24oYSxiKXthLmFwcGx5PWZ1bmN0aW9uKGIsYyxkKXtiLnN0eWxlW2EucHJvcGVydHlOYW1lKGMpXT1kfSxhLmNsZWFyPWZ1bmN0aW9uKGIsYyl7Yi5zdHlsZVthLnByb3BlcnR5TmFtZShjKV09IiJ9fShkLGYpLGZ1bmN0aW9uKGEpe3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9IiI7cmV0dXJuIGMmJmMuaWQmJihkPWMuaWQpLGEudGltZWxpbmUuX3BsYXkoYS5LZXlmcmFtZUVmZmVjdCh0aGlzLGIsYyxkKSl9fShkKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiLGQpe2lmKCJudW1iZXIiPT10eXBlb2YgYSYmIm51bWJlciI9PXR5cGVvZiBiKXJldHVybiBhKigxLWQpK2IqZDtpZigiYm9vbGVhbiI9PXR5cGVvZiBhJiYiYm9vbGVhbiI9PXR5cGVvZiBiKXJldHVybi41PmQ/YTpiO2lmKGEubGVuZ3RoPT1iLmxlbmd0aCl7Zm9yKHZhciBlPVtdLGY9MDtmPGEubGVuZ3RoO2YrKyllLnB1c2goYyhhW2ZdLGJbZl0sZCkpO3JldHVybiBlfXRocm93Ik1pc21hdGNoZWQgaW50ZXJwb2xhdGlvbiBhcmd1bWVudHMgIithKyI6IitifWEuSW50ZXJwb2xhdGlvbj1mdW5jdGlvbihhLGIsZCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBkKGMoYSxiLGUpKX19fShkLGYpLGZ1bmN0aW9uKGEsYixjKXthLnNlcXVlbmNlTnVtYmVyPTA7dmFyIGQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMudGFyZ2V0PWEsdGhpcy5jdXJyZW50VGltZT1iLHRoaXMudGltZWxpbmVUaW1lPWMsdGhpcy50eXBlPSJmaW5pc2giLHRoaXMuYnViYmxlcz0hMSx0aGlzLmNhbmNlbGFibGU9ITEsdGhpcy5jdXJyZW50VGFyZ2V0PWEsdGhpcy5kZWZhdWx0UHJldmVudGVkPSExLHRoaXMuZXZlbnRQaGFzZT1FdmVudC5BVF9UQVJHRVQsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKX07Yi5BbmltYXRpb249ZnVuY3Rpb24oYil7dGhpcy5pZD0iIixiJiZiLl9pZCYmKHRoaXMuaWQ9Yi5faWQpLHRoaXMuX3NlcXVlbmNlTnVtYmVyPWEuc2VxdWVuY2VOdW1iZXIrKyx0aGlzLl9jdXJyZW50VGltZT0wLHRoaXMuX3N0YXJ0VGltZT1udWxsLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9wbGF5YmFja1JhdGU9MSx0aGlzLl9pblRpbWVsaW5lPSEwLHRoaXMuX2ZpbmlzaGVkRmxhZz0hMCx0aGlzLm9uZmluaXNoPW51bGwsdGhpcy5fZmluaXNoSGFuZGxlcnM9W10sdGhpcy5fZWZmZWN0PWIsdGhpcy5faW5FZmZlY3Q9dGhpcy5fZWZmZWN0Ll91cGRhdGUoMCksdGhpcy5faWRsZT0hMCx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITF9LGIuQW5pbWF0aW9uLnByb3RvdHlwZT17X2Vuc3VyZUFsaXZlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5YmFja1JhdGU8MCYmMD09PXRoaXMuY3VycmVudFRpbWU/dGhpcy5faW5FZmZlY3Q9dGhpcy5fZWZmZWN0Ll91cGRhdGUoLTEpOnRoaXMuX2luRWZmZWN0PXRoaXMuX2VmZmVjdC5fdXBkYXRlKHRoaXMuY3VycmVudFRpbWUpLHRoaXMuX2luVGltZWxpbmV8fCF0aGlzLl9pbkVmZmVjdCYmdGhpcy5fZmluaXNoZWRGbGFnfHwodGhpcy5faW5UaW1lbGluZT0hMCxiLnRpbWVsaW5lLl9hbmltYXRpb25zLnB1c2godGhpcykpfSxfdGlja0N1cnJlbnRUaW1lOmZ1bmN0aW9uKGEsYil7YSE9dGhpcy5fY3VycmVudFRpbWUmJih0aGlzLl9jdXJyZW50VGltZT1hLHRoaXMuX2lzRmluaXNoZWQmJiFiJiYodGhpcy5fY3VycmVudFRpbWU9dGhpcy5fcGxheWJhY2tSYXRlPjA/dGhpcy5fdG90YWxEdXJhdGlvbjowKSx0aGlzLl9lbnN1cmVBbGl2ZSgpKX0sZ2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMuX2lkbGV8fHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz9udWxsOnRoaXMuX2N1cnJlbnRUaW1lfSxzZXQgY3VycmVudFRpbWUoYSl7YT0rYSxpc05hTihhKXx8KGIucmVzdGFydCgpLHRoaXMuX3BhdXNlZHx8bnVsbD09dGhpcy5fc3RhcnRUaW1lfHwodGhpcy5fc3RhcnRUaW1lPXRoaXMuX3RpbWVsaW5lLmN1cnJlbnRUaW1lLWEvdGhpcy5fcGxheWJhY2tSYXRlKSx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITEsdGhpcy5fY3VycmVudFRpbWUhPWEmJih0aGlzLl90aWNrQ3VycmVudFRpbWUoYSwhMCksYi5pbnZhbGlkYXRlRWZmZWN0cygpKSl9LGdldCBzdGFydFRpbWUoKXtyZXR1cm4gdGhpcy5fc3RhcnRUaW1lfSxzZXQgc3RhcnRUaW1lKGEpe2E9K2EsaXNOYU4oYSl8fHRoaXMuX3BhdXNlZHx8dGhpcy5faWRsZXx8KHRoaXMuX3N0YXJ0VGltZT1hLHRoaXMuX3RpY2tDdXJyZW50VGltZSgodGhpcy5fdGltZWxpbmUuY3VycmVudFRpbWUtdGhpcy5fc3RhcnRUaW1lKSp0aGlzLnBsYXliYWNrUmF0ZSksYi5pbnZhbGlkYXRlRWZmZWN0cygpKX0sZ2V0IHBsYXliYWNrUmF0ZSgpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9LHNldCBwbGF5YmFja1JhdGUoYSl7aWYoYSE9dGhpcy5fcGxheWJhY2tSYXRlKXt2YXIgYj10aGlzLmN1cnJlbnRUaW1lO3RoaXMuX3BsYXliYWNrUmF0ZT1hLHRoaXMuX3N0YXJ0VGltZT1udWxsLCJwYXVzZWQiIT10aGlzLnBsYXlTdGF0ZSYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5wbGF5KCksbnVsbCE9YiYmKHRoaXMuY3VycmVudFRpbWU9Yil9fSxnZXQgX2lzRmluaXNoZWQoKXtyZXR1cm4hdGhpcy5faWRsZSYmKHRoaXMuX3BsYXliYWNrUmF0ZT4wJiZ0aGlzLl9jdXJyZW50VGltZT49dGhpcy5fdG90YWxEdXJhdGlvbnx8dGhpcy5fcGxheWJhY2tSYXRlPDAmJnRoaXMuX2N1cnJlbnRUaW1lPD0wKX0sZ2V0IF90b3RhbER1cmF0aW9uKCl7cmV0dXJuIHRoaXMuX2VmZmVjdC5fdG90YWxEdXJhdGlvbn0sZ2V0IHBsYXlTdGF0ZSgpe3JldHVybiB0aGlzLl9pZGxlPyJpZGxlIjpudWxsPT10aGlzLl9zdGFydFRpbWUmJiF0aGlzLl9wYXVzZWQmJjAhPXRoaXMucGxheWJhY2tSYXRlfHx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc/InBlbmRpbmciOnRoaXMuX3BhdXNlZD8icGF1c2VkIjp0aGlzLl9pc0ZpbmlzaGVkPyJmaW5pc2hlZCI6InJ1bm5pbmcifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5fcGF1c2VkPSExLCh0aGlzLl9pc0ZpbmlzaGVkfHx0aGlzLl9pZGxlKSYmKHRoaXMuX2N1cnJlbnRUaW1lPXRoaXMuX3BsYXliYWNrUmF0ZT4wPzA6dGhpcy5fdG90YWxEdXJhdGlvbix0aGlzLl9zdGFydFRpbWU9bnVsbCksdGhpcy5fZmluaXNoZWRGbGFnPSExLHRoaXMuX2lkbGU9ITEsdGhpcy5fZW5zdXJlQWxpdmUoKSxiLmludmFsaWRhdGVFZmZlY3RzKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5faXNGaW5pc2hlZHx8dGhpcy5fcGF1c2VkfHx0aGlzLl9pZGxlfHwodGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSEwKSx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLl9wYXVzZWQ9ITB9LGZpbmlzaDpmdW5jdGlvbigpe3RoaXMuX2lkbGV8fCh0aGlzLmN1cnJlbnRUaW1lPXRoaXMuX3BsYXliYWNrUmF0ZT4wP3RoaXMuX3RvdGFsRHVyYXRpb246MCx0aGlzLl9zdGFydFRpbWU9dGhpcy5fdG90YWxEdXJhdGlvbi10aGlzLmN1cnJlbnRUaW1lLHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz0hMSxiLmludmFsaWRhdGVFZmZlY3RzKCkpfSxjYW5jZWw6ZnVuY3Rpb24oKXt0aGlzLl9pbkVmZmVjdCYmKHRoaXMuX2luRWZmZWN0PSExLHRoaXMuX2lkbGU9ITAsdGhpcy5fZmluaXNoZWRGbGFnPSEwLHRoaXMuY3VycmVudFRpbWU9MCx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLl9lZmZlY3QuX3VwZGF0ZShudWxsKSxiLmludmFsaWRhdGVFZmZlY3RzKCkpfSxyZXZlcnNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5YmFja1JhdGUqPS0xLHRoaXMucGxheSgpfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7ImZ1bmN0aW9uIj09dHlwZW9mIGImJiJmaW5pc2giPT1hJiZ0aGlzLl9maW5pc2hIYW5kbGVycy5wdXNoKGIpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7aWYoImZpbmlzaCI9PWEpe3ZhciBjPXRoaXMuX2ZpbmlzaEhhbmRsZXJzLmluZGV4T2YoYik7Yz49MCYmdGhpcy5fZmluaXNoSGFuZGxlcnMuc3BsaWNlKGMsMSl9fSxfZmlyZUV2ZW50czpmdW5jdGlvbihhKXtpZih0aGlzLl9pc0ZpbmlzaGVkKXtpZighdGhpcy5fZmluaXNoZWRGbGFnKXt2YXIgYj1uZXcgZCh0aGlzLHRoaXMuX2N1cnJlbnRUaW1lLGEpLGM9dGhpcy5fZmluaXNoSGFuZGxlcnMuY29uY2F0KHRoaXMub25maW5pc2g/W3RoaXMub25maW5pc2hdOltdKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY2FsbChiLnRhcmdldCxiKX0pfSwwKSx0aGlzLl9maW5pc2hlZEZsYWc9ITB9fWVsc2UgdGhpcy5fZmluaXNoZWRGbGFnPSExfSxfdGljazpmdW5jdGlvbihhLGIpe3RoaXMuX2lkbGV8fHRoaXMuX3BhdXNlZHx8KG51bGw9PXRoaXMuX3N0YXJ0VGltZT9iJiYodGhpcy5zdGFydFRpbWU9YS10aGlzLl9jdXJyZW50VGltZS90aGlzLnBsYXliYWNrUmF0ZSk6dGhpcy5faXNGaW5pc2hlZHx8dGhpcy5fdGlja0N1cnJlbnRUaW1lKChhLXRoaXMuX3N0YXJ0VGltZSkqdGhpcy5wbGF5YmFja1JhdGUpKSxiJiYodGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSExLHRoaXMuX2ZpcmVFdmVudHMoYSkpfSxnZXQgX25lZWRzVGljaygpe3JldHVybiB0aGlzLnBsYXlTdGF0ZSBpbntwZW5kaW5nOjEscnVubmluZzoxfXx8IXRoaXMuX2ZpbmlzaGVkRmxhZ319fShjLGQsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9ajtqPVtdLGE8cC5jdXJyZW50VGltZSYmKGE9cC5jdXJyZW50VGltZSksaChhLCEwKSxiLmZvckVhY2goZnVuY3Rpb24oYil7YlsxXShhKX0pLGcoKSxsPXZvaWQgMH1mdW5jdGlvbiBlKGEsYil7cmV0dXJuIGEuX3NlcXVlbmNlTnVtYmVyLWIuX3NlcXVlbmNlTnVtYmVyfWZ1bmN0aW9uIGYoKXt0aGlzLl9hbmltYXRpb25zPVtdLHRoaXMuY3VycmVudFRpbWU9d2luZG93LnBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2Uubm93KCk6MH1mdW5jdGlvbiBnKCl7by5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EoKX0pLG8ubGVuZ3RoPTB9ZnVuY3Rpb24gaChhLGMpe249ITE7dmFyIGQ9Yi50aW1lbGluZTtkLmN1cnJlbnRUaW1lPWEsZC5fYW5pbWF0aW9ucy5zb3J0KGUpLG09ITE7dmFyIGY9ZC5fYW5pbWF0aW9ucztkLl9hbmltYXRpb25zPVtdO3ZhciBnPVtdLGg9W107Zj1mLmZpbHRlcihmdW5jdGlvbihiKXtiLl90aWNrKGEsYyksYi5faW5FZmZlY3Q/aC5wdXNoKGIuX2VmZmVjdCk6Zy5wdXNoKGIuX2VmZmVjdCksYi5fbmVlZHNUaWNrJiYobT0hMCk7dmFyIGQ9Yi5faW5FZmZlY3R8fGIuX25lZWRzVGljaztyZXR1cm4gYi5faW5UaW1lbGluZT1kLGR9KSxvLnB1c2guYXBwbHkobyxnKSxvLnB1c2guYXBwbHkobyxoKSxkLl9hbmltYXRpb25zLnB1c2guYXBwbHkoZC5fYW5pbWF0aW9ucyxmKSxtJiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt9KX12YXIgaT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLGo9W10saz0wO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7dmFyIGI9aysrO3JldHVybiAwPT1qLmxlbmd0aCYmaShkKSxqLnB1c2goW2IsYV0pLGJ9LHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZT1mdW5jdGlvbihhKXtqLmZvckVhY2goZnVuY3Rpb24oYil7YlswXT09YSYmKGJbMV09ZnVuY3Rpb24oKXt9KX0pfSxmLnByb3RvdHlwZT17X3BsYXk6ZnVuY3Rpb24oYyl7Yy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYy50aW1pbmcpO3ZhciBkPW5ldyBiLkFuaW1hdGlvbihjKTtyZXR1cm4gZC5faWRsZT0hMSxkLl90aW1lbGluZT10aGlzLHRoaXMuX2FuaW1hdGlvbnMucHVzaChkKSxiLnJlc3RhcnQoKSxiLmludmFsaWRhdGVFZmZlY3RzKCksZH19O3ZhciBsPXZvaWQgMCxtPSExLG49ITE7Yi5yZXN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIG18fChtPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe30pLG49ITApLG59LGIuaW52YWxpZGF0ZUVmZmVjdHM9ZnVuY3Rpb24oKXtoKGIudGltZWxpbmUuY3VycmVudFRpbWUsITEpLGcoKX07dmFyIG89W10scD1uZXcgZjtiLnRpbWVsaW5lPXB9KGMsZCxmKSxmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9YS5leGVjKGIpO3JldHVybiBjPyhjPWEuaWdub3JlQ2FzZT9jWzBdLnRvTG93ZXJDYXNlKCk6Y1swXSxbYyxiLnN1YnN0cihjLmxlbmd0aCldKTp2b2lkIDB9ZnVuY3Rpb24gYyhhLGIpe2I9Yi5yZXBsYWNlKC9eXHMqLywiIik7dmFyIGM9YShiKTtyZXR1cm4gYz9bY1swXSxjWzFdLnJlcGxhY2UoL15ccyovLCIiKV06dm9pZCAwfWZ1bmN0aW9uIGQoYSxkLGUpe2E9Yy5iaW5kKG51bGwsYSk7Zm9yKHZhciBmPVtdOzspe3ZhciBnPWEoZSk7aWYoIWcpcmV0dXJuW2YsZV07aWYoZi5wdXNoKGdbMF0pLGU9Z1sxXSxnPWIoZCxlKSwhZ3x8IiI9PWdbMV0pcmV0dXJuW2YsZV07ZT1nWzFdfX1mdW5jdGlvbiBlKGEsYil7Zm9yKHZhciBjPTAsZD0wO2Q8Yi5sZW5ndGgmJighL1xzfCwvLnRlc3QoYltkXSl8fDAhPWMpO2QrKylpZigiKCI9PWJbZF0pYysrO2Vsc2UgaWYoIikiPT1iW2RdJiYoYy0tLDA9PWMmJmQrKywwPj1jKSlicmVhazt2YXIgZT1hKGIuc3Vic3RyKDAsZCkpO3JldHVybiB2b2lkIDA9PWU/dm9pZCAwOltlLGIuc3Vic3RyKGQpXX1mdW5jdGlvbiBmKGEsYil7Zm9yKHZhciBjPWEsZD1iO2MmJmQ7KWM+ZD9jJT1kOmQlPWM7cmV0dXJuIGM9YSpiLyhjK2QpfWZ1bmN0aW9uIGcoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWEoYik7cmV0dXJuIGMmJihjWzBdPXZvaWQgMCksY319ZnVuY3Rpb24gaChhLGIpe3JldHVybiBmdW5jdGlvbihjKXt2YXIgZD1hKGMpO3JldHVybiBkP2Q6W2IsY119fWZ1bmN0aW9uIGkoYixjKXtmb3IodmFyIGQ9W10sZT0wO2U8Yi5sZW5ndGg7ZSsrKXt2YXIgZj1hLmNvbnN1bWVUcmltbWVkKGJbZV0sYyk7aWYoIWZ8fCIiPT1mWzBdKXJldHVybjt2b2lkIDAhPT1mWzBdJiZkLnB1c2goZlswXSksYz1mWzFdfXJldHVybiIiPT1jP2Q6dm9pZCAwfWZ1bmN0aW9uIGooYSxiLGMsZCxlKXtmb3IodmFyIGc9W10saD1bXSxpPVtdLGo9ZihkLmxlbmd0aCxlLmxlbmd0aCksaz0wO2o+aztrKyspe3ZhciBsPWIoZFtrJWQubGVuZ3RoXSxlW2slZS5sZW5ndGhdKTtpZighbClyZXR1cm47Zy5wdXNoKGxbMF0pLGgucHVzaChsWzFdKSxpLnB1c2gobFsyXSl9cmV0dXJuW2csaCxmdW5jdGlvbihiKXt2YXIgZD1iLm1hcChmdW5jdGlvbihhLGIpe3JldHVybiBpW2JdKGEpfSkuam9pbihjKTtyZXR1cm4gYT9hKGQpOmR9XX1mdW5jdGlvbiBrKGEsYixjKXtmb3IodmFyIGQ9W10sZT1bXSxmPVtdLGc9MCxoPTA7aDxjLmxlbmd0aDtoKyspaWYoImZ1bmN0aW9uIj09dHlwZW9mIGNbaF0pe3ZhciBpPWNbaF0oYVtnXSxiW2crK10pO2QucHVzaChpWzBdKSxlLnB1c2goaVsxXSksZi5wdXNoKGlbMl0pfWVsc2UhZnVuY3Rpb24oYSl7ZC5wdXNoKCExKSxlLnB1c2goITEpLGYucHVzaChmdW5jdGlvbigpe3JldHVybiBjW2FdfSl9KGgpO3JldHVybltkLGUsZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKyliKz1mW2NdKGFbY10pO3JldHVybiBifV19YS5jb25zdW1lVG9rZW49YixhLmNvbnN1bWVUcmltbWVkPWMsYS5jb25zdW1lUmVwZWF0ZWQ9ZCxhLmNvbnN1bWVQYXJlbnRoZXNpc2VkPWUsYS5pZ25vcmU9ZyxhLm9wdGlvbmFsPWgsYS5jb25zdW1lTGlzdD1pLGEubWVyZ2VOZXN0ZWRSZXBlYXRlZD1qLmJpbmQobnVsbCxudWxsKSxhLm1lcmdlV3JhcHBlZE5lc3RlZFJlcGVhdGVkPWosYS5tZXJnZUxpc3Q9a30oZCksZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiKXtmdW5jdGlvbiBjKGIpe3ZhciBjPWEuY29uc3VtZVRva2VuKC9eaW5zZXQvaSxiKTtpZihjKXJldHVybiBkLmluc2V0PSEwLGM7dmFyIGM9YS5jb25zdW1lTGVuZ3RoT3JQZXJjZW50KGIpO2lmKGMpcmV0dXJuIGQubGVuZ3Rocy5wdXNoKGNbMF0pLGM7dmFyIGM9YS5jb25zdW1lQ29sb3IoYik7cmV0dXJuIGM/KGQuY29sb3I9Y1swXSxjKTp2b2lkIDB9dmFyIGQ9e2luc2V0OiExLGxlbmd0aHM6W10sY29sb3I6bnVsbH0sZT1hLmNvbnN1bWVSZXBlYXRlZChjLC9eLyxiKTtyZXR1cm4gZSYmZVswXS5sZW5ndGg/W2QsZVsxXV06dm9pZCAwfWZ1bmN0aW9uIGMoYyl7dmFyIGQ9YS5jb25zdW1lUmVwZWF0ZWQoYiwvXiwvLGMpO3JldHVybiBkJiYiIj09ZFsxXT9kWzBdOnZvaWQgMH1mdW5jdGlvbiBkKGIsYyl7Zm9yKDtiLmxlbmd0aHMubGVuZ3RoPE1hdGgubWF4KGIubGVuZ3Rocy5sZW5ndGgsYy5sZW5ndGhzLmxlbmd0aCk7KWIubGVuZ3Rocy5wdXNoKHtweDowfSk7Zm9yKDtjLmxlbmd0aHMubGVuZ3RoPE1hdGgubWF4KGIubGVuZ3Rocy5sZW5ndGgsYy5sZW5ndGhzLmxlbmd0aCk7KWMubGVuZ3Rocy5wdXNoKHtweDowfSk7aWYoYi5pbnNldD09Yy5pbnNldCYmISFiLmNvbG9yPT0hIWMuY29sb3Ipe2Zvcih2YXIgZCxlPVtdLGY9W1tdLDBdLGc9W1tdLDBdLGg9MDtoPGIubGVuZ3Rocy5sZW5ndGg7aCsrKXt2YXIgaT1hLm1lcmdlRGltZW5zaW9ucyhiLmxlbmd0aHNbaF0sYy5sZW5ndGhzW2hdLDI9PWgpO2ZbMF0ucHVzaChpWzBdKSxnWzBdLnB1c2goaVsxXSksZS5wdXNoKGlbMl0pfWlmKGIuY29sb3ImJmMuY29sb3Ipe3ZhciBqPWEubWVyZ2VDb2xvcnMoYi5jb2xvcixjLmNvbG9yKTtmWzFdPWpbMF0sZ1sxXT1qWzFdLGQ9alsyXX1yZXR1cm5bZixnLGZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1iLmluc2V0PyJpbnNldCAiOiIgIixmPTA7ZjxlLmxlbmd0aDtmKyspYys9ZVtmXShhWzBdW2ZdKSsiICI7cmV0dXJuIGQmJihjKz1kKGFbMV0pKSxjfV19fWZ1bmN0aW9uIGUoYixjLGQsZSl7ZnVuY3Rpb24gZihhKXtyZXR1cm57aW5zZXQ6YSxjb2xvcjpbMCwwLDAsMF0sbGVuZ3Roczpbe3B4OjB9LHtweDowfSx7cHg6MH0se3B4OjB9XX19Zm9yKHZhciBnPVtdLGg9W10saT0wO2k8ZC5sZW5ndGh8fGk8ZS5sZW5ndGg7aSsrKXt2YXIgaj1kW2ldfHxmKGVbaV0uaW5zZXQpLGs9ZVtpXXx8ZihkW2ldLmluc2V0KTtnLnB1c2goaiksaC5wdXNoKGspfXJldHVybiBhLm1lcmdlTmVzdGVkUmVwZWF0ZWQoYixjLGcsaCl9dmFyIGY9ZS5iaW5kKG51bGwsZCwiLCAiKTthLmFkZFByb3BlcnRpZXNIYW5kbGVyKGMsZixbImJveC1zaGFkb3ciLCJ0ZXh0LXNoYWRvdyJdKX0oZCksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe3JldHVybiBhLnRvRml4ZWQoMykucmVwbGFjZSgiLjAwMCIsIiIpfWZ1bmN0aW9uIGQoYSxiLGMpe3JldHVybiBNYXRoLm1pbihiLE1hdGgubWF4KGEsYykpfWZ1bmN0aW9uIGUoYSl7cmV0dXJuL15ccypbLStdPyhcZCpcLik/XGQrXHMqJC8udGVzdChhKT9OdW1iZXIoYSk6dm9pZCAwfWZ1bmN0aW9uIGYoYSxiKXtyZXR1cm5bYSxiLGNdfWZ1bmN0aW9uIGcoYSxiKXtyZXR1cm4gMCE9YT9pKDAsMS8wKShhLGIpOnZvaWQgMH1mdW5jdGlvbiBoKGEsYil7cmV0dXJuW2EsYixmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChkKDEsMS8wLGEpKX1dfWZ1bmN0aW9uIGkoYSxiKXtyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm5bZSxmLGZ1bmN0aW9uKGUpe3JldHVybiBjKGQoYSxiLGUpKX1dfX1mdW5jdGlvbiBqKGEsYil7cmV0dXJuW2EsYixNYXRoLnJvdW5kXX1hLmNsYW1wPWQsYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGkoMCwxLzApLFsiYm9yZGVyLWltYWdlLXdpZHRoIiwibGluZS1oZWlnaHQiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGkoMCwxKSxbIm9wYWNpdHkiLCJzaGFwZS1pbWFnZS10aHJlc2hvbGQiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGcsWyJmbGV4LWdyb3ciLCJmbGV4LXNocmluayJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsaCxbIm9ycGhhbnMiLCJ3aWRvd3MiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGosWyJ6LWluZGV4Il0pLGEucGFyc2VOdW1iZXI9ZSxhLm1lcmdlTnVtYmVycz1mLGEubnVtYmVyVG9TdHJpbmc9Y30oZCxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtyZXR1cm4idmlzaWJsZSI9PWF8fCJ2aXNpYmxlIj09Yj9bMCwxLGZ1bmN0aW9uKGMpe3JldHVybiAwPj1jP2E6Yz49MT9iOiJ2aXNpYmxlIn1dOnZvaWQgMH1hLmFkZFByb3BlcnRpZXNIYW5kbGVyKFN0cmluZyxjLFsidmlzaWJpbGl0eSJdKX0oZCksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe2E9YS50cmltKCksZi5maWxsU3R5bGU9IiMwMDAiLGYuZmlsbFN0eWxlPWE7dmFyIGI9Zi5maWxsU3R5bGU7aWYoZi5maWxsU3R5bGU9IiNmZmYiLGYuZmlsbFN0eWxlPWEsYj09Zi5maWxsU3R5bGUpe2YuZmlsbFJlY3QoMCwwLDEsMSk7dmFyIGM9Zi5nZXRJbWFnZURhdGEoMCwwLDEsMSkuZGF0YTtmLmNsZWFyUmVjdCgwLDAsMSwxKTt2YXIgZD1jWzNdLzI1NTtyZXR1cm5bY1swXSpkLGNbMV0qZCxjWzJdKmQsZF19fWZ1bmN0aW9uIGQoYixjKXtyZXR1cm5bYixjLGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMjU1LGEpKX1pZihiWzNdKWZvcih2YXIgZD0wOzM+ZDtkKyspYltkXT1NYXRoLnJvdW5kKGMoYltkXS9iWzNdKSk7cmV0dXJuIGJbM109YS5udW1iZXJUb1N0cmluZyhhLmNsYW1wKDAsMSxiWzNdKSksInJnYmEoIitiLmpvaW4oIiwiKSsiKSJ9XX12YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJjYW52YXMiKTtlLndpZHRoPWUuaGVpZ2h0PTE7dmFyIGY9ZS5nZXRDb250ZXh0KCIyZCIpO2EuYWRkUHJvcGVydGllc0hhbmRsZXIoYyxkLFsiYmFja2dyb3VuZC1jb2xvciIsImJvcmRlci1ib3R0b20tY29sb3IiLCJib3JkZXItbGVmdC1jb2xvciIsImJvcmRlci1yaWdodC1jb2xvciIsImJvcmRlci10b3AtY29sb3IiLCJjb2xvciIsIm91dGxpbmUtY29sb3IiLCJ0ZXh0LWRlY29yYXRpb24tY29sb3IiXSksYS5jb25zdW1lQ29sb3I9YS5jb25zdW1lUGFyZW50aGVzaXNlZC5iaW5kKG51bGwsYyksYS5tZXJnZUNvbG9ycz1kfShkLGYpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGI9Yi50cmltKCkudG9Mb3dlckNhc2UoKSwiMCI9PWImJiJweCIuc2VhcmNoKGEpPj0wKXJldHVybntweDowfTtpZigvXlteKF0qJHxeY2FsYy8udGVzdChiKSl7Yj1iLnJlcGxhY2UoL2NhbGNcKC9nLCIoIik7dmFyIGM9e307Yj1iLnJlcGxhY2UoYSxmdW5jdGlvbihhKXtyZXR1cm4gY1thXT1udWxsLCJVIithfSk7Zm9yKHZhciBkPSJVKCIrYS5zb3VyY2UrIikiLGU9Yi5yZXBsYWNlKC9bLStdPyhcZCpcLik/XGQrL2csIk4iKS5yZXBsYWNlKG5ldyBSZWdFeHAoIk4iK2QsImciKSwiRCIpLnJlcGxhY2UoL1xzWystXVxzL2csIk8iKS5yZXBsYWNlKC9ccy9nLCIiKSxmPVsvTlwqKEQpL2csLyhOfEQpWypcL11OL2csLyhOfEQpT1wxL2csL1woKE58RClcKS9nXSxnPTA7ZzxmLmxlbmd0aDspZltnXS50ZXN0KGUpPyhlPWUucmVwbGFjZShmW2ddLCIkMSIpLGc9MCk6ZysrO2lmKCJEIj09ZSl7Zm9yKHZhciBoIGluIGMpe3ZhciBpPWV2YWwoYi5yZXBsYWNlKG5ldyBSZWdFeHAoIlUiK2gsImciKSwiIikucmVwbGFjZShuZXcgUmVnRXhwKGQsImciKSwiKjAiKSk7aWYoIWlzRmluaXRlKGkpKXJldHVybjtjW2hdPWl9cmV0dXJuIGN9fX1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGUoYSxiLCEwKX1mdW5jdGlvbiBlKGIsYyxkKXt2YXIgZSxmPVtdO2ZvcihlIGluIGIpZi5wdXNoKGUpO2ZvcihlIGluIGMpZi5pbmRleE9mKGUpPDAmJmYucHVzaChlKTtyZXR1cm4gYj1mLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYlthXXx8MH0pLGM9Zi5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGNbYV18fDB9KSxbYixjLGZ1bmN0aW9uKGIpe3ZhciBjPWIubWFwKGZ1bmN0aW9uKGMsZSl7cmV0dXJuIDE9PWIubGVuZ3RoJiZkJiYoYz1NYXRoLm1heChjLDApKSxhLm51bWJlclRvU3RyaW5nKGMpK2ZbZV19KS5qb2luKCIgKyAiKTtyZXR1cm4gYi5sZW5ndGg+MT8iY2FsYygiK2MrIikiOmN9XX12YXIgZj0icHh8ZW18ZXh8Y2h8cmVtfHZ3fHZofHZtaW58dm1heHxjbXxtbXxpbnxwdHxwYyIsZz1jLmJpbmQobnVsbCxuZXcgUmVnRXhwKGYsImciKSksaD1jLmJpbmQobnVsbCxuZXcgUmVnRXhwKGYrInwlIiwiZyIpKSxpPWMuYmluZChudWxsLC9kZWd8cmFkfGdyYWR8dHVybi9nKTthLnBhcnNlTGVuZ3RoPWcsYS5wYXJzZUxlbmd0aE9yUGVyY2VudD1oLGEuY29uc3VtZUxlbmd0aE9yUGVyY2VudD1hLmNvbnN1bWVQYXJlbnRoZXNpc2VkLmJpbmQobnVsbCxoKSxhLnBhcnNlQW5nbGU9aSxhLm1lcmdlRGltZW5zaW9ucz1lO3ZhciBqPWEuY29uc3VtZVBhcmVudGhlc2lzZWQuYmluZChudWxsLGcpLGs9YS5jb25zdW1lUmVwZWF0ZWQuYmluZCh2b2lkIDAsaiwvXi8pLGw9YS5jb25zdW1lUmVwZWF0ZWQuYmluZCh2b2lkIDAsaywvXiwvKTthLmNvbnN1bWVTaXplUGFpckxpc3Q9bDt2YXIgbT1mdW5jdGlvbihhKXt2YXIgYj1sKGEpO3JldHVybiBiJiYiIj09YlsxXT9iWzBdOnZvaWQgMH0sbj1hLm1lcmdlTmVzdGVkUmVwZWF0ZWQuYmluZCh2b2lkIDAsZCwiICIpLG89YS5tZXJnZU5lc3RlZFJlcGVhdGVkLmJpbmQodm9pZCAwLG4sIiwiKTthLm1lcmdlTm9uTmVnYXRpdmVTaXplUGFpcj1uLGEuYWRkUHJvcGVydGllc0hhbmRsZXIobSxvLFsiYmFja2dyb3VuZC1zaXplIl0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoaCxkLFsiYm9yZGVyLWJvdHRvbS13aWR0aCIsImJvcmRlci1pbWFnZS13aWR0aCIsImJvcmRlci1sZWZ0LXdpZHRoIiwiYm9yZGVyLXJpZ2h0LXdpZHRoIiwiYm9yZGVyLXRvcC13aWR0aCIsImZsZXgtYmFzaXMiLCJmb250LXNpemUiLCJoZWlnaHQiLCJsaW5lLWhlaWdodCIsIm1heC1oZWlnaHQiLCJtYXgtd2lkdGgiLCJvdXRsaW5lLXdpZHRoIiwid2lkdGgiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihoLGUsWyJib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzIiwiYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXMiLCJib3JkZXItdG9wLWxlZnQtcmFkaXVzIiwiYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMiLCJib3R0b20iLCJsZWZ0IiwibGV0dGVyLXNwYWNpbmciLCJtYXJnaW4tYm90dG9tIiwibWFyZ2luLWxlZnQiLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW4tdG9wIiwibWluLWhlaWdodCIsIm1pbi13aWR0aCIsIm91dGxpbmUtb2Zmc2V0IiwicGFkZGluZy1ib3R0b20iLCJwYWRkaW5nLWxlZnQiLCJwYWRkaW5nLXJpZ2h0IiwicGFkZGluZy10b3AiLCJwZXJzcGVjdGl2ZSIsInJpZ2h0Iiwic2hhcGUtbWFyZ2luIiwidGV4dC1pbmRlbnQiLCJ0b3AiLCJ2ZXJ0aWNhbC1hbGlnbiIsIndvcmQtc3BhY2luZyJdKX0oZCxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYil7cmV0dXJuIGEuY29uc3VtZUxlbmd0aE9yUGVyY2VudChiKXx8YS5jb25zdW1lVG9rZW4oL15hdXRvLyxiKX1mdW5jdGlvbiBkKGIpe3ZhciBkPWEuY29uc3VtZUxpc3QoW2EuaWdub3JlKGEuY29uc3VtZVRva2VuLmJpbmQobnVsbCwvXnJlY3QvKSksYS5pZ25vcmUoYS5jb25zdW1lVG9rZW4uYmluZChudWxsLC9eXCgvKSksYS5jb25zdW1lUmVwZWF0ZWQuYmluZChudWxsLGMsL14sLyksYS5pZ25vcmUoYS5jb25zdW1lVG9rZW4uYmluZChudWxsLC9eXCkvKSldLGIpO3JldHVybiBkJiY0PT1kWzBdLmxlbmd0aD9kWzBdOnZvaWQgMH1mdW5jdGlvbiBlKGIsYyl7cmV0dXJuImF1dG8iPT1ifHwiYXV0byI9PWM/WyEwLCExLGZ1bmN0aW9uKGQpe3ZhciBlPWQ/YjpjO2lmKCJhdXRvIj09ZSlyZXR1cm4iYXV0byI7dmFyIGY9YS5tZXJnZURpbWVuc2lvbnMoZSxlKTtyZXR1cm4gZlsyXShmWzBdKX1dOmEubWVyZ2VEaW1lbnNpb25zKGIsYyl9ZnVuY3Rpb24gZihhKXtyZXR1cm4icmVjdCgiK2ErIikifXZhciBnPWEubWVyZ2VXcmFwcGVkTmVzdGVkUmVwZWF0ZWQuYmluZChudWxsLGYsZSwiLCAiKTthLnBhcnNlQm94PWQsYS5tZXJnZUJveGVzPWcsYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihkLGcsWyJjbGlwIl0pfShkLGYpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9MDtyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1rP2JbYysrXTphfSl9fWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGF9ZnVuY3Rpb24gZShiKXtpZihiPWIudG9Mb3dlckNhc2UoKS50cmltKCksIm5vbmUiPT1iKXJldHVybltdO2Zvcih2YXIgYyxkPS9ccyooXHcrKVwoKFteKV0qKVwpL2csZT1bXSxmPTA7Yz1kLmV4ZWMoYik7KXtpZihjLmluZGV4IT1mKXJldHVybjtmPWMuaW5kZXgrY1swXS5sZW5ndGg7dmFyIGc9Y1sxXSxoPW5bZ107aWYoIWgpcmV0dXJuO3ZhciBpPWNbMl0uc3BsaXQoIiwiKSxqPWhbMF07aWYoai5sZW5ndGg8aS5sZW5ndGgpcmV0dXJuO2Zvcih2YXIgaz1bXSxvPTA7bzxqLmxlbmd0aDtvKyspe3ZhciBwLHE9aVtvXSxyPWpbb107aWYocD1xP3tBOmZ1bmN0aW9uKGIpe3JldHVybiIwIj09Yi50cmltKCk/bTphLnBhcnNlQW5nbGUoYil9LE46YS5wYXJzZU51bWJlcixUOmEucGFyc2VMZW5ndGhPclBlcmNlbnQsTDphLnBhcnNlTGVuZ3RofVtyLnRvVXBwZXJDYXNlKCldKHEpOnthOm0sbjprWzBdLHQ6bH1bcl0sdm9pZCAwPT09cClyZXR1cm47ay5wdXNoKHApfWlmKGUucHVzaCh7dDpnLGQ6a30pLGQubGFzdEluZGV4PT1iLmxlbmd0aClyZXR1cm4gZX19ZnVuY3Rpb24gZihhKXtyZXR1cm4gYS50b0ZpeGVkKDYpLnJlcGxhY2UoIi4wMDAwMDAiLCIiKX1mdW5jdGlvbiBnKGIsYyl7aWYoYi5kZWNvbXBvc2l0aW9uUGFpciE9PWMpe2IuZGVjb21wb3NpdGlvblBhaXI9Yzt2YXIgZD1hLm1ha2VNYXRyaXhEZWNvbXBvc2l0aW9uKGIpfWlmKGMuZGVjb21wb3NpdGlvblBhaXIhPT1iKXtjLmRlY29tcG9zaXRpb25QYWlyPWI7dmFyIGU9YS5tYWtlTWF0cml4RGVjb21wb3NpdGlvbihjKX1yZXR1cm4gbnVsbD09ZFswXXx8bnVsbD09ZVswXT9bWyExXSxbITBdLGZ1bmN0aW9uKGEpe3JldHVybiBhP2NbMF0uZDpiWzBdLmR9XTooZFswXS5wdXNoKDApLGVbMF0ucHVzaCgxKSxbZCxlLGZ1bmN0aW9uKGIpe3ZhciBjPWEucXVhdChkWzBdWzNdLGVbMF1bM10sYls1XSksZz1hLmNvbXBvc2VNYXRyaXgoYlswXSxiWzFdLGJbMl0sYyxiWzRdKSxoPWcubWFwKGYpLmpvaW4oIiwiKTtyZXR1cm4gaH1dKX1mdW5jdGlvbiBoKGEpe3JldHVybiBhLnJlcGxhY2UoL1t4eV0vLCIiKX1mdW5jdGlvbiBpKGEpe3JldHVybiBhLnJlcGxhY2UoLyh4fHl8enwzZCk/JC8sIjNkIil9ZnVuY3Rpb24gaihiLGMpe3ZhciBkPWEubWFrZU1hdHJpeERlY29tcG9zaXRpb24mJiEwLGU9ITE7aWYoIWIubGVuZ3RofHwhYy5sZW5ndGgpe2IubGVuZ3RofHwoZT0hMCxiPWMsYz1bXSk7Zm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspe3ZhciBqPWJbZl0udCxrPWJbZl0uZCxsPSJzY2FsZSI9PWouc3Vic3RyKDAsNSk/MTowO2MucHVzaCh7dDpqLGQ6ay5tYXAoZnVuY3Rpb24oYSl7aWYoIm51bWJlciI9PXR5cGVvZiBhKXJldHVybiBsO3ZhciBiPXt9O2Zvcih2YXIgYyBpbiBhKWJbY109bDtyZXR1cm4gYn0pfSl9fXZhciBtPWZ1bmN0aW9uKGEsYil7cmV0dXJuInBlcnNwZWN0aXZlIj09YSYmInBlcnNwZWN0aXZlIj09Ynx8KCJtYXRyaXgiPT1hfHwibWF0cml4M2QiPT1hKSYmKCJtYXRyaXgiPT1ifHwibWF0cml4M2QiPT1iKX0sbz1bXSxwPVtdLHE9W107aWYoYi5sZW5ndGghPWMubGVuZ3RoKXtpZighZClyZXR1cm47dmFyIHI9ZyhiLGMpO289W3JbMF1dLHA9W3JbMV1dLHE9W1sibWF0cml4IixbclsyXV1dXX1lbHNlIGZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKXt2YXIgaixzPWJbZl0udCx0PWNbZl0udCx1PWJbZl0uZCx2PWNbZl0uZCx3PW5bc10seD1uW3RdO2lmKG0ocyx0KSl7aWYoIWQpcmV0dXJuO3ZhciByPWcoW2JbZl1dLFtjW2ZdXSk7by5wdXNoKHJbMF0pLHAucHVzaChyWzFdKSxxLnB1c2goWyJtYXRyaXgiLFtyWzJdXV0pfWVsc2V7aWYocz09dClqPXM7ZWxzZSBpZih3WzJdJiZ4WzJdJiZoKHMpPT1oKHQpKWo9aChzKSx1PXdbMl0odSksdj14WzJdKHYpO2Vsc2V7aWYoIXdbMV18fCF4WzFdfHxpKHMpIT1pKHQpKXtpZighZClyZXR1cm47dmFyIHI9ZyhiLGMpO289W3JbMF1dLHA9W3JbMV1dLHE9W1sibWF0cml4IixbclsyXV1dXTticmVha31qPWkocyksdT13WzFdKHUpLHY9eFsxXSh2KX1mb3IodmFyIHk9W10sej1bXSxBPVtdLEI9MDtCPHUubGVuZ3RoO0IrKyl7dmFyIEM9Im51bWJlciI9PXR5cGVvZiB1W0JdP2EubWVyZ2VOdW1iZXJzOmEubWVyZ2VEaW1lbnNpb25zLHI9Qyh1W0JdLHZbQl0pO3lbQl09clswXSx6W0JdPXJbMV0sQS5wdXNoKHJbMl0pfW8ucHVzaCh5KSxwLnB1c2goeikscS5wdXNoKFtqLEFdKX19aWYoZSl7dmFyIEQ9bztvPXAscD1EfXJldHVybltvLHAsZnVuY3Rpb24oYSl7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS5tYXAoZnVuY3Rpb24oYSxjKXtyZXR1cm4gcVtiXVsxXVtjXShhKX0pLmpvaW4oIiwiKTtyZXR1cm4ibWF0cml4Ij09cVtiXVswXSYmMTY9PWMuc3BsaXQoIiwiKS5sZW5ndGgmJihxW2JdWzBdPSJtYXRyaXgzZCIpLHFbYl1bMF0rIigiK2MrIikifSkuam9pbigiICIpfV19dmFyIGs9bnVsbCxsPXtweDowfSxtPXtkZWc6MH0sbj17bWF0cml4OlsiTk5OTk5OIixbayxrLDAsMCxrLGssMCwwLDAsMCwxLDAsayxrLDAsMV0sZF0sbWF0cml4M2Q6WyJOTk5OTk5OTk5OTk5OTk5OIixkXSxyb3RhdGU6WyJBIl0scm90YXRleDpbIkEiXSxyb3RhdGV5OlsiQSJdLHJvdGF0ZXo6WyJBIl0scm90YXRlM2Q6WyJOTk5BIl0scGVyc3BlY3RpdmU6WyJMIl0sc2NhbGU6WyJObiIsYyhbayxrLDFdKSxkXSxzY2FsZXg6WyJOIixjKFtrLDEsMV0pLGMoW2ssMV0pXSxzY2FsZXk6WyJOIixjKFsxLGssMV0pLGMoWzEsa10pXSxzY2FsZXo6WyJOIixjKFsxLDEsa10pXSxzY2FsZTNkOlsiTk5OIixkXSxza2V3OlsiQWEiLG51bGwsZF0sc2tld3g6WyJBIixudWxsLGMoW2ssbV0pXSxza2V3eTpbIkEiLG51bGwsYyhbbSxrXSldLHRyYW5zbGF0ZTpbIlR0IixjKFtrLGssbF0pLGRdLHRyYW5zbGF0ZXg6WyJUIixjKFtrLGwsbF0pLGMoW2ssbF0pXSx0cmFuc2xhdGV5OlsiVCIsYyhbbCxrLGxdKSxjKFtsLGtdKV0sdHJhbnNsYXRlejpbIkwiLGMoW2wsbCxrXSldLHRyYW5zbGF0ZTNkOlsiVFRMIixkXX07YS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGosWyJ0cmFuc2Zvcm0iXSl9KGQsZiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7Yi5jb25jYXQoW2FdKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlJiYoZFthXT1iKX0pfXZhciBkPXt9O2MoInRyYW5zZm9ybSIsWyJ3ZWJraXRUcmFuc2Zvcm0iLCJtc1RyYW5zZm9ybSJdKSxjKCJ0cmFuc2Zvcm1PcmlnaW4iLFsid2Via2l0VHJhbnNmb3JtT3JpZ2luIl0pLGMoInBlcnNwZWN0aXZlIixbIndlYmtpdFBlcnNwZWN0aXZlIl0pLGMoInBlcnNwZWN0aXZlT3JpZ2luIixbIndlYmtpdFBlcnNwZWN0aXZlT3JpZ2luIl0pLGEucHJvcGVydHlOYW1lPWZ1bmN0aW9uKGEpe3JldHVybiBkW2FdfHxhfX0oZCxmKX0oKSwhZnVuY3Rpb24oKXtpZih2b2lkIDA9PT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5hbmltYXRlKFtdKS5vbmNhbmNlbCl7dmFyIGE7aWYod2luZG93LnBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3cpdmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gcGVyZm9ybWFuY2Uubm93KCl9O2Vsc2UgdmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX07dmFyIGI9ZnVuY3Rpb24oYSxiLGMpe3RoaXMudGFyZ2V0PWEsdGhpcy5jdXJyZW50VGltZT1iLHRoaXMudGltZWxpbmVUaW1lPWMsdGhpcy50eXBlPSJjYW5jZWwiLHRoaXMuYnViYmxlcz0hMSx0aGlzLmNhbmNlbGFibGU9ITEsdGhpcy5jdXJyZW50VGFyZ2V0PWEsdGhpcy5kZWZhdWx0UHJldmVudGVkPSExLHRoaXMuZXZlbnRQaGFzZT1FdmVudC5BVF9UQVJHRVQsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKX0sYz13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZTt3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihkLGUpe3ZhciBmPWMuY2FsbCh0aGlzLGQsZSk7Zi5fY2FuY2VsSGFuZGxlcnM9W10sZi5vbmNhbmNlbD1udWxsO3ZhciBnPWYuY2FuY2VsO2YuY2FuY2VsPWZ1bmN0aW9uKCl7Zy5jYWxsKHRoaXMpO3ZhciBjPW5ldyBiKHRoaXMsbnVsbCxhKCkpLGQ9dGhpcy5fY2FuY2VsSGFuZGxlcnMuY29uY2F0KHRoaXMub25jYW5jZWw/W3RoaXMub25jYW5jZWxdOltdKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZC5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY2FsbChjLnRhcmdldCxjKX0pfSwwKX07dmFyIGg9Zi5hZGRFdmVudExpc3RlbmVyO2YuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIpeyJmdW5jdGlvbiI9PXR5cGVvZiBiJiYiY2FuY2VsIj09YT90aGlzLl9jYW5jZWxIYW5kbGVycy5wdXNoKGIpOmguY2FsbCh0aGlzLGEsYil9O3ZhciBpPWYucmVtb3ZlRXZlbnRMaXN0ZW5lcjtyZXR1cm4gZi5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYil7aWYoImNhbmNlbCI9PWEpe3ZhciBjPXRoaXMuX2NhbmNlbEhhbmRsZXJzLmluZGV4T2YoYik7Yz49MCYmdGhpcy5fY2FuY2VsSGFuZGxlcnMuc3BsaWNlKGMsMSl9ZWxzZSBpLmNhbGwodGhpcyxhLGIpfSxmfX19KCksZnVuY3Rpb24oYSl7dmFyIGI9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGM9bnVsbCxkPSExO3RyeXt2YXIgZT1nZXRDb21wdXRlZFN0eWxlKGIpLmdldFByb3BlcnR5VmFsdWUoIm9wYWNpdHkiKSxmPSIwIj09ZT8iMSI6IjAiO2M9Yi5hbmltYXRlKHtvcGFjaXR5OltmLGZdfSx7ZHVyYXRpb246MX0pLGMuY3VycmVudFRpbWU9MCxkPWdldENvbXB1dGVkU3R5bGUoYikuZ2V0UHJvcGVydHlWYWx1ZSgib3BhY2l0eSIpPT1mfWNhdGNoKGcpe31maW5hbGx5e2MmJmMuY2FuY2VsKCl9aWYoIWQpe3ZhciBoPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlO3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIHdpbmRvdy5TeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmQXJyYXkucHJvdG90eXBlLmZyb20mJmJbU3ltYm9sLml0ZXJhdG9yXSYmKGI9QXJyYXkuZnJvbShiKSksQXJyYXkuaXNBcnJheShiKXx8bnVsbD09PWJ8fChiPWEuY29udmVydFRvQXJyYXlGb3JtKGIpKSxoLmNhbGwodGhpcyxiLGMpfX19KGMpLCFmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXt2YXIgYj13aW5kb3cuZG9jdW1lbnQudGltZWxpbmU7Yi5jdXJyZW50VGltZT1hLGIuX2Rpc2NhcmRBbmltYXRpb25zKCksMD09Yi5fYW5pbWF0aW9ucy5sZW5ndGg/Zj0hMTpyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZCk7Cn12YXIgZT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIGUoZnVuY3Rpb24oYil7d2luZG93LmRvY3VtZW50LnRpbWVsaW5lLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKSxhKGIpLHdpbmRvdy5kb2N1bWVudC50aW1lbGluZS5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCl9KX0sYi5BbmltYXRpb25UaW1lbGluZT1mdW5jdGlvbigpe3RoaXMuX2FuaW1hdGlvbnM9W10sdGhpcy5jdXJyZW50VGltZT12b2lkIDB9LGIuQW5pbWF0aW9uVGltZWxpbmUucHJvdG90eXBlPXtnZXRBbmltYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc2NhcmRBbmltYXRpb25zKCksdGhpcy5fYW5pbWF0aW9ucy5zbGljZSgpfSxfdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzOmZ1bmN0aW9uKCl7Yi5hbmltYXRpb25zV2l0aFByb21pc2VzPWIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuX3VwZGF0ZVByb21pc2VzKCl9KX0sX2Rpc2NhcmRBbmltYXRpb25zOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCksdGhpcy5fYW5pbWF0aW9ucz10aGlzLl9hbmltYXRpb25zLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZmluaXNoZWQiIT1hLnBsYXlTdGF0ZSYmImlkbGUiIT1hLnBsYXlTdGF0ZX0pfSxfcGxheTpmdW5jdGlvbihhKXt2YXIgYz1uZXcgYi5BbmltYXRpb24oYSx0aGlzKTtyZXR1cm4gdGhpcy5fYW5pbWF0aW9ucy5wdXNoKGMpLGIucmVzdGFydFdlYkFuaW1hdGlvbnNOZXh0VGljaygpLGMuX3VwZGF0ZVByb21pc2VzKCksYy5fYW5pbWF0aW9uLnBsYXkoKSxjLl91cGRhdGVQcm9taXNlcygpLGN9LHBsYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEucmVtb3ZlKCksdGhpcy5fcGxheShhKX19O3ZhciBmPSExO2IucmVzdGFydFdlYkFuaW1hdGlvbnNOZXh0VGljaz1mdW5jdGlvbigpe2Z8fChmPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShkKSl9O3ZhciBnPW5ldyBiLkFuaW1hdGlvblRpbWVsaW5lO2IudGltZWxpbmU9Zzt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5kb2N1bWVudCwidGltZWxpbmUiLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGd9fSl9Y2F0Y2goaCl7fXRyeXt3aW5kb3cuZG9jdW1lbnQudGltZWxpbmU9Z31jYXRjaChoKXt9fShjLGUsZiksZnVuY3Rpb24oYSxiLGMpe2IuYW5pbWF0aW9uc1dpdGhQcm9taXNlcz1bXSxiLkFuaW1hdGlvbj1mdW5jdGlvbihiLGMpe2lmKHRoaXMuaWQ9IiIsYiYmYi5faWQmJih0aGlzLmlkPWIuX2lkKSx0aGlzLmVmZmVjdD1iLGImJihiLl9hbmltYXRpb249dGhpcyksIWMpdGhyb3cgbmV3IEVycm9yKCJBbmltYXRpb24gd2l0aCBudWxsIHRpbWVsaW5lIGlzIG5vdCBzdXBwb3J0ZWQiKTt0aGlzLl90aW1lbGluZT1jLHRoaXMuX3NlcXVlbmNlTnVtYmVyPWEuc2VxdWVuY2VOdW1iZXIrKyx0aGlzLl9ob2xkVGltZT0wLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9pc0dyb3VwPSExLHRoaXMuX2FuaW1hdGlvbj1udWxsLHRoaXMuX2NoaWxkQW5pbWF0aW9ucz1bXSx0aGlzLl9jYWxsYmFjaz1udWxsLHRoaXMuX29sZFBsYXlTdGF0ZT0iaWRsZSIsdGhpcy5fcmVidWlsZFVuZGVybHlpbmdBbmltYXRpb24oKSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sYi5BbmltYXRpb24ucHJvdG90eXBlPXtfdXBkYXRlUHJvbWlzZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9vbGRQbGF5U3RhdGUsYj10aGlzLnBsYXlTdGF0ZTtyZXR1cm4gdGhpcy5fcmVhZHlQcm9taXNlJiZiIT09YSYmKCJpZGxlIj09Yj8odGhpcy5fcmVqZWN0UmVhZHlQcm9taXNlKCksdGhpcy5fcmVhZHlQcm9taXNlPXZvaWQgMCk6InBlbmRpbmciPT1hP3RoaXMuX3Jlc29sdmVSZWFkeVByb21pc2UoKToicGVuZGluZyI9PWImJih0aGlzLl9yZWFkeVByb21pc2U9dm9pZCAwKSksdGhpcy5fZmluaXNoZWRQcm9taXNlJiZiIT09YSYmKCJpZGxlIj09Yj8odGhpcy5fcmVqZWN0RmluaXNoZWRQcm9taXNlKCksdGhpcy5fZmluaXNoZWRQcm9taXNlPXZvaWQgMCk6ImZpbmlzaGVkIj09Yj90aGlzLl9yZXNvbHZlRmluaXNoZWRQcm9taXNlKCk6ImZpbmlzaGVkIj09YSYmKHRoaXMuX2ZpbmlzaGVkUHJvbWlzZT12b2lkIDApKSx0aGlzLl9vbGRQbGF5U3RhdGU9dGhpcy5wbGF5U3RhdGUsdGhpcy5fcmVhZHlQcm9taXNlfHx0aGlzLl9maW5pc2hlZFByb21pc2V9LF9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbjpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGEsYyxkLGUsZj0hIXRoaXMuX2FuaW1hdGlvbjtmJiYoYT10aGlzLnBsYXliYWNrUmF0ZSxjPXRoaXMuX3BhdXNlZCxkPXRoaXMuc3RhcnRUaW1lLGU9dGhpcy5jdXJyZW50VGltZSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fYW5pbWF0aW9uLl93cmFwcGVyPW51bGwsdGhpcy5fYW5pbWF0aW9uPW51bGwpLCghdGhpcy5lZmZlY3R8fHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LktleWZyYW1lRWZmZWN0KSYmKHRoaXMuX2FuaW1hdGlvbj1iLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdCh0aGlzLmVmZmVjdCksYi5iaW5kQW5pbWF0aW9uRm9yS2V5ZnJhbWVFZmZlY3QodGhpcykpLCh0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdHx8dGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuR3JvdXBFZmZlY3QpJiYodGhpcy5fYW5pbWF0aW9uPWIubmV3VW5kZXJseWluZ0FuaW1hdGlvbkZvckdyb3VwKHRoaXMuZWZmZWN0KSxiLmJpbmRBbmltYXRpb25Gb3JHcm91cCh0aGlzKSksdGhpcy5lZmZlY3QmJnRoaXMuZWZmZWN0Ll9vbnNhbXBsZSYmYi5iaW5kQW5pbWF0aW9uRm9yQ3VzdG9tRWZmZWN0KHRoaXMpLGYmJigxIT1hJiYodGhpcy5wbGF5YmFja1JhdGU9YSksbnVsbCE9PWQ/dGhpcy5zdGFydFRpbWU9ZDpudWxsIT09ZT90aGlzLmN1cnJlbnRUaW1lPWU6bnVsbCE9PXRoaXMuX2hvbGRUaW1lJiYodGhpcy5jdXJyZW50VGltZT10aGlzLl9ob2xkVGltZSksYyYmdGhpcy5wYXVzZSgpKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxfdXBkYXRlQ2hpbGRyZW46ZnVuY3Rpb24oKXtpZih0aGlzLmVmZmVjdCYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSl7dmFyIGE9dGhpcy5lZmZlY3QuX3RpbWluZy5kZWxheTt0aGlzLl9jaGlsZEFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbihjKXt0aGlzLl9hcnJhbmdlQ2hpbGRyZW4oYyxhKSx0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdCYmKGErPWIuZ3JvdXBDaGlsZER1cmF0aW9uKGMuZWZmZWN0KSl9LmJpbmQodGhpcykpfX0sX3NldEV4dGVybmFsQW5pbWF0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuZWZmZWN0JiZ0aGlzLl9pc0dyb3VwKWZvcih2YXIgYj0wO2I8dGhpcy5lZmZlY3QuY2hpbGRyZW4ubGVuZ3RoO2IrKyl0aGlzLmVmZmVjdC5jaGlsZHJlbltiXS5fYW5pbWF0aW9uPWEsdGhpcy5fY2hpbGRBbmltYXRpb25zW2JdLl9zZXRFeHRlcm5hbEFuaW1hdGlvbihhKX0sX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9uczpmdW5jdGlvbigpe2lmKHRoaXMuZWZmZWN0JiZ0aGlzLl9pc0dyb3VwKXt2YXIgYT10aGlzLmVmZmVjdC5fdGltaW5nLmRlbGF5O3RoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpLHRoaXMuZWZmZWN0LmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9d2luZG93LmRvY3VtZW50LnRpbWVsaW5lLl9wbGF5KGMpO3RoaXMuX2NoaWxkQW5pbWF0aW9ucy5wdXNoKGQpLGQucGxheWJhY2tSYXRlPXRoaXMucGxheWJhY2tSYXRlLHRoaXMuX3BhdXNlZCYmZC5wYXVzZSgpLGMuX2FuaW1hdGlvbj10aGlzLmVmZmVjdC5fYW5pbWF0aW9uLHRoaXMuX2FycmFuZ2VDaGlsZHJlbihkLGEpLHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0JiYoYSs9Yi5ncm91cENoaWxkRHVyYXRpb24oYykpfS5iaW5kKHRoaXMpKX19LF9hcnJhbmdlQ2hpbGRyZW46ZnVuY3Rpb24oYSxiKXtudWxsPT09dGhpcy5zdGFydFRpbWU/YS5jdXJyZW50VGltZT10aGlzLmN1cnJlbnRUaW1lLWIvdGhpcy5wbGF5YmFja1JhdGU6YS5zdGFydFRpbWUhPT10aGlzLnN0YXJ0VGltZStiL3RoaXMucGxheWJhY2tSYXRlJiYoYS5zdGFydFRpbWU9dGhpcy5zdGFydFRpbWUrYi90aGlzLnBsYXliYWNrUmF0ZSl9LGdldCB0aW1lbGluZSgpe3JldHVybiB0aGlzLl90aW1lbGluZX0sZ2V0IHBsYXlTdGF0ZSgpe3JldHVybiB0aGlzLl9hbmltYXRpb24/dGhpcy5fYW5pbWF0aW9uLnBsYXlTdGF0ZToiaWRsZSJ9LGdldCBmaW5pc2hlZCgpe3JldHVybiB3aW5kb3cuUHJvbWlzZT8odGhpcy5fZmluaXNoZWRQcm9taXNlfHwoLTE9PWIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5pbmRleE9mKHRoaXMpJiZiLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMucHVzaCh0aGlzKSx0aGlzLl9maW5pc2hlZFByb21pc2U9bmV3IFByb21pc2UoZnVuY3Rpb24oYSxiKXt0aGlzLl9yZXNvbHZlRmluaXNoZWRQcm9taXNlPWZ1bmN0aW9uKCl7YSh0aGlzKX0sdGhpcy5fcmVqZWN0RmluaXNoZWRQcm9taXNlPWZ1bmN0aW9uKCl7Yih7dHlwZTpET01FeGNlcHRpb24uQUJPUlRfRVJSLG5hbWU6IkFib3J0RXJyb3IifSl9fS5iaW5kKHRoaXMpKSwiZmluaXNoZWQiPT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5fcmVzb2x2ZUZpbmlzaGVkUHJvbWlzZSgpKSx0aGlzLl9maW5pc2hlZFByb21pc2UpOihjb25zb2xlLndhcm4oIkFuaW1hdGlvbiBQcm9taXNlcyByZXF1aXJlIEphdmFTY3JpcHQgUHJvbWlzZSBjb25zdHJ1Y3RvciIpLG51bGwpfSxnZXQgcmVhZHkoKXtyZXR1cm4gd2luZG93LlByb21pc2U/KHRoaXMuX3JlYWR5UHJvbWlzZXx8KC0xPT1iLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMuaW5kZXhPZih0aGlzKSYmYi5hbmltYXRpb25zV2l0aFByb21pc2VzLnB1c2godGhpcyksdGhpcy5fcmVhZHlQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYil7dGhpcy5fcmVzb2x2ZVJlYWR5UHJvbWlzZT1mdW5jdGlvbigpe2EodGhpcyl9LHRoaXMuX3JlamVjdFJlYWR5UHJvbWlzZT1mdW5jdGlvbigpe2Ioe3R5cGU6RE9NRXhjZXB0aW9uLkFCT1JUX0VSUixuYW1lOiJBYm9ydEVycm9yIn0pfX0uYmluZCh0aGlzKSksInBlbmRpbmciIT09dGhpcy5wbGF5U3RhdGUmJnRoaXMuX3Jlc29sdmVSZWFkeVByb21pc2UoKSksdGhpcy5fcmVhZHlQcm9taXNlKTooY29uc29sZS53YXJuKCJBbmltYXRpb24gUHJvbWlzZXMgcmVxdWlyZSBKYXZhU2NyaXB0IFByb21pc2UgY29uc3RydWN0b3IiKSxudWxsKX0sZ2V0IG9uZmluaXNoKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaH0sc2V0IG9uZmluaXNoKGEpeyJmdW5jdGlvbiI9PXR5cGVvZiBhP3RoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaD1mdW5jdGlvbihiKXtiLnRhcmdldD10aGlzLGEuY2FsbCh0aGlzLGIpfS5iaW5kKHRoaXMpOnRoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaD1hfSxnZXQgb25jYW5jZWwoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsfSxzZXQgb25jYW5jZWwoYSl7ImZ1bmN0aW9uIj09dHlwZW9mIGE/dGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsPWZ1bmN0aW9uKGIpe2IudGFyZ2V0PXRoaXMsYS5jYWxsKHRoaXMsYil9LmJpbmQodGhpcyk6dGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsPWF9LGdldCBjdXJyZW50VGltZSgpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGE9dGhpcy5fYW5pbWF0aW9uLmN1cnJlbnRUaW1lO3JldHVybiB0aGlzLl91cGRhdGVQcm9taXNlcygpLGF9LHNldCBjdXJyZW50VGltZShhKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5jdXJyZW50VGltZT1pc0Zpbml0ZShhKT9hOk1hdGguc2lnbihhKSpOdW1iZXIuTUFYX1ZBTFVFLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGIsYyl7Yi5jdXJyZW50VGltZT1hLWN9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxnZXQgc3RhcnRUaW1lKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5zdGFydFRpbWV9LHNldCBzdGFydFRpbWUoYSl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKSx0aGlzLl9hbmltYXRpb24uc3RhcnRUaW1lPWlzRmluaXRlKGEpP2E6TWF0aC5zaWduKGEpKk51bWJlci5NQVhfVkFMVUUsdGhpcy5fcmVnaXN0ZXIoKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYixjKXtiLnN0YXJ0VGltZT1hK2N9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxnZXQgcGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5wbGF5YmFja1JhdGV9LHNldCBwbGF5YmFja1JhdGUoYSl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKTt2YXIgYj10aGlzLmN1cnJlbnRUaW1lO3RoaXMuX2FuaW1hdGlvbi5wbGF5YmFja1JhdGU9YSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYil7Yi5wbGF5YmFja1JhdGU9YX0pLCJwYXVzZWQiIT10aGlzLnBsYXlTdGF0ZSYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5wbGF5KCksbnVsbCE9PWImJih0aGlzLmN1cnJlbnRUaW1lPWIpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9hbmltYXRpb24ucGxheSgpLC0xPT10aGlzLl90aW1lbGluZS5fYW5pbWF0aW9ucy5pbmRleE9mKHRoaXMpJiZ0aGlzLl90aW1lbGluZS5fYW5pbWF0aW9ucy5wdXNoKHRoaXMpLHRoaXMuX3JlZ2lzdGVyKCksYi5hd2FpdFN0YXJ0VGltZSh0aGlzKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYSl7dmFyIGI9YS5jdXJyZW50VGltZTthLnBsYXkoKSxhLmN1cnJlbnRUaW1lPWJ9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5jdXJyZW50VGltZSYmKHRoaXMuX2hvbGRUaW1lPXRoaXMuY3VycmVudFRpbWUpLHRoaXMuX2FuaW1hdGlvbi5wYXVzZSgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pLHRoaXMuX3BhdXNlZD0hMCx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxmaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5maW5pc2goKSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGNhbmNlbDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5fYW5pbWF0aW9uLmNhbmNlbCgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0scmV2ZXJzZTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGE9dGhpcy5jdXJyZW50VGltZTt0aGlzLl9hbmltYXRpb24ucmV2ZXJzZSgpLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihhKXthLnJldmVyc2UoKX0pLG51bGwhPT1hJiYodGhpcy5jdXJyZW50VGltZT1hKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YjsiZnVuY3Rpb24iPT10eXBlb2YgYiYmKGM9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9dGhpcyxiLmNhbGwodGhpcyxhKX0uYmluZCh0aGlzKSxiLl93cmFwcGVyPWMpLHRoaXMuX2FuaW1hdGlvbi5hZGRFdmVudExpc3RlbmVyKGEsYyl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXt0aGlzLl9hbmltYXRpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGImJmIuX3dyYXBwZXJ8fGIpfSxfcmVtb3ZlQ2hpbGRBbmltYXRpb25zOmZ1bmN0aW9uKCl7Zm9yKDt0aGlzLl9jaGlsZEFuaW1hdGlvbnMubGVuZ3RoOyl0aGlzLl9jaGlsZEFuaW1hdGlvbnMucG9wKCkuY2FuY2VsKCl9LF9mb3JFYWNoQ2hpbGQ6ZnVuY3Rpb24oYil7dmFyIGM9MDtpZih0aGlzLmVmZmVjdC5jaGlsZHJlbiYmdGhpcy5fY2hpbGRBbmltYXRpb25zLmxlbmd0aDx0aGlzLmVmZmVjdC5jaGlsZHJlbi5sZW5ndGgmJnRoaXMuX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9ucygpLHRoaXMuX2NoaWxkQW5pbWF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2IuY2FsbCh0aGlzLGEsYyksdGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuU2VxdWVuY2VFZmZlY3QmJihjKz1hLmVmZmVjdC5hY3RpdmVEdXJhdGlvbil9LmJpbmQodGhpcykpLCJwZW5kaW5nIiE9dGhpcy5wbGF5U3RhdGUpe3ZhciBkPXRoaXMuZWZmZWN0Ll90aW1pbmcsZT10aGlzLmN1cnJlbnRUaW1lO251bGwhPT1lJiYoZT1hLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGQpLGUsZCkpLChudWxsPT1lfHxpc05hTihlKSkmJnRoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpfX19LHdpbmRvdy5BbmltYXRpb249Yi5BbmltYXRpb259KGMsZSxmKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChiKXt0aGlzLl9mcmFtZXM9YS5ub3JtYWxpemVLZXlmcmFtZXMoYil9ZnVuY3Rpb24gZSgpe2Zvcih2YXIgYT0hMTtpLmxlbmd0aDspe3ZhciBiPWkuc2hpZnQoKTtiLl91cGRhdGVDaGlsZHJlbigpLGE9ITB9cmV0dXJuIGF9dmFyIGY9ZnVuY3Rpb24oYSl7aWYoYS5fYW5pbWF0aW9uPXZvaWQgMCxhIGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0fHxhIGluc3RhbmNlb2Ygd2luZG93Lkdyb3VwRWZmZWN0KWZvcih2YXIgYj0wO2I8YS5jaGlsZHJlbi5sZW5ndGg7YisrKWYoYS5jaGlsZHJlbltiXSl9O2IucmVtb3ZlTXVsdGk9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtkLl9wYXJlbnQ/KC0xPT1iLmluZGV4T2YoZC5fcGFyZW50KSYmYi5wdXNoKGQuX3BhcmVudCksZC5fcGFyZW50LmNoaWxkcmVuLnNwbGljZShkLl9wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihkKSwxKSxkLl9wYXJlbnQ9bnVsbCxmKGQpKTpkLl9hbmltYXRpb24mJmQuX2FuaW1hdGlvbi5lZmZlY3Q9PWQmJihkLl9hbmltYXRpb24uY2FuY2VsKCksZC5fYW5pbWF0aW9uLmVmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QobnVsbCxbXSksZC5fYW5pbWF0aW9uLl9jYWxsYmFjayYmKGQuX2FuaW1hdGlvbi5fY2FsbGJhY2suX2FuaW1hdGlvbj1udWxsKSxkLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCksZihkKSl9Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLl9yZWJ1aWxkKCl9LGIuS2V5ZnJhbWVFZmZlY3Q9ZnVuY3Rpb24oYixjLGUsZil7cmV0dXJuIHRoaXMudGFyZ2V0PWIsdGhpcy5fcGFyZW50PW51bGwsZT1hLm51bWVyaWNUaW1pbmdUb09iamVjdChlKSx0aGlzLl90aW1pbmdJbnB1dD1hLmNsb25lVGltaW5nSW5wdXQoZSksdGhpcy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoZSksdGhpcy50aW1pbmc9YS5tYWtlVGltaW5nKGUsITEsdGhpcyksdGhpcy50aW1pbmcuX2VmZmVjdD10aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBjPyhhLmRlcHJlY2F0ZWQoIkN1c3RvbSBLZXlmcmFtZUVmZmVjdCIsIjIwMTUtMDYtMjIiLCJVc2UgS2V5ZnJhbWVFZmZlY3Qub25zYW1wbGUgaW5zdGVhZC4iKSx0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzPWMpOnRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM9bmV3IGQoYyksdGhpcy5fa2V5ZnJhbWVzPWMsdGhpcy5hY3RpdmVEdXJhdGlvbj1hLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKHRoaXMuX3RpbWluZyksdGhpcy5faWQ9Zix0aGlzfSxiLktleWZyYW1lRWZmZWN0LnByb3RvdHlwZT17Z2V0RnJhbWVzOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM/dGhpcy5fbm9ybWFsaXplZEtleWZyYW1lczp0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzLl9mcmFtZXN9LHNldCBvbnNhbXBsZShhKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5nZXRGcmFtZXMoKSl0aHJvdyBuZXcgRXJyb3IoIlNldHRpbmcgb25zYW1wbGUgb24gY3VzdG9tIGVmZmVjdCBLZXlmcmFtZUVmZmVjdCBpcyBub3Qgc3VwcG9ydGVkLiIpO3RoaXMuX29uc2FtcGxlPWEsdGhpcy5fYW5pbWF0aW9uJiZ0aGlzLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCl9LGdldCBwYXJlbnQoKXtyZXR1cm4gdGhpcy5fcGFyZW50fSxjbG9uZTpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmdldEZyYW1lcygpKXRocm93IG5ldyBFcnJvcigiQ2xvbmluZyBjdXN0b20gZWZmZWN0cyBpcyBub3Qgc3VwcG9ydGVkLiIpO3ZhciBiPW5ldyBLZXlmcmFtZUVmZmVjdCh0aGlzLnRhcmdldCxbXSxhLmNsb25lVGltaW5nSW5wdXQodGhpcy5fdGltaW5nSW5wdXQpLHRoaXMuX2lkKTtyZXR1cm4gYi5fbm9ybWFsaXplZEtleWZyYW1lcz10aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzLGIuX2tleWZyYW1lcz10aGlzLl9rZXlmcmFtZXMsYn0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVNdWx0aShbdGhpc10pfX07dmFyIGc9RWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZTtFbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9IiI7cmV0dXJuIGMmJmMuaWQmJihkPWMuaWQpLGIudGltZWxpbmUuX3BsYXkobmV3IGIuS2V5ZnJhbWVFZmZlY3QodGhpcyxhLGMsZCkpfTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKTtiLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihhKXtpZihhKXt2YXIgYj1hLnRhcmdldHx8aCxjPWEuX2tleWZyYW1lczsiZnVuY3Rpb24iPT10eXBlb2YgYyYmKGM9W10pO3ZhciBkPWEuX3RpbWluZ0lucHV0O2QuaWQ9YS5faWR9ZWxzZSB2YXIgYj1oLGM9W10sZD0wO3JldHVybiBnLmFwcGx5KGIsW2MsZF0pfSxiLmJpbmRBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihhKXthLmVmZmVjdCYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZWZmZWN0Ll9ub3JtYWxpemVkS2V5ZnJhbWVzJiZiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3QoYSl9O3ZhciBpPVtdO2IuYXdhaXRTdGFydFRpbWU9ZnVuY3Rpb24oYSl7bnVsbD09PWEuc3RhcnRUaW1lJiZhLl9pc0dyb3VwJiYoMD09aS5sZW5ndGgmJnJlcXVlc3RBbmltYXRpb25GcmFtZShlKSxpLnB1c2goYSkpfTt2YXIgaj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZTtPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCJnZXRDb21wdXRlZFN0eWxlIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQudGltZWxpbmUuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpO3ZhciBhPWouYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBlKCkmJihhPWouYXBwbHkodGhpcyxhcmd1bWVudHMpKSx3aW5kb3cuZG9jdW1lbnQudGltZWxpbmUuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpLGF9fSksd2luZG93LktleWZyYW1lRWZmZWN0PWIuS2V5ZnJhbWVFZmZlY3Qsd2luZG93LkVsZW1lbnQucHJvdG90eXBlLmdldEFuaW1hdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQudGltZWxpbmUuZ2V0QW5pbWF0aW9ucygpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9PWEuZWZmZWN0JiZhLmVmZmVjdC50YXJnZXQ9PXRoaXN9LmJpbmQodGhpcykpfX0oYyxlLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe2EuX3JlZ2lzdGVyZWR8fChhLl9yZWdpc3RlcmVkPSEwLGcucHVzaChhKSxofHwoaD0hMCxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZSkpKX1mdW5jdGlvbiBlKGEpe3ZhciBiPWc7Zz1bXSxiLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5fc2VxdWVuY2VOdW1iZXItYi5fc2VxdWVuY2VOdW1iZXJ9KSxiPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe2EoKTt2YXIgYj1hLl9hbmltYXRpb24/YS5fYW5pbWF0aW9uLnBsYXlTdGF0ZToiaWRsZSI7cmV0dXJuInJ1bm5pbmciIT1iJiYicGVuZGluZyIhPWImJihhLl9yZWdpc3RlcmVkPSExKSxhLl9yZWdpc3RlcmVkfSksZy5wdXNoLmFwcGx5KGcsYiksZy5sZW5ndGg/KGg9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpKTpoPSExfXZhciBmPShkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKSwwKTtiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3Q9ZnVuY3Rpb24oYil7dmFyIGMsZT1iLmVmZmVjdC50YXJnZXQsZz0iZnVuY3Rpb24iPT10eXBlb2YgYi5lZmZlY3QuZ2V0RnJhbWVzKCk7Yz1nP2IuZWZmZWN0LmdldEZyYW1lcygpOmIuZWZmZWN0Ll9vbnNhbXBsZTt2YXIgaD1iLmVmZmVjdC50aW1pbmcsaT1udWxsO2g9YS5ub3JtYWxpemVUaW1pbmdJbnB1dChoKTt2YXIgaj1mdW5jdGlvbigpe3ZhciBkPWouX2FuaW1hdGlvbj9qLl9hbmltYXRpb24uY3VycmVudFRpbWU6bnVsbDtudWxsIT09ZCYmKGQ9YS5jYWxjdWxhdGVUaW1lRnJhY3Rpb24oYS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihoKSxkLGgpLGlzTmFOKGQpJiYoZD1udWxsKSksZCE9PWkmJihnP2MoZCxlLGIuZWZmZWN0KTpjKGQsYi5lZmZlY3QsYi5lZmZlY3QuX2FuaW1hdGlvbikpLGk9ZH07ai5fYW5pbWF0aW9uPWIsai5fcmVnaXN0ZXJlZD0hMSxqLl9zZXF1ZW5jZU51bWJlcj1mKyssYi5fY2FsbGJhY2s9aixkKGopfTt2YXIgZz1bXSxoPSExO2IuQW5pbWF0aW9uLnByb3RvdHlwZS5fcmVnaXN0ZXI9ZnVuY3Rpb24oKXt0aGlzLl9jYWxsYmFjayYmZCh0aGlzLl9jYWxsYmFjayl9fShjLGUsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7cmV0dXJuIGEuX3RpbWluZy5kZWxheSthLmFjdGl2ZUR1cmF0aW9uK2EuX3RpbWluZy5lbmREZWxheX1mdW5jdGlvbiBlKGIsYyxkKXt0aGlzLl9pZD1kLHRoaXMuX3BhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49Ynx8W10sdGhpcy5fcmVwYXJlbnQodGhpcy5jaGlsZHJlbiksYz1hLm51bWVyaWNUaW1pbmdUb09iamVjdChjKSx0aGlzLl90aW1pbmdJbnB1dD1hLmNsb25lVGltaW5nSW5wdXQoYyksdGhpcy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYywhMCksdGhpcy50aW1pbmc9YS5tYWtlVGltaW5nKGMsITAsdGhpcyksdGhpcy50aW1pbmcuX2VmZmVjdD10aGlzLCJhdXRvIj09PXRoaXMuX3RpbWluZy5kdXJhdGlvbiYmKHRoaXMuX3RpbWluZy5kdXJhdGlvbj10aGlzLmFjdGl2ZUR1cmF0aW9uKX13aW5kb3cuU2VxdWVuY2VFZmZlY3Q9ZnVuY3Rpb24oKXtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sd2luZG93Lkdyb3VwRWZmZWN0PWZ1bmN0aW9uKCl7ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlPXtfaXNBbmNlc3RvcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcztudWxsIT09Yjspe2lmKGI9PWEpcmV0dXJuITA7Yj1iLl9wYXJlbnR9cmV0dXJuITF9LF9yZWJ1aWxkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXM7YTspImF1dG8iPT09YS50aW1pbmcuZHVyYXRpb24mJihhLl90aW1pbmcuZHVyYXRpb249YS5hY3RpdmVEdXJhdGlvbiksYT1hLl9wYXJlbnQ7dGhpcy5fYW5pbWF0aW9uJiZ0aGlzLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCl9LF9yZXBhcmVudDpmdW5jdGlvbihhKXtiLnJlbW92ZU11bHRpKGEpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWFbY10uX3BhcmVudD10aGlzfSxfcHV0Q2hpbGQ6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9Yj8iQ2Fubm90IGFwcGVuZCBhbiBhbmNlc3RvciBvciBzZWxmIjoiQ2Fubm90IHByZXBlbmQgYW4gYW5jZXN0b3Igb3Igc2VsZiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWlmKHRoaXMuX2lzQW5jZXN0b3IoYVtkXSkpdGhyb3d7dHlwZTpET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLG5hbWU6IkhpZXJhcmNoeVJlcXVlc3RFcnJvciIsbWVzc2FnZTpjfTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyliP3RoaXMuY2hpbGRyZW4ucHVzaChhW2RdKTp0aGlzLmNoaWxkcmVuLnVuc2hpZnQoYVtkXSk7dGhpcy5fcmVwYXJlbnQoYSksdGhpcy5fcmVidWlsZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXt0aGlzLl9wdXRDaGlsZChhcmd1bWVudHMsITApfSxwcmVwZW5kOmZ1bmN0aW9uKCl7dGhpcy5fcHV0Q2hpbGQoYXJndW1lbnRzLCExKX0sZ2V0IHBhcmVudCgpe3JldHVybiB0aGlzLl9wYXJlbnR9LGdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoP3RoaXMuY2hpbGRyZW5bMF06bnVsbH0sZ2V0IGxhc3RDaGlsZCgpe3JldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aD90aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoLTFdOm51bGx9LGNsb25lOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPWEuY2xvbmVUaW1pbmdJbnB1dCh0aGlzLl90aW1pbmdJbnB1dCksYz1bXSxkPTA7ZDx0aGlzLmNoaWxkcmVuLmxlbmd0aDtkKyspYy5wdXNoKHRoaXMuY2hpbGRyZW5bZF0uY2xvbmUoKSk7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBHcm91cEVmZmVjdD9uZXcgR3JvdXBFZmZlY3QoYyxiKTpuZXcgU2VxdWVuY2VFZmZlY3QoYyxiKX0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVNdWx0aShbdGhpc10pfX0sd2luZG93LlNlcXVlbmNlRWZmZWN0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LlNlcXVlbmNlRWZmZWN0LnByb3RvdHlwZSwiYWN0aXZlRHVyYXRpb24iLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYil7YSs9ZChiKX0pLE1hdGgubWF4KGEsMCl9fSksd2luZG93Lkdyb3VwRWZmZWN0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93Lkdyb3VwRWZmZWN0LnByb3RvdHlwZSwiYWN0aXZlRHVyYXRpb24iLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYil7YT1NYXRoLm1heChhLGQoYikpfSksYX19KSxiLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JHcm91cD1mdW5jdGlvbihjKXt2YXIgZCxlPW51bGwsZj1mdW5jdGlvbihiKXt2YXIgYz1kLl93cmFwcGVyO3JldHVybiBjJiYicGVuZGluZyIhPWMucGxheVN0YXRlJiZjLmVmZmVjdD9udWxsPT1iP3ZvaWQgYy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCk6MD09YiYmYy5wbGF5YmFja1JhdGU8MCYmKGV8fChlPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYy5lZmZlY3QudGltaW5nKSksYj1hLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGUpLC0xLGUpLGlzTmFOKGIpfHxudWxsPT1iKT8oYy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe2EuY3VycmVudFRpbWU9LTF9KSx2b2lkIGMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpKTp2b2lkIDA6dm9pZCAwfSxnPW5ldyBLZXlmcmFtZUVmZmVjdChudWxsLFtdLGMuX3RpbWluZyxjLl9pZCk7cmV0dXJuIGcub25zYW1wbGU9ZixkPWIudGltZWxpbmUuX3BsYXkoZyl9LGIuYmluZEFuaW1hdGlvbkZvckdyb3VwPWZ1bmN0aW9uKGEpe2EuX2FuaW1hdGlvbi5fd3JhcHBlcj1hLGEuX2lzR3JvdXA9ITAsYi5hd2FpdFN0YXJ0VGltZShhKSxhLl9jb25zdHJ1Y3RDaGlsZEFuaW1hdGlvbnMoKSxhLl9zZXRFeHRlcm5hbEFuaW1hdGlvbihhKX0sYi5ncm91cENoaWxkRHVyYXRpb249ZH0oYyxlLGYpLGJbInRydWUiXT1hfSh7fSxmdW5jdGlvbigpe3JldHVybiB0aGlzfSgpKTsKCi8qKgpAbGljZW5zZSBAbm9jb21waWxlCkNvcHlyaWdodCAoYykgMjAxOCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CkNvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCnN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiovCihmdW5jdGlvbigpey8qCgogQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwondXNlIHN0cmljdCc7dmFyIG4scD0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93PT09dGhpcz90aGlzOiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOnRoaXMsYWE9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7YSE9QXJyYXkucHJvdG90eXBlJiZhIT1PYmplY3QucHJvdG90eXBlJiYoYVtiXT1jLnZhbHVlKX07ZnVuY3Rpb24gYmEoKXtiYT1mdW5jdGlvbigpe307cC5TeW1ib2x8fChwLlN5bWJvbD1jYSl9dmFyIGNhPWZ1bmN0aW9uKCl7dmFyIGE9MDtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuImpzY29tcF9zeW1ib2xfIisoYnx8IiIpK2ErK319KCk7CmZ1bmN0aW9uIGRhKCl7YmEoKTt2YXIgYT1wLlN5bWJvbC5pdGVyYXRvcjthfHwoYT1wLlN5bWJvbC5pdGVyYXRvcj1wLlN5bWJvbCgiaXRlcmF0b3IiKSk7ImZ1bmN0aW9uIiE9dHlwZW9mIEFycmF5LnByb3RvdHlwZVthXSYmYWEoQXJyYXkucHJvdG90eXBlLGEse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBlYSh0aGlzKX19KTtkYT1mdW5jdGlvbigpe319ZnVuY3Rpb24gZWEoYSl7dmFyIGI9MDtyZXR1cm4gZmEoZnVuY3Rpb24oKXtyZXR1cm4gYjxhLmxlbmd0aD97ZG9uZTohMSx2YWx1ZTphW2IrK119Ontkb25lOiEwfX0pfWZ1bmN0aW9uIGZhKGEpe2RhKCk7YT17bmV4dDphfTthW3AuU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtyZXR1cm4gYX1mdW5jdGlvbiBpYShhKXtkYSgpO3ZhciBiPWFbU3ltYm9sLml0ZXJhdG9yXTtyZXR1cm4gYj9iLmNhbGwoYSk6ZWEoYSl9CmZ1bmN0aW9uIGphKGEpe2Zvcih2YXIgYixjPVtdOyEoYj1hLm5leHQoKSkuZG9uZTspYy5wdXNoKGIudmFsdWUpO3JldHVybiBjfQooZnVuY3Rpb24oKXtpZighZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTthLmluaXRFdmVudCgiZm9vIiwhMCwhMCk7YS5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBhLmRlZmF1bHRQcmV2ZW50ZWR9KCkpe3ZhciBhPUV2ZW50LnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdDtFdmVudC5wcm90b3R5cGUucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbGFibGUmJihhLmNhbGwodGhpcyksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImRlZmF1bHRQcmV2ZW50ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sY29uZmlndXJhYmxlOiEwfSkpfX12YXIgYj0vVHJpZGVudC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZighd2luZG93LkN1c3RvbUV2ZW50fHxiJiYiZnVuY3Rpb24iIT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCl3aW5kb3cuQ3VzdG9tRXZlbnQ9ZnVuY3Rpb24oYSxiKXtiPWJ8fHt9O3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpOwpjLmluaXRDdXN0b21FdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlLGIuZGV0YWlsKTtyZXR1cm4gY30sd2luZG93LkN1c3RvbUV2ZW50LnByb3RvdHlwZT13aW5kb3cuRXZlbnQucHJvdG90eXBlO2lmKCF3aW5kb3cuRXZlbnR8fGImJiJmdW5jdGlvbiIhPT10eXBlb2Ygd2luZG93LkV2ZW50KXt2YXIgYz13aW5kb3cuRXZlbnQ7d2luZG93LkV2ZW50PWZ1bmN0aW9uKGEsYil7Yj1ifHx7fTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtjLmluaXRFdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlKTtyZXR1cm4gY307aWYoYylmb3IodmFyIGQgaW4gYyl3aW5kb3cuRXZlbnRbZF09Y1tkXTt3aW5kb3cuRXZlbnQucHJvdG90eXBlPWMucHJvdG90eXBlfWlmKCF3aW5kb3cuTW91c2VFdmVudHx8YiYmImZ1bmN0aW9uIiE9PXR5cGVvZiB3aW5kb3cuTW91c2VFdmVudCl7Yj13aW5kb3cuTW91c2VFdmVudDt3aW5kb3cuTW91c2VFdmVudD1mdW5jdGlvbihhLApiKXtiPWJ8fHt9O3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50Iik7Yy5pbml0TW91c2VFdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlLGIudmlld3x8d2luZG93LGIuZGV0YWlsLGIuc2NyZWVuWCxiLnNjcmVlblksYi5jbGllbnRYLGIuY2xpZW50WSxiLmN0cmxLZXksYi5hbHRLZXksYi5zaGlmdEtleSxiLm1ldGFLZXksYi5idXR0b24sYi5yZWxhdGVkVGFyZ2V0KTtyZXR1cm4gY307aWYoYilmb3IoZCBpbiBiKXdpbmRvdy5Nb3VzZUV2ZW50W2RdPWJbZF07d2luZG93Lk1vdXNlRXZlbnQucHJvdG90eXBlPWIucHJvdG90eXBlfUFycmF5LmZyb218fChBcnJheS5mcm9tPWZ1bmN0aW9uKGEpe3JldHVybltdLnNsaWNlLmNhbGwoYSl9KTtPYmplY3QuYXNzaWdufHwoT2JqZWN0LmFzc2lnbj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxkPTAsZTtkPGMubGVuZ3RoO2QrKylpZihlPWNbZF0pZm9yKHZhciBmPQphLG09ZSxxPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG0pLHg9MDt4PHEubGVuZ3RoO3grKyllPXFbeF0sZltlXT1tW2VdO3JldHVybiBhfSl9KSh3aW5kb3cuV2ViQ29tcG9uZW50cyk7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe31mdW5jdGlvbiBiKGEsYil7aWYoIWEuY2hpbGROb2Rlcy5sZW5ndGgpcmV0dXJuW107c3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgTm9kZS5ET0NVTUVOVF9OT0RFOnJldHVybiB1YS5jYWxsKGEsYik7Y2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6cmV0dXJuIGxiLmNhbGwoYSxiKTtkZWZhdWx0OnJldHVybiBVLmNhbGwoYSxiKX19dmFyIGM9InVuZGVmaW5lZCI9PT10eXBlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCxkPSEoZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLmNsb25lTm9kZSgpaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSxlPSExOy9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiZmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtpZihhIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClmb3IodmFyIGQ7ZD1hLmZpcnN0Q2hpbGQ7KWMuY2FsbCh0aGlzLGQsYik7ZWxzZSBjLmNhbGwodGhpcywKYSxiKTtyZXR1cm4gYX1lPSEwO3ZhciBiPU5vZGUucHJvdG90eXBlLmNsb25lTm9kZTtOb2RlLnByb3RvdHlwZS5jbG9uZU5vZGU9ZnVuY3Rpb24oYSl7YT1iLmNhbGwodGhpcyxhKTt0aGlzIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCYmKGEuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlKTtyZXR1cm4gYX07RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbD1IVE1MRWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbDtEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yPUhUTUxFbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLHtub2RlVHlwZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERX0sY29uZmlndXJhYmxlOiEwfSxsb2NhbE5hbWU6e2dldDpmdW5jdGlvbigpe30sCmNvbmZpZ3VyYWJsZTohMH0sbm9kZU5hbWU6e2dldDpmdW5jdGlvbigpe3JldHVybiIjZG9jdW1lbnQtZnJhZ21lbnQifSxjb25maWd1cmFibGU6ITB9fSk7dmFyIGM9Tm9kZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlO05vZGUucHJvdG90eXBlLmluc2VydEJlZm9yZT1hO3ZhciBkPU5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkO05vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkPWZ1bmN0aW9uKGIpe2IgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50P2EuY2FsbCh0aGlzLGIsbnVsbCk6ZC5jYWxsKHRoaXMsYik7cmV0dXJuIGJ9O3ZhciBmPU5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLGc9Tm9kZS5wcm90b3R5cGUucmVwbGFjZUNoaWxkO05vZGUucHJvdG90eXBlLnJlcGxhY2VDaGlsZD1mdW5jdGlvbihiLGMpe2IgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50PyhhLmNhbGwodGhpcyxiLGMpLGYuY2FsbCh0aGlzLGMpKTpnLmNhbGwodGhpcyxiLGMpO3JldHVybiBjfTtEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudD0KZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNyZWF0ZUVsZW1lbnQoImRmIik7YS5fX3Byb3RvX189RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGU7cmV0dXJuIGF9O3ZhciBoPURvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlO0RvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlPWZ1bmN0aW9uKGEsYil7Yj1oLmNhbGwodGhpcyxhLGJ8fCExKTthIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCYmKGIuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlKTtyZXR1cm4gYn19KCk7dmFyIGY9Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlLGc9RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQsaD1Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZSxrPU5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLGw9Tm9kZS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQsbT1Ob2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQscT1ET01QYXJzZXIucHJvdG90eXBlLnBhcnNlRnJvbVN0cmluZywKeD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpfHx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5uZXJIVE1MfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5pbm5lckhUTUw9YX19LE09T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuTm9kZS5wcm90b3R5cGUsImNoaWxkTm9kZXMiKXx8e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9fSxVPUVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwsdWE9RG9jdW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwsbGI9RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbCxtYj1mdW5jdGlvbigpe2lmKCFjKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpLGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtiLmNvbnRlbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOwphLmNvbnRlbnQuYXBwZW5kQ2hpbGQoYik7YT1hLmNsb25lTm9kZSghMCk7cmV0dXJuIDA9PT1hLmNvbnRlbnQuY2hpbGROb2Rlcy5sZW5ndGh8fDA9PT1hLmNvbnRlbnQuZmlyc3RDaGlsZC5jb250ZW50LmNoaWxkTm9kZXMubGVuZ3RofHxkfX0oKTtpZihjKXt2YXIgUz1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoInRlbXBsYXRlIiksQz0hMCxWPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7Vi50ZXh0Q29udGVudD0idGVtcGxhdGV7ZGlzcGxheTpub25lO30iO3ZhciBoYT1kb2N1bWVudC5oZWFkO2hhLmluc2VydEJlZm9yZShWLGhhLmZpcnN0RWxlbWVudENoaWxkKTthLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEhUTUxFbGVtZW50LnByb3RvdHlwZSk7dmFyIHZhPSFkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5oYXNPd25Qcm9wZXJ0eSgiaW5uZXJIVE1MIik7YS5HPWZ1bmN0aW9uKGIpe2lmKCFiLmNvbnRlbnQmJmIubmFtZXNwYWNlVVJJPT09CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkpe2IuY29udGVudD1TLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtmb3IodmFyIGM7Yz1iLmZpcnN0Q2hpbGQ7KWwuY2FsbChiLmNvbnRlbnQsYyk7aWYodmEpYi5fX3Byb3RvX189YS5wcm90b3R5cGU7ZWxzZSBpZihiLmNsb25lTm9kZT1mdW5jdGlvbihiKXtyZXR1cm4gYS5hKHRoaXMsYil9LEMpdHJ5e1AoYiksVyhiKX1jYXRjaChUZyl7Qz0hMX1hLkMoYi5jb250ZW50KX19O3ZhciBYPXtvcHRpb246WyJzZWxlY3QiXSx0aGVhZDpbInRhYmxlIl0sY29sOlsiY29sZ3JvdXAiLCJ0YWJsZSJdLHRyOlsidGJvZHkiLCJ0YWJsZSJdLHRoOlsidHIiLCJ0Ym9keSIsInRhYmxlIl0sdGQ6WyJ0ciIsInRib2R5IiwidGFibGUiXX0sUD1mdW5jdGlvbihiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwiaW5uZXJIVE1MIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG5iKHRoaXMpfSxzZXQ6ZnVuY3Rpb24oYil7dmFyIGM9WFsoLzwoW2Etel1bXi9cMD5ceDIwXHRcclxuXGZdKykvaS5leGVjKGIpfHwKWyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV07aWYoYylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyliPSI8IitjW2RdKyI+IitiKyI8LyIrY1tkXSsiPiI7Uy5ib2R5LmlubmVySFRNTD1iO2ZvcihhLkMoUyk7dGhpcy5jb250ZW50LmZpcnN0Q2hpbGQ7KWsuY2FsbCh0aGlzLmNvbnRlbnQsdGhpcy5jb250ZW50LmZpcnN0Q2hpbGQpO2I9Uy5ib2R5O2lmKGMpZm9yKGQ9MDtkPGMubGVuZ3RoO2QrKyliPWIubGFzdENoaWxkO2Zvcig7Yi5maXJzdENoaWxkOylsLmNhbGwodGhpcy5jb250ZW50LGIuZmlyc3RDaGlsZCl9LGNvbmZpZ3VyYWJsZTohMH0pfSxXPWZ1bmN0aW9uKGEpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJvdXRlckhUTUwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iPHRlbXBsYXRlPiIrdGhpcy5pbm5lckhUTUwrIjwvdGVtcGxhdGU+In0sc2V0OmZ1bmN0aW9uKGEpe2lmKHRoaXMucGFyZW50Tm9kZSl7Uy5ib2R5LmlubmVySFRNTD1hO2ZvcihhPXRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Uy5ib2R5LmZpcnN0Q2hpbGQ7KWwuY2FsbChhLApTLmJvZHkuZmlyc3RDaGlsZCk7bS5jYWxsKHRoaXMucGFyZW50Tm9kZSxhLHRoaXMpfWVsc2UgdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBzZXQgdGhlICdvdXRlckhUTUwnIHByb3BlcnR5IG9uICdFbGVtZW50JzogVGhpcyBlbGVtZW50IGhhcyBubyBwYXJlbnQgbm9kZS4iKTt9LGNvbmZpZ3VyYWJsZTohMH0pfTtQKGEucHJvdG90eXBlKTtXKGEucHJvdG90eXBlKTthLkM9ZnVuY3Rpb24oYyl7Yz1iKGMsInRlbXBsYXRlIik7Zm9yKHZhciBkPTAsZT1jLmxlbmd0aCxmO2Q8ZSYmKGY9Y1tkXSk7ZCsrKWEuRyhmKX07ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsZnVuY3Rpb24oKXthLkMoZG9jdW1lbnQpfSk7RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgYj1nLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsidGVtcGxhdGUiPT09Yi5sb2NhbE5hbWUmJmEuRyhiKTtyZXR1cm4gYn07RE9NUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZyb21TdHJpbmc9CmZ1bmN0aW9uKCl7dmFyIGI9cS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7YS5DKGIpO3JldHVybiBifTtPYmplY3QuZGVmaW5lUHJvcGVydHkoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmIodGhpcyl9LHNldDpmdW5jdGlvbihiKXt4LnNldC5jYWxsKHRoaXMsYik7YS5DKHRoaXMpfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pO3ZhciBWZT0vWyZcdTAwQTAiXS9nLHljPS9bJlx1MDBBMDw+XS9nLHpjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICImIjpyZXR1cm4iJmFtcDsiO2Nhc2UgIjwiOnJldHVybiImbHQ7IjtjYXNlICI+IjpyZXR1cm4iJmd0OyI7Y2FzZSAnIic6cmV0dXJuIiZxdW90OyI7Y2FzZSAiXHUwMGEwIjpyZXR1cm4iJm5ic3A7In19O1Y9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGM9MDtjPGEubGVuZ3RoO2MrKyliW2FbY11dPSEwO3JldHVybiBifTt2YXIgV2U9VigiYXJlYSBiYXNlIGJyIGNvbCBjb21tYW5kIGVtYmVkIGhyIGltZyBpbnB1dCBrZXlnZW4gbGluayBtZXRhIHBhcmFtIHNvdXJjZSB0cmFjayB3YnIiLnNwbGl0KCIgIikpLApYZT1WKCJzdHlsZSBzY3JpcHQgeG1wIGlmcmFtZSBub2VtYmVkIG5vZnJhbWVzIHBsYWludGV4dCBub3NjcmlwdCIuc3BsaXQoIiAiKSksbmI9ZnVuY3Rpb24oYSxiKXsidGVtcGxhdGUiPT09YS5sb2NhbE5hbWUmJihhPWEuY29udGVudCk7Zm9yKHZhciBjPSIiLGQ9Yj9iKGEpOk0uZ2V0LmNhbGwoYSksZT0wLGY9ZC5sZW5ndGgsZztlPGYmJihnPWRbZV0pO2UrKyl7YTp7dmFyIGg9Zzt2YXIgaz1hO3ZhciBsPWI7c3dpdGNoKGgubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Zm9yKHZhciBQPWgubG9jYWxOYW1lLG09IjwiK1AsVz1oLmF0dHJpYnV0ZXMscT0wO2s9V1txXTtxKyspbSs9IiAiK2submFtZSsnPSInK2sudmFsdWUucmVwbGFjZShWZSx6YykrJyInO20rPSI+IjtoPVdlW1BdP206bStuYihoLGwpKyI8LyIrUCsiPiI7YnJlYWsgYTtjYXNlIE5vZGUuVEVYVF9OT0RFOmg9aC5kYXRhO2g9ayYmWGVbay5sb2NhbE5hbWVdP2g6aC5yZXBsYWNlKHljLHpjKTticmVhayBhOwpjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOmg9Ilx4M2MhLS0iK2guZGF0YSsiLS1ceDNlIjticmVhayBhO2RlZmF1bHQ6dGhyb3cgd2luZG93LmNvbnNvbGUuZXJyb3IoaCksRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpO319Yys9aH1yZXR1cm4gY319aWYoY3x8bWIpe2EuYT1mdW5jdGlvbihhLGIpe3ZhciBjPWYuY2FsbChhLCExKTt0aGlzLkcmJnRoaXMuRyhjKTtiJiYobC5jYWxsKGMuY29udGVudCxmLmNhbGwoYS5jb250ZW50LCEwKSksb2IoYy5jb250ZW50LGEuY29udGVudCkpO3JldHVybiBjfTt2YXIgb2I9ZnVuY3Rpb24oYyxkKXtpZihkLnF1ZXJ5U2VsZWN0b3JBbGwmJihkPWIoZCwidGVtcGxhdGUiKSwwIT09ZC5sZW5ndGgpKXtjPWIoYywidGVtcGxhdGUiKTtmb3IodmFyIGU9MCxmPWMubGVuZ3RoLGcsaDtlPGY7ZSsrKWg9ZFtlXSxnPWNbZV0sYSYmYS5HJiZhLkcoaCksbS5jYWxsKGcucGFyZW50Tm9kZSxZZS5jYWxsKGgsITApLGcpfX0sWWU9Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlPQpmdW5jdGlvbihiKXtpZighZSYmZCYmdGhpcyBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpaWYoYil2YXIgYz1aZS5jYWxsKHRoaXMub3duZXJEb2N1bWVudCx0aGlzLCEwKTtlbHNlIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2Vsc2UgdGhpcy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiYidGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWUmJnRoaXMubmFtZXNwYWNlVVJJPT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJP2M9YS5hKHRoaXMsYik6Yz1mLmNhbGwodGhpcyxiKTtiJiZvYihjLHRoaXMpO3JldHVybiBjfSxaZT1Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZT1mdW5jdGlvbihjLGQpe2Q9ZHx8ITE7aWYoInRlbXBsYXRlIj09PWMubG9jYWxOYW1lKXJldHVybiBhLmEoYyxkKTt2YXIgZT1oLmNhbGwodGhpcyxjLGQpO2lmKGQpe29iKGUsYyk7Yz1iKGUsJ3NjcmlwdDpub3QoW3R5cGVdKSxzY3JpcHRbdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCJdLHNjcmlwdFt0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiXScpOwpmb3IodmFyIGYsaz0wO2s8Yy5sZW5ndGg7aysrKXtmPWNba107ZD1nLmNhbGwoZG9jdW1lbnQsInNjcmlwdCIpO2QudGV4dENvbnRlbnQ9Zi50ZXh0Q29udGVudDtmb3IodmFyIGw9Zi5hdHRyaWJ1dGVzLFA9MCxXO1A8bC5sZW5ndGg7UCsrKVc9bFtQXSxkLnNldEF0dHJpYnV0ZShXLm5hbWUsVy52YWx1ZSk7bS5jYWxsKGYucGFyZW50Tm9kZSxkLGYpfX1yZXR1cm4gZX19YyYmKHdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50PWEpfSkoKTt2YXIga2E9c2V0VGltZW91dDtmdW5jdGlvbiBsYSgpe31mdW5jdGlvbiBtYShhLGIpe3JldHVybiBmdW5jdGlvbigpe2EuYXBwbHkoYixhcmd1bWVudHMpfX1mdW5jdGlvbiByKGEpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlByb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ldyIpO2lmKCJmdW5jdGlvbiIhPT10eXBlb2YgYSl0aHJvdyBuZXcgVHlwZUVycm9yKCJub3QgYSBmdW5jdGlvbiIpO3RoaXMudT0wO3RoaXMubWE9ITE7dGhpcy5oPXZvaWQgMDt0aGlzLkk9W107bmEoYSx0aGlzKX0KZnVuY3Rpb24gb2EoYSxiKXtmb3IoOzM9PT1hLnU7KWE9YS5oOzA9PT1hLnU/YS5JLnB1c2goYik6KGEubWE9ITAscGEoZnVuY3Rpb24oKXt2YXIgYz0xPT09YS51P2IuTmE6Yi5PYTtpZihudWxsPT09YykoMT09PWEudT9xYTpyYSkoYi5nYSxhLmgpO2Vsc2V7dHJ5e3ZhciBkPWMoYS5oKX1jYXRjaChlKXtyYShiLmdhLGUpO3JldHVybn1xYShiLmdhLGQpfX0pKX1mdW5jdGlvbiBxYShhLGIpe3RyeXtpZihiPT09YSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBIHByb21pc2UgY2Fubm90IGJlIHJlc29sdmVkIHdpdGggaXRzZWxmLiIpO2lmKGImJigib2JqZWN0Ij09PXR5cGVvZiBifHwiZnVuY3Rpb24iPT09dHlwZW9mIGIpKXt2YXIgYz1iLnRoZW47aWYoYiBpbnN0YW5jZW9mIHIpe2EudT0zO2EuaD1iO3NhKGEpO3JldHVybn1pZigiZnVuY3Rpb24iPT09dHlwZW9mIGMpe25hKG1hKGMsYiksYSk7cmV0dXJufX1hLnU9MTthLmg9YjtzYShhKX1jYXRjaChkKXtyYShhLGQpfX0KZnVuY3Rpb24gcmEoYSxiKXthLnU9MjthLmg9YjtzYShhKX1mdW5jdGlvbiBzYShhKXsyPT09YS51JiYwPT09YS5JLmxlbmd0aCYmcGEoZnVuY3Rpb24oKXthLm1hfHwidW5kZWZpbmVkIiE9PXR5cGVvZiBjb25zb2xlJiZjb25zb2xlJiZjb25zb2xlLndhcm4oIlBvc3NpYmxlIFVuaGFuZGxlZCBQcm9taXNlIFJlamVjdGlvbjoiLGEuaCl9KTtmb3IodmFyIGI9MCxjPWEuSS5sZW5ndGg7YjxjO2IrKylvYShhLGEuSVtiXSk7YS5JPW51bGx9ZnVuY3Rpb24gdGEoYSxiLGMpe3RoaXMuTmE9ImZ1bmN0aW9uIj09PXR5cGVvZiBhP2E6bnVsbDt0aGlzLk9hPSJmdW5jdGlvbiI9PT10eXBlb2YgYj9iOm51bGw7dGhpcy5nYT1jfWZ1bmN0aW9uIG5hKGEsYil7dmFyIGM9ITE7dHJ5e2EoZnVuY3Rpb24oYSl7Y3x8KGM9ITAscWEoYixhKSl9LGZ1bmN0aW9uKGEpe2N8fChjPSEwLHJhKGIsYSkpfSl9Y2F0Y2goZCl7Y3x8KGM9ITAscmEoYixkKSl9fQpyLnByb3RvdHlwZVsiY2F0Y2giXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50aGVuKG51bGwsYSl9O3IucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcihsYSk7b2EodGhpcyxuZXcgdGEoYSxiLGMpKTtyZXR1cm4gY307ci5wcm90b3R5cGVbImZpbmFsbHkiXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbnN0cnVjdG9yO3JldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oYyl7cmV0dXJuIGIucmVzb2x2ZShhKCkpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gY30pfSxmdW5jdGlvbihjKXtyZXR1cm4gYi5yZXNvbHZlKGEoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBiLnJlamVjdChjKX0pfSl9OwpmdW5jdGlvbiB3YShhKXtyZXR1cm4gbmV3IHIoZnVuY3Rpb24oYixjKXtmdW5jdGlvbiBkKGEsZyl7dHJ5e2lmKGcmJigib2JqZWN0Ij09PXR5cGVvZiBnfHwiZnVuY3Rpb24iPT09dHlwZW9mIGcpKXt2YXIgaD1nLnRoZW47aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBoKXtoLmNhbGwoZyxmdW5jdGlvbihiKXtkKGEsYil9LGMpO3JldHVybn19ZVthXT1nOzA9PT0tLWYmJmIoZSl9Y2F0Y2gobSl7YyhtKX19aWYoIWF8fCJ1bmRlZmluZWQiPT09dHlwZW9mIGEubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIlByb21pc2UuYWxsIGFjY2VwdHMgYW4gYXJyYXkiKTt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGIoW10pO2Zvcih2YXIgZj1lLmxlbmd0aCxnPTA7ZzxlLmxlbmd0aDtnKyspZChnLGVbZ10pfSl9CmZ1bmN0aW9uIHhhKGEpe3JldHVybiBhJiYib2JqZWN0Ij09PXR5cGVvZiBhJiZhLmNvbnN0cnVjdG9yPT09cj9hOm5ldyByKGZ1bmN0aW9uKGIpe2IoYSl9KX1mdW5jdGlvbiB5YShhKXtyZXR1cm4gbmV3IHIoZnVuY3Rpb24oYixjKXtjKGEpfSl9ZnVuY3Rpb24gemEoYSl7cmV0dXJuIG5ldyByKGZ1bmN0aW9uKGIsYyl7Zm9yKHZhciBkPTAsZT1hLmxlbmd0aDtkPGU7ZCsrKWFbZF0udGhlbihiLGMpfSl9dmFyIHBhPSJmdW5jdGlvbiI9PT10eXBlb2Ygc2V0SW1tZWRpYXRlJiZmdW5jdGlvbihhKXtzZXRJbW1lZGlhdGUoYSl9fHxmdW5jdGlvbihhKXtrYShhLDApfTsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KaWYoIXdpbmRvdy5Qcm9taXNlKXt3aW5kb3cuUHJvbWlzZT1yO3IucHJvdG90eXBlLnRoZW49ci5wcm90b3R5cGUudGhlbjtyLmFsbD13YTtyLnJhY2U9emE7ci5yZXNvbHZlPXhhO3IucmVqZWN0PXlhO3ZhciBBYT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIiksQmE9W107KG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPUJhLmxlbmd0aCxiPTA7YjxhO2IrKylCYVtiXSgpO0JhLnNwbGljZSgwLGEpfSkpLm9ic2VydmUoQWEse2NoYXJhY3RlckRhdGE6ITB9KTtwYT1mdW5jdGlvbihhKXtCYS5wdXNoKGEpO0FhLnRleHRDb250ZW50PTA8QWEudGV4dENvbnRlbnQubGVuZ3RoPyIiOiJhIn19OyhmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQpcmV0dXJuIG5ldyBDdXN0b21FdmVudChhLGIpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpO2MuaW5pdEN1c3RvbUV2ZW50KGEsISFiLmJ1YmJsZXMsISFiLmNhbmNlbGFibGUsYi5kZXRhaWwpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSl7aWYoTSlyZXR1cm4gYS5vd25lckRvY3VtZW50IT09ZG9jdW1lbnQ/YS5vd25lckRvY3VtZW50Om51bGw7dmFyIGI9YS5fX2ltcG9ydERvYztpZighYiYmYS5wYXJlbnROb2RlKXtiPWEucGFyZW50Tm9kZTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGIuY2xvc2VzdCliPWIuY2xvc2VzdCgibGlua1tyZWw9aW1wb3J0XSIpO2Vsc2UgZm9yKDshaChiKSYmKGI9Yi5wYXJlbnROb2RlKTspO2EuX19pbXBvcnREb2M9Yn1yZXR1cm4gYn1mdW5jdGlvbiBkKGEpe3ZhciBiPW0oZG9jdW1lbnQsImxpbmtbcmVsPWltcG9ydF06bm90KFtpbXBvcnQtZGVwZW5kZW5jeV0pIiksCmM9Yi5sZW5ndGg7Yz9xKGIsZnVuY3Rpb24oYil7cmV0dXJuIGcoYixmdW5jdGlvbigpezA9PT0tLWMmJmEoKX0pfSk6YSgpfWZ1bmN0aW9uIGUoYSl7ZnVuY3Rpb24gYigpeyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGUmJmRvY3VtZW50LmJvZHkmJihkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIixiKSxhKCkpfWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGIpO2IoKX1mdW5jdGlvbiBmKGEpe2UoZnVuY3Rpb24oKXtyZXR1cm4gZChmdW5jdGlvbigpe3JldHVybiBhJiZhKCl9KX0pfWZ1bmN0aW9uIGcoYSxiKXtpZihhLl9fbG9hZGVkKWImJmIoKTtlbHNlIGlmKCJzY3JpcHQiPT09YS5sb2NhbE5hbWUmJiFhLnNyY3x8InN0eWxlIj09PWEubG9jYWxOYW1lJiYhYS5maXJzdENoaWxkKWEuX19sb2FkZWQ9ITAsYiYmYigpO2Vsc2V7dmFyIGM9ZnVuY3Rpb24oZCl7YS5yZW1vdmVFdmVudExpc3RlbmVyKGQudHlwZSwKYyk7YS5fX2xvYWRlZD0hMDtiJiZiKCl9O2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsYyk7aGEmJiJzdHlsZSI9PT1hLmxvY2FsTmFtZXx8YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9fWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGEubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmImxpbmsiPT09YS5sb2NhbE5hbWUmJiJpbXBvcnQiPT09YS5yZWx9ZnVuY3Rpb24gaygpe3ZhciBhPXRoaXM7dGhpcy5hPXt9O3RoaXMuYj0wO3RoaXMuYz1uZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihiKXtyZXR1cm4gYS5KYShiKX0pO3RoaXMuYy5vYnNlcnZlKGRvY3VtZW50LmhlYWQse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSk7dGhpcy5sb2FkSW1wb3J0cyhkb2N1bWVudCl9ZnVuY3Rpb24gbChhKXtxKG0oYSwidGVtcGxhdGUiKSxmdW5jdGlvbihhKXtxKG0oYS5jb250ZW50LCdzY3JpcHQ6bm90KFt0eXBlXSksc2NyaXB0W3R5cGU9ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiXSxzY3JpcHRbdHlwZT0idGV4dC9qYXZhc2NyaXB0Il0sc2NyaXB0W3R5cGU9Im1vZHVsZSJdJyksCmZ1bmN0aW9uKGEpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3EoYS5hdHRyaWJ1dGVzLGZ1bmN0aW9uKGEpe3JldHVybiBiLnNldEF0dHJpYnV0ZShhLm5hbWUsYS52YWx1ZSl9KTtiLnRleHRDb250ZW50PWEudGV4dENvbnRlbnQ7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChiLGEpfSk7bChhLmNvbnRlbnQpfSl9ZnVuY3Rpb24gbShhLGIpe3JldHVybiBhLmNoaWxkTm9kZXMubGVuZ3RoP2EucXVlcnlTZWxlY3RvckFsbChiKTpVfWZ1bmN0aW9uIHEoYSxiLGMpe3ZhciBkPWE/YS5sZW5ndGg6MCxlPWM/LTE6MTtmb3IoYz1jP2QtMTowO2M8ZCYmMDw9YztjKz1lKWIoYVtjXSxjKX12YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIiksTT0iaW1wb3J0ImluIHgsVT14LnF1ZXJ5U2VsZWN0b3JBbGwoIioiKSx1YT1udWxsOyExPT09ImN1cnJlbnRTY3JpcHQiaW4gZG9jdW1lbnQmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwiY3VycmVudFNjcmlwdCIsCntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdWF8fCgiY29tcGxldGUiIT09ZG9jdW1lbnQucmVhZHlTdGF0ZT9kb2N1bWVudC5zY3JpcHRzW2RvY3VtZW50LnNjcmlwdHMubGVuZ3RoLTFdOm51bGwpfSxjb25maWd1cmFibGU6ITB9KTt2YXIgbGI9Lyh1cmxcKCkoW14pXSopKFwpKS9nLG1iPS8oQGltcG9ydFtcc10rKD8hdXJsXCgpKShbXjtdKikoOykvZyxTPS8oPGxpbmtbXj5dKikocmVsPVsnfCJdP3N0eWxlc2hlZXRbJ3wiXT9bXj5dKj4pL2csQz17RWE6ZnVuY3Rpb24oYSxiKXthLmhyZWYmJmEuc2V0QXR0cmlidXRlKCJocmVmIixDLlgoYS5nZXRBdHRyaWJ1dGUoImhyZWYiKSxiKSk7YS5zcmMmJmEuc2V0QXR0cmlidXRlKCJzcmMiLEMuWChhLmdldEF0dHJpYnV0ZSgic3JjIiksYikpO2lmKCJzdHlsZSI9PT1hLmxvY2FsTmFtZSl7dmFyIGM9Qy5xYShhLnRleHRDb250ZW50LGIsbGIpO2EudGV4dENvbnRlbnQ9Qy5xYShjLGIsbWIpfX0scWE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLnJlcGxhY2UoYywKZnVuY3Rpb24oYSxjLGQsZSl7YT1kLnJlcGxhY2UoL1siJ10vZywiIik7YiYmKGE9Qy5YKGEsYikpO3JldHVybiBjKyInIithKyInIitlfSl9LFg6ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDA9PT1DLmFhKXtDLmFhPSExO3RyeXt2YXIgYz1uZXcgVVJMKCJiIiwiaHR0cDovL2EiKTtjLnBhdGhuYW1lPSJjJTIwZCI7Qy5hYT0iaHR0cDovL2EvYyUyMGQiPT09Yy5ocmVmfWNhdGNoKHljKXt9fWlmKEMuYWEpcmV0dXJuKG5ldyBVUkwoYSxiKSkuaHJlZjtjPUMueGE7Y3x8KGM9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCJ0ZW1wIiksQy54YT1jLGMuamE9Yy5jcmVhdGVFbGVtZW50KCJiYXNlIiksYy5oZWFkLmFwcGVuZENoaWxkKGMuamEpLGMuaWE9Yy5jcmVhdGVFbGVtZW50KCJhIikpO2MuamEuaHJlZj1iO2MuaWEuaHJlZj1hO3JldHVybiBjLmlhLmhyZWZ8fGF9fSxWPXthc3luYzohMCxsb2FkOmZ1bmN0aW9uKGEsYixjKXtpZihhKWlmKGEubWF0Y2goL15kYXRhOi8pKXthPQphLnNwbGl0KCIsIik7dmFyIGQ9YVsxXTtkPS0xPGFbMF0uaW5kZXhPZigiO2Jhc2U2NCIpP2F0b2IoZCk6ZGVjb2RlVVJJQ29tcG9uZW50KGQpO2IoZCl9ZWxzZXt2YXIgZT1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vcGVuKCJHRVQiLGEsVi5hc3luYyk7ZS5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT1lLnJlc3BvbnNlVVJMfHxlLmdldFJlc3BvbnNlSGVhZGVyKCJMb2NhdGlvbiIpO2EmJjA9PT1hLmluZGV4T2YoIi8iKSYmKGE9KGxvY2F0aW9uLm9yaWdpbnx8bG9jYXRpb24ucHJvdG9jb2wrIi8vIitsb2NhdGlvbi5ob3N0KSthKTt2YXIgZD1lLnJlc3BvbnNlfHxlLnJlc3BvbnNlVGV4dDszMDQ9PT1lLnN0YXR1c3x8MD09PWUuc3RhdHVzfHwyMDA8PWUuc3RhdHVzJiYzMDA+ZS5zdGF0dXM/YihkLGEpOmMoZCl9O2Uuc2VuZCgpfWVsc2UgYygiZXJyb3I6IGhyZWYgbXVzdCBiZSBzcGVjaWZpZWQiKX19LGhhPS9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHwvRWRnZVwvXGQuL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKay5wcm90b3R5cGUubG9hZEltcG9ydHM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczthPW0oYSwibGlua1tyZWw9aW1wb3J0XSIpO3EoYSxmdW5jdGlvbihhKXtyZXR1cm4gYi5nKGEpfSl9O2sucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPWEuaHJlZjtpZih2b2lkIDAhPT10aGlzLmFbY10pe3ZhciBkPXRoaXMuYVtjXTtkJiZkLl9fbG9hZGVkJiYoYS5fX2ltcG9ydD1kLHRoaXMuZihhKSl9ZWxzZSB0aGlzLmIrKyx0aGlzLmFbY109InBlbmRpbmciLFYubG9hZChjLGZ1bmN0aW9uKGEsZCl7YT1iLkthKGEsZHx8Yyk7Yi5hW2NdPWE7Yi5iLS07Yi5sb2FkSW1wb3J0cyhhKTtiLmwoKX0sZnVuY3Rpb24oKXtiLmFbY109bnVsbDtiLmItLTtiLmwoKX0pfTtrLnByb3RvdHlwZS5LYT1mdW5jdGlvbihhLGIpe2lmKCFhKXJldHVybiBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aGEmJihhPWEucmVwbGFjZShTLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4tMT09PQphLmluZGV4T2YoInR5cGU9Iik/YisiIHR5cGU9aW1wb3J0LWRpc2FibGUgIitjOmF9KSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtjLmlubmVySFRNTD1hO2lmKGMuY29udGVudClhPWMuY29udGVudCxsKGEpO2Vsc2UgZm9yKGE9ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2MuZmlyc3RDaGlsZDspYS5hcHBlbmRDaGlsZChjLmZpcnN0Q2hpbGQpO2lmKGM9YS5xdWVyeVNlbGVjdG9yKCJiYXNlIikpYj1DLlgoYy5nZXRBdHRyaWJ1dGUoImhyZWYiKSxiKSxjLnJlbW92ZUF0dHJpYnV0ZSgiaHJlZiIpO2M9bShhLCdsaW5rW3JlbD1pbXBvcnRdLGxpbmtbcmVsPXN0eWxlc2hlZXRdW2hyZWZdW3R5cGU9aW1wb3J0LWRpc2FibGVdLHN0eWxlOm5vdChbdHlwZV0pLGxpbmtbcmVsPXN0eWxlc2hlZXRdW2hyZWZdOm5vdChbdHlwZV0pLHNjcmlwdDpub3QoW3R5cGVdKSxzY3JpcHRbdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCJdLHNjcmlwdFt0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiXSxzY3JpcHRbdHlwZT0ibW9kdWxlIl0nKTsKdmFyIGQ9MDtxKGMsZnVuY3Rpb24oYSl7ZyhhKTtDLkVhKGEsYik7YS5zZXRBdHRyaWJ1dGUoImltcG9ydC1kZXBlbmRlbmN5IiwiIik7aWYoInNjcmlwdCI9PT1hLmxvY2FsTmFtZSYmIWEuc3JjJiZhLnRleHRDb250ZW50KXtpZigibW9kdWxlIj09PWEudHlwZSl0aHJvdyBFcnJvcigiSW5saW5lIG1vZHVsZSBzY3JpcHRzIGFyZSBub3Qgc3VwcG9ydGVkIGluIEhUTUwgSW1wb3J0cy4iKTthLnNldEF0dHJpYnV0ZSgic3JjIiwiZGF0YTp0ZXh0L2phdmFzY3JpcHQ7Y2hhcnNldD11dGYtOCwiK2VuY29kZVVSSUNvbXBvbmVudChhLnRleHRDb250ZW50KygiXG4vLyMgc291cmNlVVJMPSIrYisoZD8iLSIrZDoiIikrIi5qc1xuIikpKTthLnRleHRDb250ZW50PSIiO2QrK319KTtyZXR1cm4gYX07ay5wcm90b3R5cGUubD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7aWYoIXRoaXMuYil7dGhpcy5jLmRpc2Nvbm5lY3QoKTt0aGlzLmZsYXR0ZW4oZG9jdW1lbnQpO3ZhciBiPSExLGM9ITEsZD1mdW5jdGlvbigpe2MmJgpiJiYoYS5sb2FkSW1wb3J0cyhkb2N1bWVudCksYS5ifHwoYS5jLm9ic2VydmUoZG9jdW1lbnQuaGVhZCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxhLmRhKCkpKX07dGhpcy5NYShmdW5jdGlvbigpe2M9ITA7ZCgpfSk7dGhpcy5MYShmdW5jdGlvbigpe2I9ITA7ZCgpfSl9fTtrLnByb3RvdHlwZS5mbGF0dGVuPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7YT1tKGEsImxpbmtbcmVsPWltcG9ydF0iKTtxKGEsZnVuY3Rpb24oYSl7dmFyIGM9Yi5hW2EuaHJlZl07KGEuX19pbXBvcnQ9YykmJmMubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJihiLmFbYS5ocmVmXT1hLGEucmVhZHlTdGF0ZT0ibG9hZGluZyIsYS5fX2ltcG9ydD1hLGIuZmxhdHRlbihjKSxhLmFwcGVuZENoaWxkKGMpKX0pfTtrLnByb3RvdHlwZS5MYT1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGUpe2lmKGU8ZCl7dmFyIGY9Y1tlXSxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2YucmVtb3ZlQXR0cmlidXRlKCJpbXBvcnQtZGVwZW5kZW5jeSIpOwpxKGYuYXR0cmlidXRlcyxmdW5jdGlvbihhKXtyZXR1cm4gaC5zZXRBdHRyaWJ1dGUoYS5uYW1lLGEudmFsdWUpfSk7dWE9aDtmLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsZik7ZyhoLGZ1bmN0aW9uKCl7dWE9bnVsbDtiKGUrMSl9KX1lbHNlIGEoKX12YXIgYz1tKGRvY3VtZW50LCJzY3JpcHRbaW1wb3J0LWRlcGVuZGVuY3ldIiksZD1jLmxlbmd0aDtiKDApfTtrLnByb3RvdHlwZS5NYT1mdW5jdGlvbihhKXt2YXIgYj1tKGRvY3VtZW50LCJzdHlsZVtpbXBvcnQtZGVwZW5kZW5jeV0sbGlua1tyZWw9c3R5bGVzaGVldF1baW1wb3J0LWRlcGVuZGVuY3ldIiksZD1iLmxlbmd0aDtpZihkKXt2YXIgZT1oYSYmISFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJsaW5rW3JlbD1zdHlsZXNoZWV0XVtocmVmXVt0eXBlPWltcG9ydC1kaXNhYmxlXSIpO3EoYixmdW5jdGlvbihiKXtnKGIsZnVuY3Rpb24oKXtiLnJlbW92ZUF0dHJpYnV0ZSgiaW1wb3J0LWRlcGVuZGVuY3kiKTswPT09LS1kJiYKYSgpfSk7aWYoZSYmYi5wYXJlbnROb2RlIT09ZG9jdW1lbnQuaGVhZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChiLmxvY2FsTmFtZSk7Zi5fX2FwcGxpZWRFbGVtZW50PWI7Zi5zZXRBdHRyaWJ1dGUoInR5cGUiLCJpbXBvcnQtcGxhY2Vob2xkZXIiKTtiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGYsYi5uZXh0U2libGluZyk7Zm9yKGY9YyhiKTtmJiZjKGYpOylmPWMoZik7Zi5wYXJlbnROb2RlIT09ZG9jdW1lbnQuaGVhZCYmKGY9bnVsbCk7ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYixmKTtiLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpfX0pfWVsc2UgYSgpfTtrLnByb3RvdHlwZS5kYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1tKGRvY3VtZW50LCJsaW5rW3JlbD1pbXBvcnRdIik7cShiLGZ1bmN0aW9uKGIpe3JldHVybiBhLmYoYil9LCEwKX07ay5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXthLl9fbG9hZGVkfHwoYS5fX2xvYWRlZD0hMCxhLmltcG9ydCYmKGEuaW1wb3J0LnJlYWR5U3RhdGU9CiJjb21wbGV0ZSIpLGEuZGlzcGF0Y2hFdmVudChiKGEuaW1wb3J0PyJsb2FkIjoiZXJyb3IiLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITEsZGV0YWlsOnZvaWQgMH0pKSl9O2sucHJvdG90eXBlLkphPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7cShhLGZ1bmN0aW9uKGEpe3JldHVybiBxKGEuYWRkZWROb2RlcyxmdW5jdGlvbihhKXthJiZhLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJihoKGEpP2IuZyhhKTpiLmxvYWRJbXBvcnRzKGEpKX0pfSl9O3ZhciB2YT1udWxsO2lmKE0peD1tKGRvY3VtZW50LCJsaW5rW3JlbD1pbXBvcnRdIikscSh4LGZ1bmN0aW9uKGEpe2EuaW1wb3J0JiYibG9hZGluZyI9PT1hLmltcG9ydC5yZWFkeVN0YXRlfHwoYS5fX2xvYWRlZD0hMCl9KSx4PWZ1bmN0aW9uKGEpe2E9YS50YXJnZXQ7aChhKSYmKGEuX19sb2FkZWQ9ITApfSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIix4LCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCngsITApO2Vsc2V7dmFyIFg9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihOb2RlLnByb3RvdHlwZSwiYmFzZVVSSSIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSgoIVh8fFguY29uZmlndXJhYmxlP05vZGU6RWxlbWVudCkucHJvdG90eXBlLCJiYXNlVVJJIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIGE9aCh0aGlzKT90aGlzOmModGhpcyk7cmV0dXJuIGE/YS5ocmVmOlgmJlguZ2V0P1guZ2V0LmNhbGwodGhpcyk6KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImJhc2UiKXx8d2luZG93LmxvY2F0aW9uKS5ocmVmfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MTGlua0VsZW1lbnQucHJvdG90eXBlLCJpbXBvcnQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2ltcG9ydHx8bnVsbH0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITB9KTtlKGZ1bmN0aW9uKCl7dmE9bmV3IGt9KX1mKGZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYigiSFRNTEltcG9ydHNMb2FkZWQiLAp7Y2FuY2VsYWJsZTohMCxidWJibGVzOiEwLGRldGFpbDp2b2lkIDB9KSl9KTthLnVzZU5hdGl2ZT1NO2Eud2hlblJlYWR5PWY7YS5pbXBvcnRGb3JFbGVtZW50PWM7YS5sb2FkSW1wb3J0cz1mdW5jdGlvbihhKXt2YSYmdmEubG9hZEltcG9ydHMoYSl9fSkod2luZG93LkhUTUxJbXBvcnRzPXdpbmRvdy5IVE1MSW1wb3J0c3x8e30pOy8qCgogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwp3aW5kb3cuV2ViQ29tcG9uZW50cz13aW5kb3cuV2ViQ29tcG9uZW50c3x8e2ZsYWdzOnt9fTt2YXIgQ2E9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyYyo9IndlYmNvbXBvbmVudHMtbGl0ZS5qcyJdJyksRGE9L3djLSguKykvLHQ9e307aWYoIXQubm9PcHRzKXtsb2NhdGlvbi5zZWFyY2guc2xpY2UoMSkuc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2E9YS5zcGxpdCgiPSIpO3ZhciBiO2FbMF0mJihiPWFbMF0ubWF0Y2goRGEpKSYmKHRbYlsxXV09YVsxXXx8ITApfSk7aWYoQ2EpZm9yKHZhciBFYT0wLEZhPXZvaWQgMDtGYT1DYS5hdHRyaWJ1dGVzW0VhXTtFYSsrKSJzcmMiIT09RmEubmFtZSYmKHRbRmEubmFtZV09RmEudmFsdWV8fCEwKTtpZih0LmxvZyYmdC5sb2cuc3BsaXQpe3ZhciBHYT10LmxvZy5zcGxpdCgiLCIpO3QubG9nPXt9O0dhLmZvckVhY2goZnVuY3Rpb24oYSl7dC5sb2dbYV09ITB9KX1lbHNlIHQubG9nPXt9fQp3aW5kb3cuV2ViQ29tcG9uZW50cy5mbGFncz10O3ZhciBIYT10LnNoYWR5ZG9tO0hhJiYod2luZG93LlNoYWR5RE9NPXdpbmRvdy5TaGFkeURPTXx8e30sd2luZG93LlNoYWR5RE9NLmZvcmNlPUhhKTt2YXIgSWE9dC5yZWdpc3Rlcnx8dC5jZTtJYSYmd2luZG93LmN1c3RvbUVsZW1lbnRzJiYod2luZG93LmN1c3RvbUVsZW1lbnRzLmZvcmNlUG9seWZpbGw9SWEpOy8qCgpDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0ClRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0ClRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dApDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwpzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwpmdW5jdGlvbiBKYSgpe3RoaXMucGE9dGhpcy5yb290PW51bGw7dGhpcy5UPSExO3RoaXMuRD10aGlzLlA9dGhpcy5jYT10aGlzLmFzc2lnbmVkU2xvdD10aGlzLmFzc2lnbmVkTm9kZXM9dGhpcy5IPW51bGw7dGhpcy5jaGlsZE5vZGVzPXRoaXMubmV4dFNpYmxpbmc9dGhpcy5wcmV2aW91c1NpYmxpbmc9dGhpcy5sYXN0Q2hpbGQ9dGhpcy5maXJzdENoaWxkPXRoaXMucGFyZW50Tm9kZT10aGlzLks9dm9pZCAwO3RoaXMua2E9dGhpcy5sYT0hMTt0aGlzLk89e319SmEucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt9fTtmdW5jdGlvbiB1KGEpe2EuX19zaGFkeXx8KGEuX19zaGFkeT1uZXcgSmEpO3JldHVybiBhLl9fc2hhZHl9ZnVuY3Rpb24gdihhKXtyZXR1cm4gYSYmYS5fX3NoYWR5fTt2YXIgdz13aW5kb3cuU2hhZHlET018fHt9O3cuR2E9ISghRWxlbWVudC5wcm90b3R5cGUuYXR0YWNoU2hhZG93fHwhTm9kZS5wcm90b3R5cGUuZ2V0Um9vdE5vZGUpO3ZhciBLYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLCJmaXJzdENoaWxkIik7dy5tPSEhKEthJiZLYS5jb25maWd1cmFibGUmJkthLmdldCk7dy5lYT13LmZvcmNlfHwhdy5HYTt3Lko9dy5ub1BhdGNofHwhMTt3Lm9hPXcucHJlZmVyUGVyZm9ybWFuY2U7ZnVuY3Rpb24geShhKXtyZXR1cm4oYT12KGEpKSYmdm9pZCAwIT09YS5maXJzdENoaWxkfWZ1bmN0aW9uIHooYSl7cmV0dXJuIlNoYWR5Um9vdCI9PT1hLnphfWZ1bmN0aW9uIExhKGEpe3JldHVybihhPShhPXYoYSkpJiZhLnJvb3QpJiZNYShhKX0KdmFyIE5hPUVsZW1lbnQucHJvdG90eXBlLE9hPU5hLm1hdGNoZXN8fE5hLm1hdGNoZXNTZWxlY3Rvcnx8TmEubW96TWF0Y2hlc1NlbGVjdG9yfHxOYS5tc01hdGNoZXNTZWxlY3Rvcnx8TmEub01hdGNoZXNTZWxlY3Rvcnx8TmEud2Via2l0TWF0Y2hlc1NlbGVjdG9yLFBhPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSxRYT0wLFJhPVtdOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbigpe2Zvcig7UmEubGVuZ3RoOyl0cnl7UmEuc2hpZnQoKSgpfWNhdGNoKGEpe3Rocm93IFBhLnRleHRDb250ZW50PVFhKyssYTt9fSkpLm9ic2VydmUoUGEse2NoYXJhY3RlckRhdGE6ITB9KTtmdW5jdGlvbiBTYShhKXtSYS5wdXNoKGEpO1BhLnRleHRDb250ZW50PVFhKyt9dmFyIFRhPSEhZG9jdW1lbnQuY29udGFpbnM7ZnVuY3Rpb24gVWEoYSxiKXtmb3IoO2I7KXtpZihiPT1hKXJldHVybiEwO2I9Yi5fX3NoYWR5X3BhcmVudE5vZGV9cmV0dXJuITF9CmZ1bmN0aW9uIFZhKGEpe2Zvcih2YXIgYj1hLmxlbmd0aC0xOzA8PWI7Yi0tKXt2YXIgYz1hW2JdLGQ9Yy5nZXRBdHRyaWJ1dGUoImlkIil8fGMuZ2V0QXR0cmlidXRlKCJuYW1lIik7ZCYmImxlbmd0aCIhPT1kJiZpc05hTihkKSYmKGFbZF09Yyl9YS5pdGVtPWZ1bmN0aW9uKGIpe3JldHVybiBhW2JdfTthLm5hbWVkSXRlbT1mdW5jdGlvbihiKXtpZigibGVuZ3RoIiE9PWImJmlzTmFOKGIpJiZhW2JdKXJldHVybiBhW2JdO2Zvcih2YXIgYz1pYShhKSxkPWMubmV4dCgpOyFkLmRvbmU7ZD1jLm5leHQoKSlpZihkPWQudmFsdWUsKGQuZ2V0QXR0cmlidXRlKCJpZCIpfHxkLmdldEF0dHJpYnV0ZSgibmFtZSIpKT09YilyZXR1cm4gZDtyZXR1cm4gbnVsbH07cmV0dXJuIGF9CmZ1bmN0aW9uIEEoYSxiLGMsZCl7Yz12b2lkIDA9PT1jPyIiOmM7Zm9yKHZhciBlIGluIGIpe3ZhciBmPWJbZV07aWYoIShkJiYwPD1kLmluZGV4T2YoZSkpKXtmLmNvbmZpZ3VyYWJsZT0hMDt2YXIgZz1jK2U7aWYoZi52YWx1ZSlhW2ddPWYudmFsdWU7ZWxzZSB0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZyxmKX1jYXRjaChoKXt9fX19ZnVuY3Rpb24gQihhKXt2YXIgYj17fTtPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2JbY109T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLGMpfSk7cmV0dXJuIGJ9O3ZhciBXYT1bXSxYYTtmdW5jdGlvbiBZYShhKXtYYXx8KFhhPSEwLFNhKFphKSk7V2EucHVzaChhKX1mdW5jdGlvbiBaYSgpe1hhPSExO2Zvcih2YXIgYT0hIVdhLmxlbmd0aDtXYS5sZW5ndGg7KVdhLnNoaWZ0KCkoKTtyZXR1cm4gYX1aYS5saXN0PVdhO2Z1bmN0aW9uICRhKCl7dGhpcy5hPSExO3RoaXMuYWRkZWROb2Rlcz1bXTt0aGlzLnJlbW92ZWROb2Rlcz1bXTt0aGlzLlM9bmV3IFNldH1mdW5jdGlvbiBhYihhKXthLmF8fChhLmE9ITAsU2EoZnVuY3Rpb24oKXthLmZsdXNoKCl9KSl9JGEucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7aWYodGhpcy5hKXt0aGlzLmE9ITE7dmFyIGE9dGhpcy50YWtlUmVjb3JkcygpO2EubGVuZ3RoJiZ0aGlzLlMuZm9yRWFjaChmdW5jdGlvbihiKXtiKGEpfSl9fTskYS5wcm90b3R5cGUudGFrZVJlY29yZHM9ZnVuY3Rpb24oKXtpZih0aGlzLmFkZGVkTm9kZXMubGVuZ3RofHx0aGlzLnJlbW92ZWROb2Rlcy5sZW5ndGgpe3ZhciBhPVt7YWRkZWROb2Rlczp0aGlzLmFkZGVkTm9kZXMscmVtb3ZlZE5vZGVzOnRoaXMucmVtb3ZlZE5vZGVzfV07dGhpcy5hZGRlZE5vZGVzPVtdO3RoaXMucmVtb3ZlZE5vZGVzPVtdO3JldHVybiBhfXJldHVybltdfTsKZnVuY3Rpb24gYmIoYSxiKXt2YXIgYz11KGEpO2MuSHx8KGMuSD1uZXcgJGEpO2MuSC5TLmFkZChiKTt2YXIgZD1jLkg7cmV0dXJue3lhOmIsRjpkLEFhOmEsdGFrZVJlY29yZHM6ZnVuY3Rpb24oKXtyZXR1cm4gZC50YWtlUmVjb3JkcygpfX19ZnVuY3Rpb24gY2IoYSl7dmFyIGI9YSYmYS5GO2ImJihiLlMuZGVsZXRlKGEueWEpLGIuUy5zaXplfHwodShhLkFhKS5IPW51bGwpKX0KZnVuY3Rpb24gZGIoYSxiKXt2YXIgYz1iLmdldFJvb3ROb2RlKCk7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEpe3ZhciBiPWM9PT1hLnRhcmdldC5nZXRSb290Tm9kZSgpO2lmKGImJmEuYWRkZWROb2Rlcyl7aWYoYj1BcnJheS5mcm9tKGEuYWRkZWROb2RlcykuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBjPT09YS5nZXRSb290Tm9kZSgpfSksYi5sZW5ndGgpcmV0dXJuIGE9T2JqZWN0LmNyZWF0ZShhKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiYWRkZWROb2RlcyIse3ZhbHVlOmIsY29uZmlndXJhYmxlOiEwfSksYX1lbHNlIGlmKGIpcmV0dXJuIGF9KS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGF9KX07dmFyIGViPS9bJlx1MDBBMCJdL2csZmI9L1smXHUwMEEwPD5dL2c7ZnVuY3Rpb24gZ2IoYSl7c3dpdGNoKGEpe2Nhc2UgIiYiOnJldHVybiImYW1wOyI7Y2FzZSAiPCI6cmV0dXJuIiZsdDsiO2Nhc2UgIj4iOnJldHVybiImZ3Q7IjtjYXNlICciJzpyZXR1cm4iJnF1b3Q7IjtjYXNlICJcdTAwYTAiOnJldHVybiImbmJzcDsifX1mdW5jdGlvbiBoYihhKXtmb3IodmFyIGI9e30sYz0wO2M8YS5sZW5ndGg7YysrKWJbYVtjXV09ITA7cmV0dXJuIGJ9dmFyIGliPWhiKCJhcmVhIGJhc2UgYnIgY29sIGNvbW1hbmQgZW1iZWQgaHIgaW1nIGlucHV0IGtleWdlbiBsaW5rIG1ldGEgcGFyYW0gc291cmNlIHRyYWNrIHdiciIuc3BsaXQoIiAiKSksamI9aGIoInN0eWxlIHNjcmlwdCB4bXAgaWZyYW1lIG5vZW1iZWQgbm9mcmFtZXMgcGxhaW50ZXh0IG5vc2NyaXB0Ii5zcGxpdCgiICIpKTsKZnVuY3Rpb24ga2IoYSxiKXsidGVtcGxhdGUiPT09YS5sb2NhbE5hbWUmJihhPWEuY29udGVudCk7Zm9yKHZhciBjPSIiLGQ9Yj9iKGEpOmEuY2hpbGROb2RlcyxlPTAsZj1kLmxlbmd0aCxnPXZvaWQgMDtlPGYmJihnPWRbZV0pO2UrKyl7YTp7dmFyIGg9Zzt2YXIgaz1hLGw9Yjtzd2l0Y2goaC5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTprPWgubG9jYWxOYW1lO2Zvcih2YXIgbT0iPCIrayxxPWguYXR0cmlidXRlcyx4PTAsTTtNPXFbeF07eCsrKW0rPSIgIitNLm5hbWUrJz0iJytNLnZhbHVlLnJlcGxhY2UoZWIsZ2IpKyciJzttKz0iPiI7aD1pYltrXT9tOm0ra2IoaCxsKSsiPC8iK2srIj4iO2JyZWFrIGE7Y2FzZSBOb2RlLlRFWFRfTk9ERTpoPWguZGF0YTtoPWsmJmpiW2subG9jYWxOYW1lXT9oOmgucmVwbGFjZShmYixnYik7YnJlYWsgYTtjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOmg9Ilx4M2MhLS0iK2guZGF0YSsiLS1ceDNlIjticmVhayBhO2RlZmF1bHQ6dGhyb3cgd2luZG93LmNvbnNvbGUuZXJyb3IoaCksCkVycm9yKCJub3QgaW1wbGVtZW50ZWQiKTt9fWMrPWh9cmV0dXJuIGN9O3ZhciBwYj13Lm0scWI9e3F1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfcXVlcnlTZWxlY3RvcihhKX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9xdWVyeVNlbGVjdG9yQWxsKGEpfX0scmI9e307ZnVuY3Rpb24gc2IoYSl7cmJbYV09ZnVuY3Rpb24oYil7cmV0dXJuIGJbIl9fc2hhZHlfbmF0aXZlXyIrYV19fWZ1bmN0aW9uIHRiKGEsYil7QShhLGIsIl9fc2hhZHlfbmF0aXZlXyIpO2Zvcih2YXIgYyBpbiBiKXNiKGMpfWZ1bmN0aW9uIEQoYSxiKXtiPXZvaWQgMD09PWI/W106Yjtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXSxlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYSxkKTtlJiYoT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIl9fc2hhZHlfbmF0aXZlXyIrZCxlKSxlLnZhbHVlP3FiW2RdfHwocWJbZF09ZS52YWx1ZSk6c2IoZCkpfX0KdmFyIEU9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCxOb2RlRmlsdGVyLlNIT1dfQUxMLG51bGwsITEpLEY9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCxOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCxudWxsLCExKSx1Yj1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoImluZXJ0Iik7ZnVuY3Rpb24gdmIoYSl7Zm9yKHZhciBiO2I9YS5fX3NoYWR5X25hdGl2ZV9maXJzdENoaWxkOylhLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGIpfXZhciB3Yj1bImZpcnN0RWxlbWVudENoaWxkIiwibGFzdEVsZW1lbnRDaGlsZCIsImNoaWxkcmVuIiwiY2hpbGRFbGVtZW50Q291bnQiXSx4Yj1bInF1ZXJ5U2VsZWN0b3IiLCJxdWVyeVNlbGVjdG9yQWxsIl07CmZ1bmN0aW9uIHliKCl7dmFyIGE9WyJkaXNwYXRjaEV2ZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiXTt3aW5kb3cuRXZlbnRUYXJnZXQ/RCh3aW5kb3cuRXZlbnRUYXJnZXQucHJvdG90eXBlLGEpOihEKE5vZGUucHJvdG90eXBlLGEpLEQoV2luZG93LnByb3RvdHlwZSxhKSk7cGI/RChOb2RlLnByb3RvdHlwZSwicGFyZW50Tm9kZSBmaXJzdENoaWxkIGxhc3RDaGlsZCBwcmV2aW91c1NpYmxpbmcgbmV4dFNpYmxpbmcgY2hpbGROb2RlcyBwYXJlbnRFbGVtZW50IHRleHRDb250ZW50Ii5zcGxpdCgiICIpKTp0YihOb2RlLnByb3RvdHlwZSx7cGFyZW50Tm9kZTp7Z2V0OmZ1bmN0aW9uKCl7RS5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBFLnBhcmVudE5vZGUoKX19LGZpcnN0Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRS5maXJzdENoaWxkKCl9fSxsYXN0Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9CnRoaXM7cmV0dXJuIEUubGFzdENoaWxkKCl9fSxwcmV2aW91c1NpYmxpbmc6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRS5wcmV2aW91c1NpYmxpbmcoKX19LG5leHRTaWJsaW5nOntnZXQ6ZnVuY3Rpb24oKXtFLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEUubmV4dFNpYmxpbmcoKX19LGNoaWxkTm9kZXM6e2dldDpmdW5jdGlvbigpe3ZhciBhPVtdO0UuY3VycmVudE5vZGU9dGhpcztmb3IodmFyIGM9RS5maXJzdENoaWxkKCk7YzspYS5wdXNoKGMpLGM9RS5uZXh0U2libGluZygpO3JldHVybiBhfX0scGFyZW50RWxlbWVudDp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLnBhcmVudE5vZGUoKX19LHRleHRDb250ZW50OntnZXQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpmb3IodmFyIGE9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcih0aGlzLApOb2RlRmlsdGVyLlNIT1dfVEVYVCxudWxsLCExKSxjPSIiLGQ7ZD1hLm5leHROb2RlKCk7KWMrPWQubm9kZVZhbHVlO3JldHVybiBjO2RlZmF1bHQ6cmV0dXJuIHRoaXMubm9kZVZhbHVlfX0sc2V0OmZ1bmN0aW9uKGEpe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGF8fG51bGw9PT1hKWE9IiI7c3dpdGNoKHRoaXMubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Y2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6dmIodGhpcyk7KDA8YS5sZW5ndGh8fHRoaXMubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSkmJnRoaXMuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGEpLHZvaWQgMCk7YnJlYWs7ZGVmYXVsdDp0aGlzLm5vZGVWYWx1ZT1hfX19fSk7RChOb2RlLnByb3RvdHlwZSwiYXBwZW5kQ2hpbGQgaW5zZXJ0QmVmb3JlIHJlbW92ZUNoaWxkIHJlcGxhY2VDaGlsZCBjbG9uZU5vZGUgY29udGFpbnMiLnNwbGl0KCIgIikpOwphPXtmaXJzdEVsZW1lbnRDaGlsZDp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLmZpcnN0Q2hpbGQoKX19LGxhc3RFbGVtZW50Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0YuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRi5sYXN0Q2hpbGQoKX19LGNoaWxkcmVuOntnZXQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtGLmN1cnJlbnROb2RlPXRoaXM7Zm9yKHZhciBjPUYuZmlyc3RDaGlsZCgpO2M7KWEucHVzaChjKSxjPUYubmV4dFNpYmxpbmcoKTtyZXR1cm4gVmEoYSl9fSxjaGlsZEVsZW1lbnRDb3VudDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4/dGhpcy5jaGlsZHJlbi5sZW5ndGg6MH19fTtwYj8oRChFbGVtZW50LnByb3RvdHlwZSx3YiksRChFbGVtZW50LnByb3RvdHlwZSxbInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJuZXh0RWxlbWVudFNpYmxpbmciLCJpbm5lckhUTUwiXSksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsCiJjaGlsZHJlbiIpJiZEKEhUTUxFbGVtZW50LnByb3RvdHlwZSxbImNoaWxkcmVuIl0pLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiKSYmRChIVE1MRWxlbWVudC5wcm90b3R5cGUsWyJpbm5lckhUTUwiXSkpOih0YihFbGVtZW50LnByb3RvdHlwZSxhKSx0YihFbGVtZW50LnByb3RvdHlwZSx7cHJldmlvdXNFbGVtZW50U2libGluZzp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLnByZXZpb3VzU2libGluZygpfX0sbmV4dEVsZW1lbnRTaWJsaW5nOntnZXQ6ZnVuY3Rpb24oKXtGLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEYubmV4dFNpYmxpbmcoKX19LGlubmVySFRNTDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGtiKHRoaXMsZnVuY3Rpb24oYSl7cmV0dXJuIGEuX19zaGFkeV9uYXRpdmVfY2hpbGROb2Rlc30pfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9InRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lPwp0aGlzLmNvbnRlbnQ6dGhpczt2YihiKTt2YXIgZD10aGlzLmxvY2FsTmFtZXx8ImRpdiI7ZD10aGlzLm5hbWVzcGFjZVVSSSYmdGhpcy5uYW1lc3BhY2VVUkkhPT11Yi5uYW1lc3BhY2VVUkk/dWIuY3JlYXRlRWxlbWVudE5TKHRoaXMubmFtZXNwYWNlVVJJLGQpOnViLmNyZWF0ZUVsZW1lbnQoZCk7ZC5pbm5lckhUTUw9YTtmb3IoYT0idGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWU/ZC5jb250ZW50OmQ7ZD1hLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGQ7KWIuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGQsdm9pZCAwKX19fSkpO0QoRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUgaGFzQXR0cmlidXRlIHJlbW92ZUF0dHJpYnV0ZSBmb2N1cyBibHVyIi5zcGxpdCgiICIpKTtEKEVsZW1lbnQucHJvdG90eXBlLHhiKTtEKEhUTUxFbGVtZW50LnByb3RvdHlwZSxbImZvY3VzIiwiYmx1ciIsImNvbnRhaW5zIl0pO3BiJiZEKEhUTUxFbGVtZW50LnByb3RvdHlwZSwKWyJwYXJlbnRFbGVtZW50IiwiY2hpbGRyZW4iLCJpbm5lckhUTUwiXSk7d2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQmJkQod2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQucHJvdG90eXBlLFsiaW5uZXJIVE1MIl0pO3BiP0QoRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUsd2IpOnRiKERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLGEpO0QoRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUseGIpO3BiPyhEKERvY3VtZW50LnByb3RvdHlwZSx3YiksRChEb2N1bWVudC5wcm90b3R5cGUsWyJhY3RpdmVFbGVtZW50Il0pKTp0YihEb2N1bWVudC5wcm90b3R5cGUsYSk7RChEb2N1bWVudC5wcm90b3R5cGUsWyJpbXBvcnROb2RlIiwiZ2V0RWxlbWVudEJ5SWQiXSk7RChEb2N1bWVudC5wcm90b3R5cGUseGIpfTt2YXIgemI9Qih7Z2V0IGNoaWxkTm9kZXMoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2NoaWxkTm9kZXN9LGdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9maXJzdENoaWxkfSxnZXQgbGFzdENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9sYXN0Q2hpbGR9LGdldCB0ZXh0Q29udGVudCgpe3JldHVybiB0aGlzLl9fc2hhZHlfdGV4dENvbnRlbnR9LHNldCB0ZXh0Q29udGVudChhKXt0aGlzLl9fc2hhZHlfdGV4dENvbnRlbnQ9YX0sZ2V0IGNoaWxkRWxlbWVudENvdW50KCl7cmV0dXJuIHRoaXMuX19zaGFkeV9jaGlsZEVsZW1lbnRDb3VudH0sZ2V0IGNoaWxkcmVuKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9jaGlsZHJlbn0sZ2V0IGZpcnN0RWxlbWVudENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9maXJzdEVsZW1lbnRDaGlsZH0sZ2V0IGxhc3RFbGVtZW50Q2hpbGQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2xhc3RFbGVtZW50Q2hpbGR9LGdldCBpbm5lckhUTUwoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2lubmVySFRNTH0sCnNldCBpbm5lckhUTUwoYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9pbm5lckhUTUw9YX0sZ2V0IHNoYWRvd1Jvb3QoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3NoYWRvd1Jvb3R9fSksQWI9Qih7Z2V0IHBhcmVudEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3BhcmVudEVsZW1lbnR9LGdldCBwYXJlbnROb2RlKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9wYXJlbnROb2RlfSxnZXQgbmV4dFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25leHRTaWJsaW5nfSxnZXQgcHJldmlvdXNTaWJsaW5nKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9wcmV2aW91c1NpYmxpbmd9LGdldCBuZXh0RWxlbWVudFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25leHRFbGVtZW50U2libGluZ30sZ2V0IHByZXZpb3VzRWxlbWVudFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3ByZXZpb3VzRWxlbWVudFNpYmxpbmd9LGdldCBjbGFzc05hbWUoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2NsYXNzTmFtZX0sCnNldCBjbGFzc05hbWUoYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9jbGFzc05hbWU9YX19KSxCYjtmb3IoQmIgaW4gemIpemJbQmJdLmVudW1lcmFibGU9ITE7Zm9yKHZhciBDYiBpbiBBYilBYltDYl0uZW51bWVyYWJsZT0hMTt2YXIgRGI9dy5tfHx3LkosRWI9RGI/ZnVuY3Rpb24oKXt9OmZ1bmN0aW9uKGEpe3ZhciBiPXUoYSk7Yi5sYXx8KGIubGE9ITAsQShhLEFiKSl9LEZiPURiP2Z1bmN0aW9uKCl7fTpmdW5jdGlvbihhKXt2YXIgYj11KGEpO2Iua2F8fChiLmthPSEwLEEoYSx6YikpfTt2YXIgR2I9Il9fZXZlbnRXcmFwcGVycyIrRGF0ZS5ub3coKSxIYj1mdW5jdGlvbigpe3ZhciBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXZlbnQucHJvdG90eXBlLCJjb21wb3NlZCIpO3JldHVybiBhP2Z1bmN0aW9uKGIpe3JldHVybiBhLmdldC5jYWxsKGIpfTpudWxsfSgpLEliPXtibHVyOiEwLGZvY3VzOiEwLGZvY3VzaW46ITAsZm9jdXNvdXQ6ITAsY2xpY2s6ITAsZGJsY2xpY2s6ITAsbW91c2Vkb3duOiEwLG1vdXNlZW50ZXI6ITAsbW91c2VsZWF2ZTohMCxtb3VzZW1vdmU6ITAsbW91c2VvdXQ6ITAsbW91c2VvdmVyOiEwLG1vdXNldXA6ITAsd2hlZWw6ITAsYmVmb3JlaW5wdXQ6ITAsaW5wdXQ6ITAsa2V5ZG93bjohMCxrZXl1cDohMCxjb21wb3NpdGlvbnN0YXJ0OiEwLGNvbXBvc2l0aW9udXBkYXRlOiEwLGNvbXBvc2l0aW9uZW5kOiEwLHRvdWNoc3RhcnQ6ITAsdG91Y2hlbmQ6ITAsdG91Y2htb3ZlOiEwLHRvdWNoY2FuY2VsOiEwLHBvaW50ZXJvdmVyOiEwLApwb2ludGVyZW50ZXI6ITAscG9pbnRlcmRvd246ITAscG9pbnRlcm1vdmU6ITAscG9pbnRlcnVwOiEwLHBvaW50ZXJjYW5jZWw6ITAscG9pbnRlcm91dDohMCxwb2ludGVybGVhdmU6ITAsZ290cG9pbnRlcmNhcHR1cmU6ITAsbG9zdHBvaW50ZXJjYXB0dXJlOiEwLGRyYWdzdGFydDohMCxkcmFnOiEwLGRyYWdlbnRlcjohMCxkcmFnbGVhdmU6ITAsZHJhZ292ZXI6ITAsZHJvcDohMCxkcmFnZW5kOiEwLERPTUFjdGl2YXRlOiEwLERPTUZvY3VzSW46ITAsRE9NRm9jdXNPdXQ6ITAsa2V5cHJlc3M6ITB9LEpiPXtET01BdHRyTW9kaWZpZWQ6ITAsRE9NQXR0cmlidXRlTmFtZUNoYW5nZWQ6ITAsRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkOiEwLERPTUVsZW1lbnROYW1lQ2hhbmdlZDohMCxET01Ob2RlSW5zZXJ0ZWQ6ITAsRE9NTm9kZUluc2VydGVkSW50b0RvY3VtZW50OiEwLERPTU5vZGVSZW1vdmVkOiEwLERPTU5vZGVSZW1vdmVkRnJvbURvY3VtZW50OiEwLERPTVN1YnRyZWVNb2RpZmllZDohMH07CmZ1bmN0aW9uIEtiKGEpe3JldHVybiBhIGluc3RhbmNlb2YgTm9kZT9hLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKTphfWZ1bmN0aW9uIExiKGEsYil7dmFyIGM9W10sZD1hO2ZvcihhPUtiKGEpO2Q7KWMucHVzaChkKSxkLl9fc2hhZHlfYXNzaWduZWRTbG90P2Q9ZC5fX3NoYWR5X2Fzc2lnbmVkU2xvdDpkLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFJiZkLmhvc3QmJihifHxkIT09YSk/ZD1kLmhvc3Q6ZD1kLl9fc2hhZHlfcGFyZW50Tm9kZTtjW2MubGVuZ3RoLTFdPT09ZG9jdW1lbnQmJmMucHVzaCh3aW5kb3cpO3JldHVybiBjfWZ1bmN0aW9uIE1iKGEpe2EuX19jb21wb3NlZFBhdGh8fChhLl9fY29tcG9zZWRQYXRoPUxiKGEudGFyZ2V0LCEwKSk7cmV0dXJuIGEuX19jb21wb3NlZFBhdGh9CmZ1bmN0aW9uIE5iKGEsYil7aWYoIXopcmV0dXJuIGE7YT1MYihhLCEwKTtmb3IodmFyIGM9MCxkLGU9dm9pZCAwLGYsZz12b2lkIDA7YzxiLmxlbmd0aDtjKyspaWYoZD1iW2NdLGY9S2IoZCksZiE9PWUmJihnPWEuaW5kZXhPZihmKSxlPWYpLCF6KGYpfHwtMTxnKXJldHVybiBkfWZ1bmN0aW9uIE9iKGEpe2Z1bmN0aW9uIGIoYixkKXtiPW5ldyBhKGIsZCk7Yi5fX2NvbXBvc2VkPWQmJiEhZC5jb21wb3NlZDtyZXR1cm4gYn1iLl9fcHJvdG9fXz1hO2IucHJvdG90eXBlPWEucHJvdG90eXBlO3JldHVybiBifXZhciBQYj17Zm9jdXM6ITAsYmx1cjohMH07ZnVuY3Rpb24gUWIoYSl7cmV0dXJuIGEuX190YXJnZXQhPT1hLnRhcmdldHx8YS5fX3JlbGF0ZWRUYXJnZXQhPT1hLnJlbGF0ZWRUYXJnZXR9CmZ1bmN0aW9uIFJiKGEsYixjKXtpZihjPWIuX19oYW5kbGVycyYmYi5fX2hhbmRsZXJzW2EudHlwZV0mJmIuX19oYW5kbGVyc1thLnR5cGVdW2NdKWZvcih2YXIgZD0wLGU7KGU9Y1tkXSkmJighUWIoYSl8fGEudGFyZ2V0IT09YS5yZWxhdGVkVGFyZ2V0KSYmKGUuY2FsbChiLGEpLCFhLl9faW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKTtkKyspO30KZnVuY3Rpb24gU2IoYSl7dmFyIGI9YS5jb21wb3NlZFBhdGgoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiY3VycmVudFRhcmdldCIse2dldDpmdW5jdGlvbigpe3JldHVybiBkfSxjb25maWd1cmFibGU6ITB9KTtmb3IodmFyIGM9Yi5sZW5ndGgtMTswPD1jO2MtLSl7dmFyIGQ9YltjXTtSYihhLGQsImNhcHR1cmUiKTtpZihhLlopcmV0dXJufU9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJldmVudFBoYXNlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEV2ZW50LkFUX1RBUkdFVH19KTt2YXIgZTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKXtkPWJbY107dmFyIGY9dihkKTtmPWYmJmYucm9vdDtpZigwPT09Y3x8ZiYmZj09PWUpaWYoUmIoYSxkLCJidWJibGUiKSxkIT09d2luZG93JiYoZT1kLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKSksYS5aKWJyZWFrfX0KZnVuY3Rpb24gVGIoYSxiLGMsZCxlLGYpe2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXt2YXIgaD1hW2ddLGs9aC50eXBlLGw9aC5jYXB0dXJlLG09aC5vbmNlLHE9aC5wYXNzaXZlO2lmKGI9PT1oLm5vZGUmJmM9PT1rJiZkPT09bCYmZT09PW0mJmY9PT1xKXJldHVybiBnfXJldHVybi0xfQpmdW5jdGlvbiBVYihhLGIsYyl7aWYoYil7dmFyIGQ9dHlwZW9mIGI7aWYoImZ1bmN0aW9uIj09PWR8fCJvYmplY3QiPT09ZClpZigib2JqZWN0IiE9PWR8fGIuaGFuZGxlRXZlbnQmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5oYW5kbGVFdmVudCl7aWYoSmJbYV0pcmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfYWRkRXZlbnRMaXN0ZW5lcihhLGIsYyk7aWYoYyYmIm9iamVjdCI9PT10eXBlb2YgYyl7dmFyIGU9ISFjLmNhcHR1cmU7dmFyIGY9ISFjLm9uY2U7dmFyIGc9ISFjLnBhc3NpdmV9ZWxzZSBlPSEhYyxnPWY9ITE7dmFyIGg9YyYmYy4kfHx0aGlzLGs9YltHYl07aWYoayl7aWYoLTE8VGIoayxoLGEsZSxmLGcpKXJldHVybn1lbHNlIGJbR2JdPVtdO2s9ZnVuY3Rpb24oZSl7ZiYmdGhpcy5fX3NoYWR5X3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxiLGMpO2UuX190YXJnZXR8fFZiKGUpO2lmKGghPT10aGlzKXt2YXIgZz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsImN1cnJlbnRUYXJnZXQiKTsKT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImN1cnJlbnRUYXJnZXQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaH0sY29uZmlndXJhYmxlOiEwfSl9ZS5fX3ByZXZpb3VzQ3VycmVudFRhcmdldD1lLmN1cnJlbnRUYXJnZXQ7aWYoIXooaCl8fC0xIT1lLmNvbXBvc2VkUGF0aCgpLmluZGV4T2YoaCkpaWYoZS5jb21wb3NlZHx8LTE8ZS5jb21wb3NlZFBhdGgoKS5pbmRleE9mKGgpKWlmKFFiKGUpJiZlLnRhcmdldD09PWUucmVsYXRlZFRhcmdldCllLmV2ZW50UGhhc2U9PT1FdmVudC5CVUJCTElOR19QSEFTRSYmZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtlbHNlIGlmKGUuZXZlbnRQaGFzZT09PUV2ZW50LkNBUFRVUklOR19QSEFTRXx8ZS5idWJibGVzfHxlLnRhcmdldD09PWh8fGggaW5zdGFuY2VvZiBXaW5kb3cpe3ZhciBrPSJmdW5jdGlvbiI9PT1kP2IuY2FsbChoLGUpOmIuaGFuZGxlRXZlbnQmJmIuaGFuZGxlRXZlbnQoZSk7aCE9PXRoaXMmJihnPyhPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwKImN1cnJlbnRUYXJnZXQiLGcpLGc9bnVsbCk6ZGVsZXRlIGUuY3VycmVudFRhcmdldCk7cmV0dXJuIGt9fTtiW0diXS5wdXNoKHtub2RlOmgsdHlwZTphLGNhcHR1cmU6ZSxvbmNlOmYscGFzc2l2ZTpnLFlhOmt9KTtQYlthXT8odGhpcy5fX2hhbmRsZXJzPXRoaXMuX19oYW5kbGVyc3x8e30sdGhpcy5fX2hhbmRsZXJzW2FdPXRoaXMuX19oYW5kbGVyc1thXXx8e2NhcHR1cmU6W10sYnViYmxlOltdfSx0aGlzLl9faGFuZGxlcnNbYV1bZT8iY2FwdHVyZSI6ImJ1YmJsZSJdLnB1c2goaykpOnRoaXMuX19zaGFkeV9uYXRpdmVfYWRkRXZlbnRMaXN0ZW5lcihhLGssYyl9fX0KZnVuY3Rpb24gV2IoYSxiLGMpe2lmKGIpe2lmKEpiW2FdKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxiLGMpO2lmKGMmJiJvYmplY3QiPT09dHlwZW9mIGMpe3ZhciBkPSEhYy5jYXB0dXJlO3ZhciBlPSEhYy5vbmNlO3ZhciBmPSEhYy5wYXNzaXZlfWVsc2UgZD0hIWMsZj1lPSExO3ZhciBnPWMmJmMuJHx8dGhpcyxoPXZvaWQgMDt2YXIgaz1udWxsO3RyeXtrPWJbR2JdfWNhdGNoKGwpe31rJiYoZT1UYihrLGcsYSxkLGUsZiksLTE8ZSYmKGg9ay5zcGxpY2UoZSwxKVswXS5ZYSxrLmxlbmd0aHx8KGJbR2JdPXZvaWQgMCkpKTt0aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxofHxiLGMpO2gmJlBiW2FdJiZ0aGlzLl9faGFuZGxlcnMmJnRoaXMuX19oYW5kbGVyc1thXSYmKGE9dGhpcy5fX2hhbmRsZXJzW2FdW2Q/ImNhcHR1cmUiOiJidWJibGUiXSxoPWEuaW5kZXhPZihoKSwtMTxoJiZhLnNwbGljZShoLDEpKX19CmZ1bmN0aW9uIFhiKCl7Zm9yKHZhciBhIGluIFBiKXdpbmRvdy5fX3NoYWR5X25hdGl2ZV9hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7YS5fX3RhcmdldHx8KFZiKGEpLFNiKGEpKX0sITApfQp2YXIgWWI9Qih7Z2V0IGNvbXBvc2VkKCl7dm9pZCAwPT09dGhpcy5fX2NvbXBvc2VkJiYoSGI/dGhpcy5fX2NvbXBvc2VkPSJmb2N1c2luIj09PXRoaXMudHlwZXx8ImZvY3Vzb3V0Ij09PXRoaXMudHlwZXx8SGIodGhpcyk6ITEhPT10aGlzLmlzVHJ1c3RlZCYmKHRoaXMuX19jb21wb3NlZD1JYlt0aGlzLnR5cGVdKSk7cmV0dXJuIHRoaXMuX19jb21wb3NlZHx8ITF9LGNvbXBvc2VkUGF0aDpmdW5jdGlvbigpe3RoaXMuX19jb21wb3NlZFBhdGh8fCh0aGlzLl9fY29tcG9zZWRQYXRoPUxiKHRoaXMuX190YXJnZXQsdGhpcy5jb21wb3NlZCkpO3JldHVybiB0aGlzLl9fY29tcG9zZWRQYXRofSxnZXQgdGFyZ2V0KCl7cmV0dXJuIE5iKHRoaXMuY3VycmVudFRhcmdldHx8dGhpcy5fX3ByZXZpb3VzQ3VycmVudFRhcmdldCx0aGlzLmNvbXBvc2VkUGF0aCgpKX0sZ2V0IHJlbGF0ZWRUYXJnZXQoKXtpZighdGhpcy5fX3JlbGF0ZWRUYXJnZXQpcmV0dXJuIG51bGw7dGhpcy5fX3JlbGF0ZWRUYXJnZXRDb21wb3NlZFBhdGh8fAoodGhpcy5fX3JlbGF0ZWRUYXJnZXRDb21wb3NlZFBhdGg9TGIodGhpcy5fX3JlbGF0ZWRUYXJnZXQsITApKTtyZXR1cm4gTmIodGhpcy5jdXJyZW50VGFyZ2V0fHx0aGlzLl9fcHJldmlvdXNDdXJyZW50VGFyZ2V0LHRoaXMuX19yZWxhdGVkVGFyZ2V0Q29tcG9zZWRQYXRoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7RXZlbnQucHJvdG90eXBlLnN0b3BQcm9wYWdhdGlvbi5jYWxsKHRoaXMpO3RoaXMuWj0hMH0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7RXZlbnQucHJvdG90eXBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbi5jYWxsKHRoaXMpO3RoaXMuWj10aGlzLl9faW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPSEwfX0pOwpmdW5jdGlvbiBWYihhKXthLl9fdGFyZ2V0PWEudGFyZ2V0O2EuX19yZWxhdGVkVGFyZ2V0PWEucmVsYXRlZFRhcmdldDtpZih3Lm0pe3ZhciBiPU9iamVjdC5nZXRQcm90b3R5cGVPZihhKTtpZighT2JqZWN0Lmhhc093blByb3BlcnR5KGIsIl9fc2hhZHlfcGF0Y2hlZFByb3RvIikpe3ZhciBjPU9iamVjdC5jcmVhdGUoYik7Yy5fX3NoYWR5X3NvdXJjZVByb3RvPWI7QShjLFliKTtiLl9fc2hhZHlfcGF0Y2hlZFByb3RvPWN9YS5fX3Byb3RvX189Yi5fX3NoYWR5X3BhdGNoZWRQcm90b31lbHNlIEEoYSxZYil9dmFyIFpiPU9iKEV2ZW50KSwkYj1PYihDdXN0b21FdmVudCksYWM9T2IoTW91c2VFdmVudCk7CmZ1bmN0aW9uIGJjKCl7aWYoIUhiJiZPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV2ZW50LnByb3RvdHlwZSwiaXNUcnVzdGVkIikpe3ZhciBhPWZ1bmN0aW9uKCl7dmFyIGE9bmV3IE1vdXNlRXZlbnQoImNsaWNrIix7YnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNvbXBvc2VkOiEwfSk7dGhpcy5fX3NoYWR5X2Rpc3BhdGNoRXZlbnQoYSl9O0VsZW1lbnQucHJvdG90eXBlLmNsaWNrP0VsZW1lbnQucHJvdG90eXBlLmNsaWNrPWE6SFRNTEVsZW1lbnQucHJvdG90eXBlLmNsaWNrJiYoSFRNTEVsZW1lbnQucHJvdG90eXBlLmNsaWNrPWEpfX12YXIgY2M9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoRG9jdW1lbnQucHJvdG90eXBlKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIm9uIj09PWEuc3Vic3RyaW5nKDAsMil9KTtmdW5jdGlvbiBkYyhhLGIpe3JldHVybntpbmRleDphLEw6W10sUjpifX0KZnVuY3Rpb24gZWMoYSxiLGMsZCl7dmFyIGU9MCxmPTAsZz0wLGg9MCxrPU1hdGgubWluKGItZSxkLWYpO2lmKDA9PWUmJjA9PWYpYTp7Zm9yKGc9MDtnPGs7ZysrKWlmKGFbZ10hPT1jW2ddKWJyZWFrIGE7Zz1rfWlmKGI9PWEubGVuZ3RoJiZkPT1jLmxlbmd0aCl7aD1hLmxlbmd0aDtmb3IodmFyIGw9Yy5sZW5ndGgsbT0wO208ay1nJiZmYyhhWy0taF0sY1stLWxdKTspbSsrO2g9bX1lKz1nO2YrPWc7Yi09aDtkLT1oO2lmKDA9PWItZSYmMD09ZC1mKXJldHVybltdO2lmKGU9PWIpe2ZvcihiPWRjKGUsMCk7ZjxkOyliLkwucHVzaChjW2YrK10pO3JldHVybltiXX1pZihmPT1kKXJldHVybltkYyhlLGItZSldO2s9ZTtnPWY7ZD1kLWcrMTtoPWItaysxO2I9QXJyYXkoZCk7Zm9yKGw9MDtsPGQ7bCsrKWJbbF09QXJyYXkoaCksYltsXVswXT1sO2ZvcihsPTA7bDxoO2wrKyliWzBdW2xdPWw7Zm9yKGw9MTtsPGQ7bCsrKWZvcihtPTE7bTxoO20rKylpZihhW2srbS0xXT09PWNbZytsLTFdKWJbbF1bbV09CmJbbC0xXVttLTFdO2Vsc2V7dmFyIHE9YltsLTFdW21dKzEseD1iW2xdW20tMV0rMTtiW2xdW21dPXE8eD9xOnh9az1iLmxlbmd0aC0xO2c9YlswXS5sZW5ndGgtMTtkPWJba11bZ107Zm9yKGE9W107MDxrfHwwPGc7KTA9PWs/KGEucHVzaCgyKSxnLS0pOjA9PWc/KGEucHVzaCgzKSxrLS0pOihoPWJbay0xXVtnLTFdLGw9YltrLTFdW2ddLG09YltrXVtnLTFdLHE9bDxtP2w8aD9sOmg6bTxoP206aCxxPT1oPyhoPT1kP2EucHVzaCgwKTooYS5wdXNoKDEpLGQ9aCksay0tLGctLSk6cT09bD8oYS5wdXNoKDMpLGstLSxkPWwpOihhLnB1c2goMiksZy0tLGQ9bSkpO2EucmV2ZXJzZSgpO2I9dm9pZCAwO2s9W107Zm9yKGc9MDtnPGEubGVuZ3RoO2crKylzd2l0Y2goYVtnXSl7Y2FzZSAwOmImJihrLnB1c2goYiksYj12b2lkIDApO2UrKztmKys7YnJlYWs7Y2FzZSAxOmJ8fChiPWRjKGUsMCkpO2IuUisrO2UrKztiLkwucHVzaChjW2ZdKTtmKys7YnJlYWs7Y2FzZSAyOmJ8fChiPWRjKGUsMCkpOwpiLlIrKztlKys7YnJlYWs7Y2FzZSAzOmJ8fChiPWRjKGUsMCkpLGIuTC5wdXNoKGNbZl0pLGYrK31iJiZrLnB1c2goYik7cmV0dXJuIGt9ZnVuY3Rpb24gZmMoYSxiKXtyZXR1cm4gYT09PWJ9O2Z1bmN0aW9uIGdjKGEsYixjKXtFYihhKTtjPWN8fG51bGw7dmFyIGQ9dShhKSxlPXUoYiksZj1jP3UoYyk6bnVsbDtkLnByZXZpb3VzU2libGluZz1jP2YucHJldmlvdXNTaWJsaW5nOmIuX19zaGFkeV9sYXN0Q2hpbGQ7aWYoZj12KGQucHJldmlvdXNTaWJsaW5nKSlmLm5leHRTaWJsaW5nPWE7aWYoZj12KGQubmV4dFNpYmxpbmc9YykpZi5wcmV2aW91c1NpYmxpbmc9YTtkLnBhcmVudE5vZGU9YjtjP2M9PT1lLmZpcnN0Q2hpbGQmJihlLmZpcnN0Q2hpbGQ9YSk6KGUubGFzdENoaWxkPWEsZS5maXJzdENoaWxkfHwoZS5maXJzdENoaWxkPWEpKTtlLmNoaWxkTm9kZXM9bnVsbH0KZnVuY3Rpb24gaGMoYSxiLGMpe0ZiKGIpO3ZhciBkPXUoYik7dm9pZCAwIT09ZC5maXJzdENoaWxkJiYoZC5jaGlsZE5vZGVzPW51bGwpO2lmKGEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe2Q9YS5fX3NoYWR5X2NoaWxkTm9kZXM7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspZ2MoZFtlXSxiLGMpO2E9dShhKTtiPXZvaWQgMCE9PWEuZmlyc3RDaGlsZD9udWxsOnZvaWQgMDthLmZpcnN0Q2hpbGQ9YS5sYXN0Q2hpbGQ9YjthLmNoaWxkTm9kZXM9Yn1lbHNlIGdjKGEsYixjKX0KZnVuY3Rpb24gaWMoYSxiKXt2YXIgYz11KGEpO2I9dShiKTthPT09Yi5maXJzdENoaWxkJiYoYi5maXJzdENoaWxkPWMubmV4dFNpYmxpbmcpO2E9PT1iLmxhc3RDaGlsZCYmKGIubGFzdENoaWxkPWMucHJldmlvdXNTaWJsaW5nKTthPWMucHJldmlvdXNTaWJsaW5nO3ZhciBkPWMubmV4dFNpYmxpbmc7YSYmKHUoYSkubmV4dFNpYmxpbmc9ZCk7ZCYmKHUoZCkucHJldmlvdXNTaWJsaW5nPWEpO2MucGFyZW50Tm9kZT1jLnByZXZpb3VzU2libGluZz1jLm5leHRTaWJsaW5nPXZvaWQgMDt2b2lkIDAhPT1iLmNoaWxkTm9kZXMmJihiLmNoaWxkTm9kZXM9bnVsbCl9CmZ1bmN0aW9uIGpjKGEpe3ZhciBiPXUoYSk7aWYodm9pZCAwPT09Yi5maXJzdENoaWxkKXtiLmNoaWxkTm9kZXM9bnVsbDt2YXIgYz1iLmZpcnN0Q2hpbGQ9YS5fX3NoYWR5X25hdGl2ZV9maXJzdENoaWxkfHxudWxsO2IubGFzdENoaWxkPWEuX19zaGFkeV9uYXRpdmVfbGFzdENoaWxkfHxudWxsO0ZiKGEpO2I9Yztmb3IoYz12b2lkIDA7YjtiPWIuX19zaGFkeV9uYXRpdmVfbmV4dFNpYmxpbmcpe3ZhciBkPXUoYik7ZC5wYXJlbnROb2RlPWE7ZC5uZXh0U2libGluZz1iLl9fc2hhZHlfbmF0aXZlX25leHRTaWJsaW5nfHxudWxsO2QucHJldmlvdXNTaWJsaW5nPWN8fG51bGw7Yz1iO0ViKGIpfX19O3ZhciBrYz1udWxsO2Z1bmN0aW9uIEcoKXtrY3x8KGtjPXdpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltKTtyZXR1cm4ga2N8fG51bGx9ZnVuY3Rpb24gbGMoYSxiKXt2YXIgYz1HKCk7YyYmYy51bnNjb3BlTm9kZShhLGIpfWZ1bmN0aW9uIG1jKGEsYil7dmFyIGM9RygpO2lmKCFjKXJldHVybiEwO2lmKGEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe2M9ITA7YT1hLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGQ9MDtjJiZkPGEubGVuZ3RoO2QrKyljPWMmJm1jKGFbZF0sYik7cmV0dXJuIGN9cmV0dXJuIGEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERT8hMDpjLmN1cnJlbnRTY29wZUZvck5vZGUoYSk9PT1ifWZ1bmN0aW9uIG5jKGEpe2lmKGEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4iIjt2YXIgYj1HKCk7cmV0dXJuIGI/Yi5jdXJyZW50U2NvcGVGb3JOb2RlKGEpOiIifQpmdW5jdGlvbiBvYyhhLGIpe2lmKGEpe2Eubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmYihhKTthPWEuX19zaGFkeV9jaGlsZE5vZGVzO2Zvcih2YXIgYz0wLGQ7YzxhLmxlbmd0aDtjKyspZD1hW2NdLGQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmb2MoZCxiKX19O3ZhciBwYz13aW5kb3cuZG9jdW1lbnQscWM9dy5vYSxyYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLCJpc0Nvbm5lY3RlZCIpLHNjPXJjJiZyYy5nZXQ7ZnVuY3Rpb24gdGMoYSl7Zm9yKHZhciBiO2I9YS5fX3NoYWR5X2ZpcnN0Q2hpbGQ7KWEuX19zaGFkeV9yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiB1YyhhKXt2YXIgYj12KGEpO2lmKGImJnZvaWQgMCE9PWIuSyl7Yj1hLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGM9MCxkPWIubGVuZ3RoLGU9dm9pZCAwO2M8ZCYmKGU9YltjXSk7YysrKXVjKGUpfWlmKGE9dihhKSlhLks9dm9pZCAwfWZ1bmN0aW9uIHZjKGEpe3ZhciBiPWE7YSYmInNsb3QiPT09YS5sb2NhbE5hbWUmJihiPShiPShiPXYoYSkpJiZiLkQpJiZiLmxlbmd0aD9iWzBdOnZjKGEuX19zaGFkeV9uZXh0U2libGluZykpO3JldHVybiBifQpmdW5jdGlvbiB3YyhhLGIsYyl7aWYoYT0oYT12KGEpKSYmYS5IKWImJmEuYWRkZWROb2Rlcy5wdXNoKGIpLGMmJmEucmVtb3ZlZE5vZGVzLnB1c2goYyksYWIoYSl9CnZhciBDYz1CKHtnZXQgcGFyZW50Tm9kZSgpe3ZhciBhPXYodGhpcyk7YT1hJiZhLnBhcmVudE5vZGU7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGV9LGdldCBmaXJzdENoaWxkKCl7dmFyIGE9dih0aGlzKTthPWEmJmEuZmlyc3RDaGlsZDtyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfZmlyc3RDaGlsZH0sZ2V0IGxhc3RDaGlsZCgpe3ZhciBhPXYodGhpcyk7YT1hJiZhLmxhc3RDaGlsZDtyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfbGFzdENoaWxkfSxnZXQgbmV4dFNpYmxpbmcoKXt2YXIgYT12KHRoaXMpO2E9YSYmYS5uZXh0U2libGluZztyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfbmV4dFNpYmxpbmd9LGdldCBwcmV2aW91c1NpYmxpbmcoKXt2YXIgYT12KHRoaXMpO2E9YSYmYS5wcmV2aW91c1NpYmxpbmc7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3ByZXZpb3VzU2libGluZ30sCmdldCBjaGlsZE5vZGVzKCl7aWYoeSh0aGlzKSl7dmFyIGE9dih0aGlzKTtpZighYS5jaGlsZE5vZGVzKXthLmNoaWxkTm9kZXM9W107Zm9yKHZhciBiPXRoaXMuX19zaGFkeV9maXJzdENoaWxkO2I7Yj1iLl9fc2hhZHlfbmV4dFNpYmxpbmcpYS5jaGlsZE5vZGVzLnB1c2goYil9dmFyIGM9YS5jaGlsZE5vZGVzfWVsc2UgYz10aGlzLl9fc2hhZHlfbmF0aXZlX2NoaWxkTm9kZXM7Yy5pdGVtPWZ1bmN0aW9uKGEpe3JldHVybiBjW2FdfTtyZXR1cm4gY30sZ2V0IHBhcmVudEVsZW1lbnQoKXt2YXIgYT12KHRoaXMpOyhhPWEmJmEucGFyZW50Tm9kZSkmJmEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSYmKGE9bnVsbCk7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3BhcmVudEVsZW1lbnR9LGdldCBpc0Nvbm5lY3RlZCgpe2lmKHNjJiZzYy5jYWxsKHRoaXMpKXJldHVybiEwO2lmKHRoaXMubm9kZVR5cGU9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSlyZXR1cm4hMTsKdmFyIGE9dGhpcy5vd25lckRvY3VtZW50O2lmKFRhKXtpZihhLl9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKHRoaXMpKXJldHVybiEwfWVsc2UgaWYoYS5kb2N1bWVudEVsZW1lbnQmJmEuZG9jdW1lbnRFbGVtZW50Ll9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKHRoaXMpKXJldHVybiEwO2ZvcihhPXRoaXM7YSYmIShhIGluc3RhbmNlb2YgRG9jdW1lbnQpOylhPWEuX19zaGFkeV9wYXJlbnROb2RlfHwoeihhKT9hLmhvc3Q6dm9pZCAwKTtyZXR1cm4hIShhJiZhIGluc3RhbmNlb2YgRG9jdW1lbnQpfSxnZXQgdGV4dENvbnRlbnQoKXtpZih5KHRoaXMpKXtmb3IodmFyIGE9W10sYj0wLGM9dGhpcy5fX3NoYWR5X2NoaWxkTm9kZXMsZDtkPWNbYl07YisrKWQubm9kZVR5cGUhPT1Ob2RlLkNPTU1FTlRfTk9ERSYmYS5wdXNoKGQuX19zaGFkeV90ZXh0Q29udGVudCk7cmV0dXJuIGEuam9pbigiIil9cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfdGV4dENvbnRlbnR9LHNldCB0ZXh0Q29udGVudChhKXtpZigidW5kZWZpbmVkIj09PQp0eXBlb2YgYXx8bnVsbD09PWEpYT0iIjtzd2l0Y2godGhpcy5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTppZigheSh0aGlzKSYmdy5tKXt2YXIgYj10aGlzLl9fc2hhZHlfZmlyc3RDaGlsZDsoYiE9dGhpcy5fX3NoYWR5X2xhc3RDaGlsZHx8YiYmYi5ub2RlVHlwZSE9Tm9kZS5URVhUX05PREUpJiZ0Yyh0aGlzKTt0aGlzLl9fc2hhZHlfbmF0aXZlX3RleHRDb250ZW50PWF9ZWxzZSB0Yyh0aGlzKSwoMDxhLmxlbmd0aHx8dGhpcy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKSYmdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSk7YnJlYWs7ZGVmYXVsdDp0aGlzLm5vZGVWYWx1ZT1hfX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGEsYil7aWYodGhpcy5vd25lckRvY3VtZW50IT09cGMmJmEub3duZXJEb2N1bWVudCE9PXBjKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2luc2VydEJlZm9yZShhLApiKSxhO2lmKGE9PT10aGlzKXRocm93IEVycm9yKCJGYWlsZWQgdG8gZXhlY3V0ZSAnYXBwZW5kQ2hpbGQnIG9uICdOb2RlJzogVGhlIG5ldyBjaGlsZCBlbGVtZW50IGNvbnRhaW5zIHRoZSBwYXJlbnQuIik7aWYoYil7dmFyIGM9dihiKTtjPWMmJmMucGFyZW50Tm9kZTtpZih2b2lkIDAhPT1jJiZjIT09dGhpc3x8dm9pZCAwPT09YyYmYi5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlIT09dGhpcyl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2luc2VydEJlZm9yZScgb24gJ05vZGUnOiBUaGUgbm9kZSBiZWZvcmUgd2hpY2ggdGhlIG5ldyBub2RlIGlzIHRvIGJlIGluc2VydGVkIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgbm9kZS4iKTt9aWYoYj09PWEpcmV0dXJuIGE7dmFyIGQ9W10sZT0oYz14Yyh0aGlzKSk/Yy5ob3N0LmxvY2FsTmFtZTpuYyh0aGlzKSxmPWEuX19zaGFkeV9wYXJlbnROb2RlO2lmKGYpe3ZhciBnPW5jKGEpO2YuX19zaGFkeV9yZW1vdmVDaGlsZChhLCEhY3x8CiF4YyhhKSl9Zj0hMDt2YXIgaD0oIXFjfHx2b2lkIDA9PT1hLl9fbm9JbnNlcnRpb25Qb2ludCkmJiFtYyhhLGUpLGs9YyYmIWEuX19ub0luc2VydGlvblBvaW50JiYoIXFjfHxhLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKTtpZihrfHxoKWgmJihnPWd8fG5jKGEpKSxvYyhhLGZ1bmN0aW9uKGEpe2smJiJzbG90Ij09PWEubG9jYWxOYW1lJiZkLnB1c2goYSk7aWYoaCl7dmFyIGI9ZztHKCkmJihiJiZsYyhhLGIpLChiPUcoKSkmJmIuc2NvcGVOb2RlKGEsZSkpfX0pO2lmKCJzbG90Ij09PXRoaXMubG9jYWxOYW1lfHxkLmxlbmd0aClkLmxlbmd0aCYmKGMuYz1jLmN8fFtdLGMuYT1jLmF8fFtdLGMuYj1jLmJ8fHt9LGMuYy5wdXNoLmFwcGx5KGMuYyxkIGluc3RhbmNlb2YgQXJyYXk/ZDpqYShpYShkKSkpKSxjJiZBYyhjKTt5KHRoaXMpJiYoaGMoYSx0aGlzLGIpLGM9dih0aGlzKSxMYSh0aGlzKT8oQWMoYy5yb290KSxmPSExKTpjLnJvb3QmJihmPSExKSk7Zj8KKGM9eih0aGlzKT90aGlzLmhvc3Q6dGhpcyxiPyhiPXZjKGIpLGMuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGEsYikpOmMuX19zaGFkeV9uYXRpdmVfYXBwZW5kQ2hpbGQoYSkpOmEub3duZXJEb2N1bWVudCE9PXRoaXMub3duZXJEb2N1bWVudCYmdGhpcy5vd25lckRvY3VtZW50LmFkb3B0Tm9kZShhKTt3Yyh0aGlzLGEpO3JldHVybiBhfSxhcHBlbmRDaGlsZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShhKX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oYSxiKXtiPXZvaWQgMD09PWI/ITE6YjtpZih0aGlzLm93bmVyRG9jdW1lbnQhPT1wYylyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChhKTtpZihhLl9fc2hhZHlfcGFyZW50Tm9kZSE9PXRoaXMpdGhyb3cgRXJyb3IoIlRoZSBub2RlIHRvIGJlIHJlbW92ZWQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlOiAiK2EpO3ZhciBjPXhjKGEpLGQ9YyYmQmMoYyxhKSxlPXYodGhpcyk7CmlmKHkodGhpcykmJihpYyhhLHRoaXMpLExhKHRoaXMpKSl7QWMoZS5yb290KTt2YXIgZj0hMH1pZihHKCkmJiFiJiZjKXt2YXIgZz1uYyhhKTtvYyhhLGZ1bmN0aW9uKGEpe2xjKGEsZyl9KX11YyhhKTtjJiYoKGI9dGhpcyYmInNsb3QiPT09dGhpcy5sb2NhbE5hbWUpJiYoZj0hMCksKGR8fGIpJiZBYyhjKSk7Znx8KGY9eih0aGlzKT90aGlzLmhvc3Q6dGhpcywoIWUucm9vdCYmInNsb3QiIT09YS5sb2NhbE5hbWV8fGY9PT1hLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGUpJiZmLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGEpKTt3Yyh0aGlzLG51bGwsYSk7cmV0dXJuIGF9LHJlcGxhY2VDaGlsZDpmdW5jdGlvbihhLGIpe3RoaXMuX19zaGFkeV9pbnNlcnRCZWZvcmUoYSxiKTt0aGlzLl9fc2hhZHlfcmVtb3ZlQ2hpbGQoYik7cmV0dXJuIGF9LGNsb25lTm9kZTpmdW5jdGlvbihhKXtpZigidGVtcGxhdGUiPT10aGlzLmxvY2FsTmFtZSlyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9jbG9uZU5vZGUoYSk7CnZhciBiPXRoaXMuX19zaGFkeV9uYXRpdmVfY2xvbmVOb2RlKCExKTtpZihhJiZiLm5vZGVUeXBlIT09Tm9kZS5BVFRSSUJVVEVfTk9ERSl7YT10aGlzLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGM9MCxkO2M8YS5sZW5ndGg7YysrKWQ9YVtjXS5fX3NoYWR5X2Nsb25lTm9kZSghMCksYi5fX3NoYWR5X2FwcGVuZENoaWxkKGQpfXJldHVybiBifSxnZXRSb290Tm9kZTpmdW5jdGlvbihhKXtpZih0aGlzJiZ0aGlzLm5vZGVUeXBlKXt2YXIgYj11KHRoaXMpLGM9Yi5LO3ZvaWQgMD09PWMmJih6KHRoaXMpPyhjPXRoaXMsYi5LPWMpOihjPShjPXRoaXMuX19zaGFkeV9wYXJlbnROb2RlKT9jLl9fc2hhZHlfZ2V0Um9vdE5vZGUoYSk6dGhpcyxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuX19zaGFkeV9uYXRpdmVfY29udGFpbnModGhpcykmJihiLks9YykpKTtyZXR1cm4gY319LGNvbnRhaW5zOmZ1bmN0aW9uKGEpe3JldHVybiBVYSh0aGlzLGEpfX0pO2Z1bmN0aW9uIERjKGEsYixjKXt2YXIgZD1bXTtFYyhhLl9fc2hhZHlfY2hpbGROb2RlcyxiLGMsZCk7cmV0dXJuIGR9ZnVuY3Rpb24gRWMoYSxiLGMsZCl7Zm9yKHZhciBlPTAsZj1hLmxlbmd0aCxnPXZvaWQgMDtlPGYmJihnPWFbZV0pO2UrKyl7dmFyIGg7aWYoaD1nLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe2g9Zzt2YXIgaz1iLGw9YyxtPWQscT1rKGgpO3EmJm0ucHVzaChoKTtsJiZsKHEpP2g9cTooRWMoaC5fX3NoYWR5X2NoaWxkTm9kZXMsayxsLG0pLGg9dm9pZCAwKX1pZihoKWJyZWFrfX0KdmFyIEZjPUIoe2dldCBmaXJzdEVsZW1lbnRDaGlsZCgpe3ZhciBhPXYodGhpcyk7aWYoYSYmdm9pZCAwIT09YS5maXJzdENoaWxkKXtmb3IoYT10aGlzLl9fc2hhZHlfZmlyc3RDaGlsZDthJiZhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KWE9YS5fX3NoYWR5X25leHRTaWJsaW5nO3JldHVybiBhfXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2ZpcnN0RWxlbWVudENoaWxkfSxnZXQgbGFzdEVsZW1lbnRDaGlsZCgpe3ZhciBhPXYodGhpcyk7aWYoYSYmdm9pZCAwIT09YS5sYXN0Q2hpbGQpe2ZvcihhPXRoaXMuX19zaGFkeV9sYXN0Q2hpbGQ7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEuX19zaGFkeV9wcmV2aW91c1NpYmxpbmc7cmV0dXJuIGF9cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfbGFzdEVsZW1lbnRDaGlsZH0sZ2V0IGNoaWxkcmVuKCl7cmV0dXJuIHkodGhpcyk/VmEoQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHRoaXMuX19zaGFkeV9jaGlsZE5vZGVzLApmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFfSkpOnRoaXMuX19zaGFkeV9uYXRpdmVfY2hpbGRyZW59LGdldCBjaGlsZEVsZW1lbnRDb3VudCgpe3ZhciBhPXRoaXMuX19zaGFkeV9jaGlsZHJlbjtyZXR1cm4gYT9hLmxlbmd0aDowfX0pLEdjPUIoe3F1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIERjKHRoaXMsZnVuY3Rpb24oYil7cmV0dXJuIE9hLmNhbGwoYixhKX0sZnVuY3Rpb24oYSl7cmV0dXJuISFhfSlbMF18fG51bGx9LHF1ZXJ5U2VsZWN0b3JBbGw6ZnVuY3Rpb24oYSxiKXtpZihiKXtiPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX19zaGFkeV9uYXRpdmVfcXVlcnlTZWxlY3RvckFsbChhKSk7dmFyIGM9dGhpcy5fX3NoYWR5X2dldFJvb3ROb2RlKCk7cmV0dXJuIGIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKT09Y30pfXJldHVybiBEYyh0aGlzLGZ1bmN0aW9uKGIpe3JldHVybiBPYS5jYWxsKGIsCmEpfSl9fSksSGM9dy5vYT9PYmplY3QuYXNzaWduKHt9LEZjKTpGYztPYmplY3QuYXNzaWduKEZjLEdjKTt2YXIgSWM9Qih7Z2V0RWxlbWVudEJ5SWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIiI9PT1hP251bGw6RGModGhpcyxmdW5jdGlvbihiKXtyZXR1cm4gYi5pZD09YX0sZnVuY3Rpb24oYSl7cmV0dXJuISFhfSlbMF18fG51bGx9fSk7dmFyIEpjPUIoe2dldCBhY3RpdmVFbGVtZW50KCl7dmFyIGE9dy5tP2RvY3VtZW50Ll9fc2hhZHlfbmF0aXZlX2FjdGl2ZUVsZW1lbnQ6ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZighYXx8IWEubm9kZVR5cGUpcmV0dXJuIG51bGw7dmFyIGI9ISF6KHRoaXMpO2lmKCEodGhpcz09PWRvY3VtZW50fHxiJiZ0aGlzLmhvc3QhPT1hJiZ0aGlzLmhvc3QuX19zaGFkeV9uYXRpdmVfY29udGFpbnMoYSkpKXJldHVybiBudWxsO2ZvcihiPXhjKGEpO2ImJmIhPT10aGlzOylhPWIuaG9zdCxiPXhjKGEpO3JldHVybiB0aGlzPT09ZG9jdW1lbnQ/Yj9udWxsOmE6Yj09PXRoaXM/YTpudWxsfX0pO3ZhciBLYz1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoImluZXJ0IiksTGM9Qih7Z2V0IGlubmVySFRNTCgpe3JldHVybiB5KHRoaXMpP2tiKCJ0ZW1wbGF0ZSI9PT10aGlzLmxvY2FsTmFtZT90aGlzLmNvbnRlbnQ6dGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gYS5fX3NoYWR5X2NoaWxkTm9kZXN9KTp0aGlzLl9fc2hhZHlfbmF0aXZlX2lubmVySFRNTH0sc2V0IGlubmVySFRNTChhKXtpZigidGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWUpdGhpcy5fX3NoYWR5X25hdGl2ZV9pbm5lckhUTUw9YTtlbHNle3RjKHRoaXMpO3ZhciBiPXRoaXMubG9jYWxOYW1lfHwiZGl2IjtiPXRoaXMubmFtZXNwYWNlVVJJJiZ0aGlzLm5hbWVzcGFjZVVSSSE9PUtjLm5hbWVzcGFjZVVSST9LYy5jcmVhdGVFbGVtZW50TlModGhpcy5uYW1lc3BhY2VVUkksYik6S2MuY3JlYXRlRWxlbWVudChiKTtmb3Iody5tP2IuX19zaGFkeV9uYXRpdmVfaW5uZXJIVE1MPWE6Yi5pbm5lckhUTUw9CmE7YT1iLl9fc2hhZHlfZmlyc3RDaGlsZDspdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShhKX19fSk7dmFyIE1jPUIoe2FkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiLGMpeyJvYmplY3QiIT09dHlwZW9mIGMmJihjPXtjYXB0dXJlOiEhY30pO2MuJD10aGlzO3RoaXMuaG9zdC5fX3NoYWR5X2FkZEV2ZW50TGlzdGVuZXIoYSxiLGMpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYixjKXsib2JqZWN0IiE9PXR5cGVvZiBjJiYoYz17Y2FwdHVyZTohIWN9KTtjLiQ9dGhpczt0aGlzLmhvc3QuX19zaGFkeV9yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKX19KTtmdW5jdGlvbiBOYyhhLGIpe0EoYSxNYyxiKTtBKGEsSmMsYik7QShhLExjLGIpO0EoYSxGYyxiKTt3LkomJiFiPyhBKGEsQ2MsYiksQShhLEljLGIpKTp3Lm18fChBKGEsQWIpLEEoYSx6YikpfTt2YXIgT2M9e30sUGM9dy5kZWZlckNvbm5lY3Rpb25DYWxsYmFja3MmJiJsb2FkaW5nIj09PWRvY3VtZW50LnJlYWR5U3RhdGUsUWM7ZnVuY3Rpb24gUmMoYSl7dmFyIGI9W107ZG8gYi51bnNoaWZ0KGEpO3doaWxlKGE9YS5fX3NoYWR5X3BhcmVudE5vZGUpO3JldHVybiBifQpmdW5jdGlvbiBTYyhhLGIsYyl7aWYoYSE9PU9jKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTt0aGlzLnphPSJTaGFkeVJvb3QiO3RoaXMuaG9zdD1iO3RoaXMubW9kZT1jJiZjLm1vZGU7amMoYik7YT11KGIpO2Eucm9vdD10aGlzO2EucGE9ImNsb3NlZCIhPT10aGlzLm1vZGU/dGhpczpudWxsO2E9dSh0aGlzKTthLmZpcnN0Q2hpbGQ9YS5sYXN0Q2hpbGQ9YS5wYXJlbnROb2RlPWEubmV4dFNpYmxpbmc9YS5wcmV2aW91c1NpYmxpbmc9bnVsbDthLmNoaWxkTm9kZXM9W107dGhpcy5iYT10aGlzLkI9ITE7dGhpcy5jPXRoaXMuYj10aGlzLmE9bnVsbDtpZih3LnByZWZlclBlcmZvcm1hbmNlKWZvcig7YT1iLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGQ7KWIuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQ2hpbGQoYSk7ZWxzZSBBYyh0aGlzKX1mdW5jdGlvbiBBYyhhKXthLkJ8fChhLkI9ITAsWWEoZnVuY3Rpb24oKXtyZXR1cm4gVGMoYSl9KSl9CmZ1bmN0aW9uIFRjKGEpe3ZhciBiO2lmKGI9YS5CKXtmb3IodmFyIGM7YTspYTp7YS5CJiYoYz1hKSxiPWE7YT1iLmhvc3QuX19zaGFkeV9nZXRSb290Tm9kZSgpO2lmKHooYSkmJihiPXYoYi5ob3N0KSkmJjA8Yi5OKWJyZWFrIGE7YT12b2lkIDB9Yj1jfShjPWIpJiZjLl9yZW5kZXJTZWxmKCl9ClNjLnByb3RvdHlwZS5fcmVuZGVyU2VsZj1mdW5jdGlvbigpe3ZhciBhPVBjO1BjPSEwO3RoaXMuQj0hMTtpZih0aGlzLmEpe1VjKHRoaXMpO2Zvcih2YXIgYj0wLGM7Yjx0aGlzLmEubGVuZ3RoO2IrKyl7Yz10aGlzLmFbYl07dmFyIGQ9dihjKSxlPWQuYXNzaWduZWROb2RlcztkLmFzc2lnbmVkTm9kZXM9W107ZC5EPVtdO2lmKGQuY2E9ZSlmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCsrKXt2YXIgZj12KGVbZF0pO2YuUD1mLmFzc2lnbmVkU2xvdDtmLmFzc2lnbmVkU2xvdD09PWMmJihmLmFzc2lnbmVkU2xvdD1udWxsKX19Zm9yKGI9dGhpcy5ob3N0Ll9fc2hhZHlfZmlyc3RDaGlsZDtiO2I9Yi5fX3NoYWR5X25leHRTaWJsaW5nKVZjKHRoaXMsYik7Zm9yKGI9MDtiPHRoaXMuYS5sZW5ndGg7YisrKXtjPXRoaXMuYVtiXTtlPXYoYyk7aWYoIWUuYXNzaWduZWROb2Rlcy5sZW5ndGgpZm9yKGQ9Yy5fX3NoYWR5X2ZpcnN0Q2hpbGQ7ZDtkPWQuX19zaGFkeV9uZXh0U2libGluZylWYyh0aGlzLApkLGMpOyhkPShkPXYoYy5fX3NoYWR5X3BhcmVudE5vZGUpKSYmZC5yb290KSYmKE1hKGQpfHxkLkIpJiZkLl9yZW5kZXJTZWxmKCk7V2ModGhpcyxlLkQsZS5hc3NpZ25lZE5vZGVzKTtpZihkPWUuY2Epe2ZvcihmPTA7ZjxkLmxlbmd0aDtmKyspdihkW2ZdKS5QPW51bGw7ZS5jYT1udWxsO2QubGVuZ3RoPmUuYXNzaWduZWROb2Rlcy5sZW5ndGgmJihlLlQ9ITApfWUuVCYmKGUuVD0hMSxYYyh0aGlzLGMpKX1jPXRoaXMuYTtiPVtdO2ZvcihlPTA7ZTxjLmxlbmd0aDtlKyspZD1jW2VdLl9fc2hhZHlfcGFyZW50Tm9kZSwoZj12KGQpKSYmZi5yb290fHwhKDA+Yi5pbmRleE9mKGQpKXx8Yi5wdXNoKGQpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspe2Y9YltjXTtlPWY9PT10aGlzP3RoaXMuaG9zdDpmO2Q9W107Zj1mLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl7dmFyIGg9ZltnXTtpZigic2xvdCI9PWgubG9jYWxOYW1lKXtoPXYoaCkuRDtmb3IodmFyIGs9CjA7azxoLmxlbmd0aDtrKyspZC5wdXNoKGhba10pfWVsc2UgZC5wdXNoKGgpfWY9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5fX3NoYWR5X25hdGl2ZV9jaGlsZE5vZGVzKTtnPWVjKGQsZC5sZW5ndGgsZixmLmxlbmd0aCk7az1oPTA7Zm9yKHZhciBsPXZvaWQgMDtoPGcubGVuZ3RoJiYobD1nW2hdKTtoKyspe2Zvcih2YXIgbT0wLHE9dm9pZCAwO208bC5MLmxlbmd0aCYmKHE9bC5MW21dKTttKyspcS5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlPT09ZSYmZS5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChxKSxmLnNwbGljZShsLmluZGV4K2ssMSk7ay09bC5SfWs9MDtmb3IobD12b2lkIDA7azxnLmxlbmd0aCYmKGw9Z1trXSk7aysrKWZvcihoPWZbbC5pbmRleF0sbT1sLmluZGV4O208bC5pbmRleCtsLlI7bSsrKXE9ZFttXSxlLl9fc2hhZHlfbmF0aXZlX2luc2VydEJlZm9yZShxLGgpLGYuc3BsaWNlKG0sMCxxKX19aWYoIXcucHJlZmVyUGVyZm9ybWFuY2UmJiF0aGlzLmJhKWZvcihiPQp0aGlzLmhvc3QuX19zaGFkeV9jaGlsZE5vZGVzLGM9MCxlPWIubGVuZ3RoO2M8ZTtjKyspZD1iW2NdLGY9dihkKSxkLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGUhPT10aGlzLmhvc3R8fCJzbG90IiE9PWQubG9jYWxOYW1lJiZmLmFzc2lnbmVkU2xvdHx8dGhpcy5ob3N0Ll9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGQpO3RoaXMuYmE9ITA7UGM9YTtRYyYmUWMoKX07ZnVuY3Rpb24gVmMoYSxiLGMpe3ZhciBkPXUoYiksZT1kLlA7ZC5QPW51bGw7Y3x8KGM9KGE9YS5iW2IuX19zaGFkeV9zbG90fHwiX19jYXRjaGFsbCJdKSYmYVswXSk7Yz8odShjKS5hc3NpZ25lZE5vZGVzLnB1c2goYiksZC5hc3NpZ25lZFNsb3Q9Yyk6ZC5hc3NpZ25lZFNsb3Q9dm9pZCAwO2UhPT1kLmFzc2lnbmVkU2xvdCYmZC5hc3NpZ25lZFNsb3QmJih1KGQuYXNzaWduZWRTbG90KS5UPSEwKX0KZnVuY3Rpb24gV2MoYSxiLGMpe2Zvcih2YXIgZD0wLGU9dm9pZCAwO2Q8Yy5sZW5ndGgmJihlPWNbZF0pO2QrKylpZigic2xvdCI9PWUubG9jYWxOYW1lKXt2YXIgZj12KGUpLmFzc2lnbmVkTm9kZXM7ZiYmZi5sZW5ndGgmJldjKGEsYixmKX1lbHNlIGIucHVzaChjW2RdKX1mdW5jdGlvbiBYYyhhLGIpe2IuX19zaGFkeV9uYXRpdmVfZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInNsb3RjaGFuZ2UiKSk7Yj12KGIpO2IuYXNzaWduZWRTbG90JiZYYyhhLGIuYXNzaWduZWRTbG90KX0KZnVuY3Rpb24gVWMoYSl7aWYoYS5jJiZhLmMubGVuZ3RoKXtmb3IodmFyIGI9YS5jLGMsZD0wO2Q8Yi5sZW5ndGg7ZCsrKXt2YXIgZT1iW2RdO2pjKGUpO3ZhciBmPWUuX19zaGFkeV9wYXJlbnROb2RlO2pjKGYpO2Y9dihmKTtmLk49KGYuTnx8MCkrMTtmPVljKGUpO2EuYltmXT8oYz1jfHx7fSxjW2ZdPSEwLGEuYltmXS5wdXNoKGUpKTphLmJbZl09W2VdO2EuYS5wdXNoKGUpfWlmKGMpZm9yKHZhciBnIGluIGMpYS5iW2ddPVpjKGEuYltnXSk7YS5jPVtdfX1mdW5jdGlvbiBZYyhhKXt2YXIgYj1hLm5hbWV8fGEuZ2V0QXR0cmlidXRlKCJuYW1lIil8fCJfX2NhdGNoYWxsIjtyZXR1cm4gYS53YT1ifQpmdW5jdGlvbiBaYyhhKXtyZXR1cm4gYS5zb3J0KGZ1bmN0aW9uKGEsYyl7YT1SYyhhKTtmb3IodmFyIGI9UmMoYyksZT0wO2U8YS5sZW5ndGg7ZSsrKXtjPWFbZV07dmFyIGY9YltlXTtpZihjIT09ZilyZXR1cm4gYT1BcnJheS5mcm9tKGMuX19zaGFkeV9wYXJlbnROb2RlLl9fc2hhZHlfY2hpbGROb2RlcyksYS5pbmRleE9mKGMpLWEuaW5kZXhPZihmKX19KX0KZnVuY3Rpb24gQmMoYSxiKXtpZihhLmEpe1VjKGEpO3ZhciBjPWEuYixkO2ZvcihkIGluIGMpZm9yKHZhciBlPWNbZF0sZj0wO2Y8ZS5sZW5ndGg7ZisrKXt2YXIgZz1lW2ZdO2lmKFVhKGIsZykpe2Uuc3BsaWNlKGYsMSk7dmFyIGg9YS5hLmluZGV4T2YoZyk7MDw9aCYmKGEuYS5zcGxpY2UoaCwxKSwoaD12KGcuX19zaGFkeV9wYXJlbnROb2RlKSkmJmguTiYmaC5OLS0pO2YtLTtnPXYoZyk7aWYoaD1nLkQpZm9yKHZhciBrPTA7azxoLmxlbmd0aDtrKyspe3ZhciBsPWhba10sbT1sLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGU7bSYmbS5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChsKX1nLkQ9W107Zy5hc3NpZ25lZE5vZGVzPVtdO2g9ITB9fXJldHVybiBofX1mdW5jdGlvbiBNYShhKXtVYyhhKTtyZXR1cm4hKCFhLmF8fCFhLmEubGVuZ3RoKX0KKGZ1bmN0aW9uKGEpe2EuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlO05jKGEsIl9fc2hhZHlfIik7TmMoYSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYSx7bm9kZVR5cGU6e3ZhbHVlOk5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSxjb25maWd1cmFibGU6ITB9LG5vZGVOYW1lOnt2YWx1ZToiI2RvY3VtZW50LWZyYWdtZW50Iixjb25maWd1cmFibGU6ITB9LG5vZGVWYWx1ZTp7dmFsdWU6bnVsbCxjb25maWd1cmFibGU6ITB9fSk7WyJsb2NhbE5hbWUiLCJuYW1lc3BhY2VVUkkiLCJwcmVmaXgiXS5mb3JFYWNoKGZ1bmN0aW9uKGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse3ZhbHVlOnZvaWQgMCxjb25maWd1cmFibGU6ITB9KX0pO1sib3duZXJEb2N1bWVudCIsImJhc2VVUkkiLCJpc0Nvbm5lY3RlZCJdLmZvckVhY2goZnVuY3Rpb24oYil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaG9zdFtiXX0sCmNvbmZpZ3VyYWJsZTohMH0pfSl9KShTYy5wcm90b3R5cGUpOwppZih3aW5kb3cuY3VzdG9tRWxlbWVudHMmJncuZWEmJiF3LnByZWZlclBlcmZvcm1hbmNlKXt2YXIgJGM9bmV3IE1hcDtRYz1mdW5jdGlvbigpe3ZhciBhPVtdOyRjLmZvckVhY2goZnVuY3Rpb24oYixjKXthLnB1c2goW2MsYl0pfSk7JGMuY2xlYXIoKTtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXVswXTthW2JdWzFdP2MudWEoKTpjLnZhKCl9fTtQYyYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsZnVuY3Rpb24oKXtQYz0hMTtRYygpfSx7b25jZTohMH0pO3ZhciBhZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9MCxlPSJfX2lzQ29ubmVjdGVkIitkKys7aWYoYnx8YylhLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaz1hLnByb3RvdHlwZS51YT1mdW5jdGlvbigpe1BjPyRjLnNldCh0aGlzLCEwKTp0aGlzW2VdfHwodGhpc1tlXT0hMCxiJiZiLmNhbGwodGhpcykpfSxhLnByb3RvdHlwZS5kaXNjb25uZWN0ZWRDYWxsYmFjaz0KYS5wcm90b3R5cGUudmE9ZnVuY3Rpb24oKXtQYz90aGlzLmlzQ29ubmVjdGVkfHwkYy5zZXQodGhpcywhMSk6dGhpc1tlXSYmKHRoaXNbZV09ITEsYyYmYy5jYWxsKHRoaXMpKX07cmV0dXJuIGF9LGJkPXdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5DdXN0b21FbGVtZW50UmVnaXN0cnkucHJvdG90eXBlLCJkZWZpbmUiLHt2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWIucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrLGQ9Yi5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s7YmQuY2FsbCh3aW5kb3cuY3VzdG9tRWxlbWVudHMsYSxhZChiLGMsZCkpO2IucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrPWM7Yi5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s9ZH19KX1mdW5jdGlvbiB4YyhhKXthPWEuX19zaGFkeV9nZXRSb290Tm9kZSgpO2lmKHooYSkpcmV0dXJuIGF9O2Z1bmN0aW9uIGNkKGEpe3RoaXMubm9kZT1hfW49Y2QucHJvdG90eXBlO24uYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2FkZEV2ZW50TGlzdGVuZXIoYSxiLGMpfTtuLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKX07bi5hcHBlbmRDaGlsZD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXBwZW5kQ2hpbGQoYSl9O24uaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2luc2VydEJlZm9yZShhLGIpfTtuLnJlbW92ZUNoaWxkPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVDaGlsZChhKX07bi5yZXBsYWNlQ2hpbGQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcmVwbGFjZUNoaWxkKGEsYil9OwpuLmNsb25lTm9kZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2xvbmVOb2RlKGEpfTtuLmdldFJvb3ROb2RlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9nZXRSb290Tm9kZShhKX07bi5jb250YWlucz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY29udGFpbnMoYSl9O24uZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZGlzcGF0Y2hFdmVudChhKX07bi5zZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxiKXt0aGlzLm5vZGUuX19zaGFkeV9zZXRBdHRyaWJ1dGUoYSxiKX07bi5nZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X25hdGl2ZV9nZXRBdHRyaWJ1dGUoYSl9O24uaGFzQXR0cmlidXRlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9uYXRpdmVfaGFzQXR0cmlidXRlKGEpfTtuLnJlbW92ZUF0dHJpYnV0ZT1mdW5jdGlvbihhKXt0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVBdHRyaWJ1dGUoYSl9OwpuLmF0dGFjaFNoYWRvdz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXR0YWNoU2hhZG93KGEpfTtuLmZvY3VzPWZ1bmN0aW9uKCl7dGhpcy5ub2RlLl9fc2hhZHlfbmF0aXZlX2ZvY3VzKCl9O24uYmx1cj1mdW5jdGlvbigpe3RoaXMubm9kZS5fX3NoYWR5X2JsdXIoKX07bi5pbXBvcnROb2RlPWZ1bmN0aW9uKGEsYil7aWYodGhpcy5ub2RlLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9pbXBvcnROb2RlKGEsYil9O24uZ2V0RWxlbWVudEJ5SWQ9ZnVuY3Rpb24oYSl7aWYodGhpcy5ub2RlLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9nZXRFbGVtZW50QnlJZChhKX07bi5xdWVyeVNlbGVjdG9yPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9xdWVyeVNlbGVjdG9yKGEpfTsKbi5xdWVyeVNlbGVjdG9yQWxsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3F1ZXJ5U2VsZWN0b3JBbGwoYSxiKX07bi5hc3NpZ25lZE5vZGVzPWZ1bmN0aW9uKGEpe2lmKCJzbG90Ij09PXRoaXMubm9kZS5sb2NhbE5hbWUpcmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2Fzc2lnbmVkTm9kZXMoYSl9OwpwLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNkLnByb3RvdHlwZSx7YWN0aXZlRWxlbWVudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7aWYoeih0aGlzLm5vZGUpfHx0aGlzLm5vZGUubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX05PREUpcmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2FjdGl2ZUVsZW1lbnR9fSxfYWN0aXZlRWxlbWVudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlRWxlbWVudH19LGhvc3Q6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKHoodGhpcy5ub2RlKSlyZXR1cm4gdGhpcy5ub2RlLmhvc3R9fSxwYXJlbnROb2RlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcGFyZW50Tm9kZX19LGZpcnN0Q2hpbGQ6e2NvbmZpZ3VyYWJsZTohMCwKZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZmlyc3RDaGlsZH19LGxhc3RDaGlsZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2xhc3RDaGlsZH19LG5leHRTaWJsaW5nOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfbmV4dFNpYmxpbmd9fSxwcmV2aW91c1NpYmxpbmc6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9wcmV2aW91c1NpYmxpbmd9fSxjaGlsZE5vZGVzOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2hpbGROb2Rlc319LHBhcmVudEVsZW1lbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLApnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcGFyZW50RWxlbWVudH19LGZpcnN0RWxlbWVudENoaWxkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZmlyc3RFbGVtZW50Q2hpbGR9fSxsYXN0RWxlbWVudENoaWxkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfbGFzdEVsZW1lbnRDaGlsZH19LG5leHRFbGVtZW50U2libGluZzp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X25leHRFbGVtZW50U2libGluZ319LHByZXZpb3VzRWxlbWVudFNpYmxpbmc6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9wcmV2aW91c0VsZW1lbnRTaWJsaW5nfX0sCmNoaWxkcmVuOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2hpbGRyZW59fSxjaGlsZEVsZW1lbnRDb3VudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2NoaWxkRWxlbWVudENvdW50fX0sc2hhZG93Um9vdDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3NoYWRvd1Jvb3R9fSxhc3NpZ25lZFNsb3Q6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9hc3NpZ25lZFNsb3R9fSxpc0Nvbm5lY3RlZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2lzQ29ubmVjdGVkfX0saW5uZXJIVE1MOntjb25maWd1cmFibGU6ITAsCmVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2lubmVySFRNTH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X2lubmVySFRNTD1hfX0sdGV4dENvbnRlbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV90ZXh0Q29udGVudH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X3RleHRDb250ZW50PWF9fSxzbG90Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfc2xvdH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X3Nsb3Q9YX19fSk7CmNjLmZvckVhY2goZnVuY3Rpb24oYSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNkLnByb3RvdHlwZSxhLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlWyJfX3NoYWR5XyIrYV19LHNldDpmdW5jdGlvbihiKXt0aGlzLm5vZGVbIl9fc2hhZHlfIithXT1ifSxjb25maWd1cmFibGU6ITB9KX0pO3ZhciBkZD1uZXcgV2Vha01hcDtmdW5jdGlvbiBlZChhKXtpZih6KGEpfHxhIGluc3RhbmNlb2YgY2QpcmV0dXJuIGE7dmFyIGI9ZGQuZ2V0KGEpO2J8fChiPW5ldyBjZChhKSxkZC5zZXQoYSxiKSk7cmV0dXJuIGJ9O3ZhciBmZD1CKHtkaXNwYXRjaEV2ZW50OmZ1bmN0aW9uKGEpe1phKCk7cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfZGlzcGF0Y2hFdmVudChhKX0sYWRkRXZlbnRMaXN0ZW5lcjpVYixyZW1vdmVFdmVudExpc3RlbmVyOldifSk7dmFyIGdkPUIoe2dldCBhc3NpZ25lZFNsb3QoKXt2YXIgYT10aGlzLl9fc2hhZHlfcGFyZW50Tm9kZTsoYT1hJiZhLl9fc2hhZHlfc2hhZG93Um9vdCkmJlRjKGEpO3JldHVybihhPXYodGhpcykpJiZhLmFzc2lnbmVkU2xvdHx8bnVsbH19KTt2YXIgaGQ9d2luZG93LmRvY3VtZW50O2Z1bmN0aW9uIGlkKGEsYil7aWYoInNsb3QiPT09YilhPWEuX19zaGFkeV9wYXJlbnROb2RlLExhKGEpJiZBYyh2KGEpLnJvb3QpO2Vsc2UgaWYoInNsb3QiPT09YS5sb2NhbE5hbWUmJiJuYW1lIj09PWImJihiPXhjKGEpKSl7aWYoYi5hKXtVYyhiKTt2YXIgYz1hLndhLGQ9WWMoYSk7aWYoZCE9PWMpe2M9Yi5iW2NdO3ZhciBlPWMuaW5kZXhPZihhKTswPD1lJiZjLnNwbGljZShlLDEpO2M9Yi5iW2RdfHwoYi5iW2RdPVtdKTtjLnB1c2goYSk7MTxjLmxlbmd0aCYmKGIuYltkXT1aYyhjKSl9fUFjKGIpfX0KdmFyIGpkPUIoe2dldCBwcmV2aW91c0VsZW1lbnRTaWJsaW5nKCl7dmFyIGE9dih0aGlzKTtpZihhJiZ2b2lkIDAhPT1hLnByZXZpb3VzU2libGluZyl7Zm9yKGE9dGhpcy5fX3NoYWR5X3ByZXZpb3VzU2libGluZzthJiZhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KWE9YS5fX3NoYWR5X3ByZXZpb3VzU2libGluZztyZXR1cm4gYX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9wcmV2aW91c0VsZW1lbnRTaWJsaW5nfSxnZXQgbmV4dEVsZW1lbnRTaWJsaW5nKCl7dmFyIGE9dih0aGlzKTtpZihhJiZ2b2lkIDAhPT1hLm5leHRTaWJsaW5nKXtmb3IoYT10aGlzLl9fc2hhZHlfbmV4dFNpYmxpbmc7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEuX19zaGFkeV9uZXh0U2libGluZztyZXR1cm4gYX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9uZXh0RWxlbWVudFNpYmxpbmd9LGdldCBzbG90KCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCJzbG90Iil9LApzZXQgc2xvdChhKXt0aGlzLl9fc2hhZHlfc2V0QXR0cmlidXRlKCJzbG90IixhKX0sZ2V0IHNoYWRvd1Jvb3QoKXt2YXIgYT12KHRoaXMpO3JldHVybiBhJiZhLnBhfHxudWxsfSxnZXQgY2xhc3NOYW1lKCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sc2V0IGNsYXNzTmFtZShhKXt0aGlzLl9fc2hhZHlfc2V0QXR0cmlidXRlKCJjbGFzcyIsYSl9LHNldEF0dHJpYnV0ZTpmdW5jdGlvbihhLGIpe2lmKHRoaXMub3duZXJEb2N1bWVudCE9PWhkKXRoaXMuX19zaGFkeV9uYXRpdmVfc2V0QXR0cmlidXRlKGEsYik7ZWxzZXt2YXIgYzsoYz1HKCkpJiYiY2xhc3MiPT09YT8oYy5zZXRFbGVtZW50Q2xhc3ModGhpcyxiKSxjPSEwKTpjPSExO2N8fCh0aGlzLl9fc2hhZHlfbmF0aXZlX3NldEF0dHJpYnV0ZShhLGIpLGlkKHRoaXMsYSkpfX0scmVtb3ZlQXR0cmlidXRlOmZ1bmN0aW9uKGEpe3RoaXMuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQXR0cmlidXRlKGEpO2lkKHRoaXMsCmEpfSxhdHRhY2hTaGFkb3c6ZnVuY3Rpb24oYSl7aWYoIXRoaXMpdGhyb3cgRXJyb3IoIk11c3QgcHJvdmlkZSBhIGhvc3QuIik7aWYoIWEpdGhyb3cgRXJyb3IoIk5vdCBlbm91Z2ggYXJndW1lbnRzLiIpO3JldHVybiBuZXcgU2MoT2MsdGhpcyxhKX19KTt2YXIga2Q9Qih7Ymx1cjpmdW5jdGlvbigpe3ZhciBhPXYodGhpcyk7KGE9KGE9YSYmYS5yb290KSYmYS5hY3RpdmVFbGVtZW50KT9hLl9fc2hhZHlfYmx1cigpOnRoaXMuX19zaGFkeV9uYXRpdmVfYmx1cigpfX0pO2NjLmZvckVhY2goZnVuY3Rpb24oYSl7a2RbYV09e3NldDpmdW5jdGlvbihiKXt2YXIgYz11KHRoaXMpLGQ9YS5zdWJzdHJpbmcoMik7Yy5PW2FdJiZ0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZCxjLk9bYV0pO3RoaXMuX19zaGFkeV9hZGRFdmVudExpc3RlbmVyKGQsYik7Yy5PW2FdPWJ9LGdldDpmdW5jdGlvbigpe3ZhciBiPXYodGhpcyk7cmV0dXJuIGImJmIuT1thXX0sY29uZmlndXJhYmxlOiEwfX0pO3ZhciBsZD1CKHthc3NpZ25lZE5vZGVzOmZ1bmN0aW9uKGEpe2lmKCJzbG90Ij09PXRoaXMubG9jYWxOYW1lKXt2YXIgYj10aGlzLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKTtiJiZ6KGIpJiZUYyhiKTtyZXR1cm4oYj12KHRoaXMpKT8oYSYmYS5mbGF0dGVuP2IuRDpiLmFzc2lnbmVkTm9kZXMpfHxbXTpbXX19fSk7dmFyIG1kPXdpbmRvdy5kb2N1bWVudCxuZD1CKHtpbXBvcnROb2RlOmZ1bmN0aW9uKGEsYil7aWYoYS5vd25lckRvY3VtZW50IT09bWR8fCJ0ZW1wbGF0ZSI9PT1hLmxvY2FsTmFtZSlyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9pbXBvcnROb2RlKGEsYik7dmFyIGM9dGhpcy5fX3NoYWR5X25hdGl2ZV9pbXBvcnROb2RlKGEsITEpO2lmKGIpe2E9YS5fX3NoYWR5X2NoaWxkTm9kZXM7Yj0wO2Zvcih2YXIgZDtiPGEubGVuZ3RoO2IrKylkPXRoaXMuX19zaGFkeV9pbXBvcnROb2RlKGFbYl0sITApLGMuX19zaGFkeV9hcHBlbmRDaGlsZChkKX1yZXR1cm4gY319KTt2YXIgb2Q9Qih7YWRkRXZlbnRMaXN0ZW5lcjpVYi5iaW5kKHdpbmRvdykscmVtb3ZlRXZlbnRMaXN0ZW5lcjpXYi5iaW5kKHdpbmRvdyl9KTt2YXIgcGQ9e307T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsInBhcmVudEVsZW1lbnQiKSYmKHBkLnBhcmVudEVsZW1lbnQ9Q2MucGFyZW50RWxlbWVudCk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNvbnRhaW5zIikmJihwZC5jb250YWlucz1DYy5jb250YWlucyk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNoaWxkcmVuIikmJihwZC5jaGlsZHJlbj1GYy5jaGlsZHJlbik7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpJiYocGQuaW5uZXJIVE1MPUxjLmlubmVySFRNTCk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNsYXNzTmFtZSIpJiYocGQuY2xhc3NOYW1lPWpkLmNsYXNzTmFtZSk7CnZhciBxZD17RXZlbnRUYXJnZXQ6W2ZkXSxOb2RlOltDYyx3aW5kb3cuRXZlbnRUYXJnZXQ/bnVsbDpmZF0sVGV4dDpbZ2RdLEVsZW1lbnQ6W2pkLEZjLGdkLCF3Lm18fCJpbm5lckhUTUwiaW4gRWxlbWVudC5wcm90b3R5cGU/TGM6bnVsbCx3aW5kb3cuSFRNTFNsb3RFbGVtZW50P251bGw6bGRdLEhUTUxFbGVtZW50OltrZCxwZF0sSFRNTFNsb3RFbGVtZW50OltsZF0sRG9jdW1lbnRGcmFnbWVudDpbSGMsSWNdLERvY3VtZW50OltuZCxIYyxJYyxKY10sV2luZG93OltvZF19LHJkPXcubT9udWxsOlsiaW5uZXJIVE1MIiwidGV4dENvbnRlbnQiXTtmdW5jdGlvbiBzZChhKXt2YXIgYj1hP251bGw6cmQsYz17fSxkO2ZvcihkIGluIHFkKWMuVz13aW5kb3dbZF0mJndpbmRvd1tkXS5wcm90b3R5cGUscWRbZF0uZm9yRWFjaChmdW5jdGlvbihjKXtyZXR1cm4gZnVuY3Rpb24oZCl7cmV0dXJuIGMuVyYmZCYmQShjLlcsZCxhLGIpfX0oYykpLGM9e1c6Yy5XfX07aWYody5lYSl7dmFyIFNoYWR5RE9NPXtpblVzZTp3LmVhLHBhdGNoOmZ1bmN0aW9uKGEpe0ZiKGEpO0ViKGEpO3JldHVybiBhfSxpc1NoYWR5Um9vdDp6LGVucXVldWU6WWEsZmx1c2g6WmEsZmx1c2hJbml0aWFsOmZ1bmN0aW9uKGEpeyFhLmJhJiZhLkImJlRjKGEpfSxzZXR0aW5nczp3LGZpbHRlck11dGF0aW9uczpkYixvYnNlcnZlQ2hpbGRyZW46YmIsdW5vYnNlcnZlQ2hpbGRyZW46Y2IsZGVmZXJDb25uZWN0aW9uQ2FsbGJhY2tzOncuZGVmZXJDb25uZWN0aW9uQ2FsbGJhY2tzLHByZWZlclBlcmZvcm1hbmNlOncucHJlZmVyUGVyZm9ybWFuY2UsaGFuZGxlc0R5bmFtaWNTY29waW5nOiEwLHdyYXA6dy5KP2VkOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxXcmFwcGVyOmNkLGNvbXBvc2VkUGF0aDpNYixub1BhdGNoOncuSixuYXRpdmVNZXRob2RzOnFiLG5hdGl2ZVRyZWU6cmJ9O3dpbmRvdy5TaGFkeURPTT1TaGFkeURPTTt5YigpO3NkKCJfX3NoYWR5XyIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwKIl9hY3RpdmVFbGVtZW50IixKYy5hY3RpdmVFbGVtZW50KTtBKFdpbmRvdy5wcm90b3R5cGUsb2QsIl9fc2hhZHlfIik7dy5KfHwoc2QoKSxiYygpKTtYYigpO3dpbmRvdy5FdmVudD1aYjt3aW5kb3cuQ3VzdG9tRXZlbnQ9JGI7d2luZG93Lk1vdXNlRXZlbnQ9YWM7d2luZG93LlNoYWRvd1Jvb3Q9U2N9O3ZhciB0ZD1uZXcgU2V0KCJhbm5vdGF0aW9uLXhtbCBjb2xvci1wcm9maWxlIGZvbnQtZmFjZSBmb250LWZhY2Utc3JjIGZvbnQtZmFjZS11cmkgZm9udC1mYWNlLWZvcm1hdCBmb250LWZhY2UtbmFtZSBtaXNzaW5nLWdseXBoIi5zcGxpdCgiICIpKTtmdW5jdGlvbiB1ZChhKXt2YXIgYj10ZC5oYXMoYSk7YT0vXlthLXpdWy4wLTlfYS16XSotW1wtLjAtOV9hLXpdKiQvLnRlc3QoYSk7cmV0dXJuIWImJmF9ZnVuY3Rpb24gSChhKXt2YXIgYj1hLmlzQ29ubmVjdGVkO2lmKHZvaWQgMCE9PWIpcmV0dXJuIGI7Zm9yKDthJiYhKGEuX19DRV9pc0ltcG9ydERvY3VtZW50fHxhIGluc3RhbmNlb2YgRG9jdW1lbnQpOylhPWEucGFyZW50Tm9kZXx8KHdpbmRvdy5TaGFkb3dSb290JiZhIGluc3RhbmNlb2YgU2hhZG93Um9vdD9hLmhvc3Q6dm9pZCAwKTtyZXR1cm4hKCFhfHwhKGEuX19DRV9pc0ltcG9ydERvY3VtZW50fHxhIGluc3RhbmNlb2YgRG9jdW1lbnQpKX0KZnVuY3Rpb24gdmQoYSxiKXtmb3IoO2ImJmIhPT1hJiYhYi5uZXh0U2libGluZzspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGImJmIhPT1hP2IubmV4dFNpYmxpbmc6bnVsbH0KZnVuY3Rpb24gd2QoYSxiLGMpe2M9dm9pZCAwPT09Yz9uZXcgU2V0OmM7Zm9yKHZhciBkPWE7ZDspe2lmKGQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSl7dmFyIGU9ZDtiKGUpO3ZhciBmPWUubG9jYWxOYW1lO2lmKCJsaW5rIj09PWYmJiJpbXBvcnQiPT09ZS5nZXRBdHRyaWJ1dGUoInJlbCIpKXtkPWUuaW1wb3J0O2lmKGQgaW5zdGFuY2VvZiBOb2RlJiYhYy5oYXMoZCkpZm9yKGMuYWRkKGQpLGQ9ZC5maXJzdENoaWxkO2Q7ZD1kLm5leHRTaWJsaW5nKXdkKGQsYixjKTtkPXZkKGEsZSk7Y29udGludWV9ZWxzZSBpZigidGVtcGxhdGUiPT09Zil7ZD12ZChhLGUpO2NvbnRpbnVlfWlmKGU9ZS5fX0NFX3NoYWRvd1Jvb3QpZm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKXdkKGUsYixjKX1kPWQuZmlyc3RDaGlsZD9kLmZpcnN0Q2hpbGQ6dmQoYSxkKX19ZnVuY3Rpb24gSShhLGIsYyl7YVtiXT1jfTtmdW5jdGlvbiB4ZCgpe3RoaXMuYT1uZXcgTWFwO3RoaXMuZz1uZXcgTWFwO3RoaXMuZj1bXTt0aGlzLmM9ITF9ZnVuY3Rpb24geWQoYSxiLGMpe2EuYS5zZXQoYixjKTthLmcuc2V0KGMuY29uc3RydWN0b3JGdW5jdGlvbixjKX1mdW5jdGlvbiB6ZChhLGIpe2EuYz0hMDthLmYucHVzaChiKX1mdW5jdGlvbiBBZChhLGIpe2EuYyYmd2QoYixmdW5jdGlvbihiKXtyZXR1cm4gYS5iKGIpfSl9eGQucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7aWYodGhpcy5jJiYhYS5fX0NFX3BhdGNoZWQpe2EuX19DRV9wYXRjaGVkPSEwO2Zvcih2YXIgYj0wO2I8dGhpcy5mLmxlbmd0aDtiKyspdGhpcy5mW2JdKGEpfX07ZnVuY3Rpb24gSihhLGIpe3ZhciBjPVtdO3dkKGIsZnVuY3Rpb24oYSl7cmV0dXJuIGMucHVzaChhKX0pO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspe3ZhciBkPWNbYl07MT09PWQuX19DRV9zdGF0ZT9hLmNvbm5lY3RlZENhbGxiYWNrKGQpOkJkKGEsZCl9fQpmdW5jdGlvbiBLKGEsYil7dmFyIGM9W107d2QoYixmdW5jdGlvbihhKXtyZXR1cm4gYy5wdXNoKGEpfSk7Zm9yKGI9MDtiPGMubGVuZ3RoO2IrKyl7dmFyIGQ9Y1tiXTsxPT09ZC5fX0NFX3N0YXRlJiZhLmRpc2Nvbm5lY3RlZENhbGxiYWNrKGQpfX0KZnVuY3Rpb24gTChhLGIsYyl7Yz12b2lkIDA9PT1jP3t9OmM7dmFyIGQ9Yy5YYXx8bmV3IFNldCxlPWMuWXx8ZnVuY3Rpb24oYil7cmV0dXJuIEJkKGEsYil9LGY9W107d2QoYixmdW5jdGlvbihiKXtpZigibGluayI9PT1iLmxvY2FsTmFtZSYmImltcG9ydCI9PT1iLmdldEF0dHJpYnV0ZSgicmVsIikpe3ZhciBjPWIuaW1wb3J0O2MgaW5zdGFuY2VvZiBOb2RlJiYoYy5fX0NFX2lzSW1wb3J0RG9jdW1lbnQ9ITAsYy5fX0NFX2hhc1JlZ2lzdHJ5PSEwKTtjJiYiY29tcGxldGUiPT09Yy5yZWFkeVN0YXRlP2MuX19DRV9kb2N1bWVudExvYWRIYW5kbGVkPSEwOmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZnVuY3Rpb24oKXt2YXIgYz1iLmltcG9ydDtpZighYy5fX0NFX2RvY3VtZW50TG9hZEhhbmRsZWQpe2MuX19DRV9kb2N1bWVudExvYWRIYW5kbGVkPSEwO3ZhciBmPW5ldyBTZXQoZCk7Zi5kZWxldGUoYyk7TChhLGMse1hhOmYsWTplfSl9fSl9ZWxzZSBmLnB1c2goYil9LGQpO2lmKGEuYylmb3IoYj0KMDtiPGYubGVuZ3RoO2IrKylhLmIoZltiXSk7Zm9yKGI9MDtiPGYubGVuZ3RoO2IrKyllKGZbYl0pfQpmdW5jdGlvbiBCZChhLGIpe2lmKHZvaWQgMD09PWIuX19DRV9zdGF0ZSl7dmFyIGM9Yi5vd25lckRvY3VtZW50O2lmKGMuZGVmYXVsdFZpZXd8fGMuX19DRV9pc0ltcG9ydERvY3VtZW50JiZjLl9fQ0VfaGFzUmVnaXN0cnkpaWYoYz1hLmEuZ2V0KGIubG9jYWxOYW1lKSl7Yy5jb25zdHJ1Y3Rpb25TdGFjay5wdXNoKGIpO3ZhciBkPWMuY29uc3RydWN0b3JGdW5jdGlvbjt0cnl7dHJ5e2lmKG5ldyBkIT09Yil0aHJvdyBFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9yIGRpZCBub3QgcHJvZHVjZSB0aGUgZWxlbWVudCBiZWluZyB1cGdyYWRlZC4iKTt9ZmluYWxseXtjLmNvbnN0cnVjdGlvblN0YWNrLnBvcCgpfX1jYXRjaChnKXt0aHJvdyBiLl9fQ0Vfc3RhdGU9MixnO31iLl9fQ0Vfc3RhdGU9MTtiLl9fQ0VfZGVmaW5pdGlvbj1jO2lmKGMuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKWZvcihjPWMub2JzZXJ2ZWRBdHRyaWJ1dGVzLGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9CmNbZF0sZj1iLmdldEF0dHJpYnV0ZShlKTtudWxsIT09ZiYmYS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soYixlLG51bGwsZixudWxsKX1IKGIpJiZhLmNvbm5lY3RlZENhbGxiYWNrKGIpfX19eGQucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrPWZ1bmN0aW9uKGEpe3ZhciBiPWEuX19DRV9kZWZpbml0aW9uO2IuY29ubmVjdGVkQ2FsbGJhY2smJmIuY29ubmVjdGVkQ2FsbGJhY2suY2FsbChhKX07eGQucHJvdG90eXBlLmRpc2Nvbm5lY3RlZENhbGxiYWNrPWZ1bmN0aW9uKGEpe3ZhciBiPWEuX19DRV9kZWZpbml0aW9uO2IuZGlzY29ubmVjdGVkQ2FsbGJhY2smJmIuZGlzY29ubmVjdGVkQ2FsbGJhY2suY2FsbChhKX07CnhkLnByb3RvdHlwZS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2s9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLl9fQ0VfZGVmaW5pdGlvbjtmLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayYmLTE8Zi5vYnNlcnZlZEF0dHJpYnV0ZXMuaW5kZXhPZihiKSYmZi5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2suY2FsbChhLGIsYyxkLGUpfTtmdW5jdGlvbiBDZChhKXt2YXIgYj1kb2N1bWVudDt0aGlzLmI9YTt0aGlzLmE9Yjt0aGlzLkY9dm9pZCAwO0wodGhpcy5iLHRoaXMuYSk7ImxvYWRpbmciPT09dGhpcy5hLnJlYWR5U3RhdGUmJih0aGlzLkY9bmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5jLmJpbmQodGhpcykpLHRoaXMuRi5vYnNlcnZlKHRoaXMuYSx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSl9ZnVuY3Rpb24gRGQoYSl7YS5GJiZhLkYuZGlzY29ubmVjdCgpfUNkLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYS5yZWFkeVN0YXRlOyJpbnRlcmFjdGl2ZSIhPT1iJiYiY29tcGxldGUiIT09Ynx8RGQodGhpcyk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylmb3IodmFyIGM9YVtiXS5hZGRlZE5vZGVzLGQ9MDtkPGMubGVuZ3RoO2QrKylMKHRoaXMuYixjW2RdKX07ZnVuY3Rpb24gRWQoKXt2YXIgYT10aGlzO3RoaXMuYT10aGlzLmg9dm9pZCAwO3RoaXMuYj1uZXcgUHJvbWlzZShmdW5jdGlvbihiKXthLmE9YjthLmgmJmIoYS5oKX0pfUVkLnByb3RvdHlwZS5yZXNvbHZlPWZ1bmN0aW9uKGEpe2lmKHRoaXMuaCl0aHJvdyBFcnJvcigiQWxyZWFkeSByZXNvbHZlZC4iKTt0aGlzLmg9YTt0aGlzLmEmJnRoaXMuYShhKX07ZnVuY3Rpb24gTihhKXt0aGlzLmM9ITE7dGhpcy5hPWE7dGhpcy5sPW5ldyBNYXA7dGhpcy5mPWZ1bmN0aW9uKGEpe3JldHVybiBhKCl9O3RoaXMuYj0hMTt0aGlzLmc9W107dGhpcy5kYT1uZXcgQ2QoYSl9bj1OLnByb3RvdHlwZTsKbi5zYT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7aWYoIShiIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IG5ldyBUeXBlRXJyb3IoIkN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9ycyBtdXN0IGJlIGZ1bmN0aW9ucy4iKTtpZighdWQoYSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJUaGUgZWxlbWVudCBuYW1lICciK2ErIicgaXMgbm90IHZhbGlkLiIpO2lmKHRoaXMuYS5hLmdldChhKSl0aHJvdyBFcnJvcigiQSBjdXN0b20gZWxlbWVudCB3aXRoIG5hbWUgJyIrYSsiJyBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIik7aWYodGhpcy5jKXRocm93IEVycm9yKCJBIGN1c3RvbSBlbGVtZW50IGlzIGFscmVhZHkgYmVpbmcgZGVmaW5lZC4iKTt0aGlzLmM9ITA7dHJ5e3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWVbYV07aWYodm9pZCAwIT09YiYmIShiIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IEVycm9yKCJUaGUgJyIrYSsiJyBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24uIik7CnJldHVybiBifSxlPWIucHJvdG90eXBlO2lmKCEoZSBpbnN0YW5jZW9mIE9iamVjdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9yJ3MgcHJvdG90eXBlIGlzIG5vdCBhbiBvYmplY3QuIik7dmFyIGY9ZCgiY29ubmVjdGVkQ2FsbGJhY2siKTt2YXIgZz1kKCJkaXNjb25uZWN0ZWRDYWxsYmFjayIpO3ZhciBoPWQoImFkb3B0ZWRDYWxsYmFjayIpO3ZhciBrPWQoImF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayIpO3ZhciBsPWIub2JzZXJ2ZWRBdHRyaWJ1dGVzfHxbXX1jYXRjaChtKXtyZXR1cm59ZmluYWxseXt0aGlzLmM9ITF9Yj17bG9jYWxOYW1lOmEsY29uc3RydWN0b3JGdW5jdGlvbjpiLGNvbm5lY3RlZENhbGxiYWNrOmYsZGlzY29ubmVjdGVkQ2FsbGJhY2s6ZyxhZG9wdGVkQ2FsbGJhY2s6aCxhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2s6ayxvYnNlcnZlZEF0dHJpYnV0ZXM6bCxjb25zdHJ1Y3Rpb25TdGFjazpbXX07eWQodGhpcy5hLAphLGIpO3RoaXMuZy5wdXNoKGIpO3RoaXMuYnx8KHRoaXMuYj0hMCx0aGlzLmYoZnVuY3Rpb24oKXtyZXR1cm4gRmQoYyl9KSl9O24uWT1mdW5jdGlvbihhKXtMKHRoaXMuYSxhKX07CmZ1bmN0aW9uIEZkKGEpe2lmKCExIT09YS5iKXthLmI9ITE7Zm9yKHZhciBiPWEuZyxjPVtdLGQ9bmV3IE1hcCxlPTA7ZTxiLmxlbmd0aDtlKyspZC5zZXQoYltlXS5sb2NhbE5hbWUsW10pO0woYS5hLGRvY3VtZW50LHtZOmZ1bmN0aW9uKGIpe2lmKHZvaWQgMD09PWIuX19DRV9zdGF0ZSl7dmFyIGU9Yi5sb2NhbE5hbWUsZj1kLmdldChlKTtmP2YucHVzaChiKTphLmEuYS5nZXQoZSkmJmMucHVzaChiKX19fSk7Zm9yKGU9MDtlPGMubGVuZ3RoO2UrKylCZChhLmEsY1tlXSk7Zm9yKDswPGIubGVuZ3RoOyl7dmFyIGY9Yi5zaGlmdCgpO2U9Zi5sb2NhbE5hbWU7Zj1kLmdldChmLmxvY2FsTmFtZSk7Zm9yKHZhciBnPTA7ZzxmLmxlbmd0aDtnKyspQmQoYS5hLGZbZ10pOyhlPWEubC5nZXQoZSkpJiZlLnJlc29sdmUodm9pZCAwKX19fW4uZ2V0PWZ1bmN0aW9uKGEpe2lmKGE9dGhpcy5hLmEuZ2V0KGEpKXJldHVybiBhLmNvbnN0cnVjdG9yRnVuY3Rpb259OwpuLnRhPWZ1bmN0aW9uKGEpe2lmKCF1ZChhKSlyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFN5bnRheEVycm9yKCInIithKyInIGlzIG5vdCBhIHZhbGlkIGN1c3RvbSBlbGVtZW50IG5hbWUuIikpO3ZhciBiPXRoaXMubC5nZXQoYSk7aWYoYilyZXR1cm4gYi5iO2I9bmV3IEVkO3RoaXMubC5zZXQoYSxiKTt0aGlzLmEuYS5nZXQoYSkmJiF0aGlzLmcuc29tZShmdW5jdGlvbihiKXtyZXR1cm4gYi5sb2NhbE5hbWU9PT1hfSkmJmIucmVzb2x2ZSh2b2lkIDApO3JldHVybiBiLmJ9O24uUGE9ZnVuY3Rpb24oYSl7RGQodGhpcy5kYSk7dmFyIGI9dGhpcy5mO3RoaXMuZj1mdW5jdGlvbihjKXtyZXR1cm4gYShmdW5jdGlvbigpe3JldHVybiBiKGMpfSl9fTt3aW5kb3cuQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5PU47Ti5wcm90b3R5cGUuZGVmaW5lPU4ucHJvdG90eXBlLnNhO04ucHJvdG90eXBlLnVwZ3JhZGU9Ti5wcm90b3R5cGUuWTtOLnByb3RvdHlwZS5nZXQ9Ti5wcm90b3R5cGUuZ2V0OwpOLnByb3RvdHlwZS53aGVuRGVmaW5lZD1OLnByb3RvdHlwZS50YTtOLnByb3RvdHlwZS5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrPU4ucHJvdG90eXBlLlBhO3ZhciBHZD13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQsSGQ9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVFbGVtZW50TlMsSWQ9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlLEpkPXdpbmRvdy5Eb2N1bWVudC5wcm90b3R5cGUucHJlcGVuZCxLZD13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmFwcGVuZCxMZD13aW5kb3cuRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucHJlcGVuZCxNZD13aW5kb3cuRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUuYXBwZW5kLE5kPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5jbG9uZU5vZGUsT2Q9d2luZG93Lk5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkLFBkPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmUsUWQ9d2luZG93Lk5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLFJkPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQsU2Q9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuTm9kZS5wcm90b3R5cGUsCiJ0ZXh0Q29udGVudCIpLFRkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hdHRhY2hTaGFkb3csVWQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpLFZkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGUsV2Q9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnNldEF0dHJpYnV0ZSxYZD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlLFlkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGVOUyxaZD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuc2V0QXR0cmlidXRlTlMsJGQ9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZU5TLGFlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5pbnNlcnRBZGphY2VudEVsZW1lbnQsYmU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50SFRNTCxjZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucHJlcGVuZCwKZGU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFwcGVuZCxlZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYmVmb3JlLGZlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hZnRlcixnZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVwbGFjZVdpdGgsaGU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZSxpZT13aW5kb3cuSFRNTEVsZW1lbnQsamU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiKSxrZT13aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50RWxlbWVudCxsZT13aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50SFRNTDt2YXIgbWU9bmV3IGZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBuZSgpe3ZhciBhPW9lO3dpbmRvdy5IVE1MRWxlbWVudD1mdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt2YXIgYj10aGlzLmNvbnN0cnVjdG9yLGQ9YS5nLmdldChiKTtpZighZCl0aHJvdyBFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGJlaW5nIGNvbnN0cnVjdGVkIHdhcyBub3QgcmVnaXN0ZXJlZCB3aXRoIGBjdXN0b21FbGVtZW50c2AuIik7dmFyIGU9ZC5jb25zdHJ1Y3Rpb25TdGFjaztpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGU9R2QuY2FsbChkb2N1bWVudCxkLmxvY2FsTmFtZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKGUsYi5wcm90b3R5cGUpLGUuX19DRV9zdGF0ZT0xLGUuX19DRV9kZWZpbml0aW9uPWQsYS5iKGUpLGU7ZD1lLmxlbmd0aC0xO3ZhciBmPWVbZF07aWYoZj09PW1lKXRocm93IEVycm9yKCJUaGUgSFRNTEVsZW1lbnQgY29uc3RydWN0b3Igd2FzIGVpdGhlciBjYWxsZWQgcmVlbnRyYW50bHkgZm9yIHRoaXMgY29uc3RydWN0b3Igb3IgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiIpOwplW2RdPW1lO09iamVjdC5zZXRQcm90b3R5cGVPZihmLGIucHJvdG90eXBlKTthLmIoZik7cmV0dXJuIGZ9Yi5wcm90b3R5cGU9aWUucHJvdG90eXBlO09iamVjdC5kZWZpbmVQcm9wZXJ0eShiLnByb3RvdHlwZSwiY29uc3RydWN0b3IiLHt3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTpifSk7cmV0dXJuIGJ9KCl9O2Z1bmN0aW9uIHBlKGEsYixjKXtmdW5jdGlvbiBkKGIpe3JldHVybiBmdW5jdGlvbihjKXtmb3IodmFyIGQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDsrK2UpZFtlXT1hcmd1bWVudHNbZV07ZT1bXTtmb3IodmFyIGY9W10sbD0wO2w8ZC5sZW5ndGg7bCsrKXt2YXIgbT1kW2xdO20gaW5zdGFuY2VvZiBFbGVtZW50JiZIKG0pJiZmLnB1c2gobSk7aWYobSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpZm9yKG09bS5maXJzdENoaWxkO207bT1tLm5leHRTaWJsaW5nKWUucHVzaChtKTtlbHNlIGUucHVzaChtKX1iLmFwcGx5KHRoaXMsZCk7Zm9yKGQ9MDtkPGYubGVuZ3RoO2QrKylLKGEsZltkXSk7aWYoSCh0aGlzKSlmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCsrKWY9ZVtkXSxmIGluc3RhbmNlb2YgRWxlbWVudCYmSihhLGYpfX12b2lkIDAhPT1jLlYmJihiLnByZXBlbmQ9ZChjLlYpKTt2b2lkIDAhPT1jLmFwcGVuZCYmKGIuYXBwZW5kPWQoYy5hcHBlbmQpKX07ZnVuY3Rpb24gcWUoKXt2YXIgYT1vZTtJKERvY3VtZW50LnByb3RvdHlwZSwiY3JlYXRlRWxlbWVudCIsZnVuY3Rpb24oYil7aWYodGhpcy5fX0NFX2hhc1JlZ2lzdHJ5KXt2YXIgYz1hLmEuZ2V0KGIpO2lmKGMpcmV0dXJuIG5ldyBjLmNvbnN0cnVjdG9yRnVuY3Rpb259Yj1HZC5jYWxsKHRoaXMsYik7YS5iKGIpO3JldHVybiBifSk7SShEb2N1bWVudC5wcm90b3R5cGUsImltcG9ydE5vZGUiLGZ1bmN0aW9uKGIsYyl7Yj1JZC5jYWxsKHRoaXMsYiwhIWMpO3RoaXMuX19DRV9oYXNSZWdpc3RyeT9MKGEsYik6QWQoYSxiKTtyZXR1cm4gYn0pO0koRG9jdW1lbnQucHJvdG90eXBlLCJjcmVhdGVFbGVtZW50TlMiLGZ1bmN0aW9uKGIsYyl7aWYodGhpcy5fX0NFX2hhc1JlZ2lzdHJ5JiYobnVsbD09PWJ8fCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj09PWIpKXt2YXIgZD1hLmEuZ2V0KGMpO2lmKGQpcmV0dXJuIG5ldyBkLmNvbnN0cnVjdG9yRnVuY3Rpb259Yj1IZC5jYWxsKHRoaXMsCmIsYyk7YS5iKGIpO3JldHVybiBifSk7cGUoYSxEb2N1bWVudC5wcm90b3R5cGUse1Y6SmQsYXBwZW5kOktkfSl9O2Z1bmN0aW9uIHJlKCl7ZnVuY3Rpb24gYShhLGQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJ0ZXh0Q29udGVudCIse2VudW1lcmFibGU6ZC5lbnVtZXJhYmxlLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZC5nZXQsc2V0OmZ1bmN0aW9uKGEpe2lmKHRoaXMubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSlkLnNldC5jYWxsKHRoaXMsYSk7ZWxzZXt2YXIgYz12b2lkIDA7aWYodGhpcy5maXJzdENoaWxkKXt2YXIgZT10aGlzLmNoaWxkTm9kZXMsaD1lLmxlbmd0aDtpZigwPGgmJkgodGhpcykpe2M9QXJyYXkoaCk7Zm9yKHZhciBrPTA7azxoO2srKyljW2tdPWVba119fWQuc2V0LmNhbGwodGhpcyxhKTtpZihjKWZvcihhPTA7YTxjLmxlbmd0aDthKyspSyhiLGNbYV0pfX19KX12YXIgYj1vZTtJKE5vZGUucHJvdG90eXBlLCJpbnNlcnRCZWZvcmUiLGZ1bmN0aW9uKGEsZCl7aWYoYSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpe3ZhciBjPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhLmNoaWxkTm9kZXMpOwphPVBkLmNhbGwodGhpcyxhLGQpO2lmKEgodGhpcykpZm9yKGQ9MDtkPGMubGVuZ3RoO2QrKylKKGIsY1tkXSk7cmV0dXJuIGF9Yz1IKGEpO2Q9UGQuY2FsbCh0aGlzLGEsZCk7YyYmSyhiLGEpO0godGhpcykmJkooYixhKTtyZXR1cm4gZH0pO0koTm9kZS5wcm90b3R5cGUsImFwcGVuZENoaWxkIixmdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCl7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGEuY2hpbGROb2Rlcyk7YT1PZC5jYWxsKHRoaXMsYSk7aWYoSCh0aGlzKSlmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKylKKGIsY1tlXSk7cmV0dXJuIGF9Yz1IKGEpO2U9T2QuY2FsbCh0aGlzLGEpO2MmJksoYixhKTtIKHRoaXMpJiZKKGIsYSk7cmV0dXJuIGV9KTtJKE5vZGUucHJvdG90eXBlLCJjbG9uZU5vZGUiLGZ1bmN0aW9uKGEpe2E9TmQuY2FsbCh0aGlzLCEhYSk7dGhpcy5vd25lckRvY3VtZW50Ll9fQ0VfaGFzUmVnaXN0cnk/TChiLGEpOgpBZChiLGEpO3JldHVybiBhfSk7SShOb2RlLnByb3RvdHlwZSwicmVtb3ZlQ2hpbGQiLGZ1bmN0aW9uKGEpe3ZhciBjPUgoYSksZT1RZC5jYWxsKHRoaXMsYSk7YyYmSyhiLGEpO3JldHVybiBlfSk7SShOb2RlLnByb3RvdHlwZSwicmVwbGFjZUNoaWxkIixmdW5jdGlvbihhLGQpe2lmKGEgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KXt2YXIgYz1BcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYS5jaGlsZE5vZGVzKTthPVJkLmNhbGwodGhpcyxhLGQpO2lmKEgodGhpcykpZm9yKEsoYixkKSxkPTA7ZDxjLmxlbmd0aDtkKyspSihiLGNbZF0pO3JldHVybiBhfWM9SChhKTt2YXIgZj1SZC5jYWxsKHRoaXMsYSxkKSxnPUgodGhpcyk7ZyYmSyhiLGQpO2MmJksoYixhKTtnJiZKKGIsYSk7cmV0dXJuIGZ9KTtTZCYmU2QuZ2V0P2EoTm9kZS5wcm90b3R5cGUsU2QpOnpkKGIsZnVuY3Rpb24oYil7YShiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CltdLGI9MDtiPHRoaXMuY2hpbGROb2Rlcy5sZW5ndGg7YisrKWEucHVzaCh0aGlzLmNoaWxkTm9kZXNbYl0udGV4dENvbnRlbnQpO3JldHVybiBhLmpvaW4oIiIpfSxzZXQ6ZnVuY3Rpb24oYSl7Zm9yKDt0aGlzLmZpcnN0Q2hpbGQ7KVFkLmNhbGwodGhpcyx0aGlzLmZpcnN0Q2hpbGQpO09kLmNhbGwodGhpcyxkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSl9fSl9KX07ZnVuY3Rpb24gc2UoYSl7ZnVuY3Rpb24gYihiKXtyZXR1cm4gZnVuY3Rpb24oYyl7Zm9yKHZhciBkPVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7KytlKWRbZV09YXJndW1lbnRzW2VdO2U9W107Zm9yKHZhciBoPVtdLGs9MDtrPGQubGVuZ3RoO2srKyl7dmFyIGw9ZFtrXTtsIGluc3RhbmNlb2YgRWxlbWVudCYmSChsKSYmaC5wdXNoKGwpO2lmKGwgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KWZvcihsPWwuZmlyc3RDaGlsZDtsO2w9bC5uZXh0U2libGluZyllLnB1c2gobCk7ZWxzZSBlLnB1c2gobCl9Yi5hcHBseSh0aGlzLGQpO2ZvcihkPTA7ZDxoLmxlbmd0aDtkKyspSyhhLGhbZF0pO2lmKEgodGhpcykpZm9yKGQ9MDtkPGUubGVuZ3RoO2QrKyloPWVbZF0saCBpbnN0YW5jZW9mIEVsZW1lbnQmJkooYSxoKX19dmFyIGM9RWxlbWVudC5wcm90b3R5cGU7dm9pZCAwIT09ZWUmJihjLmJlZm9yZT1iKGVlKSk7dm9pZCAwIT09ZWUmJihjLmFmdGVyPWIoZmUpKTt2b2lkIDAhPT1nZSYmCkkoYywicmVwbGFjZVdpdGgiLGZ1bmN0aW9uKGIpe2Zvcih2YXIgYz1bXSxkPTA7ZDxhcmd1bWVudHMubGVuZ3RoOysrZCljW2RdPWFyZ3VtZW50c1tkXTtkPVtdO2Zvcih2YXIgZz1bXSxoPTA7aDxjLmxlbmd0aDtoKyspe3ZhciBrPWNbaF07ayBpbnN0YW5jZW9mIEVsZW1lbnQmJkgoaykmJmcucHVzaChrKTtpZihrIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClmb3Ioaz1rLmZpcnN0Q2hpbGQ7aztrPWsubmV4dFNpYmxpbmcpZC5wdXNoKGspO2Vsc2UgZC5wdXNoKGspfWg9SCh0aGlzKTtnZS5hcHBseSh0aGlzLGMpO2ZvcihjPTA7YzxnLmxlbmd0aDtjKyspSyhhLGdbY10pO2lmKGgpZm9yKEsoYSx0aGlzKSxjPTA7YzxkLmxlbmd0aDtjKyspZz1kW2NdLGcgaW5zdGFuY2VvZiBFbGVtZW50JiZKKGEsZyl9KTt2b2lkIDAhPT1oZSYmSShjLCJyZW1vdmUiLGZ1bmN0aW9uKCl7dmFyIGI9SCh0aGlzKTtoZS5jYWxsKHRoaXMpO2ImJksoYSx0aGlzKX0pfTtmdW5jdGlvbiB0ZSgpe2Z1bmN0aW9uIGEoYSxiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiaW5uZXJIVE1MIix7ZW51bWVyYWJsZTpiLmVudW1lcmFibGUsY29uZmlndXJhYmxlOiEwLGdldDpiLmdldCxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxlPXZvaWQgMDtIKHRoaXMpJiYoZT1bXSx3ZCh0aGlzLGZ1bmN0aW9uKGEpe2EhPT1jJiZlLnB1c2goYSl9KSk7Yi5zZXQuY2FsbCh0aGlzLGEpO2lmKGUpZm9yKHZhciBmPTA7ZjxlLmxlbmd0aDtmKyspe3ZhciBnPWVbZl07MT09PWcuX19DRV9zdGF0ZSYmZC5kaXNjb25uZWN0ZWRDYWxsYmFjayhnKX10aGlzLm93bmVyRG9jdW1lbnQuX19DRV9oYXNSZWdpc3RyeT9MKGQsdGhpcyk6QWQoZCx0aGlzKTtyZXR1cm4gYX19KX1mdW5jdGlvbiBiKGEsYil7SShhLCJpbnNlcnRBZGphY2VudEVsZW1lbnQiLGZ1bmN0aW9uKGEsYyl7dmFyIGU9SChjKTthPWIuY2FsbCh0aGlzLGEsYyk7ZSYmSyhkLGMpO0goYSkmJkooZCxjKTtyZXR1cm4gYX0pfQpmdW5jdGlvbiBjKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2Zvcih2YXIgYz1bXTthIT09YjthPWEubmV4dFNpYmxpbmcpYy5wdXNoKGEpO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspTChkLGNbYl0pfUkoYSwiaW5zZXJ0QWRqYWNlbnRIVE1MIixmdW5jdGlvbihhLGQpe2E9YS50b0xvd2VyQ2FzZSgpO2lmKCJiZWZvcmViZWdpbiI9PT1hKXt2YXIgZT10aGlzLnByZXZpb3VzU2libGluZztiLmNhbGwodGhpcyxhLGQpO2MoZXx8dGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsdGhpcyl9ZWxzZSBpZigiYWZ0ZXJiZWdpbiI9PT1hKWU9dGhpcy5maXJzdENoaWxkLGIuY2FsbCh0aGlzLGEsZCksYyh0aGlzLmZpcnN0Q2hpbGQsZSk7ZWxzZSBpZigiYmVmb3JlZW5kIj09PWEpZT10aGlzLmxhc3RDaGlsZCxiLmNhbGwodGhpcyxhLGQpLGMoZXx8dGhpcy5maXJzdENoaWxkLG51bGwpO2Vsc2UgaWYoImFmdGVyZW5kIj09PWEpZT10aGlzLm5leHRTaWJsaW5nLGIuY2FsbCh0aGlzLGEsZCksYyh0aGlzLm5leHRTaWJsaW5nLAplKTtlbHNlIHRocm93IG5ldyBTeW50YXhFcnJvcigiVGhlIHZhbHVlIHByb3ZpZGVkICgiK1N0cmluZyhhKSsiKSBpcyBub3Qgb25lIG9mICdiZWZvcmViZWdpbicsICdhZnRlcmJlZ2luJywgJ2JlZm9yZWVuZCcsIG9yICdhZnRlcmVuZCcuIik7fSl9dmFyIGQ9b2U7VGQmJkkoRWxlbWVudC5wcm90b3R5cGUsImF0dGFjaFNoYWRvdyIsZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX19DRV9zaGFkb3dSb290PWE9VGQuY2FsbCh0aGlzLGEpfSk7VWQmJlVkLmdldD9hKEVsZW1lbnQucHJvdG90eXBlLFVkKTpqZSYmamUuZ2V0P2EoSFRNTEVsZW1lbnQucHJvdG90eXBlLGplKTp6ZChkLGZ1bmN0aW9uKGIpe2EoYix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE5kLmNhbGwodGhpcywhMCkuaW5uZXJIVE1MfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9InRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lLGM9Yj90aGlzLmNvbnRlbnQ6dGhpcyxkPUhkLmNhbGwoZG9jdW1lbnQsCnRoaXMubmFtZXNwYWNlVVJJLHRoaXMubG9jYWxOYW1lKTtmb3IoZC5pbm5lckhUTUw9YTswPGMuY2hpbGROb2Rlcy5sZW5ndGg7KVFkLmNhbGwoYyxjLmNoaWxkTm9kZXNbMF0pO2ZvcihhPWI/ZC5jb250ZW50OmQ7MDxhLmNoaWxkTm9kZXMubGVuZ3RoOylPZC5jYWxsKGMsYS5jaGlsZE5vZGVzWzBdKX19KX0pO0koRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZSIsZnVuY3Rpb24oYSxiKXtpZigxIT09dGhpcy5fX0NFX3N0YXRlKXJldHVybiBXZC5jYWxsKHRoaXMsYSxiKTt2YXIgYz1WZC5jYWxsKHRoaXMsYSk7V2QuY2FsbCh0aGlzLGEsYik7Yj1WZC5jYWxsKHRoaXMsYSk7ZC5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodGhpcyxhLGMsYixudWxsKX0pO0koRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZU5TIixmdW5jdGlvbihhLGIsYyl7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gWmQuY2FsbCh0aGlzLGEsYixjKTt2YXIgZT1ZZC5jYWxsKHRoaXMsYSwKYik7WmQuY2FsbCh0aGlzLGEsYixjKTtjPVlkLmNhbGwodGhpcyxhLGIpO2QuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsYixlLGMsYSl9KTtJKEVsZW1lbnQucHJvdG90eXBlLCJyZW1vdmVBdHRyaWJ1dGUiLGZ1bmN0aW9uKGEpe2lmKDEhPT10aGlzLl9fQ0Vfc3RhdGUpcmV0dXJuIFhkLmNhbGwodGhpcyxhKTt2YXIgYj1WZC5jYWxsKHRoaXMsYSk7WGQuY2FsbCh0aGlzLGEpO251bGwhPT1iJiZkLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0aGlzLGEsYixudWxsLG51bGwpfSk7SShFbGVtZW50LnByb3RvdHlwZSwicmVtb3ZlQXR0cmlidXRlTlMiLGZ1bmN0aW9uKGEsYil7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gJGQuY2FsbCh0aGlzLGEsYik7dmFyIGM9WWQuY2FsbCh0aGlzLGEsYik7JGQuY2FsbCh0aGlzLGEsYik7dmFyIGU9WWQuY2FsbCh0aGlzLGEsYik7YyE9PWUmJmQuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsYixjLGUsYSl9KTtrZT9iKEhUTUxFbGVtZW50LnByb3RvdHlwZSwKa2UpOmFlP2IoRWxlbWVudC5wcm90b3R5cGUsYWUpOmNvbnNvbGUud2FybigiQ3VzdG9tIEVsZW1lbnRzOiBgRWxlbWVudCNpbnNlcnRBZGphY2VudEVsZW1lbnRgIHdhcyBub3QgcGF0Y2hlZC4iKTtsZT9jKEhUTUxFbGVtZW50LnByb3RvdHlwZSxsZSk6YmU/YyhFbGVtZW50LnByb3RvdHlwZSxiZSk6Y29uc29sZS53YXJuKCJDdXN0b20gRWxlbWVudHM6IGBFbGVtZW50I2luc2VydEFkamFjZW50SFRNTGAgd2FzIG5vdCBwYXRjaGVkLiIpO3BlKGQsRWxlbWVudC5wcm90b3R5cGUse1Y6Y2UsYXBwZW5kOmRlfSk7c2UoZCl9O3ZhciB1ZT13aW5kb3cuY3VzdG9tRWxlbWVudHM7aWYoIXVlfHx1ZS5mb3JjZVBvbHlmaWxsfHwiZnVuY3Rpb24iIT10eXBlb2YgdWUuZGVmaW5lfHwiZnVuY3Rpb24iIT10eXBlb2YgdWUuZ2V0KXt2YXIgb2U9bmV3IHhkO25lKCk7cWUoKTtwZShvZSxEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSx7VjpMZCxhcHBlbmQ6TWR9KTtyZSgpO3RlKCk7ZG9jdW1lbnQuX19DRV9oYXNSZWdpc3RyeT0hMDt2YXIgY3VzdG9tRWxlbWVudHM9bmV3IE4ob2UpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImN1c3RvbUVsZW1lbnRzIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6Y3VzdG9tRWxlbWVudHN9KX07ZnVuY3Rpb24gdmUoKXt0aGlzLmVuZD10aGlzLnN0YXJ0PTA7dGhpcy5ydWxlcz10aGlzLnBhcmVudD10aGlzLnByZXZpb3VzPW51bGw7dGhpcy5jc3NUZXh0PXRoaXMucGFyc2VkQ3NzVGV4dD0iIjt0aGlzLmF0UnVsZT0hMTt0aGlzLnR5cGU9MDt0aGlzLnBhcnNlZFNlbGVjdG9yPXRoaXMuc2VsZWN0b3I9dGhpcy5rZXlmcmFtZXNOYW1lPSIifQpmdW5jdGlvbiB3ZShhKXthPWEucmVwbGFjZSh4ZSwiIikucmVwbGFjZSh5ZSwiIik7dmFyIGI9emUsYz1hLGQ9bmV3IHZlO2Quc3RhcnQ9MDtkLmVuZD1jLmxlbmd0aDtmb3IodmFyIGU9ZCxmPTAsZz1jLmxlbmd0aDtmPGc7ZisrKWlmKCJ7Ij09PWNbZl0pe2UucnVsZXN8fChlLnJ1bGVzPVtdKTt2YXIgaD1lLGs9aC5ydWxlc1toLnJ1bGVzLmxlbmd0aC0xXXx8bnVsbDtlPW5ldyB2ZTtlLnN0YXJ0PWYrMTtlLnBhcmVudD1oO2UucHJldmlvdXM9aztoLnJ1bGVzLnB1c2goZSl9ZWxzZSJ9Ij09PWNbZl0mJihlLmVuZD1mKzEsZT1lLnBhcmVudHx8ZCk7cmV0dXJuIGIoZCxhKX0KZnVuY3Rpb24gemUoYSxiKXt2YXIgYz1iLnN1YnN0cmluZyhhLnN0YXJ0LGEuZW5kLTEpO2EucGFyc2VkQ3NzVGV4dD1hLmNzc1RleHQ9Yy50cmltKCk7YS5wYXJlbnQmJihjPWIuc3Vic3RyaW5nKGEucHJldmlvdXM/YS5wcmV2aW91cy5lbmQ6YS5wYXJlbnQuc3RhcnQsYS5zdGFydC0xKSxjPUFlKGMpLGM9Yy5yZXBsYWNlKEJlLCIgIiksYz1jLnN1YnN0cmluZyhjLmxhc3RJbmRleE9mKCI7IikrMSksYz1hLnBhcnNlZFNlbGVjdG9yPWEuc2VsZWN0b3I9Yy50cmltKCksYS5hdFJ1bGU9MD09PWMuaW5kZXhPZigiQCIpLGEuYXRSdWxlPzA9PT1jLmluZGV4T2YoIkBtZWRpYSIpP2EudHlwZT1DZTpjLm1hdGNoKERlKSYmKGEudHlwZT1FZSxhLmtleWZyYW1lc05hbWU9YS5zZWxlY3Rvci5zcGxpdChCZSkucG9wKCkpOmEudHlwZT0wPT09Yy5pbmRleE9mKCItLSIpP0ZlOkdlKTtpZihjPWEucnVsZXMpZm9yKHZhciBkPTAsZT1jLmxlbmd0aCxmPXZvaWQgMDtkPGUmJihmPWNbZF0pO2QrKyl6ZShmLApiKTtyZXR1cm4gYX1mdW5jdGlvbiBBZShhKXtyZXR1cm4gYS5yZXBsYWNlKC9cXChbMC05YS1mXXsxLDZ9KVxzL2dpLGZ1bmN0aW9uKGEsYyl7YT1jO2ZvcihjPTYtYS5sZW5ndGg7Yy0tOylhPSIwIithO3JldHVybiJcXCIrYX0pfQpmdW5jdGlvbiBIZShhLGIsYyl7Yz12b2lkIDA9PT1jPyIiOmM7dmFyIGQ9IiI7aWYoYS5jc3NUZXh0fHxhLnJ1bGVzKXt2YXIgZT1hLnJ1bGVzLGY7aWYoZj1lKWY9ZVswXSxmPSEoZiYmZi5zZWxlY3RvciYmMD09PWYuc2VsZWN0b3IuaW5kZXhPZigiLS0iKSk7aWYoZil7Zj0wO2Zvcih2YXIgZz1lLmxlbmd0aCxoPXZvaWQgMDtmPGcmJihoPWVbZl0pO2YrKylkPUhlKGgsYixkKX1lbHNlIGI/Yj1hLmNzc1RleHQ6KGI9YS5jc3NUZXh0LGI9Yi5yZXBsYWNlKEllLCIiKS5yZXBsYWNlKEplLCIiKSxiPWIucmVwbGFjZShLZSwiIikucmVwbGFjZShMZSwiIikpLChkPWIudHJpbSgpKSYmKGQ9IiAgIitkKyJcbiIpfWQmJihhLnNlbGVjdG9yJiYoYys9YS5zZWxlY3RvcisiIHtcbiIpLGMrPWQsYS5zZWxlY3RvciYmKGMrPSJ9XG5cbiIpKTtyZXR1cm4gY30KdmFyIEdlPTEsRWU9NyxDZT00LEZlPTFFMyx4ZT0vXC9cKlteKl0qXCorKFteLypdW14qXSpcKispKlwvL2dpbSx5ZT0vQGltcG9ydFteO10qOy9naW0sSWU9Lyg/Ol5bXjtcLVxzfV0rKT8tLVteO3t9XSo/Oltee307XSo/KD86Wztcbl18JCkvZ2ltLEplPS8oPzpeW147XC1cc31dKyk/LS1bXjt7fV0qPzpbXnt9O10qP3tbXn1dKj99KD86Wztcbl18JCk/L2dpbSxLZT0vQGFwcGx5XHMqXCg/W14pO10qXCk/XHMqKD86Wztcbl18JCk/L2dpbSxMZT0vW147Ol0qPzpbXjtdKj92YXJcKFteO10qXCkoPzpbO1xuXXwkKT8vZ2ltLERlPS9eQFteXHNdKmtleWZyYW1lcy8sQmU9L1xzKy9nO3ZhciBPPSEod2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaW5Vc2UpLE1lO2Z1bmN0aW9uIE5lKGEpe01lPWEmJmEuc2hpbWNzc3Byb3BlcnRpZXM/ITE6T3x8IShuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFwvNjAxfEVkZ2VcLzE1Lyl8fCF3aW5kb3cuQ1NTfHwhQ1NTLnN1cHBvcnRzfHwhQ1NTLnN1cHBvcnRzKCJib3gtc2hhZG93IiwiMCAwIDAgdmFyKC0tZm9vKSIpKX12YXIgT2U7d2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQmJihPZT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQpO3ZhciBQZT0hKCF3aW5kb3cuU2hhZHlDU1N8fCF3aW5kb3cuU2hhZHlDU1MuZGlzYWJsZVJ1bnRpbWUpOwp3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M/TWU9d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzczp3aW5kb3cuU2hhZHlDU1M/KE5lKHdpbmRvdy5TaGFkeUNTUyksd2luZG93LlNoYWR5Q1NTPXZvaWQgMCk6TmUod2luZG93LldlYkNvbXBvbmVudHMmJndpbmRvdy5XZWJDb21wb25lbnRzLmZsYWdzKTt2YXIgUT1NZSxRZT1PZTt2YXIgUmU9Lyg/Ol58Wztcc3tdXHMqKSgtLVtcdy1dKj8pXHMqOlxzKig/OigoPzonKD86XFwnfC4pKj8nfCIoPzpcXCJ8LikqPyJ8XChbXildKj9cKXxbXn07e10pKyl8XHsoW159XSopXH0oPzooPz1bO1xzfV0pfCQpKS9naSxTZT0vKD86XnxcVyspQGFwcGx5XHMqXCg/KFteKTtcbl0qKVwpPy9naSxUZT0vKC0tW1x3LV0rKVxzKihbOiw7KV18JCkvZ2ksVWU9LyhhbmltYXRpb25ccyo6KXwoYW5pbWF0aW9uLW5hbWVccyo6KS8sJGU9L0BtZWRpYVxzKC4qKS8sYWY9L1x7W159XSpcfS9nO3ZhciBiZj1uZXcgU2V0O2Z1bmN0aW9uIGNmKGEsYil7aWYoIWEpcmV0dXJuIiI7InN0cmluZyI9PT10eXBlb2YgYSYmKGE9d2UoYSkpO2ImJmRmKGEsYik7cmV0dXJuIEhlKGEsUSl9ZnVuY3Rpb24gZWYoYSl7IWEuX19jc3NSdWxlcyYmYS50ZXh0Q29udGVudCYmKGEuX19jc3NSdWxlcz13ZShhLnRleHRDb250ZW50KSk7cmV0dXJuIGEuX19jc3NSdWxlc3x8bnVsbH1mdW5jdGlvbiBmZihhKXtyZXR1cm4hIWEucGFyZW50JiZhLnBhcmVudC50eXBlPT09RWV9ZnVuY3Rpb24gZGYoYSxiLGMsZCl7aWYoYSl7dmFyIGU9ITEsZj1hLnR5cGU7aWYoZCYmZj09PUNlKXt2YXIgZz1hLnNlbGVjdG9yLm1hdGNoKCRlKTtnJiYod2luZG93Lm1hdGNoTWVkaWEoZ1sxXSkubWF0Y2hlc3x8KGU9ITApKX1mPT09R2U/YihhKTpjJiZmPT09RWU/YyhhKTpmPT09RmUmJihlPSEwKTtpZigoYT1hLnJ1bGVzKSYmIWUpZm9yKGU9MCxmPWEubGVuZ3RoLGc9dm9pZCAwO2U8ZiYmKGc9YVtlXSk7ZSsrKWRmKGcsYixjLGQpfX0KZnVuY3Rpb24gZ2YoYSxiLGMsZCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtiJiZlLnNldEF0dHJpYnV0ZSgic2NvcGUiLGIpO2UudGV4dENvbnRlbnQ9YTtoZihlLGMsZCk7cmV0dXJuIGV9dmFyIGpmPW51bGw7ZnVuY3Rpb24ga2YoYSl7YT1kb2N1bWVudC5jcmVhdGVDb21tZW50KCIgU2hhZHkgRE9NIHN0eWxlcyBmb3IgIithKyIgIik7dmFyIGI9ZG9jdW1lbnQuaGVhZDtiLmluc2VydEJlZm9yZShhLChqZj9qZi5uZXh0U2libGluZzpudWxsKXx8Yi5maXJzdENoaWxkKTtyZXR1cm4gamY9YX1mdW5jdGlvbiBoZihhLGIsYyl7Yj1ifHxkb2N1bWVudC5oZWFkO2IuaW5zZXJ0QmVmb3JlKGEsYyYmYy5uZXh0U2libGluZ3x8Yi5maXJzdENoaWxkKTtqZj9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGpmKT09PU5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HJiYoamY9YSk6amY9YX0KZnVuY3Rpb24gbGYoYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2I8ZDtiKyspaWYoIigiPT09YVtiXSljKys7ZWxzZSBpZigiKSI9PT1hW2JdJiYwPT09LS1jKXJldHVybiBiO3JldHVybi0xfWZ1bmN0aW9uIG1mKGEsYil7dmFyIGM9YS5pbmRleE9mKCJ2YXIoIik7aWYoLTE9PT1jKXJldHVybiBiKGEsIiIsIiIsIiIpO3ZhciBkPWxmKGEsYyszKSxlPWEuc3Vic3RyaW5nKGMrNCxkKTtjPWEuc3Vic3RyaW5nKDAsYyk7YT1tZihhLnN1YnN0cmluZyhkKzEpLGIpO2Q9ZS5pbmRleE9mKCIsIik7cmV0dXJuLTE9PT1kP2IoYyxlLnRyaW0oKSwiIixhKTpiKGMsZS5zdWJzdHJpbmcoMCxkKS50cmltKCksZS5zdWJzdHJpbmcoZCsxKS50cmltKCksYSl9ZnVuY3Rpb24gbmYoYSxiKXtPP2Euc2V0QXR0cmlidXRlKCJjbGFzcyIsYik6d2luZG93LlNoYWR5RE9NLm5hdGl2ZU1ldGhvZHMuc2V0QXR0cmlidXRlLmNhbGwoYSwiY2xhc3MiLGIpfQp2YXIgb2Y9d2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00ud3JhcHx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O2Z1bmN0aW9uIHBmKGEpe3ZhciBiPWEubG9jYWxOYW1lLGM9IiI7Yj8tMTxiLmluZGV4T2YoIi0iKXx8KGM9YixiPWEuZ2V0QXR0cmlidXRlJiZhLmdldEF0dHJpYnV0ZSgiaXMiKXx8IiIpOihiPWEuaXMsYz1hLmV4dGVuZHMpO3JldHVybntpczpiLE06Y319ZnVuY3Rpb24gcWYoYSl7Zm9yKHZhciBiPVtdLGM9IiIsZD0wOzA8PWQmJmQ8YS5sZW5ndGg7ZCsrKWlmKCIoIj09PWFbZF0pe3ZhciBlPWxmKGEsZCk7Yys9YS5zbGljZShkLGUrMSk7ZD1lfWVsc2UiLCI9PT1hW2RdPyhiLnB1c2goYyksYz0iIik6Yys9YVtkXTtjJiZiLnB1c2goYyk7cmV0dXJuIGJ9CmZ1bmN0aW9uIHJmKGEpe2lmKHZvaWQgMCE9PVFlKXJldHVybiBRZTtpZih2b2lkIDA9PT1hLl9fY3NzQnVpbGQpe3ZhciBiPWEuZ2V0QXR0cmlidXRlKCJjc3MtYnVpbGQiKTtpZihiKWEuX19jc3NCdWlsZD1iO2Vsc2V7YTp7Yj0idGVtcGxhdGUiPT09YS5sb2NhbE5hbWU/YS5jb250ZW50LmZpcnN0Q2hpbGQ6YS5maXJzdENoaWxkO2lmKGIgaW5zdGFuY2VvZiBDb21tZW50JiYoYj1iLnRleHRDb250ZW50LnRyaW0oKS5zcGxpdCgiOiIpLCJjc3MtYnVpbGQiPT09YlswXSkpe2I9YlsxXTticmVhayBhfWI9IiJ9aWYoIiIhPT1iKXt2YXIgYz0idGVtcGxhdGUiPT09YS5sb2NhbE5hbWU/YS5jb250ZW50LmZpcnN0Q2hpbGQ6YS5maXJzdENoaWxkO2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKX1hLl9fY3NzQnVpbGQ9Yn19cmV0dXJuIGEuX19jc3NCdWlsZHx8IiJ9CmZ1bmN0aW9uIHNmKGEpe2E9dm9pZCAwPT09YT8iIjphO3JldHVybiIiIT09YSYmUT9PPyJzaGFkb3ciPT09YToic2hhZHkiPT09YTohMX07ZnVuY3Rpb24gdGYoKXt9ZnVuY3Rpb24gdWYoYSxiKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxifHwiIil9KX1mdW5jdGlvbiB2ZihhLGIsYyl7Yi5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZjKGIpO3ZhciBkOyJ0ZW1wbGF0ZSI9PT1iLmxvY2FsTmFtZT9kPShiLmNvbnRlbnR8fGIuX2NvbnRlbnR8fGIpLmNoaWxkTm9kZXM6ZD1iLmNoaWxkcmVufHxiLmNoaWxkTm9kZXM7aWYoZClmb3IoYj0wO2I8ZC5sZW5ndGg7YisrKXZmKGEsZFtiXSxjKX0KZnVuY3Rpb24gd2YoYSxiLGMpe2lmKGIpaWYoYS5jbGFzc0xpc3QpYz8oYS5jbGFzc0xpc3QucmVtb3ZlKCJzdHlsZS1zY29wZSIpLGEuY2xhc3NMaXN0LnJlbW92ZShiKSk6KGEuY2xhc3NMaXN0LmFkZCgic3R5bGUtc2NvcGUiKSxhLmNsYXNzTGlzdC5hZGQoYikpO2Vsc2UgaWYoYS5nZXRBdHRyaWJ1dGUpe3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpO2M/ZCYmKGI9ZC5yZXBsYWNlKCJzdHlsZS1zY29wZSIsIiIpLnJlcGxhY2UoYiwiIiksbmYoYSxiKSk6bmYoYSwoZD9kKyIgIjoiIikrInN0eWxlLXNjb3BlICIrYil9fWZ1bmN0aW9uIHhmKGEsYixjKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxiLCEwKTt3ZihhLGMpfSl9ZnVuY3Rpb24geWYoYSxiKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxifHwiIiwhMCl9KX0KZnVuY3Rpb24gemYoYSxiLGMsZCxlKXt2YXIgZj1SO2U9dm9pZCAwPT09ZT8iIjplOyIiPT09ZSYmKE98fCJzaGFkeSI9PT0odm9pZCAwPT09ZD8iIjpkKT9lPWNmKGIsYyk6KGE9cGYoYSksZT1BZihmLGIsYS5pcyxhLk0sYykrIlxuXG4iKSk7cmV0dXJuIGUudHJpbSgpfWZ1bmN0aW9uIEFmKGEsYixjLGQsZSl7dmFyIGY9QmYoYyxkKTtjPWM/Ii4iK2M6IiI7cmV0dXJuIGNmKGIsZnVuY3Rpb24oYil7Yi5jfHwoYi5zZWxlY3Rvcj1iLmo9Q2YoYSxiLGEuYixjLGYpLGIuYz0hMCk7ZSYmZShiLGMsZil9KX1mdW5jdGlvbiBCZihhLGIpe3JldHVybiBiPyJbaXM9IithKyJdIjphfQpmdW5jdGlvbiBDZihhLGIsYyxkLGUpe3ZhciBmPXFmKGIuc2VsZWN0b3IpO2lmKCFmZihiKSl7Yj0wO2Zvcih2YXIgZz1mLmxlbmd0aCxoPXZvaWQgMDtiPGcmJihoPWZbYl0pO2IrKylmW2JdPWMuY2FsbChhLGgsZCxlKX1yZXR1cm4gZi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuISFhfSkuam9pbigiLCIpfWZ1bmN0aW9uIERmKGEpe3JldHVybiBhLnJlcGxhY2UoRWYsZnVuY3Rpb24oYSxjLGQpey0xPGQuaW5kZXhPZigiKyIpP2Q9ZC5yZXBsYWNlKC9cKy9nLCJfX18iKTotMTxkLmluZGV4T2YoIl9fXyIpJiYoZD1kLnJlcGxhY2UoL19fXy9nLCIrIikpO3JldHVybiI6IitjKyIoIitkKyIpIn0pfQpmdW5jdGlvbiBGZihhKXtmb3IodmFyIGI9W10sYztjPWEubWF0Y2goR2YpOyl7dmFyIGQ9Yy5pbmRleCxlPWxmKGEsZCk7aWYoLTE9PT1lKXRocm93IEVycm9yKGMuaW5wdXQrIiBzZWxlY3RvciBtaXNzaW5nICcpJyIpO2M9YS5zbGljZShkLGUrMSk7YT1hLnJlcGxhY2UoYywiXHVlMDAwIik7Yi5wdXNoKGMpfXJldHVybntoYTphLG1hdGNoZXM6Yn19ZnVuY3Rpb24gSGYoYSxiKXt2YXIgYz1hLnNwbGl0KCJcdWUwMDAiKTtyZXR1cm4gYi5yZWR1Y2UoZnVuY3Rpb24oYSxiLGYpe3JldHVybiBhK2IrY1tmKzFdfSxjWzBdKX0KdGYucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSExO2E9YS50cmltKCk7dmFyIGU9RWYudGVzdChhKTtlJiYoYT1hLnJlcGxhY2UoRWYsZnVuY3Rpb24oYSxiLGMpe3JldHVybiI6IitiKyIoIitjLnJlcGxhY2UoL1xzL2csIiIpKyIpIn0pLGE9RGYoYSkpO3ZhciBmPUdmLnRlc3QoYSk7aWYoZil7dmFyIGc9RmYoYSk7YT1nLmhhO2c9Zy5tYXRjaGVzfWE9YS5yZXBsYWNlKElmLCI6aG9zdCAkMSIpO2E9YS5yZXBsYWNlKEpmLGZ1bmN0aW9uKGEsZSxmKXtkfHwoYT1LZihmLGUsYixjKSxkPWR8fGEuc3RvcCxlPWEuQ2EsZj1hLnZhbHVlKTtyZXR1cm4gZStmfSk7ZiYmKGE9SGYoYSxnKSk7ZSYmKGE9RGYoYSkpO3JldHVybiBhfTsKZnVuY3Rpb24gS2YoYSxiLGMsZCl7dmFyIGU9YS5pbmRleE9mKCI6OnNsb3R0ZWQiKTswPD1hLmluZGV4T2YoIjpob3N0Iik/YT1MZihhLGQpOjAhPT1lJiYoYT1jP01mKGEsYyk6YSk7Yz0hMTswPD1lJiYoYj0iIixjPSEwKTtpZihjKXt2YXIgZj0hMDtjJiYoYT1hLnJlcGxhY2UoTmYsZnVuY3Rpb24oYSxiKXtyZXR1cm4iID4gIitifSkpfWE9YS5yZXBsYWNlKE9mLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4nW2Rpcj0iJytjKyciXSAnK2IrIiwgIitiKydbZGlyPSInK2MrJyJdJ30pO3JldHVybnt2YWx1ZTphLENhOmIsc3RvcDpmfX0KZnVuY3Rpb24gTWYoYSxiKXthPWEuc3BsaXQoLyhcWy4rP1xdKS8pO2Zvcih2YXIgYz1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspaWYoMT09PWQlMiljLnB1c2goYVtkXSk7ZWxzZXt2YXIgZT1hW2RdO2lmKCIiIT09ZXx8ZCE9PWEubGVuZ3RoLTEpZT1lLnNwbGl0KCI6IiksZVswXSs9YixjLnB1c2goZS5qb2luKCI6IikpfXJldHVybiBjLmpvaW4oIiIpfWZ1bmN0aW9uIExmKGEsYil7dmFyIGM9YS5tYXRjaChQZik7cmV0dXJuKGM9YyYmY1syXS50cmltKCl8fCIiKT9jWzBdLm1hdGNoKFFmKT9hLnJlcGxhY2UoUGYsZnVuY3Rpb24oYSxjLGYpe3JldHVybiBiK2Z9KTpjLnNwbGl0KFFmKVswXT09PWI/Yzoic2hvdWxkX25vdF9tYXRjaCI6YS5yZXBsYWNlKCI6aG9zdCIsYil9ZnVuY3Rpb24gUmYoYSl7Ijpyb290Ij09PWEuc2VsZWN0b3ImJihhLnNlbGVjdG9yPSJodG1sIil9CnRmLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLm1hdGNoKCI6aG9zdCIpPyIiOmEubWF0Y2goIjo6c2xvdHRlZCIpP3RoaXMuYihhLCI6bm90KC5zdHlsZS1zY29wZSkiKTpNZihhLnRyaW0oKSwiOm5vdCguc3R5bGUtc2NvcGUpIil9O3AuT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGYucHJvdG90eXBlLHthOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4ic3R5bGUtc2NvcGUifX19KTsKdmFyIEVmPS86KG50aFstXHddKylcKChbXildKylcKS8sSmY9LyhefFtccz4rfl0rKSgoPzpcWy4rP1xdfFteXHM+K349W10pKykvZyxRZj0vW1suOiMqXS8sSWY9L14oOjpzbG90dGVkKS8sUGY9Lyg6aG9zdCkoPzpcKCgoPzpcKFteKShdKlwpfFteKShdKikrPylcKSkvLE5mPS8oPzo6OnNsb3R0ZWQpKD86XCgoKD86XChbXikoXSpcKXxbXikoXSopKz8pXCkpLyxPZj0vKC4qKTpkaXJcKCg/OihsdHJ8cnRsKSlcKS8sR2Y9LzooPzptYXRjaGVzfGFueXwtKD86d2Via2l0fG1veiktYW55KS8sUj1uZXcgdGY7ZnVuY3Rpb24gU2YoYSxiLGMsZCxlKXt0aGlzLkE9YXx8bnVsbDt0aGlzLmI9Ynx8bnVsbDt0aGlzLmZhPWN8fFtdO3RoaXMubz1udWxsO3RoaXMuY3NzQnVpbGQ9ZXx8IiI7dGhpcy5NPWR8fCIiO3RoaXMuYT10aGlzLnM9dGhpcy53PW51bGx9ZnVuY3Rpb24gVChhKXtyZXR1cm4gYT9hLl9fc3R5bGVJbmZvOm51bGx9ZnVuY3Rpb24gVGYoYSxiKXtyZXR1cm4gYS5fX3N0eWxlSW5mbz1ifVNmLnByb3RvdHlwZS5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX07U2YucHJvdG90eXBlLl9nZXRTdHlsZVJ1bGVzPVNmLnByb3RvdHlwZS5jO2Z1bmN0aW9uIFVmKGEpe3ZhciBiPXRoaXMubWF0Y2hlc3x8dGhpcy5tYXRjaGVzU2VsZWN0b3J8fHRoaXMubW96TWF0Y2hlc1NlbGVjdG9yfHx0aGlzLm1zTWF0Y2hlc1NlbGVjdG9yfHx0aGlzLm9NYXRjaGVzU2VsZWN0b3J8fHRoaXMud2Via2l0TWF0Y2hlc1NlbGVjdG9yO3JldHVybiBiJiZiLmNhbGwodGhpcyxhKX12YXIgVmY9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgiVHJpZGVudCIpO2Z1bmN0aW9uIFdmKCl7fWZ1bmN0aW9uIFhmKGEpe3ZhciBiPXt9LGM9W10sZD0wO2RmKGEsZnVuY3Rpb24oYSl7WWYoYSk7YS5pbmRleD1kKys7YT1hLmkuY3NzVGV4dDtmb3IodmFyIGM7Yz1UZS5leGVjKGEpOyl7dmFyIGU9Y1sxXTsiOiIhPT1jWzJdJiYoYltlXT0hMCl9fSxmdW5jdGlvbihhKXtjLnB1c2goYSl9KTthLmI9YzthPVtdO2Zvcih2YXIgZSBpbiBiKWEucHVzaChlKTtyZXR1cm4gYX0KZnVuY3Rpb24gWWYoYSl7aWYoIWEuaSl7dmFyIGI9e30sYz17fTtaZihhLGMpJiYoYi52PWMsYS5ydWxlcz1udWxsKTtiLmNzc1RleHQ9YS5wYXJzZWRDc3NUZXh0LnJlcGxhY2UoYWYsIiIpLnJlcGxhY2UoUmUsIiIpO2EuaT1ifX1mdW5jdGlvbiBaZihhLGIpe3ZhciBjPWEuaTtpZihjKXtpZihjLnYpcmV0dXJuIE9iamVjdC5hc3NpZ24oYixjLnYpLCEwfWVsc2V7Yz1hLnBhcnNlZENzc1RleHQ7Zm9yKHZhciBkO2E9UmUuZXhlYyhjKTspe2Q9KGFbMl18fGFbM10pLnRyaW0oKTtpZigiaW5oZXJpdCIhPT1kfHwidW5zZXQiIT09ZCliW2FbMV0udHJpbSgpXT1kO2Q9ITB9cmV0dXJuIGR9fQpmdW5jdGlvbiAkZihhLGIsYyl7YiYmKGI9MDw9Yi5pbmRleE9mKCI7Iik/YWcoYSxiLGMpOm1mKGIsZnVuY3Rpb24oYixlLGYsZyl7aWYoIWUpcmV0dXJuIGIrZzsoZT0kZihhLGNbZV0sYykpJiYiaW5pdGlhbCIhPT1lPyJhcHBseS1zaGltLWluaGVyaXQiPT09ZSYmKGU9ImluaGVyaXQiKTplPSRmKGEsY1tmXXx8ZixjKXx8ZjtyZXR1cm4gYisoZXx8IiIpK2d9KSk7cmV0dXJuIGImJmIudHJpbSgpfHwiIn0KZnVuY3Rpb24gYWcoYSxiLGMpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgZD0wLGUsZjtkPGIubGVuZ3RoO2QrKylpZihlPWJbZF0pe1NlLmxhc3RJbmRleD0wO2lmKGY9U2UuZXhlYyhlKSllPSRmKGEsY1tmWzFdXSxjKTtlbHNlIGlmKGY9ZS5pbmRleE9mKCI6IiksLTEhPT1mKXt2YXIgZz1lLnN1YnN0cmluZyhmKTtnPWcudHJpbSgpO2c9JGYoYSxnLGMpfHxnO2U9ZS5zdWJzdHJpbmcoMCxmKStnfWJbZF09ZSYmZS5sYXN0SW5kZXhPZigiOyIpPT09ZS5sZW5ndGgtMT9lLnNsaWNlKDAsLTEpOmV8fCIifXJldHVybiBiLmpvaW4oIjsiKX0KZnVuY3Rpb24gYmcoYSxiKXt2YXIgYz17fSxkPVtdO2RmKGEsZnVuY3Rpb24oYSl7YS5pfHxZZihhKTt2YXIgZT1hLmp8fGEucGFyc2VkU2VsZWN0b3I7YiYmYS5pLnYmJmUmJlVmLmNhbGwoYixlKSYmKFpmKGEsYyksYT1hLmluZGV4LGU9cGFyc2VJbnQoYS8zMiwxMCksZFtlXT0oZFtlXXx8MCl8MTw8YSUzMil9LG51bGwsITApO3JldHVybnt2OmMsa2V5OmR9fQpmdW5jdGlvbiBjZyhhLGIsYyxkKXtiLml8fFlmKGIpO2lmKGIuaS52KXt2YXIgZT1wZihhKTthPWUuaXM7ZT1lLk07ZT1hP0JmKGEsZSk6Imh0bWwiO3ZhciBmPWIucGFyc2VkU2VsZWN0b3IsZz0iOmhvc3QgPiAqIj09PWZ8fCJodG1sIj09PWYsaD0wPT09Zi5pbmRleE9mKCI6aG9zdCIpJiYhZzsic2hhZHkiPT09YyYmKGc9Zj09PWUrIiA+ICouIitlfHwtMSE9PWYuaW5kZXhPZigiaHRtbCIpLGg9IWcmJjA9PT1mLmluZGV4T2YoZSkpO2lmKGd8fGgpYz1lLGgmJihiLmp8fChiLmo9Q2YoUixiLFIuYixhPyIuIithOiIiLGUpKSxjPWIuanx8ZSksZCh7aGE6YyxJYTpoLFphOmd9KX19ZnVuY3Rpb24gZGcoYSxiLGMpe3ZhciBkPXt9LGU9e307ZGYoYixmdW5jdGlvbihiKXtjZyhhLGIsYyxmdW5jdGlvbihjKXtVZi5jYWxsKGEuX2VsZW1lbnR8fGEsYy5oYSkmJihjLklhP1pmKGIsZCk6WmYoYixlKSl9KX0sbnVsbCwhMCk7cmV0dXJue1JhOmUsSGE6ZH19CmZ1bmN0aW9uIGVnKGEsYixjLGQpe3ZhciBlPXBmKGIpLGY9QmYoZS5pcyxlLk0pLGc9bmV3IFJlZ0V4cCgiKD86XnxbXi4jWzpdKSIrKGIuZXh0ZW5kcz8iXFwiK2Yuc2xpY2UoMCwtMSkrIlxcXSI6ZikrIigkfFsuOltcXHM+K35dKSIpLGg9VChiKTtlPWguQTtoPWguY3NzQnVpbGQ7dmFyIGs9ZmcoZSxkKTtyZXR1cm4gemYoYixlLGZ1bmN0aW9uKGIpe3ZhciBlPSIiO2IuaXx8WWYoYik7Yi5pLmNzc1RleHQmJihlPWFnKGEsYi5pLmNzc1RleHQsYykpO2IuY3NzVGV4dD1lO2lmKCFPJiYhZmYoYikmJmIuY3NzVGV4dCl7dmFyIGg9ZT1iLmNzc1RleHQ7bnVsbD09Yi5uYSYmKGIubmE9VWUudGVzdChlKSk7aWYoYi5uYSlpZihudWxsPT1iLlUpe2IuVT1bXTtmb3IodmFyIGwgaW4gayloPWtbbF0saD1oKGUpLGUhPT1oJiYoZT1oLGIuVS5wdXNoKGwpKX1lbHNle2ZvcihsPTA7bDxiLlUubGVuZ3RoOysrbCloPWtbYi5VW2xdXSxlPWgoZSk7aD1lfWIuY3NzVGV4dD1oO2Iuaj1iLmp8fApiLnNlbGVjdG9yO2U9Ii4iK2Q7bD1xZihiLmopO2g9MDtmb3IodmFyIE09bC5sZW5ndGgsVT12b2lkIDA7aDxNJiYoVT1sW2hdKTtoKyspbFtoXT1VLm1hdGNoKGcpP1UucmVwbGFjZShmLGUpOmUrIiAiK1U7Yi5zZWxlY3Rvcj1sLmpvaW4oIiwiKX19LGgpfWZ1bmN0aW9uIGZnKGEsYil7YT1hLmI7dmFyIGM9e307aWYoIU8mJmEpZm9yKHZhciBkPTAsZT1hW2RdO2Q8YS5sZW5ndGg7ZT1hWysrZF0pe3ZhciBmPWUsZz1iO2YuZj1uZXcgUmVnRXhwKCJcXGIiK2Yua2V5ZnJhbWVzTmFtZSsiKD8hXFxCfC0pIiwiZyIpO2YuYT1mLmtleWZyYW1lc05hbWUrIi0iK2c7Zi5qPWYuanx8Zi5zZWxlY3RvcjtmLnNlbGVjdG9yPWYuai5yZXBsYWNlKGYua2V5ZnJhbWVzTmFtZSxmLmEpO2NbZS5rZXlmcmFtZXNOYW1lXT1nZyhlKX1yZXR1cm4gY31mdW5jdGlvbiBnZyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGIucmVwbGFjZShhLmYsYS5hKX19CmZ1bmN0aW9uIGhnKGEsYil7dmFyIGM9aWcsZD1lZihhKTthLnRleHRDb250ZW50PWNmKGQsZnVuY3Rpb24oYSl7dmFyIGQ9YS5jc3NUZXh0PWEucGFyc2VkQ3NzVGV4dDthLmkmJmEuaS5jc3NUZXh0JiYoZD1kLnJlcGxhY2UoSWUsIiIpLnJlcGxhY2UoSmUsIiIpLGEuY3NzVGV4dD1hZyhjLGQsYikpfSl9cC5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhXZi5wcm90b3R5cGUse2E6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiJ4LXNjb3BlIn19fSk7dmFyIGlnPW5ldyBXZjt2YXIgamc9e30sa2c9d2luZG93LmN1c3RvbUVsZW1lbnRzO2lmKGtnJiYhTyYmIVBlKXt2YXIgbGc9a2cuZGVmaW5lO2tnLmRlZmluZT1mdW5jdGlvbihhLGIsYyl7amdbYV18fChqZ1thXT1rZihhKSk7bGcuY2FsbChrZyxhLGIsYyl9fTtmdW5jdGlvbiBtZygpe3RoaXMuY2FjaGU9e319bWcucHJvdG90eXBlLnN0b3JlPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuY2FjaGVbYV18fFtdO2UucHVzaCh7djpiLHN0eWxlRWxlbWVudDpjLHM6ZH0pOzEwMDxlLmxlbmd0aCYmZS5zaGlmdCgpO3RoaXMuY2FjaGVbYV09ZX07ZnVuY3Rpb24gbmcoKXt9dmFyIG9nPW5ldyBSZWdFeHAoUi5hKyJcXHMqKFteXFxzXSopIik7ZnVuY3Rpb24gcGcoYSl7cmV0dXJuKGE9KGEuY2xhc3NMaXN0JiZhLmNsYXNzTGlzdC52YWx1ZT9hLmNsYXNzTGlzdC52YWx1ZTphLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpLm1hdGNoKG9nKSk/YVsxXToiIn1mdW5jdGlvbiBxZyhhKXt2YXIgYj1vZihhKS5nZXRSb290Tm9kZSgpO3JldHVybiBiPT09YXx8Yj09PWEub3duZXJEb2N1bWVudD8iIjooYT1iLmhvc3QpP3BmKGEpLmlzOiIifQpmdW5jdGlvbiByZyhhKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXTtpZihjLnRhcmdldCE9PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmYy50YXJnZXQhPT1kb2N1bWVudC5oZWFkKWZvcih2YXIgZD0wO2Q8Yy5hZGRlZE5vZGVzLmxlbmd0aDtkKyspe3ZhciBlPWMuYWRkZWROb2Rlc1tkXTtpZihlLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe3ZhciBmPWUuZ2V0Um9vdE5vZGUoKSxnPXBnKGUpO2lmKGcmJmY9PT1lLm93bmVyRG9jdW1lbnQmJigic3R5bGUiIT09ZS5sb2NhbE5hbWUmJiJ0ZW1wbGF0ZSIhPT1lLmxvY2FsTmFtZXx8IiI9PT1yZihlKSkpeWYoZSxnKTtlbHNlIGlmKGYgaW5zdGFuY2VvZiBTaGFkb3dSb290KWZvcihmPXFnKGUpLGYhPT1nJiZ4ZihlLGcsZiksZT13aW5kb3cuU2hhZHlET00ubmF0aXZlTWV0aG9kcy5xdWVyeVNlbGVjdG9yQWxsLmNhbGwoZSwiOm5vdCguIitSLmErIikiKSxnPTA7ZzxlLmxlbmd0aDtnKyspe2Y9ZVtnXTsKdmFyIGg9cWcoZik7aCYmd2YoZixoKX19fX19CmlmKCEoT3x8d2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaGFuZGxlc0R5bmFtaWNTY29waW5nKSl7dmFyIHNnPW5ldyBNdXRhdGlvbk9ic2VydmVyKHJnKSx0Zz1mdW5jdGlvbihhKXtzZy5vYnNlcnZlKGEse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSl9O2lmKHdpbmRvdy5jdXN0b21FbGVtZW50cyYmIXdpbmRvdy5jdXN0b21FbGVtZW50cy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrKXRnKGRvY3VtZW50KTtlbHNle3ZhciB1Zz1mdW5jdGlvbigpe3RnKGRvY3VtZW50LmJvZHkpfTt3aW5kb3cuSFRNTEltcG9ydHM/d2luZG93LkhUTUxJbXBvcnRzLndoZW5SZWFkeSh1Zyk6cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7aWYoImxvYWRpbmciPT09ZG9jdW1lbnQucmVhZHlTdGF0ZSl7dmFyIGE9ZnVuY3Rpb24oKXt1ZygpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGEpfTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIiwKYSl9ZWxzZSB1ZygpfSl9bmc9ZnVuY3Rpb24oKXtyZyhzZy50YWtlUmVjb3JkcygpKX19dmFyIHZnPW5nO3ZhciB3Zz17fTt2YXIgeGc9UHJvbWlzZS5yZXNvbHZlKCk7ZnVuY3Rpb24geWcoYSl7aWYoYT13Z1thXSlhLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj1hLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbnx8MCxhLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbj1hLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbnx8MCxhLl9hcHBseVNoaW1OZXh0VmVyc2lvbj0oYS5fYXBwbHlTaGltTmV4dFZlcnNpb258fDApKzF9ZnVuY3Rpb24gemcoYSl7cmV0dXJuIGEuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPT09YS5fYXBwbHlTaGltTmV4dFZlcnNpb259ZnVuY3Rpb24gQWcoYSl7YS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb249YS5fYXBwbHlTaGltTmV4dFZlcnNpb247YS5fdmFsaWRhdGluZ3x8KGEuX3ZhbGlkYXRpbmc9ITAseGcudGhlbihmdW5jdGlvbigpe2EuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPWEuX2FwcGx5U2hpbU5leHRWZXJzaW9uO2EuX3ZhbGlkYXRpbmc9ITF9KSl9O3ZhciBCZz17fSxDZz1uZXcgbWc7ZnVuY3Rpb24gWSgpe3RoaXMubD17fTt0aGlzLmM9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O3ZhciBhPW5ldyB2ZTthLnJ1bGVzPVtdO3RoaXMuZj1UZih0aGlzLmMsbmV3IFNmKGEpKTt0aGlzLmc9ITE7dGhpcy5iPXRoaXMuYT1udWxsfW49WS5wcm90b3R5cGU7bi5mbHVzaD1mdW5jdGlvbigpe3ZnKCl9O24uRmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGVmKGEpfTtuLlZhPWZ1bmN0aW9uKGEpe3JldHVybiBjZihhKX07bi5wcmVwYXJlVGVtcGxhdGU9ZnVuY3Rpb24oYSxiLGMpe3RoaXMucHJlcGFyZVRlbXBsYXRlRG9tKGEsYik7dGhpcy5wcmVwYXJlVGVtcGxhdGVTdHlsZXMoYSxiLGMpfTsKbi5wcmVwYXJlVGVtcGxhdGVTdHlsZXM9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhLl9wcmVwYXJlZCYmIVBlKXtPfHxqZ1tiXXx8KGpnW2JdPWtmKGIpKTthLl9wcmVwYXJlZD0hMDthLm5hbWU9YjthLmV4dGVuZHM9Yzt3Z1tiXT1hO3ZhciBkPXJmKGEpLGU9c2YoZCk7Yz17aXM6YixleHRlbmRzOmN9O2Zvcih2YXIgZj1bXSxnPWEuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCJzdHlsZSIpLGg9MDtoPGcubGVuZ3RoO2grKyl7dmFyIGs9Z1toXTtpZihrLmhhc0F0dHJpYnV0ZSgic2hhZHktdW5zY29wZWQiKSl7aWYoIU8pe3ZhciBsPWsudGV4dENvbnRlbnQ7YmYuaGFzKGwpfHwoYmYuYWRkKGwpLGw9ay5jbG9uZU5vZGUoITApLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCkpO2sucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChrKX19ZWxzZSBmLnB1c2goay50ZXh0Q29udGVudCksay5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGspfWY9Zi5qb2luKCIiKS50cmltKCkrKEJnW2JdfHwiIik7CkRnKHRoaXMpO2lmKCFlKXtpZihnPSFkKWc9U2UudGVzdChmKXx8UmUudGVzdChmKSxTZS5sYXN0SW5kZXg9MCxSZS5sYXN0SW5kZXg9MDtoPXdlKGYpO2cmJlEmJnRoaXMuYSYmdGhpcy5hLnRyYW5zZm9ybVJ1bGVzKGgsYik7YS5fc3R5bGVBc3Q9aH1nPVtdO1F8fChnPVhmKGEuX3N0eWxlQXN0KSk7aWYoIWcubGVuZ3RofHxRKWg9Tz9hLmNvbnRlbnQ6bnVsbCxiPWpnW2JdfHxudWxsLGQ9emYoYyxhLl9zdHlsZUFzdCxudWxsLGQsZT9mOiIiKSxkPWQubGVuZ3RoP2dmKGQsYy5pcyxoLGIpOm51bGwsYS5fc3R5bGU9ZDthLmE9Z319O24uUWE9ZnVuY3Rpb24oYSxiKXtCZ1tiXT1hLmpvaW4oIiAiKX07bi5wcmVwYXJlVGVtcGxhdGVEb209ZnVuY3Rpb24oYSxiKXtpZighUGUpe3ZhciBjPXJmKGEpO098fCJzaGFkeSI9PT1jfHxhLl9kb21QcmVwYXJlZHx8KGEuX2RvbVByZXBhcmVkPSEwLHVmKGEuY29udGVudCxiKSl9fTsKZnVuY3Rpb24gRWcoYSl7dmFyIGI9cGYoYSksYz1iLmlzO2I9Yi5NO3ZhciBkPWpnW2NdfHxudWxsLGU9d2dbY107aWYoZSl7Yz1lLl9zdHlsZUFzdDt2YXIgZj1lLmE7ZT1yZihlKTtiPW5ldyBTZihjLGQsZixiLGUpO1RmKGEsYik7cmV0dXJuIGJ9fWZ1bmN0aW9uIEZnKGEpeyFhLmImJndpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlJiYoYS5iPXdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSxhLmIudHJhbnNmb3JtQ2FsbGJhY2s9ZnVuY3Rpb24oYil7YS5yYShiKX0sYS5iLnZhbGlkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXsoYS5iLmVucXVldWVkfHxhLmcpJiZhLmZsdXNoQ3VzdG9tU3R5bGVzKCl9KX0pfQpmdW5jdGlvbiBEZyhhKXshYS5hJiZ3aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW0mJihhLmE9d2luZG93LlNoYWR5Q1NTLkFwcGx5U2hpbSxhLmEuaW52YWxpZENhbGxiYWNrPXlnKTtGZyhhKX0Kbi5mbHVzaEN1c3RvbVN0eWxlcz1mdW5jdGlvbigpe2lmKCFQZSYmKERnKHRoaXMpLHRoaXMuYikpe3ZhciBhPXRoaXMuYi5wcm9jZXNzU3R5bGVzKCk7aWYodGhpcy5iLmVucXVldWVkJiYhc2YodGhpcy5mLmNzc0J1aWxkKSl7aWYoUSl7aWYoIXRoaXMuZi5jc3NCdWlsZClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5iLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUoYVtiXSk7aWYoYyYmUSYmdGhpcy5hKXt2YXIgZD1lZihjKTtEZyh0aGlzKTt0aGlzLmEudHJhbnNmb3JtUnVsZXMoZCk7Yy50ZXh0Q29udGVudD1jZihkKX19fWVsc2V7R2codGhpcyx0aGlzLmMsdGhpcy5mKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKShjPXRoaXMuYi5nZXRTdHlsZUZvckN1c3RvbVN0eWxlKGFbYl0pKSYmaGcoYyx0aGlzLmYudyk7dGhpcy5nJiZ0aGlzLnN0eWxlRG9jdW1lbnQoKX10aGlzLmIuZW5xdWV1ZWQ9ITF9fX07Cm4uc3R5bGVFbGVtZW50PWZ1bmN0aW9uKGEsYil7aWYoUGUpe2lmKGIpe1QoYSl8fFRmKGEsbmV3IFNmKG51bGwpKTt2YXIgYz1UKGEpO2Mubz1jLm98fHt9O09iamVjdC5hc3NpZ24oYy5vLGIpO0hnKHRoaXMsYSxjKX19ZWxzZSBpZihjPVQoYSl8fEVnKGEpKWlmKGEhPT10aGlzLmMmJih0aGlzLmc9ITApLGImJihjLm89Yy5vfHx7fSxPYmplY3QuYXNzaWduKGMubyxiKSksUSlIZyh0aGlzLGEsYyk7ZWxzZSBpZih0aGlzLmZsdXNoKCksR2codGhpcyxhLGMpLGMuZmEmJmMuZmEubGVuZ3RoKXtiPXBmKGEpLmlzO3ZhciBkO2E6e2lmKGQ9Q2cuY2FjaGVbYl0pZm9yKHZhciBlPWQubGVuZ3RoLTE7MDw9ZTtlLS0pe3ZhciBmPWRbZV07Yjp7dmFyIGc9Yy5mYTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKyl7dmFyIGs9Z1toXTtpZihmLnZba10hPT1jLndba10pe2c9ITE7YnJlYWsgYn19Zz0hMH1pZihnKXtkPWY7YnJlYWsgYX19ZD12b2lkIDB9Zz1kP2Quc3R5bGVFbGVtZW50Om51bGw7CmU9Yy5zOyhmPWQmJmQucyl8fChmPXRoaXMubFtiXT0odGhpcy5sW2JdfHwwKSsxLGY9YisiLSIrZik7Yy5zPWY7Zj1jLnM7aD1pZztoPWc/Zy50ZXh0Q29udGVudHx8IiI6ZWcoaCxhLGMudyxmKTtrPVQoYSk7dmFyIGw9ay5hO2wmJiFPJiZsIT09ZyYmKGwuX3VzZUNvdW50LS0sMD49bC5fdXNlQ291bnQmJmwucGFyZW50Tm9kZSYmbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGwpKTtPP2suYT8oay5hLnRleHRDb250ZW50PWgsZz1rLmEpOmgmJihnPWdmKGgsZixhLnNoYWRvd1Jvb3Qsay5iKSk6Zz9nLnBhcmVudE5vZGV8fChWZiYmLTE8aC5pbmRleE9mKCJAbWVkaWEiKSYmKGcudGV4dENvbnRlbnQ9aCksaGYoZyxudWxsLGsuYikpOmgmJihnPWdmKGgsZixudWxsLGsuYikpO2cmJihnLl91c2VDb3VudD1nLl91c2VDb3VudHx8MCxrLmEhPWcmJmcuX3VzZUNvdW50Kyssay5hPWcpO2Y9ZztPfHwoZz1jLnMsaz1oPWEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIixlJiYoaz1oLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFxzKngtc2NvcGVcXHMqIisKZSsiXFxzKiIsImciKSwiICIpKSxrKz0oaz8iICI6IiIpKyJ4LXNjb3BlICIrZyxoIT09ayYmbmYoYSxrKSk7ZHx8Q2cuc3RvcmUoYixjLncsZixjLnMpfX07CmZ1bmN0aW9uIEhnKGEsYixjKXt2YXIgZD1wZihiKS5pcztpZihjLm8pe3ZhciBlPWMubyxmO2ZvcihmIGluIGUpbnVsbD09PWY/Yi5zdHlsZS5yZW1vdmVQcm9wZXJ0eShmKTpiLnN0eWxlLnNldFByb3BlcnR5KGYsZVtmXSl9ZT13Z1tkXTtpZighKCFlJiZiIT09YS5jfHxlJiYiIiE9PXJmKGUpKSYmZSYmZS5fc3R5bGUmJiF6ZyhlKSl7aWYoemcoZSl8fGUuX2FwcGx5U2hpbVZhbGlkYXRpbmdWZXJzaW9uIT09ZS5fYXBwbHlTaGltTmV4dFZlcnNpb24pRGcoYSksYS5hJiZhLmEudHJhbnNmb3JtUnVsZXMoZS5fc3R5bGVBc3QsZCksZS5fc3R5bGUudGV4dENvbnRlbnQ9emYoYixjLkEpLEFnKGUpO08mJihhPWIuc2hhZG93Um9vdCkmJihhPWEucXVlcnlTZWxlY3Rvcigic3R5bGUiKSkmJihhLnRleHRDb250ZW50PXpmKGIsYy5BKSk7Yy5BPWUuX3N0eWxlQXN0fX0KZnVuY3Rpb24gSWcoYSxiKXtyZXR1cm4oYj1vZihiKS5nZXRSb290Tm9kZSgpLmhvc3QpP1QoYil8fEVnKGIpP2I6SWcoYSxiKTphLmN9ZnVuY3Rpb24gR2coYSxiLGMpe3ZhciBkPUlnKGEsYiksZT1UKGQpLGY9ZS53O2Q9PT1hLmN8fGZ8fChHZyhhLGQsZSksZj1lLncpO2E9T2JqZWN0LmNyZWF0ZShmfHxudWxsKTtkPWRnKGIsYy5BLGMuY3NzQnVpbGQpO2I9YmcoZS5BLGIpLnY7T2JqZWN0LmFzc2lnbihhLGQuSGEsYixkLlJhKTtiPWMubztmb3IodmFyIGcgaW4gYilpZigoZT1iW2ddKXx8MD09PWUpYVtnXT1lO2c9aWc7Yj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhKTtmb3IoZT0wO2U8Yi5sZW5ndGg7ZSsrKWQ9YltlXSxhW2RdPSRmKGcsYVtkXSxhKTtjLnc9YX1uLnN0eWxlRG9jdW1lbnQ9ZnVuY3Rpb24oYSl7dGhpcy5zdHlsZVN1YnRyZWUodGhpcy5jLGEpfTsKbi5zdHlsZVN1YnRyZWU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1vZihhKSxkPWMuc2hhZG93Um9vdDsoZHx8YT09PXRoaXMuYykmJnRoaXMuc3R5bGVFbGVtZW50KGEsYik7aWYoYT1kJiYoZC5jaGlsZHJlbnx8ZC5jaGlsZE5vZGVzKSlmb3IoYz0wO2M8YS5sZW5ndGg7YysrKXRoaXMuc3R5bGVTdWJ0cmVlKGFbY10pO2Vsc2UgaWYoYz1jLmNoaWxkcmVufHxjLmNoaWxkTm9kZXMpZm9yKGE9MDthPGMubGVuZ3RoO2ErKyl0aGlzLnN0eWxlU3VidHJlZShjW2FdKX07Cm4ucmE9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPXJmKGEpO2MhPT10aGlzLmYuY3NzQnVpbGQmJih0aGlzLmYuY3NzQnVpbGQ9Yyk7aWYoIXNmKGMpKXt2YXIgZD1lZihhKTtkZihkLGZ1bmN0aW9uKGEpe2lmKE8pUmYoYSk7ZWxzZXt2YXIgZD1SO2Euc2VsZWN0b3I9YS5wYXJzZWRTZWxlY3RvcjtSZihhKTthLnNlbGVjdG9yPWEuaj1DZihkLGEsZC5jLHZvaWQgMCx2b2lkIDApfVEmJiIiPT09YyYmKERnKGIpLGIuYSYmYi5hLnRyYW5zZm9ybVJ1bGUoYSkpfSk7UT9hLnRleHRDb250ZW50PWNmKGQpOnRoaXMuZi5BLnJ1bGVzLnB1c2goZCl9fTtuLmdldENvbXB1dGVkU3R5bGVWYWx1ZT1mdW5jdGlvbihhLGIpe3ZhciBjO1F8fChjPShUKGEpfHxUKElnKHRoaXMsYSkpKS53W2JdKTtyZXR1cm4oYz1jfHx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKGIpKT9jLnRyaW0oKToiIn07Cm4uVWE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1vZihhKS5nZXRSb290Tm9kZSgpO2I9Yj9iLnNwbGl0KC9ccy8pOltdO2M9Yy5ob3N0JiZjLmhvc3QubG9jYWxOYW1lO2lmKCFjKXt2YXIgZD1hLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTtpZihkKXtkPWQuc3BsaXQoL1xzLyk7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspaWYoZFtlXT09PVIuYSl7Yz1kW2UrMV07YnJlYWt9fX1jJiZiLnB1c2goUi5hLGMpO1F8fChjPVQoYSkpJiZjLnMmJmIucHVzaChpZy5hLGMucyk7bmYoYSxiLmpvaW4oIiAiKSl9O24uQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIFQoYSl9O24uVGE9ZnVuY3Rpb24oYSxiKXt3ZihhLGIpfTtuLldhPWZ1bmN0aW9uKGEsYil7d2YoYSxiLCEwKX07bi5TYT1mdW5jdGlvbihhKXtyZXR1cm4gcWcoYSl9O24uRGE9ZnVuY3Rpb24oYSl7cmV0dXJuIHBnKGEpfTtZLnByb3RvdHlwZS5mbHVzaD1ZLnByb3RvdHlwZS5mbHVzaDtZLnByb3RvdHlwZS5wcmVwYXJlVGVtcGxhdGU9WS5wcm90b3R5cGUucHJlcGFyZVRlbXBsYXRlOwpZLnByb3RvdHlwZS5zdHlsZUVsZW1lbnQ9WS5wcm90b3R5cGUuc3R5bGVFbGVtZW50O1kucHJvdG90eXBlLnN0eWxlRG9jdW1lbnQ9WS5wcm90b3R5cGUuc3R5bGVEb2N1bWVudDtZLnByb3RvdHlwZS5zdHlsZVN1YnRyZWU9WS5wcm90b3R5cGUuc3R5bGVTdWJ0cmVlO1kucHJvdG90eXBlLmdldENvbXB1dGVkU3R5bGVWYWx1ZT1ZLnByb3RvdHlwZS5nZXRDb21wdXRlZFN0eWxlVmFsdWU7WS5wcm90b3R5cGUuc2V0RWxlbWVudENsYXNzPVkucHJvdG90eXBlLlVhO1kucHJvdG90eXBlLl9zdHlsZUluZm9Gb3JOb2RlPVkucHJvdG90eXBlLkJhO1kucHJvdG90eXBlLnRyYW5zZm9ybUN1c3RvbVN0eWxlRm9yRG9jdW1lbnQ9WS5wcm90b3R5cGUucmE7WS5wcm90b3R5cGUuZ2V0U3R5bGVBc3Q9WS5wcm90b3R5cGUuRmE7WS5wcm90b3R5cGUuc3R5bGVBc3RUb1N0cmluZz1ZLnByb3RvdHlwZS5WYTtZLnByb3RvdHlwZS5mbHVzaEN1c3RvbVN0eWxlcz1ZLnByb3RvdHlwZS5mbHVzaEN1c3RvbVN0eWxlczsKWS5wcm90b3R5cGUuc2NvcGVOb2RlPVkucHJvdG90eXBlLlRhO1kucHJvdG90eXBlLnVuc2NvcGVOb2RlPVkucHJvdG90eXBlLldhO1kucHJvdG90eXBlLnNjb3BlRm9yTm9kZT1ZLnByb3RvdHlwZS5TYTtZLnByb3RvdHlwZS5jdXJyZW50U2NvcGVGb3JOb2RlPVkucHJvdG90eXBlLkRhO1kucHJvdG90eXBlLnByZXBhcmVBZG9wdGVkQ3NzVGV4dD1ZLnByb3RvdHlwZS5RYTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhZLnByb3RvdHlwZSx7bmF0aXZlU2hhZG93OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gT319LG5hdGl2ZUNzczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFF9fX0pO3ZhciBaPW5ldyBZLEpnLEtnO3dpbmRvdy5TaGFkeUNTUyYmKEpnPXdpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW0sS2c9d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlKTsKd2luZG93LlNoYWR5Q1NTPXtTY29waW5nU2hpbTpaLHByZXBhcmVUZW1wbGF0ZTpmdW5jdGlvbihhLGIsYyl7Wi5mbHVzaEN1c3RvbVN0eWxlcygpO1oucHJlcGFyZVRlbXBsYXRlKGEsYixjKX0scHJlcGFyZVRlbXBsYXRlRG9tOmZ1bmN0aW9uKGEsYil7Wi5wcmVwYXJlVGVtcGxhdGVEb20oYSxiKX0scHJlcGFyZVRlbXBsYXRlU3R5bGVzOmZ1bmN0aW9uKGEsYixjKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5wcmVwYXJlVGVtcGxhdGVTdHlsZXMoYSxiLGMpfSxzdHlsZVN1YnRyZWU6ZnVuY3Rpb24oYSxiKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5zdHlsZVN1YnRyZWUoYSxiKX0sc3R5bGVFbGVtZW50OmZ1bmN0aW9uKGEpe1ouZmx1c2hDdXN0b21TdHlsZXMoKTtaLnN0eWxlRWxlbWVudChhKX0sc3R5bGVEb2N1bWVudDpmdW5jdGlvbihhKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5zdHlsZURvY3VtZW50KGEpfSxmbHVzaEN1c3RvbVN0eWxlczpmdW5jdGlvbigpe1ouZmx1c2hDdXN0b21TdHlsZXMoKX0sCmdldENvbXB1dGVkU3R5bGVWYWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBaLmdldENvbXB1dGVkU3R5bGVWYWx1ZShhLGIpfSxuYXRpdmVDc3M6USxuYXRpdmVTaGFkb3c6Tyxjc3NCdWlsZDpRZSxkaXNhYmxlUnVudGltZTpQZX07SmcmJih3aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltPUpnKTtLZyYmKHdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZT1LZyk7dmFyIExnPXdpbmRvdy5jdXN0b21FbGVtZW50cyxNZz13aW5kb3cuSFRNTEltcG9ydHMsTmc9d2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQ7d2luZG93LldlYkNvbXBvbmVudHM9d2luZG93LldlYkNvbXBvbmVudHN8fHt9O2lmKExnJiZMZy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrKXt2YXIgT2csUGc9ZnVuY3Rpb24oKXtpZihPZyl7TmcuQyYmTmcuQyh3aW5kb3cuZG9jdW1lbnQpO3ZhciBhPU9nO09nPW51bGw7YSgpO3JldHVybiEwfX0sUWc9TWcud2hlblJlYWR5O0xnLnBvbHlmaWxsV3JhcEZsdXNoQ2FsbGJhY2soZnVuY3Rpb24oYSl7T2c9YTtRZyhQZyl9KTtNZy53aGVuUmVhZHk9ZnVuY3Rpb24oYSl7UWcoZnVuY3Rpb24oKXtQZygpP01nLndoZW5SZWFkeShhKTphKCl9KX19Ck1nLndoZW5SZWFkeShmdW5jdGlvbigpe3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3dpbmRvdy5XZWJDb21wb25lbnRzLnJlYWR5PSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJXZWJDb21wb25lbnRzUmVhZHkiLHtidWJibGVzOiEwfSkpfSl9KTt2YXIgUmc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtSZy50ZXh0Q29udGVudD0iYm9keSB7dHJhbnNpdGlvbjogb3BhY2l0eSBlYXNlLWluIDAuMnM7IH0gXG5ib2R5W3VucmVzb2x2ZWRdIHtvcGFjaXR5OiAwOyBkaXNwbGF5OiBibG9jazsgb3ZlcmZsb3c6IGhpZGRlbjsgcG9zaXRpb246IHJlbGF0aXZlOyB9IFxuIjt2YXIgU2c9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiaGVhZCIpO1NnLmluc2VydEJlZm9yZShSZyxTZy5maXJzdENoaWxkKTt9KS5jYWxsKHRoaXMpOwoKCgooZnVuY3Rpb24oKXsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KJ3VzZSBzdHJpY3QnO3ZhciBsPSEod2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaW5Vc2UpLHA7ZnVuY3Rpb24gcihhKXtwPWEmJmEuc2hpbWNzc3Byb3BlcnRpZXM/ITE6bHx8IShuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFwvNjAxfEVkZ2VcLzE1Lyl8fCF3aW5kb3cuQ1NTfHwhQ1NTLnN1cHBvcnRzfHwhQ1NTLnN1cHBvcnRzKCJib3gtc2hhZG93IiwiMCAwIDAgdmFyKC0tZm9vKSIpKX12YXIgdDt3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5jc3NCdWlsZCYmKHQ9d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkKTt2YXIgYWE9ISghd2luZG93LlNoYWR5Q1NTfHwhd2luZG93LlNoYWR5Q1NTLmRpc2FibGVSdW50aW1lKTsKd2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MubmF0aXZlQ3NzP3A9d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzczp3aW5kb3cuU2hhZHlDU1M/KHIod2luZG93LlNoYWR5Q1NTKSx3aW5kb3cuU2hhZHlDU1M9dm9pZCAwKTpyKHdpbmRvdy5XZWJDb21wb25lbnRzJiZ3aW5kb3cuV2ViQ29tcG9uZW50cy5mbGFncyk7dmFyIHU9cCx2PXQ7ZnVuY3Rpb24gdygpe3RoaXMuZW5kPXRoaXMuc3RhcnQ9MDt0aGlzLnJ1bGVzPXRoaXMucGFyZW50PXRoaXMucHJldmlvdXM9bnVsbDt0aGlzLmNzc1RleHQ9dGhpcy5wYXJzZWRDc3NUZXh0PSIiO3RoaXMuYXRSdWxlPSExO3RoaXMudHlwZT0wO3RoaXMucGFyc2VkU2VsZWN0b3I9dGhpcy5zZWxlY3Rvcj10aGlzLmtleWZyYW1lc05hbWU9IiJ9CmZ1bmN0aW9uIHgoYSl7YT1hLnJlcGxhY2UoYmEsIiIpLnJlcGxhY2UoY2EsIiIpO3ZhciBiPXksYz1hLGU9bmV3IHc7ZS5zdGFydD0wO2UuZW5kPWMubGVuZ3RoO2Zvcih2YXIgZD1lLGY9MCxnPWMubGVuZ3RoO2Y8ZztmKyspaWYoInsiPT09Y1tmXSl7ZC5ydWxlc3x8KGQucnVsZXM9W10pO3ZhciBoPWQsaz1oLnJ1bGVzW2gucnVsZXMubGVuZ3RoLTFdfHxudWxsO2Q9bmV3IHc7ZC5zdGFydD1mKzE7ZC5wYXJlbnQ9aDtkLnByZXZpb3VzPWs7aC5ydWxlcy5wdXNoKGQpfWVsc2UifSI9PT1jW2ZdJiYoZC5lbmQ9ZisxLGQ9ZC5wYXJlbnR8fGUpO3JldHVybiBiKGUsYSl9CmZ1bmN0aW9uIHkoYSxiKXt2YXIgYz1iLnN1YnN0cmluZyhhLnN0YXJ0LGEuZW5kLTEpO2EucGFyc2VkQ3NzVGV4dD1hLmNzc1RleHQ9Yy50cmltKCk7YS5wYXJlbnQmJihjPWIuc3Vic3RyaW5nKGEucHJldmlvdXM/YS5wcmV2aW91cy5lbmQ6YS5wYXJlbnQuc3RhcnQsYS5zdGFydC0xKSxjPWRhKGMpLGM9Yy5yZXBsYWNlKHosIiAiKSxjPWMuc3Vic3RyaW5nKGMubGFzdEluZGV4T2YoIjsiKSsxKSxjPWEucGFyc2VkU2VsZWN0b3I9YS5zZWxlY3Rvcj1jLnRyaW0oKSxhLmF0UnVsZT0wPT09Yy5pbmRleE9mKCJAIiksYS5hdFJ1bGU/MD09PWMuaW5kZXhPZigiQG1lZGlhIik/YS50eXBlPUE6Yy5tYXRjaChlYSkmJihhLnR5cGU9QixhLmtleWZyYW1lc05hbWU9YS5zZWxlY3Rvci5zcGxpdCh6KS5wb3AoKSk6YS50eXBlPTA9PT1jLmluZGV4T2YoIi0tIik/QzpEKTtpZihjPWEucnVsZXMpZm9yKHZhciBlPTAsZD1jLmxlbmd0aCxmPXZvaWQgMDtlPGQmJihmPWNbZV0pO2UrKyl5KGYsYik7CnJldHVybiBhfWZ1bmN0aW9uIGRhKGEpe3JldHVybiBhLnJlcGxhY2UoL1xcKFswLTlhLWZdezEsNn0pXHMvZ2ksZnVuY3Rpb24oYSxjKXthPWM7Zm9yKGM9Ni1hLmxlbmd0aDtjLS07KWE9IjAiK2E7cmV0dXJuIlxcIithfSl9CmZ1bmN0aW9uIEUoYSxiLGMpe2M9dm9pZCAwPT09Yz8iIjpjO3ZhciBlPSIiO2lmKGEuY3NzVGV4dHx8YS5ydWxlcyl7dmFyIGQ9YS5ydWxlcyxmO2lmKGY9ZClmPWRbMF0sZj0hKGYmJmYuc2VsZWN0b3ImJjA9PT1mLnNlbGVjdG9yLmluZGV4T2YoIi0tIikpO2lmKGYpe2Y9MDtmb3IodmFyIGc9ZC5sZW5ndGgsaD12b2lkIDA7ZjxnJiYoaD1kW2ZdKTtmKyspZT1FKGgsYixlKX1lbHNlIGI/Yj1hLmNzc1RleHQ6KGI9YS5jc3NUZXh0LGI9Yi5yZXBsYWNlKGZhLCIiKS5yZXBsYWNlKGhhLCIiKSxiPWIucmVwbGFjZShpYSwiIikucmVwbGFjZShqYSwiIikpLChlPWIudHJpbSgpKSYmKGU9IiAgIitlKyJcbiIpfWUmJihhLnNlbGVjdG9yJiYoYys9YS5zZWxlY3RvcisiIHtcbiIpLGMrPWUsYS5zZWxlY3RvciYmKGMrPSJ9XG5cbiIpKTtyZXR1cm4gY30KdmFyIEQ9MSxCPTcsQT00LEM9MUUzLGJhPS9cL1wqW14qXSpcKisoW14vKl1bXipdKlwqKykqXC8vZ2ltLGNhPS9AaW1wb3J0W147XSo7L2dpbSxmYT0vKD86XlteO1wtXHN9XSspPy0tW147e31dKj86W157fTtdKj8oPzpbO1xuXXwkKS9naW0saGE9Lyg/Ol5bXjtcLVxzfV0rKT8tLVteO3t9XSo/Oltee307XSo/e1tefV0qP30oPzpbO1xuXXwkKT8vZ2ltLGlhPS9AYXBwbHlccypcKD9bXik7XSpcKT9ccyooPzpbO1xuXXwkKT8vZ2ltLGphPS9bXjs6XSo/OlteO10qP3ZhclwoW147XSpcKSg/Ols7XG5dfCQpPy9naW0sZWE9L15AW15cc10qa2V5ZnJhbWVzLyx6PS9ccysvZzt2YXIgRz0vKD86XnxbO1xze11ccyopKC0tW1x3LV0qPylccyo6XHMqKD86KCg/OicoPzpcXCd8LikqPyd8Iig/OlxcInwuKSo/InxcKFteKV0qP1wpfFtefTt7XSkrKXxceyhbXn1dKilcfSg/Oig/PVs7XHN9XSl8JCkpL2dpLEg9Lyg/Ol58XFcrKUBhcHBseVxzKlwoPyhbXik7XG5dKilcKT8vZ2ksa2E9L0BtZWRpYVxzKC4qKS87dmFyIEk9bmV3IFNldDtmdW5jdGlvbiBKKGEpe2lmKCFhKXJldHVybiIiOyJzdHJpbmciPT09dHlwZW9mIGEmJihhPXgoYSkpO3JldHVybiBFKGEsdSl9ZnVuY3Rpb24gSyhhKXshYS5fX2Nzc1J1bGVzJiZhLnRleHRDb250ZW50JiYoYS5fX2Nzc1J1bGVzPXgoYS50ZXh0Q29udGVudCkpO3JldHVybiBhLl9fY3NzUnVsZXN8fG51bGx9ZnVuY3Rpb24gTChhLGIsYyxlKXtpZihhKXt2YXIgZD0hMSxmPWEudHlwZTtpZihlJiZmPT09QSl7dmFyIGc9YS5zZWxlY3Rvci5tYXRjaChrYSk7ZyYmKHdpbmRvdy5tYXRjaE1lZGlhKGdbMV0pLm1hdGNoZXN8fChkPSEwKSl9Zj09PUQ/YihhKTpjJiZmPT09Qj9jKGEpOmY9PT1DJiYoZD0hMCk7aWYoKGE9YS5ydWxlcykmJiFkKWZvcihkPTAsZj1hLmxlbmd0aCxnPXZvaWQgMDtkPGYmJihnPWFbZF0pO2QrKylMKGcsYixjLGUpfX0KZnVuY3Rpb24gTShhLGIpe3ZhciBjPWEuaW5kZXhPZigidmFyKCIpO2lmKC0xPT09YylyZXR1cm4gYihhLCIiLCIiLCIiKTthOnt2YXIgZT0wO3ZhciBkPWMrMztmb3IodmFyIGY9YS5sZW5ndGg7ZDxmO2QrKylpZigiKCI9PT1hW2RdKWUrKztlbHNlIGlmKCIpIj09PWFbZF0mJjA9PT0tLWUpYnJlYWsgYTtkPS0xfWU9YS5zdWJzdHJpbmcoYys0LGQpO2M9YS5zdWJzdHJpbmcoMCxjKTthPU0oYS5zdWJzdHJpbmcoZCsxKSxiKTtkPWUuaW5kZXhPZigiLCIpO3JldHVybi0xPT09ZD9iKGMsZS50cmltKCksIiIsYSk6YihjLGUuc3Vic3RyaW5nKDAsZCkudHJpbSgpLGUuc3Vic3RyaW5nKGQrMSkudHJpbSgpLGEpfQpmdW5jdGlvbiBOKGEpe2lmKHZvaWQgMCE9PXYpcmV0dXJuIHY7aWYodm9pZCAwPT09YS5fX2Nzc0J1aWxkKXt2YXIgYj1hLmdldEF0dHJpYnV0ZSgiY3NzLWJ1aWxkIik7aWYoYilhLl9fY3NzQnVpbGQ9YjtlbHNle2E6e2I9InRlbXBsYXRlIj09PWEubG9jYWxOYW1lP2EuY29udGVudC5maXJzdENoaWxkOmEuZmlyc3RDaGlsZDtpZihiIGluc3RhbmNlb2YgQ29tbWVudCYmKGI9Yi50ZXh0Q29udGVudC50cmltKCkuc3BsaXQoIjoiKSwiY3NzLWJ1aWxkIj09PWJbMF0pKXtiPWJbMV07YnJlYWsgYX1iPSIifWlmKCIiIT09Yil7dmFyIGM9InRlbXBsYXRlIj09PWEubG9jYWxOYW1lP2EuY29udGVudC5maXJzdENoaWxkOmEuZmlyc3RDaGlsZDtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyl9YS5fX2Nzc0J1aWxkPWJ9fXJldHVybiBhLl9fY3NzQnVpbGR8fCIifTt2YXIgbGE9LztccyovbSxtYT0vXlxzKihpbml0aWFsKXwoaW5oZXJpdClccyokLyxPPS9ccyohaW1wb3J0YW50LztmdW5jdGlvbiBQKCl7dGhpcy5hPXt9fVAucHJvdG90eXBlLnNldD1mdW5jdGlvbihhLGIpe2E9YS50cmltKCk7dGhpcy5hW2FdPXtoOmIsaTp7fX19O1AucHJvdG90eXBlLmdldD1mdW5jdGlvbihhKXthPWEudHJpbSgpO3JldHVybiB0aGlzLmFbYV18fG51bGx9O3ZhciBRPW51bGw7ZnVuY3Rpb24gUigpe3RoaXMuYj10aGlzLmM9bnVsbDt0aGlzLmE9bmV3IFB9Ui5wcm90b3R5cGUubz1mdW5jdGlvbihhKXthPUgudGVzdChhKXx8Ry50ZXN0KGEpO0gubGFzdEluZGV4PTA7Ry5sYXN0SW5kZXg9MDtyZXR1cm4gYX07ClIucHJvdG90eXBlLm09ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDA9PT1hLl9nYXRoZXJlZFN0eWxlKXt2YXIgYz1bXTtmb3IodmFyIGU9YS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlIiksZD0wO2Q8ZS5sZW5ndGg7ZCsrKXt2YXIgZj1lW2RdO2lmKGYuaGFzQXR0cmlidXRlKCJzaGFkeS11bnNjb3BlZCIpKXtpZighbCl7dmFyIGc9Zi50ZXh0Q29udGVudDtJLmhhcyhnKXx8KEkuYWRkKGcpLGc9Zi5jbG9uZU5vZGUoITApLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZykpO2YucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmKX19ZWxzZSBjLnB1c2goZi50ZXh0Q29udGVudCksZi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGYpfShjPWMuam9pbigiIikudHJpbSgpKT8oZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpLGUudGV4dENvbnRlbnQ9YyxhLmNvbnRlbnQuaW5zZXJ0QmVmb3JlKGUsYS5jb250ZW50LmZpcnN0Q2hpbGQpLGM9ZSk6Yz1udWxsO2EuX2dhdGhlcmVkU3R5bGU9CmN9cmV0dXJuKGE9YS5fZ2F0aGVyZWRTdHlsZSk/dGhpcy5qKGEsYik6bnVsbH07Ui5wcm90b3R5cGUuaj1mdW5jdGlvbihhLGIpe2I9dm9pZCAwPT09Yj8iIjpiO3ZhciBjPUsoYSk7dGhpcy5sKGMsYik7YS50ZXh0Q29udGVudD1KKGMpO3JldHVybiBjfTtSLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1LKGEpO0woYyxmdW5jdGlvbihhKXsiOnJvb3QiPT09YS5zZWxlY3RvciYmKGEuc2VsZWN0b3I9Imh0bWwiKTtiLmcoYSl9KTthLnRleHRDb250ZW50PUooYyk7cmV0dXJuIGN9O1IucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO3RoaXMuYz1iO0woYSxmdW5jdGlvbihhKXtjLmcoYSl9KTt0aGlzLmM9bnVsbH07Ui5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXthLmNzc1RleHQ9bmEodGhpcyxhLnBhcnNlZENzc1RleHQsYSk7Ijpyb290Ij09PWEuc2VsZWN0b3ImJihhLnNlbGVjdG9yPSI6aG9zdCA+ICoiKX07CmZ1bmN0aW9uIG5hKGEsYixjKXtiPWIucmVwbGFjZShHLGZ1bmN0aW9uKGIsZCxmLGcpe3JldHVybiBvYShhLGIsZCxmLGcsYyl9KTtyZXR1cm4gUyhhLGIsYyl9ZnVuY3Rpb24gcGEoYSxiKXtmb3IodmFyIGM9YjtjLnBhcmVudDspYz1jLnBhcmVudDt2YXIgZT17fSxkPSExO0woYyxmdW5jdGlvbihjKXsoZD1kfHxjPT09Yil8fGMuc2VsZWN0b3I9PT1iLnNlbGVjdG9yJiZPYmplY3QuYXNzaWduKGUsVChhLGMucGFyc2VkQ3NzVGV4dCkpfSk7cmV0dXJuIGV9CmZ1bmN0aW9uIFMoYSxiLGMpe2Zvcih2YXIgZTtlPUguZXhlYyhiKTspe3ZhciBkPWVbMF0sZj1lWzFdO2U9ZS5pbmRleDt2YXIgZz1iLnNsaWNlKDAsZStkLmluZGV4T2YoIkBhcHBseSIpKTtiPWIuc2xpY2UoZStkLmxlbmd0aCk7dmFyIGg9Yz9wYShhLGMpOnt9O09iamVjdC5hc3NpZ24oaCxUKGEsZykpO2Q9dm9pZCAwO3ZhciBrPWE7Zj1mLnJlcGxhY2UobGEsIiIpO3ZhciBuPVtdO3ZhciBtPWsuYS5nZXQoZik7bXx8KGsuYS5zZXQoZix7fSksbT1rLmEuZ2V0KGYpKTtpZihtKXtrLmMmJihtLmlbay5jXT0hMCk7dmFyIHE9bS5oO2ZvcihkIGluIHEpaz1oJiZoW2RdLG09W2QsIjogdmFyKCIsZiwiXy1fIixkXSxrJiZtLnB1c2goIiwiLGsucmVwbGFjZShPLCIiKSksbS5wdXNoKCIpIiksTy50ZXN0KHFbZF0pJiZtLnB1c2goIiAhaW1wb3J0YW50Iiksbi5wdXNoKG0uam9pbigiIikpfWQ9bi5qb2luKCI7ICIpO2I9ZytkK2I7SC5sYXN0SW5kZXg9ZStkLmxlbmd0aH1yZXR1cm4gYn0KZnVuY3Rpb24gVChhLGIsYyl7Yz12b2lkIDA9PT1jPyExOmM7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBlLGQsZj17fSxnPTAsaDtnPGIubGVuZ3RoO2crKylpZihlPWJbZ10paWYoaD1lLnNwbGl0KCI6IiksMTxoLmxlbmd0aCl7ZT1oWzBdLnRyaW0oKTtkPWguc2xpY2UoMSkuam9pbigiOiIpO2lmKGMpe3ZhciBrPWE7aD1lO3ZhciBuPW1hLmV4ZWMoZCk7biYmKG5bMV0/KGsuYnx8KGsuYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJtZXRhIiksay5iLnNldEF0dHJpYnV0ZSgiYXBwbHktc2hpbS1tZWFzdXJlIiwiIiksay5iLnN0eWxlLmFsbD0iaW5pdGlhbCIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrLmIpKSxoPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGsuYikuZ2V0UHJvcGVydHlWYWx1ZShoKSk6aD0iYXBwbHktc2hpbS1pbmhlcml0IixkPWgpfWZbZV09ZH1yZXR1cm4gZn1mdW5jdGlvbiBxYShhLGIpe2lmKFEpZm9yKHZhciBjIGluIGIuaSljIT09YS5jJiZRKGMpfQpmdW5jdGlvbiBvYShhLGIsYyxlLGQsZil7ZSYmTShlLGZ1bmN0aW9uKGIsYyl7YyYmYS5hLmdldChjKSYmKGQ9IkBhcHBseSAiK2MrIjsiKX0pO2lmKCFkKXJldHVybiBiO3ZhciBnPVMoYSwiIitkLGYpO2Y9Yi5zbGljZSgwLGIuaW5kZXhPZigiLS0iKSk7dmFyIGg9Zz1UKGEsZywhMCksaz1hLmEuZ2V0KGMpLG49ayYmay5oO24/aD1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobiksZyk6YS5hLnNldChjLGgpO3ZhciBtPVtdLHEsWj0hMTtmb3IocSBpbiBoKXt2YXIgRj1nW3FdO3ZvaWQgMD09PUYmJihGPSJpbml0aWFsIik7IW58fHEgaW4gbnx8KFo9ITApO20ucHVzaChjKyJfLV8iK3ErIjogIitGKX1aJiZxYShhLGspO2smJihrLmg9aCk7ZSYmKGY9YisiOyIrZik7cmV0dXJuIGYrbS5qb2luKCI7ICIpKyI7In1SLnByb3RvdHlwZS5kZXRlY3RNaXhpbj1SLnByb3RvdHlwZS5vO1IucHJvdG90eXBlLnRyYW5zZm9ybVN0eWxlPVIucHJvdG90eXBlLmo7ClIucHJvdG90eXBlLnRyYW5zZm9ybUN1c3RvbVN0eWxlPVIucHJvdG90eXBlLmY7Ui5wcm90b3R5cGUudHJhbnNmb3JtUnVsZXM9Ui5wcm90b3R5cGUubDtSLnByb3RvdHlwZS50cmFuc2Zvcm1SdWxlPVIucHJvdG90eXBlLmc7Ui5wcm90b3R5cGUudHJhbnNmb3JtVGVtcGxhdGU9Ui5wcm90b3R5cGUubTtSLnByb3RvdHlwZS5fc2VwYXJhdG9yPSJfLV8iO09iamVjdC5kZWZpbmVQcm9wZXJ0eShSLnByb3RvdHlwZSwiaW52YWxpZENhbGxiYWNrIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFF9LHNldDpmdW5jdGlvbihhKXtRPWF9fSk7dmFyIFU9e307dmFyIHJhPVByb21pc2UucmVzb2x2ZSgpO2Z1bmN0aW9uIHNhKGEpe2lmKGE9VVthXSlhLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj1hLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbnx8MCxhLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbj1hLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbnx8MCxhLl9hcHBseVNoaW1OZXh0VmVyc2lvbj0oYS5fYXBwbHlTaGltTmV4dFZlcnNpb258fDApKzF9ZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPT09YS5fYXBwbHlTaGltTmV4dFZlcnNpb259ZnVuY3Rpb24gdWEoYSl7YS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb249YS5fYXBwbHlTaGltTmV4dFZlcnNpb247YS5fdmFsaWRhdGluZ3x8KGEuX3ZhbGlkYXRpbmc9ITAscmEudGhlbihmdW5jdGlvbigpe2EuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPWEuX2FwcGx5U2hpbU5leHRWZXJzaW9uO2EuX3ZhbGlkYXRpbmc9ITF9KSl9O3ZhciBWPW5ldyBSO2Z1bmN0aW9uIFcoKXt0aGlzLmE9bnVsbDtWLmludmFsaWRDYWxsYmFjaz1zYX1mdW5jdGlvbiBYKGEpeyFhLmEmJndpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSYmKGEuYT13aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2UsYS5hLnRyYW5zZm9ybUNhbGxiYWNrPWZ1bmN0aW9uKGEpe1YuZihhKX0sYS5hLnZhbGlkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXthLmEuZW5xdWV1ZWQmJmEuZmx1c2hDdXN0b21TdHlsZXMoKX0pfSl9Vy5wcm90b3R5cGUucHJlcGFyZVRlbXBsYXRlPWZ1bmN0aW9uKGEsYil7WCh0aGlzKTsiIj09PU4oYSkmJihVW2JdPWEsYj1WLm0oYSxiKSxhLl9zdHlsZUFzdD1iKX07ClcucHJvdG90eXBlLmZsdXNoQ3VzdG9tU3R5bGVzPWZ1bmN0aW9uKCl7WCh0aGlzKTtpZih0aGlzLmEpe3ZhciBhPXRoaXMuYS5wcm9jZXNzU3R5bGVzKCk7aWYodGhpcy5hLmVucXVldWVkKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5hLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUoYVtiXSk7YyYmVi5mKGMpfXRoaXMuYS5lbnF1ZXVlZD0hMX19fTsKVy5wcm90b3R5cGUuc3R5bGVTdWJ0cmVlPWZ1bmN0aW9uKGEsYil7WCh0aGlzKTtpZihiKWZvcih2YXIgYyBpbiBiKW51bGw9PT1jP2Euc3R5bGUucmVtb3ZlUHJvcGVydHkoYyk6YS5zdHlsZS5zZXRQcm9wZXJ0eShjLGJbY10pO2lmKGEuc2hhZG93Um9vdClmb3IodGhpcy5zdHlsZUVsZW1lbnQoYSksYT1hLnNoYWRvd1Jvb3QuY2hpbGRyZW58fGEuc2hhZG93Um9vdC5jaGlsZE5vZGVzLGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLnN0eWxlU3VidHJlZShhW2JdKTtlbHNlIGZvcihhPWEuY2hpbGRyZW58fGEuY2hpbGROb2RlcyxiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5zdHlsZVN1YnRyZWUoYVtiXSl9OwpXLnByb3RvdHlwZS5zdHlsZUVsZW1lbnQ9ZnVuY3Rpb24oYSl7WCh0aGlzKTt2YXIgYj1hLmxvY2FsTmFtZSxjO2I/LTE8Yi5pbmRleE9mKCItIik/Yz1iOmM9YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJpcyIpfHwiIjpjPWEuaXM7Yj1VW2NdO2lmKCEoYiYmIiIhPT1OKGIpfHwhYnx8dGEoYikpKXtpZih0YShiKXx8Yi5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb24hPT1iLl9hcHBseVNoaW1OZXh0VmVyc2lvbil0aGlzLnByZXBhcmVUZW1wbGF0ZShiLGMpLHVhKGIpO2lmKGE9YS5zaGFkb3dSb290KWlmKGE9YS5xdWVyeVNlbGVjdG9yKCJzdHlsZSIpKWEuX19jc3NSdWxlcz1iLl9zdHlsZUFzdCxhLnRleHRDb250ZW50PUooYi5fc3R5bGVBc3QpfX07Vy5wcm90b3R5cGUuc3R5bGVEb2N1bWVudD1mdW5jdGlvbihhKXtYKHRoaXMpO3RoaXMuc3R5bGVTdWJ0cmVlKGRvY3VtZW50LmJvZHksYSl9OwppZighd2luZG93LlNoYWR5Q1NTfHwhd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltKXt2YXIgWT1uZXcgVyx2YT13aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZTt3aW5kb3cuU2hhZHlDU1M9e3ByZXBhcmVUZW1wbGF0ZTpmdW5jdGlvbihhLGIpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTtZLnByZXBhcmVUZW1wbGF0ZShhLGIpfSxwcmVwYXJlVGVtcGxhdGVTdHlsZXM6ZnVuY3Rpb24oYSxiLGMpe3dpbmRvdy5TaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGUoYSxiLGMpfSxwcmVwYXJlVGVtcGxhdGVEb206ZnVuY3Rpb24oKXt9LHN0eWxlU3VidHJlZTpmdW5jdGlvbihhLGIpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTtZLnN0eWxlU3VidHJlZShhLGIpfSxzdHlsZUVsZW1lbnQ6ZnVuY3Rpb24oYSl7WS5mbHVzaEN1c3RvbVN0eWxlcygpO1kuc3R5bGVFbGVtZW50KGEpfSxzdHlsZURvY3VtZW50OmZ1bmN0aW9uKGEpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTsKWS5zdHlsZURvY3VtZW50KGEpfSxnZXRDb21wdXRlZFN0eWxlVmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKGIpKT9hLnRyaW0oKToiIn0sZmx1c2hDdXN0b21TdHlsZXM6ZnVuY3Rpb24oKXtZLmZsdXNoQ3VzdG9tU3R5bGVzKCl9LG5hdGl2ZUNzczp1LG5hdGl2ZVNoYWRvdzpsLGNzc0J1aWxkOnYsZGlzYWJsZVJ1bnRpbWU6YWF9O3ZhJiYod2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlPXZhKX13aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltPVY7fSkuY2FsbCh0aGlzKTsKCgoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGNvbnN0IHVzZXJQb2x5bWVyID0gd2luZG93LlBvbHltZXI7CgogIC8qKgogICAqIEBuYW1lc3BhY2UgUG9seW1lcgogICAqIEBzdW1tYXJ5IFBvbHltZXIgaXMgYSBsaWdodHdlaWdodCBsaWJyYXJ5IGJ1aWx0IG9uIHRvcCBvZiB0aGUgd2ViCiAgICogICBzdGFuZGFyZHMtYmFzZWQgV2ViIENvbXBvbmVudHMgQVBJJ3MsIGFuZCBtYWtlcyBpdCBlYXN5IHRvIGJ1aWxkIHlvdXIKICAgKiAgIG93biBjdXN0b20gSFRNTCBlbGVtZW50cy4KICAgKiBAcGFyYW0geyFQb2x5bWVySW5pdH0gaW5mbyBQcm90b3R5cGUgZm9yIHRoZSBjdXN0b20gZWxlbWVudC4gSXQgbXVzdCBjb250YWluCiAgICogICBhbiBgaXNgIHByb3BlcnR5IHRvIHNwZWNpZnkgdGhlIGVsZW1lbnQgbmFtZS4gT3RoZXIgcHJvcGVydGllcyBwb3B1bGF0ZQogICAqICAgdGhlIGVsZW1lbnQgcHJvdG90eXBlLiBUaGUgYHByb3BlcnRpZXNgLCBgb2JzZXJ2ZXJzYCwgYGhvc3RBdHRyaWJ1dGVzYCwKICAgKiAgIGFuZCBgbGlzdGVuZXJzYCBwcm9wZXJ0aWVzIGFyZSBwcm9jZXNzZWQgdG8gY3JlYXRlIGVsZW1lbnQgZmVhdHVyZXMuCiAgICogQHJldHVybiB7IU9iamVjdH0gUmV0dXJucyBhIGN1c3RvbSBlbGVtZW50IGNsYXNzIGZvciB0aGUgZ2l2ZW4gcHJvdmlkZWQKICAgKiAgIHByb3RvdHlwZSBgaW5mb2Agb2JqZWN0LiBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCBpZiBnaXZlbiBieSBgaW5mby5pc2AuCiAgICovCiAgd2luZG93LlBvbHltZXIgPSBmdW5jdGlvbihpbmZvKSB7CiAgICByZXR1cm4gd2luZG93LlBvbHltZXIuX3BvbHltZXJGbihpbmZvKTsKICB9OwoKICAvLyBzdXBwb3J0IHVzZXIgc2V0dGluZ3Mgb24gdGhlIFBvbHltZXIgb2JqZWN0CiAgaWYgKHVzZXJQb2x5bWVyKSB7CiAgICBPYmplY3QuYXNzaWduKFBvbHltZXIsIHVzZXJQb2x5bWVyKTsKICB9CgogIC8vIFRvIGJlIHBsdWdnZWQgYnkgbGVnYWN5IGltcGxlbWVudGF0aW9uIGlmIGxvYWRlZAogIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgLyoqCiAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gUHJvdG90eXBlIGZvciB0aGUgY3VzdG9tIGVsZW1lbnQuIEl0IG11c3QgY29udGFpbgogICAqICAgYW4gYGlzYCBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBlbGVtZW50IG5hbWUuIE90aGVyIHByb3BlcnRpZXMgcG9wdWxhdGUKICAgKiAgIHRoZSBlbGVtZW50IHByb3RvdHlwZS4gVGhlIGBwcm9wZXJ0aWVzYCwgYG9ic2VydmVyc2AsIGBob3N0QXR0cmlidXRlc2AsCiAgICogICBhbmQgYGxpc3RlbmVyc2AgcHJvcGVydGllcyBhcmUgcHJvY2Vzc2VkIHRvIGNyZWF0ZSBlbGVtZW50IGZlYXR1cmVzLgogICAqIEByZXR1cm4geyFPYmplY3R9IFJldHVybnMgYSBjdXN0b20gZWxlbWVudCBjbGFzcyBmb3IgdGhlIGdpdmVuIHByb3ZpZGVkCiAgICogICBwcm90b3R5cGUgYGluZm9gIG9iamVjdC4gVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgaWYgZ2l2ZW4gYnkgYGluZm8uaXNgLgogICAqLwogIHdpbmRvdy5Qb2x5bWVyLl9wb2x5bWVyRm4gPSBmdW5jdGlvbihpbmZvKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgIHRocm93IG5ldyBFcnJvcignTG9hZCBwb2x5bWVyLmh0bWwgdG8gdXNlIHRoZSBQb2x5bWVyKCkgZnVuY3Rpb24uJyk7CiAgfTsKICAvKiBlc2xpbnQtZW5hYmxlICovCgogIHdpbmRvdy5Qb2x5bWVyLnZlcnNpb24gPSAnMi43LjAnOwoKICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqLwogIC8qCiAgV2hlbiB1c2luZyBDbG9zdXJlIENvbXBpbGVyLCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KHByb3BlcnR5LCBvYmplY3QpIGlzIHJlcGxhY2VkIGJ5IHRoZSBtdW5nZWQgbmFtZSBmb3Igb2JqZWN0W3Byb3BlcnR5XQogIFdlIGNhbm5vdCBhbGlhcyB0aGlzIGZ1bmN0aW9uLCBzbyB3ZSBoYXZlIHRvIHVzZSBhIHNtYWxsIHNoaW0gdGhhdCBoYXMgdGhlIHNhbWUgYmVoYXZpb3Igd2hlbiBub3QgY29tcGlsaW5nLgogICovCiAgd2luZG93LkpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkgPSBmdW5jdGlvbihwcm9wLCBvYmopIHsKICAgIHJldHVybiBwcm9wOwogIH07CiAgLyogZXNsaW50LWVuYWJsZSAqLwoKfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgbGV0IENTU19VUkxfUlggPSAvKHVybFwoKShbXildKikoXCkpL2c7CiAgICBsZXQgQUJTX1VSTCA9IC8oXlwvKXwoXiMpfCheW1x3LVxkXSo6KS87CiAgICBsZXQgd29ya2luZ1VSTDsKICAgIGxldCByZXNvbHZlRG9jOwogICAgLyoqCiAgICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gVVJMIGFnYWluc3QgdGhlIHByb3ZpZGVkIGBiYXNlVXJpJy4KICAgICAqIAogICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbm8gcmVzb2x1dGlvbiBmb3IgVVJMcyB0aGF0IHN0YXJ0CiAgICAgKiB3aXRoIGAvYCAoYWJzb2x1dGUgVVJMcykgb3IgYCNgIChoYXNoIGlkZW50aWZpZXJzKS4gIEZvciBnZW5lcmFsIHB1cnBvc2UKICAgICAqIFVSTCByZXNvbHV0aW9uLCB1c2UgYHdpbmRvdy5VUkxgLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgSW5wdXQgVVJMIHRvIHJlc29sdmUKICAgICAqIEBwYXJhbSB7P3N0cmluZz19IGJhc2VVUkkgQmFzZSBVUkkgdG8gcmVzb2x2ZSB0aGUgVVJMIGFnYWluc3QKICAgICAqIEByZXR1cm4ge3N0cmluZ30gcmVzb2x2ZWQgVVJMCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlc29sdmVVcmwodXJsLCBiYXNlVVJJKSB7CiAgICAgIGlmICh1cmwgJiYgQUJTX1VSTC50ZXN0KHVybCkpIHsKICAgICAgICByZXR1cm4gdXJsOwogICAgICB9CiAgICAgIC8vIExhenkgZmVhdHVyZSBkZXRlY3Rpb24uCiAgICAgIGlmICh3b3JraW5nVVJMID09PSB1bmRlZmluZWQpIHsKICAgICAgICB3b3JraW5nVVJMID0gZmFsc2U7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IHUgPSBuZXcgVVJMKCdiJywgJ2h0dHA6Ly9hJyk7CiAgICAgICAgICB1LnBhdGhuYW1lID0gJ2MlMjBkJzsKICAgICAgICAgIHdvcmtpbmdVUkwgPSAodS5ocmVmID09PSAnaHR0cDovL2EvYyUyMGQnKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAvLyBzaWxlbnRseSBmYWlsCiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghYmFzZVVSSSkgewogICAgICAgIGJhc2VVUkkgPSBkb2N1bWVudC5iYXNlVVJJIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwogICAgICB9CiAgICAgIGlmICh3b3JraW5nVVJMKSB7CiAgICAgICAgcmV0dXJuIChuZXcgVVJMKHVybCwgYmFzZVVSSSkpLmhyZWY7CiAgICAgIH0KICAgICAgLy8gRmFsbGJhY2sgdG8gY3JlYXRpbmcgYW4gYW5jaG9yIGludG8gYSBkaXNjb25uZWN0ZWQgZG9jdW1lbnQuCiAgICAgIGlmICghcmVzb2x2ZURvYykgewogICAgICAgIHJlc29sdmVEb2MgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoJ3RlbXAnKTsKICAgICAgICByZXNvbHZlRG9jLmJhc2UgPSByZXNvbHZlRG9jLmNyZWF0ZUVsZW1lbnQoJ2Jhc2UnKTsKICAgICAgICByZXNvbHZlRG9jLmhlYWQuYXBwZW5kQ2hpbGQocmVzb2x2ZURvYy5iYXNlKTsKICAgICAgICByZXNvbHZlRG9jLmFuY2hvciA9IHJlc29sdmVEb2MuY3JlYXRlRWxlbWVudCgnYScpOwogICAgICAgIHJlc29sdmVEb2MuYm9keS5hcHBlbmRDaGlsZChyZXNvbHZlRG9jLmFuY2hvcik7CiAgICAgIH0KICAgICAgcmVzb2x2ZURvYy5iYXNlLmhyZWYgPSBiYXNlVVJJOwogICAgICByZXNvbHZlRG9jLmFuY2hvci5ocmVmID0gdXJsOwogICAgICByZXR1cm4gcmVzb2x2ZURvYy5hbmNob3IuaHJlZiB8fCB1cmw7CgogICAgfQoKICAgIC8qKgogICAgICogUmVzb2x2ZXMgYW55IHJlbGF0aXZlIFVSTCdzIGluIHRoZSBnaXZlbiBDU1MgdGV4dCBhZ2FpbnN0IHRoZSBwcm92aWRlZAogICAgICogYG93bmVyRG9jdW1lbnRgJ3MgYGJhc2VVUklgLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjc3NUZXh0IENTUyB0ZXh0IHRvIHByb2Nlc3MKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlc29sdmUgdGhlIFVSTCBhZ2FpbnN0CiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFByb2Nlc3NlZCBDU1MgdGV4dCB3aXRoIHJlc29sdmVkIFVSTCdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlc29sdmVDc3MoY3NzVGV4dCwgYmFzZVVSSSkgewogICAgICByZXR1cm4gY3NzVGV4dC5yZXBsYWNlKENTU19VUkxfUlgsIGZ1bmN0aW9uKG0sIHByZSwgdXJsLCBwb3N0KSB7CiAgICAgICAgcmV0dXJuIHByZSArICdcJycgKwogICAgICAgICAgcmVzb2x2ZVVybCh1cmwucmVwbGFjZSgvWyInXS9nLCAnJyksIGJhc2VVUkkpICsKICAgICAgICAgICdcJycgKyBwb3N0OwogICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBwYXRoIGZyb20gYSBnaXZlbiBgdXJsYC4gVGhlIHBhdGggaW5jbHVkZXMgdGhlIHRyYWlsaW5nCiAgICAgKiBgL2AgZnJvbSB0aGUgdXJsLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgSW5wdXQgVVJMIHRvIHRyYW5zZm9ybQogICAgICogQHJldHVybiB7c3RyaW5nfSByZXNvbHZlZCBwYXRoCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhdGhGcm9tVXJsKHVybCkgewogICAgICByZXR1cm4gdXJsLnN1YnN0cmluZygwLCB1cmwubGFzdEluZGV4T2YoJy8nKSArIDEpOwogICAgfQoKICAgIC8qKgogICAgICogTW9kdWxlIHdpdGggdXRpbGl0aWVzIGZvciByZXNvbHZpbmcgcmVsYXRpdmUgVVJMJ3MuCiAgICAgKgogICAgICogQG5hbWVzcGFjZQogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqIEBzdW1tYXJ5IE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgcmVzb2x2aW5nIHJlbGF0aXZlIFVSTCdzLgogICAgICovCiAgICBQb2x5bWVyLlJlc29sdmVVcmwgPSB7CiAgICAgIHJlc29sdmVDc3M6IHJlc29sdmVDc3MsCiAgICAgIHJlc29sdmVVcmw6IHJlc29sdmVVcmwsCiAgICAgIHBhdGhGcm9tVXJsOiBwYXRoRnJvbVVybAogICAgfTsKCiAgfSkoKTsKCgoKLyoqIEBzdXBwcmVzcyB7ZGVwcmVjYXRlZH0gKi8KKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogU2V0cyB0aGUgZ2xvYmFsLCBsZWdhY3kgc2V0dGluZ3MuCiAgICoKICAgKiBAZGVwcmVjYXRlZAogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqLwogIFBvbHltZXIuU2V0dGluZ3MgPSBQb2x5bWVyLlNldHRpbmdzIHx8IHt9OwoKICBQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdyA9ICEod2luZG93LlNoYWR5RE9NKTsKICBQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZUNTU1Byb3BlcnRpZXMgPQogICAgQm9vbGVhbighd2luZG93LlNoYWR5Q1NTIHx8IHdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3MpOwogIFBvbHltZXIuU2V0dGluZ3MudXNlTmF0aXZlQ3VzdG9tRWxlbWVudHMgPQogICAgISh3aW5kb3cuY3VzdG9tRWxlbWVudHMucG9seWZpbGxXcmFwRmx1c2hDYWxsYmFjayk7CgoKICAvKioKICAgKiBHbG9iYWxseSBzZXR0YWJsZSBwcm9wZXJ0eSB0aGF0IGlzIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgdG8KICAgKiBgUG9seW1lci5FbGVtZW50TWl4aW5gIGluc3RhbmNlcywgdXNlZnVsIGZvciBiaW5kaW5nIGluIHRlbXBsYXRlcyB0bwogICAqIG1ha2UgVVJMJ3MgcmVsYXRpdmUgdG8gYW4gYXBwbGljYXRpb24ncyByb290LiAgRGVmYXVsdHMgdG8gdGhlIG1haW4KICAgKiBkb2N1bWVudCBVUkwsIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB1c2Vycy4gIEl0IG1heSBiZSB1c2VmdWwgdG8gc2V0CiAgICogYFBvbHltZXIucm9vdFBhdGhgIHRvIHByb3ZpZGUgYSBzdGFibGUgYXBwbGljYXRpb24gbW91bnQgcGF0aCB3aGVuCiAgICogdXNpbmcgY2xpZW50IHNpZGUgcm91dGluZy4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5yb290UGF0aCA9IFBvbHltZXIucm9vdFBhdGggfHwKICAgIFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybChkb2N1bWVudC5iYXNlVVJJIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsKCiAgLyoqCiAgICogU2V0cyB0aGUgZ2xvYmFsIHJvb3RQYXRoIHByb3BlcnR5IHVzZWQgYnkgYFBvbHltZXIuRWxlbWVudE1peGluYCBhbmQKICAgKiBhdmFpbGFibGUgdmlhIGBQb2x5bWVyLnJvb3RQYXRoYC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIG5ldyByb290IHBhdGgKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqLwogIFBvbHltZXIuc2V0Um9vdFBhdGggPSBmdW5jdGlvbihwYXRoKSB7CiAgICBQb2x5bWVyLnJvb3RQYXRoID0gcGF0aDsKICB9OwoKICAvKioKICAgKiBBIGdsb2JhbCBjYWxsYmFjayB1c2VkIHRvIHNhbml0aXplIGFueSB2YWx1ZSBiZWZvcmUgaW5zZXJ0aW5nIGl0IGludG8gdGhlIERPTS4gVGhlIGNhbGxiYWNrIHNpZ25hdHVyZSBpczoKICAgKgogICAqICAgICBQb2x5bWVyID0gewogICAqICAgICAgIHNhbml0aXplRE9NVmFsdWU6IGZ1bmN0aW9uKHZhbHVlLCBuYW1lLCB0eXBlLCBub2RlKSB7IC4uLiB9CiAgICogICAgIH0KICAgKgogICAqIFdoZXJlOgogICAqCiAgICogYHZhbHVlYCBpcyB0aGUgdmFsdWUgdG8gc2FuaXRpemUuCiAgICogYG5hbWVgIGlzIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSBvciBwcm9wZXJ0eSAoZm9yIGV4YW1wbGUsIGhyZWYpLgogICAqIGB0eXBlYCBpbmRpY2F0ZXMgd2hlcmUgdGhlIHZhbHVlIGlzIGJlaW5nIGluc2VydGVkOiBvbmUgb2YgcHJvcGVydHksIGF0dHJpYnV0ZSwgb3IgdGV4dC4KICAgKiBgbm9kZWAgaXMgdGhlIG5vZGUgd2hlcmUgdGhlIHZhbHVlIGlzIGJlaW5nIGluc2VydGVkLgogICAqCiAgICogQHR5cGUgeyhmdW5jdGlvbigqLHN0cmluZyxzdHJpbmcsTm9kZSk6Kil8dW5kZWZpbmVkfQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlID0gUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlIHx8IG51bGw7CgogIC8qKgogICAqIFNldHMgdGhlIGdsb2JhbCBzYW5pdGl6ZURPTVZhbHVlIGF2YWlsYWJsZSB2aWEgYFBvbHltZXIuc2FuaXRpemVET01WYWx1ZWAuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7KGZ1bmN0aW9uKCosc3RyaW5nLHN0cmluZyxOb2RlKToqKXx1bmRlZmluZWR9IG5ld1Nhbml0aXplRE9NVmFsdWUgdGhlIGdsb2JhbCBzYW5pdGl6ZURPTVZhbHVlIGNhbGxiYWNrCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnNldFNhbml0aXplRE9NVmFsdWUgPSBmdW5jdGlvbihuZXdTYW5pdGl6ZURPTVZhbHVlKSB7CiAgICBQb2x5bWVyLnNhbml0aXplRE9NVmFsdWUgPSBuZXdTYW5pdGl6ZURPTVZhbHVlOwogIH07CgogIC8qKgogICAqIEdsb2JhbGx5IHNldHRhYmxlIHByb3BlcnR5IHRvIG1ha2UgUG9seW1lciBHZXN0dXJlcyB1c2UgcGFzc2l2ZSBUb3VjaEV2ZW50IGxpc3RlbmVycyB3aGVuIHJlY29nbml6aW5nIGdlc3R1cmVzLgogICAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgZ2VzdHVyZXMgbWFkZSBmcm9tIHRvdWNoIHdpbGwgbm90IGJlIGFibGUgdG8gcHJldmVudCBzY3JvbGxpbmcsIGFsbG93aW5nIGZvciBzbW9vdGhlcgogICAqIHNjcm9sbGluZyBwZXJmb3JtYW5jZS4KICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcyA9IFBvbHltZXIucGFzc2l2ZVRvdWNoR2VzdHVyZXMgfHwgZmFsc2U7CgogIC8qKgogICAqIFNldHMgYHBhc3NpdmVUb3VjaEdlc3R1cmVzYCBnbG9iYWxseSBmb3IgYWxsIGVsZW1lbnRzIHVzaW5nIFBvbHltZXIgR2VzdHVyZXMuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gdXNlUGFzc2l2ZSBlbmFibGUgb3IgZGlzYWJsZSBwYXNzaXZlIHRvdWNoIGdlc3R1cmVzIGdsb2JhbGx5CiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnNldFBhc3NpdmVUb3VjaEdlc3R1cmVzID0gZnVuY3Rpb24odXNlUGFzc2l2ZSkgewogICAgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcyA9IHVzZVBhc3NpdmU7CiAgfTsKCiAgUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zID0gUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zIHx8CiAgICAgIHdpbmRvdy5Qb2x5bWVyU2V0dGluZ3MgJiYgd2luZG93LlBvbHltZXJTZXR0aW5ncy5sZWdhY3lPcHRpbWl6YXRpb25zIHx8IGZhbHNlOwoKICAvKioKICAgKiBTZXRzIGBsZWdhY3lPcHRpbWl6YXRpb25zYCBnbG9iYWxseSBmb3IgYWxsIGVsZW1lbnRzLiBFbmFibGVzCiAgICogb3B0aW1pemF0aW9ucyB3aGVuIG9ubHkgbGVnYWN5IFBvbHltZXIoKSBzdHlsZSBlbGVtZW50cyBhcmUgdXNlZC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHBhcmFtIHtib29sZWFufSB1c2VMZWdhY3lPcHRpbWl6YXRpb25zIGVuYWJsZSBvciBkaXNhYmxlIGxlZ2FjeSBvcHRpbWl6YXRpb25zIGdsb2JhbGx5LgogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgUG9seW1lci5zZXRMZWdhY3lPcHRpbWl6YXRpb25zID0gZnVuY3Rpb24odXNlTGVnYWN5T3B0aW1pemF0aW9ucykgewogICAgUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zID0gdXNlTGVnYWN5T3B0aW1pemF0aW9uczsKICB9Owp9KSgpOwoKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgLy8gdW5pcXVlIGdsb2JhbCBpZCBmb3IgZGVkdXBpbmcgbWl4aW5zLgogIGxldCBkZWR1cGVJZCA9IDA7CgogIC8qKgogICAqIEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtGdW5jdGlvbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIE1peGluRnVuY3Rpb24oKXt9CiAgLyoqIEB0eXBlIHsoV2Vha01hcCB8IHVuZGVmaW5lZCl9ICovCiAgTWl4aW5GdW5jdGlvbi5wcm90b3R5cGUuX19taXhpbkFwcGxpY2F0aW9uczsKICAvKiogQHR5cGUgeyhPYmplY3QgfCB1bmRlZmluZWQpfSAqLwogIE1peGluRnVuY3Rpb24ucHJvdG90eXBlLl9fbWl4aW5TZXQ7CgogIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgLyoqCiAgICogV3JhcHMgYW4gRVM2IGNsYXNzIGV4cHJlc3Npb24gbWl4aW4gc3VjaCB0aGF0IHRoZSBtaXhpbiBpcyBvbmx5IGFwcGxpZWQKICAgKiBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhcHBsaWVkIGl0cyBiYXNlIGFyZ3VtZW50LiBBbHNvIG1lbW9pemVzIG1peGluCiAgICogYXBwbGljYXRpb25zLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAdGVtcGxhdGUgVAogICAqIEBwYXJhbSB7VH0gbWl4aW4gRVM2IGNsYXNzIGV4cHJlc3Npb24gbWl4aW4gdG8gd3JhcAogICAqIEByZXR1cm4ge1R9CiAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICovCiAgUG9seW1lci5kZWR1cGluZ01peGluID0gZnVuY3Rpb24obWl4aW4pIHsKICAgIGxldCBtaXhpbkFwcGxpY2F0aW9ucyA9IC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKG1peGluKS5fX21peGluQXBwbGljYXRpb25zOwogICAgaWYgKCFtaXhpbkFwcGxpY2F0aW9ucykgewogICAgICBtaXhpbkFwcGxpY2F0aW9ucyA9IG5ldyBXZWFrTWFwKCk7CiAgICAgIC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKG1peGluKS5fX21peGluQXBwbGljYXRpb25zID0gbWl4aW5BcHBsaWNhdGlvbnM7CiAgICB9CiAgICAvLyBtYWludGFpbiBhIHVuaXF1ZSBpZCBmb3IgZWFjaCBtaXhpbgogICAgbGV0IG1peGluRGVkdXBlSWQgPSBkZWR1cGVJZCsrOwogICAgZnVuY3Rpb24gZGVkdXBpbmdNaXhpbihiYXNlKSB7CiAgICAgIGxldCBiYXNlU2V0ID0gLyoqIEB0eXBlIHshTWl4aW5GdW5jdGlvbn0gKi8oYmFzZSkuX19taXhpblNldDsKICAgICAgaWYgKGJhc2VTZXQgJiYgYmFzZVNldFttaXhpbkRlZHVwZUlkXSkgewogICAgICAgIHJldHVybiBiYXNlOwogICAgICB9CiAgICAgIGxldCBtYXAgPSBtaXhpbkFwcGxpY2F0aW9uczsKICAgICAgbGV0IGV4dGVuZGVkID0gbWFwLmdldChiYXNlKTsKICAgICAgaWYgKCFleHRlbmRlZCkgewogICAgICAgIGV4dGVuZGVkID0gLyoqIEB0eXBlIHshRnVuY3Rpb259ICovKG1peGluKShiYXNlKTsKICAgICAgICBtYXAuc2V0KGJhc2UsIGV4dGVuZGVkKTsKICAgICAgfQogICAgICAvLyBjb3B5IGluaGVyaXRlZCBtaXhpbiBzZXQgZnJvbSB0aGUgZXh0ZW5kZWQgY2xhc3MsIG9yIHRoZSBiYXNlIGNsYXNzCiAgICAgIC8vIE5PVEU6IHdlIGF2b2lkIHVzZSBvZiBTZXQgaGVyZSBiZWNhdXNlIHNvbWUgYnJvd3NlciAoSUUxMSkKICAgICAgLy8gY2Fubm90IGV4dGVuZCBhIGJhc2UgU2V0IHZpYSB0aGUgY29uc3RydWN0b3IuCiAgICAgIGxldCBtaXhpblNldCA9IE9iamVjdC5jcmVhdGUoLyoqIEB0eXBlIHshTWl4aW5GdW5jdGlvbn0gKi8oZXh0ZW5kZWQpLl9fbWl4aW5TZXQgfHwgYmFzZVNldCB8fCBudWxsKTsKICAgICAgbWl4aW5TZXRbbWl4aW5EZWR1cGVJZF0gPSB0cnVlOwogICAgICAvKiogQHR5cGUgeyFNaXhpbkZ1bmN0aW9ufSAqLyhleHRlbmRlZCkuX19taXhpblNldCA9IG1peGluU2V0OwogICAgICByZXR1cm4gZXh0ZW5kZWQ7CiAgICB9CgogICAgcmV0dXJuIC8qKiBAdHlwZSB7VH0gKi8gKGRlZHVwaW5nTWl4aW4pOwogIH07CiAgLyogZXNsaW50LWVuYWJsZSB2YWxpZC1qc2RvYyAqLwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgTU9EVUxFX1NUWUxFX0xJTktfU0VMRUNUT1IgPSAnbGlua1tyZWw9aW1wb3J0XVt0eXBlfj1jc3NdJzsKICBjb25zdCBJTkNMVURFX0FUVFIgPSAnaW5jbHVkZSc7CiAgY29uc3QgU0hBRFlfVU5TQ09QRURfQVRUUiA9ICdzaGFkeS11bnNjb3BlZCc7CgogIGZ1bmN0aW9uIGltcG9ydE1vZHVsZShtb2R1bGVJZCkgewogICAgY29uc3QgLyoqIFBvbHltZXIuRG9tTW9kdWxlICovIFBvbHltZXJEb21Nb2R1bGUgPSBjdXN0b21FbGVtZW50cy5nZXQoJ2RvbS1tb2R1bGUnKTsKICAgIGlmICghUG9seW1lckRvbU1vZHVsZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBQb2x5bWVyRG9tTW9kdWxlLmltcG9ydChtb2R1bGVJZCk7CiAgfQoKICBmdW5jdGlvbiBzdHlsZUZvckltcG9ydChpbXBvcnREb2MpIHsKICAgIC8vIE5PVEU6IHBvbHlmaWxsIGFmZm9yZGFuY2UuCiAgICAvLyB1bmRlciB0aGUgSFRNTEltcG9ydHMgcG9seWZpbGwsIHRoZXJlIHdpbGwgYmUgbm8gJ2JvZHknLAogICAgLy8gYnV0IHRoZSBpbXBvcnQgcHNldWRvLWRvYyBjYW4gYmUgdXNlZCBkaXJlY3RseS4KICAgIGxldCBjb250YWluZXIgPSBpbXBvcnREb2MuYm9keSA/IGltcG9ydERvYy5ib2R5IDogaW1wb3J0RG9jOwogICAgY29uc3QgaW1wb3J0Q3NzID0gUG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVDc3MoY29udGFpbmVyLnRleHRDb250ZW50LAogICAgICBpbXBvcnREb2MuYmFzZVVSSSk7CiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICBzdHlsZS50ZXh0Q29udGVudCA9IGltcG9ydENzczsKICAgIHJldHVybiBzdHlsZTsKICB9CgogIC8qKiBAdHlwZWRlZiB7e2Fzc2V0cGF0aDogc3RyaW5nfX0gKi8KICBsZXQgdGVtcGxhdGVXaXRoQXNzZXRQYXRoOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgY29sbGVjdGlvbiBDU1MgdGV4dCBmcm9tIGA8dGVtcGxhdGVzPmAsIGV4dGVybmFsCiAgICogc3R5bGVzaGVldHMsIGFuZCBgZG9tLW1vZHVsZWBzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIHdpdGggdXRpbGl0aWVzIGZvciBjb2xsZWN0aW9uIENTUyB0ZXh0IGZyb20gdmFyaW91cyBzb3VyY2VzLgogICAqLwogIGNvbnN0IFN0eWxlR2F0aGVyID0gewoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGxpc3Qgb2YgPHN0eWxlPiBlbGVtZW50cyBpbiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGBkb20tbW9kdWxlYHMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZHMgTGlzdCBvZiBkb20tbW9kdWxlIGlkJ3Mgd2l0aGluIHdoaWNoIHRvCiAgICAgKiBzZWFyY2ggZm9yIGNzcy4KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCA8c3R5bGU+IGVsZW1lbnRzCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgICBzdHlsZXNGcm9tTW9kdWxlcyhtb2R1bGVJZHMpIHsKICAgICAgY29uc3QgbW9kdWxlcyA9IG1vZHVsZUlkcy50cmltKCkuc3BsaXQoL1xzKy8pOwogICAgICBjb25zdCBzdHlsZXMgPSBbXTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHN0eWxlcy5wdXNoKC4uLnRoaXMuc3R5bGVzRnJvbU1vZHVsZShtb2R1bGVzW2ldKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0eWxlczsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiA8c3R5bGU+IGVsZW1lbnRzIGluIGEgZ2l2ZW4gYGRvbS1tb2R1bGVgLgogICAgICogU3R5bGVzIGluIGEgYGRvbS1tb2R1bGVgIGNhbiBjb21lIGVpdGhlciBmcm9tIGA8c3R5bGU+YHMgd2l0aGluIHRoZQogICAgICogZmlyc3QgYDx0ZW1wbGF0ZT5gLCBvciBlbHNlIGZyb20gb25lIG9yIG1vcmUKICAgICAqIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIGxpbmtzIG91dHNpZGUgdGhlIHRlbXBsYXRlLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWQgZG9tLW1vZHVsZSBpZCB0byBnYXRoZXIgc3R5bGVzIGZyb20KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCBzdHlsZXMuCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIHN0eWxlc0Zyb21Nb2R1bGUobW9kdWxlSWQpIHsKICAgICAgY29uc3QgbSA9IGltcG9ydE1vZHVsZShtb2R1bGVJZCk7CgogICAgICBpZiAoIW0pIHsKICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBmaW5kIHN0eWxlIGRhdGEgaW4gbW9kdWxlIG5hbWVkJywgbW9kdWxlSWQpOwogICAgICAgIHJldHVybiBbXTsKICAgICAgfQoKICAgICAgaWYgKG0uX3N0eWxlcyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgY29uc3Qgc3R5bGVzID0gW107CiAgICAgICAgLy8gbW9kdWxlIGltcG9ydHM6IDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPgogICAgICAgIHN0eWxlcy5wdXNoKC4uLnRoaXMuX3N0eWxlc0Zyb21Nb2R1bGVJbXBvcnRzKG0pKTsKICAgICAgICAvLyBpbmNsdWRlIGNzcyBmcm9tIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbiB0aGUgbW9kdWxlCiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBtLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJyk7CiAgICAgICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgICAgICBzdHlsZXMucHVzaCguLi50aGlzLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwKICAgICAgICAgICAgLyoqIEB0eXBlIHt0ZW1wbGF0ZVdpdGhBc3NldFBhdGh9ICovKG0pLmFzc2V0cGF0aCkpOwogICAgICAgIH0KCiAgICAgICAgbS5fc3R5bGVzID0gc3R5bGVzOwogICAgICB9CgogICAgICByZXR1cm4gbS5fc3R5bGVzOwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGA8c3R5bGU+YCBlbGVtZW50cyB3aXRoaW4gYSBnaXZlbiB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gZ2F0aGVyIHN0eWxlcyBmcm9tCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBiYXNlVVJJIGZvciBzdHlsZSBjb250ZW50CiAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxTdHlsZUVsZW1lbnQ+fSBBcnJheSBvZiBzdHlsZXMKICAgICAqIEB0aGlzIHtTdHlsZUdhdGhlcn0KICAgICAqLwogICAgc3R5bGVzRnJvbVRlbXBsYXRlKHRlbXBsYXRlLCBiYXNlVVJJKSB7CiAgICAgIGlmICghdGVtcGxhdGUuX3N0eWxlcykgewogICAgICAgIGNvbnN0IHN0eWxlcyA9IFtdOwogICAgICAgIC8vIGlmIGVsZW1lbnQgaXMgYSB0ZW1wbGF0ZSwgZ2V0IGNvbnRlbnQgZnJvbSBpdHMgLmNvbnRlbnQKICAgICAgICBjb25zdCBlJCA9IHRlbXBsYXRlLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnc3R5bGUnKTsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBlJC5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IGUgPSBlJFtpXTsKICAgICAgICAgIC8vIHN1cHBvcnQgc3R5bGUgc2hhcmluZyBieSBhbGxvd2luZyBzdHlsZXMgdG8gImluY2x1ZGUiCiAgICAgICAgICAvLyBvdGhlciBkb20tbW9kdWxlcyB0aGF0IGNvbnRhaW4gc3R5bGluZwogICAgICAgICAgbGV0IGluY2x1ZGUgPSBlLmdldEF0dHJpYnV0ZShJTkNMVURFX0FUVFIpOwogICAgICAgICAgaWYgKGluY2x1ZGUpIHsKICAgICAgICAgICAgc3R5bGVzLnB1c2goLi4udGhpcy5zdHlsZXNGcm9tTW9kdWxlcyhpbmNsdWRlKS5maWx0ZXIoZnVuY3Rpb24oaXRlbSwgaW5kZXgsIHNlbGYpIHsKICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbmRleE9mKGl0ZW0pID09PSBpbmRleDsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGJhc2VVUkkpIHsKICAgICAgICAgICAgZS50ZXh0Q29udGVudCA9IFBvbHltZXIuUmVzb2x2ZVVybC5yZXNvbHZlQ3NzKGUudGV4dENvbnRlbnQsIGJhc2VVUkkpOwogICAgICAgICAgfQogICAgICAgICAgc3R5bGVzLnB1c2goZSk7CiAgICAgICAgfQogICAgICAgIHRlbXBsYXRlLl9zdHlsZXMgPSBzdHlsZXM7CiAgICAgIH0KICAgICAgcmV0dXJuIHRlbXBsYXRlLl9zdHlsZXM7CiAgICB9LAoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGxpc3Qgb2YgPHN0eWxlPiBlbGVtZW50cyAgZnJvbSBzdHlsZXNoZWV0cyBsb2FkZWQgdmlhIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIGxpbmtzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBkb20tbW9kdWxlYC4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkIElkIG9mIGBkb20tbW9kdWxlYCB0byBnYXRoZXIgQ1NTIGZyb20KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCBzdHlsZXMuCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgICBzdHlsZXNGcm9tTW9kdWxlSW1wb3J0cyhtb2R1bGVJZCkgewogICAgICBsZXQgbSA9IGltcG9ydE1vZHVsZShtb2R1bGVJZCk7CiAgICAgIHJldHVybiBtID8gdGhpcy5fc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobSkgOiBbXTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG1vZHVsZSBkb20tbW9kdWxlIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIHN0eWxlcwogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU3R5bGVFbGVtZW50Pn0gQXJyYXkgb2YgY29udGFpbmVkIHN0eWxlcwogICAgICovCiAgICBfc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobW9kdWxlKSB7CiAgICAgIGNvbnN0IHN0eWxlcyA9IFtdOwogICAgICBjb25zdCBwJCA9IG1vZHVsZS5xdWVyeVNlbGVjdG9yQWxsKE1PRFVMRV9TVFlMRV9MSU5LX1NFTEVDVE9SKTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgcCQubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgcCA9IHAkW2ldOwogICAgICAgIGlmIChwLmltcG9ydCkgewogICAgICAgICAgY29uc3QgaW1wb3J0RG9jID0gcC5pbXBvcnQ7CiAgICAgICAgICBjb25zdCB1bnNjb3BlZCA9IHAuaGFzQXR0cmlidXRlKFNIQURZX1VOU0NPUEVEX0FUVFIpOwogICAgICAgICAgaWYgKHVuc2NvcGVkICYmICFpbXBvcnREb2MuX3Vuc2NvcGVkU3R5bGUpIHsKICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBzdHlsZUZvckltcG9ydChpbXBvcnREb2MpOwogICAgICAgICAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoU0hBRFlfVU5TQ09QRURfQVRUUiwgJycpOwogICAgICAgICAgICBpbXBvcnREb2MuX3Vuc2NvcGVkU3R5bGUgPSBzdHlsZTsKICAgICAgICAgIH0gZWxzZSBpZiAoIWltcG9ydERvYy5fc3R5bGUpIHsKICAgICAgICAgICAgaW1wb3J0RG9jLl9zdHlsZSA9IHN0eWxlRm9ySW1wb3J0KGltcG9ydERvYyk7CiAgICAgICAgICB9CiAgICAgICAgICBzdHlsZXMucHVzaCh1bnNjb3BlZCA/IGltcG9ydERvYy5fdW5zY29wZWRTdHlsZSA6IGltcG9ydERvYy5fc3R5bGUpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gc3R5bGVzOwogICAgfSwKCiAgICAvKioKICAgICAqCiAgICAgKiBSZXR1cm5zIENTUyB0ZXh0IG9mIHN0eWxlcyBpbiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGBkb20tbW9kdWxlYHMuCiAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLCB1c2UgYHN0eWxlc0Zyb21Nb2R1bGVzYCBpbnN0ZWFkLgogICAgICoKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkcyBMaXN0IG9mIGRvbS1tb2R1bGUgaWQncyB3aXRoaW4gd2hpY2ggdG8KICAgICAqIHNlYXJjaCBmb3IgY3NzLgogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgcwogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICovCiAgICAgY3NzRnJvbU1vZHVsZXMobW9kdWxlSWRzKSB7CiAgICAgIGxldCBtb2R1bGVzID0gbW9kdWxlSWRzLnRyaW0oKS5zcGxpdCgvXHMrLyk7CiAgICAgIGxldCBjc3NUZXh0ID0gJyc7CiAgICAgIGZvciAobGV0IGk9MDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjc3NUZXh0ICs9IHRoaXMuY3NzRnJvbU1vZHVsZShtb2R1bGVzW2ldKTsKICAgICAgfQogICAgICByZXR1cm4gY3NzVGV4dDsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIENTUyB0ZXh0IG9mIHN0eWxlcyBpbiBhIGdpdmVuIGBkb20tbW9kdWxlYC4gIENTUyBpbiBhIGBkb20tbW9kdWxlYAogICAgICogY2FuIGNvbWUgZWl0aGVyIGZyb20gYDxzdHlsZT5gcyB3aXRoaW4gdGhlIGZpcnN0IGA8dGVtcGxhdGU+YCwgb3IgZWxzZQogICAgICogZnJvbSBvbmUgb3IgbW9yZSBgPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+YCBsaW5rcyBvdXRzaWRlIHRoZQogICAgICogdGVtcGxhdGUuCiAgICAgKgogICAgICogQW55IGA8c3R5bGVzPmAgcHJvY2Vzc2VkIGFyZSByZW1vdmVkIGZyb20gdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24uCiAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLCB1c2UgYHN0eWxlRnJvbU1vZHVsZWAgaW5zdGVhZC4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZCBkb20tbW9kdWxlIGlkIHRvIGdhdGhlciBzdHlsZXMgZnJvbQogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIGNzc0Zyb21Nb2R1bGUobW9kdWxlSWQpIHsKICAgICAgbGV0IG0gPSBpbXBvcnRNb2R1bGUobW9kdWxlSWQpOwogICAgICBpZiAobSAmJiBtLl9jc3NUZXh0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBtb2R1bGUgaW1wb3J0czogPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+CiAgICAgICAgbGV0IGNzc1RleHQgPSB0aGlzLl9jc3NGcm9tTW9kdWxlSW1wb3J0cyhtKTsKICAgICAgICAvLyBpbmNsdWRlIGNzcyBmcm9tIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbiB0aGUgbW9kdWxlCiAgICAgICAgbGV0IHQgPSBtLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJyk7CiAgICAgICAgaWYgKHQpIHsKICAgICAgICAgIGNzc1RleHQgKz0gdGhpcy5jc3NGcm9tVGVtcGxhdGUodCwKICAgICAgICAgICAgLyoqIEB0eXBlIHt0ZW1wbGF0ZVdpdGhBc3NldFBhdGh9ICovKG0pLmFzc2V0cGF0aCk7CiAgICAgICAgfQogICAgICAgIG0uX2Nzc1RleHQgPSBjc3NUZXh0IHx8IG51bGw7CiAgICAgIH0KICAgICAgaWYgKCFtKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZmluZCBzdHlsZSBkYXRhIGluIG1vZHVsZSBuYW1lZCcsIG1vZHVsZUlkKTsKICAgICAgfQogICAgICByZXR1cm4gbSAmJiBtLl9jc3NUZXh0IHx8ICcnOwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgQ1NTIHRleHQgb2YgYDxzdHlsZXM+YCB3aXRoaW4gYSBnaXZlbiB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBBbnkgYDxzdHlsZXM+YCBwcm9jZXNzZWQgYXJlIHJlbW92ZWQgZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbi4KICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQsIHVzZSBgc3R5bGVGcm9tVGVtcGxhdGVgIGluc3RlYWQuCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBnYXRoZXIgc3R5bGVzIGZyb20KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlc29sdmUgdGhlIFVSTCBhZ2FpbnN0CiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IENvbmNhdGVuYXRlZCBDU1MgY29udGVudCBmcm9tIHNwZWNpZmllZCB0ZW1wbGF0ZQogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICovCiAgICBjc3NGcm9tVGVtcGxhdGUodGVtcGxhdGUsIGJhc2VVUkkpIHsKICAgICAgbGV0IGNzc1RleHQgPSAnJzsKICAgICAgY29uc3QgZSQgPSB0aGlzLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwgYmFzZVVSSSk7CiAgICAgIC8vIGlmIGVsZW1lbnQgaXMgYSB0ZW1wbGF0ZSwgZ2V0IGNvbnRlbnQgZnJvbSBpdHMgLmNvbnRlbnQKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZSQubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgZSA9IGUkW2ldOwogICAgICAgIGlmIChlLnBhcmVudE5vZGUpIHsKICAgICAgICAgIGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKTsKICAgICAgICB9CiAgICAgICAgY3NzVGV4dCArPSBlLnRleHRDb250ZW50OwogICAgICB9CiAgICAgIHJldHVybiBjc3NUZXh0OwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgQ1NTIHRleHQgZnJvbSBzdHlsZXNoZWV0cyBsb2FkZWQgdmlhIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gCiAgICAgKiBsaW5rcyB3aXRoaW4gdGhlIHNwZWNpZmllZCBgZG9tLW1vZHVsZWAuCiAgICAgKgogICAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCwgdXNlIGBzdHlsZXNGcm9tTW9kdWxlSW1wb3J0c2AgaW5zdGVhZC4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWQgSWQgb2YgYGRvbS1tb2R1bGVgIHRvIGdhdGhlciBDU1MgZnJvbQogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBsaW5rcyBpbiBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIGNzc0Zyb21Nb2R1bGVJbXBvcnRzKG1vZHVsZUlkKSB7CiAgICAgIGxldCBtID0gaW1wb3J0TW9kdWxlKG1vZHVsZUlkKTsKICAgICAgcmV0dXJuIG0gPyB0aGlzLl9jc3NGcm9tTW9kdWxlSW1wb3J0cyhtKSA6ICcnOwogICAgfSwKCiAgICAvKioKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG1vZHVsZSBkb20tbW9kdWxlIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIHN0eWxlcwogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBsaW5rcyBpbiB0aGUgZG9tLW1vZHVsZQogICAgICovCiAgICAgX2Nzc0Zyb21Nb2R1bGVJbXBvcnRzKG1vZHVsZSkgewogICAgICBsZXQgY3NzVGV4dCA9ICcnOwogICAgICBsZXQgc3R5bGVzID0gdGhpcy5fc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobW9kdWxlKTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY3NzVGV4dCArPSBzdHlsZXNbaV0udGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIGNzc1RleHQ7CiAgICB9CiAgfTsKCiAgUG9seW1lci5TdHlsZUdhdGhlciA9IFN0eWxlR2F0aGVyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGxldCBtb2R1bGVzID0ge307CiAgbGV0IGxjTW9kdWxlcyA9IHt9OwogIGZ1bmN0aW9uIHNldE1vZHVsZShpZCwgbW9kdWxlKSB7CiAgICAvLyBzdG9yZSBpZCBzZXBhcmF0ZSBmcm9tIGxvd2VyY2FzZWQgaWQgc28gdGhhdAogICAgLy8gaW4gYWxsIGNhc2VzIG1peGVkQ2FzZSBpZCB3aWxsIHN0b3JlZCBkaXN0aW5jdGx5CiAgICAvLyBhbmQgbG93ZXJjYXNlIHZlcnNpb24gaXMgYSBmYWxsYmFjawogICAgbW9kdWxlc1tpZF0gPSBsY01vZHVsZXNbaWQudG9Mb3dlckNhc2UoKV0gPSBtb2R1bGU7CiAgfQogIGZ1bmN0aW9uIGZpbmRNb2R1bGUoaWQpIHsKICAgIHJldHVybiBtb2R1bGVzW2lkXSB8fCBsY01vZHVsZXNbaWQudG9Mb3dlckNhc2UoKV07CiAgfQoKICBmdW5jdGlvbiBzdHlsZU91dHNpZGVUZW1wbGF0ZUNoZWNrKGluc3QpIHsKICAgIGlmIChpbnN0LnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlJykpIHsKICAgICAgY29uc29sZS53YXJuKCdkb20tbW9kdWxlICVzIGhhcyBzdHlsZSBvdXRzaWRlIHRlbXBsYXRlJywgaW5zdC5pZCk7CiAgICB9CiAgfQoKICAvKioKICAgKiBUaGUgYGRvbS1tb2R1bGVgIGVsZW1lbnQgcmVnaXN0ZXJzIHRoZSBkb20gaXQgY29udGFpbnMgdG8gdGhlIG5hbWUgZ2l2ZW4KICAgKiBieSB0aGUgbW9kdWxlJ3MgaWQgYXR0cmlidXRlLiBJdCBwcm92aWRlcyBhIHVuaWZpZWQgZGF0YWJhc2Ugb2YgZG9tCiAgICogYWNjZXNzaWJsZSB2aWEgaXRzIHN0YXRpYyBgaW1wb3J0YCBBUEkuCiAgICoKICAgKiBBIGtleSB1c2UgY2FzZSBvZiBgZG9tLW1vZHVsZWAgaXMgZm9yIHByb3ZpZGluZyBjdXN0b20gZWxlbWVudCBgPHRlbXBsYXRlPmBzCiAgICogdmlhIEhUTUwgaW1wb3J0cyB0aGF0IGFyZSBwYXJzZWQgYnkgdGhlIG5hdGl2ZSBIVE1MIHBhcnNlciwgdGhhdCBjYW4gYmUKICAgKiByZWxvY2F0ZWQgZHVyaW5nIGEgYnVuZGxpbmcgcGFzcyBhbmQgc3RpbGwgbG9va2VkIHVwIGJ5IGBpZGAuCiAgICoKICAgKiBFeGFtcGxlOgogICAqCiAgICogICAgIDxkb20tbW9kdWxlIGlkPSJmb28iPgogICAqICAgICAgIDxpbWcgc3JjPSJzdHVmZi5wbmciPgogICAqICAgICA8L2RvbS1tb2R1bGU+CiAgICoKICAgKiBUaGVuIGluIGNvZGUgaW4gc29tZSBvdGhlciBsb2NhdGlvbiB0aGF0IGNhbm5vdCBhY2Nlc3MgdGhlIGRvbS1tb2R1bGUgYWJvdmUKICAgKgogICAqICAgICBsZXQgaW1nID0gY3VzdG9tRWxlbWVudHMuZ2V0KCdkb20tbW9kdWxlJykuaW1wb3J0KCdmb28nLCAnaW1nJyk7CiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIEhUTUxFbGVtZW50CiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0aGF0IHByb3ZpZGVzIGEgcmVnaXN0cnkgb2YgcmVsb2NhdGFibGUgRE9NIGNvbnRlbnQKICAgKiAgIGJ5IGBpZGAgdGhhdCBpcyBhZ25vc3RpYyB0byBidW5kbGluZy4KICAgKiBAdW5yZXN0cmljdGVkCiAgICovCiAgY2xhc3MgRG9tTW9kdWxlIGV4dGVuZHMgSFRNTEVsZW1lbnQgewoKICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgeyByZXR1cm4gWydpZCddOyB9CgogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSBjc3MgYHNlbGVjdG9yYCBpbiB0aGUgbW9kdWxlCiAgICAgKiByZWdpc3RlcmVkIGJ5IGBpZGAuIEZvciBleGFtcGxlLCB0aGlzLmltcG9ydCgnZm9vJywgJ2ltZycpOwogICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBpZCBvZiB0aGUgZG9tLW1vZHVsZSBpbiB3aGljaCB0byBzZWFyY2guCiAgICAgKiBAcGFyYW0ge3N0cmluZz19IHNlbGVjdG9yIFRoZSBjc3Mgc2VsZWN0b3IgYnkgd2hpY2ggdG8gZmluZCB0aGUgZWxlbWVudC4KICAgICAqIEByZXR1cm4ge0VsZW1lbnR9IFJldHVybnMgdGhlIGVsZW1lbnQgd2hpY2ggbWF0Y2hlcyBgc2VsZWN0b3JgIGluIHRoZQogICAgICogbW9kdWxlIHJlZ2lzdGVyZWQgYXQgdGhlIHNwZWNpZmllZCBgaWRgLgogICAgICovCiAgICBzdGF0aWMgaW1wb3J0KGlkLCBzZWxlY3RvcikgewogICAgICBpZiAoaWQpIHsKICAgICAgICBsZXQgbSA9IGZpbmRNb2R1bGUoaWQpOwogICAgICAgIGlmIChtICYmIHNlbGVjdG9yKSB7CiAgICAgICAgICByZXR1cm4gbS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG07CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUuCiAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG9sZCBPbGQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBDdXJyZW50IHZhbHVlIG9mIGF0dHJpYnV0ZS4KICAgICAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZXNwYWNlIEF0dHJpYnV0ZSBuYW1lc3BhY2UuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkLCB2YWx1ZSwgbmFtZXNwYWNlKSB7CiAgICAgIGlmIChvbGQgIT09IHZhbHVlKSB7CiAgICAgICAgdGhpcy5yZWdpc3RlcigpOwogICAgICB9CiAgICB9CiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC1hcmdzICovCgogICAgLyoqCiAgICAgKiBUaGUgYWJzb2x1dGUgVVJMIG9mIHRoZSBvcmlnaW5hbCBsb2NhdGlvbiBvZiB0aGlzIGBkb20tbW9kdWxlYC4KICAgICAqCiAgICAgKiBUaGlzIHZhbHVlIHdpbGwgZGlmZmVyIGZyb20gdGhpcyBlbGVtZW50J3MgYG93bmVyRG9jdW1lbnRgIGluIHRoZQogICAgICogZm9sbG93aW5nIHdheXM6CiAgICAgKiAtIFRha2VzIGludG8gYWNjb3VudCBhbnkgYGFzc2V0cGF0aGAgYXR0cmlidXRlIGFkZGVkIGR1cmluZyBidW5kbGluZwogICAgICogICB0byBpbmRpY2F0ZSB0aGUgb3JpZ2luYWwgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIGJ1bmRsZWQgbG9jYXRpb24KICAgICAqIC0gVXNlcyB0aGUgSFRNTEltcG9ydHMgcG9seWZpbGwncyBgaW1wb3J0Rm9yRWxlbWVudGAgQVBJIHRvIGVuc3VyZQogICAgICogICB0aGUgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgaW1wb3J0IGRvY3VtZW50J3MgbG9jYXRpb24gc2luY2UKICAgICAqICAgYG93bmVyRG9jdW1lbnRgIGlzIG5vdCBjdXJyZW50bHkgcG9seWZpbGxlZAogICAgICovCiAgICBnZXQgYXNzZXRwYXRoKCkgewogICAgICAvLyBEb24ndCBvdmVycmlkZSBleGlzdGluZyBhc3NldHBhdGguCiAgICAgIGlmICghdGhpcy5fX2Fzc2V0cGF0aCkgewogICAgICAgIC8vIG5vdGU6IGFzc2V0cGF0aCBzZXQgdmlhIGFuIGF0dHJpYnV0ZSBtdXN0IGJlIHJlbGF0aXZlIHRvIHRoaXMKICAgICAgICAvLyBlbGVtZW50J3MgbG9jYXRpb247IGFjY29tb2RhdGUgcG9seWZpbGxlZCBIVE1MSW1wb3J0cwogICAgICAgIGNvbnN0IG93bmVyID0gd2luZG93LkhUTUxJbXBvcnRzICYmIEhUTUxJbXBvcnRzLmltcG9ydEZvckVsZW1lbnQgPwogICAgICAgICAgSFRNTEltcG9ydHMuaW1wb3J0Rm9yRWxlbWVudCh0aGlzKSB8fCBkb2N1bWVudCA6IHRoaXMub3duZXJEb2N1bWVudDsKICAgICAgICBjb25zdCB1cmwgPSBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybCgKICAgICAgICAgIHRoaXMuZ2V0QXR0cmlidXRlKCdhc3NldHBhdGgnKSB8fCAnJywgb3duZXIuYmFzZVVSSSk7CiAgICAgICAgdGhpcy5fX2Fzc2V0cGF0aCA9IFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybCh1cmwpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9fYXNzZXRwYXRoOwogICAgfQoKICAgIC8qKgogICAgICogUmVnaXN0ZXJzIHRoZSBkb20tbW9kdWxlIGF0IGEgZ2l2ZW4gaWQuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZAogICAgICogd2hlbiBhIGRvbS1tb2R1bGUgaXMgaW1wZXJhdGl2ZWx5IGNyZWF0ZWQuIEZvcgogICAgICogZXhhbXBsZSwgYGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RvbS1tb2R1bGUnKS5yZWdpc3RlcignZm9vJylgLgogICAgICogQHBhcmFtIHtzdHJpbmc9fSBpZCBUaGUgaWQgYXQgd2hpY2ggdG8gcmVnaXN0ZXIgdGhlIGRvbS1tb2R1bGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZWdpc3RlcihpZCkgewogICAgICBpZCA9IGlkIHx8IHRoaXMuaWQ7CiAgICAgIGlmIChpZCkgewogICAgICAgIC8vIFVuZGVyIHN0cmljdFRlbXBsYXRlUG9saWN5LCByZWplY3QgYW5kIG51bGwgb3V0IGFueSByZS1yZWdpc3RlcmVkCiAgICAgICAgLy8gZG9tLW1vZHVsZSBzaW5jZSBpdCBpcyBhbWJpZ3VvdXMgd2hldGhlciBmaXJzdC1pbiBvciBsYXN0LWluIGlzIHRydXN0ZWQgCiAgICAgICAgaWYgKFBvbHltZXIuc3RyaWN0VGVtcGxhdGVQb2xpY3kgJiYgZmluZE1vZHVsZShpZCkgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgc2V0TW9kdWxlKGlkLCBudWxsKTsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc3RyaWN0VGVtcGxhdGVQb2xpY3k6IGRvbS1tb2R1bGUgJHtpZH0gcmUtcmVnaXN0ZXJlZGApOwogICAgICAgIH0KICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgc2V0TW9kdWxlKGlkLCB0aGlzKTsKICAgICAgICBzdHlsZU91dHNpZGVUZW1wbGF0ZUNoZWNrKHRoaXMpOwogICAgICB9CiAgICB9CiAgfQoKICBEb21Nb2R1bGUucHJvdG90eXBlWydtb2R1bGVzJ10gPSBtb2R1bGVzOwoKICBjdXN0b21FbGVtZW50cy5kZWZpbmUoJ2RvbS1tb2R1bGUnLCBEb21Nb2R1bGUpOwoKICAvKiogQGNvbnN0ICovCiAgUG9seW1lci5Eb21Nb2R1bGUgPSBEb21Nb2R1bGU7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgbWFuaXB1bGF0aW5nIHN0cnVjdHVyZWQgZGF0YSBwYXRoIHN0cmluZ3MuCiAgICoKICAgKiBAbmFtZXNwYWNlCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBNb2R1bGUgd2l0aCB1dGlsaXRpZXMgZm9yIG1hbmlwdWxhdGluZyBzdHJ1Y3R1cmVkIGRhdGEgcGF0aCBzdHJpbmdzLgogICAqLwogIGNvbnN0IFBhdGggPSB7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBhIHN0cnVjdHVyZWQgZGF0YSBwYXRoIChoYXMgZG90cykuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5pc1BhdGgoJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzUGF0aCgnZm9vJykgICAgICAgICAvLyBmYWxzZQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBjb250YWluZWQgb25lIG9yIG1vcmUgZG90cwogICAgICovCiAgICBpc1BhdGg6IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgcmV0dXJuIHBhdGguaW5kZXhPZignLicpID49IDA7CiAgICB9LAoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcm9vdCBwcm9wZXJ0eSBuYW1lIGZvciB0aGUgZ2l2ZW4gcGF0aC4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqIGBgYAogICAgICogUG9seW1lci5QYXRoLnJvb3QoJ2Zvby5iYXIuYmF6JykgLy8gJ2ZvbycKICAgICAqIFBvbHltZXIuUGF0aC5yb290KCdmb28nKSAgICAgICAgIC8vICdmb28nCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5QYXRoCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQYXRoIHN0cmluZwogICAgICogQHJldHVybiB7c3RyaW5nfSBSb290IHByb3BlcnR5IG5hbWUKICAgICAqLwogICAgcm9vdDogZnVuY3Rpb24ocGF0aCkgewogICAgICBsZXQgZG90SW5kZXggPSBwYXRoLmluZGV4T2YoJy4nKTsKICAgICAgaWYgKGRvdEluZGV4ID09PSAtMSkgewogICAgICAgIHJldHVybiBwYXRoOwogICAgICB9CiAgICAgIHJldHVybiBwYXRoLnNsaWNlKDAsIGRvdEluZGV4KTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBHaXZlbiBgYmFzZWAgaXMgYGZvby5iYXJgLCBgZm9vYCBpcyBhbiBhbmNlc3RvciwgYGZvby5iYXJgIGlzIG5vdAogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwYXRoIGlzIGFuIGFuY2VzdG9yIG9mIHRoZSBiYXNlIHBhdGguCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5pc0FuY2VzdG9yKCdmb28uYmFyJywgJ2ZvbycpICAgICAgICAgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzQW5jZXN0b3IoJ2Zvby5iYXInLCAnZm9vLmJhcicpICAgICAvLyBmYWxzZQogICAgICogUG9seW1lci5QYXRoLmlzQW5jZXN0b3IoJ2Zvby5iYXInLCAnZm9vLmJhci5iYXonKSAvLyBmYWxzZQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2UgUGF0aCBzdHJpbmcgdG8gdGVzdCBhZ2FpbnN0LgogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcgdG8gdGVzdC4KICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYHBhdGhgIGlzIGFuIGFuY2VzdG9yIG9mIGBiYXNlYC4KICAgICAqLwogICAgaXNBbmNlc3RvcjogZnVuY3Rpb24oYmFzZSwgcGF0aCkgewogICAgICAvLyAgICAgYmFzZS5zdGFydHNXaXRoKHBhdGggKyAnLicpOwogICAgICByZXR1cm4gYmFzZS5pbmRleE9mKHBhdGggKyAnLicpID09PSAwOwogICAgfSwKCiAgICAvKioKICAgICAqIEdpdmVuIGBiYXNlYCBpcyBgZm9vLmJhcmAsIGBmb28uYmFyLmJhemAgaXMgYW4gZGVzY2VuZGFudAogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KCdmb28uYmFyJywgJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzRGVzY2VuZGFudCgnZm9vLmJhcicsICdmb28uYmFyJykgICAgIC8vIGZhbHNlCiAgICAgKiBQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KCdmb28uYmFyJywgJ2ZvbycpICAgICAgICAgLy8gZmFsc2UKICAgICAqIGBgYAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIFBhdGggc3RyaW5nIHRvIHRlc3QgYWdhaW5zdC4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nIHRvIHRlc3QuCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBwYXRoYCBpcyBhIGRlc2NlbmRhbnQgb2YgYGJhc2VgLgogICAgICovCiAgICBpc0Rlc2NlbmRhbnQ6IGZ1bmN0aW9uKGJhc2UsIHBhdGgpIHsKICAgICAgLy8gICAgIHBhdGguc3RhcnRzV2l0aChiYXNlICsgJy4nKTsKICAgICAgcmV0dXJuIHBhdGguaW5kZXhPZihiYXNlICsgJy4nKSA9PT0gMDsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBhIHByZXZpb3VzIGJhc2UgcGF0aCB3aXRoIGEgbmV3IGJhc2UgcGF0aCwgcHJlc2VydmluZyB0aGUKICAgICAqIHJlbWFpbmRlciBvZiB0aGUgcGF0aC4KICAgICAqCiAgICAgKiBVc2VyIG11c3QgZW5zdXJlIGBwYXRoYCBoYXMgYSBwcmVmaXggb2YgYGJhc2VgLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGgudHJhbnNsYXRlKCdmb28uYmFyJywgJ3pvdCcsICdmb28uYmFyLmJheicpIC8vICd6b3QuYmF6JwogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2UgQ3VycmVudCBiYXNlIHN0cmluZyB0byByZW1vdmUKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdCYXNlIE5ldyBiYXNlIHN0cmluZyB0byByZXBsYWNlIHdpdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggdG8gdHJhbnNsYXRlCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRyYW5zbGF0ZWQgc3RyaW5nCiAgICAgKi8KICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24oYmFzZSwgbmV3QmFzZSwgcGF0aCkgewogICAgICByZXR1cm4gbmV3QmFzZSArIHBhdGguc2xpY2UoYmFzZS5sZW5ndGgpOwogICAgfSwKCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIFBhdGggc3RyaW5nIHRvIHRlc3QgYWdhaW5zdAogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcgdG8gdGVzdAogICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgcGF0aGAgaXMgZXF1YWwgdG8gYGJhc2VgCiAgICAgKiBAdGhpcyB7UGF0aH0KICAgICAqLwogICAgbWF0Y2hlczogZnVuY3Rpb24oYmFzZSwgcGF0aCkgewogICAgICByZXR1cm4gKGJhc2UgPT09IHBhdGgpIHx8CiAgICAgICAgICAgICB0aGlzLmlzQW5jZXN0b3IoYmFzZSwgcGF0aCkgfHwKICAgICAgICAgICAgIHRoaXMuaXNEZXNjZW5kYW50KGJhc2UsIHBhdGgpOwogICAgfSwKCiAgICAvKioKICAgICAqIENvbnZlcnRzIGFycmF5LWJhc2VkIHBhdGhzIHRvIGZsYXR0ZW5lZCBwYXRoLiAgU3RyaW5nLWJhc2VkIHBhdGhzCiAgICAgKiBhcmUgcmV0dXJuZWQgYXMtaXMuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5ub3JtYWxpemUoWydmb28uYmFyJywgMCwgJ2JheiddKSAgLy8gJ2Zvby5iYXIuMC5iYXonCiAgICAgKiBQb2x5bWVyLlBhdGgubm9ybWFsaXplKCdmb28uYmFyLjAuYmF6JykgICAgICAgIC8vICdmb28uYmFyLjAuYmF6JwogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggSW5wdXQgcGF0aAogICAgICogQHJldHVybiB7c3RyaW5nfSBGbGF0dGVuZWQgcGF0aAogICAgICovCiAgICBub3JtYWxpemU6IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHsKICAgICAgICBsZXQgcGFydHMgPSBbXTsKICAgICAgICBmb3IgKGxldCBpPTA7IGk8cGF0aC5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IGFyZ3MgPSBwYXRoW2ldLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTsKICAgICAgICAgIGZvciAobGV0IGo9MDsgajxhcmdzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIHBhcnRzLnB1c2goYXJnc1tqXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJ0cy5qb2luKCcuJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBTcGxpdHMgYSBwYXRoIGludG8gYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuIEFjY2VwdHMgZWl0aGVyIGFycmF5cwogICAgICogb2YgcGF0aCBwYXJ0cyBvciBzdHJpbmdzLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGguc3BsaXQoWydmb28uYmFyJywgMCwgJ2JheiddKSAgLy8gWydmb28nLCAnYmFyJywgJzAnLCAnYmF6J10KICAgICAqIFBvbHltZXIuUGF0aC5zcGxpdCgnZm9vLmJhci4wLmJheicpICAgICAgICAvLyBbJ2ZvbycsICdiYXInLCAnMCcsICdiYXonXQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggSW5wdXQgcGF0aAogICAgICogQHJldHVybiB7IUFycmF5PHN0cmluZz59IEFycmF5IG9mIHBhdGggcGFydHMKICAgICAqIEB0aGlzIHtQYXRofQogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzfQogICAgICovCiAgICBzcGxpdDogZnVuY3Rpb24ocGF0aCkgewogICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkgewogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZShwYXRoKS5zcGxpdCgnLicpOwogICAgICB9CiAgICAgIHJldHVybiBwYXRoLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZWFkcyBhIHZhbHVlIGZyb20gYSBwYXRoLiAgSWYgYW55IHN1Yi1wcm9wZXJ0eSBpbiB0aGUgcGF0aCBpcyBgdW5kZWZpbmVkYCwKICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAgKHdpbGwgbmV2ZXIgdGhyb3cuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtPYmplY3R9IHJvb3QgT2JqZWN0IGZyb20gd2hpY2ggdG8gZGVyZWZlcmVuY2UgcGF0aCBmcm9tCiAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIHJlYWQKICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaW5mbyBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgdG8gYGluZm9gLCB0aGUgbm9ybWFsaXplZAogICAgICogIChmbGF0dGVuZWQpIHBhdGggd2lsbCBiZSBzZXQgdG8gYGluZm8ucGF0aGAuCiAgICAgKiBAcmV0dXJuIHsqfSBWYWx1ZSBhdCBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgcGF0aCBjb3VsZCBub3QgYmUKICAgICAqICBmdWxseSBkZXJlZmVyZW5jZWQuCiAgICAgKiBAdGhpcyB7UGF0aH0KICAgICAqLwogICAgZ2V0OiBmdW5jdGlvbihyb290LCBwYXRoLCBpbmZvKSB7CiAgICAgIGxldCBwcm9wID0gcm9vdDsKICAgICAgbGV0IHBhcnRzID0gdGhpcy5zcGxpdChwYXRoKTsKICAgICAgLy8gTG9vcCBvdmVyIHBhdGggcGFydHNbMC4ubi0xXSBhbmQgZGVyZWZlcmVuY2UKICAgICAgZm9yIChsZXQgaT0wOyBpPHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKCFwcm9wKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGxldCBwYXJ0ID0gcGFydHNbaV07CiAgICAgICAgcHJvcCA9IHByb3BbcGFydF07CiAgICAgIH0KICAgICAgaWYgKGluZm8pIHsKICAgICAgICBpbmZvLnBhdGggPSBwYXJ0cy5qb2luKCcuJyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHByb3A7CiAgICB9LAoKICAgIC8qKgogICAgICogU2V0cyBhIHZhbHVlIHRvIGEgcGF0aC4gIElmIGFueSBzdWItcHJvcGVydHkgaW4gdGhlIHBhdGggaXMgYHVuZGVmaW5lZGAsCiAgICAgKiB0aGlzIG1ldGhvZCB3aWxsIG5vLW9wLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7T2JqZWN0fSByb290IE9iamVjdCBmcm9tIHdoaWNoIHRvIGRlcmVmZXJlbmNlIHBhdGggZnJvbQogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBzZXQKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0IHRvIHBhdGgKICAgICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gVGhlIG5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgaW5wdXQgcGF0aAogICAgICogQHRoaXMge1BhdGh9CiAgICAgKi8KICAgIHNldDogZnVuY3Rpb24ocm9vdCwgcGF0aCwgdmFsdWUpIHsKICAgICAgbGV0IHByb3AgPSByb290OwogICAgICBsZXQgcGFydHMgPSB0aGlzLnNwbGl0KHBhdGgpOwogICAgICBsZXQgbGFzdCA9IHBhcnRzW3BhcnRzLmxlbmd0aC0xXTsKICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAvLyBMb29wIG92ZXIgcGF0aCBwYXJ0c1swLi5uLTJdIGFuZCBkZXJlZmVyZW5jZQogICAgICAgIGZvciAobGV0IGk9MDsgaTxwYXJ0cy5sZW5ndGgtMTsgaSsrKSB7CiAgICAgICAgICBsZXQgcGFydCA9IHBhcnRzW2ldOwogICAgICAgICAgcHJvcCA9IHByb3BbcGFydF07CiAgICAgICAgICBpZiAoIXByb3ApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBTZXQgdmFsdWUgdG8gb2JqZWN0IGF0IGVuZCBvZiBwYXRoCiAgICAgICAgcHJvcFtsYXN0XSA9IHZhbHVlOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFNpbXBsZSBwcm9wZXJ0eSBzZXQKICAgICAgICBwcm9wW3BhdGhdID0gdmFsdWU7CiAgICAgIH0KICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJy4nKTsKICAgIH0KCiAgfTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYSBzdHJ1Y3R1cmVkIGRhdGEgcGF0aCAoaGFzIGRvdHMpLgogICAqCiAgICogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLiAgVXNlIGBQb2x5bWVyLlBhdGguaXNQYXRoYCBpbnN0ZWFkLgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqIGBgYAogICAqIFBvbHltZXIuUGF0aC5pc0RlZXAoJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAqIFBvbHltZXIuUGF0aC5pc0RlZXAoJ2ZvbycpICAgICAgICAgLy8gZmFsc2UKICAgKiBgYGAKICAgKgogICAqIEBkZXByZWNhdGVkCiAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnRhaW5lZCBvbmUgb3IgbW9yZSBkb3RzCiAgICovCiAgUGF0aC5pc0RlZXAgPSBQYXRoLmlzUGF0aDsKCiAgUG9seW1lci5QYXRoID0gUGF0aDsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgY2FzZU1hcCA9IHt9OwogIGNvbnN0IERBU0hfVE9fQ0FNRUwgPSAvLVthLXpdL2c7CiAgY29uc3QgQ0FNRUxfVE9fREFTSCA9IC8oW0EtWl0pL2c7CgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgY29udmVydGluZyBiZXR3ZWVuICJkYXNoLWNhc2UiIGFuZCAiY2FtZWxDYXNlIgogICAqIGlkZW50aWZpZXJzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIHRoYXQgcHJvdmlkZXMgdXRpbGl0aWVzIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gImRhc2gtY2FzZSIKICAgKiAgIGFuZCAiY2FtZWxDYXNlIi4KICAgKi8KICBjb25zdCBDYXNlTWFwID0gewoKICAgIC8qKgogICAgICogQ29udmVydHMgImRhc2gtY2FzZSIgaWRlbnRpZmllciAoZS5nLiBgZm9vLWJhci1iYXpgKSB0byAiY2FtZWxDYXNlIgogICAgICogKGUuZy4gYGZvb0JhckJhemApLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkNhc2VNYXAKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXNoIERhc2gtY2FzZSBpZGVudGlmaWVyCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IENhbWVsLWNhc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlkZW50aWZpZXIKICAgICAqLwogICAgZGFzaFRvQ2FtZWxDYXNlKGRhc2gpIHsKICAgICAgcmV0dXJuIGNhc2VNYXBbZGFzaF0gfHwgKAogICAgICAgIGNhc2VNYXBbZGFzaF0gPSBkYXNoLmluZGV4T2YoJy0nKSA8IDAgPyBkYXNoIDogZGFzaC5yZXBsYWNlKERBU0hfVE9fQ0FNRUwsCiAgICAgICAgICAobSkgPT4gbVsxXS50b1VwcGVyQ2FzZSgpCiAgICAgICAgKQogICAgICApOwogICAgfSwKCiAgICAvKioKICAgICAqIENvbnZlcnRzICJjYW1lbENhc2UiIGlkZW50aWZpZXIgKGUuZy4gYGZvb0JhckJhemApIHRvICJkYXNoLWNhc2UiCiAgICAgKiAoZS5nLiBgZm9vLWJhci1iYXpgKS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5DYXNlTWFwCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2FtZWwgQ2FtZWwtY2FzZSBpZGVudGlmaWVyCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IERhc2gtY2FzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaWRlbnRpZmllcgogICAgICovCiAgICBjYW1lbFRvRGFzaENhc2UoY2FtZWwpIHsKICAgICAgcmV0dXJuIGNhc2VNYXBbY2FtZWxdIHx8ICgKICAgICAgICBjYXNlTWFwW2NhbWVsXSA9IGNhbWVsLnJlcGxhY2UoQ0FNRUxfVE9fREFTSCwgJy0kMScpLnRvTG93ZXJDYXNlKCkKICAgICAgKTsKICAgIH0KCiAgfTsKCiAgUG9seW1lci5DYXNlTWFwID0gQ2FzZU1hcDsKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgLy8gTWljcm90YXNrIGltcGxlbWVudGVkIHVzaW5nIE11dGF0aW9uIE9ic2VydmVyCiAgbGV0IG1pY3JvdGFza0N1cnJIYW5kbGUgPSAwOwogIGxldCBtaWNyb3Rhc2tMYXN0SGFuZGxlID0gMDsKICBsZXQgbWljcm90YXNrQ2FsbGJhY2tzID0gW107CiAgbGV0IG1pY3JvdGFza05vZGVDb250ZW50ID0gMDsKICBsZXQgbWljcm90YXNrTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTsKICBuZXcgd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIobWljcm90YXNrRmx1c2gpLm9ic2VydmUobWljcm90YXNrTm9kZSwge2NoYXJhY3RlckRhdGE6IHRydWV9KTsKCiAgZnVuY3Rpb24gbWljcm90YXNrRmx1c2goKSB7CiAgICBjb25zdCBsZW4gPSBtaWNyb3Rhc2tDYWxsYmFja3MubGVuZ3RoOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBsZXQgY2IgPSBtaWNyb3Rhc2tDYWxsYmFja3NbaV07CiAgICAgIGlmIChjYikgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjYigpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aHJvdyBlOyB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIG1pY3JvdGFza0NhbGxiYWNrcy5zcGxpY2UoMCwgbGVuKTsKICAgIG1pY3JvdGFza0xhc3RIYW5kbGUgKz0gbGVuOwogIH0KCiAgLyoqCiAgICogTW9kdWxlIHRoYXQgcHJvdmlkZXMgYSBudW1iZXIgb2Ygc3RyYXRlZ2llcyBmb3IgZW5xdWV1aW5nIGFzeW5jaHJvbm91cwogICAqIHRhc2tzLiAgRWFjaCBzdWItbW9kdWxlIHByb3ZpZGVzIGEgc3RhbmRhcmQgYHJ1bihmbilgIGludGVyZmFjZSB0aGF0IHJldHVybnMgYQogICAqIGhhbmRsZSwgYW5kIGEgYGNhbmNlbChoYW5kbGUpYCBpbnRlcmZhY2UgZm9yIGNhbmNlbGluZyBhc3luYyB0YXNrcyBiZWZvcmUKICAgKiB0aGV5IHJ1bi4KICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1vZHVsZSB0aGF0IHByb3ZpZGVzIGEgbnVtYmVyIG9mIHN0cmF0ZWdpZXMgZm9yIGVucXVldWluZyBhc3luY2hyb25vdXMKICAgKiB0YXNrcy4KICAgKi8KICBQb2x5bWVyLkFzeW5jID0gewoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGBzZXRUaW1lb3V0YC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGBzZXRUaW1lb3V0YC4KICAgICAqLwogICAgdGltZU91dDogewogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIHN1Yi1tb2R1bGUgd2l0aCB0aGUgYXN5bmMgaW50ZXJmYWNlIHByb3ZpZGluZyB0aGUgcHJvdmlkZWQKICAgICAgICogZGVsYXkuCiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkFzeW5jLnRpbWVPdXQKICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBkZWxheSBUaW1lIHRvIHdhaXQgYmVmb3JlIGNhbGxpbmcgY2FsbGJhY2tzIGluIG1zCiAgICAgICAqIEByZXR1cm4geyFBc3luY0ludGVyZmFjZX0gQW4gYXN5bmMgdGltZW91dCBpbnRlcmZhY2UKICAgICAgICovCiAgICAgIGFmdGVyKGRlbGF5KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHJ1bihmbikgeyByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZm4sIGRlbGF5KTsgfSwKICAgICAgICAgIGNhbmNlbChoYW5kbGUpIHsKICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChoYW5kbGUpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBFbnF1ZXVlcyBhIGZ1bmN0aW9uIGNhbGxlZCBpbiB0aGUgbmV4dCB0YXNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy50aW1lT3V0CiAgICAgICAqIEBwYXJhbSB7IUZ1bmN0aW9ufSBmbiBDYWxsYmFjayB0byBydW4KICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBkZWxheSBEZWxheSBpbiBtaWxsaXNlY29uZHMKICAgICAgICogQHJldHVybiB7bnVtYmVyfSBIYW5kbGUgdXNlZCBmb3IgY2FuY2VsaW5nIHRhc2sKICAgICAgICovCiAgICAgIHJ1bihmbiwgZGVsYXkpIHsKICAgICAgICByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZm4sIGRlbGF5KTsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAqIENhbmNlbHMgYSBwcmV2aW91c2x5IGVucXVldWVkIGB0aW1lT3V0YCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMudGltZU91dAogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKGhhbmRsZSkgewogICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoaGFuZGxlKTsKICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIEFzeW5jIGludGVyZmFjZSB3cmFwcGVyIGFyb3VuZCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLgogICAgICovCiAgICBhbmltYXRpb25GcmFtZTogewogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAgdGltaW5nLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5hbmltYXRpb25GcmFtZQogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6dm9pZH0gZm4gQ2FsbGJhY2sgdG8gcnVuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHVzZWQgZm9yIGNhbmNlbGluZyB0YXNrCiAgICAgICAqLwogICAgICBydW4oZm4pIHsKICAgICAgICByZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIGEgcHJldmlvdXNseSBlbnF1ZXVlZCBgYW5pbWF0aW9uRnJhbWVgIGNhbGxiYWNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5hbmltYXRpb25GcmFtZQogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKGhhbmRsZSkgewogICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShoYW5kbGUpOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4gIEZhbGxzIGJhY2sgdG8KICAgICAqIGBzZXRUaW1lb3V0YCBvbiBicm93c2VycyB0aGF0IGRvIG5vdCBzdXBwb3J0IGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4KICAgICAqLwogICAgaWRsZVBlcmlvZDogewogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgYHJlcXVlc3RJZGxlQ2FsbGJhY2tgIHRpbWluZy4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMuaWRsZVBlcmlvZAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFJZGxlRGVhZGxpbmUpOnZvaWR9IGZuIENhbGxiYWNrIHRvIHJ1bgogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEhhbmRsZSB1c2VkIGZvciBjYW5jZWxpbmcgdGFzawogICAgICAgKi8KICAgICAgcnVuKGZuKSB7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrID8KICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrKGZuKSA6CiAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmbiwgMTYpOwogICAgICB9LAogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhIHByZXZpb3VzbHkgZW5xdWV1ZWQgYGlkbGVQZXJpb2RgIGNhbGxiYWNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5pZGxlUGVyaW9kCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gYHJ1bmAgb2YgY2FsbGJhY2sgdG8gY2FuY2VsCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjYW5jZWwoaGFuZGxlKSB7CiAgICAgICAgd2luZG93LmNhbmNlbElkbGVDYWxsYmFjayA/CiAgICAgICAgICB3aW5kb3cuY2FuY2VsSWRsZUNhbGxiYWNrKGhhbmRsZSkgOgogICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChoYW5kbGUpOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIGZvciBlbnF1ZXVpbmcgY2FsbGJhY2tzIHRoYXQgcnVuIGF0IG1pY3JvdGFzayB0aW1pbmcuCiAgICAgKgogICAgICogTm90ZSB0aGF0IG1pY3JvdGFzayB0aW1pbmcgaXMgYWNoaWV2ZWQgdmlhIGEgc2luZ2xlIGBNdXRhdGlvbk9ic2VydmVyYCwKICAgICAqIGFuZCB0aHVzIGNhbGxiYWNrcyBlbnF1ZXVlZCB3aXRoIHRoaXMgQVBJIHdpbGwgYWxsIHJ1biBpbiBhIHNpbmdsZQogICAgICogYmF0Y2gsIGFuZCBub3QgaW50ZXJsZWF2ZWQgd2l0aCBvdGhlciBtaWNyb3Rhc2tzIHN1Y2ggYXMgcHJvbWlzZXMuCiAgICAgKiBQcm9taXNlcyBhcmUgYXZvaWRlZCBhcyBhbiBpbXBsZW1lbnRhdGlvbiBjaG9pY2UgZm9yIHRoZSB0aW1lIGJlaW5nCiAgICAgKiBkdWUgdG8gU2FmYXJpIGJ1Z3MgdGhhdCBjYXVzZSBQcm9taXNlcyB0byBsYWNrIG1pY3JvdGFzayBndWFyYW50ZWVzLgogICAgICoKICAgICAqIEBuYW1lc3BhY2UKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkFzeW5jCiAgICAgKiBAc3VtbWFyeSBBc3luYyBpbnRlcmZhY2UgZm9yIGVucXVldWluZyBjYWxsYmFja3MgdGhhdCBydW4gYXQgbWljcm90YXNrCiAgICAgKiAgIHRpbWluZy4KICAgICAqLwogICAgbWljcm9UYXNrOiB7CgogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgbWljcm90YXNrIHRpbWluZy4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAqIEBwYXJhbSB7IUZ1bmN0aW9uPX0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gcnVuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHVzZWQgZm9yIGNhbmNlbGluZyB0YXNrCiAgICAgICAqLwogICAgICBydW4oY2FsbGJhY2spIHsKICAgICAgICBtaWNyb3Rhc2tOb2RlLnRleHRDb250ZW50ID0gbWljcm90YXNrTm9kZUNvbnRlbnQrKzsKICAgICAgICBtaWNyb3Rhc2tDYWxsYmFja3MucHVzaChjYWxsYmFjayk7CiAgICAgICAgcmV0dXJuIG1pY3JvdGFza0N1cnJIYW5kbGUrKzsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIGEgcHJldmlvdXNseSBlbnF1ZXVlZCBgbWljcm9UYXNrYCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gYHJ1bmAgb2YgY2FsbGJhY2sgdG8gY2FuY2VsCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjYW5jZWwoaGFuZGxlKSB7CiAgICAgICAgY29uc3QgaWR4ID0gaGFuZGxlIC0gbWljcm90YXNrTGFzdEhhbmRsZTsKICAgICAgICBpZiAoaWR4ID49IDApIHsKICAgICAgICAgIGlmICghbWljcm90YXNrQ2FsbGJhY2tzW2lkeF0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFzeW5jIGhhbmRsZTogJyArIGhhbmRsZSk7CiAgICAgICAgICB9CiAgICAgICAgICBtaWNyb3Rhc2tDYWxsYmFja3NbaWR4XSA9IG51bGw7CiAgICAgICAgfQogICAgICB9CgogICAgfQogIH07Cgp9KSgpOwoKCiAgKGZ1bmN0aW9uICgpIHsKCiAgICAndXNlIHN0cmljdCc7CgogICAgLyoqIEBjb25zdCB7IUFzeW5jSW50ZXJmYWNlfSAqLwogICAgY29uc3QgbWljcm90YXNrID0gUG9seW1lci5Bc3luYy5taWNyb1Rhc2s7CgogICAgLyoqCiAgICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgYmFzaWMgbWV0YS1wcm9ncmFtbWluZyBmb3IgY3JlYXRpbmcgb25lCiAgICAgKiBvciBtb3JlIHByb3BlcnR5IGFjY2Vzc29ycyAoZ2V0dGVyL3NldHRlciBwYWlyKSB0aGF0IGVucXVldWUgYW4gYXN5bmMKICAgICAqIChiYXRjaGVkKSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAqCiAgICAgKiBGb3IgYmFzaWMgdXNhZ2Ugb2YgdGhpcyBtaXhpbiwgY2FsbCBgTXlDbGFzcy5jcmVhdGVQcm9wZXJ0aWVzKHByb3BzKWAKICAgICAqIG9uY2UgYXQgY2xhc3MgZGVmaW5pdGlvbiB0aW1lIHRvIGNyZWF0ZSBwcm9wZXJ0eSBhY2Nlc3NvcnMgZm9yIHByb3BlcnRpZXMKICAgICAqIG5hbWVkIGluIHByb3BzLCBpbXBsZW1lbnQgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgdG8gcmVhY3QgYXMgZGVzaXJlZCB0bwogICAgICogcHJvcGVydHkgY2hhbmdlcywgYW5kIGltcGxlbWVudCBgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKWAgYW5kCiAgICAgKiBpbmNsdWRlIGxvd2VyY2FzZSB2ZXJzaW9ucyBvZiBhbnkgcHJvcGVydHkgbmFtZXMgdGhhdCBzaG91bGQgYmUgc2V0IGZyb20KICAgICAqIGF0dHJpYnV0ZXMuIExhc3QsIGNhbGwgYHRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKWAgaW4gdGhlIGVsZW1lbnQncwogICAgICogYGNvbm5lY3RlZENhbGxiYWNrYCB0byBlbmFibGUgdGhlIGFjY2Vzc29ycy4KICAgICAqCiAgICAgKiBAbWl4aW5GdW5jdGlvbgogICAgICogQHBvbHltZXIKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIGZvciByZWFjdGluZyB0byBwcm9wZXJ0eSBjaGFuZ2VzIGZyb20KICAgICAqICAgZ2VuZXJhdGVkIHByb3BlcnR5IGFjY2Vzc29ycy4KICAgICAqLwogICAgUG9seW1lci5Qcm9wZXJ0aWVzQ2hhbmdlZCA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAgIC8qKgogICAgICAgKiBAcG9seW1lcgogICAgICAgKiBAbWl4aW5DbGFzcwogICAgICAgKiBAZXh0ZW5kcyB7c3VwZXJDbGFzc30KICAgICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydGllc0NoYW5nZWR9CiAgICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAgICovCiAgICAgIGNsYXNzIFByb3BlcnRpZXNDaGFuZ2VkIGV4dGVuZHMgc3VwZXJDbGFzcyB7CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgcHJvcGVydHkgYWNjZXNzb3JzIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZXMuCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBwcm9wcyBPYmplY3Qgd2hvc2Uga2V5cyBhcmUgbmFtZXMgb2YgYWNjZXNzb3JzLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgICAgICBjb25zdCBwcm90byA9IHRoaXMucHJvdG90eXBlOwogICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBwcm9wcykgewogICAgICAgICAgICAvLyBkb24ndCBzdG9tcCBhbiBleGlzdGluZyBhY2Nlc3NvcgogICAgICAgICAgICBpZiAoIShwcm9wIGluIHByb3RvKSkgewogICAgICAgICAgICAgIHByb3RvLl9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKHByb3ApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFuIGF0dHJpYnV0ZSBuYW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIFRoZSBhdHRyaWJ1dGUgbmFtZSBpcyB0aGUgbG93ZXJjYXNlZCBwcm9wZXJ0eSBuYW1lLiBPdmVycmlkZSB0bwogICAgICAgICAqIGN1c3RvbWl6ZSB0aGlzIG1hcHBpbmcuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRvIGNvbnZlcnQKICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEF0dHJpYnV0ZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBhdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiBwcm9wZXJ0eS50b0xvd2VyQ2FzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogT3ZlcnJpZGUgcG9pbnQgdG8gcHJvdmlkZSBhIHR5cGUgdG8gd2hpY2ggdG8gZGVzZXJpYWxpemUgYSB2YWx1ZSB0bwogICAgICAgICAqIGEgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBwcm9wZXJ0eQogICAgICAgICAqCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyB0eXBlRm9yUHJvcGVydHkobmFtZSkgeyB9IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgc2V0dGVyL2dldHRlciBwYWlyIGZvciB0aGUgbmFtZWQgcHJvcGVydHkgd2l0aCBpdHMgb3duCiAgICAgICAgICogbG9jYWwgc3RvcmFnZS4gIFRoZSBnZXR0ZXIgcmV0dXJucyB0aGUgdmFsdWUgaW4gdGhlIGxvY2FsIHN0b3JhZ2UsCiAgICAgICAgICogYW5kIHRoZSBzZXR0ZXIgY2FsbHMgYF9zZXRQcm9wZXJ0eWAsIHdoaWNoIHVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2UKICAgICAgICAgKiBmb3IgdGhlIHByb3BlcnR5IGFuZCBlbnF1ZXVlcyBhIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBvbiBhIHByb3RvdHlwZSBvciBhbiBpbnN0YW5jZS4gIENhbGxpbmcKICAgICAgICAgKiB0aGlzIG1ldGhvZCBtYXkgb3ZlcndyaXRlIGEgcHJvcGVydHkgdmFsdWUgdGhhdCBhbHJlYWR5IGV4aXN0cyBvbgogICAgICAgICAqIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgYnkgY3JlYXRpbmcgdGhlIGFjY2Vzc29yLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gcmVhZE9ubHkgV2hlbiB0cnVlLCBubyBzZXR0ZXIgaXMgY3JlYXRlZDsgdGhlCiAgICAgICAgICogICBwcm90ZWN0ZWQgYF9zZXRQcm9wZXJ0eWAgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIHRvIHNldCB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpIHsKICAgICAgICAgIHRoaXMuX2FkZFByb3BlcnR5VG9BdHRyaWJ1dGVNYXAocHJvcGVydHkpOwogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KCdfX2RhdGFIYXNBY2Nlc3NvcicpKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhSGFzQWNjZXNzb3IgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wZXJ0eV0pIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wZXJ0eV0gPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHByb3BlcnR5LCByZWFkT25seSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIHRoZSBnaXZlbiBgcHJvcGVydHlgIHRvIGEgbWFwIG1hdGNoaW5nIGF0dHJpYnV0ZSBuYW1lcwogICAgICAgICAqIHRvIHByb3BlcnR5IG5hbWVzLCB1c2luZyBgYXR0cmlidXRlTmFtZUZvclByb3BlcnR5YC4gVGhpcyBtYXAgaXMKICAgICAgICAgKiB1c2VkIHdoZW4gZGVzZXJpYWxpemluZyBhdHRyaWJ1dGUgdmFsdWVzIHRvIHByb3BlcnRpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKi8KICAgICAgICBfYWRkUHJvcGVydHlUb0F0dHJpYnV0ZU1hcChwcm9wZXJ0eSkgewogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KCdfX2RhdGFBdHRyaWJ1dGVzJykpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFBdHRyaWJ1dGVzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fX2RhdGFBdHRyaWJ1dGVzKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFBdHRyaWJ1dGVzW3Byb3BlcnR5XSkgewogICAgICAgICAgICBjb25zdCBhdHRyID0gdGhpcy5jb25zdHJ1Y3Rvci5hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpOwogICAgICAgICAgICB0aGlzLl9fZGF0YUF0dHJpYnV0ZXNbYXR0cl0gPSBwcm9wZXJ0eTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIERlZmluZXMgYSBwcm9wZXJ0eSBhY2Nlc3NvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHJlYWRPbmx5IFdoZW4gdHJ1ZSwgbm8gc2V0dGVyIGlzIGNyZWF0ZWQKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgICBfZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpIHsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eSwgewogICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogICAgICAgICAgICAvKiogQHRoaXMge1Byb3BlcnRpZXNDaGFuZ2VkfSAqLwogICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFByb3BlcnR5KHByb3BlcnR5KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLyoqIEB0aGlzIHtQcm9wZXJ0aWVzQ2hhbmdlZH0gKi8KICAgICAgICAgICAgc2V0OiByZWFkT25seSA/IGZ1bmN0aW9uICgpIHt9IDogZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgdGhpcy5fc2V0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovCiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgIHRoaXMuX19kYXRhRW5hYmxlZCA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fX2RhdGFSZWFkeSA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fX2RhdGFJbnZhbGlkID0gZmFsc2U7CiAgICAgICAgICB0aGlzLl9fZGF0YSA9IHt9OwogICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcyA9IG51bGw7CiAgICAgICAgICB0aGlzLl9fc2VyaWFsaXppbmcgPSBmYWxzZTsKICAgICAgICAgIHRoaXMuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBMaWZlY3ljbGUgY2FsbGJhY2sgY2FsbGVkIHdoZW4gcHJvcGVydGllcyBhcmUgZW5hYmxlZCB2aWEKICAgICAgICAgKiBgX2VuYWJsZVByb3BlcnRpZXNgLgogICAgICAgICAqCiAgICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gdG8gaW1wbGVtZW50IGJlaGF2aW9yIHRoYXQgaXMKICAgICAgICAgKiBkZXBlbmRlbnQgb24gdGhlIGVsZW1lbnQgaGF2aW5nIGl0cyBwcm9wZXJ0eSBkYXRhIGluaXRpYWxpemVkLCBlLmcuCiAgICAgICAgICogZnJvbSBkZWZhdWx0cyAoaW5pdGlhbGl6ZWQgZnJvbSBgY29uc3RydWN0b3JgLCBgX2luaXRpYWxpemVQcm9wZXJ0aWVzYCksCiAgICAgICAgICogYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AsIG9yIHZhbHVlcyBwcm9wYWdhdGVkIGZyb20gaG9zdCBlLmcuIHZpYQogICAgICAgICAqIGJpbmRpbmdzLiAgYHN1cGVyLnJlYWR5KClgIG11c3QgYmUgY2FsbGVkIHRvIGVuc3VyZSB0aGUgZGF0YSBzeXN0ZW0KICAgICAgICAgKiBiZWNvbWVzIGVuYWJsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwdWJsaWMKICAgICAgICAgKi8KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgIHRoaXMuX19kYXRhUmVhZHkgPSB0cnVlOwogICAgICAgICAgdGhpcy5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJbml0aWFsaXplcyB0aGUgbG9jYWwgc3RvcmFnZSBmb3IgcHJvcGVydHkgYWNjZXNzb3JzLgogICAgICAgICAqCiAgICAgICAgICogUHJvdmlkZWQgYXMgYW4gb3ZlcnJpZGUgcG9pbnQgZm9yIHBlcmZvcm1pbmcgYW55IHNldHVwIHdvcmsgcHJpb3IKICAgICAgICAgKiB0byBpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5IGFjY2Vzc29yIHN5c3RlbS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICAgIC8vIENhcHR1cmUgaW5zdGFuY2UgcHJvcGVydGllczsgdGhlc2Ugd2lsbCBiZSBzZXQgaW50byBhY2Nlc3NvcnMKICAgICAgICAgIC8vIGR1cmluZyBmaXJzdCBmbHVzaC4gRG9uJ3Qgc2V0IHRoZW0gaGVyZSwgc2luY2Ugd2Ugd2FudAogICAgICAgICAgLy8gdGhlc2UgdG8gb3ZlcndyaXRlIGRlZmF1bHRzL2NvbnN0cnVjdG9yIGFzc2lnbm1lbnRzCiAgICAgICAgICBmb3IgKGxldCBwIGluIHRoaXMuX19kYXRhSGFzQWNjZXNzb3IpIHsKICAgICAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkocCkpIHsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgPSB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgfHwge307CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzW3BdID0gdGhpc1twXTsKICAgICAgICAgICAgICBkZWxldGUgdGhpc1twXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGVkIGF0IHJlYWR5IHRpbWUgd2l0aCBiYWcgb2YgaW5zdGFuY2UgcHJvcGVydGllcyB0aGF0IG92ZXJ3cm90ZQogICAgICAgICAqIGFjY2Vzc29ycyB3aGVuIHRoZSBlbGVtZW50IHVwZ3JhZGVkLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGVzZSBwcm9wZXJ0aWVzIGJhY2sgaW50byB0aGUKICAgICAgICAgKiBzZXR0ZXIgYXQgcmVhZHkgdGltZS4gIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGFuIG92ZXJyaWRlCiAgICAgICAgICogcG9pbnQgZm9yIGN1c3RvbWl6aW5nIG9yIHByb3ZpZGluZyBtb3JlIGVmZmljaWVudCBpbml0aWFsaXphdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgcHJvcGVydHkgdmFsdWVzIHRoYXQgd2VyZSBvdmVyd3JpdHRlbgogICAgICAgICAqICAgd2hlbiBjcmVhdGluZyBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2luaXRpYWxpemVJbnN0YW5jZVByb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgcHJvcHMpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVXBkYXRlcyB0aGUgbG9jYWwgc3RvcmFnZSBmb3IgYSBwcm9wZXJ0eSAodmlhIGBfc2V0UGVuZGluZ1Byb3BlcnR5YCkKICAgICAgICAgKiBhbmQgZW5xdWV1ZXMgYSBgX3Byb2VwcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSkgewogICAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpKSB7CiAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICAgICAgICogQHJldHVybiB7Kn0gVmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfZ2V0UHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9fZGF0YVtwcm9wZXJ0eV07CiAgICAgICAgfQoKICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqLwogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2UgZm9yIGEgcHJvcGVydHksIHJlY29yZHMgdGhlIHByZXZpb3VzIHZhbHVlLAogICAgICAgICAqIGFuZCBhZGRzIGl0IHRvIHRoZSBzZXQgb2YgInBlbmRpbmcgY2hhbmdlcyIgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUKICAgICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4gIFRoaXMgbWV0aG9kIGRvZXMgbm90IGVucXVldWUgdGhlCiAgICAgICAgICogYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGV4dCBOb3QgdXNlZCBoZXJlOyBhZmZvcmRhbmNlIGZvciBjbG9zdXJlCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VkCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9zZXRQZW5kaW5nUHJvcGVydHkocHJvcGVydHksIHZhbHVlLCBleHQpIHsKICAgICAgICAgIGxldCBvbGQgPSB0aGlzLl9fZGF0YVtwcm9wZXJ0eV07CiAgICAgICAgICBsZXQgY2hhbmdlZCA9IHRoaXMuX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHByb3BlcnR5LCB2YWx1ZSwgb2xkKTsKICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFQZW5kaW5nKSB7CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0ge307CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFbnN1cmUgb2xkIGlzIGNhcHR1cmVkIGZyb20gdGhlIGxhc3QgdHVybgogICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFPbGQgJiYgIShwcm9wZXJ0eSBpbiB0aGlzLl9fZGF0YU9sZCkpIHsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YU9sZFtwcm9wZXJ0eV0gPSBvbGQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fX2RhdGFbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ1twcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjaGFuZ2VkOwogICAgICAgIH0KICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovCgogICAgICAgIC8qKgogICAgICAgICAqIE1hcmtzIHRoZSBwcm9wZXJ0aWVzIGFzIGludmFsaWQsIGFuZCBlbnF1ZXVlcyBhbiBhc3luYwogICAgICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCkgewogICAgICAgICAgaWYgKCF0aGlzLl9fZGF0YUludmFsaWQgJiYgdGhpcy5fX2RhdGFSZWFkeSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YUludmFsaWQgPSB0cnVlOwogICAgICAgICAgICBtaWNyb3Rhc2sucnVuKCgpID0+IHsKICAgICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFJbnZhbGlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9fZGF0YUludmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsIHRvIGVuYWJsZSBwcm9wZXJ0eSBhY2Nlc3NvciBwcm9jZXNzaW5nLiBCZWZvcmUgdGhpcyBtZXRob2QgaXMKICAgICAgICAgKiBjYWxsZWQgYWNjZXNzb3IgdmFsdWVzIHdpbGwgYmUgc2V0IGJ1dCBzaWRlIGVmZmVjdHMgYXJlCiAgICAgICAgICogcXVldWVkLiBXaGVuIGNhbGxlZCwgYW55IHBlbmRpbmcgc2lkZSBlZmZlY3RzIG9jY3VyIGltbWVkaWF0ZWx5LgogICAgICAgICAqIEZvciBlbGVtZW50cywgZ2VuZXJhbGx5IGBjb25uZWN0ZWRDYWxsYmFja2AgaXMgYSBub3JtYWwgc3BvdCB0byBkbyBzby4KICAgICAgICAgKiBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBtZXRob2QgbXVsdGlwbGUgdGltZXMgYXMgaXQgb25seSB0dXJucyBvbgogICAgICAgICAqIHByb3BlcnR5IGFjY2Vzc29ycyBvbmNlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2VuYWJsZVByb3BlcnRpZXMoKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhRW5hYmxlZCkgewogICAgICAgICAgICB0aGlzLl9fZGF0YUVuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzKSB7CiAgICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZUluc3RhbmNlUHJvcGVydGllcyh0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMpOwogICAgICAgICAgICAgIHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcyA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZWFkeSgpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbHMgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrIHdpdGggdGhlIGN1cnJlbnQgc2V0IG9mCiAgICAgICAgICogcGVuZGluZyBjaGFuZ2VzIChhbmQgb2xkIHZhbHVlcyByZWNvcmRlZCB3aGVuIHBlbmRpbmcgY2hhbmdlcyB3ZXJlCiAgICAgICAgICogc2V0KSwgYW5kIHJlc2V0cyB0aGUgcGVuZGluZyBzZXQgb2YgY2hhbmdlcy4gR2VuZXJhbGx5LCB0aGlzIG1ldGhvZAogICAgICAgICAqIHNob3VsZCBub3QgYmUgY2FsbGVkIGluIHVzZXIgY29kZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9mbHVzaFByb3BlcnRpZXMoKSB7CiAgICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMuX19kYXRhOwogICAgICAgICAgY29uc3QgY2hhbmdlZFByb3BzID0gdGhpcy5fX2RhdGFQZW5kaW5nOwogICAgICAgICAgY29uc3Qgb2xkID0gdGhpcy5fX2RhdGFPbGQ7CiAgICAgICAgICBpZiAodGhpcy5fc2hvdWxkUHJvcGVydGllc0NoYW5nZShwcm9wcywgY2hhbmdlZFByb3BzLCBvbGQpKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllc0NoYW5nZWQocHJvcHMsIGNoYW5nZWRQcm9wcywgb2xkKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCBpbiBgX2ZsdXNoUHJvcGVydGllc2AgdG8gZGV0ZXJtaW5lIGlmIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAgICogc2hvdWxkIGJlIGNhbGxlZC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGlmCiAgICAgICAgICogcHJvcGVydGllcyBhcmUgcGVuZGluZy4gT3ZlcnJpZGUgdG8gY3VzdG9taXplIHdoZW4KICAgICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBpcyBjYWxsZWQuCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBjdXJyZW50UHJvcHMgQmFnIG9mIGFsbCBjdXJyZW50IGFjY2Vzc29yIHZhbHVlcwogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBwcm9wZXJ0aWVzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QKICAgICAgICAgKiAgIGNhbGwgdG8gYF9wcm9wZXJ0aWVzQ2hhbmdlZGAKICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGVhY2ggcHJvcGVydHkKICAgICAgICAgKiAgIGluIGBjaGFuZ2VkUHJvcHNgCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBjaGFuZ2VkUHJvcHMgaXMgdHJ1dGh5CiAgICAgICAgICovCiAgICAgICAgX3Nob3VsZFByb3BlcnRpZXNDaGFuZ2UoY3VycmVudFByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgICAgIHJldHVybiBCb29sZWFuKGNoYW5nZWRQcm9wcyk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBjYWxsZWQgd2hlbiBhbnkgcHJvcGVydGllcyB3aXRoIGFjY2Vzc29ycyBjcmVhdGVkIHZpYQogICAgICAgICAqIGBfY3JlYXRlUHJvcGVydHlBY2Nlc3NvcmAgaGF2ZSBiZWVuIHNldC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY3VycmVudFByb3BzIEJhZyBvZiBhbGwgY3VycmVudCBhY2Nlc3NvciB2YWx1ZXMKICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgcHJvcGVydGllcyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0CiAgICAgICAgICogICBjYWxsIHRvIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBlYWNoIHByb3BlcnR5CiAgICAgICAgICogICBpbiBgY2hhbmdlZFByb3BzYAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9wcm9wZXJ0aWVzQ2hhbmdlZChjdXJyZW50UHJvcHMsIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogTWV0aG9kIGNhbGxlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIHByb3BlcnR5IHZhbHVlIHNob3VsZCBiZQogICAgICAgICAqIGNvbnNpZGVyZWQgYXMgYSBjaGFuZ2UgYW5kIGNhdXNlIHRoZSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjawogICAgICAgICAqIHRvIGJlIGVucXVldWVkLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBgdHJ1ZWAgaWYgYSBzdHJpY3QgZXF1YWxpdHkKICAgICAgICAgKiBjaGVjayBmYWlscy4gVGhlIG1ldGhvZCBhbHdheXMgcmV0dXJucyBmYWxzZSBmb3IgYE5hTmAuCiAgICAgICAgICoKICAgICAgICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBlLmcuIHByb3ZpZGUgc3RyaWN0ZXIgY2hlY2tpbmcgZm9yCiAgICAgICAgICogT2JqZWN0cy9BcnJheXMgd2hlbiB1c2luZyBpbW11dGFibGUgcGF0dGVybnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgTmV3IHByb3BlcnR5IHZhbHVlCiAgICAgICAgICogQHBhcmFtIHsqfSBvbGQgUHJldmlvdXMgcHJvcGVydHkgdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICAgICAqICAgYW5kIGVucXVldWUgYSBgX3Byb2VwcnRpZXNDaGFuZ2VkYCBjYWxsYmFjawogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIC8vIFN0cmljdCBlcXVhbGl0eSBjaGVjawogICAgICAgICAgICAob2xkICE9PSB2YWx1ZSAmJgogICAgICAgICAgICAgIC8vIFRoaXMgZW5zdXJlcyAob2xkPT1OYU4sIHZhbHVlPT1OYU4pIGFsd2F5cyByZXR1cm5zIGZhbHNlCiAgICAgICAgICAgICAgKG9sZCA9PT0gb2xkIHx8IHZhbHVlID09PSB2YWx1ZSkpCiAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50cyBuYXRpdmUgQ3VzdG9tIEVsZW1lbnRzIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvCiAgICAgICAgICogc2V0IGFuIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIHByb3BlcnR5IHZpYSBgX2F0dHJpYnV0ZVRvUHJvcGVydHlgLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUgdGhhdCBjaGFuZ2VkCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgT2xkIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgTmV3IGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZXNwYWNlIEF0dHJpYnV0ZSBuYW1lc3BhY2UuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBTdXBlciBtYXkgb3IgbWF5IG5vdCBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUsIG5hbWVzcGFjZSkgewogICAgICAgICAgaWYgKG9sZCAhPT0gdmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fYXR0cmlidXRlVG9Qcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKSB7CiAgICAgICAgICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRGVzZXJpYWxpemVzIGFuIGF0dHJpYnV0ZSB0byBpdHMgYXNzb2NpYXRlZCBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGNhbGxzIHRoZSBgX2Rlc2VyaWFsaXplVmFsdWVgIG1ldGhvZCB0byBjb252ZXJ0IHRoZSBzdHJpbmcgdG8KICAgICAgICAgKiBhIHR5cGVkIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBOYW1lIG9mIGF0dHJpYnV0ZSB0byBkZXNlcmlhbGl6ZS4KICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAgICogQHBhcmFtIHsqPX0gdHlwZSB0eXBlIHRvIGRlc2VyaWFsaXplIHRvLCBkZWZhdWx0cyB0byB0aGUgdmFsdWUKICAgICAgICAgKiByZXR1cm5lZCBmcm9tIGB0eXBlRm9yUHJvcGVydHlgCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfYXR0cmlidXRlVG9Qcm9wZXJ0eShhdHRyaWJ1dGUsIHZhbHVlLCB0eXBlKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19zZXJpYWxpemluZykgewogICAgICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9fZGF0YUF0dHJpYnV0ZXM7CiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gbWFwICYmIG1hcFthdHRyaWJ1dGVdIHx8IGF0dHJpYnV0ZTsKICAgICAgICAgICAgdGhpc1twcm9wZXJ0eV0gPSB0aGlzLl9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlIHx8CiAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci50eXBlRm9yUHJvcGVydHkocHJvcGVydHkpKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFNlcmlhbGl6ZXMgYSBwcm9wZXJ0eSB0byBpdHMgYXNzb2NpYXRlZCBhdHRyaWJ1dGUuCiAgICAgICAgICoKICAgICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30gQ2xvc3VyZSBjYW4ndCBmaWd1cmUgb3V0IGB0aGlzYCBpcyBhbiBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUgdG8gcmVmbGVjdC4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZz19IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byByZWZsZWN0IHRvLgogICAgICAgICAqIEBwYXJhbSB7Kj19IHZhbHVlIFByb3BlcnR5IHZhbHVlIHRvIHJlZmVjdC4KICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBhdHRyaWJ1dGUsIHZhbHVlKSB7CiAgICAgICAgICB0aGlzLl9fc2VyaWFsaXppbmcgPSB0cnVlOwogICAgICAgICAgdmFsdWUgPSAoYXJndW1lbnRzLmxlbmd0aCA8IDMpID8gdGhpc1twcm9wZXJ0eV0gOiB2YWx1ZTsKICAgICAgICAgIHRoaXMuX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0aGlzKSwgdmFsdWUsCiAgICAgICAgICAgIGF0dHJpYnV0ZSB8fCB0aGlzLmNvbnN0cnVjdG9yLmF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShwcm9wZXJ0eSkpOwogICAgICAgICAgdGhpcy5fX3NlcmlhbGl6aW5nID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIGEgdHlwZWQgdmFsdWUgdG8gYW4gSFRNTCBhdHRyaWJ1dGUgb24gYSBub2RlLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgY2FsbHMgdGhlIGBfc2VyaWFsaXplVmFsdWVgIG1ldGhvZCB0byBjb252ZXJ0IHRoZSB0eXBlZAogICAgICAgICAqIHZhbHVlIHRvIGEgc3RyaW5nLiAgSWYgdGhlIGBfc2VyaWFsaXplVmFsdWVgIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgLAogICAgICAgICAqIHRoZSBhdHRyaWJ1dGUgd2lsbCBiZSByZW1vdmVkICh0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciBib29sZWFuCiAgICAgICAgICogdHlwZSBgZmFsc2VgKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIHNldCBhdHRyaWJ1dGUgdG8uCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXJpYWxpemUuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byBzZXJpYWxpemUgdG8uCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfdmFsdWVUb05vZGVBdHRyaWJ1dGUobm9kZSwgdmFsdWUsIGF0dHJpYnV0ZSkgewogICAgICAgICAgY29uc3Qgc3RyID0gdGhpcy5fc2VyaWFsaXplVmFsdWUodmFsdWUpOwogICAgICAgICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHN0cik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBhIHR5cGVkIEphdmFTY3JpcHQgdmFsdWUgdG8gYSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBzZXR0aW5nIEpTIHByb3BlcnR5IHZhbHVlcyB0bwogICAgICAgICAqIEhUTUwgYXR0cmlidXRlcy4gIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlCiAgICAgICAgICogc2VyaWFsaXphdGlvbiBmb3IgY3VzdG9tIHR5cGVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSB0byBzZXJpYWxpemUuCiAgICAgICAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTdHJpbmcgc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZAogICAgICAgICAqIHByb3BlcnR5ICB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBfc2VyaWFsaXplVmFsdWUodmFsdWUpIHsKICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7CiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA/ICcnIDogdW5kZWZpbmVkOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6IHVuZGVmaW5lZDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHJlYWRpbmcgSFRNTCBhdHRyaWJ1dGUgdmFsdWVzIHRvCiAgICAgICAgICogSlMgcHJvcGVydGllcy4gIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlCiAgICAgICAgICogZGVzZXJpYWxpemF0aW9uIGZvciBjdXN0b20gYHR5cGVgcy4gVHlwZXMgZm9yIGBCb29sZWFuYCwgYFN0cmluZ2AsCiAgICAgICAgICogYW5kIGBOdW1iZXJgIGNvbnZlcnQgYXR0cmlidXRlcyB0byB0aGUgZXhwZWN0ZWQgdHlwZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIFZhbHVlIHRvIGRlc2VyaWFsaXplLgogICAgICAgICAqIEBwYXJhbSB7Kj19IHR5cGUgVHlwZSB0byBkZXNlcmlhbGl6ZSB0aGUgc3RyaW5nIHRvLgogICAgICAgICAqIEByZXR1cm4geyp9IFR5cGVkIHZhbHVlIGRlc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZCBzdHJpbmcuCiAgICAgICAgICovCiAgICAgICAgX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpIHsKICAgICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAgICBjYXNlIEJvb2xlYW46CiAgICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSAhPT0gbnVsbCk7CiAgICAgICAgICAgIGNhc2UgTnVtYmVyOgogICAgICAgICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICB9CgogICAgICByZXR1cm4gUHJvcGVydGllc0NoYW5nZWQ7CiAgICB9KTsKCgogIH0pKCk7CgoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgY2FzZU1hcCA9IFBvbHltZXIuQ2FzZU1hcDsKCiAgLy8gU2F2ZSBtYXAgb2YgbmF0aXZlIHByb3BlcnRpZXM7IHRoaXMgZm9ybXMgYSBibGFja2xpc3Qgb3IgcHJvcGVydGllcwogIC8vIHRoYXQgd29uJ3QgaGF2ZSB0aGVpciB2YWx1ZXMgInNhdmVkIiBieSBgc2F2ZUFjY2Vzc29yVmFsdWVgLCBzaW5jZQogIC8vIHJlYWRpbmcgZnJvbSBhbiBIVE1MRWxlbWVudCBhY2Nlc3NvciBmcm9tIHRoZSBjb250ZXh0IG9mIGEgcHJvdG90eXBlIHRocm93cwogIGNvbnN0IG5hdGl2ZVByb3BlcnRpZXMgPSB7fTsKICBsZXQgcHJvdG8gPSBIVE1MRWxlbWVudC5wcm90b3R5cGU7CiAgd2hpbGUgKHByb3RvKSB7CiAgICBsZXQgcHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90byk7CiAgICBmb3IgKGxldCBpPTA7IGk8cHJvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgbmF0aXZlUHJvcGVydGllc1twcm9wc1tpXV0gPSB0cnVlOwogICAgfQogICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogIH0KCiAgLyoqCiAgICogVXNlZCB0byBzYXZlIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBvdmVycmlkZGVuIHdpdGgKICAgKiBhbiBhY2Nlc3Nvci4gSWYgdGhlIGBtb2RlbGAgaXMgYSBwcm90b3R5cGUsIHRoZSB2YWx1ZXMgd2lsbCBiZSBzYXZlZAogICAqIGluIGBfX2RhdGFQcm90b2AsIGFuZCBpdCdzIHVwIHRvIHRoZSB1c2VyIChvciBkb3duc3RyZWFtIG1peGluKSB0bwogICAqIGRlY2lkZSBob3cvd2hlbiB0byBzZXQgdGhlc2UgdmFsdWVzIGJhY2sgaW50byB0aGUgYWNjZXNzb3JzLgogICAqIElmIGBtb2RlbGAgaXMgYWxyZWFkeSBhbiBpbnN0YW5jZSAoaXQgaGFzIGEgYF9fZGF0YWAgcHJvcGVydHkpLCB0aGVuCiAgICogdGhlIHZhbHVlIHdpbGwgYmUgc2V0IGFzIGEgcGVuZGluZyBwcm9wZXJ0eSwgbWVhbmluZyB0aGUgdXNlciBzaG91bGQKICAgKiBjYWxsIGBfaW52YWxpZGF0ZVByb3BlcnRpZXNgIG9yIGBfZmx1c2hQcm9wZXJ0aWVzYCB0byB0YWtlIGVmZmVjdAogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IG1vZGVsIFByb3RvdHlwZSBvciBpbnN0YW5jZQogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNhdmVBY2Nlc3NvclZhbHVlKG1vZGVsLCBwcm9wZXJ0eSkgewogICAgLy8gRG9uJ3QgcmVhZC9zdG9yZSB2YWx1ZSBmb3IgYW55IG5hdGl2ZSBwcm9wZXJ0aWVzIHNpbmNlIHRoZXkgY291bGQgdGhyb3cKICAgIGlmICghbmF0aXZlUHJvcGVydGllc1twcm9wZXJ0eV0pIHsKICAgICAgbGV0IHZhbHVlID0gbW9kZWxbcHJvcGVydHldOwogICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIGlmIChtb2RlbC5fX2RhdGEpIHsKICAgICAgICAgIC8vIEFkZGluZyBhY2Nlc3NvciB0byBpbnN0YW5jZTsgdXBkYXRlIHRoZSBwcm9wZXJ0eQogICAgICAgICAgLy8gSXQgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBjYWxsIF9mbHVzaFByb3BlcnRpZXMKICAgICAgICAgIG1vZGVsLl9zZXRQZW5kaW5nUHJvcGVydHkocHJvcGVydHksIHZhbHVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gQWRkaW5nIGFjY2Vzc29yIHRvIHByb3RvOyBzYXZlIHByb3RvJ3MgdmFsdWUgZm9yIGluc3RhbmNlLXRpbWUgdXNlCiAgICAgICAgICBpZiAoIW1vZGVsLl9fZGF0YVByb3RvKSB7CiAgICAgICAgICAgIG1vZGVsLl9fZGF0YVByb3RvID0ge307CiAgICAgICAgICB9IGVsc2UgaWYgKCFtb2RlbC5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX2RhdGFQcm90bycsIG1vZGVsKSkpIHsKICAgICAgICAgICAgbW9kZWwuX19kYXRhUHJvdG8gPSBPYmplY3QuY3JlYXRlKG1vZGVsLl9fZGF0YVByb3RvKTsKICAgICAgICAgIH0KICAgICAgICAgIG1vZGVsLl9fZGF0YVByb3RvW3Byb3BlcnR5XSA9IHZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIGJhc2ljIG1ldGEtcHJvZ3JhbW1pbmcgZm9yIGNyZWF0aW5nIG9uZQogICAqIG9yIG1vcmUgcHJvcGVydHkgYWNjZXNzb3JzIChnZXR0ZXIvc2V0dGVyIHBhaXIpIHRoYXQgZW5xdWV1ZSBhbiBhc3luYwogICAqIChiYXRjaGVkKSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgKgogICAqIEZvciBiYXNpYyB1c2FnZSBvZiB0aGlzIG1peGluOgogICAqIAogICAqIC0gICBEZWNsYXJlIGF0dHJpYnV0ZXMgdG8gb2JzZXJ2ZSB2aWEgdGhlIHN0YW5kYXJkIGBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpYC4gVXNlCiAgICogICAgIGBkYXNoLWNhc2VgIGF0dHJpYnV0ZSBuYW1lcyB0byByZXByZXNlbnQgYGNhbWVsQ2FzZWAgcHJvcGVydHkgbmFtZXMuIAogICAqIC0gICBJbXBsZW1lbnQgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrIG9uIHRoZSBjbGFzcy4KICAgKiAtICAgQ2FsbCBgTXlDbGFzcy5jcmVhdGVQcm9wZXJ0aWVzRm9yQXR0cmlidXRlcygpYCAqKm9uY2UqKiBvbiB0aGUgY2xhc3MgdG8gZ2VuZXJhdGUgCiAgICogICAgIHByb3BlcnR5IGFjY2Vzc29ycyBmb3IgZWFjaCBvYnNlcnZlZCBhdHRyaWJ1dGUuIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCAKICAgKiAgICAgaW5zdGFuY2UgaXMgY3JlYXRlZCwgZm9yIGV4YW1wbGUsIGJ5IGNhbGxpbmcgaXQgYmVmb3JlIGNhbGxpbmcgYGN1c3RvbUVsZW1lbnRzLmRlZmluZWAuCiAgICogICAgIEl0IGNhbiBhbHNvIGJlIGNhbGxlZCBsYXppbHkgZnJvbSB0aGUgZWxlbWVudCdzIGBjb25zdHJ1Y3RvcmAsIGFzIGxvbmcgYXMgaXQncyBndWFyZGVkIHNvCiAgICogICAgIHRoYXQgdGhlIGNhbGwgaXMgb25seSBtYWRlIG9uY2UsIHdoZW4gdGhlIGZpcnN0IGluc3RhbmNlIGlzIGNyZWF0ZWQuCiAgICogLSAgIENhbGwgYHRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKWAgaW4gdGhlIGVsZW1lbnQncyBgY29ubmVjdGVkQ2FsbGJhY2tgIHRvIGVuYWJsZSAKICAgKiAgICAgdGhlIGFjY2Vzc29ycy4KICAgKgogICAqIEFueSBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUKICAgKiBkZXNlcmlhbGl6ZWQgdmlhIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIGFuZCBzZXQgdG8gdGhlIGFzc29jaWF0ZWQKICAgKiBwcm9wZXJ0eSB1c2luZyBgZGFzaC1jYXNlYC10by1gY2FtZWxDYXNlYCBjb252ZW50aW9uLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0aWVzQ2hhbmdlZAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiBmb3IgcmVhY3RpbmcgdG8gcHJvcGVydHkgY2hhbmdlcyBmcm9tCiAgICogICBnZW5lcmF0ZWQgcHJvcGVydHkgYWNjZXNzb3JzLgogICAqLwogIFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtzdXBlckNsYXNzfQogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydGllc0NoYW5nZWR9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICAgY29uc3QgYmFzZSA9IFBvbHltZXIuUHJvcGVydGllc0NoYW5nZWQoc3VwZXJDbGFzcyk7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5QWNjZXNzb3JzfQogICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIFByb3BlcnR5QWNjZXNzb3JzIGV4dGVuZHMgYmFzZSB7CgogICAgICAvKioKICAgICAgICogR2VuZXJhdGVzIHByb3BlcnR5IGFjY2Vzc29ycyBmb3IgYWxsIGF0dHJpYnV0ZXMgaW4gdGhlIHN0YW5kYXJkCiAgICAgICAqIHN0YXRpYyBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBhcnJheS4KICAgICAgICoKICAgICAgICogQXR0cmlidXRlIG5hbWVzIGFyZSBtYXBwZWQgdG8gcHJvcGVydHkgbmFtZXMgdXNpbmcgdGhlIGBkYXNoLWNhc2VgIHRvCiAgICAgICAqIGBjYW1lbENhc2VgIGNvbnZlbnRpb24KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzRm9yQXR0cmlidXRlcygpIHsKICAgICAgICBsZXQgYSQgPSB0aGlzLm9ic2VydmVkQXR0cmlidXRlczsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBhJC5sZW5ndGg7IGkrKykgewogICAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZVByb3BlcnR5QWNjZXNzb3IoY2FzZU1hcC5kYXNoVG9DYW1lbENhc2UoYSRbaV0pKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGFuIGF0dHJpYnV0ZSBuYW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKiBCeSBkZWZhdWx0LCBjb252ZXJ0cyBjYW1lbCB0byBkYXNoIGNhc2UsIGUuZy4gYGZvb0JhcmAgdG8gYGZvby1iYXJgLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgdG8gY29udmVydAogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEF0dHJpYnV0ZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIGNhc2VNYXAuY2FtZWxUb0Rhc2hDYXNlKHByb3BlcnR5KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBQcm9wZXJ0aWVzQ2hhbmdlZCBpbXBsZW1lbnRhdGlvbiB0byBpbml0aWFsaXplIHZhbHVlcyBmb3IKICAgICAgICogYWNjZXNzb3JzIGNyZWF0ZWQgZm9yIHZhbHVlcyB0aGF0IGFscmVhZHkgZXhpc3RlZCBvbiB0aGUgZWxlbWVudAogICAgICAgKiBwcm90b3R5cGUuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICBpZiAodGhpcy5fX2RhdGFQcm90bykgewogICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVByb3RvUHJvcGVydGllcyh0aGlzLl9fZGF0YVByb3RvKTsKICAgICAgICAgIHRoaXMuX19kYXRhUHJvdG8gPSBudWxsOwogICAgICAgIH0KICAgICAgICBzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCBhdCBpbnN0YW5jZSB0aW1lIHdpdGggYmFnIG9mIHByb3BlcnRpZXMgdGhhdCB3ZXJlIG92ZXJ3cml0dGVuCiAgICAgICAqIGJ5IGFjY2Vzc29ycyBvbiB0aGUgcHJvdG90eXBlIHdoZW4gYWNjZXNzb3JzIHdlcmUgY3JlYXRlZC4KICAgICAgICoKICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGVzZSBwcm9wZXJ0aWVzIGJhY2sgaW50byB0aGUKICAgICAgICogc2V0dGVyIGF0IGluc3RhbmNlIHRpbWUuICBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBhbiBvdmVycmlkZQogICAgICAgKiBwb2ludCBmb3IgY3VzdG9taXppbmcgb3IgcHJvdmlkaW5nIG1vcmUgZWZmaWNpZW50IGluaXRpYWxpemF0aW9uLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIHByb3BlcnR5IHZhbHVlcyB0aGF0IHdlcmUgb3ZlcndyaXR0ZW4KICAgICAgICogICB3aGVuIGNyZWF0aW5nIHByb3BlcnR5IGFjY2Vzc29ycy4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm90b1Byb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICBmb3IgKGxldCBwIGluIHByb3BzKSB7CiAgICAgICAgICB0aGlzLl9zZXRQcm9wZXJ0eShwLCBwcm9wc1twXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRW5zdXJlcyB0aGUgZWxlbWVudCBoYXMgdGhlIGdpdmVuIGF0dHJpYnV0ZS4gSWYgaXQgZG9lcyBub3QsCiAgICAgICAqIGFzc2lnbnMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAqCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBDbG9zdXJlIGNhbid0IGZpZ3VyZSBvdXQgYHRoaXNgIGlzIGluZmFjdCBhbiBlbGVtZW50CiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgTmFtZSBvZiBhdHRyaWJ1dGUgdG8gZW5zdXJlIGlzIHNldC4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfZW5zdXJlQXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpIHsKICAgICAgICBjb25zdCBlbCA9IC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0aGlzKTsKICAgICAgICBpZiAoIWVsLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpKSB7CiAgICAgICAgICB0aGlzLl92YWx1ZVRvTm9kZUF0dHJpYnV0ZShlbCwgdmFsdWUsIGF0dHJpYnV0ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIFByb3BlcnRpZXNDaGFuZ2VkIGltcGxlbWVudGlvbiB0byBzZXJpYWxpemUgb2JqZWN0cyBhcyBKU09OLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFByb3BlcnR5IHZhbHVlIHRvIHNlcmlhbGl6ZS4KICAgICAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTdHJpbmcgc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZCBwcm9wZXJ0eSB2YWx1ZS4KICAgICAgICovCiAgICAgIF9zZXJpYWxpemVWYWx1ZSh2YWx1ZSkgewogICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWZhbGx0aHJvdWdoICovCiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHsKICAgICAgICAgIGNhc2UgJ29iamVjdCc6CiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHsKICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpOwogICAgICAgICAgICAgIH0gY2F0Y2goeCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBzdXBlci5fc2VyaWFsaXplVmFsdWUodmFsdWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFBvbHltZXIgd2hlbiByZWFkaW5nIEhUTUwgYXR0cmlidXRlIHZhbHVlcyB0bwogICAgICAgKiBKUyBwcm9wZXJ0aWVzLiAgVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9uIFBvbHltZXIgZWxlbWVudAogICAgICAgKiBwcm90b3R5cGVzIHRvIHByb3ZpZGUgZGVzZXJpYWxpemF0aW9uIGZvciBjdXN0b20gYHR5cGVgcy4gIE5vdGUsCiAgICAgICAqIHRoZSBgdHlwZWAgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBgdHlwZWAgZmllbGQgcHJvdmlkZWQgaW4gdGhlCiAgICAgICAqIGBwcm9wZXJ0aWVzYCBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgYSBnaXZlbiBwcm9wZXJ0eSwgYW5kIGlzCiAgICAgICAqIGJ5IGNvbnZlbnRpb24gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdHlwZSB0byBkZXNlcmlhbGl6ZS4KICAgICAgICoKICAgICAgICoKICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUgdG8gZGVzZXJpYWxpemUuCiAgICAgICAqIEBwYXJhbSB7Kj19IHR5cGUgVHlwZSB0byBkZXNlcmlhbGl6ZSB0aGUgc3RyaW5nIHRvLgogICAgICAgKiBAcmV0dXJuIHsqfSBUeXBlZCB2YWx1ZSBkZXNlcmlhbGl6ZWQgZnJvbSB0aGUgcHJvdmlkZWQgc3RyaW5nLgogICAgICAgKi8KICAgICAgX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpIHsKICAgICAgICAvKioKICAgICAgICAgKiBAdHlwZSB7Kn0KICAgICAgICAgKi8KICAgICAgICBsZXQgb3V0VmFsdWU7CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICBjYXNlIE9iamVjdDoKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBvdXRWYWx1ZSA9IEpTT04ucGFyc2UoLyoqIEB0eXBlIHtzdHJpbmd9ICovKHZhbHVlKSk7CiAgICAgICAgICAgIH0gY2F0Y2goeCkgewogICAgICAgICAgICAgIC8vIGFsbG93IG5vbi1KU09OIGxpdGVyYWxzIGxpa2UgU3RyaW5ncyBhbmQgTnVtYmVycwogICAgICAgICAgICAgIG91dFZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIEFycmF5OgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIG91dFZhbHVlID0gSlNPTi5wYXJzZSgvKiogQHR5cGUge3N0cmluZ30gKi8odmFsdWUpKTsKICAgICAgICAgICAgfSBjYXRjaCh4KSB7CiAgICAgICAgICAgICAgb3V0VmFsdWUgPSBudWxsOwogICAgICAgICAgICAgIGNvbnNvbGUud2FybihgUG9seW1lcjo6QXR0cmlidXRlczogY291bGRuJ3QgZGVjb2RlIEFycmF5IGFzIEpTT046ICR7dmFsdWV9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIERhdGU6CiAgICAgICAgICAgIG91dFZhbHVlID0gaXNOYU4odmFsdWUpID8gU3RyaW5nKHZhbHVlKSA6IE51bWJlcih2YWx1ZSk7CiAgICAgICAgICAgIG91dFZhbHVlID0gbmV3IERhdGUob3V0VmFsdWUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIG91dFZhbHVlID0gc3VwZXIuX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dFZhbHVlOwogICAgICB9CiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tZmFsbHRocm91Z2ggKi8KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgUHJvcGVydGllc0NoYW5nZWQgaW1wbGVtZW50YXRpb24gdG8gc2F2ZSBleGlzdGluZyBwcm90b3R5cGUKICAgICAgICogcHJvcGVydHkgdmFsdWUgc28gdGhhdCBpdCBjYW4gYmUgcmVzZXQuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSByZWFkT25seSBXaGVuIHRydWUsIG5vIHNldHRlciBpcyBjcmVhdGVkCiAgICAgICAqCiAgICAgICAqIFdoZW4gY2FsbGluZyBvbiBhIHByb3RvdHlwZSwgYW55IG92ZXJ3cml0dGVuIHZhbHVlcyBhcmUgc2F2ZWQgaW4KICAgICAgICogYF9fZGF0YVByb3RvYCwgYW5kIGl0IGlzIHVwIHRvIHRoZSBzdWJjbGFzc2VyIHRvIGRlY2lkZSBob3cvd2hlbgogICAgICAgKiB0byBzZXQgdGhvc2UgcHJvcGVydGllcyBiYWNrIGludG8gdGhlIGFjY2Vzc29yLiAgV2hlbiBjYWxsaW5nIG9uIGFuCiAgICAgICAqIGluc3RhbmNlLCB0aGUgb3ZlcndyaXR0ZW4gdmFsdWUgaXMgc2V0IHZpYSBgX3NldFBlbmRpbmdQcm9wZXJ0eWAsCiAgICAgICAqIGFuZCB0aGUgdXNlciBzaG91bGQgY2FsbCBgX2ludmFsaWRhdGVQcm9wZXJ0aWVzYCBvciBgX2ZsdXNoUHJvcGVydGllc2AKICAgICAgICogZm9yIHRoZSB2YWx1ZXMgdG8gdGFrZSBlZmZlY3QuCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHByb3BlcnR5LCByZWFkT25seSkgewogICAgICAgIHNhdmVBY2Nlc3NvclZhbHVlKHRoaXMsIHByb3BlcnR5KTsKICAgICAgICBzdXBlci5fZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbGlicmFyeSBjcmVhdGVkIGFuIGFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYW4gYWNjZXNzb3Igd2FzIGNyZWF0ZWQKICAgICAgICovCiAgICAgIF9oYXNBY2Nlc3Nvcihwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yICYmIHRoaXMuX19kYXRhSGFzQWNjZXNzb3JbcHJvcGVydHldOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaGFzIGEgcGVuZGluZyBjaGFuZ2UuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBwcm9wZXJ0eSBoYXMgYSBwZW5kaW5nIGNoYW5nZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfaXNQcm9wZXJ0eVBlbmRpbmcocHJvcCkgewogICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuX19kYXRhUGVuZGluZyAmJiAocHJvcCBpbiB0aGlzLl9fZGF0YVBlbmRpbmcpKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gUHJvcGVydHlBY2Nlc3NvcnM7CgogIH0pOwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCwgTm9kZUZpbHRlci5TSE9XX0FMTCwKICAgICAgbnVsbCwgZmFsc2UpOwoKICAvLyAxLnggYmFja3dhcmRzLWNvbXBhdGlibGUgYXV0by13cmFwcGVyIGZvciB0ZW1wbGF0ZSB0eXBlIGV4dGVuc2lvbnMKICAvLyBUaGlzIGlzIGEgY2xlYXIgbGF5ZXJpbmcgdmlvbGF0aW9uIGFuZCBnaXZlcyBmYXZvcmVkLW5hdGlvbiBzdGF0dXMgdG8KICAvLyBkb20taWYgYW5kIGRvbS1yZXBlYXQgdGVtcGxhdGVzLiAgVGhpcyBpcyBhIGNvbmNlaXQgd2UncmUgY2hvb3NpbmcgdG8ga2VlcAogIC8vIGEuKSB0byBlYXNlIDEueCBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBkdWUgdG8gbG9zcyBvZiBgaXNgLCBhbmQKICAvLyBiLikgdG8gbWFpbnRhaW4gaWYvcmVwZWF0IGNhcGFiaWxpdHkgaW4gcGFyc2VyLWNvbnN0cmFpbmVkIGVsZW1lbnRzCiAgLy8gICAgIChlLmcuIHRhYmxlLCBzZWxlY3QpIGluIGxpZXUgb2YgbmF0aXZlIENFIHR5cGUgZXh0ZW5zaW9ucyB3aXRob3V0CiAgLy8gICAgIG1hc3NpdmUgbmV3IGludmVudGlvbiBpbiB0aGlzIHNwYWNlIChlLmcuIGRpcmVjdGl2ZSBzeXN0ZW0pCiAgY29uc3QgdGVtcGxhdGVFeHRlbnNpb25zID0gewogICAgJ2RvbS1pZic6IHRydWUsCiAgICAnZG9tLXJlcGVhdCc6IHRydWUKICB9OwogIGZ1bmN0aW9uIHdyYXBUZW1wbGF0ZUV4dGVuc2lvbihub2RlKSB7CiAgICBsZXQgaXMgPSBub2RlLmdldEF0dHJpYnV0ZSgnaXMnKTsKICAgIGlmIChpcyAmJiB0ZW1wbGF0ZUV4dGVuc2lvbnNbaXNdKSB7CiAgICAgIGxldCB0ID0gbm9kZTsKICAgICAgdC5yZW1vdmVBdHRyaWJ1dGUoJ2lzJyk7CiAgICAgIG5vZGUgPSB0Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChpcyk7CiAgICAgIHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobm9kZSwgdCk7CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodCk7CiAgICAgIHdoaWxlKHQuYXR0cmlidXRlcy5sZW5ndGgpIHsKICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSh0LmF0dHJpYnV0ZXNbMF0ubmFtZSwgdC5hdHRyaWJ1dGVzWzBdLnZhbHVlKTsKICAgICAgICB0LnJlbW92ZUF0dHJpYnV0ZSh0LmF0dHJpYnV0ZXNbMF0ubmFtZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gZmluZFRlbXBsYXRlTm9kZShyb290LCBub2RlSW5mbykgewogICAgLy8gcmVjdXJzaXZlbHkgYXNjZW5kIHRyZWUgdW50aWwgd2UgaGl0IHJvb3QKICAgIGxldCBwYXJlbnQgPSBub2RlSW5mby5wYXJlbnRJbmZvICYmIGZpbmRUZW1wbGF0ZU5vZGUocm9vdCwgbm9kZUluZm8ucGFyZW50SW5mbyk7CiAgICAvLyB1bndpbmQgdGhlIHN0YWNrLCByZXR1cm5pbmcgdGhlIGluZGV4ZWQgbm9kZSBhdCBlYWNoIGxldmVsCiAgICBpZiAocGFyZW50KSB7CiAgICAgIC8vIG5vdGU6IG1hcmdpbmFsbHkgZmFzdGVyIHRoYW4gaW5kZXhpbmcgdmlhIGNoaWxkTm9kZXMKICAgICAgLy8gKGh0dHA6Ly9qc3BlcmYuY29tL2NoaWxkbm9kZXMtbG9va3VwKQogICAgICB3YWxrZXIuY3VycmVudE5vZGUgPSBwYXJlbnQ7CiAgICAgIGZvciAobGV0IG49d2Fsa2VyLmZpcnN0Q2hpbGQoKSwgaT0wOyBuOyBuPXdhbGtlci5uZXh0U2libGluZygpKSB7CiAgICAgICAgaWYgKG5vZGVJbmZvLnBhcmVudEluZGV4ID09PSBpKyspIHsKICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgfQoKICAvLyBjb25zdHJ1Y3QgYCRgIG1hcCAoZnJvbSBpZCBhbm5vdGF0aW9ucykKICBmdW5jdGlvbiBhcHBseUlkVG9NYXAoaW5zdCwgbWFwLCBub2RlLCBub2RlSW5mbykgewogICAgaWYgKG5vZGVJbmZvLmlkKSB7CiAgICAgIG1hcFtub2RlSW5mby5pZF0gPSBub2RlOwogICAgfQogIH0KCiAgLy8gaW5zdGFsbCBldmVudCBsaXN0ZW5lcnMgKGZyb20gZXZlbnQgYW5ub3RhdGlvbnMpCiAgZnVuY3Rpb24gYXBwbHlFdmVudExpc3RlbmVyKGluc3QsIG5vZGUsIG5vZGVJbmZvKSB7CiAgICBpZiAobm9kZUluZm8uZXZlbnRzICYmIG5vZGVJbmZvLmV2ZW50cy5sZW5ndGgpIHsKICAgICAgZm9yIChsZXQgaj0wLCBlJD1ub2RlSW5mby5ldmVudHMsIGU7IChqPGUkLmxlbmd0aCkgJiYgKGU9ZSRbal0pOyBqKyspIHsKICAgICAgICBpbnN0Ll9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGUubmFtZSwgZS52YWx1ZSwgaW5zdCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIHB1c2ggY29uZmlndXJhdGlvbiByZWZlcmVuY2VzIGF0IGNvbmZpZ3VyZSB0aW1lCiAgZnVuY3Rpb24gYXBwbHlUZW1wbGF0ZUNvbnRlbnQoaW5zdCwgbm9kZSwgbm9kZUluZm8pIHsKICAgIGlmIChub2RlSW5mby50ZW1wbGF0ZUluZm8pIHsKICAgICAgbm9kZS5fdGVtcGxhdGVJbmZvID0gbm9kZUluZm8udGVtcGxhdGVJbmZvOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlTm9kZUV2ZW50SGFuZGxlcihjb250ZXh0LCBldmVudE5hbWUsIG1ldGhvZE5hbWUpIHsKICAgIC8vIEluc3RhbmNlcyBjYW4gb3B0aW9uYWxseSBoYXZlIGEgX21ldGhvZEhvc3Qgd2hpY2ggYWxsb3dzIHJlZGlyZWN0aW5nIHdoZXJlCiAgICAvLyB0byBmaW5kIG1ldGhvZHMuIEN1cnJlbnRseSB1c2VkIGJ5IGB0ZW1wbGF0aXplYC4KICAgIGNvbnRleHQgPSBjb250ZXh0Ll9tZXRob2RIb3N0IHx8IGNvbnRleHQ7CiAgICBsZXQgaGFuZGxlciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKGNvbnRleHRbbWV0aG9kTmFtZV0pIHsKICAgICAgICBjb250ZXh0W21ldGhvZE5hbWVdKGUsIGUuZGV0YWlsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zb2xlLndhcm4oJ2xpc3RlbmVyIG1ldGhvZCBgJyArIG1ldGhvZE5hbWUgKyAnYCBub3QgZGVmaW5lZCcpOwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIGhhbmRsZXI7CiAgfQoKICAvKioKICAgKiBFbGVtZW50IG1peGluIHRoYXQgcHJvdmlkZXMgYmFzaWMgdGVtcGxhdGUgcGFyc2luZyBhbmQgc3RhbXBpbmcsIGluY2x1ZGluZwogICAqIHRoZSBmb2xsb3dpbmcgdGVtcGxhdGUtcmVsYXRlZCBmZWF0dXJlcyBmb3Igc3RhbXBlZCB0ZW1wbGF0ZXM6CiAgICoKICAgKiAtIERlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycyAoYG9uLWV2ZW50bmFtZT0ibGlzdGVuZXIiYCkKICAgKiAtIE1hcCBvZiBub2RlIGlkJ3MgdG8gc3RhbXBlZCBub2RlIGluc3RhbmNlcyAoYHRoaXMuJC5pZGApCiAgICogLSBOZXN0ZWQgdGVtcGxhdGUgY29udGVudCBjYWNoaW5nL3JlbW92YWwgYW5kIHJlLWluc3RhbGxhdGlvbiAocGVyZm9ybWFuY2UKICAgKiAgIG9wdGltaXphdGlvbikKICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBiYXNpYyB0ZW1wbGF0ZSBwYXJzaW5nIGFuZCBzdGFtcGluZwogICAqLwogIFBvbHltZXIuVGVtcGxhdGVTdGFtcCA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfVGVtcGxhdGVTdGFtcH0KICAgICAqLwogICAgY2xhc3MgVGVtcGxhdGVTdGFtcCBleHRlbmRzIHN1cGVyQ2xhc3MgewoKICAgICAgLyoqCiAgICAgICAqIFNjYW5zIGEgdGVtcGxhdGUgdG8gcHJvZHVjZSB0ZW1wbGF0ZSBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogVGVtcGxhdGUtc3BlY2lmaWMgbWV0YWRhdGEgYXJlIHN0b3JlZCBpbiB0aGUgb2JqZWN0IHJldHVybmVkLCBhbmQgbm9kZS0KICAgICAgICogc3BlY2lmaWMgbWV0YWRhdGEgYXJlIHN0b3JlZCBpbiBvYmplY3RzIGluIGl0cyBmbGF0dGVuZWQgYG5vZGVJbmZvTGlzdGAKICAgICAgICogYXJyYXkuICBPbmx5IG5vZGVzIGluIHRoZSB0ZW1wbGF0ZSB0aGF0IHdlcmUgcGFyc2VkIGFzIG5vZGVzIG9mCiAgICAgICAqIGludGVyZXN0IGNvbnRhaW4gYW4gb2JqZWN0IGluIGBub2RlSW5mb0xpc3RgLiAgRWFjaCBgbm9kZUluZm9gIG9iamVjdAogICAgICAgKiBjb250YWlucyBhbiBgaW5kZXhgIChgY2hpbGROb2Rlc2AgaW5kZXggaW4gcGFyZW50KSBhbmQgb3B0aW9uYWxseQogICAgICAgKiBgcGFyZW50YCwgd2hpY2ggcG9pbnRzIHRvIG5vZGUgaW5mbyBvZiBpdHMgcGFyZW50IChpbmNsdWRpbmcgaXRzIGluZGV4KS4KICAgICAgICoKICAgICAgICogVGhlIHRlbXBsYXRlIG1ldGFkYXRhIG9iamVjdCByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIGhhcyB0aGUgZm9sbG93aW5nCiAgICAgICAqIHN0cnVjdHVyZSAobWFueSBmaWVsZHMgb3B0aW9uYWwpOgogICAgICAgKgogICAgICAgKiBgYGBqcwogICAgICAgKiAgIHsKICAgICAgICogICAgIC8vIEZsYXR0ZW5lZCBsaXN0IG9mIG5vZGUgbWV0YWRhdGEgKGZvciBub2RlcyB0aGF0IGdlbmVyYXRlZCBtZXRhZGF0YSkKICAgICAgICogICAgIG5vZGVJbmZvTGlzdDogWwogICAgICAgKiAgICAgICB7CiAgICAgICAqICAgICAgICAgLy8gYGlkYCBhdHRyaWJ1dGUgZm9yIGFueSBub2RlcyB3aXRoIGlkJ3MgZm9yIGdlbmVyYXRpbmcgYCRgIG1hcAogICAgICAgKiAgICAgICAgIGlkOiB7c3RyaW5nfSwKICAgICAgICogICAgICAgICAvLyBgb24tZXZlbnQ9ImhhbmRsZXIiYCBtZXRhZGF0YQogICAgICAgKiAgICAgICAgIGV2ZW50czogWwogICAgICAgKiAgICAgICAgICAgewogICAgICAgKiAgICAgICAgICAgICBuYW1lOiB7c3RyaW5nfSwgICAvLyBldmVudCBuYW1lCiAgICAgICAqICAgICAgICAgICAgIHZhbHVlOiB7c3RyaW5nfSwgIC8vIGhhbmRsZXIgbWV0aG9kIG5hbWUKICAgICAgICogICAgICAgICAgIH0sIC4uLgogICAgICAgKiAgICAgICAgIF0sCiAgICAgICAqICAgICAgICAgLy8gTm90ZXMgd2hlbiB0aGUgdGVtcGxhdGUgY29udGFpbmVkIGEgYDxzbG90PmAgZm9yIHNoYWR5IERPTQogICAgICAgKiAgICAgICAgIC8vIG9wdGltaXphdGlvbiBwdXJwb3NlcwogICAgICAgKiAgICAgICAgIGhhc0luc2VydGlvblBvaW50OiB7Ym9vbGVhbn0sCiAgICAgICAqICAgICAgICAgLy8gRm9yIG5lc3RlZCBgPHRlbXBsYXRlPmBgIG5vZGVzLCBuZXN0ZWQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogICAgICAgICB0ZW1wbGF0ZUluZm86IHtvYmplY3R9LCAvLyBuZXN0ZWQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogICAgICAgICAvLyBNZXRhZGF0YSB0byBhbGxvdyBlZmZpY2llbnQgcmV0cmlldmFsIG9mIGluc3RhbmNlZCBub2RlCiAgICAgICAqICAgICAgICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGlzIG1ldGFkYXRhCiAgICAgICAqICAgICAgICAgcGFyZW50SW5mbzoge251bWJlcn0sICAgLy8gcmVmZXJlbmNlIHRvIHBhcmVudCBub2RlSW5mbz4KICAgICAgICogICAgICAgICBwYXJlbnRJbmRleDoge251bWJlcn0sICAvLyBpbmRleCBpbiBwYXJlbnQncyBgY2hpbGROb2Rlc2AgY29sbGVjdGlvbgogICAgICAgKiAgICAgICAgIGluZm9JbmRleDoge251bWJlcn0sICAgIC8vIGluZGV4IG9mIHRoaXMgYG5vZGVJbmZvYCBpbiBgdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdGAKICAgICAgICogICAgICAgfSwKICAgICAgICogICAgICAgLi4uCiAgICAgICAqICAgICBdLAogICAgICAgKiAgICAgLy8gV2hlbiB0cnVlLCB0aGUgdGVtcGxhdGUgaGFkIHRoZSBgc3RyaXAtd2hpdGVzcGFjZWAgYXR0cmlidXRlCiAgICAgICAqICAgICAvLyBvciB3YXMgbmVzdGVkIGluIGEgdGVtcGxhdGUgd2l0aCB0aGF0IHNldHRpbmcKICAgICAgICogICAgIHN0cmlwV2hpdGVzcGFjZToge2Jvb2xlYW59LAogICAgICAgKiAgICAgLy8gRm9yIG5lc3RlZCB0ZW1wbGF0ZXMsIG5lc3RlZCB0ZW1wbGF0ZSBjb250ZW50IGlzIG1vdmVkIGludG8KICAgICAgICogICAgIC8vIGEgZG9jdW1lbnQgZnJhZ21lbnQgc3RvcmVkIGhlcmU7IHRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHRvCiAgICAgICAqICAgICAvLyBhdm9pZCB0aGUgY29zdCBvZiBuZXN0ZWQgdGVtcGxhdGUgY2xvbmluZwogICAgICAgKiAgICAgY29udGVudDoge0RvY3VtZW50RnJhZ21lbnR9CiAgICAgICAqICAgfQogICAgICAgKiBgYGAKICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2Qga2lja3Mgb2ZmIGEgcmVjdXJzaXZlIHRyZWV3YWxrIGFzIGZvbGxvd3M6CiAgICAgICAqCiAgICAgICAqIGBgYAogICAgICAgKiAgICBfcGFyc2VUZW1wbGF0ZSA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICAgICAgKiAgICAgIF9wYXJzZVRlbXBsYXRlQ29udGVudCAgICAgICAgICAgICAgfAogICAgICAgKiAgICAgICAgX3BhcnNlVGVtcGxhdGVOb2RlICA8LS0tLS0tLS0tLS0tfC0tKwogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlIC0tKyAgfAogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMgLS0tLS0tLS0tKwogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGVzCiAgICAgICAqICAgICAgICAgICAgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlCiAgICAgICAqCiAgICAgICAqIGBgYAogICAgICAgKgogICAgICAgKiBUaGVzZSBtZXRob2RzIG1heSBiZSBvdmVycmlkZGVuIHRvIGFkZCBjdXN0b20gbWV0YWRhdGEgYWJvdXQgdGVtcGxhdGVzCiAgICAgICAqIHRvIGVpdGhlciBgdGVtcGxhdGVJbmZvYCBvciBgbm9kZUluZm9gLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IGJlIGRlc3RydWN0aXZlIHRvIHRoZSB0ZW1wbGF0ZSwgaW4gdGhhdAogICAgICAgKiBlLmcuIGV2ZW50IGFubm90YXRpb25zIG1heSBiZSByZW1vdmVkIGFmdGVyIGJlaW5nIG5vdGVkIGluIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gcGFyc2UKICAgICAgICogQHBhcmFtIHtUZW1wbGF0ZUluZm89fSBvdXRlclRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmcm9tIHRoZSBvdXRlcgogICAgICAgKiAgIHRlbXBsYXRlLCBmb3IgcGFyc2luZyBuZXN0ZWQgdGVtcGxhdGVzCiAgICAgICAqIEByZXR1cm4geyFUZW1wbGF0ZUluZm99IFBhcnNlZCB0ZW1wbGF0ZSBtZXRhZGF0YQogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlKHRlbXBsYXRlLCBvdXRlclRlbXBsYXRlSW5mbykgewogICAgICAgIC8vIHNpbmNlIGEgdGVtcGxhdGUgbWF5IGJlIHJlLXVzZWQsIG1lbW8taXplIG1ldGFkYXRhCiAgICAgICAgaWYgKCF0ZW1wbGF0ZS5fdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGVtcGxhdGUuX3RlbXBsYXRlSW5mbyA9IHt9OwogICAgICAgICAgdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdCA9IFtdOwogICAgICAgICAgdGVtcGxhdGVJbmZvLnN0cmlwV2hpdGVTcGFjZSA9IFBvbHltZXIubGVnYWN5T3B0aW1pemF0aW9ucyB8fAogICAgICAgICAgICAob3V0ZXJUZW1wbGF0ZUluZm8gJiYgb3V0ZXJUZW1wbGF0ZUluZm8uc3RyaXBXaGl0ZVNwYWNlKSB8fAogICAgICAgICAgICB0ZW1wbGF0ZS5oYXNBdHRyaWJ1dGUoJ3N0cmlwLXdoaXRlc3BhY2UnKTsKICAgICAgICAgIHRoaXMuX3BhcnNlVGVtcGxhdGVDb250ZW50KHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIHtwYXJlbnQ6IG51bGx9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRlbXBsYXRlLl90ZW1wbGF0ZUluZm87CiAgICAgIH0KCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNvbnRlbnQodGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2VUZW1wbGF0ZU5vZGUodGVtcGxhdGUuY29udGVudCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXJzZXMgdGVtcGxhdGUgbm9kZSBhbmQgYWRkcyB0ZW1wbGF0ZSBhbmQgbm9kZSBtZXRhZGF0YSBiYXNlZCBvbgogICAgICAgKiB0aGUgY3VycmVudCBub2RlLCBhbmQgaXRzIGBjaGlsZE5vZGVzYCBhbmQgYGF0dHJpYnV0ZXNgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbiB0byBhZGQgY3VzdG9tIG5vZGUgb3IgdGVtcGxhdGUgc3BlY2lmaWMKICAgICAgICogbWV0YWRhdGEgYmFzZWQgb24gdGhpcyBub2RlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGxldCBub3RlZDsKICAgICAgICBsZXQgZWxlbWVudCA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8obm9kZSk7CiAgICAgICAgaWYgKGVsZW1lbnQubG9jYWxOYW1lID09ICd0ZW1wbGF0ZScgJiYgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdwcmVzZXJ2ZS1jb250ZW50JykpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKGVsZW1lbnQsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHx8IG5vdGVkOwogICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5sb2NhbE5hbWUgPT09ICdzbG90JykgewogICAgICAgICAgLy8gRm9yIFNoYWR5RG9tIG9wdGltaXphdGlvbiwgaW5kaWNhdGluZyB0aGVyZSBpcyBhbiBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgIHRlbXBsYXRlSW5mby5oYXNJbnNlcnRpb25Qb2ludCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IGVsZW1lbnQ7CiAgICAgICAgaWYgKHdhbGtlci5maXJzdENoaWxkKCkpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMoZWxlbWVudCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgfHwgbm90ZWQ7CiAgICAgICAgfQogICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZXMgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGVzKCkpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGVzKGVsZW1lbnQsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHx8IG5vdGVkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbm90ZWQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXJzZXMgdGVtcGxhdGUgY2hpbGQgbm9kZXMgZm9yIHRoZSBnaXZlbiByb290IG5vZGUuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIGFsc28gd3JhcHMgd2hpdGVsaXN0ZWQgbGVnYWN5IHRlbXBsYXRlIGV4dGVuc2lvbnMKICAgICAgICogKGBpcz0iZG9tLWlmImAgYW5kIGBpcz0iZG9tLXJlcGVhdCJgKSB3aXRoIHRoZWlyIGVxdWl2YWxlbnQgZWxlbWVudAogICAgICAgKiB3cmFwcGVycywgY29sbGFwc2VzIHRleHQgbm9kZXMsIGFuZCBzdHJpcHMgd2hpdGVzcGFjZSBmcm9tIHRoZSB0ZW1wbGF0ZQogICAgICAgKiBpZiB0aGUgYHRlbXBsYXRlSW5mby5zdHJpcFdoaXRlc3BhY2VgIHNldHRpbmcgd2FzIHByb3ZpZGVkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge05vZGV9IHJvb3QgUm9vdCBub2RlIHdob3NlIGBjaGlsZE5vZGVzYCB3aWxsIGJlIHBhcnNlZAogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMocm9vdCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGlmIChyb290LmxvY2FsTmFtZSA9PT0gJ3NjcmlwdCcgfHwgcm9vdC5sb2NhbE5hbWUgPT09ICdzdHlsZScpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gcm9vdDsKICAgICAgICBmb3IgKGxldCBub2RlPXdhbGtlci5maXJzdENoaWxkKCksIHBhcmVudEluZGV4PTAsIG5leHQ7IG5vZGU7IG5vZGU9bmV4dCkgewogICAgICAgICAgLy8gV3JhcCB0ZW1wbGF0ZXMKICAgICAgICAgIGlmIChub2RlLmxvY2FsTmFtZSA9PSAndGVtcGxhdGUnKSB7CiAgICAgICAgICAgIG5vZGUgPSB3cmFwVGVtcGxhdGVFeHRlbnNpb24obm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBjb2xsYXBzZSBhZGphY2VudCB0ZXh0Tm9kZXM6IGZpeGVzIGFuIElFIGlzc3VlIHRoYXQgY2FuIGNhdXNlCiAgICAgICAgICAvLyB0ZXh0IG5vZGVzIHRvIGJlIGluZXhwbGljYWJseSBzcGxpdCA9KAogICAgICAgICAgLy8gbm90ZSB0aGF0IHJvb3Qubm9ybWFsaXplKCkgc2hvdWxkIHdvcmsgYnV0IGRvZXMgbm90IHNvIHdlIGRvIHRoaXMKICAgICAgICAgIC8vIG1hbnVhbGx5LgogICAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gbm9kZTsKICAgICAgICAgIG5leHQgPSB3YWxrZXIubmV4dFNpYmxpbmcoKTsKICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgICBsZXQgLyoqIE5vZGUgKi8gbiA9IG5leHQ7CiAgICAgICAgICAgIHdoaWxlIChuICYmIChuLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkpIHsKICAgICAgICAgICAgICBub2RlLnRleHRDb250ZW50ICs9IG4udGV4dENvbnRlbnQ7CiAgICAgICAgICAgICAgbmV4dCA9IHdhbGtlci5uZXh0U2libGluZygpOwogICAgICAgICAgICAgIHJvb3QucmVtb3ZlQ2hpbGQobik7CiAgICAgICAgICAgICAgbiA9IG5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gb3B0aW9uYWxseSBzdHJpcCB3aGl0ZXNwYWNlCiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUluZm8uc3RyaXBXaGl0ZVNwYWNlICYmICFub2RlLnRleHRDb250ZW50LnRyaW0oKSkgewogICAgICAgICAgICAgIHJvb3QucmVtb3ZlQ2hpbGQobm9kZSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGxldCBjaGlsZEluZm8gPSB7IHBhcmVudEluZGV4LCBwYXJlbnRJbmZvOiBub2RlSW5mbyB9OwogICAgICAgICAgaWYgKHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlKG5vZGUsIHRlbXBsYXRlSW5mbywgY2hpbGRJbmZvKSkgewogICAgICAgICAgICBjaGlsZEluZm8uaW5mb0luZGV4ID0gdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdC5wdXNoKC8qKiBAdHlwZSB7IU5vZGVJbmZvfSAqLyhjaGlsZEluZm8pKSAtIDE7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBJbmNyZW1lbnQgaWYgbm90IHJlbW92ZWQKICAgICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IG5vZGU7CiAgICAgICAgICBpZiAod2Fsa2VyLnBhcmVudE5vZGUoKSkgewogICAgICAgICAgICBwYXJlbnRJbmRleCsrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhcnNlcyB0ZW1wbGF0ZSBjb250ZW50IGZvciB0aGUgZ2l2ZW4gbmVzdGVkIGA8dGVtcGxhdGU+YC4KICAgICAgICoKICAgICAgICogTmVzdGVkIHRlbXBsYXRlIGluZm8gaXMgc3RvcmVkIGFzIGB0ZW1wbGF0ZUluZm9gIGluIHRoZSBjdXJyZW50IG5vZGUncwogICAgICAgKiBgbm9kZUluZm9gLiBgdGVtcGxhdGUuY29udGVudGAgaXMgcmVtb3ZlZCBhbmQgc3RvcmVkIGluIGB0ZW1wbGF0ZUluZm9gLgogICAgICAgKiBJdCB3aWxsIHRoZW4gYmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBob3N0IHRvIHNldCBpdCBiYWNrIHRvIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBhbmQgZm9yIHVzZXJzIHN0YW1waW5nIG5lc3RlZCB0ZW1wbGF0ZXMgdG8gdXNlIHRoZQogICAgICAgKiBgX2NvbnRlbnRGb3JUZW1wbGF0ZWAgbWV0aG9kIHRvIHJldHJpZXZlIHRoZSBjb250ZW50IGZvciB0aGlzIHRlbXBsYXRlCiAgICAgICAqIChhbiBvcHRpbWl6YXRpb24gdG8gYXZvaWQgdGhlIGNvc3Qgb2YgY2xvbmluZyBuZXN0ZWQgdGVtcGxhdGUgY29udGVudCkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gbm9kZSBOb2RlIHRvIHBhcnNlIChhIDx0ZW1wbGF0ZT4pCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSBvdXRlclRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiAgIHRoYXQgaW5jbHVkZXMgdGhlIHRlbXBsYXRlIGBub2RlYAogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKG5vZGUsIG91dGVyVGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGxldCB0ZW1wbGF0ZUluZm8gPSB0aGlzLl9wYXJzZVRlbXBsYXRlKG5vZGUsIG91dGVyVGVtcGxhdGVJbmZvKTsKICAgICAgICBsZXQgY29udGVudCA9IHRlbXBsYXRlSW5mby5jb250ZW50ID0KICAgICAgICAgIG5vZGUuY29udGVudC5vd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKG5vZGUuY29udGVudCk7CiAgICAgICAgbm9kZUluZm8udGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUGFyc2VzIHRlbXBsYXRlIG5vZGUgYXR0cmlidXRlcyBhbmQgYWRkcyBub2RlIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICogZm9yIG5vZGVzIG9mIGludGVyZXN0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmlzaXRlZCBub2RlIGFkZGVkIG5vZGUtc3BlY2lmaWMKICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlcyhub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgLy8gTWFrZSBjb3B5IG9mIG9yaWdpbmFsIGF0dHJpYnV0ZSBsaXN0LCBzaW5jZSB0aGUgb3JkZXIgbWF5IGNoYW5nZQogICAgICAgIC8vIGFzIGF0dHJpYnV0ZXMgYXJlIGFkZGVkIGFuZCByZW1vdmVkCiAgICAgICAgbGV0IG5vdGVkID0gZmFsc2U7CiAgICAgICAgbGV0IGF0dHJzID0gQXJyYXkuZnJvbShub2RlLmF0dHJpYnV0ZXMpOwogICAgICAgIGZvciAobGV0IGk9YXR0cnMubGVuZ3RoLTEsIGE7IChhPWF0dHJzW2ldKTsgaS0tKSB7CiAgICAgICAgICBub3RlZCA9IHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8sIGEubmFtZSwgYS52YWx1ZSkgfHwgbm90ZWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBub3RlZDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhcnNlcyBhIHNpbmdsZSB0ZW1wbGF0ZSBub2RlIGF0dHJpYnV0ZSBhbmQgYWRkcyBub2RlIG1ldGFkYXRhIHRvCiAgICAgICAqIGBub2RlSW5mb2AgZm9yIGF0dHJpYnV0ZXMgb2YgaW50ZXJlc3QuCiAgICAgICAqCiAgICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gYWRkcyBtZXRhZGF0YSBmb3IgYG9uLWV2ZW50PSJoYW5kbGVyImAgYXR0cmlidXRlcwogICAgICAgKiBhbmQgYGlkYCBhdHRyaWJ1dGVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgQXR0cmlidXRlIG5hbWUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZUF0dHJpYnV0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCBuYW1lLCB2YWx1ZSkgewogICAgICAgIC8vIGV2ZW50cyAob24tKikKICAgICAgICBpZiAobmFtZS5zbGljZSgwLCAzKSA9PT0gJ29uLScpIHsKICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICAgICAgbm9kZUluZm8uZXZlbnRzID0gbm9kZUluZm8uZXZlbnRzIHx8IFtdOwogICAgICAgICAgbm9kZUluZm8uZXZlbnRzLnB1c2goewogICAgICAgICAgICBuYW1lOiBuYW1lLnNsaWNlKDMpLAogICAgICAgICAgICB2YWx1ZQogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gc3RhdGljIGlkCiAgICAgICAgZWxzZSBpZiAobmFtZSA9PT0gJ2lkJykgewogICAgICAgICAgbm9kZUluZm8uaWQgPSB2YWx1ZTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBgY29udGVudGAgZG9jdW1lbnQgZnJhZ21lbnQgZm9yIGEgZ2l2ZW4gdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIEZvciBuZXN0ZWQgdGVtcGxhdGVzLCBQb2x5bWVyIHBlcmZvcm1zIGFuIG9wdGltaXphdGlvbiB0byBjYWNoZSBuZXN0ZWQKICAgICAgICogdGVtcGxhdGUgY29udGVudCB0byBhdm9pZCB0aGUgY29zdCBvZiBjbG9uaW5nIGRlZXBseSBuZXN0ZWQgdGVtcGxhdGVzLgogICAgICAgKiBUaGlzIG1ldGhvZCByZXRyaWV2ZXMgdGhlIGNhY2hlZCBjb250ZW50IGZvciBhIGdpdmVuIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIHJldHJpZXZlIGBjb250ZW50YCBmb3IKICAgICAgICogQHJldHVybiB7RG9jdW1lbnRGcmFnbWVudH0gQ29udGVudCBmcmFnbWVudAogICAgICAgKi8KICAgICAgc3RhdGljIF9jb250ZW50Rm9yVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50V2l0aEluZm99ICovICh0ZW1wbGF0ZSkuX3RlbXBsYXRlSW5mbzsKICAgICAgICByZXR1cm4gKHRlbXBsYXRlSW5mbyAmJiB0ZW1wbGF0ZUluZm8uY29udGVudCkgfHwgdGVtcGxhdGUuY29udGVudDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENsb25lcyB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgY29udGVudCBhbmQgcmV0dXJucyBhIGRvY3VtZW50IGZyYWdtZW50CiAgICAgICAqIGNvbnRhaW5pbmcgdGhlIGNsb25lZCBkb20uCiAgICAgICAqCiAgICAgICAqIFRoZSB0ZW1wbGF0ZSBpcyBwYXJzZWQgKG9uY2UgYW5kIG1lbW9pemVkKSB1c2luZyB0aGlzIGxpYnJhcnkncwogICAgICAgKiB0ZW1wbGF0ZSBwYXJzaW5nIGZlYXR1cmVzLCBhbmQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS1hZGRlZAogICAgICAgKiBmZWF0dXJlczoKICAgICAgICogKiBBZGRzIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycyBmb3IgYG9uLWV2ZW50PSJoYW5kbGVyImAgYXR0cmlidXRlcwogICAgICAgKiAqIEdlbmVyYXRlcyBhbiAiaWQgbWFwIiBmb3IgYWxsIG5vZGVzIHdpdGggaWQncyB1bmRlciBgJGAgb24gcmV0dXJuZWQKICAgICAgICogICBkb2N1bWVudCBmcmFnbWVudAogICAgICAgKiAqIFBhc3NlcyB0ZW1wbGF0ZSBpbmZvIGluY2x1ZGluZyBgY29udGVudGAgYmFjayB0byB0ZW1wbGF0ZXMgYXMKICAgICAgICogICBgX3RlbXBsYXRlSW5mb2AgKGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRvIGF2b2lkIGRlZXAgdGVtcGxhdGUKICAgICAgICogICBjbG9uaW5nKQogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgdGhlIG1lbW9pemVkIHRlbXBsYXRlIHBhcnNpbmcgcHJvY2VzcyBpcyBkZXN0cnVjdGl2ZSB0byB0aGUKICAgICAgICogdGVtcGxhdGU6IGF0dHJpYnV0ZXMgZm9yIGJpbmRpbmdzIGFuZCBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMgYXJlCiAgICAgICAqIHJlbW92ZWQgYWZ0ZXIgYmVpbmcgbm90ZWQgaW4gbm90ZXMsIGFuZCBhbnkgbmVzdGVkIGA8dGVtcGxhdGU+LmNvbnRlbnRgCiAgICAgICAqIGlzIHJlbW92ZWQgYW5kIHN0b3JlZCBpbiBub3RlcyBhcyB3ZWxsLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBzdGFtcAogICAgICAgKiBAcmV0dXJuIHshU3RhbXBlZFRlbXBsYXRlfSBDbG9uZWQgdGVtcGxhdGUgY29udGVudAogICAgICAgKi8KICAgICAgX3N0YW1wVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICAvLyBQb2x5ZmlsbCBzdXBwb3J0OiBib290c3RyYXAgdGhlIHRlbXBsYXRlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuCiAgICAgICAgaWYgKHRlbXBsYXRlICYmICF0ZW1wbGF0ZS5jb250ZW50ICYmCiAgICAgICAgICAgIHdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50ICYmIEhUTUxUZW1wbGF0ZUVsZW1lbnQuZGVjb3JhdGUpIHsKICAgICAgICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnQuZGVjb3JhdGUodGVtcGxhdGUpOwogICAgICAgIH0KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5jb25zdHJ1Y3Rvci5fcGFyc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgbGV0IG5vZGVJbmZvID0gdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdDsKICAgICAgICBsZXQgY29udGVudCA9IHRlbXBsYXRlSW5mby5jb250ZW50IHx8IHRlbXBsYXRlLmNvbnRlbnQ7CiAgICAgICAgbGV0IGRvbSA9IC8qKiBAdHlwZSB7RG9jdW1lbnRGcmFnbWVudH0gKi8gKGRvY3VtZW50LmltcG9ydE5vZGUoY29udGVudCwgdHJ1ZSkpOwogICAgICAgIC8vIE5PVEU6IFNoYWR5RG9tIG9wdGltaXphdGlvbiBpbmRpY2F0aW5nIHRoZXJlIGlzIGFuIGluc2VydGlvbiBwb2ludAogICAgICAgIGRvbS5fX25vSW5zZXJ0aW9uUG9pbnQgPSAhdGVtcGxhdGVJbmZvLmhhc0luc2VydGlvblBvaW50OwogICAgICAgIGxldCBub2RlcyA9IGRvbS5ub2RlTGlzdCA9IG5ldyBBcnJheShub2RlSW5mby5sZW5ndGgpOwogICAgICAgIGRvbS4kID0ge307CiAgICAgICAgZm9yIChsZXQgaT0wLCBsPW5vZGVJbmZvLmxlbmd0aCwgaW5mbzsgKGk8bCkgJiYgKGluZm89bm9kZUluZm9baV0pOyBpKyspIHsKICAgICAgICAgIGxldCBub2RlID0gbm9kZXNbaV0gPSBmaW5kVGVtcGxhdGVOb2RlKGRvbSwgaW5mbyk7CiAgICAgICAgICBhcHBseUlkVG9NYXAodGhpcywgZG9tLiQsIG5vZGUsIGluZm8pOwogICAgICAgICAgYXBwbHlUZW1wbGF0ZUNvbnRlbnQodGhpcywgbm9kZSwgaW5mbyk7CiAgICAgICAgICBhcHBseUV2ZW50TGlzdGVuZXIodGhpcywgbm9kZSwgaW5mbyk7CiAgICAgICAgfQogICAgICAgIGRvbSA9IC8qKiBAdHlwZSB7IVN0YW1wZWRUZW1wbGF0ZX0gKi8oZG9tKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWFzc2lnbgogICAgICAgIHJldHVybiBkb207CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGJ5IG1ldGhvZCBuYW1lIGZvciB0aGUgZXZlbnQgcHJvdmlkZWQuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyBhIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBsb29rcyB1cCB0aGUgbWV0aG9kCiAgICAgICAqIG5hbWUgYXQgaGFuZGxpbmcgdGltZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBsaXN0ZW5lciBvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTmFtZSBvZiBtZXRob2QKICAgICAgICogQHBhcmFtIHsqPX0gY29udGV4dCBDb250ZXh0IHRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb24gKGRlZmF1bHRzCiAgICAgICAqICAgdG8gYG5vZGVgKQogICAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gR2VuZXJhdGVkIGhhbmRsZXIgZnVuY3Rpb24KICAgICAgICovCiAgICAgIF9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSwgY29udGV4dCkgewogICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IG5vZGU7CiAgICAgICAgbGV0IGhhbmRsZXIgPSBjcmVhdGVOb2RlRXZlbnRIYW5kbGVyKGNvbnRleHQsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSk7CiAgICAgICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIHJldHVybiBoYW5kbGVyOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gb3Igc2ltdWxhdGVkIGV2ZW50IGhhbmRsaW5nLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gYWRkIGV2ZW50IGxpc3RlbmVyIHRvCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBMaXN0ZW5lciBmdW5jdGlvbiB0byBhZGQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gb3Igc2ltdWxhdGVkIGV2ZW50IGhhbmRsaW5nLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVyIGZyb20KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50CiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KTp2b2lkfSBoYW5kbGVyIExpc3RlbmVyIGZ1bmN0aW9uIHRvIHJlbW92ZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3JlbW92ZUV2ZW50TGlzdGVuZXJGcm9tTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gVGVtcGxhdGVTdGFtcDsKCiAgfSk7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvKiogQGNvbnN0IHtPYmplY3R9ICovCiAgY29uc3QgQ2FzZU1hcCA9IFBvbHltZXIuQ2FzZU1hcDsKCiAgLy8gTW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIHVuaXF1ZSBJRCB1c2VkIGZvciBkZS1kdXBpbmcgZWZmZWN0cyB0cmlnZ2VyZWQKICAvLyBmcm9tIG11bHRpcGxlIHByb3BlcnRpZXMgaW4gdGhlIHNhbWUgdHVybgogIGxldCBkZWR1cGVJZCA9IDA7CgogIC8qKgogICAqIFByb3BlcnR5IGVmZmVjdCB0eXBlczsgZWZmZWN0cyBhcmUgc3RvcmVkIG9uIHRoZSBwcm90b3R5cGUgdXNpbmcgdGhlc2Uga2V5cwogICAqIEBlbnVtIHtzdHJpbmd9CiAgICovCiAgY29uc3QgVFlQRVMgPSB7CiAgICBDT01QVVRFOiAnX19jb21wdXRlRWZmZWN0cycsCiAgICBSRUZMRUNUOiAnX19yZWZsZWN0RWZmZWN0cycsCiAgICBOT1RJRlk6ICdfX25vdGlmeUVmZmVjdHMnLAogICAgUFJPUEFHQVRFOiAnX19wcm9wYWdhdGVFZmZlY3RzJywKICAgIE9CU0VSVkU6ICdfX29ic2VydmVFZmZlY3RzJywKICAgIFJFQURfT05MWTogJ19fcmVhZE9ubHknCiAgfTsKCiAgLyoqIEBjb25zdCB7UmVnRXhwfSAqLwogIGNvbnN0IGNhcGl0YWxBdHRyaWJ1dGVSZWdleCA9IC9bQS1aXS87CgogIC8qKgogICAqIEB0eXBlZGVmIHt7CiAgICogbmFtZTogKHN0cmluZyB8IHVuZGVmaW5lZCksCiAgICogc3RydWN0dXJlZDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLAogICAqIHdpbGRjYXJkOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkKICAgKiB9fQogICAqLwogIGxldCBEYXRhVHJpZ2dlcjsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgogIC8qKgogICAqIEB0eXBlZGVmIHt7CiAgICogaW5mbzogPywKICAgKiB0cmlnZ2VyOiAoIURhdGFUcmlnZ2VyIHwgdW5kZWZpbmVkKSwKICAgKiBmbjogKCFGdW5jdGlvbiB8IHVuZGVmaW5lZCkKICAgKiB9fQogICAqLwogIGxldCBEYXRhRWZmZWN0OyAvL2VzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKCiAgbGV0IFByb3BlcnR5RWZmZWN0c1R5cGU7IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAvKioKICAgKiBFbnN1cmVzIHRoYXQgdGhlIG1vZGVsIGhhcyBhbiBvd24tcHJvcGVydHkgbWFwIG9mIGVmZmVjdHMgZm9yIHRoZSBnaXZlbiB0eXBlLgogICAqIFRoZSBtb2RlbCBtYXkgYmUgYSBwcm90b3R5cGUgb3IgYW4gaW5zdGFuY2UuCiAgICoKICAgKiBQcm9wZXJ0eSBlZmZlY3RzIGFyZSBzdG9yZWQgYXMgYXJyYXlzIG9mIGVmZmVjdHMgYnkgcHJvcGVydHkgaW4gYSBtYXAsCiAgICogYnkgbmFtZWQgdHlwZSBvbiB0aGUgbW9kZWwuIGUuZy4KICAgKgogICAqICAgX19jb21wdXRlRWZmZWN0czogewogICAqICAgICBmb286IFsgLi4uIF0sCiAgICogICAgIGJhcjogWyAuLi4gXQogICAqICAgfQogICAqCiAgICogSWYgdGhlIG1vZGVsIGRvZXMgbm90IHlldCBoYXZlIGFuIGVmZmVjdCBtYXAgZm9yIHRoZSB0eXBlLCBvbmUgaXMgY3JlYXRlZAogICAqIGFuZCByZXR1cm5lZC4gIElmIGl0IGRvZXMsIGJ1dCBpdCBpcyBub3QgYW4gb3duIHByb3BlcnR5IChpLmUuIHRoZQogICAqIHByb3RvdHlwZSBoYWQgZWZmZWN0cyksIHRoZSB0aGUgbWFwIGlzIGRlZXBseSBjbG9uZWQgYW5kIHRoZSBjb3B5IGlzCiAgICogc2V0IG9uIHRoZSBtb2RlbCBhbmQgcmV0dXJuZWQsIHJlYWR5IGZvciBuZXcgZWZmZWN0cyB0byBiZSBhZGRlZC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBtb2RlbCBQcm90b3R5cGUgb3IgaW5zdGFuY2UKICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBQcm9wZXJ0eSBlZmZlY3QgdHlwZQogICAqIEByZXR1cm4ge09iamVjdH0gVGhlIG93bi1wcm9wZXJ0eSBtYXAgb2YgZWZmZWN0cyBmb3IgdGhlIGdpdmVuIHR5cGUKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGVuc3VyZU93bkVmZmVjdE1hcChtb2RlbCwgdHlwZSkgewogICAgbGV0IGVmZmVjdHMgPSBtb2RlbFt0eXBlXTsKICAgIGlmICghZWZmZWN0cykgewogICAgICBlZmZlY3RzID0gbW9kZWxbdHlwZV0gPSB7fTsKICAgIH0gZWxzZSBpZiAoIW1vZGVsLmhhc093blByb3BlcnR5KHR5cGUpKSB7CiAgICAgIGVmZmVjdHMgPSBtb2RlbFt0eXBlXSA9IE9iamVjdC5jcmVhdGUobW9kZWxbdHlwZV0pOwogICAgICBmb3IgKGxldCBwIGluIGVmZmVjdHMpIHsKICAgICAgICBsZXQgcHJvdG9GeCA9IGVmZmVjdHNbcF07CiAgICAgICAgbGV0IGluc3RGeCA9IGVmZmVjdHNbcF0gPSBBcnJheShwcm90b0Z4Lmxlbmd0aCk7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPHByb3RvRngubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGluc3RGeFtpXSA9IHByb3RvRnhbaV07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZWZmZWN0czsKICB9CgogIC8vIC0tIGVmZmVjdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvKioKICAgKiBSdW5zIGFsbCBlZmZlY3RzIG9mIGEgZ2l2ZW4gdHlwZSBmb3IgdGhlIGdpdmVuIHNldCBvZiBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogb24gYW4gaW5zdGFuY2UuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB3aXRoIGVmZmVjdHMgdG8gcnVuCiAgICogQHBhcmFtIHtPYmplY3R9IGVmZmVjdHMgT2JqZWN0IG1hcCBvZiBwcm9wZXJ0eS10by1BcnJheSBvZiBlZmZlY3RzCiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEJhZyBvZiBjdXJyZW50IHByb3BlcnR5IGNoYW5nZXMKICAgKiBAcGFyYW0ge09iamVjdD19IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHBhcmFtIHsqPX0gZXh0cmFBcmdzIEFkZGl0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byBlZmZlY3QgZnVuY3Rpb24KICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFuIGVmZmVjdCByYW4gZm9yIHRoaXMgcHJvcGVydHkKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkVmZmVjdHMoaW5zdCwgZWZmZWN0cywgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocywgZXh0cmFBcmdzKSB7CiAgICBpZiAoZWZmZWN0cykgewogICAgICBsZXQgcmFuID0gZmFsc2U7CiAgICAgIGxldCBpZCA9IGRlZHVwZUlkKys7CiAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICBpZiAocnVuRWZmZWN0c0ZvclByb3BlcnR5KGluc3QsIGVmZmVjdHMsIGlkLCBwcm9wLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzLCBleHRyYUFyZ3MpKSB7CiAgICAgICAgICByYW4gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmFuOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLyoqCiAgICogUnVucyBhIGxpc3Qgb2YgZWZmZWN0cyBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHdpdGggZWZmZWN0cyB0byBydW4KICAgKiBAcGFyYW0ge09iamVjdH0gZWZmZWN0cyBPYmplY3QgbWFwIG9mIHByb3BlcnR5LXRvLUFycmF5IG9mIGVmZmVjdHMKICAgKiBAcGFyYW0ge251bWJlcn0gZGVkdXBlSWQgQ291bnRlciB1c2VkIGZvciBkZS1kdXBpbmcgZWZmZWN0cwogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIE5hbWUgb2YgY2hhbmdlZCBwcm9wZXJ0eQogICAqIEBwYXJhbSB7Kn0gcHJvcHMgQ2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHsqfSBvbGRQcm9wcyBPbGQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHBhcmFtIHsqPX0gZXh0cmFBcmdzIEFkZGl0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byBlZmZlY3QgZnVuY3Rpb24KICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFuIGVmZmVjdCByYW4gZm9yIHRoaXMgcHJvcGVydHkKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkVmZmVjdHNGb3JQcm9wZXJ0eShpbnN0LCBlZmZlY3RzLCBkZWR1cGVJZCwgcHJvcCwgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocywgZXh0cmFBcmdzKSB7CiAgICBsZXQgcmFuID0gZmFsc2U7CiAgICBsZXQgcm9vdFByb3BlcnR5ID0gaGFzUGF0aHMgPyBQb2x5bWVyLlBhdGgucm9vdChwcm9wKSA6IHByb3A7CiAgICBsZXQgZnhzID0gZWZmZWN0c1tyb290UHJvcGVydHldOwogICAgaWYgKGZ4cykgewogICAgICBmb3IgKGxldCBpPTAsIGw9ZnhzLmxlbmd0aCwgZng7IChpPGwpICYmIChmeD1meHNbaV0pOyBpKyspIHsKICAgICAgICBpZiAoKCFmeC5pbmZvIHx8IGZ4LmluZm8ubGFzdFJ1biAhPT0gZGVkdXBlSWQpICYmCiAgICAgICAgICAgICghaGFzUGF0aHMgfHwgcGF0aE1hdGNoZXNUcmlnZ2VyKHByb3AsIGZ4LnRyaWdnZXIpKSkgewogICAgICAgICAgaWYgKGZ4LmluZm8pIHsKICAgICAgICAgICAgZnguaW5mby5sYXN0UnVuID0gZGVkdXBlSWQ7CiAgICAgICAgICB9CiAgICAgICAgICBmeC5mbihpbnN0LCBwcm9wLCBwcm9wcywgb2xkUHJvcHMsIGZ4LmluZm8sIGhhc1BhdGhzLCBleHRyYUFyZ3MpOwogICAgICAgICAgcmFuID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByYW47CiAgfQoKICAvKioKICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBwcm9wZXJ0eS9wYXRoIHRoYXQgaGFzIGNoYW5nZWQgbWF0Y2hlcyB0aGUgdHJpZ2dlcgogICAqIGNyaXRlcmlhIGZvciBhbiBlZmZlY3QuICBBIHRyaWdnZXIgaXMgYSBkZXNjcmlwdG9yIHdpdGggdGhlIGZvbGxvd2luZwogICAqIHN0cnVjdHVyZSwgd2hpY2ggbWF0Y2hlcyB0aGUgZGVzY3JpcHRvcnMgcmV0dXJuZWQgZnJvbSBgcGFyc2VBcmdgLgogICAqIGUuZy4gZm9yIGBmb28uYmFyLipgOgogICAqIGBgYAogICAqIHRyaWdnZXI6IHsKICAgKiAgIG5hbWU6ICdhLmInLAogICAqICAgc3RydWN0dXJlZDogdHJ1ZSwKICAgKiAgIHdpbGRjYXJkOiB0cnVlCiAgICogfQogICAqIGBgYAogICAqIElmIG5vIHRyaWdnZXIgaXMgZ2l2ZW4sIHRoZSBwYXRoIGlzIGRlZW1lZCB0byBtYXRjaC4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggb3IgcHJvcGVydHkgdGhhdCBjaGFuZ2VkCiAgICogQHBhcmFtIHtEYXRhVHJpZ2dlcn0gdHJpZ2dlciBEZXNjcmlwdG9yCiAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgcGF0aCBtYXRjaGVkIHRoZSB0cmlnZ2VyCiAgICovCiAgZnVuY3Rpb24gcGF0aE1hdGNoZXNUcmlnZ2VyKHBhdGgsIHRyaWdnZXIpIHsKICAgIGlmICh0cmlnZ2VyKSB7CiAgICAgIGxldCB0cmlnZ2VyUGF0aCA9IHRyaWdnZXIubmFtZTsKICAgICAgcmV0dXJuICh0cmlnZ2VyUGF0aCA9PSBwYXRoKSB8fAogICAgICAgICh0cmlnZ2VyLnN0cnVjdHVyZWQgJiYgUG9seW1lci5QYXRoLmlzQW5jZXN0b3IodHJpZ2dlclBhdGgsIHBhdGgpKSB8fAogICAgICAgICh0cmlnZ2VyLndpbGRjYXJkICYmIFBvbHltZXIuUGF0aC5pc0Rlc2NlbmRhbnQodHJpZ2dlclBhdGgsIHBhdGgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgLyoqCiAgICogSW1wbGVtZW50cyB0aGUgIm9ic2VydmVyIiBlZmZlY3QuCiAgICoKICAgKiBDYWxscyB0aGUgbWV0aG9kIHdpdGggYGluZm8ubWV0aG9kTmFtZWAgb24gdGhlIGluc3RhbmNlLCBwYXNzaW5nIHRoZQogICAqIG5ldyBhbmQgb2xkIHZhbHVlcy4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7P30gaW5mbyBFZmZlY3QgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcnVuT2JzZXJ2ZXJFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbykgewogICAgbGV0IGZuID0gdHlwZW9mIGluZm8ubWV0aG9kID09PSAic3RyaW5nIiA/IGluc3RbaW5mby5tZXRob2RdIDogaW5mby5tZXRob2Q7CiAgICBsZXQgY2hhbmdlZFByb3AgPSBpbmZvLnByb3BlcnR5OwogICAgaWYgKGZuKSB7CiAgICAgIGZuLmNhbGwoaW5zdCwgaW5zdC5fX2RhdGFbY2hhbmdlZFByb3BdLCBvbGRQcm9wc1tjaGFuZ2VkUHJvcF0pOwogICAgfSBlbHNlIGlmICghaW5mby5keW5hbWljRm4pIHsKICAgICAgY29uc29sZS53YXJuKCdvYnNlcnZlciBtZXRob2QgYCcgKyBpbmZvLm1ldGhvZCArICdgIG5vdCBkZWZpbmVkJyk7CiAgICB9CiAgfQoKICAvKioKICAgKiBSdW5zICJub3RpZnkiIGVmZmVjdHMgZm9yIGEgc2V0IG9mIGNoYW5nZWQgcHJvcGVydGllcy4KICAgKgogICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSB0aGUgZ2VuZXJpYyBgcnVuRWZmZWN0c2AgbWV0aG9kIGluIHRoYXQgaXQKICAgKiB3aWxsIGRpc3BhdGNoIHBhdGggbm90aWZpY2F0aW9uIGV2ZW50cyBpbiB0aGUgY2FzZSB0aGF0IHRoZSBwcm9wZXJ0eQogICAqIGNoYW5nZWQgd2FzIGEgcGF0aCBhbmQgdGhlIHJvb3QgcHJvcGVydHkgZm9yIHRoYXQgcGF0aCBkaWRuJ3QgaGF2ZSBhCiAgICogIm5vdGlmeSIgZWZmZWN0LiAgVGhpcyBpcyB0byBtYWludGFpbiAxLjAgYmVoYXZpb3IgdGhhdCBkaWQgbm90IHJlcXVpcmUKICAgKiBgbm90aWZ5OiB0cnVlYCB0byBlbnN1cmUgb2JqZWN0IHN1Yi1wcm9wZXJ0eSBub3RpZmljYXRpb25zIHdlcmUKICAgKiBzZW50LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugd2l0aCBlZmZlY3RzIHRvIHJ1bgogICAqIEBwYXJhbSB7T2JqZWN0fSBub3RpZnlQcm9wcyBCYWcgb2YgcHJvcGVydGllcyB0byBub3RpZnkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bk5vdGlmeUVmZmVjdHMoaW5zdCwgbm90aWZ5UHJvcHMsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpIHsKICAgIC8vIE5vdGlmeQogICAgbGV0IGZ4cyA9IGluc3RbVFlQRVMuTk9USUZZXTsKICAgIGxldCBub3RpZmllZDsKICAgIGxldCBpZCA9IGRlZHVwZUlkKys7CiAgICAvLyBUcnkgbm9ybWFsIG5vdGlmeSBlZmZlY3RzOyBpZiBub25lLCBmYWxsIGJhY2sgdG8gdHJ5IHBhdGggbm90aWZpY2F0aW9uCiAgICBmb3IgKGxldCBwcm9wIGluIG5vdGlmeVByb3BzKSB7CiAgICAgIGlmIChub3RpZnlQcm9wc1twcm9wXSkgewogICAgICAgIGlmIChmeHMgJiYgcnVuRWZmZWN0c0ZvclByb3BlcnR5KGluc3QsIGZ4cywgaWQsIHByb3AsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpKSB7CiAgICAgICAgICBub3RpZmllZCA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChoYXNQYXRocyAmJiBub3RpZnlQYXRoKGluc3QsIHByb3AsIHByb3BzKSkgewogICAgICAgICAgbm90aWZpZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gRmx1c2ggaG9zdCBpZiB3ZSBhY3R1YWxseSBub3RpZmllZCBhbmQgaG9zdCB3YXMgYmF0Y2hpbmcKICAgIC8vIEFuZCB0aGUgaG9zdCBoYXMgYWxyZWFkeSBpbml0aWFsaXplZCBjbGllbnRzOyB0aGlzIHByZXZlbnRzCiAgICAvLyBhbiBpc3N1ZSB3aXRoIGEgaG9zdCBvYnNlcnZpbmcgZGF0YSBjaGFuZ2VzIGJlZm9yZSBjbGllbnRzIGFyZSByZWFkeS4KICAgIGxldCBob3N0OwogICAgaWYgKG5vdGlmaWVkICYmIChob3N0ID0gaW5zdC5fX2RhdGFIb3N0KSAmJiBob3N0Ll9pbnZhbGlkYXRlUHJvcGVydGllcykgewogICAgICBob3N0Ll9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgfQogIH0KCiAgLyoqCiAgICogRGlzcGF0Y2hlcyB7cHJvcGVydHl9LWNoYW5nZWQgZXZlbnRzIHdpdGggcGF0aCBpbmZvcm1hdGlvbiBpbiB0aGUgZGV0YWlsCiAgICogb2JqZWN0IHRvIGluZGljYXRlIGEgc3ViLXBhdGggb2YgdGhlIHByb3BlcnR5IHdhcyBjaGFuZ2VkLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGZpcmUgdGhlIGV2ZW50CiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggdGhhdCB3YXMgY2hhbmdlZAogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwYXRoIHdhcyBub3RpZmllZAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5UGF0aChpbnN0LCBwYXRoLCBwcm9wcykgewogICAgbGV0IHJvb3RQcm9wZXJ0eSA9IFBvbHltZXIuUGF0aC5yb290KHBhdGgpOwogICAgaWYgKHJvb3RQcm9wZXJ0eSAhPT0gcGF0aCkgewogICAgICBsZXQgZXZlbnROYW1lID0gUG9seW1lci5DYXNlTWFwLmNhbWVsVG9EYXNoQ2FzZShyb290UHJvcGVydHkpICsgJy1jaGFuZ2VkJzsKICAgICAgZGlzcGF0Y2hOb3RpZnlFdmVudChpbnN0LCBldmVudE5hbWUsIHByb3BzW3BhdGhdLCBwYXRoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvKioKICAgKiBEaXNwYXRjaGVzIHtwcm9wZXJ0eX0tY2hhbmdlZCBldmVudHMgdG8gaW5kaWNhdGUgYSBwcm9wZXJ0eSAob3IgcGF0aCkKICAgKiBjaGFuZ2VkLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGZpcmUgdGhlIGV2ZW50CiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gc2VuZCAoJ3twcm9wZXJ0eX0tY2hhbmdlZCcpCiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGNoYW5nZWQgcHJvcGVydHkKICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IHBhdGggSWYgYSBzdWItcGF0aCBvZiB0aGlzIHByb3BlcnR5IGNoYW5nZWQsIHRoZSBwYXRoCiAgICogICB0aGF0IGNoYW5nZWQgKG9wdGlvbmFsKS4KICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICovCiAgZnVuY3Rpb24gZGlzcGF0Y2hOb3RpZnlFdmVudChpbnN0LCBldmVudE5hbWUsIHZhbHVlLCBwYXRoKSB7CiAgICBsZXQgZGV0YWlsID0gewogICAgICB2YWx1ZTogdmFsdWUsCiAgICAgIHF1ZXVlUHJvcGVydHk6IHRydWUKICAgIH07CiAgICBpZiAocGF0aCkgewogICAgICBkZXRhaWwucGF0aCA9IHBhdGg7CiAgICB9CiAgICAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8oaW5zdCkuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGRldGFpbCB9KSk7CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAibm90aWZ5IiBlZmZlY3QuCiAgICoKICAgKiBEaXNwYXRjaGVzIGEgbm9uLWJ1YmJsaW5nIGV2ZW50IG5hbWVkIGBpbmZvLmV2ZW50TmFtZWAgb24gdGhlIGluc3RhbmNlCiAgICogd2l0aCBhIGRldGFpbCBvYmplY3QgY29udGFpbmluZyB0aGUgbmV3IGB2YWx1ZWAuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5Ob3RpZnlFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbywgaGFzUGF0aHMpIHsKICAgIGxldCByb290UHJvcGVydHkgPSBoYXNQYXRocyA/IFBvbHltZXIuUGF0aC5yb290KHByb3BlcnR5KSA6IHByb3BlcnR5OwogICAgbGV0IHBhdGggPSByb290UHJvcGVydHkgIT0gcHJvcGVydHkgPyBwcm9wZXJ0eSA6IG51bGw7CiAgICBsZXQgdmFsdWUgPSBwYXRoID8gUG9seW1lci5QYXRoLmdldChpbnN0LCBwYXRoKSA6IGluc3QuX19kYXRhW3Byb3BlcnR5XTsKICAgIGlmIChwYXRoICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgdmFsdWUgPSBwcm9wc1twcm9wZXJ0eV07ICAvLyBzcGVjaWZpY2FsbHkgZm9yIC5zcGxpY2VzCiAgICB9CiAgICBkaXNwYXRjaE5vdGlmeUV2ZW50KGluc3QsIGluZm8uZXZlbnROYW1lLCB2YWx1ZSwgcGF0aCk7CiAgfQoKICAvKioKICAgKiBIYW5kbGVyIGZ1bmN0aW9uIGZvciAyLXdheSBub3RpZmljYXRpb24gZXZlbnRzLiBSZWNlaXZlcyBjb250ZXh0CiAgICogaW5mb3JtYXRpb24gY2FwdHVyZWQgaW4gdGhlIGBhZGROb3RpZnlMaXN0ZW5lcmAgY2xvc3VyZSBmcm9tIHRoZQogICAqIGBfX25vdGlmeUxpc3RlbmVyc2AgbWV0YWRhdGEuCiAgICoKICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbm90aWZpZWQgcHJvcGVydHkgdG8gdGhlIGhvc3QgcHJvcGVydHkgb3IgcGF0aC4gIElmCiAgICogdGhlIGV2ZW50IGNvbnRhaW5lZCBwYXRoIGluZm9ybWF0aW9uLCB0cmFuc2xhdGUgdGhhdCBwYXRoIHRvIHRoZSBob3N0CiAgICogc2NvcGUncyBuYW1lIGZvciB0aGF0IHBhdGggZmlyc3QuCiAgICoKICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCBOb3RpZmljYXRpb24gZXZlbnQgKGUuZy4gJzxwcm9wZXJ0eT4tY2hhbmdlZCcpCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBIb3N0IGVsZW1lbnQgaW5zdGFuY2UgaGFuZGxpbmcgdGhlIG5vdGlmaWNhdGlvbiBldmVudAogICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tUHJvcCBDaGlsZCBlbGVtZW50IHByb3BlcnR5IHRoYXQgd2FzIGJvdW5kCiAgICogQHBhcmFtIHtzdHJpbmd9IHRvUGF0aCBIb3N0IHByb3BlcnR5L3BhdGggdGhhdCB3YXMgYm91bmQKICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5lZ2F0ZSBXaGV0aGVyIHRoZSBiaW5kaW5nIHdhcyBuZWdhdGVkCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGhhbmRsZU5vdGlmaWNhdGlvbihldmVudCwgaW5zdCwgZnJvbVByb3AsIHRvUGF0aCwgbmVnYXRlKSB7CiAgICBsZXQgdmFsdWU7CiAgICBsZXQgZGV0YWlsID0gLyoqIEB0eXBlIHtPYmplY3R9ICovKGV2ZW50LmRldGFpbCk7CiAgICBsZXQgZnJvbVBhdGggPSBkZXRhaWwgJiYgZGV0YWlsLnBhdGg7CiAgICBpZiAoZnJvbVBhdGgpIHsKICAgICAgdG9QYXRoID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShmcm9tUHJvcCwgdG9QYXRoLCBmcm9tUGF0aCk7CiAgICAgIHZhbHVlID0gZGV0YWlsICYmIGRldGFpbC52YWx1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHZhbHVlID0gZXZlbnQuY3VycmVudFRhcmdldFtmcm9tUHJvcF07CiAgICB9CiAgICB2YWx1ZSA9IG5lZ2F0ZSA/ICF2YWx1ZSA6IHZhbHVlOwogICAgaWYgKCFpbnN0W1RZUEVTLlJFQURfT05MWV0gfHwgIWluc3RbVFlQRVMuUkVBRF9PTkxZXVt0b1BhdGhdKSB7CiAgICAgIGlmIChpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgodG9QYXRoLCB2YWx1ZSwgdHJ1ZSwgQm9vbGVhbihmcm9tUGF0aCkpCiAgICAgICAgJiYgKCFkZXRhaWwgfHwgIWRldGFpbC5xdWV1ZVByb3BlcnR5KSkgewogICAgICAgIGluc3QuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qKgogICAqIEltcGxlbWVudHMgdGhlICJyZWZsZWN0IiBlZmZlY3QuCiAgICoKICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgbmFtZWQgYGluZm8uYXR0ck5hbWVgIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eSB2YWx1ZS4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7P30gaW5mbyBFZmZlY3QgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcnVuUmVmbGVjdEVmZmVjdChpbnN0LCBwcm9wZXJ0eSwgcHJvcHMsIG9sZFByb3BzLCBpbmZvKSB7CiAgICBsZXQgdmFsdWUgPSBpbnN0Ll9fZGF0YVtwcm9wZXJ0eV07CiAgICBpZiAoUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlKSB7CiAgICAgIHZhbHVlID0gUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlKHZhbHVlLCBpbmZvLmF0dHJOYW1lLCAnYXR0cmlidXRlJywgLyoqIEB0eXBlIHtOb2RlfSAqLyhpbnN0KSk7CiAgICB9CiAgICBpbnN0Ll9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBpbmZvLmF0dHJOYW1lLCB2YWx1ZSk7CiAgfQoKICAvKioKICAgKiBSdW5zICJjb21wdXRlZCIgZWZmZWN0cyBmb3IgYSBzZXQgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzLgogICAqCiAgICogVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIHRoZSBnZW5lcmljIGBydW5FZmZlY3RzYCBtZXRob2QgaW4gdGhhdCBpdAogICAqIGNvbnRpbnVlcyB0byBydW4gY29tcHV0ZWQgZWZmZWN0cyBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIGVhY2ggcGFzcyB1bnRpbAogICAqIHRoZXJlIGFyZSBubyBtb3JlIG5ld2x5IGNvbXB1dGVkIHByb3BlcnRpZXMuICBUaGlzIGVuc3VyZXMgdGhhdCBhbGwKICAgKiBwcm9wZXJ0aWVzIHRoYXQgd2lsbCBiZSBjb21wdXRlZCBieSB0aGUgaW5pdGlhbCBzZXQgb2YgY2hhbmdlcyBhcmUKICAgKiBjb21wdXRlZCBiZWZvcmUgb3RoZXIgZWZmZWN0cyAoYmluZGluZyBwcm9wYWdhdGlvbiwgb2JzZXJ2ZXJzLCBhbmQgbm90aWZ5KQogICAqIHJ1bi4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0geyFPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHshT2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkNvbXB1dGVkRWZmZWN0cyhpbnN0LCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocykgewogICAgbGV0IGNvbXB1dGVFZmZlY3RzID0gaW5zdFtUWVBFUy5DT01QVVRFXTsKICAgIGlmIChjb21wdXRlRWZmZWN0cykgewogICAgICBsZXQgaW5wdXRQcm9wcyA9IGNoYW5nZWRQcm9wczsKICAgICAgd2hpbGUgKHJ1bkVmZmVjdHMoaW5zdCwgY29tcHV0ZUVmZmVjdHMsIGlucHV0UHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocykpIHsKICAgICAgICBPYmplY3QuYXNzaWduKG9sZFByb3BzLCBpbnN0Ll9fZGF0YU9sZCk7CiAgICAgICAgT2JqZWN0LmFzc2lnbihjaGFuZ2VkUHJvcHMsIGluc3QuX19kYXRhUGVuZGluZyk7CiAgICAgICAgaW5wdXRQcm9wcyA9IGluc3QuX19kYXRhUGVuZGluZzsKICAgICAgICBpbnN0Ll9fZGF0YVBlbmRpbmcgPSBudWxsOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAiY29tcHV0ZWQgcHJvcGVydHkiIGVmZmVjdCBieSBydW5uaW5nIHRoZSBtZXRob2Qgd2l0aCB0aGUKICAgKiB2YWx1ZXMgb2YgdGhlIGFyZ3VtZW50cyBzcGVjaWZpZWQgaW4gdGhlIGBpbmZvYCBvYmplY3QgYW5kIHNldHRpbmcgdGhlCiAgICogcmV0dXJuIHZhbHVlIHRvIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSBzcGVjaWZpZWQuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkNvbXB1dGVkRWZmZWN0KGluc3QsIHByb3BlcnR5LCBwcm9wcywgb2xkUHJvcHMsIGluZm8pIHsKICAgIGxldCByZXN1bHQgPSBydW5NZXRob2RFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbyk7CiAgICBsZXQgY29tcHV0ZWRQcm9wID0gaW5mby5tZXRob2RJbmZvOwogICAgaWYgKGluc3QuX19kYXRhSGFzQWNjZXNzb3IgJiYgaW5zdC5fX2RhdGFIYXNBY2Nlc3Nvcltjb21wdXRlZFByb3BdKSB7CiAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eShjb21wdXRlZFByb3AsIHJlc3VsdCwgdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBpbnN0W2NvbXB1dGVkUHJvcF0gPSByZXN1bHQ7CiAgICB9CiAgfQoKICAvKioKICAgKiBDb21wdXRlcyBwYXRoIGNoYW5nZXMgYmFzZWQgb24gcGF0aCBsaW5rcyBzZXQgdXAgdXNpbmcgdGhlIGBsaW5rUGF0aHNgCiAgICogQVBJLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugd2hvc2UgcHJvcHMgYXJlIGNoYW5naW5nCiAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8KHN0cmluZ3xudW1iZXIpPn0gcGF0aCBQYXRoIHRoYXQgaGFzIGNoYW5nZWQKICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIG9mIGNoYW5nZWQgcGF0aAogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBjb21wdXRlTGlua2VkUGF0aHMoaW5zdCwgcGF0aCwgdmFsdWUpIHsKICAgIGxldCBsaW5rcyA9IGluc3QuX19kYXRhTGlua2VkUGF0aHM7CiAgICBpZiAobGlua3MpIHsKICAgICAgbGV0IGxpbms7CiAgICAgIGZvciAobGV0IGEgaW4gbGlua3MpIHsKICAgICAgICBsZXQgYiA9IGxpbmtzW2FdOwogICAgICAgIGlmIChQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KGEsIHBhdGgpKSB7CiAgICAgICAgICBsaW5rID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShhLCBiLCBwYXRoKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChsaW5rLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgfSBlbHNlIGlmIChQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KGIsIHBhdGgpKSB7CiAgICAgICAgICBsaW5rID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShiLCBhLCBwYXRoKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChsaW5rLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLyAtLSBiaW5kaW5ncyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8qKgogICAqIEFkZHMgYmluZGluZyBtZXRhZGF0YSB0byB0aGUgY3VycmVudCBgbm9kZUluZm9gLCBhbmQgYmluZGluZyBlZmZlY3RzCiAgICogZm9yIGFsbCBwYXJ0IGRlcGVuZGVuY2llcyB0byBgdGVtcGxhdGVJbmZvYC4KICAgKgogICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yIENsYXNzIHRoYXQgYF9wYXJzZVRlbXBsYXRlYCBpcyBjdXJyZW50bHkKICAgKiAgIHJ1bm5pbmcgb24KICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICogQHBhcmFtIHtzdHJpbmd9IGtpbmQgQmluZGluZyBraW5kLCBlaXRoZXIgJ3Byb3BlcnR5JywgJ2F0dHJpYnV0ZScsIG9yICd0ZXh0JwogICAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgVGFyZ2V0IHByb3BlcnR5IG5hbWUKICAgKiBAcGFyYW0geyFBcnJheTwhQmluZGluZ1BhcnQ+fSBwYXJ0cyBBcnJheSBvZiBiaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcGFyYW0ge3N0cmluZz19IGxpdGVyYWwgTGl0ZXJhbCB0ZXh0IHN1cnJvdW5kaW5nIGJpbmRpbmcgcGFydHMgKHNwZWNpZmllZAogICAqICAgb25seSBmb3IgJ3Byb3BlcnR5JyBiaW5kaW5ncywgc2luY2UgdGhlc2UgbXVzdCBiZSBpbml0aWFsaXplZCBhcyBwYXJ0CiAgICogICBvZiBib290LXVwKQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBhZGRCaW5kaW5nKGNvbnN0cnVjdG9yLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCBraW5kLCB0YXJnZXQsIHBhcnRzLCBsaXRlcmFsKSB7CiAgICAvLyBDcmVhdGUgYmluZGluZyBtZXRhZGF0YSBhbmQgYWRkIHRvIG5vZGVJbmZvCiAgICBub2RlSW5mby5iaW5kaW5ncyA9IG5vZGVJbmZvLmJpbmRpbmdzIHx8IFtdOwogICAgbGV0IC8qKiBCaW5kaW5nICovIGJpbmRpbmcgPSB7IGtpbmQsIHRhcmdldCwgcGFydHMsIGxpdGVyYWwsIGlzQ29tcG91bmQ6IChwYXJ0cy5sZW5ndGggIT09IDEpIH07CiAgICBub2RlSW5mby5iaW5kaW5ncy5wdXNoKGJpbmRpbmcpOwogICAgLy8gQWRkIGxpc3RlbmVyIGluZm8gdG8gYmluZGluZyBtZXRhZGF0YQogICAgaWYgKHNob3VsZEFkZExpc3RlbmVyKGJpbmRpbmcpKSB7CiAgICAgIGxldCB7ZXZlbnQsIG5lZ2F0ZX0gPSBiaW5kaW5nLnBhcnRzWzBdOwogICAgICBiaW5kaW5nLmxpc3RlbmVyRXZlbnQgPSBldmVudCB8fCAoQ2FzZU1hcC5jYW1lbFRvRGFzaENhc2UodGFyZ2V0KSArICctY2hhbmdlZCcpOwogICAgICBiaW5kaW5nLmxpc3RlbmVyTmVnYXRlID0gbmVnYXRlOwogICAgfQogICAgLy8gQWRkICJwcm9wYWdhdGUiIHByb3BlcnR5IGVmZmVjdHMgdG8gdGVtcGxhdGVJbmZvCiAgICBsZXQgaW5kZXggPSB0ZW1wbGF0ZUluZm8ubm9kZUluZm9MaXN0Lmxlbmd0aDsKICAgIGZvciAobGV0IGk9MDsgaTxiaW5kaW5nLnBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBwYXJ0ID0gYmluZGluZy5wYXJ0c1tpXTsKICAgICAgcGFydC5jb21wb3VuZEluZGV4ID0gaTsKICAgICAgYWRkRWZmZWN0Rm9yQmluZGluZ1BhcnQoY29uc3RydWN0b3IsIHRlbXBsYXRlSW5mbywgYmluZGluZywgcGFydCwgaW5kZXgpOwogICAgfQogIH0KCiAgLyoqCiAgICogQWRkcyBwcm9wZXJ0eSBlZmZlY3RzIHRvIHRoZSBnaXZlbiBgdGVtcGxhdGVJbmZvYCBmb3IgdGhlIGdpdmVuIGJpbmRpbmcKICAgKiBwYXJ0LgogICAqCiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29uc3RydWN0b3IgQ2xhc3MgdGhhdCBgX3BhcnNlVGVtcGxhdGVgIGlzIGN1cnJlbnRseQogICAqICAgcnVubmluZyBvbgogICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcGFyYW0geyFCaW5kaW5nUGFydH0gcGFydCBCaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggaW50byBgbm9kZUluZm9MaXN0YCBmb3IgdGhpcyBub2RlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBmdW5jdGlvbiBhZGRFZmZlY3RGb3JCaW5kaW5nUGFydChjb25zdHJ1Y3RvciwgdGVtcGxhdGVJbmZvLCBiaW5kaW5nLCBwYXJ0LCBpbmRleCkgewogICAgaWYgKCFwYXJ0LmxpdGVyYWwpIHsKICAgICAgaWYgKGJpbmRpbmcua2luZCA9PT0gJ2F0dHJpYnV0ZScgJiYgYmluZGluZy50YXJnZXRbMF0gPT09ICctJykgewogICAgICAgIGNvbnNvbGUud2FybignQ2Fubm90IHNldCBhdHRyaWJ1dGUgJyArIGJpbmRpbmcudGFyZ2V0ICsKICAgICAgICAgICcgYmVjYXVzZSAiLSIgaXMgbm90IGEgdmFsaWQgYXR0cmlidXRlIHN0YXJ0aW5nIGNoYXJhY3RlcicpOwogICAgICB9IGVsc2UgewogICAgICAgIGxldCBkZXBlbmRlbmNpZXMgPSBwYXJ0LmRlcGVuZGVuY2llczsKICAgICAgICBsZXQgaW5mbyA9IHsgaW5kZXgsIGJpbmRpbmcsIHBhcnQsIGV2YWx1YXRvcjogY29uc3RydWN0b3IgfTsKICAgICAgICBmb3IgKGxldCBqPTA7IGo8ZGVwZW5kZW5jaWVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBsZXQgdHJpZ2dlciA9IGRlcGVuZGVuY2llc1tqXTsKICAgICAgICAgIGlmICh0eXBlb2YgdHJpZ2dlciA9PSAnc3RyaW5nJykgewogICAgICAgICAgICB0cmlnZ2VyID0gcGFyc2VBcmcodHJpZ2dlcik7CiAgICAgICAgICAgIHRyaWdnZXIud2lsZGNhcmQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgY29uc3RydWN0b3IuX2FkZFRlbXBsYXRlUHJvcGVydHlFZmZlY3QodGVtcGxhdGVJbmZvLCB0cmlnZ2VyLnJvb3RQcm9wZXJ0eSwgewogICAgICAgICAgICBmbjogcnVuQmluZGluZ0VmZmVjdCwKICAgICAgICAgICAgaW5mbywgdHJpZ2dlcgogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAiYmluZGluZyIgKHByb3BlcnR5L3BhdGggYmluZGluZykgZWZmZWN0LgogICAqCiAgICogTm90ZSB0aGF0IGJpbmRpbmcgc3ludGF4IGlzIG92ZXJyaWRhYmxlIHZpYSBgX3BhcnNlQmluZGluZ3NgIGFuZAogICAqIGBfZXZhbHVhdGVCaW5kaW5nYC4gIFRoaXMgbWV0aG9kIHdpbGwgY2FsbCBgX2V2YWx1YXRlQmluZGluZ2AgZm9yIGFueQogICAqIG5vbi1saXRlcmFsIHBhcnRzIHJldHVybmVkIGZyb20gYF9wYXJzZUJpbmRpbmdzYC4gIEhvd2V2ZXIsCiAgICogdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgX3BhdGhfIGJpbmRpbmdzIHZpYSBjdXN0b20gYmluZGluZyBwYXJ0cywKICAgKiBhcyB0aGlzIGlzIHNwZWNpZmljIHRvIFBvbHltZXIncyBwYXRoIGJpbmRpbmcgc3ludGF4LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2UgdGhlIGVmZmVjdCB3aWxsIGJlIHJ1biBvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEBwYXJhbSB7QXJyYXl9IG5vZGVMaXN0IExpc3Qgb2Ygbm9kZXMgYXNzb2NpYXRlZCB3aXRoIGBub2RlSW5mb0xpc3RgIHRlbXBsYXRlCiAgICogICBtZXRhZGF0YQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5CaW5kaW5nRWZmZWN0KGluc3QsIHBhdGgsIHByb3BzLCBvbGRQcm9wcywgaW5mbywgaGFzUGF0aHMsIG5vZGVMaXN0KSB7CiAgICBsZXQgbm9kZSA9IG5vZGVMaXN0W2luZm8uaW5kZXhdOwogICAgbGV0IGJpbmRpbmcgPSBpbmZvLmJpbmRpbmc7CiAgICBsZXQgcGFydCA9IGluZm8ucGFydDsKICAgIC8vIFN1YnBhdGggbm90aWZpY2F0aW9uOiB0cmFuc2Zvcm0gcGF0aCBhbmQgc2V0IHRvIGNsaWVudAogICAgLy8gZS5nLjogZm9vPSJ7e29iai5zdWJ9fSIsIHBhdGg6ICdvYmouc3ViLnByb3AnLCBzZXQgJ2Zvby5wcm9wJz1vYmouc3ViLnByb3AKICAgIGlmIChoYXNQYXRocyAmJiBwYXJ0LnNvdXJjZSAmJiAocGF0aC5sZW5ndGggPiBwYXJ0LnNvdXJjZS5sZW5ndGgpICYmCiAgICAgICAgKGJpbmRpbmcua2luZCA9PSAncHJvcGVydHknKSAmJiAhYmluZGluZy5pc0NvbXBvdW5kICYmCiAgICAgICAgbm9kZS5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50ICYmCiAgICAgICAgbm9kZS5fX2RhdGFIYXNBY2Nlc3NvciAmJiBub2RlLl9fZGF0YUhhc0FjY2Vzc29yW2JpbmRpbmcudGFyZ2V0XSkgewogICAgICBsZXQgdmFsdWUgPSBwcm9wc1twYXRoXTsKICAgICAgcGF0aCA9IFBvbHltZXIuUGF0aC50cmFuc2xhdGUocGFydC5zb3VyY2UsIGJpbmRpbmcudGFyZ2V0LCBwYXRoKTsKICAgICAgaWYgKG5vZGUuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChwYXRoLCB2YWx1ZSwgZmFsc2UsIHRydWUpKSB7CiAgICAgICAgaW5zdC5fZW5xdWV1ZUNsaWVudChub2RlKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbGV0IHZhbHVlID0gaW5mby5ldmFsdWF0b3IuX2V2YWx1YXRlQmluZGluZyhpbnN0LCBwYXJ0LCBwYXRoLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgLy8gUHJvcGFnYXRlIHZhbHVlIHRvIGNoaWxkCiAgICAgIGFwcGx5QmluZGluZ1ZhbHVlKGluc3QsIG5vZGUsIGJpbmRpbmcsIHBhcnQsIHZhbHVlKTsKICAgIH0KICB9CgogIC8qKgogICAqIFNldHMgdGhlIHZhbHVlIGZvciBhbiAiYmluZGluZyIgKGJpbmRpbmcpIGVmZmVjdCB0byBhIG5vZGUsCiAgICogZWl0aGVyIGFzIGEgcHJvcGVydHkgb3IgYXR0cmlidXRlLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugb3duaW5nIHRoZSBiaW5kaW5nIGVmZmVjdAogICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBUYXJnZXQgbm9kZSBmb3IgYmluZGluZwogICAqIEBwYXJhbSB7IUJpbmRpbmd9IGJpbmRpbmcgQmluZGluZyBtZXRhZGF0YQogICAqIEBwYXJhbSB7IUJpbmRpbmdQYXJ0fSBwYXJ0IEJpbmRpbmcgcGFydCBtZXRhZGF0YQogICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGFwcGx5QmluZGluZ1ZhbHVlKGluc3QsIG5vZGUsIGJpbmRpbmcsIHBhcnQsIHZhbHVlKSB7CiAgICB2YWx1ZSA9IGNvbXB1dGVCaW5kaW5nVmFsdWUobm9kZSwgdmFsdWUsIGJpbmRpbmcsIHBhcnQpOwogICAgaWYgKFBvbHltZXIuc2FuaXRpemVET01WYWx1ZSkgewogICAgICB2YWx1ZSA9IFBvbHltZXIuc2FuaXRpemVET01WYWx1ZSh2YWx1ZSwgYmluZGluZy50YXJnZXQsIGJpbmRpbmcua2luZCwgbm9kZSk7CiAgICB9CiAgICBpZiAoYmluZGluZy5raW5kID09ICdhdHRyaWJ1dGUnKSB7CiAgICAgIC8vIEF0dHJpYnV0ZSBiaW5kaW5nCiAgICAgIGluc3QuX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKC8qKiBAdHlwZSB7RWxlbWVudH0gKi8obm9kZSksIHZhbHVlLCBiaW5kaW5nLnRhcmdldCk7CiAgICB9IGVsc2UgewogICAgICAvLyBQcm9wZXJ0eSBiaW5kaW5nCiAgICAgIGxldCBwcm9wID0gYmluZGluZy50YXJnZXQ7CiAgICAgIGlmIChub2RlLl9faXNQcm9wZXJ0eUVmZmVjdHNDbGllbnQgJiYKICAgICAgICAgIG5vZGUuX19kYXRhSGFzQWNjZXNzb3IgJiYgbm9kZS5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wXSkgewogICAgICAgIGlmICghbm9kZVtUWVBFUy5SRUFEX09OTFldIHx8ICFub2RlW1RZUEVTLlJFQURfT05MWV1bcHJvcF0pIHsKICAgICAgICAgIGlmIChub2RlLl9zZXRQZW5kaW5nUHJvcGVydHkocHJvcCwgdmFsdWUpKSB7CiAgICAgICAgICAgIGluc3QuX2VucXVldWVDbGllbnQobm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgIHsKICAgICAgICBpbnN0Ll9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZShub2RlLCBwcm9wLCB2YWx1ZSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qKgogICAqIFRyYW5zZm9ybXMgYW4gImJpbmRpbmciIGVmZmVjdCB2YWx1ZSBiYXNlZCBvbiBjb21wb3VuZCAmIG5lZ2F0aW9uCiAgICogZWZmZWN0IG1ldGFkYXRhLCBhcyB3ZWxsIGFzIGhhbmRsaW5nIGZvciBzcGVjaWFsLWNhc2UgcHJvcGVydGllcwogICAqCiAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgdGhlIHZhbHVlIHdpbGwgYmUgc2V0IHRvCiAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcGFyYW0geyFCaW5kaW5nUGFydH0gcGFydCBCaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHsqfSBUcmFuc2Zvcm1lZCB2YWx1ZSB0byBzZXQKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGNvbXB1dGVCaW5kaW5nVmFsdWUobm9kZSwgdmFsdWUsIGJpbmRpbmcsIHBhcnQpIHsKICAgIGlmIChiaW5kaW5nLmlzQ29tcG91bmQpIHsKICAgICAgbGV0IHN0b3JhZ2UgPSBub2RlLl9fZGF0YUNvbXBvdW5kU3RvcmFnZVtiaW5kaW5nLnRhcmdldF07CiAgICAgIHN0b3JhZ2VbcGFydC5jb21wb3VuZEluZGV4XSA9IHZhbHVlOwogICAgICB2YWx1ZSA9IHN0b3JhZ2Uuam9pbignJyk7CiAgICB9CiAgICBpZiAoYmluZGluZy5raW5kICE9PSAnYXR0cmlidXRlJykgewogICAgICAvLyBTb21lIGJyb3dzZXJzIHNlcmlhbGl6ZSBgdW5kZWZpbmVkYCB0byBgInVuZGVmaW5lZCJgCiAgICAgIGlmIChiaW5kaW5nLnRhcmdldCA9PT0gJ3RleHRDb250ZW50JyB8fAogICAgICAgICAgKGJpbmRpbmcudGFyZ2V0ID09PSAndmFsdWUnICYmCiAgICAgICAgICAgIChub2RlLmxvY2FsTmFtZSA9PT0gJ2lucHV0JyB8fCBub2RlLmxvY2FsTmFtZSA9PT0gJ3RleHRhcmVhJykpKSB7CiAgICAgICAgdmFsdWUgPSB2YWx1ZSA9PSB1bmRlZmluZWQgPyAnJyA6IHZhbHVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgYSBiaW5kaW5nJ3MgbWV0YWRhdGEgbWVldHMgYWxsIHRoZSByZXF1aXJlbWVudHMgdG8gYWxsb3cKICAgKiAyLXdheSBiaW5kaW5nLCBhbmQgdGhlcmVmb3JlIGEgYDxwcm9wZXJ0eT4tY2hhbmdlZGAgZXZlbnQgbGlzdGVuZXIgc2hvdWxkIGJlCiAgICogYWRkZWQ6CiAgICogLSB1c2VkIGN1cmx5IGJyYWNlcwogICAqIC0gaXMgYSBwcm9wZXJ0eSAobm90IGF0dHJpYnV0ZSkgYmluZGluZwogICAqIC0gaXMgbm90IGEgdGV4dENvbnRlbnQgYmluZGluZwogICAqIC0gaXMgbm90IGNvbXBvdW5kCiAgICoKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIDItd2F5IGxpc3RlbmVyIHNob3VsZCBiZSBhZGRlZAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gc2hvdWxkQWRkTGlzdGVuZXIoYmluZGluZykgewogICAgcmV0dXJuIEJvb2xlYW4oYmluZGluZy50YXJnZXQpICYmCiAgICAgICAgICAgYmluZGluZy5raW5kICE9ICdhdHRyaWJ1dGUnICYmCiAgICAgICAgICAgYmluZGluZy5raW5kICE9ICd0ZXh0JyAmJgogICAgICAgICAgICFiaW5kaW5nLmlzQ29tcG91bmQgJiYKICAgICAgICAgICBiaW5kaW5nLnBhcnRzWzBdLm1vZGUgPT09ICd7JzsKICB9CgogIC8qKgogICAqIFNldHVwIGNvbXBvdW5kIGJpbmRpbmcgc3RvcmFnZSBzdHJ1Y3R1cmVzLCBub3RpZnkgbGlzdGVuZXJzLCBhbmQgZGF0YUhvc3QKICAgKiByZWZlcmVuY2VzIG9udG8gdGhlIGJvdW5kIG5vZGVMaXN0LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBJbnN0YW5jZSB0aGF0IGJhcyBiZWVuIHByZXZpb3VzbHkgYm91bmQKICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNldHVwQmluZGluZ3MoaW5zdCwgdGVtcGxhdGVJbmZvKSB7CiAgICAvLyBTZXR1cCBjb21wb3VuZCBzdG9yYWdlLCBkYXRhSG9zdCwgYW5kIG5vdGlmeSBsaXN0ZW5lcnMKICAgIGxldCB7bm9kZUxpc3QsIG5vZGVJbmZvTGlzdH0gPSB0ZW1wbGF0ZUluZm87CiAgICBpZiAobm9kZUluZm9MaXN0Lmxlbmd0aCkgewogICAgICBmb3IgKGxldCBpPTA7IGkgPCBub2RlSW5mb0xpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgaW5mbyA9IG5vZGVJbmZvTGlzdFtpXTsKICAgICAgICBsZXQgbm9kZSA9IG5vZGVMaXN0W2ldOwogICAgICAgIGxldCBiaW5kaW5ncyA9IGluZm8uYmluZGluZ3M7CiAgICAgICAgaWYgKGJpbmRpbmdzKSB7CiAgICAgICAgICBmb3IgKGxldCBpPTA7IGk8YmluZGluZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGJpbmRpbmcgPSBiaW5kaW5nc1tpXTsKICAgICAgICAgICAgc2V0dXBDb21wb3VuZFN0b3JhZ2Uobm9kZSwgYmluZGluZyk7CiAgICAgICAgICAgIGFkZE5vdGlmeUxpc3RlbmVyKG5vZGUsIGluc3QsIGJpbmRpbmcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBub2RlLl9fZGF0YUhvc3QgPSBpbnN0OwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbml0aWFsaXplcyBgX19kYXRhQ29tcG91bmRTdG9yYWdlYCBsb2NhbCBzdG9yYWdlIG9uIGEgYm91bmQgbm9kZSB3aXRoCiAgICogaW5pdGlhbCBsaXRlcmFsIGRhdGEgZm9yIGNvbXBvdW5kIGJpbmRpbmdzLCBhbmQgc2V0cyB0aGUgam9pbmVkCiAgICogbGl0ZXJhbCBwYXJ0cyB0byB0aGUgYm91bmQgcHJvcGVydHkuCiAgICoKICAgKiBXaGVuIGNoYW5nZXMgdG8gY29tcG91bmQgcGFydHMgb2NjdXIsIHRoZXkgYXJlIGZpcnN0IHNldCBpbnRvIHRoZSBjb21wb3VuZAogICAqIHN0b3JhZ2UgYXJyYXkgZm9yIHRoYXQgcHJvcGVydHksIGFuZCB0aGVuIHRoZSBhcnJheSBpcyBqb2luZWQgdG8gcmVzdWx0IGluCiAgICogdGhlIGZpbmFsIHZhbHVlIHNldCB0byB0aGUgcHJvcGVydHkvYXR0cmlidXRlLgogICAqCiAgICogQHBhcmFtIHtOb2RlfSBub2RlIEJvdW5kIG5vZGUgdG8gaW5pdGlhbGl6ZQogICAqIEBwYXJhbSB7QmluZGluZ30gYmluZGluZyBCaW5kaW5nIG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNldHVwQ29tcG91bmRTdG9yYWdlKG5vZGUsIGJpbmRpbmcpIHsKICAgIGlmIChiaW5kaW5nLmlzQ29tcG91bmQpIHsKICAgICAgLy8gQ3JlYXRlIGNvbXBvdW5kIHN0b3JhZ2UgbWFwCiAgICAgIGxldCBzdG9yYWdlID0gbm9kZS5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgfHwKICAgICAgICAobm9kZS5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgPSB7fSk7CiAgICAgIGxldCBwYXJ0cyA9IGJpbmRpbmcucGFydHM7CiAgICAgIC8vIENvcHkgbGl0ZXJhbHMgZnJvbSBwYXJ0cyBpbnRvIHN0b3JhZ2UgZm9yIHRoaXMgYmluZGluZwogICAgICBsZXQgbGl0ZXJhbHMgPSBuZXcgQXJyYXkocGFydHMubGVuZ3RoKTsKICAgICAgZm9yIChsZXQgaj0wOyBqPHBhcnRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgbGl0ZXJhbHNbal0gPSBwYXJ0c1tqXS5saXRlcmFsOwogICAgICB9CiAgICAgIGxldCB0YXJnZXQgPSBiaW5kaW5nLnRhcmdldDsKICAgICAgc3RvcmFnZVt0YXJnZXRdID0gbGl0ZXJhbHM7CiAgICAgIC8vIENvbmZpZ3VyZSBwcm9wZXJ0aWVzIHdpdGggdGhlaXIgbGl0ZXJhbCBwYXJ0cwogICAgICBpZiAoYmluZGluZy5saXRlcmFsICYmIGJpbmRpbmcua2luZCA9PSAncHJvcGVydHknKSB7CiAgICAgICAgbm9kZVt0YXJnZXRdID0gYmluZGluZy5saXRlcmFsOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBBZGRzIGEgMi13YXkgYmluZGluZyBub3RpZmljYXRpb24gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG5vZGUgc3BlY2lmaWVkCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gbm9kZSBDaGlsZCBlbGVtZW50IHRvIGFkZCBsaXN0ZW5lciB0bwogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSG9zdCBlbGVtZW50IGluc3RhbmNlIHRvIGhhbmRsZSBub3RpZmljYXRpb24gZXZlbnQKICAgKiBAcGFyYW0ge0JpbmRpbmd9IGJpbmRpbmcgQmluZGluZyBtZXRhZGF0YQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBhZGROb3RpZnlMaXN0ZW5lcihub2RlLCBpbnN0LCBiaW5kaW5nKSB7CiAgICBpZiAoYmluZGluZy5saXN0ZW5lckV2ZW50KSB7CiAgICAgIGxldCBwYXJ0ID0gYmluZGluZy5wYXJ0c1swXTsKICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGJpbmRpbmcubGlzdGVuZXJFdmVudCwgZnVuY3Rpb24oZSkgewogICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihlLCBpbnN0LCBiaW5kaW5nLnRhcmdldCwgcGFydC5zb3VyY2UsIHBhcnQubmVnYXRlKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICAvLyAtLSBmb3IgbWV0aG9kLWJhc2VkIGVmZmVjdHMgKGNvbXBsZXhPYnNlcnZlciAmIGNvbXB1dGVkKSAtLS0tLS0tLS0tLS0tLQoKICAvKioKICAgKiBBZGRzIHByb3BlcnR5IGVmZmVjdHMgZm9yIGVhY2ggYXJndW1lbnQgaW4gdGhlIG1ldGhvZCBzaWduYXR1cmUgKGFuZAogICAqIG9wdGlvbmFsbHksIGZvciB0aGUgbWV0aG9kIG5hbWUgaWYgYGR5bmFtaWNgIGlzIHRydWUpIHRoYXQgY2FsbHMgdGhlCiAgICogcHJvdmlkZWQgZWZmZWN0IGZ1bmN0aW9uLgogICAqCiAgICogQHBhcmFtIHtFbGVtZW50IHwgT2JqZWN0fSBtb2RlbCBQcm90b3R5cGUgb3IgaW5zdGFuY2UKICAgKiBAcGFyYW0geyFNZXRob2RTaWduYXR1cmV9IHNpZyBNZXRob2Qgc2lnbmF0dXJlIG1ldGFkYXRhCiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVHlwZSBvZiBwcm9wZXJ0eSBlZmZlY3QgdG8gYWRkCiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWZmZWN0Rm4gRnVuY3Rpb24gdG8gcnVuIHdoZW4gYXJndW1lbnRzIGNoYW5nZQogICAqIEBwYXJhbSB7Kj19IG1ldGhvZEluZm8gRWZmZWN0LXNwZWNpZmljIGluZm9ybWF0aW9uIHRvIGJlIGluY2x1ZGVkIGluCiAgICogICBtZXRob2QgZWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZyB3aGV0aGVyCiAgICogICBtZXRob2QgbmFtZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LiBOb3RlLAogICAqICAgZGVmYXVsdHMgdG8gdHJ1ZSBpZiB0aGUgc2lnbmF0dXJlIGlzIHN0YXRpYyAoc2lnLnN0YXRpYyBpcyB0cnVlKS4KICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gY3JlYXRlTWV0aG9kRWZmZWN0KG1vZGVsLCBzaWcsIHR5cGUsIGVmZmVjdEZuLCBtZXRob2RJbmZvLCBkeW5hbWljRm4pIHsKICAgIGR5bmFtaWNGbiA9IHNpZy5zdGF0aWMgfHwgKGR5bmFtaWNGbiAmJgogICAgICAodHlwZW9mIGR5bmFtaWNGbiAhPT0gJ29iamVjdCcgfHwgZHluYW1pY0ZuW3NpZy5tZXRob2ROYW1lXSkpOwogICAgbGV0IGluZm8gPSB7CiAgICAgIG1ldGhvZE5hbWU6IHNpZy5tZXRob2ROYW1lLAogICAgICBhcmdzOiBzaWcuYXJncywKICAgICAgbWV0aG9kSW5mbywKICAgICAgZHluYW1pY0ZuCiAgICB9OwogICAgZm9yIChsZXQgaT0wLCBhcmc7IChpPHNpZy5hcmdzLmxlbmd0aCkgJiYgKGFyZz1zaWcuYXJnc1tpXSk7IGkrKykgewogICAgICBpZiAoIWFyZy5saXRlcmFsKSB7CiAgICAgICAgbW9kZWwuX2FkZFByb3BlcnR5RWZmZWN0KGFyZy5yb290UHJvcGVydHksIHR5cGUsIHsKICAgICAgICAgIGZuOiBlZmZlY3RGbiwgaW5mbzogaW5mbywgdHJpZ2dlcjogYXJnCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChkeW5hbWljRm4pIHsKICAgICAgbW9kZWwuX2FkZFByb3BlcnR5RWZmZWN0KHNpZy5tZXRob2ROYW1lLCB0eXBlLCB7CiAgICAgICAgZm46IGVmZmVjdEZuLCBpbmZvOiBpbmZvCiAgICAgIH0pOwogICAgfQogIH0KCiAgLyoqCiAgICogQ2FsbHMgYSBtZXRob2Qgd2l0aCBhcmd1bWVudHMgbWFyc2hhbGVkIGZyb20gcHJvcGVydGllcyBvbiB0aGUgaW5zdGFuY2UKICAgKiBiYXNlZCBvbiB0aGUgbWV0aG9kIHNpZ25hdHVyZSBjb250YWluZWQgaW4gdGhlIGVmZmVjdCBtZXRhZGF0YS4KICAgKgogICAqIE11bHRpLXByb3BlcnR5IG9ic2VydmVycywgY29tcHV0ZWQgcHJvcGVydGllcywgYW5kIGlubGluZSBjb21wdXRpbmcKICAgKiBmdW5jdGlvbnMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGludm9rZSB0aGUgbWV0aG9kLCB0aGVuIHVzZSB0aGUgcmV0dXJuCiAgICogdmFsdWUgYWNjb3JkaW5nbHkuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHJldHVybiB7Kn0gUmV0dXJucyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIG1ldGhvZCBpbnZvY2F0aW9uCiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5NZXRob2RFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbykgewogICAgLy8gSW5zdGFuY2VzIGNhbiBvcHRpb25hbGx5IGhhdmUgYSBfbWV0aG9kSG9zdCB3aGljaCBhbGxvd3MgcmVkaXJlY3Rpbmcgd2hlcmUKICAgIC8vIHRvIGZpbmQgbWV0aG9kcy4gQ3VycmVudGx5IHVzZWQgYnkgYHRlbXBsYXRpemVgLgogICAgbGV0IGNvbnRleHQgPSBpbnN0Ll9tZXRob2RIb3N0IHx8IGluc3Q7CiAgICBsZXQgZm4gPSBjb250ZXh0W2luZm8ubWV0aG9kTmFtZV07CiAgICBpZiAoZm4pIHsKICAgICAgbGV0IGFyZ3MgPSBpbnN0Ll9tYXJzaGFsQXJncyhpbmZvLmFyZ3MsIHByb3BlcnR5LCBwcm9wcyk7CiAgICAgIHJldHVybiBmbi5hcHBseShjb250ZXh0LCBhcmdzKTsKICAgIH0gZWxzZSBpZiAoIWluZm8uZHluYW1pY0ZuKSB7CiAgICAgIGNvbnNvbGUud2FybignbWV0aG9kIGAnICsgaW5mby5tZXRob2ROYW1lICsgJ2Agbm90IGRlZmluZWQnKTsKICAgIH0KICB9CgogIGNvbnN0IGVtcHR5QXJyYXkgPSBbXTsKCiAgLy8gUmVndWxhciBleHByZXNzaW9ucyB1c2VkIGZvciBiaW5kaW5nCiAgY29uc3QgSURFTlQgID0gJyg/OicgKyAnW2EtekEtWl8kXVtcXHcuOiRcXC0qXSonICsgJyknOwogIGNvbnN0IE5VTUJFUiA9ICcoPzonICsgJ1stK10/WzAtOV0qXFwuP1swLTldKyg/OltlRV1bLStdP1swLTldKyk/JyArICcpJzsKICBjb25zdCBTUVVPVEVfU1RSSU5HID0gJyg/OicgKyAnXCcoPzpbXlwnXFxcXF18XFxcXC4pKlwnJyArICcpJzsKICBjb25zdCBEUVVPVEVfU1RSSU5HID0gJyg/OicgKyAnIig/OlteIlxcXFxdfFxcXFwuKSoiJyArICcpJzsKICBjb25zdCBTVFJJTkcgPSAnKD86JyArIFNRVU9URV9TVFJJTkcgKyAnfCcgKyBEUVVPVEVfU1RSSU5HICsgJyknOwogIGNvbnN0IEFSR1VNRU5UID0gJyg/OignICsgSURFTlQgKyAnfCcgKyBOVU1CRVIgKyAnfCcgKyAgU1RSSU5HICsgJylcXHMqJyArICcpJzsKICBjb25zdCBBUkdVTUVOVFMgPSAnKD86JyArIEFSR1VNRU5UICsgJyg/OixcXHMqJyArIEFSR1VNRU5UICsgJykqJyArICcpJzsKICBjb25zdCBBUkdVTUVOVF9MSVNUID0gJyg/OicgKyAnXFwoXFxzKicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoPzonICsgQVJHVU1FTlRTICsgJz8nICsgJyknICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcKVxccyonICsgJyknOwogIGNvbnN0IEJJTkRJTkcgPSAnKCcgKyBJREVOVCArICdcXHMqJyArIEFSR1VNRU5UX0xJU1QgKyAnPycgKyAnKSc7IC8vIEdyb3VwIDMKICBjb25zdCBPUEVOX0JSQUNLRVQgPSAnKFxcW1xcW3x7eyknICsgJ1xccyonOwogIGNvbnN0IENMT1NFX0JSQUNLRVQgPSAnKD86XV18fX0pJzsKICBjb25zdCBORUdBVEUgPSAnKD86KCEpXFxzKik/JzsgLy8gR3JvdXAgMgogIGNvbnN0IEVYUFJFU1NJT04gPSBPUEVOX0JSQUNLRVQgKyBORUdBVEUgKyBCSU5ESU5HICsgQ0xPU0VfQlJBQ0tFVDsKICBjb25zdCBiaW5kaW5nUmVnZXggPSBuZXcgUmVnRXhwKEVYUFJFU1NJT04sICJnIik7CgogIC8qKgogICAqIENyZWF0ZSBhIHN0cmluZyBmcm9tIGJpbmRpbmcgcGFydHMgb2YgYWxsIHRoZSBsaXRlcmFsIHBhcnRzCiAgICoKICAgKiBAcGFyYW0geyFBcnJheTxCaW5kaW5nUGFydD59IHBhcnRzIEFsbCBwYXJ0cyB0byBzdHJpbmdpZnkKICAgKiBAcmV0dXJuIHtzdHJpbmd9IFN0cmluZyBtYWRlIGZyb20gdGhlIGxpdGVyYWwgcGFydHMKICAgKi8KICBmdW5jdGlvbiBsaXRlcmFsRnJvbVBhcnRzKHBhcnRzKSB7CiAgICBsZXQgcyA9ICcnOwogICAgZm9yIChsZXQgaT0wOyBpPHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBsaXRlcmFsID0gcGFydHNbaV0ubGl0ZXJhbDsKICAgICAgcyArPSBsaXRlcmFsIHx8ICcnOwogICAgfQogICAgcmV0dXJuIHM7CiAgfQoKICAvKioKICAgKiBQYXJzZXMgYW4gZXhwcmVzc2lvbiBzdHJpbmcgZm9yIGEgbWV0aG9kIHNpZ25hdHVyZSwgYW5kIHJldHVybnMgYSBtZXRhZGF0YQogICAqIGRlc2NyaWJpbmcgdGhlIG1ldGhvZCBpbiB0ZXJtcyBvZiBgbWV0aG9kTmFtZWAsIGBzdGF0aWNgICh3aGV0aGVyIGFsbCB0aGUKICAgKiBhcmd1bWVudHMgYXJlIGxpdGVyYWxzKSwgYW5kIGFuIGFycmF5IG9mIGBhcmdzYAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdG8gcGFyc2UKICAgKiBAcmV0dXJuIHs/TWV0aG9kU2lnbmF0dXJlfSBUaGUgbWV0aG9kIG1ldGFkYXRhIG9iamVjdCBpZiBhIG1ldGhvZCBleHByZXNzaW9uIHdhcwogICAqICAgZm91bmQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcGFyc2VNZXRob2QoZXhwcmVzc2lvbikgewogICAgLy8gdHJpZXMgdG8gbWF0Y2ggdmFsaWQgamF2YXNjcmlwdCBwcm9wZXJ0eSBuYW1lcwogICAgbGV0IG0gPSBleHByZXNzaW9uLm1hdGNoKC8oW15cc10rPylcKChbXHNcU10qKVwpLyk7CiAgICBpZiAobSkgewogICAgICBsZXQgbWV0aG9kTmFtZSA9IG1bMV07CiAgICAgIGxldCBzaWcgPSB7IG1ldGhvZE5hbWUsIHN0YXRpYzogdHJ1ZSwgYXJnczogZW1wdHlBcnJheSB9OwogICAgICBpZiAobVsyXS50cmltKCkpIHsKICAgICAgICAvLyByZXBsYWNlIGVzY2FwZWQgY29tbWFzIHdpdGggY29tbWEgZW50aXR5LCBzcGxpdCBvbiB1bi1lc2NhcGVkIGNvbW1hcwogICAgICAgIGxldCBhcmdzID0gbVsyXS5yZXBsYWNlKC9cXCwvZywgJyZjb21tYTsnKS5zcGxpdCgnLCcpOwogICAgICAgIHJldHVybiBwYXJzZUFyZ3MoYXJncywgc2lnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gc2lnOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhbiBhcnJheSBvZiBhcmd1bWVudHMgYW5kIHNldHMgdGhlIGBhcmdzYCBwcm9wZXJ0eSBvZiB0aGUgc3VwcGxpZWQKICAgKiBzaWduYXR1cmUgbWV0YWRhdGEgb2JqZWN0LiBTZXRzIHRoZSBgc3RhdGljYCBwcm9wZXJ0eSB0byBmYWxzZSBpZiBhbnkKICAgKiBhcmd1bWVudCBpcyBhIG5vbi1saXRlcmFsLgogICAqCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gYXJnTGlzdCBBcnJheSBvZiBhcmd1bWVudCBuYW1lcwogICAqIEBwYXJhbSB7IU1ldGhvZFNpZ25hdHVyZX0gc2lnIE1ldGhvZCBzaWduYXR1cmUgbWV0YWRhdGEgb2JqZWN0CiAgICogQHJldHVybiB7IU1ldGhvZFNpZ25hdHVyZX0gVGhlIHVwZGF0ZWQgc2lnbmF0dXJlIG1ldGFkYXRhIG9iamVjdAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcGFyc2VBcmdzKGFyZ0xpc3QsIHNpZykgewogICAgc2lnLmFyZ3MgPSBhcmdMaXN0Lm1hcChmdW5jdGlvbihyYXdBcmcpIHsKICAgICAgbGV0IGFyZyA9IHBhcnNlQXJnKHJhd0FyZyk7CiAgICAgIGlmICghYXJnLmxpdGVyYWwpIHsKICAgICAgICBzaWcuc3RhdGljID0gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIGFyZzsKICAgIH0sIHRoaXMpOwogICAgcmV0dXJuIHNpZzsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhbiBpbmRpdmlkdWFsIGFyZ3VtZW50LCBhbmQgcmV0dXJucyBhbiBhcmd1bWVudCBtZXRhZGF0YSBvYmplY3QKICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgZmllbGRzOgogICAqCiAgICogICB7CiAgICogICAgIHZhbHVlOiAncHJvcCcsICAgICAgICAvLyBwcm9wZXJ0eS9wYXRoIG9yIGxpdGVyYWwgdmFsdWUKICAgKiAgICAgbGl0ZXJhbDogZmFsc2UsICAgICAgIC8vIHdoZXRoZXIgYXJndW1lbnQgaXMgYSBsaXRlcmFsCiAgICogICAgIHN0cnVjdHVyZWQ6IGZhbHNlLCAgICAvLyB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyBhIHBhdGgKICAgKiAgICAgcm9vdFByb3BlcnR5OiAncHJvcCcsIC8vIHRoZSByb290IHByb3BlcnR5IG9mIHRoZSBwYXRoCiAgICogICAgIHdpbGRjYXJkOiBmYWxzZSAgICAgICAvLyB3aGV0aGVyIHRoZSBhcmd1bWVudCB3YXMgYSB3aWxkY2FyZCAnLionIHBhdGgKICAgKiAgIH0KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSByYXdBcmcgVGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgYXJndW1lbnQKICAgKiBAcmV0dXJuIHshTWV0aG9kQXJnfSBBcmd1bWVudCBtZXRhZGF0YSBvYmplY3QKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHBhcnNlQXJnKHJhd0FyZykgewogICAgLy8gY2xlYW4gdXAgd2hpdGVzcGFjZQogICAgbGV0IGFyZyA9IHJhd0FyZy50cmltKCkKICAgICAgLy8gcmVwbGFjZSBjb21tYSBlbnRpdHkgd2l0aCBjb21tYQogICAgICAucmVwbGFjZSgvJmNvbW1hOy9nLCAnLCcpCiAgICAgIC8vIHJlcGFpciBleHRyYSBlc2NhcGUgc2VxdWVuY2VzOyBub3RlIG9ubHkgY29tbWFzIHN0cmljdGx5IG5lZWQKICAgICAgLy8gZXNjYXBpbmcsIGJ1dCB3ZSBhbGxvdyBhbnkgb3RoZXIgY2hhciB0byBiZSBlc2NhcGVkIHNpbmNlIGl0cwogICAgICAvLyBsaWtlbHkgdXNlcnMgd2lsbCBkbyB0aGlzCiAgICAgIC5yZXBsYWNlKC9cXCguKS9nLCAnXCQxJykKICAgICAgOwogICAgLy8gYmFzaWMgYXJndW1lbnQgZGVzY3JpcHRvcgogICAgbGV0IGEgPSB7CiAgICAgIG5hbWU6IGFyZywKICAgICAgdmFsdWU6ICcnLAogICAgICBsaXRlcmFsOiBmYWxzZQogICAgfTsKICAgIC8vIGRldGVjdCBsaXRlcmFsIHZhbHVlIChtdXN0IGJlIFN0cmluZyBvciBOdW1iZXIpCiAgICBsZXQgZmMgPSBhcmdbMF07CiAgICBpZiAoZmMgPT09ICctJykgewogICAgICBmYyA9IGFyZ1sxXTsKICAgIH0KICAgIGlmIChmYyA+PSAnMCcgJiYgZmMgPD0gJzknKSB7CiAgICAgIGZjID0gJyMnOwogICAgfQogICAgc3dpdGNoKGZjKSB7CiAgICAgIGNhc2UgIiciOgogICAgICBjYXNlICciJzoKICAgICAgICBhLnZhbHVlID0gYXJnLnNsaWNlKDEsIC0xKTsKICAgICAgICBhLmxpdGVyYWwgPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICcjJzoKICAgICAgICBhLnZhbHVlID0gTnVtYmVyKGFyZyk7CiAgICAgICAgYS5saXRlcmFsID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgIH0KICAgIC8vIGlmIG5vdCBsaXRlcmFsLCBsb29rIGZvciBzdHJ1Y3R1cmVkIHBhdGgKICAgIGlmICghYS5saXRlcmFsKSB7CiAgICAgIGEucm9vdFByb3BlcnR5ID0gUG9seW1lci5QYXRoLnJvb3QoYXJnKTsKICAgICAgLy8gZGV0ZWN0IHN0cnVjdHVyZWQgcGF0aCAoaGFzIGRvdHMpCiAgICAgIGEuc3RydWN0dXJlZCA9IFBvbHltZXIuUGF0aC5pc1BhdGgoYXJnKTsKICAgICAgaWYgKGEuc3RydWN0dXJlZCkgewogICAgICAgIGEud2lsZGNhcmQgPSAoYXJnLnNsaWNlKC0yKSA9PSAnLionKTsKICAgICAgICBpZiAoYS53aWxkY2FyZCkgewogICAgICAgICAgYS5uYW1lID0gYXJnLnNsaWNlKDAsIC0yKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBhOwogIH0KCiAgLy8gZGF0YSBhcGkKCiAgLyoqCiAgICogU2VuZHMgYXJyYXkgc3BsaWNlIG5vdGlmaWNhdGlvbnMgKGAuc3BsaWNlc2AgYW5kIGAubGVuZ3RoYCkKICAgKgogICAqIE5vdGU6IHRoaXMgaW1wbGVtZW50YXRpb24gb25seSBhY2NlcHRzIG5vcm1hbGl6ZWQgcGF0aHMKICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSW5zdGFuY2UgdG8gc2VuZCBub3RpZmljYXRpb25zIHRvCiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRoZSBtdXRhdGlvbnMgb2NjdXJyZWQgb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byB0aGUgYXJyYXkgdGhhdCB3YXMgbXV0YXRlZAogICAqIEBwYXJhbSB7QXJyYXl9IHNwbGljZXMgQXJyYXkgb2Ygc3BsaWNlIHJlY29yZHMKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5U3BsaWNlcyhpbnN0LCBhcnJheSwgcGF0aCwgc3BsaWNlcykgewogICAgbGV0IHNwbGljZXNQYXRoID0gcGF0aCArICcuc3BsaWNlcyc7CiAgICBpbnN0Lm5vdGlmeVBhdGgoc3BsaWNlc1BhdGgsIHsgaW5kZXhTcGxpY2VzOiBzcGxpY2VzIH0pOwogICAgaW5zdC5ub3RpZnlQYXRoKHBhdGggKyAnLmxlbmd0aCcsIGFycmF5Lmxlbmd0aCk7CiAgICAvLyBOdWxsIGhlcmUgdG8gYWxsb3cgcG90ZW50aWFsbHkgbGFyZ2Ugc3BsaWNlIHJlY29yZHMgdG8gYmUgR0MnZWQuCiAgICBpbnN0Ll9fZGF0YVtzcGxpY2VzUGF0aF0gPSB7aW5kZXhTcGxpY2VzOiBudWxsfTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBzcGxpY2UgcmVjb3JkIGFuZCBzZW5kcyBhbiBhcnJheSBzcGxpY2Ugbm90aWZpY2F0aW9uIGZvcgogICAqIHRoZSBkZXNjcmliZWQgbXV0YXRpb24KICAgKgogICAqIE5vdGU6IHRoaXMgaW1wbGVtZW50YXRpb24gb25seSBhY2NlcHRzIG5vcm1hbGl6ZWQgcGF0aHMKICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSW5zdGFuY2UgdG8gc2VuZCBub3RpZmljYXRpb25zIHRvCiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRoZSBtdXRhdGlvbnMgb2NjdXJyZWQgb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byB0aGUgYXJyYXkgdGhhdCB3YXMgbXV0YXRlZAogICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCBhdCB3aGljaCB0aGUgYXJyYXkgbXV0YXRpb24gb2NjdXJyZWQKICAgKiBAcGFyYW0ge251bWJlcn0gYWRkZWRDb3VudCBOdW1iZXIgb2YgYWRkZWQgaXRlbXMKICAgKiBAcGFyYW0ge0FycmF5fSByZW1vdmVkIEFycmF5IG9mIHJlbW92ZWQgaXRlbXMKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5U3BsaWNlKGluc3QsIGFycmF5LCBwYXRoLCBpbmRleCwgYWRkZWRDb3VudCwgcmVtb3ZlZCkgewogICAgbm90aWZ5U3BsaWNlcyhpbnN0LCBhcnJheSwgcGF0aCwgW3sKICAgICAgaW5kZXg6IGluZGV4LAogICAgICBhZGRlZENvdW50OiBhZGRlZENvdW50LAogICAgICByZW1vdmVkOiByZW1vdmVkLAogICAgICBvYmplY3Q6IGFycmF5LAogICAgICB0eXBlOiAnc3BsaWNlJwogICAgfV0pOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhbiB1cHBlci1jYXNlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBTdHJpbmcgdG8gdXBwZXJjYXNlCiAgICogQHJldHVybiB7c3RyaW5nfSBVcHBlcmNhc2VkIHN0cmluZwogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gdXBwZXIobmFtZSkgewogICAgcmV0dXJuIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyaW5nKDEpOwogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIG1ldGEtcHJvZ3JhbW1pbmcgZm9yIFBvbHltZXIncyB0ZW1wbGF0ZQogICAqIGJpbmRpbmcgYW5kIGRhdGEgb2JzZXJ2YXRpb24gKGNvbGxlY3RpdmVseSwgInByb3BlcnR5IGVmZmVjdHMiKSBzeXN0ZW0uCiAgICoKICAgKiBUaGlzIG1peGluIHVzZXMgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBrZXkgc3RhdGljIG1ldGhvZHMgZm9yIGFkZGluZwogICAqIHByb3BlcnR5IGVmZmVjdHMgdG8gYW4gZWxlbWVudCBjbGFzczoKICAgKiAtIGBhZGRQcm9wZXJ0eUVmZmVjdGAKICAgKiAtIGBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyYAogICAqIC0gYGNyZWF0ZU1ldGhvZE9ic2VydmVyYAogICAqIC0gYGNyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5YAogICAqIC0gYGNyZWF0ZVJlYWRPbmx5UHJvcGVydHlgCiAgICogLSBgY3JlYXRlUmVmbGVjdGVkUHJvcGVydHlgCiAgICogLSBgY3JlYXRlQ29tcHV0ZWRQcm9wZXJ0eWAKICAgKiAtIGBiaW5kVGVtcGxhdGVgCiAgICoKICAgKiBFYWNoIG1ldGhvZCBjcmVhdGVzIG9uZSBvciBtb3JlIHByb3BlcnR5IGFjY2Vzc29ycywgYWxvbmcgd2l0aCBtZXRhZGF0YQogICAqIHVzZWQgYnkgdGhpcyBtaXhpbidzIGltcGxlbWVudGF0aW9uIG9mIGBfcHJvcGVydGllc0NoYW5nZWRgIHRvIHBlcmZvcm0KICAgKiB0aGUgcHJvcGVydHkgZWZmZWN0cy4KICAgKgogICAqIFVuZGVyc2NvcmVkIHZlcnNpb25zIG9mIHRoZSBhYm92ZSBtZXRob2RzIGFsc28gZXhpc3Qgb24gdGhlIGVsZW1lbnQKICAgKiBwcm90b3R5cGUgZm9yIGFkZGluZyBwcm9wZXJ0eSBlZmZlY3RzIG9uIGluc3RhbmNlcyBhdCBydW50aW1lLgogICAqCiAgICogTm90ZSB0aGF0IHRoaXMgbWl4aW4gb3ZlcnJpZGVzIHNldmVyYWwgYFByb3BlcnR5QWNjZXNzb3JzYCBtZXRob2RzLCBpbgogICAqIG1hbnkgY2FzZXMgdG8gbWFpbnRhaW4gZ3VhcmFudGVlcyBwcm92aWRlZCBieSB0aGUgUG9seW1lciAxLnggZmVhdHVyZXM7CiAgICogbm90YWJseSBpdCBjaGFuZ2VzIHByb3BlcnR5IGFjY2Vzc29ycyB0byBiZSBzeW5jaHJvbm91cyBieSBkZWZhdWx0CiAgICogd2hlcmVhcyB0aGUgZGVmYXVsdCB3aGVuIHVzaW5nIGBQcm9wZXJ0eUFjY2Vzc29yc2Agc3RhbmRhbG9uZSBpcyB0byBiZQogICAqIGFzeW5jIGJ5IGRlZmF1bHQuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlRlbXBsYXRlU3RhbXAKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBtZXRhLXByb2dyYW1taW5nIGZvciBQb2x5bWVyJ3MKICAgKiB0ZW1wbGF0ZSBiaW5kaW5nIGFuZCBkYXRhIG9ic2VydmF0aW9uIHN5c3RlbS4KICAgKi8KICBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cyA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUFjY2Vzc29yc30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1RlbXBsYXRlU3RhbXB9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBwcm9wZXJ0eUVmZmVjdHNCYXNlID0gUG9seW1lci5UZW1wbGF0ZVN0YW1wKFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMoc3VwZXJDbGFzcykpOwoKICAgIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgKiBAZXh0ZW5kcyB7cHJvcGVydHlFZmZlY3RzQmFzZX0KICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAqLwogICAgY2xhc3MgUHJvcGVydHlFZmZlY3RzIGV4dGVuZHMgcHJvcGVydHlFZmZlY3RzQmFzZSB7CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICAvLyBVc2VkIHRvIGlkZW50aWZ5IHVzZXJzIG9mIHRoaXMgbWl4aW4sIGFsYSBpbnN0YW5jZW9mCiAgICAgICAgdGhpcy5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50ID0gdHJ1ZTsKICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8KICAgICAgICAvLyBOT1RFOiB1c2VkIHRvIHRyYWNrIHJlLWVudHJhbnQgY2FsbHMgdG8gYF9mbHVzaFByb3BlcnRpZXNgCiAgICAgICAgLy8gcGF0aCBjaGFuZ2VzIGRpcnR5IGNoZWNrIGFnYWluc3QgYF9fZGF0YVRlbXBgIG9ubHkgZHVyaW5nIG9uZSAidHVybiIKICAgICAgICAvLyBhbmQgYXJlIGNsZWFyZWQgd2hlbiBgX19kYXRhQ291bnRlcmAgcmV0dXJucyB0byAwLgogICAgICAgIHRoaXMuX19kYXRhQ291bnRlciA9IDA7CiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5OwogICAgICAgIC8qKiBAdHlwZSB7QXJyYXl9ICovCiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50czsKICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5OwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHM7CiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgIHRoaXMuX19kYXRhSGFzUGF0aHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2U7CiAgICAgICAgLyoqIEB0eXBlIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30gKi8KICAgICAgICB0aGlzLl9fZGF0YUhvc3Q7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhVGVtcDsKICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovCiAgICAgICAgdGhpcy5fX2RhdGFDbGllbnRzSW5pdGlhbGl6ZWQ7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhOwogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmc7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhT2xkOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19jb21wdXRlRWZmZWN0czsKICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICB0aGlzLl9fcmVmbGVjdEVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX25vdGlmeUVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX3Byb3BhZ2F0ZUVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX29ic2VydmVFZmZlY3RzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19yZWFkT25seTsKICAgICAgICAvKiogQHR5cGUgeyFUZW1wbGF0ZUluZm99ICovCiAgICAgICAgdGhpcy5fX3RlbXBsYXRlSW5mbzsKICAgICAgfQoKICAgICAgZ2V0IFBST1BFUlRZX0VGRkVDVF9UWVBFUygpIHsKICAgICAgICByZXR1cm4gVFlQRVM7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgIGhvc3RTdGFjay5yZWdpc3Rlckhvc3QodGhpcyk7CiAgICAgICAgdGhpcy5fX2RhdGFDbGllbnRzUmVhZHkgPSBmYWxzZTsKICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5ID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YUhhc1BhdGhzID0gZmFsc2U7CiAgICAgICAgLy8gTWF5IGJlIHNldCBvbiBpbnN0YW5jZSBwcmlvciB0byB1cGdyYWRlCiAgICAgICAgdGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgPSB0aGlzLl9fZGF0YUNvbXBvdW5kU3RvcmFnZSB8fCBudWxsOwogICAgICAgIHRoaXMuX19kYXRhSG9zdCA9IHRoaXMuX19kYXRhSG9zdCB8fCBudWxsOwogICAgICAgIHRoaXMuX19kYXRhVGVtcCA9IHt9OwogICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c0luaXRpYWxpemVkID0gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgIGltcGxlbWVudGF0aW9uIHRvIHByb3ZpZGUgYQogICAgICAgKiBtb3JlIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZiBpbml0aWFsaXppbmcgcHJvcGVydGllcyBmcm9tCiAgICAgICAqIHRoZSBwcm90b3R5cGUgb24gdGhlIGluc3RhbmNlLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFByb3BlcnRpZXMgdG8gaW5pdGlhbGl6ZSBvbiB0aGUgcHJvdG90eXBlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfaW5pdGlhbGl6ZVByb3RvUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIHRoaXMuX19kYXRhID0gT2JqZWN0LmNyZWF0ZShwcm9wcyk7CiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0gT2JqZWN0LmNyZWF0ZShwcm9wcyk7CiAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUG9seW1lci5Qcm9wZXJ0eUFjY2Vzc29yc2AgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgc2V0dGluZwogICAgICAgKiBgX3NldFByb3BlcnR5YCdzIGBzaG91bGROb3RpZnk6IHRydWVgLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFByb3BlcnRpZXMgdG8gaW5pdGlhbGl6ZSBvbiB0aGUgaW5zdGFuY2UKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9pbml0aWFsaXplSW5zdGFuY2VQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgICAgbGV0IHJlYWRPbmx5ID0gdGhpc1tUWVBFUy5SRUFEX09OTFldOwogICAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICAgIGlmICghcmVhZE9ubHkgfHwgIXJlYWRPbmx5W3Byb3BdKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IHRoaXMuX19kYXRhUGVuZGluZyB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB0aGlzLl9fZGF0YU9sZCB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFbcHJvcF0gPSB0aGlzLl9fZGF0YVBlbmRpbmdbcHJvcF0gPSBwcm9wc1twcm9wXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIFByb3RvdHlwZSBzZXR1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGFkZFByb3BlcnR5RWZmZWN0YCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRoYXQgc2hvdWxkIHRyaWdnZXIgdGhlIGVmZmVjdAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFZmZlY3QgdHlwZSwgZnJvbSB0aGlzLlBST1BFUlRZX0VGRkVDVF9UWVBFUwogICAgICAgKiBAcGFyYW0ge09iamVjdD19IGVmZmVjdCBFZmZlY3QgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSwgZWZmZWN0KSB7CiAgICAgICAgdGhpcy5fY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgdHlwZSA9PSBUWVBFUy5SRUFEX09OTFkpOwogICAgICAgIC8vIGVmZmVjdHMgYXJlIGFjY3VtdWxhdGVkIGludG8gYXJyYXlzIHBlciBwcm9wZXJ0eSBiYXNlZCBvbiB0eXBlCiAgICAgICAgbGV0IGVmZmVjdHMgPSBlbnN1cmVPd25FZmZlY3RNYXAodGhpcywgdHlwZSlbcHJvcGVydHldOwogICAgICAgIGlmICghZWZmZWN0cykgewogICAgICAgICAgZWZmZWN0cyA9IHRoaXNbdHlwZV1bcHJvcGVydHldID0gW107CiAgICAgICAgfQogICAgICAgIGVmZmVjdHMucHVzaChlZmZlY3QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcHJvcGVydHkgZWZmZWN0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgdGhlIGVmZmVjdCB3YXMgYXNzb2NpYXRlZCB3aXRoCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIEVmZmVjdCB0eXBlLCBmcm9tIHRoaXMuUFJPUEVSVFlfRUZGRUNUX1RZUEVTCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gZWZmZWN0IEVmZmVjdCBtZXRhZGF0YSBvYmplY3QgdG8gcmVtb3ZlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcmVtb3ZlUHJvcGVydHlFZmZlY3QocHJvcGVydHksIHR5cGUsIGVmZmVjdCkgewogICAgICAgIGxldCBlZmZlY3RzID0gZW5zdXJlT3duRWZmZWN0TWFwKHRoaXMsIHR5cGUpW3Byb3BlcnR5XTsKICAgICAgICBsZXQgaWR4ID0gZWZmZWN0cy5pbmRleE9mKGVmZmVjdCk7CiAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICBlZmZlY3RzLnNwbGljZShpZHgsIDEpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgcHJvcGVydHkgZWZmZWN0CiAgICAgICAqIG9mIGEgY2VydGFpbiB0eXBlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0ge3N0cmluZz19IHR5cGUgRWZmZWN0IHR5cGUsIGZyb20gdGhpcy5QUk9QRVJUWV9FRkZFQ1RfVFlQRVMKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhbiBlZmZlY3Qgb2YgdGhpcyB0eXBlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSkgewogICAgICAgIGxldCBlZmZlY3RzID0gdGhpc1t0eXBlXTsKICAgICAgICByZXR1cm4gQm9vbGVhbihlZmZlY3RzICYmIGVmZmVjdHNbcHJvcGVydHldKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgInJlYWQgb25seSIKICAgICAgICogYWNjZXNzb3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhbiBlZmZlY3Qgb2YgdGhpcyB0eXBlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9oYXNSZWFkT25seUVmZmVjdChwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiB0aGlzLl9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuUkVBRF9PTkxZKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgIm5vdGlmeSIKICAgICAgICogcHJvcGVydHkgZWZmZWN0IGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYW4gZWZmZWN0IG9mIHRoaXMgdHlwZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfaGFzTm90aWZ5RWZmZWN0KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5OT1RJRlkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYSAicmVmbGVjdCB0byBhdHRyaWJ1dGUiCiAgICAgICAqIHByb3BlcnR5IGVmZmVjdCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGFuIGVmZmVjdCBvZiB0aGlzIHR5cGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2hhc1JlZmxlY3RFZmZlY3QocHJvcGVydHkpIHsKICAgICAgICByZXR1cm4gdGhpcy5faGFzUHJvcGVydHlFZmZlY3QocHJvcGVydHksIFRZUEVTLlJFRkxFQ1QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYSAiY29tcHV0ZWQiCiAgICAgICAqIHByb3BlcnR5IGVmZmVjdCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGFuIGVmZmVjdCBvZiB0aGlzIHR5cGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2hhc0NvbXB1dGVkRWZmZWN0KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5DT01QVVRFKTsKICAgICAgfQoKICAgICAgLy8gUnVudGltZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAvKioKICAgICAgICogU2V0cyBhIHBlbmRpbmcgcHJvcGVydHkgb3IgcGF0aC4gIElmIHRoZSByb290IHByb3BlcnR5IG9mIHRoZSBwYXRoIGluCiAgICAgICAqIHF1ZXN0aW9uIGhhZCBubyBhY2Nlc3NvciwgdGhlIHBhdGggaXMgc2V0LCBvdGhlcndpc2UgaXQgaXMgZW5xdWV1ZWQKICAgICAgICogdmlhIGBfc2V0UGVuZGluZ1Byb3BlcnR5YC4KICAgICAgICoKICAgICAgICogVGhpcyBmdW5jdGlvbiBpc29sYXRlcyByZWxhdGl2ZWx5IGV4cGVuc2l2ZSBmdW5jdGlvbmFsaXR5IG5lY2Vzc2FyeQogICAgICAgKiBmb3IgdGhlIHB1YmxpYyBBUEkgKGBzZXRgLCBgc2V0UHJvcGVydGllc2AsIGBub3RpZnlQYXRoYCwgYW5kIHByb3BlcnR5CiAgICAgICAqIGNoYW5nZSBsaXN0ZW5lcnMgdmlhIHt7Li4ufX0gYmluZGluZ3MpLCBzdWNoIHRoYXQgaXQgaXMgb25seSBkb25lCiAgICAgICAqIHdoZW4gcGF0aHMgZW50ZXIgdGhlIHN5c3RlbSwgYW5kIG5vdCBhdCBldmVyeSBwcm9wYWdhdGlvbiBzdGVwLiAgSXQKICAgICAgICogYWxzbyBzZXRzIGEgYF9fZGF0YUhhc1BhdGhzYCBmbGFnIG9uIHRoZSBpbnN0YW5jZSB3aGljaCBpcyB1c2VkIHRvCiAgICAgICAqIGZhc3QtcGF0aCBzbG93ZXIgcGF0aC1tYXRjaGluZyBjb2RlIGluIHRoZSBwcm9wZXJ0eSBlZmZlY3RzIGhvc3QgcGF0aHMuCiAgICAgICAqCiAgICAgICAqIGBwYXRoYCBjYW4gYmUgYSBwYXRoIHN0cmluZyBvciBhcnJheSBvZiBwYXRoIHBhcnRzIGFzIGFjY2VwdGVkIGJ5IHRoZQogICAgICAgKiBwdWJsaWMgQVBJLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxudW1iZXJ8c3RyaW5nPn0gcGF0aCBQYXRoIHRvIHNldAogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzaG91bGROb3RpZnkgU2V0IHRvIHRydWUgaWYgdGhpcyBjaGFuZ2Ugc2hvdWxkCiAgICAgICAqICBjYXVzZSBhIHByb3BlcnR5IG5vdGlmaWNhdGlvbiBldmVudCBkaXNwYXRjaAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBpc1BhdGhOb3RpZmljYXRpb24gSWYgdGhlIHBhdGggYmVpbmcgc2V0IGlzIGEgcGF0aAogICAgICAgKiAgIG5vdGlmaWNhdGlvbiBvZiBhbiBhbHJlYWR5IGNoYW5nZWQgdmFsdWUsIGFzIG9wcG9zZWQgdG8gYSByZXF1ZXN0CiAgICAgICAqICAgdG8gc2V0IGFuZCBub3RpZnkgdGhlIGNoYW5nZS4gIEluIHRoZSBsYXR0ZXIgYGZhbHNlYCBjYXNlLCBhIGRpcnR5CiAgICAgICAqICAgY2hlY2sgaXMgcGVyZm9ybWVkIGFuZCB0aGVuIHRoZSB2YWx1ZSBpcyBzZXQgdG8gdGhlIHBhdGggYmVmb3JlCiAgICAgICAqICAgZW5xdWV1aW5nIHRoZSBwZW5kaW5nIHByb3BlcnR5IGNoYW5nZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eS9wYXRoIHdhcyBlbnF1ZXVlZCBpbgogICAgICAgKiAgIHRoZSBwZW5kaW5nIGNoYW5nZXMgYmFnLgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHZhbHVlLCBzaG91bGROb3RpZnksIGlzUGF0aE5vdGlmaWNhdGlvbikgewogICAgICAgIGlmIChpc1BhdGhOb3RpZmljYXRpb24gfHwKICAgICAgICAgICAgUG9seW1lci5QYXRoLnJvb3QoQXJyYXkuaXNBcnJheShwYXRoKSA/IHBhdGhbMF0gOiBwYXRoKSAhPT0gcGF0aCkgewogICAgICAgICAgLy8gRGlydHkgY2hlY2sgY2hhbmdlcyBiZWluZyBzZXQgdG8gYSBwYXRoIGFnYWluc3QgdGhlIGFjdHVhbCBvYmplY3QsCiAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgcGF0aHMgaW50byB0aGUgc3lzdGVtOyBmcm9tIGhlcmUKICAgICAgICAgIC8vIHRoZSBvbmx5IGRpcnR5IGNoZWNrcyBhcmUgYWdhaW5zdCB0aGUgYF9fZGF0YVRlbXBgIGNhY2hlIHRvIHByZXZlbnQKICAgICAgICAgIC8vIGR1cGxpY2F0ZSB3b3JrIGluIHRoZSBzYW1lIHR1cm4gb25seS4gTm90ZSwgaWYgdGhpcyB3YXMgYSBub3RpZmljYXRpb24KICAgICAgICAgIC8vIG9mIGEgY2hhbmdlIGFscmVhZHkgc2V0IHRvIGEgcGF0aCAoaXNQYXRoTm90aWZpY2F0aW9uOiB0cnVlKSwKICAgICAgICAgIC8vIHdlIGFsd2F5cyBsZXQgdGhlIGNoYW5nZSB0aHJvdWdoIGFuZCBza2lwIHRoZSBgc2V0YCBzaW5jZSBpdCB3YXMKICAgICAgICAgIC8vIGFscmVhZHkgZGlydHkgY2hlY2tlZCBhdCB0aGUgcG9pbnQgb2YgZW50cnkgYW5kIHRoZSB1bmRlcmx5aW5nCiAgICAgICAgICAvLyBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkCiAgICAgICAgICBpZiAoIWlzUGF0aE5vdGlmaWNhdGlvbikgewogICAgICAgICAgICBsZXQgb2xkID0gUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoKTsKICAgICAgICAgICAgcGF0aCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoUG9seW1lci5QYXRoLnNldCh0aGlzLCBwYXRoLCB2YWx1ZSkpOwogICAgICAgICAgICAvLyBVc2UgcHJvcGVydHktYWNjZXNzb3IncyBzaW1wbGVyIGRpcnR5IGNoZWNrCiAgICAgICAgICAgIGlmICghcGF0aCB8fCAhc3VwZXIuX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHBhdGgsIHZhbHVlLCBvbGQpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fZGF0YUhhc1BhdGhzID0gdHJ1ZTsKICAgICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoLyoqQHR5cGV7c3RyaW5nfSovKHBhdGgpLCB2YWx1ZSwgc2hvdWxkTm90aWZ5KSkgewogICAgICAgICAgICBjb21wdXRlTGlua2VkUGF0aHModGhpcywgcGF0aCwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHRoaXMuX19kYXRhSGFzQWNjZXNzb3IgJiYgdGhpcy5fX2RhdGFIYXNBY2Nlc3NvcltwYXRoXSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5KC8qKkB0eXBle3N0cmluZ30qLyhwYXRoKSwgdmFsdWUsIHNob3VsZE5vdGlmeSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzW3BhdGhdID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFwcGxpZXMgYSB2YWx1ZSB0byBhIG5vbi1Qb2x5bWVyIGVsZW1lbnQvbm9kZSdzIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gbWFrZXMgYSBiZXN0LWVmZm9ydCBhdCBiaW5kaW5nIGludGVyb3A6CiAgICAgICAqIFNvbWUgbmF0aXZlIGVsZW1lbnQgcHJvcGVydGllcyBoYXZlIHNpZGUtZWZmZWN0cyB3aGVuCiAgICAgICAqIHJlLXNldHRpbmcgdGhlIHNhbWUgdmFsdWUgKGUuZy4gc2V0dGluZyBgPGlucHV0Pi52YWx1ZWAgcmVzZXRzIHRoZQogICAgICAgKiBjdXJzb3IgcG9zaXRpb24pLCBzbyB3ZSBkbyBhIGRpcnR5LWNoZWNrIGJlZm9yZSBzZXR0aW5nIHRoZSB2YWx1ZS4KICAgICAgICogSG93ZXZlciwgZm9yIGJldHRlciBpbnRlcm9wIHdpdGggbm9uLVBvbHltZXIgY3VzdG9tIGVsZW1lbnRzIHRoYXQKICAgICAgICogYWNjZXB0IG9iamVjdHMsIHdlIGV4cGxpY2l0bHkgcmUtc2V0IG9iamVjdCBjaGFuZ2VzIGNvbWluZyBmcm9tIHRoZQogICAgICAgKiBQb2x5bWVyIHdvcmxkICh3aGljaCBtYXkgaW5jbHVkZSBkZWVwIG9iamVjdCBjaGFuZ2VzIHdpdGhvdXQgdGhlCiAgICAgICAqIHRvcCByZWZlcmVuY2UgY2hhbmdpbmcpLCBlcnJpbmcgb24gdGhlIHNpZGUgb2YgcHJvdmlkaW5nIG1vcmUKICAgICAgICogaW5mb3JtYXRpb24uCiAgICAgICAqCiAgICAgICAqIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGFsdGVybmF0ZSBhcHByb2FjaGVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIFRoZSBub2RlIHRvIHNldCBhIHByb3BlcnR5IG9uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFRoZSBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZShub2RlLCBwcm9wLCB2YWx1ZSkgewogICAgICAgIC8vIEl0IGlzIGEganVkZ21lbnQgY2FsbCB0aGF0IHJlc2V0dGluZyBwcmltaXRpdmVzIGlzCiAgICAgICAgLy8gImJhZCIgYW5kIHJlc2V0dGluZ3Mgb2JqZWN0cyBpcyBhbHNvICJnb29kIjsgYWx0ZXJuYXRpdmVseSB3ZSBjb3VsZAogICAgICAgIC8vIGltcGxlbWVudCBhIHdoaXRlbGlzdCBvZiB0YWcgJiBwcm9wZXJ0eSB2YWx1ZXMgdGhhdCBzaG91bGQgbmV2ZXIKICAgICAgICAvLyBiZSByZXNldCAoZS5nLiA8aW5wdXQ+LnZhbHVlICYmIDxzZWxlY3Q+LnZhbHVlKQogICAgICAgIGlmICh2YWx1ZSAhPT0gbm9kZVtwcm9wXSB8fCB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHsKICAgICAgICAgIG5vZGVbcHJvcF0gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGBQcm9wZXJ0aWVzQ2hhbmdlZGAgaW1wbGVtZW50YXRpb24gdG8gaW50cm9kdWNlIHNwZWNpYWwKICAgICAgICogZGlydHkgY2hlY2sgbG9naWMgZGVwZW5kaW5nIG9uIHRoZSBwcm9wZXJ0eSAmIHZhbHVlIGJlaW5nIHNldDoKICAgICAgICoKICAgICAgICogMS4gQW55IHZhbHVlIHNldCB0byBhIHBhdGggKGUuZy4gJ29iai5wcm9wJzogNDIgb3IgJ29iai5wcm9wJzogey4uLn0pCiAgICAgICAqICAgIFN0b3JlZCBpbiBgX19kYXRhVGVtcGAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBgX19kYXRhVGVtcGAKICAgICAgICogMi4gT2JqZWN0IHNldCB0byBzaW1wbGUgcHJvcGVydHkgKGUuZy4gJ3Byb3AnOiB7Li4ufSkKICAgICAgICogICAgU3RvcmVkIGluIGBfX2RhdGFUZW1wYCBhbmQgYF9fZGF0YWAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdAogICAgICAgKiAgICBgX19kYXRhVGVtcGAgYnkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBgX3Nob3VsZFByb3BlcnR5Q2hhbmdlYAogICAgICAgKiAzLiBQcmltaXRpdmUgdmFsdWUgc2V0IHRvIHNpbXBsZSBwcm9wZXJ0eSAoZS5nLiAncHJvcCc6IDQyKQogICAgICAgKiAgICBTdG9yZWQgaW4gYF9fZGF0YWAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBgX19kYXRhYAogICAgICAgKgogICAgICAgKiBUaGUgZGlydHktY2hlY2sgaXMgaW1wb3J0YW50IHRvIHByZXZlbnQgY3ljbGVzIGR1ZSB0byB0d28td2F5CiAgICAgICAqIG5vdGlmaWNhdGlvbiwgYnV0IHBhdGhzIGFuZCBvYmplY3RzIGFyZSBvbmx5IGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBhbnkKICAgICAgICogcHJldmlvdXMgdmFsdWUgc2V0IGR1cmluZyB0aGlzIHR1cm4gdmlhIGEgInRlbXBvcmFyeSBjYWNoZSIgdGhhdCBpcwogICAgICAgKiBjbGVhcmVkIHdoZW4gdGhlIGxhc3QgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgZXhpdHMuIFRoaXMgaXMgc286CiAgICAgICAqIGEuIGFueSBjYWNoZWQgYXJyYXkgcGF0aHMgKGUuZy4gJ2FycmF5LjMucHJvcCcpIG1heSBiZSBpbnZhbGlkYXRlZAogICAgICAgKiAgICBkdWUgdG8gYXJyYXkgbXV0YXRpb25zIGxpa2Ugc2hpZnQvdW5zaGlmdC9zcGxpY2U7IHRoaXMgaXMgZmluZQogICAgICAgKiAgICBzaW5jZSBwYXRoIGNoYW5nZXMgYXJlIGRpcnR5LWNoZWNrZWQgYXQgdXNlciBlbnRyeSBwb2ludHMgbGlrZSBgc2V0YAogICAgICAgKiBiLiBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBvbmx5IGxhc3RzIG9uZSB0dXJuIHRvIGFsbG93IHRoZSB1c2VyCiAgICAgICAqICAgIHRvIG11dGF0ZSB0aGUgb2JqZWN0IGluLXBsYWNlIGFuZCByZS1zZXQgaXQgd2l0aCB0aGUgc2FtZSBpZGVudGl0eQogICAgICAgKiAgICBhbmQgaGF2ZSBhbGwgc3ViLXByb3BlcnRpZXMgcmUtcHJvcGFnYXRlZCBpbiBhIHN1YnNlcXVlbnQgdHVybi4KICAgICAgICoKICAgICAgICogVGhlIHRlbXAgY2FjaGUgaXMgbm90IG5lY2Vzc2FyaWx5IHN1ZmZpY2llbnQgdG8gcHJldmVudCBpbnZhbGlkIGFycmF5CiAgICAgICAqIHBhdGhzLCBzaW5jZSBhIHNwbGljZSBjYW4gaGFwcGVuIGR1cmluZyB0aGUgc2FtZSB0dXJuICh3aXRoIHBhdGhvbG9naWNhbAogICAgICAgKiB1c2VyIGNvZGUpOyB3ZSBjb3VsZCBpbnRyb2R1Y2UgYSAiZml4dXAiIGZvciB0ZW1wb3JhcmlseSBjYWNoZWQgYXJyYXkKICAgICAgICogcGF0aHMgaWYgbmVlZGVkOiBodHRwczovL2dpdGh1Yi5jb20vUG9seW1lci9wb2x5bWVyL2lzc3Vlcy80MjI3CiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gc2hvdWxkTm90aWZ5IFRydWUgaWYgcHJvcGVydHkgc2hvdWxkIGZpcmUgbm90aWZpY2F0aW9uCiAgICAgICAqICAgZXZlbnQgKGFwcGxpZXMgb25seSBmb3IgYG5vdGlmeTogdHJ1ZWAgcHJvcGVydGllcykKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VkCiAgICAgICAqLwogICAgICBfc2V0UGVuZGluZ1Byb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSwgc2hvdWxkTm90aWZ5KSB7CiAgICAgICAgbGV0IGlzUGF0aCA9IHRoaXMuX19kYXRhSGFzUGF0aHMgJiYgUG9seW1lci5QYXRoLmlzUGF0aChwcm9wZXJ0eSk7CiAgICAgICAgbGV0IHByZXZQcm9wcyA9IGlzUGF0aCA/IHRoaXMuX19kYXRhVGVtcCA6IHRoaXMuX19kYXRhOwogICAgICAgIGlmICh0aGlzLl9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIHByZXZQcm9wc1twcm9wZXJ0eV0pKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhUGVuZGluZykgewogICAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmcgPSB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEVuc3VyZSBvbGQgaXMgY2FwdHVyZWQgZnJvbSB0aGUgbGFzdCB0dXJuCiAgICAgICAgICBpZiAoIShwcm9wZXJ0eSBpbiB0aGlzLl9fZGF0YU9sZCkpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGRbcHJvcGVydHldID0gdGhpcy5fX2RhdGFbcHJvcGVydHldOwogICAgICAgICAgfQogICAgICAgICAgLy8gUGF0aHMgYXJlIHN0b3JlZCBpbiB0ZW1wb3JhcnkgY2FjaGUgKGNsZWFyZWQgYXQgZW5kIG9mIHR1cm4pLAogICAgICAgICAgLy8gd2hpY2ggaXMgdXNlZCBmb3IgZGlydHktY2hlY2tpbmcsIGFsbCBvdGhlcnMgc3RvcmVkIGluIF9fZGF0YQogICAgICAgICAgaWYgKGlzUGF0aCkgewogICAgICAgICAgICB0aGlzLl9fZGF0YVRlbXBbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLl9fZGF0YVtwcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEFsbCBjaGFuZ2VzIGdvIGludG8gcGVuZGluZyBwcm9wZXJ0eSBiYWcsIHBhc3NlZCB0byBfcHJvcGVydGllc0NoYW5nZWQKICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ1twcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIC8vIFRyYWNrIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgbm90aWZ5IHNlcGFyYXRlbHkKICAgICAgICAgIGlmIChpc1BhdGggfHwgKHRoaXNbVFlQRVMuTk9USUZZXSAmJiB0aGlzW1RZUEVTLk5PVElGWV1bcHJvcGVydHldKSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5ID0gdGhpcy5fX2RhdGFUb05vdGlmeSB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFUb05vdGlmeVtwcm9wZXJ0eV0gPSBzaG91bGROb3RpZnk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGJhc2UgaW1wbGVtZW50YXRpb24gdG8gZW5zdXJlIGFsbCBhY2Nlc3NvcnMgc2V0IGBzaG91bGROb3RpZnlgCiAgICAgICAqIHRvIHRydWUsIGZvciBwZXItcHJvcGVydHkgbm90aWZpY2F0aW9uIHRyYWNraW5nLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfc2V0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKSB7CiAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUsIHRydWUpKSB7CiAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUHJvcGVydHlBY2Nlc3NvcmAncyBkZWZhdWx0IGFzeW5jIHF1ZXVpbmcgb2YKICAgICAgICogYF9wcm9wZXJ0aWVzQ2hhbmdlZGA6IGlmIGBfX2RhdGFSZWFkeWAgaXMgZmFsc2UgKGhhcyBub3QgeWV0IGJlZW4KICAgICAgICogbWFudWFsbHkgZmx1c2hlZCksIHRoZSBmdW5jdGlvbiBuby1vcHM7IG90aGVyd2lzZSBmbHVzaGVzCiAgICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgIHN5bmNocm9ub3VzbHkuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCkgewogICAgICAgIGlmICh0aGlzLl9fZGF0YVJlYWR5KSB7CiAgICAgICAgICB0aGlzLl9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFbnF1ZXVlcyB0aGUgZ2l2ZW4gY2xpZW50IG9uIGEgbGlzdCBvZiBwZW5kaW5nIGNsaWVudHMsIHdob3NlCiAgICAgICAqIHBlbmRpbmcgcHJvcGVydHkgY2hhbmdlcyBjYW4gbGF0ZXIgYmUgZmx1c2hlZCB2aWEgYSBjYWxsIHRvCiAgICAgICAqIGBfZmx1c2hDbGllbnRzYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNsaWVudCBQcm9wZXJ0eUVmZmVjdHMgY2xpZW50IHRvIGVucXVldWUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2VucXVldWVDbGllbnQoY2xpZW50KSB7CiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cyA9IHRoaXMuX19kYXRhUGVuZGluZ0NsaWVudHMgfHwgW107CiAgICAgICAgaWYgKGNsaWVudCAhPT0gdGhpcykgewogICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cy5wdXNoKGNsaWVudCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIHN1cGVyY2xhc3MgaW1wbGVtZW50YXRpb24uCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9mbHVzaFByb3BlcnRpZXMoKSB7CiAgICAgICAgdGhpcy5fX2RhdGFDb3VudGVyKys7CiAgICAgICAgc3VwZXIuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIHRoaXMuX19kYXRhQ291bnRlci0tOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRmx1c2hlcyBhbnkgY2xpZW50cyBwcmV2aW91c2x5IGVucXVldWVkIHZpYSBgX2VucXVldWVDbGllbnRgLCBjYXVzaW5nCiAgICAgICAqIHRoZWlyIGBfZmx1c2hQcm9wZXJ0aWVzYCBtZXRob2QgdG8gcnVuLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfZmx1c2hDbGllbnRzKCkgewogICAgICAgIGlmICghdGhpcy5fX2RhdGFDbGllbnRzUmVhZHkpIHsKICAgICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5ID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuX3JlYWR5Q2xpZW50cygpOwogICAgICAgICAgLy8gT3ZlcnJpZGUgcG9pbnQgd2hlcmUgYWNjZXNzb3JzIGFyZSB0dXJuZWQgb247IGltcG9ydGFudGx5LAogICAgICAgICAgLy8gdGhpcyBpcyBhZnRlciBjbGllbnRzIGhhdmUgZnVsbHkgcmVhZGllZCwgcHJvdmlkaW5nIGEgZ3VhcmFudGVlCiAgICAgICAgICAvLyB0aGF0IGFueSBwcm9wZXJ0eSBlZmZlY3RzIG9jY3VyIG9ubHkgYWZ0ZXIgYWxsIGNsaWVudHMgYXJlIHJlYWR5LgogICAgICAgICAgdGhpcy5fX2RhdGFSZWFkeSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX19lbmFibGVPckZsdXNoQ2xpZW50cygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gTk9URTogV2UgZW5zdXJlIGNsaWVudHMgZWl0aGVyIGVuYWJsZSBvciBmbHVzaCBhcyBhcHByb3ByaWF0ZS4gVGhpcwogICAgICAvLyBoYW5kbGVzIHR3byBjb3JuZXIgY2FzZXM6CiAgICAgIC8vICgxKSBjbGllbnRzIGZsdXNoIHByb3Blcmx5IHdoZW4gY29ubmVjdGVkL2VuYWJsZWQgYmVmb3JlIHRoZSBob3N0CiAgICAgIC8vIGVuYWJsZXM7IGUuZy4KICAgICAgLy8gICAoYSkgVGVtcGxhdGl6ZSBzdGFtcHMgd2l0aCBubyBwcm9wZXJ0aWVzIGFuZCBkb2VzIG5vdCBmbHVzaCBhbmQKICAgICAgLy8gICAoYikgdGhlIGluc3RhbmNlIGlzIGluc2VydGVkIGludG8gZG9tIGFuZAogICAgICAvLyAgIChjKSB0aGVuIHRoZSBpbnN0YW5jZSBmbHVzaGVzLgogICAgICAvLyAoMikgY2xpZW50cyBlbmFibGUgcHJvcGVybHkgd2hlbiBub3QgY29ubmVjdGVkL2VuYWJsZWQgd2hlbiB0aGUgaG9zdAogICAgICAvLyBmbHVzaGVzOyBlLmcuCiAgICAgIC8vICAgKGEpIGEgdGVtcGxhdGUgaXMgcnVudGltZSBzdGFtcGVkIGFuZCBub3QgeWV0IGNvbm5lY3RlZC9lbmFibGVkCiAgICAgIC8vICAgKGIpIGEgaG9zdCBzZXRzIGEgcHJvcGVydHksIGNhdXNpbmcgc3RhbXBlZCBkb20gdG8gZmx1c2gKICAgICAgLy8gICAoYykgdGhlIHN0YW1wZWQgZG9tIGVuYWJsZXMuCiAgICAgIF9fZW5hYmxlT3JGbHVzaENsaWVudHMoKSB7CiAgICAgICAgbGV0IGNsaWVudHMgPSB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzOwogICAgICAgIGlmIChjbGllbnRzKSB7CiAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzID0gbnVsbDsKICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGNsaWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGNsaWVudCA9IGNsaWVudHNbaV07CiAgICAgICAgICAgIGlmICghY2xpZW50Ll9fZGF0YUVuYWJsZWQpIHsKICAgICAgICAgICAgICBjbGllbnQuX2VuYWJsZVByb3BlcnRpZXMoKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjbGllbnQuX19kYXRhUGVuZGluZykgewogICAgICAgICAgICAgIGNsaWVudC5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQZXJmb3JtIGFueSBpbml0aWFsIHNldHVwIG9uIGNsaWVudCBkb20uIENhbGxlZCBiZWZvcmUgdGhlIGZpcnN0CiAgICAgICAqIGBfZmx1c2hQcm9wZXJ0aWVzYCBjYWxsIG9uIGNsaWVudCBkb20gYW5kIGJlZm9yZSBhbnkgZWxlbWVudAogICAgICAgKiBvYnNlcnZlcnMgYXJlIGNhbGxlZC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3JlYWR5Q2xpZW50cygpIHsKICAgICAgICB0aGlzLl9fZW5hYmxlT3JGbHVzaENsaWVudHMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNldHMgYSBiYWcgb2YgcHJvcGVydHkgY2hhbmdlcyB0byB0aGlzIGluc3RhbmNlLCBhbmQKICAgICAgICogc3luY2hyb25vdXNseSBwcm9jZXNzZXMgYWxsIGVmZmVjdHMgb2YgdGhlIHByb3BlcnRpZXMgYXMgYSBiYXRjaC4KICAgICAgICoKICAgICAgICogUHJvcGVydHkgbmFtZXMgbXVzdCBiZSBzaW1wbGUgcHJvcGVydGllcywgbm90IHBhdGhzLiAgQmF0Y2hlZAogICAgICAgKiBwYXRoIHByb3BhZ2F0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2Ygb25lIG9yIG1vcmUga2V5LXZhbHVlIHBhaXJzIHdob3NlIGtleSBpcwogICAgICAgKiAgIGEgcHJvcGVydHkgYW5kIHZhbHVlIGlzIHRoZSBuZXcgdmFsdWUgdG8gc2V0IGZvciB0aGF0IHByb3BlcnR5LgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzZXRSZWFkT25seSBXaGVuIHRydWUsIGFueSBwcml2YXRlIHZhbHVlcyBzZXQgaW4KICAgICAgICogICBgcHJvcHNgIHdpbGwgYmUgc2V0LiBCeSBkZWZhdWx0LCBgc2V0UHJvcGVydGllc2Agd2lsbCBub3Qgc2V0CiAgICAgICAqICAgYHJlYWRPbmx5OiB0cnVlYCByb290IHByb3BlcnRpZXMuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHNldFByb3BlcnRpZXMocHJvcHMsIHNldFJlYWRPbmx5KSB7CiAgICAgICAgZm9yIChsZXQgcGF0aCBpbiBwcm9wcykgewogICAgICAgICAgaWYgKHNldFJlYWRPbmx5IHx8ICF0aGlzW1RZUEVTLlJFQURfT05MWV0gfHwgIXRoaXNbVFlQRVMuUkVBRF9PTkxZXVtwYXRoXSkgewogICAgICAgICAgICAvL1RPRE8oa3NjaGFhZik6IGV4cGxpY2l0bHkgZGlzYWxsb3cgcGF0aHMgaW4gc2V0UHJvcGVydHk/CiAgICAgICAgICAgIC8vIHdpbGRjYXJkIG9ic2VydmVycyBjdXJyZW50bHkgb25seSBwYXNzIHRoZSBmaXJzdCBjaGFuZ2VkIHBhdGgKICAgICAgICAgICAgLy8gaW4gdGhlIGBpbmZvYCBvYmplY3QsIGFuZCB5b3UgY291bGQgZG8gc29tZSBvZGQgdGhpbmdzIGJhdGNoaW5nCiAgICAgICAgICAgIC8vIHBhdGhzLCBlLmcuIHsnZm9vLmJhcic6IHsuLi59LCAnZm9vJzogbnVsbH0KICAgICAgICAgICAgdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHByb3BzW3BhdGhdLCB0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUHJvcGVydHlBY2Nlc3NvcnNgIHNvIHRoYXQgcHJvcGVydHkgYWNjZXNzb3IKICAgICAgICogc2lkZSBlZmZlY3RzIGFyZSBub3QgZW5hYmxlZCB1bnRpbCBhZnRlciBjbGllbnQgZG9tIGlzIGZ1bGx5IHJlYWR5LgogICAgICAgKiBBbHNvIGNhbGxzIGBfZmx1c2hDbGllbnRzYCBjYWxsYmFjayB0byBlbnN1cmUgY2xpZW50IGRvbSBpcyBlbmFibGVkCiAgICAgICAqIHRoYXQgd2FzIG5vdCBlbmFibGVkIGFzIGEgcmVzdWx0IG9mIGZsdXNoaW5nIHByb3BlcnRpZXMuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgcmVhZHkoKSB7CiAgICAgICAgLy8gSXQgaXMgaW1wb3J0YW50IHRoYXQgYHN1cGVyLnJlYWR5KClgIGlzIG5vdCBjYWxsZWQgaGVyZSBhcyBpdAogICAgICAgIC8vIGltbWVkaWF0ZWx5IHR1cm5zIG9uIGFjY2Vzc29ycy4gSW5zdGVhZCwgd2Ugd2FpdCB1bnRpbCBgcmVhZHlDbGllbnRzYAogICAgICAgIC8vIHRvIGVuYWJsZSBhY2Nlc3NvcnMgdG8gcHJvdmlkZSBhIGd1YXJhbnRlZSB0aGF0IGNsaWVudHMgYXJlIHJlYWR5CiAgICAgICAgLy8gYmVmb3JlIHByb2Nlc3NpbmcgYW55IGFjY2Vzc29ycyBzaWRlIGVmZmVjdHMuCiAgICAgICAgdGhpcy5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgLy8gSWYgbm8gZGF0YSB3YXMgcGVuZGluZywgYF9mbHVzaFByb3BlcnRpZXNgIHdpbGwgbm90IGBmbHVzaENsaWVudHNgCiAgICAgICAgLy8gc28gZW5zdXJlIHRoaXMgaXMgZG9uZS4KICAgICAgICBpZiAoIXRoaXMuX19kYXRhQ2xpZW50c1JlYWR5KSB7CiAgICAgICAgICB0aGlzLl9mbHVzaENsaWVudHMoKTsKICAgICAgICB9CiAgICAgICAgLy8gQmVmb3JlIHJlYWR5LCBjbGllbnQgbm90aWZpY2F0aW9ucyBkbyBub3QgdHJpZ2dlciBfZmx1c2hQcm9wZXJ0aWVzLgogICAgICAgIC8vIFRoZXJlZm9yZSBhIGZsdXNoIGlzIG5lY2Vzc2FyeSBoZXJlIGlmIGRhdGEgaGFzIGJlZW4gc2V0LgogICAgICAgIGlmICh0aGlzLl9fZGF0YVBlbmRpbmcpIHsKICAgICAgICAgIHRoaXMuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgYFByb3BlcnR5QWNjZXNzb3JzYCdzIHByb3BlcnRpZXMgY2hhbmdlZCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogUnVucyBlYWNoIGNsYXNzIG9mIGVmZmVjdHMgZm9yIHRoZSBiYXRjaCBvZiBjaGFuZ2VkIHByb3BlcnRpZXMgaW4KICAgICAgICogYSBzcGVjaWZpYyBvcmRlciAoY29tcHV0ZSwgcHJvcGFnYXRlLCByZWZsZWN0LCBvYnNlcnZlLCBub3RpZnkpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGN1cnJlbnRQcm9wcyBCYWcgb2YgYWxsIGN1cnJlbnQgYWNjZXNzb3IgdmFsdWVzCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBwcm9wZXJ0aWVzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QKICAgICAgICogICBjYWxsIHRvIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgZWFjaCBwcm9wZXJ0eQogICAgICAgKiAgIGluIGBjaGFuZ2VkUHJvcHNgCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcHJvcGVydGllc0NoYW5nZWQoY3VycmVudFByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzKSB7CiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIC8vIGxldCBjID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY2hhbmdlZFByb3BzIHx8IHt9KTsKICAgICAgICAvLyB3aW5kb3cuZGVidWcgJiYgY29uc29sZS5ncm91cCh0aGlzLmxvY2FsTmFtZSArICcjJyArIHRoaXMuaWQgKyAnOiAnICsgYyk7CiAgICAgICAgLy8gaWYgKHdpbmRvdy5kZWJ1ZykgeyBkZWJ1Z2dlcjsgfQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBsZXQgaGFzUGF0aHMgPSB0aGlzLl9fZGF0YUhhc1BhdGhzOwogICAgICAgIHRoaXMuX19kYXRhSGFzUGF0aHMgPSBmYWxzZTsKICAgICAgICAvLyBDb21wdXRlIHByb3BlcnRpZXMKICAgICAgICBydW5Db21wdXRlZEVmZmVjdHModGhpcywgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIC8vIENsZWFyIG5vdGlmeSBwcm9wZXJ0aWVzIHByaW9yIHRvIHBvc3NpYmxlIHJlZW50cnkgKHByb3BhZ2F0ZSwgb2JzZXJ2ZSksCiAgICAgICAgLy8gYnV0IGFmdGVyIGNvbXB1dGluZyBlZmZlY3RzIGhhdmUgYSBjaGFuY2UgdG8gYWRkIHRvIHRoZW0KICAgICAgICBsZXQgbm90aWZ5UHJvcHMgPSB0aGlzLl9fZGF0YVRvTm90aWZ5OwogICAgICAgIHRoaXMuX19kYXRhVG9Ob3RpZnkgPSBudWxsOwogICAgICAgIC8vIFByb3BhZ2F0ZSBwcm9wZXJ0aWVzIHRvIGNsaWVudHMKICAgICAgICB0aGlzLl9wcm9wYWdhdGVQcm9wZXJ0eUNoYW5nZXMoY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIC8vIEZsdXNoIGNsaWVudHMKICAgICAgICB0aGlzLl9mbHVzaENsaWVudHMoKTsKICAgICAgICAvLyBSZWZsZWN0IHByb3BlcnRpZXMKICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuUkVGTEVDVF0sIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAvLyBPYnNlcnZlIHByb3BlcnRpZXMKICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuT0JTRVJWRV0sIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAvLyBOb3RpZnkgcHJvcGVydGllcyB0byBob3N0CiAgICAgICAgaWYgKG5vdGlmeVByb3BzKSB7CiAgICAgICAgICBydW5Ob3RpZnlFZmZlY3RzKHRoaXMsIG5vdGlmeVByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocyk7CiAgICAgICAgfQogICAgICAgIC8vIENsZWFyIHRlbXBvcmFyeSBjYWNoZSBhdCBlbmQgb2YgdHVybgogICAgICAgIGlmICh0aGlzLl9fZGF0YUNvdW50ZXIgPT0gMSkgewogICAgICAgICAgdGhpcy5fX2RhdGFUZW1wID0ge307CiAgICAgICAgfQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAvLyB3aW5kb3cuZGVidWcgJiYgY29uc29sZS5ncm91cEVuZCh0aGlzLmxvY2FsTmFtZSArICcjJyArIHRoaXMuaWQgKyAnOiAnICsgYyk7CiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIHRvIHByb3BhZ2F0ZSBhbnkgcHJvcGVydHkgY2hhbmdlcyB0byBzdGFtcGVkIHRlbXBsYXRlIG5vZGVzCiAgICAgICAqIG1hbmFnZWQgYnkgdGhpcyBlbGVtZW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBjaGFuZ2VkIHByb3BlcnRpZXMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9wcm9wYWdhdGVQcm9wZXJ0eUNoYW5nZXMoY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpIHsKICAgICAgICBpZiAodGhpc1tUWVBFUy5QUk9QQUdBVEVdKSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuUFJPUEFHQVRFXSwgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIH0KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5fX3RlbXBsYXRlSW5mbzsKICAgICAgICB3aGlsZSAodGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMsIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsCiAgICAgICAgICAgIGhhc1BhdGhzLCB0ZW1wbGF0ZUluZm8ubm9kZUxpc3QpOwogICAgICAgICAgdGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm87CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogQWxpYXNlcyBvbmUgZGF0YSBwYXRoIGFzIGFub3RoZXIsIHN1Y2ggdGhhdCBwYXRoIG5vdGlmaWNhdGlvbnMgZnJvbSBvbmUKICAgICAgICogYXJlIHJvdXRlZCB0byB0aGUgb3RoZXIuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSB0byBUYXJnZXQgcGF0aCB0byBsaW5rLgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gZnJvbSBTb3VyY2UgcGF0aCB0byBsaW5rLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICBsaW5rUGF0aHModG8sIGZyb20pIHsKICAgICAgICB0byA9IFBvbHltZXIuUGF0aC5ub3JtYWxpemUodG8pOwogICAgICAgIGZyb20gPSBQb2x5bWVyLlBhdGgubm9ybWFsaXplKGZyb20pOwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzIHx8IHt9OwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHNbdG9dID0gZnJvbTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYSBkYXRhIHBhdGggYWxpYXMgcHJldmlvdXNseSBlc3RhYmxpc2hlZCB3aXRoIGBfbGlua1BhdGhzYC4KICAgICAgICoKICAgICAgICogTm90ZSwgdGhlIHBhdGggdG8gdW5saW5rIHNob3VsZCBiZSB0aGUgdGFyZ2V0IChgdG9gKSB1c2VkIHdoZW4KICAgICAgICogbGlua2luZyB0aGUgcGF0aHMuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIFRhcmdldCBwYXRoIHRvIHVubGluay4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgdW5saW5rUGF0aHMocGF0aCkgewogICAgICAgIHBhdGggPSBQb2x5bWVyLlBhdGgubm9ybWFsaXplKHBhdGgpOwogICAgICAgIGlmICh0aGlzLl9fZGF0YUxpbmtlZFBhdGhzKSB7CiAgICAgICAgICBkZWxldGUgdGhpcy5fX2RhdGFMaW5rZWRQYXRoc1twYXRoXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBOb3RpZnkgdGhhdCBhbiBhcnJheSBoYXMgY2hhbmdlZC4KICAgICAgICoKICAgICAgICogRXhhbXBsZToKICAgICAgICoKICAgICAgICogICAgIHRoaXMuaXRlbXMgPSBbIHtuYW1lOiAnSmltJ30sIHtuYW1lOiAnVG9kZCd9LCB7bmFtZTogJ0JpbGwnfSBdOwogICAgICAgKiAgICAgLi4uCiAgICAgICAqICAgICB0aGlzLml0ZW1zLnNwbGljZSgxLCAxLCB7bmFtZTogJ1NhbSd9KTsKICAgICAgICogICAgIHRoaXMuaXRlbXMucHVzaCh7bmFtZTogJ0JvYid9KTsKICAgICAgICogICAgIHRoaXMubm90aWZ5U3BsaWNlcygnaXRlbXMnLCBbCiAgICAgICAqICAgICAgIHsgaW5kZXg6IDEsIHJlbW92ZWQ6IFt7bmFtZTogJ1RvZGQnfV0sIGFkZGVkQ291bnQ6IDEsIG9iamVjdDogdGhpcy5pdGVtcywgdHlwZTogJ3NwbGljZScgfSwKICAgICAgICogICAgICAgeyBpbmRleDogMywgcmVtb3ZlZDogW10sIGFkZGVkQ291bnQ6IDEsIG9iamVjdDogdGhpcy5pdGVtcywgdHlwZTogJ3NwbGljZSd9CiAgICAgICAqICAgICBdKTsKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0aGF0IHNob3VsZCBiZSBub3RpZmllZC4KICAgICAgICogQHBhcmFtIHtBcnJheX0gc3BsaWNlcyBBcnJheSBvZiBzcGxpY2UgcmVjb3JkcyBpbmRpY2F0aW5nIG9yZGVyZWQKICAgICAgICogICBjaGFuZ2VzIHRoYXQgb2NjdXJyZWQgdG8gdGhlIGFycmF5LiBFYWNoIHJlY29yZCBzaG91bGQgaGF2ZSB0aGUKICAgICAgICogICBmb2xsb3dpbmcgZmllbGRzOgogICAgICAgKiAgICAqIGluZGV4OiBpbmRleCBhdCB3aGljaCB0aGUgY2hhbmdlIG9jY3VycmVkCiAgICAgICAqICAgICogcmVtb3ZlZDogYXJyYXkgb2YgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQgZnJvbSB0aGlzIGluZGV4CiAgICAgICAqICAgICogYWRkZWRDb3VudDogbnVtYmVyIG9mIG5ldyBpdGVtcyBhZGRlZCBhdCB0aGlzIGluZGV4CiAgICAgICAqICAgICogb2JqZWN0OiBhIHJlZmVyZW5jZSB0byB0aGUgYXJyYXkgaW4gcXVlc3Rpb24KICAgICAgICogICAgKiB0eXBlOiB0aGUgc3RyaW5nIGxpdGVyYWwgJ3NwbGljZScKICAgICAgICoKICAgICAgICogICBOb3RlIHRoYXQgc3BsaWNlIHJlY29yZHMgX211c3RfIGJlIG5vcm1hbGl6ZWQgc3VjaCB0aGF0IHRoZXkgYXJlCiAgICAgICAqICAgcmVwb3J0ZWQgaW4gaW5kZXggb3JkZXIgKHJhdyByZXN1bHRzIGZyb20gYE9iamVjdC5vYnNlcnZlYCBhcmUgbm90CiAgICAgICAqICAgb3JkZXJlZCBhbmQgbXVzdCBiZSBub3JtYWxpemVkL21lcmdlZCBiZWZvcmUgbm90aWZ5aW5nKS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBub3RpZnlTcGxpY2VzKHBhdGgsIHNwbGljZXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbm90aWZ5U3BsaWNlcyh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCBzcGxpY2VzKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgcmVhZGluZyBhIHZhbHVlIGZyb20gYSBwYXRoLgogICAgICAgKgogICAgICAgKiBOb3RlLCBpZiBhbnkgcGFydCBpbiB0aGUgcGF0aCBpcyB1bmRlZmluZWQsIHRoaXMgbWV0aG9kIHJldHVybnMKICAgICAgICogYHVuZGVmaW5lZGAgKHRoaXMgbWV0aG9kIGRvZXMgbm90IHRocm93IHdoZW4gZGVyZWZlcmVuY2luZyB1bmRlZmluZWQKICAgICAgICogcGF0aHMpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyhzdHJpbmd8IUFycmF5PChzdHJpbmd8bnVtYmVyKT4pfSBwYXRoIFBhdGggdG8gdGhlIHZhbHVlCiAgICAgICAqICAgdG8gcmVhZC4gIFRoZSBwYXRoIG1heSBiZSBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgKGUuZy4gYGZvby5iYXIuYmF6YCkKICAgICAgICogICBvciBhbiBhcnJheSBvZiBwYXRoIHBhcnRzIChlLmcuIGBbJ2Zvby5iYXInLCAnYmF6J11gKS4gIE5vdGUgdGhhdAogICAgICAgKiAgIGJyYWNrZXRlZCBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZDsgc3RyaW5nLWJhc2VkIHBhdGggcGFydHMKICAgICAgICogICAqbXVzdCogYmUgc2VwYXJhdGVkIGJ5IGRvdHMuICBOb3RlIHRoYXQgd2hlbiBkZXJlZmVyZW5jaW5nIGFycmF5CiAgICAgICAqICAgaW5kaWNlcywgdGhlIGluZGV4IG1heSBiZSB1c2VkIGFzIGEgZG90dGVkIHBhcnQgZGlyZWN0bHkKICAgICAgICogICAoZS5nLiBgdXNlcnMuMTIubmFtZWAgb3IgYFsndXNlcnMnLCAxMiwgJ25hbWUnXWApLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHJvb3QgUm9vdCBvYmplY3QgZnJvbSB3aGljaCB0aGUgcGF0aCBpcyBldmFsdWF0ZWQuCiAgICAgICAqIEByZXR1cm4geyp9IFZhbHVlIGF0IHRoZSBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiBhbnkgcGFydCBvZiB0aGUgcGF0aAogICAgICAgKiAgIGlzIHVuZGVmaW5lZC4KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgZ2V0KHBhdGgsIHJvb3QpIHsKICAgICAgICByZXR1cm4gUG9seW1lci5QYXRoLmdldChyb290IHx8IHRoaXMsIHBhdGgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIGEgdmFsdWUgdG8gYSBwYXRoIGFuZCBub3RpZnlpbmcgYW55CiAgICAgICAqIGVsZW1lbnRzIGJvdW5kIHRvIHRoZSBzYW1lIHBhdGguCiAgICAgICAqCiAgICAgICAqIE5vdGUsIGlmIGFueSBwYXJ0IGluIHRoZSBwYXRoIGV4Y2VwdCBmb3IgdGhlIGxhc3QgaXMgdW5kZWZpbmVkLAogICAgICAgKiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcgKHRoaXMgbWV0aG9kIGRvZXMgbm90IHRocm93IHdoZW4KICAgICAgICogZGVyZWZlcmVuY2luZyB1bmRlZmluZWQgcGF0aHMpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyhzdHJpbmd8IUFycmF5PChzdHJpbmd8bnVtYmVyKT4pfSBwYXRoIFBhdGggdG8gdGhlIHZhbHVlCiAgICAgICAqICAgdG8gd3JpdGUuICBUaGUgcGF0aCBtYXkgYmUgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIChlLmcuIGAnZm9vLmJhci5iYXonYCkKICAgICAgICogICBvciBhbiBhcnJheSBvZiBwYXRoIHBhcnRzIChlLmcuIGBbJ2Zvby5iYXInLCAnYmF6J11gKS4gIE5vdGUgdGhhdAogICAgICAgKiAgIGJyYWNrZXRlZCBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZDsgc3RyaW5nLWJhc2VkIHBhdGggcGFydHMKICAgICAgICogICAqbXVzdCogYmUgc2VwYXJhdGVkIGJ5IGRvdHMuICBOb3RlIHRoYXQgd2hlbiBkZXJlZmVyZW5jaW5nIGFycmF5CiAgICAgICAqICAgaW5kaWNlcywgdGhlIGluZGV4IG1heSBiZSB1c2VkIGFzIGEgZG90dGVkIHBhcnQgZGlyZWN0bHkKICAgICAgICogICAoZS5nLiBgJ3VzZXJzLjEyLm5hbWUnYCBvciBgWyd1c2VycycsIDEyLCAnbmFtZSddYCkuCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0IGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4KICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSByb290IFJvb3Qgb2JqZWN0IGZyb20gd2hpY2ggdGhlIHBhdGggaXMgZXZhbHVhdGVkLgogICAgICAgKiAgIFdoZW4gc3BlY2lmaWVkLCBubyBub3RpZmljYXRpb24gd2lsbCBvY2N1ci4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBzZXQocGF0aCwgdmFsdWUsIHJvb3QpIHsKICAgICAgICBpZiAocm9vdCkgewogICAgICAgICAgUG9seW1lci5QYXRoLnNldChyb290LCBwYXRoLCB2YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICghdGhpc1tUWVBFUy5SRUFEX09OTFldIHx8ICF0aGlzW1RZUEVTLlJFQURfT05MWV1bLyoqIEB0eXBlIHtzdHJpbmd9ICovKHBhdGgpXSkgewogICAgICAgICAgICBpZiAodGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHZhbHVlLCB0cnVlKSkgewogICAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBZGRzIGl0ZW1zIG9udG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkgYXQgdGhlIHBhdGggc3BlY2lmaWVkLgogICAgICAgKgogICAgICAgKiBUaGUgYXJndW1lbnRzIGFmdGVyIGBwYXRoYCBhbmQgcmV0dXJuIHZhbHVlIG1hdGNoIHRoYXQgb2YKICAgICAgICogYEFycmF5LnByb3RvdHlwZS5wdXNoYC4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2Qgbm90aWZpZXMgb3RoZXIgcGF0aHMgdG8gdGhlIHNhbWUgYXJyYXkgdGhhdCBhCiAgICAgICAqIHNwbGljZSBvY2N1cnJlZCB0byB0aGUgYXJyYXkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIFBhdGggdG8gYXJyYXkuCiAgICAgICAqIEBwYXJhbSB7Li4uKn0gaXRlbXMgSXRlbXMgdG8gcHVzaCBvbnRvIGFycmF5CiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gTmV3IGxlbmd0aCBvZiB0aGUgYXJyYXkuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHB1c2gocGF0aCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0qLyhQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIHBhdGgsIGluZm8pKTsKICAgICAgICBsZXQgbGVuID0gYXJyYXkubGVuZ3RoOwogICAgICAgIGxldCByZXQgPSBhcnJheS5wdXNoKC4uLml0ZW1zKTsKICAgICAgICBpZiAoaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgbGVuLCBpdGVtcy5sZW5ndGgsIFtdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoZSBlbmQgb2YgYXJyYXkgYXQgdGhlIHBhdGggc3BlY2lmaWVkLgogICAgICAgKgogICAgICAgKiBUaGUgYXJndW1lbnRzIGFmdGVyIGBwYXRoYCBhbmQgcmV0dXJuIHZhbHVlIG1hdGNoIHRoYXQgb2YKICAgICAgICogYEFycmF5LnByb3RvdHlwZS5wb3BgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyBvdGhlciBwYXRocyB0byB0aGUgc2FtZSBhcnJheSB0aGF0IGEKICAgICAgICogc3BsaWNlIG9jY3VycmVkIHRvIHRoZSBhcnJheS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBhcnJheS4KICAgICAgICogQHJldHVybiB7Kn0gSXRlbSB0aGF0IHdhcyByZW1vdmVkLgogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICBwb3AocGF0aCkgewogICAgICAgIGxldCBpbmZvID0ge3BhdGg6ICcnfTsKICAgICAgICBsZXQgYXJyYXkgPSAvKiogQHR5cGUge0FycmF5fSAqLyhQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIHBhdGgsIGluZm8pKTsKICAgICAgICBsZXQgaGFkTGVuZ3RoID0gQm9vbGVhbihhcnJheS5sZW5ndGgpOwogICAgICAgIGxldCByZXQgPSBhcnJheS5wb3AoKTsKICAgICAgICBpZiAoaGFkTGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgYXJyYXkubGVuZ3RoLCAwLCBbcmV0XSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTdGFydGluZyBmcm9tIHRoZSBzdGFydCBpbmRleCBzcGVjaWZpZWQsIHJlbW92ZXMgMCBvciBtb3JlIGl0ZW1zCiAgICAgICAqIGZyb20gdGhlIGFycmF5IGFuZCBpbnNlcnRzIDAgb3IgbW9yZSBuZXcgaXRlbXMgaW4gdGhlaXIgcGxhY2UuCiAgICAgICAqCiAgICAgICAqIFRoZSBhcmd1bWVudHMgYWZ0ZXIgYHBhdGhgIGFuZCByZXR1cm4gdmFsdWUgbWF0Y2ggdGhhdCBvZgogICAgICAgKiBgQXJyYXkucHJvdG90eXBlLnNwbGljZWAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgSW5kZXggZnJvbSB3aGljaCB0byBzdGFydCByZW1vdmluZy9pbnNlcnRpbmcuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxldGVDb3VudCBOdW1iZXIgb2YgaXRlbXMgdG8gcmVtb3ZlLgogICAgICAgKiBAcGFyYW0gey4uLip9IGl0ZW1zIEl0ZW1zIHRvIGluc2VydCBpbnRvIGFycmF5LgogICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgb2YgcmVtb3ZlZCBpdGVtcy4KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgc3BsaWNlKHBhdGgsIHN0YXJ0LCBkZWxldGVDb3VudCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoIDogJyd9OwogICAgICAgIGxldCBhcnJheSA9IC8qKiBAdHlwZSB7QXJyYXl9ICovKFBvbHltZXIuUGF0aC5nZXQodGhpcywgcGF0aCwgaW5mbykpOwogICAgICAgIC8vIE5vcm1hbGl6ZSBmYW5jeSBuYXRpdmUgc3BsaWNlIGhhbmRsaW5nIG9mIGNyYXp5IHN0YXJ0IHZhbHVlcwogICAgICAgIGlmIChzdGFydCA8IDApIHsKICAgICAgICAgIHN0YXJ0ID0gYXJyYXkubGVuZ3RoIC0gTWF0aC5mbG9vcigtc3RhcnQpOwogICAgICAgIH0gZWxzZSBpZiAoc3RhcnQpIHsKICAgICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzdGFydCk7CiAgICAgICAgfQogICAgICAgIC8vIGFycmF5LnNwbGljZSBkb2VzIGRpZmZlcmVudCB0aGluZ3MgYmFzZWQgb24gdGhlIG51bWJlciBvZiBhcmd1bWVudHMKICAgICAgICAvLyB5b3UgcGFzcyBpbi4gVGhlcmVmb3JlLCBhcnJheS5zcGxpY2UoMCkgYW5kIGFycmF5LnNwbGljZSgwLCB1bmRlZmluZWQpCiAgICAgICAgLy8gZG8gZGlmZmVyZW50IHRoaW5ncy4gSW4gdGhlIGZvcm1lciwgdGhlIHdob2xlIGFycmF5IGlzIGNsZWFyZWQuIEluIHRoZQogICAgICAgIC8vIGxhdHRlciwgbm8gaXRlbXMgYXJlIHJlbW92ZWQuCiAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHdlIG5lZWQgdG8gZGV0ZWN0IHdoZXRoZXIgMS4gb25lIG9mIHRoZSBhcmd1bWVudHMKICAgICAgICAvLyBpcyBhY3R1YWxseSBwYXNzZWQgaW4gYW5kIHRoZW4gMi4gZGV0ZXJtaW5lIGhvdyBtYW55IGFyZ3VtZW50cwogICAgICAgIC8vIHdlIHNob3VsZCBwYXNzIG9uIHRvIHRoZSBuYXRpdmUgYXJyYXkuc3BsaWNlCiAgICAgICAgLy8KICAgICAgICBsZXQgcmV0OwogICAgICAgIC8vIE9taXQgYW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGlmIHRoZXkgd2VyZSBub3QgcGFzc2VkIGluCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKICAgICAgICAgIHJldCA9IGFycmF5LnNwbGljZShzdGFydCk7CiAgICAgICAgLy8gRWl0aGVyIHN0YXJ0IHdhcyB1bmRlZmluZWQgYW5kIHRoZSBvdGhlcnMgd2VyZSBkZWZpbmVkLCBidXQgaW4gdGhpcwogICAgICAgIC8vIGNhc2Ugd2UgY2FuIHNhZmVseSBwYXNzIG9uIGFsbCBhcmd1bWVudHMKICAgICAgICAvLwogICAgICAgIC8vIE5vdGU6IHRoaXMgaW5jbHVkZXMgdGhlIGNhc2Ugd2hlcmUgbm9uZSBvZiB0aGUgYXJndW1lbnRzIHdlcmUgcGFzc2VkIGluLAogICAgICAgIC8vIGUuZy4gdGhpcy5zcGxpY2UoJ2FycmF5JykuIEhvd2V2ZXIsIGlmIGJvdGggc3RhcnQgYW5kIGRlbGV0ZUNvdW50CiAgICAgICAgLy8gYXJlIHVuZGVmaW5lZCwgYXJyYXkuc3BsaWNlIHdpbGwgbm90IG1vZGlmeSB0aGUgYXJyYXkgKGFzIGV4cGVjdGVkKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXQgPSBhcnJheS5zcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50LCAuLi5pdGVtcyk7CiAgICAgICAgfQogICAgICAgIC8vIEF0IHRoZSBlbmQsIGNoZWNrIHdoZXRoZXIgYW55IGl0ZW1zIHdlcmUgcGFzc2VkIGluIChlLmcuIGluc2VydGlvbnMpCiAgICAgICAgLy8gb3IgaWYgdGhlIHJldHVybiBhcnJheSBjb250YWlucyBpdGVtcyAoZS5nLiBkZWxldGlvbnMpLgogICAgICAgIC8vIE9ubHkgbm90aWZ5IGlmIGl0ZW1zIHdlcmUgYWRkZWQgb3IgZGVsZXRlZC4KICAgICAgICBpZiAoaXRlbXMubGVuZ3RoIHx8IHJldC5sZW5ndGgpIHsKICAgICAgICAgIG5vdGlmeVNwbGljZSh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCBzdGFydCwgaXRlbXMubGVuZ3RoLCByZXQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhcnJheSBhdCB0aGUgcGF0aCBzcGVjaWZpZWQuCiAgICAgICAqCiAgICAgICAqIFRoZSBhcmd1bWVudHMgYWZ0ZXIgYHBhdGhgIGFuZCByZXR1cm4gdmFsdWUgbWF0Y2ggdGhhdCBvZgogICAgICAgKiBgQXJyYXkucHJvdG90eXBlLnBvcGAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcmV0dXJuIHsqfSBJdGVtIHRoYXQgd2FzIHJlbW92ZWQuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHNoaWZ0KHBhdGgpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbGV0IGhhZExlbmd0aCA9IEJvb2xlYW4oYXJyYXkubGVuZ3RoKTsKICAgICAgICBsZXQgcmV0ID0gYXJyYXkuc2hpZnQoKTsKICAgICAgICBpZiAoaGFkTGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgMCwgMCwgW3JldF0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQWRkcyBpdGVtcyBvbnRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5IGF0IHRoZSBwYXRoIHNwZWNpZmllZC4KICAgICAgICoKICAgICAgICogVGhlIGFyZ3VtZW50cyBhZnRlciBgcGF0aGAgYW5kIHJldHVybiB2YWx1ZSBtYXRjaCB0aGF0IG9mCiAgICAgICAqIGBBcnJheS5wcm90b3R5cGUucHVzaGAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcGFyYW0gey4uLip9IGl0ZW1zIEl0ZW1zIHRvIGluc2VydCBpbmZvIGFycmF5CiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gTmV3IGxlbmd0aCBvZiB0aGUgYXJyYXkuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHVuc2hpZnQocGF0aCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbGV0IHJldCA9IGFycmF5LnVuc2hpZnQoLi4uaXRlbXMpOwogICAgICAgIGlmIChpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgIG5vdGlmeVNwbGljZSh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCAwLCBpdGVtcy5sZW5ndGgsIFtdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE5vdGlmeSB0aGF0IGEgcGF0aCBoYXMgY2hhbmdlZC4KICAgICAgICoKICAgICAgICogRXhhbXBsZToKICAgICAgICoKICAgICAgICogICAgIHRoaXMuaXRlbS51c2VyLm5hbWUgPSAnQm9iJzsKICAgICAgICogICAgIHRoaXMubm90aWZ5UGF0aCgnaXRlbS51c2VyLm5hbWUnKTsKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0aGF0IHNob3VsZCBiZSBub3RpZmllZC4KICAgICAgICogQHBhcmFtIHsqPX0gdmFsdWUgVmFsdWUgYXQgdGhlIHBhdGggKG9wdGlvbmFsKS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBub3RpZnlQYXRoKHBhdGgsIHZhbHVlKSB7CiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgbGV0IHByb3BQYXRoOwogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgICAgIC8vIEdldCB2YWx1ZSBpZiBub3Qgc3VwcGxpZWQKICAgICAgICAgIGxldCBpbmZvID0ge3BhdGg6ICcnfTsKICAgICAgICAgIHZhbHVlID0gUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKTsKICAgICAgICAgIHByb3BQYXRoID0gaW5mby5wYXRoOwogICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkgewogICAgICAgICAgLy8gTm9ybWFsaXplIHBhdGggaWYgbmVlZGVkCiAgICAgICAgICBwcm9wUGF0aCA9IFBvbHltZXIuUGF0aC5ub3JtYWxpemUocGF0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHByb3BQYXRoID0gLyoqIEB0eXBle3N0cmluZ30gKi8ocGF0aCk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocHJvcFBhdGgsIHZhbHVlLCB0cnVlLCB0cnVlKSkgewogICAgICAgICAgdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eWAgQVBJIGJ1dCBjYW4gYmUgY2FsbGVkIG9uCiAgICAgICAqIGFuIGluc3RhbmNlIHRvIGFkZCBlZmZlY3RzIGF0IHJ1bnRpbWUuICBTZWUgdGhhdCBtZXRob2QgZm9yCiAgICAgICAqIGZ1bGwgQVBJIGRvY3MuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHByb3RlY3RlZFNldHRlciBDcmVhdGVzIGEgY3VzdG9tIHByb3RlY3RlZCBzZXR0ZXIKICAgICAgICogICB3aGVuIGB0cnVlYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkocHJvcGVydHksIHByb3RlY3RlZFNldHRlcikgewogICAgICAgIHRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5SRUFEX09OTFkpOwogICAgICAgIGlmIChwcm90ZWN0ZWRTZXR0ZXIpIHsKICAgICAgICAgIHRoaXNbJ19zZXQnICsgdXBwZXIocHJvcGVydHkpXSA9IC8qKiBAdGhpcyB7UHJvcGVydHlFZmZlY3RzfSAqL2Z1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSk7CiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyYCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHtzdHJpbmd8ZnVuY3Rpb24oKiwqKX0gbWV0aG9kIEZ1bmN0aW9uIG9yIG5hbWUgb2Ygb2JzZXJ2ZXIgbWV0aG9kIHRvIGNhbGwKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gZHluYW1pY0ZuIFdoZXRoZXIgdGhlIG1ldGhvZCBuYW1lIHNob3VsZCBiZSBpbmNsdWRlZCBhcwogICAgICAgKiAgIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfY3JlYXRlUHJvcGVydHlPYnNlcnZlcihwcm9wZXJ0eSwgbWV0aG9kLCBkeW5hbWljRm4pIHsKICAgICAgICBsZXQgaW5mbyA9IHsgcHJvcGVydHksIG1ldGhvZCwgZHluYW1pY0ZuOiBCb29sZWFuKGR5bmFtaWNGbikgfTsKICAgICAgICB0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuT0JTRVJWRSwgewogICAgICAgICAgZm46IHJ1bk9ic2VydmVyRWZmZWN0LCBpbmZvLCB0cmlnZ2VyOiB7bmFtZTogcHJvcGVydHl9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGR5bmFtaWNGbikgewogICAgICAgICAgdGhpcy5fYWRkUHJvcGVydHlFZmZlY3QoLyoqIEB0eXBlIHtzdHJpbmd9ICovKG1ldGhvZCksIFRZUEVTLk9CU0VSVkUsIHsKICAgICAgICAgICAgZm46IHJ1bk9ic2VydmVyRWZmZWN0LCBpbmZvLCB0cmlnZ2VyOiB7bmFtZTogbWV0aG9kfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZU1ldGhvZE9ic2VydmVyYCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZwogICAgICAgKiAgIHdoZXRoZXIgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZU1ldGhvZE9ic2VydmVyKGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIGxldCBzaWcgPSBwYXJzZU1ldGhvZChleHByZXNzaW9uKTsKICAgICAgICBpZiAoIXNpZykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgb2JzZXJ2ZXIgZXhwcmVzc2lvbiAnIiArIGV4cHJlc3Npb24gKyAiJyIpOwogICAgICAgIH0KICAgICAgICBjcmVhdGVNZXRob2RFZmZlY3QodGhpcywgc2lnLCBUWVBFUy5PQlNFUlZFLCBydW5NZXRob2RFZmZlY3QsIG51bGwsIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgY3JlYXRlTm90aWZ5aW5nUHJvcGVydHlgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfY3JlYXRlTm90aWZ5aW5nUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICB0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuTk9USUZZLCB7CiAgICAgICAgICBmbjogcnVuTm90aWZ5RWZmZWN0LAogICAgICAgICAgaW5mbzogewogICAgICAgICAgICBldmVudE5hbWU6IENhc2VNYXAuY2FtZWxUb0Rhc2hDYXNlKHByb3BlcnR5KSArICctY2hhbmdlZCcsCiAgICAgICAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZVJlZmxlY3RlZFByb3BlcnR5YCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZVJlZmxlY3RlZFByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgbGV0IGF0dHIgPSB0aGlzLmNvbnN0cnVjdG9yLmF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShwcm9wZXJ0eSk7CiAgICAgICAgaWYgKGF0dHJbMF0gPT09ICctJykgewogICAgICAgICAgY29uc29sZS53YXJuKCdQcm9wZXJ0eSAnICsgcHJvcGVydHkgKyAnIGNhbm5vdCBiZSByZWZsZWN0ZWQgdG8gYXR0cmlidXRlICcgKwogICAgICAgICAgICBhdHRyICsgJyBiZWNhdXNlICItIiBpcyBub3QgYSB2YWxpZCBzdGFydGluZyBhdHRyaWJ1dGUgbmFtZS4gVXNlIGEgbG93ZXJjYXNlIGZpcnN0IGxldHRlciBmb3IgdGhlIHByb3BlcnR5IGluc3RlYWQuJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5SRUZMRUNULCB7CiAgICAgICAgICAgIGZuOiBydW5SZWZsZWN0RWZmZWN0LAogICAgICAgICAgICBpbmZvOiB7CiAgICAgICAgICAgICAgYXR0ck5hbWU6IGF0dHIKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZUNvbXB1dGVkUHJvcGVydHlgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBjb21wdXRlZCBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZwogICAgICAgKiAgIHdoZXRoZXIgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZUNvbXB1dGVkUHJvcGVydHkocHJvcGVydHksIGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIGxldCBzaWcgPSBwYXJzZU1ldGhvZChleHByZXNzaW9uKTsKICAgICAgICBpZiAoIXNpZykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgY29tcHV0ZWQgZXhwcmVzc2lvbiAnIiArIGV4cHJlc3Npb24gKyAiJyIpOwogICAgICAgIH0KICAgICAgICBjcmVhdGVNZXRob2RFZmZlY3QodGhpcywgc2lnLCBUWVBFUy5DT01QVVRFLCBydW5Db21wdXRlZEVmZmVjdCwgcHJvcGVydHksIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBHYXRoZXIgdGhlIGFyZ3VtZW50IHZhbHVlcyBmb3IgYSBtZXRob2Qgc3BlY2lmaWVkIGluIHRoZSBwcm92aWRlZCBhcnJheQogICAgICAgKiBvZiBhcmd1bWVudCBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogVGhlIGBwYXRoYCBhbmQgYHZhbHVlYCBhcmd1bWVudHMgYXJlIHVzZWQgdG8gZmlsbCBpbiB3aWxkY2FyZCBkZXNjcmlwdG9yCiAgICAgICAqIHdoZW4gdGhlIG1ldGhvZCBpcyBiZWluZyBjYWxsZWQgYXMgYSByZXN1bHQgb2YgYSBwYXRoIG5vdGlmaWNhdGlvbi4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshQXJyYXk8IU1ldGhvZEFyZz59IGFyZ3MgQXJyYXkgb2YgYXJndW1lbnQgbWV0YWRhdGEKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUHJvcGVydHkvcGF0aCBuYW1lIHRoYXQgdHJpZ2dlcmVkIHRoZSBtZXRob2QgZWZmZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgICAqIEByZXR1cm4ge0FycmF5PCo+fSBBcnJheSBvZiBhcmd1bWVudCB2YWx1ZXMKICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9tYXJzaGFsQXJncyhhcmdzLCBwYXRoLCBwcm9wcykgewogICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9fZGF0YTsKICAgICAgICBsZXQgdmFsdWVzID0gW107CiAgICAgICAgZm9yIChsZXQgaT0wLCBsPWFyZ3MubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgICAgbGV0IGFyZyA9IGFyZ3NbaV07CiAgICAgICAgICBsZXQgbmFtZSA9IGFyZy5uYW1lOwogICAgICAgICAgbGV0IHY7CiAgICAgICAgICBpZiAoYXJnLmxpdGVyYWwpIHsKICAgICAgICAgICAgdiA9IGFyZy52YWx1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChhcmcuc3RydWN0dXJlZCkgewogICAgICAgICAgICAgIHYgPSBQb2x5bWVyLlBhdGguZ2V0KGRhdGEsIG5hbWUpOwogICAgICAgICAgICAgIC8vIHdoZW4gZGF0YSBpcyBub3Qgc3RvcmVkIGUuZy4gYHNwbGljZXNgCiAgICAgICAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgdiA9IHByb3BzW25hbWVdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2ID0gZGF0YVtuYW1lXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGFyZy53aWxkY2FyZCkgewogICAgICAgICAgICAvLyBPbmx5IHNlbmQgdGhlIGFjdHVhbCBwYXRoIGNoYW5nZWQgaW5mbyBpZiB0aGUgY2hhbmdlIHRoYXQKICAgICAgICAgICAgLy8gY2F1c2VkIHRoZSBvYnNlcnZlciB0byBydW4gbWF0Y2hlZCB0aGUgd2lsZGNhcmQKICAgICAgICAgICAgbGV0IGJhc2VDaGFuZ2VkID0gKG5hbWUuaW5kZXhPZihwYXRoICsgJy4nKSA9PT0gMCk7CiAgICAgICAgICAgIGxldCBtYXRjaGVzID0gKHBhdGguaW5kZXhPZihuYW1lKSA9PT0gMCAmJiAhYmFzZUNoYW5nZWQpOwogICAgICAgICAgICB2YWx1ZXNbaV0gPSB7CiAgICAgICAgICAgICAgcGF0aDogbWF0Y2hlcyA/IHBhdGggOiBuYW1lLAogICAgICAgICAgICAgIHZhbHVlOiBtYXRjaGVzID8gcHJvcHNbcGF0aF0gOiB2LAogICAgICAgICAgICAgIGJhc2U6IHYKICAgICAgICAgICAgfTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhbHVlc1tpXSA9IHY7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZXM7CiAgICAgIH0KCiAgICAgIC8vIC0tIHN0YXRpYyBjbGFzcyBtZXRob2RzIC0tLS0tLS0tLS0tLQoKICAgICAgLyoqCiAgICAgICAqIEVuc3VyZXMgYW4gYWNjZXNzb3IgZXhpc3RzIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LCBhbmQgYWRkcwogICAgICAgKiB0byBhIGxpc3Qgb2YgInByb3BlcnR5IGVmZmVjdHMiIHRoYXQgd2lsbCBydW4gd2hlbiB0aGUgYWNjZXNzb3IgZm9yCiAgICAgICAqIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaXMgc2V0LiAgRWZmZWN0cyBhcmUgZ3JvdXBlZCBieSAidHlwZSIsIHdoaWNoCiAgICAgICAqIHJvdWdobHkgY29ycmVzcG9uZHMgdG8gYSBwaGFzZSBpbiBlZmZlY3QgcHJvY2Vzc2luZy4gIFRoZSBlZmZlY3QKICAgICAgICogbWV0YWRhdGEgc2hvdWxkIGJlIGluIHRoZSBmb2xsb3dpbmcgZm9ybToKICAgICAgICoKICAgICAgICogICAgIHsKICAgICAgICogICAgICAgZm46IGVmZmVjdEZ1bmN0aW9uLCAvLyBSZWZlcmVuY2UgdG8gZnVuY3Rpb24gdG8gY2FsbCB0byBwZXJmb3JtIGVmZmVjdAogICAgICAgKiAgICAgICBpbmZvOiB7IC4uLiB9ICAgICAgIC8vIEVmZmVjdCBtZXRhZGF0YSBwYXNzZWQgdG8gZnVuY3Rpb24KICAgICAgICogICAgICAgdHJpZ2dlcjogeyAgICAgICAgICAvLyBPcHRpb25hbCB0cmlnZ2VyaW5nIG1ldGFkYXRhOyBpZiBub3QgcHJvdmlkZWQKICAgICAgICogICAgICAgICBuYW1lOiBzdHJpbmcgICAgICAvLyB0aGUgcHJvcGVydHkgaXMgdHJlYXRlZCBhcyBhIHdpbGRjYXJkCiAgICAgICAqICAgICAgICAgc3RydWN0dXJlZDogYm9vbGVhbgogICAgICAgKiAgICAgICAgIHdpbGRjYXJkOiBib29sZWFuCiAgICAgICAqICAgICAgIH0KICAgICAgICogICAgIH0KICAgICAgICoKICAgICAgICogRWZmZWN0cyBhcmUgY2FsbGVkIGZyb20gYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgaW4gdGhlIGZvbGxvd2luZyBvcmRlciBieQogICAgICAgKiB0eXBlOgogICAgICAgKgogICAgICAgKiAxLiBDT01QVVRFCiAgICAgICAqIDIuIFBST1BBR0FURQogICAgICAgKiAzLiBSRUZMRUNUCiAgICAgICAqIDQuIE9CU0VSVkUKICAgICAgICogNS4gTk9USUZZCiAgICAgICAqCiAgICAgICAqIEVmZmVjdCBmdW5jdGlvbnMgYXJlIGNhbGxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlOgogICAgICAgKgogICAgICAgKiAgICAgZWZmZWN0RnVuY3Rpb24oaW5zdCwgcGF0aCwgcHJvcHMsIG9sZFByb3BzLCBpbmZvLCBoYXNQYXRocykKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRoYXQgc2hvdWxkIHRyaWdnZXIgdGhlIGVmZmVjdAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFZmZlY3QgdHlwZSwgZnJvbSB0aGlzLlBST1BFUlRZX0VGRkVDVF9UWVBFUwogICAgICAgKiBAcGFyYW0ge09iamVjdD19IGVmZmVjdCBFZmZlY3QgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBhZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSwgZWZmZWN0KSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCB0eXBlLCBlZmZlY3QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIHNpbmdsZS1wcm9wZXJ0eSBvYnNlcnZlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ3xmdW5jdGlvbigqLCopfSBtZXRob2QgRnVuY3Rpb24gb3IgbmFtZSBvZiBvYnNlcnZlciBtZXRob2QgdG8gY2FsbAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBkeW5hbWljRm4gV2hldGhlciB0aGUgbWV0aG9kIG5hbWUgc2hvdWxkIGJlIGluY2x1ZGVkIGFzCiAgICAgICAqICAgYSBkZXBlbmRlbmN5IHRvIHRoZSBlZmZlY3QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyKHByb3BlcnR5LCBtZXRob2QsIGR5bmFtaWNGbikgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVQcm9wZXJ0eU9ic2VydmVyKHByb3BlcnR5LCBtZXRob2QsIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIGEgbXVsdGktcHJvcGVydHkgIm1ldGhvZCBvYnNlcnZlciIgYmFzZWQgb24gdGhlIHByb3ZpZGVkCiAgICAgICAqIGV4cHJlc3Npb24sIHdoaWNoIHNob3VsZCBiZSBhIHN0cmluZyBpbiB0aGUgZm9ybSBvZiBhIG5vcm1hbCBKYXZhU2NyaXB0CiAgICAgICAqIGZ1bmN0aW9uIHNpZ25hdHVyZTogYCdtZXRob2ROYW1lKGFyZzEsIFsuLi4sIGFyZ25dKSdgLiAgRWFjaCBhcmd1bWVudAogICAgICAgKiBzaG91bGQgY29ycmVzcG9uZCB0byBhIHByb3BlcnR5IG9yIHBhdGggaW4gdGhlIGNvbnRleHQgb2YgdGhpcwogICAgICAgKiBwcm90b3R5cGUgKG9yIGluc3RhbmNlKSwgb3IgbWF5IGJlIGEgbGl0ZXJhbCBzdHJpbmcgb3IgbnVtYmVyLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBNZXRob2QgZXhwcmVzc2lvbgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW58T2JqZWN0PX0gZHluYW1pY0ZuIEJvb2xlYW4gb3Igb2JqZWN0IG1hcCBpbmRpY2F0aW5nCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqICAgd2hldGhlciBtZXRob2QgbmFtZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlTWV0aG9kT2JzZXJ2ZXIoZXhwcmVzc2lvbiwgZHluYW1pY0ZuKSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZU1ldGhvZE9ic2VydmVyKGV4cHJlc3Npb24sIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYXVzZXMgdGhlIHNldHRlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IHRvIGRpc3BhdGNoIGA8cHJvcGVydHk+LWNoYW5nZWRgCiAgICAgICAqIGV2ZW50cyB0byBub3RpZnkgb2YgY2hhbmdlcyB0byB0aGUgcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eShwcm9wZXJ0eSkgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eShwcm9wZXJ0eSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIGEgcmVhZC1vbmx5IGFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIFRvIHNldCB0aGUgcHJvcGVydHksIHVzZSB0aGUgcHJvdGVjdGVkIGBfc2V0UHJvcGVydHlgIEFQSS4KICAgICAgICogVG8gY3JlYXRlIGEgY3VzdG9tIHByb3RlY3RlZCBzZXR0ZXIgKGUuZy4gYF9zZXRNeVByb3AoKWAgZm9yCiAgICAgICAqIHByb3BlcnR5IGBteVByb3BgKSwgcGFzcyBgdHJ1ZWAgZm9yIGBwcm90ZWN0ZWRTZXR0ZXJgLgogICAgICAgKgogICAgICAgKiBOb3RlLCBpZiB0aGUgcHJvcGVydHkgd2lsbCBoYXZlIG90aGVyIHByb3BlcnR5IGVmZmVjdHMsIHRoaXMgbWV0aG9kCiAgICAgICAqIHNob3VsZCBiZSBjYWxsZWQgZmlyc3QsIGJlZm9yZSBhZGRpbmcgb3RoZXIgZWZmZWN0cy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gcHJvdGVjdGVkU2V0dGVyIENyZWF0ZXMgYSBjdXN0b20gcHJvdGVjdGVkIHNldHRlcgogICAgICAgKiAgIHdoZW4gYHRydWVgLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eShwcm9wZXJ0eSwgcHJvdGVjdGVkU2V0dGVyKSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkocHJvcGVydHksIHByb3RlY3RlZFNldHRlcik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYXVzZXMgdGhlIHNldHRlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IHRvIHJlZmxlY3QgdGhlIHByb3BlcnR5IHZhbHVlCiAgICAgICAqIHRvIGEgKGRhc2gtY2FzZWQpIGF0dHJpYnV0ZSBvZiB0aGUgc2FtZSBuYW1lLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICB0aGlzLnByb3RvdHlwZS5fY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkocHJvcGVydHkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIGNvbXB1dGVkIHByb3BlcnR5IHdob3NlIHZhbHVlIGlzIHNldCB0byB0aGUgcmVzdWx0IG9mIHRoZQogICAgICAgKiBtZXRob2QgZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiBgZXhwcmVzc2lvbmAgZWFjaCB0aW1lIG9uZSBvciBtb3JlCiAgICAgICAqIGFyZ3VtZW50cyB0byB0aGUgbWV0aG9kIGNoYW5nZXMuICBUaGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgYSBzdHJpbmcKICAgICAgICogaW4gdGhlIGZvcm0gb2YgYSBub3JtYWwgSmF2YVNjcmlwdCBmdW5jdGlvbiBzaWduYXR1cmU6CiAgICAgICAqIGAnbWV0aG9kTmFtZShhcmcxLCBbLi4uLCBhcmduXSknYAogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBjb21wdXRlZCBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZyB3aGV0aGVyCiAgICAgICAqICAgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZUNvbXB1dGVkUHJvcGVydHkocHJvcGVydHksIGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVDb21wdXRlZFByb3BlcnR5KHByb3BlcnR5LCBleHByZXNzaW9uLCBkeW5hbWljRm4pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUGFyc2VzIHRoZSBwcm92aWRlZCB0ZW1wbGF0ZSB0byBlbnN1cmUgYmluZGluZyBlZmZlY3RzIGFyZSBjcmVhdGVkCiAgICAgICAqIGZvciB0aGVtLCBhbmQgdGhlbiBlbnN1cmVzIHByb3BlcnR5IGFjY2Vzc29ycyBhcmUgY3JlYXRlZCBmb3IgYW55CiAgICAgICAqIGRlcGVuZGVudCBwcm9wZXJ0aWVzIGluIHRoZSB0ZW1wbGF0ZS4gIEJpbmRpbmcgZWZmZWN0cyBmb3IgYm91bmQKICAgICAgICogdGVtcGxhdGVzIGFyZSBzdG9yZWQgaW4gYSBsaW5rZWQgbGlzdCBvbiB0aGUgaW5zdGFuY2Ugc28gdGhhdAogICAgICAgKiB0ZW1wbGF0ZXMgY2FuIGJlIGVmZmljaWVudGx5IHN0YW1wZWQgYW5kIHVuc3RhbXBlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgY29udGFpbmluZyBiaW5kaW5nCiAgICAgICAqICAgYmluZGluZ3MKICAgICAgICogQHJldHVybiB7IVRlbXBsYXRlSW5mb30gVGVtcGxhdGUgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBiaW5kVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5wcm90b3R5cGUuX2JpbmRUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgIH0KCiAgICAgIC8vIC0tIGJpbmRpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBiaW5kVGVtcGxhdGVgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG9uIHRoZSBwcm90b3R5cGUgKGZvciBwcm90b3R5cGljYWwgdGVtcGxhdGUKICAgICAgICogYmluZGluZywgdG8gYXZvaWQgY3JlYXRpbmcgYWNjZXNzb3JzIGV2ZXJ5IGluc3RhbmNlKSBvbmNlIHBlciBwcm90b3R5cGUsCiAgICAgICAqIGFuZCB3aWxsIGJlIGNhbGxlZCB3aXRoIGBydW50aW1lQmluZGluZzogdHJ1ZWAgYnkgYF9zdGFtcFRlbXBsYXRlYCB0bwogICAgICAgKiBjcmVhdGUgYW5kIGxpbmsgYW4gaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCBhCiAgICAgICAqIHBhcnRpY3VsYXIgc3RhbXBpbmcuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIGNvbnRhaW5pbmcgYmluZGluZwogICAgICAgKiAgIGJpbmRpbmdzCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGluc3RhbmNlQmluZGluZyBXaGVuIGZhbHNlIChkZWZhdWx0KSwgcGVyZm9ybXMKICAgICAgICogICAicHJvdG90eXBpY2FsIiBiaW5kaW5nIG9mIHRoZSB0ZW1wbGF0ZSBhbmQgb3ZlcndyaXRlcyBhbnkgcHJldmlvdXNseQogICAgICAgKiAgIGJvdW5kIHRlbXBsYXRlIGZvciB0aGUgY2xhc3MuIFdoZW4gdHJ1ZSAoYXMgcGFzc2VkIGZyb20KICAgICAgICogICBgX3N0YW1wVGVtcGxhdGVgKSwgdGhlIHRlbXBsYXRlIGluZm8gaXMgaW5zdGFuY2VkIGFuZCBsaW5rZWQgaW50bwogICAgICAgKiAgIHRoZSBsaXN0IG9mIGJvdW5kIHRlbXBsYXRlcy4KICAgICAgICogQHJldHVybiB7IVRlbXBsYXRlSW5mb30gVGVtcGxhdGUgbWV0YWRhdGEgb2JqZWN0OyBmb3IgYHJ1bnRpbWVCaW5kaW5nYCwKICAgICAgICogICB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBwcm90b3R5cGljYWwgdGVtcGxhdGUgaW5mbwogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfYmluZFRlbXBsYXRlKHRlbXBsYXRlLCBpbnN0YW5jZUJpbmRpbmcpIHsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5jb25zdHJ1Y3Rvci5fcGFyc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgbGV0IHdhc1ByZUJvdW5kID0gdGhpcy5fX3RlbXBsYXRlSW5mbyA9PSB0ZW1wbGF0ZUluZm87CiAgICAgICAgLy8gT3B0aW1pemF0aW9uOiBzaW5jZSB0aGlzIGlzIGNhbGxlZCB0d2ljZSBmb3IgcHJvdG8tYm91bmQgdGVtcGxhdGVzLAogICAgICAgIC8vIGRvbid0IGF0dGVtcHQgdG8gcmVjcmVhdGUgYWNjZXNzb3JzIGlmIHRoaXMgdGVtcGxhdGUgd2FzIHByZS1ib3VuZAogICAgICAgIGlmICghd2FzUHJlQm91bmQpIHsKICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gdGVtcGxhdGVJbmZvLnByb3BlcnR5RWZmZWN0cykgewogICAgICAgICAgICB0aGlzLl9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKHByb3ApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaW5zdGFuY2VCaW5kaW5nKSB7CiAgICAgICAgICAvLyBGb3IgaW5zdGFuY2UtdGltZSBiaW5kaW5nLCBjcmVhdGUgaW5zdGFuY2Ugb2YgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICAgIC8vIGFuZCBsaW5rIGludG8gbGlzdCBvZiB0ZW1wbGF0ZXMgaWYgbmVjZXNzYXJ5CiAgICAgICAgICB0ZW1wbGF0ZUluZm8gPSAvKiogQHR5cGUgeyFUZW1wbGF0ZUluZm99ICovKE9iamVjdC5jcmVhdGUodGVtcGxhdGVJbmZvKSk7CiAgICAgICAgICB0ZW1wbGF0ZUluZm8ud2FzUHJlQm91bmQgPSB3YXNQcmVCb3VuZDsKICAgICAgICAgIGlmICghd2FzUHJlQm91bmQgJiYgdGhpcy5fX3RlbXBsYXRlSW5mbykgewogICAgICAgICAgICBsZXQgbGFzdCA9IHRoaXMuX190ZW1wbGF0ZUluZm9MYXN0IHx8IHRoaXMuX190ZW1wbGF0ZUluZm87CiAgICAgICAgICAgIHRoaXMuX190ZW1wbGF0ZUluZm9MYXN0ID0gbGFzdC5uZXh0VGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvOwogICAgICAgICAgICB0ZW1wbGF0ZUluZm8ucHJldmlvdXNUZW1wbGF0ZUluZm8gPSBsYXN0OwogICAgICAgICAgICByZXR1cm4gdGVtcGxhdGVJbmZvOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fX3RlbXBsYXRlSW5mbyA9IHRlbXBsYXRlSW5mbzsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFkZHMgYSBwcm9wZXJ0eSBlZmZlY3QgdG8gdGhlIGdpdmVuIHRlbXBsYXRlIG1ldGFkYXRhLCB3aGljaCBpcyBydW4KICAgICAgICogYXQgdGhlICJwcm9wYWdhdGUiIHN0YWdlIG9mIGBfcHJvcGVydGllc0NoYW5nZWRgIHdoZW4gdGhlIHRlbXBsYXRlCiAgICAgICAqIGhhcyBiZWVuIGJvdW5kIHRvIHRoZSBlbGVtZW50IHZpYSBgX2JpbmRUZW1wbGF0ZWAuCiAgICAgICAqCiAgICAgICAqIFRoZSBgZWZmZWN0YCBvYmplY3Qgc2hvdWxkIG1hdGNoIHRoZSBmb3JtYXQgaW4gYF9hZGRQcm9wZXJ0eUVmZmVjdGAuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgdG8gYWRkIGVmZmVjdCB0bwogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBlZmZlY3QKICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBlZmZlY3QgRWZmZWN0IG1ldGFkYXRhIG9iamVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgX2FkZFRlbXBsYXRlUHJvcGVydHlFZmZlY3QodGVtcGxhdGVJbmZvLCBwcm9wLCBlZmZlY3QpIHsKICAgICAgICBsZXQgaG9zdFByb3BzID0gdGVtcGxhdGVJbmZvLmhvc3RQcm9wcyA9IHRlbXBsYXRlSW5mby5ob3N0UHJvcHMgfHwge307CiAgICAgICAgaG9zdFByb3BzW3Byb3BdID0gdHJ1ZTsKICAgICAgICBsZXQgZWZmZWN0cyA9IHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMgPSB0ZW1wbGF0ZUluZm8ucHJvcGVydHlFZmZlY3RzIHx8IHt9OwogICAgICAgIGxldCBwcm9wRWZmZWN0cyA9IGVmZmVjdHNbcHJvcF0gPSBlZmZlY3RzW3Byb3BdIHx8IFtdOwogICAgICAgIHByb3BFZmZlY3RzLnB1c2goZWZmZWN0KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFN0YW1wcyB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgYW5kIHBlcmZvcm1zIGluc3RhbmNlLXRpbWUgc2V0dXAgZm9yCiAgICAgICAqIFBvbHltZXIgdGVtcGxhdGUgZmVhdHVyZXMsIGluY2x1ZGluZyBkYXRhIGJpbmRpbmdzLCBkZWNsYXJhdGl2ZSBldmVudAogICAgICAgKiBsaXN0ZW5lcnMsIGFuZCB0aGUgYHRoaXMuJGAgbWFwIG9mIGBpZGAncyB0byBub2Rlcy4gIEEgZG9jdW1lbnQgZnJhZ21lbnQKICAgICAgICogaXMgcmV0dXJuZWQgY29udGFpbmluZyB0aGUgc3RhbXBlZCBET00sIHJlYWR5IGZvciBpbnNlcnRpb24gaW50byB0aGUKICAgICAgICogRE9NLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlOyBob3dldmVyIG5vdGUgdGhhdCBkdWUgdG8KICAgICAgICogYHNoYWR5Y3NzYCBwb2x5ZmlsbCBsaW1pdGF0aW9ucywgb25seSBzdHlsZXMgZnJvbSB0ZW1wbGF0ZXMgcHJlcGFyZWQKICAgICAgICogdXNpbmcgYFNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZWAgd2lsbCBiZSBjb3JyZWN0bHkgcG9seWZpbGxlZCAoc2NvcGVkCiAgICAgICAqIHRvIHRoZSBzaGFkb3cgcm9vdCBhbmQgc3VwcG9ydCBDU1MgY3VzdG9tIHByb3BlcnRpZXMpLCBhbmQgbm90ZSB0aGF0CiAgICAgICAqIGBTaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGVgIG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBlbGVtZW50LiBBcyBzdWNoLAogICAgICAgKiBhbnkgc3R5bGVzIHJlcXVpcmVkIGJ5IGluIHJ1bnRpbWUtc3RhbXBlZCB0ZW1wbGF0ZXMgbXVzdCBiZSBpbmNsdWRlZAogICAgICAgKiBpbiB0aGUgbWFpbiBlbGVtZW50IHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBzdGFtcAogICAgICAgKiBAcmV0dXJuIHshU3RhbXBlZFRlbXBsYXRlfSBDbG9uZWQgdGVtcGxhdGUgY29udGVudAogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3N0YW1wVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICAvLyBFbnN1cmVzIHRoYXQgY3JlYXRlZCBkb20gaXMgYF9lbnF1ZXVlQ2xpZW50YCdkIHRvIHRoaXMgZWxlbWVudCBzbwogICAgICAgIC8vIHRoYXQgaXQgY2FuIGJlIGZsdXNoZWQgb24gbmV4dCBjYWxsIHRvIGBfZmx1c2hQcm9wZXJ0aWVzYAogICAgICAgIGhvc3RTdGFjay5iZWdpbkhvc3RpbmcodGhpcyk7CiAgICAgICAgbGV0IGRvbSA9IHN1cGVyLl9zdGFtcFRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICBob3N0U3RhY2suZW5kSG9zdGluZyh0aGlzKTsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gLyoqIEB0eXBlIHshVGVtcGxhdGVJbmZvfSAqLyh0aGlzLl9iaW5kVGVtcGxhdGUodGVtcGxhdGUsIHRydWUpKTsKICAgICAgICAvLyBBZGQgdGVtcGxhdGUtaW5zdGFuY2Utc3BlY2lmaWMgZGF0YSB0byBpbnN0YW5jZWQgdGVtcGxhdGVJbmZvCiAgICAgICAgdGVtcGxhdGVJbmZvLm5vZGVMaXN0ID0gZG9tLm5vZGVMaXN0OwogICAgICAgIC8vIENhcHR1cmUgY2hpbGQgbm9kZXMgdG8gYWxsb3cgdW5zdGFtcGluZyBvZiBub24tcHJvdG90eXBpY2FsIHRlbXBsYXRlcwogICAgICAgIGlmICghdGVtcGxhdGVJbmZvLndhc1ByZUJvdW5kKSB7CiAgICAgICAgICBsZXQgbm9kZXMgPSB0ZW1wbGF0ZUluZm8uY2hpbGROb2RlcyA9IFtdOwogICAgICAgICAgZm9yIChsZXQgbj1kb20uZmlyc3RDaGlsZDsgbjsgbj1uLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgIG5vZGVzLnB1c2gobik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRvbS50ZW1wbGF0ZUluZm8gPSB0ZW1wbGF0ZUluZm87CiAgICAgICAgLy8gU2V0dXAgY29tcG91bmQgc3RvcmFnZSwgMi13YXkgbGlzdGVuZXJzLCBhbmQgZGF0YUhvc3QgZm9yIGJpbmRpbmdzCiAgICAgICAgc2V0dXBCaW5kaW5ncyh0aGlzLCB0ZW1wbGF0ZUluZm8pOwogICAgICAgIC8vIEZsdXNoIHByb3BlcnRpZXMgaW50byB0ZW1wbGF0ZSBub2RlcyBpZiBhbHJlYWR5IGJvb3RlZAogICAgICAgIGlmICh0aGlzLl9fZGF0YVJlYWR5KSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMsIHRoaXMuX19kYXRhLCBudWxsLAogICAgICAgICAgICBmYWxzZSwgdGVtcGxhdGVJbmZvLm5vZGVMaXN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRvbTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYW5kIHVuYmluZHMgdGhlIG5vZGVzIHByZXZpb3VzbHkgY29udGFpbmVkIGluIHRoZSBwcm92aWRlZAogICAgICAgKiBEb2N1bWVudEZyYWdtZW50IHJldHVybmVkIGZyb20gYF9zdGFtcFRlbXBsYXRlYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshU3RhbXBlZFRlbXBsYXRlfSBkb20gRG9jdW1lbnRGcmFnbWVudCBwcmV2aW91c2x5IHJldHVybmVkCiAgICAgICAqICAgZnJvbSBgX3N0YW1wVGVtcGxhdGVgIGFzc29jaWF0ZWQgd2l0aCB0aGUgbm9kZXMgdG8gYmUgcmVtb3ZlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfcmVtb3ZlQm91bmREb20oZG9tKSB7CiAgICAgICAgLy8gVW5saW5rIHRlbXBsYXRlIGluZm8KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gZG9tLnRlbXBsYXRlSW5mbzsKICAgICAgICBpZiAodGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICB0ZW1wbGF0ZUluZm8ucHJldmlvdXNUZW1wbGF0ZUluZm8ubmV4dFRlbXBsYXRlSW5mbyA9CiAgICAgICAgICAgIHRlbXBsYXRlSW5mby5uZXh0VGVtcGxhdGVJbmZvOwogICAgICAgIH0KICAgICAgICBpZiAodGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm8pIHsKICAgICAgICAgIHRlbXBsYXRlSW5mby5uZXh0VGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvID0KICAgICAgICAgICAgdGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fX3RlbXBsYXRlSW5mb0xhc3QgPT0gdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICB0aGlzLl9fdGVtcGxhdGVJbmZvTGFzdCA9IHRlbXBsYXRlSW5mby5wcmV2aW91c1RlbXBsYXRlSW5mbzsKICAgICAgICB9CiAgICAgICAgdGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm8gPSBudWxsOwogICAgICAgIC8vIFJlbW92ZSBzdGFtcGVkIG5vZGVzCiAgICAgICAgbGV0IG5vZGVzID0gdGVtcGxhdGVJbmZvLmNoaWxkTm9kZXM7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgbm9kZSA9IG5vZGVzW2ldOwogICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBkZWZhdWx0IGBUZW1wbGF0ZVN0YW1wYCBpbXBsZW1lbnRhdGlvbiB0byBhZGQgc3VwcG9ydCBmb3IKICAgICAgICogcGFyc2luZyBiaW5kaW5ncyBmcm9tIGBUZXh0Tm9kZWAncycgYHRleHRDb250ZW50YC4gIEEgYGJpbmRpbmdzYAogICAgICAgKiBhcnJheSBpcyBhZGRlZCB0byBgbm9kZUluZm9gIGFuZCBwb3B1bGF0ZWQgd2l0aCBiaW5kaW5nIG1ldGFkYXRhCiAgICAgICAqIHdpdGggaW5mb3JtYXRpb24gY2FwdHVyaW5nIHRoZSBiaW5kaW5nIHRhcmdldCwgYW5kIGEgYHBhcnRzYCBhcnJheQogICAgICAgKiB3aXRoIG9uZSBvciBtb3JlIG1ldGFkYXRhIG9iamVjdHMgY2FwdHVyaW5nIHRoZSBzb3VyY2Uocykgb2YgdGhlCiAgICAgICAqIGJpbmRpbmcuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUgbm9kZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IEludGVyZmFjZXMgaW4gY2xvc3VyZSBkbyBub3QgaW5oZXJpdCBzdGF0aWNzLCBidXQgY2xhc3NlcyBkbwogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgbGV0IG5vdGVkID0gc3VwZXIuX3BhcnNlVGVtcGxhdGVOb2RlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pOwogICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgbGV0IHBhcnRzID0gdGhpcy5fcGFyc2VCaW5kaW5ncyhub2RlLnRleHRDb250ZW50LCB0ZW1wbGF0ZUluZm8pOwogICAgICAgICAgaWYgKHBhcnRzKSB7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHRleHRDb250ZW50IHdpdGggYW55IGxpdGVyYWwgcGFydHMKICAgICAgICAgICAgLy8gTk9URTogZGVmYXVsdCB0byBhIHNwYWNlIGhlcmUgc28gdGhlIHRleHROb2RlIHJlbWFpbnM7IHNvbWUgYnJvd3NlcnMKICAgICAgICAgICAgLy8gKElFKSBvbWl0IGFuIGVtcHR5IHRleHROb2RlIGZvbGxvd2luZyBjbG9uZU5vZGUvaW1wb3J0Tm9kZS4KICAgICAgICAgICAgbm9kZS50ZXh0Q29udGVudCA9IGxpdGVyYWxGcm9tUGFydHMocGFydHMpIHx8ICcgJzsKICAgICAgICAgICAgYWRkQmluZGluZyh0aGlzLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCAndGV4dCcsICd0ZXh0Q29udGVudCcsIHBhcnRzKTsKICAgICAgICAgICAgbm90ZWQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbm90ZWQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgZGVmYXVsdCBgVGVtcGxhdGVTdGFtcGAgaW1wbGVtZW50YXRpb24gdG8gYWRkIHN1cHBvcnQgZm9yCiAgICAgICAqIHBhcnNpbmcgYmluZGluZ3MgZnJvbSBhdHRyaWJ1dGVzLiAgQSBgYmluZGluZ3NgCiAgICAgICAqIGFycmF5IGlzIGFkZGVkIHRvIGBub2RlSW5mb2AgYW5kIHBvcHVsYXRlZCB3aXRoIGJpbmRpbmcgbWV0YWRhdGEKICAgICAgICogd2l0aCBpbmZvcm1hdGlvbiBjYXB0dXJpbmcgdGhlIGJpbmRpbmcgdGFyZ2V0LCBhbmQgYSBgcGFydHNgIGFycmF5CiAgICAgICAqIHdpdGggb25lIG9yIG1vcmUgbWV0YWRhdGEgb2JqZWN0cyBjYXB0dXJpbmcgdGhlIHNvdXJjZShzKSBvZiB0aGUKICAgICAgICogYmluZGluZy4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBOb2RlIHRvIHBhcnNlCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgICAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEF0dHJpYnV0ZSBuYW1lCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgbmFtZSwgdmFsdWUpIHsKICAgICAgICBsZXQgcGFydHMgPSB0aGlzLl9wYXJzZUJpbmRpbmdzKHZhbHVlLCB0ZW1wbGF0ZUluZm8pOwogICAgICAgIGlmIChwYXJ0cykgewogICAgICAgICAgLy8gQXR0cmlidXRlIG9yIHByb3BlcnR5CiAgICAgICAgICBsZXQgb3JpZ05hbWUgPSBuYW1lOwogICAgICAgICAgbGV0IGtpbmQgPSAncHJvcGVydHknOwogICAgICAgICAgLy8gVGhlIG9ubHkgd2F5IHdlIHNlZSBhIGNhcGl0YWwgbGV0dGVyIGhlcmUgaXMgaWYgdGhlIGF0dHIgaGFzCiAgICAgICAgICAvLyBhIGNhcGl0YWwgbGV0dGVyIGluIGl0IHBlciBzcGVjLiBJbiB0aGlzIGNhc2UsIHRvIG1ha2Ugc3VyZQogICAgICAgICAgLy8gdGhpcyBiaW5kaW5nIHdvcmtzLCB3ZSBnbyBhaGVhZCBhbmQgbWFrZSB0aGUgYmluZGluZyB0byB0aGUgYXR0cmlidXRlLgogICAgICAgICAgaWYgKGNhcGl0YWxBdHRyaWJ1dGVSZWdleC50ZXN0KG5hbWUpKSB7CiAgICAgICAgICAgIGtpbmQgPSAnYXR0cmlidXRlJzsKICAgICAgICAgIH0gZWxzZSBpZiAobmFtZVtuYW1lLmxlbmd0aC0xXSA9PSAnJCcpIHsKICAgICAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgLTEpOwogICAgICAgICAgICBraW5kID0gJ2F0dHJpYnV0ZSc7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBJbml0aWFsaXplIGF0dHJpYnV0ZSBiaW5kaW5ncyB3aXRoIGFueSBsaXRlcmFsIHBhcnRzCiAgICAgICAgICBsZXQgbGl0ZXJhbCA9IGxpdGVyYWxGcm9tUGFydHMocGFydHMpOwogICAgICAgICAgaWYgKGxpdGVyYWwgJiYga2luZCA9PSAnYXR0cmlidXRlJykgewogICAgICAgICAgICAvLyBFbnN1cmUgYSBTaGFkeUNTUyB0ZW1wbGF0ZSBzY29wZWQgc3R5bGUgaXMgbm90IHJlbW92ZWQKICAgICAgICAgICAgLy8gd2hlbiBhIGNsYXNzJCBiaW5kaW5nJ3MgaW5pdGlhbCBsaXRlcmFsIHZhbHVlIGlzIHNldC4KICAgICAgICAgICAgaWYgKG5hbWUgPT0gJ2NsYXNzJyAmJiBub2RlLmhhc0F0dHJpYnV0ZSgnY2xhc3MnKSkgewogICAgICAgICAgICAgIGxpdGVyYWwgKz0gJyAnICsgbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgbGl0ZXJhbCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBDbGVhciBhdHRyaWJ1dGUgYmVmb3JlIHJlbW92aW5nLCBzaW5jZSBJRSB3b24ndCBhbGxvdyByZW1vdmluZwogICAgICAgICAgLy8gYHZhbHVlYCBhdHRyaWJ1dGUgaWYgaXQgcHJldmlvdXNseSBoYWQgYSB2YWx1ZSAoY2FuJ3QKICAgICAgICAgIC8vIHVuY29uZGl0aW9uYWxseSBzZXQgJycgYmVmb3JlIHJlbW92aW5nIHNpbmNlIGF0dHJpYnV0ZXMgd2l0aCBgJGAKICAgICAgICAgIC8vIGNhbid0IGJlIHNldCB1c2luZyBzZXRBdHRyaWJ1dGUpCiAgICAgICAgICBpZiAobm9kZS5sb2NhbE5hbWUgPT09ICdpbnB1dCcgJiYgb3JpZ05hbWUgPT09ICd2YWx1ZScpIHsKICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUob3JpZ05hbWUsICcnKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFJlbW92ZSBhbm5vdGF0aW9uCiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShvcmlnTmFtZSk7CiAgICAgICAgICAvLyBDYXNlIGhhY2tlcnk6IGF0dHJpYnV0ZXMgYXJlIGxvd2VyLWNhc2UsIGJ1dCBiaW5kIHRhcmdldHMKICAgICAgICAgIC8vIChwcm9wZXJ0aWVzKSBhcmUgY2FzZSBzZW5zaXRpdmUuIEdhbWJpdCBpcyB0byBtYXAgZGFzaC1jYXNlIHRvCiAgICAgICAgICAvLyBjYW1lbC1jYXNlOiBgZm9vLWJhcmAgYmVjb21lcyBgZm9vQmFyYC4KICAgICAgICAgIC8vIEF0dHJpYnV0ZSBiaW5kaW5ncyBhcmUgZXhjZXB0ZWQuCiAgICAgICAgICBpZiAoa2luZCA9PT0gJ3Byb3BlcnR5JykgewogICAgICAgICAgICBuYW1lID0gUG9seW1lci5DYXNlTWFwLmRhc2hUb0NhbWVsQ2FzZShuYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIGFkZEJpbmRpbmcodGhpcywgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywga2luZCwgbmFtZSwgcGFydHMsIGxpdGVyYWwpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBzdXBlci5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgbmFtZSwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBkZWZhdWx0IGBUZW1wbGF0ZVN0YW1wYCBpbXBsZW1lbnRhdGlvbiB0byBhZGQgc3VwcG9ydCBmb3IKICAgICAgICogYmluZGluZyB0aGUgcHJvcGVydGllcyB0aGF0IGEgbmVzdGVkIHRlbXBsYXRlIGRlcGVuZHMgb24gdG8gdGhlIHRlbXBsYXRlCiAgICAgICAqIGFzIGBfaG9zdF88cHJvcGVydHk+YC4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIHBhcnNlCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgICAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmlzaXRlZCBub2RlIGFkZGVkIG5vZGUtc3BlY2lmaWMKICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gSW50ZXJmYWNlcyBpbiBjbG9zdXJlIGRvIG5vdCBpbmhlcml0IHN0YXRpY3MsIGJ1dCBjbGFzc2VzIGRvCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgbGV0IG5vdGVkID0gc3VwZXIuX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKTsKICAgICAgICAvLyBNZXJnZSBob3N0IHByb3BzIGludG8gb3V0ZXIgdGVtcGxhdGUgYW5kIGFkZCBiaW5kaW5ncwogICAgICAgIGxldCBob3N0UHJvcHMgPSBub2RlSW5mby50ZW1wbGF0ZUluZm8uaG9zdFByb3BzOwogICAgICAgIGxldCBtb2RlID0gJ3snOwogICAgICAgIGZvciAobGV0IHNvdXJjZSBpbiBob3N0UHJvcHMpIHsKICAgICAgICAgIGxldCBwYXJ0cyA9IFt7IG1vZGUsIHNvdXJjZSwgZGVwZW5kZW5jaWVzOiBbc291cmNlXSB9XTsKICAgICAgICAgIGFkZEJpbmRpbmcodGhpcywgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgJ3Byb3BlcnR5JywgJ19ob3N0XycgKyBzb3VyY2UsIHBhcnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vdGVkOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIHRvIHBhcnNlIHRleHQgaW4gYSB0ZW1wbGF0ZSAoZWl0aGVyIGF0dHJpYnV0ZSB2YWx1ZXMgb3IKICAgICAgICogdGV4dENvbnRlbnQpIGludG8gYmluZGluZyBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQW55IG92ZXJyaWRlcyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIGFycmF5IG9mIGJpbmRpbmcgcGFydAogICAgICAgKiBtZXRhZGF0YSAgcmVwcmVzZW50aW5nIG9uZSBvciBtb3JlIGJpbmRpbmdzIGZvdW5kIGluIHRoZSBwcm92aWRlZCB0ZXh0CiAgICAgICAqIGFuZCBhbnkgImxpdGVyYWwiIHRleHQgaW4gYmV0d2Vlbi4gIEFueSBub24tbGl0ZXJhbCBwYXJ0cyB3aWxsIGJlIHBhc3NlZAogICAgICAgKiB0byBgX2V2YWx1YXRlQmluZGluZ2Agd2hlbiBhbnkgZGVwZW5kZW5jaWVzIGNoYW5nZS4gIFRoZSBvbmx5IHJlcXVpcmVkCiAgICAgICAqIGZpZWxkcyBvZiBlYWNoICJwYXJ0IiBpbiB0aGUgcmV0dXJuZWQgYXJyYXkgYXJlIGFzIGZvbGxvd3M6CiAgICAgICAqCiAgICAgICAqIC0gYGRlcGVuZGVuY2llc2AgLSBBcnJheSBjb250YWluaW5nIHRyaWdnZXIgbWV0YWRhdGEgZm9yIGVhY2ggcHJvcGVydHkKICAgICAgICogICB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBiaW5kaW5nIHRvIHVwZGF0ZQogICAgICAgKiAtIGBsaXRlcmFsYCAtIFN0cmluZyBjb250YWluaW5nIHRleHQgaWYgdGhlIHBhcnQgcmVwcmVzZW50cyBhIGxpdGVyYWw7CiAgICAgICAqICAgaW4gdGhpcyBjYXNlIG5vIGBkZXBlbmRlbmNpZXNgIGFyZSBuZWVkZWQKICAgICAgICoKICAgICAgICogQWRkaXRpb25hbCBtZXRhZGF0YSBmb3IgdXNlIGJ5IGBfZXZhbHVhdGVCaW5kaW5nYCBtYXkgYmUgcHJvdmlkZWQgaW4KICAgICAgICogZWFjaCBwYXJ0IG9iamVjdCBhcyBuZWVkZWQuCiAgICAgICAqCiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGhhbmRsZXMgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBiaW5kaW5ncwogICAgICAgKiAob25lIG9yIG1vcmUgbWF5IGJlIGludGVybWl4ZWQgd2l0aCBsaXRlcmFsIHN0cmluZ3MpOgogICAgICAgKiAtIFByb3BlcnR5IGJpbmRpbmc6IGBbW3Byb3BdXWAKICAgICAgICogLSBQYXRoIGJpbmRpbmc6IGBbW29iamVjdC5wcm9wXV1gCiAgICAgICAqIC0gTmVnYXRlZCBwcm9wZXJ0eSBvciBwYXRoIGJpbmRpbmdzOiBgW1shcHJvcF1dYCBvciBgW1shb2JqZWN0LnByb3BdXWAKICAgICAgICogLSBUd28td2F5IHByb3BlcnR5IG9yIHBhdGggYmluZGluZ3MgKHN1cHBvcnRzIG5lZ2F0aW9uKToKICAgICAgICogICBge3twcm9wfX1gLCBge3tvYmplY3QucHJvcH19YCwgYHt7IXByb3B9fWAgb3IgYHt7IW9iamVjdC5wcm9wfX1gCiAgICAgICAqIC0gSW5saW5lIGNvbXB1dGVkIG1ldGhvZCAoc3VwcG9ydHMgbmVnYXRpb24pOgogICAgICAgKiAgIGBbW2NvbXB1dGUoYSwgJ2xpdGVyYWwnLCBiKV1dYCwgYFtbIWNvbXB1dGUoYSwgJ2xpdGVyYWwnLCBiKV1dYAogICAgICAgKgogICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgcmVndWxhciBleHByZXNzaW9uIGZvciBiZXN0CiAgICAgICAqIHBlcmZvcm1hbmNlLiBIb3dldmVyLCB0aGUgcmVndWxhciBleHByZXNzaW9uIHVzZXMgYSB3aGl0ZS1saXN0IG9mCiAgICAgICAqIGFsbG93ZWQgY2hhcmFjdGVycyBpbiBhIGRhdGEtYmluZGluZywgd2hpY2ggY2F1c2VzIHByb2JsZW1zIGZvcgogICAgICAgKiBkYXRhLWJpbmRpbmdzIHRoYXQgZG8gdXNlIGNoYXJhY3RlcnMgbm90IGluIHRoaXMgd2hpdGUtbGlzdC4KICAgICAgICoKICAgICAgICogSW5zdGVhZCBvZiB1cGRhdGluZyB0aGUgd2hpdGUtbGlzdCB3aXRoIGFsbCBhbGxvd2VkIGNoYXJhY3RlcnMsCiAgICAgICAqIHRoZXJlIGlzIGEgU3RyaWN0QmluZGluZ1BhcnNlciAoc2VlIGxpYi9taXhpbnMvc3RyaWN0LWJpbmRpbmctcGFyc2VyKQogICAgICAgKiB0aGF0IHVzZXMgYSBzdGF0ZSBtYWNoaW5lIGluc3RlYWQuIFRoaXMgc3RhdGUgbWFjaGluZSBpcyBhYmxlIHRvIGhhbmRsZQogICAgICAgKiBhbGwgY2hhcmFjdGVycy4gSG93ZXZlciwgaXQgaXMgc2xpZ2h0bHkgbGVzcyBwZXJmb3JtYW50LCB0aGVyZWZvcmUgd2UKICAgICAgICogZXh0cmFjdGVkIGl0IGludG8gYSBzZXBhcmF0ZSBvcHRpb25hbCBtaXhpbi4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGV4dCB0byBwYXJzZSBmcm9tIGF0dHJpYnV0ZSBvciB0ZXh0Q29udGVudAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gdGVtcGxhdGVJbmZvIEN1cnJlbnQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogQHJldHVybiB7QXJyYXk8IUJpbmRpbmdQYXJ0Pn0gQXJyYXkgb2YgYmluZGluZyBwYXJ0IG1ldGFkYXRhCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VCaW5kaW5ncyh0ZXh0LCB0ZW1wbGF0ZUluZm8pIHsKICAgICAgICBsZXQgcGFydHMgPSBbXTsKICAgICAgICBsZXQgbGFzdEluZGV4ID0gMDsKICAgICAgICBsZXQgbTsKICAgICAgICAvLyBFeGFtcGxlOiAibGl0ZXJhbDF7e3Byb3B9fWxpdGVyYWwyW1shY29tcHV0ZShmb28sYmFyKV1dZmluYWwiCiAgICAgICAgLy8gUmVnZXggbWF0Y2hlczoKICAgICAgICAvLyAgICAgICAgSXRlcmF0aW9uIDE6ICBJdGVyYXRpb24gMjoKICAgICAgICAvLyBtWzFdOiAne3snICAgICAgICAgICdbWycKICAgICAgICAvLyBtWzJdOiAnJyAgICAgICAgICAgICchJwogICAgICAgIC8vIG1bM106ICdwcm9wJyAgICAgICAgJ2NvbXB1dGUoZm9vLGJhciknCiAgICAgICAgd2hpbGUgKChtID0gYmluZGluZ1JlZ2V4LmV4ZWModGV4dCkpICE9PSBudWxsKSB7CiAgICAgICAgICAvLyBBZGQgbGl0ZXJhbCBwYXJ0CiAgICAgICAgICBpZiAobS5pbmRleCA+IGxhc3RJbmRleCkgewogICAgICAgICAgICBwYXJ0cy5wdXNoKHtsaXRlcmFsOiB0ZXh0LnNsaWNlKGxhc3RJbmRleCwgbS5pbmRleCl9KTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEFkZCBiaW5kaW5nIHBhcnQKICAgICAgICAgIGxldCBtb2RlID0gbVsxXVswXTsKICAgICAgICAgIGxldCBuZWdhdGUgPSBCb29sZWFuKG1bMl0pOwogICAgICAgICAgbGV0IHNvdXJjZSA9IG1bM10udHJpbSgpOwogICAgICAgICAgbGV0IGN1c3RvbUV2ZW50ID0gZmFsc2UsIG5vdGlmeUV2ZW50ID0gJycsIGNvbG9uID0gLTE7CiAgICAgICAgICBpZiAobW9kZSA9PSAneycgJiYgKGNvbG9uID0gc291cmNlLmluZGV4T2YoJzo6JykpID4gMCkgewogICAgICAgICAgICBub3RpZnlFdmVudCA9IHNvdXJjZS5zdWJzdHJpbmcoY29sb24gKyAyKTsKICAgICAgICAgICAgc291cmNlID0gc291cmNlLnN1YnN0cmluZygwLCBjb2xvbik7CiAgICAgICAgICAgIGN1c3RvbUV2ZW50ID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGxldCBzaWduYXR1cmUgPSBwYXJzZU1ldGhvZChzb3VyY2UpOwogICAgICAgICAgbGV0IGRlcGVuZGVuY2llcyA9IFtdOwogICAgICAgICAgaWYgKHNpZ25hdHVyZSkgewogICAgICAgICAgICAvLyBJbmxpbmUgY29tcHV0ZWQgZnVuY3Rpb24KICAgICAgICAgICAgbGV0IHthcmdzLCBtZXRob2ROYW1lfSA9IHNpZ25hdHVyZTsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpPGFyZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsZXQgYXJnID0gYXJnc1tpXTsKICAgICAgICAgICAgICBpZiAoIWFyZy5saXRlcmFsKSB7CiAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChhcmcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgZHluYW1pY0ZucyA9IHRlbXBsYXRlSW5mby5keW5hbWljRm5zOwogICAgICAgICAgICBpZiAoZHluYW1pY0ZucyAmJiBkeW5hbWljRm5zW21ldGhvZE5hbWVdIHx8IHNpZ25hdHVyZS5zdGF0aWMpIHsKICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChtZXRob2ROYW1lKTsKICAgICAgICAgICAgICBzaWduYXR1cmUuZHluYW1pY0ZuID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gUHJvcGVydHkgb3IgcGF0aAogICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChzb3VyY2UpOwogICAgICAgICAgfQogICAgICAgICAgcGFydHMucHVzaCh7CiAgICAgICAgICAgIHNvdXJjZSwgbW9kZSwgbmVnYXRlLCBjdXN0b21FdmVudCwgc2lnbmF0dXJlLCBkZXBlbmRlbmNpZXMsCiAgICAgICAgICAgIGV2ZW50OiBub3RpZnlFdmVudAogICAgICAgICAgfSk7CiAgICAgICAgICBsYXN0SW5kZXggPSBiaW5kaW5nUmVnZXgubGFzdEluZGV4OwogICAgICAgIH0KICAgICAgICAvLyBBZGQgYSBmaW5hbCBsaXRlcmFsIHBhcnQKICAgICAgICBpZiAobGFzdEluZGV4ICYmIGxhc3RJbmRleCA8IHRleHQubGVuZ3RoKSB7CiAgICAgICAgICBsZXQgbGl0ZXJhbCA9IHRleHQuc3Vic3RyaW5nKGxhc3RJbmRleCk7CiAgICAgICAgICBpZiAobGl0ZXJhbCkgewogICAgICAgICAgICBwYXJ0cy5wdXNoKHsKICAgICAgICAgICAgICBsaXRlcmFsOiBsaXRlcmFsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocGFydHMubGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gcGFydHM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCB0byBldmFsdWF0ZSBhIHByZXZpb3VzbHkgcGFyc2VkIGJpbmRpbmcgcGFydCBiYXNlZCBvbiBhIHNldCBvZgogICAgICAgKiBvbmUgb3IgbW9yZSBjaGFuZ2VkIGRlcGVuZGVuY2llcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHt0aGlzfSBpbnN0IEVsZW1lbnQgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBzY29wZSBmb3IKICAgICAgICogICBiaW5kaW5nIGRlcGVuZGVuY2llcwogICAgICAgKiBAcGFyYW0ge0JpbmRpbmdQYXJ0fSBwYXJ0IEJpbmRpbmcgcGFydCBtZXRhZGF0YQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQcm9wZXJ0eS9wYXRoIHRoYXQgdHJpZ2dlcmVkIHRoaXMgZWZmZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgICAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAgICAgKiBAcmV0dXJuIHsqfSBWYWx1ZSB0aGUgYmluZGluZyBwYXJ0IGV2YWx1YXRlZCB0bwogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgX2V2YWx1YXRlQmluZGluZyhpbnN0LCBwYXJ0LCBwYXRoLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKSB7CiAgICAgICAgbGV0IHZhbHVlOwogICAgICAgIGlmIChwYXJ0LnNpZ25hdHVyZSkgewogICAgICAgICAgdmFsdWUgPSBydW5NZXRob2RFZmZlY3QoaW5zdCwgcGF0aCwgcHJvcHMsIG9sZFByb3BzLCBwYXJ0LnNpZ25hdHVyZSk7CiAgICAgICAgfSBlbHNlIGlmIChwYXRoICE9IHBhcnQuc291cmNlKSB7CiAgICAgICAgICB2YWx1ZSA9IFBvbHltZXIuUGF0aC5nZXQoaW5zdCwgcGFydC5zb3VyY2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaGFzUGF0aHMgJiYgUG9seW1lci5QYXRoLmlzUGF0aChwYXRoKSkgewogICAgICAgICAgICB2YWx1ZSA9IFBvbHltZXIuUGF0aC5nZXQoaW5zdCwgcGF0aCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YWx1ZSA9IGluc3QuX19kYXRhW3BhdGhdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocGFydC5uZWdhdGUpIHsKICAgICAgICAgIHZhbHVlID0gIXZhbHVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0KCiAgICB9CgogICAgLy8gbWFrZSBhIHR5cGluZyBmb3IgY2xvc3VyZSA6UAogICAgUHJvcGVydHlFZmZlY3RzVHlwZSA9IFByb3BlcnR5RWZmZWN0czsKCiAgICByZXR1cm4gUHJvcGVydHlFZmZlY3RzOwogIH0pOwoKICAvKioKICAgKiBIZWxwZXIgYXBpIGZvciBlbnF1ZXVpbmcgY2xpZW50IGRvbSBjcmVhdGVkIGJ5IGEgaG9zdCBlbGVtZW50LgogICAqCiAgICogQnkgZGVmYXVsdCBlbGVtZW50cyBhcmUgZmx1c2hlZCB2aWEgYF9mbHVzaFByb3BlcnRpZXNgIHdoZW4KICAgKiBgY29ubmVjdGVkQ2FsbGJhY2tgIGlzIGNhbGxlZC4gRWxlbWVudHMgYXR0YWNoIHRoZWlyIGNsaWVudCBkb20gdG8KICAgKiB0aGVtc2VsdmVzIGF0IGByZWFkeWAgdGltZSB3aGljaCByZXN1bHRzIGZyb20gdGhpcyBmaXJzdCBmbHVzaC4KICAgKiBUaGlzIHByb3ZpZGVzIGFuIG9yZGVyaW5nIGd1YXJhbnRlZSB0aGF0IHRoZSBjbGllbnQgZG9tIGFuIGVsZW1lbnQKICAgKiBjcmVhdGVzIGlzIGZsdXNoZWQgYmVmb3JlIHRoZSBlbGVtZW50IGl0c2VsZiAoaS5lLiBjbGllbnQgYHJlYWR5YAogICAqIGZpcmVzIGJlZm9yZSBob3N0IGByZWFkeWApLgogICAqCiAgICogSG93ZXZlciwgaWYgYF9mbHVzaFByb3BlcnRpZXNgIGlzIGNhbGxlZCAqYmVmb3JlKiBhbiBlbGVtZW50IGlzIGNvbm5lY3RlZCwKICAgKiBhcyBmb3IgZXhhbXBsZSBgVGVtcGxhdGl6ZWAgZG9lcywgdGhpcyBvcmRlcmluZyBndWFyYW50ZWUgY2Fubm90IGJlCiAgICogc2F0aXNmaWVkIGJlY2F1c2Ugbm8gZWxlbWVudHMgYXJlIGNvbm5lY3RlZC4gKE5vdGU6IEJvdW5kIGVsZW1lbnRzIHRoYXQKICAgKiByZWNlaXZlIGRhdGEgZG8gYmVjb21lIGVucXVldWVkIGNsaWVudHMgYW5kIGFyZSBwcm9wZXJseSBvcmRlcmVkIGJ1dAogICAqIHVuYm91bmQgZWxlbWVudHMgYXJlIG5vdC4pCiAgICoKICAgKiBUbyBtYWludGFpbiB0aGUgZGVzaXJlZCAiY2xpZW50IGJlZm9yZSBob3N0IiBvcmRlcmluZyBndWFyYW50ZWUgZm9yIHRoaXMKICAgKiBjYXNlIHdlIHJlbHkgb24gdGhlICJob3N0IHN0YWNrLiBDbGllbnQgbm9kZXMgcmVnaXN0ZXJzIHRoZW1zZWx2ZXMgd2l0aAogICAqIHRoZSBjcmVhdGluZyBob3N0IGVsZW1lbnQgd2hlbiBjcmVhdGVkLiBUaGlzIGVuc3VyZXMgdGhhdCBhbGwgY2xpZW50IGRvbQogICAqIGlzIHJlYWRpZWQgaW4gdGhlIHByb3BlciBvcmRlciwgbWFpbnRhaW5pbmcgdGhlIGRlc2lyZWQgZ3VhcmFudGVlLgogICAqCiAgICogQHByaXZhdGUKICAgKi8KICBsZXQgaG9zdFN0YWNrID0gewoKICAgIHN0YWNrOiBbXSwKCiAgICAvKioKICAgICAqIEBwYXJhbSB7Kn0gaW5zdCBJbnN0YW5jZSB0byBhZGQgdG8gaG9zdFN0YWNrCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHRoaXMge2hvc3RTdGFja30KICAgICAqLwogICAgcmVnaXN0ZXJIb3N0KGluc3QpIHsKICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoKSB7CiAgICAgICAgbGV0IGhvc3QgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdOwogICAgICAgIGhvc3QuX2VucXVldWVDbGllbnQoaW5zdCk7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IGluc3QgSW5zdGFuY2UgdG8gYmVnaW4gaG9zdGluZwogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEB0aGlzIHtob3N0U3RhY2t9CiAgICAgKi8KICAgIGJlZ2luSG9zdGluZyhpbnN0KSB7CiAgICAgIHRoaXMuc3RhY2sucHVzaChpbnN0KTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IGluc3QgSW5zdGFuY2UgdG8gZW5kIGhvc3RpbmcKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7aG9zdFN0YWNrfQogICAgICovCiAgICBlbmRIb3N0aW5nKGluc3QpIHsKICAgICAgbGV0IHN0YWNrTGVuID0gdGhpcy5zdGFjay5sZW5ndGg7CiAgICAgIGlmIChzdGFja0xlbiAmJiB0aGlzLnN0YWNrW3N0YWNrTGVuLTFdID09IGluc3QpIHsKICAgICAgICB0aGlzLnN0YWNrLnBvcCgpOwogICAgICB9CiAgICB9CgogIH07Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIFByb3ZpZGVzIGJhc2ljIHRyYWNraW5nIG9mIGVsZW1lbnQgZGVmaW5pdGlvbnMgKHJlZ2lzdHJhdGlvbnMpIGFuZAogICAqIGluc3RhbmNlIGNvdW50cy4KICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAc3VtbWFyeSBQcm92aWRlcyBiYXNpYyB0cmFja2luZyBvZiBlbGVtZW50IGRlZmluaXRpb25zIChyZWdpc3RyYXRpb25zKSBhbmQKICAgKiBpbnN0YW5jZSBjb3VudHMuCiAgICovCiAgUG9seW1lci50ZWxlbWV0cnkgPSB7CiAgICAvKioKICAgICAqIFRvdGFsIG51bWJlciBvZiBQb2x5bWVyIGVsZW1lbnQgaW5zdGFuY2VzIGNyZWF0ZWQuCiAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICovCiAgICBpbnN0YW5jZUNvdW50OiAwLAogICAgLyoqCiAgICAgKiBBcnJheSBvZiBQb2x5bWVyIGVsZW1lbnQgY2xhc3NlcyB0aGF0IGhhdmUgYmVlbiBmaW5hbGl6ZWQuCiAgICAgKiBAdHlwZSB7QXJyYXk8UG9seW1lci5FbGVtZW50Pn0KICAgICAqLwogICAgcmVnaXN0cmF0aW9uczogW10sCiAgICAvKioKICAgICAqIEBwYXJhbSB7IVBvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9IHByb3RvdHlwZSBFbGVtZW50IHByb3RvdHlwZSB0byBsb2cKICAgICAqIEB0aGlzIHt0aGlzfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3JlZ0xvZzogZnVuY3Rpb24ocHJvdG90eXBlKSB7CiAgICAgIGNvbnNvbGUubG9nKCdbJyArIHByb3RvdHlwZS5pcyArICddOiByZWdpc3RlcmVkJyk7CiAgICB9LAogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgYSBjbGFzcyBwcm90b3R5cGUgZm9yIHRlbGVtZXRyeSBwdXJwb3Nlcy4KICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHByb3RvdHlwZSBFbGVtZW50IHByb3RvdHlwZSB0byByZWdpc3RlcgogICAgICogQHRoaXMge3RoaXN9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihwcm90b3R5cGUpIHsKICAgICAgdGhpcy5yZWdpc3RyYXRpb25zLnB1c2gocHJvdG90eXBlKTsKICAgICAgUG9seW1lci5sb2cgJiYgdGhpcy5fcmVnTG9nKHByb3RvdHlwZSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBMb2dzIGFsbCBlbGVtZW50cyByZWdpc3RlcmVkIHdpdGggYW4gYGlzYCB0byB0aGUgY29uc29sZS4KICAgICAqIEBwdWJsaWMKICAgICAqIEB0aGlzIHt0aGlzfQogICAgICovCiAgICBkdW1wUmVnaXN0cmF0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMucmVnaXN0cmF0aW9ucy5mb3JFYWNoKHRoaXMuX3JlZ0xvZyk7CiAgICB9CiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGNvcHkgb2YgYHByb3BzYCB3aXRoIGVhY2ggcHJvcGVydHkgbm9ybWFsaXplZCBzdWNoIHRoYXQKICAgKiB1cGdyYWRlZCBpdCBpcyBhbiBvYmplY3Qgd2l0aCBhdCBsZWFzdCBhIHR5cGUgcHJvcGVydHkgeyB0eXBlOiBUeXBlfS4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBQcm9wZXJ0aWVzIHRvIG5vcm1hbGl6ZQogICAqIEByZXR1cm4ge09iamVjdH0gQ29weSBvZiBpbnB1dCBgcHJvcHNgIHdpdGggbm9ybWFsaXplZCBwcm9wZXJ0aWVzIHRoYXQKICAgKiBhcmUgaW4gdGhlIGZvcm0ge3R5cGU6IFR5cGV9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBub3JtYWxpemVQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICBjb25zdCBvdXRwdXQgPSB7fTsKICAgIGZvciAobGV0IHAgaW4gcHJvcHMpIHsKICAgICAgY29uc3QgbyA9IHByb3BzW3BdOwogICAgICBvdXRwdXRbcF0gPSAodHlwZW9mIG8gPT09ICdmdW5jdGlvbicpID8ge3R5cGU6IG99IDogbzsKICAgIH0KICAgIHJldHVybiBvdXRwdXQ7CiAgfQoKICAvKioKICAgKiBNaXhpbiB0aGF0IHByb3ZpZGVzIGEgbWluaW1hbCBzdGFydGluZyBwb2ludCB0byB1c2luZyB0aGUgUHJvcGVydGllc0NoYW5nZWQKICAgKiBtaXhpbiBieSBwcm92aWRpbmcgYSBtZWNoYW5pc20gdG8gZGVjbGFyZSBwcm9wZXJ0aWVzIGluIGEgc3RhdGljCiAgICogZ2V0dGVyIChlLmcuIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsgcmV0dXJuIHsgZm9vOiBTdHJpbmcgfSB9KS4gQ2hhbmdlcwogICAqIGFyZSByZXBvcnRlZCB2aWEgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIG1ldGhvZC4KICAgKgogICAqIFRoaXMgbWl4aW4gcHJvdmlkZXMgbm8gc3BlY2lmaWMgc3VwcG9ydCBmb3IgcmVuZGVyaW5nLiBVc2VycyBhcmUgZXhwZWN0ZWQKICAgKiB0byBjcmVhdGUgYSBTaGFkb3dSb290IGFuZCBwdXQgY29udGVudCBpbnRvIGl0IGFuZCB1cGRhdGUgaXQgaW4gd2hhdGV2ZXIKICAgKiB3YXkgbWFrZXMgc2Vuc2UuIFRoaXMgY2FuIGJlIGRvbmUgaW4gcmVhY3Rpb24gdG8gcHJvcGVydGllcyBjaGFuZ2luZyBieQogICAqIGltcGxlbWVudGluZyBgX3Byb3BlcnRpZXNDaGFuZ2VkYC4KICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydGllc0NoYW5nZWQKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1peGluIHRoYXQgcHJvdmlkZXMgYSBtaW5pbWFsIHN0YXJ0aW5nIHBvaW50IGZvciB1c2luZwogICAqIHRoZSBQcm9wZXJ0aWVzQ2hhbmdlZCBtaXhpbiBieSBwcm92aWRpbmcgYSBkZWNsYXJhdGl2ZSBgcHJvcGVydGllc2Agb2JqZWN0LgogICAqLwogICBQb2x5bWVyLlByb3BlcnRpZXNNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzQ2hhbmdlZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IGJhc2UgPSBQb2x5bWVyLlByb3BlcnRpZXNDaGFuZ2VkKHN1cGVyQ2xhc3MpOwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgc3VwZXIgY2xhc3MgY29uc3RydWN0b3IgZm9yIHRoZSBnaXZlbiBjbGFzcywgaWYgaXQgaXMgYW4KICAgICAqIGluc3RhbmNlIG9mIHRoZSBQcm9wZXJ0aWVzTWl4aW4uCiAgICAgKgogICAgICogQHBhcmFtIHshUHJvcGVydGllc01peGluQ29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIFByb3BlcnRpZXNNaXhpbiBjb25zdHJ1Y3RvcgogICAgICogQHJldHVybiB7UHJvcGVydGllc01peGluQ29uc3RydWN0b3J9IFN1cGVyIGNsYXNzIGNvbnN0cnVjdG9yCiAgICAgKi8KICAgIGZ1bmN0aW9uIHN1cGVyUHJvcGVydGllc0NsYXNzKGNvbnN0cnVjdG9yKSB7CiAgICAgIGNvbnN0IHN1cGVyQ3RvciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjb25zdHJ1Y3Rvcik7CgogICAgICAvLyBOb3RlLCB0aGUgYFByb3BlcnRpZXNNaXhpbmAgY2xhc3MgYmVsb3cgb25seSByZWZlcnMgdG8gdGhlIGNsYXNzCiAgICAgIC8vIGdlbmVyYXRlZCBieSB0aGlzIGNhbGwgdG8gdGhlIG1peGluOyB0aGUgaW5zdGFuY2VvZiB0ZXN0IG9ubHkgd29ya3MKICAgICAgLy8gYmVjYXVzZSB0aGUgbWl4aW4gaXMgZGVkdXBlZCBhbmQgZ3VhcmFudGVlZCBvbmx5IHRvIGFwcGx5IG9uY2UsIGhlbmNlCiAgICAgIC8vIGFsbCBjb25zdHJ1Y3RvcnMgaW4gYSBwcm90byBjaGFpbiB3aWxsIHNlZSB0aGUgc2FtZSBgUHJvcGVydGllc01peGluYAogICAgICByZXR1cm4gKHN1cGVyQ3Rvci5wcm90b3R5cGUgaW5zdGFuY2VvZiBQcm9wZXJ0aWVzTWl4aW4pID8KICAgICAgICAvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyAoc3VwZXJDdG9yKSA6IG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbWVtb2l6ZWQgdmVyc2lvbiBvZiB0aGUgYHByb3BlcnRpZXNgIG9iamVjdCBmb3IgdGhlCiAgICAgKiBnaXZlbiBjbGFzcy4gUHJvcGVydGllcyBub3QgaW4gb2JqZWN0IGZvcm1hdCBhcmUgY29udmVydGVkIHRvIGF0CiAgICAgKiBsZWFzdCB7dHlwZX0uCiAgICAgKgogICAgICogQHBhcmFtIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gY29uc3RydWN0b3IgUHJvcGVydGllc01peGluIGNvbnN0cnVjdG9yCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IE1lbW9pemVkIHByb3BlcnRpZXMgb2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIG93blByb3BlcnRpZXMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX293blByb3BlcnRpZXMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgbGV0IHByb3BzID0gbnVsbDsKCiAgICAgICAgaWYgKGNvbnN0cnVjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ3Byb3BlcnRpZXMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gY29uc3RydWN0b3IucHJvcGVydGllczsKICAgICAgICAgIAogICAgICAgICAgaWYgKHByb3BlcnRpZXMpIHsKICAgICAgICAgICAgcHJvcHMgPSBub3JtYWxpemVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY29uc3RydWN0b3IuX19vd25Qcm9wZXJ0aWVzID0gcHJvcHM7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLl9fb3duUHJvcGVydGllczsKICAgIH0KCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzTWl4aW59CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIFByb3BlcnRpZXNNaXhpbiBleHRlbmRzIGJhc2UgewoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgc3RhbmRhcmQgY3VzdG9tIGVsZW1lbnRzIGdldHRlciB0byBvYnNlcnZlcyB0aGUgYXR0cmlidXRlcwogICAgICAgKiBsaXN0ZWQgaW4gYHByb3BlcnRpZXNgLgogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgewogICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eSgnX19vYnNlcnZlZEF0dHJpYnV0ZXMnKSkgewogICAgICAgICAgUG9seW1lci50ZWxlbWV0cnkucmVnaXN0ZXIodGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLl9wcm9wZXJ0aWVzOwogICAgICAgICAgdGhpcy5fX29ic2VydmVkQXR0cmlidXRlcyA9IHByb3BzID8gT2JqZWN0LmtleXMocHJvcHMpLm1hcChwID0+IHRoaXMuYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHApKSA6IFtdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fX29ic2VydmVkQXR0cmlidXRlczsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZpbmFsaXplcyBhbiBlbGVtZW50IGRlZmluaXRpb24sIGluY2x1ZGluZyBlbnN1cmluZyBhbnkgc3VwZXIgY2xhc3NlcwogICAgICAgKiBhcmUgYWxzbyBmaW5hbGl6ZWQuIFRoaXMgaW5jbHVkZXMgZW5zdXJpbmcgcHJvcGVydHkKICAgICAgICogYWNjZXNzb3JzIGV4aXN0IG9uIHRoZSBlbGVtZW50IHByb3RvdHlwZS4gVGhpcyBtZXRob2QgY2FsbHMKICAgICAgICogYF9maW5hbGl6ZUNsYXNzYCB0byBmaW5hbGl6ZSBlYWNoIGNvbnN0cnVjdG9yIGluIHRoZSBwcm90b3R5cGUgY2hhaW4uCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzdGF0aWMgZmluYWxpemUoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19fZmluYWxpemVkJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBzdXBlckN0b3IgPSBzdXBlclByb3BlcnRpZXNDbGFzcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgICBpZiAoc3VwZXJDdG9yKSB7CiAgICAgICAgICAgIHN1cGVyQ3Rvci5maW5hbGl6ZSgpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fX2ZpbmFsaXplZCA9IHRydWU7CiAgICAgICAgICB0aGlzLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRmluYWxpemUgYW4gZWxlbWVudCBjbGFzcy4gVGhpcyBpbmNsdWRlcyBlbnN1cmluZyBwcm9wZXJ0eQogICAgICAgKiBhY2Nlc3NvcnMgZXhpc3Qgb24gdGhlIGVsZW1lbnQgcHJvdG90eXBlLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkKICAgICAgICogYGZpbmFsaXplYCBhbmQgZmluYWxpemVzIHRoZSBjbGFzcyBjb25zdHJ1Y3Rvci4KICAgICAgICoKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIF9maW5hbGl6ZUNsYXNzKCkgewogICAgICAgIGNvbnN0IHByb3BzID0gb3duUHJvcGVydGllcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnRpZXMocHJvcHMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBtZW1vaXplZCB2ZXJzaW9uIG9mIGFsbCBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcgdGhvc2UgaW5oZXJpdGVkCiAgICAgICAqIGZyb20gc3VwZXIgY2xhc3Nlcy4gUHJvcGVydGllcyBub3QgaW4gb2JqZWN0IGZvcm1hdCBhcmUgY29udmVydGVkIHRvCiAgICAgICAqIGF0IGxlYXN0IHt0eXBlfS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7T2JqZWN0fSBPYmplY3QgY29udGFpbmluZyBwcm9wZXJ0aWVzIGZvciB0aGlzIGNsYXNzCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBnZXQgX3Byb3BlcnRpZXMoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KAogICAgICAgICAgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX19wcm9wZXJ0aWVzJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBzdXBlckN0b3IgPSBzdXBlclByb3BlcnRpZXNDbGFzcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgICB0aGlzLl9fcHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sCiAgICAgICAgICAgIHN1cGVyQ3RvciAmJiBzdXBlckN0b3IuX3Byb3BlcnRpZXMsCiAgICAgICAgICAgIG93blByb3BlcnRpZXMoLyoqIEB0eXBlIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gKi8odGhpcykpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX19wcm9wZXJ0aWVzOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQcm9wZXJ0aWVzQ2hhbmdlZGAgbWV0aG9kIHRvIHJldHVybiB0eXBlIHNwZWNpZmllZCBpbiB0aGUKICAgICAgICogc3RhdGljIGBwcm9wZXJ0aWVzYCBvYmplY3QgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBwcm9wZXJ0eQogICAgICAgKiBAcmV0dXJuIHsqfSBUeXBlIHRvIHdoaWNoIHRvIGRlc2VyaWFsaXplIGF0dHJpYnV0ZQogICAgICAgKgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgdHlwZUZvclByb3BlcnR5KG5hbWUpIHsKICAgICAgICBjb25zdCBpbmZvID0gdGhpcy5fcHJvcGVydGllc1tuYW1lXTsKICAgICAgICByZXR1cm4gaW5mbyAmJiBpbmZvLnR5cGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFByb3BlcnRpZXNDaGFuZ2VkYCBtZXRob2QgYW5kIGFkZHMgYSBjYWxsIHRvCiAgICAgICAqIGBmaW5hbGl6ZWAgd2hpY2ggbGF6aWx5IGNvbmZpZ3VyZXMgdGhlIGVsZW1lbnQncyBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIFBvbHltZXIudGVsZW1ldHJ5Lmluc3RhbmNlQ291bnQrKzsKICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLmZpbmFsaXplKCk7CiAgICAgICAgc3VwZXIuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBhZGRlZCB0byBhIGRvY3VtZW50LgogICAgICAgKiBDYWxscyBgX2VuYWJsZVByb3BlcnRpZXNgIHRvIHR1cm4gb24gcHJvcGVydHkgc3lzdGVtIGZyb20KICAgICAgICogYFByb3BlcnRpZXNDaGFuZ2VkYC4KICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gU3VwZXIgbWF5IG9yIG1heSBub3QgaW1wbGVtZW50IHRoZSBjYWxsYmFjawogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgaWYgKHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKSB7CiAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyByZW1vdmVkIGZyb20gYSBkb2N1bWVudAogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBTdXBlciBtYXkgb3IgbWF5IG5vdCBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICBpZiAoc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2spIHsKICAgICAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgICAgfQogICAgICB9CgogICAgfQoKICAgIHJldHVybiBQcm9wZXJ0aWVzTWl4aW47CgogIH0pOwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgYnVpbHRDU1MgPSB3aW5kb3cuU2hhZHlDU1MgJiYgd2luZG93LlNoYWR5Q1NTWydjc3NCdWlsZCddOwoKICAvKioKICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MgbWV0YS1wcm9ncmFtbWluZwogICAqIGZlYXR1cmVzIGluY2x1ZGluZyB0ZW1wbGF0ZSBzdGFtcGluZywgZGF0YS1iaW5kaW5nLCBhdHRyaWJ1dGUgZGVzZXJpYWxpemF0aW9uLAogICAqIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24uCiAgICoKICAgKiBTdWJjbGFzc2VycyBtYXkgcHJvdmlkZSB0aGUgZm9sbG93aW5nIHN0YXRpYyBnZXR0ZXJzIHRvIHJldHVybiBtZXRhZGF0YQogICAqIHVzZWQgdG8gY29uZmlndXJlIFBvbHltZXIncyBmZWF0dXJlcyBmb3IgdGhlIGNsYXNzOgogICAqCiAgICogLSBgc3RhdGljIGdldCBpcygpYDogV2hlbiB0aGUgdGVtcGxhdGUgaXMgcHJvdmlkZWQgdmlhIGEgYGRvbS1tb2R1bGVgLAogICAqICAgdXNlcnMgc2hvdWxkIHJldHVybiB0aGUgYGRvbS1tb2R1bGVgIGlkIGZyb20gYSBzdGF0aWMgYGlzYCBnZXR0ZXIuICBJZgogICAqICAgbm8gdGVtcGxhdGUgaXMgbmVlZGVkIG9yIHRoZSB0ZW1wbGF0ZSBpcyBwcm92aWRlZCBkaXJlY3RseSB2aWEgdGhlCiAgICogICBgdGVtcGxhdGVgIGdldHRlciwgdGhlcmUgaXMgbm8gbmVlZCB0byBkZWZpbmUgYGlzYCBmb3IgdGhlIGVsZW1lbnQuCiAgICoKICAgKiAtIGBzdGF0aWMgZ2V0IHRlbXBsYXRlKClgOiBVc2VycyBtYXkgcHJvdmlkZSB0aGUgdGVtcGxhdGUgZGlyZWN0bHkgKGFzCiAgICogICBvcHBvc2VkIHRvIHZpYSBgZG9tLW1vZHVsZWApIGJ5IGltcGxlbWVudGluZyBhIHN0YXRpYyBgdGVtcGxhdGVgIGdldHRlci4KICAgKiAgIFRoZSBnZXR0ZXIgbWF5IHJldHVybiBhbiBgSFRNTFRlbXBsYXRlRWxlbWVudGAgb3IgYSBzdHJpbmcsIHdoaWNoIHdpbGwKICAgKiAgIGF1dG9tYXRpY2FsbHkgYmUgcGFyc2VkIGludG8gYSB0ZW1wbGF0ZS4KICAgKgogICAqIC0gYHN0YXRpYyBnZXQgcHJvcGVydGllcygpYDogU2hvdWxkIHJldHVybiBhbiBvYmplY3QgZGVzY3JpYmluZwogICAqICAgcHJvcGVydHktcmVsYXRlZCBtZXRhZGF0YSB1c2VkIGJ5IFBvbHltZXIgZmVhdHVyZXMgKGtleTogcHJvcGVydHkgbmFtZQogICAqICAgdmFsdWU6IG9iamVjdCBjb250YWluaW5nIHByb3BlcnR5IG1ldGFkYXRhKS4gVmFsaWQga2V5cyBpbiBwZXItcHJvcGVydHkKICAgKiAgIG1ldGFkYXRhIGluY2x1ZGU6CiAgICogICAtIGB0eXBlYCAoU3RyaW5nfE51bWJlcnxPYmplY3R8QXJyYXl8Li4uKTogVXNlZCBieQogICAqICAgICBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCB0byBkZXRlcm1pbmUgaG93IHN0cmluZy1iYXNlZCBhdHRyaWJ1dGVzCiAgICogICAgIGFyZSBkZXNlcmlhbGl6ZWQgdG8gSmF2YVNjcmlwdCBwcm9wZXJ0eSB2YWx1ZXMuCiAgICogICAtIGBub3RpZnlgIChib29sZWFuKTogQ2F1c2VzIGEgY2hhbmdlIGluIHRoZSBwcm9wZXJ0eSB0byBmaXJlIGEKICAgKiAgICAgbm9uLWJ1YmJsaW5nIGV2ZW50IGNhbGxlZCBgPHByb3BlcnR5Pi1jaGFuZ2VkYC4gRWxlbWVudHMgdGhhdCBoYXZlCiAgICogICAgIGVuYWJsZWQgdHdvLXdheSBiaW5kaW5nIHRvIHRoZSBwcm9wZXJ0eSB1c2UgdGhpcyBldmVudCB0byBvYnNlcnZlIGNoYW5nZXMuCiAgICogICAtIGByZWFkT25seWAgKGJvb2xlYW4pOiBDcmVhdGVzIGEgZ2V0dGVyIGZvciB0aGUgcHJvcGVydHksIGJ1dCBubyBzZXR0ZXIuCiAgICogICAgIFRvIHNldCBhIHJlYWQtb25seSBwcm9wZXJ0eSwgdXNlIHRoZSBwcml2YXRlIHNldHRlciBtZXRob2QKICAgKiAgICAgYF9zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpYC4KICAgKiAgIC0gYG9ic2VydmVyYCAoc3RyaW5nKTogT2JzZXJ2ZXIgbWV0aG9kIG5hbWUgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuCiAgICogICAgIHRoZSBwcm9wZXJ0eSBjaGFuZ2VzLiBUaGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QgYXJlCiAgICogICAgIGAodmFsdWUsIHByZXZpb3VzVmFsdWUpYC4KICAgKiAgIC0gYGNvbXB1dGVkYCAoc3RyaW5nKTogU3RyaW5nIGRlc2NyaWJpbmcgbWV0aG9kIGFuZCBkZXBlbmRlbnQgcHJvcGVydGllcwogICAqICAgICBmb3IgY29tcHV0aW5nIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IChlLmcuIGAnY29tcHV0ZUZvbyhiYXIsIHpvdCknYCkuCiAgICogICAgIENvbXB1dGVkIHByb3BlcnRpZXMgYXJlIHJlYWQtb25seSBieSBkZWZhdWx0IGFuZCBjYW4gb25seSBiZSBjaGFuZ2VkCiAgICogICAgIHZpYSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBjb21wdXRpbmcgbWV0aG9kLgogICAqCiAgICogLSBgc3RhdGljIGdldCBvYnNlcnZlcnMoKWA6IEFycmF5IG9mIHN0cmluZ3MgZGVzY3JpYmluZyBtdWx0aS1wcm9wZXJ0eQogICAqICAgb2JzZXJ2ZXIgbWV0aG9kcyBhbmQgdGhlaXIgZGVwZW5kZW50IHByb3BlcnRpZXMgKGUuZy4KICAgKiAgIGAnb2JzZXJ2ZUFCQyhhLCBiLCBjKSdgKS4KICAgKgogICAqIFRoZSBiYXNlIGNsYXNzIHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgZm9sbG93aW5nIHN0YW5kYXJkCiAgICogY3VzdG9tIGVsZW1lbnQgbGlmZWN5Y2xlIGNhbGxiYWNrczsgdXNlcnMgbWF5IG92ZXJyaWRlIHRoZXNlLCBidXQgc2hvdWxkCiAgICogY2FsbCB0aGUgc3VwZXIgbWV0aG9kIHRvIGVuc3VyZQogICAqIC0gYGNvbnN0cnVjdG9yYDogUnVuIHdoZW4gdGhlIGVsZW1lbnQgaXMgY3JlYXRlZCBvciB1cGdyYWRlZAogICAqIC0gYGNvbm5lY3RlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlCiAgICogICBkb2N1bWVudAogICAqIC0gYGRpc2Nvbm5lY3RlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSB0aGUgZWxlbWVudCBpcyBkaXNjb25uZWN0ZWQgZnJvbQogICAqICAgdGhlIGRvY3VtZW50CiAgICogLSBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSBhbiBhdHRyaWJ1dGUgaW4KICAgKiAgIGBvYnNlcnZlZEF0dHJpYnV0ZXNgIGlzIHNldCBvciByZW1vdmVkIChub3RlOiB0aGlzIGVsZW1lbnQncyBkZWZhdWx0CiAgICogICBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBpbXBsZW1lbnRhdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgcmV0dXJuIGFuIGFycmF5CiAgICogICBvZiBkYXNoLWNhc2VkIGF0dHJpYnV0ZXMgYmFzZWQgb24gYHByb3BlcnRpZXNgKQogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHMKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydGllc01peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcHJvcGVydHkgcm9vdFBhdGgge3N0cmluZ30gU2V0IHRvIHRoZSB2YWx1ZSBvZiBgUG9seW1lci5yb290UGF0aGAsCiAgICogICB3aGljaCBkZWZhdWx0cyB0byB0aGUgbWFpbiBkb2N1bWVudCBwYXRoCiAgICogQHByb3BlcnR5IGltcG9ydFBhdGgge3N0cmluZ30gU2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUgY2xhc3MncyBzdGF0aWMKICAgKiAgIGBpbXBvcnRQYXRoYCBwcm9wZXJ0eSwgd2hpY2ggZGVmYXVsdHMgdG8gdGhlIHBhdGggb2YgdGhpcyBlbGVtZW50J3MKICAgKiAgIGBkb20tbW9kdWxlYCAod2hlbiBgaXNgIGlzIHVzZWQpLCBidXQgY2FuIGJlIG92ZXJyaWRkZW4gZm9yIG90aGVyCiAgICogICBpbXBvcnQgc3RyYXRlZ2llcy4KICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MKICAgKiBtZXRhLXByb2dyYW1taW5nIGZlYXR1cmVzLgogICAqLwogIFBvbHltZXIuRWxlbWVudE1peGluID0gUG9seW1lci5kZWR1cGluZ01peGluKGJhc2UgPT4gewoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnRpZXNNaXhpbn0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IHBvbHltZXJFbGVtZW50QmFzZSA9IFBvbHltZXIuUHJvcGVydGllc01peGluKFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKGJhc2UpKTsKCiAgICAvKioKICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHByb3BlcnRpZXMgd2l0aCBkZWZhdWx0IHZhbHVlcy4KICAgICAqIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGFzIGFuIG9wdGltaXphdGlvbiBzaW5jZSBpdCBpcyBhIHN1YnNldCBvZgogICAgICogdGhlIGxpc3QgcmV0dXJuZWQgZnJvbSBgX3Byb3BlcnRpZXNgLgogICAgICogVGhpcyBsaXN0IGlzIHVzZWQgaW4gYF9pbml0aWFsaXplUHJvcGVydGllc2AgdG8gc2V0IHByb3BlcnR5IGRlZmF1bHRzLgogICAgICoKICAgICAqIEBwYXJhbSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0gY29uc3RydWN0b3IgRWxlbWVudCBjbGFzcwogICAgICogQHJldHVybiB7UG9seW1lckVsZW1lbnRQcm9wZXJ0aWVzfSBGbGF0dGVuZWQgcHJvcGVydGllcyBmb3IgdGhpcyBjbGFzcwogICAgICogICB0aGF0IGhhdmUgZGVmYXVsdCB2YWx1ZXMKICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByb3BlcnR5RGVmYXVsdHMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eSgKICAgICAgICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX3Byb3BlcnR5RGVmYXVsdHMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgY29uc3RydWN0b3IuX19wcm9wZXJ0eURlZmF1bHRzID0gbnVsbDsKICAgICAgICBsZXQgcHJvcHMgPSBjb25zdHJ1Y3Rvci5fcHJvcGVydGllczsKICAgICAgICBmb3IgKGxldCBwIGluIHByb3BzKSB7CiAgICAgICAgICBsZXQgaW5mbyA9IHByb3BzW3BdOwogICAgICAgICAgaWYgKCd2YWx1ZScgaW4gaW5mbykgewogICAgICAgICAgICBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHMgPSBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHMgfHwge307CiAgICAgICAgICAgIGNvbnN0cnVjdG9yLl9fcHJvcGVydHlEZWZhdWx0c1twXSA9IGluZm87CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbWVtb2l6ZWQgdmVyc2lvbiBvZiB0aGUgYG9ic2VydmVyc2AgYXJyYXkuCiAgICAgKiBAcGFyYW0ge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIEVsZW1lbnQgY2xhc3MKICAgICAqIEByZXR1cm4ge0FycmF5fSBBcnJheSBjb250YWluaW5nIG93biBvYnNlcnZlcnMgZm9yIHRoZSBnaXZlbiBjbGFzcwogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBmdW5jdGlvbiBvd25PYnNlcnZlcnMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eSgKICAgICAgICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX293bk9ic2VydmVycycsIGNvbnN0cnVjdG9yKSkpIHsKICAgICAgICAgIGNvbnN0cnVjdG9yLl9fb3duT2JzZXJ2ZXJzID0KICAgICAgICAgIGNvbnN0cnVjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ29ic2VydmVycycsIGNvbnN0cnVjdG9yKSkgPwogICAgICAgICAgLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSAqLyAoY29uc3RydWN0b3IpLm9ic2VydmVycyA6IG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLl9fb3duT2JzZXJ2ZXJzOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBlZmZlY3RzIGZvciBhIHByb3BlcnR5LgogICAgICoKICAgICAqIE5vdGUsIG9uY2UgYSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQgdG8KICAgICAqIGByZWFkT25seWAsIGBjb21wdXRlZGAsIGByZWZsZWN0VG9BdHRyaWJ1dGVgLCBvciBgbm90aWZ5YAogICAgICogdGhlc2UgdmFsdWVzIG1heSBub3QgYmUgY2hhbmdlZC4gRm9yIGV4YW1wbGUsIGEgc3ViY2xhc3MgY2Fubm90CiAgICAgKiBhbHRlciB0aGVzZSBzZXR0aW5ncy4gSG93ZXZlciwgYWRkaXRpb25hbCBgb2JzZXJ2ZXJzYCBtYXkgYmUgYWRkZWQKICAgICAqIGJ5IHN1YmNsYXNzZXMuCiAgICAgKgogICAgICogVGhlIGluZm8gb2JqZWN0IHNob3VsZCBjb250YWluIHByb3BlcnR5IG1ldGFkYXRhIGFzIGZvbGxvd3M6CiAgICAgKgogICAgICogKiBgdHlwZWA6IHtmdW5jdGlvbn0gdHlwZSB0byB3aGljaCBhbiBhdHRyaWJ1dGUgbWF0Y2hpbmcgdGhlIHByb3BlcnR5CiAgICAgKiBpcyBkZXNlcmlhbGl6ZWQuIE5vdGUgdGhlIHByb3BlcnR5IGlzIGNhbWVsLWNhc2VkIGZyb20gYSBkYXNoLWNhc2VkCiAgICAgKiBhdHRyaWJ1dGUuIEZvciBleGFtcGxlLCAnZm9vLWJhcicgYXR0cmlidXRlIGlzIGRlc2VyaWFsaXplZCB0byBhCiAgICAgKiBwcm9wZXJ0eSBuYW1lZCAnZm9vQmFyJy4KICAgICAqCiAgICAgKiAqIGByZWFkT25seWA6IHtib29sZWFufSBjcmVhdGVzIGEgcmVhZE9ubHkgcHJvcGVydHkgYW5kCiAgICAgKiBtYWtlcyBhIHByaXZhdGUgc2V0dGVyIGZvciB0aGUgcHJpdmF0ZSBvZiB0aGUgZm9ybSAnX3NldEZvbycgZm9yIGEKICAgICAqIHByb3BlcnR5ICdmb28nLAogICAgICoKICAgICAqICogYGNvbXB1dGVkYDoge3N0cmluZ30gY3JlYXRlcyBhIGNvbXB1dGVkIHByb3BlcnR5LiBBIGNvbXB1dGVkIHByb3BlcnR5CiAgICAgKiBpcyBhbHNvIGF1dG9tYXRpY2FsbHkgc2V0IHRvIGByZWFkT25seTogdHJ1ZWAuIFRoZSB2YWx1ZSBpcyBjYWxjdWxhdGVkCiAgICAgKiBieSBydW5uaW5nIGEgbWV0aG9kIGFuZCBhcmd1bWVudHMgcGFyc2VkIGZyb20gdGhlIGdpdmVuIHN0cmluZy4gRm9yCiAgICAgKiBleGFtcGxlICdjb21wdXRlKGZvbyknIHdpbGwgY29tcHV0ZSBhIGdpdmVuIHByb3BlcnR5IHdoZW4gdGhlCiAgICAgKiAnZm9vJyBwcm9wZXJ0eSBjaGFuZ2VzIGJ5IGV4ZWN1dGluZyB0aGUgJ2NvbXB1dGUnIG1ldGhvZC4gVGhpcyBtZXRob2QKICAgICAqIG11c3QgcmV0dXJuIHRoZSBjb21wdXRlZCB2YWx1ZS4KICAgICAqCiAgICAgKiAqIGByZWZsZWN0VG9BdHRyaWJ1dGVgOiB7Ym9vbGVhbn0gSWYgdHJ1ZSwgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHJlZmxlY3RlZAogICAgICogdG8gYW4gYXR0cmlidXRlIG9mIHRoZSBzYW1lIG5hbWUuIE5vdGUsIHRoZSBhdHRyaWJ1dGUgaXMgZGFzaC1jYXNlZAogICAgICogc28gYSBwcm9wZXJ0eSBuYW1lZCAnZm9vQmFyJyBpcyByZWZsZWN0ZWQgYXMgJ2Zvby1iYXInLgogICAgICoKICAgICAqICogYG5vdGlmeWA6IHtib29sZWFufSBzZW5kcyBhIG5vbi1idWJibGluZyBub3RpZmljYXRpb24gZXZlbnQgd2hlbgogICAgICogdGhlIHByb3BlcnR5IGNoYW5nZXMuIEZvciBleGFtcGxlLCBhIHByb3BlcnR5IG5hbWVkICdmb28nIHNlbmRzIGFuCiAgICAgKiBldmVudCBuYW1lZCAnZm9vLWNoYW5nZWQnIHdpdGggYGV2ZW50LmRldGFpbGAgc2V0IHRvIHRoZSB2YWx1ZSBvZgogICAgICogdGhlIHByb3BlcnR5LgogICAgICoKICAgICAqICogb2JzZXJ2ZXI6IHtzdHJpbmd9IG5hbWUgb2YgYSBtZXRob2QgdGhhdCBydW5zIHdoZW4gdGhlIHByb3BlcnR5CiAgICAgKiBjaGFuZ2VzLiBUaGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QgYXJlICh2YWx1ZSwgcHJldmlvdXNWYWx1ZSkuCiAgICAgKgogICAgICogTm90ZTogVXNlcnMgbWF5IHdhbnQgY29udHJvbCBvdmVyIG1vZGlmeWluZyBwcm9wZXJ0eQogICAgICogZWZmZWN0cyB2aWEgc3ViY2xhc3NpbmcuIEZvciBleGFtcGxlLCBhIHVzZXIgbWlnaHQgd2FudCB0byBtYWtlIGEKICAgICAqIHJlZmxlY3RUb0F0dHJpYnV0ZSBwcm9wZXJ0eSBub3QgZG8gc28gaW4gYSBzdWJjbGFzcy4gV2UndmUgY2hvc2VuIHRvCiAgICAgKiBkaXNhYmxlIHRoaXMgYmVjYXVzZSBpdCBsZWFkcyB0byBhZGRpdGlvbmFsIGNvbXBsaWNhdGlvbi4KICAgICAqIEZvciBleGFtcGxlLCBhIHJlYWRPbmx5IGVmZmVjdCBnZW5lcmF0ZXMgYSBzcGVjaWFsIHNldHRlci4gSWYgYSBzdWJjbGFzcwogICAgICogZGlzYWJsZXMgdGhlIGVmZmVjdCwgdGhlIHNldHRlciB3b3VsZCBmYWlsIHVuZXhwZWN0ZWRseS4KICAgICAqIEJhc2VkIG9uIGZlZWRiYWNrLCB3ZSBtYXkgd2FudCB0byB0cnkgdG8gbWFrZSBlZmZlY3RzIG1vcmUgbWFsbGVhYmxlCiAgICAgKiBhbmQvb3IgcHJvdmlkZSBhbiBhZHZhbmNlZCBhcGkgZm9yIG1hbmlwdWxhdGluZyB0aGVtLgogICAgICogQWxzbyBjb25zaWRlciBhZGRpbmcgd2FybmluZ3Mgd2hlbiBhbiBlZmZlY3QgY2Fubm90IGJlIGNoYW5nZWQuCiAgICAgKgogICAgICogQHBhcmFtIHshUG9seW1lckVsZW1lbnR9IHByb3RvIEVsZW1lbnQgY2xhc3MgcHJvdG90eXBlIHRvIGFkZCBhY2Nlc3NvcnMKICAgICAqICAgYW5kIGVmZmVjdHMgdG8KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIHByb3BlcnR5LgogICAgICogQHBhcmFtIHtPYmplY3R9IGluZm8gSW5mbyBvYmplY3QgZnJvbSB3aGljaCB0byBjcmVhdGUgcHJvcGVydHkgZWZmZWN0cy4KICAgICAqIFN1cHBvcnRlZCBrZXlzOgogICAgICogQHBhcmFtIHtPYmplY3R9IGFsbFByb3BzIEZsYXR0ZW5lZCBtYXAgb2YgYWxsIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGlzCiAgICAgKiAgIGVsZW1lbnQgKGluY2x1ZGluZyBpbmhlcml0ZWQgcHJvcGVydGllcykKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eUZyb21Db25maWcocHJvdG8sIG5hbWUsIGluZm8sIGFsbFByb3BzKSB7CiAgICAgIC8vIGNvbXB1dGVkIGZvcmNlcyByZWFkT25seS4uLgogICAgICBpZiAoaW5mby5jb21wdXRlZCkgewogICAgICAgIGluZm8ucmVhZE9ubHkgPSB0cnVlOwogICAgICB9CiAgICAgIC8vIE5vdGUsIHNpbmNlIGFsbCBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSByZWFkT25seSwgdGhpcyBwcmV2ZW50cwogICAgICAvLyBhZGRpbmcgYWRkaXRpb25hbCBjb21wdXRlZCBwcm9wZXJ0eSBlZmZlY3RzICh3aGljaCBsZWFkcyB0byBhIGNvbmZ1c2luZwogICAgICAvLyBzZXR1cCB3aGVyZSBtdWx0aXBsZSB0cmlnZ2VycyBmb3Igc2V0dGluZyBhIHByb3BlcnR5KQogICAgICAvLyBXaGlsZSB3ZSBkbyBoYXZlIGBoYXNDb21wdXRlZEVmZmVjdGAgdGhpcyBpcyBzZXQgb24gdGhlIHByb3BlcnR5J3MKICAgICAgLy8gZGVwZW5kZW5jaWVzIHJhdGhlciB0aGFuIGl0c2VsZi4KICAgICAgaWYgKGluZm8uY29tcHV0ZWQgJiYgIXByb3RvLl9oYXNSZWFkT25seUVmZmVjdChuYW1lKSkgewogICAgICAgIHByb3RvLl9jcmVhdGVDb21wdXRlZFByb3BlcnR5KG5hbWUsIGluZm8uY29tcHV0ZWQsIGFsbFByb3BzKTsKICAgICAgfQogICAgICBpZiAoaW5mby5yZWFkT25seSAmJiAhcHJvdG8uX2hhc1JlYWRPbmx5RWZmZWN0KG5hbWUpKSB7CiAgICAgICAgcHJvdG8uX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkobmFtZSwgIWluZm8uY29tcHV0ZWQpOwogICAgICB9CiAgICAgIGlmIChpbmZvLnJlZmxlY3RUb0F0dHJpYnV0ZSAmJiAhcHJvdG8uX2hhc1JlZmxlY3RFZmZlY3QobmFtZSkpIHsKICAgICAgICBwcm90by5fY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkobmFtZSk7CiAgICAgIH0KICAgICAgaWYgKGluZm8ubm90aWZ5ICYmICFwcm90by5faGFzTm90aWZ5RWZmZWN0KG5hbWUpKSB7CiAgICAgICAgcHJvdG8uX2NyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5KG5hbWUpOwogICAgICB9CiAgICAgIC8vIGFsd2F5cyBhZGQgb2JzZXJ2ZXIKICAgICAgaWYgKGluZm8ub2JzZXJ2ZXIpIHsKICAgICAgICBwcm90by5fY3JlYXRlUHJvcGVydHlPYnNlcnZlcihuYW1lLCBpbmZvLm9ic2VydmVyLCBhbGxQcm9wc1tpbmZvLm9ic2VydmVyXSk7CiAgICAgIH0KICAgICAgLy8gYWx3YXlzIGNyZWF0ZSB0aGUgbWFwcGluZyBmcm9tIGF0dHJpYnV0ZSBiYWNrIHRvIHByb3BlcnR5IGZvciBkZXNlcmlhbGl6YXRpb24uCiAgICAgIHByb3RvLl9hZGRQcm9wZXJ0eVRvQXR0cmlidXRlTWFwKG5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogUHJvY2VzcyBhbGwgc3R5bGUgZWxlbWVudHMgaW4gdGhlIGVsZW1lbnQgdGVtcGxhdGUuIFN0eWxlcyB3aXRoIHRoZQogICAgICogYGluY2x1ZGVgIGF0dHJpYnV0ZSBhcmUgcHJvY2Vzc2VkIHN1Y2ggdGhhdCBhbnkgc3R5bGVzIGluCiAgICAgKiB0aGUgYXNzb2NpYXRlZCAic3R5bGUgbW9kdWxlcyIgYXJlIGluY2x1ZGVkIGluIHRoZSBlbGVtZW50IHRlbXBsYXRlLgogICAgICogQHBhcmFtIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSBrbGFzcyBFbGVtZW50IGNsYXNzCiAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBwcm9jZXNzCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaXMgTmFtZSBvZiBlbGVtZW50CiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBCYXNlIFVSSSBmb3IgZWxlbWVudAogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gcHJvY2Vzc0VsZW1lbnRTdHlsZXMoa2xhc3MsIHRlbXBsYXRlLCBpcywgYmFzZVVSSSkgewogICAgICBpZiAoIWJ1aWx0Q1NTKSB7CiAgICAgICAgY29uc3QgdGVtcGxhdGVTdHlsZXMgPSB0ZW1wbGF0ZS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N0eWxlJyk7CiAgICAgICAgY29uc3Qgc3R5bGVzV2l0aEltcG9ydHMgPSBQb2x5bWVyLlN0eWxlR2F0aGVyLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgLy8gaW5zZXJ0IHN0eWxlcyBmcm9tIDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPiBhdCB0aGUgdG9wIG9mIHRoZSB0ZW1wbGF0ZQogICAgICAgIGNvbnN0IGxpbmtlZFN0eWxlcyA9IFBvbHltZXIuU3R5bGVHYXRoZXIuc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMoaXMpOwogICAgICAgIGNvbnN0IGZpcnN0VGVtcGxhdGVDaGlsZCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7CiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgbGlua2VkU3R5bGVzLmxlbmd0aDsgaWR4KyspIHsKICAgICAgICAgIGxldCBzID0gbGlua2VkU3R5bGVzW2lkeF07CiAgICAgICAgICBzLnRleHRDb250ZW50ID0ga2xhc3MuX3Byb2Nlc3NTdHlsZVRleHQocy50ZXh0Q29udGVudCwgYmFzZVVSSSk7CiAgICAgICAgICB0ZW1wbGF0ZS5jb250ZW50Lmluc2VydEJlZm9yZShzLCBmaXJzdFRlbXBsYXRlQ2hpbGQpOwogICAgICAgIH0KICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0ICJjb25jcmV0ZSIgc3R5bGUgaW4gdGhlIHRlbXBsYXRlIHdlIGhhdmUgZW5jb3VudGVyZWQKICAgICAgICBsZXQgdGVtcGxhdGVTdHlsZUluZGV4ID0gMDsKICAgICAgICAvLyBlbnN1cmUgYWxsIGdhdGhlcmVkIHN0eWxlcyBhcmUgYWN0dWFsbHkgaW4gdGhpcyB0ZW1wbGF0ZS4KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0eWxlc1dpdGhJbXBvcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgcyA9IHN0eWxlc1dpdGhJbXBvcnRzW2ldOwogICAgICAgICAgbGV0IHRlbXBsYXRlU3R5bGUgPSB0ZW1wbGF0ZVN0eWxlc1t0ZW1wbGF0ZVN0eWxlSW5kZXhdOwogICAgICAgICAgLy8gaWYgdGhlIHN0eWxlIGlzIG5vdCBpbiB0aGlzIHRlbXBsYXRlLCBpdCdzIGJlZW4gImluY2x1ZGVkIiBhbmQKICAgICAgICAgIC8vIHdlIHB1dCBhIGNsb25lIG9mIGl0IGluIHRoZSB0ZW1wbGF0ZSBiZWZvcmUgdGhlIHN0eWxlIHRoYXQgaW5jbHVkZWQgaXQKICAgICAgICAgIGlmICh0ZW1wbGF0ZVN0eWxlICE9PSBzKSB7CiAgICAgICAgICAgIHMgPSBzLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgICAgdGVtcGxhdGVTdHlsZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzLCB0ZW1wbGF0ZVN0eWxlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRlbXBsYXRlU3R5bGVJbmRleCsrOwogICAgICAgICAgfQogICAgICAgICAgcy50ZXh0Q29udGVudCA9IGtsYXNzLl9wcm9jZXNzU3R5bGVUZXh0KHMudGV4dENvbnRlbnQsIGJhc2VVUkkpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAod2luZG93LlNoYWR5Q1NTKSB7CiAgICAgICAgd2luZG93LlNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZSh0ZW1wbGF0ZSwgaXMpOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBMb29rIHVwIHRlbXBsYXRlIGZyb20gZG9tLW1vZHVsZSBmb3IgZWxlbWVudAogICAgICoKICAgICAqIEBwYXJhbSB7IXN0cmluZ30gaXMgRWxlbWVudCBuYW1lIHRvIGxvb2sgdXAKICAgICAqIEByZXR1cm4geyFIVE1MVGVtcGxhdGVFbGVtZW50fSBUZW1wbGF0ZSBmb3VuZCBpbiBkb20gbW9kdWxlLCBvcgogICAgICogICB1bmRlZmluZWQgaWYgbm90IGZvdW5kCiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFRlbXBsYXRlRnJvbURvbU1vZHVsZShpcykgewogICAgICBsZXQgdGVtcGxhdGUgPSBudWxsOwogICAgICBpZiAoaXMgJiYgUG9seW1lci5Eb21Nb2R1bGUpIHsKICAgICAgICB0ZW1wbGF0ZSA9IFBvbHltZXIuRG9tTW9kdWxlLmltcG9ydChpcywgJ3RlbXBsYXRlJyk7CiAgICAgICAgLy8gVW5kZXIgc3RyaWN0VGVtcGxhdGVQb2xpY3ksIHJlcXVpcmUgYW55IGVsZW1lbnQgd2l0aCBhbiBgaXNgCiAgICAgICAgLy8gc3BlY2lmaWVkIHRvIGhhdmUgYSBkb20tbW9kdWxlCiAgICAgICAgaWYgKFBvbHltZXIuc3RyaWN0VGVtcGxhdGVQb2xpY3kgJiYgIXRlbXBsYXRlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHN0cmljdFRlbXBsYXRlUG9saWN5OiBleHBlY3RpbmcgZG9tLW1vZHVsZSBvciBudWxsIHRlbXBsYXRlIGZvciAke2lzfWApOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdGVtcGxhdGU7CiAgICB9CgogIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9FbGVtZW50TWl4aW59CiAgICAgKi8KICAgIGNsYXNzIFBvbHltZXJFbGVtZW50IGV4dGVuZHMgcG9seW1lckVsZW1lbnRCYXNlIHsKCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZSBvZiBQcm9wZXJ0aWVzTWl4aW4gX2ZpbmFsaXplQ2xhc3MgdG8gY3JlYXRlIG9ic2VydmVycyBhbmQKICAgICAgICogZmluZCB0aGUgdGVtcGxhdGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IEludGVyZmFjZXMgaW4gY2xvc3VyZSBkbyBub3QgaW5oZXJpdCBzdGF0aWNzLCBidXQgY2xhc3NlcyBkbwogICAgICAgKi8KICAgICAgc3RhdGljIF9maW5hbGl6ZUNsYXNzKCkgewogICAgICAgIHN1cGVyLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgY29uc3Qgb2JzZXJ2ZXJzID0gb3duT2JzZXJ2ZXJzKHRoaXMpOwogICAgICAgIGlmIChvYnNlcnZlcnMpIHsKICAgICAgICAgIHRoaXMuY3JlYXRlT2JzZXJ2ZXJzKG9ic2VydmVycywgdGhpcy5fcHJvcGVydGllcyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3ByZXBhcmVUZW1wbGF0ZSgpOwogICAgICB9CgogICAgICBzdGF0aWMgX3ByZXBhcmVUZW1wbGF0ZSgpIHsKICAgICAgICAvLyBub3RlOiBjcmVhdGUgIndvcmtpbmciIHRlbXBsYXRlIHRoYXQgaXMgZmluYWxpemVkIGF0IGluc3RhbmNlIHRpbWUKICAgICAgICBsZXQgdGVtcGxhdGUgPSAvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9ICovICh0aGlzKS50ZW1wbGF0ZTsKICAgICAgICBpZiAodGVtcGxhdGUpIHsKICAgICAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIGxldCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTsKICAgICAgICAgICAgdC5pbm5lckhUTUwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgdGVtcGxhdGUgPSB0OwogICAgICAgICAgfSBlbHNlIGlmICghUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zKSB7CiAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoaXMucHJvdG90eXBlLl90ZW1wbGF0ZSA9IHRlbXBsYXRlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgb2YgUHJvcGVydGllc0NoYW5nZWQgY3JlYXRlUHJvcGVydGllcyB0byBjcmVhdGUgYWNjZXNzb3JzCiAgICAgICAqIGFuZCBwcm9wZXJ0eSBlZmZlY3RzIGZvciBhbGwgb2YgdGhlIHByb3BlcnRpZXMuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIGZvciAobGV0IHAgaW4gcHJvcHMpIHsKICAgICAgICAgIGNyZWF0ZVByb3BlcnR5RnJvbUNvbmZpZyh0aGlzLnByb3RvdHlwZSwgcCwgcHJvcHNbcF0sIHByb3BzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIG9ic2VydmVycyBmb3IgdGhlIGdpdmVuIGBvYnNlcnZlcnNgIGFycmF5LgogICAgICAgKiBMZXZlcmFnZXMgYFByb3BlcnR5RWZmZWN0c2AgdG8gY3JlYXRlIG9ic2VydmVycy4KICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9ic2VydmVycyBBcnJheSBvZiBvYnNlcnZlciBkZXNjcmlwdG9ycyBmb3IKICAgICAgICogICB0aGlzIGNsYXNzCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkeW5hbWljRm5zIE9iamVjdCBjb250YWluaW5nIGtleXMgZm9yIGFueSBwcm9wZXJ0aWVzCiAgICAgICAqICAgdGhhdCBhcmUgZnVuY3Rpb25zIGFuZCBzaG91bGQgdHJpZ2dlciB0aGUgZWZmZWN0IHdoZW4gdGhlIGZ1bmN0aW9uCiAgICAgICAqICAgcmVmZXJlbmNlIGlzIGNoYW5nZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZU9ic2VydmVycyhvYnNlcnZlcnMsIGR5bmFtaWNGbnMpIHsKICAgICAgICBjb25zdCBwcm90byA9IHRoaXMucHJvdG90eXBlOwogICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG9ic2VydmVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgcHJvdG8uX2NyZWF0ZU1ldGhvZE9ic2VydmVyKG9ic2VydmVyc1tpXSwgZHluYW1pY0Zucyk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgdGhhdCB3aWxsIGJlIHN0YW1wZWQgaW50byB0aGlzIGVsZW1lbnQncyBzaGFkb3cgcm9vdC4KICAgICAgICoKICAgICAgICogSWYgYSBgc3RhdGljIGdldCBpcygpYCBnZXR0ZXIgaXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KICAgICAgICogd2lsbCByZXR1cm4gdGhlIGZpcnN0IGA8dGVtcGxhdGU+YCBpbiBhIGBkb20tbW9kdWxlYCB3aG9zZSBgaWRgCiAgICAgICAqIG1hdGNoZXMgdGhpcyBlbGVtZW50J3MgYGlzYC4KICAgICAgICoKICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgZ2V0dGVyIHRvIHJldHVybiBhbiBhcmJpdHJhcnkgdGVtcGxhdGUKICAgICAgICogKGluIHdoaWNoIGNhc2UgdGhlIGBpc2AgZ2V0dGVyIGlzIHVubmVjZXNzYXJ5KS4gVGhlIHRlbXBsYXRlIHJldHVybmVkCiAgICAgICAqIG1heSBiZSBlaXRoZXIgYW4gYEhUTUxUZW1wbGF0ZUVsZW1lbnRgIG9yIGEgc3RyaW5nIHRoYXQgd2lsbCBiZQogICAgICAgKiBhdXRvbWF0aWNhbGx5IHBhcnNlZCBpbnRvIGEgdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhhdCB3aGVuIHN1YmNsYXNzaW5nLCBpZiB0aGUgc3VwZXIgY2xhc3Mgb3ZlcnJvZGUgdGhlIGRlZmF1bHQKICAgICAgICogaW1wbGVtZW50YXRpb24gYW5kIHRoZSBzdWJjbGFzcyB3b3VsZCBsaWtlIHRvIHByb3ZpZGUgYW4gYWx0ZXJuYXRlCiAgICAgICAqIHRlbXBsYXRlIHZpYSBhIGBkb20tbW9kdWxlYCwgaXQgc2hvdWxkIG92ZXJyaWRlIHRoaXMgZ2V0dGVyIGFuZAogICAgICAgKiByZXR1cm4gYFBvbHltZXIuRG9tTW9kdWxlLmltcG9ydCh0aGlzLmlzLCAndGVtcGxhdGUnKWAuCiAgICAgICAqCiAgICAgICAqIElmIGEgc3ViY2xhc3Mgd291bGQgbGlrZSB0byBtb2RpZnkgdGhlIHN1cGVyIGNsYXNzIHRlbXBsYXRlLCBpdCBzaG91bGQKICAgICAgICogY2xvbmUgaXQgcmF0aGVyIHRoYW4gbW9kaWZ5IGl0IGluIHBsYWNlLiAgSWYgdGhlIGdldHRlciBkb2VzIGV4cGVuc2l2ZQogICAgICAgKiB3b3JrIHN1Y2ggYXMgY2xvbmluZy9tb2RpZnlpbmcgYSB0ZW1wbGF0ZSwgaXQgc2hvdWxkIG1lbW9pemUgdGhlCiAgICAgICAqIHRlbXBsYXRlIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlOgogICAgICAgKgogICAgICAgKiAgIGxldCBtZW1vaXplZFRlbXBsYXRlOwogICAgICAgKiAgIGNsYXNzIE15U3ViQ2xhc3MgZXh0ZW5kcyBNeVN1cGVyQ2xhc3MgewogICAgICAgKiAgICAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHsKICAgICAgICogICAgICAgaWYgKCFtZW1vaXplZFRlbXBsYXRlKSB7CiAgICAgICAqICAgICAgICAgbWVtb2l6ZWRUZW1wbGF0ZSA9IE15U3VwZXJDbGFzcy50ZW1wbGF0ZS5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAqICAgICAgICAgbGV0IHN1YkNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICogICAgICAgICBzdWJDb250ZW50LnRleHRDb250ZW50ID0gJ1RoaXMgY2FtZSBmcm9tIE15U3ViQ2xhc3MnOwogICAgICAgKiAgICAgICAgIG1lbW9pemVkVGVtcGxhdGUuY29udGVudC5hcHBlbmRDaGlsZChzdWJDb250ZW50KTsKICAgICAgICogICAgICAgfQogICAgICAgKiAgICAgICByZXR1cm4gbWVtb2l6ZWRUZW1wbGF0ZTsKICAgICAgICogICAgIH0KICAgICAgICogICB9CiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge0hUTUxUZW1wbGF0ZUVsZW1lbnR8c3RyaW5nfSBUZW1wbGF0ZSB0byBiZSBzdGFtcGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgewogICAgICAgIC8vIEV4cGxhbmF0aW9uIG9mIHRlbXBsYXRlLXJlbGF0ZWQgcHJvcGVydGllczoKICAgICAgICAvLyAtIGNvbnN0cnVjdG9yLnRlbXBsYXRlICh0aGlzIGdldHRlcik6IHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGNsYXNzLgogICAgICAgIC8vICAgICBUaGlzIGNhbiBjb21lIGZyb20gdGhlIHByb3RvdHlwZSAoZm9yIGxlZ2FjeSBlbGVtZW50cyksIGZyb20gYQogICAgICAgIC8vICAgICBkb20tbW9kdWxlLCBvciBmcm9tIHRoZSBzdXBlciBjbGFzcydzIHRlbXBsYXRlIChvciBjYW4gYmUgb3ZlcnJpZGRlbgogICAgICAgIC8vICAgICBhbHRvZ2V0aGVyIGJ5IHRoZSB1c2VyKQogICAgICAgIC8vIC0gY29uc3RydWN0b3IuX3RlbXBsYXRlOiBtZW1vaXplZCB2ZXJzaW9uIG9mIGNvbnN0cnVjdG9yLnRlbXBsYXRlCiAgICAgICAgLy8gLSBwcm90b3R5cGUuX3RlbXBsYXRlOiB3b3JraW5nIHRlbXBsYXRlIGZvciB0aGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZQogICAgICAgIC8vICAgICBwYXJzZWQgYW5kIG1vZGlmaWVkIGluIHBsYWNlLiBJdCBpcyBhIGNsb25lZCB2ZXJzaW9uIG9mCiAgICAgICAgLy8gICAgIGNvbnN0cnVjdG9yLnRlbXBsYXRlLCBzYXZlZCBpbiBfZmluYWxpemVDbGFzcygpLiBOb3RlIHRoYXQgYmVmb3JlCiAgICAgICAgLy8gICAgIHRoaXMgZ2V0dGVyIGlzIGNhbGxlZCwgZm9yIGxlZ2FjeSBlbGVtZW50cyB0aGlzIGNvdWxkIGJlIGZyb20gYQogICAgICAgIC8vICAgICBfdGVtcGxhdGUgZmllbGQgb24gdGhlIGluZm8gb2JqZWN0IHBhc3NlZCB0byBQb2x5bWVyKCksIGEgYmVoYXZpb3IsCiAgICAgICAgLy8gICAgIG9yIHNldCBpbiByZWdpc3RlcmVkKCk7IG9uY2UgdGhlIHN0YXRpYyBnZXR0ZXIgcnVucywgYSBjbG9uZSBvZiBpdAogICAgICAgIC8vICAgICB3aWxsIG92ZXJ3cml0ZSBpdCBvbiB0aGUgcHJvdG90eXBlIGFzIHRoZSB3b3JraW5nIHRlbXBsYXRlLgogICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfdGVtcGxhdGUnLCB0aGlzKSkpIHsKICAgICAgICAgIHRoaXMuX3RlbXBsYXRlID0KICAgICAgICAgICAgLy8gSWYgdXNlciBoYXMgcHV0IHRlbXBsYXRlIG9uIHByb3RvdHlwZSAoZS5nLiBpbiBsZWdhY3kgdmlhIHJlZ2lzdGVyZWQKICAgICAgICAgICAgLy8gY2FsbGJhY2sgb3IgaW5mbyBvYmplY3QpLCBwcmVmZXIgdGhhdCBmaXJzdAogICAgICAgICAgICB0aGlzLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfdGVtcGxhdGUnLCB0aGlzLnByb3RvdHlwZSkpID8KICAgICAgICAgICAgdGhpcy5wcm90b3R5cGUuX3RlbXBsYXRlIDoKICAgICAgICAgICAgLy8gTG9vayBpbiBkb20tbW9kdWxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVsZW1lbnQncyBpcwogICAgICAgICAgICAoZ2V0VGVtcGxhdGVGcm9tRG9tTW9kdWxlKC8qKiBAdHlwZSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0qLyAodGhpcykuaXMpIHx8CiAgICAgICAgICAgIC8vIE5leHQgbG9vayBmb3Igc3VwZXJjbGFzcyB0ZW1wbGF0ZSAoY2FsbCB0aGUgc3VwZXIgaW1wbCB0aGlzCiAgICAgICAgICAgIC8vIHdheSBzbyB0aGF0IGB0aGlzYCBwb2ludHMgdG8gdGhlIHN1cGVyY2xhc3MpCiAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZigvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9Ki8gKHRoaXMpLnByb3RvdHlwZSkuY29uc3RydWN0b3IudGVtcGxhdGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTZXQgdGhlIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fHN0cmluZ30gdmFsdWUgVGVtcGxhdGUgdG8gc2V0LgogICAgICAgKi8KICAgICAgc3RhdGljIHNldCB0ZW1wbGF0ZSh2YWx1ZSkgewogICAgICAgIHRoaXMuX3RlbXBsYXRlID0gdmFsdWU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXRoIG1hdGNoaW5nIHRoZSB1cmwgZnJvbSB3aGljaCB0aGUgZWxlbWVudCB3YXMgaW1wb3J0ZWQuCiAgICAgICAqCiAgICAgICAqIFRoaXMgcGF0aCBpcyB1c2VkIHRvIHJlc29sdmUgdXJsJ3MgaW4gdGVtcGxhdGUgc3R5bGUgY3NzVGV4dC4KICAgICAgICogVGhlIGBpbXBvcnRQYXRoYCBwcm9wZXJ0eSBpcyBhbHNvIHNldCBvbiBlbGVtZW50IGluc3RhbmNlcyBhbmQgY2FuIGJlCiAgICAgICAqIHVzZWQgdG8gY3JlYXRlIGJpbmRpbmdzIHJlbGF0aXZlIHRvIHRoZSBpbXBvcnQgcGF0aC4KICAgICAgICoKICAgICAgICogRm9yIGVsZW1lbnRzIGRlZmluZWQgaW4gRVMgbW9kdWxlcywgdXNlcnMgc2hvdWxkIGltcGxlbWVudAogICAgICAgKiBgc3RhdGljIGdldCBpbXBvcnRNZXRhKCkgeyByZXR1cm4gaW1wb3J0Lm1ldGE7IH1gLCBhbmQgdGhlIGRlZmF1bHQKICAgICAgICogaW1wbGVtZW50YXRpb24gb2YgYGltcG9ydFBhdGhgIHdpbGwgIHJldHVybiBgaW1wb3J0Lm1ldGEudXJsYCdzIHBhdGguCiAgICAgICAqIEZvciBlbGVtZW50cyBkZWZpbmVkIGluIEhUTUwgaW1wb3J0cywgdGhpcyBnZXR0ZXIgd2lsbCByZXR1cm4gdGhlIHBhdGgKICAgICAgICogdG8gdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgYSBgZG9tLW1vZHVsZWAgZWxlbWVudCBtYXRjaGluZyB0aGlzCiAgICAgICAqIGVsZW1lbnQncyBzdGF0aWMgYGlzYCBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogTm90ZSwgdGhpcyBwYXRoIHNob3VsZCBjb250YWluIGEgdHJhaWxpbmcgYC9gLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbXBvcnQgcGF0aCBmb3IgdGhpcyBlbGVtZW50IGNsYXNzCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9CiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IGltcG9ydFBhdGgoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19pbXBvcnRQYXRoJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5pbXBvcnRNZXRhOwogICAgICAgICAgaWYgKG1ldGEpIHsKICAgICAgICAgICAgdGhpcy5faW1wb3J0UGF0aCA9IFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybChtZXRhLnVybCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBQb2x5bWVyLkRvbU1vZHVsZSAmJiBQb2x5bWVyLkRvbU1vZHVsZS5pbXBvcnQoLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSAqLyAodGhpcykuaXMpOwogICAgICAgICAgICB0aGlzLl9pbXBvcnRQYXRoID0gKG1vZHVsZSAmJiBtb2R1bGUuYXNzZXRwYXRoKSB8fAogICAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZigvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9Ki8gKHRoaXMpLnByb3RvdHlwZSkuY29uc3RydWN0b3IuaW1wb3J0UGF0aDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2ltcG9ydFBhdGg7CiAgICAgIH0KCiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50fSAqLwogICAgICAgIHRoaXMuX3RlbXBsYXRlOwogICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLwogICAgICAgIHRoaXMuX2ltcG9ydFBhdGg7CiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgdGhpcy5yb290UGF0aDsKICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgICB0aGlzLmltcG9ydFBhdGg7CiAgICAgICAgLyoqIEB0eXBlIHtTdGFtcGVkVGVtcGxhdGUgfCBIVE1MRWxlbWVudCB8IFNoYWRvd1Jvb3R9ICovCiAgICAgICAgdGhpcy5yb290OwogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdDxzdHJpbmcsICFFbGVtZW50Pn0gKi8KICAgICAgICB0aGlzLiQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgIHRvIGVuc3VyZSBjbGFzcwogICAgICAgKiBtZXRhcHJvZ3JhbW1pbmcgcmVsYXRlZCB0byBwcm9wZXJ0eSBhY2Nlc3NvcnMgYW5kIGVmZmVjdHMgaGFzCiAgICAgICAqIGNvbXBsZXRlZCAoY2FsbHMgYGZpbmFsaXplYCkuCiAgICAgICAqCiAgICAgICAqIEl0IGFsc28gaW5pdGlhbGl6ZXMgYW55IHByb3BlcnR5IGRlZmF1bHRzIHByb3ZpZGVkIHZpYSBgdmFsdWVgIGluCiAgICAgICAqIGBwcm9wZXJ0aWVzYCBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIHRoaXMuY29uc3RydWN0b3IuZmluYWxpemUoKTsKICAgICAgICAvLyBub3RlOiBmaW5hbGl6ZSB0ZW1wbGF0ZSB3aGVuIHdlIGhhdmUgYWNjZXNzIHRvIGBsb2NhbE5hbWVgIHRvCiAgICAgICAgLy8gYXZvaWQgZGVwZW5kZW5jZSBvbiBgaXNgIGZvciBwb2x5ZmlsbGluZyBzdHlsaW5nLgogICAgICAgIHRoaXMuY29uc3RydWN0b3IuX2ZpbmFsaXplVGVtcGxhdGUoLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKHRoaXMpLmxvY2FsTmFtZSk7CiAgICAgICAgc3VwZXIuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgICAgLy8gc2V0IHBhdGggZGVmYXVsdHMKICAgICAgICB0aGlzLnJvb3RQYXRoID0gUG9seW1lci5yb290UGF0aDsKICAgICAgICB0aGlzLmltcG9ydFBhdGggPSB0aGlzLmNvbnN0cnVjdG9yLmltcG9ydFBhdGg7CiAgICAgICAgLy8gYXBwbHkgcHJvcGVydHkgZGVmYXVsdHMuLi4KICAgICAgICBsZXQgcCQgPSBwcm9wZXJ0eURlZmF1bHRzKHRoaXMuY29uc3RydWN0b3IpOwogICAgICAgIGlmICghcCQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgcCBpbiBwJCkgewogICAgICAgICAgbGV0IGluZm8gPSBwJFtwXTsKICAgICAgICAgIC8vIERvbid0IHNldCBkZWZhdWx0IHZhbHVlIGlmIHRoZXJlIGlzIGFscmVhZHkgYW4gb3duIHByb3BlcnR5LCB3aGljaAogICAgICAgICAgLy8gaGFwcGVucyB3aGVuIGEgYHByb3BlcnRpZXNgIHByb3BlcnR5IHdpdGggZGVmYXVsdCBidXQgbm8gZWZmZWN0cyBoYWQKICAgICAgICAgIC8vIGEgcHJvcGVydHkgc2V0IChlLmcuIGJvdW5kKSBieSBpdHMgaG9zdCBiZWZvcmUgdXBncmFkZQogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KHApKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHR5cGVvZiBpbmZvLnZhbHVlID09ICdmdW5jdGlvbicgPwogICAgICAgICAgICAgIGluZm8udmFsdWUuY2FsbCh0aGlzKSA6CiAgICAgICAgICAgICAgaW5mby52YWx1ZTsKICAgICAgICAgICAgLy8gU2V0IHZpYSBgX3NldFByb3BlcnR5YCBpZiB0aGVyZSBpcyBhbiBhY2Nlc3NvciwgdG8gZW5hYmxlCiAgICAgICAgICAgIC8vIGluaXRpYWxpemluZyByZWFkT25seSBwcm9wZXJ0eSBkZWZhdWx0cwogICAgICAgICAgICBpZiAodGhpcy5faGFzQWNjZXNzb3IocCkpIHsKICAgICAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkocCwgdmFsdWUsIHRydWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXNbcF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEdhdGhlciBzdHlsZSB0ZXh0IGZvciBhIHN0eWxlIGVsZW1lbnQgaW4gdGhlIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY3NzVGV4dCBUZXh0IGNvbnRhaW5pbmcgc3R5bGluZyB0byBwcm9jZXNzCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlYmFzZSBDU1MgcGF0aHMgYWdhaW5zdAogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwcm9jZXNzZWQgQ1NTIHRleHQKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIF9wcm9jZXNzU3R5bGVUZXh0KGNzc1RleHQsIGJhc2VVUkkpIHsKICAgICAgICByZXR1cm4gUG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVDc3MoY3NzVGV4dCwgYmFzZVVSSSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAqIENvbmZpZ3VyZXMgYW4gZWxlbWVudCBgcHJvdG9gIHRvIGZ1bmN0aW9uIHdpdGggYSBnaXZlbiBgdGVtcGxhdGVgLgogICAgICAqIFRoZSBlbGVtZW50IG5hbWUgYGlzYCBhbmQgZXh0ZW5kcyBgZXh0YCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgU2hhZHlDU1MKICAgICAgKiBzdHlsZSBzY29waW5nLgogICAgICAqCiAgICAgICogQHBhcmFtIHtzdHJpbmd9IGlzIFRhZyBuYW1lIChvciB0eXBlIGV4dGVuc2lvbiBuYW1lKSBmb3IgdGhpcyBlbGVtZW50CiAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICovCiAgICAgIHN0YXRpYyBfZmluYWxpemVUZW1wbGF0ZShpcykgewogICAgICAgIC8qKiBAY29uc3Qge0hUTUxUZW1wbGF0ZUVsZW1lbnR9ICovCiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLnByb3RvdHlwZS5fdGVtcGxhdGU7CiAgICAgICAgaWYgKHRlbXBsYXRlICYmICF0ZW1wbGF0ZS5fX3BvbHltZXJGaW5hbGl6ZWQpIHsKICAgICAgICAgIHRlbXBsYXRlLl9fcG9seW1lckZpbmFsaXplZCA9IHRydWU7CiAgICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gdGhpcy5pbXBvcnRQYXRoOwogICAgICAgICAgY29uc3QgYmFzZVVSSSA9IGltcG9ydFBhdGggPyBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybChpbXBvcnRQYXRoKSA6ICcnOwogICAgICAgICAgLy8gZS5nLiBzdXBwb3J0IGBpbmNsdWRlPSJtb2R1bGUtbmFtZSJgLCBhbmQgU2hhZHlDU1MKICAgICAgICAgIHByb2Nlc3NFbGVtZW50U3R5bGVzKHRoaXMsIHRlbXBsYXRlLCBpcywgYmFzZVVSSSk7CiAgICAgICAgICB0aGlzLnByb3RvdHlwZS5fYmluZFRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN0YW5kYXJkIEN1c3RvbSBFbGVtZW50cwogICAgICAgKiBgY29ubmVjdGVkQ2FsbGJhY2tgLgogICAgICAgKgogICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBlbmFibGVzIHRoZSBwcm9wZXJ0eSBlZmZlY3RzIHN5c3RlbSBhbmQKICAgICAgICogZmx1c2hlcyBhbnkgcGVuZGluZyBwcm9wZXJ0aWVzLCBhbmQgdXBkYXRlcyBzaGltbWVkIENTUyBwcm9wZXJ0aWVzCiAgICAgICAqIHdoZW4gdXNpbmcgdGhlIFNoYWR5Q1NTIHNjb3BpbmcvY3VzdG9tIHByb3BlcnRpZXMgcG9seWZpbGwuCiAgICAgICAqCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXMsIGludmFsaWRDYXN0c30gU3VwZXIgbWF5IG9yIG1heSBub3QgaW1wbGVtZW50IHRoZSBjYWxsYmFjawogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUyAmJiB0aGlzLl90ZW1wbGF0ZSkgewogICAgICAgICAgd2luZG93LlNoYWR5Q1NTLnN0eWxlRWxlbWVudCgvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcykpOwogICAgICAgIH0KICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU3RhbXBzIHRoZSBlbGVtZW50IHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIHJlYWR5KCkgewogICAgICAgIGlmICh0aGlzLl90ZW1wbGF0ZSkgewogICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5fc3RhbXBUZW1wbGF0ZSh0aGlzLl90ZW1wbGF0ZSk7CiAgICAgICAgICB0aGlzLiQgPSB0aGlzLnJvb3QuJDsKICAgICAgICB9CiAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgYFByb3BlcnR5RWZmZWN0c2AncyBgX3JlYWR5Q2xpZW50c2AgY2FsbC4gQXR0YWNoZXMKICAgICAgICogZWxlbWVudCBkb20gYnkgY2FsbGluZyBgX2F0dGFjaERvbWAgd2l0aCB0aGUgZG9tIHN0YW1wZWQgZnJvbSB0aGUKICAgICAgICogZWxlbWVudCdzIHRlbXBsYXRlIHZpYSBgX3N0YW1wVGVtcGxhdGVgLiBOb3RlIHRoYXQgdGhpcyBhbGxvd3MKICAgICAgICogY2xpZW50IGRvbSB0byBiZSBhdHRhY2hlZCB0byB0aGUgZWxlbWVudCBwcmlvciB0byBhbnkgb2JzZXJ2ZXJzCiAgICAgICAqIHJ1bm5pbmcuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgX3JlYWR5Q2xpZW50cygpIHsKICAgICAgICBpZiAodGhpcy5fdGVtcGxhdGUpIHsKICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMuX2F0dGFjaERvbSgvKiogQHR5cGUge1N0YW1wZWRUZW1wbGF0ZX0gKi8odGhpcy5yb290KSk7CiAgICAgICAgfQogICAgICAgIC8vIFRoZSBzdXBlci5fcmVhZHlDbGllbnRzIGhlcmUgc2V0cyB0aGUgY2xpZW50cyBpbml0aWFsaXplZCBmbGFnLgogICAgICAgIC8vIFdlIG11c3Qgd2FpdCB0byBkbyB0aGlzIHVudGlsIGFmdGVyIGNsaWVudCBkb20gaXMgY3JlYXRlZC9hdHRhY2hlZAogICAgICAgIC8vIHNvIHRoYXQgdGhpcyBmbGFnIGNhbiBiZSBjaGVja2VkIHRvIHByZXZlbnQgbm90aWZpY2F0aW9ucyBmaXJlZAogICAgICAgIC8vIGR1cmluZyB0aGlzIHByb2Nlc3MgZnJvbSBiZWluZyBoYW5kbGVkIGJlZm9yZSBjbGllbnRzIGFyZSByZWFkeS4KICAgICAgICBzdXBlci5fcmVhZHlDbGllbnRzKCk7CiAgICAgIH0KCgogICAgICAvKioKICAgICAgICogQXR0YWNoZXMgYW4gZWxlbWVudCdzIHN0YW1wZWQgZG9tIHRvIGl0c2VsZi4gQnkgZGVmYXVsdCwKICAgICAgICogdGhpcyBtZXRob2QgY3JlYXRlcyBhIGBzaGFkb3dSb290YCBhbmQgYWRkcyB0aGUgZG9tIHRvIGl0LgogICAgICAgKiBIb3dldmVyLCB0aGlzIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbiB0byBhbGxvdyBhbiBlbGVtZW50CiAgICAgICAqIHRvIHB1dCBpdHMgZG9tIGluIGFub3RoZXIgbG9jYXRpb24uCiAgICAgICAqCiAgICAgICAqIEB0aHJvd3Mge0Vycm9yfQogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdSZXR1cm59CiAgICAgICAqIEBwYXJhbSB7U3RhbXBlZFRlbXBsYXRlfSBkb20gdG8gYXR0YWNoIHRvIHRoZSBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHtTaGFkb3dSb290fSBub2RlIHRvIHdoaWNoIHRoZSBkb20gaGFzIGJlZW4gYXR0YWNoZWQuCiAgICAgICAqLwogICAgICBfYXR0YWNoRG9tKGRvbSkgewogICAgICAgIGlmICh0aGlzLmF0dGFjaFNoYWRvdykgewogICAgICAgICAgaWYgKGRvbSkgewogICAgICAgICAgICBpZiAoIXRoaXMuc2hhZG93Um9vdCkgewogICAgICAgICAgICAgIHRoaXMuYXR0YWNoU2hhZG93KHttb2RlOiAnb3Blbid9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoZG9tKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NoYWRvd0RPTSBub3QgYXZhaWxhYmxlLiAnICsKICAgICAgICAgICAgLy8gVE9ETyhzb3J2ZWxsKTogbW92ZSB0byBjb21waWxlLXRpbWUgY29uZGl0aW9uYWwgd2hlbiBzdXBwb3J0ZWQKICAgICAgICAgICdQb2x5bWVyLkVsZW1lbnQgY2FuIGNyZWF0ZSBkb20gYXMgY2hpbGRyZW4gaW5zdGVhZCBvZiBpbiAnICsKICAgICAgICAgICdTaGFkb3dET00gYnkgc2V0dGluZyBgdGhpcy5yb290ID0gdGhpcztcYCBiZWZvcmUgXGByZWFkeVxgLicpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFdoZW4gdXNpbmcgdGhlIFNoYWR5Q1NTIHNjb3BpbmcgYW5kIGN1c3RvbSBwcm9wZXJ0eSBzaGltLCBjYXVzZXMgYWxsCiAgICAgICAqIHNoaW1tZWQgc3R5bGVzIGluIHRoaXMgZWxlbWVudCAoYW5kIGl0cyBzdWJ0cmVlKSB0byBiZSB1cGRhdGVkCiAgICAgICAqIGJhc2VkIG9uIGN1cnJlbnQgY3VzdG9tIHByb3BlcnR5IHZhbHVlcy4KICAgICAgICoKICAgICAgICogVGhlIG9wdGlvbmFsIHBhcmFtZXRlciBvdmVycmlkZXMgaW5saW5lIGN1c3RvbSBwcm9wZXJ0eSBzdHlsZXMgd2l0aCBhbgogICAgICAgKiBvYmplY3Qgb2YgcHJvcGVydGllcyB3aGVyZSB0aGUga2V5cyBhcmUgQ1NTIHByb3BlcnRpZXMsIGFuZCB0aGUgdmFsdWVzCiAgICAgICAqIGFyZSBzdHJpbmdzLgogICAgICAgKgogICAgICAgKiBFeGFtcGxlOiBgdGhpcy51cGRhdGVTdHlsZXMoeyctLWNvbG9yJzogJ2JsdWUnfSlgCiAgICAgICAqCiAgICAgICAqIFRoZXNlIHByb3BlcnRpZXMgYXJlIHJldGFpbmVkIHVubGVzcyBhIHZhbHVlIG9mIGBudWxsYCBpcyBzZXQuCiAgICAgICAqCiAgICAgICAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCB1cGRhdGluZyBDU1MgbWl4aW5zLgogICAgICAgKiBZb3UgY2FuIG5vdCBkeW5hbWljYWxseSBjaGFuZ2UgdGhlIHZhbHVlIG9mIGFuIGBAYXBwbHlgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BlcnRpZXMgQmFnIG9mIGN1c3RvbSBwcm9wZXJ0eSBrZXkvdmFsdWVzIHRvCiAgICAgICAqICAgYXBwbHkgdG8gdGhpcyBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAgICovCiAgICAgIHVwZGF0ZVN0eWxlcyhwcm9wZXJ0aWVzKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUykgewogICAgICAgICAgd2luZG93LlNoYWR5Q1NTLnN0eWxlU3VidHJlZSgvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcyksIHByb3BlcnRpZXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJld3JpdGVzIGEgZ2l2ZW4gVVJMIHJlbGF0aXZlIHRvIGEgYmFzZSBVUkwuIFRoZSBiYXNlIFVSTCBkZWZhdWx0cyB0bwogICAgICAgKiB0aGUgb3JpZ2luYWwgbG9jYXRpb24gb2YgdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhlIGBkb20tbW9kdWxlYCBmb3IKICAgICAgICogdGhpcyBlbGVtZW50LiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgc2FtZSBVUkwgYmVmb3JlIGFuZCBhZnRlcgogICAgICAgKiBidW5kbGluZy4KICAgICAgICoKICAgICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbm8gcmVzb2x1dGlvbiBmb3IgVVJMcyB0aGF0IHN0YXJ0CiAgICAgICAqIHdpdGggYC9gIChhYnNvbHV0ZSBVUkxzKSBvciBgI2AgKGhhc2ggaWRlbnRpZmllcnMpLiAgRm9yIGdlbmVyYWwgcHVycG9zZQogICAgICAgKiBVUkwgcmVzb2x1dGlvbiwgdXNlIGB3aW5kb3cuVVJMYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgdG8gcmVzb2x2ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBiYXNlIE9wdGlvbmFsIGJhc2UgVVJMIHRvIHJlc29sdmUgYWdhaW5zdCwgZGVmYXVsdHMKICAgICAgICogdG8gdGhlIGVsZW1lbnQncyBgaW1wb3J0UGF0aGAKICAgICAgICogQHJldHVybiB7c3RyaW5nfSBSZXdyaXR0ZW4gVVJMIHJlbGF0aXZlIHRvIGJhc2UKICAgICAgICovCiAgICAgIHJlc29sdmVVcmwodXJsLCBiYXNlKSB7CiAgICAgICAgaWYgKCFiYXNlICYmIHRoaXMuaW1wb3J0UGF0aCkgewogICAgICAgICAgYmFzZSA9IFBvbHltZXIuUmVzb2x2ZVVybC5yZXNvbHZlVXJsKHRoaXMuaW1wb3J0UGF0aCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybCh1cmwsIGJhc2UpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQcm9wZXJ0eUFjY2Vzc29yc2AgdG8gYWRkIG1hcCBvZiBkeW5hbWljIGZ1bmN0aW9ucyBvbgogICAgICAgKiB0ZW1wbGF0ZSBpbmZvLCBmb3IgY29uc3VtcHRpb24gYnkgYFByb3BlcnR5RWZmZWN0c2AgdGVtcGxhdGUgYmluZGluZwogICAgICAgKiBjb2RlLiBUaGlzIG1hcCBkZXRlcm1pbmVzIHdoaWNoIG1ldGhvZCB0ZW1wbGF0ZXMgc2hvdWxkIGhhdmUgYWNjZXNzb3JzCiAgICAgICAqIGNyZWF0ZWQgZm9yIHRoZW0uCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNvbnRlbnQodGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICB0ZW1wbGF0ZUluZm8uZHluYW1pY0ZucyA9IHRlbXBsYXRlSW5mby5keW5hbWljRm5zIHx8IHRoaXMuX3Byb3BlcnRpZXM7CiAgICAgICAgcmV0dXJuIHN1cGVyLl9wYXJzZVRlbXBsYXRlQ29udGVudCh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbyk7CiAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIFBvbHltZXJFbGVtZW50OwogIH0pOwoKICAvKioKICAgKiBXaGVuIHVzaW5nIHRoZSBTaGFkeUNTUyBzY29waW5nIGFuZCBjdXN0b20gcHJvcGVydHkgc2hpbSwgY2F1c2VzIGFsbAogICAqIHNoaW1tZWQgYHN0eWxlc2AgKHZpYSBgY3VzdG9tLXN0eWxlYCkgaW4gdGhlIGRvY3VtZW50IChhbmQgaXRzIHN1YnRyZWUpCiAgICogdG8gYmUgdXBkYXRlZCBiYXNlZCBvbiBjdXJyZW50IGN1c3RvbSBwcm9wZXJ0eSB2YWx1ZXMuCiAgICoKICAgKiBUaGUgb3B0aW9uYWwgcGFyYW1ldGVyIG92ZXJyaWRlcyBpbmxpbmUgY3VzdG9tIHByb3BlcnR5IHN0eWxlcyB3aXRoIGFuCiAgICogb2JqZWN0IG9mIHByb3BlcnRpZXMgd2hlcmUgdGhlIGtleXMgYXJlIENTUyBwcm9wZXJ0aWVzLCBhbmQgdGhlIHZhbHVlcwogICAqIGFyZSBzdHJpbmdzLgogICAqCiAgICogRXhhbXBsZTogYFBvbHltZXIudXBkYXRlU3R5bGVzKHsnLS1jb2xvcic6ICdibHVlJ30pYAogICAqCiAgICogVGhlc2UgcHJvcGVydGllcyBhcmUgcmV0YWluZWQgdW5sZXNzIGEgdmFsdWUgb2YgYG51bGxgIGlzIHNldC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0PX0gcHJvcHMgQmFnIG9mIGN1c3RvbSBwcm9wZXJ0eSBrZXkvdmFsdWVzIHRvCiAgICogICBhcHBseSB0byB0aGUgZG9jdW1lbnQuCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnVwZGF0ZVN0eWxlcyA9IGZ1bmN0aW9uKHByb3BzKSB7CiAgICBpZiAod2luZG93LlNoYWR5Q1NTKSB7CiAgICAgIHdpbmRvdy5TaGFkeUNTUy5zdHlsZURvY3VtZW50KHByb3BzKTsKICAgIH0KICB9OwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBAc3VtbWFyeSBDb2xsYXBzZSBtdWx0aXBsZSBjYWxsYmFja3MgaW50byBvbmUgaW52b2NhdGlvbiBhZnRlciBhIHRpbWVyLgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgY2xhc3MgRGVib3VuY2VyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICB0aGlzLl9hc3luY01vZHVsZSA9IG51bGw7CiAgICAgIHRoaXMuX2NhbGxiYWNrID0gbnVsbDsKICAgICAgdGhpcy5fdGltZXIgPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBzY2hlZHVsZXI7IHRoYXQgaXMsIGEgbW9kdWxlIHdpdGggdGhlIEFzeW5jIGludGVyZmFjZSwKICAgICAqIGEgY2FsbGJhY2sgYW5kIG9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIHJ1biBmdW5jdGlvbgogICAgICogZnJvbSB0aGUgYXN5bmMgbW9kdWxlLgogICAgICoKICAgICAqIEBwYXJhbSB7IUFzeW5jSW50ZXJmYWNlfSBhc3luY01vZHVsZSBPYmplY3Qgd2l0aCBBc3luYyBpbnRlcmZhY2UuCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIENhbGxiYWNrIHRvIHJ1bi4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHNldENvbmZpZyhhc3luY01vZHVsZSwgY2FsbGJhY2spIHsKICAgICAgdGhpcy5fYXN5bmNNb2R1bGUgPSBhc3luY01vZHVsZTsKICAgICAgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICAgdGhpcy5fdGltZXIgPSB0aGlzLl9hc3luY01vZHVsZS5ydW4oKCkgPT4gewogICAgICAgIHRoaXMuX3RpbWVyID0gbnVsbDsKICAgICAgICB0aGlzLl9jYWxsYmFjaygpOwogICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQ2FuY2VscyBhbiBhY3RpdmUgZGVib3VuY2VyIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGl0c2VsZi4KICAgICAqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBjYW5jZWwoKSB7CiAgICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHsKICAgICAgICB0aGlzLl9hc3luY01vZHVsZS5jYW5jZWwodGhpcy5fdGltZXIpOwogICAgICAgIHRoaXMuX3RpbWVyID0gbnVsbDsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBGbHVzaGVzIGFuIGFjdGl2ZSBkZWJvdW5jZXIgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gaXRzZWxmLgogICAgICoKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGZsdXNoKCkgewogICAgICBpZiAodGhpcy5pc0FjdGl2ZSgpKSB7CiAgICAgICAgdGhpcy5jYW5jZWwoKTsKICAgICAgICB0aGlzLl9jYWxsYmFjaygpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVib3VuY2VyIGlzIGFjdGl2ZS4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFjdGl2ZS4KICAgICAqLwogICAgaXNBY3RpdmUoKSB7CiAgICAgIHJldHVybiB0aGlzLl90aW1lciAhPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgZGVib3VuY2VyIGlmIG5vIGRlYm91bmNlciBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIKICAgICAqIG9yIGl0IGNhbmNlbHMgYW4gYWN0aXZlIGRlYm91bmNlciBvdGhlcndpc2UuIFRoZSBmb2xsb3dpbmcKICAgICAqIGV4YW1wbGUgc2hvd3MgaG93IGEgZGVib3VuY2VyIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIGEKICAgICAqIG1pY3JvdGFzayBhbmQgImRlYm91bmNlZCIgc3VjaCB0aGF0IHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiBpcwogICAgICogY2FsbGVkIG9uY2UuIEFkZCB0aGlzIG1ldGhvZCB0byBhIGN1c3RvbSBlbGVtZW50OgogICAgICoKICAgICAqIF9kZWJvdW5jZVdvcmsoKSB7CiAgICAgKiAgIHRoaXMuX2RlYm91bmNlSm9iID0gUG9seW1lci5EZWJvdW5jZXIuZGVib3VuY2UodGhpcy5fZGVib3VuY2VKb2IsCiAgICAgKiAgICAgICBQb2x5bWVyLkFzeW5jLm1pY3JvVGFzaywgKCkgPT4gewogICAgICogICAgIHRoaXMuX2RvV29yaygpOwogICAgICogICB9KTsKICAgICAqIH0KICAgICAqCiAgICAgKiBJZiB0aGUgYF9kZWJvdW5jZVdvcmtgIG1ldGhvZCBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lCiAgICAgKiBtaWNyb3Rhc2ssIHRoZSBgX2RvV29ya2AgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlIGF0IHRoZSBuZXh0CiAgICAgKiBtaWNyb3Rhc2sgY2hlY2twb2ludC4KICAgICAqCiAgICAgKiBOb3RlOiBJbiB0ZXN0aW5nIGl0IGlzIG9mdGVuIGNvbnZlbmllbnQgdG8gYXZvaWQgYXN5bmNocm9ueS4gVG8gYWNjb21wbGlzaAogICAgICogdGhpcyB3aXRoIGEgZGVib3VuY2VyLCB5b3UgY2FuIHVzZSBgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyYCBhbmQKICAgICAqIGBQb2x5bWVyLmZsdXNoYC4gRm9yIGV4YW1wbGUsIGV4dGVuZCB0aGUgYWJvdmUgZXhhbXBsZSBieSBhZGRpbmcKICAgICAqIGBQb2x5bWVyLmVucXVldWVEZWJvdW5jZXIodGhpcy5fZGVib3VuY2VKb2IpYCBhdCB0aGUgZW5kIG9mIHRoZQogICAgICogYF9kZWJvdW5jZVdvcmtgIG1ldGhvZC4gVGhlbiBpbiBhIHRlc3QsIGNhbGwgYFBvbHltZXIuZmx1c2hgIHRvIGVuc3VyZQogICAgICogdGhlIGRlYm91bmNlciBoYXMgY29tcGxldGVkLgogICAgICoKICAgICAqIEBwYXJhbSB7RGVib3VuY2VyP30gZGVib3VuY2VyIERlYm91bmNlciBvYmplY3QuCiAgICAgKiBAcGFyYW0geyFBc3luY0ludGVyZmFjZX0gYXN5bmNNb2R1bGUgT2JqZWN0IHdpdGggQXN5bmMgaW50ZXJmYWNlCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIENhbGxiYWNrIHRvIHJ1bi4KICAgICAqIEByZXR1cm4geyFEZWJvdW5jZXJ9IFJldHVybnMgYSBkZWJvdW5jZXIgb2JqZWN0LgogICAgICovCiAgICBzdGF0aWMgZGVib3VuY2UoZGVib3VuY2VyLCBhc3luY01vZHVsZSwgY2FsbGJhY2spIHsKICAgICAgaWYgKGRlYm91bmNlciBpbnN0YW5jZW9mIERlYm91bmNlcikgewogICAgICAgIGRlYm91bmNlci5jYW5jZWwoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkZWJvdW5jZXIgPSBuZXcgRGVib3VuY2VyKCk7CiAgICAgIH0KICAgICAgZGVib3VuY2VyLnNldENvbmZpZyhhc3luY01vZHVsZSwgY2FsbGJhY2spOwogICAgICByZXR1cm4gZGVib3VuY2VyOwogICAgfQogIH0KCiAgLyoqIEBjb25zdCAqLwogIFBvbHltZXIuRGVib3VuY2VyID0gRGVib3VuY2VyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvLyBkZXRlY3QgbmF0aXZlIHRvdWNoIGFjdGlvbiBzdXBwb3J0CiAgbGV0IEhBU19OQVRJVkVfVEEgPSB0eXBlb2YgZG9jdW1lbnQuaGVhZC5zdHlsZS50b3VjaEFjdGlvbiA9PT0gJ3N0cmluZyc7CiAgbGV0IEdFU1RVUkVfS0VZID0gJ19fcG9seW1lckdlc3R1cmVzJzsKICBsZXQgSEFORExFRF9PQkogPSAnX19wb2x5bWVyR2VzdHVyZXNIYW5kbGVkJzsKICBsZXQgVE9VQ0hfQUNUSU9OID0gJ19fcG9seW1lckdlc3R1cmVzVG91Y2hBY3Rpb24nOwogIC8vIHJhZGl1cyBmb3IgdGFwIGFuZCB0cmFjawogIGxldCBUQVBfRElTVEFOQ0UgPSAyNTsKICBsZXQgVFJBQ0tfRElTVEFOQ0UgPSA1OwogIC8vIG51bWJlciBvZiBsYXN0IE4gdHJhY2sgcG9zaXRpb25zIHRvIGtlZXAKICBsZXQgVFJBQ0tfTEVOR1RIID0gMjsKCiAgLy8gRGlzYWJsaW5nICJtb3VzZSIgaGFuZGxlcnMgZm9yIDI1MDBtcyBpcyBlbm91Z2gKICBsZXQgTU9VU0VfVElNRU9VVCA9IDI1MDA7CiAgbGV0IE1PVVNFX0VWRU5UUyA9IFsnbW91c2Vkb3duJywgJ21vdXNlbW92ZScsICdtb3VzZXVwJywgJ2NsaWNrJ107CiAgLy8gYW4gYXJyYXkgb2YgYml0bWFzayB2YWx1ZXMgZm9yIG1hcHBpbmcgTW91c2VFdmVudC53aGljaCB0byBNb3VzZUV2ZW50LmJ1dHRvbnMKICBsZXQgTU9VU0VfV0hJQ0hfVE9fQlVUVE9OUyA9IFswLCAxLCA0LCAyXTsKICBsZXQgTU9VU0VfSEFTX0JVVFRPTlMgPSAoZnVuY3Rpb24oKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gbmV3IE1vdXNlRXZlbnQoJ3Rlc3QnLCB7YnV0dG9uczogMX0pLmJ1dHRvbnMgPT09IDE7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9KSgpOwoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBQb3NzaWJsZSBtb3VzZSBldmVudCBuYW1lCiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBtb3VzZSBldmVudCwgZmFsc2UgaWYgbm90CiAgICovCiAgZnVuY3Rpb24gaXNNb3VzZUV2ZW50KG5hbWUpIHsKICAgIHJldHVybiBNT1VTRV9FVkVOVFMuaW5kZXhPZihuYW1lKSA+IC0xOwogIH0KCiAgLyogZXNsaW50IG5vLWVtcHR5OiBbImVycm9yIiwgeyAiYWxsb3dFbXB0eUNhdGNoIjogdHJ1ZSB9XSAqLwogIC8vIGNoZWNrIGZvciBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycwogIGxldCBTVVBQT1JUU19QQVNTSVZFID0gZmFsc2U7CiAgKGZ1bmN0aW9uKCkgewogICAgdHJ5IHsKICAgICAgbGV0IG9wdHMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywge2dldCgpIHtTVVBQT1JUU19QQVNTSVZFID0gdHJ1ZTt9fSk7CiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7CiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7CiAgICB9IGNhdGNoKGUpIHt9CiAgfSkoKTsKCiAgLyoqCiAgICogR2VuZXJhdGUgc2V0dGluZ3MgZm9yIGV2ZW50IGxpc3RlbmVycywgZGVwZW5kYW50IG9uIGBQb2x5bWVyLnBhc3NpdmVUb3VjaEdlc3R1cmVzYAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBFdmVudCBuYW1lIHRvIGRldGVybWluZSBpZiBge3Bhc3NpdmV9YCBvcHRpb24gaXMgbmVlZGVkCiAgICogQHJldHVybiB7e3Bhc3NpdmU6IGJvb2xlYW59IHwgdW5kZWZpbmVkfSBPcHRpb25zIHRvIHVzZSBmb3IgYWRkRXZlbnRMaXN0ZW5lciBhbmQgcmVtb3ZlRXZlbnRMaXN0ZW5lcgogICAqLwogIGZ1bmN0aW9uIFBBU1NJVkVfVE9VQ0goZXZlbnROYW1lKSB7CiAgICBpZiAoaXNNb3VzZUV2ZW50KGV2ZW50TmFtZSkgfHwgZXZlbnROYW1lID09PSAndG91Y2hlbmQnKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChIQVNfTkFUSVZFX1RBICYmIFNVUFBPUlRTX1BBU1NJVkUgJiYgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcykgewogICAgICByZXR1cm4ge3Bhc3NpdmU6IHRydWV9OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuOwogICAgfQogIH0KCiAgLy8gQ2hlY2sgZm9yIHRvdWNoLW9ubHkgZGV2aWNlcwogIGxldCBJU19UT1VDSF9PTkxZID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpbb2FdZHxob25lKXxBbmRyb2lkLyk7CgogIGxldCBHZXN0dXJlUmVjb2duaXplciA9IGZ1bmN0aW9uKCl7fTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogIC8qKiBAdHlwZSB7ZnVuY3Rpb24oKTogdm9pZH0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUucmVzZXQ7CiAgLyoqIEB0eXBlIHtmdW5jdGlvbihNb3VzZUV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZH0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2Vkb3duOwogIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKE1vdXNlRXZlbnQpOiB2b2lkIHwgdW5kZWZpbmVkKX0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2Vtb3ZlOwogIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKE1vdXNlRXZlbnQpOiB2b2lkIHwgdW5kZWZpbmVkKX0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2V1cDsKICAvKiogQHR5cGUgeyhmdW5jdGlvbihUb3VjaEV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZCl9ICovCiAgR2VzdHVyZVJlY29nbml6ZXIucHJvdG90eXBlLnRvdWNoc3RhcnQ7CiAgLyoqIEB0eXBlIHsoZnVuY3Rpb24oVG91Y2hFdmVudCk6IHZvaWQgfCB1bmRlZmluZWQpfSAqLwogIEdlc3R1cmVSZWNvZ25pemVyLnByb3RvdHlwZS50b3VjaG1vdmU7CiAgLyoqIEB0eXBlIHsoZnVuY3Rpb24oVG91Y2hFdmVudCk6IHZvaWQgfCB1bmRlZmluZWQpfSAqLwogIEdlc3R1cmVSZWNvZ25pemVyLnByb3RvdHlwZS50b3VjaGVuZDsKICAvKiogQHR5cGUgeyhmdW5jdGlvbihNb3VzZUV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZCl9ICovCiAgR2VzdHVyZVJlY29nbml6ZXIucHJvdG90eXBlLmNsaWNrOwoKICAvLyBrZWVwIHRyYWNrIG9mIGFueSBsYWJlbHMgaGl0IGJ5IHRoZSBtb3VzZUNhbmNlbGxlcgogIC8qKiBAdHlwZSB7IUFycmF5PCFIVE1MTGFiZWxFbGVtZW50Pn0gKi8KICBjb25zdCBjbGlja2VkTGFiZWxzID0gW107CgogIC8qKiBAdHlwZSB7IU9iamVjdDxib29sZWFuPn0gKi8KICBjb25zdCBsYWJlbGxhYmxlID0gewogICAgJ2J1dHRvbic6IHRydWUsCiAgICAnaW5wdXQnOiB0cnVlLAogICAgJ2tleWdlbic6IHRydWUsCiAgICAnbWV0ZXInOiB0cnVlLAogICAgJ291dHB1dCc6IHRydWUsCiAgICAndGV4dGFyZWEnOiB0cnVlLAogICAgJ3Byb2dyZXNzJzogdHJ1ZSwKICAgICdzZWxlY3QnOiB0cnVlCiAgfTsKCiAgLy8gRGVmaW5lZCBhdCBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3JtLWNvbnRyb2wtaW5mcmFzdHJ1Y3R1cmUuaHRtbCNlbmFibGluZy1hbmQtZGlzYWJsaW5nLWZvcm0tY29udHJvbHM6LXRoZS1kaXNhYmxlZC1hdHRyaWJ1dGUKICAvKiogQHR5cGUgeyFPYmplY3Q8Ym9vbGVhbj59ICovCiAgY29uc3QgY2FuQmVEaXNhYmxlZCA9IHsKICAgICdidXR0b24nOiB0cnVlLAogICAgJ2NvbW1hbmQnOiB0cnVlLAogICAgJ2ZpZWxkc2V0JzogdHJ1ZSwKICAgICdpbnB1dCc6IHRydWUsCiAgICAna2V5Z2VuJzogdHJ1ZSwKICAgICdvcHRncm91cCc6IHRydWUsCiAgICAnb3B0aW9uJzogdHJ1ZSwKICAgICdzZWxlY3QnOiB0cnVlLAogICAgJ3RleHRhcmVhJzogdHJ1ZQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEVsZW1lbnQgdG8gY2hlY2sgbGFiZWxsaW5nIHN0YXR1cwogICAqIEByZXR1cm4ge2Jvb2xlYW59IGVsZW1lbnQgY2FuIGhhdmUgbGFiZWxzCiAgICovCiAgZnVuY3Rpb24gY2FuQmVMYWJlbGxlZChlbCkgewogICAgcmV0dXJuIGxhYmVsbGFibGVbZWwubG9jYWxOYW1lXSB8fCBmYWxzZTsKICB9CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEVsZW1lbnQgdGhhdCBtYXkgYmUgbGFiZWxsZWQuCiAgICogQHJldHVybiB7IUFycmF5PCFIVE1MTGFiZWxFbGVtZW50Pn0gUmVsZXZhbnQgbGFiZWwgZm9yIGBlbGAKICAgKi8KICBmdW5jdGlvbiBtYXRjaGluZ0xhYmVscyhlbCkgewogICAgbGV0IGxhYmVscyA9IEFycmF5LmZyb20oLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fSAqLyhlbCkubGFiZWxzIHx8IFtdKTsKICAgIC8vIElFIGRvZXNuJ3QgaGF2ZSBgbGFiZWxzYCBhbmQgU2FmYXJpIGRvZXNuJ3QgcG9wdWxhdGUgYGxhYmVsc2AKICAgIC8vIGlmIGVsZW1lbnQgaXMgaW4gYSBzaGFkb3dyb290LgogICAgLy8gSW4gdGhpcyBpbnN0YW5jZSwgZmluZGluZyB0aGUgbm9uLWFuY2VzdG9yIGxhYmVscyBpcyBlbm91Z2gsCiAgICAvLyBhcyB0aGUgbW91c2VDYW5jZWxsb3IgY29kZSB3aWxsIGhhbmRsZSBhbmNzdG9yIGxhYmVscwogICAgaWYgKCFsYWJlbHMubGVuZ3RoKSB7CiAgICAgIGxhYmVscyA9IFtdOwogICAgICBsZXQgcm9vdCA9IGVsLmdldFJvb3ROb2RlKCk7CiAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGlkIG9uIGBlbGAsIGNoZWNrIGZvciBhbGwgbGFiZWxzIHdpdGggYSBtYXRjaGluZyBgZm9yYCBhdHRyaWJ1dGUKICAgICAgaWYgKGVsLmlkKSB7CiAgICAgICAgbGV0IG1hdGNoaW5nID0gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKGBsYWJlbFtmb3IgPSAke2VsLmlkfV1gKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoaW5nLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsYWJlbHMucHVzaCgvKiogQHR5cGUgeyFIVE1MTGFiZWxFbGVtZW50fSAqLyhtYXRjaGluZ1tpXSkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGxhYmVsczsKICB9CgogIC8vIHRvdWNoIHdpbGwgbWFrZSBzeW50aGV0aWMgbW91c2UgZXZlbnRzCiAgLy8gYHByZXZlbnREZWZhdWx0YCBvbiB0b3VjaGVuZCB3aWxsIGNhbmNlbCB0aGVtLAogIC8vIGJ1dCB0aGlzIGJyZWFrcyBgPGlucHV0PmAgZm9jdXMgYW5kIGxpbmsgY2xpY2tzCiAgLy8gZGlzYWJsZSBtb3VzZSBoYW5kbGVycyBmb3IgTU9VU0VfVElNRU9VVCBtcyBhZnRlcgogIC8vIGEgdG91Y2hlbmQgdG8gaWdub3JlIHN5bnRoZXRpYyBtb3VzZSBldmVudHMKICBsZXQgbW91c2VDYW5jZWxsZXIgPSBmdW5jdGlvbihtb3VzZUV2ZW50KSB7CiAgICAvLyBDaGVjayBmb3Igc291cmNlQ2FwYWJpbGl0aWVzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIHN5bnRoZXRpYyBldmVudHMKICAgIC8vIGlmIG1vdXNlRXZlbnQgZGlkIG5vdCBjb21lIGZyb20gYSBkZXZpY2UgdGhhdCBmaXJlcyB0b3VjaCBldmVudHMsCiAgICAvLyBpdCB3YXMgbWFkZSBieSBhIHJlYWwgbW91c2UgYW5kIHNob3VsZCBiZSBjb3VudGVkCiAgICAvLyBodHRwOi8vd2ljZy5naXRodWIuaW8vSW5wdXREZXZpY2VDYXBhYmlsaXRpZXMvI2RvbS1pbnB1dGRldmljZWNhcGFiaWxpdGllcy1maXJlc3RvdWNoZXZlbnRzCiAgICBsZXQgc2MgPSBtb3VzZUV2ZW50LnNvdXJjZUNhcGFiaWxpdGllczsKICAgIGlmIChzYyAmJiAhc2MuZmlyZXNUb3VjaEV2ZW50cykgewogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBza2lwIHN5bnRoZXRpYyBtb3VzZSBldmVudHMKICAgIG1vdXNlRXZlbnRbSEFORExFRF9PQkpdID0ge3NraXA6IHRydWV9OwogICAgLy8gZGlzYWJsZSAiZ2hvc3QgY2xpY2tzIgogICAgaWYgKG1vdXNlRXZlbnQudHlwZSA9PT0gJ2NsaWNrJykgewogICAgICBsZXQgY2xpY2tGcm9tTGFiZWwgPSBmYWxzZTsKICAgICAgbGV0IHBhdGggPSBtb3VzZUV2ZW50LmNvbXBvc2VkUGF0aCAmJiBtb3VzZUV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgICBpZiAocGF0aCkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKHBhdGhbaV0ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAgICAgICAgICAgIGlmIChwYXRoW2ldLmxvY2FsTmFtZSA9PT0gJ2xhYmVsJykgewogICAgICAgICAgICAgIGNsaWNrZWRMYWJlbHMucHVzaChwYXRoW2ldKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjYW5CZUxhYmVsbGVkKHBhdGhbaV0pKSB7CiAgICAgICAgICAgICAgbGV0IG93bmVyTGFiZWxzID0gbWF0Y2hpbmdMYWJlbHMocGF0aFtpXSk7CiAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9mIHRoZSBjbGlja2VkIGxhYmVscyBpcyBsYWJlbGxpbmcgdGhpcyBlbGVtZW50CiAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvd25lckxhYmVscy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgY2xpY2tGcm9tTGFiZWwgPSBjbGlja0Zyb21MYWJlbCB8fCBjbGlja2VkTGFiZWxzLmluZGV4T2Yob3duZXJMYWJlbHNbal0pID4gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocGF0aFtpXSA9PT0gUE9JTlRFUlNUQVRFLm1vdXNlLnRhcmdldCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIGlmIG9uZSBvZiB0aGUgY2xpY2tlZCBsYWJlbHMgd2FzIGxhYmVsbGluZyB0aGUgdGFyZ2V0IGVsZW1lbnQsCiAgICAgIC8vIHRoaXMgaXMgbm90IGEgZ2hvc3QgY2xpY2sKICAgICAgaWYgKGNsaWNrRnJvbUxhYmVsKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIG1vdXNlRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgbW91c2VFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzZXR1cCBUcnVlIHRvIGFkZCwgZmFsc2UgdG8gcmVtb3ZlLgogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgZnVuY3Rpb24gc2V0dXBUZWFyZG93bk1vdXNlQ2FuY2VsbGVyKHNldHVwKSB7CiAgICBsZXQgZXZlbnRzID0gSVNfVE9VQ0hfT05MWSA/IFsnY2xpY2snXSA6IE1PVVNFX0VWRU5UUzsKICAgIGZvciAobGV0IGkgPSAwLCBlbjsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgewogICAgICBlbiA9IGV2ZW50c1tpXTsKICAgICAgaWYgKHNldHVwKSB7CiAgICAgICAgLy8gcmVzZXQgY2xpY2tMYWJlbHMgYXJyYXkKICAgICAgICBjbGlja2VkTGFiZWxzLmxlbmd0aCA9IDA7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihlbiwgbW91c2VDYW5jZWxsZXIsIHRydWUpOwogICAgICB9IGVsc2UgewogICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZW4sIG1vdXNlQ2FuY2VsbGVyLCB0cnVlKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gaWdub3JlTW91c2UoZSkgewogICAgaWYgKCFQT0lOVEVSU1RBVEUubW91c2UubW91c2VJZ25vcmVKb2IpIHsKICAgICAgc2V0dXBUZWFyZG93bk1vdXNlQ2FuY2VsbGVyKHRydWUpOwogICAgfQogICAgbGV0IHVuc2V0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHNldHVwVGVhcmRvd25Nb3VzZUNhbmNlbGxlcigpOwogICAgICBQT0lOVEVSU1RBVEUubW91c2UudGFyZ2V0ID0gbnVsbDsKICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iID0gbnVsbDsKICAgIH07CiAgICBQT0lOVEVSU1RBVEUubW91c2UudGFyZ2V0ID0gZS5jb21wb3NlZFBhdGgoKVswXTsKICAgIFBPSU5URVJTVEFURS5tb3VzZS5tb3VzZUlnbm9yZUpvYiA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iCiAgICAgICAgLCBQb2x5bWVyLkFzeW5jLnRpbWVPdXQuYWZ0ZXIoTU9VU0VfVElNRU9VVCkKICAgICAgICAsIHVuc2V0KTsKICB9CgogIC8qKgogICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXYgZXZlbnQgdG8gdGVzdCBmb3IgbGVmdCBtb3VzZSBidXR0b24gZG93bgogICAqIEByZXR1cm4ge2Jvb2xlYW59IGhhcyBsZWZ0IG1vdXNlIGJ1dHRvbiBkb3duCiAgICovCiAgZnVuY3Rpb24gaGFzTGVmdE1vdXNlQnV0dG9uKGV2KSB7CiAgICBsZXQgdHlwZSA9IGV2LnR5cGU7CiAgICAvLyBleGl0IGVhcmx5IGlmIHRoZSBldmVudCBpcyBub3QgYSBtb3VzZSBldmVudAogICAgaWYgKCFpc01vdXNlRXZlbnQodHlwZSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLy8gZXYuYnV0dG9uIGlzIG5vdCByZWxpYWJsZSBmb3IgbW91c2Vtb3ZlICgwIGlzIG92ZXJsb2FkZWQgYXMgYm90aCBsZWZ0IGJ1dHRvbiBhbmQgbm8gYnV0dG9ucykKICAgIC8vIGluc3RlYWQgd2UgdXNlIGV2LmJ1dHRvbnMgKGJpdG1hc2sgb2YgYnV0dG9ucykgb3IgZmFsbCBiYWNrIHRvIGV2LndoaWNoIChkZXByZWNhdGVkLCAwIGZvciBubyBidXR0b25zLCAxIGZvciBsZWZ0IGJ1dHRvbikKICAgIGlmICh0eXBlID09PSAnbW91c2Vtb3ZlJykgewogICAgICAvLyBhbGxvdyB1bmRlZmluZWQgZm9yIHRlc3RpbmcgZXZlbnRzCiAgICAgIGxldCBidXR0b25zID0gZXYuYnV0dG9ucyA9PT0gdW5kZWZpbmVkID8gMSA6IGV2LmJ1dHRvbnM7CiAgICAgIGlmICgoZXYgaW5zdGFuY2VvZiB3aW5kb3cuTW91c2VFdmVudCkgJiYgIU1PVVNFX0hBU19CVVRUT05TKSB7CiAgICAgICAgYnV0dG9ucyA9IE1PVVNFX1dISUNIX1RPX0JVVFRPTlNbZXYud2hpY2hdIHx8IDA7CiAgICAgIH0KICAgICAgLy8gYnV0dG9ucyBpcyBhIGJpdG1hc2ssIGNoZWNrIHRoYXQgdGhlIGxlZnQgYnV0dG9uIGJpdCBpcyBzZXQgKDEpCiAgICAgIHJldHVybiBCb29sZWFuKGJ1dHRvbnMgJiAxKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIGFsbG93IHVuZGVmaW5lZCBmb3IgdGVzdGluZyBldmVudHMKICAgICAgbGV0IGJ1dHRvbiA9IGV2LmJ1dHRvbiA9PT0gdW5kZWZpbmVkID8gMCA6IGV2LmJ1dHRvbjsKICAgICAgLy8gZXYuYnV0dG9uIGlzIDAgaW4gbW91c2Vkb3duL21vdXNldXAvY2xpY2sgZm9yIGxlZnQgYnV0dG9uIGFjdGl2YXRpb24KICAgICAgcmV0dXJuIGJ1dHRvbiA9PT0gMDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzU3ludGhldGljQ2xpY2soZXYpIHsKICAgIGlmIChldi50eXBlID09PSAnY2xpY2snKSB7CiAgICAgIC8vIGV2LmRldGFpbCBpcyAwIGZvciBIVE1MRWxlbWVudC5jbGljayBpbiBtb3N0IGJyb3dzZXJzCiAgICAgIGlmIChldi5kZXRhaWwgPT09IDApIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICAvLyBpbiB0aGUgd29yc3QgY2FzZSwgY2hlY2sgdGhhdCB0aGUgeC95IHBvc2l0aW9uIG9mIHRoZSBjbGljayBpcyB3aXRoaW4KICAgICAgLy8gdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudAogICAgICAvLyBUaGFua3MgSUUgMTAgPjooCiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChldik7CiAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudCBpcyBhbiBlbGVtZW50IHNvIHdlIGNhbiB1c2UgZ2V0Qm91bmRpbmdDbGllbnRSZWN0LAogICAgICAvLyBpZiBub3QsIGp1c3QgYXNzdW1lIGl0IGlzIGEgc3ludGhldGljIGNsaWNrCiAgICAgIGlmICghdC5ub2RlVHlwZSB8fCAvKiogQHR5cGUge0VsZW1lbnR9ICovKHQpLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGxldCBiY3IgPSAvKiogQHR5cGUge0VsZW1lbnR9ICovKHQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAvLyB1c2UgcGFnZSB4L3kgdG8gYWNjb3VudCBmb3Igc2Nyb2xsaW5nCiAgICAgIGxldCB4ID0gZXYucGFnZVgsIHkgPSBldi5wYWdlWTsKICAgICAgLy8gZXYgaXMgYSBzeW50aGV0aWMgY2xpY2sgaWYgdGhlIHBvc2l0aW9uIGlzIG91dHNpZGUgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgdGFyZ2V0CiAgICAgIHJldHVybiAhKCh4ID49IGJjci5sZWZ0ICYmIHggPD0gYmNyLnJpZ2h0KSAmJiAoeSA+PSBiY3IudG9wICYmIHkgPD0gYmNyLmJvdHRvbSkpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgbGV0IFBPSU5URVJTVEFURSA9IHsKICAgIG1vdXNlOiB7CiAgICAgIHRhcmdldDogbnVsbCwKICAgICAgbW91c2VJZ25vcmVKb2I6IG51bGwKICAgIH0sCiAgICB0b3VjaDogewogICAgICB4OiAwLAogICAgICB5OiAwLAogICAgICBpZDogLTEsCiAgICAgIHNjcm9sbERlY2lkZWQ6IGZhbHNlCiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gZmlyc3RUb3VjaEFjdGlvbihldikgewogICAgbGV0IHRhID0gJ2F1dG8nOwogICAgbGV0IHBhdGggPSBldi5jb21wb3NlZFBhdGggJiYgZXYuY29tcG9zZWRQYXRoKCk7CiAgICBpZiAocGF0aCkgewogICAgICBmb3IgKGxldCBpID0gMCwgbjsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKICAgICAgICBuID0gcGF0aFtpXTsKICAgICAgICBpZiAobltUT1VDSF9BQ1RJT05dKSB7CiAgICAgICAgICB0YSA9IG5bVE9VQ0hfQUNUSU9OXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhOwogIH0KCiAgZnVuY3Rpb24gdHJhY2tEb2N1bWVudChzdGF0ZU9iaiwgbW92ZWZuLCB1cGZuKSB7CiAgICBzdGF0ZU9iai5tb3ZlZm4gPSBtb3ZlZm47CiAgICBzdGF0ZU9iai51cGZuID0gdXBmbjsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdmVmbik7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdXBmbik7CiAgfQoKICBmdW5jdGlvbiB1bnRyYWNrRG9jdW1lbnQoc3RhdGVPYmopIHsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHN0YXRlT2JqLm1vdmVmbik7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgc3RhdGVPYmoudXBmbik7CiAgICBzdGF0ZU9iai5tb3ZlZm4gPSBudWxsOwogICAgc3RhdGVPYmoudXBmbiA9IG51bGw7CiAgfQoKICAvLyB1c2UgYSBkb2N1bWVudC13aWRlIHRvdWNoZW5kIGxpc3RlbmVyIHRvIHN0YXJ0IHRoZSBnaG9zdC1jbGljayBwcmV2ZW50aW9uIG1lY2hhbmlzbQogIC8vIFVzZSBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycywgaWYgc3VwcG9ydGVkLCB0byBub3QgYWZmZWN0IHNjcm9sbGluZyBwZXJmb3JtYW5jZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgaWdub3JlTW91c2UsIFNVUFBPUlRTX1BBU1NJVkUgPyB7cGFzc2l2ZTogdHJ1ZX0gOiBmYWxzZSk7CgogIC8qKgogICAqIE1vZHVsZSBmb3IgYWRkaW5nIGxpc3RlbmVycyB0byBhIG5vZGUgZm9yIHRoZSBmb2xsb3dpbmcgbm9ybWFsaXplZAogICAqIGNyb3NzLXBsYXRmb3JtICJnZXN0dXJlIiBldmVudHM6CiAgICogLSBgZG93bmAgLSBtb3VzZSBvciB0b3VjaCB3ZW50IGRvd24KICAgKiAtIGB1cGAgLSBtb3VzZSBvciB0b3VjaCB3ZW50IHVwCiAgICogLSBgdGFwYCAtIG1vdXNlIGNsaWNrIG9yIGZpbmdlciB0YXAKICAgKiAtIGB0cmFja2AgLSBtb3VzZSBkcmFnIG9yIHRvdWNoIG1vdmUKICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1vZHVsZSBmb3IgYWRkaW5nIGNyb3NzLXBsYXRmb3JtIGdlc3R1cmUgZXZlbnQgbGlzdGVuZXJzLgogICAqLwogIGNvbnN0IEdlc3R1cmVzID0gewogICAgZ2VzdHVyZXM6IHt9LAogICAgcmVjb2duaXplcnM6IFtdLAoKICAgIC8qKgogICAgICogRmluZHMgdGhlIGVsZW1lbnQgcmVuZGVyZWQgb24gdGhlIHNjcmVlbiBhdCB0aGUgcHJvdmlkZWQgY29vcmRpbmF0ZXMuCiAgICAgKgogICAgICogU2ltaWxhciB0byBgZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludGAsIGJ1dCBwaWVyY2VzIHRocm91Z2gKICAgICAqIHNoYWRvdyByb290cy4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5HZXN0dXJlcwogICAgICogQHBhcmFtIHtudW1iZXJ9IHggSG9yaXpvbnRhbCBwaXhlbCBjb29yZGluYXRlCiAgICAgKiBAcGFyYW0ge251bWJlcn0geSBWZXJ0aWNhbCBwaXhlbCBjb29yZGluYXRlCiAgICAgKiBAcmV0dXJuIHtFbGVtZW50fSBSZXR1cm5zIHRoZSBkZWVwZXN0IHNoYWRvd1Jvb3QgaW5jbHVzaXZlIGVsZW1lbnQKICAgICAqIGZvdW5kIGF0IHRoZSBzY3JlZW4gcG9zaXRpb24gZ2l2ZW4uCiAgICAgKi8KICAgIGRlZXBUYXJnZXRGaW5kOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGxldCBub2RlID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KTsKICAgICAgbGV0IG5leHQgPSBub2RlOwogICAgICAvLyB0aGlzIGNvZGUgcGF0aCBpcyBvbmx5IHRha2VuIHdoZW4gbmF0aXZlIFNoYWRvd0RPTSBpcyB1c2VkCiAgICAgIC8vIGlmIHRoZXJlIGlzIGEgc2hhZG93cm9vdCwgaXQgbWF5IGhhdmUgYSBub2RlIGF0IHgveQogICAgICAvLyBpZiB0aGVyZSBpcyBub3QgYSBzaGFkb3dyb290LCBleGl0IHRoZSBsb29wCiAgICAgIHdoaWxlIChuZXh0ICYmIG5leHQuc2hhZG93Um9vdCAmJiAhd2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBub2RlIGF0IHgveSBpbiB0aGUgc2hhZG93cm9vdCwgbG9vayBkZWVwZXIKICAgICAgICBsZXQgb2xkTmV4dCA9IG5leHQ7CiAgICAgICAgbmV4dCA9IG5leHQuc2hhZG93Um9vdC5lbGVtZW50RnJvbVBvaW50KHgsIHkpOwogICAgICAgIC8vIG9uIFNhZmFyaSwgZWxlbWVudEZyb21Qb2ludCBtYXkgcmV0dXJuIHRoZSBzaGFkb3dSb290IGhvc3QKICAgICAgICBpZiAob2xkTmV4dCA9PT0gbmV4dCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICBub2RlID0gbmV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGU7CiAgICB9LAogICAgLyoqCiAgICAgKiBhIGNoZWFwZXIgY2hlY2sgdGhhbiBldi5jb21wb3NlZFBhdGgoKVswXTsKICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtFdmVudH0gZXYgRXZlbnQuCiAgICAgKiBAcmV0dXJuIHtFdmVudFRhcmdldH0gUmV0dXJucyB0aGUgZXZlbnQgdGFyZ2V0LgogICAgICovCiAgICBfZmluZE9yaWdpbmFsVGFyZ2V0OiBmdW5jdGlvbihldikgewogICAgICAvLyBzaGFkb3dkb20KICAgICAgaWYgKGV2LmNvbXBvc2VkUGF0aCkgewogICAgICAgIGNvbnN0IHRhcmdldHMgPSAvKiogQHR5cGUgeyFBcnJheTwhRXZlbnRUYXJnZXQ+fSAqLyhldi5jb21wb3NlZFBhdGgoKSk7CiAgICAgICAgLy8gSXQgc2hvdWxkbid0IGJlLCBidXQgc29tZXRpbWVzIHRhcmdldHMgaXMgZW1wdHkgKHdpbmRvdyBvbiBTYWZhcmkpLgogICAgICAgIHJldHVybiB0YXJnZXRzLmxlbmd0aCA+IDAgPyB0YXJnZXRzWzBdIDogZXYudGFyZ2V0OwogICAgICB9CiAgICAgIC8vIHNoYWR5ZG9tCiAgICAgIHJldHVybiBldi50YXJnZXQ7CiAgICB9LAoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2IEV2ZW50LgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgX2hhbmRsZU5hdGl2ZTogZnVuY3Rpb24oZXYpIHsKICAgICAgbGV0IGhhbmRsZWQ7CiAgICAgIGxldCB0eXBlID0gZXYudHlwZTsKICAgICAgbGV0IG5vZGUgPSBldi5jdXJyZW50VGFyZ2V0OwogICAgICBsZXQgZ29iaiA9IG5vZGVbR0VTVFVSRV9LRVldOwogICAgICBpZiAoIWdvYmopIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IGdzID0gZ29ialt0eXBlXTsKICAgICAgaWYgKCFncykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoIWV2W0hBTkRMRURfT0JKXSkgewogICAgICAgIGV2W0hBTkRMRURfT0JKXSA9IHt9OwogICAgICAgIGlmICh0eXBlLnNsaWNlKDAsIDUpID09PSAndG91Y2gnKSB7CiAgICAgICAgICBldiA9IC8qKiBAdHlwZSB7VG91Y2hFdmVudH0gKi8oZXYpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgICBsZXQgdCA9IGV2LmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICAgICAgaWYgKHR5cGUgPT09ICd0b3VjaHN0YXJ0JykgewogICAgICAgICAgICAvLyBvbmx5IGhhbmRsZSB0aGUgZmlyc3QgZmluZ2VyCiAgICAgICAgICAgIGlmIChldi50b3VjaGVzLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgIFBPSU5URVJTVEFURS50b3VjaC5pZCA9IHQuaWRlbnRpZmllcjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKFBPSU5URVJTVEFURS50b3VjaC5pZCAhPT0gdC5pZGVudGlmaWVyKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghSEFTX05BVElWRV9UQSkgewogICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3RvdWNoc3RhcnQnIHx8IHR5cGUgPT09ICd0b3VjaG1vdmUnKSB7CiAgICAgICAgICAgICAgR2VzdHVyZXMuX2hhbmRsZVRvdWNoQWN0aW9uKGV2KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBoYW5kbGVkID0gZXZbSEFORExFRF9PQkpdOwogICAgICAvLyB1c2VkIHRvIGlnbm9yZSBzeW50aGV0aWMgbW91c2UgZXZlbnRzCiAgICAgIGlmIChoYW5kbGVkLnNraXApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgLy8gcmVzZXQgcmVjb2duaXplciBzdGF0ZQogICAgICBmb3IgKGxldCBpID0gMCwgcjsgaSA8IEdlc3R1cmVzLnJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgciA9IEdlc3R1cmVzLnJlY29nbml6ZXJzW2ldOwogICAgICAgIGlmIChnc1tyLm5hbWVdICYmICFoYW5kbGVkW3IubmFtZV0pIHsKICAgICAgICAgIGlmIChyLmZsb3cgJiYgci5mbG93LnN0YXJ0LmluZGV4T2YoZXYudHlwZSkgPiAtMSAmJiByLnJlc2V0KSB7CiAgICAgICAgICAgIHIucmVzZXQoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gZW5mb3JjZSBnZXN0dXJlIHJlY29nbml6ZXIgb3JkZXIKICAgICAgZm9yIChsZXQgaSA9IDAsIHI7IGkgPCBHZXN0dXJlcy5yZWNvZ25pemVycy5sZW5ndGg7IGkrKykgewogICAgICAgIHIgPSBHZXN0dXJlcy5yZWNvZ25pemVyc1tpXTsKICAgICAgICBpZiAoZ3Nbci5uYW1lXSAmJiAhaGFuZGxlZFtyLm5hbWVdKSB7CiAgICAgICAgICBoYW5kbGVkW3IubmFtZV0gPSB0cnVlOwogICAgICAgICAgclt0eXBlXShldik7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZXYgRXZlbnQuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfaGFuZGxlVG91Y2hBY3Rpb246IGZ1bmN0aW9uKGV2KSB7CiAgICAgIGxldCB0ID0gZXYuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgIGxldCB0eXBlID0gZXYudHlwZTsKICAgICAgaWYgKHR5cGUgPT09ICd0b3VjaHN0YXJ0JykgewogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC54ID0gdC5jbGllbnRYOwogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC55ID0gdC5jbGllbnRZOwogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC5zY3JvbGxEZWNpZGVkID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3RvdWNobW92ZScpIHsKICAgICAgICBpZiAoUE9JTlRFUlNUQVRFLnRvdWNoLnNjcm9sbERlY2lkZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgUE9JTlRFUlNUQVRFLnRvdWNoLnNjcm9sbERlY2lkZWQgPSB0cnVlOwogICAgICAgIGxldCB0YSA9IGZpcnN0VG91Y2hBY3Rpb24oZXYpOwogICAgICAgIGxldCBwcmV2ZW50ID0gZmFsc2U7CiAgICAgICAgbGV0IGR4ID0gTWF0aC5hYnMoUE9JTlRFUlNUQVRFLnRvdWNoLnggLSB0LmNsaWVudFgpOwogICAgICAgIGxldCBkeSA9IE1hdGguYWJzKFBPSU5URVJTVEFURS50b3VjaC55IC0gdC5jbGllbnRZKTsKICAgICAgICBpZiAoIWV2LmNhbmNlbGFibGUpIHsKICAgICAgICAgIC8vIHNjcm9sbGluZyBpcyBoYXBwZW5pbmcKICAgICAgICB9IGVsc2UgaWYgKHRhID09PSAnbm9uZScpIHsKICAgICAgICAgIHByZXZlbnQgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAodGEgPT09ICdwYW4teCcpIHsKICAgICAgICAgIHByZXZlbnQgPSBkeSA+IGR4OwogICAgICAgIH0gZWxzZSBpZiAodGEgPT09ICdwYW4teScpIHsKICAgICAgICAgIHByZXZlbnQgPSBkeCA+IGR5OwogICAgICAgIH0KICAgICAgICBpZiAocHJldmVudCkgewogICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgR2VzdHVyZXMucHJldmVudCgndHJhY2snKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGEgbm9kZSBmb3IgdGhlIGdpdmVuIGdlc3R1cmUgdHlwZS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5HZXN0dXJlcwogICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBsaXN0ZW5lciBvbgogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBHZXN0dXJlIHR5cGU6IGBkb3duYCwgYHVwYCwgYHRyYWNrYCwgb3IgYHRhcGAKICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBFdmVudCBsaXN0ZW5lciBmdW5jdGlvbiB0byBjYWxsCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVyIHdhcyBhZGRlZC4KICAgICAqIEB0aGlzIHtHZXN0dXJlc30KICAgICAqLwogICAgYWRkTGlzdGVuZXI6IGZ1bmN0aW9uKG5vZGUsIGV2VHlwZSwgaGFuZGxlcikgewogICAgICBpZiAodGhpcy5nZXN0dXJlc1tldlR5cGVdKSB7CiAgICAgICAgdGhpcy5fYWRkKG5vZGUsIGV2VHlwZSwgaGFuZGxlcik7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKCiAgICAvKioKICAgICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSBhIG5vZGUgZm9yIHRoZSBnaXZlbiBnZXN0dXJlIHR5cGUuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byByZW1vdmUgbGlzdGVuZXIgZnJvbQogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBHZXN0dXJlIHR5cGU6IGBkb3duYCwgYHVwYCwgYHRyYWNrYCwgb3IgYHRhcGAKICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBFdmVudCBsaXN0ZW5lciBmdW5jdGlvbiBwcmV2aW91c2x5IHBhc3NlZCB0bwogICAgICogIGBhZGRMaXN0ZW5lcmAuCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVyIHdhcyByZW1vdmVkLgogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24obm9kZSwgZXZUeXBlLCBoYW5kbGVyKSB7CiAgICAgIGlmICh0aGlzLmdlc3R1cmVzW2V2VHlwZV0pIHsKICAgICAgICB0aGlzLl9yZW1vdmUobm9kZSwgZXZUeXBlLCBoYW5kbGVyKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9LAoKICAgIC8qKgogICAgICogYXV0b21hdGUgdGhlIGV2ZW50IGxpc3RlbmVycyBmb3IgdGhlIG5hdGl2ZSBldmVudHMKICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG5vZGUgTm9kZSBvbiB3aGljaCB0byBhZGQgdGhlIGV2ZW50LgogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBFdmVudCB0eXBlIHRvIGFkZC4KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KX0gaGFuZGxlciBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEB0aGlzIHtHZXN0dXJlc30KICAgICAqLwogICAgX2FkZDogZnVuY3Rpb24obm9kZSwgZXZUeXBlLCBoYW5kbGVyKSB7CiAgICAgIGxldCByZWNvZ25pemVyID0gdGhpcy5nZXN0dXJlc1tldlR5cGVdOwogICAgICBsZXQgZGVwcyA9IHJlY29nbml6ZXIuZGVwczsKICAgICAgbGV0IG5hbWUgPSByZWNvZ25pemVyLm5hbWU7CiAgICAgIGxldCBnb2JqID0gbm9kZVtHRVNUVVJFX0tFWV07CiAgICAgIGlmICghZ29iaikgewogICAgICAgIG5vZGVbR0VTVFVSRV9LRVldID0gZ29iaiA9IHt9OwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSAwLCBkZXAsIGdkOyBpIDwgZGVwcy5sZW5ndGg7IGkrKykgewogICAgICAgIGRlcCA9IGRlcHNbaV07CiAgICAgICAgLy8gZG9uJ3QgYWRkIG1vdXNlIGhhbmRsZXJzIG9uIGlPUyBiZWNhdXNlIHRoZXkgY2F1c2UgZ3JheSBzZWxlY3Rpb24gb3ZlcmxheXMKICAgICAgICBpZiAoSVNfVE9VQ0hfT05MWSAmJiBpc01vdXNlRXZlbnQoZGVwKSAmJiBkZXAgIT09ICdjbGljaycpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBnZCA9IGdvYmpbZGVwXTsKICAgICAgICBpZiAoIWdkKSB7CiAgICAgICAgICBnb2JqW2RlcF0gPSBnZCA9IHtfY291bnQ6IDB9OwogICAgICAgIH0KICAgICAgICBpZiAoZ2QuX2NvdW50ID09PSAwKSB7CiAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZGVwLCB0aGlzLl9oYW5kbGVOYXRpdmUsIFBBU1NJVkVfVE9VQ0goZGVwKSk7CiAgICAgICAgfQogICAgICAgIGdkW25hbWVdID0gKGdkW25hbWVdIHx8IDApICsgMTsKICAgICAgICBnZC5fY291bnQgPSAoZ2QuX2NvdW50IHx8IDApICsgMTsKICAgICAgfQogICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZUeXBlLCBoYW5kbGVyKTsKICAgICAgaWYgKHJlY29nbml6ZXIudG91Y2hBY3Rpb24pIHsKICAgICAgICB0aGlzLnNldFRvdWNoQWN0aW9uKG5vZGUsIHJlY29nbml6ZXIudG91Y2hBY3Rpb24pOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogYXV0b21hdGUgZXZlbnQgbGlzdGVuZXIgcmVtb3ZhbCBmb3IgbmF0aXZlIGV2ZW50cwogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gbm9kZSBOb2RlIG9uIHdoaWNoIHRvIHJlbW92ZSB0aGUgZXZlbnQuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZUeXBlIEV2ZW50IHR5cGUgdG8gcmVtb3ZlLgogICAgICogQHBhcmFtIHtmdW5jdGlvbihFdmVudD8pfSBoYW5kbGVyIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb24uCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICBfcmVtb3ZlOiBmdW5jdGlvbihub2RlLCBldlR5cGUsIGhhbmRsZXIpIHsKICAgICAgbGV0IHJlY29nbml6ZXIgPSB0aGlzLmdlc3R1cmVzW2V2VHlwZV07CiAgICAgIGxldCBkZXBzID0gcmVjb2duaXplci5kZXBzOwogICAgICBsZXQgbmFtZSA9IHJlY29nbml6ZXIubmFtZTsKICAgICAgbGV0IGdvYmogPSBub2RlW0dFU1RVUkVfS0VZXTsKICAgICAgaWYgKGdvYmopIHsKICAgICAgICBmb3IgKGxldCBpID0gMCwgZGVwLCBnZDsgaSA8IGRlcHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGRlcCA9IGRlcHNbaV07CiAgICAgICAgICBnZCA9IGdvYmpbZGVwXTsKICAgICAgICAgIGlmIChnZCAmJiBnZFtuYW1lXSkgewogICAgICAgICAgICBnZFtuYW1lXSA9IChnZFtuYW1lXSB8fCAxKSAtIDE7CiAgICAgICAgICAgIGdkLl9jb3VudCA9IChnZC5fY291bnQgfHwgMSkgLSAxOwogICAgICAgICAgICBpZiAoZ2QuX2NvdW50ID09PSAwKSB7CiAgICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGRlcCwgdGhpcy5faGFuZGxlTmF0aXZlLCBQQVNTSVZFX1RPVUNIKGRlcCkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldlR5cGUsIGhhbmRsZXIpOwogICAgfSwKCiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIG5ldyBnZXN0dXJlIGV2ZW50IHJlY29nbml6ZXIgZm9yIGFkZGluZyBuZXcgY3VzdG9tCiAgICAgKiBnZXN0dXJlIGV2ZW50IHR5cGVzLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkdlc3R1cmVzCiAgICAgKiBAcGFyYW0geyFHZXN0dXJlUmVjb2duaXplcn0gcmVjb2cgR2VzdHVyZSByZWNvZ25pemVyIGRlc2NyaXB0b3IKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7R2VzdHVyZXN9CiAgICAgKi8KICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihyZWNvZykgewogICAgICB0aGlzLnJlY29nbml6ZXJzLnB1c2gocmVjb2cpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY29nLmVtaXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGhpcy5nZXN0dXJlc1tyZWNvZy5lbWl0c1tpXV0gPSByZWNvZzsKICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZOYW1lIEV2ZW50IG5hbWUuCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgdGhlIGdlc3R1cmUgZm9yIHRoZSBnaXZlbiBldmVudCBuYW1lLgogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICBfZmluZFJlY29nbml6ZXJCeUV2ZW50OiBmdW5jdGlvbihldk5hbWUpIHsKICAgICAgZm9yIChsZXQgaSA9IDAsIHI7IGkgPCB0aGlzLnJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgciA9IHRoaXMucmVjb2duaXplcnNbaV07CiAgICAgICAgZm9yIChsZXQgaiA9IDAsIG47IGogPCByLmVtaXRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBuID0gci5lbWl0c1tqXTsKICAgICAgICAgIGlmIChuID09PSBldk5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfSwKCiAgICAvKioKICAgICAqIFNldHMgc2Nyb2xsaW5nIGRpcmVjdGlvbiBvbiBub2RlLgogICAgICoKICAgICAqIFRoaXMgdmFsdWUgaXMgY2hlY2tlZCBvbiBmaXJzdCBtb3ZlLCB0aHVzIGl0IHNob3VsZCBiZSBjYWxsZWQgcHJpb3IgdG8KICAgICAqIGFkZGluZyBldmVudCBsaXN0ZW5lcnMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7IUVsZW1lbnR9IG5vZGUgTm9kZSB0byBzZXQgdG91Y2ggYWN0aW9uIHNldHRpbmcgb24KICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBUb3VjaCBhY3Rpb24gdmFsdWUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHNldFRvdWNoQWN0aW9uOiBmdW5jdGlvbihub2RlLCB2YWx1ZSkgewogICAgICBpZiAoSEFTX05BVElWRV9UQSkgewogICAgICAgIC8vIE5PVEU6IGFkZCB0b3VjaEFjdGlvbiBhc3luYyBzbyB0aGF0IGV2ZW50cyBjYW4gYmUgYWRkZWQgaW4KICAgICAgICAvLyBjdXN0b20gZWxlbWVudCBjb25zdHJ1Y3RvcnMuIE90aGVyd2lzZSB3ZSBydW4gYWZvdWwgb2YgY3VzdG9tCiAgICAgICAgLy8gZWxlbWVudHMgcmVzdHJpY3Rpb24gYWdhaW5zdCBzZXR0aW5ncyBhdHRyaWJ1dGVzIChzdHlsZSkgaW4gdGhlCiAgICAgICAgLy8gY29uc3RydWN0b3IuCiAgICAgICAgUG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKCgpID0+IHsKICAgICAgICAgIG5vZGUuc3R5bGUudG91Y2hBY3Rpb24gPSB2YWx1ZTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBub2RlW1RPVUNIX0FDVElPTl0gPSB2YWx1ZTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IG9uIHRoZSBgdGFyZ2V0YCBlbGVtZW50IG9mIGB0eXBlYCB3aXRoIHRoZSBnaXZlbgogICAgICogYGRldGFpbGAuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHshRXZlbnRUYXJnZXR9IHRhcmdldCBUaGUgZWxlbWVudCBvbiB3aGljaCB0byBmaXJlIGFuIGV2ZW50LgogICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIHR5cGUgb2YgZXZlbnQgdG8gZmlyZS4KICAgICAqIEBwYXJhbSB7IU9iamVjdD19IGRldGFpbCBUaGUgZGV0YWlsIG9iamVjdCB0byBwb3B1bGF0ZSBvbiB0aGUgZXZlbnQuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfZmlyZTogZnVuY3Rpb24odGFyZ2V0LCB0eXBlLCBkZXRhaWwpIHsKICAgICAgbGV0IGV2ID0gbmV3IEV2ZW50KHR5cGUsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSk7CiAgICAgIGV2LmRldGFpbCA9IGRldGFpbDsKICAgICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXYpOwogICAgICAvLyBmb3J3YXJkIGBwcmV2ZW50RGVmYXVsdGAgaW4gYSBjbGVhbiB3YXkKICAgICAgaWYgKGV2LmRlZmF1bHRQcmV2ZW50ZWQpIHsKICAgICAgICBsZXQgcHJldmVudGVyID0gZGV0YWlsLnByZXZlbnRlciB8fCBkZXRhaWwuc291cmNlRXZlbnQ7CiAgICAgICAgaWYgKHByZXZlbnRlciAmJiBwcmV2ZW50ZXIucHJldmVudERlZmF1bHQpIHsKICAgICAgICAgIHByZXZlbnRlci5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIFByZXZlbnRzIHRoZSBkaXNwYXRjaCBhbmQgZGVmYXVsdCBhY3Rpb24gb2YgdGhlIGdpdmVuIGV2ZW50IG5hbWUuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldk5hbWUgRXZlbnQgbmFtZS4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7R2VzdHVyZXN9CiAgICAgKi8KICAgIHByZXZlbnQ6IGZ1bmN0aW9uKGV2TmFtZSkgewogICAgICBsZXQgcmVjb2duaXplciA9IHRoaXMuX2ZpbmRSZWNvZ25pemVyQnlFdmVudChldk5hbWUpOwogICAgICBpZiAocmVjb2duaXplci5pbmZvKSB7CiAgICAgICAgcmVjb2duaXplci5pbmZvLnByZXZlbnQgPSB0cnVlOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogUmVzZXQgdGhlIDI1MDBtcyB0aW1lb3V0IG9uIHByb2Nlc3NpbmcgbW91c2UgaW5wdXQgYWZ0ZXIgZGV0ZWN0aW5nIHRvdWNoIGlucHV0LgogICAgICoKICAgICAqIFRvdWNoIGlucHV0cyBjcmVhdGUgc3ludGhlc2l6ZWQgbW91c2UgaW5wdXRzIGFueXdoZXJlIGZyb20gMCB0byAyMDAwbXMgYWZ0ZXIgdGhlIHRvdWNoLgogICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyB0ZXN0aW5nIHdpdGggc2ltdWxhdGVkIHRvdWNoIGlucHV0cy4KICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaW4gcHJvZHVjdGlvbiBtYXkgY2F1c2UgZHVwbGljYXRlIHRhcHMgb3Igb3RoZXIgR2VzdHVyZXMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0TW91c2VDYW5jZWxsZXI6IGZ1bmN0aW9uKCkgewogICAgICBpZiAoUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iKSB7CiAgICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iLmZsdXNoKCk7CiAgICAgIH0KICAgIH0KICB9OwoKICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwoKICBHZXN0dXJlcy5yZWdpc3Rlcih7CiAgICBuYW1lOiAnZG93bnVwJywKICAgIGRlcHM6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnXSwKICAgIGZsb3c6IHsKICAgICAgc3RhcnQ6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSwKICAgICAgZW5kOiBbJ21vdXNldXAnLCAndG91Y2hlbmQnXQogICAgfSwKICAgIGVtaXRzOiBbJ2Rvd24nLCAndXAnXSwKCiAgICBpbmZvOiB7CiAgICAgIG1vdmVmbjogbnVsbCwKICAgICAgdXBmbjogbnVsbAogICAgfSwKCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgdW50cmFja0RvY3VtZW50KHRoaXMuaW5mbyk7CiAgICB9LAoKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBtb3VzZWRvd246IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKCFoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IHQgPSBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpOwogICAgICBsZXQgc2VsZiA9IHRoaXM7CiAgICAgIGxldCBtb3ZlZm4gPSBmdW5jdGlvbiBtb3ZlZm4oZSkgewogICAgICAgIGlmICghaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgICBzZWxmLl9maXJlKCd1cCcsIHQsIGUpOwogICAgICAgICAgdW50cmFja0RvY3VtZW50KHNlbGYuaW5mbyk7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZXQgdXBmbiA9IGZ1bmN0aW9uIHVwZm4oZSkgewogICAgICAgIGlmIChoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICAgIHNlbGYuX2ZpcmUoJ3VwJywgdCwgZSk7CiAgICAgICAgfQogICAgICAgIHVudHJhY2tEb2N1bWVudChzZWxmLmluZm8pOwogICAgICB9OwogICAgICB0cmFja0RvY3VtZW50KHRoaXMuaW5mbywgbW92ZWZuLCB1cGZuKTsKICAgICAgdGhpcy5fZmlyZSgnZG93bicsIHQsIGUpOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaHN0YXJ0OiBmdW5jdGlvbihlKSB7CiAgICAgIHRoaXMuX2ZpcmUoJ2Rvd24nLCBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpLCBlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgdG91Y2hlbmQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgdGhpcy5fZmlyZSgndXAnLCBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpLCBlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlCiAgICAgKiBAcGFyYW0geyFFdmVudFRhcmdldH0gdGFyZ2V0CiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudAogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJldmVudGVyCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfZmlyZTogZnVuY3Rpb24odHlwZSwgdGFyZ2V0LCBldmVudCwgcHJldmVudGVyKSB7CiAgICAgIEdlc3R1cmVzLl9maXJlKHRhcmdldCwgdHlwZSwgewogICAgICAgIHg6IGV2ZW50LmNsaWVudFgsCiAgICAgICAgeTogZXZlbnQuY2xpZW50WSwKICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsCiAgICAgICAgcHJldmVudGVyOiBwcmV2ZW50ZXIsCiAgICAgICAgcHJldmVudDogZnVuY3Rpb24oZSkgewogICAgICAgICAgcmV0dXJuIEdlc3R1cmVzLnByZXZlbnQoZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9KTsKCiAgR2VzdHVyZXMucmVnaXN0ZXIoewogICAgbmFtZTogJ3RyYWNrJywKICAgIHRvdWNoQWN0aW9uOiAnbm9uZScsCiAgICBkZXBzOiBbJ21vdXNlZG93bicsICd0b3VjaHN0YXJ0JywgJ3RvdWNobW92ZScsICd0b3VjaGVuZCddLAogICAgZmxvdzogewogICAgICBzdGFydDogWydtb3VzZWRvd24nLCAndG91Y2hzdGFydCddLAogICAgICBlbmQ6IFsnbW91c2V1cCcsICd0b3VjaGVuZCddCiAgICB9LAogICAgZW1pdHM6IFsndHJhY2snXSwKCiAgICBpbmZvOiB7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHN0YXRlOiAnc3RhcnQnLAogICAgICBzdGFydGVkOiBmYWxzZSwKICAgICAgbW92ZXM6IFtdLAogICAgICAvKiogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfSAqLwogICAgICBhZGRNb3ZlOiBmdW5jdGlvbihtb3ZlKSB7CiAgICAgICAgaWYgKHRoaXMubW92ZXMubGVuZ3RoID4gVFJBQ0tfTEVOR1RIKSB7CiAgICAgICAgICB0aGlzLm1vdmVzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIHRoaXMubW92ZXMucHVzaChtb3ZlKTsKICAgICAgfSwKICAgICAgbW92ZWZuOiBudWxsLAogICAgICB1cGZuOiBudWxsLAogICAgICBwcmV2ZW50OiBmYWxzZQogICAgfSwKCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5pbmZvLnN0YXRlID0gJ3N0YXJ0JzsKICAgICAgdGhpcy5pbmZvLnN0YXJ0ZWQgPSBmYWxzZTsKICAgICAgdGhpcy5pbmZvLm1vdmVzID0gW107CiAgICAgIHRoaXMuaW5mby54ID0gMDsKICAgICAgdGhpcy5pbmZvLnkgPSAwOwogICAgICB0aGlzLmluZm8ucHJldmVudCA9IGZhbHNlOwogICAgICB1bnRyYWNrRG9jdW1lbnQodGhpcy5pbmZvKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge251bWJlcn0geAogICAgICogQHBhcmFtIHtudW1iZXJ9IHkKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICAgKi8KICAgIGhhc01vdmVkRW5vdWdoOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGlmICh0aGlzLmluZm8ucHJldmVudCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAodGhpcy5pbmZvLnN0YXJ0ZWQpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgZHggPSBNYXRoLmFicyh0aGlzLmluZm8ueCAtIHgpOwogICAgICBsZXQgZHkgPSBNYXRoLmFicyh0aGlzLmluZm8ueSAtIHkpOwogICAgICByZXR1cm4gKGR4ID49IFRSQUNLX0RJU1RBTkNFIHx8IGR5ID49IFRSQUNLX0RJU1RBTkNFKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgbW91c2Vkb3duOiBmdW5jdGlvbihlKSB7CiAgICAgIGlmICghaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChlKTsKICAgICAgbGV0IHNlbGYgPSB0aGlzOwogICAgICBsZXQgbW92ZWZuID0gZnVuY3Rpb24gbW92ZWZuKGUpIHsKICAgICAgICBsZXQgeCA9IGUuY2xpZW50WCwgeSA9IGUuY2xpZW50WTsKICAgICAgICBpZiAoc2VsZi5oYXNNb3ZlZEVub3VnaCh4LCB5KSkgewogICAgICAgICAgLy8gZmlyc3QgbW92ZSBpcyAnc3RhcnQnLCBzdWJzZXF1ZW50IG1vdmVzIGFyZSAnbW92ZScsIG1vdXNldXAgaXMgJ2VuZCcKICAgICAgICAgIHNlbGYuaW5mby5zdGF0ZSA9IHNlbGYuaW5mby5zdGFydGVkID8gKGUudHlwZSA9PT0gJ21vdXNldXAnID8gJ2VuZCcgOiAndHJhY2snKSA6ICdzdGFydCc7CiAgICAgICAgICBpZiAoc2VsZi5pbmZvLnN0YXRlID09PSAnc3RhcnQnKSB7CiAgICAgICAgICAgIC8vIGlmIGFuZCBvbmx5IGlmIHRyYWNraW5nLCBhbHdheXMgcHJldmVudCB0YXAKICAgICAgICAgICAgR2VzdHVyZXMucHJldmVudCgndGFwJyk7CiAgICAgICAgICB9CiAgICAgICAgICBzZWxmLmluZm8uYWRkTW92ZSh7eDogeCwgeTogeX0pOwogICAgICAgICAgaWYgKCFoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICAgICAgLy8gYWx3YXlzIF9maXJlICJlbmQiCiAgICAgICAgICAgIHNlbGYuaW5mby5zdGF0ZSA9ICdlbmQnOwogICAgICAgICAgICB1bnRyYWNrRG9jdW1lbnQoc2VsZi5pbmZvKTsKICAgICAgICAgIH0KICAgICAgICAgIHNlbGYuX2ZpcmUodCwgZSk7CiAgICAgICAgICBzZWxmLmluZm8uc3RhcnRlZCA9IHRydWU7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZXQgdXBmbiA9IGZ1bmN0aW9uIHVwZm4oZSkgewogICAgICAgIGlmIChzZWxmLmluZm8uc3RhcnRlZCkgewogICAgICAgICAgbW92ZWZuKGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gcmVtb3ZlIHRoZSB0ZW1wb3JhcnkgbGlzdGVuZXJzCiAgICAgICAgdW50cmFja0RvY3VtZW50KHNlbGYuaW5mbyk7CiAgICAgIH07CiAgICAgIC8vIGFkZCB0ZW1wb3JhcnkgZG9jdW1lbnQgbGlzdGVuZXJzIGFzIG1vdXNlIHJldGFyZ2V0cwogICAgICB0cmFja0RvY3VtZW50KHRoaXMuaW5mbywgbW92ZWZuLCB1cGZuKTsKICAgICAgdGhpcy5pbmZvLnggPSBlLmNsaWVudFg7CiAgICAgIHRoaXMuaW5mby55ID0gZS5jbGllbnRZOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaHN0YXJ0OiBmdW5jdGlvbihlKSB7CiAgICAgIGxldCBjdCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgIHRoaXMuaW5mby54ID0gY3QuY2xpZW50WDsKICAgICAgdGhpcy5pbmZvLnkgPSBjdC5jbGllbnRZOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaG1vdmU6IGZ1bmN0aW9uKGUpIHsKICAgICAgbGV0IHQgPSBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpOwogICAgICBsZXQgY3QgPSBlLmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICBsZXQgeCA9IGN0LmNsaWVudFgsIHkgPSBjdC5jbGllbnRZOwogICAgICBpZiAodGhpcy5oYXNNb3ZlZEVub3VnaCh4LCB5KSkgewogICAgICAgIGlmICh0aGlzLmluZm8uc3RhdGUgPT09ICdzdGFydCcpIHsKICAgICAgICAgIC8vIGlmIGFuZCBvbmx5IGlmIHRyYWNraW5nLCBhbHdheXMgcHJldmVudCB0YXAKICAgICAgICAgIEdlc3R1cmVzLnByZXZlbnQoJ3RhcCcpOwogICAgICAgIH0KICAgICAgICB0aGlzLmluZm8uYWRkTW92ZSh7eDogeCwgeTogeX0pOwogICAgICAgIHRoaXMuX2ZpcmUodCwgY3QpOwogICAgICAgIHRoaXMuaW5mby5zdGF0ZSA9ICd0cmFjayc7CiAgICAgICAgdGhpcy5pbmZvLnN0YXJ0ZWQgPSB0cnVlOwogICAgICB9CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHRvdWNoZW5kOiBmdW5jdGlvbihlKSB7CiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChlKTsKICAgICAgbGV0IGN0ID0gZS5jaGFuZ2VkVG91Y2hlc1swXTsKICAgICAgLy8gb25seSB0cmFja2VuZCBpZiB0cmFjayB3YXMgc3RhcnRlZCBhbmQgbm90IGFib3J0ZWQKICAgICAgaWYgKHRoaXMuaW5mby5zdGFydGVkKSB7CiAgICAgICAgLy8gcmVzZXQgc3RhcnRlZCBzdGF0ZSBvbiB1cAogICAgICAgIHRoaXMuaW5mby5zdGF0ZSA9ICdlbmQnOwogICAgICAgIHRoaXMuaW5mby5hZGRNb3ZlKHt4OiBjdC5jbGllbnRYLCB5OiBjdC5jbGllbnRZfSk7CiAgICAgICAgdGhpcy5fZmlyZSh0LCBjdCwgZSk7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0geyFFdmVudFRhcmdldH0gdGFyZ2V0CiAgICAgKiBAcGFyYW0ge1RvdWNofSB0b3VjaAogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgX2ZpcmU6IGZ1bmN0aW9uKHRhcmdldCwgdG91Y2gpIHsKICAgICAgbGV0IHNlY29uZGxhc3QgPSB0aGlzLmluZm8ubW92ZXNbdGhpcy5pbmZvLm1vdmVzLmxlbmd0aCAtIDJdOwogICAgICBsZXQgbGFzdG1vdmUgPSB0aGlzLmluZm8ubW92ZXNbdGhpcy5pbmZvLm1vdmVzLmxlbmd0aCAtIDFdOwogICAgICBsZXQgZHggPSBsYXN0bW92ZS54IC0gdGhpcy5pbmZvLng7CiAgICAgIGxldCBkeSA9IGxhc3Rtb3ZlLnkgLSB0aGlzLmluZm8ueTsKICAgICAgbGV0IGRkeCwgZGR5ID0gMDsKICAgICAgaWYgKHNlY29uZGxhc3QpIHsKICAgICAgICBkZHggPSBsYXN0bW92ZS54IC0gc2Vjb25kbGFzdC54OwogICAgICAgIGRkeSA9IGxhc3Rtb3ZlLnkgLSBzZWNvbmRsYXN0Lnk7CiAgICAgIH0KICAgICAgR2VzdHVyZXMuX2ZpcmUodGFyZ2V0LCAndHJhY2snLCB7CiAgICAgICAgc3RhdGU6IHRoaXMuaW5mby5zdGF0ZSwKICAgICAgICB4OiB0b3VjaC5jbGllbnRYLAogICAgICAgIHk6IHRvdWNoLmNsaWVudFksCiAgICAgICAgZHg6IGR4LAogICAgICAgIGR5OiBkeSwKICAgICAgICBkZHg6IGRkeCwKICAgICAgICBkZHk6IGRkeSwKICAgICAgICBzb3VyY2VFdmVudDogdG91Y2gsCiAgICAgICAgaG92ZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIEdlc3R1cmVzLmRlZXBUYXJnZXRGaW5kKHRvdWNoLmNsaWVudFgsIHRvdWNoLmNsaWVudFkpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogIH0pOwoKICBHZXN0dXJlcy5yZWdpc3Rlcih7CiAgICBuYW1lOiAndGFwJywKICAgIGRlcHM6IFsnbW91c2Vkb3duJywgJ2NsaWNrJywgJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnXSwKICAgIGZsb3c6IHsKICAgICAgc3RhcnQ6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSwKICAgICAgZW5kOiBbJ2NsaWNrJywgJ3RvdWNoZW5kJ10KICAgIH0sCiAgICBlbWl0czogWyd0YXAnXSwKICAgIGluZm86IHsKICAgICAgeDogTmFOLAogICAgICB5OiBOYU4sCiAgICAgIHByZXZlbnQ6IGZhbHNlCiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuaW5mby54ID0gTmFOOwogICAgICB0aGlzLmluZm8ueSA9IE5hTjsKICAgICAgdGhpcy5pbmZvLnByZXZlbnQgPSBmYWxzZTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgc2F2ZTogZnVuY3Rpb24oZSkgewogICAgICB0aGlzLmluZm8ueCA9IGUuY2xpZW50WDsKICAgICAgdGhpcy5pbmZvLnkgPSBlLmNsaWVudFk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIG1vdXNlZG93bjogZnVuY3Rpb24oZSkgewogICAgICBpZiAoaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgdGhpcy5zYXZlKGUpOwogICAgICB9CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgIGlmIChoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICB0aGlzLmZvcndhcmQoZSk7CiAgICAgIH0KICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgdG91Y2hzdGFydDogZnVuY3Rpb24oZSkgewogICAgICB0aGlzLnNhdmUoZS5jaGFuZ2VkVG91Y2hlc1swXSwgZSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHRvdWNoZW5kOiBmdW5jdGlvbihlKSB7CiAgICAgIHRoaXMuZm9yd2FyZChlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7RXZlbnQgfCBUb3VjaH0gZQogICAgICogQHBhcmFtIHtFdmVudD19IHByZXZlbnRlcgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZm9yd2FyZDogZnVuY3Rpb24oZSwgcHJldmVudGVyKSB7CiAgICAgIGxldCBkeCA9IE1hdGguYWJzKGUuY2xpZW50WCAtIHRoaXMuaW5mby54KTsKICAgICAgbGV0IGR5ID0gTWF0aC5hYnMoZS5jbGllbnRZIC0gdGhpcy5pbmZvLnkpOwogICAgICAvLyBmaW5kIG9yaWdpbmFsIHRhcmdldCBmcm9tIGBwcmV2ZW50ZXJgIGZvciBUb3VjaEV2ZW50cywgb3IgYGVgIGZvciBNb3VzZUV2ZW50cwogICAgICBsZXQgdCA9IEdlc3R1cmVzLl9maW5kT3JpZ2luYWxUYXJnZXQoLyoqIEB0eXBlIHtFdmVudH0gKi8ocHJldmVudGVyIHx8IGUpKTsKICAgICAgaWYgKCF0IHx8IChjYW5CZURpc2FibGVkWy8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0KS5sb2NhbE5hbWVdICYmIHQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBkeCxkeSBjYW4gYmUgTmFOIGlmIGBjbGlja2AgaGFzIGJlZW4gc2ltdWxhdGVkIGFuZCB0aGVyZSB3YXMgbm8gYGRvd25gIGZvciBgc3RhcnRgCiAgICAgIGlmIChpc05hTihkeCkgfHwgaXNOYU4oZHkpIHx8IChkeCA8PSBUQVBfRElTVEFOQ0UgJiYgZHkgPD0gVEFQX0RJU1RBTkNFKSB8fCBpc1N5bnRoZXRpY0NsaWNrKGUpKSB7CiAgICAgICAgLy8gcHJldmVudCB0YXBzIGZyb20gYmVpbmcgZ2VuZXJhdGVkIGlmIGFuIGV2ZW50IGhhcyBjYW5jZWxlZCB0aGVtCiAgICAgICAgaWYgKCF0aGlzLmluZm8ucHJldmVudCkgewogICAgICAgICAgR2VzdHVyZXMuX2ZpcmUodCwgJ3RhcCcsIHsKICAgICAgICAgICAgeDogZS5jbGllbnRYLAogICAgICAgICAgICB5OiBlLmNsaWVudFksCiAgICAgICAgICAgIHNvdXJjZUV2ZW50OiBlLAogICAgICAgICAgICBwcmV2ZW50ZXI6IHByZXZlbnRlcgogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfSk7CgogIC8qIGVzbGludC1lbmFibGUgdmFsaWQtanNkb2MgKi8KCiAgLyoqIEBkZXByZWNhdGVkICovCiAgR2VzdHVyZXMuZmluZE9yaWdpbmFsVGFyZ2V0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldDsKCiAgLyoqIEBkZXByZWNhdGVkICovCiAgR2VzdHVyZXMuYWRkID0gR2VzdHVyZXMuYWRkTGlzdGVuZXI7CgogIC8qKiBAZGVwcmVjYXRlZCAqLwogIEdlc3R1cmVzLnJlbW92ZSA9IEdlc3R1cmVzLnJlbW92ZUxpc3RlbmVyOwoKICBQb2x5bWVyLkdlc3R1cmVzID0gR2VzdHVyZXM7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBAY29uc3Qge1BvbHltZXIuR2VzdHVyZXN9CiAgICovCiAgY29uc3QgZ2VzdHVyZXMgPSBQb2x5bWVyLkdlc3R1cmVzOwoKICAvKioKICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgQVBJIGZvciBhZGRpbmcgUG9seW1lcidzIGNyb3NzLXBsYXRmb3JtCiAgICogZ2VzdHVyZSBldmVudHMgdG8gbm9kZXMuCiAgICoKICAgKiBUaGUgQVBJIGlzIGRlc2lnbmVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvdmVycmlkZSBwb2ludHMgaW1wbGVtZW50ZWQKICAgKiBpbiBgUG9seW1lci5UZW1wbGF0ZVN0YW1wYCBzdWNoIHRoYXQgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzIGluCiAgICogdGVtcGxhdGVzIHdpbGwgc3VwcG9ydCBnZXN0dXJlIGV2ZW50cyB3aGVuIHRoaXMgbWl4aW4gaXMgYXBwbGllZCBhbG9uZyB3aXRoCiAgICogYFBvbHltZXIuVGVtcGxhdGVTdGFtcGAuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgQVBJIGZvciBhZGRpbmcgUG9seW1lcidzIGNyb3NzLXBsYXRmb3JtCiAgICogZ2VzdHVyZSBldmVudHMgdG8gbm9kZXMKICAgKi8KICBQb2x5bWVyLkdlc3R1cmVFdmVudExpc3RlbmVycyA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfR2VzdHVyZUV2ZW50TGlzdGVuZXJzfQogICAgICovCiAgICBjbGFzcyBHZXN0dXJlRXZlbnRMaXN0ZW5lcnMgZXh0ZW5kcyBzdXBlckNsYXNzIHsKCiAgICAgIC8qKgogICAgICAgKiBBZGQgdGhlIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBub2RlIGlmIGl0IGlzIGEgZ2VzdHVyZXMgZXZlbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBhZGQgZXZlbnQgbGlzdGVuZXIgdG8KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50CiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KTp2b2lkfSBoYW5kbGVyIExpc3RlbmVyIGZ1bmN0aW9uIHRvIGFkZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgaWYgKCFnZXN0dXJlcy5hZGRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpKSB7CiAgICAgICAgICBzdXBlci5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZSB0aGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG5vZGUgaWYgaXQgaXMgYSBnZXN0dXJlcyBldmVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lciBmcm9tCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBMaXN0ZW5lciBmdW5jdGlvbiB0byByZW1vdmUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgaWYgKCFnZXN0dXJlcy5yZW1vdmVMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpKSB7CiAgICAgICAgICBzdXBlci5fcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgICAgfQogICAgICB9CgogICAgfQoKICAgIHJldHVybiBHZXN0dXJlRXZlbnRMaXN0ZW5lcnM7CgogIH0pOwoKfSkoKTsKCgogIChmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICBjb25zdCBIT1NUX0RJUiA9IC86aG9zdFwoOmRpclwoKGx0cnxydGwpXClcKS9nOwogICAgY29uc3QgSE9TVF9ESVJfUkVQTEFDTUVOVCA9ICc6aG9zdChbZGlyPSIkMSJdKSc7CgogICAgY29uc3QgRUxfRElSID0gLyhbXHNcdy0jXC5cW1xdXCpdKik6ZGlyXCgobHRyfHJ0bClcKS9nOwogICAgY29uc3QgRUxfRElSX1JFUExBQ01FTlQgPSAnOmhvc3QoW2Rpcj0iJDIiXSkgJDEnOwoKICAgIGNvbnN0IERJUl9DSEVDSyA9IC86ZGlyXCgoPzpsdHJ8cnRsKVwpLzsKICAgIAogICAgY29uc3QgU0hJTV9TSEFET1cgPSBCb29sZWFuKHdpbmRvd1snU2hhZHlET00nXSAmJiB3aW5kb3dbJ1NoYWR5RE9NJ11bJ2luVXNlJ10pOwoKICAgIC8qKgogICAgICogQHR5cGUgeyFBcnJheTwhUG9seW1lcl9EaXJNaXhpbj59CiAgICAgKi8KICAgIGNvbnN0IERJUl9JTlNUQU5DRVMgPSBbXTsKCiAgICAvKiogQHR5cGUge011dGF0aW9uT2JzZXJ2ZXJ9ICovCiAgICBsZXQgb2JzZXJ2ZXIgPSBudWxsOwoKICAgIGxldCBET0NVTUVOVF9ESVIgPSAnJzsKCiAgICBmdW5jdGlvbiBnZXRSVEwoKSB7CiAgICAgIERPQ1VNRU5UX0RJUiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpcicpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHshUG9seW1lcl9EaXJNaXhpbn0gaW5zdGFuY2UgSW5zdGFuY2UgdG8gc2V0IFJUTCBzdGF0dXMgb24KICAgICAqLwogICAgZnVuY3Rpb24gc2V0UlRMKGluc3RhbmNlKSB7CiAgICAgIGlmICghaW5zdGFuY2UuX19hdXRvRGlyT3B0T3V0KSB7CiAgICAgICAgY29uc3QgZWwgPSAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8oaW5zdGFuY2UpOwogICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGlyJywgRE9DVU1FTlRfRElSKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZURpcmVjdGlvbigpIHsKICAgICAgZ2V0UlRMKCk7CiAgICAgIERPQ1VNRU5UX0RJUiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpcicpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IERJUl9JTlNUQU5DRVMubGVuZ3RoOyBpKyspIHsKICAgICAgICBzZXRSVEwoRElSX0lOU1RBTkNFU1tpXSk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB0YWtlUmVjb3JkcygpIHsKICAgICAgaWYgKG9ic2VydmVyICYmIG9ic2VydmVyLnRha2VSZWNvcmRzKCkubGVuZ3RoKSB7CiAgICAgICAgdXBkYXRlRGlyZWN0aW9uKCk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBhbGxvd3MgZWxlbWVudHMgdG8gdXNlIHRoZSBgOmRpcmAgQ1NTIFNlbGVjdG9yIHRvIGhhdmUKICAgICAqIHRleHQgZGlyZWN0aW9uIHNwZWNpZmljIHN0eWxpbmcuCiAgICAgKgogICAgICogV2l0aCB0aGlzIG1peGluLCBhbnkgc3R5bGVzaGVldCBwcm92aWRlZCBpbiB0aGUgdGVtcGxhdGUgd2lsbCB0cmFuc2Zvcm0gYDpkaXJgIGludG8KICAgICAqIGA6aG9zdChbZGlyXSlgIGFuZCBzeW5jIGRpcmVjdGlvbiB3aXRoIHRoZSBwYWdlIHZpYSB0aGUgZWxlbWVudCdzIGBkaXJgIGF0dHJpYnV0ZS4KICAgICAqCiAgICAgKiBFbGVtZW50cyBjYW4gb3B0IG91dCBvZiB0aGUgZ2xvYmFsIHBhZ2UgdGV4dCBkaXJlY3Rpb24gYnkgc2V0dGluZyB0aGUgYGRpcmAgYXR0cmlidXRlCiAgICAgKiBkaXJlY3RseSBpbiBgcmVhZHkoKWAgb3IgaW4gSFRNTC4KICAgICAqCiAgICAgKiBDYXZlYXRzOgogICAgICogLSBBcHBsaWNhdGlvbnMgbXVzdCBzZXQgYDxodG1sIGRpcj0ibHRyIj5gIG9yIGA8aHRtbCBkaXI9InJ0bCI+YCB0byBzeW5jIGRpcmVjdGlvbgogICAgICogLSBBdXRvbWF0aWMgbGVmdC10by1yaWdodCBvciByaWdodC10by1sZWZ0IHN0eWxpbmcgaXMgc3luYydkIHdpdGggdGhlIGA8aHRtbD5gIGVsZW1lbnQgb25seS4KICAgICAqIC0gQ2hhbmdpbmcgYGRpcmAgYXQgcnVudGltZSBpcyBzdXBwb3J0ZWQuCiAgICAgKiAtIE9wdGluZyBvdXQgb2YgdGhlIGdsb2JhbCBkaXJlY3Rpb24gc3R5bGluZyBpcyBwZXJtYW5lbnQKICAgICAqCiAgICAgKiBAbWl4aW5GdW5jdGlvbgogICAgICogQHBvbHltZXIKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUFjY2Vzc29ycwogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqLwogICAgUG9seW1lci5EaXJNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbigoYmFzZSkgPT4gewoKICAgICAgaWYgKCFTSElNX1NIQURPVykgewogICAgICAgIGlmICghb2JzZXJ2ZXIpIHsKICAgICAgICAgIGdldFJUTCgpOwogICAgICAgICAgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcih1cGRhdGVEaXJlY3Rpb24pOwogICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHthdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsnZGlyJ119KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5QWNjZXNzb3JzfQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgY29uc3QgZWxlbWVudEJhc2UgPSBQb2x5bWVyLlByb3BlcnR5QWNjZXNzb3JzKGJhc2UpOwoKICAgICAgLyoqCiAgICAgICAqIEBwb2x5bWVyCiAgICAgICAqIEBtaXhpbkNsYXNzCiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0Rpck1peGlufQogICAgICAgKi8KICAgICAgY2xhc3MgRGlyIGV4dGVuZHMgZWxlbWVudEJhc2UgewoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgX3Byb2Nlc3NTdHlsZVRleHQoY3NzVGV4dCwgYmFzZVVSSSkgewogICAgICAgICAgY3NzVGV4dCA9IHN1cGVyLl9wcm9jZXNzU3R5bGVUZXh0KGNzc1RleHQsIGJhc2VVUkkpOwogICAgICAgICAgaWYgKCFTSElNX1NIQURPVyAmJiBESVJfQ0hFQ0sudGVzdChjc3NUZXh0KSkgewogICAgICAgICAgICBjc3NUZXh0ID0gdGhpcy5fcmVwbGFjZURpckluQ3NzVGV4dChjc3NUZXh0KTsKICAgICAgICAgICAgdGhpcy5fX2FjdGl2YXRlRGlyID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjc3NUZXh0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmVwbGFjZSBgOmRpcmAgaW4gdGhlIGdpdmVuIENTUyB0ZXh0CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBDU1MgdGV4dCB0byByZXBsYWNlIERJUgogICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gTW9kaWZpZWQgQ1NTCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIF9yZXBsYWNlRGlySW5Dc3NUZXh0KHRleHQpIHsKICAgICAgICAgIGxldCByZXBsYWNlZFRleHQgPSB0ZXh0OwogICAgICAgICAgcmVwbGFjZWRUZXh0ID0gcmVwbGFjZWRUZXh0LnJlcGxhY2UoSE9TVF9ESVIsIEhPU1RfRElSX1JFUExBQ01FTlQpOwogICAgICAgICAgcmVwbGFjZWRUZXh0ID0gcmVwbGFjZWRUZXh0LnJlcGxhY2UoRUxfRElSLCBFTF9ESVJfUkVQTEFDTUVOVCk7CiAgICAgICAgICByZXR1cm4gcmVwbGFjZWRUZXh0OwogICAgICAgIH0KCiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgICAgdGhpcy5fX2F1dG9EaXJPcHRPdXQgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBDbG9zdXJlIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGF0IGB0aGlzYCBpcyBhbiBIVE1MRWxlbWVudAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgcmVhZHkoKSB7CiAgICAgICAgICBzdXBlci5yZWFkeSgpOwogICAgICAgICAgdGhpcy5fX2F1dG9EaXJPcHRPdXQgPSAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcykuaGFzQXR0cmlidXRlKCdkaXInKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IElmIGl0IGV4aXN0cyBvbiBlbGVtZW50QmFzZSwgaXQgY2FuIGJlIHN1cGVyJ2QKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgaWYgKGVsZW1lbnRCYXNlLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaykgewogICAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuX19hY3RpdmF0ZURpcikgewogICAgICAgICAgICB0YWtlUmVjb3JkcygpOwogICAgICAgICAgICBESVJfSU5TVEFOQ0VTLnB1c2godGhpcyk7CiAgICAgICAgICAgIHNldFJUTCh0aGlzKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IElmIGl0IGV4aXN0cyBvbiBlbGVtZW50QmFzZSwgaXQgY2FuIGJlIHN1cGVyJ2QKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgaWYgKGVsZW1lbnRCYXNlLnByb3RvdHlwZS5kaXNjb25uZWN0ZWRDYWxsYmFjaykgewogICAgICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuX19hY3RpdmF0ZURpcikgewogICAgICAgICAgICBjb25zdCBpZHggPSBESVJfSU5TVEFOQ0VTLmluZGV4T2YodGhpcyk7CiAgICAgICAgICAgIGlmIChpZHggPiAtMSkgewogICAgICAgICAgICAgIERJUl9JTlNUQU5DRVMuc3BsaWNlKGlkeCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIERpci5fX2FjdGl2YXRlRGlyID0gZmFsc2U7CgogICAgICByZXR1cm4gRGlyOwogICAgfSk7CiAgfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewoKICAndXNlIHN0cmljdCc7CgogIC8vIHJ1biBhIGNhbGxiYWNrIHdoZW4gSFRNTEltcG9ydHMgYXJlIHJlYWR5IG9yIGltbWVkaWF0ZWx5IGlmCiAgLy8gdGhpcyBhcGkgaXMgbm90IGF2YWlsYWJsZS4KICBmdW5jdGlvbiB3aGVuSW1wb3J0c1JlYWR5KGNiKSB7CiAgICBpZiAod2luZG93LkhUTUxJbXBvcnRzKSB7CiAgICAgIEhUTUxJbXBvcnRzLndoZW5SZWFkeShjYik7CiAgICB9IGVsc2UgewogICAgICBjYigpOwogICAgfQogIH0KCiAgLyoqCiAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBpbXBvcnRpbmcgYW4gSFRNTCBkb2N1bWVudCBpbXBlcmF0aXZlbHkuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IGA8bGluayByZWw9ImltcG9ydCI+YCBlbGVtZW50IHdpdGgKICAgKiB0aGUgcHJvdmlkZWQgVVJMIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBkb2N1bWVudCB0byBzdGFydCBsb2FkaW5nLgogICAqIEluIHRoZSBgb25sb2FkYCBjYWxsYmFjaywgdGhlIGBpbXBvcnRgIHByb3BlcnR5IG9mIHRoZSBgbGlua2AKICAgKiBlbGVtZW50IHdpbGwgY29udGFpbiB0aGUgaW1wb3J0ZWQgZG9jdW1lbnQgY29udGVudHMuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7c3RyaW5nfSBocmVmIFVSTCB0byBkb2N1bWVudCB0byBsb2FkLgogICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFdmVudCk6dm9pZD19IG9ubG9hZCBDYWxsYmFjayB0byBub3RpZnkgd2hlbiBhbiBpbXBvcnQgc3VjY2Vzc2Z1bGx5CiAgICogICBsb2FkZWQuCiAgICogQHBhcmFtIHs/ZnVuY3Rpb24oIUVycm9yRXZlbnQpOnZvaWQ9fSBvbmVycm9yIENhbGxiYWNrIHRvIG5vdGlmeSB3aGVuIGFuIGltcG9ydAogICAqICAgdW5zdWNjZXNzZnVsbHkgbG9hZGVkLgogICAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdEFzeW5jIFRydWUgaWYgdGhlIGltcG9ydCBzaG91bGQgYmUgbG9hZGVkIGBhc3luY2AuCiAgICogICBEZWZhdWx0cyB0byBgZmFsc2VgLgogICAqIEByZXR1cm4geyFIVE1MTGlua0VsZW1lbnR9IFRoZSBsaW5rIGVsZW1lbnQgZm9yIHRoZSBVUkwgdG8gYmUgbG9hZGVkLgogICAqLwogIFBvbHltZXIuaW1wb3J0SHJlZiA9IGZ1bmN0aW9uKGhyZWYsIG9ubG9hZCwgb25lcnJvciwgb3B0QXN5bmMpIHsKICAgIGxldCBsaW5rID0gLyoqIEB0eXBlIHtIVE1MTGlua0VsZW1lbnR9ICovCiAgICAgIChkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZj0iJyArIGhyZWYgKyAnIl1baW1wb3J0LWhyZWZdJykpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIGxpbmsgPSAvKiogQHR5cGUge0hUTUxMaW5rRWxlbWVudH0gKi8gKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKSk7CiAgICAgIGxpbmsucmVsID0gJ2ltcG9ydCc7CiAgICAgIGxpbmsuaHJlZiA9IGhyZWY7CiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdpbXBvcnQtaHJlZicsICcnKTsKICAgIH0KICAgIC8vIGFsd2F5cyBlbnN1cmUgbGluayBoYXMgYGFzeW5jYCBhdHRyaWJ1dGUgaWYgdXNlciBzcGVjaWZpZWQgb25lLAogICAgLy8gZXZlbiBpZiBpdCB3YXMgcHJldmlvdXNseSBub3QgYXN5bmMuIFRoaXMgaXMgY29uc2lkZXJlZCBsZXNzIGNvbmZ1c2luZy4KICAgIGlmIChvcHRBc3luYykgewogICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnYXN5bmMnLCAnJyk7CiAgICB9CiAgICAvLyBOT1RFOiB0aGUgbGluayBtYXkgbm93IGJlIGluIDMgc3RhdGVzOiAoMSkgcGVuZGluZyBpbnNlcnRpb24sCiAgICAvLyAoMikgaW5mbGlnaHQsICgzKSBhbHJlYWR5IGxvYWRlZC4gSW4gZWFjaCBjYXNlLCB3ZSBuZWVkIHRvIGFkZAogICAgLy8gZXZlbnQgbGlzdGVuZXJzIHRvIHByb2Nlc3MgY2FsbGJhY2tzLgogICAgbGV0IGNsZWFudXAgPSBmdW5jdGlvbigpIHsKICAgICAgbGluay5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgbG9hZExpc3RlbmVyKTsKICAgICAgbGluay5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpOwogICAgfTsKICAgIGxldCBsb2FkTGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCkgewogICAgICBjbGVhbnVwKCk7CiAgICAgIC8vIEluIGNhc2Ugb2YgYSBzdWNjZXNzZnVsIGxvYWQsIGNhY2hlIHRoZSBsb2FkIGV2ZW50IG9uIHRoZSBsaW5rIHNvCiAgICAgIC8vIHRoYXQgaXQgY2FuIGJlIHVzZWQgdG8gc2hvcnQtY2lyY3VpdCB0aGlzIG1ldGhvZCBpbiB0aGUgZnV0dXJlIHdoZW4KICAgICAgLy8gaXQgaXMgY2FsbGVkIHdpdGggdGhlIHNhbWUgaHJlZiBwYXJhbS4KICAgICAgbGluay5fX2R5bmFtaWNJbXBvcnRMb2FkZWQgPSB0cnVlOwogICAgICBpZiAob25sb2FkKSB7CiAgICAgICAgd2hlbkltcG9ydHNSZWFkeSgoKSA9PiB7CiAgICAgICAgICBvbmxvYWQoZXZlbnQpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgbGV0IGVycm9yTGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCkgewogICAgICBjbGVhbnVwKCk7CiAgICAgIC8vIEluIGNhc2Ugb2YgYW4gZXJyb3IsIHJlbW92ZSB0aGUgbGluayBmcm9tIHRoZSBkb2N1bWVudCBzbyB0aGF0IGl0CiAgICAgIC8vIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGFnYWluIHRoZSBuZXh0IHRpbWUgYGltcG9ydEhyZWZgIGlzCiAgICAgIC8vIGNhbGxlZC4KICAgICAgaWYgKGxpbmsucGFyZW50Tm9kZSkgewogICAgICAgIGxpbmsucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsaW5rKTsKICAgICAgfQogICAgICBpZiAob25lcnJvcikgewogICAgICAgIHdoZW5JbXBvcnRzUmVhZHkoKCkgPT4gewogICAgICAgICAgb25lcnJvcihldmVudCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBsb2FkTGlzdGVuZXIpOwogICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpOwogICAgaWYgKGxpbmsucGFyZW50Tm9kZSA9PSBudWxsKSB7CiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7CiAgICAvLyBpZiB0aGUgbGluayBhbHJlYWR5IGxvYWRlZCwgZGlzcGF0Y2ggYSBmYWtlIGxvYWQgZXZlbnQKICAgIC8vIHNvIHRoYXQgbGlzdGVuZXJzIGFyZSBjYWxsZWQgYW5kIGdldCBhIHByb3BlciBldmVudCBhcmd1bWVudC4KICAgIH0gZWxzZSBpZiAobGluay5fX2R5bmFtaWNJbXBvcnRMb2FkZWQpIHsKICAgICAgbGluay5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnbG9hZCcpKTsKICAgIH0KICAgIHJldHVybiBsaW5rOwogIH07Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgc2NoZWR1bGVkID0gZmFsc2U7CiAgbGV0IGJlZm9yZVJlbmRlclF1ZXVlID0gW107CiAgbGV0IGFmdGVyUmVuZGVyUXVldWUgPSBbXTsKCiAgZnVuY3Rpb24gc2NoZWR1bGUoKSB7CiAgICBzY2hlZHVsZWQgPSB0cnVlOwogICAgLy8gYmVmb3JlIG5leHQgcmVuZGVyCiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7CiAgICAgIHNjaGVkdWxlZCA9IGZhbHNlOwogICAgICBmbHVzaFF1ZXVlKGJlZm9yZVJlbmRlclF1ZXVlKTsKICAgICAgLy8gYWZ0ZXIgdGhlIHJlbmRlcgogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHJ1blF1ZXVlKGFmdGVyUmVuZGVyUXVldWUpOwogICAgICB9KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZmx1c2hRdWV1ZShxdWV1ZSkgewogICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkgewogICAgICBjYWxsTWV0aG9kKHF1ZXVlLnNoaWZ0KCkpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcnVuUXVldWUocXVldWUpIHsKICAgIGZvciAobGV0IGk9MCwgbD1xdWV1ZS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgY2FsbE1ldGhvZChxdWV1ZS5zaGlmdCgpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNhbGxNZXRob2QoaW5mbykgewogICAgY29uc3QgY29udGV4dCA9IGluZm9bMF07CiAgICBjb25zdCBjYWxsYmFjayA9IGluZm9bMV07CiAgICBjb25zdCBhcmdzID0gaW5mb1syXTsKICAgIHRyeSB7CiAgICAgIGNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIGFyZ3MpOwogICAgfSBjYXRjaChlKSB7CiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIHRocm93IGU7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZmx1c2goKSB7CiAgICB3aGlsZSAoYmVmb3JlUmVuZGVyUXVldWUubGVuZ3RoIHx8IGFmdGVyUmVuZGVyUXVldWUubGVuZ3RoKSB7CiAgICAgIGZsdXNoUXVldWUoYmVmb3JlUmVuZGVyUXVldWUpOwogICAgICBmbHVzaFF1ZXVlKGFmdGVyUmVuZGVyUXVldWUpOwogICAgfQogICAgc2NoZWR1bGVkID0gZmFsc2U7CiAgfQoKICAvKioKICAgKiBNb2R1bGUgZm9yIHNjaGVkdWxpbmcgZmx1c2hhYmxlIHByZS1yZW5kZXIgYW5kIHBvc3QtcmVuZGVyIHRhc2tzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIGZvciBzY2hlZHVsaW5nIGZsdXNoYWJsZSBwcmUtcmVuZGVyIGFuZCBwb3N0LXJlbmRlciB0YXNrcy4KICAgKi8KICBQb2x5bWVyLlJlbmRlclN0YXR1cyA9IHsKCiAgICAvKioKICAgICAqIEVucXVldWVzIGEgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBydW4gYmVmb3JlIHRoZSBuZXh0IHJlbmRlciwgYXQKICAgICAqIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIHRpbWluZy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIGVucXVldWluZyB3b3JrIHRoYXQgcmVxdWlyZXMgRE9NIG1lYXN1cmVtZW50LAogICAgICogc2luY2UgbWVhc3VyZW1lbnQgbWF5IG5vdCBiZSByZWxpYWJsZSBpbiBjdXN0b20gZWxlbWVudCBjYWxsYmFja3MgYmVmb3JlCiAgICAgKiB0aGUgZmlyc3QgcmVuZGVyLCBhcyB3ZWxsIGFzIGZvciBiYXRjaGluZyBtZWFzdXJlbWVudCB0YXNrcyBpbiBnZW5lcmFsLgogICAgICoKICAgICAqIFRhc2tzIGluIHRoaXMgcXVldWUgbWF5IGJlIGZsdXNoZWQgYnkgY2FsbGluZyBgUG9seW1lci5SZW5kZXJTdGF0dXMuZmx1c2goKWAuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUmVuZGVyU3RhdHVzCiAgICAgKiBAcGFyYW0geyp9IGNvbnRleHQgQ29udGV4dCBvYmplY3QgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgYm91bmQgdG8KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oLi4uKik6dm9pZH0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7IUFycmF5PX0gYXJncyBBbiBhcnJheSBvZiBhcmd1bWVudHMgdG8gY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aAogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgYmVmb3JlTmV4dFJlbmRlcjogZnVuY3Rpb24oY29udGV4dCwgY2FsbGJhY2ssIGFyZ3MpIHsKICAgICAgaWYgKCFzY2hlZHVsZWQpIHsKICAgICAgICBzY2hlZHVsZSgpOwogICAgICB9CiAgICAgIGJlZm9yZVJlbmRlclF1ZXVlLnB1c2goW2NvbnRleHQsIGNhbGxiYWNrLCBhcmdzXSk7CiAgICB9LAoKICAgIC8qKgogICAgICogRW5xdWV1ZXMgYSBjYWxsYmFjayB3aGljaCB3aWxsIGJlIHJ1biBhZnRlciB0aGUgbmV4dCByZW5kZXIsIGVxdWl2YWxlbnQKICAgICAqIHRvIG9uZSB0YXNrIChgc2V0VGltZW91dGApIGFmdGVyIHRoZSBuZXh0IGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgdHVuaW5nIHRoZSBmaXJzdC1yZW5kZXIgcGVyZm9ybWFuY2Ugb2YgYW4KICAgICAqIGVsZW1lbnQgb3IgYXBwbGljYXRpb24gYnkgZGVmZXJyaW5nIG5vbi1jcml0aWNhbCB3b3JrIHVudGlsIGFmdGVyIHRoZQogICAgICogZmlyc3QgcGFpbnQuICBUeXBpY2FsIG5vbi1yZW5kZXItY3JpdGljYWwgd29yayBtYXkgaW5jbHVkZSBhZGRpbmcgVUkKICAgICAqIGV2ZW50IGxpc3RlbmVycyBhbmQgYXJpYSBhdHRyaWJ1dGVzLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlbmRlclN0YXR1cwogICAgICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgb2JqZWN0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGJvdW5kIHRvCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKC4uLiopOnZvaWR9IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0geyFBcnJheT19IGFyZ3MgQW4gYXJyYXkgb2YgYXJndW1lbnRzIHRvIGNhbGwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGgKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGFmdGVyTmV4dFJlbmRlcjogZnVuY3Rpb24oY29udGV4dCwgY2FsbGJhY2ssIGFyZ3MpIHsKICAgICAgaWYgKCFzY2hlZHVsZWQpIHsKICAgICAgICBzY2hlZHVsZSgpOwogICAgICB9CiAgICAgIGFmdGVyUmVuZGVyUXVldWUucHVzaChbY29udGV4dCwgY2FsbGJhY2ssIGFyZ3NdKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBGbHVzaGVzIGFsbCBgYmVmb3JlTmV4dFJlbmRlcmAgdGFza3MsIGZvbGxvd2VkIGJ5IGFsbCBgYWZ0ZXJOZXh0UmVuZGVyYAogICAgICogdGFza3MuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUmVuZGVyU3RhdHVzCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBmbHVzaDogZmx1c2gKCiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLy8gdW5yZXNvbHZlZAoKICBmdW5jdGlvbiByZXNvbHZlKCkgewogICAgZG9jdW1lbnQuYm9keS5yZW1vdmVBdHRyaWJ1dGUoJ3VucmVzb2x2ZWQnKTsKICB9CgogIGlmICh3aW5kb3cuV2ViQ29tcG9uZW50cykgewogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ1dlYkNvbXBvbmVudHNSZWFkeScsIHJlc29sdmUpOwogIH0gZWxzZSB7CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2ludGVyYWN0aXZlJyB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7CiAgICAgIHJlc29sdmUoKTsKICAgIH0gZWxzZSB7CiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgcmVzb2x2ZSk7CiAgICB9CiAgfQoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gbmV3U3BsaWNlKGluZGV4LCByZW1vdmVkLCBhZGRlZENvdW50KSB7CiAgICByZXR1cm4gewogICAgICBpbmRleDogaW5kZXgsCiAgICAgIHJlbW92ZWQ6IHJlbW92ZWQsCiAgICAgIGFkZGVkQ291bnQ6IGFkZGVkQ291bnQKICAgIH07CiAgfQoKICBjb25zdCBFRElUX0xFQVZFID0gMDsKICBjb25zdCBFRElUX1VQREFURSA9IDE7CiAgY29uc3QgRURJVF9BREQgPSAyOwogIGNvbnN0IEVESVRfREVMRVRFID0gMzsKCiAgLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBpcyAqYmFzZWQqIG9uIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgTGV2ZW5zaHRlaW4KICAvLyAiZWRpdCIgZGlzdGFuY2UuIFRoZSBvbmUgY2hhbmdlIGlzIHRoYXQgInVwZGF0ZXMiIGFyZSB0cmVhdGVkIGFzIHR3bwogIC8vIGVkaXRzIC0gbm90IG9uZS4gV2l0aCBBcnJheSBzcGxpY2VzLCBhbiB1cGRhdGUgaXMgcmVhbGx5IGEgZGVsZXRlCiAgLy8gZm9sbG93ZWQgYnkgYW4gYWRkLiBCeSByZXRhaW5pbmcgdGhpcywgd2Ugb3B0aW1pemUgZm9yICJrZWVwaW5nIiB0aGUKICAvLyBtYXhpbXVtIGFycmF5IGl0ZW1zIGluIHRoZSBvcmlnaW5hbCBhcnJheS4gRm9yIGV4YW1wbGU6CiAgLy8KICAvLyAgICd4eHh4MTIzJyAtPiAnMTIzeXl5eScKICAvLwogIC8vIFdpdGggMS1lZGl0IHVwZGF0ZXMsIHRoZSBzaG9ydGVzdCBwYXRoIHdvdWxkIGJlIGp1c3QgdG8gdXBkYXRlIGFsbCBzZXZlbgogIC8vIGNoYXJhY3RlcnMuIFdpdGggMi1lZGl0IHVwZGF0ZXMsIHdlIGRlbGV0ZSA0LCBsZWF2ZSAzLCBhbmQgYWRkIDQuIFRoaXMKICAvLyBsZWF2ZXMgdGhlIHN1YnN0cmluZyAnMTIzJyBpbnRhY3QuCiAgZnVuY3Rpb24gY2FsY0VkaXREaXN0YW5jZXMoY3VycmVudCwgY3VycmVudFN0YXJ0LCBjdXJyZW50RW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQsIG9sZFN0YXJ0LCBvbGRFbmQpIHsKICAgIC8vICJEZWxldGlvbiIgY29sdW1ucwogICAgbGV0IHJvd0NvdW50ID0gb2xkRW5kIC0gb2xkU3RhcnQgKyAxOwogICAgbGV0IGNvbHVtbkNvdW50ID0gY3VycmVudEVuZCAtIGN1cnJlbnRTdGFydCArIDE7CiAgICBsZXQgZGlzdGFuY2VzID0gbmV3IEFycmF5KHJvd0NvdW50KTsKCiAgICAvLyAiQWRkaXRpb24iIHJvd3MuIEluaXRpYWxpemUgbnVsbCBjb2x1bW4uCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd0NvdW50OyBpKyspIHsKICAgICAgZGlzdGFuY2VzW2ldID0gbmV3IEFycmF5KGNvbHVtbkNvdW50KTsKICAgICAgZGlzdGFuY2VzW2ldWzBdID0gaTsKICAgIH0KCiAgICAvLyBJbml0aWFsaXplIG51bGwgcm93CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHVtbkNvdW50OyBqKyspCiAgICAgIGRpc3RhbmNlc1swXVtqXSA9IGo7CgogICAgZm9yIChsZXQgaSA9IDE7IGkgPCByb3dDb3VudDsgaSsrKSB7CiAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgY29sdW1uQ291bnQ7IGorKykgewogICAgICAgIGlmIChlcXVhbHMoY3VycmVudFtjdXJyZW50U3RhcnQgKyBqIC0gMV0sIG9sZFtvbGRTdGFydCArIGkgLSAxXSkpCiAgICAgICAgICBkaXN0YW5jZXNbaV1bal0gPSBkaXN0YW5jZXNbaSAtIDFdW2ogLSAxXTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGxldCBub3J0aCA9IGRpc3RhbmNlc1tpIC0gMV1bal0gKyAxOwogICAgICAgICAgbGV0IHdlc3QgPSBkaXN0YW5jZXNbaV1baiAtIDFdICsgMTsKICAgICAgICAgIGRpc3RhbmNlc1tpXVtqXSA9IG5vcnRoIDwgd2VzdCA/IG5vcnRoIDogd2VzdDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZGlzdGFuY2VzOwogIH0KCiAgLy8gVGhpcyBzdGFydHMgYXQgdGhlIGZpbmFsIHdlaWdodCwgYW5kIHdhbGtzICJiYWNrd2FyZCIgYnkgZmluZGluZwogIC8vIHRoZSBtaW5pbXVtIHByZXZpb3VzIHdlaWdodCByZWN1cnNpdmVseSB1bnRpbCB0aGUgb3JpZ2luIG9mIHRoZSB3ZWlnaHQKICAvLyBtYXRyaXguCiAgZnVuY3Rpb24gc3BsaWNlT3BlcmF0aW9uc0Zyb21FZGl0RGlzdGFuY2VzKGRpc3RhbmNlcykgewogICAgbGV0IGkgPSBkaXN0YW5jZXMubGVuZ3RoIC0gMTsKICAgIGxldCBqID0gZGlzdGFuY2VzWzBdLmxlbmd0aCAtIDE7CiAgICBsZXQgY3VycmVudCA9IGRpc3RhbmNlc1tpXVtqXTsKICAgIGxldCBlZGl0cyA9IFtdOwogICAgd2hpbGUgKGkgPiAwIHx8IGogPiAwKSB7CiAgICAgIGlmIChpID09IDApIHsKICAgICAgICBlZGl0cy5wdXNoKEVESVRfQUREKTsKICAgICAgICBqLS07CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGogPT0gMCkgewogICAgICAgIGVkaXRzLnB1c2goRURJVF9ERUxFVEUpOwogICAgICAgIGktLTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgbm9ydGhXZXN0ID0gZGlzdGFuY2VzW2kgLSAxXVtqIC0gMV07CiAgICAgIGxldCB3ZXN0ID0gZGlzdGFuY2VzW2kgLSAxXVtqXTsKICAgICAgbGV0IG5vcnRoID0gZGlzdGFuY2VzW2ldW2ogLSAxXTsKCiAgICAgIGxldCBtaW47CiAgICAgIGlmICh3ZXN0IDwgbm9ydGgpCiAgICAgICAgbWluID0gd2VzdCA8IG5vcnRoV2VzdCA/IHdlc3QgOiBub3J0aFdlc3Q7CiAgICAgIGVsc2UKICAgICAgICBtaW4gPSBub3J0aCA8IG5vcnRoV2VzdCA/IG5vcnRoIDogbm9ydGhXZXN0OwoKICAgICAgaWYgKG1pbiA9PSBub3J0aFdlc3QpIHsKICAgICAgICBpZiAobm9ydGhXZXN0ID09IGN1cnJlbnQpIHsKICAgICAgICAgIGVkaXRzLnB1c2goRURJVF9MRUFWRSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVkaXRzLnB1c2goRURJVF9VUERBVEUpOwogICAgICAgICAgY3VycmVudCA9IG5vcnRoV2VzdDsKICAgICAgICB9CiAgICAgICAgaS0tOwogICAgICAgIGotLTsKICAgICAgfSBlbHNlIGlmIChtaW4gPT0gd2VzdCkgewogICAgICAgIGVkaXRzLnB1c2goRURJVF9ERUxFVEUpOwogICAgICAgIGktLTsKICAgICAgICBjdXJyZW50ID0gd2VzdDsKICAgICAgfSBlbHNlIHsKICAgICAgICBlZGl0cy5wdXNoKEVESVRfQUREKTsKICAgICAgICBqLS07CiAgICAgICAgY3VycmVudCA9IG5vcnRoOwogICAgICB9CiAgICB9CgogICAgZWRpdHMucmV2ZXJzZSgpOwogICAgcmV0dXJuIGVkaXRzOwogIH0KCiAgLyoqCiAgICogU3BsaWNlIFByb2plY3Rpb24gZnVuY3Rpb25zOgogICAqCiAgICogQSBzcGxpY2UgbWFwIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgaG93IGEgcHJldmlvdXMgYXJyYXkgb2YgaXRlbXMKICAgKiB3YXMgdHJhbnNmb3JtZWQgaW50byBhIG5ldyBhcnJheSBvZiBpdGVtcy4gQ29uY2VwdHVhbGx5IGl0IGlzIGEgbGlzdCBvZgogICAqIHR1cGxlcyBvZgogICAqCiAgICogICA8aW5kZXgsIHJlbW92ZWQsIGFkZGVkQ291bnQ+CiAgICoKICAgKiB3aGljaCBhcmUga2VwdCBpbiBhc2NlbmRpbmcgaW5kZXggb3JkZXIgb2YuIFRoZSB0dXBsZSByZXByZXNlbnRzIHRoYXQgYXQKICAgKiB0aGUgfGluZGV4fCwgfHJlbW92ZWR8IHNlcXVlbmNlIG9mIGl0ZW1zIHdlcmUgcmVtb3ZlZCwgYW5kIGNvdW50aW5nIGZvcndhcmQKICAgKiBmcm9tIHxpbmRleHwsIHxhZGRlZENvdW50fCBpdGVtcyB3ZXJlIGFkZGVkLgogICAqLwoKICAvKioKICAgKiBMYWNraW5nIGluZGl2aWR1YWwgc3BsaWNlIG11dGF0aW9uIGluZm9ybWF0aW9uLCB0aGUgbWluaW1hbCBzZXQgb2YKICAgKiBzcGxpY2VzIGNhbiBiZSBzeW50aGVzaXplZCBnaXZlbiB0aGUgcHJldmlvdXMgc3RhdGUgYW5kIGZpbmFsIHN0YXRlIG9mIGFuCiAgICogYXJyYXkuIFRoZSBiYXNpYyBhcHByb2FjaCBpcyB0byBjYWxjdWxhdGUgdGhlIGVkaXQgZGlzdGFuY2UgbWF0cml4IGFuZAogICAqIGNob29zZSB0aGUgc2hvcnRlc3QgcGF0aCB0aHJvdWdoIGl0LgogICAqCiAgICogQ29tcGxleGl0eTogTyhsICogcCkKICAgKiAgIGw6IFRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgYXJyYXkKICAgKiAgIHA6IFRoZSBsZW5ndGggb2YgdGhlIG9sZCBhcnJheQogICAqCiAgICogQHBhcmFtIHshQXJyYXl9IGN1cnJlbnQgVGhlIGN1cnJlbnQgImNoYW5nZWQiIGFycmF5IGZvciB3aGljaCB0bwogICAqIGNhbGN1bGF0ZSBzcGxpY2VzLgogICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50U3RhcnQgU3RhcnRpbmcgaW5kZXggaW4gdGhlIGBjdXJyZW50YCBhcnJheSBmb3IKICAgKiB3aGljaCBzcGxpY2VzIGFyZSBjYWxjdWxhdGVkLgogICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50RW5kIEVuZGluZyBpbmRleCBpbiB0aGUgYGN1cnJlbnRgIGFycmF5IGZvcgogICAqIHdoaWNoIHNwbGljZXMgYXJlIGNhbGN1bGF0ZWQuCiAgICogQHBhcmFtIHshQXJyYXl9IG9sZCBUaGUgb3JpZ2luYWwgInVuY2hhbmdlZCIgYXJyYXkgdG8gY29tcGFyZSBgY3VycmVudGAKICAgKiBhZ2FpbnN0IHRvIGRldGVybWluZSBzcGxpY2VzLgogICAqIEBwYXJhbSB7bnVtYmVyfSBvbGRTdGFydCBTdGFydGluZyBpbmRleCBpbiB0aGUgYG9sZGAgYXJyYXkgZm9yCiAgICogd2hpY2ggc3BsaWNlcyBhcmUgY2FsY3VsYXRlZC4KICAgKiBAcGFyYW0ge251bWJlcn0gb2xkRW5kIEVuZGluZyBpbmRleCBpbiB0aGUgYG9sZGAgYXJyYXkgZm9yCiAgICogd2hpY2ggc3BsaWNlcyBhcmUgY2FsY3VsYXRlZC4KICAgKiBAcmV0dXJuIHshQXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZCBvYmplY3RzLiBFYWNoIG9mIHRoZXNlCiAgICogY29udGFpbnM6IGBpbmRleGAgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBzcGxpY2Ugb2NjdXJyZWQ7IGByZW1vdmVkYAogICAqIHRoZSBhcnJheSBvZiByZW1vdmVkIGl0ZW1zIGZyb20gdGhpcyBsb2NhdGlvbjsgYGFkZGVkQ291bnRgIHRoZSBudW1iZXIKICAgKiBvZiBpdGVtcyBhZGRlZCBhdCB0aGlzIGxvY2F0aW9uLgogICAqLwogIGZ1bmN0aW9uIGNhbGNTcGxpY2VzKGN1cnJlbnQsIGN1cnJlbnRTdGFydCwgY3VycmVudEVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgb2xkLCBvbGRTdGFydCwgb2xkRW5kKSB7CiAgICBsZXQgcHJlZml4Q291bnQgPSAwOwogICAgbGV0IHN1ZmZpeENvdW50ID0gMDsKICAgIGxldCBzcGxpY2U7CgogICAgbGV0IG1pbkxlbmd0aCA9IE1hdGgubWluKGN1cnJlbnRFbmQgLSBjdXJyZW50U3RhcnQsIG9sZEVuZCAtIG9sZFN0YXJ0KTsKICAgIGlmIChjdXJyZW50U3RhcnQgPT0gMCAmJiBvbGRTdGFydCA9PSAwKQogICAgICBwcmVmaXhDb3VudCA9IHNoYXJlZFByZWZpeChjdXJyZW50LCBvbGQsIG1pbkxlbmd0aCk7CgogICAgaWYgKGN1cnJlbnRFbmQgPT0gY3VycmVudC5sZW5ndGggJiYgb2xkRW5kID09IG9sZC5sZW5ndGgpCiAgICAgIHN1ZmZpeENvdW50ID0gc2hhcmVkU3VmZml4KGN1cnJlbnQsIG9sZCwgbWluTGVuZ3RoIC0gcHJlZml4Q291bnQpOwoKICAgIGN1cnJlbnRTdGFydCArPSBwcmVmaXhDb3VudDsKICAgIG9sZFN0YXJ0ICs9IHByZWZpeENvdW50OwogICAgY3VycmVudEVuZCAtPSBzdWZmaXhDb3VudDsKICAgIG9sZEVuZCAtPSBzdWZmaXhDb3VudDsKCiAgICBpZiAoY3VycmVudEVuZCAtIGN1cnJlbnRTdGFydCA9PSAwICYmIG9sZEVuZCAtIG9sZFN0YXJ0ID09IDApCiAgICAgIHJldHVybiBbXTsKCiAgICBpZiAoY3VycmVudFN0YXJ0ID09IGN1cnJlbnRFbmQpIHsKICAgICAgc3BsaWNlID0gbmV3U3BsaWNlKGN1cnJlbnRTdGFydCwgW10sIDApOwogICAgICB3aGlsZSAob2xkU3RhcnQgPCBvbGRFbmQpCiAgICAgICAgc3BsaWNlLnJlbW92ZWQucHVzaChvbGRbb2xkU3RhcnQrK10pOwoKICAgICAgcmV0dXJuIFsgc3BsaWNlIF07CiAgICB9IGVsc2UgaWYgKG9sZFN0YXJ0ID09IG9sZEVuZCkKICAgICAgcmV0dXJuIFsgbmV3U3BsaWNlKGN1cnJlbnRTdGFydCwgW10sIGN1cnJlbnRFbmQgLSBjdXJyZW50U3RhcnQpIF07CgogICAgbGV0IG9wcyA9IHNwbGljZU9wZXJhdGlvbnNGcm9tRWRpdERpc3RhbmNlcygKICAgICAgICBjYWxjRWRpdERpc3RhbmNlcyhjdXJyZW50LCBjdXJyZW50U3RhcnQsIGN1cnJlbnRFbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQsIG9sZFN0YXJ0LCBvbGRFbmQpKTsKCiAgICBzcGxpY2UgPSB1bmRlZmluZWQ7CiAgICBsZXQgc3BsaWNlcyA9IFtdOwogICAgbGV0IGluZGV4ID0gY3VycmVudFN0YXJ0OwogICAgbGV0IG9sZEluZGV4ID0gb2xkU3RhcnQ7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykgewogICAgICBzd2l0Y2gob3BzW2ldKSB7CiAgICAgICAgY2FzZSBFRElUX0xFQVZFOgogICAgICAgICAgaWYgKHNwbGljZSkgewogICAgICAgICAgICBzcGxpY2VzLnB1c2goc3BsaWNlKTsKICAgICAgICAgICAgc3BsaWNlID0gdW5kZWZpbmVkOwogICAgICAgICAgfQoKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICBvbGRJbmRleCsrOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBFRElUX1VQREFURToKICAgICAgICAgIGlmICghc3BsaWNlKQogICAgICAgICAgICBzcGxpY2UgPSBuZXdTcGxpY2UoaW5kZXgsIFtdLCAwKTsKCiAgICAgICAgICBzcGxpY2UuYWRkZWRDb3VudCsrOwogICAgICAgICAgaW5kZXgrKzsKCiAgICAgICAgICBzcGxpY2UucmVtb3ZlZC5wdXNoKG9sZFtvbGRJbmRleF0pOwogICAgICAgICAgb2xkSW5kZXgrKzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRURJVF9BREQ6CiAgICAgICAgICBpZiAoIXNwbGljZSkKICAgICAgICAgICAgc3BsaWNlID0gbmV3U3BsaWNlKGluZGV4LCBbXSwgMCk7CgogICAgICAgICAgc3BsaWNlLmFkZGVkQ291bnQrKzsKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEVESVRfREVMRVRFOgogICAgICAgICAgaWYgKCFzcGxpY2UpCiAgICAgICAgICAgIHNwbGljZSA9IG5ld1NwbGljZShpbmRleCwgW10sIDApOwoKICAgICAgICAgIHNwbGljZS5yZW1vdmVkLnB1c2gob2xkW29sZEluZGV4XSk7CiAgICAgICAgICBvbGRJbmRleCsrOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoc3BsaWNlKSB7CiAgICAgIHNwbGljZXMucHVzaChzcGxpY2UpOwogICAgfQogICAgcmV0dXJuIHNwbGljZXM7CiAgfQoKICBmdW5jdGlvbiBzaGFyZWRQcmVmaXgoY3VycmVudCwgb2xkLCBzZWFyY2hMZW5ndGgpIHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VhcmNoTGVuZ3RoOyBpKyspCiAgICAgIGlmICghZXF1YWxzKGN1cnJlbnRbaV0sIG9sZFtpXSkpCiAgICAgICAgcmV0dXJuIGk7CiAgICByZXR1cm4gc2VhcmNoTGVuZ3RoOwogIH0KCiAgZnVuY3Rpb24gc2hhcmVkU3VmZml4KGN1cnJlbnQsIG9sZCwgc2VhcmNoTGVuZ3RoKSB7CiAgICBsZXQgaW5kZXgxID0gY3VycmVudC5sZW5ndGg7CiAgICBsZXQgaW5kZXgyID0gb2xkLmxlbmd0aDsKICAgIGxldCBjb3VudCA9IDA7CiAgICB3aGlsZSAoY291bnQgPCBzZWFyY2hMZW5ndGggJiYgZXF1YWxzKGN1cnJlbnRbLS1pbmRleDFdLCBvbGRbLS1pbmRleDJdKSkKICAgICAgY291bnQrKzsKCiAgICByZXR1cm4gY291bnQ7CiAgfQoKICBmdW5jdGlvbiBjYWxjdWxhdGVTcGxpY2VzKGN1cnJlbnQsIHByZXZpb3VzKSB7CiAgICByZXR1cm4gY2FsY1NwbGljZXMoY3VycmVudCwgMCwgY3VycmVudC5sZW5ndGgsIHByZXZpb3VzLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMubGVuZ3RoKTsKICB9CgogIGZ1bmN0aW9uIGVxdWFscyhjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUpIHsKICAgIHJldHVybiBjdXJyZW50VmFsdWUgPT09IHByZXZpb3VzVmFsdWU7CiAgfQoKICAvKioKICAgKiBAbmFtZXNwYWNlCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBNb2R1bGUgdGhhdCBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGRpZmZpbmcgYXJyYXlzLgogICAqLwogIFBvbHltZXIuQXJyYXlTcGxpY2UgPSB7CiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZHMgaW5kaWNhdGluZyB0aGUgbWluaW11bSBlZGl0cyByZXF1aXJlZAogICAgICogdG8gdHJhbnNmb3JtIHRoZSBgcHJldmlvdXNgIGFycmF5IGludG8gdGhlIGBjdXJyZW50YCBhcnJheS4KICAgICAqCiAgICAgKiBTcGxpY2UgcmVjb3JkcyBhcmUgb3JkZXJlZCBieSBpbmRleCBhbmQgY29udGFpbiB0aGUgZm9sbG93aW5nIGZpZWxkczoKICAgICAqIC0gYGluZGV4YDogaW5kZXggd2hlcmUgZWRpdCBzdGFydGVkCiAgICAgKiAtIGByZW1vdmVkYDogYXJyYXkgb2YgcmVtb3ZlZCBpdGVtcyBmcm9tIHRoaXMgaW5kZXgKICAgICAqIC0gYGFkZGVkQ291bnRgOiBudW1iZXIgb2YgaXRlbXMgYWRkZWQgYXQgdGhpcyBpbmRleAogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYmFzZWQgb24gdGhlIExldmVuc2h0ZWluICJtaW5pbXVtIGVkaXQgZGlzdGFuY2UiCiAgICAgKiBhbGdvcml0aG0uIE5vdGUgdGhhdCB1cGRhdGVzIGFyZSB0cmVhdGVkIGFzIHJlbW92YWwgZm9sbG93ZWQgYnkgYWRkaXRpb24uCiAgICAgKgogICAgICogVGhlIHdvcnN0LWNhc2UgdGltZSBjb21wbGV4aXR5IG9mIHRoaXMgYWxnb3JpdGhtIGlzIGBPKGwgKiBwKWAKICAgICAqICAgbDogVGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCBhcnJheQogICAgICogICBwOiBUaGUgbGVuZ3RoIG9mIHRoZSBwcmV2aW91cyBhcnJheQogICAgICoKICAgICAqIEhvd2V2ZXIsIHRoZSB3b3JzdC1jYXNlIGNvbXBsZXhpdHkgaXMgcmVkdWNlZCBieSBhbiBgTyhuKWAgb3B0aW1pemF0aW9uCiAgICAgKiB0byBkZXRlY3QgYW55IHNoYXJlZCBwcmVmaXggJiBzdWZmaXggYmV0d2VlbiB0aGUgdHdvIGFycmF5cyBhbmQgb25seQogICAgICogcGVyZm9ybSB0aGUgbW9yZSBleHBlbnNpdmUgbWluaW11bSBlZGl0IGRpc3RhbmNlIGNhbGN1bGF0aW9uIG92ZXIgdGhlCiAgICAgKiBub24tc2hhcmVkIHBvcnRpb25zIG9mIHRoZSBhcnJheXMuCiAgICAgKgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5BcnJheVNwbGljZQogICAgICogQHBhcmFtIHshQXJyYXl9IGN1cnJlbnQgVGhlICJjaGFuZ2VkIiBhcnJheSBmb3Igd2hpY2ggc3BsaWNlcyB3aWxsIGJlCiAgICAgKiBjYWxjdWxhdGVkLgogICAgICogQHBhcmFtIHshQXJyYXl9IHByZXZpb3VzIFRoZSAidW5jaGFuZ2VkIiBvcmlnaW5hbCBhcnJheSB0byBjb21wYXJlCiAgICAgKiBgY3VycmVudGAgYWdhaW5zdCB0byBkZXRlcm1pbmUgdGhlIHNwbGljZXMuCiAgICAgKiBAcmV0dXJuIHshQXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZCBvYmplY3RzLiBFYWNoIG9mIHRoZXNlCiAgICAgKiBjb250YWluczogYGluZGV4YCB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHNwbGljZSBvY2N1cnJlZDsgYHJlbW92ZWRgCiAgICAgKiB0aGUgYXJyYXkgb2YgcmVtb3ZlZCBpdGVtcyBmcm9tIHRoaXMgbG9jYXRpb247IGBhZGRlZENvdW50YCB0aGUgbnVtYmVyCiAgICAgKiBvZiBpdGVtcyBhZGRlZCBhdCB0aGlzIGxvY2F0aW9uLgogICAgICovCiAgICBjYWxjdWxhdGVTcGxpY2VzCiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIGBub2RlYCBpcyBhIHNsb3QgZWxlbWVudAogICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIHRlc3QuCiAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBgbm9kZWAgaXMgYSBzbG90CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBpc1Nsb3Qobm9kZSkgewogICAgcmV0dXJuIChub2RlLmxvY2FsTmFtZSA9PT0gJ3Nsb3QnKTsKICB9CgogIC8qKgogICAqIENsYXNzIHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyAoYWRkaXRpb25zIG9yIHJlbW92YWxzKSB0bwogICAqICJmbGF0dGVuZWQgbm9kZXMiIG9uIGEgZ2l2ZW4gYG5vZGVgLiBUaGUgbGlzdCBvZiBmbGF0dGVuZWQgbm9kZXMgY29uc2lzdHMKICAgKiBvZiBhIG5vZGUncyBjaGlsZHJlbiBhbmQsIGZvciBhbnkgY2hpbGRyZW4gdGhhdCBhcmUgYDxzbG90PmAgZWxlbWVudHMsCiAgICogdGhlIGV4cGFuZGVkIGZsYXR0ZW5lZCBsaXN0IG9mIGBhc3NpZ25lZE5vZGVzYC4KICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIG9ic2VydmVkIG5vZGUgaGFzIGNoaWxkcmVuIGA8YT48L2E+PHNsb3Q+PC9zbG90PjxiPjwvYj5gCiAgICogYW5kIHRoZSBgPHNsb3Q+YCBoYXMgb25lIGA8ZGl2PmAgYXNzaWduZWQgdG8gaXQsIHRoZW4gdGhlIGZsYXR0ZW5lZAogICAqIG5vZGVzIGxpc3QgaXMgYDxhPjwvYT48ZGl2PjwvZGl2PjxiPjwvYj5gLiBJZiB0aGUgYDxzbG90PmAgaGFzIG90aGVyCiAgICogYDxzbG90PmAgZWxlbWVudHMgYXNzaWduZWQgdG8gaXQsIHRoZXNlIGFyZSBmbGF0dGVuZWQgYXMgd2VsbC4KICAgKgogICAqIFRoZSBwcm92aWRlZCBgY2FsbGJhY2tgIGlzIGNhbGxlZCB3aGVuZXZlciBhbnkgY2hhbmdlIHRvIHRoaXMgbGlzdAogICAqIG9mIGZsYXR0ZW5lZCBub2RlcyBvY2N1cnMsIHdoZXJlIGFuIGFkZGl0aW9uIG9yIHJlbW92YWwgb2YgYSBub2RlIGlzCiAgICogY29uc2lkZXJlZCBhIGNoYW5nZS4gVGhlIGBjYWxsYmFja2AgaXMgY2FsbGVkIHdpdGggb25lIGFyZ3VtZW50LCBhbiBvYmplY3QKICAgKiBjb250YWluaW5nIGFuIGFycmF5IG9mIGFueSBgYWRkZWROb2Rlc2AgYW5kIGByZW1vdmVkTm9kZXNgLgogICAqCiAgICogTm90ZTogdGhlIGNhbGxiYWNrIGlzIGNhbGxlZCBhc3luY2hyb25vdXMgdG8gYW55IGNoYW5nZXMKICAgKiBhdCBhIG1pY3JvdGFzayBjaGVja3BvaW50LiBUaGlzIGlzIGJlY2F1c2Ugb2JzZXJ2YXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nCiAgICogYE11dGF0aW9uT2JzZXJ2ZXJgIGFuZCB0aGUgYDxzbG90PmAgZWxlbWVudCdzIGBzbG90Y2hhbmdlYCBldmVudCB3aGljaAogICAqIGFyZSBhc3luY2hyb25vdXMuCiAgICoKICAgKiBBbiBleGFtcGxlOgogICAqIGBgYGpzCiAgICogY2xhc3MgVGVzdFNlbGZPYnNlcnZlIGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAndGVzdC1zZWxmLW9ic2VydmUnO30KICAgKiAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAqICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAqICAgICB0aGlzLl9vYnNlcnZlciA9IG5ldyBQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIodGhpcywgKGluZm8pID0+IHsKICAgKiAgICAgICB0aGlzLmluZm8gPSBpbmZvOwogICAqICAgICB9KTsKICAgKiAgIH0KICAgKiAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAqICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAqICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICogICB9CiAgICogfQogICAqIGN1c3RvbUVsZW1lbnRzLmRlZmluZShUZXN0U2VsZk9ic2VydmUuaXMsIFRlc3RTZWxmT2JzZXJ2ZSk7CiAgICogYGBgCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IENsYXNzIHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyAoYWRkaXRpb25zIG9yIHJlbW92YWxzKSB0bwogICAqICJmbGF0dGVuZWQgbm9kZXMiIG9uIGEgZ2l2ZW4gYG5vZGVgLgogICAqLwogIGNsYXNzIEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIgewoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBmbGF0dGVuZWQgbm9kZXMgZm9yIHRoZSBnaXZlbiBgbm9kZWAuCiAgICAgKiBUaGlzIGxpc3QgY29uc2lzdHMgb2YgYSBub2RlJ3MgY2hpbGRyZW4gYW5kLCBmb3IgYW55IGNoaWxkcmVuCiAgICAgKiB0aGF0IGFyZSBgPHNsb3Q+YCBlbGVtZW50cywgdGhlIGV4cGFuZGVkIGZsYXR0ZW5lZCBsaXN0IG9mIGBhc3NpZ25lZE5vZGVzYC4KICAgICAqIEZvciBleGFtcGxlLCBpZiB0aGUgb2JzZXJ2ZWQgbm9kZSBoYXMgY2hpbGRyZW4gYDxhPjwvYT48c2xvdD48L3Nsb3Q+PGI+PC9iPmAKICAgICAqIGFuZCB0aGUgYDxzbG90PmAgaGFzIG9uZSBgPGRpdj5gIGFzc2lnbmVkIHRvIGl0LCB0aGVuIHRoZSBmbGF0dGVuZWQKICAgICAqIG5vZGVzIGxpc3QgaXMgYDxhPjwvYT48ZGl2PjwvZGl2PjxiPjwvYj5gLiBJZiB0aGUgYDxzbG90PmAgaGFzIG90aGVyCiAgICAgKiBgPHNsb3Q+YCBlbGVtZW50cyBhc3NpZ25lZCB0byBpdCwgdGhlc2UgYXJlIGZsYXR0ZW5lZCBhcyB3ZWxsLgogICAgICoKICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8SFRNTFNsb3RFbGVtZW50fSBub2RlIFRoZSBub2RlIGZvciB3aGljaCB0byByZXR1cm4gdGhlIGxpc3Qgb2YgZmxhdHRlbmVkIG5vZGVzLgogICAgICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIGZsYXR0ZW5lZCBub2RlcyBmb3IgdGhlIGdpdmVuIGBub2RlYC4KICAgICovCiAgICBzdGF0aWMgZ2V0RmxhdHRlbmVkTm9kZXMobm9kZSkgewogICAgICBpZiAoaXNTbG90KG5vZGUpKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7SFRNTFNsb3RFbGVtZW50fSAqLyhub2RlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWFzc2lnbgogICAgICAgIHJldHVybiBub2RlLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46IHRydWV9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShub2RlLmNoaWxkTm9kZXMpLm1hcCgobm9kZSkgPT4gewogICAgICAgICAgaWYgKGlzU2xvdChub2RlKSkgewogICAgICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtIVE1MU2xvdEVsZW1lbnR9ICovKG5vZGUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgICAgIHJldHVybiBub2RlLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46IHRydWV9KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBbbm9kZV07CiAgICAgICAgICB9CiAgICAgICAgfSkucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCBOb2RlIG9uIHdoaWNoIHRvIGxpc3RlbiBmb3IgY2hhbmdlcy4KICAgICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFbGVtZW50LCB7IHRhcmdldDogIUVsZW1lbnQsIGFkZGVkTm9kZXM6ICFBcnJheTwhRWxlbWVudD4sIHJlbW92ZWROb2RlczogIUFycmF5PCFFbGVtZW50PiB9KTp2b2lkfSBjYWxsYmFjayBGdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGVyZSBhcmUgYWRkaXRpb25zCiAgICAgKiBvciByZW1vdmFscyBmcm9tIHRoZSB0YXJnZXQncyBsaXN0IG9mIGZsYXR0ZW5lZCBub2Rlcy4KICAgICovCiAgICBjb25zdHJ1Y3Rvcih0YXJnZXQsIGNhbGxiYWNrKSB7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7TXV0YXRpb25PYnNlcnZlcn0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlciA9IG51bGw7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7TXV0YXRpb25PYnNlcnZlcn0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIgPSBudWxsOwogICAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTsKICAgICAgLyoqCiAgICAgICAqIEB0eXBlIHtFbGVtZW50fQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgdGhpcy5fdGFyZ2V0ID0gdGFyZ2V0OwogICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgIHRoaXMuX2VmZmVjdGl2ZU5vZGVzID0gW107CiAgICAgIHRoaXMuX29ic2VydmVyID0gbnVsbDsKICAgICAgdGhpcy5fc2NoZWR1bGVkID0gZmFsc2U7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oKX0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX2JvdW5kU2NoZWR1bGUgPSAoKSA9PiB7CiAgICAgICAgdGhpcy5fc2NoZWR1bGUoKTsKICAgICAgfTsKICAgICAgdGhpcy5jb25uZWN0KCk7CiAgICAgIHRoaXMuX3NjaGVkdWxlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBY3RpdmF0ZXMgYW4gb2JzZXJ2ZXIuIFRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkIHdoZW4KICAgICAqIGEgYEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJgIGlzIGNyZWF0ZWQuIEl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCB0bwogICAgICogcmUtYWN0aXZhdGUgYW4gb2JzZXJ2ZXIgdGhhdCBoYXMgYmVlbiBkZWFjdGl2YXRlZCB2aWEgdGhlIGBkaXNjb25uZWN0YCBtZXRob2QuCiAgICAgKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgY29ubmVjdCgpIHsKICAgICAgaWYgKGlzU2xvdCh0aGlzLl90YXJnZXQpKSB7CiAgICAgICAgdGhpcy5fbGlzdGVuU2xvdHMoW3RoaXMuX3RhcmdldF0pOwogICAgICB9IGVsc2UgaWYgKHRoaXMuX3RhcmdldC5jaGlsZHJlbikgewogICAgICAgIHRoaXMuX2xpc3RlblNsb3RzKHRoaXMuX3RhcmdldC5jaGlsZHJlbik7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSkgewogICAgICAgICAgdGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyID0KICAgICAgICAgICAgU2hhZHlET00ub2JzZXJ2ZUNoaWxkcmVuKHRoaXMuX3RhcmdldCwgKG11dGF0aW9ucykgPT4gewogICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NNdXRhdGlvbnMobXV0YXRpb25zKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIgPQogICAgICAgICAgICBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7CiAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc011dGF0aW9ucyhtdXRhdGlvbnMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl90YXJnZXQsIHtjaGlsZExpc3Q6IHRydWV9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5fY29ubmVjdGVkID0gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIERlYWN0aXZhdGVzIHRoZSBmbGF0dGVuZWQgbm9kZXMgb2JzZXJ2ZXIuIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QKICAgICAqIHRoZSBvYnNlcnZlciBjYWxsYmFjayB3aWxsIG5vdCBiZSBjYWxsZWQgd2hlbiBjaGFuZ2VzIHRvIGZsYXR0ZW5lZCBub2RlcwogICAgICogb2NjdXIuIFRoZSBgY29ubmVjdGAgbWV0aG9kIG1heSBiZSBzdWJzZXF1ZW50bHkgY2FsbGVkIHRvIHJlYWN0aXZhdGUKICAgICAqIHRoZSBvYnNlcnZlci4KICAgICAqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBkaXNjb25uZWN0KCkgewogICAgICBpZiAoaXNTbG90KHRoaXMuX3RhcmdldCkpIHsKICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKFt0aGlzLl90YXJnZXRdKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLl90YXJnZXQuY2hpbGRyZW4pIHsKICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKHRoaXMuX3RhcmdldC5jaGlsZHJlbik7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSAmJiB0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIpIHsKICAgICAgICAgIFNoYWR5RE9NLnVub2JzZXJ2ZUNoaWxkcmVuKHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlcik7CiAgICAgICAgICB0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIgPSBudWxsOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlcikgewogICAgICAgICAgdGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICB0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3NjaGVkdWxlKCkgewogICAgICBpZiAoIXRoaXMuX3NjaGVkdWxlZCkgewogICAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IHRydWU7CiAgICAgICAgUG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKCgpID0+IHRoaXMuZmx1c2goKSk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7QXJyYXk8TXV0YXRpb25SZWNvcmQ+fSBtdXRhdGlvbnMgTXV0YXRpb25zIHNpZ25hbGVkIGJ5IHRoZSBtdXRhdGlvbiBvYnNlcnZlcgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIF9wcm9jZXNzTXV0YXRpb25zKG11dGF0aW9ucykgewogICAgICB0aGlzLl9wcm9jZXNzU2xvdE11dGF0aW9ucyhtdXRhdGlvbnMpOwogICAgICB0aGlzLmZsdXNoKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge0FycmF5PE11dGF0aW9uUmVjb3JkPn0gbXV0YXRpb25zIE11dGF0aW9ucyBzaWduYWxlZCBieSB0aGUgbXV0YXRpb24gb2JzZXJ2ZXIKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBfcHJvY2Vzc1Nsb3RNdXRhdGlvbnMobXV0YXRpb25zKSB7CiAgICAgIGlmIChtdXRhdGlvbnMpIHsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBtdXRhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGxldCBtdXRhdGlvbiA9IG11dGF0aW9uc1tpXTsKICAgICAgICAgIGlmIChtdXRhdGlvbi5hZGRlZE5vZGVzKSB7CiAgICAgICAgICAgIHRoaXMuX2xpc3RlblNsb3RzKG11dGF0aW9uLmFkZGVkTm9kZXMpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG11dGF0aW9uLnJlbW92ZWROb2RlcykgewogICAgICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBGbHVzaGVzIHRoZSBvYnNlcnZlciBjYXVzaW5nIGFueSBwZW5kaW5nIGNoYW5nZXMgdG8gYmUgaW1tZWRpYXRlbHkKICAgICAqIGRlbGl2ZXJlZCB0aGUgb2JzZXJ2ZXIgY2FsbGJhY2suIEJ5IGRlZmF1bHQgdGhlc2UgY2hhbmdlcyBhcmUgZGVsaXZlcmVkCiAgICAgKiBhc3luY2hyb25vdXNseSBhdCB0aGUgbmV4dCBtaWNyb3Rhc2sgY2hlY2twb2ludC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IHBlbmRpbmcgY2hhbmdlcyBjYXVzZWQgdGhlIG9ic2VydmVyCiAgICAgKiBjYWxsYmFjayB0byBydW4uCiAgICAgKi8KICAgIGZsdXNoKCkgewogICAgICBpZiAoIXRoaXMuX2Nvbm5lY3RlZCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAod2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgU2hhZHlET00uZmx1c2goKTsKICAgICAgfQogICAgICBpZiAodGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlcikgewogICAgICAgIHRoaXMuX3Byb2Nlc3NTbG90TXV0YXRpb25zKHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIudGFrZVJlY29yZHMoKSk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyKSB7CiAgICAgICAgdGhpcy5fcHJvY2Vzc1Nsb3RNdXRhdGlvbnModGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyLnRha2VSZWNvcmRzKCkpOwogICAgICB9CiAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IGZhbHNlOwogICAgICBsZXQgaW5mbyA9IHsKICAgICAgICB0YXJnZXQ6IHRoaXMuX3RhcmdldCwKICAgICAgICBhZGRlZE5vZGVzOiBbXSwKICAgICAgICByZW1vdmVkTm9kZXM6IFtdCiAgICAgIH07CiAgICAgIGxldCBuZXdOb2RlcyA9IHRoaXMuY29uc3RydWN0b3IuZ2V0RmxhdHRlbmVkTm9kZXModGhpcy5fdGFyZ2V0KTsKICAgICAgbGV0IHNwbGljZXMgPSBQb2x5bWVyLkFycmF5U3BsaWNlLmNhbGN1bGF0ZVNwbGljZXMobmV3Tm9kZXMsCiAgICAgICAgdGhpcy5fZWZmZWN0aXZlTm9kZXMpOwogICAgICAvLyBwcm9jZXNzIHJlbW92YWxzCiAgICAgIGZvciAobGV0IGk9MCwgczsgKGk8c3BsaWNlcy5sZW5ndGgpICYmIChzPXNwbGljZXNbaV0pOyBpKyspIHsKICAgICAgICBmb3IgKGxldCBqPTAsIG47IChqIDwgcy5yZW1vdmVkLmxlbmd0aCkgJiYgKG49cy5yZW1vdmVkW2pdKTsgaisrKSB7CiAgICAgICAgICBpbmZvLnJlbW92ZWROb2Rlcy5wdXNoKG4pOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBwcm9jZXNzIGFkZHMKICAgICAgZm9yIChsZXQgaT0wLCBzOyAoaTxzcGxpY2VzLmxlbmd0aCkgJiYgKHM9c3BsaWNlc1tpXSk7IGkrKykgewogICAgICAgIGZvciAobGV0IGo9cy5pbmRleDsgaiA8IHMuaW5kZXggKyBzLmFkZGVkQ291bnQ7IGorKykgewogICAgICAgICAgaW5mby5hZGRlZE5vZGVzLnB1c2gobmV3Tm9kZXNbal0pOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyB1cGRhdGUgY2FjaGUKICAgICAgdGhpcy5fZWZmZWN0aXZlTm9kZXMgPSBuZXdOb2RlczsKICAgICAgbGV0IGRpZEZsdXNoID0gZmFsc2U7CiAgICAgIGlmIChpbmZvLmFkZGVkTm9kZXMubGVuZ3RoIHx8IGluZm8ucmVtb3ZlZE5vZGVzLmxlbmd0aCkgewogICAgICAgIGRpZEZsdXNoID0gdHJ1ZTsKICAgICAgICB0aGlzLmNhbGxiYWNrLmNhbGwodGhpcy5fdGFyZ2V0LCBpbmZvKTsKICAgICAgfQogICAgICByZXR1cm4gZGlkRmx1c2g7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyFBcnJheTxFbGVtZW50fE5vZGU+fCFOb2RlTGlzdDxOb2RlPn0gbm9kZUxpc3QgTm9kZXMgdGhhdCBjb3VsZCBjaGFuZ2UKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBfbGlzdGVuU2xvdHMobm9kZUxpc3QpIHsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbm9kZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgbiA9IG5vZGVMaXN0W2ldOwogICAgICAgIGlmIChpc1Nsb3QobikpIHsKICAgICAgICAgIG4uYWRkRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHRoaXMuX2JvdW5kU2NoZWR1bGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHshQXJyYXk8RWxlbWVudHxOb2RlPnwhTm9kZUxpc3Q8Tm9kZT59IG5vZGVMaXN0IE5vZGVzIHRoYXQgY291bGQgY2hhbmdlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3VubGlzdGVuU2xvdHMobm9kZUxpc3QpIHsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbm9kZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgbiA9IG5vZGVMaXN0W2ldOwogICAgICAgIGlmIChpc1Nsb3QobikpIHsKICAgICAgICAgIG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHRoaXMuX2JvdW5kU2NoZWR1bGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICB9CgogIFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlciA9IEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXI7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGxldCBkZWJvdW5jZXJRdWV1ZSA9IFtdOwoKICAvKioKICAgKiBBZGRzIGEgYFBvbHltZXIuRGVib3VuY2VyYCB0byBhIGxpc3Qgb2YgZ2xvYmFsbHkgZmx1c2hhYmxlIHRhc2tzLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcGFyYW0geyFQb2x5bWVyLkRlYm91bmNlcn0gZGVib3VuY2VyIERlYm91bmNlciB0byBlbnF1ZXVlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLmVucXVldWVEZWJvdW5jZXIgPSBmdW5jdGlvbihkZWJvdW5jZXIpIHsKICAgIGRlYm91bmNlclF1ZXVlLnB1c2goZGVib3VuY2VyKTsKICB9OwoKICBmdW5jdGlvbiBmbHVzaERlYm91bmNlcnMoKSB7CiAgICBjb25zdCBkaWRGbHVzaCA9IEJvb2xlYW4oZGVib3VuY2VyUXVldWUubGVuZ3RoKTsKICAgIHdoaWxlIChkZWJvdW5jZXJRdWV1ZS5sZW5ndGgpIHsKICAgICAgdHJ5IHsKICAgICAgICBkZWJvdW5jZXJRdWV1ZS5zaGlmdCgpLmZsdXNoKCk7CiAgICAgIH0gY2F0Y2goZSkgewogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRpZEZsdXNoOwogIH0KCiAgLyoqCiAgICogRm9yY2VzIHNldmVyYWwgY2xhc3NlcyBvZiBhc3luY2hyb25vdXNseSBxdWV1ZWQgdGFza3MgdG8gZmx1c2g6CiAgICogLSBEZWJvdW5jZXJzIGFkZGVkIHZpYSBgZW5xdWV1ZURlYm91bmNlcmAKICAgKiAtIFNoYWR5RE9NIGRpc3RyaWJ1dGlvbgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqLwogIFBvbHltZXIuZmx1c2ggPSBmdW5jdGlvbigpIHsKICAgIGxldCBzaGFkeURPTSwgZGVib3VuY2VyczsKICAgIGRvIHsKICAgICAgc2hhZHlET00gPSB3aW5kb3cuU2hhZHlET00gJiYgU2hhZHlET00uZmx1c2goKTsKICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUyAmJiB3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0pIHsKICAgICAgICB3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0uZmx1c2goKTsKICAgICAgfQogICAgICBkZWJvdW5jZXJzID0gZmx1c2hEZWJvdW5jZXJzKCk7CiAgICB9IHdoaWxlIChzaGFkeURPTSB8fCBkZWJvdW5jZXJzKTsKICB9OwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICBjb25zdCBwID0gRWxlbWVudC5wcm90b3R5cGU7CiAgLyoqCiAgICogQGNvbnN0IHtmdW5jdGlvbih0aGlzOk5vZGUsIHN0cmluZyk6IGJvb2xlYW59CiAgICovCiAgY29uc3Qgbm9ybWFsaXplZE1hdGNoZXNTZWxlY3RvciA9IHAubWF0Y2hlcyB8fCBwLm1hdGNoZXNTZWxlY3RvciB8fAogICAgcC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgcC5tc01hdGNoZXNTZWxlY3RvciB8fAogICAgcC5vTWF0Y2hlc1NlbGVjdG9yIHx8IHAud2Via2l0TWF0Y2hlc1NlbGVjdG9yOwoKICAvKioKICAgKiBDcm9zcy1wbGF0Zm9ybSBgZWxlbWVudC5tYXRjaGVzYCBzaGltLgogICAqCiAgICogQGZ1bmN0aW9uIG1hdGNoZXNTZWxlY3RvcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyLmRvbQogICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBjaGVjayBzZWxlY3RvciBhZ2FpbnN0CiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIG1hdGNoCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBub2RlIG1hdGNoZWQgc2VsZWN0b3IKICAgKi8KICBjb25zdCBtYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbihub2RlLCBzZWxlY3RvcikgewogICAgcmV0dXJuIG5vcm1hbGl6ZWRNYXRjaGVzU2VsZWN0b3IuY2FsbChub2RlLCBzZWxlY3Rvcik7CiAgfTsKCiAgLyoqCiAgICogTm9kZSBBUEkgd3JhcHBlciBjbGFzcyByZXR1cm5lZCBmcm9tIGBQb2x5bWVyLmRvbS4odGFyZ2V0KWAgd2hlbgogICAqIGB0YXJnZXRgIGlzIGEgYE5vZGVgLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKi8KICBjbGFzcyBEb21BcGkgewoKICAgIC8qKgogICAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgZm9yIHdoaWNoIHRvIGNyZWF0ZSBhIFBvbHltZXIuZG9tIGhlbHBlciBvYmplY3QuCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKG5vZGUpIHsKICAgICAgdGhpcy5ub2RlID0gbm9kZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlcmAgdGhhdAogICAgICogbGlzdGVucyBmb3Igbm9kZSBjaGFuZ2VzIG9uIHRoaXMgZWxlbWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFbGVtZW50LCB7IHRhcmdldDogIUVsZW1lbnQsIGFkZGVkTm9kZXM6ICFBcnJheTwhRWxlbWVudD4sIHJlbW92ZWROb2RlczogIUFycmF5PCFFbGVtZW50PiB9KTp2b2lkfSBjYWxsYmFjayBDYWxsZWQgd2hlbiBkaXJlY3Qgb3IgZGlzdHJpYnV0ZWQgY2hpbGRyZW4KICAgICAqICAgb2YgdGhpcyBlbGVtZW50IGNoYW5nZXMKICAgICAqIEByZXR1cm4geyFQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJ9IE9ic2VydmVyIGluc3RhbmNlCiAgICAgKi8KICAgIG9ic2VydmVOb2RlcyhjYWxsYmFjaykgewogICAgICByZXR1cm4gbmV3IFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlcih0aGlzLm5vZGUsIGNhbGxiYWNrKTsKICAgIH0KCiAgICAvKioKICAgICAqIERpc2Nvbm5lY3RzIGFuIG9ic2VydmVyIHByZXZpb3VzbHkgY3JlYXRlZCB2aWEgYG9ic2VydmVOb2Rlc2AKICAgICAqCiAgICAgKiBAcGFyYW0geyFQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJ9IG9ic2VydmVySGFuZGxlIE9ic2VydmVyIGluc3RhbmNlCiAgICAgKiAgIHRvIGRpc2Nvbm5lY3QuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB1bm9ic2VydmVOb2RlcyhvYnNlcnZlckhhbmRsZSkgewogICAgICBvYnNlcnZlckhhbmRsZS5kaXNjb25uZWN0KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQcm92aWRlZCBhcyBhIGJhY2t3YXJkcy1jb21wYXRpYmxlIEFQSSBvbmx5LiAgVGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgbm90aWZ5T2JzZXJ2ZXIoKSB7fQoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBub2RlIGlzIGNvbnRhaW5lZCB3aXRoIHRoaXMgZWxlbWVudCdzCiAgICAgKiBsaWdodC1ET00gY2hpbGRyZW4gb3Igc2hhZG93IHJvb3QsIGluY2x1ZGluZyBhbnkgbmVzdGVkIHNoYWRvdyByb290cwogICAgICogb2YgY2hpbGRyZW4gdGhlcmVpbi4KICAgICAqCiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byB0ZXN0CiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGBub2RlYCBpcyBjb250YWluZWQgd2l0aGluCiAgICAgKiAgIHRoaXMgZWxlbWVudCdzIGxpZ2h0IG9yIHNoYWRvdyBET00uCiAgICAgKi8KICAgIGRlZXBDb250YWlucyhub2RlKSB7CiAgICAgIGlmICh0aGlzLm5vZGUuY29udGFpbnMobm9kZSkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgbiA9IG5vZGU7CiAgICAgIGxldCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7CiAgICAgIC8vIHdhbGsgZnJvbSBub2RlIHRvIGB0aGlzYCBvciBgZG9jdW1lbnRgCiAgICAgIHdoaWxlIChuICYmIG4gIT09IGRvYyAmJiBuICE9PSB0aGlzLm5vZGUpIHsKICAgICAgICAvLyB1c2UgbG9naWNhbCBwYXJlbnRub2RlLCBvciBuYXRpdmUgU2hhZG93Um9vdCBob3N0CiAgICAgICAgbiA9IG4ucGFyZW50Tm9kZSB8fCBuLmhvc3Q7CiAgICAgIH0KICAgICAgcmV0dXJuIG4gPT09IHRoaXMubm9kZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGlzIG5vZGUuICBFcXVpdmFsZW50IHRvIGBnZXRSb29kTm9kZSgpYC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtOb2RlfSBUb3AgbW9zdCBlbGVtZW50IGluIHRoZSBkb20gdHJlZSBpbiB3aGljaCB0aGUgbm9kZQogICAgICogZXhpc3RzLiBJZiB0aGUgbm9kZSBpcyBjb25uZWN0ZWQgdG8gYSBkb2N1bWVudCB0aGlzIGlzIGVpdGhlciBhCiAgICAgKiBzaGFkb3dSb290IG9yIHRoZSBkb2N1bWVudDsgb3RoZXJ3aXNlLCBpdCBtYXkgYmUgdGhlIG5vZGUKICAgICAqIGl0c2VsZiBvciBhIG5vZGUgb3IgZG9jdW1lbnQgZnJhZ21lbnQgY29udGFpbmluZyBpdC4KICAgICAqLwogICAgZ2V0T3duZXJSb290KCkgewogICAgICByZXR1cm4gdGhpcy5ub2RlLmdldFJvb3ROb2RlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3Igc2xvdCBlbGVtZW50cywgcmV0dXJucyB0aGUgbm9kZXMgYXNzaWduZWQgdG8gdGhlIHNsb3Q7IG90aGVyd2lzZQogICAgICogYW4gZW1wdHkgYXJyYXkuIEl0IGlzIGVxdWl2YWxlbnQgdG8gYDxzbG90Pi5hZGRpZ25lZE5vZGVzKHtmbGF0dGVuOnRydWV9KWAuCiAgICAgKgogICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gQXJyYXkgb2YgYXNzaWduZWQgbm9kZXMKICAgICAqLwogICAgZ2V0RGlzdHJpYnV0ZWROb2RlcygpIHsKICAgICAgcmV0dXJuICh0aGlzLm5vZGUubG9jYWxOYW1lID09PSAnc2xvdCcpID8KICAgICAgICB0aGlzLm5vZGUuYXNzaWduZWROb2Rlcyh7ZmxhdHRlbjogdHJ1ZX0pIDoKICAgICAgICBbXTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHNsb3RzIHRoaXMgZWxlbWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uCiAgICAgKgogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU2xvdEVsZW1lbnQ+fSBEZXNjcmlwdGlvbgogICAgICovCiAgICBnZXREZXN0aW5hdGlvbkluc2VydGlvblBvaW50cygpIHsKICAgICAgbGV0IGlwJCA9IFtdOwogICAgICBsZXQgbiA9IHRoaXMubm9kZS5hc3NpZ25lZFNsb3Q7CiAgICAgIHdoaWxlIChuKSB7CiAgICAgICAgaXAkLnB1c2gobik7CiAgICAgICAgbiA9IG4uYXNzaWduZWRTbG90OwogICAgICB9CiAgICAgIHJldHVybiBpcCQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDYWxscyBgaW1wb3J0Tm9kZWAgb24gdGhlIGBvd25lckRvY3VtZW50YCBmb3IgdGhpcyBub2RlLgogICAgICoKICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBpbXBvcnQKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGVlcCBUcnVlIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbG9uZWQgZGVlcGx5IGR1cmluZwogICAgICogICBpbXBvcnQKICAgICAqIEByZXR1cm4ge05vZGV9IENsb25lIG9mIGdpdmVuIG5vZGUgaW1wb3J0ZWQgdG8gdGhpcyBvd25lciBkb2N1bWVudAogICAgICovCiAgICBpbXBvcnROb2RlKG5vZGUsIGRlZXApIHsKICAgICAgbGV0IGRvYyA9IHRoaXMubm9kZSBpbnN0YW5jZW9mIERvY3VtZW50ID8gdGhpcy5ub2RlIDoKICAgICAgICB0aGlzLm5vZGUub3duZXJEb2N1bWVudDsKICAgICAgcmV0dXJuIGRvYy5pbXBvcnROb2RlKG5vZGUsIGRlZXApOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gUmV0dXJucyBhIGZsYXR0ZW5lZCBsaXN0IG9mIGFsbCBjaGlsZCBub2RlcyBhbmQKICAgICAqIG5vZGVzIGFzc2lnbmVkIHRvIGNoaWxkIHNsb3RzLgogICAgICovCiAgICBnZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCkgewogICAgICByZXR1cm4gUG9seW1lci5GbGF0dGVuZWROb2Rlc09ic2VydmVyLmdldEZsYXR0ZW5lZE5vZGVzKHRoaXMubm9kZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBmbGF0dGVuZWQgY2hpbGQgZWxlbWVudHMgZm9yIHRoaXMgZWxlbWVudCBiYXNlZAogICAgICogb24gdGhlIGdpdmVuIHNlbGVjdG9yLgogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBTZWxlY3RvciB0byBmaWx0ZXIgbm9kZXMgYWdhaW5zdAogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MRWxlbWVudD59IExpc3Qgb2YgZmxhdHRlbmVkIGNoaWxkIGVsZW1lbnRzCiAgICAgKi8KICAgIHF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3RvcikgewogICAgICBsZXQgYyQgPSB0aGlzLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKTsKICAgICAgbGV0IGxpc3QgPSBbXTsKICAgICAgZm9yIChsZXQgaT0wLCBsPWMkLmxlbmd0aCwgYzsgKGk8bCkgJiYgKGM9YyRbaV0pOyBpKyspIHsKICAgICAgICBpZiAoKGMubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSAmJgogICAgICAgICAgICBtYXRjaGVzU2VsZWN0b3IoYywgc2VsZWN0b3IpKSB7CiAgICAgICAgICBsaXN0LnB1c2goYyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBsaXN0OwogICAgfQoKICAgIC8qKgogICAgICogRm9yIHNoYWRvdyByb290cywgcmV0dXJucyB0aGUgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudCB3aXRoaW4gdGhpcwogICAgICogc2hhZG93IHJvb3QuCiAgICAgKgogICAgICogQHJldHVybiB7Tm9kZXx1bmRlZmluZWR9IEN1cnJlbnRseSBmb2N1c2VkIGVsZW1lbnQKICAgICAqLwogICAgZ2V0IGFjdGl2ZUVsZW1lbnQoKSB7CiAgICAgIGxldCBub2RlID0gdGhpcy5ub2RlOwogICAgICByZXR1cm4gbm9kZS5fYWN0aXZlRWxlbWVudCAhPT0gdW5kZWZpbmVkID8gbm9kZS5fYWN0aXZlRWxlbWVudCA6IG5vZGUuYWN0aXZlRWxlbWVudDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGZvcndhcmRNZXRob2RzKHByb3RvLCBtZXRob2RzKSB7CiAgICBmb3IgKGxldCBpPTA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBtZXRob2QgPSBtZXRob2RzW2ldOwogICAgICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogICAgICBwcm90b1ttZXRob2RdID0gLyoqIEB0aGlzIHtEb21BcGl9ICovIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm5vZGVbbWV0aG9kXS5hcHBseSh0aGlzLm5vZGUsIGFyZ3VtZW50cyk7CiAgICAgIH07CiAgICAgIC8qIGVzbGludC1lbmFibGUgKi8KICAgIH0KICB9CgogIGZ1bmN0aW9uIGZvcndhcmRSZWFkT25seVByb3BlcnRpZXMocHJvdG8sIHByb3BlcnRpZXMpIHsKICAgIGZvciAobGV0IGk9MDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IG5hbWUgPSBwcm9wZXJ0aWVzW2ldOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sIG5hbWUsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtEb21BcGl9ICovKHRoaXMpOwogICAgICAgICAgcmV0dXJuIGRvbUFwaS5ub2RlW25hbWVdOwogICAgICAgIH0sCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZm9yd2FyZFByb3BlcnRpZXMocHJvdG8sIHByb3BlcnRpZXMpIHsKICAgIGZvciAobGV0IGk9MDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IG5hbWUgPSBwcm9wZXJ0aWVzW2ldOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sIG5hbWUsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtEb21BcGl9ICovKHRoaXMpOwogICAgICAgICAgcmV0dXJuIGRvbUFwaS5ub2RlW25hbWVdOwogICAgICAgIH0sCiAgICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgLyoqIEB0eXBlIHtEb21BcGl9ICovICh0aGlzKS5ub2RlW25hbWVdID0gdmFsdWU7CiAgICAgICAgfSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfSk7CiAgICB9CiAgfQoKICBmb3J3YXJkTWV0aG9kcyhEb21BcGkucHJvdG90eXBlLCBbCiAgICAnY2xvbmVOb2RlJywgJ2FwcGVuZENoaWxkJywgJ2luc2VydEJlZm9yZScsICdyZW1vdmVDaGlsZCcsCiAgICAncmVwbGFjZUNoaWxkJywgJ3NldEF0dHJpYnV0ZScsICdyZW1vdmVBdHRyaWJ1dGUnLAogICAgJ3F1ZXJ5U2VsZWN0b3InLCAncXVlcnlTZWxlY3RvckFsbCcKICBdKTsKCiAgZm9yd2FyZFJlYWRPbmx5UHJvcGVydGllcyhEb21BcGkucHJvdG90eXBlLCBbCiAgICAncGFyZW50Tm9kZScsICdmaXJzdENoaWxkJywgJ2xhc3RDaGlsZCcsCiAgICAnbmV4dFNpYmxpbmcnLCAncHJldmlvdXNTaWJsaW5nJywgJ2ZpcnN0RWxlbWVudENoaWxkJywKICAgICdsYXN0RWxlbWVudENoaWxkJywgJ25leHRFbGVtZW50U2libGluZycsICdwcmV2aW91c0VsZW1lbnRTaWJsaW5nJywKICAgICdjaGlsZE5vZGVzJywgJ2NoaWxkcmVuJywgJ2NsYXNzTGlzdCcKICBdKTsKCiAgZm9yd2FyZFByb3BlcnRpZXMoRG9tQXBpLnByb3RvdHlwZSwgWwogICAgJ3RleHRDb250ZW50JywgJ2lubmVySFRNTCcKICBdKTsKCgogIC8qKgogICAqIEV2ZW50IEFQSSB3cmFwcGVyIGNsYXNzIHJldHVybmVkIGZyb20gYFBvbHltZXIuZG9tLih0YXJnZXQpYCB3aGVuCiAgICogYHRhcmdldGAgaXMgYW4gYEV2ZW50YC4KICAgKi8KICBjbGFzcyBFdmVudEFwaSB7CiAgICBjb25zdHJ1Y3RvcihldmVudCkgewogICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBub2RlIG9uIHRoZSBgY29tcG9zZWRQYXRoYCBvZiB0aGlzIGV2ZW50LgogICAgICoKICAgICAqIEByZXR1cm4geyFFdmVudFRhcmdldH0gVGhlIG5vZGUgdGhpcyBldmVudCB3YXMgZGlzcGF0Y2hlZCB0bwogICAgICovCiAgICBnZXQgcm9vdFRhcmdldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuZXZlbnQuY29tcG9zZWRQYXRoKClbMF07CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBsb2NhbCAocmUtdGFyZ2V0ZWQpIHRhcmdldCBmb3IgdGhpcyBldmVudC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHshRXZlbnRUYXJnZXR9IFRoZSBsb2NhbCAocmUtdGFyZ2V0ZWQpIHRhcmdldCBmb3IgdGhpcyBldmVudC4KICAgICAqLwogICAgZ2V0IGxvY2FsVGFyZ2V0KCkgewogICAgICByZXR1cm4gdGhpcy5ldmVudC50YXJnZXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBgY29tcG9zZWRQYXRoYCBmb3IgdGhpcyBldmVudC4KICAgICAqIEByZXR1cm4geyFBcnJheTwhRXZlbnRUYXJnZXQ+fSBUaGUgbm9kZXMgdGhpcyBldmVudCBwcm9wYWdhdGVkIHRocm91Z2gKICAgICAqLwogICAgZ2V0IHBhdGgoKSB7CiAgICAgIHJldHVybiB0aGlzLmV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgfQogIH0KCiAgUG9seW1lci5Eb21BcGkgPSBEb21BcGk7CgogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGRlZXAKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuY2xvbmVOb2RlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQ7CiAgLyoqCiAgICogQGZ1bmN0aW9uCiAgICogQHBhcmFtIHshTm9kZX0gbmV3Q2hpbGQKICAgKiBAcGFyYW0ge05vZGV9IHJlZkNoaWxkCiAgICogQHJldHVybiB7IU5vZGV9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLmluc2VydEJlZm9yZTsKICAvKioKICAgKiBAZnVuY3Rpb24KICAgKiBAcGFyYW0geyFOb2RlfSBub2RlCiAgICogQHJldHVybiB7IU5vZGV9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLnJlbW92ZUNoaWxkOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7IU5vZGV9IG9sZENoaWxkCiAgICogQHBhcmFtIHshTm9kZX0gbmV3Q2hpbGQKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUucmVwbGFjZUNoaWxkOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuc2V0QXR0cmlidXRlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcgogICAqIEByZXR1cm4gez9FbGVtZW50fQogICAqLwogIFBvbHltZXIuRG9tQXBpLnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcgogICAqIEByZXR1cm4geyFOb2RlTGlzdDwhRWxlbWVudD59CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGw7CgogIC8qKgogICAqIExlZ2FjeSBET00gYW5kIEV2ZW50IG1hbmlwdWxhdGlvbiBBUEkgd3JhcHBlciBmYWN0b3J5IHVzZWQgdG8gYWJzdHJhY3QKICAgKiBkaWZmZXJlbmNlcyBiZXR3ZWVuIG5hdGl2ZSBTaGFkb3cgRE9NIGFuZCAiU2hhZHkgRE9NIiB3aGVuIHBvbHlmaWxsaW5nIG9uCiAgICogb2xkZXIgYnJvd3NlcnMuCiAgICoKICAgKiBOb3RlIHRoYXQgaW4gUG9seW1lciAyLnggdXNlIG9mIGBQb2x5bWVyLmRvbWAgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGFuZAogICAqIGluIHRoZSBtYWpvcml0eSBvZiBjYXNlcyBzaW1wbHkgZmFjYWRlcyBkaXJlY3RseSB0byB0aGUgc3RhbmRhcmQgbmF0aXZlCiAgICogQVBJLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBzdW1tYXJ5IExlZ2FjeSBET00gYW5kIEV2ZW50IG1hbmlwdWxhdGlvbiBBUEkgd3JhcHBlciBmYWN0b3J5IHVzZWQgdG8KICAgKiBhYnN0cmFjdCBkaWZmZXJlbmNlcyBiZXR3ZWVuIG5hdGl2ZSBTaGFkb3cgRE9NIGFuZCAiU2hhZHkgRE9NLiIKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7KE5vZGV8RXZlbnQpPX0gb2JqIE5vZGUgb3IgZXZlbnQgdG8gb3BlcmF0ZSBvbgogICAqIEByZXR1cm4geyFEb21BcGl8IUV2ZW50QXBpfSBXcmFwcGVyIHByb3ZpZGluZyBlaXRoZXIgbm9kZSBBUEkgb3IgZXZlbnQgQVBJCiAgICovCiAgUG9seW1lci5kb20gPSBmdW5jdGlvbihvYmopIHsKICAgIG9iaiA9IG9iaiB8fCBkb2N1bWVudDsKICAgIGlmICghb2JqLl9fZG9tQXBpKSB7CiAgICAgIGxldCBoZWxwZXI7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFdmVudCkgewogICAgICAgIGhlbHBlciA9IG5ldyBFdmVudEFwaShvYmopOwogICAgICB9IGVsc2UgewogICAgICAgIGhlbHBlciA9IG5ldyBEb21BcGkob2JqKTsKICAgICAgfQogICAgICBvYmouX19kb21BcGkgPSBoZWxwZXI7CiAgICB9CiAgICByZXR1cm4gb2JqLl9fZG9tQXBpOwogIH07CgogIFBvbHltZXIuZG9tLm1hdGNoZXNTZWxlY3RvciA9IG1hdGNoZXNTZWxlY3RvcjsKCiAgLyoqCiAgICogRm9yY2VzIHNldmVyYWwgY2xhc3NlcyBvZiBhc3luY2hyb25vdXNseSBxdWV1ZWQgdGFza3MgdG8gZmx1c2g6CiAgICogLSBEZWJvdW5jZXJzIGFkZGVkIHZpYSBgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyYAogICAqIC0gU2hhZHlET00gZGlzdHJpYnV0aW9uCiAgICoKICAgKiBUaGlzIG1ldGhvZCBmYWNhZGVzIHRvIGBQb2x5bWVyLmZsdXNoYC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyLmRvbQogICAqLwogIFBvbHltZXIuZG9tLmZsdXNoID0gUG9seW1lci5mbHVzaDsKCiAgLyoqCiAgICogQWRkcyBhIGBQb2x5bWVyLkRlYm91bmNlcmAgdG8gYSBsaXN0IG9mIGdsb2JhbGx5IGZsdXNoYWJsZSB0YXNrcy4KICAgKgogICAqIFRoaXMgbWV0aG9kIGZhY2FkZXMgdG8gYFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcmAuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lci5kb20KICAgKiBAcGFyYW0geyFQb2x5bWVyLkRlYm91bmNlcn0gZGVib3VuY2VyIERlYm91bmNlciB0byBlbnF1ZXVlCiAgICovCiAgUG9seW1lci5kb20uYWRkRGVib3VuY2VyID0gUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgc3R5bGVJbnRlcmZhY2UgPSB3aW5kb3cuU2hhZHlDU1M7CgogIC8qKgogICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBQb2x5bWVyJ3MgImxlZ2FjeSIgQVBJIGludGVuZGVkIHRvIGJlCiAgICogYmFja3dhcmQtY29tcGF0aWJsZSB0byB0aGUgZ3JlYXRlc3QgZXh0ZW50IHBvc3NpYmxlIHdpdGggdGhlIEFQSQogICAqIGZvdW5kIG9uIHRoZSBQb2x5bWVyIDEueCBgUG9seW1lci5CYXNlYCBwcm90b3R5cGUgYXBwbGllZCB0byBhbGwgZWxlbWVudHMKICAgKiBkZWZpbmVkIHVzaW5nIHRoZSBgUG9seW1lcih7Li4ufSlgIGZ1bmN0aW9uLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5FbGVtZW50TWl4aW4KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzCiAgICogQHByb3BlcnR5IGlzQXR0YWNoZWQge2Jvb2xlYW59IFNldCB0byBgdHJ1ZWAgaW4gdGhpcyBlbGVtZW50J3MKICAgKiAgIGBjb25uZWN0ZWRDYWxsYmFja2AgYW5kIGBmYWxzZWAgaW4gYGRpc2Nvbm5lY3RlZENhbGxiYWNrYAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIFBvbHltZXIncyAibGVnYWN5IiBBUEkKICAgKi8KICBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbigoYmFzZSkgPT4gewoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0VsZW1lbnRNaXhpbn0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0dlc3R1cmVFdmVudExpc3RlbmVyc30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0Rpck1peGlufQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgbGVnYWN5RWxlbWVudEJhc2UgPSBQb2x5bWVyLkRpck1peGluKFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzKFBvbHltZXIuRWxlbWVudE1peGluKGJhc2UpKSk7CgogICAgLyoqCiAgICAgKiBNYXAgb2Ygc2ltcGxlIG5hbWVzIHRvIHRvdWNoIGFjdGlvbiBuYW1lcwogICAgICogQGRpY3QKICAgICAqLwogICAgY29uc3QgRElSRUNUSU9OX01BUCA9IHsKICAgICAgJ3gnOiAncGFuLXgnLAogICAgICAneSc6ICdwYW4teScsCiAgICAgICdub25lJzogJ25vbmUnLAogICAgICAnYWxsJzogJ2F1dG8nCiAgICB9OwoKICAgIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAZXh0ZW5kcyB7bGVnYWN5RWxlbWVudEJhc2V9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9MZWdhY3lFbGVtZW50TWl4aW59CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIExlZ2FjeUVsZW1lbnQgZXh0ZW5kcyBsZWdhY3lFbGVtZW50QmFzZSB7CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICB0aGlzLmlzQXR0YWNoZWQ7CiAgICAgICAgLyoqIEB0eXBlIHtXZWFrTWFwPCFFbGVtZW50LCAhT2JqZWN0PHN0cmluZywgIUZ1bmN0aW9uPj59ICovCiAgICAgICAgdGhpcy5fX2JvdW5kTGlzdGVuZXJzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgRnVuY3Rpb24+fSAqLwogICAgICAgIHRoaXMuX2RlYm91bmNlcnM7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGb3J3YXJkcyBgaW1wb3J0TWV0YWAgZnJvbSB0aGUgcHJvdG90eXBlIChpLmUuIGZyb20gdGhlIGluZm8gb2JqZWN0CiAgICAgICAqIHBhc3NlZCB0byBgUG9seW1lcih7Li4ufSlgKSB0byB0aGUgc3RhdGljIEFQSS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IU9iamVjdH0gVGhlIGBpbXBvcnQubWV0YWAgb2JqZWN0IHNldCBvbiB0aGUgcHJvdG90eXBlCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IGB0aGlzYCBpcyBhbHdheXMgaW4gdGhlIGluc3RhbmNlIGluCiAgICAgICAqICBjbG9zdXJlIGZvciBzb21lIHJlYXNvbiBldmVuIGluIGEgc3RhdGljIG1ldGhvZCwgcmF0aGVyIHRoYW4gdGhlIGNsYXNzCiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IGltcG9ydE1ldGEoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucHJvdG90eXBlLmltcG9ydE1ldGE7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBMZWdhY3kgY2FsbGJhY2sgY2FsbGVkIGR1cmluZyB0aGUgYGNvbnN0cnVjdG9yYCwgZm9yIG92ZXJyaWRpbmcKICAgICAgICogYnkgdGhlIHVzZXIuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjcmVhdGVkKCkge30KCiAgICAgIC8qKgogICAgICAgKiBQcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBgY29ubmVjdGVkQ2FsbGJhY2tgCiAgICAgICAqIHdoaWNoIGFkZHMgUG9seW1lciBsZWdhY3kgQVBJJ3MgYGF0dGFjaGVkYCBtZXRob2QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICB0aGlzLmlzQXR0YWNoZWQgPSB0cnVlOwogICAgICAgIHRoaXMuYXR0YWNoZWQoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIExlZ2FjeSBjYWxsYmFjayBjYWxsZWQgZHVyaW5nIGBjb25uZWN0ZWRDYWxsYmFja2AsIGZvciBvdmVycmlkaW5nCiAgICAgICAqIGJ5IHRoZSB1c2VyLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgYXR0YWNoZWQoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIFByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AKICAgICAgICogd2hpY2ggYWRkcyBQb2x5bWVyIGxlZ2FjeSBBUEkncyBgZGV0YWNoZWRgIG1ldGhvZC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgIHRoaXMuaXNBdHRhY2hlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuZGV0YWNoZWQoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIExlZ2FjeSBjYWxsYmFjayBjYWxsZWQgZHVyaW5nIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AsIGZvciBvdmVycmlkaW5nCiAgICAgICAqIGJ5IHRoZSB1c2VyLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGV0YWNoZWQoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIFByb3ZpZGVzIGFuIG92ZXJyaWRlIGltcGxlbWVudGF0aW9uIG9mIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgCiAgICAgICAqIHdoaWNoIGFkZHMgdGhlIFBvbHltZXIgbGVnYWN5IEFQSSdzIGBhdHRyaWJ1dGVDaGFuZ2VkYCBtZXRob2QuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG9sZCBPbGQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIEN1cnJlbnQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG5hbWVzcGFjZSBBdHRyaWJ1dGUgbmFtZXNwYWNlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpIHsKICAgICAgICBpZiAob2xkICE9PSB2YWx1ZSkgewogICAgICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUsIG5hbWVzcGFjZSk7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZUNoYW5nZWQobmFtZSwgb2xkLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogTGVnYWN5IGNhbGxiYWNrIGNhbGxlZCBkdXJpbmcgYGF0dHJpYnV0ZUNoYW5nZWRDaGFsbGJhY2tgLCBmb3Igb3ZlcnJpZGluZwogICAgICAgKiBieSB0aGUgdXNlci4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gb2xkIE9sZCB2YWx1ZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgQ3VycmVudCB2YWx1ZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBhdHRyaWJ1dGVDaGFuZ2VkKG5hbWUsIG9sZCwgdmFsdWUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCBpbXBsZW1lbnRhdGlvbiB0bwogICAgICAgKiBhZGQgc3VwcG9ydCBmb3IgY2xhc3MgaW5pdGlhbGl6YXRpb24gdmlhIHRoZSBgX3JlZ2lzdGVyZWRgIGNhbGxiYWNrLgogICAgICAgKiBUaGlzIGlzIGNhbGxlZCBvbmx5IHdoZW4gdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBlbGVtZW50IGlzIGNyZWF0ZWQuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAgICovCiAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICBsZXQgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7CiAgICAgICAgaWYgKCFwcm90by5oYXNPd25Qcm9wZXJ0eSgnX19oYXNSZWdpc3RlckZpbmlzaGVkJykpIHsKICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyZWQoKTsKICAgICAgICAgIC8vIGJhY2tzdG9wIGluIGNhc2UgdGhlIGBfcmVnaXN0ZXJlZGAgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc2V0IHRoaXMKICAgICAgICAgIHByb3RvLl9faGFzUmVnaXN0ZXJGaW5pc2hlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgIHRoaXMucm9vdCA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovKHRoaXMpOwogICAgICAgIHRoaXMuY3JlYXRlZCgpOwogICAgICAgIC8vIEVuc3VyZSBsaXN0ZW5lcnMgYXJlIGFwcGxpZWQgaW1tZWRpYXRlbHkgc28gdGhhdCB0aGV5IGFyZQogICAgICAgIC8vIGFkZGVkIGJlZm9yZSBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMuIFRoaXMgYWxsb3dzIGFuIGVsZW1lbnQgdG8KICAgICAgICAvLyBkZWNvcmF0ZSBpdHNlbGYgdmlhIGFuIGV2ZW50IHByaW9yIHRvIGFueSBkZWNsYXJhdGl2ZSBsaXN0ZW5lcnMKICAgICAgICAvLyBzZWVpbmcgdGhlIGV2ZW50LiBOb3RlLCB0aGlzIGVuc3VyZXMgY29tcGF0aWJpbGl0eSB3aXRoIDEueCBvcmRlcmluZy4KICAgICAgICB0aGlzLl9hcHBseUxpc3RlbmVycygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhbiBlbGVtZW50IGlzIGluaXRpYWxpemluZy4KICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gY2xhc3MgcmVnaXN0cmF0aW9uIHRpbWUKICAgICAgICogd29yay4gVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBlbnN1cmUgdGhlIHdvcmsgaXMgcGVyZm9ybWVkCiAgICAgICAqIG9ubHkgb25jZSBmb3IgdGhlIGNsYXNzLgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcmVnaXN0ZXJlZCgpIHt9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgaW1wbGVtZW50YXRpb24gdG8KICAgICAgICogYWRkIHN1cHBvcnQgZm9yIGluc3RhbGxpbmcgYGhvc3RBdHRyaWJ1dGVzYCBhbmQgYGxpc3RlbmVyc2AuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgcmVhZHkoKSB7CiAgICAgICAgdGhpcy5fZW5zdXJlQXR0cmlidXRlcygpOwogICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFbnN1cmVzIGFuIGVsZW1lbnQgaGFzIHJlcXVpcmVkIGF0dHJpYnV0ZXMuIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50CiAgICAgICAqIGlzIGJlaW5nIHJlYWRpZWQgdmlhIGByZWFkeWAuIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0byBzZXQgdGhlCiAgICAgICAqIGVsZW1lbnQncyByZXF1aXJlZCBhdHRyaWJ1dGVzLiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIHN1cmUKICAgICAgICogdG8gY2hlY2sgYW5kIG5vdCBvdmVycmlkZSBleGlzdGluZyBhdHRyaWJ1dGVzIGFkZGVkIGJ5CiAgICAgICAqIHRoZSB1c2VyIG9mIHRoZSBlbGVtZW50LiBUeXBpY2FsbHksIHNldHRpbmcgYXR0cmlidXRlcyBzaG91bGQgYmUgbGVmdAogICAgICAgKiB0byB0aGUgZWxlbWVudCB1c2VyIGFuZCBub3QgZG9uZSBoZXJlOyByZWFzb25hYmxlIGV4Y2VwdGlvbnMgaW5jbHVkZQogICAgICAgKiBzZXR0aW5nIGFyaWEgcm9sZXMgYW5kIGZvY3VzYWJpbGl0eS4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2Vuc3VyZUF0dHJpYnV0ZXMoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIEFkZHMgZWxlbWVudCBldmVudCBsaXN0ZW5lcnMuIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50CiAgICAgICAqIGlzIGJlaW5nIHJlYWRpZWQgdmlhIGByZWFkeWAuIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0bwogICAgICAgKiBhZGQgYW55IHJlcXVpcmVkIGVsZW1lbnQgZXZlbnQgbGlzdGVuZXJzLgogICAgICAgKiBJbiBwZXJmb3JtYW5jZSBjcml0aWNhbCBlbGVtZW50cywgdGhlIHdvcmsgZG9uZSBoZXJlIHNob3VsZCBiZSBrZXB0CiAgICAgICAqIHRvIGEgbWluaW11bSBzaW5jZSBpdCBpcyBkb25lIGJlZm9yZSB0aGUgZWxlbWVudCBpcyByZW5kZXJlZC4gSW4KICAgICAgICogdGhlc2UgZWxlbWVudHMsIGNvbnNpZGVyIGFkZGluZyBsaXN0ZW5lcnMgYXN5bmNocm9ub3VzbHkgc28gYXMgbm90IHRvCiAgICAgICAqIGJsb2NrIHJlbmRlci4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2FwcGx5TGlzdGVuZXJzKCkge30KCiAgICAgIC8qKgogICAgICAgKiBDb252ZXJ0cyBhIHR5cGVkIEphdmFTY3JpcHQgdmFsdWUgdG8gYSBzdHJpbmcuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLiBUbyBjdXN0b21pemUKICAgICAgICogaG93IHByb3BlcnRpZXMgYXJlIHNlcmlhbGl6ZWQgdG8gYXR0cmlidXRlcyBmb3IgYXR0cmlidXRlIGJpbmRpbmdzIGFuZAogICAgICAgKiBgcmVmbGVjdFRvQXR0cmlidXRlOiB0cnVlYCBwcm9wZXJ0aWVzIGFzIHdlbGwgYXMgdGhpcyBtZXRob2QsIG92ZXJyaWRlCiAgICAgICAqIHRoZSBgX3NlcmlhbGl6ZVZhbHVlYCBtZXRob2QgcHJvdmlkZWQgYnkgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIGRlc2VyaWFsaXplCiAgICAgICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gU2VyaWFsaXplZCB2YWx1ZQogICAgICAgKi8KICAgICAgc2VyaWFsaXplKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3NlcmlhbGl6ZVZhbHVlKHZhbHVlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICoKICAgICAgICogTm90ZSB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBiYWNrd2FyZC1jb21wYXRpYmxlIGxlZ2FjeSBBUEkKICAgICAgICogb25seS4gIEl0IGlzIG5vdCBkaXJlY3RseSBjYWxsZWQgYnkgYW55IFBvbHltZXIgZmVhdHVyZXMuICBUbyBjdXN0b21pemUKICAgICAgICogaG93IGF0dHJpYnV0ZXMgYXJlIGRlc2VyaWFsaXplZCB0byBwcm9wZXJ0aWVzIGZvciBpbgogICAgICAgKiBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCwgb3ZlcnJpZGUgYF9kZXNlcmlhbGl6ZVZhbHVlYCBtZXRob2QKICAgICAgICogcHJvdmlkZWQgYnkgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgU3RyaW5nIHRvIGRlc2VyaWFsaXplCiAgICAgICAqIEBwYXJhbSB7Kn0gdHlwZSBUeXBlIHRvIGRlc2VyaWFsaXplIHRoZSBzdHJpbmcgdG8KICAgICAgICogQHJldHVybiB7Kn0gUmV0dXJucyB0aGUgZGVzZXJpYWxpemVkIHZhbHVlIGluIHRoZSBgdHlwZWAgZ2l2ZW4uCiAgICAgICAqLwogICAgICBkZXNlcmlhbGl6ZSh2YWx1ZSwgdHlwZSkgewogICAgICAgIHJldHVybiB0aGlzLl9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlcmlhbGl6ZXMgYSBwcm9wZXJ0eSB0byBpdHMgYXNzb2NpYXRlZCBhdHRyaWJ1dGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZSB0byByZWZsZWN0LgogICAgICAgKiBAcGFyYW0ge3N0cmluZz19IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byByZWZsZWN0LgogICAgICAgKiBAcGFyYW0geyo9fSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSB0byByZWZsZWN0LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgcmVmbGVjdFByb3BlcnR5VG9BdHRyaWJ1dGUocHJvcGVydHksIGF0dHJpYnV0ZSwgdmFsdWUpIHsKICAgICAgICB0aGlzLl9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBhdHRyaWJ1dGUsIHZhbHVlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNldHMgYSB0eXBlZCB2YWx1ZSB0byBhbiBIVE1MIGF0dHJpYnV0ZSBvbiBhIG5vZGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNlcmlhbGl6ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byBzZXJpYWxpemUgdG8uCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIHNldCBhdHRyaWJ1dGUgdG8uCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzZXJpYWxpemVWYWx1ZVRvQXR0cmlidXRlKHZhbHVlLCBhdHRyaWJ1dGUsIG5vZGUpIHsKICAgICAgICB0aGlzLl92YWx1ZVRvTm9kZUF0dHJpYnV0ZSgvKiogQHR5cGUge0VsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpLCB2YWx1ZSwgYXR0cmlidXRlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvcGllcyBvd24gcHJvcGVydGllcyAoaW5jbHVkaW5nIGFjY2Vzc29yIGRlc2NyaXB0b3JzKSBmcm9tIGEgc291cmNlCiAgICAgICAqIG9iamVjdCB0byBhIHRhcmdldCBvYmplY3QuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGUgVGFyZ2V0IG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhcGkgU291cmNlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS4KICAgICAgICogQHJldHVybiB7T2JqZWN0fSBwcm90b3R5cGUgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCBhcyBmaXJzdCBhcmd1bWVudC4KICAgICAgICovCiAgICAgIGV4dGVuZChwcm90b3R5cGUsIGFwaSkgewogICAgICAgIGlmICghKHByb3RvdHlwZSAmJiBhcGkpKSB7CiAgICAgICAgICByZXR1cm4gcHJvdG90eXBlIHx8IGFwaTsKICAgICAgICB9CiAgICAgICAgbGV0IG4kID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXBpKTsKICAgICAgICBmb3IgKGxldCBpPTAsIG47IChpPG4kLmxlbmd0aCkgJiYgKG49biRbaV0pOyBpKyspIHsKICAgICAgICAgIGxldCBwZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYXBpLCBuKTsKICAgICAgICAgIGlmIChwZCkgewogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCBuLCBwZCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcm90b3R5cGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb3BpZXMgcHJvcHMgZnJvbSBhIHNvdXJjZSBvYmplY3QgdG8gYSB0YXJnZXQgb2JqZWN0LgogICAgICAgKgogICAgICAgKiBOb3RlLCB0aGlzIG1ldGhvZCB1c2VzIGEgc2ltcGxlIGBmb3IuLi5pbmAgc3RyYXRlZ3kgZm9yIGVudW1lcmF0aW5nCiAgICAgICAqIHByb3BlcnRpZXMuICBUbyBlbnN1cmUgb25seSBgb3duUHJvcGVydGllc2AgYXJlIGNvcGllZCBmcm9tIHNvdXJjZQogICAgICAgKiB0byB0YXJnZXQgYW5kIHRoYXQgYWNjZXNzb3IgaW1wbGVtZW50YXRpb25zIGFyZSBjb3BpZWQsIHVzZSBgZXh0ZW5kYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshT2JqZWN0fSB0YXJnZXQgVGFyZ2V0IG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gc291cmNlIFNvdXJjZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20uCiAgICAgICAqIEByZXR1cm4geyFPYmplY3R9IFRhcmdldCBvYmplY3QgdGhhdCB3YXMgcGFzc2VkIGFzIGZpcnN0IGFyZ3VtZW50LgogICAgICAgKi8KICAgICAgbWl4aW4odGFyZ2V0LCBzb3VyY2UpIHsKICAgICAgICBmb3IgKGxldCBpIGluIHNvdXJjZSkgewogICAgICAgICAgdGFyZ2V0W2ldID0gc291cmNlW2ldOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2V0cyB0aGUgcHJvdG90eXBlIG9mIGFuIG9iamVjdC4KICAgICAgICoKICAgICAgICogTm90ZSB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBiYWNrd2FyZC1jb21wYXRpYmxlIGxlZ2FjeSBBUEkKICAgICAgICogb25seS4gIEl0IGlzIG5vdCBkaXJlY3RseSBjYWxsZWQgYnkgYW55IFBvbHltZXIgZmVhdHVyZXMuCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCBvbiB3aGljaCB0byBzZXQgdGhlIHByb3RvdHlwZS4KICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZSBUaGUgcHJvdG90eXBlIHRoYXQgd2lsbCBiZSBzZXQgb24gdGhlIGdpdmVuCiAgICAgICAqIGBvYmplY3RgLgogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgdGhlIGdpdmVuIGBvYmplY3RgIHdpdGggaXRzIHByb3RvdHlwZSBzZXQKICAgICAgICogdG8gdGhlIGdpdmVuIGBwcm90b3R5cGVgIG9iamVjdC4KICAgICAgICovCiAgICAgIGNoYWluT2JqZWN0KG9iamVjdCwgcHJvdG90eXBlKSB7CiAgICAgICAgaWYgKG9iamVjdCAmJiBwcm90b3R5cGUgJiYgb2JqZWN0ICE9PSBwcm90b3R5cGUpIHsKICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgIH0KCiAgICAgIC8qICoqKiogQmVnaW4gVGVtcGxhdGUgKioqKiAqLwoKICAgICAgLyoqCiAgICAgICAqIENhbGxzIGBpbXBvcnROb2RlYCBvbiB0aGUgYGNvbnRlbnRgIG9mIHRoZSBgdGVtcGxhdGVgIHNwZWNpZmllZCBhbmQKICAgICAgICogcmV0dXJucyBhIGRvY3VtZW50IGZyYWdtZW50IGNvbnRhaW5pbmcgdGhlIGltcG9ydGVkIGNvbnRlbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgSFRNTCB0ZW1wbGF0ZSBlbGVtZW50IHRvIGluc3RhbmNlLgogICAgICAgKiBAcmV0dXJuIHshRG9jdW1lbnRGcmFnbWVudH0gRG9jdW1lbnQgZnJhZ21lbnQgY29udGFpbmluZyB0aGUgaW1wb3J0ZWQKICAgICAgICogICB0ZW1wbGF0ZSBjb250ZW50LgogICAgICAqLwogICAgICBpbnN0YW5jZVRlbXBsYXRlKHRlbXBsYXRlKSB7CiAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLmNvbnN0cnVjdG9yLl9jb250ZW50Rm9yVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgIGxldCBkb20gPSAvKiogQHR5cGUgeyFEb2N1bWVudEZyYWdtZW50fSAqLwogICAgICAgICAgKGRvY3VtZW50LmltcG9ydE5vZGUoY29udGVudCwgdHJ1ZSkpOwogICAgICAgIHJldHVybiBkb207CiAgICAgIH0KCiAgICAgIC8qICoqKiogQmVnaW4gRXZlbnRzICoqKiogKi8KCgoKICAgICAgLyoqCiAgICAgICAqIERpc3BhdGNoZXMgYSBjdXN0b20gZXZlbnQgd2l0aCBhbiBvcHRpb25hbCBkZXRhaWwgdmFsdWUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIE5hbWUgb2YgZXZlbnQgdHlwZS4KICAgICAgICogQHBhcmFtIHsqPX0gZGV0YWlsIERldGFpbCB2YWx1ZSBjb250YWluaW5nIGV2ZW50LXNwZWNpZmljCiAgICAgICAqICAgcGF5bG9hZC4KICAgICAgICogQHBhcmFtIHt7IGJ1YmJsZXM6IChib29sZWFufHVuZGVmaW5lZCksIGNhbmNlbGFibGU6IChib29sZWFufHVuZGVmaW5lZCksIGNvbXBvc2VkOiAoYm9vbGVhbnx1bmRlZmluZWQpIH09fQogICAgICAgKiAgb3B0aW9ucyBPYmplY3Qgc3BlY2lmeWluZyBvcHRpb25zLiAgVGhlc2UgbWF5IGluY2x1ZGU6CiAgICAgICAqICBgYnViYmxlc2AgKGJvb2xlYW4sIGRlZmF1bHRzIHRvIGB0cnVlYCksCiAgICAgICAqICBgY2FuY2VsYWJsZWAgKGJvb2xlYW4sIGRlZmF1bHRzIHRvIGZhbHNlKSwgYW5kCiAgICAgICAqICBgbm9kZWAgb24gd2hpY2ggdG8gZmlyZSB0aGUgZXZlbnQgKEhUTUxFbGVtZW50LCBkZWZhdWx0cyB0byBgdGhpc2ApLgogICAgICAgKiBAcmV0dXJuIHshRXZlbnR9IFRoZSBuZXcgZXZlbnQgdGhhdCB3YXMgZmlyZWQuCiAgICAgICAqLwogICAgICBmaXJlKHR5cGUsIGRldGFpbCwgb3B0aW9ucykgewogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICAgIGRldGFpbCA9IChkZXRhaWwgPT09IG51bGwgfHwgZGV0YWlsID09PSB1bmRlZmluZWQpID8ge30gOiBkZXRhaWw7CiAgICAgICAgbGV0IGV2ZW50ID0gbmV3IEV2ZW50KHR5cGUsIHsKICAgICAgICAgIGJ1YmJsZXM6IG9wdGlvbnMuYnViYmxlcyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IG9wdGlvbnMuYnViYmxlcywKICAgICAgICAgIGNhbmNlbGFibGU6IEJvb2xlYW4ob3B0aW9ucy5jYW5jZWxhYmxlKSwKICAgICAgICAgIGNvbXBvc2VkOiBvcHRpb25zLmNvbXBvc2VkID09PSB1bmRlZmluZWQgPyB0cnVlOiBvcHRpb25zLmNvbXBvc2VkCiAgICAgICAgfSk7CiAgICAgICAgZXZlbnQuZGV0YWlsID0gZGV0YWlsOwogICAgICAgIGxldCBub2RlID0gb3B0aW9ucy5ub2RlIHx8IHRoaXM7CiAgICAgICAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgICAgICByZXR1cm4gZXZlbnQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gYWRkIGFuIGV2ZW50IGxpc3RlbmVyIG9uIGEgZ2l2ZW4gZWxlbWVudCwKICAgICAgICogbGF0ZSBib3VuZCB0byBhIG5hbWVkIG1ldGhvZCBvbiB0aGlzIGVsZW1lbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIGFkZCBldmVudCBsaXN0ZW5lciB0by4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50IHRvIGxpc3RlbiBmb3IuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE5hbWUgb2YgaGFuZGxlciBtZXRob2Qgb24gYHRoaXNgIHRvIGNhbGwuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBsaXN0ZW4obm9kZSwgZXZlbnROYW1lLCBtZXRob2ROYW1lKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7IUVsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpOwogICAgICAgIGxldCBoYmwgPSB0aGlzLl9fYm91bmRMaXN0ZW5lcnMgfHwKICAgICAgICAgICh0aGlzLl9fYm91bmRMaXN0ZW5lcnMgPSBuZXcgV2Vha01hcCgpKTsKICAgICAgICBsZXQgYmwgPSBoYmwuZ2V0KG5vZGUpOwogICAgICAgIGlmICghYmwpIHsKICAgICAgICAgIGJsID0ge307CiAgICAgICAgICBoYmwuc2V0KG5vZGUsIGJsKTsKICAgICAgICB9CiAgICAgICAgbGV0IGtleSA9IGV2ZW50TmFtZSArIG1ldGhvZE5hbWU7CiAgICAgICAgaWYgKCFibFtrZXldKSB7CiAgICAgICAgICBibFtrZXldID0gdGhpcy5fYWRkTWV0aG9kRXZlbnRMaXN0ZW5lclRvTm9kZSgKICAgICAgICAgICAgbm9kZSwgZXZlbnROYW1lLCBtZXRob2ROYW1lLCB0aGlzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gYSBnaXZlbiBlbGVtZW50LAogICAgICAgKiBsYXRlIGJvdW5kIHRvIGEgbmFtZWQgbWV0aG9kIG9uIHRoaXMgZWxlbWVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBub2RlIEVsZW1lbnQgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVyIGZyb20uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudCB0byBzdG9wIGxpc3RlbmluZyB0by4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTmFtZSBvZiBoYW5kbGVyIG1ldGhvZCBvbiBgdGhpc2AgdG8gbm90IGNhbGwKICAgICAgIGFueW1vcmUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICB1bmxpc3Rlbihub2RlLCBldmVudE5hbWUsIG1ldGhvZE5hbWUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHshRWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgbGV0IGJsID0gdGhpcy5fX2JvdW5kTGlzdGVuZXJzICYmIHRoaXMuX19ib3VuZExpc3RlbmVycy5nZXQobm9kZSk7CiAgICAgICAgbGV0IGtleSA9IGV2ZW50TmFtZSArIG1ldGhvZE5hbWU7CiAgICAgICAgbGV0IGhhbmRsZXIgPSBibCAmJiBibFtrZXldOwogICAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgICB0aGlzLl9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICAgIGJsW2tleV0gPSBudWxsOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlIHNjcm9sbGluZyBiZWhhdmlvciB0byBhbGwgZGlyZWN0aW9uLCBvbmUgZGlyZWN0aW9uLCBvciBub25lLgogICAgICAgKgogICAgICAgKiBWYWxpZCBzY3JvbGwgZGlyZWN0aW9uczoKICAgICAgICogICAtICdhbGwnOiBzY3JvbGwgaW4gYW55IGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ3gnOiBzY3JvbGwgb25seSBpbiB0aGUgJ3gnIGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ3knOiBzY3JvbGwgb25seSBpbiB0aGUgJ3knIGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ25vbmUnOiBkaXNhYmxlIHNjcm9sbGluZyBmb3IgdGhpcyBub2RlCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gZGlyZWN0aW9uIERpcmVjdGlvbiB0byBhbGxvdyBzY3JvbGxpbmcKICAgICAgICogRGVmYXVsdHMgdG8gYGFsbGAuCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG5vZGUgRWxlbWVudCB0byBhcHBseSBzY3JvbGwgZGlyZWN0aW9uIHNldHRpbmcuCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHNldFNjcm9sbERpcmVjdGlvbihkaXJlY3Rpb24sIG5vZGUpIHsKICAgICAgICBQb2x5bWVyLkdlc3R1cmVzLnNldFRvdWNoQWN0aW9uKC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyksIERJUkVDVElPTl9NQVBbZGlyZWN0aW9uXSB8fCAnYXV0bycpOwogICAgICB9CiAgICAgIC8qICoqKiogRW5kIEV2ZW50cyAqKioqICovCgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHJ1biBgcXVlcnlTZWxlY3RvcmAgb24gdGhpcyBsb2NhbCBET00gc2NvcGUuCiAgICAgICAqCiAgICAgICAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgYFBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvcihzbGN0cilgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2xjdHIgU2VsZWN0b3IgdG8gcnVuIG9uIHRoaXMgbG9jYWwgRE9NIHNjb3BlCiAgICAgICAqIEByZXR1cm4ge0VsZW1lbnR9IEVsZW1lbnQgZm91bmQgYnkgdGhlIHNlbGVjdG9yLCBvciBudWxsIGlmIG5vdCBmb3VuZC4KICAgICAgICovCiAgICAgICQkKHNsY3RyKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKHNsY3RyKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybiB0aGUgZWxlbWVudCB3aG9zZSBsb2NhbCBkb20gd2l0aGluIHdoaWNoIHRoaXMgZWxlbWVudAogICAgICAgKiBpcyBjb250YWluZWQuIFRoaXMgaXMgYSBzaG9ydGhhbmQgZm9yCiAgICAgICAqIGB0aGlzLmdldFJvb3ROb2RlKCkuaG9zdGAuCiAgICAgICAqIEB0aGlzIHtFbGVtZW50fQogICAgICAgKi8KICAgICAgZ2V0IGRvbUhvc3QoKSB7CiAgICAgICAgbGV0IHJvb3QgPSB0aGlzLmdldFJvb3ROb2RlKCk7CiAgICAgICAgcmV0dXJuIChyb290IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkgPyAvKiogQHR5cGUge1NoYWRvd1Jvb3R9ICovIChyb290KS5ob3N0IDogcm9vdDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZvcmNlIHRoaXMgZWxlbWVudCB0byBkaXN0cmlidXRlIGl0cyBjaGlsZHJlbiB0byBpdHMgbG9jYWwgZG9tLgogICAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGFzIG9mIFBvbHltZXIgMi4wLjIgYW5kIGlzIHByb3ZpZGVkIG9ubHkKICAgICAgICogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGlzdHJpYnV0ZUNvbnRlbnQoKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSAmJiB0aGlzLnNoYWRvd1Jvb3QpIHsKICAgICAgICAgIFNoYWR5RE9NLmZsdXNoKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2Ygbm9kZXMgdGhhdCBhcmUgdGhlIGVmZmVjdGl2ZSBjaGlsZE5vZGVzLiBUaGUgZWZmZWN0aXZlCiAgICAgICAqIGNoaWxkTm9kZXMgbGlzdCBpcyB0aGUgc2FtZSBhcyB0aGUgZWxlbWVudCdzIGNoaWxkTm9kZXMgZXhjZXB0IHRoYXQKICAgICAgICogYW55IGA8Y29udGVudD5gIGVsZW1lbnRzIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBsaXN0IG9mIG5vZGVzIGRpc3RyaWJ1dGVkCiAgICAgICAqIHRvIHRoZSBgPGNvbnRlbnQ+YCwgdGhlIHJlc3VsdCBvZiBpdHMgYGdldERpc3RyaWJ1dGVkTm9kZXNgIG1ldGhvZC4KICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBlZmZlY3RpdmUgY2hpbGQgbm9kZXMuCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBMZWdhY3lFbGVtZW50TWl4aW4gbXVzdCBiZSBhcHBsaWVkIHRvIGFuIEhUTUxFbGVtZW50CiAgICAgICAqLwogICAgICBnZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCkgewogICAgICAgIGNvbnN0IHRoaXNFbCA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKHRoaXMpOwogICAgICAgIGNvbnN0IGRvbUFwaSA9IC8qKiBAdHlwZSB7UG9seW1lci5Eb21BcGl9ICovKFBvbHltZXIuZG9tKHRoaXNFbCkpOwogICAgICAgIHJldHVybiBkb21BcGkuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2Ygbm9kZXMgZGlzdHJpYnV0ZWQgd2l0aGluIHRoaXMgZWxlbWVudCB0aGF0IG1hdGNoCiAgICAgICAqIGBzZWxlY3RvcmAuIFRoZXNlIGNhbiBiZSBkb20gY2hpbGRyZW4gb3IgZWxlbWVudHMgZGlzdHJpYnV0ZWQgdG8KICAgICAgICogY2hpbGRyZW4gdGhhdCBhcmUgaW5zZXJ0aW9uIHBvaW50cy4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHJ1bi4KICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBkaXN0cmlidXRlZCBlbGVtZW50cyB0aGF0IG1hdGNoIHNlbGVjdG9yLgogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30gTGVnYWN5RWxlbWVudE1peGluIG11c3QgYmUgYXBwbGllZCB0byBhbiBIVE1MRWxlbWVudAogICAgICAgKi8KICAgICAgcXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHNlbGVjdG9yKSB7CiAgICAgICAgY29uc3QgdGhpc0VsID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAodGhpcyk7CiAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtQb2x5bWVyLkRvbUFwaX0gKi8oUG9seW1lci5kb20odGhpc0VsKSk7CiAgICAgICAgcmV0dXJuIGRvbUFwaS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHMoc2VsZWN0b3IpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBhcmUgdGhlIGVmZmVjdGl2ZSBjaGlsZHJlbi4gVGhlIGVmZmVjdGl2ZQogICAgICAgKiBjaGlsZHJlbiBsaXN0IGlzIHRoZSBzYW1lIGFzIHRoZSBlbGVtZW50J3MgY2hpbGRyZW4gZXhjZXB0IHRoYXQKICAgICAgICogYW55IGA8Y29udGVudD5gIGVsZW1lbnRzIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBsaXN0IG9mIGVsZW1lbnRzCiAgICAgICAqIGRpc3RyaWJ1dGVkIHRvIHRoZSBgPGNvbnRlbnQ+YC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBlZmZlY3RpdmUgY2hpbGRyZW4uCiAgICAgICAqLwogICAgICBnZXRFZmZlY3RpdmVDaGlsZHJlbigpIHsKICAgICAgICBsZXQgbGlzdCA9IHRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICAgIHJldHVybiBsaXN0LmZpbHRlcihmdW5jdGlvbigvKiogQHR5cGUgeyFOb2RlfSAqLyBuKSB7CiAgICAgICAgICByZXR1cm4gKG4ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKTsKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgb2YgdGV4dCBjb250ZW50IHRoYXQgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlCiAgICAgICAqIHRleHQgY29udGVudCdzIG9mIHRoZSBlbGVtZW50J3MgZWZmZWN0aXZlIGNoaWxkTm9kZXMgKHRoZSBlbGVtZW50cwogICAgICAgKiByZXR1cm5lZCBieSA8YSBocmVmPSIjZ2V0RWZmZWN0aXZlQ2hpbGROb2Rlcz5nZXRFZmZlY3RpdmVDaGlsZE5vZGVzPC9hPi4KICAgICAgICoKICAgICAgICogQHJldHVybiB7c3RyaW5nfSBMaXN0IG9mIGVmZmVjdGl2ZSBjaGlsZHJlbi4KICAgICAgICovCiAgICAgIGdldEVmZmVjdGl2ZVRleHRDb250ZW50KCkgewogICAgICAgIGxldCBjbiA9IHRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICAgIGxldCB0YyA9IFtdOwogICAgICAgIGZvciAobGV0IGk9MCwgYzsgKGMgPSBjbltpXSk7IGkrKykgewogICAgICAgICAgaWYgKGMubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7CiAgICAgICAgICAgIHRjLnB1c2goYy50ZXh0Q29udGVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0Yy5qb2luKCcnKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGVmZmVjdGl2ZSBjaGlsZE5vZGUgd2l0aGluIHRoaXMgZWxlbWVudCB0aGF0CiAgICAgICAqIG1hdGNoIGBzZWxlY3RvcmAuIFRoZXNlIGNhbiBiZSBkb20gY2hpbGQgbm9kZXMgb3IgZWxlbWVudHMgZGlzdHJpYnV0ZWQKICAgICAgICogdG8gY2hpbGRyZW4gdGhhdCBhcmUgaW5zZXJ0aW9uIHBvaW50cy4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHJ1bi4KICAgICAgICogQHJldHVybiB7Tm9kZX0gRmlyc3QgZWZmZWN0aXZlIGNoaWxkIG5vZGUgdGhhdCBtYXRjaGVzIHNlbGVjdG9yLgogICAgICAgKi8KICAgICAgcXVlcnlFZmZlY3RpdmVDaGlsZHJlbihzZWxlY3RvcikgewogICAgICAgIGxldCBlJCA9IHRoaXMucXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHNlbGVjdG9yKTsKICAgICAgICByZXR1cm4gZSQgJiYgZSRbMF07CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBlZmZlY3RpdmUgY2hpbGROb2RlcyB3aXRoaW4gdGhpcyBlbGVtZW50IHRoYXQKICAgICAgICogbWF0Y2ggYHNlbGVjdG9yYC4gVGhlc2UgY2FuIGJlIGRvbSBjaGlsZCBub2RlcyBvciBlbGVtZW50cyBkaXN0cmlidXRlZAogICAgICAgKiB0byBjaGlsZHJlbiB0aGF0IGFyZSBpbnNlcnRpb24gcG9pbnRzLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgU2VsZWN0b3IgdG8gcnVuLgogICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IU5vZGU+fSBMaXN0IG9mIGVmZmVjdGl2ZSBjaGlsZCBub2RlcyB0aGF0IG1hdGNoIHNlbGVjdG9yLgogICAgICAgKi8KICAgICAgcXVlcnlBbGxFZmZlY3RpdmVDaGlsZHJlbihzZWxlY3RvcikgewogICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3Rvcik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBub2RlcyBkaXN0cmlidXRlZCB0byB0aGlzIGVsZW1lbnQncyBgPHNsb3Q+YC4KICAgICAgICoKICAgICAgICogSWYgdGhpcyBlbGVtZW50IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYDxzbG90PmAgaW4gaXRzIGxvY2FsIERPTSwKICAgICAgICogYW4gb3B0aW9uYWwgc2VsZWN0b3IgbWF5IGJlIHBhc3NlZCB0byBjaG9vc2UgdGhlIGRlc2lyZWQgY29udGVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBzbGN0ciBDU1Mgc2VsZWN0b3IgdG8gY2hvb3NlIHRoZSBkZXNpcmVkCiAgICAgICAqICAgYDxzbG90PmAuICBEZWZhdWx0cyB0byBgY29udGVudGAuCiAgICAgICAqIEByZXR1cm4geyFBcnJheTwhTm9kZT59IExpc3Qgb2YgZGlzdHJpYnV0ZWQgbm9kZXMgZm9yIHRoZSBgPHNsb3Q+YC4KICAgICAgICovCiAgICAgIGdldENvbnRlbnRDaGlsZE5vZGVzKHNsY3RyKSB7CiAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcihzbGN0ciB8fCAnc2xvdCcpOwogICAgICAgIHJldHVybiBjb250ZW50ID8gLyoqIEB0eXBlIHtQb2x5bWVyLkRvbUFwaX0gKi8oUG9seW1lci5kb20oY29udGVudCkpLmdldERpc3RyaWJ1dGVkTm9kZXMoKSA6IFtdOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZWxlbWVudCBjaGlsZHJlbiBkaXN0cmlidXRlZCB0byB0aGlzIGVsZW1lbnQncwogICAgICAgKiBgPHNsb3Q+YC4KICAgICAgICoKICAgICAgICogSWYgdGhpcyBlbGVtZW50IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYDxzbG90PmAgaW4gaXRzCiAgICAgICAqIGxvY2FsIERPTSwgYW4gb3B0aW9uYWwgc2VsZWN0b3IgbWF5IGJlIHBhc3NlZCB0byBjaG9vc2UgdGhlIGRlc2lyZWQKICAgICAgICogY29udGVudC4gIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBgZ2V0Q29udGVudENoaWxkTm9kZXNgIGluIHRoYXQgb25seQogICAgICAgKiBlbGVtZW50cyBhcmUgcmV0dXJuZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gc2xjdHIgQ1NTIHNlbGVjdG9yIHRvIGNob29zZSB0aGUgZGVzaXJlZAogICAgICAgKiAgIGA8Y29udGVudD5gLiAgRGVmYXVsdHMgdG8gYGNvbnRlbnRgLgogICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxFbGVtZW50Pn0gTGlzdCBvZiBkaXN0cmlidXRlZCBub2RlcyBmb3IgdGhlCiAgICAgICAqICAgYDxzbG90PmAuCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgZ2V0Q29udGVudENoaWxkcmVuKHNsY3RyKSB7CiAgICAgICAgbGV0IGNoaWxkcmVuID0gLyoqIEB0eXBlIHshQXJyYXk8IUhUTUxFbGVtZW50Pn0gKi8odGhpcy5nZXRDb250ZW50Q2hpbGROb2RlcyhzbGN0cikuZmlsdGVyKGZ1bmN0aW9uKG4pIHsKICAgICAgICAgIHJldHVybiAobi5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpOwogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gY2hpbGRyZW47CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDaGVja3Mgd2hldGhlciBhbiBlbGVtZW50IGlzIGluIHRoaXMgZWxlbWVudCdzIGxpZ2h0IERPTSB0cmVlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0gez9Ob2RlfSBub2RlIFRoZSBlbGVtZW50IHRvIGJlIGNoZWNrZWQuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgbm9kZSBpcyBpbiB0aGlzIGVsZW1lbnQncyBsaWdodCBET00gdHJlZS4KICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IExlZ2FjeUVsZW1lbnRNaXhpbiBtdXN0IGJlIGFwcGxpZWQgdG8gYW4gSFRNTEVsZW1lbnQKICAgICAgICovCiAgICAgIGlzTGlnaHREZXNjZW5kYW50KG5vZGUpIHsKICAgICAgICBjb25zdCB0aGlzTm9kZSA9IC8qKiBAdHlwZSB7Tm9kZX0gKi8gKHRoaXMpOwogICAgICAgIHJldHVybiB0aGlzTm9kZSAhPT0gbm9kZSAmJiB0aGlzTm9kZS5jb250YWlucyhub2RlKSAmJgogICAgICAgICAgdGhpc05vZGUuZ2V0Um9vdE5vZGUoKSA9PT0gbm9kZS5nZXRSb290Tm9kZSgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2hlY2tzIHdoZXRoZXIgYW4gZWxlbWVudCBpcyBpbiB0aGlzIGVsZW1lbnQncyBsb2NhbCBET00gdHJlZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshRWxlbWVudH0gbm9kZSBUaGUgZWxlbWVudCB0byBiZSBjaGVja2VkLgogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIG5vZGUgaXMgaW4gdGhpcyBlbGVtZW50J3MgbG9jYWwgRE9NIHRyZWUuCiAgICAgICAqLwogICAgICBpc0xvY2FsRGVzY2VuZGFudChub2RlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucm9vdCA9PT0gbm9kZS5nZXRSb290Tm9kZSgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogTm8tb3AgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBUaGlzIHNob3VsZCBub3cgYmUgaGFuZGxlZCBieQogICAgICAgKiBTaGFkeUNzcyBsaWJyYXJ5LgogICAgICAgKiBAcGFyYW0gIHsqfSBjb250YWluZXIgVW51c2VkCiAgICAgICAqIEBwYXJhbSAgeyp9IHNob3VsZE9ic2VydmUgVW51c2VkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzY29wZVN1YnRyZWUoY29udGFpbmVyLCBzaG91bGRPYnNlcnZlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGNvbXB1dGVkIHN0eWxlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBUaGUgY3NzIHByb3BlcnR5IG5hbWUuCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gUmV0dXJucyB0aGUgY29tcHV0ZWQgY3NzIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgZ2l2ZW4KICAgICAgICogYHByb3BlcnR5YC4KICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IExlZ2FjeUVsZW1lbnRNaXhpbiBtdXN0IGJlIGFwcGxpZWQgdG8gYW4gSFRNTEVsZW1lbnQKICAgICAgICovCiAgICAgIGdldENvbXB1dGVkU3R5bGVWYWx1ZShwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiBzdHlsZUludGVyZmFjZS5nZXRDb21wdXRlZFN0eWxlVmFsdWUoLyoqIEB0eXBlIHshRWxlbWVudH0gKi8odGhpcyksIHByb3BlcnR5KTsKICAgICAgfQoKICAgICAgLy8gZGVib3VuY2UKCiAgICAgIC8qKgogICAgICAgKiBDYWxsIGBkZWJvdW5jZWAgdG8gY29sbGFwc2UgbXVsdGlwbGUgcmVxdWVzdHMgZm9yIGEgbmFtZWQgdGFzayBpbnRvCiAgICAgICAqIG9uZSBpbnZvY2F0aW9uIHdoaWNoIGlzIG1hZGUgYWZ0ZXIgdGhlIHdhaXQgdGltZSBoYXMgZWxhcHNlZCB3aXRoCiAgICAgICAqIG5vIG5ldyByZXF1ZXN0LiAgSWYgbm8gd2FpdCB0aW1lIGlzIGdpdmVuLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQKICAgICAgICogYXQgbWljcm90YXNrIHRpbWluZyAoZ3VhcmFudGVlZCBiZWZvcmUgcGFpbnQpLgogICAgICAgKgogICAgICAgKiAgICAgZGVib3VuY2VkQ2xpY2tBY3Rpb24oZSkgewogICAgICAgKiAgICAgICAvLyB3aWxsIG5vdCBjYWxsIGBwcm9jZXNzQ2xpY2tgIG1vcmUgdGhhbiBvbmNlIHBlciAxMDBtcwogICAgICAgKiAgICAgICB0aGlzLmRlYm91bmNlKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgKiAgICAgICAgdGhpcy5wcm9jZXNzQ2xpY2soKTsKICAgICAgICogICAgICAgfSAxMDApOwogICAgICAgKiAgICAgfQogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gam9iTmFtZSBTdHJpbmcgdG8gaWRlbnRpZnkgdGhlIGRlYm91bmNlIGpvYi4KICAgICAgICogQHBhcmFtIHtmdW5jdGlvbigpOnZvaWR9IGNhbGxiYWNrIEZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkICh3aXRoIGB0aGlzYAogICAgICAgKiAgIGNvbnRleHQpIHdoZW4gdGhlIHdhaXQgdGltZSBlbGFwc2VzLgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBPcHRpb25hbCB3YWl0IHRpbWUgaW4gbWlsbGlzZWNvbmRzIChtcykgYWZ0ZXIgdGhlCiAgICAgICAqICAgbGFzdCBzaWduYWwgdGhhdCBtdXN0IGVsYXBzZSBiZWZvcmUgaW52b2tpbmcgYGNhbGxiYWNrYAogICAgICAgKiBAcmV0dXJuIHshT2JqZWN0fSBSZXR1cm5zIGEgZGVib3VuY2VyIG9iamVjdCBvbiB3aGljaCBleGlzdHMgdGhlCiAgICAgICAqIGZvbGxvd2luZyBtZXRob2RzOiBgaXNBY3RpdmUoKWAgcmV0dXJucyB0cnVlIGlmIHRoZSBkZWJvdW5jZXIgaXMKICAgICAgICogYWN0aXZlOyBgY2FuY2VsKClgIGNhbmNlbHMgdGhlIGRlYm91bmNlciBpZiBpdCBpcyBhY3RpdmU7CiAgICAgICAqIGBmbHVzaCgpYCBpbW1lZGlhdGVseSBpbnZva2VzIHRoZSBkZWJvdW5jZWQgY2FsbGJhY2sgaWYgdGhlIGRlYm91bmNlcgogICAgICAgKiBpcyBhY3RpdmUuCiAgICAgICAqLwogICAgICBkZWJvdW5jZShqb2JOYW1lLCBjYWxsYmFjaywgd2FpdCkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIHJldHVybiB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdID0gUG9seW1lci5EZWJvdW5jZXIuZGVib3VuY2UoCiAgICAgICAgICAgICAgdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXQogICAgICAgICAgICAsIHdhaXQgPiAwID8gUG9seW1lci5Bc3luYy50aW1lT3V0LmFmdGVyKHdhaXQpIDogUG9seW1lci5Bc3luYy5taWNyb1Rhc2sKICAgICAgICAgICAgLCBjYWxsYmFjay5iaW5kKHRoaXMpKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciBhIG5hbWVkIGRlYm91bmNlciBpcyBhY3RpdmUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBqb2JOYW1lIFRoZSBuYW1lIG9mIHRoZSBkZWJvdW5jZXIgc3RhcnRlZCB3aXRoIGBkZWJvdW5jZWAKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZGVib3VuY2VyIGlzIGFjdGl2ZSAoaGFzIG5vdCB5ZXQgZmlyZWQpLgogICAgICAgKi8KICAgICAgaXNEZWJvdW5jZXJBY3RpdmUoam9iTmFtZSkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIGxldCBkZWJvdW5jZXIgPSB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdOwogICAgICAgIHJldHVybiAhIShkZWJvdW5jZXIgJiYgZGVib3VuY2VyLmlzQWN0aXZlKCkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogSW1tZWRpYXRlbHkgY2FsbHMgdGhlIGRlYm91bmNlciBgY2FsbGJhY2tgIGFuZCBpbmFjdGl2YXRlcyBpdC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGpvYk5hbWUgVGhlIG5hbWUgb2YgdGhlIGRlYm91bmNlciBzdGFydGVkIHdpdGggYGRlYm91bmNlYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZmx1c2hEZWJvdW5jZXIoam9iTmFtZSkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIGxldCBkZWJvdW5jZXIgPSB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdOwogICAgICAgIGlmIChkZWJvdW5jZXIpIHsKICAgICAgICAgIGRlYm91bmNlci5mbHVzaCgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbmNlbHMgYW4gYWN0aXZlIGRlYm91bmNlci4gIFRoZSBgY2FsbGJhY2tgIHdpbGwgbm90IGJlIGNhbGxlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGpvYk5hbWUgVGhlIG5hbWUgb2YgdGhlIGRlYm91bmNlciBzdGFydGVkIHdpdGggYGRlYm91bmNlYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsRGVib3VuY2VyKGpvYk5hbWUpIHsKICAgICAgICB0aGlzLl9kZWJvdW5jZXJzID0gdGhpcy5fZGVib3VuY2VycyB8fCB7fTsKICAgICAgICBsZXQgZGVib3VuY2VyID0gdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXTsKICAgICAgICBpZiAoZGVib3VuY2VyKSB7CiAgICAgICAgICBkZWJvdW5jZXIuY2FuY2VsKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUnVucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGFzeW5jaHJvbm91c2x5LgogICAgICAgKgogICAgICAgKiBCeSBkZWZhdWx0IChpZiBubyB3YWl0VGltZSBpcyBzcGVjaWZpZWQpLCBhc3luYyBjYWxsYmFja3MgYXJlIHJ1biBhdAogICAgICAgKiBtaWNyb3Rhc2sgdGltaW5nLCB3aGljaCB3aWxsIG9jY3VyIGJlZm9yZSBwYWludC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshRnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBydW4sIGJvdW5kIHRvIGB0aGlzYC4KICAgICAgICogQHBhcmFtIHtudW1iZXI9fSB3YWl0VGltZSBUaW1lIHRvIHdhaXQgYmVmb3JlIGNhbGxpbmcgdGhlCiAgICAgICAqICAgYGNhbGxiYWNrYC4gIElmIHVuc3BlY2lmaWVkIG9yIDAsIHRoZSBjYWxsYmFjayB3aWxsIGJlIHJ1biBhdCBtaWNyb3Rhc2sKICAgICAgICogICB0aW1pbmcgKGJlZm9yZSBwYWludCkuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHRoYXQgbWF5IGJlIHVzZWQgdG8gY2FuY2VsIHRoZSBhc3luYyBqb2IuCiAgICAgICAqLwogICAgICBhc3luYyhjYWxsYmFjaywgd2FpdFRpbWUpIHsKICAgICAgICByZXR1cm4gd2FpdFRpbWUgPiAwID8gUG9seW1lci5Bc3luYy50aW1lT3V0LnJ1bihjYWxsYmFjay5iaW5kKHRoaXMpLCB3YWl0VGltZSkgOgogICAgICAgICAgICB+UG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKGNhbGxiYWNrLmJpbmQodGhpcykpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhbiBhc3luYyBvcGVyYXRpb24gc3RhcnRlZCB3aXRoIGBhc3luY2AuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gb3JpZ2luYWwgYGFzeW5jYCBjYWxsIHRvCiAgICAgICAqICAgY2FuY2VsLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsQXN5bmMoaGFuZGxlKSB7CiAgICAgICAgaGFuZGxlIDwgMCA/IFBvbHltZXIuQXN5bmMubWljcm9UYXNrLmNhbmNlbCh+aGFuZGxlKSA6CiAgICAgICAgICAgIFBvbHltZXIuQXN5bmMudGltZU91dC5jYW5jZWwoaGFuZGxlKTsKICAgICAgfQoKICAgICAgLy8gb3RoZXIKCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGVsZW1lbnQgYW5kIGNvbmZpZ3VyaW5nIGl0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIEhUTUwgZWxlbWVudCB0YWcgdG8gY3JlYXRlLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BzIE9iamVjdCBvZiBwcm9wZXJ0aWVzIHRvIGNvbmZpZ3VyZSBvbiB0aGUKICAgICAgICogICAgaW5zdGFuY2UuCiAgICAgICAqIEByZXR1cm4geyFFbGVtZW50fSBOZXdseSBjcmVhdGVkIGFuZCBjb25maWd1cmVkIGVsZW1lbnQuCiAgICAgICAqLwogICAgICBjcmVhdGUodGFnLCBwcm9wcykgewogICAgICAgIGxldCBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgICBpZiAoZWx0LnNldFByb3BlcnRpZXMpIHsKICAgICAgICAgICAgZWx0LnNldFByb3BlcnRpZXMocHJvcHMpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChsZXQgbiBpbiBwcm9wcykgewogICAgICAgICAgICAgIGVsdFtuXSA9IHByb3BzW25dOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBlbHQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGltcG9ydGluZyBhbiBIVE1MIGRvY3VtZW50IGltcGVyYXRpdmVseS4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBgPGxpbmsgcmVsPSJpbXBvcnQiPmAgZWxlbWVudCB3aXRoCiAgICAgICAqIHRoZSBwcm92aWRlZCBVUkwgYW5kIGFwcGVuZHMgaXQgdG8gdGhlIGRvY3VtZW50IHRvIHN0YXJ0IGxvYWRpbmcuCiAgICAgICAqIEluIHRoZSBgb25sb2FkYCBjYWxsYmFjaywgdGhlIGBpbXBvcnRgIHByb3BlcnR5IG9mIHRoZSBgbGlua2AKICAgICAgICogZWxlbWVudCB3aWxsIGNvbnRhaW4gdGhlIGltcG9ydGVkIGRvY3VtZW50IGNvbnRlbnRzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHJlZiBVUkwgdG8gZG9jdW1lbnQgdG8gbG9hZC4KICAgICAgICogQHBhcmFtIHs/ZnVuY3Rpb24oIUV2ZW50KTp2b2lkPX0gb25sb2FkIENhbGxiYWNrIHRvIG5vdGlmeSB3aGVuIGFuIGltcG9ydCBzdWNjZXNzZnVsbHkKICAgICAgICogICBsb2FkZWQuCiAgICAgICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFcnJvckV2ZW50KTp2b2lkPX0gb25lcnJvciBDYWxsYmFjayB0byBub3RpZnkgd2hlbiBhbiBpbXBvcnQKICAgICAgICogICB1bnN1Y2Nlc3NmdWxseSBsb2FkZWQuCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdEFzeW5jIFRydWUgaWYgdGhlIGltcG9ydCBzaG91bGQgYmUgbG9hZGVkIGBhc3luY2AuCiAgICAgICAqICAgRGVmYXVsdHMgdG8gYGZhbHNlYC4KICAgICAgICogQHJldHVybiB7IUhUTUxMaW5rRWxlbWVudH0gVGhlIGxpbmsgZWxlbWVudCBmb3IgdGhlIFVSTCB0byBiZSBsb2FkZWQuCiAgICAgICAqLwogICAgICBpbXBvcnRIcmVmKGhyZWYsIG9ubG9hZCwgb25lcnJvciwgb3B0QXN5bmMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgICAgIGxldCBsb2FkRm4gPSBvbmxvYWQgPyBvbmxvYWQuYmluZCh0aGlzKSA6IG51bGw7CiAgICAgICAgbGV0IGVycm9yRm4gPSBvbmVycm9yID8gb25lcnJvci5iaW5kKHRoaXMpIDogbnVsbDsKICAgICAgICByZXR1cm4gUG9seW1lci5pbXBvcnRIcmVmKGhyZWYsIGxvYWRGbiwgZXJyb3JGbiwgb3B0QXN5bmMpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUG9seWZpbGwgZm9yIEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMsIHdoaWNoIGlzIHNvbWV0aW1lcyBzdGlsbAogICAgICAgKiBwcmVmaXhlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHRlc3QuCiAgICAgICAqIEBwYXJhbSB7IUVsZW1lbnQ9fSBub2RlIEVsZW1lbnQgdG8gdGVzdCB0aGUgc2VsZWN0b3IgYWdhaW5zdC4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZWxlbWVudCBtYXRjaGVzIHRoZSBzZWxlY3Rvci4KICAgICAgICovCiAgICAgIGVsZW1lbnRNYXRjaGVzKHNlbGVjdG9yLCBub2RlKSB7CiAgICAgICAgcmV0dXJuIFBvbHltZXIuZG9tLm1hdGNoZXNTZWxlY3RvcigvKiogQHR5cGUgeyFFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKSwgc2VsZWN0b3IpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVG9nZ2xlcyBhbiBIVE1MIGF0dHJpYnV0ZSBvbiBvciBvZmYuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEhUTUwgYXR0cmlidXRlIG5hbWUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gYm9vbCBCb29sZWFuIHRvIGZvcmNlIHRoZSBhdHRyaWJ1dGUgb24gb3Igb2ZmLgogICAgICAgKiAgICBXaGVuIHVuc3BlY2lmaWVkLCB0aGUgc3RhdGUgb2YgdGhlIGF0dHJpYnV0ZSB3aWxsIGJlIHJldmVyc2VkLgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnQ9fSBub2RlIE5vZGUgdG8gdGFyZ2V0LiAgRGVmYXVsdHMgdG8gYHRoaXNgLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdG9nZ2xlQXR0cmlidXRlKG5hbWUsIGJvb2wsIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICBib29sID0gIW5vZGUuaGFzQXR0cmlidXRlKG5hbWUpOwogICAgICAgIH0KICAgICAgICBpZiAoYm9vbCkgewogICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgJycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgICAgICB9CiAgICAgIH0KCgogICAgICAvKioKICAgICAgICogVG9nZ2xlcyBhIENTUyBjbGFzcyBvbiBvciBvZmYuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENTUyBjbGFzcyBuYW1lCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGJvb2wgQm9vbGVhbiB0byBmb3JjZSB0aGUgY2xhc3Mgb24gb3Igb2ZmLgogICAgICAgKiAgICBXaGVuIHVuc3BlY2lmaWVkLCB0aGUgc3RhdGUgb2YgdGhlIGNsYXNzIHdpbGwgYmUgcmV2ZXJzZWQuCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG5vZGUgTm9kZSB0byB0YXJnZXQuICBEZWZhdWx0cyB0byBgdGhpc2AuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICB0b2dnbGVDbGFzcyhuYW1lLCBib29sLCBub2RlKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICAgICAgYm9vbCA9ICFub2RlLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKTsKICAgICAgICB9CiAgICAgICAgaWYgKGJvb2wpIHsKICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZChuYW1lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKG5hbWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENyb3NzLXBsYXRmb3JtIGhlbHBlciBmb3Igc2V0dGluZyBhbiBlbGVtZW50J3MgQ1NTIGB0cmFuc2Zvcm1gIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNmb3JtVGV4dCBUcmFuc2Zvcm0gc2V0dGluZy4KICAgICAgICogQHBhcmFtIHtFbGVtZW50PX0gbm9kZSBFbGVtZW50IHRvIGFwcGx5IHRoZSB0cmFuc2Zvcm0gdG8uCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdHJhbnNmb3JtKHRyYW5zZm9ybVRleHQsIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICBub2RlLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHRyYW5zZm9ybVRleHQ7CiAgICAgICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1UZXh0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3Jvc3MtcGxhdGZvcm0gaGVscGVyIGZvciBzZXR0aW5nIGFuIGVsZW1lbnQncyBDU1MgYHRyYW5zbGF0ZTNkYAogICAgICAgKiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHggWCBvZmZzZXQuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IFkgb2Zmc2V0LgogICAgICAgKiBAcGFyYW0ge251bWJlcn0geiBaIG9mZnNldC4KICAgICAgICogQHBhcmFtIHtFbGVtZW50PX0gbm9kZSBFbGVtZW50IHRvIGFwcGx5IHRoZSB0cmFuc2Zvcm0gdG8uCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHRyYW5zbGF0ZTNkKHgsIHksIHosIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICB0aGlzLnRyYW5zZm9ybSgndHJhbnNsYXRlM2QoJyArIHggKyAnLCcgKyB5ICsgJywnICsgeiArICcpJywgbm9kZSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSBhbiBhcnJheSwgaWYgaXQgZXhpc3RzLgogICAgICAgKgogICAgICAgKiBJZiB0aGUgYXJyYXkgaXMgc3BlY2lmaWVkIGJ5IHBhdGgsIGEgY2hhbmdlIG5vdGlmaWNhdGlvbiBpcwogICAgICAgKiBnZW5lcmF0ZWQsIHNvIHRoYXQgb2JzZXJ2ZXJzLCBkYXRhIGJpbmRpbmdzIGFuZCBjb21wdXRlZAogICAgICAgKiBwcm9wZXJ0aWVzIHdhdGNoaW5nIHRoYXQgcGF0aCBjYW4gdXBkYXRlLgogICAgICAgKgogICAgICAgKiBJZiB0aGUgYXJyYXkgaXMgcGFzc2VkIGRpcmVjdGx5LCAqKm5vIGNoYW5nZQogICAgICAgKiBub3RpZmljYXRpb24gaXMgZ2VuZXJhdGVkKiouCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PG51bWJlcnxzdHJpbmc+fSBhcnJheU9yUGF0aCBQYXRoIHRvIGFycmF5IGZyb20gd2hpY2ggdG8gcmVtb3ZlIHRoZSBpdGVtCiAgICAgICAqICAgKG9yIHRoZSBhcnJheSBpdHNlbGYpLgogICAgICAgKiBAcGFyYW0geyp9IGl0ZW0gSXRlbSB0byByZW1vdmUuCiAgICAgICAqIEByZXR1cm4ge0FycmF5fSBBcnJheSBjb250YWluaW5nIGl0ZW0gcmVtb3ZlZC4KICAgICAgICovCiAgICAgIGFycmF5RGVsZXRlKGFycmF5T3JQYXRoLCBpdGVtKSB7CiAgICAgICAgbGV0IGluZGV4OwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFycmF5T3JQYXRoKSkgewogICAgICAgICAgaW5kZXggPSBhcnJheU9yUGF0aC5pbmRleE9mKGl0ZW0pOwogICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5T3JQYXRoLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxldCBhcnIgPSBQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIGFycmF5T3JQYXRoKTsKICAgICAgICAgIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7CiAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zcGxpY2UoYXJyYXlPclBhdGgsIGluZGV4LCAxKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIC8vIGxvZ2dpbmcKCiAgICAgIC8qKgogICAgICAgKiBGYWNhZGVzIGBjb25zb2xlLmxvZ2AvYHdhcm5gL2BlcnJvcmAgYXMgb3ZlcnJpZGUgcG9pbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsZXZlbCBPbmUgb2YgJ2xvZycsICd3YXJuJywgJ2Vycm9yJwogICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIEFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB0byBsb2cKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9sb2dnZXIobGV2ZWwsIGFyZ3MpIHsKICAgICAgICAvLyBhY2NlcHQgWydmb28nLCAnYmFyJ10gYW5kIFtbJ2ZvbycsICdiYXInXV0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzKSAmJiBhcmdzLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KGFyZ3NbMF0pKSB7CiAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICB9CiAgICAgICAgc3dpdGNoKGxldmVsKSB7CiAgICAgICAgICBjYXNlICdsb2cnOgogICAgICAgICAgY2FzZSAnd2Fybic6CiAgICAgICAgICBjYXNlICdlcnJvcic6CiAgICAgICAgICAgIGNvbnNvbGVbbGV2ZWxdKC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZhY2FkZXMgYGNvbnNvbGUubG9nYCBhcyBhbiBvdmVycmlkZSBwb2ludC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHsuLi4qfSBhcmdzIEFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB0byBsb2cKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9sb2coLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignbG9nJywgYXJncyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGYWNhZGVzIGBjb25zb2xlLndhcm5gIGFzIGFuIG92ZXJyaWRlIHBvaW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHRvIGxvZwogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3dhcm4oLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignd2FybicsIGFyZ3MpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRmFjYWRlcyBgY29uc29sZS5lcnJvcmAgYXMgYW4gb3ZlcnJpZGUgcG9pbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgdG8gbG9nCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfZXJyb3IoLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignZXJyb3InLCBhcmdzKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZvcm1hdHMgYSBtZXNzYWdlIHVzaW5nIHRoZSBlbGVtZW50IHR5cGUgYW4gYSBtZXRob2QgbmFtZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUgdG8gYXNzb2NpYXRlIHdpdGggbWVzc2FnZQogICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHRvIGxvZwogICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgd2l0aCBmb3JtYXR0aW5nIGluZm9ybWF0aW9uIGZvciBgY29uc29sZWAKICAgICAgICogICBsb2dnaW5nLgogICAgICAgKi8KICAgICAgX2xvZ2YobWV0aG9kTmFtZSwgLi4uYXJncykgewogICAgICAgIHJldHVybiBbJ1slczo6JXNdJywgdGhpcy5pcywgbWV0aG9kTmFtZSwgLi4uYXJnc107CiAgICAgIH0KCiAgICB9CgogICAgTGVnYWN5RWxlbWVudC5wcm90b3R5cGUuaXMgPSAnJzsKCiAgICByZXR1cm4gTGVnYWN5RWxlbWVudDsKCiAgfSk7Cgp9KSgpOwoKCgogIChmdW5jdGlvbigpIHsKCiAgICAndXNlIHN0cmljdCc7CgogICAgY29uc3QgbGlmZWN5Y2xlUHJvcHMgPSB7CiAgICAgIGF0dGFjaGVkOiB0cnVlLAogICAgICBkZXRhY2hlZDogdHJ1ZSwKICAgICAgcmVhZHk6IHRydWUsCiAgICAgIGNyZWF0ZWQ6IHRydWUsCiAgICAgIGJlZm9yZVJlZ2lzdGVyOiB0cnVlLAogICAgICByZWdpc3RlcmVkOiB0cnVlLAogICAgICBhdHRyaWJ1dGVDaGFuZ2VkOiB0cnVlLAogICAgICBsaXN0ZW5lcnM6IHRydWUsCiAgICAgIGhvc3RBdHRyaWJ1dGVzOiB0cnVlCiAgICB9OwoKICAgIGNvbnN0IGV4Y2x1ZGVPbkluZm8gPSB7CiAgICAgIGF0dGFjaGVkOiB0cnVlLAogICAgICBkZXRhY2hlZDogdHJ1ZSwKICAgICAgcmVhZHk6IHRydWUsCiAgICAgIGNyZWF0ZWQ6IHRydWUsCiAgICAgIGJlZm9yZVJlZ2lzdGVyOiB0cnVlLAogICAgICByZWdpc3RlcmVkOiB0cnVlLAogICAgICBhdHRyaWJ1dGVDaGFuZ2VkOiB0cnVlLAogICAgICBiZWhhdmlvcnM6IHRydWUsCiAgICAgIF9ub0FjY2Vzc29yczogdHJ1ZQogICAgfTsKCiAgICBjb25zdCBleGNsdWRlT25CZWhhdmlvcnMgPSBPYmplY3QuYXNzaWduKHsKICAgICAgbGlzdGVuZXJzOiB0cnVlLAogICAgICBob3N0QXR0cmlidXRlczogdHJ1ZSwKICAgICAgcHJvcGVydGllczogdHJ1ZSwKICAgICAgb2JzZXJ2ZXJzOiB0cnVlLAogICAgfSwgZXhjbHVkZU9uSW5mbyk7CgogICAgZnVuY3Rpb24gY29weVByb3BlcnRpZXMoc291cmNlLCB0YXJnZXQsIGV4Y2x1ZGVQcm9wcykgewogICAgICBjb25zdCBub0FjY2Vzc29ycyA9IHNvdXJjZS5fbm9BY2Nlc3NvcnM7CiAgICAgIGZvciAobGV0IHAgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKCEocCBpbiBleGNsdWRlUHJvcHMpKSB7CiAgICAgICAgICBpZiAobm9BY2Nlc3NvcnMpIHsKICAgICAgICAgICAgdGFyZ2V0W3BdID0gc291cmNlW3BdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGV0IHBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHApOwogICAgICAgICAgICBpZiAocGQpIHsKICAgICAgICAgICAgICAvLyBlbnN1cmUgcHJvcGVydHkgaXMgY29uZmlndXJhYmxlIHNvIHRoYXQgYSBsYXRlciBiZWhhdmlvciBjYW4KICAgICAgICAgICAgICAvLyByZS1jb25maWd1cmUgaXQuCiAgICAgICAgICAgICAgcGQuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwLCBwZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEFwcGxpZXMgYSAibGVnYWN5IiBiZWhhdmlvciBvciBhcnJheSBvZiBiZWhhdmlvcnMgdG8gdGhlIHByb3ZpZGVkIGNsYXNzLgogICAgICoKICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIHdpbGwgYXV0b21hdGljYWxseSBhbHNvIGFwcGx5IHRoZSBgUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW5gCiAgICAgKiB0byBlbnN1cmUgdGhhdCBhbnkgbGVnYWN5IGJlaGF2aW9ycyBjYW4gcmVseSBvbiBsZWdhY3kgUG9seW1lciBBUEkgb24KICAgICAqIHRoZSB1bmRlcmx5aW5nIGVsZW1lbnQuCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7IU9iamVjdHwhQXJyYXk8IU9iamVjdD59IGJlaGF2aW9ycyBCZWhhdmlvciBvYmplY3Qgb3IgYXJyYXkgb2YgYmVoYXZpb3JzLgogICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6VCl9IGtsYXNzIEVsZW1lbnQgY2xhc3MuCiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6VCl9IFJldHVybnMgYSBuZXcgRWxlbWVudCBjbGFzcyBleHRlbmRlZCBieSB0aGUKICAgICAqIHBhc3NlZCBpbiBgYmVoYXZpb3JzYCBhbmQgYWxzbyBieSBgUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW5gLgogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzLCBjaGVja1R5cGVzfQogICAgICovCiAgICBmdW5jdGlvbiBtaXhpbkJlaGF2aW9ycyhiZWhhdmlvcnMsIGtsYXNzKSB7CiAgICAgIHJldHVybiBHZW5lcmF0ZUNsYXNzRnJvbUluZm8oe30sIFBvbHltZXIuTGVnYWN5RWxlbWVudE1peGluKGtsYXNzKSwgYmVoYXZpb3JzKTsKICAgIH0KCiAgICAvLyBOT1RFOgogICAgLy8gMS54CiAgICAvLyBCZWhhdmlvcnMgd2VyZSBtaXhlZCBpbiAqaW4gcmV2ZXJzZSBvcmRlciogYW5kIGRlLWR1cGVkIG9uIHRoZSBmbHkuCiAgICAvLyBUaGUgcnVsZSB3YXMgdGhhdCBiZWhhdmlvciBwcm9wZXJ0aWVzIHdlcmUgY29waWVkIG9udG8gdGhlIGVsZW1lbnQKICAgIC8vIHByb3RvdHlwZSBpZiBhbmQgb25seSBpZiB0aGUgcHJvcGVydHkgZGlkIG5vdCBhbHJlYWR5IGV4aXN0LgogICAgLy8gR2l2ZW46IFBvbHltZXJ7IGJlaGF2aW9yczogW0EsIEIsIEMsIEEsIEJdfSwgcHJvcGVydHkgY29weSBvcmRlciB3YXM6CiAgICAvLyAoMSksIEIsICgyKSwgQSwgKDMpIEMuIFRoaXMgbWVhbnMgcHJvdG90eXBlIHByb3BlcnRpZXMgd2luIG92ZXIKICAgIC8vIEIgcHJvcGVydGllcyB3aW4gb3ZlciBBIHdpbiBvdmVyIEMuIFRoaXMgbWlycm9ycyB3aGF0IHdvdWxkIGhhcHBlbgogICAgLy8gd2l0aCBpbmhlcml0YW5jZSBpZiBlbGVtZW50IGV4dGVuZGVkIEIgZXh0ZW5kZWQgQSBleHRlbmRlZCBDLgogICAgLy8KICAgIC8vIEFnYWluIGdpdmVuLCBQb2x5bWVyeyBiZWhhdmlvcnM6IFtBLCBCLCBDLCBBLCBCXX0sIHRoZSByZXN1bHRpbmcKICAgIC8vIGBiZWhhdmlvcnNgIGFycmF5IHdhcyBbQywgQSwgQl0uCiAgICAvLyBCZWhhdmlvciBsaWZlY3ljbGUgbWV0aG9kcyB3ZXJlIGNhbGxlZCBpbiBiZWhhdmlvciBhcnJheSBvcmRlcgogICAgLy8gZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnQsIGUuZy4gKDEpIEMuY3JlYXRlZCwgKDIpIEEuY3JlYXRlZCwKICAgIC8vICgzKSBCLmNyZWF0ZWQsICg0KSBlbGVtZW50LmNyZWF0ZWQuIFRoZXJlIHdhcyBubyBzdXBwb3J0IGZvcgogICAgLy8gc3VwZXIsIGFuZCAic3VwZXItYmVoYXZpb3IiIG1ldGhvZHMgd2VyZSBjYWxsYWJsZSBvbmx5IGJ5IG5hbWUpLgogICAgLy8KICAgIC8vIDIueAogICAgLy8gQmVoYXZpb3JzIGFyZSBtYWRlIGludG8gcHJvcGVyIG1peGlucyB3aGljaCBsaXZlIGluIHRoZQogICAgLy8gZWxlbWVudCdzIHByb3RvdHlwZSBjaGFpbi4gQmVoYXZpb3JzIGFyZSBwbGFjZWQgaW4gdGhlIGVsZW1lbnQgcHJvdG90eXBlCiAgICAvLyBlbGRlc3QgdG8geW91bmdlc3QgYW5kIGRlLWR1cGVkIHlvdW5nZXN0IHRvIG9sZGVzdDoKICAgIC8vIFNvLCBmaXJzdCBbQSwgQiwgQywgQSwgQl0gYmVjb21lcyBbQywgQSwgQl0gdGhlbiwKICAgIC8vIHRoZSBlbGVtZW50IHByb3RvdHlwZSBiZWNvbWVzIChvbGRlc3QpICgxKSBQb2x5bWVyLkVsZW1lbnQsICgyKSBjbGFzcyhDKSwKICAgIC8vICgzKSBjbGFzcyhBKSwgKDQpIGNsYXNzKEIpLCAoNSkgY2xhc3MoUG9seW1lcih7Li4ufSkpLgogICAgLy8gUmVzdWx0OgogICAgLy8gVGhpcyBtZWFucyBlbGVtZW50IHByb3BlcnRpZXMgd2luIG92ZXIgQiBwcm9wZXJ0aWVzIHdpbiBvdmVyIEEgd2luCiAgICAvLyBvdmVyIEMuIChzYW1lIGFzIDEueCkKICAgIC8vIElmIGxpZmVjeWNsZSBpcyBjYWxsZWQgKHN1cGVyIHRoZW4gbWUpLCBvcmRlciBpcwogICAgLy8gKDEpIEMuY3JlYXRlZCwgKDIpIEEuY3JlYXRlZCwgKDMpIEIuY3JlYXRlZCwgKDQpIGVsZW1lbnQuY3JlYXRlZAogICAgLy8gKGFnYWluIHNhbWUgYXMgMS54KQogICAgZnVuY3Rpb24gYXBwbHlCZWhhdmlvcnMocHJvdG8sIGJlaGF2aW9ycywgbGlmZWN5Y2xlKSB7CiAgICAgIGZvciAobGV0IGk9MDsgaTxiZWhhdmlvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBhcHBseUluZm8ocHJvdG8sIGJlaGF2aW9yc1tpXSwgbGlmZWN5Y2xlLCBleGNsdWRlT25CZWhhdmlvcnMpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYXBwbHlJbmZvKHByb3RvLCBpbmZvLCBsaWZlY3ljbGUsIGV4Y2x1ZGVQcm9wcykgewogICAgICBjb3B5UHJvcGVydGllcyhpbmZvLCBwcm90bywgZXhjbHVkZVByb3BzKTsKICAgICAgZm9yIChsZXQgcCBpbiBsaWZlY3ljbGVQcm9wcykgewogICAgICAgIGlmIChpbmZvW3BdKSB7CiAgICAgICAgICBsaWZlY3ljbGVbcF0gPSBsaWZlY3ljbGVbcF0gfHwgW107CiAgICAgICAgICBsaWZlY3ljbGVbcF0ucHVzaChpbmZvW3BdKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7QXJyYXl9IGJlaGF2aW9ycyBMaXN0IG9mIGJlaGF2aW9ycyB0byBmbGF0dGVuLgogICAgICogQHBhcmFtIHtBcnJheT19IGxpc3QgVGFyZ2V0IGxpc3QgdG8gZmxhdHRlbiBiZWhhdmlvcnMgaW50by4KICAgICAqIEBwYXJhbSB7QXJyYXk9fSBleGNsdWRlIExpc3Qgb2YgYmVoYXZpb3JzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgbGlzdC4KICAgICAqIEByZXR1cm4geyFBcnJheX0gUmV0dXJucyB0aGUgbGlzdCBvZiBmbGF0dGVuZWQgYmVoYXZpb3JzLgogICAgICovCiAgICBmdW5jdGlvbiBmbGF0dGVuQmVoYXZpb3JzKGJlaGF2aW9ycywgbGlzdCwgZXhjbHVkZSkgewogICAgICBsaXN0ID0gbGlzdCB8fCBbXTsKICAgICAgZm9yIChsZXQgaT1iZWhhdmlvcnMubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgbGV0IGIgPSBiZWhhdmlvcnNbaV07CiAgICAgICAgaWYgKGIpIHsKICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGIpKSB7CiAgICAgICAgICAgIGZsYXR0ZW5CZWhhdmlvcnMoYiwgbGlzdCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBkZWR1cAogICAgICAgICAgICBpZiAobGlzdC5pbmRleE9mKGIpIDwgMCAmJiAoIWV4Y2x1ZGUgfHwgZXhjbHVkZS5pbmRleE9mKGIpIDwgMCkpIHsKICAgICAgICAgICAgICBsaXN0LnVuc2hpZnQoYik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc29sZS53YXJuKCdiZWhhdmlvciBpcyBudWxsLCBjaGVjayBmb3IgbWlzc2luZyBvciA0MDQgaW1wb3J0Jyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBsaXN0OwogICAgfQoKICAgIC8qIE5vdGUgYWJvdXQgY29uc3RydWN0aW9uIGFuZCBleHRlbnNpb24gb2YgbGVnYWN5IGNsYXNzZXMuCiAgICAgIFtDaGFuZ2VkIGluIFE0IDIwMTggdG8gb3B0aW1pemUgcGVyZm9ybWFuY2UuXQoKICAgICAgV2hlbiBjYWxsaW5nIGBQb2x5bWVyYCBvciBgbWl4aW5CZWhhdmlvcnNgLCB0aGUgZ2VuZXJhdGVkIGNsYXNzIGJlbG93IGlzCiAgICAgIG1hZGUuIFRoZSBsaXN0IG9mIGJlaGF2aW9ycyB3YXMgcHJldmlvdXNseSBtYWRlIGludG8gb25lIGdlbmVyYXRlZCBjbGFzcyBwZXIKICAgICAgYmVoYXZpb3IsIGJ1dCB0aGlzIGlzIG5vIGxvbmdlciB0aGUgY2FzZSBhcyBiZWhhdmlvcnMgYXJlIG5vdyBjYWxsZWQKICAgICAgbWFudWFsbHkuIE5vdGUsIHRoZXJlIG1heSAqc3RpbGwqIGJlIG11bHRpcGxlIGdlbmVyYXRlZCBjbGFzc2VzIGluIHRoZQogICAgICBlbGVtZW50J3MgcHJvdG90eXBlIGNoYWluIGlmIGV4dGVuc2lvbiBpcyB1c2VkIHdpdGggYG1peGluQmVoYXZpb3JzYC4KCiAgICAgIFRoZSBnZW5lcmF0ZWQgY2xhc3MgaXMgZGlyZWN0bHkgdGllZCB0byB0aGUgaW5mbyBvYmplY3QgYW5kIGJlaGF2aW9ycwogICAgICB1c2VkIHRvIGNyZWF0ZSBpdC4gVGhhdCBsaXN0IG9mIGJlaGF2aW9ycyBpcyBmaWx0ZXJlZCBzbyBpdCdzIG9ubHkgdGhlCiAgICAgIGJlaGF2aW9ycyBub3QgYWN0aXZlIG9uIHRoZSBzdXBlcmNsYXNzLiBJbiBvcmRlciB0byBjYWxsIHRocm91Z2ggdG8gdGhlCiAgICAgIGVudGlyZSBsaXN0IG9mIGxpZmVjeWNsZSBtZXRob2RzLCBpdCdzIGltcG9ydGFudCB0byBjYWxsIGBzdXBlcmAuCgogICAgICBUaGUgZWxlbWVudCdzIGBwcm9wZXJ0aWVzYCBhbmQgYG9ic2VydmVyc2AgYXJlIGNvbnRyb2xsZWQgdmlhIHRoZSBmaW5hbGl6YXRpb24KICAgICAgbWVjaGFuaXNtIHByb3ZpZGVkIGJ5IGBQcm9wZXJ0aWVzTWl4aW5gLiBgUHJvcGVydGllc2AgYW5kIGBvYnNlcnZlcnNgIGFyZQogICAgICBjb2xsZWN0ZWQgYnkgbWFudWFsbHkgdHJhdmVyc2luZyB0aGUgcHJvdG90eXBlIGNoYWluIGFuZCBtZXJnaW5nLgoKICAgICAgVG8gbGltaXQgY2hhbmdlcywgdGhlIGBfcmVnaXN0ZXJlZGAgbWV0aG9kIGlzIGNhbGxlZCB2aWEgYF9pbml0aWFsaXplUHJvcGVydGllc2AKICAgICAgYW5kIG5vdCBgX2ZpbmFsaXplQ2xhc3NgLgogICAgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gUG9seW1lciBpbmZvIG9iamVjdAogICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6SFRNTEVsZW1lbnQpfSBCYXNlIGJhc2UgY2xhc3MgdG8gZXh0ZW5kIHdpdGggaW5mbyBvYmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBiZWhhdmlvcnMgYmVoYXZpb3JzIHRvIGNvcHkgaW50byB0aGUgZWxlbWVudAogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OkhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXN9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBHZW5lcmF0ZUNsYXNzRnJvbUluZm8oaW5mbywgQmFzZSwgYmVoYXZpb3JzKSB7CgogICAgICAvLyBtYW5hZ2VzIGJlaGF2aW9yIGFuZCBsaWZlY3ljbGUgcHJvY2Vzc2luZyAoZmlsbGVkIGluIGFmdGVyIGNsYXNzIGRlZmluaXRpb24pCiAgICAgIGxldCBiZWhhdmlvckxpc3Q7CiAgICAgIGNvbnN0IGxpZmVjeWNsZSA9IHt9OwoKICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgIGNsYXNzIFBvbHltZXJHZW5lcmF0ZWQgZXh0ZW5kcyBCYXNlIHsKCiAgICAgICAgLy8gZXhwbGljaXRseSBub3QgY2FsbGluZyBzdXBlci5fZmluYWxpemVDbGFzcwogICAgICAgIHN0YXRpYyBfZmluYWxpemVDbGFzcygpIHsKICAgICAgICAgIC8vIGlmIGNhbGxpbmcgdmlhIGEgc3ViY2xhc3MgdGhhdCBoYXNuJ3QgYmVlbiBnZW5lcmF0ZWQsIHBhc3MgdGhyb3VnaCB0byBzdXBlcgogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KHdpbmRvdy5KU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdnZW5lcmF0ZWRGcm9tJywgdGhpcykpKSB7CiAgICAgICAgICAgIHN1cGVyLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBpbnRlcmxlYXZlIHByb3BlcnRpZXMgYW5kIG9ic2VydmVycyBwZXIgYmVoYXZpb3IgYW5kIGBpbmZvYAogICAgICAgICAgICBpZiAoYmVoYXZpb3JMaXN0KSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBiOyBpIDwgYmVoYXZpb3JMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBiID0gYmVoYXZpb3JMaXN0W2ldOwogICAgICAgICAgICAgICAgaWYgKGIucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnRpZXMoYi5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChiLm9ic2VydmVycykgewogICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU9ic2VydmVycyhiLm9ic2VydmVycywgYi5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGluZm8ucHJvcGVydGllcykgewogICAgICAgICAgICAgIHRoaXMuY3JlYXRlUHJvcGVydGllcyhpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpbmZvLm9ic2VydmVycykgewogICAgICAgICAgICAgIHRoaXMuY3JlYXRlT2JzZXJ2ZXJzKGluZm8ub2JzZXJ2ZXJzLCBpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0byBwcmVwYXJlIHRoZSBlbGVtZW50IHRlbXBsYXRlCiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVUZW1wbGF0ZSgpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewogICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHt9OwogICAgICAgICAgaWYgKGJlaGF2aW9yTGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBiZWhhdmlvckxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMsIGJlaGF2aW9yTGlzdFtpXS5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzLCBpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7CiAgICAgICAgfQoKICAgICAgICBzdGF0aWMgZ2V0IG9ic2VydmVycygpIHsKICAgICAgICAgIGxldCBvYnNlcnZlcnMgPSBbXTsKICAgICAgICAgIGlmIChiZWhhdmlvckxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBiOyBpIDwgYmVoYXZpb3JMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgYiA9IGJlaGF2aW9yTGlzdFtpXTsKICAgICAgICAgICAgICBpZiAoYi5vYnNlcnZlcnMpIHsKICAgICAgICAgICAgICAgIG9ic2VydmVycyA9IG9ic2VydmVycy5jb25jYXQoYi5vYnNlcnZlcnMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGluZm8ub2JzZXJ2ZXJzKSB7CiAgICAgICAgICAgIG9ic2VydmVycyA9IG9ic2VydmVycy5jb25jYXQoaW5mby5vYnNlcnZlcnMpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG9ic2VydmVyczsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgY3JlYXRlZCgpIHsKICAgICAgICAgIHN1cGVyLmNyZWF0ZWQoKTsKICAgICAgICAgIGNvbnN0IGxpc3QgPSBsaWZlY3ljbGUuY3JlYXRlZDsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgX3JlZ2lzdGVyZWQoKSB7CiAgICAgICAgICAvKiBOT1RFOiBgYmVmb3JlUmVnaXN0ZXJgIGlzIGNhbGxlZCBoZXJlIGZvciBiYywgYnV0IHRoZSBiZWhhdmlvcgogICAgICAgICAgICBpcyBkaWZmZXJlbnQgdGhhbiBpbiAxLnguIEluIDEuMCwgdGhlIG1ldGhvZCB3YXMgY2FsbGVkICphZnRlcioKICAgICAgICAgICAgbWl4aW5nIHByb3RvdHlwZXMgdG9nZXRoZXIgYnV0ICpiZWZvcmUqIHByb2Nlc3Npbmcgb2YgbWV0YS1vYmplY3RzLgogICAgICAgICAgICBIb3dldmVyLCBkeW5hbWljIGVmZmVjdHMgY2FuIHN0aWxsIGJlIHNldCBoZXJlIGFuZCBjYW4gYmUgZG9uZSBlaXRoZXIKICAgICAgICAgICAgaW4gYGJlZm9yZVJlZ2lzdGVyYCBvciBgcmVnaXN0ZXJlZGAuIEl0IGlzIG5vIGxvbmdlciBwb3NzaWJsZSB0byBzZXQKICAgICAgICAgICAgYGlzYCBpbiBgYmVmb3JlUmVnaXN0ZXJgIGFzIHlvdSBjb3VsZCBpbiAxLnguCiAgICAgICAgICAqLwogICAgICAgICAgLy8gb25seSBwcm9jZWVkIGlmIHRoZSBnZW5lcmF0ZWQgY2xhc3MnIHByb3RvdHlwZSBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZC4KICAgICAgICAgIGNvbnN0IGdlbmVyYXRlZFByb3RvID0gUG9seW1lckdlbmVyYXRlZC5wcm90b3R5cGU7CiAgICAgICAgICBpZiAoIWdlbmVyYXRlZFByb3RvLmhhc093blByb3BlcnR5KCdfX2hhc1JlZ2lzdGVyRmluaXNoZWQnKSkgewogICAgICAgICAgICBnZW5lcmF0ZWRQcm90by5fX2hhc1JlZ2lzdGVyRmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAvLyBlbnN1cmUgc3VwZXJjbGFzcyBpcyByZWdpc3RlcmVkIGZpcnN0LgogICAgICAgICAgICBzdXBlci5fcmVnaXN0ZXJlZCgpOwogICAgICAgICAgICAvLyBjb3B5IHByb3BlcnRpZXMgb250byB0aGUgZ2VuZXJhdGVkIGNsYXNzIGxhemlseSBpZiB3ZSdyZSBvcHRpbWl6aW5nLAogICAgICAgICAgICBpZiAoUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zKSB7CiAgICAgICAgICAgICAgY29weVByb3BlcnRpZXNUb1Byb3RvKGdlbmVyYXRlZFByb3RvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBtYWtlIHN1cmUgbGVnYWN5IGxpZmVjeWNsZSBpcyBjYWxsZWQgb24gdGhlICplbGVtZW50KidzIHByb3RvdHlwZQogICAgICAgICAgICAvLyBhbmQgbm90IHRoZSBnZW5lcmF0ZWQgY2xhc3MgcHJvdG90eXBlOyBpZiB0aGUgZWxlbWVudCBoYXMgYmVlbgogICAgICAgICAgICAvLyBleHRlbmRlZCwgdGhlc2UgYXJlICpub3QqIHRoZSBzYW1lLgogICAgICAgICAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTsKICAgICAgICAgICAgbGV0IGxpc3QgPSBsaWZlY3ljbGUuYmVmb3JlUmVnaXN0ZXI7CiAgICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgbGlzdFtpXS5jYWxsKHByb3RvKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGlzdCA9IGxpZmVjeWNsZS5yZWdpc3RlcmVkOwogICAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGxpc3RbaV0uY2FsbChwcm90byk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9hcHBseUxpc3RlbmVycygpIHsKICAgICAgICAgIHN1cGVyLl9hcHBseUxpc3RlbmVycygpOwogICAgICAgICAgY29uc3QgbGlzdCA9IGxpZmVjeWNsZS5saXN0ZW5lcnM7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gbGlzdFtpXTsKICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBsIGluIGxpc3RlbmVycykgewogICAgICAgICAgICAgICAgICB0aGlzLl9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKHRoaXMsIGwsIGxpc3RlbmVyc1tsXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBub3RlOiBleGNlcHRpb24gdG8gInN1cGVyIHRoZW4gbWUiIHJ1bGU7CiAgICAgICAgLy8gZG8gd29yayBiZWZvcmUgY2FsbGluZyBzdXBlciBzbyB0aGF0IHN1cGVyIGF0dHJpYnV0ZXMKICAgICAgICAvLyBvbmx5IGFwcGx5IGlmIG5vdCBhbHJlYWR5IHNldC4KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9lbnN1cmVBdHRyaWJ1dGVzKCkgewogICAgICAgICAgY29uc3QgbGlzdCA9IGxpZmVjeWNsZS5ob3N0QXR0cmlidXRlczsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9bGlzdC5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICBjb25zdCBob3N0QXR0cmlidXRlcyA9IGxpc3RbaV07CiAgICAgICAgICAgICAgZm9yIChsZXQgYSBpbiBob3N0QXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgICB0aGlzLl9lbnN1cmVBdHRyaWJ1dGUoYSwgaG9zdEF0dHJpYnV0ZXNbYV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBzdXBlci5fZW5zdXJlQXR0cmlidXRlcygpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgICAgICBsZXQgbGlzdCA9IGxpZmVjeWNsZS5yZWFkeTsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgYXR0YWNoZWQoKSB7CiAgICAgICAgICBzdXBlci5hdHRhY2hlZCgpOwogICAgICAgICAgbGV0IGxpc3QgPSBsaWZlY3ljbGUuYXR0YWNoZWQ7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbGlzdFtpXS5jYWxsKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGRldGFjaGVkKCkgewogICAgICAgICAgc3VwZXIuZGV0YWNoZWQoKTsKICAgICAgICAgIGxldCBsaXN0ID0gbGlmZWN5Y2xlLmRldGFjaGVkOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGxpc3RbaV0uY2FsbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50cyBuYXRpdmUgQ3VzdG9tIEVsZW1lbnRzIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvCiAgICAgICAgICogc2V0IGFuIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIHByb3BlcnR5IHZpYSBgX2F0dHJpYnV0ZVRvUHJvcGVydHlgLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUgdGhhdCBjaGFuZ2VkCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgT2xkIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgTmV3IGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZChuYW1lLCBvbGQsIHZhbHVlKSB7CiAgICAgICAgICBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkKCk7CiAgICAgICAgICBsZXQgbGlzdCA9IGxpZmVjeWNsZS5hdHRyaWJ1dGVDaGFuZ2VkOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGxpc3RbaV0uY2FsbCh0aGlzLCBuYW1lLCBvbGQsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gYXBwbHkgYmVoYXZpb3JzLCBub3RlIGFjdHVhbCBjb3B5aW5nIGlzIGRvbmUgbGF6aWx5IGF0IGZpcnN0IGluc3RhbmNlIGNyZWF0aW9uCiAgICAgIGlmIChiZWhhdmlvcnMpIHsKICAgICAgICAvLyBOT1RFOiBlbnN1cmUgdGhlIGJlaGF2aW9yIGlzIGV4dGVuZGluZyBhIGNsYXNzIHdpdGgKICAgICAgICAvLyBsZWdhY3kgZWxlbWVudCBhcGkuIFRoaXMgaXMgbmVjZXNzYXJ5IHNpbmNlIGJlaGF2aW9ycyBleHBlY3QgdG8gYmUgYWJsZQogICAgICAgIC8vIHRvIGFjY2VzcyAxLnggbGVnYWN5IGFwaS4KICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYmVoYXZpb3JzKSkgewogICAgICAgICAgYmVoYXZpb3JzID0gW2JlaGF2aW9yc107CiAgICAgICAgfQogICAgICAgIGxldCBzdXBlckJlaGF2aW9ycyA9IEJhc2UucHJvdG90eXBlLmJlaGF2aW9yczsKICAgICAgICAvLyBnZXQgZmxhdHRlbmVkLCBkZWR1cGVkIGxpc3Qgb2YgYmVoYXZpb3JzICpub3QqIGFscmVhZHkgb24gc3VwZXIgY2xhc3MKICAgICAgICBiZWhhdmlvckxpc3QgPSBmbGF0dGVuQmVoYXZpb3JzKGJlaGF2aW9ycywgbnVsbCwgc3VwZXJCZWhhdmlvcnMpOwogICAgICAgIFBvbHltZXJHZW5lcmF0ZWQucHJvdG90eXBlLmJlaGF2aW9ycyA9IHN1cGVyQmVoYXZpb3JzID8KICAgICAgICAgIHN1cGVyQmVoYXZpb3JzLmNvbmNhdChiZWhhdmlvcnMpIDogYmVoYXZpb3JMaXN0OwogICAgICB9CgogICAgICBjb25zdCBjb3B5UHJvcGVydGllc1RvUHJvdG8gPSAocHJvdG8pID0+IHsKICAgICAgICBpZiAoYmVoYXZpb3JMaXN0KSB7CiAgICAgICAgICBhcHBseUJlaGF2aW9ycyhwcm90bywgYmVoYXZpb3JMaXN0LCBsaWZlY3ljbGUpOwogICAgICAgIH0KICAgICAgICBhcHBseUluZm8ocHJvdG8sIGluZm8sIGxpZmVjeWNsZSwgZXhjbHVkZU9uSW5mbyk7CiAgICAgIH07CgogICAgICAvLyBjb3B5IHByb3BlcnRpZXMgaWYgd2UncmUgbm90IG9wdGltaXppbmcKICAgICAgaWYgKCFQb2x5bWVyLmxlZ2FjeU9wdGltaXphdGlvbnMpIHsKICAgICAgICBjb3B5UHJvcGVydGllc1RvUHJvdG8oUG9seW1lckdlbmVyYXRlZC5wcm90b3R5cGUpOwogICAgICB9CgogICAgICBQb2x5bWVyR2VuZXJhdGVkLmdlbmVyYXRlZEZyb20gPSBpbmZvOwoKICAgICAgcmV0dXJuIFBvbHltZXJHZW5lcmF0ZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGV4dGVuZHMgYFBvbHltZXIuTGVnYWN5RWxlbWVudGAgYmFzZWQgb24gdGhlCiAgICAgKiBwcm92aWRlZCBpbmZvIG9iamVjdC4gIE1ldGFkYXRhIG9iamVjdHMgb24gdGhlIGBpbmZvYCBvYmplY3QKICAgICAqIChgcHJvcGVydGllc2AsIGBvYnNlcnZlcnNgLCBgbGlzdGVuZXJzYCwgYGJlaGF2aW9yc2AsIGBpc2ApIGFyZSB1c2VkCiAgICAgKiBmb3IgUG9seW1lcidzIG1ldGEtcHJvZ3JhbW1pbmcgc3lzdGVtcywgYW5kIGFueSBmdW5jdGlvbnMgYXJlIGNvcGllZAogICAgICogdG8gdGhlIGdlbmVyYXRlZCBjbGFzcy4KICAgICAqCiAgICAgKiBWYWxpZCAibWV0YWRhdGEiIHZhbHVlcyBhcmUgYXMgZm9sbG93czoKICAgICAqCiAgICAgKiBgaXNgOiBTdHJpbmcgcHJvdmlkaW5nIHRoZSB0YWcgbmFtZSB0byByZWdpc3RlciB0aGUgZWxlbWVudCB1bmRlci4gSW4KICAgICAqIGFkZGl0aW9uLCBpZiBhIGBkb20tbW9kdWxlYCB3aXRoIHRoZSBzYW1lIGlkIGV4aXN0cywgdGhlIGZpcnN0IHRlbXBsYXRlCiAgICAgKiBpbiB0aGF0IGBkb20tbW9kdWxlYCB3aWxsIGJlIHN0YW1wZWQgaW50byB0aGUgc2hhZG93IHJvb3Qgb2YgdGhpcyBlbGVtZW50LAogICAgICogd2l0aCBzdXBwb3J0IGZvciBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMgKGBvbi0uLi5gKSwgUG9seW1lciBkYXRhCiAgICAgKiBiaW5kaW5ncyAoYFtbLi4uXV1gIGFuZCBge3suLi59fWApLCBhbmQgaWQtYmFzZWQgbm9kZSBmaW5kaW5nIGludG8KICAgICAqIGB0aGlzLiRgLgogICAgICoKICAgICAqIGBwcm9wZXJ0aWVzYDogT2JqZWN0IGRlc2NyaWJpbmcgcHJvcGVydHktcmVsYXRlZCBtZXRhZGF0YSB1c2VkIGJ5IFBvbHltZXIKICAgICAqIGZlYXR1cmVzIChrZXk6IHByb3BlcnR5IG5hbWVzLCB2YWx1ZTogb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydHkgbWV0YWRhdGEpLgogICAgICogVmFsaWQga2V5cyBpbiBwZXItcHJvcGVydHkgbWV0YWRhdGEgaW5jbHVkZToKICAgICAqIC0gYHR5cGVgIChTdHJpbmd8TnVtYmVyfE9iamVjdHxBcnJheXwuLi4pOiBVc2VkIGJ5CiAgICAgKiAgIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvIGRldGVybWluZSBob3cgc3RyaW5nLWJhc2VkIGF0dHJpYnV0ZXMKICAgICAqICAgYXJlIGRlc2VyaWFsaXplZCB0byBKYXZhU2NyaXB0IHByb3BlcnR5IHZhbHVlcy4KICAgICAqIC0gYG5vdGlmeWAgKGJvb2xlYW4pOiBDYXVzZXMgYSBjaGFuZ2UgaW4gdGhlIHByb3BlcnR5IHRvIGZpcmUgYQogICAgICogICBub24tYnViYmxpbmcgZXZlbnQgY2FsbGVkIGA8cHJvcGVydHk+LWNoYW5nZWRgLiBFbGVtZW50cyB0aGF0IGhhdmUKICAgICAqICAgZW5hYmxlZCB0d28td2F5IGJpbmRpbmcgdG8gdGhlIHByb3BlcnR5IHVzZSB0aGlzIGV2ZW50IHRvIG9ic2VydmUgY2hhbmdlcy4KICAgICAqIC0gYHJlYWRPbmx5YCAoYm9vbGVhbik6IENyZWF0ZXMgYSBnZXR0ZXIgZm9yIHRoZSBwcm9wZXJ0eSwgYnV0IG5vIHNldHRlci4KICAgICAqICAgVG8gc2V0IGEgcmVhZC1vbmx5IHByb3BlcnR5LCB1c2UgdGhlIHByaXZhdGUgc2V0dGVyIG1ldGhvZAogICAgICogICBgX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSlgLgogICAgICogLSBgb2JzZXJ2ZXJgIChzdHJpbmcpOiBPYnNlcnZlciBtZXRob2QgbmFtZSB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4KICAgICAqICAgdGhlIHByb3BlcnR5IGNoYW5nZXMuIFRoZSBhcmd1bWVudHMgb2YgdGhlIG1ldGhvZCBhcmUKICAgICAqICAgYCh2YWx1ZSwgcHJldmlvdXNWYWx1ZSlgLgogICAgICogLSBgY29tcHV0ZWRgIChzdHJpbmcpOiBTdHJpbmcgZGVzY3JpYmluZyBtZXRob2QgYW5kIGRlcGVuZGVudCBwcm9wZXJ0aWVzCiAgICAgKiAgIGZvciBjb21wdXRpbmcgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgKGUuZy4gYCdjb21wdXRlRm9vKGJhciwgem90KSdgKS4KICAgICAqICAgQ29tcHV0ZWQgcHJvcGVydGllcyBhcmUgcmVhZC1vbmx5IGJ5IGRlZmF1bHQgYW5kIGNhbiBvbmx5IGJlIGNoYW5nZWQKICAgICAqICAgdmlhIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGNvbXB1dGluZyBtZXRob2QuCiAgICAgKgogICAgICogYG9ic2VydmVyc2A6IEFycmF5IG9mIHN0cmluZ3MgZGVzY3JpYmluZyBtdWx0aS1wcm9wZXJ0eSBvYnNlcnZlciBtZXRob2RzCiAgICAgKiAgYW5kIHRoZWlyIGRlcGVuZGVudCBwcm9wZXJ0aWVzIChlLmcuIGAnb2JzZXJ2ZUFCQyhhLCBiLCBjKSdgKS4KICAgICAqCiAgICAgKiBgbGlzdGVuZXJzYDogT2JqZWN0IGRlc2NyaWJpbmcgZXZlbnQgbGlzdGVuZXJzIHRvIGJlIGFkZGVkIHRvIGVhY2gKICAgICAqICBpbnN0YW5jZSBvZiB0aGlzIGVsZW1lbnQgKGtleTogZXZlbnQgbmFtZSwgdmFsdWU6IG1ldGhvZCBuYW1lKS4KICAgICAqCiAgICAgKiBgYmVoYXZpb3JzYDogQXJyYXkgb2YgYWRkaXRpb25hbCBgaW5mb2Agb2JqZWN0cyBjb250YWluaW5nIG1ldGFkYXRhCiAgICAgKiBhbmQgY2FsbGJhY2tzIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgYGluZm9gIG9iamVjdCBoZXJlIHdoaWNoIGFyZQogICAgICogbWVyZ2VkIGludG8gdGhpcyBlbGVtZW50LgogICAgICoKICAgICAqIGBob3N0QXR0cmlidXRlc2A6IE9iamVjdCBsaXN0aW5nIGF0dHJpYnV0ZXMgdG8gYmUgYXBwbGllZCB0byB0aGUgaG9zdAogICAgICogIG9uY2UgY3JlYXRlZCAoa2V5OiBhdHRyaWJ1dGUgbmFtZSwgdmFsdWU6IGF0dHJpYnV0ZSB2YWx1ZSkuICBWYWx1ZXMKICAgICAqICBhcmUgc2VyaWFsaXplZCBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0aGUgdmFsdWUuICBIb3N0IGF0dHJpYnV0ZXMgc2hvdWxkCiAgICAgKiAgZ2VuZXJhbGx5IGJlIGxpbWl0ZWQgdG8gYXR0cmlidXRlcyBzdWNoIGFzIGB0YWJJbmRleGAgYW5kIGBhcmlhLS4uLmAuCiAgICAgKiAgQXR0cmlidXRlcyBpbiBgaG9zdEF0dHJpYnV0ZXNgIGFyZSBvbmx5IGFwcGxpZWQgaWYgYSB1c2VyLXN1cHBsaWVkCiAgICAgKiAgYXR0cmlidXRlIGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgKGF0dHJpYnV0ZXMgaW4gbWFya3VwIG92ZXJyaWRlCiAgICAgKiAgYGhvc3RBdHRyaWJ1dGVzYCkuCiAgICAgKgogICAgICogSW4gYWRkaXRpb24sIHRoZSBmb2xsb3dpbmcgUG9seW1lci1zcGVjaWZpYyBjYWxsYmFja3MgbWF5IGJlIHByb3ZpZGVkOgogICAgICogLSBgcmVnaXN0ZXJlZGA6IGNhbGxlZCBhZnRlciBmaXJzdCBpbnN0YW5jZSBvZiB0aGlzIGVsZW1lbnQsCiAgICAgKiAtIGBjcmVhdGVkYDogY2FsbGVkIGR1cmluZyBgY29uc3RydWN0b3JgCiAgICAgKiAtIGBhdHRhY2hlZGA6IGNhbGxlZCBkdXJpbmcgYGNvbm5lY3RlZENhbGxiYWNrYAogICAgICogLSBgZGV0YWNoZWRgOiBjYWxsZWQgZHVyaW5nIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AKICAgICAqIC0gYHJlYWR5YDogY2FsbGVkIGJlZm9yZSBmaXJzdCBgYXR0YWNoZWRgLCBhZnRlciBhbGwgcHJvcGVydGllcyBvZgogICAgICogICB0aGlzIGVsZW1lbnQgaGF2ZSBiZWVuIHByb3BhZ2F0ZWQgdG8gaXRzIHRlbXBsYXRlIGFuZCBhbGwgb2JzZXJ2ZXJzCiAgICAgKiAgIGhhdmUgcnVuCiAgICAgKgogICAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gT2JqZWN0IGNvbnRhaW5pbmcgUG9seW1lciBtZXRhZGF0YSBhbmQgZnVuY3Rpb25zCiAgICAgKiAgIHRvIGJlY29tZSBjbGFzcyBtZXRob2RzLgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oVCk6VH0gbWl4aW4gT3B0aW9uYWwgbWl4aW4gdG8gYXBwbHkgdG8gbGVnYWN5IGJhc2UgY2xhc3MKICAgICAqICAgYmVmb3JlIGV4dGVuZGluZyB3aXRoIFBvbHltZXIgbWV0YXByb2dyYW1taW5nLgogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OkhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICovCiAgICBQb2x5bWVyLkNsYXNzID0gZnVuY3Rpb24oaW5mbywgbWl4aW4pIHsKICAgICAgaWYgKCFpbmZvKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdQb2x5bWVyLkNsYXNzIHJlcXVpcmVzIGBpbmZvYCBhcmd1bWVudCcpOwogICAgICB9CiAgICAgIGxldCBrbGFzcyA9IG1peGluID8gbWl4aW4oUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW4oSFRNTEVsZW1lbnQpKSA6CiAgICAgICAgICBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhpbihIVE1MRWxlbWVudCk7CiAgICAgIGtsYXNzID0gR2VuZXJhdGVDbGFzc0Zyb21JbmZvKGluZm8sIGtsYXNzLCBpbmZvLmJlaGF2aW9ycyk7CiAgICAgIGlmIChpbmZvLl9lbmFibGVEaXNhYmxlVXBncmFkZSkgewogICAgICAgIGtsYXNzID0gUG9seW1lci5EaXNhYmxlVXBncmFkZU1peGluKGtsYXNzKTsKICAgICAgfQogICAgICAvLyBkZWNvcmF0ZSBrbGFzcyB3aXRoIHJlZ2lzdHJhdGlvbiBpbmZvCiAgICAgIGtsYXNzLmlzID0ga2xhc3MucHJvdG90eXBlLmlzID0gaW5mby5pczsKICAgICAgcmV0dXJuIGtsYXNzOwogICAgfTsKCiAgICBQb2x5bWVyLm1peGluQmVoYXZpb3JzID0gbWl4aW5CZWhhdmlvcnM7CgogIH0pKCk7CgoKCgogIChmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvKioKICAgICAqIExlZ2FjeSBjbGFzcyBmYWN0b3J5IGFuZCByZWdpc3RyYXRpb24gaGVscGVyIGZvciBkZWZpbmluZyBQb2x5bWVyCiAgICAgKiBlbGVtZW50cy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvCiAgICAgKiBgY3VzdG9tRWxlbWVudHMuZGVmaW5lKGluZm8uaXMsIFBvbHltZXIuQ2xhc3MoaW5mbykpO2AKICAgICAqCiAgICAgKiBTZWUgYFBvbHltZXIuQ2xhc3NgIGZvciBkZXRhaWxzIG9uIHZhbGlkIGxlZ2FjeSBtZXRhZGF0YSBmb3JtYXQgZm9yIGBpbmZvYC4KICAgICAqCiAgICAgKiBAZ2xvYmFsCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEBmdW5jdGlvbiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFQb2x5bWVySW5pdH0gaW5mbyBPYmplY3QgY29udGFpbmluZyBQb2x5bWVyIG1ldGFkYXRhIGFuZCBmdW5jdGlvbnMKICAgICAqICAgdG8gYmVjb21lIGNsYXNzIG1ldGhvZHMuCiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6IEhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAc3VwcHJlc3Mge2R1cGxpY2F0ZSwgaW52YWxpZENhc3RzLCBjaGVja1R5cGVzfQogICAgICovCiAgICB3aW5kb3cuUG9seW1lci5fcG9seW1lckZuID0gZnVuY3Rpb24oaW5mbykgewogICAgICAvLyBpZiBpbnB1dCBpcyBhIGBjbGFzc2AgKGFrYSBhIGZ1bmN0aW9uIHdpdGggYSBwcm90b3R5cGUpLCB1c2UgdGhlIHByb3RvdHlwZQogICAgICAvLyByZW1lbWJlciB0aGF0IHRoZSBgY29uc3RydWN0b3JgIHdpbGwgbmV2ZXIgYmUgY2FsbGVkCiAgICAgIGxldCBrbGFzczsKICAgICAgaWYgKHR5cGVvZiBpbmZvID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAga2xhc3MgPSBpbmZvOwogICAgICB9IGVsc2UgewogICAgICAgIGtsYXNzID0gUG9seW1lci5DbGFzcyhpbmZvKTsKICAgICAgfQogICAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoa2xhc3MuaXMsIC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyhrbGFzcykpOwogICAgICByZXR1cm4ga2xhc3M7CiAgICB9OwoKICB9KSgpOwoKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvLyBDb21tb24gaW1wbGVtZW50YXRpb24gZm9yIG1peGluICYgYmVoYXZpb3IKICBmdW5jdGlvbiBtdXRhYmxlUHJvcGVydHlDaGFuZ2UoaW5zdCwgcHJvcGVydHksIHZhbHVlLCBvbGQsIG11dGFibGVEYXRhKSB7CiAgICBsZXQgaXNPYmplY3Q7CiAgICBpZiAobXV0YWJsZURhdGEpIHsKICAgICAgaXNPYmplY3QgPSAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCk7CiAgICAgIC8vIFB1bGwgYG9sZGAgZm9yIE9iamVjdHMgZnJvbSB0ZW1wIGNhY2hlLCBidXQgdHJlYXQgYG51bGxgIGFzIGEgcHJpbWl0aXZlCiAgICAgIGlmIChpc09iamVjdCkgewogICAgICAgIG9sZCA9IGluc3QuX19kYXRhVGVtcFtwcm9wZXJ0eV07CiAgICAgIH0KICAgIH0KICAgIC8vIFN0cmljdCBlcXVhbGl0eSBjaGVjaywgYnV0IHJldHVybiBmYWxzZSBmb3IgTmFOPT09TmFOCiAgICBsZXQgc2hvdWxkQ2hhbmdlID0gKG9sZCAhPT0gdmFsdWUgJiYgKG9sZCA9PT0gb2xkIHx8IHZhbHVlID09PSB2YWx1ZSkpOwogICAgLy8gT2JqZWN0cyBhcmUgc3RvcmVkIGluIHRlbXBvcmFyeSBjYWNoZSAoY2xlYXJlZCBhdCBlbmQgb2YKICAgIC8vIHR1cm4pLCB3aGljaCBpcyB1c2VkIGZvciBkaXJ0eS1jaGVja2luZwogICAgaWYgKGlzT2JqZWN0ICYmIHNob3VsZENoYW5nZSkgewogICAgICBpbnN0Ll9fZGF0YVRlbXBbcHJvcGVydHldID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gc2hvdWxkQ2hhbmdlOwogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0byBza2lwIHN0cmljdCBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzCiAgICogKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpLCBmb3IgdXNlIG9uIGVsZW1lbnRzIHV0aWxpemluZwogICAqIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AKICAgKgogICAqIEJ5IGRlZmF1bHQsIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgcGVyZm9ybXMgc3RyaWN0IGRpcnR5IGNoZWNraW5nIG9uCiAgICogb2JqZWN0cywgd2hpY2ggbWVhbnMgdGhhdCBhbnkgZGVlcCBtb2RpZmljYXRpb25zIHRvIGFuIG9iamVjdCBvciBhcnJheSB3aWxsCiAgICogbm90IGJlIHByb3BhZ2F0ZWQgdW5sZXNzICJpbW11dGFibGUiIGRhdGEgcGF0dGVybnMgYXJlIHVzZWQgKGkuZS4gYWxsIG9iamVjdAogICAqIHJlZmVyZW5jZXMgZnJvbSB0aGUgcm9vdCB0byB0aGUgbXV0YXRpb24gd2VyZSBjaGFuZ2VkKS4KICAgKgogICAqIFBvbHltZXIgYWxzbyBwcm92aWRlcyBhIHByb3ByaWV0YXJ5IGRhdGEgbXV0YXRpb24gYW5kIHBhdGggbm90aWZpY2F0aW9uIEFQSQogICAqIChlLmcuIGBub3RpZnlQYXRoYCwgYHNldGAsIGFuZCBhcnJheSBtdXRhdGlvbiBBUEkncykgdGhhdCBhbGxvdyBlZmZpY2llbnQKICAgKiBtdXRhdGlvbiBhbmQgbm90aWZpY2F0aW9uIG9mIGRlZXAgY2hhbmdlcyBpbiBhbiBvYmplY3QgZ3JhcGggdG8gYWxsIGVsZW1lbnRzCiAgICogYm91bmQgdG8gdGhlIHNhbWUgb2JqZWN0IGdyYXBoLgogICAqCiAgICogSW4gY2FzZXMgd2hlcmUgbmVpdGhlciBpbW11dGFibGUgcGF0dGVybnMgbm9yIHRoZSBkYXRhIG11dGF0aW9uIEFQSSBjYW4gYmUKICAgKiB1c2VkLCBhcHBseWluZyB0aGlzIG1peGluIHdpbGwgY2F1c2UgUG9seW1lciB0byBza2lwIGRpcnR5IGNoZWNraW5nIGZvcgogICAqIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUgImRpcnR5IikuICBUaGlzIGFsbG93cyBhCiAgICogdXNlciB0byBtYWtlIGEgZGVlcCBtb2RpZmljYXRpb24gdG8gYSBib3VuZCBvYmplY3QgZ3JhcGgsIGFuZCB0aGVuIGVpdGhlcgogICAqIHNpbXBseSByZS1zZXQgdGhlIG9iamVjdCAoZS5nLiBgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXNgKSBvciBjYWxsIGBub3RpZnlQYXRoYAogICAqIChlLmcuIGB0aGlzLm5vdGlmeVBhdGgoJ2l0ZW1zJylgKSB0byB1cGRhdGUgdGhlIHRyZWUuICBOb3RlIHRoYXQgYWxsCiAgICogZWxlbWVudHMgdGhhdCB3aXNoIHRvIGJlIHVwZGF0ZWQgYmFzZWQgb24gZGVlcCBtdXRhdGlvbnMgbXVzdCBhcHBseSB0aGlzCiAgICogbWl4aW4gb3Igb3RoZXJ3aXNlIHNraXAgc3RyaWN0IGRpcnR5IGNoZWNraW5nIGZvciBvYmplY3RzL2FycmF5cy4KICAgKiBTcGVjaWZpY2FsbHksIGFueSBlbGVtZW50cyBpbiB0aGUgYmluZGluZyB0cmVlIGJldHdlZW4gdGhlIHNvdXJjZSBvZiBhCiAgICogbXV0YXRpb24gYW5kIHRoZSBjb25zdW1wdGlvbiBvZiBpdCBtdXN0IGFwcGx5IHRoaXMgbWl4aW4gb3IgZW5hYmxlIHRoZQogICAqIGBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFgIG1peGluLgogICAqCiAgICogSW4gb3JkZXIgdG8gbWFrZSB0aGUgZGlydHkgY2hlY2sgc3RyYXRlZ3kgY29uZmlndXJhYmxlLCBzZWUKICAgKiBgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhYC4KICAgKgogICAqIE5vdGUsIHRoZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcHJvcGFnYXRpbmcgbGFyZ2Ugb2JqZWN0IGdyYXBocwogICAqIHdpbGwgYmUgd29yc2UgYXMgb3Bwb3NlZCB0byB1c2luZyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgd2l0aCBpbW11dGFibGUKICAgKiBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24gQVBJLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0byBza2lwIHN0cmljdCBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cwogICAqICAgYW5kIGFycmF5cwogICAqLwogIFBvbHltZXIuTXV0YWJsZURhdGEgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX011dGFibGVEYXRhfQogICAgICovCiAgICBjbGFzcyBNdXRhYmxlRGF0YSBleHRlbmRzIHN1cGVyQ2xhc3MgewogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgdG8gcHJvdmlkZSBvcHRpb24gZm9yIHNraXBwaW5nCiAgICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBwdWxscyB0aGUgdmFsdWUgdG8gZGlydHkgY2hlY2sgYWdhaW5zdCBmcm9tIHRoZSBgX19kYXRhVGVtcGAKICAgICAgICogY2FjaGUgKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAgICogY2FjaGUgaXMgY2xlYXJlZCBhdCB0aGUgZW5kIG9mIGEgdHVybiwgdGhpcyBpbXBsZW1lbnRhdGlvbiBhbGxvd3MKICAgICAgICogc2lkZS1lZmZlY3RzIG9mIGRlZXAgb2JqZWN0IGNoYW5nZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHJlLXNldHRpbmcgdGhlCiAgICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAgICogY3ljbGVzIGR1ZSB0byAyLXdheSBub3RpZmljYXRpb24pLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIE5ldyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgKiBAcGFyYW0geyp9IG9sZCBQcmV2aW91cyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgICByZXR1cm4gbXV0YWJsZVByb3BlcnR5Q2hhbmdlKHRoaXMsIHByb3BlcnR5LCB2YWx1ZSwgb2xkLCB0cnVlKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gTXV0YWJsZURhdGE7CgogIH0pOwoKCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0byBhZGQgdGhlIG9wdGlvbmFsIGFiaWxpdHkgdG8gc2tpcCBzdHJpY3QKICAgKiBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZQogICAqICJkaXJ0eSIpIGJ5IHNldHRpbmcgYSBgbXV0YWJsZS1kYXRhYCBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudCBpbnN0YW5jZS4KICAgKgogICAqIEJ5IGRlZmF1bHQsIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgcGVyZm9ybXMgc3RyaWN0IGRpcnR5IGNoZWNraW5nIG9uCiAgICogb2JqZWN0cywgd2hpY2ggbWVhbnMgdGhhdCBhbnkgZGVlcCBtb2RpZmljYXRpb25zIHRvIGFuIG9iamVjdCBvciBhcnJheSB3aWxsCiAgICogbm90IGJlIHByb3BhZ2F0ZWQgdW5sZXNzICJpbW11dGFibGUiIGRhdGEgcGF0dGVybnMgYXJlIHVzZWQgKGkuZS4gYWxsIG9iamVjdAogICAqIHJlZmVyZW5jZXMgZnJvbSB0aGUgcm9vdCB0byB0aGUgbXV0YXRpb24gd2VyZSBjaGFuZ2VkKS4KICAgKgogICAqIFBvbHltZXIgYWxzbyBwcm92aWRlcyBhIHByb3ByaWV0YXJ5IGRhdGEgbXV0YXRpb24gYW5kIHBhdGggbm90aWZpY2F0aW9uIEFQSQogICAqIChlLmcuIGBub3RpZnlQYXRoYCwgYHNldGAsIGFuZCBhcnJheSBtdXRhdGlvbiBBUEkncykgdGhhdCBhbGxvdyBlZmZpY2llbnQKICAgKiBtdXRhdGlvbiBhbmQgbm90aWZpY2F0aW9uIG9mIGRlZXAgY2hhbmdlcyBpbiBhbiBvYmplY3QgZ3JhcGggdG8gYWxsIGVsZW1lbnRzCiAgICogYm91bmQgdG8gdGhlIHNhbWUgb2JqZWN0IGdyYXBoLgogICAqCiAgICogSW4gY2FzZXMgd2hlcmUgbmVpdGhlciBpbW11dGFibGUgcGF0dGVybnMgbm9yIHRoZSBkYXRhIG11dGF0aW9uIEFQSSBjYW4gYmUKICAgKiB1c2VkLCBhcHBseWluZyB0aGlzIG1peGluIHdpbGwgYWxsb3cgUG9seW1lciB0byBza2lwIGRpcnR5IGNoZWNraW5nIGZvcgogICAqIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUgImRpcnR5IikuICBUaGlzIGFsbG93cyBhCiAgICogdXNlciB0byBtYWtlIGEgZGVlcCBtb2RpZmljYXRpb24gdG8gYSBib3VuZCBvYmplY3QgZ3JhcGgsIGFuZCB0aGVuIGVpdGhlcgogICAqIHNpbXBseSByZS1zZXQgdGhlIG9iamVjdCAoZS5nLiBgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXNgKSBvciBjYWxsIGBub3RpZnlQYXRoYAogICAqIChlLmcuIGB0aGlzLm5vdGlmeVBhdGgoJ2l0ZW1zJylgKSB0byB1cGRhdGUgdGhlIHRyZWUuICBOb3RlIHRoYXQgYWxsCiAgICogZWxlbWVudHMgdGhhdCB3aXNoIHRvIGJlIHVwZGF0ZWQgYmFzZWQgb24gZGVlcCBtdXRhdGlvbnMgbXVzdCBhcHBseSB0aGlzCiAgICogbWl4aW4gb3Igb3RoZXJ3aXNlIHNraXAgc3RyaWN0IGRpcnR5IGNoZWNraW5nIGZvciBvYmplY3RzL2FycmF5cy4KICAgKiBTcGVjaWZpY2FsbHksIGFueSBlbGVtZW50cyBpbiB0aGUgYmluZGluZyB0cmVlIGJldHdlZW4gdGhlIHNvdXJjZSBvZiBhCiAgICogbXV0YXRpb24gYW5kIHRoZSBjb25zdW1wdGlvbiBvZiBpdCBtdXN0IGVuYWJsZSB0aGlzIG1peGluIG9yIGFwcGx5IHRoZQogICAqIGBQb2x5bWVyLk11dGFibGVEYXRhYCBtaXhpbi4KICAgKgogICAqIFdoaWxlIHRoaXMgbWl4aW4gYWRkcyB0aGUgYWJpbGl0eSB0byBmb3JnbyBPYmplY3QvQXJyYXkgZGlydHkgY2hlY2tpbmcsCiAgICogdGhlIGBtdXRhYmxlRGF0YWAgZmxhZyBkZWZhdWx0cyB0byBmYWxzZSBhbmQgbXVzdCBiZSBzZXQgb24gdGhlIGluc3RhbmNlLgogICAqCiAgICogTm90ZSwgdGhlIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcyBvZiBwcm9wYWdhdGluZyBsYXJnZSBvYmplY3QgZ3JhcGhzCiAgICogd2lsbCBiZSB3b3JzZSBieSByZWx5aW5nIG9uIGBtdXRhYmxlRGF0YTogdHJ1ZWAgYXMgb3Bwb3NlZCB0byB1c2luZwogICAqIHN0cmljdCBkaXJ0eSBjaGVja2luZyB3aXRoIGltbXV0YWJsZSBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24KICAgKiBBUEkuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRvIG9wdGlvbmFsbHkgc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcKICAgKiAgIGZvciBvYmplY3RzIGFuZCBhcnJheXMKICAgKi8KICBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQHBvbHltZXIKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX09wdGlvbmFsTXV0YWJsZURhdGF9CiAgICAgKi8KICAgIGNsYXNzIE9wdGlvbmFsTXV0YWJsZURhdGEgZXh0ZW5kcyBzdXBlckNsYXNzIHsKCiAgICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBJbnN0YW5jZS1sZXZlbCBmbGFnIGZvciBjb25maWd1cmluZyB0aGUgZGlydHktY2hlY2tpbmcgc3RyYXRlZ3kKICAgICAgICAgICAqIGZvciB0aGlzIGVsZW1lbnQuICBXaGVuIHRydWUsIE9iamVjdHMgYW5kIEFycmF5cyB3aWxsIHNraXAgZGlydHkKICAgICAgICAgICAqIGNoZWNraW5nLCBvdGhlcndpc2Ugc3RyaWN0IGVxdWFsaXR5IGNoZWNraW5nIHdpbGwgYmUgdXNlZC4KICAgICAgICAgICAqLwogICAgICAgICAgbXV0YWJsZURhdGE6IEJvb2xlYW4KICAgICAgICB9OwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgdG8gcHJvdmlkZSBvcHRpb24gZm9yIHNraXBwaW5nCiAgICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICAgKgogICAgICAgKiBXaGVuIGB0aGlzLm11dGFibGVEYXRhYCBpcyB0cnVlIG9uIHRoaXMgaW5zdGFuY2UsIHRoaXMgbWV0aG9kCiAgICAgICAqIHB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYCBjYWNoZQogICAgICAgKiAocmF0aGVyIHRoYW4gdGhlIG5vcm1hbCBgX19kYXRhYCBjYWNoZSkgZm9yIE9iamVjdHMuICBTaW5jZSB0aGUgdGVtcAogICAgICAgKiBjYWNoZSBpcyBjbGVhcmVkIGF0IHRoZSBlbmQgb2YgYSB0dXJuLCB0aGlzIGltcGxlbWVudGF0aW9uIGFsbG93cwogICAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAgICogc2FtZSBvYmplY3QgKHVzaW5nIHRoZSB0ZW1wIGNhY2hlIGFzIGFuIGluLXR1cm4gYmFja3N0b3AgdG8gcHJldmVudAogICAgICAgKiBjeWNsZXMgZHVlIHRvIDItd2F5IG5vdGlmaWNhdGlvbikuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgTmV3IHByb3BlcnR5IHZhbHVlCiAgICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBjb25zaWRlcmVkIGEgY2hhbmdlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCkgewogICAgICAgIHJldHVybiBtdXRhYmxlUHJvcGVydHlDaGFuZ2UodGhpcywgcHJvcGVydHksIHZhbHVlLCBvbGQsIHRoaXMubXV0YWJsZURhdGEpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIE9wdGlvbmFsTXV0YWJsZURhdGE7CgogIH0pOwoKICAvLyBFeHBvcnQgZm9yIHVzZSBieSBsZWdhY3kgYmVoYXZpb3IKICBQb2x5bWVyLk11dGFibGVEYXRhLl9tdXRhYmxlUHJvcGVydHlDaGFuZ2UgPSBtdXRhYmxlUHJvcGVydHlDaGFuZ2U7Cgp9KSgpOwoKCiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEJhc2UgY2xhc3MgZm9yIEhUTUxUZW1wbGF0ZUVsZW1lbnQgZXh0ZW5zaW9uIHRoYXQgaGFzIHByb3BlcnR5IGVmZmVjdHMKICAgIC8vIG1hY2hpbmVyeSBmb3IgcHJvcGFnYXRpbmcgaG9zdCBwcm9wZXJ0aWVzIHRvIGNoaWxkcmVuLiBUaGlzIGlzIGFuIEVTNQogICAgLy8gY2xhc3Mgb25seSBiZWNhdXNlIEJhYmVsIChpbmNvcnJlY3RseSkgcmVxdWlyZXMgc3VwZXIoKSBpbiB0aGUgY2xhc3MKICAgIC8vIGNvbnN0cnVjdG9yIGV2ZW4gdGhvdWdoIG5vIGB0aGlzYCBpcyB1c2VkIGFuZCBpdCByZXR1cm5zIGFuIGluc3RhbmNlLgogICAgbGV0IG5ld0luc3RhbmNlID0gbnVsbDsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge0hUTUxUZW1wbGF0ZUVsZW1lbnR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBIVE1MVGVtcGxhdGVFbGVtZW50RXh0ZW5zaW9uKCkgeyByZXR1cm4gbmV3SW5zdGFuY2U7IH0KICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnRFeHRlbnNpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShIVE1MVGVtcGxhdGVFbGVtZW50LnByb3RvdHlwZSwgewogICAgICBjb25zdHJ1Y3RvcjogewogICAgICAgIHZhbHVlOiBIVE1MVGVtcGxhdGVFbGVtZW50RXh0ZW5zaW9uLAogICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgIH0KICAgIH0pOwoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgKiBAZXh0ZW5kcyB7SFRNTFRlbXBsYXRlRWxlbWVudEV4dGVuc2lvbn0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IERhdGFUZW1wbGF0ZSA9IFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKEhUTUxUZW1wbGF0ZUVsZW1lbnRFeHRlbnNpb24pOwoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9NdXRhYmxlRGF0YX0KICAgICAqIEBleHRlbmRzIHtEYXRhVGVtcGxhdGV9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBNdXRhYmxlRGF0YVRlbXBsYXRlID0gUG9seW1lci5NdXRhYmxlRGF0YShEYXRhVGVtcGxhdGUpOwoKICAgIC8vIEFwcGxpZXMgYSBEYXRhVGVtcGxhdGUgc3ViY2xhc3MgdG8gYSA8dGVtcGxhdGU+IGluc3RhbmNlCiAgICBmdW5jdGlvbiB1cGdyYWRlVGVtcGxhdGUodGVtcGxhdGUsIGNvbnN0cnVjdG9yKSB7CiAgICAgIG5ld0luc3RhbmNlID0gdGVtcGxhdGU7CiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0ZW1wbGF0ZSwgY29uc3RydWN0b3IucHJvdG90eXBlKTsKICAgICAgbmV3IGNvbnN0cnVjdG9yKCk7CiAgICAgIG5ld0luc3RhbmNlID0gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIEJhc2UgY2xhc3MgZm9yIFRlbXBsYXRlSW5zdGFuY2UuCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IGJhc2UgPSBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cyhjbGFzcyB7fSk7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQGN1c3RvbUVsZW1lbnQKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHMKICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAqLwogICAgY2xhc3MgVGVtcGxhdGVJbnN0YW5jZUJhc2UgZXh0ZW5kcyBiYXNlIHsKICAgICAgY29uc3RydWN0b3IocHJvcHMpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX2NvbmZpZ3VyZVByb3BlcnRpZXMocHJvcHMpOwogICAgICAgIHRoaXMucm9vdCA9IHRoaXMuX3N0YW1wVGVtcGxhdGUodGhpcy5fX2RhdGFIb3N0KTsKICAgICAgICAvLyBTYXZlIGxpc3Qgb2Ygc3RhbXBlZCBjaGlsZHJlbgogICAgICAgIGxldCBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4gPSBbXTsKICAgICAgICBmb3IgKGxldCBuID0gdGhpcy5yb290LmZpcnN0Q2hpbGQ7IG47IG49bi5uZXh0U2libGluZykgewogICAgICAgICAgY2hpbGRyZW4ucHVzaChuKTsKICAgICAgICAgIG4uX190ZW1wbGF0aXplSW5zdGFuY2UgPSB0aGlzOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fX3RlbXBsYXRpemVPd25lciAmJgogICAgICAgICAgdGhpcy5fX3RlbXBsYXRpemVPd25lci5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18pIHsKICAgICAgICAgIHRoaXMuX3Nob3dIaWRlQ2hpbGRyZW4odHJ1ZSk7CiAgICAgICAgfQogICAgICAgIC8vIEZsdXNoIHByb3BzIG9ubHkgd2hlbiBwcm9wcyBhcmUgcGFzc2VkIGlmIGluc3RhbmNlIHByb3BzIGV4aXN0CiAgICAgICAgLy8gb3Igd2hlbiB0aGVyZSBpc24ndCBpbnN0YW5jZSBwcm9wcy4KICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMuX190ZW1wbGF0aXplT3B0aW9uczsKICAgICAgICBpZiAoKHByb3BzICYmIG9wdGlvbnMuaW5zdGFuY2VQcm9wcykgfHwgIW9wdGlvbnMuaW5zdGFuY2VQcm9wcykgewogICAgICAgICAgdGhpcy5fZW5hYmxlUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogQ29uZmlndXJlIHRoZSBnaXZlbiBgcHJvcHNgIGJ5IGNhbGxpbmcgYF9zZXRQZW5kaW5nUHJvcGVydHlgLiBBbHNvCiAgICAgICAqIHNldHMgYW55IHByb3BlcnRpZXMgc3RvcmVkIGluIGBfX2hvc3RQcm9wc2AuCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBPYmplY3Qgb2YgcHJvcGVydHkgbmFtZS12YWx1ZSBwYWlycyB0byBzZXQuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfY29uZmlndXJlUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5fX3RlbXBsYXRpemVPcHRpb25zOwogICAgICAgIGlmIChvcHRpb25zLmZvcndhcmRIb3N0UHJvcCkgewogICAgICAgICAgZm9yIChsZXQgaHByb3AgaW4gdGhpcy5fX2hvc3RQcm9wcykgewogICAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoaHByb3AsIHRoaXMuX19kYXRhSG9zdFsnX2hvc3RfJyArIGhwcm9wXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIEFueSBpbnN0YW5jZSBwcm9wcyBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIHdpbGwgb3ZlcndyaXRlIGhvc3QgcHJvcHM7CiAgICAgICAgLy8gbm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBhIHVzZXIgZXJyb3IgYnV0IHdlIGRvbid0IHNwZWNpZmljYWxseSBmaWx0ZXIgdGhlbQogICAgICAgIGZvciAobGV0IGlwcm9wIGluIHByb3BzKSB7CiAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoaXByb3AsIHByb3BzW2lwcm9wXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBGb3J3YXJkcyBhIGhvc3QgcHJvcGVydHkgdG8gdGhpcyBpbnN0YW5jZS4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZQogICAgICAgKiBjYWxsZWQgb24gaW5zdGFuY2VzIGZyb20gdGhlIGBvcHRpb25zLmZvcndhcmRIb3N0UHJvcGAgY2FsbGJhY2sKICAgICAgICogdG8gcHJvcGFnYXRlIGNoYW5nZXMgb2YgaG9zdCBwcm9wZXJ0aWVzIHRvIGVhY2ggaW5zdGFuY2UuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgZW5xdWV1ZXMgdGhlIGNoYW5nZSwgd2hpY2ggYXJlIGZsdXNoZWQgYXMgYSBiYXRjaC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgb3IgcGF0aCBuYW1lCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgb2YgdGhlIHByb3BlcnR5IHRvIGZvcndhcmQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGZvcndhcmRIb3N0UHJvcChwcm9wLCB2YWx1ZSkgewogICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocHJvcCwgdmFsdWUsIGZhbHNlLCB0cnVlKSkgewogICAgICAgICAgdGhpcy5fX2RhdGFIb3N0Ll9lbnF1ZXVlQ2xpZW50KHRoaXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlIHBvaW50IGZvciBhZGRpbmcgY3VzdG9tIG9yIHNpbXVsYXRlZCBldmVudCBoYW5kbGluZy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBldmVudCBsaXN0ZW5lciB0bwogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQKICAgICAgICogQHBhcmFtIHtmdW5jdGlvbighRXZlbnQpOnZvaWR9IGhhbmRsZXIgTGlzdGVuZXIgZnVuY3Rpb24gdG8gYWRkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICBpZiAodGhpcy5fbWV0aG9kSG9zdCAmJiB0aGlzLl9fdGVtcGxhdGl6ZU9wdGlvbnMucGFyZW50TW9kZWwpIHsKICAgICAgICAgIC8vIElmIHRoaXMgaW5zdGFuY2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBwYXJlbnQgbW9kZWwsIGRlY29yYXRlCiAgICAgICAgICAvLyBldmVudHMgdGhpcyB0ZW1wbGF0ZSBpbnN0YW5jZSBhcyBgbW9kZWxgCiAgICAgICAgICB0aGlzLl9tZXRob2RIb3N0Ll9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgKGUpID0+IHsKICAgICAgICAgICAgZS5tb2RlbCA9IHRoaXM7CiAgICAgICAgICAgIGhhbmRsZXIoZSk7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gT3RoZXJ3aXNlIGRlbGVnYXRlIHRvIHRoZSB0ZW1wbGF0ZSdzIGhvc3QgKHdoaWNoIGNvdWxkIGJlKQogICAgICAgICAgLy8gYW5vdGhlciB0ZW1wbGF0ZSBpbnN0YW5jZQogICAgICAgICAgbGV0IHRlbXBsYXRlSG9zdCA9IHRoaXMuX19kYXRhSG9zdC5fX2RhdGFIb3N0OwogICAgICAgICAgaWYgKHRlbXBsYXRlSG9zdCkgewogICAgICAgICAgICB0ZW1wbGF0ZUhvc3QuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFNob3dzIG9yIGhpZGVzIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSB0b3AgbGV2ZWwgY2hpbGQgZWxlbWVudHMuIEZvcgogICAgICAgKiB0ZXh0IG5vZGVzLCBgdGV4dENvbnRlbnRgIGlzIHJlbW92ZWQgd2hpbGUgImhpZGRlbiIgYW5kIHJlcGxhY2VkIHdoZW4KICAgICAgICogInNob3duLiIKICAgICAgICogQHBhcmFtIHtib29sZWFufSBoaWRlIFNldCB0byB0cnVlIHRvIGhpZGUgdGhlIGNoaWxkcmVuOwogICAgICAgKiBzZXQgdG8gZmFsc2UgdG8gc2hvdyB0aGVtLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2hvd0hpZGVDaGlsZHJlbihoaWRlKSB7CiAgICAgICAgbGV0IGMgPSB0aGlzLmNoaWxkcmVuOwogICAgICAgIGZvciAobGV0IGk9MDsgaTxjLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgbiA9IGNbaV07CiAgICAgICAgICAvLyBJZ25vcmUgbm9uLWNoYW5nZXMKICAgICAgICAgIGlmIChCb29sZWFuKGhpZGUpICE9IEJvb2xlYW4obi5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18pKSB7CiAgICAgICAgICAgIGlmIChuLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgICAgIGlmIChoaWRlKSB7CiAgICAgICAgICAgICAgICBuLl9fcG9seW1lclRleHRDb250ZW50X18gPSBuLnRleHRDb250ZW50OwogICAgICAgICAgICAgICAgbi50ZXh0Q29udGVudCA9ICcnOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBuLnRleHRDb250ZW50ID0gbi5fX3BvbHltZXJUZXh0Q29udGVudF9fOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gcmVtb3ZlIGFuZCByZXBsYWNlIHNsb3QKICAgICAgICAgICAgfSBlbHNlIGlmIChuLmxvY2FsTmFtZSA9PT0gJ3Nsb3QnKSB7CiAgICAgICAgICAgICAgaWYgKGhpZGUpIHsKICAgICAgICAgICAgICAgIG4uX19wb2x5bWVyUmVwbGFjZWRfXyA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJ2hpZGRlbi1zbG90Jyk7CiAgICAgICAgICAgICAgICBuLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG4uX19wb2x5bWVyUmVwbGFjZWRfXywgbik7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2UgPSBuLl9fcG9seW1lclJlcGxhY2VkX187CiAgICAgICAgICAgICAgICBpZiAocmVwbGFjZSkgewogICAgICAgICAgICAgICAgICByZXBsYWNlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG4sIHJlcGxhY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZWxzZSBpZiAobi5zdHlsZSkgewogICAgICAgICAgICAgIGlmIChoaWRlKSB7CiAgICAgICAgICAgICAgICBuLl9fcG9seW1lckRpc3BsYXlfXyA9IG4uc3R5bGUuZGlzcGxheTsKICAgICAgICAgICAgICAgIG4uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbi5zdHlsZS5kaXNwbGF5ID0gbi5fX3BvbHltZXJEaXNwbGF5X187CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBuLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXyA9IGhpZGU7CiAgICAgICAgICBpZiAobi5fc2hvd0hpZGVDaGlsZHJlbikgewogICAgICAgICAgICBuLl9zaG93SGlkZUNoaWxkcmVuKGhpZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGRlZmF1bHQgcHJvcGVydHktZWZmZWN0cyBpbXBsZW1lbnRhdGlvbiB0byBpbnRlcmNlcHQKICAgICAgICogdGV4dENvbnRlbnQgYmluZGluZ3Mgd2hpbGUgY2hpbGRyZW4gYXJlICJoaWRkZW4iIGFuZCBjYWNoZSBpbgogICAgICAgKiBwcml2YXRlIHN0b3JhZ2UgZm9yIGxhdGVyIHJldHJpZXZhbC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBUaGUgbm9kZSB0byBzZXQgYSBwcm9wZXJ0eSBvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBUaGUgcHJvcGVydHkgdG8gc2V0CiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUobm9kZSwgcHJvcCwgdmFsdWUpIHsKICAgICAgICBpZiAobm9kZS5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18gJiYKICAgICAgICAgICAgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBwcm9wID09ICd0ZXh0Q29udGVudCcpIHsKICAgICAgICAgIG5vZGUuX19wb2x5bWVyVGV4dENvbnRlbnRfXyA9IHZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdXBlci5fc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUobm9kZSwgcHJvcCwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogRmluZCB0aGUgcGFyZW50IG1vZGVsIG9mIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuICBUaGUgcGFyZW50IG1vZGVsCiAgICAgICAqIGlzIGVpdGhlciBhbm90aGVyIHRlbXBsYXRpemUgaW5zdGFuY2UgdGhhdCBoYWQgb3B0aW9uIGBwYXJlbnRNb2RlbDogdHJ1ZWAsCiAgICAgICAqIG9yIGVsc2UgdGhlIGhvc3QgZWxlbWVudC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IVBvbHltZXJfUHJvcGVydHlFZmZlY3RzfSBUaGUgcGFyZW50IG1vZGVsIG9mIHRoaXMgaW5zdGFuY2UKICAgICAgICovCiAgICAgIGdldCBwYXJlbnRNb2RlbCgpIHsKICAgICAgICBsZXQgbW9kZWwgPSB0aGlzLl9fcGFyZW50TW9kZWw7CiAgICAgICAgaWYgKCFtb2RlbCkgewogICAgICAgICAgbGV0IG9wdGlvbnM7CiAgICAgICAgICBtb2RlbCA9IHRoaXM7CiAgICAgICAgICBkbyB7CiAgICAgICAgICAgIC8vIEEgdGVtcGxhdGUgaW5zdGFuY2UncyBgX19kYXRhSG9zdGAgaXMgYSA8dGVtcGxhdGU+CiAgICAgICAgICAgIC8vIGBtb2RlbC5fX2RhdGFIb3N0Ll9fZGF0YUhvc3RgIGlzIHRoZSB0ZW1wbGF0ZSdzIGhvc3QKICAgICAgICAgICAgbW9kZWwgPSBtb2RlbC5fX2RhdGFIb3N0Ll9fZGF0YUhvc3Q7CiAgICAgICAgICB9IHdoaWxlICgob3B0aW9ucyA9IG1vZGVsLl9fdGVtcGxhdGl6ZU9wdGlvbnMpICYmICFvcHRpb25zLnBhcmVudE1vZGVsKTsKICAgICAgICAgIHRoaXMuX19wYXJlbnRNb2RlbCA9IG1vZGVsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbW9kZWw7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTdHViIG9mIEhUTUxFbGVtZW50J3MgYGRpc3BhdGNoRXZlbnRgLCBzbyB0aGF0IGVmZmVjdHMgdGhhdCBtYXkKICAgICAgICogZGlzcGF0Y2ggZXZlbnRzIHNhZmVseSBuby1vcC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQgRXZlbnQgdG8gZGlzcGF0Y2gKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gQWx3YXlzIHRydWUuCiAgICAgICAqLwogICAgICAgZGlzcGF0Y2hFdmVudChldmVudCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CgogICAgLyoqIEB0eXBlIHshRGF0YVRlbXBsYXRlfSAqLwogICAgVGVtcGxhdGVJbnN0YW5jZUJhc2UucHJvdG90eXBlLl9fZGF0YUhvc3Q7CiAgICAvKiogQHR5cGUgeyFUZW1wbGF0aXplT3B0aW9uc30gKi8KICAgIFRlbXBsYXRlSW5zdGFuY2VCYXNlLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPcHRpb25zOwogICAgLyoqIEB0eXBlIHshUG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX21ldGhvZEhvc3Q7CiAgICAvKiogQHR5cGUgeyFPYmplY3R9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX190ZW1wbGF0aXplT3duZXI7CiAgICAvKiogQHR5cGUgeyFPYmplY3R9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX19ob3N0UHJvcHM7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtUZW1wbGF0ZUluc3RhbmNlQmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX011dGFibGVEYXRhfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgTXV0YWJsZVRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5NdXRhYmxlRGF0YShUZW1wbGF0ZUluc3RhbmNlQmFzZSk7CgogICAgZnVuY3Rpb24gZmluZE1ldGhvZEhvc3QodGVtcGxhdGUpIHsKICAgICAgLy8gVGVjaG5pY2FsbHkgdGhpcyBzaG91bGQgYmUgdGhlIG93bmVyIG9mIHRoZSBvdXRlcm1vc3QgdGVtcGxhdGUuCiAgICAgIC8vIEluIHNoYWRvdyBkb20sIHRoaXMgaXMgYWx3YXlzIGdldFJvb3ROb2RlKCkuaG9zdCwgYnV0IHdlIGNhbgogICAgICAvLyBhcHByb3hpbWF0ZSB0aGlzIHZpYSBjb29wZXJhdGlvbiB3aXRoIG91ciBkYXRhSG9zdCBhbHdheXMgc2V0dGluZwogICAgICAvLyBgX21ldGhvZEhvc3RgIGFzIGxvbmcgYXMgdGhlcmUgd2VyZSBiaW5kaW5ncyAob3IgaWQncykgb24gdGhpcwogICAgICAvLyBpbnN0YW5jZSBjYXVzaW5nIGl0IHRvIGdldCBhIGRhdGFIb3N0LgogICAgICBsZXQgdGVtcGxhdGVIb3N0ID0gdGVtcGxhdGUuX19kYXRhSG9zdDsKICAgICAgcmV0dXJuIHRlbXBsYXRlSG9zdCAmJiB0ZW1wbGF0ZUhvc3QuX21ldGhvZEhvc3QgfHwgdGVtcGxhdGVIb3N0OwogICAgfQoKICAgIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgICAvKioKICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IGNsYXNzLnByb3RvdHlwZSBpcyBub3QgZGVmaW5lZCBmb3Igc29tZSByZWFzb24KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlVGVtcGxhdGl6ZXJDbGFzcyh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKSB7CiAgICAgIC8vIEFub255bW91cyBjbGFzcyBjcmVhdGVkIGJ5IHRoZSB0ZW1wbGF0aXplCiAgICAgIGxldCBiYXNlID0gb3B0aW9ucy5tdXRhYmxlRGF0YSA/CiAgICAgICAgTXV0YWJsZVRlbXBsYXRlSW5zdGFuY2VCYXNlIDogVGVtcGxhdGVJbnN0YW5jZUJhc2U7CiAgICAgIC8vIEFmZm9yZGFuY2UgZm9yIGdsb2JhbCBtaXhpbnMgb250byBUZW1wbGF0aXplSW5zdGFuY2UKICAgICAgaWYgKFBvbHltZXIuVGVtcGxhdGl6ZS5taXhpbikgewogICAgICAgIGJhc2UgPSBQb2x5bWVyLlRlbXBsYXRpemUubWl4aW4oYmFzZSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIGxldCBrbGFzcyA9IGNsYXNzIGV4dGVuZHMgYmFzZSB7IH07CiAgICAgIGtsYXNzLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPcHRpb25zID0gb3B0aW9uczsKICAgICAga2xhc3MucHJvdG90eXBlLl9iaW5kVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICBhZGROb3RpZnlFZmZlY3RzKGtsYXNzLCB0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKTsKICAgICAgcmV0dXJuIGtsYXNzOwogICAgfQoKICAgIC8qKgogICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gY2xhc3MucHJvdG90eXBlIGlzIG5vdCBkZWZpbmVkIGZvciBzb21lIHJlYXNvbgogICAgICovCiAgICBmdW5jdGlvbiBhZGRQcm9wYWdhdGVFZmZlY3RzKHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG9wdGlvbnMpIHsKICAgICAgbGV0IHVzZXJGb3J3YXJkSG9zdFByb3AgPSBvcHRpb25zLmZvcndhcmRIb3N0UHJvcDsKICAgICAgaWYgKHVzZXJGb3J3YXJkSG9zdFByb3ApIHsKICAgICAgICAvLyBQcm92aWRlIGRhdGEgQVBJIGFuZCBwcm9wZXJ0eSBlZmZlY3RzIG9uIG1lbW9pemVkIHRlbXBsYXRlIGNsYXNzCiAgICAgICAgbGV0IGtsYXNzID0gdGVtcGxhdGVJbmZvLnRlbXBsYXRpemVUZW1wbGF0ZUNsYXNzOwogICAgICAgIGlmICgha2xhc3MpIHsKICAgICAgICAgIGxldCBiYXNlID0gb3B0aW9ucy5tdXRhYmxlRGF0YSA/IE11dGFibGVEYXRhVGVtcGxhdGUgOiBEYXRhVGVtcGxhdGU7CiAgICAgICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgICAgIGtsYXNzID0gdGVtcGxhdGVJbmZvLnRlbXBsYXRpemVUZW1wbGF0ZUNsYXNzID0KICAgICAgICAgICAgY2xhc3MgVGVtcGxhdGl6ZWRUZW1wbGF0ZSBleHRlbmRzIGJhc2Uge307CiAgICAgICAgICAvLyBBZGQgdGVtcGxhdGUgLSA+aW5zdGFuY2VzIGVmZmVjdHMKICAgICAgICAgIC8vIGFuZCBob3N0IDwtIHRlbXBsYXRlIGVmZmVjdHMKICAgICAgICAgIGxldCBob3N0UHJvcHMgPSB0ZW1wbGF0ZUluZm8uaG9zdFByb3BzOwogICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBob3N0UHJvcHMpIHsKICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLl9hZGRQcm9wZXJ0eUVmZmVjdCgnX2hvc3RfJyArIHByb3AsCiAgICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLlBST1BFUlRZX0VGRkVDVF9UWVBFUy5QUk9QQUdBVEUsCiAgICAgICAgICAgICAge2ZuOiBjcmVhdGVGb3J3YXJkSG9zdFByb3BFZmZlY3QocHJvcCwgdXNlckZvcndhcmRIb3N0UHJvcCl9KTsKICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLl9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eSgnX2hvc3RfJyArIHByb3ApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB1cGdyYWRlVGVtcGxhdGUodGVtcGxhdGUsIGtsYXNzKTsKICAgICAgICAvLyBNaXggYW55IHByZS1ib3VuZCBkYXRhIGludG8gX19kYXRhOyBubyBuZWVkIHRvIGZsdXNoIHRoaXMgdG8KICAgICAgICAvLyBpbnN0YW5jZXMgc2luY2UgdGhleSBwdWxsIGZyb20gdGhlIHRlbXBsYXRlIGF0IGluc3RhbmNlLXRpbWUKICAgICAgICBpZiAodGVtcGxhdGUuX19kYXRhUHJvdG8pIHsKICAgICAgICAgIC8vIE5vdGUsIGdlbmVyYWxseSBgX19kYXRhUHJvdG9gIGNvdWxkIGJlIGNoYWluZWQsIGJ1dCBpdCdzIGd1YXJhbnRlZWQKICAgICAgICAgIC8vIHRvIG5vdCBiZSBzaW5jZSB0aGlzIGlzIGEgdmFuaWxsYSB0ZW1wbGF0ZSB3ZSBqdXN0IGFkZGVkIGVmZmVjdHMgdG8KICAgICAgICAgIE9iamVjdC5hc3NpZ24odGVtcGxhdGUuX19kYXRhLCB0ZW1wbGF0ZS5fX2RhdGFQcm90byk7CiAgICAgICAgfQogICAgICAgIC8vIENsZWFyIGFueSBwZW5kaW5nIGRhdGEgZm9yIHBlcmZvcm1hbmNlCiAgICAgICAgdGVtcGxhdGUuX19kYXRhVGVtcCA9IHt9OwogICAgICAgIHRlbXBsYXRlLl9fZGF0YVBlbmRpbmcgPSBudWxsOwogICAgICAgIHRlbXBsYXRlLl9fZGF0YU9sZCA9IG51bGw7CiAgICAgICAgdGVtcGxhdGUuX2VuYWJsZVByb3BlcnRpZXMoKTsKICAgICAgfQogICAgfQogICAgLyogZXNsaW50LWVuYWJsZSB2YWxpZC1qc2RvYyAqLwoKICAgIGZ1bmN0aW9uIGNyZWF0ZUZvcndhcmRIb3N0UHJvcEVmZmVjdChob3N0UHJvcCwgdXNlckZvcndhcmRIb3N0UHJvcCkgewogICAgICByZXR1cm4gZnVuY3Rpb24gZm9yd2FyZEhvc3RQcm9wKHRlbXBsYXRlLCBwcm9wLCBwcm9wcykgewogICAgICAgIHVzZXJGb3J3YXJkSG9zdFByb3AuY2FsbCh0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lciwKICAgICAgICAgIHByb3Auc3Vic3RyaW5nKCdfaG9zdF8nLmxlbmd0aCksIHByb3BzW3Byb3BdKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGROb3RpZnlFZmZlY3RzKGtsYXNzLCB0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKSB7CiAgICAgIGxldCBob3N0UHJvcHMgPSB0ZW1wbGF0ZUluZm8uaG9zdFByb3BzIHx8IHt9OwogICAgICBmb3IgKGxldCBpcHJvcCBpbiBvcHRpb25zLmluc3RhbmNlUHJvcHMpIHsKICAgICAgICBkZWxldGUgaG9zdFByb3BzW2lwcm9wXTsKICAgICAgICBsZXQgdXNlck5vdGlmeUluc3RhbmNlUHJvcCA9IG9wdGlvbnMubm90aWZ5SW5zdGFuY2VQcm9wOwogICAgICAgIGlmICh1c2VyTm90aWZ5SW5zdGFuY2VQcm9wKSB7CiAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KGlwcm9wLAogICAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuUFJPUEVSVFlfRUZGRUNUX1RZUEVTLk5PVElGWSwKICAgICAgICAgICAge2ZuOiBjcmVhdGVOb3RpZnlJbnN0YW5jZVByb3BFZmZlY3QoaXByb3AsIHVzZXJOb3RpZnlJbnN0YW5jZVByb3ApfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvcHRpb25zLmZvcndhcmRIb3N0UHJvcCAmJiB0ZW1wbGF0ZS5fX2RhdGFIb3N0KSB7CiAgICAgICAgZm9yIChsZXQgaHByb3AgaW4gaG9zdFByb3BzKSB7CiAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KGhwcm9wLAogICAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuUFJPUEVSVFlfRUZGRUNUX1RZUEVTLk5PVElGWSwKICAgICAgICAgICAge2ZuOiBjcmVhdGVOb3RpZnlIb3N0UHJvcEVmZmVjdCgpfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlTm90aWZ5SW5zdGFuY2VQcm9wRWZmZWN0KGluc3RQcm9wLCB1c2VyTm90aWZ5SW5zdGFuY2VQcm9wKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiBub3RpZnlJbnN0YW5jZVByb3AoaW5zdCwgcHJvcCwgcHJvcHMpIHsKICAgICAgICB1c2VyTm90aWZ5SW5zdGFuY2VQcm9wLmNhbGwoaW5zdC5fX3RlbXBsYXRpemVPd25lciwKICAgICAgICAgIGluc3QsIHByb3AsIHByb3BzW3Byb3BdKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVOb3RpZnlIb3N0UHJvcEVmZmVjdCgpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5vdGlmeUhvc3RQcm9wKGluc3QsIHByb3AsIHByb3BzKSB7CiAgICAgICAgaW5zdC5fX2RhdGFIb3N0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoJ19ob3N0XycgKyBwcm9wLCBwcm9wc1twcm9wXSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBNb2R1bGUgZm9yIHByZXBhcmluZyBhbmQgc3RhbXBpbmcgaW5zdGFuY2VzIG9mIHRlbXBsYXRlcyB0aGF0IHV0aWxpemUKICAgICAqIFBvbHltZXIncyBkYXRhLWJpbmRpbmcgYW5kIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVyIGZlYXR1cmVzLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogICAgIC8vIEdldCBhIHRlbXBsYXRlIGZyb20gc29tZXdoZXJlLCBlLmcuIGxpZ2h0IERPTQogICAgICogICAgIGxldCB0ZW1wbGF0ZSA9IHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKTsKICAgICAqICAgICAvLyBQcmVwYXJlIHRoZSB0ZW1wbGF0ZQogICAgICogICAgIGxldCBUZW1wbGF0ZUNsYXNzID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUpOwogICAgICogICAgIC8vIEluc3RhbmNlIHRoZSB0ZW1wbGF0ZSB3aXRoIGFuIGluaXRpYWwgZGF0YSBtb2RlbAogICAgICogICAgIGxldCBpbnN0YW5jZSA9IG5ldyBUZW1wbGF0ZUNsYXNzKHtteVByb3A6ICdpbml0aWFsJ30pOwogICAgICogICAgIC8vIEluc2VydCB0aGUgaW5zdGFuY2UncyBET00gc29tZXdoZXJlLCBlLmcuIGVsZW1lbnQncyBzaGFkb3cgRE9NCiAgICAgKiAgICAgdGhpcy5zaGFkb3dSb290LmFwcGVuZENoaWxkKGluc3RhbmNlLnJvb3QpOwogICAgICogICAgIC8vIENoYW5naW5nIGEgcHJvcGVydHkgb24gdGhlIGluc3RhbmNlIHdpbGwgcHJvcGFnYXRlIHRvIGJpbmRpbmdzCiAgICAgKiAgICAgLy8gaW4gdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgaW5zdGFuY2UubXlQcm9wID0gJ25ldyB2YWx1ZSc7CiAgICAgKgogICAgICogVGhlIGBvcHRpb25zYCBkaWN0aW9uYXJ5IHBhc3NlZCB0byBgdGVtcGxhdGl6ZWAgYWxsb3dzIGZvciBjdXN0b21pemluZwogICAgICogZmVhdHVyZXMgb2YgdGhlIGdlbmVyYXRlZCB0ZW1wbGF0ZSBjbGFzcywgaW5jbHVkaW5nIGhvdyBvdXRlci1zY29wZSBob3N0CiAgICAgKiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBmb3J3YXJkZWQgaW50byB0ZW1wbGF0ZSBpbnN0YW5jZXMsIGhvdyBhbnkgaW5zdGFuY2UKICAgICAqIHByb3BlcnRpZXMgYWRkZWQgaW50byB0aGUgdGVtcGxhdGUncyBzY29wZSBzaG91bGQgYmUgbm90aWZpZWQgb3V0IHRvCiAgICAgKiB0aGUgaG9zdCwgYW5kIHdoZXRoZXIgdGhlIGluc3RhbmNlIHNob3VsZCBiZSBkZWNvcmF0ZWQgYXMgYSAicGFyZW50IG1vZGVsIgogICAgICogb2YgYW55IGV2ZW50IGhhbmRsZXJzLgogICAgICoKICAgICAqICAgICAvLyBDdXN0b21pemUgcHJvcGVydHkgZm9yd2FyZGluZyBhbmQgZXZlbnQgbW9kZWwgZGVjb3JhdGlvbgogICAgICogICAgIGxldCBUZW1wbGF0ZUNsYXNzID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUsIHRoaXMsIHsKICAgICAqICAgICAgIHBhcmVudE1vZGVsOiB0cnVlLAogICAgICogICAgICAgZm9yd2FyZEhvc3RQcm9wKHByb3BlcnR5LCB2YWx1ZSkgey4uLn0sCiAgICAgKiAgICAgICBpbnN0YW5jZVByb3BzOiB7Li4ufSwKICAgICAqICAgICAgIG5vdGlmeUluc3RhbmNlUHJvcChpbnN0YW5jZSwgcHJvcGVydHksIHZhbHVlKSB7Li4ufSwKICAgICAqICAgICB9KTsKICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICogQHN1bW1hcnkgTW9kdWxlIGZvciBwcmVwYXJpbmcgYW5kIHN0YW1waW5nIGluc3RhbmNlcyBvZiB0ZW1wbGF0ZXMKICAgICAqICAgdXRpbGl6aW5nIFBvbHltZXIgdGVtcGxhdGluZyBmZWF0dXJlcy4KICAgICAqLwogICAgUG9seW1lci5UZW1wbGF0aXplID0gewoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYW4gYW5vbnltb3VzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgY2xhc3MgYm91bmQgdG8gdGhlCiAgICAgICAqIGA8dGVtcGxhdGU+YCBwcm92aWRlZC4gIEluc3RhbmNpbmcgdGhlIGNsYXNzIHdpbGwgcmVzdWx0IGluIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBiZWluZyBzdGFtcGVkIGludG8gYSBkb2N1bWVudCBmcmFnbWVudCBzdG9yZWQgYXMgdGhlIGluc3RhbmNlJ3MKICAgICAgICogYHJvb3RgIHByb3BlcnR5LCBhZnRlciB3aGljaCBpdCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIERPTS4KICAgICAgICoKICAgICAgICogVGVtcGxhdGVzIG1heSB1dGlsaXplIGFsbCBQb2x5bWVyIGRhdGEtYmluZGluZyBmZWF0dXJlcyBhcyB3ZWxsIGFzCiAgICAgICAqIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycy4gIEV2ZW50IGxpc3RlbmVycyBhbmQgaW5saW5lIGNvbXB1dGluZwogICAgICAgKiBmdW5jdGlvbnMgaW4gdGhlIHRlbXBsYXRlIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBob3N0IG9mIHRoZSB0ZW1wbGF0ZS4KICAgICAgICoKICAgICAgICogVGhlIGNvbnN0cnVjdG9yIHJldHVybmVkIHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IGRpY3Rpb25hcnkgb2YgaW5pdGlhbAogICAgICAgKiBwcm9wZXJ0eSB2YWx1ZXMgdG8gcHJvcGFnYXRlIGludG8gdGVtcGxhdGUgYmluZGluZ3MuICBBZGRpdGlvbmFsbHkKICAgICAgICogaG9zdCBwcm9wZXJ0aWVzIGNhbiBiZSBmb3J3YXJkZWQgaW4sIGFuZCBpbnN0YW5jZSBwcm9wZXJ0aWVzIGNhbiBiZQogICAgICAgKiBub3RpZmllZCBvdXQgYnkgcHJvdmlkaW5nIG9wdGlvbmFsIGNhbGxiYWNrcyBpbiB0aGUgYG9wdGlvbnNgIGRpY3Rpb25hcnkuCiAgICAgICAqCiAgICAgICAqIFZhbGlkIGNvbmZpZ3VyYXRpb24gaW4gYG9wdGlvbnNgIGFyZSBhcyBmb2xsb3dzOgogICAgICAgKgogICAgICAgKiAtIGBmb3J3YXJkSG9zdFByb3AocHJvcGVydHksIHZhbHVlKWA6IENhbGxlZCB3aGVuIGEgcHJvcGVydHkgcmVmZXJlbmNlZAogICAgICAgKiAgIGluIHRoZSB0ZW1wbGF0ZSBjaGFuZ2VkIG9uIHRoZSB0ZW1wbGF0ZSdzIGhvc3QuIEFzIHRoaXMgbGlicmFyeSBkb2VzCiAgICAgICAqICAgbm90IHJldGFpbiByZWZlcmVuY2VzIHRvIHRlbXBsYXRlcyBpbnN0YW5jZWQgYnkgdGhlIHVzZXIsIGl0IGlzIHRoZQogICAgICAgKiAgIHRlbXBsYXRpemUgb3duZXIncyByZXNwb25zaWJpbGl0eSB0byBmb3J3YXJkIGhvc3QgcHJvcGVydHkgY2hhbmdlcyBpbnRvCiAgICAgICAqICAgdXNlci1zdGFtcGVkIGluc3RhbmNlcy4gIFRoZSBgaW5zdGFuY2UuZm9yd2FyZEhvc3RQcm9wKHByb3BlcnR5LCB2YWx1ZSlgCiAgICAgICAqICAgIG1ldGhvZCBvbiB0aGUgZ2VuZXJhdGVkIGNsYXNzIHNob3VsZCBiZSBjYWxsZWQgdG8gZm9yd2FyZCBob3N0CiAgICAgICAqICAgcHJvcGVydGllcyBpbnRvIHRoZSB0ZW1wbGF0ZSB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHByb3BlcnR5LWNoYW5nZWQKICAgICAgICogICBub3RpZmljYXRpb25zLiBBbnkgcHJvcGVydGllcyByZWZlcmVuY2VkIGluIHRoZSB0ZW1wbGF0ZSB0aGF0IGFyZSBub3QKICAgICAgICogICBkZWZpbmVkIGluIGBpbnN0YW5jZVByb3BzYCB3aWxsIGJlIG5vdGlmaWVkIHVwIHRvIHRoZSB0ZW1wbGF0ZSdzIGhvc3QKICAgICAgICogICBhdXRvbWF0aWNhbGx5LgogICAgICAgKiAtIGBpbnN0YW5jZVByb3BzYDogRGljdGlvbmFyeSBvZiBwcm9wZXJ0eSBuYW1lcyB0aGF0IHdpbGwgYmUgYWRkZWQKICAgICAgICogICB0byB0aGUgaW5zdGFuY2UgYnkgdGhlIHRlbXBsYXRpemUgb3duZXIuICBUaGVzZSBwcm9wZXJ0aWVzIHNoYWRvdyBhbnkKICAgICAgICogICBob3N0IHByb3BlcnRpZXMsIGFuZCBjaGFuZ2VzIHdpdGhpbiB0aGUgdGVtcGxhdGUgdG8gdGhlc2UgcHJvcGVydGllcwogICAgICAgKiAgIHdpbGwgcmVzdWx0IGluIGBub3RpZnlJbnN0YW5jZVByb3BgIGJlaW5nIGNhbGxlZC4KICAgICAgICogLSBgbXV0YWJsZURhdGFgOiBXaGVuIGB0cnVlYCwgdGhlIGdlbmVyYXRlZCBjbGFzcyB3aWxsIHNraXAgc3RyaWN0CiAgICAgICAqICAgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUKICAgICAgICogICAiZGlydHkiKS4KICAgICAgICogLSBgbm90aWZ5SW5zdGFuY2VQcm9wKGluc3RhbmNlLCBwcm9wZXJ0eSwgdmFsdWUpYDogQ2FsbGVkIHdoZW4KICAgICAgICogICBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBjaGFuZ2VzLiAgVXNlcnMgbWF5IGNob29zZSB0byBjYWxsIGBub3RpZnlQYXRoYAogICAgICAgKiAgIG9uIGUuZy4gdGhlIG93bmVyIHRvIG5vdGlmeSB0aGUgY2hhbmdlLgogICAgICAgKiAtIGBwYXJlbnRNb2RlbGA6IFdoZW4gYHRydWVgLCBldmVudHMgaGFuZGxlZCBieSBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMKICAgICAgICogICAoYG9uLWV2ZW50PSJoYW5kbGVyImApIHdpbGwgYmUgZGVjb3JhdGVkIHdpdGggYSBgbW9kZWxgIHByb3BlcnR5IHBvaW50aW5nCiAgICAgICAqICAgdG8gdGhlIHRlbXBsYXRlIGluc3RhbmNlIHRoYXQgc3RhbXBlZCBpdC4gIEl0IHdpbGwgYWxzbyBiZSByZXR1cm5lZAogICAgICAgKiAgIGZyb20gYGluc3RhbmNlLnBhcmVudE1vZGVsYCBpbiBjYXNlcyB3aGVyZSB0ZW1wbGF0ZSBpbnN0YW5jZSBuZXN0aW5nCiAgICAgICAqICAgY2F1c2VzIGFuIGlubmVyIG1vZGVsIHRvIHNoYWRvdyBhbiBvdXRlciBtb2RlbC4KICAgICAgICoKICAgICAgICogQWxsIGNhbGxiYWNrcyBhcmUgY2FsbGVkIGJvdW5kIHRvIHRoZSBgb3duZXJgLiBBbnkgY29udGV4dAogICAgICAgKiBuZWVkZWQgZm9yIHRoZSBjYWxsYmFja3MgKHN1Y2ggYXMgcmVmZXJlbmNlcyB0byBgaW5zdGFuY2VzYCBzdGFtcGVkKQogICAgICAgKiBzaG91bGQgYmUgc3RvcmVkIG9uIHRoZSBgb3duZXJgIHN1Y2ggdGhhdCB0aGV5IGNhbiBiZSByZXRyaWV2ZWQgdmlhCiAgICAgICAqIGB0aGlzYC4KICAgICAgICoKICAgICAgICogV2hlbiBgb3B0aW9ucy5mb3J3YXJkSG9zdFByb3BgIGlzIGRlY2xhcmVkIGFzIGFuIG9wdGlvbiwgYW55IHByb3BlcnRpZXMKICAgICAgICogcmVmZXJlbmNlZCBpbiB0aGUgdGVtcGxhdGUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGZvcndhcmRlZCBmcm9tIHRoZSBob3N0IG9mCiAgICAgICAqIHRoZSBgPHRlbXBsYXRlPmAgdG8gaW5zdGFuY2VzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgYW55IHByb3BlcnRpZXMgbGlzdGVkIGluCiAgICAgICAqIHRoZSBgb3B0aW9ucy5pbnN0YW5jZVByb3BzYCBvYmplY3QuICBgaW5zdGFuY2VQcm9wc2AgYXJlIGFzc3VtZWQgdG8gYmUKICAgICAgICogbWFuYWdlZCBieSB0aGUgb3duZXIgb2YgdGhlIGluc3RhbmNlcywgZWl0aGVyIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvcgogICAgICAgKiBvciBzZXQgYWZ0ZXIgdGhlIGZhY3QuICBOb3RlLCBhbnkgcHJvcGVydGllcyBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3Igd2lsbAogICAgICAgKiBhbHdheXMgYmUgc2V0IHRvIHRoZSBpbnN0YW5jZSAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgd291bGQgbm9ybWFsbHkKICAgICAgICogYmUgZm9yd2FyZGVkIGZyb20gdGhlIGhvc3QpLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgYHRlbXBsYXRpemUoKWAgY2FuIGJlIHJ1biBvbmx5IG9uY2UgZm9yIGEgZ2l2ZW4gYDx0ZW1wbGF0ZT5gLgogICAgICAgKiBGdXJ0aGVyIGNhbGxzIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiBBbHNvLCB0aGVyZSBpcyBhIHNwZWNpYWwKICAgICAgICogYmVoYXZpb3IgaWYgdGhlIHRlbXBsYXRlIHdhcyBkdXBsaWNhdGVkIHRocm91Z2ggYSBtZWNoYW5pc20gc3VjaCBhcwogICAgICAgKiBgPGRvbS1yZXBlYXQ+YCBvciBgPHRlc3QtZml4dHVyZT5gLiBJbiB0aGlzIGNhc2UsIGFsbCBjYWxscyB0bwogICAgICAgKiBgdGVtcGxhdGl6ZSgpYCByZXR1cm4gdGhlIHNhbWUgY2xhc3MgZm9yIGFsbCBkdXBsaWNhdGVzIG9mIGEgdGVtcGxhdGUuCiAgICAgICAqIFRoZSBjbGFzcyByZXR1cm5lZCBmcm9tIGB0ZW1wbGF0aXplKClgIGlzIGdlbmVyYXRlZCBvbmx5IG9uY2UgdXNpbmcKICAgICAgICogdGhlIGBvcHRpb25zYCBmcm9tIHRoZSBmaXJzdCBjYWxsLiBUaGlzIG1lYW5zIHRoYXQgYW55IGBvcHRpb25zYAogICAgICAgKiBwcm92aWRlZCB0byBzdWJzZXF1ZW50IGNhbGxzIHdpbGwgYmUgaWdub3JlZC4gVGhlcmVmb3JlLCBpdCBpcyB2ZXJ5CiAgICAgICAqIGltcG9ydGFudCBub3QgdG8gY2xvc2Ugb3ZlciBhbnkgdmFyaWFibGVzIGluc2lkZSB0aGUgY2FsbGJhY2tzLiBBbHNvLAogICAgICAgKiBhcnJvdyBmdW5jdGlvbnMgbXVzdCBiZSBhdm9pZGVkIGJlY2F1c2UgdGhleSBiaW5kIHRoZSBvdXRlciBgdGhpc2AuCiAgICAgICAqIEluc2lkZSB0aGUgY2FsbGJhY2tzLCBhbnkgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBjYW4gYmUgYWNjZXNzZWQKICAgICAgICogdGhyb3VnaCBgdGhpc2AsIHdoaWNoIHBvaW50cyB0byB0aGUgYG93bmVyYC4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuVGVtcGxhdGl6ZQogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byB0ZW1wbGF0aXplCiAgICAgICAqIEBwYXJhbSB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHM9fSBvd25lciBPd25lciBvZiB0aGUgdGVtcGxhdGUgaW5zdGFuY2VzOwogICAgICAgKiAgIGFueSBvcHRpb25hbCBjYWxsYmFja3Mgd2lsbCBiZSBib3VuZCB0byB0aGlzIG93bmVyLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgT3B0aW9ucyBkaWN0aW9uYXJ5IChzZWUgc3VtbWFyeSBmb3IgZGV0YWlscykKICAgICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OlRlbXBsYXRlSW5zdGFuY2VCYXNlKX0gR2VuZXJhdGVkIGNsYXNzIGJvdW5kIHRvIHRoZSB0ZW1wbGF0ZQogICAgICAgKiAgIHByb3ZpZGVkCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgdGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgb3duZXIsIG9wdGlvbnMpIHsKICAgICAgICAvLyBVbmRlciBzdHJpY3RUZW1wbGF0ZVBvbGljeSwgdGhlIHRlbXBsYXRpemVkIGVsZW1lbnQgbXVzdCBiZSBvd25lZAogICAgICAgIC8vIGJ5IGEgKHRydXN0ZWQpIFBvbHltZXIgZWxlbWVudCwgaW5kaWNhdGVkIGJ5IGV4aXN0ZW5jZSBvZiBfbWV0aG9kSG9zdDsKICAgICAgICAvLyBlLmcuIGZvciBkb20taWYgJiBkb20tcmVwZWF0IGluIG1haW4gZG9jdW1lbnQsIF9tZXRob2RIb3N0IGlzIG51bGwKICAgICAgICBpZiAoUG9seW1lci5zdHJpY3RUZW1wbGF0ZVBvbGljeSAmJiAhZmluZE1ldGhvZEhvc3QodGVtcGxhdGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0cmljdFRlbXBsYXRlUG9saWN5OiB0ZW1wbGF0ZSBvd25lciBub3QgdHJ1c3RlZCcpOwogICAgICAgIH0KICAgICAgICBvcHRpb25zID0gLyoqIEB0eXBlIHshVGVtcGxhdGl6ZU9wdGlvbnN9ICovKG9wdGlvbnMgfHwge30pOwogICAgICAgIGlmICh0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lcikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIDx0ZW1wbGF0ZT4gY2FuIG9ubHkgYmUgdGVtcGxhdGl6ZWQgb25jZScpOwogICAgICAgIH0KICAgICAgICB0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lciA9IG93bmVyOwogICAgICAgIGNvbnN0IGN0b3IgPSBvd25lciA/IG93bmVyLmNvbnN0cnVjdG9yIDogVGVtcGxhdGVJbnN0YW5jZUJhc2U7CiAgICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IGN0b3IuX3BhcnNlVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgIC8vIEdldCBtZW1vaXplZCBiYXNlIGNsYXNzIGZvciB0aGUgcHJvdG90eXBpY2FsIHRlbXBsYXRlLCB3aGljaAogICAgICAgIC8vIGluY2x1ZGVzIHByb3BlcnR5IGVmZmVjdHMgZm9yIGJpbmRpbmcgdGVtcGxhdGUgJiBmb3J3YXJkaW5nCiAgICAgICAgbGV0IGJhc2VDbGFzcyA9IHRlbXBsYXRlSW5mby50ZW1wbGF0aXplSW5zdGFuY2VDbGFzczsKICAgICAgICBpZiAoIWJhc2VDbGFzcykgewogICAgICAgICAgYmFzZUNsYXNzID0gY3JlYXRlVGVtcGxhdGl6ZXJDbGFzcyh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKTsKICAgICAgICAgIHRlbXBsYXRlSW5mby50ZW1wbGF0aXplSW5zdGFuY2VDbGFzcyA9IGJhc2VDbGFzczsKICAgICAgICB9CiAgICAgICAgLy8gSG9zdCBwcm9wZXJ0eSBmb3J3YXJkaW5nIG11c3QgYmUgaW5zdGFsbGVkIG9udG8gdGVtcGxhdGUgaW5zdGFuY2UKICAgICAgICBhZGRQcm9wYWdhdGVFZmZlY3RzKHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG9wdGlvbnMpOwogICAgICAgIC8vIFN1YmNsYXNzIGJhc2UgY2xhc3MgYW5kIGFkZCByZWZlcmVuY2UgZm9yIHRoaXMgc3BlY2lmaWMgdGVtcGxhdGUKICAgICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgICBsZXQga2xhc3MgPSBjbGFzcyBUZW1wbGF0ZUluc3RhbmNlIGV4dGVuZHMgYmFzZUNsYXNzIHt9OwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fbWV0aG9kSG9zdCA9IGZpbmRNZXRob2RIb3N0KHRlbXBsYXRlKTsKICAgICAgICBrbGFzcy5wcm90b3R5cGUuX19kYXRhSG9zdCA9IHRlbXBsYXRlOwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPd25lciA9IG93bmVyOwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fX2hvc3RQcm9wcyA9IHRlbXBsYXRlSW5mby5ob3N0UHJvcHM7CiAgICAgICAga2xhc3MgPSAvKiogQHR5cGUge2Z1bmN0aW9uKG5ldzpUZW1wbGF0ZUluc3RhbmNlQmFzZSl9ICovKGtsYXNzKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgcmV0dXJuIGtsYXNzOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIHRlbXBsYXRlICJtb2RlbCIgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZWxlbWVudCwgd2hpY2gKICAgICAgICogc2VydmVzIGFzIHRoZSBiaW5kaW5nIHNjb3BlIGZvciB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdGhlIGVsZW1lbnQgaXMKICAgICAgICogY29udGFpbmVkIGluLiBBIHRlbXBsYXRlIG1vZGVsIGlzIGFuIGluc3RhbmNlIG9mCiAgICAgICAqIGBUZW1wbGF0ZUluc3RhbmNlQmFzZWAsIGFuZCBzaG91bGQgYmUgdXNlZCB0byBtYW5pcHVsYXRlIGRhdGEKICAgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgICAqCiAgICAgICAqIEV4YW1wbGU6CiAgICAgICAqCiAgICAgICAqICAgbGV0IG1vZGVsID0gbW9kZWxGb3JFbGVtZW50KGVsKTsKICAgICAgICogICBpZiAobW9kZWwuaW5kZXggPCAxMCkgewogICAgICAgKiAgICAgbW9kZWwuc2V0KCdpdGVtLmNoZWNrZWQnLCB0cnVlKTsKICAgICAgICogICB9CiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlRlbXBsYXRpemUKICAgICAgICogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUaGUgbW9kZWwgd2lsbCBiZSByZXR1cm5lZCBmb3IKICAgICAgICogICBlbGVtZW50cyBzdGFtcGVkIGZyb20gdGhpcyB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0ge05vZGU9fSBub2RlIE5vZGUgZm9yIHdoaWNoIHRvIHJldHVybiBhIHRlbXBsYXRlIG1vZGVsLgogICAgICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUluc3RhbmNlQmFzZX0gVGVtcGxhdGUgaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZQogICAgICAgKiAgIGJpbmRpbmcgc2NvcGUgZm9yIHRoZSBlbGVtZW50CiAgICAgICAqLwogICAgICBtb2RlbEZvckVsZW1lbnQodGVtcGxhdGUsIG5vZGUpIHsKICAgICAgICBsZXQgbW9kZWw7CiAgICAgICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICAgIC8vIEFuIGVsZW1lbnQgd2l0aCBhIF9fdGVtcGxhdGl6ZUluc3RhbmNlIG1hcmtzIHRoZSB0b3AgYm91bmRhcnkKICAgICAgICAgIC8vIG9mIGEgc2NvcGU7IHdhbGsgdXAgdW50aWwgd2UgZmluZCBvbmUsIGFuZCB0aGVuIGVuc3VyZSB0aGF0CiAgICAgICAgICAvLyBpdHMgX19kYXRhSG9zdCBtYXRjaGVzIGB0aGlzYCwgbWVhbmluZyB0aGlzIGRvbS1yZXBlYXQgc3RhbXBlZCBpdAogICAgICAgICAgaWYgKChtb2RlbCA9IG5vZGUuX190ZW1wbGF0aXplSW5zdGFuY2UpKSB7CiAgICAgICAgICAgIC8vIEZvdW5kIGFuIGVsZW1lbnQgc3RhbXBlZCBieSBhbm90aGVyIHRlbXBsYXRlOyBrZWVwIHdhbGtpbmcgdXAKICAgICAgICAgICAgLy8gZnJvbSBpdHMgX19kYXRhSG9zdAogICAgICAgICAgICBpZiAobW9kZWwuX19kYXRhSG9zdCAhPSB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgIG5vZGUgPSBtb2RlbC5fX2RhdGFIb3N0OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJldHVybiBtb2RlbDsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gU3RpbGwgaW4gYSB0ZW1wbGF0ZSBzY29wZSwga2VlcCBnb2luZyB1cCB1bnRpbAogICAgICAgICAgICAvLyBhIF9fdGVtcGxhdGl6ZUluc3RhbmNlIGlzIGZvdW5kCiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9OwoKICAgIFBvbHltZXIuVGVtcGxhdGVJbnN0YW5jZUJhc2UgPSBUZW1wbGF0ZUluc3RhbmNlQmFzZTsKCiAgfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgbGV0IFRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5UZW1wbGF0ZUluc3RhbmNlQmFzZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZQoKICAgIC8qKgogICAgICogQHR5cGVkZWYge3sKICAgICAqICAgX3RlbXBsYXRpemVyVGVtcGxhdGU6IEhUTUxUZW1wbGF0ZUVsZW1lbnQsCiAgICAgKiAgIF9wYXJlbnRNb2RlbDogYm9vbGVhbiwKICAgICAqICAgX2luc3RhbmNlUHJvcHM6IE9iamVjdCwKICAgICAqICAgX2ZvcndhcmRIb3N0UHJvcFYyOiBGdW5jdGlvbiwKICAgICAqICAgX25vdGlmeUluc3RhbmNlUHJvcFYyOiBGdW5jdGlvbiwKICAgICAqICAgY3RvcjogVGVtcGxhdGVJbnN0YW5jZUJhc2UKICAgICAqIH19CiAgICAgKi8KICAgIGxldCBUZW1wbGF0aXplclVzZXI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUKCiAgICAvKioKICAgICAqIFRoZSBgUG9seW1lci5UZW1wbGF0aXplcmAgYmVoYXZpb3IgYWRkcyBtZXRob2RzIHRvIGdlbmVyYXRlIGluc3RhbmNlcyBvZgogICAgICogdGVtcGxhdGVzIHRoYXQgYXJlIGVhY2ggbWFuYWdlZCBieSBhbiBhbm9ueW1vdXMgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYAogICAgICogaW5zdGFuY2Ugd2hlcmUgZGF0YS1iaW5kaW5ncyBpbiB0aGUgc3RhbXBlZCB0ZW1wbGF0ZSBjb250ZW50IGFyZSBib3VuZCB0bwogICAgICogYWNjZXNzb3JzIG9uIGl0c2VsZi4KICAgICAqCiAgICAgKiBUaGlzIGJlaGF2aW9yIGlzIHByb3ZpZGVkIGluIFBvbHltZXIgMi54IGFzIGEgaHlicmlkLWVsZW1lbnQgY29udmVuaWVuY2UKICAgICAqIG9ubHkuICBGb3Igbm9uLWh5YnJpZCB1c2FnZSwgdGhlIGBQb2x5bWVyLlRlbXBsYXRpemVgIGxpYnJhcnkKICAgICAqIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgICAgLy8gR2V0IGEgdGVtcGxhdGUgZnJvbSBzb21ld2hlcmUsIGUuZy4gbGlnaHQgRE9NCiAgICAgKiAgICAgbGV0IHRlbXBsYXRlID0gdGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpOwogICAgICogICAgIC8vIFByZXBhcmUgdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgdGhpcy50ZW1wbGF0aXplKHRlbXBsYXRlKTsKICAgICAqICAgICAvLyBJbnN0YW5jZSB0aGUgdGVtcGxhdGUgd2l0aCBhbiBpbml0aWFsIGRhdGEgbW9kZWwKICAgICAqICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLnN0YW1wKHtteVByb3A6ICdpbml0aWFsJ30pOwogICAgICogICAgIC8vIEluc2VydCB0aGUgaW5zdGFuY2UncyBET00gc29tZXdoZXJlLCBlLmcuIGxpZ2h0IERPTQogICAgICogICAgIFBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGluc3RhbmNlLnJvb3QpOwogICAgICogICAgIC8vIENoYW5naW5nIGEgcHJvcGVydHkgb24gdGhlIGluc3RhbmNlIHdpbGwgcHJvcGFnYXRlIHRvIGJpbmRpbmdzCiAgICAgKiAgICAgLy8gaW4gdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgaW5zdGFuY2UubXlQcm9wID0gJ25ldyB2YWx1ZSc7CiAgICAgKgogICAgICogVXNlcnMgb2YgYFRlbXBsYXRpemVyYCBtYXkgbmVlZCB0byBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBhYnN0cmFjdAogICAgICogQVBJJ3MgdG8gZGV0ZXJtaW5lIGhvdyBwcm9wZXJ0aWVzIGFuZCBwYXRocyBmcm9tIHRoZSBob3N0IHNob3VsZCBiZQogICAgICogZm9yd2FyZGVkIGludG8gdG8gaW5zdGFuY2VzOgogICAgICoKICAgICAqICAgICBfZm9yd2FyZEhvc3RQcm9wVjI6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKQogICAgICoKICAgICAqIExpa2V3aXNlLCB1c2VycyBtYXkgaW1wbGVtZW50IHRoZXNlIGFkZGl0aW9uYWwgYWJzdHJhY3QgQVBJJ3MgdG8gZGV0ZXJtaW5lCiAgICAgKiBob3cgaW5zdGFuY2Utc3BlY2lmaWMgcHJvcGVydGllcyB0aGF0IGNoYW5nZSBvbiB0aGUgaW5zdGFuY2Ugc2hvdWxkIGJlCiAgICAgKiBmb3J3YXJkZWQgb3V0IHRvIHRoZSBob3N0LCBpZiBuZWNlc3NhcnkuCiAgICAgKgogICAgICogICAgIF9ub3RpZnlJbnN0YW5jZVByb3BWMjogZnVuY3Rpb24oaW5zdCwgcHJvcCwgdmFsdWUpCiAgICAgKgogICAgICogSW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIHByb3BlcnRpZXMgYXJlIGluc3RhbmNlLXNwZWNpZmljIGFuZCByZXF1aXJlCiAgICAgKiBjdXN0b20gbm90aWZpY2F0aW9uIHZpYSBgX25vdGlmeUluc3RhbmNlUHJvcGAsIGRlZmluZSBhbiBgX2luc3RhbmNlUHJvcHNgCiAgICAgKiBvYmplY3QgY29udGFpbmluZyBrZXlzIGZvciBlYWNoIGluc3RhbmNlIHByb3AsIGZvciBleGFtcGxlOgogICAgICoKICAgICAqICAgICBfaW5zdGFuY2VQcm9wczogewogICAgICogICAgICAgaXRlbTogdHJ1ZSwKICAgICAqICAgICAgIGluZGV4OiB0cnVlCiAgICAgKiAgICAgfQogICAgICoKICAgICAqIEFueSBwcm9wZXJ0aWVzIHVzZWQgaW4gdGhlIHRlbXBsYXRlIHRoYXQgYXJlIG5vdCBkZWZpbmVkIGluIF9pbnN0YW5jZVByb3AKICAgICAqIHdpbGwgYmUgZm9yd2FyZGVkIG91dCB0byB0aGUgVGVtcGxhdGl6ZSBgb3duZXJgIGF1dG9tYXRpY2FsbHkuCiAgICAgKgogICAgICogVXNlcnMgbWF5IGFsc28gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgYWJzdHJhY3QgZnVuY3Rpb24gdG8gc2hvdyBvcgogICAgICogaGlkZSBhbnkgRE9NIGdlbmVyYXRlZCB1c2luZyBgc3RhbXBgOgogICAgICoKICAgICAqICAgICBfc2hvd0hpZGVDaGlsZHJlbjogZnVuY3Rpb24oc2hvdWxkSGlkZSkKICAgICAqCiAgICAgKiBOb3RlIHRoYXQgc29tZSBjYWxsYmFja3MgYXJlIHN1ZmZpeGVkIHdpdGggYFYyYCBpbiB0aGUgUG9seW1lciAyLnggYmVoYXZpb3IKICAgICAqIGFzIHRoZSBpbXBsZW1lbnRhdGlvbnMgd2lsbCBuZWVkIHRvIGRpZmZlciBmcm9tIHRoZSBjYWxsYmFja3MgcmVxdWlyZWQKICAgICAqIGJ5IHRoZSAxLnggVGVtcGxhdGl6ZXIgQVBJIGR1ZSB0byBjaGFuZ2VzIGluIHRoZSBgVGVtcGxhdGVJbnN0YW5jZWAgQVBJCiAgICAgKiBiZXR3ZWVuIHZlcnNpb25zIDEueCBhbmQgMi54LgogICAgICoKICAgICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgICAqLwogICAgUG9seW1lci5UZW1wbGF0aXplciA9IHsKCiAgICAgIC8qKgogICAgICAgKiBHZW5lcmF0ZXMgYW4gYW5vbnltb3VzIGBUZW1wbGF0ZUluc3RhbmNlYCBjbGFzcyAoc3RvcmVkIGFzIGB0aGlzLmN0b3JgKQogICAgICAgKiBmb3IgdGhlIHByb3ZpZGVkIHRlbXBsYXRlLiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIHBlcgogICAgICAgKiB0ZW1wbGF0ZSB0byBwcmVwYXJlIGFuIGVsZW1lbnQgZm9yIHN0YW1waW5nIHRoZSB0ZW1wbGF0ZSwgZm9sbG93ZWQKICAgICAgICogYnkgYHN0YW1wYCB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiB0aGUgdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIHByZXBhcmUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gbXV0YWJsZURhdGEgV2hlbiBgdHJ1ZWAsIHRoZSBnZW5lcmF0ZWQgY2xhc3Mgd2lsbCBza2lwCiAgICAgICAqICAgc3RyaWN0IGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvCiAgICAgICAqICAgYmUgImRpcnR5IikuIERlZmF1bHRzIHRvIGZhbHNlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAdGhpcyB7VGVtcGxhdGl6ZXJVc2VyfQogICAgICAgKi8KICAgICAgdGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgbXV0YWJsZURhdGEpIHsKICAgICAgICB0aGlzLl90ZW1wbGF0aXplclRlbXBsYXRlID0gdGVtcGxhdGU7CiAgICAgICAgdGhpcy5jdG9yID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUsIHRoaXMsIHsKICAgICAgICAgIG11dGFibGVEYXRhOiBCb29sZWFuKG11dGFibGVEYXRhKSwKICAgICAgICAgIHBhcmVudE1vZGVsOiB0aGlzLl9wYXJlbnRNb2RlbCwKICAgICAgICAgIGluc3RhbmNlUHJvcHM6IHRoaXMuX2luc3RhbmNlUHJvcHMsCiAgICAgICAgICBmb3J3YXJkSG9zdFByb3A6IHRoaXMuX2ZvcndhcmRIb3N0UHJvcFYyLAogICAgICAgICAgbm90aWZ5SW5zdGFuY2VQcm9wOiB0aGlzLl9ub3RpZnlJbnN0YW5jZVByb3BWMgogICAgICAgIH0pOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlIHByZXBhcmVkIGJ5IGB0ZW1wbGF0aXplYC4gIFRoZSBvYmplY3QKICAgICAgICogcmV0dXJuZWQgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFub255bW91cyBjbGFzcyBnZW5lcmF0ZWQgYnkgYHRlbXBsYXRpemVgCiAgICAgICAqIHdob3NlIGByb290YCBwcm9wZXJ0eSBpcyBhIGRvY3VtZW50IGZyYWdtZW50IGNvbnRhaW5pbmcgbmV3bHkgY2xvbmVkCiAgICAgICAqIHRlbXBsYXRlIGNvbnRlbnQsIGFuZCB3aGljaCBoYXMgcHJvcGVydHkgYWNjZXNzb3JzIGNvcnJlc3BvbmRpbmcgdG8KICAgICAgICogcHJvcGVydGllcyByZWZlcmVuY2VkIGluIHRlbXBsYXRlIGJpbmRpbmdzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IG1vZGVsIE9iamVjdCBjb250YWluaW5nIGluaXRpYWwgcHJvcGVydHkgdmFsdWVzIHRvCiAgICAgICAqICAgcG9wdWxhdGUgaW50byB0aGUgdGVtcGxhdGUgYmluZGluZ3MuCiAgICAgICAqIEByZXR1cm4ge1RlbXBsYXRlSW5zdGFuY2VCYXNlfSBSZXR1cm5zIHRoZSBjcmVhdGVkIGluc3RhbmNlIG9mCiAgICAgICAqIHRoZSB0ZW1wbGF0ZSBwcmVwYXJlZCBieSBgdGVtcGxhdGl6ZWAuCiAgICAgICAqIEB0aGlzIHtUZW1wbGF0aXplclVzZXJ9CiAgICAgICAqLwogICAgICBzdGFtcChtb2RlbCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jdG9yKG1vZGVsKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSAibW9kZWwiIChgVGVtcGxhdGVJbnN0YW5jZWApIGFzc29jaWF0ZWQgd2l0aAogICAgICAgKiBhIGdpdmVuIGVsZW1lbnQsIHdoaWNoIHNlcnZlcyBhcyB0aGUgYmluZGluZyBzY29wZSBmb3IgdGhlIHRlbXBsYXRlCiAgICAgICAqIGluc3RhbmNlIHRoZSBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbi4gIEEgdGVtcGxhdGUgbW9kZWwgc2hvdWxkIGJlIHVzZWQKICAgICAgICogdG8gbWFuaXB1bGF0ZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlbXBsYXRlIGluc3RhbmNlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gYSB0ZW1wbGF0ZSBtb2RlbC4KICAgICAgICogQHJldHVybiB7VGVtcGxhdGVJbnN0YW5jZUJhc2V9IE1vZGVsIHJlcHJlc2VudGluZyB0aGUgYmluZGluZyBzY29wZSBmb3IKICAgICAgICogICB0aGUgZWxlbWVudC4KICAgICAgICogQHRoaXMge1RlbXBsYXRpemVyVXNlcn0KICAgICAgICovCiAgICAgIG1vZGVsRm9yRWxlbWVudChlbCkgewogICAgICAgIHJldHVybiBQb2x5bWVyLlRlbXBsYXRpemUubW9kZWxGb3JFbGVtZW50KHRoaXMuX3RlbXBsYXRpemVyVGVtcGxhdGUsIGVsKTsKICAgICAgfQogICAgfTsKCiAgfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtIVE1MRWxlbWVudH0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX09wdGlvbmFsTXV0YWJsZURhdGF9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9HZXN0dXJlRXZlbnRMaXN0ZW5lcnN9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBkb21CaW5kQmFzZSA9CiAgICAgIFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzKAogICAgICAgIFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YSgKICAgICAgICAgIFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKEhUTUxFbGVtZW50KSkpOwoKICAgIC8qKgogICAgICogQ3VzdG9tIGVsZW1lbnQgdG8gYWxsb3cgdXNpbmcgUG9seW1lcidzIHRlbXBsYXRlIGZlYXR1cmVzIChkYXRhIGJpbmRpbmcsCiAgICAgKiBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMsIGV0Yy4pIGluIHRoZSBtYWluIGRvY3VtZW50IHdpdGhvdXQgZGVmaW5pbmcKICAgICAqIGEgbmV3IGN1c3RvbSBlbGVtZW50LgogICAgICoKICAgICAqIGA8dGVtcGxhdGU+YCB0YWdzIHV0aWxpemluZyBiaW5kaW5ncyBtYXkgYmUgd3JhcHBlZCB3aXRoIHRoZSBgPGRvbS1iaW5kPmAKICAgICAqIGVsZW1lbnQsIHdoaWNoIHdpbGwgaW1tZWRpYXRlbHkgc3RhbXAgdGhlIHdyYXBwZWQgdGVtcGxhdGUgaW50byB0aGUgbWFpbgogICAgICogZG9jdW1lbnQgYW5kIGJpbmQgZWxlbWVudHMgdG8gdGhlIGBkb20tYmluZGAgZWxlbWVudCBpdHNlbGYgYXMgdGhlCiAgICAgKiBiaW5kaW5nIHNjb3BlLgogICAgICoKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAY3VzdG9tRWxlbWVudAogICAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cwogICAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5HZXN0dXJlRXZlbnRMaXN0ZW5lcnMKICAgICAqIEBleHRlbmRzIHtkb21CaW5kQmFzZX0KICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0byBhbGxvdyB1c2luZyBQb2x5bWVyJ3MgdGVtcGxhdGUgZmVhdHVyZXMgKGRhdGEKICAgICAqICAgYmluZGluZywgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzLCBldGMuKSBpbiB0aGUgbWFpbiBkb2N1bWVudC4KICAgICAqLwogICAgY2xhc3MgRG9tQmluZCBleHRlbmRzIGRvbUJpbmRCYXNlIHsKCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgeyByZXR1cm4gWydtdXRhYmxlLWRhdGEnXTsgfQoKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICBpZiAoUG9seW1lci5zdHJpY3RUZW1wbGF0ZVBvbGljeSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzdHJpY3RUZW1wbGF0ZVBvbGljeTogZG9tLWJpbmQgbm90IGFsbG93ZWRgKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5yb290ID0gbnVsbDsKICAgICAgICB0aGlzLiQgPSBudWxsOwogICAgICAgIHRoaXMuX19jaGlsZHJlbiA9IG51bGw7CiAgICAgIH0KCiAgICAgIC8qKiBAcmV0dXJuIHt2b2lkfSAqLwogICAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soKSB7CiAgICAgICAgLy8gYXNzdW1lcyBvbmx5IG9uZSBvYnNlcnZlZCBhdHRyaWJ1dGUKICAgICAgICB0aGlzLm11dGFibGVEYXRhID0gdHJ1ZTsKICAgICAgfQoKICAgICAgLyoqIEByZXR1cm4ge3ZvaWR9ICovCiAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICB9CgogICAgICAvKiogQHJldHVybiB7dm9pZH0gKi8KICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgdGhpcy5fX3JlbW92ZUNoaWxkcmVuKCk7CiAgICAgIH0KCiAgICAgIF9faW5zZXJ0Q2hpbGRyZW4oKSB7CiAgICAgICAgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnJvb3QsIHRoaXMpOwogICAgICB9CgogICAgICBfX3JlbW92ZUNoaWxkcmVuKCkgewogICAgICAgIGlmICh0aGlzLl9fY2hpbGRyZW4pIHsKICAgICAgICAgIGZvciAobGV0IGk9MDsgaTx0aGlzLl9fY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5yb290LmFwcGVuZENoaWxkKHRoaXMuX19jaGlsZHJlbltpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gVGhpcyBpcyB0eXBpY2FsbHkgb25seQogICAgICAgKiBuZWNlc3NhcnkgdG8gY2FsbCBpZiBIVE1MSW1wb3J0cyB3aXRoIHRoZSBhc3luYyBhdHRyaWJ1dGUgYXJlIHVzZWQuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICByZW5kZXIoKSB7CiAgICAgICAgbGV0IHRlbXBsYXRlOwogICAgICAgIGlmICghdGhpcy5fX2NoaWxkcmVuKSB7CiAgICAgICAgICB0ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8odGVtcGxhdGUgfHwgdGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKTsKICAgICAgICAgIGlmICghdGVtcGxhdGUpIHsKICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCBjaGlsZExpc3QgY2hhbmdlcyBhbmQgdGVtcGxhdGUgc2hvdWxkIGJlIHRoZXJlIGJ5IHRoZW4KICAgICAgICAgICAgbGV0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgICAgIHRlbXBsYXRlID0gLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50fSAqLyh0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykpOwogICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkb20tYmluZCByZXF1aXJlcyBhIDx0ZW1wbGF0ZT4gY2hpbGQnKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMsIHtjaGlsZExpc3Q6IHRydWV9KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5fc3RhbXBUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgICB0aGlzLiQgPSB0aGlzLnJvb3QuJDsKICAgICAgICAgIHRoaXMuX19jaGlsZHJlbiA9IFtdOwogICAgICAgICAgZm9yIChsZXQgbj10aGlzLnJvb3QuZmlyc3RDaGlsZDsgbjsgbj1uLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgIHRoaXMuX19jaGlsZHJlblt0aGlzLl9fY2hpbGRyZW4ubGVuZ3RoXSA9IG47CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnNlcnRDaGlsZHJlbigpOwogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgIH0KCiAgICB9CgogICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdkb20tYmluZCcsIERvbUJpbmQpOwoKICAgIC8qKiBAY29uc3QgKi8KICAgIFBvbHltZXIuRG9tQmluZCA9IERvbUJpbmQ7CgogIH0pKCk7CgoKCiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qKgogICAgICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgc3RhdGljIHN0cmluZyB2YWx1ZSB3aGljaCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIKICAgICAqIHN0cmluZ3MgYnkgYXNzZXRpbmcgdGhhdCB0aGV5IGhhdmUgYmVlbiBjcmVhdGVkIHZpYSB0aGlzIGNsYXNzLiBUaGUKICAgICAqIGB2YWx1ZWAgcHJvcGVydHkgcmV0dXJucyB0aGUgc3RyaW5nIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCiAgICAgKi8KICAgIGNsYXNzIExpdGVyYWxTdHJpbmcgewogICAgICBjb25zdHJ1Y3RvcihzdHJpbmcpIHsKICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgICB0aGlzLnZhbHVlID0gc3RyaW5nLnRvU3RyaW5nKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gTGl0ZXJhbFN0cmluZyBzdHJpbmcgdmFsdWUKICAgICAgICovCiAgICAgIHRvU3RyaW5nKCkgewogICAgICAgIHJldHVybiB0aGlzLnZhbHVlOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIE9iamVjdCB0byBzdHJpbmdpZnkgaW50byBIVE1MCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEhUTUwgc3RyaW5naWZpZWQgZm9ybSBvZiBgb2JqYAogICAgICovCiAgICBmdW5jdGlvbiBsaXRlcmFsVmFsdWUodmFsdWUpIHsKICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGl0ZXJhbFN0cmluZykgewogICAgICAgIHJldHVybiAvKiogQHR5cGUgeyFMaXRlcmFsU3RyaW5nfSAqLyh2YWx1ZSkudmFsdWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub24tbGl0ZXJhbCB2YWx1ZSBwYXNzZWQgdG8gUG9seW1lci5odG1sTGl0ZXJhbDogJHt2YWx1ZX1gKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBPYmplY3QgdG8gc3RyaW5naWZ5IGludG8gSFRNTAogICAgICogQHJldHVybiB7c3RyaW5nfSBIVE1MIHN0cmluZ2lmaWVkIGZvcm0gb2YgYG9iamAKICAgICAqLwogICAgZnVuY3Rpb24gaHRtbFZhbHVlKHZhbHVlKSB7CiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQpIHsKICAgICAgICByZXR1cm4gLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudCB9ICovKHZhbHVlKS5pbm5lckhUTUw7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXRlcmFsU3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIGxpdGVyYWxWYWx1ZSh2YWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub24tdGVtcGxhdGUgdmFsdWUgcGFzc2VkIHRvIFBvbHltZXIuaHRtbDogJHt2YWx1ZX1gKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB0aGF0IGNyZWF0ZXMgYW4gSFRNTCA8dGVtcGxhdGU+IGVsZW1lbnQgZnJvbSB0aGUKICAgICAqIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcuCiAgICAgKgogICAgICogVGhpcyBhbGxvd3MgeW91IHRvIHdyaXRlIGEgUG9seW1lciBUZW1wbGF0ZSBpbiBKYXZhU2NyaXB0LgogICAgICoKICAgICAqIFRlbXBsYXRlcyBjYW4gYmUgY29tcG9zZWQgYnkgaW50ZXJwb2xhdGluZyBgSFRNTFRlbXBsYXRlRWxlbWVudGBzIGluCiAgICAgKiBleHByZXNzaW9ucyBpbiB0aGUgSmF2YVNjcmlwdCB0ZW1wbGF0ZSBsaXRlcmFsLiBUaGUgbmVzdGVkIHRlbXBsYXRlJ3MKICAgICAqIGBpbm5lckhUTUxgIGlzIGluY2x1ZGVkIGluIHRoZSBjb250YWluaW5nIHRlbXBsYXRlLiAgVGhlIG9ubHkgb3RoZXIKICAgICAqIHZhbHVlcyBhbGxvd2VkIGluIGV4cHJlc3Npb25zIGFyZSB0aG9zZSByZXR1cm5lZCBmcm9tIGBQb2x5bWVyLmh0bWxMaXRlcmFsYAogICAgICogd2hpY2ggZW5zdXJlcyBvbmx5IGxpdGVyYWwgdmFsdWVzIGZyb20gSlMgc291cmNlIGV2ZXIgcmVhY2ggdGhlIEhUTUwsIHRvCiAgICAgKiBndWFyZCBhZ2FpbnN0IFhTUyByaXNrcy4KICAgICAqCiAgICAgKiBBbGwgb3RoZXIgdmFsdWVzIGFyZSBkaXNhbGxvd2VkIGluIGV4cHJlc3Npb25zIHRvIGhlbHAgcHJldmVudCBYU1MKICAgICAqIGF0dGFja3M7IGhvd2V2ZXIsIGBQb2x5bWVyLmh0bWxMaXRlcmFsYCBjYW4gYmUgdXNlZCB0byBjb21wb3NlIHN0YXRpYwogICAgICogc3RyaW5nIHZhbHVlcyBpbnRvIHRlbXBsYXRlcy4gVGhpcyBpcyB1c2VmdWwgdG8gY29tcG9zZSBzdHJpbmdzIGludG8KICAgICAqIHBsYWNlcyB0aGF0IGRvIG5vdCBhY2NlcHQgaHRtbCwgbGlrZSB0aGUgY3NzIHRleHQgb2YgYSBgc3R5bGVgCiAgICAgKiBlbGVtZW50LgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7CiAgICAgKiAgICAgICByZXR1cm4gUG9seW1lci5odG1sYAogICAgICogICAgICAgICA8c3R5bGU+Omhvc3R7IGNvbnRlbnQ6Ii4uLiIgfTwvc3R5bGU+CiAgICAgKiAgICAgICAgIDxkaXYgY2xhc3M9InNoYWRvd2VkIj4ke3RoaXMucGFydGlhbFRlbXBsYXRlfTwvZGl2PgogICAgICogICAgICAgICAke3N1cGVyLnRlbXBsYXRlfQogICAgICogICAgICAgYDsKICAgICAqICAgICB9CiAgICAgKiAgICAgc3RhdGljIGdldCBwYXJ0aWFsVGVtcGxhdGUoKSB7IHJldHVybiBQb2x5bWVyLmh0bWxgPHNwYW4+UGFydGlhbCE8L3NwYW4+YDsgfQogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFJVGVtcGxhdGVBcnJheX0gc3RyaW5ncyBDb25zdGFudCBwYXJ0cyBvZiB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbAogICAgICogQHBhcmFtIHsuLi4qfSB2YWx1ZXMgVmFyaWFibGUgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwKICAgICAqIEByZXR1cm4geyFIVE1MVGVtcGxhdGVFbGVtZW50fSBDb25zdHJ1Y3RlZCBIVE1MVGVtcGxhdGVFbGVtZW50CiAgICAgKi8KICAgIFBvbHltZXIuaHRtbCA9IGZ1bmN0aW9uIGh0bWwoc3RyaW5ncywgLi4udmFsdWVzKSB7CiAgICAgIGNvbnN0IHRlbXBsYXRlID0gLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gKi8oZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKSk7CiAgICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IHZhbHVlcy5yZWR1Y2UoKGFjYywgdiwgaWR4KSA9PgogICAgICAgICAgYWNjICsgaHRtbFZhbHVlKHYpICsgc3RyaW5nc1tpZHggKyAxXSwgc3RyaW5nc1swXSk7CiAgICAgIHJldHVybiB0ZW1wbGF0ZTsKICAgIH07CgogICAgLyoqCiAgICAgKiBBbiBodG1sIGxpdGVyYWwgdGFnIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBgUG9seW1lci5odG1sYCB0byBjb21wb3NlLgogICAgICogYSBsaXRlcmFsIHN0cmluZy4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqICAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgewogICAgICogICAgICAgcmV0dXJuIFBvbHltZXIuaHRtbGAKICAgICAqICAgICAgICAgPHN0eWxlPgogICAgICogICAgICAgICAgIDpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0KICAgICAqICAgICAgICAgICAke3N0eWxlVGVtcGxhdGV9CiAgICAgKiAgICAgICAgIDwvc3R5bGU+CiAgICAgKiAgICAgICAgIDxkaXYgY2xhc3M9InNoYWRvd2VkIj4ke3N0YXRpY1ZhbHVlfTwvZGl2PgogICAgICogICAgICAgICAke3N1cGVyLnRlbXBsYXRlfQogICAgICogICAgICAgYDsKICAgICAqICAgICB9CiAgICAgKiAgICAgc3RhdGljIGdldCBzdHlsZVRlbXBsYXRlKCkgeyByZXR1cm4gUG9seW1lci5odG1sTGl0ZXJhbGAuc2hhZG93ZWQgeyBiYWNrZ3JvdW5kOiBncmF5OyB9YDsgfQogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFJVGVtcGxhdGVBcnJheX0gc3RyaW5ncyBDb25zdGFudCBwYXJ0cyBvZiB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbAogICAgICogQHBhcmFtIHsuLi4qfSB2YWx1ZXMgVmFyaWFibGUgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwKICAgICAqIEByZXR1cm4geyFMaXRlcmFsU3RyaW5nfSBDb25zdHJ1Y3RlZCBsaXRlcmFsIHN0cmluZwogICAgICovCiAgICBQb2x5bWVyLmh0bWxMaXRlcmFsID0gZnVuY3Rpb24oc3RyaW5ncywgLi4udmFsdWVzKSB7CiAgICAgIHJldHVybiBuZXcgTGl0ZXJhbFN0cmluZyh2YWx1ZXMucmVkdWNlKChhY2MsIHYsIGlkeCkgPT4KICAgICAgICAgIGFjYyArIGxpdGVyYWxWYWx1ZSh2KSArIHN0cmluZ3NbaWR4ICsgMV0sIHN0cmluZ3NbMF0pKTsKICAgIH07CiAgfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBCYXNlIGNsYXNzIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MgbWV0YS1wcm9ncmFtbWluZwogICAqIGZlYXR1cmVzIGluY2x1ZGluZyB0ZW1wbGF0ZSBzdGFtcGluZywgZGF0YS1iaW5kaW5nLCBhdHRyaWJ1dGUgZGVzZXJpYWxpemF0aW9uLAogICAqIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24uCiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQGNvbnN0cnVjdG9yCiAgICogQGltcGxlbWVudHMge1BvbHltZXJfRWxlbWVudE1peGlufQogICAqIEBleHRlbmRzIHtIVE1MRWxlbWVudH0KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuRWxlbWVudE1peGluCiAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgYmFzZSBjbGFzcyB0aGF0IHByb3ZpZGVzIHRoZSBjb3JlIEFQSSBmb3IgUG9seW1lcidzCiAgICogICBrZXkgbWV0YS1wcm9ncmFtbWluZyBmZWF0dXJlcyBpbmNsdWRpbmcgdGVtcGxhdGUgc3RhbXBpbmcsIGRhdGEtYmluZGluZywKICAgKiAgIGF0dHJpYnV0ZSBkZXNlcmlhbGl6YXRpb24sIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24KICAgKi8KICBQb2x5bWVyLkVsZW1lbnQgPSBQb2x5bWVyLkVsZW1lbnRNaXhpbihIVE1MRWxlbWVudCk7CgogIC8vIE5PVEU6IHRoaXMgaXMgaGVyZSBmb3IgbW9kdWxpemVyIHRvIGV4cG9ydCBgaHRtbGAgZm9yIHRoZSBtb2R1bGUgdmVyc2lvbiBvZiB0aGlzIGZpbGUKICBQb2x5bWVyLmh0bWwgPSBQb2x5bWVyLmh0bWw7Cn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IFRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5UZW1wbGF0ZUluc3RhbmNlQmFzZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZQoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9PcHRpb25hbE11dGFibGVEYXRhfQogICAqIEBleHRlbmRzIHtQb2x5bWVyLkVsZW1lbnR9CiAgICogQHByaXZhdGUKICAgKi8KICBjb25zdCBkb21SZXBlYXRCYXNlID0gUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhKFBvbHltZXIuRWxlbWVudCk7CgogIC8qKgogICAqIFRoZSBgPGRvbS1yZXBlYXQ+YCBlbGVtZW50IHdpbGwgYXV0b21hdGljYWxseSBzdGFtcCBhbmQgYmluZHMgb25lIGluc3RhbmNlCiAgICogb2YgdGVtcGxhdGUgY29udGVudCB0byBlYWNoIG9iamVjdCBpbiBhIHVzZXItcHJvdmlkZWQgYXJyYXkuCiAgICogYGRvbS1yZXBlYXRgIGFjY2VwdHMgYW4gYGl0ZW1zYCBwcm9wZXJ0eSwgYW5kIG9uZSBpbnN0YW5jZSBvZiB0aGUgdGVtcGxhdGUKICAgKiBpcyBzdGFtcGVkIGZvciBlYWNoIGl0ZW0gaW50byB0aGUgRE9NIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgYGRvbS1yZXBlYXRgCiAgICogZWxlbWVudC4gIFRoZSBgaXRlbWAgcHJvcGVydHkgd2lsbCBiZSBzZXQgb24gZWFjaCBpbnN0YW5jZSdzIGJpbmRpbmcKICAgKiBzY29wZSwgdGh1cyB0ZW1wbGF0ZXMgc2hvdWxkIGJpbmQgdG8gc3ViLXByb3BlcnRpZXMgb2YgYGl0ZW1gLgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqIGBgYGh0bWwKICAgKiA8ZG9tLW1vZHVsZSBpZD0iZW1wbG95ZWUtbGlzdCI+CiAgICoKICAgKiAgIDx0ZW1wbGF0ZT4KICAgKgogICAqICAgICA8ZGl2PiBFbXBsb3llZSBsaXN0OiA8L2Rpdj4KICAgKiAgICAgPGRvbS1yZXBlYXQgaXRlbXM9Int7ZW1wbG95ZWVzfX0iPgogICAqICAgICAgIDx0ZW1wbGF0ZT4KICAgKiAgICAgICAgIDxkaXY+Rmlyc3QgbmFtZTogPHNwYW4+e3tpdGVtLmZpcnN0fX08L3NwYW4+PC9kaXY+CiAgICogICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgIDwvdGVtcGxhdGU+CiAgICoKICAgKiA8L2RvbS1tb2R1bGU+CiAgICogYGBgCiAgICoKICAgKiBXaXRoIHRoZSBmb2xsb3dpbmcgY3VzdG9tIGVsZW1lbnQgZGVmaW5pdGlvbjoKICAgKgogICAqIGBgYGpzCiAgICogY2xhc3MgRW1wbG95ZWVMaXN0IGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZW1wbG95ZWUtbGlzdCc7IH0KICAgKiAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgKiAgICAgcmV0dXJuIHsKICAgKiAgICAgICBlbXBsb3llZXM6IHsKICAgKiAgICAgICAgIHZhbHVlKCkgewogICAqICAgICAgICAgICByZXR1cm4gWwogICAqICAgICAgICAgICAgIHtmaXJzdDogJ0JvYicsIGxhc3Q6ICdTbWl0aCd9LAogICAqICAgICAgICAgICAgIHtmaXJzdDogJ1NhbGx5JywgbGFzdDogJ0pvaG5zb24nfSwKICAgKiAgICAgICAgICAgICAuLi4KICAgKiAgICAgICAgICAgXTsKICAgKiAgICAgICAgIH0KICAgKiAgICAgICB9CiAgICogICAgIH07CiAgICogICB9CiAgICogfQogICAqIGBgYAogICAqCiAgICogTm90aWZpY2F0aW9ucyBmb3IgY2hhbmdlcyB0byBpdGVtcyBzdWItcHJvcGVydGllcyB3aWxsIGJlIGZvcndhcmRlZCB0byB0ZW1wbGF0ZQogICAqIGluc3RhbmNlcywgd2hpY2ggd2lsbCB1cGRhdGUgdmlhIHRoZSBub3JtYWwgc3RydWN0dXJlZCBkYXRhIG5vdGlmaWNhdGlvbiBzeXN0ZW0uCiAgICoKICAgKiBNdXRhdGlvbnMgdG8gdGhlIGBpdGVtc2AgYXJyYXkgaXRzZWxmIHNob3VsZCBiZSBtYWRlIHVzaW5nIHRoZSBBcnJheQogICAqIG11dGF0aW9uIEFQSSdzIG9uIGBQb2x5bWVyLkJhc2VgIChgcHVzaGAsIGBwb3BgLCBgc3BsaWNlYCwgYHNoaWZ0YCwKICAgKiBgdW5zaGlmdGApLCBhbmQgdGVtcGxhdGUgaW5zdGFuY2VzIHdpbGwgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGRhdGEgaW4gdGhlCiAgICogYXJyYXkuCiAgICoKICAgKiBFdmVudHMgY2F1Z2h0IGJ5IGV2ZW50IGhhbmRsZXJzIHdpdGhpbiB0aGUgYGRvbS1yZXBlYXRgIHRlbXBsYXRlIHdpbGwgYmUKICAgKiBkZWNvcmF0ZWQgd2l0aCBhIGBtb2RlbGAgcHJvcGVydHksIHdoaWNoIHJlcHJlc2VudHMgdGhlIGJpbmRpbmcgc2NvcGUgZm9yCiAgICogZWFjaCB0ZW1wbGF0ZSBpbnN0YW5jZS4gIFRoZSBtb2RlbCBpcyBhbiBpbnN0YW5jZSBvZiBQb2x5bWVyLkJhc2UsIGFuZCBzaG91bGQKICAgKiBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgZGF0YSBvbiB0aGUgaW5zdGFuY2UsIGZvciBleGFtcGxlCiAgICogYGV2ZW50Lm1vZGVsLnNldCgnaXRlbS5jaGVja2VkJywgdHJ1ZSk7YC4KICAgKgogICAqIEFsdGVybmF0aXZlbHksIHRoZSBtb2RlbCBmb3IgYSB0ZW1wbGF0ZSBpbnN0YW5jZSBmb3IgYW4gZWxlbWVudCBzdGFtcGVkIGJ5CiAgICogYSBgZG9tLXJlcGVhdGAgY2FuIGJlIG9idGFpbmVkIHVzaW5nIHRoZSBgbW9kZWxGb3JFbGVtZW50YCBBUEkgb24gdGhlCiAgICogYGRvbS1yZXBlYXRgIHRoYXQgc3RhbXBlZCBpdCwgZm9yIGV4YW1wbGUKICAgKiBgdGhpcy4kLmRvbVJlcGVhdC5tb2RlbEZvckVsZW1lbnQoZXZlbnQudGFyZ2V0KS5zZXQoJ2l0ZW0uY2hlY2tlZCcsIHRydWUpO2AuCiAgICogVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBtYW5pcHVsYXRpbmcgaW5zdGFuY2UgZGF0YSBvZiBldmVudCB0YXJnZXRzIG9idGFpbmVkCiAgICogYnkgZXZlbnQgaGFuZGxlcnMgb24gcGFyZW50cyBvZiB0aGUgYGRvbS1yZXBlYXRgIChldmVudCBkZWxlZ2F0aW9uKS4KICAgKgogICAqIEEgdmlldy1zcGVjaWZpYyBmaWx0ZXIvc29ydCBtYXkgYmUgYXBwbGllZCB0byBlYWNoIGBkb20tcmVwZWF0YCBieSBzdXBwbHlpbmcgYQogICAqIGBmaWx0ZXJgIGFuZC9vciBgc29ydGAgcHJvcGVydHkuICBUaGlzIG1heSBiZSBhIHN0cmluZyB0aGF0IG5hbWVzIGEgZnVuY3Rpb24gb24KICAgKiB0aGUgaG9zdCwgb3IgYSBmdW5jdGlvbiBtYXkgYmUgYXNzaWduZWQgdG8gdGhlIHByb3BlcnR5IGRpcmVjdGx5LiAgVGhlIGZ1bmN0aW9ucwogICAqIHNob3VsZCBpbXBsZW1lbnRlZCBmb2xsb3dpbmcgdGhlIHN0YW5kYXJkIGBBcnJheWAgZmlsdGVyL3NvcnQgQVBJLgogICAqCiAgICogSW4gb3JkZXIgdG8gcmUtcnVuIHRoZSBmaWx0ZXIgb3Igc29ydCBmdW5jdGlvbnMgYmFzZWQgb24gY2hhbmdlcyB0byBzdWItZmllbGRzCiAgICogb2YgYGl0ZW1zYCwgdGhlIGBvYnNlcnZlYCBwcm9wZXJ0eSBtYXkgYmUgc2V0IGFzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YKICAgKiBgaXRlbWAgc3ViLWZpZWxkcyB0aGF0IHNob3VsZCBjYXVzZSBhIHJlLWZpbHRlci9zb3J0IHdoZW4gbW9kaWZpZWQuICBJZgogICAqIHRoZSBmaWx0ZXIgb3Igc29ydCBmdW5jdGlvbiBkZXBlbmRzIG9uIHByb3BlcnRpZXMgbm90IGNvbnRhaW5lZCBpbiBgaXRlbXNgLAogICAqIHRoZSB1c2VyIHNob3VsZCBvYnNlcnZlIGNoYW5nZXMgdG8gdGhvc2UgcHJvcGVydGllcyBhbmQgY2FsbCBgcmVuZGVyYCB0byB1cGRhdGUKICAgKiB0aGUgdmlldyBiYXNlZCBvbiB0aGUgZGVwZW5kZW5jeSBjaGFuZ2UuCiAgICoKICAgKiBGb3IgZXhhbXBsZSwgZm9yIGFuIGBkb20tcmVwZWF0YCB3aXRoIGEgZmlsdGVyIG9mIHRoZSBmb2xsb3dpbmc6CiAgICoKICAgKiBgYGBqcwogICAqIGlzRW5naW5lZXIoaXRlbSkgewogICAqICAgcmV0dXJuIGl0ZW0udHlwZSA9PSAnZW5naW5lZXInIHx8IGl0ZW0ubWFuYWdlci50eXBlID09ICdlbmdpbmVlcic7CiAgICogfQogICAqIGBgYAogICAqCiAgICogVGhlbiB0aGUgYG9ic2VydmVgIHByb3BlcnR5IHNob3VsZCBiZSBjb25maWd1cmVkIGFzIGZvbGxvd3M6CiAgICoKICAgKiBgYGBodG1sCiAgICogPGRvbS1yZXBlYXQgaXRlbXM9Int7ZW1wbG95ZWVzfX0iIGZpbHRlcj0iaXNFbmdpbmVlciIgb2JzZXJ2ZT0idHlwZSBtYW5hZ2VyLnR5cGUiPgogICAqIGBgYAogICAqCiAgICogQGN1c3RvbUVsZW1lbnQKICAgKiBAcG9seW1lcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQGV4dGVuZHMge2RvbVJlcGVhdEJhc2V9CiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCBmb3Igc3RhbXBpbmcgaW5zdGFuY2Ugb2YgYSB0ZW1wbGF0ZSBib3VuZCB0bwogICAqICAgaXRlbXMgaW4gYW4gYXJyYXkuCiAgICovCiAgY2xhc3MgRG9tUmVwZWF0IGV4dGVuZHMgZG9tUmVwZWF0QmFzZSB7CgogICAgLy8gTm90IG5lZWRlZCB0byBmaW5kIHRlbXBsYXRlOyBjYW4gYmUgcmVtb3ZlZCBvbmNlIHRoZSBhbmFseXplcgogICAgLy8gY2FuIGZpbmQgdGhlIHRhZyBuYW1lIGZyb20gY3VzdG9tRWxlbWVudHMuZGVmaW5lIGNhbGwKICAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZG9tLXJlcGVhdCc7IH0KCiAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgeyByZXR1cm4gbnVsbDsgfQoKICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKCiAgICAgIC8qKgogICAgICAgKiBGaXJlZCB3aGVuZXZlciBET00gaXMgYWRkZWQgb3IgcmVtb3ZlZCBieSB0aGlzIHRlbXBsYXRlIChieQogICAgICAgKiBkZWZhdWx0LCByZW5kZXJpbmcgb2NjdXJzIGxhemlseSkuICBUbyBmb3JjZSBpbW1lZGlhdGUgcmVuZGVyaW5nLCBjYWxsCiAgICAgICAqIGByZW5kZXJgLgogICAgICAgKgogICAgICAgKiBAZXZlbnQgZG9tLWNoYW5nZQogICAgICAgKi8KICAgICAgcmV0dXJuIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQW4gYXJyYXkgY29udGFpbmluZyBpdGVtcyBkZXRlcm1pbmluZyBob3cgbWFueSBpbnN0YW5jZXMgb2YgdGhlIHRlbXBsYXRlCiAgICAgICAgICogdG8gc3RhbXAgYW5kIHRoYXQgdGhhdCBlYWNoIHRlbXBsYXRlIGluc3RhbmNlIHNob3VsZCBiaW5kIHRvLgogICAgICAgICAqLwogICAgICAgIGl0ZW1zOiB7CiAgICAgICAgICB0eXBlOiBBcnJheQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBhZGQgdG8gdGhlIGJpbmRpbmcgc2NvcGUgZm9yIHRoZSBhcnJheQogICAgICAgICAqIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgYXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaXRlbScKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gYWRkIHRvIHRoZSBiaW5kaW5nIHNjb3BlIHdpdGggdGhlIGluZGV4CiAgICAgICAgICogb2YgdGhlIGluc3RhbmNlIGluIHRoZSBzb3J0ZWQgYW5kIGZpbHRlcmVkIGxpc3Qgb2YgcmVuZGVyZWQgaXRlbXMuCiAgICAgICAgICogTm90ZSwgZm9yIHRoZSBpbmRleCBpbiB0aGUgYHRoaXMuaXRlbXNgIGFycmF5LCB1c2UgdGhlIHZhbHVlIG9mIHRoZQogICAgICAgICAqIGBpdGVtc0luZGV4QXNgIHByb3BlcnR5LgogICAgICAgICAqLwogICAgICAgIGluZGV4QXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaW5kZXgnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGFkZCB0byB0aGUgYmluZGluZyBzY29wZSB3aXRoIHRoZSBpbmRleAogICAgICAgICAqIG9mIHRoZSBpbnN0YW5jZSBpbiB0aGUgYHRoaXMuaXRlbXNgIGFycmF5LiBOb3RlLCBmb3IgdGhlIGluZGV4IG9mCiAgICAgICAgICogdGhpcyBpbnN0YW5jZSBpbiB0aGUgc29ydGVkIGFuZCBmaWx0ZXJlZCBsaXN0IG9mIHJlbmRlcmVkIGl0ZW1zLAogICAgICAgICAqIHVzZSB0aGUgdmFsdWUgb2YgdGhlIGBpbmRleEFzYCBwcm9wZXJ0eS4KICAgICAgICAgKi8KICAgICAgICBpdGVtc0luZGV4QXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaXRlbXNJbmRleCcKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGRldGVybWluZSB0aGUgc29ydCBvcmRlciBvZiB0aGUgaXRlbXMuICBUaGlzCiAgICAgICAgICogcHJvcGVydHkgc2hvdWxkIGVpdGhlciBiZSBwcm92aWRlZCBhcyBhIHN0cmluZywgaW5kaWNhdGluZyBhIG1ldGhvZAogICAgICAgICAqIG5hbWUgb24gdGhlIGVsZW1lbnQncyBob3N0LCBvciBlbHNlIGJlIGFuIGFjdHVhbCBmdW5jdGlvbi4gIFRoZQogICAgICAgICAqIGZ1bmN0aW9uIHNob3VsZCBtYXRjaCB0aGUgc29ydCBmdW5jdGlvbiBwYXNzZWQgdG8gYEFycmF5LnNvcnRgLgogICAgICAgICAqIFVzaW5nIGEgc29ydCBmdW5jdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSB1bmRlcmx5aW5nIGBpdGVtc2AgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgc29ydDogewogICAgICAgICAgdHlwZTogRnVuY3Rpb24sCiAgICAgICAgICBvYnNlcnZlcjogJ19fc29ydENoYW5nZWQnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGZpbHRlciBpdGVtcyBvdXQgb2YgdGhlIHZpZXcuICBUaGlzCiAgICAgICAgICogcHJvcGVydHkgc2hvdWxkIGVpdGhlciBiZSBwcm92aWRlZCBhcyBhIHN0cmluZywgaW5kaWNhdGluZyBhIG1ldGhvZAogICAgICAgICAqIG5hbWUgb24gdGhlIGVsZW1lbnQncyBob3N0LCBvciBlbHNlIGJlIGFuIGFjdHVhbCBmdW5jdGlvbi4gIFRoZQogICAgICAgICAqIGZ1bmN0aW9uIHNob3VsZCBtYXRjaCB0aGUgc29ydCBmdW5jdGlvbiBwYXNzZWQgdG8gYEFycmF5LmZpbHRlcmAuCiAgICAgICAgICogVXNpbmcgYSBmaWx0ZXIgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgdW5kZXJseWluZyBgaXRlbXNgIGFycmF5LgogICAgICAgICAqLwogICAgICAgIGZpbHRlcjogewogICAgICAgICAgdHlwZTogRnVuY3Rpb24sCiAgICAgICAgICBvYnNlcnZlcjogJ19fZmlsdGVyQ2hhbmdlZCcKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIHVzaW5nIGEgYGZpbHRlcmAgb3IgYHNvcnRgIGZ1bmN0aW9uLCB0aGUgYG9ic2VydmVgIHByb3BlcnR5CiAgICAgICAgICogc2hvdWxkIGJlIHNldCB0byBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBuYW1lcyBvZiBpdGVtCiAgICAgICAgICogc3ViLWZpZWxkcyB0aGF0IHNob3VsZCB0cmlnZ2VyIGEgcmUtc29ydCBvciByZS1maWx0ZXIgd2hlbiBjaGFuZ2VkLgogICAgICAgICAqIFRoZXNlIHNob3VsZCBnZW5lcmFsbHkgYmUgZmllbGRzIG9mIGBpdGVtYCB0aGF0IHRoZSBzb3J0IG9yIGZpbHRlcgogICAgICAgICAqIGZ1bmN0aW9uIGRlcGVuZHMgb24uCiAgICAgICAgICovCiAgICAgICAgb2JzZXJ2ZTogewogICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgb2JzZXJ2ZXI6ICdfX29ic2VydmVDaGFuZ2VkJwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZW4gdXNpbmcgYSBgZmlsdGVyYCBvciBgc29ydGAgZnVuY3Rpb24sIHRoZSBgZGVsYXlgIHByb3BlcnR5CiAgICAgICAgICogZGV0ZXJtaW5lcyBhIGRlYm91bmNlIHRpbWUgaW4gbXMgYWZ0ZXIgYSBjaGFuZ2UgdG8gb2JzZXJ2ZWQgaXRlbQogICAgICAgICAqIHByb3BlcnRpZXMgdGhhdCBtdXN0IHBhc3MgYmVmb3JlIHRoZSBmaWx0ZXIgb3Igc29ydCBpcyByZS1ydW4uCiAgICAgICAgICogVGhpcyBpcyB1c2VmdWwgaW4gcmF0ZS1saW1pdGluZyBzaHVmZmxpbmcgb2YgdGhlIHZpZXcgd2hlbgogICAgICAgICAqIGl0ZW0gY2hhbmdlcyBtYXkgYmUgZnJlcXVlbnQuCiAgICAgICAgICovCiAgICAgICAgZGVsYXk6IE51bWJlciwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ291bnQgb2YgY3VycmVudGx5IHJlbmRlcmVkIGl0ZW1zIGFmdGVyIGBmaWx0ZXJgIChpZiBhbnkpIGhhcyBiZWVuIGFwcGxpZWQuCiAgICAgICAgICogSWYgImNodW5raW5nIG1vZGUiIGlzIGVuYWJsZWQsIGByZW5kZXJlZEl0ZW1Db3VudGAgaXMgdXBkYXRlZCBlYWNoIHRpbWUgYQogICAgICAgICAqIHNldCBvZiB0ZW1wbGF0ZSBpbnN0YW5jZXMgaXMgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKi8KICAgICAgICByZW5kZXJlZEl0ZW1Db3VudDogewogICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgICAgcmVhZE9ubHk6IHRydWUKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZpbmVzIGFuIGluaXRpYWwgY291bnQgb2YgdGVtcGxhdGUgaW5zdGFuY2VzIHRvIHJlbmRlciBhZnRlciBzZXR0aW5nCiAgICAgICAgICogdGhlIGBpdGVtc2AgYXJyYXksIGJlZm9yZSB0aGUgbmV4dCBwYWludCwgYW5kIHB1dHMgdGhlIGBkb20tcmVwZWF0YAogICAgICAgICAqIGludG8gImNodW5raW5nIG1vZGUiLiAgVGhlIHJlbWFpbmluZyBpdGVtcyB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJlbmRlcmVkCiAgICAgICAgICogaW5jcmVtZW50YWxseSBhdCBlYWNoIGFuaW1hdGlvbiBmcmFtZSB0aGVyb2YgdW50aWwgYWxsIGluc3RhbmNlcyBoYXZlCiAgICAgICAgICogYmVlbiByZW5kZXJlZC4KICAgICAgICAgKi8KICAgICAgICBpbml0aWFsQ291bnQ6IHsKICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICAgIG9ic2VydmVyOiAnX19pbml0aWFsaXplQ2h1bmtpbmcnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV2hlbiBgaW5pdGlhbENvdW50YCBpcyB1c2VkLCB0aGlzIHByb3BlcnR5IGRlZmluZXMgYSBmcmFtZSByYXRlIChpbgogICAgICAgICAqIGZwcykgdG8gdGFyZ2V0IGJ5IHRocm90dGxpbmcgdGhlIG51bWJlciBvZiBpbnN0YW5jZXMgcmVuZGVyZWQgZWFjaAogICAgICAgICAqIGZyYW1lIHRvIG5vdCBleGNlZWQgdGhlIGJ1ZGdldCBmb3IgdGhlIHRhcmdldCBmcmFtZSByYXRlLiAgVGhlCiAgICAgICAgICogZnJhbWVyYXRlIGlzIGVmZmVjdGl2ZWx5IHRoZSBudW1iZXIgb2YgYHJlcXVlc3RBbmltYXRpb25GcmFtZWBzIHRoYXQKICAgICAgICAgKiBpdCB0cmllcyB0byBhbGxvdyB0byBhY3R1YWxseSBmaXJlIGluIGEgZ2l2ZW4gc2Vjb25kLiBJdCBkb2VzIHRoaXMKICAgICAgICAgKiBieSBtZWFzdXJpbmcgdGhlIHRpbWUgYmV0d2VlbiBgckFGYHMgYW5kIGNvbnRpbnVvdXNseSBhZGp1c3RpbmcgdGhlCiAgICAgICAgICogbnVtYmVyIG9mIGl0ZW1zIGNyZWF0ZWQgZWFjaCBgckFGYCB0byBtYWludGFpbiB0aGUgdGFyZ2V0IGZyYW1lcmF0ZS4KICAgICAgICAgKiBTZXR0aW5nIHRoaXMgdG8gYSBoaWdoZXIgbnVtYmVyIGFsbG93cyBsb3dlciBsYXRlbmN5IGFuZCBoaWdoZXIKICAgICAgICAgKiB0aHJvdWdocHV0IGZvciBldmVudCBoYW5kbGVycyBhbmQgb3RoZXIgdGFza3MsIGJ1dCByZXN1bHRzIGluIGEKICAgICAgICAgKiBsb25nZXIgdGltZSBmb3IgdGhlIHJlbWFpbmluZyBpdGVtcyB0byBjb21wbGV0ZSByZW5kZXJpbmcuCiAgICAgICAgICovCiAgICAgICAgdGFyZ2V0RnJhbWVyYXRlOiB7CiAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICB2YWx1ZTogMjAKICAgICAgICB9LAoKICAgICAgICBfdGFyZ2V0RnJhbWVUaW1lOiB7CiAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICBjb21wdXRlZDogJ19fY29tcHV0ZUZyYW1lVGltZSh0YXJnZXRGcmFtZXJhdGUpJwogICAgICAgIH0KCiAgICAgIH07CgogICAgfQoKICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICByZXR1cm4gWyAnX19pdGVtc0NoYW5nZWQoaXRlbXMuKiknIF07CiAgICB9CgogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuX19pbnN0YW5jZXMgPSBbXTsKICAgICAgdGhpcy5fX2xpbWl0ID0gSW5maW5pdHk7CiAgICAgIHRoaXMuX19wb29sID0gW107CiAgICAgIHRoaXMuX19yZW5kZXJEZWJvdW5jZXIgPSBudWxsOwogICAgICB0aGlzLl9faXRlbXNJZHhUb0luc3RJZHggPSB7fTsKICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSBudWxsOwogICAgICB0aGlzLl9fbGFzdENodW5rVGltZSA9IG51bGw7CiAgICAgIHRoaXMuX19zb3J0Rm4gPSBudWxsOwogICAgICB0aGlzLl9fZmlsdGVyRm4gPSBudWxsOwogICAgICB0aGlzLl9fb2JzZXJ2ZVBhdGhzID0gbnVsbDsKICAgICAgdGhpcy5fX2N0b3IgPSBudWxsOwogICAgICB0aGlzLl9faXNEZXRhY2hlZCA9IHRydWU7CiAgICAgIHRoaXMudGVtcGxhdGUgPSBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuX19pc0RldGFjaGVkID0gdHJ1ZTsKICAgICAgZm9yIChsZXQgaT0wOyBpPHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0aGlzLl9fZGV0YWNoSW5zdGFuY2UoaSk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgIC8vIG9ubHkgcGVyZm9ybSBhdHRhY2htZW50IGlmIHRoZSBlbGVtZW50IHdhcyBwcmV2aW91c2x5IGRldGFjaGVkLgogICAgICBpZiAodGhpcy5fX2lzRGV0YWNoZWQpIHsKICAgICAgICB0aGlzLl9faXNEZXRhY2hlZCA9IGZhbHNlOwogICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRoaXMuX19hdHRhY2hJbnN0YW5jZShpLCBwYXJlbnQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIF9fZW5zdXJlVGVtcGxhdGl6ZWQoKSB7CiAgICAgIC8vIFRlbXBsYXRpemluZyAoZ2VuZXJhdGluZyB0aGUgaW5zdGFuY2UgY29uc3RydWN0b3IpIG5lZWRzIHRvIHdhaXQKICAgICAgLy8gdW50aWwgcmVhZHksIHNpbmNlIHdvbid0IGhhdmUgaXRzIHRlbXBsYXRlIGNvbnRlbnQgaGFuZGVkIGJhY2sgdG8KICAgICAgLy8gaXQgdW50aWwgdGhlbgogICAgICBpZiAoIXRoaXMuX19jdG9yKSB7CiAgICAgICAgbGV0IHRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8odGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKTsKICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAvLyAvLyBXYWl0IHVudGlsIGNoaWxkTGlzdCBjaGFuZ2VzIGFuZCB0ZW1wbGF0ZSBzaG91bGQgYmUgdGhlcmUgYnkgdGhlbgogICAgICAgICAgbGV0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgICBpZiAodGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKSB7CiAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgIHRoaXMuX19yZW5kZXIoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RvbS1yZXBlYXQgcmVxdWlyZXMgYSA8dGVtcGxhdGU+IGNoaWxkJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7Y2hpbGRMaXN0OiB0cnVlfSk7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIFRlbXBsYXRlIGluc3RhbmNlIHByb3BzIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gZm9yd2FyZGluZwogICAgICAgIGxldCBpbnN0YW5jZVByb3BzID0ge307CiAgICAgICAgaW5zdGFuY2VQcm9wc1t0aGlzLmFzXSA9IHRydWU7CiAgICAgICAgaW5zdGFuY2VQcm9wc1t0aGlzLmluZGV4QXNdID0gdHJ1ZTsKICAgICAgICBpbnN0YW5jZVByb3BzW3RoaXMuaXRlbXNJbmRleEFzXSA9IHRydWU7CiAgICAgICAgdGhpcy5fX2N0b3IgPSBQb2x5bWVyLlRlbXBsYXRpemUudGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgdGhpcywgewogICAgICAgICAgbXV0YWJsZURhdGE6IHRoaXMubXV0YWJsZURhdGEsCiAgICAgICAgICBwYXJlbnRNb2RlbDogdHJ1ZSwKICAgICAgICAgIGluc3RhbmNlUHJvcHM6IGluc3RhbmNlUHJvcHMsCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEB0aGlzIHt0aGlzfQogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgdG8gc2V0CiAgICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldCBwcm9wZXJ0eSB0bwogICAgICAgICAgICovCiAgICAgICAgICBmb3J3YXJkSG9zdFByb3A6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKSB7CiAgICAgICAgICAgIGxldCBpJCA9IHRoaXMuX19pbnN0YW5jZXM7CiAgICAgICAgICAgIGZvciAobGV0IGk9MCwgaW5zdDsgKGk8aSQubGVuZ3RoKSAmJiAoaW5zdD1pJFtpXSk7IGkrKykgewogICAgICAgICAgICAgIGluc3QuZm9yd2FyZEhvc3RQcm9wKHByb3AsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIC8qKgogICAgICAgICAgICogQHRoaXMge3RoaXN9CiAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5zdCBJbnN0YW5jZSB0byBub3RpZnkKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IHRvIG5vdGlmeQogICAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBub3RpZnkKICAgICAgICAgICAqLwogICAgICAgICAgbm90aWZ5SW5zdGFuY2VQcm9wOiBmdW5jdGlvbihpbnN0LCBwcm9wLCB2YWx1ZSkgewogICAgICAgICAgICBpZiAoUG9seW1lci5QYXRoLm1hdGNoZXModGhpcy5hcywgcHJvcCkpIHsKICAgICAgICAgICAgICBsZXQgaWR4ID0gaW5zdFt0aGlzLml0ZW1zSW5kZXhBc107CiAgICAgICAgICAgICAgaWYgKHByb3AgPT0gdGhpcy5hcykgewogICAgICAgICAgICAgICAgdGhpcy5pdGVtc1tpZHhdID0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGxldCBwYXRoID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZSh0aGlzLmFzLCAnaXRlbXMuJyArIGlkeCwgcHJvcCk7CiAgICAgICAgICAgICAgdGhpcy5ub3RpZnlQYXRoKHBhdGgsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIF9fZ2V0TWV0aG9kSG9zdCgpIHsKICAgICAgLy8gVGVjaG5pY2FsbHkgdGhpcyBzaG91bGQgYmUgdGhlIG93bmVyIG9mIHRoZSBvdXRlcm1vc3QgdGVtcGxhdGUuCiAgICAgIC8vIEluIHNoYWRvdyBkb20sIHRoaXMgaXMgYWx3YXlzIGdldFJvb3ROb2RlKCkuaG9zdCwgYnV0IHdlIGNhbgogICAgICAvLyBhcHByb3hpbWF0ZSB0aGlzIHZpYSBjb29wZXJhdGlvbiB3aXRoIG91ciBkYXRhSG9zdCBhbHdheXMgc2V0dGluZwogICAgICAvLyBgX21ldGhvZEhvc3RgIGFzIGxvbmcgYXMgdGhlcmUgd2VyZSBiaW5kaW5ncyAob3IgaWQncykgb24gdGhpcwogICAgICAvLyBpbnN0YW5jZSBjYXVzaW5nIGl0IHRvIGdldCBhIGRhdGFIb3N0LgogICAgICByZXR1cm4gdGhpcy5fX2RhdGFIb3N0Ll9tZXRob2RIb3N0IHx8IHRoaXMuX19kYXRhSG9zdDsKICAgIH0KCiAgICBfX2Z1bmN0aW9uRnJvbVByb3BlcnR5VmFsdWUoZnVuY3Rpb25Pck1ldGhvZE5hbWUpIHsKICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbk9yTWV0aG9kTmFtZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICBsZXQgbWV0aG9kTmFtZSA9IGZ1bmN0aW9uT3JNZXRob2ROYW1lOwogICAgICAgIGxldCBvYmogPSB0aGlzLl9fZ2V0TWV0aG9kSG9zdCgpOwogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIG9ialttZXRob2ROYW1lXS5hcHBseShvYmosIGFyZ3VtZW50cyk7IH07CiAgICAgIH0KCiAgICAgIHJldHVybiBmdW5jdGlvbk9yTWV0aG9kTmFtZTsKICAgIH0KCiAgICBfX3NvcnRDaGFuZ2VkKHNvcnQpIHsKICAgICAgdGhpcy5fX3NvcnRGbiA9IHRoaXMuX19mdW5jdGlvbkZyb21Qcm9wZXJ0eVZhbHVlKHNvcnQpOwogICAgICBpZiAodGhpcy5pdGVtcykgeyB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcik7IH0KICAgIH0KCiAgICBfX2ZpbHRlckNoYW5nZWQoZmlsdGVyKSB7CiAgICAgIHRoaXMuX19maWx0ZXJGbiA9IHRoaXMuX19mdW5jdGlvbkZyb21Qcm9wZXJ0eVZhbHVlKGZpbHRlcik7CiAgICAgIGlmICh0aGlzLml0ZW1zKSB7IHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyKTsgfQogICAgfQoKICAgIF9fY29tcHV0ZUZyYW1lVGltZShyYXRlKSB7CiAgICAgIHJldHVybiBNYXRoLmNlaWwoMTAwMC9yYXRlKTsKICAgIH0KCiAgICBfX2luaXRpYWxpemVDaHVua2luZygpIHsKICAgICAgaWYgKHRoaXMuaW5pdGlhbENvdW50KSB7CiAgICAgICAgdGhpcy5fX2xpbWl0ID0gdGhpcy5pbml0aWFsQ291bnQ7CiAgICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSB0aGlzLmluaXRpYWxDb3VudDsKICAgICAgICB0aGlzLl9fbGFzdENodW5rVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICB9CiAgICB9CgogICAgX190cnlSZW5kZXJDaHVuaygpIHsKICAgICAgLy8gRGVib3VuY2VkIHNvIHRoYXQgbXVsdGlwbGUgY2FsbHMgdGhyb3VnaCBgX3JlbmRlcmAgYmV0d2VlbiBhbmltYXRpb24KICAgICAgLy8gZnJhbWVzIG9ubHkgcXVldWUgb25lIG5ldyByQUYgKGUuZy4gYXJyYXkgbXV0YXRpb24gJiBjaHVua2VkIHJlbmRlcikKICAgICAgaWYgKHRoaXMuaXRlbXMgJiYgdGhpcy5fX2xpbWl0IDwgdGhpcy5pdGVtcy5sZW5ndGgpIHsKICAgICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlcXVlc3RSZW5kZXJDaHVuayk7CiAgICAgIH0KICAgIH0KCiAgICBfX3JlcXVlc3RSZW5kZXJDaHVuaygpIHsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLl9fcmVuZGVyQ2h1bmsoKSk7CiAgICB9CgogICAgX19yZW5kZXJDaHVuaygpIHsKICAgICAgLy8gU2ltcGxlIGF1dG8gY2h1bmtTaXplIHRocm90dGxpbmcgYWxnb3JpdGhtIGJhc2VkIG9uIGZlZWRiYWNrIGxvb3A6CiAgICAgIC8vIG1lYXN1cmUgYWN0dWFsIHRpbWUgYmV0d2VlbiBmcmFtZXMgYW5kIHNjYWxlIGNodW5rIGNvdW50IGJ5IHJhdGlvCiAgICAgIC8vIG9mIHRhcmdldC9hY3R1YWwgZnJhbWUgdGltZQogICAgICBsZXQgY3VyckNodW5rVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICBsZXQgcmF0aW8gPSB0aGlzLl90YXJnZXRGcmFtZVRpbWUgLyAoY3VyckNodW5rVGltZSAtIHRoaXMuX19sYXN0Q2h1bmtUaW1lKTsKICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSBNYXRoLnJvdW5kKHRoaXMuX19jaHVua0NvdW50ICogcmF0aW8pIHx8IDE7CiAgICAgIHRoaXMuX19saW1pdCArPSB0aGlzLl9fY2h1bmtDb3VudDsKICAgICAgdGhpcy5fX2xhc3RDaHVua1RpbWUgPSBjdXJyQ2h1bmtUaW1lOwogICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcik7CiAgICB9CgogICAgX19vYnNlcnZlQ2hhbmdlZCgpIHsKICAgICAgdGhpcy5fX29ic2VydmVQYXRocyA9IHRoaXMub2JzZXJ2ZSAmJgogICAgICAgIHRoaXMub2JzZXJ2ZS5yZXBsYWNlKCcuKicsICcuJykuc3BsaXQoJyAnKTsKICAgIH0KCiAgICBfX2l0ZW1zQ2hhbmdlZChjaGFuZ2UpIHsKICAgICAgaWYgKHRoaXMuaXRlbXMgJiYgIUFycmF5LmlzQXJyYXkodGhpcy5pdGVtcykpIHsKICAgICAgICBjb25zb2xlLndhcm4oJ2RvbS1yZXBlYXQgZXhwZWN0ZWQgYXJyYXkgZm9yIGBpdGVtc2AsIGZvdW5kJywgdGhpcy5pdGVtcyk7CiAgICAgIH0KICAgICAgLy8gSWYgcGF0aCB3YXMgdG8gYW4gaXRlbSAoZS5nLiAnaXRlbXMuMycgb3IgJ2l0ZW1zLjMuZm9vJyksIGZvcndhcmQgdGhlCiAgICAgIC8vIHBhdGggdG8gdGhhdCBpbnN0YW5jZSBzeW5jaHJvbm91c2x5IChyZXR1cm5zIGZhbHNlIGZvciBub24taXRlbSBwYXRocykKICAgICAgaWYgKCF0aGlzLl9faGFuZGxlSXRlbVBhdGgoY2hhbmdlLnBhdGgsIGNoYW5nZS52YWx1ZSkpIHsKICAgICAgICAvLyBPdGhlcndpc2UsIHRoZSBhcnJheSB3YXMgcmVzZXQgKCdpdGVtcycpIG9yIHNwbGljZWQgKCdpdGVtcy5zcGxpY2VzJyksCiAgICAgICAgLy8gc28gcXVldWUgYSBmdWxsIHJlZnJlc2gKICAgICAgICB0aGlzLl9faW5pdGlhbGl6ZUNodW5raW5nKCk7CiAgICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIpOwogICAgICB9CiAgICB9CgogICAgX19oYW5kbGVPYnNlcnZlZFBhdGhzKHBhdGgpIHsKICAgICAgLy8gSGFuZGxlIGNhc2VzIHdoZXJlIHBhdGggY2hhbmdlcyBzaG91bGQgY2F1c2UgYSByZS1zb3J0L2ZpbHRlcgogICAgICBpZiAodGhpcy5fX3NvcnRGbiB8fCB0aGlzLl9fZmlsdGVyRm4pIHsKICAgICAgICBpZiAoIXBhdGgpIHsKICAgICAgICAgIC8vIEFsd2F5cyByZS1yZW5kZXIgaWYgdGhlIGl0ZW0gaXRzZWxmIGNoYW5nZWQKICAgICAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyLCB0aGlzLmRlbGF5KTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX19vYnNlcnZlUGF0aHMpIHsKICAgICAgICAgIC8vIE90aGVyd2lzZSwgcmUtcmVuZGVyIGlmIHRoZSBwYXRoIGNoYW5nZWQgbWF0Y2hlcyBhbiBvYnNlcnZlZCBwYXRoCiAgICAgICAgICBsZXQgcGF0aHMgPSB0aGlzLl9fb2JzZXJ2ZVBhdGhzOwogICAgICAgICAgZm9yIChsZXQgaT0wOyBpPHBhdGhzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YocGF0aHNbaV0pID09PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIsIHRoaXMuZGVsYXkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHRoaXM6RG9tUmVwZWF0KX0gZm4gRnVuY3Rpb24gdG8gZGVib3VuY2UuCiAgICAgKiBAcGFyYW0ge251bWJlcj19IGRlbGF5IERlbGF5IGluIG1zIHRvIGRlYm91bmNlIGJ5LgogICAgICovCiAgICBfX2RlYm91bmNlUmVuZGVyKGZuLCBkZWxheSA9IDApIHsKICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgICB0aGlzLl9fcmVuZGVyRGVib3VuY2VyCiAgICAgICAgICAsIGRlbGF5ID4gMCA/IFBvbHltZXIuQXN5bmMudGltZU91dC5hZnRlcihkZWxheSkgOiBQb2x5bWVyLkFzeW5jLm1pY3JvVGFzawogICAgICAgICAgLCBmbi5iaW5kKHRoaXMpKTsKICAgICAgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyKHRoaXMuX19yZW5kZXJEZWJvdW5jZXIpOwogICAgfQoKICAgIC8qKgogICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gTm9ybWFsbHkgcmVuZGVyaW5nIGlzCiAgICAgKiBhc3luY2hyb25vdXMgdG8gYSBwcm92b2tpbmcgY2hhbmdlLiBUaGlzIGlzIGRvbmUgZm9yIGVmZmljaWVuY3kgc28KICAgICAqIHRoYXQgbXVsdGlwbGUgY2hhbmdlcyB0cmlnZ2VyIG9ubHkgYSBzaW5nbGUgcmVuZGVyLiBUaGUgcmVuZGVyIG1ldGhvZAogICAgICogc2hvdWxkIGJlIGNhbGxlZCBpZiwgZm9yIGV4YW1wbGUsIHRlbXBsYXRlIHJlbmRlcmluZyBpcyByZXF1aXJlZCB0bwogICAgICogdmFsaWRhdGUgYXBwbGljYXRpb24gc3RhdGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZW5kZXIoKSB7CiAgICAgIC8vIFF1ZXVlIHRoaXMgcmVwZWF0ZXIsIHRoZW4gZmx1c2ggYWxsIGluIG9yZGVyCiAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyKTsKICAgICAgUG9seW1lci5mbHVzaCgpOwogICAgfQoKICAgIF9fcmVuZGVyKCkgewogICAgICBpZiAoIXRoaXMuX19lbnN1cmVUZW1wbGF0aXplZCgpKSB7CiAgICAgICAgLy8gTm8gdGVtcGxhdGUgZm91bmQgeWV0CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuX19hcHBseUZ1bGxSZWZyZXNoKCk7CiAgICAgIC8vIFJlc2V0IHRoZSBwb29sCiAgICAgIC8vIFRPRE8oa3NjaGFhZik6IFJldXNlIHBvb2wgYWNyb3NzIHR1cm5zIGFuZCBuZXN0ZWQgdGVtcGxhdGVzCiAgICAgIC8vIE5vdyB0aGF0IG9iamVjdHMvYXJyYXlzIGFyZSByZS1ldmFsdWF0ZWQgd2hlbiBzZXQsIHdlIGNhbiBzYWZlbHkKICAgICAgLy8gcmV1c2UgcG9vbGVkIGluc3RhbmNlcyBhY3Jvc3MgdHVybnMsIGhvd2V2ZXIgd2Ugc3RpbGwgbmVlZCB0byBkZWNpZGUKICAgICAgLy8gc2VtYW50aWNzIHJlZ2FyZGluZyBob3cgbG9uZyB0byBob2xkLCBob3cgbWFueSB0byBob2xkLCBldGMuCiAgICAgIHRoaXMuX19wb29sLmxlbmd0aCA9IDA7CiAgICAgIC8vIFNldCByZW5kZXJlZCBpdGVtIGNvdW50CiAgICAgIHRoaXMuX3NldFJlbmRlcmVkSXRlbUNvdW50KHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoKTsKICAgICAgLy8gTm90aWZ5IHVzZXJzCiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHJlbmRlciBtb3JlIGl0ZW1zCiAgICAgIHRoaXMuX190cnlSZW5kZXJDaHVuaygpOwogICAgfQoKICAgIF9fYXBwbHlGdWxsUmVmcmVzaCgpIHsKICAgICAgbGV0IGl0ZW1zID0gdGhpcy5pdGVtcyB8fCBbXTsKICAgICAgbGV0IGlzbnRJZHhUb0l0ZW1zSWR4ID0gbmV3IEFycmF5KGl0ZW1zLmxlbmd0aCk7CiAgICAgIGZvciAobGV0IGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgIGlzbnRJZHhUb0l0ZW1zSWR4W2ldID0gaTsKICAgICAgfQogICAgICAvLyBBcHBseSB1c2VyIGZpbHRlcgogICAgICBpZiAodGhpcy5fX2ZpbHRlckZuKSB7CiAgICAgICAgaXNudElkeFRvSXRlbXNJZHggPSBpc250SWR4VG9JdGVtc0lkeC5maWx0ZXIoKGksIGlkeCwgYXJyYXkpID0+CiAgICAgICAgICB0aGlzLl9fZmlsdGVyRm4oaXRlbXNbaV0sIGlkeCwgYXJyYXkpKTsKICAgICAgfQogICAgICAvLyBBcHBseSB1c2VyIHNvcnQKICAgICAgaWYgKHRoaXMuX19zb3J0Rm4pIHsKICAgICAgICBpc250SWR4VG9JdGVtc0lkeC5zb3J0KChhLCBiKSA9PiB0aGlzLl9fc29ydEZuKGl0ZW1zW2FdLCBpdGVtc1tiXSkpOwogICAgICB9CiAgICAgIC8vIGl0ZW1zLT5pbnN0IG1hcCBrZXB0IGZvciBpdGVtIHBhdGggZm9yd2FyZGluZwogICAgICBjb25zdCBpdGVtc0lkeFRvSW5zdElkeCA9IHRoaXMuX19pdGVtc0lkeFRvSW5zdElkeCA9IHt9OwogICAgICBsZXQgaW5zdElkeCA9IDA7CiAgICAgIC8vIEdlbmVyYXRlIGluc3RhbmNlcyBhbmQgYXNzaWduIGl0ZW1zCiAgICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4oaXNudElkeFRvSXRlbXNJZHgubGVuZ3RoLCB0aGlzLl9fbGltaXQpOwogICAgICBmb3IgKDsgaW5zdElkeDxsaW1pdDsgaW5zdElkeCsrKSB7CiAgICAgICAgbGV0IGluc3QgPSB0aGlzLl9faW5zdGFuY2VzW2luc3RJZHhdOwogICAgICAgIGxldCBpdGVtSWR4ID0gaXNudElkeFRvSXRlbXNJZHhbaW5zdElkeF07CiAgICAgICAgbGV0IGl0ZW0gPSBpdGVtc1tpdGVtSWR4XTsKICAgICAgICBpdGVtc0lkeFRvSW5zdElkeFtpdGVtSWR4XSA9IGluc3RJZHg7CiAgICAgICAgaWYgKGluc3QpIHsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLmFzLCBpdGVtKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLmluZGV4QXMsIGluc3RJZHgpOwogICAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaXRlbXNJbmRleEFzLCBpdGVtSWR4KTsKICAgICAgICAgIGluc3QuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9faW5zZXJ0SW5zdGFuY2UoaXRlbSwgaW5zdElkeCwgaXRlbUlkeCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIFJlbW92ZSBhbnkgZXh0cmEgaW5zdGFuY2VzIGZyb20gcHJldmlvdXMgc3RhdGUKICAgICAgZm9yIChsZXQgaT10aGlzLl9faW5zdGFuY2VzLmxlbmd0aC0xOyBpPj1pbnN0SWR4OyBpLS0pIHsKICAgICAgICB0aGlzLl9fZGV0YWNoQW5kUmVtb3ZlSW5zdGFuY2UoaSk7CiAgICAgIH0KICAgIH0KCiAgICBfX2RldGFjaEluc3RhbmNlKGlkeCkgewogICAgICBsZXQgaW5zdCA9IHRoaXMuX19pbnN0YW5jZXNbaWR4XTsKICAgICAgZm9yIChsZXQgaT0wOyBpPGluc3QuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgZWwgPSBpbnN0LmNoaWxkcmVuW2ldOwogICAgICAgIGluc3Qucm9vdC5hcHBlbmRDaGlsZChlbCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGluc3Q7CiAgICB9CgogICAgX19hdHRhY2hJbnN0YW5jZShpZHgsIHBhcmVudCkgewogICAgICBsZXQgaW5zdCA9IHRoaXMuX19pbnN0YW5jZXNbaWR4XTsKICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShpbnN0LnJvb3QsIHRoaXMpOwogICAgfQoKICAgIF9fZGV0YWNoQW5kUmVtb3ZlSW5zdGFuY2UoaWR4KSB7CiAgICAgIGxldCBpbnN0ID0gdGhpcy5fX2RldGFjaEluc3RhbmNlKGlkeCk7CiAgICAgIGlmIChpbnN0KSB7CiAgICAgICAgdGhpcy5fX3Bvb2wucHVzaChpbnN0KTsKICAgICAgfQogICAgICB0aGlzLl9faW5zdGFuY2VzLnNwbGljZShpZHgsIDEpOwogICAgfQoKICAgIF9fc3RhbXBJbnN0YW5jZShpdGVtLCBpbnN0SWR4LCBpdGVtSWR4KSB7CiAgICAgIGxldCBtb2RlbCA9IHt9OwogICAgICBtb2RlbFt0aGlzLmFzXSA9IGl0ZW07CiAgICAgIG1vZGVsW3RoaXMuaW5kZXhBc10gPSBpbnN0SWR4OwogICAgICBtb2RlbFt0aGlzLml0ZW1zSW5kZXhBc10gPSBpdGVtSWR4OwogICAgICByZXR1cm4gbmV3IHRoaXMuX19jdG9yKG1vZGVsKTsKICAgIH0KCiAgICBfX2luc2VydEluc3RhbmNlKGl0ZW0sIGluc3RJZHgsIGl0ZW1JZHgpIHsKICAgICAgbGV0IGluc3QgPSB0aGlzLl9fcG9vbC5wb3AoKTsKICAgICAgaWYgKGluc3QpIHsKICAgICAgICAvLyBUT0RPKGtzY2hhYWYpOiBJZiB0aGUgcG9vbCBpcyBzaGFyZWQgYWNyb3NzIHR1cm5zLCBob3N0UHJvcHMKICAgICAgICAvLyBuZWVkIHRvIGJlIHJlLXNldCB0byByZXVzZWQgaW5zdGFuY2VzIGluIGFkZGl0aW9uIHRvIGl0ZW0KICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHkodGhpcy5hcywgaXRlbSk7CiAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaW5kZXhBcywgaW5zdElkeCk7CiAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaXRlbXNJbmRleEFzLCBpdGVtSWR4KTsKICAgICAgICBpbnN0Ll9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbnN0ID0gdGhpcy5fX3N0YW1wSW5zdGFuY2UoaXRlbSwgaW5zdElkeCwgaXRlbUlkeCk7CiAgICAgIH0KICAgICAgbGV0IGJlZm9yZVJvdyA9IHRoaXMuX19pbnN0YW5jZXNbaW5zdElkeCArIDFdOwogICAgICBsZXQgYmVmb3JlTm9kZSA9IGJlZm9yZVJvdyA/IGJlZm9yZVJvdy5jaGlsZHJlblswXSA6IHRoaXM7CiAgICAgIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaW5zdC5yb290LCBiZWZvcmVOb2RlKTsKICAgICAgdGhpcy5fX2luc3RhbmNlc1tpbnN0SWR4XSA9IGluc3Q7CiAgICAgIHJldHVybiBpbnN0OwogICAgfQoKICAgIC8vIEltcGxlbWVudHMgZXh0ZW5zaW9uIHBvaW50IGZyb20gVGVtcGxhdGl6ZSBtaXhpbgogICAgLyoqCiAgICAgKiBTaG93cyBvciBoaWRlcyB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdG9wIGxldmVsIGNoaWxkIGVsZW1lbnRzLiBGb3IKICAgICAqIHRleHQgbm9kZXMsIGB0ZXh0Q29udGVudGAgaXMgcmVtb3ZlZCB3aGlsZSAiaGlkZGVuIiBhbmQgcmVwbGFjZWQgd2hlbgogICAgICogInNob3duLiIKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGlkZGVuIFNldCB0byB0cnVlIHRvIGhpZGUgdGhlIGNoaWxkcmVuOwogICAgICogc2V0IHRvIGZhbHNlIHRvIHNob3cgdGhlbS4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIF9zaG93SGlkZUNoaWxkcmVuKGhpZGRlbikgewogICAgICBmb3IgKGxldCBpPTA7IGk8dGhpcy5fX2luc3RhbmNlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHRoaXMuX19pbnN0YW5jZXNbaV0uX3Nob3dIaWRlQ2hpbGRyZW4oaGlkZGVuKTsKICAgICAgfQogICAgfQoKICAgIC8vIENhbGxlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIGEgaG9zdCBpdGVtcy48a2V5Pi48cGF0aD4gcGF0aCBjaGFuZ2UsCiAgICAvLyByZXNwb25zaWJsZSBmb3Igbm90aWZ5aW5nIGl0ZW0uPHBhdGg+IGNoYW5nZXMgdG8gaW5zdCBmb3Iga2V5CiAgICBfX2hhbmRsZUl0ZW1QYXRoKHBhdGgsIHZhbHVlKSB7CiAgICAgIGxldCBpdGVtc1BhdGggPSBwYXRoLnNsaWNlKDYpOyAvLyAnaXRlbXMuJy5sZW5ndGggPT0gNgogICAgICBsZXQgZG90ID0gaXRlbXNQYXRoLmluZGV4T2YoJy4nKTsKICAgICAgbGV0IGl0ZW1zSWR4ID0gZG90IDwgMCA/IGl0ZW1zUGF0aCA6IGl0ZW1zUGF0aC5zdWJzdHJpbmcoMCwgZG90KTsKICAgICAgLy8gSWYgcGF0aCB3YXMgaW5kZXggaW50byBhcnJheS4uLgogICAgICBpZiAoaXRlbXNJZHggPT0gcGFyc2VJbnQoaXRlbXNJZHgsIDEwKSkgewogICAgICAgIGxldCBpdGVtU3ViUGF0aCA9IGRvdCA8IDAgPyAnJyA6IGl0ZW1zUGF0aC5zdWJzdHJpbmcoZG90KzEpOwogICAgICAgIC8vIElmIHRoZSBwYXRoIGlzIG9ic2VydmVkLCBpdCB3aWxsIHRyaWdnZXIgYSBmdWxsIHJlZnJlc2gKICAgICAgICB0aGlzLl9faGFuZGxlT2JzZXJ2ZWRQYXRocyhpdGVtU3ViUGF0aCk7CiAgICAgICAgLy8gTm90ZSwgZXZlbiBpZiBhIHJ1bGwgcmVmcmVzaCBpcyB0cmlnZ2VyZWQsIGFsd2F5cyBkbyB0aGUgcGF0aAogICAgICAgIC8vIG5vdGlmaWNhdGlvbiBiZWNhdXNlIHVubGVzcyBtdXRhYmxlRGF0YSBpcyB1c2VkIGZvciBkb20tcmVwZWF0CiAgICAgICAgLy8gYW5kIGFsbCBlbGVtZW50cyBpbiB0aGUgaW5zdGFuY2Ugc3VidHJlZSwgYSBmdWxsIHJlZnJlc2ggbWF5CiAgICAgICAgLy8gbm90IHRyaWdnZXIgdGhlIHByb3BlciB1cGRhdGUuCiAgICAgICAgbGV0IGluc3RJZHggPSB0aGlzLl9faXRlbXNJZHhUb0luc3RJZHhbaXRlbXNJZHhdOwogICAgICAgIGxldCBpbnN0ID0gdGhpcy5fX2luc3RhbmNlc1tpbnN0SWR4XTsKICAgICAgICBpZiAoaW5zdCkgewogICAgICAgICAgbGV0IGl0ZW1QYXRoID0gdGhpcy5hcyArIChpdGVtU3ViUGF0aCA/ICcuJyArIGl0ZW1TdWJQYXRoIDogJycpOwogICAgICAgICAgLy8gVGhpcyBpcyBlZmZlY3RpdmVseSBgbm90aWZ5UGF0aGAsIGJ1dCBhdm9pZHMgc29tZSBvZiB0aGUgb3ZlcmhlYWQKICAgICAgICAgIC8vIG9mIHRoZSBwdWJsaWMgQVBJCiAgICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoaXRlbVBhdGgsIHZhbHVlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICBpbnN0Ll9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGl0ZW0gYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZWxlbWVudCBzdGFtcGVkIGJ5CiAgICAgKiB0aGlzIGBkb20tcmVwZWF0YC4KICAgICAqCiAgICAgKiBOb3RlLCB0byBtb2RpZnkgc3ViLXByb3BlcnRpZXMgb2YgdGhlIGl0ZW0sCiAgICAgKiBgbW9kZWxGb3JFbGVtZW50KGVsKS5zZXQoJ2l0ZW0uPHN1Yi1wcm9wPicsIHZhbHVlKWAKICAgICAqIHNob3VsZCBiZSB1c2VkLgogICAgICoKICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gdGhlIGl0ZW0uCiAgICAgKiBAcmV0dXJuIHsqfSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudC4KICAgICAqLwogICAgaXRlbUZvckVsZW1lbnQoZWwpIHsKICAgICAgbGV0IGluc3RhbmNlID0gdGhpcy5tb2RlbEZvckVsZW1lbnQoZWwpOwogICAgICByZXR1cm4gaW5zdGFuY2UgJiYgaW5zdGFuY2VbdGhpcy5hc107CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBpbnN0IGluZGV4IGZvciBhIGdpdmVuIGVsZW1lbnQgc3RhbXBlZCBieSB0aGlzIGBkb20tcmVwZWF0YC4KICAgICAqIElmIGBzb3J0YCBpcyBwcm92aWRlZCwgdGhlIGluZGV4IHdpbGwgcmVmbGVjdCB0aGUgc29ydGVkIG9yZGVyIChyYXRoZXIKICAgICAqIHRoYW4gdGhlIG9yaWdpbmFsIGFycmF5IG9yZGVyKS4KICAgICAqCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gZWwgRWxlbWVudCBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZSBpbmRleC4KICAgICAqIEByZXR1cm4gez9udW1iZXJ9IFJvdyBpbmRleCBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQgKG5vdGUgdGhpcyBtYXkKICAgICAqICAgbm90IGNvcnJlc3BvbmQgdG8gdGhlIGFycmF5IGluZGV4IGlmIGEgdXNlciBgc29ydGAgaXMgYXBwbGllZCkuCiAgICAgKi8KICAgIGluZGV4Rm9yRWxlbWVudChlbCkgewogICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLm1vZGVsRm9yRWxlbWVudChlbCk7CiAgICAgIHJldHVybiBpbnN0YW5jZSAmJiBpbnN0YW5jZVt0aGlzLmluZGV4QXNdOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgIm1vZGVsIiBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBlbGVtZW50LCB3aGljaAogICAgICogc2VydmVzIGFzIHRoZSBiaW5kaW5nIHNjb3BlIGZvciB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdGhlIGVsZW1lbnQgaXMKICAgICAqIGNvbnRhaW5lZCBpbi4gQSB0ZW1wbGF0ZSBtb2RlbCBpcyBhbiBpbnN0YW5jZSBvZiBgUG9seW1lci5CYXNlYCwgYW5kCiAgICAgKiBzaG91bGQgYmUgdXNlZCB0byBtYW5pcHVsYXRlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgIGxldCBtb2RlbCA9IG1vZGVsRm9yRWxlbWVudChlbCk7CiAgICAgKiAgIGlmIChtb2RlbC5pbmRleCA8IDEwKSB7CiAgICAgKiAgICAgbW9kZWwuc2V0KCdpdGVtLmNoZWNrZWQnLCB0cnVlKTsKICAgICAqICAgfQogICAgICoKICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gYSB0ZW1wbGF0ZSBtb2RlbC4KICAgICAqIEByZXR1cm4ge1RlbXBsYXRlSW5zdGFuY2VCYXNlfSBNb2RlbCByZXByZXNlbnRpbmcgdGhlIGJpbmRpbmcgc2NvcGUgZm9yCiAgICAgKiAgIHRoZSBlbGVtZW50LgogICAgICovCiAgICBtb2RlbEZvckVsZW1lbnQoZWwpIHsKICAgICAgcmV0dXJuIFBvbHltZXIuVGVtcGxhdGl6ZS5tb2RlbEZvckVsZW1lbnQodGhpcy50ZW1wbGF0ZSwgZWwpOwogICAgfQoKICB9CgogIGN1c3RvbUVsZW1lbnRzLmRlZmluZShEb21SZXBlYXQuaXMsIERvbVJlcGVhdCk7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkRvbVJlcGVhdCA9IERvbVJlcGVhdDsKCn0pKCk7CgoKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBUaGUgYDxkb20taWY+YCBlbGVtZW50IHdpbGwgc3RhbXAgYSBsaWdodC1kb20gYDx0ZW1wbGF0ZT5gIGNoaWxkIHdoZW4KICAgKiB0aGUgYGlmYCBwcm9wZXJ0eSBiZWNvbWVzIHRydXRoeSwgYW5kIHRoZSB0ZW1wbGF0ZSBjYW4gdXNlIFBvbHltZXIKICAgKiBkYXRhLWJpbmRpbmcgYW5kIGRlY2xhcmF0aXZlIGV2ZW50IGZlYXR1cmVzIHdoZW4gdXNlZCBpbiB0aGUgY29udGV4dCBvZgogICAqIGEgUG9seW1lciBlbGVtZW50J3MgdGVtcGxhdGUuCiAgICoKICAgKiBXaGVuIGBpZmAgYmVjb21lcyBmYWxzeSwgdGhlIHN0YW1wZWQgY29udGVudCBpcyBoaWRkZW4gYnV0IG5vdAogICAqIHJlbW92ZWQgZnJvbSBkb20uIFdoZW4gYGlmYCBzdWJzZXF1ZW50bHkgYmVjb21lcyB0cnV0aHkgYWdhaW4sIHRoZSBjb250ZW50CiAgICogaXMgc2ltcGx5IHJlLXNob3duLiBUaGlzIGFwcHJvYWNoIGlzIHVzZWQgZHVlIHRvIGl0cyBmYXZvcmFibGUgcGVyZm9ybWFuY2UKICAgKiBjaGFyYWN0ZXJpc3RpY3M6IHRoZSBleHBlbnNlIG9mIGNyZWF0aW5nIHRlbXBsYXRlIGNvbnRlbnQgaXMgcGFpZCBvbmx5CiAgICogb25jZSBhbmQgbGF6aWx5LgogICAqCiAgICogU2V0IHRoZSBgcmVzdGFtcGAgcHJvcGVydHkgdG8gdHJ1ZSB0byBmb3JjZSB0aGUgc3RhbXBlZCBjb250ZW50IHRvIGJlCiAgICogY3JlYXRlZCAvIGRlc3Ryb3llZCB3aGVuIHRoZSBgaWZgIGNvbmRpdGlvbiBjaGFuZ2VzLgogICAqCiAgICogQGN1c3RvbUVsZW1lbnQKICAgKiBAcG9seW1lcgogICAqIEBleHRlbmRzIFBvbHltZXIuRWxlbWVudAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgdGhhdCBjb25kaXRpb25hbGx5IHN0YW1wcyBhbmQgaGlkZXMgb3IgcmVtb3ZlcwogICAqICAgdGVtcGxhdGUgY29udGVudCBiYXNlZCBvbiBhIGJvb2xlYW4gZmxhZy4KICAgKi8KICBjbGFzcyBEb21JZiBleHRlbmRzIFBvbHltZXIuRWxlbWVudCB7CgogICAgLy8gTm90IG5lZWRlZCB0byBmaW5kIHRlbXBsYXRlOyBjYW4gYmUgcmVtb3ZlZCBvbmNlIHRoZSBhbmFseXplcgogICAgLy8gY2FuIGZpbmQgdGhlIHRhZyBuYW1lIGZyb20gY3VzdG9tRWxlbWVudHMuZGVmaW5lIGNhbGwKICAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZG9tLWlmJzsgfQoKICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7IHJldHVybiBudWxsOyB9CgogICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewoKICAgICAgcmV0dXJuIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZWQgd2hlbmV2ZXIgRE9NIGlzIGFkZGVkIG9yIHJlbW92ZWQvaGlkZGVuIGJ5IHRoaXMgdGVtcGxhdGUgKGJ5CiAgICAgICAgICogZGVmYXVsdCwgcmVuZGVyaW5nIG9jY3VycyBsYXppbHkpLiAgVG8gZm9yY2UgaW1tZWRpYXRlIHJlbmRlcmluZywgY2FsbAogICAgICAgICAqIGByZW5kZXJgLgogICAgICAgICAqCiAgICAgICAgICogQGV2ZW50IGRvbS1jaGFuZ2UKICAgICAgICAgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHRlbXBsYXRlIHNob3VsZCBzdGFtcC4KICAgICAgICAgKi8KICAgICAgICBpZjogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIG9ic2VydmVyOiAnX19kZWJvdW5jZVJlbmRlcicKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIHRydWUsIGVsZW1lbnRzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIERPTSBhbmQgZGlzY2FyZGVkIHdoZW4gYGlmYAogICAgICAgICAqIGJlY29tZXMgZmFsc2UgYW5kIHJlLWNyZWF0ZWQgYW5kIGFkZGVkIGJhY2sgdG8gdGhlIERPTSB3aGVuIGBpZmAKICAgICAgICAgKiBiZWNvbWVzIHRydWUuICBCeSBkZWZhdWx0LCBzdGFtcGVkIGVsZW1lbnRzIHdpbGwgYmUgaGlkZGVuIGJ1dCBsZWZ0CiAgICAgICAgICogaW4gdGhlIERPTSB3aGVuIGBpZmAgYmVjb21lcyBmYWxzZSwgd2hpY2ggaXMgZ2VuZXJhbGx5IHJlc3VsdHMKICAgICAgICAgKiBpbiBiZXR0ZXIgcGVyZm9ybWFuY2UuCiAgICAgICAgICovCiAgICAgICAgcmVzdGFtcDogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIG9ic2VydmVyOiAnX19kZWJvdW5jZVJlbmRlcicKICAgICAgICB9CgogICAgICB9OwoKICAgIH0KCiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IG51bGw7CiAgICAgIHRoaXMuX19pbnZhbGlkUHJvcHMgPSBudWxsOwogICAgICB0aGlzLl9faW5zdGFuY2UgPSBudWxsOwogICAgICB0aGlzLl9sYXN0SWYgPSBmYWxzZTsKICAgICAgdGhpcy5fX2N0b3IgPSBudWxsOwogICAgfQoKICAgIF9fZGVib3VuY2VSZW5kZXIoKSB7CiAgICAgIC8vIFJlbmRlciBpcyBhc3luYyBmb3IgMiByZWFzb25zOgogICAgICAvLyAxLiBUbyBlbGltaW5hdGUgZG9tIGNyZWF0aW9uIHRyYXNoaW5nIGlmIHVzZXIgY29kZSB0aHJhc2hlcyBgaWZgIGluIHRoZQogICAgICAvLyAgICBzYW1lIHR1cm4uIFRoaXMgd2FzIG1vcmUgY29tbW9uIGluIDEueCB3aGVyZSBhIGNvbXBvdW5kIGNvbXB1dGVkCiAgICAgIC8vICAgIHByb3BlcnR5IGNvdWxkIHJlc3VsdCBpbiB0aGUgcmVzdWx0IGNoYW5naW5nIG11bHRpcGxlIHRpbWVzLCBidXQgaXMKICAgICAgLy8gICAgbWl0aWdhdGVkIHRvIGEgbGFyZ2UgZXh0ZW50IGJ5IGJhdGNoZWQgcHJvcGVydHkgcHJvY2Vzc2luZyBpbiAyLnguCiAgICAgIC8vIDIuIFRvIGF2b2lkIGRvdWJsZSBvYmplY3QgcHJvcGFnYXRpb24gd2hlbiBhIGJhZyBpbmNsdWRpbmcgdmFsdWVzIGJvdW5kCiAgICAgIC8vICAgIHRvIHRoZSBgaWZgIHByb3BlcnR5IGFzIHdlbGwgYXMgb25lIG9yIG1vcmUgaG9zdFByb3BzIGNvdWxkIGVucXVldWUKICAgICAgLy8gICAgdGhlIDxkb20taWY+IHRvIGZsdXNoIGJlZm9yZSB0aGUgPHRlbXBsYXRlPidzIGhvc3QgcHJvcGVydHkKICAgICAgLy8gICAgZm9yd2FyZGluZy4gSW4gdGhhdCBzY2VuYXJpbyBjcmVhdGluZyBhbiBpbnN0YW5jZSB3b3VsZCByZXN1bHQgaW4KICAgICAgLy8gICAgdGhlIGhvc3QgcHJvcHMgYmVpbmcgc2V0IG9uY2UsIGFuZCB0aGVuIHRoZSBlbnF1ZXVlZCBjaGFuZ2VzIG9uIHRoZQogICAgICAvLyAgICB0ZW1wbGF0ZSB3b3VsZCBzZXQgcHJvcGVydGllcyBhIHNlY29uZCB0aW1lLCBwb3RlbnRpYWxseSBjYXVzaW5nIGFuCiAgICAgIC8vICAgIG9iamVjdCB0byBiZSBzZXQgdG8gYW4gaW5zdGFuY2UgbW9yZSB0aGFuIG9uY2UuICBDcmVhdGluZyB0aGUKICAgICAgLy8gICAgaW5zdGFuY2UgYXN5bmMgZnJvbSBmbHVzaGluZyBkYXRhIGVuc3VyZXMgdGhpcyBkb2Vzbid0IGhhcHBlbi4gSWYKICAgICAgLy8gICAgd2Ugd2FudGVkIGEgc3luYyBvcHRpb24gaW4gdGhlIGZ1dHVyZSwgc2ltcGx5IGhhdmluZyA8ZG9tLWlmPiBmbHVzaAogICAgICAvLyAgICAob3IgY2xlYXIpIGl0cyB0ZW1wbGF0ZSdzIHBlbmRpbmcgaG9zdCBwcm9wZXJ0aWVzIGJlZm9yZSBjcmVhdGluZwogICAgICAvLyAgICB0aGUgaW5zdGFuY2Ugd291bGQgYWxzbyBhdm9pZCB0aGUgcHJvYmxlbS4KICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgICB0aGlzLl9fcmVuZGVyRGVib3VuY2VyCiAgICAgICAgICAsIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAgICAsICgpID0+IHRoaXMuX19yZW5kZXIoKSk7CiAgICAgIFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcih0aGlzLl9fcmVuZGVyRGVib3VuY2VyKTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICBpZiAoIXRoaXMucGFyZW50Tm9kZSB8fAogICAgICAgICAgKHRoaXMucGFyZW50Tm9kZS5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgJiYKICAgICAgICAgICAhdGhpcy5wYXJlbnROb2RlLmhvc3QpKSB7CiAgICAgICAgdGhpcy5fX3RlYXJkb3duSW5zdGFuY2UoKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgaWYgKHRoaXMuaWYpIHsKICAgICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIoKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gTm9ybWFsbHkgcmVuZGVyaW5nIGlzCiAgICAgKiBhc3luY2hyb25vdXMgdG8gYSBwcm92b2tpbmcgY2hhbmdlLiBUaGlzIGlzIGRvbmUgZm9yIGVmZmljaWVuY3kgc28KICAgICAqIHRoYXQgbXVsdGlwbGUgY2hhbmdlcyB0cmlnZ2VyIG9ubHkgYSBzaW5nbGUgcmVuZGVyLiBUaGUgcmVuZGVyIG1ldGhvZAogICAgICogc2hvdWxkIGJlIGNhbGxlZCBpZiwgZm9yIGV4YW1wbGUsIHRlbXBsYXRlIHJlbmRlcmluZyBpcyByZXF1aXJlZCB0bwogICAgICogdmFsaWRhdGUgYXBwbGljYXRpb24gc3RhdGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZW5kZXIoKSB7CiAgICAgIFBvbHltZXIuZmx1c2goKTsKICAgIH0KCiAgICBfX3JlbmRlcigpIHsKICAgICAgaWYgKHRoaXMuaWYpIHsKICAgICAgICBpZiAoIXRoaXMuX19lbnN1cmVJbnN0YW5jZSgpKSB7CiAgICAgICAgICAvLyBObyB0ZW1wbGF0ZSBmb3VuZCB5ZXQKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5fc2hvd0hpZGVDaGlsZHJlbigpOwogICAgICB9IGVsc2UgaWYgKHRoaXMucmVzdGFtcCkgewogICAgICAgIHRoaXMuX190ZWFyZG93bkluc3RhbmNlKCk7CiAgICAgIH0KICAgICAgaWYgKCF0aGlzLnJlc3RhbXAgJiYgdGhpcy5fX2luc3RhbmNlKSB7CiAgICAgICAgdGhpcy5fc2hvd0hpZGVDaGlsZHJlbigpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmlmICE9IHRoaXMuX2xhc3RJZikgewogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgICAgdGhpcy5fbGFzdElmID0gdGhpcy5pZjsKICAgICAgfQogICAgfQoKICAgIF9fZW5zdXJlSW5zdGFuY2UoKSB7CiAgICAgIGxldCBwYXJlbnROb2RlID0gdGhpcy5wYXJlbnROb2RlOwogICAgICAvLyBHdWFyZCBhZ2FpbnN0IGVsZW1lbnQgYmVpbmcgZGV0YWNoZWQgd2hpbGUgcmVuZGVyIHdhcyBxdWV1ZWQKICAgICAgaWYgKHBhcmVudE5vZGUpIHsKICAgICAgICBpZiAoIXRoaXMuX19jdG9yKSB7CiAgICAgICAgICBsZXQgdGVtcGxhdGUgPSAvKiogQHR5cGUge0hUTUxUZW1wbGF0ZUVsZW1lbnR9ICovKHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKSk7CiAgICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgY2hpbGRMaXN0IGNoYW5nZXMgYW5kIHRlbXBsYXRlIHNob3VsZCBiZSB0aGVyZSBieSB0aGVuCiAgICAgICAgICAgIGxldCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKICAgICAgICAgICAgICBpZiAodGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKSB7CiAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9fcmVuZGVyKCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZG9tLWlmIHJlcXVpcmVzIGEgPHRlbXBsYXRlPiBjaGlsZCcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUodGhpcywge2NoaWxkTGlzdDogdHJ1ZX0pOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fY3RvciA9IFBvbHltZXIuVGVtcGxhdGl6ZS50ZW1wbGF0aXplKHRlbXBsYXRlLCB0aGlzLCB7CiAgICAgICAgICAgIC8vIGRvbS1pZiB0ZW1wbGF0aXplciBpbnN0YW5jZXMgcmVxdWlyZSBgbXV0YWJsZTogdHJ1ZWAsIGFzCiAgICAgICAgICAgIC8vIGBfX3N5bmNIb3N0UHJvcGVydGllc2AgcmVsaWVzIG9uIHRoYXQgYmVoYXZpb3IgdG8gc3luYyBvYmplY3RzCiAgICAgICAgICAgIG11dGFibGVEYXRhOiB0cnVlLAogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgdG8gZm9yd2FyZAogICAgICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIG9mIHByb3BlcnR5CiAgICAgICAgICAgICAqIEB0aGlzIHt0aGlzfQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZm9yd2FyZEhvc3RQcm9wOiBmdW5jdGlvbihwcm9wLCB2YWx1ZSkgewogICAgICAgICAgICAgIGlmICh0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlmKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuX19pbnN0YW5jZS5mb3J3YXJkSG9zdFByb3AocHJvcCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbnN0YW5jZSBidXQgYXJlIHNxdWVsY2hpbmcgaG9zdCBwcm9wZXJ0eQogICAgICAgICAgICAgICAgICAvLyBmb3J3YXJkaW5nIGR1ZSB0byBpZiBiZWluZyBmYWxzZSwgbm90ZSB0aGUgaW52YWxpZGF0ZWQKICAgICAgICAgICAgICAgICAgLy8gcHJvcGVydGllcyBzbyBgX19zeW5jSG9zdFByb3BlcnRpZXNgIGNhbiBzeW5jIHRoZW0gdGhlIG5leHQKICAgICAgICAgICAgICAgICAgLy8gdGltZSBgaWZgIGJlY29tZXMgdHJ1ZQogICAgICAgICAgICAgICAgICB0aGlzLl9faW52YWxpZFByb3BzID0gdGhpcy5fX2ludmFsaWRQcm9wcyB8fCBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICAgICAgICB0aGlzLl9faW52YWxpZFByb3BzW1BvbHltZXIuUGF0aC5yb290KHByb3ApXSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKCF0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG5ldyB0aGlzLl9fY3RvcigpOwogICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5fX2luc3RhbmNlLnJvb3QsIHRoaXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9fc3luY0hvc3RQcm9wZXJ0aWVzKCk7CiAgICAgICAgICBsZXQgYyQgPSB0aGlzLl9faW5zdGFuY2UuY2hpbGRyZW47CiAgICAgICAgICBpZiAoYyQgJiYgYyQubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIERldGVjdCBjYXNlIHdoZXJlIGRvbS1pZiB3YXMgcmUtYXR0YWNoZWQgaW4gbmV3IHBvc2l0aW9uCiAgICAgICAgICAgIGxldCBsYXN0Q2hpbGQgPSB0aGlzLnByZXZpb3VzU2libGluZzsKICAgICAgICAgICAgaWYgKGxhc3RDaGlsZCAhPT0gYyRbYyQubGVuZ3RoLTFdKSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBuOyAoaTxjJC5sZW5ndGgpICYmIChuPWMkW2ldKTsgaSsrKSB7CiAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShuLCB0aGlzKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgX19zeW5jSG9zdFByb3BlcnRpZXMoKSB7CiAgICAgIGxldCBwcm9wcyA9IHRoaXMuX19pbnZhbGlkUHJvcHM7CiAgICAgIGlmIChwcm9wcykgewogICAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICAgIHRoaXMuX19pbnN0YW5jZS5fc2V0UGVuZGluZ1Byb3BlcnR5KHByb3AsIHRoaXMuX19kYXRhSG9zdFtwcm9wXSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnZhbGlkUHJvcHMgPSBudWxsOwogICAgICAgIHRoaXMuX19pbnN0YW5jZS5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgIH0KICAgIH0KCiAgICBfX3RlYXJkb3duSW5zdGFuY2UoKSB7CiAgICAgIGlmICh0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICBsZXQgYyQgPSB0aGlzLl9faW5zdGFuY2UuY2hpbGRyZW47CiAgICAgICAgaWYgKGMkICYmIGMkLmxlbmd0aCkgewogICAgICAgICAgLy8gdXNlIGZpcnN0IGNoaWxkIHBhcmVudCwgZm9yIGNhc2Ugd2hlbiBkb20taWYgbWF5IGhhdmUgYmVlbiBkZXRhY2hlZAogICAgICAgICAgbGV0IHBhcmVudCA9IGMkWzBdLnBhcmVudE5vZGU7CiAgICAgICAgICAvLyBJbnN0YW5jZSBjaGlsZHJlbiBtYXkgYmUgZGlzY29ubmVjdGVkIGZyb20gcGFyZW50cyB3aGVuIGRvbS1pZgogICAgICAgICAgLy8gZGV0YWNoZXMgaWYgYSB0cmVlIHdhcyBpbm5lckhUTUwnZWQKICAgICAgICAgIGlmIChwYXJlbnQpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBuOyAoaTxjJC5sZW5ndGgpICYmIChuPWMkW2ldKTsgaSsrKSB7CiAgICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKG4pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG51bGw7CiAgICAgICAgdGhpcy5fX2ludmFsaWRQcm9wcyA9IG51bGw7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNob3dzIG9yIGhpZGVzIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSB0b3AgbGV2ZWwgY2hpbGQgZWxlbWVudHMuIEZvcgogICAgICogdGV4dCBub2RlcywgYHRleHRDb250ZW50YCBpcyByZW1vdmVkIHdoaWxlICJoaWRkZW4iIGFuZCByZXBsYWNlZCB3aGVuCiAgICAgKiAic2hvd24uIgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcm90ZWN0ZWQKICAgICAqLwogICAgX3Nob3dIaWRlQ2hpbGRyZW4oKSB7CiAgICAgIGxldCBoaWRkZW4gPSB0aGlzLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXyB8fCAhdGhpcy5pZjsKICAgICAgaWYgKHRoaXMuX19pbnN0YW5jZSkgewogICAgICAgIHRoaXMuX19pbnN0YW5jZS5fc2hvd0hpZGVDaGlsZHJlbihoaWRkZW4pOwogICAgICB9CiAgICB9CgogIH0KCiAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKERvbUlmLmlzLCBEb21JZik7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkRvbUlmID0gRG9tSWY7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIEVsZW1lbnQgbWl4aW4gZm9yIHJlY29yZGluZyBkeW5hbWljIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGl0ZW0gcGF0aHMgaW4gYQogICAqIG1hc3RlciBgaXRlbXNgIGFycmF5IGFuZCBhIGBzZWxlY3RlZGAgYXJyYXkgc3VjaCB0aGF0IHBhdGggY2hhbmdlcyB0byB0aGUKICAgKiBtYXN0ZXIgYXJyYXkgKGF0IHRoZSBob3N0KSBlbGVtZW50IG9yIGVsc2V3aGVyZSB2aWEgZGF0YS1iaW5kaW5nKSBhcmUKICAgKiBjb3JyZWN0bHkgcHJvcGFnYXRlZCB0byBpdGVtcyBpbiB0aGUgc2VsZWN0ZWQgYXJyYXkgYW5kIHZpY2UtdmVyc2EuCiAgICoKICAgKiBUaGUgYGl0ZW1zYCBwcm9wZXJ0eSBhY2NlcHRzIGFuIGFycmF5IG9mIHVzZXIgZGF0YSwgYW5kIHZpYSB0aGUKICAgKiBgc2VsZWN0KGl0ZW0pYCBhbmQgYGRlc2VsZWN0KGl0ZW0pYCBBUEksIHVwZGF0ZXMgdGhlIGBzZWxlY3RlZGAgcHJvcGVydHkKICAgKiB3aGljaCBtYXkgYmUgYm91bmQgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGFwcGxpY2F0aW9uLCBhbmQgYW55IGNoYW5nZXMgdG8KICAgKiBzdWItZmllbGRzIG9mIGBzZWxlY3RlZGAgaXRlbShzKSB3aWxsIGJlIGtlcHQgaW4gc3luYyB3aXRoIGl0ZW1zIGluIHRoZQogICAqIGBpdGVtc2AgYXJyYXkuICBXaGVuIGBtdWx0aWAgaXMgZmFsc2UsIGBzZWxlY3RlZGAgaXMgYSBwcm9wZXJ0eQogICAqIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLiAgV2hlbiBgbXVsdGlgIGlzIHRydWUsIGBzZWxlY3RlZGAKICAgKiBpcyBhbiBhcnJheSBvZiBtdWx0aXBseSBzZWxlY3RlZCBpdGVtcy4KICAgKgogICAqIEBwb2x5bWVyCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuRWxlbWVudE1peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IG1peGluIGZvciByZWNvcmRpbmcgZHluYW1pYyBhc3NvY2lhdGlvbnMgYmV0d2VlbiBpdGVtIHBhdGhzIGluIGEKICAgKiBtYXN0ZXIgYGl0ZW1zYCBhcnJheSBhbmQgYSBgc2VsZWN0ZWRgIGFycmF5CiAgICovCiAgbGV0IEFycmF5U2VsZWN0b3JNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9FbGVtZW50TWl4aW59CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBsZXQgZWxlbWVudEJhc2UgPSBQb2x5bWVyLkVsZW1lbnRNaXhpbihzdXBlckNsYXNzKTsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfQXJyYXlTZWxlY3Rvck1peGlufQogICAgICogQHVucmVzdHJpY3RlZAogICAgICovCiAgICBjbGFzcyBBcnJheVNlbGVjdG9yTWl4aW4gZXh0ZW5kcyBlbGVtZW50QmFzZSB7CgogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CgogICAgICAgIHJldHVybiB7CgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIGl0ZW1zIGZyb20gd2hpY2ggc2VsZWN0aW9uIHdpbGwgYmUgbWFkZS4KICAgICAgICAgICAqLwogICAgICAgICAgaXRlbXM6IHsKICAgICAgICAgICAgdHlwZTogQXJyYXksCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogV2hlbiBgdHJ1ZWAsIG11bHRpcGxlIGl0ZW1zIG1heSBiZSBzZWxlY3RlZCBhdCBvbmNlIChpbiB0aGlzIGNhc2UsCiAgICAgICAgICAgKiBgc2VsZWN0ZWRgIGlzIGFuIGFycmF5IG9mIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtcykuICBXaGVuIGBmYWxzZWAsCiAgICAgICAgICAgKiBvbmx5IG9uZSBpdGVtIG1heSBiZSBzZWxlY3RlZCBhdCBhIHRpbWUuCiAgICAgICAgICAgKi8KICAgICAgICAgIG11bHRpOiB7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICAgIH0sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBXaGVuIGBtdWx0aWAgaXMgdHJ1ZSwgdGhpcyBpcyBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIGFueSBzZWxlY3RlZC4KICAgICAgICAgICAqIFdoZW4gYG11bHRpYCBpcyBmYWxzZSwgdGhpcyBpcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0sIG9yIGBudWxsYAogICAgICAgICAgICogaWYgbm8gaXRlbSBpcyBzZWxlY3RlZC4KICAgICAgICAgICAqIEB0eXBlIHs/KE9iamVjdHxBcnJheTwhT2JqZWN0Pil9CiAgICAgICAgICAgKi8KICAgICAgICAgIHNlbGVjdGVkOiB7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogV2hlbiBgbXVsdGlgIGlzIGZhbHNlLCB0aGlzIGlzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSwgb3IgYG51bGxgCiAgICAgICAgICAgKiBpZiBubyBpdGVtIGlzIHNlbGVjdGVkLgogICAgICAgICAgICogQHR5cGUgez9PYmplY3R9CiAgICAgICAgICAgKi8KICAgICAgICAgIHNlbGVjdGVkSXRlbTogewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZQogICAgICAgICAgfSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFdoZW4gYHRydWVgLCBjYWxsaW5nIGBzZWxlY3RgIG9uIGFuIGl0ZW0gdGhhdCBpcyBhbHJlYWR5IHNlbGVjdGVkCiAgICAgICAgICAgKiB3aWxsIGRlc2VsZWN0IHRoZSBpdGVtLgogICAgICAgICAgICovCiAgICAgICAgICB0b2dnbGU6IHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgdmFsdWU6IGZhbHNlCiAgICAgICAgICB9CgogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICAgIHJldHVybiBbJ19fdXBkYXRlU2VsZWN0aW9uKG11bHRpLCBpdGVtcy4qKSddOwogICAgICB9CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX19sYXN0SXRlbXMgPSBudWxsOwogICAgICAgIHRoaXMuX19sYXN0TXVsdGkgPSBudWxsOwogICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcCA9IG51bGw7CiAgICAgIH0KCiAgICAgIF9fdXBkYXRlU2VsZWN0aW9uKG11bHRpLCBpdGVtc0luZm8pIHsKICAgICAgICBsZXQgcGF0aCA9IGl0ZW1zSW5mby5wYXRoOwogICAgICAgIGlmIChwYXRoID09ICdpdGVtcycpIHsKICAgICAgICAgIC8vIENhc2UgMSAtIGl0ZW1zIGFycmF5IGNoYW5nZWQsIHNvIGRpZmYgYWdhaW5zdCBwcmV2aW91cyBhcnJheSBhbmQKICAgICAgICAgIC8vIGRlc2VsZWN0IGFueSByZW1vdmVkIGl0ZW1zIGFuZCBhZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcwogICAgICAgICAgbGV0IG5ld0l0ZW1zID0gaXRlbXNJbmZvLmJhc2UgfHwgW107CiAgICAgICAgICBsZXQgbGFzdEl0ZW1zID0gdGhpcy5fX2xhc3RJdGVtczsKICAgICAgICAgIGxldCBsYXN0TXVsdGkgPSB0aGlzLl9fbGFzdE11bHRpOwogICAgICAgICAgaWYgKG11bHRpICE9PSBsYXN0TXVsdGkpIHsKICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGxhc3RJdGVtcykgewogICAgICAgICAgICBsZXQgc3BsaWNlcyA9IFBvbHltZXIuQXJyYXlTcGxpY2UuY2FsY3VsYXRlU3BsaWNlcyhuZXdJdGVtcywgbGFzdEl0ZW1zKTsKICAgICAgICAgICAgdGhpcy5fX2FwcGx5U3BsaWNlcyhzcGxpY2VzKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19sYXN0SXRlbXMgPSBuZXdJdGVtczsKICAgICAgICAgIHRoaXMuX19sYXN0TXVsdGkgPSBtdWx0aTsKICAgICAgICB9IGVsc2UgaWYgKGl0ZW1zSW5mby5wYXRoID09ICdpdGVtcy5zcGxpY2VzJykgewogICAgICAgICAgLy8gQ2FzZSAyIC0gZ290IHNwZWNpZmljIHNwbGljZSBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBhcnJheSBtdXRhdGlvbjoKICAgICAgICAgIC8vIGRlc2VsZWN0IGFueSByZW1vdmVkIGl0ZW1zIGFuZCBhZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcwogICAgICAgICAgdGhpcy5fX2FwcGx5U3BsaWNlcyhpdGVtc0luZm8udmFsdWUuaW5kZXhTcGxpY2VzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gQ2FzZSAzIC0gYW4gYXJyYXkgZWxlbWVudCB3YXMgY2hhbmdlZCwgc28gZGVzZWxlY3QgdGhlIHByZXZpb3VzCiAgICAgICAgICAvLyBpdGVtIGZvciB0aGF0IGluZGV4IGlmIGl0IHdhcyBwcmV2aW91c2x5IHNlbGVjdGVkCiAgICAgICAgICBsZXQgcGFydCA9IHBhdGguc2xpY2UoJ2l0ZW1zLicubGVuZ3RoKTsKICAgICAgICAgIGxldCBpZHggPSBwYXJzZUludChwYXJ0LCAxMCk7CiAgICAgICAgICBpZiAoKHBhcnQuaW5kZXhPZignLicpIDwgMCkgJiYgcGFydCA9PSBpZHgpIHsKICAgICAgICAgICAgdGhpcy5fX2Rlc2VsZWN0Q2hhbmdlZElkeChpZHgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgX19hcHBseVNwbGljZXMoc3BsaWNlcykgewogICAgICAgIGxldCBzZWxlY3RlZCA9IHRoaXMuX19zZWxlY3RlZE1hcDsKICAgICAgICAvLyBBZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcyBhbmQgbWFyayByZW1vdmFscwogICAgICAgIGZvciAobGV0IGk9MDsgaTxzcGxpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgcyA9IHNwbGljZXNbaV07CiAgICAgICAgICBzZWxlY3RlZC5mb3JFYWNoKChpZHgsIGl0ZW0pID0+IHsKICAgICAgICAgICAgaWYgKGlkeCA8IHMuaW5kZXgpIHsKICAgICAgICAgICAgICAvLyBubyBjaGFuZ2UKICAgICAgICAgICAgfSBlbHNlIGlmIChpZHggPj0gcy5pbmRleCArIHMucmVtb3ZlZC5sZW5ndGgpIHsKICAgICAgICAgICAgICAvLyBhZGp1c3QgaW5kZXgKICAgICAgICAgICAgICBzZWxlY3RlZC5zZXQoaXRlbSwgaWR4ICsgcy5hZGRlZENvdW50IC0gcy5yZW1vdmVkLmxlbmd0aCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gcmVtb3ZlIGluZGV4CiAgICAgICAgICAgICAgc2VsZWN0ZWQuc2V0KGl0ZW0sIC0xKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBmb3IgKGxldCBqPTA7IGo8cy5hZGRlZENvdW50OyBqKyspIHsKICAgICAgICAgICAgbGV0IGlkeCA9IHMuaW5kZXggKyBqOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQuaGFzKHRoaXMuaXRlbXNbaWR4XSkpIHsKICAgICAgICAgICAgICBzZWxlY3RlZC5zZXQodGhpcy5pdGVtc1tpZHhdLCBpZHgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFVwZGF0ZSBsaW5rZWQgcGF0aHMKICAgICAgICB0aGlzLl9fdXBkYXRlTGlua3MoKTsKICAgICAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgaXRlbXMgYXJyYXkKICAgICAgICBsZXQgc2lkeCA9IDA7CiAgICAgICAgc2VsZWN0ZWQuZm9yRWFjaCgoaWR4LCBpdGVtKSA9PiB7CiAgICAgICAgICBpZiAoaWR4IDwgMCkgewogICAgICAgICAgICBpZiAodGhpcy5tdWx0aSkgewogICAgICAgICAgICAgIHRoaXMuc3BsaWNlKCdzZWxlY3RlZCcsIHNpZHgsIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VsZWN0ZWQuZGVsZXRlKGl0ZW0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2lkeCsrOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICBfX3VwZGF0ZUxpbmtzKCkgewogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB7fTsKICAgICAgICBpZiAodGhpcy5tdWx0aSkgewogICAgICAgICAgbGV0IHNpZHggPSAwOwogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goaWR4ID0+IHsKICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5saW5rUGF0aHMoJ2l0ZW1zLicgKyBpZHgsICdzZWxlY3RlZC4nICsgc2lkeCsrKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5mb3JFYWNoKGlkeCA9PiB7CiAgICAgICAgICAgIHRoaXMubGlua1BhdGhzKCdzZWxlY3RlZCcsICdpdGVtcy4nICsgaWR4KTsKICAgICAgICAgICAgdGhpcy5saW5rUGF0aHMoJ3NlbGVjdGVkSXRlbScsICdpdGVtcy4nICsgaWR4KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENsZWFycyB0aGUgc2VsZWN0aW9uIHN0YXRlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2xlYXJTZWxlY3Rpb24oKSB7CiAgICAgICAgLy8gVW5iaW5kIHByZXZpb3VzIHNlbGVjdGlvbgogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB7fTsKICAgICAgICAvLyBUaGUgc2VsZWN0ZWQgbWFwIHN0b3JlcyAzIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjoKICAgICAgICAvLyBrZXk6IGl0ZW1zIGFycmF5IG9iamVjdAogICAgICAgIC8vIHZhbHVlOiBpdGVtcyBhcnJheSBpbmRleAogICAgICAgIC8vIG9yZGVyOiBzZWxlY3RlZCBhcnJheSBpbmRleAogICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAvLyBJbml0aWFsaXplIHNlbGVjdGlvbgogICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLm11bHRpID8gW10gOiBudWxsOwogICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgaXRlbSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byB0ZXN0CiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGl0ZW0gaXMgc2VsZWN0ZWQKICAgICAgICovCiAgICAgIGlzU2VsZWN0ZWQoaXRlbSkgewogICAgICAgIHJldHVybiB0aGlzLl9fc2VsZWN0ZWRNYXAuaGFzKGl0ZW0pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBpdGVtIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGlkeCBJbmRleCBmcm9tIGBpdGVtc2AgYXJyYXkgdG8gdGVzdAogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBpdGVtIGlzIHNlbGVjdGVkCiAgICAgICAqLwogICAgICBpc0luZGV4U2VsZWN0ZWQoaWR4KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZCh0aGlzLml0ZW1zW2lkeF0pOwogICAgICB9CgogICAgICBfX2Rlc2VsZWN0Q2hhbmdlZElkeChpZHgpIHsKICAgICAgICBsZXQgc2lkeCA9IHRoaXMuX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KGlkeCk7CiAgICAgICAgaWYgKHNpZHggPj0gMCkgewogICAgICAgICAgbGV0IGkgPSAwOwogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goKGlkeCwgaXRlbSkgPT4gewogICAgICAgICAgICBpZiAoc2lkeCA9PSBpKyspIHsKICAgICAgICAgICAgICB0aGlzLmRlc2VsZWN0KGl0ZW0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9fc2VsZWN0ZWRJbmRleEZvckl0ZW1JbmRleChpZHgpIHsKICAgICAgICBsZXQgc2VsZWN0ZWQgPSB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzWydpdGVtcy4nICsgaWR4XTsKICAgICAgICBpZiAoc2VsZWN0ZWQpIHsKICAgICAgICAgIHJldHVybiBwYXJzZUludChzZWxlY3RlZC5zbGljZSgnc2VsZWN0ZWQuJy5sZW5ndGgpLCAxMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRGVzZWxlY3RzIHRoZSBnaXZlbiBpdGVtIGlmIGl0IGlzIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byBkZXNlbGVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGVzZWxlY3QoaXRlbSkgewogICAgICAgIGxldCBpZHggPSB0aGlzLl9fc2VsZWN0ZWRNYXAuZ2V0KGl0ZW0pOwogICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmRlbGV0ZShpdGVtKTsKICAgICAgICAgIGxldCBzaWR4OwogICAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgICAgc2lkeCA9IHRoaXMuX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KGlkeCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fdXBkYXRlTGlua3MoKTsKICAgICAgICAgIGlmICh0aGlzLm11bHRpKSB7CiAgICAgICAgICAgIHRoaXMuc3BsaWNlKCdzZWxlY3RlZCcsIHNpZHgsIDEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBEZXNlbGVjdHMgdGhlIGdpdmVuIGluZGV4IGlmIGl0IGlzIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggSW5kZXggZnJvbSBgaXRlbXNgIGFycmF5IHRvIGRlc2VsZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBkZXNlbGVjdEluZGV4KGlkeCkgewogICAgICAgIHRoaXMuZGVzZWxlY3QodGhpcy5pdGVtc1tpZHhdKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlbGVjdHMgdGhlIGdpdmVuIGl0ZW0uICBXaGVuIGB0b2dnbGVgIGlzIHRydWUsIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgICAqIGRlc2VsZWN0IHRoZSBpdGVtIGlmIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byBzZWxlY3QKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHNlbGVjdChpdGVtKSB7CiAgICAgICAgdGhpcy5zZWxlY3RJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2VsZWN0cyB0aGUgZ2l2ZW4gaW5kZXguICBXaGVuIGB0b2dnbGVgIGlzIHRydWUsIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgICAqIGRlc2VsZWN0IHRoZSBpdGVtIGlmIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggSW5kZXggZnJvbSBgaXRlbXNgIGFycmF5IHRvIHNlbGVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgc2VsZWN0SW5kZXgoaWR4KSB7CiAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLml0ZW1zW2lkeF07CiAgICAgICAgaWYgKCF0aGlzLmlzU2VsZWN0ZWQoaXRlbSkpIHsKICAgICAgICAgIGlmICghdGhpcy5tdWx0aSkgewogICAgICAgICAgICB0aGlzLl9fc2VsZWN0ZWRNYXAuY2xlYXIoKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5zZXQoaXRlbSwgaWR4KTsKICAgICAgICAgIHRoaXMuX191cGRhdGVMaW5rcygpOwogICAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgICAgdGhpcy5wdXNoKCdzZWxlY3RlZCcsIGl0ZW0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRoaXMudG9nZ2xlKSB7CiAgICAgICAgICB0aGlzLmRlc2VsZWN0SW5kZXgoaWR4KTsKICAgICAgICB9CiAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIEFycmF5U2VsZWN0b3JNaXhpbjsKCiAgfSk7CgogIC8vIGV4cG9ydCBtaXhpbgogIFBvbHltZXIuQXJyYXlTZWxlY3Rvck1peGluID0gQXJyYXlTZWxlY3Rvck1peGluOwoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKiBAZXh0ZW5kcyB7UG9seW1lci5FbGVtZW50fQogICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0FycmF5U2VsZWN0b3JNaXhpbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGxldCBiYXNlQXJyYXlTZWxlY3RvciA9IEFycmF5U2VsZWN0b3JNaXhpbihQb2x5bWVyLkVsZW1lbnQpOwoKICAvKioKICAgKiBFbGVtZW50IGltcGxlbWVudGluZyB0aGUgYFBvbHltZXIuQXJyYXlTZWxlY3RvcmAgbWl4aW4sIHdoaWNoIHJlY29yZHMKICAgKiBkeW5hbWljIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGl0ZW0gcGF0aHMgaW4gYSBtYXN0ZXIgYGl0ZW1zYCBhcnJheSBhbmQgYQogICAqIGBzZWxlY3RlZGAgYXJyYXkgc3VjaCB0aGF0IHBhdGggY2hhbmdlcyB0byB0aGUgbWFzdGVyIGFycmF5IChhdCB0aGUgaG9zdCkKICAgKiBlbGVtZW50IG9yIGVsc2V3aGVyZSB2aWEgZGF0YS1iaW5kaW5nKSBhcmUgY29ycmVjdGx5IHByb3BhZ2F0ZWQgdG8gaXRlbXMKICAgKiBpbiB0aGUgc2VsZWN0ZWQgYXJyYXkgYW5kIHZpY2UtdmVyc2EuCiAgICoKICAgKiBUaGUgYGl0ZW1zYCBwcm9wZXJ0eSBhY2NlcHRzIGFuIGFycmF5IG9mIHVzZXIgZGF0YSwgYW5kIHZpYSB0aGUKICAgKiBgc2VsZWN0KGl0ZW0pYCBhbmQgYGRlc2VsZWN0KGl0ZW0pYCBBUEksIHVwZGF0ZXMgdGhlIGBzZWxlY3RlZGAgcHJvcGVydHkKICAgKiB3aGljaCBtYXkgYmUgYm91bmQgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGFwcGxpY2F0aW9uLCBhbmQgYW55IGNoYW5nZXMgdG8KICAgKiBzdWItZmllbGRzIG9mIGBzZWxlY3RlZGAgaXRlbShzKSB3aWxsIGJlIGtlcHQgaW4gc3luYyB3aXRoIGl0ZW1zIGluIHRoZQogICAqIGBpdGVtc2AgYXJyYXkuICBXaGVuIGBtdWx0aWAgaXMgZmFsc2UsIGBzZWxlY3RlZGAgaXMgYSBwcm9wZXJ0eQogICAqIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLiAgV2hlbiBgbXVsdGlgIGlzIHRydWUsIGBzZWxlY3RlZGAKICAgKiBpcyBhbiBhcnJheSBvZiBtdWx0aXBseSBzZWxlY3RlZCBpdGVtcy4KICAgKgogICAqIEV4YW1wbGU6CiAgICoKICAgKiBgYGBodG1sCiAgICogPGRvbS1tb2R1bGUgaWQ9ImVtcGxveWVlLWxpc3QiPgogICAqCiAgICogICA8dGVtcGxhdGU+CiAgICoKICAgKiAgICAgPGRpdj4gRW1wbG95ZWUgbGlzdDogPC9kaXY+CiAgICogICAgIDxkb20tcmVwZWF0IGlkPSJlbXBsb3llZUxpc3QiIGl0ZW1zPSJ7e2VtcGxveWVlc319Ij4KICAgKiAgICAgICA8dGVtcGxhdGU+CiAgICogICAgICAgICA8ZGl2PkZpcnN0IG5hbWU6IDxzcGFuPnt7aXRlbS5maXJzdH19PC9zcGFuPjwvZGl2PgogICAqICAgICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICAgICAgPGJ1dHRvbiBvbi1jbGljaz0idG9nZ2xlU2VsZWN0aW9uIj5TZWxlY3Q8L2J1dHRvbj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgICAgPGFycmF5LXNlbGVjdG9yIGlkPSJzZWxlY3RvciIgaXRlbXM9Int7ZW1wbG95ZWVzfX0iIHNlbGVjdGVkPSJ7e3NlbGVjdGVkfX0iIG11bHRpIHRvZ2dsZT48L2FycmF5LXNlbGVjdG9yPgogICAqCiAgICogICAgIDxkaXY+IFNlbGVjdGVkIGVtcGxveWVlczogPC9kaXY+CiAgICogICAgIDxkb20tcmVwZWF0IGl0ZW1zPSJ7e3NlbGVjdGVkfX0iPgogICAqICAgICAgIDx0ZW1wbGF0ZT4KICAgKiAgICAgICAgIDxkaXY+Rmlyc3QgbmFtZTogPHNwYW4+e3tpdGVtLmZpcnN0fX08L3NwYW4+PC9kaXY+CiAgICogICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgIDwvdGVtcGxhdGU+CiAgICoKICAgKiA8L2RvbS1tb2R1bGU+CiAgICogYGBgCiAgICoKICAgKiBgYGBqcwogICAqY2xhc3MgRW1wbG95ZWVMaXN0IGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgc3RhdGljIGdldCBpcygpIHsgcmV0dXJuICdlbXBsb3llZS1saXN0JzsgfQogICAqICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICogICAgcmV0dXJuIHsKICAgKiAgICAgIGVtcGxveWVlczogewogICAqICAgICAgICB2YWx1ZSgpIHsKICAgKiAgICAgICAgICByZXR1cm4gWwogICAqICAgICAgICAgICAge2ZpcnN0OiAnQm9iJywgbGFzdDogJ1NtaXRoJ30sCiAgICogICAgICAgICAgICB7Zmlyc3Q6ICdTYWxseScsIGxhc3Q6ICdKb2huc29uJ30sCiAgICogICAgICAgICAgICAuLi4KICAgKiAgICAgICAgICBdOwogICAqICAgICAgICB9CiAgICogICAgICB9CiAgICogICAgfTsKICAgKiAgfQogICAqICB0b2dnbGVTZWxlY3Rpb24oZSkgewogICAqICAgIGxldCBpdGVtID0gdGhpcy4kLmVtcGxveWVlTGlzdC5pdGVtRm9yRWxlbWVudChlLnRhcmdldCk7CiAgICogICAgdGhpcy4kLnNlbGVjdG9yLnNlbGVjdChpdGVtKTsKICAgKiAgfQogICAqfQogICAqIGBgYAogICAqCiAgICogQHBvbHltZXIKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIHtiYXNlQXJyYXlTZWxlY3Rvcn0KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuQXJyYXlTZWxlY3Rvck1peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0aGF0IGxpbmtzIHBhdGhzIGJldHdlZW4gYW4gaW5wdXQgYGl0ZW1zYCBhcnJheSBhbmQKICAgKiAgIGFuIG91dHB1dCBgc2VsZWN0ZWRgIGl0ZW0gb3IgYXJyYXkgYmFzZWQgb24gY2FsbHMgdG8gaXRzIHNlbGVjdGlvbiBBUEkuCiAgICovCiAgY2xhc3MgQXJyYXlTZWxlY3RvciBleHRlbmRzIGJhc2VBcnJheVNlbGVjdG9yIHsKICAgIC8vIE5vdCBuZWVkZWQgdG8gZmluZCB0ZW1wbGF0ZTsgY2FuIGJlIHJlbW92ZWQgb25jZSB0aGUgYW5hbHl6ZXIKICAgIC8vIGNhbiBmaW5kIHRoZSB0YWcgbmFtZSBmcm9tIGN1c3RvbUVsZW1lbnRzLmRlZmluZSBjYWxsCiAgICBzdGF0aWMgZ2V0IGlzKCkgeyByZXR1cm4gJ2FycmF5LXNlbGVjdG9yJzsgfQogIH0KICBjdXN0b21FbGVtZW50cy5kZWZpbmUoQXJyYXlTZWxlY3Rvci5pcywgQXJyYXlTZWxlY3Rvcik7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkFycmF5U2VsZWN0b3IgPSBBcnJheVNlbGVjdG9yOwoKfSkoKTsKCgooZnVuY3Rpb24oKXsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KJ3VzZSBzdHJpY3QnO3ZhciBjPW51bGwsZj13aW5kb3cuSFRNTEltcG9ydHMmJndpbmRvdy5IVE1MSW1wb3J0cy53aGVuUmVhZHl8fG51bGwsZztmdW5jdGlvbiBoKGEpe3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2Y/ZihhKTooY3x8KGM9bmV3IFByb21pc2UoZnVuY3Rpb24oYSl7Zz1hfSksImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGU/ZygpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGZ1bmN0aW9uKCl7ImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGUmJmcoKX0pKSxjLnRoZW4oZnVuY3Rpb24oKXthJiZhKCl9KSl9KX07dmFyIGs9bnVsbCxsPW51bGw7ZnVuY3Rpb24gbSgpe3RoaXMuY3VzdG9tU3R5bGVzPVtdO3RoaXMuZW5xdWV1ZWQ9ITE7aChmdW5jdGlvbigpe3dpbmRvdy5TaGFkeUNTUy5mbHVzaEN1c3RvbVN0eWxlcyYmd2luZG93LlNoYWR5Q1NTLmZsdXNoQ3VzdG9tU3R5bGVzKCl9KX1mdW5jdGlvbiBuKGEpeyFhLmVucXVldWVkJiZsJiYoYS5lbnF1ZXVlZD0hMCxoKGwpKX1tLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe2EuX19zZWVuQnlTaGFkeUNTU3x8KGEuX19zZWVuQnlTaGFkeUNTUz0hMCx0aGlzLmN1c3RvbVN0eWxlcy5wdXNoKGEpLG4odGhpcykpfTttLnByb3RvdHlwZS5iPWZ1bmN0aW9uKGEpe2lmKGEuX19zaGFkeUNTU0NhY2hlZFN0eWxlKXJldHVybiBhLl9fc2hhZHlDU1NDYWNoZWRTdHlsZTt2YXIgYjthLmdldFN0eWxlP2I9YS5nZXRTdHlsZSgpOmI9YTtyZXR1cm4gYn07Cm0ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5jdXN0b21TdHlsZXMsYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdO2lmKCFkLl9fc2hhZHlDU1NDYWNoZWRTdHlsZSl7dmFyIGU9dGhpcy5iKGQpO2UmJihlPWUuX19hcHBsaWVkRWxlbWVudHx8ZSxrJiZrKGUpLGQuX19zaGFkeUNTU0NhY2hlZFN0eWxlPWUpfX1yZXR1cm4gYX07bS5wcm90b3R5cGUuYWRkQ3VzdG9tU3R5bGU9bS5wcm90b3R5cGUuYzttLnByb3RvdHlwZS5nZXRTdHlsZUZvckN1c3RvbVN0eWxlPW0ucHJvdG90eXBlLmI7bS5wcm90b3R5cGUucHJvY2Vzc1N0eWxlcz1tLnByb3RvdHlwZS5hOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyhtLnByb3RvdHlwZSx7dHJhbnNmb3JtQ2FsbGJhY2s6e2dldDpmdW5jdGlvbigpe3JldHVybiBrfSxzZXQ6ZnVuY3Rpb24oYSl7az1hfX0sdmFsaWRhdGVDYWxsYmFjazp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGx9LHNldDpmdW5jdGlvbihhKXt2YXIgYj0hMTtsfHwoYj0hMCk7bD1hO2ImJm4odGhpcyl9fX0pO2Z1bmN0aW9uIHAoYSxiKXtmb3IodmFyIGQgaW4gYiludWxsPT09ZD9hLnN0eWxlLnJlbW92ZVByb3BlcnR5KGQpOmEuc3R5bGUuc2V0UHJvcGVydHkoZCxiW2RdKX07dmFyIHE9ISh3aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS5pblVzZSkscjtmdW5jdGlvbiB0KGEpe3I9YSYmYS5zaGltY3NzcHJvcGVydGllcz8hMTpxfHwhKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FwcGxlV2ViS2l0XC82MDF8RWRnZVwvMTUvKXx8IXdpbmRvdy5DU1N8fCFDU1Muc3VwcG9ydHN8fCFDU1Muc3VwcG9ydHMoImJveC1zaGFkb3ciLCIwIDAgMCB2YXIoLS1mb28pIikpfXZhciB1O3dpbmRvdy5TaGFkeUNTUyYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkJiYodT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQpO3ZhciB2PSEoIXdpbmRvdy5TaGFkeUNTU3x8IXdpbmRvdy5TaGFkeUNTUy5kaXNhYmxlUnVudGltZSk7CndpbmRvdy5TaGFkeUNTUyYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzcz9yPXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M6d2luZG93LlNoYWR5Q1NTPyh0KHdpbmRvdy5TaGFkeUNTUyksd2luZG93LlNoYWR5Q1NTPXZvaWQgMCk6dCh3aW5kb3cuV2ViQ29tcG9uZW50cyYmd2luZG93LldlYkNvbXBvbmVudHMuZmxhZ3MpO3ZhciB3PXIseD11O3ZhciB5PW5ldyBtO3dpbmRvdy5TaGFkeUNTU3x8KHdpbmRvdy5TaGFkeUNTUz17cHJlcGFyZVRlbXBsYXRlOmZ1bmN0aW9uKCl7fSxwcmVwYXJlVGVtcGxhdGVEb206ZnVuY3Rpb24oKXt9LHByZXBhcmVUZW1wbGF0ZVN0eWxlczpmdW5jdGlvbigpe30sc3R5bGVTdWJ0cmVlOmZ1bmN0aW9uKGEsYil7eS5hKCk7cChhLGIpfSxzdHlsZUVsZW1lbnQ6ZnVuY3Rpb24oKXt5LmEoKX0sc3R5bGVEb2N1bWVudDpmdW5jdGlvbihhKXt5LmEoKTtwKGRvY3VtZW50LmJvZHksYSl9LGdldENvbXB1dGVkU3R5bGVWYWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybihhPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLmdldFByb3BlcnR5VmFsdWUoYikpP2EudHJpbSgpOiIifSxmbHVzaEN1c3RvbVN0eWxlczpmdW5jdGlvbigpe30sbmF0aXZlQ3NzOncsbmF0aXZlU2hhZG93OnEsY3NzQnVpbGQ6eCxkaXNhYmxlUnVudGltZTp2fSk7d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlPXk7fSkuY2FsbCh0aGlzKTsKCgoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGNvbnN0IGF0dHIgPSAnaW5jbHVkZSc7CgogIGNvbnN0IEN1c3RvbVN0eWxlSW50ZXJmYWNlID0gd2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlOwoKICAvKioKICAgKiBDdXN0b20gZWxlbWVudCBmb3IgZGVmaW5pbmcgc3R5bGVzIGluIHRoZSBtYWluIGRvY3VtZW50IHRoYXQgY2FuIHRha2UKICAgKiBhZHZhbnRhZ2Ugb2YgW3NoYWR5IERPTV0oaHR0cHM6Ly9naXRodWIuY29tL3dlYmNvbXBvbmVudHMvc2hhZHljc3MpIHNoaW1zCiAgICogZm9yIHN0eWxlIGVuY2Fwc3VsYXRpb24sIGN1c3RvbSBwcm9wZXJ0aWVzLCBhbmQgY3VzdG9tIG1peGlucy4KICAgKgogICAqIC0gRG9jdW1lbnQgc3R5bGVzIGRlZmluZWQgaW4gYSBgPGN1c3RvbS1zdHlsZT5gIGFyZSBzaGltbWVkIHRvIGVuc3VyZSB0aGV5CiAgICogICBkbyBub3QgbGVhayBpbnRvIGxvY2FsIERPTSB3aGVuIHJ1bm5pbmcgb24gYnJvd3NlcnMgd2l0aG91dCBuYXRpdmUKICAgKiAgIFNoYWRvdyBET00uCiAgICogLSBDdXN0b20gcHJvcGVydGllcyBjYW4gYmUgZGVmaW5lZCBpbiBhIGA8Y3VzdG9tLXN0eWxlPmAuIFVzZSB0aGUgYGh0bWxgIHNlbGVjdG9yCiAgICogICB0byBkZWZpbmUgY3VzdG9tIHByb3BlcnRpZXMgdGhhdCBhcHBseSB0byBhbGwgY3VzdG9tIGVsZW1lbnRzLgogICAqIC0gQ3VzdG9tIG1peGlucyBjYW4gYmUgZGVmaW5lZCBpbiBhIGA8Y3VzdG9tLXN0eWxlPmAsIGlmIHlvdSBpbXBvcnQgdGhlIG9wdGlvbmFsCiAgICogICBbYXBwbHkgc2hpbV0oaHR0cHM6Ly9naXRodWIuY29tL3dlYmNvbXBvbmVudHMvc2hhZHljc3MjYWJvdXQtYXBwbHlzaGltKQogICAqICAgKGBzaGFkeWNzcy9hcHBseS1zaGltLmh0bWxgKS4KICAgKgogICAqIFRvIHVzZToKICAgKgogICAqIC0gSW1wb3J0IGBjdXN0b20tc3R5bGUuaHRtbGAuCiAgICogLSBQbGFjZSBhIGA8Y3VzdG9tLXN0eWxlPmAgZWxlbWVudCBpbiB0aGUgbWFpbiBkb2N1bWVudCwgd3JhcHBpbmcgYW4gaW5saW5lIGA8c3R5bGU+YCB0YWcgdGhhdAogICAqICAgY29udGFpbnMgdGhlIENTUyBydWxlcyB5b3Ugd2FudCB0byBzaGltLgogICAqCiAgICogRm9yIGV4YW1wbGU6CiAgICoKICAgKiBgYGBodG1sCiAgICogPCEtLSBpbXBvcnQgYXBwbHkgc2hpbS0tb25seSByZXF1aXJlZCBpZiB1c2luZyBtaXhpbnMgLS0+CiAgICogPGxpbmsgcmVsPSJpbXBvcnQiIGhyZWY9ImJvd2VyX2NvbXBvbmVudHMvc2hhZHljc3MvYXBwbHktc2hpbS5odG1sIj4KICAgKiA8IS0tIGltcG9ydCBjdXN0b20tc3R5bGUgZWxlbWVudCAtLT4KICAgKiA8bGluayByZWw9ImltcG9ydCIgaHJlZj0iYm93ZXJfY29tcG9uZW50cy9wb2x5bWVyL2xpYi9lbGVtZW50cy9jdXN0b20tc3R5bGUuaHRtbCI+CiAgICoKICAgKiA8Y3VzdG9tLXN0eWxlPgogICAqICAgPHN0eWxlPgogICAqICAgICBodG1sIHsKICAgKiAgICAgICAtLWN1c3RvbS1jb2xvcjogYmx1ZTsKICAgKiAgICAgICAtLWN1c3RvbS1taXhpbjogewogICAqICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICogICAgICAgICBjb2xvcjogcmVkOwogICAqICAgICAgIH07CiAgICogICAgIH0KICAgKiAgIDwvc3R5bGU+CiAgICogPC9jdXN0b20tc3R5bGU+CiAgICogYGBgCiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIEhUTUxFbGVtZW50CiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCBmb3IgZGVmaW5pbmcgc3R5bGVzIGluIHRoZSBtYWluIGRvY3VtZW50IHRoYXQgY2FuCiAgICogICB0YWtlIGFkdmFudGFnZSBvZiBQb2x5bWVyJ3Mgc3R5bGUgc2NvcGluZyBhbmQgY3VzdG9tIHByb3BlcnRpZXMgc2hpbXMuCiAgICovCiAgY2xhc3MgQ3VzdG9tU3R5bGUgZXh0ZW5kcyBIVE1MRWxlbWVudCB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5fc3R5bGUgPSBudWxsOwogICAgICBDdXN0b21TdHlsZUludGVyZmFjZS5hZGRDdXN0b21TdHlsZSh0aGlzKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbGlnaHQtRE9NIGA8c3R5bGU+YCBjaGlsZCB0aGlzIGVsZW1lbnQgd3JhcHMuICBVcG9uIGZpcnN0CiAgICAgKiBjYWxsIGFueSBzdHlsZSBtb2R1bGVzIHJlZmVyZW5jZWQgdmlhIHRoZSBgaW5jbHVkZWAgYXR0cmlidXRlIHdpbGwgYmUKICAgICAqIGNvbmNhdGVuYXRlZCB0byB0aGlzIGVsZW1lbnQncyBgPHN0eWxlPmAuCiAgICAgKgogICAgICogQHJldHVybiB7SFRNTFN0eWxlRWxlbWVudH0gVGhpcyBlbGVtZW50J3MgbGlnaHQtRE9NIGA8c3R5bGU+YAogICAgICovCiAgICBnZXRTdHlsZSgpIHsKICAgICAgaWYgKHRoaXMuX3N0eWxlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlOwogICAgICB9CiAgICAgIGNvbnN0IHN0eWxlID0gLyoqIEB0eXBlIHtIVE1MU3R5bGVFbGVtZW50fSAqLyh0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlJykpOwogICAgICBpZiAoIXN0eWxlKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgdGhpcy5fc3R5bGUgPSBzdHlsZTsKICAgICAgY29uc3QgaW5jbHVkZSA9IHN0eWxlLmdldEF0dHJpYnV0ZShhdHRyKTsKICAgICAgaWYgKGluY2x1ZGUpIHsKICAgICAgICBzdHlsZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7CiAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSBQb2x5bWVyLlN0eWxlR2F0aGVyLmNzc0Zyb21Nb2R1bGVzKGluY2x1ZGUpICsgc3R5bGUudGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgLyoKICAgICAgSFRNTCBJbXBvcnRzIHN0eWxpbmcgdGhlIG1haW4gZG9jdW1lbnQgYXJlIGRlcHJlY2F0ZWQgaW4gQ2hyb21lCiAgICAgIGh0dHBzOi8vY3JidWcuY29tLzUyMzk1MgoKICAgICAgSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBpbiB0aGUgbWFpbiBkb2N1bWVudCwgdGhlbiBpdCBtdXN0IGJlIGluIGFuIEhUTUwgSW1wb3J0IGRvY3VtZW50LgogICAgICBJbiB0aGF0IGNhc2UsIG1vdmUgdGhlIGN1c3RvbSBzdHlsZSB0byB0aGUgbWFpbiBkb2N1bWVudC4KCiAgICAgIFRoZSBvcmRlcmluZyBvZiBgPGN1c3RvbS1zdHlsZT5gIHNob3VsZCBzdGF5IHRoZSBzYW1lIGFzIHdoZW4gbG9hZGVkIGJ5IEhUTUwgSW1wb3J0cywgYnV0IHRoZXJlIG1heSBiZSBvZGQKICAgICAgY2FzZXMgb2Ygb3JkZXJpbmcgdy5yLnQgdGhlIG1haW4gZG9jdW1lbnQgc3R5bGVzLgogICAgICAqLwogICAgICBpZiAodGhpcy5vd25lckRvY3VtZW50ICE9PSB3aW5kb3cuZG9jdW1lbnQpIHsKICAgICAgICB3aW5kb3cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0aGlzKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5fc3R5bGU7CiAgICB9CiAgfQoKICB3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdjdXN0b20tc3R5bGUnLCBDdXN0b21TdHlsZSk7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkN1c3RvbVN0eWxlID0gQ3VzdG9tU3R5bGU7Cn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IG11dGFibGVQcm9wZXJ0eUNoYW5nZTsKICAvKiogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gKi8KICAoKCkgPT4gewogICAgbXV0YWJsZVByb3BlcnR5Q2hhbmdlID0gUG9seW1lci5NdXRhYmxlRGF0YS5fbXV0YWJsZVByb3BlcnR5Q2hhbmdlOwogIH0pKCk7CgogIC8qKgogICAqIExlZ2FjeSBlbGVtZW50IGJlaGF2aW9yIHRvIHNraXAgc3RyaWN0IGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZCBhcnJheXMsCiAgICogKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpIGZvciB1c2Ugb24gbGVnYWN5IEFQSSBQb2x5bWVyIGVsZW1lbnRzLgogICAqCiAgICogQnkgZGVmYXVsdCwgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCBwZXJmb3JtcyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgb24KICAgKiBvYmplY3RzLCB3aGljaCBtZWFucyB0aGF0IGFueSBkZWVwIG1vZGlmaWNhdGlvbnMgdG8gYW4gb2JqZWN0IG9yIGFycmF5IHdpbGwKICAgKiBub3QgYmUgcHJvcGFnYXRlZCB1bmxlc3MgImltbXV0YWJsZSIgZGF0YSBwYXR0ZXJucyBhcmUgdXNlZCAoaS5lLiBhbGwgb2JqZWN0CiAgICogcmVmZXJlbmNlcyBmcm9tIHRoZSByb290IHRvIHRoZSBtdXRhdGlvbiB3ZXJlIGNoYW5nZWQpLgogICAqCiAgICogUG9seW1lciBhbHNvIHByb3ZpZGVzIGEgcHJvcHJpZXRhcnkgZGF0YSBtdXRhdGlvbiBhbmQgcGF0aCBub3RpZmljYXRpb24gQVBJCiAgICogKGUuZy4gYG5vdGlmeVBhdGhgLCBgc2V0YCwgYW5kIGFycmF5IG11dGF0aW9uIEFQSSdzKSB0aGF0IGFsbG93IGVmZmljaWVudAogICAqIG11dGF0aW9uIGFuZCBub3RpZmljYXRpb24gb2YgZGVlcCBjaGFuZ2VzIGluIGFuIG9iamVjdCBncmFwaCB0byBhbGwgZWxlbWVudHMKICAgKiBib3VuZCB0byB0aGUgc2FtZSBvYmplY3QgZ3JhcGguCiAgICoKICAgKiBJbiBjYXNlcyB3aGVyZSBuZWl0aGVyIGltbXV0YWJsZSBwYXR0ZXJucyBub3IgdGhlIGRhdGEgbXV0YXRpb24gQVBJIGNhbiBiZQogICAqIHVzZWQsIGFwcGx5aW5nIHRoaXMgbWl4aW4gd2lsbCBjYXVzZSBQb2x5bWVyIHRvIHNraXAgZGlydHkgY2hlY2tpbmcgZm9yCiAgICogb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZSAiZGlydHkiKS4gIFRoaXMgYWxsb3dzIGEKICAgKiB1c2VyIHRvIG1ha2UgYSBkZWVwIG1vZGlmaWNhdGlvbiB0byBhIGJvdW5kIG9iamVjdCBncmFwaCwgYW5kIHRoZW4gZWl0aGVyCiAgICogc2ltcGx5IHJlLXNldCB0aGUgb2JqZWN0IChlLmcuIGB0aGlzLml0ZW1zID0gdGhpcy5pdGVtc2ApIG9yIGNhbGwgYG5vdGlmeVBhdGhgCiAgICogKGUuZy4gYHRoaXMubm90aWZ5UGF0aCgnaXRlbXMnKWApIHRvIHVwZGF0ZSB0aGUgdHJlZS4gIE5vdGUgdGhhdCBhbGwKICAgKiBlbGVtZW50cyB0aGF0IHdpc2ggdG8gYmUgdXBkYXRlZCBiYXNlZCBvbiBkZWVwIG11dGF0aW9ucyBtdXN0IGFwcGx5IHRoaXMKICAgKiBtaXhpbiBvciBvdGhlcndpc2Ugc2tpcCBzdHJpY3QgZGlydHkgY2hlY2tpbmcgZm9yIG9iamVjdHMvYXJyYXlzLgogICAqIFNwZWNpZmljYWxseSwgYW55IGVsZW1lbnRzIGluIHRoZSBiaW5kaW5nIHRyZWUgYmV0d2VlbiB0aGUgc291cmNlIG9mIGEKICAgKiBtdXRhdGlvbiBhbmQgdGhlIGNvbnN1bXB0aW9uIG9mIGl0IG11c3QgYXBwbHkgdGhpcyBiZWhhdmlvciBvciBlbmFibGUgdGhlCiAgICogYFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yYC4KICAgKgogICAqIEluIG9yZGVyIHRvIG1ha2UgdGhlIGRpcnR5IGNoZWNrIHN0cmF0ZWd5IGNvbmZpZ3VyYWJsZSwgc2VlCiAgICogYFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yYC4KICAgKgogICAqIE5vdGUsIHRoZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcHJvcGFnYXRpbmcgbGFyZ2Ugb2JqZWN0IGdyYXBocwogICAqIHdpbGwgYmUgd29yc2UgYXMgb3Bwb3NlZCB0byB1c2luZyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgd2l0aCBpbW11dGFibGUKICAgKiBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24gQVBJLgogICAqCiAgICogQHBvbHltZXJCZWhhdmlvcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgQmVoYXZpb3IgdG8gc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kCiAgICogICBhcnJheXMKICAgKi8KICBQb2x5bWVyLk11dGFibGVEYXRhQmVoYXZpb3IgPSB7CgogICAgLyoqCiAgICAgKiBPdmVycmlkZXMgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCB0byBwcm92aWRlIG9wdGlvbiBmb3Igc2tpcHBpbmcKICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIHB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYAogICAgICogY2FjaGUgKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAqIGNhY2hlIGlzIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHR1cm4sIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzCiAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAqIGN5Y2xlcyBkdWUgdG8gMi13YXkgbm90aWZpY2F0aW9uKS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgcmV0dXJuIG11dGFibGVQcm9wZXJ0eUNoYW5nZSh0aGlzLCBwcm9wZXJ0eSwgdmFsdWUsIG9sZCwgdHJ1ZSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogTGVnYWN5IGVsZW1lbnQgYmVoYXZpb3IgdG8gYWRkIHRoZSBvcHRpb25hbCBhYmlsaXR5IHRvIHNraXAgc3RyaWN0CiAgICogZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUKICAgKiAiZGlydHkiKSBieSBzZXR0aW5nIGEgYG11dGFibGUtZGF0YWAgYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgaW5zdGFuY2UuCiAgICoKICAgKiBCeSBkZWZhdWx0LCBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHBlcmZvcm1zIHN0cmljdCBkaXJ0eSBjaGVja2luZyBvbgogICAqIG9iamVjdHMsIHdoaWNoIG1lYW5zIHRoYXQgYW55IGRlZXAgbW9kaWZpY2F0aW9ucyB0byBhbiBvYmplY3Qgb3IgYXJyYXkgd2lsbAogICAqIG5vdCBiZSBwcm9wYWdhdGVkIHVubGVzcyAiaW1tdXRhYmxlIiBkYXRhIHBhdHRlcm5zIGFyZSB1c2VkIChpLmUuIGFsbCBvYmplY3QKICAgKiByZWZlcmVuY2VzIGZyb20gdGhlIHJvb3QgdG8gdGhlIG11dGF0aW9uIHdlcmUgY2hhbmdlZCkuCiAgICoKICAgKiBQb2x5bWVyIGFsc28gcHJvdmlkZXMgYSBwcm9wcmlldGFyeSBkYXRhIG11dGF0aW9uIGFuZCBwYXRoIG5vdGlmaWNhdGlvbiBBUEkKICAgKiAoZS5nLiBgbm90aWZ5UGF0aGAsIGBzZXRgLCBhbmQgYXJyYXkgbXV0YXRpb24gQVBJJ3MpIHRoYXQgYWxsb3cgZWZmaWNpZW50CiAgICogbXV0YXRpb24gYW5kIG5vdGlmaWNhdGlvbiBvZiBkZWVwIGNoYW5nZXMgaW4gYW4gb2JqZWN0IGdyYXBoIHRvIGFsbCBlbGVtZW50cwogICAqIGJvdW5kIHRvIHRoZSBzYW1lIG9iamVjdCBncmFwaC4KICAgKgogICAqIEluIGNhc2VzIHdoZXJlIG5laXRoZXIgaW1tdXRhYmxlIHBhdHRlcm5zIG5vciB0aGUgZGF0YSBtdXRhdGlvbiBBUEkgY2FuIGJlCiAgICogdXNlZCwgYXBwbHlpbmcgdGhpcyBtaXhpbiB3aWxsIGFsbG93IFBvbHltZXIgdG8gc2tpcCBkaXJ0eSBjaGVja2luZyBmb3IKICAgKiBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpLiAgVGhpcyBhbGxvd3MgYQogICAqIHVzZXIgdG8gbWFrZSBhIGRlZXAgbW9kaWZpY2F0aW9uIHRvIGEgYm91bmQgb2JqZWN0IGdyYXBoLCBhbmQgdGhlbiBlaXRoZXIKICAgKiBzaW1wbHkgcmUtc2V0IHRoZSBvYmplY3QgKGUuZy4gYHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zYCkgb3IgY2FsbCBgbm90aWZ5UGF0aGAKICAgKiAoZS5nLiBgdGhpcy5ub3RpZnlQYXRoKCdpdGVtcycpYCkgdG8gdXBkYXRlIHRoZSB0cmVlLiAgTm90ZSB0aGF0IGFsbAogICAqIGVsZW1lbnRzIHRoYXQgd2lzaCB0byBiZSB1cGRhdGVkIGJhc2VkIG9uIGRlZXAgbXV0YXRpb25zIG11c3QgYXBwbHkgdGhpcwogICAqIG1peGluIG9yIG90aGVyd2lzZSBza2lwIHN0cmljdCBkaXJ0eSBjaGVja2luZyBmb3Igb2JqZWN0cy9hcnJheXMuCiAgICogU3BlY2lmaWNhbGx5LCBhbnkgZWxlbWVudHMgaW4gdGhlIGJpbmRpbmcgdHJlZSBiZXR3ZWVuIHRoZSBzb3VyY2Ugb2YgYQogICAqIG11dGF0aW9uIGFuZCB0aGUgY29uc3VtcHRpb24gb2YgaXQgbXVzdCBlbmFibGUgdGhpcyBiZWhhdmlvciBvciBhcHBseSB0aGUKICAgKiBgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3JgLgogICAqCiAgICogV2hpbGUgdGhpcyBiZWhhdmlvciBhZGRzIHRoZSBhYmlsaXR5IHRvIGZvcmdvIE9iamVjdC9BcnJheSBkaXJ0eSBjaGVja2luZywKICAgKiB0aGUgYG11dGFibGVEYXRhYCBmbGFnIGRlZmF1bHRzIHRvIGZhbHNlIGFuZCBtdXN0IGJlIHNldCBvbiB0aGUgaW5zdGFuY2UuCiAgICoKICAgKiBOb3RlLCB0aGUgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIG9mIHByb3BhZ2F0aW5nIGxhcmdlIG9iamVjdCBncmFwaHMKICAgKiB3aWxsIGJlIHdvcnNlIGJ5IHJlbHlpbmcgb24gYG11dGFibGVEYXRhOiB0cnVlYCBhcyBvcHBvc2VkIHRvIHVzaW5nCiAgICogc3RyaWN0IGRpcnR5IGNoZWNraW5nIHdpdGggaW1tdXRhYmxlIHBhdHRlcm5zIG9yIFBvbHltZXIncyBwYXRoIG5vdGlmaWNhdGlvbgogICAqIEFQSS4KICAgKgogICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEJlaGF2aW9yIHRvIG9wdGlvbmFsbHkgc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kCiAgICogICBhcnJheXMKICAgKi8KICBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvciA9IHsKCiAgICBwcm9wZXJ0aWVzOiB7CiAgICAgIC8qKgogICAgICAgKiBJbnN0YW5jZS1sZXZlbCBmbGFnIGZvciBjb25maWd1cmluZyB0aGUgZGlydHktY2hlY2tpbmcgc3RyYXRlZ3kKICAgICAgICogZm9yIHRoaXMgZWxlbWVudC4gIFdoZW4gdHJ1ZSwgT2JqZWN0cyBhbmQgQXJyYXlzIHdpbGwgc2tpcCBkaXJ0eQogICAgICAgKiBjaGVja2luZywgb3RoZXJ3aXNlIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyB3aWxsIGJlIHVzZWQuCiAgICAgICAqLwogICAgICBtdXRhYmxlRGF0YTogQm9vbGVhbgogICAgfSwKCiAgICAvKioKICAgICAqIE92ZXJyaWRlcyBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHRvIHNraXAgc3RyaWN0IGVxdWFsaXR5IGNoZWNraW5nCiAgICAgKiBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICoKICAgICAqIFB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYCBjYWNoZQogICAgICogKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAqIGNhY2hlIGlzIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHR1cm4sIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzCiAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAqIGN5Y2xlcyBkdWUgdG8gMi13YXkgbm90aWZpY2F0aW9uKS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICogQHRoaXMge3RoaXN9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCkgewogICAgICByZXR1cm4gbXV0YWJsZVByb3BlcnR5Q2hhbmdlKHRoaXMsIHByb3BlcnR5LCB2YWx1ZSwgb2xkLCB0aGlzLm11dGFibGVEYXRhKTsKICAgIH0KICB9OwoKfSkoKTsKCgoKICAvLyBiYwogIFBvbHltZXIuQmFzZSA9IFBvbHltZXIuTGVnYWN5RWxlbWVudE1peGluKEhUTUxFbGVtZW50KS5wcm90b3R5cGU7CgogIC8vIE5PVEU6IHRoaXMgaXMgaGVyZSBmb3IgbW9kdWxpemVyIHRvIGV4cG9ydCBgaHRtbGAgZm9yIHRoZSBtb2R1bGUgdmVyc2lvbiBvZiB0aGlzIGZpbGUKICBQb2x5bWVyLmh0bWwgPSBQb2x5bWVyLmh0bWw7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1mbGV4LWxheW91dC9pcm9uLWZsZXgtbGF5b3V0Lmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTthLnRleHRDb250ZW50PSJbaGlkZGVuXSB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSI7ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChhKX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1hMTF5LWtleXMtYmVoYXZpb3IvaXJvbi1hMTF5LWtleXMtYmVoYXZpb3IuaHRtbC5qcwooZnVuY3Rpb24oKXtmdW5jdGlvbiBhKHgsQyl7dmFyIEY9IiI7aWYoeClpZih4PXgudG9Mb3dlckNhc2UoKSwiICI9PT14fHx5LnRlc3QoeCkpRj0ic3BhY2UiO2Vsc2UgaWYoei50ZXN0KHgpKUY9ImVzYyI7ZWxzZSBpZigxPT14Lmxlbmd0aCl7aWYoIUN8fHIudGVzdCh4KSlGPXh9ZWxzZSBGPXYudGVzdCh4KT94LnJlcGxhY2UoImFycm93IiwiIik6Im11bHRpcGx5Ij09eD8iKiI6eDtyZXR1cm4gRn1mdW5jdGlvbiBjKHgpe3ZhciBDPSIiO3gmJih4IGluIG4/Qz1uW3hdOnQudGVzdCh4KT8oeD1wYXJzZUludCh4LnJlcGxhY2UoIlUrIiwiMHgiKSwxNiksQz1TdHJpbmcuZnJvbUNoYXJDb2RlKHgpLnRvTG93ZXJDYXNlKCkpOkM9eC50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gQ31mdW5jdGlvbiBkKHgpe3ZhciBDPSIiO051bWJlcih4KSYmKEM9NjU8PXgmJjkwPj14P1N0cmluZy5mcm9tQ2hhckNvZGUoMzIreCk6MTEyPD14JiYxMjM+PXg/ImYiKyh4LTExMisxKTo0ODw9eCYmNTc+PXg/ClN0cmluZyh4LTQ4KTo5Njw9eCYmMTA1Pj14P1N0cmluZyh4LTk2KTpwW3hdKTtyZXR1cm4gQ31mdW5jdGlvbiBmKHgsQyl7cmV0dXJuIHgua2V5P2EoeC5rZXksQyk6eC5kZXRhaWwmJnguZGV0YWlsLmtleT9hKHguZGV0YWlsLmtleSxDKTpjKHgua2V5SWRlbnRpZmllcil8fGQoeC5rZXlDb2RlKXx8IiJ9ZnVuY3Rpb24gZyh4LEMpe3JldHVybiBmKEMseC5oYXNNb2RpZmllcnMpPT09eC5rZXkmJigheC5oYXNNb2RpZmllcnN8fCEhQy5zaGlmdEtleT09PSEheC5zaGlmdEtleSYmISFDLmN0cmxLZXk9PT0hIXguY3RybEtleSYmISFDLmFsdEtleT09PSEheC5hbHRLZXkmJiEhQy5tZXRhS2V5PT09ISF4Lm1ldGFLZXkpfWZ1bmN0aW9uIGwoeCl7cmV0dXJuIDE9PT14Lmxlbmd0aD97Y29tYm86eCxrZXk6eCxldmVudDoia2V5ZG93biJ9Onguc3BsaXQoIisiKS5yZWR1Y2UoZnVuY3Rpb24oQyxGKXt2YXIgRD1GLnNwbGl0KCI6Iik7Rj1EWzBdO0Q9RFsxXTtGIGluIHE/KENbcVtGXV09ITAsCkMuaGFzTW9kaWZpZXJzPSEwKTooQy5rZXk9RixDLmV2ZW50PUR8fCJrZXlkb3duIik7cmV0dXJuIEN9LHtjb21ibzp4LnNwbGl0KCI6Iikuc2hpZnQoKX0pfWZ1bmN0aW9uIGsoeCl7cmV0dXJuIHgudHJpbSgpLnNwbGl0KCIgIikubWFwKGZ1bmN0aW9uKEMpe3JldHVybiBsKEMpfSl9dmFyIG49eyJVKzAwMDgiOiJiYWNrc3BhY2UiLCJVKzAwMDkiOiJ0YWIiLCJVKzAwMUIiOiJlc2MiLCJVKzAwMjAiOiJzcGFjZSIsIlUrMDA3RiI6ImRlbCJ9LHA9ezg6ImJhY2tzcGFjZSIsOToidGFiIiwxMzoiZW50ZXIiLDI3OiJlc2MiLDMzOiJwYWdldXAiLDM0OiJwYWdlZG93biIsMzU6ImVuZCIsMzY6ImhvbWUiLDMyOiJzcGFjZSIsMzc6ImxlZnQiLDM4OiJ1cCIsMzk6InJpZ2h0Iiw0MDoiZG93biIsNDY6ImRlbCIsMTA2OiIqIn0scT17c2hpZnQ6InNoaWZ0S2V5IixjdHJsOiJjdHJsS2V5IixhbHQ6ImFsdEtleSIsbWV0YToibWV0YUtleSJ9LHI9L1thLXowLTkqXS8sdD0vVVwrLyx2PS9eYXJyb3cvLAp5PS9ec3BhY2UoYmFyKT8vLHo9L15lc2NhcGUkLztQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yPXtwcm9wZXJ0aWVzOntrZXlFdmVudFRhcmdldDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319LHN0b3BLZXlib2FyZEV2ZW50UHJvcGFnYXRpb246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2JvdW5kS2V5SGFuZGxlcnM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LF9pbXBlcmF0aXZlS2V5QmluZGluZ3M6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fX0sb2JzZXJ2ZXJzOlsiX3Jlc2V0S2V5RXZlbnRMaXN0ZW5lcnMoa2V5RXZlbnRUYXJnZXQsIF9ib3VuZEtleUhhbmRsZXJzKSJdLGtleUJpbmRpbmdzOnt9LHJlZ2lzdGVyZWQ6ZnVuY3Rpb24oKXt0aGlzLl9wcmVwS2V5QmluZGluZ3MoKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9saXN0ZW5LZXlFdmVudExpc3RlbmVycygpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VubGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKX0sCmFkZE93bktleUJpbmRpbmc6ZnVuY3Rpb24oeCxDKXt0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3NbeF09Qzt0aGlzLl9wcmVwS2V5QmluZGluZ3MoKTt0aGlzLl9yZXNldEtleUV2ZW50TGlzdGVuZXJzKCl9LHJlbW92ZU93bktleUJpbmRpbmdzOmZ1bmN0aW9uKCl7dGhpcy5faW1wZXJhdGl2ZUtleUJpbmRpbmdzPXt9O3RoaXMuX3ByZXBLZXlCaW5kaW5ncygpO3RoaXMuX3Jlc2V0S2V5RXZlbnRMaXN0ZW5lcnMoKX0sa2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzOmZ1bmN0aW9uKHgsQyl7Qz1rKEMpO2Zvcih2YXIgRj0wO0Y8Qy5sZW5ndGg7KytGKWlmKGcoQ1tGXSx4KSlyZXR1cm4hMDtyZXR1cm4hMX0sX2NvbGxlY3RLZXlCaW5kaW5nczpmdW5jdGlvbigpe3ZhciB4PXRoaXMuYmVoYXZpb3JzLm1hcChmdW5jdGlvbihDKXtyZXR1cm4gQy5rZXlCaW5kaW5nc30pOy0xPT09eC5pbmRleE9mKHRoaXMua2V5QmluZGluZ3MpJiZ4LnB1c2godGhpcy5rZXlCaW5kaW5ncyk7cmV0dXJuIHh9LApfcHJlcEtleUJpbmRpbmdzOmZ1bmN0aW9uKCl7dGhpcy5fa2V5QmluZGluZ3M9e307dGhpcy5fY29sbGVjdEtleUJpbmRpbmdzKCkuZm9yRWFjaChmdW5jdGlvbihGKXtmb3IodmFyIEQgaW4gRil0aGlzLl9hZGRLZXlCaW5kaW5nKEQsRltEXSl9LHRoaXMpO2Zvcih2YXIgeCBpbiB0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3MpdGhpcy5fYWRkS2V5QmluZGluZyh4LHRoaXMuX2ltcGVyYXRpdmVLZXlCaW5kaW5nc1t4XSk7Zm9yKHZhciBDIGluIHRoaXMuX2tleUJpbmRpbmdzKXRoaXMuX2tleUJpbmRpbmdzW0NdLnNvcnQoZnVuY3Rpb24oRixEKXtGPUZbMF0uaGFzTW9kaWZpZXJzO3JldHVybiBGPT09RFswXS5oYXNNb2RpZmllcnM/MDpGPy0xOjF9KX0sX2FkZEtleUJpbmRpbmc6ZnVuY3Rpb24oeCxDKXtrKHgpLmZvckVhY2goZnVuY3Rpb24oRil7dGhpcy5fa2V5QmluZGluZ3NbRi5ldmVudF09dGhpcy5fa2V5QmluZGluZ3NbRi5ldmVudF18fFtdO3RoaXMuX2tleUJpbmRpbmdzW0YuZXZlbnRdLnB1c2goW0YsCkNdKX0sdGhpcyl9LF9yZXNldEtleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fdW5saXN0ZW5LZXlFdmVudExpc3RlbmVycygpO3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKX0sX2xpc3RlbktleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5rZXlFdmVudFRhcmdldCYmT2JqZWN0LmtleXModGhpcy5fa2V5QmluZGluZ3MpLmZvckVhY2goZnVuY3Rpb24oeCl7dmFyIEM9dGhpcy5fb25LZXlCaW5kaW5nRXZlbnQuYmluZCh0aGlzLHRoaXMuX2tleUJpbmRpbmdzW3hdKTt0aGlzLl9ib3VuZEtleUhhbmRsZXJzLnB1c2goW3RoaXMua2V5RXZlbnRUYXJnZXQseCxDXSk7dGhpcy5rZXlFdmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKHgsQyl9LHRoaXMpfSxfdW5saXN0ZW5LZXlFdmVudExpc3RlbmVyczpmdW5jdGlvbigpe2Zvcih2YXIgeCxDLEY7dGhpcy5fYm91bmRLZXlIYW5kbGVycy5sZW5ndGg7KXg9dGhpcy5fYm91bmRLZXlIYW5kbGVycy5wb3AoKSwKQz14WzBdLEY9eFsxXSx4PXhbMl0sQy5yZW1vdmVFdmVudExpc3RlbmVyKEYseCl9LF9vbktleUJpbmRpbmdFdmVudDpmdW5jdGlvbih4LEMpe3RoaXMuc3RvcEtleWJvYXJkRXZlbnRQcm9wYWdhdGlvbiYmQy5zdG9wUHJvcGFnYXRpb24oKTtpZighQy5kZWZhdWx0UHJldmVudGVkKWZvcih2YXIgRj0wO0Y8eC5sZW5ndGg7RisrKXt2YXIgRD14W0ZdWzBdLEI9eFtGXVsxXTtpZihnKEQsQykmJih0aGlzLl90cmlnZ2VyS2V5SGFuZGxlcihELEIsQyksQy5kZWZhdWx0UHJldmVudGVkKSlicmVha319LF90cmlnZ2VyS2V5SGFuZGxlcjpmdW5jdGlvbih4LEMsRil7dmFyIEQ9T2JqZWN0LmNyZWF0ZSh4KTtELmtleWJvYXJkRXZlbnQ9Rjt4PW5ldyBDdXN0b21FdmVudCh4LmV2ZW50LHtkZXRhaWw6RCxjYW5jZWxhYmxlOiEwfSk7dGhpc1tDXS5jYWxsKHRoaXMseCk7eC5kZWZhdWx0UHJldmVudGVkJiZGLnByZXZlbnREZWZhdWx0KCl9fX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1iZWhhdmlvcnMvaXJvbi1jb250cm9sLXN0YXRlLmh0bWwuanMKUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlPXtwcm9wZXJ0aWVzOntmb2N1c2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9kaXNhYmxlZENoYW5nZWQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX29sZFRhYkluZGV4Ont0eXBlOlN0cmluZ30sX2JvdW5kRm9jdXNCbHVySGFuZGxlcjp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9mb2N1c0JsdXJIYW5kbGVyLmJpbmQodGhpcyl9fSxfX2hhbmRsZUV2ZW50UmV0YXJnZXRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiF0aGlzLnNoYWRvd1Jvb3QmJiFQb2x5bWVyLkVsZW1lbnR9fX0sb2JzZXJ2ZXJzOlsiX2NoYW5nZWRDb250cm9sU3RhdGUoZm9jdXNlZCwgZGlzYWJsZWQpIl0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwKdGhpcy5fYm91bmRGb2N1c0JsdXJIYW5kbGVyLCEwKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLHRoaXMuX2JvdW5kRm9jdXNCbHVySGFuZGxlciwhMCl9LF9mb2N1c0JsdXJIYW5kbGVyOmZ1bmN0aW9uKGEpe2lmKFBvbHltZXIuRWxlbWVudCl0aGlzLl9zZXRGb2N1c2VkKCJmb2N1cyI9PT1hLnR5cGUpO2Vsc2UgaWYoYS50YXJnZXQ9PT10aGlzKXRoaXMuX3NldEZvY3VzZWQoImZvY3VzIj09PWEudHlwZSk7ZWxzZSBpZih0aGlzLl9faGFuZGxlRXZlbnRSZXRhcmdldGluZyl7dmFyIGM9UG9seW1lci5kb20oYSkubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChjKXx8dGhpcy5maXJlKGEudHlwZSx7c291cmNlRXZlbnQ6YX0se25vZGU6dGhpcyxidWJibGVzOmEuYnViYmxlcyxjYW5jZWxhYmxlOmEuY2FuY2VsYWJsZX0pfX0sX2Rpc2FibGVkQ2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1kaXNhYmxlZCIsYT8idHJ1ZSI6ImZhbHNlIik7CnRoaXMuc3R5bGUucG9pbnRlckV2ZW50cz1hPyJub25lIjoiIjthPyh0aGlzLl9vbGRUYWJJbmRleD10aGlzLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSx0aGlzLl9zZXRGb2N1c2VkKCExKSx0aGlzLnRhYkluZGV4PS0xLHRoaXMuYmx1cigpKTp2b2lkIDAhPT10aGlzLl9vbGRUYWJJbmRleCYmKG51bGw9PT10aGlzLl9vbGRUYWJJbmRleD90aGlzLnJlbW92ZUF0dHJpYnV0ZSgidGFiaW5kZXgiKTp0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLHRoaXMuX29sZFRhYkluZGV4KSl9LF9jaGFuZ2VkQ29udHJvbFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCYmdGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCgpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1iZWhhdmlvcnMvaXJvbi1idXR0b24tc3RhdGUuaHRtbC5qcwpQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGw9e3Byb3BlcnRpZXM6e3ByZXNzZWQ6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMCx2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsb2JzZXJ2ZXI6Il9wcmVzc2VkQ2hhbmdlZCJ9LHRvZ2dsZXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHBvaW50ZXJEb3duOnt0eXBlOkJvb2xlYW4scmVhZE9ubHk6ITAsdmFsdWU6ITF9LHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQ6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMH0sYXJpYUFjdGl2ZUF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImFyaWEtcHJlc3NlZCIsb2JzZXJ2ZXI6Il9hcmlhQWN0aXZlQXR0cmlidXRlQ2hhbmdlZCJ9fSxsaXN0ZW5lcnM6e2Rvd246Il9kb3duSGFuZGxlciIsdXA6Il91cEhhbmRsZXIiLHRhcDoiX3RhcEhhbmRsZXIifSwKb2JzZXJ2ZXJzOlsiX2ZvY3VzQ2hhbmdlZChmb2N1c2VkKSIsIl9hY3RpdmVDaGFuZ2VkKGFjdGl2ZSwgYXJpYUFjdGl2ZUF0dHJpYnV0ZSkiXSxrZXlCaW5kaW5nczp7ImVudGVyOmtleWRvd24iOiJfYXN5bmNDbGljayIsInNwYWNlOmtleWRvd24iOiJfc3BhY2VLZXlEb3duSGFuZGxlciIsInNwYWNlOmtleXVwIjoiX3NwYWNlS2V5VXBIYW5kbGVyIn0sX21vdXNlRXZlbnRSZTovXm1vdXNlLyxfdGFwSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMudG9nZ2xlcz90aGlzLl91c2VyQWN0aXZhdGUoIXRoaXMuYWN0aXZlKTp0aGlzLmFjdGl2ZT0hMX0sX2ZvY3VzQ2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLl9kZXRlY3RLZXlib2FyZEZvY3VzKGEpO2F8fHRoaXMuX3NldFByZXNzZWQoITEpfSxfZGV0ZWN0S2V5Ym9hcmRGb2N1czpmdW5jdGlvbihhKXt0aGlzLl9zZXRSZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKCF0aGlzLnBvaW50ZXJEb3duJiZhKX0sX3VzZXJBY3RpdmF0ZTpmdW5jdGlvbihhKXt0aGlzLmFjdGl2ZSE9PQphJiYodGhpcy5hY3RpdmU9YSx0aGlzLmZpcmUoImNoYW5nZSIpKX0sX2Rvd25IYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0UG9pbnRlckRvd24oITApO3RoaXMuX3NldFByZXNzZWQoITApO3RoaXMuX3NldFJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQoITEpfSxfdXBIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0UG9pbnRlckRvd24oITEpO3RoaXMuX3NldFByZXNzZWQoITEpfSxfc3BhY2VLZXlEb3duSGFuZGxlcjpmdW5jdGlvbihhKXthPWEuZGV0YWlsLmtleWJvYXJkRXZlbnQ7dmFyIGM9UG9seW1lci5kb20oYSkubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChjKXx8KGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuX3NldFByZXNzZWQoITApKX0sX3NwYWNlS2V5VXBIYW5kbGVyOmZ1bmN0aW9uKGEpe2E9UG9seW1lci5kb20oYS5kZXRhaWwua2V5Ym9hcmRFdmVudCkubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChhKXx8Cih0aGlzLnByZXNzZWQmJnRoaXMuX2FzeW5jQ2xpY2soKSx0aGlzLl9zZXRQcmVzc2VkKCExKSl9LF9hc3luY0NsaWNrOmZ1bmN0aW9uKCl7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuY2xpY2soKX0sMSl9LF9wcmVzc2VkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2NoYW5nZWRCdXR0b25TdGF0ZSgpfSxfYXJpYUFjdGl2ZUF0dHJpYnV0ZUNoYW5nZWQ6ZnVuY3Rpb24oYSxjKXtjJiZjIT1hJiZ0aGlzLmhhc0F0dHJpYnV0ZShjKSYmdGhpcy5yZW1vdmVBdHRyaWJ1dGUoYyl9LF9hY3RpdmVDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMudG9nZ2xlcz90aGlzLnNldEF0dHJpYnV0ZSh0aGlzLmFyaWFBY3RpdmVBdHRyaWJ1dGUsYT8idHJ1ZSI6ImZhbHNlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUodGhpcy5hcmlhQWN0aXZlQXR0cmlidXRlKTt0aGlzLl9jaGFuZ2VkQnV0dG9uU3RhdGUoKX0sX2NvbnRyb2xTdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkP3RoaXMuX3NldFByZXNzZWQoITEpOgp0aGlzLl9jaGFuZ2VkQnV0dG9uU3RhdGUoKX0sX2NoYW5nZWRCdXR0b25TdGF0ZTpmdW5jdGlvbigpe3RoaXMuX2J1dHRvblN0YXRlQ2hhbmdlZCYmdGhpcy5fYnV0dG9uU3RhdGVDaGFuZ2VkKCl9fTtQb2x5bWVyLklyb25CdXR0b25TdGF0ZT1bUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcixQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXJpcHBsZS9wYXBlci1yaXBwbGUuaHRtbC5qcwooZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGYpe3RoaXMuZWxlbWVudD1mO3RoaXMud2lkdGg9dGhpcy5ib3VuZGluZ1JlY3Qud2lkdGg7dGhpcy5oZWlnaHQ9dGhpcy5ib3VuZGluZ1JlY3QuaGVpZ2h0O3RoaXMuc2l6ZT1NYXRoLm1heCh0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KX1mdW5jdGlvbiBjKGYpe3RoaXMuZWxlbWVudD1mO3RoaXMuY29sb3I9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZikuY29sb3I7dGhpcy53YXZlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMud2F2ZUNvbnRhaW5lcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLndhdmUuc3R5bGUuYmFja2dyb3VuZENvbG9yPXRoaXMuY29sb3I7dGhpcy53YXZlLmNsYXNzTGlzdC5hZGQoIndhdmUiKTt0aGlzLndhdmVDb250YWluZXIuY2xhc3NMaXN0LmFkZCgid2F2ZS1jb250YWluZXIiKTtQb2x5bWVyLmRvbSh0aGlzLndhdmVDb250YWluZXIpLmFwcGVuZENoaWxkKHRoaXMud2F2ZSk7dGhpcy5yZXNldEludGVyYWN0aW9uU3RhdGUoKX0KdmFyIGQ9e2Rpc3RhbmNlOmZ1bmN0aW9uKGYsZyxsLGspe2YtPWw7Zy09aztyZXR1cm4gTWF0aC5zcXJ0KGYqZitnKmcpfSxub3c6d2luZG93LnBlcmZvcm1hbmNlJiZ3aW5kb3cucGVyZm9ybWFuY2Uubm93P3dpbmRvdy5wZXJmb3JtYW5jZS5ub3cuYmluZCh3aW5kb3cucGVyZm9ybWFuY2UpOkRhdGUubm93fTthLnByb3RvdHlwZT17Z2V0IGJvdW5kaW5nUmVjdCgpe3JldHVybiB0aGlzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9LGZ1cnRoZXN0Q29ybmVyRGlzdGFuY2VGcm9tOmZ1bmN0aW9uKGYsZyl7dmFyIGw9ZC5kaXN0YW5jZShmLGcsMCwwKSxrPWQuZGlzdGFuY2UoZixnLHRoaXMud2lkdGgsMCksbj1kLmRpc3RhbmNlKGYsZywwLHRoaXMuaGVpZ2h0KTtmPWQuZGlzdGFuY2UoZixnLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpO3JldHVybiBNYXRoLm1heChsLGssbixmKX19O2MuTUFYX1JBRElVUz0zMDA7Yy5wcm90b3R5cGU9e2dldCByZWNlbnRlcnMoKXtyZXR1cm4gdGhpcy5lbGVtZW50LnJlY2VudGVyc30sCmdldCBjZW50ZXIoKXtyZXR1cm4gdGhpcy5lbGVtZW50LmNlbnRlcn0sZ2V0IG1vdXNlRG93bkVsYXBzZWQoKXtpZighdGhpcy5tb3VzZURvd25TdGFydClyZXR1cm4gMDt2YXIgZj1kLm5vdygpLXRoaXMubW91c2VEb3duU3RhcnQ7dGhpcy5tb3VzZVVwU3RhcnQmJihmLT10aGlzLm1vdXNlVXBFbGFwc2VkKTtyZXR1cm4gZn0sZ2V0IG1vdXNlVXBFbGFwc2VkKCl7cmV0dXJuIHRoaXMubW91c2VVcFN0YXJ0P2Qubm93KCktdGhpcy5tb3VzZVVwU3RhcnQ6MH0sZ2V0IG1vdXNlRG93bkVsYXBzZWRTZWNvbmRzKCl7cmV0dXJuIHRoaXMubW91c2VEb3duRWxhcHNlZC8xRTN9LGdldCBtb3VzZVVwRWxhcHNlZFNlY29uZHMoKXtyZXR1cm4gdGhpcy5tb3VzZVVwRWxhcHNlZC8xRTN9LGdldCBtb3VzZUludGVyYWN0aW9uU2Vjb25kcygpe3JldHVybiB0aGlzLm1vdXNlRG93bkVsYXBzZWRTZWNvbmRzK3RoaXMubW91c2VVcEVsYXBzZWRTZWNvbmRzfSxnZXQgaW5pdGlhbE9wYWNpdHkoKXtyZXR1cm4gdGhpcy5lbGVtZW50LmluaXRpYWxPcGFjaXR5fSwKZ2V0IG9wYWNpdHlEZWNheVZlbG9jaXR5KCl7cmV0dXJuIHRoaXMuZWxlbWVudC5vcGFjaXR5RGVjYXlWZWxvY2l0eX0sZ2V0IHJhZGl1cygpe3ZhciBmPTEuMSpNYXRoLm1pbihNYXRoLnNxcnQodGhpcy5jb250YWluZXJNZXRyaWNzLndpZHRoKnRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aCt0aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0KnRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQpLGMuTUFYX1JBRElVUykrNTtyZXR1cm4gTWF0aC5hYnMoZiooMS1NYXRoLnBvdyg4MCwtKHRoaXMubW91c2VJbnRlcmFjdGlvblNlY29uZHMvKDEuMS1mL2MuTUFYX1JBRElVUyouMikpKSkpfSxnZXQgb3BhY2l0eSgpe3JldHVybiB0aGlzLm1vdXNlVXBTdGFydD9NYXRoLm1heCgwLHRoaXMuaW5pdGlhbE9wYWNpdHktdGhpcy5tb3VzZVVwRWxhcHNlZFNlY29uZHMqdGhpcy5vcGFjaXR5RGVjYXlWZWxvY2l0eSk6dGhpcy5pbml0aWFsT3BhY2l0eX0sZ2V0IG91dGVyT3BhY2l0eSgpe3JldHVybiBNYXRoLm1heCgwLApNYXRoLm1pbiguMyp0aGlzLm1vdXNlVXBFbGFwc2VkU2Vjb25kcyx0aGlzLm9wYWNpdHkpKX0sZ2V0IGlzT3BhY2l0eUZ1bGx5RGVjYXllZCgpe3JldHVybi4wMT50aGlzLm9wYWNpdHkmJnRoaXMucmFkaXVzPj1NYXRoLm1pbih0aGlzLm1heFJhZGl1cyxjLk1BWF9SQURJVVMpfSxnZXQgaXNSZXN0aW5nQXRNYXhSYWRpdXMoKXtyZXR1cm4gdGhpcy5vcGFjaXR5Pj10aGlzLmluaXRpYWxPcGFjaXR5JiZ0aGlzLnJhZGl1cz49TWF0aC5taW4odGhpcy5tYXhSYWRpdXMsYy5NQVhfUkFESVVTKX0sZ2V0IGlzQW5pbWF0aW9uQ29tcGxldGUoKXtyZXR1cm4gdGhpcy5tb3VzZVVwU3RhcnQ/dGhpcy5pc09wYWNpdHlGdWxseURlY2F5ZWQ6dGhpcy5pc1Jlc3RpbmdBdE1heFJhZGl1c30sZ2V0IHRyYW5zbGF0aW9uRnJhY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4oMSx0aGlzLnJhZGl1cy90aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSoyL01hdGguc3FydCgyKSl9LGdldCB4Tm93KCl7cmV0dXJuIHRoaXMueEVuZD8KdGhpcy54U3RhcnQrdGhpcy50cmFuc2xhdGlvbkZyYWN0aW9uKih0aGlzLnhFbmQtdGhpcy54U3RhcnQpOnRoaXMueFN0YXJ0fSxnZXQgeU5vdygpe3JldHVybiB0aGlzLnlFbmQ/dGhpcy55U3RhcnQrdGhpcy50cmFuc2xhdGlvbkZyYWN0aW9uKih0aGlzLnlFbmQtdGhpcy55U3RhcnQpOnRoaXMueVN0YXJ0fSxnZXQgaXNNb3VzZURvd24oKXtyZXR1cm4gdGhpcy5tb3VzZURvd25TdGFydCYmIXRoaXMubW91c2VVcFN0YXJ0fSxyZXNldEludGVyYWN0aW9uU3RhdGU6ZnVuY3Rpb24oKXt0aGlzLnNsaWRlRGlzdGFuY2U9dGhpcy55RW5kPXRoaXMueEVuZD10aGlzLnlTdGFydD10aGlzLnhTdGFydD10aGlzLm1vdXNlVXBTdGFydD10aGlzLm1vdXNlRG93blN0YXJ0PXRoaXMubWF4UmFkaXVzPTA7dGhpcy5jb250YWluZXJNZXRyaWNzPW5ldyBhKHRoaXMuZWxlbWVudCl9LGRyYXc6ZnVuY3Rpb24oKXt0aGlzLndhdmUuc3R5bGUub3BhY2l0eT10aGlzLm9wYWNpdHk7dmFyIGY9dGhpcy5yYWRpdXMvCih0aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZS8yKTt2YXIgZz10aGlzLnhOb3ctdGhpcy5jb250YWluZXJNZXRyaWNzLndpZHRoLzI7dmFyIGw9dGhpcy55Tm93LXRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQvMjt0aGlzLndhdmVDb250YWluZXIuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJ0cmFuc2xhdGUoIitnKyJweCwgIitsKyJweCkiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKCIrZysicHgsICIrbCsicHgsIDApIjt0aGlzLndhdmUuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJzY2FsZSgiK2YrIiwiK2YrIikiO3RoaXMud2F2ZS5zdHlsZS50cmFuc2Zvcm09InNjYWxlM2QoIitmKyIsIitmKyIsMSkifSxkb3duQWN0aW9uOmZ1bmN0aW9uKGYpe3ZhciBnPXRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aC8yLGw9dGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodC8yO3RoaXMucmVzZXRJbnRlcmFjdGlvblN0YXRlKCk7dGhpcy5tb3VzZURvd25TdGFydD0KZC5ub3coKTt0aGlzLmNlbnRlcj8odGhpcy54U3RhcnQ9Zyx0aGlzLnlTdGFydD1sLHRoaXMuc2xpZGVEaXN0YW5jZT1kLmRpc3RhbmNlKHRoaXMueFN0YXJ0LHRoaXMueVN0YXJ0LHRoaXMueEVuZCx0aGlzLnlFbmQpKToodGhpcy54U3RhcnQ9Zj9mLmRldGFpbC54LXRoaXMuY29udGFpbmVyTWV0cmljcy5ib3VuZGluZ1JlY3QubGVmdDp0aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgvMix0aGlzLnlTdGFydD1mP2YuZGV0YWlsLnktdGhpcy5jb250YWluZXJNZXRyaWNzLmJvdW5kaW5nUmVjdC50b3A6dGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodC8yKTt0aGlzLnJlY2VudGVycyYmKHRoaXMueEVuZD1nLHRoaXMueUVuZD1sLHRoaXMuc2xpZGVEaXN0YW5jZT1kLmRpc3RhbmNlKHRoaXMueFN0YXJ0LHRoaXMueVN0YXJ0LHRoaXMueEVuZCx0aGlzLnlFbmQpKTt0aGlzLm1heFJhZGl1cz10aGlzLmNvbnRhaW5lck1ldHJpY3MuZnVydGhlc3RDb3JuZXJEaXN0YW5jZUZyb20odGhpcy54U3RhcnQsCnRoaXMueVN0YXJ0KTt0aGlzLndhdmVDb250YWluZXIuc3R5bGUudG9wPSh0aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0LXRoaXMuY29udGFpbmVyTWV0cmljcy5zaXplKS8yKyJweCI7dGhpcy53YXZlQ29udGFpbmVyLnN0eWxlLmxlZnQ9KHRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aC10aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSkvMisicHgiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS53aWR0aD10aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSsicHgiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS5oZWlnaHQ9dGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUrInB4In0sdXBBY3Rpb246ZnVuY3Rpb24oKXt0aGlzLmlzTW91c2VEb3duJiYodGhpcy5tb3VzZVVwU3RhcnQ9ZC5ub3coKSl9LHJlbW92ZTpmdW5jdGlvbigpe1BvbHltZXIuZG9tKHRoaXMud2F2ZUNvbnRhaW5lci5wYXJlbnROb2RlKS5yZW1vdmVDaGlsZCh0aGlzLndhdmVDb250YWluZXIpfX07UG9seW1lcih7aXM6InBhcGVyLXJpcHBsZSIsCmJlaGF2aW9yczpbUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcl0scHJvcGVydGllczp7aW5pdGlhbE9wYWNpdHk6e3R5cGU6TnVtYmVyLHZhbHVlOi4yNX0sb3BhY2l0eURlY2F5VmVsb2NpdHk6e3R5cGU6TnVtYmVyLHZhbHVlOi44fSxyZWNlbnRlcnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sY2VudGVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHJpcHBsZXM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LGFuaW1hdGluZzp7dHlwZTpCb29sZWFuLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMX0saG9sZERvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2hvbGREb3duQ2hhbmdlZCJ9LG5vaW5rOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9hbmltYXRpbmc6e3R5cGU6Qm9vbGVhbn0sX2JvdW5kQW5pbWF0ZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFuaW1hdGUuYmluZCh0aGlzKX19fSwKZ2V0IHRhcmdldCgpe3JldHVybiB0aGlzLmtleUV2ZW50VGFyZ2V0fSxrZXlCaW5kaW5nczp7ImVudGVyOmtleWRvd24iOiJfb25FbnRlcktleWRvd24iLCJzcGFjZTprZXlkb3duIjoiX29uU3BhY2VLZXlkb3duIiwic3BhY2U6a2V5dXAiOiJfb25TcGFjZUtleXVwIn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt2YXIgZj10aGlzLmtleUV2ZW50VGFyZ2V0PTExPT10aGlzLnBhcmVudE5vZGUubm9kZVR5cGU/UG9seW1lci5kb20odGhpcykuZ2V0T3duZXJSb290KCkuaG9zdDp0aGlzLnBhcmVudE5vZGU7dGhpcy5saXN0ZW4oZiwidXAiLCJ1aVVwQWN0aW9uIik7dGhpcy5saXN0ZW4oZiwiZG93biIsInVpRG93bkFjdGlvbiIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMudW5saXN0ZW4odGhpcy5rZXlFdmVudFRhcmdldCwidXAiLCJ1aVVwQWN0aW9uIik7dGhpcy51bmxpc3Rlbih0aGlzLmtleUV2ZW50VGFyZ2V0LCJkb3duIiwidWlEb3duQWN0aW9uIik7dGhpcy5rZXlFdmVudFRhcmdldD0KbnVsbH0sZ2V0IHNob3VsZEtlZXBBbmltYXRpbmcoKXtmb3IodmFyIGY9MDtmPHRoaXMucmlwcGxlcy5sZW5ndGg7KytmKWlmKCF0aGlzLnJpcHBsZXNbZl0uaXNBbmltYXRpb25Db21wbGV0ZSlyZXR1cm4hMDtyZXR1cm4hMX0sc2ltdWxhdGVkUmlwcGxlOmZ1bmN0aW9uKCl7dGhpcy5kb3duQWN0aW9uKG51bGwpO3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLnVwQWN0aW9uKCl9LDEpfSx1aURvd25BY3Rpb246ZnVuY3Rpb24oZil7dGhpcy5ub2lua3x8dGhpcy5kb3duQWN0aW9uKGYpfSxkb3duQWN0aW9uOmZ1bmN0aW9uKGYpe3RoaXMuaG9sZERvd24mJjA8dGhpcy5yaXBwbGVzLmxlbmd0aHx8KHRoaXMuYWRkUmlwcGxlKCkuZG93bkFjdGlvbihmKSx0aGlzLl9hbmltYXRpbmd8fCh0aGlzLl9hbmltYXRpbmc9ITAsdGhpcy5hbmltYXRlKCkpKX0sdWlVcEFjdGlvbjpmdW5jdGlvbihmKXt0aGlzLm5vaW5rfHx0aGlzLnVwQWN0aW9uKGYpfSx1cEFjdGlvbjpmdW5jdGlvbihmKXt0aGlzLmhvbGREb3dufHwKKHRoaXMucmlwcGxlcy5mb3JFYWNoKGZ1bmN0aW9uKGcpe2cudXBBY3Rpb24oZil9KSx0aGlzLl9hbmltYXRpbmc9ITAsdGhpcy5hbmltYXRlKCkpfSxvbkFuaW1hdGlvbkNvbXBsZXRlOmZ1bmN0aW9uKCl7dGhpcy5fYW5pbWF0aW5nPSExO3RoaXMuJC5iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmRDb2xvcj1udWxsO3RoaXMuZmlyZSgidHJhbnNpdGlvbmVuZCIpfSxhZGRSaXBwbGU6ZnVuY3Rpb24oKXt2YXIgZj1uZXcgYyh0aGlzKTtQb2x5bWVyLmRvbSh0aGlzLiQud2F2ZXMpLmFwcGVuZENoaWxkKGYud2F2ZUNvbnRhaW5lcik7dGhpcy4kLmJhY2tncm91bmQuc3R5bGUuYmFja2dyb3VuZENvbG9yPWYuY29sb3I7dGhpcy5yaXBwbGVzLnB1c2goZik7dGhpcy5fc2V0QW5pbWF0aW5nKCEwKTtyZXR1cm4gZn0scmVtb3ZlUmlwcGxlOmZ1bmN0aW9uKGYpe3ZhciBnPXRoaXMucmlwcGxlcy5pbmRleE9mKGYpOzA+Z3x8KHRoaXMucmlwcGxlcy5zcGxpY2UoZywxKSxmLnJlbW92ZSgpLAp0aGlzLnJpcHBsZXMubGVuZ3RofHx0aGlzLl9zZXRBbmltYXRpbmcoITEpKX0sYW5pbWF0ZTpmdW5jdGlvbigpe2lmKHRoaXMuX2FuaW1hdGluZyl7dmFyIGY7Zm9yKGY9MDtmPHRoaXMucmlwcGxlcy5sZW5ndGg7KytmKXt2YXIgZz10aGlzLnJpcHBsZXNbZl07Zy5kcmF3KCk7dGhpcy4kLmJhY2tncm91bmQuc3R5bGUub3BhY2l0eT1nLm91dGVyT3BhY2l0eTtnLmlzT3BhY2l0eUZ1bGx5RGVjYXllZCYmIWcuaXNSZXN0aW5nQXRNYXhSYWRpdXMmJnRoaXMucmVtb3ZlUmlwcGxlKGcpfWlmKHRoaXMuc2hvdWxkS2VlcEFuaW1hdGluZ3x8MCE9PXRoaXMucmlwcGxlcy5sZW5ndGgpd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9ib3VuZEFuaW1hdGUpO2Vsc2UgdGhpcy5vbkFuaW1hdGlvbkNvbXBsZXRlKCl9fSxfb25FbnRlcktleWRvd246ZnVuY3Rpb24oKXt0aGlzLnVpRG93bkFjdGlvbigpO3RoaXMuYXN5bmModGhpcy51aVVwQWN0aW9uLDEpfSxfb25TcGFjZUtleWRvd246ZnVuY3Rpb24oKXt0aGlzLnVpRG93bkFjdGlvbigpfSwKX29uU3BhY2VLZXl1cDpmdW5jdGlvbigpe3RoaXMudWlVcEFjdGlvbigpfSxfaG9sZERvd25DaGFuZ2VkOmZ1bmN0aW9uKGYsZyl7dm9pZCAwIT09ZyYmKGY/dGhpcy5kb3duQWN0aW9uKCk6dGhpcy51cEFjdGlvbigpKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItYmVoYXZpb3JzL3BhcGVyLXJpcHBsZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvcj17cHJvcGVydGllczp7bm9pbms6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX25vaW5rQ2hhbmdlZCJ9LF9yaXBwbGVDb250YWluZXI6e3R5cGU6T2JqZWN0fX0sX2J1dHRvblN0YXRlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZm9jdXNlZCYmdGhpcy5lbnN1cmVSaXBwbGUoKX0sX2Rvd25IYW5kbGVyOmZ1bmN0aW9uKGEpe1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlSW1wbC5fZG93bkhhbmRsZXIuY2FsbCh0aGlzLGEpO3RoaXMucHJlc3NlZCYmdGhpcy5lbnN1cmVSaXBwbGUoYSl9LGVuc3VyZVJpcHBsZTpmdW5jdGlvbihhKXtpZighdGhpcy5oYXNSaXBwbGUoKSl7dGhpcy5fcmlwcGxlPXRoaXMuX2NyZWF0ZVJpcHBsZSgpO3RoaXMuX3JpcHBsZS5ub2luaz10aGlzLm5vaW5rO3ZhciBjPXRoaXMuX3JpcHBsZUNvbnRhaW5lcnx8dGhpcy5yb290O2MmJlBvbHltZXIuZG9tKGMpLmFwcGVuZENoaWxkKHRoaXMuX3JpcHBsZSk7aWYoYSl7Yz0KUG9seW1lci5kb20odGhpcy5fcmlwcGxlQ29udGFpbmVyfHx0aGlzKTt2YXIgZD1Qb2x5bWVyLmRvbShhKS5yb290VGFyZ2V0O2MuZGVlcENvbnRhaW5zKGQpJiZ0aGlzLl9yaXBwbGUudWlEb3duQWN0aW9uKGEpfX19LGdldFJpcHBsZTpmdW5jdGlvbigpe3RoaXMuZW5zdXJlUmlwcGxlKCk7cmV0dXJuIHRoaXMuX3JpcHBsZX0saGFzUmlwcGxlOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl9yaXBwbGV9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItcmlwcGxlIil9LF9ub2lua0NoYW5nZWQ6ZnVuY3Rpb24oYSl7dGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuX3JpcHBsZS5ub2luaz1hKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWJlaGF2aW9ycy9wYXBlci1idXR0b24tYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVyQnV0dG9uQmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOntlbGV2YXRpb246e3R5cGU6TnVtYmVyLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxyZWFkT25seTohMH19LG9ic2VydmVyczpbIl9jYWxjdWxhdGVFbGV2YXRpb24oZm9jdXNlZCwgZGlzYWJsZWQsIGFjdGl2ZSwgcHJlc3NlZCwgcmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCkiLCJfY29tcHV0ZUtleWJvYXJkQ2xhc3MocmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCkiXSxob3N0QXR0cmlidXRlczp7cm9sZToiYnV0dG9uIix0YWJpbmRleDoiMCIsYW5pbWF0ZWQ6ITB9LF9jYWxjdWxhdGVFbGV2YXRpb246ZnVuY3Rpb24oKXt2YXIgYT0xO3RoaXMuZGlzYWJsZWQ/YT0wOnRoaXMuYWN0aXZlfHx0aGlzLnByZXNzZWQ/YT00OnRoaXMucmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCYmKGE9Myk7dGhpcy5fc2V0RWxldmF0aW9uKGEpfSxfY29tcHV0ZUtleWJvYXJkQ2xhc3M6ZnVuY3Rpb24oYSl7dGhpcy50b2dnbGVDbGFzcygia2V5Ym9hcmQtZm9jdXMiLAphKX0sX3NwYWNlS2V5RG93bkhhbmRsZXI6ZnVuY3Rpb24oYSl7UG9seW1lci5Jcm9uQnV0dG9uU3RhdGVJbXBsLl9zcGFjZUtleURvd25IYW5kbGVyLmNhbGwodGhpcyxhKTt0aGlzLmhhc1JpcHBsZSgpJiYxPnRoaXMuZ2V0UmlwcGxlKCkucmlwcGxlcy5sZW5ndGgmJnRoaXMuX3JpcHBsZS51aURvd25BY3Rpb24oKX0sX3NwYWNlS2V5VXBIYW5kbGVyOmZ1bmN0aW9uKGEpe1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlSW1wbC5fc3BhY2VLZXlVcEhhbmRsZXIuY2FsbCh0aGlzLGEpO3RoaXMuaGFzUmlwcGxlKCkmJnRoaXMuX3JpcHBsZS51aVVwQWN0aW9uKCl9fTtQb2x5bWVyLlBhcGVyQnV0dG9uQmVoYXZpb3I9W1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IsUG9seW1lci5QYXBlckJ1dHRvbkJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItYnV0dG9uL3BhcGVyLWJ1dHRvbi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1idXR0b24iLGJlaGF2aW9yczpbUG9seW1lci5QYXBlckJ1dHRvbkJlaGF2aW9yXSxwcm9wZXJ0aWVzOntyYWlzZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITEsb2JzZXJ2ZXI6Il9jYWxjdWxhdGVFbGV2YXRpb24ifX0sX2NhbGN1bGF0ZUVsZXZhdGlvbjpmdW5jdGlvbigpe3RoaXMucmFpc2VkP1BvbHltZXIuUGFwZXJCdXR0b25CZWhhdmlvckltcGwuX2NhbGN1bGF0ZUVsZXZhdGlvbi5hcHBseSh0aGlzKTp0aGlzLl9zZXRFbGV2YXRpb24oMCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1tZXRhL2lyb24tbWV0YS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbk1ldGE9ZnVuY3Rpb24oYyl7UG9seW1lci5Jcm9uTWV0YVsiICJdKGMpO3RoaXMudHlwZT1jJiZjLnR5cGV8fCJkZWZhdWx0Ijt0aGlzLmtleT1jJiZjLmtleTtjJiYidmFsdWUiaW4gYyYmKHRoaXMudmFsdWU9Yy52YWx1ZSl9O1BvbHltZXIuSXJvbk1ldGFbIiAiXT1mdW5jdGlvbigpe307UG9seW1lci5Jcm9uTWV0YS50eXBlcz17fTtQb2x5bWVyLklyb25NZXRhLnByb3RvdHlwZT17Z2V0IHZhbHVlKCl7dmFyIGM9dGhpcy50eXBlLGQ9dGhpcy5rZXk7aWYoYyYmZClyZXR1cm4gUG9seW1lci5Jcm9uTWV0YS50eXBlc1tjXSYmUG9seW1lci5Jcm9uTWV0YS50eXBlc1tjXVtkXX0sc2V0IHZhbHVlKGMpe3ZhciBkPXRoaXMudHlwZSxmPXRoaXMua2V5O2QmJmYmJihkPVBvbHltZXIuSXJvbk1ldGEudHlwZXNbZF09UG9seW1lci5Jcm9uTWV0YS50eXBlc1tkXXx8e30sbnVsbD09Yz9kZWxldGUgZFtmXTpkW2ZdPWMpfSxnZXQgbGlzdCgpe2lmKHRoaXMudHlwZSl7dmFyIGM9ClBvbHltZXIuSXJvbk1ldGEudHlwZXNbdGhpcy50eXBlXTtyZXR1cm4gYz9PYmplY3Qua2V5cyhjKS5tYXAoZnVuY3Rpb24oZCl7cmV0dXJuIGFbdGhpcy50eXBlXVtkXX0sdGhpcyk6W119fSxieUtleTpmdW5jdGlvbihjKXt0aGlzLmtleT1jO3JldHVybiB0aGlzLnZhbHVlfX07dmFyIGE9UG9seW1lci5Jcm9uTWV0YS50eXBlcztQb2x5bWVyKHtpczoiaXJvbi1tZXRhIixwcm9wZXJ0aWVzOnt0eXBlOnt0eXBlOlN0cmluZyx2YWx1ZToiZGVmYXVsdCJ9LGtleTp7dHlwZTpTdHJpbmd9LHZhbHVlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGY6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX3NlbGZDaGFuZ2VkIn0sX19tZXRhOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9fY29tcHV0ZU1ldGEodHlwZSwga2V5LCB2YWx1ZSkifX0saG9zdEF0dHJpYnV0ZXM6e2hpZGRlbjohMH0sX19jb21wdXRlTWV0YTpmdW5jdGlvbihjLGQsZil7Yz1uZXcgUG9seW1lci5Jcm9uTWV0YSh7dHlwZTpjLAprZXk6ZH0pO3ZvaWQgMCE9PWYmJmYhPT1jLnZhbHVlP2MudmFsdWU9Zjp0aGlzLnZhbHVlIT09Yy52YWx1ZSYmKHRoaXMudmFsdWU9Yy52YWx1ZSk7cmV0dXJuIGN9LGdldCBsaXN0KCl7cmV0dXJuIHRoaXMuX19tZXRhJiZ0aGlzLl9fbWV0YS5saXN0fSxfc2VsZkNoYW5nZWQ6ZnVuY3Rpb24oYyl7YyYmKHRoaXMudmFsdWU9dGhpcyl9LGJ5S2V5OmZ1bmN0aW9uKGMpe3JldHVybihuZXcgUG9seW1lci5Jcm9uTWV0YSh7dHlwZTp0aGlzLnR5cGUsa2V5OmN9KSkudmFsdWV9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tdmFsaWRhdGFibGUtYmVoYXZpb3IvaXJvbi12YWxpZGF0YWJsZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhPW51bGw7ClBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3I9e3Byb3BlcnRpZXM6e3ZhbGlkYXRvcjp7dHlwZTpTdHJpbmd9LGludmFsaWQ6e25vdGlmeTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfaW52YWxpZENoYW5nZWQifX0scmVnaXN0ZXJlZDpmdW5jdGlvbigpe1BvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhPW5ldyBQb2x5bWVyLklyb25NZXRhKHt0eXBlOiJ2YWxpZGF0b3IifSl9LF9pbnZhbGlkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuaW52YWxpZD90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1pbnZhbGlkIiwidHJ1ZSIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWludmFsaWQiKX0sZ2V0IF92YWxpZGF0b3IoKXtyZXR1cm4gUG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvck1ldGEmJlBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhLmJ5S2V5KHRoaXMudmFsaWRhdG9yKX0saGFzVmFsaWRhdG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPQp0aGlzLl92YWxpZGF0b3J9LHZhbGlkYXRlOmZ1bmN0aW9uKGEpe3RoaXMuaW52YWxpZD12b2lkIDA9PT1hJiZ2b2lkIDAhPT10aGlzLnZhbHVlPyF0aGlzLl9nZXRWYWxpZGl0eSh0aGlzLnZhbHVlKTohdGhpcy5fZ2V0VmFsaWRpdHkoYSk7cmV0dXJuIXRoaXMuaW52YWxpZH0sX2dldFZhbGlkaXR5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmhhc1ZhbGlkYXRvcigpP3RoaXMuX3ZhbGlkYXRvci52YWxpZGF0ZShhKTohMH19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tZm9ybS1lbGVtZW50LWJlaGF2aW9yL2lyb24tZm9ybS1lbGVtZW50LWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcj17cHJvcGVydGllczp7bmFtZTp7dHlwZTpTdHJpbmd9LHZhbHVlOntub3RpZnk6ITAsdHlwZTpTdHJpbmd9LHJlcXVpcmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9wYXJlbnRGb3JtOnt0eXBlOk9iamVjdH19LGF0dGFjaGVkOmZ1bmN0aW9uKCl7UG9seW1lci5FbGVtZW50fHx0aGlzLmZpcmUoImlyb24tZm9ybS1lbGVtZW50LXJlZ2lzdGVyIil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7IVBvbHltZXIuRWxlbWVudCYmdGhpcy5fcGFyZW50Rm9ybSYmdGhpcy5fcGFyZW50Rm9ybS5maXJlKCJpcm9uLWZvcm0tZWxlbWVudC11bnJlZ2lzdGVyIix7dGFyZ2V0OnRoaXN9KX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tY2hlY2tlZC1lbGVtZW50LWJlaGF2aW9yL2lyb24tY2hlY2tlZC1lbGVtZW50LWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGw9e3Byb3BlcnRpZXM6e2NoZWNrZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsbm90aWZ5OiEwLG9ic2VydmVyOiJfY2hlY2tlZENoYW5nZWQifSx0b2dnbGVzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfSx2YWx1ZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im9uIixvYnNlcnZlcjoiX3ZhbHVlQ2hhbmdlZCJ9fSxvYnNlcnZlcnM6WyJfcmVxdWlyZWRDaGFuZ2VkKHJlcXVpcmVkKSJdLGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNJcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcj0hMH0sX2dldFZhbGlkaXR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWR8fCF0aGlzLnJlcXVpcmVkfHx0aGlzLmNoZWNrZWR9LF9yZXF1aXJlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLnJlcXVpcmVkP3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXJlcXVpcmVkIiwKInRydWUiKTp0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1yZXF1aXJlZCIpfSxfY2hlY2tlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmFjdGl2ZT10aGlzLmNoZWNrZWQ7dGhpcy5maXJlKCJpcm9uLWNoYW5nZSIpfSxfdmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKCl7aWYodm9pZCAwPT09dGhpcy52YWx1ZXx8bnVsbD09PXRoaXMudmFsdWUpdGhpcy52YWx1ZT0ib24ifX07UG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcj1bUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcixQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3JJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1iZWhhdmlvcnMvcGFwZXItaW5reS1mb2N1cy1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvckltcGw9e29ic2VydmVyczpbIl9mb2N1c2VkQ2hhbmdlZChyZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKSJdLF9mb2N1c2VkQ2hhbmdlZDpmdW5jdGlvbihhKXthJiZ0aGlzLmVuc3VyZVJpcHBsZSgpO3RoaXMuaGFzUmlwcGxlKCkmJih0aGlzLl9yaXBwbGUuaG9sZERvd249YSl9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXt2YXIgYT1Qb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IuX2NyZWF0ZVJpcHBsZSgpO2EuaWQ9ImluayI7YS5zZXRBdHRyaWJ1dGUoImNlbnRlciIsIiIpO2EuY2xhc3NMaXN0LmFkZCgiY2lyY2xlIik7cmV0dXJuIGF9fTtQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3I9W1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IsUG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItYmVoYXZpb3JzL3BhcGVyLWNoZWNrZWQtZWxlbWVudC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9ySW1wbD17X2NoZWNrZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGwuX2NoZWNrZWRDaGFuZ2VkLmNhbGwodGhpcyk7dGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuY2hlY2tlZD90aGlzLl9yaXBwbGUuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiIik6dGhpcy5fcmlwcGxlLnJlbW92ZUF0dHJpYnV0ZSgiY2hlY2tlZCIpKX0sX2J1dHRvblN0YXRlQ2hhbmdlZDpmdW5jdGlvbigpe1BvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvci5fYnV0dG9uU3RhdGVDaGFuZ2VkLmNhbGwodGhpcyk7IXRoaXMuZGlzYWJsZWQmJnRoaXMuaXNBdHRhY2hlZCYmKHRoaXMuY2hlY2tlZD10aGlzLmFjdGl2ZSl9fTsKUG9seW1lci5QYXBlckNoZWNrZWRFbGVtZW50QmVoYXZpb3I9W1BvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvcixQb2x5bWVyLklyb25DaGVja2VkRWxlbWVudEJlaGF2aW9yLFBvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItY2hlY2tib3gvcGFwZXItY2hlY2tib3guaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItY2hlY2tib3giLGJlaGF2aW9yczpbUG9seW1lci5QYXBlckNoZWNrZWRFbGVtZW50QmVoYXZpb3JdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJjaGVja2JveCIsImFyaWEtY2hlY2tlZCI6ITEsdGFiaW5kZXg6MH0scHJvcGVydGllczp7YXJpYUFjdGl2ZUF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImFyaWEtY2hlY2tlZCJ9fSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLGZ1bmN0aW9uKCl7aWYoIi0xcHgiPT09dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSIpLnRyaW0oKSl7dmFyIGE9dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplIikudHJpbSgpLGM9InB4IixkPWEubWF0Y2goL1tBLVphLXpdKyQvKTtudWxsIT09ZCYmKGM9ZFswXSk7YT1wYXJzZUZsb2F0KGEpOwpkPTgvMyphOyJweCI9PT1jJiYoZD1NYXRoLmZsb29yKGQpLGQlMiE9PWElMiYmZCsrKTt0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItY2hlY2tib3gtaW5rLXNpemUiOmQrY30pfX0pfSxfY29tcHV0ZUNoZWNrYm94Q2xhc3M6ZnVuY3Rpb24oYSxjKXt2YXIgZD0iIjthJiYoZCs9ImNoZWNrZWQgIik7YyYmKGQrPSJpbnZhbGlkIik7cmV0dXJuIGR9LF9jb21wdXRlQ2hlY2ttYXJrQ2xhc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IiI6ImhpZGRlbiJ9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXt0aGlzLl9yaXBwbGVDb250YWluZXI9dGhpcy4kLmNoZWNrYm94Q29udGFpbmVyO3JldHVybiBQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3JJbXBsLl9jcmVhdGVSaXBwbGUuY2FsbCh0aGlzKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWljb24vaXJvbi1pY29uLmh0bWwuanMKUG9seW1lcih7aXM6Imlyb24taWNvbiIscHJvcGVydGllczp7aWNvbjp7dHlwZTpTdHJpbmd9LHRoZW1lOnt0eXBlOlN0cmluZ30sc3JjOnt0eXBlOlN0cmluZ30sX21ldGE6e3ZhbHVlOlBvbHltZXIuQmFzZS5jcmVhdGUoImlyb24tbWV0YSIse3R5cGU6Imljb25zZXQifSl9fSxvYnNlcnZlcnM6WyJfdXBkYXRlSWNvbihfbWV0YSwgaXNBdHRhY2hlZCkiLCJfdXBkYXRlSWNvbih0aGVtZSwgaXNBdHRhY2hlZCkiLCJfc3JjQ2hhbmdlZChzcmMsIGlzQXR0YWNoZWQpIiwiX2ljb25DaGFuZ2VkKGljb24sIGlzQXR0YWNoZWQpIl0sX0RFRkFVTFRfSUNPTlNFVDoiaWNvbnMiLF9pY29uQ2hhbmdlZDpmdW5jdGlvbihhKXthPShhfHwiIikuc3BsaXQoIjoiKTt0aGlzLl9pY29uTmFtZT1hLnBvcCgpO3RoaXMuX2ljb25zZXROYW1lPWEucG9wKCl8fHRoaXMuX0RFRkFVTFRfSUNPTlNFVDt0aGlzLl91cGRhdGVJY29uKCl9LF9zcmNDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSWNvbigpfSwKX3VzZXNJY29uc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWNvbnx8IXRoaXMuc3JjfSxfdXBkYXRlSWNvbjpmdW5jdGlvbigpe3RoaXMuX3VzZXNJY29uc2V0KCk/KHRoaXMuX2ltZyYmdGhpcy5faW1nLnBhcmVudE5vZGUmJlBvbHltZXIuZG9tKHRoaXMucm9vdCkucmVtb3ZlQ2hpbGQodGhpcy5faW1nKSwiIj09PXRoaXMuX2ljb25OYW1lP3RoaXMuX2ljb25zZXQmJnRoaXMuX2ljb25zZXQucmVtb3ZlSWNvbih0aGlzKTp0aGlzLl9pY29uc2V0TmFtZSYmdGhpcy5fbWV0YSYmKCh0aGlzLl9pY29uc2V0PXRoaXMuX21ldGEuYnlLZXkodGhpcy5faWNvbnNldE5hbWUpKT8odGhpcy5faWNvbnNldC5hcHBseUljb24odGhpcyx0aGlzLl9pY29uTmFtZSx0aGlzLnRoZW1lKSx0aGlzLnVubGlzdGVuKHdpbmRvdywiaXJvbi1pY29uc2V0LWFkZGVkIiwiX3VwZGF0ZUljb24iKSk6dGhpcy5saXN0ZW4od2luZG93LCJpcm9uLWljb25zZXQtYWRkZWQiLCJfdXBkYXRlSWNvbiIpKSk6KHRoaXMuX2ljb25zZXQmJgp0aGlzLl9pY29uc2V0LnJlbW92ZUljb24odGhpcyksdGhpcy5faW1nfHwodGhpcy5faW1nPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLHRoaXMuX2ltZy5zdHlsZS53aWR0aD0iMTAwJSIsdGhpcy5faW1nLnN0eWxlLmhlaWdodD0iMTAwJSIsdGhpcy5faW1nLmRyYWdnYWJsZT0hMSksdGhpcy5faW1nLnNyYz10aGlzLnNyYyxQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLmFwcGVuZENoaWxkKHRoaXMuX2ltZykpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tYTExeS1hbm5vdW5jZXIvaXJvbi1hMTF5LWFubm91bmNlci5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXI9ZnVuY3Rpb24oKXt9O1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXI9UG9seW1lcih7aXM6Imlyb24tYTExeS1hbm5vdW5jZXIiLHByb3BlcnRpZXM6e21vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJwb2xpdGUifSxfdGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZXx8KFBvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2U9dGhpcyk7ZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJpcm9uLWFubm91bmNlIix0aGlzLl9vbklyb25Bbm5vdW5jZS5iaW5kKHRoaXMpKX0sYW5ub3VuY2U6ZnVuY3Rpb24oYSl7dGhpcy5fdGV4dD0iIjt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fdGV4dD1hfSwxMDApfSxfb25Jcm9uQW5ub3VuY2U6ZnVuY3Rpb24oYSl7YS5kZXRhaWwmJmEuZGV0YWlsLnRleHQmJnRoaXMuYW5ub3VuY2UoYS5kZXRhaWwudGV4dCl9fSk7ClBvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2U9bnVsbDtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLnJlcXVlc3RBdmFpbGFiaWxpdHk9ZnVuY3Rpb24oKXtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLmluc3RhbmNlfHwoUG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpcm9uLWExMXktYW5ub3VuY2VyIikpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoUG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZSl9fSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWlucHV0L2lyb24taW5wdXQuaHRtbC5qcwpQb2x5bWVyKHtpczoiaXJvbi1pbnB1dCIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntiaW5kVmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSx2YWx1ZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlVmFsdWUoYmluZFZhbHVlKSJ9LGFsbG93ZWRQYXR0ZXJuOnt0eXBlOlN0cmluZ30sYXV0b1ZhbGlkYXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9pbnB1dEVsZW1lbnQ6T2JqZWN0fSxvYnNlcnZlcnM6WyJfYmluZFZhbHVlQ2hhbmdlZChiaW5kVmFsdWUsIF9pbnB1dEVsZW1lbnQpIl0sbGlzdGVuZXJzOntpbnB1dDoiX29uSW5wdXQiLGtleXByZXNzOiJfb25LZXlwcmVzcyJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLnJlcXVlc3RBdmFpbGFiaWxpdHkoKTt0aGlzLl9wcmV2aW91c1ZhbGlkSW5wdXQ9IiI7dGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkPSExfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPQpQb2x5bWVyLmRvbSh0aGlzKS5vYnNlcnZlTm9kZXMoZnVuY3Rpb24oKXt0aGlzLl9pbml0U2xvdHRlZElucHV0KCl9LmJpbmQodGhpcykpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiYoUG9seW1lci5kb20odGhpcykudW5vYnNlcnZlTm9kZXModGhpcy5fb2JzZXJ2ZXIpLHRoaXMuX29ic2VydmVyPW51bGwpfSxnZXQgaW5wdXRFbGVtZW50KCl7cmV0dXJuIHRoaXMuX2lucHV0RWxlbWVudH0sX2luaXRTbG90dGVkSW5wdXQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dEVsZW1lbnQ9dGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpWzBdO3RoaXMuaW5wdXRFbGVtZW50JiZ0aGlzLmlucHV0RWxlbWVudC52YWx1ZSYmKHRoaXMuYmluZFZhbHVlPXRoaXMuaW5wdXRFbGVtZW50LnZhbHVlKTt0aGlzLmZpcmUoImlyb24taW5wdXQtcmVhZHkiKX0sZ2V0IF9wYXR0ZXJuUmVnRXhwKCl7aWYodGhpcy5hbGxvd2VkUGF0dGVybil2YXIgYT1uZXcgUmVnRXhwKHRoaXMuYWxsb3dlZFBhdHRlcm4pOwplbHNlIHN3aXRjaCh0aGlzLmlucHV0RWxlbWVudC50eXBlKXtjYXNlICJudW1iZXIiOmE9L1swLTkuLGUtXS99cmV0dXJuIGF9LF9iaW5kVmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7YyYmKHZvaWQgMD09PWE/Yy52YWx1ZT1udWxsOmEhPT1jLnZhbHVlJiYodGhpcy5pbnB1dEVsZW1lbnQudmFsdWU9YSksdGhpcy5hdXRvVmFsaWRhdGUmJnRoaXMudmFsaWRhdGUoKSx0aGlzLmZpcmUoImJpbmQtdmFsdWUtY2hhbmdlZCIse3ZhbHVlOmF9KSl9LF9vbklucHV0OmZ1bmN0aW9uKCl7IXRoaXMuYWxsb3dlZFBhdHRlcm58fHRoaXMuX3BhdHRlcm5BbHJlYWR5Q2hlY2tlZHx8dGhpcy5fY2hlY2tQYXR0ZXJuVmFsaWRpdHkoKXx8KHRoaXMuX2Fubm91bmNlSW52YWxpZENoYXJhY3RlcigiSW52YWxpZCBzdHJpbmcgb2YgY2hhcmFjdGVycyBub3QgZW50ZXJlZC4iKSx0aGlzLmlucHV0RWxlbWVudC52YWx1ZT10aGlzLl9wcmV2aW91c1ZhbGlkSW5wdXQpO3RoaXMuYmluZFZhbHVlPXRoaXMuX3ByZXZpb3VzVmFsaWRJbnB1dD0KdGhpcy5pbnB1dEVsZW1lbnQudmFsdWU7dGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkPSExfSxfaXNQcmludGFibGU6ZnVuY3Rpb24oYSl7dmFyIGM9MTk9PWEua2V5Q29kZXx8MjA9PWEua2V5Q29kZXx8NDU9PWEua2V5Q29kZXx8NDY9PWEua2V5Q29kZXx8MTQ0PT1hLmtleUNvZGV8fDE0NT09YS5rZXlDb2RlfHwzMjxhLmtleUNvZGUmJjQxPmEua2V5Q29kZXx8MTExPGEua2V5Q29kZSYmMTI0PmEua2V5Q29kZTtyZXR1cm4hKDg9PWEua2V5Q29kZXx8OT09YS5rZXlDb2RlfHwxMz09YS5rZXlDb2RlfHwyNz09YS5rZXlDb2RlKSYmISgwPT1hLmNoYXJDb2RlJiZjKX0sX29uS2V5cHJlc3M6ZnVuY3Rpb24oYSl7aWYodGhpcy5hbGxvd2VkUGF0dGVybnx8Im51bWJlciI9PT10aGlzLmlucHV0RWxlbWVudC50eXBlKXt2YXIgYz10aGlzLl9wYXR0ZXJuUmVnRXhwO2lmKGMmJiEoYS5tZXRhS2V5fHxhLmN0cmxLZXl8fGEuYWx0S2V5KSl7dGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkPQohMDt2YXIgZD1TdHJpbmcuZnJvbUNoYXJDb2RlKGEuY2hhckNvZGUpO3RoaXMuX2lzUHJpbnRhYmxlKGEpJiYhYy50ZXN0KGQpJiYoYS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2Fubm91bmNlSW52YWxpZENoYXJhY3RlcigiSW52YWxpZCBjaGFyYWN0ZXIgIitkKyIgbm90IGVudGVyZWQuIikpfX19LF9jaGVja1BhdHRlcm5WYWxpZGl0eTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX3BhdHRlcm5SZWdFeHA7aWYoIWEpcmV0dXJuITA7Zm9yKHZhciBjPTA7Yzx0aGlzLmlucHV0RWxlbWVudC52YWx1ZS5sZW5ndGg7YysrKWlmKCFhLnRlc3QodGhpcy5pbnB1dEVsZW1lbnQudmFsdWVbY10pKXJldHVybiExO3JldHVybiEwfSx2YWxpZGF0ZTpmdW5jdGlvbigpe2lmKCF0aGlzLmlucHV0RWxlbWVudClyZXR1cm4gdGhpcy5pbnZhbGlkPSExLCEwO3ZhciBhPXRoaXMuaW5wdXRFbGVtZW50LmNoZWNrVmFsaWRpdHkoKTthJiYodGhpcy5yZXF1aXJlZCYmIiI9PT10aGlzLmJpbmRWYWx1ZT9hPSExOgp0aGlzLmhhc1ZhbGlkYXRvcigpJiYoYT1Qb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yLnZhbGlkYXRlLmNhbGwodGhpcyx0aGlzLmJpbmRWYWx1ZSkpKTt0aGlzLmludmFsaWQ9IWE7dGhpcy5maXJlKCJpcm9uLWlucHV0LXZhbGlkYXRlIik7cmV0dXJuIGF9LF9hbm5vdW5jZUludmFsaWRDaGFyYWN0ZXI6ZnVuY3Rpb24oYSl7dGhpcy5maXJlKCJpcm9uLWFubm91bmNlIix7dGV4dDphfSl9LF9jb21wdXRlVmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVySW5wdXRIZWxwZXI9e307UG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRMYWJlbElEPTE7UG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRBZGRvbklEPTE7UG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRJbnB1dElEPTE7ClBvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7bGFiZWw6e3R5cGU6U3RyaW5nfSx2YWx1ZTp7bm90aWZ5OiEwLHR5cGU6U3RyaW5nfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbnZhbGlkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxhbGxvd2VkUGF0dGVybjp7dHlwZTpTdHJpbmd9LHR5cGU6e3R5cGU6U3RyaW5nfSxsaXN0Ont0eXBlOlN0cmluZ30scGF0dGVybjp7dHlwZTpTdHJpbmd9LHJlcXVpcmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGVycm9yTWVzc2FnZTp7dHlwZTpTdHJpbmd9LGNoYXJDb3VudGVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vTGFiZWxGbG9hdDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbHdheXNGbG9hdExhYmVsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGF1dG9WYWxpZGF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx2YWxpZGF0b3I6e3R5cGU6U3RyaW5nfSxhdXRvY29tcGxldGU6e3R5cGU6U3RyaW5nLAp2YWx1ZToib2ZmIn0sYXV0b2ZvY3VzOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9hdXRvZm9jdXNDaGFuZ2VkIn0saW5wdXRtb2RlOnt0eXBlOlN0cmluZ30sbWlubGVuZ3RoOnt0eXBlOk51bWJlcn0sbWF4bGVuZ3RoOnt0eXBlOk51bWJlcn0sbWluOnt0eXBlOlN0cmluZ30sbWF4Ont0eXBlOlN0cmluZ30sc3RlcDp7dHlwZTpTdHJpbmd9LG5hbWU6e3R5cGU6U3RyaW5nfSxwbGFjZWhvbGRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LHJlYWRvbmx5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNpemU6e3R5cGU6TnVtYmVyfSxhdXRvY2FwaXRhbGl6ZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im5vbmUifSxhdXRvY29ycmVjdDp7dHlwZTpTdHJpbmcsdmFsdWU6Im9mZiJ9LGF1dG9zYXZlOnt0eXBlOlN0cmluZ30scmVzdWx0czp7dHlwZTpOdW1iZXJ9LGFjY2VwdDp7dHlwZTpTdHJpbmd9LG11bHRpcGxlOnt0eXBlOkJvb2xlYW59LF9hcmlhRGVzY3JpYmVkQnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSwKX2FyaWFMYWJlbGxlZEJ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2lucHV0SWQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sbGlzdGVuZXJzOnsiYWRkb24tYXR0YWNoZWQiOiJfb25BZGRvbkF0dGFjaGVkIn0sa2V5QmluZGluZ3M6eyJzaGlmdCt0YWI6a2V5ZG93biI6Il9vblNoaWZ0VGFiRG93biJ9LGhvc3RBdHRyaWJ1dGVzOnt0YWJpbmRleDowfSxnZXQgaW5wdXRFbGVtZW50KCl7dGhpcy4kfHwodGhpcy4kPXt9KTt0aGlzLiQuaW5wdXR8fCh0aGlzLl9nZW5lcmF0ZUlucHV0SWQoKSx0aGlzLiQuaW5wdXQ9dGhpcy4kJCgiIyIrdGhpcy5faW5wdXRJZCkpO3JldHVybiB0aGlzLiQuaW5wdXR9LGdldCBfZm9jdXNhYmxlRWxlbWVudCgpe3JldHVybiB0aGlzLmlucHV0RWxlbWVudH0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX3R5cGVzVGhhdEhhdmVUZXh0PSJkYXRlIGRhdGV0aW1lIGRhdGV0aW1lLWxvY2FsIG1vbnRoIHRpbWUgd2VlayBmaWxlIi5zcGxpdCgiICIpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUFyaWFMYWJlbGxlZEJ5KCk7CiFQb2x5bWVyLkVsZW1lbnQmJnRoaXMuaW5wdXRFbGVtZW50JiYtMSE9PXRoaXMuX3R5cGVzVGhhdEhhdmVUZXh0LmluZGV4T2YodGhpcy5pbnB1dEVsZW1lbnQudHlwZSkmJih0aGlzLmFsd2F5c0Zsb2F0TGFiZWw9ITApfSxfYXBwZW5kU3RyaW5nV2l0aFNwYWNlOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGE/YSsiICIrYzpjfSxfb25BZGRvbkF0dGFjaGVkOmZ1bmN0aW9uKGEpe2E9UG9seW1lci5kb20oYSkucm9vdFRhcmdldDtpZihhLmlkKXRoaXMuX2FyaWFEZXNjcmliZWRCeT10aGlzLl9hcHBlbmRTdHJpbmdXaXRoU3BhY2UodGhpcy5fYXJpYURlc2NyaWJlZEJ5LGEuaWQpO2Vsc2V7dmFyIGM9InBhcGVyLWlucHV0LWFkZC1vbi0iK1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0QWRkb25JRCsrO2EuaWQ9Yzt0aGlzLl9hcmlhRGVzY3JpYmVkQnk9dGhpcy5fYXBwZW5kU3RyaW5nV2l0aFNwYWNlKHRoaXMuX2FyaWFEZXNjcmliZWRCeSxjKX19LHZhbGlkYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5wdXRFbGVtZW50LnZhbGlkYXRlKCl9LApfZm9jdXNCbHVySGFuZGxlcjpmdW5jdGlvbihhKXtQb2x5bWVyLklyb25Db250cm9sU3RhdGUuX2ZvY3VzQmx1ckhhbmRsZXIuY2FsbCh0aGlzLGEpO3RoaXMuZm9jdXNlZCYmIXRoaXMuX3NoaWZ0VGFiUHJlc3NlZCYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudCYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudC5mb2N1cygpfSxfb25TaGlmdFRhYkRvd246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKTt0aGlzLl9zaGlmdFRhYlByZXNzZWQ9ITA7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKTt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IixhKTt0aGlzLl9zaGlmdFRhYlByZXNzZWQ9ITF9LDEpfSxfaGFuZGxlQXV0b1ZhbGlkYXRlOmZ1bmN0aW9uKCl7dGhpcy5hdXRvVmFsaWRhdGUmJnRoaXMudmFsaWRhdGUoKX0sdXBkYXRlVmFsdWVBbmRQcmVzZXJ2ZUNhcmV0OmZ1bmN0aW9uKGEpe3RyeXt2YXIgYz0KdGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uU3RhcnQ7dGhpcy52YWx1ZT1hO3RoaXMuaW5wdXRFbGVtZW50LnNlbGVjdGlvblN0YXJ0PWM7dGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uRW5kPWN9Y2F0Y2goZCl7dGhpcy52YWx1ZT1hfX0sX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGN8fGF9LF91cGRhdGVBcmlhTGFiZWxsZWRCeTpmdW5jdGlvbigpe3ZhciBhPVBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvcigibGFiZWwiKTtpZihhKXtpZihhLmlkKXZhciBjPWEuaWQ7ZWxzZSBjPSJwYXBlci1pbnB1dC1sYWJlbC0iK1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0TGFiZWxJRCsrLGEuaWQ9Yzt0aGlzLl9hcmlhTGFiZWxsZWRCeT1jfWVsc2UgdGhpcy5fYXJpYUxhYmVsbGVkQnk9IiJ9LF9nZW5lcmF0ZUlucHV0SWQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dElkJiYiIiE9PXRoaXMuX2lucHV0SWR8fCh0aGlzLl9pbnB1dElkPQoiaW5wdXQtIitQb2x5bWVyLlBhcGVySW5wdXRIZWxwZXIuTmV4dElucHV0SUQrKyl9LF9vbkNoYW5nZTpmdW5jdGlvbihhKXt0aGlzLnNoYWRvd1Jvb3QmJnRoaXMuZmlyZShhLnR5cGUse3NvdXJjZUV2ZW50OmF9LHtub2RlOnRoaXMsYnViYmxlczphLmJ1YmJsZXMsY2FuY2VsYWJsZTphLmNhbmNlbGFibGV9KX0sX2F1dG9mb2N1c0NoYW5nZWQ6ZnVuY3Rpb24oKXtpZih0aGlzLmF1dG9mb2N1cyYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudCl7dmFyIGE9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDthIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJmEhPT1kb2N1bWVudC5ib2R5JiZhIT09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx0aGlzLl9mb2N1c2FibGVFbGVtZW50LmZvY3VzKCl9fX07UG9seW1lci5QYXBlcklucHV0QmVoYXZpb3I9W1BvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLFBvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtYWRkb24tYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVySW5wdXRBZGRvbkJlaGF2aW9yPXthdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuZmlyZSgiYWRkb24tYXR0YWNoZWQiKX0sdXBkYXRlOmZ1bmN0aW9uKCl7fX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtY2hhci1jb3VudGVyLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWlucHV0LWNoYXItY291bnRlciIsYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVySW5wdXRBZGRvbkJlaGF2aW9yXSxwcm9wZXJ0aWVzOntfY2hhckNvdW50ZXJTdHI6e3R5cGU6U3RyaW5nLHZhbHVlOiIwIn19LHVwZGF0ZTpmdW5jdGlvbihhKXtpZihhLmlucHV0RWxlbWVudCl7YS52YWx1ZT1hLnZhbHVlfHwiIjt2YXIgYz1hLnZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoLnRvU3RyaW5nKCk7YS5pbnB1dEVsZW1lbnQuaGFzQXR0cmlidXRlKCJtYXhsZW5ndGgiKSYmKGMrPSIvIithLmlucHV0RWxlbWVudC5nZXRBdHRyaWJ1dGUoIm1heGxlbmd0aCIpKTt0aGlzLl9jaGFyQ291bnRlclN0cj1jfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1pbnB1dC9wYXBlci1pbnB1dC1jb250YWluZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaW5wdXQtY29udGFpbmVyIixwcm9wZXJ0aWVzOntub0xhYmVsRmxvYXQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYWx3YXlzRmxvYXRMYWJlbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhdHRyRm9yVmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiJiaW5kLXZhbHVlIn0sYXV0b1ZhbGlkYXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGludmFsaWQ6e29ic2VydmVyOiJfaW52YWxpZENoYW5nZWQiLHR5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZm9jdXNlZDp7cmVhZE9ubHk6ITAsdHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sX2FkZG9uczp7dHlwZTpBcnJheX0sX2lucHV0SGFzQ29udGVudDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaW5wdXRTZWxlY3Rvcjp7dHlwZTpTdHJpbmcsdmFsdWU6ImlucHV0LGlyb24taW5wdXQsdGV4dGFyZWEsLnBhcGVyLWlucHV0LWlucHV0In0sX2JvdW5kT25Gb2N1czp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbkZvY3VzLmJpbmQodGhpcyl9fSwKX2JvdW5kT25CbHVyOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uQmx1ci5iaW5kKHRoaXMpfX0sX2JvdW5kT25JbnB1dDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbklucHV0LmJpbmQodGhpcyl9fSxfYm91bmRWYWx1ZUNoYW5nZWQ6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25WYWx1ZUNoYW5nZWQuYmluZCh0aGlzKX19fSxsaXN0ZW5lcnM6eyJhZGRvbi1hdHRhY2hlZCI6Il9vbkFkZG9uQXR0YWNoZWQiLCJpcm9uLWlucHV0LXZhbGlkYXRlIjoiX29uSXJvbklucHV0VmFsaWRhdGUifSxnZXQgX3ZhbHVlQ2hhbmdlZEV2ZW50KCl7cmV0dXJuIHRoaXMuYXR0ckZvclZhbHVlKyItY2hhbmdlZCJ9LGdldCBfcHJvcGVydHlGb3JWYWx1ZSgpe3JldHVybiBQb2x5bWVyLkNhc2VNYXAuZGFzaFRvQ2FtZWxDYXNlKHRoaXMuYXR0ckZvclZhbHVlKX0sZ2V0IF9pbnB1dEVsZW1lbnQoKXtyZXR1cm4gUG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3Rvcih0aGlzLl9pbnB1dFNlbGVjdG9yKX0sCmdldCBfaW5wdXRFbGVtZW50VmFsdWUoKXtyZXR1cm4gdGhpcy5faW5wdXRFbGVtZW50W3RoaXMuX3Byb3BlcnR5Rm9yVmFsdWVdfHx0aGlzLl9pbnB1dEVsZW1lbnQudmFsdWV9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fX2lzRmlyc3RWYWx1ZVVwZGF0ZT0hMDt0aGlzLl9hZGRvbnN8fCh0aGlzLl9hZGRvbnM9W10pO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2JvdW5kT25Gb2N1cywhMCk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9ib3VuZE9uQmx1ciwhMCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5hdHRyRm9yVmFsdWU/dGhpcy5faW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5fdmFsdWVDaGFuZ2VkRXZlbnQsdGhpcy5fYm91bmRWYWx1ZUNoYW5nZWQpOnRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLHRoaXMuX29uSW5wdXQpO3RoaXMuX2lucHV0RWxlbWVudFZhbHVlJiYiIiE9dGhpcy5faW5wdXRFbGVtZW50VmFsdWU/CnRoaXMuX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlKHRoaXMuX2lucHV0RWxlbWVudCk6dGhpcy5faGFuZGxlVmFsdWUodGhpcy5faW5wdXRFbGVtZW50KX0sX29uQWRkb25BdHRhY2hlZDpmdW5jdGlvbihhKXt0aGlzLl9hZGRvbnN8fCh0aGlzLl9hZGRvbnM9W10pO2E9YS50YXJnZXQ7LTE9PT10aGlzLl9hZGRvbnMuaW5kZXhPZihhKSYmKHRoaXMuX2FkZG9ucy5wdXNoKGEpLHRoaXMuaXNBdHRhY2hlZCYmdGhpcy5faGFuZGxlVmFsdWUodGhpcy5faW5wdXRFbGVtZW50KSl9LF9vbkZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Rm9jdXNlZCghMCl9LF9vbkJsdXI6ZnVuY3Rpb24oKXt0aGlzLl9zZXRGb2N1c2VkKCExKTt0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZSh0aGlzLl9pbnB1dEVsZW1lbnQpfSxfb25JbnB1dDpmdW5jdGlvbihhKXt0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZShhLnRhcmdldCl9LF9vblZhbHVlQ2hhbmdlZDpmdW5jdGlvbihhKXt2YXIgYz0KYS50YXJnZXQ7aWYodGhpcy5fX2lzRmlyc3RWYWx1ZVVwZGF0ZSYmKHRoaXMuX19pc0ZpcnN0VmFsdWVVcGRhdGU9ITEsdm9pZCAwPT09Yy52YWx1ZXx8IiI9PT1jLnZhbHVlKSlyZXR1cm47dGhpcy5faGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGUoYS50YXJnZXQpfSxfaGFuZGxlVmFsdWU6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5faW5wdXRFbGVtZW50VmFsdWU7Y3x8MD09PWN8fCJudW1iZXIiPT09YS50eXBlJiYhYS5jaGVja1ZhbGlkaXR5KCk/dGhpcy5faW5wdXRIYXNDb250ZW50PSEwOnRoaXMuX2lucHV0SGFzQ29udGVudD0hMTt0aGlzLnVwZGF0ZUFkZG9ucyh7aW5wdXRFbGVtZW50OmEsdmFsdWU6YyxpbnZhbGlkOnRoaXMuaW52YWxpZH0pfSxfaGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGU6ZnVuY3Rpb24oYSl7dGhpcy5hdXRvVmFsaWRhdGUmJmEmJih0aGlzLmludmFsaWQ9IShhLnZhbGlkYXRlP2EudmFsaWRhdGUodGhpcy5faW5wdXRFbGVtZW50VmFsdWUpOmEuY2hlY2tWYWxpZGl0eSgpKSk7CnRoaXMuX2hhbmRsZVZhbHVlKGEpfSxfb25Jcm9uSW5wdXRWYWxpZGF0ZTpmdW5jdGlvbigpe3RoaXMuaW52YWxpZD10aGlzLl9pbnB1dEVsZW1lbnQuaW52YWxpZH0sX2ludmFsaWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fYWRkb25zJiZ0aGlzLnVwZGF0ZUFkZG9ucyh7aW52YWxpZDp0aGlzLmludmFsaWR9KX0sdXBkYXRlQWRkb25zOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPTA7Yz10aGlzLl9hZGRvbnNbZF07ZCsrKWMudXBkYXRlKGEpfSxfY29tcHV0ZUlucHV0Q29udGVudENsYXNzOmZ1bmN0aW9uKGEsYyxkLGYsZyl7dmFyIGw9ImlucHV0LWNvbnRlbnQiO2E/KGcmJihsKz0iIGxhYmVsLWlzLWhpZGRlbiIpLGYmJihsKz0iIGlzLWludmFsaWQiKSk6KGE9dGhpcy5xdWVyeVNlbGVjdG9yKCJsYWJlbCIpLGN8fGc/KGwrPSIgbGFiZWwtaXMtZmxvYXRpbmciLHRoaXMuJC5sYWJlbEFuZElucHV0Q29udGFpbmVyLnN0eWxlLnBvc2l0aW9uPSJzdGF0aWMiLGY/bCs9IiBpcy1pbnZhbGlkIjoKZCYmKGwrPSIgbGFiZWwtaXMtaGlnaGxpZ2h0ZWQiKSk6KGEmJih0aGlzLiQubGFiZWxBbmRJbnB1dENvbnRhaW5lci5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxmJiYobCs9IiBpcy1pbnZhbGlkIikpKTtkJiYobCs9IiBmb2N1c2VkIik7cmV0dXJuIGx9LF9jb21wdXRlVW5kZXJsaW5lQ2xhc3M6ZnVuY3Rpb24oYSxjKXt2YXIgZD0idW5kZXJsaW5lIjtjP2QrPSIgaXMtaW52YWxpZCI6YSYmKGQrPSIgaXMtaGlnaGxpZ2h0ZWQiKTtyZXR1cm4gZH0sX2NvbXB1dGVBZGRPbkNvbnRlbnRDbGFzczpmdW5jdGlvbihhLGMpe3ZhciBkPSJhZGQtb24tY29udGVudCI7Yz9kKz0iIGlzLWludmFsaWQiOmEmJihkKz0iIGlzLWhpZ2hsaWdodGVkIik7cmV0dXJuIGR9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtZXJyb3IuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaW5wdXQtZXJyb3IiLGJlaGF2aW9yczpbUG9seW1lci5QYXBlcklucHV0QWRkb25CZWhhdmlvcl0scHJvcGVydGllczp7aW52YWxpZDp7cmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbn19LHVwZGF0ZTpmdW5jdGlvbihhKXt0aGlzLl9zZXRJbnZhbGlkKGEuaW52YWxpZCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaW5wdXQiLGJlaGF2aW9yczpbUG9seW1lci5QYXBlcklucHV0QmVoYXZpb3IsUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcl0scHJvcGVydGllczp7dmFsdWU6e3R5cGU6U3RyaW5nfX0sYmVmb3JlUmVnaXN0ZXI6ZnVuY3Rpb24oKXt2YXIgYT0iZnVuY3Rpb24iPT10eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaXJvbi1pbnB1dCIpLl9pbml0U2xvdHRlZElucHV0PyJ2MSI6InYwIixjPVBvbHltZXIuRG9tTW9kdWxlLmltcG9ydCgicGFwZXItaW5wdXQiLCJ0ZW1wbGF0ZSIpO2E9UG9seW1lci5Eb21Nb2R1bGUuaW1wb3J0KCJwYXBlci1pbnB1dCIsInRlbXBsYXRlIyIrYSk7KGM9Yy5jb250ZW50LnF1ZXJ5U2VsZWN0b3IoIiN0ZW1wbGF0ZS1wbGFjZWhvbGRlciIpKSYmYy5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChhLmNvbnRlbnQsYyl9LGdldCBfZm9jdXNhYmxlRWxlbWVudCgpe3JldHVybiBQb2x5bWVyLkVsZW1lbnQ/dGhpcy5pbnB1dEVsZW1lbnQuX2lucHV0RWxlbWVudDoKdGhpcy5pbnB1dEVsZW1lbnR9LGxpc3RlbmVyczp7Imlyb24taW5wdXQtcmVhZHkiOiJfb25Jcm9uSW5wdXRSZWFkeSJ9LF9vbklyb25JbnB1dFJlYWR5OmZ1bmN0aW9uKCl7dGhpcy4kLm5hdGl2ZUlucHV0fHwodGhpcy4kLm5hdGl2ZUlucHV0PXRoaXMuJCQoImlucHV0IikpO3RoaXMuaW5wdXRFbGVtZW50JiYtMSE9PXRoaXMuX3R5cGVzVGhhdEhhdmVUZXh0LmluZGV4T2YodGhpcy4kLm5hdGl2ZUlucHV0LnR5cGUpJiYodGhpcy5hbHdheXNGbG9hdExhYmVsPSEwKTt0aGlzLmlucHV0RWxlbWVudC5iaW5kVmFsdWUmJnRoaXMuJC5jb250YWluZXIuX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlKHRoaXMuaW5wdXRFbGVtZW50KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWZpdC1iZWhhdmlvci9pcm9uLWZpdC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvbkZpdEJlaGF2aW9yPXtwcm9wZXJ0aWVzOntzaXppbmdUYXJnZXQ6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSxmaXRJbnRvOnt0eXBlOk9iamVjdCx2YWx1ZTp3aW5kb3d9LG5vT3ZlcmxhcDp7dHlwZTpCb29sZWFufSxwb3NpdGlvblRhcmdldDp7dHlwZTpFbGVtZW50fSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nfSx2ZXJ0aWNhbEFsaWduOnt0eXBlOlN0cmluZ30sZHluYW1pY0FsaWduOnt0eXBlOkJvb2xlYW59LGhvcml6b250YWxPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSx2ZXJ0aWNhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LGF1dG9GaXRPbkF0dGFjaDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfZml0SW5mbzp7dHlwZTpPYmplY3R9fSxnZXQgX2ZpdFdpZHRoKCl7cmV0dXJuIHRoaXMuZml0SW50bz09PXdpbmRvdz90aGlzLmZpdEludG8uaW5uZXJXaWR0aDp0aGlzLmZpdEludG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGh9LApnZXQgX2ZpdEhlaWdodCgpe3JldHVybiB0aGlzLmZpdEludG89PT13aW5kb3c/dGhpcy5maXRJbnRvLmlubmVySGVpZ2h0OnRoaXMuZml0SW50by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHR9LGdldCBfZml0TGVmdCgpe3JldHVybiB0aGlzLmZpdEludG89PT13aW5kb3c/MDp0aGlzLmZpdEludG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0sZ2V0IF9maXRUb3AoKXtyZXR1cm4gdGhpcy5maXRJbnRvPT09d2luZG93PzA6dGhpcy5maXRJbnRvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcH0sZ2V0IF9kZWZhdWx0UG9zaXRpb25UYXJnZXQoKXt2YXIgYT1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlO2EmJmEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJihhPWEuaG9zdCk7cmV0dXJuIGF9LGdldCBfbG9jYWxlSG9yaXpvbnRhbEFsaWduKCl7aWYodGhpcy5faXNSVEwpe2lmKCJyaWdodCI9PT10aGlzLmhvcml6b250YWxBbGlnbilyZXR1cm4ibGVmdCI7CmlmKCJsZWZ0Ij09PXRoaXMuaG9yaXpvbnRhbEFsaWduKXJldHVybiJyaWdodCJ9cmV0dXJuIHRoaXMuaG9yaXpvbnRhbEFsaWdufSxnZXQgX19zaG91bGRQb3NpdGlvbigpe3JldHVybih0aGlzLmhvcml6b250YWxBbGlnbnx8dGhpcy52ZXJ0aWNhbEFsaWduKSYmdGhpcy5wb3NpdGlvblRhcmdldH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXsidW5kZWZpbmVkIj09PXR5cGVvZiB0aGlzLl9pc1JUTCYmKHRoaXMuX2lzUlRMPSJydGwiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKS5kaXJlY3Rpb24pO3RoaXMucG9zaXRpb25UYXJnZXQ9dGhpcy5wb3NpdGlvblRhcmdldHx8dGhpcy5fZGVmYXVsdFBvc2l0aW9uVGFyZ2V0O3RoaXMuYXV0b0ZpdE9uQXR0YWNoJiYoIm5vbmUiPT09d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcykuZGlzcGxheT9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5maXQoKX0uYmluZCh0aGlzKSk6KHdpbmRvdy5TaGFkeURPTSYmU2hhZHlET00uZmx1c2goKSwKdGhpcy5maXQoKSkpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX19kZWZlcnJlZEZpdCYmKGNsZWFyVGltZW91dCh0aGlzLl9fZGVmZXJyZWRGaXQpLHRoaXMuX19kZWZlcnJlZEZpdD1udWxsKX0sZml0OmZ1bmN0aW9uKCl7dGhpcy5wb3NpdGlvbigpO3RoaXMuY29uc3RyYWluKCk7dGhpcy5jZW50ZXIoKX0sX2Rpc2NvdmVySW5mbzpmdW5jdGlvbigpe2lmKCF0aGlzLl9maXRJbmZvKXt2YXIgYT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKSxjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuc2l6aW5nVGFyZ2V0KTt0aGlzLl9maXRJbmZvPXtpbmxpbmVTdHlsZTp7dG9wOnRoaXMuc3R5bGUudG9wfHwiIixsZWZ0OnRoaXMuc3R5bGUubGVmdHx8IiIscG9zaXRpb246dGhpcy5zdHlsZS5wb3NpdGlvbnx8IiJ9LHNpemVySW5saW5lU3R5bGU6e21heFdpZHRoOnRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLm1heFdpZHRofHwiIixtYXhIZWlnaHQ6dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUubWF4SGVpZ2h0fHwKIiIsYm94U2l6aW5nOnRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLmJveFNpemluZ3x8IiJ9LHBvc2l0aW9uZWRCeTp7dmVydGljYWxseToiYXV0byIhPT1hLnRvcD8idG9wIjoiYXV0byIhPT1hLmJvdHRvbT8iYm90dG9tIjpudWxsLGhvcml6b250YWxseToiYXV0byIhPT1hLmxlZnQ/ImxlZnQiOiJhdXRvIiE9PWEucmlnaHQ/InJpZ2h0IjpudWxsfSxzaXplZEJ5OntoZWlnaHQ6Im5vbmUiIT09Yy5tYXhIZWlnaHQsd2lkdGg6Im5vbmUiIT09Yy5tYXhXaWR0aCxtaW5XaWR0aDpwYXJzZUludChjLm1pbldpZHRoLDEwKXx8MCxtaW5IZWlnaHQ6cGFyc2VJbnQoYy5taW5IZWlnaHQsMTApfHwwfSxtYXJnaW46e3RvcDpwYXJzZUludChhLm1hcmdpblRvcCwxMCl8fDAscmlnaHQ6cGFyc2VJbnQoYS5tYXJnaW5SaWdodCwxMCl8fDAsYm90dG9tOnBhcnNlSW50KGEubWFyZ2luQm90dG9tLDEwKXx8MCxsZWZ0OnBhcnNlSW50KGEubWFyZ2luTGVmdCwxMCl8fDB9fX19LHJlc2V0Rml0OmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuX2ZpdEluZm98fHt9LGM7Zm9yKGMgaW4gYS5zaXplcklubGluZVN0eWxlKXRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlW2NdPWEuc2l6ZXJJbmxpbmVTdHlsZVtjXTtmb3IoYyBpbiBhLmlubGluZVN0eWxlKXRoaXMuc3R5bGVbY109YS5pbmxpbmVTdHlsZVtjXTt0aGlzLl9maXRJbmZvPW51bGx9LHJlZml0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsTGVmdCxjPXRoaXMuc2l6aW5nVGFyZ2V0LnNjcm9sbFRvcDt0aGlzLnJlc2V0Rml0KCk7dGhpcy5maXQoKTt0aGlzLnNpemluZ1RhcmdldC5zY3JvbGxMZWZ0PWE7dGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsVG9wPWN9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpcy5fX3Nob3VsZFBvc2l0aW9uKXt0aGlzLl9kaXNjb3ZlckluZm8oKTt0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCI7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Ijt0aGlzLnN0eWxlLmxlZnQ9IjBweCI7CnRoaXMuc3R5bGUudG9wPSIwcHgiO3ZhciBhPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz10aGlzLl9fZ2V0Tm9ybWFsaXplZFJlY3QodGhpcy5wb3NpdGlvblRhcmdldCksZD10aGlzLl9fZ2V0Tm9ybWFsaXplZFJlY3QodGhpcy5maXRJbnRvKSxmPXRoaXMuX2ZpdEluZm8ubWFyZ2luLGc9dGhpcy5fX2dldFBvc2l0aW9uKHRoaXMuX2xvY2FsZUhvcml6b250YWxBbGlnbix0aGlzLnZlcnRpY2FsQWxpZ24se3dpZHRoOmEud2lkdGgrZi5sZWZ0K2YucmlnaHQsaGVpZ2h0OmEuaGVpZ2h0K2YudG9wK2YuYm90dG9tfSxhLGMsZCk7Yz1nLmxlZnQrZi5sZWZ0O2c9Zy50b3ArZi50b3A7dmFyIGw9TWF0aC5taW4oZC5yaWdodC1mLnJpZ2h0LGMrYS53aWR0aCksaz1NYXRoLm1pbihkLmJvdHRvbS1mLmJvdHRvbSxnK2EuaGVpZ2h0KTtjPU1hdGgubWF4KGQubGVmdCtmLmxlZnQsTWF0aC5taW4oYyxsLXRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5XaWR0aCkpO2c9TWF0aC5tYXgoZC50b3ArCmYudG9wLE1hdGgubWluKGcsay10aGlzLl9maXRJbmZvLnNpemVkQnkubWluSGVpZ2h0KSk7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUubWF4V2lkdGg9TWF0aC5tYXgobC1jLHRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5XaWR0aCkrInB4Ijt0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5tYXhIZWlnaHQ9TWF0aC5tYXgoay1nLHRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5IZWlnaHQpKyJweCI7dGhpcy5zdHlsZS5sZWZ0PWMtYS5sZWZ0KyJweCI7dGhpcy5zdHlsZS50b3A9Zy1hLnRvcCsicHgifX0sY29uc3RyYWluOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19zaG91bGRQb3NpdGlvbil7dGhpcy5fZGlzY292ZXJJbmZvKCk7dmFyIGE9dGhpcy5fZml0SW5mbzthLnBvc2l0aW9uZWRCeS52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLHRoaXMuc3R5bGUudG9wPSIwcHgiKTthLnBvc2l0aW9uZWRCeS5ob3Jpem9udGFsbHl8fCh0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsCnRoaXMuc3R5bGUubGVmdD0iMHB4Iik7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Ijt2YXIgYz10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Euc2l6ZWRCeS5oZWlnaHR8fHRoaXMuX19zaXplRGltZW5zaW9uKGMsYS5wb3NpdGlvbmVkQnkudmVydGljYWxseSwidG9wIiwiYm90dG9tIiwiSGVpZ2h0Iik7YS5zaXplZEJ5LndpZHRofHx0aGlzLl9fc2l6ZURpbWVuc2lvbihjLGEucG9zaXRpb25lZEJ5Lmhvcml6b250YWxseSwibGVmdCIsInJpZ2h0IiwiV2lkdGgiKX19LF9zaXplRGltZW5zaW9uOmZ1bmN0aW9uKGEsYyxkLGYsZyl7dGhpcy5fX3NpemVEaW1lbnNpb24oYSxjLGQsZixnKX0sX19zaXplRGltZW5zaW9uOmZ1bmN0aW9uKGEsYyxkLGYsZyl7dmFyIGw9dGhpcy5fZml0SW5mbyxrPXRoaXMuX19nZXROb3JtYWxpemVkUmVjdCh0aGlzLmZpdEludG8pO2s9IldpZHRoIj09PWc/ay53aWR0aDprLmhlaWdodDtjPWM9PT1mO3ZhciBuPQoib2Zmc2V0IitnO3RoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlWyJtYXgiK2ddPWstbC5tYXJnaW5bYz9kOmZdLShjP2stYVtmXTphW2RdKS0odGhpc1tuXS10aGlzLnNpemluZ1RhcmdldFtuXSkrInB4In0sY2VudGVyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19zaG91bGRQb3NpdGlvbil7dGhpcy5fZGlzY292ZXJJbmZvKCk7dmFyIGE9dGhpcy5fZml0SW5mby5wb3NpdGlvbmVkQnk7aWYoIWEudmVydGljYWxseXx8IWEuaG9yaXpvbnRhbGx5KXt0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCI7YS52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS50b3A9IjBweCIpO2EuaG9yaXpvbnRhbGx5fHwodGhpcy5zdHlsZS5sZWZ0PSIwcHgiKTt2YXIgYz10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9dGhpcy5fX2dldE5vcm1hbGl6ZWRSZWN0KHRoaXMuZml0SW50byk7YS52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS50b3A9ZC50b3AtYy50b3ArKGQuaGVpZ2h0LWMuaGVpZ2h0KS8yKyJweCIpO2EuaG9yaXpvbnRhbGx5fHwKKHRoaXMuc3R5bGUubGVmdD1kLmxlZnQtYy5sZWZ0KyhkLndpZHRoLWMud2lkdGgpLzIrInB4Iil9fX0sX19nZXROb3JtYWxpemVkUmVjdDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8YT09PXdpbmRvdz97dG9wOjAsbGVmdDowLHdpZHRoOndpbmRvdy5pbm5lcldpZHRoLGhlaWdodDp3aW5kb3cuaW5uZXJIZWlnaHQscmlnaHQ6d2luZG93LmlubmVyV2lkdGgsYm90dG9tOndpbmRvdy5pbm5lckhlaWdodH06YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0sX19nZXRPZmZzY3JlZW5BcmVhOmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gTWF0aC5hYnMoTWF0aC5taW4oMCxhLnRvcCkrTWF0aC5taW4oMCxkLmJvdHRvbS0oYS50b3ArYy5oZWlnaHQpKSkqYy53aWR0aCtNYXRoLmFicyhNYXRoLm1pbigwLGEubGVmdCkrTWF0aC5taW4oMCxkLnJpZ2h0LShhLmxlZnQrYy53aWR0aCkpKSpjLmhlaWdodH0sX19nZXRQb3NpdGlvbjpmdW5jdGlvbihhLGMsCmQsZixnLGwpe3ZhciBrPVt7dmVydGljYWxBbGlnbjoidG9wIixob3Jpem9udGFsQWxpZ246ImxlZnQiLHRvcDpnLnRvcCt0aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6Zy5sZWZ0K3RoaXMuaG9yaXpvbnRhbE9mZnNldH0se3ZlcnRpY2FsQWxpZ246InRvcCIsaG9yaXpvbnRhbEFsaWduOiJyaWdodCIsdG9wOmcudG9wK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDpnLnJpZ2h0LWQud2lkdGgtdGhpcy5ob3Jpem9udGFsT2Zmc2V0fSx7dmVydGljYWxBbGlnbjoiYm90dG9tIixob3Jpem9udGFsQWxpZ246ImxlZnQiLHRvcDpnLmJvdHRvbS1kLmhlaWdodC10aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6Zy5sZWZ0K3RoaXMuaG9yaXpvbnRhbE9mZnNldH0se3ZlcnRpY2FsQWxpZ246ImJvdHRvbSIsaG9yaXpvbnRhbEFsaWduOiJyaWdodCIsdG9wOmcuYm90dG9tLWQuaGVpZ2h0LXRoaXMudmVydGljYWxPZmZzZXQsbGVmdDpnLnJpZ2h0LWQud2lkdGgtdGhpcy5ob3Jpem9udGFsT2Zmc2V0fV07CmlmKHRoaXMubm9PdmVybGFwKXtmb3IodmFyIG49MCxwPWsubGVuZ3RoO248cDtuKyspe3ZhciBxPXt9LHI7Zm9yKHIgaW4ga1tuXSlxW3JdPWtbbl1bcl07ay5wdXNoKHEpfWtbMF0udG9wPWtbMV0udG9wKz1nLmhlaWdodDtrWzJdLnRvcD1rWzNdLnRvcC09Zy5oZWlnaHQ7a1s0XS5sZWZ0PWtbNl0ubGVmdCs9Zy53aWR0aDtrWzVdLmxlZnQ9a1s3XS5sZWZ0LT1nLndpZHRofWM9ImF1dG8iPT09Yz9udWxsOmM7YT0iYXV0byI9PT1hP251bGw6YTthJiYiY2VudGVyIiE9PWF8fChrLnB1c2goe3ZlcnRpY2FsQWxpZ246InRvcCIsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLHRvcDpnLnRvcCt0aGlzLnZlcnRpY2FsT2Zmc2V0Kyh0aGlzLm5vT3ZlcmxhcD9nLmhlaWdodDowKSxsZWZ0OmcubGVmdC1mLndpZHRoLzIrZy53aWR0aC8yK3RoaXMuaG9yaXpvbnRhbE9mZnNldH0pLGsucHVzaCh7dmVydGljYWxBbGlnbjoiYm90dG9tIixob3Jpem9udGFsQWxpZ246ImNlbnRlciIsdG9wOmcuYm90dG9tLQpkLmhlaWdodC10aGlzLnZlcnRpY2FsT2Zmc2V0LSh0aGlzLm5vT3ZlcmxhcD9nLmhlaWdodDowKSxsZWZ0OmcubGVmdC1mLndpZHRoLzIrZy53aWR0aC8yK3RoaXMuaG9yaXpvbnRhbE9mZnNldH0pKTtjJiYibWlkZGxlIiE9PWN8fChrLnB1c2goe3ZlcnRpY2FsQWxpZ246Im1pZGRsZSIsaG9yaXpvbnRhbEFsaWduOiJsZWZ0Iix0b3A6Zy50b3AtZi5oZWlnaHQvMitnLmhlaWdodC8yK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDpnLmxlZnQrdGhpcy5ob3Jpem9udGFsT2Zmc2V0Kyh0aGlzLm5vT3ZlcmxhcD9nLndpZHRoOjApfSksay5wdXNoKHt2ZXJ0aWNhbEFsaWduOiJtaWRkbGUiLGhvcml6b250YWxBbGlnbjoicmlnaHQiLHRvcDpnLnRvcC1mLmhlaWdodC8yK2cuaGVpZ2h0LzIrdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OmcucmlnaHQtZC53aWR0aC10aGlzLmhvcml6b250YWxPZmZzZXQtKHRoaXMubm9PdmVybGFwP2cud2lkdGg6MCl9KSk7Im1pZGRsZSI9PT1jJiYiY2VudGVyIj09PQphJiZrLnB1c2goe3ZlcnRpY2FsQWxpZ246Im1pZGRsZSIsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLHRvcDpnLnRvcC1mLmhlaWdodC8yK2cuaGVpZ2h0LzIrdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OmcubGVmdC1mLndpZHRoLzIrZy53aWR0aC8yK3RoaXMuaG9yaXpvbnRhbE9mZnNldH0pO2ZvcihuPTA7bjxrLmxlbmd0aDtuKyspe2Y9a1tuXTtnPWYudmVydGljYWxBbGlnbj09PWM7cD1mLmhvcml6b250YWxBbGlnbj09PWE7aWYoIXRoaXMuZHluYW1pY0FsaWduJiYhdGhpcy5ub092ZXJsYXAmJmcmJnApe3ZhciB0PWY7YnJlYWt9cT0oIWN8fGcpJiYoIWF8fHApO2lmKHRoaXMuZHluYW1pY0FsaWdufHxxKXtmLm9mZnNjcmVlbkFyZWE9dGhpcy5fX2dldE9mZnNjcmVlbkFyZWEoZixkLGwpO2lmKDA9PT1mLm9mZnNjcmVlbkFyZWEmJnEpe3Q9ZjticmVha310PXR8fGY7cT1mLm9mZnNjcmVlbkFyZWEtdC5vZmZzY3JlZW5BcmVhO2lmKDA+cXx8MD09PXEmJihnfHxwKSl0PWZ9fXJldHVybiB0fX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1yZXNpemFibGUtYmVoYXZpb3IvaXJvbi1yZXNpemFibGUtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcj17cHJvcGVydGllczp7X3BhcmVudFJlc2l6YWJsZTp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9wYXJlbnRSZXNpemFibGVDaGFuZ2VkIn0sX25vdGlmeWluZ0Rlc2NlbmRhbnQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LGxpc3RlbmVyczp7Imlyb24tcmVxdWVzdC1yZXNpemUtbm90aWZpY2F0aW9ucyI6Il9vbklyb25SZXF1ZXN0UmVzaXplTm90aWZpY2F0aW9ucyJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcz1bXTt0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZT10aGlzLm5vdGlmeVJlc2l6ZS5iaW5kKHRoaXMpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zKCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcGFyZW50UmVzaXphYmxlP3RoaXMuX3BhcmVudFJlc2l6YWJsZS5zdG9wUmVzaXplTm90aWZpY2F0aW9uc0Zvcih0aGlzKTp3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIiwKdGhpcy5fYm91bmROb3RpZnlSZXNpemUpO3RoaXMuX3BhcmVudFJlc2l6YWJsZT1udWxsfSxub3RpZnlSZXNpemU6ZnVuY3Rpb24oKXt0aGlzLmlzQXR0YWNoZWQmJih0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RoaXMucmVzaXplclNob3VsZE5vdGlmeShhKSYmdGhpcy5fbm90aWZ5RGVzY2VuZGFudChhKX0sdGhpcyksdGhpcy5fZmlyZVJlc2l6ZSgpKX0sYXNzaWduUGFyZW50UmVzaXphYmxlOmZ1bmN0aW9uKGEpe3RoaXMuX3BhcmVudFJlc2l6YWJsZT1hfSxzdG9wUmVzaXplTm90aWZpY2F0aW9uc0ZvcjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5pbmRleE9mKGEpOy0xPGMmJih0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5zcGxpY2UoYywxKSx0aGlzLnVubGlzdGVuKGEsImlyb24tcmVzaXplIiwiX29uRGVzY2VuZGFudElyb25SZXNpemUiKSl9LHJlc2l6ZXJTaG91bGROb3RpZnk6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCl9vbkRlc2NlbmRhbnRJcm9uUmVzaXplOmZ1bmN0aW9uKGEpe3RoaXMuX25vdGlmeWluZ0Rlc2NlbmRhbnQ/YS5zdG9wUHJvcGFnYXRpb24oKTpQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvd3x8dGhpcy5fZmlyZVJlc2l6ZSgpfSxfZmlyZVJlc2l6ZTpmdW5jdGlvbigpe3RoaXMuZmlyZSgiaXJvbi1yZXNpemUiLG51bGwse25vZGU6dGhpcyxidWJibGVzOiExfSl9LF9vbklyb25SZXF1ZXN0UmVzaXplTm90aWZpY2F0aW9uczpmdW5jdGlvbihhKXt2YXIgYz1Qb2x5bWVyLmRvbShhKS5yb290VGFyZ2V0O2MhPT10aGlzJiYoLTE9PT10aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5pbmRleE9mKGMpJiYodGhpcy5faW50ZXJlc3RlZFJlc2l6YWJsZXMucHVzaChjKSx0aGlzLmxpc3RlbihjLCJpcm9uLXJlc2l6ZSIsIl9vbkRlc2NlbmRhbnRJcm9uUmVzaXplIikpLGMuYXNzaWduUGFyZW50UmVzaXphYmxlKHRoaXMpLHRoaXMuX25vdGlmeURlc2NlbmRhbnQoYyksYS5zdG9wUHJvcGFnYXRpb24oKSl9LApfcGFyZW50UmVzaXphYmxlQ2hhbmdlZDpmdW5jdGlvbihhKXthJiZ3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIix0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZSl9LF9ub3RpZnlEZXNjZW5kYW50OmZ1bmN0aW9uKGEpe3RoaXMuaXNBdHRhY2hlZCYmKHRoaXMuX25vdGlmeWluZ0Rlc2NlbmRhbnQ9ITAsYS5ub3RpZnlSZXNpemUoKSx0aGlzLl9ub3RpZnlpbmdEZXNjZW5kYW50PSExKX0sX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0F0dGFjaGVkKWlmKCJsb2FkaW5nIj09PWRvY3VtZW50LnJlYWR5U3RhdGUpe3ZhciBhPXRoaXMuX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zLmJpbmQodGhpcyk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsZnVuY3Rpb24gZCgpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGQpO2EoKX0pfWVsc2UgdGhpcy5maXJlKCJpcm9uLXJlcXVlc3QtcmVzaXplLW5vdGlmaWNhdGlvbnMiLApudWxsLHtub2RlOnRoaXMsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwfSksdGhpcy5fcGFyZW50UmVzaXphYmxlfHwod2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdGhpcy5fYm91bmROb3RpZnlSZXNpemUpLHRoaXMubm90aWZ5UmVzaXplKCkpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tb3ZlcmxheS1iYWNrZHJvcC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJpcm9uLW92ZXJsYXktYmFja2Ryb3AiLHByb3BlcnRpZXM6e29wZW5lZDp7cmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifX0sbGlzdGVuZXJzOnt0cmFuc2l0aW9uZW5kOiJfb25UcmFuc2l0aW9uZW5kIn0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX19vcGVuZWRSYWY9bnVsbH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5fb3BlbmVkQ2hhbmdlZCh0aGlzLm9wZW5lZCl9LHByZXBhcmU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmIXRoaXMucGFyZW50Tm9kZSYmUG9seW1lci5kb20oZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQodGhpcyl9LG9wZW46ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMH0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMX0sY29tcGxldGU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZHx8dGhpcy5wYXJlbnROb2RlIT09CmRvY3VtZW50LmJvZHl8fFBvbHltZXIuZG9tKHRoaXMucGFyZW50Tm9kZSkucmVtb3ZlQ2hpbGQodGhpcyl9LF9vblRyYW5zaXRpb25lbmQ6ZnVuY3Rpb24oYSl7YSYmYS50YXJnZXQ9PT10aGlzJiZ0aGlzLmNvbXBsZXRlKCl9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKGEpe2E/dGhpcy5wcmVwYXJlKCk6KGE9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcyksIjBzIiE9PWEudHJhbnNpdGlvbkR1cmF0aW9uJiYwIT1hLm9wYWNpdHl8fHRoaXMuY29tcGxldGUoKSk7dGhpcy5pc0F0dGFjaGVkJiYodGhpcy5fX29wZW5lZFJhZiYmKHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fb3BlbmVkUmFmKSx0aGlzLl9fb3BlbmVkUmFmPW51bGwpLHRoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wLHRoaXMuX19vcGVuZWRSYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3RoaXMuX19vcGVuZWRSYWY9bnVsbDt0aGlzLnRvZ2dsZUNsYXNzKCJvcGVuZWQiLAp0aGlzLm9wZW5lZCl9LmJpbmQodGhpcykpKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tb3ZlcmxheS1tYW5hZ2VyLmh0bWwuanMKUG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJDbGFzcz1mdW5jdGlvbigpe3RoaXMuX292ZXJsYXlzPVtdO3RoaXMuX21pbmltdW1aPTEwMTt0aGlzLl9iYWNrZHJvcEVsZW1lbnQ9bnVsbDtQb2x5bWVyLkdlc3R1cmVzLmFkZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsInRhcCIsZnVuY3Rpb24oKXt9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLHRoaXMuX29uQ2FwdHVyZUNsaWNrLmJpbmQodGhpcyksITApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9vbkNhcHR1cmVGb2N1cy5iaW5kKHRoaXMpLCEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLl9vbkNhcHR1cmVLZXlEb3duLmJpbmQodGhpcyksITApfTsKUG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJDbGFzcy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlBvbHltZXIuSXJvbk92ZXJsYXlNYW5hZ2VyQ2xhc3MsZ2V0IGJhY2tkcm9wRWxlbWVudCgpe3RoaXMuX2JhY2tkcm9wRWxlbWVudHx8KHRoaXMuX2JhY2tkcm9wRWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpcm9uLW92ZXJsYXktYmFja2Ryb3AiKSk7cmV0dXJuIHRoaXMuX2JhY2tkcm9wRWxlbWVudH0sZ2V0IGRlZXBBY3RpdmVFbGVtZW50KCl7dmFyIGE9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDthJiYhMSE9PWEgaW5zdGFuY2VvZiBFbGVtZW50fHwoYT1kb2N1bWVudC5ib2R5KTtmb3IoO2Eucm9vdCYmUG9seW1lci5kb20oYS5yb290KS5hY3RpdmVFbGVtZW50OylhPVBvbHltZXIuZG9tKGEucm9vdCkuYWN0aXZlRWxlbWVudDtyZXR1cm4gYX0sX2JyaW5nT3ZlcmxheUF0SW5kZXhUb0Zyb250OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX292ZXJsYXlzW2FdO2lmKGMpe3ZhciBkPQp0aGlzLl9vdmVybGF5cy5sZW5ndGgtMSxmPXRoaXMuX292ZXJsYXlzW2RdO2YmJnRoaXMuX3Nob3VsZEJlQmVoaW5kT3ZlcmxheShjLGYpJiZkLS07aWYoIShhPj1kKSl7Zj1NYXRoLm1heCh0aGlzLmN1cnJlbnRPdmVybGF5WigpLHRoaXMuX21pbmltdW1aKTtmb3IodGhpcy5fZ2V0WihjKTw9ZiYmdGhpcy5fYXBwbHlPdmVybGF5WihjLGYpO2E8ZDspdGhpcy5fb3ZlcmxheXNbYV09dGhpcy5fb3ZlcmxheXNbYSsxXSxhKys7dGhpcy5fb3ZlcmxheXNbZF09Y319fSxhZGRPclJlbW92ZU92ZXJsYXk6ZnVuY3Rpb24oYSl7YS5vcGVuZWQ/dGhpcy5hZGRPdmVybGF5KGEpOnRoaXMucmVtb3ZlT3ZlcmxheShhKX0sYWRkT3ZlcmxheTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9vdmVybGF5cy5pbmRleE9mKGEpO2lmKDA8PWMpdGhpcy5fYnJpbmdPdmVybGF5QXRJbmRleFRvRnJvbnQoYyk7ZWxzZXtjPXRoaXMuX292ZXJsYXlzLmxlbmd0aDt2YXIgZD10aGlzLl9vdmVybGF5c1tjLTFdLGY9Ck1hdGgubWF4KHRoaXMuX2dldFooZCksdGhpcy5fbWluaW11bVopLGc9dGhpcy5fZ2V0WihhKTtkJiZ0aGlzLl9zaG91bGRCZUJlaGluZE92ZXJsYXkoYSxkKSYmKHRoaXMuX2FwcGx5T3ZlcmxheVooZCxmKSxjLS0sZj1NYXRoLm1heCh0aGlzLl9nZXRaKHRoaXMuX292ZXJsYXlzW2MtMV0pLHRoaXMuX21pbmltdW1aKSk7Zzw9ZiYmdGhpcy5fYXBwbHlPdmVybGF5WihhLGYpO3RoaXMuX292ZXJsYXlzLnNwbGljZShjLDAsYSl9dGhpcy50cmFja0JhY2tkcm9wKCl9LHJlbW92ZU92ZXJsYXk6ZnVuY3Rpb24oYSl7YT10aGlzLl9vdmVybGF5cy5pbmRleE9mKGEpOy0xIT09YSYmKHRoaXMuX292ZXJsYXlzLnNwbGljZShhLDEpLHRoaXMudHJhY2tCYWNrZHJvcCgpKX0sY3VycmVudE92ZXJsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3ZlcmxheXNbdGhpcy5fb3ZlcmxheXMubGVuZ3RoLTFdfSxjdXJyZW50T3ZlcmxheVo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0Wih0aGlzLmN1cnJlbnRPdmVybGF5KCkpfSwKZW5zdXJlTWluaW11bVo6ZnVuY3Rpb24oYSl7dGhpcy5fbWluaW11bVo9TWF0aC5tYXgodGhpcy5fbWluaW11bVosYSl9LGZvY3VzT3ZlcmxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY3VycmVudE92ZXJsYXkoKTthJiZhLl9hcHBseUZvY3VzKCl9LHRyYWNrQmFja2Ryb3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9vdmVybGF5V2l0aEJhY2tkcm9wKCk7aWYoYXx8dGhpcy5fYmFja2Ryb3BFbGVtZW50KXRoaXMuYmFja2Ryb3BFbGVtZW50LnN0eWxlLnpJbmRleD10aGlzLl9nZXRaKGEpLTEsdGhpcy5iYWNrZHJvcEVsZW1lbnQub3BlbmVkPSEhYSx0aGlzLmJhY2tkcm9wRWxlbWVudC5wcmVwYXJlKCl9LGdldEJhY2tkcm9wczpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxjPTA7Yzx0aGlzLl9vdmVybGF5cy5sZW5ndGg7YysrKXRoaXMuX292ZXJsYXlzW2NdLndpdGhCYWNrZHJvcCYmYS5wdXNoKHRoaXMuX292ZXJsYXlzW2NdKTtyZXR1cm4gYX0sYmFja2Ryb3BaOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFoodGhpcy5fb3ZlcmxheVdpdGhCYWNrZHJvcCgpKS0KMX0sX292ZXJsYXlXaXRoQmFja2Ryb3A6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5fb3ZlcmxheXMubGVuZ3RoLTE7MDw9YTthLS0paWYodGhpcy5fb3ZlcmxheXNbYV0ud2l0aEJhY2tkcm9wKXJldHVybiB0aGlzLl9vdmVybGF5c1thXX0sX2dldFo6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fbWluaW11bVo7YSYmKGE9TnVtYmVyKGEuc3R5bGUuekluZGV4fHx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS56SW5kZXgpLGE9PT1hJiYoYz1hKSk7cmV0dXJuIGN9LF9zZXRaOmZ1bmN0aW9uKGEsYyl7YS5zdHlsZS56SW5kZXg9Y30sX2FwcGx5T3ZlcmxheVo6ZnVuY3Rpb24oYSxjKXt0aGlzLl9zZXRaKGEsYysyKX0sX292ZXJsYXlJblBhdGg6ZnVuY3Rpb24oYSl7YT1hfHxbXTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylpZihhW2NdLl9tYW5hZ2VyPT09dGhpcylyZXR1cm4gYVtjXX0sX29uQ2FwdHVyZUNsaWNrOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX292ZXJsYXlzLmxlbmd0aC0KMTtpZigtMSE9PWMpZm9yKHZhciBkPVBvbHltZXIuZG9tKGEpLnBhdGgsZjsoZj10aGlzLl9vdmVybGF5c1tjXSkmJnRoaXMuX292ZXJsYXlJblBhdGgoZCkhPT1mOylpZihmLl9vbkNhcHR1cmVDbGljayhhKSxmLmFsbG93Q2xpY2tUaHJvdWdoKWMtLTtlbHNlIGJyZWFrfSxfb25DYXB0dXJlRm9jdXM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jdXJyZW50T3ZlcmxheSgpO2MmJmMuX29uQ2FwdHVyZUZvY3VzKGEpfSxfb25DYXB0dXJlS2V5RG93bjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmN1cnJlbnRPdmVybGF5KCk7YyYmKFBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3Iua2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzKGEsImVzYyIpP2MuX29uQ2FwdHVyZUVzYyhhKTpQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhhLCJ0YWIiKSYmYy5fb25DYXB0dXJlVGFiKGEpKX0sX3Nob3VsZEJlQmVoaW5kT3ZlcmxheTpmdW5jdGlvbihhLGMpe3JldHVybiFhLmFsd2F5c09uVG9wJiYKYy5hbHdheXNPblRvcH19O1BvbHltZXIuSXJvbk92ZXJsYXlNYW5hZ2VyPW5ldyBQb2x5bWVyLklyb25PdmVybGF5TWFuYWdlckNsYXNzOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tb3ZlcmxheS1iZWhhdmlvci9pcm9uLXNjcm9sbC1tYW5hZ2VyLmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGE9MCxjPTAsZD1udWxsLGY9W10sZz1bIndoZWVsIiwibW91c2V3aGVlbCIsIkRPTU1vdXNlU2Nyb2xsIiwidG91Y2hzdGFydCIsInRvdWNobW92ZSJdO1BvbHltZXIuSXJvblNjcm9sbE1hbmFnZXI9e2dldCBjdXJyZW50TG9ja2luZ0VsZW1lbnQoKXtyZXR1cm4gdGhpcy5fbG9ja2luZ0VsZW1lbnRzW3RoaXMuX2xvY2tpbmdFbGVtZW50cy5sZW5ndGgtMV19LGVsZW1lbnRJc1Njcm9sbExvY2tlZDpmdW5jdGlvbihsKXt2YXIgaz10aGlzLmN1cnJlbnRMb2NraW5nRWxlbWVudDtpZih2b2lkIDA9PT1rKXJldHVybiExO2lmKHRoaXMuX2hhc0NhY2hlZExvY2tlZEVsZW1lbnQobCkpcmV0dXJuITA7aWYodGhpcy5faGFzQ2FjaGVkVW5sb2NrZWRFbGVtZW50KGwpKXJldHVybiExOyhrPSEhayYmayE9PWwmJiF0aGlzLl9jb21wb3NlZFRyZWVDb250YWlucyhrLGwpKT90aGlzLl9sb2NrZWRFbGVtZW50Q2FjaGUucHVzaChsKTp0aGlzLl91bmxvY2tlZEVsZW1lbnRDYWNoZS5wdXNoKGwpOwpyZXR1cm4ga30scHVzaFNjcm9sbExvY2s6ZnVuY3Rpb24obCl7MDw9dGhpcy5fbG9ja2luZ0VsZW1lbnRzLmluZGV4T2YobCl8fCgwPT09dGhpcy5fbG9ja2luZ0VsZW1lbnRzLmxlbmd0aCYmdGhpcy5fbG9ja1Njcm9sbEludGVyYWN0aW9ucygpLHRoaXMuX2xvY2tpbmdFbGVtZW50cy5wdXNoKGwpLHRoaXMuX2xvY2tlZEVsZW1lbnRDYWNoZT1bXSx0aGlzLl91bmxvY2tlZEVsZW1lbnRDYWNoZT1bXSl9LHJlbW92ZVNjcm9sbExvY2s6ZnVuY3Rpb24obCl7bD10aGlzLl9sb2NraW5nRWxlbWVudHMuaW5kZXhPZihsKTstMSE9PWwmJih0aGlzLl9sb2NraW5nRWxlbWVudHMuc3BsaWNlKGwsMSksdGhpcy5fbG9ja2VkRWxlbWVudENhY2hlPVtdLHRoaXMuX3VubG9ja2VkRWxlbWVudENhY2hlPVtdLDA9PT10aGlzLl9sb2NraW5nRWxlbWVudHMubGVuZ3RoJiZ0aGlzLl91bmxvY2tTY3JvbGxJbnRlcmFjdGlvbnMoKSl9LF9sb2NraW5nRWxlbWVudHM6W10sX2xvY2tlZEVsZW1lbnRDYWNoZTpudWxsLApfdW5sb2NrZWRFbGVtZW50Q2FjaGU6bnVsbCxfaGFzQ2FjaGVkTG9ja2VkRWxlbWVudDpmdW5jdGlvbihsKXtyZXR1cm4tMTx0aGlzLl9sb2NrZWRFbGVtZW50Q2FjaGUuaW5kZXhPZihsKX0sX2hhc0NhY2hlZFVubG9ja2VkRWxlbWVudDpmdW5jdGlvbihsKXtyZXR1cm4tMTx0aGlzLl91bmxvY2tlZEVsZW1lbnRDYWNoZS5pbmRleE9mKGwpfSxfY29tcG9zZWRUcmVlQ29udGFpbnM6ZnVuY3Rpb24obCxrKXt2YXIgbixwO2lmKGwuY29udGFpbnMoaykpcmV0dXJuITA7bD1Qb2x5bWVyLmRvbShsKS5xdWVyeVNlbGVjdG9yQWxsKCJjb250ZW50LHNsb3QiKTtmb3Iobj0wO248bC5sZW5ndGg7KytuKXt2YXIgcT1Qb2x5bWVyLmRvbShsW25dKS5nZXREaXN0cmlidXRlZE5vZGVzKCk7Zm9yKHA9MDtwPHEubGVuZ3RoOysrcClpZihxW3BdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJnRoaXMuX2NvbXBvc2VkVHJlZUNvbnRhaW5zKHFbcF0saykpcmV0dXJuITB9cmV0dXJuITF9LF9zY3JvbGxJbnRlcmFjdGlvbkhhbmRsZXI6ZnVuY3Rpb24obCl7bC5jYW5jZWxhYmxlJiYKdGhpcy5fc2hvdWxkUHJldmVudFNjcm9sbGluZyhsKSYmbC5wcmV2ZW50RGVmYXVsdCgpO2wudGFyZ2V0VG91Y2hlcyYmKGw9bC50YXJnZXRUb3VjaGVzWzBdLGE9bC5wYWdlWCxjPWwucGFnZVkpfSxfbG9ja1Njcm9sbEludGVyYWN0aW9uczpmdW5jdGlvbigpe3RoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcj10aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXJ8fHRoaXMuX3Njcm9sbEludGVyYWN0aW9uSGFuZGxlci5iaW5kKHRoaXMpO2Zvcih2YXIgbD0wLGs9Zy5sZW5ndGg7bDxrO2wrKylkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGdbbF0sdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITF9KX0sX3VubG9ja1Njcm9sbEludGVyYWN0aW9uczpmdW5jdGlvbigpe2Zvcih2YXIgbD0wLGs9Zy5sZW5ndGg7bDxrO2wrKylkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGdbbF0sdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITF9KX0sCl9zaG91bGRQcmV2ZW50U2Nyb2xsaW5nOmZ1bmN0aW9uKGwpe3ZhciBrPVBvbHltZXIuZG9tKGwpLnJvb3RUYXJnZXQ7InRvdWNobW92ZSIhPT1sLnR5cGUmJmQhPT1rJiYoZD1rLGY9dGhpcy5fZ2V0U2Nyb2xsYWJsZU5vZGVzKFBvbHltZXIuZG9tKGwpLnBhdGgpKTtpZighZi5sZW5ndGgpcmV0dXJuITA7aWYoInRvdWNoc3RhcnQiPT09bC50eXBlKXJldHVybiExO2w9dGhpcy5fZ2V0U2Nyb2xsSW5mbyhsKTtyZXR1cm4hdGhpcy5fZ2V0U2Nyb2xsaW5nTm9kZShmLGwuZGVsdGFYLGwuZGVsdGFZKX0sX2dldFNjcm9sbGFibGVOb2RlczpmdW5jdGlvbihsKXtmb3IodmFyIGs9W10sbj1sLmluZGV4T2YodGhpcy5jdXJyZW50TG9ja2luZ0VsZW1lbnQpLHA9MDtwPD1uO3ArKylpZihsW3BdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe3ZhciBxPWxbcF0scj1xLnN0eWxlOyJzY3JvbGwiIT09ci5vdmVyZmxvdyYmImF1dG8iIT09ci5vdmVyZmxvdyYmKHI9d2luZG93LmdldENvbXB1dGVkU3R5bGUocSkpOwoic2Nyb2xsIiE9PXIub3ZlcmZsb3cmJiJhdXRvIiE9PXIub3ZlcmZsb3d8fGsucHVzaChxKX1yZXR1cm4ga30sX2dldFNjcm9sbGluZ05vZGU6ZnVuY3Rpb24obCxrLG4pe2lmKGt8fG4pZm9yKHZhciBwPU1hdGguYWJzKG4pPj1NYXRoLmFicyhrKSxxPTA7cTxsLmxlbmd0aDtxKyspe3ZhciByPWxbcV07aWYocD8wPm4/MDxyLnNjcm9sbFRvcDpyLnNjcm9sbFRvcDxyLnNjcm9sbEhlaWdodC1yLmNsaWVudEhlaWdodDowPms/MDxyLnNjcm9sbExlZnQ6ci5zY3JvbGxMZWZ0PHIuc2Nyb2xsV2lkdGgtci5jbGllbnRXaWR0aClyZXR1cm4gcn19LF9nZXRTY3JvbGxJbmZvOmZ1bmN0aW9uKGwpe3ZhciBrPXtkZWx0YVg6bC5kZWx0YVgsZGVsdGFZOmwuZGVsdGFZfTsiZGVsdGFYImluIGx8fCgid2hlZWxEZWx0YVgiaW4gbCYmIndoZWVsRGVsdGFZImluIGw/KGsuZGVsdGFYPS1sLndoZWVsRGVsdGFYLGsuZGVsdGFZPS1sLndoZWVsRGVsdGFZKToid2hlZWxEZWx0YSJpbiBsPyhrLmRlbHRhWD0KMCxrLmRlbHRhWT0tbC53aGVlbERlbHRhKToiYXhpcyJpbiBsPyhrLmRlbHRhWD0xPT09bC5heGlzP2wuZGV0YWlsOjAsay5kZWx0YVk9Mj09PWwuYXhpcz9sLmRldGFpbDowKTpsLnRhcmdldFRvdWNoZXMmJihsPWwudGFyZ2V0VG91Y2hlc1swXSxrLmRlbHRhWD1hLWwucGFnZVgsay5kZWx0YVk9Yy1sLnBhZ2VZKSk7cmV0dXJuIGt9fX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tZm9jdXNhYmxlcy1oZWxwZXIuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYT1FbGVtZW50LnByb3RvdHlwZSxjPWEubWF0Y2hlc3x8YS5tYXRjaGVzU2VsZWN0b3J8fGEubW96TWF0Y2hlc1NlbGVjdG9yfHxhLm1zTWF0Y2hlc1NlbGVjdG9yfHxhLm9NYXRjaGVzU2VsZWN0b3J8fGEud2Via2l0TWF0Y2hlc1NlbGVjdG9yO1BvbHltZXIuSXJvbkZvY3VzYWJsZXNIZWxwZXI9e2dldFRhYmJhYmxlTm9kZXM6ZnVuY3Rpb24oZCl7dmFyIGY9W107cmV0dXJuIHRoaXMuX2NvbGxlY3RUYWJiYWJsZU5vZGVzKGQsZik/dGhpcy5fc29ydEJ5VGFiSW5kZXgoZik6Zn0saXNGb2N1c2FibGU6ZnVuY3Rpb24oZCl7cmV0dXJuIGMuY2FsbChkLCJpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYnV0dG9uLCBvYmplY3QiKT9jLmNhbGwoZCwiOm5vdChbZGlzYWJsZWRdKSIpOmMuY2FsbChkLCJhW2hyZWZdLCBhcmVhW2hyZWZdLCBpZnJhbWUsIFt0YWJpbmRleF0sIFtjb250ZW50RWRpdGFibGVdIil9LGlzVGFiYmFibGU6ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMuaXNGb2N1c2FibGUoZCkmJgpjLmNhbGwoZCwnOm5vdChbdGFiaW5kZXhceDNkIi0xIl0pJykmJnRoaXMuX2lzVmlzaWJsZShkKX0sX25vcm1hbGl6ZWRUYWJJbmRleDpmdW5jdGlvbihkKXtyZXR1cm4gdGhpcy5pc0ZvY3VzYWJsZShkKT8oZD1kLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKXx8MCxOdW1iZXIoZCkpOi0xfSxfY29sbGVjdFRhYmJhYmxlTm9kZXM6ZnVuY3Rpb24oZCxmKXtpZihkLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREV8fCF0aGlzLl9pc1Zpc2libGUoZCkpcmV0dXJuITE7dmFyIGc9dGhpcy5fbm9ybWFsaXplZFRhYkluZGV4KGQpLGw9MDxnOzA8PWcmJmYucHVzaChkKTtkPSJjb250ZW50Ij09PWQubG9jYWxOYW1lfHwic2xvdCI9PT1kLmxvY2FsTmFtZT9Qb2x5bWVyLmRvbShkKS5nZXREaXN0cmlidXRlZE5vZGVzKCk6UG9seW1lci5kb20oZC5yb290fHxkKS5jaGlsZHJlbjtmb3IoZz0wO2c8ZC5sZW5ndGg7ZysrKWw9dGhpcy5fY29sbGVjdFRhYmJhYmxlTm9kZXMoZFtnXSxmKXx8bDsKcmV0dXJuIGx9LF9pc1Zpc2libGU6ZnVuY3Rpb24oZCl7dmFyIGY9ZC5zdHlsZTtyZXR1cm4iaGlkZGVuIiE9PWYudmlzaWJpbGl0eSYmIm5vbmUiIT09Zi5kaXNwbGF5PyhmPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGQpLCJoaWRkZW4iIT09Zi52aXNpYmlsaXR5JiYibm9uZSIhPT1mLmRpc3BsYXkpOiExfSxfc29ydEJ5VGFiSW5kZXg6ZnVuY3Rpb24oZCl7dmFyIGY9ZC5sZW5ndGg7aWYoMj5mKXJldHVybiBkO3ZhciBnPU1hdGguY2VpbChmLzIpO2Y9dGhpcy5fc29ydEJ5VGFiSW5kZXgoZC5zbGljZSgwLGcpKTtkPXRoaXMuX3NvcnRCeVRhYkluZGV4KGQuc2xpY2UoZykpO3JldHVybiB0aGlzLl9tZXJnZVNvcnRCeVRhYkluZGV4KGYsZCl9LF9tZXJnZVNvcnRCeVRhYkluZGV4OmZ1bmN0aW9uKGQsZil7Zm9yKHZhciBnPVtdOzA8ZC5sZW5ndGgmJjA8Zi5sZW5ndGg7KXRoaXMuX2hhc0xvd2VyVGFiT3JkZXIoZFswXSxmWzBdKT9nLnB1c2goZi5zaGlmdCgpKTpnLnB1c2goZC5zaGlmdCgpKTsKcmV0dXJuIGcuY29uY2F0KGQsZil9LF9oYXNMb3dlclRhYk9yZGVyOmZ1bmN0aW9uKGQsZil7ZD1NYXRoLm1heChkLnRhYkluZGV4LDApO2Y9TWF0aC5tYXgoZi50YWJJbmRleCwwKTtyZXR1cm4gMD09PWR8fDA9PT1mP2Y+ZDpkPmZ9fX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tb3ZlcmxheS1iZWhhdmlvci5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGw9e3Byb3BlcnRpZXM6e29wZW5lZDp7b2JzZXJ2ZXI6Il9vcGVuZWRDaGFuZ2VkIix0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxjYW5jZWxlZDp7b2JzZXJ2ZXI6Il9jYW5jZWxlZENoYW5nZWQiLHJlYWRPbmx5OiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMX0sd2l0aEJhY2tkcm9wOntvYnNlcnZlcjoiX3dpdGhCYWNrZHJvcENoYW5nZWQiLHR5cGU6Qm9vbGVhbn0sbm9BdXRvRm9jdXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sbm9DYW5jZWxPbkVzY0tleTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0NhbmNlbE9uT3V0c2lkZUNsaWNrOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGNsb3NpbmdSZWFzb246e3R5cGU6T2JqZWN0fSxyZXN0b3JlRm9jdXNPbkNsb3NlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGFsbG93Q2xpY2tUaHJvdWdoOnt0eXBlOkJvb2xlYW59LGFsd2F5c09uVG9wOnt0eXBlOkJvb2xlYW59LApzY3JvbGxBY3Rpb246e3R5cGU6U3RyaW5nfSxfbWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6UG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJ9LF9mb2N1c2VkQ2hpbGQ6e3R5cGU6T2JqZWN0fX0sbGlzdGVuZXJzOnsiaXJvbi1yZXNpemUiOiJfb25Jcm9uUmVzaXplIn0sb2JzZXJ2ZXJzOlsiX191cGRhdGVTY3JvbGxPYnNlcnZlcnMoaXNBdHRhY2hlZCwgb3BlbmVkLCBzY3JvbGxBY3Rpb24pIl0sZ2V0IGJhY2tkcm9wRWxlbWVudCgpe3JldHVybiB0aGlzLl9tYW5hZ2VyLmJhY2tkcm9wRWxlbWVudH0sZ2V0IF9mb2N1c05vZGUoKXtyZXR1cm4gdGhpcy5fZm9jdXNlZENoaWxkfHxQb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yKCJbYXV0b2ZvY3VzXSIpfHx0aGlzfSxnZXQgX2ZvY3VzYWJsZU5vZGVzKCl7cmV0dXJuIFBvbHltZXIuSXJvbkZvY3VzYWJsZXNIZWxwZXIuZ2V0VGFiYmFibGVOb2Rlcyh0aGlzKX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9fc2hvdWxkUmVtb3ZlVGFiSW5kZXg9CnRoaXMuX19pc0FuaW1hdGluZz0hMTt0aGlzLl9fZmlyc3RGb2N1c2FibGVOb2RlPXRoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZT1udWxsO3RoaXMuX19yYWZzPXt9O3RoaXMuX19zY3JvbGxUb3A9dGhpcy5fX3Njcm9sbExlZnQ9dGhpcy5fX3Jlc3RvcmVGb2N1c05vZGU9bnVsbDt0aGlzLl9fb25DYXB0dXJlU2Nyb2xsPXRoaXMuX19vbkNhcHR1cmVTY3JvbGwuYmluZCh0aGlzKTt0aGlzLl9fcm9vdE5vZGVzPW51bGw7dGhpcy5fZW5zdXJlU2V0dXAoKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5fb3BlbmVkQ2hhbmdlZCh0aGlzLm9wZW5lZCk7dGhpcy5fb2JzZXJ2ZXI9UG9seW1lci5kb20odGhpcykub2JzZXJ2ZU5vZGVzKHRoaXMuX29uTm9kZXNDaGFuZ2UpfSxkZXRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuZG9tKHRoaXMpLnVub2JzZXJ2ZU5vZGVzKHRoaXMuX29ic2VydmVyKTt0aGlzLl9vYnNlcnZlcj1udWxsO2Zvcih2YXIgYSBpbiB0aGlzLl9fcmFmcyludWxsIT09CnRoaXMuX19yYWZzW2FdJiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fcmFmc1thXSk7dGhpcy5fX3JhZnM9e307dGhpcy5fbWFuYWdlci5yZW1vdmVPdmVybGF5KHRoaXMpO3RoaXMuX19pc0FuaW1hdGluZyYmKHRoaXMub3BlbmVkP3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOih0aGlzLl9hcHBseUZvY3VzKCksdGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCkpKX0sdG9nZ2xlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Q2FuY2VsZWQoITEpO3RoaXMub3BlbmVkPSF0aGlzLm9wZW5lZH0sb3BlbjpmdW5jdGlvbigpe3RoaXMuX3NldENhbmNlbGVkKCExKTt0aGlzLm9wZW5lZD0hMH0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLl9zZXRDYW5jZWxlZCghMSk7dGhpcy5vcGVuZWQ9ITF9LGNhbmNlbDpmdW5jdGlvbihhKXt0aGlzLmZpcmUoImlyb24tb3ZlcmxheS1jYW5jZWxlZCIsYSx7Y2FuY2VsYWJsZTohMH0pLmRlZmF1bHRQcmV2ZW50ZWR8fCh0aGlzLl9zZXRDYW5jZWxlZCghMCksdGhpcy5vcGVuZWQ9CiExKX0saW52YWxpZGF0ZVRhYmJhYmxlczpmdW5jdGlvbigpe3RoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU9dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlPW51bGx9LF9lbnN1cmVTZXR1cDpmdW5jdGlvbigpe3RoaXMuX292ZXJsYXlTZXR1cHx8KHRoaXMuX292ZXJsYXlTZXR1cD0hMCx0aGlzLnN0eWxlLm91dGxpbmU9Im5vbmUiLHRoaXMuc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbihhKXthP3RoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpOnRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsInRydWUiKTt0aGlzLmlzQXR0YWNoZWQmJih0aGlzLl9faXNBbmltYXRpbmc9ITAsdGhpcy5fX2RlcmFmKCJfX29wZW5lZENoYW5nZWQiLHRoaXMuX19vcGVuZWRDaGFuZ2VkKSl9LF9jYW5jZWxlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmNsb3NpbmdSZWFzb249dGhpcy5jbG9zaW5nUmVhc29ufHx7fTt0aGlzLmNsb3NpbmdSZWFzb24uY2FuY2VsZWQ9CnRoaXMuY2FuY2VsZWR9LF93aXRoQmFja2Ryb3BDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy53aXRoQmFja2Ryb3AmJiF0aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKT8odGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKSx0aGlzLl9fc2hvdWxkUmVtb3ZlVGFiSW5kZXg9ITApOnRoaXMuX19zaG91bGRSZW1vdmVUYWJJbmRleCYmKHRoaXMucmVtb3ZlQXR0cmlidXRlKCJ0YWJpbmRleCIpLHRoaXMuX19zaG91bGRSZW1vdmVUYWJJbmRleD0hMSk7dGhpcy5vcGVuZWQmJnRoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbWFuYWdlci50cmFja0JhY2tkcm9wKCl9LF9wcmVwYXJlUmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5fX3Jlc3RvcmVGb2N1c05vZGU9dGhpcy5fbWFuYWdlci5kZWVwQWN0aXZlRWxlbWVudDt0aGlzLl9wcmVwYXJlUG9zaXRpb25pbmcoKTt0aGlzLnJlZml0KCk7dGhpcy5fZmluaXNoUG9zaXRpb25pbmcoKTt0aGlzLm5vQXV0b0ZvY3VzJiZkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09CnRoaXMuX2ZvY3VzTm9kZSYmKHRoaXMuX2ZvY3VzTm9kZS5ibHVyKCksdGhpcy5fX3Jlc3RvcmVGb2N1c05vZGUuZm9jdXMoKSl9LF9yZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLl9maW5pc2hSZW5kZXJPcGVuZWQoKX0sX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpe3RoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpfSxfZmluaXNoUmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5ub3RpZnlSZXNpemUoKTt0aGlzLl9faXNBbmltYXRpbmc9ITE7dGhpcy5maXJlKCJpcm9uLW92ZXJsYXktb3BlbmVkIil9LF9maW5pc2hSZW5kZXJDbG9zZWQ6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuc3R5bGUuekluZGV4PSIiO3RoaXMubm90aWZ5UmVzaXplKCk7dGhpcy5fX2lzQW5pbWF0aW5nPSExO3RoaXMuZmlyZSgiaXJvbi1vdmVybGF5LWNsb3NlZCIsdGhpcy5jbG9zaW5nUmVhc29uKX0sX3ByZXBhcmVQb3NpdGlvbmluZzpmdW5jdGlvbigpe3RoaXMuc3R5bGUudHJhbnNpdGlvbj0KdGhpcy5zdHlsZS53ZWJraXRUcmFuc2l0aW9uPSJub25lIjt0aGlzLnN0eWxlLnRyYW5zZm9ybT10aGlzLnN0eWxlLndlYmtpdFRyYW5zZm9ybT0ibm9uZSI7dGhpcy5zdHlsZS5kaXNwbGF5PSIifSxfZmluaXNoUG9zaXRpb25pbmc6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wO3RoaXMuc3R5bGUudHJhbnNpdGlvbj10aGlzLnN0eWxlLndlYmtpdFRyYW5zaXRpb249IiI7dGhpcy5zdHlsZS50cmFuc2Zvcm09dGhpcy5zdHlsZS53ZWJraXRUcmFuc2Zvcm09IiI7dGhpcy5zdHlsZS5kaXNwbGF5PSIiO3RoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wfSxfYXBwbHlGb2N1czpmdW5jdGlvbigpe2lmKHRoaXMub3BlbmVkKXRoaXMubm9BdXRvRm9jdXN8fHRoaXMuX2ZvY3VzTm9kZS5mb2N1cygpO2Vsc2V7dGhpcy5fZm9jdXNOb2RlLmJsdXIoKTt0aGlzLl9mb2N1c2VkQ2hpbGQ9bnVsbDtpZih0aGlzLnJlc3RvcmVGb2N1c09uQ2xvc2UmJgp0aGlzLl9fcmVzdG9yZUZvY3VzTm9kZSl7dmFyIGE9dGhpcy5fbWFuYWdlci5kZWVwQWN0aXZlRWxlbWVudDsoYT09PWRvY3VtZW50LmJvZHl8fFBvbHltZXIuZG9tKHRoaXMpLmRlZXBDb250YWlucyhhKSkmJnRoaXMuX19yZXN0b3JlRm9jdXNOb2RlLmZvY3VzKCl9dGhpcy5fX3Jlc3RvcmVGb2N1c05vZGU9bnVsbDsoYT10aGlzLl9tYW5hZ2VyLmN1cnJlbnRPdmVybGF5KCkpJiZ0aGlzIT09YSYmYS5fYXBwbHlGb2N1cygpfX0sX29uQ2FwdHVyZUNsaWNrOmZ1bmN0aW9uKGEpe3RoaXMubm9DYW5jZWxPbk91dHNpZGVDbGlja3x8dGhpcy5jYW5jZWwoYSl9LF9vbkNhcHR1cmVGb2N1czpmdW5jdGlvbihhKXtpZih0aGlzLndpdGhCYWNrZHJvcCl7dmFyIGM9UG9seW1lci5kb20oYSkucGF0aDstMT09PWMuaW5kZXhPZih0aGlzKT8oYS5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLl9hcHBseUZvY3VzKCkpOnRoaXMuX2ZvY3VzZWRDaGlsZD1jWzBdfX0sX29uQ2FwdHVyZUVzYzpmdW5jdGlvbihhKXt0aGlzLm5vQ2FuY2VsT25Fc2NLZXl8fAp0aGlzLmNhbmNlbChhKX0sX29uQ2FwdHVyZVRhYjpmdW5jdGlvbihhKXtpZih0aGlzLndpdGhCYWNrZHJvcCl7dGhpcy5fX2Vuc3VyZUZpcnN0TGFzdEZvY3VzYWJsZXMoKTt2YXIgYz1hLnNoaWZ0S2V5LGQ9Yz90aGlzLl9fZmlyc3RGb2N1c2FibGVOb2RlOnRoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZTtjPWM/dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlOnRoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU7aWYoZD09PWMpZD0hMDtlbHNle3ZhciBmPXRoaXMuX21hbmFnZXIuZGVlcEFjdGl2ZUVsZW1lbnQ7ZD1mPT09ZHx8Zj09PXRoaXN9ZCYmKGEucHJldmVudERlZmF1bHQoKSx0aGlzLl9mb2N1c2VkQ2hpbGQ9Yyx0aGlzLl9hcHBseUZvY3VzKCkpfX0sX29uSXJvblJlc2l6ZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkJiYhdGhpcy5fX2lzQW5pbWF0aW5nJiZ0aGlzLl9fZGVyYWYoInJlZml0Iix0aGlzLnJlZml0KX0sX29uTm9kZXNDaGFuZ2U6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmIXRoaXMuX19pc0FuaW1hdGluZyYmCih0aGlzLmludmFsaWRhdGVUYWJiYWJsZXMoKSx0aGlzLm5vdGlmeVJlc2l6ZSgpKX0sX19lbnN1cmVGaXJzdExhc3RGb2N1c2FibGVzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19maXJzdEZvY3VzYWJsZU5vZGV8fCF0aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGUpe3ZhciBhPXRoaXMuX2ZvY3VzYWJsZU5vZGVzO3RoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU9YVswXTt0aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGU9YVthLmxlbmd0aC0xXX19LF9fb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMub3BlbmVkPyh0aGlzLl9wcmVwYXJlUmVuZGVyT3BlbmVkKCksdGhpcy5fbWFuYWdlci5hZGRPdmVybGF5KHRoaXMpLHRoaXMuX2FwcGx5Rm9jdXMoKSx0aGlzLl9yZW5kZXJPcGVuZWQoKSk6KHRoaXMuX21hbmFnZXIucmVtb3ZlT3ZlcmxheSh0aGlzKSx0aGlzLl9hcHBseUZvY3VzKCksdGhpcy5fcmVuZGVyQ2xvc2VkKCkpfSxfX2RlcmFmOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9dGhpcy5fX3JhZnM7Cm51bGwhPT1kW2FdJiZjYW5jZWxBbmltYXRpb25GcmFtZShkW2FdKTtkW2FdPXJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2RbYV09bnVsbDtjLmNhbGwodGhpcyl9LmJpbmQodGhpcykpfSxfX3VwZGF0ZVNjcm9sbE9ic2VydmVyczpmdW5jdGlvbihhLGMsZCl7YSYmYyYmdGhpcy5fX2lzVmFsaWRTY3JvbGxBY3Rpb24oZCk/KCJsb2NrIj09PWQmJih0aGlzLl9fc2F2ZVNjcm9sbFBvc2l0aW9uKCksUG9seW1lci5Jcm9uU2Nyb2xsTWFuYWdlci5wdXNoU2Nyb2xsTG9jayh0aGlzKSksdGhpcy5fX2FkZFNjcm9sbExpc3RlbmVycygpKTooUG9seW1lci5Jcm9uU2Nyb2xsTWFuYWdlci5yZW1vdmVTY3JvbGxMb2NrKHRoaXMpLHRoaXMuX19yZW1vdmVTY3JvbGxMaXN0ZW5lcnMoKSl9LF9fYWRkU2Nyb2xsTGlzdGVuZXJzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19yb290Tm9kZXMpe3RoaXMuX19yb290Tm9kZXM9W107aWYoUG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cpZm9yKHZhciBhPQp0aGlzO2E7KWEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJmEuaG9zdCYmdGhpcy5fX3Jvb3ROb2Rlcy5wdXNoKGEpLGE9YS5ob3N0fHxhLmFzc2lnbmVkU2xvdHx8YS5wYXJlbnROb2RlO3RoaXMuX19yb290Tm9kZXMucHVzaChkb2N1bWVudCl9dGhpcy5fX3Jvb3ROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGMpe2MuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9fb25DYXB0dXJlU2Nyb2xsLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITB9KX0sdGhpcyl9LF9fcmVtb3ZlU2Nyb2xsTGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fX3Jvb3ROb2RlcyYmdGhpcy5fX3Jvb3ROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9fb25DYXB0dXJlU2Nyb2xsLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITB9KX0sdGhpcyk7dGhpcy5pc0F0dGFjaGVkfHwodGhpcy5fX3Jvb3ROb2Rlcz1udWxsKX0sX19pc1ZhbGlkU2Nyb2xsQWN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiJsb2NrIj09PQphfHwicmVmaXQiPT09YXx8ImNhbmNlbCI9PT1hfSxfX29uQ2FwdHVyZVNjcm9sbDpmdW5jdGlvbihhKXtpZighKHRoaXMuX19pc0FuaW1hdGluZ3x8MDw9UG9seW1lci5kb20oYSkucGF0aC5pbmRleE9mKHRoaXMpKSlzd2l0Y2godGhpcy5zY3JvbGxBY3Rpb24pe2Nhc2UgImxvY2siOnRoaXMuX19yZXN0b3JlU2Nyb2xsUG9zaXRpb24oKTticmVhaztjYXNlICJyZWZpdCI6dGhpcy5fX2RlcmFmKCJyZWZpdCIsdGhpcy5yZWZpdCk7YnJlYWs7Y2FzZSAiY2FuY2VsIjp0aGlzLmNhbmNlbChhKX19LF9fc2F2ZVNjcm9sbFBvc2l0aW9uOmZ1bmN0aW9uKCl7ZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudD8odGhpcy5fX3Njcm9sbFRvcD1kb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbFRvcCx0aGlzLl9fc2Nyb2xsTGVmdD1kb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbExlZnQpOih0aGlzLl9fc2Nyb2xsVG9wPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AsCmRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wKSx0aGlzLl9fc2Nyb2xsTGVmdD1NYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCxkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQpKX0sX19yZXN0b3JlU2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXtkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50Pyhkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbFRvcD10aGlzLl9fc2Nyb2xsVG9wLGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsTGVmdD10aGlzLl9fc2Nyb2xsTGVmdCk6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A9ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A9dGhpcy5fX3Njcm9sbFRvcCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdD1kb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ9dGhpcy5fX3Njcm9sbExlZnQpfX07UG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9yPVtQb2x5bWVyLklyb25GaXRCZWhhdmlvcixQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvciwKUG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9ySW1wbF19KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL25lb24tYW5pbWF0aW9uL25lb24tYW5pbWF0YWJsZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuTmVvbkFuaW1hdGFibGVCZWhhdmlvcj17cHJvcGVydGllczp7YW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdH0sZW50cnlBbmltYXRpb246e29ic2VydmVyOiJfZW50cnlBbmltYXRpb25DaGFuZ2VkIix0eXBlOlN0cmluZ30sZXhpdEFuaW1hdGlvbjp7b2JzZXJ2ZXI6Il9leGl0QW5pbWF0aW9uQ2hhbmdlZCIsdHlwZTpTdHJpbmd9fSxfZW50cnlBbmltYXRpb25DaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5hbmltYXRpb25Db25maWc9dGhpcy5hbmltYXRpb25Db25maWd8fHt9O3RoaXMuYW5pbWF0aW9uQ29uZmlnLmVudHJ5PVt7bmFtZTp0aGlzLmVudHJ5QW5pbWF0aW9uLG5vZGU6dGhpc31dfSxfZXhpdEFuaW1hdGlvbkNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmFuaW1hdGlvbkNvbmZpZz10aGlzLmFuaW1hdGlvbkNvbmZpZ3x8e307dGhpcy5hbmltYXRpb25Db25maWcuZXhpdD1be25hbWU6dGhpcy5leGl0QW5pbWF0aW9uLG5vZGU6dGhpc31dfSxfY29weVByb3BlcnRpZXM6ZnVuY3Rpb24oYSwKYyl7Zm9yKHZhciBkIGluIGMpYVtkXT1jW2RdfSxfY2xvbmVDb25maWc6ZnVuY3Rpb24oYSl7dmFyIGM9e2lzQ2xvbmU6ITB9O3RoaXMuX2NvcHlQcm9wZXJ0aWVzKGMsYSk7cmV0dXJuIGN9LF9nZXRBbmltYXRpb25Db25maWdSZWN1cnNpdmU6ZnVuY3Rpb24oYSxjLGQpe2lmKHRoaXMuYW5pbWF0aW9uQ29uZmlnKWlmKHRoaXMuYW5pbWF0aW9uQ29uZmlnLnZhbHVlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuYW5pbWF0aW9uQ29uZmlnLnZhbHVlKXRoaXMuX3dhcm4odGhpcy5fbG9nZigicGxheUFuaW1hdGlvbiIsIlBsZWFzZSBwdXQgJ2FuaW1hdGlvbkNvbmZpZycgaW5zaWRlIG9mIHlvdXIgY29tcG9uZW50cyAncHJvcGVydGllcycgb2JqZWN0IGluc3RlYWQgb2Ygb3V0c2lkZSBvZiBpdC4iKSk7ZWxzZXt2YXIgZj1hP3RoaXMuYW5pbWF0aW9uQ29uZmlnW2FdOnRoaXMuYW5pbWF0aW9uQ29uZmlnO0FycmF5LmlzQXJyYXkoZil8fChmPVtmXSk7aWYoZilmb3IodmFyIGcsbD0wO2c9CmZbbF07bCsrKWlmKGcuYW5pbWF0YWJsZSlnLmFuaW1hdGFibGUuX2dldEFuaW1hdGlvbkNvbmZpZ1JlY3Vyc2l2ZShnLnR5cGV8fGEsYyxkKTtlbHNlIGlmKGcuaWQpe3ZhciBrPWNbZy5pZF07az8oay5pc0Nsb25lfHwoY1tnLmlkXT10aGlzLl9jbG9uZUNvbmZpZyhrKSxrPWNbZy5pZF0pLHRoaXMuX2NvcHlQcm9wZXJ0aWVzKGssZykpOmNbZy5pZF09Z31lbHNlIGQucHVzaChnKX19LGdldEFuaW1hdGlvbkNvbmZpZzpmdW5jdGlvbihhKXt2YXIgYz17fSxkPVtdO3RoaXMuX2dldEFuaW1hdGlvbkNvbmZpZ1JlY3Vyc2l2ZShhLGMsZCk7Zm9yKHZhciBmIGluIGMpZC5wdXNoKGNbZl0pO3JldHVybiBkfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vbmVvbi1hbmltYXRpb24vbmVvbi1hbmltYXRpb24tcnVubmVyLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5OZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3JJbXBsPXtfY29uZmlndXJlQW5pbWF0aW9uczpmdW5jdGlvbihhKXt2YXIgYz1bXSxkPVtdO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBmLGc9MDtmPWFbZ107ZysrKXt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGYubmFtZSk7aWYobC5pc05lb25BbmltYXRpb24pe3ZhciBrPW51bGw7bC5jb25maWd1cmV8fChsLmNvbmZpZ3VyZT1mdW5jdGlvbigpe3JldHVybiBudWxsfSk7az1sLmNvbmZpZ3VyZShmKTtkLnB1c2goe3Jlc3VsdDprLGNvbmZpZzpmfSl9ZWxzZSBjb25zb2xlLndhcm4odGhpcy5pcysiOiIsZi5uYW1lLCJub3QgZm91bmQhIil9Zm9yKGE9MDthPGQubGVuZ3RoO2ErKyl7az1kW2FdLnJlc3VsdDtmPWRbYV0uY29uZmlnO3RyeXsiZnVuY3Rpb24iIT10eXBlb2Ygay5jYW5jZWwmJihrPWRvY3VtZW50LnRpbWVsaW5lLnBsYXkoaykpfWNhdGNoKG4pe2s9bnVsbCxjb25zb2xlLndhcm4oIkNvdWxkbnQgcGxheSIsCiIoIixmLm5hbWUsIikuIixuKX1rJiZjLnB1c2goe25lb25BbmltYXRpb246bCxjb25maWc6ZixhbmltYXRpb246a30pfXJldHVybiBjfSxfc2hvdWxkQ29tcGxldGU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPSEwLGQ9MDtkPGEubGVuZ3RoO2QrKylpZigiZmluaXNoZWQiIT1hW2RdLmFuaW1hdGlvbi5wbGF5U3RhdGUpe2M9ITE7YnJlYWt9cmV0dXJuIGN9LF9jb21wbGV0ZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylhW2NdLm5lb25BbmltYXRpb24uY29tcGxldGUoYVtjXS5jb25maWcpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYVtjXS5hbmltYXRpb24uY2FuY2VsKCl9LHBsYXlBbmltYXRpb246ZnVuY3Rpb24oYSxjKXt2YXIgZD10aGlzLmdldEFuaW1hdGlvbkNvbmZpZyhhKTtpZihkKXt0aGlzLl9hY3RpdmU9dGhpcy5fYWN0aXZlfHx7fTt0aGlzLl9hY3RpdmVbYV0mJih0aGlzLl9jb21wbGV0ZSh0aGlzLl9hY3RpdmVbYV0pLGRlbGV0ZSB0aGlzLl9hY3RpdmVbYV0pOwp2YXIgZj10aGlzLl9jb25maWd1cmVBbmltYXRpb25zKGQpO2lmKDA9PWYubGVuZ3RoKXRoaXMuZmlyZSgibmVvbi1hbmltYXRpb24tZmluaXNoIixjLHtidWJibGVzOiExfSk7ZWxzZSBmb3IodGhpcy5fYWN0aXZlW2FdPWYsZD0wO2Q8Zi5sZW5ndGg7ZCsrKWZbZF0uYW5pbWF0aW9uLm9uZmluaXNoPWZ1bmN0aW9uKCl7dGhpcy5fc2hvdWxkQ29tcGxldGUoZikmJih0aGlzLl9jb21wbGV0ZShmKSxkZWxldGUgdGhpcy5fYWN0aXZlW2FdLHRoaXMuZmlyZSgibmVvbi1hbmltYXRpb24tZmluaXNoIixjLHtidWJibGVzOiExfSkpfS5iaW5kKHRoaXMpfX0sY2FuY2VsQW5pbWF0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIHRoaXMuX2FjdGl2ZSl7dmFyIGM9dGhpcy5fYWN0aXZlW2FdLGQ7Zm9yKGQgaW4gYyljW2RdLmFuaW1hdGlvbi5jYW5jZWwoKX10aGlzLl9hY3RpdmU9e319fTsKUG9seW1lci5OZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3I9W1BvbHltZXIuTmVvbkFuaW1hdGFibGVCZWhhdmlvcixQb2x5bWVyLk5lb25BbmltYXRpb25SdW5uZXJCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tZHJvcGRvd24vaXJvbi1kcm9wZG93bi1zY3JvbGwtbWFuYWdlci5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbkRyb3Bkb3duU2Nyb2xsTWFuYWdlcj1Qb2x5bWVyLklyb25TY3JvbGxNYW5hZ2VyfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWRyb3Bkb3duL2lyb24tZHJvcGRvd24uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoiaXJvbi1kcm9wZG93biIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcixQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3IsUG9seW1lci5OZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3JdLHByb3BlcnRpZXM6e2hvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sdmVydGljYWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6InRvcCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxvcGVuQW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdH0sY2xvc2VBbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0fSxmb2N1c1RhcmdldDp7dHlwZTpPYmplY3R9LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbGxvd091dHNpZGVTY3JvbGw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2FsbG93T3V0c2lkZVNjcm9sbENoYW5nZWQifX0sCmxpc3RlbmVyczp7Im5lb24tYW5pbWF0aW9uLWZpbmlzaCI6Il9vbk5lb25BbmltYXRpb25GaW5pc2gifSxvYnNlcnZlcnM6WyJfdXBkYXRlT3ZlcmxheVBvc2l0aW9uKHBvc2l0aW9uVGFyZ2V0LCB2ZXJ0aWNhbEFsaWduLCBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsT2Zmc2V0LCBob3Jpem9udGFsT2Zmc2V0KSJdLGdldCBjb250YWluZWRFbGVtZW50KCl7Zm9yKHZhciBhPVBvbHltZXIuZG9tKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCksYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKylpZihhW2NdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIGFbY119LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxBY3Rpb258fCh0aGlzLnNjcm9sbEFjdGlvbj10aGlzLmFsbG93T3V0c2lkZVNjcm9sbD8icmVmaXQiOiJsb2NrIik7dGhpcy5fcmVhZGllZD0hMH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnNpemluZ1RhcmdldCYmdGhpcy5zaXppbmdUYXJnZXQhPT0KdGhpc3x8KHRoaXMuc2l6aW5nVGFyZ2V0PXRoaXMuY29udGFpbmVkRWxlbWVudHx8dGhpcyl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxBbmltYXRpb24oKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5kaXNhYmxlZD90aGlzLmNhbmNlbCgpOih0aGlzLmNhbmNlbEFuaW1hdGlvbigpLHRoaXMuX3VwZGF0ZUFuaW1hdGlvbkNvbmZpZygpLFBvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX29wZW5lZENoYW5nZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sX3JlbmRlck9wZW5lZDpmdW5jdGlvbigpeyF0aGlzLm5vQW5pbWF0aW9ucyYmdGhpcy5hbmltYXRpb25Db25maWcub3Blbj8odGhpcy4kLmNvbnRlbnRXcmFwcGVyLmNsYXNzTGlzdC5hZGQoImFuaW1hdGluZyIpLHRoaXMucGxheUFuaW1hdGlvbigib3BlbiIpKTpQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JJbXBsLl9yZW5kZXJPcGVuZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSwKX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpeyF0aGlzLm5vQW5pbWF0aW9ucyYmdGhpcy5hbmltYXRpb25Db25maWcuY2xvc2U/KHRoaXMuJC5jb250ZW50V3JhcHBlci5jbGFzc0xpc3QuYWRkKCJhbmltYXRpbmciKSx0aGlzLnBsYXlBbmltYXRpb24oImNsb3NlIikpOlBvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX3JlbmRlckNsb3NlZC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9vbk5lb25BbmltYXRpb25GaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLiQuY29udGVudFdyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSgiYW5pbWF0aW5nIik7dGhpcy5vcGVuZWQ/dGhpcy5fZmluaXNoUmVuZGVyT3BlbmVkKCk6dGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCl9LF91cGRhdGVBbmltYXRpb25Db25maWc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5jb250YWluZWRFbGVtZW50LGM9W10uY29uY2F0KHRoaXMub3BlbkFuaW1hdGlvbkNvbmZpZ3x8W10pLmNvbmNhdCh0aGlzLmNsb3NlQW5pbWF0aW9uQ29uZmlnfHwKW10pLGQ9MDtkPGMubGVuZ3RoO2QrKyljW2RdLm5vZGU9YTt0aGlzLmFuaW1hdGlvbkNvbmZpZz17b3Blbjp0aGlzLm9wZW5BbmltYXRpb25Db25maWcsY2xvc2U6dGhpcy5jbG9zZUFuaW1hdGlvbkNvbmZpZ319LF91cGRhdGVPdmVybGF5UG9zaXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzQXR0YWNoZWQmJnRoaXMubm90aWZ5UmVzaXplKCl9LF9hbGxvd091dHNpZGVTY3JvbGxDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuX3JlYWRpZWQmJihhP3RoaXMuc2Nyb2xsQWN0aW9uJiYibG9jayIhPT10aGlzLnNjcm9sbEFjdGlvbnx8KHRoaXMuc2Nyb2xsQWN0aW9uPSJyZWZpdCIpOnRoaXMuc2Nyb2xsQWN0aW9uPSJsb2NrIil9LF9hcHBseUZvY3VzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5mb2N1c1RhcmdldHx8dGhpcy5jb250YWluZWRFbGVtZW50O2EmJnRoaXMub3BlbmVkJiYhdGhpcy5ub0F1dG9Gb2N1cz9hLmZvY3VzKCk6UG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9ySW1wbC5fYXBwbHlGb2N1cy5hcHBseSh0aGlzLAphcmd1bWVudHMpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9uZW9uLWFuaW1hdGlvbi9uZW9uLWFuaW1hdGlvbi1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthbmltYXRpb25UaW1pbmc6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue2R1cmF0aW9uOjUwMCxlYXNpbmc6ImN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSkiLGZpbGw6ImJvdGgifX19fSxpc05lb25BbmltYXRpb246ITAsY3JlYXRlZDpmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuYW5pbWF0ZXx8Y29uc29sZS53YXJuKCJObyB3ZWIgYW5pbWF0aW9ucyBkZXRlY3RlZC4gVGhpcyBlbGVtZW50IHdpbGwgbm90IGZ1bmN0aW9uIHdpdGhvdXQgYSB3ZWIgYW5pbWF0aW9ucyBwb2x5ZmlsbC4iKX0sdGltaW5nRnJvbUNvbmZpZzpmdW5jdGlvbihhKXtpZihhLnRpbWluZylmb3IodmFyIGMgaW4gYS50aW1pbmcpdGhpcy5hbmltYXRpb25UaW1pbmdbY109YS50aW1pbmdbY107cmV0dXJuIHRoaXMuYW5pbWF0aW9uVGltaW5nfSxzZXRQcmVmaXhlZFByb3BlcnR5OmZ1bmN0aW9uKGEsYyxkKXtmb3IodmFyIGY9Cnt0cmFuc2Zvcm06WyJ3ZWJraXRUcmFuc2Zvcm0iXSx0cmFuc2Zvcm1PcmlnaW46WyJtb3pUcmFuc2Zvcm1PcmlnaW4iLCJ3ZWJraXRUcmFuc2Zvcm1PcmlnaW4iXX1bY10sZyxsPTA7Zz1mW2xdO2wrKylhLnN0eWxlW2ddPWQ7YS5zdHlsZVtjXT1kfSxjb21wbGV0ZTpmdW5jdGlvbigpe319OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL25lb24tYW5pbWF0aW9uL2FuaW1hdGlvbnMvZmFkZS1pbi1hbmltYXRpb24uaHRtbC5qcwpQb2x5bWVyKHtpczoiZmFkZS1pbi1hbmltYXRpb24iLGJlaGF2aW9yczpbUG9seW1lci5OZW9uQW5pbWF0aW9uQmVoYXZpb3JdLGNvbmZpZ3VyZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChhLm5vZGUsW3tvcGFjaXR5OiIwIn0se29wYWNpdHk6IjEifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGEpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9uZW9uLWFuaW1hdGlvbi9hbmltYXRpb25zL2ZhZGUtb3V0LWFuaW1hdGlvbi5odG1sLmpzClBvbHltZXIoe2lzOiJmYWRlLW91dC1hbmltYXRpb24iLGJlaGF2aW9yczpbUG9seW1lci5OZW9uQW5pbWF0aW9uQmVoYXZpb3JdLGNvbmZpZ3VyZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChhLm5vZGUsW3tvcGFjaXR5OiIxIn0se29wYWNpdHk6IjAifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGEpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1tZW51LWJ1dHRvbi9wYXBlci1tZW51LWJ1dHRvbi1hbmltYXRpb25zLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLW1lbnUtZ3Jvdy1oZWlnaHQtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1BvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSxjb25maWd1cmU6ZnVuY3Rpb24oYSl7dmFyIGM9YS5ub2RlLGQ9Yy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7cmV0dXJuIHRoaXMuX2VmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QoYyxbe2hlaWdodDpkLzIrInB4In0se2hlaWdodDpkKyJweCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYSkpfX0pO1BvbHltZXIoe2lzOiJwYXBlci1tZW51LWdyb3ctd2lkdGgtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1BvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSxjb25maWd1cmU6ZnVuY3Rpb24oYSl7dmFyIGM9YS5ub2RlLGQ9Yy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChjLFt7d2lkdGg6ZC8yKyJweCJ9LHt3aWR0aDpkKyJweCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYSkpfX0pOwpQb2x5bWVyKHtpczoicGFwZXItbWVudS1zaHJpbmstd2lkdGgtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1BvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSxjb25maWd1cmU6ZnVuY3Rpb24oYSl7dmFyIGM9YS5ub2RlLGQ9Yy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChjLFt7d2lkdGg6ZCsicHgifSx7d2lkdGg6ZC1kLzIwKyJweCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYSkpfX0pOwpQb2x5bWVyKHtpczoicGFwZXItbWVudS1zaHJpbmstaGVpZ2h0LWFuaW1hdGlvbiIsYmVoYXZpb3JzOltQb2x5bWVyLk5lb25BbmltYXRpb25CZWhhdmlvcl0sY29uZmlndXJlOmZ1bmN0aW9uKGEpe3ZhciBjPWEubm9kZSxkPWMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O3RoaXMuc2V0UHJlZml4ZWRQcm9wZXJ0eShjLCJ0cmFuc2Zvcm1PcmlnaW4iLCIwIDAiKTtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChjLFt7aGVpZ2h0OmQrInB4Iix0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMCkifSx7aGVpZ2h0OmQvMisicHgiLHRyYW5zZm9ybToidHJhbnNsYXRlWSgtMjBweCkifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGEpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1tZW51LWJ1dHRvbi9wYXBlci1tZW51LWJ1dHRvbi5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBhPXtBTklNQVRJT05fQ1VCSUNfQkVaSUVSOiJjdWJpYy1iZXppZXIoLjMsLjk1LC41LDEpIixNQVhfQU5JTUFUSU9OX1RJTUVfTVM6NDAwfTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbj1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLnJlZ2lzdGVyZWQ9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5hZGRPd25LZXlCaW5kaW5nPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUucmVtb3ZlT3duS2V5QmluZGluZ3M9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5rZXlib2FyZEV2ZW50TWF0Y2hlc0tleXM9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fY29sbGVjdEtleUJpbmRpbmdzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX3ByZXBLZXlCaW5kaW5ncz0KZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fYWRkS2V5QmluZGluZz1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLl9yZXNldEtleUV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2xpc3RlbktleUV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX3VubGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fb25LZXlCaW5kaW5nRXZlbnQ9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fdHJpZ2dlcktleUhhbmRsZXI9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fZm9jdXNCbHVySGFuZGxlcj1mdW5jdGlvbihjKXtpZihQb2x5bWVyLkVsZW1lbnQpdGhpcy5fc2V0Rm9jdXNlZCgiZm9jdXMiPT09CmMudHlwZSk7ZWxzZSBpZihjLnRhcmdldD09PXRoaXMpdGhpcy5fc2V0Rm9jdXNlZCgiZm9jdXMiPT09Yy50eXBlKTtlbHNlIGlmKHRoaXMuX19oYW5kbGVFdmVudFJldGFyZ2V0aW5nKXt2YXIgZD1Qb2x5bWVyLmRvbShjKS5sb2NhbFRhcmdldDt0aGlzLmlzTGlnaHREZXNjZW5kYW50KGQpfHx0aGlzLmZpcmUoYy50eXBlLHtzb3VyY2VFdmVudDpjfSx7bm9kZTp0aGlzLGJ1YmJsZXM6Yy5idWJibGVzLGNhbmNlbGFibGU6Yy5jYW5jZWxhYmxlfSl9fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2NoYW5nZWRDb250cm9sU3RhdGU9ZnVuY3Rpb24oKXt0aGlzLl9jb250cm9sU3RhdGVDaGFuZ2VkJiZ0aGlzLl9jb250cm9sU3RhdGVDaGFuZ2VkKCl9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fc2V0Rm9jdXNlZD1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b249UG9seW1lcih7aXM6InBhcGVyLW1lbnUtYnV0dG9uIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsClBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZV0scHJvcGVydGllczp7b3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwLG9ic2VydmVyOiJfb3BlbmVkQ2hhbmdlZCJ9LGhvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sdmVydGljYWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6InRvcCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxkeW5hbWljQWxpZ246e3R5cGU6Qm9vbGVhbn0saG9yaXpvbnRhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LHZlcnRpY2FsT2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sbm9PdmVybGFwOnt0eXBlOkJvb2xlYW59LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpZ25vcmVTZWxlY3Q6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sY2xvc2VPbkFjdGl2YXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG9wZW5BbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0LAp2YWx1ZTpmdW5jdGlvbigpe3JldHVyblt7bmFtZToiZmFkZS1pbi1hbmltYXRpb24iLHRpbWluZzp7ZGVsYXk6MTAwLGR1cmF0aW9uOjIwMH19LHtuYW1lOiJwYXBlci1tZW51LWdyb3ctd2lkdGgtYW5pbWF0aW9uIix0aW1pbmc6e2RlbGF5OjEwMCxkdXJhdGlvbjoxNTAsZWFzaW5nOmEuQU5JTUFUSU9OX0NVQklDX0JFWklFUn19LHtuYW1lOiJwYXBlci1tZW51LWdyb3ctaGVpZ2h0LWFuaW1hdGlvbiIsdGltaW5nOntkZWxheToxMDAsZHVyYXRpb246Mjc1LGVhc2luZzphLkFOSU1BVElPTl9DVUJJQ19CRVpJRVJ9fV19fSxjbG9zZUFuaW1hdGlvbkNvbmZpZzp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5be25hbWU6ImZhZGUtb3V0LWFuaW1hdGlvbiIsdGltaW5nOntkdXJhdGlvbjoxNTB9fSx7bmFtZToicGFwZXItbWVudS1zaHJpbmstd2lkdGgtYW5pbWF0aW9uIix0aW1pbmc6e2RlbGF5OjEwMCxkdXJhdGlvbjo1MCxlYXNpbmc6YS5BTklNQVRJT05fQ1VCSUNfQkVaSUVSfX0sCntuYW1lOiJwYXBlci1tZW51LXNocmluay1oZWlnaHQtYW5pbWF0aW9uIix0aW1pbmc6e2R1cmF0aW9uOjIwMCxlYXNpbmc6ImVhc2UtaW4ifX1dfX0sYWxsb3dPdXRzaWRlU2Nyb2xsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHJlc3RvcmVGb2N1c09uQ2xvc2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX2Ryb3Bkb3duQ29udGVudDp7dHlwZTpPYmplY3R9fSxob3N0QXR0cmlidXRlczp7cm9sZToiZ3JvdXAiLCJhcmlhLWhhc3BvcHVwIjoidHJ1ZSJ9LGxpc3RlbmVyczp7Imlyb24tYWN0aXZhdGUiOiJfb25Jcm9uQWN0aXZhdGUiLCJpcm9uLXNlbGVjdCI6Il9vbklyb25TZWxlY3QifSxnZXQgY29udGVudEVsZW1lbnQoKXtmb3IodmFyIGM9UG9seW1lci5kb20odGhpcy4kLmNvbnRlbnQpLmdldERpc3RyaWJ1dGVkTm9kZXMoKSxkPTAsZj1jLmxlbmd0aDtkPGY7ZCsrKWlmKGNbZF0ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4gY1tkXX0sdG9nZ2xlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ/CnRoaXMuY2xvc2UoKTp0aGlzLm9wZW4oKX0sb3BlbjpmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWR8fHRoaXMuJC5kcm9wZG93bi5vcGVuKCl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy4kLmRyb3Bkb3duLmNsb3NlKCl9LF9vbklyb25TZWxlY3Q6ZnVuY3Rpb24oKXt0aGlzLmlnbm9yZVNlbGVjdHx8dGhpcy5jbG9zZSgpfSxfb25Jcm9uQWN0aXZhdGU6ZnVuY3Rpb24oKXt0aGlzLmNsb3NlT25BY3RpdmF0ZSYmdGhpcy5jbG9zZSgpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbihjLGQpe2M/KHRoaXMuX2Ryb3Bkb3duQ29udGVudD10aGlzLmNvbnRlbnRFbGVtZW50LHRoaXMuZmlyZSgicGFwZXItZHJvcGRvd24tb3BlbiIpKTpudWxsIT1kJiZ0aGlzLmZpcmUoInBhcGVyLWRyb3Bkb3duLWNsb3NlIil9LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24oYyl7UG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLl9kaXNhYmxlZENoYW5nZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpO2MmJnRoaXMub3BlbmVkJiYKdGhpcy5jbG9zZSgpfSxfX29uSXJvbk92ZXJsYXlDYW5jZWxlZDpmdW5jdGlvbihjKXt2YXIgZD10aGlzLiQudHJpZ2dlcjstMTxQb2x5bWVyLmRvbShjLmRldGFpbCkucGF0aC5pbmRleE9mKGQpJiZjLnByZXZlbnREZWZhdWx0KCl9fSk7T2JqZWN0LmtleXMoYSkuZm9yRWFjaChmdW5jdGlvbihjKXtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbltjXT1hW2NdfSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24taWNvbnNldC1zdmcvaXJvbi1pY29uc2V0LXN2Zy5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLWljb25zZXQtc3ZnIixwcm9wZXJ0aWVzOntuYW1lOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX25hbWVDaGFuZ2VkIn0sc2l6ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MjR9LHJ0bE1pcnJvcmluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx1c2VHbG9iYWxSdGxBdHRyaWJ1dGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9tZXRhPW5ldyBQb2x5bWVyLklyb25NZXRhKHt0eXBlOiJpY29uc2V0IixrZXk6bnVsbCx2YWx1ZTpudWxsfSl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZ2V0SWNvbk5hbWVzOmZ1bmN0aW9uKCl7dGhpcy5faWNvbnM9dGhpcy5fY3JlYXRlSWNvbk1hcCgpO3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9pY29ucykubWFwKGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5hbWUrIjoiK2F9LHRoaXMpfSxhcHBseUljb246ZnVuY3Rpb24oYSxjKXt0aGlzLnJlbW92ZUljb24oYSk7CmlmKGM9dGhpcy5fY2xvbmVJY29uKGMsdGhpcy5ydGxNaXJyb3JpbmcmJnRoaXMuX3RhcmdldElzUlRMKGEpKSl7dmFyIGQ9UG9seW1lci5kb20oYS5yb290fHxhKTtkLmluc2VydEJlZm9yZShjLGQuY2hpbGROb2Rlc1swXSk7cmV0dXJuIGEuX3N2Z0ljb249Y31yZXR1cm4gbnVsbH0scmVtb3ZlSWNvbjpmdW5jdGlvbihhKXthLl9zdmdJY29uJiYoUG9seW1lci5kb20oYS5yb290fHxhKS5yZW1vdmVDaGlsZChhLl9zdmdJY29uKSxhLl9zdmdJY29uPW51bGwpfSxfdGFyZ2V0SXNSVEw6ZnVuY3Rpb24oYSl7bnVsbD09dGhpcy5fX3RhcmdldElzUlRMJiYodGhpcy51c2VHbG9iYWxSdGxBdHRyaWJ1dGU/dGhpcy5fX3RhcmdldElzUlRMPSJydGwiPT09KGRvY3VtZW50LmJvZHkmJmRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKCJkaXIiKT9kb2N1bWVudC5ib2R5OmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0QXR0cmlidXRlKCJkaXIiKTooYSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFJiYKKGE9YS5ob3N0KSx0aGlzLl9fdGFyZ2V0SXNSVEw9YSYmInJ0bCI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5kaXJlY3Rpb24pKTtyZXR1cm4gdGhpcy5fX3RhcmdldElzUlRMfSxfbmFtZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9tZXRhLnZhbHVlPW51bGw7dGhpcy5fbWV0YS5rZXk9dGhpcy5uYW1lO3RoaXMuX21ldGEudmFsdWU9dGhpczt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5maXJlKCJpcm9uLWljb25zZXQtYWRkZWQiLHRoaXMse25vZGU6d2luZG93fSl9KX0sX2NyZWF0ZUljb25NYXA6ZnVuY3Rpb24oKXt2YXIgYT1PYmplY3QuY3JlYXRlKG51bGwpO1BvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZF0iKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2FbYy5pZF09Y30pO3JldHVybiBhfSxfY2xvbmVJY29uOmZ1bmN0aW9uKGEsYyl7dGhpcy5faWNvbnM9dGhpcy5faWNvbnN8fHRoaXMuX2NyZWF0ZUljb25NYXAoKTtyZXR1cm4gdGhpcy5fcHJlcGFyZVN2Z0Nsb25lKHRoaXMuX2ljb25zW2FdLAp0aGlzLnNpemUsYyl9LF9wcmVwYXJlU3ZnQ2xvbmU6ZnVuY3Rpb24oYSxjLGQpe2lmKGEpe2E9YS5jbG9uZU5vZGUoITApO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJzdmciKTtjPWEuZ2V0QXR0cmlidXRlKCJ2aWV3Qm94Iil8fCIwIDAgIitjKyIgIitjO3ZhciBnPSJwb2ludGVyLWV2ZW50czogbm9uZTsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IjtkJiZhLmhhc0F0dHJpYnV0ZSgibWlycm9yLWluLXJ0bCIpJiYoZys9Ii13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC0xLDEpO3RyYW5zZm9ybTpzY2FsZSgtMSwxKTt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjsiKTtmLnNldEF0dHJpYnV0ZSgidmlld0JveCIsYyk7Zi5zZXRBdHRyaWJ1dGUoInByZXNlcnZlQXNwZWN0UmF0aW8iLCJ4TWlkWU1pZCBtZWV0Iik7Zi5zZXRBdHRyaWJ1dGUoImZvY3VzYWJsZSIsImZhbHNlIik7Zi5zdHlsZS5jc3NUZXh0PQpnO2YuYXBwZW5kQ2hpbGQoYSkucmVtb3ZlQXR0cmlidXRlKCJpZCIpO3JldHVybiBmfXJldHVybiBudWxsfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWRyb3Bkb3duLW1lbnUvcGFwZXItZHJvcGRvd24tbWVudS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJwYXBlci1kcm9wZG93bi1tZW51IixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLklyb25Gb3JtRWxlbWVudEJlaGF2aW9yLFBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3NlbGVjdGVkSXRlbUxhYmVsOnt0eXBlOlN0cmluZyxub3RpZnk6ITAscmVhZE9ubHk6ITB9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSx2YWx1ZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxsYWJlbDp7dHlwZTpTdHJpbmd9LHBsYWNlaG9sZGVyOnt0eXBlOlN0cmluZ30sZXJyb3JNZXNzYWdlOnt0eXBlOlN0cmluZ30sb3BlbmVkOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExLG9ic2VydmVyOiJfb3BlbmVkQ2hhbmdlZCJ9LGFsbG93T3V0c2lkZVNjcm9sbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0xhYmVsRmxvYXQ6e3R5cGU6Qm9vbGVhbiwKdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxhbHdheXNGbG9hdExhYmVsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJyaWdodCJ9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJ0b3AifSx2ZXJ0aWNhbE9mZnNldDpOdW1iZXIsZHluYW1pY0FsaWduOnt0eXBlOkJvb2xlYW59LHJlc3RvcmVGb2N1c09uQ2xvc2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LGxpc3RlbmVyczp7dGFwOiJfb25UYXAifSxrZXlCaW5kaW5nczp7InVwIGRvd24iOiJvcGVuIixlc2M6ImNsb3NlIn0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImNvbWJvYm94IiwiYXJpYS1hdXRvY29tcGxldGUiOiJub25lIiwiYXJpYS1oYXNwb3B1cCI6InRydWUifSxvYnNlcnZlcnM6WyJfc2VsZWN0ZWRJdGVtQ2hhbmdlZChzZWxlY3RlZEl0ZW0pIl0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5jb250ZW50RWxlbWVudDthJiZhLnNlbGVjdGVkSXRlbSYmdGhpcy5fc2V0U2VsZWN0ZWRJdGVtKGEuc2VsZWN0ZWRJdGVtKX0sZ2V0IGNvbnRlbnRFbGVtZW50KCl7Zm9yKHZhciBhPVBvbHltZXIuZG9tKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCksYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKylpZihhW2NdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIGFbY119LG9wZW46ZnVuY3Rpb24oKXt0aGlzLiQubWVudUJ1dHRvbi5vcGVuKCl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy4kLm1lbnVCdXR0b24uY2xvc2UoKX0sX29uSXJvblNlbGVjdDpmdW5jdGlvbihhKXt0aGlzLl9zZXRTZWxlY3RlZEl0ZW0oYS5kZXRhaWwuaXRlbSl9LF9vbklyb25EZXNlbGVjdDpmdW5jdGlvbigpe3RoaXMuX3NldFNlbGVjdGVkSXRlbShudWxsKX0sX29uVGFwOmZ1bmN0aW9uKGEpe1BvbHltZXIuR2VzdHVyZXMuZmluZE9yaWdpbmFsVGFyZ2V0KGEpPT09dGhpcyYmCnRoaXMub3BlbigpfSxfc2VsZWN0ZWRJdGVtQ2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLnZhbHVlPWE9YT9hLmxhYmVsfHxhLmdldEF0dHJpYnV0ZSgibGFiZWwiKXx8YS50ZXh0Q29udGVudC50cmltKCk6IiI7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtTGFiZWwoYSl9LF9jb21wdXRlTWVudVZlcnRpY2FsT2Zmc2V0OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGM/YzphPy00Ojh9LF9nZXRWYWxpZGl0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc2FibGVkfHwhdGhpcy5yZXF1aXJlZHx8dGhpcy5yZXF1aXJlZCYmISF0aGlzLnZhbHVlfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3BlbmVkPyJ0cnVlIjoiZmFsc2UiLGM9dGhpcy5jb250ZW50RWxlbWVudDtjJiZjLnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsYSl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1zZWxlY3Rpb24uaHRtbC5qcwpQb2x5bWVyLklyb25TZWxlY3Rpb249ZnVuY3Rpb24oYSl7dGhpcy5zZWxlY3Rpb249W107dGhpcy5zZWxlY3RDYWxsYmFjaz1hfTsKUG9seW1lci5Jcm9uU2VsZWN0aW9uLnByb3RvdHlwZT17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXVsdGk/dGhpcy5zZWxlY3Rpb24uc2xpY2UoKTp0aGlzLnNlbGVjdGlvblswXX0sY2xlYXI6ZnVuY3Rpb24oYSl7dGhpcy5zZWxlY3Rpb24uc2xpY2UoKS5mb3JFYWNoKGZ1bmN0aW9uKGMpeyghYXx8MD5hLmluZGV4T2YoYykpJiZ0aGlzLnNldEl0ZW1TZWxlY3RlZChjLCExKX0sdGhpcyl9LGlzU2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8PXRoaXMuc2VsZWN0aW9uLmluZGV4T2YoYSl9LHNldEl0ZW1TZWxlY3RlZDpmdW5jdGlvbihhLGMpe2lmKG51bGwhPWEmJmMhPT10aGlzLmlzU2VsZWN0ZWQoYSkpe2lmKGMpdGhpcy5zZWxlY3Rpb24ucHVzaChhKTtlbHNle3ZhciBkPXRoaXMuc2VsZWN0aW9uLmluZGV4T2YoYSk7MDw9ZCYmdGhpcy5zZWxlY3Rpb24uc3BsaWNlKGQsMSl9dGhpcy5zZWxlY3RDYWxsYmFjayYmdGhpcy5zZWxlY3RDYWxsYmFjayhhLGMpfX0sc2VsZWN0OmZ1bmN0aW9uKGEpe3RoaXMubXVsdGk/CnRoaXMudG9nZ2xlKGEpOnRoaXMuZ2V0KCkhPT1hJiYodGhpcy5zZXRJdGVtU2VsZWN0ZWQodGhpcy5nZXQoKSwhMSksdGhpcy5zZXRJdGVtU2VsZWN0ZWQoYSwhMCkpfSx0b2dnbGU6ZnVuY3Rpb24oYSl7dGhpcy5zZXRJdGVtU2VsZWN0ZWQoYSwhdGhpcy5pc1NlbGVjdGVkKGEpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1zZWxlY3RhYmxlLmh0bWwuanMKUG9seW1lci5Jcm9uU2VsZWN0YWJsZUJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthdHRyRm9yU2VsZWN0ZWQ6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHNlbGVjdGVkOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxhY3RpdmF0ZUV2ZW50Ont0eXBlOlN0cmluZyx2YWx1ZToidGFwIixvYnNlcnZlcjoiX2FjdGl2YXRlRXZlbnRDaGFuZ2VkIn0sc2VsZWN0YWJsZTpTdHJpbmcsc2VsZWN0ZWRDbGFzczp7dHlwZTpTdHJpbmcsdmFsdWU6Imlyb24tc2VsZWN0ZWQifSxzZWxlY3RlZEF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sZmFsbGJhY2tTZWxlY3Rpb246e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGl0ZW1zOnt0eXBlOkFycmF5LHJlYWRPbmx5OiEwLG5vdGlmeTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX2V4Y2x1ZGVkTG9jYWxOYW1lczp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57dGVtcGxhdGU6MSwKImRvbS1iaW5kIjoxLCJkb20taWYiOjEsImRvbS1yZXBlYXQiOjF9fX19LG9ic2VydmVyczpbIl91cGRhdGVBdHRyRm9yU2VsZWN0ZWQoYXR0ckZvclNlbGVjdGVkKSIsIl91cGRhdGVTZWxlY3RlZChzZWxlY3RlZCkiLCJfY2hlY2tGYWxsYmFjayhmYWxsYmFja1NlbGVjdGlvbikiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fYmluZEZpbHRlckl0ZW09dGhpcy5fZmlsdGVySXRlbS5iaW5kKHRoaXMpO3RoaXMuX3NlbGVjdGlvbj1uZXcgUG9seW1lci5Jcm9uU2VsZWN0aW9uKHRoaXMuX2FwcGx5U2VsZWN0aW9uLmJpbmQodGhpcykpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPXRoaXMuX29ic2VydmVJdGVtcyh0aGlzKTt0aGlzLl9hZGRMaXN0ZW5lcih0aGlzLmFjdGl2YXRlRXZlbnQpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiZQb2x5bWVyLmRvbSh0aGlzKS51bm9ic2VydmVOb2Rlcyh0aGlzLl9vYnNlcnZlcik7dGhpcy5fcmVtb3ZlTGlzdGVuZXIodGhpcy5hY3RpdmF0ZUV2ZW50KX0sCmluZGV4T2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaXRlbXM/dGhpcy5pdGVtcy5pbmRleE9mKGEpOi0xfSxzZWxlY3Q6ZnVuY3Rpb24oYSl7dGhpcy5zZWxlY3RlZD1hfSxzZWxlY3RQcmV2aW91czpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaXRlbXMubGVuZ3RoO2E9KE51bWJlcih0aGlzLl92YWx1ZVRvSW5kZXgodGhpcy5zZWxlY3RlZCkpLTErYSklYTt0aGlzLnNlbGVjdGVkPXRoaXMuX2luZGV4VG9WYWx1ZShhKX0sc2VsZWN0TmV4dDpmdW5jdGlvbigpe3ZhciBhPShOdW1iZXIodGhpcy5fdmFsdWVUb0luZGV4KHRoaXMuc2VsZWN0ZWQpKSsxKSV0aGlzLml0ZW1zLmxlbmd0aDt0aGlzLnNlbGVjdGVkPXRoaXMuX2luZGV4VG9WYWx1ZShhKX0sc2VsZWN0SW5kZXg6ZnVuY3Rpb24oYSl7dGhpcy5zZWxlY3QodGhpcy5faW5kZXhUb1ZhbHVlKGEpKX0sZm9yY2VTeW5jaHJvbm91c0l0ZW1VcGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlciYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLl9vYnNlcnZlci5mbHVzaD8KdGhpcy5fb2JzZXJ2ZXIuZmx1c2goKTp0aGlzLl91cGRhdGVJdGVtcygpfSxnZXQgX3Nob3VsZFVwZGF0ZVNlbGVjdGlvbigpe3JldHVybiBudWxsIT10aGlzLnNlbGVjdGVkfSxfY2hlY2tGYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVNlbGVjdGVkKCl9LF9hZGRMaXN0ZW5lcjpmdW5jdGlvbihhKXt0aGlzLmxpc3Rlbih0aGlzLGEsIl9hY3RpdmF0ZUhhbmRsZXIiKX0sX3JlbW92ZUxpc3RlbmVyOmZ1bmN0aW9uKGEpe3RoaXMudW5saXN0ZW4odGhpcyxhLCJfYWN0aXZhdGVIYW5kbGVyIil9LF9hY3RpdmF0ZUV2ZW50Q2hhbmdlZDpmdW5jdGlvbihhLGMpe3RoaXMuX3JlbW92ZUxpc3RlbmVyKGMpO3RoaXMuX2FkZExpc3RlbmVyKGEpfSxfdXBkYXRlSXRlbXM6ZnVuY3Rpb24oKXt2YXIgYT1Qb2x5bWVyLmRvbSh0aGlzKS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHModGhpcy5zZWxlY3RhYmxlfHwiKiIpO2E9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGEsdGhpcy5fYmluZEZpbHRlckl0ZW0pOwp0aGlzLl9zZXRJdGVtcyhhKX0sX3VwZGF0ZUF0dHJGb3JTZWxlY3RlZDpmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWRJdGVtJiYodGhpcy5zZWxlY3RlZD10aGlzLl92YWx1ZUZvckl0ZW0odGhpcy5zZWxlY3RlZEl0ZW0pKX0sX3VwZGF0ZVNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5fc2VsZWN0U2VsZWN0ZWQodGhpcy5zZWxlY3RlZCl9LF9zZWxlY3RTZWxlY3RlZDpmdW5jdGlvbigpe2lmKHRoaXMuaXRlbXMpe3ZhciBhPXRoaXMuX3ZhbHVlVG9JdGVtKHRoaXMuc2VsZWN0ZWQpO2E/dGhpcy5fc2VsZWN0aW9uLnNlbGVjdChhKTp0aGlzLl9zZWxlY3Rpb24uY2xlYXIoKTt0aGlzLmZhbGxiYWNrU2VsZWN0aW9uJiZ0aGlzLml0ZW1zLmxlbmd0aCYmdm9pZCAwPT09dGhpcy5fc2VsZWN0aW9uLmdldCgpJiYodGhpcy5zZWxlY3RlZD10aGlzLmZhbGxiYWNrU2VsZWN0aW9uKX19LF9maWx0ZXJJdGVtOmZ1bmN0aW9uKGEpe3JldHVybiF0aGlzLl9leGNsdWRlZExvY2FsTmFtZXNbYS5sb2NhbE5hbWVdfSwKX3ZhbHVlVG9JdGVtOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hP251bGw6dGhpcy5pdGVtc1t0aGlzLl92YWx1ZVRvSW5kZXgoYSldfSxfdmFsdWVUb0luZGV4OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYXR0ckZvclNlbGVjdGVkKWZvcih2YXIgYz0wLGQ7ZD10aGlzLml0ZW1zW2NdO2MrKyl7aWYodGhpcy5fdmFsdWVGb3JJdGVtKGQpPT1hKXJldHVybiBjfWVsc2UgcmV0dXJuIE51bWJlcihhKX0sX2luZGV4VG9WYWx1ZTpmdW5jdGlvbihhKXtpZih0aGlzLmF0dHJGb3JTZWxlY3RlZCl7aWYoYT10aGlzLml0ZW1zW2FdKXJldHVybiB0aGlzLl92YWx1ZUZvckl0ZW0oYSl9ZWxzZSByZXR1cm4gYX0sX3ZhbHVlRm9ySXRlbTpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4gbnVsbDtpZighdGhpcy5hdHRyRm9yU2VsZWN0ZWQpcmV0dXJuIGE9dGhpcy5pbmRleE9mKGEpLC0xPT09YT9udWxsOmE7dmFyIGM9YVtQb2x5bWVyLkNhc2VNYXAuZGFzaFRvQ2FtZWxDYXNlKHRoaXMuYXR0ckZvclNlbGVjdGVkKV07CnJldHVybiB2b2lkIDAhPWM/YzphLmdldEF0dHJpYnV0ZSh0aGlzLmF0dHJGb3JTZWxlY3RlZCl9LF9hcHBseVNlbGVjdGlvbjpmdW5jdGlvbihhLGMpe3RoaXMuc2VsZWN0ZWRDbGFzcyYmdGhpcy50b2dnbGVDbGFzcyh0aGlzLnNlbGVjdGVkQ2xhc3MsYyxhKTt0aGlzLnNlbGVjdGVkQXR0cmlidXRlJiZ0aGlzLnRvZ2dsZUF0dHJpYnV0ZSh0aGlzLnNlbGVjdGVkQXR0cmlidXRlLGMsYSk7dGhpcy5fc2VsZWN0aW9uQ2hhbmdlKCk7dGhpcy5maXJlKCJpcm9uLSIrKGM/InNlbGVjdCI6ImRlc2VsZWN0Iikse2l0ZW06YX0pfSxfc2VsZWN0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtKHRoaXMuX3NlbGVjdGlvbi5nZXQoKSl9LF9vYnNlcnZlSXRlbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIFBvbHltZXIuZG9tKGEpLm9ic2VydmVOb2RlcyhmdW5jdGlvbihjKXt0aGlzLl91cGRhdGVJdGVtcygpO3RoaXMuX3VwZGF0ZVNlbGVjdGVkKCk7dGhpcy5maXJlKCJpcm9uLWl0ZW1zLWNoYW5nZWQiLApjLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITF9KX0pfSxfYWN0aXZhdGVIYW5kbGVyOmZ1bmN0aW9uKGEpe2E9YS50YXJnZXQ7Zm9yKHZhciBjPXRoaXMuaXRlbXM7YSYmYSE9dGhpczspe3ZhciBkPWMuaW5kZXhPZihhKTtpZigwPD1kKXtjPXRoaXMuX2luZGV4VG9WYWx1ZShkKTt0aGlzLl9pdGVtQWN0aXZhdGUoYyxhKTticmVha31hPWEucGFyZW50Tm9kZX19LF9pdGVtQWN0aXZhdGU6ZnVuY3Rpb24oYSxjKXt0aGlzLmZpcmUoImlyb24tYWN0aXZhdGUiLHtzZWxlY3RlZDphLGl0ZW06Y30se2NhbmNlbGFibGU6ITB9KS5kZWZhdWx0UHJldmVudGVkfHx0aGlzLnNlbGVjdChhKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1tdWx0aS1zZWxlY3RhYmxlLmh0bWwuanMKUG9seW1lci5Jcm9uTXVsdGlTZWxlY3RhYmxlQmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOnttdWx0aTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJtdWx0aUNoYW5nZWQifSxzZWxlY3RlZFZhbHVlczp7dHlwZTpBcnJheSxub3RpZnk6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LHNlbGVjdGVkSXRlbXM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZVNlbGVjdGVkKHNlbGVjdGVkVmFsdWVzLnNwbGljZXMpIl0sc2VsZWN0OmZ1bmN0aW9uKGEpe3RoaXMubXVsdGk/dGhpcy5fdG9nZ2xlU2VsZWN0ZWQoYSk6dGhpcy5zZWxlY3RlZD1hfSxtdWx0aUNoYW5nZWQ6ZnVuY3Rpb24oYSl7dGhpcy5fc2VsZWN0aW9uLm11bHRpPWE7dGhpcy5fdXBkYXRlU2VsZWN0ZWQoKX0sZ2V0IF9zaG91bGRVcGRhdGVTZWxlY3Rpb24oKXtyZXR1cm4gbnVsbCE9dGhpcy5zZWxlY3RlZHx8Cm51bGwhPXRoaXMuc2VsZWN0ZWRWYWx1ZXMmJnRoaXMuc2VsZWN0ZWRWYWx1ZXMubGVuZ3RofSxfdXBkYXRlQXR0ckZvclNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5tdWx0aT90aGlzLnNlbGVjdGVkSXRlbXMmJjA8dGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCYmKHRoaXMuc2VsZWN0ZWRWYWx1ZXM9dGhpcy5zZWxlY3RlZEl0ZW1zLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5faW5kZXhUb1ZhbHVlKHRoaXMuaW5kZXhPZihhKSl9LHRoaXMpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YX0sdGhpcykpOlBvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5fdXBkYXRlQXR0ckZvclNlbGVjdGVkLmFwcGx5KHRoaXMpfSxfdXBkYXRlU2VsZWN0ZWQ6ZnVuY3Rpb24oKXt0aGlzLm11bHRpP3RoaXMuX3NlbGVjdE11bHRpKHRoaXMuc2VsZWN0ZWRWYWx1ZXMpOnRoaXMuX3NlbGVjdFNlbGVjdGVkKHRoaXMuc2VsZWN0ZWQpfSxfc2VsZWN0TXVsdGk6ZnVuY3Rpb24oYSl7YT0KYXx8W107YT0odGhpcy5fdmFsdWVzVG9JdGVtcyhhKXx8W10pLmZpbHRlcihmdW5jdGlvbihkKXtyZXR1cm4gbnVsbCE9PWQmJnZvaWQgMCE9PWR9KTt0aGlzLl9zZWxlY3Rpb24uY2xlYXIoYSk7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspdGhpcy5fc2VsZWN0aW9uLnNldEl0ZW1TZWxlY3RlZChhW2NdLCEwKTt0aGlzLmZhbGxiYWNrU2VsZWN0aW9uJiYhdGhpcy5fc2VsZWN0aW9uLmdldCgpLmxlbmd0aCYmdGhpcy5fdmFsdWVUb0l0ZW0odGhpcy5mYWxsYmFja1NlbGVjdGlvbikmJnRoaXMuc2VsZWN0KHRoaXMuZmFsbGJhY2tTZWxlY3Rpb24pfSxfc2VsZWN0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fc2VsZWN0aW9uLmdldCgpO3RoaXMubXVsdGk/KHRoaXMuX3NldFNlbGVjdGVkSXRlbXMoYSksdGhpcy5fc2V0U2VsZWN0ZWRJdGVtKGEubGVuZ3RoP2FbMF06bnVsbCkpOm51bGwhPT1hJiZ2b2lkIDAhPT1hPyh0aGlzLl9zZXRTZWxlY3RlZEl0ZW1zKFthXSksCnRoaXMuX3NldFNlbGVjdGVkSXRlbShhKSk6KHRoaXMuX3NldFNlbGVjdGVkSXRlbXMoW10pLHRoaXMuX3NldFNlbGVjdGVkSXRlbShudWxsKSl9LF90b2dnbGVTZWxlY3RlZDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnNlbGVjdGVkVmFsdWVzLmluZGV4T2YoYSk7MD5jP3RoaXMucHVzaCgic2VsZWN0ZWRWYWx1ZXMiLGEpOnRoaXMuc3BsaWNlKCJzZWxlY3RlZFZhbHVlcyIsYywxKX0sX3ZhbHVlc1RvSXRlbXM6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/bnVsbDphLm1hcChmdW5jdGlvbihjKXtyZXR1cm4gdGhpcy5fdmFsdWVUb0l0ZW0oYyl9LHRoaXMpfX07UG9seW1lci5Jcm9uTXVsdGlTZWxlY3RhYmxlQmVoYXZpb3I9W1BvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvcixQb2x5bWVyLklyb25NdWx0aVNlbGVjdGFibGVCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tbWVudS1iZWhhdmlvci9pcm9uLW1lbnUtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25NZW51QmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOntmb2N1c2VkSXRlbTp7b2JzZXJ2ZXI6Il9mb2N1c2VkSXRlbUNoYW5nZWQiLHJlYWRPbmx5OiEwLHR5cGU6T2JqZWN0fSxhdHRyRm9ySXRlbVRpdGxlOnt0eXBlOlN0cmluZ30sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2Rpc2FibGVkQ2hhbmdlZCJ9fSxfTU9ESUZJRVJfS0VZUzoiQWx0IEFsdEdyYXBoIENhcHNMb2NrIENvbnRyb2wgRm4gRm5Mb2NrIEh5cGVyIE1ldGEgTnVtTG9jayBPUyBTY3JvbGxMb2NrIFNoaWZ0IFN1cGVyIFN5bWJvbCBTeW1ib2xMb2NrIi5zcGxpdCgiICIpLF9TRUFSQ0hfUkVTRVRfVElNRU9VVF9NUzoxRTMsX3ByZXZpb3VzVGFiSW5kZXg6MCxob3N0QXR0cmlidXRlczp7cm9sZToibWVudSJ9LG9ic2VydmVyczpbIl91cGRhdGVNdWx0aXNlbGVjdGFibGUobXVsdGkpIl0sbGlzdGVuZXJzOntmb2N1czoiX29uRm9jdXMiLGtleWRvd246Il9vbktleWRvd24iLAoiaXJvbi1pdGVtcy1jaGFuZ2VkIjoiX29uSXJvbkl0ZW1zQ2hhbmdlZCJ9LGtleUJpbmRpbmdzOnt1cDoiX29uVXBLZXkiLGRvd246Il9vbkRvd25LZXkiLGVzYzoiX29uRXNjS2V5Iiwic2hpZnQrdGFiOmtleWRvd24iOiJfb25TaGlmdFRhYkRvd24ifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3Jlc2V0VGFiaW5kaWNlcygpfSxzZWxlY3Q6ZnVuY3Rpb24oYSl7dGhpcy5fZGVmYXVsdEZvY3VzQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jKSx0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYz1udWxsKTt2YXIgYz10aGlzLl92YWx1ZVRvSXRlbShhKTtjJiZjLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKXx8KHRoaXMuX3NldEZvY3VzZWRJdGVtKGMpLFBvbHltZXIuSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9ySW1wbC5zZWxlY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sX3Jlc2V0VGFiaW5kaWNlczpmdW5jdGlvbigpe3ZhciBhPXRoaXMubXVsdGk/CnRoaXMuc2VsZWN0ZWRJdGVtcyYmdGhpcy5zZWxlY3RlZEl0ZW1zWzBdOnRoaXMuc2VsZWN0ZWRJdGVtO3RoaXMuaXRlbXMuZm9yRWFjaChmdW5jdGlvbihjKXtjLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLGM9PT1hPyIwIjoiLTEiKX0sdGhpcyl9LF91cGRhdGVNdWx0aXNlbGVjdGFibGU6ZnVuY3Rpb24oYSl7YT90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1tdWx0aXNlbGVjdGFibGUiLCJ0cnVlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtbXVsdGlzZWxlY3RhYmxlIil9LF9mb2N1c1dpdGhLZXlib2FyZEV2ZW50OmZ1bmN0aW9uKGEpe2lmKC0xPT09dGhpcy5fTU9ESUZJRVJfS0VZUy5pbmRleE9mKGEua2V5KSl7dGhpcy5jYW5jZWxEZWJvdW5jZXIoIl9jbGVhclNlYXJjaFRleHQiKTt2YXIgYz10aGlzLl9zZWFyY2hUZXh0fHwiIjtjKz0oYS5rZXkmJjE9PWEua2V5Lmxlbmd0aD9hLmtleTpTdHJpbmcuZnJvbUNoYXJDb2RlKGEua2V5Q29kZSkpLnRvTG9jYWxlTG93ZXJDYXNlKCk7CmE9Yy5sZW5ndGg7Zm9yKHZhciBkPTAsZjtmPXRoaXMuaXRlbXNbZF07ZCsrKWlmKCFmLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIGc9dGhpcy5hdHRyRm9ySXRlbVRpdGxlfHwidGV4dENvbnRlbnQiO2c9KGZbZ118fGYuZ2V0QXR0cmlidXRlKGcpfHwiIikudHJpbSgpO2lmKCEoZy5sZW5ndGg8YSkmJmcuc2xpY2UoMCxhKS50b0xvY2FsZUxvd2VyQ2FzZSgpPT1jKXt0aGlzLl9zZXRGb2N1c2VkSXRlbShmKTticmVha319dGhpcy5fc2VhcmNoVGV4dD1jO3RoaXMuZGVib3VuY2UoIl9jbGVhclNlYXJjaFRleHQiLHRoaXMuX2NsZWFyU2VhcmNoVGV4dCx0aGlzLl9TRUFSQ0hfUkVTRVRfVElNRU9VVF9NUyl9fSxfY2xlYXJTZWFyY2hUZXh0OmZ1bmN0aW9uKCl7dGhpcy5fc2VhcmNoVGV4dD0iIn0sX2ZvY3VzUHJldmlvdXM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5pdGVtcy5sZW5ndGgsYz1OdW1iZXIodGhpcy5pbmRleE9mKHRoaXMuZm9jdXNlZEl0ZW0pKSxkPTE7ZDwKYSsxO2QrKyl7dmFyIGY9dGhpcy5pdGVtc1soYy1kK2EpJWFdO2lmKCFmLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIGc9UG9seW1lci5kb20oZikuZ2V0T3duZXJSb290KCl8fGRvY3VtZW50O3RoaXMuX3NldEZvY3VzZWRJdGVtKGYpO2lmKFBvbHltZXIuZG9tKGcpLmFjdGl2ZUVsZW1lbnQ9PWYpYnJlYWt9fX0sX2ZvY3VzTmV4dDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLml0ZW1zLmxlbmd0aCxjPU51bWJlcih0aGlzLmluZGV4T2YodGhpcy5mb2N1c2VkSXRlbSkpLGQ9MTtkPGErMTtkKyspe3ZhciBmPXRoaXMuaXRlbXNbKGMrZCklYV07aWYoIWYuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKXt2YXIgZz1Qb2x5bWVyLmRvbShmKS5nZXRPd25lclJvb3QoKXx8ZG9jdW1lbnQ7dGhpcy5fc2V0Rm9jdXNlZEl0ZW0oZik7aWYoUG9seW1lci5kb20oZykuYWN0aXZlRWxlbWVudD09ZilicmVha319fSxfYXBwbHlTZWxlY3Rpb246ZnVuY3Rpb24oYSxjKXtjP2Euc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIiwKInRydWUiKTphLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIpO1BvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5fYXBwbHlTZWxlY3Rpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfZm9jdXNlZEl0ZW1DaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7YyYmYy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKTshYXx8YS5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIil8fHRoaXMuZGlzYWJsZWR8fChhLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCIwIiksYS5mb2N1cygpKX0sX29uSXJvbkl0ZW1zQ2hhbmdlZDpmdW5jdGlvbihhKXthLmRldGFpbC5hZGRlZE5vZGVzLmxlbmd0aCYmdGhpcy5fcmVzZXRUYWJpbmRpY2VzKCl9LF9vblNoaWZ0VGFiRG93bjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpO1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX3NoaWZ0VGFiUHJlc3NlZD0hMDt0aGlzLl9zZXRGb2N1c2VkSXRlbShudWxsKTt0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLAoiLTEiKTt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IixhKTtQb2x5bWVyLklyb25NZW51QmVoYXZpb3JJbXBsLl9zaGlmdFRhYlByZXNzZWQ9ITF9LDEpfSxfb25Gb2N1czpmdW5jdGlvbihhKXshUG9seW1lci5Jcm9uTWVudUJlaGF2aW9ySW1wbC5fc2hpZnRUYWJQcmVzc2VkJiYoYT1Qb2x5bWVyLmRvbShhKS5yb290VGFyZ2V0LGE9PT10aGlzfHwidW5kZWZpbmVkIj09PXR5cGVvZiBhLnRhYkluZGV4fHx0aGlzLmlzTGlnaHREZXNjZW5kYW50KGEpKSYmKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jPXRoaXMuYXN5bmMoZnVuY3Rpb24oKXt2YXIgYz10aGlzLm11bHRpP3RoaXMuc2VsZWN0ZWRJdGVtcyYmdGhpcy5zZWxlY3RlZEl0ZW1zWzBdOnRoaXMuc2VsZWN0ZWRJdGVtO3RoaXMuX3NldEZvY3VzZWRJdGVtKG51bGwpO2M/dGhpcy5fc2V0Rm9jdXNlZEl0ZW0oYyk6dGhpcy5pdGVtc1swXSYmdGhpcy5fZm9jdXNOZXh0KCl9KSl9LF9vblVwS2V5OmZ1bmN0aW9uKGEpe3RoaXMuX2ZvY3VzUHJldmlvdXMoKTsKYS5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25Eb3duS2V5OmZ1bmN0aW9uKGEpe3RoaXMuX2ZvY3VzTmV4dCgpO2EuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sX29uRXNjS2V5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5mb2N1c2VkSXRlbTthJiZhLmJsdXIoKX0sX29uS2V5ZG93bjpmdW5jdGlvbihhKXt0aGlzLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhhLCJ1cCBkb3duIGVzYyIpfHx0aGlzLl9mb2N1c1dpdGhLZXlib2FyZEV2ZW50KGEpO2Euc3RvcFByb3BhZ2F0aW9uKCl9LF9hY3RpdmF0ZUhhbmRsZXI6ZnVuY3Rpb24oYSl7UG9seW1lci5Jcm9uU2VsZWN0YWJsZUJlaGF2aW9yLl9hY3RpdmF0ZUhhbmRsZXIuY2FsbCh0aGlzLGEpO2Euc3RvcFByb3BhZ2F0aW9uKCl9LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24oYSl7YT8odGhpcy5fcHJldmlvdXNUYWJJbmRleD10aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKT90aGlzLnRhYkluZGV4OgowLHRoaXMucmVtb3ZlQXR0cmlidXRlKCJ0YWJpbmRleCIpKTp0aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKXx8dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4Iix0aGlzLl9wcmV2aW91c1RhYkluZGV4KX19O1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX3NoaWZ0VGFiUHJlc3NlZD0hMTtQb2x5bWVyLklyb25NZW51QmVoYXZpb3I9W1BvbHltZXIuSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsUG9seW1lci5Jcm9uTWVudUJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItbGlzdGJveC9wYXBlci1saXN0Ym94Lmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InBhcGVyLWxpc3Rib3giLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uTWVudUJlaGF2aW9yXSxob3N0QXR0cmlidXRlczp7cm9sZToibGlzdGJveCJ9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWl0ZW0vcGFwZXItaXRlbS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJJdGVtQmVoYXZpb3JJbXBsPXtob3N0QXR0cmlidXRlczp7cm9sZToib3B0aW9uIix0YWJpbmRleDoiMCJ9fTtQb2x5bWVyLlBhcGVySXRlbUJlaGF2aW9yPVtQb2x5bWVyLklyb25CdXR0b25TdGF0ZSxQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5QYXBlckl0ZW1CZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWl0ZW0vcGFwZXItaXRlbS5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1pdGVtIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJdGVtQmVoYXZpb3JdfSk7CgovKgoKIExvZGFzaCA8aHR0cHM6Ly9sb2Rhc2guY29tLz4KIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanMuZm91bmRhdGlvbi8+CiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+CiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPgogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzCiovCihmdW5jdGlvbigpe3ZhciB1bmRlZmluZWQ7dmFyIFZFUlNJT049IjQuMTcuNSI7dmFyIExBUkdFX0FSUkFZX1NJWkU9MjAwO3ZhciBDT1JFX0VSUk9SX1RFWFQ9IlVuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xXHgzZHBvbnlmaWxsLiIsRlVOQ19FUlJPUl9URVhUPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIjt2YXIgSEFTSF9VTkRFRklORUQ9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iO3ZhciBNQVhfTUVNT0laRV9TSVpFPTUwMDt2YXIgUExBQ0VIT0xERVI9Il9fbG9kYXNoX3BsYWNlaG9sZGVyX18iO3ZhciBDTE9ORV9ERUVQX0ZMQUc9MSxDTE9ORV9GTEFUX0ZMQUc9MixDTE9ORV9TWU1CT0xTX0ZMQUc9NDt2YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUc9MSxDT01QQVJFX1VOT1JERVJFRF9GTEFHPTI7dmFyIFdSQVBfQklORF9GTEFHPTEsV1JBUF9CSU5EX0tFWV9GTEFHPTIsV1JBUF9DVVJSWV9CT1VORF9GTEFHPTQsV1JBUF9DVVJSWV9GTEFHPQo4LFdSQVBfQ1VSUllfUklHSFRfRkxBRz0xNixXUkFQX1BBUlRJQUxfRkxBRz0zMixXUkFQX1BBUlRJQUxfUklHSFRfRkxBRz02NCxXUkFQX0FSWV9GTEFHPTEyOCxXUkFQX1JFQVJHX0ZMQUc9MjU2LFdSQVBfRkxJUF9GTEFHPTUxMjt2YXIgREVGQVVMVF9UUlVOQ19MRU5HVEg9MzAsREVGQVVMVF9UUlVOQ19PTUlTU0lPTj0iLi4uIjt2YXIgSE9UX0NPVU5UPTgwMCxIT1RfU1BBTj0xNjt2YXIgTEFaWV9GSUxURVJfRkxBRz0xLExBWllfTUFQX0ZMQUc9MixMQVpZX1dISUxFX0ZMQUc9Mzt2YXIgSU5GSU5JVFk9MS8wLE1BWF9TQUZFX0lOVEVHRVI9OTAwNzE5OTI1NDc0MDk5MSxNQVhfSU5URUdFUj0xLjc5NzY5MzEzNDg2MjMxNTdFMzA4LE5BTj0wLzA7dmFyIE1BWF9BUlJBWV9MRU5HVEg9NDI5NDk2NzI5NSxNQVhfQVJSQVlfSU5ERVg9TUFYX0FSUkFZX0xFTkdUSC0xLEhBTEZfTUFYX0FSUkFZX0xFTkdUSD1NQVhfQVJSQVlfTEVOR1RIPj4+MTt2YXIgd3JhcEZsYWdzPVtbImFyeSIsCldSQVBfQVJZX0ZMQUddLFsiYmluZCIsV1JBUF9CSU5EX0ZMQUddLFsiYmluZEtleSIsV1JBUF9CSU5EX0tFWV9GTEFHXSxbImN1cnJ5IixXUkFQX0NVUlJZX0ZMQUddLFsiY3VycnlSaWdodCIsV1JBUF9DVVJSWV9SSUdIVF9GTEFHXSxbImZsaXAiLFdSQVBfRkxJUF9GTEFHXSxbInBhcnRpYWwiLFdSQVBfUEFSVElBTF9GTEFHXSxbInBhcnRpYWxSaWdodCIsV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUddLFsicmVhcmciLFdSQVBfUkVBUkdfRkxBR11dO3ZhciBhcmdzVGFnPSJbb2JqZWN0IEFyZ3VtZW50c10iLGFycmF5VGFnPSJbb2JqZWN0IEFycmF5XSIsYXN5bmNUYWc9IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLGJvb2xUYWc9IltvYmplY3QgQm9vbGVhbl0iLGRhdGVUYWc9IltvYmplY3QgRGF0ZV0iLGRvbUV4Y1RhZz0iW29iamVjdCBET01FeGNlcHRpb25dIixlcnJvclRhZz0iW29iamVjdCBFcnJvcl0iLGZ1bmNUYWc9IltvYmplY3QgRnVuY3Rpb25dIixnZW5UYWc9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIiwKbWFwVGFnPSJbb2JqZWN0IE1hcF0iLG51bWJlclRhZz0iW29iamVjdCBOdW1iZXJdIixudWxsVGFnPSJbb2JqZWN0IE51bGxdIixvYmplY3RUYWc9IltvYmplY3QgT2JqZWN0XSIscHJvbWlzZVRhZz0iW29iamVjdCBQcm9taXNlXSIscHJveHlUYWc9IltvYmplY3QgUHJveHldIixyZWdleHBUYWc9IltvYmplY3QgUmVnRXhwXSIsc2V0VGFnPSJbb2JqZWN0IFNldF0iLHN0cmluZ1RhZz0iW29iamVjdCBTdHJpbmddIixzeW1ib2xUYWc9IltvYmplY3QgU3ltYm9sXSIsdW5kZWZpbmVkVGFnPSJbb2JqZWN0IFVuZGVmaW5lZF0iLHdlYWtNYXBUYWc9IltvYmplY3QgV2Vha01hcF0iLHdlYWtTZXRUYWc9IltvYmplY3QgV2Vha1NldF0iO3ZhciBhcnJheUJ1ZmZlclRhZz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLGRhdGFWaWV3VGFnPSJbb2JqZWN0IERhdGFWaWV3XSIsZmxvYXQzMlRhZz0iW29iamVjdCBGbG9hdDMyQXJyYXldIixmbG9hdDY0VGFnPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLAppbnQ4VGFnPSJbb2JqZWN0IEludDhBcnJheV0iLGludDE2VGFnPSJbb2JqZWN0IEludDE2QXJyYXldIixpbnQzMlRhZz0iW29iamVjdCBJbnQzMkFycmF5XSIsdWludDhUYWc9IltvYmplY3QgVWludDhBcnJheV0iLHVpbnQ4Q2xhbXBlZFRhZz0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLHVpbnQxNlRhZz0iW29iamVjdCBVaW50MTZBcnJheV0iLHVpbnQzMlRhZz0iW29iamVjdCBVaW50MzJBcnJheV0iO3ZhciByZUVtcHR5U3RyaW5nTGVhZGluZz0vXGJfX3AgXCs9ICcnOy9nLHJlRW1wdHlTdHJpbmdNaWRkbGU9L1xiKF9fcCBcKz0pICcnIFwrL2cscmVFbXB0eVN0cmluZ1RyYWlsaW5nPS8oX19lXCguKj9cKXxcYl9fdFwpKSBcK1xuJyc7L2c7dmFyIHJlRXNjYXBlZEh0bWw9LyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLHJlVW5lc2NhcGVkSHRtbD0vWyY8PiInXS9nLHJlSGFzRXNjYXBlZEh0bWw9UmVnRXhwKHJlRXNjYXBlZEh0bWwuc291cmNlKSxyZUhhc1VuZXNjYXBlZEh0bWw9ClJlZ0V4cChyZVVuZXNjYXBlZEh0bWwuc291cmNlKTt2YXIgcmVFc2NhcGU9LzwlLShbXHNcU10rPyklPi9nLHJlRXZhbHVhdGU9LzwlKFtcc1xTXSs/KSU+L2cscmVJbnRlcnBvbGF0ZT0vPCU9KFtcc1xTXSs/KSU+L2c7dmFyIHJlSXNEZWVwUHJvcD0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxyZUlzUGxhaW5Qcm9wPS9eXHcqJC8scmVQcm9wTmFtZT0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZzt2YXIgcmVSZWdFeHBDaGFyPS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxyZUhhc1JlZ0V4cENoYXI9UmVnRXhwKHJlUmVnRXhwQ2hhci5zb3VyY2UpO3ZhciByZVRyaW09L15ccyt8XHMrJC9nLHJlVHJpbVN0YXJ0PS9eXHMrLyxyZVRyaW1FbmQ9L1xzKyQvO3ZhciByZVdyYXBDb21tZW50PS9ceyg/OlxuXC9cKiBcW3dyYXBwZWQgd2l0aCAuK1xdIFwqXC8pP1xuPy8sCnJlV3JhcERldGFpbHM9L1x7XG5cL1wqIFxbd3JhcHBlZCB3aXRoICguKylcXSBcKi8scmVTcGxpdERldGFpbHM9Lyw/ICYgLzt2YXIgcmVBc2NpaVdvcmQ9L1teXHgwMC1ceDJmXHgzYS1ceDQwXHg1Yi1ceDYwXHg3Yi1ceDdmXSsvZzt2YXIgcmVFc2NhcGVDaGFyPS9cXChcXCk/L2c7dmFyIHJlRXNUZW1wbGF0ZT0vXCRceyhbXlxcfV0qKD86XFwuW15cXH1dKikqKVx9L2c7dmFyIHJlRmxhZ3M9L1x3KiQvO3ZhciByZUlzQmFkSGV4PS9eWy0rXTB4WzAtOWEtZl0rJC9pO3ZhciByZUlzQmluYXJ5PS9eMGJbMDFdKyQvaTt2YXIgcmVJc0hvc3RDdG9yPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvO3ZhciByZUlzT2N0YWw9L14wb1swLTddKyQvaTt2YXIgcmVJc1VpbnQ9L14oPzowfFsxLTldXGQqKSQvO3ZhciByZUxhdGluPS9bXHhjMC1ceGQ2XHhkOC1ceGY2XHhmOC1ceGZmXHUwMTAwLVx1MDE3Zl0vZzt2YXIgcmVOb01hdGNoPS8oJF4pLzt2YXIgcmVVbmVzY2FwZWRTdHJpbmc9Ci9bJ1xuXHJcdTIwMjhcdTIwMjlcXF0vZzt2YXIgcnNBc3RyYWxSYW5nZT0iXFx1ZDgwMC1cXHVkZmZmIixyc0NvbWJvTWFya3NSYW5nZT0iXFx1MDMwMC1cXHUwMzZmIixyZUNvbWJvSGFsZk1hcmtzUmFuZ2U9IlxcdWZlMjAtXFx1ZmUyZiIscnNDb21ib1N5bWJvbHNSYW5nZT0iXFx1MjBkMC1cXHUyMGZmIixyc0NvbWJvUmFuZ2U9cnNDb21ib01hcmtzUmFuZ2UrcmVDb21ib0hhbGZNYXJrc1JhbmdlK3JzQ29tYm9TeW1ib2xzUmFuZ2UscnNEaW5nYmF0UmFuZ2U9IlxcdTI3MDAtXFx1MjdiZiIscnNMb3dlclJhbmdlPSJhLXpcXHhkZi1cXHhmNlxceGY4LVxceGZmIixyc01hdGhPcFJhbmdlPSJcXHhhY1xceGIxXFx4ZDdcXHhmNyIscnNOb25DaGFyUmFuZ2U9IlxceDAwLVxceDJmXFx4M2EtXFx4NDBcXHg1Yi1cXHg2MFxceDdiLVxceGJmIixyc1B1bmN0dWF0aW9uUmFuZ2U9IlxcdTIwMDAtXFx1MjA2ZiIscnNTcGFjZVJhbmdlPSIgXFx0XFx4MGJcXGZcXHhhMFxcdWZlZmZcXG5cXHJcXHUyMDI4XFx1MjAyOVxcdTE2ODBcXHUxODBlXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDAiLApyc1VwcGVyUmFuZ2U9IkEtWlxceGMwLVxceGQ2XFx4ZDgtXFx4ZGUiLHJzVmFyUmFuZ2U9IlxcdWZlMGVcXHVmZTBmIixyc0JyZWFrUmFuZ2U9cnNNYXRoT3BSYW5nZStyc05vbkNoYXJSYW5nZStyc1B1bmN0dWF0aW9uUmFuZ2UrcnNTcGFjZVJhbmdlO3ZhciByc0Fwb3M9IlsnXHUyMDE5XSIscnNBc3RyYWw9IlsiK3JzQXN0cmFsUmFuZ2UrIl0iLHJzQnJlYWs9IlsiK3JzQnJlYWtSYW5nZSsiXSIscnNDb21ibz0iWyIrcnNDb21ib1JhbmdlKyJdIixyc0RpZ2l0cz0iXFxkKyIscnNEaW5nYmF0PSJbIityc0RpbmdiYXRSYW5nZSsiXSIscnNMb3dlcj0iWyIrcnNMb3dlclJhbmdlKyJdIixyc01pc2M9IlteIityc0FzdHJhbFJhbmdlK3JzQnJlYWtSYW5nZStyc0RpZ2l0cytyc0RpbmdiYXRSYW5nZStyc0xvd2VyUmFuZ2UrcnNVcHBlclJhbmdlKyJdIixyc0ZpdHo9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIscnNNb2RpZmllcj0iKD86Iityc0NvbWJvKyJ8Iityc0ZpdHorIikiLHJzTm9uQXN0cmFsPQoiW14iK3JzQXN0cmFsUmFuZ2UrIl0iLHJzUmVnaW9uYWw9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLHJzU3VyclBhaXI9IltcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0iLHJzVXBwZXI9IlsiK3JzVXBwZXJSYW5nZSsiXSIscnNaV0o9IlxcdTIwMGQiO3ZhciByc01pc2NMb3dlcj0iKD86Iityc0xvd2VyKyJ8Iityc01pc2MrIikiLHJzTWlzY1VwcGVyPSIoPzoiK3JzVXBwZXIrInwiK3JzTWlzYysiKSIscnNPcHRDb250ckxvd2VyPSIoPzoiK3JzQXBvcysiKD86ZHxsbHxtfHJlfHN8dHx2ZSkpPyIscnNPcHRDb250clVwcGVyPSIoPzoiK3JzQXBvcysiKD86RHxMTHxNfFJFfFN8VHxWRSkpPyIscmVPcHRNb2Q9cnNNb2RpZmllcisiPyIscnNPcHRWYXI9IlsiK3JzVmFyUmFuZ2UrIl0/Iixyc09wdEpvaW49Iig/OiIrcnNaV0orIig/OiIrW3JzTm9uQXN0cmFsLHJzUmVnaW9uYWwscnNTdXJyUGFpcl0uam9pbigifCIpKyIpIityc09wdFZhcityZU9wdE1vZCsKIikqIixyc09yZExvd2VyPSJcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxkdGgpKD9ceDNkXFxifFtBLVpfXSkiLHJzT3JkVXBwZXI9IlxcZCooPzoxU1R8Mk5EfDNSRHwoPyFbMTIzXSlcXGRUSCkoP1x4M2RcXGJ8W2Etel9dKSIscnNTZXE9cnNPcHRWYXIrcmVPcHRNb2QrcnNPcHRKb2luLHJzRW1vamk9Iig/OiIrW3JzRGluZ2JhdCxyc1JlZ2lvbmFsLHJzU3VyclBhaXJdLmpvaW4oInwiKSsiKSIrcnNTZXEscnNTeW1ib2w9Iig/OiIrW3JzTm9uQXN0cmFsK3JzQ29tYm8rIj8iLHJzQ29tYm8scnNSZWdpb25hbCxyc1N1cnJQYWlyLHJzQXN0cmFsXS5qb2luKCJ8IikrIikiO3ZhciByZUFwb3M9UmVnRXhwKHJzQXBvcywiZyIpO3ZhciByZUNvbWJvTWFyaz1SZWdFeHAocnNDb21ibywiZyIpO3ZhciByZVVuaWNvZGU9UmVnRXhwKHJzRml0eisiKD9ceDNkIityc0ZpdHorIil8Iityc1N5bWJvbCtyc1NlcSwiZyIpO3ZhciByZVVuaWNvZGVXb3JkPVJlZ0V4cChbcnNVcHBlcisiPyIrCnJzTG93ZXIrIisiK3JzT3B0Q29udHJMb3dlcisiKD9ceDNkIitbcnNCcmVhayxyc1VwcGVyLCIkIl0uam9pbigifCIpKyIpIixyc01pc2NVcHBlcisiKyIrcnNPcHRDb250clVwcGVyKyIoP1x4M2QiK1tyc0JyZWFrLHJzVXBwZXIrcnNNaXNjTG93ZXIsIiQiXS5qb2luKCJ8IikrIikiLHJzVXBwZXIrIj8iK3JzTWlzY0xvd2VyKyIrIityc09wdENvbnRyTG93ZXIscnNVcHBlcisiKyIrcnNPcHRDb250clVwcGVyLHJzT3JkVXBwZXIscnNPcmRMb3dlcixyc0RpZ2l0cyxyc0Vtb2ppXS5qb2luKCJ8IiksImciKTt2YXIgcmVIYXNVbmljb2RlPVJlZ0V4cCgiWyIrcnNaV0orcnNBc3RyYWxSYW5nZStyc0NvbWJvUmFuZ2UrcnNWYXJSYW5nZSsiXSIpO3ZhciByZUhhc1VuaWNvZGVXb3JkPS9bYS16XVtBLVpdfFtBLVpdezIsfVthLXpdfFswLTldW2EtekEtWl18W2EtekEtWl1bMC05XXxbXmEtekEtWjAtOSBdLzt2YXIgY29udGV4dFByb3BzPVsiQXJyYXkiLCJCdWZmZXIiLCJEYXRhVmlldyIsCiJEYXRlIiwiRXJyb3IiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJGdW5jdGlvbiIsIkludDhBcnJheSIsIkludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiTWFwIiwiTWF0aCIsIk9iamVjdCIsIlByb21pc2UiLCJSZWdFeHAiLCJTZXQiLCJTdHJpbmciLCJTeW1ib2wiLCJUeXBlRXJyb3IiLCJVaW50OEFycmF5IiwiVWludDhDbGFtcGVkQXJyYXkiLCJVaW50MTZBcnJheSIsIlVpbnQzMkFycmF5IiwiV2Vha01hcCIsIl8iLCJjbGVhclRpbWVvdXQiLCJpc0Zpbml0ZSIsInBhcnNlSW50Iiwic2V0VGltZW91dCJdO3ZhciB0ZW1wbGF0ZUNvdW50ZXI9LTE7dmFyIHR5cGVkQXJyYXlUYWdzPXt9O3R5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddPXR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddPXR5cGVkQXJyYXlUYWdzW2ludDhUYWddPXR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXT10eXBlZEFycmF5VGFnc1tpbnQzMlRhZ109dHlwZWRBcnJheVRhZ3NbdWludDhUYWddPXR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ109CnR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ109dHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXT10cnVlO3R5cGVkQXJyYXlUYWdzW2FyZ3NUYWddPXR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXT10eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ109dHlwZWRBcnJheVRhZ3NbYm9vbFRhZ109dHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddPXR5cGVkQXJyYXlUYWdzW2RhdGVUYWddPXR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXT10eXBlZEFycmF5VGFnc1tmdW5jVGFnXT10eXBlZEFycmF5VGFnc1ttYXBUYWddPXR5cGVkQXJyYXlUYWdzW251bWJlclRhZ109dHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXT10eXBlZEFycmF5VGFnc1tyZWdleHBUYWddPXR5cGVkQXJyYXlUYWdzW3NldFRhZ109dHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXT10eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXT1mYWxzZTt2YXIgY2xvbmVhYmxlVGFncz17fTtjbG9uZWFibGVUYWdzW2FyZ3NUYWddPWNsb25lYWJsZVRhZ3NbYXJyYXlUYWddPQpjbG9uZWFibGVUYWdzW2FycmF5QnVmZmVyVGFnXT1jbG9uZWFibGVUYWdzW2RhdGFWaWV3VGFnXT1jbG9uZWFibGVUYWdzW2Jvb2xUYWddPWNsb25lYWJsZVRhZ3NbZGF0ZVRhZ109Y2xvbmVhYmxlVGFnc1tmbG9hdDMyVGFnXT1jbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddPWNsb25lYWJsZVRhZ3NbaW50OFRhZ109Y2xvbmVhYmxlVGFnc1tpbnQxNlRhZ109Y2xvbmVhYmxlVGFnc1tpbnQzMlRhZ109Y2xvbmVhYmxlVGFnc1ttYXBUYWddPWNsb25lYWJsZVRhZ3NbbnVtYmVyVGFnXT1jbG9uZWFibGVUYWdzW29iamVjdFRhZ109Y2xvbmVhYmxlVGFnc1tyZWdleHBUYWddPWNsb25lYWJsZVRhZ3Nbc2V0VGFnXT1jbG9uZWFibGVUYWdzW3N0cmluZ1RhZ109Y2xvbmVhYmxlVGFnc1tzeW1ib2xUYWddPWNsb25lYWJsZVRhZ3NbdWludDhUYWddPWNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXT1jbG9uZWFibGVUYWdzW3VpbnQxNlRhZ109Y2xvbmVhYmxlVGFnc1t1aW50MzJUYWddPXRydWU7CmNsb25lYWJsZVRhZ3NbZXJyb3JUYWddPWNsb25lYWJsZVRhZ3NbZnVuY1RhZ109Y2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXT1mYWxzZTt2YXIgZGVidXJyZWRMZXR0ZXJzPXsiXHUwMGMwIjoiQSIsIlx1MDBjMSI6IkEiLCJcdTAwYzIiOiJBIiwiXHUwMGMzIjoiQSIsIlx1MDBjNCI6IkEiLCJcdTAwYzUiOiJBIiwiXHUwMGUwIjoiYSIsIlx1MDBlMSI6ImEiLCJcdTAwZTIiOiJhIiwiXHUwMGUzIjoiYSIsIlx1MDBlNCI6ImEiLCJcdTAwZTUiOiJhIiwiXHUwMGM3IjoiQyIsIlx1MDBlNyI6ImMiLCJcdTAwZDAiOiJEIiwiXHUwMGYwIjoiZCIsIlx1MDBjOCI6IkUiLCJcdTAwYzkiOiJFIiwiXHUwMGNhIjoiRSIsIlx1MDBjYiI6IkUiLCJcdTAwZTgiOiJlIiwiXHUwMGU5IjoiZSIsIlx1MDBlYSI6ImUiLCJcdTAwZWIiOiJlIiwiXHUwMGNjIjoiSSIsIlx1MDBjZCI6IkkiLCJcdTAwY2UiOiJJIiwiXHUwMGNmIjoiSSIsIlx1MDBlYyI6ImkiLCJcdTAwZWQiOiJpIiwiXHUwMGVlIjoiaSIsCiJcdTAwZWYiOiJpIiwiXHUwMGQxIjoiTiIsIlx1MDBmMSI6Im4iLCJcdTAwZDIiOiJPIiwiXHUwMGQzIjoiTyIsIlx1MDBkNCI6Ik8iLCJcdTAwZDUiOiJPIiwiXHUwMGQ2IjoiTyIsIlx1MDBkOCI6Ik8iLCJcdTAwZjIiOiJvIiwiXHUwMGYzIjoibyIsIlx1MDBmNCI6Im8iLCJcdTAwZjUiOiJvIiwiXHUwMGY2IjoibyIsIlx1MDBmOCI6Im8iLCJcdTAwZDkiOiJVIiwiXHUwMGRhIjoiVSIsIlx1MDBkYiI6IlUiLCJcdTAwZGMiOiJVIiwiXHUwMGY5IjoidSIsIlx1MDBmYSI6InUiLCJcdTAwZmIiOiJ1IiwiXHUwMGZjIjoidSIsIlx1MDBkZCI6IlkiLCJcdTAwZmQiOiJ5IiwiXHUwMGZmIjoieSIsIlx1MDBjNiI6IkFlIiwiXHUwMGU2IjoiYWUiLCJcdTAwZGUiOiJUaCIsIlx1MDBmZSI6InRoIiwiXHUwMGRmIjoic3MiLCJcdTAxMDAiOiJBIiwiXHUwMTAyIjoiQSIsIlx1MDEwNCI6IkEiLCJcdTAxMDEiOiJhIiwiXHUwMTAzIjoiYSIsIlx1MDEwNSI6ImEiLCJcdTAxMDYiOiJDIiwiXHUwMTA4IjoiQyIsCiJcdTAxMGEiOiJDIiwiXHUwMTBjIjoiQyIsIlx1MDEwNyI6ImMiLCJcdTAxMDkiOiJjIiwiXHUwMTBiIjoiYyIsIlx1MDEwZCI6ImMiLCJcdTAxMGUiOiJEIiwiXHUwMTEwIjoiRCIsIlx1MDEwZiI6ImQiLCJcdTAxMTEiOiJkIiwiXHUwMTEyIjoiRSIsIlx1MDExNCI6IkUiLCJcdTAxMTYiOiJFIiwiXHUwMTE4IjoiRSIsIlx1MDExYSI6IkUiLCJcdTAxMTMiOiJlIiwiXHUwMTE1IjoiZSIsIlx1MDExNyI6ImUiLCJcdTAxMTkiOiJlIiwiXHUwMTFiIjoiZSIsIlx1MDExYyI6IkciLCJcdTAxMWUiOiJHIiwiXHUwMTIwIjoiRyIsIlx1MDEyMiI6IkciLCJcdTAxMWQiOiJnIiwiXHUwMTFmIjoiZyIsIlx1MDEyMSI6ImciLCJcdTAxMjMiOiJnIiwiXHUwMTI0IjoiSCIsIlx1MDEyNiI6IkgiLCJcdTAxMjUiOiJoIiwiXHUwMTI3IjoiaCIsIlx1MDEyOCI6IkkiLCJcdTAxMmEiOiJJIiwiXHUwMTJjIjoiSSIsIlx1MDEyZSI6IkkiLCJcdTAxMzAiOiJJIiwiXHUwMTI5IjoiaSIsIlx1MDEyYiI6ImkiLAoiXHUwMTJkIjoiaSIsIlx1MDEyZiI6ImkiLCJcdTAxMzEiOiJpIiwiXHUwMTM0IjoiSiIsIlx1MDEzNSI6ImoiLCJcdTAxMzYiOiJLIiwiXHUwMTM3IjoiayIsIlx1MDEzOCI6ImsiLCJcdTAxMzkiOiJMIiwiXHUwMTNiIjoiTCIsIlx1MDEzZCI6IkwiLCJcdTAxM2YiOiJMIiwiXHUwMTQxIjoiTCIsIlx1MDEzYSI6ImwiLCJcdTAxM2MiOiJsIiwiXHUwMTNlIjoibCIsIlx1MDE0MCI6ImwiLCJcdTAxNDIiOiJsIiwiXHUwMTQzIjoiTiIsIlx1MDE0NSI6Ik4iLCJcdTAxNDciOiJOIiwiXHUwMTRhIjoiTiIsIlx1MDE0NCI6Im4iLCJcdTAxNDYiOiJuIiwiXHUwMTQ4IjoibiIsIlx1MDE0YiI6Im4iLCJcdTAxNGMiOiJPIiwiXHUwMTRlIjoiTyIsIlx1MDE1MCI6Ik8iLCJcdTAxNGQiOiJvIiwiXHUwMTRmIjoibyIsIlx1MDE1MSI6Im8iLCJcdTAxNTQiOiJSIiwiXHUwMTU2IjoiUiIsIlx1MDE1OCI6IlIiLCJcdTAxNTUiOiJyIiwiXHUwMTU3IjoiciIsIlx1MDE1OSI6InIiLCJcdTAxNWEiOiJTIiwKIlx1MDE1YyI6IlMiLCJcdTAxNWUiOiJTIiwiXHUwMTYwIjoiUyIsIlx1MDE1YiI6InMiLCJcdTAxNWQiOiJzIiwiXHUwMTVmIjoicyIsIlx1MDE2MSI6InMiLCJcdTAxNjIiOiJUIiwiXHUwMTY0IjoiVCIsIlx1MDE2NiI6IlQiLCJcdTAxNjMiOiJ0IiwiXHUwMTY1IjoidCIsIlx1MDE2NyI6InQiLCJcdTAxNjgiOiJVIiwiXHUwMTZhIjoiVSIsIlx1MDE2YyI6IlUiLCJcdTAxNmUiOiJVIiwiXHUwMTcwIjoiVSIsIlx1MDE3MiI6IlUiLCJcdTAxNjkiOiJ1IiwiXHUwMTZiIjoidSIsIlx1MDE2ZCI6InUiLCJcdTAxNmYiOiJ1IiwiXHUwMTcxIjoidSIsIlx1MDE3MyI6InUiLCJcdTAxNzQiOiJXIiwiXHUwMTc1IjoidyIsIlx1MDE3NiI6IlkiLCJcdTAxNzciOiJ5IiwiXHUwMTc4IjoiWSIsIlx1MDE3OSI6IloiLCJcdTAxN2IiOiJaIiwiXHUwMTdkIjoiWiIsIlx1MDE3YSI6InoiLCJcdTAxN2MiOiJ6IiwiXHUwMTdlIjoieiIsIlx1MDEzMiI6IklKIiwiXHUwMTMzIjoiaWoiLCJcdTAxNTIiOiJPZSIsCiJcdTAxNTMiOiJvZSIsIlx1MDE0OSI6IiduIiwiXHUwMTdmIjoicyJ9O3ZhciBodG1sRXNjYXBlcz17Ilx4MjYiOiJceDI2YW1wOyIsIlx4M2MiOiJceDI2bHQ7IiwiXHgzZSI6Ilx4MjZndDsiLCciJzoiXHgyNnF1b3Q7IiwiJyI6Ilx4MjYjMzk7In07dmFyIGh0bWxVbmVzY2FwZXM9eyJceDI2YW1wOyI6Ilx4MjYiLCJceDI2bHQ7IjoiXHgzYyIsIlx4MjZndDsiOiJceDNlIiwiXHgyNnF1b3Q7IjonIicsIlx4MjYjMzk7IjoiJyJ9O3ZhciBzdHJpbmdFc2NhcGVzPXsiXFwiOiJcXCIsIiciOiInIiwiXG4iOiJuIiwiXHIiOiJyIiwiXHUyMDI4IjoidTIwMjgiLCJcdTIwMjkiOiJ1MjAyOSJ9O3ZhciBmcmVlUGFyc2VGbG9hdD1wYXJzZUZsb2F0LGZyZWVQYXJzZUludD1wYXJzZUludDt2YXIgZnJlZUdsb2JhbD10eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWw7dmFyIGZyZWVTZWxmPXR5cGVvZiBzZWxmPT0ib2JqZWN0IiYmCnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmO3ZhciByb290PWZyZWVHbG9iYWx8fGZyZWVTZWxmfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpO3ZhciBmcmVlRXhwb3J0cz10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzO3ZhciBmcmVlTW9kdWxlPWZyZWVFeHBvcnRzJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGU7dmFyIG1vZHVsZUV4cG9ydHM9ZnJlZU1vZHVsZSYmZnJlZU1vZHVsZS5leHBvcnRzPT09ZnJlZUV4cG9ydHM7dmFyIGZyZWVQcm9jZXNzPW1vZHVsZUV4cG9ydHMmJmZyZWVHbG9iYWwucHJvY2Vzczt2YXIgbm9kZVV0aWw9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGZyZWVQcm9jZXNzJiZmcmVlUHJvY2Vzcy5iaW5kaW5nJiZmcmVlUHJvY2Vzcy5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2goZSl7fX0oKTt2YXIgbm9kZUlzQXJyYXlCdWZmZXI9bm9kZVV0aWwmJgpub2RlVXRpbC5pc0FycmF5QnVmZmVyLG5vZGVJc0RhdGU9bm9kZVV0aWwmJm5vZGVVdGlsLmlzRGF0ZSxub2RlSXNNYXA9bm9kZVV0aWwmJm5vZGVVdGlsLmlzTWFwLG5vZGVJc1JlZ0V4cD1ub2RlVXRpbCYmbm9kZVV0aWwuaXNSZWdFeHAsbm9kZUlzU2V0PW5vZGVVdGlsJiZub2RlVXRpbC5pc1NldCxub2RlSXNUeXBlZEFycmF5PW5vZGVVdGlsJiZub2RlVXRpbC5pc1R5cGVkQXJyYXk7ZnVuY3Rpb24gYXBwbHkoZnVuYyx0aGlzQXJnLGFyZ3Mpe3N3aXRjaChhcmdzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7Y2FzZSAxOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyxhcmdzWzBdKTtjYXNlIDI6cmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLGFyZ3NbMF0sYXJnc1sxXSk7Y2FzZSAzOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyxhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSl9cmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZyxhcmdzKX1mdW5jdGlvbiBhcnJheUFnZ3JlZ2F0b3IoYXJyYXksCnNldHRlcixpdGVyYXRlZSxhY2N1bXVsYXRvcil7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtzZXR0ZXIoYWNjdW11bGF0b3IsdmFsdWUsaXRlcmF0ZWUodmFsdWUpLGFycmF5KX1yZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LGl0ZXJhdGVlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKGl0ZXJhdGVlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSk9PT1mYWxzZSlicmVhaztyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYXJyYXlFYWNoUmlnaHQoYXJyYXksaXRlcmF0ZWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7d2hpbGUobGVuZ3RoLS0paWYoaXRlcmF0ZWUoYXJyYXlbbGVuZ3RoXSxsZW5ndGgsYXJyYXkpPT09ZmFsc2UpYnJlYWs7CnJldHVybiBhcnJheX1mdW5jdGlvbiBhcnJheUV2ZXJ5KGFycmF5LHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aClpZighcHJlZGljYXRlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSkpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfWZ1bmN0aW9uIGFycmF5RmlsdGVyKGFycmF5LHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aCxyZXNJbmRleD0wLHJlc3VsdD1bXTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihwcmVkaWNhdGUodmFsdWUsaW5kZXgsYXJyYXkpKXJlc3VsdFtyZXNJbmRleCsrXT12YWx1ZX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksdmFsdWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuISFsZW5ndGgmJmJhc2VJbmRleE9mKGFycmF5LAp2YWx1ZSwwKT4tMX1mdW5jdGlvbiBhcnJheUluY2x1ZGVzV2l0aChhcnJheSx2YWx1ZSxjb21wYXJhdG9yKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKGNvbXBhcmF0b3IodmFsdWUsYXJyYXlbaW5kZXhdKSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZmFsc2V9ZnVuY3Rpb24gYXJyYXlNYXAoYXJyYXksaXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGgscmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0W2luZGV4XT1pdGVyYXRlZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LHZhbHVlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD12YWx1ZXMubGVuZ3RoLG9mZnNldD1hcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpYXJyYXlbb2Zmc2V0K2luZGV4XT0KdmFsdWVzW2luZGV4XTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksaXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGluaXRBY2N1bSYmbGVuZ3RoKWFjY3VtdWxhdG9yPWFycmF5WysraW5kZXhdO3doaWxlKCsraW5kZXg8bGVuZ3RoKWFjY3VtdWxhdG9yPWl0ZXJhdGVlKGFjY3VtdWxhdG9yLGFycmF5W2luZGV4XSxpbmRleCxhcnJheSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGFycmF5UmVkdWNlUmlnaHQoYXJyYXksaXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGluaXRBY2N1bSYmbGVuZ3RoKWFjY3VtdWxhdG9yPWFycmF5Wy0tbGVuZ3RoXTt3aGlsZShsZW5ndGgtLSlhY2N1bXVsYXRvcj1pdGVyYXRlZShhY2N1bXVsYXRvcixhcnJheVtsZW5ndGhdLGxlbmd0aCxhcnJheSk7CnJldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiBhcnJheVNvbWUoYXJyYXkscHJlZGljYXRlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKHByZWRpY2F0ZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpKXJldHVybiB0cnVlO3JldHVybiBmYWxzZX12YXIgYXNjaWlTaXplPWJhc2VQcm9wZXJ0eSgibGVuZ3RoIik7ZnVuY3Rpb24gYXNjaWlUb0FycmF5KHN0cmluZyl7cmV0dXJuIHN0cmluZy5zcGxpdCgiIil9ZnVuY3Rpb24gYXNjaWlXb3JkcyhzdHJpbmcpe3JldHVybiBzdHJpbmcubWF0Y2gocmVBc2NpaVdvcmQpfHxbXX1mdW5jdGlvbiBiYXNlRmluZEtleShjb2xsZWN0aW9uLHByZWRpY2F0ZSxlYWNoRnVuYyl7dmFyIHJlc3VsdDtlYWNoRnVuYyhjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGtleSxjb2xsZWN0aW9uKXtpZihwcmVkaWNhdGUodmFsdWUsa2V5LGNvbGxlY3Rpb24pKXtyZXN1bHQ9a2V5OwpyZXR1cm4gZmFsc2V9fSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LHByZWRpY2F0ZSxmcm9tSW5kZXgsZnJvbVJpZ2h0KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxpbmRleD1mcm9tSW5kZXgrKGZyb21SaWdodD8xOi0xKTt3aGlsZShmcm9tUmlnaHQ/aW5kZXgtLTorK2luZGV4PGxlbmd0aClpZihwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLGluZGV4LGFycmF5KSlyZXR1cm4gaW5kZXg7cmV0dXJuLTF9ZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXtyZXR1cm4gdmFsdWU9PT12YWx1ZT9zdHJpY3RJbmRleE9mKGFycmF5LHZhbHVlLGZyb21JbmRleCk6YmFzZUZpbmRJbmRleChhcnJheSxiYXNlSXNOYU4sZnJvbUluZGV4KX1mdW5jdGlvbiBiYXNlSW5kZXhPZldpdGgoYXJyYXksdmFsdWUsZnJvbUluZGV4LGNvbXBhcmF0b3Ipe3ZhciBpbmRleD1mcm9tSW5kZXgtMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8Cmxlbmd0aClpZihjb21wYXJhdG9yKGFycmF5W2luZGV4XSx2YWx1ZSkpcmV0dXJuIGluZGV4O3JldHVybi0xfWZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSl7cmV0dXJuIHZhbHVlIT09dmFsdWV9ZnVuY3Rpb24gYmFzZU1lYW4oYXJyYXksaXRlcmF0ZWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU3VtKGFycmF5LGl0ZXJhdGVlKS9sZW5ndGg6TkFOfWZ1bmN0aW9uIGJhc2VQcm9wZXJ0eShrZXkpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfX1mdW5jdGlvbiBiYXNlUHJvcGVydHlPZihvYmplY3Qpe3JldHVybiBmdW5jdGlvbihrZXkpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfX1mdW5jdGlvbiBiYXNlUmVkdWNlKGNvbGxlY3Rpb24saXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtLGVhY2hGdW5jKXtlYWNoRnVuYyhjb2xsZWN0aW9uLApmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXthY2N1bXVsYXRvcj1pbml0QWNjdW0/KGluaXRBY2N1bT1mYWxzZSx2YWx1ZSk6aXRlcmF0ZWUoYWNjdW11bGF0b3IsdmFsdWUsaW5kZXgsY29sbGVjdGlvbil9KTtyZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYmFzZVNvcnRCeShhcnJheSxjb21wYXJlcil7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7YXJyYXkuc29ydChjb21wYXJlcik7d2hpbGUobGVuZ3RoLS0pYXJyYXlbbGVuZ3RoXT1hcnJheVtsZW5ndGhdLnZhbHVlO3JldHVybiBhcnJheX1mdW5jdGlvbiBiYXNlU3VtKGFycmF5LGl0ZXJhdGVlKXt2YXIgcmVzdWx0LGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBjdXJyZW50PWl0ZXJhdGVlKGFycmF5W2luZGV4XSk7aWYoY3VycmVudCE9PXVuZGVmaW5lZClyZXN1bHQ9cmVzdWx0PT09dW5kZWZpbmVkP2N1cnJlbnQ6cmVzdWx0K2N1cnJlbnR9cmV0dXJuIHJlc3VsdH0KZnVuY3Rpb24gYmFzZVRpbWVzKG4saXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobik7d2hpbGUoKytpbmRleDxuKXJlc3VsdFtpbmRleF09aXRlcmF0ZWUoaW5kZXgpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVRvUGFpcnMob2JqZWN0LHByb3BzKXtyZXR1cm4gYXJyYXlNYXAocHJvcHMsZnVuY3Rpb24oa2V5KXtyZXR1cm5ba2V5LG9iamVjdFtrZXldXX0pfWZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKXtyZXR1cm4gZnVuY3Rpb24odmFsdWUpe3JldHVybiBmdW5jKHZhbHVlKX19ZnVuY3Rpb24gYmFzZVZhbHVlcyhvYmplY3QscHJvcHMpe3JldHVybiBhcnJheU1hcChwcm9wcyxmdW5jdGlvbihrZXkpe3JldHVybiBvYmplY3Rba2V5XX0pfWZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLGtleSl7cmV0dXJuIGNhY2hlLmhhcyhrZXkpfWZ1bmN0aW9uIGNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpe3ZhciBpbmRleD0tMSxsZW5ndGg9c3RyU3ltYm9scy5sZW5ndGg7CndoaWxlKCsraW5kZXg8bGVuZ3RoJiZiYXNlSW5kZXhPZihjaHJTeW1ib2xzLHN0clN5bWJvbHNbaW5kZXhdLDApPi0xKTtyZXR1cm4gaW5kZXh9ZnVuY3Rpb24gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpe3ZhciBpbmRleD1zdHJTeW1ib2xzLmxlbmd0aDt3aGlsZShpbmRleC0tJiZiYXNlSW5kZXhPZihjaHJTeW1ib2xzLHN0clN5bWJvbHNbaW5kZXhdLDApPi0xKTtyZXR1cm4gaW5kZXh9ZnVuY3Rpb24gY291bnRIb2xkZXJzKGFycmF5LHBsYWNlaG9sZGVyKXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxyZXN1bHQ9MDt3aGlsZShsZW5ndGgtLSlpZihhcnJheVtsZW5ndGhdPT09cGxhY2Vob2xkZXIpKytyZXN1bHQ7cmV0dXJuIHJlc3VsdH12YXIgZGVidXJyTGV0dGVyPWJhc2VQcm9wZXJ0eU9mKGRlYnVycmVkTGV0dGVycyk7dmFyIGVzY2FwZUh0bWxDaGFyPWJhc2VQcm9wZXJ0eU9mKGh0bWxFc2NhcGVzKTtmdW5jdGlvbiBlc2NhcGVTdHJpbmdDaGFyKGNocil7cmV0dXJuIlxcIisKc3RyaW5nRXNjYXBlc1tjaHJdfWZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCxrZXkpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfWZ1bmN0aW9uIGhhc1VuaWNvZGUoc3RyaW5nKXtyZXR1cm4gcmVIYXNVbmljb2RlLnRlc3Qoc3RyaW5nKX1mdW5jdGlvbiBoYXNVbmljb2RlV29yZChzdHJpbmcpe3JldHVybiByZUhhc1VuaWNvZGVXb3JkLnRlc3Qoc3RyaW5nKX1mdW5jdGlvbiBpdGVyYXRvclRvQXJyYXkoaXRlcmF0b3Ipe3ZhciBkYXRhLHJlc3VsdD1bXTt3aGlsZSghKGRhdGE9aXRlcmF0b3IubmV4dCgpKS5kb25lKXJlc3VsdC5wdXNoKGRhdGEudmFsdWUpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gbWFwVG9BcnJheShtYXApe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobWFwLnNpemUpO21hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLGtleSl7cmVzdWx0WysraW5kZXhdPVtrZXksdmFsdWVdfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsCnRyYW5zZm9ybSl7cmV0dXJuIGZ1bmN0aW9uKGFyZyl7cmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpfX1mdW5jdGlvbiByZXBsYWNlSG9sZGVycyhhcnJheSxwbGFjZWhvbGRlcil7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGgscmVzSW5kZXg9MCxyZXN1bHQ9W107d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF07aWYodmFsdWU9PT1wbGFjZWhvbGRlcnx8dmFsdWU9PT1QTEFDRUhPTERFUil7YXJyYXlbaW5kZXhdPVBMQUNFSE9MREVSO3Jlc3VsdFtyZXNJbmRleCsrXT1pbmRleH19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBzYWZlR2V0KG9iamVjdCxrZXkpe3JldHVybiBrZXk9PSJfX3Byb3RvX18iP3VuZGVmaW5lZDpvYmplY3Rba2V5XX1mdW5jdGlvbiBzZXRUb0FycmF5KHNldCl7dmFyIGluZGV4PS0xLHJlc3VsdD1BcnJheShzZXQuc2l6ZSk7c2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpe3Jlc3VsdFsrK2luZGV4XT12YWx1ZX0pOwpyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHNldFRvUGFpcnMoc2V0KXt2YXIgaW5kZXg9LTEscmVzdWx0PUFycmF5KHNldC5zaXplKTtzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSl7cmVzdWx0WysraW5kZXhdPVt2YWx1ZSx2YWx1ZV19KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHN0cmljdEluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXt2YXIgaW5kZXg9ZnJvbUluZGV4LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aClpZihhcnJheVtpbmRleF09PT12YWx1ZSlyZXR1cm4gaW5kZXg7cmV0dXJuLTF9ZnVuY3Rpb24gc3RyaWN0TGFzdEluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXt2YXIgaW5kZXg9ZnJvbUluZGV4KzE7d2hpbGUoaW5kZXgtLSlpZihhcnJheVtpbmRleF09PT12YWx1ZSlyZXR1cm4gaW5kZXg7cmV0dXJuIGluZGV4fWZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKXtyZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpP3VuaWNvZGVTaXplKHN0cmluZyk6CmFzY2lpU2l6ZShzdHJpbmcpfWZ1bmN0aW9uIHN0cmluZ1RvQXJyYXkoc3RyaW5nKXtyZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpP3VuaWNvZGVUb0FycmF5KHN0cmluZyk6YXNjaWlUb0FycmF5KHN0cmluZyl9dmFyIHVuZXNjYXBlSHRtbENoYXI9YmFzZVByb3BlcnR5T2YoaHRtbFVuZXNjYXBlcyk7ZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKXt2YXIgcmVzdWx0PXJlVW5pY29kZS5sYXN0SW5kZXg9MDt3aGlsZShyZVVuaWNvZGUudGVzdChzdHJpbmcpKSsrcmVzdWx0O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdW5pY29kZVRvQXJyYXkoc3RyaW5nKXtyZXR1cm4gc3RyaW5nLm1hdGNoKHJlVW5pY29kZSl8fFtdfWZ1bmN0aW9uIHVuaWNvZGVXb3JkcyhzdHJpbmcpe3JldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlV29yZCl8fFtdfXZhciBydW5JbkNvbnRleHQ9ZnVuY3Rpb24gcnVuSW5Db250ZXh0KGNvbnRleHQpe2NvbnRleHQ9Y29udGV4dD09bnVsbD9yb290Ol8uZGVmYXVsdHMocm9vdC5PYmplY3QoKSwKY29udGV4dCxfLnBpY2socm9vdCxjb250ZXh0UHJvcHMpKTt2YXIgQXJyYXk9Y29udGV4dC5BcnJheSxEYXRlPWNvbnRleHQuRGF0ZSxFcnJvcj1jb250ZXh0LkVycm9yLEZ1bmN0aW9uPWNvbnRleHQuRnVuY3Rpb24sTWF0aD1jb250ZXh0Lk1hdGgsT2JqZWN0PWNvbnRleHQuT2JqZWN0LFJlZ0V4cD1jb250ZXh0LlJlZ0V4cCxTdHJpbmc9Y29udGV4dC5TdHJpbmcsVHlwZUVycm9yPWNvbnRleHQuVHlwZUVycm9yO3ZhciBhcnJheVByb3RvPUFycmF5LnByb3RvdHlwZSxmdW5jUHJvdG89RnVuY3Rpb24ucHJvdG90eXBlLG9iamVjdFByb3RvPU9iamVjdC5wcm90b3R5cGU7dmFyIGNvcmVKc0RhdGE9Y29udGV4dFsiX19jb3JlLWpzX3NoYXJlZF9fIl07dmFyIGZ1bmNUb1N0cmluZz1mdW5jUHJvdG8udG9TdHJpbmc7dmFyIGhhc093blByb3BlcnR5PW9iamVjdFByb3RvLmhhc093blByb3BlcnR5O3ZhciBpZENvdW50ZXI9MDt2YXIgbWFza1NyY0tleT1mdW5jdGlvbigpe3ZhciB1aWQ9Ci9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSYmY29yZUpzRGF0YS5rZXlzJiZjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE98fCIiKTtyZXR1cm4gdWlkPyJTeW1ib2woc3JjKV8xLiIrdWlkOiIifSgpO3ZhciBuYXRpdmVPYmplY3RUb1N0cmluZz1vYmplY3RQcm90by50b1N0cmluZzt2YXIgb2JqZWN0Q3RvclN0cmluZz1mdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO3ZhciBvbGREYXNoPXJvb3QuXzt2YXIgcmVJc05hdGl2ZT1SZWdFeHAoIl4iK2Z1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwiXFwkXHgyNiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTt2YXIgQnVmZmVyPW1vZHVsZUV4cG9ydHM/Y29udGV4dC5CdWZmZXI6dW5kZWZpbmVkLFN5bWJvbD1jb250ZXh0LlN5bWJvbCxVaW50OEFycmF5PWNvbnRleHQuVWludDhBcnJheSxhbGxvY1Vuc2FmZT0KQnVmZmVyP0J1ZmZlci5hbGxvY1Vuc2FmZTp1bmRlZmluZWQsZ2V0UHJvdG90eXBlPW92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCksb2JqZWN0Q3JlYXRlPU9iamVjdC5jcmVhdGUscHJvcGVydHlJc0VudW1lcmFibGU9b2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGUsc3BsaWNlPWFycmF5UHJvdG8uc3BsaWNlLHNwcmVhZGFibGVTeW1ib2w9U3ltYm9sP1N5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGU6dW5kZWZpbmVkLHN5bUl0ZXJhdG9yPVN5bWJvbD9TeW1ib2wuaXRlcmF0b3I6dW5kZWZpbmVkLHN5bVRvU3RyaW5nVGFnPVN5bWJvbD9TeW1ib2wudG9TdHJpbmdUYWc6dW5kZWZpbmVkO3ZhciBkZWZpbmVQcm9wZXJ0eT1mdW5jdGlvbigpe3RyeXt2YXIgZnVuYz1nZXROYXRpdmUoT2JqZWN0LCJkZWZpbmVQcm9wZXJ0eSIpO2Z1bmMoe30sIiIse30pO3JldHVybiBmdW5jfWNhdGNoKGUpe319KCk7dmFyIGN0eENsZWFyVGltZW91dD1jb250ZXh0LmNsZWFyVGltZW91dCE9PQpyb290LmNsZWFyVGltZW91dCYmY29udGV4dC5jbGVhclRpbWVvdXQsY3R4Tm93PURhdGUmJkRhdGUubm93IT09cm9vdC5EYXRlLm5vdyYmRGF0ZS5ub3csY3R4U2V0VGltZW91dD1jb250ZXh0LnNldFRpbWVvdXQhPT1yb290LnNldFRpbWVvdXQmJmNvbnRleHQuc2V0VGltZW91dDt2YXIgbmF0aXZlQ2VpbD1NYXRoLmNlaWwsbmF0aXZlRmxvb3I9TWF0aC5mbG9vcixuYXRpdmVHZXRTeW1ib2xzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsbmF0aXZlSXNCdWZmZXI9QnVmZmVyP0J1ZmZlci5pc0J1ZmZlcjp1bmRlZmluZWQsbmF0aXZlSXNGaW5pdGU9Y29udGV4dC5pc0Zpbml0ZSxuYXRpdmVKb2luPWFycmF5UHJvdG8uam9pbixuYXRpdmVLZXlzPW92ZXJBcmcoT2JqZWN0LmtleXMsT2JqZWN0KSxuYXRpdmVNYXg9TWF0aC5tYXgsbmF0aXZlTWluPU1hdGgubWluLG5hdGl2ZU5vdz1EYXRlLm5vdyxuYXRpdmVQYXJzZUludD1jb250ZXh0LnBhcnNlSW50LG5hdGl2ZVJhbmRvbT0KTWF0aC5yYW5kb20sbmF0aXZlUmV2ZXJzZT1hcnJheVByb3RvLnJldmVyc2U7dmFyIERhdGFWaWV3PWdldE5hdGl2ZShjb250ZXh0LCJEYXRhVmlldyIpLE1hcD1nZXROYXRpdmUoY29udGV4dCwiTWFwIiksUHJvbWlzZT1nZXROYXRpdmUoY29udGV4dCwiUHJvbWlzZSIpLFNldD1nZXROYXRpdmUoY29udGV4dCwiU2V0IiksV2Vha01hcD1nZXROYXRpdmUoY29udGV4dCwiV2Vha01hcCIpLG5hdGl2ZUNyZWF0ZT1nZXROYXRpdmUoT2JqZWN0LCJjcmVhdGUiKTt2YXIgbWV0YU1hcD1XZWFrTWFwJiZuZXcgV2Vha01hcDt2YXIgcmVhbE5hbWVzPXt9O3ZhciBkYXRhVmlld0N0b3JTdHJpbmc9dG9Tb3VyY2UoRGF0YVZpZXcpLG1hcEN0b3JTdHJpbmc9dG9Tb3VyY2UoTWFwKSxwcm9taXNlQ3RvclN0cmluZz10b1NvdXJjZShQcm9taXNlKSxzZXRDdG9yU3RyaW5nPXRvU291cmNlKFNldCksd2Vha01hcEN0b3JTdHJpbmc9dG9Tb3VyY2UoV2Vha01hcCk7dmFyIHN5bWJvbFByb3RvPVN5bWJvbD8KU3ltYm9sLnByb3RvdHlwZTp1bmRlZmluZWQsc3ltYm9sVmFsdWVPZj1zeW1ib2xQcm90bz9zeW1ib2xQcm90by52YWx1ZU9mOnVuZGVmaW5lZCxzeW1ib2xUb1N0cmluZz1zeW1ib2xQcm90bz9zeW1ib2xQcm90by50b1N0cmluZzp1bmRlZmluZWQ7ZnVuY3Rpb24gbG9kYXNoKHZhbHVlKXtpZihpc09iamVjdExpa2UodmFsdWUpJiYhaXNBcnJheSh2YWx1ZSkmJiEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikpe2lmKHZhbHVlIGluc3RhbmNlb2YgTG9kYXNoV3JhcHBlcilyZXR1cm4gdmFsdWU7aWYoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwiX193cmFwcGVkX18iKSlyZXR1cm4gd3JhcHBlckNsb25lKHZhbHVlKX1yZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodmFsdWUpfXZhciBiYXNlQ3JlYXRlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gb2JqZWN0KCl7fXJldHVybiBmdW5jdGlvbihwcm90byl7aWYoIWlzT2JqZWN0KHByb3RvKSlyZXR1cm57fTtpZihvYmplY3RDcmVhdGUpcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7Cm9iamVjdC5wcm90b3R5cGU9cHJvdG87dmFyIHJlc3VsdD1uZXcgb2JqZWN0O29iamVjdC5wcm90b3R5cGU9dW5kZWZpbmVkO3JldHVybiByZXN1bHR9fSgpO2Z1bmN0aW9uIGJhc2VMb2Rhc2goKXt9ZnVuY3Rpb24gTG9kYXNoV3JhcHBlcih2YWx1ZSxjaGFpbkFsbCl7dGhpcy5fX3dyYXBwZWRfXz12YWx1ZTt0aGlzLl9fYWN0aW9uc19fPVtdO3RoaXMuX19jaGFpbl9fPSEhY2hhaW5BbGw7dGhpcy5fX2luZGV4X189MDt0aGlzLl9fdmFsdWVzX189dW5kZWZpbmVkfWxvZGFzaC50ZW1wbGF0ZVNldHRpbmdzPXsiZXNjYXBlIjpyZUVzY2FwZSwiZXZhbHVhdGUiOnJlRXZhbHVhdGUsImludGVycG9sYXRlIjpyZUludGVycG9sYXRlLCJ2YXJpYWJsZSI6IiIsImltcG9ydHMiOnsiXyI6bG9kYXNofX07bG9kYXNoLnByb3RvdHlwZT1iYXNlTG9kYXNoLnByb3RvdHlwZTtsb2Rhc2gucHJvdG90eXBlLmNvbnN0cnVjdG9yPWxvZGFzaDtMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZT1iYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTsKTG9kYXNoV3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3I9TG9kYXNoV3JhcHBlcjtmdW5jdGlvbiBMYXp5V3JhcHBlcih2YWx1ZSl7dGhpcy5fX3dyYXBwZWRfXz12YWx1ZTt0aGlzLl9fYWN0aW9uc19fPVtdO3RoaXMuX19kaXJfXz0xO3RoaXMuX19maWx0ZXJlZF9fPWZhbHNlO3RoaXMuX19pdGVyYXRlZXNfXz1bXTt0aGlzLl9fdGFrZUNvdW50X189TUFYX0FSUkFZX0xFTkdUSDt0aGlzLl9fdmlld3NfXz1bXX1mdW5jdGlvbiBsYXp5Q2xvbmUoKXt2YXIgcmVzdWx0PW5ldyBMYXp5V3JhcHBlcih0aGlzLl9fd3JhcHBlZF9fKTtyZXN1bHQuX19hY3Rpb25zX189Y29weUFycmF5KHRoaXMuX19hY3Rpb25zX18pO3Jlc3VsdC5fX2Rpcl9fPXRoaXMuX19kaXJfXztyZXN1bHQuX19maWx0ZXJlZF9fPXRoaXMuX19maWx0ZXJlZF9fO3Jlc3VsdC5fX2l0ZXJhdGVlc19fPWNvcHlBcnJheSh0aGlzLl9faXRlcmF0ZWVzX18pO3Jlc3VsdC5fX3Rha2VDb3VudF9fPXRoaXMuX190YWtlQ291bnRfXzsKcmVzdWx0Ll9fdmlld3NfXz1jb3B5QXJyYXkodGhpcy5fX3ZpZXdzX18pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gbGF6eVJldmVyc2UoKXtpZih0aGlzLl9fZmlsdGVyZWRfXyl7dmFyIHJlc3VsdD1uZXcgTGF6eVdyYXBwZXIodGhpcyk7cmVzdWx0Ll9fZGlyX189LTE7cmVzdWx0Ll9fZmlsdGVyZWRfXz10cnVlfWVsc2V7cmVzdWx0PXRoaXMuY2xvbmUoKTtyZXN1bHQuX19kaXJfXyo9LTF9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBsYXp5VmFsdWUoKXt2YXIgYXJyYXk9dGhpcy5fX3dyYXBwZWRfXy52YWx1ZSgpLGRpcj10aGlzLl9fZGlyX18saXNBcnI9aXNBcnJheShhcnJheSksaXNSaWdodD1kaXI8MCxhcnJMZW5ndGg9aXNBcnI/YXJyYXkubGVuZ3RoOjAsdmlldz1nZXRWaWV3KDAsYXJyTGVuZ3RoLHRoaXMuX192aWV3c19fKSxzdGFydD12aWV3LnN0YXJ0LGVuZD12aWV3LmVuZCxsZW5ndGg9ZW5kLXN0YXJ0LGluZGV4PWlzUmlnaHQ/ZW5kOnN0YXJ0LTEsaXRlcmF0ZWVzPXRoaXMuX19pdGVyYXRlZXNfXywKaXRlckxlbmd0aD1pdGVyYXRlZXMubGVuZ3RoLHJlc0luZGV4PTAsdGFrZUNvdW50PW5hdGl2ZU1pbihsZW5ndGgsdGhpcy5fX3Rha2VDb3VudF9fKTtpZighaXNBcnJ8fCFpc1JpZ2h0JiZhcnJMZW5ndGg9PWxlbmd0aCYmdGFrZUNvdW50PT1sZW5ndGgpcmV0dXJuIGJhc2VXcmFwcGVyVmFsdWUoYXJyYXksdGhpcy5fX2FjdGlvbnNfXyk7dmFyIHJlc3VsdD1bXTtvdXRlcjp3aGlsZShsZW5ndGgtLSYmcmVzSW5kZXg8dGFrZUNvdW50KXtpbmRleCs9ZGlyO3ZhciBpdGVySW5kZXg9LTEsdmFsdWU9YXJyYXlbaW5kZXhdO3doaWxlKCsraXRlckluZGV4PGl0ZXJMZW5ndGgpe3ZhciBkYXRhPWl0ZXJhdGVlc1tpdGVySW5kZXhdLGl0ZXJhdGVlPWRhdGEuaXRlcmF0ZWUsdHlwZT1kYXRhLnR5cGUsY29tcHV0ZWQ9aXRlcmF0ZWUodmFsdWUpO2lmKHR5cGU9PUxBWllfTUFQX0ZMQUcpdmFsdWU9Y29tcHV0ZWQ7ZWxzZSBpZighY29tcHV0ZWQpaWYodHlwZT09TEFaWV9GSUxURVJfRkxBRyljb250aW51ZSBvdXRlcjsKZWxzZSBicmVhayBvdXRlcn1yZXN1bHRbcmVzSW5kZXgrK109dmFsdWV9cmV0dXJuIHJlc3VsdH1MYXp5V3JhcHBlci5wcm90b3R5cGU9YmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7TGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPUxhenlXcmFwcGVyO2Z1bmN0aW9uIEhhc2goZW50cmllcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1lbnRyaWVzPT1udWxsPzA6ZW50cmllcy5sZW5ndGg7dGhpcy5jbGVhcigpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZW50cnk9ZW50cmllc1tpbmRleF07dGhpcy5zZXQoZW50cnlbMF0sZW50cnlbMV0pfX1mdW5jdGlvbiBoYXNoQ2xlYXIoKXt0aGlzLl9fZGF0YV9fPW5hdGl2ZUNyZWF0ZT9uYXRpdmVDcmVhdGUobnVsbCk6e307dGhpcy5zaXplPTB9ZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpe3ZhciByZXN1bHQ9dGhpcy5oYXMoa2V5KSYmZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTt0aGlzLnNpemUtPXJlc3VsdD8xOjA7CnJldHVybiByZXN1bHR9ZnVuY3Rpb24gaGFzaEdldChrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187aWYobmF0aXZlQ3JlYXRlKXt2YXIgcmVzdWx0PWRhdGFba2V5XTtyZXR1cm4gcmVzdWx0PT09SEFTSF9VTkRFRklORUQ/dW5kZWZpbmVkOnJlc3VsdH1yZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLGtleSk/ZGF0YVtrZXldOnVuZGVmaW5lZH1mdW5jdGlvbiBoYXNoSGFzKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXztyZXR1cm4gbmF0aXZlQ3JlYXRlP2RhdGFba2V5XSE9PXVuZGVmaW5lZDpoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsa2V5KX1mdW5jdGlvbiBoYXNoU2V0KGtleSx2YWx1ZSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXzt0aGlzLnNpemUrPXRoaXMuaGFzKGtleSk/MDoxO2RhdGFba2V5XT1uYXRpdmVDcmVhdGUmJnZhbHVlPT09dW5kZWZpbmVkP0hBU0hfVU5ERUZJTkVEOnZhbHVlO3JldHVybiB0aGlzfUhhc2gucHJvdG90eXBlLmNsZWFyPWhhc2hDbGVhcjsKSGFzaC5wcm90b3R5cGVbImRlbGV0ZSJdPWhhc2hEZWxldGU7SGFzaC5wcm90b3R5cGUuZ2V0PWhhc2hHZXQ7SGFzaC5wcm90b3R5cGUuaGFzPWhhc2hIYXM7SGFzaC5wcm90b3R5cGUuc2V0PWhhc2hTZXQ7ZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9ZW50cmllcz09bnVsbD8wOmVudHJpZXMubGVuZ3RoO3RoaXMuY2xlYXIoKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGVudHJ5PWVudHJpZXNbaW5kZXhdO3RoaXMuc2V0KGVudHJ5WzBdLGVudHJ5WzFdKX19ZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKXt0aGlzLl9fZGF0YV9fPVtdO3RoaXMuc2l6ZT0wfWZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX18saW5kZXg9YXNzb2NJbmRleE9mKGRhdGEsa2V5KTtpZihpbmRleDwwKXJldHVybiBmYWxzZTt2YXIgbGFzdEluZGV4PWRhdGEubGVuZ3RoLTE7aWYoaW5kZXg9PWxhc3RJbmRleClkYXRhLnBvcCgpOwplbHNlIHNwbGljZS5jYWxsKGRhdGEsaW5kZXgsMSk7LS10aGlzLnNpemU7cmV0dXJuIHRydWV9ZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxpbmRleD1hc3NvY0luZGV4T2YoZGF0YSxrZXkpO3JldHVybiBpbmRleDwwP3VuZGVmaW5lZDpkYXRhW2luZGV4XVsxXX1mdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KXtyZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sa2V5KT4tMX1mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LHZhbHVlKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fLGluZGV4PWFzc29jSW5kZXhPZihkYXRhLGtleSk7aWYoaW5kZXg8MCl7Kyt0aGlzLnNpemU7ZGF0YS5wdXNoKFtrZXksdmFsdWVdKX1lbHNlIGRhdGFbaW5kZXhdWzFdPXZhbHVlO3JldHVybiB0aGlzfUxpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXI9bGlzdENhY2hlQ2xlYXI7TGlzdENhY2hlLnByb3RvdHlwZVsiZGVsZXRlIl09bGlzdENhY2hlRGVsZXRlO0xpc3RDYWNoZS5wcm90b3R5cGUuZ2V0PQpsaXN0Q2FjaGVHZXQ7TGlzdENhY2hlLnByb3RvdHlwZS5oYXM9bGlzdENhY2hlSGFzO0xpc3RDYWNoZS5wcm90b3R5cGUuc2V0PWxpc3RDYWNoZVNldDtmdW5jdGlvbiBNYXBDYWNoZShlbnRyaWVzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWVudHJpZXM9PW51bGw/MDplbnRyaWVzLmxlbmd0aDt0aGlzLmNsZWFyKCk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBlbnRyeT1lbnRyaWVzW2luZGV4XTt0aGlzLnNldChlbnRyeVswXSxlbnRyeVsxXSl9fWZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKXt0aGlzLnNpemU9MDt0aGlzLl9fZGF0YV9fPXsiaGFzaCI6bmV3IEhhc2gsIm1hcCI6bmV3IChNYXB8fExpc3RDYWNoZSksInN0cmluZyI6bmV3IEhhc2h9fWZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleSl7dmFyIHJlc3VsdD1nZXRNYXBEYXRhKHRoaXMsa2V5KVsiZGVsZXRlIl0oa2V5KTt0aGlzLnNpemUtPXJlc3VsdD8xOjA7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpe3JldHVybiBnZXRNYXBEYXRhKHRoaXMsCmtleSkuZ2V0KGtleSl9ZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KXtyZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLGtleSkuaGFzKGtleSl9ZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LHZhbHVlKXt2YXIgZGF0YT1nZXRNYXBEYXRhKHRoaXMsa2V5KSxzaXplPWRhdGEuc2l6ZTtkYXRhLnNldChrZXksdmFsdWUpO3RoaXMuc2l6ZSs9ZGF0YS5zaXplPT1zaXplPzA6MTtyZXR1cm4gdGhpc31NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXI9bWFwQ2FjaGVDbGVhcjtNYXBDYWNoZS5wcm90b3R5cGVbImRlbGV0ZSJdPW1hcENhY2hlRGVsZXRlO01hcENhY2hlLnByb3RvdHlwZS5nZXQ9bWFwQ2FjaGVHZXQ7TWFwQ2FjaGUucHJvdG90eXBlLmhhcz1tYXBDYWNoZUhhcztNYXBDYWNoZS5wcm90b3R5cGUuc2V0PW1hcENhY2hlU2V0O2Z1bmN0aW9uIFNldENhY2hlKHZhbHVlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD12YWx1ZXM9PW51bGw/MDp2YWx1ZXMubGVuZ3RoO3RoaXMuX19kYXRhX189bmV3IE1hcENhY2hlOwp3aGlsZSgrK2luZGV4PGxlbmd0aCl0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKX1mdW5jdGlvbiBzZXRDYWNoZUFkZCh2YWx1ZSl7dGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsSEFTSF9VTkRFRklORUQpO3JldHVybiB0aGlzfWZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpfVNldENhY2hlLnByb3RvdHlwZS5hZGQ9U2V0Q2FjaGUucHJvdG90eXBlLnB1c2g9c2V0Q2FjaGVBZGQ7U2V0Q2FjaGUucHJvdG90eXBlLmhhcz1zZXRDYWNoZUhhcztmdW5jdGlvbiBTdGFjayhlbnRyaWVzKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fPW5ldyBMaXN0Q2FjaGUoZW50cmllcyk7dGhpcy5zaXplPWRhdGEuc2l6ZX1mdW5jdGlvbiBzdGFja0NsZWFyKCl7dGhpcy5fX2RhdGFfXz1uZXcgTGlzdENhY2hlO3RoaXMuc2l6ZT0wfWZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxyZXN1bHQ9ZGF0YVsiZGVsZXRlIl0oa2V5KTsKdGhpcy5zaXplPWRhdGEuc2l6ZTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHN0YWNrR2V0KGtleSl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSl9ZnVuY3Rpb24gc3RhY2tIYXMoa2V5KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KX1mdW5jdGlvbiBzdGFja1NldChrZXksdmFsdWUpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187aWYoZGF0YSBpbnN0YW5jZW9mIExpc3RDYWNoZSl7dmFyIHBhaXJzPWRhdGEuX19kYXRhX187aWYoIU1hcHx8cGFpcnMubGVuZ3RoPExBUkdFX0FSUkFZX1NJWkUtMSl7cGFpcnMucHVzaChba2V5LHZhbHVlXSk7dGhpcy5zaXplPSsrZGF0YS5zaXplO3JldHVybiB0aGlzfWRhdGE9dGhpcy5fX2RhdGFfXz1uZXcgTWFwQ2FjaGUocGFpcnMpfWRhdGEuc2V0KGtleSx2YWx1ZSk7dGhpcy5zaXplPWRhdGEuc2l6ZTtyZXR1cm4gdGhpc31TdGFjay5wcm90b3R5cGUuY2xlYXI9c3RhY2tDbGVhcjtTdGFjay5wcm90b3R5cGVbImRlbGV0ZSJdPXN0YWNrRGVsZXRlOwpTdGFjay5wcm90b3R5cGUuZ2V0PXN0YWNrR2V0O1N0YWNrLnByb3RvdHlwZS5oYXM9c3RhY2tIYXM7U3RhY2sucHJvdG90eXBlLnNldD1zdGFja1NldDtmdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLGluaGVyaXRlZCl7dmFyIGlzQXJyPWlzQXJyYXkodmFsdWUpLGlzQXJnPSFpc0FyciYmaXNBcmd1bWVudHModmFsdWUpLGlzQnVmZj0haXNBcnImJiFpc0FyZyYmaXNCdWZmZXIodmFsdWUpLGlzVHlwZT0haXNBcnImJiFpc0FyZyYmIWlzQnVmZiYmaXNUeXBlZEFycmF5KHZhbHVlKSxza2lwSW5kZXhlcz1pc0Fycnx8aXNBcmd8fGlzQnVmZnx8aXNUeXBlLHJlc3VsdD1za2lwSW5kZXhlcz9iYXNlVGltZXModmFsdWUubGVuZ3RoLFN0cmluZyk6W10sbGVuZ3RoPXJlc3VsdC5sZW5ndGg7Zm9yKHZhciBrZXkgaW4gdmFsdWUpaWYoKGluaGVyaXRlZHx8aGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSxrZXkpKSYmIShza2lwSW5kZXhlcyYmKGtleT09Imxlbmd0aCJ8fGlzQnVmZiYmKGtleT09CiJvZmZzZXQifHxrZXk9PSJwYXJlbnQiKXx8aXNUeXBlJiYoa2V5PT0iYnVmZmVyInx8a2V5PT0iYnl0ZUxlbmd0aCJ8fGtleT09ImJ5dGVPZmZzZXQiKXx8aXNJbmRleChrZXksbGVuZ3RoKSkpKXJlc3VsdC5wdXNoKGtleSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBhcnJheVNhbXBsZShhcnJheSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9hcnJheVtiYXNlUmFuZG9tKDAsbGVuZ3RoLTEpXTp1bmRlZmluZWR9ZnVuY3Rpb24gYXJyYXlTYW1wbGVTaXplKGFycmF5LG4pe3JldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpLGJhc2VDbGFtcChuLDAsYXJyYXkubGVuZ3RoKSl9ZnVuY3Rpb24gYXJyYXlTaHVmZmxlKGFycmF5KXtyZXR1cm4gc2h1ZmZsZVNlbGYoY29weUFycmF5KGFycmF5KSl9ZnVuY3Rpb24gYXNzaWduTWVyZ2VWYWx1ZShvYmplY3Qsa2V5LHZhbHVlKXtpZih2YWx1ZSE9PXVuZGVmaW5lZCYmIWVxKG9iamVjdFtrZXldLHZhbHVlKXx8CnZhbHVlPT09dW5kZWZpbmVkJiYhKGtleSBpbiBvYmplY3QpKWJhc2VBc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHZhbHVlKX1mdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHZhbHVlKXt2YXIgb2JqVmFsdWU9b2JqZWN0W2tleV07aWYoIShoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpJiZlcShvYmpWYWx1ZSx2YWx1ZSkpfHx2YWx1ZT09PXVuZGVmaW5lZCYmIShrZXkgaW4gb2JqZWN0KSliYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSx2YWx1ZSl9ZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LGtleSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUobGVuZ3RoLS0paWYoZXEoYXJyYXlbbGVuZ3RoXVswXSxrZXkpKXJldHVybiBsZW5ndGg7cmV0dXJuLTF9ZnVuY3Rpb24gYmFzZUFnZ3JlZ2F0b3IoY29sbGVjdGlvbixzZXR0ZXIsaXRlcmF0ZWUsYWNjdW11bGF0b3Ipe2Jhc2VFYWNoKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUsa2V5LGNvbGxlY3Rpb24pe3NldHRlcihhY2N1bXVsYXRvciwKdmFsdWUsaXRlcmF0ZWUodmFsdWUpLGNvbGxlY3Rpb24pfSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LHNvdXJjZSl7cmV0dXJuIG9iamVjdCYmY29weU9iamVjdChzb3VyY2Usa2V5cyhzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gYmFzZUFzc2lnbkluKG9iamVjdCxzb3VyY2Upe3JldHVybiBvYmplY3QmJmNvcHlPYmplY3Qoc291cmNlLGtleXNJbihzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCxrZXksdmFsdWUpe2lmKGtleT09Il9fcHJvdG9fXyImJmRlZmluZVByb3BlcnR5KWRlZmluZVByb3BlcnR5KG9iamVjdCxrZXkseyJjb25maWd1cmFibGUiOnRydWUsImVudW1lcmFibGUiOnRydWUsInZhbHVlIjp2YWx1ZSwid3JpdGFibGUiOnRydWV9KTtlbHNlIG9iamVjdFtrZXldPXZhbHVlfWZ1bmN0aW9uIGJhc2VBdChvYmplY3QscGF0aHMpe3ZhciBpbmRleD0tMSxsZW5ndGg9cGF0aHMubGVuZ3RoLHJlc3VsdD0KQXJyYXkobGVuZ3RoKSxza2lwPW9iamVjdD09bnVsbDt3aGlsZSgrK2luZGV4PGxlbmd0aClyZXN1bHRbaW5kZXhdPXNraXA/dW5kZWZpbmVkOmdldChvYmplY3QscGF0aHNbaW5kZXhdKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VDbGFtcChudW1iZXIsbG93ZXIsdXBwZXIpe2lmKG51bWJlcj09PW51bWJlcil7aWYodXBwZXIhPT11bmRlZmluZWQpbnVtYmVyPW51bWJlcjw9dXBwZXI/bnVtYmVyOnVwcGVyO2lmKGxvd2VyIT09dW5kZWZpbmVkKW51bWJlcj1udW1iZXI+PWxvd2VyP251bWJlcjpsb3dlcn1yZXR1cm4gbnVtYmVyfWZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsa2V5LG9iamVjdCxzdGFjayl7dmFyIHJlc3VsdCxpc0RlZXA9Yml0bWFzayZDTE9ORV9ERUVQX0ZMQUcsaXNGbGF0PWJpdG1hc2smQ0xPTkVfRkxBVF9GTEFHLGlzRnVsbD1iaXRtYXNrJkNMT05FX1NZTUJPTFNfRkxBRztpZihjdXN0b21pemVyKXJlc3VsdD1vYmplY3Q/CmN1c3RvbWl6ZXIodmFsdWUsa2V5LG9iamVjdCxzdGFjayk6Y3VzdG9taXplcih2YWx1ZSk7aWYocmVzdWx0IT09dW5kZWZpbmVkKXJldHVybiByZXN1bHQ7aWYoIWlzT2JqZWN0KHZhbHVlKSlyZXR1cm4gdmFsdWU7dmFyIGlzQXJyPWlzQXJyYXkodmFsdWUpO2lmKGlzQXJyKXtyZXN1bHQ9aW5pdENsb25lQXJyYXkodmFsdWUpO2lmKCFpc0RlZXApcmV0dXJuIGNvcHlBcnJheSh2YWx1ZSxyZXN1bHQpfWVsc2V7dmFyIHRhZz1nZXRUYWcodmFsdWUpLGlzRnVuYz10YWc9PWZ1bmNUYWd8fHRhZz09Z2VuVGFnO2lmKGlzQnVmZmVyKHZhbHVlKSlyZXR1cm4gY2xvbmVCdWZmZXIodmFsdWUsaXNEZWVwKTtpZih0YWc9PW9iamVjdFRhZ3x8dGFnPT1hcmdzVGFnfHxpc0Z1bmMmJiFvYmplY3Qpe3Jlc3VsdD1pc0ZsYXR8fGlzRnVuYz97fTppbml0Q2xvbmVPYmplY3QodmFsdWUpO2lmKCFpc0RlZXApcmV0dXJuIGlzRmxhdD9jb3B5U3ltYm9sc0luKHZhbHVlLGJhc2VBc3NpZ25JbihyZXN1bHQsCnZhbHVlKSk6Y29weVN5bWJvbHModmFsdWUsYmFzZUFzc2lnbihyZXN1bHQsdmFsdWUpKX1lbHNle2lmKCFjbG9uZWFibGVUYWdzW3RhZ10pcmV0dXJuIG9iamVjdD92YWx1ZTp7fTtyZXN1bHQ9aW5pdENsb25lQnlUYWcodmFsdWUsdGFnLGlzRGVlcCl9fXN0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTt2YXIgc3RhY2tlZD1zdGFjay5nZXQodmFsdWUpO2lmKHN0YWNrZWQpcmV0dXJuIHN0YWNrZWQ7c3RhY2suc2V0KHZhbHVlLHJlc3VsdCk7aWYoaXNTZXQodmFsdWUpKXt2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlKXtyZXN1bHQuYWRkKGJhc2VDbG9uZShzdWJWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3ViVmFsdWUsdmFsdWUsc3RhY2spKX0pO3JldHVybiByZXN1bHR9aWYoaXNNYXAodmFsdWUpKXt2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlLGtleSl7cmVzdWx0LnNldChrZXksYmFzZUNsb25lKHN1YlZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixrZXksdmFsdWUsCnN0YWNrKSl9KTtyZXR1cm4gcmVzdWx0fXZhciBrZXlzRnVuYz1pc0Z1bGw/aXNGbGF0P2dldEFsbEtleXNJbjpnZXRBbGxLZXlzOmlzRmxhdD9rZXlzSW46a2V5czt2YXIgcHJvcHM9aXNBcnI/dW5kZWZpbmVkOmtleXNGdW5jKHZhbHVlKTthcnJheUVhY2gocHJvcHN8fHZhbHVlLGZ1bmN0aW9uKHN1YlZhbHVlLGtleSl7aWYocHJvcHMpe2tleT1zdWJWYWx1ZTtzdWJWYWx1ZT12YWx1ZVtrZXldfWFzc2lnblZhbHVlKHJlc3VsdCxrZXksYmFzZUNsb25lKHN1YlZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixrZXksdmFsdWUsc3RhY2spKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUNvbmZvcm1zKHNvdXJjZSl7dmFyIHByb3BzPWtleXMoc291cmNlKTtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtyZXR1cm4gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LHNvdXJjZSxwcm9wcyl9fWZ1bmN0aW9uIGJhc2VDb25mb3Jtc1RvKG9iamVjdCxzb3VyY2UscHJvcHMpe3ZhciBsZW5ndGg9cHJvcHMubGVuZ3RoOwppZihvYmplY3Q9PW51bGwpcmV0dXJuIWxlbmd0aDtvYmplY3Q9T2JqZWN0KG9iamVjdCk7d2hpbGUobGVuZ3RoLS0pe3ZhciBrZXk9cHJvcHNbbGVuZ3RoXSxwcmVkaWNhdGU9c291cmNlW2tleV0sdmFsdWU9b2JqZWN0W2tleV07aWYodmFsdWU9PT11bmRlZmluZWQmJiEoa2V5IGluIG9iamVjdCl8fCFwcmVkaWNhdGUodmFsdWUpKXJldHVybiBmYWxzZX1yZXR1cm4gdHJ1ZX1mdW5jdGlvbiBiYXNlRGVsYXkoZnVuYyx3YWl0LGFyZ3Mpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe2Z1bmMuYXBwbHkodW5kZWZpbmVkLGFyZ3MpfSx3YWl0KX1mdW5jdGlvbiBiYXNlRGlmZmVyZW5jZShhcnJheSx2YWx1ZXMsaXRlcmF0ZWUsY29tcGFyYXRvcil7dmFyIGluZGV4PS0xLGluY2x1ZGVzPWFycmF5SW5jbHVkZXMsaXNDb21tb249dHJ1ZSxsZW5ndGg9YXJyYXkubGVuZ3RoLApyZXN1bHQ9W10sdmFsdWVzTGVuZ3RoPXZhbHVlcy5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4gcmVzdWx0O2lmKGl0ZXJhdGVlKXZhbHVlcz1hcnJheU1hcCh2YWx1ZXMsYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7aWYoY29tcGFyYXRvcil7aW5jbHVkZXM9YXJyYXlJbmNsdWRlc1dpdGg7aXNDb21tb249ZmFsc2V9ZWxzZSBpZih2YWx1ZXMubGVuZ3RoPj1MQVJHRV9BUlJBWV9TSVpFKXtpbmNsdWRlcz1jYWNoZUhhcztpc0NvbW1vbj1mYWxzZTt2YWx1ZXM9bmV3IFNldENhY2hlKHZhbHVlcyl9b3V0ZXI6d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF0sY29tcHV0ZWQ9aXRlcmF0ZWU9PW51bGw/dmFsdWU6aXRlcmF0ZWUodmFsdWUpO3ZhbHVlPWNvbXBhcmF0b3J8fHZhbHVlIT09MD92YWx1ZTowO2lmKGlzQ29tbW9uJiZjb21wdXRlZD09PWNvbXB1dGVkKXt2YXIgdmFsdWVzSW5kZXg9dmFsdWVzTGVuZ3RoO3doaWxlKHZhbHVlc0luZGV4LS0paWYodmFsdWVzW3ZhbHVlc0luZGV4XT09PQpjb21wdXRlZCljb250aW51ZSBvdXRlcjtyZXN1bHQucHVzaCh2YWx1ZSl9ZWxzZSBpZighaW5jbHVkZXModmFsdWVzLGNvbXB1dGVkLGNvbXBhcmF0b3IpKXJlc3VsdC5wdXNoKHZhbHVlKX1yZXR1cm4gcmVzdWx0fXZhciBiYXNlRWFjaD1jcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTt2YXIgYmFzZUVhY2hSaWdodD1jcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duUmlnaHQsdHJ1ZSk7ZnVuY3Rpb24gYmFzZUV2ZXJ5KGNvbGxlY3Rpb24scHJlZGljYXRlKXt2YXIgcmVzdWx0PXRydWU7YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXtyZXN1bHQ9ISFwcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbik7cmV0dXJuIHJlc3VsdH0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUV4dHJlbXVtKGFycmF5LGl0ZXJhdGVlLGNvbXBhcmF0b3Ipe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9CmFycmF5W2luZGV4XSxjdXJyZW50PWl0ZXJhdGVlKHZhbHVlKTtpZihjdXJyZW50IT1udWxsJiYoY29tcHV0ZWQ9PT11bmRlZmluZWQ/Y3VycmVudD09PWN1cnJlbnQmJiFpc1N5bWJvbChjdXJyZW50KTpjb21wYXJhdG9yKGN1cnJlbnQsY29tcHV0ZWQpKSl2YXIgY29tcHV0ZWQ9Y3VycmVudCxyZXN1bHQ9dmFsdWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmlsbChhcnJheSx2YWx1ZSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO3N0YXJ0PXRvSW50ZWdlcihzdGFydCk7aWYoc3RhcnQ8MClzdGFydD0tc3RhcnQ+bGVuZ3RoPzA6bGVuZ3RoK3N0YXJ0O2VuZD1lbmQ9PT11bmRlZmluZWR8fGVuZD5sZW5ndGg/bGVuZ3RoOnRvSW50ZWdlcihlbmQpO2lmKGVuZDwwKWVuZCs9bGVuZ3RoO2VuZD1zdGFydD5lbmQ/MDp0b0xlbmd0aChlbmQpO3doaWxlKHN0YXJ0PGVuZClhcnJheVtzdGFydCsrXT12YWx1ZTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYmFzZUZpbHRlcihjb2xsZWN0aW9uLApwcmVkaWNhdGUpe3ZhciByZXN1bHQ9W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXtpZihwcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbikpcmVzdWx0LnB1c2godmFsdWUpfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSxkZXB0aCxwcmVkaWNhdGUsaXNTdHJpY3QscmVzdWx0KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDtwcmVkaWNhdGV8fChwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZSk7cmVzdWx0fHwocmVzdWx0PVtdKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihkZXB0aD4wJiZwcmVkaWNhdGUodmFsdWUpKWlmKGRlcHRoPjEpYmFzZUZsYXR0ZW4odmFsdWUsZGVwdGgtMSxwcmVkaWNhdGUsaXNTdHJpY3QscmVzdWx0KTtlbHNlIGFycmF5UHVzaChyZXN1bHQsdmFsdWUpO2Vsc2UgaWYoIWlzU3RyaWN0KXJlc3VsdFtyZXN1bHQubGVuZ3RoXT0KdmFsdWV9cmV0dXJuIHJlc3VsdH12YXIgYmFzZUZvcj1jcmVhdGVCYXNlRm9yKCk7dmFyIGJhc2VGb3JSaWdodD1jcmVhdGVCYXNlRm9yKHRydWUpO2Z1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yKG9iamVjdCxpdGVyYXRlZSxrZXlzKX1mdW5jdGlvbiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yUmlnaHQob2JqZWN0LGl0ZXJhdGVlLGtleXMpfWZ1bmN0aW9uIGJhc2VGdW5jdGlvbnMob2JqZWN0LHByb3BzKXtyZXR1cm4gYXJyYXlGaWx0ZXIocHJvcHMsZnVuY3Rpb24oa2V5KXtyZXR1cm4gaXNGdW5jdGlvbihvYmplY3Rba2V5XSl9KX1mdW5jdGlvbiBiYXNlR2V0KG9iamVjdCxwYXRoKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9MCxsZW5ndGg9cGF0aC5sZW5ndGg7d2hpbGUob2JqZWN0IT1udWxsJiZpbmRleDxsZW5ndGgpb2JqZWN0PW9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07CnJldHVybiBpbmRleCYmaW5kZXg9PWxlbmd0aD9vYmplY3Q6dW5kZWZpbmVkfWZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCxrZXlzRnVuYyxzeW1ib2xzRnVuYyl7dmFyIHJlc3VsdD1rZXlzRnVuYyhvYmplY3QpO3JldHVybiBpc0FycmF5KG9iamVjdCk/cmVzdWx0OmFycmF5UHVzaChyZXN1bHQsc3ltYm9sc0Z1bmMob2JqZWN0KSl9ZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSl7aWYodmFsdWU9PW51bGwpcmV0dXJuIHZhbHVlPT09dW5kZWZpbmVkP3VuZGVmaW5lZFRhZzpudWxsVGFnO3JldHVybiBzeW1Ub1N0cmluZ1RhZyYmc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKT9nZXRSYXdUYWcodmFsdWUpOm9iamVjdFRvU3RyaW5nKHZhbHVlKX1mdW5jdGlvbiBiYXNlR3QodmFsdWUsb3RoZXIpe3JldHVybiB2YWx1ZT5vdGhlcn1mdW5jdGlvbiBiYXNlSGFzKG9iamVjdCxrZXkpe3JldHVybiBvYmplY3QhPW51bGwmJmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LAprZXkpfWZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3Qsa2V5KXtyZXR1cm4gb2JqZWN0IT1udWxsJiZrZXkgaW4gT2JqZWN0KG9iamVjdCl9ZnVuY3Rpb24gYmFzZUluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl7cmV0dXJuIG51bWJlcj49bmF0aXZlTWluKHN0YXJ0LGVuZCkmJm51bWJlcjxuYXRpdmVNYXgoc3RhcnQsZW5kKX1mdW5jdGlvbiBiYXNlSW50ZXJzZWN0aW9uKGFycmF5cyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5jbHVkZXM9Y29tcGFyYXRvcj9hcnJheUluY2x1ZGVzV2l0aDphcnJheUluY2x1ZGVzLGxlbmd0aD1hcnJheXNbMF0ubGVuZ3RoLG90aExlbmd0aD1hcnJheXMubGVuZ3RoLG90aEluZGV4PW90aExlbmd0aCxjYWNoZXM9QXJyYXkob3RoTGVuZ3RoKSxtYXhMZW5ndGg9SW5maW5pdHkscmVzdWx0PVtdO3doaWxlKG90aEluZGV4LS0pe3ZhciBhcnJheT1hcnJheXNbb3RoSW5kZXhdO2lmKG90aEluZGV4JiZpdGVyYXRlZSlhcnJheT1hcnJheU1hcChhcnJheSwKYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7bWF4TGVuZ3RoPW5hdGl2ZU1pbihhcnJheS5sZW5ndGgsbWF4TGVuZ3RoKTtjYWNoZXNbb3RoSW5kZXhdPSFjb21wYXJhdG9yJiYoaXRlcmF0ZWV8fGxlbmd0aD49MTIwJiZhcnJheS5sZW5ndGg+PTEyMCk/bmV3IFNldENhY2hlKG90aEluZGV4JiZhcnJheSk6dW5kZWZpbmVkfWFycmF5PWFycmF5c1swXTt2YXIgaW5kZXg9LTEsc2Vlbj1jYWNoZXNbMF07b3V0ZXI6d2hpbGUoKytpbmRleDxsZW5ndGgmJnJlc3VsdC5sZW5ndGg8bWF4TGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlP2l0ZXJhdGVlKHZhbHVlKTp2YWx1ZTt2YWx1ZT1jb21wYXJhdG9yfHx2YWx1ZSE9PTA/dmFsdWU6MDtpZighKHNlZW4/Y2FjaGVIYXMoc2Vlbixjb21wdXRlZCk6aW5jbHVkZXMocmVzdWx0LGNvbXB1dGVkLGNvbXBhcmF0b3IpKSl7b3RoSW5kZXg9b3RoTGVuZ3RoO3doaWxlKC0tb3RoSW5kZXgpe3ZhciBjYWNoZT1jYWNoZXNbb3RoSW5kZXhdOwppZighKGNhY2hlP2NhY2hlSGFzKGNhY2hlLGNvbXB1dGVkKTppbmNsdWRlcyhhcnJheXNbb3RoSW5kZXhdLGNvbXB1dGVkLGNvbXBhcmF0b3IpKSljb250aW51ZSBvdXRlcn1pZihzZWVuKXNlZW4ucHVzaChjb21wdXRlZCk7cmVzdWx0LnB1c2godmFsdWUpfX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VJbnZlcnRlcihvYmplY3Qsc2V0dGVyLGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXtiYXNlRm9yT3duKG9iamVjdCxmdW5jdGlvbih2YWx1ZSxrZXksb2JqZWN0KXtzZXR0ZXIoYWNjdW11bGF0b3IsaXRlcmF0ZWUodmFsdWUpLGtleSxvYmplY3QpfSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGJhc2VJbnZva2Uob2JqZWN0LHBhdGgsYXJncyl7cGF0aD1jYXN0UGF0aChwYXRoLG9iamVjdCk7b2JqZWN0PXBhcmVudChvYmplY3QscGF0aCk7dmFyIGZ1bmM9b2JqZWN0PT1udWxsP29iamVjdDpvYmplY3RbdG9LZXkobGFzdChwYXRoKSldO3JldHVybiBmdW5jPT1udWxsP3VuZGVmaW5lZDoKYXBwbHkoZnVuYyxvYmplY3QsYXJncyl9ZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PWFyZ3NUYWd9ZnVuY3Rpb24gYmFzZUlzQXJyYXlCdWZmZXIodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09YXJyYXlCdWZmZXJUYWd9ZnVuY3Rpb24gYmFzZUlzRGF0ZSh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1kYXRlVGFnfWZ1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixzdGFjayl7aWYodmFsdWU9PT1vdGhlcilyZXR1cm4gdHJ1ZTtpZih2YWx1ZT09bnVsbHx8b3RoZXI9PW51bGx8fCFpc09iamVjdExpa2UodmFsdWUpJiYhaXNPYmplY3RMaWtlKG90aGVyKSlyZXR1cm4gdmFsdWUhPT12YWx1ZSYmb3RoZXIhPT1vdGhlcjtyZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLApvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsYmFzZUlzRXF1YWwsc3RhY2spfWZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3Qsb3RoZXIsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl7dmFyIG9iaklzQXJyPWlzQXJyYXkob2JqZWN0KSxvdGhJc0Fycj1pc0FycmF5KG90aGVyKSxvYmpUYWc9b2JqSXNBcnI/YXJyYXlUYWc6Z2V0VGFnKG9iamVjdCksb3RoVGFnPW90aElzQXJyP2FycmF5VGFnOmdldFRhZyhvdGhlcik7b2JqVGFnPW9ialRhZz09YXJnc1RhZz9vYmplY3RUYWc6b2JqVGFnO290aFRhZz1vdGhUYWc9PWFyZ3NUYWc/b2JqZWN0VGFnOm90aFRhZzt2YXIgb2JqSXNPYmo9b2JqVGFnPT1vYmplY3RUYWcsb3RoSXNPYmo9b3RoVGFnPT1vYmplY3RUYWcsaXNTYW1lVGFnPW9ialRhZz09b3RoVGFnO2lmKGlzU2FtZVRhZyYmaXNCdWZmZXIob2JqZWN0KSl7aWYoIWlzQnVmZmVyKG90aGVyKSlyZXR1cm4gZmFsc2U7b2JqSXNBcnI9dHJ1ZTtvYmpJc09iaj0KZmFsc2V9aWYoaXNTYW1lVGFnJiYhb2JqSXNPYmope3N0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTtyZXR1cm4gb2JqSXNBcnJ8fGlzVHlwZWRBcnJheShvYmplY3QpP2VxdWFsQXJyYXlzKG9iamVjdCxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKTplcXVhbEJ5VGFnKG9iamVjdCxvdGhlcixvYmpUYWcsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl9aWYoIShiaXRtYXNrJkNPTVBBUkVfUEFSVElBTF9GTEFHKSl7dmFyIG9iaklzV3JhcHBlZD1vYmpJc09iaiYmaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIl9fd3JhcHBlZF9fIiksb3RoSXNXcmFwcGVkPW90aElzT2JqJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCJfX3dyYXBwZWRfXyIpO2lmKG9iaklzV3JhcHBlZHx8b3RoSXNXcmFwcGVkKXt2YXIgb2JqVW53cmFwcGVkPW9iaklzV3JhcHBlZD9vYmplY3QudmFsdWUoKTpvYmplY3Qsb3RoVW53cmFwcGVkPW90aElzV3JhcHBlZD9vdGhlci52YWx1ZSgpOgpvdGhlcjtzdGFja3x8KHN0YWNrPW5ldyBTdGFjayk7cmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsb3RoVW53cmFwcGVkLGJpdG1hc2ssY3VzdG9taXplcixzdGFjayl9fWlmKCFpc1NhbWVUYWcpcmV0dXJuIGZhbHNlO3N0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTtyZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKX1mdW5jdGlvbiBiYXNlSXNNYXAodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZnZXRUYWcodmFsdWUpPT1tYXBUYWd9ZnVuY3Rpb24gYmFzZUlzTWF0Y2gob2JqZWN0LHNvdXJjZSxtYXRjaERhdGEsY3VzdG9taXplcil7dmFyIGluZGV4PW1hdGNoRGF0YS5sZW5ndGgsbGVuZ3RoPWluZGV4LG5vQ3VzdG9taXplcj0hY3VzdG9taXplcjtpZihvYmplY3Q9PW51bGwpcmV0dXJuIWxlbmd0aDtvYmplY3Q9T2JqZWN0KG9iamVjdCk7d2hpbGUoaW5kZXgtLSl7dmFyIGRhdGE9bWF0Y2hEYXRhW2luZGV4XTsKaWYobm9DdXN0b21pemVyJiZkYXRhWzJdP2RhdGFbMV0hPT1vYmplY3RbZGF0YVswXV06IShkYXRhWzBdaW4gb2JqZWN0KSlyZXR1cm4gZmFsc2V9d2hpbGUoKytpbmRleDxsZW5ndGgpe2RhdGE9bWF0Y2hEYXRhW2luZGV4XTt2YXIga2V5PWRhdGFbMF0sb2JqVmFsdWU9b2JqZWN0W2tleV0sc3JjVmFsdWU9ZGF0YVsxXTtpZihub0N1c3RvbWl6ZXImJmRhdGFbMl0pe2lmKG9ialZhbHVlPT09dW5kZWZpbmVkJiYhKGtleSBpbiBvYmplY3QpKXJldHVybiBmYWxzZX1lbHNle3ZhciBzdGFjaz1uZXcgU3RhY2s7aWYoY3VzdG9taXplcil2YXIgcmVzdWx0PWN1c3RvbWl6ZXIob2JqVmFsdWUsc3JjVmFsdWUsa2V5LG9iamVjdCxzb3VyY2Usc3RhY2spO2lmKCEocmVzdWx0PT09dW5kZWZpbmVkP2Jhc2VJc0VxdWFsKHNyY1ZhbHVlLG9ialZhbHVlLENPTVBBUkVfUEFSVElBTF9GTEFHfENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsY3VzdG9taXplcixzdGFjayk6cmVzdWx0KSlyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfQpmdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpe2lmKCFpc09iamVjdCh2YWx1ZSl8fGlzTWFza2VkKHZhbHVlKSlyZXR1cm4gZmFsc2U7dmFyIHBhdHRlcm49aXNGdW5jdGlvbih2YWx1ZSk/cmVJc05hdGl2ZTpyZUlzSG9zdEN0b3I7cmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpfWZ1bmN0aW9uIGJhc2VJc1JlZ0V4cCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1yZWdleHBUYWd9ZnVuY3Rpb24gYmFzZUlzU2V0KHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmZ2V0VGFnKHZhbHVlKT09c2V0VGFnfWZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpJiYhIXR5cGVkQXJyYXlUYWdzW2Jhc2VHZXRUYWcodmFsdWUpXX1mdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09ImZ1bmN0aW9uIilyZXR1cm4gdmFsdWU7CmlmKHZhbHVlPT1udWxsKXJldHVybiBpZGVudGl0eTtpZih0eXBlb2YgdmFsdWU9PSJvYmplY3QiKXJldHVybiBpc0FycmF5KHZhbHVlKT9iYXNlTWF0Y2hlc1Byb3BlcnR5KHZhbHVlWzBdLHZhbHVlWzFdKTpiYXNlTWF0Y2hlcyh2YWx1ZSk7cmV0dXJuIHByb3BlcnR5KHZhbHVlKX1mdW5jdGlvbiBiYXNlS2V5cyhvYmplY3Qpe2lmKCFpc1Byb3RvdHlwZShvYmplY3QpKXJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7dmFyIHJlc3VsdD1bXTtmb3IodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSlpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpJiZrZXkhPSJjb25zdHJ1Y3RvciIpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VLZXlzSW4ob2JqZWN0KXtpZighaXNPYmplY3Qob2JqZWN0KSlyZXR1cm4gbmF0aXZlS2V5c0luKG9iamVjdCk7dmFyIGlzUHJvdG89aXNQcm90b3R5cGUob2JqZWN0KSxyZXN1bHQ9W107Zm9yKHZhciBrZXkgaW4gb2JqZWN0KWlmKCEoa2V5PT0KImNvbnN0cnVjdG9yIiYmKGlzUHJvdG98fCFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpKSkpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VMdCh2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPG90aGVyfWZ1bmN0aW9uIGJhc2VNYXAoY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGluZGV4PS0xLHJlc3VsdD1pc0FycmF5TGlrZShjb2xsZWN0aW9uKT9BcnJheShjb2xsZWN0aW9uLmxlbmd0aCk6W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxrZXksY29sbGVjdGlvbil7cmVzdWx0WysraW5kZXhdPWl0ZXJhdGVlKHZhbHVlLGtleSxjb2xsZWN0aW9uKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKXt2YXIgbWF0Y2hEYXRhPWdldE1hdGNoRGF0YShzb3VyY2UpO2lmKG1hdGNoRGF0YS5sZW5ndGg9PTEmJm1hdGNoRGF0YVswXVsyXSlyZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUobWF0Y2hEYXRhWzBdWzBdLAptYXRjaERhdGFbMF1bMV0pO3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBvYmplY3Q9PT1zb3VyY2V8fGJhc2VJc01hdGNoKG9iamVjdCxzb3VyY2UsbWF0Y2hEYXRhKX19ZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLHNyY1ZhbHVlKXtpZihpc0tleShwYXRoKSYmaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSlyZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUodG9LZXkocGF0aCksc3JjVmFsdWUpO3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3ZhciBvYmpWYWx1ZT1nZXQob2JqZWN0LHBhdGgpO3JldHVybiBvYmpWYWx1ZT09PXVuZGVmaW5lZCYmb2JqVmFsdWU9PT1zcmNWYWx1ZT9oYXNJbihvYmplY3QscGF0aCk6YmFzZUlzRXF1YWwoc3JjVmFsdWUsb2JqVmFsdWUsQ09NUEFSRV9QQVJUSUFMX0ZMQUd8Q09NUEFSRV9VTk9SREVSRURfRkxBRyl9fWZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3Qsc291cmNlLHNyY0luZGV4LGN1c3RvbWl6ZXIsc3RhY2spe2lmKG9iamVjdD09PQpzb3VyY2UpcmV0dXJuO2Jhc2VGb3Ioc291cmNlLGZ1bmN0aW9uKHNyY1ZhbHVlLGtleSl7aWYoaXNPYmplY3Qoc3JjVmFsdWUpKXtzdGFja3x8KHN0YWNrPW5ldyBTdGFjayk7YmFzZU1lcmdlRGVlcChvYmplY3Qsc291cmNlLGtleSxzcmNJbmRleCxiYXNlTWVyZ2UsY3VzdG9taXplcixzdGFjayl9ZWxzZXt2YXIgbmV3VmFsdWU9Y3VzdG9taXplcj9jdXN0b21pemVyKHNhZmVHZXQob2JqZWN0LGtleSksc3JjVmFsdWUsa2V5KyIiLG9iamVjdCxzb3VyY2Usc3RhY2spOnVuZGVmaW5lZDtpZihuZXdWYWx1ZT09PXVuZGVmaW5lZCluZXdWYWx1ZT1zcmNWYWx1ZTthc3NpZ25NZXJnZVZhbHVlKG9iamVjdCxrZXksbmV3VmFsdWUpfX0sa2V5c0luKX1mdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCxzb3VyY2Usa2V5LHNyY0luZGV4LG1lcmdlRnVuYyxjdXN0b21pemVyLHN0YWNrKXt2YXIgb2JqVmFsdWU9c2FmZUdldChvYmplY3Qsa2V5KSxzcmNWYWx1ZT1zYWZlR2V0KHNvdXJjZSwKa2V5KSxzdGFja2VkPXN0YWNrLmdldChzcmNWYWx1ZSk7aWYoc3RhY2tlZCl7YXNzaWduTWVyZ2VWYWx1ZShvYmplY3Qsa2V5LHN0YWNrZWQpO3JldHVybn12YXIgbmV3VmFsdWU9Y3VzdG9taXplcj9jdXN0b21pemVyKG9ialZhbHVlLHNyY1ZhbHVlLGtleSsiIixvYmplY3Qsc291cmNlLHN0YWNrKTp1bmRlZmluZWQ7dmFyIGlzQ29tbW9uPW5ld1ZhbHVlPT09dW5kZWZpbmVkO2lmKGlzQ29tbW9uKXt2YXIgaXNBcnI9aXNBcnJheShzcmNWYWx1ZSksaXNCdWZmPSFpc0FyciYmaXNCdWZmZXIoc3JjVmFsdWUpLGlzVHlwZWQ9IWlzQXJyJiYhaXNCdWZmJiZpc1R5cGVkQXJyYXkoc3JjVmFsdWUpO25ld1ZhbHVlPXNyY1ZhbHVlO2lmKGlzQXJyfHxpc0J1ZmZ8fGlzVHlwZWQpaWYoaXNBcnJheShvYmpWYWx1ZSkpbmV3VmFsdWU9b2JqVmFsdWU7ZWxzZSBpZihpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpbmV3VmFsdWU9Y29weUFycmF5KG9ialZhbHVlKTtlbHNlIGlmKGlzQnVmZil7aXNDb21tb249CmZhbHNlO25ld1ZhbHVlPWNsb25lQnVmZmVyKHNyY1ZhbHVlLHRydWUpfWVsc2UgaWYoaXNUeXBlZCl7aXNDb21tb249ZmFsc2U7bmV3VmFsdWU9Y2xvbmVUeXBlZEFycmF5KHNyY1ZhbHVlLHRydWUpfWVsc2UgbmV3VmFsdWU9W107ZWxzZSBpZihpc1BsYWluT2JqZWN0KHNyY1ZhbHVlKXx8aXNBcmd1bWVudHMoc3JjVmFsdWUpKXtuZXdWYWx1ZT1vYmpWYWx1ZTtpZihpc0FyZ3VtZW50cyhvYmpWYWx1ZSkpbmV3VmFsdWU9dG9QbGFpbk9iamVjdChvYmpWYWx1ZSk7ZWxzZSBpZighaXNPYmplY3Qob2JqVmFsdWUpfHxzcmNJbmRleCYmaXNGdW5jdGlvbihvYmpWYWx1ZSkpbmV3VmFsdWU9aW5pdENsb25lT2JqZWN0KHNyY1ZhbHVlKX1lbHNlIGlzQ29tbW9uPWZhbHNlfWlmKGlzQ29tbW9uKXtzdGFjay5zZXQoc3JjVmFsdWUsbmV3VmFsdWUpO21lcmdlRnVuYyhuZXdWYWx1ZSxzcmNWYWx1ZSxzcmNJbmRleCxjdXN0b21pemVyLHN0YWNrKTtzdGFja1siZGVsZXRlIl0oc3JjVmFsdWUpfWFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LAprZXksbmV3VmFsdWUpfWZ1bmN0aW9uIGJhc2VOdGgoYXJyYXksbil7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm47bis9bjwwP2xlbmd0aDowO3JldHVybiBpc0luZGV4KG4sbGVuZ3RoKT9hcnJheVtuXTp1bmRlZmluZWR9ZnVuY3Rpb24gYmFzZU9yZGVyQnkoY29sbGVjdGlvbixpdGVyYXRlZXMsb3JkZXJzKXt2YXIgaW5kZXg9LTE7aXRlcmF0ZWVzPWFycmF5TWFwKGl0ZXJhdGVlcy5sZW5ndGg/aXRlcmF0ZWVzOltpZGVudGl0eV0sYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTt2YXIgcmVzdWx0PWJhc2VNYXAoY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxrZXksY29sbGVjdGlvbil7dmFyIGNyaXRlcmlhPWFycmF5TWFwKGl0ZXJhdGVlcyxmdW5jdGlvbihpdGVyYXRlZSl7cmV0dXJuIGl0ZXJhdGVlKHZhbHVlKX0pO3JldHVybnsiY3JpdGVyaWEiOmNyaXRlcmlhLCJpbmRleCI6KytpbmRleCwidmFsdWUiOnZhbHVlfX0pO3JldHVybiBiYXNlU29ydEJ5KHJlc3VsdCwKZnVuY3Rpb24ob2JqZWN0LG90aGVyKXtyZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCxvdGhlcixvcmRlcnMpfSl9ZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LHBhdGhzKXtyZXR1cm4gYmFzZVBpY2tCeShvYmplY3QscGF0aHMsZnVuY3Rpb24odmFsdWUscGF0aCl7cmV0dXJuIGhhc0luKG9iamVjdCxwYXRoKX0pfWZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LHBhdGhzLHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1wYXRocy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcGF0aD1wYXRoc1tpbmRleF0sdmFsdWU9YmFzZUdldChvYmplY3QscGF0aCk7aWYocHJlZGljYXRlKHZhbHVlLHBhdGgpKWJhc2VTZXQocmVzdWx0LGNhc3RQYXRoKHBhdGgsb2JqZWN0KSx2YWx1ZSl9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlR2V0KG9iamVjdCxwYXRoKX19CmZ1bmN0aW9uIGJhc2VQdWxsQWxsKGFycmF5LHZhbHVlcyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5kZXhPZj1jb21wYXJhdG9yP2Jhc2VJbmRleE9mV2l0aDpiYXNlSW5kZXhPZixpbmRleD0tMSxsZW5ndGg9dmFsdWVzLmxlbmd0aCxzZWVuPWFycmF5O2lmKGFycmF5PT09dmFsdWVzKXZhbHVlcz1jb3B5QXJyYXkodmFsdWVzKTtpZihpdGVyYXRlZSlzZWVuPWFycmF5TWFwKGFycmF5LGJhc2VVbmFyeShpdGVyYXRlZSkpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZnJvbUluZGV4PTAsdmFsdWU9dmFsdWVzW2luZGV4XSxjb21wdXRlZD1pdGVyYXRlZT9pdGVyYXRlZSh2YWx1ZSk6dmFsdWU7d2hpbGUoKGZyb21JbmRleD1pbmRleE9mKHNlZW4sY29tcHV0ZWQsZnJvbUluZGV4LGNvbXBhcmF0b3IpKT4tMSl7aWYoc2VlbiE9PWFycmF5KXNwbGljZS5jYWxsKHNlZW4sZnJvbUluZGV4LDEpO3NwbGljZS5jYWxsKGFycmF5LGZyb21JbmRleCwxKX19cmV0dXJuIGFycmF5fWZ1bmN0aW9uIGJhc2VQdWxsQXQoYXJyYXksCmluZGV4ZXMpe3ZhciBsZW5ndGg9YXJyYXk/aW5kZXhlcy5sZW5ndGg6MCxsYXN0SW5kZXg9bGVuZ3RoLTE7d2hpbGUobGVuZ3RoLS0pe3ZhciBpbmRleD1pbmRleGVzW2xlbmd0aF07aWYobGVuZ3RoPT1sYXN0SW5kZXh8fGluZGV4IT09cHJldmlvdXMpe3ZhciBwcmV2aW91cz1pbmRleDtpZihpc0luZGV4KGluZGV4KSlzcGxpY2UuY2FsbChhcnJheSxpbmRleCwxKTtlbHNlIGJhc2VVbnNldChhcnJheSxpbmRleCl9fXJldHVybiBhcnJheX1mdW5jdGlvbiBiYXNlUmFuZG9tKGxvd2VyLHVwcGVyKXtyZXR1cm4gbG93ZXIrbmF0aXZlRmxvb3IobmF0aXZlUmFuZG9tKCkqKHVwcGVyLWxvd2VyKzEpKX1mdW5jdGlvbiBiYXNlUmFuZ2Uoc3RhcnQsZW5kLHN0ZXAsZnJvbVJpZ2h0KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQtc3RhcnQpLyhzdGVwfHwxKSksMCkscmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUobGVuZ3RoLS0pe3Jlc3VsdFtmcm9tUmlnaHQ/Cmxlbmd0aDorK2luZGV4XT1zdGFydDtzdGFydCs9c3RlcH1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VSZXBlYXQoc3RyaW5nLG4pe3ZhciByZXN1bHQ9IiI7aWYoIXN0cmluZ3x8bjwxfHxuPk1BWF9TQUZFX0lOVEVHRVIpcmV0dXJuIHJlc3VsdDtkb3tpZihuJTIpcmVzdWx0Kz1zdHJpbmc7bj1uYXRpdmVGbG9vcihuLzIpO2lmKG4pc3RyaW5nKz1zdHJpbmd9d2hpbGUobik7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlUmVzdChmdW5jLHN0YXJ0KXtyZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYyxzdGFydCxpZGVudGl0eSksZnVuYysiIil9ZnVuY3Rpb24gYmFzZVNhbXBsZShjb2xsZWN0aW9uKXtyZXR1cm4gYXJyYXlTYW1wbGUodmFsdWVzKGNvbGxlY3Rpb24pKX1mdW5jdGlvbiBiYXNlU2FtcGxlU2l6ZShjb2xsZWN0aW9uLG4pe3ZhciBhcnJheT12YWx1ZXMoY29sbGVjdGlvbik7cmV0dXJuIHNodWZmbGVTZWxmKGFycmF5LGJhc2VDbGFtcChuLDAsYXJyYXkubGVuZ3RoKSl9CmZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LHBhdGgsdmFsdWUsY3VzdG9taXplcil7aWYoIWlzT2JqZWN0KG9iamVjdCkpcmV0dXJuIG9iamVjdDtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhdGgubGVuZ3RoLGxhc3RJbmRleD1sZW5ndGgtMSxuZXN0ZWQ9b2JqZWN0O3doaWxlKG5lc3RlZCE9bnVsbCYmKytpbmRleDxsZW5ndGgpe3ZhciBrZXk9dG9LZXkocGF0aFtpbmRleF0pLG5ld1ZhbHVlPXZhbHVlO2lmKGluZGV4IT1sYXN0SW5kZXgpe3ZhciBvYmpWYWx1ZT1uZXN0ZWRba2V5XTtuZXdWYWx1ZT1jdXN0b21pemVyP2N1c3RvbWl6ZXIob2JqVmFsdWUsa2V5LG5lc3RlZCk6dW5kZWZpbmVkO2lmKG5ld1ZhbHVlPT09dW5kZWZpbmVkKW5ld1ZhbHVlPWlzT2JqZWN0KG9ialZhbHVlKT9vYmpWYWx1ZTppc0luZGV4KHBhdGhbaW5kZXgrMV0pP1tdOnt9fWFzc2lnblZhbHVlKG5lc3RlZCxrZXksbmV3VmFsdWUpO25lc3RlZD1uZXN0ZWRba2V5XX1yZXR1cm4gb2JqZWN0fQp2YXIgYmFzZVNldERhdGE9IW1ldGFNYXA/aWRlbnRpdHk6ZnVuY3Rpb24oZnVuYyxkYXRhKXttZXRhTWFwLnNldChmdW5jLGRhdGEpO3JldHVybiBmdW5jfTt2YXIgYmFzZVNldFRvU3RyaW5nPSFkZWZpbmVQcm9wZXJ0eT9pZGVudGl0eTpmdW5jdGlvbihmdW5jLHN0cmluZyl7cmV0dXJuIGRlZmluZVByb3BlcnR5KGZ1bmMsInRvU3RyaW5nIix7ImNvbmZpZ3VyYWJsZSI6dHJ1ZSwiZW51bWVyYWJsZSI6ZmFsc2UsInZhbHVlIjpjb25zdGFudChzdHJpbmcpLCJ3cml0YWJsZSI6dHJ1ZX0pfTtmdW5jdGlvbiBiYXNlU2h1ZmZsZShjb2xsZWN0aW9uKXtyZXR1cm4gc2h1ZmZsZVNlbGYodmFsdWVzKGNvbGxlY3Rpb24pKX1mdW5jdGlvbiBiYXNlU2xpY2UoYXJyYXksc3RhcnQsZW5kKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDtpZihzdGFydDwwKXN0YXJ0PS1zdGFydD5sZW5ndGg/MDpsZW5ndGgrc3RhcnQ7ZW5kPWVuZD5sZW5ndGg/bGVuZ3RoOmVuZDtpZihlbmQ8MCllbmQrPQpsZW5ndGg7bGVuZ3RoPXN0YXJ0PmVuZD8wOmVuZC1zdGFydD4+PjA7c3RhcnQ+Pj49MDt2YXIgcmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0W2luZGV4XT1hcnJheVtpbmRleCtzdGFydF07cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlU29tZShjb2xsZWN0aW9uLHByZWRpY2F0ZSl7dmFyIHJlc3VsdDtiYXNlRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGluZGV4LGNvbGxlY3Rpb24pe3Jlc3VsdD1wcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbik7cmV0dXJuIXJlc3VsdH0pO3JldHVybiEhcmVzdWx0fWZ1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleChhcnJheSx2YWx1ZSxyZXRIaWdoZXN0KXt2YXIgbG93PTAsaGlnaD1hcnJheT09bnVsbD9sb3c6YXJyYXkubGVuZ3RoO2lmKHR5cGVvZiB2YWx1ZT09Im51bWJlciImJnZhbHVlPT09dmFsdWUmJmhpZ2g8PUhBTEZfTUFYX0FSUkFZX0xFTkdUSCl7d2hpbGUobG93PGhpZ2gpe3ZhciBtaWQ9CmxvdytoaWdoPj4+MSxjb21wdXRlZD1hcnJheVttaWRdO2lmKGNvbXB1dGVkIT09bnVsbCYmIWlzU3ltYm9sKGNvbXB1dGVkKSYmKHJldEhpZ2hlc3Q/Y29tcHV0ZWQ8PXZhbHVlOmNvbXB1dGVkPHZhbHVlKSlsb3c9bWlkKzE7ZWxzZSBoaWdoPW1pZH1yZXR1cm4gaGlnaH1yZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksdmFsdWUsaWRlbnRpdHkscmV0SGlnaGVzdCl9ZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksdmFsdWUsaXRlcmF0ZWUscmV0SGlnaGVzdCl7dmFsdWU9aXRlcmF0ZWUodmFsdWUpO3ZhciBsb3c9MCxoaWdoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoLHZhbElzTmFOPXZhbHVlIT09dmFsdWUsdmFsSXNOdWxsPXZhbHVlPT09bnVsbCx2YWxJc1N5bWJvbD1pc1N5bWJvbCh2YWx1ZSksdmFsSXNVbmRlZmluZWQ9dmFsdWU9PT11bmRlZmluZWQ7d2hpbGUobG93PGhpZ2gpe3ZhciBtaWQ9bmF0aXZlRmxvb3IoKGxvdytoaWdoKS8yKSxjb21wdXRlZD0KaXRlcmF0ZWUoYXJyYXlbbWlkXSksb3RoSXNEZWZpbmVkPWNvbXB1dGVkIT09dW5kZWZpbmVkLG90aElzTnVsbD1jb21wdXRlZD09PW51bGwsb3RoSXNSZWZsZXhpdmU9Y29tcHV0ZWQ9PT1jb21wdXRlZCxvdGhJc1N5bWJvbD1pc1N5bWJvbChjb21wdXRlZCk7aWYodmFsSXNOYU4pdmFyIHNldExvdz1yZXRIaWdoZXN0fHxvdGhJc1JlZmxleGl2ZTtlbHNlIGlmKHZhbElzVW5kZWZpbmVkKXNldExvdz1vdGhJc1JlZmxleGl2ZSYmKHJldEhpZ2hlc3R8fG90aElzRGVmaW5lZCk7ZWxzZSBpZih2YWxJc051bGwpc2V0TG93PW90aElzUmVmbGV4aXZlJiZvdGhJc0RlZmluZWQmJihyZXRIaWdoZXN0fHwhb3RoSXNOdWxsKTtlbHNlIGlmKHZhbElzU3ltYm9sKXNldExvdz1vdGhJc1JlZmxleGl2ZSYmb3RoSXNEZWZpbmVkJiYhb3RoSXNOdWxsJiYocmV0SGlnaGVzdHx8IW90aElzU3ltYm9sKTtlbHNlIGlmKG90aElzTnVsbHx8b3RoSXNTeW1ib2wpc2V0TG93PWZhbHNlO2Vsc2Ugc2V0TG93PQpyZXRIaWdoZXN0P2NvbXB1dGVkPD12YWx1ZTpjb21wdXRlZDx2YWx1ZTtpZihzZXRMb3cpbG93PW1pZCsxO2Vsc2UgaGlnaD1taWR9cmV0dXJuIG5hdGl2ZU1pbihoaWdoLE1BWF9BUlJBWV9JTkRFWCl9ZnVuY3Rpb24gYmFzZVNvcnRlZFVuaXEoYXJyYXksaXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoLHJlc0luZGV4PTAscmVzdWx0PVtdO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlP2l0ZXJhdGVlKHZhbHVlKTp2YWx1ZTtpZighaW5kZXh8fCFlcShjb21wdXRlZCxzZWVuKSl7dmFyIHNlZW49Y29tcHV0ZWQ7cmVzdWx0W3Jlc0luZGV4KytdPXZhbHVlPT09MD8wOnZhbHVlfX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VUb051bWJlcih2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT0ibnVtYmVyIilyZXR1cm4gdmFsdWU7aWYoaXNTeW1ib2wodmFsdWUpKXJldHVybiBOQU47cmV0dXJuK3ZhbHVlfQpmdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09InN0cmluZyIpcmV0dXJuIHZhbHVlO2lmKGlzQXJyYXkodmFsdWUpKXJldHVybiBhcnJheU1hcCh2YWx1ZSxiYXNlVG9TdHJpbmcpKyIiO2lmKGlzU3ltYm9sKHZhbHVlKSlyZXR1cm4gc3ltYm9sVG9TdHJpbmc/c3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSk6IiI7dmFyIHJlc3VsdD12YWx1ZSsiIjtyZXR1cm4gcmVzdWx0PT0iMCImJjEvdmFsdWU9PS1JTkZJTklUWT8iLTAiOnJlc3VsdH1mdW5jdGlvbiBiYXNlVW5pcShhcnJheSxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5kZXg9LTEsaW5jbHVkZXM9YXJyYXlJbmNsdWRlcyxsZW5ndGg9YXJyYXkubGVuZ3RoLGlzQ29tbW9uPXRydWUscmVzdWx0PVtdLHNlZW49cmVzdWx0O2lmKGNvbXBhcmF0b3Ipe2lzQ29tbW9uPWZhbHNlO2luY2x1ZGVzPWFycmF5SW5jbHVkZXNXaXRofWVsc2UgaWYobGVuZ3RoPj1MQVJHRV9BUlJBWV9TSVpFKXt2YXIgc2V0PQppdGVyYXRlZT9udWxsOmNyZWF0ZVNldChhcnJheSk7aWYoc2V0KXJldHVybiBzZXRUb0FycmF5KHNldCk7aXNDb21tb249ZmFsc2U7aW5jbHVkZXM9Y2FjaGVIYXM7c2Vlbj1uZXcgU2V0Q2FjaGV9ZWxzZSBzZWVuPWl0ZXJhdGVlP1tdOnJlc3VsdDtvdXRlcjp3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XSxjb21wdXRlZD1pdGVyYXRlZT9pdGVyYXRlZSh2YWx1ZSk6dmFsdWU7dmFsdWU9Y29tcGFyYXRvcnx8dmFsdWUhPT0wP3ZhbHVlOjA7aWYoaXNDb21tb24mJmNvbXB1dGVkPT09Y29tcHV0ZWQpe3ZhciBzZWVuSW5kZXg9c2Vlbi5sZW5ndGg7d2hpbGUoc2VlbkluZGV4LS0paWYoc2VlbltzZWVuSW5kZXhdPT09Y29tcHV0ZWQpY29udGludWUgb3V0ZXI7aWYoaXRlcmF0ZWUpc2Vlbi5wdXNoKGNvbXB1dGVkKTtyZXN1bHQucHVzaCh2YWx1ZSl9ZWxzZSBpZighaW5jbHVkZXMoc2Vlbixjb21wdXRlZCxjb21wYXJhdG9yKSl7aWYoc2VlbiE9PXJlc3VsdClzZWVuLnB1c2goY29tcHV0ZWQpOwpyZXN1bHQucHVzaCh2YWx1ZSl9fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVVuc2V0KG9iamVjdCxwYXRoKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTtvYmplY3Q9cGFyZW50KG9iamVjdCxwYXRoKTtyZXR1cm4gb2JqZWN0PT1udWxsfHxkZWxldGUgb2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXX1mdW5jdGlvbiBiYXNlVXBkYXRlKG9iamVjdCxwYXRoLHVwZGF0ZXIsY3VzdG9taXplcil7cmV0dXJuIGJhc2VTZXQob2JqZWN0LHBhdGgsdXBkYXRlcihiYXNlR2V0KG9iamVjdCxwYXRoKSksY3VzdG9taXplcil9ZnVuY3Rpb24gYmFzZVdoaWxlKGFycmF5LHByZWRpY2F0ZSxpc0Ryb3AsZnJvbVJpZ2h0KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxpbmRleD1mcm9tUmlnaHQ/bGVuZ3RoOi0xO3doaWxlKChmcm9tUmlnaHQ/aW5kZXgtLTorK2luZGV4PGxlbmd0aCkmJnByZWRpY2F0ZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpKTtyZXR1cm4gaXNEcm9wP2Jhc2VTbGljZShhcnJheSwKZnJvbVJpZ2h0PzA6aW5kZXgsZnJvbVJpZ2h0P2luZGV4KzE6bGVuZ3RoKTpiYXNlU2xpY2UoYXJyYXksZnJvbVJpZ2h0P2luZGV4KzE6MCxmcm9tUmlnaHQ/bGVuZ3RoOmluZGV4KX1mdW5jdGlvbiBiYXNlV3JhcHBlclZhbHVlKHZhbHVlLGFjdGlvbnMpe3ZhciByZXN1bHQ9dmFsdWU7aWYocmVzdWx0IGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpcmVzdWx0PXJlc3VsdC52YWx1ZSgpO3JldHVybiBhcnJheVJlZHVjZShhY3Rpb25zLGZ1bmN0aW9uKHJlc3VsdCxhY3Rpb24pe3JldHVybiBhY3Rpb24uZnVuYy5hcHBseShhY3Rpb24udGhpc0FyZyxhcnJheVB1c2goW3Jlc3VsdF0sYWN0aW9uLmFyZ3MpKX0scmVzdWx0KX1mdW5jdGlvbiBiYXNlWG9yKGFycmF5cyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgbGVuZ3RoPWFycmF5cy5sZW5ndGg7aWYobGVuZ3RoPDIpcmV0dXJuIGxlbmd0aD9iYXNlVW5pcShhcnJheXNbMF0pOltdO3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobGVuZ3RoKTsKd2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBhcnJheT1hcnJheXNbaW5kZXhdLG90aEluZGV4PS0xO3doaWxlKCsrb3RoSW5kZXg8bGVuZ3RoKWlmKG90aEluZGV4IT1pbmRleClyZXN1bHRbaW5kZXhdPWJhc2VEaWZmZXJlbmNlKHJlc3VsdFtpbmRleF18fGFycmF5LGFycmF5c1tvdGhJbmRleF0saXRlcmF0ZWUsY29tcGFyYXRvcil9cmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKHJlc3VsdCwxKSxpdGVyYXRlZSxjb21wYXJhdG9yKX1mdW5jdGlvbiBiYXNlWmlwT2JqZWN0KHByb3BzLHZhbHVlcyxhc3NpZ25GdW5jKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXByb3BzLmxlbmd0aCx2YWxzTGVuZ3RoPXZhbHVlcy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9aW5kZXg8dmFsc0xlbmd0aD92YWx1ZXNbaW5kZXhdOnVuZGVmaW5lZDthc3NpZ25GdW5jKHJlc3VsdCxwcm9wc1tpbmRleF0sdmFsdWUpfXJldHVybiByZXN1bHR9ZnVuY3Rpb24gY2FzdEFycmF5TGlrZU9iamVjdCh2YWx1ZSl7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKT8KdmFsdWU6W119ZnVuY3Rpb24gY2FzdEZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0iZnVuY3Rpb24iP3ZhbHVlOmlkZW50aXR5fWZ1bmN0aW9uIGNhc3RQYXRoKHZhbHVlLG9iamVjdCl7aWYoaXNBcnJheSh2YWx1ZSkpcmV0dXJuIHZhbHVlO3JldHVybiBpc0tleSh2YWx1ZSxvYmplY3QpP1t2YWx1ZV06c3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSl9dmFyIGNhc3RSZXN0PWJhc2VSZXN0O2Z1bmN0aW9uIGNhc3RTbGljZShhcnJheSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO2VuZD1lbmQ9PT11bmRlZmluZWQ/bGVuZ3RoOmVuZDtyZXR1cm4hc3RhcnQmJmVuZD49bGVuZ3RoP2FycmF5OmJhc2VTbGljZShhcnJheSxzdGFydCxlbmQpfXZhciBjbGVhclRpbWVvdXQ9Y3R4Q2xlYXJUaW1lb3V0fHxmdW5jdGlvbihpZCl7cmV0dXJuIHJvb3QuY2xlYXJUaW1lb3V0KGlkKX07ZnVuY3Rpb24gY2xvbmVCdWZmZXIoYnVmZmVyLGlzRGVlcCl7aWYoaXNEZWVwKXJldHVybiBidWZmZXIuc2xpY2UoKTsKdmFyIGxlbmd0aD1idWZmZXIubGVuZ3RoLHJlc3VsdD1hbGxvY1Vuc2FmZT9hbGxvY1Vuc2FmZShsZW5ndGgpOm5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTtidWZmZXIuY29weShyZXN1bHQpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcil7dmFyIHJlc3VsdD1uZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7KG5ldyBVaW50OEFycmF5KHJlc3VsdCkpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldyxpc0RlZXApe3ZhciBidWZmZXI9aXNEZWVwP2Nsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKTpkYXRhVmlldy5idWZmZXI7cmV0dXJuIG5ldyBkYXRhVmlldy5jb25zdHJ1Y3RvcihidWZmZXIsZGF0YVZpZXcuYnl0ZU9mZnNldCxkYXRhVmlldy5ieXRlTGVuZ3RoKX1mdW5jdGlvbiBjbG9uZVJlZ0V4cChyZWdleHApe3ZhciByZXN1bHQ9Cm5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSxyZUZsYWdzLmV4ZWMocmVnZXhwKSk7cmVzdWx0Lmxhc3RJbmRleD1yZWdleHAubGFzdEluZGV4O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKXtyZXR1cm4gc3ltYm9sVmFsdWVPZj9PYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpOnt9fWZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LGlzRGVlcCl7dmFyIGJ1ZmZlcj1pc0RlZXA/Y2xvbmVBcnJheUJ1ZmZlcih0eXBlZEFycmF5LmJ1ZmZlcik6dHlwZWRBcnJheS5idWZmZXI7cmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlcix0eXBlZEFycmF5LmJ5dGVPZmZzZXQsdHlwZWRBcnJheS5sZW5ndGgpfWZ1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcodmFsdWUsb3RoZXIpe2lmKHZhbHVlIT09b3RoZXIpe3ZhciB2YWxJc0RlZmluZWQ9dmFsdWUhPT11bmRlZmluZWQsdmFsSXNOdWxsPXZhbHVlPT09Cm51bGwsdmFsSXNSZWZsZXhpdmU9dmFsdWU9PT12YWx1ZSx2YWxJc1N5bWJvbD1pc1N5bWJvbCh2YWx1ZSk7dmFyIG90aElzRGVmaW5lZD1vdGhlciE9PXVuZGVmaW5lZCxvdGhJc051bGw9b3RoZXI9PT1udWxsLG90aElzUmVmbGV4aXZlPW90aGVyPT09b3RoZXIsb3RoSXNTeW1ib2w9aXNTeW1ib2wob3RoZXIpO2lmKCFvdGhJc051bGwmJiFvdGhJc1N5bWJvbCYmIXZhbElzU3ltYm9sJiZ2YWx1ZT5vdGhlcnx8dmFsSXNTeW1ib2wmJm90aElzRGVmaW5lZCYmb3RoSXNSZWZsZXhpdmUmJiFvdGhJc051bGwmJiFvdGhJc1N5bWJvbHx8dmFsSXNOdWxsJiZvdGhJc0RlZmluZWQmJm90aElzUmVmbGV4aXZlfHwhdmFsSXNEZWZpbmVkJiZvdGhJc1JlZmxleGl2ZXx8IXZhbElzUmVmbGV4aXZlKXJldHVybiAxO2lmKCF2YWxJc051bGwmJiF2YWxJc1N5bWJvbCYmIW90aElzU3ltYm9sJiZ2YWx1ZTxvdGhlcnx8b3RoSXNTeW1ib2wmJnZhbElzRGVmaW5lZCYmdmFsSXNSZWZsZXhpdmUmJiF2YWxJc051bGwmJgohdmFsSXNTeW1ib2x8fG90aElzTnVsbCYmdmFsSXNEZWZpbmVkJiZ2YWxJc1JlZmxleGl2ZXx8IW90aElzRGVmaW5lZCYmdmFsSXNSZWZsZXhpdmV8fCFvdGhJc1JlZmxleGl2ZSlyZXR1cm4tMX1yZXR1cm4gMH1mdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LG90aGVyLG9yZGVycyl7dmFyIGluZGV4PS0xLG9iakNyaXRlcmlhPW9iamVjdC5jcml0ZXJpYSxvdGhDcml0ZXJpYT1vdGhlci5jcml0ZXJpYSxsZW5ndGg9b2JqQ3JpdGVyaWEubGVuZ3RoLG9yZGVyc0xlbmd0aD1vcmRlcnMubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcmVzdWx0PWNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLG90aENyaXRlcmlhW2luZGV4XSk7aWYocmVzdWx0KXtpZihpbmRleD49b3JkZXJzTGVuZ3RoKXJldHVybiByZXN1bHQ7dmFyIG9yZGVyPW9yZGVyc1tpbmRleF07cmV0dXJuIHJlc3VsdCoob3JkZXI9PSJkZXNjIj8tMToxKX19cmV0dXJuIG9iamVjdC5pbmRleC0Kb3RoZXIuaW5kZXh9ZnVuY3Rpb24gY29tcG9zZUFyZ3MoYXJncyxwYXJ0aWFscyxob2xkZXJzLGlzQ3VycmllZCl7dmFyIGFyZ3NJbmRleD0tMSxhcmdzTGVuZ3RoPWFyZ3MubGVuZ3RoLGhvbGRlcnNMZW5ndGg9aG9sZGVycy5sZW5ndGgsbGVmdEluZGV4PS0xLGxlZnRMZW5ndGg9cGFydGlhbHMubGVuZ3RoLHJhbmdlTGVuZ3RoPW5hdGl2ZU1heChhcmdzTGVuZ3RoLWhvbGRlcnNMZW5ndGgsMCkscmVzdWx0PUFycmF5KGxlZnRMZW5ndGgrcmFuZ2VMZW5ndGgpLGlzVW5jdXJyaWVkPSFpc0N1cnJpZWQ7d2hpbGUoKytsZWZ0SW5kZXg8bGVmdExlbmd0aClyZXN1bHRbbGVmdEluZGV4XT1wYXJ0aWFsc1tsZWZ0SW5kZXhdO3doaWxlKCsrYXJnc0luZGV4PGhvbGRlcnNMZW5ndGgpaWYoaXNVbmN1cnJpZWR8fGFyZ3NJbmRleDxhcmdzTGVuZ3RoKXJlc3VsdFtob2xkZXJzW2FyZ3NJbmRleF1dPWFyZ3NbYXJnc0luZGV4XTt3aGlsZShyYW5nZUxlbmd0aC0tKXJlc3VsdFtsZWZ0SW5kZXgrK109CmFyZ3NbYXJnc0luZGV4KytdO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY29tcG9zZUFyZ3NSaWdodChhcmdzLHBhcnRpYWxzLGhvbGRlcnMsaXNDdXJyaWVkKXt2YXIgYXJnc0luZGV4PS0xLGFyZ3NMZW5ndGg9YXJncy5sZW5ndGgsaG9sZGVyc0luZGV4PS0xLGhvbGRlcnNMZW5ndGg9aG9sZGVycy5sZW5ndGgscmlnaHRJbmRleD0tMSxyaWdodExlbmd0aD1wYXJ0aWFscy5sZW5ndGgscmFuZ2VMZW5ndGg9bmF0aXZlTWF4KGFyZ3NMZW5ndGgtaG9sZGVyc0xlbmd0aCwwKSxyZXN1bHQ9QXJyYXkocmFuZ2VMZW5ndGgrcmlnaHRMZW5ndGgpLGlzVW5jdXJyaWVkPSFpc0N1cnJpZWQ7d2hpbGUoKythcmdzSW5kZXg8cmFuZ2VMZW5ndGgpcmVzdWx0W2FyZ3NJbmRleF09YXJnc1thcmdzSW5kZXhdO3ZhciBvZmZzZXQ9YXJnc0luZGV4O3doaWxlKCsrcmlnaHRJbmRleDxyaWdodExlbmd0aClyZXN1bHRbb2Zmc2V0K3JpZ2h0SW5kZXhdPXBhcnRpYWxzW3JpZ2h0SW5kZXhdO3doaWxlKCsraG9sZGVyc0luZGV4PApob2xkZXJzTGVuZ3RoKWlmKGlzVW5jdXJyaWVkfHxhcmdzSW5kZXg8YXJnc0xlbmd0aClyZXN1bHRbb2Zmc2V0K2hvbGRlcnNbaG9sZGVyc0luZGV4XV09YXJnc1thcmdzSW5kZXgrK107cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLGFycmF5KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXNvdXJjZS5sZW5ndGg7YXJyYXl8fChhcnJheT1BcnJheShsZW5ndGgpKTt3aGlsZSgrK2luZGV4PGxlbmd0aClhcnJheVtpbmRleF09c291cmNlW2luZGV4XTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UscHJvcHMsb2JqZWN0LGN1c3RvbWl6ZXIpe3ZhciBpc05ldz0hb2JqZWN0O29iamVjdHx8KG9iamVjdD17fSk7dmFyIGluZGV4PS0xLGxlbmd0aD1wcm9wcy5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBrZXk9cHJvcHNbaW5kZXhdO3ZhciBuZXdWYWx1ZT1jdXN0b21pemVyP2N1c3RvbWl6ZXIob2JqZWN0W2tleV0sc291cmNlW2tleV0sCmtleSxvYmplY3Qsc291cmNlKTp1bmRlZmluZWQ7aWYobmV3VmFsdWU9PT11bmRlZmluZWQpbmV3VmFsdWU9c291cmNlW2tleV07aWYoaXNOZXcpYmFzZUFzc2lnblZhbHVlKG9iamVjdCxrZXksbmV3VmFsdWUpO2Vsc2UgYXNzaWduVmFsdWUob2JqZWN0LGtleSxuZXdWYWx1ZSl9cmV0dXJuIG9iamVjdH1mdW5jdGlvbiBjb3B5U3ltYm9scyhzb3VyY2Usb2JqZWN0KXtyZXR1cm4gY29weU9iamVjdChzb3VyY2UsZ2V0U3ltYm9scyhzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gY29weVN5bWJvbHNJbihzb3VyY2Usb2JqZWN0KXtyZXR1cm4gY29weU9iamVjdChzb3VyY2UsZ2V0U3ltYm9sc0luKHNvdXJjZSksb2JqZWN0KX1mdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlcixpbml0aWFsaXplcil7cmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlBZ2dyZWdhdG9yOmJhc2VBZ2dyZWdhdG9yLGFjY3VtdWxhdG9yPQppbml0aWFsaXplcj9pbml0aWFsaXplcigpOnt9O3JldHVybiBmdW5jKGNvbGxlY3Rpb24sc2V0dGVyLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpLGFjY3VtdWxhdG9yKX19ZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpe3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihvYmplY3Qsc291cmNlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1zb3VyY2VzLmxlbmd0aCxjdXN0b21pemVyPWxlbmd0aD4xP3NvdXJjZXNbbGVuZ3RoLTFdOnVuZGVmaW5lZCxndWFyZD1sZW5ndGg+Mj9zb3VyY2VzWzJdOnVuZGVmaW5lZDtjdXN0b21pemVyPWFzc2lnbmVyLmxlbmd0aD4zJiZ0eXBlb2YgY3VzdG9taXplcj09ImZ1bmN0aW9uIj8obGVuZ3RoLS0sY3VzdG9taXplcik6dW5kZWZpbmVkO2lmKGd1YXJkJiZpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLHNvdXJjZXNbMV0sZ3VhcmQpKXtjdXN0b21pemVyPWxlbmd0aDwzP3VuZGVmaW5lZDpjdXN0b21pemVyO2xlbmd0aD0xfW9iamVjdD1PYmplY3Qob2JqZWN0KTsKd2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBzb3VyY2U9c291cmNlc1tpbmRleF07aWYoc291cmNlKWFzc2lnbmVyKG9iamVjdCxzb3VyY2UsaW5kZXgsY3VzdG9taXplcil9cmV0dXJuIG9iamVjdH0pfWZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLGZyb21SaWdodCl7cmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24saXRlcmF0ZWUpe2lmKGNvbGxlY3Rpb249PW51bGwpcmV0dXJuIGNvbGxlY3Rpb247aWYoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKXJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLGl0ZXJhdGVlKTt2YXIgbGVuZ3RoPWNvbGxlY3Rpb24ubGVuZ3RoLGluZGV4PWZyb21SaWdodD9sZW5ndGg6LTEsaXRlcmFibGU9T2JqZWN0KGNvbGxlY3Rpb24pO3doaWxlKGZyb21SaWdodD9pbmRleC0tOisraW5kZXg8bGVuZ3RoKWlmKGl0ZXJhdGVlKGl0ZXJhYmxlW2luZGV4XSxpbmRleCxpdGVyYWJsZSk9PT1mYWxzZSlicmVhaztyZXR1cm4gY29sbGVjdGlvbn19ZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpe3JldHVybiBmdW5jdGlvbihvYmplY3QsCml0ZXJhdGVlLGtleXNGdW5jKXt2YXIgaW5kZXg9LTEsaXRlcmFibGU9T2JqZWN0KG9iamVjdCkscHJvcHM9a2V5c0Z1bmMob2JqZWN0KSxsZW5ndGg9cHJvcHMubGVuZ3RoO3doaWxlKGxlbmd0aC0tKXt2YXIga2V5PXByb3BzW2Zyb21SaWdodD9sZW5ndGg6KytpbmRleF07aWYoaXRlcmF0ZWUoaXRlcmFibGVba2V5XSxrZXksaXRlcmFibGUpPT09ZmFsc2UpYnJlYWt9cmV0dXJuIG9iamVjdH19ZnVuY3Rpb24gY3JlYXRlQmluZChmdW5jLGJpdG1hc2ssdGhpc0FyZyl7dmFyIGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGZuPXRoaXMmJnRoaXMhPT1yb290JiZ0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcj9DdG9yOmZ1bmM7cmV0dXJuIGZuLmFwcGx5KGlzQmluZD90aGlzQXJnOnRoaXMsYXJndW1lbnRzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSl7cmV0dXJuIGZ1bmN0aW9uKHN0cmluZyl7c3RyaW5nPQp0b1N0cmluZyhzdHJpbmcpO3ZhciBzdHJTeW1ib2xzPWhhc1VuaWNvZGUoc3RyaW5nKT9zdHJpbmdUb0FycmF5KHN0cmluZyk6dW5kZWZpbmVkO3ZhciBjaHI9c3RyU3ltYm9scz9zdHJTeW1ib2xzWzBdOnN0cmluZy5jaGFyQXQoMCk7dmFyIHRyYWlsaW5nPXN0clN5bWJvbHM/Y2FzdFNsaWNlKHN0clN5bWJvbHMsMSkuam9pbigiIik6c3RyaW5nLnNsaWNlKDEpO3JldHVybiBjaHJbbWV0aG9kTmFtZV0oKSt0cmFpbGluZ319ZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjayl7cmV0dXJuIGZ1bmN0aW9uKHN0cmluZyl7cmV0dXJuIGFycmF5UmVkdWNlKHdvcmRzKGRlYnVycihzdHJpbmcpLnJlcGxhY2UocmVBcG9zLCIiKSksY2FsbGJhY2ssIiIpfX1mdW5jdGlvbiBjcmVhdGVDdG9yKEN0b3Ipe3JldHVybiBmdW5jdGlvbigpe3ZhciBhcmdzPWFyZ3VtZW50cztzd2l0Y2goYXJncy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IEN0b3I7Y2FzZSAxOnJldHVybiBuZXcgQ3RvcihhcmdzWzBdKTsKY2FzZSAyOnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0pO2Nhc2UgMzpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0pO2Nhc2UgNDpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSk7Y2FzZSA1OnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0pO2Nhc2UgNjpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0pO2Nhc2UgNzpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSl9dmFyIHRoaXNCaW5kaW5nPWJhc2VDcmVhdGUoQ3Rvci5wcm90b3R5cGUpLHJlc3VsdD1DdG9yLmFwcGx5KHRoaXNCaW5kaW5nLGFyZ3MpO3JldHVybiBpc09iamVjdChyZXN1bHQpP3Jlc3VsdDp0aGlzQmluZGluZ319ZnVuY3Rpb24gY3JlYXRlQ3VycnkoZnVuYywKYml0bWFzayxhcml0eSl7dmFyIEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGxlbmd0aD1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkobGVuZ3RoKSxpbmRleD1sZW5ndGgscGxhY2Vob2xkZXI9Z2V0SG9sZGVyKHdyYXBwZXIpO3doaWxlKGluZGV4LS0pYXJnc1tpbmRleF09YXJndW1lbnRzW2luZGV4XTt2YXIgaG9sZGVycz1sZW5ndGg8MyYmYXJnc1swXSE9PXBsYWNlaG9sZGVyJiZhcmdzW2xlbmd0aC0xXSE9PXBsYWNlaG9sZGVyP1tdOnJlcGxhY2VIb2xkZXJzKGFyZ3MscGxhY2Vob2xkZXIpO2xlbmd0aC09aG9sZGVycy5sZW5ndGg7aWYobGVuZ3RoPGFyaXR5KXJldHVybiBjcmVhdGVSZWN1cnJ5KGZ1bmMsYml0bWFzayxjcmVhdGVIeWJyaWQsd3JhcHBlci5wbGFjZWhvbGRlcix1bmRlZmluZWQsYXJncyxob2xkZXJzLHVuZGVmaW5lZCx1bmRlZmluZWQsYXJpdHktbGVuZ3RoKTt2YXIgZm49dGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZgp3cmFwcGVyP0N0b3I6ZnVuYztyZXR1cm4gYXBwbHkoZm4sdGhpcyxhcmdzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVGaW5kKGZpbmRJbmRleEZ1bmMpe3JldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLHByZWRpY2F0ZSxmcm9tSW5kZXgpe3ZhciBpdGVyYWJsZT1PYmplY3QoY29sbGVjdGlvbik7aWYoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKXt2YXIgaXRlcmF0ZWU9Z2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpO2NvbGxlY3Rpb249a2V5cyhjb2xsZWN0aW9uKTtwcmVkaWNhdGU9ZnVuY3Rpb24oa2V5KXtyZXR1cm4gaXRlcmF0ZWUoaXRlcmFibGVba2V5XSxrZXksaXRlcmFibGUpfX12YXIgaW5kZXg9ZmluZEluZGV4RnVuYyhjb2xsZWN0aW9uLHByZWRpY2F0ZSxmcm9tSW5kZXgpO3JldHVybiBpbmRleD4tMT9pdGVyYWJsZVtpdGVyYXRlZT9jb2xsZWN0aW9uW2luZGV4XTppbmRleF06dW5kZWZpbmVkfX1mdW5jdGlvbiBjcmVhdGVGbG93KGZyb21SaWdodCl7cmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmNzKXt2YXIgbGVuZ3RoPQpmdW5jcy5sZW5ndGgsaW5kZXg9bGVuZ3RoLHByZXJlcT1Mb2Rhc2hXcmFwcGVyLnByb3RvdHlwZS50aHJ1O2lmKGZyb21SaWdodClmdW5jcy5yZXZlcnNlKCk7d2hpbGUoaW5kZXgtLSl7dmFyIGZ1bmM9ZnVuY3NbaW5kZXhdO2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtpZihwcmVyZXEmJiF3cmFwcGVyJiZnZXRGdW5jTmFtZShmdW5jKT09IndyYXBwZXIiKXZhciB3cmFwcGVyPW5ldyBMb2Rhc2hXcmFwcGVyKFtdLHRydWUpfWluZGV4PXdyYXBwZXI/aW5kZXg6bGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXtmdW5jPWZ1bmNzW2luZGV4XTt2YXIgZnVuY05hbWU9Z2V0RnVuY05hbWUoZnVuYyksZGF0YT1mdW5jTmFtZT09IndyYXBwZXIiP2dldERhdGEoZnVuYyk6dW5kZWZpbmVkO2lmKGRhdGEmJmlzTGF6aWFibGUoZGF0YVswXSkmJmRhdGFbMV09PShXUkFQX0FSWV9GTEFHfFdSQVBfQ1VSUllfRkxBR3xXUkFQX1BBUlRJQUxfRkxBR3wKV1JBUF9SRUFSR19GTEFHKSYmIWRhdGFbNF0ubGVuZ3RoJiZkYXRhWzldPT0xKXdyYXBwZXI9d3JhcHBlcltnZXRGdW5jTmFtZShkYXRhWzBdKV0uYXBwbHkod3JhcHBlcixkYXRhWzNdKTtlbHNlIHdyYXBwZXI9ZnVuYy5sZW5ndGg9PTEmJmlzTGF6aWFibGUoZnVuYyk/d3JhcHBlcltmdW5jTmFtZV0oKTp3cmFwcGVyLnRocnUoZnVuYyl9cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGFyZ3M9YXJndW1lbnRzLHZhbHVlPWFyZ3NbMF07aWYod3JhcHBlciYmYXJncy5sZW5ndGg9PTEmJmlzQXJyYXkodmFsdWUpKXJldHVybiB3cmFwcGVyLnBsYW50KHZhbHVlKS52YWx1ZSgpO3ZhciBpbmRleD0wLHJlc3VsdD1sZW5ndGg/ZnVuY3NbaW5kZXhdLmFwcGx5KHRoaXMsYXJncyk6dmFsdWU7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0PWZ1bmNzW2luZGV4XS5jYWxsKHRoaXMscmVzdWx0KTtyZXR1cm4gcmVzdWx0fX0pfWZ1bmN0aW9uIGNyZWF0ZUh5YnJpZChmdW5jLGJpdG1hc2ssdGhpc0FyZywKcGFydGlhbHMsaG9sZGVycyxwYXJ0aWFsc1JpZ2h0LGhvbGRlcnNSaWdodCxhcmdQb3MsYXJ5LGFyaXR5KXt2YXIgaXNBcnk9Yml0bWFzayZXUkFQX0FSWV9GTEFHLGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLGlzQmluZEtleT1iaXRtYXNrJldSQVBfQklORF9LRVlfRkxBRyxpc0N1cnJpZWQ9Yml0bWFzayYoV1JBUF9DVVJSWV9GTEFHfFdSQVBfQ1VSUllfUklHSFRfRkxBRyksaXNGbGlwPWJpdG1hc2smV1JBUF9GTElQX0ZMQUcsQ3Rvcj1pc0JpbmRLZXk/dW5kZWZpbmVkOmNyZWF0ZUN0b3IoZnVuYyk7ZnVuY3Rpb24gd3JhcHBlcigpe3ZhciBsZW5ndGg9YXJndW1lbnRzLmxlbmd0aCxhcmdzPUFycmF5KGxlbmd0aCksaW5kZXg9bGVuZ3RoO3doaWxlKGluZGV4LS0pYXJnc1tpbmRleF09YXJndW1lbnRzW2luZGV4XTtpZihpc0N1cnJpZWQpdmFyIHBsYWNlaG9sZGVyPWdldEhvbGRlcih3cmFwcGVyKSxob2xkZXJzQ291bnQ9Y291bnRIb2xkZXJzKGFyZ3MscGxhY2Vob2xkZXIpOwppZihwYXJ0aWFscylhcmdzPWNvbXBvc2VBcmdzKGFyZ3MscGFydGlhbHMsaG9sZGVycyxpc0N1cnJpZWQpO2lmKHBhcnRpYWxzUmlnaHQpYXJncz1jb21wb3NlQXJnc1JpZ2h0KGFyZ3MscGFydGlhbHNSaWdodCxob2xkZXJzUmlnaHQsaXNDdXJyaWVkKTtsZW5ndGgtPWhvbGRlcnNDb3VudDtpZihpc0N1cnJpZWQmJmxlbmd0aDxhcml0eSl7dmFyIG5ld0hvbGRlcnM9cmVwbGFjZUhvbGRlcnMoYXJncyxwbGFjZWhvbGRlcik7cmV0dXJuIGNyZWF0ZVJlY3VycnkoZnVuYyxiaXRtYXNrLGNyZWF0ZUh5YnJpZCx3cmFwcGVyLnBsYWNlaG9sZGVyLHRoaXNBcmcsYXJncyxuZXdIb2xkZXJzLGFyZ1BvcyxhcnksYXJpdHktbGVuZ3RoKX12YXIgdGhpc0JpbmRpbmc9aXNCaW5kP3RoaXNBcmc6dGhpcyxmbj1pc0JpbmRLZXk/dGhpc0JpbmRpbmdbZnVuY106ZnVuYztsZW5ndGg9YXJncy5sZW5ndGg7aWYoYXJnUG9zKWFyZ3M9cmVvcmRlcihhcmdzLGFyZ1Bvcyk7ZWxzZSBpZihpc0ZsaXAmJmxlbmd0aD4KMSlhcmdzLnJldmVyc2UoKTtpZihpc0FyeSYmYXJ5PGxlbmd0aClhcmdzLmxlbmd0aD1hcnk7aWYodGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKWZuPUN0b3J8fGNyZWF0ZUN0b3IoZm4pO3JldHVybiBmbi5hcHBseSh0aGlzQmluZGluZyxhcmdzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVJbnZlcnRlcihzZXR0ZXIsdG9JdGVyYXRlZSl7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIGJhc2VJbnZlcnRlcihvYmplY3Qsc2V0dGVyLHRvSXRlcmF0ZWUoaXRlcmF0ZWUpLHt9KX19ZnVuY3Rpb24gY3JlYXRlTWF0aE9wZXJhdGlvbihvcGVyYXRvcixkZWZhdWx0VmFsdWUpe3JldHVybiBmdW5jdGlvbih2YWx1ZSxvdGhlcil7dmFyIHJlc3VsdDtpZih2YWx1ZT09PXVuZGVmaW5lZCYmb3RoZXI9PT11bmRlZmluZWQpcmV0dXJuIGRlZmF1bHRWYWx1ZTtpZih2YWx1ZSE9PXVuZGVmaW5lZClyZXN1bHQ9dmFsdWU7aWYob3RoZXIhPT0KdW5kZWZpbmVkKXtpZihyZXN1bHQ9PT11bmRlZmluZWQpcmV0dXJuIG90aGVyO2lmKHR5cGVvZiB2YWx1ZT09InN0cmluZyJ8fHR5cGVvZiBvdGhlcj09InN0cmluZyIpe3ZhbHVlPWJhc2VUb1N0cmluZyh2YWx1ZSk7b3RoZXI9YmFzZVRvU3RyaW5nKG90aGVyKX1lbHNle3ZhbHVlPWJhc2VUb051bWJlcih2YWx1ZSk7b3RoZXI9YmFzZVRvTnVtYmVyKG90aGVyKX1yZXN1bHQ9b3BlcmF0b3IodmFsdWUsb3RoZXIpfXJldHVybiByZXN1bHR9fWZ1bmN0aW9uIGNyZWF0ZU92ZXIoYXJyYXlGdW5jKXtyZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oaXRlcmF0ZWVzKXtpdGVyYXRlZXM9YXJyYXlNYXAoaXRlcmF0ZWVzLGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7cmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe3ZhciB0aGlzQXJnPXRoaXM7cmV0dXJuIGFycmF5RnVuYyhpdGVyYXRlZXMsZnVuY3Rpb24oaXRlcmF0ZWUpe3JldHVybiBhcHBseShpdGVyYXRlZSx0aGlzQXJnLGFyZ3MpfSl9KX0pfQpmdW5jdGlvbiBjcmVhdGVQYWRkaW5nKGxlbmd0aCxjaGFycyl7Y2hhcnM9Y2hhcnM9PT11bmRlZmluZWQ/IiAiOmJhc2VUb1N0cmluZyhjaGFycyk7dmFyIGNoYXJzTGVuZ3RoPWNoYXJzLmxlbmd0aDtpZihjaGFyc0xlbmd0aDwyKXJldHVybiBjaGFyc0xlbmd0aD9iYXNlUmVwZWF0KGNoYXJzLGxlbmd0aCk6Y2hhcnM7dmFyIHJlc3VsdD1iYXNlUmVwZWF0KGNoYXJzLG5hdGl2ZUNlaWwobGVuZ3RoL3N0cmluZ1NpemUoY2hhcnMpKSk7cmV0dXJuIGhhc1VuaWNvZGUoY2hhcnMpP2Nhc3RTbGljZShzdHJpbmdUb0FycmF5KHJlc3VsdCksMCxsZW5ndGgpLmpvaW4oIiIpOnJlc3VsdC5zbGljZSgwLGxlbmd0aCl9ZnVuY3Rpb24gY3JlYXRlUGFydGlhbChmdW5jLGJpdG1hc2ssdGhpc0FyZyxwYXJ0aWFscyl7dmFyIGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGFyZ3NJbmRleD0tMSxhcmdzTGVuZ3RoPQphcmd1bWVudHMubGVuZ3RoLGxlZnRJbmRleD0tMSxsZWZ0TGVuZ3RoPXBhcnRpYWxzLmxlbmd0aCxhcmdzPUFycmF5KGxlZnRMZW5ndGgrYXJnc0xlbmd0aCksZm49dGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyP0N0b3I6ZnVuYzt3aGlsZSgrK2xlZnRJbmRleDxsZWZ0TGVuZ3RoKWFyZ3NbbGVmdEluZGV4XT1wYXJ0aWFsc1tsZWZ0SW5kZXhdO3doaWxlKGFyZ3NMZW5ndGgtLSlhcmdzW2xlZnRJbmRleCsrXT1hcmd1bWVudHNbKythcmdzSW5kZXhdO3JldHVybiBhcHBseShmbixpc0JpbmQ/dGhpc0FyZzp0aGlzLGFyZ3MpfXJldHVybiB3cmFwcGVyfWZ1bmN0aW9uIGNyZWF0ZVJhbmdlKGZyb21SaWdodCl7cmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LGVuZCxzdGVwKXtpZihzdGVwJiZ0eXBlb2Ygc3RlcCE9Im51bWJlciImJmlzSXRlcmF0ZWVDYWxsKHN0YXJ0LGVuZCxzdGVwKSllbmQ9c3RlcD11bmRlZmluZWQ7c3RhcnQ9dG9GaW5pdGUoc3RhcnQpO2lmKGVuZD09PQp1bmRlZmluZWQpe2VuZD1zdGFydDtzdGFydD0wfWVsc2UgZW5kPXRvRmluaXRlKGVuZCk7c3RlcD1zdGVwPT09dW5kZWZpbmVkP3N0YXJ0PGVuZD8xOi0xOnRvRmluaXRlKHN0ZXApO3JldHVybiBiYXNlUmFuZ2Uoc3RhcnQsZW5kLHN0ZXAsZnJvbVJpZ2h0KX19ZnVuY3Rpb24gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihvcGVyYXRvcil7cmV0dXJuIGZ1bmN0aW9uKHZhbHVlLG90aGVyKXtpZighKHR5cGVvZiB2YWx1ZT09InN0cmluZyImJnR5cGVvZiBvdGhlcj09InN0cmluZyIpKXt2YWx1ZT10b051bWJlcih2YWx1ZSk7b3RoZXI9dG9OdW1iZXIob3RoZXIpfXJldHVybiBvcGVyYXRvcih2YWx1ZSxvdGhlcil9fWZ1bmN0aW9uIGNyZWF0ZVJlY3VycnkoZnVuYyxiaXRtYXNrLHdyYXBGdW5jLHBsYWNlaG9sZGVyLHRoaXNBcmcscGFydGlhbHMsaG9sZGVycyxhcmdQb3MsYXJ5LGFyaXR5KXt2YXIgaXNDdXJyeT1iaXRtYXNrJldSQVBfQ1VSUllfRkxBRyxuZXdIb2xkZXJzPWlzQ3Vycnk/CmhvbGRlcnM6dW5kZWZpbmVkLG5ld0hvbGRlcnNSaWdodD1pc0N1cnJ5P3VuZGVmaW5lZDpob2xkZXJzLG5ld1BhcnRpYWxzPWlzQ3Vycnk/cGFydGlhbHM6dW5kZWZpbmVkLG5ld1BhcnRpYWxzUmlnaHQ9aXNDdXJyeT91bmRlZmluZWQ6cGFydGlhbHM7Yml0bWFza3w9aXNDdXJyeT9XUkFQX1BBUlRJQUxfRkxBRzpXUkFQX1BBUlRJQUxfUklHSFRfRkxBRztiaXRtYXNrJj1+KGlzQ3Vycnk/V1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUc6V1JBUF9QQVJUSUFMX0ZMQUcpO2lmKCEoYml0bWFzayZXUkFQX0NVUlJZX0JPVU5EX0ZMQUcpKWJpdG1hc2smPX4oV1JBUF9CSU5EX0ZMQUd8V1JBUF9CSU5EX0tFWV9GTEFHKTt2YXIgbmV3RGF0YT1bZnVuYyxiaXRtYXNrLHRoaXNBcmcsbmV3UGFydGlhbHMsbmV3SG9sZGVycyxuZXdQYXJ0aWFsc1JpZ2h0LG5ld0hvbGRlcnNSaWdodCxhcmdQb3MsYXJ5LGFyaXR5XTt2YXIgcmVzdWx0PXdyYXBGdW5jLmFwcGx5KHVuZGVmaW5lZCxuZXdEYXRhKTtpZihpc0xhemlhYmxlKGZ1bmMpKXNldERhdGEocmVzdWx0LApuZXdEYXRhKTtyZXN1bHQucGxhY2Vob2xkZXI9cGxhY2Vob2xkZXI7cmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsZnVuYyxiaXRtYXNrKX1mdW5jdGlvbiBjcmVhdGVSb3VuZChtZXRob2ROYW1lKXt2YXIgZnVuYz1NYXRoW21ldGhvZE5hbWVdO3JldHVybiBmdW5jdGlvbihudW1iZXIscHJlY2lzaW9uKXtudW1iZXI9dG9OdW1iZXIobnVtYmVyKTtwcmVjaXNpb249cHJlY2lzaW9uPT1udWxsPzA6bmF0aXZlTWluKHRvSW50ZWdlcihwcmVjaXNpb24pLDI5Mik7aWYocHJlY2lzaW9uKXt2YXIgcGFpcj0odG9TdHJpbmcobnVtYmVyKSsiZSIpLnNwbGl0KCJlIiksdmFsdWU9ZnVuYyhwYWlyWzBdKyJlIisoK3BhaXJbMV0rcHJlY2lzaW9uKSk7cGFpcj0odG9TdHJpbmcodmFsdWUpKyJlIikuc3BsaXQoImUiKTtyZXR1cm4rKHBhaXJbMF0rImUiKygrcGFpclsxXS1wcmVjaXNpb24pKX1yZXR1cm4gZnVuYyhudW1iZXIpfX12YXIgY3JlYXRlU2V0PSEoU2V0JiYxL3NldFRvQXJyYXkobmV3IFNldChbLAotMF0pKVsxXT09SU5GSU5JVFkpP25vb3A6ZnVuY3Rpb24odmFsdWVzKXtyZXR1cm4gbmV3IFNldCh2YWx1ZXMpfTtmdW5jdGlvbiBjcmVhdGVUb1BhaXJzKGtleXNGdW5jKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXt2YXIgdGFnPWdldFRhZyhvYmplY3QpO2lmKHRhZz09bWFwVGFnKXJldHVybiBtYXBUb0FycmF5KG9iamVjdCk7aWYodGFnPT1zZXRUYWcpcmV0dXJuIHNldFRvUGFpcnMob2JqZWN0KTtyZXR1cm4gYmFzZVRvUGFpcnMob2JqZWN0LGtleXNGdW5jKG9iamVjdCkpfX1mdW5jdGlvbiBjcmVhdGVXcmFwKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzLGhvbGRlcnMsYXJnUG9zLGFyeSxhcml0eSl7dmFyIGlzQmluZEtleT1iaXRtYXNrJldSQVBfQklORF9LRVlfRkxBRztpZighaXNCaW5kS2V5JiZ0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7dmFyIGxlbmd0aD1wYXJ0aWFscz9wYXJ0aWFscy5sZW5ndGg6CjA7aWYoIWxlbmd0aCl7Yml0bWFzayY9fihXUkFQX1BBUlRJQUxfRkxBR3xXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7cGFydGlhbHM9aG9sZGVycz11bmRlZmluZWR9YXJ5PWFyeT09PXVuZGVmaW5lZD9hcnk6bmF0aXZlTWF4KHRvSW50ZWdlcihhcnkpLDApO2FyaXR5PWFyaXR5PT09dW5kZWZpbmVkP2FyaXR5OnRvSW50ZWdlcihhcml0eSk7bGVuZ3RoLT1ob2xkZXJzP2hvbGRlcnMubGVuZ3RoOjA7aWYoYml0bWFzayZXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyl7dmFyIHBhcnRpYWxzUmlnaHQ9cGFydGlhbHMsaG9sZGVyc1JpZ2h0PWhvbGRlcnM7cGFydGlhbHM9aG9sZGVycz11bmRlZmluZWR9dmFyIGRhdGE9aXNCaW5kS2V5P3VuZGVmaW5lZDpnZXREYXRhKGZ1bmMpO3ZhciBuZXdEYXRhPVtmdW5jLGJpdG1hc2ssdGhpc0FyZyxwYXJ0aWFscyxob2xkZXJzLHBhcnRpYWxzUmlnaHQsaG9sZGVyc1JpZ2h0LGFyZ1BvcyxhcnksYXJpdHldO2lmKGRhdGEpbWVyZ2VEYXRhKG5ld0RhdGEsCmRhdGEpO2Z1bmM9bmV3RGF0YVswXTtiaXRtYXNrPW5ld0RhdGFbMV07dGhpc0FyZz1uZXdEYXRhWzJdO3BhcnRpYWxzPW5ld0RhdGFbM107aG9sZGVycz1uZXdEYXRhWzRdO2FyaXR5PW5ld0RhdGFbOV09bmV3RGF0YVs5XT09PXVuZGVmaW5lZD9pc0JpbmRLZXk/MDpmdW5jLmxlbmd0aDpuYXRpdmVNYXgobmV3RGF0YVs5XS1sZW5ndGgsMCk7aWYoIWFyaXR5JiZiaXRtYXNrJihXUkFQX0NVUlJZX0ZMQUd8V1JBUF9DVVJSWV9SSUdIVF9GTEFHKSliaXRtYXNrJj1+KFdSQVBfQ1VSUllfRkxBR3xXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpO2lmKCFiaXRtYXNrfHxiaXRtYXNrPT1XUkFQX0JJTkRfRkxBRyl2YXIgcmVzdWx0PWNyZWF0ZUJpbmQoZnVuYyxiaXRtYXNrLHRoaXNBcmcpO2Vsc2UgaWYoYml0bWFzaz09V1JBUF9DVVJSWV9GTEFHfHxiaXRtYXNrPT1XUkFQX0NVUlJZX1JJR0hUX0ZMQUcpcmVzdWx0PWNyZWF0ZUN1cnJ5KGZ1bmMsYml0bWFzayxhcml0eSk7ZWxzZSBpZigoYml0bWFzaz09CldSQVBfUEFSVElBTF9GTEFHfHxiaXRtYXNrPT0oV1JBUF9CSU5EX0ZMQUd8V1JBUF9QQVJUSUFMX0ZMQUcpKSYmIWhvbGRlcnMubGVuZ3RoKXJlc3VsdD1jcmVhdGVQYXJ0aWFsKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzKTtlbHNlIHJlc3VsdD1jcmVhdGVIeWJyaWQuYXBwbHkodW5kZWZpbmVkLG5ld0RhdGEpO3ZhciBzZXR0ZXI9ZGF0YT9iYXNlU2V0RGF0YTpzZXREYXRhO3JldHVybiBzZXRXcmFwVG9TdHJpbmcoc2V0dGVyKHJlc3VsdCxuZXdEYXRhKSxmdW5jLGJpdG1hc2spfWZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzQXNzaWduSW4ob2JqVmFsdWUsc3JjVmFsdWUsa2V5LG9iamVjdCl7aWYob2JqVmFsdWU9PT11bmRlZmluZWR8fGVxKG9ialZhbHVlLG9iamVjdFByb3RvW2tleV0pJiYhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3Qsa2V5KSlyZXR1cm4gc3JjVmFsdWU7cmV0dXJuIG9ialZhbHVlfWZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzTWVyZ2Uob2JqVmFsdWUsc3JjVmFsdWUsCmtleSxvYmplY3Qsc291cmNlLHN0YWNrKXtpZihpc09iamVjdChvYmpWYWx1ZSkmJmlzT2JqZWN0KHNyY1ZhbHVlKSl7c3RhY2suc2V0KHNyY1ZhbHVlLG9ialZhbHVlKTtiYXNlTWVyZ2Uob2JqVmFsdWUsc3JjVmFsdWUsdW5kZWZpbmVkLGN1c3RvbURlZmF1bHRzTWVyZ2Usc3RhY2spO3N0YWNrWyJkZWxldGUiXShzcmNWYWx1ZSl9cmV0dXJuIG9ialZhbHVlfWZ1bmN0aW9uIGN1c3RvbU9taXRDbG9uZSh2YWx1ZSl7cmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpP3VuZGVmaW5lZDp2YWx1ZX1mdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKXt2YXIgaXNQYXJ0aWFsPWJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUcsYXJyTGVuZ3RoPWFycmF5Lmxlbmd0aCxvdGhMZW5ndGg9b3RoZXIubGVuZ3RoO2lmKGFyckxlbmd0aCE9b3RoTGVuZ3RoJiYhKGlzUGFydGlhbCYmb3RoTGVuZ3RoPmFyckxlbmd0aCkpcmV0dXJuIGZhbHNlOwp2YXIgc3RhY2tlZD1zdGFjay5nZXQoYXJyYXkpO2lmKHN0YWNrZWQmJnN0YWNrLmdldChvdGhlcikpcmV0dXJuIHN0YWNrZWQ9PW90aGVyO3ZhciBpbmRleD0tMSxyZXN1bHQ9dHJ1ZSxzZWVuPWJpdG1hc2smQ09NUEFSRV9VTk9SREVSRURfRkxBRz9uZXcgU2V0Q2FjaGU6dW5kZWZpbmVkO3N0YWNrLnNldChhcnJheSxvdGhlcik7c3RhY2suc2V0KG90aGVyLGFycmF5KTt3aGlsZSgrK2luZGV4PGFyckxlbmd0aCl7dmFyIGFyclZhbHVlPWFycmF5W2luZGV4XSxvdGhWYWx1ZT1vdGhlcltpbmRleF07aWYoY3VzdG9taXplcil2YXIgY29tcGFyZWQ9aXNQYXJ0aWFsP2N1c3RvbWl6ZXIob3RoVmFsdWUsYXJyVmFsdWUsaW5kZXgsb3RoZXIsYXJyYXksc3RhY2spOmN1c3RvbWl6ZXIoYXJyVmFsdWUsb3RoVmFsdWUsaW5kZXgsYXJyYXksb3RoZXIsc3RhY2spO2lmKGNvbXBhcmVkIT09dW5kZWZpbmVkKXtpZihjb21wYXJlZCljb250aW51ZTtyZXN1bHQ9ZmFsc2U7YnJlYWt9aWYoc2Vlbil7aWYoIWFycmF5U29tZShvdGhlciwKZnVuY3Rpb24ob3RoVmFsdWUsb3RoSW5kZXgpe2lmKCFjYWNoZUhhcyhzZWVuLG90aEluZGV4KSYmKGFyclZhbHVlPT09b3RoVmFsdWV8fGVxdWFsRnVuYyhhcnJWYWx1ZSxvdGhWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3RhY2spKSlyZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KX0pKXtyZXN1bHQ9ZmFsc2U7YnJlYWt9fWVsc2UgaWYoIShhcnJWYWx1ZT09PW90aFZhbHVlfHxlcXVhbEZ1bmMoYXJyVmFsdWUsb3RoVmFsdWUsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKSkpe3Jlc3VsdD1mYWxzZTticmVha319c3RhY2tbImRlbGV0ZSJdKGFycmF5KTtzdGFja1siZGVsZXRlIl0ob3RoZXIpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3Qsb3RoZXIsdGFnLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spe3N3aXRjaCh0YWcpe2Nhc2UgZGF0YVZpZXdUYWc6aWYob2JqZWN0LmJ5dGVMZW5ndGghPW90aGVyLmJ5dGVMZW5ndGh8fG9iamVjdC5ieXRlT2Zmc2V0IT0Kb3RoZXIuYnl0ZU9mZnNldClyZXR1cm4gZmFsc2U7b2JqZWN0PW9iamVjdC5idWZmZXI7b3RoZXI9b3RoZXIuYnVmZmVyO2Nhc2UgYXJyYXlCdWZmZXJUYWc6aWYob2JqZWN0LmJ5dGVMZW5ndGghPW90aGVyLmJ5dGVMZW5ndGh8fCFlcXVhbEZ1bmMobmV3IFVpbnQ4QXJyYXkob2JqZWN0KSxuZXcgVWludDhBcnJheShvdGhlcikpKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTtjYXNlIGJvb2xUYWc6Y2FzZSBkYXRlVGFnOmNhc2UgbnVtYmVyVGFnOnJldHVybiBlcSgrb2JqZWN0LCtvdGhlcik7Y2FzZSBlcnJvclRhZzpyZXR1cm4gb2JqZWN0Lm5hbWU9PW90aGVyLm5hbWUmJm9iamVjdC5tZXNzYWdlPT1vdGhlci5tZXNzYWdlO2Nhc2UgcmVnZXhwVGFnOmNhc2Ugc3RyaW5nVGFnOnJldHVybiBvYmplY3Q9PW90aGVyKyIiO2Nhc2UgbWFwVGFnOnZhciBjb252ZXJ0PW1hcFRvQXJyYXk7Y2FzZSBzZXRUYWc6dmFyIGlzUGFydGlhbD1iaXRtYXNrJkNPTVBBUkVfUEFSVElBTF9GTEFHO2NvbnZlcnR8fAooY29udmVydD1zZXRUb0FycmF5KTtpZihvYmplY3Quc2l6ZSE9b3RoZXIuc2l6ZSYmIWlzUGFydGlhbClyZXR1cm4gZmFsc2U7dmFyIHN0YWNrZWQ9c3RhY2suZ2V0KG9iamVjdCk7aWYoc3RhY2tlZClyZXR1cm4gc3RhY2tlZD09b3RoZXI7Yml0bWFza3w9Q09NUEFSRV9VTk9SREVSRURfRkxBRztzdGFjay5zZXQob2JqZWN0LG90aGVyKTt2YXIgcmVzdWx0PWVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSxjb252ZXJ0KG90aGVyKSxiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKTtzdGFja1siZGVsZXRlIl0ob2JqZWN0KTtyZXR1cm4gcmVzdWx0O2Nhc2Ugc3ltYm9sVGFnOmlmKHN5bWJvbFZhbHVlT2YpcmV0dXJuIHN5bWJvbFZhbHVlT2YuY2FsbChvYmplY3QpPT1zeW1ib2xWYWx1ZU9mLmNhbGwob3RoZXIpfXJldHVybiBmYWxzZX1mdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spe3ZhciBpc1BhcnRpYWw9CmJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUcsb2JqUHJvcHM9Z2V0QWxsS2V5cyhvYmplY3QpLG9iakxlbmd0aD1vYmpQcm9wcy5sZW5ndGgsb3RoUHJvcHM9Z2V0QWxsS2V5cyhvdGhlciksb3RoTGVuZ3RoPW90aFByb3BzLmxlbmd0aDtpZihvYmpMZW5ndGghPW90aExlbmd0aCYmIWlzUGFydGlhbClyZXR1cm4gZmFsc2U7dmFyIGluZGV4PW9iakxlbmd0aDt3aGlsZShpbmRleC0tKXt2YXIga2V5PW9ialByb3BzW2luZGV4XTtpZighKGlzUGFydGlhbD9rZXkgaW4gb3RoZXI6aGFzT3duUHJvcGVydHkuY2FsbChvdGhlcixrZXkpKSlyZXR1cm4gZmFsc2V9dmFyIHN0YWNrZWQ9c3RhY2suZ2V0KG9iamVjdCk7aWYoc3RhY2tlZCYmc3RhY2suZ2V0KG90aGVyKSlyZXR1cm4gc3RhY2tlZD09b3RoZXI7dmFyIHJlc3VsdD10cnVlO3N0YWNrLnNldChvYmplY3Qsb3RoZXIpO3N0YWNrLnNldChvdGhlcixvYmplY3QpO3ZhciBza2lwQ3Rvcj1pc1BhcnRpYWw7d2hpbGUoKytpbmRleDxvYmpMZW5ndGgpe2tleT0Kb2JqUHJvcHNbaW5kZXhdO3ZhciBvYmpWYWx1ZT1vYmplY3Rba2V5XSxvdGhWYWx1ZT1vdGhlcltrZXldO2lmKGN1c3RvbWl6ZXIpdmFyIGNvbXBhcmVkPWlzUGFydGlhbD9jdXN0b21pemVyKG90aFZhbHVlLG9ialZhbHVlLGtleSxvdGhlcixvYmplY3Qsc3RhY2spOmN1c3RvbWl6ZXIob2JqVmFsdWUsb3RoVmFsdWUsa2V5LG9iamVjdCxvdGhlcixzdGFjayk7aWYoIShjb21wYXJlZD09PXVuZGVmaW5lZD9vYmpWYWx1ZT09PW90aFZhbHVlfHxlcXVhbEZ1bmMob2JqVmFsdWUsb3RoVmFsdWUsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKTpjb21wYXJlZCkpe3Jlc3VsdD1mYWxzZTticmVha31za2lwQ3Rvcnx8KHNraXBDdG9yPWtleT09ImNvbnN0cnVjdG9yIil9aWYocmVzdWx0JiYhc2tpcEN0b3Ipe3ZhciBvYmpDdG9yPW9iamVjdC5jb25zdHJ1Y3RvcixvdGhDdG9yPW90aGVyLmNvbnN0cnVjdG9yO2lmKG9iakN0b3IhPW90aEN0b3ImJigiY29uc3RydWN0b3IiaW4gb2JqZWN0JiYiY29uc3RydWN0b3IiaW4Kb3RoZXIpJiYhKHR5cGVvZiBvYmpDdG9yPT0iZnVuY3Rpb24iJiZvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciYmdHlwZW9mIG90aEN0b3I9PSJmdW5jdGlvbiImJm90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yKSlyZXN1bHQ9ZmFsc2V9c3RhY2tbImRlbGV0ZSJdKG9iamVjdCk7c3RhY2tbImRlbGV0ZSJdKG90aGVyKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpe3JldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLHVuZGVmaW5lZCxmbGF0dGVuKSxmdW5jKyIiKX1mdW5jdGlvbiBnZXRBbGxLZXlzKG9iamVjdCl7cmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCxrZXlzLGdldFN5bWJvbHMpfWZ1bmN0aW9uIGdldEFsbEtleXNJbihvYmplY3Qpe3JldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3Qsa2V5c0luLGdldFN5bWJvbHNJbil9dmFyIGdldERhdGE9IW1ldGFNYXA/bm9vcDpmdW5jdGlvbihmdW5jKXtyZXR1cm4gbWV0YU1hcC5nZXQoZnVuYyl9OwpmdW5jdGlvbiBnZXRGdW5jTmFtZShmdW5jKXt2YXIgcmVzdWx0PWZ1bmMubmFtZSsiIixhcnJheT1yZWFsTmFtZXNbcmVzdWx0XSxsZW5ndGg9aGFzT3duUHJvcGVydHkuY2FsbChyZWFsTmFtZXMscmVzdWx0KT9hcnJheS5sZW5ndGg6MDt3aGlsZShsZW5ndGgtLSl7dmFyIGRhdGE9YXJyYXlbbGVuZ3RoXSxvdGhlckZ1bmM9ZGF0YS5mdW5jO2lmKG90aGVyRnVuYz09bnVsbHx8b3RoZXJGdW5jPT1mdW5jKXJldHVybiBkYXRhLm5hbWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBnZXRIb2xkZXIoZnVuYyl7dmFyIG9iamVjdD1oYXNPd25Qcm9wZXJ0eS5jYWxsKGxvZGFzaCwicGxhY2Vob2xkZXIiKT9sb2Rhc2g6ZnVuYztyZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyfWZ1bmN0aW9uIGdldEl0ZXJhdGVlKCl7dmFyIHJlc3VsdD1sb2Rhc2guaXRlcmF0ZWV8fGl0ZXJhdGVlO3Jlc3VsdD1yZXN1bHQ9PT1pdGVyYXRlZT9iYXNlSXRlcmF0ZWU6cmVzdWx0O3JldHVybiBhcmd1bWVudHMubGVuZ3RoPwpyZXN1bHQoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSk6cmVzdWx0fWZ1bmN0aW9uIGdldE1hcERhdGEobWFwLGtleSl7dmFyIGRhdGE9bWFwLl9fZGF0YV9fO3JldHVybiBpc0tleWFibGUoa2V5KT9kYXRhW3R5cGVvZiBrZXk9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06ZGF0YS5tYXB9ZnVuY3Rpb24gZ2V0TWF0Y2hEYXRhKG9iamVjdCl7dmFyIHJlc3VsdD1rZXlzKG9iamVjdCksbGVuZ3RoPXJlc3VsdC5sZW5ndGg7d2hpbGUobGVuZ3RoLS0pe3ZhciBrZXk9cmVzdWx0W2xlbmd0aF0sdmFsdWU9b2JqZWN0W2tleV07cmVzdWx0W2xlbmd0aF09W2tleSx2YWx1ZSxpc1N0cmljdENvbXBhcmFibGUodmFsdWUpXX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3Qsa2V5KXt2YXIgdmFsdWU9Z2V0VmFsdWUob2JqZWN0LGtleSk7cmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSk/dmFsdWU6dW5kZWZpbmVkfWZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSl7dmFyIGlzT3duPQpoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLHN5bVRvU3RyaW5nVGFnKSx0YWc9dmFsdWVbc3ltVG9TdHJpbmdUYWddO3RyeXt2YWx1ZVtzeW1Ub1N0cmluZ1RhZ109dW5kZWZpbmVkO3ZhciB1bm1hc2tlZD10cnVlfWNhdGNoKGUpe312YXIgcmVzdWx0PW5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO2lmKHVubWFza2VkKWlmKGlzT3duKXZhbHVlW3N5bVRvU3RyaW5nVGFnXT10YWc7ZWxzZSBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO3JldHVybiByZXN1bHR9dmFyIGdldFN5bWJvbHM9IW5hdGl2ZUdldFN5bWJvbHM/c3R1YkFycmF5OmZ1bmN0aW9uKG9iamVjdCl7aWYob2JqZWN0PT1udWxsKXJldHVybltdO29iamVjdD1PYmplY3Qob2JqZWN0KTtyZXR1cm4gYXJyYXlGaWx0ZXIobmF0aXZlR2V0U3ltYm9scyhvYmplY3QpLGZ1bmN0aW9uKHN5bWJvbCl7cmV0dXJuIHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqZWN0LHN5bWJvbCl9KX07dmFyIGdldFN5bWJvbHNJbj0KIW5hdGl2ZUdldFN5bWJvbHM/c3R1YkFycmF5OmZ1bmN0aW9uKG9iamVjdCl7dmFyIHJlc3VsdD1bXTt3aGlsZShvYmplY3Qpe2FycmF5UHVzaChyZXN1bHQsZ2V0U3ltYm9scyhvYmplY3QpKTtvYmplY3Q9Z2V0UHJvdG90eXBlKG9iamVjdCl9cmV0dXJuIHJlc3VsdH07dmFyIGdldFRhZz1iYXNlR2V0VGFnO2lmKERhdGFWaWV3JiZnZXRUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpIT1kYXRhVmlld1RhZ3x8TWFwJiZnZXRUYWcobmV3IE1hcCkhPW1hcFRhZ3x8UHJvbWlzZSYmZ2V0VGFnKFByb21pc2UucmVzb2x2ZSgpKSE9cHJvbWlzZVRhZ3x8U2V0JiZnZXRUYWcobmV3IFNldCkhPXNldFRhZ3x8V2Vha01hcCYmZ2V0VGFnKG5ldyBXZWFrTWFwKSE9d2Vha01hcFRhZylnZXRUYWc9ZnVuY3Rpb24odmFsdWUpe3ZhciByZXN1bHQ9YmFzZUdldFRhZyh2YWx1ZSksQ3Rvcj1yZXN1bHQ9PW9iamVjdFRhZz92YWx1ZS5jb25zdHJ1Y3Rvcjp1bmRlZmluZWQsY3RvclN0cmluZz0KQ3Rvcj90b1NvdXJjZShDdG9yKToiIjtpZihjdG9yU3RyaW5nKXN3aXRjaChjdG9yU3RyaW5nKXtjYXNlIGRhdGFWaWV3Q3RvclN0cmluZzpyZXR1cm4gZGF0YVZpZXdUYWc7Y2FzZSBtYXBDdG9yU3RyaW5nOnJldHVybiBtYXBUYWc7Y2FzZSBwcm9taXNlQ3RvclN0cmluZzpyZXR1cm4gcHJvbWlzZVRhZztjYXNlIHNldEN0b3JTdHJpbmc6cmV0dXJuIHNldFRhZztjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOnJldHVybiB3ZWFrTWFwVGFnfXJldHVybiByZXN1bHR9O2Z1bmN0aW9uIGdldFZpZXcoc3RhcnQsZW5kLHRyYW5zZm9ybXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9dHJhbnNmb3Jtcy5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBkYXRhPXRyYW5zZm9ybXNbaW5kZXhdLHNpemU9ZGF0YS5zaXplO3N3aXRjaChkYXRhLnR5cGUpe2Nhc2UgImRyb3AiOnN0YXJ0Kz1zaXplO2JyZWFrO2Nhc2UgImRyb3BSaWdodCI6ZW5kLT1zaXplO2JyZWFrO2Nhc2UgInRha2UiOmVuZD1uYXRpdmVNaW4oZW5kLApzdGFydCtzaXplKTticmVhaztjYXNlICJ0YWtlUmlnaHQiOnN0YXJ0PW5hdGl2ZU1heChzdGFydCxlbmQtc2l6ZSk7YnJlYWt9fXJldHVybnsic3RhcnQiOnN0YXJ0LCJlbmQiOmVuZH19ZnVuY3Rpb24gZ2V0V3JhcERldGFpbHMoc291cmNlKXt2YXIgbWF0Y2g9c291cmNlLm1hdGNoKHJlV3JhcERldGFpbHMpO3JldHVybiBtYXRjaD9tYXRjaFsxXS5zcGxpdChyZVNwbGl0RGV0YWlscyk6W119ZnVuY3Rpb24gaGFzUGF0aChvYmplY3QscGF0aCxoYXNGdW5jKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhdGgubGVuZ3RoLHJlc3VsdD1mYWxzZTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGtleT10b0tleShwYXRoW2luZGV4XSk7aWYoIShyZXN1bHQ9b2JqZWN0IT1udWxsJiZoYXNGdW5jKG9iamVjdCxrZXkpKSlicmVhaztvYmplY3Q9b2JqZWN0W2tleV19aWYocmVzdWx0fHwrK2luZGV4IT1sZW5ndGgpcmV0dXJuIHJlc3VsdDtsZW5ndGg9Cm9iamVjdD09bnVsbD8wOm9iamVjdC5sZW5ndGg7cmV0dXJuISFsZW5ndGgmJmlzTGVuZ3RoKGxlbmd0aCkmJmlzSW5kZXgoa2V5LGxlbmd0aCkmJihpc0FycmF5KG9iamVjdCl8fGlzQXJndW1lbnRzKG9iamVjdCkpfWZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxyZXN1bHQ9bmV3IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7aWYobGVuZ3RoJiZ0eXBlb2YgYXJyYXlbMF09PSJzdHJpbmciJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCJpbmRleCIpKXtyZXN1bHQuaW5kZXg9YXJyYXkuaW5kZXg7cmVzdWx0LmlucHV0PWFycmF5LmlucHV0fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gaW5pdENsb25lT2JqZWN0KG9iamVjdCl7cmV0dXJuIHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3I9PSJmdW5jdGlvbiImJiFpc1Byb3RvdHlwZShvYmplY3QpP2Jhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpOnt9fWZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwKdGFnLGlzRGVlcCl7dmFyIEN0b3I9b2JqZWN0LmNvbnN0cnVjdG9yO3N3aXRjaCh0YWcpe2Nhc2UgYXJyYXlCdWZmZXJUYWc6cmV0dXJuIGNsb25lQXJyYXlCdWZmZXIob2JqZWN0KTtjYXNlIGJvb2xUYWc6Y2FzZSBkYXRlVGFnOnJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtjYXNlIGRhdGFWaWV3VGFnOnJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCxpc0RlZXApO2Nhc2UgZmxvYXQzMlRhZzpjYXNlIGZsb2F0NjRUYWc6Y2FzZSBpbnQ4VGFnOmNhc2UgaW50MTZUYWc6Y2FzZSBpbnQzMlRhZzpjYXNlIHVpbnQ4VGFnOmNhc2UgdWludDhDbGFtcGVkVGFnOmNhc2UgdWludDE2VGFnOmNhc2UgdWludDMyVGFnOnJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LGlzRGVlcCk7Y2FzZSBtYXBUYWc6cmV0dXJuIG5ldyBDdG9yO2Nhc2UgbnVtYmVyVGFnOmNhc2Ugc3RyaW5nVGFnOnJldHVybiBuZXcgQ3RvcihvYmplY3QpO2Nhc2UgcmVnZXhwVGFnOnJldHVybiBjbG9uZVJlZ0V4cChvYmplY3QpOwpjYXNlIHNldFRhZzpyZXR1cm4gbmV3IEN0b3I7Y2FzZSBzeW1ib2xUYWc6cmV0dXJuIGNsb25lU3ltYm9sKG9iamVjdCl9fWZ1bmN0aW9uIGluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSxkZXRhaWxzKXt2YXIgbGVuZ3RoPWRldGFpbHMubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuIHNvdXJjZTt2YXIgbGFzdEluZGV4PWxlbmd0aC0xO2RldGFpbHNbbGFzdEluZGV4XT0obGVuZ3RoPjE/Ilx4MjYgIjoiIikrZGV0YWlsc1tsYXN0SW5kZXhdO2RldGFpbHM9ZGV0YWlscy5qb2luKGxlbmd0aD4yPyIsICI6IiAiKTtyZXR1cm4gc291cmNlLnJlcGxhY2UocmVXcmFwQ29tbWVudCwie1xuLyogW3dyYXBwZWQgd2l0aCAiK2RldGFpbHMrIl0gKi9cbiIpfWZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpe3JldHVybiBpc0FycmF5KHZhbHVlKXx8aXNBcmd1bWVudHModmFsdWUpfHwhIShzcHJlYWRhYmxlU3ltYm9sJiZ2YWx1ZSYmdmFsdWVbc3ByZWFkYWJsZVN5bWJvbF0pfWZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsCmxlbmd0aCl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO2xlbmd0aD1sZW5ndGg9PW51bGw/TUFYX1NBRkVfSU5URUdFUjpsZW5ndGg7cmV0dXJuISFsZW5ndGgmJih0eXBlPT0ibnVtYmVyInx8dHlwZSE9InN5bWJvbCImJnJlSXNVaW50LnRlc3QodmFsdWUpKSYmKHZhbHVlPi0xJiZ2YWx1ZSUxPT0wJiZ2YWx1ZTxsZW5ndGgpfWZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLGluZGV4LG9iamVjdCl7aWYoIWlzT2JqZWN0KG9iamVjdCkpcmV0dXJuIGZhbHNlO3ZhciB0eXBlPXR5cGVvZiBpbmRleDtpZih0eXBlPT0ibnVtYmVyIj9pc0FycmF5TGlrZShvYmplY3QpJiZpc0luZGV4KGluZGV4LG9iamVjdC5sZW5ndGgpOnR5cGU9PSJzdHJpbmciJiZpbmRleCBpbiBvYmplY3QpcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sdmFsdWUpO3JldHVybiBmYWxzZX1mdW5jdGlvbiBpc0tleSh2YWx1ZSxvYmplY3Qpe2lmKGlzQXJyYXkodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdHlwZT10eXBlb2YgdmFsdWU7CmlmKHR5cGU9PSJudW1iZXIifHx0eXBlPT0ic3ltYm9sInx8dHlwZT09ImJvb2xlYW4ifHx2YWx1ZT09bnVsbHx8aXNTeW1ib2wodmFsdWUpKXJldHVybiB0cnVlO3JldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpfHwhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpfHxvYmplY3QhPW51bGwmJnZhbHVlIGluIE9iamVjdChvYmplY3QpfWZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO3JldHVybiB0eXBlPT0ic3RyaW5nInx8dHlwZT09Im51bWJlciJ8fHR5cGU9PSJzeW1ib2wifHx0eXBlPT0iYm9vbGVhbiI/dmFsdWUhPT0iX19wcm90b19fIjp2YWx1ZT09PW51bGx9ZnVuY3Rpb24gaXNMYXppYWJsZShmdW5jKXt2YXIgZnVuY05hbWU9Z2V0RnVuY05hbWUoZnVuYyksb3RoZXI9bG9kYXNoW2Z1bmNOYW1lXTtpZih0eXBlb2Ygb3RoZXIhPSJmdW5jdGlvbiJ8fCEoZnVuY05hbWUgaW4gTGF6eVdyYXBwZXIucHJvdG90eXBlKSlyZXR1cm4gZmFsc2U7CmlmKGZ1bmM9PT1vdGhlcilyZXR1cm4gdHJ1ZTt2YXIgZGF0YT1nZXREYXRhKG90aGVyKTtyZXR1cm4hIWRhdGEmJmZ1bmM9PT1kYXRhWzBdfWZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpe3JldHVybiEhbWFza1NyY0tleSYmbWFza1NyY0tleSBpbiBmdW5jfXZhciBpc01hc2thYmxlPWNvcmVKc0RhdGE/aXNGdW5jdGlvbjpzdHViRmFsc2U7ZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpe3ZhciBDdG9yPXZhbHVlJiZ2YWx1ZS5jb25zdHJ1Y3Rvcixwcm90bz10eXBlb2YgQ3Rvcj09ImZ1bmN0aW9uIiYmQ3Rvci5wcm90b3R5cGV8fG9iamVjdFByb3RvO3JldHVybiB2YWx1ZT09PXByb3RvfWZ1bmN0aW9uIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09dmFsdWUmJiFpc09iamVjdCh2YWx1ZSl9ZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LHNyY1ZhbHVlKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtpZihvYmplY3Q9PW51bGwpcmV0dXJuIGZhbHNlOwpyZXR1cm4gb2JqZWN0W2tleV09PT1zcmNWYWx1ZSYmKHNyY1ZhbHVlIT09dW5kZWZpbmVkfHxrZXkgaW4gT2JqZWN0KG9iamVjdCkpfX1mdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpe3ZhciByZXN1bHQ9bWVtb2l6ZShmdW5jLGZ1bmN0aW9uKGtleSl7aWYoY2FjaGUuc2l6ZT09PU1BWF9NRU1PSVpFX1NJWkUpY2FjaGUuY2xlYXIoKTtyZXR1cm4ga2V5fSk7dmFyIGNhY2hlPXJlc3VsdC5jYWNoZTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG1lcmdlRGF0YShkYXRhLHNvdXJjZSl7dmFyIGJpdG1hc2s9ZGF0YVsxXSxzcmNCaXRtYXNrPXNvdXJjZVsxXSxuZXdCaXRtYXNrPWJpdG1hc2t8c3JjQml0bWFzayxpc0NvbW1vbj1uZXdCaXRtYXNrPChXUkFQX0JJTkRfRkxBR3xXUkFQX0JJTkRfS0VZX0ZMQUd8V1JBUF9BUllfRkxBRyk7dmFyIGlzQ29tYm89c3JjQml0bWFzaz09V1JBUF9BUllfRkxBRyYmYml0bWFzaz09V1JBUF9DVVJSWV9GTEFHfHxzcmNCaXRtYXNrPT1XUkFQX0FSWV9GTEFHJiYKYml0bWFzaz09V1JBUF9SRUFSR19GTEFHJiZkYXRhWzddLmxlbmd0aDw9c291cmNlWzhdfHxzcmNCaXRtYXNrPT0oV1JBUF9BUllfRkxBR3xXUkFQX1JFQVJHX0ZMQUcpJiZzb3VyY2VbN10ubGVuZ3RoPD1zb3VyY2VbOF0mJmJpdG1hc2s9PVdSQVBfQ1VSUllfRkxBRztpZighKGlzQ29tbW9ufHxpc0NvbWJvKSlyZXR1cm4gZGF0YTtpZihzcmNCaXRtYXNrJldSQVBfQklORF9GTEFHKXtkYXRhWzJdPXNvdXJjZVsyXTtuZXdCaXRtYXNrfD1iaXRtYXNrJldSQVBfQklORF9GTEFHPzA6V1JBUF9DVVJSWV9CT1VORF9GTEFHfXZhciB2YWx1ZT1zb3VyY2VbM107aWYodmFsdWUpe3ZhciBwYXJ0aWFscz1kYXRhWzNdO2RhdGFbM109cGFydGlhbHM/Y29tcG9zZUFyZ3MocGFydGlhbHMsdmFsdWUsc291cmNlWzRdKTp2YWx1ZTtkYXRhWzRdPXBhcnRpYWxzP3JlcGxhY2VIb2xkZXJzKGRhdGFbM10sUExBQ0VIT0xERVIpOnNvdXJjZVs0XX12YWx1ZT1zb3VyY2VbNV07aWYodmFsdWUpe3BhcnRpYWxzPQpkYXRhWzVdO2RhdGFbNV09cGFydGlhbHM/Y29tcG9zZUFyZ3NSaWdodChwYXJ0aWFscyx2YWx1ZSxzb3VyY2VbNl0pOnZhbHVlO2RhdGFbNl09cGFydGlhbHM/cmVwbGFjZUhvbGRlcnMoZGF0YVs1XSxQTEFDRUhPTERFUik6c291cmNlWzZdfXZhbHVlPXNvdXJjZVs3XTtpZih2YWx1ZSlkYXRhWzddPXZhbHVlO2lmKHNyY0JpdG1hc2smV1JBUF9BUllfRkxBRylkYXRhWzhdPWRhdGFbOF09PW51bGw/c291cmNlWzhdOm5hdGl2ZU1pbihkYXRhWzhdLHNvdXJjZVs4XSk7aWYoZGF0YVs5XT09bnVsbClkYXRhWzldPXNvdXJjZVs5XTtkYXRhWzBdPXNvdXJjZVswXTtkYXRhWzFdPW5ld0JpdG1hc2s7cmV0dXJuIGRhdGF9ZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCl7dmFyIHJlc3VsdD1bXTtpZihvYmplY3QhPW51bGwpZm9yKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKXtyZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSl9CmZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsc3RhcnQsdHJhbnNmb3JtKXtzdGFydD1uYXRpdmVNYXgoc3RhcnQ9PT11bmRlZmluZWQ/ZnVuYy5sZW5ndGgtMTpzdGFydCwwKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHMsaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1heChhcmdzLmxlbmd0aC1zdGFydCwwKSxhcnJheT1BcnJheShsZW5ndGgpO3doaWxlKCsraW5kZXg8bGVuZ3RoKWFycmF5W2luZGV4XT1hcmdzW3N0YXJ0K2luZGV4XTtpbmRleD0tMTt2YXIgb3RoZXJBcmdzPUFycmF5KHN0YXJ0KzEpO3doaWxlKCsraW5kZXg8c3RhcnQpb3RoZXJBcmdzW2luZGV4XT1hcmdzW2luZGV4XTtvdGhlckFyZ3Nbc3RhcnRdPXRyYW5zZm9ybShhcnJheSk7cmV0dXJuIGFwcGx5KGZ1bmMsdGhpcyxvdGhlckFyZ3MpfX1mdW5jdGlvbiBwYXJlbnQob2JqZWN0LHBhdGgpe3JldHVybiBwYXRoLmxlbmd0aDwyP29iamVjdDpiYXNlR2V0KG9iamVjdCxiYXNlU2xpY2UocGF0aCwwLC0xKSl9CmZ1bmN0aW9uIHJlb3JkZXIoYXJyYXksaW5kZXhlcyl7dmFyIGFyckxlbmd0aD1hcnJheS5sZW5ndGgsbGVuZ3RoPW5hdGl2ZU1pbihpbmRleGVzLmxlbmd0aCxhcnJMZW5ndGgpLG9sZEFycmF5PWNvcHlBcnJheShhcnJheSk7d2hpbGUobGVuZ3RoLS0pe3ZhciBpbmRleD1pbmRleGVzW2xlbmd0aF07YXJyYXlbbGVuZ3RoXT1pc0luZGV4KGluZGV4LGFyckxlbmd0aCk/b2xkQXJyYXlbaW5kZXhdOnVuZGVmaW5lZH1yZXR1cm4gYXJyYXl9dmFyIHNldERhdGE9c2hvcnRPdXQoYmFzZVNldERhdGEpO3ZhciBzZXRUaW1lb3V0PWN0eFNldFRpbWVvdXR8fGZ1bmN0aW9uKGZ1bmMsd2FpdCl7cmV0dXJuIHJvb3Quc2V0VGltZW91dChmdW5jLHdhaXQpfTt2YXIgc2V0VG9TdHJpbmc9c2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtmdW5jdGlvbiBzZXRXcmFwVG9TdHJpbmcod3JhcHBlcixyZWZlcmVuY2UsYml0bWFzayl7dmFyIHNvdXJjZT1yZWZlcmVuY2UrIiI7cmV0dXJuIHNldFRvU3RyaW5nKHdyYXBwZXIsCmluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSx1cGRhdGVXcmFwRGV0YWlscyhnZXRXcmFwRGV0YWlscyhzb3VyY2UpLGJpdG1hc2spKSl9ZnVuY3Rpb24gc2hvcnRPdXQoZnVuYyl7dmFyIGNvdW50PTAsbGFzdENhbGxlZD0wO3JldHVybiBmdW5jdGlvbigpe3ZhciBzdGFtcD1uYXRpdmVOb3coKSxyZW1haW5pbmc9SE9UX1NQQU4tKHN0YW1wLWxhc3RDYWxsZWQpO2xhc3RDYWxsZWQ9c3RhbXA7aWYocmVtYWluaW5nPjApe2lmKCsrY291bnQ+PUhPVF9DT1VOVClyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgY291bnQ9MDtyZXR1cm4gZnVuYy5hcHBseSh1bmRlZmluZWQsYXJndW1lbnRzKX19ZnVuY3Rpb24gc2h1ZmZsZVNlbGYoYXJyYXksc2l6ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGgsbGFzdEluZGV4PWxlbmd0aC0xO3NpemU9c2l6ZT09PXVuZGVmaW5lZD9sZW5ndGg6c2l6ZTt3aGlsZSgrK2luZGV4PHNpemUpe3ZhciByYW5kPWJhc2VSYW5kb20oaW5kZXgsbGFzdEluZGV4KSwKdmFsdWU9YXJyYXlbcmFuZF07YXJyYXlbcmFuZF09YXJyYXlbaW5kZXhdO2FycmF5W2luZGV4XT12YWx1ZX1hcnJheS5sZW5ndGg9c2l6ZTtyZXR1cm4gYXJyYXl9dmFyIHN0cmluZ1RvUGF0aD1tZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZyl7dmFyIHJlc3VsdD1bXTtpZihzdHJpbmcuY2hhckNvZGVBdCgwKT09PTQ2KXJlc3VsdC5wdXNoKCIiKTtzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLGZ1bmN0aW9uKG1hdGNoLG51bWJlcixxdW90ZSxzdWJTdHJpbmcpe3Jlc3VsdC5wdXNoKHF1b3RlP3N1YlN0cmluZy5yZXBsYWNlKHJlRXNjYXBlQ2hhciwiJDEiKTpudW1iZXJ8fG1hdGNoKX0pO3JldHVybiByZXN1bHR9KTtmdW5jdGlvbiB0b0tleSh2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT0ic3RyaW5nInx8aXNTeW1ib2wodmFsdWUpKXJldHVybiB2YWx1ZTt2YXIgcmVzdWx0PXZhbHVlKyIiO3JldHVybiByZXN1bHQ9PSIwIiYmMS92YWx1ZT09LUlORklOSVRZPyItMCI6cmVzdWx0fQpmdW5jdGlvbiB0b1NvdXJjZShmdW5jKXtpZihmdW5jIT1udWxsKXt0cnl7cmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpfWNhdGNoKGUpe310cnl7cmV0dXJuIGZ1bmMrIiJ9Y2F0Y2goZSQwKXt9fXJldHVybiIifWZ1bmN0aW9uIHVwZGF0ZVdyYXBEZXRhaWxzKGRldGFpbHMsYml0bWFzayl7YXJyYXlFYWNoKHdyYXBGbGFncyxmdW5jdGlvbihwYWlyKXt2YXIgdmFsdWU9Il8uIitwYWlyWzBdO2lmKGJpdG1hc2smcGFpclsxXSYmIWFycmF5SW5jbHVkZXMoZGV0YWlscyx2YWx1ZSkpZGV0YWlscy5wdXNoKHZhbHVlKX0pO3JldHVybiBkZXRhaWxzLnNvcnQoKX1mdW5jdGlvbiB3cmFwcGVyQ2xvbmUod3JhcHBlcil7aWYod3JhcHBlciBpbnN0YW5jZW9mIExhenlXcmFwcGVyKXJldHVybiB3cmFwcGVyLmNsb25lKCk7dmFyIHJlc3VsdD1uZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVyLl9fd3JhcHBlZF9fLHdyYXBwZXIuX19jaGFpbl9fKTtyZXN1bHQuX19hY3Rpb25zX189Y29weUFycmF5KHdyYXBwZXIuX19hY3Rpb25zX18pOwpyZXN1bHQuX19pbmRleF9fPXdyYXBwZXIuX19pbmRleF9fO3Jlc3VsdC5fX3ZhbHVlc19fPXdyYXBwZXIuX192YWx1ZXNfXztyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNodW5rKGFycmF5LHNpemUsZ3VhcmQpe2lmKGd1YXJkP2lzSXRlcmF0ZWVDYWxsKGFycmF5LHNpemUsZ3VhcmQpOnNpemU9PT11bmRlZmluZWQpc2l6ZT0xO2Vsc2Ugc2l6ZT1uYXRpdmVNYXgodG9JbnRlZ2VyKHNpemUpLDApO3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aHx8c2l6ZTwxKXJldHVybltdO3ZhciBpbmRleD0wLHJlc0luZGV4PTAscmVzdWx0PUFycmF5KG5hdGl2ZUNlaWwobGVuZ3RoL3NpemUpKTt3aGlsZShpbmRleDxsZW5ndGgpcmVzdWx0W3Jlc0luZGV4KytdPWJhc2VTbGljZShhcnJheSxpbmRleCxpbmRleCs9c2l6ZSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb21wYWN0KGFycmF5KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoLApyZXNJbmRleD0wLHJlc3VsdD1bXTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZih2YWx1ZSlyZXN1bHRbcmVzSW5kZXgrK109dmFsdWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb25jYXQoKXt2YXIgbGVuZ3RoPWFyZ3VtZW50cy5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTt2YXIgYXJncz1BcnJheShsZW5ndGgtMSksYXJyYXk9YXJndW1lbnRzWzBdLGluZGV4PWxlbmd0aDt3aGlsZShpbmRleC0tKWFyZ3NbaW5kZXgtMV09YXJndW1lbnRzW2luZGV4XTtyZXR1cm4gYXJyYXlQdXNoKGlzQXJyYXkoYXJyYXkpP2NvcHlBcnJheShhcnJheSk6W2FycmF5XSxiYXNlRmxhdHRlbihhcmdzLDEpKX12YXIgZGlmZmVyZW5jZT1iYXNlUmVzdChmdW5jdGlvbihhcnJheSx2YWx1ZXMpe3JldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSk/YmFzZURpZmZlcmVuY2UoYXJyYXksYmFzZUZsYXR0ZW4odmFsdWVzLDEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSkpOgpbXX0pO3ZhciBkaWZmZXJlbmNlQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXt2YXIgaXRlcmF0ZWU9bGFzdCh2YWx1ZXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT11bmRlZmluZWQ7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KT9iYXNlRGlmZmVyZW5jZShhcnJheSxiYXNlRmxhdHRlbih2YWx1ZXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6W119KTt2YXIgZGlmZmVyZW5jZVdpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXt2YXIgY29tcGFyYXRvcj1sYXN0KHZhbHVlcyk7aWYoaXNBcnJheUxpa2VPYmplY3QoY29tcGFyYXRvcikpY29tcGFyYXRvcj11bmRlZmluZWQ7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KT9iYXNlRGlmZmVyZW5jZShhcnJheSxiYXNlRmxhdHRlbih2YWx1ZXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSx1bmRlZmluZWQsY29tcGFyYXRvcik6CltdfSk7ZnVuY3Rpb24gZHJvcChhcnJheSxuLGd1YXJkKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuW107bj1ndWFyZHx8bj09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihuKTtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LG48MD8wOm4sbGVuZ3RoKX1mdW5jdGlvbiBkcm9wUmlnaHQoYXJyYXksbixndWFyZCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybltdO249Z3VhcmR8fG49PT11bmRlZmluZWQ/MTp0b0ludGVnZXIobik7bj1sZW5ndGgtbjtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LDAsbjwwPzA6bil9ZnVuY3Rpb24gZHJvcFJpZ2h0V2hpbGUoYXJyYXkscHJlZGljYXRlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlV2hpbGUoYXJyYXksZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLHRydWUsdHJ1ZSk6W119ZnVuY3Rpb24gZHJvcFdoaWxlKGFycmF5LHByZWRpY2F0ZSl7cmV0dXJuIGFycmF5JiYKYXJyYXkubGVuZ3RoP2Jhc2VXaGlsZShhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksdHJ1ZSk6W119ZnVuY3Rpb24gZmlsbChhcnJheSx2YWx1ZSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtpZihzdGFydCYmdHlwZW9mIHN0YXJ0IT0ibnVtYmVyIiYmaXNJdGVyYXRlZUNhbGwoYXJyYXksdmFsdWUsc3RhcnQpKXtzdGFydD0wO2VuZD1sZW5ndGh9cmV0dXJuIGJhc2VGaWxsKGFycmF5LHZhbHVlLHN0YXJ0LGVuZCl9ZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LHByZWRpY2F0ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4tMTt2YXIgaW5kZXg9ZnJvbUluZGV4PT1udWxsPzA6dG9JbnRlZ2VyKGZyb21JbmRleCk7aWYoaW5kZXg8MClpbmRleD1uYXRpdmVNYXgobGVuZ3RoK2luZGV4LDApO3JldHVybiBiYXNlRmluZEluZGV4KGFycmF5LApnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksaW5kZXgpfWZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgoYXJyYXkscHJlZGljYXRlLGZyb21JbmRleCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybi0xO3ZhciBpbmRleD1sZW5ndGgtMTtpZihmcm9tSW5kZXghPT11bmRlZmluZWQpe2luZGV4PXRvSW50ZWdlcihmcm9tSW5kZXgpO2luZGV4PWZyb21JbmRleDwwP25hdGl2ZU1heChsZW5ndGgraW5kZXgsMCk6bmF0aXZlTWluKGluZGV4LGxlbmd0aC0xKX1yZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksaW5kZXgsdHJ1ZSl9ZnVuY3Rpb24gZmxhdHRlbihhcnJheSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtyZXR1cm4gbGVuZ3RoP2Jhc2VGbGF0dGVuKGFycmF5LDEpOltdfWZ1bmN0aW9uIGZsYXR0ZW5EZWVwKGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoOwpyZXR1cm4gbGVuZ3RoP2Jhc2VGbGF0dGVuKGFycmF5LElORklOSVRZKTpbXX1mdW5jdGlvbiBmbGF0dGVuRGVwdGgoYXJyYXksZGVwdGgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtkZXB0aD1kZXB0aD09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihkZXB0aCk7cmV0dXJuIGJhc2VGbGF0dGVuKGFycmF5LGRlcHRoKX1mdW5jdGlvbiBmcm9tUGFpcnMocGFpcnMpe3ZhciBpbmRleD0tMSxsZW5ndGg9cGFpcnM9PW51bGw/MDpwYWlycy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcGFpcj1wYWlyc1tpbmRleF07cmVzdWx0W3BhaXJbMF1dPXBhaXJbMV19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBoZWFkKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9hcnJheVswXTp1bmRlZmluZWR9ZnVuY3Rpb24gaW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PQpudWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuLTE7dmFyIGluZGV4PWZyb21JbmRleD09bnVsbD8wOnRvSW50ZWdlcihmcm9tSW5kZXgpO2lmKGluZGV4PDApaW5kZXg9bmF0aXZlTWF4KGxlbmd0aCtpbmRleCwwKTtyZXR1cm4gYmFzZUluZGV4T2YoYXJyYXksdmFsdWUsaW5kZXgpfWZ1bmN0aW9uIGluaXRpYWwoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU2xpY2UoYXJyYXksMCwtMSk6W119dmFyIGludGVyc2VjdGlvbj1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBtYXBwZWQ9YXJyYXlNYXAoYXJyYXlzLGNhc3RBcnJheUxpa2VPYmplY3QpO3JldHVybiBtYXBwZWQubGVuZ3RoJiZtYXBwZWRbMF09PT1hcnJheXNbMF0/YmFzZUludGVyc2VjdGlvbihtYXBwZWQpOltdfSk7dmFyIGludGVyc2VjdGlvbkJ5PWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGl0ZXJhdGVlPWxhc3QoYXJyYXlzKSwKbWFwcGVkPWFycmF5TWFwKGFycmF5cyxjYXN0QXJyYXlMaWtlT2JqZWN0KTtpZihpdGVyYXRlZT09PWxhc3QobWFwcGVkKSlpdGVyYXRlZT11bmRlZmluZWQ7ZWxzZSBtYXBwZWQucG9wKCk7cmV0dXJuIG1hcHBlZC5sZW5ndGgmJm1hcHBlZFswXT09PWFycmF5c1swXT9iYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6W119KTt2YXIgaW50ZXJzZWN0aW9uV2l0aD1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBjb21wYXJhdG9yPWxhc3QoYXJyYXlzKSxtYXBwZWQ9YXJyYXlNYXAoYXJyYXlzLGNhc3RBcnJheUxpa2VPYmplY3QpO2NvbXBhcmF0b3I9dHlwZW9mIGNvbXBhcmF0b3I9PSJmdW5jdGlvbiI/Y29tcGFyYXRvcjp1bmRlZmluZWQ7aWYoY29tcGFyYXRvciltYXBwZWQucG9wKCk7cmV0dXJuIG1hcHBlZC5sZW5ndGgmJm1hcHBlZFswXT09PWFycmF5c1swXT9iYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCx1bmRlZmluZWQsY29tcGFyYXRvcik6CltdfSk7ZnVuY3Rpb24gam9pbihhcnJheSxzZXBhcmF0b3Ipe3JldHVybiBhcnJheT09bnVsbD8iIjpuYXRpdmVKb2luLmNhbGwoYXJyYXksc2VwYXJhdG9yKX1mdW5jdGlvbiBsYXN0KGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3JldHVybiBsZW5ndGg/YXJyYXlbbGVuZ3RoLTFdOnVuZGVmaW5lZH1mdW5jdGlvbiBsYXN0SW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4tMTt2YXIgaW5kZXg9bGVuZ3RoO2lmKGZyb21JbmRleCE9PXVuZGVmaW5lZCl7aW5kZXg9dG9JbnRlZ2VyKGZyb21JbmRleCk7aW5kZXg9aW5kZXg8MD9uYXRpdmVNYXgobGVuZ3RoK2luZGV4LDApOm5hdGl2ZU1pbihpbmRleCxsZW5ndGgtMSl9cmV0dXJuIHZhbHVlPT09dmFsdWU/c3RyaWN0TGFzdEluZGV4T2YoYXJyYXksdmFsdWUsaW5kZXgpOmJhc2VGaW5kSW5kZXgoYXJyYXksCmJhc2VJc05hTixpbmRleCx0cnVlKX1mdW5jdGlvbiBudGgoYXJyYXksbil7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZU50aChhcnJheSx0b0ludGVnZXIobikpOnVuZGVmaW5lZH12YXIgcHVsbD1iYXNlUmVzdChwdWxsQWxsKTtmdW5jdGlvbiBwdWxsQWxsKGFycmF5LHZhbHVlcyl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGgmJnZhbHVlcyYmdmFsdWVzLmxlbmd0aD9iYXNlUHVsbEFsbChhcnJheSx2YWx1ZXMpOmFycmF5fWZ1bmN0aW9uIHB1bGxBbGxCeShhcnJheSx2YWx1ZXMsaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoJiZ2YWx1ZXMmJnZhbHVlcy5sZW5ndGg/YmFzZVB1bGxBbGwoYXJyYXksdmFsdWVzLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTphcnJheX1mdW5jdGlvbiBwdWxsQWxsV2l0aChhcnJheSx2YWx1ZXMsY29tcGFyYXRvcil7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGgmJnZhbHVlcyYmdmFsdWVzLmxlbmd0aD9iYXNlUHVsbEFsbChhcnJheSwKdmFsdWVzLHVuZGVmaW5lZCxjb21wYXJhdG9yKTphcnJheX12YXIgcHVsbEF0PWZsYXRSZXN0KGZ1bmN0aW9uKGFycmF5LGluZGV4ZXMpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGgscmVzdWx0PWJhc2VBdChhcnJheSxpbmRleGVzKTtiYXNlUHVsbEF0KGFycmF5LGFycmF5TWFwKGluZGV4ZXMsZnVuY3Rpb24oaW5kZXgpe3JldHVybiBpc0luZGV4KGluZGV4LGxlbmd0aCk/K2luZGV4OmluZGV4fSkuc29ydChjb21wYXJlQXNjZW5kaW5nKSk7cmV0dXJuIHJlc3VsdH0pO2Z1bmN0aW9uIHJlbW92ZShhcnJheSxwcmVkaWNhdGUpe3ZhciByZXN1bHQ9W107aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm4gcmVzdWx0O3ZhciBpbmRleD0tMSxpbmRleGVzPVtdLGxlbmd0aD1hcnJheS5sZW5ndGg7cHJlZGljYXRlPWdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihwcmVkaWNhdGUodmFsdWUsCmluZGV4LGFycmF5KSl7cmVzdWx0LnB1c2godmFsdWUpO2luZGV4ZXMucHVzaChpbmRleCl9fWJhc2VQdWxsQXQoYXJyYXksaW5kZXhlcyk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiByZXZlcnNlKGFycmF5KXtyZXR1cm4gYXJyYXk9PW51bGw/YXJyYXk6bmF0aXZlUmV2ZXJzZS5jYWxsKGFycmF5KX1mdW5jdGlvbiBzbGljZShhcnJheSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtpZihlbmQmJnR5cGVvZiBlbmQhPSJudW1iZXIiJiZpc0l0ZXJhdGVlQ2FsbChhcnJheSxzdGFydCxlbmQpKXtzdGFydD0wO2VuZD1sZW5ndGh9ZWxzZXtzdGFydD1zdGFydD09bnVsbD8wOnRvSW50ZWdlcihzdGFydCk7ZW5kPWVuZD09PXVuZGVmaW5lZD9sZW5ndGg6dG9JbnRlZ2VyKGVuZCl9cmV0dXJuIGJhc2VTbGljZShhcnJheSxzdGFydCxlbmQpfWZ1bmN0aW9uIHNvcnRlZEluZGV4KGFycmF5LHZhbHVlKXtyZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LAp2YWx1ZSl9ZnVuY3Rpb24gc29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxpdGVyYXRlZSl7cmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LHZhbHVlLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKX1mdW5jdGlvbiBzb3J0ZWRJbmRleE9mKGFycmF5LHZhbHVlKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGxlbmd0aCl7dmFyIGluZGV4PWJhc2VTb3J0ZWRJbmRleChhcnJheSx2YWx1ZSk7aWYoaW5kZXg8bGVuZ3RoJiZlcShhcnJheVtpbmRleF0sdmFsdWUpKXJldHVybiBpbmRleH1yZXR1cm4tMX1mdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXgoYXJyYXksdmFsdWUpe3JldHVybiBiYXNlU29ydGVkSW5kZXgoYXJyYXksdmFsdWUsdHJ1ZSl9ZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4QnkoYXJyYXksdmFsdWUsaXRlcmF0ZWUpe3JldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSx0cnVlKX1mdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhPZihhcnJheSwKdmFsdWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYobGVuZ3RoKXt2YXIgaW5kZXg9YmFzZVNvcnRlZEluZGV4KGFycmF5LHZhbHVlLHRydWUpLTE7aWYoZXEoYXJyYXlbaW5kZXhdLHZhbHVlKSlyZXR1cm4gaW5kZXh9cmV0dXJuLTF9ZnVuY3Rpb24gc29ydGVkVW5pcShhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVNvcnRlZFVuaXEoYXJyYXkpOltdfWZ1bmN0aW9uIHNvcnRlZFVuaXFCeShhcnJheSxpdGVyYXRlZSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVNvcnRlZFVuaXEoYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpOltdfWZ1bmN0aW9uIHRhaWwoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU2xpY2UoYXJyYXksMSxsZW5ndGgpOltdfWZ1bmN0aW9uIHRha2UoYXJyYXksbixndWFyZCl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTsKbj1ndWFyZHx8bj09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihuKTtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LDAsbjwwPzA6bil9ZnVuY3Rpb24gdGFrZVJpZ2h0KGFycmF5LG4sZ3VhcmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtuPWd1YXJkfHxuPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKG4pO249bGVuZ3RoLW47cmV0dXJuIGJhc2VTbGljZShhcnJheSxuPDA/MDpuLGxlbmd0aCl9ZnVuY3Rpb24gdGFrZVJpZ2h0V2hpbGUoYXJyYXkscHJlZGljYXRlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlV2hpbGUoYXJyYXksZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLGZhbHNlLHRydWUpOltdfWZ1bmN0aW9uIHRha2VXaGlsZShhcnJheSxwcmVkaWNhdGUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VXaGlsZShhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMykpOltdfXZhciB1bmlvbj1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3JldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsCjEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSkpfSk7dmFyIHVuaW9uQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgaXRlcmF0ZWU9bGFzdChhcnJheXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT11bmRlZmluZWQ7cmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywxLGlzQXJyYXlMaWtlT2JqZWN0LHRydWUpLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKX0pO3ZhciB1bmlvbldpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgY29tcGFyYXRvcj1sYXN0KGFycmF5cyk7Y29tcGFyYXRvcj10eXBlb2YgY29tcGFyYXRvcj09ImZ1bmN0aW9uIj9jb21wYXJhdG9yOnVuZGVmaW5lZDtyZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLDEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSksdW5kZWZpbmVkLGNvbXBhcmF0b3IpfSk7ZnVuY3Rpb24gdW5pcShhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVVuaXEoYXJyYXkpOgpbXX1mdW5jdGlvbiB1bmlxQnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VVbmlxKGFycmF5LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTpbXX1mdW5jdGlvbiB1bmlxV2l0aChhcnJheSxjb21wYXJhdG9yKXtjb21wYXJhdG9yPXR5cGVvZiBjb21wYXJhdG9yPT0iZnVuY3Rpb24iP2NvbXBhcmF0b3I6dW5kZWZpbmVkO3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VVbmlxKGFycmF5LHVuZGVmaW5lZCxjb21wYXJhdG9yKTpbXX1mdW5jdGlvbiB1bnppcChhcnJheSl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTt2YXIgbGVuZ3RoPTA7YXJyYXk9YXJyYXlGaWx0ZXIoYXJyYXksZnVuY3Rpb24oZ3JvdXApe2lmKGlzQXJyYXlMaWtlT2JqZWN0KGdyb3VwKSl7bGVuZ3RoPW5hdGl2ZU1heChncm91cC5sZW5ndGgsbGVuZ3RoKTtyZXR1cm4gdHJ1ZX19KTtyZXR1cm4gYmFzZVRpbWVzKGxlbmd0aCxmdW5jdGlvbihpbmRleCl7cmV0dXJuIGFycmF5TWFwKGFycmF5LApiYXNlUHJvcGVydHkoaW5kZXgpKX0pfWZ1bmN0aW9uIHVuemlwV2l0aChhcnJheSxpdGVyYXRlZSl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTt2YXIgcmVzdWx0PXVuemlwKGFycmF5KTtpZihpdGVyYXRlZT09bnVsbClyZXR1cm4gcmVzdWx0O3JldHVybiBhcnJheU1hcChyZXN1bHQsZnVuY3Rpb24oZ3JvdXApe3JldHVybiBhcHBseShpdGVyYXRlZSx1bmRlZmluZWQsZ3JvdXApfSl9dmFyIHdpdGhvdXQ9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXtyZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpP2Jhc2VEaWZmZXJlbmNlKGFycmF5LHZhbHVlcyk6W119KTt2YXIgeG9yPWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7cmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLGlzQXJyYXlMaWtlT2JqZWN0KSl9KTt2YXIgeG9yQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgaXRlcmF0ZWU9bGFzdChhcnJheXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT0KdW5kZWZpbmVkO3JldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cyxpc0FycmF5TGlrZU9iamVjdCksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpfSk7dmFyIHhvcldpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgY29tcGFyYXRvcj1sYXN0KGFycmF5cyk7Y29tcGFyYXRvcj10eXBlb2YgY29tcGFyYXRvcj09ImZ1bmN0aW9uIj9jb21wYXJhdG9yOnVuZGVmaW5lZDtyZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsaXNBcnJheUxpa2VPYmplY3QpLHVuZGVmaW5lZCxjb21wYXJhdG9yKX0pO3ZhciB6aXA9YmFzZVJlc3QodW56aXApO2Z1bmN0aW9uIHppcE9iamVjdChwcm9wcyx2YWx1ZXMpe3JldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzfHxbXSx2YWx1ZXN8fFtdLGFzc2lnblZhbHVlKX1mdW5jdGlvbiB6aXBPYmplY3REZWVwKHByb3BzLHZhbHVlcyl7cmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHN8fFtdLHZhbHVlc3x8W10sYmFzZVNldCl9dmFyIHppcFdpdGg9CmJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGxlbmd0aD1hcnJheXMubGVuZ3RoLGl0ZXJhdGVlPWxlbmd0aD4xP2FycmF5c1tsZW5ndGgtMV06dW5kZWZpbmVkO2l0ZXJhdGVlPXR5cGVvZiBpdGVyYXRlZT09ImZ1bmN0aW9uIj8oYXJyYXlzLnBvcCgpLGl0ZXJhdGVlKTp1bmRlZmluZWQ7cmV0dXJuIHVuemlwV2l0aChhcnJheXMsaXRlcmF0ZWUpfSk7ZnVuY3Rpb24gY2hhaW4odmFsdWUpe3ZhciByZXN1bHQ9bG9kYXNoKHZhbHVlKTtyZXN1bHQuX19jaGFpbl9fPXRydWU7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB0YXAodmFsdWUsaW50ZXJjZXB0b3Ipe2ludGVyY2VwdG9yKHZhbHVlKTtyZXR1cm4gdmFsdWV9ZnVuY3Rpb24gdGhydSh2YWx1ZSxpbnRlcmNlcHRvcil7cmV0dXJuIGludGVyY2VwdG9yKHZhbHVlKX12YXIgd3JhcHBlckF0PWZsYXRSZXN0KGZ1bmN0aW9uKHBhdGhzKXt2YXIgbGVuZ3RoPXBhdGhzLmxlbmd0aCxzdGFydD1sZW5ndGg/cGF0aHNbMF06MCx2YWx1ZT0KdGhpcy5fX3dyYXBwZWRfXyxpbnRlcmNlcHRvcj1mdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlQXQob2JqZWN0LHBhdGhzKX07aWYobGVuZ3RoPjF8fHRoaXMuX19hY3Rpb25zX18ubGVuZ3RofHwhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpfHwhaXNJbmRleChzdGFydCkpcmV0dXJuIHRoaXMudGhydShpbnRlcmNlcHRvcik7dmFsdWU9dmFsdWUuc2xpY2Uoc3RhcnQsK3N0YXJ0KyhsZW5ndGg/MTowKSk7dmFsdWUuX19hY3Rpb25zX18ucHVzaCh7ImZ1bmMiOnRocnUsImFyZ3MiOltpbnRlcmNlcHRvcl0sInRoaXNBcmciOnVuZGVmaW5lZH0pO3JldHVybihuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSx0aGlzLl9fY2hhaW5fXykpLnRocnUoZnVuY3Rpb24oYXJyYXkpe2lmKGxlbmd0aCYmIWFycmF5Lmxlbmd0aClhcnJheS5wdXNoKHVuZGVmaW5lZCk7cmV0dXJuIGFycmF5fSl9KTtmdW5jdGlvbiB3cmFwcGVyQ2hhaW4oKXtyZXR1cm4gY2hhaW4odGhpcyl9ZnVuY3Rpb24gd3JhcHBlckNvbW1pdCgpe3JldHVybiBuZXcgTG9kYXNoV3JhcHBlcih0aGlzLnZhbHVlKCksCnRoaXMuX19jaGFpbl9fKX1mdW5jdGlvbiB3cmFwcGVyTmV4dCgpe2lmKHRoaXMuX192YWx1ZXNfXz09PXVuZGVmaW5lZCl0aGlzLl9fdmFsdWVzX189dG9BcnJheSh0aGlzLnZhbHVlKCkpO3ZhciBkb25lPXRoaXMuX19pbmRleF9fPj10aGlzLl9fdmFsdWVzX18ubGVuZ3RoLHZhbHVlPWRvbmU/dW5kZWZpbmVkOnRoaXMuX192YWx1ZXNfX1t0aGlzLl9faW5kZXhfXysrXTtyZXR1cm57ImRvbmUiOmRvbmUsInZhbHVlIjp2YWx1ZX19ZnVuY3Rpb24gd3JhcHBlclRvSXRlcmF0b3IoKXtyZXR1cm4gdGhpc31mdW5jdGlvbiB3cmFwcGVyUGxhbnQodmFsdWUpe3ZhciByZXN1bHQscGFyZW50PXRoaXM7d2hpbGUocGFyZW50IGluc3RhbmNlb2YgYmFzZUxvZGFzaCl7dmFyIGNsb25lPXdyYXBwZXJDbG9uZShwYXJlbnQpO2Nsb25lLl9faW5kZXhfXz0wO2Nsb25lLl9fdmFsdWVzX189dW5kZWZpbmVkO2lmKHJlc3VsdClwcmV2aW91cy5fX3dyYXBwZWRfXz1jbG9uZTtlbHNlIHJlc3VsdD1jbG9uZTsKdmFyIHByZXZpb3VzPWNsb25lO3BhcmVudD1wYXJlbnQuX193cmFwcGVkX199cHJldmlvdXMuX193cmFwcGVkX189dmFsdWU7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB3cmFwcGVyUmV2ZXJzZSgpe3ZhciB2YWx1ZT10aGlzLl9fd3JhcHBlZF9fO2lmKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpe3ZhciB3cmFwcGVkPXZhbHVlO2lmKHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoKXdyYXBwZWQ9bmV3IExhenlXcmFwcGVyKHRoaXMpO3dyYXBwZWQ9d3JhcHBlZC5yZXZlcnNlKCk7d3JhcHBlZC5fX2FjdGlvbnNfXy5wdXNoKHsiZnVuYyI6dGhydSwiYXJncyI6W3JldmVyc2VdLCJ0aGlzQXJnIjp1bmRlZmluZWR9KTtyZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlZCx0aGlzLl9fY2hhaW5fXyl9cmV0dXJuIHRoaXMudGhydShyZXZlcnNlKX1mdW5jdGlvbiB3cmFwcGVyVmFsdWUoKXtyZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZSh0aGlzLl9fd3JhcHBlZF9fLHRoaXMuX19hY3Rpb25zX18pfQp2YXIgY291bnRCeT1jcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LGtleSkpKytyZXN1bHRba2V5XTtlbHNlIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LDEpfSk7ZnVuY3Rpb24gZXZlcnkoY29sbGVjdGlvbixwcmVkaWNhdGUsZ3VhcmQpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlFdmVyeTpiYXNlRXZlcnk7aWYoZ3VhcmQmJmlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24scHJlZGljYXRlLGd1YXJkKSlwcmVkaWNhdGU9dW5kZWZpbmVkO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpKX1mdW5jdGlvbiBmaWx0ZXIoY29sbGVjdGlvbixwcmVkaWNhdGUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlGaWx0ZXI6YmFzZUZpbHRlcjtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSl9dmFyIGZpbmQ9CmNyZWF0ZUZpbmQoZmluZEluZGV4KTt2YXIgZmluZExhc3Q9Y3JlYXRlRmluZChmaW5kTGFzdEluZGV4KTtmdW5jdGlvbiBmbGF0TWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3JldHVybiBiYXNlRmxhdHRlbihtYXAoY29sbGVjdGlvbixpdGVyYXRlZSksMSl9ZnVuY3Rpb24gZmxhdE1hcERlZXAoY29sbGVjdGlvbixpdGVyYXRlZSl7cmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLGl0ZXJhdGVlKSxJTkZJTklUWSl9ZnVuY3Rpb24gZmxhdE1hcERlcHRoKGNvbGxlY3Rpb24saXRlcmF0ZWUsZGVwdGgpe2RlcHRoPWRlcHRoPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKGRlcHRoKTtyZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpLGRlcHRoKX1mdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlFYWNoOmJhc2VFYWNoO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjMpKX1mdW5jdGlvbiBmb3JFYWNoUmlnaHQoY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUVhY2hSaWdodDpiYXNlRWFjaFJpZ2h0O3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMykpfXZhciBncm91cEJ5PWNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LHZhbHVlLGtleSl7aWYoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsa2V5KSlyZXN1bHRba2V5XS5wdXNoKHZhbHVlKTtlbHNlIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LFt2YWx1ZV0pfSk7ZnVuY3Rpb24gaW5jbHVkZXMoY29sbGVjdGlvbix2YWx1ZSxmcm9tSW5kZXgsZ3VhcmQpe2NvbGxlY3Rpb249aXNBcnJheUxpa2UoY29sbGVjdGlvbik/Y29sbGVjdGlvbjp2YWx1ZXMoY29sbGVjdGlvbik7ZnJvbUluZGV4PWZyb21JbmRleCYmIWd1YXJkP3RvSW50ZWdlcihmcm9tSW5kZXgpOjA7dmFyIGxlbmd0aD1jb2xsZWN0aW9uLmxlbmd0aDsKaWYoZnJvbUluZGV4PDApZnJvbUluZGV4PW5hdGl2ZU1heChsZW5ndGgrZnJvbUluZGV4LDApO3JldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKT9mcm9tSW5kZXg8PWxlbmd0aCYmY29sbGVjdGlvbi5pbmRleE9mKHZhbHVlLGZyb21JbmRleCk+LTE6ISFsZW5ndGgmJmJhc2VJbmRleE9mKGNvbGxlY3Rpb24sdmFsdWUsZnJvbUluZGV4KT4tMX12YXIgaW52b2tlTWFwPWJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24scGF0aCxhcmdzKXt2YXIgaW5kZXg9LTEsaXNGdW5jPXR5cGVvZiBwYXRoPT0iZnVuY3Rpb24iLHJlc3VsdD1pc0FycmF5TGlrZShjb2xsZWN0aW9uKT9BcnJheShjb2xsZWN0aW9uLmxlbmd0aCk6W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSl7cmVzdWx0WysraW5kZXhdPWlzRnVuYz9hcHBseShwYXRoLHZhbHVlLGFyZ3MpOmJhc2VJbnZva2UodmFsdWUscGF0aCxhcmdzKX0pO3JldHVybiByZXN1bHR9KTt2YXIga2V5Qnk9Y3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsCnZhbHVlLGtleSl7YmFzZUFzc2lnblZhbHVlKHJlc3VsdCxrZXksdmFsdWUpfSk7ZnVuY3Rpb24gbWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlNYXA6YmFzZU1hcDtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpKX1mdW5jdGlvbiBvcmRlckJ5KGNvbGxlY3Rpb24saXRlcmF0ZWVzLG9yZGVycyxndWFyZCl7aWYoY29sbGVjdGlvbj09bnVsbClyZXR1cm5bXTtpZighaXNBcnJheShpdGVyYXRlZXMpKWl0ZXJhdGVlcz1pdGVyYXRlZXM9PW51bGw/W106W2l0ZXJhdGVlc107b3JkZXJzPWd1YXJkP3VuZGVmaW5lZDpvcmRlcnM7aWYoIWlzQXJyYXkob3JkZXJzKSlvcmRlcnM9b3JkZXJzPT1udWxsP1tdOltvcmRlcnNdO3JldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLGl0ZXJhdGVlcyxvcmRlcnMpfXZhciBwYXJ0aXRpb249Y3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsdmFsdWUsCmtleSl7cmVzdWx0W2tleT8wOjFdLnB1c2godmFsdWUpfSxmdW5jdGlvbigpe3JldHVybltbXSxbXV19KTtmdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbixpdGVyYXRlZSxhY2N1bXVsYXRvcil7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVJlZHVjZTpiYXNlUmVkdWNlLGluaXRBY2N1bT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSw0KSxhY2N1bXVsYXRvcixpbml0QWNjdW0sYmFzZUVhY2gpfWZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNvbGxlY3Rpb24saXRlcmF0ZWUsYWNjdW11bGF0b3Ipe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlSZWR1Y2VSaWdodDpiYXNlUmVkdWNlLGluaXRBY2N1bT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSw0KSxhY2N1bXVsYXRvcixpbml0QWNjdW0sYmFzZUVhY2hSaWdodCl9ZnVuY3Rpb24gcmVqZWN0KGNvbGxlY3Rpb24sCnByZWRpY2F0ZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUZpbHRlcjpiYXNlRmlsdGVyO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sbmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSkpfWZ1bmN0aW9uIHNhbXBsZShjb2xsZWN0aW9uKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5U2FtcGxlOmJhc2VTYW1wbGU7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbil9ZnVuY3Rpb24gc2FtcGxlU2l6ZShjb2xsZWN0aW9uLG4sZ3VhcmQpe2lmKGd1YXJkP2lzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sbixndWFyZCk6bj09PXVuZGVmaW5lZCluPTE7ZWxzZSBuPXRvSW50ZWdlcihuKTt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5U2FtcGxlU2l6ZTpiYXNlU2FtcGxlU2l6ZTtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLG4pfWZ1bmN0aW9uIHNodWZmbGUoY29sbGVjdGlvbil7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVNodWZmbGU6CmJhc2VTaHVmZmxlO3JldHVybiBmdW5jKGNvbGxlY3Rpb24pfWZ1bmN0aW9uIHNpemUoY29sbGVjdGlvbil7aWYoY29sbGVjdGlvbj09bnVsbClyZXR1cm4gMDtpZihpc0FycmF5TGlrZShjb2xsZWN0aW9uKSlyZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbik/c3RyaW5nU2l6ZShjb2xsZWN0aW9uKTpjb2xsZWN0aW9uLmxlbmd0aDt2YXIgdGFnPWdldFRhZyhjb2xsZWN0aW9uKTtpZih0YWc9PW1hcFRhZ3x8dGFnPT1zZXRUYWcpcmV0dXJuIGNvbGxlY3Rpb24uc2l6ZTtyZXR1cm4gYmFzZUtleXMoY29sbGVjdGlvbikubGVuZ3RofWZ1bmN0aW9uIHNvbWUoY29sbGVjdGlvbixwcmVkaWNhdGUsZ3VhcmQpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlTb21lOmJhc2VTb21lO2lmKGd1YXJkJiZpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLHByZWRpY2F0ZSxndWFyZCkpcHJlZGljYXRlPXVuZGVmaW5lZDtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwKMykpfXZhciBzb3J0Qnk9YmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbixpdGVyYXRlZXMpe2lmKGNvbGxlY3Rpb249PW51bGwpcmV0dXJuW107dmFyIGxlbmd0aD1pdGVyYXRlZXMubGVuZ3RoO2lmKGxlbmd0aD4xJiZpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLGl0ZXJhdGVlc1swXSxpdGVyYXRlZXNbMV0pKWl0ZXJhdGVlcz1bXTtlbHNlIGlmKGxlbmd0aD4yJiZpc0l0ZXJhdGVlQ2FsbChpdGVyYXRlZXNbMF0saXRlcmF0ZWVzWzFdLGl0ZXJhdGVlc1syXSkpaXRlcmF0ZWVzPVtpdGVyYXRlZXNbMF1dO3JldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLGJhc2VGbGF0dGVuKGl0ZXJhdGVlcywxKSxbXSl9KTt2YXIgbm93PWN0eE5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4gcm9vdC5EYXRlLm5vdygpfTtmdW5jdGlvbiBhZnRlcihuLGZ1bmMpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtuPXRvSW50ZWdlcihuKTsKcmV0dXJuIGZ1bmN0aW9uKCl7aWYoLS1uPDEpcmV0dXJuIGZ1bmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBhcnkoZnVuYyxuLGd1YXJkKXtuPWd1YXJkP3VuZGVmaW5lZDpuO249ZnVuYyYmbj09bnVsbD9mdW5jLmxlbmd0aDpuO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9BUllfRkxBRyx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsbil9ZnVuY3Rpb24gYmVmb3JlKG4sZnVuYyl7dmFyIHJlc3VsdDtpZih0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7bj10b0ludGVnZXIobik7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoLS1uPjApcmVzdWx0PWZ1bmMuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKG48PTEpZnVuYz11bmRlZmluZWQ7cmV0dXJuIHJlc3VsdH19dmFyIGJpbmQ9YmFzZVJlc3QoZnVuY3Rpb24oZnVuYyx0aGlzQXJnLHBhcnRpYWxzKXt2YXIgYml0bWFzaz1XUkFQX0JJTkRfRkxBRzsKaWYocGFydGlhbHMubGVuZ3RoKXt2YXIgaG9sZGVycz1yZXBsYWNlSG9sZGVycyhwYXJ0aWFscyxnZXRIb2xkZXIoYmluZCkpO2JpdG1hc2t8PVdSQVBfUEFSVElBTF9GTEFHfXJldHVybiBjcmVhdGVXcmFwKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzLGhvbGRlcnMpfSk7dmFyIGJpbmRLZXk9YmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LGtleSxwYXJ0aWFscyl7dmFyIGJpdG1hc2s9V1JBUF9CSU5EX0ZMQUd8V1JBUF9CSU5EX0tFWV9GTEFHO2lmKHBhcnRpYWxzLmxlbmd0aCl7dmFyIGhvbGRlcnM9cmVwbGFjZUhvbGRlcnMocGFydGlhbHMsZ2V0SG9sZGVyKGJpbmRLZXkpKTtiaXRtYXNrfD1XUkFQX1BBUlRJQUxfRkxBR31yZXR1cm4gY3JlYXRlV3JhcChrZXksYml0bWFzayxvYmplY3QscGFydGlhbHMsaG9sZGVycyl9KTtmdW5jdGlvbiBjdXJyeShmdW5jLGFyaXR5LGd1YXJkKXthcml0eT1ndWFyZD91bmRlZmluZWQ6YXJpdHk7dmFyIHJlc3VsdD1jcmVhdGVXcmFwKGZ1bmMsCldSQVBfQ1VSUllfRkxBRyx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLGFyaXR5KTtyZXN1bHQucGxhY2Vob2xkZXI9Y3VycnkucGxhY2Vob2xkZXI7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjdXJyeVJpZ2h0KGZ1bmMsYXJpdHksZ3VhcmQpe2FyaXR5PWd1YXJkP3VuZGVmaW5lZDphcml0eTt2YXIgcmVzdWx0PWNyZWF0ZVdyYXAoZnVuYyxXUkFQX0NVUlJZX1JJR0hUX0ZMQUcsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCxhcml0eSk7cmVzdWx0LnBsYWNlaG9sZGVyPWN1cnJ5UmlnaHQucGxhY2Vob2xkZXI7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBkZWJvdW5jZShmdW5jLHdhaXQsb3B0aW9ucyl7dmFyIGxhc3RBcmdzLGxhc3RUaGlzLG1heFdhaXQscmVzdWx0LHRpbWVySWQsbGFzdENhbGxUaW1lLGxhc3RJbnZva2VUaW1lPTAsbGVhZGluZz1mYWxzZSxtYXhpbmc9ZmFsc2UsdHJhaWxpbmc9dHJ1ZTsKaWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3dhaXQ9dG9OdW1iZXIod2FpdCl8fDA7aWYoaXNPYmplY3Qob3B0aW9ucykpe2xlYWRpbmc9ISFvcHRpb25zLmxlYWRpbmc7bWF4aW5nPSJtYXhXYWl0ImluIG9wdGlvbnM7bWF4V2FpdD1tYXhpbmc/bmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCl8fDAsd2FpdCk6bWF4V2FpdDt0cmFpbGluZz0idHJhaWxpbmciaW4gb3B0aW9ucz8hIW9wdGlvbnMudHJhaWxpbmc6dHJhaWxpbmd9ZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKXt2YXIgYXJncz1sYXN0QXJncyx0aGlzQXJnPWxhc3RUaGlzO2xhc3RBcmdzPWxhc3RUaGlzPXVuZGVmaW5lZDtsYXN0SW52b2tlVGltZT10aW1lO3Jlc3VsdD1mdW5jLmFwcGx5KHRoaXNBcmcsYXJncyk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKXtsYXN0SW52b2tlVGltZT10aW1lO3RpbWVySWQ9c2V0VGltZW91dCh0aW1lckV4cGlyZWQsCndhaXQpO3JldHVybiBsZWFkaW5nP2ludm9rZUZ1bmModGltZSk6cmVzdWx0fWZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSl7dmFyIHRpbWVTaW5jZUxhc3RDYWxsPXRpbWUtbGFzdENhbGxUaW1lLHRpbWVTaW5jZUxhc3RJbnZva2U9dGltZS1sYXN0SW52b2tlVGltZSx0aW1lV2FpdGluZz13YWl0LXRpbWVTaW5jZUxhc3RDYWxsO3JldHVybiBtYXhpbmc/bmF0aXZlTWluKHRpbWVXYWl0aW5nLG1heFdhaXQtdGltZVNpbmNlTGFzdEludm9rZSk6dGltZVdhaXRpbmd9ZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpe3ZhciB0aW1lU2luY2VMYXN0Q2FsbD10aW1lLWxhc3RDYWxsVGltZSx0aW1lU2luY2VMYXN0SW52b2tlPXRpbWUtbGFzdEludm9rZVRpbWU7cmV0dXJuIGxhc3RDYWxsVGltZT09PXVuZGVmaW5lZHx8dGltZVNpbmNlTGFzdENhbGw+PXdhaXR8fHRpbWVTaW5jZUxhc3RDYWxsPDB8fG1heGluZyYmdGltZVNpbmNlTGFzdEludm9rZT49bWF4V2FpdH1mdW5jdGlvbiB0aW1lckV4cGlyZWQoKXt2YXIgdGltZT0Kbm93KCk7aWYoc2hvdWxkSW52b2tlKHRpbWUpKXJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7dGltZXJJZD1zZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCxyZW1haW5pbmdXYWl0KHRpbWUpKX1mdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSl7dGltZXJJZD11bmRlZmluZWQ7aWYodHJhaWxpbmcmJmxhc3RBcmdzKXJldHVybiBpbnZva2VGdW5jKHRpbWUpO2xhc3RBcmdzPWxhc3RUaGlzPXVuZGVmaW5lZDtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNhbmNlbCgpe2lmKHRpbWVySWQhPT11bmRlZmluZWQpY2xlYXJUaW1lb3V0KHRpbWVySWQpO2xhc3RJbnZva2VUaW1lPTA7bGFzdEFyZ3M9bGFzdENhbGxUaW1lPWxhc3RUaGlzPXRpbWVySWQ9dW5kZWZpbmVkfWZ1bmN0aW9uIGZsdXNoKCl7cmV0dXJuIHRpbWVySWQ9PT11bmRlZmluZWQ/cmVzdWx0OnRyYWlsaW5nRWRnZShub3coKSl9ZnVuY3Rpb24gZGVib3VuY2VkKCl7dmFyIHRpbWU9bm93KCksaXNJbnZva2luZz1zaG91bGRJbnZva2UodGltZSk7Cmxhc3RBcmdzPWFyZ3VtZW50cztsYXN0VGhpcz10aGlzO2xhc3RDYWxsVGltZT10aW1lO2lmKGlzSW52b2tpbmcpe2lmKHRpbWVySWQ9PT11bmRlZmluZWQpcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7aWYobWF4aW5nKXt0aW1lcklkPXNldFRpbWVvdXQodGltZXJFeHBpcmVkLHdhaXQpO3JldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSl9fWlmKHRpbWVySWQ9PT11bmRlZmluZWQpdGltZXJJZD1zZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCx3YWl0KTtyZXR1cm4gcmVzdWx0fWRlYm91bmNlZC5jYW5jZWw9Y2FuY2VsO2RlYm91bmNlZC5mbHVzaD1mbHVzaDtyZXR1cm4gZGVib3VuY2VkfXZhciBkZWZlcj1iYXNlUmVzdChmdW5jdGlvbihmdW5jLGFyZ3Mpe3JldHVybiBiYXNlRGVsYXkoZnVuYywxLGFyZ3MpfSk7dmFyIGRlbGF5PWJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsd2FpdCxhcmdzKXtyZXR1cm4gYmFzZURlbGF5KGZ1bmMsdG9OdW1iZXIod2FpdCl8fDAsYXJncyl9KTsKZnVuY3Rpb24gZmxpcChmdW5jKXtyZXR1cm4gY3JlYXRlV3JhcChmdW5jLFdSQVBfRkxJUF9GTEFHKX1mdW5jdGlvbiBtZW1vaXplKGZ1bmMscmVzb2x2ZXIpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24ifHxyZXNvbHZlciE9bnVsbCYmdHlwZW9mIHJlc29sdmVyIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTt2YXIgbWVtb2l6ZWQ9ZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHMsa2V5PXJlc29sdmVyP3Jlc29sdmVyLmFwcGx5KHRoaXMsYXJncyk6YXJnc1swXSxjYWNoZT1tZW1vaXplZC5jYWNoZTtpZihjYWNoZS5oYXMoa2V5KSlyZXR1cm4gY2FjaGUuZ2V0KGtleSk7dmFyIHJlc3VsdD1mdW5jLmFwcGx5KHRoaXMsYXJncyk7bWVtb2l6ZWQuY2FjaGU9Y2FjaGUuc2V0KGtleSxyZXN1bHQpfHxjYWNoZTtyZXR1cm4gcmVzdWx0fTttZW1vaXplZC5jYWNoZT1uZXcgKG1lbW9pemUuQ2FjaGV8fE1hcENhY2hlKTtyZXR1cm4gbWVtb2l6ZWR9Cm1lbW9pemUuQ2FjaGU9TWFwQ2FjaGU7ZnVuY3Rpb24gbmVnYXRlKHByZWRpY2F0ZSl7aWYodHlwZW9mIHByZWRpY2F0ZSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGFyZ3M9YXJndW1lbnRzO3N3aXRjaChhcmdzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzKTtjYXNlIDE6cmV0dXJuIXByZWRpY2F0ZS5jYWxsKHRoaXMsYXJnc1swXSk7Y2FzZSAyOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzLGFyZ3NbMF0sYXJnc1sxXSk7Y2FzZSAzOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdKX1yZXR1cm4hcHJlZGljYXRlLmFwcGx5KHRoaXMsYXJncyl9fWZ1bmN0aW9uIG9uY2UoZnVuYyl7cmV0dXJuIGJlZm9yZSgyLGZ1bmMpfXZhciBvdmVyQXJncz1jYXN0UmVzdChmdW5jdGlvbihmdW5jLHRyYW5zZm9ybXMpe3RyYW5zZm9ybXM9dHJhbnNmb3Jtcy5sZW5ndGg9PQoxJiZpc0FycmF5KHRyYW5zZm9ybXNbMF0pP2FycmF5TWFwKHRyYW5zZm9ybXNbMF0sYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTphcnJheU1hcChiYXNlRmxhdHRlbih0cmFuc2Zvcm1zLDEpLGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7dmFyIGZ1bmNzTGVuZ3RoPXRyYW5zZm9ybXMubGVuZ3RoO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1pbihhcmdzLmxlbmd0aCxmdW5jc0xlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpYXJnc1tpbmRleF09dHJhbnNmb3Jtc1tpbmRleF0uY2FsbCh0aGlzLGFyZ3NbaW5kZXhdKTtyZXR1cm4gYXBwbHkoZnVuYyx0aGlzLGFyZ3MpfSl9KTt2YXIgcGFydGlhbD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLHBhcnRpYWxzKXt2YXIgaG9sZGVycz1yZXBsYWNlSG9sZGVycyhwYXJ0aWFscyxnZXRIb2xkZXIocGFydGlhbCkpO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9QQVJUSUFMX0ZMQUcsCnVuZGVmaW5lZCxwYXJ0aWFscyxob2xkZXJzKX0pO3ZhciBwYXJ0aWFsUmlnaHQ9YmFzZVJlc3QoZnVuY3Rpb24oZnVuYyxwYXJ0aWFscyl7dmFyIGhvbGRlcnM9cmVwbGFjZUhvbGRlcnMocGFydGlhbHMsZ2V0SG9sZGVyKHBhcnRpYWxSaWdodCkpO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcsdW5kZWZpbmVkLHBhcnRpYWxzLGhvbGRlcnMpfSk7dmFyIHJlYXJnPWZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmMsaW5kZXhlcyl7cmV0dXJuIGNyZWF0ZVdyYXAoZnVuYyxXUkFQX1JFQVJHX0ZMQUcsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsaW5kZXhlcyl9KTtmdW5jdGlvbiByZXN0KGZ1bmMsc3RhcnQpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtzdGFydD1zdGFydD09PXVuZGVmaW5lZD9zdGFydDp0b0ludGVnZXIoc3RhcnQpO3JldHVybiBiYXNlUmVzdChmdW5jLHN0YXJ0KX0KZnVuY3Rpb24gc3ByZWFkKGZ1bmMsc3RhcnQpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtzdGFydD1zdGFydD09bnVsbD8wOm5hdGl2ZU1heCh0b0ludGVnZXIoc3RhcnQpLDApO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgYXJyYXk9YXJnc1tzdGFydF0sb3RoZXJBcmdzPWNhc3RTbGljZShhcmdzLDAsc3RhcnQpO2lmKGFycmF5KWFycmF5UHVzaChvdGhlckFyZ3MsYXJyYXkpO3JldHVybiBhcHBseShmdW5jLHRoaXMsb3RoZXJBcmdzKX0pfWZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsd2FpdCxvcHRpb25zKXt2YXIgbGVhZGluZz10cnVlLHRyYWlsaW5nPXRydWU7aWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO2lmKGlzT2JqZWN0KG9wdGlvbnMpKXtsZWFkaW5nPSJsZWFkaW5nImluIG9wdGlvbnM/ISFvcHRpb25zLmxlYWRpbmc6CmxlYWRpbmc7dHJhaWxpbmc9InRyYWlsaW5nImluIG9wdGlvbnM/ISFvcHRpb25zLnRyYWlsaW5nOnRyYWlsaW5nfXJldHVybiBkZWJvdW5jZShmdW5jLHdhaXQseyJsZWFkaW5nIjpsZWFkaW5nLCJtYXhXYWl0Ijp3YWl0LCJ0cmFpbGluZyI6dHJhaWxpbmd9KX1mdW5jdGlvbiB1bmFyeShmdW5jKXtyZXR1cm4gYXJ5KGZ1bmMsMSl9ZnVuY3Rpb24gd3JhcCh2YWx1ZSx3cmFwcGVyKXtyZXR1cm4gcGFydGlhbChjYXN0RnVuY3Rpb24od3JhcHBlciksdmFsdWUpfWZ1bmN0aW9uIGNhc3RBcnJheSgpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybltdO3ZhciB2YWx1ZT1hcmd1bWVudHNbMF07cmV0dXJuIGlzQXJyYXkodmFsdWUpP3ZhbHVlOlt2YWx1ZV19ZnVuY3Rpb24gY2xvbmUodmFsdWUpe3JldHVybiBiYXNlQ2xvbmUodmFsdWUsQ0xPTkVfU1lNQk9MU19GTEFHKX1mdW5jdGlvbiBjbG9uZVdpdGgodmFsdWUsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09CiJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSxDTE9ORV9TWU1CT0xTX0ZMQUcsY3VzdG9taXplcil9ZnVuY3Rpb24gY2xvbmVEZWVwKHZhbHVlKXtyZXR1cm4gYmFzZUNsb25lKHZhbHVlLENMT05FX0RFRVBfRkxBR3xDTE9ORV9TWU1CT0xTX0ZMQUcpfWZ1bmN0aW9uIGNsb25lRGVlcFdpdGgodmFsdWUsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09ImZ1bmN0aW9uIj9jdXN0b21pemVyOnVuZGVmaW5lZDtyZXR1cm4gYmFzZUNsb25lKHZhbHVlLENMT05FX0RFRVBfRkxBR3xDTE9ORV9TWU1CT0xTX0ZMQUcsY3VzdG9taXplcil9ZnVuY3Rpb24gY29uZm9ybXNUbyhvYmplY3Qsc291cmNlKXtyZXR1cm4gc291cmNlPT1udWxsfHxiYXNlQ29uZm9ybXNUbyhvYmplY3Qsc291cmNlLGtleXMoc291cmNlKSl9ZnVuY3Rpb24gZXEodmFsdWUsb3RoZXIpe3JldHVybiB2YWx1ZT09PW90aGVyfHx2YWx1ZSE9PXZhbHVlJiYKb3RoZXIhPT1vdGhlcn12YXIgZ3Q9Y3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlR3QpO3ZhciBndGU9Y3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPj1vdGhlcn0pO3ZhciBpc0FyZ3VtZW50cz1iYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9iYXNlSXNBcmd1bWVudHM6ZnVuY3Rpb24odmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCJjYWxsZWUiKSYmIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsImNhbGxlZSIpfTt2YXIgaXNBcnJheT1BcnJheS5pc0FycmF5O3ZhciBpc0FycmF5QnVmZmVyPW5vZGVJc0FycmF5QnVmZmVyP2Jhc2VVbmFyeShub2RlSXNBcnJheUJ1ZmZlcik6YmFzZUlzQXJyYXlCdWZmZXI7ZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpe3JldHVybiB2YWx1ZSE9bnVsbCYmaXNMZW5ndGgodmFsdWUubGVuZ3RoKSYmCiFpc0Z1bmN0aW9uKHZhbHVlKX1mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmlzQXJyYXlMaWtlKHZhbHVlKX1mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpe3JldHVybiB2YWx1ZT09PXRydWV8fHZhbHVlPT09ZmFsc2V8fGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1ib29sVGFnfXZhciBpc0J1ZmZlcj1uYXRpdmVJc0J1ZmZlcnx8c3R1YkZhbHNlO3ZhciBpc0RhdGU9bm9kZUlzRGF0ZT9iYXNlVW5hcnkobm9kZUlzRGF0ZSk6YmFzZUlzRGF0ZTtmdW5jdGlvbiBpc0VsZW1lbnQodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZ2YWx1ZS5ub2RlVHlwZT09PTEmJiFpc1BsYWluT2JqZWN0KHZhbHVlKX1mdW5jdGlvbiBpc0VtcHR5KHZhbHVlKXtpZih2YWx1ZT09bnVsbClyZXR1cm4gdHJ1ZTtpZihpc0FycmF5TGlrZSh2YWx1ZSkmJihpc0FycmF5KHZhbHVlKXx8dHlwZW9mIHZhbHVlPT0KInN0cmluZyJ8fHR5cGVvZiB2YWx1ZS5zcGxpY2U9PSJmdW5jdGlvbiJ8fGlzQnVmZmVyKHZhbHVlKXx8aXNUeXBlZEFycmF5KHZhbHVlKXx8aXNBcmd1bWVudHModmFsdWUpKSlyZXR1cm4hdmFsdWUubGVuZ3RoO3ZhciB0YWc9Z2V0VGFnKHZhbHVlKTtpZih0YWc9PW1hcFRhZ3x8dGFnPT1zZXRUYWcpcmV0dXJuIXZhbHVlLnNpemU7aWYoaXNQcm90b3R5cGUodmFsdWUpKXJldHVybiFiYXNlS2V5cyh2YWx1ZSkubGVuZ3RoO2Zvcih2YXIga2V5IGluIHZhbHVlKWlmKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsa2V5KSlyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWV9ZnVuY3Rpb24gaXNFcXVhbCh2YWx1ZSxvdGhlcil7cmV0dXJuIGJhc2VJc0VxdWFsKHZhbHVlLG90aGVyKX1mdW5jdGlvbiBpc0VxdWFsV2l0aCh2YWx1ZSxvdGhlcixjdXN0b21pemVyKXtjdXN0b21pemVyPXR5cGVvZiBjdXN0b21pemVyPT0iZnVuY3Rpb24iP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3ZhciByZXN1bHQ9CmN1c3RvbWl6ZXI/Y3VzdG9taXplcih2YWx1ZSxvdGhlcik6dW5kZWZpbmVkO3JldHVybiByZXN1bHQ9PT11bmRlZmluZWQ/YmFzZUlzRXF1YWwodmFsdWUsb3RoZXIsdW5kZWZpbmVkLGN1c3RvbWl6ZXIpOiEhcmVzdWx0fWZ1bmN0aW9uIGlzRXJyb3IodmFsdWUpe2lmKCFpc09iamVjdExpa2UodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdGFnPWJhc2VHZXRUYWcodmFsdWUpO3JldHVybiB0YWc9PWVycm9yVGFnfHx0YWc9PWRvbUV4Y1RhZ3x8dHlwZW9mIHZhbHVlLm1lc3NhZ2U9PSJzdHJpbmciJiZ0eXBlb2YgdmFsdWUubmFtZT09InN0cmluZyImJiFpc1BsYWluT2JqZWN0KHZhbHVlKX1mdW5jdGlvbiBpc0Zpbml0ZSh2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09Im51bWJlciImJm5hdGl2ZUlzRmluaXRlKHZhbHVlKX1mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKXtpZighaXNPYmplY3QodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdGFnPWJhc2VHZXRUYWcodmFsdWUpO3JldHVybiB0YWc9PQpmdW5jVGFnfHx0YWc9PWdlblRhZ3x8dGFnPT1hc3luY1RhZ3x8dGFnPT1wcm94eVRhZ31mdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJudW1iZXIiJiZ2YWx1ZT09dG9JbnRlZ2VyKHZhbHVlKX1mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09Im51bWJlciImJnZhbHVlPi0xJiZ2YWx1ZSUxPT0wJiZ2YWx1ZTw9TUFYX1NBRkVfSU5URUdFUn1mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO3JldHVybiB2YWx1ZSE9bnVsbCYmKHR5cGU9PSJvYmplY3QifHx0eXBlPT0iZnVuY3Rpb24iKX1mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpe3JldHVybiB2YWx1ZSE9bnVsbCYmdHlwZW9mIHZhbHVlPT0ib2JqZWN0In12YXIgaXNNYXA9bm9kZUlzTWFwP2Jhc2VVbmFyeShub2RlSXNNYXApOmJhc2VJc01hcDtmdW5jdGlvbiBpc01hdGNoKG9iamVjdCxzb3VyY2Upe3JldHVybiBvYmplY3Q9PT0Kc291cmNlfHxiYXNlSXNNYXRjaChvYmplY3Qsc291cmNlLGdldE1hdGNoRGF0YShzb3VyY2UpKX1mdW5jdGlvbiBpc01hdGNoV2l0aChvYmplY3Qsc291cmNlLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PSJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIGJhc2VJc01hdGNoKG9iamVjdCxzb3VyY2UsZ2V0TWF0Y2hEYXRhKHNvdXJjZSksY3VzdG9taXplcil9ZnVuY3Rpb24gaXNOYU4odmFsdWUpe3JldHVybiBpc051bWJlcih2YWx1ZSkmJnZhbHVlIT0rdmFsdWV9ZnVuY3Rpb24gaXNOYXRpdmUodmFsdWUpe2lmKGlzTWFza2FibGUodmFsdWUpKXRocm93IG5ldyBFcnJvcihDT1JFX0VSUk9SX1RFWFQpO3JldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpfWZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09bnVsbH1mdW5jdGlvbiBpc05pbCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT1udWxsfWZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0KIm51bWJlciJ8fGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1udW1iZXJUYWd9ZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSl7aWYoIWlzT2JqZWN0TGlrZSh2YWx1ZSl8fGJhc2VHZXRUYWcodmFsdWUpIT1vYmplY3RUYWcpcmV0dXJuIGZhbHNlO3ZhciBwcm90bz1nZXRQcm90b3R5cGUodmFsdWUpO2lmKHByb3RvPT09bnVsbClyZXR1cm4gdHJ1ZTt2YXIgQ3Rvcj1oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCJjb25zdHJ1Y3RvciIpJiZwcm90by5jb25zdHJ1Y3RvcjtyZXR1cm4gdHlwZW9mIEN0b3I9PSJmdW5jdGlvbiImJkN0b3IgaW5zdGFuY2VvZiBDdG9yJiZmdW5jVG9TdHJpbmcuY2FsbChDdG9yKT09b2JqZWN0Q3RvclN0cmluZ312YXIgaXNSZWdFeHA9bm9kZUlzUmVnRXhwP2Jhc2VVbmFyeShub2RlSXNSZWdFeHApOmJhc2VJc1JlZ0V4cDtmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKXtyZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSYmdmFsdWU+PQotTUFYX1NBRkVfSU5URUdFUiYmdmFsdWU8PU1BWF9TQUZFX0lOVEVHRVJ9dmFyIGlzU2V0PW5vZGVJc1NldD9iYXNlVW5hcnkobm9kZUlzU2V0KTpiYXNlSXNTZXQ7ZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJzdHJpbmcifHwhaXNBcnJheSh2YWx1ZSkmJmlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1zdHJpbmdUYWd9ZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJzeW1ib2wifHxpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09c3ltYm9sVGFnfXZhciBpc1R5cGVkQXJyYXk9bm9kZUlzVHlwZWRBcnJheT9iYXNlVW5hcnkobm9kZUlzVHlwZWRBcnJheSk6YmFzZUlzVHlwZWRBcnJheTtmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09dW5kZWZpbmVkfWZ1bmN0aW9uIGlzV2Vha01hcCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJgpnZXRUYWcodmFsdWUpPT13ZWFrTWFwVGFnfWZ1bmN0aW9uIGlzV2Vha1NldCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT13ZWFrU2V0VGFnfXZhciBsdD1jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VMdCk7dmFyIGx0ZT1jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLG90aGVyKXtyZXR1cm4gdmFsdWU8PW90aGVyfSk7ZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSl7aWYoIXZhbHVlKXJldHVybltdO2lmKGlzQXJyYXlMaWtlKHZhbHVlKSlyZXR1cm4gaXNTdHJpbmcodmFsdWUpP3N0cmluZ1RvQXJyYXkodmFsdWUpOmNvcHlBcnJheSh2YWx1ZSk7aWYoc3ltSXRlcmF0b3ImJnZhbHVlW3N5bUl0ZXJhdG9yXSlyZXR1cm4gaXRlcmF0b3JUb0FycmF5KHZhbHVlW3N5bUl0ZXJhdG9yXSgpKTt2YXIgdGFnPWdldFRhZyh2YWx1ZSksZnVuYz10YWc9PW1hcFRhZz9tYXBUb0FycmF5OnRhZz09c2V0VGFnP3NldFRvQXJyYXk6CnZhbHVlcztyZXR1cm4gZnVuYyh2YWx1ZSl9ZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpe2lmKCF2YWx1ZSlyZXR1cm4gdmFsdWU9PT0wP3ZhbHVlOjA7dmFsdWU9dG9OdW1iZXIodmFsdWUpO2lmKHZhbHVlPT09SU5GSU5JVFl8fHZhbHVlPT09LUlORklOSVRZKXt2YXIgc2lnbj12YWx1ZTwwPy0xOjE7cmV0dXJuIHNpZ24qTUFYX0lOVEVHRVJ9cmV0dXJuIHZhbHVlPT09dmFsdWU/dmFsdWU6MH1mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpe3ZhciByZXN1bHQ9dG9GaW5pdGUodmFsdWUpLHJlbWFpbmRlcj1yZXN1bHQlMTtyZXR1cm4gcmVzdWx0PT09cmVzdWx0P3JlbWFpbmRlcj9yZXN1bHQtcmVtYWluZGVyOnJlc3VsdDowfWZ1bmN0aW9uIHRvTGVuZ3RoKHZhbHVlKXtyZXR1cm4gdmFsdWU/YmFzZUNsYW1wKHRvSW50ZWdlcih2YWx1ZSksMCxNQVhfQVJSQVlfTEVOR1RIKTowfWZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKXtpZih0eXBlb2YgdmFsdWU9PSJudW1iZXIiKXJldHVybiB2YWx1ZTsKaWYoaXNTeW1ib2wodmFsdWUpKXJldHVybiBOQU47aWYoaXNPYmplY3QodmFsdWUpKXt2YXIgb3RoZXI9dHlwZW9mIHZhbHVlLnZhbHVlT2Y9PSJmdW5jdGlvbiI/dmFsdWUudmFsdWVPZigpOnZhbHVlO3ZhbHVlPWlzT2JqZWN0KG90aGVyKT9vdGhlcisiIjpvdGhlcn1pZih0eXBlb2YgdmFsdWUhPSJzdHJpbmciKXJldHVybiB2YWx1ZT09PTA/dmFsdWU6K3ZhbHVlO3ZhbHVlPXZhbHVlLnJlcGxhY2UocmVUcmltLCIiKTt2YXIgaXNCaW5hcnk9cmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtyZXR1cm4gaXNCaW5hcnl8fHJlSXNPY3RhbC50ZXN0KHZhbHVlKT9mcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksaXNCaW5hcnk/Mjo4KTpyZUlzQmFkSGV4LnRlc3QodmFsdWUpP05BTjordmFsdWV9ZnVuY3Rpb24gdG9QbGFpbk9iamVjdCh2YWx1ZSl7cmV0dXJuIGNvcHlPYmplY3QodmFsdWUsa2V5c0luKHZhbHVlKSl9ZnVuY3Rpb24gdG9TYWZlSW50ZWdlcih2YWx1ZSl7cmV0dXJuIHZhbHVlPwpiYXNlQ2xhbXAodG9JbnRlZ2VyKHZhbHVlKSwtTUFYX1NBRkVfSU5URUdFUixNQVhfU0FGRV9JTlRFR0VSKTp2YWx1ZT09PTA/dmFsdWU6MH1mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSl7cmV0dXJuIHZhbHVlPT1udWxsPyIiOmJhc2VUb1N0cmluZyh2YWx1ZSl9dmFyIGFzc2lnbj1jcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3Qsc291cmNlKXtpZihpc1Byb3RvdHlwZShzb3VyY2UpfHxpc0FycmF5TGlrZShzb3VyY2UpKXtjb3B5T2JqZWN0KHNvdXJjZSxrZXlzKHNvdXJjZSksb2JqZWN0KTtyZXR1cm59Zm9yKHZhciBrZXkgaW4gc291cmNlKWlmKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpYXNzaWduVmFsdWUob2JqZWN0LGtleSxzb3VyY2Vba2V5XSl9KTt2YXIgYXNzaWduSW49Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSl7Y29weU9iamVjdChzb3VyY2Usa2V5c0luKHNvdXJjZSksb2JqZWN0KX0pO3ZhciBhc3NpZ25JbldpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LApzb3VyY2Usc3JjSW5kZXgsY3VzdG9taXplcil7Y29weU9iamVjdChzb3VyY2Usa2V5c0luKHNvdXJjZSksb2JqZWN0LGN1c3RvbWl6ZXIpfSk7dmFyIGFzc2lnbldpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKXtjb3B5T2JqZWN0KHNvdXJjZSxrZXlzKHNvdXJjZSksb2JqZWN0LGN1c3RvbWl6ZXIpfSk7dmFyIGF0PWZsYXRSZXN0KGJhc2VBdCk7ZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSxwcm9wZXJ0aWVzKXt2YXIgcmVzdWx0PWJhc2VDcmVhdGUocHJvdG90eXBlKTtyZXR1cm4gcHJvcGVydGllcz09bnVsbD9yZXN1bHQ6YmFzZUFzc2lnbihyZXN1bHQscHJvcGVydGllcyl9dmFyIGRlZmF1bHRzPWJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCxzb3VyY2VzKXtvYmplY3Q9T2JqZWN0KG9iamVjdCk7dmFyIGluZGV4PS0xO3ZhciBsZW5ndGg9c291cmNlcy5sZW5ndGg7dmFyIGd1YXJkPWxlbmd0aD4yP3NvdXJjZXNbMl06CnVuZGVmaW5lZDtpZihndWFyZCYmaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSxzb3VyY2VzWzFdLGd1YXJkKSlsZW5ndGg9MTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHNvdXJjZT1zb3VyY2VzW2luZGV4XTt2YXIgcHJvcHM9a2V5c0luKHNvdXJjZSk7dmFyIHByb3BzSW5kZXg9LTE7dmFyIHByb3BzTGVuZ3RoPXByb3BzLmxlbmd0aDt3aGlsZSgrK3Byb3BzSW5kZXg8cHJvcHNMZW5ndGgpe3ZhciBrZXk9cHJvcHNbcHJvcHNJbmRleF07dmFyIHZhbHVlPW9iamVjdFtrZXldO2lmKHZhbHVlPT09dW5kZWZpbmVkfHxlcSh2YWx1ZSxvYmplY3RQcm90b1trZXldKSYmIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LGtleSkpb2JqZWN0W2tleV09c291cmNlW2tleV19fXJldHVybiBvYmplY3R9KTt2YXIgZGVmYXVsdHNEZWVwPWJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe2FyZ3MucHVzaCh1bmRlZmluZWQsY3VzdG9tRGVmYXVsdHNNZXJnZSk7cmV0dXJuIGFwcGx5KG1lcmdlV2l0aCwKdW5kZWZpbmVkLGFyZ3MpfSk7ZnVuY3Rpb24gZmluZEtleShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxiYXNlRm9yT3duKX1mdW5jdGlvbiBmaW5kTGFzdEtleShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxiYXNlRm9yT3duUmlnaHQpfWZ1bmN0aW9uIGZvckluKG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZUZvcihvYmplY3QsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyksa2V5c0luKX1mdW5jdGlvbiBmb3JJblJpZ2h0KG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZUZvclJpZ2h0KG9iamVjdCxnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSxrZXlzSW4pfWZ1bmN0aW9uIGZvck93bihvYmplY3QsaXRlcmF0ZWUpe3JldHVybiBvYmplY3QmJmJhc2VGb3JPd24ob2JqZWN0LApnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSl9ZnVuY3Rpb24gZm9yT3duUmlnaHQob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yT3duUmlnaHQob2JqZWN0LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpKX1mdW5jdGlvbiBmdW5jdGlvbnMob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP1tdOmJhc2VGdW5jdGlvbnMob2JqZWN0LGtleXMob2JqZWN0KSl9ZnVuY3Rpb24gZnVuY3Rpb25zSW4ob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP1tdOmJhc2VGdW5jdGlvbnMob2JqZWN0LGtleXNJbihvYmplY3QpKX1mdW5jdGlvbiBnZXQob2JqZWN0LHBhdGgsZGVmYXVsdFZhbHVlKXt2YXIgcmVzdWx0PW9iamVjdD09bnVsbD91bmRlZmluZWQ6YmFzZUdldChvYmplY3QscGF0aCk7cmV0dXJuIHJlc3VsdD09PXVuZGVmaW5lZD9kZWZhdWx0VmFsdWU6cmVzdWx0fWZ1bmN0aW9uIGhhcyhvYmplY3QscGF0aCl7cmV0dXJuIG9iamVjdCE9bnVsbCYmaGFzUGF0aChvYmplY3QsCnBhdGgsYmFzZUhhcyl9ZnVuY3Rpb24gaGFzSW4ob2JqZWN0LHBhdGgpe3JldHVybiBvYmplY3QhPW51bGwmJmhhc1BhdGgob2JqZWN0LHBhdGgsYmFzZUhhc0luKX12YXIgaW52ZXJ0PWNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKHZhbHVlIT1udWxsJiZ0eXBlb2YgdmFsdWUudG9TdHJpbmchPSJmdW5jdGlvbiIpdmFsdWU9bmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7cmVzdWx0W3ZhbHVlXT1rZXl9LGNvbnN0YW50KGlkZW50aXR5KSk7dmFyIGludmVydEJ5PWNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKHZhbHVlIT1udWxsJiZ0eXBlb2YgdmFsdWUudG9TdHJpbmchPSJmdW5jdGlvbiIpdmFsdWU9bmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7aWYoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsdmFsdWUpKXJlc3VsdFt2YWx1ZV0ucHVzaChrZXkpO2Vsc2UgcmVzdWx0W3ZhbHVlXT1ba2V5XX0sCmdldEl0ZXJhdGVlKTt2YXIgaW52b2tlPWJhc2VSZXN0KGJhc2VJbnZva2UpO2Z1bmN0aW9uIGtleXMob2JqZWN0KXtyZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KT9hcnJheUxpa2VLZXlzKG9iamVjdCk6YmFzZUtleXMob2JqZWN0KX1mdW5jdGlvbiBrZXlzSW4ob2JqZWN0KXtyZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KT9hcnJheUxpa2VLZXlzKG9iamVjdCx0cnVlKTpiYXNlS2V5c0luKG9iamVjdCl9ZnVuY3Rpb24gbWFwS2V5cyhvYmplY3QsaXRlcmF0ZWUpe3ZhciByZXN1bHQ9e307aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyk7YmFzZUZvck93bihvYmplY3QsZnVuY3Rpb24odmFsdWUsa2V5LG9iamVjdCl7YmFzZUFzc2lnblZhbHVlKHJlc3VsdCxpdGVyYXRlZSh2YWx1ZSxrZXksb2JqZWN0KSx2YWx1ZSl9KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG1hcFZhbHVlcyhvYmplY3QsaXRlcmF0ZWUpe3ZhciByZXN1bHQ9e307aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjMpO2Jhc2VGb3JPd24ob2JqZWN0LGZ1bmN0aW9uKHZhbHVlLGtleSxvYmplY3Qpe2Jhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LGl0ZXJhdGVlKHZhbHVlLGtleSxvYmplY3QpKX0pO3JldHVybiByZXN1bHR9dmFyIG1lcmdlPWNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCxzb3VyY2Usc3JjSW5kZXgpe2Jhc2VNZXJnZShvYmplY3Qsc291cmNlLHNyY0luZGV4KX0pO3ZhciBtZXJnZVdpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKXtiYXNlTWVyZ2Uob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKX0pO3ZhciBvbWl0PWZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCxwYXRocyl7dmFyIHJlc3VsdD17fTtpZihvYmplY3Q9PW51bGwpcmV0dXJuIHJlc3VsdDt2YXIgaXNEZWVwPWZhbHNlO3BhdGhzPWFycmF5TWFwKHBhdGhzLGZ1bmN0aW9uKHBhdGgpe3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO2lzRGVlcHx8Cihpc0RlZXA9cGF0aC5sZW5ndGg+MSk7cmV0dXJuIHBhdGh9KTtjb3B5T2JqZWN0KG9iamVjdCxnZXRBbGxLZXlzSW4ob2JqZWN0KSxyZXN1bHQpO2lmKGlzRGVlcClyZXN1bHQ9YmFzZUNsb25lKHJlc3VsdCxDTE9ORV9ERUVQX0ZMQUd8Q0xPTkVfRkxBVF9GTEFHfENMT05FX1NZTUJPTFNfRkxBRyxjdXN0b21PbWl0Q2xvbmUpO3ZhciBsZW5ndGg9cGF0aHMubGVuZ3RoO3doaWxlKGxlbmd0aC0tKWJhc2VVbnNldChyZXN1bHQscGF0aHNbbGVuZ3RoXSk7cmV0dXJuIHJlc3VsdH0pO2Z1bmN0aW9uIG9taXRCeShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gcGlja0J5KG9iamVjdCxuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpfXZhciBwaWNrPWZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCxwYXRocyl7cmV0dXJuIG9iamVjdD09bnVsbD97fTpiYXNlUGljayhvYmplY3QscGF0aHMpfSk7ZnVuY3Rpb24gcGlja0J5KG9iamVjdCxwcmVkaWNhdGUpe2lmKG9iamVjdD09bnVsbClyZXR1cm57fTsKdmFyIHByb3BzPWFycmF5TWFwKGdldEFsbEtleXNJbihvYmplY3QpLGZ1bmN0aW9uKHByb3Ape3JldHVybltwcm9wXX0pO3ByZWRpY2F0ZT1nZXRJdGVyYXRlZShwcmVkaWNhdGUpO3JldHVybiBiYXNlUGlja0J5KG9iamVjdCxwcm9wcyxmdW5jdGlvbih2YWx1ZSxwYXRoKXtyZXR1cm4gcHJlZGljYXRlKHZhbHVlLHBhdGhbMF0pfSl9ZnVuY3Rpb24gcmVzdWx0KG9iamVjdCxwYXRoLGRlZmF1bHRWYWx1ZSl7cGF0aD1jYXN0UGF0aChwYXRoLG9iamVjdCk7dmFyIGluZGV4PS0xLGxlbmd0aD1wYXRoLmxlbmd0aDtpZighbGVuZ3RoKXtsZW5ndGg9MTtvYmplY3Q9dW5kZWZpbmVkfXdoaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9b2JqZWN0PT1udWxsP3VuZGVmaW5lZDpvYmplY3RbdG9LZXkocGF0aFtpbmRleF0pXTtpZih2YWx1ZT09PXVuZGVmaW5lZCl7aW5kZXg9bGVuZ3RoO3ZhbHVlPWRlZmF1bHRWYWx1ZX1vYmplY3Q9aXNGdW5jdGlvbih2YWx1ZSk/dmFsdWUuY2FsbChvYmplY3QpOgp2YWx1ZX1yZXR1cm4gb2JqZWN0fWZ1bmN0aW9uIHNldChvYmplY3QscGF0aCx2YWx1ZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZVNldChvYmplY3QscGF0aCx2YWx1ZSl9ZnVuY3Rpb24gc2V0V2l0aChvYmplY3QscGF0aCx2YWx1ZSxjdXN0b21pemVyKXtjdXN0b21pemVyPXR5cGVvZiBjdXN0b21pemVyPT0iZnVuY3Rpb24iP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VTZXQob2JqZWN0LHBhdGgsdmFsdWUsY3VzdG9taXplcil9dmFyIHRvUGFpcnM9Y3JlYXRlVG9QYWlycyhrZXlzKTt2YXIgdG9QYWlyc0luPWNyZWF0ZVRvUGFpcnMoa2V5c0luKTtmdW5jdGlvbiB0cmFuc2Zvcm0ob2JqZWN0LGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXt2YXIgaXNBcnI9aXNBcnJheShvYmplY3QpLGlzQXJyTGlrZT1pc0Fycnx8aXNCdWZmZXIob2JqZWN0KXx8aXNUeXBlZEFycmF5KG9iamVjdCk7aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjQpO2lmKGFjY3VtdWxhdG9yPT1udWxsKXt2YXIgQ3Rvcj1vYmplY3QmJm9iamVjdC5jb25zdHJ1Y3RvcjtpZihpc0Fyckxpa2UpYWNjdW11bGF0b3I9aXNBcnI/bmV3IEN0b3I6W107ZWxzZSBpZihpc09iamVjdChvYmplY3QpKWFjY3VtdWxhdG9yPWlzRnVuY3Rpb24oQ3Rvcik/YmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSk6e307ZWxzZSBhY2N1bXVsYXRvcj17fX0oaXNBcnJMaWtlP2FycmF5RWFjaDpiYXNlRm9yT3duKShvYmplY3QsZnVuY3Rpb24odmFsdWUsaW5kZXgsb2JqZWN0KXtyZXR1cm4gaXRlcmF0ZWUoYWNjdW11bGF0b3IsdmFsdWUsaW5kZXgsb2JqZWN0KX0pO3JldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiB1bnNldChvYmplY3QscGF0aCl7cmV0dXJuIG9iamVjdD09bnVsbD90cnVlOmJhc2VVbnNldChvYmplY3QscGF0aCl9ZnVuY3Rpb24gdXBkYXRlKG9iamVjdCxwYXRoLHVwZGF0ZXIpe3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VVcGRhdGUob2JqZWN0LApwYXRoLGNhc3RGdW5jdGlvbih1cGRhdGVyKSl9ZnVuY3Rpb24gdXBkYXRlV2l0aChvYmplY3QscGF0aCx1cGRhdGVyLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PSJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZVVwZGF0ZShvYmplY3QscGF0aCxjYXN0RnVuY3Rpb24odXBkYXRlciksY3VzdG9taXplcil9ZnVuY3Rpb24gdmFsdWVzKG9iamVjdCl7cmV0dXJuIG9iamVjdD09bnVsbD9bXTpiYXNlVmFsdWVzKG9iamVjdCxrZXlzKG9iamVjdCkpfWZ1bmN0aW9uIHZhbHVlc0luKG9iamVjdCl7cmV0dXJuIG9iamVjdD09bnVsbD9bXTpiYXNlVmFsdWVzKG9iamVjdCxrZXlzSW4ob2JqZWN0KSl9ZnVuY3Rpb24gY2xhbXAobnVtYmVyLGxvd2VyLHVwcGVyKXtpZih1cHBlcj09PXVuZGVmaW5lZCl7dXBwZXI9bG93ZXI7bG93ZXI9dW5kZWZpbmVkfWlmKHVwcGVyIT09dW5kZWZpbmVkKXt1cHBlcj0KdG9OdW1iZXIodXBwZXIpO3VwcGVyPXVwcGVyPT09dXBwZXI/dXBwZXI6MH1pZihsb3dlciE9PXVuZGVmaW5lZCl7bG93ZXI9dG9OdW1iZXIobG93ZXIpO2xvd2VyPWxvd2VyPT09bG93ZXI/bG93ZXI6MH1yZXR1cm4gYmFzZUNsYW1wKHRvTnVtYmVyKG51bWJlciksbG93ZXIsdXBwZXIpfWZ1bmN0aW9uIGluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl7c3RhcnQ9dG9GaW5pdGUoc3RhcnQpO2lmKGVuZD09PXVuZGVmaW5lZCl7ZW5kPXN0YXJ0O3N0YXJ0PTB9ZWxzZSBlbmQ9dG9GaW5pdGUoZW5kKTtudW1iZXI9dG9OdW1iZXIobnVtYmVyKTtyZXR1cm4gYmFzZUluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl9ZnVuY3Rpb24gcmFuZG9tKGxvd2VyLHVwcGVyLGZsb2F0aW5nKXtpZihmbG9hdGluZyYmdHlwZW9mIGZsb2F0aW5nIT0iYm9vbGVhbiImJmlzSXRlcmF0ZWVDYWxsKGxvd2VyLHVwcGVyLGZsb2F0aW5nKSl1cHBlcj1mbG9hdGluZz11bmRlZmluZWQ7aWYoZmxvYXRpbmc9PT11bmRlZmluZWQpaWYodHlwZW9mIHVwcGVyPT0KImJvb2xlYW4iKXtmbG9hdGluZz11cHBlcjt1cHBlcj11bmRlZmluZWR9ZWxzZSBpZih0eXBlb2YgbG93ZXI9PSJib29sZWFuIil7ZmxvYXRpbmc9bG93ZXI7bG93ZXI9dW5kZWZpbmVkfWlmKGxvd2VyPT09dW5kZWZpbmVkJiZ1cHBlcj09PXVuZGVmaW5lZCl7bG93ZXI9MDt1cHBlcj0xfWVsc2V7bG93ZXI9dG9GaW5pdGUobG93ZXIpO2lmKHVwcGVyPT09dW5kZWZpbmVkKXt1cHBlcj1sb3dlcjtsb3dlcj0wfWVsc2UgdXBwZXI9dG9GaW5pdGUodXBwZXIpfWlmKGxvd2VyPnVwcGVyKXt2YXIgdGVtcD1sb3dlcjtsb3dlcj11cHBlcjt1cHBlcj10ZW1wfWlmKGZsb2F0aW5nfHxsb3dlciUxfHx1cHBlciUxKXt2YXIgcmFuZD1uYXRpdmVSYW5kb20oKTtyZXR1cm4gbmF0aXZlTWluKGxvd2VyK3JhbmQqKHVwcGVyLWxvd2VyK2ZyZWVQYXJzZUZsb2F0KCIxZS0iKygocmFuZCsiIikubGVuZ3RoLTEpKSksdXBwZXIpfXJldHVybiBiYXNlUmFuZG9tKGxvd2VyLHVwcGVyKX12YXIgY2FtZWxDYXNlPQpjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCx3b3JkLGluZGV4KXt3b3JkPXdvcmQudG9Mb3dlckNhc2UoKTtyZXR1cm4gcmVzdWx0KyhpbmRleD9jYXBpdGFsaXplKHdvcmQpOndvcmQpfSk7ZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHJpbmcpe3JldHVybiB1cHBlckZpcnN0KHRvU3RyaW5nKHN0cmluZykudG9Mb3dlckNhc2UoKSl9ZnVuY3Rpb24gZGVidXJyKHN0cmluZyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7cmV0dXJuIHN0cmluZyYmc3RyaW5nLnJlcGxhY2UocmVMYXRpbixkZWJ1cnJMZXR0ZXIpLnJlcGxhY2UocmVDb21ib01hcmssIiIpfWZ1bmN0aW9uIGVuZHNXaXRoKHN0cmluZyx0YXJnZXQscG9zaXRpb24pe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO3RhcmdldD1iYXNlVG9TdHJpbmcodGFyZ2V0KTt2YXIgbGVuZ3RoPXN0cmluZy5sZW5ndGg7cG9zaXRpb249cG9zaXRpb249PT11bmRlZmluZWQ/bGVuZ3RoOmJhc2VDbGFtcCh0b0ludGVnZXIocG9zaXRpb24pLAowLGxlbmd0aCk7dmFyIGVuZD1wb3NpdGlvbjtwb3NpdGlvbi09dGFyZ2V0Lmxlbmd0aDtyZXR1cm4gcG9zaXRpb24+PTAmJnN0cmluZy5zbGljZShwb3NpdGlvbixlbmQpPT10YXJnZXR9ZnVuY3Rpb24gZXNjYXBlKHN0cmluZyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7cmV0dXJuIHN0cmluZyYmcmVIYXNVbmVzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKT9zdHJpbmcucmVwbGFjZShyZVVuZXNjYXBlZEh0bWwsZXNjYXBlSHRtbENoYXIpOnN0cmluZ31mdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtyZXR1cm4gc3RyaW5nJiZyZUhhc1JlZ0V4cENoYXIudGVzdChzdHJpbmcpP3N0cmluZy5yZXBsYWNlKHJlUmVnRXhwQ2hhciwiXFwkXHgyNiIpOnN0cmluZ312YXIga2ViYWJDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyItIjoiIikrd29yZC50b0xvd2VyQ2FzZSgpfSk7CnZhciBsb3dlckNhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/IiAiOiIiKSt3b3JkLnRvTG93ZXJDYXNlKCl9KTt2YXIgbG93ZXJGaXJzdD1jcmVhdGVDYXNlRmlyc3QoInRvTG93ZXJDYXNlIik7ZnVuY3Rpb24gcGFkKHN0cmluZyxsZW5ndGgsY2hhcnMpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO2xlbmd0aD10b0ludGVnZXIobGVuZ3RoKTt2YXIgc3RyTGVuZ3RoPWxlbmd0aD9zdHJpbmdTaXplKHN0cmluZyk6MDtpZighbGVuZ3RofHxzdHJMZW5ndGg+PWxlbmd0aClyZXR1cm4gc3RyaW5nO3ZhciBtaWQ9KGxlbmd0aC1zdHJMZW5ndGgpLzI7cmV0dXJuIGNyZWF0ZVBhZGRpbmcobmF0aXZlRmxvb3IobWlkKSxjaGFycykrc3RyaW5nK2NyZWF0ZVBhZGRpbmcobmF0aXZlQ2VpbChtaWQpLGNoYXJzKX1mdW5jdGlvbiBwYWRFbmQoc3RyaW5nLGxlbmd0aCxjaGFycyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7Cmxlbmd0aD10b0ludGVnZXIobGVuZ3RoKTt2YXIgc3RyTGVuZ3RoPWxlbmd0aD9zdHJpbmdTaXplKHN0cmluZyk6MDtyZXR1cm4gbGVuZ3RoJiZzdHJMZW5ndGg8bGVuZ3RoP3N0cmluZytjcmVhdGVQYWRkaW5nKGxlbmd0aC1zdHJMZW5ndGgsY2hhcnMpOnN0cmluZ31mdW5jdGlvbiBwYWRTdGFydChzdHJpbmcsbGVuZ3RoLGNoYXJzKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtsZW5ndGg9dG9JbnRlZ2VyKGxlbmd0aCk7dmFyIHN0ckxlbmd0aD1sZW5ndGg/c3RyaW5nU2l6ZShzdHJpbmcpOjA7cmV0dXJuIGxlbmd0aCYmc3RyTGVuZ3RoPGxlbmd0aD9jcmVhdGVQYWRkaW5nKGxlbmd0aC1zdHJMZW5ndGgsY2hhcnMpK3N0cmluZzpzdHJpbmd9ZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLHJhZGl4LGd1YXJkKXtpZihndWFyZHx8cmFkaXg9PW51bGwpcmFkaXg9MDtlbHNlIGlmKHJhZGl4KXJhZGl4PStyYWRpeDtyZXR1cm4gbmF0aXZlUGFyc2VJbnQodG9TdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LAoiIikscmFkaXh8fDApfWZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsbixndWFyZCl7aWYoZ3VhcmQ/aXNJdGVyYXRlZUNhbGwoc3RyaW5nLG4sZ3VhcmQpOm49PT11bmRlZmluZWQpbj0xO2Vsc2Ugbj10b0ludGVnZXIobik7cmV0dXJuIGJhc2VSZXBlYXQodG9TdHJpbmcoc3RyaW5nKSxuKX1mdW5jdGlvbiByZXBsYWNlKCl7dmFyIGFyZ3M9YXJndW1lbnRzLHN0cmluZz10b1N0cmluZyhhcmdzWzBdKTtyZXR1cm4gYXJncy5sZW5ndGg8Mz9zdHJpbmc6c3RyaW5nLnJlcGxhY2UoYXJnc1sxXSxhcmdzWzJdKX12YXIgc25ha2VDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyJfIjoiIikrd29yZC50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gc3BsaXQoc3RyaW5nLHNlcGFyYXRvcixsaW1pdCl7aWYobGltaXQmJnR5cGVvZiBsaW1pdCE9Im51bWJlciImJmlzSXRlcmF0ZWVDYWxsKHN0cmluZyxzZXBhcmF0b3IsbGltaXQpKXNlcGFyYXRvcj0KbGltaXQ9dW5kZWZpbmVkO2xpbWl0PWxpbWl0PT09dW5kZWZpbmVkP01BWF9BUlJBWV9MRU5HVEg6bGltaXQ+Pj4wO2lmKCFsaW1pdClyZXR1cm5bXTtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtpZihzdHJpbmcmJih0eXBlb2Ygc2VwYXJhdG9yPT0ic3RyaW5nInx8c2VwYXJhdG9yIT1udWxsJiYhaXNSZWdFeHAoc2VwYXJhdG9yKSkpe3NlcGFyYXRvcj1iYXNlVG9TdHJpbmcoc2VwYXJhdG9yKTtpZighc2VwYXJhdG9yJiZoYXNVbmljb2RlKHN0cmluZykpcmV0dXJuIGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHN0cmluZyksMCxsaW1pdCl9cmV0dXJuIHN0cmluZy5zcGxpdChzZXBhcmF0b3IsbGltaXQpfXZhciBzdGFydENhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/IiAiOiIiKSt1cHBlckZpcnN0KHdvcmQpfSk7ZnVuY3Rpb24gc3RhcnRzV2l0aChzdHJpbmcsdGFyZ2V0LHBvc2l0aW9uKXtzdHJpbmc9CnRvU3RyaW5nKHN0cmluZyk7cG9zaXRpb249cG9zaXRpb249PW51bGw/MDpiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwwLHN0cmluZy5sZW5ndGgpO3RhcmdldD1iYXNlVG9TdHJpbmcodGFyZ2V0KTtyZXR1cm4gc3RyaW5nLnNsaWNlKHBvc2l0aW9uLHBvc2l0aW9uK3RhcmdldC5sZW5ndGgpPT10YXJnZXR9ZnVuY3Rpb24gdGVtcGxhdGUoc3RyaW5nLG9wdGlvbnMsZ3VhcmQpe3ZhciBzZXR0aW5ncz1sb2Rhc2gudGVtcGxhdGVTZXR0aW5ncztpZihndWFyZCYmaXNJdGVyYXRlZUNhbGwoc3RyaW5nLG9wdGlvbnMsZ3VhcmQpKW9wdGlvbnM9dW5kZWZpbmVkO3N0cmluZz10b1N0cmluZyhzdHJpbmcpO29wdGlvbnM9YXNzaWduSW5XaXRoKHt9LG9wdGlvbnMsc2V0dGluZ3MsY3VzdG9tRGVmYXVsdHNBc3NpZ25Jbik7dmFyIGltcG9ydHM9YXNzaWduSW5XaXRoKHt9LG9wdGlvbnMuaW1wb3J0cyxzZXR0aW5ncy5pbXBvcnRzLGN1c3RvbURlZmF1bHRzQXNzaWduSW4pLGltcG9ydHNLZXlzPQprZXlzKGltcG9ydHMpLGltcG9ydHNWYWx1ZXM9YmFzZVZhbHVlcyhpbXBvcnRzLGltcG9ydHNLZXlzKTt2YXIgaXNFc2NhcGluZyxpc0V2YWx1YXRpbmcsaW5kZXg9MCxpbnRlcnBvbGF0ZT1vcHRpb25zLmludGVycG9sYXRlfHxyZU5vTWF0Y2gsc291cmNlPSJfX3AgK1x4M2QgJyI7dmFyIHJlRGVsaW1pdGVycz1SZWdFeHAoKG9wdGlvbnMuZXNjYXBlfHxyZU5vTWF0Y2gpLnNvdXJjZSsifCIraW50ZXJwb2xhdGUuc291cmNlKyJ8IisoaW50ZXJwb2xhdGU9PT1yZUludGVycG9sYXRlP3JlRXNUZW1wbGF0ZTpyZU5vTWF0Y2gpLnNvdXJjZSsifCIrKG9wdGlvbnMuZXZhbHVhdGV8fHJlTm9NYXRjaCkuc291cmNlKyJ8JCIsImciKTt2YXIgc291cmNlVVJMPSIvLyMgc291cmNlVVJMXHgzZCIrKCJzb3VyY2VVUkwiaW4gb3B0aW9ucz9vcHRpb25zLnNvdXJjZVVSTDoibG9kYXNoLnRlbXBsYXRlU291cmNlc1siKyArK3RlbXBsYXRlQ291bnRlcisiXSIpKyJcbiI7c3RyaW5nLnJlcGxhY2UocmVEZWxpbWl0ZXJzLApmdW5jdGlvbihtYXRjaCxlc2NhcGVWYWx1ZSxpbnRlcnBvbGF0ZVZhbHVlLGVzVGVtcGxhdGVWYWx1ZSxldmFsdWF0ZVZhbHVlLG9mZnNldCl7aW50ZXJwb2xhdGVWYWx1ZXx8KGludGVycG9sYXRlVmFsdWU9ZXNUZW1wbGF0ZVZhbHVlKTtzb3VyY2UrPXN0cmluZy5zbGljZShpbmRleCxvZmZzZXQpLnJlcGxhY2UocmVVbmVzY2FwZWRTdHJpbmcsZXNjYXBlU3RyaW5nQ2hhcik7aWYoZXNjYXBlVmFsdWUpe2lzRXNjYXBpbmc9dHJ1ZTtzb3VyY2UrPSInICtcbl9fZSgiK2VzY2FwZVZhbHVlKyIpICtcbicifWlmKGV2YWx1YXRlVmFsdWUpe2lzRXZhbHVhdGluZz10cnVlO3NvdXJjZSs9Iic7XG4iK2V2YWx1YXRlVmFsdWUrIjtcbl9fcCArXHgzZCAnIn1pZihpbnRlcnBvbGF0ZVZhbHVlKXNvdXJjZSs9IicgK1xuKChfX3QgXHgzZCAoIitpbnRlcnBvbGF0ZVZhbHVlKyIpKSBceDNkXHgzZCBudWxsID8gJycgOiBfX3QpICtcbiciO2luZGV4PW9mZnNldCttYXRjaC5sZW5ndGg7cmV0dXJuIG1hdGNofSk7CnNvdXJjZSs9Iic7XG4iO3ZhciB2YXJpYWJsZT1vcHRpb25zLnZhcmlhYmxlO2lmKCF2YXJpYWJsZSlzb3VyY2U9IndpdGggKG9iaikge1xuIitzb3VyY2UrIlxufVxuIjtzb3VyY2U9KGlzRXZhbHVhdGluZz9zb3VyY2UucmVwbGFjZShyZUVtcHR5U3RyaW5nTGVhZGluZywiIik6c291cmNlKS5yZXBsYWNlKHJlRW1wdHlTdHJpbmdNaWRkbGUsIiQxIikucmVwbGFjZShyZUVtcHR5U3RyaW5nVHJhaWxpbmcsIiQxOyIpO3NvdXJjZT0iZnVuY3Rpb24oIisodmFyaWFibGV8fCJvYmoiKSsiKSB7XG4iKyh2YXJpYWJsZT8iIjoib2JqIHx8IChvYmogXHgzZCB7fSk7XG4iKSsidmFyIF9fdCwgX19wIFx4M2QgJyciKyhpc0VzY2FwaW5nPyIsIF9fZSBceDNkIF8uZXNjYXBlIjoiIikrKGlzRXZhbHVhdGluZz8iLCBfX2ogXHgzZCBBcnJheS5wcm90b3R5cGUuam9pbjtcbiIrImZ1bmN0aW9uIHByaW50KCkgeyBfX3AgK1x4M2QgX19qLmNhbGwoYXJndW1lbnRzLCAnJykgfVxuIjoiO1xuIikrc291cmNlKwoicmV0dXJuIF9fcFxufSI7dmFyIHJlc3VsdD1hdHRlbXB0KGZ1bmN0aW9uKCl7cmV0dXJuIEZ1bmN0aW9uKGltcG9ydHNLZXlzLHNvdXJjZVVSTCsicmV0dXJuICIrc291cmNlKS5hcHBseSh1bmRlZmluZWQsaW1wb3J0c1ZhbHVlcyl9KTtyZXN1bHQuc291cmNlPXNvdXJjZTtpZihpc0Vycm9yKHJlc3VsdCkpdGhyb3cgcmVzdWx0O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdG9Mb3dlcih2YWx1ZSl7cmV0dXJuIHRvU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIHRvVXBwZXIodmFsdWUpe3JldHVybiB0b1N0cmluZyh2YWx1ZSkudG9VcHBlckNhc2UoKX1mdW5jdGlvbiB0cmltKHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltLCIiKTtpZighc3RyaW5nfHwhKGNoYXJzPWJhc2VUb1N0cmluZyhjaGFycykpKXJldHVybiBzdHJpbmc7CnZhciBzdHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoc3RyaW5nKSxjaHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoY2hhcnMpLHN0YXJ0PWNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpLGVuZD1jaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsY2hyU3ltYm9scykrMTtyZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsc3RhcnQsZW5kKS5qb2luKCIiKX1mdW5jdGlvbiB0cmltRW5kKHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltRW5kLCIiKTtpZighc3RyaW5nfHwhKGNoYXJzPWJhc2VUb1N0cmluZyhjaGFycykpKXJldHVybiBzdHJpbmc7dmFyIHN0clN5bWJvbHM9c3RyaW5nVG9BcnJheShzdHJpbmcpLGVuZD1jaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsc3RyaW5nVG9BcnJheShjaGFycykpKzE7cmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLAowLGVuZCkuam9pbigiIil9ZnVuY3Rpb24gdHJpbVN0YXJ0KHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltU3RhcnQsIiIpO2lmKCFzdHJpbmd8fCEoY2hhcnM9YmFzZVRvU3RyaW5nKGNoYXJzKSkpcmV0dXJuIHN0cmluZzt2YXIgc3RyU3ltYm9scz1zdHJpbmdUb0FycmF5KHN0cmluZyksc3RhcnQ9Y2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsc3RyaW5nVG9BcnJheShjaGFycykpO3JldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scyxzdGFydCkuam9pbigiIil9ZnVuY3Rpb24gdHJ1bmNhdGUoc3RyaW5nLG9wdGlvbnMpe3ZhciBsZW5ndGg9REVGQVVMVF9UUlVOQ19MRU5HVEgsb21pc3Npb249REVGQVVMVF9UUlVOQ19PTUlTU0lPTjtpZihpc09iamVjdChvcHRpb25zKSl7dmFyIHNlcGFyYXRvcj0ic2VwYXJhdG9yImluIG9wdGlvbnM/Cm9wdGlvbnMuc2VwYXJhdG9yOnNlcGFyYXRvcjtsZW5ndGg9Imxlbmd0aCJpbiBvcHRpb25zP3RvSW50ZWdlcihvcHRpb25zLmxlbmd0aCk6bGVuZ3RoO29taXNzaW9uPSJvbWlzc2lvbiJpbiBvcHRpb25zP2Jhc2VUb1N0cmluZyhvcHRpb25zLm9taXNzaW9uKTpvbWlzc2lvbn1zdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTt2YXIgc3RyTGVuZ3RoPXN0cmluZy5sZW5ndGg7aWYoaGFzVW5pY29kZShzdHJpbmcpKXt2YXIgc3RyU3ltYm9scz1zdHJpbmdUb0FycmF5KHN0cmluZyk7c3RyTGVuZ3RoPXN0clN5bWJvbHMubGVuZ3RofWlmKGxlbmd0aD49c3RyTGVuZ3RoKXJldHVybiBzdHJpbmc7dmFyIGVuZD1sZW5ndGgtc3RyaW5nU2l6ZShvbWlzc2lvbik7aWYoZW5kPDEpcmV0dXJuIG9taXNzaW9uO3ZhciByZXN1bHQ9c3RyU3ltYm9scz9jYXN0U2xpY2Uoc3RyU3ltYm9scywwLGVuZCkuam9pbigiIik6c3RyaW5nLnNsaWNlKDAsZW5kKTtpZihzZXBhcmF0b3I9PT11bmRlZmluZWQpcmV0dXJuIHJlc3VsdCsKb21pc3Npb247aWYoc3RyU3ltYm9scyllbmQrPXJlc3VsdC5sZW5ndGgtZW5kO2lmKGlzUmVnRXhwKHNlcGFyYXRvcikpe2lmKHN0cmluZy5zbGljZShlbmQpLnNlYXJjaChzZXBhcmF0b3IpKXt2YXIgbWF0Y2gsc3Vic3RyaW5nPXJlc3VsdDtpZighc2VwYXJhdG9yLmdsb2JhbClzZXBhcmF0b3I9UmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsdG9TdHJpbmcocmVGbGFncy5leGVjKHNlcGFyYXRvcikpKyJnIik7c2VwYXJhdG9yLmxhc3RJbmRleD0wO3doaWxlKG1hdGNoPXNlcGFyYXRvci5leGVjKHN1YnN0cmluZykpdmFyIG5ld0VuZD1tYXRjaC5pbmRleDtyZXN1bHQ9cmVzdWx0LnNsaWNlKDAsbmV3RW5kPT09dW5kZWZpbmVkP2VuZDpuZXdFbmQpfX1lbHNlIGlmKHN0cmluZy5pbmRleE9mKGJhc2VUb1N0cmluZyhzZXBhcmF0b3IpLGVuZCkhPWVuZCl7dmFyIGluZGV4PXJlc3VsdC5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO2lmKGluZGV4Pi0xKXJlc3VsdD1yZXN1bHQuc2xpY2UoMCxpbmRleCl9cmV0dXJuIHJlc3VsdCsKb21pc3Npb259ZnVuY3Rpb24gdW5lc2NhcGUoc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtyZXR1cm4gc3RyaW5nJiZyZUhhc0VzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKT9zdHJpbmcucmVwbGFjZShyZUVzY2FwZWRIdG1sLHVuZXNjYXBlSHRtbENoYXIpOnN0cmluZ312YXIgdXBwZXJDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyIgIjoiIikrd29yZC50b1VwcGVyQ2FzZSgpfSk7dmFyIHVwcGVyRmlyc3Q9Y3JlYXRlQ2FzZUZpcnN0KCJ0b1VwcGVyQ2FzZSIpO2Z1bmN0aW9uIHdvcmRzKHN0cmluZyxwYXR0ZXJuLGd1YXJkKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtwYXR0ZXJuPWd1YXJkP3VuZGVmaW5lZDpwYXR0ZXJuO2lmKHBhdHRlcm49PT11bmRlZmluZWQpcmV0dXJuIGhhc1VuaWNvZGVXb3JkKHN0cmluZyk/dW5pY29kZVdvcmRzKHN0cmluZyk6YXNjaWlXb3JkcyhzdHJpbmcpO3JldHVybiBzdHJpbmcubWF0Y2gocGF0dGVybil8fApbXX12YXIgYXR0ZW1wdD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLGFyZ3Mpe3RyeXtyZXR1cm4gYXBwbHkoZnVuYyx1bmRlZmluZWQsYXJncyl9Y2F0Y2goZSl7cmV0dXJuIGlzRXJyb3IoZSk/ZTpuZXcgRXJyb3IoZSl9fSk7dmFyIGJpbmRBbGw9ZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LG1ldGhvZE5hbWVzKXthcnJheUVhY2gobWV0aG9kTmFtZXMsZnVuY3Rpb24oa2V5KXtrZXk9dG9LZXkoa2V5KTtiYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSxiaW5kKG9iamVjdFtrZXldLG9iamVjdCkpfSk7cmV0dXJuIG9iamVjdH0pO2Z1bmN0aW9uIGNvbmQocGFpcnMpe3ZhciBsZW5ndGg9cGFpcnM9PW51bGw/MDpwYWlycy5sZW5ndGgsdG9JdGVyYXRlZT1nZXRJdGVyYXRlZSgpO3BhaXJzPSFsZW5ndGg/W106YXJyYXlNYXAocGFpcnMsZnVuY3Rpb24ocGFpcil7aWYodHlwZW9mIHBhaXJbMV0hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3JldHVyblt0b0l0ZXJhdGVlKHBhaXJbMF0pLApwYWlyWzFdXX0pO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgaW5kZXg9LTE7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBwYWlyPXBhaXJzW2luZGV4XTtpZihhcHBseShwYWlyWzBdLHRoaXMsYXJncykpcmV0dXJuIGFwcGx5KHBhaXJbMV0sdGhpcyxhcmdzKX19KX1mdW5jdGlvbiBjb25mb3Jtcyhzb3VyY2Upe3JldHVybiBiYXNlQ29uZm9ybXMoYmFzZUNsb25lKHNvdXJjZSxDTE9ORV9ERUVQX0ZMQUcpKX1mdW5jdGlvbiBjb25zdGFudCh2YWx1ZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHZhbHVlfX1mdW5jdGlvbiBkZWZhdWx0VG8odmFsdWUsZGVmYXVsdFZhbHVlKXtyZXR1cm4gdmFsdWU9PW51bGx8fHZhbHVlIT09dmFsdWU/ZGVmYXVsdFZhbHVlOnZhbHVlfXZhciBmbG93PWNyZWF0ZUZsb3coKTt2YXIgZmxvd1JpZ2h0PWNyZWF0ZUZsb3codHJ1ZSk7ZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpe3JldHVybiB2YWx1ZX1mdW5jdGlvbiBpdGVyYXRlZShmdW5jKXtyZXR1cm4gYmFzZUl0ZXJhdGVlKHR5cGVvZiBmdW5jPT0KImZ1bmN0aW9uIj9mdW5jOmJhc2VDbG9uZShmdW5jLENMT05FX0RFRVBfRkxBRykpfWZ1bmN0aW9uIG1hdGNoZXMoc291cmNlKXtyZXR1cm4gYmFzZU1hdGNoZXMoYmFzZUNsb25lKHNvdXJjZSxDTE9ORV9ERUVQX0ZMQUcpKX1mdW5jdGlvbiBtYXRjaGVzUHJvcGVydHkocGF0aCxzcmNWYWx1ZSl7cmV0dXJuIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCxiYXNlQ2xvbmUoc3JjVmFsdWUsQ0xPTkVfREVFUF9GTEFHKSl9dmFyIG1ldGhvZD1iYXNlUmVzdChmdW5jdGlvbihwYXRoLGFyZ3Mpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlSW52b2tlKG9iamVjdCxwYXRoLGFyZ3MpfX0pO3ZhciBtZXRob2RPZj1iYXNlUmVzdChmdW5jdGlvbihvYmplY3QsYXJncyl7cmV0dXJuIGZ1bmN0aW9uKHBhdGgpe3JldHVybiBiYXNlSW52b2tlKG9iamVjdCxwYXRoLGFyZ3MpfX0pO2Z1bmN0aW9uIG1peGluKG9iamVjdCxzb3VyY2Usb3B0aW9ucyl7dmFyIHByb3BzPWtleXMoc291cmNlKSwKbWV0aG9kTmFtZXM9YmFzZUZ1bmN0aW9ucyhzb3VyY2UscHJvcHMpO2lmKG9wdGlvbnM9PW51bGwmJiEoaXNPYmplY3Qoc291cmNlKSYmKG1ldGhvZE5hbWVzLmxlbmd0aHx8IXByb3BzLmxlbmd0aCkpKXtvcHRpb25zPXNvdXJjZTtzb3VyY2U9b2JqZWN0O29iamVjdD10aGlzO21ldGhvZE5hbWVzPWJhc2VGdW5jdGlvbnMoc291cmNlLGtleXMoc291cmNlKSl9dmFyIGNoYWluPSEoaXNPYmplY3Qob3B0aW9ucykmJiJjaGFpbiJpbiBvcHRpb25zKXx8ISFvcHRpb25zLmNoYWluLGlzRnVuYz1pc0Z1bmN0aW9uKG9iamVjdCk7YXJyYXlFYWNoKG1ldGhvZE5hbWVzLGZ1bmN0aW9uKG1ldGhvZE5hbWUpe3ZhciBmdW5jPXNvdXJjZVttZXRob2ROYW1lXTtvYmplY3RbbWV0aG9kTmFtZV09ZnVuYztpZihpc0Z1bmMpb2JqZWN0LnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbigpe3ZhciBjaGFpbkFsbD10aGlzLl9fY2hhaW5fXztpZihjaGFpbnx8Y2hhaW5BbGwpe3ZhciByZXN1bHQ9Cm9iamVjdCh0aGlzLl9fd3JhcHBlZF9fKSxhY3Rpb25zPXJlc3VsdC5fX2FjdGlvbnNfXz1jb3B5QXJyYXkodGhpcy5fX2FjdGlvbnNfXyk7YWN0aW9ucy5wdXNoKHsiZnVuYyI6ZnVuYywiYXJncyI6YXJndW1lbnRzLCJ0aGlzQXJnIjpvYmplY3R9KTtyZXN1bHQuX19jaGFpbl9fPWNoYWluQWxsO3JldHVybiByZXN1bHR9cmV0dXJuIGZ1bmMuYXBwbHkob2JqZWN0LGFycmF5UHVzaChbdGhpcy52YWx1ZSgpXSxhcmd1bWVudHMpKX19KTtyZXR1cm4gb2JqZWN0fWZ1bmN0aW9uIG5vQ29uZmxpY3QoKXtpZihyb290Ll89PT10aGlzKXJvb3QuXz1vbGREYXNoO3JldHVybiB0aGlzfWZ1bmN0aW9uIG5vb3AoKXt9ZnVuY3Rpb24gbnRoQXJnKG4pe249dG9JbnRlZ2VyKG4pO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXtyZXR1cm4gYmFzZU50aChhcmdzLG4pfSl9dmFyIG92ZXI9Y3JlYXRlT3ZlcihhcnJheU1hcCk7dmFyIG92ZXJFdmVyeT1jcmVhdGVPdmVyKGFycmF5RXZlcnkpOwp2YXIgb3ZlclNvbWU9Y3JlYXRlT3ZlcihhcnJheVNvbWUpO2Z1bmN0aW9uIHByb3BlcnR5KHBhdGgpe3JldHVybiBpc0tleShwYXRoKT9iYXNlUHJvcGVydHkodG9LZXkocGF0aCkpOmJhc2VQcm9wZXJ0eURlZXAocGF0aCl9ZnVuY3Rpb24gcHJvcGVydHlPZihvYmplY3Qpe3JldHVybiBmdW5jdGlvbihwYXRoKXtyZXR1cm4gb2JqZWN0PT1udWxsP3VuZGVmaW5lZDpiYXNlR2V0KG9iamVjdCxwYXRoKX19dmFyIHJhbmdlPWNyZWF0ZVJhbmdlKCk7dmFyIHJhbmdlUmlnaHQ9Y3JlYXRlUmFuZ2UodHJ1ZSk7ZnVuY3Rpb24gc3R1YkFycmF5KCl7cmV0dXJuW119ZnVuY3Rpb24gc3R1YkZhbHNlKCl7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIHN0dWJPYmplY3QoKXtyZXR1cm57fX1mdW5jdGlvbiBzdHViU3RyaW5nKCl7cmV0dXJuIiJ9ZnVuY3Rpb24gc3R1YlRydWUoKXtyZXR1cm4gdHJ1ZX1mdW5jdGlvbiB0aW1lcyhuLGl0ZXJhdGVlKXtuPXRvSW50ZWdlcihuKTtpZihuPDF8fG4+TUFYX1NBRkVfSU5URUdFUilyZXR1cm5bXTsKdmFyIGluZGV4PU1BWF9BUlJBWV9MRU5HVEgsbGVuZ3RoPW5hdGl2ZU1pbihuLE1BWF9BUlJBWV9MRU5HVEgpO2l0ZXJhdGVlPWdldEl0ZXJhdGVlKGl0ZXJhdGVlKTtuLT1NQVhfQVJSQVlfTEVOR1RIO3ZhciByZXN1bHQ9YmFzZVRpbWVzKGxlbmd0aCxpdGVyYXRlZSk7d2hpbGUoKytpbmRleDxuKWl0ZXJhdGVlKGluZGV4KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHRvUGF0aCh2YWx1ZSl7aWYoaXNBcnJheSh2YWx1ZSkpcmV0dXJuIGFycmF5TWFwKHZhbHVlLHRvS2V5KTtyZXR1cm4gaXNTeW1ib2wodmFsdWUpP1t2YWx1ZV06Y29weUFycmF5KHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpKX1mdW5jdGlvbiB1bmlxdWVJZChwcmVmaXgpe3ZhciBpZD0rK2lkQ291bnRlcjtyZXR1cm4gdG9TdHJpbmcocHJlZml4KStpZH12YXIgYWRkPWNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24oYXVnZW5kLGFkZGVuZCl7cmV0dXJuIGF1Z2VuZCthZGRlbmR9LDApO3ZhciBjZWlsPWNyZWF0ZVJvdW5kKCJjZWlsIik7CnZhciBkaXZpZGU9Y3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihkaXZpZGVuZCxkaXZpc29yKXtyZXR1cm4gZGl2aWRlbmQvZGl2aXNvcn0sMSk7dmFyIGZsb29yPWNyZWF0ZVJvdW5kKCJmbG9vciIpO2Z1bmN0aW9uIG1heChhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZUV4dHJlbXVtKGFycmF5LGlkZW50aXR5LGJhc2VHdCk6dW5kZWZpbmVkfWZ1bmN0aW9uIG1heEJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlRXh0cmVtdW0oYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMiksYmFzZUd0KTp1bmRlZmluZWR9ZnVuY3Rpb24gbWVhbihhcnJheSl7cmV0dXJuIGJhc2VNZWFuKGFycmF5LGlkZW50aXR5KX1mdW5jdGlvbiBtZWFuQnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBiYXNlTWVhbihhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSl9ZnVuY3Rpb24gbWluKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD8KYmFzZUV4dHJlbXVtKGFycmF5LGlkZW50aXR5LGJhc2VMdCk6dW5kZWZpbmVkfWZ1bmN0aW9uIG1pbkJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlRXh0cmVtdW0oYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMiksYmFzZUx0KTp1bmRlZmluZWR9dmFyIG11bHRpcGx5PWNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24obXVsdGlwbGllcixtdWx0aXBsaWNhbmQpe3JldHVybiBtdWx0aXBsaWVyKm11bHRpcGxpY2FuZH0sMSk7dmFyIHJvdW5kPWNyZWF0ZVJvdW5kKCJyb3VuZCIpO3ZhciBzdWJ0cmFjdD1jcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG1pbnVlbmQsc3VidHJhaGVuZCl7cmV0dXJuIG1pbnVlbmQtc3VidHJhaGVuZH0sMCk7ZnVuY3Rpb24gc3VtKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlU3VtKGFycmF5LGlkZW50aXR5KTowfWZ1bmN0aW9uIHN1bUJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJgphcnJheS5sZW5ndGg/YmFzZVN1bShhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6MH1sb2Rhc2guYWZ0ZXI9YWZ0ZXI7bG9kYXNoLmFyeT1hcnk7bG9kYXNoLmFzc2lnbj1hc3NpZ247bG9kYXNoLmFzc2lnbkluPWFzc2lnbkluO2xvZGFzaC5hc3NpZ25JbldpdGg9YXNzaWduSW5XaXRoO2xvZGFzaC5hc3NpZ25XaXRoPWFzc2lnbldpdGg7bG9kYXNoLmF0PWF0O2xvZGFzaC5iZWZvcmU9YmVmb3JlO2xvZGFzaC5iaW5kPWJpbmQ7bG9kYXNoLmJpbmRBbGw9YmluZEFsbDtsb2Rhc2guYmluZEtleT1iaW5kS2V5O2xvZGFzaC5jYXN0QXJyYXk9Y2FzdEFycmF5O2xvZGFzaC5jaGFpbj1jaGFpbjtsb2Rhc2guY2h1bms9Y2h1bms7bG9kYXNoLmNvbXBhY3Q9Y29tcGFjdDtsb2Rhc2guY29uY2F0PWNvbmNhdDtsb2Rhc2guY29uZD1jb25kO2xvZGFzaC5jb25mb3Jtcz1jb25mb3Jtcztsb2Rhc2guY29uc3RhbnQ9Y29uc3RhbnQ7bG9kYXNoLmNvdW50Qnk9Y291bnRCeTtsb2Rhc2guY3JlYXRlPQpjcmVhdGU7bG9kYXNoLmN1cnJ5PWN1cnJ5O2xvZGFzaC5jdXJyeVJpZ2h0PWN1cnJ5UmlnaHQ7bG9kYXNoLmRlYm91bmNlPWRlYm91bmNlO2xvZGFzaC5kZWZhdWx0cz1kZWZhdWx0cztsb2Rhc2guZGVmYXVsdHNEZWVwPWRlZmF1bHRzRGVlcDtsb2Rhc2guZGVmZXI9ZGVmZXI7bG9kYXNoLmRlbGF5PWRlbGF5O2xvZGFzaC5kaWZmZXJlbmNlPWRpZmZlcmVuY2U7bG9kYXNoLmRpZmZlcmVuY2VCeT1kaWZmZXJlbmNlQnk7bG9kYXNoLmRpZmZlcmVuY2VXaXRoPWRpZmZlcmVuY2VXaXRoO2xvZGFzaC5kcm9wPWRyb3A7bG9kYXNoLmRyb3BSaWdodD1kcm9wUmlnaHQ7bG9kYXNoLmRyb3BSaWdodFdoaWxlPWRyb3BSaWdodFdoaWxlO2xvZGFzaC5kcm9wV2hpbGU9ZHJvcFdoaWxlO2xvZGFzaC5maWxsPWZpbGw7bG9kYXNoLmZpbHRlcj1maWx0ZXI7bG9kYXNoLmZsYXRNYXA9ZmxhdE1hcDtsb2Rhc2guZmxhdE1hcERlZXA9ZmxhdE1hcERlZXA7bG9kYXNoLmZsYXRNYXBEZXB0aD1mbGF0TWFwRGVwdGg7CmxvZGFzaC5mbGF0dGVuPWZsYXR0ZW47bG9kYXNoLmZsYXR0ZW5EZWVwPWZsYXR0ZW5EZWVwO2xvZGFzaC5mbGF0dGVuRGVwdGg9ZmxhdHRlbkRlcHRoO2xvZGFzaC5mbGlwPWZsaXA7bG9kYXNoLmZsb3c9Zmxvdztsb2Rhc2guZmxvd1JpZ2h0PWZsb3dSaWdodDtsb2Rhc2guZnJvbVBhaXJzPWZyb21QYWlycztsb2Rhc2guZnVuY3Rpb25zPWZ1bmN0aW9ucztsb2Rhc2guZnVuY3Rpb25zSW49ZnVuY3Rpb25zSW47bG9kYXNoLmdyb3VwQnk9Z3JvdXBCeTtsb2Rhc2guaW5pdGlhbD1pbml0aWFsO2xvZGFzaC5pbnRlcnNlY3Rpb249aW50ZXJzZWN0aW9uO2xvZGFzaC5pbnRlcnNlY3Rpb25CeT1pbnRlcnNlY3Rpb25CeTtsb2Rhc2guaW50ZXJzZWN0aW9uV2l0aD1pbnRlcnNlY3Rpb25XaXRoO2xvZGFzaC5pbnZlcnQ9aW52ZXJ0O2xvZGFzaC5pbnZlcnRCeT1pbnZlcnRCeTtsb2Rhc2guaW52b2tlTWFwPWludm9rZU1hcDtsb2Rhc2guaXRlcmF0ZWU9aXRlcmF0ZWU7bG9kYXNoLmtleUJ5PQprZXlCeTtsb2Rhc2gua2V5cz1rZXlzO2xvZGFzaC5rZXlzSW49a2V5c0luO2xvZGFzaC5tYXA9bWFwO2xvZGFzaC5tYXBLZXlzPW1hcEtleXM7bG9kYXNoLm1hcFZhbHVlcz1tYXBWYWx1ZXM7bG9kYXNoLm1hdGNoZXM9bWF0Y2hlcztsb2Rhc2gubWF0Y2hlc1Byb3BlcnR5PW1hdGNoZXNQcm9wZXJ0eTtsb2Rhc2gubWVtb2l6ZT1tZW1vaXplO2xvZGFzaC5tZXJnZT1tZXJnZTtsb2Rhc2gubWVyZ2VXaXRoPW1lcmdlV2l0aDtsb2Rhc2gubWV0aG9kPW1ldGhvZDtsb2Rhc2gubWV0aG9kT2Y9bWV0aG9kT2Y7bG9kYXNoLm1peGluPW1peGluO2xvZGFzaC5uZWdhdGU9bmVnYXRlO2xvZGFzaC5udGhBcmc9bnRoQXJnO2xvZGFzaC5vbWl0PW9taXQ7bG9kYXNoLm9taXRCeT1vbWl0Qnk7bG9kYXNoLm9uY2U9b25jZTtsb2Rhc2gub3JkZXJCeT1vcmRlckJ5O2xvZGFzaC5vdmVyPW92ZXI7bG9kYXNoLm92ZXJBcmdzPW92ZXJBcmdzO2xvZGFzaC5vdmVyRXZlcnk9b3ZlckV2ZXJ5O2xvZGFzaC5vdmVyU29tZT0Kb3ZlclNvbWU7bG9kYXNoLnBhcnRpYWw9cGFydGlhbDtsb2Rhc2gucGFydGlhbFJpZ2h0PXBhcnRpYWxSaWdodDtsb2Rhc2gucGFydGl0aW9uPXBhcnRpdGlvbjtsb2Rhc2gucGljaz1waWNrO2xvZGFzaC5waWNrQnk9cGlja0J5O2xvZGFzaC5wcm9wZXJ0eT1wcm9wZXJ0eTtsb2Rhc2gucHJvcGVydHlPZj1wcm9wZXJ0eU9mO2xvZGFzaC5wdWxsPXB1bGw7bG9kYXNoLnB1bGxBbGw9cHVsbEFsbDtsb2Rhc2gucHVsbEFsbEJ5PXB1bGxBbGxCeTtsb2Rhc2gucHVsbEFsbFdpdGg9cHVsbEFsbFdpdGg7bG9kYXNoLnB1bGxBdD1wdWxsQXQ7bG9kYXNoLnJhbmdlPXJhbmdlO2xvZGFzaC5yYW5nZVJpZ2h0PXJhbmdlUmlnaHQ7bG9kYXNoLnJlYXJnPXJlYXJnO2xvZGFzaC5yZWplY3Q9cmVqZWN0O2xvZGFzaC5yZW1vdmU9cmVtb3ZlO2xvZGFzaC5yZXN0PXJlc3Q7bG9kYXNoLnJldmVyc2U9cmV2ZXJzZTtsb2Rhc2guc2FtcGxlU2l6ZT1zYW1wbGVTaXplO2xvZGFzaC5zZXQ9c2V0O2xvZGFzaC5zZXRXaXRoPQpzZXRXaXRoO2xvZGFzaC5zaHVmZmxlPXNodWZmbGU7bG9kYXNoLnNsaWNlPXNsaWNlO2xvZGFzaC5zb3J0Qnk9c29ydEJ5O2xvZGFzaC5zb3J0ZWRVbmlxPXNvcnRlZFVuaXE7bG9kYXNoLnNvcnRlZFVuaXFCeT1zb3J0ZWRVbmlxQnk7bG9kYXNoLnNwbGl0PXNwbGl0O2xvZGFzaC5zcHJlYWQ9c3ByZWFkO2xvZGFzaC50YWlsPXRhaWw7bG9kYXNoLnRha2U9dGFrZTtsb2Rhc2gudGFrZVJpZ2h0PXRha2VSaWdodDtsb2Rhc2gudGFrZVJpZ2h0V2hpbGU9dGFrZVJpZ2h0V2hpbGU7bG9kYXNoLnRha2VXaGlsZT10YWtlV2hpbGU7bG9kYXNoLnRhcD10YXA7bG9kYXNoLnRocm90dGxlPXRocm90dGxlO2xvZGFzaC50aHJ1PXRocnU7bG9kYXNoLnRvQXJyYXk9dG9BcnJheTtsb2Rhc2gudG9QYWlycz10b1BhaXJzO2xvZGFzaC50b1BhaXJzSW49dG9QYWlyc0luO2xvZGFzaC50b1BhdGg9dG9QYXRoO2xvZGFzaC50b1BsYWluT2JqZWN0PXRvUGxhaW5PYmplY3Q7bG9kYXNoLnRyYW5zZm9ybT0KdHJhbnNmb3JtO2xvZGFzaC51bmFyeT11bmFyeTtsb2Rhc2gudW5pb249dW5pb247bG9kYXNoLnVuaW9uQnk9dW5pb25CeTtsb2Rhc2gudW5pb25XaXRoPXVuaW9uV2l0aDtsb2Rhc2gudW5pcT11bmlxO2xvZGFzaC51bmlxQnk9dW5pcUJ5O2xvZGFzaC51bmlxV2l0aD11bmlxV2l0aDtsb2Rhc2gudW5zZXQ9dW5zZXQ7bG9kYXNoLnVuemlwPXVuemlwO2xvZGFzaC51bnppcFdpdGg9dW56aXBXaXRoO2xvZGFzaC51cGRhdGU9dXBkYXRlO2xvZGFzaC51cGRhdGVXaXRoPXVwZGF0ZVdpdGg7bG9kYXNoLnZhbHVlcz12YWx1ZXM7bG9kYXNoLnZhbHVlc0luPXZhbHVlc0luO2xvZGFzaC53aXRob3V0PXdpdGhvdXQ7bG9kYXNoLndvcmRzPXdvcmRzO2xvZGFzaC53cmFwPXdyYXA7bG9kYXNoLnhvcj14b3I7bG9kYXNoLnhvckJ5PXhvckJ5O2xvZGFzaC54b3JXaXRoPXhvcldpdGg7bG9kYXNoLnppcD16aXA7bG9kYXNoLnppcE9iamVjdD16aXBPYmplY3Q7bG9kYXNoLnppcE9iamVjdERlZXA9CnppcE9iamVjdERlZXA7bG9kYXNoLnppcFdpdGg9emlwV2l0aDtsb2Rhc2guZW50cmllcz10b1BhaXJzO2xvZGFzaC5lbnRyaWVzSW49dG9QYWlyc0luO2xvZGFzaC5leHRlbmQ9YXNzaWduSW47bG9kYXNoLmV4dGVuZFdpdGg9YXNzaWduSW5XaXRoO21peGluKGxvZGFzaCxsb2Rhc2gpO2xvZGFzaC5hZGQ9YWRkO2xvZGFzaC5hdHRlbXB0PWF0dGVtcHQ7bG9kYXNoLmNhbWVsQ2FzZT1jYW1lbENhc2U7bG9kYXNoLmNhcGl0YWxpemU9Y2FwaXRhbGl6ZTtsb2Rhc2guY2VpbD1jZWlsO2xvZGFzaC5jbGFtcD1jbGFtcDtsb2Rhc2guY2xvbmU9Y2xvbmU7bG9kYXNoLmNsb25lRGVlcD1jbG9uZURlZXA7bG9kYXNoLmNsb25lRGVlcFdpdGg9Y2xvbmVEZWVwV2l0aDtsb2Rhc2guY2xvbmVXaXRoPWNsb25lV2l0aDtsb2Rhc2guY29uZm9ybXNUbz1jb25mb3Jtc1RvO2xvZGFzaC5kZWJ1cnI9ZGVidXJyO2xvZGFzaC5kZWZhdWx0VG89ZGVmYXVsdFRvO2xvZGFzaC5kaXZpZGU9ZGl2aWRlO2xvZGFzaC5lbmRzV2l0aD0KZW5kc1dpdGg7bG9kYXNoLmVxPWVxO2xvZGFzaC5lc2NhcGU9ZXNjYXBlO2xvZGFzaC5lc2NhcGVSZWdFeHA9ZXNjYXBlUmVnRXhwO2xvZGFzaC5ldmVyeT1ldmVyeTtsb2Rhc2guZmluZD1maW5kO2xvZGFzaC5maW5kSW5kZXg9ZmluZEluZGV4O2xvZGFzaC5maW5kS2V5PWZpbmRLZXk7bG9kYXNoLmZpbmRMYXN0PWZpbmRMYXN0O2xvZGFzaC5maW5kTGFzdEluZGV4PWZpbmRMYXN0SW5kZXg7bG9kYXNoLmZpbmRMYXN0S2V5PWZpbmRMYXN0S2V5O2xvZGFzaC5mbG9vcj1mbG9vcjtsb2Rhc2guZm9yRWFjaD1mb3JFYWNoO2xvZGFzaC5mb3JFYWNoUmlnaHQ9Zm9yRWFjaFJpZ2h0O2xvZGFzaC5mb3JJbj1mb3JJbjtsb2Rhc2guZm9ySW5SaWdodD1mb3JJblJpZ2h0O2xvZGFzaC5mb3JPd249Zm9yT3duO2xvZGFzaC5mb3JPd25SaWdodD1mb3JPd25SaWdodDtsb2Rhc2guZ2V0PWdldDtsb2Rhc2guZ3Q9Z3Q7bG9kYXNoLmd0ZT1ndGU7bG9kYXNoLmhhcz1oYXM7bG9kYXNoLmhhc0luPWhhc0luOwpsb2Rhc2guaGVhZD1oZWFkO2xvZGFzaC5pZGVudGl0eT1pZGVudGl0eTtsb2Rhc2guaW5jbHVkZXM9aW5jbHVkZXM7bG9kYXNoLmluZGV4T2Y9aW5kZXhPZjtsb2Rhc2guaW5SYW5nZT1pblJhbmdlO2xvZGFzaC5pbnZva2U9aW52b2tlO2xvZGFzaC5pc0FyZ3VtZW50cz1pc0FyZ3VtZW50cztsb2Rhc2guaXNBcnJheT1pc0FycmF5O2xvZGFzaC5pc0FycmF5QnVmZmVyPWlzQXJyYXlCdWZmZXI7bG9kYXNoLmlzQXJyYXlMaWtlPWlzQXJyYXlMaWtlO2xvZGFzaC5pc0FycmF5TGlrZU9iamVjdD1pc0FycmF5TGlrZU9iamVjdDtsb2Rhc2guaXNCb29sZWFuPWlzQm9vbGVhbjtsb2Rhc2guaXNCdWZmZXI9aXNCdWZmZXI7bG9kYXNoLmlzRGF0ZT1pc0RhdGU7bG9kYXNoLmlzRWxlbWVudD1pc0VsZW1lbnQ7bG9kYXNoLmlzRW1wdHk9aXNFbXB0eTtsb2Rhc2guaXNFcXVhbD1pc0VxdWFsO2xvZGFzaC5pc0VxdWFsV2l0aD1pc0VxdWFsV2l0aDtsb2Rhc2guaXNFcnJvcj1pc0Vycm9yO2xvZGFzaC5pc0Zpbml0ZT0KaXNGaW5pdGU7bG9kYXNoLmlzRnVuY3Rpb249aXNGdW5jdGlvbjtsb2Rhc2guaXNJbnRlZ2VyPWlzSW50ZWdlcjtsb2Rhc2guaXNMZW5ndGg9aXNMZW5ndGg7bG9kYXNoLmlzTWFwPWlzTWFwO2xvZGFzaC5pc01hdGNoPWlzTWF0Y2g7bG9kYXNoLmlzTWF0Y2hXaXRoPWlzTWF0Y2hXaXRoO2xvZGFzaC5pc05hTj1pc05hTjtsb2Rhc2guaXNOYXRpdmU9aXNOYXRpdmU7bG9kYXNoLmlzTmlsPWlzTmlsO2xvZGFzaC5pc051bGw9aXNOdWxsO2xvZGFzaC5pc051bWJlcj1pc051bWJlcjtsb2Rhc2guaXNPYmplY3Q9aXNPYmplY3Q7bG9kYXNoLmlzT2JqZWN0TGlrZT1pc09iamVjdExpa2U7bG9kYXNoLmlzUGxhaW5PYmplY3Q9aXNQbGFpbk9iamVjdDtsb2Rhc2guaXNSZWdFeHA9aXNSZWdFeHA7bG9kYXNoLmlzU2FmZUludGVnZXI9aXNTYWZlSW50ZWdlcjtsb2Rhc2guaXNTZXQ9aXNTZXQ7bG9kYXNoLmlzU3RyaW5nPWlzU3RyaW5nO2xvZGFzaC5pc1N5bWJvbD1pc1N5bWJvbDtsb2Rhc2guaXNUeXBlZEFycmF5PQppc1R5cGVkQXJyYXk7bG9kYXNoLmlzVW5kZWZpbmVkPWlzVW5kZWZpbmVkO2xvZGFzaC5pc1dlYWtNYXA9aXNXZWFrTWFwO2xvZGFzaC5pc1dlYWtTZXQ9aXNXZWFrU2V0O2xvZGFzaC5qb2luPWpvaW47bG9kYXNoLmtlYmFiQ2FzZT1rZWJhYkNhc2U7bG9kYXNoLmxhc3Q9bGFzdDtsb2Rhc2gubGFzdEluZGV4T2Y9bGFzdEluZGV4T2Y7bG9kYXNoLmxvd2VyQ2FzZT1sb3dlckNhc2U7bG9kYXNoLmxvd2VyRmlyc3Q9bG93ZXJGaXJzdDtsb2Rhc2gubHQ9bHQ7bG9kYXNoLmx0ZT1sdGU7bG9kYXNoLm1heD1tYXg7bG9kYXNoLm1heEJ5PW1heEJ5O2xvZGFzaC5tZWFuPW1lYW47bG9kYXNoLm1lYW5CeT1tZWFuQnk7bG9kYXNoLm1pbj1taW47bG9kYXNoLm1pbkJ5PW1pbkJ5O2xvZGFzaC5zdHViQXJyYXk9c3R1YkFycmF5O2xvZGFzaC5zdHViRmFsc2U9c3R1YkZhbHNlO2xvZGFzaC5zdHViT2JqZWN0PXN0dWJPYmplY3Q7bG9kYXNoLnN0dWJTdHJpbmc9c3R1YlN0cmluZztsb2Rhc2guc3R1YlRydWU9CnN0dWJUcnVlO2xvZGFzaC5tdWx0aXBseT1tdWx0aXBseTtsb2Rhc2gubnRoPW50aDtsb2Rhc2gubm9Db25mbGljdD1ub0NvbmZsaWN0O2xvZGFzaC5ub29wPW5vb3A7bG9kYXNoLm5vdz1ub3c7bG9kYXNoLnBhZD1wYWQ7bG9kYXNoLnBhZEVuZD1wYWRFbmQ7bG9kYXNoLnBhZFN0YXJ0PXBhZFN0YXJ0O2xvZGFzaC5wYXJzZUludD1wYXJzZUludDtsb2Rhc2gucmFuZG9tPXJhbmRvbTtsb2Rhc2gucmVkdWNlPXJlZHVjZTtsb2Rhc2gucmVkdWNlUmlnaHQ9cmVkdWNlUmlnaHQ7bG9kYXNoLnJlcGVhdD1yZXBlYXQ7bG9kYXNoLnJlcGxhY2U9cmVwbGFjZTtsb2Rhc2gucmVzdWx0PXJlc3VsdDtsb2Rhc2gucm91bmQ9cm91bmQ7bG9kYXNoLnJ1bkluQ29udGV4dD1ydW5JbkNvbnRleHQ7bG9kYXNoLnNhbXBsZT1zYW1wbGU7bG9kYXNoLnNpemU9c2l6ZTtsb2Rhc2guc25ha2VDYXNlPXNuYWtlQ2FzZTtsb2Rhc2guc29tZT1zb21lO2xvZGFzaC5zb3J0ZWRJbmRleD1zb3J0ZWRJbmRleDtsb2Rhc2guc29ydGVkSW5kZXhCeT0Kc29ydGVkSW5kZXhCeTtsb2Rhc2guc29ydGVkSW5kZXhPZj1zb3J0ZWRJbmRleE9mO2xvZGFzaC5zb3J0ZWRMYXN0SW5kZXg9c29ydGVkTGFzdEluZGV4O2xvZGFzaC5zb3J0ZWRMYXN0SW5kZXhCeT1zb3J0ZWRMYXN0SW5kZXhCeTtsb2Rhc2guc29ydGVkTGFzdEluZGV4T2Y9c29ydGVkTGFzdEluZGV4T2Y7bG9kYXNoLnN0YXJ0Q2FzZT1zdGFydENhc2U7bG9kYXNoLnN0YXJ0c1dpdGg9c3RhcnRzV2l0aDtsb2Rhc2guc3VidHJhY3Q9c3VidHJhY3Q7bG9kYXNoLnN1bT1zdW07bG9kYXNoLnN1bUJ5PXN1bUJ5O2xvZGFzaC50ZW1wbGF0ZT10ZW1wbGF0ZTtsb2Rhc2gudGltZXM9dGltZXM7bG9kYXNoLnRvRmluaXRlPXRvRmluaXRlO2xvZGFzaC50b0ludGVnZXI9dG9JbnRlZ2VyO2xvZGFzaC50b0xlbmd0aD10b0xlbmd0aDtsb2Rhc2gudG9Mb3dlcj10b0xvd2VyO2xvZGFzaC50b051bWJlcj10b051bWJlcjtsb2Rhc2gudG9TYWZlSW50ZWdlcj10b1NhZmVJbnRlZ2VyO2xvZGFzaC50b1N0cmluZz0KdG9TdHJpbmc7bG9kYXNoLnRvVXBwZXI9dG9VcHBlcjtsb2Rhc2gudHJpbT10cmltO2xvZGFzaC50cmltRW5kPXRyaW1FbmQ7bG9kYXNoLnRyaW1TdGFydD10cmltU3RhcnQ7bG9kYXNoLnRydW5jYXRlPXRydW5jYXRlO2xvZGFzaC51bmVzY2FwZT11bmVzY2FwZTtsb2Rhc2gudW5pcXVlSWQ9dW5pcXVlSWQ7bG9kYXNoLnVwcGVyQ2FzZT11cHBlckNhc2U7bG9kYXNoLnVwcGVyRmlyc3Q9dXBwZXJGaXJzdDtsb2Rhc2guZWFjaD1mb3JFYWNoO2xvZGFzaC5lYWNoUmlnaHQ9Zm9yRWFjaFJpZ2h0O2xvZGFzaC5maXJzdD1oZWFkO21peGluKGxvZGFzaCxmdW5jdGlvbigpe3ZhciBzb3VyY2U9e307YmFzZUZvck93bihsb2Rhc2gsZnVuY3Rpb24oZnVuYyxtZXRob2ROYW1lKXtpZighaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gucHJvdG90eXBlLG1ldGhvZE5hbWUpKXNvdXJjZVttZXRob2ROYW1lXT1mdW5jfSk7cmV0dXJuIHNvdXJjZX0oKSx7ImNoYWluIjpmYWxzZX0pO2xvZGFzaC5WRVJTSU9OPQpWRVJTSU9OO2FycmF5RWFjaChbImJpbmQiLCJiaW5kS2V5IiwiY3VycnkiLCJjdXJyeVJpZ2h0IiwicGFydGlhbCIsInBhcnRpYWxSaWdodCJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUpe2xvZGFzaFttZXRob2ROYW1lXS5wbGFjZWhvbGRlcj1sb2Rhc2h9KTthcnJheUVhY2goWyJkcm9wIiwidGFrZSJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUsaW5kZXgpe0xhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbihuKXtuPW49PT11bmRlZmluZWQ/MTpuYXRpdmVNYXgodG9JbnRlZ2VyKG4pLDApO3ZhciByZXN1bHQ9dGhpcy5fX2ZpbHRlcmVkX18mJiFpbmRleD9uZXcgTGF6eVdyYXBwZXIodGhpcyk6dGhpcy5jbG9uZSgpO2lmKHJlc3VsdC5fX2ZpbHRlcmVkX18pcmVzdWx0Ll9fdGFrZUNvdW50X189bmF0aXZlTWluKG4scmVzdWx0Ll9fdGFrZUNvdW50X18pO2Vsc2UgcmVzdWx0Ll9fdmlld3NfXy5wdXNoKHsic2l6ZSI6bmF0aXZlTWluKG4sTUFYX0FSUkFZX0xFTkdUSCksCiJ0eXBlIjptZXRob2ROYW1lKyhyZXN1bHQuX19kaXJfXzwwPyJSaWdodCI6IiIpfSk7cmV0dXJuIHJlc3VsdH07TGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWUrIlJpZ2h0Il09ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMucmV2ZXJzZSgpW21ldGhvZE5hbWVdKG4pLnJldmVyc2UoKX19KTthcnJheUVhY2goWyJmaWx0ZXIiLCJtYXAiLCJ0YWtlV2hpbGUiXSxmdW5jdGlvbihtZXRob2ROYW1lLGluZGV4KXt2YXIgdHlwZT1pbmRleCsxLGlzRmlsdGVyPXR5cGU9PUxBWllfRklMVEVSX0ZMQUd8fHR5cGU9PUxBWllfV0hJTEVfRkxBRztMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oaXRlcmF0ZWUpe3ZhciByZXN1bHQ9dGhpcy5jbG9uZSgpO3Jlc3VsdC5fX2l0ZXJhdGVlc19fLnB1c2goeyJpdGVyYXRlZSI6Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyksInR5cGUiOnR5cGV9KTtyZXN1bHQuX19maWx0ZXJlZF9fPXJlc3VsdC5fX2ZpbHRlcmVkX198fAppc0ZpbHRlcjtyZXR1cm4gcmVzdWx0fX0pO2FycmF5RWFjaChbImhlYWQiLCJsYXN0Il0sZnVuY3Rpb24obWV0aG9kTmFtZSxpbmRleCl7dmFyIHRha2VOYW1lPSJ0YWtlIisoaW5kZXg/IlJpZ2h0IjoiIik7TGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdGFrZU5hbWVdKDEpLnZhbHVlKClbMF19fSk7YXJyYXlFYWNoKFsiaW5pdGlhbCIsInRhaWwiXSxmdW5jdGlvbihtZXRob2ROYW1lLGluZGV4KXt2YXIgZHJvcE5hbWU9ImRyb3AiKyhpbmRleD8iIjoiUmlnaHQiKTtMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2ZpbHRlcmVkX18/bmV3IExhenlXcmFwcGVyKHRoaXMpOnRoaXNbZHJvcE5hbWVdKDEpfX0pO0xhenlXcmFwcGVyLnByb3RvdHlwZS5jb21wYWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsdGVyKGlkZW50aXR5KX07TGF6eVdyYXBwZXIucHJvdG90eXBlLmZpbmQ9CmZ1bmN0aW9uKHByZWRpY2F0ZSl7cmV0dXJuIHRoaXMuZmlsdGVyKHByZWRpY2F0ZSkuaGVhZCgpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZExhc3Q9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkuZmluZChwcmVkaWNhdGUpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUuaW52b2tlTWFwPWJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsYXJncyl7aWYodHlwZW9mIHBhdGg9PSJmdW5jdGlvbiIpcmV0dXJuIG5ldyBMYXp5V3JhcHBlcih0aGlzKTtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUpe3JldHVybiBiYXNlSW52b2tlKHZhbHVlLHBhdGgsYXJncyl9KX0pO0xhenlXcmFwcGVyLnByb3RvdHlwZS5yZWplY3Q9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5maWx0ZXIobmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSkpKX07TGF6eVdyYXBwZXIucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHN0YXJ0LGVuZCl7c3RhcnQ9dG9JbnRlZ2VyKHN0YXJ0KTsKdmFyIHJlc3VsdD10aGlzO2lmKHJlc3VsdC5fX2ZpbHRlcmVkX18mJihzdGFydD4wfHxlbmQ8MCkpcmV0dXJuIG5ldyBMYXp5V3JhcHBlcihyZXN1bHQpO2lmKHN0YXJ0PDApcmVzdWx0PXJlc3VsdC50YWtlUmlnaHQoLXN0YXJ0KTtlbHNlIGlmKHN0YXJ0KXJlc3VsdD1yZXN1bHQuZHJvcChzdGFydCk7aWYoZW5kIT09dW5kZWZpbmVkKXtlbmQ9dG9JbnRlZ2VyKGVuZCk7cmVzdWx0PWVuZDwwP3Jlc3VsdC5kcm9wUmlnaHQoLWVuZCk6cmVzdWx0LnRha2UoZW5kLXN0YXJ0KX1yZXR1cm4gcmVzdWx0fTtMYXp5V3JhcHBlci5wcm90b3R5cGUudGFrZVJpZ2h0V2hpbGU9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkudGFrZVdoaWxlKHByZWRpY2F0ZSkucmV2ZXJzZSgpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRha2UoTUFYX0FSUkFZX0xFTkdUSCl9O2Jhc2VGb3JPd24oTGF6eVdyYXBwZXIucHJvdG90eXBlLApmdW5jdGlvbihmdW5jLG1ldGhvZE5hbWUpe3ZhciBjaGVja0l0ZXJhdGVlPS9eKD86ZmlsdGVyfGZpbmR8bWFwfHJlamVjdCl8V2hpbGUkLy50ZXN0KG1ldGhvZE5hbWUpLGlzVGFrZXI9L14oPzpoZWFkfGxhc3QpJC8udGVzdChtZXRob2ROYW1lKSxsb2Rhc2hGdW5jPWxvZGFzaFtpc1Rha2VyPyJ0YWtlIisobWV0aG9kTmFtZT09Imxhc3QiPyJSaWdodCI6IiIpOm1ldGhvZE5hbWVdLHJldFVud3JhcHBlZD1pc1Rha2VyfHwvXmZpbmQvLnRlc3QobWV0aG9kTmFtZSk7aWYoIWxvZGFzaEZ1bmMpcmV0dXJuO2xvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXt2YXIgdmFsdWU9dGhpcy5fX3dyYXBwZWRfXyxhcmdzPWlzVGFrZXI/WzFdOmFyZ3VtZW50cyxpc0xhenk9dmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcixpdGVyYXRlZT1hcmdzWzBdLHVzZUxhenk9aXNMYXp5fHxpc0FycmF5KHZhbHVlKTt2YXIgaW50ZXJjZXB0b3I9ZnVuY3Rpb24odmFsdWUpe3ZhciByZXN1bHQ9CmxvZGFzaEZ1bmMuYXBwbHkobG9kYXNoLGFycmF5UHVzaChbdmFsdWVdLGFyZ3MpKTtyZXR1cm4gaXNUYWtlciYmY2hhaW5BbGw/cmVzdWx0WzBdOnJlc3VsdH07aWYodXNlTGF6eSYmY2hlY2tJdGVyYXRlZSYmdHlwZW9mIGl0ZXJhdGVlPT0iZnVuY3Rpb24iJiZpdGVyYXRlZS5sZW5ndGghPTEpaXNMYXp5PXVzZUxhenk9ZmFsc2U7dmFyIGNoYWluQWxsPXRoaXMuX19jaGFpbl9fLGlzSHlicmlkPSEhdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgsaXNVbndyYXBwZWQ9cmV0VW53cmFwcGVkJiYhY2hhaW5BbGwsb25seUxhenk9aXNMYXp5JiYhaXNIeWJyaWQ7aWYoIXJldFVud3JhcHBlZCYmdXNlTGF6eSl7dmFsdWU9b25seUxhenk/dmFsdWU6bmV3IExhenlXcmFwcGVyKHRoaXMpO3ZhciByZXN1bHQ9ZnVuYy5hcHBseSh2YWx1ZSxhcmdzKTtyZXN1bHQuX19hY3Rpb25zX18ucHVzaCh7ImZ1bmMiOnRocnUsImFyZ3MiOltpbnRlcmNlcHRvcl0sInRoaXNBcmciOnVuZGVmaW5lZH0pO3JldHVybiBuZXcgTG9kYXNoV3JhcHBlcihyZXN1bHQsCmNoYWluQWxsKX1pZihpc1Vud3JhcHBlZCYmb25seUxhenkpcmV0dXJuIGZ1bmMuYXBwbHkodGhpcyxhcmdzKTtyZXN1bHQ9dGhpcy50aHJ1KGludGVyY2VwdG9yKTtyZXR1cm4gaXNVbndyYXBwZWQ/aXNUYWtlcj9yZXN1bHQudmFsdWUoKVswXTpyZXN1bHQudmFsdWUoKTpyZXN1bHR9fSk7YXJyYXlFYWNoKFsicG9wIiwicHVzaCIsInNoaWZ0Iiwic29ydCIsInNwbGljZSIsInVuc2hpZnQiXSxmdW5jdGlvbihtZXRob2ROYW1lKXt2YXIgZnVuYz1hcnJheVByb3RvW21ldGhvZE5hbWVdLGNoYWluTmFtZT0vXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSk/InRhcCI6InRocnUiLHJldFVud3JhcHBlZD0vXig/OnBvcHxzaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpO2xvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHM7aWYocmV0VW53cmFwcGVkJiYhdGhpcy5fX2NoYWluX18pe3ZhciB2YWx1ZT10aGlzLnZhbHVlKCk7CnJldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpP3ZhbHVlOltdLGFyZ3MpfXJldHVybiB0aGlzW2NoYWluTmFtZV0oZnVuY3Rpb24odmFsdWUpe3JldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpP3ZhbHVlOltdLGFyZ3MpfSl9fSk7YmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsZnVuY3Rpb24oZnVuYyxtZXRob2ROYW1lKXt2YXIgbG9kYXNoRnVuYz1sb2Rhc2hbbWV0aG9kTmFtZV07aWYobG9kYXNoRnVuYyl7dmFyIGtleT1sb2Rhc2hGdW5jLm5hbWUrIiIsbmFtZXM9cmVhbE5hbWVzW2tleV18fChyZWFsTmFtZXNba2V5XT1bXSk7bmFtZXMucHVzaCh7Im5hbWUiOm1ldGhvZE5hbWUsImZ1bmMiOmxvZGFzaEZ1bmN9KX19KTtyZWFsTmFtZXNbY3JlYXRlSHlicmlkKHVuZGVmaW5lZCxXUkFQX0JJTkRfS0VZX0ZMQUcpLm5hbWVdPVt7Im5hbWUiOiJ3cmFwcGVyIiwiZnVuYyI6dW5kZWZpbmVkfV07TGF6eVdyYXBwZXIucHJvdG90eXBlLmNsb25lPWxhenlDbG9uZTsKTGF6eVdyYXBwZXIucHJvdG90eXBlLnJldmVyc2U9bGF6eVJldmVyc2U7TGF6eVdyYXBwZXIucHJvdG90eXBlLnZhbHVlPWxhenlWYWx1ZTtsb2Rhc2gucHJvdG90eXBlLmF0PXdyYXBwZXJBdDtsb2Rhc2gucHJvdG90eXBlLmNoYWluPXdyYXBwZXJDaGFpbjtsb2Rhc2gucHJvdG90eXBlLmNvbW1pdD13cmFwcGVyQ29tbWl0O2xvZGFzaC5wcm90b3R5cGUubmV4dD13cmFwcGVyTmV4dDtsb2Rhc2gucHJvdG90eXBlLnBsYW50PXdyYXBwZXJQbGFudDtsb2Rhc2gucHJvdG90eXBlLnJldmVyc2U9d3JhcHBlclJldmVyc2U7bG9kYXNoLnByb3RvdHlwZS50b0pTT049bG9kYXNoLnByb3RvdHlwZS52YWx1ZU9mPWxvZGFzaC5wcm90b3R5cGUudmFsdWU9d3JhcHBlclZhbHVlO2xvZGFzaC5wcm90b3R5cGUuZmlyc3Q9bG9kYXNoLnByb3RvdHlwZS5oZWFkO2lmKHN5bUl0ZXJhdG9yKWxvZGFzaC5wcm90b3R5cGVbc3ltSXRlcmF0b3JdPXdyYXBwZXJUb0l0ZXJhdG9yO3JldHVybiBsb2Rhc2h9Owp2YXIgXz1ydW5JbkNvbnRleHQoKTtpZih0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZ0eXBlb2YgZGVmaW5lLmFtZD09Im9iamVjdCImJmRlZmluZS5hbWQpe3Jvb3QuXz1fO2RlZmluZShmdW5jdGlvbigpe3JldHVybiBffSl9ZWxzZSBpZihmcmVlTW9kdWxlKXsoZnJlZU1vZHVsZS5leHBvcnRzPV8pLl89XztmcmVlRXhwb3J0cy5fPV99ZWxzZSByb290Ll89X30pLmNhbGwodGhpcyk7Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1zb3J0aW5nL3NvcnRpbmcuanMKdmFyIGduOwooZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhnLGwpe2xldCBrOyhmdW5jdGlvbihwKXtwW3AuTkFUVVJBTD0wXT0iTkFUVVJBTCI7cFtwLlJFQUw9MV09IlJFQUwiO3BbcC5FWFBPTkVOVF9TSUdOPTJdPSJFWFBPTkVOVF9TSUdOIjtwW3AuRVhQT05FTlQ9M109IkVYUE9ORU5UIn0pKGt8fChrPXt9KSk7bGV0IG49ay5OQVRVUkFMO2Zvcig7bDxnLmxlbmd0aDtsKyspaWYobj09PWsuTkFUVVJBTClpZigiLiI9PT1nW2xdKW49ay5SRUFMO2Vsc2UgaWYoImUiPT09Z1tsXXx8IkUiPT09Z1tsXSluPWsuRVhQT05FTlRfU0lHTjtlbHNle2lmKCFkKGdbbF0pKWJyZWFrfWVsc2UgaWYobj09PWsuUkVBTClpZigiZSI9PT1nW2xdfHwiRSI9PT1nW2xdKW49ay5FWFBPTkVOVF9TSUdOO2Vsc2V7aWYoIWQoZ1tsXSkpYnJlYWt9ZWxzZSBpZihuPT09ay5FWFBPTkVOVF9TSUdOKWlmKGQoZ1tsXSl8fCIrIj09PWdbbF18fCItIj09PWdbbF0pbj1rLkVYUE9ORU5UO2Vsc2UgYnJlYWs7ZWxzZSBpZihuPT09ay5FWFBPTkVOVCYmCiFkKGdbbF0pKWJyZWFrO3JldHVybiBsfWZ1bmN0aW9uIGQoZyl7cmV0dXJuIjAiPD1nJiYiOSI+PWd9ZnVuY3Rpb24gZihnKXtyZXR1cm4iLyI9PT1nfHwiXyI9PT1nfHxkKGcpfWEuY29tcGFyZVRhZ05hbWVzPWZ1bmN0aW9uKGcsbCl7bGV0IGs9MCxuPTA7Zm9yKDs7KXtpZihrPT09Zy5sZW5ndGgpcmV0dXJuIG49PT1sLmxlbmd0aD8wOi0xO2lmKG49PT1sLmxlbmd0aClyZXR1cm4gMTtpZihkKGdba10pJiZkKGxbbl0pKXt2YXIgcD1rLHE9bjtrPWMoZyxrKzEpO249YyhsLG4rMSk7cD1wYXJzZUZsb2F0KGcuc2xpY2UocCxrKSk7cT1wYXJzZUZsb2F0KGwuc2xpY2UocSxuKSk7aWYocDxxKXJldHVybi0xO2lmKHA+cSlyZXR1cm4gMX1lbHNle2lmKGYoZ1trXSkpe2lmKCFmKGxbbl0pKXJldHVybi0xfWVsc2V7aWYoZihsW25dKSlyZXR1cm4gMTtpZihnW2tdPGxbbl0pcmV0dXJuLTE7aWYoZ1trXT5sW25dKXJldHVybiAxfWsrKztuKyt9fX19KShnbnx8KGduPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9yZXF1ZXN0TWFuYWdlci5qcwp2YXIgUW87CihmdW5jdGlvbihhKXtmdW5jdGlvbiBjKHIsdCx2LHkpe2NvbnN0IHo9bmV3IFhNTEh0dHBSZXF1ZXN0O3oub3BlbihyLHQpO3YmJih6LndpdGhDcmVkZW50aWFscz12KTt5JiZ6LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIseSk7cmV0dXJuIHp9ZnVuY3Rpb24gZChyKXtjb25zdCB0PW5ldyBwO2lmKCFyKXJldHVybiB0Lm1ldGhvZFR5cGU9bi5HRVQsdDt0Lm1ldGhvZFR5cGU9bi5QT1NUO3QuYm9keT1mKHIpO3JldHVybiB0fWZ1bmN0aW9uIGYocil7Y29uc3QgdD1uZXcgRm9ybURhdGE7Zm9yKGxldCB2IGluIHIpdiYmdC5hcHBlbmQodixyW3ZdKTtyZXR1cm4gdH1jbGFzcyBnIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3RoaXMubmFtZT0iUmVxdWVzdENhbmNlbGxhdGlvbkVycm9yIn19YS5SZXF1ZXN0Q2FuY2VsbGF0aW9uRXJyb3I9ZztjbGFzcyBsIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3Iocil7c3VwZXIocik7dGhpcy5uYW1lPQoiSW52YWxpZFJlcXVlc3RPcHRpb25zRXJyb3IiO09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLGwucHJvdG90eXBlKX19YS5JbnZhbGlkUmVxdWVzdE9wdGlvbnNFcnJvcj1sO2NsYXNzIGsgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihyLHQpe3N1cGVyKCk7dGhpcy5tZXNzYWdlPWBSZXF1ZXN0TmV0d29ya0Vycm9yOiAke3Iuc3RhdHVzfSBhdCAke3R9YDt0aGlzLm5hbWU9IlJlcXVlc3ROZXR3b3JrRXJyb3IiO3RoaXMucmVxPXI7dGhpcy51cmw9dH19YS5SZXF1ZXN0TmV0d29ya0Vycm9yPWs7bGV0IG47KGZ1bmN0aW9uKHIpe3IuR0VUPSJHRVQiO3IuUE9TVD0iUE9TVCJ9KShuPWEuSHR0cE1ldGhvZFR5cGV8fChhLkh0dHBNZXRob2RUeXBlPXt9KSk7Y2xhc3MgcHt2YWxpZGF0ZSgpe2lmKHRoaXMubWV0aG9kVHlwZT09PW4uR0VUJiZ0aGlzLmJvZHkpdGhyb3cgbmV3IGwoImJvZHkgbXVzdCBiZSBtaXNzaW5nIGZvciBhIEdFVCByZXF1ZXN0LiIpO319YS5SZXF1ZXN0T3B0aW9ucz0KcDtjbGFzcyBxe2NvbnN0cnVjdG9yKHI9MUUzLHQ9Myl7dGhpcy5fcXVldWU9W107dGhpcy5fbkFjdGl2ZVJlcXVlc3RzPTA7dGhpcy5fblNpbXVsdGFuZW91c1JlcXVlc3RzPXI7dGhpcy5fbWF4UmV0cmllcz10fXJlcXVlc3Qocix0KXt0PWQodCk7cmV0dXJuIHRoaXMucmVxdWVzdFdpdGhPcHRpb25zKHIsdCl9cmVxdWVzdFdpdGhPcHRpb25zKHIsdCl7dC52YWxpZGF0ZSgpO3JldHVybihuZXcgUHJvbWlzZSgodix5KT0+e3RoaXMuX3F1ZXVlLnB1c2goe3Jlc29sdmU6dixyZWplY3Q6eX0pO3RoaXMubGF1bmNoUmVxdWVzdHMoKX0pKS50aGVuKCgpPT50aGlzLnByb21pc2VXaXRoUmV0cmllcyhyLHRoaXMuX21heFJldHJpZXMsdCkpLnRoZW4odj0+e3RoaXMuX25BY3RpdmVSZXF1ZXN0cy0tO3RoaXMubGF1bmNoUmVxdWVzdHMoKTtyZXR1cm4gdn0sdj0+eyJSZXF1ZXN0TmV0d29ya0Vycm9yIj09PXYubmFtZSYmKHRoaXMuX25BY3RpdmVSZXF1ZXN0cy0tLHRoaXMubGF1bmNoUmVxdWVzdHMoKSk7CnJldHVybiBQcm9taXNlLnJlamVjdCh2KX0pfWZldGNoKHIsdCl7cmV0dXJuKG5ldyBQcm9taXNlKCh2LHkpPT57dGhpcy5fcXVldWUucHVzaCh7cmVzb2x2ZTp2LHJlamVjdDp5fSk7dGhpcy5sYXVuY2hSZXF1ZXN0cygpfSkpLnRoZW4oKCk9PntsZXQgdj0xO3JldHVybiBuZXcgUHJvbWlzZSh5PT57Y29uc3Qgej0oKT0+e2ZldGNoKHIsdCkudGhlbih4PT57IXgub2smJnRoaXMuX21heFJldHJpZXM+dj8odisrLHooKSk6KHkoeCksdGhpcy5fbkFjdGl2ZVJlcXVlc3RzLS0sdGhpcy5sYXVuY2hSZXF1ZXN0cygpKX0pfTt6KCl9KX0pfWNsZWFyUXVldWUoKXtmb3IoOzA8dGhpcy5fcXVldWUubGVuZ3RoOyl0aGlzLl9xdWV1ZS5wb3AoKS5yZWplY3QobmV3IGcoIlJlcXVlc3QgY2FuY2VsbGVkIGJ5IGNsZWFyUXVldWUiKSl9YWN0aXZlUmVxdWVzdHMoKXtyZXR1cm4gdGhpcy5fbkFjdGl2ZVJlcXVlc3RzfW91dHN0YW5kaW5nUmVxdWVzdHMoKXtyZXR1cm4gdGhpcy5fbkFjdGl2ZVJlcXVlc3RzKwp0aGlzLl9xdWV1ZS5sZW5ndGh9bGF1bmNoUmVxdWVzdHMoKXtmb3IoO3RoaXMuX25BY3RpdmVSZXF1ZXN0czx0aGlzLl9uU2ltdWx0YW5lb3VzUmVxdWVzdHMmJjA8dGhpcy5fcXVldWUubGVuZ3RoOyl0aGlzLl9uQWN0aXZlUmVxdWVzdHMrKyx0aGlzLl9xdWV1ZS5wb3AoKS5yZXNvbHZlKCl9cHJvbWlzZVdpdGhSZXRyaWVzKHIsdCx2KXtyZXR1cm4gdGhpcy5fcHJvbWlzZUZyb21Vcmwocix2KS50aGVuKHk9PnkseT0+MDx0P3RoaXMucHJvbWlzZVdpdGhSZXRyaWVzKHIsdC0xLHYpOlByb21pc2UucmVqZWN0KHkpKX1fcHJvbWlzZUZyb21Vcmwocix0KXtyZXR1cm4gbmV3IFByb21pc2UoKHYseSk9Pntjb25zdCB6PWModC5tZXRob2RUeXBlLHIsdC53aXRoQ3JlZGVudGlhbHMsdC5jb250ZW50VHlwZSk7ei5vbmxvYWQ9ZnVuY3Rpb24oKXsyMDA9PT16LnN0YXR1cz92KEpTT04ucGFyc2Uoei5yZXNwb25zZVRleHQpKTp5KG5ldyBrKHoscikpfTt6Lm9uZXJyb3I9ZnVuY3Rpb24oKXt5KG5ldyBrKHosCnIpKX07dC5ib2R5P3ouc2VuZCh0LmJvZHkpOnouc2VuZCgpfSl9fWEuUmVxdWVzdE1hbmFnZXI9cX0pKFFvfHwoUW89e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL3VybFBhdGhIZWxwZXJzLmpzCihmdW5jdGlvbihhKXtmdW5jdGlvbiBjKGQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoZCkucmVwbGFjZSgvXCgvZywiJTI4IikucmVwbGFjZSgvXCkvZywiJTI5Iil9YS5hZGRQYXJhbXM9ZnVuY3Rpb24oZCxmKXt2YXIgZz1PYmplY3Qua2V5cyhmKS5zb3J0KCkuZmlsdGVyKGs9PnZvaWQgMCE9PWZba10pO2lmKCFnLmxlbmd0aClyZXR1cm4gZDtjb25zdCBsPS0xIT09ZC5pbmRleE9mKCI/Iik/Ilx4MjYiOiI/IjtnPVtdLmNvbmNhdCguLi5nLm1hcChrPT57Y29uc3Qgbj1mW2tdO3JldHVybihBcnJheS5pc0FycmF5KG4pP246W25dKS5tYXAocD0+YCR7a309JHtjKHApfWApfSkpLmpvaW4oIlx4MjYiKTtyZXR1cm4gZCtsK2d9fSkoUW98fChRbz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJhY2tlbmQvcm91dGVyLmpzCihmdW5jdGlvbihhKXtmdW5jdGlvbiBjKGw9ImRhdGEiKXsiLyI9PT1sW2wubGVuZ3RoLTFdJiYobD1sLnNsaWNlKDAsbC5sZW5ndGgtMSkpO3JldHVybntlbnZpcm9ubWVudDooKT0+ZChsLCIvZW52aXJvbm1lbnQiKSxleHBlcmltZW50czooKT0+ZChsLCIvZXhwZXJpbWVudHMiKSxwbHVnaW5Sb3V0ZTooayxuLHApPT5kKGwrIi9wbHVnaW4iLGAvJHtrfSR7bn1gLHApLHBsdWdpbnNMaXN0aW5nOigpPT5kKGwsIi9wbHVnaW5zX2xpc3RpbmciKSxydW5zOigpPT5kKGwsIi9ydW5zIikscnVuc0ZvckV4cGVyaW1lbnQ6az0+ZChsLCIvZXhwZXJpbWVudF9ydW5zIixmKHtleHBlcmltZW50OlN0cmluZyhrKX0pKX19ZnVuY3Rpb24gZChsLGssbj1uZXcgVVJMU2VhcmNoUGFyYW1zKXtsKz1rO1N0cmluZyhuKSYmKGs9ay5pbmNsdWRlcygiPyIpPyJceDI2IjoiPyIsbCs9aytTdHJpbmcobikpO3JldHVybiBsfWZ1bmN0aW9uIGYobD17fSl7Y29uc3Qgaz1PYmplY3Qua2V5cyhsKS5zb3J0KCkuZmlsdGVyKHA9PgpsW3BdKSxuPW5ldyBVUkxTZWFyY2hQYXJhbXM7ay5mb3JFYWNoKHA9Pntjb25zdCBxPWxbcF07KEFycmF5LmlzQXJyYXkocSk/cTpbcV0pLmZvckVhY2gocj0+bi5hcHBlbmQocCxyKSl9KTtyZXR1cm4gbn1sZXQgZz1jKCk7YS5jcmVhdGVSb3V0ZXI9YzthLmdldFJvdXRlcj1mdW5jdGlvbigpe3JldHVybiBnfTthLnNldFJvdXRlcj1mdW5jdGlvbihsKXtpZihudWxsPT1sKXRocm93IEVycm9yKCJSb3V0ZXIgcmVxdWlyZWQsIGJ1dCBnb3Q6ICIrbCk7Zz1sfTthLmNyZWF0ZVNlYXJjaFBhcmFtPWZ9KShRb3x8KFFvPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9iYXNlU3RvcmUuanMKKGZ1bmN0aW9uKGEpe2NsYXNzIGN7Y29uc3RydWN0b3IoZil7dGhpcy5saXN0ZW5lcj1mfX1hLkxpc3RlbktleT1jO2NsYXNzIGR7Y29uc3RydWN0b3IoKXt0aGlzLnJlcXVlc3RNYW5hZ2VyPW5ldyBhLlJlcXVlc3RNYW5hZ2VyKDEpO3RoaXMuX2xpc3RlbmVycz1uZXcgU2V0O3RoaXMuaW5pdGlhbGl6ZWQ9ITF9cmVmcmVzaCgpe3JldHVybiB0aGlzLmxvYWQoKS50aGVuKCgpPT57dGhpcy5pbml0aWFsaXplZD0hMH0pfWFkZExpc3RlbmVyKGYpe2Y9bmV3IGMoZik7dGhpcy5fbGlzdGVuZXJzLmFkZChmKTtyZXR1cm4gZn1yZW1vdmVMaXN0ZW5lckJ5S2V5KGYpe3RoaXMuX2xpc3RlbmVycy5kZWxldGUoZil9ZW1pdENoYW5nZSgpe3RoaXMuX2xpc3RlbmVycy5mb3JFYWNoKGY9Pnt0cnl7Zi5saXN0ZW5lcigpfWNhdGNoKGcpe319KX19YS5CYXNlU3RvcmU9ZH0pKFFvfHwoUW89e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL2Vudmlyb25tZW50U3RvcmUuanMKKGZ1bmN0aW9uKGEpe2NsYXNzIGMgZXh0ZW5kcyBhLkJhc2VTdG9yZXtsb2FkKCl7Y29uc3QgZD1hLmdldFJvdXRlcigpLmVudmlyb25tZW50KCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChkKS50aGVuKGY9PntmPXtkYXRhTG9jYXRpb246Zi5kYXRhX2xvY2F0aW9uLHdpbmRvd1RpdGxlOmYud2luZG93X3RpdGxlfTtfLmlzRXF1YWwodGhpcy5lbnZpcm9ubWVudCxmKXx8KHRoaXMuZW52aXJvbm1lbnQ9Zix0aGlzLmVtaXRDaGFuZ2UoKSl9KX1nZXREYXRhTG9jYXRpb24oKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LmRhdGFMb2NhdGlvbjoiIn1nZXRXaW5kb3dUaXRsZSgpe3JldHVybiB0aGlzLmVudmlyb25tZW50P3RoaXMuZW52aXJvbm1lbnQud2luZG93VGl0bGU6IiJ9fWEuRW52aXJvbm1lbnRTdG9yZT1jO2EuZW52aXJvbm1lbnRTdG9yZT1uZXcgY30pKFFvfHwoUW89e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL2V4cGVyaW1lbnRzU3RvcmUuanMKKGZ1bmN0aW9uKGEpe2NsYXNzIGMgZXh0ZW5kcyBhLkJhc2VTdG9yZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7dGhpcy5fZXhwZXJpbWVudHM9W119bG9hZCgpe2NvbnN0IGQ9YS5nZXRSb3V0ZXIoKS5leHBlcmltZW50cygpO3JldHVybiB0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZCkudGhlbihmPT57Xy5pc0VxdWFsKHRoaXMuX2V4cGVyaW1lbnRzLGYpfHwodGhpcy5fZXhwZXJpbWVudHM9Zix0aGlzLmVtaXRDaGFuZ2UoKSl9KX1nZXRFeHBlcmltZW50cygpe3JldHVybiB0aGlzLl9leHBlcmltZW50cy5zbGljZSgpfX1hLkV4cGVyaW1lbnRzU3RvcmU9YzthLmV4cGVyaW1lbnRzU3RvcmU9bmV3IGN9KShRb3x8KFFvPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9ydW5zU3RvcmUuanMKKGZ1bmN0aW9uKGEpe2NsYXNzIGMgZXh0ZW5kcyBhLkJhc2VTdG9yZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7dGhpcy5fcnVucz1bXX1sb2FkKCl7Y29uc3QgZD1hLmdldFJvdXRlcigpLnJ1bnMoKTtyZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGQpLnRoZW4oZj0+e18uaXNFcXVhbCh0aGlzLl9ydW5zLGYpfHwodGhpcy5fcnVucz1mLHRoaXMuZW1pdENoYW5nZSgpKX0pfWdldFJ1bnMoKXtyZXR1cm4gdGhpcy5fcnVucy5zbGljZSgpfX1hLlJ1bnNTdG9yZT1jO2EucnVuc1N0b3JlPW5ldyBjfSkoUW98fChRbz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJhY2tlbmQvYmFja2VuZC5qcwooZnVuY3Rpb24oYSl7YS5UWVBFUz1bXTthLmdldFJ1bnNOYW1lZD1mdW5jdGlvbihjKXtyZXR1cm4gXy5rZXlzKGMpLnNvcnQoZ24uY29tcGFyZVRhZ05hbWVzKX07YS5nZXRUYWdzPWZ1bmN0aW9uKGMpe3JldHVybiBfLnVuaW9uLmFwcGx5KG51bGwsXy52YWx1ZXMoYykpLnNvcnQoZ24uY29tcGFyZVRhZ05hbWVzKX07YS5maWx0ZXJUYWdzPWZ1bmN0aW9uKGMsZCl7bGV0IGY9W107ZC5mb3JFYWNoKGc9PmY9Zi5jb25jYXQoY1tnXSkpO3JldHVybiBfLnVuaXEoZikuc29ydChnbi5jb21wYXJlVGFnTmFtZXMpfX0pKFFvfHwoUW89e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL2NhbmNlbGxlci5qcwooZnVuY3Rpb24oYSl7Y2xhc3MgY3tjb25zdHJ1Y3Rvcigpe3RoaXMuY2FuY2VsbGF0aW9uQ291bnQ9MH1jYW5jZWxsYWJsZShkKXtjb25zdCBmPXRoaXMuY2FuY2VsbGF0aW9uQ291bnQ7cmV0dXJuIGc9PmQoe3ZhbHVlOmcsY2FuY2VsbGVkOnRoaXMuY2FuY2VsbGF0aW9uQ291bnQhPT1mfSl9Y2FuY2VsQWxsKCl7dGhpcy5jYW5jZWxsYXRpb25Db3VudCsrfX1hLkNhbmNlbGxlcj1jfSkoUW98fChRbz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJhY2tlbmQvdGYtYmFja2VuZC1wb2x5bWVyLmpzCihmdW5jdGlvbihhKXtQb2x5bWVyKHtpczoidGYtYmFja2VuZCIsX3RlbXBsYXRlOm51bGwsdGZfYmFja2VuZDphfSl9KShRb3x8KFFvPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY2F0ZWdvcml6YXRpb24tdXRpbHMvY2F0ZWdvcml6YXRpb25VdGlscy5qcwp2YXIgUm87CihmdW5jdGlvbihhKXtmdW5jdGlvbiBjKHAscSl7Y29uc3Qgcj0oKCk9Pnt0cnl7cmV0dXJuIG5ldyBSZWdFeHAocSl9Y2F0Y2godCl7cmV0dXJuIG51bGx9fSkoKTtyZXR1cm57bmFtZTpxLG1ldGFkYXRhOnt0eXBlOm4uU0VBUkNIX1JFU1VMVFMsdmFsaWRSZWdleDohIXIsdW5pdmVyc2FsUmVnZXg6Ii4qIj09PXF9LGl0ZW1zOnI/cC5maWx0ZXIodD0+dC5tYXRjaChyKSk6W119fWZ1bmN0aW9uIGQocCxxPSIvIil7Y29uc3Qgcj1bXSx0PXt9O3AuZm9yRWFjaCh2PT57dmFyIHk9di5pbmRleE9mKHEpO3k9MDw9eT92LnNsaWNlKDAseSk6djtpZighdFt5XSl7Y29uc3Qgej17bmFtZTp5LG1ldGFkYXRhOnt0eXBlOm4uUFJFRklYX0dST1VQfSxpdGVtczpbXX07dFt5XT16O3IucHVzaCh6KX10W3ldLml0ZW1zLnB1c2godil9KTtyZXR1cm4gcn1mdW5jdGlvbiBmKHAscT0iIil7cT1bYyhwLHEpXTtwPWQocCk7cmV0dXJuW10uY29uY2F0KHEscCl9ZnVuY3Rpb24gZyhwLHEscil7Y29uc3QgdD0KUW8uZ2V0VGFncyhwKTtyPWYodCxyKTtjb25zdCB2PWwoXy5waWNrKHAscSkpO3JldHVybiByLm1hcCgoe25hbWU6eSxtZXRhZGF0YTp6LGl0ZW1zOnh9KT0+KHtuYW1lOnksbWV0YWRhdGE6eixpdGVtczp4Lm1hcChDPT4oe3RhZzpDLHJ1bnM6KHYuZ2V0KEMpfHxbXSkuc2xpY2UoKX0pKX0pKX1mdW5jdGlvbiBsKHApe2NvbnN0IHE9bmV3IE1hcDtPYmplY3Qua2V5cyhwKS5mb3JFYWNoKHI9PntwW3JdLmZvckVhY2godD0+e2NvbnN0IHY9cS5nZXQodCl8fFtdO3YucHVzaChyKTtxLnNldCh0LHYpfSl9KTtyZXR1cm4gcX1mdW5jdGlvbiBrKHAscSl7Y29uc3Qgcj1nbi5jb21wYXJlVGFnTmFtZXMocC50YWcscS50YWcpO3JldHVybiAwIT1yP3I6Z24uY29tcGFyZVRhZ05hbWVzKHAucnVuLHEucnVuKX1sZXQgbjsoZnVuY3Rpb24ocCl7cFtwLlNFQVJDSF9SRVNVTFRTPTBdPSJTRUFSQ0hfUkVTVUxUUyI7cFtwLlBSRUZJWF9HUk9VUD0xXT0iUFJFRklYX0dST1VQIn0pKG49YS5DYXRlZ29yeVR5cGV8fAooYS5DYXRlZ29yeVR5cGU9e30pKTthLmNhdGVnb3JpemVCeVNlYXJjaFF1ZXJ5PWM7YS5jYXRlZ29yaXplQnlQcmVmaXg9ZDthLmNhdGVnb3JpemU9ZjthLmNhdGVnb3JpemVUYWdzPWc7YS5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zPWZ1bmN0aW9uKHAscSxyKXtyZXR1cm4gZyhwLHEscikubWFwKGZ1bmN0aW9uKHQpe2NvbnN0IHY9Xy5mbGF0dGVuKHQuaXRlbXMubWFwKCh7dGFnOnkscnVuczp6fSk9PnoubWFwKHg9Pih7dGFnOnkscnVuOnh9KSkpKTt2LnNvcnQoayk7cmV0dXJue25hbWU6dC5uYW1lLG1ldGFkYXRhOnQubWV0YWRhdGEsaXRlbXM6dn19KX19KShSb3x8KFJvPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ2xvYmFscy9nbG9iYWxzLmpzCnZhciBTbzsoZnVuY3Rpb24oYSl7bGV0IGM9ITE7YS5zZXRVc2VIYXNoPWZ1bmN0aW9uKGYpe2M9Zn07YS51c2VIYXNoPWZ1bmN0aW9uKCl7cmV0dXJuIGN9O2xldCBkPSIiO2Euc2V0RmFrZUhhc2g9ZnVuY3Rpb24oZil7ZD1mfTthLmdldEZha2VIYXNoPWZ1bmN0aW9uKCl7cmV0dXJuIGR9fSkoU298fChTbz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXN0b3JhZ2UvbGlzdGVuZXJzLmpzCnZhciBUbzsKKGZ1bmN0aW9uKGEpe2NsYXNzIGN7Y29uc3RydWN0b3IoZyl7dGhpcy5saXN0ZW5lcj1nfX1hLkxpc3RlbktleT1jO2NvbnN0IGQ9bmV3IFNldCxmPW5ldyBTZXQ7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhhc2hjaGFuZ2UiLCgpPT57ZC5mb3JFYWNoKGc9PmcubGlzdGVuZXIoKSl9KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic3RvcmFnZSIsKCk9PntmLmZvckVhY2goZz0+Zy5saXN0ZW5lcigpKX0pO2EuYWRkSGFzaExpc3RlbmVyPWZ1bmN0aW9uKGcpe2c9bmV3IGMoZyk7ZC5hZGQoZyk7cmV0dXJuIGd9O2EuYWRkU3RvcmFnZUxpc3RlbmVyPWZ1bmN0aW9uKGcpe2c9bmV3IGMoZyk7Zi5hZGQoZyk7cmV0dXJuIGd9O2EuZmlyZVN0b3JhZ2VDaGFuZ2VkPWZ1bmN0aW9uKCl7Zi5mb3JFYWNoKGc9PmcubGlzdGVuZXIoKSl9O2EucmVtb3ZlSGFzaExpc3RlbmVyQnlLZXk9ZnVuY3Rpb24oZyl7ZC5kZWxldGUoZyl9O2EucmVtb3ZlU3RvcmFnZUxpc3RlbmVyQnlLZXk9ZnVuY3Rpb24oZyl7Zi5kZWxldGUoZyl9fSkoVG98fAooVG89e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zdG9yYWdlL3N0b3JhZ2UuanMKKGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMocSxyKXtmdW5jdGlvbiB0KHgsQz17fSl7Y29uc3Qge2RlZmF1bHRWYWx1ZTpGLHVzZUxvY2FsU3RvcmFnZTpEPSExfT1DO3g9RD93aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oeCk6ayhmKCkpW3hdO3JldHVybiB2b2lkIDA9PXg/Xy5jbG9uZURlZXAoRik6cSh4KX1mdW5jdGlvbiB2KHgsQyxGPXt9KXtjb25zdCB7ZGVmYXVsdFZhbHVlOkQsdXNlTG9jYWxTdG9yYWdlOkI9ITEsdXNlTG9jYXRpb25SZXBsYWNlOkk9ITF9PUY7Rj1yKEMpO0I/KHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh4LEYpLGEuZmlyZVN0b3JhZ2VDaGFuZ2VkKCkpOl8uaXNFcXVhbChDLHQoeCx7dXNlTG9jYWxTdG9yYWdlOkJ9KSl8fChfLmlzRXF1YWwoQyxEKT9uKHgpOihDPWsoZigpKSxDW3hdPUYsZyhsKEMpLEkpKSl9Y29uc3QgeT1bXSx6PVtdO3JldHVybntnZXQ6dCxzZXQ6dixnZXRJbml0aWFsaXplcjpmdW5jdGlvbih4LEMpe2NvbnN0IEY9T2JqZWN0LmFzc2lnbih7ZGVmYXVsdFZhbHVlOkMuZGVmYXVsdFZhbHVlLApwb2x5bWVyUHJvcGVydHk6eCx1c2VMb2NhbFN0b3JhZ2U6ITF9LEMpO3JldHVybiBmdW5jdGlvbigpe2NvbnN0IEQ9ZCh0aGlzLHgpLEI9KCk9Pntjb25zdCBPPXQoRCxGKTtfLmlzRXF1YWwoTyx0aGlzW0YucG9seW1lclByb3BlcnR5XSl8fCh0aGlzW0YucG9seW1lclByb3BlcnR5XT1PKX0sST0oRi51c2VMb2NhbFN0b3JhZ2U/YS5hZGRTdG9yYWdlTGlzdGVuZXI6YS5hZGRIYXNoTGlzdGVuZXIpKCgpPT5CKCkpO0YudXNlTG9jYWxTdG9yYWdlP3oucHVzaChJKTp5LnB1c2goSSk7QigpO3JldHVybiB0aGlzW0YucG9seW1lclByb3BlcnR5XX19LGdldE9ic2VydmVyOmZ1bmN0aW9uKHgsQyl7Y29uc3QgRj1PYmplY3QuYXNzaWduKHtkZWZhdWx0VmFsdWU6Qy5kZWZhdWx0VmFsdWUscG9seW1lclByb3BlcnR5OngsdXNlTG9jYWxTdG9yYWdlOiExfSxDKTtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBEPWQodGhpcyx4KTt2KEQsdGhpc1tGLnBvbHltZXJQcm9wZXJ0eV0sRil9fSxkaXNwb3NlQmluZGluZzpmdW5jdGlvbigpe3kuZm9yRWFjaCh4PT4KYS5yZW1vdmVIYXNoTGlzdGVuZXJCeUtleSh4KSk7ei5mb3JFYWNoKHg9PmEucmVtb3ZlU3RvcmFnZUxpc3RlbmVyQnlLZXkoeCkpfX19ZnVuY3Rpb24gZChxLHIpe3E9cVthLkRJU0FNQklHVUFUT1JdO3JldHVybihudWxsPT1xP1tyXTpbcSxyXSkuam9pbigiLiIpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gU28udXNlSGFzaCgpP3dpbmRvdy5sb2NhdGlvbi5oYXNoLnNsaWNlKDEpOlNvLmdldEZha2VIYXNoKCl9ZnVuY3Rpb24gZyhxLHI9ITEpe1NvLnVzZUhhc2goKT9yP3dpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKCIjIitxKTp3aW5kb3cubG9jYXRpb24uaGFzaD1xOlNvLnNldEZha2VIYXNoKHEpfWZ1bmN0aW9uIGwocSl7bGV0IHI9IiI7dm9pZCAwIT09cVthLlRBQl0mJihyKz1xW2EuVEFCXSk7Y29uc3QgdD1PYmplY3Qua2V5cyhxKS5tYXAodj0+W3YscVt2XV0pLmZpbHRlcih2PT52WzBdIT09YS5UQUIpLm1hcCh2PT5lbmNvZGVVUklDb21wb25lbnQodlswXSkrIlx4M2QiK2VuY29kZVVSSUNvbXBvbmVudCh2WzFdKSkuam9pbigiXHgyNiIpOwpyZXR1cm4gMDx0Lmxlbmd0aD9yKyJceDI2Iit0OnJ9ZnVuY3Rpb24gayhxKXtjb25zdCByPXt9O3Euc3BsaXQoIlx4MjYiKS5mb3JFYWNoKHQ9Pnt0PXQuc3BsaXQoIlx4M2QiKTsxPT09dC5sZW5ndGg/clthLlRBQl09dFswXToyPT09dC5sZW5ndGgmJihyW2RlY29kZVVSSUNvbXBvbmVudCh0WzBdKV09ZGVjb2RlVVJJQ29tcG9uZW50KHRbMV0pKX0pO3JldHVybiByfWZ1bmN0aW9uIG4ocSl7Y29uc3Qgcj1rKGYoKSk7ZGVsZXRlIHJbcV07ZyhsKHIpKX1hLlRBQj0iX190YWJfXyI7YS5ESVNBTUJJR1VBVE9SPSJkaXNhbWJpZ3VhdG9yIjt2YXIgcD1jKHE9PnEscT0+cSk7YS5nZXRTdHJpbmc9cC5nZXQ7YS5zZXRTdHJpbmc9cC5zZXQ7YS5nZXRTdHJpbmdJbml0aWFsaXplcj1wLmdldEluaXRpYWxpemVyO2EuZ2V0U3RyaW5nT2JzZXJ2ZXI9cC5nZXRPYnNlcnZlcjthLmRpc3Bvc2VTdHJpbmdCaW5kaW5nPXAuZGlzcG9zZUJpbmRpbmc7cD1jKHE9PiJ0cnVlIj09PXE/ITA6ImZhbHNlIj09PQpxPyExOnZvaWQgMCxxPT5xLnRvU3RyaW5nKCkpO2EuZ2V0Qm9vbGVhbj1wLmdldDthLnNldEJvb2xlYW49cC5zZXQ7YS5nZXRCb29sZWFuSW5pdGlhbGl6ZXI9cC5nZXRJbml0aWFsaXplcjthLmdldEJvb2xlYW5PYnNlcnZlcj1wLmdldE9ic2VydmVyO2EuZGlzcG9zZUJvb2xlYW5CaW5kaW5nPXAuZGlzcG9zZUJpbmRpbmc7cD1jKHE9PitxLHE9PnEudG9TdHJpbmcoKSk7YS5nZXROdW1iZXI9cC5nZXQ7YS5zZXROdW1iZXI9cC5zZXQ7YS5nZXROdW1iZXJJbml0aWFsaXplcj1wLmdldEluaXRpYWxpemVyO2EuZ2V0TnVtYmVyT2JzZXJ2ZXI9cC5nZXRPYnNlcnZlcjthLmRpc3Bvc2VOdW1iZXJCaW5kaW5nPXAuZGlzcG9zZUJpbmRpbmc7cD1jKHE9PkpTT04ucGFyc2UoYXRvYihxKSkscT0+YnRvYShKU09OLnN0cmluZ2lmeShxKSkpO2EuZ2V0T2JqZWN0PXAuZ2V0O2Euc2V0T2JqZWN0PXAuc2V0O2EuZ2V0T2JqZWN0SW5pdGlhbGl6ZXI9cC5nZXRJbml0aWFsaXplcjthLmdldE9iamVjdE9ic2VydmVyPQpwLmdldE9ic2VydmVyO2EuZGlzcG9zZU9iamVjdEJpbmRpbmc9cC5kaXNwb3NlQmluZGluZzthLm1ha2VCaW5kaW5ncz1jfSkoVG98fChUbz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXN0b3JhZ2UvdGYtc3RvcmFnZS1wb2x5bWVyLmpzCihmdW5jdGlvbihhKXtQb2x5bWVyKHtpczoidGYtc3RvcmFnZSIsX3RlbXBsYXRlOm51bGwsdGZfc3RvcmFnZTphfSl9KShUb3x8KFRvPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY2F0ZWdvcml6YXRpb24tdXRpbHMvdGYtdGFnLWZpbHRlcmVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRhZy1maWx0ZXJlciIscHJvcGVydGllczp7dGFnRmlsdGVyOnt0eXBlOlN0cmluZyxub3RpZnk6ITAsY29tcHV0ZWQ6Il9jb21wdXRlVGFnRmlsdGVyKF90YWdGaWx0ZXIpIn0sX3RhZ0ZpbHRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6VG8uZ2V0U3RyaW5nSW5pdGlhbGl6ZXIoInRhZ0ZpbHRlciIse2RlZmF1bHRWYWx1ZToiIix1c2VMb2NhbFN0b3JhZ2U6ITEscG9seW1lclByb3BlcnR5OiJfdGFnRmlsdGVyIn0pLG9ic2VydmVyOiJfdGFnRmlsdGVyT2JzZXJ2ZXIifX0sX3RhZ0ZpbHRlck9ic2VydmVyOlRvLmdldFN0cmluZ09ic2VydmVyKCJ0YWdGaWx0ZXIiLHtkZWZhdWx0VmFsdWU6IiIsdXNlTG9jYWxTdG9yYWdlOiExLHBvbHltZXJQcm9wZXJ0eToiX3RhZ0ZpbHRlciJ9KSxfY29tcHV0ZVRhZ0ZpbHRlcigpe3JldHVybiB0aGlzLl90YWdGaWx0ZXJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi9hcnJheS11cGRhdGUtaGVscGVyLmpzCnZhciBVbzsoZnVuY3Rpb24oYSl7YS5BcnJheVVwZGF0ZUhlbHBlcj17dXBkYXRlQXJyYXlQcm9wKGMsZCxmKXtsZXQgZz10aGlzLmdldChjKTtpZighQXJyYXkuaXNBcnJheShkKSl0aHJvdyBSYW5nZUVycm9yKGBFeHBlY3RlZCBuZXcgdmFsdWUgdG8gJyR7Y30nIHRvIGJlIGFuIGFycmF5LmApO0FycmF5LmlzQXJyYXkoZyl8fChnPVtdLHRoaXMuc2V0KGMsZykpO2NvbnN0IGw9bmV3IFNldChkLm1hcCgocCxxKT0+ZihwLHEpKSk7bGV0IGs9MCxuPTA7Zm9yKDtrPGcubGVuZ3RoJiZuPGQubGVuZ3RoOylsLmhhcyhmKGdba10saykpPyhmKGdba10sayk9PWYoZFtuXSxuKT90aGlzLnNldChgJHtjfS4ke2t9YCxkW25dKTp0aGlzLnNwbGljZShjLGssMCxkW25dKSxuKyssaysrKTp0aGlzLnNwbGljZShjLGssMSk7azxnLmxlbmd0aCYmdGhpcy5zcGxpY2UoYyxrKTtuPGQubGVuZ3RoJiZ0aGlzLnB1c2goYywuLi5kLnNsaWNlKG4pKX19fSkoVW98fChVbz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRhc2hib2FyZC1jb21tb24vdGYtZGFzaGJvYXJkLWxheW91dC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1kYXNoYm9hcmQtbGF5b3V0In0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRhc2hib2FyZC1jb21tb24vdGYtb3B0aW9uLXNlbGVjdG9yLmh0bWwuanMKUG9seW1lcih7aXM6InRmLW9wdGlvbi1zZWxlY3RvciIscHJvcGVydGllczp7bmFtZTpTdHJpbmcsc2VsZWN0ZWRJZDp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLG9ic2VydmVyOiJfc2VsZWN0ZWRJZENoYW5nZWQifX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpLmZvckVhY2goZnVuY3Rpb24oYSl7dGhpcy5saXN0ZW4oYSwidGFwIiwiX3NlbGVjdFRhcmdldCIpfS5iaW5kKHRoaXMpKX0pfSxfc2VsZWN0VGFyZ2V0OmZ1bmN0aW9uKGEpe3RoaXMuc2VsZWN0ZWRJZD1hLmN1cnJlbnRUYXJnZXQuaWR9LF9zZWxlY3RlZElkQ2hhbmdlZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMucXVlcnlFZmZlY3RpdmVDaGlsZHJlbigiIyIrdGhpcy5zZWxlY3RlZElkKTthJiYodGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpLmZvckVhY2goZnVuY3Rpb24oYyl7Yy5jbGFzc0xpc3QucmVtb3ZlKCJzZWxlY3RlZCIpfSksYS5jbGFzc0xpc3QuYWRkKCJzZWxlY3RlZCIpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWNvbGxhcHNlL2lyb24tY29sbGFwc2UuaHRtbC5qcwpQb2x5bWVyKHtpczoiaXJvbi1jb2xsYXBzZSIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcl0scHJvcGVydGllczp7aG9yaXpvbnRhbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfaG9yaXpvbnRhbENoYW5nZWQifSxvcGVuZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9vcGVuZWRDaGFuZ2VkIn0sdHJhbnNpdGlvbmluZzp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCxyZWFkT25seTohMH0sbm9BbmltYXRpb246e3R5cGU6Qm9vbGVhbn0sX2Rlc2lyZWRTaXplOnt0eXBlOlN0cmluZyx2YWx1ZToiIn19LGdldCBkaW1lbnNpb24oKXtyZXR1cm4gdGhpcy5ob3Jpem9udGFsPyJ3aWR0aCI6ImhlaWdodCJ9LGdldCBfZGltZW5zaW9uTWF4KCl7cmV0dXJuIHRoaXMuaG9yaXpvbnRhbD8ibWF4V2lkdGgiOiJtYXhIZWlnaHQifSxnZXQgX2RpbWVuc2lvbk1heENzcygpe3JldHVybiB0aGlzLmhvcml6b250YWw/Im1heC13aWR0aCI6CiJtYXgtaGVpZ2h0In0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6Imdyb3VwIiwiYXJpYS1oaWRkZW4iOiJ0cnVlIn0sbGlzdGVuZXJzOnt0cmFuc2l0aW9uZW5kOiJfb25UcmFuc2l0aW9uRW5kIn0sdG9nZ2xlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ9IXRoaXMub3BlbmVkfSxzaG93OmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ9ITB9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMX0sdXBkYXRlU2l6ZTpmdW5jdGlvbihhLGMpe2E9ImF1dG8iPT09YT8iIjphO2M9YyYmIXRoaXMubm9BbmltYXRpb24mJnRoaXMuaXNBdHRhY2hlZCYmdGhpcy5fZGVzaXJlZFNpemUhPT1hO3RoaXMuX2Rlc2lyZWRTaXplPWE7dGhpcy5fdXBkYXRlVHJhbnNpdGlvbighMSk7YyYmKGM9dGhpcy5fY2FsY1NpemUoKSwiIj09PWEmJih0aGlzLnN0eWxlW3RoaXMuX2RpbWVuc2lvbk1heF09IiIsYT10aGlzLl9jYWxjU2l6ZSgpKSx0aGlzLnN0eWxlW3RoaXMuX2RpbWVuc2lvbk1heF09Yyx0aGlzLnNjcm9sbFRvcD0KdGhpcy5zY3JvbGxUb3AsdGhpcy5fdXBkYXRlVHJhbnNpdGlvbighMCksYz1hIT09Yyk7dGhpcy5zdHlsZVt0aGlzLl9kaW1lbnNpb25NYXhdPWE7Y3x8dGhpcy5fdHJhbnNpdGlvbkVuZCgpfSxlbmFibGVUcmFuc2l0aW9uOmZ1bmN0aW9uKGEpe1BvbHltZXIuQmFzZS5fd2FybigiYGVuYWJsZVRyYW5zaXRpb24oKWAgaXMgZGVwcmVjYXRlZCwgdXNlIGBub0FuaW1hdGlvbmAgaW5zdGVhZC4iKTt0aGlzLm5vQW5pbWF0aW9uPSFhfSxfdXBkYXRlVHJhbnNpdGlvbjpmdW5jdGlvbihhKXt0aGlzLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbj1hJiYhdGhpcy5ub0FuaW1hdGlvbj8iIjoiMHMifSxfaG9yaXpvbnRhbENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnRyYW5zaXRpb25Qcm9wZXJ0eT10aGlzLl9kaW1lbnNpb25NYXhDc3M7dGhpcy5zdHlsZVsibWF4V2lkdGgiPT09dGhpcy5fZGltZW5zaW9uTWF4PyJtYXhIZWlnaHQiOiJtYXhXaWR0aCJdPSIiO3RoaXMudXBkYXRlU2l6ZSh0aGlzLm9wZW5lZD8KImF1dG8iOiIwcHgiLCExKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCF0aGlzLm9wZW5lZCk7dGhpcy5fc2V0VHJhbnNpdGlvbmluZyghMCk7dGhpcy50b2dnbGVDbGFzcygiaXJvbi1jb2xsYXBzZS1jbG9zZWQiLCExKTt0aGlzLnRvZ2dsZUNsYXNzKCJpcm9uLWNvbGxhcHNlLW9wZW5lZCIsITEpO3RoaXMudXBkYXRlU2l6ZSh0aGlzLm9wZW5lZD8iYXV0byI6IjBweCIsITApO3RoaXMub3BlbmVkJiZ0aGlzLmZvY3VzKCl9LF90cmFuc2l0aW9uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZVt0aGlzLl9kaW1lbnNpb25NYXhdPXRoaXMuX2Rlc2lyZWRTaXplO3RoaXMudG9nZ2xlQ2xhc3MoImlyb24tY29sbGFwc2UtY2xvc2VkIiwhdGhpcy5vcGVuZWQpO3RoaXMudG9nZ2xlQ2xhc3MoImlyb24tY29sbGFwc2Utb3BlbmVkIix0aGlzLm9wZW5lZCk7dGhpcy5fdXBkYXRlVHJhbnNpdGlvbighMSk7dGhpcy5ub3RpZnlSZXNpemUoKTsKdGhpcy5fc2V0VHJhbnNpdGlvbmluZyghMSl9LF9vblRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oYSl7UG9seW1lci5kb20oYSkucm9vdFRhcmdldD09PXRoaXMmJnRoaXMuX3RyYW5zaXRpb25FbmQoKX0sX2NhbGNTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbdGhpcy5kaW1lbnNpb25dKyJweCJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcGFnaW5hdGVkLXZpZXcvdGYtZG9tLXJlcGVhdC5odG1sLmpzCnZhciBWbzsKKGZ1bmN0aW9uKGEpe2EuVGZEb21SZXBlYXRCZWhhdmlvcj1bVW8uQXJyYXlVcGRhdGVIZWxwZXIse3Byb3BlcnRpZXM6e2FzOnt0eXBlOlN0cmluZyx2YWx1ZToiaXRlbSJ9LF9jb250ZW50QWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF9kb21Cb290c3RyYXBwZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2N0b3I6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pm51bGx9LF9yZW5kZXJlZEl0ZW1zOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX3JlbmRlcmVkVGVtcGxhdGVJbnN0Ont0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IE1hcH0sX2xydUNhY2hlZEl0ZW1zOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IE1hcH0sX2NhY2hlU2l6ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MTB9LF9nZXRJdGVtS2V5Ont0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT5jPT5KU09OLnN0cmluZ2lmeShjKX19LG9ic2VydmVyczpbIl9ib290c3RyYXBEb20oX2l0ZW1zUmVuZGVyZWQsIGlzQXR0YWNoZWQpIiwiX3VwZGF0ZURvbShfcmVuZGVyZWRJdGVtcy4qLCBfZG9tQm9vdHN0cmFwcGVkKSIsCiJfdXBkYXRlQWN0aXZlKF9jb250ZW50QWN0aXZlKSIsIl90cmltQ2FjaGUoX2NhY2hlU2l6ZSkiXSxzZXRDYWNoZVNpemUoYyl7dGhpcy5fY2FjaGVTaXplPWN9LHNldEdldEl0ZW1LZXkoYyl7dGhpcy5fZ2V0SXRlbUtleT1jfSx1cGRhdGVEb20oYyl7dGhpcy51cGRhdGVBcnJheVByb3AoIl9yZW5kZXJlZEl0ZW1zIixjLHRoaXMuX2dldEl0ZW1LZXkpfSxfZW5zdXJlVGVtcGxhdGl6ZWQoKXtpZighdGhpcy5pc0F0dGFjaGVkKXJldHVybiExO3RoaXMuX2N0b3J8fCh0aGlzLl9jdG9yPVBvbHltZXIuVGVtcGxhdGl6ZS50ZW1wbGF0aXplKHRoaXMucXVlcnlTZWxlY3RvcigidGVtcGxhdGUiKSx0aGlzLHtwYXJlbnRNb2RlbDohMCxpbnN0YW5jZVByb3BzOntbdGhpcy5hc106ITAsYWN0aXZlOnRoaXMuX2NvbnRlbnRBY3RpdmV9LGZvcndhcmRIb3N0UHJvcDpmdW5jdGlvbihjLGQpe3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmZvckVhY2goZj0+e2YuZm9yd2FyZEhvc3RQcm9wKGMsCmQpfSl9fSkpO3JldHVybiEwfSxfYm9vdHN0cmFwRG9tKCl7dGhpcy5faXRlbXNSZW5kZXJlZCYmdGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKSYmIXRoaXMuX2RvbUJvb3RzdHJhcHBlZCYmKEFycmF5LmZyb20odGhpcy5jaGlsZHJlbikuZm9yRWFjaChjPT57UG9seW1lci5kb20odGhpcykucmVtb3ZlQ2hpbGQoYyl9KSx0aGlzLl9scnVDYWNoZWRJdGVtcy5jbGVhcigpLHRoaXMuX3JlbmRlcmVkSXRlbXMuZm9yRWFjaCgoYyxkKT0+dGhpcy5faW5zZXJ0SXRlbShjLGQpKSx0aGlzLl9kb21Cb290c3RyYXBwZWQ9ITApfSxfdXBkYXRlQWN0aXZlKCl7dGhpcy5fZG9tQm9vdHN0cmFwcGVkJiZBcnJheS5mcm9tKHRoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LnZhbHVlcygpKS5mb3JFYWNoKGM9PntjLm5vdGlmeVBhdGgoImFjdGl2ZSIsdGhpcy5fY29udGVudEFjdGl2ZSl9KX0sX3VwZGF0ZURvbShjKXtpZih0aGlzLl9kb21Cb290c3RyYXBwZWQmJiJfcmVuZGVyZWRJdGVtcyIhPWMucGF0aCYmCiJfcmVuZGVyZWRJdGVtcy5sZW5ndGgiIT1jLnBhdGgpaWYoIl9yZW5kZXJlZEl0ZW1zLnNwbGljZXMiPT09Yy5wYXRoKWMudmFsdWUuaW5kZXhTcGxpY2VzLmZvckVhY2goZD0+e2NvbnN0IHtpbmRleDpmLGFkZGVkQ291bnQ6ZyxvYmplY3Q6bCxyZW1vdmVkOmt9PWQ7ay5mb3JFYWNoKG49Pnt0aGlzLl9yZW1vdmVJdGVtKG4sdGhpcy5jaGlsZHJlbltmXSl9KTtsLnNsaWNlKGYsZitnKS5mb3JFYWNoKChuLHApPT50aGlzLl9pbnNlcnRJdGVtKG4sZitwKSk7dGhpcy5fdHJpbUNhY2hlKCl9KTtlbHNle2NvbnN0IGQ9dGhpcy5fZ2V0SXRlbUtleShjLnZhbHVlKTt0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5oYXMoZCk/dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZ2V0KGQpLm5vdGlmeVBhdGgodGhpcy5hcyxjLnZhbHVlKTpjb25zb2xlLndhcm4oYEV4cGVjdGVkICcke2R9JyB0byBleGlzdCBpbiB0aGUgRE9NIGJ1dCBgKyJjb3VsZCBub3QgZmluZCBvbmUuIil9fSxfaW5zZXJ0SXRlbShjLApkKXtpZighdGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKSl0aHJvdyBFcnJvcigiRXhwZWN0ZWQgdGVtcGxhdGl6ZWQgYmVmb3JlIGluc2VydGluZyBhbiBpdGVtIik7Y29uc3QgZj10aGlzLl9nZXRJdGVtS2V5KGMpO2lmKHRoaXMuX2xydUNhY2hlZEl0ZW1zLmhhcyhmKSljPXRoaXMuX2xydUNhY2hlZEl0ZW1zLmdldChmKSx0aGlzLl9scnVDYWNoZWRJdGVtcy5kZWxldGUoZiksdGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZ2V0KGYpLm5vdGlmeVBhdGgoImFjdGl2ZSIsdGhpcy5fY29udGVudEFjdGl2ZSk7ZWxzZXtjb25zdCBnPW5ldyB0aGlzLl9jdG9yKHtbdGhpcy5hc106YyxhY3RpdmU6dGhpcy5fY29udGVudEFjdGl2ZX0pO2M9Zy5yb290O3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LnNldChmLGcpfXRoaXMuY2hpbGRyZW5bZF0/UG9seW1lci5kb20odGhpcykuaW5zZXJ0QmVmb3JlKGMsdGhpcy5jaGlsZHJlbltkXSk6KChjLm5vZGVUeXBlPT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU/CkFycmF5LmZyb20oYy5jaGlsZHJlbik6W2NdKS5mb3JFYWNoKGc9Pmcuc2V0QXR0cmlidXRlKCJzbG90IiwiaXRlbXMiKSksUG9seW1lci5kb20odGhpcykuYXBwZW5kQ2hpbGQoYykpfSxfcmVtb3ZlSXRlbShjLGQpe1BvbHltZXIuZG9tKGQucGFyZW50Tm9kZSkucmVtb3ZlQ2hpbGQoZCk7Yz10aGlzLl9nZXRJdGVtS2V5KGMpO3RoaXMuX2xydUNhY2hlZEl0ZW1zLnNldChjLGQpO3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmdldChjKS5ub3RpZnlQYXRoKCJhY3RpdmUiLCExKX0sX3RyaW1DYWNoZSgpe2Zvcig7dGhpcy5fbHJ1Q2FjaGVkSXRlbXMuc2l6ZT50aGlzLl9jYWNoZVNpemU7KXtjb25zdCBbY109dGhpcy5fbHJ1Q2FjaGVkSXRlbXMua2V5cygpO3RoaXMuX2xydUNhY2hlZEl0ZW1zLmRlbGV0ZShjKTt0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5kZWxldGUoYyl9fX1dfSkoVm98fChWbz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBhZ2luYXRlZC12aWV3L3BhZ2luYXRlZFZpZXdTdG9yZS5qcwp2YXIgV287CihmdW5jdGlvbihhKXtsZXQgYz1udWxsO2NvbnN0IGQ9bmV3IFNldDthLmFkZExpbWl0TGlzdGVuZXI9ZnVuY3Rpb24oZil7ZC5hZGQoZil9O2EucmVtb3ZlTGltaXRMaXN0ZW5lcj1mdW5jdGlvbihmKXtkLmRlbGV0ZShmKX07YS5nZXRMaW1pdD1mdW5jdGlvbigpe251bGw9PWMmJihjPVRvLmdldE51bWJlcigiVEYuVGVuc29yQm9hcmQuUGFnaW5hdGVkVmlldy5saW1pdCIse3VzZUxvY2FsU3RvcmFnZTohMH0pLG51bGw9PWN8fCFpc0Zpbml0ZShjKXx8MD49YykmJihjPTEyKTtyZXR1cm4gY307YS5zZXRMaW1pdD1mdW5jdGlvbihmKXtpZihmIT09TWF0aC5mbG9vcihmKSl0aHJvdyBFcnJvcihgbGltaXQgbXVzdCBiZSBhbiBpbnRlZ2VyLCBidXQgZ290OiAke2Z9YCk7aWYoMD49Zil0aHJvdyBFcnJvcihgbGltaXQgbXVzdCBiZSBwb3NpdGl2ZSwgYnV0IGdvdDogJHtmfWApO2YhPT1jJiYoYz1mLFRvLnNldE51bWJlcigiVEYuVGVuc29yQm9hcmQuUGFnaW5hdGVkVmlldy5saW1pdCIsYywKe3VzZUxvY2FsU3RvcmFnZTohMH0pLGQuZm9yRWFjaChnPT57ZygpfSkpfX0pKFdvfHwoV289e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wYWdpbmF0ZWQtdmlldy90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyIscHJvcGVydGllczp7Y2F0ZWdvcnk6T2JqZWN0LGluaXRpYWxPcGVuZWQ6Qm9vbGVhbixvcGVuZWQ6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAscmVhZE9ubHk6ITB9LF9jb250ZW50QWN0aXZlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQ29udGVudEFjdGl2ZShvcGVuZWQpIn0sZGlzYWJsZVBhZ2luYXRpb246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NvdW50Ont0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVDb3VudChjYXRlZ29yeS5pdGVtcy4qKSJ9LF9oYXNNdWx0aXBsZTp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlKF9jb3VudCkifSxfcGFuZVJlbmRlcmVkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlUGFuZVJlbmRlcmVkKGNhdGVnb3J5KSIsb2JzZXJ2ZXI6Il9vblBhbmVSZW5kZXJlZENoYW5nZWQifSxfaXRlbXNSZW5kZXJlZDp7dHlwZTpCb29sZWFuLApjb21wdXRlZDoiX2NvbXB1dGVJdGVtc1JlbmRlcmVkKG9wZW5lZCwgX3BhbmVSZW5kZXJlZCkifSxfaXNTZWFyY2hSZXN1bHRzOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSXNTZWFyY2hSZXN1bHRzKGNhdGVnb3J5Lm1ldGFkYXRhLnR5cGUpIn0sX2lzSW52YWxpZFNlYXJjaFJlc3VsdHM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVJc0ludmFsaWRTZWFyY2hSZXN1bHRzKGNhdGVnb3J5Lm1ldGFkYXRhKSJ9LF9pc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5Ont0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSXNVbml2ZXJzYWxTZWFyY2hRdWVyeShjYXRlZ29yeS5tZXRhZGF0YSkifSxnZXRDYXRlZ29yeUl0ZW1LZXk6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9PmE9PkpTT04uc3RyaW5naWZ5KGEpLG9ic2VydmVyOiJfZ2V0Q2F0ZWdvcnlJdGVtS2V5Q2hhbmdlZCJ9LF9saW1pdDp7dHlwZTpOdW1iZXIsdmFsdWU6MTIsb2JzZXJ2ZXI6Il9saW1pdENoYW5nZWQifSwKX2FjdGl2ZUluZGV4Ont0eXBlOk51bWJlcix2YWx1ZTowfSxfY3VycmVudFBhZ2U6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRQYWdlKF9saW1pdCwgX2FjdGl2ZUluZGV4KSJ9LF9wYWdlQ291bnQ6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZVBhZ2VDb3VudChjYXRlZ29yeS5pdGVtcy4qLCBfbGltaXQpIn0sX211bHRpcGxlUGFnZXNFeGlzdDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZU11bHRpcGxlUGFnZXNFeGlzdChfcGFnZUNvdW50LCBkaXNhYmxlUGFnaW5hdGlvbikifSxfaGFzUHJldmlvdXNQYWdlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzUHJldmlvdXNQYWdlKF9jdXJyZW50UGFnZSkifSxfaGFzTmV4dFBhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNOZXh0UGFnZShfY3VycmVudFBhZ2UsIF9wYWdlQ291bnQpIn0sX2lucHV0V2lkdGg6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUlucHV0V2lkdGgoX3BhZ2VDb3VudCkiLApvYnNlcnZlcjoiX3VwZGF0ZUlucHV0V2lkdGgifSxfcGFnZUlucHV0VmFsdWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVBhZ2VJbnB1dFZhbHVlKF9wYWdlSW5wdXRGb2N1c2VkLCBfcGFnZUlucHV0UmF3VmFsdWUsIF9jdXJyZW50UGFnZSkiLG9ic2VydmVyOiJfdXBkYXRlUGFnZUlucHV0VmFsdWUifSxfcGFnZUlucHV0UmF3VmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfcGFnZUlucHV0Rm9jdXNlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sb2JzZXJ2ZXJzOlsiX2NsYW1wQWN0aXZlSW5kZXgoY2F0ZWdvcnkuaXRlbXMuKikiLCJfdXBkYXRlUmVuZGVyZWRJdGVtcyhfaXRlbXNSZW5kZXJlZCwgY2F0ZWdvcnkuaXRlbXMuKiwgX2xpbWl0LCBfYWN0aXZlSW5kZXgsIF9wYWdlQ291bnQsIGRpc2FibGVQYWdpbmF0aW9uKSJdLGJlaGF2aW9yczpbVm8uVGZEb21SZXBlYXRCZWhhdmlvcl0sX2NvbXB1dGVDb3VudCgpe3JldHVybiB0aGlzLmNhdGVnb3J5Lml0ZW1zLmxlbmd0aH0sCl9jb21wdXRlSGFzTXVsdGlwbGUoKXtyZXR1cm4gMTx0aGlzLl9jb3VudH0sX3RvZ2dsZVBhbmUoKXt0aGlzLl9zZXRPcGVuZWQoIXRoaXMub3BlbmVkKX0sX2NvbXB1dGVDb250ZW50QWN0aXZlKCl7cmV0dXJuIHRoaXMub3BlbmVkfSxfb25QYW5lUmVuZGVyZWRDaGFuZ2VkKGEsYyl7YSYmYSE9PWMmJnRoaXMuJC5pZlJlbmRlcmVkLnJlbmRlcigpfSxfY29tcHV0ZVBhbmVSZW5kZXJlZChhKXtyZXR1cm4hKGEubWV0YWRhdGEudHlwZT09PVJvLkNhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUUyYmIiI9PT1hLm5hbWUpfSxfY29tcHV0ZUl0ZW1zUmVuZGVyZWQoKXtyZXR1cm4gdGhpcy5fcGFuZVJlbmRlcmVkJiZ0aGlzLm9wZW5lZH0sX2NvbXB1dGVJc1NlYXJjaFJlc3VsdHMoYSl7cmV0dXJuIGE9PT1Sby5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFN9LF9jb21wdXRlSXNJbnZhbGlkU2VhcmNoUmVzdWx0cyhhKXtyZXR1cm4gYS50eXBlPT09Um8uQ2F0ZWdvcnlUeXBlLlNFQVJDSF9SRVNVTFRTJiYKIWEudmFsaWRSZWdleH0sX2NvbXB1dGVJc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5KGEpe3JldHVybiBhLnR5cGU9PT1Sby5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFMmJmEudW5pdmVyc2FsUmVnZXh9LF9pc0NvbXBvc2l0ZVNlYXJjaCgpe2NvbnN0IHt0eXBlOmEsY29tcG9zaXRlU2VhcmNoOmN9PXRoaXMuY2F0ZWdvcnkubWV0YWRhdGE7cmV0dXJuIGMmJmE9PT1Sby5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFN9LHJlYWR5KCl7dGhpcy5fc2V0T3BlbmVkKG51bGw9PXRoaXMuaW5pdGlhbE9wZW5lZD8hMDp0aGlzLmluaXRpYWxPcGVuZWQpO3RoaXMuX2xpbWl0TGlzdGVuZXI9KCk9Pnt0aGlzLnNldCgiX2xpbWl0IixXby5nZXRMaW1pdCgpKX07V28uYWRkTGltaXRMaXN0ZW5lcih0aGlzLl9saW1pdExpc3RlbmVyKTt0aGlzLl9saW1pdExpc3RlbmVyKCl9LGRldGFjaGVkKCl7V28ucmVtb3ZlTGltaXRMaXN0ZW5lcih0aGlzLl9saW1pdExpc3RlbmVyKX0sX3VwZGF0ZVJlbmRlcmVkSXRlbXMoYSwKYyxkLGYsZyxsKXthJiYoYT1NYXRoLmZsb29yKGYvZCksYz10aGlzLmNhdGVnb3J5Lml0ZW1zfHxbXSx0aGlzLnVwZGF0ZURvbShsP2M6Yy5zbGljZShhKmQsKGErMSkqZCksdGhpcy5nZXRDYXRlZ29yeUl0ZW1LZXkpKX0sX2xpbWl0Q2hhbmdlZChhKXt0aGlzLnNldENhY2hlU2l6ZSgyKmEpfSxfZ2V0Q2F0ZWdvcnlJdGVtS2V5Q2hhbmdlZCgpe3RoaXMuc2V0R2V0SXRlbUtleSh0aGlzLmdldENhdGVnb3J5SXRlbUtleSl9LF9jb21wdXRlQ3VycmVudFBhZ2UoYSxjKXtyZXR1cm4gTWF0aC5mbG9vcihjL2EpKzF9LF9jb21wdXRlUGFnZUNvdW50KGEsYyl7cmV0dXJuIHRoaXMuY2F0ZWdvcnk/TWF0aC5jZWlsKHRoaXMuY2F0ZWdvcnkuaXRlbXMubGVuZ3RoL2MpOjB9LF9jb21wdXRlTXVsdGlwbGVQYWdlc0V4aXN0KGEsYyl7cmV0dXJuIWMmJjE8YX0sX2NvbXB1dGVIYXNQcmV2aW91c1BhZ2UoYSl7cmV0dXJuIDE8YX0sX2NvbXB1dGVIYXNOZXh0UGFnZShhLGMpe3JldHVybiBhPGN9LApfY29tcHV0ZUlucHV0V2lkdGgoYSl7cmV0dXJuYGNhbGMoJHthLnRvU3RyaW5nKCkubGVuZ3RofWVtICsgMjBweClgfSxfc2V0QWN0aXZlSW5kZXgoYSl7Y29uc3QgYz0odGhpcy5jYXRlZ29yeS5pdGVtc3x8W10pLmxlbmd0aC0xO2E+YyYmKGE9Yyk7MD5hJiYoYT0wKTt0aGlzLnNldCgiX2FjdGl2ZUluZGV4IixhKX0sX2NsYW1wQWN0aXZlSW5kZXgoKXt0aGlzLl9zZXRBY3RpdmVJbmRleCh0aGlzLl9hY3RpdmVJbmRleCl9LF9wZXJmb3JtUHJldmlvdXNQYWdlKCl7dGhpcy5fc2V0QWN0aXZlSW5kZXgodGhpcy5fYWN0aXZlSW5kZXgtdGhpcy5fbGltaXQpfSxfcGVyZm9ybU5leHRQYWdlKCl7dGhpcy5fc2V0QWN0aXZlSW5kZXgodGhpcy5fYWN0aXZlSW5kZXgrdGhpcy5fbGltaXQpfSxfY29tcHV0ZVBhZ2VJbnB1dFZhbHVlKGEsYyxkKXtyZXR1cm4gYT9jOmQudG9TdHJpbmcoKX0sX2hhbmRsZVBhZ2VJbnB1dEV2ZW50KGEpe3RoaXMuc2V0KCJfcGFnZUlucHV0UmF3VmFsdWUiLGEudGFyZ2V0LnZhbHVlKTsKYT1hLnRhcmdldC52YWx1ZUFzTnVtYmVyO2lzTmFOKGEpfHx0aGlzLl9zZXRBY3RpdmVJbmRleCh0aGlzLl9saW1pdCooTWF0aC5tYXgoMSxNYXRoLm1pbihhLHRoaXMuX3BhZ2VDb3VudCkpLTEpKX0sX2hhbmRsZVBhZ2VDaGFuZ2VFdmVudCgpe3RoaXMuc2V0KCJfcGFnZUlucHV0UmF3VmFsdWUiLHRoaXMuX2N1cnJlbnRQYWdlLnRvU3RyaW5nKCkpfSxfaGFuZGxlUGFnZUZvY3VzRXZlbnQoKXt0aGlzLnNldCgiX3BhZ2VJbnB1dFJhd1ZhbHVlIix0aGlzLl9wYWdlSW5wdXRWYWx1ZSk7dGhpcy5zZXQoIl9wYWdlSW5wdXRGb2N1c2VkIiwhMCl9LF9oYW5kbGVQYWdlQmx1ckV2ZW50KCl7dGhpcy5zZXQoIl9wYWdlSW5wdXRGb2N1c2VkIiwhMSl9LF91cGRhdGVQYWdlSW5wdXRWYWx1ZShhKXtjb25zdCBjPXRoaXMuJCQoIiNwYWdlLWlucHV0IGlucHV0Iik7YyYmKGMudmFsdWU9YSl9LF91cGRhdGVJbnB1dFdpZHRoKCl7dGhpcy51cGRhdGVTdHlsZXMoeyItLXRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3LXBhZ2UtaW5wdXQtd2lkdGgiOnRoaXMuX2lucHV0V2lkdGh9KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1kaWFsb2ctYmVoYXZpb3IvcGFwZXItZGlhbG9nLWJlaGF2aW9yLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9ySW1wbD17aG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImRpYWxvZyIsdGFiaW5kZXg6Ii0xIn0scHJvcGVydGllczp7bW9kYWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX19yZWFkaWVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJfbW9kYWxDaGFuZ2VkKG1vZGFsLCBfX3JlYWRpZWQpIl0sbGlzdGVuZXJzOnt0YXA6Il9vbkRpYWxvZ0NsaWNrIn0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9fcHJldk5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s9dGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrO3RoaXMuX19wcmV2Tm9DYW5jZWxPbkVzY0tleT10aGlzLm5vQ2FuY2VsT25Fc2NLZXk7dGhpcy5fX3ByZXZXaXRoQmFja2Ryb3A9dGhpcy53aXRoQmFja2Ryb3A7dGhpcy5fX3JlYWRpZWQ9ITB9LF9tb2RhbENoYW5nZWQ6ZnVuY3Rpb24oYSxjKXtjJiYoYT8odGhpcy5fX3ByZXZOb0NhbmNlbE9uT3V0c2lkZUNsaWNrPQp0aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2ssdGhpcy5fX3ByZXZOb0NhbmNlbE9uRXNjS2V5PXRoaXMubm9DYW5jZWxPbkVzY0tleSx0aGlzLl9fcHJldldpdGhCYWNrZHJvcD10aGlzLndpdGhCYWNrZHJvcCx0aGlzLndpdGhCYWNrZHJvcD10aGlzLm5vQ2FuY2VsT25Fc2NLZXk9dGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrPSEwKToodGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrPXRoaXMubm9DYW5jZWxPbk91dHNpZGVDbGljayYmdGhpcy5fX3ByZXZOb0NhbmNlbE9uT3V0c2lkZUNsaWNrLHRoaXMubm9DYW5jZWxPbkVzY0tleT10aGlzLm5vQ2FuY2VsT25Fc2NLZXkmJnRoaXMuX19wcmV2Tm9DYW5jZWxPbkVzY0tleSx0aGlzLndpdGhCYWNrZHJvcD10aGlzLndpdGhCYWNrZHJvcCYmdGhpcy5fX3ByZXZXaXRoQmFja2Ryb3ApKX0sX3VwZGF0ZUNsb3NpbmdSZWFzb25Db25maXJtZWQ6ZnVuY3Rpb24oYSl7dGhpcy5jbG9zaW5nUmVhc29uPXRoaXMuY2xvc2luZ1JlYXNvbnx8Cnt9O3RoaXMuY2xvc2luZ1JlYXNvbi5jb25maXJtZWQ9YX0sX29uRGlhbG9nQ2xpY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPVBvbHltZXIuZG9tKGEpLnBhdGgsZD0wLGY9Yy5pbmRleE9mKHRoaXMpO2Q8ZjtkKyspe3ZhciBnPWNbZF07aWYoZy5oYXNBdHRyaWJ1dGUmJihnLmhhc0F0dHJpYnV0ZSgiZGlhbG9nLWRpc21pc3MiKXx8Zy5oYXNBdHRyaWJ1dGUoImRpYWxvZy1jb25maXJtIikpKXt0aGlzLl91cGRhdGVDbG9zaW5nUmVhc29uQ29uZmlybWVkKGcuaGFzQXR0cmlidXRlKCJkaWFsb2ctY29uZmlybSIpKTt0aGlzLmNsb3NlKCk7YS5zdG9wUHJvcGFnYXRpb24oKTticmVha319fX07UG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9yPVtQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3IsUG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9ySW1wbF19KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWRpYWxvZy9wYXBlci1kaWFsb2cuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItZGlhbG9nIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJEaWFsb2dCZWhhdmlvcixQb2x5bWVyLk5lb25BbmltYXRpb25SdW5uZXJCZWhhdmlvcl0sbGlzdGVuZXJzOnsibmVvbi1hbmltYXRpb24tZmluaXNoIjoiX29uTmVvbkFuaW1hdGlvbkZpbmlzaCJ9LF9yZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbEFuaW1hdGlvbigpO3RoaXMucGxheUFuaW1hdGlvbigiZW50cnkiKX0sX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpe3RoaXMuY2FuY2VsQW5pbWF0aW9uKCk7dGhpcy5wbGF5QW5pbWF0aW9uKCJleGl0Iil9LF9vbk5lb25BbmltYXRpb25GaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD90aGlzLl9maW5pc2hSZW5kZXJPcGVuZWQoKTp0aGlzLl9maW5pc2hSZW5kZXJDbG9zZWQoKX19KTsKCi8vIGh0dHBzOi8vZDNqcy5vcmcgdjUuNy4wIENvcHlyaWdodCAyMDE4IE1pa2UgQm9zdG9jawohZnVuY3Rpb24odCxuKXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP24oZXhwb3J0cyk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIl0sbik6bih0LmQzPXQuZDN8fHt9KX0odGhpcyxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LG4pe3JldHVybiB0PG4/LTE6dD5uPzE6dD49bj8wOk5hTn1mdW5jdGlvbiBlKHQpe3ZhciBlO3JldHVybiAxPT09dC5sZW5ndGgmJihlPXQsdD1mdW5jdGlvbih0LHIpe3JldHVybiBuKGUodCkscil9KSx7bGVmdDpmdW5jdGlvbihuLGUscixpKXtmb3IobnVsbD09ciYmKHI9MCksbnVsbD09aSYmKGk9bi5sZW5ndGgpO3I8aTspe3ZhciBvPXIraT4+PjE7dChuW29dLGUpPDA/cj1vKzE6aT1vfXJldHVybiByfSxyaWdodDpmdW5jdGlvbihuLGUscixpKXtmb3IobnVsbD09ciYmKHI9MCksbnVsbD09aSYmKGk9bi5sZW5ndGgpO3I8aTspe3ZhciBvPXIraT4+PjE7dChuW29dLGUpPjA/aT1vOnI9bysxfXJldHVybiByfX19dmFyIHI9ZShuKSxpPXIucmlnaHQsbz1yLmxlZnQ7ZnVuY3Rpb24gYSh0LG4pe3JldHVyblt0LG5dfWZ1bmN0aW9uIHUodCl7cmV0dXJuIG51bGw9PT10P05hTjordH1mdW5jdGlvbiBmKHQsbil7dmFyIGUscixpPXQubGVuZ3RoLG89MCxhPS0xLGY9MCxjPTA7aWYobnVsbD09bilmb3IoOysrYTxpOylpc05hTihlPXUodFthXSkpfHwoYys9KHI9ZS1mKSooZS0oZis9ci8rK28pKSk7ZWxzZSBmb3IoOysrYTxpOylpc05hTihlPXUobih0W2FdLGEsdCkpKXx8KGMrPShyPWUtZikqKGUtKGYrPXIvKytvKSkpO2lmKG8+MSlyZXR1cm4gYy8oby0xKX1mdW5jdGlvbiBjKHQsbil7dmFyIGU9Zih0LG4pO3JldHVybiBlP01hdGguc3FydChlKTplfWZ1bmN0aW9uIHModCxuKXt2YXIgZSxyLGksbz10Lmxlbmd0aCxhPS0xO2lmKG51bGw9PW4pe2Zvcig7KythPG87KWlmKG51bGwhPShlPXRbYV0pJiZlPj1lKWZvcihyPWk9ZTsrK2E8bzspbnVsbCE9KGU9dFthXSkmJihyPmUmJihyPWUpLGk8ZSYmKGk9ZSkpfWVsc2UgZm9yKDsrK2E8bzspaWYobnVsbCE9KGU9bih0W2FdLGEsdCkpJiZlPj1lKWZvcihyPWk9ZTsrK2E8bzspbnVsbCE9KGU9bih0W2FdLGEsdCkpJiYocj5lJiYocj1lKSxpPGUmJihpPWUpKTtyZXR1cm5bcixpXX12YXIgbD1BcnJheS5wcm90b3R5cGUsaD1sLnNsaWNlLGQ9bC5tYXA7ZnVuY3Rpb24gcCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gdih0KXtyZXR1cm4gdH1mdW5jdGlvbiBnKHQsbixlKXt0PSt0LG49K24sZT0oaT1hcmd1bWVudHMubGVuZ3RoKTwyPyhuPXQsdD0wLDEpOmk8Mz8xOitlO2Zvcih2YXIgcj0tMSxpPTB8TWF0aC5tYXgoMCxNYXRoLmNlaWwoKG4tdCkvZSkpLG89bmV3IEFycmF5KGkpOysrcjxpOylvW3JdPXQrciplO3JldHVybiBvfXZhciB5PU1hdGguc3FydCg1MCksXz1NYXRoLnNxcnQoMTApLGI9TWF0aC5zcXJ0KDIpO2Z1bmN0aW9uIG0odCxuLGUpe3ZhciByLGksbyxhLHU9LTE7aWYoZT0rZSwodD0rdCk9PT0obj0rbikmJmU+MClyZXR1cm5bdF07aWYoKHI9bjx0KSYmKGk9dCx0PW4sbj1pKSwwPT09KGE9eCh0LG4sZSkpfHwhaXNGaW5pdGUoYSkpcmV0dXJuW107aWYoYT4wKWZvcih0PU1hdGguY2VpbCh0L2EpLG49TWF0aC5mbG9vcihuL2EpLG89bmV3IEFycmF5KGk9TWF0aC5jZWlsKG4tdCsxKSk7Kyt1PGk7KW9bdV09KHQrdSkqYTtlbHNlIGZvcih0PU1hdGguZmxvb3IodCphKSxuPU1hdGguY2VpbChuKmEpLG89bmV3IEFycmF5KGk9TWF0aC5jZWlsKHQtbisxKSk7Kyt1PGk7KW9bdV09KHQtdSkvYTtyZXR1cm4gciYmby5yZXZlcnNlKCksb31mdW5jdGlvbiB4KHQsbixlKXt2YXIgcj0obi10KS9NYXRoLm1heCgwLGUpLGk9TWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMTApLG89ci9NYXRoLnBvdygxMCxpKTtyZXR1cm4gaT49MD8obz49eT8xMDpvPj1fPzU6bz49Yj8yOjEpKk1hdGgucG93KDEwLGkpOi1NYXRoLnBvdygxMCwtaSkvKG8+PXk/MTA6bz49Xz81Om8+PWI/MjoxKX1mdW5jdGlvbiB3KHQsbixlKXt2YXIgcj1NYXRoLmFicyhuLXQpL01hdGgubWF4KDAsZSksaT1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKHIpL01hdGguTE4xMCkpLG89ci9pO3JldHVybiBvPj15P2kqPTEwOm8+PV8/aSo9NTpvPj1iJiYoaSo9Miksbjx0Py1pOml9ZnVuY3Rpb24gTSh0KXtyZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nKHQubGVuZ3RoKS9NYXRoLkxOMikrMX1mdW5jdGlvbiBBKHQsbixlKXtpZihudWxsPT1lJiYoZT11KSxyPXQubGVuZ3RoKXtpZigobj0rbik8PTB8fHI8MilyZXR1cm4rZSh0WzBdLDAsdCk7aWYobj49MSlyZXR1cm4rZSh0W3ItMV0sci0xLHQpO3ZhciByLGk9KHItMSkqbixvPU1hdGguZmxvb3IoaSksYT0rZSh0W29dLG8sdCk7cmV0dXJuIGErKCtlKHRbbysxXSxvKzEsdCktYSkqKGktbyl9fWZ1bmN0aW9uIFQodCxuKXt2YXIgZSxyLGk9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1uKXtmb3IoOysrbzxpOylpZihudWxsIT0oZT10W29dKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT10W29dKSYmZT5yJiYocj1lKX1lbHNlIGZvcig7KytvPGk7KWlmKG51bGwhPShlPW4odFtvXSxvLHQpKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT1uKHRbb10sbyx0KSkmJmU+ciYmKHI9ZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gTih0KXtmb3IodmFyIG4sZSxyLGk9dC5sZW5ndGgsbz0tMSxhPTA7KytvPGk7KWErPXRbb10ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShhKTstLWk+PTA7KWZvcihuPShyPXRbaV0pLmxlbmd0aDstLW4+PTA7KWVbLS1hXT1yW25dO3JldHVybiBlfWZ1bmN0aW9uIFModCxuKXt2YXIgZSxyLGk9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1uKXtmb3IoOysrbzxpOylpZihudWxsIT0oZT10W29dKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT10W29dKSYmcj5lJiYocj1lKX1lbHNlIGZvcig7KytvPGk7KWlmKG51bGwhPShlPW4odFtvXSxvLHQpKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT1uKHRbb10sbyx0KSkmJnI+ZSYmKHI9ZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gRSh0KXtpZighKGk9dC5sZW5ndGgpKXJldHVybltdO2Zvcih2YXIgbj0tMSxlPVModCxrKSxyPW5ldyBBcnJheShlKTsrK248ZTspZm9yKHZhciBpLG89LTEsYT1yW25dPW5ldyBBcnJheShpKTsrK288aTspYVtvXT10W29dW25dO3JldHVybiByfWZ1bmN0aW9uIGsodCl7cmV0dXJuIHQubGVuZ3RofXZhciBDPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBQKHQpe3JldHVybiB0fXZhciB6PTEsUj0yLEw9MyxEPTQsVT0xZS02O2Z1bmN0aW9uIHEodCl7cmV0dXJuInRyYW5zbGF0ZSgiKyh0Ky41KSsiLDApIn1mdW5jdGlvbiBPKHQpe3JldHVybiJ0cmFuc2xhdGUoMCwiKyh0Ky41KSsiKSJ9ZnVuY3Rpb24gWSgpe3JldHVybiF0aGlzLl9fYXhpc31mdW5jdGlvbiBCKHQsbil7dmFyIGU9W10scj1udWxsLGk9bnVsbCxvPTYsYT02LHU9MyxmPXQ9PT16fHx0PT09RD8tMToxLGM9dD09PUR8fHQ9PT1SPyJ4IjoieSIscz10PT09enx8dD09PUw/cTpPO2Z1bmN0aW9uIGwobCl7dmFyIGg9bnVsbD09cj9uLnRpY2tzP24udGlja3MuYXBwbHkobixlKTpuLmRvbWFpbigpOnIsZD1udWxsPT1pP24udGlja0Zvcm1hdD9uLnRpY2tGb3JtYXQuYXBwbHkobixlKTpQOmkscD1NYXRoLm1heChvLDApK3Usdj1uLnJhbmdlKCksZz0rdlswXSsuNSx5PSt2W3YubGVuZ3RoLTFdKy41LF89KG4uYmFuZHdpZHRoP2Z1bmN0aW9uKHQpe3ZhciBuPU1hdGgubWF4KDAsdC5iYW5kd2lkdGgoKS0xKS8yO3JldHVybiB0LnJvdW5kKCkmJihuPU1hdGgucm91bmQobikpLGZ1bmN0aW9uKGUpe3JldHVybit0KGUpK259fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuK3Qobil9fSkobi5jb3B5KCkpLGI9bC5zZWxlY3Rpb24/bC5zZWxlY3Rpb24oKTpsLG09Yi5zZWxlY3RBbGwoIi5kb21haW4iKS5kYXRhKFtudWxsXSkseD1iLnNlbGVjdEFsbCgiLnRpY2siKS5kYXRhKGgsbikub3JkZXIoKSx3PXguZXhpdCgpLE09eC5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwidGljayIpLEE9eC5zZWxlY3QoImxpbmUiKSxUPXguc2VsZWN0KCJ0ZXh0Iik7bT1tLm1lcmdlKG0uZW50ZXIoKS5pbnNlcnQoInBhdGgiLCIudGljayIpLmF0dHIoImNsYXNzIiwiZG9tYWluIikuYXR0cigic3Ryb2tlIiwiY3VycmVudENvbG9yIikpLHg9eC5tZXJnZShNKSxBPUEubWVyZ2UoTS5hcHBlbmQoImxpbmUiKS5hdHRyKCJzdHJva2UiLCJjdXJyZW50Q29sb3IiKS5hdHRyKGMrIjIiLGYqbykpLFQ9VC5tZXJnZShNLmFwcGVuZCgidGV4dCIpLmF0dHIoImZpbGwiLCJjdXJyZW50Q29sb3IiKS5hdHRyKGMsZipwKS5hdHRyKCJkeSIsdD09PXo/IjBlbSI6dD09PUw/IjAuNzFlbSI6IjAuMzJlbSIpKSxsIT09YiYmKG09bS50cmFuc2l0aW9uKGwpLHg9eC50cmFuc2l0aW9uKGwpLEE9QS50cmFuc2l0aW9uKGwpLFQ9VC50cmFuc2l0aW9uKGwpLHc9dy50cmFuc2l0aW9uKGwpLmF0dHIoIm9wYWNpdHkiLFUpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9Xyh0KSk/cyh0KTp0aGlzLmdldEF0dHJpYnV0ZSgidHJhbnNmb3JtIil9KSxNLmF0dHIoIm9wYWNpdHkiLFUpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7dmFyIG49dGhpcy5wYXJlbnROb2RlLl9fYXhpcztyZXR1cm4gcyhuJiZpc0Zpbml0ZShuPW4odCkpP246Xyh0KSl9KSksdy5yZW1vdmUoKSxtLmF0dHIoImQiLHQ9PT1EfHx0PT1SP2E/Ik0iK2YqYSsiLCIrZysiSDAuNVYiK3krIkgiK2YqYToiTTAuNSwiK2crIlYiK3k6YT8iTSIrZysiLCIrZiphKyJWMC41SCIreSsiViIrZiphOiJNIitnKyIsMC41SCIreSkseC5hdHRyKCJvcGFjaXR5IiwxKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybiBzKF8odCkpfSksQS5hdHRyKGMrIjIiLGYqbyksVC5hdHRyKGMsZipwKS50ZXh0KGQpLGIuZmlsdGVyKFkpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigiZm9udC1zaXplIiwxMCkuYXR0cigiZm9udC1mYW1pbHkiLCJzYW5zLXNlcmlmIikuYXR0cigidGV4dC1hbmNob3IiLHQ9PT1SPyJzdGFydCI6dD09PUQ/ImVuZCI6Im1pZGRsZSIpLGIuZWFjaChmdW5jdGlvbigpe3RoaXMuX19heGlzPV99KX1yZXR1cm4gbC5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGwpOm59LGwudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gZT1DLmNhbGwoYXJndW1lbnRzKSxsfSxsLnRpY2tBcmd1bWVudHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9bXTpDLmNhbGwodCksbCk6ZS5zbGljZSgpfSxsLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09dD9udWxsOkMuY2FsbCh0KSxsKTpyJiZyLnNsaWNlKCl9LGwudGlja0Zvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LGwpOml9LGwudGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89YT0rdCxsKTpvfSxsLnRpY2tTaXplSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3QsbCk6b30sbC50aWNrU2l6ZU91dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSt0LGwpOmF9LGwudGlja1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9K3QsbCk6dX0sbH12YXIgRj17dmFsdWU6ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBJKCl7Zm9yKHZhciB0LG49MCxlPWFyZ3VtZW50cy5sZW5ndGgscj17fTtuPGU7KytuKXtpZighKHQ9YXJndW1lbnRzW25dKyIiKXx8dCBpbiByKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO3JbdF09W119cmV0dXJuIG5ldyBIKHIpfWZ1bmN0aW9uIEgodCl7dGhpcy5fPXR9ZnVuY3Rpb24gaih0LG4pe2Zvcih2YXIgZSxyPTAsaT10Lmxlbmd0aDtyPGk7KytyKWlmKChlPXRbcl0pLm5hbWU9PT1uKXJldHVybiBlLnZhbHVlfWZ1bmN0aW9uIFgodCxuLGUpe2Zvcih2YXIgcj0wLGk9dC5sZW5ndGg7cjxpOysrcilpZih0W3JdLm5hbWU9PT1uKXt0W3JdPUYsdD10LnNsaWNlKDAscikuY29uY2F0KHQuc2xpY2UocisxKSk7YnJlYWt9cmV0dXJuIG51bGwhPWUmJnQucHVzaCh7bmFtZTpuLHZhbHVlOmV9KSx0fUgucHJvdG90eXBlPUkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpILG9uOmZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXRoaXMuXyxvPShyPWksKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIG49IiIsZT10LmluZGV4T2YoIi4iKTtpZihlPj0wJiYobj10LnNsaWNlKGUrMSksdD10LnNsaWNlKDAsZSkpLHQmJiFyLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO3JldHVybnt0eXBlOnQsbmFtZTpufX0pKSxhPS0xLHU9by5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1uJiYiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrbik7Zm9yKDsrK2E8dTspaWYoZT0odD1vW2FdKS50eXBlKWlbZV09WChpW2VdLHQubmFtZSxuKTtlbHNlIGlmKG51bGw9PW4pZm9yKGUgaW4gaSlpW2VdPVgoaVtlXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK2E8dTspaWYoKGU9KHQ9b1thXSkudHlwZSkmJihlPWooaVtlXSx0Lm5hbWUpKSlyZXR1cm4gZX0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LG49dGhpcy5fO2Zvcih2YXIgZSBpbiBuKXRbZV09bltlXS5zbGljZSgpO3JldHVybiBuZXcgSCh0KX0sY2FsbDpmdW5jdGlvbih0LG4pe2lmKChlPWFyZ3VtZW50cy5sZW5ndGgtMik+MClmb3IodmFyIGUscixpPW5ldyBBcnJheShlKSxvPTA7bzxlOysrbylpW29dPWFyZ3VtZW50c1tvKzJdO2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKG89MCxlPShyPXRoaXMuX1t0XSkubGVuZ3RoO288ZTsrK28pcltvXS52YWx1ZS5hcHBseShuLGkpfSxhcHBseTpmdW5jdGlvbih0LG4sZSl7aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3IodmFyIHI9dGhpcy5fW3RdLGk9MCxvPXIubGVuZ3RoO2k8bzsrK2kpcltpXS52YWx1ZS5hcHBseShuLGUpfX07dmFyIEc9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLFY9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOkcseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTtmdW5jdGlvbiAkKHQpe3ZhciBuPXQrPSIiLGU9bi5pbmRleE9mKCI6Iik7cmV0dXJuIGU+PTAmJiJ4bWxucyIhPT0obj10LnNsaWNlKDAsZSkpJiYodD10LnNsaWNlKGUrMSkpLFYuaGFzT3duUHJvcGVydHkobik/e3NwYWNlOlZbbl0sbG9jYWw6dH06dH1mdW5jdGlvbiBXKHQpe3ZhciBuPSQodCk7cmV0dXJuKG4ubG9jYWw/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlModC5zcGFjZSx0LmxvY2FsKX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMub3duZXJEb2N1bWVudCxlPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBlPT09RyYmbi5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJPT09Rz9uLmNyZWF0ZUVsZW1lbnQodCk6bi5jcmVhdGVFbGVtZW50TlMoZSx0KX19KShuKX1mdW5jdGlvbiBaKCl7fWZ1bmN0aW9uIFEodCl7cmV0dXJuIG51bGw9PXQ/WjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IodCl9fWZ1bmN0aW9uIEooKXtyZXR1cm5bXX1mdW5jdGlvbiBLKHQpe3JldHVybiBudWxsPT10P0o6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHQpfX12YXIgdHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2hlcyh0KX19O2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpe3ZhciBudD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7aWYoIW50Lm1hdGNoZXMpe3ZhciBldD1udC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG50Lm1zTWF0Y2hlc1NlbGVjdG9yfHxudC5tb3pNYXRjaGVzU2VsZWN0b3J8fG50Lm9NYXRjaGVzU2VsZWN0b3I7dHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGV0LmNhbGwodGhpcyx0KX19fX12YXIgcnQ9dHQ7ZnVuY3Rpb24gaXQodCl7cmV0dXJuIG5ldyBBcnJheSh0Lmxlbmd0aCl9ZnVuY3Rpb24gb3QodCxuKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPW59b3QucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpvdCxhcHBlbmRDaGlsZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LHRoaXMuX25leHQpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LG4pfSxxdWVyeVNlbGVjdG9yOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3Rvcih0KX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCl9fTt2YXIgYXQ9IiQiO2Z1bmN0aW9uIHV0KHQsbixlLHIsaSxvKXtmb3IodmFyIGEsdT0wLGY9bi5sZW5ndGgsYz1vLmxlbmd0aDt1PGM7Kyt1KShhPW5bdV0pPyhhLl9fZGF0YV9fPW9bdV0sclt1XT1hKTplW3VdPW5ldyBvdCh0LG9bdV0pO2Zvcig7dTxmOysrdSkoYT1uW3VdKSYmKGlbdV09YSl9ZnVuY3Rpb24gZnQodCxuLGUscixpLG8sYSl7dmFyIHUsZixjLHM9e30sbD1uLmxlbmd0aCxoPW8ubGVuZ3RoLGQ9bmV3IEFycmF5KGwpO2Zvcih1PTA7dTxsOysrdSkoZj1uW3VdKSYmKGRbdV09Yz1hdCthLmNhbGwoZixmLl9fZGF0YV9fLHUsbiksYyBpbiBzP2lbdV09ZjpzW2NdPWYpO2Zvcih1PTA7dTxoOysrdSkoZj1zW2M9YXQrYS5jYWxsKHQsb1t1XSx1LG8pXSk/KHJbdV09ZixmLl9fZGF0YV9fPW9bdV0sc1tjXT1udWxsKTplW3VdPW5ldyBvdCh0LG9bdV0pO2Zvcih1PTA7dTxsOysrdSkoZj1uW3VdKSYmc1tkW3VdXT09PWYmJihpW3VdPWYpfWZ1bmN0aW9uIGN0KHQsbil7cmV0dXJuIHQ8bj8tMTp0Pm4/MTp0Pj1uPzA6TmFOfWZ1bmN0aW9uIHN0KHQpe3JldHVybiB0Lm93bmVyRG9jdW1lbnQmJnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8dC5kb2N1bWVudCYmdHx8dC5kZWZhdWx0Vmlld31mdW5jdGlvbiBsdCh0LG4pe3JldHVybiB0LnN0eWxlLmdldFByb3BlcnR5VmFsdWUobil8fHN0KHQpLmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pfWZ1bmN0aW9uIGh0KHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiBkdCh0KXtyZXR1cm4gdC5jbGFzc0xpc3R8fG5ldyBwdCh0KX1mdW5jdGlvbiBwdCh0KXt0aGlzLl9ub2RlPXQsdGhpcy5fbmFtZXM9aHQodC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX1mdW5jdGlvbiB2dCh0LG4pe2Zvcih2YXIgZT1kdCh0KSxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KWUuYWRkKG5bcl0pfWZ1bmN0aW9uIGd0KHQsbil7Zm9yKHZhciBlPWR0KHQpLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspZS5yZW1vdmUobltyXSl9ZnVuY3Rpb24geXQoKXt0aGlzLnRleHRDb250ZW50PSIifWZ1bmN0aW9uIF90KCl7dGhpcy5pbm5lckhUTUw9IiJ9ZnVuY3Rpb24gYnQoKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gbXQoKXt0aGlzLnByZXZpb3VzU2libGluZyYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKX1mdW5jdGlvbiB4dCgpe3JldHVybiBudWxsfWZ1bmN0aW9uIHd0KCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gTXQoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZSghMSksdGhpcy5uZXh0U2libGluZyl9ZnVuY3Rpb24gQXQoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZSghMCksdGhpcy5uZXh0U2libGluZyl9cHQucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtuPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKG4sMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgVHQ9e307KHQuZXZlbnQ9bnVsbCwidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KSYmKCJvbm1vdXNlZW50ZXIiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHwoVHQ9e21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSkpO2Z1bmN0aW9uIE50KHQsbixlKXtyZXR1cm4gdD1TdCh0LG4sZSksZnVuY3Rpb24obil7dmFyIGU9bi5yZWxhdGVkVGFyZ2V0O2UmJihlPT09dGhpc3x8OCZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpKXx8dC5jYWxsKHRoaXMsbil9fWZ1bmN0aW9uIFN0KG4sZSxyKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIG89dC5ldmVudDt0LmV2ZW50PWk7dHJ5e24uY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZSxyKX1maW5hbGx5e3QuZXZlbnQ9b319fWZ1bmN0aW9uIEV0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMuX19vbjtpZihuKXtmb3IodmFyIGUscj0wLGk9LTEsbz1uLmxlbmd0aDtyPG87KytyKWU9bltyXSx0LnR5cGUmJmUudHlwZSE9PXQudHlwZXx8ZS5uYW1lIT09dC5uYW1lP25bKytpXT1lOnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLnR5cGUsZS5saXN0ZW5lcixlLmNhcHR1cmUpOysraT9uLmxlbmd0aD1pOmRlbGV0ZSB0aGlzLl9fb259fX1mdW5jdGlvbiBrdCh0LG4sZSl7dmFyIHI9VHQuaGFzT3duUHJvcGVydHkodC50eXBlKT9OdDpTdDtyZXR1cm4gZnVuY3Rpb24oaSxvLGEpe3ZhciB1LGY9dGhpcy5fX29uLGM9cihuLG8sYSk7aWYoZilmb3IodmFyIHM9MCxsPWYubGVuZ3RoO3M8bDsrK3MpaWYoKHU9ZltzXSkudHlwZT09PXQudHlwZSYmdS5uYW1lPT09dC5uYW1lKXJldHVybiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodS50eXBlLHUubGlzdGVuZXIsdS5jYXB0dXJlKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIodS50eXBlLHUubGlzdGVuZXI9Yyx1LmNhcHR1cmU9ZSksdm9pZCh1LnZhbHVlPW4pO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LnR5cGUsYyxlKSx1PXt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSx2YWx1ZTpuLGxpc3RlbmVyOmMsY2FwdHVyZTplfSxmP2YucHVzaCh1KTp0aGlzLl9fb249W3VdfX1mdW5jdGlvbiBDdChuLGUscixpKXt2YXIgbz10LmV2ZW50O24uc291cmNlRXZlbnQ9dC5ldmVudCx0LmV2ZW50PW47dHJ5e3JldHVybiBlLmFwcGx5KHIsaSl9ZmluYWxseXt0LmV2ZW50PW99fWZ1bmN0aW9uIFB0KHQsbixlKXt2YXIgcj1zdCh0KSxpPXIuQ3VzdG9tRXZlbnQ7ImZ1bmN0aW9uIj09dHlwZW9mIGk/aT1uZXcgaShuLGUpOihpPXIuZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZT8oaS5pbml0RXZlbnQobixlLmJ1YmJsZXMsZS5jYW5jZWxhYmxlKSxpLmRldGFpbD1lLmRldGFpbCk6aS5pbml0RXZlbnQobiwhMSwhMSkpLHQuZGlzcGF0Y2hFdmVudChpKX12YXIgenQ9W251bGxdO2Z1bmN0aW9uIFJ0KHQsbil7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1ufWZ1bmN0aW9uIEx0KCl7cmV0dXJuIG5ldyBSdChbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLHp0KX1mdW5jdGlvbiBEdCh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFJ0KFtbZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0KV1dLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgUnQoW1t0XV0senQpfVJ0LnByb3RvdHlwZT1MdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlJ0LHNlbGVjdDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9USh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyxhLHU9bltpXSxmPXUubGVuZ3RoLGM9cltpXT1uZXcgQXJyYXkoZikscz0wO3M8ZjsrK3MpKG89dVtzXSkmJihhPXQuY2FsbChvLG8uX19kYXRhX18scyx1KSkmJigiX19kYXRhX18iaW4gbyYmKGEuX19kYXRhX189by5fX2RhdGFfXyksY1tzXT1hKTtyZXR1cm4gbmV3IFJ0KHIsdGhpcy5fcGFyZW50cyl9LHNlbGVjdEFsbDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9Syh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9W10saT1bXSxvPTA7bzxlOysrbylmb3IodmFyIGEsdT1uW29dLGY9dS5sZW5ndGgsYz0wO2M8ZjsrK2MpKGE9dVtjXSkmJihyLnB1c2godC5jYWxsKGEsYS5fX2RhdGFfXyxjLHUpKSxpLnB1c2goYSkpO3JldHVybiBuZXcgUnQocixpKX0sZmlsdGVyOmZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1ydCh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyxhPW5baV0sdT1hLmxlbmd0aCxmPXJbaV09W10sYz0wO2M8dTsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmZi5wdXNoKG8pO3JldHVybiBuZXcgUnQocix0aGlzLl9wYXJlbnRzKX0sZGF0YTpmdW5jdGlvbih0LG4pe2lmKCF0KXJldHVybiBwPW5ldyBBcnJheSh0aGlzLnNpemUoKSkscz0tMSx0aGlzLmVhY2goZnVuY3Rpb24odCl7cFsrK3NdPXR9KSxwO3ZhciBlLHI9bj9mdDp1dCxpPXRoaXMuX3BhcmVudHMsbz10aGlzLl9ncm91cHM7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJihlPXQsdD1mdW5jdGlvbigpe3JldHVybiBlfSk7Zm9yKHZhciBhPW8ubGVuZ3RoLHU9bmV3IEFycmF5KGEpLGY9bmV3IEFycmF5KGEpLGM9bmV3IEFycmF5KGEpLHM9MDtzPGE7KytzKXt2YXIgbD1pW3NdLGg9b1tzXSxkPWgubGVuZ3RoLHA9dC5jYWxsKGwsbCYmbC5fX2RhdGFfXyxzLGkpLHY9cC5sZW5ndGgsZz1mW3NdPW5ldyBBcnJheSh2KSx5PXVbc109bmV3IEFycmF5KHYpO3IobCxoLGcseSxjW3NdPW5ldyBBcnJheShkKSxwLG4pO2Zvcih2YXIgXyxiLG09MCx4PTA7bTx2OysrbSlpZihfPWdbbV0pe2ZvcihtPj14JiYoeD1tKzEpOyEoYj15W3hdKSYmKyt4PHY7KTtfLl9uZXh0PWJ8fG51bGx9fXJldHVybih1PW5ldyBSdCh1LGkpKS5fZW50ZXI9Zix1Ll9leGl0PWMsdX0sZW50ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFJ0KHRoaXMuX2VudGVyfHx0aGlzLl9ncm91cHMubWFwKGl0KSx0aGlzLl9wYXJlbnRzKX0sZXhpdDpmdW5jdGlvbigpe3JldHVybiBuZXcgUnQodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChpdCksdGhpcy5fcGFyZW50cyl9LG1lcmdlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT10Ll9ncm91cHMscj1uLmxlbmd0aCxpPWUubGVuZ3RoLG89TWF0aC5taW4ocixpKSxhPW5ldyBBcnJheShyKSx1PTA7dTxvOysrdSlmb3IodmFyIGYsYz1uW3VdLHM9ZVt1XSxsPWMubGVuZ3RoLGg9YVt1XT1uZXcgQXJyYXkobCksZD0wO2Q8bDsrK2QpKGY9Y1tkXXx8c1tkXSkmJihoW2RdPWYpO2Zvcig7dTxyOysrdSlhW3VdPW5bdV07cmV0dXJuIG5ldyBSdChhLHRoaXMuX3BhcmVudHMpfSxvcmRlcjpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsbj0tMSxlPXQubGVuZ3RoOysrbjxlOylmb3IodmFyIHIsaT10W25dLG89aS5sZW5ndGgtMSxhPWlbb107LS1vPj0wOykocj1pW29dKSYmKGEmJmEhPT1yLm5leHRTaWJsaW5nJiZhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHIsYSksYT1yKTtyZXR1cm4gdGhpc30sc29ydDpmdW5jdGlvbih0KXtmdW5jdGlvbiBuKG4sZSl7cmV0dXJuIG4mJmU/dChuLl9fZGF0YV9fLGUuX19kYXRhX18pOiFuLSFlfXR8fCh0PWN0KTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLHI9ZS5sZW5ndGgsaT1uZXcgQXJyYXkociksbz0wO288cjsrK28pe2Zvcih2YXIgYSx1PWVbb10sZj11Lmxlbmd0aCxjPWlbb109bmV3IEFycmF5KGYpLHM9MDtzPGY7KytzKShhPXVbc10pJiYoY1tzXT1hKTtjLnNvcnQobil9cmV0dXJuIG5ldyBSdChpLHRoaXMuX3BhcmVudHMpLm9yZGVyKCl9LGNhbGw6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGFyZ3VtZW50c1swXT10aGlzLHQuYXBwbHkobnVsbCxhcmd1bWVudHMpLHRoaXN9LG5vZGVzOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSxuPS0xO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0Wysrbl09dGhpc30pLHR9LG5vZGU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLG49MCxlPXQubGVuZ3RoO248ZTsrK24pZm9yKHZhciByPXRbbl0saT0wLG89ci5sZW5ndGg7aTxvOysraSl7dmFyIGE9cltpXTtpZihhKXJldHVybiBhfXJldHVybiBudWxsfSxzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Kyt0fSksdH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5ub2RlKCl9LGVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPTAscj1uLmxlbmd0aDtlPHI7KytlKWZvcih2YXIgaSxvPW5bZV0sYT0wLHU9by5sZW5ndGg7YTx1OysrYSkoaT1vW2FdKSYmdC5jYWxsKGksaS5fX2RhdGFfXyxhLG8pO3JldHVybiB0aGlzfSxhdHRyOmZ1bmN0aW9uKHQsbil7dmFyIGU9JCh0KTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciByPXRoaXMubm9kZSgpO3JldHVybiBlLmxvY2FsP3IuZ2V0QXR0cmlidXRlTlMoZS5zcGFjZSxlLmxvY2FsKTpyLmdldEF0dHJpYnV0ZShlKX1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1uP2UubG9jYWw/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fToiZnVuY3Rpb24iPT10eXBlb2Ygbj9lLmxvY2FsP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk6dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsZSl9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCk6dGhpcy5zZXRBdHRyaWJ1dGUodCxlKX19OmUubG9jYWw/ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxuKX19OmZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUodCxuKX19KShlLG4pKX0sc3R5bGU6ZnVuY3Rpb24odCxuLGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKChudWxsPT1uP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fToiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0LG4sZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09cj90aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpOnRoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxyLGUpfX06ZnVuY3Rpb24odCxuLGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxuLGUpfX0pKHQsbixudWxsPT1lPyIiOmUpKTpsdCh0aGlzLm5vZGUoKSx0KX0scHJvcGVydHk6ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t0XX19OiJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT9kZWxldGUgdGhpc1t0XTp0aGlzW3RdPWV9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXNbdF09bn19KSh0LG4pKTp0aGlzLm5vZGUoKVt0XX0sY2xhc3NlZDpmdW5jdGlvbih0LG4pe3ZhciBlPWh0KHQrIiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciByPWR0KHRoaXMubm9kZSgpKSxpPS0xLG89ZS5sZW5ndGg7KytpPG87KWlmKCFyLmNvbnRhaW5zKGVbaV0pKXJldHVybiExO3JldHVybiEwfXJldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7KG4uYXBwbHkodGhpcyxhcmd1bWVudHMpP3Z0Omd0KSh0aGlzLHQpfX06bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2dCh0aGlzLHQpfX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7Z3QodGhpcyx0KX19KShlLG4pKX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD95dDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT1uPyIiOm59fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fSkodCkpOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxodG1sOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P190OigiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT1uPyIiOm59fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD10fX0pKHQpKTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LHJhaXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChidCl9LGxvd2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChtdCl9LGFwcGVuZDpmdW5jdGlvbih0KXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlcodCk7cmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LGluc2VydDpmdW5jdGlvbih0LG4pe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Vyh0KSxyPW51bGw9PW4/eHQ6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRKG4pO3JldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8bnVsbCl9KX0scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaCh3dCl9LGNsb25lOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNlbGVjdCh0P0F0Ok10KX0sZGF0dW06ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLHQpOnRoaXMubm9kZSgpLl9fZGF0YV9ffSxvbjpmdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvPWZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIG49IiIsZT10LmluZGV4T2YoIi4iKTtyZXR1cm4gZT49MCYmKG49dC5zbGljZShlKzEpLHQ9dC5zbGljZSgwLGUpKSx7dHlwZTp0LG5hbWU6bn19KX0odCsiIiksYT1vLmxlbmd0aDtpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2Zvcih1PW4/a3Q6RXQsbnVsbD09ZSYmKGU9ITEpLHI9MDtyPGE7KytyKXRoaXMuZWFjaCh1KG9bcl0sbixlKSk7cmV0dXJuIHRoaXN9dmFyIHU9dGhpcy5ub2RlKCkuX19vbjtpZih1KWZvcih2YXIgZixjPTAscz11Lmxlbmd0aDtjPHM7KytjKWZvcihyPTAsZj11W2NdO3I8YTsrK3IpaWYoKGk9b1tyXSkudHlwZT09PWYudHlwZSYmaS5uYW1lPT09Zi5uYW1lKXJldHVybiBmLnZhbHVlfSxkaXNwYXRjaDpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIFB0KHRoaXMsdCxuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBQdCh0aGlzLHQsbil9fSkodCxuKSl9fTt2YXIgVXQ9MDtmdW5jdGlvbiBxdCgpe3JldHVybiBuZXcgT3R9ZnVuY3Rpb24gT3QoKXt0aGlzLl89IkAiKygrK1V0KS50b1N0cmluZygzNil9ZnVuY3Rpb24gWXQoKXtmb3IodmFyIG4sZT10LmV2ZW50O249ZS5zb3VyY2VFdmVudDspZT1uO3JldHVybiBlfWZ1bmN0aW9uIEJ0KHQsbil7dmFyIGU9dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYoZS5jcmVhdGVTVkdQb2ludCl7dmFyIHI9ZS5jcmVhdGVTVkdQb2ludCgpO3JldHVybiByLng9bi5jbGllbnRYLHIueT1uLmNsaWVudFksWyhyPXIubWF0cml4VHJhbnNmb3JtKHQuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSkueCxyLnldfXZhciBpPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW24uY2xpZW50WC1pLmxlZnQtdC5jbGllbnRMZWZ0LG4uY2xpZW50WS1pLnRvcC10LmNsaWVudFRvcF19ZnVuY3Rpb24gRnQodCl7dmFyIG49WXQoKTtyZXR1cm4gbi5jaGFuZ2VkVG91Y2hlcyYmKG49bi5jaGFuZ2VkVG91Y2hlc1swXSksQnQodCxuKX1mdW5jdGlvbiBJdCh0LG4sZSl7YXJndW1lbnRzLmxlbmd0aDwzJiYoZT1uLG49WXQoKS5jaGFuZ2VkVG91Y2hlcyk7Zm9yKHZhciByLGk9MCxvPW4/bi5sZW5ndGg6MDtpPG87KytpKWlmKChyPW5baV0pLmlkZW50aWZpZXI9PT1lKXJldHVybiBCdCh0LHIpO3JldHVybiBudWxsfWZ1bmN0aW9uIEh0KCl7dC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBqdCgpe3QuZXZlbnQucHJldmVudERlZmF1bHQoKSx0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIFh0KHQpe3ZhciBuPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGU9RHQodCkub24oImRyYWdzdGFydC5kcmFnIixqdCwhMCk7Im9uc2VsZWN0c3RhcnQiaW4gbj9lLm9uKCJzZWxlY3RzdGFydC5kcmFnIixqdCwhMCk6KG4uX19ub3NlbGVjdD1uLnN0eWxlLk1velVzZXJTZWxlY3Qsbi5zdHlsZS5Nb3pVc2VyU2VsZWN0PSJub25lIil9ZnVuY3Rpb24gR3QodCxuKXt2YXIgZT10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxyPUR0KHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIsbnVsbCk7biYmKHIub24oImNsaWNrLmRyYWciLGp0LCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5vbigiY2xpY2suZHJhZyIsbnVsbCl9LDApKSwib25zZWxlY3RzdGFydCJpbiBlP3Iub24oInNlbGVjdHN0YXJ0LmRyYWciLG51bGwpOihlLnN0eWxlLk1velVzZXJTZWxlY3Q9ZS5fX25vc2VsZWN0LGRlbGV0ZSBlLl9fbm9zZWxlY3QpfWZ1bmN0aW9uIFZ0KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiAkdCh0LG4sZSxyLGksbyxhLHUsZixjKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMuc3ViamVjdD1lLHRoaXMuaWRlbnRpZmllcj1yLHRoaXMuYWN0aXZlPWksdGhpcy54PW8sdGhpcy55PWEsdGhpcy5keD11LHRoaXMuZHk9Zix0aGlzLl89Y31mdW5jdGlvbiBXdCgpe3JldHVybiF0LmV2ZW50LmJ1dHRvbn1mdW5jdGlvbiBadCgpe3JldHVybiB0aGlzLnBhcmVudE5vZGV9ZnVuY3Rpb24gUXQobil7cmV0dXJuIG51bGw9PW4/e3g6dC5ldmVudC54LHk6dC5ldmVudC55fTpufWZ1bmN0aW9uIEp0KCl7cmV0dXJuIm9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIEt0KHQsbixlKXt0LnByb3RvdHlwZT1uLnByb3RvdHlwZT1lLGUuY29uc3RydWN0b3I9dH1mdW5jdGlvbiB0bih0LG4pe3ZhciBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpO2Zvcih2YXIgciBpbiBuKWVbcl09bltyXTtyZXR1cm4gZX1mdW5jdGlvbiBubigpe31PdC5wcm90b3R5cGU9cXQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpPdCxnZXQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuXzshKG4gaW4gdCk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybjtyZXR1cm4gdFtuXX0sc2V0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbdGhpcy5fXT1ufSxyZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuXyBpbiB0JiZkZWxldGUgdFt0aGlzLl9dfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl99fSwkdC5wcm90b3R5cGUub249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl8ub24uYXBwbHkodGhpcy5fLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT10aGlzLl8/dGhpczp0fTt2YXIgZW49IlxccyooWystXT9cXGQrKVxccyoiLHJuPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLG9uPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixhbj0vXiMoWzAtOWEtZl17M30pJC8sdW49L14jKFswLTlhLWZdezZ9KSQvLGZuPW5ldyBSZWdFeHAoIl5yZ2JcXCgiK1tlbixlbixlbl0rIlxcKSQiKSxjbj1uZXcgUmVnRXhwKCJecmdiXFwoIitbb24sb24sb25dKyJcXCkkIiksc249bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tlbixlbixlbixybl0rIlxcKSQiKSxsbj1uZXcgUmVnRXhwKCJecmdiYVxcKCIrW29uLG9uLG9uLHJuXSsiXFwpJCIpLGhuPW5ldyBSZWdFeHAoIl5oc2xcXCgiK1tybixvbixvbl0rIlxcKSQiKSxkbj1uZXcgUmVnRXhwKCJeaHNsYVxcKCIrW3JuLG9uLG9uLHJuXSsiXFwpJCIpLHBuPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O2Z1bmN0aW9uIHZuKHQpe3ZhciBuO3JldHVybiB0PSh0KyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwobj1hbi5leGVjKHQpKT9uZXcgbW4oKG49cGFyc2VJbnQoblsxXSwxNikpPj44JjE1fG4+PjQmMjQwLG4+PjQmMTV8MjQwJm4sKDE1Jm4pPDw0fDE1Jm4sMSk6KG49dW4uZXhlYyh0KSk/Z24ocGFyc2VJbnQoblsxXSwxNikpOihuPWZuLmV4ZWModCkpP25ldyBtbihuWzFdLG5bMl0sblszXSwxKToobj1jbi5leGVjKHQpKT9uZXcgbW4oMjU1Km5bMV0vMTAwLDI1NSpuWzJdLzEwMCwyNTUqblszXS8xMDAsMSk6KG49c24uZXhlYyh0KSk/eW4oblsxXSxuWzJdLG5bM10sbls0XSk6KG49bG4uZXhlYyh0KSk/eW4oMjU1Km5bMV0vMTAwLDI1NSpuWzJdLzEwMCwyNTUqblszXS8xMDAsbls0XSk6KG49aG4uZXhlYyh0KSk/d24oblsxXSxuWzJdLzEwMCxuWzNdLzEwMCwxKToobj1kbi5leGVjKHQpKT93bihuWzFdLG5bMl0vMTAwLG5bM10vMTAwLG5bNF0pOnBuLmhhc093blByb3BlcnR5KHQpP2duKHBuW3RdKToidHJhbnNwYXJlbnQiPT09dD9uZXcgbW4oTmFOLE5hTixOYU4sMCk6bnVsbH1mdW5jdGlvbiBnbih0KXtyZXR1cm4gbmV3IG1uKHQ+PjE2JjI1NSx0Pj44JjI1NSwyNTUmdCwxKX1mdW5jdGlvbiB5bih0LG4sZSxyKXtyZXR1cm4gcjw9MCYmKHQ9bj1lPU5hTiksbmV3IG1uKHQsbixlLHIpfWZ1bmN0aW9uIF9uKHQpe3JldHVybiB0IGluc3RhbmNlb2Ygbm58fCh0PXZuKHQpKSx0P25ldyBtbigodD10LnJnYigpKS5yLHQuZyx0LmIsdC5vcGFjaXR5KTpuZXcgbW59ZnVuY3Rpb24gYm4odCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP19uKHQpOm5ldyBtbih0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gbW4odCxuLGUscil7dGhpcy5yPSt0LHRoaXMuZz0rbix0aGlzLmI9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIHhuKHQpe3JldHVybigodD1NYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHQpfHwwKSkpPDE2PyIwIjoiIikrdC50b1N0cmluZygxNil9ZnVuY3Rpb24gd24odCxuLGUscil7cmV0dXJuIHI8PTA/dD1uPWU9TmFOOmU8PTB8fGU+PTE/dD1uPU5hTjpuPD0wJiYodD1OYU4pLG5ldyBBbih0LG4sZSxyKX1mdW5jdGlvbiBNbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIEFuKXJldHVybiBuZXcgQW4odC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2Ygbm58fCh0PXZuKHQpKSwhdClyZXR1cm4gbmV3IEFuO2lmKHQgaW5zdGFuY2VvZiBBbilyZXR1cm4gdDt2YXIgbj0odD10LnJnYigpKS5yLzI1NSxlPXQuZy8yNTUscj10LmIvMjU1LGk9TWF0aC5taW4obixlLHIpLG89TWF0aC5tYXgobixlLHIpLGE9TmFOLHU9by1pLGY9KG8raSkvMjtyZXR1cm4gdT8oYT1uPT09bz8oZS1yKS91KzYqKGU8cik6ZT09PW8/KHItbikvdSsyOihuLWUpL3UrNCx1Lz1mPC41P28raToyLW8taSxhKj02MCk6dT1mPjAmJmY8MT8wOmEsbmV3IEFuKGEsdSxmLHQub3BhY2l0eSl9KHQpOm5ldyBBbih0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gQW4odCxuLGUscil7dGhpcy5oPSt0LHRoaXMucz0rbix0aGlzLmw9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIFRuKHQsbixlKXtyZXR1cm4gMjU1Kih0PDYwP24rKGUtbikqdC82MDp0PDE4MD9lOnQ8MjQwP24rKGUtbikqKDI0MC10KS82MDpuKX1LdChubix2bix7ZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSxoZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5oZXgoKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKSsiIn19KSxLdChtbixibix0bihubix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8xLy43Ok1hdGgucG93KDEvLjcsdCksbmV3IG1uKHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyBtbih0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9dGhpcy5yJiZ0aGlzLnI8PTI1NSYmMDw9dGhpcy5nJiZ0aGlzLmc8PTI1NSYmMDw9dGhpcy5iJiZ0aGlzLmI8PTI1NSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGhleDpmdW5jdGlvbigpe3JldHVybiIjIit4bih0aGlzLnIpK3huKHRoaXMuZykreG4odGhpcy5iKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX19KSksS3QoQW4sTW4sdG4obm4se2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/MS8uNzpNYXRoLnBvdygxLy43LHQpLG5ldyBBbih0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyBBbih0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaCUzNjArMzYwKih0aGlzLmg8MCksbj1pc05hTih0KXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxlPXRoaXMubCxyPWUrKGU8LjU/ZToxLWUpKm4saT0yKmUtcjtyZXR1cm4gbmV3IG1uKFRuKHQ+PTI0MD90LTI0MDp0KzEyMCxpLHIpLFRuKHQsaSxyKSxUbih0PDEyMD90KzI0MDp0LTEyMCxpLHIpLHRoaXMub3BhY2l0eSl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfX0pKTt2YXIgTm49TWF0aC5QSS8xODAsU249MTgwL01hdGguUEksRW49Ljk2NDIyLGtuPTEsQ249LjgyNTIxLFBuPTQvMjksem49Ni8yOSxSbj0zKnpuKnpuLExuPXpuKnpuKnpuO2Z1bmN0aW9uIERuKHQpe2lmKHQgaW5zdGFuY2VvZiBxbilyZXR1cm4gbmV3IHFuKHQubCx0LmEsdC5iLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIGpuKXtpZihpc05hTih0LmgpKXJldHVybiBuZXcgcW4odC5sLDAsMCx0Lm9wYWNpdHkpO3ZhciBuPXQuaCpObjtyZXR1cm4gbmV3IHFuKHQubCxNYXRoLmNvcyhuKSp0LmMsTWF0aC5zaW4obikqdC5jLHQub3BhY2l0eSl9dCBpbnN0YW5jZW9mIG1ufHwodD1fbih0KSk7dmFyIGUscixpPUZuKHQuciksbz1Gbih0LmcpLGE9Rm4odC5iKSx1PU9uKCguMjIyNTA0NSppKy43MTY4Nzg2Km8rLjA2MDYxNjkqYSkva24pO3JldHVybiBpPT09byYmbz09PWE/ZT1yPXU6KGU9T24oKC40MzYwNzQ3KmkrLjM4NTA2NDkqbysuMTQzMDgwNCphKS9Fbikscj1PbigoLjAxMzkzMjIqaSsuMDk3MTA0NSpvKy43MTQxNzMzKmEpL0NuKSksbmV3IHFuKDExNip1LTE2LDUwMCooZS11KSwyMDAqKHUtciksdC5vcGFjaXR5KX1mdW5jdGlvbiBVbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/RG4odCk6bmV3IHFuKHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBxbih0LG4sZSxyKXt0aGlzLmw9K3QsdGhpcy5hPStuLHRoaXMuYj0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gT24odCl7cmV0dXJuIHQ+TG4/TWF0aC5wb3codCwxLzMpOnQvUm4rUG59ZnVuY3Rpb24gWW4odCl7cmV0dXJuIHQ+em4/dCp0KnQ6Um4qKHQtUG4pfWZ1bmN0aW9uIEJuKHQpe3JldHVybiAyNTUqKHQ8PS4wMDMxMzA4PzEyLjkyKnQ6MS4wNTUqTWF0aC5wb3codCwxLzIuNCktLjA1NSl9ZnVuY3Rpb24gRm4odCl7cmV0dXJuKHQvPTI1NSk8PS4wNDA0NT90LzEyLjkyOk1hdGgucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gSW4odCl7aWYodCBpbnN0YW5jZW9mIGpuKXJldHVybiBuZXcgam4odC5oLHQuYyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YgcW58fCh0PURuKHQpKSwwPT09dC5hJiYwPT09dC5iKXJldHVybiBuZXcgam4oTmFOLDAsdC5sLHQub3BhY2l0eSk7dmFyIG49TWF0aC5hdGFuMih0LmIsdC5hKSpTbjtyZXR1cm4gbmV3IGpuKG48MD9uKzM2MDpuLE1hdGguc3FydCh0LmEqdC5hK3QuYip0LmIpLHQubCx0Lm9wYWNpdHkpfWZ1bmN0aW9uIEhuKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Jbih0KTpuZXcgam4odCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIGpuKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLmM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1LdChxbixVbix0bihubix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBxbih0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IHFuKHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9KHRoaXMubCsxNikvMTE2LG49aXNOYU4odGhpcy5hKT90OnQrdGhpcy5hLzUwMCxlPWlzTmFOKHRoaXMuYik/dDp0LXRoaXMuYi8yMDA7cmV0dXJuIG5ldyBtbihCbigzLjEzMzg1NjEqKG49RW4qWW4obikpLTEuNjE2ODY2NyoodD1rbipZbih0KSktLjQ5MDYxNDYqKGU9Q24qWW4oZSkpKSxCbigtLjk3ODc2ODQqbisxLjkxNjE0MTUqdCsuMDMzNDU0KmUpLEJuKC4wNzE5NDUzKm4tLjIyODk5MTQqdCsxLjQwNTI0MjcqZSksdGhpcy5vcGFjaXR5KX19KSksS3Qoam4sSG4sdG4obm4se2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgam4odGhpcy5oLHRoaXMuYyx0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBqbih0aGlzLmgsdGhpcy5jLHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiBEbih0aGlzKS5yZ2IoKX19KSk7dmFyIFhuPS0uMTQ4NjEsR249MS43ODI3NyxWbj0tLjI5MjI3LCRuPS0uOTA2NDksV249MS45NzI5NCxabj1XbiokbixRbj1XbipHbixKbj1HbipWbi0kbipYbjtmdW5jdGlvbiBLbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIHRlKXJldHVybiBuZXcgdGUodC5oLHQucyx0LmwsdC5vcGFjaXR5KTt0IGluc3RhbmNlb2YgbW58fCh0PV9uKHQpKTt2YXIgbj10LnIvMjU1LGU9dC5nLzI1NSxyPXQuYi8yNTUsaT0oSm4qcitabipuLVFuKmUpLyhKbitabi1Rbiksbz1yLWksYT0oV24qKGUtaSktVm4qbykvJG4sdT1NYXRoLnNxcnQoYSphK28qbykvKFduKmkqKDEtaSkpLGY9dT9NYXRoLmF0YW4yKGEsbykqU24tMTIwOk5hTjtyZXR1cm4gbmV3IHRlKGY8MD9mKzM2MDpmLHUsaSx0Lm9wYWNpdHkpfSh0KTpuZXcgdGUodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIHRlKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLnM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBuZSh0LG4sZSxyLGkpe3ZhciBvPXQqdCxhPW8qdDtyZXR1cm4oKDEtMyp0KzMqby1hKSpuKyg0LTYqbyszKmEpKmUrKDErMyp0KzMqby0zKmEpKnIrYSppKS82fWZ1bmN0aW9uIGVlKHQpe3ZhciBuPXQubGVuZ3RoLTE7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPWU8PTA/ZT0wOmU+PTE/KGU9MSxuLTEpOk1hdGguZmxvb3IoZSpuKSxpPXRbcl0sbz10W3IrMV0sYT1yPjA/dFtyLTFdOjIqaS1vLHU9cjxuLTE/dFtyKzJdOjIqby1pO3JldHVybiBuZSgoZS1yL24pKm4sYSxpLG8sdSl9fWZ1bmN0aW9uIHJlKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1NYXRoLmZsb29yKCgoZSU9MSk8MD8rK2U6ZSkqbiksaT10WyhyK24tMSklbl0sbz10W3Ilbl0sYT10WyhyKzEpJW5dLHU9dFsocisyKSVuXTtyZXR1cm4gbmUoKGUtci9uKSpuLGksbyxhLHUpfX1mdW5jdGlvbiBpZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gb2UodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQrZSpufX1mdW5jdGlvbiBhZSh0LG4pe3ZhciBlPW4tdDtyZXR1cm4gZT9vZSh0LGU+MTgwfHxlPC0xODA/ZS0zNjAqTWF0aC5yb3VuZChlLzM2MCk6ZSk6aWUoaXNOYU4odCk/bjp0KX1mdW5jdGlvbiB1ZSh0KXtyZXR1cm4gMT09KHQ9K3QpP2ZlOmZ1bmN0aW9uKG4sZSl7cmV0dXJuIGUtbj9mdW5jdGlvbih0LG4sZSl7cmV0dXJuIHQ9TWF0aC5wb3codCxlKSxuPU1hdGgucG93KG4sZSktdCxlPTEvZSxmdW5jdGlvbihyKXtyZXR1cm4gTWF0aC5wb3codCtyKm4sZSl9fShuLGUsdCk6aWUoaXNOYU4obik/ZTpuKX19ZnVuY3Rpb24gZmUodCxuKXt2YXIgZT1uLXQ7cmV0dXJuIGU/b2UodCxlKTppZShpc05hTih0KT9uOnQpfUt0KHRlLEtuLHRuKG5uLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10PzEvLjc6TWF0aC5wb3coMS8uNyx0KSxuZXcgdGUodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8uNzpNYXRoLnBvdyguNyx0KSxuZXcgdGUodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD1pc05hTih0aGlzLmgpPzA6KHRoaXMuaCsxMjApKk5uLG49K3RoaXMubCxlPWlzTmFOKHRoaXMucyk/MDp0aGlzLnMqbiooMS1uKSxyPU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCk7cmV0dXJuIG5ldyBtbigyNTUqKG4rZSooWG4qcitHbippKSksMjU1KihuK2UqKFZuKnIrJG4qaSkpLDI1NSoobitlKihXbipyKSksdGhpcy5vcGFjaXR5KX19KSk7dmFyIGNlPWZ1bmN0aW9uIHQobil7dmFyIGU9dWUobik7ZnVuY3Rpb24gcih0LG4pe3ZhciByPWUoKHQ9Ym4odCkpLnIsKG49Ym4obikpLnIpLGk9ZSh0Lmcsbi5nKSxvPWUodC5iLG4uYiksYT1mZSh0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQucj1yKG4pLHQuZz1pKG4pLHQuYj1vKG4pLHQub3BhY2l0eT1hKG4pLHQrIiJ9fXJldHVybiByLmdhbW1hPXQscn0oMSk7ZnVuY3Rpb24gc2UodCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlLHIsaT1uLmxlbmd0aCxvPW5ldyBBcnJheShpKSxhPW5ldyBBcnJheShpKSx1PW5ldyBBcnJheShpKTtmb3IoZT0wO2U8aTsrK2Upcj1ibihuW2VdKSxvW2VdPXIucnx8MCxhW2VdPXIuZ3x8MCx1W2VdPXIuYnx8MDtyZXR1cm4gbz10KG8pLGE9dChhKSx1PXQodSksci5vcGFjaXR5PTEsZnVuY3Rpb24odCl7cmV0dXJuIHIucj1vKHQpLHIuZz1hKHQpLHIuYj11KHQpLHIrIiJ9fX12YXIgbGU9c2UoZWUpLGhlPXNlKHJlKTtmdW5jdGlvbiBkZSh0LG4pe3ZhciBlLHI9bj9uLmxlbmd0aDowLGk9dD9NYXRoLm1pbihyLHQubGVuZ3RoKTowLG89bmV3IEFycmF5KGkpLGE9bmV3IEFycmF5KHIpO2ZvcihlPTA7ZTxpOysrZSlvW2VdPW1lKHRbZV0sbltlXSk7Zm9yKDtlPHI7KytlKWFbZV09bltlXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGU9MDtlPGk7KytlKWFbZV09b1tlXSh0KTtyZXR1cm4gYX19ZnVuY3Rpb24gcGUodCxuKXt2YXIgZT1uZXcgRGF0ZTtyZXR1cm4gbi09dD0rdCxmdW5jdGlvbihyKXtyZXR1cm4gZS5zZXRUaW1lKHQrbipyKSxlfX1mdW5jdGlvbiB2ZSh0LG4pe3JldHVybiBuLT10PSt0LGZ1bmN0aW9uKGUpe3JldHVybiB0K24qZX19ZnVuY3Rpb24gZ2UodCxuKXt2YXIgZSxyPXt9LGk9e307Zm9yKGUgaW4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdHx8KHQ9e30pLG51bGwhPT1uJiYib2JqZWN0Ij09dHlwZW9mIG58fChuPXt9KSxuKWUgaW4gdD9yW2VdPW1lKHRbZV0sbltlXSk6aVtlXT1uW2VdO3JldHVybiBmdW5jdGlvbih0KXtmb3IoZSBpbiByKWlbZV09cltlXSh0KTtyZXR1cm4gaX19dmFyIHllPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxfZT1uZXcgUmVnRXhwKHllLnNvdXJjZSwiZyIpO2Z1bmN0aW9uIGJlKHQsbil7dmFyIGUscixpLG89eWUubGFzdEluZGV4PV9lLmxhc3RJbmRleD0wLGE9LTEsdT1bXSxmPVtdO2Zvcih0Kz0iIixuKz0iIjsoZT15ZS5leGVjKHQpKSYmKHI9X2UuZXhlYyhuKSk7KShpPXIuaW5kZXgpPm8mJihpPW4uc2xpY2UobyxpKSx1W2FdP3VbYV0rPWk6dVsrK2FdPWkpLChlPWVbMF0pPT09KHI9clswXSk/dVthXT91W2FdKz1yOnVbKythXT1yOih1WysrYV09bnVsbCxmLnB1c2goe2k6YSx4OnZlKGUscil9KSksbz1fZS5sYXN0SW5kZXg7cmV0dXJuIG88bi5sZW5ndGgmJihpPW4uc2xpY2UobyksdVthXT91W2FdKz1pOnVbKythXT1pKSx1Lmxlbmd0aDwyP2ZbMF0/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0KG4pKyIifX0oZlswXS54KTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KG4pOihuPWYubGVuZ3RoLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyPTA7cjxuOysrcil1WyhlPWZbcl0pLmldPWUueCh0KTtyZXR1cm4gdS5qb2luKCIiKX0pfWZ1bmN0aW9uIG1lKHQsbil7dmFyIGUscj10eXBlb2YgbjtyZXR1cm4gbnVsbD09bnx8ImJvb2xlYW4iPT09cj9pZShuKTooIm51bWJlciI9PT1yP3ZlOiJzdHJpbmciPT09cj8oZT12bihuKSk/KG49ZSxjZSk6YmU6biBpbnN0YW5jZW9mIHZuP2NlOm4gaW5zdGFuY2VvZiBEYXRlP3BlOkFycmF5LmlzQXJyYXkobik/ZGU6ImZ1bmN0aW9uIiE9dHlwZW9mIG4udmFsdWVPZiYmImZ1bmN0aW9uIiE9dHlwZW9mIG4udG9TdHJpbmd8fGlzTmFOKG4pP2dlOnZlKSh0LG4pfWZ1bmN0aW9uIHhlKHQsbil7cmV0dXJuIG4tPXQ9K3QsZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQodCtuKmUpfX12YXIgd2UsTWUsQWUsVGUsTmU9MTgwL01hdGguUEksU2U9e3RyYW5zbGF0ZVg6MCx0cmFuc2xhdGVZOjAscm90YXRlOjAsc2tld1g6MCxzY2FsZVg6MSxzY2FsZVk6MX07ZnVuY3Rpb24gRWUodCxuLGUscixpLG8pe3ZhciBhLHUsZjtyZXR1cm4oYT1NYXRoLnNxcnQodCp0K24qbikpJiYodC89YSxuLz1hKSwoZj10KmUrbipyKSYmKGUtPXQqZixyLT1uKmYpLCh1PU1hdGguc3FydChlKmUrcipyKSkmJihlLz11LHIvPXUsZi89dSksdCpyPG4qZSYmKHQ9LXQsbj0tbixmPS1mLGE9LWEpLHt0cmFuc2xhdGVYOmksdHJhbnNsYXRlWTpvLHJvdGF0ZTpNYXRoLmF0YW4yKG4sdCkqTmUsc2tld1g6TWF0aC5hdGFuKGYpKk5lLHNjYWxlWDphLHNjYWxlWTp1fX1mdW5jdGlvbiBrZSh0LG4sZSxyKXtmdW5jdGlvbiBpKHQpe3JldHVybiB0Lmxlbmd0aD90LnBvcCgpKyIgIjoiIn1yZXR1cm4gZnVuY3Rpb24obyxhKXt2YXIgdT1bXSxmPVtdO3JldHVybiBvPXQobyksYT10KGEpLGZ1bmN0aW9uKHQscixpLG8sYSx1KXtpZih0IT09aXx8ciE9PW8pe3ZhciBmPWEucHVzaCgidHJhbnNsYXRlKCIsbnVsbCxuLG51bGwsZSk7dS5wdXNoKHtpOmYtNCx4OnZlKHQsaSl9LHtpOmYtMix4OnZlKHIsbyl9KX1lbHNlKGl8fG8pJiZhLnB1c2goInRyYW5zbGF0ZSgiK2krbitvK2UpfShvLnRyYW5zbGF0ZVgsby50cmFuc2xhdGVZLGEudHJhbnNsYXRlWCxhLnRyYW5zbGF0ZVksdSxmKSxmdW5jdGlvbih0LG4sZSxvKXt0IT09bj8odC1uPjE4MD9uKz0zNjA6bi10PjE4MCYmKHQrPTM2MCksby5wdXNoKHtpOmUucHVzaChpKGUpKyJyb3RhdGUoIixudWxsLHIpLTIseDp2ZSh0LG4pfSkpOm4mJmUucHVzaChpKGUpKyJyb3RhdGUoIituK3IpfShvLnJvdGF0ZSxhLnJvdGF0ZSx1LGYpLGZ1bmN0aW9uKHQsbixlLG8pe3QhPT1uP28ucHVzaCh7aTplLnB1c2goaShlKSsic2tld1goIixudWxsLHIpLTIseDp2ZSh0LG4pfSk6biYmZS5wdXNoKGkoZSkrInNrZXdYKCIrbityKX0oby5za2V3WCxhLnNrZXdYLHUsZiksZnVuY3Rpb24odCxuLGUscixvLGEpe2lmKHQhPT1lfHxuIT09cil7dmFyIHU9by5wdXNoKGkobykrInNjYWxlKCIsbnVsbCwiLCIsbnVsbCwiKSIpO2EucHVzaCh7aTp1LTQseDp2ZSh0LGUpfSx7aTp1LTIseDp2ZShuLHIpfSl9ZWxzZSAxPT09ZSYmMT09PXJ8fG8ucHVzaChpKG8pKyJzY2FsZSgiK2UrIiwiK3IrIikiKX0oby5zY2FsZVgsby5zY2FsZVksYS5zY2FsZVgsYS5zY2FsZVksdSxmKSxvPWE9bnVsbCxmdW5jdGlvbih0KXtmb3IodmFyIG4sZT0tMSxyPWYubGVuZ3RoOysrZTxyOyl1WyhuPWZbZV0pLmldPW4ueCh0KTtyZXR1cm4gdS5qb2luKCIiKX19fXZhciBDZT1rZShmdW5jdGlvbih0KXtyZXR1cm4ibm9uZSI9PT10P1NlOih3ZXx8KHdlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLE1lPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxBZT1kb2N1bWVudC5kZWZhdWx0Vmlldyksd2Uuc3R5bGUudHJhbnNmb3JtPXQsdD1BZS5nZXRDb21wdXRlZFN0eWxlKE1lLmFwcGVuZENoaWxkKHdlKSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKSxNZS5yZW1vdmVDaGlsZCh3ZSksRWUoKyh0PXQuc2xpY2UoNywtMSkuc3BsaXQoIiwiKSlbMF0sK3RbMV0sK3RbMl0sK3RbM10sK3RbNF0sK3RbNV0pKX0sInB4LCAiLCJweCkiLCJkZWcpIiksUGU9a2UoZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/U2U6KFRlfHwoVGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsImciKSksVGUuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLHQpLCh0PVRlLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpP0VlKCh0PXQubWF0cml4KS5hLHQuYix0LmMsdC5kLHQuZSx0LmYpOlNlKX0sIiwgIiwiKSIsIikiKSx6ZT1NYXRoLlNRUlQyLFJlPTIsTGU9NCxEZT0xZS0xMjtmdW5jdGlvbiBVZSh0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpKzEvdCkvMn1mdW5jdGlvbiBxZSh0LG4pe3ZhciBlLHIsaT10WzBdLG89dFsxXSxhPXRbMl0sdT1uWzBdLGY9blsxXSxjPW5bMl0scz11LWksbD1mLW8saD1zKnMrbCpsO2lmKGg8RGUpcj1NYXRoLmxvZyhjL2EpL3plLGU9ZnVuY3Rpb24odCl7cmV0dXJuW2krdCpzLG8rdCpsLGEqTWF0aC5leHAoemUqdCpyKV19O2Vsc2V7dmFyIGQ9TWF0aC5zcXJ0KGgpLHA9KGMqYy1hKmErTGUqaCkvKDIqYSpSZSpkKSx2PShjKmMtYSphLUxlKmgpLygyKmMqUmUqZCksZz1NYXRoLmxvZyhNYXRoLnNxcnQocCpwKzEpLXApLHk9TWF0aC5sb2coTWF0aC5zcXJ0KHYqdisxKS12KTtyPSh5LWcpL3plLGU9ZnVuY3Rpb24odCl7dmFyIG4sZT10KnIsdT1VZShnKSxmPWEvKFJlKmQpKih1KihuPXplKmUrZywoKG49TWF0aC5leHAoMipuKSktMSkvKG4rMSkpLWZ1bmN0aW9uKHQpe3JldHVybigodD1NYXRoLmV4cCh0KSktMS90KS8yfShnKSk7cmV0dXJuW2krZipzLG8rZipsLGEqdS9VZSh6ZSplK2cpXX19cmV0dXJuIGUuZHVyYXRpb249MWUzKnIsZX1mdW5jdGlvbiBPZSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPU1uKG4pKS5oLChlPU1uKGUpKS5oKSxpPWZlKG4ucyxlLnMpLG89ZmUobi5sLGUubCksYT1mZShuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4ucz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fX12YXIgWWU9T2UoYWUpLEJlPU9lKGZlKTtmdW5jdGlvbiBGZSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPUhuKG4pKS5oLChlPUhuKGUpKS5oKSxpPWZlKG4uYyxlLmMpLG89ZmUobi5sLGUubCksYT1mZShuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4uYz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fX12YXIgSWU9RmUoYWUpLEhlPUZlKGZlKTtmdW5jdGlvbiBqZSh0KXtyZXR1cm4gZnVuY3Rpb24gbihlKXtmdW5jdGlvbiByKG4scil7dmFyIGk9dCgobj1LbihuKSkuaCwocj1LbihyKSkuaCksbz1mZShuLnMsci5zKSxhPWZlKG4ubCxyLmwpLHU9ZmUobi5vcGFjaXR5LHIub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9aSh0KSxuLnM9byh0KSxuLmw9YShNYXRoLnBvdyh0LGUpKSxuLm9wYWNpdHk9dSh0KSxuKyIifX1yZXR1cm4gZT0rZSxyLmdhbW1hPW4scn0oMSl9dmFyIFhlPWplKGFlKSxHZT1qZShmZSk7dmFyIFZlLCRlLFdlPTAsWmU9MCxRZT0wLEplPTFlMyxLZT0wLHRyPTAsbnI9MCxlcj0ib2JqZWN0Ij09dHlwZW9mIHBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2U6RGF0ZSxycj0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTcpfTtmdW5jdGlvbiBpcigpe3JldHVybiB0cnx8KHJyKG9yKSx0cj1lci5ub3coKStucil9ZnVuY3Rpb24gb3IoKXt0cj0wfWZ1bmN0aW9uIGFyKCl7dGhpcy5fY2FsbD10aGlzLl90aW1lPXRoaXMuX25leHQ9bnVsbH1mdW5jdGlvbiB1cih0LG4sZSl7dmFyIHI9bmV3IGFyO3JldHVybiByLnJlc3RhcnQodCxuLGUpLHJ9ZnVuY3Rpb24gZnIoKXtpcigpLCsrV2U7Zm9yKHZhciB0LG49VmU7bjspKHQ9dHItbi5fdGltZSk+PTAmJm4uX2NhbGwuY2FsbChudWxsLHQpLG49bi5fbmV4dDstLVdlfWZ1bmN0aW9uIGNyKCl7dHI9KEtlPWVyLm5vdygpKStucixXZT1aZT0wO3RyeXtmcigpfWZpbmFsbHl7V2U9MCxmdW5jdGlvbigpe3ZhciB0LG4sZT1WZSxyPTEvMDtmb3IoO2U7KWUuX2NhbGw/KHI+ZS5fdGltZSYmKHI9ZS5fdGltZSksdD1lLGU9ZS5fbmV4dCk6KG49ZS5fbmV4dCxlLl9uZXh0PW51bGwsZT10P3QuX25leHQ9bjpWZT1uKTskZT10LGxyKHIpfSgpLHRyPTB9fWZ1bmN0aW9uIHNyKCl7dmFyIHQ9ZXIubm93KCksbj10LUtlO24+SmUmJihuci09bixLZT10KX1mdW5jdGlvbiBscih0KXtXZXx8KFplJiYoWmU9Y2xlYXJUaW1lb3V0KFplKSksdC10cj4yND8odDwxLzAmJihaZT1zZXRUaW1lb3V0KGNyLHQtZXIubm93KCktbnIpKSxRZSYmKFFlPWNsZWFySW50ZXJ2YWwoUWUpKSk6KFFlfHwoS2U9ZXIubm93KCksUWU9c2V0SW50ZXJ2YWwoc3IsSmUpKSxXZT0xLHJyKGNyKSkpfWZ1bmN0aW9uIGhyKHQsbixlKXt2YXIgcj1uZXcgYXI7cmV0dXJuIG49bnVsbD09bj8wOituLHIucmVzdGFydChmdW5jdGlvbihlKXtyLnN0b3AoKSx0KGUrbil9LG4sZSkscn1hci5wcm90b3R5cGU9dXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjphcixyZXN0YXJ0OmZ1bmN0aW9uKHQsbixlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbiIpO2U9KG51bGw9PWU/aXIoKTorZSkrKG51bGw9PW4/MDorbiksdGhpcy5fbmV4dHx8JGU9PT10aGlzfHwoJGU/JGUuX25leHQ9dGhpczpWZT10aGlzLCRlPXRoaXMpLHRoaXMuX2NhbGw9dCx0aGlzLl90aW1lPWUsbHIoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2NhbGwmJih0aGlzLl9jYWxsPW51bGwsdGhpcy5fdGltZT0xLzAsbHIoKSl9fTt2YXIgZHI9SSgic3RhcnQiLCJlbmQiLCJpbnRlcnJ1cHQiKSxwcj1bXSx2cj0wLGdyPTEseXI9Mixfcj0zLGJyPTQsbXI9NSx4cj02O2Z1bmN0aW9uIHdyKHQsbixlLHIsaSxvKXt2YXIgYT10Ll9fdHJhbnNpdGlvbjtpZihhKXtpZihlIGluIGEpcmV0dXJufWVsc2UgdC5fX3RyYW5zaXRpb249e307IWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpPXQuX190cmFuc2l0aW9uO2Z1bmN0aW9uIG8oZil7dmFyIGMscyxsLGg7aWYoZS5zdGF0ZSE9PWdyKXJldHVybiB1KCk7Zm9yKGMgaW4gaSlpZigoaD1pW2NdKS5uYW1lPT09ZS5uYW1lKXtpZihoLnN0YXRlPT09X3IpcmV0dXJuIGhyKG8pO2guc3RhdGU9PT1icj8oaC5zdGF0ZT14cixoLnRpbWVyLnN0b3AoKSxoLm9uLmNhbGwoImludGVycnVwdCIsdCx0Ll9fZGF0YV9fLGguaW5kZXgsaC5ncm91cCksZGVsZXRlIGlbY10pOitjPG4mJihoLnN0YXRlPXhyLGgudGltZXIuc3RvcCgpLGRlbGV0ZSBpW2NdKX1pZihocihmdW5jdGlvbigpe2Uuc3RhdGU9PT1fciYmKGUuc3RhdGU9YnIsZS50aW1lci5yZXN0YXJ0KGEsZS5kZWxheSxlLnRpbWUpLGEoZikpfSksZS5zdGF0ZT15cixlLm9uLmNhbGwoInN0YXJ0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxlLnN0YXRlPT09eXIpe2ZvcihlLnN0YXRlPV9yLHI9bmV3IEFycmF5KGw9ZS50d2Vlbi5sZW5ndGgpLGM9MCxzPS0xO2M8bDsrK2MpKGg9ZS50d2VlbltjXS52YWx1ZS5jYWxsKHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApKSYmKHJbKytzXT1oKTtyLmxlbmd0aD1zKzF9fWZ1bmN0aW9uIGEobil7Zm9yKHZhciBpPW48ZS5kdXJhdGlvbj9lLmVhc2UuY2FsbChudWxsLG4vZS5kdXJhdGlvbik6KGUudGltZXIucmVzdGFydCh1KSxlLnN0YXRlPW1yLDEpLG89LTEsYT1yLmxlbmd0aDsrK288YTspcltvXS5jYWxsKG51bGwsaSk7ZS5zdGF0ZT09PW1yJiYoZS5vbi5jYWxsKCJlbmQiLHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApLHUoKSl9ZnVuY3Rpb24gdSgpe2Zvcih2YXIgciBpbiBlLnN0YXRlPXhyLGUudGltZXIuc3RvcCgpLGRlbGV0ZSBpW25dLGkpcmV0dXJuO2RlbGV0ZSB0Ll9fdHJhbnNpdGlvbn1pW25dPWUsZS50aW1lcj11cihmdW5jdGlvbih0KXtlLnN0YXRlPWdyLGUudGltZXIucmVzdGFydChvLGUuZGVsYXksZS50aW1lKSxlLmRlbGF5PD10JiZvKHQtZS5kZWxheSl9LDAsZS50aW1lKX0odCxlLHtuYW1lOm4saW5kZXg6cixncm91cDppLG9uOmRyLHR3ZWVuOnByLHRpbWU6by50aW1lLGRlbGF5Om8uZGVsYXksZHVyYXRpb246by5kdXJhdGlvbixlYXNlOm8uZWFzZSx0aW1lcjpudWxsLHN0YXRlOnZyfSl9ZnVuY3Rpb24gTXIodCxuKXt2YXIgZT1Ucih0LG4pO2lmKGUuc3RhdGU+dnIpdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFkeSBzY2hlZHVsZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBBcih0LG4pe3ZhciBlPVRyKHQsbik7aWYoZS5zdGF0ZT55cil0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHN0YXJ0ZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBUcih0LG4pe3ZhciBlPXQuX190cmFuc2l0aW9uO2lmKCFlfHwhKGU9ZVtuXSkpdGhyb3cgbmV3IEVycm9yKCJ0cmFuc2l0aW9uIG5vdCBmb3VuZCIpO3JldHVybiBlfWZ1bmN0aW9uIE5yKHQsbil7dmFyIGUscixpLG89dC5fX3RyYW5zaXRpb24sYT0hMDtpZihvKXtmb3IoaSBpbiBuPW51bGw9PW4/bnVsbDpuKyIiLG8pKGU9b1tpXSkubmFtZT09PW4/KHI9ZS5zdGF0ZT55ciYmZS5zdGF0ZTxtcixlLnN0YXRlPXhyLGUudGltZXIuc3RvcCgpLHImJmUub24uY2FsbCgiaW50ZXJydXB0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxkZWxldGUgb1tpXSk6YT0hMTthJiZkZWxldGUgdC5fX3RyYW5zaXRpb259fWZ1bmN0aW9uIFNyKHQsbixlKXt2YXIgcj10Ll9pZDtyZXR1cm4gdC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9QXIodGhpcyxyKTsodC52YWx1ZXx8KHQudmFsdWU9e30pKVtuXT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLGZ1bmN0aW9uKHQpe3JldHVybiBUcih0LHIpLnZhbHVlW25dfX1mdW5jdGlvbiBFcih0LG4pe3ZhciBlO3JldHVybigibnVtYmVyIj09dHlwZW9mIG4/dmU6biBpbnN0YW5jZW9mIHZuP2NlOihlPXZuKG4pKT8obj1lLGNlKTpiZSkodCxuKX12YXIga3I9THQucHJvdG90eXBlLmNvbnN0cnVjdG9yO3ZhciBDcj0wO2Z1bmN0aW9uIFByKHQsbixlLHIpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9bix0aGlzLl9uYW1lPWUsdGhpcy5faWQ9cn1mdW5jdGlvbiB6cih0KXtyZXR1cm4gTHQoKS50cmFuc2l0aW9uKHQpfWZ1bmN0aW9uIFJyKCl7cmV0dXJuKytDcn12YXIgTHI9THQucHJvdG90eXBlO2Z1bmN0aW9uIERyKHQpe3JldHVybigodCo9Mik8PTE/dCp0Oi0tdCooMi10KSsxKS8yfWZ1bmN0aW9uIFVyKHQpe3JldHVybigodCo9Mik8PTE/dCp0KnQ6KHQtPTIpKnQqdCsyKS8yfVByLnByb3RvdHlwZT16ci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlByLHNlbGVjdDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVEodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPW5ldyBBcnJheShpKSxhPTA7YTxpOysrYSlmb3IodmFyIHUsZixjPXJbYV0scz1jLmxlbmd0aCxsPW9bYV09bmV3IEFycmF5KHMpLGg9MDtoPHM7KytoKSh1PWNbaF0pJiYoZj10LmNhbGwodSx1Ll9fZGF0YV9fLGgsYykpJiYoIl9fZGF0YV9fImluIHUmJihmLl9fZGF0YV9fPXUuX19kYXRhX18pLGxbaF09Zix3cihsW2hdLG4sZSxoLGwsVHIodSxlKSkpO3JldHVybiBuZXcgUHIobyx0aGlzLl9wYXJlbnRzLG4sZSl9LHNlbGVjdEFsbDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUsodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPVtdLGE9W10sdT0wO3U8aTsrK3UpZm9yKHZhciBmLGM9clt1XSxzPWMubGVuZ3RoLGw9MDtsPHM7KytsKWlmKGY9Y1tsXSl7Zm9yKHZhciBoLGQ9dC5jYWxsKGYsZi5fX2RhdGFfXyxsLGMpLHA9VHIoZixlKSx2PTAsZz1kLmxlbmd0aDt2PGc7Kyt2KShoPWRbdl0pJiZ3cihoLG4sZSx2LGQscCk7by5wdXNoKGQpLGEucHVzaChmKX1yZXR1cm4gbmV3IFByKG8sYSxuLGUpfSxmaWx0ZXI6ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXJ0KHQpKTtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9bi5sZW5ndGgscj1uZXcgQXJyYXkoZSksaT0wO2k8ZTsrK2kpZm9yKHZhciBvLGE9bltpXSx1PWEubGVuZ3RoLGY9cltpXT1bXSxjPTA7Yzx1OysrYykobz1hW2NdKSYmdC5jYWxsKG8sby5fX2RhdGFfXyxjLGEpJiZmLnB1c2gobyk7cmV0dXJuIG5ldyBQcihyLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LG1lcmdlOmZ1bmN0aW9uKHQpe2lmKHQuX2lkIT09dGhpcy5faWQpdGhyb3cgbmV3IEVycm9yO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT10Ll9ncm91cHMscj1uLmxlbmd0aCxpPWUubGVuZ3RoLG89TWF0aC5taW4ocixpKSxhPW5ldyBBcnJheShyKSx1PTA7dTxvOysrdSlmb3IodmFyIGYsYz1uW3VdLHM9ZVt1XSxsPWMubGVuZ3RoLGg9YVt1XT1uZXcgQXJyYXkobCksZD0wO2Q8bDsrK2QpKGY9Y1tkXXx8c1tkXSkmJihoW2RdPWYpO2Zvcig7dTxyOysrdSlhW3VdPW5bdV07cmV0dXJuIG5ldyBQcihhLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LHNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiBuZXcga3IodGhpcy5fZ3JvdXBzLHRoaXMuX3BhcmVudHMpfSx0cmFuc2l0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX25hbWUsbj10aGlzLl9pZCxlPVJyKCkscj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPTA7bzxpOysrbylmb3IodmFyIGEsdT1yW29dLGY9dS5sZW5ndGgsYz0wO2M8ZjsrK2MpaWYoYT11W2NdKXt2YXIgcz1UcihhLG4pO3dyKGEsdCxlLGMsdSx7dGltZTpzLnRpbWUrcy5kZWxheStzLmR1cmF0aW9uLGRlbGF5OjAsZHVyYXRpb246cy5kdXJhdGlvbixlYXNlOnMuZWFzZX0pfXJldHVybiBuZXcgUHIocix0aGlzLl9wYXJlbnRzLHQsZSl9LGNhbGw6THIuY2FsbCxub2RlczpMci5ub2Rlcyxub2RlOkxyLm5vZGUsc2l6ZTpMci5zaXplLGVtcHR5OkxyLmVtcHR5LGVhY2g6THIuZWFjaCxvbjpmdW5jdGlvbih0LG4pe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/VHIodGhpcy5ub2RlKCksZSkub24ub24odCk6dGhpcy5lYWNoKGZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG89ZnVuY3Rpb24odCl7cmV0dXJuKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5ldmVyeShmdW5jdGlvbih0KXt2YXIgbj10LmluZGV4T2YoIi4iKTtyZXR1cm4gbj49MCYmKHQ9dC5zbGljZSgwLG4pKSwhdHx8InN0YXJ0Ij09PXR9KX0obik/TXI6QXI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9byh0aGlzLHQpLHU9YS5vbjt1IT09ciYmKGk9KHI9dSkuY29weSgpKS5vbihuLGUpLGEub249aX19KGUsdCxuKSl9LGF0dHI6ZnVuY3Rpb24odCxuKXt2YXIgZT0kKHQpLHI9InRyYW5zZm9ybSI9PT1lP1BlOkVyO3JldHVybiB0aGlzLmF0dHJUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBuPyhlLmxvY2FsP2Z1bmN0aW9uKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEsdT1lKHRoaXMpO2lmKG51bGwhPXUpcmV0dXJuKGE9dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpKT09PXU/bnVsbDphPT09ciYmdT09PWk/bzpvPW4ocj1hLGk9dSk7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYSx1PWUodGhpcyk7aWYobnVsbCE9dSlyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZSh0KSk9PT11P251bGw6YT09PXImJnU9PT1pP286bz1uKHI9YSxpPXUpO3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX0pKGUscixTcih0aGlzLCJhdHRyLiIrdCxuKSk6bnVsbD09bj8oZS5sb2NhbD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19KShlKTooZS5sb2NhbD9mdW5jdGlvbih0LG4sZSl7dmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcy5nZXRBdHRyaWJ1dGUodCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX0pKGUscixuKyIiKSl9LGF0dHJUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciBlPSJhdHRyLiIrdDtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKGU9dGhpcy50d2VlbihlKSkmJmUuX3ZhbHVlO2lmKG51bGw9PW4pcmV0dXJuIHRoaXMudHdlZW4oZSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7dmFyIHI9JCh0KTtyZXR1cm4gdGhpcy50d2VlbihlLChyLmxvY2FsP2Z1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXMscj1uLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gciYmZnVuY3Rpb24obil7ZS5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwscihuKSl9fXJldHVybiBlLl92YWx1ZT1uLGV9OmZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXMscj1uLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gciYmZnVuY3Rpb24obil7ZS5zZXRBdHRyaWJ1dGUodCxyKG4pKX19cmV0dXJuIGUuX3ZhbHVlPW4sZX0pKHIsbikpfSxzdHlsZTpmdW5jdGlvbih0LG4sZSl7dmFyIHI9InRyYW5zZm9ybSI9PSh0Kz0iIik/Q2U6RXI7cmV0dXJuIG51bGw9PW4/dGhpcy5zdHlsZVR3ZWVuKHQsZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89bHQodGhpcyx0KSxhPSh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLGx0KHRoaXMsdCkpO3JldHVybiBvPT09YT9udWxsOm89PT1lJiZhPT09cj9pOmk9bihlPW8scj1hKX19KHQscikpLm9uKCJlbmQuc3R5bGUuIit0LGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fSh0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1sdCh0aGlzLHQpLHU9ZSh0aGlzKTtyZXR1cm4gbnVsbD09dSYmKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCksdT1sdCh0aGlzLHQpKSxhPT09dT9udWxsOmE9PT1yJiZ1PT09aT9vOm89bihyPWEsaT11KX19KHQscixTcih0aGlzLCJzdHlsZS4iK3QsbikpOmZ1bmN0aW9uKHQsbixlKXt2YXIgcixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPWx0KHRoaXMsdCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX0odCxyLG4rIiIpLGUpfSxzdHlsZVR3ZWVuOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj0ic3R5bGUuIisodCs9IiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4ocj10aGlzLnR3ZWVuKHIpKSYmci5fdmFsdWU7aWYobnVsbD09bilyZXR1cm4gdGhpcy50d2VlbihyLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy50d2VlbihyLGZ1bmN0aW9uKHQsbixlKXtmdW5jdGlvbiByKCl7dmFyIHI9dGhpcyxpPW4uYXBwbHkocixhcmd1bWVudHMpO3JldHVybiBpJiZmdW5jdGlvbihuKXtyLnN0eWxlLnNldFByb3BlcnR5KHQsaShuKSxlKX19cmV0dXJuIHIuX3ZhbHVlPW4scn0odCxuLG51bGw9PWU/IiI6ZSkpfSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnR3ZWVuKCJ0ZXh0IiwiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10KHRoaXMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09bj8iIjpufX0oU3IodGhpcywidGV4dCIsdCkpOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KG51bGw9PXQ/IiI6dCsiIikpfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vbigiZW5kLnJlbW92ZSIsKHQ9dGhpcy5faWQsZnVuY3Rpb24oKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7Zm9yKHZhciBlIGluIHRoaXMuX190cmFuc2l0aW9uKWlmKCtlIT09dClyZXR1cm47biYmbi5yZW1vdmVDaGlsZCh0aGlzKX0pKTt2YXIgdH0sdHdlZW46ZnVuY3Rpb24odCxuKXt2YXIgZT10aGlzLl9pZDtpZih0Kz0iIixhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgcixpPVRyKHRoaXMubm9kZSgpLGUpLnR3ZWVuLG89MCxhPWkubGVuZ3RoO288YTsrK28paWYoKHI9aVtvXSkubmFtZT09PXQpcmV0dXJuIHIudmFsdWU7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0LG4pe3ZhciBlLHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9QXIodGhpcyx0KSxvPWkudHdlZW47aWYobyE9PWUpZm9yKHZhciBhPTAsdT0ocj1lPW8pLmxlbmd0aDthPHU7KythKWlmKHJbYV0ubmFtZT09PW4peyhyPXIuc2xpY2UoKSkuc3BsaWNlKGEsMSk7YnJlYWt9aS50d2Vlbj1yfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPUFyKHRoaXMsdCksYT1vLnR3ZWVuO2lmKGEhPT1yKXtpPShyPWEpLnNsaWNlKCk7Zm9yKHZhciB1PXtuYW1lOm4sdmFsdWU6ZX0sZj0wLGM9aS5sZW5ndGg7ZjxjOysrZilpZihpW2ZdLm5hbWU9PT1uKXtpW2ZdPXU7YnJlYWt9Zj09PWMmJmkucHVzaCh1KX1vLnR3ZWVuPWl9fSkoZSx0LG4pKX0sZGVsYXk6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe01yKHRoaXMsdCkuZGVsYXk9K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gbj0rbixmdW5jdGlvbigpe01yKHRoaXMsdCkuZGVsYXk9bn19KShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5kZWxheX0sZHVyYXRpb246ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe0FyKHRoaXMsdCkuZHVyYXRpb249K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gbj0rbixmdW5jdGlvbigpe0FyKHRoaXMsdCkuZHVyYXRpb249bn19KShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5kdXJhdGlvbn0sZWFzZTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goZnVuY3Rpb24odCxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7QXIodGhpcyx0KS5lYXNlPW59fShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5lYXNlfX07dmFyIHFyPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gTWF0aC5wb3codCxuKX1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksT3I9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiAxLU1hdGgucG93KDEtdCxuKX1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksWXI9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybigodCo9Mik8PTE/TWF0aC5wb3codCxuKToyLU1hdGgucG93KDItdCxuKSkvMn1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksQnI9TWF0aC5QSSxGcj1Cci8yO2Z1bmN0aW9uIElyKHQpe3JldHVybigxLU1hdGguY29zKEJyKnQpKS8yfWZ1bmN0aW9uIEhyKHQpe3JldHVybigodCo9Mik8PTE/TWF0aC5wb3coMiwxMCp0LTEwKToyLU1hdGgucG93KDIsMTAtMTAqdCkpLzJ9ZnVuY3Rpb24ganIodCl7cmV0dXJuKCh0Kj0yKTw9MT8xLU1hdGguc3FydCgxLXQqdCk6TWF0aC5zcXJ0KDEtKHQtPTIpKnQpKzEpLzJ9dmFyIFhyPTQvMTEsR3I9Ni8xMSxWcj04LzExLCRyPS43NSxXcj05LzExLFpyPTEwLzExLFFyPS45Mzc1LEpyPTIxLzIyLEtyPTYzLzY0LHRpPTEvWHIvWHI7ZnVuY3Rpb24gbmkodCl7cmV0dXJuKHQ9K3QpPFhyP3RpKnQqdDp0PFZyP3RpKih0LT1HcikqdCskcjp0PFpyP3RpKih0LT1XcikqdCtRcjp0aSoodC09SnIpKnQrS3J9dmFyIGVpPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCp0KigobisxKSp0LW4pfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCkscmk9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybi0tdCp0KigobisxKSp0K24pKzF9cmV0dXJuIG49K24sZS5vdmVyc2hvb3Q9dCxlfSgxLjcwMTU4KSxpaT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuKCh0Kj0yKTwxP3QqdCooKG4rMSkqdC1uKToodC09MikqdCooKG4rMSkqdCtuKSsyKS8yfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCksb2k9MipNYXRoLlBJLGFpPWZ1bmN0aW9uIHQobixlKXt2YXIgcj1NYXRoLmFzaW4oMS8obj1NYXRoLm1heCgxLG4pKSkqKGUvPW9pKTtmdW5jdGlvbiBpKHQpe3JldHVybiBuKk1hdGgucG93KDIsMTAqLS10KSpNYXRoLnNpbigoci10KS9lKX1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKm9pKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksdWk9ZnVuY3Rpb24gdChuLGUpe3ZhciByPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89b2kpO2Z1bmN0aW9uIGkodCl7cmV0dXJuIDEtbipNYXRoLnBvdygyLC0xMCoodD0rdCkpKk1hdGguc2luKCh0K3IpL2UpfXJldHVybiBpLmFtcGxpdHVkZT1mdW5jdGlvbihuKXtyZXR1cm4gdChuLGUqb2kpfSxpLnBlcmlvZD1mdW5jdGlvbihlKXtyZXR1cm4gdChuLGUpfSxpfSgxLC4zKSxmaT1mdW5jdGlvbiB0KG4sZSl7dmFyIHI9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihlLz1vaSk7ZnVuY3Rpb24gaSh0KXtyZXR1cm4oKHQ9Mip0LTEpPDA/bipNYXRoLnBvdygyLDEwKnQpKk1hdGguc2luKChyLXQpL2UpOjItbipNYXRoLnBvdygyLC0xMCp0KSpNYXRoLnNpbigocit0KS9lKSkvMn1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKm9pKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksY2k9e3RpbWU6bnVsbCxkZWxheTowLGR1cmF0aW9uOjI1MCxlYXNlOlVyfTtmdW5jdGlvbiBzaSh0LG4pe2Zvcih2YXIgZTshKGU9dC5fX3RyYW5zaXRpb24pfHwhKGU9ZVtuXSk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybiBjaS50aW1lPWlyKCksY2k7cmV0dXJuIGV9THQucHJvdG90eXBlLmludGVycnVwdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7TnIodGhpcyx0KX0pfSxMdC5wcm90b3R5cGUudHJhbnNpdGlvbj1mdW5jdGlvbih0KXt2YXIgbixlO3QgaW5zdGFuY2VvZiBQcj8obj10Ll9pZCx0PXQuX25hbWUpOihuPVJyKCksKGU9Y2kpLnRpbWU9aXIoKSx0PW51bGw9PXQ/bnVsbDp0KyIiKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz0wO288aTsrK28pZm9yKHZhciBhLHU9cltvXSxmPXUubGVuZ3RoLGM9MDtjPGY7KytjKShhPXVbY10pJiZ3cihhLHQsbixjLHUsZXx8c2koYSxuKSk7cmV0dXJuIG5ldyBQcihyLHRoaXMuX3BhcmVudHMsdCxuKX07dmFyIGxpPVtudWxsXTtmdW5jdGlvbiBoaSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gZGkodCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy5zZWxlY3Rpb249ZX1mdW5jdGlvbiBwaSgpe3QuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gdmkoKXt0LmV2ZW50LnByZXZlbnREZWZhdWx0KCksdC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX12YXIgZ2k9e25hbWU6ImRyYWcifSx5aT17bmFtZToic3BhY2UifSxfaT17bmFtZToiaGFuZGxlIn0sYmk9e25hbWU6ImNlbnRlciJ9LG1pPXtuYW1lOiJ4IixoYW5kbGVzOlsiZSIsInciXS5tYXAoRWkpLGlucHV0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQmJltbdFswXSxuWzBdWzFdXSxbdFsxXSxuWzFdWzFdXV19LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmW3RbMF1bMF0sdFsxXVswXV19fSx4aT17bmFtZToieSIsaGFuZGxlczpbIm4iLCJzIl0ubWFwKEVpKSxpbnB1dDpmdW5jdGlvbih0LG4pe3JldHVybiB0JiZbW25bMF1bMF0sdFswXV0sW25bMV1bMF0sdFsxXV1dfSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlt0WzBdWzFdLHRbMV1bMV1dfX0sd2k9e25hbWU6Inh5IixoYW5kbGVzOlsibiIsImUiLCJzIiwidyIsIm53IiwibmUiLCJzZSIsInN3Il0ubWFwKEVpKSxpbnB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdH0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0fX0sTWk9e292ZXJsYXk6ImNyb3NzaGFpciIsc2VsZWN0aW9uOiJtb3ZlIixuOiJucy1yZXNpemUiLGU6ImV3LXJlc2l6ZSIsczoibnMtcmVzaXplIix3OiJldy1yZXNpemUiLG53OiJud3NlLXJlc2l6ZSIsbmU6Im5lc3ctcmVzaXplIixzZToibndzZS1yZXNpemUiLHN3OiJuZXN3LXJlc2l6ZSJ9LEFpPXtlOiJ3Iix3OiJlIixudzoibmUiLG5lOiJudyIsc2U6InN3Iixzdzoic2UifSxUaT17bjoicyIsczoibiIsbnc6InN3IixuZToic2UiLHNlOiJuZSIsc3c6Im53In0sTmk9e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOm51bGwsZToxLHM6bnVsbCx3Oi0xLG53Oi0xLG5lOjEsc2U6MSxzdzotMX0sU2k9e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOi0xLGU6bnVsbCxzOjEsdzpudWxsLG53Oi0xLG5lOi0xLHNlOjEsc3c6MX07ZnVuY3Rpb24gRWkodCl7cmV0dXJue3R5cGU6dH19ZnVuY3Rpb24ga2koKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gQ2koKXt2YXIgdD10aGlzLm93bmVyU1ZHRWxlbWVudHx8dGhpcztyZXR1cm5bWzAsMF0sW3Qud2lkdGguYmFzZVZhbC52YWx1ZSx0LmhlaWdodC5iYXNlVmFsLnZhbHVlXV19ZnVuY3Rpb24gUGkodCl7Zm9yKDshdC5fX2JydXNoOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHQuX19icnVzaH1mdW5jdGlvbiB6aSh0KXtyZXR1cm4gdFswXVswXT09PXRbMV1bMF18fHRbMF1bMV09PT10WzFdWzFdfWZ1bmN0aW9uIFJpKG4pe3ZhciBlLHI9Q2ksaT1raSxvPUkodSwic3RhcnQiLCJicnVzaCIsImVuZCIpLGE9NjtmdW5jdGlvbiB1KHQpe3ZhciBlPXQucHJvcGVydHkoIl9fYnJ1c2giLGgpLnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5kYXRhKFtFaSgib3ZlcmxheSIpXSk7ZS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwib3ZlcmxheSIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuYXR0cigiY3Vyc29yIixNaS5vdmVybGF5KS5tZXJnZShlKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9UGkodGhpcykuZXh0ZW50O0R0KHRoaXMpLmF0dHIoIngiLHRbMF1bMF0pLmF0dHIoInkiLHRbMF1bMV0pLmF0dHIoIndpZHRoIix0WzFdWzBdLXRbMF1bMF0pLmF0dHIoImhlaWdodCIsdFsxXVsxXS10WzBdWzFdKX0pLHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuZGF0YShbRWkoInNlbGVjdGlvbiIpXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsInNlbGVjdGlvbiIpLmF0dHIoImN1cnNvciIsTWkuc2VsZWN0aW9uKS5hdHRyKCJmaWxsIiwiIzc3NyIpLmF0dHIoImZpbGwtb3BhY2l0eSIsLjMpLmF0dHIoInN0cm9rZSIsIiNmZmYiKS5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIik7dmFyIHI9dC5zZWxlY3RBbGwoIi5oYW5kbGUiKS5kYXRhKG4uaGFuZGxlcyxmdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlfSk7ci5leGl0KCkucmVtb3ZlKCksci5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIixmdW5jdGlvbih0KXtyZXR1cm4iaGFuZGxlIGhhbmRsZS0tIit0LnR5cGV9KS5hdHRyKCJjdXJzb3IiLGZ1bmN0aW9uKHQpe3JldHVybiBNaVt0LnR5cGVdfSksdC5lYWNoKGYpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2ggdG91Y2hzdGFydC5icnVzaCIsbCl9ZnVuY3Rpb24gZigpe3ZhciB0PUR0KHRoaXMpLG49UGkodGhpcykuc2VsZWN0aW9uO24/KHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLG5bMF1bMF0pLmF0dHIoInkiLG5bMF1bMV0pLmF0dHIoIndpZHRoIixuWzFdWzBdLW5bMF1bMF0pLmF0dHIoImhlaWdodCIsblsxXVsxXS1uWzBdWzFdKSx0LnNlbGVjdEFsbCgiLmhhbmRsZSIpLnN0eWxlKCJkaXNwbGF5IixudWxsKS5hdHRyKCJ4IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGVbdC50eXBlLmxlbmd0aC0xXT9uWzFdWzBdLWEvMjpuWzBdWzBdLWEvMn0pLmF0dHIoInkiLGZ1bmN0aW9uKHQpe3JldHVybiJzIj09PXQudHlwZVswXT9uWzFdWzFdLWEvMjpuWzBdWzFdLWEvMn0pLmF0dHIoIndpZHRoIixmdW5jdGlvbih0KXtyZXR1cm4ibiI9PT10LnR5cGV8fCJzIj09PXQudHlwZT9uWzFdWzBdLW5bMF1bMF0rYTphfSkuYXR0cigiaGVpZ2h0IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGV8fCJ3Ij09PXQudHlwZT9uWzFdWzFdLW5bMF1bMV0rYTphfSkpOnQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uLC5oYW5kbGUiKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKS5hdHRyKCJ4IixudWxsKS5hdHRyKCJ5IixudWxsKS5hdHRyKCJ3aWR0aCIsbnVsbCkuYXR0cigiaGVpZ2h0IixudWxsKX1mdW5jdGlvbiBjKHQsbil7cmV0dXJuIHQuX19icnVzaC5lbWl0dGVyfHxuZXcgcyh0LG4pfWZ1bmN0aW9uIHModCxuKXt0aGlzLnRoYXQ9dCx0aGlzLmFyZ3M9bix0aGlzLnN0YXRlPXQuX19icnVzaCx0aGlzLmFjdGl2ZT0wfWZ1bmN0aW9uIGwoKXtpZih0LmV2ZW50LnRvdWNoZXMpe2lmKHQuZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoPHQuZXZlbnQudG91Y2hlcy5sZW5ndGgpcmV0dXJuIHZpKCl9ZWxzZSBpZihlKXJldHVybjtpZihpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIHIsbyxhLHUscyxsLGgsZCxwLHYsZyx5LF8sYj10aGlzLG09dC5ldmVudC50YXJnZXQuX19kYXRhX18udHlwZSx4PSJzZWxlY3Rpb24iPT09KHQuZXZlbnQubWV0YUtleT9tPSJvdmVybGF5IjptKT9naTp0LmV2ZW50LmFsdEtleT9iaTpfaSx3PW49PT14aT9udWxsOk5pW21dLE09bj09PW1pP251bGw6U2lbbV0sQT1QaShiKSxUPUEuZXh0ZW50LE49QS5zZWxlY3Rpb24sUz1UWzBdWzBdLEU9VFswXVsxXSxrPVRbMV1bMF0sQz1UWzFdWzFdLFA9dyYmTSYmdC5ldmVudC5zaGlmdEtleSx6PUZ0KGIpLFI9eixMPWMoYixhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCk7Im92ZXJsYXkiPT09bT9BLnNlbGVjdGlvbj1OPVtbcj1uPT09eGk/Uzp6WzBdLGE9bj09PW1pP0U6elsxXV0sW3M9bj09PXhpP2s6cixoPW49PT1taT9DOmFdXToocj1OWzBdWzBdLGE9TlswXVsxXSxzPU5bMV1bMF0saD1OWzFdWzFdKSxvPXIsdT1hLGw9cyxkPWg7dmFyIEQ9RHQoYikuYXR0cigicG9pbnRlci1ldmVudHMiLCJub25lIiksVT1ELnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5hdHRyKCJjdXJzb3IiLE1pW21dKTtpZih0LmV2ZW50LnRvdWNoZXMpRC5vbigidG91Y2htb3ZlLmJydXNoIixPLCEwKS5vbigidG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLEIsITApO2Vsc2V7dmFyIHE9RHQodC5ldmVudC52aWV3KS5vbigia2V5ZG93bi5icnVzaCIsZnVuY3Rpb24oKXtzd2l0Y2godC5ldmVudC5rZXlDb2RlKXtjYXNlIDE2OlA9dyYmTTticmVhaztjYXNlIDE4Ong9PT1faSYmKHcmJihzPWwtcCp3LHI9bytwKncpLE0mJihoPWQtdipNLGE9dSt2Kk0pLHg9YmksWSgpKTticmVhaztjYXNlIDMyOnghPT1faSYmeCE9PWJpfHwodzwwP3M9bC1wOnc+MCYmKHI9by1wKSxNPDA/aD1kLXY6TT4wJiYoYT11LXYpLHg9eWksVS5hdHRyKCJjdXJzb3IiLE1pLnNlbGVjdGlvbiksWSgpKTticmVhaztkZWZhdWx0OnJldHVybn12aSgpfSwhMCkub24oImtleXVwLmJydXNoIixmdW5jdGlvbigpe3N3aXRjaCh0LmV2ZW50LmtleUNvZGUpe2Nhc2UgMTY6UCYmKHk9Xz1QPSExLFkoKSk7YnJlYWs7Y2FzZSAxODp4PT09YmkmJih3PDA/cz1sOnc+MCYmKHI9byksTTwwP2g9ZDpNPjAmJihhPXUpLHg9X2ksWSgpKTticmVhaztjYXNlIDMyOng9PT15aSYmKHQuZXZlbnQuYWx0S2V5Pyh3JiYocz1sLXAqdyxyPW8rcCp3KSxNJiYoaD1kLXYqTSxhPXUrdipNKSx4PWJpKToodzwwP3M9bDp3PjAmJihyPW8pLE08MD9oPWQ6TT4wJiYoYT11KSx4PV9pKSxVLmF0dHIoImN1cnNvciIsTWlbbV0pLFkoKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59dmkoKX0sITApLm9uKCJtb3VzZW1vdmUuYnJ1c2giLE8sITApLm9uKCJtb3VzZXVwLmJydXNoIixCLCEwKTtYdCh0LmV2ZW50LnZpZXcpfXBpKCksTnIoYiksZi5jYWxsKGIpLEwuc3RhcnQoKX1mdW5jdGlvbiBPKCl7dmFyIHQ9RnQoYik7IVB8fHl8fF98fChNYXRoLmFicyh0WzBdLVJbMF0pPk1hdGguYWJzKHRbMV0tUlsxXSk/Xz0hMDp5PSEwKSxSPXQsZz0hMCx2aSgpLFkoKX1mdW5jdGlvbiBZKCl7dmFyIHQ7c3dpdGNoKHA9UlswXS16WzBdLHY9UlsxXS16WzFdLHgpe2Nhc2UgeWk6Y2FzZSBnaTp3JiYocD1NYXRoLm1heChTLXIsTWF0aC5taW4oay1zLHApKSxvPXIrcCxsPXMrcCksTSYmKHY9TWF0aC5tYXgoRS1hLE1hdGgubWluKEMtaCx2KSksdT1hK3YsZD1oK3YpO2JyZWFrO2Nhc2UgX2k6dzwwPyhwPU1hdGgubWF4KFMtcixNYXRoLm1pbihrLXIscCkpLG89citwLGw9cyk6dz4wJiYocD1NYXRoLm1heChTLXMsTWF0aC5taW4oay1zLHApKSxvPXIsbD1zK3ApLE08MD8odj1NYXRoLm1heChFLWEsTWF0aC5taW4oQy1hLHYpKSx1PWErdixkPWgpOk0+MCYmKHY9TWF0aC5tYXgoRS1oLE1hdGgubWluKEMtaCx2KSksdT1hLGQ9aCt2KTticmVhaztjYXNlIGJpOncmJihvPU1hdGgubWF4KFMsTWF0aC5taW4oayxyLXAqdykpLGw9TWF0aC5tYXgoUyxNYXRoLm1pbihrLHMrcCp3KSkpLE0mJih1PU1hdGgubWF4KEUsTWF0aC5taW4oQyxhLXYqTSkpLGQ9TWF0aC5tYXgoRSxNYXRoLm1pbihDLGgrdipNKSkpfWw8byYmKHcqPS0xLHQ9cixyPXMscz10LHQ9byxvPWwsbD10LG0gaW4gQWkmJlUuYXR0cigiY3Vyc29yIixNaVttPUFpW21dXSkpLGQ8dSYmKE0qPS0xLHQ9YSxhPWgsaD10LHQ9dSx1PWQsZD10LG0gaW4gVGkmJlUuYXR0cigiY3Vyc29yIixNaVttPVRpW21dXSkpLEEuc2VsZWN0aW9uJiYoTj1BLnNlbGVjdGlvbikseSYmKG89TlswXVswXSxsPU5bMV1bMF0pLF8mJih1PU5bMF1bMV0sZD1OWzFdWzFdKSxOWzBdWzBdPT09byYmTlswXVsxXT09PXUmJk5bMV1bMF09PT1sJiZOWzFdWzFdPT09ZHx8KEEuc2VsZWN0aW9uPVtbbyx1XSxbbCxkXV0sZi5jYWxsKGIpLEwuYnJ1c2goKSl9ZnVuY3Rpb24gQigpe2lmKHBpKCksdC5ldmVudC50b3VjaGVzKXtpZih0LmV2ZW50LnRvdWNoZXMubGVuZ3RoKXJldHVybjtlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZT1udWxsfSw1MDApLEQub24oInRvdWNobW92ZS5icnVzaCB0b3VjaGVuZC5icnVzaCB0b3VjaGNhbmNlbC5icnVzaCIsbnVsbCl9ZWxzZSBHdCh0LmV2ZW50LnZpZXcsZykscS5vbigia2V5ZG93bi5icnVzaCBrZXl1cC5icnVzaCBtb3VzZW1vdmUuYnJ1c2ggbW91c2V1cC5icnVzaCIsbnVsbCk7RC5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLFUuYXR0cigiY3Vyc29yIixNaS5vdmVybGF5KSxBLnNlbGVjdGlvbiYmKE49QS5zZWxlY3Rpb24pLHppKE4pJiYoQS5zZWxlY3Rpb249bnVsbCxmLmNhbGwoYikpLEwuZW5kKCl9fWZ1bmN0aW9uIGgoKXt2YXIgdD10aGlzLl9fYnJ1c2h8fHtzZWxlY3Rpb246bnVsbH07cmV0dXJuIHQuZXh0ZW50PXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuZGltPW4sdH1yZXR1cm4gdS5tb3ZlPWZ1bmN0aW9uKHQsZSl7dC5zZWxlY3Rpb24/dC5vbigic3RhcnQuYnJ1c2giLGZ1bmN0aW9uKCl7Yyh0aGlzLGFyZ3VtZW50cykuYmVmb3Jlc3RhcnQoKS5zdGFydCgpfSkub24oImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2giLGZ1bmN0aW9uKCl7Yyh0aGlzLGFyZ3VtZW50cykuZW5kKCl9KS50d2VlbigiYnJ1c2giLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxyPXQuX19icnVzaCxpPWModCxhcmd1bWVudHMpLG89ci5zZWxlY3Rpb24sYT1uLmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUsci5leHRlbnQpLHU9bWUobyxhKTtmdW5jdGlvbiBzKG4pe3Iuc2VsZWN0aW9uPTE9PT1uJiZ6aShhKT9udWxsOnUobiksZi5jYWxsKHQpLGkuYnJ1c2goKX1yZXR1cm4gbyYmYT9zOnMoMSl9KTp0LmVhY2goZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMscj10aGlzLl9fYnJ1c2gsaT1uLmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyx0KTplLHIuZXh0ZW50KSxvPWModGhpcyx0KS5iZWZvcmVzdGFydCgpO05yKHRoaXMpLHIuc2VsZWN0aW9uPW51bGw9PWl8fHppKGkpP251bGw6aSxmLmNhbGwodGhpcyksby5zdGFydCgpLmJydXNoKCkuZW5kKCl9KX0scy5wcm90b3R5cGU9e2JlZm9yZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLnN0YXRlLmVtaXR0ZXI9dGhpcyx0aGlzLnN0YXJ0aW5nPSEwKSx0aGlzfSxzdGFydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0aW5nJiYodGhpcy5zdGFydGluZz0hMSx0aGlzLmVtaXQoInN0YXJ0IikpLHRoaXN9LGJydXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW1pdCgiYnJ1c2giKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09LS10aGlzLmFjdGl2ZSYmKGRlbGV0ZSB0aGlzLnN0YXRlLmVtaXR0ZXIsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXtDdChuZXcgZGkodSx0LG4ub3V0cHV0KHRoaXMuc3RhdGUuc2VsZWN0aW9uKSksby5hcHBseSxvLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LHUuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6aGkoW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLHUpOnJ9LHUuZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6aGkoISF0KSx1KTppfSx1LmhhbmRsZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9K3QsdSk6YX0sdS5vbj1mdW5jdGlvbigpe3ZhciB0PW8ub24uYXBwbHkobyxhcmd1bWVudHMpO3JldHVybiB0PT09bz91OnR9LHV9dmFyIExpPU1hdGguY29zLERpPU1hdGguc2luLFVpPU1hdGguUEkscWk9VWkvMixPaT0yKlVpLFlpPU1hdGgubWF4O3ZhciBCaT1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gRmkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBJaT1NYXRoLlBJLEhpPTIqSWksamk9SGktMWUtNjtmdW5jdGlvbiBYaSgpe3RoaXMuX3gwPXRoaXMuX3kwPXRoaXMuX3gxPXRoaXMuX3kxPW51bGwsdGhpcy5fPSIifWZ1bmN0aW9uIEdpKCl7cmV0dXJuIG5ldyBYaX1mdW5jdGlvbiBWaSh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gJGkodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIFdpKHQpe3JldHVybiB0LnJhZGl1c31mdW5jdGlvbiBaaSh0KXtyZXR1cm4gdC5zdGFydEFuZ2xlfWZ1bmN0aW9uIFFpKHQpe3JldHVybiB0LmVuZEFuZ2xlfVhpLnByb3RvdHlwZT1HaS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlhpLG1vdmVUbzpmdW5jdGlvbih0LG4pe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rbil9LGNsb3NlUGF0aDpmdW5jdGlvbigpe251bGwhPT10aGlzLl94MSYmKHRoaXMuX3gxPXRoaXMuX3gwLHRoaXMuX3kxPXRoaXMuX3kwLHRoaXMuXys9IloiKX0sbGluZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fKz0iTCIrKHRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kxPStuKX0scXVhZHJhdGljQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyKXt0aGlzLl8rPSJRIisgK3QrIiwiKyArbisiLCIrKHRoaXMuX3gxPStlKSsiLCIrKHRoaXMuX3kxPStyKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyLGksbyl7dGhpcy5fKz0iQyIrICt0KyIsIisgK24rIiwiKyArZSsiLCIrICtyKyIsIisodGhpcy5feDE9K2kpKyIsIisodGhpcy5feTE9K28pfSxhcmNUbzpmdW5jdGlvbih0LG4sZSxyLGkpe3Q9K3Qsbj0rbixlPStlLHI9K3IsaT0raTt2YXIgbz10aGlzLl94MSxhPXRoaXMuX3kxLHU9ZS10LGY9ci1uLGM9by10LHM9YS1uLGw9YypjK3MqcztpZihpPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIraSk7aWYobnVsbD09PXRoaXMuX3gxKXRoaXMuXys9Ik0iKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPW4pO2Vsc2UgaWYobD4xZS02KWlmKE1hdGguYWJzKHMqdS1mKmMpPjFlLTYmJmkpe3ZhciBoPWUtbyxkPXItYSxwPXUqdStmKmYsdj1oKmgrZCpkLGc9TWF0aC5zcXJ0KHApLHk9TWF0aC5zcXJ0KGwpLF89aSpNYXRoLnRhbigoSWktTWF0aC5hY29zKChwK2wtdikvKDIqZyp5KSkpLzIpLGI9Xy95LG09Xy9nO01hdGguYWJzKGItMSk+MWUtNiYmKHRoaXMuXys9IkwiKyh0K2IqYykrIiwiKyhuK2IqcykpLHRoaXMuXys9IkEiK2krIiwiK2krIiwwLDAsIisgKyhzKmg+YypkKSsiLCIrKHRoaXMuX3gxPXQrbSp1KSsiLCIrKHRoaXMuX3kxPW4rbSpmKX1lbHNlIHRoaXMuXys9IkwiKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPW4pO2Vsc2U7fSxhcmM6ZnVuY3Rpb24odCxuLGUscixpLG8pe3Q9K3Qsbj0rbjt2YXIgYT0oZT0rZSkqTWF0aC5jb3MociksdT1lKk1hdGguc2luKHIpLGY9dCthLGM9bit1LHM9MV5vLGw9bz9yLWk6aS1yO2lmKGU8MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIitlKTtudWxsPT09dGhpcy5feDE/dGhpcy5fKz0iTSIrZisiLCIrYzooTWF0aC5hYnModGhpcy5feDEtZik+MWUtNnx8TWF0aC5hYnModGhpcy5feTEtYyk+MWUtNikmJih0aGlzLl8rPSJMIitmKyIsIitjKSxlJiYobDwwJiYobD1sJUhpK0hpKSxsPmppP3RoaXMuXys9IkEiK2UrIiwiK2UrIiwwLDEsIitzKyIsIisodC1hKSsiLCIrKG4tdSkrIkEiK2UrIiwiK2UrIiwwLDEsIitzKyIsIisodGhpcy5feDE9ZikrIiwiKyh0aGlzLl95MT1jKTpsPjFlLTYmJih0aGlzLl8rPSJBIitlKyIsIitlKyIsMCwiKyArKGw+PUlpKSsiLCIrcysiLCIrKHRoaXMuX3gxPXQrZSpNYXRoLmNvcyhpKSkrIiwiKyh0aGlzLl95MT1uK2UqTWF0aC5zaW4oaSkpKSl9LHJlY3Q6ZnVuY3Rpb24odCxuLGUscil7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStuKSsiaCIrICtlKyJ2IisgK3IrImgiKy1lKyJaIn0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX07ZnVuY3Rpb24gSmkoKXt9ZnVuY3Rpb24gS2kodCxuKXt2YXIgZT1uZXcgSmk7aWYodCBpbnN0YW5jZW9mIEppKXQuZWFjaChmdW5jdGlvbih0LG4pe2Uuc2V0KG4sdCl9KTtlbHNlIGlmKEFycmF5LmlzQXJyYXkodCkpe3ZhciByLGk9LTEsbz10Lmxlbmd0aDtpZihudWxsPT1uKWZvcig7KytpPG87KWUuc2V0KGksdFtpXSk7ZWxzZSBmb3IoOysraTxvOyllLnNldChuKHI9dFtpXSxpLHQpLHIpfWVsc2UgaWYodClmb3IodmFyIGEgaW4gdCllLnNldChhLHRbYV0pO3JldHVybiBlfWZ1bmN0aW9uIHRvKCl7cmV0dXJue319ZnVuY3Rpb24gbm8odCxuLGUpe3Rbbl09ZX1mdW5jdGlvbiBlbygpe3JldHVybiBLaSgpfWZ1bmN0aW9uIHJvKHQsbixlKXt0LnNldChuLGUpfWZ1bmN0aW9uIGlvKCl7fUppLnByb3RvdHlwZT1LaS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkppLGhhczpmdW5jdGlvbih0KXtyZXR1cm4iJCIrdCBpbiB0aGlzfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbIiQiK3RdfSxzZXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpc1siJCIrdF09bix0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49IiQiK3Q7cmV0dXJuIG4gaW4gdGhpcyYmZGVsZXRlIHRoaXNbbl19LGNsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpIiQiPT09dFswXSYmZGVsZXRlIHRoaXNbdF19LGtleXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0LnB1c2gobi5zbGljZSgxKSk7cmV0dXJuIHR9LHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKSIkIj09PW5bMF0mJnQucHVzaCh0aGlzW25dKTtyZXR1cm4gdH0sZW50cmllczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKSIkIj09PW5bMF0mJnQucHVzaCh7a2V5Om4uc2xpY2UoMSksdmFsdWU6dGhpc1tuXX0pO3JldHVybiB0fSxzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9MDtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiYrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpaWYoIiQiPT09dFswXSlyZXR1cm4hMTtyZXR1cm4hMH0sZWFjaDpmdW5jdGlvbih0KXtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0KHRoaXNbbl0sbi5zbGljZSgxKSx0aGlzKX19O3ZhciBvbz1LaS5wcm90b3R5cGU7ZnVuY3Rpb24gYW8odCxuKXt2YXIgZT1uZXcgaW87aWYodCBpbnN0YW5jZW9mIGlvKXQuZWFjaChmdW5jdGlvbih0KXtlLmFkZCh0KX0pO2Vsc2UgaWYodCl7dmFyIHI9LTEsaT10Lmxlbmd0aDtpZihudWxsPT1uKWZvcig7KytyPGk7KWUuYWRkKHRbcl0pO2Vsc2UgZm9yKDsrK3I8aTspZS5hZGQobih0W3JdLHIsdCkpfXJldHVybiBlfWlvLnByb3RvdHlwZT1hby5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmlvLGhhczpvby5oYXMsYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzWyIkIisodCs9IiIpXT10LHRoaXN9LHJlbW92ZTpvby5yZW1vdmUsY2xlYXI6b28uY2xlYXIsdmFsdWVzOm9vLmtleXMsc2l6ZTpvby5zaXplLGVtcHR5Om9vLmVtcHR5LGVhY2g6b28uZWFjaH07dmFyIHVvPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBmbyh0LG4pe3JldHVybiB0LW59ZnVuY3Rpb24gY28odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIHNvKHQsbil7Zm9yKHZhciBlLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspaWYoZT1sbyh0LG5bcl0pKXJldHVybiBlO3JldHVybiAwfWZ1bmN0aW9uIGxvKHQsbil7Zm9yKHZhciBlPW5bMF0scj1uWzFdLGk9LTEsbz0wLGE9dC5sZW5ndGgsdT1hLTE7bzxhO3U9bysrKXt2YXIgZj10W29dLGM9ZlswXSxzPWZbMV0sbD10W3VdLGg9bFswXSxkPWxbMV07aWYoaG8oZixsLG4pKXJldHVybiAwO3M+ciE9ZD5yJiZlPChoLWMpKihyLXMpLyhkLXMpK2MmJihpPS1pKX1yZXR1cm4gaX1mdW5jdGlvbiBobyh0LG4sZSl7dmFyIHIsaSxvLGE7cmV0dXJuIGZ1bmN0aW9uKHQsbixlKXtyZXR1cm4oblswXS10WzBdKSooZVsxXS10WzFdKT09KGVbMF0tdFswXSkqKG5bMV0tdFsxXSl9KHQsbixlKSYmKGk9dFtyPSsodFswXT09PW5bMF0pXSxvPWVbcl0sYT1uW3JdLGk8PW8mJm88PWF8fGE8PW8mJm88PWkpfWZ1bmN0aW9uIHBvKCl7fXZhciB2bz1bW10sW1tbMSwxLjVdLFsuNSwxXV1dLFtbWzEuNSwxXSxbMSwxLjVdXV0sW1tbMS41LDFdLFsuNSwxXV1dLFtbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLDEuNV0sWy41LDFdXSxbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLC41XSxbMSwxLjVdXV0sW1tbMSwuNV0sWy41LDFdXV0sW1tbLjUsMV0sWzEsLjVdXV0sW1tbMSwxLjVdLFsxLC41XV1dLFtbWy41LDFdLFsxLC41XV0sW1sxLjUsMV0sWzEsMS41XV1dLFtbWzEuNSwxXSxbMSwuNV1dXSxbW1suNSwxXSxbMS41LDFdXV0sW1tbMSwxLjVdLFsxLjUsMV1dXSxbW1suNSwxXSxbMSwxLjVdXV0sW11dO2Z1bmN0aW9uIGdvKCl7dmFyIHQ9MSxuPTEsZT1NLHI9dTtmdW5jdGlvbiBpKHQpe3ZhciBuPWUodCk7aWYoQXJyYXkuaXNBcnJheShuKSluPW4uc2xpY2UoKS5zb3J0KGZvKTtlbHNle3ZhciByPXModCksaT1yWzBdLGE9clsxXTtuPXcoaSxhLG4pLG49ZyhNYXRoLmZsb29yKGkvbikqbixNYXRoLmZsb29yKGEvbikqbixuKX1yZXR1cm4gbi5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG8odCxuKX0pfWZ1bmN0aW9uIG8oZSxpKXt2YXIgbz1bXSx1PVtdO3JldHVybiBmdW5jdGlvbihlLHIsaSl7dmFyIG8sdSxmLGMscyxsLGg9bmV3IEFycmF5LGQ9bmV3IEFycmF5O289dT0tMSxjPWVbMF0+PXIsdm9bYzw8MV0uZm9yRWFjaChwKTtmb3IoOysrbzx0LTE7KWY9YyxjPWVbbysxXT49cix2b1tmfGM8PDFdLmZvckVhY2gocCk7dm9bYzw8MF0uZm9yRWFjaChwKTtmb3IoOysrdTxuLTE7KXtmb3Iobz0tMSxjPWVbdSp0K3RdPj1yLHM9ZVt1KnRdPj1yLHZvW2M8PDF8czw8Ml0uZm9yRWFjaChwKTsrK288dC0xOylmPWMsYz1lW3UqdCt0K28rMV0+PXIsbD1zLHM9ZVt1KnQrbysxXT49cix2b1tmfGM8PDF8czw8MnxsPDwzXS5mb3JFYWNoKHApO3ZvW2N8czw8M10uZm9yRWFjaChwKX1vPS0xLHM9ZVt1KnRdPj1yLHZvW3M8PDJdLmZvckVhY2gocCk7Zm9yKDsrK288dC0xOylsPXMscz1lW3UqdCtvKzFdPj1yLHZvW3M8PDJ8bDw8M10uZm9yRWFjaChwKTtmdW5jdGlvbiBwKHQpe3ZhciBuLGUscj1bdFswXVswXStvLHRbMF1bMV0rdV0sZj1bdFsxXVswXStvLHRbMV1bMV0rdV0sYz1hKHIpLHM9YShmKTsobj1kW2NdKT8oZT1oW3NdKT8oZGVsZXRlIGRbbi5lbmRdLGRlbGV0ZSBoW2Uuc3RhcnRdLG49PT1lPyhuLnJpbmcucHVzaChmKSxpKG4ucmluZykpOmhbbi5zdGFydF09ZFtlLmVuZF09e3N0YXJ0Om4uc3RhcnQsZW5kOmUuZW5kLHJpbmc6bi5yaW5nLmNvbmNhdChlLnJpbmcpfSk6KGRlbGV0ZSBkW24uZW5kXSxuLnJpbmcucHVzaChmKSxkW24uZW5kPXNdPW4pOihuPWhbc10pPyhlPWRbY10pPyhkZWxldGUgaFtuLnN0YXJ0XSxkZWxldGUgZFtlLmVuZF0sbj09PWU/KG4ucmluZy5wdXNoKGYpLGkobi5yaW5nKSk6aFtlLnN0YXJ0XT1kW24uZW5kXT17c3RhcnQ6ZS5zdGFydCxlbmQ6bi5lbmQscmluZzplLnJpbmcuY29uY2F0KG4ucmluZyl9KTooZGVsZXRlIGhbbi5zdGFydF0sbi5yaW5nLnVuc2hpZnQociksaFtuLnN0YXJ0PWNdPW4pOmhbY109ZFtzXT17c3RhcnQ6YyxlbmQ6cyxyaW5nOltyLGZdfX12b1tzPDwzXS5mb3JFYWNoKHApfShlLGksZnVuY3Rpb24odCl7cih0LGUsaSksZnVuY3Rpb24odCl7Zm9yKHZhciBuPTAsZT10Lmxlbmd0aCxyPXRbZS0xXVsxXSp0WzBdWzBdLXRbZS0xXVswXSp0WzBdWzFdOysrbjxlOylyKz10W24tMV1bMV0qdFtuXVswXS10W24tMV1bMF0qdFtuXVsxXTtyZXR1cm4gcn0odCk+MD9vLnB1c2goW3RdKTp1LnB1c2godCl9KSx1LmZvckVhY2goZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9MCxyPW8ubGVuZ3RoO2U8cjsrK2UpaWYoLTEhPT1zbygobj1vW2VdKVswXSx0KSlyZXR1cm4gdm9pZCBuLnB1c2godCl9KSx7dHlwZToiTXVsdGlQb2x5Z29uIix2YWx1ZTppLGNvb3JkaW5hdGVzOm99fWZ1bmN0aW9uIGEobil7cmV0dXJuIDIqblswXStuWzFdKih0KzEpKjR9ZnVuY3Rpb24gdShlLHIsaSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBvLGE9ZVswXSx1PWVbMV0sZj0wfGEsYz0wfHUscz1yW2MqdCtmXTthPjAmJmE8dCYmZj09PWEmJihvPXJbYyp0K2YtMV0sZVswXT1hKyhpLW8pLyhzLW8pLS41KSx1PjAmJnU8biYmYz09PXUmJihvPXJbKGMtMSkqdCtmXSxlWzFdPXUrKGktbykvKHMtbyktLjUpfSl9cmV0dXJuIGkuY29udG91cj1vLGkuc2l6ZT1mdW5jdGlvbihlKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm5bdCxuXTt2YXIgcj1NYXRoLmNlaWwoZVswXSksbz1NYXRoLmNlaWwoZVsxXSk7aWYoIShyPjAmJm8+MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNpemUiKTtyZXR1cm4gdD1yLG49byxpfSxpLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP2NvKHVvLmNhbGwodCkpOmNvKHQpLGkpOmV9LGkuc21vb3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQ/dTpwbyxpKTpyPT09dX0saX1mdW5jdGlvbiB5byh0LG4sZSl7Zm9yKHZhciByPXQud2lkdGgsaT10LmhlaWdodCxvPTErKGU8PDEpLGE9MDthPGk7KythKWZvcih2YXIgdT0wLGY9MDt1PHIrZTsrK3UpdTxyJiYoZis9dC5kYXRhW3UrYSpyXSksdT49ZSYmKHU+PW8mJihmLT10LmRhdGFbdS1vK2Eqcl0pLG4uZGF0YVt1LWUrYSpyXT1mL01hdGgubWluKHUrMSxyLTErby11LG8pKX1mdW5jdGlvbiBfbyh0LG4sZSl7Zm9yKHZhciByPXQud2lkdGgsaT10LmhlaWdodCxvPTErKGU8PDEpLGE9MDthPHI7KythKWZvcih2YXIgdT0wLGY9MDt1PGkrZTsrK3UpdTxpJiYoZis9dC5kYXRhW2ErdSpyXSksdT49ZSYmKHU+PW8mJihmLT10LmRhdGFbYSsodS1vKSpyXSksbi5kYXRhW2ErKHUtZSkqcl09Zi9NYXRoLm1pbih1KzEsaS0xK28tdSxvKSl9ZnVuY3Rpb24gYm8odCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gbW8odCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24geG8oKXtyZXR1cm4gMX12YXIgd289e30sTW89e30sQW89MzQsVG89MTAsTm89MTM7ZnVuY3Rpb24gU28odCl7cmV0dXJuIG5ldyBGdW5jdGlvbigiZCIsInJldHVybiB7Iit0Lm1hcChmdW5jdGlvbih0LG4pe3JldHVybiBKU09OLnN0cmluZ2lmeSh0KSsiOiBkWyIrbisiXSJ9KS5qb2luKCIsIikrIn0iKX1mdW5jdGlvbiBFbyh0KXt2YXIgbj1uZXcgUmVnRXhwKCdbIicrdCsiXG5ccl0iKSxlPXQuY2hhckNvZGVBdCgwKTtmdW5jdGlvbiByKHQsbil7dmFyIHIsaT1bXSxvPXQubGVuZ3RoLGE9MCx1PTAsZj1vPD0wLGM9ITE7ZnVuY3Rpb24gcygpe2lmKGYpcmV0dXJuIE1vO2lmKGMpcmV0dXJuIGM9ITEsd287dmFyIG4scixpPWE7aWYodC5jaGFyQ29kZUF0KGkpPT09QW8pe2Zvcig7YSsrPG8mJnQuY2hhckNvZGVBdChhKSE9PUFvfHx0LmNoYXJDb2RlQXQoKythKT09PUFvOyk7cmV0dXJuKG49YSk+PW8/Zj0hMDoocj10LmNoYXJDb2RlQXQoYSsrKSk9PT1Ubz9jPSEwOnI9PT1ObyYmKGM9ITAsdC5jaGFyQ29kZUF0KGEpPT09VG8mJisrYSksdC5zbGljZShpKzEsbi0xKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDthPG87KXtpZigocj10LmNoYXJDb2RlQXQobj1hKyspKT09PVRvKWM9ITA7ZWxzZSBpZihyPT09Tm8pYz0hMCx0LmNoYXJDb2RlQXQoYSk9PT1UbyYmKythO2Vsc2UgaWYociE9PWUpY29udGludWU7cmV0dXJuIHQuc2xpY2UoaSxuKX1yZXR1cm4gZj0hMCx0LnNsaWNlKGksbyl9Zm9yKHQuY2hhckNvZGVBdChvLTEpPT09VG8mJi0tbyx0LmNoYXJDb2RlQXQoby0xKT09PU5vJiYtLW87KHI9cygpKSE9PU1vOyl7Zm9yKHZhciBsPVtdO3IhPT13byYmciE9PU1vOylsLnB1c2gocikscj1zKCk7biYmbnVsbD09KGw9bihsLHUrKykpfHxpLnB1c2gobCl9cmV0dXJuIGl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gbi5tYXAobykuam9pbih0KX1mdW5jdGlvbiBvKHQpe3JldHVybiBudWxsPT10PyIiOm4udGVzdCh0Kz0iIik/JyInK3QucmVwbGFjZSgvIi9nLCciIicpKyciJzp0fXJldHVybntwYXJzZTpmdW5jdGlvbih0LG4pe3ZhciBlLGksbz1yKHQsZnVuY3Rpb24odCxyKXtpZihlKXJldHVybiBlKHQsci0xKTtpPXQsZT1uP2Z1bmN0aW9uKHQsbil7dmFyIGU9U28odCk7cmV0dXJuIGZ1bmN0aW9uKHIsaSl7cmV0dXJuIG4oZShyKSxpLHQpfX0odCxuKTpTbyh0KX0pO3JldHVybiBvLmNvbHVtbnM9aXx8W10sb30scGFyc2VSb3dzOnIsZm9ybWF0OmZ1bmN0aW9uKG4sZSl7cmV0dXJuIG51bGw9PWUmJihlPWZ1bmN0aW9uKHQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCksZT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgciBpbiB0KXIgaW4gbnx8ZS5wdXNoKG5bcl09cil9KSxlfShuKSksW2UubWFwKG8pLmpvaW4odCldLmNvbmNhdChuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIG8oblt0XSl9KS5qb2luKHQpfSkpLmpvaW4oIlxuIil9LGZvcm1hdFJvd3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKGkpLmpvaW4oIlxuIil9fX12YXIga289RW8oIiwiKSxDbz1rby5wYXJzZSxQbz1rby5wYXJzZVJvd3Msem89a28uZm9ybWF0LFJvPWtvLmZvcm1hdFJvd3MsTG89RW8oIlx0IiksRG89TG8ucGFyc2UsVW89TG8ucGFyc2VSb3dzLHFvPUxvLmZvcm1hdCxPbz1Mby5mb3JtYXRSb3dzO2Z1bmN0aW9uIFlvKHQpe2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcih0LnN0YXR1cysiICIrdC5zdGF0dXNUZXh0KTtyZXR1cm4gdC5ibG9iKCl9ZnVuY3Rpb24gQm8odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LmFycmF5QnVmZmVyKCl9ZnVuY3Rpb24gRm8odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LnRleHQoKX1mdW5jdGlvbiBJbyh0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oRm8pfWZ1bmN0aW9uIEhvKHQpe3JldHVybiBmdW5jdGlvbihuLGUscil7cmV0dXJuIDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPXZvaWQgMCksSW8obixlKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybiB0KG4scil9KX19dmFyIGpvPUhvKENvKSxYbz1IbyhEbyk7ZnVuY3Rpb24gR28odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0Lmpzb24oKX1mdW5jdGlvbiBWbyh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXtyZXR1cm4gSW8obixlKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybihuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcobix0KX0pfX12YXIgJG89Vm8oImFwcGxpY2F0aW9uL3htbCIpLFdvPVZvKCJ0ZXh0L2h0bWwiKSxabz1WbygiaW1hZ2Uvc3ZnK3htbCIpO2Z1bmN0aW9uIFFvKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBKbygpe3JldHVybiAxZS02KihNYXRoLnJhbmRvbSgpLS41KX1mdW5jdGlvbiBLbyh0LG4sZSxyKXtpZihpc05hTihuKXx8aXNOYU4oZSkpcmV0dXJuIHQ7dmFyIGksbyxhLHUsZixjLHMsbCxoLGQ9dC5fcm9vdCxwPXtkYXRhOnJ9LHY9dC5feDAsZz10Ll95MCx5PXQuX3gxLF89dC5feTE7aWYoIWQpcmV0dXJuIHQuX3Jvb3Q9cCx0O2Zvcig7ZC5sZW5ndGg7KWlmKChjPW4+PShvPSh2K3kpLzIpKT92PW86eT1vLChzPWU+PShhPShnK18pLzIpKT9nPWE6Xz1hLGk9ZCwhKGQ9ZFtsPXM8PDF8Y10pKXJldHVybiBpW2xdPXAsdDtpZih1PSt0Ll94LmNhbGwobnVsbCxkLmRhdGEpLGY9K3QuX3kuY2FsbChudWxsLGQuZGF0YSksbj09PXUmJmU9PT1mKXJldHVybiBwLm5leHQ9ZCxpP2lbbF09cDp0Ll9yb290PXAsdDtkb3tpPWk/aVtsXT1uZXcgQXJyYXkoNCk6dC5fcm9vdD1uZXcgQXJyYXkoNCksKGM9bj49KG89KHYreSkvMikpP3Y9bzp5PW8sKHM9ZT49KGE9KGcrXykvMikpP2c9YTpfPWF9d2hpbGUoKGw9czw8MXxjKT09KGg9KGY+PWEpPDwxfHU+PW8pKTtyZXR1cm4gaVtoXT1kLGlbbF09cCx0fWZ1bmN0aW9uIHRhKHQsbixlLHIsaSl7dGhpcy5ub2RlPXQsdGhpcy54MD1uLHRoaXMueTA9ZSx0aGlzLngxPXIsdGhpcy55MT1pfWZ1bmN0aW9uIG5hKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIGVhKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIHJhKHQsbixlKXt2YXIgcj1uZXcgaWEobnVsbD09bj9uYTpuLG51bGw9PWU/ZWE6ZSxOYU4sTmFOLE5hTixOYU4pO3JldHVybiBudWxsPT10P3I6ci5hZGRBbGwodCl9ZnVuY3Rpb24gaWEodCxuLGUscixpLG8pe3RoaXMuX3g9dCx0aGlzLl95PW4sdGhpcy5feDA9ZSx0aGlzLl95MD1yLHRoaXMuX3gxPWksdGhpcy5feTE9byx0aGlzLl9yb290PXZvaWQgMH1mdW5jdGlvbiBvYSh0KXtmb3IodmFyIG49e2RhdGE6dC5kYXRhfSxlPW47dD10Lm5leHQ7KWU9ZS5uZXh0PXtkYXRhOnQuZGF0YX07cmV0dXJuIG59dmFyIGFhPXJhLnByb3RvdHlwZT1pYS5wcm90b3R5cGU7ZnVuY3Rpb24gdWEodCl7cmV0dXJuIHQueCt0LnZ4fWZ1bmN0aW9uIGZhKHQpe3JldHVybiB0LnkrdC52eX1mdW5jdGlvbiBjYSh0KXtyZXR1cm4gdC5pbmRleH1mdW5jdGlvbiBzYSh0LG4pe3ZhciBlPXQuZ2V0KG4pO2lmKCFlKXRocm93IG5ldyBFcnJvcigibWlzc2luZzogIituKTtyZXR1cm4gZX1mdW5jdGlvbiBsYSh0KXtyZXR1cm4gdC54fWZ1bmN0aW9uIGhhKHQpe3JldHVybiB0Lnl9YWEuY29weT1mdW5jdGlvbigpe3ZhciB0LG4sZT1uZXcgaWEodGhpcy5feCx0aGlzLl95LHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSxyPXRoaXMuX3Jvb3Q7aWYoIXIpcmV0dXJuIGU7aWYoIXIubGVuZ3RoKXJldHVybiBlLl9yb290PW9hKHIpLGU7Zm9yKHQ9W3tzb3VyY2U6cix0YXJnZXQ6ZS5fcm9vdD1uZXcgQXJyYXkoNCl9XTtyPXQucG9wKCk7KWZvcih2YXIgaT0wO2k8NDsrK2kpKG49ci5zb3VyY2VbaV0pJiYobi5sZW5ndGg/dC5wdXNoKHtzb3VyY2U6bix0YXJnZXQ6ci50YXJnZXRbaV09bmV3IEFycmF5KDQpfSk6ci50YXJnZXRbaV09b2EobikpO3JldHVybiBlfSxhYS5hZGQ9ZnVuY3Rpb24odCl7dmFyIG49K3RoaXMuX3guY2FsbChudWxsLHQpLGU9K3RoaXMuX3kuY2FsbChudWxsLHQpO3JldHVybiBLbyh0aGlzLmNvdmVyKG4sZSksbixlLHQpfSxhYS5hZGRBbGw9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbz10Lmxlbmd0aCxhPW5ldyBBcnJheShvKSx1PW5ldyBBcnJheShvKSxmPTEvMCxjPTEvMCxzPS0xLzAsbD0tMS8wO2ZvcihlPTA7ZTxvOysrZSlpc05hTihyPSt0aGlzLl94LmNhbGwobnVsbCxuPXRbZV0pKXx8aXNOYU4oaT0rdGhpcy5feS5jYWxsKG51bGwsbikpfHwoYVtlXT1yLHVbZV09aSxyPGYmJihmPXIpLHI+cyYmKHM9ciksaTxjJiYoYz1pKSxpPmwmJihsPWkpKTtmb3IoczxmJiYoZj10aGlzLl94MCxzPXRoaXMuX3gxKSxsPGMmJihjPXRoaXMuX3kwLGw9dGhpcy5feTEpLHRoaXMuY292ZXIoZixjKS5jb3ZlcihzLGwpLGU9MDtlPG87KytlKUtvKHRoaXMsYVtlXSx1W2VdLHRbZV0pO3JldHVybiB0aGlzfSxhYS5jb3Zlcj1mdW5jdGlvbih0LG4pe2lmKGlzTmFOKHQ9K3QpfHxpc05hTihuPStuKSlyZXR1cm4gdGhpczt2YXIgZT10aGlzLl94MCxyPXRoaXMuX3kwLGk9dGhpcy5feDEsbz10aGlzLl95MTtpZihpc05hTihlKSlpPShlPU1hdGguZmxvb3IodCkpKzEsbz0ocj1NYXRoLmZsb29yKG4pKSsxO2Vsc2V7aWYoIShlPnR8fHQ+aXx8cj5ufHxuPm8pKXJldHVybiB0aGlzO3ZhciBhLHUsZj1pLWUsYz10aGlzLl9yb290O3N3aXRjaCh1PShuPChyK28pLzIpPDwxfHQ8KGUraSkvMil7Y2FzZSAwOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUobz1yKyhmKj0yKSx0PihpPWUrZil8fG4+byk7YnJlYWs7Y2FzZSAxOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUobz1yKyhmKj0yKSwoZT1pLWYpPnR8fG4+byk7YnJlYWs7Y2FzZSAyOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUocj1vLShmKj0yKSx0PihpPWUrZil8fHI+bik7YnJlYWs7Y2FzZSAzOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUocj1vLShmKj0yKSwoZT1pLWYpPnR8fHI+bil9dGhpcy5fcm9vdCYmdGhpcy5fcm9vdC5sZW5ndGgmJih0aGlzLl9yb290PWMpfXJldHVybiB0aGlzLl94MD1lLHRoaXMuX3kwPXIsdGhpcy5feDE9aSx0aGlzLl95MT1vLHRoaXN9LGFhLmRhdGE9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy52aXNpdChmdW5jdGlvbihuKXtpZighbi5sZW5ndGgpZG97dC5wdXNoKG4uZGF0YSl9d2hpbGUobj1uLm5leHQpfSksdH0sYWEuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuY292ZXIoK3RbMF1bMF0sK3RbMF1bMV0pLmNvdmVyKCt0WzFdWzBdLCt0WzFdWzFdKTppc05hTih0aGlzLl94MCk/dm9pZCAwOltbdGhpcy5feDAsdGhpcy5feTBdLFt0aGlzLl94MSx0aGlzLl95MV1dfSxhYS5maW5kPWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG8sYSx1LGYsYyxzPXRoaXMuX3gwLGw9dGhpcy5feTAsaD10aGlzLl94MSxkPXRoaXMuX3kxLHA9W10sdj10aGlzLl9yb290O2Zvcih2JiZwLnB1c2gobmV3IHRhKHYscyxsLGgsZCkpLG51bGw9PWU/ZT0xLzA6KHM9dC1lLGw9bi1lLGg9dCtlLGQ9bitlLGUqPWUpO2Y9cC5wb3AoKTspaWYoISghKHY9Zi5ub2RlKXx8KGk9Zi54MCk+aHx8KG89Zi55MCk+ZHx8KGE9Zi54MSk8c3x8KHU9Zi55MSk8bCkpaWYodi5sZW5ndGgpe3ZhciBnPShpK2EpLzIseT0obyt1KS8yO3AucHVzaChuZXcgdGEodlszXSxnLHksYSx1KSxuZXcgdGEodlsyXSxpLHksZyx1KSxuZXcgdGEodlsxXSxnLG8sYSx5KSxuZXcgdGEodlswXSxpLG8sZyx5KSksKGM9KG4+PXkpPDwxfHQ+PWcpJiYoZj1wW3AubGVuZ3RoLTFdLHBbcC5sZW5ndGgtMV09cFtwLmxlbmd0aC0xLWNdLHBbcC5sZW5ndGgtMS1jXT1mKX1lbHNle3ZhciBfPXQtK3RoaXMuX3guY2FsbChudWxsLHYuZGF0YSksYj1uLSt0aGlzLl95LmNhbGwobnVsbCx2LmRhdGEpLG09XypfK2IqYjtpZihtPGUpe3ZhciB4PU1hdGguc3FydChlPW0pO3M9dC14LGw9bi14LGg9dCt4LGQ9bit4LHI9di5kYXRhfX1yZXR1cm4gcn0sYWEucmVtb3ZlPWZ1bmN0aW9uKHQpe2lmKGlzTmFOKG89K3RoaXMuX3guY2FsbChudWxsLHQpKXx8aXNOYU4oYT0rdGhpcy5feS5jYWxsKG51bGwsdCkpKXJldHVybiB0aGlzO3ZhciBuLGUscixpLG8sYSx1LGYsYyxzLGwsaCxkPXRoaXMuX3Jvb3QscD10aGlzLl94MCx2PXRoaXMuX3kwLGc9dGhpcy5feDEseT10aGlzLl95MTtpZighZClyZXR1cm4gdGhpcztpZihkLmxlbmd0aClmb3IoOzspe2lmKChjPW8+PSh1PShwK2cpLzIpKT9wPXU6Zz11LChzPWE+PShmPSh2K3kpLzIpKT92PWY6eT1mLG49ZCwhKGQ9ZFtsPXM8PDF8Y10pKXJldHVybiB0aGlzO2lmKCFkLmxlbmd0aClicmVhazsobltsKzEmM118fG5bbCsyJjNdfHxuW2wrMyYzXSkmJihlPW4saD1sKX1mb3IoO2QuZGF0YSE9PXQ7KWlmKHI9ZCwhKGQ9ZC5uZXh0KSlyZXR1cm4gdGhpcztyZXR1cm4oaT1kLm5leHQpJiZkZWxldGUgZC5uZXh0LHI/KGk/ci5uZXh0PWk6ZGVsZXRlIHIubmV4dCx0aGlzKTpuPyhpP25bbF09aTpkZWxldGUgbltsXSwoZD1uWzBdfHxuWzFdfHxuWzJdfHxuWzNdKSYmZD09PShuWzNdfHxuWzJdfHxuWzFdfHxuWzBdKSYmIWQubGVuZ3RoJiYoZT9lW2hdPWQ6dGhpcy5fcm9vdD1kKSx0aGlzKToodGhpcy5fcm9vdD1pLHRoaXMpfSxhYS5yZW1vdmVBbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBuPTAsZT10Lmxlbmd0aDtuPGU7KytuKXRoaXMucmVtb3ZlKHRbbl0pO3JldHVybiB0aGlzfSxhYS5yb290PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jvb3R9LGFhLnNpemU9ZnVuY3Rpb24oKXt2YXIgdD0wO3JldHVybiB0aGlzLnZpc2l0KGZ1bmN0aW9uKG4pe2lmKCFuLmxlbmd0aClkb3srK3R9d2hpbGUobj1uLm5leHQpfSksdH0sYWEudmlzaXQ9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbyxhLHU9W10sZj10aGlzLl9yb290O2ZvcihmJiZ1LnB1c2gobmV3IHRhKGYsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtuPXUucG9wKCk7KWlmKCF0KGY9bi5ub2RlLHI9bi54MCxpPW4ueTAsbz1uLngxLGE9bi55MSkmJmYubGVuZ3RoKXt2YXIgYz0ocitvKS8yLHM9KGkrYSkvMjsoZT1mWzNdKSYmdS5wdXNoKG5ldyB0YShlLGMscyxvLGEpKSwoZT1mWzJdKSYmdS5wdXNoKG5ldyB0YShlLHIscyxjLGEpKSwoZT1mWzFdKSYmdS5wdXNoKG5ldyB0YShlLGMsaSxvLHMpKSwoZT1mWzBdKSYmdS5wdXNoKG5ldyB0YShlLHIsaSxjLHMpKX1yZXR1cm4gdGhpc30sYWEudmlzaXRBZnRlcj1mdW5jdGlvbih0KXt2YXIgbixlPVtdLHI9W107Zm9yKHRoaXMuX3Jvb3QmJmUucHVzaChuZXcgdGEodGhpcy5fcm9vdCx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkpO249ZS5wb3AoKTspe3ZhciBpPW4ubm9kZTtpZihpLmxlbmd0aCl7dmFyIG8sYT1uLngwLHU9bi55MCxmPW4ueDEsYz1uLnkxLHM9KGErZikvMixsPSh1K2MpLzI7KG89aVswXSkmJmUucHVzaChuZXcgdGEobyxhLHUscyxsKSksKG89aVsxXSkmJmUucHVzaChuZXcgdGEobyxzLHUsZixsKSksKG89aVsyXSkmJmUucHVzaChuZXcgdGEobyxhLGwscyxjKSksKG89aVszXSkmJmUucHVzaChuZXcgdGEobyxzLGwsZixjKSl9ci5wdXNoKG4pfWZvcig7bj1yLnBvcCgpOyl0KG4ubm9kZSxuLngwLG4ueTAsbi54MSxuLnkxKTtyZXR1cm4gdGhpc30sYWEueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5feD10LHRoaXMpOnRoaXMuX3h9LGFhLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3k9dCx0aGlzKTp0aGlzLl95fTt2YXIgZGE9MTAscGE9TWF0aC5QSSooMy1NYXRoLnNxcnQoNSkpO2Z1bmN0aW9uIHZhKHQsbil7aWYoKGU9KHQ9bj90LnRvRXhwb25lbnRpYWwobi0xKTp0LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKTwwKXJldHVybiBudWxsO3ZhciBlLHI9dC5zbGljZSgwLGUpO3JldHVybltyLmxlbmd0aD4xP3JbMF0rci5zbGljZSgyKTpyLCt0LnNsaWNlKGUrMSldfWZ1bmN0aW9uIGdhKHQpe3JldHVybih0PXZhKE1hdGguYWJzKHQpKSk/dFsxXTpOYU59dmFyIHlhLF9hPS9eKD86KC4pPyhbPD49Xl0pKT8oWytcLSggXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuXGQrKT8ofik/KFthLXolXSk/JC9pO2Z1bmN0aW9uIGJhKHQpe3JldHVybiBuZXcgbWEodCl9ZnVuY3Rpb24gbWEodCl7aWYoIShuPV9hLmV4ZWModCkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIrdCk7dmFyIG47dGhpcy5maWxsPW5bMV18fCIgIix0aGlzLmFsaWduPW5bMl18fCI+Iix0aGlzLnNpZ249blszXXx8Ii0iLHRoaXMuc3ltYm9sPW5bNF18fCIiLHRoaXMuemVybz0hIW5bNV0sdGhpcy53aWR0aD1uWzZdJiYrbls2XSx0aGlzLmNvbW1hPSEhbls3XSx0aGlzLnByZWNpc2lvbj1uWzhdJiYrbls4XS5zbGljZSgxKSx0aGlzLnRyaW09ISFuWzldLHRoaXMudHlwZT1uWzEwXXx8IiJ9ZnVuY3Rpb24geGEodCxuKXt2YXIgZT12YSh0LG4pO2lmKCFlKXJldHVybiB0KyIiO3ZhciByPWVbMF0saT1lWzFdO3JldHVybiBpPDA/IjAuIituZXcgQXJyYXkoLWkpLmpvaW4oIjAiKStyOnIubGVuZ3RoPmkrMT9yLnNsaWNlKDAsaSsxKSsiLiIrci5zbGljZShpKzEpOnIrbmV3IEFycmF5KGktci5sZW5ndGgrMikuam9pbigiMCIpfWJhLnByb3RvdHlwZT1tYS5wcm90b3R5cGUsbWEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbCt0aGlzLmFsaWduK3RoaXMuc2lnbit0aGlzLnN5bWJvbCsodGhpcy56ZXJvPyIwIjoiIikrKG51bGw9PXRoaXMud2lkdGg/IiI6TWF0aC5tYXgoMSwwfHRoaXMud2lkdGgpKSsodGhpcy5jb21tYT8iLCI6IiIpKyhudWxsPT10aGlzLnByZWNpc2lvbj8iIjoiLiIrTWF0aC5tYXgoMCwwfHRoaXMucHJlY2lzaW9uKSkrKHRoaXMudHJpbT8ifiI6IiIpK3RoaXMudHlwZX07dmFyIHdhPXsiJSI6ZnVuY3Rpb24odCxuKXtyZXR1cm4oMTAwKnQpLnRvRml4ZWQobil9LGI6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMil9LGM6ZnVuY3Rpb24odCl7cmV0dXJuIHQrIiJ9LGQ6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTApfSxlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQudG9FeHBvbmVudGlhbChuKX0sZjpmdW5jdGlvbih0LG4pe3JldHVybiB0LnRvRml4ZWQobil9LGc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdC50b1ByZWNpc2lvbihuKX0sbzpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZyg4KX0scDpmdW5jdGlvbih0LG4pe3JldHVybiB4YSgxMDAqdCxuKX0scjp4YSxzOmZ1bmN0aW9uKHQsbil7dmFyIGU9dmEodCxuKTtpZighZSlyZXR1cm4gdCsiIjt2YXIgcj1lWzBdLGk9ZVsxXSxvPWktKHlhPTMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKGkvMykpKSkrMSxhPXIubGVuZ3RoO3JldHVybiBvPT09YT9yOm8+YT9yK25ldyBBcnJheShvLWErMSkuam9pbigiMCIpOm8+MD9yLnNsaWNlKDAsbykrIi4iK3Iuc2xpY2Uobyk6IjAuIituZXcgQXJyYXkoMS1vKS5qb2luKCIwIikrdmEodCxNYXRoLm1heCgwLG4rby0xKSlbMF19LFg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LHg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpfX07ZnVuY3Rpb24gTWEodCl7cmV0dXJuIHR9dmFyIEFhLFRhPVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTtmdW5jdGlvbiBOYSh0KXt2YXIgbixlLHI9dC5ncm91cGluZyYmdC50aG91c2FuZHM/KG49dC5ncm91cGluZyxlPXQudGhvdXNhbmRzLGZ1bmN0aW9uKHQscil7Zm9yKHZhciBpPXQubGVuZ3RoLG89W10sYT0wLHU9blswXSxmPTA7aT4wJiZ1PjAmJihmK3UrMT5yJiYodT1NYXRoLm1heCgxLHItZikpLG8ucHVzaCh0LnN1YnN0cmluZyhpLT11LGkrdSkpLCEoKGYrPXUrMSk+cikpOyl1PW5bYT0oYSsxKSVuLmxlbmd0aF07cmV0dXJuIG8ucmV2ZXJzZSgpLmpvaW4oZSl9KTpNYSxpPXQuY3VycmVuY3ksbz10LmRlY2ltYWwsYT10Lm51bWVyYWxzP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXBsYWNlKC9bMC05XS9nLGZ1bmN0aW9uKG4pe3JldHVybiB0WytuXX0pfX0odC5udW1lcmFscyk6TWEsdT10LnBlcmNlbnR8fCIlIjtmdW5jdGlvbiBmKHQpe3ZhciBuPSh0PWJhKHQpKS5maWxsLGU9dC5hbGlnbixmPXQuc2lnbixjPXQuc3ltYm9sLHM9dC56ZXJvLGw9dC53aWR0aCxoPXQuY29tbWEsZD10LnByZWNpc2lvbixwPXQudHJpbSx2PXQudHlwZTsibiI9PT12PyhoPSEwLHY9ImciKTp3YVt2XXx8KG51bGw9PWQmJihkPTEyKSxwPSEwLHY9ImciKSwoc3x8IjAiPT09biYmIj0iPT09ZSkmJihzPSEwLG49IjAiLGU9Ij0iKTt2YXIgZz0iJCI9PT1jP2lbMF06IiMiPT09YyYmL1tib3hYXS8udGVzdCh2KT8iMCIrdi50b0xvd2VyQ2FzZSgpOiIiLHk9IiQiPT09Yz9pWzFdOi9bJXBdLy50ZXN0KHYpP3U6IiIsXz13YVt2XSxiPS9bZGVmZ3BycyVdLy50ZXN0KHYpO2Z1bmN0aW9uIG0odCl7dmFyIGksdSxjLG09Zyx4PXk7aWYoImMiPT09dil4PV8odCkreCx0PSIiO2Vsc2V7dmFyIHc9KHQ9K3QpPDA7aWYodD1fKE1hdGguYWJzKHQpLGQpLHAmJih0PWZ1bmN0aW9uKHQpe3Q6Zm9yKHZhciBuLGU9dC5sZW5ndGgscj0xLGk9LTE7cjxlOysrcilzd2l0Y2godFtyXSl7Y2FzZSIuIjppPW49cjticmVhaztjYXNlIjAiOjA9PT1pJiYoaT1yKSxuPXI7YnJlYWs7ZGVmYXVsdDppZihpPjApe2lmKCErdFtyXSlicmVhayB0O2k9MH19cmV0dXJuIGk+MD90LnNsaWNlKDAsaSkrdC5zbGljZShuKzEpOnR9KHQpKSx3JiYwPT0rdCYmKHc9ITEpLG09KHc/IigiPT09Zj9mOiItIjoiLSI9PT1mfHwiKCI9PT1mPyIiOmYpK20seD0oInMiPT09dj9UYVs4K3lhLzNdOiIiKSt4Kyh3JiYiKCI9PT1mPyIpIjoiIiksYilmb3IoaT0tMSx1PXQubGVuZ3RoOysraTx1OylpZig0OD4oYz10LmNoYXJDb2RlQXQoaSkpfHxjPjU3KXt4PSg0Nj09PWM/byt0LnNsaWNlKGkrMSk6dC5zbGljZShpKSkreCx0PXQuc2xpY2UoMCxpKTticmVha319aCYmIXMmJih0PXIodCwxLzApKTt2YXIgTT1tLmxlbmd0aCt0Lmxlbmd0aCt4Lmxlbmd0aCxBPU08bD9uZXcgQXJyYXkobC1NKzEpLmpvaW4obik6IiI7c3dpdGNoKGgmJnMmJih0PXIoQSt0LEEubGVuZ3RoP2wteC5sZW5ndGg6MS8wKSxBPSIiKSxlKXtjYXNlIjwiOnQ9bSt0K3grQTticmVhaztjYXNlIj0iOnQ9bStBK3QreDticmVhaztjYXNlIl4iOnQ9QS5zbGljZSgwLE09QS5sZW5ndGg+PjEpK20rdCt4K0Euc2xpY2UoTSk7YnJlYWs7ZGVmYXVsdDp0PUErbSt0K3h9cmV0dXJuIGEodCl9cmV0dXJuIGQ9bnVsbD09ZD82Oi9bZ3Byc10vLnRlc3Qodik/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxkKSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxkKSksbS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0KyIifSxtfXJldHVybntmb3JtYXQ6Zixmb3JtYXRQcmVmaXg6ZnVuY3Rpb24odCxuKXt2YXIgZT1mKCgodD1iYSh0KSkudHlwZT0iZiIsdCkpLHI9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoZ2EobikvMykpKSxpPU1hdGgucG93KDEwLC1yKSxvPVRhWzgrci8zXTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUoaSp0KStvfX19fWZ1bmN0aW9uIFNhKG4pe3JldHVybiBBYT1OYShuKSx0LmZvcm1hdD1BYS5mb3JtYXQsdC5mb3JtYXRQcmVmaXg9QWEuZm9ybWF0UHJlZml4LEFhfWZ1bmN0aW9uIEVhKHQpe3JldHVybiBNYXRoLm1heCgwLC1nYShNYXRoLmFicyh0KSkpfWZ1bmN0aW9uIGthKHQsbil7cmV0dXJuIE1hdGgubWF4KDAsMypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoZ2EobikvMykpKS1nYShNYXRoLmFicyh0KSkpfWZ1bmN0aW9uIENhKHQsbil7cmV0dXJuIHQ9TWF0aC5hYnModCksbj1NYXRoLmFicyhuKS10LE1hdGgubWF4KDAsZ2EobiktZ2EodCkpKzF9ZnVuY3Rpb24gUGEoKXtyZXR1cm4gbmV3IHphfWZ1bmN0aW9uIHphKCl7dGhpcy5yZXNldCgpfVNhKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXX0pLHphLnByb3RvdHlwZT17Y29uc3RydWN0b3I6emEscmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LGFkZDpmdW5jdGlvbih0KXtMYShSYSx0LHRoaXMudCksTGEodGhpcyxSYS5zLHRoaXMucyksdGhpcy5zP3RoaXMudCs9UmEudDp0aGlzLnM9UmEudH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN9fTt2YXIgUmE9bmV3IHphO2Z1bmN0aW9uIExhKHQsbixlKXt2YXIgcj10LnM9bitlLGk9ci1uLG89ci1pO3QudD1uLW8rKGUtaSl9dmFyIERhPTFlLTYsVWE9MWUtMTIscWE9TWF0aC5QSSxPYT1xYS8yLFlhPXFhLzQsQmE9MipxYSxGYT0xODAvcWEsSWE9cWEvMTgwLEhhPU1hdGguYWJzLGphPU1hdGguYXRhbixYYT1NYXRoLmF0YW4yLEdhPU1hdGguY29zLFZhPU1hdGguY2VpbCwkYT1NYXRoLmV4cCxXYT1NYXRoLmxvZyxaYT1NYXRoLnBvdyxRYT1NYXRoLnNpbixKYT1NYXRoLnNpZ258fGZ1bmN0aW9uKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH0sS2E9TWF0aC5zcXJ0LHR1PU1hdGgudGFuO2Z1bmN0aW9uIG51KHQpe3JldHVybiB0PjE/MDp0PC0xP3FhOk1hdGguYWNvcyh0KX1mdW5jdGlvbiBldSh0KXtyZXR1cm4gdD4xP09hOnQ8LTE/LU9hOk1hdGguYXNpbih0KX1mdW5jdGlvbiBydSh0KXtyZXR1cm4odD1RYSh0LzIpKSp0fWZ1bmN0aW9uIGl1KCl7fWZ1bmN0aW9uIG91KHQsbil7dCYmdXUuaGFzT3duUHJvcGVydHkodC50eXBlKSYmdXVbdC50eXBlXSh0LG4pfXZhciBhdT17RmVhdHVyZTpmdW5jdGlvbih0LG4pe291KHQuZ2VvbWV0cnksbil9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZmVhdHVyZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylvdShlW3JdLmdlb21ldHJ5LG4pfX0sdXU9e1NwaGVyZTpmdW5jdGlvbih0LG4pe24uc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKHQsbil7dD10LmNvb3JkaW5hdGVzLG4ucG9pbnQodFswXSx0WzFdLHRbMl0pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyl0PWVbcl0sbi5wb2ludCh0WzBdLHRbMV0sdFsyXSl9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtmdSh0LmNvb3JkaW5hdGVzLG4sMCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspZnUoZVtyXSxuLDApfSxQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Y3UodC5jb29yZGluYXRlcyxuKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyljdShlW3JdLG4pfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5nZW9tZXRyaWVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspb3UoZVtyXSxuKX19O2Z1bmN0aW9uIGZ1KHQsbixlKXt2YXIgcixpPS0xLG89dC5sZW5ndGgtZTtmb3Iobi5saW5lU3RhcnQoKTsrK2k8bzspcj10W2ldLG4ucG9pbnQoclswXSxyWzFdLHJbMl0pO24ubGluZUVuZCgpfWZ1bmN0aW9uIGN1KHQsbil7dmFyIGU9LTEscj10Lmxlbmd0aDtmb3Iobi5wb2x5Z29uU3RhcnQoKTsrK2U8cjspZnUodFtlXSxuLDEpO24ucG9seWdvbkVuZCgpfWZ1bmN0aW9uIHN1KHQsbil7dCYmYXUuaGFzT3duUHJvcGVydHkodC50eXBlKT9hdVt0LnR5cGVdKHQsbik6b3UodCxuKX12YXIgbHUsaHUsZHUscHUsdnUsZ3U9UGEoKSx5dT1QYSgpLF91PXtwb2ludDppdSxsaW5lU3RhcnQ6aXUsbGluZUVuZDppdSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtndS5yZXNldCgpLF91LmxpbmVTdGFydD1idSxfdS5saW5lRW5kPW11fSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9K2d1O3l1LmFkZCh0PDA/QmErdDp0KSx0aGlzLmxpbmVTdGFydD10aGlzLmxpbmVFbmQ9dGhpcy5wb2ludD1pdX0sc3BoZXJlOmZ1bmN0aW9uKCl7eXUuYWRkKEJhKX19O2Z1bmN0aW9uIGJ1KCl7X3UucG9pbnQ9eHV9ZnVuY3Rpb24gbXUoKXt3dShsdSxodSl9ZnVuY3Rpb24geHUodCxuKXtfdS5wb2ludD13dSxsdT10LGh1PW4sZHU9dCo9SWEscHU9R2Eobj0obio9SWEpLzIrWWEpLHZ1PVFhKG4pfWZ1bmN0aW9uIHd1KHQsbil7dmFyIGU9KHQqPUlhKS1kdSxyPWU+PTA/MTotMSxpPXIqZSxvPUdhKG49KG4qPUlhKS8yK1lhKSxhPVFhKG4pLHU9dnUqYSxmPXB1Km8rdSpHYShpKSxjPXUqcipRYShpKTtndS5hZGQoWGEoYyxmKSksZHU9dCxwdT1vLHZ1PWF9ZnVuY3Rpb24gTXUodCl7cmV0dXJuW1hhKHRbMV0sdFswXSksZXUodFsyXSldfWZ1bmN0aW9uIEF1KHQpe3ZhciBuPXRbMF0sZT10WzFdLHI9R2EoZSk7cmV0dXJuW3IqR2EobikscipRYShuKSxRYShlKV19ZnVuY3Rpb24gVHUodCxuKXtyZXR1cm4gdFswXSpuWzBdK3RbMV0qblsxXSt0WzJdKm5bMl19ZnVuY3Rpb24gTnUodCxuKXtyZXR1cm5bdFsxXSpuWzJdLXRbMl0qblsxXSx0WzJdKm5bMF0tdFswXSpuWzJdLHRbMF0qblsxXS10WzFdKm5bMF1dfWZ1bmN0aW9uIFN1KHQsbil7dFswXSs9blswXSx0WzFdKz1uWzFdLHRbMl0rPW5bMl19ZnVuY3Rpb24gRXUodCxuKXtyZXR1cm5bdFswXSpuLHRbMV0qbix0WzJdKm5dfWZ1bmN0aW9uIGt1KHQpe3ZhciBuPUthKHRbMF0qdFswXSt0WzFdKnRbMV0rdFsyXSp0WzJdKTt0WzBdLz1uLHRbMV0vPW4sdFsyXS89bn12YXIgQ3UsUHUsenUsUnUsTHUsRHUsVXUscXUsT3UsWXUsQnUsRnUsSXUsSHUsanUsWHUsR3UsVnUsJHUsV3UsWnUsUXUsSnUsS3UsdGYsbmYsZWY9UGEoKSxyZj17cG9pbnQ6b2YsbGluZVN0YXJ0OnVmLGxpbmVFbmQ6ZmYscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7cmYucG9pbnQ9Y2YscmYubGluZVN0YXJ0PXNmLHJmLmxpbmVFbmQ9bGYsZWYucmVzZXQoKSxfdS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe191LnBvbHlnb25FbmQoKSxyZi5wb2ludD1vZixyZi5saW5lU3RhcnQ9dWYscmYubGluZUVuZD1mZixndTwwPyhDdT0tKHp1PTE4MCksUHU9LShSdT05MCkpOmVmPkRhP1J1PTkwOmVmPC1EYSYmKFB1PS05MCksWXVbMF09Q3UsWXVbMV09enV9fTtmdW5jdGlvbiBvZih0LG4pe091LnB1c2goWXU9W0N1PXQsenU9dF0pLG48UHUmJihQdT1uKSxuPlJ1JiYoUnU9bil9ZnVuY3Rpb24gYWYodCxuKXt2YXIgZT1BdShbdCpJYSxuKklhXSk7aWYocXUpe3ZhciByPU51KHF1LGUpLGk9TnUoW3JbMV0sLXJbMF0sMF0scik7a3UoaSksaT1NdShpKTt2YXIgbyxhPXQtTHUsdT1hPjA/MTotMSxmPWlbMF0qRmEqdSxjPUhhKGEpPjE4MDtjXih1Kkx1PGYmJmY8dSp0KT8obz1pWzFdKkZhKT5SdSYmKFJ1PW8pOmNeKHUqTHU8KGY9KGYrMzYwKSUzNjAtMTgwKSYmZjx1KnQpPyhvPS1pWzFdKkZhKTxQdSYmKFB1PW8pOihuPFB1JiYoUHU9biksbj5SdSYmKFJ1PW4pKSxjP3Q8THU/aGYoQ3UsdCk+aGYoQ3UsenUpJiYoenU9dCk6aGYodCx6dSk+aGYoQ3UsenUpJiYoQ3U9dCk6enU+PUN1Pyh0PEN1JiYoQ3U9dCksdD56dSYmKHp1PXQpKTp0Pkx1P2hmKEN1LHQpPmhmKEN1LHp1KSYmKHp1PXQpOmhmKHQsenUpPmhmKEN1LHp1KSYmKEN1PXQpfWVsc2UgT3UucHVzaChZdT1bQ3U9dCx6dT10XSk7bjxQdSYmKFB1PW4pLG4+UnUmJihSdT1uKSxxdT1lLEx1PXR9ZnVuY3Rpb24gdWYoKXtyZi5wb2ludD1hZn1mdW5jdGlvbiBmZigpe1l1WzBdPUN1LFl1WzFdPXp1LHJmLnBvaW50PW9mLHF1PW51bGx9ZnVuY3Rpb24gY2YodCxuKXtpZihxdSl7dmFyIGU9dC1MdTtlZi5hZGQoSGEoZSk+MTgwP2UrKGU+MD8zNjA6LTM2MCk6ZSl9ZWxzZSBEdT10LFV1PW47X3UucG9pbnQodCxuKSxhZih0LG4pfWZ1bmN0aW9uIHNmKCl7X3UubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbGYoKXtjZihEdSxVdSksX3UubGluZUVuZCgpLEhhKGVmKT5EYSYmKEN1PS0oenU9MTgwKSksWXVbMF09Q3UsWXVbMV09enUscXU9bnVsbH1mdW5jdGlvbiBoZih0LG4pe3JldHVybihuLT10KTwwP24rMzYwOm59ZnVuY3Rpb24gZGYodCxuKXtyZXR1cm4gdFswXS1uWzBdfWZ1bmN0aW9uIHBmKHQsbil7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9biYmbjw9dFsxXTpuPHRbMF18fHRbMV08bn12YXIgdmY9e3NwaGVyZTppdSxwb2ludDpnZixsaW5lU3RhcnQ6X2YsbGluZUVuZDp4Zixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt2Zi5saW5lU3RhcnQ9d2YsdmYubGluZUVuZD1NZn0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZmLmxpbmVTdGFydD1fZix2Zi5saW5lRW5kPXhmfX07ZnVuY3Rpb24gZ2YodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSk7eWYoZSpHYSh0KSxlKlFhKHQpLFFhKG4pKX1mdW5jdGlvbiB5Zih0LG4sZSl7SXUrPSh0LUl1KS8rK0J1LEh1Kz0obi1IdSkvQnUsanUrPShlLWp1KS9CdX1mdW5jdGlvbiBfZigpe3ZmLnBvaW50PWJmfWZ1bmN0aW9uIGJmKHQsbil7dCo9SWE7dmFyIGU9R2Eobio9SWEpO0t1PWUqR2EodCksdGY9ZSpRYSh0KSxuZj1RYShuKSx2Zi5wb2ludD1tZix5ZihLdSx0ZixuZil9ZnVuY3Rpb24gbWYodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSkscj1lKkdhKHQpLGk9ZSpRYSh0KSxvPVFhKG4pLGE9WGEoS2EoKGE9dGYqby1uZippKSphKyhhPW5mKnItS3UqbykqYSsoYT1LdSppLXRmKnIpKmEpLEt1KnIrdGYqaStuZipvKTtGdSs9YSxYdSs9YSooS3UrKEt1PXIpKSxHdSs9YSoodGYrKHRmPWkpKSxWdSs9YSoobmYrKG5mPW8pKSx5ZihLdSx0ZixuZil9ZnVuY3Rpb24geGYoKXt2Zi5wb2ludD1nZn1mdW5jdGlvbiB3Zigpe3ZmLnBvaW50PUFmfWZ1bmN0aW9uIE1mKCl7VGYoUXUsSnUpLHZmLnBvaW50PWdmfWZ1bmN0aW9uIEFmKHQsbil7UXU9dCxKdT1uLHQqPUlhLG4qPUlhLHZmLnBvaW50PVRmO3ZhciBlPUdhKG4pO0t1PWUqR2EodCksdGY9ZSpRYSh0KSxuZj1RYShuKSx5ZihLdSx0ZixuZil9ZnVuY3Rpb24gVGYodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSkscj1lKkdhKHQpLGk9ZSpRYSh0KSxvPVFhKG4pLGE9dGYqby1uZippLHU9bmYqci1LdSpvLGY9S3UqaS10ZipyLGM9S2EoYSphK3UqdStmKmYpLHM9ZXUoYyksbD1jJiYtcy9jOyR1Kz1sKmEsV3UrPWwqdSxadSs9bCpmLEZ1Kz1zLFh1Kz1zKihLdSsoS3U9cikpLEd1Kz1zKih0ZisodGY9aSkpLFZ1Kz1zKihuZisobmY9bykpLHlmKEt1LHRmLG5mKX1mdW5jdGlvbiBOZih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gU2YodCxuKXtmdW5jdGlvbiBlKGUscil7cmV0dXJuIGU9dChlLHIpLG4oZVswXSxlWzFdKX1yZXR1cm4gdC5pbnZlcnQmJm4uaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4oZT1uLmludmVydChlLHIpKSYmdC5pbnZlcnQoZVswXSxlWzFdKX0pLGV9ZnVuY3Rpb24gRWYodCxuKXtyZXR1cm5bdD5xYT90LUJhOnQ8LXFhP3QrQmE6dCxuXX1mdW5jdGlvbiBrZih0LG4sZSl7cmV0dXJuKHQlPUJhKT9ufHxlP1NmKFBmKHQpLHpmKG4sZSkpOlBmKHQpOm58fGU/emYobixlKTpFZn1mdW5jdGlvbiBDZih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXtyZXR1cm5bKG4rPXQpPnFhP24tQmE6bjwtcWE/bitCYTpuLGVdfX1mdW5jdGlvbiBQZih0KXt2YXIgbj1DZih0KTtyZXR1cm4gbi5pbnZlcnQ9Q2YoLXQpLG59ZnVuY3Rpb24gemYodCxuKXt2YXIgZT1HYSh0KSxyPVFhKHQpLGk9R2Eobiksbz1RYShuKTtmdW5jdGlvbiBhKHQsbil7dmFyIGE9R2EobiksdT1HYSh0KSphLGY9UWEodCkqYSxjPVFhKG4pLHM9YyplK3UqcjtyZXR1cm5bWGEoZippLXMqbyx1KmUtYypyKSxldShzKmkrZipvKV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGE9R2EobiksdT1HYSh0KSphLGY9UWEodCkqYSxjPVFhKG4pLHM9YyppLWYqbztyZXR1cm5bWGEoZippK2Mqbyx1KmUrcypyKSxldShzKmUtdSpyKV19LGF9ZnVuY3Rpb24gUmYodCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4obj10KG5bMF0qSWEsblsxXSpJYSkpWzBdKj1GYSxuWzFdKj1GYSxufXJldHVybiB0PWtmKHRbMF0qSWEsdFsxXSpJYSx0Lmxlbmd0aD4yP3RbMl0qSWE6MCksbi5pbnZlcnQ9ZnVuY3Rpb24obil7cmV0dXJuKG49dC5pbnZlcnQoblswXSpJYSxuWzFdKklhKSlbMF0qPUZhLG5bMV0qPUZhLG59LG59ZnVuY3Rpb24gTGYodCxuLGUscixpLG8pe2lmKGUpe3ZhciBhPUdhKG4pLHU9UWEobiksZj1yKmU7bnVsbD09aT8oaT1uK3IqQmEsbz1uLWYvMik6KGk9RGYoYSxpKSxvPURmKGEsbyksKHI+MD9pPG86aT5vKSYmKGkrPXIqQmEpKTtmb3IodmFyIGMscz1pO3I+MD9zPm86czxvO3MtPWYpYz1NdShbYSwtdSpHYShzKSwtdSpRYShzKV0pLHQucG9pbnQoY1swXSxjWzFdKX19ZnVuY3Rpb24gRGYodCxuKXsobj1BdShuKSlbMF0tPXQsa3Uobik7dmFyIGU9bnUoLW5bMV0pO3JldHVybigoLW5bMl08MD8tZTplKStCYS1EYSklQmF9ZnVuY3Rpb24gVWYoKXt2YXIgdCxuPVtdO3JldHVybntwb2ludDpmdW5jdGlvbihuLGUpe3QucHVzaChbbixlXSl9LGxpbmVTdGFydDpmdW5jdGlvbigpe24ucHVzaCh0PVtdKX0sbGluZUVuZDppdSxyZWpvaW46ZnVuY3Rpb24oKXtuLmxlbmd0aD4xJiZuLnB1c2gobi5wb3AoKS5jb25jYXQobi5zaGlmdCgpKSl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciBlPW47cmV0dXJuIG49W10sdD1udWxsLGV9fX1mdW5jdGlvbiBxZih0LG4pe3JldHVybiBIYSh0WzBdLW5bMF0pPERhJiZIYSh0WzFdLW5bMV0pPERhfWZ1bmN0aW9uIE9mKHQsbixlLHIpe3RoaXMueD10LHRoaXMuej1uLHRoaXMubz1lLHRoaXMuZT1yLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gWWYodCxuLGUscixpKXt2YXIgbyxhLHU9W10sZj1bXTtpZih0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoISgobj10Lmxlbmd0aC0xKTw9MCkpe3ZhciBuLGUscj10WzBdLGE9dFtuXTtpZihxZihyLGEpKXtmb3IoaS5saW5lU3RhcnQoKSxvPTA7bzxuOysrbylpLnBvaW50KChyPXRbb10pWzBdLHJbMV0pO2kubGluZUVuZCgpfWVsc2UgdS5wdXNoKGU9bmV3IE9mKHIsdCxudWxsLCEwKSksZi5wdXNoKGUubz1uZXcgT2YocixudWxsLGUsITEpKSx1LnB1c2goZT1uZXcgT2YoYSx0LG51bGwsITEpKSxmLnB1c2goZS5vPW5ldyBPZihhLG51bGwsZSwhMCkpfX0pLHUubGVuZ3RoKXtmb3IoZi5zb3J0KG4pLEJmKHUpLEJmKGYpLG89MCxhPWYubGVuZ3RoO288YTsrK28pZltvXS5lPWU9IWU7Zm9yKHZhciBjLHMsbD11WzBdOzspe2Zvcih2YXIgaD1sLGQ9ITA7aC52OylpZigoaD1oLm4pPT09bClyZXR1cm47Yz1oLnosaS5saW5lU3RhcnQoKTtkb3tpZihoLnY9aC5vLnY9ITAsaC5lKXtpZihkKWZvcihvPTAsYT1jLmxlbmd0aDtvPGE7KytvKWkucG9pbnQoKHM9Y1tvXSlbMF0sc1sxXSk7ZWxzZSByKGgueCxoLm4ueCwxLGkpO2g9aC5ufWVsc2V7aWYoZClmb3IoYz1oLnAueixvPWMubGVuZ3RoLTE7bz49MDstLW8paS5wb2ludCgocz1jW29dKVswXSxzWzFdKTtlbHNlIHIoaC54LGgucC54LC0xLGkpO2g9aC5wfWM9KGg9aC5vKS56LGQ9IWR9d2hpbGUoIWgudik7aS5saW5lRW5kKCl9fX1mdW5jdGlvbiBCZih0KXtpZihuPXQubGVuZ3RoKXtmb3IodmFyIG4sZSxyPTAsaT10WzBdOysrcjxuOylpLm49ZT10W3JdLGUucD1pLGk9ZTtpLm49ZT10WzBdLGUucD1pfX1FZi5pbnZlcnQ9RWY7dmFyIEZmPVBhKCk7ZnVuY3Rpb24gSWYodCxuKXt2YXIgZT1uWzBdLHI9blsxXSxpPVFhKHIpLG89W1FhKGUpLC1HYShlKSwwXSxhPTAsdT0wO0ZmLnJlc2V0KCksMT09PWk/cj1PYStEYTotMT09PWkmJihyPS1PYS1EYSk7Zm9yKHZhciBmPTAsYz10Lmxlbmd0aDtmPGM7KytmKWlmKGw9KHM9dFtmXSkubGVuZ3RoKWZvcih2YXIgcyxsLGg9c1tsLTFdLGQ9aFswXSxwPWhbMV0vMitZYSx2PVFhKHApLGc9R2EocCkseT0wO3k8bDsrK3ksZD1iLHY9eCxnPXcsaD1fKXt2YXIgXz1zW3ldLGI9X1swXSxtPV9bMV0vMitZYSx4PVFhKG0pLHc9R2EobSksTT1iLWQsQT1NPj0wPzE6LTEsVD1BKk0sTj1UPnFhLFM9dip4O2lmKEZmLmFkZChYYShTKkEqUWEoVCksZyp3K1MqR2EoVCkpKSxhKz1OP00rQSpCYTpNLE5eZD49ZV5iPj1lKXt2YXIgRT1OdShBdShoKSxBdShfKSk7a3UoRSk7dmFyIGs9TnUobyxFKTtrdShrKTt2YXIgQz0oTl5NPj0wPy0xOjEpKmV1KGtbMl0pOyhyPkN8fHI9PT1DJiYoRVswXXx8RVsxXSkpJiYodSs9Tl5NPj0wPzE6LTEpfX1yZXR1cm4oYTwtRGF8fGE8RGEmJkZmPC1EYSleMSZ1fWZ1bmN0aW9uIEhmKHQsbixlLHIpe3JldHVybiBmdW5jdGlvbihpKXt2YXIgbyxhLHUsZj1uKGkpLGM9VWYoKSxzPW4oYyksbD0hMSxoPXtwb2ludDpkLGxpbmVTdGFydDp2LGxpbmVFbmQ6Zyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtoLnBvaW50PXksaC5saW5lU3RhcnQ9XyxoLmxpbmVFbmQ9YixhPVtdLG89W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtoLnBvaW50PWQsaC5saW5lU3RhcnQ9dixoLmxpbmVFbmQ9ZyxhPU4oYSk7dmFyIHQ9SWYobyxyKTthLmxlbmd0aD8obHx8KGkucG9seWdvblN0YXJ0KCksbD0hMCksWWYoYSxYZix0LGUsaSkpOnQmJihsfHwoaS5wb2x5Z29uU3RhcnQoKSxsPSEwKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCkpLGwmJihpLnBvbHlnb25FbmQoKSxsPSExKSxhPW89bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7aS5wb2x5Z29uU3RhcnQoKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCksaS5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBkKG4sZSl7dChuLGUpJiZpLnBvaW50KG4sZSl9ZnVuY3Rpb24gcCh0LG4pe2YucG9pbnQodCxuKX1mdW5jdGlvbiB2KCl7aC5wb2ludD1wLGYubGluZVN0YXJ0KCl9ZnVuY3Rpb24gZygpe2gucG9pbnQ9ZCxmLmxpbmVFbmQoKX1mdW5jdGlvbiB5KHQsbil7dS5wdXNoKFt0LG5dKSxzLnBvaW50KHQsbil9ZnVuY3Rpb24gXygpe3MubGluZVN0YXJ0KCksdT1bXX1mdW5jdGlvbiBiKCl7eSh1WzBdWzBdLHVbMF1bMV0pLHMubGluZUVuZCgpO3ZhciB0LG4sZSxyLGY9cy5jbGVhbigpLGg9Yy5yZXN1bHQoKSxkPWgubGVuZ3RoO2lmKHUucG9wKCksby5wdXNoKHUpLHU9bnVsbCxkKWlmKDEmZil7aWYoKG49KGU9aFswXSkubGVuZ3RoLTEpPjApe2ZvcihsfHwoaS5wb2x5Z29uU3RhcnQoKSxsPSEwKSxpLmxpbmVTdGFydCgpLHQ9MDt0PG47Kyt0KWkucG9pbnQoKHI9ZVt0XSlbMF0sclsxXSk7aS5saW5lRW5kKCl9fWVsc2UgZD4xJiYyJmYmJmgucHVzaChoLnBvcCgpLmNvbmNhdChoLnNoaWZ0KCkpKSxhLnB1c2goaC5maWx0ZXIoamYpKX1yZXR1cm4gaH19ZnVuY3Rpb24gamYodCl7cmV0dXJuIHQubGVuZ3RoPjF9ZnVuY3Rpb24gWGYodCxuKXtyZXR1cm4oKHQ9dC54KVswXTwwP3RbMV0tT2EtRGE6T2EtdFsxXSktKChuPW4ueClbMF08MD9uWzFdLU9hLURhOk9hLW5bMV0pfXZhciBHZj1IZihmdW5jdGlvbigpe3JldHVybiEwfSxmdW5jdGlvbih0KXt2YXIgbixlPU5hTixyPU5hTixpPU5hTjtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5saW5lU3RhcnQoKSxuPTF9LHBvaW50OmZ1bmN0aW9uKG8sYSl7dmFyIHU9bz4wP3FhOi1xYSxmPUhhKG8tZSk7SGEoZi1xYSk8RGE/KHQucG9pbnQoZSxyPShyK2EpLzI+MD9PYTotT2EpLHQucG9pbnQoaSxyKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQodSxyKSx0LnBvaW50KG8sciksbj0wKTppIT09dSYmZj49cWEmJihIYShlLWkpPERhJiYoZS09aSpEYSksSGEoby11KTxEYSYmKG8tPXUqRGEpLHI9ZnVuY3Rpb24odCxuLGUscil7dmFyIGksbyxhPVFhKHQtZSk7cmV0dXJuIEhhKGEpPkRhP2phKChRYShuKSoobz1HYShyKSkqUWEoZSktUWEocikqKGk9R2EobikpKlFhKHQpKS8oaSpvKmEpKToobityKS8yfShlLHIsbyxhKSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHUsciksbj0wKSx0LnBvaW50KGU9byxyPWEpLGk9dX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLGU9cj1OYU59LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItbn19fSxmdW5jdGlvbih0LG4sZSxyKXt2YXIgaTtpZihudWxsPT10KWk9ZSpPYSxyLnBvaW50KC1xYSxpKSxyLnBvaW50KDAsaSksci5wb2ludChxYSxpKSxyLnBvaW50KHFhLDApLHIucG9pbnQocWEsLWkpLHIucG9pbnQoMCwtaSksci5wb2ludCgtcWEsLWkpLHIucG9pbnQoLXFhLDApLHIucG9pbnQoLXFhLGkpO2Vsc2UgaWYoSGEodFswXS1uWzBdKT5EYSl7dmFyIG89dFswXTxuWzBdP3FhOi1xYTtpPWUqby8yLHIucG9pbnQoLW8saSksci5wb2ludCgwLGkpLHIucG9pbnQobyxpKX1lbHNlIHIucG9pbnQoblswXSxuWzFdKX0sWy1xYSwtT2FdKTtmdW5jdGlvbiBWZih0KXt2YXIgbj1HYSh0KSxlPTYqSWEscj1uPjAsaT1IYShuKT5EYTtmdW5jdGlvbiBvKHQsZSl7cmV0dXJuIEdhKHQpKkdhKGUpPm59ZnVuY3Rpb24gYSh0LGUscil7dmFyIGk9WzEsMCwwXSxvPU51KEF1KHQpLEF1KGUpKSxhPVR1KG8sbyksdT1vWzBdLGY9YS11KnU7aWYoIWYpcmV0dXJuIXImJnQ7dmFyIGM9biphL2Yscz0tbip1L2YsbD1OdShpLG8pLGg9RXUoaSxjKTtTdShoLEV1KG8scykpO3ZhciBkPWwscD1UdShoLGQpLHY9VHUoZCxkKSxnPXAqcC12KihUdShoLGgpLTEpO2lmKCEoZzwwKSl7dmFyIHk9S2EoZyksXz1FdShkLCgtcC15KS92KTtpZihTdShfLGgpLF89TXUoXyksIXIpcmV0dXJuIF87dmFyIGIsbT10WzBdLHg9ZVswXSx3PXRbMV0sTT1lWzFdO3g8bSYmKGI9bSxtPXgseD1iKTt2YXIgQT14LW0sVD1IYShBLXFhKTxEYTtpZighVCYmTTx3JiYoYj13LHc9TSxNPWIpLFR8fEE8RGE/VD93K00+MF5fWzFdPChIYShfWzBdLW0pPERhP3c6TSk6dzw9X1sxXSYmX1sxXTw9TTpBPnFhXihtPD1fWzBdJiZfWzBdPD14KSl7dmFyIE49RXUoZCwoLXAreSkvdik7cmV0dXJuIFN1KE4saCksW18sTXUoTildfX19ZnVuY3Rpb24gdShuLGUpe3ZhciBpPXI/dDpxYS10LG89MDtyZXR1cm4gbjwtaT9vfD0xOm4+aSYmKG98PTIpLGU8LWk/b3w9NDplPmkmJihvfD04KSxvfXJldHVybiBIZihvLGZ1bmN0aW9uKHQpe3ZhciBuLGUsZixjLHM7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2M9Zj0hMSxzPTF9LHBvaW50OmZ1bmN0aW9uKGwsaCl7dmFyIGQscD1bbCxoXSx2PW8obCxoKSxnPXI/dj8wOnUobCxoKTp2P3UobCsobDwwP3FhOi1xYSksaCk6MDtpZighbiYmKGM9Zj12KSYmdC5saW5lU3RhcnQoKSx2IT09ZiYmKCEoZD1hKG4scCkpfHxxZihuLGQpfHxxZihwLGQpKSYmKHBbMF0rPURhLHBbMV0rPURhLHY9byhwWzBdLHBbMV0pKSx2IT09ZilzPTAsdj8odC5saW5lU3RhcnQoKSxkPWEocCxuKSx0LnBvaW50KGRbMF0sZFsxXSkpOihkPWEobixwKSx0LnBvaW50KGRbMF0sZFsxXSksdC5saW5lRW5kKCkpLG49ZDtlbHNlIGlmKGkmJm4mJnJedil7dmFyIHk7ZyZlfHwhKHk9YShwLG4sITApKXx8KHM9MCxyPyh0LmxpbmVTdGFydCgpLHQucG9pbnQoeVswXVswXSx5WzBdWzFdKSx0LnBvaW50KHlbMV1bMF0seVsxXVsxXSksdC5saW5lRW5kKCkpOih0LnBvaW50KHlbMV1bMF0seVsxXVsxXSksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHlbMF1bMF0seVswXVsxXSkpKX0hdnx8biYmcWYobixwKXx8dC5wb2ludChwWzBdLHBbMV0pLG49cCxmPXYsZT1nfSxsaW5lRW5kOmZ1bmN0aW9uKCl7ZiYmdC5saW5lRW5kKCksbj1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiBzfChjJiZmKTw8MX19fSxmdW5jdGlvbihuLHIsaSxvKXtMZihvLHQsZSxpLG4scil9LHI/WzAsLXRdOlstcWEsdC1xYV0pfXZhciAkZj0xZTksV2Y9LSRmO2Z1bmN0aW9uIFpmKHQsbixlLHIpe2Z1bmN0aW9uIGkoaSxvKXtyZXR1cm4gdDw9aSYmaTw9ZSYmbjw9byYmbzw9cn1mdW5jdGlvbiBvKGksbyx1LGMpe3ZhciBzPTAsbD0wO2lmKG51bGw9PWl8fChzPWEoaSx1KSkhPT0obD1hKG8sdSkpfHxmKGksbyk8MF51PjApZG97Yy5wb2ludCgwPT09c3x8Mz09PXM/dDplLHM+MT9yOm4pfXdoaWxlKChzPShzK3UrNCklNCkhPT1sKTtlbHNlIGMucG9pbnQob1swXSxvWzFdKX1mdW5jdGlvbiBhKHIsaSl7cmV0dXJuIEhhKHJbMF0tdCk8RGE/aT4wPzA6MzpIYShyWzBdLWUpPERhP2k+MD8yOjE6SGEoclsxXS1uKTxEYT9pPjA/MTowOmk+MD8zOjJ9ZnVuY3Rpb24gdSh0LG4pe3JldHVybiBmKHQueCxuLngpfWZ1bmN0aW9uIGYodCxuKXt2YXIgZT1hKHQsMSkscj1hKG4sMSk7cmV0dXJuIGUhPT1yP2UtcjowPT09ZT9uWzFdLXRbMV06MT09PWU/dFswXS1uWzBdOjI9PT1lP3RbMV0tblsxXTpuWzBdLXRbMF19cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBmLGMscyxsLGgsZCxwLHYsZyx5LF8sYj1hLG09VWYoKSx4PXtwb2ludDp3LGxpbmVTdGFydDpmdW5jdGlvbigpe3gucG9pbnQ9TSxjJiZjLnB1c2gocz1bXSk7eT0hMCxnPSExLHA9dj1OYU59LGxpbmVFbmQ6ZnVuY3Rpb24oKXtmJiYoTShsLGgpLGQmJmcmJm0ucmVqb2luKCksZi5wdXNoKG0ucmVzdWx0KCkpKTt4LnBvaW50PXcsZyYmYi5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2I9bSxmPVtdLGM9W10sXz0hMH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciBuPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPTAsZT0wLGk9Yy5sZW5ndGg7ZTxpOysrZSlmb3IodmFyIG8sYSx1PWNbZV0sZj0xLHM9dS5sZW5ndGgsbD11WzBdLGg9bFswXSxkPWxbMV07ZjxzOysrZilvPWgsYT1kLGw9dVtmXSxoPWxbMF0sZD1sWzFdLGE8PXI/ZD5yJiYoaC1vKSooci1hKT4oZC1hKSoodC1vKSYmKytuOmQ8PXImJihoLW8pKihyLWEpPChkLWEpKih0LW8pJiYtLW47cmV0dXJuIG59KCksZT1fJiZuLGk9KGY9TihmKSkubGVuZ3RoOyhlfHxpKSYmKGEucG9seWdvblN0YXJ0KCksZSYmKGEubGluZVN0YXJ0KCksbyhudWxsLG51bGwsMSxhKSxhLmxpbmVFbmQoKSksaSYmWWYoZix1LG4sbyxhKSxhLnBvbHlnb25FbmQoKSk7Yj1hLGY9Yz1zPW51bGx9fTtmdW5jdGlvbiB3KHQsbil7aSh0LG4pJiZiLnBvaW50KHQsbil9ZnVuY3Rpb24gTShvLGEpe3ZhciB1PWkobyxhKTtpZihjJiZzLnB1c2goW28sYV0pLHkpbD1vLGg9YSxkPXUseT0hMSx1JiYoYi5saW5lU3RhcnQoKSxiLnBvaW50KG8sYSkpO2Vsc2UgaWYodSYmZyliLnBvaW50KG8sYSk7ZWxzZXt2YXIgZj1bcD1NYXRoLm1heChXZixNYXRoLm1pbigkZixwKSksdj1NYXRoLm1heChXZixNYXRoLm1pbigkZix2KSldLG09W289TWF0aC5tYXgoV2YsTWF0aC5taW4oJGYsbykpLGE9TWF0aC5tYXgoV2YsTWF0aC5taW4oJGYsYSkpXTshZnVuY3Rpb24odCxuLGUscixpLG8pe3ZhciBhLHU9dFswXSxmPXRbMV0sYz0wLHM9MSxsPW5bMF0tdSxoPW5bMV0tZjtpZihhPWUtdSxsfHwhKGE+MCkpe2lmKGEvPWwsbDwwKXtpZihhPGMpcmV0dXJuO2E8cyYmKHM9YSl9ZWxzZSBpZihsPjApe2lmKGE+cylyZXR1cm47YT5jJiYoYz1hKX1pZihhPWktdSxsfHwhKGE8MCkpe2lmKGEvPWwsbDwwKXtpZihhPnMpcmV0dXJuO2E+YyYmKGM9YSl9ZWxzZSBpZihsPjApe2lmKGE8YylyZXR1cm47YTxzJiYocz1hKX1pZihhPXItZixofHwhKGE+MCkpe2lmKGEvPWgsaDwwKXtpZihhPGMpcmV0dXJuO2E8cyYmKHM9YSl9ZWxzZSBpZihoPjApe2lmKGE+cylyZXR1cm47YT5jJiYoYz1hKX1pZihhPW8tZixofHwhKGE8MCkpe2lmKGEvPWgsaDwwKXtpZihhPnMpcmV0dXJuO2E+YyYmKGM9YSl9ZWxzZSBpZihoPjApe2lmKGE8YylyZXR1cm47YTxzJiYocz1hKX1yZXR1cm4gYz4wJiYodFswXT11K2MqbCx0WzFdPWYrYypoKSxzPDEmJihuWzBdPXUrcypsLG5bMV09ZitzKmgpLCEwfX19fX0oZixtLHQsbixlLHIpP3UmJihiLmxpbmVTdGFydCgpLGIucG9pbnQobyxhKSxfPSExKTooZ3x8KGIubGluZVN0YXJ0KCksYi5wb2ludChmWzBdLGZbMV0pKSxiLnBvaW50KG1bMF0sbVsxXSksdXx8Yi5saW5lRW5kKCksXz0hMSl9cD1vLHY9YSxnPXV9cmV0dXJuIHh9fXZhciBRZixKZixLZix0Yz1QYSgpLG5jPXtzcGhlcmU6aXUscG9pbnQ6aXUsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7bmMucG9pbnQ9cmMsbmMubGluZUVuZD1lY30sbGluZUVuZDppdSxwb2x5Z29uU3RhcnQ6aXUscG9seWdvbkVuZDppdX07ZnVuY3Rpb24gZWMoKXtuYy5wb2ludD1uYy5saW5lRW5kPWl1fWZ1bmN0aW9uIHJjKHQsbil7UWY9dCo9SWEsSmY9UWEobio9SWEpLEtmPUdhKG4pLG5jLnBvaW50PWljfWZ1bmN0aW9uIGljKHQsbil7dCo9SWE7dmFyIGU9UWEobio9SWEpLHI9R2EobiksaT1IYSh0LVFmKSxvPUdhKGkpLGE9cipRYShpKSx1PUtmKmUtSmYqcipvLGY9SmYqZStLZipyKm87dGMuYWRkKFhhKEthKGEqYSt1KnUpLGYpKSxRZj10LEpmPWUsS2Y9cn1mdW5jdGlvbiBvYyh0KXtyZXR1cm4gdGMucmVzZXQoKSxzdSh0LG5jKSwrdGN9dmFyIGFjPVtudWxsLG51bGxdLHVjPXt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczphY307ZnVuY3Rpb24gZmModCxuKXtyZXR1cm4gYWNbMF09dCxhY1sxXT1uLG9jKHVjKX12YXIgY2M9e0ZlYXR1cmU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gbGModC5nZW9tZXRyeSxuKX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5mZWF0dXJlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGxjKGVbcl0uZ2VvbWV0cnksbikpcmV0dXJuITA7cmV0dXJuITF9fSxzYz17U3BoZXJlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBvaW50OmZ1bmN0aW9uKHQsbil7cmV0dXJuIGhjKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGhjKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gZGModC5jb29yZGluYXRlcyxuKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihkYyhlW3JdLG4pKXJldHVybiEwO3JldHVybiExfSxQb2x5Z29uOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHBjKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYocGMoZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZ2VvbWV0cmllcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGxjKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9fTtmdW5jdGlvbiBsYyh0LG4pe3JldHVybiEoIXR8fCFzYy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpKSYmc2NbdC50eXBlXSh0LG4pfWZ1bmN0aW9uIGhjKHQsbil7cmV0dXJuIDA9PT1mYyh0LG4pfWZ1bmN0aW9uIGRjKHQsbil7dmFyIGU9ZmModFswXSx0WzFdKTtyZXR1cm4gZmModFswXSxuKStmYyhuLHRbMV0pPD1lK0RhfWZ1bmN0aW9uIHBjKHQsbil7cmV0dXJuISFJZih0Lm1hcCh2YyksZ2MobikpfWZ1bmN0aW9uIHZjKHQpe3JldHVybih0PXQubWFwKGdjKSkucG9wKCksdH1mdW5jdGlvbiBnYyh0KXtyZXR1cm5bdFswXSpJYSx0WzFdKklhXX1mdW5jdGlvbiB5Yyh0LG4sZSl7dmFyIHI9Zyh0LG4tRGEsZSkuY29uY2F0KG4pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gci5tYXAoZnVuY3Rpb24obil7cmV0dXJuW3Qsbl19KX19ZnVuY3Rpb24gX2ModCxuLGUpe3ZhciByPWcodCxuLURhLGUpLmNvbmNhdChuKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKG4pe3JldHVybltuLHRdfSl9fWZ1bmN0aW9uIGJjKCl7dmFyIHQsbixlLHIsaSxvLGEsdSxmLGMscyxsLGg9MTAsZD1oLHA9OTAsdj0zNjAseT0yLjU7ZnVuY3Rpb24gXygpe3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOmIoKX19ZnVuY3Rpb24gYigpe3JldHVybiBnKFZhKHIvcCkqcCxlLHApLm1hcChzKS5jb25jYXQoZyhWYSh1L3YpKnYsYSx2KS5tYXAobCkpLmNvbmNhdChnKFZhKG4vaCkqaCx0LGgpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gSGEodCVwKT5EYX0pLm1hcChmKSkuY29uY2F0KGcoVmEoby9kKSpkLGksZCkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBIYSh0JXYpPkRhfSkubWFwKGMpKX1yZXR1cm4gXy5saW5lcz1mdW5jdGlvbigpe3JldHVybiBiKCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybnt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczp0fX0pfSxfLm91dGxpbmU9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3MocikuY29uY2F0KGwoYSkuc2xpY2UoMSkscyhlKS5yZXZlcnNlKCkuc2xpY2UoMSksbCh1KS5yZXZlcnNlKCkuc2xpY2UoMSkpXX19LF8uZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP18uZXh0ZW50TWFqb3IodCkuZXh0ZW50TWlub3IodCk6Xy5leHRlbnRNaW5vcigpfSxfLmV4dGVudE1ham9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0WzBdWzBdLGU9K3RbMV1bMF0sdT0rdFswXVsxXSxhPSt0WzFdWzFdLHI+ZSYmKHQ9cixyPWUsZT10KSx1PmEmJih0PXUsdT1hLGE9dCksXy5wcmVjaXNpb24oeSkpOltbcix1XSxbZSxhXV19LF8uZXh0ZW50TWlub3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K2VbMF1bMF0sdD0rZVsxXVswXSxvPStlWzBdWzFdLGk9K2VbMV1bMV0sbj50JiYoZT1uLG49dCx0PWUpLG8+aSYmKGU9byxvPWksaT1lKSxfLnByZWNpc2lvbih5KSk6W1tuLG9dLFt0LGldXX0sXy5zdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP18uc3RlcE1ham9yKHQpLnN0ZXBNaW5vcih0KTpfLnN0ZXBNaW5vcigpfSxfLnN0ZXBNYWpvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0rdFswXSx2PSt0WzFdLF8pOltwLHZdfSxfLnN0ZXBNaW5vcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdFswXSxkPSt0WzFdLF8pOltoLGRdfSxfLnByZWNpc2lvbj1mdW5jdGlvbihoKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT0raCxmPXljKG8saSw5MCksYz1fYyhuLHQseSkscz15Yyh1LGEsOTApLGw9X2MocixlLHkpLF8pOnl9LF8uZXh0ZW50TWFqb3IoW1stMTgwLC05MCtEYV0sWzE4MCw5MC1EYV1dKS5leHRlbnRNaW5vcihbWy0xODAsLTgwLURhXSxbMTgwLDgwK0RhXV0pfWZ1bmN0aW9uIG1jKHQpe3JldHVybiB0fXZhciB4Yyx3YyxNYyxBYyxUYz1QYSgpLE5jPVBhKCksU2M9e3BvaW50Oml1LGxpbmVTdGFydDppdSxsaW5lRW5kOml1LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1NjLmxpbmVTdGFydD1FYyxTYy5saW5lRW5kPVBjfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7U2MubGluZVN0YXJ0PVNjLmxpbmVFbmQ9U2MucG9pbnQ9aXUsVGMuYWRkKEhhKE5jKSksTmMucmVzZXQoKX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9VGMvMjtyZXR1cm4gVGMucmVzZXQoKSx0fX07ZnVuY3Rpb24gRWMoKXtTYy5wb2ludD1rY31mdW5jdGlvbiBrYyh0LG4pe1NjLnBvaW50PUNjLHhjPU1jPXQsd2M9QWM9bn1mdW5jdGlvbiBDYyh0LG4pe05jLmFkZChBYyp0LU1jKm4pLE1jPXQsQWM9bn1mdW5jdGlvbiBQYygpe0NjKHhjLHdjKX12YXIgemM9MS8wLFJjPXpjLExjPS16YyxEYz1MYyxVYz17cG9pbnQ6ZnVuY3Rpb24odCxuKXt0PHpjJiYoemM9dCk7dD5MYyYmKExjPXQpO248UmMmJihSYz1uKTtuPkRjJiYoRGM9bil9LGxpbmVTdGFydDppdSxsaW5lRW5kOml1LHBvbHlnb25TdGFydDppdSxwb2x5Z29uRW5kOml1LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVtbemMsUmNdLFtMYyxEY11dO3JldHVybiBMYz1EYz0tKFJjPXpjPTEvMCksdH19O3ZhciBxYyxPYyxZYyxCYyxGYz0wLEljPTAsSGM9MCxqYz0wLFhjPTAsR2M9MCxWYz0wLCRjPTAsV2M9MCxaYz17cG9pbnQ6UWMsbGluZVN0YXJ0OkpjLGxpbmVFbmQ6bnMscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7WmMubGluZVN0YXJ0PWVzLFpjLmxpbmVFbmQ9cnN9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtaYy5wb2ludD1RYyxaYy5saW5lU3RhcnQ9SmMsWmMubGluZUVuZD1uc30scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9V2M/W1ZjL1djLCRjL1djXTpHYz9bamMvR2MsWGMvR2NdOkhjP1tGYy9IYyxJYy9IY106W05hTixOYU5dO3JldHVybiBGYz1JYz1IYz1qYz1YYz1HYz1WYz0kYz1XYz0wLHR9fTtmdW5jdGlvbiBRYyh0LG4pe0ZjKz10LEljKz1uLCsrSGN9ZnVuY3Rpb24gSmMoKXtaYy5wb2ludD1LY31mdW5jdGlvbiBLYyh0LG4pe1pjLnBvaW50PXRzLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gdHModCxuKXt2YXIgZT10LVljLHI9bi1CYyxpPUthKGUqZStyKnIpO2pjKz1pKihZYyt0KS8yLFhjKz1pKihCYytuKS8yLEdjKz1pLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gbnMoKXtaYy5wb2ludD1RY31mdW5jdGlvbiBlcygpe1pjLnBvaW50PWlzfWZ1bmN0aW9uIHJzKCl7b3MocWMsT2MpfWZ1bmN0aW9uIGlzKHQsbil7WmMucG9pbnQ9b3MsUWMocWM9WWM9dCxPYz1CYz1uKX1mdW5jdGlvbiBvcyh0LG4pe3ZhciBlPXQtWWMscj1uLUJjLGk9S2EoZSplK3Iqcik7amMrPWkqKFljK3QpLzIsWGMrPWkqKEJjK24pLzIsR2MrPWksVmMrPShpPUJjKnQtWWMqbikqKFljK3QpLCRjKz1pKihCYytuKSxXYys9MyppLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gYXModCl7dGhpcy5fY29udGV4dD10fWFzLnByb3RvdHlwZT17X3JhZGl1czo0LjUscG9pbnRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JhZGl1cz10LHRoaXN9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MD09PXRoaXMuX2xpbmUmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fcG9pbnQ9TmFOfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbiksdGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTticmVhaztkZWZhdWx0OnRoaXMuX2NvbnRleHQubW92ZVRvKHQrdGhpcy5fcmFkaXVzLG4pLHRoaXMuX2NvbnRleHQuYXJjKHQsbix0aGlzLl9yYWRpdXMsMCxCYSl9fSxyZXN1bHQ6aXV9O3ZhciB1cyxmcyxjcyxzcyxscyxocz1QYSgpLGRzPXtwb2ludDppdSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtkcy5wb2ludD1wc30sbGluZUVuZDpmdW5jdGlvbigpe3VzJiZ2cyhmcyxjcyksZHMucG9pbnQ9aXV9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3VzPSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dXM9bnVsbH0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9K2hzO3JldHVybiBocy5yZXNldCgpLHR9fTtmdW5jdGlvbiBwcyh0LG4pe2RzLnBvaW50PXZzLGZzPXNzPXQsY3M9bHM9bn1mdW5jdGlvbiB2cyh0LG4pe3NzLT10LGxzLT1uLGhzLmFkZChLYShzcypzcytscypscykpLHNzPXQsbHM9bn1mdW5jdGlvbiBncygpe3RoaXMuX3N0cmluZz1bXX1mdW5jdGlvbiB5cyh0KXtyZXR1cm4ibTAsIit0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKy0yKnQrImEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrMip0KyJ6In1mdW5jdGlvbiBfcyh0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bmV3IGJzO2Zvcih2YXIgciBpbiB0KWVbcl09dFtyXTtyZXR1cm4gZS5zdHJlYW09bixlfX1mdW5jdGlvbiBicygpe31mdW5jdGlvbiBtcyh0LG4sZSl7dmFyIHI9dC5jbGlwRXh0ZW50JiZ0LmNsaXBFeHRlbnQoKTtyZXR1cm4gdC5zY2FsZSgxNTApLnRyYW5zbGF0ZShbMCwwXSksbnVsbCE9ciYmdC5jbGlwRXh0ZW50KG51bGwpLHN1KGUsdC5zdHJlYW0oVWMpKSxuKFVjLnJlc3VsdCgpKSxudWxsIT1yJiZ0LmNsaXBFeHRlbnQociksdH1mdW5jdGlvbiB4cyh0LG4sZSl7cmV0dXJuIG1zKHQsZnVuY3Rpb24oZSl7dmFyIHI9blsxXVswXS1uWzBdWzBdLGk9blsxXVsxXS1uWzBdWzFdLG89TWF0aC5taW4oci8oZVsxXVswXS1lWzBdWzBdKSxpLyhlWzFdWzFdLWVbMF1bMV0pKSxhPStuWzBdWzBdKyhyLW8qKGVbMV1bMF0rZVswXVswXSkpLzIsdT0rblswXVsxXSsoaS1vKihlWzFdWzFdK2VbMF1bMV0pKS8yO3Quc2NhbGUoMTUwKm8pLnRyYW5zbGF0ZShbYSx1XSl9LGUpfWZ1bmN0aW9uIHdzKHQsbixlKXtyZXR1cm4geHModCxbWzAsMF0sbl0sZSl9ZnVuY3Rpb24gTXModCxuLGUpe3JldHVybiBtcyh0LGZ1bmN0aW9uKGUpe3ZhciByPStuLGk9ci8oZVsxXVswXS1lWzBdWzBdKSxvPShyLWkqKGVbMV1bMF0rZVswXVswXSkpLzIsYT0taSplWzBdWzFdO3Quc2NhbGUoMTUwKmkpLnRyYW5zbGF0ZShbbyxhXSl9LGUpfWZ1bmN0aW9uIEFzKHQsbixlKXtyZXR1cm4gbXModCxmdW5jdGlvbihlKXt2YXIgcj0rbixpPXIvKGVbMV1bMV0tZVswXVsxXSksbz0taSplWzBdWzBdLGE9KHItaSooZVsxXVsxXStlWzBdWzFdKSkvMjt0LnNjYWxlKDE1MCppKS50cmFuc2xhdGUoW28sYV0pfSxlKX1ncy5wcm90b3R5cGU9e19yYWRpdXM6NC41LF9jaXJjbGU6eXMoNC41KSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4odD0rdCkhPT10aGlzLl9yYWRpdXMmJih0aGlzLl9yYWRpdXM9dCx0aGlzLl9jaXJjbGU9bnVsbCksdGhpc30scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPT09dGhpcy5fbGluZSYmdGhpcy5fc3RyaW5nLnB1c2goIloiKSx0aGlzLl9wb2ludD1OYU59LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fc3RyaW5nLnB1c2goIk0iLHQsIiwiLG4pLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3N0cmluZy5wdXNoKCJMIix0LCIsIixuKTticmVhaztkZWZhdWx0Om51bGw9PXRoaXMuX2NpcmNsZSYmKHRoaXMuX2NpcmNsZT15cyh0aGlzLl9yYWRpdXMpKSx0aGlzLl9zdHJpbmcucHVzaCgiTSIsdCwiLCIsbix0aGlzLl9jaXJjbGUpfX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYodGhpcy5fc3RyaW5nLmxlbmd0aCl7dmFyIHQ9dGhpcy5fc3RyaW5nLmpvaW4oIiIpO3JldHVybiB0aGlzLl9zdHJpbmc9W10sdH1yZXR1cm4gbnVsbH19LGJzLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YnMscG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0LG4pfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX07dmFyIFRzPTE2LE5zPUdhKDMwKklhKTtmdW5jdGlvbiBTcyh0LG4pe3JldHVybituP2Z1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZShyLGksbyxhLHUsZixjLHMsbCxoLGQscCx2LGcpe3ZhciB5PWMtcixfPXMtaSxiPXkqeStfKl87aWYoYj40Km4mJnYtLSl7dmFyIG09YStoLHg9dStkLHc9ZitwLE09S2EobSptK3gqeCt3KncpLEE9ZXUody89TSksVD1IYShIYSh3KS0xKTxEYXx8SGEoby1sKTxEYT8obytsKS8yOlhhKHgsbSksTj10KFQsQSksUz1OWzBdLEU9TlsxXSxrPVMtcixDPUUtaSxQPV8qay15KkM7KFAqUC9iPm58fEhhKCh5KmsrXypDKS9iLS41KT4uM3x8YSpoK3UqZCtmKnA8TnMpJiYoZShyLGksbyxhLHUsZixTLEUsVCxtLz1NLHgvPU0sdyx2LGcpLGcucG9pbnQoUyxFKSxlKFMsRSxULG0seCx3LGMscyxsLGgsZCxwLHYsZykpfX1yZXR1cm4gZnVuY3Rpb24obil7dmFyIHIsaSxvLGEsdSxmLGMscyxsLGgsZCxwLHY9e3BvaW50OmcsbGluZVN0YXJ0OnksbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe24ucG9seWdvblN0YXJ0KCksdi5saW5lU3RhcnQ9bX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpLHYubGluZVN0YXJ0PXl9fTtmdW5jdGlvbiBnKGUscil7ZT10KGUsciksbi5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIHkoKXtzPU5hTix2LnBvaW50PV8sbi5saW5lU3RhcnQoKX1mdW5jdGlvbiBfKHIsaSl7dmFyIG89QXUoW3IsaV0pLGE9dChyLGkpO2UocyxsLGMsaCxkLHAscz1hWzBdLGw9YVsxXSxjPXIsaD1vWzBdLGQ9b1sxXSxwPW9bMl0sVHMsbiksbi5wb2ludChzLGwpfWZ1bmN0aW9uIGIoKXt2LnBvaW50PWcsbi5saW5lRW5kKCl9ZnVuY3Rpb24gbSgpe3koKSx2LnBvaW50PXgsdi5saW5lRW5kPXd9ZnVuY3Rpb24geCh0LG4pe18ocj10LG4pLGk9cyxvPWwsYT1oLHU9ZCxmPXAsdi5wb2ludD1ffWZ1bmN0aW9uIHcoKXtlKHMsbCxjLGgsZCxwLGksbyxyLGEsdSxmLFRzLG4pLHYubGluZUVuZD1iLGIoKX1yZXR1cm4gdn19KHQsbik6ZnVuY3Rpb24odCl7cmV0dXJuIF9zKHtwb2ludDpmdW5jdGlvbihuLGUpe249dChuLGUpLHRoaXMuc3RyZWFtLnBvaW50KG5bMF0sblsxXSl9fSl9KHQpfXZhciBFcz1fcyh7cG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0KklhLG4qSWEpfX0pO2Z1bmN0aW9uIGtzKHQsbixlLHIpe3ZhciBpPUdhKHIpLG89UWEociksYT1pKnQsdT1vKnQsZj1pL3QsYz1vL3Qscz0obyplLWkqbikvdCxsPShvKm4raSplKS90O2Z1bmN0aW9uIGgodCxyKXtyZXR1cm5bYSp0LXUqcituLGUtdSp0LWEqcl19cmV0dXJuIGguaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuW2YqdC1jKm4rcyxsLWMqdC1mKm5dfSxofWZ1bmN0aW9uIENzKHQpe3JldHVybiBQcyhmdW5jdGlvbigpe3JldHVybiB0fSkoKX1mdW5jdGlvbiBQcyh0KXt2YXIgbixlLHIsaSxvLGEsdSxmLGMscyxsPTE1MCxoPTQ4MCxkPTI1MCxwPTAsdj0wLGc9MCx5PTAsXz0wLGI9MCxtPW51bGwseD1HZix3PW51bGwsTT1tYyxBPS41O2Z1bmN0aW9uIFQodCl7cmV0dXJuIGYodFswXSpJYSx0WzFdKklhKX1mdW5jdGlvbiBOKHQpe3JldHVybih0PWYuaW52ZXJ0KHRbMF0sdFsxXSkpJiZbdFswXSpGYSx0WzFdKkZhXX1mdW5jdGlvbiBTKCl7dmFyIHQ9a3MobCwwLDAsYikuYXBwbHkobnVsbCxuKHAsdikpLHI9KGI/a3M6ZnVuY3Rpb24odCxuLGUpe2Z1bmN0aW9uIHIocixpKXtyZXR1cm5bbit0KnIsZS10KmldfXJldHVybiByLmludmVydD1mdW5jdGlvbihyLGkpe3JldHVyblsoci1uKS90LChlLWkpL3RdfSxyfSkobCxoLXRbMF0sZC10WzFdLGIpO3JldHVybiBlPWtmKGcseSxfKSx1PVNmKG4sciksZj1TZihlLHUpLGE9U3ModSxBKSxFKCl9ZnVuY3Rpb24gRSgpe3JldHVybiBjPXM9bnVsbCxUfXJldHVybiBULnN0cmVhbT1mdW5jdGlvbih0KXtyZXR1cm4gYyYmcz09PXQ/YzpjPUVzKGZ1bmN0aW9uKHQpe3JldHVybiBfcyh7cG9pbnQ6ZnVuY3Rpb24obixlKXt2YXIgcj10KG4sZSk7cmV0dXJuIHRoaXMuc3RyZWFtLnBvaW50KHJbMF0sclsxXSl9fSl9KGUpKHgoYShNKHM9dCkpKSkpfSxULnByZWNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9dCxtPXZvaWQgMCxFKCkpOnh9LFQucG9zdGNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE09dCx3PXI9aT1vPW51bGwsRSgpKTpNfSxULmNsaXBBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD0rdD9WZihtPXQqSWEpOihtPW51bGwsR2YpLEUoKSk6bSpGYX0sVC5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhNPW51bGw9PXQ/KHc9cj1pPW89bnVsbCxtYyk6WmYodz0rdFswXVswXSxyPSt0WzBdWzFdLGk9K3RbMV1bMF0sbz0rdFsxXVsxXSksRSgpKTpudWxsPT13P251bGw6W1t3LHJdLFtpLG9dXX0sVC5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD0rdCxTKCkpOmx9LFQudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSt0WzBdLGQ9K3RbMV0sUygpKTpbaCxkXX0sVC5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9dFswXSUzNjAqSWEsdj10WzFdJTM2MCpJYSxTKCkpOltwKkZhLHYqRmFdfSxULnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz10WzBdJTM2MCpJYSx5PXRbMV0lMzYwKklhLF89dC5sZW5ndGg+Mj90WzJdJTM2MCpJYTowLFMoKSk6W2cqRmEseSpGYSxfKkZhXX0sVC5hbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj10JTM2MCpJYSxTKCkpOmIqRmF9LFQucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPVNzKHUsQT10KnQpLEUoKSk6S2EoQSl9LFQuZml0RXh0ZW50PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHhzKFQsdCxuKX0sVC5maXRTaXplPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHdzKFQsdCxuKX0sVC5maXRXaWR0aD1mdW5jdGlvbih0LG4pe3JldHVybiBNcyhULHQsbil9LFQuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIEFzKFQsdCxuKX0sZnVuY3Rpb24oKXtyZXR1cm4gbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxULmludmVydD1uLmludmVydCYmTixTKCl9fWZ1bmN0aW9uIHpzKHQpe3ZhciBuPTAsZT1xYS8zLHI9UHModCksaT1yKG4sZSk7cmV0dXJuIGkucGFyYWxsZWxzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Iobj10WzBdKklhLGU9dFsxXSpJYSk6W24qRmEsZSpGYV19LGl9ZnVuY3Rpb24gUnModCxuKXt2YXIgZT1RYSh0KSxyPShlK1FhKG4pKS8yO2lmKEhhKHIpPERhKXJldHVybiBmdW5jdGlvbih0KXt2YXIgbj1HYSh0KTtmdW5jdGlvbiBlKHQsZSl7cmV0dXJuW3QqbixRYShlKS9uXX1yZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm5bdC9uLGV1KGUqbildfSxlfSh0KTt2YXIgaT0xK2UqKDIqci1lKSxvPUthKGkpL3I7ZnVuY3Rpb24gYSh0LG4pe3ZhciBlPUthKGktMipyKlFhKG4pKS9yO3JldHVybltlKlFhKHQqPXIpLG8tZSpHYSh0KV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9by1uO3JldHVybltYYSh0LEhhKGUpKS9yKkphKGUpLGV1KChpLSh0KnQrZSplKSpyKnIpLygyKnIpKV19LGF9ZnVuY3Rpb24gTHMoKXtyZXR1cm4genMoUnMpLnNjYWxlKDE1NS40MjQpLmNlbnRlcihbMCwzMy42NDQyXSl9ZnVuY3Rpb24gRHMoKXtyZXR1cm4gTHMoKS5wYXJhbGxlbHMoWzI5LjUsNDUuNV0pLnNjYWxlKDEwNzApLnRyYW5zbGF0ZShbNDgwLDI1MF0pLnJvdGF0ZShbOTYsMF0pLmNlbnRlcihbLS42LDM4LjddKX1mdW5jdGlvbiBVcyh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj1HYShuKSxpPUdhKGUpLG89dChyKmkpO3JldHVybltvKmkqUWEobiksbypRYShlKV19fWZ1bmN0aW9uIHFzKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPUthKG4qbitlKmUpLGk9dChyKSxvPVFhKGkpLGE9R2EoaSk7cmV0dXJuW1hhKG4qbyxyKmEpLGV1KHImJmUqby9yKV19fXZhciBPcz1VcyhmdW5jdGlvbih0KXtyZXR1cm4gS2EoMi8oMSt0KSl9KTtPcy5pbnZlcnQ9cXMoZnVuY3Rpb24odCl7cmV0dXJuIDIqZXUodC8yKX0pO3ZhciBZcz1VcyhmdW5jdGlvbih0KXtyZXR1cm4odD1udSh0KSkmJnQvUWEodCl9KTtmdW5jdGlvbiBCcyh0LG4pe3JldHVyblt0LFdhKHR1KChPYStuKS8yKSldfWZ1bmN0aW9uIEZzKHQpe3ZhciBuLGUscixpPUNzKHQpLG89aS5jZW50ZXIsYT1pLnNjYWxlLHU9aS50cmFuc2xhdGUsZj1pLmNsaXBFeHRlbnQsYz1udWxsO2Z1bmN0aW9uIHMoKXt2YXIgbz1xYSphKCksdT1pKFJmKGkucm90YXRlKCkpLmludmVydChbMCwwXSkpO3JldHVybiBmKG51bGw9PWM/W1t1WzBdLW8sdVsxXS1vXSxbdVswXStvLHVbMV0rb11dOnQ9PT1Ccz9bW01hdGgubWF4KHVbMF0tbyxjKSxuXSxbTWF0aC5taW4odVswXStvLGUpLHJdXTpbW2MsTWF0aC5tYXgodVsxXS1vLG4pXSxbZSxNYXRoLm1pbih1WzFdK28scildXSl9cmV0dXJuIGkuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGEodCkscygpKTphKCl9LGkudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1KHQpLHMoKSk6dSgpfSxpLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obyh0KSxzKCkpOm8oKX0saS5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P2M9bj1lPXI9bnVsbDooYz0rdFswXVswXSxuPSt0WzBdWzFdLGU9K3RbMV1bMF0scj0rdFsxXVsxXSkscygpKTpudWxsPT1jP251bGw6W1tjLG5dLFtlLHJdXX0scygpfWZ1bmN0aW9uIElzKHQpe3JldHVybiB0dSgoT2ErdCkvMil9ZnVuY3Rpb24gSHModCxuKXt2YXIgZT1HYSh0KSxyPXQ9PT1uP1FhKHQpOldhKGUvR2EobikpL1dhKElzKG4pL0lzKHQpKSxpPWUqWmEoSXModCkscikvcjtpZighcilyZXR1cm4gQnM7ZnVuY3Rpb24gbyh0LG4pe2k+MD9uPC1PYStEYSYmKG49LU9hK0RhKTpuPk9hLURhJiYobj1PYS1EYSk7dmFyIGU9aS9aYShJcyhuKSxyKTtyZXR1cm5bZSpRYShyKnQpLGktZSpHYShyKnQpXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1pLW4sbz1KYShyKSpLYSh0KnQrZSplKTtyZXR1cm5bWGEodCxIYShlKSkvcipKYShlKSwyKmphKFphKGkvbywxL3IpKS1PYV19LG99ZnVuY3Rpb24ganModCxuKXtyZXR1cm5bdCxuXX1mdW5jdGlvbiBYcyh0LG4pe3ZhciBlPUdhKHQpLHI9dD09PW4/UWEodCk6KGUtR2EobikpLyhuLXQpLGk9ZS9yK3Q7aWYoSGEocik8RGEpcmV0dXJuIGpzO2Z1bmN0aW9uIG8odCxuKXt2YXIgZT1pLW4sbz1yKnQ7cmV0dXJuW2UqUWEobyksaS1lKkdhKG8pXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1pLW47cmV0dXJuW1hhKHQsSGEoZSkpL3IqSmEoZSksaS1KYShyKSpLYSh0KnQrZSplKV19LG99WXMuaW52ZXJ0PXFzKGZ1bmN0aW9uKHQpe3JldHVybiB0fSksQnMuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuW3QsMipqYSgkYShuKSktT2FdfSxqcy5pbnZlcnQ9anM7dmFyIEdzPTEuMzQwMjY0LFZzPS0uMDgxMTA2LCRzPTg5M2UtNixXcz0uMDAzNzk2LFpzPUthKDMpLzI7ZnVuY3Rpb24gUXModCxuKXt2YXIgZT1ldShacypRYShuKSkscj1lKmUsaT1yKnIqcjtyZXR1cm5bdCpHYShlKS8oWnMqKEdzKzMqVnMqcitpKig3KiRzKzkqV3MqcikpKSxlKihHcytWcypyK2kqKCRzK1dzKnIpKV19ZnVuY3Rpb24gSnModCxuKXt2YXIgZT1HYShuKSxyPUdhKHQpKmU7cmV0dXJuW2UqUWEodCkvcixRYShuKS9yXX1mdW5jdGlvbiBLcyh0LG4sZSxyKXtyZXR1cm4gMT09PXQmJjE9PT1uJiYwPT09ZSYmMD09PXI/bWM6X3Moe3BvaW50OmZ1bmN0aW9uKGksbyl7dGhpcy5zdHJlYW0ucG9pbnQoaSp0K2UsbypuK3IpfX0pfWZ1bmN0aW9uIHRsKHQsbil7dmFyIGU9bipuLHI9ZSplO3JldHVyblt0KiguODcwNy0uMTMxOTc5KmUrcioociooLjAwMzk3MSplLS4wMDE1MjkqciktLjAxMzc5MSkpLG4qKDEuMDA3MjI2K2UqKC4wMTUwODUrciooLjAyODg3NCplLS4wNDQ0NzUtLjAwNTkxNipyKSkpXX1mdW5jdGlvbiBubCh0LG4pe3JldHVybltHYShuKSpRYSh0KSxRYShuKV19ZnVuY3Rpb24gZWwodCxuKXt2YXIgZT1HYShuKSxyPTErR2EodCkqZTtyZXR1cm5bZSpRYSh0KS9yLFFhKG4pL3JdfWZ1bmN0aW9uIHJsKHQsbil7cmV0dXJuW1dhKHR1KChPYStuKS8yKSksLXRdfWZ1bmN0aW9uIGlsKHQsbil7cmV0dXJuIHQucGFyZW50PT09bi5wYXJlbnQ/MToyfWZ1bmN0aW9uIG9sKHQsbil7cmV0dXJuIHQrbi54fWZ1bmN0aW9uIGFsKHQsbil7cmV0dXJuIE1hdGgubWF4KHQsbi55KX1mdW5jdGlvbiB1bCh0KXt2YXIgbj0wLGU9dC5jaGlsZHJlbixyPWUmJmUubGVuZ3RoO2lmKHIpZm9yKDstLXI+PTA7KW4rPWVbcl0udmFsdWU7ZWxzZSBuPTE7dC52YWx1ZT1ufWZ1bmN0aW9uIGZsKHQsbil7dmFyIGUscixpLG8sYSx1PW5ldyBobCh0KSxmPSt0LnZhbHVlJiYodS52YWx1ZT10LnZhbHVlKSxjPVt1XTtmb3IobnVsbD09biYmKG49Y2wpO2U9Yy5wb3AoKTspaWYoZiYmKGUudmFsdWU9K2UuZGF0YS52YWx1ZSksKGk9bihlLmRhdGEpKSYmKGE9aS5sZW5ndGgpKWZvcihlLmNoaWxkcmVuPW5ldyBBcnJheShhKSxvPWEtMTtvPj0wOy0tbyljLnB1c2gocj1lLmNoaWxkcmVuW29dPW5ldyBobChpW29dKSksci5wYXJlbnQ9ZSxyLmRlcHRoPWUuZGVwdGgrMTtyZXR1cm4gdS5lYWNoQmVmb3JlKGxsKX1mdW5jdGlvbiBjbCh0KXtyZXR1cm4gdC5jaGlsZHJlbn1mdW5jdGlvbiBzbCh0KXt0LmRhdGE9dC5kYXRhLmRhdGF9ZnVuY3Rpb24gbGwodCl7dmFyIG49MDtkb3t0LmhlaWdodD1ufXdoaWxlKCh0PXQucGFyZW50KSYmdC5oZWlnaHQ8KytuKX1mdW5jdGlvbiBobCh0KXt0aGlzLmRhdGE9dCx0aGlzLmRlcHRoPXRoaXMuaGVpZ2h0PTAsdGhpcy5wYXJlbnQ9bnVsbH1Rcy5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGUscj1uLGk9cipyLG89aSppKmksYT0wO2E8MTImJihvPShpPShyLT1lPShyKihHcytWcyppK28qKCRzK1dzKmkpKS1uKS8oR3MrMypWcyppK28qKDcqJHMrOSpXcyppKSkpKnIpKmkqaSwhKEhhKGUpPFVhKSk7KythKTtyZXR1cm5bWnMqdCooR3MrMypWcyppK28qKDcqJHMrOSpXcyppKSkvR2EociksZXUoUWEocikvWnMpXX0sSnMuaW52ZXJ0PXFzKGphKSx0bC5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPW4saT0yNTtkb3t2YXIgbz1yKnIsYT1vKm87ci09ZT0ociooMS4wMDcyMjYrbyooLjAxNTA4NSthKiguMDI4ODc0Km8tLjA0NDQ3NS0uMDA1OTE2KmEpKSktbikvKDEuMDA3MjI2K28qKC4wNDUyNTUrYSooLjI1OTg2NipvLS4zMTEzMjUtLjAwNTkxNioxMSphKSkpfXdoaWxlKEhhKGUpPkRhJiYtLWk+MCk7cmV0dXJuW3QvKC44NzA3KyhvPXIqcikqKG8qKG8qbypvKiguMDAzOTcxLS4wMDE1MjkqbyktLjAxMzc5MSktLjEzMTk3OSkpLHJdfSxubC5pbnZlcnQ9cXMoZXUpLGVsLmludmVydD1xcyhmdW5jdGlvbih0KXtyZXR1cm4gMipqYSh0KX0pLHJsLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblstbiwyKmphKCRhKHQpKS1PYV19LGhsLnByb3RvdHlwZT1mbC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmhsLGNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKHVsKX0sZWFjaDpmdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvPXRoaXMsYT1bb107ZG97Zm9yKG49YS5yZXZlcnNlKCksYT1bXTtvPW4ucG9wKCk7KWlmKHQobyksZT1vLmNoaWxkcmVuKWZvcihyPTAsaT1lLmxlbmd0aDtyPGk7KytyKWEucHVzaChlW3JdKX13aGlsZShhLmxlbmd0aCk7cmV0dXJuIHRoaXN9LGVhY2hBZnRlcjpmdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyLGk9dGhpcyxvPVtpXSxhPVtdO2k9by5wb3AoKTspaWYoYS5wdXNoKGkpLG49aS5jaGlsZHJlbilmb3IoZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlvLnB1c2gobltlXSk7Zm9yKDtpPWEucG9wKCk7KXQoaSk7cmV0dXJuIHRoaXN9LGVhY2hCZWZvcmU6ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj10aGlzLGk9W3JdO3I9aS5wb3AoKTspaWYodChyKSxuPXIuY2hpbGRyZW4pZm9yKGU9bi5sZW5ndGgtMTtlPj0wOy0tZSlpLnB1c2gobltlXSk7cmV0dXJuIHRoaXN9LHN1bTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoZnVuY3Rpb24obil7Zm9yKHZhciBlPSt0KG4uZGF0YSl8fDAscj1uLmNoaWxkcmVuLGk9ciYmci5sZW5ndGg7LS1pPj0wOyllKz1yW2ldLnZhbHVlO24udmFsdWU9ZX0pfSxzb3J0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbiYmbi5jaGlsZHJlbi5zb3J0KHQpfSl9LHBhdGg6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMsZT1mdW5jdGlvbih0LG4pe2lmKHQ9PT1uKXJldHVybiB0O3ZhciBlPXQuYW5jZXN0b3JzKCkscj1uLmFuY2VzdG9ycygpLGk9bnVsbDtmb3IodD1lLnBvcCgpLG49ci5wb3AoKTt0PT09bjspaT10LHQ9ZS5wb3AoKSxuPXIucG9wKCk7cmV0dXJuIGl9KG4sdCkscj1bbl07biE9PWU7KW49bi5wYXJlbnQsci5wdXNoKG4pO2Zvcih2YXIgaT1yLmxlbmd0aDt0IT09ZTspci5zcGxpY2UoaSwwLHQpLHQ9dC5wYXJlbnQ7cmV0dXJuIHJ9LGFuY2VzdG9yczpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLG49W3RdO3Q9dC5wYXJlbnQ7KW4ucHVzaCh0KTtyZXR1cm4gbn0sZGVzY2VuZGFudHM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3QucHVzaChuKX0pLHR9LGxlYXZlczpmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbnx8dC5wdXNoKG4pfSksdH0sbGlua3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49W107cmV0dXJuIHQuZWFjaChmdW5jdGlvbihlKXtlIT09dCYmbi5wdXNoKHtzb3VyY2U6ZS5wYXJlbnQsdGFyZ2V0OmV9KX0pLG59LGNvcHk6ZnVuY3Rpb24oKXtyZXR1cm4gZmwodGhpcykuZWFjaEJlZm9yZShzbCl9fTt2YXIgZGw9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIHBsKHQpe2Zvcih2YXIgbixlLHI9MCxpPSh0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9dC5sZW5ndGg7cjspZT1NYXRoLnJhbmRvbSgpKnItLXwwLG49dFtyXSx0W3JdPXRbZV0sdFtlXT1uO3JldHVybiB0fShkbC5jYWxsKHQpKSkubGVuZ3RoLG89W107cjxpOyluPXRbcl0sZSYmeWwoZSxuKT8rK3I6KGU9Ymwobz12bChvLG4pKSxyPTApO3JldHVybiBlfWZ1bmN0aW9uIHZsKHQsbil7dmFyIGUscjtpZihfbChuLHQpKXJldHVybltuXTtmb3IoZT0wO2U8dC5sZW5ndGg7KytlKWlmKGdsKG4sdFtlXSkmJl9sKG1sKHRbZV0sbiksdCkpcmV0dXJuW3RbZV0sbl07Zm9yKGU9MDtlPHQubGVuZ3RoLTE7KytlKWZvcihyPWUrMTtyPHQubGVuZ3RoOysrcilpZihnbChtbCh0W2VdLHRbcl0pLG4pJiZnbChtbCh0W2VdLG4pLHRbcl0pJiZnbChtbCh0W3JdLG4pLHRbZV0pJiZfbCh4bCh0W2VdLHRbcl0sbiksdCkpcmV0dXJuW3RbZV0sdFtyXSxuXTt0aHJvdyBuZXcgRXJyb3J9ZnVuY3Rpb24gZ2wodCxuKXt2YXIgZT10LnItbi5yLHI9bi54LXQueCxpPW4ueS10Lnk7cmV0dXJuIGU8MHx8ZSplPHIqcitpKml9ZnVuY3Rpb24geWwodCxuKXt2YXIgZT10LnItbi5yKzFlLTYscj1uLngtdC54LGk9bi55LXQueTtyZXR1cm4gZT4wJiZlKmU+cipyK2kqaX1mdW5jdGlvbiBfbCh0LG4pe2Zvcih2YXIgZT0wO2U8bi5sZW5ndGg7KytlKWlmKCF5bCh0LG5bZV0pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGJsKHQpe3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAxOnJldHVybnt4OihuPXRbMF0pLngseTpuLnkscjpuLnJ9O2Nhc2UgMjpyZXR1cm4gbWwodFswXSx0WzFdKTtjYXNlIDM6cmV0dXJuIHhsKHRbMF0sdFsxXSx0WzJdKX12YXIgbn1mdW5jdGlvbiBtbCh0LG4pe3ZhciBlPXQueCxyPXQueSxpPXQucixvPW4ueCxhPW4ueSx1PW4ucixmPW8tZSxjPWEtcixzPXUtaSxsPU1hdGguc3FydChmKmYrYypjKTtyZXR1cm57eDooZStvK2YvbCpzKS8yLHk6KHIrYStjL2wqcykvMixyOihsK2krdSkvMn19ZnVuY3Rpb24geGwodCxuLGUpe3ZhciByPXQueCxpPXQueSxvPXQucixhPW4ueCx1PW4ueSxmPW4ucixjPWUueCxzPWUueSxsPWUucixoPXItYSxkPXItYyxwPWktdSx2PWktcyxnPWYtbyx5PWwtbyxfPXIqcitpKmktbypvLGI9Xy1hKmEtdSp1K2YqZixtPV8tYypjLXMqcytsKmwseD1kKnAtaCp2LHc9KHAqbS12KmIpLygyKngpLXIsTT0odipnLXAqeSkveCxBPShkKmItaCptKS8oMip4KS1pLFQ9KGgqeS1kKmcpL3gsTj1NKk0rVCpULTEsUz0yKihvK3cqTStBKlQpLEU9dyp3K0EqQS1vKm8saz0tKE4/KFMrTWF0aC5zcXJ0KFMqUy00Kk4qRSkpLygyKk4pOkUvUyk7cmV0dXJue3g6cit3K00qayx5OmkrQStUKmsscjprfX1mdW5jdGlvbiB3bCh0LG4sZSl7dmFyIHIsaSxvLGEsdT10Lngtbi54LGY9dC55LW4ueSxjPXUqdStmKmY7Yz8oaT1uLnIrZS5yLGkqPWksYT10LnIrZS5yLGk+KGEqPWEpPyhyPShjK2EtaSkvKDIqYyksbz1NYXRoLnNxcnQoTWF0aC5tYXgoMCxhL2MtcipyKSksZS54PXQueC1yKnUtbypmLGUueT10LnktcipmK28qdSk6KHI9KGMraS1hKS8oMipjKSxvPU1hdGguc3FydChNYXRoLm1heCgwLGkvYy1yKnIpKSxlLng9bi54K3IqdS1vKmYsZS55PW4ueStyKmYrbyp1KSk6KGUueD1uLngrZS5yLGUueT1uLnkpfWZ1bmN0aW9uIE1sKHQsbil7dmFyIGU9dC5yK24uci0xZS02LHI9bi54LXQueCxpPW4ueS10Lnk7cmV0dXJuIGU+MCYmZSplPnIqcitpKml9ZnVuY3Rpb24gQWwodCl7dmFyIG49dC5fLGU9dC5uZXh0Ll8scj1uLnIrZS5yLGk9KG4ueCplLnIrZS54Km4ucikvcixvPShuLnkqZS5yK2UueSpuLnIpL3I7cmV0dXJuIGkqaStvKm99ZnVuY3Rpb24gVGwodCl7dGhpcy5fPXQsdGhpcy5uZXh0PW51bGwsdGhpcy5wcmV2aW91cz1udWxsfWZ1bmN0aW9uIE5sKHQpe2lmKCEoaT10Lmxlbmd0aCkpcmV0dXJuIDA7dmFyIG4sZSxyLGksbyxhLHUsZixjLHMsbDtpZigobj10WzBdKS54PTAsbi55PTAsIShpPjEpKXJldHVybiBuLnI7aWYoZT10WzFdLG4ueD0tZS5yLGUueD1uLnIsZS55PTAsIShpPjIpKXJldHVybiBuLnIrZS5yO3dsKGUsbixyPXRbMl0pLG49bmV3IFRsKG4pLGU9bmV3IFRsKGUpLHI9bmV3IFRsKHIpLG4ubmV4dD1yLnByZXZpb3VzPWUsZS5uZXh0PW4ucHJldmlvdXM9cixyLm5leHQ9ZS5wcmV2aW91cz1uO3Q6Zm9yKHU9Mzt1PGk7Kyt1KXt3bChuLl8sZS5fLHI9dFt1XSkscj1uZXcgVGwociksZj1lLm5leHQsYz1uLnByZXZpb3VzLHM9ZS5fLnIsbD1uLl8ucjtkb3tpZihzPD1sKXtpZihNbChmLl8sci5fKSl7ZT1mLG4ubmV4dD1lLGUucHJldmlvdXM9biwtLXU7Y29udGludWUgdH1zKz1mLl8ucixmPWYubmV4dH1lbHNle2lmKE1sKGMuXyxyLl8pKXsobj1jKS5uZXh0PWUsZS5wcmV2aW91cz1uLC0tdTtjb250aW51ZSB0fWwrPWMuXy5yLGM9Yy5wcmV2aW91c319d2hpbGUoZiE9PWMubmV4dCk7Zm9yKHIucHJldmlvdXM9bixyLm5leHQ9ZSxuLm5leHQ9ZS5wcmV2aW91cz1lPXIsbz1BbChuKTsocj1yLm5leHQpIT09ZTspKGE9QWwocikpPG8mJihuPXIsbz1hKTtlPW4ubmV4dH1mb3Iobj1bZS5fXSxyPWU7KHI9ci5uZXh0KSE9PWU7KW4ucHVzaChyLl8pO2ZvcihyPXBsKG4pLHU9MDt1PGk7Kyt1KShuPXRbdV0pLngtPXIueCxuLnktPXIueTtyZXR1cm4gci5yfWZ1bmN0aW9uIFNsKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdH1mdW5jdGlvbiBFbCgpe3JldHVybiAwfWZ1bmN0aW9uIGtsKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBDbCh0KXtyZXR1cm4gTWF0aC5zcXJ0KHQudmFsdWUpfWZ1bmN0aW9uIFBsKHQpe3JldHVybiBmdW5jdGlvbihuKXtuLmNoaWxkcmVufHwobi5yPU1hdGgubWF4KDAsK3Qobil8fDApKX19ZnVuY3Rpb24gemwodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYocj1lLmNoaWxkcmVuKXt2YXIgcixpLG8sYT1yLmxlbmd0aCx1PXQoZSkqbnx8MDtpZih1KWZvcihpPTA7aTxhOysraSlyW2ldLnIrPXU7aWYobz1ObChyKSx1KWZvcihpPTA7aTxhOysraSlyW2ldLnItPXU7ZS5yPW8rdX19fWZ1bmN0aW9uIFJsKHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1uLnBhcmVudDtuLnIqPXQsZSYmKG4ueD1lLngrdCpuLngsbi55PWUueSt0Km4ueSl9fWZ1bmN0aW9uIExsKHQpe3QueDA9TWF0aC5yb3VuZCh0LngwKSx0LnkwPU1hdGgucm91bmQodC55MCksdC54MT1NYXRoLnJvdW5kKHQueDEpLHQueTE9TWF0aC5yb3VuZCh0LnkxKX1mdW5jdGlvbiBEbCh0LG4sZSxyLGkpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4sdT0tMSxmPWEubGVuZ3RoLGM9dC52YWx1ZSYmKHItbikvdC52YWx1ZTsrK3U8ZjspKG89YVt1XSkueTA9ZSxvLnkxPWksby54MD1uLG8ueDE9bis9by52YWx1ZSpjfXZhciBVbD0iJCIscWw9e2RlcHRoOi0xfSxPbD17fTtmdW5jdGlvbiBZbCh0KXtyZXR1cm4gdC5pZH1mdW5jdGlvbiBCbCh0KXtyZXR1cm4gdC5wYXJlbnRJZH1mdW5jdGlvbiBGbCh0LG4pe3JldHVybiB0LnBhcmVudD09PW4ucGFyZW50PzE6Mn1mdW5jdGlvbiBJbCh0KXt2YXIgbj10LmNoaWxkcmVuO3JldHVybiBuP25bMF06dC50fWZ1bmN0aW9uIEhsKHQpe3ZhciBuPXQuY2hpbGRyZW47cmV0dXJuIG4/bltuLmxlbmd0aC0xXTp0LnR9ZnVuY3Rpb24gamwodCxuLGUpe3ZhciByPWUvKG4uaS10LmkpO24uYy09cixuLnMrPWUsdC5jKz1yLG4ueis9ZSxuLm0rPWV9ZnVuY3Rpb24gWGwodCxuLGUpe3JldHVybiB0LmEucGFyZW50PT09bi5wYXJlbnQ/dC5hOmV9ZnVuY3Rpb24gR2wodCxuKXt0aGlzLl89dCx0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49bnVsbCx0aGlzLkE9bnVsbCx0aGlzLmE9dGhpcyx0aGlzLno9MCx0aGlzLm09MCx0aGlzLmM9MCx0aGlzLnM9MCx0aGlzLnQ9bnVsbCx0aGlzLmk9bn1mdW5jdGlvbiBWbCh0LG4sZSxyLGkpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4sdT0tMSxmPWEubGVuZ3RoLGM9dC52YWx1ZSYmKGktZSkvdC52YWx1ZTsrK3U8ZjspKG89YVt1XSkueDA9bixvLngxPXIsby55MD1lLG8ueTE9ZSs9by52YWx1ZSpjfUdsLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGhsLnByb3RvdHlwZSk7dmFyICRsPSgxK01hdGguc3FydCg1KSkvMjtmdW5jdGlvbiBXbCh0LG4sZSxyLGksbyl7Zm9yKHZhciBhLHUsZixjLHMsbCxoLGQscCx2LGcseT1bXSxfPW4uY2hpbGRyZW4sYj0wLG09MCx4PV8ubGVuZ3RoLHc9bi52YWx1ZTtiPHg7KXtmPWktZSxjPW8tcjtkb3tzPV9bbSsrXS52YWx1ZX13aGlsZSghcyYmbTx4KTtmb3IobD1oPXMsZz1zKnMqKHY9TWF0aC5tYXgoYy9mLGYvYykvKHcqdCkpLHA9TWF0aC5tYXgoaC9nLGcvbCk7bTx4OysrbSl7aWYocys9dT1fW21dLnZhbHVlLHU8bCYmKGw9dSksdT5oJiYoaD11KSxnPXMqcyp2LChkPU1hdGgubWF4KGgvZyxnL2wpKT5wKXtzLT11O2JyZWFrfXA9ZH15LnB1c2goYT17dmFsdWU6cyxkaWNlOmY8YyxjaGlsZHJlbjpfLnNsaWNlKGIsbSl9KSxhLmRpY2U/RGwoYSxlLHIsaSx3P3IrPWMqcy93Om8pOlZsKGEsZSxyLHc/ZSs9ZipzL3c6aSxvKSx3LT1zLGI9bX1yZXR1cm4geX12YXIgWmw9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSxyLGksbyl7V2wobix0LGUscixpLG8pfXJldHVybiBlLnJhdGlvPWZ1bmN0aW9uKG4pe3JldHVybiB0KChuPStuKT4xP246MSl9LGV9KCRsKTt2YXIgUWw9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSxyLGksbyl7aWYoKGE9dC5fc3F1YXJpZnkpJiZhLnJhdGlvPT09bilmb3IodmFyIGEsdSxmLGMscyxsPS0xLGg9YS5sZW5ndGgsZD10LnZhbHVlOysrbDxoOyl7Zm9yKGY9KHU9YVtsXSkuY2hpbGRyZW4sYz11LnZhbHVlPTAscz1mLmxlbmd0aDtjPHM7KytjKXUudmFsdWUrPWZbY10udmFsdWU7dS5kaWNlP0RsKHUsZSxyLGkscis9KG8tcikqdS52YWx1ZS9kKTpWbCh1LGUscixlKz0oaS1lKSp1LnZhbHVlL2QsbyksZC09dS52YWx1ZX1lbHNlIHQuX3NxdWFyaWZ5PWE9V2wobix0LGUscixpLG8pLGEucmF0aW89bn1yZXR1cm4gZS5yYXRpbz1mdW5jdGlvbihuKXtyZXR1cm4gdCgobj0rbik+MT9uOjEpfSxlfSgkbCk7ZnVuY3Rpb24gSmwodCxuKXtyZXR1cm4gdFswXS1uWzBdfHx0WzFdLW5bMV19ZnVuY3Rpb24gS2wodCl7Zm9yKHZhciBuLGUscixpPXQubGVuZ3RoLG89WzAsMV0sYT0yLHU9Mjt1PGk7Kyt1KXtmb3IoO2E+MSYmKG49dFtvW2EtMl1dLGU9dFtvW2EtMV1dLHI9dFt1XSwoZVswXS1uWzBdKSooclsxXS1uWzFdKS0oZVsxXS1uWzFdKSooclswXS1uWzBdKTw9MCk7KS0tYTtvW2ErK109dX1yZXR1cm4gby5zbGljZSgwLGEpfWZ1bmN0aW9uIHRoKCl7cmV0dXJuIE1hdGgucmFuZG9tKCl9dmFyIG5oPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUpe3JldHVybiB0PW51bGw9PXQ/MDordCxlPW51bGw9PWU/MTorZSwxPT09YXJndW1lbnRzLmxlbmd0aD8oZT10LHQ9MCk6ZS09dCxmdW5jdGlvbigpe3JldHVybiBuKCkqZSt0fX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0aCksZWg9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSl7dmFyIHIsaTtyZXR1cm4gdD1udWxsPT10PzA6K3QsZT1udWxsPT1lPzE6K2UsZnVuY3Rpb24oKXt2YXIgbztpZihudWxsIT1yKW89cixyPW51bGw7ZWxzZSBkb3tyPTIqbigpLTEsbz0yKm4oKS0xLGk9cipyK28qb313aGlsZSghaXx8aT4xKTtyZXR1cm4gdCtlKm8qTWF0aC5zcXJ0KC0yKk1hdGgubG9nKGkpL2kpfX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0aCkscmg9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKCl7dmFyIHQ9ZWguc291cmNlKG4pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5leHAodCgpKX19cmV0dXJuIGUuc291cmNlPXQsZX0odGgpLGloPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9MCxyPTA7cjx0OysrcillKz1uKCk7cmV0dXJuIGV9fXJldHVybiBlLnNvdXJjZT10LGV9KHRoKSxvaD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7dmFyIGU9aWguc291cmNlKG4pKHQpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlKCkvdH19cmV0dXJuIGUuc291cmNlPXQsZX0odGgpLGFoPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4tTWF0aC5sb2coMS1uKCkpL3R9fXJldHVybiBlLnNvdXJjZT10LGV9KHRoKSx1aD1BcnJheS5wcm90b3R5cGUsZmg9dWgubWFwLGNoPXVoLnNsaWNlLHNoPXtuYW1lOiJpbXBsaWNpdCJ9O2Z1bmN0aW9uIGxoKHQpe3ZhciBuPUtpKCksZT1bXSxyPXNoO2Z1bmN0aW9uIGkoaSl7dmFyIG89aSsiIixhPW4uZ2V0KG8pO2lmKCFhKXtpZihyIT09c2gpcmV0dXJuIHI7bi5zZXQobyxhPWUucHVzaChpKSl9cmV0dXJuIHRbKGEtMSkldC5sZW5ndGhdfXJldHVybiB0PW51bGw9PXQ/W106Y2guY2FsbCh0KSxpLmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZS5zbGljZSgpO2U9W10sbj1LaSgpO2Zvcih2YXIgcixvLGE9LTEsdT10Lmxlbmd0aDsrK2E8dTspbi5oYXMobz0ocj10W2FdKSsiIil8fG4uc2V0KG8sZS5wdXNoKHIpKTtyZXR1cm4gaX0saS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1jaC5jYWxsKG4pLGkpOnQuc2xpY2UoKX0saS51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsaSk6cn0saS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGxoKCkuZG9tYWluKGUpLnJhbmdlKHQpLnVua25vd24ocil9LGl9ZnVuY3Rpb24gaGgoKXt2YXIgdCxuLGU9bGgoKS51bmtub3duKHZvaWQgMCkscj1lLmRvbWFpbixpPWUucmFuZ2Usbz1bMCwxXSxhPSExLHU9MCxmPTAsYz0uNTtmdW5jdGlvbiBzKCl7dmFyIGU9cigpLmxlbmd0aCxzPW9bMV08b1swXSxsPW9bcy0wXSxoPW9bMS1zXTt0PShoLWwpL01hdGgubWF4KDEsZS11KzIqZiksYSYmKHQ9TWF0aC5mbG9vcih0KSksbCs9KGgtbC10KihlLXUpKSpjLG49dCooMS11KSxhJiYobD1NYXRoLnJvdW5kKGwpLG49TWF0aC5yb3VuZChuKSk7dmFyIGQ9ZyhlKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIGwrdCpufSk7cmV0dXJuIGkocz9kLnJldmVyc2UoKTpkKX1yZXR1cm4gZGVsZXRlIGUudW5rbm93bixlLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocih0KSxzKCkpOnIoKX0sZS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1bK3RbMF0sK3RbMV1dLHMoKSk6by5zbGljZSgpfSxlLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG89Wyt0WzBdLCt0WzFdXSxhPSEwLHMoKX0sZS5iYW5kd2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gbn0sZS5zdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGUucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ISF0LHMoKSk6YX0sZS5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWY9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSxzKCkpOnV9LGUucGFkZGluZ0lubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkscygpKTp1fSxlLnBhZGRpbmdPdXRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHMoKSk6Zn0sZS5hbGlnbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHMoKSk6Y30sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGhoKCkuZG9tYWluKHIoKSkucmFuZ2Uobykucm91bmQoYSkucGFkZGluZ0lubmVyKHUpLnBhZGRpbmdPdXRlcihmKS5hbGlnbihjKX0scygpfWZ1bmN0aW9uIGRoKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBwaCh0KXtyZXR1cm4rdH12YXIgdmg9WzAsMV07ZnVuY3Rpb24gZ2godCxuKXtyZXR1cm4obi09dD0rdCk/ZnVuY3Rpb24oZSl7cmV0dXJuKGUtdCkvbn06ZGgobil9ZnVuY3Rpb24geWgodCxuLGUscil7dmFyIGk9dFswXSxvPXRbMV0sYT1uWzBdLHU9blsxXTtyZXR1cm4gbzxpPyhpPWUobyxpKSxhPXIodSxhKSk6KGk9ZShpLG8pLGE9cihhLHUpKSxmdW5jdGlvbih0KXtyZXR1cm4gYShpKHQpKX19ZnVuY3Rpb24gX2godCxuLGUscil7dmFyIG89TWF0aC5taW4odC5sZW5ndGgsbi5sZW5ndGgpLTEsYT1uZXcgQXJyYXkobyksdT1uZXcgQXJyYXkobyksZj0tMTtmb3IodFtvXTx0WzBdJiYodD10LnNsaWNlKCkucmV2ZXJzZSgpLG49bi5zbGljZSgpLnJldmVyc2UoKSk7KytmPG87KWFbZl09ZSh0W2ZdLHRbZisxXSksdVtmXT1yKG5bZl0sbltmKzFdKTtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9aSh0LG4sMSxvKS0xO3JldHVybiB1W2VdKGFbZV0obikpfX1mdW5jdGlvbiBiaCh0LG4pe3JldHVybiBuLmRvbWFpbih0LmRvbWFpbigpKS5yYW5nZSh0LnJhbmdlKCkpLmludGVycG9sYXRlKHQuaW50ZXJwb2xhdGUoKSkuY2xhbXAodC5jbGFtcCgpKX1mdW5jdGlvbiBtaCh0LG4pe3ZhciBlLHIsaSxvPXZoLGE9dmgsdT1tZSxmPSExO2Z1bmN0aW9uIGMoKXtyZXR1cm4gZT1NYXRoLm1pbihvLmxlbmd0aCxhLmxlbmd0aCk+Mj9faDp5aCxyPWk9bnVsbCxzfWZ1bmN0aW9uIHMobil7cmV0dXJuKHJ8fChyPWUobyxhLGY/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9dChuPStuLGU9K2UpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdDw9bj8wOnQ+PWU/MTpyKHQpfX19KHQpOnQsdSkpKSgrbil9cmV0dXJuIHMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybihpfHwoaT1lKGEsbyxnaCxmP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXQobj0rbixlPStlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ8PTA/bjp0Pj0xP2U6cih0KX19fShuKTpuKSkpKCt0KX0scy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ZmguY2FsbCh0LHBoKSxjKCkpOm8uc2xpY2UoKX0scy5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1jaC5jYWxsKHQpLGMoKSk6YS5zbGljZSgpfSxzLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGE9Y2guY2FsbCh0KSx1PXhlLGMoKX0scy5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0hIXQsYygpKTpmfSxzLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsYygpKTp1fSxjKCl9ZnVuY3Rpb24geGgobil7dmFyIGU9bi5kb21haW47cmV0dXJuIG4udGlja3M9ZnVuY3Rpb24odCl7dmFyIG49ZSgpO3JldHVybiBtKG5bMF0sbltuLmxlbmd0aC0xXSxudWxsPT10PzEwOnQpfSxuLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obixyKXtyZXR1cm4gZnVuY3Rpb24obixlLHIpe3ZhciBpLG89blswXSxhPW5bbi5sZW5ndGgtMV0sdT13KG8sYSxudWxsPT1lPzEwOmUpO3N3aXRjaCgocj1iYShudWxsPT1yPyIsZiI6cikpLnR5cGUpe2Nhc2UicyI6dmFyIGY9TWF0aC5tYXgoTWF0aC5hYnMobyksTWF0aC5hYnMoYSkpO3JldHVybiBudWxsIT1yLnByZWNpc2lvbnx8aXNOYU4oaT1rYSh1LGYpKXx8KHIucHJlY2lzaW9uPWkpLHQuZm9ybWF0UHJlZml4KHIsZik7Y2FzZSIiOmNhc2UiZSI6Y2FzZSJnIjpjYXNlInAiOmNhc2UiciI6bnVsbCE9ci5wcmVjaXNpb258fGlzTmFOKGk9Q2EodSxNYXRoLm1heChNYXRoLmFicyhvKSxNYXRoLmFicyhhKSkpKXx8KHIucHJlY2lzaW9uPWktKCJlIj09PXIudHlwZSkpO2JyZWFrO2Nhc2UiZiI6Y2FzZSIlIjpudWxsIT1yLnByZWNpc2lvbnx8aXNOYU4oaT1FYSh1KSl8fChyLnByZWNpc2lvbj1pLTIqKCIlIj09PXIudHlwZSkpfXJldHVybiB0LmZvcm1hdChyKX0oZSgpLG4scil9LG4ubmljZT1mdW5jdGlvbih0KXtudWxsPT10JiYodD0xMCk7dmFyIHIsaT1lKCksbz0wLGE9aS5sZW5ndGgtMSx1PWlbb10sZj1pW2FdO3JldHVybiBmPHUmJihyPXUsdT1mLGY9cixyPW8sbz1hLGE9ciksKHI9eCh1LGYsdCkpPjA/cj14KHU9TWF0aC5mbG9vcih1L3IpKnIsZj1NYXRoLmNlaWwoZi9yKSpyLHQpOnI8MCYmKHI9eCh1PU1hdGguY2VpbCh1KnIpL3IsZj1NYXRoLmZsb29yKGYqcikvcix0KSkscj4wPyhpW29dPU1hdGguZmxvb3IodS9yKSpyLGlbYV09TWF0aC5jZWlsKGYvcikqcixlKGkpKTpyPDAmJihpW29dPU1hdGguY2VpbCh1KnIpL3IsaVthXT1NYXRoLmZsb29yKGYqcikvcixlKGkpKSxufSxufWZ1bmN0aW9uIHdoKHQsbil7dmFyIGUscj0wLGk9KHQ9dC5zbGljZSgpKS5sZW5ndGgtMSxvPXRbcl0sYT10W2ldO3JldHVybiBhPG8mJihlPXIscj1pLGk9ZSxlPW8sbz1hLGE9ZSksdFtyXT1uLmZsb29yKG8pLHRbaV09bi5jZWlsKGEpLHR9ZnVuY3Rpb24gTWgodCxuKXtyZXR1cm4obj1NYXRoLmxvZyhuL3QpKT9mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5sb2coZS90KS9ufTpkaChuKX1mdW5jdGlvbiBBaCh0LG4pe3JldHVybiB0PDA/ZnVuY3Rpb24oZSl7cmV0dXJuLU1hdGgucG93KC1uLGUpKk1hdGgucG93KC10LDEtZSl9OmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnBvdyhuLGUpKk1hdGgucG93KHQsMS1lKX19ZnVuY3Rpb24gVGgodCl7cmV0dXJuIGlzRmluaXRlKHQpPysoIjFlIit0KTp0PDA/MDp0fWZ1bmN0aW9uIE5oKHQpe3JldHVybiAxMD09PXQ/VGg6dD09PU1hdGguRT9NYXRoLmV4cDpmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5wb3codCxuKX19ZnVuY3Rpb24gU2godCl7cmV0dXJuIHQ9PT1NYXRoLkU/TWF0aC5sb2c6MTA9PT10JiZNYXRoLmxvZzEwfHwyPT09dCYmTWF0aC5sb2cyfHwodD1NYXRoLmxvZyh0KSxmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5sb2cobikvdH0pfWZ1bmN0aW9uIEVoKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4tdCgtbil9fWZ1bmN0aW9uIGtoKHQsbil7cmV0dXJuIHQ8MD8tTWF0aC5wb3coLXQsbik6TWF0aC5wb3codCxuKX1mdW5jdGlvbiBDaCgpe3ZhciB0PTEsbj1taChmdW5jdGlvbihuLGUpe3JldHVybihlPWtoKGUsdCktKG49a2gobix0KSkpP2Z1bmN0aW9uKHIpe3JldHVybihraChyLHQpLW4pL2V9OmRoKGUpfSxmdW5jdGlvbihuLGUpe3JldHVybiBlPWtoKGUsdCktKG49a2gobix0KSksZnVuY3Rpb24ocil7cmV0dXJuIGtoKG4rZSpyLDEvdCl9fSksZT1uLmRvbWFpbjtyZXR1cm4gbi5leHBvbmVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rbixlKGUoKSkpOnR9LG4uY29weT1mdW5jdGlvbigpe3JldHVybiBiaChuLENoKCkuZXhwb25lbnQodCkpfSx4aChuKX12YXIgUGg9bmV3IERhdGUsemg9bmV3IERhdGU7ZnVuY3Rpb24gUmgodCxuLGUscil7ZnVuY3Rpb24gaShuKXtyZXR1cm4gdChuPW5ldyBEYXRlKCtuKSksbn1yZXR1cm4gaS5mbG9vcj1pLGkuY2VpbD1mdW5jdGlvbihlKXtyZXR1cm4gdChlPW5ldyBEYXRlKGUtMSkpLG4oZSwxKSx0KGUpLGV9LGkucm91bmQ9ZnVuY3Rpb24odCl7dmFyIG49aSh0KSxlPWkuY2VpbCh0KTtyZXR1cm4gdC1uPGUtdD9uOmV9LGkub2Zmc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odD1uZXcgRGF0ZSgrdCksbnVsbD09ZT8xOk1hdGguZmxvb3IoZSkpLHR9LGkucmFuZ2U9ZnVuY3Rpb24oZSxyLG8pe3ZhciBhLHU9W107aWYoZT1pLmNlaWwoZSksbz1udWxsPT1vPzE6TWF0aC5mbG9vcihvKSwhKGU8ciYmbz4wKSlyZXR1cm4gdTtkb3t1LnB1c2goYT1uZXcgRGF0ZSgrZSkpLG4oZSxvKSx0KGUpfXdoaWxlKGE8ZSYmZTxyKTtyZXR1cm4gdX0saS5maWx0ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIFJoKGZ1bmN0aW9uKG4pe2lmKG4+PW4pZm9yKDt0KG4pLCFlKG4pOyluLnNldFRpbWUobi0xKX0sZnVuY3Rpb24odCxyKXtpZih0Pj10KWlmKHI8MClmb3IoOysrcjw9MDspZm9yKDtuKHQsLTEpLCFlKHQpOyk7ZWxzZSBmb3IoOy0tcj49MDspZm9yKDtuKHQsMSksIWUodCk7KTt9KX0sZSYmKGkuY291bnQ9ZnVuY3Rpb24obixyKXtyZXR1cm4gUGguc2V0VGltZSgrbiksemguc2V0VGltZSgrciksdChQaCksdCh6aCksTWF0aC5mbG9vcihlKFBoLHpoKSl9LGkuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9pLmZpbHRlcihyP2Z1bmN0aW9uKG4pe3JldHVybiByKG4pJXQ9PTB9OmZ1bmN0aW9uKG4pe3JldHVybiBpLmNvdW50KDAsbikldD09MH0pOmk6bnVsbH0pLGl9dmFyIExoPVJoKGZ1bmN0aW9uKCl7fSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4gbi10fSk7TGguZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9SaChmdW5jdGlvbihuKXtuLnNldFRpbWUoTWF0aC5mbG9vcihuL3QpKnQpfSxmdW5jdGlvbihuLGUpe24uc2V0VGltZSgrbitlKnQpfSxmdW5jdGlvbihuLGUpe3JldHVybihlLW4pL3R9KTpMaDpudWxsfTt2YXIgRGg9TGgucmFuZ2UsVWg9NmU0LHFoPTYwNDhlNSxPaD1SaChmdW5jdGlvbih0KXt0LnNldFRpbWUoMWUzKk1hdGguZmxvb3IodC8xZTMpKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrMWUzKm4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzFlM30sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDU2Vjb25kcygpfSksWWg9T2gucmFuZ2UsQmg9UmgoZnVuY3Rpb24odCl7dC5zZXRUaW1lKE1hdGguZmxvb3IodC9VaCkqVWgpfSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKlVoKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS9VaH0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TWludXRlcygpfSksRmg9QmgucmFuZ2UsSWg9UmgoZnVuY3Rpb24odCl7dmFyIG49dC5nZXRUaW1lem9uZU9mZnNldCgpKlVoJTM2ZTU7bjwwJiYobis9MzZlNSksdC5zZXRUaW1lKDM2ZTUqTWF0aC5mbG9vcigoK3QtbikvMzZlNSkrbil9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzM2ZTUqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvMzZlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0SG91cnMoKX0pLEhoPUloLnJhbmdlLGpoPVJoKGZ1bmN0aW9uKHQpe3Quc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQtKG4uZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKlVoKS84NjRlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RGF0ZSgpLTF9KSxYaD1qaC5yYW5nZTtmdW5jdGlvbiBHaCh0KXtyZXR1cm4gUmgoZnVuY3Rpb24obil7bi5zZXREYXRlKG4uZ2V0RGF0ZSgpLShuLmdldERheSgpKzctdCklNyksbi5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldERhdGUodC5nZXREYXRlKCkrNypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10LShuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSpVaCkvcWh9KX12YXIgVmg9R2goMCksJGg9R2goMSksV2g9R2goMiksWmg9R2goMyksUWg9R2goNCksSmg9R2goNSksS2g9R2goNiksdGQ9VmgucmFuZ2UsbmQ9JGgucmFuZ2UsZWQ9V2gucmFuZ2UscmQ9WmgucmFuZ2UsaWQ9UWgucmFuZ2Usb2Q9SmgucmFuZ2UsYWQ9S2gucmFuZ2UsdWQ9UmgoZnVuY3Rpb24odCl7dC5zZXREYXRlKDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRNb250aCh0LmdldE1vbnRoKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0TW9udGgoKS10LmdldE1vbnRoKCkrMTIqKG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCkpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNb250aCgpfSksZmQ9dWQucmFuZ2UsY2Q9UmgoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRGdWxsWWVhcih0LmdldEZ1bGxZZWFyKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KTtjZC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP1JoKGZ1bmN0aW9uKG4pe24uc2V0RnVsbFllYXIoTWF0aC5mbG9vcihuLmdldEZ1bGxZZWFyKCkvdCkqdCksbi5zZXRNb250aCgwLDEpLG4uc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKG4sZSl7bi5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCkrZSp0KX0pOm51bGx9O3ZhciBzZD1jZC5yYW5nZSxsZD1SaChmdW5jdGlvbih0KXt0LnNldFVUQ1NlY29uZHMoMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipVaCl9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvVWh9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01pbnV0ZXMoKX0pLGhkPWxkLnJhbmdlLGRkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTWludXRlcygwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzM2ZTUqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvMzZlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDSG91cnMoKX0pLHBkPWRkLnJhbmdlLHZkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzg2NGU1fSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENEYXRlKCktMX0pLGdkPXZkLnJhbmdlO2Z1bmN0aW9uIHlkKHQpe3JldHVybiBSaChmdW5jdGlvbihuKXtuLnNldFVUQ0RhdGUobi5nZXRVVENEYXRlKCktKG4uZ2V0VVRDRGF5KCkrNy10KSU3KSxuLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRGF0ZSh0LmdldFVUQ0RhdGUoKSs3Km4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL3FofSl9dmFyIF9kPXlkKDApLGJkPXlkKDEpLG1kPXlkKDIpLHhkPXlkKDMpLHdkPXlkKDQpLE1kPXlkKDUpLEFkPXlkKDYpLFRkPV9kLnJhbmdlLE5kPWJkLnJhbmdlLFNkPW1kLnJhbmdlLEVkPXhkLnJhbmdlLGtkPXdkLnJhbmdlLENkPU1kLnJhbmdlLFBkPUFkLnJhbmdlLHpkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDRGF0ZSgxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDTW9udGgodC5nZXRVVENNb250aCgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ01vbnRoKCktdC5nZXRVVENNb250aCgpKzEyKihuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTW9udGgoKX0pLFJkPXpkLnJhbmdlLExkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTW9udGgoMCwxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRnVsbFllYXIodC5nZXRVVENGdWxsWWVhcigpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENGdWxsWWVhcigpfSk7TGQuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9SaChmdW5jdGlvbihuKXtuLnNldFVUQ0Z1bGxZZWFyKE1hdGguZmxvb3Iobi5nZXRVVENGdWxsWWVhcigpL3QpKnQpLG4uc2V0VVRDTW9udGgoMCwxKSxuLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihuLGUpe24uc2V0VVRDRnVsbFllYXIobi5nZXRVVENGdWxsWWVhcigpK2UqdCl9KTpudWxsfTt2YXIgRGQ9TGQucmFuZ2U7ZnVuY3Rpb24gVWQodCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgbj1uZXcgRGF0ZSgtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCk7cmV0dXJuIG4uc2V0RnVsbFllYXIodC55KSxufXJldHVybiBuZXcgRGF0ZSh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpfWZ1bmN0aW9uIHFkKHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIG49bmV3IERhdGUoRGF0ZS5VVEMoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKTtyZXR1cm4gbi5zZXRVVENGdWxsWWVhcih0LnkpLG59cmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHQueSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpfWZ1bmN0aW9uIE9kKHQpe3JldHVybnt5OnQsbTowLGQ6MSxIOjAsTTowLFM6MCxMOjB9fWZ1bmN0aW9uIFlkKHQpe3ZhciBuPXQuZGF0ZVRpbWUsZT10LmRhdGUscj10LnRpbWUsaT10LnBlcmlvZHMsbz10LmRheXMsYT10LnNob3J0RGF5cyx1PXQubW9udGhzLGY9dC5zaG9ydE1vbnRocyxjPVZkKGkpLHM9JGQoaSksbD1WZChvKSxoPSRkKG8pLGQ9VmQoYSkscD0kZChhKSx2PVZkKHUpLGc9JGQodSkseT1WZChmKSxfPSRkKGYpLGI9e2E6ZnVuY3Rpb24odCl7cmV0dXJuIGFbdC5nZXREYXkoKV19LEE6ZnVuY3Rpb24odCl7cmV0dXJuIG9bdC5nZXREYXkoKV19LGI6ZnVuY3Rpb24odCl7cmV0dXJuIGZbdC5nZXRNb250aCgpXX0sQjpmdW5jdGlvbih0KXtyZXR1cm4gdVt0LmdldE1vbnRoKCldfSxjOm51bGwsZDpwcCxlOnBwLGY6YnAsSDp2cCxJOmdwLGo6eXAsTDpfcCxtOm1wLE06eHAscDpmdW5jdGlvbih0KXtyZXR1cm4gaVsrKHQuZ2V0SG91cnMoKT49MTIpXX0sUTpXcCxzOlpwLFM6d3AsdTpNcCxVOkFwLFY6VHAsdzpOcCxXOlNwLHg6bnVsbCxYOm51bGwseTpFcCxZOmtwLFo6Q3AsIiUiOiRwfSxtPXthOmZ1bmN0aW9uKHQpe3JldHVybiBhW3QuZ2V0VVRDRGF5KCldfSxBOmZ1bmN0aW9uKHQpe3JldHVybiBvW3QuZ2V0VVRDRGF5KCldfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBmW3QuZ2V0VVRDTW9udGgoKV19LEI6ZnVuY3Rpb24odCl7cmV0dXJuIHVbdC5nZXRVVENNb250aCgpXX0sYzpudWxsLGQ6UHAsZTpQcCxmOlVwLEg6enAsSTpScCxqOkxwLEw6RHAsbTpxcCxNOk9wLHA6ZnVuY3Rpb24odCl7cmV0dXJuIGlbKyh0LmdldFVUQ0hvdXJzKCk+PTEyKV19LFE6V3AsczpacCxTOllwLHU6QnAsVTpGcCxWOklwLHc6SHAsVzpqcCx4Om51bGwsWDpudWxsLHk6WHAsWTpHcCxaOlZwLCIlIjokcH0seD17YTpmdW5jdGlvbih0LG4sZSl7dmFyIHI9ZC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lnc9cFtyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxBOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj1sLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQudz1oW3JbMF0udG9Mb3dlckNhc2UoKV0sZStyWzBdLmxlbmd0aCk6LTF9LGI6ZnVuY3Rpb24odCxuLGUpe3ZhciByPXkuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5tPV9bclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX0sQjpmdW5jdGlvbih0LG4sZSl7dmFyIHI9di5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lm09Z1tyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxjOmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gQSh0LG4sZSxyKX0sZDppcCxlOmlwLGY6c3AsSDphcCxJOmFwLGo6b3AsTDpjcCxtOnJwLE06dXAscDpmdW5jdGlvbih0LG4sZSl7dmFyIHI9Yy5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LnA9c1tyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxROmhwLHM6ZHAsUzpmcCx1OlpkLFU6UWQsVjpKZCx3OldkLFc6S2QseDpmdW5jdGlvbih0LG4scil7cmV0dXJuIEEodCxlLG4scil9LFg6ZnVuY3Rpb24odCxuLGUpe3JldHVybiBBKHQscixuLGUpfSx5Om5wLFk6dHAsWjplcCwiJSI6bHB9O2Z1bmN0aW9uIHcodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHIsaSxvLGE9W10sdT0tMSxmPTAsYz10Lmxlbmd0aDtmb3IoZSBpbnN0YW5jZW9mIERhdGV8fChlPW5ldyBEYXRlKCtlKSk7Kyt1PGM7KTM3PT09dC5jaGFyQ29kZUF0KHUpJiYoYS5wdXNoKHQuc2xpY2UoZix1KSksbnVsbCE9KGk9RmRbcj10LmNoYXJBdCgrK3UpXSk/cj10LmNoYXJBdCgrK3UpOmk9ImUiPT09cj8iICI6IjAiLChvPW5bcl0pJiYocj1vKGUsaSkpLGEucHVzaChyKSxmPXUrMSk7cmV0dXJuIGEucHVzaCh0LnNsaWNlKGYsdSkpLGEuam9pbigiIil9fWZ1bmN0aW9uIE0odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHIsaSxvPU9kKDE5MDApO2lmKEEobyx0LGUrPSIiLDApIT1lLmxlbmd0aClyZXR1cm4gbnVsbDtpZigiUSJpbiBvKXJldHVybiBuZXcgRGF0ZShvLlEpO2lmKCJwImluIG8mJihvLkg9by5IJTEyKzEyKm8ucCksIlYiaW4gbyl7aWYoby5WPDF8fG8uVj41MylyZXR1cm4gbnVsbDsidyJpbiBvfHwoby53PTEpLCJaImluIG8/KGk9KHI9cWQoT2Qoby55KSkpLmdldFVUQ0RheSgpLHI9aT40fHwwPT09aT9iZC5jZWlsKHIpOmJkKHIpLHI9dmQub2Zmc2V0KHIsNyooby5WLTEpKSxvLnk9ci5nZXRVVENGdWxsWWVhcigpLG8ubT1yLmdldFVUQ01vbnRoKCksby5kPXIuZ2V0VVRDRGF0ZSgpKyhvLncrNiklNyk6KGk9KHI9bihPZChvLnkpKSkuZ2V0RGF5KCkscj1pPjR8fDA9PT1pPyRoLmNlaWwocik6JGgocikscj1qaC5vZmZzZXQociw3KihvLlYtMSkpLG8ueT1yLmdldEZ1bGxZZWFyKCksby5tPXIuZ2V0TW9udGgoKSxvLmQ9ci5nZXREYXRlKCkrKG8udys2KSU3KX1lbHNlKCJXImluIG98fCJVImluIG8pJiYoInciaW4gb3x8KG8udz0idSJpbiBvP28udSU3OiJXImluIG8/MTowKSxpPSJaImluIG8/cWQoT2Qoby55KSkuZ2V0VVRDRGF5KCk6bihPZChvLnkpKS5nZXREYXkoKSxvLm09MCxvLmQ9IlciaW4gbz8oby53KzYpJTcrNypvLlctKGkrNSklNzpvLncrNypvLlUtKGkrNiklNyk7cmV0dXJuIloiaW4gbz8oby5IKz1vLlovMTAwfDAsby5NKz1vLlolMTAwLHFkKG8pKTpuKG8pfX1mdW5jdGlvbiBBKHQsbixlLHIpe2Zvcih2YXIgaSxvLGE9MCx1PW4ubGVuZ3RoLGY9ZS5sZW5ndGg7YTx1Oyl7aWYocj49ZilyZXR1cm4tMTtpZigzNz09PShpPW4uY2hhckNvZGVBdChhKyspKSl7aWYoaT1uLmNoYXJBdChhKyspLCEobz14W2kgaW4gRmQ/bi5jaGFyQXQoYSsrKTppXSl8fChyPW8odCxlLHIpKTwwKXJldHVybi0xfWVsc2UgaWYoaSE9ZS5jaGFyQ29kZUF0KHIrKykpcmV0dXJuLTF9cmV0dXJuIHJ9cmV0dXJuIGIueD13KGUsYiksYi5YPXcocixiKSxiLmM9dyhuLGIpLG0ueD13KGUsbSksbS5YPXcocixtKSxtLmM9dyhuLG0pLHtmb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIG49dyh0Kz0iIixiKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSxwYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1NKHQrPSIiLFVkKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNGb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIG49dyh0Kz0iIixtKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNQYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1NKHQscWQpO3JldHVybiBuLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LG59fX12YXIgQmQsRmQ9eyItIjoiIixfOiIgIiwwOiIwIn0sSWQ9L15ccypcZCsvLEhkPS9eJS8samQ9L1tcXF4kKis/fFtcXSgpLnt9XS9nO2Z1bmN0aW9uIFhkKHQsbixlKXt2YXIgcj10PDA/Ii0iOiIiLGk9KHI/LXQ6dCkrIiIsbz1pLmxlbmd0aDtyZXR1cm4gcisobzxlP25ldyBBcnJheShlLW8rMSkuam9pbihuKStpOmkpfWZ1bmN0aW9uIEdkKHQpe3JldHVybiB0LnJlcGxhY2UoamQsIlxcJCYiKX1mdW5jdGlvbiBWZCh0KXtyZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIrdC5tYXAoR2QpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiAkZCh0KXtmb3IodmFyIG49e30sZT0tMSxyPXQubGVuZ3RoOysrZTxyOyluW3RbZV0udG9Mb3dlckNhc2UoKV09ZTtyZXR1cm4gbn1mdW5jdGlvbiBXZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/KHQudz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBaZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/KHQudT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBRZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVj0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBLZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB0cCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSs0KSk7cmV0dXJuIHI/KHQueT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBucCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQueT0rclswXSsoK3JbMF0+Njg/MTkwMDoyZTMpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGVwKHQsbixlKXt2YXIgcj0vXihaKXwoWystXVxkXGQpKD86Oj8oXGRcZCkpPy8uZXhlYyhuLnNsaWNlKGUsZSs2KSk7cmV0dXJuIHI/KHQuWj1yWzFdPzA6LShyWzJdKyhyWzNdfHwiMDAiKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcnAodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lm09clswXS0xLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGlwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG9wKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8odC5tPTAsdC5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGFwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5IPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHVwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5NPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGZwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5TPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGNwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8odC5MPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHNwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzYpKTtyZXR1cm4gcj8odC5MPU1hdGguZmxvb3IoclswXS8xZTMpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGxwKHQsbixlKXt2YXIgcj1IZC5leGVjKG4uc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj9lK3JbMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGhwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LlE9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gZHAodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQuUT0xZTMqK3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcHAodCxuKXtyZXR1cm4gWGQodC5nZXREYXRlKCksbiwyKX1mdW5jdGlvbiB2cCh0LG4pe3JldHVybiBYZCh0LmdldEhvdXJzKCksbiwyKX1mdW5jdGlvbiBncCh0LG4pe3JldHVybiBYZCh0LmdldEhvdXJzKCklMTJ8fDEyLG4sMil9ZnVuY3Rpb24geXAodCxuKXtyZXR1cm4gWGQoMStqaC5jb3VudChjZCh0KSx0KSxuLDMpfWZ1bmN0aW9uIF9wKHQsbil7cmV0dXJuIFhkKHQuZ2V0TWlsbGlzZWNvbmRzKCksbiwzKX1mdW5jdGlvbiBicCh0LG4pe3JldHVybiBfcCh0LG4pKyIwMDAifWZ1bmN0aW9uIG1wKHQsbil7cmV0dXJuIFhkKHQuZ2V0TW9udGgoKSsxLG4sMil9ZnVuY3Rpb24geHAodCxuKXtyZXR1cm4gWGQodC5nZXRNaW51dGVzKCksbiwyKX1mdW5jdGlvbiB3cCh0LG4pe3JldHVybiBYZCh0LmdldFNlY29uZHMoKSxuLDIpfWZ1bmN0aW9uIE1wKHQpe3ZhciBuPXQuZ2V0RGF5KCk7cmV0dXJuIDA9PT1uPzc6bn1mdW5jdGlvbiBBcCh0LG4pe3JldHVybiBYZChWaC5jb3VudChjZCh0KSx0KSxuLDIpfWZ1bmN0aW9uIFRwKHQsbil7dmFyIGU9dC5nZXREYXkoKTtyZXR1cm4gdD1lPj00fHwwPT09ZT9RaCh0KTpRaC5jZWlsKHQpLFhkKFFoLmNvdW50KGNkKHQpLHQpKyg0PT09Y2QodCkuZ2V0RGF5KCkpLG4sMil9ZnVuY3Rpb24gTnAodCl7cmV0dXJuIHQuZ2V0RGF5KCl9ZnVuY3Rpb24gU3AodCxuKXtyZXR1cm4gWGQoJGguY291bnQoY2QodCksdCksbiwyKX1mdW5jdGlvbiBFcCh0LG4pe3JldHVybiBYZCh0LmdldEZ1bGxZZWFyKCklMTAwLG4sMil9ZnVuY3Rpb24ga3AodCxuKXtyZXR1cm4gWGQodC5nZXRGdWxsWWVhcigpJTFlNCxuLDQpfWZ1bmN0aW9uIENwKHQpe3ZhciBuPXQuZ2V0VGltZXpvbmVPZmZzZXQoKTtyZXR1cm4obj4wPyItIjoobio9LTEsIisiKSkrWGQobi82MHwwLCIwIiwyKStYZChuJTYwLCIwIiwyKX1mdW5jdGlvbiBQcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0RhdGUoKSxuLDIpfWZ1bmN0aW9uIHpwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDSG91cnMoKSxuLDIpfWZ1bmN0aW9uIFJwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDSG91cnMoKSUxMnx8MTIsbiwyKX1mdW5jdGlvbiBMcCh0LG4pe3JldHVybiBYZCgxK3ZkLmNvdW50KExkKHQpLHQpLG4sMyl9ZnVuY3Rpb24gRHAodCxuKXtyZXR1cm4gWGQodC5nZXRVVENNaWxsaXNlY29uZHMoKSxuLDMpfWZ1bmN0aW9uIFVwKHQsbil7cmV0dXJuIERwKHQsbikrIjAwMCJ9ZnVuY3Rpb24gcXAodCxuKXtyZXR1cm4gWGQodC5nZXRVVENNb250aCgpKzEsbiwyKX1mdW5jdGlvbiBPcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ01pbnV0ZXMoKSxuLDIpfWZ1bmN0aW9uIFlwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDU2Vjb25kcygpLG4sMil9ZnVuY3Rpb24gQnAodCl7dmFyIG49dC5nZXRVVENEYXkoKTtyZXR1cm4gMD09PW4/NzpufWZ1bmN0aW9uIEZwKHQsbil7cmV0dXJuIFhkKF9kLmNvdW50KExkKHQpLHQpLG4sMil9ZnVuY3Rpb24gSXAodCxuKXt2YXIgZT10LmdldFVUQ0RheSgpO3JldHVybiB0PWU+PTR8fDA9PT1lP3dkKHQpOndkLmNlaWwodCksWGQod2QuY291bnQoTGQodCksdCkrKDQ9PT1MZCh0KS5nZXRVVENEYXkoKSksbiwyKX1mdW5jdGlvbiBIcCh0KXtyZXR1cm4gdC5nZXRVVENEYXkoKX1mdW5jdGlvbiBqcCh0LG4pe3JldHVybiBYZChiZC5jb3VudChMZCh0KSx0KSxuLDIpfWZ1bmN0aW9uIFhwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDRnVsbFllYXIoKSUxMDAsbiwyKX1mdW5jdGlvbiBHcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0Z1bGxZZWFyKCklMWU0LG4sNCl9ZnVuY3Rpb24gVnAoKXtyZXR1cm4iKzAwMDAifWZ1bmN0aW9uICRwKCl7cmV0dXJuIiUifWZ1bmN0aW9uIFdwKHQpe3JldHVybit0fWZ1bmN0aW9uIFpwKHQpe3JldHVybiBNYXRoLmZsb29yKCt0LzFlMyl9ZnVuY3Rpb24gUXAobil7cmV0dXJuIEJkPVlkKG4pLHQudGltZUZvcm1hdD1CZC5mb3JtYXQsdC50aW1lUGFyc2U9QmQucGFyc2UsdC51dGNGb3JtYXQ9QmQudXRjRm9ybWF0LHQudXRjUGFyc2U9QmQudXRjUGFyc2UsQmR9UXAoe2RhdGVUaW1lOiIleCwgJVgiLGRhdGU6IiUtbS8lLWQvJVkiLHRpbWU6IiUtSTolTTolUyAlcCIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTt2YXIgSnA9RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc/ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9JU09TdHJpbmcoKX06dC51dGNGb3JtYXQoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpO3ZhciBLcD0rbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP2Z1bmN0aW9uKHQpe3ZhciBuPW5ldyBEYXRlKHQpO3JldHVybiBpc05hTihuKT9udWxsOm59OnQudXRjUGFyc2UoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpLHR2PTFlMyxudj02MCp0dixldj02MCpudixydj0yNCpldixpdj03KnJ2LG92PTMwKnJ2LGF2PTM2NSpydjtmdW5jdGlvbiB1dih0KXtyZXR1cm4gbmV3IERhdGUodCl9ZnVuY3Rpb24gZnYodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlPyt0OituZXcgRGF0ZSgrdCl9ZnVuY3Rpb24gY3YodCxuLHIsaSxvLGEsdSxmLGMpe3ZhciBzPW1oKGdoLHZlKSxsPXMuaW52ZXJ0LGg9cy5kb21haW4sZD1jKCIuJUwiKSxwPWMoIjolUyIpLHY9YygiJUk6JU0iKSxnPWMoIiVJICVwIikseT1jKCIlYSAlZCIpLF89YygiJWIgJWQiKSxiPWMoIiVCIiksbT1jKCIlWSIpLHg9W1t1LDEsdHZdLFt1LDUsNSp0dl0sW3UsMTUsMTUqdHZdLFt1LDMwLDMwKnR2XSxbYSwxLG52XSxbYSw1LDUqbnZdLFthLDE1LDE1Km52XSxbYSwzMCwzMCpudl0sW28sMSxldl0sW28sMywzKmV2XSxbbyw2LDYqZXZdLFtvLDEyLDEyKmV2XSxbaSwxLHJ2XSxbaSwyLDIqcnZdLFtyLDEsaXZdLFtuLDEsb3ZdLFtuLDMsMypvdl0sW3QsMSxhdl1dO2Z1bmN0aW9uIE0oZSl7cmV0dXJuKHUoZSk8ZT9kOmEoZSk8ZT9wOm8oZSk8ZT92OmkoZSk8ZT9nOm4oZSk8ZT9yKGUpPGU/eTpfOnQoZSk8ZT9iOm0pKGUpfWZ1bmN0aW9uIEEobixyLGksbyl7aWYobnVsbD09biYmKG49MTApLCJudW1iZXIiPT10eXBlb2Ygbil7dmFyIGE9TWF0aC5hYnMoaS1yKS9uLHU9ZShmdW5jdGlvbih0KXtyZXR1cm4gdFsyXX0pLnJpZ2h0KHgsYSk7dT09PXgubGVuZ3RoPyhvPXcoci9hdixpL2F2LG4pLG49dCk6dT8obz0odT14W2EveFt1LTFdWzJdPHhbdV1bMl0vYT91LTE6dV0pWzFdLG49dVswXSk6KG89TWF0aC5tYXgodyhyLGksbiksMSksbj1mKX1yZXR1cm4gbnVsbD09bz9uOm4uZXZlcnkobyl9cmV0dXJuIHMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRGF0ZShsKHQpKX0scy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/aChmaC5jYWxsKHQsZnYpKTpoKCkubWFwKHV2KX0scy50aWNrcz1mdW5jdGlvbih0LG4pe3ZhciBlLHI9aCgpLGk9clswXSxvPXJbci5sZW5ndGgtMV0sYT1vPGk7cmV0dXJuIGEmJihlPWksaT1vLG89ZSksZT0oZT1BKHQsaSxvLG4pKT9lLnJhbmdlKGksbysxKTpbXSxhP2UucmV2ZXJzZSgpOmV9LHMudGlja0Zvcm1hdD1mdW5jdGlvbih0LG4pe3JldHVybiBudWxsPT1uP006YyhuKX0scy5uaWNlPWZ1bmN0aW9uKHQsbil7dmFyIGU9aCgpO3JldHVybih0PUEodCxlWzBdLGVbZS5sZW5ndGgtMV0sbikpP2god2goZSx0KSk6c30scy5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKHMsY3YodCxuLHIsaSxvLGEsdSxmLGMpKX0sc31mdW5jdGlvbiBzdih0KXtmb3IodmFyIG49dC5sZW5ndGgvNnwwLGU9bmV3IEFycmF5KG4pLHI9MDtyPG47KWVbcl09IiMiK3Quc2xpY2UoNipyLDYqKytyKTtyZXR1cm4gZX12YXIgbHY9c3YoIjFmNzdiNGZmN2YwZTJjYTAyY2Q2MjcyODk0NjdiZDhjNTY0YmUzNzdjMjdmN2Y3ZmJjYmQyMjE3YmVjZiIpLGh2PXN2KCI3ZmM5N2ZiZWFlZDRmZGMwODZmZmZmOTkzODZjYjBmMDAyN2ZiZjViMTc2NjY2NjYiKSxkdj1zdigiMWI5ZTc3ZDk1ZjAyNzU3MGIzZTcyOThhNjZhNjFlZTZhYjAyYTY3NjFkNjY2NjY2IikscHY9c3YoImE2Y2VlMzFmNzhiNGIyZGY4YTMzYTAyY2ZiOWE5OWUzMWExY2ZkYmY2ZmZmN2YwMGNhYjJkNjZhM2Q5YWZmZmY5OWIxNTkyOCIpLHZ2PXN2KCJmYmI0YWViM2NkZTNjY2ViYzVkZWNiZTRmZWQ5YTZmZmZmY2NlNWQ4YmRmZGRhZWNmMmYyZjIiKSxndj1zdigiYjNlMmNkZmRjZGFjY2JkNWU4ZjRjYWU0ZTZmNWM5ZmZmMmFlZjFlMmNjY2NjY2NjIikseXY9c3YoImU0MWExYzM3N2ViODRkYWY0YTk4NGVhM2ZmN2YwMGZmZmYzM2E2NTYyOGY3ODFiZjk5OTk5OSIpLF92PXN2KCI2NmMyYTVmYzhkNjI4ZGEwY2JlNzhhYzNhNmQ4NTRmZmQ5MmZlNWM0OTRiM2IzYjMiKSxidj1zdigiOGRkM2M3ZmZmZmIzYmViYWRhZmI4MDcyODBiMWQzZmRiNDYyYjNkZTY5ZmNjZGU1ZDlkOWQ5YmM4MGJkY2NlYmM1ZmZlZDZmIik7ZnVuY3Rpb24gbXYodCl7cmV0dXJuIGxlKHRbdC5sZW5ndGgtMV0pfXZhciB4dj1uZXcgQXJyYXkoMykuY29uY2F0KCJkOGIzNjVmNWY1ZjU1YWI0YWMiLCJhNjYxMWFkZmMyN2Q4MGNkYzEwMTg1NzEiLCJhNjYxMWFkZmMyN2RmNWY1ZjU4MGNkYzEwMTg1NzEiLCI4YzUxMGFkOGIzNjVmNmU4YzNjN2VhZTU1YWI0YWMwMTY2NWUiLCI4YzUxMGFkOGIzNjVmNmU4YzNmNWY1ZjVjN2VhZTU1YWI0YWMwMTY2NWUiLCI4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUiLCI4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNmNWY1ZjVjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUiLCI1NDMwMDU4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUwMDNjMzAiLCI1NDMwMDU4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNmNWY1ZjVjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUwMDNjMzAiKS5tYXAoc3YpLHd2PW12KHh2KSxNdj1uZXcgQXJyYXkoMykuY29uY2F0KCJhZjhkYzNmN2Y3Zjc3ZmJmN2IiLCI3YjMyOTRjMmE1Y2ZhNmRiYTAwMDg4MzciLCI3YjMyOTRjMmE1Y2ZmN2Y3ZjdhNmRiYTAwMDg4MzciLCI3NjJhODNhZjhkYzNlN2Q0ZThkOWYwZDM3ZmJmN2IxYjc4MzciLCI3NjJhODNhZjhkYzNlN2Q0ZThmN2Y3ZjdkOWYwZDM3ZmJmN2IxYjc4MzciLCI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzciLCI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzciLCI0MDAwNGI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzcwMDQ0MWIiLCI0MDAwNGI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzcwMDQ0MWIiKS5tYXAoc3YpLEF2PW12KE12KSxUdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlOWEzYzlmN2Y3ZjdhMWQ3NmEiLCJkMDFjOGJmMWI2ZGFiOGUxODY0ZGFjMjYiLCJkMDFjOGJmMWI2ZGFmN2Y3ZjdiOGUxODY0ZGFjMjYiLCJjNTFiN2RlOWEzYzlmZGUwZWZlNmY1ZDBhMWQ3NmE0ZDkyMjEiLCJjNTFiN2RlOWEzYzlmZGUwZWZmN2Y3ZjdlNmY1ZDBhMWQ3NmE0ZDkyMjEiLCJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEiLCJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZmN2Y3ZjdlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEiLCI4ZTAxNTJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEyNzY0MTkiLCI4ZTAxNTJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZmN2Y3ZjdlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEyNzY0MTkiKS5tYXAoc3YpLE52PW12KFR2KSxTdj1uZXcgQXJyYXkoMykuY29uY2F0KCI5OThlYzNmN2Y3ZjdmMWEzNDAiLCI1ZTNjOTliMmFiZDJmZGI4NjNlNjYxMDEiLCI1ZTNjOTliMmFiZDJmN2Y3ZjdmZGI4NjNlNjYxMDEiLCI1NDI3ODg5OThlYzNkOGRhZWJmZWUwYjZmMWEzNDBiMzU4MDYiLCI1NDI3ODg5OThlYzNkOGRhZWJmN2Y3ZjdmZWUwYjZmMWEzNDBiMzU4MDYiLCI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDYiLCI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmN2Y3ZjdmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDYiLCIyZDAwNGI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDY3ZjNiMDgiLCIyZDAwNGI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmN2Y3ZjdmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDY3ZjNiMDgiKS5tYXAoc3YpLEV2PW12KFN2KSxrdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlZjhhNjJmN2Y3Zjc2N2E5Y2YiLCJjYTAwMjBmNGE1ODI5MmM1ZGUwNTcxYjAiLCJjYTAwMjBmNGE1ODJmN2Y3Zjc5MmM1ZGUwNTcxYjAiLCJiMjE4MmJlZjhhNjJmZGRiYzdkMWU1ZjA2N2E5Y2YyMTY2YWMiLCJiMjE4MmJlZjhhNjJmZGRiYzdmN2Y3ZjdkMWU1ZjA2N2E5Y2YyMTY2YWMiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmN2Y3ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMwNTMwNjEiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmN2Y3ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMwNTMwNjEiKS5tYXAoc3YpLEN2PW12KGt2KSxQdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlZjhhNjJmZmZmZmY5OTk5OTkiLCJjYTAwMjBmNGE1ODJiYWJhYmE0MDQwNDAiLCJjYTAwMjBmNGE1ODJmZmZmZmZiYWJhYmE0MDQwNDAiLCJiMjE4MmJlZjhhNjJmZGRiYzdlMGUwZTA5OTk5OTk0ZDRkNGQiLCJiMjE4MmJlZjhhNjJmZGRiYzdmZmZmZmZlMGUwZTA5OTk5OTk0ZDRkNGQiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmZmZmZmZlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQxYTFhMWEiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmZmZmZmZlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQxYTFhMWEiKS5tYXAoc3YpLHp2PW12KFB2KSxSdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5MWJmZGIiLCJkNzE5MWNmZGFlNjFhYmQ5ZTkyYzdiYjYiLCJkNzE5MWNmZGFlNjFmZmZmYmZhYmQ5ZTkyYzdiYjYiLCJkNzMwMjdmYzhkNTlmZWUwOTBlMGYzZjg5MWJmZGI0NTc1YjQiLCJkNzMwMjdmYzhkNTlmZWUwOTBmZmZmYmZlMGYzZjg5MWJmZGI0NTc1YjQiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBmZmZmYmZlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQzMTM2OTUiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBmZmZmYmZlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQzMTM2OTUiKS5tYXAoc3YpLEx2PW12KFJ2KSxEdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5MWNmNjAiLCJkNzE5MWNmZGFlNjFhNmQ5NmExYTk2NDEiLCJkNzE5MWNmZGFlNjFmZmZmYmZhNmQ5NmExYTk2NDEiLCJkNzMwMjdmYzhkNTlmZWUwOGJkOWVmOGI5MWNmNjAxYTk4NTAiLCJkNzMwMjdmYzhkNTlmZWUwOGJmZmZmYmZkOWVmOGI5MWNmNjAxYTk4NTAiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAwMDY4MzciLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAwMDY4MzciKS5tYXAoc3YpLFV2PW12KER2KSxxdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5OWQ1OTQiLCJkNzE5MWNmZGFlNjFhYmRkYTQyYjgzYmEiLCJkNzE5MWNmZGFlNjFmZmZmYmZhYmRkYTQyYjgzYmEiLCJkNTNlNGZmYzhkNTlmZWUwOGJlNmY1OTg5OWQ1OTQzMjg4YmQiLCJkNTNlNGZmYzhkNTlmZWUwOGJmZmZmYmZlNmY1OTg5OWQ1OTQzMjg4YmQiLCJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQiLCJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQiLCI5ZTAxNDJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQ1ZTRmYTIiLCI5ZTAxNDJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQ1ZTRmYTIiKS5tYXAoc3YpLE92PW12KHF2KSxZdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlNWY1Zjk5OWQ4YzkyY2EyNWYiLCJlZGY4ZmJiMmUyZTI2NmMyYTQyMzhiNDUiLCJlZGY4ZmJiMmUyZTI2NmMyYTQyY2EyNWYwMDZkMmMiLCJlZGY4ZmJjY2VjZTY5OWQ4Yzk2NmMyYTQyY2EyNWYwMDZkMmMiLCJlZGY4ZmJjY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDU4MjQiLCJmN2ZjZmRlNWY1ZjljY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDU4MjQiLCJmN2ZjZmRlNWY1ZjljY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDZkMmMwMDQ0MWIiKS5tYXAoc3YpLEJ2PW12KFl2KSxGdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlMGVjZjQ5ZWJjZGE4ODU2YTciLCJlZGY4ZmJiM2NkZTM4Yzk2YzY4ODQxOWQiLCJlZGY4ZmJiM2NkZTM4Yzk2YzY4ODU2YTc4MTBmN2MiLCJlZGY4ZmJiZmQzZTY5ZWJjZGE4Yzk2YzY4ODU2YTc4MTBmN2MiLCJlZGY4ZmJiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ2ZTAxNmIiLCJmN2ZjZmRlMGVjZjRiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ2ZTAxNmIiLCJmN2ZjZmRlMGVjZjRiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ4MTBmN2M0ZDAwNGIiKS5tYXAoc3YpLEl2PW12KEZ2KSxIdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlMGYzZGJhOGRkYjU0M2EyY2EiLCJmMGY5ZThiYWU0YmM3YmNjYzQyYjhjYmUiLCJmMGY5ZThiYWU0YmM3YmNjYzQ0M2EyY2EwODY4YWMiLCJmMGY5ZThjY2ViYzVhOGRkYjU3YmNjYzQ0M2EyY2EwODY4YWMiLCJmMGY5ZThjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODU4OWUiLCJmN2ZjZjBlMGYzZGJjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODU4OWUiLCJmN2ZjZjBlMGYzZGJjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODY4YWMwODQwODEiKS5tYXAoc3YpLGp2PW12KEh2KSxYdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWU4YzhmZGJiODRlMzRhMzMiLCJmZWYwZDlmZGNjOGFmYzhkNTlkNzMwMWYiLCJmZWYwZDlmZGNjOGFmYzhkNTllMzRhMzNiMzAwMDAiLCJmZWYwZDlmZGQ0OWVmZGJiODRmYzhkNTllMzRhMzNiMzAwMDAiLCJmZWYwZDlmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWY5OTAwMDAiLCJmZmY3ZWNmZWU4YzhmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWY5OTAwMDAiLCJmZmY3ZWNmZWU4YzhmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWZiMzAwMDA3ZjAwMDAiKS5tYXAoc3YpLEd2PW12KFh2KSxWdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlY2UyZjBhNmJkZGIxYzkwOTkiLCJmNmVmZjdiZGM5ZTE2N2E5Y2YwMjgxOGEiLCJmNmVmZjdiZGM5ZTE2N2E5Y2YxYzkwOTkwMTZjNTkiLCJmNmVmZjdkMGQxZTZhNmJkZGI2N2E5Y2YxYzkwOTkwMTZjNTkiLCJmNmVmZjdkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTY0NTAiLCJmZmY3ZmJlY2UyZjBkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTY0NTAiLCJmZmY3ZmJlY2UyZjBkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTZjNTkwMTQ2MzYiKS5tYXAoc3YpLCR2PW12KFZ2KSxXdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlY2U3ZjJhNmJkZGIyYjhjYmUiLCJmMWVlZjZiZGM5ZTE3NGE5Y2YwNTcwYjAiLCJmMWVlZjZiZGM5ZTE3NGE5Y2YyYjhjYmUwNDVhOGQiLCJmMWVlZjZkMGQxZTZhNmJkZGI3NGE5Y2YyYjhjYmUwNDVhOGQiLCJmMWVlZjZkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwMzRlN2IiLCJmZmY3ZmJlY2U3ZjJkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwMzRlN2IiLCJmZmY3ZmJlY2U3ZjJkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwNDVhOGQwMjM4NTgiKS5tYXAoc3YpLFp2PW12KFd2KSxRdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlN2UxZWZjOTk0YzdkZDFjNzciLCJmMWVlZjZkN2I1ZDhkZjY1YjBjZTEyNTYiLCJmMWVlZjZkN2I1ZDhkZjY1YjBkZDFjNzc5ODAwNDMiLCJmMWVlZjZkNGI5ZGFjOTk0YzdkZjY1YjBkZDFjNzc5ODAwNDMiLCJmMWVlZjZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5MTAwM2YiLCJmN2Y0ZjllN2UxZWZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5MTAwM2YiLCJmN2Y0ZjllN2UxZWZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5ODAwNDM2NzAwMWYiKS5tYXAoc3YpLEp2PW12KFF2KSxLdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmZGUwZGRmYTlmYjVjNTFiOGEiLCJmZWViZTJmYmI0YjlmNzY4YTFhZTAxN2UiLCJmZWViZTJmYmI0YjlmNzY4YTFjNTFiOGE3YTAxNzciLCJmZWViZTJmY2M1YzBmYTlmYjVmNzY4YTFjNTFiOGE3YTAxNzciLCJmZWViZTJmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzciLCJmZmY3ZjNmZGUwZGRmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzciLCJmZmY3ZjNmZGUwZGRmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzc0OTAwNmEiKS5tYXAoc3YpLHRnPW12KEt2KSxuZz1uZXcgQXJyYXkoMykuY29uY2F0KCJlZGY4YjE3ZmNkYmIyYzdmYjgiLCJmZmZmY2NhMWRhYjQ0MWI2YzQyMjVlYTgiLCJmZmZmY2NhMWRhYjQ0MWI2YzQyYzdmYjgyNTM0OTQiLCJmZmZmY2NjN2U5YjQ3ZmNkYmI0MWI2YzQyYzdmYjgyNTM0OTQiLCJmZmZmY2NjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgwYzJjODQiLCJmZmZmZDllZGY4YjFjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgwYzJjODQiLCJmZmZmZDllZGY4YjFjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgyNTM0OTQwODFkNTgiKS5tYXAoc3YpLGVnPW12KG5nKSxyZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmN2ZjYjlhZGRkOGUzMWEzNTQiLCJmZmZmY2NjMmU2OTk3OGM2NzkyMzg0NDMiLCJmZmZmY2NjMmU2OTk3OGM2NzkzMWEzNTQwMDY4MzciLCJmZmZmY2NkOWYwYTNhZGRkOGU3OGM2NzkzMWEzNTQwMDY4MzciLCJmZmZmY2NkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDVhMzIiLCJmZmZmZTVmN2ZjYjlkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDVhMzIiLCJmZmZmZTVmN2ZjYjlkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDY4MzcwMDQ1MjkiKS5tYXAoc3YpLGlnPW12KHJnKSxvZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZmY3YmNmZWM0NGZkOTVmMGUiLCJmZmZmZDRmZWQ5OGVmZTk5MjljYzRjMDIiLCJmZmZmZDRmZWQ5OGVmZTk5MjlkOTVmMGU5OTM0MDQiLCJmZmZmZDRmZWUzOTFmZWM0NGZmZTk5MjlkOTVmMGU5OTM0MDQiLCJmZmZmZDRmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDQiLCJmZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDQiLCJmZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI5OTM0MDQ2NjI1MDYiKS5tYXAoc3YpLGFnPW12KG9nKSx1Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZmVkYTBmZWIyNGNmMDNiMjAiLCJmZmZmYjJmZWNjNWNmZDhkM2NlMzFhMWMiLCJmZmZmYjJmZWNjNWNmZDhkM2NmMDNiMjBiZDAwMjYiLCJmZmZmYjJmZWQ5NzZmZWIyNGNmZDhkM2NmMDNiMjBiZDAwMjYiLCJmZmZmYjJmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiMTAwMjYiLCJmZmZmY2NmZmVkYTBmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiMTAwMjYiLCJmZmZmY2NmZmVkYTBmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiZDAwMjY4MDAwMjYiKS5tYXAoc3YpLGZnPW12KHVnKSxjZz1uZXcgQXJyYXkoMykuY29uY2F0KCJkZWViZjc5ZWNhZTEzMTgyYmQiLCJlZmYzZmZiZGQ3ZTc2YmFlZDYyMTcxYjUiLCJlZmYzZmZiZGQ3ZTc2YmFlZDYzMTgyYmQwODUxOWMiLCJlZmYzZmZjNmRiZWY5ZWNhZTE2YmFlZDYzMTgyYmQwODUxOWMiLCJlZmYzZmZjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODQ1OTQiLCJmN2ZiZmZkZWViZjdjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODQ1OTQiLCJmN2ZiZmZkZWViZjdjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODUxOWMwODMwNmIiKS5tYXAoc3YpLHNnPW12KGNnKSxsZz1uZXcgQXJyYXkoMykuY29uY2F0KCJlNWY1ZTBhMWQ5OWIzMWEzNTQiLCJlZGY4ZTliYWU0YjM3NGM0NzYyMzhiNDUiLCJlZGY4ZTliYWU0YjM3NGM0NzYzMWEzNTQwMDZkMmMiLCJlZGY4ZTljN2U5YzBhMWQ5OWI3NGM0NzYzMWEzNTQwMDZkMmMiLCJlZGY4ZTljN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDVhMzIiLCJmN2ZjZjVlNWY1ZTBjN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDVhMzIiLCJmN2ZjZjVlNWY1ZTBjN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDZkMmMwMDQ0MWIiKS5tYXAoc3YpLGhnPW12KGxnKSxkZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmMGYwZjBiZGJkYmQ2MzYzNjMiLCJmN2Y3ZjdjY2NjY2M5Njk2OTY1MjUyNTIiLCJmN2Y3ZjdjY2NjY2M5Njk2OTY2MzYzNjMyNTI1MjUiLCJmN2Y3ZjdkOWQ5ZDliZGJkYmQ5Njk2OTY2MzYzNjMyNTI1MjUiLCJmN2Y3ZjdkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUiLCJmZmZmZmZmMGYwZjBkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUiLCJmZmZmZmZmMGYwZjBkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUwMDAwMDAiKS5tYXAoc3YpLHBnPW12KGRnKSx2Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJlZmVkZjViY2JkZGM3NTZiYjEiLCJmMmYwZjdjYmM5ZTI5ZTlhYzg2YTUxYTMiLCJmMmYwZjdjYmM5ZTI5ZTlhYzg3NTZiYjE1NDI3OGYiLCJmMmYwZjdkYWRhZWJiY2JkZGM5ZTlhYzg3NTZiYjE1NDI3OGYiLCJmMmYwZjdkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM0YTE0ODYiLCJmY2ZiZmRlZmVkZjVkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM0YTE0ODYiLCJmY2ZiZmRlZmVkZjVkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM1NDI3OGYzZjAwN2QiKS5tYXAoc3YpLGdnPW12KHZnKSx5Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWUwZDJmYzkyNzJkZTJkMjYiLCJmZWU1ZDlmY2FlOTFmYjZhNGFjYjE4MWQiLCJmZWU1ZDlmY2FlOTFmYjZhNGFkZTJkMjZhNTBmMTUiLCJmZWU1ZDlmY2JiYTFmYzkyNzJmYjZhNGFkZTJkMjZhNTBmMTUiLCJmZWU1ZDlmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWQ5OTAwMGQiLCJmZmY1ZjBmZWUwZDJmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWQ5OTAwMGQiLCJmZmY1ZjBmZWUwZDJmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWRhNTBmMTU2NzAwMGQiKS5tYXAoc3YpLF9nPW12KHlnKSxiZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWU2Y2VmZGFlNmJlNjU1MGQiLCJmZWVkZGVmZGJlODVmZDhkM2NkOTQ3MDEiLCJmZWVkZGVmZGJlODVmZDhkM2NlNjU1MGRhNjM2MDMiLCJmZWVkZGVmZGQwYTJmZGFlNmJmZDhkM2NlNjU1MGRhNjM2MDMiLCJmZWVkZGVmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDE4YzJkMDQiLCJmZmY1ZWJmZWU2Y2VmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDE4YzJkMDQiLCJmZmY1ZWJmZWU2Y2VmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDFhNjM2MDM3ZjI3MDQiKS5tYXAoc3YpLG1nPW12KGJnKSx4Zz1HZShLbigzMDAsLjUsMCksS24oLTI0MCwuNSwxKSksd2c9R2UoS24oLTEwMCwuNzUsLjM1KSxLbig4MCwxLjUsLjgpKSxNZz1HZShLbigyNjAsLjc1LC4zNSksS24oODAsMS41LC44KSksQWc9S24oKTt2YXIgVGc9Ym4oKSxOZz1NYXRoLlBJLzMsU2c9MipNYXRoLlBJLzM7ZnVuY3Rpb24gRWcodCl7dmFyIG49dC5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0W01hdGgubWF4KDAsTWF0aC5taW4obi0xLE1hdGguZmxvb3IoZSpuKSkpXX19dmFyIGtnPUVnKHN2KCI0NDAxNTQ0NDAyNTY0NTA0NTc0NTA1NTk0NjA3NWE0NjA4NWM0NjBhNWQ0NjBiNWU0NzBkNjA0NzBlNjE0NzEwNjM0NzExNjQ0NzEzNjU0ODE0Njc0ODE2Njg0ODE3Njk0ODE4NmE0ODFhNmM0ODFiNmQ0ODFjNmU0ODFkNmY0ODFmNzA0ODIwNzE0ODIxNzM0ODIzNzQ0ODI0NzU0ODI1NzY0ODI2Nzc0ODI4Nzg0ODI5Nzk0NzJhN2E0NzJjN2E0NzJkN2I0NzJlN2M0NzJmN2Q0NjMwN2U0NjMyN2U0NjMzN2Y0NjM0ODA0NTM1ODE0NTM3ODE0NTM4ODI0NDM5ODM0NDNhODM0NDNiODQ0MzNkODQ0MzNlODU0MjNmODU0MjQwODY0MjQxODY0MTQyODc0MTQ0ODc0MDQ1ODg0MDQ2ODgzZjQ3ODgzZjQ4ODkzZTQ5ODkzZTRhODkzZTRjOGEzZDRkOGEzZDRlOGEzYzRmOGEzYzUwOGIzYjUxOGIzYjUyOGIzYTUzOGIzYTU0OGMzOTU1OGMzOTU2OGMzODU4OGMzODU5OGMzNzVhOGMzNzViOGQzNjVjOGQzNjVkOGQzNTVlOGQzNTVmOGQzNDYwOGQzNDYxOGQzMzYyOGQzMzYzOGQzMjY0OGUzMjY1OGUzMTY2OGUzMTY3OGUzMTY4OGUzMDY5OGUzMDZhOGUyZjZiOGUyZjZjOGUyZTZkOGUyZTZlOGUyZTZmOGUyZDcwOGUyZDcxOGUyYzcxOGUyYzcyOGUyYzczOGUyYjc0OGUyYjc1OGUyYTc2OGUyYTc3OGUyYTc4OGUyOTc5OGUyOTdhOGUyOTdiOGUyODdjOGUyODdkOGUyNzdlOGUyNzdmOGUyNzgwOGUyNjgxOGUyNjgyOGUyNjgyOGUyNTgzOGUyNTg0OGUyNTg1OGUyNDg2OGUyNDg3OGUyMzg4OGUyMzg5OGUyMzhhOGQyMjhiOGQyMjhjOGQyMjhkOGQyMThlOGQyMThmOGQyMTkwOGQyMTkxOGMyMDkyOGMyMDkyOGMyMDkzOGMxZjk0OGMxZjk1OGIxZjk2OGIxZjk3OGIxZjk4OGIxZjk5OGExZjlhOGExZTliOGExZTljODkxZTlkODkxZjllODkxZjlmODgxZmEwODgxZmExODgxZmExODcxZmEyODcyMGEzODYyMGE0ODYyMWE1ODUyMWE2ODUyMmE3ODUyMmE4ODQyM2E5ODMyNGFhODMyNWFiODIyNWFjODIyNmFkODEyN2FkODEyOGFlODAyOWFmN2YyYWIwN2YyY2IxN2UyZGIyN2QyZWIzN2MyZmI0N2MzMWI1N2IzMmI2N2EzNGI2NzkzNWI3NzkzN2I4NzgzOGI5NzczYWJhNzYzYmJiNzUzZGJjNzQzZmJjNzM0MGJkNzI0MmJlNzE0NGJmNzA0NmMwNmY0OGMxNmU0YWMxNmQ0Y2MyNmM0ZWMzNmI1MGM0NmE1MmM1Njk1NGM1Njg1NmM2Njc1OGM3NjU1YWM4NjQ1Y2M4NjM1ZWM5NjI2MGNhNjA2M2NiNWY2NWNiNWU2N2NjNWM2OWNkNWI2Y2NkNWE2ZWNlNTg3MGNmNTc3M2QwNTY3NWQwNTQ3N2QxNTM3YWQxNTE3Y2QyNTA3ZmQzNGU4MWQzNGQ4NGQ0NGI4NmQ1NDk4OWQ1NDg4YmQ2NDY4ZWQ2NDU5MGQ3NDM5M2Q3NDE5NWQ4NDA5OGQ4M2U5YmQ5M2M5ZGQ5M2JhMGRhMzlhMmRhMzdhNWRiMzZhOGRiMzRhYWRjMzJhZGRjMzBiMGRkMmZiMmRkMmRiNWRlMmJiOGRlMjliYWRlMjhiZGRmMjZjMGRmMjVjMmRmMjNjNWUwMjFjOGUwMjBjYWUxMWZjZGUxMWRkMGUxMWNkMmUyMWJkNWUyMWFkOGUyMTlkYWUzMTlkZGUzMThkZmUzMThlMmU0MThlNWU0MTllN2U0MTllYWU1MWFlY2U1MWJlZmU1MWNmMWU1MWRmNGU2MWVmNmU2MjBmOGU2MjFmYmU3MjNmZGU3MjUiKSksQ2c9RWcoc3YoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwOTAyMDIwYjAyMDIwZDAzMDMwZjAzMDMxMjA0MDQxNDA1MDQxNjA2MDUxODA2MDUxYTA3MDYxYzA4MDcxZTA5MDcyMDBhMDgyMjBiMDkyNDBjMDkyNjBkMGEyOTBlMGIyYjEwMGIyZDExMGMyZjEyMGQzMTEzMGQzNDE0MGUzNjE1MGUzODE2MGYzYjE4MGYzZDE5MTAzZjFhMTA0MjFjMTA0NDFkMTE0NzFlMTE0OTIwMTE0YjIxMTE0ZTIyMTE1MDI0MTI1MzI1MTI1NTI3MTI1ODI5MTE1YTJhMTE1YzJjMTE1ZjJkMTE2MTJmMTE2MzMxMTE2NTMzMTA2NzM0MTA2OTM2MTA2YjM4MTA2YzM5MGY2ZTNiMGY3MDNkMGY3MTNmMGY3MjQwMGY3NDQyMGY3NTQ0MGY3NjQ1MTA3NzQ3MTA3ODQ5MTA3ODRhMTA3OTRjMTE3YTRlMTE3YjRmMTI3YjUxMTI3YzUyMTM3YzU0MTM3ZDU2MTQ3ZDU3MTU3ZTU5MTU3ZTVhMTY3ZTVjMTY3ZjVkMTc3ZjVmMTg3ZjYwMTg4MDYyMTk4MDY0MWE4MDY1MWE4MDY3MWI4MDY4MWM4MTZhMWM4MTZiMWQ4MTZkMWQ4MTZlMWU4MTcwMWY4MTcyMWY4MTczMjA4MTc1MjE4MTc2MjE4MTc4MjI4MTc5MjI4MjdiMjM4MjdjMjM4MjdlMjQ4MjgwMjU4MjgxMjU4MTgzMjY4MTg0MjY4MTg2Mjc4MTg4Mjc4MTg5Mjg4MThiMjk4MThjMjk4MThlMmE4MTkwMmE4MTkxMmI4MTkzMmI4MDk0MmM4MDk2MmM4MDk4MmQ4MDk5MmQ4MDliMmU3ZjljMmU3ZjllMmY3ZmEwMmY3ZmExMzA3ZWEzMzA3ZWE1MzE3ZWE2MzE3ZGE4MzI3ZGFhMzM3ZGFiMzM3Y2FkMzQ3Y2FlMzQ3YmIwMzU3YmIyMzU3YmIzMzY3YWI1MzY3YWI3Mzc3OWI4Mzc3OWJhMzg3OGJjMzk3OGJkMzk3N2JmM2E3N2MwM2E3NmMyM2I3NWM0M2M3NWM1M2M3NGM3M2Q3M2M4M2U3M2NhM2U3MmNjM2Y3MWNkNDA3MWNmNDA3MGQwNDE2ZmQyNDI2ZmQzNDM2ZWQ1NDQ2ZGQ2NDU2Y2Q4NDU2Y2Q5NDY2YmRiNDc2YWRjNDg2OWRlNDk2OGRmNGE2OGUwNGM2N2UyNGQ2NmUzNGU2NWU0NGY2NGU1NTA2NGU3NTI2M2U4NTM2MmU5NTQ2MmVhNTY2MWViNTc2MGVjNTg2MGVkNWE1ZmVlNWI1ZWVmNWQ1ZWYwNWY1ZWYxNjA1ZGYyNjI1ZGYyNjQ1Y2YzNjU1Y2Y0Njc1Y2Y0Njk1Y2Y1NmI1Y2Y2NmM1Y2Y2NmU1Y2Y3NzA1Y2Y3NzI1Y2Y4NzQ1Y2Y4NzY1Y2Y5Nzg1ZGY5Nzk1ZGY5N2I1ZGZhN2Q1ZWZhN2Y1ZWZhODE1ZmZiODM1ZmZiODU2MGZiODc2MWZjODk2MWZjOGE2MmZjOGM2M2ZjOGU2NGZjOTA2NWZkOTI2NmZkOTQ2N2ZkOTY2OGZkOTg2OWZkOWE2YWZkOWI2YmZlOWQ2Y2ZlOWY2ZGZlYTE2ZWZlYTM2ZmZlYTU3MWZlYTc3MmZlYTk3M2ZlYWE3NGZlYWM3NmZlYWU3N2ZlYjA3OGZlYjI3YWZlYjQ3YmZlYjY3Y2ZlYjc3ZWZlYjk3ZmZlYmI4MWZlYmQ4MmZlYmY4NGZlYzE4NWZlYzI4N2ZlYzQ4OGZlYzY4YWZlYzg4Y2ZlY2E4ZGZlY2M4ZmZlY2Q5MGZlY2Y5MmZlZDE5NGZlZDM5NWZlZDU5N2ZlZDc5OWZlZDg5YWZkZGE5Y2ZkZGM5ZWZkZGVhMGZkZTBhMWZkZTJhM2ZkZTNhNWZkZTVhN2ZkZTdhOWZkZTlhYWZkZWJhY2ZjZWNhZWZjZWViMGZjZjBiMmZjZjJiNGZjZjRiNmZjZjZiOGZjZjdiOWZjZjliYmZjZmJiZGZjZmRiZiIpKSxQZz1FZyhzdigiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTBhMDIwMjBjMDIwMjBlMDMwMjEwMDQwMzEyMDQwMzE0MDUwNDE3MDYwNDE5MDcwNTFiMDgwNTFkMDkwNjFmMGEwNzIyMGIwNzI0MGMwODI2MGQwODI5MGUwOTJiMTAwOTJkMTEwYTMwMTIwYTMyMTQwYjM0MTUwYjM3MTYwYjM5MTgwYzNjMTkwYzNlMWIwYzQxMWMwYzQzMWUwYzQ1MWYwYzQ4MjEwYzRhMjMwYzRjMjQwYzRmMjYwYzUxMjgwYjUzMjkwYjU1MmIwYjU3MmQwYjU5MmYwYTViMzEwYTVjMzIwYTVlMzQwYTVmMzYwOTYxMzgwOTYyMzkwOTYzM2IwOTY0M2QwOTY1M2UwOTY2NDAwYTY3NDIwYTY4NDQwYTY4NDUwYTY5NDcwYjZhNDkwYjZhNGEwYzZiNGMwYzZiNGQwZDZjNGYwZDZjNTEwZTZjNTIwZTZkNTQwZjZkNTUwZjZkNTcxMDZlNTkxMDZlNWExMTZlNWMxMjZlNWQxMjZlNWYxMzZlNjExMzZlNjIxNDZlNjQxNTZlNjUxNTZlNjcxNjZlNjkxNjZlNmExNzZlNmMxODZlNmQxODZlNmYxOTZlNzExOTZlNzIxYTZlNzQxYTZlNzUxYjZlNzcxYzZkNzgxYzZkN2ExZDZkN2MxZDZkN2QxZTZkN2YxZTZjODAxZjZjODIyMDZjODQyMDZiODUyMTZiODcyMTZiODgyMjZhOGEyMjZhOGMyMzY5OGQyMzY5OGYyNDY5OTAyNTY4OTIyNTY4OTMyNjY3OTUyNjY3OTcyNzY2OTgyNzY2OWEyODY1OWIyOTY0OWQyOTY0OWYyYTYzYTAyYTYzYTIyYjYyYTMyYzYxYTUyYzYwYTYyZDYwYTgyZTVmYTkyZTVlYWIyZjVlYWQzMDVkYWUzMDVjYjAzMTViYjEzMjVhYjMzMjVhYjQzMzU5YjYzNDU4YjczNTU3YjkzNTU2YmEzNjU1YmMzNzU0YmQzODUzYmYzOTUyYzAzYTUxYzEzYTUwYzMzYjRmYzQzYzRlYzYzZDRkYzczZTRjYzgzZjRiY2E0MDRhY2I0MTQ5Y2M0MjQ4Y2U0MzQ3Y2Y0NDQ2ZDA0NTQ1ZDI0NjQ0ZDM0NzQzZDQ0ODQyZDU0YTQxZDc0YjNmZDg0YzNlZDk0ZDNkZGE0ZTNjZGI1MDNiZGQ1MTNhZGU1MjM4ZGY1MzM3ZTA1NTM2ZTE1NjM1ZTI1NzM0ZTM1OTMzZTQ1YTMxZTU1YzMwZTY1ZDJmZTc1ZTJlZTg2MDJkZTk2MTJiZWE2MzJhZWI2NDI5ZWI2NjI4ZWM2NzI2ZWQ2OTI1ZWU2YTI0ZWY2YzIzZWY2ZTIxZjA2ZjIwZjE3MTFmZjE3MzFkZjI3NDFjZjM3NjFiZjM3ODE5ZjQ3OTE4ZjU3YjE3ZjU3ZDE1ZjY3ZTE0ZjY4MDEzZjc4MjEyZjc4NDEwZjg4NTBmZjg4NzBlZjg4OTBjZjk4YjBiZjk4YzBhZjk4ZTA5ZmE5MDA4ZmE5MjA3ZmE5NDA3ZmI5NjA2ZmI5NzA2ZmI5OTA2ZmI5YjA2ZmI5ZDA3ZmM5ZjA3ZmNhMTA4ZmNhMzA5ZmNhNTBhZmNhNjBjZmNhODBkZmNhYTBmZmNhYzExZmNhZTEyZmNiMDE0ZmNiMjE2ZmNiNDE4ZmJiNjFhZmJiODFkZmJiYTFmZmJiYzIxZmJiZTIzZmFjMDI2ZmFjMjI4ZmFjNDJhZmFjNjJkZjljNzJmZjljOTMyZjljYjM1ZjhjZDM3ZjhjZjNhZjdkMTNkZjdkMzQwZjZkNTQzZjZkNzQ2ZjVkOTQ5ZjVkYjRjZjRkZDRmZjRkZjUzZjRlMTU2ZjNlMzVhZjNlNTVkZjJlNjYxZjJlODY1ZjJlYTY5ZjFlYzZkZjFlZDcxZjFlZjc1ZjFmMTc5ZjJmMjdkZjJmNDgyZjNmNTg2ZjNmNjhhZjRmODhlZjVmOTkyZjZmYTk2ZjhmYjlhZjlmYzlkZmFmZGExZmNmZmE0IikpLHpnPUVnKHN2KCIwZDA4ODcxMDA3ODgxMzA3ODkxNjA3OGExOTA2OGMxYjA2OGQxZDA2OGUyMDA2OGYyMjA2OTAyNDA2OTEyNjA1OTEyODA1OTIyYTA1OTMyYzA1OTQyZTA1OTUyZjA1OTYzMTA1OTczMzA1OTczNTA0OTgzNzA0OTkzODA0OWEzYTA0OWEzYzA0OWIzZTA0OWMzZjA0OWM0MTA0OWQ0MzAzOWU0NDAzOWU0NjAzOWY0ODAzOWY0OTAzYTA0YjAzYTE0YzAyYTE0ZTAyYTI1MDAyYTI1MTAyYTM1MzAyYTM1NTAyYTQ1NjAxYTQ1ODAxYTQ1OTAxYTU1YjAxYTU1YzAxYTY1ZTAxYTY2MDAxYTY2MTAwYTc2MzAwYTc2NDAwYTc2NjAwYTc2NzAwYTg2OTAwYTg2YTAwYTg2YzAwYTg2ZTAwYTg2ZjAwYTg3MTAwYTg3MjAxYTg3NDAxYTg3NTAxYTg3NzAxYTg3ODAxYTg3YTAyYTg3YjAyYTg3ZDAzYTg3ZTAzYTg4MDA0YTg4MTA0YTc4MzA1YTc4NDA1YTc4NjA2YTY4NzA3YTY4ODA4YTY4YTA5YTU4YjBhYTU4ZDBiYTU4ZTBjYTQ4ZjBkYTQ5MTBlYTM5MjBmYTM5NDEwYTI5NTExYTE5NjEzYTE5ODE0YTA5OTE1OWY5YTE2OWY5YzE3OWU5ZDE4OWQ5ZTE5OWRhMDFhOWNhMTFiOWJhMjFkOWFhMzFlOWFhNTFmOTlhNjIwOThhNzIxOTdhODIyOTZhYTIzOTVhYjI0OTRhYzI2OTRhZDI3OTNhZTI4OTJiMDI5OTFiMTJhOTBiMjJiOGZiMzJjOGViNDJlOGRiNTJmOGNiNjMwOGJiNzMxOGFiODMyODliYTMzODhiYjM0ODhiYzM1ODdiZDM3ODZiZTM4ODViZjM5ODRjMDNhODNjMTNiODJjMjNjODFjMzNkODBjNDNlN2ZjNTQwN2VjNjQxN2RjNzQyN2NjODQzN2JjOTQ0N2FjYTQ1N2FjYjQ2NzljYzQ3NzhjYzQ5NzdjZDRhNzZjZTRiNzVjZjRjNzRkMDRkNzNkMTRlNzJkMjRmNzFkMzUxNzFkNDUyNzBkNTUzNmZkNTU0NmVkNjU1NmRkNzU2NmNkODU3NmJkOTU4NmFkYTVhNmFkYTViNjlkYjVjNjhkYzVkNjdkZDVlNjZkZTVmNjVkZTYxNjRkZjYyNjNlMDYzNjNlMTY0NjJlMjY1NjFlMjY2NjBlMzY4NWZlNDY5NWVlNTZhNWRlNTZiNWRlNjZjNWNlNzZlNWJlNzZmNWFlODcwNTllOTcxNThlOTcyNTdlYTc0NTdlYjc1NTZlYjc2NTVlYzc3NTRlZDc5NTNlZDdhNTJlZTdiNTFlZjdjNTFlZjdlNTBmMDdmNGZmMDgwNGVmMTgxNGRmMTgzNGNmMjg0NGJmMzg1NGJmMzg3NGFmNDg4NDlmNDg5NDhmNThiNDdmNThjNDZmNjhkNDVmNjhmNDRmNzkwNDRmNzkxNDNmNzkzNDJmODk0NDFmODk1NDBmOTk3M2ZmOTk4M2VmOTlhM2VmYTliM2RmYTljM2NmYTllM2JmYjlmM2FmYmExMzlmYmEyMzhmY2EzMzhmY2E1MzdmY2E2MzZmY2E4MzVmY2E5MzRmZGFiMzNmZGFjMzNmZGFlMzJmZGFmMzFmZGIxMzBmZGIyMmZmZGI0MmZmZGI1MmVmZWI3MmRmZWI4MmNmZWJhMmNmZWJiMmJmZWJkMmFmZWJlMmFmZWMwMjlmZGMyMjlmZGMzMjhmZGM1MjdmZGM2MjdmZGM4MjdmZGNhMjZmZGNiMjZmY2NkMjVmY2NlMjVmY2QwMjVmY2QyMjVmYmQzMjRmYmQ1MjRmYmQ3MjRmYWQ4MjRmYWRhMjRmOWRjMjRmOWRkMjVmOGRmMjVmOGUxMjVmN2UyMjVmN2U0MjVmNmU2MjZmNmU4MjZmNWU5MjZmNWViMjdmNGVkMjdmM2VlMjdmM2YwMjdmMmYyMjdmMWY0MjZmMWY1MjVmMGY3MjRmMGY5MjEiKSk7ZnVuY3Rpb24gUmcodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBMZz1NYXRoLmFicyxEZz1NYXRoLmF0YW4yLFVnPU1hdGguY29zLHFnPU1hdGgubWF4LE9nPU1hdGgubWluLFlnPU1hdGguc2luLEJnPU1hdGguc3FydCxGZz0xZS0xMixJZz1NYXRoLlBJLEhnPUlnLzIsamc9MipJZztmdW5jdGlvbiBYZyh0KXtyZXR1cm4gdD49MT9IZzp0PD0tMT8tSGc6TWF0aC5hc2luKHQpfWZ1bmN0aW9uIEdnKHQpe3JldHVybiB0LmlubmVyUmFkaXVzfWZ1bmN0aW9uIFZnKHQpe3JldHVybiB0Lm91dGVyUmFkaXVzfWZ1bmN0aW9uICRnKHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gV2codCl7cmV0dXJuIHQuZW5kQW5nbGV9ZnVuY3Rpb24gWmcodCl7cmV0dXJuIHQmJnQucGFkQW5nbGV9ZnVuY3Rpb24gUWcodCxuLGUscixpLG8sYSl7dmFyIHU9dC1lLGY9bi1yLGM9KGE/bzotbykvQmcodSp1K2YqZikscz1jKmYsbD0tYyp1LGg9dCtzLGQ9bitsLHA9ZStzLHY9citsLGc9KGgrcCkvMix5PShkK3YpLzIsXz1wLWgsYj12LWQsbT1fKl8rYipiLHg9aS1vLHc9aCp2LXAqZCxNPShiPDA/LTE6MSkqQmcocWcoMCx4KngqbS13KncpKSxBPSh3KmItXypNKS9tLFQ9KC13Kl8tYipNKS9tLE49KHcqYitfKk0pL20sUz0oLXcqXytiKk0pL20sRT1BLWcsaz1ULXksQz1OLWcsUD1TLXk7cmV0dXJuIEUqRStrKms+QypDK1AqUCYmKEE9TixUPVMpLHtjeDpBLGN5OlQseDAxOi1zLHkwMTotbCx4MTE6QSooaS94LTEpLHkxMTpUKihpL3gtMSl9fWZ1bmN0aW9uIEpnKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBLZyh0KXtyZXR1cm4gbmV3IEpnKHQpfWZ1bmN0aW9uIHR5KHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIG55KHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIGV5KCl7dmFyIHQ9dHksbj1ueSxlPVJnKCEwKSxyPW51bGwsaT1LZyxvPW51bGw7ZnVuY3Rpb24gYShhKXt2YXIgdSxmLGMscz1hLmxlbmd0aCxsPSExO2ZvcihudWxsPT1yJiYobz1pKGM9R2koKSkpLHU9MDt1PD1zOysrdSkhKHU8cyYmZShmPWFbdV0sdSxhKSk9PT1sJiYoKGw9IWwpP28ubGluZVN0YXJ0KCk6by5saW5lRW5kKCkpLGwmJm8ucG9pbnQoK3QoZix1LGEpLCtuKGYsdSxhKSk7aWYoYylyZXR1cm4gbz1udWxsLGMrIiJ8fG51bGx9cmV0dXJuIGEueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKCtuKSxhKTp0fSxhLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6bn0sYS5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoISF0KSxhKTplfSxhLmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbnVsbCE9ciYmKG89aShyKSksYSk6aX0sYS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P3I9bz1udWxsOm89aShyPXQpLGEpOnJ9LGF9ZnVuY3Rpb24gcnkoKXt2YXIgdD10eSxuPW51bGwsZT1SZygwKSxyPW55LGk9UmcoITApLG89bnVsbCxhPUtnLHU9bnVsbDtmdW5jdGlvbiBmKGYpe3ZhciBjLHMsbCxoLGQscD1mLmxlbmd0aCx2PSExLGc9bmV3IEFycmF5KHApLHk9bmV3IEFycmF5KHApO2ZvcihudWxsPT1vJiYodT1hKGQ9R2koKSkpLGM9MDtjPD1wOysrYyl7aWYoIShjPHAmJmkoaD1mW2NdLGMsZikpPT09dilpZih2PSF2KXM9Yyx1LmFyZWFTdGFydCgpLHUubGluZVN0YXJ0KCk7ZWxzZXtmb3IodS5saW5lRW5kKCksdS5saW5lU3RhcnQoKSxsPWMtMTtsPj1zOy0tbCl1LnBvaW50KGdbbF0seVtsXSk7dS5saW5lRW5kKCksdS5hcmVhRW5kKCl9diYmKGdbY109K3QoaCxjLGYpLHlbY109K2UoaCxjLGYpLHUucG9pbnQobj8rbihoLGMsZik6Z1tjXSxyPytyKGgsYyxmKTp5W2NdKSl9aWYoZClyZXR1cm4gdT1udWxsLGQrIiJ8fG51bGx9ZnVuY3Rpb24gYygpe3JldHVybiBleSgpLmRlZmluZWQoaSkuY3VydmUoYSkuY29udGV4dChvKX1yZXR1cm4gZi54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6UmcoK2UpLG49bnVsbCxmKTp0fSxmLngwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UmcoK24pLGYpOnR9LGYueDE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOm59LGYueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxyPW51bGwsZik6ZX0sZi55MD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTplfSxmLnkxPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTpyfSxmLmxpbmVYMD1mLmxpbmVZMD1mdW5jdGlvbigpe3JldHVybiBjKCkueCh0KS55KGUpfSxmLmxpbmVZMT1mdW5jdGlvbigpe3JldHVybiBjKCkueCh0KS55KHIpfSxmLmxpbmVYMT1mdW5jdGlvbigpe3JldHVybiBjKCkueChuKS55KGUpfSxmLmRlZmluZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZyghIXQpLGYpOml9LGYuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCxudWxsIT1vJiYodT1hKG8pKSxmKTphfSxmLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/bz11PW51bGw6dT1hKG89dCksZik6b30sZn1mdW5jdGlvbiBpeSh0LG4pe3JldHVybiBuPHQ/LTE6bj50PzE6bj49dD8wOk5hTn1mdW5jdGlvbiBveSh0KXtyZXR1cm4gdH1KZy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5saW5lVG8odCxuKX19fTt2YXIgYXk9ZnkoS2cpO2Z1bmN0aW9uIHV5KHQpe3RoaXMuX2N1cnZlPXR9ZnVuY3Rpb24gZnkodCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbmV3IHV5KHQobikpfXJldHVybiBuLl9jdXJ2ZT10LG59ZnVuY3Rpb24gY3kodCl7dmFyIG49dC5jdXJ2ZTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oZnkodCkpOm4oKS5fY3VydmV9LHR9ZnVuY3Rpb24gc3koKXtyZXR1cm4gY3koZXkoKS5jdXJ2ZShheSkpfWZ1bmN0aW9uIGx5KCl7dmFyIHQ9cnkoKS5jdXJ2ZShheSksbj10LmN1cnZlLGU9dC5saW5lWDAscj10LmxpbmVYMSxpPXQubGluZVkwLG89dC5saW5lWTE7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5zdGFydEFuZ2xlPXQueDAsZGVsZXRlIHQueDAsdC5lbmRBbmdsZT10LngxLGRlbGV0ZSB0LngxLHQucmFkaXVzPXQueSxkZWxldGUgdC55LHQuaW5uZXJSYWRpdXM9dC55MCxkZWxldGUgdC55MCx0Lm91dGVyUmFkaXVzPXQueTEsZGVsZXRlIHQueTEsdC5saW5lU3RhcnRBbmdsZT1mdW5jdGlvbigpe3JldHVybiBjeShlKCkpfSxkZWxldGUgdC5saW5lWDAsdC5saW5lRW5kQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gY3kocigpKX0sZGVsZXRlIHQubGluZVgxLHQubGluZUlubmVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIGN5KGkoKSl9LGRlbGV0ZSB0LmxpbmVZMCx0LmxpbmVPdXRlclJhZGl1cz1mdW5jdGlvbigpe3JldHVybiBjeShvKCkpfSxkZWxldGUgdC5saW5lWTEsdC5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKGZ5KHQpKTpuKCkuX2N1cnZlfSx0fWZ1bmN0aW9uIGh5KHQsbil7cmV0dXJuWyhuPStuKSpNYXRoLmNvcyh0LT1NYXRoLlBJLzIpLG4qTWF0aC5zaW4odCldfXV5LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYVN0YXJ0KCl9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5hcmVhRW5kKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX2N1cnZlLnBvaW50KG4qTWF0aC5zaW4odCksbiotTWF0aC5jb3ModCkpfX07dmFyIGR5PUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBweSh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gdnkodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIGd5KHQpe3ZhciBuPXB5LGU9dnkscj10eSxpPW55LG89bnVsbDtmdW5jdGlvbiBhKCl7dmFyIGEsdT1keS5jYWxsKGFyZ3VtZW50cyksZj1uLmFwcGx5KHRoaXMsdSksYz1lLmFwcGx5KHRoaXMsdSk7aWYob3x8KG89YT1HaSgpKSx0KG8sK3IuYXBwbHkodGhpcywodVswXT1mLHUpKSwraS5hcHBseSh0aGlzLHUpLCtyLmFwcGx5KHRoaXMsKHVbMF09Yyx1KSksK2kuYXBwbHkodGhpcyx1KSksYSlyZXR1cm4gbz1udWxsLGErIiJ8fG51bGx9cmV0dXJuIGEuc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsYSk6bn0sYS50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxhKTplfSxhLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6cn0sYS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOml9LGEuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1udWxsPT10P251bGw6dCxhKTpvfSxhfWZ1bmN0aW9uIHl5KHQsbixlLHIsaSl7dC5tb3ZlVG8obixlKSx0LmJlemllckN1cnZlVG8obj0obityKS8yLGUsbixpLHIsaSl9ZnVuY3Rpb24gX3kodCxuLGUscixpKXt0Lm1vdmVUbyhuLGUpLHQuYmV6aWVyQ3VydmVUbyhuLGU9KGUraSkvMixyLGUscixpKX1mdW5jdGlvbiBieSh0LG4sZSxyLGkpe3ZhciBvPWh5KG4sZSksYT1oeShuLGU9KGUraSkvMiksdT1oeShyLGUpLGY9aHkocixpKTt0Lm1vdmVUbyhvWzBdLG9bMV0pLHQuYmV6aWVyQ3VydmVUbyhhWzBdLGFbMV0sdVswXSx1WzFdLGZbMF0sZlsxXSl9dmFyIG15PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vSWcpO3QubW92ZVRvKGUsMCksdC5hcmMoMCwwLGUsMCxqZyl9fSx4eT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuLzUpLzI7dC5tb3ZlVG8oLTMqZSwtZSksdC5saW5lVG8oLWUsLWUpLHQubGluZVRvKC1lLC0zKmUpLHQubGluZVRvKGUsLTMqZSksdC5saW5lVG8oZSwtZSksdC5saW5lVG8oMyplLC1lKSx0LmxpbmVUbygzKmUsZSksdC5saW5lVG8oZSxlKSx0LmxpbmVUbyhlLDMqZSksdC5saW5lVG8oLWUsMyplKSx0LmxpbmVUbygtZSxlKSx0LmxpbmVUbygtMyplLGUpLHQuY2xvc2VQYXRoKCl9fSx3eT1NYXRoLnNxcnQoMS8zKSxNeT0yKnd5LEF5PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vTXkpLHI9ZSp3eTt0Lm1vdmVUbygwLC1lKSx0LmxpbmVUbyhyLDApLHQubGluZVRvKDAsZSksdC5saW5lVG8oLXIsMCksdC5jbG9zZVBhdGgoKX19LFR5PU1hdGguc2luKElnLzEwKS9NYXRoLnNpbig3KklnLzEwKSxOeT1NYXRoLnNpbihqZy8xMCkqVHksU3k9LU1hdGguY29zKGpnLzEwKSpUeSxFeT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydCguODkwODEzMDkxNTI5Mjg1MipuKSxyPU55KmUsaT1TeSplO3QubW92ZVRvKDAsLWUpLHQubGluZVRvKHIsaSk7Zm9yKHZhciBvPTE7bzw1Oysrbyl7dmFyIGE9amcqby81LHU9TWF0aC5jb3MoYSksZj1NYXRoLnNpbihhKTt0LmxpbmVUbyhmKmUsLXUqZSksdC5saW5lVG8odSpyLWYqaSxmKnIrdSppKX10LmNsb3NlUGF0aCgpfX0sa3k9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobikscj0tZS8yO3QucmVjdChyLHIsZSxlKX19LEN5PU1hdGguc3FydCgzKSxQeT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPS1NYXRoLnNxcnQobi8oMypDeSkpO3QubW92ZVRvKDAsMiplKSx0LmxpbmVUbygtQ3kqZSwtZSksdC5saW5lVG8oQ3kqZSwtZSksdC5jbG9zZVBhdGgoKX19LHp5PU1hdGguc3FydCgzKS8yLFJ5PTEvTWF0aC5zcXJ0KDEyKSxMeT0zKihSeS8yKzEpLER5PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vTHkpLHI9ZS8yLGk9ZSpSeSxvPXIsYT1lKlJ5K2UsdT0tbyxmPWE7dC5tb3ZlVG8ocixpKSx0LmxpbmVUbyhvLGEpLHQubGluZVRvKHUsZiksdC5saW5lVG8oLS41KnItenkqaSx6eSpyKy0uNSppKSx0LmxpbmVUbygtLjUqby16eSphLHp5Km8rLS41KmEpLHQubGluZVRvKC0uNSp1LXp5KmYsenkqdSstLjUqZiksdC5saW5lVG8oLS41KnIrenkqaSwtLjUqaS16eSpyKSx0LmxpbmVUbygtLjUqbyt6eSphLC0uNSphLXp5Km8pLHQubGluZVRvKC0uNSp1K3p5KmYsLS41KmYtenkqdSksdC5jbG9zZVBhdGgoKX19LFV5PVtteSx4eSxBeSxreSxFeSxQeSxEeV07ZnVuY3Rpb24gcXkoKXt9ZnVuY3Rpb24gT3kodCxuLGUpe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbygoMip0Ll94MCt0Ll94MSkvMywoMip0Ll95MCt0Ll95MSkvMywodC5feDArMip0Ll94MSkvMywodC5feTArMip0Ll95MSkvMywodC5feDArNCp0Ll94MStuKS82LCh0Ll95MCs0KnQuX3kxK2UpLzYpfWZ1bmN0aW9uIFl5KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBCeSh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gRnkodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEl5KHQsbil7dGhpcy5fYmFzaXM9bmV3IFl5KHQpLHRoaXMuX2JldGE9bn1ZeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAzOk95KHRoaXMsdGhpcy5feDEsdGhpcy5feTEpO2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2NvbnRleHQubGluZVRvKCg1KnRoaXMuX3gwK3RoaXMuX3gxKS82LCg1KnRoaXMuX3kwK3RoaXMuX3kxKS82KTtkZWZhdWx0Ok95KHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW59fSxCeS5wcm90b3R5cGU9e2FyZWFTdGFydDpxeSxhcmVhRW5kOnF5LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MisyKnRoaXMuX3gzKS8zLCh0aGlzLl95MisyKnRoaXMuX3kzKS8zKSx0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMrMip0aGlzLl94MikvMywodGhpcy5feTMrMip0aGlzLl95MikvMyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95MiksdGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCl9fSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gyPXQsdGhpcy5feTI9bjticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDQ9dCx0aGlzLl95ND1uLHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYsKHRoaXMuX3kwKzQqdGhpcy5feTErbikvNik7YnJlYWs7ZGVmYXVsdDpPeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sRnkucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7dmFyIGU9KHRoaXMuX3gwKzQqdGhpcy5feDErdCkvNixyPSh0aGlzLl95MCs0KnRoaXMuX3kxK24pLzY7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyhlLHIpOnRoaXMuX2NvbnRleHQubW92ZVRvKGUscik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpPeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sSXkucHJvdG90eXBlPXtsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PVtdLHRoaXMuX3k9W10sdGhpcy5fYmFzaXMubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl94LG49dGhpcy5feSxlPXQubGVuZ3RoLTE7aWYoZT4wKWZvcih2YXIgcixpPXRbMF0sbz1uWzBdLGE9dFtlXS1pLHU9bltlXS1vLGY9LTE7KytmPD1lOylyPWYvZSx0aGlzLl9iYXNpcy5wb2ludCh0aGlzLl9iZXRhKnRbZl0rKDEtdGhpcy5fYmV0YSkqKGkrciphKSx0aGlzLl9iZXRhKm5bZl0rKDEtdGhpcy5fYmV0YSkqKG8rcip1KSk7dGhpcy5feD10aGlzLl95PW51bGwsdGhpcy5fYmFzaXMubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtuKX19O3ZhciBIeT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIDE9PT1uP25ldyBZeSh0KTpuZXcgSXkodCxuKX1yZXR1cm4gZS5iZXRhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjg1KTtmdW5jdGlvbiBqeSh0LG4sZSl7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHQuX3gxK3QuX2sqKHQuX3gyLXQuX3gwKSx0Ll95MSt0Ll9rKih0Ll95Mi10Ll95MCksdC5feDIrdC5fayoodC5feDEtbiksdC5feTIrdC5fayoodC5feTEtZSksdC5feDIsdC5feTIpfWZ1bmN0aW9uIFh5KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1YeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6ankodGhpcyx0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX3gxPXQsdGhpcy5feTE9bjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0Omp5KHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgR3k9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuZXcgWHkodCxuKX1yZXR1cm4gZS50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oMCk7ZnVuY3Rpb24gVnkodCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1uKS82fVZ5LnByb3RvdHlwZT17YXJlYVN0YXJ0OnF5LGFyZWFFbmQ6cXksbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQ9dCx0aGlzLl95ND1uKTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl94NT10LHRoaXMuX3k1PW47YnJlYWs7ZGVmYXVsdDpqeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyICR5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFZ5KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFd5KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1XeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpqeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIFp5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFd5KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFF5KHQsbixlKXt2YXIgcj10Ll94MSxpPXQuX3kxLG89dC5feDIsYT10Ll95MjtpZih0Ll9sMDFfYT5GZyl7dmFyIHU9Mip0Ll9sMDFfMmErMyp0Ll9sMDFfYSp0Ll9sMTJfYSt0Ll9sMTJfMmEsZj0zKnQuX2wwMV9hKih0Ll9sMDFfYSt0Ll9sMTJfYSk7cj0ocip1LXQuX3gwKnQuX2wxMl8yYSt0Ll94Mip0Ll9sMDFfMmEpL2YsaT0oaSp1LXQuX3kwKnQuX2wxMl8yYSt0Ll95Mip0Ll9sMDFfMmEpL2Z9aWYodC5fbDIzX2E+Rmcpe3ZhciBjPTIqdC5fbDIzXzJhKzMqdC5fbDIzX2EqdC5fbDEyX2ErdC5fbDEyXzJhLHM9Myp0Ll9sMjNfYSoodC5fbDIzX2ErdC5fbDEyX2EpO289KG8qYyt0Ll94MSp0Ll9sMjNfMmEtbip0Ll9sMTJfMmEpL3MsYT0oYSpjK3QuX3kxKnQuX2wyM18yYS1lKnQuX2wxMl8yYSkvc310Ll9jb250ZXh0LmJlemllckN1cnZlVG8ocixpLG8sYSx0Ll94Mix0Ll95Mil9ZnVuY3Rpb24gSnkodCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9bn1KeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95Mil9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe2lmKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7dmFyIGU9dGhpcy5feDItdCxyPXRoaXMuX3kyLW47dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhlKmUrcipyLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0OlF5KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIEt5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgSnkodCxuKTpuZXcgWHkodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiB0Xyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1ufXRfLnByb3RvdHlwZT17YXJlYVN0YXJ0OnF5LGFyZWFFbmQ6cXksbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtpZih0PSt0LG49K24sdGhpcy5fcG9pbnQpe3ZhciBlPXRoaXMuX3gyLXQscj10aGlzLl95Mi1uO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coZSplK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9bik7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1uO2JyZWFrO2RlZmF1bHQ6UXkodGhpcyx0LG4pfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgbl89ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuP25ldyB0Xyh0LG4pOm5ldyBWeSh0LDApfXJldHVybiBlLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjUpO2Z1bmN0aW9uIGVfKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPW59ZV8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7aWYodD0rdCxuPStuLHRoaXMuX3BvaW50KXt2YXIgZT10aGlzLl94Mi10LHI9dGhpcy5feTItbjt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KGUqZStyKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0OlF5KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIHJfPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgZV8odCxuKTpuZXcgV3kodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiBpXyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gb18odCl7cmV0dXJuIHQ8MD8tMToxfWZ1bmN0aW9uIGFfKHQsbixlKXt2YXIgcj10Ll94MS10Ll94MCxpPW4tdC5feDEsbz0odC5feTEtdC5feTApLyhyfHxpPDAmJi0wKSxhPShlLXQuX3kxKS8oaXx8cjwwJiYtMCksdT0obyppK2EqcikvKHIraSk7cmV0dXJuKG9fKG8pK29fKGEpKSpNYXRoLm1pbihNYXRoLmFicyhvKSxNYXRoLmFicyhhKSwuNSpNYXRoLmFicyh1KSl8fDB9ZnVuY3Rpb24gdV8odCxuKXt2YXIgZT10Ll94MS10Ll94MDtyZXR1cm4gZT8oMyoodC5feTEtdC5feTApL2UtbikvMjpufWZ1bmN0aW9uIGZfKHQsbixlKXt2YXIgcj10Ll94MCxpPXQuX3kwLG89dC5feDEsYT10Ll95MSx1PShvLXIpLzM7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHIrdSxpK3UqbixvLXUsYS11KmUsbyxhKX1mdW5jdGlvbiBjXyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gc18odCl7dGhpcy5fY29udGV4dD1uZXcgbF8odCl9ZnVuY3Rpb24gbF8odCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIGhfKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBkXyh0KXt2YXIgbixlLHI9dC5sZW5ndGgtMSxpPW5ldyBBcnJheShyKSxvPW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShyKTtmb3IoaVswXT0wLG9bMF09MixhWzBdPXRbMF0rMip0WzFdLG49MTtuPHItMTsrK24paVtuXT0xLG9bbl09NCxhW25dPTQqdFtuXSsyKnRbbisxXTtmb3IoaVtyLTFdPTIsb1tyLTFdPTcsYVtyLTFdPTgqdFtyLTFdK3Rbcl0sbj0xO248cjsrK24pZT1pW25dL29bbi0xXSxvW25dLT1lLGFbbl0tPWUqYVtuLTFdO2ZvcihpW3ItMV09YVtyLTFdL29bci0xXSxuPXItMjtuPj0wOy0tbilpW25dPShhW25dLWlbbisxXSkvb1tuXTtmb3Iob1tyLTFdPSh0W3JdK2lbci0xXSkvMixuPTA7bjxyLTE7KytuKW9bbl09Mip0W24rMV0taVtuKzFdO3JldHVybltpLG9dfWZ1bmN0aW9uIHBfKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX3Q9bn1mdW5jdGlvbiB2Xyh0LG4pe2lmKChpPXQubGVuZ3RoKT4xKWZvcih2YXIgZSxyLGksbz0xLGE9dFtuWzBdXSx1PWEubGVuZ3RoO288aTsrK28pZm9yKHI9YSxhPXRbbltvXV0sZT0wO2U8dTsrK2UpYVtlXVsxXSs9YVtlXVswXT1pc05hTihyW2VdWzFdKT9yW2VdWzBdOnJbZV1bMV19ZnVuY3Rpb24gZ18odCl7Zm9yKHZhciBuPXQubGVuZ3RoLGU9bmV3IEFycmF5KG4pOy0tbj49MDspZVtuXT1uO3JldHVybiBlfWZ1bmN0aW9uIHlfKHQsbil7cmV0dXJuIHRbbl19ZnVuY3Rpb24gX18odCl7dmFyIG49dC5tYXAoYl8pO3JldHVybiBnXyh0KS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5bdF0tbltlXX0pfWZ1bmN0aW9uIGJfKHQpe2Zvcih2YXIgbixlPTAscj0tMSxpPXQubGVuZ3RoOysrcjxpOykobj0rdFtyXVsxXSkmJihlKz1uKTtyZXR1cm4gZX1mdW5jdGlvbiBtXyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24geF8odCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gd18odCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gTV8oKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBBXyh0KXt0LlU9dC5DPXQuTD10LlI9dC5QPXQuTj1udWxsfWZ1bmN0aW9uIFRfKHQsbil7dmFyIGU9bixyPW4uUixpPWUuVTtpP2kuTD09PWU/aS5MPXI6aS5SPXI6dC5fPXIsci5VPWksZS5VPXIsZS5SPXIuTCxlLlImJihlLlIuVT1lKSxyLkw9ZX1mdW5jdGlvbiBOXyh0LG4pe3ZhciBlPW4scj1uLkwsaT1lLlU7aT9pLkw9PT1lP2kuTD1yOmkuUj1yOnQuXz1yLHIuVT1pLGUuVT1yLGUuTD1yLlIsZS5MJiYoZS5MLlU9ZSksci5SPWV9ZnVuY3Rpb24gU18odCl7Zm9yKDt0Lkw7KXQ9dC5MO3JldHVybiB0fWZ1bmN0aW9uIEVfKHQsbixlLHIpe3ZhciBpPVtudWxsLG51bGxdLG89Sl8ucHVzaChpKS0xO3JldHVybiBpLmxlZnQ9dCxpLnJpZ2h0PW4sZSYmQ18oaSx0LG4sZSksciYmQ18oaSxuLHQsciksWl9bdC5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksWl9bbi5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksaX1mdW5jdGlvbiBrXyh0LG4sZSl7dmFyIHI9W24sZV07cmV0dXJuIHIubGVmdD10LHJ9ZnVuY3Rpb24gQ18odCxuLGUscil7dFswXXx8dFsxXT90LmxlZnQ9PT1lP3RbMV09cjp0WzBdPXI6KHRbMF09cix0LmxlZnQ9bix0LnJpZ2h0PWUpfWZ1bmN0aW9uIFBfKHQsbixlLHIsaSl7dmFyIG8sYT10WzBdLHU9dFsxXSxmPWFbMF0sYz1hWzFdLHM9MCxsPTEsaD11WzBdLWYsZD11WzFdLWM7aWYobz1uLWYsaHx8IShvPjApKXtpZihvLz1oLGg8MCl7aWYobzxzKXJldHVybjtvPGwmJihsPW8pfWVsc2UgaWYoaD4wKXtpZihvPmwpcmV0dXJuO28+cyYmKHM9byl9aWYobz1yLWYsaHx8IShvPDApKXtpZihvLz1oLGg8MCl7aWYobz5sKXJldHVybjtvPnMmJihzPW8pfWVsc2UgaWYoaD4wKXtpZihvPHMpcmV0dXJuO288bCYmKGw9byl9aWYobz1lLWMsZHx8IShvPjApKXtpZihvLz1kLGQ8MCl7aWYobzxzKXJldHVybjtvPGwmJihsPW8pfWVsc2UgaWYoZD4wKXtpZihvPmwpcmV0dXJuO28+cyYmKHM9byl9aWYobz1pLWMsZHx8IShvPDApKXtpZihvLz1kLGQ8MCl7aWYobz5sKXJldHVybjtvPnMmJihzPW8pfWVsc2UgaWYoZD4wKXtpZihvPHMpcmV0dXJuO288bCYmKGw9byl9cmV0dXJuIShzPjB8fGw8MSl8fChzPjAmJih0WzBdPVtmK3MqaCxjK3MqZF0pLGw8MSYmKHRbMV09W2YrbCpoLGMrbCpkXSksITApfX19fX1mdW5jdGlvbiB6Xyh0LG4sZSxyLGkpe3ZhciBvPXRbMV07aWYobylyZXR1cm4hMDt2YXIgYSx1LGY9dFswXSxjPXQubGVmdCxzPXQucmlnaHQsbD1jWzBdLGg9Y1sxXSxkPXNbMF0scD1zWzFdLHY9KGwrZCkvMixnPShoK3ApLzI7aWYocD09PWgpe2lmKHY8bnx8dj49cilyZXR1cm47aWYobD5kKXtpZihmKXtpZihmWzFdPj1pKXJldHVybn1lbHNlIGY9W3YsZV07bz1bdixpXX1lbHNle2lmKGYpe2lmKGZbMV08ZSlyZXR1cm59ZWxzZSBmPVt2LGldO289W3YsZV19fWVsc2UgaWYodT1nLShhPShsLWQpLyhwLWgpKSp2LGE8LTF8fGE+MSlpZihsPmQpe2lmKGYpe2lmKGZbMV0+PWkpcmV0dXJufWVsc2UgZj1bKGUtdSkvYSxlXTtvPVsoaS11KS9hLGldfWVsc2V7aWYoZil7aWYoZlsxXTxlKXJldHVybn1lbHNlIGY9WyhpLXUpL2EsaV07bz1bKGUtdSkvYSxlXX1lbHNlIGlmKGg8cCl7aWYoZil7aWYoZlswXT49cilyZXR1cm59ZWxzZSBmPVtuLGEqbit1XTtvPVtyLGEqcit1XX1lbHNle2lmKGYpe2lmKGZbMF08bilyZXR1cm59ZWxzZSBmPVtyLGEqcit1XTtvPVtuLGEqbit1XX1yZXR1cm4gdFswXT1mLHRbMV09bywhMH1mdW5jdGlvbiBSXyh0LG4pe3ZhciBlPXQuc2l0ZSxyPW4ubGVmdCxpPW4ucmlnaHQ7cmV0dXJuIGU9PT1pJiYoaT1yLHI9ZSksaT9NYXRoLmF0YW4yKGlbMV0tclsxXSxpWzBdLXJbMF0pOihlPT09cj8ocj1uWzFdLGk9blswXSk6KHI9blswXSxpPW5bMV0pLE1hdGguYXRhbjIoclswXS1pWzBdLGlbMV0tclsxXSkpfWZ1bmN0aW9uIExfKHQsbil7cmV0dXJuIG5bKyhuLmxlZnQhPT10LnNpdGUpXX1mdW5jdGlvbiBEXyh0LG4pe3JldHVybiBuWysobi5sZWZ0PT09dC5zaXRlKV19aV8ucHJvdG90eXBlPXthcmVhU3RhcnQ6cXksYXJlYUVuZDpxeSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCl9LHBvaW50OmZ1bmN0aW9uKHQsbil7dD0rdCxuPStuLHRoaXMuX3BvaW50P3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6KHRoaXMuX3BvaW50PTEsdGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKSl9fSxjXy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT10aGlzLl90MD1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLHRoaXMuX3kxKTticmVhaztjYXNlIDM6Zl8odGhpcyx0aGlzLl90MCx1Xyh0aGlzLHRoaXMuX3QwKSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3ZhciBlPU5hTjtpZihuPStuLCh0PSt0KSE9PXRoaXMuX3gxfHxuIT09dGhpcy5feTEpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsZl8odGhpcyx1Xyh0aGlzLGU9YV8odGhpcyx0LG4pKSxlKTticmVhaztkZWZhdWx0OmZfKHRoaXMsdGhpcy5fdDAsZT1hXyh0aGlzLHQsbikpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bix0aGlzLl90MD1lfX19LChzXy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShjXy5wcm90b3R5cGUpKS5wb2ludD1mdW5jdGlvbih0LG4pe2NfLnByb3RvdHlwZS5wb2ludC5jYWxsKHRoaXMsbix0KX0sbF8ucHJvdG90eXBlPXttb3ZlVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0Lm1vdmVUbyhuLHQpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxsaW5lVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0LmxpbmVUbyhuLHQpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8obix0LHIsZSxvLGkpfX0saF8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxuPXRoaXMuX3ksZT10Lmxlbmd0aDtpZihlKWlmKHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odFswXSxuWzBdKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0WzBdLG5bMF0pLDI9PT1lKXRoaXMuX2NvbnRleHQubGluZVRvKHRbMV0sblsxXSk7ZWxzZSBmb3IodmFyIHI9ZF8odCksaT1kXyhuKSxvPTAsYT0xO2E8ZTsrK28sKythKXRoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhyWzBdW29dLGlbMF1bb10sclsxXVtvXSxpWzFdW29dLHRbYV0sblthXSk7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09ZSkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmUsdGhpcy5feD10aGlzLl95PW51bGx9LHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5feC5wdXNoKCt0KSx0aGlzLl95LnB1c2goK24pfX0scF8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD10aGlzLl95PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MDx0aGlzLl90JiZ0aGlzLl90PDEmJjI9PT10aGlzLl9wb2ludCYmdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCx0aGlzLl95KSwodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT49MCYmKHRoaXMuX3Q9MS10aGlzLl90LHRoaXMuX2xpbmU9MS10aGlzLl9saW5lKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OmlmKHRoaXMuX3Q8PTApdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCxuKSx0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pO2Vsc2V7dmFyIGU9dGhpcy5feCooMS10aGlzLl90KSt0KnRoaXMuX3Q7dGhpcy5fY29udGV4dC5saW5lVG8oZSx0aGlzLl95KSx0aGlzLl9jb250ZXh0LmxpbmVUbyhlLG4pfX10aGlzLl94PXQsdGhpcy5feT1ufX0sTV8ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNXyxpbnNlcnQ6ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk7aWYodCl7aWYobi5QPXQsbi5OPXQuTix0Lk4mJih0Lk4uUD1uKSx0Lk49bix0LlIpe2Zvcih0PXQuUjt0Lkw7KXQ9dC5MO3QuTD1ufWVsc2UgdC5SPW47ZT10fWVsc2UgdGhpcy5fPyh0PVNfKHRoaXMuXyksbi5QPW51bGwsbi5OPXQsdC5QPXQuTD1uLGU9dCk6KG4uUD1uLk49bnVsbCx0aGlzLl89bixlPW51bGwpO2ZvcihuLkw9bi5SPW51bGwsbi5VPWUsbi5DPSEwLHQ9bjtlJiZlLkM7KWU9PT0ocj1lLlUpLkw/KGk9ci5SKSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5SJiYoVF8odGhpcyxlKSxlPSh0PWUpLlUpLGUuQz0hMSxyLkM9ITAsTl8odGhpcyxyKSk6KGk9ci5MKSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5MJiYoTl8odGhpcyxlKSxlPSh0PWUpLlUpLGUuQz0hMSxyLkM9ITAsVF8odGhpcyxyKSksZT10LlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbih0KXt0Lk4mJih0Lk4uUD10LlApLHQuUCYmKHQuUC5OPXQuTiksdC5OPXQuUD1udWxsO3ZhciBuLGUscixpPXQuVSxvPXQuTCxhPXQuUjtpZihlPW8/YT9TXyhhKTpvOmEsaT9pLkw9PT10P2kuTD1lOmkuUj1lOnRoaXMuXz1lLG8mJmE/KHI9ZS5DLGUuQz10LkMsZS5MPW8sby5VPWUsZSE9PWE/KGk9ZS5VLGUuVT10LlUsdD1lLlIsaS5MPXQsZS5SPWEsYS5VPWUpOihlLlU9aSxpPWUsdD1lLlIpKToocj10LkMsdD1lKSx0JiYodC5VPWkpLCFyKWlmKHQmJnQuQyl0LkM9ITE7ZWxzZXtkb3tpZih0PT09dGhpcy5fKWJyZWFrO2lmKHQ9PT1pLkwpe2lmKChuPWkuUikuQyYmKG4uQz0hMSxpLkM9ITAsVF8odGhpcyxpKSxuPWkuUiksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5SJiZuLlIuQ3x8KG4uTC5DPSExLG4uQz0hMCxOXyh0aGlzLG4pLG49aS5SKSxuLkM9aS5DLGkuQz1uLlIuQz0hMSxUXyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfX1lbHNlIGlmKChuPWkuTCkuQyYmKG4uQz0hMSxpLkM9ITAsTl8odGhpcyxpKSxuPWkuTCksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5MJiZuLkwuQ3x8KG4uUi5DPSExLG4uQz0hMCxUXyh0aGlzLG4pLG49aS5MKSxuLkM9aS5DLGkuQz1uLkwuQz0hMSxOXyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfW4uQz0hMCx0PWksaT1pLlV9d2hpbGUoIXQuQyk7dCYmKHQuQz0hMSl9fX07dmFyIFVfLHFfPVtdO2Z1bmN0aW9uIE9fKCl7QV8odGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uIFlfKHQpe3ZhciBuPXQuUCxlPXQuTjtpZihuJiZlKXt2YXIgcj1uLnNpdGUsaT10LnNpdGUsbz1lLnNpdGU7aWYociE9PW8pe3ZhciBhPWlbMF0sdT1pWzFdLGY9clswXS1hLGM9clsxXS11LHM9b1swXS1hLGw9b1sxXS11LGg9MiooZipsLWMqcyk7aWYoIShoPj0tdGIpKXt2YXIgZD1mKmYrYypjLHA9cypzK2wqbCx2PShsKmQtYypwKS9oLGc9KGYqcC1zKmQpL2gseT1xXy5wb3AoKXx8bmV3IE9fO3kuYXJjPXQseS5zaXRlPWkseS54PXYrYSx5Lnk9KHkuY3k9Zyt1KStNYXRoLnNxcnQodip2K2cqZyksdC5jaXJjbGU9eTtmb3IodmFyIF89bnVsbCxiPVFfLl87YjspaWYoeS55PGIueXx8eS55PT09Yi55JiZ5Lng8PWIueCl7aWYoIWIuTCl7Xz1iLlA7YnJlYWt9Yj1iLkx9ZWxzZXtpZighYi5SKXtfPWI7YnJlYWt9Yj1iLlJ9UV8uaW5zZXJ0KF8seSksX3x8KFVfPXkpfX19fWZ1bmN0aW9uIEJfKHQpe3ZhciBuPXQuY2lyY2xlO24mJihuLlB8fChVXz1uLk4pLFFfLnJlbW92ZShuKSxxXy5wdXNoKG4pLEFfKG4pLHQuY2lyY2xlPW51bGwpfXZhciBGXz1bXTtmdW5jdGlvbiBJXygpe0FfKHRoaXMpLHRoaXMuZWRnZT10aGlzLnNpdGU9dGhpcy5jaXJjbGU9bnVsbH1mdW5jdGlvbiBIXyh0KXt2YXIgbj1GXy5wb3AoKXx8bmV3IElfO3JldHVybiBuLnNpdGU9dCxufWZ1bmN0aW9uIGpfKHQpe0JfKHQpLFdfLnJlbW92ZSh0KSxGXy5wdXNoKHQpLEFfKHQpfWZ1bmN0aW9uIFhfKHQpe3ZhciBuPXQuY2lyY2xlLGU9bi54LHI9bi5jeSxpPVtlLHJdLG89dC5QLGE9dC5OLHU9W3RdO2pfKHQpO2Zvcih2YXIgZj1vO2YuY2lyY2xlJiZNYXRoLmFicyhlLWYuY2lyY2xlLngpPEtfJiZNYXRoLmFicyhyLWYuY2lyY2xlLmN5KTxLXzspbz1mLlAsdS51bnNoaWZ0KGYpLGpfKGYpLGY9bzt1LnVuc2hpZnQoZiksQl8oZik7Zm9yKHZhciBjPWE7Yy5jaXJjbGUmJk1hdGguYWJzKGUtYy5jaXJjbGUueCk8S18mJk1hdGguYWJzKHItYy5jaXJjbGUuY3kpPEtfOylhPWMuTix1LnB1c2goYyksal8oYyksYz1hO3UucHVzaChjKSxCXyhjKTt2YXIgcyxsPXUubGVuZ3RoO2ZvcihzPTE7czxsOysrcyljPXVbc10sZj11W3MtMV0sQ18oYy5lZGdlLGYuc2l0ZSxjLnNpdGUsaSk7Zj11WzBdLChjPXVbbC0xXSkuZWRnZT1FXyhmLnNpdGUsYy5zaXRlLG51bGwsaSksWV8oZiksWV8oYyl9ZnVuY3Rpb24gR18odCl7Zm9yKHZhciBuLGUscixpLG89dFswXSxhPXRbMV0sdT1XXy5fO3U7KWlmKChyPVZfKHUsYSktbyk+S18pdT11Lkw7ZWxzZXtpZighKChpPW8tJF8odSxhKSk+S18pKXtyPi1LXz8obj11LlAsZT11KTppPi1LXz8obj11LGU9dS5OKTpuPWU9dTticmVha31pZighdS5SKXtuPXU7YnJlYWt9dT11LlJ9IWZ1bmN0aW9uKHQpe1pfW3QuaW5kZXhdPXtzaXRlOnQsaGFsZmVkZ2VzOltdfX0odCk7dmFyIGY9SF8odCk7aWYoV18uaW5zZXJ0KG4sZiksbnx8ZSl7aWYobj09PWUpcmV0dXJuIEJfKG4pLGU9SF8obi5zaXRlKSxXXy5pbnNlcnQoZixlKSxmLmVkZ2U9ZS5lZGdlPUVfKG4uc2l0ZSxmLnNpdGUpLFlfKG4pLHZvaWQgWV8oZSk7aWYoZSl7Ql8obiksQl8oZSk7dmFyIGM9bi5zaXRlLHM9Y1swXSxsPWNbMV0saD10WzBdLXMsZD10WzFdLWwscD1lLnNpdGUsdj1wWzBdLXMsZz1wWzFdLWwseT0yKihoKmctZCp2KSxfPWgqaCtkKmQsYj12KnYrZypnLG09WyhnKl8tZCpiKS95K3MsKGgqYi12Kl8pL3krbF07Q18oZS5lZGdlLGMscCxtKSxmLmVkZ2U9RV8oYyx0LG51bGwsbSksZS5lZGdlPUVfKHQscCxudWxsLG0pLFlfKG4pLFlfKGUpfWVsc2UgZi5lZGdlPUVfKG4uc2l0ZSxmLnNpdGUpfX1mdW5jdGlvbiBWXyh0LG4pe3ZhciBlPXQuc2l0ZSxyPWVbMF0saT1lWzFdLG89aS1uO2lmKCFvKXJldHVybiByO3ZhciBhPXQuUDtpZighYSlyZXR1cm4tMS8wO3ZhciB1PShlPWEuc2l0ZSlbMF0sZj1lWzFdLGM9Zi1uO2lmKCFjKXJldHVybiB1O3ZhciBzPXUtcixsPTEvby0xL2MsaD1zL2M7cmV0dXJuIGw/KC1oK01hdGguc3FydChoKmgtMipsKihzKnMvKC0yKmMpLWYrYy8yK2ktby8yKSkpL2wrcjoocit1KS8yfWZ1bmN0aW9uICRfKHQsbil7dmFyIGU9dC5OO2lmKGUpcmV0dXJuIFZfKGUsbik7dmFyIHI9dC5zaXRlO3JldHVybiByWzFdPT09bj9yWzBdOjEvMH12YXIgV18sWl8sUV8sSl8sS189MWUtNix0Yj0xZS0xMjtmdW5jdGlvbiBuYih0LG4pe3JldHVybiBuWzFdLXRbMV18fG5bMF0tdFswXX1mdW5jdGlvbiBlYih0LG4pe3ZhciBlLHIsaSxvPXQuc29ydChuYikucG9wKCk7Zm9yKEpfPVtdLFpfPW5ldyBBcnJheSh0Lmxlbmd0aCksV189bmV3IE1fLFFfPW5ldyBNXzs7KWlmKGk9VV8sbyYmKCFpfHxvWzFdPGkueXx8b1sxXT09PWkueSYmb1swXTxpLngpKW9bMF09PT1lJiZvWzFdPT09cnx8KEdfKG8pLGU9b1swXSxyPW9bMV0pLG89dC5wb3AoKTtlbHNle2lmKCFpKWJyZWFrO1hfKGkuYXJjKX1pZihmdW5jdGlvbigpe2Zvcih2YXIgdCxuLGUscixpPTAsbz1aXy5sZW5ndGg7aTxvOysraSlpZigodD1aX1tpXSkmJihyPShuPXQuaGFsZmVkZ2VzKS5sZW5ndGgpKXt2YXIgYT1uZXcgQXJyYXkociksdT1uZXcgQXJyYXkocik7Zm9yKGU9MDtlPHI7KytlKWFbZV09ZSx1W2VdPVJfKHQsSl9bbltlXV0pO2ZvcihhLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gdVtuXS11W3RdfSksZT0wO2U8cjsrK2UpdVtlXT1uW2FbZV1dO2ZvcihlPTA7ZTxyOysrZSluW2VdPXVbZV19fSgpLG4pe3ZhciBhPStuWzBdWzBdLHU9K25bMF1bMV0sZj0rblsxXVswXSxjPStuWzFdWzFdOyFmdW5jdGlvbih0LG4sZSxyKXtmb3IodmFyIGksbz1KXy5sZW5ndGg7by0tOyl6XyhpPUpfW29dLHQsbixlLHIpJiZQXyhpLHQsbixlLHIpJiYoTWF0aC5hYnMoaVswXVswXS1pWzFdWzBdKT5LX3x8TWF0aC5hYnMoaVswXVsxXS1pWzFdWzFdKT5LXyl8fGRlbGV0ZSBKX1tvXX0oYSx1LGYsYyksZnVuY3Rpb24odCxuLGUscil7dmFyIGksbyxhLHUsZixjLHMsbCxoLGQscCx2LGc9Wl8ubGVuZ3RoLHk9ITA7Zm9yKGk9MDtpPGc7KytpKWlmKG89Wl9baV0pe2ZvcihhPW8uc2l0ZSx1PShmPW8uaGFsZmVkZ2VzKS5sZW5ndGg7dS0tOylKX1tmW3VdXXx8Zi5zcGxpY2UodSwxKTtmb3IodT0wLGM9Zi5sZW5ndGg7dTxjOylwPShkPURfKG8sSl9bZlt1XV0pKVswXSx2PWRbMV0sbD0ocz1MXyhvLEpfW2ZbKyt1JWNdXSkpWzBdLGg9c1sxXSwoTWF0aC5hYnMocC1sKT5LX3x8TWF0aC5hYnModi1oKT5LXykmJihmLnNwbGljZSh1LDAsSl8ucHVzaChrXyhhLGQsTWF0aC5hYnMocC10KTxLXyYmci12PktfP1t0LE1hdGguYWJzKGwtdCk8S18/aDpyXTpNYXRoLmFicyh2LXIpPEtfJiZlLXA+S18/W01hdGguYWJzKGgtcik8S18/bDplLHJdOk1hdGguYWJzKHAtZSk8S18mJnYtbj5LXz9bZSxNYXRoLmFicyhsLWUpPEtfP2g6bl06TWF0aC5hYnModi1uKTxLXyYmcC10PktfP1tNYXRoLmFicyhoLW4pPEtfP2w6dCxuXTpudWxsKSktMSksKytjKTtjJiYoeT0hMSl9aWYoeSl7dmFyIF8sYixtLHg9MS8wO2ZvcihpPTAseT1udWxsO2k8ZzsrK2kpKG89Wl9baV0pJiYobT0oXz0oYT1vLnNpdGUpWzBdLXQpKl8rKGI9YVsxXS1uKSpiKTx4JiYoeD1tLHk9byk7aWYoeSl7dmFyIHc9W3Qsbl0sTT1bdCxyXSxBPVtlLHJdLFQ9W2Usbl07eS5oYWxmZWRnZXMucHVzaChKXy5wdXNoKGtfKGE9eS5zaXRlLHcsTSkpLTEsSl8ucHVzaChrXyhhLE0sQSkpLTEsSl8ucHVzaChrXyhhLEEsVCkpLTEsSl8ucHVzaChrXyhhLFQsdykpLTEpfX1mb3IoaT0wO2k8ZzsrK2kpKG89Wl9baV0pJiYoby5oYWxmZWRnZXMubGVuZ3RofHxkZWxldGUgWl9baV0pfShhLHUsZixjKX10aGlzLmVkZ2VzPUpfLHRoaXMuY2VsbHM9Wl8sV189UV89Sl89Wl89bnVsbH1mdW5jdGlvbiByYih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gaWIodCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy50cmFuc2Zvcm09ZX1mdW5jdGlvbiBvYih0LG4sZSl7dGhpcy5rPXQsdGhpcy54PW4sdGhpcy55PWV9ZWIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjplYixwb2x5Z29uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMubWFwKGZ1bmN0aW9uKG4pe3ZhciBlPW4uaGFsZmVkZ2VzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gTF8obix0W2VdKX0pO3JldHVybiBlLmRhdGE9bi5zaXRlLmRhdGEsZX0pfSx0cmlhbmdsZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXSxuPXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLHIpe2lmKG89KGk9ZS5oYWxmZWRnZXMpLmxlbmd0aClmb3IodmFyIGksbyxhLHUsZixjLHM9ZS5zaXRlLGw9LTEsaD1uW2lbby0xXV0sZD1oLmxlZnQ9PT1zP2gucmlnaHQ6aC5sZWZ0OysrbDxvOylhPWQsZD0oaD1uW2lbbF1dKS5sZWZ0PT09cz9oLnJpZ2h0OmgubGVmdCxhJiZkJiZyPGEuaW5kZXgmJnI8ZC5pbmRleCYmKGY9YSxjPWQsKCh1PXMpWzBdLWNbMF0pKihmWzFdLXVbMV0pLSh1WzBdLWZbMF0pKihjWzFdLXVbMV0pPDApJiZ0LnB1c2goW3MuZGF0YSxhLmRhdGEsZC5kYXRhXSl9KSx0fSxsaW5rczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2VzLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdC5yaWdodH0pLm1hcChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOnQubGVmdC5kYXRhLHRhcmdldDp0LnJpZ2h0LmRhdGF9fSl9LGZpbmQ6ZnVuY3Rpb24odCxuLGUpe2Zvcih2YXIgcixpLG89dGhpcyxhPW8uX2ZvdW5kfHwwLHU9by5jZWxscy5sZW5ndGg7IShpPW8uY2VsbHNbYV0pOylpZigrK2E+PXUpcmV0dXJuIG51bGw7dmFyIGY9dC1pLnNpdGVbMF0sYz1uLWkuc2l0ZVsxXSxzPWYqZitjKmM7ZG97aT1vLmNlbGxzW3I9YV0sYT1udWxsLGkuaGFsZmVkZ2VzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHI9by5lZGdlc1tlXSx1PXIubGVmdDtpZih1IT09aS5zaXRlJiZ1fHwodT1yLnJpZ2h0KSl7dmFyIGY9dC11WzBdLGM9bi11WzFdLGw9ZipmK2MqYztsPHMmJihzPWwsYT11LmluZGV4KX19KX13aGlsZShudWxsIT09YSk7cmV0dXJuIG8uX2ZvdW5kPXIsbnVsbD09ZXx8czw9ZSplP2kuc2l0ZTpudWxsfX0sb2IucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpvYixzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQ/dGhpczpuZXcgb2IodGhpcy5rKnQsdGhpcy54LHRoaXMueSl9LHRyYW5zbGF0ZTpmdW5jdGlvbih0LG4pe3JldHVybiAwPT09dCYwPT09bj90aGlzOm5ldyBvYih0aGlzLmssdGhpcy54K3RoaXMuayp0LHRoaXMueSt0aGlzLmsqbil9LGFwcGx5OmZ1bmN0aW9uKHQpe3JldHVyblt0WzBdKnRoaXMuayt0aGlzLngsdFsxXSp0aGlzLmsrdGhpcy55XX0sYXBwbHlYOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuayt0aGlzLnh9LGFwcGx5WTpmdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLmsrdGhpcy55fSxpbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuWyh0WzBdLXRoaXMueCkvdGhpcy5rLCh0WzFdLXRoaXMueSkvdGhpcy5rXX0saW52ZXJ0WDpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLngpL3RoaXMua30saW52ZXJ0WTpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLnkpL3RoaXMua30scmVzY2FsZVg6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weSgpLmRvbWFpbih0LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCx0aGlzKS5tYXAodC5pbnZlcnQsdCkpfSxyZXNjYWxlWTpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCkuZG9tYWluKHQucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLHRoaXMpLm1hcCh0LmludmVydCx0KSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMueCsiLCIrdGhpcy55KyIpIHNjYWxlKCIrdGhpcy5rKyIpIn19O3ZhciBhYj1uZXcgb2IoMSwwLDApO2Z1bmN0aW9uIHViKHQpe3JldHVybiB0Ll9fem9vbXx8YWJ9ZnVuY3Rpb24gZmIoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIGNiKCl7dC5ldmVudC5wcmV2ZW50RGVmYXVsdCgpLHQuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gc2IoKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gbGIoKXt2YXIgdCxuLGU9dGhpcztyZXR1cm4gZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ/KHQ9KGU9ZS5vd25lclNWR0VsZW1lbnR8fGUpLndpZHRoLmJhc2VWYWwudmFsdWUsbj1lLmhlaWdodC5iYXNlVmFsLnZhbHVlKToodD1lLmNsaWVudFdpZHRoLG49ZS5jbGllbnRIZWlnaHQpLFtbMCwwXSxbdCxuXV19ZnVuY3Rpb24gaGIoKXtyZXR1cm4gdGhpcy5fX3pvb218fGFifWZ1bmN0aW9uIGRiKCl7cmV0dXJuLXQuZXZlbnQuZGVsdGFZKih0LmV2ZW50LmRlbHRhTW9kZT8xMjA6MSkvNTAwfWZ1bmN0aW9uIHBiKCl7cmV0dXJuIm9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIHZiKHQsbixlKXt2YXIgcj10LmludmVydFgoblswXVswXSktZVswXVswXSxpPXQuaW52ZXJ0WChuWzFdWzBdKS1lWzFdWzBdLG89dC5pbnZlcnRZKG5bMF1bMV0pLWVbMF1bMV0sYT10LmludmVydFkoblsxXVsxXSktZVsxXVsxXTtyZXR1cm4gdC50cmFuc2xhdGUoaT5yPyhyK2kpLzI6TWF0aC5taW4oMCxyKXx8TWF0aC5tYXgoMCxpKSxhPm8/KG8rYSkvMjpNYXRoLm1pbigwLG8pfHxNYXRoLm1heCgwLGEpKX11Yi5wcm90b3R5cGU9b2IucHJvdG90eXBlLHQudmVyc2lvbj0iNS43LjAiLHQuYmlzZWN0PWksdC5iaXNlY3RSaWdodD1pLHQuYmlzZWN0TGVmdD1vLHQuYXNjZW5kaW5nPW4sdC5iaXNlY3Rvcj1lLHQuY3Jvc3M9ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbyx1LGY9dC5sZW5ndGgsYz1uLmxlbmd0aCxzPW5ldyBBcnJheShmKmMpO2ZvcihudWxsPT1lJiYoZT1hKSxyPW89MDtyPGY7KytyKWZvcih1PXRbcl0saT0wO2k8YzsrK2ksKytvKXNbb109ZSh1LG5baV0pO3JldHVybiBzfSx0LmRlc2NlbmRpbmc9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbjx0Py0xOm4+dD8xOm4+PXQ/MDpOYU59LHQuZGV2aWF0aW9uPWMsdC5leHRlbnQ9cyx0Lmhpc3RvZ3JhbT1mdW5jdGlvbigpe3ZhciB0PXYsbj1zLGU9TTtmdW5jdGlvbiByKHIpe3ZhciBvLGEsdT1yLmxlbmd0aCxmPW5ldyBBcnJheSh1KTtmb3Iobz0wO288dTsrK28pZltvXT10KHJbb10sbyxyKTt2YXIgYz1uKGYpLHM9Y1swXSxsPWNbMV0saD1lKGYscyxsKTtBcnJheS5pc0FycmF5KGgpfHwoaD13KHMsbCxoKSxoPWcoTWF0aC5jZWlsKHMvaCkqaCxsLGgpKTtmb3IodmFyIGQ9aC5sZW5ndGg7aFswXTw9czspaC5zaGlmdCgpLC0tZDtmb3IoO2hbZC0xXT5sOyloLnBvcCgpLC0tZDt2YXIgcCx2PW5ldyBBcnJheShkKzEpO2ZvcihvPTA7bzw9ZDsrK28pKHA9dltvXT1bXSkueDA9bz4wP2hbby0xXTpzLHAueDE9bzxkP2hbb106bDtmb3Iobz0wO288dTsrK28pczw9KGE9ZltvXSkmJmE8PWwmJnZbaShoLGEsMCxkKV0ucHVzaChyW29dKTtyZXR1cm4gdn1yZXR1cm4gci52YWx1ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnAobikscik6dH0sci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpwKFt0WzBdLHRbMV1dKSxyKTpufSxyLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP3AoaC5jYWxsKHQpKTpwKHQpLHIpOmV9LHJ9LHQudGhyZXNob2xkRnJlZWRtYW5EaWFjb25pcz1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9ZC5jYWxsKHQsdSkuc29ydChuKSxNYXRoLmNlaWwoKHItZSkvKDIqKEEodCwuNzUpLUEodCwuMjUpKSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSx0LnRocmVzaG9sZFNjb3R0PWZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gTWF0aC5jZWlsKChlLW4pLygzLjUqYyh0KSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSx0LnRocmVzaG9sZFN0dXJnZXM9TSx0Lm1heD1ULHQubWVhbj1mdW5jdGlvbih0LG4pe3ZhciBlLHI9dC5sZW5ndGgsaT1yLG89LTEsYT0wO2lmKG51bGw9PW4pZm9yKDsrK288cjspaXNOYU4oZT11KHRbb10pKT8tLWk6YSs9ZTtlbHNlIGZvcig7KytvPHI7KWlzTmFOKGU9dShuKHRbb10sbyx0KSkpPy0taTphKz1lO2lmKGkpcmV0dXJuIGEvaX0sdC5tZWRpYW49ZnVuY3Rpb24odCxlKXt2YXIgcixpPXQubGVuZ3RoLG89LTEsYT1bXTtpZihudWxsPT1lKWZvcig7KytvPGk7KWlzTmFOKHI9dSh0W29dKSl8fGEucHVzaChyKTtlbHNlIGZvcig7KytvPGk7KWlzTmFOKHI9dShlKHRbb10sbyx0KSkpfHxhLnB1c2gocik7cmV0dXJuIEEoYS5zb3J0KG4pLC41KX0sdC5tZXJnZT1OLHQubWluPVMsdC5wYWlycz1mdW5jdGlvbih0LG4pe251bGw9PW4mJihuPWEpO2Zvcih2YXIgZT0wLHI9dC5sZW5ndGgtMSxpPXRbMF0sbz1uZXcgQXJyYXkocjwwPzA6cik7ZTxyOylvW2VdPW4oaSxpPXRbKytlXSk7cmV0dXJuIG99LHQucGVybXV0ZT1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKTtlLS07KXJbZV09dFtuW2VdXTtyZXR1cm4gcn0sdC5xdWFudGlsZT1BLHQucmFuZ2U9Zyx0LnNjYW49ZnVuY3Rpb24odCxlKXtpZihyPXQubGVuZ3RoKXt2YXIgcixpLG89MCxhPTAsdT10W2FdO2ZvcihudWxsPT1lJiYoZT1uKTsrK288cjspKGUoaT10W29dLHUpPDB8fDAhPT1lKHUsdSkpJiYodT1pLGE9byk7cmV0dXJuIDA9PT1lKHUsdSk/YTp2b2lkIDB9fSx0LnNodWZmbGU9ZnVuY3Rpb24odCxuLGUpe2Zvcih2YXIgcixpLG89KG51bGw9PWU/dC5sZW5ndGg6ZSktKG49bnVsbD09bj8wOituKTtvOylpPU1hdGgucmFuZG9tKCkqby0tfDAscj10W28rbl0sdFtvK25dPXRbaStuXSx0W2krbl09cjtyZXR1cm4gdH0sdC5zdW09ZnVuY3Rpb24odCxuKXt2YXIgZSxyPXQubGVuZ3RoLGk9LTEsbz0wO2lmKG51bGw9PW4pZm9yKDsrK2k8cjspKGU9K3RbaV0pJiYobys9ZSk7ZWxzZSBmb3IoOysraTxyOykoZT0rbih0W2ldLGksdCkpJiYobys9ZSk7cmV0dXJuIG99LHQudGlja3M9bSx0LnRpY2tJbmNyZW1lbnQ9eCx0LnRpY2tTdGVwPXcsdC50cmFuc3Bvc2U9RSx0LnZhcmlhbmNlPWYsdC56aXA9ZnVuY3Rpb24oKXtyZXR1cm4gRShhcmd1bWVudHMpfSx0LmF4aXNUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIEIoeix0KX0sdC5heGlzUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIEIoUix0KX0sdC5heGlzQm90dG9tPWZ1bmN0aW9uKHQpe3JldHVybiBCKEwsdCl9LHQuYXhpc0xlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIEIoRCx0KX0sdC5icnVzaD1mdW5jdGlvbigpe3JldHVybiBSaSh3aSl9LHQuYnJ1c2hYPWZ1bmN0aW9uKCl7cmV0dXJuIFJpKG1pKX0sdC5icnVzaFk9ZnVuY3Rpb24oKXtyZXR1cm4gUmkoeGkpfSx0LmJydXNoU2VsZWN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBuPXQuX19icnVzaDtyZXR1cm4gbj9uLmRpbS5vdXRwdXQobi5zZWxlY3Rpb24pOm51bGx9LHQuY2hvcmQ9ZnVuY3Rpb24oKXt2YXIgdD0wLG49bnVsbCxlPW51bGwscj1udWxsO2Z1bmN0aW9uIGkoaSl7dmFyIG8sYSx1LGYsYyxzLGw9aS5sZW5ndGgsaD1bXSxkPWcobCkscD1bXSx2PVtdLHk9di5ncm91cHM9bmV3IEFycmF5KGwpLF89bmV3IEFycmF5KGwqbCk7Zm9yKG89MCxjPS0xOysrYzxsOyl7Zm9yKGE9MCxzPS0xOysrczxsOylhKz1pW2NdW3NdO2gucHVzaChhKSxwLnB1c2goZyhsKSksbys9YX1mb3IobiYmZC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oaFt0XSxoW2VdKX0pLGUmJnAuZm9yRWFjaChmdW5jdGlvbih0LG4pe3Quc29ydChmdW5jdGlvbih0LHIpe3JldHVybiBlKGlbbl1bdF0saVtuXVtyXSl9KX0pLGY9KG89WWkoMCxPaS10KmwpL28pP3Q6T2kvbCxhPTAsYz0tMTsrK2M8bDspe2Zvcih1PWEscz0tMTsrK3M8bDspe3ZhciBiPWRbY10sbT1wW2JdW3NdLHg9aVtiXVttXSx3PWEsTT1hKz14Km87X1ttKmwrYl09e2luZGV4OmIsc3ViaW5kZXg6bSxzdGFydEFuZ2xlOncsZW5kQW5nbGU6TSx2YWx1ZTp4fX15W2JdPXtpbmRleDpiLHN0YXJ0QW5nbGU6dSxlbmRBbmdsZTphLHZhbHVlOmhbYl19LGErPWZ9Zm9yKGM9LTE7KytjPGw7KWZvcihzPWMtMTsrK3M8bDspe3ZhciBBPV9bcypsK2NdLFQ9X1tjKmwrc107KEEudmFsdWV8fFQudmFsdWUpJiZ2LnB1c2goQS52YWx1ZTxULnZhbHVlP3tzb3VyY2U6VCx0YXJnZXQ6QX06e3NvdXJjZTpBLHRhcmdldDpUfSl9cmV0dXJuIHI/di5zb3J0KHIpOnZ9cmV0dXJuIGkucGFkQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9WWkoMCxuKSxpKTp0fSxpLnNvcnRHcm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxpKTpufSxpLnNvcnRTdWJncm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxpKTplfSxpLnNvcnRDaG9yZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/cj1udWxsOihuPXQscj1mdW5jdGlvbih0LGUpe3JldHVybiBuKHQuc291cmNlLnZhbHVlK3QudGFyZ2V0LnZhbHVlLGUuc291cmNlLnZhbHVlK2UudGFyZ2V0LnZhbHVlKX0pLl89dCxpKTpyJiZyLl87dmFyIG59LGl9LHQucmliYm9uPWZ1bmN0aW9uKCl7dmFyIHQ9Vmksbj0kaSxlPVdpLHI9WmksaT1RaSxvPW51bGw7ZnVuY3Rpb24gYSgpe3ZhciBhLHU9QmkuY2FsbChhcmd1bWVudHMpLGY9dC5hcHBseSh0aGlzLHUpLGM9bi5hcHBseSh0aGlzLHUpLHM9K2UuYXBwbHkodGhpcywodVswXT1mLHUpKSxsPXIuYXBwbHkodGhpcyx1KS1xaSxoPWkuYXBwbHkodGhpcyx1KS1xaSxkPXMqTGkobCkscD1zKkRpKGwpLHY9K2UuYXBwbHkodGhpcywodVswXT1jLHUpKSxnPXIuYXBwbHkodGhpcyx1KS1xaSx5PWkuYXBwbHkodGhpcyx1KS1xaTtpZihvfHwobz1hPUdpKCkpLG8ubW92ZVRvKGQscCksby5hcmMoMCwwLHMsbCxoKSxsPT09ZyYmaD09PXl8fChvLnF1YWRyYXRpY0N1cnZlVG8oMCwwLHYqTGkoZyksdipEaShnKSksby5hcmMoMCwwLHYsZyx5KSksby5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCxkLHApLG8uY2xvc2VQYXRoKCksYSlyZXR1cm4gbz1udWxsLGErIiJ8fG51bGx9cmV0dXJuIGEucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RmkoK3QpLGEpOmV9LGEuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkZpKCt0KSxhKTpyfSxhLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RmkoK3QpLGEpOml9LGEuc291cmNlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4sYSk6dH0sYS50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxhKTpufSxhLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bnVsbD09dD9udWxsOnQsYSk6b30sYX0sdC5uZXN0PWZ1bmN0aW9uKCl7dmFyIHQsbixlLHI9W10saT1bXTtmdW5jdGlvbiBvKGUsaSxhLHUpe2lmKGk+PXIubGVuZ3RoKXJldHVybiBudWxsIT10JiZlLnNvcnQodCksbnVsbCE9bj9uKGUpOmU7Zm9yKHZhciBmLGMscyxsPS0xLGg9ZS5sZW5ndGgsZD1yW2krK10scD1LaSgpLHY9YSgpOysrbDxoOykocz1wLmdldChmPWQoYz1lW2xdKSsiIikpP3MucHVzaChjKTpwLnNldChmLFtjXSk7cmV0dXJuIHAuZWFjaChmdW5jdGlvbih0LG4pe3UodixuLG8odCxpLGEsdSkpfSksdn1yZXR1cm4gZT17b2JqZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBvKHQsMCx0byxubyl9LG1hcDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LDAsZW8scm8pfSxlbnRyaWVzOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiB0KGUsbyl7aWYoKytvPnIubGVuZ3RoKXJldHVybiBlO3ZhciBhLHU9aVtvLTFdO3JldHVybiBudWxsIT1uJiZvPj1yLmxlbmd0aD9hPWUuZW50cmllcygpOihhPVtdLGUuZWFjaChmdW5jdGlvbihuLGUpe2EucHVzaCh7a2V5OmUsdmFsdWVzOnQobixvKX0pfSkpLG51bGwhPXU/YS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIHUodC5rZXksbi5rZXkpfSk6YX0obyh0LDAsZW8scm8pLDApfSxrZXk6ZnVuY3Rpb24odCl7cmV0dXJuIHIucHVzaCh0KSxlfSxzb3J0S2V5czpmdW5jdGlvbih0KXtyZXR1cm4gaVtyLmxlbmd0aC0xXT10LGV9LHNvcnRWYWx1ZXM6ZnVuY3Rpb24obil7cmV0dXJuIHQ9bixlfSxyb2xsdXA6ZnVuY3Rpb24odCl7cmV0dXJuIG49dCxlfX19LHQuc2V0PWFvLHQubWFwPUtpLHQua2V5cz1mdW5jdGlvbih0KXt2YXIgbj1bXTtmb3IodmFyIGUgaW4gdCluLnB1c2goZSk7cmV0dXJuIG59LHQudmFsdWVzPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaCh0W2VdKTtyZXR1cm4gbn0sdC5lbnRyaWVzPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaCh7a2V5OmUsdmFsdWU6dFtlXX0pO3JldHVybiBufSx0LmNvbG9yPXZuLHQucmdiPWJuLHQuaHNsPU1uLHQubGFiPVVuLHQuaGNsPUhuLHQubGNoPWZ1bmN0aW9uKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Jbih0KTpuZXcgam4oZSxuLHQsbnVsbD09cj8xOnIpfSx0LmdyYXk9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbmV3IHFuKHQsMCwwLG51bGw9PW4/MTpuKX0sdC5jdWJlaGVsaXg9S24sdC5jb250b3Vycz1nbyx0LmNvbnRvdXJEZW5zaXR5PWZ1bmN0aW9uKCl7dmFyIHQ9Ym8sbj1tbyxlPXhvLHI9OTYwLGk9NTAwLG89MjAsYT0yLHU9MypvLGY9cisyKnU+PmEsYz1pKzIqdT4+YSxzPWNvKDIwKTtmdW5jdGlvbiBsKHIpe3ZhciBpPW5ldyBGbG9hdDMyQXJyYXkoZipjKSxsPW5ldyBGbG9hdDMyQXJyYXkoZipjKTtyLmZvckVhY2goZnVuY3Rpb24ocixvLHMpe3ZhciBsPSt0KHIsbyxzKSt1Pj5hLGg9K24ocixvLHMpK3U+PmEsZD0rZShyLG8scyk7bD49MCYmbDxmJiZoPj0wJiZoPGMmJihpW2wraCpmXSs9ZCl9KSx5byh7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOml9LHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6bH0sbz4+YSksX28oe3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTpsfSx7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOml9LG8+PmEpLHlvKHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6aX0se3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTpsfSxvPj5hKSxfbyh7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOmx9LHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6aX0sbz4+YSkseW8oe3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTppfSx7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOmx9LG8+PmEpLF9vKHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6bH0se3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTppfSxvPj5hKTt2YXIgZD1zKGkpO2lmKCFBcnJheS5pc0FycmF5KGQpKXt2YXIgcD1UKGkpO2Q9dygwLHAsZCksKGQ9ZygwLE1hdGguZmxvb3IocC9kKSpkLGQpKS5zaGlmdCgpfXJldHVybiBnbygpLnRocmVzaG9sZHMoZCkuc2l6ZShbZixjXSkoaSkubWFwKGgpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQudmFsdWUqPU1hdGgucG93KDIsLTIqYSksdC5jb29yZGluYXRlcy5mb3JFYWNoKGQpLHR9ZnVuY3Rpb24gZCh0KXt0LmZvckVhY2gocCl9ZnVuY3Rpb24gcCh0KXt0LmZvckVhY2godil9ZnVuY3Rpb24gdih0KXt0WzBdPXRbMF0qTWF0aC5wb3coMixhKS11LHRbMV09dFsxXSpNYXRoLnBvdygyLGEpLXV9ZnVuY3Rpb24geSgpe3JldHVybiBmPXIrMioodT0zKm8pPj5hLGM9aSsyKnU+PmEsbH1yZXR1cm4gbC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Y28oK24pLGwpOnR9LGwueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmNvKCt0KSxsKTpufSxsLndlaWdodD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmNvKCt0KSxsKTplfSxsLnNpemU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW3IsaV07dmFyIG49TWF0aC5jZWlsKHRbMF0pLGU9TWF0aC5jZWlsKHRbMV0pO2lmKCEobj49MHx8bj49MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNpemUiKTtyZXR1cm4gcj1uLGk9ZSx5KCl9LGwuY2VsbFNpemU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIDE8PGE7aWYoISgodD0rdCk+PTEpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjZWxsIHNpemUiKTtyZXR1cm4gYT1NYXRoLmZsb29yKE1hdGgubG9nKHQpL01hdGguTE4yKSx5KCl9LGwudGhyZXNob2xkcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkFycmF5LmlzQXJyYXkodCk/Y28odW8uY2FsbCh0KSk6Y28odCksbCk6c30sbC5iYW5kd2lkdGg9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIE1hdGguc3FydChvKihvKzEpKTtpZighKCh0PSt0KT49MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGJhbmR3aWR0aCIpO3JldHVybiBvPU1hdGgucm91bmQoKE1hdGguc3FydCg0KnQqdCsxKS0xKS8yKSx5KCl9LGx9LHQuZGlzcGF0Y2g9SSx0LmRyYWc9ZnVuY3Rpb24oKXt2YXIgbixlLHIsaSxvPVd0LGE9WnQsdT1RdCxmPUp0LGM9e30scz1JKCJzdGFydCIsImRyYWciLCJlbmQiKSxsPTAsaD0wO2Z1bmN0aW9uIGQodCl7dC5vbigibW91c2Vkb3duLmRyYWciLHApLmZpbHRlcihmKS5vbigidG91Y2hzdGFydC5kcmFnIix5KS5vbigidG91Y2htb3ZlLmRyYWciLF8pLm9uKCJ0b3VjaGVuZC5kcmFnIHRvdWNoY2FuY2VsLmRyYWciLGIpLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCJub25lIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKX1mdW5jdGlvbiBwKCl7aWYoIWkmJm8uYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdT1tKCJtb3VzZSIsYS5hcHBseSh0aGlzLGFyZ3VtZW50cyksRnQsdGhpcyxhcmd1bWVudHMpO3UmJihEdCh0LmV2ZW50LnZpZXcpLm9uKCJtb3VzZW1vdmUuZHJhZyIsdiwhMCkub24oIm1vdXNldXAuZHJhZyIsZywhMCksWHQodC5ldmVudC52aWV3KSxIdCgpLHI9ITEsbj10LmV2ZW50LmNsaWVudFgsZT10LmV2ZW50LmNsaWVudFksdSgic3RhcnQiKSl9fWZ1bmN0aW9uIHYoKXtpZihqdCgpLCFyKXt2YXIgaT10LmV2ZW50LmNsaWVudFgtbixvPXQuZXZlbnQuY2xpZW50WS1lO3I9aSppK28qbz5ofWMubW91c2UoImRyYWciKX1mdW5jdGlvbiBnKCl7RHQodC5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLmRyYWcgbW91c2V1cC5kcmFnIixudWxsKSxHdCh0LmV2ZW50LnZpZXcsciksanQoKSxjLm1vdXNlKCJlbmQiKX1mdW5jdGlvbiB5KCl7aWYoby5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9YS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdT1yLmxlbmd0aDtmb3Iobj0wO248dTsrK24pKGU9bShyW25dLmlkZW50aWZpZXIsaSxJdCx0aGlzLGFyZ3VtZW50cykpJiYoSHQoKSxlKCJzdGFydCIpKX19ZnVuY3Rpb24gXygpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9ci5sZW5ndGg7Zm9yKG49MDtuPGk7KytuKShlPWNbcltuXS5pZGVudGlmaWVyXSkmJihqdCgpLGUoImRyYWciKSl9ZnVuY3Rpb24gYigpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLG89ci5sZW5ndGg7Zm9yKGkmJmNsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpPW51bGx9LDUwMCksbj0wO248bzsrK24pKGU9Y1tyW25dLmlkZW50aWZpZXJdKSYmKEh0KCksZSgiZW5kIikpfWZ1bmN0aW9uIG0obixlLHIsaSxvKXt2YXIgYSxmLGgscD1yKGUsbiksdj1zLmNvcHkoKTtpZihDdChuZXcgJHQoZCwiYmVmb3Jlc3RhcnQiLGEsbixsLHBbMF0scFsxXSwwLDAsdiksZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9KHQuZXZlbnQuc3ViamVjdD1hPXUuYXBwbHkoaSxvKSkmJihmPWEueC1wWzBdfHwwLGg9YS55LXBbMV18fDAsITApfSkpcmV0dXJuIGZ1bmN0aW9uIHQodSl7dmFyIHMsZz1wO3N3aXRjaCh1KXtjYXNlInN0YXJ0IjpjW25dPXQscz1sKys7YnJlYWs7Y2FzZSJlbmQiOmRlbGV0ZSBjW25dLC0tbDtjYXNlImRyYWciOnA9cihlLG4pLHM9bH1DdChuZXcgJHQoZCx1LGEsbixzLHBbMF0rZixwWzFdK2gscFswXS1nWzBdLHBbMV0tZ1sxXSx2KSx2LmFwcGx5LHYsW3UsaSxvXSl9fXJldHVybiBkLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlZ0KCEhdCksZCk6b30sZC5jb250YWluZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWdCh0KSxkKTphfSxkLnN1YmplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWdCh0KSxkKTp1fSxkLnRvdWNoYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlZ0KCEhdCksZCk6Zn0sZC5vbj1mdW5jdGlvbigpe3ZhciB0PXMub24uYXBwbHkocyxhcmd1bWVudHMpO3JldHVybiB0PT09cz9kOnR9LGQuY2xpY2tEaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0odD0rdCkqdCxkKTpNYXRoLnNxcnQoaCl9LGR9LHQuZHJhZ0Rpc2FibGU9WHQsdC5kcmFnRW5hYmxlPUd0LHQuZHN2Rm9ybWF0PUVvLHQuY3N2UGFyc2U9Q28sdC5jc3ZQYXJzZVJvd3M9UG8sdC5jc3ZGb3JtYXQ9em8sdC5jc3ZGb3JtYXRSb3dzPVJvLHQudHN2UGFyc2U9RG8sdC50c3ZQYXJzZVJvd3M9VW8sdC50c3ZGb3JtYXQ9cW8sdC50c3ZGb3JtYXRSb3dzPU9vLHQuZWFzZUxpbmVhcj1mdW5jdGlvbih0KXtyZXR1cm4rdH0sdC5lYXNlUXVhZD1Ecix0LmVhc2VRdWFkSW49ZnVuY3Rpb24odCl7cmV0dXJuIHQqdH0sdC5lYXNlUXVhZE91dD1mdW5jdGlvbih0KXtyZXR1cm4gdCooMi10KX0sdC5lYXNlUXVhZEluT3V0PURyLHQuZWFzZUN1YmljPVVyLHQuZWFzZUN1YmljSW49ZnVuY3Rpb24odCl7cmV0dXJuIHQqdCp0fSx0LmVhc2VDdWJpY091dD1mdW5jdGlvbih0KXtyZXR1cm4tLXQqdCp0KzF9LHQuZWFzZUN1YmljSW5PdXQ9VXIsdC5lYXNlUG9seT1Zcix0LmVhc2VQb2x5SW49cXIsdC5lYXNlUG9seU91dD1Pcix0LmVhc2VQb2x5SW5PdXQ9WXIsdC5lYXNlU2luPUlyLHQuZWFzZVNpbkluPWZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguY29zKHQqRnIpfSx0LmVhc2VTaW5PdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc2luKHQqRnIpfSx0LmVhc2VTaW5Jbk91dD1Jcix0LmVhc2VFeHA9SHIsdC5lYXNlRXhwSW49ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KDIsMTAqdC0xMCl9LHQuZWFzZUV4cE91dD1mdW5jdGlvbih0KXtyZXR1cm4gMS1NYXRoLnBvdygyLC0xMCp0KX0sdC5lYXNlRXhwSW5PdXQ9SHIsdC5lYXNlQ2lyY2xlPWpyLHQuZWFzZUNpcmNsZUluPWZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguc3FydCgxLXQqdCl9LHQuZWFzZUNpcmNsZU91dD1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KDEtIC0tdCp0KX0sdC5lYXNlQ2lyY2xlSW5PdXQ9anIsdC5lYXNlQm91bmNlPW5pLHQuZWFzZUJvdW5jZUluPWZ1bmN0aW9uKHQpe3JldHVybiAxLW5pKDEtdCl9LHQuZWFzZUJvdW5jZU91dD1uaSx0LmVhc2VCb3VuY2VJbk91dD1mdW5jdGlvbih0KXtyZXR1cm4oKHQqPTIpPD0xPzEtbmkoMS10KTpuaSh0LTEpKzEpLzJ9LHQuZWFzZUJhY2s9aWksdC5lYXNlQmFja0luPWVpLHQuZWFzZUJhY2tPdXQ9cmksdC5lYXNlQmFja0luT3V0PWlpLHQuZWFzZUVsYXN0aWM9dWksdC5lYXNlRWxhc3RpY0luPWFpLHQuZWFzZUVsYXN0aWNPdXQ9dWksdC5lYXNlRWxhc3RpY0luT3V0PWZpLHQuYmxvYj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oWW8pfSx0LmJ1ZmZlcj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oQm8pfSx0LmRzdj1mdW5jdGlvbih0LG4sZSxyKXszPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT12b2lkIDApO3ZhciBpPUVvKHQpO3JldHVybiBJbyhuLGUpLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIGkucGFyc2UodCxyKX0pfSx0LmNzdj1qbyx0LnRzdj1Ybyx0LmltYWdlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUscil7dmFyIGk9bmV3IEltYWdlO2Zvcih2YXIgbyBpbiBuKWlbb109bltvXTtpLm9uZXJyb3I9cixpLm9ubG9hZD1mdW5jdGlvbigpe2UoaSl9LGkuc3JjPXR9KX0sdC5qc29uPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZldGNoKHQsbikudGhlbihHbyl9LHQudGV4dD1Jbyx0LnhtbD0kbyx0Lmh0bWw9V28sdC5zdmc9Wm8sdC5mb3JjZUNlbnRlcj1mdW5jdGlvbih0LG4pe3ZhciBlO2Z1bmN0aW9uIHIoKXt2YXIgcixpLG89ZS5sZW5ndGgsYT0wLHU9MDtmb3Iocj0wO3I8bzsrK3IpYSs9KGk9ZVtyXSkueCx1Kz1pLnk7Zm9yKGE9YS9vLXQsdT11L28tbixyPTA7cjxvOysrcikoaT1lW3JdKS54LT1hLGkueS09dX1yZXR1cm4gbnVsbD09dCYmKHQ9MCksbnVsbD09biYmKG49MCksci5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2U9dH0sci54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStuLHIpOnR9LHIueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdCxyKTpufSxyfSx0LmZvcmNlQ29sbGlkZT1mdW5jdGlvbih0KXt2YXIgbixlLHI9MSxpPTE7ZnVuY3Rpb24gbygpe2Zvcih2YXIgdCxvLHUsZixjLHMsbCxoPW4ubGVuZ3RoLGQ9MDtkPGk7KytkKWZvcihvPXJhKG4sdWEsZmEpLnZpc2l0QWZ0ZXIoYSksdD0wO3Q8aDsrK3QpdT1uW3RdLHM9ZVt1LmluZGV4XSxsPXMqcyxmPXUueCt1LnZ4LGM9dS55K3Uudnksby52aXNpdChwKTtmdW5jdGlvbiBwKHQsbixlLGksbyl7dmFyIGE9dC5kYXRhLGg9dC5yLGQ9cytoO2lmKCFhKXJldHVybiBuPmYrZHx8aTxmLWR8fGU+YytkfHxvPGMtZDtpZihhLmluZGV4PnUuaW5kZXgpe3ZhciBwPWYtYS54LWEudngsdj1jLWEueS1hLnZ5LGc9cCpwK3YqdjtnPGQqZCYmKDA9PT1wJiYoZys9KHA9Sm8oKSkqcCksMD09PXYmJihnKz0odj1KbygpKSp2KSxnPShkLShnPU1hdGguc3FydChnKSkpL2cqcix1LnZ4Kz0ocCo9ZykqKGQ9KGgqPWgpLyhsK2gpKSx1LnZ5Kz0odio9ZykqZCxhLnZ4LT1wKihkPTEtZCksYS52eS09dipkKX19fWZ1bmN0aW9uIGEodCl7aWYodC5kYXRhKXJldHVybiB0LnI9ZVt0LmRhdGEuaW5kZXhdO2Zvcih2YXIgbj10LnI9MDtuPDQ7KytuKXRbbl0mJnRbbl0ucj50LnImJih0LnI9dFtuXS5yKX1mdW5jdGlvbiB1KCl7aWYobil7dmFyIHIsaSxvPW4ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShvKSxyPTA7cjxvOysrcilpPW5bcl0sZVtpLmluZGV4XT0rdChpLHIsbil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbyhudWxsPT10PzE6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10LHUoKX0sby5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LG8pOml9LG8uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3Qsbyk6cn0sby5yYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRbygrbiksdSgpLG8pOnR9LG99LHQuZm9yY2VMaW5rPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG8sYT1jYSx1PWZ1bmN0aW9uKHQpe3JldHVybiAxL01hdGgubWluKGlbdC5zb3VyY2UuaW5kZXhdLGlbdC50YXJnZXQuaW5kZXhdKX0sZj1RbygzMCksYz0xO2Z1bmN0aW9uIHMocil7Zm9yKHZhciBpPTAsYT10Lmxlbmd0aDtpPGM7KytpKWZvcih2YXIgdSxmLHMsbCxoLGQscCx2PTA7djxhOysrdilmPSh1PXRbdl0pLnNvdXJjZSxsPShzPXUudGFyZ2V0KS54K3MudngtZi54LWYudnh8fEpvKCksaD1zLnkrcy52eS1mLnktZi52eXx8Sm8oKSxsKj1kPSgoZD1NYXRoLnNxcnQobCpsK2gqaCkpLWVbdl0pL2QqcipuW3ZdLGgqPWQscy52eC09bCoocD1vW3ZdKSxzLnZ5LT1oKnAsZi52eCs9bCoocD0xLXApLGYudnkrPWgqcH1mdW5jdGlvbiBsKCl7aWYocil7dmFyIHUsZixjPXIubGVuZ3RoLHM9dC5sZW5ndGgsbD1LaShyLGEpO2Zvcih1PTAsaT1uZXcgQXJyYXkoYyk7dTxzOysrdSkoZj10W3VdKS5pbmRleD11LCJvYmplY3QiIT10eXBlb2YgZi5zb3VyY2UmJihmLnNvdXJjZT1zYShsLGYuc291cmNlKSksIm9iamVjdCIhPXR5cGVvZiBmLnRhcmdldCYmKGYudGFyZ2V0PXNhKGwsZi50YXJnZXQpKSxpW2Yuc291cmNlLmluZGV4XT0oaVtmLnNvdXJjZS5pbmRleF18fDApKzEsaVtmLnRhcmdldC5pbmRleF09KGlbZi50YXJnZXQuaW5kZXhdfHwwKSsxO2Zvcih1PTAsbz1uZXcgQXJyYXkocyk7dTxzOysrdSlmPXRbdV0sb1t1XT1pW2Yuc291cmNlLmluZGV4XS8oaVtmLnNvdXJjZS5pbmRleF0raVtmLnRhcmdldC5pbmRleF0pO249bmV3IEFycmF5KHMpLGgoKSxlPW5ldyBBcnJheShzKSxkKCl9fWZ1bmN0aW9uIGgoKXtpZihyKWZvcih2YXIgZT0wLGk9dC5sZW5ndGg7ZTxpOysrZSluW2VdPSt1KHRbZV0sZSx0KX1mdW5jdGlvbiBkKCl7aWYocilmb3IodmFyIG49MCxpPXQubGVuZ3RoO248aTsrK24pZVtuXT0rZih0W25dLG4sdCl9cmV0dXJuIG51bGw9PXQmJih0PVtdKSxzLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7cj10LGwoKX0scy5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGwoKSxzKTp0fSxzLmlkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQscyk6YX0scy5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSt0LHMpOmN9LHMuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRbygrdCksaCgpLHMpOnV9LHMuZGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRbygrdCksZCgpLHMpOmZ9LHN9LHQuZm9yY2VNYW55Qm9keT1mdW5jdGlvbigpe3ZhciB0LG4sZSxyLGk9UW8oLTMwKSxvPTEsYT0xLzAsdT0uODE7ZnVuY3Rpb24gZihyKXt2YXIgaSxvPXQubGVuZ3RoLGE9cmEodCxsYSxoYSkudmlzaXRBZnRlcihzKTtmb3IoZT1yLGk9MDtpPG87KytpKW49dFtpXSxhLnZpc2l0KGwpfWZ1bmN0aW9uIGMoKXtpZih0KXt2YXIgbixlLG89dC5sZW5ndGg7Zm9yKHI9bmV3IEFycmF5KG8pLG49MDtuPG87KytuKWU9dFtuXSxyW2UuaW5kZXhdPStpKGUsbix0KX19ZnVuY3Rpb24gcyh0KXt2YXIgbixlLGksbyxhLHU9MCxmPTA7aWYodC5sZW5ndGgpe2ZvcihpPW89YT0wO2E8NDsrK2EpKG49dFthXSkmJihlPU1hdGguYWJzKG4udmFsdWUpKSYmKHUrPW4udmFsdWUsZis9ZSxpKz1lKm4ueCxvKz1lKm4ueSk7dC54PWkvZix0Lnk9by9mfWVsc2V7KG49dCkueD1uLmRhdGEueCxuLnk9bi5kYXRhLnk7ZG97dSs9cltuLmRhdGEuaW5kZXhdfXdoaWxlKG49bi5uZXh0KX10LnZhbHVlPXV9ZnVuY3Rpb24gbCh0LGksZixjKXtpZighdC52YWx1ZSlyZXR1cm4hMDt2YXIgcz10Lngtbi54LGw9dC55LW4ueSxoPWMtaSxkPXMqcytsKmw7aWYoaCpoL3U8ZClyZXR1cm4gZDxhJiYoMD09PXMmJihkKz0ocz1KbygpKSpzKSwwPT09bCYmKGQrPShsPUpvKCkpKmwpLGQ8byYmKGQ9TWF0aC5zcXJ0KG8qZCkpLG4udngrPXMqdC52YWx1ZSplL2Qsbi52eSs9bCp0LnZhbHVlKmUvZCksITA7aWYoISh0Lmxlbmd0aHx8ZD49YSkpeyh0LmRhdGEhPT1ufHx0Lm5leHQpJiYoMD09PXMmJihkKz0ocz1KbygpKSpzKSwwPT09bCYmKGQrPShsPUpvKCkpKmwpLGQ8byYmKGQ9TWF0aC5zcXJ0KG8qZCkpKTtkb3t0LmRhdGEhPT1uJiYoaD1yW3QuZGF0YS5pbmRleF0qZS9kLG4udngrPXMqaCxuLnZ5Kz1sKmgpfXdoaWxlKHQ9dC5uZXh0KX19cmV0dXJuIGYuaW5pdGlhbGl6ZT1mdW5jdGlvbihuKXt0PW4sYygpfSxmLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGMoKSxmKTppfSxmLmRpc3RhbmNlTWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQqdCxmKTpNYXRoLnNxcnQobyl9LGYuZGlzdGFuY2VNYXg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCp0LGYpOk1hdGguc3FydChhKX0sZi50aGV0YT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10KnQsZik6TWF0aC5zcXJ0KHUpfSxmfSx0LmZvcmNlUmFkaWFsPWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG8sYT1RbyguMSk7ZnVuY3Rpb24gdSh0KXtmb3IodmFyIGE9MCx1PXIubGVuZ3RoO2E8dTsrK2Epe3ZhciBmPXJbYV0sYz1mLngtbnx8MWUtNixzPWYueS1lfHwxZS02LGw9TWF0aC5zcXJ0KGMqYytzKnMpLGg9KG9bYV0tbCkqaVthXSp0L2w7Zi52eCs9YypoLGYudnkrPXMqaH19ZnVuY3Rpb24gZigpe2lmKHIpe3ZhciBuLGU9ci5sZW5ndGg7Zm9yKGk9bmV3IEFycmF5KGUpLG89bmV3IEFycmF5KGUpLG49MDtuPGU7KytuKW9bbl09K3QocltuXSxuLHIpLGlbbl09aXNOYU4ob1tuXSk/MDorYShyW25dLG4scil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbygrdCkpLG51bGw9PW4mJihuPTApLG51bGw9PWUmJihlPTApLHUuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtyPXQsZigpfSx1LnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGYoKSx1KTphfSx1LnJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlFvKCtuKSxmKCksdSk6dH0sdS54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0LHUpOm59LHUueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCx1KTplfSx1fSx0LmZvcmNlU2ltdWxhdGlvbj1mdW5jdGlvbih0KXt2YXIgbixlPTEscj0uMDAxLGk9MS1NYXRoLnBvdyhyLDEvMzAwKSxvPTAsYT0uNix1PUtpKCksZj11cihzKSxjPUkoInRpY2siLCJlbmQiKTtmdW5jdGlvbiBzKCl7bCgpLGMuY2FsbCgidGljayIsbiksZTxyJiYoZi5zdG9wKCksYy5jYWxsKCJlbmQiLG4pKX1mdW5jdGlvbiBsKCl7dmFyIG4scixmPXQubGVuZ3RoO2ZvcihlKz0oby1lKSppLHUuZWFjaChmdW5jdGlvbih0KXt0KGUpfSksbj0wO248ZjsrK24pbnVsbD09KHI9dFtuXSkuZng/ci54Kz1yLnZ4Kj1hOihyLng9ci5meCxyLnZ4PTApLG51bGw9PXIuZnk/ci55Kz1yLnZ5Kj1hOihyLnk9ci5meSxyLnZ5PTApfWZ1bmN0aW9uIGgoKXtmb3IodmFyIG4sZT0wLHI9dC5sZW5ndGg7ZTxyOysrZSl7aWYoKG49dFtlXSkuaW5kZXg9ZSxpc05hTihuLngpfHxpc05hTihuLnkpKXt2YXIgaT1kYSpNYXRoLnNxcnQoZSksbz1lKnBhO24ueD1pKk1hdGguY29zKG8pLG4ueT1pKk1hdGguc2luKG8pfShpc05hTihuLnZ4KXx8aXNOYU4obi52eSkpJiYobi52eD1uLnZ5PTApfX1mdW5jdGlvbiBkKG4pe3JldHVybiBuLmluaXRpYWxpemUmJm4uaW5pdGlhbGl6ZSh0KSxufXJldHVybiBudWxsPT10JiYodD1bXSksaCgpLG49e3RpY2s6bCxyZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIGYucmVzdGFydChzKSxufSxzdG9wOmZ1bmN0aW9uKCl7cmV0dXJuIGYuc3RvcCgpLG59LG5vZGVzOmZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsaCgpLHUuZWFjaChkKSxuKTp0fSxhbHBoYTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCxuKTplfSxhbHBoYU1pbjpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxuKTpyfSxhbHBoYURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LG4pOitpfSxhbHBoYVRhcmdldDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0rdCxuKTpvfSx2ZWxvY2l0eURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPTEtdCxuKToxLWF9LGZvcmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8obnVsbD09ZT91LnJlbW92ZSh0KTp1LnNldCh0LGQoZSkpLG4pOnUuZ2V0KHQpfSxmaW5kOmZ1bmN0aW9uKG4sZSxyKXt2YXIgaSxvLGEsdSxmLGM9MCxzPXQubGVuZ3RoO2ZvcihudWxsPT1yP3I9MS8wOnIqPXIsYz0wO2M8czsrK2MpKGE9KGk9bi0odT10W2NdKS54KSppKyhvPWUtdS55KSpvKTxyJiYoZj11LHI9YSk7cmV0dXJuIGZ9LG9uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8oYy5vbih0LGUpLG4pOmMub24odCl9fX0sdC5mb3JjZVg9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGk9UW8oLjEpO2Z1bmN0aW9uIG8odCl7Zm9yKHZhciBpLG89MCxhPW4ubGVuZ3RoO288YTsrK28pKGk9bltvXSkudngrPShyW29dLWkueCkqZVtvXSp0fWZ1bmN0aW9uIGEoKXtpZihuKXt2YXIgbyxhPW4ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShhKSxyPW5ldyBBcnJheShhKSxvPTA7bzxhOysrbyllW29dPWlzTmFOKHJbb109K3QobltvXSxvLG4pKT8wOitpKG5bb10sbyxuKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVFvKG51bGw9PXQ/MDordCkpLG8uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtuPXQsYSgpfSxvLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGEoKSxvKTppfSxvLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRbygrbiksYSgpLG8pOnR9LG99LHQuZm9yY2VZPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpPVFvKC4xKTtmdW5jdGlvbiBvKHQpe2Zvcih2YXIgaSxvPTAsYT1uLmxlbmd0aDtvPGE7KytvKShpPW5bb10pLnZ5Kz0ocltvXS1pLnkpKmVbb10qdH1mdW5jdGlvbiBhKCl7aWYobil7dmFyIG8sYT1uLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkoYSkscj1uZXcgQXJyYXkoYSksbz0wO288YTsrK28pZVtvXT1pc05hTihyW29dPSt0KG5bb10sbyxuKSk/MDoraShuW29dLG8sbil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbyhudWxsPT10PzA6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10LGEoKX0sby5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFvKCt0KSxhKCksbyk6aX0sby55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UW8oK24pLGEoKSxvKTp0fSxvfSx0LmZvcm1hdERlZmF1bHRMb2NhbGU9U2EsdC5mb3JtYXRMb2NhbGU9TmEsdC5mb3JtYXRTcGVjaWZpZXI9YmEsdC5wcmVjaXNpb25GaXhlZD1FYSx0LnByZWNpc2lvblByZWZpeD1rYSx0LnByZWNpc2lvblJvdW5kPUNhLHQuZ2VvQXJlYT1mdW5jdGlvbih0KXtyZXR1cm4geXUucmVzZXQoKSxzdSh0LF91KSwyKnl1fSx0Lmdlb0JvdW5kcz1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvLGEsdTtpZihSdT16dT0tKEN1PVB1PTEvMCksT3U9W10sc3UodCxyZiksZT1PdS5sZW5ndGgpe2ZvcihPdS5zb3J0KGRmKSxuPTEsbz1bcj1PdVswXV07bjxlOysrbilwZihyLChpPU91W25dKVswXSl8fHBmKHIsaVsxXSk/KGhmKHJbMF0saVsxXSk+aGYoclswXSxyWzFdKSYmKHJbMV09aVsxXSksaGYoaVswXSxyWzFdKT5oZihyWzBdLHJbMV0pJiYoclswXT1pWzBdKSk6by5wdXNoKHI9aSk7Zm9yKGE9LTEvMCxuPTAscj1vW2U9by5sZW5ndGgtMV07bjw9ZTtyPWksKytuKWk9b1tuXSwodT1oZihyWzFdLGlbMF0pKT5hJiYoYT11LEN1PWlbMF0senU9clsxXSl9cmV0dXJuIE91PVl1PW51bGwsQ3U9PT0xLzB8fFB1PT09MS8wP1tbTmFOLE5hTl0sW05hTixOYU5dXTpbW0N1LFB1XSxbenUsUnVdXX0sdC5nZW9DZW50cm9pZD1mdW5jdGlvbih0KXtCdT1GdT1JdT1IdT1qdT1YdT1HdT1WdT0kdT1XdT1adT0wLHN1KHQsdmYpO3ZhciBuPSR1LGU9V3Uscj1adSxpPW4qbitlKmUrcipyO3JldHVybiBpPFVhJiYobj1YdSxlPUd1LHI9VnUsRnU8RGEmJihuPUl1LGU9SHUscj1qdSksKGk9bipuK2UqZStyKnIpPFVhKT9bTmFOLE5hTl06W1hhKGUsbikqRmEsZXUoci9LYShpKSkqRmFdfSx0Lmdlb0NpcmNsZT1mdW5jdGlvbigpe3ZhciB0LG4sZT1OZihbMCwwXSkscj1OZig5MCksaT1OZig2KSxvPXtwb2ludDpmdW5jdGlvbihlLHIpe3QucHVzaChlPW4oZSxyKSksZVswXSo9RmEsZVsxXSo9RmF9fTtmdW5jdGlvbiBhKCl7dmFyIGE9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdT1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSpJYSxmPWkuYXBwbHkodGhpcyxhcmd1bWVudHMpKklhO3JldHVybiB0PVtdLG49a2YoLWFbMF0qSWEsLWFbMV0qSWEsMCkuaW52ZXJ0LExmKG8sdSxmLDEpLGE9e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOlt0XX0sdD1uPW51bGwsYX1yZXR1cm4gYS5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpOZihbK3RbMF0sK3RbMV1dKSxhKTplfSxhLnJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Ok5mKCt0KSxhKTpyfSxhLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90Ok5mKCt0KSxhKTppfSxhfSx0Lmdlb0NsaXBBbnRpbWVyaWRpYW49R2YsdC5nZW9DbGlwQ2lyY2xlPVZmLHQuZ2VvQ2xpcEV4dGVudD1mdW5jdGlvbigpe3ZhciB0LG4sZSxyPTAsaT0wLG89OTYwLGE9NTAwO3JldHVybiBlPXtzdHJlYW06ZnVuY3Rpb24oZSl7cmV0dXJuIHQmJm49PT1lP3Q6dD1aZihyLGksbyxhKShuPWUpfSxleHRlbnQ6ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3VbMF1bMF0saT0rdVswXVsxXSxvPSt1WzFdWzBdLGE9K3VbMV1bMV0sdD1uPW51bGwsZSk6W1tyLGldLFtvLGFdXX19fSx0Lmdlb0NsaXBSZWN0YW5nbGU9WmYsdC5nZW9Db250YWlucz1mdW5jdGlvbih0LG4pe3JldHVybih0JiZjYy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpP2NjW3QudHlwZV06bGMpKHQsbil9LHQuZ2VvRGlzdGFuY2U9ZmMsdC5nZW9HcmF0aWN1bGU9YmMsdC5nZW9HcmF0aWN1bGUxMD1mdW5jdGlvbigpe3JldHVybiBiYygpKCl9LHQuZ2VvSW50ZXJwb2xhdGU9ZnVuY3Rpb24odCxuKXt2YXIgZT10WzBdKklhLHI9dFsxXSpJYSxpPW5bMF0qSWEsbz1uWzFdKklhLGE9R2EociksdT1RYShyKSxmPUdhKG8pLGM9UWEobykscz1hKkdhKGUpLGw9YSpRYShlKSxoPWYqR2EoaSksZD1mKlFhKGkpLHA9MipldShLYShydShvLXIpK2EqZipydShpLWUpKSksdj1RYShwKSxnPXA/ZnVuY3Rpb24odCl7dmFyIG49UWEodCo9cCkvdixlPVFhKHAtdCkvdixyPWUqcytuKmgsaT1lKmwrbipkLG89ZSp1K24qYztyZXR1cm5bWGEoaSxyKSpGYSxYYShvLEthKHIqcitpKmkpKSpGYV19OmZ1bmN0aW9uKCl7cmV0dXJuW2UqRmEscipGYV19O3JldHVybiBnLmRpc3RhbmNlPXAsZ30sdC5nZW9MZW5ndGg9b2MsdC5nZW9QYXRoPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPTQuNTtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJnIucG9pbnRSYWRpdXMoK2kuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxzdSh0LGUocikpKSxyLnJlc3VsdCgpfXJldHVybiBvLmFyZWE9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShTYykpLFNjLnJlc3VsdCgpfSxvLm1lYXN1cmU9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShkcykpLGRzLnJlc3VsdCgpfSxvLmJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gc3UodCxlKFVjKSksVWMucmVzdWx0KCl9LG8uY2VudHJvaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShaYykpLFpjLnJlc3VsdCgpfSxvLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09bj8odD1udWxsLG1jKToodD1uKS5zdHJlYW0sbyk6dH0sby5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/KG49bnVsbCxuZXcgZ3MpOm5ldyBhcyhuPXQpLCJmdW5jdGlvbiIhPXR5cGVvZiBpJiZyLnBvaW50UmFkaXVzKGkpLG8pOm59LG8ucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooci5wb2ludFJhZGl1cygrdCksK3QpLG8pOml9LG8ucHJvamVjdGlvbih0KS5jb250ZXh0KG4pfSx0Lmdlb0FsYmVycz1Ecyx0Lmdlb0FsYmVyc1VzYT1mdW5jdGlvbigpe3ZhciB0LG4sZSxyLGksbyxhPURzKCksdT1McygpLnJvdGF0ZShbMTU0LDBdKS5jZW50ZXIoWy0yLDU4LjVdKS5wYXJhbGxlbHMoWzU1LDY1XSksZj1McygpLnJvdGF0ZShbMTU3LDBdKS5jZW50ZXIoWy0zLDE5LjldKS5wYXJhbGxlbHMoWzgsMThdKSxjPXtwb2ludDpmdW5jdGlvbih0LG4pe289W3Qsbl19fTtmdW5jdGlvbiBzKHQpe3ZhciBuPXRbMF0sYT10WzFdO3JldHVybiBvPW51bGwsZS5wb2ludChuLGEpLG98fChyLnBvaW50KG4sYSksbyl8fChpLnBvaW50KG4sYSksbyl9ZnVuY3Rpb24gbCgpe3JldHVybiB0PW49bnVsbCxzfXJldHVybiBzLmludmVydD1mdW5jdGlvbih0KXt2YXIgbj1hLnNjYWxlKCksZT1hLnRyYW5zbGF0ZSgpLHI9KHRbMF0tZVswXSkvbixpPSh0WzFdLWVbMV0pL247cmV0dXJuKGk+PS4xMiYmaTwuMjM0JiZyPj0tLjQyNSYmcjwtLjIxND91Omk+PS4xNjYmJmk8LjIzNCYmcj49LS4yMTQmJnI8LS4xMTU/ZjphKS5pbnZlcnQodCl9LHMuc3RyZWFtPWZ1bmN0aW9uKGUpe3JldHVybiB0JiZuPT09ZT90OihyPVthLnN0cmVhbShuPWUpLHUuc3RyZWFtKGUpLGYuc3RyZWFtKGUpXSxpPXIubGVuZ3RoLHQ9e3BvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPS0xOysrZTxpOylyW2VdLnBvaW50KHQsbil9LHNwaGVyZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0tMTsrK3Q8aTspclt0XS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLnBvbHlnb25FbmQoKX19KTt2YXIgcixpfSxzLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYS5wcmVjaXNpb24odCksdS5wcmVjaXNpb24odCksZi5wcmVjaXNpb24odCksbCgpKTphLnByZWNpc2lvbigpfSxzLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhLnNjYWxlKHQpLHUuc2NhbGUoLjM1KnQpLGYuc2NhbGUodCkscy50cmFuc2xhdGUoYS50cmFuc2xhdGUoKSkpOmEuc2NhbGUoKX0scy50cmFuc2xhdGU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGEudHJhbnNsYXRlKCk7dmFyIG49YS5zY2FsZSgpLG89K3RbMF0scz0rdFsxXTtyZXR1cm4gZT1hLnRyYW5zbGF0ZSh0KS5jbGlwRXh0ZW50KFtbby0uNDU1Km4scy0uMjM4Km5dLFtvKy40NTUqbixzKy4yMzgqbl1dKS5zdHJlYW0oYykscj11LnRyYW5zbGF0ZShbby0uMzA3Km4scysuMjAxKm5dKS5jbGlwRXh0ZW50KFtbby0uNDI1Km4rRGEscysuMTIqbitEYV0sW28tLjIxNCpuLURhLHMrLjIzNCpuLURhXV0pLnN0cmVhbShjKSxpPWYudHJhbnNsYXRlKFtvLS4yMDUqbixzKy4yMTIqbl0pLmNsaXBFeHRlbnQoW1tvLS4yMTQqbitEYSxzKy4xNjYqbitEYV0sW28tLjExNSpuLURhLHMrLjIzNCpuLURhXV0pLnN0cmVhbShjKSxsKCl9LHMuZml0RXh0ZW50PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHhzKHMsdCxuKX0scy5maXRTaXplPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHdzKHMsdCxuKX0scy5maXRXaWR0aD1mdW5jdGlvbih0LG4pe3JldHVybiBNcyhzLHQsbil9LHMuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIEFzKHMsdCxuKX0scy5zY2FsZSgxMDcwKX0sdC5nZW9BemltdXRoYWxFcXVhbEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MoT3MpLnNjYWxlKDEyNC43NSkuY2xpcEFuZ2xlKDE3OS45OTkpfSx0Lmdlb0F6aW11dGhhbEVxdWFsQXJlYVJhdz1Pcyx0Lmdlb0F6aW11dGhhbEVxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIENzKFlzKS5zY2FsZSg3OS40MTg4KS5jbGlwQW5nbGUoMTc5Ljk5OSl9LHQuZ2VvQXppbXV0aGFsRXF1aWRpc3RhbnRSYXc9WXMsdC5nZW9Db25pY0NvbmZvcm1hbD1mdW5jdGlvbigpe3JldHVybiB6cyhIcykuc2NhbGUoMTA5LjUpLnBhcmFsbGVscyhbMzAsMzBdKX0sdC5nZW9Db25pY0NvbmZvcm1hbFJhdz1Icyx0Lmdlb0NvbmljRXF1YWxBcmVhPUxzLHQuZ2VvQ29uaWNFcXVhbEFyZWFSYXc9UnMsdC5nZW9Db25pY0VxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIHpzKFhzKS5zY2FsZSgxMzEuMTU0KS5jZW50ZXIoWzAsMTMuOTM4OV0pfSx0Lmdlb0NvbmljRXF1aWRpc3RhbnRSYXc9WHMsdC5nZW9FcXVhbEVhcnRoPWZ1bmN0aW9uKCl7cmV0dXJuIENzKFFzKS5zY2FsZSgxNzcuMTU4KX0sdC5nZW9FcXVhbEVhcnRoUmF3PVFzLHQuZ2VvRXF1aXJlY3Rhbmd1bGFyPWZ1bmN0aW9uKCl7cmV0dXJuIENzKGpzKS5zY2FsZSgxNTIuNjMpfSx0Lmdlb0VxdWlyZWN0YW5ndWxhclJhdz1qcyx0Lmdlb0dub21vbmljPWZ1bmN0aW9uKCl7cmV0dXJuIENzKEpzKS5zY2FsZSgxNDQuMDQ5KS5jbGlwQW5nbGUoNjApfSx0Lmdlb0dub21vbmljUmF3PUpzLHQuZ2VvSWRlbnRpdHk9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscixpLG8sYT0xLHU9MCxmPTAsYz0xLHM9MSxsPW1jLGg9bnVsbCxkPW1jO2Z1bmN0aW9uIHAoKXtyZXR1cm4gcj1pPW51bGwsb31yZXR1cm4gbz17c3RyZWFtOmZ1bmN0aW9uKHQpe3JldHVybiByJiZpPT09dD9yOnI9bChkKGk9dCkpfSxwb3N0Y2xpcDpmdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1yLGg9dD1uPWU9bnVsbCxwKCkpOmR9LGNsaXBFeHRlbnQ6ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9bnVsbD09cj8oaD10PW49ZT1udWxsLG1jKTpaZihoPStyWzBdWzBdLHQ9K3JbMF1bMV0sbj0rclsxXVswXSxlPStyWzFdWzFdKSxwKCkpOm51bGw9PWg/bnVsbDpbW2gsdF0sW24sZV1dfSxzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcygoYT0rdCkqYyxhKnMsdSxmKSxwKCkpOmF9LHRyYW5zbGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcyhhKmMsYSpzLHU9K3RbMF0sZj0rdFsxXSkscCgpKTpbdSxmXX0scmVmbGVjdFg6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9S3MoYSooYz10Py0xOjEpLGEqcyx1LGYpLHAoKSk6YzwwfSxyZWZsZWN0WTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcyhhKmMsYSoocz10Py0xOjEpLHUsZikscCgpKTpzPDB9LGZpdEV4dGVudDpmdW5jdGlvbih0LG4pe3JldHVybiB4cyhvLHQsbil9LGZpdFNpemU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gd3Mobyx0LG4pfSxmaXRXaWR0aDpmdW5jdGlvbih0LG4pe3JldHVybiBNcyhvLHQsbil9LGZpdEhlaWdodDpmdW5jdGlvbih0LG4pe3JldHVybiBBcyhvLHQsbil9fX0sdC5nZW9Qcm9qZWN0aW9uPUNzLHQuZ2VvUHJvamVjdGlvbk11dGF0b3I9UHMsdC5nZW9NZXJjYXRvcj1mdW5jdGlvbigpe3JldHVybiBGcyhCcykuc2NhbGUoOTYxL0JhKX0sdC5nZW9NZXJjYXRvclJhdz1Ccyx0Lmdlb05hdHVyYWxFYXJ0aDE9ZnVuY3Rpb24oKXtyZXR1cm4gQ3ModGwpLnNjYWxlKDE3NS4yOTUpfSx0Lmdlb05hdHVyYWxFYXJ0aDFSYXc9dGwsdC5nZW9PcnRob2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MobmwpLnNjYWxlKDI0OS41KS5jbGlwQW5nbGUoOTArRGEpfSx0Lmdlb09ydGhvZ3JhcGhpY1Jhdz1ubCx0Lmdlb1N0ZXJlb2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MoZWwpLnNjYWxlKDI1MCkuY2xpcEFuZ2xlKDE0Mil9LHQuZ2VvU3RlcmVvZ3JhcGhpY1Jhdz1lbCx0Lmdlb1RyYW5zdmVyc2VNZXJjYXRvcj1mdW5jdGlvbigpe3ZhciB0PUZzKHJsKSxuPXQuY2VudGVyLGU9dC5yb3RhdGU7cmV0dXJuIHQuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oWy10WzFdLHRbMF1dKTpbKHQ9bigpKVsxXSwtdFswXV19LHQucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoW3RbMF0sdFsxXSx0Lmxlbmd0aD4yP3RbMl0rOTA6OTBdKTpbKHQ9ZSgpKVswXSx0WzFdLHRbMl0tOTBdfSxlKFswLDAsOTBdKS5zY2FsZSgxNTkuMTU1KX0sdC5nZW9UcmFuc3ZlcnNlTWVyY2F0b3JSYXc9cmwsdC5nZW9Sb3RhdGlvbj1SZix0Lmdlb1N0cmVhbT1zdSx0Lmdlb1RyYW5zZm9ybT1mdW5jdGlvbih0KXtyZXR1cm57c3RyZWFtOl9zKHQpfX0sdC5jbHVzdGVyPWZ1bmN0aW9uKCl7dmFyIHQ9aWwsbj0xLGU9MSxyPSExO2Z1bmN0aW9uIGkoaSl7dmFyIG8sYT0wO2kuZWFjaEFmdGVyKGZ1bmN0aW9uKG4pe3ZhciBlPW4uY2hpbGRyZW47ZT8obi54PWZ1bmN0aW9uKHQpe3JldHVybiB0LnJlZHVjZShvbCwwKS90Lmxlbmd0aH0oZSksbi55PWZ1bmN0aW9uKHQpe3JldHVybiAxK3QucmVkdWNlKGFsLDApfShlKSk6KG4ueD1vP2ErPXQobixvKTowLG4ueT0wLG89bil9KTt2YXIgdT1mdW5jdGlvbih0KXtmb3IodmFyIG47bj10LmNoaWxkcmVuOyl0PW5bMF07cmV0dXJuIHR9KGkpLGY9ZnVuY3Rpb24odCl7Zm9yKHZhciBuO249dC5jaGlsZHJlbjspdD1uW24ubGVuZ3RoLTFdO3JldHVybiB0fShpKSxjPXUueC10KHUsZikvMixzPWYueCt0KGYsdSkvMjtyZXR1cm4gaS5lYWNoQWZ0ZXIocj9mdW5jdGlvbih0KXt0Lng9KHQueC1pLngpKm4sdC55PShpLnktdC55KSplfTpmdW5jdGlvbih0KXt0Lng9KHQueC1jKS8ocy1jKSpuLHQueT0oMS0oaS55P3QueS9pLnk6MSkpKmV9KX1yZXR1cm4gaS5zZXBhcmF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4saSk6dH0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSExLG49K3RbMF0sZT0rdFsxXSxpKTpyP251bGw6W24sZV19LGkubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITAsbj0rdFswXSxlPSt0WzFdLGkpOnI/W24sZV06bnVsbH0saX0sdC5oaWVyYXJjaHk9ZmwsdC5wYWNrPWZ1bmN0aW9uKCl7dmFyIHQ9bnVsbCxuPTEsZT0xLHI9RWw7ZnVuY3Rpb24gaShpKXtyZXR1cm4gaS54PW4vMixpLnk9ZS8yLHQ/aS5lYWNoQmVmb3JlKFBsKHQpKS5lYWNoQWZ0ZXIoemwociwuNSkpLmVhY2hCZWZvcmUoUmwoMSkpOmkuZWFjaEJlZm9yZShQbChDbCkpLmVhY2hBZnRlcih6bChFbCwxKSkuZWFjaEFmdGVyKHpsKHIsaS5yL01hdGgubWluKG4sZSkpKS5lYWNoQmVmb3JlKFJsKE1hdGgubWluKG4sZSkvKDIqaS5yKSkpLGl9cmV0dXJuIGkucmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PShlPW4pP251bGw6U2woZSksaSk6dDt2YXIgZX0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0WzBdLGU9K3RbMV0saSk6W24sZV19LGkucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmtsKCt0KSxpKTpyfSxpfSx0LnBhY2tTaWJsaW5ncz1mdW5jdGlvbih0KXtyZXR1cm4gTmwodCksdH0sdC5wYWNrRW5jbG9zZT1wbCx0LnBhcnRpdGlvbj1mdW5jdGlvbigpe3ZhciB0PTEsbj0xLGU9MCxyPSExO2Z1bmN0aW9uIGkoaSl7dmFyIG89aS5oZWlnaHQrMTtyZXR1cm4gaS54MD1pLnkwPWUsaS54MT10LGkueTE9bi9vLGkuZWFjaEJlZm9yZShmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbihyKXtyLmNoaWxkcmVuJiZEbChyLHIueDAsdCooci5kZXB0aCsxKS9uLHIueDEsdCooci5kZXB0aCsyKS9uKTt2YXIgaT1yLngwLG89ci55MCxhPXIueDEtZSx1PXIueTEtZTthPGkmJihpPWE9KGkrYSkvMiksdTxvJiYobz11PShvK3UpLzIpLHIueDA9aSxyLnkwPW8sci54MT1hLHIueTE9dX19KG4sbykpLHImJmkuZWFjaEJlZm9yZShMbCksaX1yZXR1cm4gaS5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hIXQsaSk6cn0saS5zaXplPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStlWzBdLG49K2VbMV0saSk6W3Qsbl19LGkucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCxpKTplfSxpfSx0LnN0cmF0aWZ5PWZ1bmN0aW9uKCl7dmFyIHQ9WWwsbj1CbDtmdW5jdGlvbiBlKGUpe3ZhciByLGksbyxhLHUsZixjLHM9ZS5sZW5ndGgsbD1uZXcgQXJyYXkocyksaD17fTtmb3IoaT0wO2k8czsrK2kpcj1lW2ldLHU9bFtpXT1uZXcgaGwociksbnVsbCE9KGY9dChyLGksZSkpJiYoZis9IiIpJiYoaFtjPVVsKyh1LmlkPWYpXT1jIGluIGg/T2w6dSk7Zm9yKGk9MDtpPHM7KytpKWlmKHU9bFtpXSxudWxsIT0oZj1uKGVbaV0saSxlKSkmJihmKz0iIikpe2lmKCEoYT1oW1VsK2ZdKSl0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrZik7aWYoYT09PU9sKXRocm93IG5ldyBFcnJvcigiYW1iaWd1b3VzOiAiK2YpO2EuY2hpbGRyZW4/YS5jaGlsZHJlbi5wdXNoKHUpOmEuY2hpbGRyZW49W3VdLHUucGFyZW50PWF9ZWxzZXtpZihvKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgcm9vdHMiKTtvPXV9aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJubyByb290Iik7aWYoby5wYXJlbnQ9cWwsby5lYWNoQmVmb3JlKGZ1bmN0aW9uKHQpe3QuZGVwdGg9dC5wYXJlbnQuZGVwdGgrMSwtLXN9KS5lYWNoQmVmb3JlKGxsKSxvLnBhcmVudD1udWxsLHM+MCl0aHJvdyBuZXcgRXJyb3IoImN5Y2xlIik7cmV0dXJuIG99cmV0dXJuIGUuaWQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9U2wobiksZSk6dH0sZS5wYXJlbnRJZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1TbCh0KSxlKTpufSxlfSx0LnRyZWU9ZnVuY3Rpb24oKXt2YXIgdD1GbCxuPTEsZT0xLHI9bnVsbDtmdW5jdGlvbiBpKGkpe3ZhciBmPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHIsaSxvLGE9bmV3IEdsKHQsMCksdT1bYV07bj11LnBvcCgpOylpZihyPW4uXy5jaGlsZHJlbilmb3Iobi5jaGlsZHJlbj1uZXcgQXJyYXkobz1yLmxlbmd0aCksaT1vLTE7aT49MDstLWkpdS5wdXNoKGU9bi5jaGlsZHJlbltpXT1uZXcgR2wocltpXSxpKSksZS5wYXJlbnQ9bjtyZXR1cm4oYS5wYXJlbnQ9bmV3IEdsKG51bGwsMCkpLmNoaWxkcmVuPVthXSxhfShpKTtpZihmLmVhY2hBZnRlcihvKSxmLnBhcmVudC5tPS1mLnosZi5lYWNoQmVmb3JlKGEpLHIpaS5lYWNoQmVmb3JlKHUpO2Vsc2V7dmFyIGM9aSxzPWksbD1pO2kuZWFjaEJlZm9yZShmdW5jdGlvbih0KXt0Lng8Yy54JiYoYz10KSx0Lng+cy54JiYocz10KSx0LmRlcHRoPmwuZGVwdGgmJihsPXQpfSk7dmFyIGg9Yz09PXM/MTp0KGMscykvMixkPWgtYy54LHA9bi8ocy54K2grZCksdj1lLyhsLmRlcHRofHwxKTtpLmVhY2hCZWZvcmUoZnVuY3Rpb24odCl7dC54PSh0LngrZCkqcCx0Lnk9dC5kZXB0aCp2fSl9cmV0dXJuIGl9ZnVuY3Rpb24gbyhuKXt2YXIgZT1uLmNoaWxkcmVuLHI9bi5wYXJlbnQuY2hpbGRyZW4saT1uLmk/cltuLmktMV06bnVsbDtpZihlKXshZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9MCxyPTAsaT10LmNoaWxkcmVuLG89aS5sZW5ndGg7LS1vPj0wOykobj1pW29dKS56Kz1lLG4ubSs9ZSxlKz1uLnMrKHIrPW4uYyl9KG4pO3ZhciBvPShlWzBdLnorZVtlLmxlbmd0aC0xXS56KS8yO2k/KG4uej1pLnordChuLl8saS5fKSxuLm09bi56LW8pOm4uej1vfWVsc2UgaSYmKG4uej1pLnordChuLl8saS5fKSk7bi5wYXJlbnQuQT1mdW5jdGlvbihuLGUscil7aWYoZSl7Zm9yKHZhciBpLG89bixhPW4sdT1lLGY9by5wYXJlbnQuY2hpbGRyZW5bMF0sYz1vLm0scz1hLm0sbD11Lm0saD1mLm07dT1IbCh1KSxvPUlsKG8pLHUmJm87KWY9SWwoZiksKGE9SGwoYSkpLmE9biwoaT11LnorbC1vLnotYyt0KHUuXyxvLl8pKT4wJiYoamwoWGwodSxuLHIpLG4saSksYys9aSxzKz1pKSxsKz11Lm0sYys9by5tLGgrPWYubSxzKz1hLm07dSYmIUhsKGEpJiYoYS50PXUsYS5tKz1sLXMpLG8mJiFJbChmKSYmKGYudD1vLGYubSs9Yy1oLHI9bil9cmV0dXJuIHJ9KG4saSxuLnBhcmVudC5BfHxyWzBdKX1mdW5jdGlvbiBhKHQpe3QuXy54PXQueit0LnBhcmVudC5tLHQubSs9dC5wYXJlbnQubX1mdW5jdGlvbiB1KHQpe3QueCo9bix0Lnk9dC5kZXB0aCplfXJldHVybiBpLnNlcGFyYXRpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixpKTp0fSxpLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITEsbj0rdFswXSxlPSt0WzFdLGkpOnI/bnVsbDpbbixlXX0saS5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hMCxuPSt0WzBdLGU9K3RbMV0saSk6cj9bbixlXTpudWxsfSxpfSx0LnRyZWVtYXA9ZnVuY3Rpb24oKXt2YXIgdD1abCxuPSExLGU9MSxyPTEsaT1bMF0sbz1FbCxhPUVsLHU9RWwsZj1FbCxjPUVsO2Z1bmN0aW9uIHModCl7cmV0dXJuIHQueDA9dC55MD0wLHQueDE9ZSx0LnkxPXIsdC5lYWNoQmVmb3JlKGwpLGk9WzBdLG4mJnQuZWFjaEJlZm9yZShMbCksdH1mdW5jdGlvbiBsKG4pe3ZhciBlPWlbbi5kZXB0aF0scj1uLngwK2Uscz1uLnkwK2UsbD1uLngxLWUsaD1uLnkxLWU7bDxyJiYocj1sPShyK2wpLzIpLGg8cyYmKHM9aD0ocytoKS8yKSxuLngwPXIsbi55MD1zLG4ueDE9bCxuLnkxPWgsbi5jaGlsZHJlbiYmKGU9aVtuLmRlcHRoKzFdPW8obikvMixyKz1jKG4pLWUscys9YShuKS1lLChsLT11KG4pLWUpPHImJihyPWw9KHIrbCkvMiksKGgtPWYobiktZSk8cyYmKHM9aD0ocytoKS8yKSx0KG4scixzLGwsaCkpfXJldHVybiBzLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSEhdCxzKTpufSxzLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3RbMF0scj0rdFsxXSxzKTpbZSxyXX0scy50aWxlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PVNsKG4pLHMpOnR9LHMucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9zLnBhZGRpbmdJbm5lcih0KS5wYWRkaW5nT3V0ZXIodCk6cy5wYWRkaW5nSW5uZXIoKX0scy5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6b30scy5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/cy5wYWRkaW5nVG9wKHQpLnBhZGRpbmdSaWdodCh0KS5wYWRkaW5nQm90dG9tKHQpLnBhZGRpbmdMZWZ0KHQpOnMucGFkZGluZ1RvcCgpfSxzLnBhZGRpbmdUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6YX0scy5wYWRkaW5nUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6dX0scy5wYWRkaW5nQm90dG9tPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a2woK3QpLHMpOmZ9LHMucGFkZGluZ0xlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6Y30sc30sdC50cmVlbWFwQmluYXJ5PWZ1bmN0aW9uKHQsbixlLHIsaSl7dmFyIG8sYSx1PXQuY2hpbGRyZW4sZj11Lmxlbmd0aCxjPW5ldyBBcnJheShmKzEpO2ZvcihjWzBdPWE9bz0wO288ZjsrK28pY1tvKzFdPWErPXVbb10udmFsdWU7IWZ1bmN0aW9uIHQobixlLHIsaSxvLGEsZil7aWYobj49ZS0xKXt2YXIgcz11W25dO3JldHVybiBzLngwPWkscy55MD1vLHMueDE9YSx2b2lkKHMueTE9Zil9Zm9yKHZhciBsPWNbbl0saD1yLzIrbCxkPW4rMSxwPWUtMTtkPHA7KXt2YXIgdj1kK3A+Pj4xO2Nbdl08aD9kPXYrMTpwPXZ9aC1jW2QtMV08Y1tkXS1oJiZuKzE8ZCYmLS1kO3ZhciBnPWNbZF0tbCx5PXItZztpZihhLWk+Zi1vKXt2YXIgXz0oaSp5K2EqZykvcjt0KG4sZCxnLGksbyxfLGYpLHQoZCxlLHksXyxvLGEsZil9ZWxzZXt2YXIgYj0obyp5K2YqZykvcjt0KG4sZCxnLGksbyxhLGIpLHQoZCxlLHksaSxiLGEsZil9fSgwLGYsdC52YWx1ZSxuLGUscixpKX0sdC50cmVlbWFwRGljZT1EbCx0LnRyZWVtYXBTbGljZT1WbCx0LnRyZWVtYXBTbGljZURpY2U9ZnVuY3Rpb24odCxuLGUscixpKXsoMSZ0LmRlcHRoP1ZsOkRsKSh0LG4sZSxyLGkpfSx0LnRyZWVtYXBTcXVhcmlmeT1abCx0LnRyZWVtYXBSZXNxdWFyaWZ5PVFsLHQuaW50ZXJwb2xhdGU9bWUsdC5pbnRlcnBvbGF0ZUFycmF5PWRlLHQuaW50ZXJwb2xhdGVCYXNpcz1lZSx0LmludGVycG9sYXRlQmFzaXNDbG9zZWQ9cmUsdC5pbnRlcnBvbGF0ZURhdGU9cGUsdC5pbnRlcnBvbGF0ZURpc2NyZXRlPWZ1bmN0aW9uKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdFtNYXRoLm1heCgwLE1hdGgubWluKG4tMSxNYXRoLmZsb29yKGUqbikpKV19fSx0LmludGVycG9sYXRlSHVlPWZ1bmN0aW9uKHQsbil7dmFyIGU9YWUoK3QsK24pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj1lKHQpO3JldHVybiBuLTM2MCpNYXRoLmZsb29yKG4vMzYwKX19LHQuaW50ZXJwb2xhdGVOdW1iZXI9dmUsdC5pbnRlcnBvbGF0ZU9iamVjdD1nZSx0LmludGVycG9sYXRlUm91bmQ9eGUsdC5pbnRlcnBvbGF0ZVN0cmluZz1iZSx0LmludGVycG9sYXRlVHJhbnNmb3JtQ3NzPUNlLHQuaW50ZXJwb2xhdGVUcmFuc2Zvcm1Tdmc9UGUsdC5pbnRlcnBvbGF0ZVpvb209cWUsdC5pbnRlcnBvbGF0ZVJnYj1jZSx0LmludGVycG9sYXRlUmdiQmFzaXM9bGUsdC5pbnRlcnBvbGF0ZVJnYkJhc2lzQ2xvc2VkPWhlLHQuaW50ZXJwb2xhdGVIc2w9WWUsdC5pbnRlcnBvbGF0ZUhzbExvbmc9QmUsdC5pbnRlcnBvbGF0ZUxhYj1mdW5jdGlvbih0LG4pe3ZhciBlPWZlKCh0PVVuKHQpKS5sLChuPVVuKG4pKS5sKSxyPWZlKHQuYSxuLmEpLGk9ZmUodC5iLG4uYiksbz1mZSh0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQubD1lKG4pLHQuYT1yKG4pLHQuYj1pKG4pLHQub3BhY2l0eT1vKG4pLHQrIiJ9fSx0LmludGVycG9sYXRlSGNsPUllLHQuaW50ZXJwb2xhdGVIY2xMb25nPUhlLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXg9WGUsdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmc9R2UsdC5waWVjZXdpc2U9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9MCxyPW4ubGVuZ3RoLTEsaT1uWzBdLG89bmV3IEFycmF5KHI8MD8wOnIpO2U8cjspb1tlXT10KGksaT1uWysrZV0pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj1NYXRoLm1heCgwLE1hdGgubWluKHItMSxNYXRoLmZsb29yKHQqPXIpKSk7cmV0dXJuIG9bbl0odC1uKX19LHQucXVhbnRpemU9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWVbcl09dChyLyhuLTEpKTtyZXR1cm4gZX0sdC5wYXRoPUdpLHQucG9seWdvbkFyZWE9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9LTEscj10Lmxlbmd0aCxpPXRbci0xXSxvPTA7KytlPHI7KW49aSxpPXRbZV0sbys9blsxXSppWzBdLW5bMF0qaVsxXTtyZXR1cm4gby8yfSx0LnBvbHlnb25DZW50cm9pZD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPS0xLGk9dC5sZW5ndGgsbz0wLGE9MCx1PXRbaS0xXSxmPTA7KytyPGk7KW49dSx1PXRbcl0sZis9ZT1uWzBdKnVbMV0tdVswXSpuWzFdLG8rPShuWzBdK3VbMF0pKmUsYSs9KG5bMV0rdVsxXSkqZTtyZXR1cm5bby8oZio9MyksYS9mXX0sdC5wb2x5Z29uSHVsbD1mdW5jdGlvbih0KXtpZigoZT10Lmxlbmd0aCk8MylyZXR1cm4gbnVsbDt2YXIgbixlLHI9bmV3IEFycmF5KGUpLGk9bmV3IEFycmF5KGUpO2ZvcihuPTA7bjxlOysrbilyW25dPVsrdFtuXVswXSwrdFtuXVsxXSxuXTtmb3Ioci5zb3J0KEpsKSxuPTA7bjxlOysrbilpW25dPVtyW25dWzBdLC1yW25dWzFdXTt2YXIgbz1LbChyKSxhPUtsKGkpLHU9YVswXT09PW9bMF0sZj1hW2EubGVuZ3RoLTFdPT09b1tvLmxlbmd0aC0xXSxjPVtdO2ZvcihuPW8ubGVuZ3RoLTE7bj49MDstLW4pYy5wdXNoKHRbcltvW25dXVsyXV0pO2ZvcihuPSt1O248YS5sZW5ndGgtZjsrK24pYy5wdXNoKHRbclthW25dXVsyXV0pO3JldHVybiBjfSx0LnBvbHlnb25Db250YWlucz1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZSxyLGk9dC5sZW5ndGgsbz10W2ktMV0sYT1uWzBdLHU9blsxXSxmPW9bMF0sYz1vWzFdLHM9ITEsbD0wO2w8aTsrK2wpZT0obz10W2xdKVswXSwocj1vWzFdKT51IT1jPnUmJmE8KGYtZSkqKHUtcikvKGMtcikrZSYmKHM9IXMpLGY9ZSxjPXI7cmV0dXJuIHN9LHQucG9seWdvbkxlbmd0aD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPS0xLGk9dC5sZW5ndGgsbz10W2ktMV0sYT1vWzBdLHU9b1sxXSxmPTA7KytyPGk7KW49YSxlPXUsbi09YT0obz10W3JdKVswXSxlLT11PW9bMV0sZis9TWF0aC5zcXJ0KG4qbitlKmUpO3JldHVybiBmfSx0LnF1YWR0cmVlPXJhLHQucmFuZG9tVW5pZm9ybT1uaCx0LnJhbmRvbU5vcm1hbD1laCx0LnJhbmRvbUxvZ05vcm1hbD1yaCx0LnJhbmRvbUJhdGVzPW9oLHQucmFuZG9tSXJ3aW5IYWxsPWloLHQucmFuZG9tRXhwb25lbnRpYWw9YWgsdC5zY2FsZUJhbmQ9aGgsdC5zY2FsZVBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uIHQobil7dmFyIGU9bi5jb3B5O3JldHVybiBuLnBhZGRpbmc9bi5wYWRkaW5nT3V0ZXIsZGVsZXRlIG4ucGFkZGluZ0lubmVyLGRlbGV0ZSBuLnBhZGRpbmdPdXRlcixuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdChlKCkpfSxufShoaCgpLnBhZGRpbmdJbm5lcigxKSl9LHQuc2NhbGVJZGVudGl0eT1mdW5jdGlvbiB0KCl7dmFyIG49WzAsMV07ZnVuY3Rpb24gZSh0KXtyZXR1cm4rdH1yZXR1cm4gZS5pbnZlcnQ9ZSxlLmRvbWFpbj1lLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWZoLmNhbGwodCxwaCksZSk6bi5zbGljZSgpfSxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihuKX0seGgoZSl9LHQuc2NhbGVMaW5lYXI9ZnVuY3Rpb24gdCgpe3ZhciBuPW1oKGdoLHZlKTtyZXR1cm4gbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKG4sdCgpKX0seGgobil9LHQuc2NhbGVMb2c9ZnVuY3Rpb24gbigpe3ZhciBlPW1oKE1oLEFoKS5kb21haW4oWzEsMTBdKSxyPWUuZG9tYWluLGk9MTAsbz1TaCgxMCksYT1OaCgxMCk7ZnVuY3Rpb24gdSgpe3JldHVybiBvPVNoKGkpLGE9TmgoaSkscigpWzBdPDAmJihvPUVoKG8pLGE9RWgoYSkpLGV9cmV0dXJuIGUuYmFzZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCx1KCkpOml9LGUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyKHQpLHUoKSk6cigpfSxlLnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBuLGU9cigpLHU9ZVswXSxmPWVbZS5sZW5ndGgtMV07KG49Zjx1KSYmKGg9dSx1PWYsZj1oKTt2YXIgYyxzLGwsaD1vKHUpLGQ9byhmKSxwPW51bGw9PXQ/MTA6K3Qsdj1bXTtpZighKGklMSkmJmQtaDxwKXtpZihoPU1hdGgucm91bmQoaCktMSxkPU1hdGgucm91bmQoZCkrMSx1PjApe2Zvcig7aDxkOysraClmb3Iocz0xLGM9YShoKTtzPGk7KytzKWlmKCEoKGw9YypzKTx1KSl7aWYobD5mKWJyZWFrO3YucHVzaChsKX19ZWxzZSBmb3IoO2g8ZDsrK2gpZm9yKHM9aS0xLGM9YShoKTtzPj0xOy0tcylpZighKChsPWMqcyk8dSkpe2lmKGw+ZilicmVhazt2LnB1c2gobCl9fWVsc2Ugdj1tKGgsZCxNYXRoLm1pbihkLWgscCkpLm1hcChhKTtyZXR1cm4gbj92LnJldmVyc2UoKTp2fSxlLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obixyKXtpZihudWxsPT1yJiYocj0xMD09PWk/Ii4wZSI6IiwiKSwiZnVuY3Rpb24iIT10eXBlb2YgciYmKHI9dC5mb3JtYXQocikpLG49PT0xLzApcmV0dXJuIHI7bnVsbD09biYmKG49MTApO3ZhciB1PU1hdGgubWF4KDEsaSpuL2UudGlja3MoKS5sZW5ndGgpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10L2EoTWF0aC5yb3VuZChvKHQpKSk7cmV0dXJuIG4qaTxpLS41JiYobio9aSksbjw9dT9yKHQpOiIifX0sZS5uaWNlPWZ1bmN0aW9uKCl7cmV0dXJuIHIod2gocigpLHtmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gYShNYXRoLmZsb29yKG8odCkpKX0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gYShNYXRoLmNlaWwobyh0KSkpfX0pKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKGUsbigpLmJhc2UoaSkpfSxlfSx0LnNjYWxlT3JkaW5hbD1saCx0LnNjYWxlSW1wbGljaXQ9c2gsdC5zY2FsZVBvdz1DaCx0LnNjYWxlU3FydD1mdW5jdGlvbigpe3JldHVybiBDaCgpLmV4cG9uZW50KC41KX0sdC5zY2FsZVF1YW50aWxlPWZ1bmN0aW9uIHQoKXt2YXIgZT1bXSxyPVtdLG89W107ZnVuY3Rpb24gYSgpe3ZhciB0PTAsbj1NYXRoLm1heCgxLHIubGVuZ3RoKTtmb3Iobz1uZXcgQXJyYXkobi0xKTsrK3Q8bjspb1t0LTFdPUEoZSx0L24pO3JldHVybiB1fWZ1bmN0aW9uIHUodCl7aWYoIWlzTmFOKHQ9K3QpKXJldHVybiByW2kobyx0KV19cmV0dXJuIHUuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBuPXIuaW5kZXhPZih0KTtyZXR1cm4gbjwwP1tOYU4sTmFOXTpbbj4wP29bbi0xXTplWzBdLG48by5sZW5ndGg/b1tuXTplW2UubGVuZ3RoLTFdXX0sdS5kb21haW49ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGUuc2xpY2UoKTtlPVtdO2Zvcih2YXIgcixpPTAsbz10Lmxlbmd0aDtpPG87KytpKW51bGw9PShyPXRbaV0pfHxpc05hTihyPStyKXx8ZS5wdXNoKHIpO3JldHVybiBlLnNvcnQobiksYSgpfSx1LnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWNoLmNhbGwodCksYSgpKTpyLnNsaWNlKCl9LHUucXVhbnRpbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIG8uc2xpY2UoKX0sdS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4oZSkucmFuZ2Uocil9LHV9LHQuc2NhbGVRdWFudGl6ZT1mdW5jdGlvbiB0KCl7dmFyIG49MCxlPTEscj0xLG89Wy41XSxhPVswLDFdO2Z1bmN0aW9uIHUodCl7aWYodDw9dClyZXR1cm4gYVtpKG8sdCwwLHIpXX1mdW5jdGlvbiBmKCl7dmFyIHQ9LTE7Zm9yKG89bmV3IEFycmF5KHIpOysrdDxyOylvW3RdPSgodCsxKSplLSh0LXIpKm4pLyhyKzEpO3JldHVybiB1fXJldHVybiB1LmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdFswXSxlPSt0WzFdLGYoKSk6W24sZV19LHUucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9KGE9Y2guY2FsbCh0KSkubGVuZ3RoLTEsZigpKTphLnNsaWNlKCl9LHUuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBpPWEuaW5kZXhPZih0KTtyZXR1cm4gaTwwP1tOYU4sTmFOXTppPDE/W24sb1swXV06aT49cj9bb1tyLTFdLGVdOltvW2ktMV0sb1tpXV19LHUuY29weT1mdW5jdGlvbigpe3JldHVybiB0KCkuZG9tYWluKFtuLGVdKS5yYW5nZShhKX0seGgodSl9LHQuc2NhbGVUaHJlc2hvbGQ9ZnVuY3Rpb24gdCgpe3ZhciBuPVsuNV0sZT1bMCwxXSxyPTE7ZnVuY3Rpb24gbyh0KXtpZih0PD10KXJldHVybiBlW2kobix0LDAscildfXJldHVybiBvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1jaC5jYWxsKHQpLHI9TWF0aC5taW4obi5sZW5ndGgsZS5sZW5ndGgtMSksbyk6bi5zbGljZSgpfSxvLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWNoLmNhbGwodCkscj1NYXRoLm1pbihuLmxlbmd0aCxlLmxlbmd0aC0xKSxvKTplLnNsaWNlKCl9LG8uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciByPWUuaW5kZXhPZih0KTtyZXR1cm5bbltyLTFdLG5bcl1dfSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihuKS5yYW5nZShlKX0sb30sdC5zY2FsZVRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gY3YoY2QsdWQsVmgsamgsSWgsQmgsT2gsTGgsdC50aW1lRm9ybWF0KS5kb21haW4oW25ldyBEYXRlKDJlMywwLDEpLG5ldyBEYXRlKDJlMywwLDIpXSl9LHQuc2NhbGVVdGM9ZnVuY3Rpb24oKXtyZXR1cm4gY3YoTGQsemQsX2QsdmQsZGQsbGQsT2gsTGgsdC51dGNGb3JtYXQpLmRvbWFpbihbRGF0ZS5VVEMoMmUzLDAsMSksRGF0ZS5VVEMoMmUzLDAsMildKX0sdC5zY2FsZVNlcXVlbnRpYWw9ZnVuY3Rpb24gdChuKXt2YXIgZT0wLHI9MSxpPTEsbz0hMTtmdW5jdGlvbiBhKHQpe3ZhciByPSh0LWUpKmk7cmV0dXJuIG4obz9NYXRoLm1heCgwLE1hdGgubWluKDEscikpOnIpfXJldHVybiBhLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdFswXSxyPSt0WzFdLGk9ZT09PXI/MDoxLyhyLWUpLGEpOltlLHJdfSxhLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSEhdCxhKTpvfSxhLmludGVycG9sYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGEpOm59LGEuY29weT1mdW5jdGlvbigpe3JldHVybiB0KG4pLmRvbWFpbihbZSxyXSkuY2xhbXAobyl9LHhoKGEpfSx0LnNjYWxlRGl2ZXJnaW5nPWZ1bmN0aW9uIHQobil7dmFyIGU9MCxyPS41LGk9MSxvPTEsYT0xLHU9ITE7ZnVuY3Rpb24gZih0KXt2YXIgZT0uNSsoKHQ9K3QpLXIpKih0PHI/bzphKTtyZXR1cm4gbih1P01hdGgubWF4KDAsTWF0aC5taW4oMSxlKSk6ZSl9cmV0dXJuIGYuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLHI9K3RbMV0saT0rdFsyXSxvPWU9PT1yPzA6LjUvKHItZSksYT1yPT09aT8wOi41LyhpLXIpLGYpOltlLHIsaV19LGYuY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ISF0LGYpOnV9LGYuaW50ZXJwb2xhdG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZik6bn0sZi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQobikuZG9tYWluKFtlLHIsaV0pLmNsYW1wKHUpfSx4aChmKX0sdC5zY2hlbWVDYXRlZ29yeTEwPWx2LHQuc2NoZW1lQWNjZW50PWh2LHQuc2NoZW1lRGFyazI9ZHYsdC5zY2hlbWVQYWlyZWQ9cHYsdC5zY2hlbWVQYXN0ZWwxPXZ2LHQuc2NoZW1lUGFzdGVsMj1ndix0LnNjaGVtZVNldDE9eXYsdC5zY2hlbWVTZXQyPV92LHQuc2NoZW1lU2V0Mz1idix0LmludGVycG9sYXRlQnJCRz13dix0LnNjaGVtZUJyQkc9eHYsdC5pbnRlcnBvbGF0ZVBSR249QXYsdC5zY2hlbWVQUkduPU12LHQuaW50ZXJwb2xhdGVQaVlHPU52LHQuc2NoZW1lUGlZRz1Udix0LmludGVycG9sYXRlUHVPcj1Fdix0LnNjaGVtZVB1T3I9U3YsdC5pbnRlcnBvbGF0ZVJkQnU9Q3YsdC5zY2hlbWVSZEJ1PWt2LHQuaW50ZXJwb2xhdGVSZEd5PXp2LHQuc2NoZW1lUmRHeT1Qdix0LmludGVycG9sYXRlUmRZbEJ1PUx2LHQuc2NoZW1lUmRZbEJ1PVJ2LHQuaW50ZXJwb2xhdGVSZFlsR249VXYsdC5zY2hlbWVSZFlsR249RHYsdC5pbnRlcnBvbGF0ZVNwZWN0cmFsPU92LHQuc2NoZW1lU3BlY3RyYWw9cXYsdC5pbnRlcnBvbGF0ZUJ1R249QnYsdC5zY2hlbWVCdUduPVl2LHQuaW50ZXJwb2xhdGVCdVB1PUl2LHQuc2NoZW1lQnVQdT1Gdix0LmludGVycG9sYXRlR25CdT1qdix0LnNjaGVtZUduQnU9SHYsdC5pbnRlcnBvbGF0ZU9yUmQ9R3YsdC5zY2hlbWVPclJkPVh2LHQuaW50ZXJwb2xhdGVQdUJ1R249JHYsdC5zY2hlbWVQdUJ1R249VnYsdC5pbnRlcnBvbGF0ZVB1QnU9WnYsdC5zY2hlbWVQdUJ1PVd2LHQuaW50ZXJwb2xhdGVQdVJkPUp2LHQuc2NoZW1lUHVSZD1Rdix0LmludGVycG9sYXRlUmRQdT10Zyx0LnNjaGVtZVJkUHU9S3YsdC5pbnRlcnBvbGF0ZVlsR25CdT1lZyx0LnNjaGVtZVlsR25CdT1uZyx0LmludGVycG9sYXRlWWxHbj1pZyx0LnNjaGVtZVlsR249cmcsdC5pbnRlcnBvbGF0ZVlsT3JCcj1hZyx0LnNjaGVtZVlsT3JCcj1vZyx0LmludGVycG9sYXRlWWxPclJkPWZnLHQuc2NoZW1lWWxPclJkPXVnLHQuaW50ZXJwb2xhdGVCbHVlcz1zZyx0LnNjaGVtZUJsdWVzPWNnLHQuaW50ZXJwb2xhdGVHcmVlbnM9aGcsdC5zY2hlbWVHcmVlbnM9bGcsdC5pbnRlcnBvbGF0ZUdyZXlzPXBnLHQuc2NoZW1lR3JleXM9ZGcsdC5pbnRlcnBvbGF0ZVB1cnBsZXM9Z2csdC5zY2hlbWVQdXJwbGVzPXZnLHQuaW50ZXJwb2xhdGVSZWRzPV9nLHQuc2NoZW1lUmVkcz15Zyx0LmludGVycG9sYXRlT3Jhbmdlcz1tZyx0LnNjaGVtZU9yYW5nZXM9YmcsdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeERlZmF1bHQ9eGcsdC5pbnRlcnBvbGF0ZVJhaW5ib3c9ZnVuY3Rpb24odCl7KHQ8MHx8dD4xKSYmKHQtPU1hdGguZmxvb3IodCkpO3ZhciBuPU1hdGguYWJzKHQtLjUpO3JldHVybiBBZy5oPTM2MCp0LTEwMCxBZy5zPTEuNS0xLjUqbixBZy5sPS44LS45Km4sQWcrIiJ9LHQuaW50ZXJwb2xhdGVXYXJtPXdnLHQuaW50ZXJwb2xhdGVDb29sPU1nLHQuaW50ZXJwb2xhdGVTaW5lYm93PWZ1bmN0aW9uKHQpe3ZhciBuO3JldHVybiB0PSguNS10KSpNYXRoLlBJLFRnLnI9MjU1KihuPU1hdGguc2luKHQpKSpuLFRnLmc9MjU1KihuPU1hdGguc2luKHQrTmcpKSpuLFRnLmI9MjU1KihuPU1hdGguc2luKHQrU2cpKSpuLFRnKyIifSx0LmludGVycG9sYXRlVmlyaWRpcz1rZyx0LmludGVycG9sYXRlTWFnbWE9Q2csdC5pbnRlcnBvbGF0ZUluZmVybm89UGcsdC5pbnRlcnBvbGF0ZVBsYXNtYT16Zyx0LmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gRHQoVyh0KS5jYWxsKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpfSx0LmNyZWF0b3I9Vyx0LmxvY2FsPXF0LHQubWF0Y2hlcj1ydCx0Lm1vdXNlPUZ0LHQubmFtZXNwYWNlPSQsdC5uYW1lc3BhY2VzPVYsdC5jbGllbnRQb2ludD1CdCx0LnNlbGVjdD1EdCx0LnNlbGVjdEFsbD1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFJ0KFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IFJ0KFtudWxsPT10P1tdOnRdLHp0KX0sdC5zZWxlY3Rpb249THQsdC5zZWxlY3Rvcj1RLHQuc2VsZWN0b3JBbGw9Syx0LnN0eWxlPWx0LHQudG91Y2g9SXQsdC50b3VjaGVzPWZ1bmN0aW9uKHQsbil7bnVsbD09biYmKG49WXQoKS50b3VjaGVzKTtmb3IodmFyIGU9MCxyPW4/bi5sZW5ndGg6MCxpPW5ldyBBcnJheShyKTtlPHI7KytlKWlbZV09QnQodCxuW2VdKTtyZXR1cm4gaX0sdC53aW5kb3c9c3QsdC5jdXN0b21FdmVudD1DdCx0LmFyYz1mdW5jdGlvbigpe3ZhciB0PUdnLG49VmcsZT1SZygwKSxyPW51bGwsaT0kZyxvPVdnLGE9WmcsdT1udWxsO2Z1bmN0aW9uIGYoKXt2YXIgZixjLHMsbD0rdC5hcHBseSh0aGlzLGFyZ3VtZW50cyksaD0rbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksZD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1IZyxwPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpLUhnLHY9TGcocC1kKSxnPXA+ZDtpZih1fHwodT1mPUdpKCkpLGg8bCYmKGM9aCxoPWwsbD1jKSxoPkZnKWlmKHY+amctRmcpdS5tb3ZlVG8oaCpVZyhkKSxoKllnKGQpKSx1LmFyYygwLDAsaCxkLHAsIWcpLGw+RmcmJih1Lm1vdmVUbyhsKlVnKHApLGwqWWcocCkpLHUuYXJjKDAsMCxsLHAsZCxnKSk7ZWxzZXt2YXIgeSxfLGI9ZCxtPXAseD1kLHc9cCxNPXYsQT12LFQ9YS5hcHBseSh0aGlzLGFyZ3VtZW50cykvMixOPVQ+RmcmJihyPytyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpCZyhsKmwraCpoKSksUz1PZyhMZyhoLWwpLzIsK2UuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxFPVMsaz1TO2lmKE4+Rmcpe3ZhciBDPVhnKE4vbCpZZyhUKSksUD1YZyhOL2gqWWcoVCkpOyhNLT0yKkMpPkZnPyh4Kz1DKj1nPzE6LTEsdy09Qyk6KE09MCx4PXc9KGQrcCkvMiksKEEtPTIqUCk+Rmc/KGIrPVAqPWc/MTotMSxtLT1QKTooQT0wLGI9bT0oZCtwKS8yKX12YXIgej1oKlVnKGIpLFI9aCpZZyhiKSxMPWwqVWcodyksRD1sKllnKHcpO2lmKFM+Rmcpe3ZhciBVPWgqVWcobSkscT1oKllnKG0pLE89bCpVZyh4KSxZPWwqWWcoeCk7aWYodjxJZyl7dmFyIEI9TT5GZz9mdW5jdGlvbih0LG4sZSxyLGksbyxhLHUpe3ZhciBmPWUtdCxjPXItbixzPWEtaSxsPXUtbyxoPShzKihuLW8pLWwqKHQtaSkpLyhsKmYtcypjKTtyZXR1cm5bdCtoKmYsbitoKmNdfSh6LFIsTyxZLFUscSxMLEQpOltMLERdLEY9ei1CWzBdLEk9Ui1CWzFdLEg9VS1CWzBdLGo9cS1CWzFdLFg9MS9ZZygoKHM9KEYqSCtJKmopLyhCZyhGKkYrSSpJKSpCZyhIKkgraipqKSkpPjE/MDpzPC0xP0lnOk1hdGguYWNvcyhzKSkvMiksRz1CZyhCWzBdKkJbMF0rQlsxXSpCWzFdKTtFPU9nKFMsKGwtRykvKFgtMSkpLGs9T2coUywoaC1HKS8oWCsxKSl9fUE+Rmc/az5GZz8oeT1RZyhPLFkseixSLGgsayxnKSxfPVFnKFUscSxMLEQsaCxrLGcpLHUubW92ZVRvKHkuY3greS54MDEseS5jeSt5LnkwMSksazxTP3UuYXJjKHkuY3gseS5jeSxrLERnKHkueTAxLHkueDAxKSxEZyhfLnkwMSxfLngwMSksIWcpOih1LmFyYyh5LmN4LHkuY3ksayxEZyh5LnkwMSx5LngwMSksRGcoeS55MTEseS54MTEpLCFnKSx1LmFyYygwLDAsaCxEZyh5LmN5K3kueTExLHkuY3greS54MTEpLERnKF8uY3krXy55MTEsXy5jeCtfLngxMSksIWcpLHUuYXJjKF8uY3gsXy5jeSxrLERnKF8ueTExLF8ueDExKSxEZyhfLnkwMSxfLngwMSksIWcpKSk6KHUubW92ZVRvKHosUiksdS5hcmMoMCwwLGgsYixtLCFnKSk6dS5tb3ZlVG8oeixSKSxsPkZnJiZNPkZnP0U+Rmc/KHk9UWcoTCxELFUscSxsLC1FLGcpLF89UWcoeixSLE8sWSxsLC1FLGcpLHUubGluZVRvKHkuY3greS54MDEseS5jeSt5LnkwMSksRTxTP3UuYXJjKHkuY3gseS5jeSxFLERnKHkueTAxLHkueDAxKSxEZyhfLnkwMSxfLngwMSksIWcpOih1LmFyYyh5LmN4LHkuY3ksRSxEZyh5LnkwMSx5LngwMSksRGcoeS55MTEseS54MTEpLCFnKSx1LmFyYygwLDAsbCxEZyh5LmN5K3kueTExLHkuY3greS54MTEpLERnKF8uY3krXy55MTEsXy5jeCtfLngxMSksZyksdS5hcmMoXy5jeCxfLmN5LEUsRGcoXy55MTEsXy54MTEpLERnKF8ueTAxLF8ueDAxKSwhZykpKTp1LmFyYygwLDAsbCx3LHgsZyk6dS5saW5lVG8oTCxEKX1lbHNlIHUubW92ZVRvKDAsMCk7aWYodS5jbG9zZVBhdGgoKSxmKXJldHVybiB1PW51bGwsZisiInx8bnVsbH1yZXR1cm4gZi5jZW50cm9pZD1mdW5jdGlvbigpe3ZhciBlPSgrdC5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMixyPSgraS5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMi1JZy8yO3JldHVybltVZyhyKSplLFlnKHIpKmVdfSxmLmlubmVyUmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UmcoK24pLGYpOnR9LGYub3V0ZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6bn0sZi5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6ZX0sZi5wYWRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOnJ9LGYuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTppfSxmLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOm99LGYucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6YX0sZi5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGw9PXQ/bnVsbDp0LGYpOnV9LGZ9LHQuYXJlYT1yeSx0LmxpbmU9ZXksdC5waWU9ZnVuY3Rpb24oKXt2YXIgdD1veSxuPWl5LGU9bnVsbCxyPVJnKDApLGk9UmcoamcpLG89UmcoMCk7ZnVuY3Rpb24gYShhKXt2YXIgdSxmLGMscyxsLGg9YS5sZW5ndGgsZD0wLHA9bmV3IEFycmF5KGgpLHY9bmV3IEFycmF5KGgpLGc9K3IuYXBwbHkodGhpcyxhcmd1bWVudHMpLHk9TWF0aC5taW4oamcsTWF0aC5tYXgoLWpnLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpLWcpKSxfPU1hdGgubWluKE1hdGguYWJzKHkpL2gsby5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGI9XyooeTwwPy0xOjEpO2Zvcih1PTA7dTxoOysrdSkobD12W3BbdV09dV09K3QoYVt1XSx1LGEpKT4wJiYoZCs9bCk7Zm9yKG51bGwhPW4/cC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odlt0XSx2W2VdKX0pOm51bGwhPWUmJnAuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBlKGFbdF0sYVtuXSl9KSx1PTAsYz1kPyh5LWgqYikvZDowO3U8aDsrK3UsZz1zKWY9cFt1XSxzPWcrKChsPXZbZl0pPjA/bCpjOjApK2IsdltmXT17ZGF0YTphW2ZdLGluZGV4OnUsdmFsdWU6bCxzdGFydEFuZ2xlOmcsZW5kQW5nbGU6cyxwYWRBbmdsZTpffTtyZXR1cm4gdn1yZXR1cm4gYS52YWx1ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKCtuKSxhKTp0fSxhLnNvcnRWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxlPW51bGwsYSk6bn0sYS5zb3J0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbj1udWxsLGEpOmV9LGEuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxhKTpyfSxhLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOml9LGEucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6b30sYX0sdC5hcmVhUmFkaWFsPWx5LHQucmFkaWFsQXJlYT1seSx0LmxpbmVSYWRpYWw9c3ksdC5yYWRpYWxMaW5lPXN5LHQucG9pbnRSYWRpYWw9aHksdC5saW5rSG9yaXpvbnRhbD1mdW5jdGlvbigpe3JldHVybiBneSh5eSl9LHQubGlua1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuIGd5KF95KX0sdC5saW5rUmFkaWFsPWZ1bmN0aW9uKCl7dmFyIHQ9Z3koYnkpO3JldHVybiB0LmFuZ2xlPXQueCxkZWxldGUgdC54LHQucmFkaXVzPXQueSxkZWxldGUgdC55LHR9LHQuc3ltYm9sPWZ1bmN0aW9uKCl7dmFyIHQ9UmcobXkpLG49UmcoNjQpLGU9bnVsbDtmdW5jdGlvbiByKCl7dmFyIHI7aWYoZXx8KGU9cj1HaSgpKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKS5kcmF3KGUsK24uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxyKXJldHVybiBlPW51bGwscisiInx8bnVsbH1yZXR1cm4gci50eXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Umcobikscik6dH0sci5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLHIpOm59LHIuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6dCxyKTplfSxyfSx0LnN5bWJvbHM9VXksdC5zeW1ib2xDaXJjbGU9bXksdC5zeW1ib2xDcm9zcz14eSx0LnN5bWJvbERpYW1vbmQ9QXksdC5zeW1ib2xTcXVhcmU9a3ksdC5zeW1ib2xTdGFyPUV5LHQuc3ltYm9sVHJpYW5nbGU9UHksdC5zeW1ib2xXeWU9RHksdC5jdXJ2ZUJhc2lzQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgQnkodCl9LHQuY3VydmVCYXNpc09wZW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBGeSh0KX0sdC5jdXJ2ZUJhc2lzPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgWXkodCl9LHQuY3VydmVCdW5kbGU9SHksdC5jdXJ2ZUNhcmRpbmFsQ2xvc2VkPSR5LHQuY3VydmVDYXJkaW5hbE9wZW49WnksdC5jdXJ2ZUNhcmRpbmFsPUd5LHQuY3VydmVDYXRtdWxsUm9tQ2xvc2VkPW5fLHQuY3VydmVDYXRtdWxsUm9tT3Blbj1yXyx0LmN1cnZlQ2F0bXVsbFJvbT1LeSx0LmN1cnZlTGluZWFyQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaV8odCl9LHQuY3VydmVMaW5lYXI9S2csdC5jdXJ2ZU1vbm90b25lWD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGNfKHQpfSx0LmN1cnZlTW9ub3RvbmVZPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgc18odCl9LHQuY3VydmVOYXR1cmFsPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaF8odCl9LHQuY3VydmVTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcF8odCwuNSl9LHQuY3VydmVTdGVwQWZ0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBwXyh0LDEpfSx0LmN1cnZlU3RlcEJlZm9yZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHBfKHQsMCl9LHQuc3RhY2s9ZnVuY3Rpb24oKXt2YXIgdD1SZyhbXSksbj1nXyxlPXZfLHI9eV87ZnVuY3Rpb24gaShpKXt2YXIgbyxhLHU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksZj1pLmxlbmd0aCxjPXUubGVuZ3RoLHM9bmV3IEFycmF5KGMpO2ZvcihvPTA7bzxjOysrbyl7Zm9yKHZhciBsLGg9dVtvXSxkPXNbb109bmV3IEFycmF5KGYpLHA9MDtwPGY7KytwKWRbcF09bD1bMCwrcihpW3BdLGgscCxpKV0sbC5kYXRhPWlbcF07ZC5rZXk9aH1mb3Iobz0wLGE9bihzKTtvPGM7KytvKXNbYVtvXV0uaW5kZXg9bztyZXR1cm4gZShzLGEpLHN9cmV0dXJuIGkua2V5cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKGR5LmNhbGwobikpLGkpOnR9LGkudmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksaSk6cn0saS5vcmRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P2dfOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoZHkuY2FsbCh0KSksaSk6bn0saS5vZmZzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD92Xzp0LGkpOmV9LGl9LHQuc3RhY2tPZmZzZXRFeHBhbmQ9ZnVuY3Rpb24odCxuKXtpZigocj10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHIsaSxvPTAsYT10WzBdLmxlbmd0aDtvPGE7KytvKXtmb3IoaT1lPTA7ZTxyOysrZSlpKz10W2VdW29dWzFdfHwwO2lmKGkpZm9yKGU9MDtlPHI7KytlKXRbZV1bb11bMV0vPWl9dl8odCxuKX19LHQuc3RhY2tPZmZzZXREaXZlcmdpbmc9ZnVuY3Rpb24odCxuKXtpZigodT10Lmxlbmd0aCk+MSlmb3IodmFyIGUscixpLG8sYSx1LGY9MCxjPXRbblswXV0ubGVuZ3RoO2Y8YzsrK2YpZm9yKG89YT0wLGU9MDtlPHU7KytlKShpPShyPXRbbltlXV1bZl0pWzFdLXJbMF0pPj0wPyhyWzBdPW8sclsxXT1vKz1pKTppPDA/KHJbMV09YSxyWzBdPWErPWkpOnJbMF09b30sdC5zdGFja09mZnNldE5vbmU9dl8sdC5zdGFja09mZnNldFNpbGhvdWV0dGU9ZnVuY3Rpb24odCxuKXtpZigoZT10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHI9MCxpPXRbblswXV0sbz1pLmxlbmd0aDtyPG87KytyKXtmb3IodmFyIGE9MCx1PTA7YTxlOysrYSl1Kz10W2FdW3JdWzFdfHwwO2lbcl1bMV0rPWlbcl1bMF09LXUvMn12Xyh0LG4pfX0sdC5zdGFja09mZnNldFdpZ2dsZT1mdW5jdGlvbih0LG4pe2lmKChpPXQubGVuZ3RoKT4wJiYocj0oZT10W25bMF1dKS5sZW5ndGgpPjApe2Zvcih2YXIgZSxyLGksbz0wLGE9MTthPHI7KythKXtmb3IodmFyIHU9MCxmPTAsYz0wO3U8aTsrK3Upe2Zvcih2YXIgcz10W25bdV1dLGw9c1thXVsxXXx8MCxoPShsLShzW2EtMV1bMV18fDApKS8yLGQ9MDtkPHU7KytkKXt2YXIgcD10W25bZF1dO2grPShwW2FdWzFdfHwwKS0ocFthLTFdWzFdfHwwKX1mKz1sLGMrPWgqbH1lW2EtMV1bMV0rPWVbYS0xXVswXT1vLGYmJihvLT1jL2YpfWVbYS0xXVsxXSs9ZVthLTFdWzBdPW8sdl8odCxuKX19LHQuc3RhY2tPcmRlckFzY2VuZGluZz1fXyx0LnN0YWNrT3JkZXJEZXNjZW5kaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBfXyh0KS5yZXZlcnNlKCl9LHQuc3RhY2tPcmRlckluc2lkZU91dD1mdW5jdGlvbih0KXt2YXIgbixlLHI9dC5sZW5ndGgsaT10Lm1hcChiXyksbz1nXyh0KS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGlbbl0taVt0XX0pLGE9MCx1PTAsZj1bXSxjPVtdO2ZvcihuPTA7bjxyOysrbillPW9bbl0sYTx1PyhhKz1pW2VdLGYucHVzaChlKSk6KHUrPWlbZV0sYy5wdXNoKGUpKTtyZXR1cm4gYy5yZXZlcnNlKCkuY29uY2F0KGYpfSx0LnN0YWNrT3JkZXJOb25lPWdfLHQuc3RhY2tPcmRlclJldmVyc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGdfKHQpLnJldmVyc2UoKX0sdC50aW1lSW50ZXJ2YWw9UmgsdC50aW1lTWlsbGlzZWNvbmQ9TGgsdC50aW1lTWlsbGlzZWNvbmRzPURoLHQudXRjTWlsbGlzZWNvbmQ9TGgsdC51dGNNaWxsaXNlY29uZHM9RGgsdC50aW1lU2Vjb25kPU9oLHQudGltZVNlY29uZHM9WWgsdC51dGNTZWNvbmQ9T2gsdC51dGNTZWNvbmRzPVloLHQudGltZU1pbnV0ZT1CaCx0LnRpbWVNaW51dGVzPUZoLHQudGltZUhvdXI9SWgsdC50aW1lSG91cnM9SGgsdC50aW1lRGF5PWpoLHQudGltZURheXM9WGgsdC50aW1lV2Vlaz1WaCx0LnRpbWVXZWVrcz10ZCx0LnRpbWVTdW5kYXk9VmgsdC50aW1lU3VuZGF5cz10ZCx0LnRpbWVNb25kYXk9JGgsdC50aW1lTW9uZGF5cz1uZCx0LnRpbWVUdWVzZGF5PVdoLHQudGltZVR1ZXNkYXlzPWVkLHQudGltZVdlZG5lc2RheT1aaCx0LnRpbWVXZWRuZXNkYXlzPXJkLHQudGltZVRodXJzZGF5PVFoLHQudGltZVRodXJzZGF5cz1pZCx0LnRpbWVGcmlkYXk9SmgsdC50aW1lRnJpZGF5cz1vZCx0LnRpbWVTYXR1cmRheT1LaCx0LnRpbWVTYXR1cmRheXM9YWQsdC50aW1lTW9udGg9dWQsdC50aW1lTW9udGhzPWZkLHQudGltZVllYXI9Y2QsdC50aW1lWWVhcnM9c2QsdC51dGNNaW51dGU9bGQsdC51dGNNaW51dGVzPWhkLHQudXRjSG91cj1kZCx0LnV0Y0hvdXJzPXBkLHQudXRjRGF5PXZkLHQudXRjRGF5cz1nZCx0LnV0Y1dlZWs9X2QsdC51dGNXZWVrcz1UZCx0LnV0Y1N1bmRheT1fZCx0LnV0Y1N1bmRheXM9VGQsdC51dGNNb25kYXk9YmQsdC51dGNNb25kYXlzPU5kLHQudXRjVHVlc2RheT1tZCx0LnV0Y1R1ZXNkYXlzPVNkLHQudXRjV2VkbmVzZGF5PXhkLHQudXRjV2VkbmVzZGF5cz1FZCx0LnV0Y1RodXJzZGF5PXdkLHQudXRjVGh1cnNkYXlzPWtkLHQudXRjRnJpZGF5PU1kLHQudXRjRnJpZGF5cz1DZCx0LnV0Y1NhdHVyZGF5PUFkLHQudXRjU2F0dXJkYXlzPVBkLHQudXRjTW9udGg9emQsdC51dGNNb250aHM9UmQsdC51dGNZZWFyPUxkLHQudXRjWWVhcnM9RGQsdC50aW1lRm9ybWF0RGVmYXVsdExvY2FsZT1RcCx0LnRpbWVGb3JtYXRMb2NhbGU9WWQsdC5pc29Gb3JtYXQ9SnAsdC5pc29QYXJzZT1LcCx0Lm5vdz1pcix0LnRpbWVyPXVyLHQudGltZXJGbHVzaD1mcix0LnRpbWVvdXQ9aHIsdC5pbnRlcnZhbD1mdW5jdGlvbih0LG4sZSl7dmFyIHI9bmV3IGFyLGk9bjtyZXR1cm4gbnVsbD09bj8oci5yZXN0YXJ0KHQsbixlKSxyKToobj0rbixlPW51bGw9PWU/aXIoKTorZSxyLnJlc3RhcnQoZnVuY3Rpb24gbyhhKXthKz1pLHIucmVzdGFydChvLGkrPW4sZSksdChhKX0sbixlKSxyKX0sdC50cmFuc2l0aW9uPXpyLHQuYWN0aXZlPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXQuX190cmFuc2l0aW9uO2lmKGkpZm9yKHIgaW4gbj1udWxsPT1uP251bGw6bisiIixpKWlmKChlPWlbcl0pLnN0YXRlPmdyJiZlLm5hbWU9PT1uKXJldHVybiBuZXcgUHIoW1t0XV0sbGksbiwrcik7cmV0dXJuIG51bGx9LHQuaW50ZXJydXB0PU5yLHQudm9yb25vaT1mdW5jdGlvbigpe3ZhciB0PXhfLG49d18sZT1udWxsO2Z1bmN0aW9uIHIocil7cmV0dXJuIG5ldyBlYihyLm1hcChmdW5jdGlvbihlLGkpe3ZhciBvPVtNYXRoLnJvdW5kKHQoZSxpLHIpL0tfKSpLXyxNYXRoLnJvdW5kKG4oZSxpLHIpL0tfKSpLX107cmV0dXJuIG8uaW5kZXg9aSxvLmRhdGE9ZSxvfSksZSl9cmV0dXJuIHIucG9seWdvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCkucG9seWdvbnMoKX0sci5saW5rcz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KS5saW5rcygpfSxyLnRyaWFuZ2xlcz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KS50cmlhbmdsZXMoKX0sci54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246bV8oK24pLHIpOnR9LHIueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Om1fKCt0KSxyKTpufSxyLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6W1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0scik6ZSYmW1tlWzBdWzBdLGVbMF1bMV1dLFtlWzFdWzBdLGVbMV1bMV1dXX0sci5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/bnVsbDpbWzAsMF0sWyt0WzBdLCt0WzFdXV0scik6ZSYmW2VbMV1bMF0tZVswXVswXSxlWzFdWzFdLWVbMF1bMV1dfSxyfSx0Lnpvb209ZnVuY3Rpb24oKXt2YXIgbixlLHI9c2IsaT1sYixvPXZiLGE9ZGIsdT1wYixmPVswLDEvMF0sYz1bWy0xLzAsLTEvMF0sWzEvMCwxLzBdXSxzPTI1MCxsPXFlLGg9W10sZD1JKCJzdGFydCIsInpvb20iLCJlbmQiKSxwPTUwMCx2PTE1MCxnPTA7ZnVuY3Rpb24geSh0KXt0LnByb3BlcnR5KCJfX3pvb20iLGhiKS5vbigid2hlZWwuem9vbSIsQSkub24oIm1vdXNlZG93bi56b29tIixUKS5vbigiZGJsY2xpY2suem9vbSIsTikuZmlsdGVyKHUpLm9uKCJ0b3VjaHN0YXJ0Lnpvb20iLFMpLm9uKCJ0b3VjaG1vdmUuem9vbSIsRSkub24oInRvdWNoZW5kLnpvb20gdG91Y2hjYW5jZWwuem9vbSIsaykuc3R5bGUoInRvdWNoLWFjdGlvbiIsIm5vbmUiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpfWZ1bmN0aW9uIF8odCxuKXtyZXR1cm4obj1NYXRoLm1heChmWzBdLE1hdGgubWluKGZbMV0sbikpKT09PXQuaz90Om5ldyBvYihuLHQueCx0LnkpfWZ1bmN0aW9uIGIodCxuLGUpe3ZhciByPW5bMF0tZVswXSp0LmssaT1uWzFdLWVbMV0qdC5rO3JldHVybiByPT09dC54JiZpPT09dC55P3Q6bmV3IG9iKHQuayxyLGkpfWZ1bmN0aW9uIG0odCl7cmV0dXJuWygrdFswXVswXSsgK3RbMV1bMF0pLzIsKCt0WzBdWzFdKyArdFsxXVsxXSkvMl19ZnVuY3Rpb24geCh0LG4sZSl7dC5vbigic3RhcnQuem9vbSIsZnVuY3Rpb24oKXt3KHRoaXMsYXJndW1lbnRzKS5zdGFydCgpfSkub24oImludGVycnVwdC56b29tIGVuZC56b29tIixmdW5jdGlvbigpe3codGhpcyxhcmd1bWVudHMpLmVuZCgpfSkudHdlZW4oInpvb20iLGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLHI9dyh0aGlzLHQpLG89aS5hcHBseSh0aGlzLHQpLGE9ZXx8bShvKSx1PU1hdGgubWF4KG9bMV1bMF0tb1swXVswXSxvWzFdWzFdLW9bMF1bMV0pLGY9dGhpcy5fX3pvb20sYz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsdCk6bixzPWwoZi5pbnZlcnQoYSkuY29uY2F0KHUvZi5rKSxjLmludmVydChhKS5jb25jYXQodS9jLmspKTtyZXR1cm4gZnVuY3Rpb24odCl7aWYoMT09PXQpdD1jO2Vsc2V7dmFyIG49cyh0KSxlPXUvblsyXTt0PW5ldyBvYihlLGFbMF0tblswXSplLGFbMV0tblsxXSplKX1yLnpvb20obnVsbCx0KX19KX1mdW5jdGlvbiB3KHQsbil7Zm9yKHZhciBlLHI9MCxpPWgubGVuZ3RoO3I8aTsrK3IpaWYoKGU9aFtyXSkudGhhdD09PXQpcmV0dXJuIGU7cmV0dXJuIG5ldyBNKHQsbil9ZnVuY3Rpb24gTSh0LG4pe3RoaXMudGhhdD10LHRoaXMuYXJncz1uLHRoaXMuaW5kZXg9LTEsdGhpcy5hY3RpdmU9MCx0aGlzLmV4dGVudD1pLmFwcGx5KHQsbil9ZnVuY3Rpb24gQSgpe2lmKHIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdD13KHRoaXMsYXJndW1lbnRzKSxuPXRoaXMuX196b29tLGU9TWF0aC5tYXgoZlswXSxNYXRoLm1pbihmWzFdLG4uaypNYXRoLnBvdygyLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpKSkpLGk9RnQodGhpcyk7aWYodC53aGVlbCl0Lm1vdXNlWzBdWzBdPT09aVswXSYmdC5tb3VzZVswXVsxXT09PWlbMV18fCh0Lm1vdXNlWzFdPW4uaW52ZXJ0KHQubW91c2VbMF09aSkpLGNsZWFyVGltZW91dCh0LndoZWVsKTtlbHNle2lmKG4uaz09PWUpcmV0dXJuO3QubW91c2U9W2ksbi5pbnZlcnQoaSldLE5yKHRoaXMpLHQuc3RhcnQoKX1jYigpLHQud2hlZWw9c2V0VGltZW91dChmdW5jdGlvbigpe3Qud2hlZWw9bnVsbCx0LmVuZCgpfSx2KSx0Lnpvb20oIm1vdXNlIixvKGIoXyhuLGUpLHQubW91c2VbMF0sdC5tb3VzZVsxXSksdC5leHRlbnQsYykpfX1mdW5jdGlvbiBUKCl7aWYoIWUmJnIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj13KHRoaXMsYXJndW1lbnRzKSxpPUR0KHQuZXZlbnQudmlldykub24oIm1vdXNlbW92ZS56b29tIixmdW5jdGlvbigpe2lmKGNiKCksIW4ubW92ZWQpe3ZhciBlPXQuZXZlbnQuY2xpZW50WC11LHI9dC5ldmVudC5jbGllbnRZLWY7bi5tb3ZlZD1lKmUrcipyPmd9bi56b29tKCJtb3VzZSIsbyhiKG4udGhhdC5fX3pvb20sbi5tb3VzZVswXT1GdChuLnRoYXQpLG4ubW91c2VbMV0pLG4uZXh0ZW50LGMpKX0sITApLm9uKCJtb3VzZXVwLnpvb20iLGZ1bmN0aW9uKCl7aS5vbigibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tIixudWxsKSxHdCh0LmV2ZW50LnZpZXcsbi5tb3ZlZCksY2IoKSxuLmVuZCgpfSwhMCksYT1GdCh0aGlzKSx1PXQuZXZlbnQuY2xpZW50WCxmPXQuZXZlbnQuY2xpZW50WTtYdCh0LmV2ZW50LnZpZXcpLGZiKCksbi5tb3VzZT1bYSx0aGlzLl9fem9vbS5pbnZlcnQoYSldLE5yKHRoaXMpLG4uc3RhcnQoKX19ZnVuY3Rpb24gTigpe2lmKHIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj10aGlzLl9fem9vbSxlPUZ0KHRoaXMpLGE9bi5pbnZlcnQoZSksdT1uLmsqKHQuZXZlbnQuc2hpZnRLZXk/LjU6MiksZj1vKGIoXyhuLHUpLGUsYSksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYyk7Y2IoKSxzPjA/RHQodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKHMpLmNhbGwoeCxmLGUpOkR0KHRoaXMpLmNhbGwoeS50cmFuc2Zvcm0sZil9fWZ1bmN0aW9uIFMoKXtpZihyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIGUsaSxvLGEsdT13KHRoaXMsYXJndW1lbnRzKSxmPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsYz1mLmxlbmd0aDtmb3IoZmIoKSxpPTA7aTxjOysraSlhPVthPUl0KHRoaXMsZiwobz1mW2ldKS5pZGVudGlmaWVyKSx0aGlzLl9fem9vbS5pbnZlcnQoYSksby5pZGVudGlmaWVyXSx1LnRvdWNoMD91LnRvdWNoMXx8KHUudG91Y2gxPWEpOih1LnRvdWNoMD1hLGU9ITApO2lmKG4mJihuPWNsZWFyVGltZW91dChuKSwhdS50b3VjaDEpKXJldHVybiB1LmVuZCgpLHZvaWQoKGE9RHQodGhpcykub24oImRibGNsaWNrLnpvb20iKSkmJmEuYXBwbHkodGhpcyxhcmd1bWVudHMpKTtlJiYobj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bj1udWxsfSxwKSxOcih0aGlzKSx1LnN0YXJ0KCkpfX1mdW5jdGlvbiBFKCl7dmFyIGUscixpLGEsdT13KHRoaXMsYXJndW1lbnRzKSxmPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMscz1mLmxlbmd0aDtmb3IoY2IoKSxuJiYobj1jbGVhclRpbWVvdXQobikpLGU9MDtlPHM7KytlKWk9SXQodGhpcyxmLChyPWZbZV0pLmlkZW50aWZpZXIpLHUudG91Y2gwJiZ1LnRvdWNoMFsyXT09PXIuaWRlbnRpZmllcj91LnRvdWNoMFswXT1pOnUudG91Y2gxJiZ1LnRvdWNoMVsyXT09PXIuaWRlbnRpZmllciYmKHUudG91Y2gxWzBdPWkpO2lmKHI9dS50aGF0Ll9fem9vbSx1LnRvdWNoMSl7dmFyIGw9dS50b3VjaDBbMF0saD11LnRvdWNoMFsxXSxkPXUudG91Y2gxWzBdLHA9dS50b3VjaDFbMV0sdj0odj1kWzBdLWxbMF0pKnYrKHY9ZFsxXS1sWzFdKSp2LGc9KGc9cFswXS1oWzBdKSpnKyhnPXBbMV0taFsxXSkqZztyPV8ocixNYXRoLnNxcnQodi9nKSksaT1bKGxbMF0rZFswXSkvMiwobFsxXStkWzFdKS8yXSxhPVsoaFswXStwWzBdKS8yLChoWzFdK3BbMV0pLzJdfWVsc2V7aWYoIXUudG91Y2gwKXJldHVybjtpPXUudG91Y2gwWzBdLGE9dS50b3VjaDBbMV19dS56b29tKCJ0b3VjaCIsbyhiKHIsaSxhKSx1LmV4dGVudCxjKSl9ZnVuY3Rpb24gaygpe3ZhciBuLHIsaT13KHRoaXMsYXJndW1lbnRzKSxvPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsYT1vLmxlbmd0aDtmb3IoZmIoKSxlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZT1udWxsfSxwKSxuPTA7bjxhOysrbilyPW9bbl0saS50b3VjaDAmJmkudG91Y2gwWzJdPT09ci5pZGVudGlmaWVyP2RlbGV0ZSBpLnRvdWNoMDppLnRvdWNoMSYmaS50b3VjaDFbMl09PT1yLmlkZW50aWZpZXImJmRlbGV0ZSBpLnRvdWNoMTtpLnRvdWNoMSYmIWkudG91Y2gwJiYoaS50b3VjaDA9aS50b3VjaDEsZGVsZXRlIGkudG91Y2gxKSxpLnRvdWNoMD9pLnRvdWNoMFsxXT10aGlzLl9fem9vbS5pbnZlcnQoaS50b3VjaDBbMF0pOmkuZW5kKCl9cmV0dXJuIHkudHJhbnNmb3JtPWZ1bmN0aW9uKHQsbil7dmFyIGU9dC5zZWxlY3Rpb24/dC5zZWxlY3Rpb24oKTp0O2UucHJvcGVydHkoIl9fem9vbSIsaGIpLHQhPT1lP3godCxuKTplLmludGVycnVwdCgpLmVhY2goZnVuY3Rpb24oKXt3KHRoaXMsYXJndW1lbnRzKS5zdGFydCgpLnpvb20obnVsbCwiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuKS5lbmQoKX0pfSx5LnNjYWxlQnk9ZnVuY3Rpb24odCxuKXt5LnNjYWxlVG8odCxmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fem9vbS5rKigiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuKX0pfSx5LnNjYWxlVG89ZnVuY3Rpb24odCxuKXt5LnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyksZT10aGlzLl9fem9vbSxyPW0odCksYT1lLmludmVydChyKSx1PSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm47cmV0dXJuIG8oYihfKGUsdSkscixhKSx0LGMpfSl9LHkudHJhbnNsYXRlQnk9ZnVuY3Rpb24odCxuLGUpe3kudHJhbnNmb3JtKHQsZnVuY3Rpb24oKXtyZXR1cm4gbyh0aGlzLl9fem9vbS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6biwiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplKSxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjKX0pfSx5LnRyYW5zbGF0ZVRvPWZ1bmN0aW9uKHQsbixlKXt5LnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cykscj10aGlzLl9fem9vbSxhPW0odCk7cmV0dXJuIG8oYWIudHJhbnNsYXRlKGFbMF0sYVsxXSkuc2NhbGUoci5rKS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIG4/LW4uYXBwbHkodGhpcyxhcmd1bWVudHMpOi1uLCJmdW5jdGlvbiI9PXR5cGVvZiBlPy1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTotZSksdCxjKX0pfSxNLnByb3RvdHlwZT17c3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gMT09Kyt0aGlzLmFjdGl2ZSYmKHRoaXMuaW5kZXg9aC5wdXNoKHRoaXMpLTEsdGhpcy5lbWl0KCJzdGFydCIpKSx0aGlzfSx6b29tOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMubW91c2UmJiJtb3VzZSIhPT10JiYodGhpcy5tb3VzZVsxXT1uLmludmVydCh0aGlzLm1vdXNlWzBdKSksdGhpcy50b3VjaDAmJiJ0b3VjaCIhPT10JiYodGhpcy50b3VjaDBbMV09bi5pbnZlcnQodGhpcy50b3VjaDBbMF0pKSx0aGlzLnRvdWNoMSYmInRvdWNoIiE9PXQmJih0aGlzLnRvdWNoMVsxXT1uLmludmVydCh0aGlzLnRvdWNoMVswXSkpLHRoaXMudGhhdC5fX3pvb209bix0aGlzLmVtaXQoInpvb20iKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09LS10aGlzLmFjdGl2ZSYmKGguc3BsaWNlKHRoaXMuaW5kZXgsMSksdGhpcy5pbmRleD0tMSx0aGlzLmVtaXQoImVuZCIpKSx0aGlzfSxlbWl0OmZ1bmN0aW9uKHQpe0N0KG5ldyBpYih5LHQsdGhpcy50aGF0Ll9fem9vbSksZC5hcHBseSxkLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LHkud2hlZWxEZWx0YT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnJiKCt0KSx5KTphfSx5LmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnJiKCEhdCkseSk6cn0seS50b3VjaGFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpyYighIXQpLHkpOnV9LHkuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6cmIoW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLHkpOml9LHkuc2NhbGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGZbMF09K3RbMF0sZlsxXT0rdFsxXSx5KTpbZlswXSxmWzFdXX0seS50cmFuc2xhdGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGNbMF1bMF09K3RbMF1bMF0sY1sxXVswXT0rdFsxXVswXSxjWzBdWzFdPSt0WzBdWzFdLGNbMV1bMV09K3RbMV1bMV0seSk6W1tjWzBdWzBdLGNbMF1bMV1dLFtjWzFdWzBdLGNbMV1bMV1dXX0seS5jb25zdHJhaW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89dCx5KTpvfSx5LmR1cmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0LHkpOnN9LHkuaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9dCx5KTpsfSx5Lm9uPWZ1bmN0aW9uKCl7dmFyIHQ9ZC5vbi5hcHBseShkLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1kP3k6dH0seS5jbGlja0Rpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPSh0PSt0KSp0LHkpOk1hdGguc3FydChnKX0seX0sdC56b29tVHJhbnNmb3JtPXViLHQuem9vbUlkZW50aXR5PWFiLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNvbG9yLXNjYWxlL3BhbGV0dGVzLmpzCnZhciBYbzsKKGZ1bmN0aW9uKGEpe2EucGFsZXR0ZXM9e2dvb2dsZVN0YW5kYXJkOiIjZGI0NDM3ICNmZjcwNDMgI2Y0YjQwMCAjMGY5ZDU4ICMwMDc5NmIgIzAwYWNjMSAjNDI4NWY0ICM1YzZiYzAgI2FiNDdiYyIuc3BsaXQoIiAiKSxnb29nbGVDb29sOiIjOWU5ZDI0ICMwZjlkNTggIzAwNzk2YiAjMDBhY2MxICM0Mjg1ZjQgIzVjNmJjMCAjNjA3ZDhiIi5zcGxpdCgiICIpLGdvb2dsZVdhcm06IiM3OTU1NDggI2FiNDdiYyAjZjA2MjkyICNjMjE4NWIgI2RiNDQzNyAjZmY3MDQzICNmNGI0MDAiLnNwbGl0KCIgIiksZ29vZ2xlQ29sb3JCbGluZEFzc2lzdDoiI2ZmNzA0MyAjMDBBQ0MxICNBQjQ3QkMgIzJBNTZDNiAjMGI4MDQzICNGN0NCNEQgI2MwY2EzMyAjNWUzNWIxICNBNTI3MTQiLnNwbGl0KCIgIiksdGVuc29yYm9hcmRDb2xvckJsaW5kQXNzaXN0OiIjZmY3MDQzICMwMDc3YmIgI2NjMzMxMSAjMzNiYmVlICNlZTMzNzcgIzAwOTk4OCAjYmJiYmJiIi5zcGxpdCgiICIpLGNvbG9yQmxpbmRBc3Npc3QxOiIjNDQ3N2FhICM0NGFhYWEgI2FhYWE0NCAjYWE3NzQ0ICNhYTQ0NTUgI2FhNDQ4OCIuc3BsaXQoIiAiKSxjb2xvckJsaW5kQXNzaXN0MjoiIzg4Y2NlZSAjNDRhYTk5ICMxMTc3MzMgIzk5OTkzMyAjZGRjYzc3ICNjYzY2NzcgIzg4MjI1NSAjYWE0NDk5Ii5zcGxpdCgiICIpLApjb2xvckJsaW5kQXNzaXN0MzoiIzMzMjI4OCAjNjY5OWNjICM4OGNjZWUgIzQ0YWE5OSAjMTE3NzMzICM5OTk5MzMgI2RkY2M3NyAjY2M2Njc3ICNhYTQ0NjYgIzg4MjI1NSAjNjYxMTAwICNhYTQ0OTkiLnNwbGl0KCIgIiksY29sb3JCbGluZEFzc2lzdDQ6IiM0NDc3YWEgIzY2Y2NlZSAjMjI4ODMzICNjY2JiNDQgI2VlNjY3NyAjYWEzMzc3ICNiYmJiYmIiLnNwbGl0KCIgIiksY29sb3JCbGluZEFzc2lzdDU6IiNGRjZEQjYgIzkyMDAwMCAjOTI0OTAwICNEQkQxMDAgIzI0RkYyNCAjMDA2RERCICM0OTAwOTIiLnNwbGl0KCIgIiksbWxkYXNoOiIjRTQ3RUFEICNGNDY0MEQgI0ZBQTMwMCAjRjVFNjM2ICMwMEEwNzcgIzAwNzdCOCAjMDBCN0VEIi5zcGxpdCgiICIpfTthLnN0YW5kYXJkPWEucGFsZXR0ZXMudGVuc29yYm9hcmRDb2xvckJsaW5kQXNzaXN0fSkoWG98fChYbz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNvbG9yLXNjYWxlL2NvbG9yU2NhbGUuanMKKGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoZixnKXtmdW5jdGlvbiBsKCl7ay5zZXREb21haW4oZygpKX1jb25zdCBrPW5ldyBkO2YuYWRkTGlzdGVuZXIobCk7bCgpO3JldHVybiBuPT5rLmdldENvbG9yKG4pfWNsYXNzIGR7Y29uc3RydWN0b3IoZj1hLnN0YW5kYXJkKXt0aGlzLnBhbGV0dGU9Zjt0aGlzLmlkZW50aWZpZXJzPWQzLm1hcCgpfXNldERvbWFpbihmKXt0aGlzLmlkZW50aWZpZXJzPWQzLm1hcCgpO2YuZm9yRWFjaCgoZyxsKT0+e3RoaXMuaWRlbnRpZmllcnMuc2V0KGcsdGhpcy5wYWxldHRlW2wldGhpcy5wYWxldHRlLmxlbmd0aF0pfSl9Z2V0Q29sb3IoZil7aWYoIXRoaXMuaWRlbnRpZmllcnMuaGFzKGYpKXRocm93IEVycm9yKGBTdHJpbmcgJHtmfSB3YXMgbm90IGluIHRoZSBkb21haW4uYCk7cmV0dXJuIHRoaXMuaWRlbnRpZmllcnMuZ2V0KGYpfX1hLkNvbG9yU2NhbGU9ZDthLnJ1bnNDb2xvclNjYWxlPWMoUW8ucnVuc1N0b3JlLCgpPT5Rby5ydW5zU3RvcmUuZ2V0UnVucygpKTsKYS5leHBlcmltZW50c0NvbG9yU2NhbGU9YyhRby5leHBlcmltZW50c1N0b3JlLCgpPT5Rby5leHBlcmltZW50c1N0b3JlLmdldEV4cGVyaW1lbnRzKCkubWFwKCh7bmFtZTpmfSk9PmYpKX0pKFhvfHwoWG89e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1pY29uLWJ1dHRvbi9wYXBlci1pY29uLWJ1dHRvbi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1pY29uLWJ1dHRvbiIsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImJ1dHRvbiIsdGFiaW5kZXg6IjAifSxiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvcl0scHJvcGVydGllczp7c3JjOnt0eXBlOlN0cmluZ30saWNvbjp7dHlwZTpTdHJpbmd9LGFsdDp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9hbHRDaGFuZ2VkIn19LF9hbHRDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9dGhpcy5nZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiKTtkJiZjIT1kfHx0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsYSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1tdWx0aS1jaGVja2JveC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtbXVsdGktY2hlY2tib3giLHByb3BlcnRpZXM6e25hbWVzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sY29sb3Jpbmc6e3R5cGU6T2JqZWN0LHZhbHVlOntnZXRDb2xvcjooKT0+IiJ9fSxyZWdleDp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLHZhbHVlOiIifSxfcmVnZXg6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfbWFrZVJlZ2V4KHJlZ2V4KSJ9LG5hbWVzTWF0Y2hpbmdSZWdleDp7dHlwZTpBcnJheSxjb21wdXRlZDoiY29tcHV0ZU5hbWVzTWF0Y2hpbmdSZWdleChuYW1lcy4qLCBfcmVnZXgpIn0sc2VsZWN0aW9uU3RhdGU6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTooKT0+KHt9KX0sb3V0U2VsZWN0ZWQ6e3R5cGU6QXJyYXksbm90aWZ5OiEwLGNvbXB1dGVkOiJjb21wdXRlT3V0U2VsZWN0ZWQobmFtZXNNYXRjaGluZ1JlZ2V4LiosIHNlbGVjdGlvblN0YXRlLiopIn0sbWF4TmFtZXNUb0VuYWJsZUJ5RGVmYXVsdDp7dHlwZTpOdW1iZXIsCnZhbHVlOjQwfSxfZGVib3VuY2VkUmVnZXhDaGFuZ2U6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGE9Xy5kZWJvdW5jZShjPT57dGhpcy5yZWdleD1jfSwxNTAse2xlYWRpbmc6ITF9KTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYz10aGlzLiQkKCIjbmFtZXMtcmVnZXgiKS52YWx1ZTsiIj09Yz90aGlzLmFzeW5jKCgpPT57dGhpcy5yZWdleD1jfSwzMCk6YShjKX19fX0sb2JzZXJ2ZXJzOlsiX3NldElzb2xhdG9ySWNvbihzZWxlY3Rpb25TdGF0ZSwgbmFtZXMpIl0sX21ha2VSZWdleDpmdW5jdGlvbihhKXt0cnl7cmV0dXJuIG5ldyBSZWdFeHAoYSl9Y2F0Y2goYyl7cmV0dXJuIG51bGx9fSxfc2V0SXNvbGF0b3JJY29uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZWxlY3Rpb25TdGF0ZSxjPV8uZmlsdGVyKF8udmFsdWVzKGEpKS5sZW5ndGg7QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pc29sYXRvciIpKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2QuaWNvbj0KMT09PWMmJmFbZC5uYW1lXT8icmFkaW8tYnV0dG9uLWNoZWNrZWQiOiJyYWRpby1idXR0b24tdW5jaGVja2VkIn0pfSxjb21wdXRlTmFtZXNNYXRjaGluZ1JlZ2V4OmZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLl9yZWdleDtyZXR1cm4gYT90aGlzLm5hbWVzLmZpbHRlcihjPT5hLnRlc3QoYykpOnRoaXMubmFtZXN9LGNvbXB1dGVPdXRTZWxlY3RlZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2VsZWN0aW9uU3RhdGUsYz10aGlzLm5hbWVzTWF0Y2hpbmdSZWdleC5sZW5ndGg8PXRoaXMubWF4TmFtZXNUb0VuYWJsZUJ5RGVmYXVsdDtyZXR1cm4gdGhpcy5uYW1lc01hdGNoaW5nUmVnZXguZmlsdGVyKGQ9Pm51bGw9PWFbZF0/YzphW2RdKX0sc3luY2hyb25pemVDb2xvcnM6ZnVuY3Rpb24oKXt0aGlzLl9zZXRJc29sYXRvckljb24oKTt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgicGFwZXItY2hlY2tib3giKS5mb3JFYWNoKGE9Pntjb25zdCBjPXRoaXMuY29sb3JpbmcuZ2V0Q29sb3IoYS5uYW1lKTsKYS51cGRhdGVTdHlsZXMoeyItLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3IiOmMsIi0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3IiOmMsIi0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yIjpjLCItLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3IiOmN9KX0pO3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuaXNvbGF0b3IiKS5mb3JFYWNoKGE9Pntjb25zdCBjPXRoaXMuY29sb3JpbmcuZ2V0Q29sb3IoYS5uYW1lKTthLnN0eWxlLmNvbG9yPWN9KTt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy51cGRhdGVTdHlsZXMoKX0pfSxfaXNvbGF0ZU5hbWU6ZnVuY3Rpb24oYSl7dmFyIGM9UG9seW1lci5kb20oYSkubG9jYWxUYXJnZXQubmFtZSxkPXt9O3RoaXMubmFtZXMuZm9yRWFjaChmdW5jdGlvbihmKXtkW2ZdPWY9PWN9KTt0aGlzLnNlbGVjdGlvblN0YXRlPWR9LF9jaGVja2JveENoYW5nZTpmdW5jdGlvbihhKXthPQpQb2x5bWVyLmRvbShhKS5sb2NhbFRhcmdldDtjb25zdCBjPV8uY2xvbmUodGhpcy5zZWxlY3Rpb25TdGF0ZSk7Y1thLm5hbWVdPWEuY2hlY2tlZDt0aGlzLnNlbGVjdGlvblN0YXRlPWN9LF9pc0NoZWNrZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuLTEhPXRoaXMub3V0U2VsZWN0ZWQuaW5kZXhPZihhKX0sdG9nZ2xlQWxsOmZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLm5hbWVzTWF0Y2hpbmdSZWdleC5zb21lKGQ9PnRoaXMub3V0U2VsZWN0ZWQuaW5jbHVkZXMoZCkpLGM9e307dGhpcy5uYW1lcy5mb3JFYWNoKGQ9PntjW2RdPSFhfSk7dGhpcy5zZWxlY3Rpb25TdGF0ZT1jfX0pfSkoVW98fChVbz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXJ1bnMtc2VsZWN0b3IvdGYtd2JyLXN0cmluZy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi13YnItc3RyaW5nIixwcm9wZXJ0aWVzOnt2YWx1ZTpTdHJpbmcsX3BhcnRzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZVBhcnRzKHZhbHVlKSJ9fSxfY29tcHV0ZVBhcnRzKGEpe2NvbnN0IGM9W10sZD0vWy89XywtXS87Zm9yKG51bGw9PWEmJihhPSIiKTs7KXtjb25zdCBmPWEuc2VhcmNoKGQpO2lmKC0xPT09Zil7Yy5wdXNoKGEpO2JyZWFrfWVsc2UgYy5wdXNoKGEuc2xpY2UoMCxmKzEpKSxhPWEuc2xpY2UoZisxKX1yZXR1cm4gY319KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ydW5zLXNlbGVjdG9yL3RmLXJ1bnMtc2VsZWN0b3IuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtcnVucy1zZWxlY3RvciIscHJvcGVydGllczp7cnVuU2VsZWN0aW9uU3RhdGU6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfc3RvcmVSdW5TZWxlY3Rpb25TdGF0ZSIsdmFsdWU6VG8uZ2V0T2JqZWN0SW5pdGlhbGl6ZXIoInJ1blNlbGVjdGlvblN0YXRlIix7ZGVmYXVsdFZhbHVlOnt9fSl9LHJlZ2V4SW5wdXQ6e3R5cGU6U3RyaW5nLHZhbHVlOlRvLmdldFN0cmluZ0luaXRpYWxpemVyKCJyZWdleElucHV0Iix7ZGVmYXVsdFZhbHVlOiIifSksb2JzZXJ2ZXI6Il9yZWdleE9ic2VydmVyIn0sc2VsZWN0ZWRSdW5zOnt0eXBlOkFycmF5LG5vdGlmeTohMH0scnVuczpBcnJheSxkYXRhTG9jYXRpb246e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2NsaXBwZWREYXRhTG9jYXRpb246e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0Q2xpcHBlZERhdGFMb2NhdGlvbihkYXRhTG9jYXRpb24sIF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoKSJ9LF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoOnt0eXBlOk51bWJlciwKdmFsdWU6MjUwLHJlYWRPbmx5OiEwfSxjb2xvcmluZzp7dHlwZTpPYmplY3QsdmFsdWU6e2dldENvbG9yOlhvLnJ1bnNDb2xvclNjYWxlfX19LGF0dGFjaGVkKCl7dGhpcy5fcnVuU3RvcmVMaXN0ZW5lcj1Rby5ydW5zU3RvcmUuYWRkTGlzdGVuZXIoKCk9Pnt0aGlzLnNldCgicnVucyIsUW8ucnVuc1N0b3JlLmdldFJ1bnMoKSl9KTt0aGlzLnNldCgicnVucyIsUW8ucnVuc1N0b3JlLmdldFJ1bnMoKSk7dGhpcy5fZW52U3RvcmVMaXN0ZW5lcj1Rby5lbnZpcm9ubWVudFN0b3JlLmFkZExpc3RlbmVyKCgpPT57dGhpcy5zZXQoImRhdGFMb2NhdGlvbiIsUW8uZW52aXJvbm1lbnRTdG9yZS5nZXREYXRhTG9jYXRpb24oKSl9KTt0aGlzLnNldCgiZGF0YUxvY2F0aW9uIixRby5lbnZpcm9ubWVudFN0b3JlLmdldERhdGFMb2NhdGlvbigpKX0sZGV0YWNoZWQoKXtRby5ydW5zU3RvcmUucmVtb3ZlTGlzdGVuZXJCeUtleSh0aGlzLl9ydW5TdG9yZUxpc3RlbmVyKTtRby5lbnZpcm9ubWVudFN0b3JlLnJlbW92ZUxpc3RlbmVyQnlLZXkodGhpcy5fZW52U3RvcmVMaXN0ZW5lcil9LApfdG9nZ2xlQWxsOmZ1bmN0aW9uKCl7dGhpcy4kLm11bHRpQ2hlY2tib3gudG9nZ2xlQWxsKCl9LF9nZXRDbGlwcGVkRGF0YUxvY2F0aW9uOmZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwIT09YSYmIShhLmxlbmd0aD5jKSlyZXR1cm4gYX0sX29wZW5EYXRhTG9jYXRpb25EaWFsb2c6ZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuJCQoIiNkYXRhLWxvY2F0aW9uLWRpYWxvZyIpLm9wZW4oKX0sX3Nob3VsZFNob3dFeHBhbmREYXRhTG9jYXRpb25CdXR0b24oYSxjKXtyZXR1cm4gYSYmYS5sZW5ndGg+Y30sX3N0b3JlUnVuU2VsZWN0aW9uU3RhdGU6VG8uZ2V0T2JqZWN0T2JzZXJ2ZXIoInJ1blNlbGVjdGlvblN0YXRlIix7ZGVmYXVsdFZhbHVlOnt9fSksX3JlZ2V4T2JzZXJ2ZXI6VG8uZ2V0U3RyaW5nT2JzZXJ2ZXIoInJlZ2V4SW5wdXQiLHtkZWZhdWx0VmFsdWU6IiJ9KX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRlbnNvcmJvYXJkL3JlZ2lzdHJ5LmpzCnZhciBZbzsKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXtjLk5PVF9MT0FERUQ9Ik5PVF9MT0FERUQiO2MuTE9BREVEPSJMT0FERUQiO2MuRkFJTEVEPSJGQUlMRUQifSkoYS5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlfHwoYS5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlPXt9KSk7YS5kYXNoYm9hcmRSZWdpc3RyeT17fTthLnJlZ2lzdGVyRGFzaGJvYXJkPWZ1bmN0aW9uKGMpe2lmKCFjLnBsdWdpbil0aHJvdyBFcnJvcigiRGFzaGJvYXJkLnBsdWdpbiBtdXN0IGJlIHByZXNlbnQiKTtpZighYy5lbGVtZW50TmFtZSl0aHJvdyBFcnJvcigiRGFzaGJvYXJkLmVsZW1lbnROYW1lIG11c3QgYmUgcHJlc2VudCIpO2lmKGMucGx1Z2luIGluIGEuZGFzaGJvYXJkUmVnaXN0cnkpdGhyb3cgRXJyb3IoYFBsdWdpbiBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7Yy5wbHVnaW59YCk7Yy50YWJOYW1lfHwoYy50YWJOYW1lPWMucGx1Z2luKTthLmRhc2hib2FyZFJlZ2lzdHJ5W2MucGx1Z2luXT1jfX0pKFlvfHwoWW89Cnt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtdXRpbHMvdXRpbHMuanMKdmFyIFpvOwooZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhkLGYsZyl7cmV0dXJuIDE9PT1kP2Y6Z31hLmFnZ3JlZ2F0ZVRhZ0luZm89ZnVuY3Rpb24oZCxmKXtsZXQgZz12b2lkIDA7Y29uc3QgbD17fTtPYmplY3Qua2V5cyhkKS5mb3JFYWNoKG49Pntjb25zdCBwPWRbbl07dm9pZCAwPT09ZyYmKGc9cC5kaXNwbGF5TmFtZSk7ZyE9PXAuZGlzcGxheU5hbWUmJihnPW51bGwpO3ZvaWQgMD09PWxbcC5kZXNjcmlwdGlvbl0mJihsW3AuZGVzY3JpcHRpb25dPVtdKTtsW3AuZGVzY3JpcHRpb25dLnB1c2gobil9KTtmPW51bGwhPWc/ZzpmO2NvbnN0IGs9KCgpPT57Y29uc3Qgbj1PYmplY3Qua2V5cyhsKTtyZXR1cm4gMD09PW4ubGVuZ3RoPyIiOjE9PT1uLmxlbmd0aD9uWzBdOmAkeyJceDNjcFx4M2VceDNjc3Ryb25nXHgzZU11bHRpcGxlIGRlc2NyaXB0aW9uczpceDNjL3N0cm9uZ1x4M2VceDNjL3BceDNlIn08dWw+JHtuLm1hcChwPT57Y29uc3QgcT1sW3BdLm1hcCh0PT5gPGNvZGU+JHt0LnJlcGxhY2UoLzwvZywiXHgyNmx0OyIpLnJlcGxhY2UoLz4vZywKIlx4MjZndDsiKS5yZXBsYWNlKC8mL2csIlx4MjZhbXA7Iil9PC9jb2RlPmApLHI9MjxxLmxlbmd0aD9xLnNsaWNlKDAscS5sZW5ndGgtMSkuam9pbigiLCAiKSsiLCBhbmQgIitxW3EubGVuZ3RoLTFdOnEuam9pbigiIGFuZCAiKTtyZXR1cm5gPGxpPjxwPkZvciAke2MocS5sZW5ndGgsInJ1biIsInJ1bnMiKX0gJHtyfTo8L3A+JHtwfTwvbGk+YH0pLmpvaW4oIiIpfTwvdWw+YH0pKCk7cmV0dXJue2Rpc3BsYXlOYW1lOmYsZGVzY3JpcHRpb246a319fSkoWm98fChabz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXNwaW5uZXIvcGFwZXItc3Bpbm5lci1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJTcGlubmVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxvYnNlcnZlcjoiX19hY3RpdmVDaGFuZ2VkIn0sYWx0Ont0eXBlOlN0cmluZyx2YWx1ZToibG9hZGluZyIsb2JzZXJ2ZXI6Il9fYWx0Q2hhbmdlZCJ9LF9fY29vbGluZ0Rvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LF9fY29tcHV0ZUNvbnRhaW5lckNsYXNzZXM6ZnVuY3Rpb24oYSxjKXtyZXR1cm5bYXx8Yz8iYWN0aXZlIjoiIixjPyJjb29sZG93biI6IiJdLmpvaW4oIiAiKX0sX19hY3RpdmVDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7dGhpcy5fX3NldEFyaWFIaWRkZW4oIWEpO3RoaXMuX19jb29saW5nRG93bj0hYSYmY30sX19hbHRDaGFuZ2VkOmZ1bmN0aW9uKGEpeyJsb2FkaW5nIj09PWE/dGhpcy5hbHQ9dGhpcy5nZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiKXx8YToodGhpcy5fX3NldEFyaWFIaWRkZW4oIiI9PT0KYSksdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLGEpKX0sX19zZXRBcmlhSGlkZGVuOmZ1bmN0aW9uKGEpe2E/dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpfSxfX3Jlc2V0OmZ1bmN0aW9uKCl7dGhpcy5fX2Nvb2xpbmdEb3duPXRoaXMuYWN0aXZlPSExfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItc3Bpbm5lci9wYXBlci1zcGlubmVyLWxpdGUuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItc3Bpbm5lci1saXRlIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJTcGlubmVyQmVoYXZpb3JdfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi9kYXRhLWxvYWRlci1iZWhhdmlvci5qcwooZnVuY3Rpb24oYSl7bGV0IGM7KGZ1bmN0aW9uKGQpe2RbZC5MT0FESU5HPTBdPSJMT0FESU5HIjtkW2QuTE9BREVEPTFdPSJMT0FERUQifSkoY3x8KGM9e30pKTthLkRhdGFMb2FkZXJCZWhhdmlvcj17cHJvcGVydGllczp7YWN0aXZlOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9sb2FkRGF0YUlmQWN0aXZlIn0sbG9hZEtleTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LGRhdGFUb0xvYWQ6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxnZXREYXRhTG9hZE5hbWU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9PmQ9PlN0cmluZyhkKX0sbG9hZERhdGFDYWxsYmFjazpGdW5jdGlvbixyZXF1ZXN0RGF0YTp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBkPT50aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodGhpcy5nZXREYXRhTG9hZFVybChkKSl9fSxnZXREYXRhTG9hZFVybDpGdW5jdGlvbixkYXRhTG9hZGluZzp7dHlwZTpCb29sZWFuLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCwKdmFsdWU6ITF9LF9kYXRhTG9hZFN0YXRlOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IE1hcH0sX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBRby5DYW5jZWxsZXJ9LF9sb2FkRGF0YUFzeW5jOnt0eXBlOk51bWJlcix2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX2RhdGFUb0xvYWRDaGFuZ2VkKGlzQXR0YWNoZWQsIGRhdGFUb0xvYWQuKikiXSxvbkxvYWRGaW5pc2goKXt9LHJlbG9hZCgpe3RoaXMuX2RhdGFMb2FkU3RhdGUuY2xlYXIoKTt0aGlzLl9sb2FkRGF0YSgpfSxyZXNldCgpe251bGwhPXRoaXMuX2xvYWREYXRhQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2xvYWREYXRhQXN5bmMpLHRoaXMuX2xvYWREYXRhQXN5bmM9bnVsbCk7dGhpcy5fY2FuY2VsbGVyJiZ0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7dGhpcy5fZGF0YUxvYWRTdGF0ZSYmdGhpcy5fZGF0YUxvYWRTdGF0ZS5jbGVhcigpO3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbG9hZERhdGEoKX0sCl9kYXRhVG9Mb2FkQ2hhbmdlZCgpe3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbG9hZERhdGEoKX0sY3JlYXRlZCgpe3RoaXMuX2xvYWREYXRhPV8udGhyb3R0bGUodGhpcy5fbG9hZERhdGFJbXBsLDEwMCx7bGVhZGluZzohMCx0cmFpbGluZzohMH0pfSxkZXRhY2hlZCgpe251bGwhPXRoaXMuX2xvYWREYXRhQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2xvYWREYXRhQXN5bmMpLHRoaXMuX2xvYWREYXRhQXN5bmM9bnVsbCl9LF9sb2FkRGF0YUlmQWN0aXZlKCl7dGhpcy5hY3RpdmUmJnRoaXMuX2xvYWREYXRhKCl9LF9sb2FkRGF0YUltcGwoKXt0aGlzLmFjdGl2ZSYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fbG9hZERhdGFBc3luYyksdGhpcy5fbG9hZERhdGFBc3luYz10aGlzLmFzeW5jKHRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShkPT57aWYoIWQuY2FuY2VsbGVkKXJldHVybiB0aGlzLl9zZXREYXRhTG9hZGluZyghMCksZD10aGlzLmRhdGFUb0xvYWQuZmlsdGVyKGY9Pgp7Zj10aGlzLmdldERhdGFMb2FkTmFtZShmKTtyZXR1cm4hdGhpcy5fZGF0YUxvYWRTdGF0ZS5oYXMoZil9KS5tYXAoZj0+e2NvbnN0IGc9dGhpcy5nZXREYXRhTG9hZE5hbWUoZik7dGhpcy5fZGF0YUxvYWRTdGF0ZS5zZXQoZyxjLkxPQURJTkcpO3JldHVybiB0aGlzLnJlcXVlc3REYXRhKGYpLnRoZW4odGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKGw9PntsLmNhbmNlbGxlZHx8KHRoaXMuX2RhdGFMb2FkU3RhdGUuc2V0KGcsYy5MT0FERUQpLHRoaXMubG9hZERhdGFDYWxsYmFjayh0aGlzLGYsbC52YWx1ZSkpO3JldHVybiBnfSkpfSksUHJvbWlzZS5hbGwoZCkudGhlbih0aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoZj0+e2lmKCFmLmNhbmNlbGxlZCl7Y29uc3QgZz1uZXcgU2V0KGYudmFsdWUpO2lmKHRoaXMuZGF0YVRvTG9hZC5zb21lKGw9PmcuaGFzKHRoaXMuZ2V0RGF0YUxvYWROYW1lKGwpKSkpdGhpcy5vbkxvYWRGaW5pc2goKX1BcnJheS5mcm9tKHRoaXMuX2RhdGFMb2FkU3RhdGUudmFsdWVzKCkpLnNvbWUoZz0+Cmc9PT1jLkxPQURJTkcpfHx0aGlzLl9zZXREYXRhTG9hZGluZyghMSl9KSwoKT0+e30pLnRoZW4odGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKCh7Y2FuY2VsbGVkOmZ9KT0+e2Z8fCh0aGlzLl9sb2FkRGF0YUFzeW5jPW51bGwpfSkpfSkpKX19fSkoVW98fChVbz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltcG9ydHMvcGxvdHRhYmxlLmpzCi8qCiBNSVQKIE1JVAogQGZpbGVvdmVydmlldyBJbXBsZW1lbnRzIHRoZSBTaWduYXR1cmUgQVBJIHRvIGhlbHAgaW4gY29tcGFyaW5nIHdoZW4gdHdvCiBQbG90dGFibGUgb2JqZWN0cyBoYXZlICJjaGFuZ2VkIi4KCiBNZW1vaXphdGlvbiBpbiBQbG90dGFibGUgaXMgY29tcGxpY2F0ZWQgYnkgbXV0YWJsZSBzY2FsZXMgYW5kIGRhdGFzZXRzLiBXZSBjYW5ub3Qgc2ltcGx5CiByZWZlcmVuY2UgY29tcGFyZSB0d28gZS5nLiBzY2FsZXMgc2luY2UgaXQgbWF5IGhhdmUgaW50ZXJuYWxseSBtdXRhdGVkLiBUbyByZXNvbHZlIHRoaXMsCiB3ZSB3cml0ZSBhIHJlY3Vyc2l2ZSBTaWduYXR1cmUgaW50ZXJmYWNlIHRoYXQgaG9sZHMgYW4gaW1tdXRhYmxlIHNuYXBzaG90IG9mIHdoYXRldmVyCiBzdGF0ZSB0aGUgc2NhbGUvZGF0YSB3YXMgaW4gYXQgdGhlIHRpbWUuIFRoZW4gb24gbWVtb2l6ZWQgZnVuY3Rpb24gaW52b2NhdGlvbiB3ZSBzaWduIHRoZQogbmV3IGlucHV0cyBhbmQgY29tcGFyZSB0aGUgc2lnbmF0dXJlcyB0byBkZWNpZGUgaWYgd2Ugc2hvdWxkIHJlY29tcHV0ZS4KCiBXZSBtdXN0IGhhbmQtd3JpdGUgYSBzaWduYXR1cmUgZm9yIGVhY2ggY3VzdG9tIGNsYXNzIHdlIHdpc2ggdG8gc3VwcG9ydC4KIE1JVAoKIEBmaWxlb3ZlcnZpZXcgbWFudWFsbHkgYWRkIGQzLXNlbGVjdGlvbi1tdWx0aSB0byBkMyBkZWZhdWx0IGJ1bmRsZS4gTW9zdCBvZiB0aGlzIGNvZGUgaXMKIGNvcGllZCBmcm9tIGQzLXNlbGVjdGlvbi1tdWx0aUAxLjAuMC4KIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZDMvZDMtc2VsZWN0aW9uLW11bHRpL2lzc3Vlcy8xMSBmb3Igd2h5IHdlIGhhdmUgdG8gZG8gdGhpcwogTUlUCiBAZmlsZW92ZXJ2aWV3IEltcGxlbWVudHMgYSBjb252ZW5pZW50IHRodW5rIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgY29tbW9uIGNhc2UKIG9mIGNyZWF0aW5nIGEgbWVtb2l6ZWQgZnVuY3Rpb24gdGhhdCB0YWtlcyBpdHMgaW5wdXRzIGZyb20gbXV0YWJsZSBjbGFzcyBwcm9wZXJ0aWVzLgogTUlUCiBAZmlsZW92ZXJ2aWV3IEltcGxlbWVudHMgYSBmdW5jdGlvbiBtZW1vaXplciB1c2luZyB0aGUgU2lnbmF0dXJlIEFQSS4KIFBsb3R0YWJsZSAzLjcuMCAoaHR0cHM6Ly9naXRodWIuY29tL3BhbGFudGlyL3Bsb3R0YWJsZSkKIENvcHlyaWdodCAyMDE0LTIwMTcgUGFsYW50aXIgVGVjaG5vbG9naWVzCiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS9wYWxhbnRpci9wbG90dGFibGUvYmxvYi9tYXN0ZXIvTElDRU5TRSkKIGlzLXBsYWluLW9iamVjdCA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvaXMtcGxhaW4tb2JqZWN0PgoKIENvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBKb24gU2NobGlua2VydC4KIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KIGlzb2JqZWN0IDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pc29iamVjdD4KCiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNywgSm9uIFNjaGxpbmtlcnQuCiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuCiovCihmdW5jdGlvbihhLGMpeyJvYmplY3QiPT09dHlwZW9mIGV4cG9ydHMmJiJvYmplY3QiPT09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1jKHJlcXVpcmUoImQzIikpOiJmdW5jdGlvbiI9PT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImQzIl0sYyk6Im9iamVjdCI9PT10eXBlb2YgZXhwb3J0cz9leHBvcnRzLlBsb3R0YWJsZT1jKHJlcXVpcmUoImQzIikpOmEuUGxvdHRhYmxlPWMoYS5kMyl9KSh0aGlzLGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihjKXtmdW5jdGlvbiBkKGcpe2lmKGZbZ10pcmV0dXJuIGZbZ10uZXhwb3J0czt2YXIgbD1mW2ddPXtpOmcsbDohMSxleHBvcnRzOnt9fTtjW2ddLmNhbGwobC5leHBvcnRzLGwsbC5leHBvcnRzLGQpO2wubD0hMDtyZXR1cm4gbC5leHBvcnRzfXZhciBmPXt9O2QubT1jO2QuYz1mO2QuaT1mdW5jdGlvbihnKXtyZXR1cm4gZ307ZC5kPWZ1bmN0aW9uKGcsbCxrKXtkLm8oZyxsKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGcsCmwse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLGdldDprfSl9O2Qubj1mdW5jdGlvbihnKXt2YXIgbD1nJiZnLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gZ1siZGVmYXVsdCJdfTpmdW5jdGlvbigpe3JldHVybiBnfTtkLmQobCwiYSIsbCk7cmV0dXJuIGx9O2Qubz1mdW5jdGlvbihnLGwpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZyxsKX07ZC5wPSIiO3JldHVybiBkKGQucz0xNDApfShbZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcobCl7Zm9yKHZhciBrIGluIGwpZC5oYXNPd25Qcm9wZXJ0eShrKXx8KGRba109bFtrXSl9Yz1mKDEwNyk7ZC5BcnJheT1jO2M9ZigxMTApO2QuQ29sb3I9YztjPWYoNTUpO2QuRE9NPWM7Yz1mKDU2KTtkLk1hdGg9YztjPWYoMTEzKTtkLk9iamVjdD1jO2M9Zig1Nyk7ZC5SVHJlZT1jO2M9ZigxMTUpO2QuU3RhY2tpbmc9YztjPWYoMzUpO2QuV2luZG93PWM7ZyhmKDEwOCkpO2coZigxMDkpKTtnKGYoMTIpKTsKZyhmKDExMSkpO2coZigxMTIpKTtnKGYoNTgpKTtnKGYoMTE2KSl9LGZ1bmN0aW9uKGMpe2MuZXhwb3J0cz1hfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhGLEQsQil7dmFyIEk9RC5hY2Nlc3NvcjtEPUQuc2NhbGU7aWYobnVsbD09RClyZXR1cm5bXTt2YXIgTz1GLmRhdGEoKTtudWxsIT1CJiYoTz1PLmZpbHRlcihmdW5jdGlvbihQLEgpe3JldHVybiBCKFAsSCxGKX0pKTtPPU8ubWFwKGZ1bmN0aW9uKFAsSCl7cmV0dXJuIEkoUCxILEYpfSk7cmV0dXJuIEQuZXh0ZW50T2ZWYWx1ZXMoTyl9dmFyIGw9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKEYsRCl7ZnVuY3Rpb24gQigpe3RoaXMuY29uc3RydWN0b3I9Rn1mb3IodmFyIEkgaW4gRClELmhhc093blByb3BlcnR5KEkpJiYoRltJXT1EW0ldKTtGLnByb3RvdHlwZT1udWxsPT09RD9PYmplY3QuY3JlYXRlKEQpOihCLnByb3RvdHlwZT1ELnByb3RvdHlwZSxuZXcgQil9LGs9ZigxKSxuPWYoNyk7Yz1mKDQpO3ZhciBwPQpmKDE4KSxxPWYoNikscj1mKDkpLHQ9ZigyMCksdj1mKDApLHk9ZigxMiksej1mKDEwKSx4PWYoNTEpLEM9Zig1Mik7ZC5SZW5kZXJlcj16Lm1ha2VFbnVtKFsic3ZnIiwiY2FudmFzIl0pO2Y9ZnVuY3Rpb24oRil7ZnVuY3Rpb24gRCgpe3ZhciBCPUYuY2FsbCh0aGlzKXx8dGhpcztCLl9kYXRhQ2hhbmdlZD0hMTtCLl9hdHRyRXh0ZW50cz17fTtCLl9hbmltYXRlPSExO0IuX2FuaW1hdG9ycz17fTtCLl9wcm9wZXJ0eUV4dGVudHM9e307Qi5fcmVzZXRFbnRpdHlTdG9yZT1mdW5jdGlvbigpe0IuX2NhY2hlZEVudGl0eVN0b3JlPXZvaWQgMH07Qi5fb3ZlcmZsb3dIaWRkZW49ITA7Qi5hZGRDbGFzcygicGxvdCIpO0IuX2RhdGFzZXRUb0RyYXdlcj1uZXcgdi5NYXA7Qi5fYXR0ckJpbmRpbmdzPWsubWFwKCk7Qi5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcj1mdW5jdGlvbihPLFApe3JldHVybiBCLl9pbmNsdWRlZFZhbHVlc0ZvclNjYWxlKE8sUCl9O0IuX3JlbmRlckNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIEIucmVuZGVyKCl9OwpCLl9vbkRhdGFzZXRVcGRhdGVDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBCLl9vbkRhdGFzZXRVcGRhdGUoKX07Qi5fcHJvcGVydHlCaW5kaW5ncz1rLm1hcCgpO3ZhciBJPShuZXcgbi5FYXNpbmcpLm1heFRvdGFsRHVyYXRpb24oRC5fQU5JTUFUSU9OX01BWF9EVVJBVElPTik7Qi5hbmltYXRvcih4LkFuaW1hdG9yLk1BSU4sSSk7Qi5hbmltYXRvcih4LkFuaW1hdG9yLlJFU0VULG5ldyBuLk51bGwpO0IuX2RlZmVycmVkUmVzZXRFbnRpdHlTdG9yZT12LldpbmRvdy5kZWJvdW5jZShDLkRlZmVycmVkUmVuZGVyZXIuREVGRVJSRURfUkVOREVSSU5HX0RFTEFZLEIuX3Jlc2V0RW50aXR5U3RvcmUpO3JldHVybiBCfWwoRCxGKTtELmdldFRvdGFsRHJhd1RpbWU9ZnVuY3Rpb24oQixJKXtyZXR1cm4gSS5yZWR1Y2UoZnVuY3Rpb24oTyxQKXtyZXR1cm4gTytQLmFuaW1hdG9yLnRvdGFsVGltZShCLmxlbmd0aCl9LDApfTtELmFwcGx5RHJhd1N0ZXBzPWZ1bmN0aW9uKEIsSSl7cmV0dXJuIEIubWFwKGZ1bmN0aW9uKE8pe3ZhciBQPQpPLmF0dHJUb1Byb2plY3RvcixIPXt9O09iamVjdC5rZXlzKFApLmZvckVhY2goZnVuY3Rpb24oSyl7SFtLXT1mdW5jdGlvbihNLEwpe3JldHVybiBQW0tdKE0sTCxJKX19KTtyZXR1cm57YXR0clRvQXBwbGllZFByb2plY3RvcjpILGFuaW1hdG9yOk8uYW5pbWF0b3J9fSl9O0QucHJvdG90eXBlLmFuY2hvcj1mdW5jdGlvbihCKXtCPXkuY29lcmNlRXh0ZXJuYWxEMyhCKTtGLnByb3RvdHlwZS5hbmNob3IuY2FsbCh0aGlzLEIpO3RoaXMuX2RhdGFDaGFuZ2VkPSEwO3RoaXMuX3Jlc2V0RW50aXR5U3RvcmUoKTt0aGlzLl91cGRhdGVFeHRlbnRzKCk7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3ZhciBCPXRoaXM7dGhpcy5faXNTZXR1cHx8KEYucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpLG51bGwhPXRoaXMuX2NhbnZhcyYmdGhpcy5fYXBwZW5kQ2FudmFzTm9kZSgpLHRoaXMuX3JlbmRlckFyZWE9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgicmVuZGVyLWFyZWEiLAohMCksdGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oSSl7cmV0dXJuIEIuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldChJKX0pKX07RC5wcm90b3R5cGUuX2FwcGVuZENhbnZhc05vZGU9ZnVuY3Rpb24oKXt2YXIgQj10aGlzLmVsZW1lbnQoKS5zZWxlY3QoIi5wbG90LWNhbnZhcy1jb250YWluZXIiKTtCLmVtcHR5KCkmJihCPXRoaXMuZWxlbWVudCgpLmFwcGVuZCgiZGl2IikuY2xhc3NlZCgicGxvdC1jYW52YXMtY29udGFpbmVyIiwhMCksQi5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fY2FudmFzLm5vZGUoKSkpfTtELnByb3RvdHlwZS5zZXRCb3VuZHM9ZnVuY3Rpb24oQixJLE8sUCl7Ri5wcm90b3R5cGUuc2V0Qm91bmRzLmNhbGwodGhpcyxCLEksTyxQKTt0aGlzLl9yZXNldEVudGl0eVN0b3JlKCk7bnVsbCE9dGhpcy5fY2FudmFzJiYodGhpcy5fYnVmZmVyQ2FudmFzJiYhdGhpcy5fYnVmZmVyQ2FudmFzVmFsaWQmJih0aGlzLl9idWZmZXJDYW52YXMuYXR0cigid2lkdGgiLAp0aGlzLl9jYW52YXMuYXR0cigid2lkdGgiKSksdGhpcy5fYnVmZmVyQ2FudmFzLmF0dHIoImhlaWdodCIsdGhpcy5fY2FudmFzLmF0dHIoImhlaWdodCIpKSwoTz10aGlzLl9idWZmZXJDYW52YXMubm9kZSgpLmdldENvbnRleHQoIjJkIikpJiZPLmRyYXdJbWFnZSh0aGlzLl9jYW52YXMubm9kZSgpLDAsMCksdGhpcy5fYnVmZmVyQ2FudmFzVmFsaWQ9ITApLE89bnVsbCE9d2luZG93LmRldmljZVBpeGVsUmF0aW8/d2luZG93LmRldmljZVBpeGVsUmF0aW86MSx0aGlzLl9jYW52YXMuYXR0cigid2lkdGgiLEIqTyksdGhpcy5fY2FudmFzLmF0dHIoImhlaWdodCIsSSpPKSxQPXRoaXMuX2NhbnZhcy5ub2RlKCkuZ2V0Q29udGV4dCgiMmQiKSkmJihQLnNldFRyYW5zZm9ybShPLDAsMCxPLDAsMCksdGhpcy5fYnVmZmVyQ2FudmFzJiZQLmRyYXdJbWFnZSh0aGlzLl9idWZmZXJDYW52YXMubm9kZSgpLDAsMCxCLEkpKX07RC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBCPXRoaXM7CkYucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9zY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEkpe3JldHVybiBJLm9mZlVwZGF0ZShCLl9yZW5kZXJDYWxsYmFjayl9KTt0aGlzLmRhdGFzZXRzKFtdKX07RC5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldD1mdW5jdGlvbihCKXtCPXRoaXMuX2RhdGFzZXRUb0RyYXdlci5nZXQoQik7InN2ZyI9PT10aGlzLnJlbmRlcmVyKCk/Qi51c2VTVkcodGhpcy5fcmVuZGVyQXJlYSk6Qi51c2VDYW52YXModGhpcy5fY2FudmFzKTtyZXR1cm4gQn07RC5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbigpe3JldHVybiBuZXcgcS5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgci5TVkdEcmF3ZXIoInBhdGgiLCIiKX0sZnVuY3Rpb24oQil7cmV0dXJuIG5ldyBwLkNhbnZhc0RyYXdlcihCLGZ1bmN0aW9uKCl7fSl9KX07RC5wcm90b3R5cGUuX2dldEFuaW1hdG9yPWZ1bmN0aW9uKEIpe3JldHVybiB0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCk/CnRoaXMuX2FuaW1hdG9yc1tCXXx8bmV3IG4uTnVsbDpuZXcgbi5OdWxsfTtELnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlRXh0ZW50cygpO3RoaXMuX2RhdGFDaGFuZ2VkPSEwO3RoaXMuX3Jlc2V0RW50aXR5U3RvcmUoKTt0aGlzLnJlbmRlckxvd1ByaW9yaXR5KCl9O0QucHJvdG90eXBlLmF0dHI9ZnVuY3Rpb24oQixJLE8pe2lmKG51bGw9PUkpcmV0dXJuIHRoaXMuX2F0dHJCaW5kaW5ncy5nZXQoQik7dGhpcy5fYmluZEF0dHIoQixJLE8pO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLl9iaW5kUHJvcGVydHk9ZnVuY3Rpb24oQixJLE8sUCl7dmFyIEg9dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoQik7SD1udWxsIT1IP0guc2NhbGU6bnVsbDt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLnNldChCLHthY2Nlc3NvcjoiZnVuY3Rpb24iPT09dHlwZW9mIEk/STpmdW5jdGlvbigpe3JldHVybiBJfSxzY2FsZTpPLHBvc3RTY2FsZTpQfSk7Cm51bGwhPUgmJnRoaXMuX3VuaW5zdGFsbFNjYWxlRm9yS2V5KEgsQik7bnVsbCE9TyYmdGhpcy5faW5zdGFsbFNjYWxlRm9yS2V5KE8sQik7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpfTtELnByb3RvdHlwZS5fYmluZEF0dHI9ZnVuY3Rpb24oQixJLE8pe3ZhciBQPXRoaXMuX2F0dHJCaW5kaW5ncy5nZXQoQik7UD1udWxsIT1QP1Auc2NhbGU6bnVsbDt0aGlzLl9hdHRyQmluZGluZ3Muc2V0KEIse2FjY2Vzc29yOiJmdW5jdGlvbiI9PT10eXBlb2YgST9JOmZ1bmN0aW9uKCl7cmV0dXJuIEl9LHNjYWxlOk99KTtudWxsIT1QJiZ0aGlzLl91bmluc3RhbGxTY2FsZUZvcktleShQLEIpO251bGwhPU8mJnRoaXMuX2luc3RhbGxTY2FsZUZvcktleShPLEIpO3RoaXMuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGUoKX07RC5wcm90b3R5cGUuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGU9ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yfTtELnByb3RvdHlwZS5fZ2V0QXR0clRvUHJvamVjdG9yPQpmdW5jdGlvbigpe251bGw9PXRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3RvciYmKHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3Rvcj10aGlzLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3RvcigpKTtyZXR1cm4gdi5PYmplY3QuYXNzaWduKHt9LHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3Rvcil9O0QucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe3ZhciBCPXt9O3RoaXMuX2F0dHJCaW5kaW5ncy5lYWNoKGZ1bmN0aW9uKE8sUCl7QltQXT1ELl9zY2FsZWRBY2Nlc3NvcihPKX0pO3ZhciBJPXRoaXMuX3Byb3BlcnR5UHJvamVjdG9ycygpO09iamVjdC5rZXlzKEkpLmZvckVhY2goZnVuY3Rpb24oTyl7bnVsbD09QltPXSYmKEJbT109SVtPXSl9KTtyZXR1cm4gQn07RC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtGLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3RoaXMuX2lzQW5jaG9yZWQmJih0aGlzLl9wYWludCgpLAp0aGlzLl9kYXRhQ2hhbmdlZD0hMSk7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLnJlbmRlckxvd1ByaW9yaXR5PWZ1bmN0aW9uKCl7dGhpcy5fcmVuZGVyQ2FsbGJhY2soKX07RC5wcm90b3R5cGUuYW5pbWF0ZWQ9ZnVuY3Rpb24oQil7aWYobnVsbD09QilyZXR1cm4gdGhpcy5fYW5pbWF0ZTt0aGlzLl9hbmltYXRlPUI7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe0YucHJvdG90eXBlLmRldGFjaC5jYWxsKHRoaXMpO3RoaXMuX3VwZGF0ZUV4dGVudHMoKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX3NjYWxlcz1mdW5jdGlvbigpe3ZhciBCPVtdO3RoaXMuX2F0dHJCaW5kaW5ncy5lYWNoKGZ1bmN0aW9uKEkpe0k9SS5zY2FsZTtudWxsIT1JJiYtMT09PUIuaW5kZXhPZihJKSYmQi5wdXNoKEkpfSk7dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5lYWNoKGZ1bmN0aW9uKEkpe0k9SS5zY2FsZTtudWxsIT1JJiYtMT09PUIuaW5kZXhPZihJKSYmQi5wdXNoKEkpfSk7CnJldHVybiBCfTtELnByb3RvdHlwZS5fdXBkYXRlRXh0ZW50cz1mdW5jdGlvbigpe3ZhciBCPXRoaXM7dGhpcy5fcmVzZXRFbnRpdHlTdG9yZSgpO3RoaXMuX3NjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oSSl7cmV0dXJuIEkuYWRkSW5jbHVkZWRWYWx1ZXNQcm92aWRlcihCLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKX0pfTtELnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH07RC5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvckF0dHI9ZnVuY3Rpb24oQil7dmFyIEk9dGhpcztudWxsPT10aGlzLl9hdHRyRXh0ZW50c1tCXSYmKHRoaXMuX2F0dHJFeHRlbnRzW0JdPXQubWVtVGh1bmsoZnVuY3Rpb24oKXtyZXR1cm4gSS5kYXRhc2V0cygpfSxmdW5jdGlvbigpe3JldHVybiBJLl9hdHRyQmluZGluZ3MuZ2V0KEIpfSxmdW5jdGlvbihPLFApe3JldHVybiBudWxsPT1QfHxudWxsPT1QLmFjY2Vzc29yP251bGw6Ty5tYXAoZnVuY3Rpb24oSCl7cmV0dXJuIGcoSCwKUCxudWxsKX0pfSkpO3JldHVybiB0aGlzLl9hdHRyRXh0ZW50c1tCXSgpfTtELnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oQil7dmFyIEk9dGhpcztudWxsPT10aGlzLl9wcm9wZXJ0eUV4dGVudHNbQl0mJih0aGlzLl9wcm9wZXJ0eUV4dGVudHNbQl09dC5tZW1UaHVuayhmdW5jdGlvbigpe3JldHVybiBJLmRhdGFzZXRzKCl9LGZ1bmN0aW9uKCl7cmV0dXJuIEkuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KEIpfSxmdW5jdGlvbigpe3JldHVybiBJLl9maWx0ZXJGb3JQcm9wZXJ0eShCKX0sZnVuY3Rpb24oTyxQLEgpe3JldHVybiBudWxsPT1QfHxudWxsPT1QLmFjY2Vzc29yP251bGw6Ty5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIGcoSyxQLEgpfSl9KSk7cmV0dXJuIHRoaXMuX3Byb3BlcnR5RXh0ZW50c1tCXSgpfTtELnByb3RvdHlwZS5faW5jbHVkZWRWYWx1ZXNGb3JTY2FsZT1mdW5jdGlvbihCLEkpe3ZhciBPPXRoaXM7aWYoIXRoaXMuX2lzQW5jaG9yZWQmJgohSSlyZXR1cm5bXTt2YXIgUD1bXTt0aGlzLl9hdHRyQmluZGluZ3MuZWFjaChmdW5jdGlvbihILEspe0guc2NhbGU9PT1CJiYoSD1PLmdldEV4dGVudHNGb3JBdHRyKEspLG51bGwhPUgmJihQPVAuY29uY2F0KGsubWVyZ2UoSCkpKSl9KTt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmVhY2goZnVuY3Rpb24oSCxLKXtILnNjYWxlPT09QiYmKEg9Ty5nZXRFeHRlbnRzRm9yUHJvcGVydHkoSyksbnVsbCE9SCYmKFA9UC5jb25jYXQoay5tZXJnZShIKSkpKX0pO3JldHVybiBQfTtELnByb3RvdHlwZS5hbmltYXRvcj1mdW5jdGlvbihCLEkpe2lmKHZvaWQgMD09PUkpcmV0dXJuIHRoaXMuX2FuaW1hdG9yc1tCXTt0aGlzLl9hbmltYXRvcnNbQl09STtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUucmVuZGVyZXI9ZnVuY3Rpb24oQil7dmFyIEk9dGhpcztpZih2b2lkIDA9PT1CKXJldHVybiBudWxsPT10aGlzLl9jYW52YXM/InN2ZyI6ImNhbnZhcyI7bnVsbD09dGhpcy5fY2FudmFzJiYiY2FudmFzIj09PQpCPyh0aGlzLl9jYW52YXM9ay5zZWxlY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIikpLmNsYXNzZWQoInBsb3QtY2FudmFzIiwhMCksdGhpcy5fYnVmZmVyQ2FudmFzPWsuc2VsZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpKSxudWxsIT10aGlzLmVsZW1lbnQoKSYmdGhpcy5fYXBwZW5kQ2FudmFzTm9kZSgpLHRoaXMuX2RhdGFzZXRUb0RyYXdlci5mb3JFYWNoKGZ1bmN0aW9uKE8pe08udXNlQ2FudmFzKEkuX2NhbnZhcyl9KSx0aGlzLnJlbmRlcigpKTpudWxsIT10aGlzLl9jYW52YXMmJiJzdmciPT1CJiYodGhpcy5fY2FudmFzLnJlbW92ZSgpLHRoaXMuX2J1ZmZlckNhbnZhcz10aGlzLl9jYW52YXM9bnVsbCx0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZm9yRWFjaChmdW5jdGlvbihPKXtPLnVzZVNWRyhJLl9yZW5kZXJBcmVhKX0pLHRoaXMucmVuZGVyKCkpO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5hZGREYXRhc2V0PWZ1bmN0aW9uKEIpe3RoaXMuX2FkZERhdGFzZXQoQik7CnRoaXMuX29uRGF0YXNldFVwZGF0ZSgpO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5fYWRkRGF0YXNldD1mdW5jdGlvbihCKXt0aGlzLl9yZW1vdmVEYXRhc2V0KEIpO3ZhciBJPXRoaXMuX2NyZWF0ZURyYXdlcihCKTt0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuc2V0KEIsSSk7dGhpcy5faXNTZXR1cCYmdGhpcy5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0KEIpO0Iub25VcGRhdGUodGhpcy5fb25EYXRhc2V0VXBkYXRlQ2FsbGJhY2spO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKEIpe3RoaXMuX3JlbW92ZURhdGFzZXQoQik7dGhpcy5fb25EYXRhc2V0VXBkYXRlKCl9O0QucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKEIpe2lmKC0xPT09dGhpcy5kYXRhc2V0cygpLmluZGV4T2YoQikpcmV0dXJuIHRoaXM7dGhpcy5fcmVtb3ZlRGF0YXNldE5vZGVzKEIpO0Iub2ZmVXBkYXRlKHRoaXMuX29uRGF0YXNldFVwZGF0ZUNhbGxiYWNrKTt0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZGVsZXRlKEIpOwpyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcz1mdW5jdGlvbihCKXt0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZ2V0KEIpLnJlbW92ZSgpfTtELnByb3RvdHlwZS5kYXRhc2V0cz1mdW5jdGlvbihCKXt2YXIgST10aGlzLE89W107dGhpcy5fZGF0YXNldFRvRHJhd2VyLmZvckVhY2goZnVuY3Rpb24oUCxIKXtyZXR1cm4gTy5wdXNoKEgpfSk7aWYobnVsbD09QilyZXR1cm4gTztPLmZvckVhY2goZnVuY3Rpb24oUCl7cmV0dXJuIEkuX3JlbW92ZURhdGFzZXQoUCl9KTtCLmZvckVhY2goZnVuY3Rpb24oUCl7cmV0dXJuIEkuX2FkZERhdGFzZXQoUCl9KTt0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7cmV0dXJuW3thdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6bmV3IG4uTnVsbH1dfTtELnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PQpmdW5jdGlvbigpe307RC5wcm90b3R5cGUuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXM9ZnVuY3Rpb24oQil7dmFyIEk9dGhpcyxPPVtdO0IuZm9yRWFjaChmdW5jdGlvbihQLEgpe3ZhciBLPUkuX2RhdGFzZXRUb0RyYXdlci5nZXQoUCksTT0wO1AuZGF0YSgpLmZvckVhY2goZnVuY3Rpb24oTCxSKXt2YXIgVT1JLl9waXhlbFBvaW50KEwsUixQKTt2Lk1hdGguaXNOYU4oVS54KXx8di5NYXRoLmlzTmFOKFUueSl8fChPLnB1c2goe2RhdHVtOkwsZ2V0IHBvc2l0aW9uKCl7cmV0dXJuIEkuX3BpeGVsUG9pbnQuY2FsbChJLEwsUixQKX0saW5kZXg6UixkYXRhc2V0OlAsZGF0YXNldEluZGV4OkgsY29tcG9uZW50OkksZHJhd2VyOkssdmFsaWREYXR1bUluZGV4Ok19KSxNKyspfSl9KTtyZXR1cm4gT307RC5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXt2YXIgQj1uZXcgdi5NYXA7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oSSl7cmV0dXJuIEIuc2V0KEksCkkuZGF0YSgpKX0pO3JldHVybiBCfTtELnByb3RvdHlwZS5fcGFpbnQ9ZnVuY3Rpb24oKXt2YXIgQj10aGlzO2RlbGV0ZSB0aGlzLl9jYWNoZWRBdHRyVG9Qcm9qZWN0b3I7dmFyIEk9dGhpcy5fZ2VuZXJhdGVEcmF3U3RlcHMoKSxPPXRoaXMuX2dldERhdGFUb0RyYXcoKSxQPXRoaXMuZGF0YXNldHMoKS5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIEIuX2RhdGFzZXRUb0RyYXdlci5nZXQoSyl9KTtpZigiY2FudmFzIj09PXRoaXMucmVuZGVyZXIoKSl7dmFyIEg9dGhpcy5fY2FudmFzLm5vZGUoKTtILmdldENvbnRleHQoIjJkIikuY2xlYXJSZWN0KDAsMCxILmNsaWVudFdpZHRoLEguY2xpZW50SGVpZ2h0KTt0aGlzLl9idWZmZXJDYW52YXNWYWxpZD0hMX10aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihLLE0pe3ZhciBMPUQuYXBwbHlEcmF3U3RlcHMoSSxLKTtQW01dLmRyYXcoTy5nZXQoSyksTCl9KTtIPXRoaXMuZGF0YXNldHMoKS5tYXAoZnVuY3Rpb24oSyl7cmV0dXJuIEQuZ2V0VG90YWxEcmF3VGltZShPLmdldChLKSwKSSl9KTtIPXYuTWF0aC5tYXgoSCwwKTt0aGlzLl9hZGRpdGlvbmFsUGFpbnQoSCl9O0QucHJvdG90eXBlLnNlbGVjdGlvbnM9ZnVuY3Rpb24oQil7dmFyIEk9dGhpczt2b2lkIDA9PT1CJiYoQj10aGlzLmRhdGFzZXRzKCkpO2lmKCJjYW52YXMiPT09dGhpcy5yZW5kZXJlcigpKXJldHVybiBrLnNlbGVjdEFsbCgpO3ZhciBPPVtdO0IuZm9yRWFjaChmdW5jdGlvbihQKXtQPUkuX2RhdGFzZXRUb0RyYXdlci5nZXQoUCk7bnVsbCE9UCYmKFA9UC5nZXRWaXN1YWxQcmltaXRpdmVzKCksTy5wdXNoLmFwcGx5KE8sUCkpfSk7cmV0dXJuIGsuc2VsZWN0QWxsKE8pfTtELnByb3RvdHlwZS5lbnRpdGllcz1mdW5jdGlvbihCKXt2YXIgST10aGlzO3JldHVybiB0aGlzLl9nZXRFbnRpdHlTdG9yZShCKS5lbnRpdGllcygpLm1hcChmdW5jdGlvbihPKXtyZXR1cm4gSS5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KE8pfSl9O0QucHJvdG90eXBlLl9nZXRFbnRpdHlTdG9yZT1mdW5jdGlvbihCKXtmdW5jdGlvbiBJKEgpe3JldHVybiBPLl9lbnRpdHlCb3VuZHMoSCl9CnZhciBPPXRoaXM7aWYodm9pZCAwIT09Qil7dmFyIFA9bmV3IHYuRW50aXR5U3RvcmU7UC5hZGRBbGwodGhpcy5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcyhCKSxJLHRoaXMuX2xvY2FsT3JpZ2luQm91bmRzKCkpO3JldHVybiBQfXZvaWQgMD09PXRoaXMuX2NhY2hlZEVudGl0eVN0b3JlJiYoUD1uZXcgdi5FbnRpdHlTdG9yZSxQLmFkZEFsbCh0aGlzLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzKHRoaXMuZGF0YXNldHMoKSksSSx0aGlzLl9sb2NhbE9yaWdpbkJvdW5kcygpKSx0aGlzLl9jYWNoZWRFbnRpdHlTdG9yZT1QKTtyZXR1cm4gdGhpcy5fY2FjaGVkRW50aXR5U3RvcmV9O0QucHJvdG90eXBlLl9sb2NhbE9yaWdpbkJvdW5kcz1mdW5jdGlvbigpe3JldHVybnt0b3BMZWZ0Ont4OjAseTowfSxib3R0b21SaWdodDp7eDp0aGlzLndpZHRoKCkseTp0aGlzLmhlaWdodCgpfX19O0QucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oQil7Qj10aGlzLl9waXhlbFBvaW50KEIuZGF0dW0sCkIuaW5kZXgsQi5kYXRhc2V0KTtyZXR1cm57eDpCLngseTpCLnksd2lkdGg6MCxoZWlnaHQ6MH19O0QucHJvdG90eXBlLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHk9ZnVuY3Rpb24oQil7cmV0dXJue2JvdW5kczp0aGlzLl9lbnRpdHlCb3VuZHMoQiksY29tcG9uZW50OkIuY29tcG9uZW50LGRhdGFzZXQ6Qi5kYXRhc2V0LGRhdGFzZXRJbmRleDpCLmRhdGFzZXRJbmRleCxkYXR1bTpCLmRhdHVtLGluZGV4OkIuaW5kZXgscG9zaXRpb246Qi5wb3NpdGlvbixzZWxlY3Rpb246ay5zZWxlY3QoQi5kcmF3ZXIuZ2V0VmlzdWFsUHJpbWl0aXZlcygpW0IudmFsaWREYXR1bUluZGV4XSl9fTtELnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoInBsb3RzIG11c3QgaW1wbGVtZW50IGVudGl0aWVzQXQiKTt9O0QucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24oQil7Qj10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0eU5lYXJlc3QoQik7CnJldHVybiB2b2lkIDA9PT1CP3ZvaWQgMDp0aGlzLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoQil9O0QucHJvdG90eXBlLmVudGl0aWVzSW49ZnVuY3Rpb24oQixJKXtyZXR1cm4gdGhpcy5lbnRpdGllc0luQm91bmRzKG51bGw9PUk/e3g6Qi50b3BMZWZ0LngseTpCLnRvcExlZnQueSx3aWR0aDpCLmJvdHRvbVJpZ2h0LngtQi50b3BMZWZ0LngsaGVpZ2h0OkIuYm90dG9tUmlnaHQueS1CLnRvcExlZnQueX06e3g6Qi5taW4seTpJLm1pbix3aWR0aDpCLm1heC1CLm1pbixoZWlnaHQ6SS5tYXgtSS5taW59KX07RC5wcm90b3R5cGUuZW50aXRpZXNJbkJvdW5kcz1mdW5jdGlvbihCKXt2YXIgST10aGlzO2lmKEI9dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllc0luQm91bmRzKEIpKXJldHVybiBCLm1hcChmdW5jdGlvbihPKXtyZXR1cm4gSS5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KE8pfSl9O0QucHJvdG90eXBlLmVudGl0aWVzSW5YQm91bmRzPQpmdW5jdGlvbihCKXt2YXIgST10aGlzO2lmKEI9dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllc0luWEJvdW5kcyhCKSlyZXR1cm4gQi5tYXAoZnVuY3Rpb24oTyl7cmV0dXJuIEkuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShPKX0pfTtELnByb3RvdHlwZS5lbnRpdGllc0luWUJvdW5kcz1mdW5jdGlvbihCKXt2YXIgST10aGlzO2lmKEI9dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllc0luWUJvdW5kcyhCKSlyZXR1cm4gQi5tYXAoZnVuY3Rpb24oTyl7cmV0dXJuIEkuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShPKX0pfTtELnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24oQil7Qi5vZmZVcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spO0Iub2ZmVXBkYXRlKHRoaXMuX2RlZmVycmVkUmVzZXRFbnRpdHlTdG9yZSk7Qi5yZW1vdmVJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXIpfTsKRC5wcm90b3R5cGUuX2luc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbihCKXtCLm9uVXBkYXRlKHRoaXMuX3JlbmRlckNhbGxiYWNrKTtCLm9uVXBkYXRlKHRoaXMuX2RlZmVycmVkUmVzZXRFbnRpdHlTdG9yZSk7Qi5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXIpfTtELnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7cmV0dXJue319O0QuX3NjYWxlZEFjY2Vzc29yPWZ1bmN0aW9uKEIpe3ZhciBJPUIuc2NhbGUsTz1CLmFjY2Vzc29yLFA9Qi5wb3N0U2NhbGUsSD1udWxsPT1JP086ZnVuY3Rpb24oSyxNLEwpe3JldHVybiBJLnNjYWxlKE8oSyxNLEwpKX07cmV0dXJuIG51bGw9PVA/SDpmdW5jdGlvbihLLE0sTCl7cmV0dXJuIFAoSChLLE0sTCksSyxNLEwpfX07RC5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm57eDowLHk6MH19O0QucHJvdG90eXBlLl9hbmltYXRlT25OZXh0UmVuZGVyPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbmltYXRlJiZ0aGlzLl9kYXRhQ2hhbmdlZH07cmV0dXJuIER9KGMuQ29tcG9uZW50KTtmLl9BTklNQVRJT05fTUFYX0RVUkFUSU9OPTYwMDtkLlBsb3Q9Zn0sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcobil7Zm9yKHZhciBwIGluIG4pZC5oYXNPd25Qcm9wZXJ0eShwKXx8KGRbcF09bltwXSl9Yz1mKDEwNSk7ZC5UaWNrR2VuZXJhdG9ycz1jO2coZig1NCkpO2coZigxMDEpKTtnKGYoMTAyKSk7ZyhmKDEwMykpO2coZigxMDQpKTtnKGYoMTA2KSk7dmFyIGw9Zig1NCksaz1mKDExKTtkLmlzVHJhbnNmb3JtYWJsZT1mdW5jdGlvbihuKXtyZXR1cm4gbiBpbnN0YW5jZW9mIGsuUXVhbnRpdGF0aXZlU2NhbGV8fG4gaW5zdGFuY2VvZiBsLkNhdGVnb3J5fX0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoMSksbD1mKDMwKSxrPWYoMCksbj1mKDEyKTtjPWYoMTApO2QuWEFsaWdubWVudD1jLm1ha2VFbnVtKFsibGVmdCIsImNlbnRlciIsInJpZ2h0Il0pOwpkLllBbGlnbm1lbnQ9Yy5tYWtlRW51bShbInRvcCIsImNlbnRlciIsImJvdHRvbSJdKTtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcCgpe3RoaXMuX292ZXJmbG93SGlkZGVuPSExO3RoaXMuX29yaWdpbj17eDowLHk6MH07dGhpcy5feEFsaWdubWVudD0ibGVmdCI7dGhpcy5feUFsaWdubWVudD0idG9wIjt0aGlzLl9pc0FuY2hvcmVkPXRoaXMuX2lzU2V0dXA9ITE7dGhpcy5fY3NzQ2xhc3Nlcz1uZXcgay5TZXQ7dGhpcy5fZGVzdHJveWVkPSExO3RoaXMuX29uQW5jaG9yQ2FsbGJhY2tzPW5ldyBrLkNhbGxiYWNrU2V0O3RoaXMuX29uRGV0YWNoQ2FsbGJhY2tzPW5ldyBrLkNhbGxiYWNrU2V0O3RoaXMuX2Nzc0NsYXNzZXMuYWRkKCJjb21wb25lbnQiKX1wLnByb3RvdHlwZS5hbmNob3I9ZnVuY3Rpb24ocSl7cT1uLmNvZXJjZUV4dGVybmFsRDMocSk7aWYodGhpcy5fZGVzdHJveWVkKXRocm93IEVycm9yKCJDYW4ndCByZXVzZSBkZXN0cm95KCktZWQgQ29tcG9uZW50cyEiKTt0aGlzLmlzUm9vdCgpJiYKKHRoaXMuX3Jvb3RFbGVtZW50PXEsdGhpcy5fcm9vdEVsZW1lbnQuY2xhc3NlZCgicGxvdHRhYmxlIiwhMCkpO251bGwhPXRoaXMuX2VsZW1lbnQ/cS5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fZWxlbWVudC5ub2RlKCkpOih0aGlzLl9lbGVtZW50PXEuYXBwZW5kKCJkaXYiKSx0aGlzLl9zZXR1cCgpKTt0aGlzLl9pc0FuY2hvcmVkPSEwO3RoaXMuX29uQW5jaG9yQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcyk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLm9uQW5jaG9yPWZ1bmN0aW9uKHEpe3RoaXMuX2lzQW5jaG9yZWQmJnEodGhpcyk7dGhpcy5fb25BbmNob3JDYWxsYmFja3MuYWRkKHEpfTtwLnByb3RvdHlwZS5vZmZBbmNob3I9ZnVuY3Rpb24ocSl7dGhpcy5fb25BbmNob3JDYWxsYmFja3MuZGVsZXRlKHEpfTtwLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt2YXIgcT10aGlzO3RoaXMuX2lzU2V0dXB8fCh0aGlzLl9jc3NDbGFzc2VzLmZvckVhY2goZnVuY3Rpb24ocil7cS5fZWxlbWVudC5jbGFzc2VkKHIsCiEwKX0pLHRoaXMuX2Nzc0NsYXNzZXM9bmV3IGsuU2V0LHRoaXMuX2JhY2tncm91bmRDb250YWluZXI9dGhpcy5fZWxlbWVudC5hcHBlbmQoInN2ZyIpLmNsYXNzZWQoImJhY2tncm91bmQtY29udGFpbmVyIiwhMCksdGhpcy5fY29udGVudD10aGlzLl9lbGVtZW50LmFwcGVuZCgic3ZnIikuY2xhc3NlZCgiY29udGVudCIsITApLHRoaXMuX2ZvcmVncm91bmRDb250YWluZXI9dGhpcy5fZWxlbWVudC5hcHBlbmQoInN2ZyIpLmNsYXNzZWQoImZvcmVncm91bmQtY29udGFpbmVyIiwhMCksdGhpcy5fb3ZlcmZsb3dIaWRkZW4/dGhpcy5fY29udGVudC5jbGFzc2VkKCJjb21wb25lbnQtb3ZlcmZsb3ctaGlkZGVuIiwhMCk6dGhpcy5fY29udGVudC5jbGFzc2VkKCJjb21wb25lbnQtb3ZlcmZsb3ctdmlzaWJsZSIsITApLHRoaXMuX2lzU2V0dXA9ITApfTtwLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbigpe3JldHVybnttaW5XaWR0aDowLG1pbkhlaWdodDowfX07cC5wcm90b3R5cGUuY29tcHV0ZUxheW91dD0KZnVuY3Rpb24ocSxyLHQpe2lmKG51bGw9PXF8fG51bGw9PXJ8fG51bGw9PXQpe2lmKG51bGw9PXRoaXMuX2VsZW1lbnQpdGhyb3cgRXJyb3IoImFuY2hvcigpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjb21wdXRlTGF5b3V0KCkiKTtpZihudWxsIT10aGlzLl9yb290RWxlbWVudClxPXt4OjAseTowfSx0PXRoaXMuX3Jvb3RFbGVtZW50Lm5vZGUoKSxyPWsuRE9NLmVsZW1lbnRXaWR0aCh0KSx0PWsuRE9NLmVsZW1lbnRIZWlnaHQodCk7ZWxzZSB0aHJvdyBFcnJvcigibnVsbCBhcmd1bWVudHMgY2Fubm90IGJlIHBhc3NlZCB0byBjb21wdXRlTGF5b3V0KCkgb24gYSBub24tcm9vdCwgdW5hbmNob3JlZCBub2RlIik7fXZhciB2PXRoaXMuX3NpemVGcm9tT2ZmZXIocix0KSx5PXYuaGVpZ2h0O3Y9di53aWR0aDt0aGlzLnNldEJvdW5kcyh2LHkscS54KyhyLXYpKnAuX3hBbGlnblRvUHJvcG9ydGlvblt0aGlzLl94QWxpZ25tZW50XSxxLnkrKHQteSkqcC5feUFsaWduVG9Qcm9wb3J0aW9uW3RoaXMuX3lBbGlnbm1lbnRdKTsKcmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnNldEJvdW5kcz1mdW5jdGlvbihxLHIsdCx2KXt2b2lkIDA9PT10JiYodD0wKTt2b2lkIDA9PT12JiYodj0wKTt0aGlzLl93aWR0aD1xO3RoaXMuX2hlaWdodD1yO3RoaXMuX29yaWdpbj17eDp0LHk6dn07bnVsbCE9dGhpcy5fZWxlbWVudCYmdGhpcy5fZWxlbWVudC5zdHlsZXMoe2xlZnQ6dCsicHgiLGhlaWdodDpyKyJweCIsdG9wOnYrInB4Iix3aWR0aDpxKyJweCJ9KTtudWxsIT10aGlzLl9yZXNpemVIYW5kbGVyJiZ0aGlzLl9yZXNpemVIYW5kbGVyKHt3aWR0aDpxLGhlaWdodDpyfSl9O3AucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHEscil7dmFyIHQ9dGhpcy5yZXF1ZXN0ZWRTcGFjZShxLHIpO3JldHVybnt3aWR0aDp0aGlzLmZpeGVkV2lkdGgoKT9NYXRoLm1pbihxLHQubWluV2lkdGgpOnEsaGVpZ2h0OnRoaXMuZml4ZWRIZWlnaHQoKT9NYXRoLm1pbihyLHQubWluSGVpZ2h0KTpyfX07cC5wcm90b3R5cGUucmVuZGVyPQpmdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2lzU2V0dXAmJjA8PXRoaXMud2lkdGgoKSYmMDw9dGhpcy5oZWlnaHQoKSYmbC5yZWdpc3RlclRvUmVuZGVyKHRoaXMpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5yZW5kZXJMb3dQcmlvcml0eT1mdW5jdGlvbigpe3RoaXMucmVuZGVyKCl9O3AucHJvdG90eXBlLl9zY2hlZHVsZUNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oKXt0aGlzLl9pc0FuY2hvcmVkJiZ0aGlzLl9pc1NldHVwJiZsLnJlZ2lzdGVyVG9Db21wdXRlTGF5b3V0QW5kUmVuZGVyKHRoaXMpfTtwLnByb3RvdHlwZS5vblJlc2l6ZT1mdW5jdGlvbihxKXt0aGlzLl9yZXNpemVIYW5kbGVyPXE7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2lzU2V0dXAmJih0aGlzLmlzUm9vdCgpP3RoaXMuX3NjaGVkdWxlQ29tcHV0ZUxheW91dCgpOgp0aGlzLnBhcmVudCgpLnJlZHJhdygpKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7fTtwLnByb3RvdHlwZS5yZW5kZXJUbz1mdW5jdGlvbihxKXt0aGlzLmRldGFjaCgpO2lmKG51bGwhPXEpe3E9InN0cmluZyI9PT10eXBlb2YgcT9nLnNlbGVjdChxKTpxIGluc3RhbmNlb2YgRWxlbWVudD9nLnNlbGVjdChxKTpuLmNvZXJjZUV4dGVybmFsRDMocSk7aWYoIXEubm9kZSgpfHxudWxsPT1xLm5vZGUoKS5ub2RlTmFtZSl0aHJvdyBFcnJvcigiUGxvdHRhYmxlIHJlcXVpcmVzIGEgdmFsaWQgRWxlbWVudCB0byByZW5kZXJUbyIpO2lmKCJzdmciPT09cS5ub2RlKCkubm9kZU5hbWUpdGhyb3cgRXJyb3IoIlBsb3R0YWJsZSAzLnggYW5kIGxhdGVyIGNhbiBvbmx5IHJlbmRlclRvIGFuIEhUTUwgY29tcG9uZW50OyBwYXNzIGEgZGl2IGluc3RlYWQhIik7dGhpcy5hbmNob3IocSl9aWYobnVsbD09dGhpcy5fZWxlbWVudCl0aHJvdyBFcnJvcigiSWYgYSBDb21wb25lbnQgaGFzIG5ldmVyIGJlZW4gcmVuZGVyZWQgYmVmb3JlLCB0aGVuIHJlbmRlclRvIG11c3QgYmUgZ2l2ZW4gYSBub2RlIHRvIHJlbmRlciB0bywgb3IgYSBkMy5TZWxlY3Rpb24sIG9yIGEgc2VsZWN0b3Igc3RyaW5nIik7CmwucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXRBbmRSZW5kZXIodGhpcyk7bC5mbHVzaCgpfTtwLnByb3RvdHlwZS54QWxpZ25tZW50PWZ1bmN0aW9uKHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuX3hBbGlnbm1lbnQ7cT1xLnRvTG93ZXJDYXNlKCk7aWYobnVsbD09cC5feEFsaWduVG9Qcm9wb3J0aW9uW3FdKXRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBhbGlnbm1lbnQ6ICIrcSk7dGhpcy5feEFsaWdubWVudD1xO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnlBbGlnbm1lbnQ9ZnVuY3Rpb24ocSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5feUFsaWdubWVudDtxPXEudG9Mb3dlckNhc2UoKTtpZihudWxsPT1wLl95QWxpZ25Ub1Byb3BvcnRpb25bcV0pdGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIGFsaWdubWVudDogIitxKTt0aGlzLl95QWxpZ25tZW50PXE7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuaGFzQ2xhc3M9ZnVuY3Rpb24ocSl7cmV0dXJuIG51bGw9PQpxPyExOm51bGw9PXRoaXMuX2VsZW1lbnQ/dGhpcy5fY3NzQ2xhc3Nlcy5oYXMocSk6dGhpcy5fZWxlbWVudC5jbGFzc2VkKHEpfTtwLnByb3RvdHlwZS5hZGRDbGFzcz1mdW5jdGlvbihxKXtudWxsIT1xJiYobnVsbD09dGhpcy5fZWxlbWVudD90aGlzLl9jc3NDbGFzc2VzLmFkZChxKTp0aGlzLl9lbGVtZW50LmNsYXNzZWQocSwhMCkpfTtwLnByb3RvdHlwZS5yZW1vdmVDbGFzcz1mdW5jdGlvbihxKXtudWxsIT1xJiYobnVsbD09dGhpcy5fZWxlbWVudD90aGlzLl9jc3NDbGFzc2VzLmRlbGV0ZShxKTp0aGlzLl9lbGVtZW50LmNsYXNzZWQocSwhMSkpfTtwLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuITF9O3AucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuITF9O3AucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe3RoaXMucGFyZW50KG51bGwpO3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7dGhpcy5faXNBbmNob3JlZD0KITE7dGhpcy5fb25EZXRhY2hDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUub25EZXRhY2g9ZnVuY3Rpb24ocSl7dGhpcy5fb25EZXRhY2hDYWxsYmFja3MuYWRkKHEpfTtwLnByb3RvdHlwZS5vZmZEZXRhY2g9ZnVuY3Rpb24ocSl7dGhpcy5fb25EZXRhY2hDYWxsYmFja3MuZGVsZXRlKHEpfTtwLnByb3RvdHlwZS5wYXJlbnQ9ZnVuY3Rpb24ocSl7aWYodm9pZCAwPT09cSlyZXR1cm4gdGhpcy5fcGFyZW50O2lmKG51bGwhPT1xJiYhcS5oYXModGhpcykpdGhyb3cgRXJyb3IoIlBhc3NlZCBpbnZhbGlkIHBhcmVudCIpO3RoaXMuX3BhcmVudD1xO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5ib3VuZHM9ZnVuY3Rpb24oKXt2YXIgcT10aGlzLm9yaWdpbigpO3JldHVybnt0b3BMZWZ0OnEsYm90dG9tUmlnaHQ6e3g6cS54K3RoaXMud2lkdGgoKSx5OnEueSt0aGlzLmhlaWdodCgpfX19O3AucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLl9kZXN0cm95ZWQ9CiEwO3RoaXMuZGV0YWNoKCl9O3AucHJvdG90eXBlLndpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dpZHRofTtwLnByb3RvdHlwZS5oZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGVpZ2h0fTtwLnByb3RvdHlwZS5vcmlnaW49ZnVuY3Rpb24oKXtyZXR1cm57eDp0aGlzLl9vcmlnaW4ueCx5OnRoaXMuX29yaWdpbi55fX07cC5wcm90b3R5cGUub3JpZ2luVG9Sb290PWZ1bmN0aW9uKCl7Zm9yKHZhciBxPXRoaXMub3JpZ2luKCkscj10aGlzLnBhcmVudCgpO251bGwhPXI7KXt2YXIgdD1yLm9yaWdpbigpO3EueCs9dC54O3EueSs9dC55O3I9ci5wYXJlbnQoKX1yZXR1cm4gcX07cC5wcm90b3R5cGUucm9vdD1mdW5jdGlvbigpe2Zvcih2YXIgcT10aGlzOyFxLmlzUm9vdCgpOylxPXEucGFyZW50KCk7cmV0dXJuIHF9O3AucHJvdG90eXBlLmlzUm9vdD1mdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLnBhcmVudCgpfTtwLnByb3RvdHlwZS5mb3JlZ3JvdW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZvcmVncm91bmRDb250YWluZXJ9OwpwLnByb3RvdHlwZS5jb250ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbnRlbnR9O3AucHJvdG90eXBlLmVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxlbWVudH07cC5wcm90b3R5cGUucm9vdEVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb290KCkuX3Jvb3RFbGVtZW50fTtwLnByb3RvdHlwZS5iYWNrZ3JvdW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tncm91bmRDb250YWluZXJ9O3JldHVybiBwfSgpO2MuX3hBbGlnblRvUHJvcG9ydGlvbj17bGVmdDowLGNlbnRlcjouNSxyaWdodDoxfTtjLl95QWxpZ25Ub1Byb3BvcnRpb249e3RvcDowLGNlbnRlcjouNSxib3R0b206MX07ZC5Db21wb25lbnQ9Y30sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcobCl7Zm9yKHZhciBrIGluIGwpZC5oYXNPd25Qcm9wZXJ0eShrKXx8KGRba109bFtrXSl9ZyhmKDU5KSk7ZyhmKDYyKSk7ZyhmKDEzMykpO2coZigyMSkpO2coZig2NCkpO2coZig2NikpfSwKZnVuY3Rpb24oYyxkKXtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZihnLGwpe3RoaXMuX3N2Z0RyYXdlckZhY3Rvcnk9Zzt0aGlzLl9jYW52YXNEcmF3ZXJGYWN0b3J5PWx9Zi5wcm90b3R5cGUudXNlU1ZHPWZ1bmN0aW9uKGcpe251bGwhPXRoaXMuX2N1cnJlbnREcmF3ZXImJnRoaXMuX2N1cnJlbnREcmF3ZXIucmVtb3ZlKCk7dmFyIGw9dGhpcy5fc3ZnRHJhd2VyRmFjdG9yeSgpO2wuYXR0YWNoVG8oZyk7dGhpcy5fY3VycmVudERyYXdlcj1sfTtmLnByb3RvdHlwZS51c2VDYW52YXM9ZnVuY3Rpb24oZyl7bnVsbCE9dGhpcy5fY3VycmVudERyYXdlciYmdGhpcy5fY3VycmVudERyYXdlci5yZW1vdmUoKTt0aGlzLl9jdXJyZW50RHJhd2VyPXRoaXMuX2NhbnZhc0RyYXdlckZhY3RvcnkoZy5ub2RlKCkuZ2V0Q29udGV4dCgiMmQiKSl9O2YucHJvdG90eXBlLmdldERyYXdlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jdXJyZW50RHJhd2VyfTtmLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXtudWxsIT0KdGhpcy5fY3VycmVudERyYXdlciYmdGhpcy5fY3VycmVudERyYXdlci5yZW1vdmUoKX07Zi5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbihnLGwpe3RoaXMuX2N1cnJlbnREcmF3ZXIuZHJhdyhnLGwpfTtmLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnREcmF3ZXIuZ2V0VmlzdWFsUHJpbWl0aXZlcygpfTtmLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4PWZ1bmN0aW9uKGcpe3JldHVybiB0aGlzLl9jdXJyZW50RHJhd2VyLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXgoZyl9O3JldHVybiBmfSgpO2QuUHJveHlEcmF3ZXI9Y30sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcobCl7Zm9yKHZhciBrIGluIGwpZC5oYXNPd25Qcm9wZXJ0eShrKXx8KGRba109bFtrXSl9ZyhmKDcwKSk7ZyhmKDcxKSl9LGZ1bmN0aW9uKGMsZCxmKXtmdW5jdGlvbiBnKG4pe3ZvaWQgMD09PW4mJihuPTMpO2wobik7cmV0dXJuIGZ1bmN0aW9uKHApe3JldHVybiBwLnRvRml4ZWQobil9fQpmdW5jdGlvbiBsKG4pe2lmKDA+bnx8MjA8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRm9ybWF0dGVyIHByZWNpc2lvbiBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMjAiKTtpZihuIT09TWF0aC5mbG9vcihuKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRm9ybWF0dGVyIHByZWNpc2lvbiBtdXN0IGJlIGFuIGludGVnZXIiKTt9dmFyIGs9ZigxKTtkLmN1cnJlbmN5PWZ1bmN0aW9uKG4scCxxKXt2b2lkIDA9PT1uJiYobj0yKTt2b2lkIDA9PT1wJiYocD0iJCIpO3ZvaWQgMD09PXEmJihxPSEwKTt2YXIgcj1nKG4pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgdj1yKE1hdGguYWJzKHQpKTsiIiE9PXYmJih2PXE/cCt2OnYrcCwwPnQmJih2PSItIit2KSk7cmV0dXJuIHZ9fTtkLmZpeGVkPWc7ZC5nZW5lcmFsPWZ1bmN0aW9uKG4pe3ZvaWQgMD09PW4mJihuPTMpO2wobik7cmV0dXJuIGZ1bmN0aW9uKHApe2lmKCJudW1iZXIiPT09dHlwZW9mIHApe3ZhciBxPU1hdGgucG93KDEwLG4pO3JldHVybiBTdHJpbmcoTWF0aC5yb3VuZChwKgpxKS9xKX1yZXR1cm4gU3RyaW5nKHApfX07ZC5pZGVudGl0eT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gU3RyaW5nKG4pfX07ZC5wZXJjZW50YWdlPWZ1bmN0aW9uKG4pe3ZvaWQgMD09PW4mJihuPTApO3ZhciBwPWcobik7cmV0dXJuIGZ1bmN0aW9uKHEpe3ZhciByPXEudG9TdHJpbmcoKTtyPU1hdGgucG93KDEwLHIubGVuZ3RoLShyLmluZGV4T2YoIi4iKSsxKSk7cmV0dXJuIHAocGFyc2VJbnQoKDEwMCpxKnIpLnRvU3RyaW5nKCksMTApL3IpKyIlIn19O2Quc2lTdWZmaXg9ZnVuY3Rpb24obil7dm9pZCAwPT09biYmKG49Myk7bChuKTtyZXR1cm4gZnVuY3Rpb24ocCl7cmV0dXJuIGsuZm9ybWF0KCIuIituKyJzIikocCl9fTtkLnNob3J0U2NhbGU9ZnVuY3Rpb24oKXt2YXIgbj0wO3ZvaWQgMD09PW4mJihuPTMpO2wobik7dmFyIHA9ay5mb3JtYXQoIi4iK24rImUiKSxxPWsuZm9ybWF0KCIuIituKyJmIikscj1NYXRoLnBvdygxMCwxOCksdD1NYXRoLnBvdygxMCwKLW4pO3JldHVybiBmdW5jdGlvbih2KXt2YXIgeT1NYXRoLmFicyh2KTtpZigoeTx0fHx5Pj1yKSYmMCE9PXkpcmV0dXJuIHAodik7Zm9yKHZhciB6PS0xO3k+PU1hdGgucG93KDFFMyx6KzIpJiY0Pno7KXorKzt5PS0xPT09ej9xKHYpOnEodi9NYXRoLnBvdygxRTMseisxKSkrIktNQlRRIlt6XTtpZigwPHYmJiIxMDAwIj09PXkuc3Vic3RyKDAsNCl8fDA+diYmIi0xMDAwIj09PXkuc3Vic3RyKDAsNSkpND56Pyh6KysseT1xKHYvTWF0aC5wb3coMUUzLHorMSkpKyJLTUJUUSJbel0pOnk9cCh2KTtyZXR1cm4geX19O2QubXVsdGlUaW1lPWZ1bmN0aW9uKCl7dmFyIG49W3tzcGVjaWZpZXI6Ii4lTCIscHJlZGljYXRlOmZ1bmN0aW9uKHApe3JldHVybiAwIT09cC5nZXRNaWxsaXNlY29uZHMoKX19LHtzcGVjaWZpZXI6IjolUyIscHJlZGljYXRlOmZ1bmN0aW9uKHApe3JldHVybiAwIT09cC5nZXRTZWNvbmRzKCl9fSx7c3BlY2lmaWVyOiIlSTolTSIscHJlZGljYXRlOmZ1bmN0aW9uKHApe3JldHVybiAwIT09CnAuZ2V0TWludXRlcygpfX0se3NwZWNpZmllcjoiJUkgJXAiLHByZWRpY2F0ZTpmdW5jdGlvbihwKXtyZXR1cm4gMCE9PXAuZ2V0SG91cnMoKX19LHtzcGVjaWZpZXI6IiVhICVkIixwcmVkaWNhdGU6ZnVuY3Rpb24ocCl7cmV0dXJuIDAhPT1wLmdldERheSgpJiYxIT09cC5nZXREYXRlKCl9fSx7c3BlY2lmaWVyOiIlYiAlZCIscHJlZGljYXRlOmZ1bmN0aW9uKHApe3JldHVybiAxIT09cC5nZXREYXRlKCl9fSx7c3BlY2lmaWVyOiIlYiIscHJlZGljYXRlOmZ1bmN0aW9uKHApe3JldHVybiAwIT09cC5nZXRNb250aCgpfX1dO3JldHVybiBmdW5jdGlvbihwKXt2YXIgcT1uLmZpbHRlcihmdW5jdGlvbihyKXtyZXR1cm4gci5wcmVkaWNhdGUocCl9KTtyZXR1cm4gay50aW1lRm9ybWF0KDA8cS5sZW5ndGg/cVswXS5zcGVjaWZpZXI6IiVZIikocCl9fTtkLnRpbWU9ZnVuY3Rpb24obil7cmV0dXJuIGsudGltZUZvcm1hdChuKX19LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz1mKDEpLGw9ZigwKTsKYz1mdW5jdGlvbigpe2Z1bmN0aW9uIGsobixwKXt0aGlzLl9yb290PWcuc2VsZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJnIikpO3RoaXMuX2NsYXNzTmFtZT1wO3RoaXMuX3N2Z0VsZW1lbnROYW1lPW59ay5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbihuLHApe3ZhciBxPXRoaXM7dGhpcy5fY3JlYXRlQW5kRGVzdHJveURPTUVsZW1lbnRzKG4pO3ZhciByPTA7cC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2wuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gcS5fZHJhd1N0ZXAodCl9LHIpO3IrPXQuYW5pbWF0b3IudG90YWxUaW1lKG4ubGVuZ3RoKX0pfTtrLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVzPWZ1bmN0aW9uKCl7bnVsbD09dGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzJiYodGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzPXRoaXMuX3NlbGVjdGlvbi5ub2RlcygpKTtyZXR1cm4gdGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzfTsKay5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleD1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5nZXRWaXN1YWxQcmltaXRpdmVzKClbbl19O2sucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuX3Jvb3QucmVtb3ZlKCl9O2sucHJvdG90eXBlLmF0dGFjaFRvPWZ1bmN0aW9uKG4pe24ubm9kZSgpLmFwcGVuZENoaWxkKHRoaXMuX3Jvb3Qubm9kZSgpKX07ay5wcm90b3R5cGUuZ2V0Um9vdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290fTtrLnByb3RvdHlwZS5zZWxlY3Rvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdmdFbGVtZW50TmFtZX07ay5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXt9O2sucHJvdG90eXBlLl9jcmVhdGVBbmREZXN0cm95RE9NRWxlbWVudHM9ZnVuY3Rpb24obil7bj1uLmZpbHRlcihmdW5jdGlvbihwKXtyZXR1cm4gbnVsbCE9cH0pO249dGhpcy5fcm9vdC5zZWxlY3RBbGwodGhpcy5zZWxlY3RvcigpKS5kYXRhKG4pOwp0aGlzLl9zZWxlY3Rpb249bi5lbnRlcigpLmFwcGVuZCh0aGlzLl9zdmdFbGVtZW50TmFtZSkubWVyZ2Uobik7bi5leGl0KCkucmVtb3ZlKCk7dGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzPW51bGw7bnVsbCE9dGhpcy5fY2xhc3NOYW1lJiZ0aGlzLl9zZWxlY3Rpb24uY2xhc3NlZCh0aGlzLl9jbGFzc05hbWUsITApO3RoaXMuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXModGhpcy5fc2VsZWN0aW9uKX07ay5wcm90b3R5cGUuX2RyYXdTdGVwPWZ1bmN0aW9uKG4pe3ZhciBwPXRoaXM7WyJmaWxsIiwic3Ryb2tlIl0uZm9yRWFjaChmdW5jdGlvbihxKXtudWxsIT1uLmF0dHJUb0FwcGxpZWRQcm9qZWN0b3JbcV0mJnAuX3NlbGVjdGlvbi5hdHRyKHEsbi5hdHRyVG9BcHBsaWVkUHJvamVjdG9yW3FdKX0pO24uYW5pbWF0b3IuYW5pbWF0ZSh0aGlzLl9zZWxlY3Rpb24sbi5hdHRyVG9BcHBsaWVkUHJvamVjdG9yKTtudWxsIT10aGlzLl9jbGFzc05hbWUmJnRoaXMuX3NlbGVjdGlvbi5jbGFzc2VkKHRoaXMuX2NsYXNzTmFtZSwKITApfTtyZXR1cm4ga30oKTtkLlNWR0RyYXdlcj1jfSxmdW5jdGlvbihjLGQpe2QubWFrZUVudW09ZnVuY3Rpb24oZil7cmV0dXJuIGYucmVkdWNlKGZ1bmN0aW9uKGcsbCl7Z1tsXT1sO3JldHVybiBnfSx7fSl9fSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAscSl7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHQgaW4gcSlxLmhhc093blByb3BlcnR5KHQpJiYocFt0XT1xW3RdKTtwLnByb3RvdHlwZT1udWxsPT09cT9PYmplY3QuY3JlYXRlKHEpOihyLnByb3RvdHlwZT1xLnByb3RvdHlwZSxuZXcgcil9LGw9ZigxKSxrPWYoMjYpLG49ZigwKTtjPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIHEoKXt2YXIgcj1wLmNhbGwodGhpcyl8fHRoaXM7ci5fdGlja0dlbmVyYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gdC5kZWZhdWx0VGlja3MoKX07ci5fcGFkUHJvcG9ydGlvbj0uMDU7ci5fc25hcHBpbmdEb21haW5FbmFibGVkPQohMDtyLl9wYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVycz1uZXcgbi5TZXQ7cmV0dXJuIHJ9ZyhxLHApO3EucHJvdG90eXBlLmF1dG9Eb21haW49ZnVuY3Rpb24oKXt0aGlzLl9kb21haW5NYXg9dGhpcy5fZG9tYWluTWluPW51bGw7cC5wcm90b3R5cGUuYXV0b0RvbWFpbi5jYWxsKHRoaXMpfTtxLnByb3RvdHlwZS5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZT1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuX2RvbWFpbk1pbiYmbnVsbCE9dGhpcy5fZG9tYWluTWF4KXRoaXMuX3NldERvbWFpbihbdGhpcy5fZG9tYWluTWluLHRoaXMuX2RvbWFpbk1heF0pO2Vsc2V7dmFyIHI9dGhpcy5fZ2V0RXh0ZW50KCk7bnVsbCE9dGhpcy5fZG9tYWluTWluPyhyPXJbMV0sdGhpcy5fZG9tYWluTWluPj1yJiYocj10aGlzLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbihbdGhpcy5fZG9tYWluTWluLHRoaXMuX2RvbWFpbk1pbl0pWzFdKSx0aGlzLl9zZXREb21haW4oW3RoaXMuX2RvbWFpbk1pbixyXSkpOgpudWxsIT10aGlzLl9kb21haW5NYXg/KHI9clswXSx0aGlzLl9kb21haW5NYXg8PXImJihyPXRoaXMuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluKFt0aGlzLl9kb21haW5NYXgsdGhpcy5fZG9tYWluTWF4XSlbMF0pLHRoaXMuX3NldERvbWFpbihbcix0aGlzLl9kb21haW5NYXhdKSk6cC5wcm90b3R5cGUuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUuY2FsbCh0aGlzKX19O3EucHJvdG90eXBlLl9nZXRVbmJvdW5kZWRFeHRlbnQ9ZnVuY3Rpb24ocil7dm9pZCAwPT09ciYmKHI9ITEpO3I9dGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMocik7dmFyIHQ9dGhpcy5fZGVmYXVsdEV4dGVudCgpOzAhPT1yLmxlbmd0aCYmKHI9W24uTWF0aC5taW4ocix0WzBdKSxuLk1hdGgubWF4KHIsdFsxXSldLHQ9dGhpcy5fcGFkRG9tYWluKHIpKTtyZXR1cm4gdH07cS5wcm90b3R5cGUuX2dldEV4dGVudD1mdW5jdGlvbigpe3ZhciByPXRoaXMuX2dldFVuYm91bmRlZEV4dGVudCgpO251bGwhPXRoaXMuX2RvbWFpbk1pbiYmCihyWzBdPXRoaXMuX2RvbWFpbk1pbik7bnVsbCE9dGhpcy5fZG9tYWluTWF4JiYoclsxXT10aGlzLl9kb21haW5NYXgpO3JldHVybiByfTtxLnByb3RvdHlwZS5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyPWZ1bmN0aW9uKHIpe3RoaXMuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzLmFkZChyKTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCl9O3EucHJvdG90eXBlLnJlbW92ZVBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXI9ZnVuY3Rpb24ocil7dGhpcy5fcGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcnMuZGVsZXRlKHIpO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKX07cS5wcm90b3R5cGUucGFkUHJvcG9ydGlvbj1mdW5jdGlvbihyKXtpZihudWxsPT1yKXJldHVybiB0aGlzLl9wYWRQcm9wb3J0aW9uO2lmKDA+cil0aHJvdyBFcnJvcigicGFkUHJvcG9ydGlvbiBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpO3RoaXMuX3BhZFByb3BvcnRpb249cjt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7CnJldHVybiB0aGlzfTtxLnByb3RvdHlwZS5fcGFkRG9tYWluPWZ1bmN0aW9uKHIpe3ZhciB0PXRoaXM7aWYoclswXS52YWx1ZU9mKCk9PT1yWzFdLnZhbHVlT2YoKSlyZXR1cm4gdGhpcy5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW4ocik7aWYoMD09PXRoaXMuX3BhZFByb3BvcnRpb24pcmV0dXJuIHI7dmFyIHY9dGhpcy5fcGFkUHJvcG9ydGlvbi8yLHk9clswXSx6PXJbMV0seD0hMSxDPSExO3RoaXMuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzLmZvckVhY2goZnVuY3Rpb24oRCl7RCh0KS5mb3JFYWNoKGZ1bmN0aW9uKEIpe0IudmFsdWVPZigpPT09eS52YWx1ZU9mKCkmJih4PSEwKTtCLnZhbHVlT2YoKT09PXoudmFsdWVPZigpJiYoQz0hMCl9KX0pO3ZhciBGPXRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpO3RoaXMuX2JhY2tpbmdTY2FsZURvbWFpbihyKTtyPXg/eTp0aGlzLmludmVydCh0aGlzLnNjYWxlKHkpLSh0aGlzLnNjYWxlKHopLXRoaXMuc2NhbGUoeSkpKnYpO3Y9Qz8Kejp0aGlzLmludmVydCh0aGlzLnNjYWxlKHopKyh0aGlzLnNjYWxlKHopLXRoaXMuc2NhbGUoeSkpKnYpO3RoaXMuX2JhY2tpbmdTY2FsZURvbWFpbihGKTtyZXR1cm4gdGhpcy5fc25hcHBpbmdEb21haW5FbmFibGVkP3RoaXMuX25pY2VEb21haW4oW3Isdl0pOltyLHZdfTtxLnByb3RvdHlwZS5zbmFwcGluZ0RvbWFpbkVuYWJsZWQ9ZnVuY3Rpb24ocil7bnVsbCE9ciYmKHRoaXMuX3NuYXBwaW5nRG9tYWluRW5hYmxlZD1yLHRoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKSl9O3EucHJvdG90eXBlLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbj1mdW5jdGlvbihyKXtyZXR1cm4gcn07cS5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGludmVydCIpO307cS5wcm90b3R5cGUuZG9tYWluPWZ1bmN0aW9uKHIpe251bGwhPXImJih0aGlzLl9kb21haW5NaW49clswXSx0aGlzLl9kb21haW5NYXg9clsxXSk7CnJldHVybiBwLnByb3RvdHlwZS5kb21haW4uY2FsbCh0aGlzLHIpfTtxLnByb3RvdHlwZS5kb21haW5NaW49ZnVuY3Rpb24ocil7aWYobnVsbD09cilyZXR1cm4gdGhpcy5kb21haW4oKVswXTt0aGlzLl9kb21haW5NaW49cjt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLmRvbWFpbk1heD1mdW5jdGlvbihyKXtpZihudWxsPT1yKXJldHVybiB0aGlzLmRvbWFpbigpWzFdO3RoaXMuX2RvbWFpbk1heD1yO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24ocil7cj1sLmV4dGVudChyLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gbi5NYXRoLmlzVmFsaWROdW1iZXIoK3QpfSkpO3JldHVybiBudWxsPT1yWzBdfHxudWxsPT1yWzFdP1tdOnJ9O3EucHJvdG90eXBlLnpvb209ZnVuY3Rpb24ocix0KXt2YXIgdj10aGlzO3RoaXMuZG9tYWluKHRoaXMucmFuZ2UoKS5tYXAoZnVuY3Rpb24oeSl7cmV0dXJuIHYuaW52ZXJ0KGsuem9vbU91dCh5LApyLHQpKX0pKX07cS5wcm90b3R5cGUucGFuPWZ1bmN0aW9uKHIpe3ZhciB0PXRoaXM7dGhpcy5kb21haW4odGhpcy5yYW5nZSgpLm1hcChmdW5jdGlvbih2KXtyZXR1cm4gdC5pbnZlcnQodityKX0pKX07cS5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBzY2FsZVRyYW5zZm9ybWF0aW9uIik7fTtxLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGludmVydGVkVHJhbnNmb3JtYXRpb24iKTt9O3EucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGdldFRyYW5zZm9ybWF0aW9uRXh0ZW50Iik7fTtxLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBnZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbiIpOwp9O3EucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHNldFRyYW5zZm9ybWF0aW9uRG9tYWluIik7fTtxLnByb3RvdHlwZS5fc2V0RG9tYWluPWZ1bmN0aW9uKHIpe2Z1bmN0aW9uIHQodil7cmV0dXJuIG4uTWF0aC5pc05hTih2KXx8SW5maW5pdHk9PT12fHwtSW5maW5pdHk9PT12fXQoclswXSl8fHQoclsxXSk/bi5XaW5kb3cud2FybigiV2FybmluZzogUXVhbnRpdGF0aXZlU2NhbGVzIGNhbm5vdCB0YWtlIE5hTiBvciBJbmZpbml0eSBhcyBhIGRvbWFpbiB2YWx1ZS4gSWdub3JpbmcuIik6cC5wcm90b3R5cGUuX3NldERvbWFpbi5jYWxsKHRoaXMscil9O3EucHJvdG90eXBlLmRlZmF1bHRUaWNrcz1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfZ2V0RGVmYXVsdFRpY2tzIik7fTtxLnByb3RvdHlwZS50aWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90aWNrR2VuZXJhdG9yKHRoaXMpfTsKcS5wcm90b3R5cGUuX25pY2VEb21haW49ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX25pY2VEb21haW4iKTt9O3EucHJvdG90eXBlLl9kZWZhdWx0RXh0ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIF9kZWZhdWx0RXh0ZW50Iik7fTtxLnByb3RvdHlwZS50aWNrR2VuZXJhdG9yPWZ1bmN0aW9uKCl7dmFyIHI9UGxvdHRhYmxlLlNjYWxlcy5UaWNrR2VuZXJhdG9ycy5pbnRlZ2VyVGlja0dlbmVyYXRvcigpO251bGwhPXImJih0aGlzLl90aWNrR2VuZXJhdG9yPXIpfTtyZXR1cm4gcX0oZigxNykuU2NhbGUpO2MuX0RFRkFVTFRfTlVNX1RJQ0tTPTEwO2QuUXVhbnRpdGF0aXZlU2NhbGU9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoMSk7ZC5jb2VyY2VFeHRlcm5hbEQzPWZ1bmN0aW9uKGwpe2lmKG51bGw9PWwuYXR0cnMpe2lmKG51bGw9PWwubm9kZXMpe3ZhciBrPVtdO2wuZWFjaChmdW5jdGlvbigpe2sucHVzaCh0aGlzKX0pOwpyZXR1cm4gZy5zZWxlY3RBbGwoayl9cmV0dXJuIGcuc2VsZWN0QWxsKGwubm9kZXMoKSl9cmV0dXJuIGx9fSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhsKXtmb3IodmFyIGsgaW4gbClkLmhhc093blByb3BlcnR5KGspfHwoZFtrXT1sW2tdKX1nKGYoODMpKTtnKGYoODQpKTtnKGYoODUpKX0sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcobCl7Zm9yKHZhciBrIGluIGwpZC5oYXNPd25Qcm9wZXJ0eShrKXx8KGRba109bFtrXSl9ZyhmKDQ0KSk7ZyhmKDQ1KSk7ZyhmKDQ2KSk7ZyhmKDE4KSk7ZyhmKDYpKTtnKGYoMzMpKTtnKGYoMzQpKTtnKGYoNDcpKTtnKGYoOSkpO2coZig0OCkpfSxmdW5jdGlvbihjLGQpe2M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBmKCl7dmFyIGc9dGhpczt0aGlzLl9hbmNob3JDYWxsYmFjaz1mdW5jdGlvbihsKXtyZXR1cm4gZy5fYW5jaG9yKGwpfTt0aGlzLl9lbmFibGVkPSEwfWYucHJvdG90eXBlLmF0dGFjaFRvPWZ1bmN0aW9uKGcpe3RoaXMuX2Rpc2Nvbm5lY3QoKTsKdGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbz1nO3RoaXMuX2Nvbm5lY3QoKTtyZXR1cm4gdGhpc307Zi5wcm90b3R5cGUuZGV0YWNoRnJvbT1mdW5jdGlvbigpe3RoaXMuZGV0YWNoKCl9O2YucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe3RoaXMuX2Rpc2Nvbm5lY3QoKTt0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvPW51bGw7cmV0dXJuIHRoaXN9O2YucHJvdG90eXBlLmVuYWJsZWQ9ZnVuY3Rpb24oZyl7aWYobnVsbD09ZylyZXR1cm4gdGhpcy5fZW5hYmxlZDsodGhpcy5fZW5hYmxlZD1nKT90aGlzLl9jb25uZWN0KCk6dGhpcy5fZGlzY29ubmVjdCgpO3JldHVybiB0aGlzfTtmLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZD0hMH07Zi5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZD0hMX07Zi5wcm90b3R5cGUuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2U9ZnVuY3Rpb24oZyl7dmFyIGw9dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby5vcmlnaW5Ub1Jvb3QoKTsKcmV0dXJue3g6Zy54LWwueCx5OmcueS1sLnl9fTtmLnByb3RvdHlwZS5faXNJbnNpZGVDb21wb25lbnQ9ZnVuY3Rpb24oZyl7cmV0dXJuIDA8PWcueCYmMDw9Zy55JiZnLng8PXRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ud2lkdGgoKSYmZy55PD10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLmhlaWdodCgpfTtmLnByb3RvdHlwZS5fY29ubmVjdD1mdW5jdGlvbigpe2lmKHRoaXMuZW5hYmxlZCgpJiZudWxsIT10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvJiYhdGhpcy5faXNBbmNob3JlZCl0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLm9uQW5jaG9yKHRoaXMuX2FuY2hvckNhbGxiYWNrKX07Zi5wcm90b3R5cGUuX2Rpc2Nvbm5lY3Q9ZnVuY3Rpb24oKXt0aGlzLl9pc0FuY2hvcmVkJiZ0aGlzLl91bmFuY2hvcigpO251bGwhPXRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8mJnRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ub2ZmQW5jaG9yKHRoaXMuX2FuY2hvckNhbGxiYWNrKX07cmV0dXJuIGZ9KCk7CmQuSW50ZXJhY3Rpb249Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihxLHIpe2Z1bmN0aW9uIHQoKXt0aGlzLmNvbnN0cnVjdG9yPXF9Zm9yKHZhciB2IGluIHIpci5oYXNPd25Qcm9wZXJ0eSh2KSYmKHFbdl09clt2XSk7cS5wcm90b3R5cGU9bnVsbD09PXI/T2JqZWN0LmNyZWF0ZShyKToodC5wcm90b3R5cGU9ci5wcm90b3R5cGUsbmV3IHQpfSxsPWYoMyksaz1mKDApLG49Zig1MikscD1mKDIpO2M9ZnVuY3Rpb24ocSl7ZnVuY3Rpb24gcigpe3ZhciB0PXEuY2FsbCh0aGlzKXx8dGhpczt0Ll9hdXRvQWRqdXN0WFNjYWxlRG9tYWluPSExO3QuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49ITE7dC5fZGVmZXJyZWRSZW5kZXJpbmc9ITE7dC5fYXBwbHlEZWZlcnJlZFJlbmRlcmluZ1RyYW5zZm9ybT1mdW5jdGlvbih2LHkseix4KXt0Ll9pc0FuY2hvcmVkJiYobnVsbCE9dC5fcmVuZGVyQXJlYSYmdC5fcmVuZGVyQXJlYS5hdHRyKCJ0cmFuc2Zvcm0iLAoidHJhbnNsYXRlKCIrdisiLCAiK3krIikgc2NhbGUoIit6KyIsICIreCsiKSIpLG51bGwhPXQuX2NhbnZhcyYmdC5fY2FudmFzLnN0eWxlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit2KyJweCwgIit5KyJweCkgc2NhbGUoIit6KyIsICIreCsiKSIpKX07dC5hZGRDbGFzcygieHktcGxvdCIpO3QuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gdC5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVgoKX07dC5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVlDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiB0Ll9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWSgpfTt0Ll9yZW5kZXJDYWxsYmFjaz1mdW5jdGlvbigpe2lmKHQuZGVmZXJyZWRSZW5kZXJpbmcoKSl7dmFyIHY9dC54KCkmJnQueCgpLnNjYWxlLHk9dC55KCkmJnQueSgpLnNjYWxlO3QuX2RlZmVycmVkUmVuZGVyZXIudXBkYXRlRG9tYWlucyh2LHkpfWVsc2UgdC5yZW5kZXIoKX07CnQuX2RlZmVycmVkUmVuZGVyZXI9bmV3IG4uRGVmZXJyZWRSZW5kZXJlcihmdW5jdGlvbigpe3JldHVybiB0LnJlbmRlcigpfSx0Ll9hcHBseURlZmVycmVkUmVuZGVyaW5nVHJhbnNmb3JtKTtyZXR1cm4gdH1nKHIscSk7ci5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dGhpcy5kZWZlcnJlZFJlbmRlcmluZygpJiZ0aGlzLl9kZWZlcnJlZFJlbmRlcmVyLnJlc2V0VHJhbnNmb3JtcygpO3JldHVybiBxLnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzKX07ci5wcm90b3R5cGUuZGVmZXJyZWRSZW5kZXJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVmZXJyZWRSZW5kZXJpbmd9O3IucHJvdG90eXBlLng9ZnVuY3Rpb24odCx2LHkpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHIuX1hfS0VZKTt0aGlzLl9iaW5kUHJvcGVydHkoci5fWF9LRVksdCx2LHkpO3Q9dGhpcy53aWR0aCgpO251bGwhPXYmJm51bGwhPXQmJnYucmFuZ2UoWzAsdF0pOwp0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW4oKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS55PWZ1bmN0aW9uKHQsdix5KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChyLl9ZX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KHIuX1lfS0VZLHQsdix5KTt0PXRoaXMuaGVpZ2h0KCk7bnVsbCE9diYmbnVsbCE9dCYmKHYgaW5zdGFuY2VvZiBsLkNhdGVnb3J5P3YucmFuZ2UoWzAsdF0pOnYucmFuZ2UoW3QsMF0pKTt0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVYRXh0ZW50c0FuZEF1dG9kb21haW4oKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24odCl7cmV0dXJuIngiPT09dCYmdGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj90aGlzLl9tYWtlRmlsdGVyQnlQcm9wZXJ0eSgieSIpOgoieSI9PT10JiZ0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluP3RoaXMuX21ha2VGaWx0ZXJCeVByb3BlcnR5KCJ4Iik6bnVsbH07ci5wcm90b3R5cGUuX21ha2VGaWx0ZXJCeVByb3BlcnR5PWZ1bmN0aW9uKHQpe3Q9dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQodCk7aWYobnVsbCE9dCl7dmFyIHY9dC5hY2Nlc3Nvcix5PXQuc2NhbGU7aWYobnVsbCE9eSlyZXR1cm4gZnVuY3Rpb24oeix4LEMpe3ZhciBGPXkucmFuZ2UoKTtyZXR1cm4gay5NYXRoLmluUmFuZ2UoeS5zY2FsZSh2KHoseCxDKSksRlswXSxGWzFdKX19cmV0dXJuIG51bGx9O3IucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbih0LHYpe3EucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleS5jYWxsKHRoaXMsdCx2KTt0Lm9mZlVwZGF0ZSh2PT09ci5fWF9LRVk/dGhpcy5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVhDYWxsYmFjazp0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWUNhbGxiYWNrKX07CnIucHJvdG90eXBlLl9pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24odCx2KXtxLnByb3RvdHlwZS5faW5zdGFsbFNjYWxlRm9yS2V5LmNhbGwodGhpcyx0LHYpO3Qub25VcGRhdGUodj09PXIuX1hfS0VZP3RoaXMuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YQ2FsbGJhY2s6dGhpcy5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVlDYWxsYmFjayl9O3IucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtxLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy54KCkuc2NhbGUmJnRoaXMueCgpLnNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWENhbGxiYWNrKTt0aGlzLnkoKS5zY2FsZSYmdGhpcy55KCkuc2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZQ2FsbGJhY2spO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW4/CiJ4Ijp0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluPyJ5Ijoibm9uZSI7c3dpdGNoKHQpe2Nhc2UgIngiOnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW49ITA7dGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj0hMTt0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWSgpO2JyZWFrO2Nhc2UgInkiOnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW49ITE7dGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj0hMDt0aGlzLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWCgpO2JyZWFrO2Nhc2UgIm5vbmUiOnRoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49dGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj0hMTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJJbnZhbGlkIHNjYWxlIG5hbWUgJyIrdCsiJywgbXVzdCBiZSAneCcsICd5JyBvciAnbm9uZSciKTt9cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24odCx2LHkpe3EucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLAp0LHYseSk7dD0odD10aGlzLngoKSkmJnQuc2NhbGU7bnVsbCE9dCYmdC5yYW5nZShbMCx0aGlzLndpZHRoKCldKTt0PSh0PXRoaXMueSgpKSYmdC5zY2FsZTtudWxsIT10JiYodCBpbnN0YW5jZW9mIGwuQ2F0ZWdvcnk/dC5yYW5nZShbMCx0aGlzLmhlaWdodCgpXSk6dC5yYW5nZShbdGhpcy5oZWlnaHQoKSwwXSkpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy54KCkuc2NhbGU7bnVsbCE9dCYmdC5hdXRvRG9tYWluKCl9O3IucHJvdG90eXBlLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW49ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnkoKS5zY2FsZTtudWxsIT10JiZ0LmF1dG9Eb21haW4oKX07ci5wcm90b3R5cGUuc2hvd0FsbERhdGE9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVYRXh0ZW50c0FuZEF1dG9kb21haW4oKTt0aGlzLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW4oKTtyZXR1cm4gdGhpc307CnIucHJvdG90eXBlLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWD1mdW5jdGlvbigpe3RoaXMuX3Byb2plY3RvcnNSZWFkeSgpJiZ0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW4oKX07ci5wcm90b3R5cGUuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZPWZ1bmN0aW9uKCl7dGhpcy5fcHJvamVjdG9yc1JlYWR5KCkmJnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW4mJnRoaXMuX3VwZGF0ZVhFeHRlbnRzQW5kQXV0b2RvbWFpbigpfTtyLnByb3RvdHlwZS5fcHJvamVjdG9yc1JlYWR5PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy54KCksdj10aGlzLnkoKTtyZXR1cm4gbnVsbCE9dCYmbnVsbCE9dC5hY2Nlc3NvciYmbnVsbCE9diYmbnVsbCE9di5hY2Nlc3Nvcn07ci5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24odCx2LHkpe3ZhciB6PXAuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHg9cC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7CnJldHVybnt4OnoodCx2LHkpLHk6eCh0LHYseSl9fTtyLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoeix4LEMpe3ZhciBGPXAuUGxvdC5fc2NhbGVkQWNjZXNzb3Iodi54KCkpKHoseCxDKTt6PXAuUGxvdC5fc2NhbGVkQWNjZXNzb3Iodi55KCkpKHoseCxDKTtyZXR1cm4gay5NYXRoLmlzVmFsaWROdW1iZXIoRikmJmsuTWF0aC5pc1ZhbGlkTnVtYmVyKHopfXZhciB2PXRoaXMseT1xLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdy5jYWxsKHRoaXMpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKHope3kuc2V0KHoseS5nZXQoeikuZmlsdGVyKGZ1bmN0aW9uKHgsQyl7cmV0dXJuIHQoeCxDLHopfSkpfSk7cmV0dXJuIHl9O3JldHVybiByfShwLlBsb3QpO2MuX1hfS0VZPSJ4IjtjLl9ZX0tFWT0ieSI7ZC5YWVBsb3Q9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoMCk7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGwoKXt0aGlzLl9hdXRvRG9tYWluQXV0b21hdGljYWxseT0KITA7dGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzcz0hMTt0aGlzLl91cGRhdGVJZD0wO3RoaXMuX2NhbGxiYWNrcz1uZXcgZy5DYWxsYmFja1NldDt0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVycz1uZXcgZy5TZXR9bC5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm5bXX07bC5wcm90b3R5cGUuX2dldEFsbEluY2x1ZGVkVmFsdWVzPWZ1bmN0aW9uKGspe3ZhciBuPXRoaXM7dm9pZCAwPT09ayYmKGs9ITEpO3ZhciBwPVtdO3RoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXJzLmZvckVhY2goZnVuY3Rpb24ocSl7cT1xKG4sayk7cD1wLmNvbmNhdChxKX0pO3JldHVybiBwfTtsLnByb3RvdHlwZS5fZ2V0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuW119O2wucHJvdG90eXBlLm9uVXBkYXRlPWZ1bmN0aW9uKGspe3RoaXMuX2NhbGxiYWNrcy5hZGQoayk7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLm9mZlVwZGF0ZT1mdW5jdGlvbihrKXt0aGlzLl9jYWxsYmFja3MuZGVsZXRlKGspOwpyZXR1cm4gdGhpc307bC5wcm90b3R5cGUuX2Rpc3BhdGNoVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSWQrKzt0aGlzLl9jYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKX07bC5wcm90b3R5cGUuYXV0b0RvbWFpbj1mdW5jdGlvbigpe3RoaXMuX2F1dG9Eb21haW5BdXRvbWF0aWNhbGx5PSEwO3RoaXMuX3NldERvbWFpbih0aGlzLl9nZXRFeHRlbnQoKSl9O2wucHJvdG90eXBlLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlPWZ1bmN0aW9uKCl7dGhpcy5fYXV0b0RvbWFpbkF1dG9tYXRpY2FsbHkmJnRoaXMuYXV0b0RvbWFpbigpfTtsLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBzY2FsZSIpO307bC5wcm90b3R5cGUudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21haW4oKX07bC5wcm90b3R5cGUuZG9tYWluPWZ1bmN0aW9uKGspe2lmKG51bGw9PWspcmV0dXJuIHRoaXMuX2dldERvbWFpbigpOwp0aGlzLl9hdXRvRG9tYWluQXV0b21hdGljYWxseT0hMTt0aGlzLl9zZXREb21haW4oayk7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2dldERvbWFpbiIpO307bC5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihrKXt0aGlzLl9kb21haW5Nb2RpZmljYXRpb25JblByb2dyZXNzfHwodGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzcz0hMCx0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oayksdGhpcy5fZGlzcGF0Y2hVcGRhdGUoKSx0aGlzLl9kb21haW5Nb2RpZmljYXRpb25JblByb2dyZXNzPSExKX07bC5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfYmFja2luZ0RvbWFpbiIpO307bC5wcm90b3R5cGUucmFuZ2U9ZnVuY3Rpb24oayl7aWYobnVsbD09aylyZXR1cm4gdGhpcy5fZ2V0UmFuZ2UoKTsKdGhpcy5fc2V0UmFuZ2Uoayk7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfZ2V0UmFuZ2UiKTt9O2wucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfc2V0UmFuZ2UiKTt9O2wucHJvdG90eXBlLmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXI9ZnVuY3Rpb24oayl7dGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcnMuYWRkKGspO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKTtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUucmVtb3ZlSW5jbHVkZWRWYWx1ZXNQcm92aWRlcj1mdW5jdGlvbihrKXt0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVycy5kZWxldGUoayk7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpfTtsLnByb3RvdHlwZS51cGRhdGVJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl91cGRhdGVJZH07CnJldHVybiBsfSgpO2QuU2NhbGU9Y30sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcocix0LHYseSl7Zm9yKHZhciB6PXt9LHg9MDt4PHQubGVuZ3RoO3grKyl7dmFyIEM9dFt4XTtyLmhhc093blByb3BlcnR5KEMpJiYoeltDXT1yW0NdKHYseSkpfXJldHVybiB6fWZ1bmN0aW9uIGwocil7cmV0dXJuKG51bGwhPXJbInN0cm9rZS1vcGFjaXR5Il0/cGFyc2VGbG9hdChyWyJzdHJva2Utb3BhY2l0eSJdKToxKSoobnVsbCE9ci5vcGFjaXR5P3BhcnNlRmxvYXQoci5vcGFjaXR5KToxKX1mdW5jdGlvbiBrKHIpe3JldHVybihudWxsIT1yWyJmaWxsLW9wYWNpdHkiXT9wYXJzZUZsb2F0KHJbImZpbGwtb3BhY2l0eSJdKToxKSoobnVsbCE9ci5vcGFjaXR5P3BhcnNlRmxvYXQoci5vcGFjaXR5KToxKX1mdW5jdGlvbiBuKHIpe3JldHVybiBudWxsIT1yWyJzdHJva2Utd2lkdGgiXT9wYXJzZUZsb2F0KHJbInN0cm9rZS13aWR0aCJdKToxfWZ1bmN0aW9uIHAocix0KXtpZih0LnN0cm9rZSl7ci5saW5lV2lkdGg9Cm4odCk7dmFyIHY9cS5jb2xvcih0LnN0cm9rZSk7di5vcGFjaXR5Kj1sKHQpO3Iuc3Ryb2tlU3R5bGU9di50b1N0cmluZygpO3Iuc3Ryb2tlKCl9dC5maWxsJiYodj1xLmNvbG9yKHQuZmlsbCksdi5vcGFjaXR5Kj1rKHQpLHIuZmlsbFN0eWxlPXYudG9TdHJpbmcoKSxyLmZpbGwoKSl9dmFyIHE9ZigxKTtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcih0LHYpe3RoaXMuX2NvbnRleHQ9dDt0aGlzLl9kcmF3U3RlcD12fXIucHJvdG90eXBlLmdldERyYXdTdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYXdTdGVwfTtyLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKHQsdil7dj12W3YubGVuZ3RoLTFdLmF0dHJUb0FwcGxpZWRQcm9qZWN0b3I7dGhpcy5fY29udGV4dC5zYXZlKCk7dGhpcy5fZHJhd1N0ZXAodGhpcy5fY29udGV4dCx0LHYpO3RoaXMuX2NvbnRleHQucmVzdG9yZSgpfTtyLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVzPWZ1bmN0aW9uKCl7cmV0dXJuW119O3IucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9CmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9O3IucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe307cmV0dXJuIHJ9KCk7ZC5DYW52YXNEcmF3ZXI9YztkLkNvbnRleHRTdHlsZUF0dHJzPSJmaWxsLW9wYWNpdHkgZmlsbCBvcGFjaXR5IHN0cm9rZS1vcGFjaXR5IHN0cm9rZS13aWR0aCBzdHJva2UiLnNwbGl0KCIgIik7ZC5yZXNvbHZlQXR0cmlidXRlc1N1YnNldFdpdGhTdHlsZXM9ZnVuY3Rpb24ocix0LHYseSl7cmV0dXJuIGcocixkLkNvbnRleHRTdHlsZUF0dHJzLmNvbmNhdCh0KSx2LHkpfTtkLnJlc29sdmVBdHRyaWJ1dGVzPWc7ZC5nZXRTdHJva2VXaWR0aD1uO2QucmVuZGVyQXJlYT1mdW5jdGlvbihyLHQsdix5KXtyLnNhdmUoKTtyLmJlZ2luUGF0aCgpO3QuY29udGV4dChyKTt0KHYpO3IubGluZUpvaW49InJvdW5kIjtwKHIseSk7ci5yZXN0b3JlKCl9O2QucmVuZGVyTGluZT1mdW5jdGlvbihyLHQsdix5KXtyLnNhdmUoKTtyLmJlZ2luUGF0aCgpO3QuY29udGV4dChyKTt0KHYpOwpyLmxpbmVKb2luPSJyb3VuZCI7cChyLHkpO3IucmVzdG9yZSgpfTtkLnJlbmRlclBhdGhXaXRoU3R5bGU9cH0sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcobCl7Zm9yKHZhciBrIGluIGwpZC5oYXNPd25Qcm9wZXJ0eShrKXx8KGRba109bFtrXSl9ZyhmKDUwKSk7ZyhmKDI3KSk7ZyhmKDUxKSk7ZyhmKDkzKSk7ZyhmKDUzKSk7ZyhmKDk0KSk7ZyhmKDk1KSk7ZyhmKDk2KSk7ZyhmKDk3KSk7ZyhmKDk4KSk7ZyhmKDk5KSk7ZyhmKDEwMCkpfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhsKXtmb3IodmFyIGsgaW4gbClkLmhhc093blByb3BlcnR5KGspfHwoZFtrXT1sW2tdKX1nKGYoOTIpKTtnKGYoOTEpKTtjPWYoNDkpO2Quc2lnbj1jLnNpZ259LGZ1bmN0aW9uKGMsZCxmKXtmdW5jdGlvbiBnKGwpe2Zvcih2YXIgayBpbiBsKWQuaGFzT3duUHJvcGVydHkoayl8fChkW2tdPWxba10pfWcoZigxMzQpKTtnKGYoMTM1KSk7ZyhmKDEzNikpO2coZigxMzcpKX0sZnVuY3Rpb24oYywKZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocSxyKXtmdW5jdGlvbiB0KCl7dGhpcy5jb25zdHJ1Y3Rvcj1xfWZvcih2YXIgdiBpbiByKXIuaGFzT3duUHJvcGVydHkodikmJihxW3ZdPXJbdl0pO3EucHJvdG90eXBlPW51bGw9PT1yP09iamVjdC5jcmVhdGUocik6KHQucHJvdG90eXBlPXIucHJvdG90eXBlLG5ldyB0KX0sbD1mKDEpLGs9Zig1KTtjPWYoNCk7dmFyIG49Zig4KSxwPWYoMCk7Zj1mKDEwKTtkLkF4aXNPcmllbnRhdGlvbj1mLm1ha2VFbnVtKFsiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwidG9wIl0pO2Y9ZnVuY3Rpb24ocSl7ZnVuY3Rpb24gcih0LHYpe3ZhciB5PXEuY2FsbCh0aGlzKXx8dGhpczt5Ll9lbmRUaWNrTGVuZ3RoPTU7eS5faW5uZXJUaWNrTGVuZ3RoPTU7eS5fdGlja0xhYmVsUGFkZGluZz0xMDt5Ll9tYXJnaW49MTU7eS5fc2hvd0VuZFRpY2tMYWJlbHM9ITE7eS5fYW5ub3RhdGlvbnNFbmFibGVkPSExO3kuX2Fubm90YXRpb25UaWVyQ291bnQ9CjE7aWYobnVsbD09dHx8bnVsbD09dil0aHJvdyBFcnJvcigiQXhpcyByZXF1aXJlcyBhIHNjYWxlIGFuZCBvcmllbnRhdGlvbiIpO3kuX3NjYWxlPXQ7eS5vcmllbnRhdGlvbih2KTt5Ll9zZXREZWZhdWx0QWxpZ25tZW50KCk7eS5hZGRDbGFzcygiYXhpcyIpO3kuaXNIb3Jpem9udGFsKCk/eS5hZGRDbGFzcygieC1heGlzIik6eS5hZGRDbGFzcygieS1heGlzIik7eS5mb3JtYXR0ZXIobi5pZGVudGl0eSgpKTt5Ll9yZXNjYWxlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4geS5fcmVzY2FsZSgpfTt5Ll9zY2FsZS5vblVwZGF0ZSh5Ll9yZXNjYWxlQ2FsbGJhY2spO3kuX2Fubm90YXRlZFRpY2tzPVtdO3kuX2Fubm90YXRpb25Gb3JtYXR0ZXI9bi5pZGVudGl0eSgpO3JldHVybiB5fWcocixxKTtyLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7cS5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX3NjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZXNjYWxlQ2FsbGJhY2spfTsKci5wcm90b3R5cGUudGlja0xhYmVsRGF0YU9uRWxlbWVudD1mdW5jdGlvbih0KXtpZihudWxsIT10KXtmb3IodmFyIHY7bnVsbCE9dCYmdC5jbGFzc0xpc3QmJnZvaWQgMD09PXY7KXQuY2xhc3NMaXN0LmNvbnRhaW5zKHIuVElDS19MQUJFTF9DTEFTUyk/dj10OnQ9dC5wYXJlbnROb2RlO3JldHVybiB2b2lkIDA9PT10P3ZvaWQgMDpsLnNlbGVjdCh0KS5kYXR1bSgpfX07ci5wcm90b3R5cGUuX2NvbXB1dGVXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKX07ci5wcm90b3R5cGUuX2NvbXB1dGVIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCl9O3IucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKCl7dmFyIHQ9MCx2PTA7aWYodGhpcy5pc0hvcml6b250YWwoKSl7aWYodj10aGlzLl9jb21wdXRlSGVpZ2h0KCkrdGhpcy5fbWFyZ2luLHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkpe3ZhciB5PQp0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCsyKnIuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORzt2Kz15KnRoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpfX1lbHNlIHQ9dGhpcy5fY29tcHV0ZVdpZHRoKCkrdGhpcy5fbWFyZ2luLHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkmJih5PXRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqci5fQU5OT1RBVElPTl9MQUJFTF9QQURESU5HLHQrPXkqdGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCkpO3JldHVybnttaW5XaWR0aDp0LG1pbkhlaWdodDp2fX07ci5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0hvcml6b250YWwoKX07ci5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzSG9yaXpvbnRhbCgpfTtyLnByb3RvdHlwZS5fcmVzY2FsZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyKCl9O3IucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9CmZ1bmN0aW9uKHQsdix5KXtxLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyx0LHYseSk7dGhpcy5pc0hvcml6b250YWwoKT90aGlzLl9zY2FsZS5yYW5nZShbMCx0aGlzLndpZHRoKCldKTp0aGlzLl9zY2FsZS5yYW5nZShbdGhpcy5oZWlnaHQoKSwwXSk7cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHQsdil7dmFyIHk9dGhpcy5yZXF1ZXN0ZWRTcGFjZSh0LHYpO3JldHVybiB0aGlzLmlzSG9yaXpvbnRhbCgpP3t3aWR0aDp0LGhlaWdodDp5Lm1pbkhlaWdodH06e2hlaWdodDp2LHdpZHRoOnkubWluV2lkdGh9fTtyLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtxLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl90aWNrTWFya0NvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKHIuVElDS19NQVJLX0NMQVNTKyItY29udGFpbmVyIiwhMCk7dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyPQp0aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKHIuVElDS19MQUJFTF9DTEFTUysiLWNvbnRhaW5lciIsITApO3RoaXMuX2Jhc2VsaW5lPXRoaXMuY29udGVudCgpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImJhc2VsaW5lIiwhMCk7dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLWNvbnRhaW5lciIsITApO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1saW5lLWNvbnRhaW5lciIsITApO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1jaXJjbGUtY29udGFpbmVyIiwhMCk7dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLXJlY3QtY29udGFpbmVyIiwhMCk7dmFyIHQ9dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLWxhYmVsLWNvbnRhaW5lciIsCiEwKTt0PW5ldyBrLlN2Z0NvbnRleHQodC5ub2RlKCkpO3RoaXMuX2Fubm90YXRpb25NZWFzdXJlcj1uZXcgay5DYWNoZU1lYXN1cmVyKHQpO3RoaXMuX2Fubm90YXRpb25Xcml0ZXI9bmV3IGsuV3JpdGVyKHRoaXMuX2Fubm90YXRpb25NZWFzdXJlcix0KX07ci5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm5bXX07ci5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9nZXRUaWNrVmFsdWVzKCksdj10aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3IuVElDS19NQVJLX0NMQVNTKS5kYXRhKHQpLHk9di5lbnRlcigpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoci5USUNLX01BUktfQ0xBU1MsITApLm1lcmdlKHYpO3kuYXR0cnModGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCkpO2wuc2VsZWN0KHkubm9kZXMoKVswXSkuY2xhc3NlZChyLkVORF9USUNLX01BUktfQ0xBU1MsITApLmF0dHJzKHRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCghMCkpOwpsLnNlbGVjdCh5Lm5vZGVzKClbdC5sZW5ndGgtMV0pLmNsYXNzZWQoci5FTkRfVElDS19NQVJLX0NMQVNTLCEwKS5hdHRycyh0aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goITApKTt2LmV4aXQoKS5yZW1vdmUoKTt0aGlzLl9iYXNlbGluZS5hdHRycyh0aGlzLl9nZW5lcmF0ZUJhc2VsaW5lQXR0ckhhc2goKSk7dGhpcy5hbm5vdGF0aW9uc0VuYWJsZWQoKT90aGlzLl9kcmF3QW5ub3RhdGlvbnMoKTp0aGlzLl9yZW1vdmVBbm5vdGF0aW9ucygpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5hbm5vdGF0ZWRUaWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbm5vdGF0ZWRUaWNrc307ci5wcm90b3R5cGUuYW5ub3RhdGlvbkZvcm1hdHRlcj1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9hbm5vdGF0aW9uRm9ybWF0dGVyO3RoaXMuX2Fubm90YXRpb25Gb3JtYXR0ZXI9dDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5hbm5vdGF0aW9uc0VuYWJsZWQ9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fubm90YXRpb25zRW5hYmxlZH07ci5wcm90b3R5cGUuYW5ub3RhdGlvblRpZXJDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbm5vdGF0aW9uVGllckNvdW50fTtyLnByb3RvdHlwZS5fZHJhd0Fubm90YXRpb25zPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChiYSl7c3dpdGNoKEMub3JpZW50YXRpb24oKSl7Y2FzZSAiYm90dG9tIjpjYXNlICJyaWdodCI6cmV0dXJuIHooYmEpO2Nhc2UgInRvcCI6Y2FzZSAibGVmdCI6cmV0dXJuIHooYmEpLUQuZ2V0KGJhKS5oZWlnaHR9fWZ1bmN0aW9uIHYoYmEpe3JldHVybiBQLmhhcyhiYSk/ImhpZGRlbiI6InZpc2libGUifWZ1bmN0aW9uIHkoYmEpe3JldHVybiBDLl9zY2FsZS5zY2FsZShiYSl9ZnVuY3Rpb24geihiYSl7c3dpdGNoKEMub3JpZW50YXRpb24oKSl7Y2FzZSAiYm90dG9tIjpjYXNlICJyaWdodCI6cmV0dXJuIE8uZ2V0KGJhKSpJK0s7Y2FzZSAidG9wIjpjYXNlICJsZWZ0IjpyZXR1cm4gSC0KSy1PLmdldChiYSkqSX19ZnVuY3Rpb24geChiYSxtYSxhYSl7YmE9YmEuc2VsZWN0QWxsKCIuIithYSkuZGF0YShCKTttYT1iYS5lbnRlcigpLmFwcGVuZChtYSkuY2xhc3NlZChhYSwhMCkubWVyZ2UoYmEpO2JhLmV4aXQoKS5yZW1vdmUoKTtyZXR1cm4gbWF9dmFyIEM9dGhpcyxGPXIuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORyxEPW5ldyBwLk1hcCxCPXRoaXMuX2Fubm90YXRlZFRpY2tzVG9SZW5kZXIoKTtCLmZvckVhY2goZnVuY3Rpb24oYmEpe3ZhciBtYT1DLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZShDLmFubm90YXRpb25Gb3JtYXR0ZXIoKShiYSkpO0Quc2V0KGJhLHt3aWR0aDptYS53aWR0aCsyKkYsaGVpZ2h0Om1hLmhlaWdodCsyKkZ9KX0pO3ZhciBJPXRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqRixPPXRoaXMuX2Fubm90YXRpb25Ub1RpZXIoRCksUD1uZXcgcC5TZXQsSD10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuaGVpZ2h0KCk6CnRoaXMud2lkdGgoKSxLPXRoaXMuX2NvcmVTaXplKCksTT1NYXRoLm1pbih0aGlzLmFubm90YXRpb25UaWVyQ291bnQoKSxNYXRoLmZsb29yKChILUspL0kpKTtPLmZvckVhY2goZnVuY3Rpb24oYmEsbWEpeygtMT09PWJhfHxiYT49TSkmJlAuYWRkKG1hKX0pO3N3aXRjaCh0aGlzLm9yaWVudGF0aW9uKCkpe2Nhc2UgImJvdHRvbSI6Y2FzZSAicmlnaHQiOnZhciBMPTA7YnJlYWs7Y2FzZSAidG9wIjpMPXRoaXMuaGVpZ2h0KCk7YnJlYWs7Y2FzZSAibGVmdCI6TD10aGlzLndpZHRoKCl9dmFyIFI9dGhpcy5pc0hvcml6b250YWwoKTt4KHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1saW5lLWNvbnRhaW5lciIpLCJsaW5lIixyLkFOTk9UQVRJT05fTElORV9DTEFTUykuYXR0cnMoe3gxOlI/eTpMLHgyOlI/eTp6LHkxOlI/TDp5LHkyOlI/ejp5LHZpc2liaWxpdHk6dn0pO3godGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3QoIi5hbm5vdGF0aW9uLWNpcmNsZS1jb250YWluZXIiKSwKImNpcmNsZSIsci5BTk5PVEFUSU9OX0NJUkNMRV9DTEFTUykuYXR0cnMoe2N4OlI/eTpMLGN5OlI/TDp5LHI6M30pO3godGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3QoIi5hbm5vdGF0aW9uLXJlY3QtY29udGFpbmVyIiksInJlY3QiLHIuQU5OT1RBVElPTl9SRUNUX0NMQVNTKS5hdHRycyh7eDpSP3k6dCx5OlI/dDp5LHdpZHRoOlI/ZnVuY3Rpb24oYmEpe3JldHVybiBELmdldChiYSkud2lkdGh9OmZ1bmN0aW9uKGJhKXtyZXR1cm4gRC5nZXQoYmEpLmhlaWdodH0saGVpZ2h0OlI/ZnVuY3Rpb24oYmEpe3JldHVybiBELmdldChiYSkuaGVpZ2h0fTpmdW5jdGlvbihiYSl7cmV0dXJuIEQuZ2V0KGJhKS53aWR0aH0sdmlzaWJpbGl0eTp2fSk7dmFyIFU9dGhpcy5fYW5ub3RhdGlvbldyaXRlcixZPXRoaXMuYW5ub3RhdGlvbkZvcm1hdHRlcigpO0w9eCh0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdCgiLmFubm90YXRpb24tbGFiZWwtY29udGFpbmVyIiksImciLHIuQU5OT1RBVElPTl9MQUJFTF9DTEFTUyk7Ckwuc2VsZWN0QWxsKCIudGV4dC1jb250YWluZXIiKS5yZW1vdmUoKTtMLmF0dHJzKHt0cmFuc2Zvcm06ZnVuY3Rpb24oYmEpe3ZhciBtYT1SP3koYmEpOnQoYmEpO2JhPVI/dChiYSk6eShiYSk7cmV0dXJuInRyYW5zbGF0ZSgiK21hKyIsIitiYSsiKSJ9LHZpc2liaWxpdHk6dn0pLmVhY2goZnVuY3Rpb24oYmEpe1Uud3JpdGUoWShiYSksUj9ELmdldChiYSkud2lkdGg6RC5nZXQoYmEpLmhlaWdodCxSP0QuZ2V0KGJhKS5oZWlnaHQ6RC5nZXQoYmEpLndpZHRoLHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIiLHRleHRSb3RhdGlvbjpSPzA6OTB9LGwuc2VsZWN0KHRoaXMpLm5vZGUoKSl9KX07ci5wcm90b3R5cGUuX2Fubm90YXRlZFRpY2tzVG9SZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLHY9dGhpcy5fc2NhbGUucmFuZ2UoKTtyZXR1cm4gcC5BcnJheS51bmlxKHRoaXMuYW5ub3RhdGVkVGlja3MoKS5maWx0ZXIoZnVuY3Rpb24oeSl7cmV0dXJuIG51bGw9PXk/ITE6cC5NYXRoLmluUmFuZ2UodC5fc2NhbGUuc2NhbGUoeSksCnZbMF0sdlsxXSl9KSl9O3IucHJvdG90eXBlLl9jb3JlU2l6ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLndpZHRoKCksdj10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuX2NvbXB1dGVIZWlnaHQoKTp0aGlzLl9jb21wdXRlV2lkdGgoKTtyZXR1cm4gTWF0aC5taW4odix0KX07ci5wcm90b3R5cGUuX2Fubm90YXRpb25UaWVySGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqci5fQU5OT1RBVElPTl9MQUJFTF9QQURESU5HfTtyLnByb3RvdHlwZS5fYW5ub3RhdGlvblRvVGllcj1mdW5jdGlvbih0KXt2YXIgdj10aGlzLHk9W1tdXSx6PW5ldyBwLk1hcCx4PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy53aWR0aCgpOnRoaXMuaGVpZ2h0KCk7dGhpcy5fYW5ub3RhdGVkVGlja3NUb1JlbmRlcigpLmZvckVhY2goZnVuY3Rpb24oQyl7dmFyIEY9di5fc2NhbGUuc2NhbGUoQyksCkQ9dC5nZXQoQykud2lkdGg7aWYoMD5GfHxGK0Q+eCl6LnNldChDLC0xKTtlbHNle2Zvcih2YXIgQj1mdW5jdGlvbihPKXtyZXR1cm4geVtPXS5zb21lKGZ1bmN0aW9uKFApe3ZhciBIPXYuX3NjYWxlLnNjYWxlKFApO1A9dC5nZXQoUCkud2lkdGg7cmV0dXJuIEYrRD49SCYmRjw9SCtQfSl9LEk9MDtCKEkpOylJKysseS5sZW5ndGg9PT1JJiZ5LnB1c2goW10pO3lbSV0ucHVzaChDKTt6LnNldChDLEkpfX0pO3JldHVybiB6fTtyLnByb3RvdHlwZS5fcmVtb3ZlQW5ub3RhdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tbGluZSIpLnJlbW92ZSgpO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0QWxsKCIuYW5ub3RhdGlvbi1jaXJjbGUiKS5yZW1vdmUoKTt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tcmVjdCIpLnJlbW92ZSgpO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0QWxsKCIuYW5ub3RhdGlvbi1sYWJlbCIpLnJlbW92ZSgpfTsKci5wcm90b3R5cGUuX2dlbmVyYXRlQmFzZWxpbmVBdHRySGFzaD1mdW5jdGlvbigpe3ZhciB0PXt4MTowLHkxOjAseDI6MCx5MjowfTtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6dC54Mj10aGlzLndpZHRoKCk7YnJlYWs7Y2FzZSAidG9wIjp0LngyPXRoaXMud2lkdGgoKTt0LnkxPXRoaXMuaGVpZ2h0KCk7dC55Mj10aGlzLmhlaWdodCgpO2JyZWFrO2Nhc2UgImxlZnQiOnQueDE9dGhpcy53aWR0aCgpO3QueDI9dGhpcy53aWR0aCgpO3QueTI9dGhpcy5oZWlnaHQoKTticmVhaztjYXNlICJyaWdodCI6dC55Mj10aGlzLmhlaWdodCgpfXJldHVybiB0fTtyLnByb3RvdHlwZS5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHYoeCl7cmV0dXJuIHkuX3NjYWxlLnNjYWxlKHgpfXZhciB5PXRoaXM7dm9pZCAwPT09dCYmKHQ9ITEpO3ZhciB6PXt4MTowLHkxOjAseDI6MCx5MjowfTt0aGlzLmlzSG9yaXpvbnRhbCgpPyh6LngxPQp2LHoueDI9dik6KHoueTE9dix6LnkyPXYpO3Q9dD90aGlzLl9lbmRUaWNrTGVuZ3RoOnRoaXMuX2lubmVyVGlja0xlbmd0aDtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6ei55Mj10O2JyZWFrO2Nhc2UgInRvcCI6ei55MT10aGlzLmhlaWdodCgpO3oueTI9dGhpcy5oZWlnaHQoKS10O2JyZWFrO2Nhc2UgImxlZnQiOnoueDE9dGhpcy53aWR0aCgpO3oueDI9dGhpcy53aWR0aCgpLXQ7YnJlYWs7Y2FzZSAicmlnaHQiOnoueDI9dH1yZXR1cm4gen07ci5wcm90b3R5cGUuX3NldERlZmF1bHRBbGlnbm1lbnQ9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6dGhpcy55QWxpZ25tZW50KCJ0b3AiKTticmVhaztjYXNlICJ0b3AiOnRoaXMueUFsaWdubWVudCgiYm90dG9tIik7YnJlYWs7Y2FzZSAibGVmdCI6dGhpcy54QWxpZ25tZW50KCJyaWdodCIpO2JyZWFrO2Nhc2UgInJpZ2h0Ijp0aGlzLnhBbGlnbm1lbnQoImxlZnQiKX19OwpyLnByb3RvdHlwZS5pc0hvcml6b250YWw9ZnVuY3Rpb24oKXtyZXR1cm4idG9wIj09PXRoaXMuX29yaWVudGF0aW9ufHwiYm90dG9tIj09PXRoaXMuX29yaWVudGF0aW9ufTtyLnByb3RvdHlwZS5nZXRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY2FsZX07ci5wcm90b3R5cGUuZm9ybWF0dGVyPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX2Zvcm1hdHRlcjt0aGlzLl9mb3JtYXR0ZXI9dDt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5pbm5lclRpY2tMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5uZXJUaWNrTGVuZ3RofTtyLnByb3RvdHlwZS5lbmRUaWNrTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VuZFRpY2tMZW5ndGh9O3IucHJvdG90eXBlLl9tYXhMYWJlbFRpY2tMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaG93RW5kVGlja0xhYmVscygpP01hdGgubWF4KHRoaXMuaW5uZXJUaWNrTGVuZ3RoKCksCnRoaXMuZW5kVGlja0xlbmd0aCgpKTp0aGlzLmlubmVyVGlja0xlbmd0aCgpfTtyLnByb3RvdHlwZS50aWNrTGFiZWxQYWRkaW5nPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbFBhZGRpbmc7aWYoMD50KXRocm93IEVycm9yKCJ0aWNrIGxhYmVsIHBhZGRpbmcgbXVzdCBiZSBwb3NpdGl2ZSIpO3RoaXMuX3RpY2tMYWJlbFBhZGRpbmc9dDt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5tYXJnaW49ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fbWFyZ2luO2lmKDA+dCl0aHJvdyBFcnJvcigibWFyZ2luIHNpemUgbXVzdCBiZSBwb3NpdGl2ZSIpO3RoaXMuX21hcmdpbj10O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX29yaWVudGF0aW9uO3Q9dC50b0xvd2VyQ2FzZSgpO2lmKCJ0b3AiIT09dCYmImJvdHRvbSIhPT0KdCYmImxlZnQiIT09dCYmInJpZ2h0IiE9PXQpdGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIG9yaWVudGF0aW9uIik7dGhpcy5fb3JpZW50YXRpb249dDt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5zaG93RW5kVGlja0xhYmVscz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaG93RW5kVGlja0xhYmVsc307ci5wcm90b3R5cGUuX3Nob3dBbGxUaWNrTWFya3M9ZnVuY3Rpb24oKXt0aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3IuVElDS19NQVJLX0NMQVNTKS5lYWNoKGZ1bmN0aW9uKCl7bC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0Iil9KX07ci5wcm90b3R5cGUuX3Nob3dBbGxUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrci5USUNLX0xBQkVMX0NMQVNTKS5lYWNoKGZ1bmN0aW9uKCl7bC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0Iil9KX07CnIucHJvdG90eXBlLl9oaWRlT3ZlcmZsb3dpbmdUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbGVtZW50KCkubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHY9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrci5USUNLX0xBQkVMX0NMQVNTKTt2LmVtcHR5KCl8fHYuZWFjaChmdW5jdGlvbigpe3AuRE9NLmNsaWVudFJlY3RJbnNpZGUodGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0KXx8bC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX0pfTtyLnByb3RvdHlwZS5faGlkZVRpY2tNYXJrc1dpdGhvdXRMYWJlbD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3RpY2tNYXJrQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrci5USUNLX01BUktfQ0xBU1MpLHY9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrci5USUNLX0xBQkVMX0NMQVNTKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgeT1sLnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIpOwpyZXR1cm4iaW5oZXJpdCI9PT15fHwidmlzaWJsZSI9PT15fSkuZGF0YSgpO3QuZWFjaChmdW5jdGlvbih5KXstMT09PXYuaW5kZXhPZih5KSYmbC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX0pfTtyLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtxLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHJ9KGMuQ29tcG9uZW50KTtmLkVORF9USUNLX01BUktfQ0xBU1M9ImVuZC10aWNrLW1hcmsiO2YuVElDS19NQVJLX0NMQVNTPSJ0aWNrLW1hcmsiO2YuVElDS19MQUJFTF9DTEFTUz0idGljay1sYWJlbCI7Zi5BTk5PVEFUSU9OX0xJTkVfQ0xBU1M9ImFubm90YXRpb24tbGluZSI7Zi5BTk5PVEFUSU9OX1JFQ1RfQ0xBU1M9ImFubm90YXRpb24tcmVjdCI7Zi5BTk5PVEFUSU9OX0NJUkNMRV9DTEFTUz0iYW5ub3RhdGlvbi1jaXJjbGUiO2YuQU5OT1RBVElPTl9MQUJFTF9DTEFTUz0KImFubm90YXRpb24tbGFiZWwiO2YuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORz00O2QuQXhpcz1mfSxmdW5jdGlvbihjLGQpe2QuU0hPV19XQVJOSU5HUz0hMDtkLkFERF9USVRMRV9FTEVNRU5UUz0hMH0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoMCk7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGwoKXt0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uPXt9O3RoaXMuX2V2ZW50VGFyZ2V0PWRvY3VtZW50O3RoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXQ9e307dGhpcy5fY29ubmVjdGVkPSExfWwucHJvdG90eXBlLl9oYXNOb0NhbGxiYWNrcz1mdW5jdGlvbigpe2Zvcih2YXIgaz1PYmplY3Qua2V5cyh0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0KSxuPTA7bjxrLmxlbmd0aDtuKyspaWYoMCE9PXRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRba1tuXV0uc2l6ZSlyZXR1cm4hMTtyZXR1cm4hMH07bC5wcm90b3R5cGUuX2Nvbm5lY3Q9ZnVuY3Rpb24oKXt2YXIgaz10aGlzOwp0aGlzLl9jb25uZWN0ZWR8fChPYmplY3Qua2V5cyh0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe2suX2V2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIobixrLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW25dKX0pLHRoaXMuX2Nvbm5lY3RlZD0hMCl9O2wucHJvdG90eXBlLl9kaXNjb25uZWN0PWZ1bmN0aW9uKCl7dmFyIGs9dGhpczt0aGlzLl9jb25uZWN0ZWQmJnRoaXMuX2hhc05vQ2FsbGJhY2tzKCkmJihPYmplY3Qua2V5cyh0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe2suX2V2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIobixrLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW25dKX0pLHRoaXMuX2Nvbm5lY3RlZD0hMSl9O2wucHJvdG90eXBlLl9hZGRDYWxsYmFja0ZvckV2ZW50PWZ1bmN0aW9uKGssbil7bnVsbD09dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtrXSYmCih0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W2tdPW5ldyBnLkNhbGxiYWNrU2V0KTt0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W2tdLmFkZChuKTt0aGlzLl9jb25uZWN0KCl9O2wucHJvdG90eXBlLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50PWZ1bmN0aW9uKGssbil7bnVsbCE9dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtrXSYmdGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtrXS5kZWxldGUobik7dGhpcy5fZGlzY29ubmVjdCgpfTtsLnByb3RvdHlwZS5fY2FsbENhbGxiYWNrc0ZvckV2ZW50PWZ1bmN0aW9uKGspe2Zvcih2YXIgbj1bXSxwPTE7cDxhcmd1bWVudHMubGVuZ3RoO3ArKyluW3AtMV09YXJndW1lbnRzW3BdO3A9dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtrXTtudWxsIT1wJiZwLmNhbGxDYWxsYmFja3MuYXBwbHkocCxuKX07cmV0dXJuIGx9KCk7ZC5EaXNwYXRjaGVyPWN9LGZ1bmN0aW9uKGMsZCxmKXtmdW5jdGlvbiBnKGwpe2Zvcih2YXIgayBpbiBsKWQuaGFzT3duUHJvcGVydHkoayl8fAooZFtrXT1sW2tdKX1nKGYoODcpKTtnKGYoODgpKTtnKGYoNDApKTtnKGYoODkpKTtnKGYoOTApKTtjPWYoMjYpO2Quem9vbU91dD1jLnpvb21PdXR9LGZ1bmN0aW9uKGMsZCl7ZnVuY3Rpb24gZihxLHIsdCl7cmV0dXJuIHQtKHQtcSkqcn1mdW5jdGlvbiBnKHEscix0KXtyZXR1cm4ocSpyLXQpLyhyLTEpfWZ1bmN0aW9uIGwocSxyLHQsdil7dmFyIHk9MTxyO3Q9eT92OnQ7aWYobnVsbD09dClyZXR1cm4gcjtxPXEuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTtyZXR1cm4oeT9NYXRoLm1pbjpNYXRoLm1heCkocix0L01hdGguYWJzKHFbMV0tcVswXSkpfWZ1bmN0aW9uIGsocSxyLHQsdix5KXtpZigxPj1yKXJldHVybntjZW50ZXJQb2ludDp0LHpvb21BbW91bnQ6cn07aWYobnVsbD09diYmbnVsbD09eSlyZXR1cm57Y2VudGVyUG9pbnQ6dCx6b29tQW1vdW50OnJ9O3ZhciB6PW4ocSkseD1wKHEpLEM9eD9JbmZpbml0eTotSW5maW5pdHk7eD14Py1JbmZpbml0eTpJbmZpbml0eTt2PW51bGw9PQp2P0M6djt5PW51bGw9PXk/eDp5O3g9cS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpO0M9eFswXTt4PXhbMV07eT1xLnNjYWxlVHJhbnNmb3JtYXRpb24oeSk7eD1xLnNjYWxlVHJhbnNmb3JtYXRpb24oeCk7dmFyIEY9Zih4LHIsdCk7dj1xLnNjYWxlVHJhbnNmb3JtYXRpb24odik7cT1xLnNjYWxlVHJhbnNmb3JtYXRpb24oQyk7Qz1mKHEscix0KTtyZXR1cm4gTWF0aC5hYnMoRi1DKT5NYXRoLmFicyh5LXYpPyhyPSh5LXYpLyh4LXEpLDEhPT1yP3tjZW50ZXJQb2ludDpnKHgscix5KSx6b29tQW1vdW50OnJ9OntjZW50ZXJQb2ludDp0LHpvb21BbW91bnQ6cn0pOkY+eSE9ej97Y2VudGVyUG9pbnQ6Zyh4LHIseSksem9vbUFtb3VudDpyfTpDPHYhPXo/e2NlbnRlclBvaW50OmcocSxyLHYpLHpvb21BbW91bnQ6cn06e2NlbnRlclBvaW50OnQsem9vbUFtb3VudDpyfX1mdW5jdGlvbiBuKHEpe3E9cS5yYW5nZSgpO3JldHVybiBxWzFdPHFbMF19ZnVuY3Rpb24gcChxKXtxPXEuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTsKcmV0dXJuIHFbMV08cVswXX1kLnpvb21PdXQ9ZjtkLmNvbnN0cmFpbmVkWm9vbT1mdW5jdGlvbihxLHIsdCx2LHkseix4KXtyPWwocSxyLHYseSk7cmV0dXJuIGsocSxyLHQseix4KX07ZC5jb25zdHJhaW5ab29tRXh0ZW50cz1sO2QuY29uc3RyYWluWm9vbVZhbHVlcz1rO2QuY29uc3RyYWluZWRUcmFuc2xhdGlvbj1mdW5jdGlvbihxLHIsdCx2KXt2YXIgeT1xLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCksej15WzBdLHg9eVsxXTt5PW4ocSk7MDxyIT09eT8odD12LG51bGwhPXQmJih6PXEuc2NhbGVUcmFuc2Zvcm1hdGlvbih4KSxxPXEuc2NhbGVUcmFuc2Zvcm1hdGlvbih0KSxyPSh5P01hdGgubWF4Ok1hdGgubWluKSh6K3IscSkteikpOm51bGwhPXQmJih6PXEuc2NhbGVUcmFuc2Zvcm1hdGlvbih6KSxxPXEuc2NhbGVUcmFuc2Zvcm1hdGlvbih0KSxyPSh5P01hdGgubWluOk1hdGgubWF4KSh6K3IscSkteik7cmV0dXJuIHJ9fSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhJLApPLFApe3ZhciBIPUkuc2NhbGU7aWYoSCBpbnN0YW5jZW9mIHouQ2F0ZWdvcnkpUD1ILnJhbmdlQmFuZCgpO2Vsc2V7dmFyIEs9SS5hY2Nlc3NvcjtJPWsuc2V0KEMuQXJyYXkuZmxhdHRlbihPLm1hcChmdW5jdGlvbihNKXtyZXR1cm4gTS5kYXRhKCkubWFwKGZ1bmN0aW9uKEwsUil7cmV0dXJuIEsoTCxSLE0pfSkuZmlsdGVyKGZ1bmN0aW9uKEwpe3JldHVybiBudWxsIT1MfSkubWFwKGZ1bmN0aW9uKEwpe3JldHVybiBMLnZhbHVlT2YoKX0pfSkpKS52YWx1ZXMoKS5tYXAoZnVuY3Rpb24oTSl7cmV0dXJuK019KTtJLnNvcnQoZnVuY3Rpb24oTSxMKXtyZXR1cm4gTS1MfSk7ST1JLm1hcChmdW5jdGlvbihNKXtyZXR1cm4gSC5zY2FsZShNKX0pO0k9ay5wYWlycyhJKTtQPUMuTWF0aC5taW4oSSxmdW5jdGlvbihNKXtyZXR1cm4gTWF0aC5hYnMoTVsxXS1NWzBdKX0sUCpCLl9TSU5HTEVfQkFSX0RJTUVOU0lPTl9SQVRJTyk7UCo9Qi5fQkFSX1RISUNLTkVTU19SQVRJT31yZXR1cm4gUH0KdmFyIGw9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKEksTyl7ZnVuY3Rpb24gUCgpe3RoaXMuY29uc3RydWN0b3I9SX1mb3IodmFyIEggaW4gTylPLmhhc093blByb3BlcnR5KEgpJiYoSVtIXT1PW0hdKTtJLnByb3RvdHlwZT1udWxsPT09Tz9PYmplY3QuY3JlYXRlKE8pOihQLnByb3RvdHlwZT1PLnByb3RvdHlwZSxuZXcgUCl9LGs9ZigxKSxuPWYoNSkscD1mKDcpLHE9Zig4KSxyPWYoMTQpLHQ9Zig2KSx2PWYoMzQpLHk9ZigyMCksej1mKDMpLHg9ZigxMSksQz1mKDApO2M9ZigxMCk7dmFyIEY9ZigxOSksRD1mKDIpO2Y9ZigxNik7ZC5CYXJPcmllbnRhdGlvbj1jLm1ha2VFbnVtKFsidmVydGljYWwiLCJob3Jpem9udGFsIl0pO2QuTGFiZWxzUG9zaXRpb249Yy5tYWtlRW51bShbInN0YXJ0IiwibWlkZGxlIiwiZW5kIiwib3V0c2lkZSJdKTtkLkJhckFsaWdubWVudD1jLm1ha2VFbnVtKFsic3RhcnQiLCJtaWRkbGUiLCJlbmQiXSk7dmFyIEI9ZnVuY3Rpb24oSSl7ZnVuY3Rpb24gTyhQKXt2b2lkIDA9PT0KUCYmKFA9InZlcnRpY2FsIik7dmFyIEg9SS5jYWxsKHRoaXMpfHx0aGlzO0guX2xhYmVsRm9ybWF0dGVyPXEuaWRlbnRpdHkoKTtILl9sYWJlbHNFbmFibGVkPSExO0guX2xhYmVsc1Bvc2l0aW9uPWQuTGFiZWxzUG9zaXRpb24uZW5kO0guX2hpZGVCYXJzSWZBbnlBcmVUb29XaWRlPSEwO0guX2JhckFsaWdubWVudD0ibWlkZGxlIjtILl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3M9eS5tZW1vaXplKGcpO0guX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M9ITA7SC5hZGRDbGFzcygiYmFyLXBsb3QiKTtpZigidmVydGljYWwiIT09UCYmImhvcml6b250YWwiIT09UCl0aHJvdyBFcnJvcihQKyIgaXMgbm90IGEgdmFsaWQgb3JpZW50YXRpb24gZm9yIFBsb3RzLkJhciIpO0guX2lzVmVydGljYWw9InZlcnRpY2FsIj09PVA7SC5hbmltYXRvcigiYmFzZWxpbmUiLG5ldyBwLk51bGwpO0guYXR0cigiZmlsbCIsKG5ldyB6LkNvbG9yKS5yYW5nZSgpWzBdKTtILmF0dHIoTy5fQkFSX1RISUNLTkVTU19LRVksCmZ1bmN0aW9uKCl7cmV0dXJuIEguX2JhclBpeGVsVGhpY2tuZXNzKCl9KTtILl9sYWJlbENvbmZpZz1uZXcgQy5NYXA7SC5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuW0guYmFzZWxpbmVWYWx1ZSgpXX07cmV0dXJuIEh9bChPLEkpO08ucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oUCxILEspe0kucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLFAsSCxLKTt0aGlzLl91cGRhdGVFeHRlbnRzKCk7cmV0dXJuIHRoaXN9O08ucHJvdG90eXBlLng9ZnVuY3Rpb24oUCxIKXtpZihudWxsPT1QKXJldHVybiBJLnByb3RvdHlwZS54LmNhbGwodGhpcyk7bnVsbD09SD9JLnByb3RvdHlwZS54LmNhbGwodGhpcyxQKTpJLnByb3RvdHlwZS54LmNhbGwodGhpcyxQLEgpO3RoaXMuX3VwZGF0ZVRoaWNrbmVzc0F0dHIoKTt0aGlzLl91cGRhdGVMZW5ndGhTY2FsZSgpO3JldHVybiB0aGlzfTtPLnByb3RvdHlwZS55PWZ1bmN0aW9uKFAsSCl7aWYobnVsbD09ClApcmV0dXJuIEkucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtudWxsPT1IP0kucHJvdG90eXBlLnkuY2FsbCh0aGlzLFApOkkucHJvdG90eXBlLnkuY2FsbCh0aGlzLFAsSCk7dGhpcy5fdXBkYXRlTGVuZ3RoU2NhbGUoKTtyZXR1cm4gdGhpc307Ty5wcm90b3R5cGUubGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/dGhpcy55KCk6dGhpcy54KCl9O08ucHJvdG90eXBlLnBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/dGhpcy54KCk6dGhpcy55KCl9O08ucHJvdG90eXBlLmJhckVuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChPLl9CQVJfRU5EX0tFWSl9O08ucHJvdG90eXBlLmJhckFsaWdubWVudD1mdW5jdGlvbihQKXtpZihudWxsPT1QKXJldHVybiB0aGlzLl9iYXJBbGlnbm1lbnQ7dGhpcy5fYmFyQWxpZ25tZW50PVA7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7CnJldHVybiB0aGlzfTtPLnByb3RvdHlwZS5vcmllbnRhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1ZlcnRpY2FsPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwifTtPLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0LlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB2LlJlY3RhbmdsZVNWR0RyYXdlcihPLl9CQVJfQVJFQV9DTEFTUyl9LGZ1bmN0aW9uKFApe3JldHVybiBuZXcgci5SZWN0YW5nbGVDYW52YXNEcmF3ZXIoUCl9KX07Ty5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7SS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fYmFzZWxpbmU9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApfTtPLnByb3RvdHlwZS5iYXNlbGluZVZhbHVlPWZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5fYmFzZWxpbmVWYWx1ZSlyZXR1cm4gdGhpcy5fYmFzZWxpbmVWYWx1ZTtpZighdGhpcy5fcHJvamVjdG9yc1JlYWR5KCkpcmV0dXJuIDA7CnZhciBQPXRoaXMubGVuZ3RoKCkuc2NhbGU7cmV0dXJuIFA/UCBpbnN0YW5jZW9mIHouVGltZT9uZXcgRGF0ZSgwKTowOjB9O08ucHJvdG90eXBlLmFkZERhdGFzZXQ9ZnVuY3Rpb24oUCl7SS5wcm90b3R5cGUuYWRkRGF0YXNldC5jYWxsKHRoaXMsUCk7cmV0dXJuIHRoaXN9O08ucHJvdG90eXBlLl9hZGREYXRhc2V0PWZ1bmN0aW9uKFApe0kucHJvdG90eXBlLl9hZGREYXRhc2V0LmNhbGwodGhpcyxQKTtyZXR1cm4gdGhpc307Ty5wcm90b3R5cGUucmVtb3ZlRGF0YXNldD1mdW5jdGlvbihQKXtJLnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0LmNhbGwodGhpcyxQKX07Ty5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oUCl7SS5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQuY2FsbCh0aGlzLFApO3JldHVybiB0aGlzfTtPLnByb3RvdHlwZS5kYXRhc2V0cz1mdW5jdGlvbihQKXtpZihudWxsPT1QKXJldHVybiBJLnByb3RvdHlwZS5kYXRhc2V0cy5jYWxsKHRoaXMpO0kucHJvdG90eXBlLmRhdGFzZXRzLmNhbGwodGhpcywKUCk7cmV0dXJuIHRoaXN9O08ucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQ9ZnVuY3Rpb24oUCl7aWYobnVsbD09UClyZXR1cm4gdGhpcy5fbGFiZWxzRW5hYmxlZDt0aGlzLl9sYWJlbHNFbmFibGVkPVA7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O08ucHJvdG90eXBlLmxhYmVsRm9ybWF0dGVyPWZ1bmN0aW9uKFApe2lmKG51bGw9PVApcmV0dXJuIHRoaXMuX2xhYmVsRm9ybWF0dGVyO3RoaXMuX2xhYmVsRm9ybWF0dGVyPVA7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O08ucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQ9ZnVuY3Rpb24oUCl7dmFyIEg9SS5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldC5jYWxsKHRoaXMsUCksSz10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgiZyIpLmNsYXNzZWQoTy5fTEFCRUxfQVJFQV9DTEFTUywhMCksCk09bmV3IG4uU3ZnQ29udGV4dChLLm5vZGUoKSksTD1uZXcgbi5DYWNoZU1lYXN1cmVyKE0pO009bmV3IG4uV3JpdGVyKEwsTSk7dGhpcy5fbGFiZWxDb25maWcuc2V0KFAse2xhYmVsQXJlYTpLLG1lYXN1cmVyOkwsd3JpdGVyOk19KTtyZXR1cm4gSH07Ty5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcz1mdW5jdGlvbihQKXtJLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzLmNhbGwodGhpcyxQKTt2YXIgSD10aGlzLl9sYWJlbENvbmZpZy5nZXQoUCk7bnVsbCE9SCYmKEgubGFiZWxBcmVhLnJlbW92ZSgpLHRoaXMuX2xhYmVsQ29uZmlnLmRlbGV0ZShQKSl9O08ucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24oUCl7dmFyIEg9dGhpcztyZXR1cm4gdGhpcy5fY29tcHV0ZUJhclBpeGVsVGhpY2tuZXNzLmRvTG9ja2VkKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gSyhkYSxsYSxaLEZhKXtyZXR1cm4gSC5fcGl4ZWxQb2ludEJhcihiYShkYSxsYSxaKSxtYSxGYSl9dmFyIE09CkguX2lzVmVydGljYWw/UC54OlAueSxMPUguX2lzVmVydGljYWw/UC55OlAueCxSPUguYm91bmRzKCksVT17bWluOjAsbWF4OlIuYm90dG9tUmlnaHQueC1SLnRvcExlZnQueH0sWT17bWluOjAsbWF4OlIuYm90dG9tUmlnaHQueS1SLnRvcExlZnQueX0sYmE9RC5QbG90Ll9zY2FsZWRBY2Nlc3NvcihILmxlbmd0aCgpKSxtYT1ILmxlbmd0aCgpLnNjYWxlLnNjYWxlKEguYmFzZWxpbmVWYWx1ZSgpKSxhYT1JbmZpbml0eSxjYT1JbmZpbml0eSxmYTtILl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzKCkuZm9yRWFjaChmdW5jdGlvbihkYSl7dmFyIGxhPUguX2VudGl0eUJvdW5kcyhkYSk7aWYoQy5ET00uaW50ZXJzZWN0c0JCb3goVSxZLGxhKSl7dmFyIFo9MCxGYT0wO2lmKCFDLkRPTS5pbnRlcnNlY3RzQkJveChQLngsUC55LGxhLC41KSl7RmE9SyhkYS5kYXR1bSxkYS5pbmRleCxkYS5kYXRhc2V0LGxhKTtaPU1hdGguYWJzKE0tKEguX2lzVmVydGljYWw/RmEueDpGYS55KSk7dmFyIHhhPQpILl9pc1ZlcnRpY2FsP2xhLnk6bGEueDtsYT14YSsoSC5faXNWZXJ0aWNhbD9sYS5oZWlnaHQ6bGEud2lkdGgpO0ZhPUw+PXhhLS41JiZMPD1sYSsuNT8wOk1hdGguYWJzKEwtKEguX2lzVmVydGljYWw/RmEueTpGYS54KSl9aWYoWjxhYXx8Wj09PWFhJiZGYTxjYSlmYT1kYSxhYT1aLGNhPUZhfX0pO2lmKHZvaWQgMCE9PWZhKXJldHVybiBILl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoZmEpfSl9O08ucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oUCl7cmV0dXJuIHRoaXMuX2VudGl0aWVzSW50ZXJzZWN0aW5nKFAueCxQLnkpfTtPLnByb3RvdHlwZS5fZW50aXRpZXNJbnRlcnNlY3Rpbmc9ZnVuY3Rpb24oUCxIKXt2YXIgSz10aGlzLE09W107dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllcygpLmZvckVhY2goZnVuY3Rpb24oTCl7Qy5ET00uaW50ZXJzZWN0c0JCb3goUCxILEsuX2VudGl0eUJvdW5kcyhMKSkmJk0ucHVzaChLLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoTCkpfSk7CnJldHVybiBNfTtPLnByb3RvdHlwZS5fdXBkYXRlTGVuZ3RoU2NhbGU9ZnVuY3Rpb24oKXtpZih0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKSl7dmFyIFA9dGhpcy5sZW5ndGgoKS5zY2FsZTtQIGluc3RhbmNlb2YgeC5RdWFudGl0YXRpdmVTY2FsZSYmKFAuYWRkUGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcih0aGlzLl9iYXNlbGluZVZhbHVlUHJvdmlkZXIpLFAuYWRkSW5jbHVkZWRWYWx1ZXNQcm92aWRlcih0aGlzLl9iYXNlbGluZVZhbHVlUHJvdmlkZXIpKX19O08ucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIFA9dGhpczt0aGlzLl9iYXJQaXhlbFRoaWNrbmVzcygpO3JldHVybiB0aGlzLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3MuZG9Mb2NrZWQoZnVuY3Rpb24oKXtyZXR1cm4gSS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbChQKX0pfTtPLnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PWZ1bmN0aW9uKFApe3ZhciBIPXRoaXMsSz10aGlzLmxlbmd0aCgpLnNjYWxlLnNjYWxlKHRoaXMuYmFzZWxpbmVWYWx1ZSgpKTsKSz17eDE6dGhpcy5faXNWZXJ0aWNhbD8wOksseTE6dGhpcy5faXNWZXJ0aWNhbD9LOjAseDI6dGhpcy5faXNWZXJ0aWNhbD90aGlzLndpZHRoKCk6Syx5Mjp0aGlzLl9pc1ZlcnRpY2FsP0s6dGhpcy5oZWlnaHQoKX07dGhpcy5fZ2V0QW5pbWF0b3IoImJhc2VsaW5lIikuYW5pbWF0ZSh0aGlzLl9iYXNlbGluZSxLKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihNKXtyZXR1cm4gSC5fbGFiZWxDb25maWcuZ2V0KE0pLmxhYmVsQXJlYS5zZWxlY3RBbGwoImciKS5yZW1vdmUoKX0pO3RoaXMuX2xhYmVsc0VuYWJsZWQmJkMuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gSC5fZHJhd0xhYmVscygpfSxQKX07Ty5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5PWZ1bmN0aW9uKFApe3ZhciBIPXRoaXMsSz1JLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLFApO2lmKCJ4Ij09PVAmJnRoaXMuX2lzVmVydGljYWwpUD10aGlzLngoKTsKZWxzZXtpZigieSIhPT1QfHx0aGlzLl9pc1ZlcnRpY2FsKXJldHVybiBLO1A9dGhpcy55KCl9aWYoIShQJiZQLnNjYWxlJiZQLnNjYWxlIGluc3RhbmNlb2YgeC5RdWFudGl0YXRpdmVTY2FsZSkpcmV0dXJuIEs7dmFyIE09UC5zY2FsZSxMPXRoaXMuX2JhclBpeGVsVGhpY2tuZXNzKCk7cmV0dXJuIEs9Sy5tYXAoZnVuY3Rpb24oUil7cmV0dXJuIGsuZXh0ZW50KFtNLmludmVydChILl9nZXRQb3NpdGlvbkF0dHIoTS5zY2FsZShSWzBdKSxMKSksTS5pbnZlcnQoSC5fZ2V0UG9zaXRpb25BdHRyKE0uc2NhbGUoUlswXSksTCkrTCksTS5pbnZlcnQoSC5fZ2V0UG9zaXRpb25BdHRyKE0uc2NhbGUoUlsxXSksTCkpLE0uaW52ZXJ0KEguX2dldFBvc2l0aW9uQXR0cihNLnNjYWxlKFJbMV0pLEwpK0wpXSl9KX07Ty5wcm90b3R5cGUuX2dldFBvc2l0aW9uQXR0cj1mdW5jdGlvbihQLEgpe3RoaXMuX2lzVmVydGljYWx8fChQLT1ILEgqPS0xKTtzd2l0Y2godGhpcy5fYmFyQWxpZ25tZW50KXtjYXNlICJzdGFydCI6cmV0dXJuIFA7CmNhc2UgImVuZCI6cmV0dXJuIFAtSDtkZWZhdWx0OnJldHVybiBQLUgvMn19O08ucHJvdG90eXBlLl9kcmF3TGFiZWxzPWZ1bmN0aW9uKCl7dmFyIFA9dGhpcyxIPXRoaXMuX2dldERhdGFUb0RyYXcoKSxLPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLE09dGhpcy5kYXRhc2V0cygpLnNvbWUoZnVuY3Rpb24oTCl7cmV0dXJuIEguZ2V0KEwpLnNvbWUoZnVuY3Rpb24oUixVKXtyZXR1cm4gbnVsbD09Uj8hMTpQLl9kcmF3TGFiZWwoUixVLEwsSyl9KX0pO3RoaXMuX2hpZGVCYXJzSWZBbnlBcmVUb29XaWRlJiZNJiZ0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihMKXtyZXR1cm4gUC5fbGFiZWxDb25maWcuZ2V0KEwpLmxhYmVsQXJlYS5zZWxlY3RBbGwoImciKS5yZW1vdmUoKX0pfTtPLnByb3RvdHlwZS5fZHJhd0xhYmVsPWZ1bmN0aW9uKFAsSCxLLE0pe3ZhciBMPXRoaXMuX2xhYmVsQ29uZmlnLmdldChLKSxSPUwubGFiZWxBcmVhLFU9TC5tZWFzdXJlcjtMPUwud3JpdGVyOwp2YXIgWT10aGlzLmxlbmd0aCgpLmFjY2Vzc29yLGJhPVkoUCxILEspO1k9dGhpcy5sZW5ndGgoKS5zY2FsZTt2YXIgbWE9bnVsbCE9WT9ZLnNjYWxlKGJhKTpiYSxhYT1udWxsIT1ZP1kuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpOnRoaXMuYmFzZWxpbmVWYWx1ZSgpLGNhPXt4Ok0ueChQLEgsSykseTpNLnkoUCxILEspfTtZPXt3aWR0aDpNLndpZHRoKFAsSCxLKSxoZWlnaHQ6TS5oZWlnaHQoUCxILEspfTtiYT10aGlzLl9sYWJlbEZvcm1hdHRlcihiYSxQLEgsSyk7VT1VLm1lYXN1cmUoYmEpO3ZhciBmYT10aGlzLl9zaG91bGRTaG93TGFiZWxPbkJhcihjYSxZLFUpO2NhPXRoaXMuX2NhbGN1bGF0ZUxhYmVsUHJvcGVydGllcyhjYSxZLFUsZmEsdGhpcy5faXNWZXJ0aWNhbD9tYTw9YWE6bWE8YWEpO21hPWNhLmNvbnRhaW5lckRpbWVuc2lvbnM7YWE9Y2EubGFiZWxDb250YWluZXJPcmlnaW47Y2E9Y2EuYWxpZ25tZW50O1A9TS5maWxsKFAsSCxLKTtSPXRoaXMuX2NyZWF0ZUxhYmVsQ29udGFpbmVyKFIsCmFhLGZhLFApO0wud3JpdGUoYmEsbWEud2lkdGgsbWEuaGVpZ2h0LHt4QWxpZ246Y2EueCx5QWxpZ246Y2EueX0sUi5ub2RlKCkpO3JldHVybiB0aGlzLl9pc1ZlcnRpY2FsP1kud2lkdGg8VS53aWR0aDpZLmhlaWdodDxVLmhlaWdodH07Ty5wcm90b3R5cGUuX3Nob3VsZFNob3dMYWJlbE9uQmFyPWZ1bmN0aW9uKFAsSCxLKXtpZih0aGlzLl9sYWJlbHNQb3NpdGlvbj09PWQuTGFiZWxzUG9zaXRpb24ub3V0c2lkZSlyZXR1cm4hMTtQPXRoaXMuX2lzVmVydGljYWw/UC55OlAueDt2YXIgTT10aGlzLl9pc1ZlcnRpY2FsP0guaGVpZ2h0Okgud2lkdGg7SD10aGlzLl9pc1ZlcnRpY2FsP3RoaXMuaGVpZ2h0KCk6dGhpcy53aWR0aCgpO0s9dGhpcy5faXNWZXJ0aWNhbD9LLmhlaWdodDpLLndpZHRoO3ZhciBMPVArTTtMPkg/TT1ILVA6MD5QJiYoTT1MKTtyZXR1cm4gSytPLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUjw9TX07Ty5wcm90b3R5cGUuX2NhbGN1bGF0ZUxhYmVsUHJvcGVydGllcz0KZnVuY3Rpb24oUCxILEssTSxMKXtmdW5jdGlvbiBSKGxhKXtzd2l0Y2gobGEpe2Nhc2UgInRvcExlZnQiOmFhPVUuX2lzVmVydGljYWw/InRvcCI6ImxlZnQiO2ZhKz1PLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUjtkYSs9Ty5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVI7YnJlYWs7Y2FzZSAiY2VudGVyIjpkYSs9KGJhK21hKS8yO2JyZWFrO2Nhc2UgImJvdHRvbVJpZ2h0IjphYT1VLl9pc1ZlcnRpY2FsPyJib3R0b20iOiJyaWdodCIsZmEtPU8uX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSLGRhKz1jYS1PLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUi1tYX19dmFyIFU9dGhpcyxZPXRoaXMuX2lzVmVydGljYWw/UC55OlAueCxiYT10aGlzLl9pc1ZlcnRpY2FsP0guaGVpZ2h0Okgud2lkdGgsbWE9dGhpcy5faXNWZXJ0aWNhbD9LLmhlaWdodDpLLndpZHRoLGFhPSJjZW50ZXIiLGNhPWJhLGZhPVksZGE9WTtpZihNKXN3aXRjaCh0aGlzLl9sYWJlbHNQb3NpdGlvbil7Y2FzZSBkLkxhYmVsc1Bvc2l0aW9uLnN0YXJ0Okw/ClIoImJvdHRvbVJpZ2h0Iik6UigidG9wTGVmdCIpO2JyZWFrO2Nhc2UgZC5MYWJlbHNQb3NpdGlvbi5taWRkbGU6UigiY2VudGVyIik7YnJlYWs7Y2FzZSBkLkxhYmVsc1Bvc2l0aW9uLmVuZDpMP1IoInRvcExlZnQiKTpSKCJib3R0b21SaWdodCIpfWVsc2UgTD8oYWE9dGhpcy5faXNWZXJ0aWNhbD8idG9wIjoibGVmdCIsY2E9YmErTy5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIrbWEsZmEtPU8uX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSK21hLGRhLT1PLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUittYSk6KGFhPXRoaXMuX2lzVmVydGljYWw/ImJvdHRvbSI6InJpZ2h0IixjYT1iYStPLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUittYSxkYSs9YmErTy5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIpO3JldHVybntjb250YWluZXJEaW1lbnNpb25zOnt3aWR0aDp0aGlzLl9pc1ZlcnRpY2FsP0gud2lkdGg6Y2EsaGVpZ2h0OnRoaXMuX2lzVmVydGljYWw/Y2E6SC5oZWlnaHR9LGxhYmVsQ29udGFpbmVyT3JpZ2luOnt4OnRoaXMuX2lzVmVydGljYWw/ClAueDpmYSx5OnRoaXMuX2lzVmVydGljYWw/ZmE6UC55fSxsYWJlbE9yaWdpbjp7eDp0aGlzLl9pc1ZlcnRpY2FsP1AueCtILndpZHRoLzItSy53aWR0aC8yOmRhLHk6dGhpcy5faXNWZXJ0aWNhbD9kYTpQLnkrSC5oZWlnaHQvMi1LLmhlaWdodC8yfSxhbGlnbm1lbnQ6e3g6dGhpcy5faXNWZXJ0aWNhbD8iY2VudGVyIjphYSx5OnRoaXMuX2lzVmVydGljYWw/YWE6ImNlbnRlciJ9fX07Ty5wcm90b3R5cGUuX2NyZWF0ZUxhYmVsQ29udGFpbmVyPWZ1bmN0aW9uKFAsSCxLLE0pe1A9UC5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitILngrIiwgIitILnkrIikiKTtLPyhQLmNsYXNzZWQoIm9uLWJhci1sYWJlbCIsITApLEs9MS42KkMuQ29sb3IuY29udHJhc3QoIndoaXRlIixNKTxDLkNvbG9yLmNvbnRyYXN0KCJibGFjayIsTSksUC5jbGFzc2VkKEs/ImRhcmstbGFiZWwiOiJsaWdodC1sYWJlbCIsITApKTpQLmNsYXNzZWQoIm9mZi1iYXItbGFiZWwiLCEwKTsKcmV0dXJuIFB9O08ucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz1mdW5jdGlvbigpe3ZhciBQPVtdO2lmKHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSl7dmFyIEg9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksSz10aGlzLmxlbmd0aCgpLnNjYWxlLnNjYWxlKHRoaXMuYmFzZWxpbmVWYWx1ZSgpKSxNPXRoaXMuX2lzVmVydGljYWw/ImhlaWdodCI6IndpZHRoIjtIW3RoaXMuX2lzVmVydGljYWw/InkiOiJ4Il09ZnVuY3Rpb24oKXtyZXR1cm4gS307SFtNXT1mdW5jdGlvbigpe3JldHVybiAwfTtQLnB1c2goe2F0dHJUb1Byb2plY3RvcjpILGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKEYuQW5pbWF0b3IuUkVTRVQpfSl9UC5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoRi5BbmltYXRvci5NQUlOKX0pO3JldHVybiBQfTtPLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9CmZ1bmN0aW9uKCl7ZnVuY3Rpb24gUChjYSxmYSxkYSl7cmV0dXJuIE1hdGguYWJzKE0tWShjYSxmYSxkYSkpfXZhciBIPXRoaXMsSz1JLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IuY2FsbCh0aGlzKSxNPXRoaXMubGVuZ3RoKCkuc2NhbGUuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpLEw9dGhpcy5faXNWZXJ0aWNhbD8ieSI6IngiLFI9dGhpcy5faXNWZXJ0aWNhbD8ieCI6InkiLFU9RC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnBvc2l0aW9uKCkpLFk9RC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLmxlbmd0aCgpKSxiYT1LW08uX0JBUl9USElDS05FU1NfS0VZXSxtYT1LLmdhcCxhYT1udWxsPT1tYT9iYTpmdW5jdGlvbihjYSxmYSxkYSl7cmV0dXJuIGJhKGNhLGZhLGRhKS1tYShjYSxmYSxkYSl9O0sud2lkdGg9dGhpcy5faXNWZXJ0aWNhbD9hYTpQO0suaGVpZ2h0PXRoaXMuX2lzVmVydGljYWw/UDphYTtLW0xdPWZ1bmN0aW9uKGNhLGZhLGRhKXtjYT0KWShjYSxmYSxkYSk7cmV0dXJuIGNhPk0/TTpjYX07S1tSXT1mdW5jdGlvbihjYSxmYSxkYSl7cmV0dXJuIEguX2dldFBvc2l0aW9uQXR0cihVKGNhLGZhLGRhKSxiYShjYSxmYSxkYSkpfTtyZXR1cm4gS307Ty5wcm90b3R5cGUuX3VwZGF0ZVRoaWNrbmVzc0F0dHI9ZnVuY3Rpb24oKXt2YXIgUD10aGlzLEg9dGhpcy5wb3NpdGlvbigpLEs9dGhpcy5iYXJFbmQoKTtudWxsIT1IJiZudWxsIT1LPyh0aGlzLl9maXhlZEJhclBpeGVsVGhpY2tuZXNzPSExLHRoaXMuYXR0cihPLl9CQVJfVEhJQ0tORVNTX0tFWSxmdW5jdGlvbihNLEwsUil7dmFyIFU9SC5hY2Nlc3NvcihNLEwsUik7TT1LLmFjY2Vzc29yKE0sTCxSKTtVPUguc2NhbGU/SC5zY2FsZS5zY2FsZShVKTpVO009Sy5zY2FsZT9LLnNjYWxlLnNjYWxlKE0pOk07cmV0dXJuIE1hdGguYWJzKE0tVSl9KSk6KHRoaXMuX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M9ITAsdGhpcy5hdHRyKE8uX0JBUl9USElDS05FU1NfS0VZLGZ1bmN0aW9uKCl7cmV0dXJuIFAuX2JhclBpeGVsVGhpY2tuZXNzKCl9KSl9OwpPLnByb3RvdHlwZS5fYmFyUGl4ZWxUaGlja25lc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZml4ZWRCYXJQaXhlbFRoaWNrbmVzcz90aGlzLl9wcm9qZWN0b3JzUmVhZHkoKT90aGlzLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3ModGhpcy5wb3NpdGlvbigpLHRoaXMuZGF0YXNldHMoKSx0aGlzLl9pc1ZlcnRpY2FsP3RoaXMud2lkdGgoKTp0aGlzLmhlaWdodCgpKTowOjB9O08ucHJvdG90eXBlLmVudGl0aWVzPWZ1bmN0aW9uKFApe3ZvaWQgMD09PVAmJihQPXRoaXMuZGF0YXNldHMoKSk7cmV0dXJuIHRoaXMuX3Byb2plY3RvcnNSZWFkeSgpP0kucHJvdG90eXBlLmVudGl0aWVzLmNhbGwodGhpcyxQKTpbXX07Ty5wcm90b3R5cGUuX2VudGl0eUJvdW5kcz1mdW5jdGlvbihQKXtyZXR1cm4gdGhpcy5fcGl4ZWxCb3VuZHMoUC5kYXR1bSxQLmluZGV4LFAuZGF0YXNldCl9O08ucHJvdG90eXBlLl9waXhlbEJvdW5kcz1mdW5jdGlvbihQLEgsSyl7dmFyIE09dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7CnJldHVybnt4Ok0ueChQLEgsSykseTpNLnkoUCxILEspLHdpZHRoOk0ud2lkdGgoUCxILEspLGhlaWdodDpNLmhlaWdodChQLEgsSyl9fTtPLnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbihQLEgsSyl7dmFyIE09dGhpcy5fcGl4ZWxCb3VuZHMoUCxILEspO1A9KHRoaXMuX2lzVmVydGljYWw/RC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk6RC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSkpKFAsSCxLKTtIPSh0aGlzLl9pc1ZlcnRpY2FsP3RoaXMueSgpLnNjYWxlOnRoaXMueCgpLnNjYWxlKS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSk7cmV0dXJuIHRoaXMuX3BpeGVsUG9pbnRCYXIoUCxILE0pfTtPLnByb3RvdHlwZS5fcGl4ZWxQb2ludEJhcj1mdW5jdGlvbihQLEgsSyl7aWYodGhpcy5faXNWZXJ0aWNhbCl7dmFyIE09Sy54K0sud2lkdGgvMjtQPVA8PUg/Sy55OksueStLLmhlaWdodH1lbHNlIE09UD49SD9LLngrSy53aWR0aDpLLngsUD1LLnkrSy5oZWlnaHQvCjI7cmV0dXJue3g6TSx5OlB9fTtPLnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24oUCxIKXtJLnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXkuY2FsbCh0aGlzLFAsSCl9O08ucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIFA9dGhpcyxIPW5ldyBDLk1hcCxLPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLE09dGhpcy53aWR0aCgpLEw9dGhpcy5oZWlnaHQoKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihSKXt2YXIgVT1SLmRhdGEoKS5tYXAoZnVuY3Rpb24oWSxiYSl7cmV0dXJuIFAuX2lzRGF0dW1PblNjcmVlbihLLE0sTCxZLGJhLFIpP1k6bnVsbH0pO0guc2V0KFIsVSl9KTtyZXR1cm4gSH07Ty5wcm90b3R5cGUuX2lzRGF0dW1PblNjcmVlbj1mdW5jdGlvbihQLEgsSyxNLEwsUil7dmFyIFU9UC54KE0sTCxSKSxZPVAueShNLEwsUiksYmE9UC53aWR0aChNLEwsUik7UD1QLmhlaWdodChNLEwsUik7cmV0dXJuIEMuTWF0aC5pc1ZhbGlkTnVtYmVyKFUpJiYKQy5NYXRoLmlzVmFsaWROdW1iZXIoWSkmJkMuTWF0aC5pc1ZhbGlkTnVtYmVyKGJhKSYmQy5NYXRoLmlzVmFsaWROdW1iZXIoUCk/Qy5NYXRoLmJvdW5kc0ludGVyc2VjdHMoVSxZLGJhLFAsSCxLKTohMX07cmV0dXJuIE99KGYuWFlQbG90KTtCLl9CQVJfVEhJQ0tORVNTX1JBVElPPS45NTtCLl9TSU5HTEVfQkFSX0RJTUVOU0lPTl9SQVRJTz0uNDtCLl9CQVJfQVJFQV9DTEFTUz0iYmFyLWFyZWEiO0IuX0JBUl9FTkRfS0VZPSJiYXJFbmQiO0IuX0JBUl9USElDS05FU1NfS0VZPSJ3aWR0aCI7Qi5fTEFCRUxfQVJFQV9DTEFTUz0iYmFyLWxhYmVsLXRleHQtYXJlYSI7Qi5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVI9MTA7ZC5CYXI9Qn0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih2LHkpe2Z1bmN0aW9uIHooKXt0aGlzLmNvbnN0cnVjdG9yPXZ9Zm9yKHZhciB4IGluIHkpeS5oYXNPd25Qcm9wZXJ0eSh4KSYmKHZbeF09eVt4XSk7di5wcm90b3R5cGU9Cm51bGw9PT15P09iamVjdC5jcmVhdGUoeSk6KHoucHJvdG90eXBlPXkucHJvdG90eXBlLG5ldyB6KX0sbD1mKDEpLGs9Zig1KSxuPWYoOCkscD1mKDMpLHE9ZigwKTtjPWYoMTApO3ZhciByPWYoMjIpO2QuVGltZUludGVydmFsPWMubWFrZUVudW0oInNlY29uZCBtaW51dGUgaG91ciBkYXkgd2VlayBtb250aCB5ZWFyIi5zcGxpdCgiICIpKTtkLlRpbWVBeGlzT3JpZW50YXRpb249Yy5tYWtlRW51bShbInRvcCIsImJvdHRvbSJdKTtkLlRpZXJMYWJlbFBvc2l0aW9uPWMubWFrZUVudW0oWyJiZXR3ZWVuIiwiY2VudGVyIl0pO2Y9ZnVuY3Rpb24odil7ZnVuY3Rpb24geSh6LHgpe3o9di5jYWxsKHRoaXMseix4KXx8dGhpczt6Ll9tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb249bnVsbDt6Ll90aWVyTGFiZWxQb3NpdGlvbnM9W107ei5hZGRDbGFzcygidGltZS1heGlzIik7ei50aWNrTGFiZWxQYWRkaW5nKDUpO3ouYXhpc0NvbmZpZ3VyYXRpb25zKHkuX0RFRkFVTFRfVElNRV9BWElTX0NPTkZJR1VSQVRJT05TKTsKei5hbm5vdGF0aW9uRm9ybWF0dGVyKG4udGltZSgiJWEgJWIgJWQsICVZIikpO3JldHVybiB6fWcoeSx2KTt5LnByb3RvdHlwZS50aWVyTGFiZWxQb3NpdGlvbnM9ZnVuY3Rpb24oeil7aWYobnVsbD09eilyZXR1cm4gdGhpcy5fdGllckxhYmVsUG9zaXRpb25zO2lmKCF6LmV2ZXJ5KGZ1bmN0aW9uKHgpe3JldHVybiJiZXR3ZWVuIj09PXgudG9Mb3dlckNhc2UoKXx8ImNlbnRlciI9PT14LnRvTG93ZXJDYXNlKCl9KSl0aHJvdyBFcnJvcigiVW5zdXBwb3J0ZWQgcG9zaXRpb24gZm9yIHRpZXIgbGFiZWxzIik7dGhpcy5fdGllckxhYmVsUG9zaXRpb25zPXo7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUubWF4VGltZUludGVydmFsUHJlY2lzaW9uPWZ1bmN0aW9uKHope2lmKG51bGw9PXopcmV0dXJuIHRoaXMuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbjt0aGlzLl9tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb249ejt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt5LnByb3RvdHlwZS5jdXJyZW50QXhpc0NvbmZpZ3VyYXRpb249CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9uc1t0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4XX07eS5wcm90b3R5cGUuYXhpc0NvbmZpZ3VyYXRpb25zPWZ1bmN0aW9uKHope2lmKG51bGwhPXope3RoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9ucz16O3RoaXMuX251bVRpZXJzPXEuTWF0aC5tYXgodGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zLm1hcChmdW5jdGlvbihGKXtyZXR1cm4gRi5sZW5ndGh9KSwwKTt0aGlzLl9pc0FuY2hvcmVkJiZ0aGlzLl9zZXR1cERvbUVsZW1lbnRzKCk7ej10aGlzLnRpZXJMYWJlbFBvc2l0aW9ucygpO2Zvcih2YXIgeD1bXSxDPTA7Qzx0aGlzLl9udW1UaWVycztDKyspeC5wdXNoKHpbQ118fCJiZXR3ZWVuIik7dGhpcy50aWVyTGFiZWxQb3NpdGlvbnMoeCk7dGhpcy5yZWRyYXcoKX19O3kucHJvdG90eXBlLl9nZXRNb3N0UHJlY2lzZUNvbmZpZ3VyYXRpb25JbmRleD0KZnVuY3Rpb24oKXt2YXIgej10aGlzLHg9dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zLmxlbmd0aDt0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMuZm9yRWFjaChmdW5jdGlvbihDLEYpe0Y8eCYmQy5ldmVyeShmdW5jdGlvbihEKXtyZXR1cm4gei5fY2hlY2tUaW1lQXhpc1RpZXJDb25maWd1cmF0aW9uKEQpfSkmJih4PUYpfSk7eD09PXRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9ucy5sZW5ndGgmJihxLldpbmRvdy53YXJuKCJ6b29tZWQgb3V0IHRvbyBmYXI6IGNvdWxkIG5vdCBmaW5kIHN1aXRhYmxlIGludGVydmFsIHRvIGRpc3BsYXkgbGFiZWxzIiksLS14KTtyZXR1cm4geH07eS5wcm90b3R5cGUub3JpZW50YXRpb249ZnVuY3Rpb24oeil7aWYoeiYmKCJyaWdodCI9PT16LnRvTG93ZXJDYXNlKCl8fCJsZWZ0Ij09PXoudG9Mb3dlckNhc2UoKSkpdGhyb3cgRXJyb3IoeisiIGlzIG5vdCBhIHN1cHBvcnRlZCBvcmllbnRhdGlvbiBmb3IgVGltZUF4aXMgLSBvbmx5IGhvcml6b250YWwgb3JpZW50YXRpb25zIGFyZSBzdXBwb3J0ZWQiKTsKcmV0dXJuIHYucHJvdG90eXBlLm9yaWVudGF0aW9uLmNhbGwodGhpcyx6KX07eS5wcm90b3R5cGUuX2NvbXB1dGVIZWlnaHQ9ZnVuY3Rpb24oKXt2YXIgej10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0O3RoaXMuX3RpZXJIZWlnaHRzPVtdO2Zvcih2YXIgeD0wO3g8dGhpcy5fbnVtVGllcnM7eCsrKXRoaXMuX3RpZXJIZWlnaHRzLnB1c2goeit0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSsoImJldHdlZW4iPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW3hdPzA6dGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkpKTtyZXR1cm4gbC5zdW0odGhpcy5fdGllckhlaWdodHMpfTt5LnByb3RvdHlwZS5fZ2V0SW50ZXJ2YWxMZW5ndGg9ZnVuY3Rpb24oeil7dmFyIHg9dGhpcy5fc2NhbGUuZG9tYWluKClbMF07ej1wLlRpbWUudGltZUludGVydmFsVG9EM1RpbWUoei5pbnRlcnZhbCkub2Zmc2V0KHgsei5zdGVwKTtyZXR1cm4gej50aGlzLl9zY2FsZS5kb21haW4oKVsxXT90aGlzLndpZHRoKCk6Ck1hdGguYWJzKHRoaXMuX3NjYWxlLnNjYWxlKHopLXRoaXMuX3NjYWxlLnNjYWxlKHgpKX07eS5wcm90b3R5cGUuX21heFdpZHRoRm9ySW50ZXJ2YWw9ZnVuY3Rpb24oeil7cmV0dXJuIHRoaXMuX21lYXN1cmVyLm1lYXN1cmUoei5mb3JtYXR0ZXIoeS5fTE9OR19EQVRFKSkud2lkdGh9O3kucHJvdG90eXBlLl9jaGVja1RpbWVBeGlzVGllckNvbmZpZ3VyYXRpb249ZnVuY3Rpb24oeil7aWYobnVsbCE9dGhpcy5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uKXt2YXIgeD15Ll9TT1JURURfVElNRV9JTlRFUlZBTF9JTkRFWFt0aGlzLl9tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb25dLEM9eS5fU09SVEVEX1RJTUVfSU5URVJWQUxfSU5ERVhbei5pbnRlcnZhbF07aWYobnVsbCE9eCYmbnVsbCE9QyYmQzx4KXJldHVybiExfXg9dGhpcy5fbWF4V2lkdGhGb3JJbnRlcnZhbCh6KSsyKnRoaXMudGlja0xhYmVsUGFkZGluZygpO3JldHVybiBNYXRoLm1pbih0aGlzLl9nZXRJbnRlcnZhbExlbmd0aCh6KSwKdGhpcy53aWR0aCgpKT49eH07eS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24oeix4KXt2YXIgQz12LnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlci5jYWxsKHRoaXMseix4KTt6PXRoaXMuX3RpZXJIZWlnaHRzLnJlZHVjZShmdW5jdGlvbihGLEQpe3JldHVybiBGK0Q+Qy5oZWlnaHQ/RjpGK0R9KTt4PXRoaXMubWFyZ2luKCkrKHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCk/dGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCkqdGhpcy5fYW5ub3RhdGlvblRpZXJIZWlnaHQoKTowKTtDLmhlaWdodD1NYXRoLm1pbihDLmhlaWdodCx6K3gpO3JldHVybiBDfTt5LnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt2LnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9zZXR1cERvbUVsZW1lbnRzKCl9O3kucHJvdG90eXBlLl9zZXR1cERvbUVsZW1lbnRzPWZ1bmN0aW9uKCl7dGhpcy5jb250ZW50KCkuc2VsZWN0QWxsKCIuIit5LlRJTUVfQVhJU19USUVSX0NMQVNTKS5yZW1vdmUoKTsKdGhpcy5fdGllckxhYmVsQ29udGFpbmVycz1bXTt0aGlzLl90aWVyTWFya0NvbnRhaW5lcnM9W107dGhpcy5fdGllckJhc2VsaW5lcz1bXTt0aGlzLl90aWNrTGFiZWxDb250YWluZXIucmVtb3ZlKCk7dGhpcy5fYmFzZWxpbmUucmVtb3ZlKCk7Zm9yKHZhciB6PTA7ejx0aGlzLl9udW1UaWVyczsrK3ope3ZhciB4PXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoeS5USU1FX0FYSVNfVElFUl9DTEFTUywhMCk7dGhpcy5fdGllckxhYmVsQ29udGFpbmVycy5wdXNoKHguYXBwZW5kKCJnIikuY2xhc3NlZChyLkF4aXMuVElDS19MQUJFTF9DTEFTUysiLWNvbnRhaW5lciIsITApKTt0aGlzLl90aWVyTWFya0NvbnRhaW5lcnMucHVzaCh4LmFwcGVuZCgiZyIpLmNsYXNzZWQoci5BeGlzLlRJQ0tfTUFSS19DTEFTUysiLWNvbnRhaW5lciIsITApKTt0aGlzLl90aWVyQmFzZWxpbmVzLnB1c2goeC5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApKX16PW5ldyBrLlN2Z0NvbnRleHQodGhpcy5fdGllckxhYmVsQ29udGFpbmVyc1swXS5ub2RlKCkpOwp0aGlzLl9tZWFzdXJlcj1uZXcgay5DYWNoZU1lYXN1cmVyKHopfTt5LnByb3RvdHlwZS5fZ2V0VGlja0ludGVydmFsVmFsdWVzPWZ1bmN0aW9uKHope3JldHVybiB0aGlzLl9zY2FsZS50aWNrSW50ZXJ2YWwoei5pbnRlcnZhbCx6LnN0ZXApfTt5LnByb3RvdHlwZS5fZ2V0VGlja1ZhbHVlcz1mdW5jdGlvbigpe3ZhciB6PXRoaXM7cmV0dXJuIHRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9uc1t0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4XS5yZWR1Y2UoZnVuY3Rpb24oeCxDKXtyZXR1cm4geC5jb25jYXQoei5fZ2V0VGlja0ludGVydmFsVmFsdWVzKEMpKX0sW10pfTt5LnByb3RvdHlwZS5fY2xlYW5UaWVycz1mdW5jdGlvbigpe2Zvcih2YXIgej0wO3o8dGhpcy5fdGllckxhYmVsQ29udGFpbmVycy5sZW5ndGg7eisrKXRoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnNbel0uc2VsZWN0QWxsKCIuIityLkF4aXMuVElDS19MQUJFTF9DTEFTUykucmVtb3ZlKCksdGhpcy5fdGllck1hcmtDb250YWluZXJzW3pdLnNlbGVjdEFsbCgiLiIrCnIuQXhpcy5USUNLX01BUktfQ0xBU1MpLnJlbW92ZSgpLHRoaXMuX3RpZXJCYXNlbGluZXNbel0uc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX07eS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXNGb3JDb25maWd1cmF0aW9uPWZ1bmN0aW9uKHope3o9dGhpcy5fc2NhbGUudGlja0ludGVydmFsKHouaW50ZXJ2YWwsei5zdGVwKTt2YXIgeD10aGlzLl9zY2FsZS5kb21haW4oKSxDPXoubWFwKGZ1bmN0aW9uKEYpe3JldHVybiBGLnZhbHVlT2YoKX0pOy0xPT09Qy5pbmRleE9mKHhbMF0udmFsdWVPZigpKSYmei51bnNoaWZ0KHhbMF0pOy0xPT09Qy5pbmRleE9mKHhbMV0udmFsdWVPZigpKSYmei5wdXNoKHhbMV0pO3JldHVybiB6fTt5LnByb3RvdHlwZS5fcmVuZGVyVGllckxhYmVscz1mdW5jdGlvbih6LHgsQyl7dmFyIEY9dGhpcyxEPXRoaXMuX2dldFRpY2tWYWx1ZXNGb3JDb25maWd1cmF0aW9uKHgpLEI9W107ImJldHdlZW4iPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW0NdJiYKMT09PXguc3RlcD9ELm1hcChmdW5jdGlvbihLLE0pe00rMT49RC5sZW5ndGh8fEIucHVzaChuZXcgRGF0ZSgoRFtNKzFdLnZhbHVlT2YoKS1EW01dLnZhbHVlT2YoKSkvMitEW01dLnZhbHVlT2YoKSkpfSk6Qj1EO3o9ei5zZWxlY3RBbGwoIi4iK3IuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5kYXRhKEIsZnVuY3Rpb24oSyl7cmV0dXJuIFN0cmluZyhLLnZhbHVlT2YoKSl9KTt2YXIgST16LmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZChyLkF4aXMuVElDS19MQUJFTF9DTEFTUywhMCk7SS5hcHBlbmQoInRleHQiKTt2YXIgTz0iY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tDXXx8MT09PXguc3RlcD8wOnRoaXMudGlja0xhYmVsUGFkZGluZygpO3ZhciBQPSJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpP2wuc3VtKHRoaXMuX3RpZXJIZWlnaHRzLnNsaWNlKDAsQysxKSktdGhpcy50aWNrTGFiZWxQYWRkaW5nKCk6ImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbQ10/CnRoaXMuaGVpZ2h0KCktbC5zdW0odGhpcy5fdGllckhlaWdodHMuc2xpY2UoMCxDKSktdGhpcy50aWNrTGFiZWxQYWRkaW5nKCktdGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCk6dGhpcy5oZWlnaHQoKS1sLnN1bSh0aGlzLl90aWVySGVpZ2h0cy5zbGljZSgwLEMpKS10aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTtJPXoubWVyZ2UoSSk7dmFyIEg9SS5zZWxlY3RBbGwoInRleHQiKTswPEguc2l6ZSgpJiZILmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK08rIiwiK1ArIikiKTt6LmV4aXQoKS5yZW1vdmUoKTtJLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oSyl7cmV0dXJuInRyYW5zbGF0ZSgiK0YuX3NjYWxlLnNjYWxlKEspKyIsMCkifSk7Qz0iY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tDXXx8MT09PXguc3RlcD8ibWlkZGxlIjoic3RhcnQiO0kuc2VsZWN0QWxsKCJ0ZXh0IikudGV4dCh4LmZvcm1hdHRlcikuc3R5bGUoInRleHQtYW5jaG9yIixDKX07eS5wcm90b3R5cGUuX3JlbmRlclRpY2tNYXJrcz0KZnVuY3Rpb24oeix4KXt6PXRoaXMuX3RpZXJNYXJrQ29udGFpbmVyc1t4XS5zZWxlY3RBbGwoIi4iK3IuQXhpcy5USUNLX01BUktfQ0xBU1MpLmRhdGEoeik7dmFyIEM9ei5lbnRlcigpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoci5BeGlzLlRJQ0tfTUFSS19DTEFTUywhMCkubWVyZ2UoeiksRj10aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goKSxEPXRoaXMuX3RpZXJIZWlnaHRzLnNsaWNlKDAseCkucmVkdWNlKGZ1bmN0aW9uKEIsSSl7cmV0dXJuIEIrSX0sMCk7ImJvdHRvbSI9PT10aGlzLm9yaWVudGF0aW9uKCk/KEYueTE9RCxGLnkyPUQrKCJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW3hdP3RoaXMuaW5uZXJUaWNrTGVuZ3RoKCk6dGhpcy5fdGllckhlaWdodHNbeF0pKTooRi55MT10aGlzLmhlaWdodCgpLUQsRi55Mj10aGlzLmhlaWdodCgpLShEKygiY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1t4XT90aGlzLmlubmVyVGlja0xlbmd0aCgpOgp0aGlzLl90aWVySGVpZ2h0c1t4XSkpKTtDLmF0dHJzKEYpOyJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpPyhGLnkxPUQsRi55Mj1EKygiY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1t4XT90aGlzLmVuZFRpY2tMZW5ndGgoKTp0aGlzLl90aWVySGVpZ2h0c1t4XSkpOihGLnkxPXRoaXMuaGVpZ2h0KCktRCxGLnkyPXRoaXMuaGVpZ2h0KCktKEQrKCJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW3hdP3RoaXMuZW5kVGlja0xlbmd0aCgpOnRoaXMuX3RpZXJIZWlnaHRzW3hdKSkpO2wuc2VsZWN0KEMubm9kZXMoKVswXSkuYXR0cnMoRik7bC5zZWxlY3QoQy5ub2RlcygpW0Muc2l6ZSgpLTFdKS5hdHRycyhGKTtsLnNlbGVjdChDLm5vZGVzKClbMF0pLmNsYXNzZWQoci5BeGlzLkVORF9USUNLX01BUktfQ0xBU1MsITApO2wuc2VsZWN0KEMubm9kZXMoKVtDLnNpemUoKS0xXSkuY2xhc3NlZChyLkF4aXMuRU5EX1RJQ0tfTUFSS19DTEFTUywhMCk7ei5leGl0KCkucmVtb3ZlKCl9Owp5LnByb3RvdHlwZS5fcmVuZGVyTGFiZWxsZXNzVGlja01hcmtzPWZ1bmN0aW9uKHope3o9dGhpcy5fdGlja01hcmtDb250YWluZXIuc2VsZWN0QWxsKCIuIityLkF4aXMuVElDS19NQVJLX0NMQVNTKS5kYXRhKHopO3ZhciB4PXouZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKHIuQXhpcy5USUNLX01BUktfQ0xBU1MsITApLm1lcmdlKHopLEM9dGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCk7Qy55Mj0iYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT90aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTp0aGlzLmhlaWdodCgpLXRoaXMudGlja0xhYmVsUGFkZGluZygpO3guYXR0cnMoQyk7ei5leGl0KCkucmVtb3ZlKCl9O3kucHJvdG90eXBlLl9nZW5lcmF0ZUxhYmVsbGVzc1RpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIDE+dGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleD9bXTp0aGlzLl9nZXRUaWNrSW50ZXJ2YWxWYWx1ZXModGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zW3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXgtCjFdWzBdKX07eS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt2YXIgej10aGlzO3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXg9dGhpcy5fZ2V0TW9zdFByZWNpc2VDb25maWd1cmF0aW9uSW5kZXgoKTt2YXIgeD10aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnNbdGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleF07dGhpcy5fY2xlYW5UaWVycygpO3guZm9yRWFjaChmdW5jdGlvbihJLE8pe3JldHVybiB6Ll9yZW5kZXJUaWVyTGFiZWxzKHouX3RpZXJMYWJlbENvbnRhaW5lcnNbT10sSSxPKX0pO2Zvcih2YXIgQz14Lm1hcChmdW5jdGlvbihJKXtyZXR1cm4gei5fZ2V0VGlja1ZhbHVlc0ZvckNvbmZpZ3VyYXRpb24oSSl9KSxGPTAsRD0wO0Q8TWF0aC5tYXgoeC5sZW5ndGgsMSk7KytEKXt2YXIgQj10aGlzLl9nZW5lcmF0ZUJhc2VsaW5lQXR0ckhhc2goKTtCLnkxKz0iYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT9GOi1GO0IueTI9Qi55MTsKdGhpcy5fdGllckJhc2VsaW5lc1tEXS5hdHRycyhCKS5zdHlsZSgidmlzaWJpbGl0eSIsImluaGVyaXQiKTtGKz10aGlzLl90aWVySGVpZ2h0c1tEXX1GPVtdO0Q9dGhpcy5fc2NhbGUuZG9tYWluKCk7RD10aGlzLl9zY2FsZS5zY2FsZShEWzFdKS10aGlzLl9zY2FsZS5zY2FsZShEWzBdKTsxLjUqdGhpcy5fZ2V0SW50ZXJ2YWxMZW5ndGgoeFswXSk+PUQmJihGPXRoaXMuX2dlbmVyYXRlTGFiZWxsZXNzVGlja3MoKSk7dGhpcy5fcmVuZGVyTGFiZWxsZXNzVGlja01hcmtzKEYpO3RoaXMuX2hpZGVPdmVyZmxvd2luZ1RpZXJzKCk7Zm9yKEQ9MDtEPHgubGVuZ3RoOysrRCl0aGlzLl9yZW5kZXJUaWNrTWFya3MoQ1tEXSxEKSx0aGlzLl9oaWRlT3ZlcmxhcHBpbmdBbmRDdXRPZmZMYWJlbHMoRCk7dGhpcy5hbm5vdGF0aW9uc0VuYWJsZWQoKT90aGlzLl9kcmF3QW5ub3RhdGlvbnMoKTp0aGlzLl9yZW1vdmVBbm5vdGF0aW9ucygpO3JldHVybiB0aGlzfTt5LnByb3RvdHlwZS5faGlkZU92ZXJmbG93aW5nVGllcnM9CmZ1bmN0aW9uKCl7dmFyIHo9dGhpcyx4PXRoaXMuaGVpZ2h0KCksQz0wO3RoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiLiIreS5USU1FX0FYSVNfVElFUl9DTEFTUykuYXR0cigidmlzaWJpbGl0eSIsZnVuY3Rpb24oRixEKXtDKz16Ll90aWVySGVpZ2h0c1tEXTtyZXR1cm4gQzw9eD8iaW5oZXJpdCI6ImhpZGRlbiJ9KX07eS5wcm90b3R5cGUuX2hpZGVPdmVybGFwcGluZ0FuZEN1dE9mZkxhYmVscz1mdW5jdGlvbih6KXtmdW5jdGlvbiB4KEkpe3JldHVybiBNYXRoLmZsb29yKEYubGVmdCk8PU1hdGguY2VpbChJLmxlZnQpJiZNYXRoLmZsb29yKEYudG9wKTw9TWF0aC5jZWlsKEkudG9wKSYmTWF0aC5mbG9vcihJLnJpZ2h0KTw9TWF0aC5jZWlsKEYubGVmdCtDLndpZHRoKCkpJiZNYXRoLmZsb29yKEkuYm90dG9tKTw9TWF0aC5jZWlsKEYudG9wK0MuaGVpZ2h0KCkpfXZhciBDPXRoaXMsRj10aGlzLmVsZW1lbnQoKS5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksRD10aGlzLl90aWVyTWFya0NvbnRhaW5lcnNbel0uc2VsZWN0QWxsKCIuIisKci5BeGlzLlRJQ0tfTUFSS19DTEFTUykuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIEk9bC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiKTtyZXR1cm4idmlzaWJsZSI9PT1JfHwiaW5oZXJpdCI9PT1JfSkubm9kZXMoKS5tYXAoZnVuY3Rpb24oSSl7cmV0dXJuIEkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9KSxCO3RoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnNbel0uc2VsZWN0QWxsKCIuIityLkF4aXMuVElDS19MQUJFTF9DTEFTUykuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIEk9bC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiKTtyZXR1cm4idmlzaWJsZSI9PT1JfHwiaW5oZXJpdCI9PT1JfSkuZWFjaChmdW5jdGlvbihJLE8pe0k9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgUD1sLnNlbGVjdCh0aGlzKSxIPURbT10sSz1EW08rMV07Tz1udWxsIT1CJiZxLkRPTS5jbGllbnRSZWN0c092ZXJsYXAoSSxCKTtIPW51bGwhPUgmJnEuRE9NLmNsaWVudFJlY3RzT3ZlcmxhcChJLApIKTtLPW51bGwhPUsmJnEuRE9NLmNsaWVudFJlY3RzT3ZlcmxhcChJLEspOyF4KEkpfHxPfHxIfHxLP1Auc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKTooQj1JLFAuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0IikpfSl9O3kucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe3YucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpO3RoaXMuX21lYXN1cmVyLnJlc2V0KCl9O3JldHVybiB5fShyLkF4aXMpO2YuVElNRV9BWElTX1RJRVJfQ0xBU1M9InRpbWUtYXhpcy10aWVyIjtmLl9TT1JURURfVElNRV9JTlRFUlZBTF9JTkRFWD0odD17fSx0W2QuVGltZUludGVydmFsLnNlY29uZF09MCx0W2QuVGltZUludGVydmFsLm1pbnV0ZV09MSx0W2QuVGltZUludGVydmFsLmhvdXJdPTIsdFtkLlRpbWVJbnRlcnZhbC5kYXldPTMsdFtkLlRpbWVJbnRlcnZhbC53ZWVrXT00LHRbZC5UaW1lSW50ZXJ2YWwubW9udGhdPTUsdFtkLlRpbWVJbnRlcnZhbC55ZWFyXT0KNix0KTtmLl9ERUZBVUxUX1RJTUVfQVhJU19DT05GSUdVUkFUSU9OUz1bW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDo1LGZvcm1hdHRlcjpuLnRpbWUoIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDoxMCxmb3JtYXR0ZXI6bi50aW1lKCIlSTolTTolUyAlcCIpfSx7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bi50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuc2Vjb25kLHN0ZXA6MTUsCmZvcm1hdHRlcjpuLnRpbWUoIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDozMCxmb3JtYXR0ZXI6bi50aW1lKCIlSTolTTolUyAlcCIpfSx7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bi50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6MSxmb3JtYXR0ZXI6bi50aW1lKCIlSTolTSAlcCIpfSx7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bi50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6NSxmb3JtYXR0ZXI6bi50aW1lKCIlSTolTSAlcCIpfSx7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bi50aW1lKCIlQiAlZSwgJVkiKX1dLApbe2ludGVydmFsOmQuVGltZUludGVydmFsLm1pbnV0ZSxzdGVwOjEwLGZvcm1hdHRlcjpuLnRpbWUoIiVJOiVNICVwIil9LHtpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5taW51dGUsc3RlcDoxNSxmb3JtYXR0ZXI6bi50aW1lKCIlSTolTSAlcCIpfSx7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bi50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6MzAsZm9ybWF0dGVyOm4udGltZSgiJUk6JU0gJXAiKX0se2ludGVydmFsOmQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm4udGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLmhvdXIsc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiVJICVwIil9LHtpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5kYXksCnN0ZXA6MSxmb3JtYXR0ZXI6bi50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuaG91cixzdGVwOjMsZm9ybWF0dGVyOm4udGltZSgiJUkgJXAiKX0se2ludGVydmFsOmQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm4udGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLmhvdXIsc3RlcDo2LGZvcm1hdHRlcjpuLnRpbWUoIiVJICVwIil9LHtpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5ob3VyLHN0ZXA6MTIsZm9ybWF0dGVyOm4udGltZSgiJUkgJXAiKX0se2ludGVydmFsOmQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm4udGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm4udGltZSgiJWEgJWUiKX0sCntpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjEsZm9ybWF0dGVyOm4udGltZSgiJUIgJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bi50aW1lKCIlZSIpfSx7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiVCICVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6MSxmb3JtYXR0ZXI6bi50aW1lKCIlQiIpfSx7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOm4udGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiViIil9LHtpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6bi50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjMsZm9ybWF0dGVyOm4udGltZSgiJWIiKX0sCntpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6bi50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjYsZm9ybWF0dGVyOm4udGltZSgiJWIiKX0se2ludGVydmFsOmQuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpuLnRpbWUoIiV5Iil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLnllYXIsc3RlcDo1LGZvcm1hdHRlcjpuLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLnllYXIsc3RlcDoyNSxmb3JtYXR0ZXI6bi50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6NTAsZm9ybWF0dGVyOm4udGltZSgiJVkiKX1dLApbe2ludGVydmFsOmQuVGltZUludGVydmFsLnllYXIsc3RlcDoxMDAsZm9ybWF0dGVyOm4udGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6ZC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjIwMCxmb3JtYXR0ZXI6bi50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpkLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6NTAwLGZvcm1hdHRlcjpuLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmQuVGltZUludGVydmFsLnllYXIsc3RlcDoxRTMsZm9ybWF0dGVyOm4udGltZSgiJVkiKX1dXTtmLl9MT05HX0RBVEU9bmV3IERhdGUoOTk5OSw4LDI5LDEyLDU5LDk5OTkpO2QuVGltZT1mO3ZhciB0fSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGssbil7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9a31mb3IodmFyIHEgaW4gbiluLmhhc093blByb3BlcnR5KHEpJiYoa1txXT1uW3FdKTtrLnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihwLnByb3RvdHlwZT0Kbi5wcm90b3R5cGUsbmV3IHApfSxsPWYoMTIpO2M9ZnVuY3Rpb24oayl7ZnVuY3Rpb24gbigpe3ZhciBwPWsuY2FsbCh0aGlzKXx8dGhpcztwLl9kZXRhY2hDYWxsYmFjaz1mdW5jdGlvbihxKXtyZXR1cm4gcC5yZW1vdmUocSl9O3JldHVybiBwfWcobixrKTtuLnByb3RvdHlwZS5hbmNob3I9ZnVuY3Rpb24ocCl7dmFyIHE9dGhpcztwPWwuY29lcmNlRXh0ZXJuYWxEMyhwKTtrLnByb3RvdHlwZS5hbmNob3IuY2FsbCh0aGlzLHApO3RoaXMuX2ZvckVhY2goZnVuY3Rpb24ocil7cmV0dXJuIHIuYW5jaG9yKHEuZWxlbWVudCgpKX0pO3JldHVybiB0aGlzfTtuLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKHApe3JldHVybiBwLnJlbmRlcigpfSk7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLmhhcz1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJoYXMoKSBpcyBub3QgaW1wbGVtZW50ZWQgb24gQ29tcG9uZW50Q29udGFpbmVyIik7fTtuLnByb3RvdHlwZS5fYWRvcHRBbmRBbmNob3I9CmZ1bmN0aW9uKHApe3AucGFyZW50KHRoaXMpO3Aub25EZXRhY2godGhpcy5fZGV0YWNoQ2FsbGJhY2spO3RoaXMuX2lzQW5jaG9yZWQmJnAuYW5jaG9yKHRoaXMuZWxlbWVudCgpKX07bi5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHApe3RoaXMuaGFzKHApJiYocC5vZmZEZXRhY2godGhpcy5fZGV0YWNoQ2FsbGJhY2spLHRoaXMuX3JlbW92ZShwKSxwLmRldGFjaCgpLHRoaXMucmVkcmF3KCkpO3JldHVybiB0aGlzfTtuLnByb3RvdHlwZS5fcmVtb3ZlPWZ1bmN0aW9uKCl7fTtuLnByb3RvdHlwZS5fZm9yRWFjaD1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJfZm9yRWFjaCgpIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiBDb21wb25lbnRDb250YWluZXIiKTt9O24ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtrLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy5fZm9yRWFjaChmdW5jdGlvbihwKXtyZXR1cm4gcC5kZXN0cm95KCl9KX07bi5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPQpmdW5jdGlvbigpe3RoaXMuX2ZvckVhY2goZnVuY3Rpb24ocCl7cmV0dXJuIHAuaW52YWxpZGF0ZUNhY2hlKCl9KX07cmV0dXJuIG59KGYoNCkuQ29tcG9uZW50KTtkLkNvbXBvbmVudENvbnRhaW5lcj1jfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyh5KXtxLmFkZCh5KTtwLmFkZCh5KTtsKCl9ZnVuY3Rpb24gbCgpe3J8fChyPSEwLHYucmVuZGVyKCkpfXZhciBrPWYoMCk7Yz1mKDEwKTt2YXIgbj1mKDM5KSxwPW5ldyBrLlNldCxxPW5ldyBrLlNldCxyPSExLHQ9ITE7ZC5Qb2xpY3k9Yy5tYWtlRW51bShbImltbWVkaWF0ZSIsImFuaW1hdGlvbkZyYW1lIiwidGltZW91dCJdKTt2YXIgdj1uZXcgbi5BbmltYXRpb25GcmFtZTtkLnJlbmRlclBvbGljeT1mdW5jdGlvbigpe3ZhciB5PVBsb3R0YWJsZS5SZW5kZXJDb250cm9sbGVyLlBvbGljeS5pbW1lZGlhdGU7aWYobnVsbCE9eSlzd2l0Y2goeSl7Y2FzZSBkLlBvbGljeS5pbW1lZGlhdGU6dj1uZXcgbi5JbW1lZGlhdGU7YnJlYWs7CmNhc2UgZC5Qb2xpY3kuYW5pbWF0aW9uRnJhbWU6dj1uZXcgbi5BbmltYXRpb25GcmFtZTticmVhaztjYXNlIGQuUG9saWN5LnRpbWVvdXQ6dj1uZXcgbi5UaW1lb3V0O2JyZWFrO2RlZmF1bHQ6ay5XaW5kb3cud2FybigiVW5yZWNvZ25pemVkIHJlbmRlclBvbGljeTogIit5KX19O2QucmVnaXN0ZXJUb1JlbmRlcj1mdW5jdGlvbih5KXt0JiZrLldpbmRvdy53YXJuKCJSZWdpc3RlcmVkIHRvIHJlbmRlciB3aGlsZSBvdGhlciBjb21wb25lbnRzIGFyZSBmbHVzaGluZzogcmVxdWVzdCBtYXkgYmUgaWdub3JlZCIpO3AuYWRkKHkpO2woKX07ZC5yZWdpc3RlclRvQ29tcHV0ZUxheW91dEFuZFJlbmRlcj1nO2QucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oeSl7Zyh5KX07ZC5mbHVzaD1mdW5jdGlvbigpe2lmKHIpe3EuZm9yRWFjaChmdW5jdGlvbih6KXtyZXR1cm4gei5jb21wdXRlTGF5b3V0KCl9KTtwLmZvckVhY2goZnVuY3Rpb24oeil7cmV0dXJuIHoucmVuZGVyKCl9KTsKdD0hMDt2YXIgeT1uZXcgay5TZXQ7cC5mb3JFYWNoKGZ1bmN0aW9uKHope3RyeXt6LnJlbmRlckltbWVkaWF0ZWx5KCl9Y2F0Y2goeCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyB4O30sMCkseS5hZGQoeil9fSk7cT1uZXcgay5TZXQ7cD15O3Q9cj0hMX19fSxmdW5jdGlvbihjLGQsZil7dmFyIGc9ZigxKTtkLmNpcmNsZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihrKXtyZXR1cm4gZy5zeW1ib2woKS50eXBlKGcuc3ltYm9sQ2lyY2xlKS5zaXplKE1hdGguUEkqTWF0aC5wb3coay8yLDIpKX19O2Quc3F1YXJlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGspe3JldHVybiBnLnN5bWJvbCgpLnR5cGUoZy5zeW1ib2xTcXVhcmUpLnNpemUoTWF0aC5wb3coaywyKSl9fTtkLmNyb3NzPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGspe3JldHVybiBnLnN5bWJvbCgpLnR5cGUoZy5zeW1ib2xDcm9zcykuc2l6ZSg1LzkqTWF0aC5wb3coaywyKSl9fTtkLmRpYW1vbmQ9CmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGspe3JldHVybiBnLnN5bWJvbCgpLnR5cGUoZy5zeW1ib2xEaWFtb25kKS5zaXplKE1hdGgudGFuKE1hdGguUEkvNikqTWF0aC5wb3coaywyKS8yKX19O2QudHJpYW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oayl7cmV0dXJuIGcuc3ltYm9sKCkudHlwZShnLnN5bWJvbFRyaWFuZ2xlKS5zaXplKE1hdGguc3FydCgzKSpNYXRoLnBvdyhrLzIsMikpfX07ZC5zdGFyPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGspe3JldHVybiBnLnN5bWJvbCgpLnR5cGUoZy5zeW1ib2xTdGFyKS5zaXplKC44OTA4MTMwOTE1MjkyODUyKk1hdGgucG93KGsvMiwyKSl9fTt2YXIgbD0zKigxL01hdGguc3FydCgxMikvMisxKTtkLnd5ZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihrKXtyZXR1cm4gZy5zeW1ib2woKS50eXBlKGcuc3ltYm9sV3llKS5zaXplKGwqTWF0aC5wb3coay8yLjQsMikpfX19LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz0KdGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHEscil7ZnVuY3Rpb24gdCgpe3RoaXMuY29uc3RydWN0b3I9cX1mb3IodmFyIHYgaW4gcilyLmhhc093blByb3BlcnR5KHYpJiYocVt2XT1yW3ZdKTtxLnByb3RvdHlwZT1udWxsPT09cj9PYmplY3QuY3JlYXRlKHIpOih0LnByb3RvdHlwZT1yLnByb3RvdHlwZSxuZXcgdCl9LGw9ZigyNSksaz1mKDApLG49ZigxMikscD1mKDM3KTtjPWZ1bmN0aW9uKHEpe2Z1bmN0aW9uIHIoKXt2YXIgdD1xLmNhbGwodGhpcyl8fHRoaXM7dC5fZGV0ZWN0aW9uUmFkaXVzPTM7dC5fcmVzaXphYmxlPSExO3QuX21vdmFibGU9ITE7dC5faGFzQ29ybmVycz0hMDt0LmFkZENsYXNzKCJkcmFnLWJveC1sYXllciIpO3QuX2RyYWdJbnRlcmFjdGlvbj1uZXcgbC5EcmFnO3QuX3NldFVwQ2FsbGJhY2tzKCk7dC5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKHQpO3QuX2RyYWdTdGFydENhbGxiYWNrcz1uZXcgay5DYWxsYmFja1NldDt0Ll9kcmFnQ2FsbGJhY2tzPQpuZXcgay5DYWxsYmFja1NldDt0Ll9kcmFnRW5kQ2FsbGJhY2tzPW5ldyBrLkNhbGxiYWNrU2V0O3JldHVybiB0fWcocixxKTtyLnByb3RvdHlwZS5fc2V0VXBDYWxsYmFja3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KEksTyl7MD09PUImJkkueD09PU8ueCYmSS55PT09Ty55JiZ6LmJveFZpc2libGUoITEpO3ouX2RyYWdFbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh6LmJvdW5kcygpKX1mdW5jdGlvbiB2KEksTyl7c3dpdGNoKEIpe2Nhc2UgMDpGLng9Ty54O0YueT1PLnk7YnJlYWs7Y2FzZSAxOnguYm90dG9tP0YueT1PLnk6eC50b3AmJihDLnk9Ty55KTt4LnJpZ2h0P0YueD1PLng6eC5sZWZ0JiYoQy54PU8ueCk7YnJlYWs7Y2FzZSAyOkk9Ty54LUQueDt2YXIgUD1PLnktRC55O0MueCs9STtDLnkrPVA7Ri54Kz1JO0YueSs9UDtEPU99ei5fc2V0Qm91bmRzKHt0b3BMZWZ0OkMsYm90dG9tUmlnaHQ6Rn0pO3ouX3hCb3VuZHNNb2RlPT09cC5Qcm9wZXJ0eU1vZGUuVkFMVUUmJm51bGwhPQp6LnhTY2FsZSgpJiZ6Ll9zZXRYRXh0ZW50KFt6LnhTY2FsZSgpLmludmVydChDLngpLHoueFNjYWxlKCkuaW52ZXJ0KEYueCldKTt6Ll95Qm91bmRzTW9kZT09PXAuUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT16LnlTY2FsZSgpJiZ6Ll9zZXRZRXh0ZW50KFt6LnlTY2FsZSgpLmludmVydChDLnkpLHoueVNjYWxlKCkuaW52ZXJ0KEYueSldKTt6LnJlbmRlcigpO3ouX2RyYWdDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh6LmJvdW5kcygpKX1mdW5jdGlvbiB5KEkpe3g9ei5fZ2V0UmVzaXppbmdFZGdlcyhJKTt2YXIgTz16LmJvdW5kcygpO089Ty50b3BMZWZ0Lng8PUkueCYmSS54PD1PLmJvdHRvbVJpZ2h0LngmJk8udG9wTGVmdC55PD1JLnkmJkkueTw9Ty5ib3R0b21SaWdodC55O3ouYm94VmlzaWJsZSgpJiYoeC50b3B8fHguYm90dG9tfHx4LmxlZnR8fHgucmlnaHQpP0I9MTp6LmJveFZpc2libGUoKSYmei5tb3ZhYmxlKCkmJk8/Qj0yOihCPTAsei5fc2V0Qm91bmRzKHt0b3BMZWZ0OkksCmJvdHRvbVJpZ2h0Okl9KSx6Ll94Qm91bmRzTW9kZT09PXAuUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT16LnhTY2FsZSgpJiZ6Ll9zZXRYRXh0ZW50KFt6LnhTY2FsZSgpLmludmVydChJLngpLHoueFNjYWxlKCkuaW52ZXJ0KEkueCldKSx6Ll95Qm91bmRzTW9kZT09PXAuUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT16LnlTY2FsZSgpJiZ6Ll9zZXRZRXh0ZW50KFt6LnlTY2FsZSgpLmludmVydChJLnkpLHoueVNjYWxlKCkuaW52ZXJ0KEkueSldKSx6LnJlbmRlcigpKTt6LmJveFZpc2libGUoITApO089ei5ib3VuZHMoKTtDPXt4Ok8udG9wTGVmdC54LHk6Ty50b3BMZWZ0Lnl9O0Y9e3g6Ty5ib3R0b21SaWdodC54LHk6Ty5ib3R0b21SaWdodC55fTtEPUk7ei5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoTyl9dmFyIHo9dGhpcyx4LEMsRixELEI9MDt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQoeSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZyh2KTsKdGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZCh0KTt0aGlzLl9kaXNjb25uZWN0SW50ZXJhY3Rpb249ZnVuY3Rpb24oKXt6Ll9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZ1N0YXJ0KHkpO3ouX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnKHYpO3ouX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnRW5kKHQpO3ouX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKX19O3IucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtyZXR1cm4gdi5fYm94LmFwcGVuZCgibGluZSIpLnN0eWxlcyh7b3BhY2l0eTowLHN0cm9rZToicGluayIsInBvaW50ZXItZXZlbnRzIjoidmlzaWJsZVN0cm9rZSJ9KX12YXIgdj10aGlzO3EucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX2RldGVjdGlvbkVkZ2VUPXQoKS5jbGFzc2VkKCJkcmFnLWVkZ2UtdGIiLCEwKTt0aGlzLl9kZXRlY3Rpb25FZGdlQj10KCkuY2xhc3NlZCgiZHJhZy1lZGdlLXRiIiwhMCk7dGhpcy5fZGV0ZWN0aW9uRWRnZUw9CnQoKS5jbGFzc2VkKCJkcmFnLWVkZ2UtbHIiLCEwKTt0aGlzLl9kZXRlY3Rpb25FZGdlUj10KCkuY2xhc3NlZCgiZHJhZy1lZGdlLWxyIiwhMCk7aWYodGhpcy5faGFzQ29ybmVycyl7dmFyIHk9ZnVuY3Rpb24oKXtyZXR1cm4gdi5fYm94LmFwcGVuZCgiY2lyY2xlIikuc3R5bGVzKHtvcGFjaXR5OjAsZmlsbDoicGluayIsInBvaW50ZXItZXZlbnRzIjoidmlzaWJsZUZpbGwifSl9O3RoaXMuX2RldGVjdGlvbkNvcm5lclRMPXkoKS5jbGFzc2VkKCJkcmFnLWNvcm5lci10bCIsITApO3RoaXMuX2RldGVjdGlvbkNvcm5lclRSPXkoKS5jbGFzc2VkKCJkcmFnLWNvcm5lci10ciIsITApO3RoaXMuX2RldGVjdGlvbkNvcm5lckJMPXkoKS5jbGFzc2VkKCJkcmFnLWNvcm5lci1ibCIsITApO3RoaXMuX2RldGVjdGlvbkNvcm5lckJSPXkoKS5jbGFzc2VkKCJkcmFnLWNvcm5lci1iciIsITApfX07ci5wcm90b3R5cGUuX2dldFJlc2l6aW5nRWRnZXM9ZnVuY3Rpb24odCl7dmFyIHY9e3RvcDohMSwKYm90dG9tOiExLGxlZnQ6ITEscmlnaHQ6ITF9O2lmKCF0aGlzLnJlc2l6YWJsZSgpKXJldHVybiB2O3ZhciB5PXRoaXMuYm91bmRzKCksej15LnRvcExlZnQueSx4PXkuYm90dG9tUmlnaHQueSxDPXkudG9wTGVmdC54O3k9eS5ib3R0b21SaWdodC54O3ZhciBGPXRoaXMuX2RldGVjdGlvblJhZGl1cztDLUY8PXQueCYmdC54PD15K0YmJih2LnRvcD16LUY8PXQueSYmdC55PD16K0Ysdi5ib3R0b209eC1GPD10LnkmJnQueTw9eCtGKTt6LUY8PXQueSYmdC55PD14K0YmJih2LmxlZnQ9Qy1GPD10LngmJnQueDw9QytGLHYucmlnaHQ9eS1GPD10LngmJnQueDw9eStGKTtyZXR1cm4gdn07ci5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtxLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO2lmKHRoaXMuYm94VmlzaWJsZSgpKXt2YXIgdD10aGlzLmJvdW5kcygpLHY9dC50b3BMZWZ0LnkseT10LmJvdHRvbVJpZ2h0Lnksej10LnRvcExlZnQueDt0PQp0LmJvdHRvbVJpZ2h0Lng7dGhpcy5fZGV0ZWN0aW9uRWRnZVQuYXR0cnMoe3gxOnoseTE6dix4Mjp0LHkyOnYsInN0cm9rZS13aWR0aCI6Mip0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KTt0aGlzLl9kZXRlY3Rpb25FZGdlQi5hdHRycyh7eDE6eix5MTp5LHgyOnQseTI6eSwic3Ryb2tlLXdpZHRoIjoyKnRoaXMuX2RldGVjdGlvblJhZGl1c30pO3RoaXMuX2RldGVjdGlvbkVkZ2VMLmF0dHJzKHt4MTp6LHkxOnYseDI6eix5Mjp5LCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSk7dGhpcy5fZGV0ZWN0aW9uRWRnZVIuYXR0cnMoe3gxOnQseTE6dix4Mjp0LHkyOnksInN0cm9rZS13aWR0aCI6Mip0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KTt0aGlzLl9oYXNDb3JuZXJzJiYodGhpcy5fZGV0ZWN0aW9uQ29ybmVyVEwuYXR0cnMoe2N4OnosY3k6dixyOnRoaXMuX2RldGVjdGlvblJhZGl1c30pLHRoaXMuX2RldGVjdGlvbkNvcm5lclRSLmF0dHJzKHtjeDp0LGN5OnYscjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSwKdGhpcy5fZGV0ZWN0aW9uQ29ybmVyQkwuYXR0cnMoe2N4OnosY3k6eSxyOnRoaXMuX2RldGVjdGlvblJhZGl1c30pLHRoaXMuX2RldGVjdGlvbkNvcm5lckJSLmF0dHJzKHtjeDp0LGN5Onkscjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSl9cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLmRldGVjdGlvblJhZGl1cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZXRlY3Rpb25SYWRpdXN9O3IucHJvdG90eXBlLnJlc2l6YWJsZT1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9yZXNpemFibGU7dGhpcy5fcmVzaXphYmxlPXQ7dGhpcy5fc2V0UmVzaXphYmxlQ2xhc3Nlcyh0KTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUuX3NldFJlc2l6YWJsZUNsYXNzZXM9ZnVuY3Rpb24odCl7dCYmdGhpcy5lbmFibGVkKCk/KHRoaXMuYWRkQ2xhc3MoIngtcmVzaXphYmxlIiksdGhpcy5hZGRDbGFzcygieS1yZXNpemFibGUiKSk6KHRoaXMucmVtb3ZlQ2xhc3MoIngtcmVzaXphYmxlIiksCnRoaXMucmVtb3ZlQ2xhc3MoInktcmVzaXphYmxlIikpfTtyLnByb3RvdHlwZS5tb3ZhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vdmFibGV9O3IucHJvdG90eXBlLl9zZXRNb3ZhYmxlQ2xhc3M9ZnVuY3Rpb24oKXt0aGlzLm1vdmFibGUoKSYmdGhpcy5lbmFibGVkKCk/dGhpcy5hZGRDbGFzcygibW92YWJsZSIpOnRoaXMucmVtb3ZlQ2xhc3MoIm1vdmFibGUiKX07ci5wcm90b3R5cGUub25EcmFnU3RhcnQ9ZnVuY3Rpb24odCl7dGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmFkZCh0KX07ci5wcm90b3R5cGUub2ZmRHJhZ1N0YXJ0PWZ1bmN0aW9uKHQpe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUodCl9O3IucHJvdG90eXBlLm9uRHJhZz1mdW5jdGlvbih0KXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmFkZCh0KTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUub2ZmRHJhZz1mdW5jdGlvbih0KXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZSh0KX07ci5wcm90b3R5cGUub25EcmFnRW5kPQpmdW5jdGlvbih0KXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmFkZCh0KX07ci5wcm90b3R5cGUub2ZmRHJhZ0VuZD1mdW5jdGlvbih0KXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZSh0KX07ci5wcm90b3R5cGUuZHJhZ0ludGVyYWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdJbnRlcmFjdGlvbn07ci5wcm90b3R5cGUuZW5hYmxlZD1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZW5hYmxlZCgpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5lbmFibGVkKHQpO3RoaXMuX3NldFJlc2l6YWJsZUNsYXNzZXModGhpcy5yZXNpemFibGUoKSk7dGhpcy5fc2V0TW92YWJsZUNsYXNzKCk7cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3EucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbih2KXtyZXR1cm4gdC5fZHJhZ0NhbGxiYWNrcy5kZWxldGUodil9KTsKdGhpcy5fZHJhZ0NhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHYpe3JldHVybiB0Ll9kcmFnQ2FsbGJhY2tzLmRlbGV0ZSh2KX0pO3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbih2KXtyZXR1cm4gdC5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUodil9KTt0aGlzLl9kaXNjb25uZWN0SW50ZXJhY3Rpb24oKX07ci5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7dGhpcy5fcmVzZXRTdGF0ZSgpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKTtxLnByb3RvdHlwZS5kZXRhY2guY2FsbCh0aGlzKTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUuYW5jaG9yPWZ1bmN0aW9uKHQpe3Q9bi5jb2VyY2VFeHRlcm5hbEQzKHQpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyh0aGlzKTtxLnByb3RvdHlwZS5hbmNob3IuY2FsbCh0aGlzLHQpO3JldHVybiB0aGlzfTtyLnByb3RvdHlwZS5fcmVzZXRTdGF0ZT1mdW5jdGlvbigpe3RoaXMuYm91bmRzKHt0b3BMZWZ0Ont4OjAsCnk6MH0sYm90dG9tUmlnaHQ6e3g6MCx5OjB9fSl9O3JldHVybiByfShmKDQzKS5TZWxlY3Rpb25Cb3hMYXllcik7ZC5EcmFnQm94TGF5ZXI9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHApe2Z1bmN0aW9uIHEoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciByIGluIHApcC5oYXNPd25Qcm9wZXJ0eShyKSYmKG5bcl09cFtyXSk7bi5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToocS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IHEpfSxsPWYoMTgpO2M9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcCgpe3JldHVybiBuLmNhbGwodGhpcywicGF0aCIsImxpbmUiKXx8dGhpc31nKHAsbik7cC5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24ocSl7cS5zdHlsZSgiZmlsbCIsIm5vbmUiKX07cC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleD1mdW5jdGlvbigpe3JldHVybiBuLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4LmNhbGwodGhpcywKMCl9O3JldHVybiBwfShmKDkpLlNWR0RyYXdlcik7ZC5MaW5lU1ZHRHJhd2VyPWM7dmFyIGs9WyJvcGFjaXR5Iiwic3Ryb2tlLW9wYWNpdHkiLCJzdHJva2Utd2lkdGgiLCJzdHJva2UiXTtkLm1ha2VMaW5lQ2FudmFzRHJhd1N0ZXA9ZnVuY3Rpb24obil7cmV0dXJuIGZ1bmN0aW9uKHAscSxyKXtyPWwucmVzb2x2ZUF0dHJpYnV0ZXMocixrLHFbMF0sMCk7bC5yZW5kZXJMaW5lKHAsbigpLHFbMF0scil9fX0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHApe2Z1bmN0aW9uIHEoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciByIGluIHApcC5oYXNPd25Qcm9wZXJ0eShyKSYmKG5bcl09cFtyXSk7bi5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToocS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IHEpfSxsPWYoMTgpO2M9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcChxKXt2b2lkIDA9PT1xJiYocT0iIik7dmFyIHI9Cm4uY2FsbCh0aGlzLCJyZWN0IiwiIil8fHRoaXM7ci5fcm9vdENsYXNzTmFtZT1xO3IuX3Jvb3QuY2xhc3NlZChyLl9yb290Q2xhc3NOYW1lLCEwKTtyZXR1cm4gcn1nKHAsbik7cmV0dXJuIHB9KGYoOSkuU1ZHRHJhd2VyKTtkLlJlY3RhbmdsZVNWR0RyYXdlcj1jO3ZhciBrPVsieCIsInkiLCJ3aWR0aCIsImhlaWdodCJdO2QuUmVjdGFuZ2xlQ2FudmFzRHJhd1N0ZXA9ZnVuY3Rpb24obixwLHEpe24uc2F2ZSgpO3AuZm9yRWFjaChmdW5jdGlvbihyLHQpe251bGwhPXImJihyPWwucmVzb2x2ZUF0dHJpYnV0ZXNTdWJzZXRXaXRoU3R5bGVzKHEsayxyLHQpLG4uYmVnaW5QYXRoKCksbi5yZWN0KHIueCxyLnksci53aWR0aCxyLmhlaWdodCksbC5yZW5kZXJQYXRoV2l0aFN0eWxlKG4scikpfSk7bi5yZXN0b3JlKCl9O2M9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcChxKXtyZXR1cm4gbi5jYWxsKHRoaXMscSxkLlJlY3RhbmdsZUNhbnZhc0RyYXdTdGVwKXx8dGhpc31nKHAsbik7cmV0dXJuIHB9KGwuQ2FudmFzRHJhd2VyKTsKZC5SZWN0YW5nbGVDYW52YXNEcmF3ZXI9Y30sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcobil7ay5TSE9XX1dBUk5JTkdTJiZjb25zb2xlLndhcm4obil9ZnVuY3Rpb24gbChuLHApe2Zvcih2YXIgcT1bXSxyPTI7cjxhcmd1bWVudHMubGVuZ3RoO3IrKylxW3ItMl09YXJndW1lbnRzW3JdO3JldHVybiAwPT09cD8obihxKSwtMSk6d2luZG93LnNldFRpbWVvdXQobixwLHEpfXZhciBrPWYoMjMpO2Qud2Fybj1nO2Quc2V0VGltZW91dD1sO2QuZGVib3VuY2U9ZnVuY3Rpb24obixwLHEpe2Z1bmN0aW9uIHIoKXtwLmFwcGx5KHEsdil9dmFyIHQ9bnVsbCx2PVtdO3JldHVybiBmdW5jdGlvbigpe3Y9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtjbGVhclRpbWVvdXQodCk7dD1sKHIsbil9fTtkLmRlcHJlY2F0ZWQ9ZnVuY3Rpb24obixwLHEpe3ZvaWQgMD09PXEmJihxPSIiKTtnKCJNZXRob2QgIituKyIgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiB2ZXJzaW9uICIrCnArIi4gUGxlYXNlIHJlZmVyIHRvIHRoZSByZWxlYXNlIG5vdGVzLiAiK3EpfX0sZnVuY3Rpb24oYyxkKXtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZihnKXt0aGlzLnJ1bGVyPW51bGwhPWcuY3JlYXRlUnVsZXI/Zy5jcmVhdGVSdWxlcigpOmd9Zi5wcm90b3R5cGUubWVhc3VyZT1mdW5jdGlvbihnKXt2b2lkIDA9PT1nJiYoZz1mLkhFSUdIVF9URVhUKTtyZXR1cm4gdGhpcy5ydWxlcihnKX07cmV0dXJuIGZ9KCk7Yy5IRUlHSFRfVEVYVD0iYmRwcWwiO2QuQWJzdHJhY3RNZWFzdXJlcj1jfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhsKXtmb3IodmFyIGsgaW4gbClkLmhhc093blByb3BlcnR5KGspfHwoZFtrXT1sW2tdKX1nKGYoMzIpKTtnKGYoNzQpKTtnKGYoNzUpKTtnKGYoNDEpKTtnKGYoNDIpKTtnKGYoNzYpKTtnKGYoNzcpKTtnKGYoNzgpKTtnKGYoNzkpKTtnKGYoNDMpKTtnKGYoODApKTtnKGYoODEpKTtnKGYoODIpKX0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoMCk7Yz0KZnVuY3Rpb24oKXtmdW5jdGlvbiBsKGssbil7dm9pZCAwPT09ayYmKGs9W10pO3ZvaWQgMD09PW4mJihuPXt9KTt0aGlzLl91cGRhdGVJZD0wO3RoaXMuX2RhdGE9azt0aGlzLl9tZXRhZGF0YT1uO3RoaXMuX2NhbGxiYWNrcz1uZXcgZy5DYWxsYmFja1NldH1sLnByb3RvdHlwZS5vblVwZGF0ZT1mdW5jdGlvbihrKXt0aGlzLl9jYWxsYmFja3MuYWRkKGspO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5vZmZVcGRhdGU9ZnVuY3Rpb24oayl7dGhpcy5fY2FsbGJhY2tzLmRlbGV0ZShrKTtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUuZGF0YT1mdW5jdGlvbihrKXtpZihudWxsPT1rKXJldHVybiB0aGlzLl9kYXRhO3RoaXMuX2RhdGE9azt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5tZXRhZGF0YT1mdW5jdGlvbihrKXtpZihudWxsPT1rKXJldHVybiB0aGlzLl9tZXRhZGF0YTt0aGlzLl9tZXRhZGF0YT1rO3RoaXMuX2Rpc3BhdGNoVXBkYXRlKCk7CnJldHVybiB0aGlzfTtsLnByb3RvdHlwZS51cGRhdGVJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl91cGRhdGVJZH07bC5wcm90b3R5cGUuX2Rpc3BhdGNoVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSWQrKzt0aGlzLl9jYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKX07cmV0dXJuIGx9KCk7ZC5EYXRhc2V0PWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz1mKDApLGw9ZigzMCk7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGsoKXt9ay5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7bC5mbHVzaCgpfTtyZXR1cm4ga30oKTtkLkltbWVkaWF0ZT1jO2M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBrKCl7fWsucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe2cuRE9NLnJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsKGwuZmx1c2gpfTtyZXR1cm4ga30oKTtkLkFuaW1hdGlvbkZyYW1lPWM7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGsoKXt0aGlzLl90aW1lb3V0TXNlYz1nLkRPTS5TQ1JFRU5fUkVGUkVTSF9SQVRFX01JTExJU0VDT05EU30Kay5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7c2V0VGltZW91dChsLmZsdXNoLHRoaXMuX3RpbWVvdXRNc2VjKX07cmV0dXJuIGt9KCk7ZC5UaW1lb3V0PWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixwKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgciBpbiBwKXAuaGFzT3duUHJvcGVydHkocikmJihuW3JdPXBbcl0pO24ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX0sbD1mKDEzKSxrPWYoMCk7Yz1mdW5jdGlvbihuKXtmdW5jdGlvbiBwKCl7dmFyIHE9bnVsbCE9PW4mJm4uYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3EuX2tleVByZXNzQ2FsbGJhY2tzPXt9O3EuX2tleVJlbGVhc2VDYWxsYmFja3M9e307cS5fbW91c2VNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4hMX07cS5fZG93bmVkS2V5cz1uZXcgay5TZXQ7CnEuX2tleURvd25DYWxsYmFjaz1mdW5jdGlvbihyLHQpe3JldHVybiBxLl9oYW5kbGVLZXlEb3duRXZlbnQocix0KX07cS5fa2V5VXBDYWxsYmFjaz1mdW5jdGlvbihyKXtyZXR1cm4gcS5faGFuZGxlS2V5VXBFdmVudChyKX07cmV0dXJuIHF9ZyhwLG4pO3AucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24ocSl7bi5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMscSk7dGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyPWwuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl9wb3NpdGlvbkRpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX2tleURpc3BhdGNoZXI9bC5LZXkuZ2V0RGlzcGF0Y2hlcigpO3RoaXMuX2tleURpc3BhdGNoZXIub25LZXlEb3duKHRoaXMuX2tleURvd25DYWxsYmFjayk7dGhpcy5fa2V5RGlzcGF0Y2hlci5vbktleVVwKHRoaXMuX2tleVVwQ2FsbGJhY2spfTtwLnByb3RvdHlwZS5fdW5hbmNob3I9CmZ1bmN0aW9uKCl7bi5wcm90b3R5cGUuX3VuYW5jaG9yLmNhbGwodGhpcyk7dGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyLm9mZk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7dGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyPW51bGw7dGhpcy5fa2V5RGlzcGF0Y2hlci5vZmZLZXlEb3duKHRoaXMuX2tleURvd25DYWxsYmFjayk7dGhpcy5fa2V5RGlzcGF0Y2hlci5vZmZLZXlVcCh0aGlzLl9rZXlVcENhbGxiYWNrKTt0aGlzLl9rZXlEaXNwYXRjaGVyPW51bGx9O3AucHJvdG90eXBlLl9oYW5kbGVLZXlEb3duRXZlbnQ9ZnVuY3Rpb24ocSxyKXt2YXIgdD10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHRoaXMuX3Bvc2l0aW9uRGlzcGF0Y2hlci5sYXN0TW91c2VQb3NpdGlvbigpKTt0aGlzLl9pc0luc2lkZUNvbXBvbmVudCh0KSYmIXIucmVwZWF0JiYodGhpcy5fa2V5UHJlc3NDYWxsYmFja3NbcV0mJnRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW3FdLmNhbGxDYWxsYmFja3MocSksCnRoaXMuX2Rvd25lZEtleXMuYWRkKHEpKX07cC5wcm90b3R5cGUuX2hhbmRsZUtleVVwRXZlbnQ9ZnVuY3Rpb24ocSl7dGhpcy5fZG93bmVkS2V5cy5oYXMocSkmJnRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3NbcV0mJnRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3NbcV0uY2FsbENhbGxiYWNrcyhxKTt0aGlzLl9kb3duZWRLZXlzLmRlbGV0ZShxKX07cC5wcm90b3R5cGUub25LZXlQcmVzcz1mdW5jdGlvbihxLHIpe3RoaXMuX2tleVByZXNzQ2FsbGJhY2tzW3FdfHwodGhpcy5fa2V5UHJlc3NDYWxsYmFja3NbcV09bmV3IGsuQ2FsbGJhY2tTZXQpO3RoaXMuX2tleVByZXNzQ2FsbGJhY2tzW3FdLmFkZChyKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUub2ZmS2V5UHJlc3M9ZnVuY3Rpb24ocSxyKXt0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1txXS5kZWxldGUocik7MD09PXRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW3FdLnNpemUmJmRlbGV0ZSB0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1txXTsKcmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLm9uS2V5UmVsZWFzZT1mdW5jdGlvbihxLHIpe3RoaXMuX2tleVJlbGVhc2VDYWxsYmFja3NbcV18fCh0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW3FdPW5ldyBrLkNhbGxiYWNrU2V0KTt0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW3FdLmFkZChyKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUub2ZmS2V5UmVsZWFzZT1mdW5jdGlvbihxLHIpe3RoaXMuX2tleVJlbGVhc2VDYWxsYmFja3NbcV0uZGVsZXRlKHIpOzA9PT10aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW3FdLnNpemUmJmRlbGV0ZSB0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW3FdO3JldHVybiB0aGlzfTtyZXR1cm4gcH0oZigxNSkuSW50ZXJhY3Rpb24pO2QuS2V5PWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oayxuKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWZvcih2YXIgcSBpbiBuKW4uaGFzT3duUHJvcGVydHkocSkmJgooa1txXT1uW3FdKTtrLnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihwLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgcCl9LGw9ZigwKTtjPWZ1bmN0aW9uKGspe2Z1bmN0aW9uIG4ocCl7dm9pZCAwPT09cCYmKHA9W10pO3ZhciBxPWsuY2FsbCh0aGlzKXx8dGhpcztxLl9jb21wb25lbnRzPVtdO3EuYWRkQ2xhc3MoImNvbXBvbmVudC1ncm91cCIpO3AuZm9yRWFjaChmdW5jdGlvbihyKXtyZXR1cm4gcS5hcHBlbmQocil9KTtyZXR1cm4gcX1nKG4sayk7bi5wcm90b3R5cGUuX2ZvckVhY2g9ZnVuY3Rpb24ocCl7dGhpcy5jb21wb25lbnRzKCkuZm9yRWFjaChwKX07bi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHApe3JldHVybiAwPD10aGlzLl9jb21wb25lbnRzLmluZGV4T2YocCl9O24ucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHAscSl7dmFyIHI9dGhpcy5fY29tcG9uZW50cy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQucmVxdWVzdGVkU3BhY2UocCwKcSl9KTtyZXR1cm57bWluV2lkdGg6bC5NYXRoLm1heChyLGZ1bmN0aW9uKHQpe3JldHVybiB0Lm1pbldpZHRofSwwKSxtaW5IZWlnaHQ6bC5NYXRoLm1heChyLGZ1bmN0aW9uKHQpe3JldHVybiB0Lm1pbkhlaWdodH0sMCl9fTtuLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKHAscSxyKXt2YXIgdD10aGlzO2sucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLHAscSxyKTt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKHYpe3YuY29tcHV0ZUxheW91dCh7eDowLHk6MH0sdC53aWR0aCgpLHQuaGVpZ2h0KCkpfSk7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHAscSl7cmV0dXJue3dpZHRoOnAsaGVpZ2h0OnF9fTtuLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudHMuZXZlcnkoZnVuY3Rpb24ocCl7cmV0dXJuIHAuZml4ZWRXaWR0aCgpfSl9O24ucHJvdG90eXBlLmZpeGVkSGVpZ2h0PQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnRzLmV2ZXJ5KGZ1bmN0aW9uKHApe3JldHVybiBwLmZpeGVkSGVpZ2h0KCl9KX07bi5wcm90b3R5cGUuY29tcG9uZW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnRzLnNsaWNlKCl9O24ucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbihwKXtudWxsPT1wfHx0aGlzLmhhcyhwKXx8KHAuZGV0YWNoKCksdGhpcy5fY29tcG9uZW50cy5wdXNoKHApLHRoaXMuX2Fkb3B0QW5kQW5jaG9yKHApLHRoaXMucmVkcmF3KCkpO3JldHVybiB0aGlzfTtuLnByb3RvdHlwZS5fcmVtb3ZlPWZ1bmN0aW9uKHApe3A9dGhpcy5fY29tcG9uZW50cy5pbmRleE9mKHApOzA8PXAmJnRoaXMuX2NvbXBvbmVudHMuc3BsaWNlKHAsMSl9O3JldHVybiBufShmKDI5KS5Db21wb25lbnRDb250YWluZXIpO2QuR3JvdXA9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihrLG4pe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPQprfWZvcih2YXIgcSBpbiBuKW4uaGFzT3duUHJvcGVydHkocSkmJihrW3FdPW5bcV0pO2sucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHAucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyBwKX07ZigwKTtjPWYoNCk7dmFyIGw7KGZ1bmN0aW9uKGspe2tbay5WQUxVRT0wXT0iVkFMVUUiO2tbay5QSVhFTD0xXT0iUElYRUwifSkobHx8KGw9e30pKTtjPWZ1bmN0aW9uKGspe2Z1bmN0aW9uIG4ocCl7dmFyIHE9ay5jYWxsKHRoaXMpfHx0aGlzO3EuX21vZGU9bC5WQUxVRTtpZihwIT09bi5PUklFTlRBVElPTl9WRVJUSUNBTCYmcCE9PW4uT1JJRU5UQVRJT05fSE9SSVpPTlRBTCl0aHJvdyBFcnJvcihwKyIgaXMgbm90IGEgdmFsaWQgb3JpZW50YXRpb24gZm9yIEd1aWRlTGluZUxheWVyIik7cS5fb3JpZW50YXRpb249cDtxLl9vdmVyZmxvd0hpZGRlbj0hMDtxLmFkZENsYXNzKCJndWlkZS1saW5lLWxheWVyIik7cS5faXNWZXJ0aWNhbCgpP3EuYWRkQ2xhc3MoInZlcnRpY2FsIik6CnEuYWRkQ2xhc3MoImhvcml6b250YWwiKTtxLl9zY2FsZVVwZGF0ZUNhbGxiYWNrPWZ1bmN0aW9uKCl7cS5fc3luY1BpeGVsUG9zaXRpb25BbmRWYWx1ZSgpO3EucmVuZGVyKCl9O3JldHVybiBxfWcobixrKTtuLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtrLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9ndWlkZUxpbmU9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJsaW5lIikuY2xhc3NlZCgiZ3VpZGUtbGluZSIsITApfTtuLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbihwLHEpe3JldHVybnt3aWR0aDpwLGhlaWdodDpxfX07bi5wcm90b3R5cGUuX2lzVmVydGljYWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JpZW50YXRpb249PT1uLk9SSUVOVEFUSU9OX1ZFUlRJQ0FMfTtuLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuITB9O24ucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuITB9O24ucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9CmZ1bmN0aW9uKHAscSxyKXtrLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxwLHEscik7bnVsbCE9dGhpcy5zY2FsZSgpJiYodGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMuc2NhbGUoKS5yYW5nZShbMCx0aGlzLndpZHRoKCldKTp0aGlzLnNjYWxlKCkucmFuZ2UoW3RoaXMuaGVpZ2h0KCksMF0pKTtyZXR1cm4gdGhpc307bi5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtrLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3RoaXMuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWUoKTt0aGlzLl9ndWlkZUxpbmUuYXR0cnMoe3gxOnRoaXMuX2lzVmVydGljYWwoKT90aGlzLnBpeGVsUG9zaXRpb24oKTowLHkxOnRoaXMuX2lzVmVydGljYWwoKT8wOnRoaXMucGl4ZWxQb3NpdGlvbigpLHgyOnRoaXMuX2lzVmVydGljYWwoKT90aGlzLnBpeGVsUG9zaXRpb24oKTp0aGlzLndpZHRoKCkseTI6dGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMuaGVpZ2h0KCk6CnRoaXMucGl4ZWxQb3NpdGlvbigpfSk7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlPWZ1bmN0aW9uKCl7bnVsbCE9dGhpcy5zY2FsZSgpJiYodGhpcy5fbW9kZT09PWwuVkFMVUUmJm51bGwhPXRoaXMudmFsdWUoKT90aGlzLl9waXhlbFBvc2l0aW9uPXRoaXMuc2NhbGUoKS5zY2FsZSh0aGlzLnZhbHVlKCkpOnRoaXMuX21vZGU9PT1sLlBJWEVMJiZudWxsIT10aGlzLnBpeGVsUG9zaXRpb24oKSYmKHRoaXMuX3ZhbHVlPXRoaXMuc2NhbGUoKS5pbnZlcnQodGhpcy5waXhlbFBvc2l0aW9uKCkpKSl9O24ucHJvdG90eXBlLl9zZXRQaXhlbFBvc2l0aW9uV2l0aG91dENoYW5naW5nTW9kZT1mdW5jdGlvbihwKXt0aGlzLl9waXhlbFBvc2l0aW9uPXA7bnVsbCE9dGhpcy5zY2FsZSgpJiYodGhpcy5fdmFsdWU9dGhpcy5zY2FsZSgpLmludmVydCh0aGlzLnBpeGVsUG9zaXRpb24oKSkpO3RoaXMucmVuZGVyKCl9O24ucHJvdG90eXBlLnNjYWxlPQpmdW5jdGlvbihwKXtpZihudWxsPT1wKXJldHVybiB0aGlzLl9zY2FsZTt2YXIgcT10aGlzLl9zY2FsZTtudWxsIT1xJiZxLm9mZlVwZGF0ZSh0aGlzLl9zY2FsZVVwZGF0ZUNhbGxiYWNrKTt0aGlzLl9zY2FsZT1wO3RoaXMuX3NjYWxlLm9uVXBkYXRlKHRoaXMuX3NjYWxlVXBkYXRlQ2FsbGJhY2spO3RoaXMuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWUoKTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtuLnByb3RvdHlwZS52YWx1ZT1mdW5jdGlvbihwKXtpZihudWxsPT1wKXJldHVybiB0aGlzLl92YWx1ZTt0aGlzLl92YWx1ZT1wO3RoaXMuX21vZGU9bC5WQUxVRTt0aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307bi5wcm90b3R5cGUucGl4ZWxQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9waXhlbFBvc2l0aW9ufTtuLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7ay5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpOwpudWxsIT10aGlzLnNjYWxlKCkmJnRoaXMuc2NhbGUoKS5vZmZVcGRhdGUodGhpcy5fc2NhbGVVcGRhdGVDYWxsYmFjayl9O3JldHVybiBufShjLkNvbXBvbmVudCk7Yy5PUklFTlRBVElPTl9WRVJUSUNBTD0idmVydGljYWwiO2MuT1JJRU5UQVRJT05fSE9SSVpPTlRBTD0iaG9yaXpvbnRhbCI7ZC5HdWlkZUxpbmVMYXllcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG4scCl7ZnVuY3Rpb24gcSgpe3RoaXMuY29uc3RydWN0b3I9bn1mb3IodmFyIHIgaW4gcClwLmhhc093blByb3BlcnR5KHIpJiYobltyXT1wW3JdKTtuLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihxLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgcSl9LGw9ZigwKTtjPWYoNCk7dmFyIGs7KGZ1bmN0aW9uKG4pe25bbi5WQUxVRT0wXT0iVkFMVUUiO25bbi5QSVhFTD0xXT0iUElYRUwifSkoaz1kLlByb3BlcnR5TW9kZXx8KGQuUHJvcGVydHlNb2RlPQp7fSkpO2M9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcCgpe3ZhciBxPW4uY2FsbCh0aGlzKXx8dGhpcztxLl9ib3hWaXNpYmxlPSExO3EuX2JveEJvdW5kcz17dG9wTGVmdDp7eDowLHk6MH0sYm90dG9tUmlnaHQ6e3g6MCx5OjB9fTtxLl94Qm91bmRzTW9kZT1rLlBJWEVMO3EuX3lCb3VuZHNNb2RlPWsuUElYRUw7cS5hZGRDbGFzcygic2VsZWN0aW9uLWJveC1sYXllciIpO3EuX2FkanVzdEJvdW5kc0NhbGxiYWNrPWZ1bmN0aW9uKCl7cS5yZW5kZXIoKX07cS5fb3ZlcmZsb3dIaWRkZW49ITA7cS5feEV4dGVudD1bdm9pZCAwLHZvaWQgMF07cS5feUV4dGVudD1bdm9pZCAwLHZvaWQgMF07cmV0dXJuIHF9ZyhwLG4pO3AucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe24ucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX2JveD10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJzZWxlY3Rpb24tYm94IiwhMCkucmVtb3ZlKCk7dGhpcy5fYm94QXJlYT10aGlzLl9ib3guYXBwZW5kKCJyZWN0IikuY2xhc3NlZCgic2VsZWN0aW9uLWFyZWEiLAohMCl9O3AucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHEscil7cmV0dXJue3dpZHRoOnEsaGVpZ2h0OnJ9fTtwLnByb3RvdHlwZS5ib3VuZHM9ZnVuY3Rpb24ocSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5fZ2V0Qm91bmRzKCk7dGhpcy5fc2V0Qm91bmRzKHEpO3RoaXMuX3lCb3VuZHNNb2RlPXRoaXMuX3hCb3VuZHNNb2RlPWsuUElYRUw7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuX3NldEJvdW5kcz1mdW5jdGlvbihxKXt0aGlzLl9ib3hCb3VuZHM9e3RvcExlZnQ6e3g6TWF0aC5taW4ocS50b3BMZWZ0LngscS5ib3R0b21SaWdodC54KSx5Ok1hdGgubWluKHEudG9wTGVmdC55LHEuYm90dG9tUmlnaHQueSl9LGJvdHRvbVJpZ2h0Ont4Ok1hdGgubWF4KHEudG9wTGVmdC54LHEuYm90dG9tUmlnaHQueCkseTpNYXRoLm1heChxLnRvcExlZnQueSxxLmJvdHRvbVJpZ2h0LnkpfX19O3AucHJvdG90eXBlLl9nZXRCb3VuZHM9ZnVuY3Rpb24oKXtyZXR1cm57dG9wTGVmdDp7eDp0aGlzLl94Qm91bmRzTW9kZT09PQprLlBJWEVMP3RoaXMuX2JveEJvdW5kcy50b3BMZWZ0Lng6bnVsbD09dGhpcy5feFNjYWxlPzA6TWF0aC5taW4odGhpcy54U2NhbGUoKS5zY2FsZSh0aGlzLnhFeHRlbnQoKVswXSksdGhpcy54U2NhbGUoKS5zY2FsZSh0aGlzLnhFeHRlbnQoKVsxXSkpLHk6dGhpcy5feUJvdW5kc01vZGU9PT1rLlBJWEVMP3RoaXMuX2JveEJvdW5kcy50b3BMZWZ0Lnk6bnVsbD09dGhpcy5feVNjYWxlPzA6TWF0aC5taW4odGhpcy55U2NhbGUoKS5zY2FsZSh0aGlzLnlFeHRlbnQoKVswXSksdGhpcy55U2NhbGUoKS5zY2FsZSh0aGlzLnlFeHRlbnQoKVsxXSkpfSxib3R0b21SaWdodDp7eDp0aGlzLl94Qm91bmRzTW9kZT09PWsuUElYRUw/dGhpcy5fYm94Qm91bmRzLmJvdHRvbVJpZ2h0Lng6bnVsbD09dGhpcy5feFNjYWxlPzA6TWF0aC5tYXgodGhpcy54U2NhbGUoKS5zY2FsZSh0aGlzLnhFeHRlbnQoKVswXSksdGhpcy54U2NhbGUoKS5zY2FsZSh0aGlzLnhFeHRlbnQoKVsxXSkpLHk6dGhpcy5feUJvdW5kc01vZGU9PT0Kay5QSVhFTD90aGlzLl9ib3hCb3VuZHMuYm90dG9tUmlnaHQueTpudWxsPT10aGlzLl95U2NhbGU/MDpNYXRoLm1heCh0aGlzLnlTY2FsZSgpLnNjYWxlKHRoaXMueUV4dGVudCgpWzBdKSx0aGlzLnlTY2FsZSgpLnNjYWxlKHRoaXMueUV4dGVudCgpWzFdKSl9fX07cC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtuLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO2lmKHRoaXMuX2JveFZpc2libGUpe3ZhciBxPXRoaXMuYm91bmRzKCkscj1xLnRvcExlZnQueSx0PXEuYm90dG9tUmlnaHQueSx2PXEudG9wTGVmdC54O3E9cS5ib3R0b21SaWdodC54O2lmKCEobC5NYXRoLmlzVmFsaWROdW1iZXIocikmJmwuTWF0aC5pc1ZhbGlkTnVtYmVyKHQpJiZsLk1hdGguaXNWYWxpZE51bWJlcih2KSYmbC5NYXRoLmlzVmFsaWROdW1iZXIocSkpKXRocm93IEVycm9yKCJib3VuZHMgaGF2ZSBub3QgYmVlbiBwcm9wZXJseSBzZXQiKTt0aGlzLl9ib3hBcmVhLmF0dHJzKHt4OnYsCnk6cix3aWR0aDpxLXYsaGVpZ2h0OnQtcn0pO3RoaXMuY29udGVudCgpLm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLl9ib3gubm9kZSgpKX1lbHNlIHRoaXMuX2JveC5yZW1vdmUoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuYm94VmlzaWJsZT1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl9ib3hWaXNpYmxlO3RoaXMuX2JveFZpc2libGU9cTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuITB9O3AucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuITB9O3AucHJvdG90eXBlLnhTY2FsZT1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl94U2NhbGU7bnVsbCE9dGhpcy5feFNjYWxlJiZ0aGlzLl94U2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTt0aGlzLl94U2NhbGU9cTt0aGlzLl94Qm91bmRzTW9kZT1rLlZBTFVFO3RoaXMuX3hTY2FsZS5vblVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayk7CnRoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnlTY2FsZT1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl95U2NhbGU7bnVsbCE9dGhpcy5feVNjYWxlJiZ0aGlzLl95U2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTt0aGlzLl95U2NhbGU9cTt0aGlzLl95Qm91bmRzTW9kZT1rLlZBTFVFO3RoaXMuX3lTY2FsZS5vblVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUueEV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRYRXh0ZW50KCl9O3AucHJvdG90eXBlLl9nZXRYRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3hCb3VuZHNNb2RlPT09ay5WQUxVRT90aGlzLl94RXh0ZW50Om51bGw9PXRoaXMuX3hTY2FsZT9bdm9pZCAwLHZvaWQgMF06W3RoaXMuX3hTY2FsZS5pbnZlcnQodGhpcy5fYm94Qm91bmRzLnRvcExlZnQueCksCnRoaXMuX3hTY2FsZS5pbnZlcnQodGhpcy5fYm94Qm91bmRzLmJvdHRvbVJpZ2h0LngpXX07cC5wcm90b3R5cGUuX3NldFhFeHRlbnQ9ZnVuY3Rpb24ocSl7dGhpcy5feEV4dGVudD1xfTtwLnByb3RvdHlwZS55RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFlFeHRlbnQoKX07cC5wcm90b3R5cGUuX2dldFlFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feUJvdW5kc01vZGU9PT1rLlZBTFVFP3RoaXMuX3lFeHRlbnQ6bnVsbD09dGhpcy5feVNjYWxlP1t2b2lkIDAsdm9pZCAwXTpbdGhpcy5feVNjYWxlLmludmVydCh0aGlzLl9ib3hCb3VuZHMudG9wTGVmdC55KSx0aGlzLl95U2NhbGUuaW52ZXJ0KHRoaXMuX2JveEJvdW5kcy5ib3R0b21SaWdodC55KV19O3AucHJvdG90eXBlLl9zZXRZRXh0ZW50PWZ1bmN0aW9uKHEpe3RoaXMuX3lFeHRlbnQ9cX07cC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe24ucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTtudWxsIT0KdGhpcy5feFNjYWxlJiZ0aGlzLnhTY2FsZSgpLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayk7bnVsbCE9dGhpcy5feVNjYWxlJiZ0aGlzLnlTY2FsZSgpLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayl9O3JldHVybiBwfShjLkNvbXBvbmVudCk7ZC5TZWxlY3Rpb25Cb3hMYXllcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwsayl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIHAgaW4gaylrLmhhc093blByb3BlcnR5KHApJiYobFtwXT1rW3BdKTtsLnByb3RvdHlwZT1udWxsPT09az9PYmplY3QuY3JlYXRlKGspOihuLnByb3RvdHlwZT1rLnByb3RvdHlwZSxuZXcgbil9O2M9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gaygpe3JldHVybiBsLmNhbGwodGhpcywicGF0aCIsImFyYyBmaWxsIil8fHRoaXN9ZyhrLGwpO2sucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPQpmdW5jdGlvbihuKXtuLnN0eWxlKCJzdHJva2UiLCJub25lIil9O3JldHVybiBrfShmKDkpLlNWR0RyYXdlcik7ZC5BcmNTVkdEcmF3ZXI9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLGspe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBwIGluIGspay5oYXNPd25Qcm9wZXJ0eShwKSYmKGxbcF09a1twXSk7bC5wcm90b3R5cGU9bnVsbD09PWs/T2JqZWN0LmNyZWF0ZShrKToobi5wcm90b3R5cGU9ay5wcm90b3R5cGUsbmV3IG4pfTtjPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIGsoKXtyZXR1cm4gbC5jYWxsKHRoaXMsInBhdGgiLCJhcmMgb3V0bGluZSIpfHx0aGlzfWcoayxsKTtrLnByb3RvdHlwZS5fYXBwbHlEZWZhdWx0QXR0cmlidXRlcz1mdW5jdGlvbihuKXtuLnN0eWxlKCJmaWxsIiwibm9uZSIpfTtyZXR1cm4ga30oZig5KS5TVkdEcmF3ZXIpO2QuQXJjT3V0bGluZVNWR0RyYXdlcj1jfSxmdW5jdGlvbihjLApkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHApe2Z1bmN0aW9uIHEoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciByIGluIHApcC5oYXNPd25Qcm9wZXJ0eShyKSYmKG5bcl09cFtyXSk7bi5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToocS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IHEpfSxsPWYoMTgpO2M9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcCgpe3JldHVybiBuLmNhbGwodGhpcywicGF0aCIsImFyZWEiKXx8dGhpc31nKHAsbik7cC5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24ocSl7cS5zdHlsZSgic3Ryb2tlIiwibm9uZSIpfTtwLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIG4ucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXguY2FsbCh0aGlzLDApfTtyZXR1cm4gcH0oZig5KS5TVkdEcmF3ZXIpO2QuQXJlYVNWR0RyYXdlcj0KYzt2YXIgaz1bImZpbGwiLCJvcGFjaXR5IiwiZmlsbC1vcGFjaXR5Il07ZC5tYWtlQXJlYUNhbnZhc0RyYXdTdGVwPWZ1bmN0aW9uKG4pe3JldHVybiBmdW5jdGlvbihwLHEscil7cj1sLnJlc29sdmVBdHRyaWJ1dGVzKHIsayxxWzBdLDApO2wucmVuZGVyQXJlYShwLG4oKSxxWzBdLHIpfX19LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxrKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgcCBpbiBrKWsuaGFzT3duUHJvcGVydHkocCkmJihsW3BdPWtbcF0pO2wucHJvdG90eXBlPW51bGw9PT1rP09iamVjdC5jcmVhdGUoayk6KG4ucHJvdG90eXBlPWsucHJvdG90eXBlLG5ldyBuKX07Yz1mdW5jdGlvbihsKXtmdW5jdGlvbiBrKCl7cmV0dXJuIGwuY2FsbCh0aGlzLCJsaW5lIiwiIil8fHRoaXN9ZyhrLGwpO3JldHVybiBrfShmKDkpLlNWR0RyYXdlcik7ZC5TZWdtZW50U1ZHRHJhd2VyPWN9LGZ1bmN0aW9uKGMsCmQsZil7ZnVuY3Rpb24gZyhxLHIsdCx2LHkpe3JldHVybiAwPD10K3kmJnQteTw9cSYmMDw9dit5JiZ2LXk8PXJ9ZnVuY3Rpb24gbChxLHIsdCl7aWYobnVsbD09cSlyZXR1cm4hMTtmb3IodmFyIHY9MDt2PHQubGVuZ3RoO3YrKyl7dmFyIHk9dFt2XTtpZihxW3ldIT1yW3ldKXJldHVybiExfXJldHVybiEwfXZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihxLHIpe2Z1bmN0aW9uIHQoKXt0aGlzLmNvbnN0cnVjdG9yPXF9Zm9yKHZhciB2IGluIHIpci5oYXNPd25Qcm9wZXJ0eSh2KSYmKHFbdl09clt2XSk7cS5wcm90b3R5cGU9bnVsbD09PXI/T2JqZWN0LmNyZWF0ZShyKToodC5wcm90b3R5cGU9ci5wcm90b3R5cGUsbmV3IHQpfSxuPWYoODYpLHA9ZigxOCk7Yz1mdW5jdGlvbihxKXtmdW5jdGlvbiByKCl7cmV0dXJuIHEuY2FsbCh0aGlzLCJwYXRoIiwic3ltYm9sIil8fHRoaXN9ayhyLHEpO3JldHVybiByfShmKDkpLlNWR0RyYXdlcik7ZC5TeW1ib2xTVkdEcmF3ZXI9CmM7ZC5tYWtlU3ltYm9sQ2FudmFzRHJhd1N0ZXA9ZnVuY3Rpb24ocSxyLHQpe3ZhciB2PXRoaXM7cmV0dXJuIGZ1bmN0aW9uKHkseix4KXt2YXIgQz15LmNhbnZhcyxGPUMuY2xpZW50V2lkdGg7Qz1DLmNsaWVudEhlaWdodDtmb3IodmFyIEQ9bmV3IG4uQ2FudmFzQnVmZmVyKDAsMCksQj1yKCksST10KCksTz1udWxsLFA9bnVsbCxIPW51bGwsSz0wO0s8ei5sZW5ndGg7SysrKXt2YXIgTT16W0tdO2lmKG51bGwhPU0pe3ZhciBMPXAucmVzb2x2ZUF0dHJpYnV0ZXNTdWJzZXRXaXRoU3R5bGVzKHgsWyJ4IiwieSJdLE0sSyksUj1JKE0sSyxxKTtpZihnKEYsQyxMLngsTC55LFIpKXt2YXIgVT1sKE8sTCxwLkNvbnRleHRTdHlsZUF0dHJzKTtNPUIoTSxLLHYuX2RhdGFzZXQpO1UmJkg9PVImJlA9PU18fChPPXAuZ2V0U3Ryb2tlV2lkdGgoTCksTz1SK08rMSwoTz5ELnNjcmVlbldpZHRofHxPPkQuc2NyZWVuSGVpZ2h0KSYmRC5yZXNpemUoTyxPLCEwKSxELmNsZWFyKCksTz1ELmN0eCxPLmJlZ2luUGF0aCgpLApNKFIpLmNvbnRleHQoTykobnVsbCksTy5jbG9zZVBhdGgoKSxwLnJlbmRlclBhdGhXaXRoU3R5bGUoTyxMKSxQPU0sSD1SLE89TCk7RC5ibGl0Q2VudGVyKHksTC54LEwueSl9fX19fX0sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcoRCl7cmV0dXJuIEQgaW5zdGFuY2VvZiB6P0Q6RCBpbnN0YW5jZW9mIERhdGU/bihELnZhbHVlT2YoKSk6RCBpbnN0YW5jZW9mIHkuU2NhbGU/bChEKTpEIGluc3RhbmNlb2Ygdi5EYXRhc2V0P2soRCk6dChEKT9xKEQpOkFycmF5LmlzQXJyYXkoRCk/cChEKTpuKEQpfWZ1bmN0aW9uIGwoRCl7RD17ZG9tYWluOkQuZG9tYWluKCkscmFuZ2U6RC5yYW5nZSgpLHVwZGF0ZUlkOkQudXBkYXRlSWQoKSxyZWY6bihEKX07cmV0dXJuIHEoRCl9ZnVuY3Rpb24gayhEKXtEPXtyZWY6bihEKSx1cGRhdGVJZDpELnVwZGF0ZUlkKCl9O3JldHVybiBxKEQpfWZ1bmN0aW9uIG4oRCl7cmV0dXJuIG5ldyBDKEQpfWZ1bmN0aW9uIHAoRCl7cmV0dXJuIG5ldyB4KEQubWFwKGZ1bmN0aW9uKEIpe3JldHVybiBnKEIpfSkpfQpmdW5jdGlvbiBxKEQpe3ZhciBCPXt9LEk7Zm9yKEkgaW4gRClELmhhc093blByb3BlcnR5KEkpJiYoQltJXT1nKERbSV0pKTtyZXR1cm4gbmV3IEYoQil9dmFyIHI9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKEQsQil7ZnVuY3Rpb24gSSgpe3RoaXMuY29uc3RydWN0b3I9RH1mb3IodmFyIE8gaW4gQilCLmhhc093blByb3BlcnR5KE8pJiYoRFtPXT1CW09dKTtELnByb3RvdHlwZT1udWxsPT09Qj9PYmplY3QuY3JlYXRlKEIpOihJLnByb3RvdHlwZT1CLnByb3RvdHlwZSxuZXcgSSl9LHQ9ZigxMjgpLHY9ZigzOCkseT1mKDE3KTtkLnNpZ249ZztkLnNpZ25TY2FsZT1sO2Quc2lnbkRhdGFzZXQ9aztkLnNpZ25SZWY9bjtkLnNpZ25BcnJheT1wO2Quc2lnbk9iaj1xO3ZhciB6PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gRCgpe31ELnByb3RvdHlwZS5pc0RpZmZlcmVudD1mdW5jdGlvbihCKXtyZXR1cm4gQiBpbnN0YW5jZW9mIHRoaXMuY29uc3RydWN0b3I/dGhpcy5pc1NpZ25hdHVyZURpZmZlcmVudChCKToKITB9O3JldHVybiBEfSgpO2QuU2lnbmF0dXJlPXo7dmFyIHg9ZnVuY3Rpb24oRCl7ZnVuY3Rpb24gQihJKXt2YXIgTz1ELmNhbGwodGhpcyl8fHRoaXM7Ty5hcnJheT1JO3JldHVybiBPfXIoQixEKTtCLnByb3RvdHlwZS5pc1NpZ25hdHVyZURpZmZlcmVudD1mdW5jdGlvbihJKXtpZihJLmFycmF5Lmxlbmd0aCE9PXRoaXMuYXJyYXkubGVuZ3RoKXJldHVybiEwO2Zvcih2YXIgTz0wO088dGhpcy5hcnJheS5sZW5ndGg7TysrKWlmKHRoaXMuYXJyYXlbT10uaXNEaWZmZXJlbnQoSS5hcnJheVtPXSkpcmV0dXJuITA7cmV0dXJuITF9O3JldHVybiBCfSh6KTtkLkFycmF5U2lnbmF0dXJlPXg7dmFyIEM9ZnVuY3Rpb24oRCl7ZnVuY3Rpb24gQihJKXt2YXIgTz1ELmNhbGwodGhpcyl8fHRoaXM7Ty5yZWY9STtyZXR1cm4gT31yKEIsRCk7Qi5wcm90b3R5cGUuaXNTaWduYXR1cmVEaWZmZXJlbnQ9ZnVuY3Rpb24oSSl7cmV0dXJuIHRoaXMucmVmIT09SS5yZWZ9O3JldHVybiBCfSh6KTtkLlJlZmVyZW5jZVNpZ25hdHVyZT0KQzt2YXIgRj1mdW5jdGlvbihEKXtmdW5jdGlvbiBCKEkpe3ZhciBPPUQuY2FsbCh0aGlzKXx8dGhpcztPLm9iaj1JO3JldHVybiBPfXIoQixEKTtCLnByb3RvdHlwZS5pc1NpZ25hdHVyZURpZmZlcmVudD1mdW5jdGlvbihJKXt2YXIgTz1PYmplY3Qua2V5cyh0aGlzLm9iaiksUD1PYmplY3Qua2V5cyhJLm9iaik7aWYoTy5sZW5ndGghPT1QLmxlbmd0aClyZXR1cm4hMDtmb3IoUD0wO1A8Ty5sZW5ndGg7UCsrKXt2YXIgSD1PW1BdO2lmKCFJLm9iai5oYXNPd25Qcm9wZXJ0eShIKXx8dGhpcy5vYmpbSF0uaXNEaWZmZXJlbnQoSS5vYmpbSF0pKXJldHVybiEwfXJldHVybiExfTtyZXR1cm4gQn0oeik7ZC5PYmplY3RTaWduYXR1cmU9Rn0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih6LHgpe2Z1bmN0aW9uIEMoKXt0aGlzLmNvbnN0cnVjdG9yPXp9Zm9yKHZhciBGIGluIHgpeC5oYXNPd25Qcm9wZXJ0eShGKSYmKHpbRl09eFtGXSk7ei5wcm90b3R5cGU9Cm51bGw9PT14P09iamVjdC5jcmVhdGUoeCk6KEMucHJvdG90eXBlPXgucHJvdG90eXBlLG5ldyBDKX0sbD1mKDEpLGs9ZigzKSxuPWYoMCkscD1mKDE0KSxxPWYoNDYpLHI9Zig2KSx0PWYoMzMpLHY9ZigxOSk7Yz1mKDUzKTt2YXIgeT1mKDIpO2Y9ZnVuY3Rpb24oeil7ZnVuY3Rpb24geCgpe3ZhciBDPXouY2FsbCh0aGlzKXx8dGhpcztDLmFkZENsYXNzKCJhcmVhLXBsb3QiKTtDLnkwKDApO0MuYXR0cigiZmlsbC1vcGFjaXR5IiwuMjUpO0MuYXR0cigiZmlsbCIsKG5ldyBrLkNvbG9yKS5yYW5nZSgpWzBdKTtDLl9saW5lRHJhd2Vycz1uZXcgbi5NYXA7cmV0dXJuIEN9Zyh4LHopO3gucHJvdG90eXBlLnk9ZnVuY3Rpb24oQyxGKXtpZihudWxsPT1DKXJldHVybiB6LnByb3RvdHlwZS55LmNhbGwodGhpcyk7bnVsbD09Rj96LnByb3RvdHlwZS55LmNhbGwodGhpcyxDKTp6LnByb3RvdHlwZS55LmNhbGwodGhpcyxDLEYpO251bGwhPUYmJihDPXRoaXMueTAoKS5hY2Nlc3NvcixudWxsIT0KQyYmdGhpcy5fYmluZFByb3BlcnR5KHguX1kwX0tFWSxDLEYpLHRoaXMuX3VwZGF0ZVlTY2FsZSgpKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUueTA9ZnVuY3Rpb24oQyl7aWYobnVsbD09QylyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoeC5fWTBfS0VZKTt2YXIgRj10aGlzLnkoKTt0aGlzLl9iaW5kUHJvcGVydHkoeC5fWTBfS0VZLEMsRiYmRi5zY2FsZSk7dGhpcy5fdXBkYXRlWVNjYWxlKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe3oucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKTt0aGlzLl91cGRhdGVZU2NhbGUoKX07eC5wcm90b3R5cGUuX2FkZERhdGFzZXQ9ZnVuY3Rpb24oQyl7dmFyIEY9dGhpczt0aGlzLl9saW5lRHJhd2Vycy5zZXQoQyxuZXcgcC5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgdC5MaW5lU1ZHRHJhd2VyfSxmdW5jdGlvbihEKXtyZXR1cm4gbmV3IHAuQ2FudmFzRHJhd2VyKEQsCnQubWFrZUxpbmVDYW52YXNEcmF3U3RlcChmdW5jdGlvbigpe3ZhciBCPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRi54KCkpLEk9eS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihGLnkoKSk7cmV0dXJuIEYuX2QzTGluZUZhY3RvcnkoQyxCLEkpfSkpfSkpO3oucHJvdG90eXBlLl9hZGREYXRhc2V0LmNhbGwodGhpcyxDKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldD1mdW5jdGlvbihDKXt6LnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0LmNhbGwodGhpcyxDKTtDPXRoaXMuX2xpbmVEcmF3ZXJzLmdldChDKTsic3ZnIj09PXRoaXMucmVuZGVyZXIoKT9DLnVzZVNWRyh0aGlzLl9yZW5kZXJBcmVhKTpDLnVzZUNhbnZhcyh0aGlzLl9jYW52YXMpO3JldHVybiBDfTt4LnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzPWZ1bmN0aW9uKEMpe3oucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXMuY2FsbCh0aGlzLEMpO3RoaXMuX2xpbmVEcmF3ZXJzLmdldChDKS5yZW1vdmUoKX07CngucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oKXt2YXIgQz10aGlzLEY9dGhpcy5fZ2VuZXJhdGVMaW5lRHJhd1N0ZXBzKCksRD10aGlzLl9nZXREYXRhVG9EcmF3KCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oQil7dmFyIEk9eS5QbG90LmFwcGx5RHJhd1N0ZXBzKEYsQik7Qy5fbGluZURyYXdlcnMuZ2V0KEIpLmRyYXcoRC5nZXQoQiksSSl9KX07eC5wcm90b3R5cGUuX2dlbmVyYXRlTGluZURyYXdTdGVwcz1mdW5jdGlvbigpe3ZhciBDPVtdO2lmKHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSl7dmFyIEY9dGhpcy5fZ2VuZXJhdGVMaW5lQXR0clRvUHJvamVjdG9yKCk7Ri5kPXRoaXMuX2NvbnN0cnVjdExpbmVQcm9qZWN0b3IoeS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksdGhpcy5fZ2V0UmVzZXRZRnVuY3Rpb24oKSk7Qy5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6RixhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih2LkFuaW1hdG9yLlJFU0VUKX0pfUMucHVzaCh7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dlbmVyYXRlTGluZUF0dHJUb1Byb2plY3RvcigpLAphbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih2LkFuaW1hdG9yLk1BSU4pfSk7cmV0dXJuIEN9O3gucHJvdG90eXBlLl9nZW5lcmF0ZUxpbmVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgQz10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTtDLmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3Rvcih5LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx5LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSk7cmV0dXJuIEN9O3gucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oQyl7dmFyIEY9dGhpcztyZXR1cm4gbmV3IHIuUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHEuQXJlYVNWR0RyYXdlcn0sZnVuY3Rpb24oRCl7cmV0dXJuIG5ldyBwLkNhbnZhc0RyYXdlcihELHEubWFrZUFyZWFDYW52YXNEcmF3U3RlcChmdW5jdGlvbigpe3ZhciBCPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRi54KCkpLEk9eS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihGLnkoKSksCk89eS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihGLnkwKCkpO3JldHVybiBGLl9jcmVhdGVBcmVhR2VuZXJhdG9yKEIsSSxPLEYuX2NyZWF0ZURlZmluZWRQcm9qZWN0b3IoQixJKSxDKX0pKX0pfTt4LnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXt2YXIgQz1bXTtpZih0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCkpe3ZhciBGPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO0YuZD10aGlzLl9jb25zdHJ1Y3RBcmVhUHJvamVjdG9yKHkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHRoaXMuX2dldFJlc2V0WUZ1bmN0aW9uKCkseS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkwKCkpKTtDLnB1c2goe2F0dHJUb1Byb2plY3RvcjpGLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKHYuQW5pbWF0b3IuUkVTRVQpfSl9Qy5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3Iodi5BbmltYXRvci5NQUlOKX0pOwpyZXR1cm4gQ307eC5wcm90b3R5cGUuX3VwZGF0ZVlTY2FsZT1mdW5jdGlvbigpe3ZhciBDPXRoaXMuZ2V0RXh0ZW50c0ZvclByb3BlcnR5KCJ5MCIpO0M9bi5BcnJheS51bmlxKG4uQXJyYXkuZmxhdHRlbihDKSk7dmFyIEY9MT09PUMubGVuZ3RoP0NbMF06bnVsbDtDPShDPXRoaXMueSgpKSYmQy5zY2FsZTtudWxsIT1DJiYobnVsbCE9dGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXImJihDLnJlbW92ZVBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXIodGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXIpLHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyPW51bGwpLG51bGwhPUYmJih0aGlzLl9jb25zdGFudEJhc2VsaW5lVmFsdWVQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybltGXX0sQy5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyKSkpfTt4LnByb3RvdHlwZS5fZ2V0UmVzZXRZRnVuY3Rpb249CmZ1bmN0aW9uKCl7cmV0dXJuIHkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55MCgpKX07eC5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBDPXoucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKTtDLmQ9dGhpcy5fY29uc3RydWN0QXJlYVByb2plY3Rvcih5LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx5LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSx5LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTAoKSkpO3JldHVybiBDfTt4LnByb3RvdHlwZS5zZWxlY3Rpb25zPWZ1bmN0aW9uKEMpe3ZhciBGPXRoaXM7dm9pZCAwPT09QyYmKEM9dGhpcy5kYXRhc2V0cygpKTtpZigiY2FudmFzIj09PXRoaXMucmVuZGVyZXIoKSlyZXR1cm4gbC5zZWxlY3RBbGwoKTt2YXIgRD16LnByb3RvdHlwZS5zZWxlY3Rpb25zLmNhbGwodGhpcyxDKS5ub2RlcygpO0MubWFwKGZ1bmN0aW9uKEIpe3JldHVybiBGLl9saW5lRHJhd2Vycy5nZXQoQil9KS5maWx0ZXIoZnVuY3Rpb24oQil7cmV0dXJuIG51bGwhPQpCfSkuZm9yRWFjaChmdW5jdGlvbihCKXtyZXR1cm4gRC5wdXNoLmFwcGx5KEQsQi5nZXRWaXN1YWxQcmltaXRpdmVzKCkpfSk7cmV0dXJuIGwuc2VsZWN0QWxsKEQpfTt4LnByb3RvdHlwZS5fY29uc3RydWN0QXJlYVByb2plY3Rvcj1mdW5jdGlvbihDLEYsRCl7dmFyIEI9dGhpcyxJPXRoaXMuX2NyZWF0ZURlZmluZWRQcm9qZWN0b3IoeS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSkseS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkpO3JldHVybiBmdW5jdGlvbihPLFAsSCl7cmV0dXJuIEIuX2NyZWF0ZUFyZWFHZW5lcmF0b3IoQyxGLEQsSSxIKShPKX19O3gucHJvdG90eXBlLl9jcmVhdGVEZWZpbmVkUHJvamVjdG9yPWZ1bmN0aW9uKEMsRil7cmV0dXJuIGZ1bmN0aW9uKEQsQixJKXt2YXIgTz1DKEQsQixJKTtEPUYoRCxCLEkpO3JldHVybiBuLk1hdGguaXNWYWxpZE51bWJlcihPKSYmbi5NYXRoLmlzVmFsaWROdW1iZXIoRCl9fTt4LnByb3RvdHlwZS5fY3JlYXRlQXJlYUdlbmVyYXRvcj0KZnVuY3Rpb24oQyxGLEQsQixJKXt2YXIgTz10aGlzLl9nZXRDdXJ2ZUZhY3RvcnkoKTtyZXR1cm4gbC5hcmVhKCkueChmdW5jdGlvbihQLEgpe3JldHVybiBDKFAsSCxJKX0pLnkxKGZ1bmN0aW9uKFAsSCl7cmV0dXJuIEYoUCxILEkpfSkueTAoZnVuY3Rpb24oUCxIKXtyZXR1cm4gRChQLEgsSSl9KS5jdXJ2ZShPKS5kZWZpbmVkKGZ1bmN0aW9uKFAsSCl7cmV0dXJuIEIoUCxILEkpfSl9O3JldHVybiB4fShjLkxpbmUpO2YuX1kwX0tFWT0ieTAiO2QuQXJlYT1mfSxmdW5jdGlvbihjLGQpeyhmdW5jdGlvbihmKXtmLk1BSU49Im1haW4iO2YuUkVTRVQ9InJlc2V0In0pKGQuQW5pbWF0b3J8fChkLkFuaW1hdG9yPXt9KSl9LGZ1bmN0aW9uKGMsZCl7dmFyIGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBnKCl7dmFyIGw9dGhpczt0aGlzLnRyYW5zbGF0ZT10aGlzLnNjYWxlPTA7dGhpcy5jYWNoZWREb21haW49W251bGwsbnVsbF07dGhpcy5sYXN0U2VlbkRvbWFpbj1bbnVsbCxudWxsXTt0aGlzLnVwZGF0ZURvbWFpbj0KZnVuY3Rpb24oayl7bC5sYXN0U2VlbkRvbWFpbj1rLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCk7dmFyIG49ay5zY2FsZVRyYW5zZm9ybWF0aW9uKGwuY2FjaGVkRG9tYWluWzFdKS1rLnNjYWxlVHJhbnNmb3JtYXRpb24obC5jYWNoZWREb21haW5bMF0pLHA9ay5zY2FsZVRyYW5zZm9ybWF0aW9uKGwubGFzdFNlZW5Eb21haW5bMV0pLWsuc2NhbGVUcmFuc2Zvcm1hdGlvbihsLmxhc3RTZWVuRG9tYWluWzBdKTtsLnNjYWxlPW4vcHx8MTtsLnRyYW5zbGF0ZT1rLnNjYWxlVHJhbnNmb3JtYXRpb24obC5jYWNoZWREb21haW5bMF0pLWsuc2NhbGVUcmFuc2Zvcm1hdGlvbihsLmxhc3RTZWVuRG9tYWluWzBdKSpsLnNjYWxlfHwwfX1nLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuc2NhbGU9MTt0aGlzLnRyYW5zbGF0ZT0wO3RoaXMuY2FjaGVkRG9tYWluPXRoaXMubGFzdFNlZW5Eb21haW59O2cucHJvdG90eXBlLnNldERvbWFpbj1mdW5jdGlvbihsKXt0aGlzLmNhY2hlZERvbWFpbj0KbC5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpfTtyZXR1cm4gZ30oKTtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZyhsLGspe3ZhciBuPXRoaXM7dGhpcy5yZW5kZXJDYWxsYmFjaz1sO3RoaXMuYXBwbHlUcmFuc2Zvcm1DYWxsYmFjaz1rO3RoaXMuZG9tYWluVHJhbnNmb3JtWD1uZXcgZjt0aGlzLmRvbWFpblRyYW5zZm9ybVk9bmV3IGY7dGhpcy5yZW5kZXJEZWZlcnJlZD1mdW5jdGlvbigpe24uYXBwbHlUcmFuc2Zvcm0oKTtjbGVhclRpbWVvdXQobi50aW1lb3V0VG9rZW4pO24udGltZW91dFRva2VuPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtuLnJlbmRlckNhbGxiYWNrKCl9LGcuREVGRVJSRURfUkVOREVSSU5HX0RFTEFZKX19Zy5wcm90b3R5cGUuc2V0RG9tYWlucz1mdW5jdGlvbihsLGspe2wmJnRoaXMuZG9tYWluVHJhbnNmb3JtWC5zZXREb21haW4obCk7ayYmdGhpcy5kb21haW5UcmFuc2Zvcm1ZLnNldERvbWFpbihrKTt0aGlzLnJlbmRlckRlZmVycmVkKCl9O2cucHJvdG90eXBlLnVwZGF0ZURvbWFpbnM9CmZ1bmN0aW9uKGwsayl7bCYmdGhpcy5kb21haW5UcmFuc2Zvcm1YLnVwZGF0ZURvbWFpbihsKTtrJiZ0aGlzLmRvbWFpblRyYW5zZm9ybVkudXBkYXRlRG9tYWluKGspO3RoaXMucmVuZGVyRGVmZXJyZWQoKX07Zy5wcm90b3R5cGUucmVzZXRUcmFuc2Zvcm1zPWZ1bmN0aW9uKCl7dGhpcy5kb21haW5UcmFuc2Zvcm1YLnJlc2V0KCk7dGhpcy5kb21haW5UcmFuc2Zvcm1ZLnJlc2V0KCk7dGhpcy5hcHBseVRyYW5zZm9ybSgpfTtnLnByb3RvdHlwZS5hcHBseVRyYW5zZm9ybT1mdW5jdGlvbigpe3RoaXMuYXBwbHlUcmFuc2Zvcm1DYWxsYmFjayh0aGlzLmRvbWFpblRyYW5zZm9ybVgudHJhbnNsYXRlLHRoaXMuZG9tYWluVHJhbnNmb3JtWS50cmFuc2xhdGUsdGhpcy5kb21haW5UcmFuc2Zvcm1YLnNjYWxlLHRoaXMuZG9tYWluVHJhbnNmb3JtWS5zY2FsZSl9O3JldHVybiBnfSgpO2MuREVGRVJSRURfUkVOREVSSU5HX0RFTEFZPTIwMDtkLkRlZmVycmVkUmVuZGVyZXI9Y30sZnVuY3Rpb24oYywKZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oQyxGKXtmdW5jdGlvbiBEKCl7dGhpcy5jb25zdHJ1Y3Rvcj1DfWZvcih2YXIgQiBpbiBGKUYuaGFzT3duUHJvcGVydHkoQikmJihDW0JdPUZbQl0pO0MucHJvdG90eXBlPW51bGw9PT1GP09iamVjdC5jcmVhdGUoRik6KEQucHJvdG90eXBlPUYucHJvdG90eXBlLG5ldyBEKX0sbD1mKDEpLGs9Zig3KSxuPWYoMTQpLHA9Zig2KSxxPWYoMzMpLHI9ZigzKSx0PWYoMTEpLHY9ZigwKTtjPWYoMTApO3ZhciB5PWYoMTkpLHo9ZigyKTtmPWYoMTYpO3ZhciB4PXtsaW5lYXI6bC5jdXJ2ZUxpbmVhcixsaW5lYXJDbG9zZWQ6bC5jdXJ2ZUxpbmVhckNsb3NlZCxzdGVwOmwuY3VydmVTdGVwLHN0ZXBCZWZvcmU6bC5jdXJ2ZVN0ZXBCZWZvcmUsc3RlcEFmdGVyOmwuY3VydmVTdGVwQWZ0ZXIsYmFzaXM6bC5jdXJ2ZUJhc2lzLGJhc2lzT3BlbjpsLmN1cnZlQmFzaXNPcGVuLGJhc2lzQ2xvc2VkOmwuY3VydmVCYXNpc0Nsb3NlZCwKYnVuZGxlOmwuY3VydmVCdW5kbGUsY2FyZGluYWw6bC5jdXJ2ZUNhcmRpbmFsLGNhcmRpbmFsT3BlbjpsLmN1cnZlQ2FyZGluYWxPcGVuLGNhcmRpbmFsQ2xvc2VkOmwuY3VydmVDYXJkaW5hbENsb3NlZCxtb25vdG9uZTpsLmN1cnZlTW9ub3RvbmVYfTtkLkN1cnZlTmFtZT1jLm1ha2VFbnVtKCJsaW5lYXIgbGluZWFyQ2xvc2VkIHN0ZXAgc3RlcEJlZm9yZSBzdGVwQWZ0ZXIgYmFzaXMgYmFzaXNPcGVuIGJhc2lzQ2xvc2VkIGJ1bmRsZSBjYXJkaW5hbCBjYXJkaW5hbE9wZW4gY2FyZGluYWxDbG9zZWQgbW9ub3RvbmUiLnNwbGl0KCIgIikpO2Y9ZnVuY3Rpb24oQyl7ZnVuY3Rpb24gRigpe3ZhciBEPUMuY2FsbCh0aGlzKXx8dGhpcztELl9jdXJ2ZT0ibGluZWFyIjtELl9hdXRvcmFuZ2VTbW9vdGg9ITE7RC5fY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQ9ITA7RC5fY29sbGFwc2VEZW5zZVZlcnRpY2FsTGluZXNFbmFibGVkPSExO0QuX2Rvd25zYW1wbGluZ0VuYWJsZWQ9ITE7RC5hZGRDbGFzcygibGluZS1wbG90Iik7CnZhciBCPW5ldyBrLkVhc2luZztCLnN0ZXBEdXJhdGlvbih6LlBsb3QuX0FOSU1BVElPTl9NQVhfRFVSQVRJT04pO0IuZWFzaW5nTW9kZSgiZXhwSW5PdXQiKTtCLm1heFRvdGFsRHVyYXRpb24oei5QbG90Ll9BTklNQVRJT05fTUFYX0RVUkFUSU9OKTtELmFuaW1hdG9yKHkuQW5pbWF0b3IuTUFJTixCKTtELmF0dHIoInN0cm9rZSIsKG5ldyByLkNvbG9yKS5yYW5nZSgpWzBdKTtELmF0dHIoInN0cm9rZS13aWR0aCIsIjJweCIpO3JldHVybiBEfWcoRixDKTtGLnByb3RvdHlwZS54PWZ1bmN0aW9uKEQsQixJKXtpZihudWxsPT1EKXJldHVybiBDLnByb3RvdHlwZS54LmNhbGwodGhpcyk7Qy5wcm90b3R5cGUueC5jYWxsKHRoaXMsRCxCLEkpO3RoaXMuX3NldFNjYWxlU25hcHBpbmcoKTtyZXR1cm4gdGhpc307Ri5wcm90b3R5cGUueT1mdW5jdGlvbihELEIsSSl7aWYobnVsbD09RClyZXR1cm4gQy5wcm90b3R5cGUueS5jYWxsKHRoaXMpO0MucHJvdG90eXBlLnkuY2FsbCh0aGlzLEQsQiwKSSk7dGhpcy5fc2V0U2NhbGVTbmFwcGluZygpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIEMucHJvdG90eXBlLmF1dG9yYW5nZU1vZGUuY2FsbCh0aGlzKTtDLnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlLmNhbGwodGhpcyxEKTt0aGlzLl9zZXRTY2FsZVNuYXBwaW5nKCk7cmV0dXJuIHRoaXN9O0YucHJvdG90eXBlLmF1dG9yYW5nZVNtb290aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hdXRvcmFuZ2VTbW9vdGh9O0YucHJvdG90eXBlLl9zZXRTY2FsZVNuYXBwaW5nPWZ1bmN0aW9uKCl7IngiPT09dGhpcy5hdXRvcmFuZ2VNb2RlKCkmJnRoaXMueCgpJiZ0aGlzLngoKS5zY2FsZSYmdGhpcy54KCkuc2NhbGUgaW5zdGFuY2VvZiB0LlF1YW50aXRhdGl2ZVNjYWxlJiZ0aGlzLngoKS5zY2FsZS5zbmFwcGluZ0RvbWFpbkVuYWJsZWQoIXRoaXMuYXV0b3JhbmdlU21vb3RoKCkpOyJ5Ij09PXRoaXMuYXV0b3JhbmdlTW9kZSgpJiYKdGhpcy55KCkmJnRoaXMueSgpLnNjYWxlJiZ0aGlzLnkoKS5zY2FsZSBpbnN0YW5jZW9mIHQuUXVhbnRpdGF0aXZlU2NhbGUmJnRoaXMueSgpLnNjYWxlLnNuYXBwaW5nRG9tYWluRW5hYmxlZCghdGhpcy5hdXRvcmFuZ2VTbW9vdGgoKSl9O0YucHJvdG90eXBlLmN1cnZlPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2N1cnZlO3RoaXMuX2N1cnZlPUQ7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307Ri5wcm90b3R5cGUuZG93bnNhbXBsaW5nRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kb3duc2FtcGxpbmdFbmFibGVkfTtGLnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD1mdW5jdGlvbihEKXtpZihudWxsPT1EKXJldHVybiB0aGlzLl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZDt0aGlzLl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD1EO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0YucHJvdG90eXBlLmNvbGxhcHNlRGVuc2VMaW5lc0VuYWJsZWQ9CmZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2NvbGxhcHNlRGVuc2VWZXJ0aWNhbExpbmVzRW5hYmxlZDt0aGlzLl9jb2xsYXBzZURlbnNlVmVydGljYWxMaW5lc0VuYWJsZWQ9RDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKEQpe3ZhciBCPXRoaXM7cmV0dXJuIG5ldyBwLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBxLkxpbmVTVkdEcmF3ZXJ9LGZ1bmN0aW9uKEkpe3JldHVybiBuZXcgbi5DYW52YXNEcmF3ZXIoSSxxLm1ha2VMaW5lQ2FudmFzRHJhd1N0ZXAoZnVuY3Rpb24oKXtyZXR1cm4gQi5fZDNMaW5lRmFjdG9yeShEKX0pKX0pfTtGLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oRCl7dmFyIEI9Qy5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5LmNhbGwodGhpcyxEKTtpZighdGhpcy5fYXV0b3JhbmdlU21vb3RofHx0aGlzLmF1dG9yYW5nZU1vZGUoKSE9PQpEfHwieCIhPT10aGlzLmF1dG9yYW5nZU1vZGUoKSYmInkiIT09dGhpcy5hdXRvcmFuZ2VNb2RlKCkpcmV0dXJuIEI7RD10aGlzLl9nZXRFZGdlSW50ZXJzZWN0aW9uUG9pbnRzKCk7dmFyIEk9InkiPT09dGhpcy5hdXRvcmFuZ2VNb2RlKCk/RC5sZWZ0LmNvbmNhdChELnJpZ2h0KS5tYXAoZnVuY3Rpb24oTyl7cmV0dXJuIE8ueX0pOkQudG9wLmNvbmNhdChELmJvdHRvbSkubWFwKGZ1bmN0aW9uKE8pe3JldHVybiBPLnh9KTtyZXR1cm4gQi5tYXAoZnVuY3Rpb24oTyl7cmV0dXJuIGwuZXh0ZW50KGwubWVyZ2UoW08sSV0pKX0pfTtGLnByb3RvdHlwZS5fZ2V0RWRnZUludGVyc2VjdGlvblBvaW50cz1mdW5jdGlvbigpe3ZhciBEPXRoaXM7aWYoISh0aGlzLnkoKS5zY2FsZSBpbnN0YW5jZW9mIHQuUXVhbnRpdGF0aXZlU2NhbGUmJnRoaXMueCgpLnNjYWxlIGluc3RhbmNlb2YgdC5RdWFudGl0YXRpdmVTY2FsZSkpcmV0dXJue2xlZnQ6W10scmlnaHQ6W10sdG9wOltdLGJvdHRvbTpbXX07CnZhciBCPXRoaXMueSgpLnNjYWxlLEk9dGhpcy54KCkuc2NhbGUsTz17bGVmdDpbXSxyaWdodDpbXSx0b3A6W10sYm90dG9tOltdfSxQPUkuc2NhbGUoSS5kb21haW4oKVswXSksSD1JLnNjYWxlKEkuZG9tYWluKClbMV0pLEs9Qi5zY2FsZShCLmRvbWFpbigpWzBdKSxNPUIuc2NhbGUoQi5kb21haW4oKVsxXSk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oTCl7Zm9yKHZhciBSPUwuZGF0YSgpLFUsWSxiYSxtYSxhYSxjYSxmYSxkYT0xO2RhPFIubGVuZ3RoO2RhKyspbWE9Y2F8fEkuc2NhbGUoRC54KCkuYWNjZXNzb3IoUltkYS0xXSxkYS0xLEwpKSxhYT1mYXx8Qi5zY2FsZShELnkoKS5hY2Nlc3NvcihSW2RhLTFdLGRhLTEsTCkpLGNhPUkuc2NhbGUoRC54KCkuYWNjZXNzb3IoUltkYV0sZGEsTCkpLGZhPUIuc2NhbGUoRC55KCkuYWNjZXNzb3IoUltkYV0sZGEsTCkpLG1hPFA9PT1QPD1jYSYmKFU9UC1tYSxZPWNhLW1hLGJhPWZhLWFhLFU9VSpiYS9ZLE8ubGVmdC5wdXNoKHt4OlAsCnk6Qi5pbnZlcnQoYWErVSl9KSksbWE8SD09PUg8PWNhJiYoVT1ILW1hLFk9Y2EtbWEsYmE9ZmEtYWEsVT1VKmJhL1ksTy5yaWdodC5wdXNoKHt4OkgseTpCLmludmVydChhYStVKX0pKSxhYTxNPT09TTw9ZmEmJihZPWNhLW1hLFU9TS1hYSxiYT1mYS1hYSxVPVUqWS9iYSxPLnRvcC5wdXNoKHt4OkkuaW52ZXJ0KG1hK1UpLHk6TX0pKSxhYTxLPT09Szw9ZmEmJihZPWNhLW1hLFU9Sy1hYSxiYT1mYS1hYSxVPVUqWS9iYSxPLmJvdHRvbS5wdXNoKHt4OkkuaW52ZXJ0KG1hK1UpLHk6S30pKX0pO3JldHVybiBPfTtGLnByb3RvdHlwZS5fZ2V0UmVzZXRZRnVuY3Rpb249ZnVuY3Rpb24oKXt2YXIgRD10aGlzLnkoKS5zY2FsZS5kb21haW4oKSxCPU1hdGgubWF4KERbMF0sRFsxXSk7RD1NYXRoLm1pbihEWzBdLERbMV0pO0I9MD5CJiZCfHwwPEQmJkR8fDA7dmFyIEk9dGhpcy55KCkuc2NhbGUuc2NhbGUoQik7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEl9fTtGLnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9CmZ1bmN0aW9uKCl7dmFyIEQ9W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgQj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTtCLmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3Rvcih6LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx0aGlzLl9nZXRSZXNldFlGdW5jdGlvbigpKTtELnB1c2goe2F0dHJUb1Byb2plY3RvcjpCLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKHkuQW5pbWF0b3IuUkVTRVQpfSl9RC5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoeS5BbmltYXRvci5NQUlOKX0pO3JldHVybiBEfTtGLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgRD1DLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IuY2FsbCh0aGlzKTtPYmplY3Qua2V5cyhEKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe2lmKCJkIiE9PQpCKXt2YXIgST1EW0JdO0RbQl09ZnVuY3Rpb24oTyxQLEgpe3JldHVybiAwPE8ubGVuZ3RoP0koT1swXSxQLEgpOm51bGx9fX0pO3JldHVybiBEfTtGLnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEQpe0Q9dGhpcy5lbnRpdHlOZWFyZXN0QnlYVGhlblkoRCk7cmV0dXJuIG51bGwhPUQ/W0RdOltdfTtGLnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0QnlYVGhlblk9ZnVuY3Rpb24oRCl7dmFyIEI9SW5maW5pdHksST1JbmZpbml0eSxPLFA9dGhpcy5ib3VuZHMoKTt0aGlzLmVudGl0aWVzKCkuZm9yRWFjaChmdW5jdGlvbihIKXtpZih2Lk1hdGgud2l0aGluKEgucG9zaXRpb24sUCkpe3ZhciBLPU1hdGguYWJzKEQueC1ILnBvc2l0aW9uLngpLE09TWF0aC5hYnMoRC55LUgucG9zaXRpb24ueSk7aWYoSzxCfHxLPT09QiYmTTxJKU89SCxCPUssST1NfX0pO3JldHVybiBPfTtGLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIEQ9Qy5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpOwpELmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3Rvcih6LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx6LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSk7cmV0dXJuIER9O0YucHJvdG90eXBlLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yPWZ1bmN0aW9uKEQsQil7dmFyIEk9dGhpcztyZXR1cm4gZnVuY3Rpb24oTyxQLEgpe3JldHVybiBJLl9kM0xpbmVGYWN0b3J5KEgsRCxCKShPKX19O0YucHJvdG90eXBlLl9kM0xpbmVGYWN0b3J5PWZ1bmN0aW9uKEQsQixJKXtmdW5jdGlvbiBPKFAsSCxLKXt2YXIgTT1CKFAsSCxLKTtQPUkoUCxILEspO3JldHVybiB2Lk1hdGguaXNWYWxpZE51bWJlcihNKSYmdi5NYXRoLmlzVmFsaWROdW1iZXIoUCl9dm9pZCAwPT09QiYmKEI9ei5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSkpO3ZvaWQgMD09PUkmJihJPXouUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpKTtyZXR1cm4gbC5saW5lKCkueChmdW5jdGlvbihQLEgpe3JldHVybiBCKFAsCkgsRCl9KS55KGZ1bmN0aW9uKFAsSCl7cmV0dXJuIEkoUCxILEQpfSkuY3VydmUodGhpcy5fZ2V0Q3VydmVGYWN0b3J5KCkpLmRlZmluZWQoZnVuY3Rpb24oUCxIKXtyZXR1cm4gTyhQLEgsRCl9KX07Ri5wcm90b3R5cGUuX2dldEN1cnZlRmFjdG9yeT1mdW5jdGlvbigpe3ZhciBEPXRoaXMuY3VydmUoKTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBEPyhEPXhbRF0sbnVsbD09RD94LmxpbmVhcjpEKTpEfTtGLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBEPXRoaXMsQj1uZXcgdi5NYXA7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oSSl7dmFyIE89SS5kYXRhKCk7aWYoRC5fY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWR8fEQuX2Rvd25zYW1wbGluZ0VuYWJsZWQpe3ZhciBQPU8ubWFwKGZ1bmN0aW9uKEgsSyl7cmV0dXJuIEt9KTtELl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZCYmKFA9RC5fZmlsdGVyQ3JvcHBlZFJlbmRlcmluZyhJLFApKTtELl9kb3duc2FtcGxpbmdFbmFibGVkJiYKKFA9RC5fZmlsdGVyRG93bnNhbXBsaW5nKEksUCkpO0QuX2NvbGxhcHNlRGVuc2VWZXJ0aWNhbExpbmVzRW5hYmxlZCYmKFA9RC5fZmlsdGVyRGVuc2VMaW5lcyhJLFApKTtCLnNldChJLFtQLm1hcChmdW5jdGlvbihIKXtyZXR1cm4gT1tIXX0pXSl9ZWxzZSBCLnNldChJLFtPXSl9KTtyZXR1cm4gQn07Ri5wcm90b3R5cGUuX2ZpbHRlckNyb3BwZWRSZW5kZXJpbmc9ZnVuY3Rpb24oRCxCKXtmdW5jdGlvbiBJKGJhLG1hKXtyZXR1cm4gdi5NYXRoLmluUmFuZ2UoYmEsMCxPLndpZHRoKCkpJiZ2Lk1hdGguaW5SYW5nZShtYSwwLE8uaGVpZ2h0KCkpfWZvcih2YXIgTz10aGlzLFA9ei5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksSD16LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSxLPUQuZGF0YSgpLE09W10sTD0wO0w8Qi5sZW5ndGg7TCsrKXt2YXIgUj1QKEtbQltMXV0sQltMXSxEKSxVPUgoS1tCW0xdXSxCW0xdLEQpO1I9SShSLFUpO2lmKCFSJiZudWxsIT1CW0wtCjFdJiZudWxsIT1LW0JbTC0xXV0pe1U9UChLW0JbTC0xXV0sQltMLTFdLEQpO3ZhciBZPUgoS1tCW0wtMV1dLEJbTC0xXSxEKTtSPVJ8fEkoVSxZKX1SfHxudWxsPT1CW0wrMV18fG51bGw9PUtbQltMKzFdXXx8KFU9UChLW0JbTCsxXV0sQltMKzFdLEQpLFk9SChLW0JbTCsxXV0sQltMKzFdLEQpLFI9Unx8SShVLFkpKTtSJiZNLnB1c2goQltMXSl9cmV0dXJuIE19O0YucHJvdG90eXBlLl9maWx0ZXJEb3duc2FtcGxpbmc9ZnVuY3Rpb24oRCxCKXtmdW5jdGlvbiBJKGZhLGRhKXt2YXIgbGE9UChPW0JbZmFdXSxCW2ZhXSxEKSxaPUgoT1tCW2ZhXV0sQltmYV0sRCksRmE9UChPW0JbZmErMV1dLEJbZmErMV0sRCk7ZmE9SChPW0JbZmErMV1dLEJbZmErMV0sRCk7cmV0dXJuIEluZmluaXR5PT09ZGE/TWF0aC5mbG9vcihsYSk9PT1NYXRoLmZsb29yKEZhKTpNYXRoLmZsb29yKGZhKT09PU1hdGguZmxvb3IoWisoRmEtbGEpKmRhKX1pZigwPT09Qi5sZW5ndGgpcmV0dXJuW107Zm9yKHZhciBPPQpELmRhdGEoKSxQPXouUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLEg9ei5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSksSz1bQlswXV0sTT0wO008Qi5sZW5ndGgtMTspe3ZhciBMPUJbTV0sUj1QKE9bQltNXV0sQltNXSxEKSxVPUgoT1tCW01dXSxCW01dLEQpLFk9UChPW0JbTSsxXV0sQltNKzFdLEQpLGJhPUgoT1tCW00rMV1dLEJbTSsxXSxEKTtiYT1NYXRoLmZsb29yKFIpPT09TWF0aC5mbG9vcihZKT9JbmZpbml0eTooYmEtVSkvKFktUik7WT1CW01dO1U9SW5maW5pdHk9PT1iYT9VOlI7Uj1ZO2Zvcih2YXIgbWE9VSxhYT0hMDtNPEIubGVuZ3RoLTEmJihhYXx8SShNLGJhKSk7KXtNKys7YWE9ITE7dmFyIGNhPUluZmluaXR5PT09YmE/SChPW0JbTV1dLEJbTV0sRCk6UChPW0JbTV1dLEJbTV0sRCk7Y2E+bWEmJihtYT1jYSxSPUJbTV0pO2NhPFUmJihVPWNhLFk9QltNXSl9YmE9QltNXTtZIT09TCYmSy5wdXNoKFkpO1IhPT1ZJiZSIT09TCYmSy5wdXNoKFIpO2JhIT09CkwmJmJhIT09WSYmYmEhPT1SJiZLLnB1c2goYmEpfXJldHVybiBLfTtGLnByb3RvdHlwZS5fZmlsdGVyRGVuc2VMaW5lcz1mdW5jdGlvbihELEIpe2lmKDA9PT1CLmxlbmd0aClyZXR1cm5bXTt2YXIgST1ELmRhdGEoKSxPPXouUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLFA9ei5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7cmV0dXJuIHRoaXMuX2J1Y2tldEJ5WChELEIsZnVuY3Rpb24oSCl7cmV0dXJuIE8oSVtIXSxILEQpfSxmdW5jdGlvbihIKXtyZXR1cm4gUChJW0hdLEgsRCl9KX07Ri5wcm90b3R5cGUuX2J1Y2tldEJ5WD1mdW5jdGlvbihELEIsSSxPKXt2YXIgUD1bXTtEPUQuZGF0YSgpO2Zvcih2YXIgSD1udWxsLEs9MDtLPD1CLmxlbmd0aDsrK0spe3ZhciBNPUJbS107aWYobnVsbCE9RFtNXSl7dmFyIEw9TWF0aC5mbG9vcihJKE0pKSxSPU8oTSk7bnVsbD09SD9IPW5ldyB2LkJ1Y2tldChNLEwsUik6SC5pc0luQnVja2V0KEwpP0guYWRkVG9CdWNrZXQoUiwKTSk6KFAucHVzaC5hcHBseShQLEguZ2V0VW5pcXVlSW5kaWNlcygpKSxIPW5ldyB2LkJ1Y2tldChNLEwsUikpfX1udWxsIT1IJiZQLnB1c2guYXBwbHkoUCxILmdldFVuaXF1ZUluZGljZXMoKSk7cmV0dXJuIFB9O3JldHVybiBGfShmLlhZUGxvdCk7ZC5MaW5lPWZ9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocSxyKXtmdW5jdGlvbiB0KCl7dGhpcy5jb25zdHJ1Y3Rvcj1xfWZvcih2YXIgdiBpbiByKXIuaGFzT3duUHJvcGVydHkodikmJihxW3ZdPXJbdl0pO3EucHJvdG90eXBlPW51bGw9PT1yP09iamVjdC5jcmVhdGUocik6KHQucHJvdG90eXBlPXIucHJvdG90eXBlLG5ldyB0KX0sbD1mKDEpLGs9ZigyNiksbj1mKDApLHA9WzAsMV07Yz1mdW5jdGlvbihxKXtmdW5jdGlvbiByKCl7dmFyIHQ9cS5jYWxsKHRoaXMpfHx0aGlzO3QuX3JhbmdlPVswLDFdO3QuX2QzU2NhbGU9bC5zY2FsZUJhbmQoKTt0Ll9kM1NjYWxlLnJhbmdlKHApOwp0Ll9kM1RyYW5zZm9ybWF0aW9uU2NhbGU9bC5zY2FsZUxpbmVhcigpO3QuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4ocCk7dC5faW5uZXJQYWRkaW5nPXIuX2NvbnZlcnRUb1Bsb3R0YWJsZUlubmVyUGFkZGluZygpO3QuX291dGVyUGFkZGluZz1yLl9jb252ZXJ0VG9QbG90dGFibGVPdXRlclBhZGRpbmcoKTtyZXR1cm4gdH1nKHIscSk7ci5wcm90b3R5cGUuY2xvbmVXaXRob3V0UHJvdmlkZXJzPWZ1bmN0aW9uKCl7dmFyIHQ9KG5ldyByKS5kb21haW4odGhpcy5kb21haW4oKSkucmFuZ2UodGhpcy5yYW5nZSgpKS5pbm5lclBhZGRpbmcodGhpcy5pbm5lclBhZGRpbmcoKSkub3V0ZXJQYWRkaW5nKHRoaXMub3V0ZXJQYWRkaW5nKCkpO3QuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4odGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbigpKTtyZXR1cm4gdH07ci5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIG4uQXJyYXkudW5pcSh0KX07CnIucHJvdG90eXBlLl9nZXRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbi5BcnJheS51bmlxKHRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKCkpfTtyLnByb3RvdHlwZS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIHEucHJvdG90eXBlLmRvbWFpbi5jYWxsKHRoaXMsdCl9O3IucHJvdG90eXBlLmludmVydFJhbmdlPWZ1bmN0aW9uKCl7dmFyIHQsdj10aGlzO3ZvaWQgMD09PXQmJih0PXRoaXMucmFuZ2UoKSk7dmFyIHk9dGhpcy5fZDNTY2FsZS5iYW5kd2lkdGgoKSx6PXRoaXMuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbih0WzBdKSx4PXRoaXMuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbih0WzFdKTt0PXRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dmFyIEM9dC5tYXAoZnVuY3Rpb24oRil7cmV0dXJuIHYuX2QzU2NhbGUoRikreS8yfSk7ej1sLmJpc2VjdChDLHopO3g9bC5iaXNlY3QoQyx4KTtyZXR1cm4gdC5zbGljZSh6LHgpfTtyLnByb3RvdHlwZS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gcS5wcm90b3R5cGUucmFuZ2UuY2FsbCh0aGlzLAp0KX07ci5fY29udmVydFRvUGxvdHRhYmxlSW5uZXJQYWRkaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIDEvLjctMX07ci5fY29udmVydFRvUGxvdHRhYmxlT3V0ZXJQYWRkaW5nPWZ1bmN0aW9uKCl7cmV0dXJuLjUvLjd9O3IucHJvdG90eXBlLl9zZXRCYW5kcz1mdW5jdGlvbigpe3ZhciB0PTEtMS8oMSt0aGlzLmlubmVyUGFkZGluZygpKSx2PXRoaXMub3V0ZXJQYWRkaW5nKCkvKDErdGhpcy5pbm5lclBhZGRpbmcoKSk7dGhpcy5fZDNTY2FsZS5wYWRkaW5nSW5uZXIodCk7dGhpcy5fZDNTY2FsZS5wYWRkaW5nT3V0ZXIodil9O3IucHJvdG90eXBlLnJhbmdlQmFuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZXNjYWxlQmFuZCh0aGlzLl9kM1NjYWxlLmJhbmR3aWR0aCgpKX07ci5wcm90b3R5cGUuc3RlcFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc2NhbGVCYW5kKHRoaXMuX2QzU2NhbGUuYmFuZHdpZHRoKCkqKDErdGhpcy5pbm5lclBhZGRpbmcoKSkpfTtyLnByb3RvdHlwZS50aWNrcz0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21haW4oKX07ci5wcm90b3R5cGUuaW5uZXJQYWRkaW5nPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX2lubmVyUGFkZGluZzt0aGlzLl9pbm5lclBhZGRpbmc9dDt0aGlzLnJhbmdlKHRoaXMucmFuZ2UoKSk7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUub3V0ZXJQYWRkaW5nPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX291dGVyUGFkZGluZzt0aGlzLl9vdXRlclBhZGRpbmc9dDt0aGlzLnJhbmdlKHRoaXMucmFuZ2UoKSk7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCl7dD10aGlzLl9kM1NjYWxlKHQpK3RoaXMuX2QzU2NhbGUuYmFuZHdpZHRoKCkvMjtyZXR1cm4gdGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlKHQpfTtyLnByb3RvdHlwZS56b29tPWZ1bmN0aW9uKHQsdil7dmFyIHk9dGhpczsKdGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUucmFuZ2UoKS5tYXAoZnVuY3Rpb24oeil7cmV0dXJuIHkuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5pbnZlcnQoay56b29tT3V0KHosdCx2KSl9KSk7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKX07ci5wcm90b3R5cGUucGFuPWZ1bmN0aW9uKHQpe3ZhciB2PXRoaXM7dGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUucmFuZ2UoKS5tYXAoZnVuY3Rpb24oeSl7cmV0dXJuIHYuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5pbnZlcnQoeSt0KX0pKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfTtyLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUodCl9O3IucHJvdG90eXBlLmludmVydGVkVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5pbnZlcnQodCl9OwpyLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD1mdW5jdGlvbigpe3JldHVybiBwfTtyLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKCl9O3IucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKHQpe3RoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4odCk7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKX07ci5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX07ci5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzU2NhbGUuZG9tYWluKHQpO3RoaXMuX3NldEJhbmRzKCk7cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYW5nZX07CnIucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbih0KXt0aGlzLl9yYW5nZT10O3RoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5yYW5nZSh0KTt0aGlzLl9zZXRCYW5kcygpfTtyLnByb3RvdHlwZS5fcmVzY2FsZUJhbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZSh0KS10aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUoMCkpfTtyZXR1cm4gcn0oZigxNykuU2NhbGUpO2QuQ2F0ZWdvcnk9Y30sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcoeCl7dHJ5e3ZhciBDPXgubm9kZSgpLmdldEJCb3goKX1jYXRjaChGKXtDPXt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjB9fXJldHVybiBDfWZ1bmN0aW9uIGwoeCl7aWYoIm51bWJlciI9PT10eXBlb2YgeClyZXR1cm57bWluOngsbWF4Onh9O2lmKHggaW5zdGFuY2VvZiBPYmplY3QmJiJtaW4iaW4geCYmIm1heCJpbiB4KXJldHVybiB4O3Rocm93IEVycm9yKCJpbnB1dCAnIit4KyInIGNhbid0IGJlIHBhcnNlZCBhcyBhbiBSYW5nZSIpOwp9ZnVuY3Rpb24gayh4LEMpe3g9eC5nZXRQcm9wZXJ0eVZhbHVlKEMpO3JldHVybiBwYXJzZUZsb2F0KHgpfHwwfWZ1bmN0aW9uIG4oeCl7aWYobnVsbD09eHx8Im5vbmUiPT09eClyZXR1cm4gbnVsbDt4PXgubWF0Y2goeSk7aWYobnVsbD09eHx8Mj54Lmxlbmd0aClyZXR1cm4gbnVsbDt4PXhbMV0uc3BsaXQoeikubWFwKGZ1bmN0aW9uKEMpe3JldHVybiBwYXJzZUZsb2F0KEMpfSk7cmV0dXJuIDYhPXgubGVuZ3RoP251bGw6eH12YXIgcD1mKDEpLHE9TWF0aDtkLmNvbnRhaW5zPWZ1bmN0aW9uKHgsQyl7Zm9yKDtudWxsIT1DJiZDIT09eDspQz1DLnBhcmVudE5vZGU7cmV0dXJuIEM9PT14fTtkLmVsZW1lbnRCQm94PWc7ZC5lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oeCl7cmV0dXJuIHggaW5zdGFuY2VvZiBTVkdFbGVtZW50P2cocC5zZWxlY3QoeCkpOnggaW5zdGFuY2VvZiBIVE1MRWxlbWVudD8oeD14LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHt4OngubGVmdCx5OngudG9wLHdpZHRoOngud2lkdGgsCmhlaWdodDp4LmhlaWdodH0pOnt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjB9fTtkLlNDUkVFTl9SRUZSRVNIX1JBVEVfTUlMTElTRUNPTkRTPTFFMy82MDtkLnJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsPWZ1bmN0aW9uKHgpe251bGwhPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh4KTpzZXRUaW1lb3V0KHgsZC5TQ1JFRU5fUkVGUkVTSF9SQVRFX01JTExJU0VDT05EUyl9O2QuZWxlbWVudFdpZHRoPWZ1bmN0aW9uKHgpe3g9eCBpbnN0YW5jZW9mIHAuc2VsZWN0aW9uP3gubm9kZSgpOng7eD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh4KTtyZXR1cm4gayh4LCJ3aWR0aCIpK2soeCwicGFkZGluZy1sZWZ0Iikrayh4LCJwYWRkaW5nLXJpZ2h0Iikrayh4LCJib3JkZXItbGVmdC13aWR0aCIpK2soeCwiYm9yZGVyLXJpZ2h0LXdpZHRoIil9O2QuZWxlbWVudEhlaWdodD1mdW5jdGlvbih4KXt4PXggaW5zdGFuY2VvZiBwLnNlbGVjdGlvbj8KeC5ub2RlKCk6eDt4PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHgpO3JldHVybiBrKHgsImhlaWdodCIpK2soeCwicGFkZGluZy10b3AiKStrKHgsInBhZGRpbmctYm90dG9tIikrayh4LCJib3JkZXItdG9wLXdpZHRoIikrayh4LCJib3JkZXItYm90dG9tLXdpZHRoIil9O3ZhciByPS90cmFuc2xhdGVccypcKFxzKigoPzpbLStdP1swLTldKlwuP1swLTldKykpKD86KD86KD86XHMrLD9ccyopfCg/OixccyopKSgoPzpbLStdP1swLTldKlwuP1swLTldKykpKT9ccypcKS8sdD0vcm90YXRlXHMqXChccyooKD86Wy0rXT9bMC05XSpcLj9bMC05XSspKVxzKlwpLyx2PS9zY2FsZVxzKlwoXHMqKCg/OlstK10/WzAtOV0qXC4/WzAtOV0rKSkoPzooPzooPzpccyssP1xzKil8KD86LFxzKikpKCg/OlstK10/WzAtOV0qXC4/WzAtOV0rKSkpP1xzKlwpLztkLmdldFRyYW5zbGF0ZVZhbHVlcz1mdW5jdGlvbih4KXt4PXIuZXhlYyh4LmF0dHIoInRyYW5zZm9ybSIpKTtpZihudWxsIT14KXt2YXIgQz0KeFsyXTtyZXR1cm5bK3hbMV0sKyh2b2lkIDA9PT1DPzA6QyldfXJldHVyblswLDBdfTtkLmdldFJvdGF0ZT1mdW5jdGlvbih4KXt4PXQuZXhlYyh4LmF0dHIoInRyYW5zZm9ybSIpKTtyZXR1cm4gbnVsbCE9eD8reFsxXTowfTtkLmdldFNjYWxlVmFsdWVzPWZ1bmN0aW9uKHgpe3ZhciBDPXYuZXhlYyh4LmF0dHIoInRyYW5zZm9ybSIpKTtyZXR1cm4gbnVsbCE9Qz8oeD1DWzFdLEM9Q1syXSxbK3gsbnVsbD09Qz8reDorQ10pOlswLDBdfTtkLmNsaWVudFJlY3RzT3ZlcmxhcD1mdW5jdGlvbih4LEMpe3JldHVybiBxLmZsb29yKHgucmlnaHQpPD1xLmNlaWwoQy5sZWZ0KXx8cS5jZWlsKHgubGVmdCk+PXEuZmxvb3IoQy5yaWdodCl8fHEuZmxvb3IoeC5ib3R0b20pPD1xLmNlaWwoQy50b3ApfHxxLmNlaWwoeC50b3ApPj1xLmZsb29yKEMuYm90dG9tKT8hMTohMH07ZC5leHBhbmRSZWN0PWZ1bmN0aW9uKHgsQyl7cmV0dXJue2xlZnQ6eC5sZWZ0LUMsdG9wOngudG9wLUMscmlnaHQ6eC5yaWdodCsKQyxib3R0b206eC5ib3R0b20rQyx3aWR0aDp4LndpZHRoKzIqQyxoZWlnaHQ6eC5oZWlnaHQrMipDfX07ZC5jbGllbnRSZWN0SW5zaWRlPWZ1bmN0aW9uKHgsQyl7cmV0dXJuIHEuZmxvb3IoQy5sZWZ0KTw9cS5jZWlsKHgubGVmdCkmJnEuZmxvb3IoQy50b3ApPD1xLmNlaWwoeC50b3ApJiZxLmZsb29yKHgucmlnaHQpPD1xLmNlaWwoQy5yaWdodCkmJnEuZmxvb3IoeC5ib3R0b20pPD1xLmNlaWwoQy5ib3R0b20pfTtkLmludGVyc2VjdHNCQm94PWZ1bmN0aW9uKHgsQyxGLEQpe3ZvaWQgMD09PUQmJihEPS41KTt4PWwoeCk7Qz1sKEMpO3JldHVybiBGLngrRi53aWR0aD49eC5taW4tRCYmRi54PD14Lm1heCtEJiZGLnkrRi5oZWlnaHQ+PUMubWluLUQmJkYueTw9Qy5tYXgrRH07ZC5nZXRIdG1sRWxlbWVudEFuY2VzdG9ycz1mdW5jdGlvbih4KXtmb3IodmFyIEM9W107eCYmeCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50OylDLnB1c2goeCkseD14LnBhcmVudEVsZW1lbnQ7cmV0dXJuIEN9OwpkLmdldEVsZW1lbnRUcmFuc2Zvcm09ZnVuY3Rpb24oeCl7eD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh4LG51bGwpO3g9eC5nZXRQcm9wZXJ0eVZhbHVlKCItd2Via2l0LXRyYW5zZm9ybSIpfHx4LmdldFByb3BlcnR5VmFsdWUoIi1tb3otdHJhbnNmb3JtIil8fHguZ2V0UHJvcGVydHlWYWx1ZSgiLW1zLXRyYW5zZm9ybSIpfHx4LmdldFByb3BlcnR5VmFsdWUoIi1vLXRyYW5zZm9ybSIpfHx4LmdldFByb3BlcnR5VmFsdWUoInRyYW5zZm9ybSIpO3JldHVybiBuKHgpfTt2YXIgeT0vXm1hdHJpeFwoKFteKV0rKVwpJC8sej0vWywgXSsvfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyh0LHYpe3JldHVyblt0WzBdKnZbMF0rdFsyXSp2WzFdLHRbMV0qdlswXSt0WzNdKnZbMV0sdFswXSp2WzJdK3RbMl0qdlszXSx0WzFdKnZbMl0rdFszXSp2WzNdLHRbMF0qdls0XSt0WzJdKnZbNV0rdFs0XSx0WzFdKnZbNF0rdFszXSp2WzVdK3RbNV1dfWZ1bmN0aW9uIGwodCx2KXtyZXR1cm5bdFswXSwKdFsxXSx0WzJdLHRbM10sdFswXSp2WzBdK3RbMl0qdlsxXSt0WzRdLHRbMV0qdlswXSt0WzNdKnZbMV0rdFs1XV19ZnVuY3Rpb24gayh0KXt2YXIgdj10WzBdKnRbM10tdFsxXSp0WzJdO2lmKDA9PT12KXRocm93IEVycm9yKCJzaW5ndWxhciBtYXRyaXgiKTt2PTEvdjtyZXR1cm5bdip0WzNdLHYqLXRbMV0sdiotdFsyXSx2KnRbMF0sdiooLXRbM10qdFs0XSt0WzJdKnRbNV0pLHYqKHRbMV0qdFs0XSstdFswXSp0WzVdKV19dmFyIG49ZigxKSxwPWYoNTUpLHE9TWF0aCxyPVsxLDAsMCwxLDAsMF07ZC5pblJhbmdlPWZ1bmN0aW9uKHQsdix5KXtyZXR1cm4gcS5taW4odix5KTw9dCYmdDw9cS5tYXgodix5KX07ZC5jbGFtcD1mdW5jdGlvbih0LHYseSl7cmV0dXJuIHEubWluKHEubWF4KHYsdCkseSl9O2QubWF4PWZ1bmN0aW9uKHQsdix5KXt2YXIgej0iZnVuY3Rpb24iPT09dHlwZW9mIHY/djpudWxsO3Y9bnVsbD09ej92Onk7dD1udWxsPT16P24ubWF4KHQpOm4ubWF4KHQseik7cmV0dXJuIHZvaWQgMCE9PQp0P3Q6dn07ZC5taW49ZnVuY3Rpb24odCx2LHkpe3ZhciB6PSJmdW5jdGlvbiI9PT10eXBlb2Ygdj92Om51bGw7dj1udWxsPT16P3Y6eTt0PW51bGw9PXo/bi5taW4odCk6bi5taW4odCx6KTtyZXR1cm4gdm9pZCAwIT09dD90OnZ9O2QuaXNOYU49ZnVuY3Rpb24odCl7cmV0dXJuIHQhPT10fTtkLmlzVmFsaWROdW1iZXI9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PT10eXBlb2YgdCYmMT50LXR9O2QucmFuZ2U9ZnVuY3Rpb24odCx2LHkpe3ZvaWQgMD09PXkmJih5PTEpO2lmKDA9PT15KXRocm93IEVycm9yKCJzdGVwIGNhbm5vdCBiZSAwIik7dj1xLm1heChxLmNlaWwoKHYtdCkveSksMCk7Zm9yKHZhciB6PVtdLHg9MDt4PHY7Kyt4KXpbeF09dCt5Kng7cmV0dXJuIHp9O2QuZGlzdGFuY2VTcXVhcmVkPWZ1bmN0aW9uKHQsdil7cmV0dXJuIHEucG93KHYueS10LnksMikrcS5wb3codi54LXQueCwyKX07ZC5kZWdyZWVzVG9SYWRpYW5zPWZ1bmN0aW9uKHQpe3JldHVybiB0LzM2MCoKcS5QSSoyfTtkLndpdGhpbj1mdW5jdGlvbih0LHYpe3JldHVybiB2LnRvcExlZnQueDw9dC54JiZ2LmJvdHRvbVJpZ2h0Lng+PXQueCYmdi50b3BMZWZ0Lnk8PXQueSYmdi5ib3R0b21SaWdodC55Pj10Lnl9O2QuYm91bmRzSW50ZXJzZWN0cz1mdW5jdGlvbih0LHYseSx6LHgsQyl7cmV0dXJuIHQ8PTAreCYmMDw9dCt5JiZ2PD0wK0MmJjA8PXYren07ZC5nZXRDdW11bGF0aXZlVHJhbnNmb3JtPWZ1bmN0aW9uKHQpe3Q9cC5nZXRIdG1sRWxlbWVudEFuY2VzdG9ycyh0KTtmb3IodmFyIHY9cix5PW51bGwsej0wO3o8dC5sZW5ndGg7eisrKXt2YXIgeD10W3pdLEM9cC5nZXRFbGVtZW50VHJhbnNmb3JtKHgpO2lmKG51bGwhPUMpe3ZhciBGPXguY2xpZW50V2lkdGgvMixEPXguY2xpZW50SGVpZ2h0LzI7dj1sKHYsW0YsRF0pO3Y9Zyh2LGsoQykpO3Y9bCh2LFstRiwtRF0pfUM9eC5zY3JvbGxMZWZ0O0Y9eC5zY3JvbGxUb3A7aWYobnVsbD09PXl8fHg9PT15KUMtPXgub2Zmc2V0TGVmdCt4LmNsaWVudExlZnQsCkYtPXgub2Zmc2V0VG9wK3guY2xpZW50VG9wLHk9eC5vZmZzZXRQYXJlbnQ7dj1sKHYsW0MsRl0pfXJldHVybiB2fTtkLm11bHRpcGx5TWF0cml4PWc7ZC5wcmVtdWx0aXBseVRyYW5zbGF0ZT1mdW5jdGlvbih0LHYpe3JldHVyblt2WzBdLHZbMV0sdlsyXSx2WzNdLHZbNF0rdFswXSx2WzVdK3RbMV1dfTtkLm11bHRpcGx5VHJhbnNsYXRlPWw7ZC5pbnZlcnRNYXRyaXg9aztkLmFwcGx5VHJhbnNmb3JtPWZ1bmN0aW9uKHQsdil7cmV0dXJue3g6dFswXSp2LngrdFsyXSp2LnkrdFs0XSx5OnRbMV0qdi54K3RbM10qdi55K3RbNV19fX0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPW5ldyAoZigxMTQpLlNwbGl0U3RyYXRlZ3lMaW5lYXIpO2M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHAscSl7dm9pZCAwPT09cCYmKHA9NSk7dm9pZCAwPT09cSYmKHE9Zyk7dGhpcy5tYXhOb2RlQ2hpbGRyZW49cDt0aGlzLnNwbGl0U3RyYXRlZ3k9cTt0aGlzLnJvb3Q9bmV3IGwoITApO3RoaXMuc2l6ZT0wfW4ucHJvdG90eXBlLmdldFJvb3Q9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm9vdH07bi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnJvb3Q9bmV3IGwoITApO3RoaXMuc2l6ZT0wfTtuLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24ocCxxKXtmb3IodmFyIHI9dGhpcy5yb290OyFyLmxlYWY7KXI9ci5zdWJ0cmVlKHApO3A9bC52YWx1ZU5vZGUocCxxKTtyLmluc2VydChwKTtmb3IodGhpcy5zaXplKz0xO3Iub3ZlcmZsb3codGhpcy5tYXhOb2RlQ2hpbGRyZW4pOylyPXIuc3BsaXQodGhpcy5zcGxpdFN0cmF0ZWd5KSxudWxsPT1yLnBhcmVudCYmKHRoaXMucm9vdD1yKX07bi5wcm90b3R5cGUubG9jYXRlPWZ1bmN0aW9uKHApe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKHEpe3JldHVybiBxLmNvbnRhaW5zKHApfSl9O24ucHJvdG90eXBlLmludGVyc2VjdD1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5xdWVyeShmdW5jdGlvbihxKXtyZXR1cm4gay5pc0JvdW5kc092ZXJsYXBCb3VuZHMocSxwKX0pfTtuLnByb3RvdHlwZS5pbnRlcnNlY3RYPQpmdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5xdWVyeShmdW5jdGlvbihxKXtyZXR1cm4gay5pc0JvdW5kc092ZXJsYXBYKHEscCl9KX07bi5wcm90b3R5cGUuaW50ZXJzZWN0WT1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5xdWVyeShmdW5jdGlvbihxKXtyZXR1cm4gay5pc0JvdW5kc092ZXJsYXBZKHEscCl9KX07bi5wcm90b3R5cGUucXVlcnk9ZnVuY3Rpb24ocCl7dmFyIHE9W107aWYobnVsbCE9dGhpcy5yb290LmJvdW5kcyYmIXAodGhpcy5yb290LmJvdW5kcykpcmV0dXJuIHE7Zm9yKHZhciByPVt0aGlzLnJvb3RdOzA8ci5sZW5ndGg7KWZvcih2YXIgdD1yLnNoaWZ0KCksdj0wO3Y8dC5lbnRyaWVzLmxlbmd0aDt2Kyspe3ZhciB5PXQuZW50cmllc1t2XTtwKHkuYm91bmRzKSYmKHQubGVhZj9xLnB1c2goeS52YWx1ZSk6ci5wdXNoKHkpKX1yZXR1cm4gcX07cmV0dXJuIG59KCk7ZC5SVHJlZT1jO3ZhciBsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihwKXt0aGlzLmxlYWY9cDt0aGlzLmJvdW5kcz0KbnVsbDt0aGlzLmVudHJpZXM9W107dGhpcy52YWx1ZT10aGlzLnBhcmVudD1udWxsfW4udmFsdWVOb2RlPWZ1bmN0aW9uKHAscSl7dmFyIHI9bmV3IG4oITApO3IuYm91bmRzPXA7ci52YWx1ZT1xO3JldHVybiByfTtuLnByb3RvdHlwZS5vdmVyZmxvdz1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5lbnRyaWVzLmxlbmd0aD5wfTtuLnByb3RvdHlwZS5pbnNlcnQ9ZnVuY3Rpb24ocCl7dGhpcy5lbnRyaWVzLnB1c2gocCk7cC5wYXJlbnQ9dGhpcztmb3IodmFyIHE9dGhpcztudWxsIT1xOylxLmJvdW5kcz1rLnVuaW9uQWxsKFtxLmJvdW5kcyxwLmJvdW5kc10pLHE9cS5wYXJlbnR9O24ucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihwKXtwPXRoaXMuZW50cmllcy5pbmRleE9mKHApO2lmKDA8PXApZm9yKHRoaXMuZW50cmllcy5zcGxpY2UocCwxKSxwPXRoaXM7bnVsbCE9cDspcC5ib3VuZHM9ay51bmlvbkFsbChwLmVudHJpZXMubWFwKGZ1bmN0aW9uKHEpe3JldHVybiBxLmJvdW5kc30pKSwKcD1wLnBhcmVudDtyZXR1cm4gdGhpc307bi5wcm90b3R5cGUuc3VidHJlZT1mdW5jdGlvbihwKXtmb3IodmFyIHE9bnVsbCxyPTA7cjx0aGlzLmVudHJpZXMubGVuZ3RoO3IrKyl7dmFyIHQ9dGhpcy5lbnRyaWVzW3JdLHY9dC51bmlvbkFyZWFEaWZmZXJlbmNlKHApO2lmKEluZmluaXR5PnZ8fEluZmluaXR5PT09diYmbnVsbCE9cSYmdC5lbnRyaWVzLmxlbmd0aDxxLmVudHJpZXMubGVuZ3RoKXE9dH1yZXR1cm4gcX07bi5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24ocCl7bnVsbCE9dGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJlbW92ZSh0aGlzKTt2YXIgcT1bbmV3IG4odGhpcy5sZWFmKSxuZXcgbih0aGlzLmxlYWYpXTtwLnNwbGl0KHRoaXMuZW50cmllcyxxKTtwPW51bGwhPXRoaXMucGFyZW50P3RoaXMucGFyZW50Om5ldyBuKCExKTtwLmluc2VydChxWzBdKTtwLmluc2VydChxWzFdKTtyZXR1cm4gcH07bi5wcm90b3R5cGUudW5pb25BcmVhRGlmZmVyZW5jZT1mdW5jdGlvbihwKXtyZXR1cm4gTWF0aC5hYnMoay51bmlvbih0aGlzLmJvdW5kcywKcCkuYXJlYSgpLXRoaXMuYm91bmRzLmFyZWEoKSl9O24ucHJvdG90eXBlLm1heERlcHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVhZj8xOjErdGhpcy5lbnRyaWVzLm1hcChmdW5jdGlvbihwKXtyZXR1cm4gcC5tYXhEZXB0aCgpfSkucmVkdWNlKGZ1bmN0aW9uKHAscSl7cmV0dXJuIE1hdGgubWF4KHAscSl9KX07cmV0dXJuIG59KCk7ZC5SVHJlZU5vZGU9bDt2YXIgaz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4ocCxxLHIsdCl7dGhpcy54bD1wO3RoaXMueWw9cTt0aGlzLnhoPXI7dGhpcy55aD10O3RoaXMud2lkdGg9dGhpcy54aC10aGlzLnhsO3RoaXMuaGVpZ2h0PXRoaXMueWgtdGhpcy55bH1uLnh5d2g9ZnVuY3Rpb24ocCxxLHIsdCl7cmV0dXJuIG5ldyBuKHAscSxwK3IscSt0KX07bi5lbnRpdHlCb3VuZHM9ZnVuY3Rpb24ocCl7cmV0dXJuIG5ldyBuKHAueCxwLnkscC54K3Aud2lkdGgscC55K3AuaGVpZ2h0KX07bi5ib3VuZHM9ZnVuY3Rpb24ocCl7cmV0dXJuIG4ucG9pbnRQYWlyKHAudG9wTGVmdCwKcC5ib3R0b21SaWdodCl9O24ucG9pbnRQYWlyPWZ1bmN0aW9uKHAscSl7cmV0dXJuIG5ldyBuKE1hdGgubWluKHAueCxxLngpLE1hdGgubWluKHAueSxxLnkpLE1hdGgubWF4KHAueCxxLngpLE1hdGgubWF4KHAueSxxLnkpKX07bi5wb2ludHM9ZnVuY3Rpb24ocCl7aWYoMj5wLmxlbmd0aCl0aHJvdyBFcnJvcigibmVlZCBhdCBsZWFzdCAyIHBvaW50cyB0byBjcmVhdGUgYm91bmRzIik7dmFyIHE9cC5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIHIueH0pO3A9cC5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIHIueX0pO3JldHVybiBuZXcgbihxLnJlZHVjZShmdW5jdGlvbihyLHQpe3JldHVybiBNYXRoLm1pbihyLHQpfSkscC5yZWR1Y2UoZnVuY3Rpb24ocix0KXtyZXR1cm4gTWF0aC5taW4ocix0KX0pLHEucmVkdWNlKGZ1bmN0aW9uKHIsdCl7cmV0dXJuIE1hdGgubWF4KHIsdCl9KSxwLnJlZHVjZShmdW5jdGlvbihyLHQpe3JldHVybiBNYXRoLm1heChyLHQpfSkpfTtuLnVuaW9uPWZ1bmN0aW9uKHAsCnEpe3JldHVybiBuZXcgbihNYXRoLm1pbihwLnhsLHEueGwpLE1hdGgubWluKHAueWwscS55bCksTWF0aC5tYXgocC54aCxxLnhoKSxNYXRoLm1heChwLnloLHEueWgpKX07bi51bmlvbkFsbD1mdW5jdGlvbihwKXtwPXAuZmlsdGVyKGZ1bmN0aW9uKHEpe3JldHVybiBudWxsIT1xfSk7cmV0dXJuIDA9PT1wLmxlbmd0aD9udWxsOnAucmVkdWNlKGZ1bmN0aW9uKHEscil7cmV0dXJuIG4udW5pb24ocSxyKX0pfTtuLmlzQm91bmRzT3ZlcmxhcEJvdW5kcz1mdW5jdGlvbihwLHEpe3JldHVybiBuLmlzQm91bmRzT3ZlcmxhcFgocCxxKSYmbi5pc0JvdW5kc092ZXJsYXBZKHAscSl9O24uaXNCb3VuZHNPdmVybGFwWD1mdW5jdGlvbihwLHEpe3JldHVybiEocC54aDxxLnhsKSYmIShwLnhsPnEueGgpfTtuLmlzQm91bmRzT3ZlcmxhcFk9ZnVuY3Rpb24ocCxxKXtyZXR1cm4hKHAueWg8cS55bCkmJiEocC55bD5xLnloKX07bi5wcm90b3R5cGUuYXJlYT1mdW5jdGlvbigpe251bGw9PXRoaXMuYXJlYUNhY2hlZCYmCih0aGlzLmFyZWFDYWNoZWQ9KHRoaXMueGgtdGhpcy54bCkqKHRoaXMueWgtdGhpcy55bCkpO3JldHVybiB0aGlzLmFyZWFDYWNoZWR9O24ucHJvdG90eXBlLmNvbnRhaW5zPWZ1bmN0aW9uKHApe3JldHVybiB0aGlzLnhsPD1wLngmJnRoaXMueGg+PXAueCYmdGhpcy55bDw9cC55JiZ0aGlzLnloPj1wLnl9O3JldHVybiBufSgpO2QuUlRyZWVCb3VuZHM9a30sZnVuY3Rpb24oYyxkKXtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZigpeyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LlNldD90aGlzLl9lczZTZXQ9bmV3IHdpbmRvdy5TZXQ6dGhpcy5fdmFsdWVzPVtdO3RoaXMuc2l6ZT0wfWYucHJvdG90eXBlLmFkZD1mdW5jdGlvbihnKXtpZihudWxsIT10aGlzLl9lczZTZXQpcmV0dXJuIHRoaXMuX2VzNlNldC5hZGQoZyksdGhpcy5zaXplPXRoaXMuX2VzNlNldC5zaXplLHRoaXM7dGhpcy5oYXMoZyl8fCh0aGlzLl92YWx1ZXMucHVzaChnKSx0aGlzLnNpemU9dGhpcy5fdmFsdWVzLmxlbmd0aCk7CnJldHVybiB0aGlzfTtmLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24oZyl7aWYobnVsbCE9dGhpcy5fZXM2U2V0KXJldHVybiBnPXRoaXMuX2VzNlNldC5kZWxldGUoZyksdGhpcy5zaXplPXRoaXMuX2VzNlNldC5zaXplLGc7Zz10aGlzLl92YWx1ZXMuaW5kZXhPZihnKTtyZXR1cm4tMSE9PWc/KHRoaXMuX3ZhbHVlcy5zcGxpY2UoZywxKSx0aGlzLnNpemU9dGhpcy5fdmFsdWVzLmxlbmd0aCwhMCk6ITF9O2YucHJvdG90eXBlLmhhcz1mdW5jdGlvbihnKXtyZXR1cm4gbnVsbCE9dGhpcy5fZXM2U2V0P3RoaXMuX2VzNlNldC5oYXMoZyk6LTEhPT10aGlzLl92YWx1ZXMuaW5kZXhPZihnKX07Zi5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihnLGwpe3ZhciBrPXRoaXM7bnVsbCE9dGhpcy5fZXM2U2V0P3RoaXMuX2VzNlNldC5mb3JFYWNoKGZ1bmN0aW9uKG4scCl7cmV0dXJuIGcuY2FsbChsLG4scCxrKX0sbCk6dGhpcy5fdmFsdWVzLmZvckVhY2goZnVuY3Rpb24obil7Zy5jYWxsKGwsCm4sbixrKX0pfTtyZXR1cm4gZn0oKTtkLlNldD1jfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhsKXtmb3IodmFyIGsgaW4gbClkLmhhc093blByb3BlcnR5KGspfHwoZFtrXT1sW2tdKX1nKGYoMTMxKSk7ZyhmKDEzMCkpfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGssbil7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9a31mb3IodmFyIHEgaW4gbiluLmhhc093blByb3BlcnR5KHEpJiYoa1txXT1uW3FdKTtrLnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihwLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgcCl9LGw9ZigyMSk7Yz1mdW5jdGlvbihrKXtmdW5jdGlvbiBuKHAscSl7dmFyIHI9ay5jYWxsKHRoaXMscCxxKXx8dGhpcztyLmNhY2hlPW5ldyBsLkNhY2hlKGZ1bmN0aW9uKHQpe3JldHVybiByLl9tZWFzdXJlQ2hhcmFjdGVyTm90RnJvbUNhY2hlKHQpfSk7cmV0dXJuIHJ9ZyhuLGspO24ucHJvdG90eXBlLl9tZWFzdXJlQ2hhcmFjdGVyTm90RnJvbUNhY2hlPQpmdW5jdGlvbihwKXtyZXR1cm4gay5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXIuY2FsbCh0aGlzLHApfTtuLnByb3RvdHlwZS5fbWVhc3VyZUNoYXJhY3Rlcj1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5jYWNoZS5nZXQocCl9O24ucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5jYWNoZS5jbGVhcigpfTtyZXR1cm4gbn0oZig2MSkuQ2hhcmFjdGVyTWVhc3VyZXIpO2QuQ2FjaGVDaGFyYWN0ZXJNZWFzdXJlcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwsayl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIHAgaW4gaylrLmhhc093blByb3BlcnR5KHApJiYobFtwXT1rW3BdKTtsLnByb3RvdHlwZT1udWxsPT09az9PYmplY3QuY3JlYXRlKGspOihuLnByb3RvdHlwZT1rLnByb3RvdHlwZSxuZXcgbil9O2M9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gaygpe3JldHVybiBsLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8CnRoaXN9ZyhrLGwpO2sucHJvdG90eXBlLl9tZWFzdXJlQ2hhcmFjdGVyPWZ1bmN0aW9uKG4pe3JldHVybiBsLnByb3RvdHlwZS5fbWVhc3VyZUxpbmUuY2FsbCh0aGlzLG4pfTtrLnByb3RvdHlwZS5fbWVhc3VyZUxpbmU9ZnVuY3Rpb24obil7dmFyIHA9dGhpcztuPW4uc3BsaXQoIiIpLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gcC5fbWVhc3VyZUNoYXJhY3RlcihxKX0pO3JldHVybntoZWlnaHQ6bi5yZWR1Y2UoZnVuY3Rpb24ocSxyKXtyZXR1cm4gTWF0aC5tYXgocSxyLmhlaWdodCl9LDApLHdpZHRoOm4ucmVkdWNlKGZ1bmN0aW9uKHEscil7cmV0dXJuIHErci53aWR0aH0sMCl9fTtyZXR1cm4ga30oZig2MykuTWVhc3VyZXIpO2QuQ2hhcmFjdGVyTWVhc3VyZXI9Y30sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcobCl7Zm9yKHZhciBrIGluIGwpZC5oYXNPd25Qcm9wZXJ0eShrKXx8KGRba109bFtrXSl9ZyhmKDM2KSk7ZyhmKDYwKSk7ZyhmKDEzMikpO2coZig2MSkpO2coZig2MykpfSwKZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihrLG4pe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPWt9Zm9yKHZhciBxIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShxKSYmKGtbcV09bltxXSk7ay5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKToocC5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IHApfSxsPWYoMzYpO2M9ZnVuY3Rpb24oayl7ZnVuY3Rpb24gbihwLHEpe3ZvaWQgMD09PXEmJihxPSExKTtwPWsuY2FsbCh0aGlzLHApfHx0aGlzO3AudXNlR3VhcmRzPXE7cmV0dXJuIHB9ZyhuLGspO24ucHJvdG90eXBlLl9hZGRHdWFyZHM9ZnVuY3Rpb24ocCl7cmV0dXJuIGwuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVCtwK2wuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVH07bi5wcm90b3R5cGUuX21lYXN1cmVMaW5lPWZ1bmN0aW9uKHApe3ZhciBxO3ZvaWQgMD09PXEmJihxPSExKTtxPXRoaXMudXNlR3VhcmRzfHwKcXx8L15bXHQgXSQvLnRlc3QocCk7cD1rLnByb3RvdHlwZS5tZWFzdXJlLmNhbGwodGhpcyxxP3RoaXMuX2FkZEd1YXJkcyhwKTpwKTtwLndpZHRoLT1xPzIqdGhpcy5nZXRHdWFyZFdpZHRoKCk6MDtyZXR1cm4gcH07bi5wcm90b3R5cGUubWVhc3VyZT1mdW5jdGlvbihwKXt2YXIgcT10aGlzO3ZvaWQgMD09PXAmJihwPWwuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVCk7aWYoIiI9PT1wLnRyaW0oKSlyZXR1cm57d2lkdGg6MCxoZWlnaHQ6MH07cD1wLnRyaW0oKS5zcGxpdCgiXG4iKS5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIHEuX21lYXN1cmVMaW5lKHIpfSk7cmV0dXJue2hlaWdodDpwLnJlZHVjZShmdW5jdGlvbihyLHQpe3JldHVybiByK3QuaGVpZ2h0fSwwKSx3aWR0aDpwLnJlZHVjZShmdW5jdGlvbihyLHQpe3JldHVybiBNYXRoLm1heChyLHQud2lkdGgpfSwwKX19O24ucHJvdG90eXBlLmdldEd1YXJkV2lkdGg9ZnVuY3Rpb24oKXtudWxsPT10aGlzLmd1YXJkV2lkdGgmJgoodGhpcy5ndWFyZFdpZHRoPWsucHJvdG90eXBlLm1lYXN1cmUuY2FsbCh0aGlzKS53aWR0aCk7cmV0dXJuIHRoaXMuZ3VhcmRXaWR0aH07cmV0dXJuIG59KGwuQWJzdHJhY3RNZWFzdXJlcik7ZC5NZWFzdXJlcj1jfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhsKXtmb3IodmFyIGsgaW4gbClkLmhhc093blByb3BlcnR5KGspfHwoZFtrXT1sW2tdKX1nKGYoMTM4KSk7ZyhmKDY1KSl9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz1mKDIxKTtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbCgpe3RoaXMubWF4TGluZXMoSW5maW5pdHkpO3RoaXMudGV4dFRyaW1taW5nKCk7dGhpcy5hbGxvd0JyZWFraW5nV29yZHMoKTt0aGlzLl90b2tlbml6ZXI9bmV3IGcuVG9rZW5pemVyO3RoaXMuX2JyZWFraW5nQ2hhcmFjdGVyPSItIn1sLnByb3RvdHlwZS5tYXhMaW5lcz1mdW5jdGlvbihrKXtpZihudWxsPT1rKXJldHVybiB0aGlzLl9tYXhMaW5lczt0aGlzLl9tYXhMaW5lcz1rO3JldHVybiB0aGlzfTsKbC5wcm90b3R5cGUudGV4dFRyaW1taW5nPWZ1bmN0aW9uKCl7dGhpcy5fdGV4dFRyaW1taW5nPSJlbGxpcHNpcyJ9O2wucHJvdG90eXBlLmFsbG93QnJlYWtpbmdXb3Jkcz1mdW5jdGlvbigpe3RoaXMuX2FsbG93QnJlYWtpbmdXb3Jkcz0hMH07bC5wcm90b3R5cGUud3JhcD1mdW5jdGlvbihrLG4scCxxKXt2YXIgcj10aGlzO3ZvaWQgMD09PXEmJihxPUluZmluaXR5KTt2YXIgdD17bm9Ccm9rZVdvcmRzOjAsbm9MaW5lczowLG9yaWdpbmFsVGV4dDprLHRydW5jYXRlZFRleHQ6IiIsd3JhcHBlZFRleHQ6IiJ9O3A9e2F2YWlsYWJsZUxpbmVzOk1hdGgubWluKE1hdGguZmxvb3IocS9uLm1lYXN1cmUoKS5oZWlnaHQpLHRoaXMuX21heExpbmVzKSxhdmFpbGFibGVXaWR0aDpwLGNhbkZpdFRleHQ6ITAsY3VycmVudExpbmU6IiIsd3JhcHBpbmc6dH07dmFyIHY9ay5zcGxpdCgiXG4iKTtyZXR1cm4gdi5yZWR1Y2UoZnVuY3Rpb24oeSx6LHgpe3JldHVybiByLmJyZWFrTGluZVRvRml0V2lkdGgoeSwKeix4IT09di5sZW5ndGgtMSxuKX0scCkud3JhcHBpbmd9O2wucHJvdG90eXBlLmJyZWFrTGluZVRvRml0V2lkdGg9ZnVuY3Rpb24oayxuLHAscSl7dmFyIHI9dGhpcztrLmNhbkZpdFRleHR8fCIiPT09ay53cmFwcGluZy50cnVuY2F0ZWRUZXh0fHwoay53cmFwcGluZy50cnVuY2F0ZWRUZXh0Kz0iXG4iKTtrPXRoaXMuX3Rva2VuaXplci50b2tlbml6ZShuKS5yZWR1Y2UoZnVuY3Rpb24odCx2KXtyZXR1cm4gci53cmFwTmV4dFRva2VuKHYsdCxxKX0sayk7bj1nLlN0cmluZ01ldGhvZHMudHJpbUVuZChrLmN1cnJlbnRMaW5lKTtrLndyYXBwaW5nLm5vTGluZXMrPSsoIiIhPT1uKTtrLndyYXBwaW5nLm5vTGluZXM9PT1rLmF2YWlsYWJsZUxpbmVzJiYibm9uZSIhPT10aGlzLl90ZXh0VHJpbW1pbmcmJnA/ay5jYW5GaXRUZXh0PSExOmsud3JhcHBpbmcud3JhcHBlZFRleHQrPW47ay5jdXJyZW50TGluZT0iXG4iO3JldHVybiBrfTtsLnByb3RvdHlwZS5jYW5GaXRUb2tlbj1mdW5jdGlvbihrLApuLHApe3ZhciBxPXRoaXMscj10aGlzLl9hbGxvd0JyZWFraW5nV29yZHM/ay5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKHQsdil7cmV0dXJuIHYhPT1rLmxlbmd0aC0xP3QrcS5fYnJlYWtpbmdDaGFyYWN0ZXI6dH0pOltrXTtyZXR1cm4gcC5tZWFzdXJlKGspLndpZHRoPD1ufHxyLmV2ZXJ5KGZ1bmN0aW9uKHQpe3JldHVybiBwLm1lYXN1cmUodCkud2lkdGg8PW59KX07bC5wcm90b3R5cGUuYWRkRWxsaXBzaXM9ZnVuY3Rpb24oayxuLHApe2lmKCJub25lIj09PXRoaXMuX3RleHRUcmltbWluZylyZXR1cm57cmVtYWluaW5nVG9rZW46IiIsd3JhcHBlZFRva2VuOmt9O3ZhciBxPWsuc3Vic3RyaW5nKDApLnRyaW0oKSxyPXAubWVhc3VyZShxKS53aWR0aCx0PXAubWVhc3VyZSgiLi4uIikud2lkdGgsdj0wPGsubGVuZ3RoJiYiXG4iPT09a1swXT8iXG4iOiIiO2lmKG48PXQpcmV0dXJue3JlbWFpbmluZ1Rva2VuOmssd3JhcHBlZFRva2VuOnYrIi4uLiIuc3Vic3RyKDAsTWF0aC5mbG9vcihuLwoodC8zKSkpfTtmb3IoO3IrdD5uOylxPWcuU3RyaW5nTWV0aG9kcy50cmltRW5kKHEuc3Vic3RyKDAscS5sZW5ndGgtMSkpLHI9cC5tZWFzdXJlKHEpLndpZHRoO3JldHVybntyZW1haW5pbmdUb2tlbjpnLlN0cmluZ01ldGhvZHMudHJpbUVuZChrLnN1YnN0cmluZyhxLmxlbmd0aCksIi0iKS50cmltKCksd3JhcHBlZFRva2VuOnYrcSsiLi4uIn19O2wucHJvdG90eXBlLndyYXBOZXh0VG9rZW49ZnVuY3Rpb24oayxuLHApe2lmKCFuLmNhbkZpdFRleHR8fG4uYXZhaWxhYmxlTGluZXM9PT1uLndyYXBwaW5nLm5vTGluZXN8fCF0aGlzLmNhbkZpdFRva2VuKGssbi5hdmFpbGFibGVXaWR0aCxwKSlyZXR1cm4gdGhpcy5maW5pc2hXcmFwcGluZyhrLG4scCk7Zm9yKDtrOyl7dmFyIHE9dGhpcy5icmVha1Rva2VuVG9GaXRJbldpZHRoKGssbi5jdXJyZW50TGluZSxuLmF2YWlsYWJsZVdpZHRoLHApO24uY3VycmVudExpbmU9cS5saW5lO2s9cS5yZW1haW5pbmdUb2tlbjtpZihudWxsIT1rKWlmKG4ud3JhcHBpbmcubm9Ccm9rZVdvcmRzKz0KK3EuYnJlYWtXb3JkLCsrbi53cmFwcGluZy5ub0xpbmVzLG4uYXZhaWxhYmxlTGluZXM9PT1uLndyYXBwaW5nLm5vTGluZXMpe3A9dGhpcy5hZGRFbGxpcHNpcyhuLmN1cnJlbnRMaW5lLG4uYXZhaWxhYmxlV2lkdGgscCk7bi53cmFwcGluZy53cmFwcGVkVGV4dCs9cC53cmFwcGVkVG9rZW47bi53cmFwcGluZy50cnVuY2F0ZWRUZXh0Kz1wLnJlbWFpbmluZ1Rva2VuK2s7bi5jdXJyZW50TGluZT0iXG4iO2JyZWFrfWVsc2Ugbi53cmFwcGluZy53cmFwcGVkVGV4dCs9Zy5TdHJpbmdNZXRob2RzLnRyaW1FbmQobi5jdXJyZW50TGluZSksbi5jdXJyZW50TGluZT0iXG4ifXJldHVybiBufTtsLnByb3RvdHlwZS5maW5pc2hXcmFwcGluZz1mdW5jdGlvbihrLG4scCl7bi5jYW5GaXRUZXh0JiZuLmF2YWlsYWJsZUxpbmVzIT09bi53cmFwcGluZy5ub0xpbmVzJiZ0aGlzLl9hbGxvd0JyZWFraW5nV29yZHMmJiJub25lIiE9PXRoaXMuX3RleHRUcmltbWluZz8ocD10aGlzLmFkZEVsbGlwc2lzKG4uY3VycmVudExpbmUrCmssbi5hdmFpbGFibGVXaWR0aCxwKSxuLndyYXBwaW5nLndyYXBwZWRUZXh0Kz1wLndyYXBwZWRUb2tlbixuLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPXAucmVtYWluaW5nVG9rZW4sbi53cmFwcGluZy5ub0Jyb2tlV29yZHMrPSsocC5yZW1haW5pbmdUb2tlbi5sZW5ndGg8ay5sZW5ndGgpLG4ud3JhcHBpbmcubm9MaW5lcys9KygwPHAud3JhcHBlZFRva2VuLmxlbmd0aCksbi5jdXJyZW50TGluZT0iIik6bi53cmFwcGluZy50cnVuY2F0ZWRUZXh0Kz1rO24uY2FuRml0VGV4dD0hMTtyZXR1cm4gbn07bC5wcm90b3R5cGUuYnJlYWtUb2tlblRvRml0SW5XaWR0aD1mdW5jdGlvbihrLG4scCxxKXtpZih2b2lkIDA9PT1yKXZhciByPXRoaXMuX2JyZWFraW5nQ2hhcmFjdGVyO2lmKHEubWVhc3VyZShuK2spLndpZHRoPD1wKXJldHVybnticmVha1dvcmQ6ITEsbGluZTpuK2sscmVtYWluaW5nVG9rZW46bnVsbH07aWYoIiI9PT1rLnRyaW0oKSlyZXR1cm57YnJlYWtXb3JkOiExLGxpbmU6biwKcmVtYWluaW5nVG9rZW46IiJ9O2lmKCF0aGlzLl9hbGxvd0JyZWFraW5nV29yZHMpcmV0dXJue2JyZWFrV29yZDohMSxsaW5lOm4scmVtYWluaW5nVG9rZW46a307Zm9yKHZhciB0PTA7dDxrLmxlbmd0aDspaWYocS5tZWFzdXJlKG4ray5zdWJzdHJpbmcoMCx0KzEpK3IpLndpZHRoPD1wKSsrdDtlbHNlIGJyZWFrO3A9IiI7MDx0JiYocD1yKTtyZXR1cm57YnJlYWtXb3JkOjA8dCxsaW5lOm4ray5zdWJzdHJpbmcoMCx0KStwLHJlbWFpbmluZ1Rva2VuOmsuc3Vic3RyaW5nKHQpfX07cmV0dXJuIGx9KCk7ZC5XcmFwcGVyPWN9LGZ1bmN0aW9uKGMsZCxmKXsoZnVuY3Rpb24oZyl7Zm9yKHZhciBsIGluIGcpZC5oYXNPd25Qcm9wZXJ0eShsKXx8KGRbbF09Z1tsXSl9KShmKDEzOSkpfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhsKXtmb3IodmFyIGsgaW4gbClkLmhhc093blByb3BlcnR5KGspfHwoZFtrXT1sW2tdKX1nKGYoNzIpKTtnKGYoNzMpKTtnKGYoMjgpKX0sZnVuY3Rpb24oYywKZCl7ZC52ZXJzaW9uPSIzLjcuMCJ9LGZ1bmN0aW9uKGMsZCxmKXtmdW5jdGlvbiBnKHgsQyl7cmV0dXJuIHguZWFjaChmdW5jdGlvbigpe3ZhciBGPUMuYXBwbHkodGhpcyxhcmd1bWVudHMpLEQ9ei5zZWxlY3QodGhpcyksQjtmb3IoQiBpbiBGKUQuYXR0cihCLEZbQl0pfSl9ZnVuY3Rpb24gbCh4LEMpe2Zvcih2YXIgRiBpbiBDKXguYXR0cihGLENbRl0pO3JldHVybiB4fWZ1bmN0aW9uIGsoeCxDLEYpe3JldHVybiB4LmVhY2goZnVuY3Rpb24oKXt2YXIgRD1DLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxCPXouc2VsZWN0KHRoaXMpLEk7Zm9yKEkgaW4gRClCLnN0eWxlKEksRFtJXSxGKX0pfWZ1bmN0aW9uIG4oeCxDLEYpe2Zvcih2YXIgRCBpbiBDKXguc3R5bGUoRCxDW0RdLEYpO3JldHVybiB4fWZ1bmN0aW9uIHAoeCxDKXtyZXR1cm4geC5lYWNoKGZ1bmN0aW9uKCl7dmFyIEY9Qy5hcHBseSh0aGlzLGFyZ3VtZW50cyksRD16LnNlbGVjdCh0aGlzKSxCO2ZvcihCIGluIEYpRC5wcm9wZXJ0eShCLApGW0JdKX0pfWZ1bmN0aW9uIHEoeCxDKXtmb3IodmFyIEYgaW4gQyl4LnByb3BlcnR5KEYsQ1tGXSk7cmV0dXJuIHh9ZnVuY3Rpb24gcih4LEMpe3JldHVybiB4LmVhY2goZnVuY3Rpb24oKXt2YXIgRj1DLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxEPXouc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oeCksQjtmb3IoQiBpbiBGKUQuYXR0cihCLEZbQl0pfSl9ZnVuY3Rpb24gdCh4LEMpe2Zvcih2YXIgRiBpbiBDKXguYXR0cihGLENbRl0pO3JldHVybiB4fWZ1bmN0aW9uIHYoeCxDLEYpe3JldHVybiB4LmVhY2goZnVuY3Rpb24oKXt2YXIgRD1DLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxCPXouc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oeCksSTtmb3IoSSBpbiBEKUIuc3R5bGUoSSxEW0ldLEYpfSl9ZnVuY3Rpb24geSh4LEMsRil7Zm9yKHZhciBEIGluIEMpeC5zdHlsZShELENbRF0sRik7cmV0dXJuIHh9dmFyIHo9Yz1mKDEpO3ouc2VsZWN0aW9uLnByb3RvdHlwZS5hdHRycz1mdW5jdGlvbih4KXtyZXR1cm4oImZ1bmN0aW9uIj09PQp0eXBlb2YgeD9nOmwpKHRoaXMseCl9O3ouc2VsZWN0aW9uLnByb3RvdHlwZS5zdHlsZXM9ZnVuY3Rpb24oeCl7cmV0dXJuKCJmdW5jdGlvbiI9PT10eXBlb2YgeD9rOm4pKHRoaXMseCwiIil9O3ouc2VsZWN0aW9uLnByb3RvdHlwZS5wcm9wZXJ0aWVzPWZ1bmN0aW9uKHgpe3JldHVybigiZnVuY3Rpb24iPT09dHlwZW9mIHg/cDpxKSh0aGlzLHgpfTtjLnRyYW5zaXRpb24ucHJvdG90eXBlLmF0dHJzPWZ1bmN0aW9uKHgpe3JldHVybigiZnVuY3Rpb24iPT09dHlwZW9mIHg/cjp0KSh0aGlzLHgpfTtjLnRyYW5zaXRpb24ucHJvdG90eXBlLnN0eWxlcz1mdW5jdGlvbih4KXtyZXR1cm4oImZ1bmN0aW9uIj09PXR5cGVvZiB4P3Y6eSkodGhpcyx4LCIiKX19LGZ1bmN0aW9uKGMsZCxmKXtjPWYoMTE3KTt2YXIgZz1mKDEyKTtmPWYoMTApO3ZhciBsPXtsaW5lYXI6Yy5lYXNlTGluZWFyLHF1YWQ6Yy5lYXNlUXVhZCxxdWFkSW46Yy5lYXNlUXVhZEluLHF1YWRPdXQ6Yy5lYXNlUXVhZE91dCwKcXVhZEluT3V0OmMuZWFzZVF1YWRJbk91dCxjdWJpYzpjLmVhc2VDdWJpYyxjdWJpY0luOmMuZWFzZUN1YmljSW4sY3ViaWNPdXQ6Yy5lYXNlQ3ViaWNPdXQsY3ViaWNJbk91dDpjLmVhc2VDdWJpY0luT3V0LHBvbHk6Yy5lYXNlUG9seSxwb2x5SW46Yy5lYXNlUG9seUluLHBvbHlPdXQ6Yy5lYXNlUG9seU91dCxwb2x5SW5PdXQ6Yy5lYXNlUG9seUluT3V0LHNpbjpjLmVhc2VTaW4sc2luSW46Yy5lYXNlU2luSW4sc2luT3V0OmMuZWFzZVNpbk91dCxzaW5Jbk91dDpjLmVhc2VTaW5Jbk91dCxleHA6Yy5lYXNlRXhwLGV4cEluOmMuZWFzZUV4cEluLGV4cE91dDpjLmVhc2VFeHBPdXQsZXhwSW5PdXQ6Yy5lYXNlRXhwSW5PdXQsY2lyY2xlOmMuZWFzZUNpcmNsZSxjaXJjbGVJbjpjLmVhc2VDaXJjbGVJbixjaXJjbGVPdXQ6Yy5lYXNlQ2lyY2xlT3V0LGNpcmNsZUluT3V0OmMuZWFzZUNpcmNsZUluT3V0LGJvdW5jZTpjLmVhc2VCb3VuY2UsYm91bmNlSW46Yy5lYXNlQm91bmNlSW4sYm91bmNlT3V0OmMuZWFzZUJvdW5jZU91dCwKYm91bmNlSW5PdXQ6Yy5lYXNlQm91bmNlSW5PdXQsYmFjazpjLmVhc2VCYWNrLGJhY2tJbjpjLmVhc2VCYWNrSW4sYmFja091dDpjLmVhc2VCYWNrT3V0LGJhY2tJbk91dDpjLmVhc2VCYWNrSW5PdXQsZWxhc3RpYzpjLmVhc2VFbGFzdGljLGVsYXN0aWNJbjpjLmVhc2VFbGFzdGljSW4sZWxhc3RpY091dDpjLmVhc2VFbGFzdGljT3V0LGVsYXN0aWNJbk91dDpjLmVhc2VFbGFzdGljSW5PdXR9O2QuRWFzZU5hbWU9Zi5tYWtlRW51bSgibGluZWFyIHF1YWQgcXVhZEluIHF1YWRPdXQgcXVhZEluT3V0IGN1YmljIGN1YmljSW4gY3ViaWNPdXQgY3ViaWNJbk91dCBwb2x5IHBvbHlJbiBwb2x5T3V0IHBvbHlJbk91dCBzaW4gc2luSW4gc2luT3V0IHNpbkluT3V0IGV4cCBleHBJbiBleHBPdXQgZXhwSW5PdXQgY2lyY2xlIGNpcmNsZUluIGNpcmNsZU91dCBjaXJjbGVJbk91dCBib3VuY2UgYm91bmNlSW4gYm91bmNlT3V0IGJvdW5jZUluT3V0IGJhY2sgYmFja0luIGJhY2tPdXQgYmFja0luT3V0IGVsYXN0aWMgZWxhc3RpY0luIGVsYXN0aWNPdXQgZWxhc3RpY0luT3V0Ii5zcGxpdCgiICIpKTsKZj1mdW5jdGlvbigpe2Z1bmN0aW9uIGsoKXt0aGlzLl9zdGFydERlbGF5PWsuX0RFRkFVTFRfU1RBUlRfREVMQVlfTUlMTElTRUNPTkRTO3RoaXMuX3N0ZXBEdXJhdGlvbj1rLl9ERUZBVUxUX1NURVBfRFVSQVRJT05fTUlMTElTRUNPTkRTO3RoaXMuX3N0ZXBEZWxheT1rLl9ERUZBVUxUX0lURVJBVElWRV9ERUxBWV9NSUxMSVNFQ09ORFM7dGhpcy5fbWF4VG90YWxEdXJhdGlvbj1rLl9ERUZBVUxUX01BWF9UT1RBTF9EVVJBVElPTl9NSUxMSVNFQ09ORFM7dGhpcy5fZWFzaW5nTW9kZT1rLl9ERUZBVUxUX0VBU0lOR19NT0RFfWsucHJvdG90eXBlLnRvdGFsVGltZT1mdW5jdGlvbihuKXt2YXIgcD10aGlzLl9nZXRBZGp1c3RlZEl0ZXJhdGl2ZURlbGF5KG4pO3JldHVybiB0aGlzLnN0YXJ0RGVsYXkoKStwKk1hdGgubWF4KG4tMSwwKSt0aGlzLnN0ZXBEdXJhdGlvbigpfTtrLnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKG4scCl7dmFyIHE9dGhpcztuPWcuY29lcmNlRXh0ZXJuYWxEMyhuKTsKdmFyIHI9bi5zaXplKCksdD10aGlzLl9nZXRBZGp1c3RlZEl0ZXJhdGl2ZURlbGF5KHIpO3JldHVybiBuLnRyYW5zaXRpb24oKS5lYXNlKHRoaXMuX2dldEVhc2VGYWN0b3J5KCkpLmR1cmF0aW9uKHRoaXMuc3RlcER1cmF0aW9uKCkpLmRlbGF5KGZ1bmN0aW9uKHYseSl7cmV0dXJuIHEuc3RhcnREZWxheSgpK3QqeX0pLmF0dHJzKHApfTtrLnByb3RvdHlwZS5zdGFydERlbGF5PWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX3N0YXJ0RGVsYXk7dGhpcy5fc3RhcnREZWxheT1uO3JldHVybiB0aGlzfTtrLnByb3RvdHlwZS5zdGVwRHVyYXRpb249ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gTWF0aC5taW4odGhpcy5fc3RlcER1cmF0aW9uLHRoaXMuX21heFRvdGFsRHVyYXRpb24pO3RoaXMuX3N0ZXBEdXJhdGlvbj1uO3JldHVybiB0aGlzfTtrLnByb3RvdHlwZS5zdGVwRGVsYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RlcERlbGF5fTtrLnByb3RvdHlwZS5tYXhUb3RhbER1cmF0aW9uPQpmdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9tYXhUb3RhbER1cmF0aW9uO3RoaXMuX21heFRvdGFsRHVyYXRpb249bjtyZXR1cm4gdGhpc307ay5wcm90b3R5cGUuZWFzaW5nTW9kZT1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9lYXNpbmdNb2RlO3RoaXMuX2Vhc2luZ01vZGU9bjtyZXR1cm4gdGhpc307ay5wcm90b3R5cGUuX2dldEVhc2VGYWN0b3J5PWZ1bmN0aW9uKCl7dmFyIG49dGhpcy5lYXNpbmdNb2RlKCk7cmV0dXJuInN0cmluZyI9PT10eXBlb2Ygbj8obj1sW25dLG51bGw9PW4/bC5saW5lYXI6bik6bn07ay5wcm90b3R5cGUuX2dldEFkanVzdGVkSXRlcmF0aXZlRGVsYXk9ZnVuY3Rpb24obil7dmFyIHA9dGhpcy5tYXhUb3RhbER1cmF0aW9uKCktdGhpcy5zdGVwRHVyYXRpb24oKTtwPU1hdGgubWF4KHAsMCk7bj1wL01hdGgubWF4KG4tMSwxKTtyZXR1cm4gTWF0aC5taW4odGhpcy5zdGVwRGVsYXkoKSxuKX07cmV0dXJuIGt9KCk7Zi5fREVGQVVMVF9TVEFSVF9ERUxBWV9NSUxMSVNFQ09ORFM9CjA7Zi5fREVGQVVMVF9TVEVQX0RVUkFUSU9OX01JTExJU0VDT05EUz0zMDA7Zi5fREVGQVVMVF9JVEVSQVRJVkVfREVMQVlfTUlMTElTRUNPTkRTPTE1O2YuX0RFRkFVTFRfTUFYX1RPVEFMX0RVUkFUSU9OX01JTExJU0VDT05EUz1JbmZpbml0eTtmLl9ERUZBVUxUX0VBU0lOR19NT0RFPSJleHBPdXQiO2QuRWFzaW5nPWZ9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz1mKDEyKTtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbCgpe31sLnByb3RvdHlwZS50b3RhbFRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gMH07bC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihrLG4pe2s9Zy5jb2VyY2VFeHRlcm5hbEQzKGspO3JldHVybiBrLmF0dHJzKG4pfTtyZXR1cm4gbH0oKTtkLk51bGw9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihyLHQpe2Z1bmN0aW9uIHYoKXt0aGlzLmNvbnN0cnVjdG9yPXJ9Zm9yKHZhciB5IGluIHQpdC5oYXNPd25Qcm9wZXJ0eSh5KSYmCihyW3ldPXRbeV0pO3IucHJvdG90eXBlPW51bGw9PT10P09iamVjdC5jcmVhdGUodCk6KHYucHJvdG90eXBlPXQucHJvdG90eXBlLG5ldyB2KX0sbD1mKDEpLGs9Zig1KSxuPWYoNCkscD1mKDApLHE9ZigyMik7Yz1mdW5jdGlvbihyKXtmdW5jdGlvbiB0KHYseSl7dm9pZCAwPT09eSYmKHk9ImJvdHRvbSIpO3Y9ci5jYWxsKHRoaXMsdix5KXx8dGhpczt2Ll90aWNrTGFiZWxBbmdsZT0wO3YuX3RpY2tMYWJlbFNoZWFyQW5nbGU9MDt2LmFkZENsYXNzKCJjYXRlZ29yeS1heGlzIik7cmV0dXJuIHZ9Zyh0LHIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiX3dyYXBwZXIiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdj1uZXcgay5XcmFwcGVyO251bGwhPXRoaXMuX3RpY2tMYWJlbE1heExpbmVzJiZ2Lm1heExpbmVzKHRoaXMuX3RpY2tMYWJlbE1heExpbmVzKTtyZXR1cm4gdn0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsCiJfd3JpdGVyIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBrLldyaXRlcih0aGlzLl9tZWFzdXJlcix0aGlzLl90eXBlc2V0dGVyQ29udGV4dCx0aGlzLl93cmFwcGVyKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTt0LnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtyLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl90eXBlc2V0dGVyQ29udGV4dD1uZXcgay5TdmdDb250ZXh0KHRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5ub2RlKCkpO3RoaXMuX21lYXN1cmVyPW5ldyBrLkNhY2hlTWVhc3VyZXIodGhpcy5fdHlwZXNldHRlckNvbnRleHQpfTt0LnByb3RvdHlwZS5fcmVzY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlZHJhdygpfTt0LnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbih2LHkpe3ZhciB6PXRoaXMuaXNIb3Jpem9udGFsKCk/MDp0aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpK3RoaXMubWFyZ2luKCkseD10aGlzLmlzSG9yaXpvbnRhbCgpPwp0aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpK3RoaXMubWFyZ2luKCk6MDtpZigwPT09dGhpcy5fc2NhbGUuZG9tYWluKCkubGVuZ3RoKXJldHVybnttaW5XaWR0aDowLG1pbkhlaWdodDowfTtpZih0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpKXt2YXIgQz10aGlzLl9hbm5vdGF0aW9uVGllckhlaWdodCgpKnRoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpO3RoaXMuaXNIb3Jpem9udGFsKCk/eCs9Qzp6Kz1DfXY9dGhpcy5fbWVhc3VyZVRpY2tMYWJlbHModix5KTtyZXR1cm57bWluV2lkdGg6di51c2VkV2lkdGgreixtaW5IZWlnaHQ6di51c2VkSGVpZ2h0K3h9fTt0LnByb3RvdHlwZS5fY29yZVNpemU9ZnVuY3Rpb24oKXt2YXIgdj10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuaGVpZ2h0KCk6dGhpcy53aWR0aCgpLHk9dGhpcy5pc0hvcml6b250YWwoKT90aGlzLnJlcXVlc3RlZFNwYWNlKHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpKS5taW5IZWlnaHQ6dGhpcy5yZXF1ZXN0ZWRTcGFjZSh0aGlzLndpZHRoKCksCnRoaXMuaGVpZ2h0KCkpLm1pbldpZHRoLHo9dGhpcy5tYXJnaW4oKSt0aGlzLl9hbm5vdGF0aW9uVGllckhlaWdodCgpO3JldHVybiBNYXRoLm1pbih5LXosdil9O3QucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RG93bnNhbXBsZUluZm8oKS5kb21haW59O3QucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHYseSl7cmV0dXJuIG4uQ29tcG9uZW50LnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlci5jYWxsKHRoaXMsdix5KX07dC5wcm90b3R5cGUuZ2V0RG93bnNhbXBsZUluZm89ZnVuY3Rpb24odil7dmFyIHk7dm9pZCAwPT09diYmKHY9dGhpcy5fc2NhbGUpO3ZvaWQgMD09PXkmJih5PXYuaW52ZXJ0UmFuZ2UoKSk7dmFyIHo9TWF0aC5jZWlsKHQuX01JTklNVU1fV0lEVEhfUEVSX0xBQkVMX1BYKigwPT09dGhpcy5fdGlja0xhYmVsQW5nbGU/MToxL01hdGguY29zKHRoaXMuX3RpY2tMYWJlbFNoZWFyQW5nbGUvMTgwKk1hdGguUEkpKS8Kdi5zdGVwV2lkdGgoKSk7cmV0dXJue2RvbWFpbjp5LmZpbHRlcihmdW5jdGlvbih4LEMpe3JldHVybiAwPT09QyV6fSksc3RlcFdpZHRoOnoqdi5zdGVwV2lkdGgoKX19O3QucHJvdG90eXBlLnRpY2tMYWJlbEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpY2tMYWJlbEFuZ2xlO3Rocm93IEVycm9yKCJBbmdsZSB1bmRlZmluZWQgbm90IHN1cHBvcnRlZDsgb25seSAwLCA5MCwgYW5kIC05MCBhcmUgdmFsaWQgdmFsdWVzIik7fTt0LnByb3RvdHlwZS50aWNrTGFiZWxTaGVhckFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpY2tMYWJlbFNoZWFyQW5nbGV9O3QucHJvdG90eXBlLnRpY2tMYWJlbE1heFdpZHRoPWZ1bmN0aW9uKHYpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl90aWNrTGFiZWxNYXhXaWR0aDt0aGlzLl90aWNrTGFiZWxNYXhXaWR0aD12O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLnRpY2tMYWJlbE1heExpbmVzPQpmdW5jdGlvbih2KXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fdGlja0xhYmVsTWF4TGluZXM7dGhpcy5fdGlja0xhYmVsTWF4TGluZXM9djt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt0LnByb3RvdHlwZS5fdGlja1NwYWNlUmVxdWlyZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkrdGhpcy50aWNrTGFiZWxQYWRkaW5nKCl9O3QucHJvdG90eXBlLl9kcmF3VGlja3M9ZnVuY3Rpb24odix5KXt2YXIgej10aGlzO3N3aXRjaCh0aGlzLnRpY2tMYWJlbEFuZ2xlKCkpe2Nhc2UgMDp2YXIgeD17bGVmdDoicmlnaHQiLHJpZ2h0OiJsZWZ0Iix0b3A6ImNlbnRlciIsYm90dG9tOiJjZW50ZXIifTt2YXIgQz17bGVmdDoiY2VudGVyIixyaWdodDoiY2VudGVyIix0b3A6ImJvdHRvbSIsYm90dG9tOiJ0b3AifTticmVhaztjYXNlIDkwOng9e2xlZnQ6ImNlbnRlciIscmlnaHQ6ImNlbnRlciIsdG9wOiJyaWdodCIsYm90dG9tOiJsZWZ0In07CkM9e2xlZnQ6InRvcCIscmlnaHQ6ImJvdHRvbSIsdG9wOiJjZW50ZXIiLGJvdHRvbToiY2VudGVyIn07YnJlYWs7Y2FzZSAtOTA6eD17bGVmdDoiY2VudGVyIixyaWdodDoiY2VudGVyIix0b3A6ImxlZnQiLGJvdHRvbToicmlnaHQifSxDPXtsZWZ0OiJib3R0b20iLHJpZ2h0OiJ0b3AiLHRvcDoiY2VudGVyIixib3R0b206ImNlbnRlciJ9fXkuZWFjaChmdW5jdGlvbihGKXt2YXIgRD1sLnNlbGVjdCh0aGlzKSxCPXouaXNIb3Jpem9udGFsKCk/djp6LndpZHRoKCktei5fdGlja1NwYWNlUmVxdWlyZWQoKSxJPXouaXNIb3Jpem9udGFsKCk/ei5oZWlnaHQoKS16Ll90aWNrU3BhY2VSZXF1aXJlZCgpOnYsTz17eEFsaWduOnhbei5vcmllbnRhdGlvbigpXSx5QWxpZ246Q1t6Lm9yaWVudGF0aW9uKCldLHRleHRSb3RhdGlvbjp6LnRpY2tMYWJlbEFuZ2xlKCksdGV4dFNoZWFyOnoudGlja0xhYmVsU2hlYXJBbmdsZSgpfTtpZihudWxsIT16Ll90aWNrTGFiZWxNYXhXaWR0aCl7aWYoImxlZnQiPT09Cnoub3JpZW50YXRpb24oKSYmQj56Ll90aWNrTGFiZWxNYXhXaWR0aCl7dmFyIFA9Qi16Ll90aWNrTGFiZWxNYXhXaWR0aDtQPUQuYXR0cigidHJhbnNmb3JtIikrIiB0cmFuc2xhdGUoIitQKyIsIDApIjtELmF0dHIoInRyYW5zZm9ybSIsUCl9Qj1NYXRoLm1pbihCLHouX3RpY2tMYWJlbE1heFdpZHRoKX16Ll93cml0ZXIud3JpdGUoei5mb3JtYXR0ZXIoKShGKSxCLEksTyxELm5vZGUoKSl9KX07dC5wcm90b3R5cGUuX21lYXN1cmVUaWNrTGFiZWxzPWZ1bmN0aW9uKHYseSl7dmFyIHo9dGhpcyx4PXRoaXMuX3NjYWxlLmNsb25lV2l0aG91dFByb3ZpZGVycygpLnJhbmdlKFswLHRoaXMuaXNIb3Jpem9udGFsKCk/djp5XSksQz10aGlzLmdldERvd25zYW1wbGVJbmZvKHgpO3g9Qy5kb21haW47Qz1DLnN0ZXBXaWR0aDt2YXIgRj12LXRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCk7dGhpcy5pc0hvcml6b250YWwoKSYmKEY9QywwIT09dGhpcy5fdGlja0xhYmVsQW5nbGUmJihGPXktdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKSksCkY9TWF0aC5tYXgoRiwwKSk7dmFyIEQ9Qzt0aGlzLmlzSG9yaXpvbnRhbCgpJiYoRD15LXRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCksMCE9PXRoaXMuX3RpY2tMYWJlbEFuZ2xlJiYoRD12LXRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCkpLEQ9TWF0aC5tYXgoRCwwKSk7bnVsbCE9dGhpcy5fdGlja0xhYmVsTWF4V2lkdGgmJihGPU1hdGgubWluKEYsdGhpcy5fdGlja0xhYmVsTWF4V2lkdGgpKTt5PXgubWFwKGZ1bmN0aW9uKEIpe3JldHVybiB6Ll93cmFwcGVyLndyYXAoei5mb3JtYXR0ZXIoKShCKSx6Ll9tZWFzdXJlcixGLEQpfSk7dj10aGlzLmlzSG9yaXpvbnRhbCgpJiYwPT09dGhpcy5fdGlja0xhYmVsQW5nbGU/bC5zdW06cC5NYXRoLm1heDt4PXRoaXMuaXNIb3Jpem9udGFsKCkmJjA9PT10aGlzLl90aWNrTGFiZWxBbmdsZT9wLk1hdGgubWF4Omwuc3VtO3Y9dih5LGZ1bmN0aW9uKEIpe3JldHVybiB6Ll9tZWFzdXJlci5tZWFzdXJlKEIud3JhcHBlZFRleHQpLndpZHRofSwwKTsKeT14KHksZnVuY3Rpb24oQil7cmV0dXJuIHouX21lYXN1cmVyLm1lYXN1cmUoQi53cmFwcGVkVGV4dCkuaGVpZ2h0fSwwKTswIT09dGhpcy5fdGlja0xhYmVsQW5nbGUmJih5PVt5LHZdLHY9eVswXSx5PXlbMV0pO3JldHVybnt1c2VkV2lkdGg6dix1c2VkSGVpZ2h0Onl9fTt0LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciB2PXRoaXM7ci5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt2YXIgeT10aGlzLl9zY2FsZSx6PXRoaXMuZ2V0RG93bnNhbXBsZUluZm8oeSkseD16LmRvbWFpbixDPXo9ei5zdGVwV2lkdGg7dGhpcy5pc0hvcml6b250YWwoKSYmbnVsbCE9dGhpcy5fdGlja0xhYmVsTWF4V2lkdGgmJihDPU1hdGgubWluKEMsdGhpcy5fdGlja0xhYmVsTWF4V2lkdGgpKTt4PXRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5kYXRhKHgpO3ZhciBGPXguZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKHEuQXhpcy5USUNLX0xBQkVMX0NMQVNTLAohMCkubWVyZ2UoeCk7eC5leGl0KCkucmVtb3ZlKCk7Ri5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKEQpe3ZhciBCPXkuc2NhbGUoRCktQy8yO0Q9di5pc0hvcml6b250YWwoKT9COjA7Qj12LmlzSG9yaXpvbnRhbCgpPzA6QjtyZXR1cm4idHJhbnNsYXRlKCIrRCsiLCIrQisiKSJ9KTtGLnRleHQoIiIpO3RoaXMuX2RyYXdUaWNrcyh6LEYpO3o9InJpZ2h0Ij09PXRoaXMub3JpZW50YXRpb24oKT90aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpOjA7eD0iYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT90aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpOjA7dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK3orIiwiK3grIikiKTt0aGlzLl9zaG93QWxsVGlja01hcmtzKCk7dGhpcy5fc2hvd0FsbFRpY2tMYWJlbHMoKTt0aGlzLl9oaWRlVGlja01hcmtzV2l0aG91dExhYmVsKCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9CmZ1bmN0aW9uKHYseSx6KXtyLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyx2LHkseik7dGhpcy5pc0hvcml6b250YWwoKXx8dGhpcy5fc2NhbGUucmFuZ2UoWzAsdGhpcy5oZWlnaHQoKV0pO3JldHVybiB0aGlzfTt0LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtyLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gdH0ocS5BeGlzKTtjLl9NSU5JTVVNX1dJRFRIX1BFUl9MQUJFTF9QWD0xNTtkLkNhdGVnb3J5PWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocix0KXtmdW5jdGlvbiB2KCl7dGhpcy5jb25zdHJ1Y3Rvcj1yfWZvcih2YXIgeSBpbiB0KXQuaGFzT3duUHJvcGVydHkoeSkmJihyW3ldPXRbeV0pO3IucHJvdG90eXBlPW51bGw9PT10P09iamVjdC5jcmVhdGUodCk6KHYucHJvdG90eXBlPXQucHJvdG90eXBlLG5ldyB2KX0sCmw9ZigxKSxrPWYoNSksbj1mKDgpLHA9ZigwKSxxPWYoMjIpO2M9ZnVuY3Rpb24ocil7ZnVuY3Rpb24gdCh2LHkpe3Y9ci5jYWxsKHRoaXMsdix5KXx8dGhpczt2Ll90aWNrTGFiZWxQb3NpdGlvbmluZz0iY2VudGVyIjt2Ll91c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbj0hMTt2LmZvcm1hdHRlcihuLmdlbmVyYWwoKSk7cmV0dXJuIHZ9Zyh0LHIpO3QucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3IucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3ZhciB2PW5ldyBrLlN2Z0NvbnRleHQodGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLm5vZGUoKSxxLkF4aXMuVElDS19MQUJFTF9DTEFTUyk7dGhpcy5fbWVhc3VyZXI9bmV3IGsuQ2FjaGVNZWFzdXJlcih2KTt0aGlzLl93cmFwcGVyPShuZXcgay5XcmFwcGVyKS5tYXhMaW5lcygxKX07dC5wcm90b3R5cGUuX2NvbXB1dGVXaWR0aD1mdW5jdGlvbigpe3ZhciB2PXRoaXMuX3VzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uP3RoaXMuX2NvbXB1dGVBcHByb3hpbWF0ZVRleHRXaWR0aCgpOgp0aGlzLl9jb21wdXRlRXhhY3RUZXh0V2lkdGgoKTtyZXR1cm4iY2VudGVyIj09PXRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nP3RoaXMuX21heExhYmVsVGlja0xlbmd0aCgpK3RoaXMudGlja0xhYmVsUGFkZGluZygpK3Y6TWF0aC5tYXgodGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCksdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkrdil9O3QucHJvdG90eXBlLl9jb21wdXRlRXhhY3RUZXh0V2lkdGg9ZnVuY3Rpb24oKXt2YXIgdj10aGlzLHk9dGhpcy5fZ2V0VGlja1ZhbHVlcygpLm1hcChmdW5jdGlvbih6KXt6PXYuZm9ybWF0dGVyKCkoeik7cmV0dXJuIHYuX21lYXN1cmVyLm1lYXN1cmUoeikud2lkdGh9KTtyZXR1cm4gcC5NYXRoLm1heCh5LDApfTt0LnByb3RvdHlwZS5fY29tcHV0ZUFwcHJveGltYXRlVGV4dFdpZHRoPWZ1bmN0aW9uKCl7dmFyIHY9dGhpcyx5PXRoaXMuX2dldFRpY2tWYWx1ZXMoKSx6PXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoIk0iKS53aWR0aDt5PXkubWFwKGZ1bmN0aW9uKHgpe3JldHVybiB2LmZvcm1hdHRlcigpKHgpLmxlbmd0aCoKen0pO3JldHVybiBwLk1hdGgubWF4KHksMCl9O3QucHJvdG90eXBlLl9jb21wdXRlSGVpZ2h0PWZ1bmN0aW9uKCl7dmFyIHY9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodDtyZXR1cm4iY2VudGVyIj09PXRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nP3RoaXMuX21heExhYmVsVGlja0xlbmd0aCgpK3RoaXMudGlja0xhYmVsUGFkZGluZygpK3Y6TWF0aC5tYXgodGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCksdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkrdil9O3QucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzPWZ1bmN0aW9uKCl7dmFyIHY9dGhpcy5fc2NhbGUseT12LmRvbWFpbigpLHo9eVswXTw9eVsxXT95WzBdOnlbMV0seD15WzBdPj15WzFdP3lbMF06eVsxXTtyZXR1cm4gdi50aWNrcygpLmZpbHRlcihmdW5jdGlvbihDKXtyZXR1cm4gQz49eiYmQzw9eH0pfTt0LnByb3RvdHlwZS5fcmVzY2FsZT1mdW5jdGlvbigpe2lmKHRoaXMuX2lzU2V0dXApe2lmKCF0aGlzLmlzSG9yaXpvbnRhbCgpKXt2YXIgdj0KdGhpcy5fY29tcHV0ZVdpZHRoKCk7aWYodj50aGlzLndpZHRoKCl8fHY8dGhpcy53aWR0aCgpLXRoaXMubWFyZ2luKCkpe3RoaXMucmVkcmF3KCk7cmV0dXJufX10aGlzLnJlbmRlcigpfX07dC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt2YXIgdj10aGlzO3IucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dmFyIHk9e3g6MCx5OjAsZHg6IjBlbSIsZHk6IjAuM2VtIn0sej10aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSx4PXRoaXMudGlja0xhYmVsUGFkZGluZygpLEM9Im1pZGRsZSIsRj0wLEQ9MCxCPTAsST0wO2lmKHRoaXMuaXNIb3Jpem9udGFsKCkpc3dpdGNoKHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nKXtjYXNlICJsZWZ0IjpDPSJlbmQiO0Y9LXg7ST14O2JyZWFrO2Nhc2UgImNlbnRlciI6ST16K3g7YnJlYWs7Y2FzZSAicmlnaHQiOkM9InN0YXJ0IixJPUY9eH1lbHNlIHN3aXRjaCh0aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZyl7Y2FzZSAidG9wIjp5LmR5PQoiLTAuM2VtIjtCPXg7RD0teDticmVhaztjYXNlICJjZW50ZXIiOkI9eit4O2JyZWFrO2Nhc2UgImJvdHRvbSI6eS5keT0iMWVtIixEPUI9eH16PXRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCgpO3N3aXRjaCh0aGlzLm9yaWVudGF0aW9uKCkpe2Nhc2UgImJvdHRvbSI6eS54PXoueDE7eS5keT0iMC45NWVtIjtEPXoueTErSTticmVhaztjYXNlICJ0b3AiOnkueD16LngxO3kuZHk9Ii0uMjVlbSI7RD16LnkxLUk7YnJlYWs7Y2FzZSAibGVmdCI6Qz0iZW5kIjtGPXoueDEtQjt5Lnk9ei55MTticmVhaztjYXNlICJyaWdodCI6Qz0ic3RhcnQiLEY9ei54MStCLHkueT16LnkxfUI9dGhpcy5fZ2V0VGlja1ZhbHVlcygpO0I9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmRhdGEoQik7Qi5leGl0KCkucmVtb3ZlKCk7Qi5lbnRlcigpLmFwcGVuZCgidGV4dCIpLmNsYXNzZWQocS5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MsCiEwKS5tZXJnZShCKS5zdHlsZSgidGV4dC1hbmNob3IiLEMpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaW5oZXJpdCIpLmF0dHJzKHkpLnRleHQoZnVuY3Rpb24oTyl7cmV0dXJuIHYuZm9ybWF0dGVyKCkoTyl9KTt0aGlzLl90aWNrTGFiZWxDb250YWluZXIuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrRisiLCAiK0QrIikiKTt0aGlzLl9zaG93QWxsVGlja01hcmtzKCk7dGhpcy5zaG93RW5kVGlja0xhYmVscygpfHx0aGlzLl9oaWRlRW5kVGlja0xhYmVscygpO3RoaXMuX2hpZGVPdmVyZmxvd2luZ1RpY2tMYWJlbHMoKTt0aGlzLl9oaWRlT3ZlcmxhcHBpbmdUaWNrTGFiZWxzKCk7ImNlbnRlciIhPT10aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZyYmdGhpcy5faGlkZVRpY2tNYXJrc1dpdGhvdXRMYWJlbCgpO3JldHVybiB0aGlzfTt0LnByb3RvdHlwZS50aWNrTGFiZWxQb3NpdGlvbj1mdW5jdGlvbih2KXtpZihudWxsPT12KXJldHVybiB0aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZzsKdj12LnRvTG93ZXJDYXNlKCk7aWYodGhpcy5pc0hvcml6b250YWwoKSl7aWYoImxlZnQiIT09diYmImNlbnRlciIhPT12JiYicmlnaHQiIT09dil0aHJvdyBFcnJvcih2KyIgaXMgbm90IGEgdmFsaWQgdGljayBsYWJlbCBwb3NpdGlvbiBmb3IgYSBob3Jpem9udGFsIE51bWVyaWNBeGlzIik7fWVsc2UgaWYoInRvcCIhPT12JiYiY2VudGVyIiE9PXYmJiJib3R0b20iIT09dil0aHJvdyBFcnJvcih2KyIgaXMgbm90IGEgdmFsaWQgdGljayBsYWJlbCBwb3NpdGlvbiBmb3IgYSB2ZXJ0aWNhbCBOdW1lcmljQXhpcyIpO3RoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nPXY7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307dC5wcm90b3R5cGUudXNlc1RleHRXaWR0aEFwcHJveGltYXRpb249ZnVuY3Rpb24oKXt0aGlzLl91c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbj0hMH07dC5wcm90b3R5cGUuX2hpZGVFbmRUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dmFyIHY9dGhpcy5lbGVtZW50KCkubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLAp5PXRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuQXhpcy5USUNLX0xBQkVMX0NMQVNTKTtpZigwIT09eS5zaXplKCkpe3ZhciB6PXkubm9kZXMoKVswXTtwLkRPTS5jbGllbnRSZWN0SW5zaWRlKHouZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdil8fGwuc2VsZWN0KHopLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIik7eT15Lm5vZGVzKClbeS5zaXplKCktMV07cC5ET00uY2xpZW50UmVjdEluc2lkZSh5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHYpfHxsLnNlbGVjdCh5KS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpfX07dC5wcm90b3R5cGUuX2hpZGVPdmVybGFwcGluZ1RpY2tMYWJlbHM9ZnVuY3Rpb24oKXtmb3IodmFyIHY9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmZpbHRlcihmdW5jdGlvbigpe3ZhciB4PWwuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5Iik7cmV0dXJuImluaGVyaXQiPT09Cnh8fCJ2aXNpYmxlIj09PXh9KSx5PXYubm9kZXMoKS5tYXAoZnVuY3Rpb24oeCl7cmV0dXJuIHguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9KSx6PTE7IXRoaXMuX2hhc092ZXJsYXBXaXRoSW50ZXJ2YWwoeix5KSYmejx5Lmxlbmd0aDspeis9MTt2LmVhY2goZnVuY3Rpb24oeCxDKXt4PWwuc2VsZWN0KHRoaXMpOzAhPT1DJXomJnguc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX0pfTt0LnByb3RvdHlwZS5faGFzT3ZlcmxhcFdpdGhJbnRlcnZhbD1mdW5jdGlvbih2LHkpe3ZhciB6PSJjZW50ZXIiPT09dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc/dGhpcy50aWNrTGFiZWxQYWRkaW5nKCk6Myp0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTt5PXkubWFwKGZ1bmN0aW9uKEMpe3JldHVybiBwLkRPTS5leHBhbmRSZWN0KEMseil9KTtmb3IodmFyIHg9MDt4PHkubGVuZ3RoLXY7eCs9dilpZihwLkRPTS5jbGllbnRSZWN0c092ZXJsYXAoeVt4XSx5W3grdl0pKXJldHVybiExO3JldHVybiEwfTsKdC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7ci5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyk7dGhpcy5fbWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHR9KHEuQXhpcyk7ZC5OdW1lcmljPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixwKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgciBpbiBwKXAuaGFzT3duUHJvcGVydHkocikmJihuW3JdPXBbcl0pO24ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX07Yz1mKDQyKTt2YXIgbD1mKDI1KSxrPWYoMCk7Zj1mdW5jdGlvbihuKXtmdW5jdGlvbiBwKHEpe2Z1bmN0aW9uIHIoKXt4JiYoeD0hMSx6Ll9kcmFnRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoeikpfWZ1bmN0aW9uIHQoQyxGKXt4JiYoei5fc2V0UGl4ZWxQb3NpdGlvbldpdGhvdXRDaGFuZ2luZ01vZGUoei5faXNWZXJ0aWNhbCgpPwpGLng6Ri55KSx6Ll9kcmFnQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoeikpfWZ1bmN0aW9uIHYoQyl7eShDKSYmKHg9ITAsei5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoeikpfWZ1bmN0aW9uIHkoQyl7cmV0dXJuIHouX2lzVmVydGljYWwoKSYmei5waXhlbFBvc2l0aW9uKCktei5kZXRlY3Rpb25SYWRpdXMoKTw9Qy54JiZDLng8PXoucGl4ZWxQb3NpdGlvbigpK3ouZGV0ZWN0aW9uUmFkaXVzKCl8fCF6Ll9pc1ZlcnRpY2FsKCkmJnoucGl4ZWxQb3NpdGlvbigpLXouZGV0ZWN0aW9uUmFkaXVzKCk8PUMueSYmQy55PD16LnBpeGVsUG9zaXRpb24oKSt6LmRldGVjdGlvblJhZGl1cygpfXZhciB6PW4uY2FsbCh0aGlzLHEpfHx0aGlzO3ouX2RldGVjdGlvblJhZGl1cz0zO3ouX2VuYWJsZWQ9ITA7ei5hZGRDbGFzcygiZHJhZy1saW5lLWxheWVyIik7ei5hZGRDbGFzcygiZW5hYmxlZCIpO3ouX2RyYWdJbnRlcmFjdGlvbj1uZXcgbC5EcmFnO3ouX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyh6KTsKdmFyIHg9ITE7ei5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ1N0YXJ0KHYpO3ouX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWcodCk7ei5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZChyKTt6Ll9kaXNjb25uZWN0SW50ZXJhY3Rpb249ZnVuY3Rpb24oKXt6Ll9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZ1N0YXJ0KHYpO3ouX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnKHQpO3ouX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnRW5kKHIpO3ouX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKX07ei5fZHJhZ1N0YXJ0Q2FsbGJhY2tzPW5ldyBrLkNhbGxiYWNrU2V0O3ouX2RyYWdDYWxsYmFja3M9bmV3IGsuQ2FsbGJhY2tTZXQ7ei5fZHJhZ0VuZENhbGxiYWNrcz1uZXcgay5DYWxsYmFja1NldDtyZXR1cm4gen1nKHAsbik7cC5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fZGV0ZWN0aW9uRWRnZT10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImxpbmUiKS5zdHlsZXMoe29wYWNpdHk6MCwKc3Ryb2tlOiJwaW5rIiwicG9pbnRlci1ldmVudHMiOiJ2aXNpYmxlU3Ryb2tlIn0pLmNsYXNzZWQoImRyYWctZWRnZSIsITApfTtwLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe24ucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dGhpcy5fZGV0ZWN0aW9uRWRnZS5hdHRycyh7eDE6dGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMucGl4ZWxQb3NpdGlvbigpOjAseTE6dGhpcy5faXNWZXJ0aWNhbCgpPzA6dGhpcy5waXhlbFBvc2l0aW9uKCkseDI6dGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMucGl4ZWxQb3NpdGlvbigpOnRoaXMud2lkdGgoKSx5Mjp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLnBpeGVsUG9zaXRpb24oKSwic3Ryb2tlLXdpZHRoIjoyKnRoaXMuX2RldGVjdGlvblJhZGl1c30pO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5kZXRlY3Rpb25SYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfTsKcC5wcm90b3R5cGUuZW5hYmxlZD1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl9lbmFibGVkOyh0aGlzLl9lbmFibGVkPXEpP3RoaXMuYWRkQ2xhc3MoImVuYWJsZWQiKTp0aGlzLnJlbW92ZUNsYXNzKCJlbmFibGVkIik7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmVuYWJsZWQocSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLm9uRHJhZ1N0YXJ0PWZ1bmN0aW9uKHEpe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5hZGQocSl9O3AucHJvdG90eXBlLm9mZkRyYWdTdGFydD1mdW5jdGlvbihxKXt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZGVsZXRlKHEpfTtwLnByb3RvdHlwZS5vbkRyYWc9ZnVuY3Rpb24ocSl7dGhpcy5fZHJhZ0NhbGxiYWNrcy5hZGQocSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLm9mZkRyYWc9ZnVuY3Rpb24ocSl7dGhpcy5fZHJhZ0NhbGxiYWNrcy5kZWxldGUocSl9O3AucHJvdG90eXBlLm9uRHJhZ0VuZD1mdW5jdGlvbihxKXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmFkZChxKX07CnAucHJvdG90eXBlLm9mZkRyYWdFbmQ9ZnVuY3Rpb24ocSl7dGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUocSl9O3AucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgcT10aGlzO24ucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihyKXtyZXR1cm4gcS5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmRlbGV0ZShyKX0pO3RoaXMuX2RyYWdDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihyKXtyZXR1cm4gcS5fZHJhZ0NhbGxiYWNrcy5kZWxldGUocil9KTt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24ocil7cmV0dXJuIHEuX2RyYWdFbmRDYWxsYmFja3MuZGVsZXRlKHIpfSk7dGhpcy5fZGlzY29ubmVjdEludGVyYWN0aW9uKCl9O3JldHVybiBwfShjLkd1aWRlTGluZUxheWVyKTtkLkRyYWdMaW5lTGF5ZXI9Zn0sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcoayxuLHApe3ZhciBxPQp7fTtpZih2b2lkIDAhPT1wKWZvcih2YXIgcj0wO3I8cC5sZW5ndGg7cisrKXFbcFtyXV09cFtyLTFdO3JldHVybiBmdW5jdGlvbih0KXt2YXIgdj1rLnNjYWxlKHQpO2lmKCFuKXJldHVybiB2O3ZhciB5O3Q9dm9pZCAwPT09cVt0XT92b2lkIDA6ay5zY2FsZShxW3RdKTt2b2lkIDAhPT10JiYoeT10Kyh2LXQpLzIpO3JldHVybiB5fX12YXIgbD10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oayxuKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWZvcih2YXIgcSBpbiBuKW4uaGFzT3duUHJvcGVydHkocSkmJihrW3FdPW5bcV0pO2sucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHAucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyBwKX07Yz1mdW5jdGlvbihrKXtmdW5jdGlvbiBuKHAscSl7dmFyIHI9ay5jYWxsKHRoaXMpfHx0aGlzO3IuYWRkQ2xhc3MoImdyaWRsaW5lcyIpO3IuX3hTY2FsZT1wO3IuX3lTY2FsZT1xO3IuX3JlbmRlckNhbGxiYWNrPQpmdW5jdGlvbigpe3JldHVybiByLnJlbmRlcigpfTtpZihyLl94U2NhbGUpci5feFNjYWxlLm9uVXBkYXRlKHIuX3JlbmRlckNhbGxiYWNrKTtpZihyLl95U2NhbGUpci5feVNjYWxlLm9uVXBkYXRlKHIuX3JlbmRlckNhbGxiYWNrKTtyZXR1cm4gcn1sKG4sayk7bi5wcm90b3R5cGUuYmV0d2Vlblg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmV0d2Vlblh9O24ucHJvdG90eXBlLmJldHdlZW5ZPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JldHdlZW5ZfTtuLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7ay5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX3hTY2FsZSYmdGhpcy5feFNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZW5kZXJDYWxsYmFjayk7dGhpcy5feVNjYWxlJiZ0aGlzLl95U2NhbGUub2ZmVXBkYXRlKHRoaXMuX3JlbmRlckNhbGxiYWNrKTtyZXR1cm4gdGhpc307bi5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7ay5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7CnRoaXMuX3hMaW5lc0NvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJ4LWdyaWRsaW5lcyIsITApO3RoaXMuX3lMaW5lc0NvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJ5LWdyaWRsaW5lcyIsITApfTtuLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe2sucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dGhpcy5fcmVkcmF3WExpbmVzKCk7dGhpcy5fcmVkcmF3WUxpbmVzKCk7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24ocCxxLHIpe2sucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLHAscSxyKTtudWxsIT10aGlzLl94U2NhbGUmJnRoaXMuX3hTY2FsZS5yYW5nZShbMCx0aGlzLndpZHRoKCldKTtudWxsIT10aGlzLl95U2NhbGUmJnRoaXMuX3lTY2FsZS5yYW5nZShbdGhpcy5oZWlnaHQoKSwwXSk7cmV0dXJuIHRoaXN9OwpuLnByb3RvdHlwZS5fcmVkcmF3WExpbmVzPWZ1bmN0aW9uKCl7aWYodGhpcy5feFNjYWxlKXt2YXIgcD10aGlzLmJldHdlZW5YKCkscT10aGlzLl94U2NhbGUudGlja3MoKS5zbGljZShwPzE6MCk7cT10aGlzLl94TGluZXNDb250YWluZXIuc2VsZWN0QWxsKCJsaW5lIikuZGF0YShxKTtxLmVudGVyKCkuYXBwZW5kKCJsaW5lIikubWVyZ2UocSkuYXR0cigieDEiLGcodGhpcy5feFNjYWxlLHAsdGhpcy5feFNjYWxlLnRpY2tzKCkpKS5hdHRyKCJ5MSIsMCkuYXR0cigieDIiLGcodGhpcy5feFNjYWxlLHAsdGhpcy5feFNjYWxlLnRpY2tzKCkpKS5hdHRyKCJ5MiIsdGhpcy5oZWlnaHQoKSkuY2xhc3NlZCgiYmV0d2VlbmxpbmUiLHApLmNsYXNzZWQoInplcm9saW5lIixmdW5jdGlvbihyKXtyZXR1cm4gMD09PXJ9KTtxLmV4aXQoKS5yZW1vdmUoKX19O24ucHJvdG90eXBlLl9yZWRyYXdZTGluZXM9ZnVuY3Rpb24oKXtpZih0aGlzLl95U2NhbGUpe3ZhciBwPXRoaXMuYmV0d2VlblkoKSwKcT10aGlzLl95U2NhbGUudGlja3MoKS5zbGljZShwPzE6MCk7cT10aGlzLl95TGluZXNDb250YWluZXIuc2VsZWN0QWxsKCJsaW5lIikuZGF0YShxKTtxLmVudGVyKCkuYXBwZW5kKCJsaW5lIikubWVyZ2UocSkuYXR0cigieDEiLDApLmF0dHIoInkxIixnKHRoaXMuX3lTY2FsZSxwLHRoaXMuX3lTY2FsZS50aWNrcygpKSkuYXR0cigieDIiLHRoaXMud2lkdGgoKSkuYXR0cigieTIiLGcodGhpcy5feVNjYWxlLHAsdGhpcy5feVNjYWxlLnRpY2tzKCkpKS5jbGFzc2VkKCJiZXR3ZWVubGluZSIscCkuY2xhc3NlZCgiemVyb2xpbmUiLGZ1bmN0aW9uKHIpe3JldHVybiAwPT09cn0pO3EuZXhpdCgpLnJlbW92ZSgpfX07cmV0dXJuIG59KGYoNCkuQ29tcG9uZW50KTtkLkdyaWRsaW5lcz1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHEscil7ZnVuY3Rpb24gdCgpe3RoaXMuY29uc3RydWN0b3I9cX1mb3IodmFyIHYgaW4gcilyLmhhc093blByb3BlcnR5KHYpJiYKKHFbdl09clt2XSk7cS5wcm90b3R5cGU9bnVsbD09PXI/T2JqZWN0LmNyZWF0ZShyKToodC5wcm90b3R5cGU9ci5wcm90b3R5cGUsbmV3IHQpfSxsPWYoNSksaz1mKDIzKSxuPWYoOCkscD1mKDApO2M9ZnVuY3Rpb24ocSl7ZnVuY3Rpb24gcih0KXt2YXIgdj1xLmNhbGwodGhpcyl8fHRoaXM7di5fdGV4dFBhZGRpbmc9NTtpZihudWxsPT10KXRocm93IEVycm9yKCJJbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZCByZXF1aXJlcyBhIGludGVycG9sYXRlZENvbG9yU2NhbGUiKTt2Ll9zY2FsZT10O3YuX3JlZHJhd0NhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHYucmVkcmF3KCl9O3YuX3NjYWxlLm9uVXBkYXRlKHYuX3JlZHJhd0NhbGxiYWNrKTt2Ll9mb3JtYXR0ZXI9bi5nZW5lcmFsKCk7di5fb3JpZW50YXRpb249Imhvcml6b250YWwiO3YuX2V4cGFuZHM9ITE7di5hZGRDbGFzcygibGVnZW5kIik7di5hZGRDbGFzcygiaW50ZXJwb2xhdGVkLWNvbG9yLWxlZ2VuZCIpO3JldHVybiB2fWcociwKcSk7ci5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3EucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9zY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spfTtyLnByb3RvdHlwZS5mb3JtYXR0ZXI9ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dClyZXR1cm4gdGhpcy5fZm9ybWF0dGVyO3RoaXMuX2Zvcm1hdHRlcj10O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3IucHJvdG90eXBlLmV4cGFuZHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXhwYW5kc307ci5fZW5zdXJlT3JpZW50YXRpb249ZnVuY3Rpb24odCl7dD10LnRvTG93ZXJDYXNlKCk7aWYoImhvcml6b250YWwiPT09dHx8ImxlZnQiPT09dHx8InJpZ2h0Ij09PXQpcmV0dXJuIHQ7dGhyb3cgRXJyb3IoJyInK3QrJyIgaXMgbm90IGEgdmFsaWQgb3JpZW50YXRpb24gZm9yIEludGVycG9sYXRlZENvbG9yTGVnZW5kJyk7fTtyLnByb3RvdHlwZS5vcmllbnRhdGlvbj1mdW5jdGlvbih0KXtpZihudWxsPT0KdClyZXR1cm4gdGhpcy5fb3JpZW50YXRpb247dGhpcy5fb3JpZW50YXRpb249ci5fZW5zdXJlT3JpZW50YXRpb24odCk7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307ci5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiF0aGlzLmV4cGFuZHMoKXx8dGhpcy5faXNWZXJ0aWNhbCgpfTtyLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiF0aGlzLmV4cGFuZHMoKXx8IXRoaXMuX2lzVmVydGljYWwoKX07ci5wcm90b3R5cGUuX2dlbmVyYXRlVGlja3M9ZnVuY3Rpb24odCl7dm9pZCAwPT09dCYmKHQ9ci5fREVGQVVMVF9OVU1fU1dBVENIRVMpO3ZhciB2PXRoaXMuX3NjYWxlLmRvbWFpbigpO2lmKDE9PT10KXJldHVyblt2WzBdXTtmb3IodmFyIHk9KHZbMV0tdlswXSkvKHQtMSksej1bXSx4PTA7eDx0O3grKyl6LnB1c2godlswXSt5KngpO3JldHVybiB6fTtyLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtxLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTsKdGhpcy5fc3dhdGNoQ29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoInN3YXRjaC1jb250YWluZXIiLCEwKTt0aGlzLl9zd2F0Y2hCb3VuZGluZ0JveD10aGlzLmNvbnRlbnQoKS5hcHBlbmQoInJlY3QiKS5jbGFzc2VkKCJzd2F0Y2gtYm91bmRpbmctYm94IiwhMCk7dGhpcy5fbG93ZXJMYWJlbD10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKHIuTEVHRU5EX0xBQkVMX0NMQVNTLCEwKTt0aGlzLl91cHBlckxhYmVsPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoci5MRUdFTkRfTEFCRUxfQ0xBU1MsITApO3ZhciB0PW5ldyBsLlN2Z0NvbnRleHQodGhpcy5jb250ZW50KCkubm9kZSgpKTt0aGlzLl9tZWFzdXJlcj1uZXcgbC5NZWFzdXJlcih0KTt0aGlzLl93cmFwcGVyPW5ldyBsLldyYXBwZXI7dGhpcy5fd3JpdGVyPW5ldyBsLldyaXRlcih0aGlzLl9tZWFzdXJlcix0LHRoaXMuX3dyYXBwZXIpfTtyLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT0KZnVuY3Rpb24oKXt2YXIgdD10aGlzLHY9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCx5PXRoaXMuX3NjYWxlLmRvbWFpbigpLm1hcChmdW5jdGlvbihDKXtyZXR1cm4gdC5fbWVhc3VyZXIubWVhc3VyZSh0Ll9mb3JtYXR0ZXIoQykpLndpZHRofSksej1yLl9ERUZBVUxUX05VTV9TV0FUQ0hFUztpZih0aGlzLl9pc1ZlcnRpY2FsKCkpe3ZhciB4PXAuTWF0aC5tYXgoeSwwKTt5PXYrdit0aGlzLl90ZXh0UGFkZGluZyt4K3RoaXMuX3RleHRQYWRkaW5nO3g9eip2fWVsc2UgeD12K3Yrdix5PXRoaXMuX3RleHRQYWRkaW5nK3lbMF0reip2K3lbMV0rdGhpcy5fdGV4dFBhZGRpbmc7cmV0dXJue21pbldpZHRoOnksbWluSGVpZ2h0Onh9fTtyLnByb3RvdHlwZS5faXNWZXJ0aWNhbD1mdW5jdGlvbigpe3JldHVybiJob3Jpem9udGFsIiE9PXRoaXMuX29yaWVudGF0aW9ufTtyLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTsKdmFyIHY9dGhpcy5fc2NhbGUuZG9tYWluKCkseT10aGlzLl9mb3JtYXR0ZXIodlswXSksej10aGlzLl9tZWFzdXJlci5tZWFzdXJlKHkpLndpZHRoLHg9dGhpcy5fZm9ybWF0dGVyKHZbMV0pO3Y9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSh4KS53aWR0aDt2YXIgQz10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0LEY9dGhpcy5fdGV4dFBhZGRpbmcsRD0wLEI9MCxJPTAsTz0wLFA9e3hBbGlnbjoiY2VudGVyIix5QWxpZ246ImNlbnRlciIsdGV4dFJvdGF0aW9uOjB9LEg9e3hBbGlnbjoiY2VudGVyIix5QWxpZ246ImNlbnRlciIsdGV4dFJvdGF0aW9uOjB9LEs9e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH07aWYodGhpcy5faXNWZXJ0aWNhbCgpKXt2YXIgTT1NYXRoLmZsb29yKHRoaXMuaGVpZ2h0KCkpO3ZhciBMPU1hdGgubWF4KHosdik7dmFyIFI9KHRoaXMud2lkdGgoKS1MLTIqdGhpcy5fdGV4dFBhZGRpbmcpLzI7dj1NYXRoLm1heCh0aGlzLndpZHRoKCktUi0yKkYtTCwwKTsKQz0xO3ZhciBVPWZ1bmN0aW9uKGJhLG1hKXtyZXR1cm4gdC5oZWlnaHQoKS0obWErMSl9O0gueUFsaWduPSJ0b3AiO0I9MDtQLnlBbGlnbj0iYm90dG9tIjtPPTA7aWYoImxlZnQiPT09dGhpcy5fb3JpZW50YXRpb24pe3ZhciBZPWZ1bmN0aW9uKCl7cmV0dXJuIEYrTCtGfTtILnhBbGlnbj0icmlnaHQiO0Q9LShSK3YrRik7UC54QWxpZ249InJpZ2h0IjtJPS0oUit2K0YpfWVsc2UgWT1mdW5jdGlvbigpe3JldHVybiBSfSxILnhBbGlnbj0ibGVmdCIsRD1SK3YrRixQLnhBbGlnbj0ibGVmdCIsST1SK3YrRjtLLndpZHRoPXY7Sy5oZWlnaHQ9TSpDfWVsc2UgUj1NYXRoLm1heChGLCh0aGlzLmhlaWdodCgpLUMpLzIpLE09TWF0aC5tYXgoTWF0aC5mbG9vcih0aGlzLndpZHRoKCktNCpGLXotdiksMCksdj0xLEM9TWF0aC5tYXgodGhpcy5oZWlnaHQoKS0yKlIsMCksWT1mdW5jdGlvbihiYSxtYSl7cmV0dXJuIE1hdGguZmxvb3IoeisyKkYpK21hfSxVPWZ1bmN0aW9uKCl7cmV0dXJuIFJ9LApILnhBbGlnbj0icmlnaHQiLEQ9LUYsUC54QWxpZ249ImxlZnQiLEk9RixLLnk9UixLLndpZHRoPU0qdixLLmhlaWdodD1DO0sueD1ZKG51bGwsMCk7dGhpcy5fdXBwZXJMYWJlbC50ZXh0KCIiKTt0aGlzLl93cml0ZXIud3JpdGUoeCx0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSxILHRoaXMuX3VwcGVyTGFiZWwubm9kZSgpKTt0aGlzLl91cHBlckxhYmVsLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0QrIiwgIitCKyIpIik7dGhpcy5fbG93ZXJMYWJlbC50ZXh0KCIiKTt0aGlzLl93cml0ZXIud3JpdGUoeSx0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSxQLHRoaXMuX2xvd2VyTGFiZWwubm9kZSgpKTt0aGlzLl9sb3dlckxhYmVsLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0krIiwgIitPKyIpIik7dGhpcy5fc3dhdGNoQm91bmRpbmdCb3guYXR0cnMoSyk7eT10aGlzLl9nZW5lcmF0ZVRpY2tzKE0pO3k9dGhpcy5fc3dhdGNoQ29udGFpbmVyLnNlbGVjdEFsbCgicmVjdC5zd2F0Y2giKS5kYXRhKHkpOwp4PXkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5jbGFzc2VkKCJzd2F0Y2giLCEwKTtEPXkubWVyZ2UoeCk7eS5leGl0KCkucmVtb3ZlKCk7RC5hdHRycyh7ZmlsbDpmdW5jdGlvbihiYSl7cmV0dXJuIHQuX3NjYWxlLnNjYWxlKGJhKX0sd2lkdGg6dixoZWlnaHQ6Qyx4OlkseTpVLCJzaGFwZS1yZW5kZXJpbmciOiJjcmlzcEVkZ2VzIn0pO2suQUREX1RJVExFX0VMRU1FTlRTJiZ4LmFwcGVuZCgidGl0bGUiKS50ZXh0KGZ1bmN0aW9uKGJhKXtyZXR1cm4gdC5fZm9ybWF0dGVyKGJhKX0pO3JldHVybiB0aGlzfTtyZXR1cm4gcn0oZig0KS5Db21wb25lbnQpO2MuX0RFRkFVTFRfTlVNX1NXQVRDSEVTPTExO2MuTEVHRU5EX0xBQkVMX0NMQVNTPSJsZWdlbmQtbGFiZWwiO2QuSW50ZXJwb2xhdGVkQ29sb3JMZWdlbmQ9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihrLG4pe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPWt9Zm9yKHZhciBxIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShxKSYmCihrW3FdPW5bcV0pO2sucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHAucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyBwKX0sbD1mKDUpO2M9ZnVuY3Rpb24oayl7ZnVuY3Rpb24gbihwLHEpe3ZvaWQgMD09PXAmJihwPSIiKTt2b2lkIDA9PT1xJiYocT0wKTt2YXIgcj1rLmNhbGwodGhpcyl8fHRoaXM7ci5hZGRDbGFzcygibGFiZWwiKTtyLnRleHQocCk7ci5hbmdsZShxKTtyLnhBbGlnbm1lbnQoImNlbnRlciIpLnlBbGlnbm1lbnQoImNlbnRlciIpO3IuX3BhZGRpbmc9MDtyZXR1cm4gcn1nKG4sayk7bi5wcm90b3R5cGUucmVxdWVzdGVkU3BhY2U9ZnVuY3Rpb24oKXt2YXIgcD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKHRoaXMuX3RleHQpLHE9KDA9PT10aGlzLmFuZ2xlKCk/cC53aWR0aDpwLmhlaWdodCkrMip0aGlzLnBhZGRpbmcoKTtwPSgwPT09dGhpcy5hbmdsZSgpP3AuaGVpZ2h0OnAud2lkdGgpKzIqdGhpcy5wYWRkaW5nKCk7cmV0dXJue21pbldpZHRoOnEsCm1pbkhlaWdodDpwfX07bi5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7ay5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fdGV4dENvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKTt2YXIgcD1uZXcgbC5TdmdDb250ZXh0KHRoaXMuX3RleHRDb250YWluZXIubm9kZSgpKTt0aGlzLl9tZWFzdXJlcj1uZXcgbC5DYWNoZU1lYXN1cmVyKHApO3RoaXMuX3dyYXBwZXI9bmV3IGwuV3JhcHBlcjt0aGlzLl93cml0ZXI9bmV3IGwuV3JpdGVyKHRoaXMuX21lYXN1cmVyLHAsdGhpcy5fd3JhcHBlcik7dGhpcy50ZXh0KHRoaXMuX3RleHQpfTtuLnByb3RvdHlwZS50ZXh0PWZ1bmN0aW9uKHApe2lmKG51bGw9PXApcmV0dXJuIHRoaXMuX3RleHQ7aWYoInN0cmluZyIhPT10eXBlb2YgcCl0aHJvdyBFcnJvcigiTGFiZWwudGV4dCgpIG9ubHkgdGFrZXMgc3RyaW5ncyBhcyBpbnB1dCIpO3RoaXMuX3RleHQ9cDt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtuLnByb3RvdHlwZS5hbmdsZT0KZnVuY3Rpb24ocCl7aWYobnVsbD09cClyZXR1cm4gdGhpcy5fYW5nbGU7cCU9MzYwOzE4MDxwP3AtPTM2MDotMTgwPnAmJihwKz0zNjApO2lmKC05MD09PXB8fDA9PT1wfHw5MD09PXApdGhpcy5fYW5nbGU9cDtlbHNlIHRocm93IEVycm9yKHArIiBpcyBub3QgYSB2YWxpZCBhbmdsZSBmb3IgTGFiZWwiKTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtuLnByb3RvdHlwZS5wYWRkaW5nPWZ1bmN0aW9uKHApe2lmKG51bGw9PXApcmV0dXJuIHRoaXMuX3BhZGRpbmc7cD0rcDtpZigwPnApdGhyb3cgRXJyb3IocCsiIGlzIG5vdCBhIHZhbGlkIHBhZGRpbmcgdmFsdWUuIENhbm5vdCBiZSBsZXNzIHRoYW4gMC4iKTt0aGlzLl9wYWRkaW5nPXA7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307bi5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiEwfTtuLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiEwfTtuLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT0KZnVuY3Rpb24oKXtrLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3RoaXMuX3RleHRDb250YWluZXIuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCk7dmFyIHA9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSh0aGlzLl90ZXh0KSxxPU1hdGgubWF4KE1hdGgubWluKCh0aGlzLmhlaWdodCgpLXAuaGVpZ2h0KS8yLHRoaXMucGFkZGluZygpKSwwKTtwPU1hdGgubWF4KE1hdGgubWluKCh0aGlzLndpZHRoKCktcC53aWR0aCkvMix0aGlzLnBhZGRpbmcoKSksMCk7dGhpcy5fdGV4dENvbnRhaW5lci5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitwKyIsIitxKyIpIik7cD10aGlzLndpZHRoKCktMipwO3E9dGhpcy5oZWlnaHQoKS0yKnE7dmFyIHI9e3hBbGlnbjp0aGlzLnhBbGlnbm1lbnQoKSx5QWxpZ246dGhpcy55QWxpZ25tZW50KCksdGV4dFJvdGF0aW9uOnRoaXMuYW5nbGUoKX07dGhpcy5fd3JpdGVyLndyaXRlKHRoaXMuX3RleHQscCxxLHIpO3JldHVybiB0aGlzfTsKbi5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7ay5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyk7dGhpcy5fbWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIG59KGYoNCkuQ29tcG9uZW50KTtkLkxhYmVsPWM7Zj1mdW5jdGlvbihrKXtmdW5jdGlvbiBuKHAscSl7cD1rLmNhbGwodGhpcyxwLHEpfHx0aGlzO3AuYWRkQ2xhc3Mobi5USVRMRV9MQUJFTF9DTEFTUyk7cmV0dXJuIHB9ZyhuLGspO3JldHVybiBufShjKTtmLlRJVExFX0xBQkVMX0NMQVNTPSJ0aXRsZS1sYWJlbCI7ZC5UaXRsZUxhYmVsPWY7Yz1mdW5jdGlvbihrKXtmdW5jdGlvbiBuKHAscSl7cD1rLmNhbGwodGhpcyxwLHEpfHx0aGlzO3AuYWRkQ2xhc3Mobi5BWElTX0xBQkVMX0NMQVNTKTtyZXR1cm4gcH1nKG4sayk7cmV0dXJuIG59KGMpO2MuQVhJU19MQUJFTF9DTEFTUz0iYXhpcy1sYWJlbCI7ZC5BeGlzTGFiZWw9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHwKZnVuY3Rpb24oeSx6KXtmdW5jdGlvbiB4KCl7dGhpcy5jb25zdHJ1Y3Rvcj15fWZvcih2YXIgQyBpbiB6KXouaGFzT3duUHJvcGVydHkoQykmJih5W0NdPXpbQ10pO3kucHJvdG90eXBlPW51bGw9PT16P09iamVjdC5jcmVhdGUoeik6KHgucHJvdG90eXBlPXoucHJvdG90eXBlLG5ldyB4KX0sbD1mKDEpLGs9Zig1KSxuPWYoMjMpLHA9Zig4KSxxPWYoMzEpLHI9ZigwKTtjPWYoNCk7dmFyIHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB5KHoseCxDKXt2b2lkIDA9PT16JiYoej1bXSk7dm9pZCAwPT09eCYmKHg9MCk7dm9pZCAwPT09QyYmKEM9SW5maW5pdHkpO3RoaXMuY29sdW1ucz16O3RoaXMuYm90dG9tUGFkZGluZz14O3RoaXMubWF4V2lkdGg9Q315LnByb3RvdHlwZS5hZGRDb2x1bW49ZnVuY3Rpb24oeil7dmFyIHg9ei53aWR0aCxDPXRoaXMuZ2V0V2lkdGhBdmFpbGFibGUoKTt6LndpZHRoPU1hdGgubWluKEMseCk7dGhpcy5jb2x1bW5zLnB1c2goeil9O3kucHJvdG90eXBlLmdldEJvdW5kcz0KZnVuY3Rpb24oeil7Zm9yKHZhciB4PXRoaXMuY29sdW1uc1t6XSxDPTAsRj0wO0Y8ejtGKyspQys9dGhpcy5jb2x1bW5zW0ZdLndpZHRoO3JldHVybnt0b3BMZWZ0Ont4OkMseTowfSxib3R0b21SaWdodDp7eDpDK3gud2lkdGgseTp4LmhlaWdodH19fTt5LnByb3RvdHlwZS5nZXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gci5NYXRoLm1heCh0aGlzLmNvbHVtbnMubWFwKGZ1bmN0aW9uKHope3JldHVybiB6LmhlaWdodH0pLDApK3RoaXMuYm90dG9tUGFkZGluZ307eS5wcm90b3R5cGUuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4odGhpcy5jb2x1bW5zLnJlZHVjZShmdW5jdGlvbih6LHgpe3JldHVybiB6K3gud2lkdGh9LDApLHRoaXMubWF4V2lkdGgpfTt5LnByb3RvdHlwZS5nZXRXaWR0aEF2YWlsYWJsZT1mdW5jdGlvbigpe3ZhciB6PXRoaXMuZ2V0V2lkdGgoKTtyZXR1cm4gTWF0aC5tYXgodGhpcy5tYXhXaWR0aC16LDApfTtyZXR1cm4geX0oKSx2PWZ1bmN0aW9uKCl7ZnVuY3Rpb24geSh6LAp4LEMsRil7dm9pZCAwPT09eiYmKHo9SW5maW5pdHkpO3ZvaWQgMD09PXgmJih4PUluZmluaXR5KTt2b2lkIDA9PT1DJiYoQz0wKTt2b2lkIDA9PT1GJiYoRj1bXSk7dGhpcy5tYXhXaWR0aD16O3RoaXMubWF4SGVpZ2h0PXg7dGhpcy5wYWRkaW5nPUM7dGhpcy5yb3dzPUZ9eS5wcm90b3R5cGUuYWRkUm93PWZ1bmN0aW9uKHope3oubWF4V2lkdGg9dGhpcy5tYXhXaWR0aC0yKnRoaXMucGFkZGluZzt0aGlzLnJvd3MucHVzaCh6KX07eS5wcm90b3R5cGUuZ2V0Q29sdW1uQm91bmRzPWZ1bmN0aW9uKHoseCl7dmFyIEM9dGhpcy5nZXRSb3dCb3VuZHMoeik7ej10aGlzLnJvd3Nbel0uZ2V0Qm91bmRzKHgpO3oudG9wTGVmdC54Kz1DLnRvcExlZnQueDt6LmJvdHRvbVJpZ2h0LngrPUMudG9wTGVmdC54O3oudG9wTGVmdC55Kz1DLnRvcExlZnQueTt6LmJvdHRvbVJpZ2h0LnkrPUMudG9wTGVmdC55O3JldHVybiB6fTt5LnByb3RvdHlwZS5nZXRSb3dCb3VuZHM9ZnVuY3Rpb24oeil7Zm9yKHZhciB4PQp0aGlzLnBhZGRpbmcsQz10aGlzLnBhZGRpbmcsRj0wO0Y8ejtGKyspQys9dGhpcy5yb3dzW0ZdLmdldEhlaWdodCgpO3JldHVybnt0b3BMZWZ0Ont4LHk6Q30sYm90dG9tUmlnaHQ6e3g6eCt0aGlzLnJvd3Nbel0uZ2V0V2lkdGgoKSx5OkMrdGhpcy5yb3dzW3pdLmdldEhlaWdodCgpfX19O3kucHJvdG90eXBlLmdldEhlaWdodD1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1pbih0aGlzLnJvd3MucmVkdWNlKGZ1bmN0aW9uKHoseCl7cmV0dXJuIHoreC5nZXRIZWlnaHQoKX0sMCkrMip0aGlzLnBhZGRpbmcsdGhpcy5tYXhIZWlnaHQpfTt5LnByb3RvdHlwZS5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1pbihyLk1hdGgubWF4KHRoaXMucm93cy5tYXAoZnVuY3Rpb24oeil7cmV0dXJuIHouZ2V0V2lkdGgoKX0pLDApKzIqdGhpcy5wYWRkaW5nLHRoaXMubWF4V2lkdGgpfTtyZXR1cm4geX0oKTtjPWZ1bmN0aW9uKHkpe2Z1bmN0aW9uIHooeCl7dmFyIEM9eS5jYWxsKHRoaXMpfHwKdGhpcztDLl9wYWRkaW5nPTU7Qy5fcm93Qm90dG9tUGFkZGluZz0zO0MuYWRkQ2xhc3MoImxlZ2VuZCIpO0MubWF4RW50cmllc1BlclJvdygxKTtpZihudWxsPT14KXRocm93IEVycm9yKCJMZWdlbmQgcmVxdWlyZXMgYSBjb2xvclNjYWxlIik7Qy5fY29sb3JTY2FsZT14O0MuX3JlZHJhd0NhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIEMucmVkcmF3KCl9O0MuX2NvbG9yU2NhbGUub25VcGRhdGUoQy5fcmVkcmF3Q2FsbGJhY2spO0MuX2Zvcm1hdHRlcj1wLmlkZW50aXR5KCk7Qy5tYXhMaW5lc1BlckVudHJ5KDEpO0MueEFsaWdubWVudCgicmlnaHQiKS55QWxpZ25tZW50KCJ0b3AiKTtDLmNvbXBhcmF0b3IoZnVuY3Rpb24oRixEKXt2YXIgQj1DLl9jb2xvclNjYWxlLmRvbWFpbigpLnNsaWNlKCkubWFwKGZ1bmN0aW9uKEkpe3JldHVybiBDLl9mb3JtYXR0ZXIoSSl9KTtyZXR1cm4gQi5pbmRleE9mKEYpLUIuaW5kZXhPZihEKX0pO0MuX3N5bWJvbEZhY3RvcnlBY2Nlc3Nvcj1mdW5jdGlvbigpe3JldHVybiBxLmNpcmNsZSgpfTsKQy5fc3ltYm9sT3BhY2l0eUFjY2Vzc29yPWZ1bmN0aW9uKCl7cmV0dXJuIDF9O3JldHVybiBDfWcoeix5KTt6LnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt5LnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt2YXIgeD10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKHouTEVHRU5EX1JPV19DTEFTUywhMCk7eC5hcHBlbmQoImciKS5jbGFzc2VkKHouTEVHRU5EX0VOVFJZX0NMQVNTLCEwKS5hcHBlbmQoInRleHQiKTt4PW5ldyBrLlN2Z0NvbnRleHQoeC5ub2RlKCksbnVsbCxuLkFERF9USVRMRV9FTEVNRU5UUyk7dGhpcy5fbWVhc3VyZXI9bmV3IGsuQ2FjaGVNZWFzdXJlcih4KTt0aGlzLl93cmFwcGVyPShuZXcgay5XcmFwcGVyKS5tYXhMaW5lcyh0aGlzLm1heExpbmVzUGVyRW50cnkoKSk7dGhpcy5fd3JpdGVyPW5ldyBrLldyaXRlcih0aGlzLl9tZWFzdXJlcix4LHRoaXMuX3dyYXBwZXIpfTt6LnByb3RvdHlwZS5mb3JtYXR0ZXI9ZnVuY3Rpb24oeCl7aWYobnVsbD09CngpcmV0dXJuIHRoaXMuX2Zvcm1hdHRlcjt0aGlzLl9mb3JtYXR0ZXI9eDt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt6LnByb3RvdHlwZS5tYXhFbnRyaWVzUGVyUm93PWZ1bmN0aW9uKHgpe2lmKG51bGw9PXgpcmV0dXJuIHRoaXMuX21heEVudHJpZXNQZXJSb3c7dGhpcy5fbWF4RW50cmllc1BlclJvdz14O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3oucHJvdG90eXBlLm1heExpbmVzUGVyRW50cnk9ZnVuY3Rpb24oeCl7aWYobnVsbD09eClyZXR1cm4gdGhpcy5fbWF4TGluZXNQZXJFbnRyeTt0aGlzLl9tYXhMaW5lc1BlckVudHJ5PXg7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307ei5wcm90b3R5cGUubWF4V2lkdGg9ZnVuY3Rpb24oeCl7aWYobnVsbD09eClyZXR1cm4gdGhpcy5fbWF4V2lkdGg7dGhpcy5fbWF4V2lkdGg9eDt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt6LnByb3RvdHlwZS5jb21wYXJhdG9yPWZ1bmN0aW9uKHgpe251bGwhPXgmJih0aGlzLl9jb21wYXJhdG9yPQp4LHRoaXMucmVkcmF3KCkpfTt6LnByb3RvdHlwZS5jb2xvclNjYWxlPWZ1bmN0aW9uKHgpe3JldHVybiBudWxsIT14Pyh0aGlzLl9jb2xvclNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZWRyYXdDYWxsYmFjayksdGhpcy5fY29sb3JTY2FsZT14LHRoaXMuX2NvbG9yU2NhbGUub25VcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spLHRoaXMucmVkcmF3KCksdGhpcyk6dGhpcy5fY29sb3JTY2FsZX07ei5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3kucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9jb2xvclNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZWRyYXdDYWxsYmFjayl9O3oucHJvdG90eXBlLl9idWlsZExlZ2VuZFRhYmxlPWZ1bmN0aW9uKHgsQyl7dmFyIEY9dGhpcyxEPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQsQj1uZXcgdih4LEMsdGhpcy5fcGFkZGluZyk7eD10aGlzLl9jb2xvclNjYWxlLmRvbWFpbigpLnNsaWNlKCkuc29ydChmdW5jdGlvbihPLApQKXtyZXR1cm4gRi5fY29tcGFyYXRvcihGLl9mb3JtYXR0ZXIoTyksRi5fZm9ybWF0dGVyKFApKX0pO3ZhciBJPW5ldyB0O0IuYWRkUm93KEkpO0kuYm90dG9tUGFkZGluZz10aGlzLl9yb3dCb3R0b21QYWRkaW5nO3guZm9yRWFjaChmdW5jdGlvbihPKXtJLmNvbHVtbnMubGVuZ3RoLzI9PT1GLm1heEVudHJpZXNQZXJSb3coKSYmKEk9bmV3IHQsSS5ib3R0b21QYWRkaW5nPUYuX3Jvd0JvdHRvbVBhZGRpbmcsQi5hZGRSb3coSSkpO3ZhciBQPUkuZ2V0V2lkdGhBdmFpbGFibGUoKSxIPUYuX2Zvcm1hdHRlcihPKSxLPUYuX21lYXN1cmVyLm1lYXN1cmUoSCkud2lkdGg7MD5QLUQtSyYmMTxJLmNvbHVtbnMubGVuZ3RoJiYoST1uZXcgdCxJLmJvdHRvbVBhZGRpbmc9Ri5fcm93Qm90dG9tUGFkZGluZyxCLmFkZFJvdyhJKSk7SS5hZGRDb2x1bW4oe3dpZHRoOkQsaGVpZ2h0OkQsZGF0YTp7bmFtZTpPLHR5cGU6InN5bWJvbCJ9fSk7UD1JLmdldFdpZHRoQXZhaWxhYmxlKCk7UD1NYXRoLm1pbihQLApLKTtGLl93cmFwcGVyLm1heExpbmVzKEYubWF4TGluZXNQZXJFbnRyeSgpKTtIPUYuX3dyYXBwZXIud3JhcChILEYuX21lYXN1cmVyLFApLm5vTGluZXMqRDtJLmFkZENvbHVtbih7d2lkdGg6UCxoZWlnaHQ6SCxkYXRhOntuYW1lOk8sdHlwZToidGV4dCJ9fSl9KTtyZXR1cm4gQn07ei5wcm90b3R5cGUucmVxdWVzdGVkU3BhY2U9ZnVuY3Rpb24oeCxDKXt4PXRoaXMuX2J1aWxkTGVnZW5kVGFibGUoci5NYXRoLm1pbihbdGhpcy5tYXhXaWR0aCgpLHhdLHgpLEMpO3JldHVybnttaW5IZWlnaHQ6eC5nZXRIZWlnaHQoKSxtaW5XaWR0aDp4LmdldFdpZHRoKCl9fTt6LnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKHgpe3ZhciBDPXRoaXM7aWYoIXRoaXMuX2lzU2V0dXApcmV0dXJuW107dmFyIEY9dGhpcy5fYnVpbGRMZWdlbmRUYWJsZSh0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSk7cmV0dXJuIEYucm93cy5yZWR1Y2UoZnVuY3Rpb24oRCxCLEkpe2lmKDAhPT1ELmxlbmd0aClyZXR1cm4gRDsKdmFyIE89Ri5nZXRSb3dCb3VuZHMoSSk7cmV0dXJuIHIuTWF0aC53aXRoaW4oeCxPKT9CLmNvbHVtbnMucmVkdWNlKGZ1bmN0aW9uKFAsSCxLKXt2YXIgTT1GLmdldENvbHVtbkJvdW5kcyhJLEspO2lmKHIuTWF0aC53aXRoaW4oeCxNKSl7UD1DLmNvbnRlbnQoKS5zZWxlY3RBbGwoIi4iK3ouTEVHRU5EX1JPV19DTEFTUykubm9kZXMoKVtJXTtLPWwuc2VsZWN0KFApLnNlbGVjdEFsbCgiLiIrei5MRUdFTkRfRU5UUllfQ0xBU1MpLm5vZGVzKClbTWF0aC5mbG9vcihLLzIpXTt2YXIgTD1sLnNlbGVjdChLKS5zZWxlY3QoIi4iK3ouTEVHRU5EX1NZTUJPTF9DTEFTUyk7TT1yLkRPTS5nZXRUcmFuc2xhdGVWYWx1ZXMobC5zZWxlY3QoUCkpO0w9ci5ET00uZ2V0VHJhbnNsYXRlVmFsdWVzKEwpO3JldHVyblt7Ym91bmRzOnIuRE9NLmVsZW1lbnRCQm94KGwuc2VsZWN0KFApKSxkYXR1bTpILmRhdGEubmFtZSxwb3NpdGlvbjp7eDpNWzBdK0xbMF0seTpNWzFdK0xbMV19LHNlbGVjdGlvbjpsLnNlbGVjdChLKSwKY29tcG9uZW50OkN9XX1yZXR1cm4gUH0sRCk6RH0sW10pfTt6LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3kucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dmFyIHg9dGhpcy5fYnVpbGRMZWdlbmRUYWJsZSh0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSk7dGhpcy5jb250ZW50KCkuc2VsZWN0QWxsKCIqIikucmVtb3ZlKCk7dmFyIEM9dGhpcy5jb250ZW50KCkuc2VsZWN0QWxsKCJnLiIrei5MRUdFTkRfUk9XX0NMQVNTKS5kYXRhKHgucm93cyksRj1DLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCh6LkxFR0VORF9ST1dfQ0xBU1MsITApLm1lcmdlKEMpO0MuZXhpdCgpLnJlbW92ZSgpO0YuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihCLEkpe0I9eC5nZXRSb3dCb3VuZHMoSSk7cmV0dXJuInRyYW5zbGF0ZSgiK0IudG9wTGVmdC54KyIsICIrQi50b3BMZWZ0LnkrIikifSk7dmFyIEQ9dGhpcztGLmVhY2goZnVuY3Rpb24oQixJKXtmb3IodmFyIE89CltdLFA9MDtQPEIuY29sdW1ucy5sZW5ndGg7UCs9MilPLnB1c2goW0IuY29sdW1uc1tQXSxCLmNvbHVtbnNbUCsxXV0pO0I9bC5zZWxlY3QodGhpcykuc2VsZWN0QWxsKCJnLiIrei5MRUdFTkRfRU5UUllfQ0xBU1MpLmRhdGEoTyk7Tz1CLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCh6LkxFR0VORF9FTlRSWV9DTEFTUywhMCkubWVyZ2UoQik7Ty5hcHBlbmQoInBhdGgiKS5hdHRyKCJkIixmdW5jdGlvbihIKXtIPUhbMF07cmV0dXJuIEQuc3ltYm9sKCkoSC5kYXRhLm5hbWUsSSkoLjYqSC5oZWlnaHQpKG51bGwpfSkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihIKXtIPUhbMF07cmV0dXJuInRyYW5zbGF0ZSgiKyh4LmdldENvbHVtbkJvdW5kcyhJLHgucm93c1tJXS5jb2x1bW5zLmluZGV4T2YoSCkpLnRvcExlZnQueCtILndpZHRoLzIpKyIsICIrSC5oZWlnaHQvMisiKSJ9KS5hdHRyKCJmaWxsIixmdW5jdGlvbihIKXtyZXR1cm4gRC5fY29sb3JTY2FsZS5zY2FsZShIWzBdLmRhdGEubmFtZSl9KS5hdHRyKCJvcGFjaXR5IiwKZnVuY3Rpb24oSCl7cmV0dXJuIEQuc3ltYm9sT3BhY2l0eSgpKEhbMF0uZGF0YS5uYW1lLEkpfSkuY2xhc3NlZCh6LkxFR0VORF9TWU1CT0xfQ0xBU1MsITApO08uYXBwZW5kKCJnIikuY2xhc3NlZCgidGV4dC1jb250YWluZXIiLCEwKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKEgpe3JldHVybiJ0cmFuc2xhdGUoIit4LmdldENvbHVtbkJvdW5kcyhJLHgucm93c1tJXS5jb2x1bW5zLmluZGV4T2YoSFsxXSkpLnRvcExlZnQueCsiLCAwKSJ9KS5lYWNoKGZ1bmN0aW9uKEgpe3ZhciBLPWwuc2VsZWN0KHRoaXMpO0g9SFsxXTtELl93cml0ZXIud3JpdGUoRC5fZm9ybWF0dGVyKEguZGF0YS5uYW1lKSxILndpZHRoLEQuaGVpZ2h0KCkse3hBbGlnbjoibGVmdCIseUFsaWduOiJ0b3AiLHRleHRSb3RhdGlvbjowfSxLLm5vZGUoKSl9KTtCLmV4aXQoKS5yZW1vdmUoKX0pO3JldHVybiB0aGlzfTt6LnByb3RvdHlwZS5zeW1ib2w9ZnVuY3Rpb24oeCl7aWYobnVsbD09eClyZXR1cm4gdGhpcy5fc3ltYm9sRmFjdG9yeUFjY2Vzc29yOwp0aGlzLl9zeW1ib2xGYWN0b3J5QWNjZXNzb3I9eDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt6LnByb3RvdHlwZS5zeW1ib2xPcGFjaXR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3N5bWJvbE9wYWNpdHlBY2Nlc3Nvcn07ei5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiEwfTt6LnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiEwfTt6LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gen0oYy5Db21wb25lbnQpO2MuTEVHRU5EX1JPV19DTEFTUz0ibGVnZW5kLXJvdyI7Yy5MRUdFTkRfRU5UUllfQ0xBU1M9ImxlZ2VuZC1lbnRyeSI7Yy5MRUdFTkRfU1lNQk9MX0NMQVNTPSJsZWdlbmQtc3ltYm9sIjtkLkxlZ2VuZD1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG4scCl7ZnVuY3Rpb24gcSgpe3RoaXMuY29uc3RydWN0b3I9Cm59Zm9yKHZhciByIGluIHApcC5oYXNPd25Qcm9wZXJ0eShyKSYmKG5bcl09cFtyXSk7bi5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToocS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IHEpfSxsPWYoMiksaz1mKDApO2M9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcCgpe3JldHVybiBudWxsIT09biYmbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9ZyhwLG4pO3AucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24ocSl7dmFyIHIsdD1JbmZpbml0eTt0aGlzLmNvbXBvbmVudHMoKS5mb3JFYWNoKGZ1bmN0aW9uKHYpe3Y9di5lbnRpdHlOZWFyZXN0KHEpO2lmKG51bGwhPXYpe3ZhciB5PWsuTWF0aC5kaXN0YW5jZVNxdWFyZWQodi5wb3NpdGlvbixxKTt5PD10JiYodD15LHI9dil9fSk7cmV0dXJuIHJ9O3AucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbihxKXtpZihudWxsIT1xJiYhKHEgaW5zdGFuY2VvZiBsLlBsb3QpKXRocm93IEVycm9yKCJQbG90IEdyb3VwIG9ubHkgYWNjZXB0cyBwbG90cyIpOwpuLnByb3RvdHlwZS5hcHBlbmQuY2FsbCh0aGlzLHEpO3JldHVybiB0aGlzfTtyZXR1cm4gcH0oZig0MSkuR3JvdXApO2QuUGxvdEdyb3VwPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixwKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgciBpbiBwKXAuaGFzT3duUHJvcGVydHkocikmJihuW3JdPXBbcl0pO24ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX0sbD1mKDEpLGs9ZigwKTtjPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHAocSl7dm9pZCAwPT09cSYmKHE9W10pO3ZhciByPW4uY2FsbCh0aGlzKXx8dGhpcztyLl9yb3dQYWRkaW5nPTA7ci5fY29sdW1uUGFkZGluZz0wO3IuX3Jvd3M9W107ci5fcm93V2VpZ2h0cz1bXTtyLl9jb2x1bW5XZWlnaHRzPVtdO3IuX25Sb3dzPTA7ci5fbkNvbHM9MDtyLl9jYWxjdWxhdGVkTGF5b3V0PQpudWxsO3IuYWRkQ2xhc3MoInRhYmxlIik7cS5mb3JFYWNoKGZ1bmN0aW9uKHQsdil7dC5mb3JFYWNoKGZ1bmN0aW9uKHkseil7bnVsbCE9eSYmci5hZGQoeSx2LHopfSl9KTtyZXR1cm4gcn1nKHAsbik7cC5wcm90b3R5cGUuX2ZvckVhY2g9ZnVuY3Rpb24ocSl7Zm9yKHZhciByPTA7cjx0aGlzLl9uUm93cztyKyspZm9yKHZhciB0PTA7dDx0aGlzLl9uQ29sczt0KyspbnVsbCE9dGhpcy5fcm93c1tyXVt0XSYmcSh0aGlzLl9yb3dzW3JdW3RdKX07cC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHEpe2Zvcih2YXIgcj0wO3I8dGhpcy5fblJvd3M7cisrKWZvcih2YXIgdD0wO3Q8dGhpcy5fbkNvbHM7dCsrKWlmKHRoaXMuX3Jvd3Nbcl1bdF09PT1xKXJldHVybiEwO3JldHVybiExfTtwLnByb3RvdHlwZS5jb21wb25lbnRBdD1mdW5jdGlvbihxKXtyZXR1cm4gMD49dGhpcy5fblJvd3N8fDA+cXx8cT49dGhpcy5fbkNvbHM/bnVsbDp0aGlzLl9yb3dzWzBdW3FdfTtwLnByb3RvdHlwZS5hZGQ9CmZ1bmN0aW9uKHEscix0KXtpZihudWxsPT1xKXRocm93IEVycm9yKCJDYW5ub3QgYWRkIG51bGwgdG8gYSB0YWJsZSBjZWxsIik7aWYoIXRoaXMuaGFzKHEpKXtpZihudWxsIT0odGhpcy5fcm93c1tyXSYmdGhpcy5fcm93c1tyXVt0XSkpdGhyb3cgRXJyb3IoImNlbGwgaXMgb2NjdXBpZWQiKTtxLmRldGFjaCgpO3RoaXMuX25Sb3dzPU1hdGgubWF4KHIrMSx0aGlzLl9uUm93cyk7dGhpcy5fbkNvbHM9TWF0aC5tYXgodCsxLHRoaXMuX25Db2xzKTt0aGlzLl9wYWRUYWJsZVRvU2l6ZSh0aGlzLl9uUm93cyx0aGlzLl9uQ29scyk7dGhpcy5fcm93c1tyXVt0XT1xO3RoaXMuX2Fkb3B0QW5kQW5jaG9yKHEpO3RoaXMucmVkcmF3KCl9cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLl9yZW1vdmU9ZnVuY3Rpb24ocSl7Zm9yKHZhciByPTA7cjx0aGlzLl9uUm93cztyKyspZm9yKHZhciB0PTA7dDx0aGlzLl9uQ29sczt0KyspaWYodGhpcy5fcm93c1tyXVt0XT09PXEpe3RoaXMuX3Jvd3Nbcl1bdF09Cm51bGw7cmV0dXJufX07cC5wcm90b3R5cGUuX2l0ZXJhdGVMYXlvdXQ9ZnVuY3Rpb24ocSxyLHQpe3ZvaWQgMD09PXQmJih0PSExKTt2YXIgdj10aGlzLl9yb3dzLHk9bC50cmFuc3Bvc2UodGhpcy5fcm93cyk7cS09dGhpcy5fY29sdW1uUGFkZGluZyoodGhpcy5fbkNvbHMtMSk7ci09dGhpcy5fcm93UGFkZGluZyoodGhpcy5fblJvd3MtMSk7dj1wLl9jYWxjQ29tcG9uZW50V2VpZ2h0cyh0aGlzLl9yb3dXZWlnaHRzLHYsZnVuY3Rpb24oTCl7cmV0dXJuIG51bGw9PUx8fEwuZml4ZWRIZWlnaHQoKX0pO3k9cC5fY2FsY0NvbXBvbmVudFdlaWdodHModGhpcy5fY29sdW1uV2VpZ2h0cyx5LGZ1bmN0aW9uKEwpe3JldHVybiBudWxsPT1MfHxMLmZpeGVkV2lkdGgoKX0pO3ZhciB6PXkubWFwKGZ1bmN0aW9uKEwpe3JldHVybiAwPT09TD8uNTpMfSkseD12Lm1hcChmdW5jdGlvbihMKXtyZXR1cm4gMD09PUw/LjU6TH0pO3o9cC5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKHoscSk7dmFyIEM9cC5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKHgsCnIpLEY9ay5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSgwLHRoaXMuX25Db2xzKSxEPWsuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCx0aGlzLl9uUm93cyk7eD0wO2Zvcih2YXIgQixJLE87Oyl7RD1rLkFycmF5LmFkZChELEMpO3o9ay5BcnJheS5hZGQoRix6KTtCPXRoaXMuX2RldGVybWluZUd1YXJhbnRlZXMoeixELHQpO0Y9Qi5ndWFyYW50ZWVkV2lkdGhzO0Q9Qi5ndWFyYW50ZWVkSGVpZ2h0cztJPUIud2FudHNXaWR0aEFyci5zb21lKGZ1bmN0aW9uKEwpe3JldHVybiBMfSk7Tz1CLndhbnRzSGVpZ2h0QXJyLnNvbWUoZnVuY3Rpb24oTCl7cmV0dXJuIEx9KTt2YXIgUD1LLEg9TTt2YXIgSz1xLWwuc3VtKEIuZ3VhcmFudGVlZFdpZHRocyk7dmFyIE09ci1sLnN1bShCLmd1YXJhbnRlZWRIZWlnaHRzKTt6PXZvaWQgMDtJPyh6PUIud2FudHNXaWR0aEFyci5tYXAoZnVuY3Rpb24oTCl7cmV0dXJuIEw/LjE6MH0pLHo9ay5BcnJheS5hZGQoeix5KSk6ej15O0M9dm9pZCAwO08/KEM9Qi53YW50c0hlaWdodEFyci5tYXAoZnVuY3Rpb24oTCl7cmV0dXJuIEw/Ci4xOjB9KSxDPWsuQXJyYXkuYWRkKEMsdikpOkM9djt6PXAuX2NhbGNQcm9wb3J0aW9uYWxTcGFjZSh6LEspO0M9cC5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKEMsTSk7eCsrO0g9MDxNJiZNIT09SDtpZighKDA8SyYmSyE9PVB8fEgpKWJyZWFrO2lmKDU8eClicmVha31LPXEtbC5zdW0oQi5ndWFyYW50ZWVkV2lkdGhzKTtNPXItbC5zdW0oQi5ndWFyYW50ZWVkSGVpZ2h0cyk7ej1wLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UoeSxLKTtDPXAuX2NhbGNQcm9wb3J0aW9uYWxTcGFjZSh2LE0pO3JldHVybntjb2xQcm9wb3J0aW9uYWxTcGFjZTp6LHJvd1Byb3BvcnRpb25hbFNwYWNlOkMsZ3VhcmFudGVlZFdpZHRoczpCLmd1YXJhbnRlZWRXaWR0aHMsZ3VhcmFudGVlZEhlaWdodHM6Qi5ndWFyYW50ZWVkSGVpZ2h0cyx3YW50c1dpZHRoOkksd2FudHNIZWlnaHQ6T319O3AucHJvdG90eXBlLl9kZXRlcm1pbmVHdWFyYW50ZWVzPWZ1bmN0aW9uKHEscix0KXt2b2lkIDA9PT10JiYodD0hMSk7dmFyIHY9CmsuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCx0aGlzLl9uQ29scykseT1rLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KDAsdGhpcy5fblJvd3MpLHo9ay5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSghMSx0aGlzLl9uQ29scykseD1rLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KCExLHRoaXMuX25Sb3dzKTt0aGlzLl9yb3dzLmZvckVhY2goZnVuY3Rpb24oQyxGKXtDLmZvckVhY2goZnVuY3Rpb24oRCxCKXtEPW51bGwhPUQ/RC5yZXF1ZXN0ZWRTcGFjZShxW0JdLHJbRl0pOnttaW5XaWR0aDowLG1pbkhlaWdodDowfTt2W0JdPU1hdGgubWF4KHZbQl0sdD9NYXRoLm1pbihELm1pbldpZHRoLHFbQl0pOkQubWluV2lkdGgpO3lbRl09TWF0aC5tYXgoeVtGXSx0P01hdGgubWluKEQubWluSGVpZ2h0LHJbRl0pOkQubWluSGVpZ2h0KTt2YXIgST1ELm1pbldpZHRoPnFbQl07eltCXT16W0JdfHxJO0I9RC5taW5IZWlnaHQ+cltGXTt4W0ZdPXhbRl18fEJ9KX0pO3JldHVybntndWFyYW50ZWVkV2lkdGhzOnYsCmd1YXJhbnRlZWRIZWlnaHRzOnksd2FudHNXaWR0aEFycjp6LHdhbnRzSGVpZ2h0QXJyOnh9fTtwLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbihxLHIpe3RoaXMuX2NhbGN1bGF0ZWRMYXlvdXQ9dGhpcy5faXRlcmF0ZUxheW91dChxLHIpO3JldHVybnttaW5XaWR0aDpsLnN1bSh0aGlzLl9jYWxjdWxhdGVkTGF5b3V0Lmd1YXJhbnRlZWRXaWR0aHMpLG1pbkhlaWdodDpsLnN1bSh0aGlzLl9jYWxjdWxhdGVkTGF5b3V0Lmd1YXJhbnRlZWRIZWlnaHRzKX19O3AucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24ocSxyLHQpe3ZhciB2PXRoaXM7bi5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMscSxyLHQpO3E9bC5zdW0odGhpcy5fY2FsY3VsYXRlZExheW91dC5ndWFyYW50ZWVkV2lkdGhzKTtyPWwuc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZEhlaWdodHMpO3Q9dGhpcy5fY2FsY3VsYXRlZExheW91dDtpZihxPnRoaXMud2lkdGgoKXx8CnI+dGhpcy5oZWlnaHQoKSl0PXRoaXMuX2l0ZXJhdGVMYXlvdXQodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCksITApO3ZhciB5PTAsej1rLkFycmF5LmFkZCh0LnJvd1Byb3BvcnRpb25hbFNwYWNlLHQuZ3VhcmFudGVlZEhlaWdodHMpLHg9ay5BcnJheS5hZGQodC5jb2xQcm9wb3J0aW9uYWxTcGFjZSx0Lmd1YXJhbnRlZWRXaWR0aHMpO3RoaXMuX3Jvd3MuZm9yRWFjaChmdW5jdGlvbihDLEYpe3ZhciBEPTA7Qy5mb3JFYWNoKGZ1bmN0aW9uKEIsSSl7bnVsbCE9QiYmQi5jb21wdXRlTGF5b3V0KHt4OkQseX0seFtJXSx6W0ZdKTtEKz14W0ldK3YuX2NvbHVtblBhZGRpbmd9KTt5Kz16W0ZdK3YuX3Jvd1BhZGRpbmd9KTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUucm93UGFkZGluZz1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl9yb3dQYWRkaW5nO2lmKCFrLk1hdGguaXNWYWxpZE51bWJlcihxKXx8MD5xKXRocm93IEVycm9yKCJyb3dQYWRkaW5nIG11c3QgYmUgYSBub24tbmVnYXRpdmUgZmluaXRlIHZhbHVlIik7CnRoaXMuX3Jvd1BhZGRpbmc9cTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5jb2x1bW5QYWRkaW5nPWZ1bmN0aW9uKHEpe2lmKG51bGwhPXEpe2lmKCFrLk1hdGguaXNWYWxpZE51bWJlcihxKXx8MD5xKXRocm93IEVycm9yKCJjb2x1bW5QYWRkaW5nIG11c3QgYmUgYSBub24tbmVnYXRpdmUgZmluaXRlIHZhbHVlIik7dGhpcy5fY29sdW1uUGFkZGluZz1xO3RoaXMucmVkcmF3KCl9fTtwLnByb3RvdHlwZS5yb3dXZWlnaHQ9ZnVuY3Rpb24ocSxyKXtpZihudWxsPT1yKXJldHVybiB0aGlzLl9yb3dXZWlnaHRzW3FdO2lmKCFrLk1hdGguaXNWYWxpZE51bWJlcihyKXx8MD5yKXRocm93IEVycm9yKCJyb3dXZWlnaHQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgdmFsdWUiKTt0aGlzLl9yb3dXZWlnaHRzW3FdPXI7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuY29sdW1uV2VpZ2h0PWZ1bmN0aW9uKHEscil7aWYobnVsbD09cilyZXR1cm4gdGhpcy5fY29sdW1uV2VpZ2h0c1txXTsKaWYoIWsuTWF0aC5pc1ZhbGlkTnVtYmVyKHIpfHwwPnIpdGhyb3cgRXJyb3IoImNvbHVtbldlaWdodCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSB2YWx1ZSIpO3RoaXMuX2NvbHVtbldlaWdodHNbcV09cjt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7dmFyIHE9bC50cmFuc3Bvc2UodGhpcy5fcm93cyk7cmV0dXJuIHAuX2ZpeGVkU3BhY2UocSxmdW5jdGlvbihyKXtyZXR1cm4gbnVsbD09cnx8ci5maXhlZFdpZHRoKCl9KX07cC5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gcC5fZml4ZWRTcGFjZSh0aGlzLl9yb3dzLGZ1bmN0aW9uKHEpe3JldHVybiBudWxsPT1xfHxxLmZpeGVkSGVpZ2h0KCl9KX07cC5wcm90b3R5cGUuX3BhZFRhYmxlVG9TaXplPWZ1bmN0aW9uKHEscil7Zm9yKHZhciB0PTA7dDxxO3QrKyl7dm9pZCAwPT09dGhpcy5fcm93c1t0XSYmKHRoaXMuX3Jvd3NbdF09W10sCnRoaXMuX3Jvd1dlaWdodHNbdF09bnVsbCk7Zm9yKHZhciB2PTA7djxyO3YrKyl2b2lkIDA9PT10aGlzLl9yb3dzW3RdW3ZdJiYodGhpcy5fcm93c1t0XVt2XT1udWxsKX1mb3Iodj0wO3Y8cjt2Kyspdm9pZCAwPT09dGhpcy5fY29sdW1uV2VpZ2h0c1t2XSYmKHRoaXMuX2NvbHVtbldlaWdodHNbdl09bnVsbCl9O3AuX2NhbGNDb21wb25lbnRXZWlnaHRzPWZ1bmN0aW9uKHEscix0KXtyZXR1cm4gcS5tYXAoZnVuY3Rpb24odix5KXtyZXR1cm4gbnVsbCE9dj92OnJbeV0ubWFwKHQpLnJlZHVjZShmdW5jdGlvbih6LHgpe3JldHVybiB6JiZ4fSwhMCk/MDoxfSl9O3AuX2NhbGNQcm9wb3J0aW9uYWxTcGFjZT1mdW5jdGlvbihxLHIpe3ZhciB0PWwuc3VtKHEpO3JldHVybiAwPT09dD9rLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KDAscS5sZW5ndGgpOnEubWFwKGZ1bmN0aW9uKHYpe3JldHVybiByKnYvdH0pfTtwLl9maXhlZFNwYWNlPWZ1bmN0aW9uKHEscil7ZnVuY3Rpb24gdCh2KXtyZXR1cm4gdi5yZWR1Y2UoZnVuY3Rpb24oeSwKeil7cmV0dXJuIHkmJnp9LCEwKX1yZXR1cm4gdChxLm1hcChmdW5jdGlvbih2KXtyZXR1cm4gdCh2Lm1hcChyKSl9KSl9O3JldHVybiBwfShmKDI5KS5Db21wb25lbnRDb250YWluZXIpO2QuVGFibGU9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLGspe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBwIGluIGspay5oYXNPd25Qcm9wZXJ0eShwKSYmKGxbcF09a1twXSk7bC5wcm90b3R5cGU9bnVsbD09PWs/T2JqZWN0LmNyZWF0ZShrKToobi5wcm90b3R5cGU9ay5wcm90b3R5cGUsbmV3IG4pfTtjPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIGsoKXt2YXIgbj1sLmNhbGwodGhpcyl8fHRoaXM7bi5hZGRDbGFzcygieC1kcmFnLWJveC1sYXllciIpO24uX2hhc0Nvcm5lcnM9ITE7cmV0dXJuIG59ZyhrLGwpO2sucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24obixwLHEpe2wucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLApuLHAscSk7dGhpcy5fc2V0Qm91bmRzKHRoaXMuYm91bmRzKCkpO3JldHVybiB0aGlzfTtrLnByb3RvdHlwZS5fc2V0Qm91bmRzPWZ1bmN0aW9uKG4pe2wucHJvdG90eXBlLl9zZXRCb3VuZHMuY2FsbCh0aGlzLHt0b3BMZWZ0Ont4Om4udG9wTGVmdC54LHk6MH0sYm90dG9tUmlnaHQ6e3g6bi5ib3R0b21SaWdodC54LHk6dGhpcy5oZWlnaHQoKX19KX07ay5wcm90b3R5cGUuX3NldFJlc2l6YWJsZUNsYXNzZXM9ZnVuY3Rpb24obil7biYmdGhpcy5lbmFibGVkKCk/dGhpcy5hZGRDbGFzcygieC1yZXNpemFibGUiKTp0aGlzLnJlbW92ZUNsYXNzKCJ4LXJlc2l6YWJsZSIpfTtrLnByb3RvdHlwZS55U2NhbGU9ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gbC5wcm90b3R5cGUueVNjYWxlLmNhbGwodGhpcyk7dGhyb3cgRXJyb3IoInlTY2FsZXMgY2Fubm90IGJlIHNldCBvbiBhbiBYRHJhZ0JveExheWVyIik7fTtrLnByb3RvdHlwZS55RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIGwucHJvdG90eXBlLnlFeHRlbnQuY2FsbCh0aGlzKTsKdGhyb3cgRXJyb3IoIlhEcmFnQm94TGF5ZXIgaGFzIG5vIHlFeHRlbnQiKTt9O3JldHVybiBrfShmKDMyKS5EcmFnQm94TGF5ZXIpO2QuWERyYWdCb3hMYXllcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwsayl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIHAgaW4gaylrLmhhc093blByb3BlcnR5KHApJiYobFtwXT1rW3BdKTtsLnByb3RvdHlwZT1udWxsPT09az9PYmplY3QuY3JlYXRlKGspOihuLnByb3RvdHlwZT1rLnByb3RvdHlwZSxuZXcgbil9O2M9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gaygpe3ZhciBuPWwuY2FsbCh0aGlzKXx8dGhpcztuLmFkZENsYXNzKCJ5LWRyYWctYm94LWxheWVyIik7bi5faGFzQ29ybmVycz0hMTtyZXR1cm4gbn1nKGssbCk7ay5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihuLHAscSl7bC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsbixwLApxKTt0aGlzLl9zZXRCb3VuZHModGhpcy5ib3VuZHMoKSk7cmV0dXJuIHRoaXN9O2sucHJvdG90eXBlLl9zZXRCb3VuZHM9ZnVuY3Rpb24obil7bC5wcm90b3R5cGUuX3NldEJvdW5kcy5jYWxsKHRoaXMse3RvcExlZnQ6e3g6MCx5Om4udG9wTGVmdC55fSxib3R0b21SaWdodDp7eDp0aGlzLndpZHRoKCkseTpuLmJvdHRvbVJpZ2h0Lnl9fSl9O2sucHJvdG90eXBlLl9zZXRSZXNpemFibGVDbGFzc2VzPWZ1bmN0aW9uKG4pe24mJnRoaXMuZW5hYmxlZCgpP3RoaXMuYWRkQ2xhc3MoInktcmVzaXphYmxlIik6dGhpcy5yZW1vdmVDbGFzcygieS1yZXNpemFibGUiKX07ay5wcm90b3R5cGUueFNjYWxlPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIGwucHJvdG90eXBlLnhTY2FsZS5jYWxsKHRoaXMpO3Rocm93IEVycm9yKCJ4U2NhbGVzIGNhbm5vdCBiZSBzZXQgb24gYW4gWURyYWdCb3hMYXllciIpO307ay5wcm90b3R5cGUueEV4dGVudD1mdW5jdGlvbigpe3JldHVybiBsLnByb3RvdHlwZS54RXh0ZW50LmNhbGwodGhpcyk7CnRocm93IEVycm9yKCJZRHJhZ0JveExheWVyIGhhcyBubyB4RXh0ZW50Iik7fTtyZXR1cm4ga30oZigzMikuRHJhZ0JveExheWVyKTtkLllEcmFnQm94TGF5ZXI9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLGspe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBwIGluIGspay5oYXNPd25Qcm9wZXJ0eShwKSYmKGxbcF09a1twXSk7bC5wcm90b3R5cGU9bnVsbD09PWs/T2JqZWN0LmNyZWF0ZShrKToobi5wcm90b3R5cGU9ay5wcm90b3R5cGUsbmV3IG4pfTtjPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIGsoKXt2YXIgbj1sLmNhbGwodGhpcyl8fHRoaXM7bi5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltrLl9LRVlET1dOX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHApe3JldHVybiBuLl9wcm9jZXNzS2V5ZG93bihwKX07bi5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltrLl9LRVlVUF9FVkVOVF9OQU1FXT1mdW5jdGlvbihwKXtyZXR1cm4gbi5fcHJvY2Vzc0tleXVwKHApfTsKcmV0dXJuIG59ZyhrLGwpO2suZ2V0RGlzcGF0Y2hlcj1mdW5jdGlvbigpe3ZhciBuPWRvY3VtZW50W2suX0RJU1BBVENIRVJfS0VZXTtudWxsPT1uJiYobj1uZXcgayxkb2N1bWVudFtrLl9ESVNQQVRDSEVSX0tFWV09bik7cmV0dXJuIG59O2sucHJvdG90eXBlLl9wcm9jZXNzS2V5ZG93bj1mdW5jdGlvbihuKXt0aGlzLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQoay5fS0VZRE9XTl9FVkVOVF9OQU1FLG4ua2V5Q29kZSxuKX07ay5wcm90b3R5cGUuX3Byb2Nlc3NLZXl1cD1mdW5jdGlvbihuKXt0aGlzLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQoay5fS0VZVVBfRVZFTlRfTkFNRSxuLmtleUNvZGUsbil9O2sucHJvdG90eXBlLm9uS2V5RG93bj1mdW5jdGlvbihuKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGsuX0tFWURPV05fRVZFTlRfTkFNRSxuKX07ay5wcm90b3R5cGUub2ZmS2V5RG93bj1mdW5jdGlvbihuKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KGsuX0tFWURPV05fRVZFTlRfTkFNRSwKbil9O2sucHJvdG90eXBlLm9uS2V5VXA9ZnVuY3Rpb24obil7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChrLl9LRVlVUF9FVkVOVF9OQU1FLG4pfTtrLnByb3RvdHlwZS5vZmZLZXlVcD1mdW5jdGlvbihuKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KGsuX0tFWVVQX0VWRU5UX05BTUUsbil9O3JldHVybiBrfShmKDI0KS5EaXNwYXRjaGVyKTtjLl9ESVNQQVRDSEVSX0tFWT0iX19QbG90dGFibGVfRGlzcGF0Y2hlcl9LZXkiO2MuX0tFWURPV05fRVZFTlRfTkFNRT0ia2V5ZG93biI7Yy5fS0VZVVBfRVZFTlRfTkFNRT0ia2V5dXAiO2QuS2V5PWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oayxuKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWZvcih2YXIgcSBpbiBuKW4uaGFzT3duUHJvcGVydHkocSkmJihrW3FdPW5bcV0pO2sucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHAucHJvdG90eXBlPQpuLnByb3RvdHlwZSxuZXcgcCl9LGw9ZigwKTtjPWZ1bmN0aW9uKGspe2Z1bmN0aW9uIG4ocCl7ZnVuY3Rpb24gcSh0KXtyZXR1cm4gci5fbWVhc3VyZUFuZERpc3BhdGNoKHAsdCxuLl9NT1VTRU1PVkVfRVZFTlRfTkFNRSwicGFnZSIpfXZhciByPWsuY2FsbCh0aGlzKXx8dGhpcztyLl9sYXN0TW91c2VQb3NpdGlvbj17eDotMSx5Oi0xfTtyLl90cmFuc2xhdG9yPWwuZ2V0VHJhbnNsYXRvcihwKTtyLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW24uX01PVVNFT1ZFUl9FVkVOVF9OQU1FXT1xO3IuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bbi5fTU9VU0VNT1ZFX0VWRU5UX05BTUVdPXE7ci5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltuLl9NT1VTRU9VVF9FVkVOVF9OQU1FXT1xO3IuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bbi5fTU9VU0VET1dOX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHQpe3JldHVybiByLl9tZWFzdXJlQW5kRGlzcGF0Y2gocCx0LG4uX01PVVNFRE9XTl9FVkVOVF9OQU1FKX07CnIuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bbi5fTU9VU0VVUF9FVkVOVF9OQU1FXT1mdW5jdGlvbih0KXtyZXR1cm4gci5fbWVhc3VyZUFuZERpc3BhdGNoKHAsdCxuLl9NT1VTRVVQX0VWRU5UX05BTUUsInBhZ2UiKX07ci5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltuLl9XSEVFTF9FVkVOVF9OQU1FXT1mdW5jdGlvbih0KXtyZXR1cm4gci5fbWVhc3VyZUFuZERpc3BhdGNoKHAsdCxuLl9XSEVFTF9FVkVOVF9OQU1FKX07ci5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltuLl9EQkxDTElDS19FVkVOVF9OQU1FXT1mdW5jdGlvbih0KXtyZXR1cm4gci5fbWVhc3VyZUFuZERpc3BhdGNoKHAsdCxuLl9EQkxDTElDS19FVkVOVF9OQU1FKX07cmV0dXJuIHJ9ZyhuLGspO24uZ2V0RGlzcGF0Y2hlcj1mdW5jdGlvbihwKXt2YXIgcT1wLnJvb3QoKS5yb290RWxlbWVudCgpLHI9cVtuLl9ESVNQQVRDSEVSX0tFWV07bnVsbD09ciYmKHI9bmV3IG4ocCkscVtuLl9ESVNQQVRDSEVSX0tFWV09CnIpO3JldHVybiByfTtuLnByb3RvdHlwZS5vbk1vdXNlTW92ZT1mdW5jdGlvbihwKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KG4uX01PVVNFTU9WRV9FVkVOVF9OQU1FLHApfTtuLnByb3RvdHlwZS5vZmZNb3VzZU1vdmU9ZnVuY3Rpb24ocCl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChuLl9NT1VTRU1PVkVfRVZFTlRfTkFNRSxwKX07bi5wcm90b3R5cGUub25Nb3VzZURvd249ZnVuY3Rpb24ocCl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChuLl9NT1VTRURPV05fRVZFTlRfTkFNRSxwKX07bi5wcm90b3R5cGUub2ZmTW91c2VEb3duPWZ1bmN0aW9uKHApe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQobi5fTU9VU0VET1dOX0VWRU5UX05BTUUscCl9O24ucHJvdG90eXBlLm9uTW91c2VVcD1mdW5jdGlvbihwKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KG4uX01PVVNFVVBfRVZFTlRfTkFNRSxwKX07bi5wcm90b3R5cGUub2ZmTW91c2VVcD1mdW5jdGlvbihwKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KG4uX01PVVNFVVBfRVZFTlRfTkFNRSwKcCl9O24ucHJvdG90eXBlLm9uV2hlZWw9ZnVuY3Rpb24ocCl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChuLl9XSEVFTF9FVkVOVF9OQU1FLHApO3JldHVybiB0aGlzfTtuLnByb3RvdHlwZS5vZmZXaGVlbD1mdW5jdGlvbihwKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KG4uX1dIRUVMX0VWRU5UX05BTUUscCl9O24ucHJvdG90eXBlLm9uRGJsQ2xpY2s9ZnVuY3Rpb24ocCl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChuLl9EQkxDTElDS19FVkVOVF9OQU1FLHApfTtuLnByb3RvdHlwZS5vZmZEYmxDbGljaz1mdW5jdGlvbihwKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KG4uX0RCTENMSUNLX0VWRU5UX05BTUUscCl9O24ucHJvdG90eXBlLl9tZWFzdXJlQW5kRGlzcGF0Y2g9ZnVuY3Rpb24ocCxxLHIsdCl7dm9pZCAwPT09dCYmKHQ9ImVsZW1lbnQiKTtpZigicGFnZSIhPT10JiYiZWxlbWVudCIhPT10KXRocm93IEVycm9yKCJJbnZhbGlkIHNjb3BlICciK3QrCiInLCBtdXN0IGJlICdlbGVtZW50JyBvciAncGFnZSciKTtpZigicGFnZSI9PT10fHx0aGlzLmV2ZW50SW5zaWRlKHAscSkpdGhpcy5fbGFzdE1vdXNlUG9zaXRpb249dGhpcy5fdHJhbnNsYXRvci5jb21wdXRlUG9zaXRpb24ocS5jbGllbnRYLHEuY2xpZW50WSksdGhpcy5fY2FsbENhbGxiYWNrc0ZvckV2ZW50KHIsdGhpcy5sYXN0TW91c2VQb3NpdGlvbigpLHEpfTtuLnByb3RvdHlwZS5ldmVudEluc2lkZT1mdW5jdGlvbihwLHEpe3JldHVybiBsLlRyYW5zbGF0b3IuaXNFdmVudEluc2lkZShwLHEpfTtuLnByb3RvdHlwZS5sYXN0TW91c2VQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sYXN0TW91c2VQb3NpdGlvbn07cmV0dXJuIG59KGYoMjQpLkRpc3BhdGNoZXIpO2MuX0RJU1BBVENIRVJfS0VZPSJfX1Bsb3R0YWJsZV9EaXNwYXRjaGVyX01vdXNlIjtjLl9NT1VTRU9WRVJfRVZFTlRfTkFNRT0ibW91c2VvdmVyIjtjLl9NT1VTRU1PVkVfRVZFTlRfTkFNRT0ibW91c2Vtb3ZlIjsKYy5fTU9VU0VPVVRfRVZFTlRfTkFNRT0ibW91c2VvdXQiO2MuX01PVVNFRE9XTl9FVkVOVF9OQU1FPSJtb3VzZWRvd24iO2MuX01PVVNFVVBfRVZFTlRfTkFNRT0ibW91c2V1cCI7Yy5fV0hFRUxfRVZFTlRfTkFNRT0id2hlZWwiO2MuX0RCTENMSUNLX0VWRU5UX05BTUU9ImRibGNsaWNrIjtkLk1vdXNlPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oayxuKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWZvcih2YXIgcSBpbiBuKW4uaGFzT3duUHJvcGVydHkocSkmJihrW3FdPW5bcV0pO2sucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHAucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyBwKX0sbD1mKDApO2M9ZnVuY3Rpb24oayl7ZnVuY3Rpb24gbihwKXt2YXIgcT1rLmNhbGwodGhpcyl8fHRoaXM7cS5fdHJhbnNsYXRvcj1sLmdldFRyYW5zbGF0b3IocCk7cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltuLl9UT1VDSFNUQVJUX0VWRU5UX05BTUVdPQpmdW5jdGlvbihyKXtyZXR1cm4gcS5fbWVhc3VyZUFuZERpc3BhdGNoKHAscixuLl9UT1VDSFNUQVJUX0VWRU5UX05BTUUsInBhZ2UiKX07cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltuLl9UT1VDSE1PVkVfRVZFTlRfTkFNRV09ZnVuY3Rpb24ocil7cmV0dXJuIHEuX21lYXN1cmVBbmREaXNwYXRjaChwLHIsbi5fVE9VQ0hNT1ZFX0VWRU5UX05BTUUsInBhZ2UiKX07cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltuLl9UT1VDSEVORF9FVkVOVF9OQU1FXT1mdW5jdGlvbihyKXtyZXR1cm4gcS5fbWVhc3VyZUFuZERpc3BhdGNoKHAscixuLl9UT1VDSEVORF9FVkVOVF9OQU1FLCJwYWdlIil9O3EuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bbi5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRV09ZnVuY3Rpb24ocil7cmV0dXJuIHEuX21lYXN1cmVBbmREaXNwYXRjaChwLHIsbi5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRSwicGFnZSIpfTtyZXR1cm4gcX1nKG4sayk7bi5nZXREaXNwYXRjaGVyPQpmdW5jdGlvbihwKXt2YXIgcT1wLnJvb3QoKS5yb290RWxlbWVudCgpLHI9cVtuLl9ESVNQQVRDSEVSX0tFWV07bnVsbD09ciYmKHI9bmV3IG4ocCkscVtuLl9ESVNQQVRDSEVSX0tFWV09cik7cmV0dXJuIHJ9O24ucHJvdG90eXBlLm9uVG91Y2hTdGFydD1mdW5jdGlvbihwKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KG4uX1RPVUNIU1RBUlRfRVZFTlRfTkFNRSxwKX07bi5wcm90b3R5cGUub2ZmVG91Y2hTdGFydD1mdW5jdGlvbihwKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KG4uX1RPVUNIU1RBUlRfRVZFTlRfTkFNRSxwKX07bi5wcm90b3R5cGUub25Ub3VjaE1vdmU9ZnVuY3Rpb24ocCl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChuLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSxwKX07bi5wcm90b3R5cGUub2ZmVG91Y2hNb3ZlPWZ1bmN0aW9uKHApe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQobi5fVE9VQ0hNT1ZFX0VWRU5UX05BTUUscCl9O24ucHJvdG90eXBlLm9uVG91Y2hFbmQ9CmZ1bmN0aW9uKHApe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQobi5fVE9VQ0hFTkRfRVZFTlRfTkFNRSxwKX07bi5wcm90b3R5cGUub2ZmVG91Y2hFbmQ9ZnVuY3Rpb24ocCl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChuLl9UT1VDSEVORF9FVkVOVF9OQU1FLHApfTtuLnByb3RvdHlwZS5vblRvdWNoQ2FuY2VsPWZ1bmN0aW9uKHApe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQobi5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRSxwKX07bi5wcm90b3R5cGUub2ZmVG91Y2hDYW5jZWw9ZnVuY3Rpb24ocCl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChuLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FLHApfTtuLnByb3RvdHlwZS5fbWVhc3VyZUFuZERpc3BhdGNoPWZ1bmN0aW9uKHAscSxyLHQpe3ZvaWQgMD09PXQmJih0PSJlbGVtZW50Iik7aWYoInBhZ2UiIT09dCYmImVsZW1lbnQiIT09dCl0aHJvdyBFcnJvcigiSW52YWxpZCBzY29wZSAnIit0KyInLCBtdXN0IGJlICdlbGVtZW50JyBvciAncGFnZSciKTsKaWYoImVsZW1lbnQiIT09dHx8dGhpcy5ldmVudEluc2lkZShwLHEpKXtwPXEuY2hhbmdlZFRvdWNoZXM7dD17fTtmb3IodmFyIHY9W10seT0wO3k8cC5sZW5ndGg7eSsrKXt2YXIgej1wW3ldLHg9ei5pZGVudGlmaWVyO3o9dGhpcy5fdHJhbnNsYXRvci5jb21wdXRlUG9zaXRpb24oei5jbGllbnRYLHouY2xpZW50WSk7bnVsbCE9eiYmKHRbeF09eix2LnB1c2goeCkpfTA8di5sZW5ndGgmJnRoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChyLHYsdCxxKX19O24ucHJvdG90eXBlLmV2ZW50SW5zaWRlPWZ1bmN0aW9uKHAscSl7cmV0dXJuIGwuVHJhbnNsYXRvci5pc0V2ZW50SW5zaWRlKHAscSl9O3JldHVybiBufShmKDI0KS5EaXNwYXRjaGVyKTtjLl9ESVNQQVRDSEVSX0tFWT0iX19QbG90dGFibGVfRGlzcGF0Y2hlcl9Ub3VjaCI7Yy5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FPSJ0b3VjaHN0YXJ0IjtjLl9UT1VDSE1PVkVfRVZFTlRfTkFNRT0idG91Y2htb3ZlIjtjLl9UT1VDSEVORF9FVkVOVF9OQU1FPQoidG91Y2hlbmQiO2MuX1RPVUNIQ0FOQ0VMX0VWRU5UX05BTUU9InRvdWNoY2FuY2VsIjtkLlRvdWNoPWN9LGZ1bmN0aW9uKGMsZCl7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGYoZyxsLGspe3ZvaWQgMD09PWsmJihrPXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTt0aGlzLnNjcmVlbldpZHRoPWc7dGhpcy5zY3JlZW5IZWlnaHQ9bDt0aGlzLmRldmljZVBpeGVsUmF0aW89azt0aGlzLnBpeGVsV2lkdGg9ZyprO3RoaXMucGl4ZWxIZWlnaHQ9bCprO3RoaXMuY2FudmFzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO3RoaXMuY3R4PXRoaXMuY2FudmFzLmdldENvbnRleHQoIjJkIik7Zi5zaXplUGl4ZWxzKHRoaXMuY3R4LGcsbCxrKX1mLnNpemVQaXhlbHM9ZnVuY3Rpb24oZyxsLGssbil7dmFyIHA9Zy5jYW52YXM7cC53aWR0aD1sKm47cC5oZWlnaHQ9aypuO3Auc3R5bGUud2lkdGg9bCsicHgiO3Auc3R5bGUuaGVpZ2h0PWsrInB4IjtnLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsCjApO2cuc2NhbGUobixuKX07Zi5wcm90b3R5cGUuYmxpdD1mdW5jdGlvbihnLGwsayl7dm9pZCAwPT09bCYmKGw9MCk7dm9pZCAwPT09ayYmKGs9MCk7Zy5kcmF3SW1hZ2UodGhpcy5jYW52YXMsbCxrLHRoaXMuc2NyZWVuV2lkdGgsdGhpcy5zY3JlZW5IZWlnaHQpfTtmLnByb3RvdHlwZS5ibGl0Q2VudGVyPWZ1bmN0aW9uKGcsbCxrKXt2b2lkIDA9PT1sJiYobD0wKTt2b2lkIDA9PT1rJiYoaz0wKTt0aGlzLmJsaXQoZyxNYXRoLmZsb29yKGwtdGhpcy5zY3JlZW5XaWR0aC8yKSxNYXRoLmZsb29yKGstdGhpcy5zY3JlZW5IZWlnaHQvMikpfTtmLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oZyxsLGspe3ZvaWQgMD09PWsmJihrPSExKTt2YXIgbj10aGlzLmRldmljZVBpeGVsUmF0aW87dGhpcy5zY3JlZW5XaWR0aD1nO3RoaXMuc2NyZWVuSGVpZ2h0PWw7dGhpcy5waXhlbFdpZHRoPWcqbjt0aGlzLnBpeGVsSGVpZ2h0PWwqbjtmLnNpemVQaXhlbHModGhpcy5jdHgsZyxsLG4pO2smJgp0aGlzLmN0eC50cmFuc2xhdGUoZy8yLGcvMik7cmV0dXJuIHRoaXN9O2YucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKGcpe3ZhciBsPXRoaXMucGl4ZWxXaWR0aCxrPXRoaXMucGl4ZWxIZWlnaHQsbj10aGlzLmN0eDtuLnNhdmUoKTtuLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCk7bnVsbD09Zz9uLmNsZWFyUmVjdCgwLDAsbCxrKToobi5maWxsU3R5bGU9ZyxuLmZpbGxSZWN0KDAsMCxsLGspKTtuLnJlc3RvcmUoKTtyZXR1cm4gdGhpc307Zi5wcm90b3R5cGUuZ2V0SW1hZ2VEYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY3R4LmdldEltYWdlRGF0YSgwLDAsdGhpcy5waXhlbFdpZHRoLHRoaXMucGl4ZWxIZWlnaHQpfTtyZXR1cm4gZn0oKTtkLkNhbnZhc0J1ZmZlcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG4scCl7ZnVuY3Rpb24gcSgpe3RoaXMuY29uc3RydWN0b3I9bn1mb3IodmFyIHIgaW4gcClwLmhhc093blByb3BlcnR5KHIpJiYKKG5bcl09cFtyXSk7bi5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToocS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IHEpfSxsPWYoMTMpLGs9ZigwKTtjPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHAoKXt2YXIgcT1udWxsIT09biYmbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cS5fY2xpY2tlZERvd249ITE7cS5fZG91YmxlQ2xpY2tpbmc9ITE7cS5fb25DbGlja0NhbGxiYWNrcz1uZXcgay5DYWxsYmFja1NldDtxLl9vbkRvdWJsZUNsaWNrQ2FsbGJhY2tzPW5ldyBrLkNhbGxiYWNrU2V0O3EuX21vdXNlRG93bkNhbGxiYWNrPWZ1bmN0aW9uKHIpe3JldHVybiBxLl9oYW5kbGVDbGlja0Rvd24ocil9O3EuX21vdXNlVXBDYWxsYmFjaz1mdW5jdGlvbihyLHQpe3JldHVybiBxLl9oYW5kbGVDbGlja1VwKHIsdCl9O3EuX2RibENsaWNrQ2FsbGJhY2s9ZnVuY3Rpb24ocix0KXtyZXR1cm4gcS5faGFuZGxlRGJsQ2xpY2socix0KX07cS5fdG91Y2hTdGFydENhbGxiYWNrPQpmdW5jdGlvbihyLHQpe3JldHVybiBxLl9oYW5kbGVDbGlja0Rvd24odFtyWzBdXSl9O3EuX3RvdWNoRW5kQ2FsbGJhY2s9ZnVuY3Rpb24ocix0LHYpe3JldHVybiBxLl9oYW5kbGVDbGlja1VwKHRbclswXV0sdil9O3EuX3RvdWNoQ2FuY2VsQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gcS5fY2xpY2tlZERvd249ITF9O3JldHVybiBxfWcocCxuKTtwLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKHEpe24ucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLHEpO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1sLk1vdXNlLmdldERpc3BhdGNoZXIocSk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VEb3duKHRoaXMuX21vdXNlRG93bkNhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uRGJsQ2xpY2sodGhpcy5fZGJsQ2xpY2tDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPQpsLlRvdWNoLmdldERpc3BhdGNoZXIocSk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoQ2FuY2VsKHRoaXMuX3RvdWNoQ2FuY2VsQ2FsbGJhY2spfTtwLnByb3RvdHlwZS5fdW5hbmNob3I9ZnVuY3Rpb24oKXtuLnByb3RvdHlwZS5fdW5hbmNob3IuY2FsbCh0aGlzKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmTW91c2VEb3duKHRoaXMuX21vdXNlRG93bkNhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmTW91c2VVcCh0aGlzLl9tb3VzZVVwQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZEYmxDbGljayh0aGlzLl9kYmxDbGlja0NhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXI9bnVsbDt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spOwp0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoQ2FuY2VsKHRoaXMuX3RvdWNoQ2FuY2VsQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj1udWxsfTtwLnByb3RvdHlwZS5faGFuZGxlQ2xpY2tEb3duPWZ1bmN0aW9uKHEpe3E9dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShxKTt0aGlzLl9pc0luc2lkZUNvbXBvbmVudChxKSYmKHRoaXMuX2NsaWNrZWREb3duPSEwLHRoaXMuX2NsaWNrZWRQb2ludD1xKX07cC5wcm90b3R5cGUuX2hhbmRsZUNsaWNrVXA9ZnVuY3Rpb24ocSxyKXt2YXIgdD10aGlzLHY9dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShxKTt0aGlzLl9jbGlja2VkRG93biYmcC5fcG9pbnRzRXF1YWwodix0aGlzLl9jbGlja2VkUG9pbnQpJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5fZG91YmxlQ2xpY2tpbmd8fHQuX29uQ2xpY2tDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh2LApyKX0sMCk7dGhpcy5fY2xpY2tlZERvd249ITF9O3AucHJvdG90eXBlLl9oYW5kbGVEYmxDbGljaz1mdW5jdGlvbihxLHIpe3ZhciB0PXRoaXM7cT10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHEpO3RoaXMuX2RvdWJsZUNsaWNraW5nPSEwO3RoaXMuX29uRG91YmxlQ2xpY2tDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhxLHIpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gdC5fZG91YmxlQ2xpY2tpbmc9ITF9LDApfTtwLl9wb2ludHNFcXVhbD1mdW5jdGlvbihxLHIpe3JldHVybiBxLng9PT1yLngmJnEueT09PXIueX07cC5wcm90b3R5cGUub25DbGljaz1mdW5jdGlvbihxKXt0aGlzLl9vbkNsaWNrQ2FsbGJhY2tzLmFkZChxKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUub2ZmQ2xpY2s9ZnVuY3Rpb24ocSl7dGhpcy5fb25DbGlja0NhbGxiYWNrcy5kZWxldGUocSl9O3AucHJvdG90eXBlLm9uRG91YmxlQ2xpY2s9ZnVuY3Rpb24ocSl7dGhpcy5fb25Eb3VibGVDbGlja0NhbGxiYWNrcy5hZGQocSl9OwpwLnByb3RvdHlwZS5vZmZEb3VibGVDbGljaz1mdW5jdGlvbihxKXt0aGlzLl9vbkRvdWJsZUNsaWNrQ2FsbGJhY2tzLmRlbGV0ZShxKTtyZXR1cm4gdGhpc307cmV0dXJuIHB9KGYoMTUpLkludGVyYWN0aW9uKTtkLkNsaWNrPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixwKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgciBpbiBwKXAuaGFzT3duUHJvcGVydHkocikmJihuW3JdPXBbcl0pO24ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX0sbD1mKDEzKSxrPWYoMCk7Yz1mdW5jdGlvbihuKXtmdW5jdGlvbiBwKCl7dmFyIHE9bnVsbCE9PW4mJm4uYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3EuX2RyYWdnaW5nPSExO3EuX2NvbnN0cmFpbmVkVG9Db21wb25lbnQ9ITA7cS5fbW91c2VGaWx0ZXI9cC5fREVGQVVMVF9NT1VTRV9GSUxURVI7CnEuX2RyYWdTdGFydENhbGxiYWNrcz1uZXcgay5DYWxsYmFja1NldDtxLl9kcmFnQ2FsbGJhY2tzPW5ldyBrLkNhbGxiYWNrU2V0O3EuX2RyYWdFbmRDYWxsYmFja3M9bmV3IGsuQ2FsbGJhY2tTZXQ7cS5fbW91c2VEb3duQ2FsbGJhY2s9ZnVuY3Rpb24ocix0KXtyZXR1cm4gcS5fc3RhcnREcmFnKHIsdCl9O3EuX21vdXNlTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKHIpe3JldHVybiBxLl9kb0RyYWcocil9O3EuX21vdXNlVXBDYWxsYmFjaz1mdW5jdGlvbihyLHQpe3JldHVybiBxLl9lbmREcmFnKHIsdCl9O3EuX3RvdWNoU3RhcnRDYWxsYmFjaz1mdW5jdGlvbihyLHQsdil7cmV0dXJuIHEuX3N0YXJ0RHJhZyh0W3JbMF1dLHYpfTtxLl90b3VjaE1vdmVDYWxsYmFjaz1mdW5jdGlvbihyLHQpe3JldHVybiBxLl9kb0RyYWcodFtyWzBdXSl9O3EuX3RvdWNoRW5kQ2FsbGJhY2s9ZnVuY3Rpb24ocix0LHYpe3JldHVybiBxLl9lbmREcmFnKHRbclswXV0sdil9O3JldHVybiBxfWcocCxuKTtwLnByb3RvdHlwZS5fYW5jaG9yPQpmdW5jdGlvbihxKXtuLnByb3RvdHlwZS5fYW5jaG9yLmNhbGwodGhpcyxxKTt0aGlzLl9tb3VzZURpc3BhdGNoZXI9bC5Nb3VzZS5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlRG93bih0aGlzLl9tb3VzZURvd25DYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPWwuVG91Y2guZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hNb3ZlKHRoaXMuX3RvdWNoTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaEVuZCh0aGlzLl90b3VjaEVuZENhbGxiYWNrKX07CnAucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe24ucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZURvd24odGhpcy5fbW91c2VEb3duQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGw7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hNb3ZlKHRoaXMuX3RvdWNoTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPW51bGx9O3AucHJvdG90eXBlLl90cmFuc2xhdGVBbmRDb25zdHJhaW49CmZ1bmN0aW9uKHEpe3E9dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShxKTtyZXR1cm4gdGhpcy5fY29uc3RyYWluZWRUb0NvbXBvbmVudD97eDprLk1hdGguY2xhbXAocS54LDAsdGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby53aWR0aCgpKSx5OmsuTWF0aC5jbGFtcChxLnksMCx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLmhlaWdodCgpKX06cX07cC5wcm90b3R5cGUuX3N0YXJ0RHJhZz1mdW5jdGlvbihxLHIpe3IgaW5zdGFuY2VvZiBNb3VzZUV2ZW50JiYhdGhpcy5fbW91c2VGaWx0ZXIocil8fChxPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UocSksdGhpcy5faXNJbnNpZGVDb21wb25lbnQocSkmJihyLnByZXZlbnREZWZhdWx0KCksdGhpcy5fZHJhZ2dpbmc9ITAsdGhpcy5fZHJhZ09yaWdpbj1xLHRoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMuX2RyYWdPcmlnaW4pKSl9O3AucHJvdG90eXBlLl9kb0RyYWc9ZnVuY3Rpb24ocSl7dGhpcy5fZHJhZ2dpbmcmJgp0aGlzLl9kcmFnQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcy5fZHJhZ09yaWdpbix0aGlzLl90cmFuc2xhdGVBbmRDb25zdHJhaW4ocSkpfTtwLnByb3RvdHlwZS5fZW5kRHJhZz1mdW5jdGlvbihxLHIpe3IgaW5zdGFuY2VvZiBNb3VzZUV2ZW50JiYwIT09ci5idXR0b258fCF0aGlzLl9kcmFnZ2luZ3x8KHRoaXMuX2RyYWdnaW5nPSExLHRoaXMuX2RyYWdFbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzLl9kcmFnT3JpZ2luLHRoaXMuX3RyYW5zbGF0ZUFuZENvbnN0cmFpbihxKSkpfTtwLnByb3RvdHlwZS5jb25zdHJhaW5lZFRvQ29tcG9uZW50PWZ1bmN0aW9uKCl7dGhpcy5fY29uc3RyYWluZWRUb0NvbXBvbmVudD0hMX07cC5wcm90b3R5cGUubW91c2VGaWx0ZXI9ZnVuY3Rpb24ocSl7MCE9PWFyZ3VtZW50cy5sZW5ndGgmJih0aGlzLl9tb3VzZUZpbHRlcj1xKX07cC5wcm90b3R5cGUub25EcmFnU3RhcnQ9ZnVuY3Rpb24ocSl7dGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmFkZChxKX07CnAucHJvdG90eXBlLm9mZkRyYWdTdGFydD1mdW5jdGlvbihxKXt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZGVsZXRlKHEpfTtwLnByb3RvdHlwZS5vbkRyYWc9ZnVuY3Rpb24ocSl7dGhpcy5fZHJhZ0NhbGxiYWNrcy5hZGQocSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLm9mZkRyYWc9ZnVuY3Rpb24ocSl7dGhpcy5fZHJhZ0NhbGxiYWNrcy5kZWxldGUocSl9O3AucHJvdG90eXBlLm9uRHJhZ0VuZD1mdW5jdGlvbihxKXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmFkZChxKX07cC5wcm90b3R5cGUub2ZmRHJhZ0VuZD1mdW5jdGlvbihxKXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZShxKX07cmV0dXJuIHB9KGYoMTUpLkludGVyYWN0aW9uKTtjLl9ERUZBVUxUX01PVVNFX0ZJTFRFUj1mdW5jdGlvbihuKXtyZXR1cm4gMD09PW4uYnV0dG9ufTtkLkRyYWc9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih0LHYpe2Z1bmN0aW9uIHkoKXt0aGlzLmNvbnN0cnVjdG9yPQp0fWZvcih2YXIgeiBpbiB2KXYuaGFzT3duUHJvcGVydHkoeikmJih0W3pdPXZbel0pO3QucHJvdG90eXBlPW51bGw9PT12P09iamVjdC5jcmVhdGUodik6KHkucHJvdG90eXBlPXYucHJvdG90eXBlLG5ldyB5KX0sbD1mKDEpLGs9ZigxMyksbj1mKDMpLHA9ZigwKSxxPWYoMjUpO2M9ZigxNSk7dmFyIHI9ZigyNik7Zj1mdW5jdGlvbih0KXtmdW5jdGlvbiB2KHkseil7dmFyIHg9dC5jYWxsKHRoaXMpfHx0aGlzO3guX3doZWVsRmlsdGVyPWZ1bmN0aW9uKCl7cmV0dXJuITB9O3guX3doZWVsQ2FsbGJhY2s9ZnVuY3Rpb24oQyxGKXtyZXR1cm4geC5faGFuZGxlV2hlZWxFdmVudChDLEYpfTt4Ll90b3VjaFN0YXJ0Q2FsbGJhY2s9ZnVuY3Rpb24oQyxGKXtyZXR1cm4geC5faGFuZGxlVG91Y2hTdGFydChDLEYpfTt4Ll90b3VjaE1vdmVDYWxsYmFjaz1mdW5jdGlvbihDLEYpe3JldHVybiB4Ll9oYW5kbGVQaW5jaChDLEYpfTt4Ll90b3VjaEVuZENhbGxiYWNrPWZ1bmN0aW9uKEMpe3JldHVybiB4Ll9oYW5kbGVUb3VjaEVuZChDKX07CnguX3RvdWNoQ2FuY2VsQ2FsbGJhY2s9ZnVuY3Rpb24oQyl7cmV0dXJuIHguX2hhbmRsZVRvdWNoRW5kKEMpfTt4Ll9wYW5FbmRDYWxsYmFja3M9bmV3IHAuQ2FsbGJhY2tTZXQ7eC5fem9vbUVuZENhbGxiYWNrcz1uZXcgcC5DYWxsYmFja1NldDt4Ll9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzPW5ldyBwLkNhbGxiYWNrU2V0O3guX3hTY2FsZXM9bmV3IHAuU2V0O3guX3lTY2FsZXM9bmV3IHAuU2V0O3guX2RyYWdJbnRlcmFjdGlvbj1uZXcgcS5EcmFnO3guX3NldHVwRHJhZ0ludGVyYWN0aW9uKCk7eC5fdG91Y2hJZHM9bC5tYXAoKTt4Ll9taW5Eb21haW5FeHRlbnRzPW5ldyBwLk1hcDt4Ll9tYXhEb21haW5FeHRlbnRzPW5ldyBwLk1hcDt4Ll9taW5Eb21haW5WYWx1ZXM9bmV3IHAuTWFwO3guX21heERvbWFpblZhbHVlcz1uZXcgcC5NYXA7bnVsbCE9eSYmeC5hZGRYU2NhbGUoeSk7bnVsbCE9eiYmeC5hZGRZU2NhbGUoeik7cmV0dXJuIHh9Zyh2LHQpO3YucHJvdG90eXBlLmRyYWdJbnRlcmFjdGlvbj0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZHJhZ0ludGVyYWN0aW9ufTt2LnByb3RvdHlwZS53aGVlbEZpbHRlcj1mdW5jdGlvbih5KXswIT09YXJndW1lbnRzLmxlbmd0aCYmKHRoaXMuX3doZWVsRmlsdGVyPXkpfTt2LnByb3RvdHlwZS5wYW49ZnVuY3Rpb24oeSl7dmFyIHo9dGhpczt0aGlzLnhTY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHgpe3gucGFuKHouX2NvbnN0cmFpbmVkVHJhbnNsYXRpb24oeCx5LngpKX0pO3RoaXMueVNjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oeCl7eC5wYW4oei5fY29uc3RyYWluZWRUcmFuc2xhdGlvbih4LHkueSkpfSk7dGhpcy5fcGFuWm9vbVVwZGF0ZUNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCl9O3YucHJvdG90eXBlLnpvb209ZnVuY3Rpb24oeSx6LHgpe3ZhciBDPXRoaXM7dm9pZCAwPT09eCYmKHg9ITApO2lmKG51bGwhPXope3ZhciBGPXoueDt2YXIgRD16Lnk7eCYmKHRoaXMueFNjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oQil7Qj1DLl9jb25zdHJhaW5lZFpvb20oQiwKeSxGKTtGPUIuY2VudGVyUG9pbnQ7eT1CLnpvb21BbW91bnR9KSx0aGlzLnlTY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe0I9Qy5fY29uc3RyYWluZWRab29tKEIseSxEKTtEPUIuY2VudGVyUG9pbnQ7eT1CLnpvb21BbW91bnR9KSl9dGhpcy54U2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbihCKXt2YXIgST1CLnJhbmdlKCk7Qi56b29tKHksbnVsbD09Rj8oSVsxXStJWzBdKS8yOkYpfSk7dGhpcy55U2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbihCKXt2YXIgST1CLnJhbmdlKCk7Qi56b29tKHksbnVsbD09RD8oSVsxXStJWzBdKS8yOkQpfSk7dGhpcy5fcGFuWm9vbVVwZGF0ZUNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCk7cmV0dXJue3pvb21BbW91bnQ6eSxjZW50ZXJWYWx1ZTp7Y2VudGVyWDpGLGNlbnRlclk6RH19fTt2LnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKHkpe3QucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLHkpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyh5KTsKdGhpcy5fbW91c2VEaXNwYXRjaGVyPWsuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25XaGVlbCh0aGlzLl93aGVlbENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9ay5Ub3VjaC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaE1vdmUodGhpcy5fdG91Y2hNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoQ2FuY2VsKHRoaXMuX3RvdWNoQ2FuY2VsQ2FsbGJhY2spfTt2LnByb3RvdHlwZS5fdW5hbmNob3I9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5fdW5hbmNob3IuY2FsbCh0aGlzKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmV2hlZWwodGhpcy5fd2hlZWxDYWxsYmFjayk7CnRoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoTW92ZSh0aGlzLl90b3VjaE1vdmVDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaENhbmNlbCh0aGlzLl90b3VjaENhbmNlbENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bnVsbDt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCl9O3YucHJvdG90eXBlLl9oYW5kbGVUb3VjaFN0YXJ0PWZ1bmN0aW9uKHkseil7Zm9yKHZhciB4PTA7eDx5Lmxlbmd0aCYmMj50aGlzLl90b3VjaElkcy5zaXplKCk7eCsrKXt2YXIgQz15W3hdO3RoaXMuX3RvdWNoSWRzLnNldChDLnRvU3RyaW5nKCksdGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZSh6W0NdKSl9fTsKdi5wcm90b3R5cGUuX2hhbmRsZVBpbmNoPWZ1bmN0aW9uKHkseil7dmFyIHg9dGhpcztpZighKDI+dGhpcy5fdG91Y2hJZHMuc2l6ZSgpKSl7dmFyIEM9dGhpcy5fdG91Y2hJZHMudmFsdWVzKCk7aWYodGhpcy5faXNJbnNpZGVDb21wb25lbnQodGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShDWzBdKSkmJnRoaXMuX2lzSW5zaWRlQ29tcG9uZW50KHRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UoQ1sxXSkpKXt2YXIgRj12Ll9wb2ludERpc3RhbmNlKENbMF0sQ1sxXSk7aWYoMCE9PUYpe3kuZm9yRWFjaChmdW5jdGlvbihQKXt4Ll90b3VjaElkcy5oYXMoUC50b1N0cmluZygpKSYmeC5fdG91Y2hJZHMuc2V0KFAudG9TdHJpbmcoKSx4Ll90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHpbUF0pKX0pO3k9dGhpcy5fdG91Y2hJZHMudmFsdWVzKCk7dmFyIEQ9di5fcG9pbnREaXN0YW5jZSh5WzBdLHlbMV0pO2lmKDAhPT1EKXt2YXIgQj1GL0QsST15Lm1hcChmdW5jdGlvbihQLApIKXtyZXR1cm57eDooUC54LUNbSF0ueCkvQix5OihQLnktQ1tIXS55KS9CfX0pO0Y9di5jZW50ZXJQb2ludChDWzBdLENbMV0pO0Y9dGhpcy56b29tKEIsRik7eT1GLmNlbnRlclZhbHVlO3ZhciBPPUYuem9vbUFtb3VudDtGPXkuY2VudGVyWDt5PXkuY2VudGVyWTtEPUMubWFwKGZ1bmN0aW9uKFAsSCl7cmV0dXJue3g6SVtIXS54Kk8rUC54LHk6SVtIXS55Kk8rUC55fX0pO3RoaXMucGFuKHt4OkYtKERbMF0ueCtEWzFdLngpLzIseTp5LShEWzBdLnkrRFsxXS55KS8yfSl9fX19fTt2LmNlbnRlclBvaW50PWZ1bmN0aW9uKHkseil7cmV0dXJue3g6KE1hdGgubWluKHkueCx6LngpK01hdGgubWF4KHkueCx6LngpKS8yLHk6KE1hdGgubWF4KHkueSx6LnkpK01hdGgubWluKHkueSx6LnkpKS8yfX07di5fcG9pbnREaXN0YW5jZT1mdW5jdGlvbih5LHope3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coTWF0aC5tYXgoeS54LHoueCktTWF0aC5taW4oeS54LHoueCksMikrTWF0aC5wb3coTWF0aC5tYXgoeS55LAp6LnkpLU1hdGgubWluKHkueSx6LnkpLDIpKX07di5wcm90b3R5cGUuX2hhbmRsZVRvdWNoRW5kPWZ1bmN0aW9uKHkpe3ZhciB6PXRoaXM7eS5mb3JFYWNoKGZ1bmN0aW9uKHgpe3ouX3RvdWNoSWRzLnJlbW92ZSh4LnRvU3RyaW5nKCkpfSk7MDx0aGlzLl90b3VjaElkcy5zaXplKCkmJnRoaXMuX3pvb21FbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcygpfTt2LnByb3RvdHlwZS5faGFuZGxlV2hlZWxFdmVudD1mdW5jdGlvbih5LHope3RoaXMuX3doZWVsRmlsdGVyKHopJiYoeT10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHkpLHRoaXMuX2lzSW5zaWRlQ29tcG9uZW50KHkpJiYoei5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuem9vbShNYXRoLnBvdygyLCgwIT09ei5kZWx0YVk/ei5kZWx0YVk6ei5kZWx0YVgpKih6LmRlbHRhTW9kZT92Ll9QSVhFTFNfUEVSX0xJTkU6MSkqLjAwMikseSksdGhpcy5fem9vbUVuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCkpKX07di5wcm90b3R5cGUuX2NvbnN0cmFpbmVkWm9vbT0KZnVuY3Rpb24oeSx6LHgpe3JldHVybiByLmNvbnN0cmFpbmVkWm9vbSh5LHoseCx0aGlzLm1pbkRvbWFpbkV4dGVudCh5KSx0aGlzLm1heERvbWFpbkV4dGVudCh5KSx0aGlzLm1pbkRvbWFpblZhbHVlKHkpLHRoaXMubWF4RG9tYWluVmFsdWUoeSkpfTt2LnByb3RvdHlwZS5fY29uc3RyYWluZWRUcmFuc2xhdGlvbj1mdW5jdGlvbih5LHope3JldHVybiByLmNvbnN0cmFpbmVkVHJhbnNsYXRpb24oeSx6LHRoaXMubWluRG9tYWluVmFsdWUoeSksdGhpcy5tYXhEb21haW5WYWx1ZSh5KSl9O3YucHJvdG90eXBlLl9zZXR1cERyYWdJbnRlcmFjdGlvbj1mdW5jdGlvbigpe3ZhciB5PXRoaXM7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmNvbnN0cmFpbmVkVG9Db21wb25lbnQoKTt2YXIgejt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQoZnVuY3Rpb24oKXtyZXR1cm4gej1udWxsfSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZyhmdW5jdGlvbih4LEMpezI8PXkuX3RvdWNoSWRzLnNpemUoKXx8Cih5LnBhbih7eDoobnVsbD09ej94Lng6ei54KS1DLngseToobnVsbD09ej94Lnk6ei55KS1DLnl9KSx6PUMpfSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZChmdW5jdGlvbigpe3JldHVybiB5Ll9wYW5FbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcygpfSl9O3YucHJvdG90eXBlLl9ub25MaW5lYXJTY2FsZVdpdGhFeHRlbnRzPWZ1bmN0aW9uKHkpe3JldHVybiBudWxsIT10aGlzLm1pbkRvbWFpbkV4dGVudCh5KSYmbnVsbCE9dGhpcy5tYXhEb21haW5FeHRlbnQoeSkmJiEoeSBpbnN0YW5jZW9mIG4uTGluZWFyKSYmISh5IGluc3RhbmNlb2Ygbi5UaW1lKX07di5wcm90b3R5cGUueFNjYWxlcz1mdW5jdGlvbigpe3ZhciB5PVtdO3RoaXMuX3hTY2FsZXMuZm9yRWFjaChmdW5jdGlvbih6KXt5LnB1c2goeil9KTtyZXR1cm4geX07di5wcm90b3R5cGUueVNjYWxlcz1mdW5jdGlvbigpe3ZhciB5PVtdO3RoaXMuX3lTY2FsZXMuZm9yRWFjaChmdW5jdGlvbih6KXt5LnB1c2goeil9KTsKcmV0dXJuIHl9O3YucHJvdG90eXBlLmFkZFhTY2FsZT1mdW5jdGlvbih5KXt0aGlzLl94U2NhbGVzLmFkZCh5KX07di5wcm90b3R5cGUucmVtb3ZlWFNjYWxlPWZ1bmN0aW9uKHkpe3RoaXMuX3hTY2FsZXMuZGVsZXRlKHkpO3RoaXMuX21pbkRvbWFpbkV4dGVudHMuZGVsZXRlKHkpO3RoaXMuX21heERvbWFpbkV4dGVudHMuZGVsZXRlKHkpO3RoaXMuX21pbkRvbWFpblZhbHVlcy5kZWxldGUoeSk7dGhpcy5fbWF4RG9tYWluVmFsdWVzLmRlbGV0ZSh5KTtyZXR1cm4gdGhpc307di5wcm90b3R5cGUuYWRkWVNjYWxlPWZ1bmN0aW9uKHkpe3RoaXMuX3lTY2FsZXMuYWRkKHkpfTt2LnByb3RvdHlwZS5yZW1vdmVZU2NhbGU9ZnVuY3Rpb24oeSl7dGhpcy5feVNjYWxlcy5kZWxldGUoeSk7dGhpcy5fbWluRG9tYWluRXh0ZW50cy5kZWxldGUoeSk7dGhpcy5fbWF4RG9tYWluRXh0ZW50cy5kZWxldGUoeSk7dGhpcy5fbWluRG9tYWluVmFsdWVzLmRlbGV0ZSh5KTt0aGlzLl9tYXhEb21haW5WYWx1ZXMuZGVsZXRlKHkpOwpyZXR1cm4gdGhpc307di5wcm90b3R5cGUubWluRG9tYWluRXh0ZW50PWZ1bmN0aW9uKHkpe3JldHVybiB0aGlzLl9taW5Eb21haW5FeHRlbnRzLmdldCh5KX07di5wcm90b3R5cGUubWF4RG9tYWluRXh0ZW50PWZ1bmN0aW9uKHkpe3JldHVybiB0aGlzLl9tYXhEb21haW5FeHRlbnRzLmdldCh5KX07di5wcm90b3R5cGUubWluRG9tYWluVmFsdWU9ZnVuY3Rpb24oeSx6KXtpZihudWxsPT16KXJldHVybiB0aGlzLl9taW5Eb21haW5WYWx1ZXMuZ2V0KHkpO3RoaXMuX21pbkRvbWFpblZhbHVlcy5zZXQoeSx6KTtyZXR1cm4gdGhpc307di5wcm90b3R5cGUubWF4RG9tYWluVmFsdWU9ZnVuY3Rpb24oeSx6KXtpZihudWxsPT16KXJldHVybiB0aGlzLl9tYXhEb21haW5WYWx1ZXMuZ2V0KHkpO3RoaXMuX21heERvbWFpblZhbHVlcy5zZXQoeSx6KTtyZXR1cm4gdGhpc307di5wcm90b3R5cGUuc2V0TWluTWF4RG9tYWluVmFsdWVzVG89ZnVuY3Rpb24oeSl7dGhpcy5fbWluRG9tYWluVmFsdWVzLmRlbGV0ZSh5KTsKdGhpcy5fbWF4RG9tYWluVmFsdWVzLmRlbGV0ZSh5KTt2YXIgej15LmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCkseD16WzFdO3RoaXMubWluRG9tYWluVmFsdWUoeSx6WzBdKTt0aGlzLm1heERvbWFpblZhbHVlKHkseCk7cmV0dXJuIHRoaXN9O3YucHJvdG90eXBlLm9uUGFuRW5kPWZ1bmN0aW9uKHkpe3RoaXMuX3BhbkVuZENhbGxiYWNrcy5hZGQoeSl9O3YucHJvdG90eXBlLm9mZlBhbkVuZD1mdW5jdGlvbih5KXt0aGlzLl9wYW5FbmRDYWxsYmFja3MuZGVsZXRlKHkpO3JldHVybiB0aGlzfTt2LnByb3RvdHlwZS5vblpvb21FbmQ9ZnVuY3Rpb24oeSl7dGhpcy5fem9vbUVuZENhbGxiYWNrcy5hZGQoeSl9O3YucHJvdG90eXBlLm9mZlpvb21FbmQ9ZnVuY3Rpb24oeSl7dGhpcy5fem9vbUVuZENhbGxiYWNrcy5kZWxldGUoeSk7cmV0dXJuIHRoaXN9O3YucHJvdG90eXBlLm9uUGFuWm9vbVVwZGF0ZT1mdW5jdGlvbih5KXt0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmFkZCh5KTsKcmV0dXJuIHRoaXN9O3YucHJvdG90eXBlLm9mZlBhblpvb21VcGRhdGU9ZnVuY3Rpb24oeSl7dGhpcy5fcGFuWm9vbVVwZGF0ZUNhbGxiYWNrcy5kZWxldGUoeSk7cmV0dXJuIHRoaXN9O3JldHVybiB2fShjLkludGVyYWN0aW9uKTtmLl9QSVhFTFNfUEVSX0xJTkU9MTIwO2QuUGFuWm9vbT1mfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG4scCl7ZnVuY3Rpb24gcSgpe3RoaXMuY29uc3RydWN0b3I9bn1mb3IodmFyIHIgaW4gcClwLmhhc093blByb3BlcnR5KHIpJiYobltyXT1wW3JdKTtuLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihxLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgcSl9LGw9ZigxMyksaz1mKDApO2M9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcCgpe3ZhciBxPW51bGwhPT1uJiZuLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztxLl9vdmVyQ29tcG9uZW50PSExO3EuX3BvaW50ZXJFbnRlckNhbGxiYWNrcz0KbmV3IGsuQ2FsbGJhY2tTZXQ7cS5fcG9pbnRlck1vdmVDYWxsYmFja3M9bmV3IGsuQ2FsbGJhY2tTZXQ7cS5fcG9pbnRlckV4aXRDYWxsYmFja3M9bmV3IGsuQ2FsbGJhY2tTZXQ7cS5fbW91c2VNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24ocix0KXtyZXR1cm4gcS5faGFuZGxlTW91c2VFdmVudChyLHQpfTtxLl90b3VjaFN0YXJ0Q2FsbGJhY2s9ZnVuY3Rpb24ocix0LHYpe3JldHVybiBxLl9oYW5kbGVUb3VjaEV2ZW50KHRbclswXV0sdil9O3JldHVybiBxfWcocCxuKTtwLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKHEpe24ucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLHEpO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1sLk1vdXNlLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bC5Ub3VjaC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pOwp0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayl9O3AucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe24ucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPW51bGx9O3AucHJvdG90eXBlLl9oYW5kbGVNb3VzZUV2ZW50PWZ1bmN0aW9uKHEscil7cj10aGlzLl9tb3VzZURpc3BhdGNoZXIuZXZlbnRJbnNpZGUodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyxyKTt0aGlzLl9oYW5kbGVQb2ludGVyRXZlbnQocSxyKX07cC5wcm90b3R5cGUuX2hhbmRsZVRvdWNoRXZlbnQ9ZnVuY3Rpb24ocSxyKXtyPXRoaXMuX3RvdWNoRGlzcGF0Y2hlci5ldmVudEluc2lkZSh0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLApyKTt0aGlzLl9oYW5kbGVQb2ludGVyRXZlbnQocSxyKX07cC5wcm90b3R5cGUuX2hhbmRsZVBvaW50ZXJFdmVudD1mdW5jdGlvbihxLHIpe3E9dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShxKTt2YXIgdD10aGlzLl9pc0luc2lkZUNvbXBvbmVudChxKTt0JiZyPyh0aGlzLl9vdmVyQ29tcG9uZW50fHx0aGlzLl9wb2ludGVyRW50ZXJDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhxKSx0aGlzLl9wb2ludGVyTW92ZUNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHEpKTp0aGlzLl9vdmVyQ29tcG9uZW50JiZ0aGlzLl9wb2ludGVyRXhpdENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHEpO3RoaXMuX292ZXJDb21wb25lbnQ9dCYmcn07cC5wcm90b3R5cGUub25Qb2ludGVyRW50ZXI9ZnVuY3Rpb24ocSl7dGhpcy5fcG9pbnRlckVudGVyQ2FsbGJhY2tzLmFkZChxKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUub2ZmUG9pbnRlckVudGVyPWZ1bmN0aW9uKHEpe3RoaXMuX3BvaW50ZXJFbnRlckNhbGxiYWNrcy5kZWxldGUocSk7CnJldHVybiB0aGlzfTtwLnByb3RvdHlwZS5vblBvaW50ZXJNb3ZlPWZ1bmN0aW9uKHEpe3RoaXMuX3BvaW50ZXJNb3ZlQ2FsbGJhY2tzLmFkZChxKX07cC5wcm90b3R5cGUub2ZmUG9pbnRlck1vdmU9ZnVuY3Rpb24ocSl7dGhpcy5fcG9pbnRlck1vdmVDYWxsYmFja3MuZGVsZXRlKHEpfTtwLnByb3RvdHlwZS5vblBvaW50ZXJFeGl0PWZ1bmN0aW9uKHEpe3RoaXMuX3BvaW50ZXJFeGl0Q2FsbGJhY2tzLmFkZChxKX07cC5wcm90b3R5cGUub2ZmUG9pbnRlckV4aXQ9ZnVuY3Rpb24ocSl7dGhpcy5fcG9pbnRlckV4aXRDYWxsYmFja3MuZGVsZXRlKHEpO3JldHVybiB0aGlzfTtyZXR1cm4gcH0oZigxNSkuSW50ZXJhY3Rpb24pO2QuUG9pbnRlcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9ZigyMCk7ZC5tZW1UaHVuaz1mdW5jdGlvbigpe2Zvcih2YXIgbD1bXSxrPTA7azxhcmd1bWVudHMubGVuZ3RoO2srKylsW2tdPWFyZ3VtZW50c1trXTt2YXIgbj1sLnNsaWNlKDAsLTEpLHA9Zy5tZW1vaXplKGxbbC5sZW5ndGgtCjFdKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcT10aGlzLHI9bi5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuYXBwbHkocSl9KTtyZXR1cm4gcC5hcHBseSh2b2lkIDAscil9fX0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoNDkpO2QubWVtb2l6ZT1mdW5jdGlvbihsKXtmdW5jdGlvbiBrKCl7Zm9yKHZhciB0PVtdLHY9MDt2PGFyZ3VtZW50cy5sZW5ndGg7disrKXRbdl09YXJndW1lbnRzW3ZdO2lmKHEpcmV0dXJuIHA7dj1nLnNpZ25BcnJheSh0KTt2b2lkIDA9PT1ufHxuLmlzRGlmZmVyZW50KHYpPyhyJiZjb25zb2xlLmxvZygiY2FjaGUgbWlzcyEgY29tcHV0aW5nIiksbj12LHA9bC5hcHBseSh0aGlzLHQpKTpyJiZjb25zb2xlLmxvZygiY2FjaGUgaGl0ISIpO3JldHVybiBwfXZhciBuPXZvaWQgMCxwLHE9ITEscj0hMTtrLmRvTG9ja2VkPWZ1bmN0aW9uKHQpe2lmKHEpdGhyb3cgRXJyb3IoIkxvY2tpbmcgYW4gYWxyZWFkeSBsb2NrZWQgbWVtb2l6ZSBmdW5jdGlvbiEiKTtxPSEwOwp0PXQuYXBwbHkodGhpcyk7cT0hMTtyZXR1cm4gdH07ay5sb2dQZXJmb3JtYW5jZT1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD0hMCk7cj10O3JldHVybiB0aGlzfTtyZXR1cm4ga319LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocSxyKXtmdW5jdGlvbiB0KCl7dGhpcy5jb25zdHJ1Y3Rvcj1xfWZvcih2YXIgdiBpbiByKXIuaGFzT3duUHJvcGVydHkodikmJihxW3ZdPXJbdl0pO3EucHJvdG90eXBlPW51bGw9PT1yP09iamVjdC5jcmVhdGUocik6KHQucHJvdG90eXBlPXIucHJvdG90eXBlLG5ldyB0KX0sbD1mKDMpLGs9ZigwKSxuPWYoMjcpLHA9ZigyKTtjPWZ1bmN0aW9uKHEpe2Z1bmN0aW9uIHIodCl7dm9pZCAwPT09dCYmKHQ9InZlcnRpY2FsIik7dD1xLmNhbGwodGhpcyx0KXx8dGhpczt0Ll9jbHVzdGVyT2Zmc2V0cz1uZXcgay5NYXA7cmV0dXJuIHR9ZyhyLHEpO3IucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj0KZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7cmV0dXJuIHoucmFuZ2VCYW5kKCl9dmFyIHY9dGhpcyx5PXEucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLHo9dGhpcy5fbWFrZUlubmVyU2NhbGUoKTt5LndpZHRoPXRoaXMuX2lzVmVydGljYWw/dDp5LndpZHRoO3kuaGVpZ2h0PXRoaXMuX2lzVmVydGljYWw/eS5oZWlnaHQ6dDt2YXIgeD15LngsQz15Lnk7eS54PXRoaXMuX2lzVmVydGljYWw/ZnVuY3Rpb24oRixELEIpe3JldHVybiB4KEYsRCxCKSt2Ll9jbHVzdGVyT2Zmc2V0cy5nZXQoQil9OmZ1bmN0aW9uKEYsRCxCKXtyZXR1cm4geChGLEQsQil9O3kueT10aGlzLl9pc1ZlcnRpY2FsP2Z1bmN0aW9uKEYsRCxCKXtyZXR1cm4gQyhGLEQsQil9OmZ1bmN0aW9uKEYsRCxCKXtyZXR1cm4gQyhGLEQsQikrdi5fY2x1c3Rlck9mZnNldHMuZ2V0KEIpfTtyZXR1cm4geX07ci5wcm90b3R5cGUuX3VwZGF0ZUNsdXN0ZXJQb3NpdGlvbj1mdW5jdGlvbigpe3ZhciB0PQp0aGlzLHY9dGhpcy5fbWFrZUlubmVyU2NhbGUoKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbih5LHope3JldHVybiB0Ll9jbHVzdGVyT2Zmc2V0cy5zZXQoeSx2LnNjYWxlKFN0cmluZyh6KSktdi5yYW5nZUJhbmQoKS8yKX0pfTtyLnByb3RvdHlwZS5fbWFrZUlubmVyU2NhbGU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgbC5DYXRlZ29yeTt0LmRvbWFpbih0aGlzLmRhdGFzZXRzKCkubWFwKGZ1bmN0aW9uKHkseil7cmV0dXJuIFN0cmluZyh6KX0pKTt2YXIgdj1wLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuYXR0cihuLkJhci5fQkFSX1RISUNLTkVTU19LRVkpKTt0LnJhbmdlKFswLHYobnVsbCwwLG51bGwpXSk7cmV0dXJuIHR9O3IucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQ2x1c3RlclBvc2l0aW9uKCk7cmV0dXJuIHEucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3LmNhbGwodGhpcyl9O3JldHVybiByfShuLkJhcik7ZC5DbHVzdGVyZWRCYXI9CmN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oQyxGKXtmdW5jdGlvbiBEKCl7dGhpcy5jb25zdHJ1Y3Rvcj1DfWZvcih2YXIgQiBpbiBGKUYuaGFzT3duUHJvcGVydHkoQikmJihDW0JdPUZbQl0pO0MucHJvdG90eXBlPW51bGw9PT1GP09iamVjdC5jcmVhdGUoRik6KEQucHJvdG90eXBlPUYucHJvdG90eXBlLG5ldyBEKX0sbD1mKDEpLGs9Zig1KSxuPWYoNykscD1mKDgpLHE9ZigzKSxyPWYoMCksdD1mKDQ0KSx2PWYoNDUpLHk9Zig2KSx6PWYoMzUpLHg9ZigyKTtjPWZ1bmN0aW9uKEMpe2Z1bmN0aW9uIEYoKXt2YXIgRD1DLmNhbGwodGhpcyl8fHRoaXM7RC5fc3RhcnRBbmdsZT0wO0QuX2VuZEFuZ2xlPTIqTWF0aC5QSTtELl9sYWJlbEZvcm1hdHRlcj1wLmlkZW50aXR5KCk7RC5fbGFiZWxzRW5hYmxlZD0hMTtELmlubmVyUmFkaXVzKDApO0Qub3V0ZXJSYWRpdXMoZnVuY3Rpb24oKXt2YXIgQj1ELl9waWVDZW50ZXIoKTtyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoRC53aWR0aCgpLQpCLngsQi54KSxNYXRoLm1heChELmhlaWdodCgpLUIueSxCLnkpKX0pO0QuYWRkQ2xhc3MoInBpZS1wbG90Iik7RC5hdHRyKCJmaWxsIixmdW5jdGlvbihCLEkpe3JldHVybiBTdHJpbmcoSSl9LG5ldyBxLkNvbG9yKTtELl9zdHJva2VEcmF3ZXJzPW5ldyByLk1hcDtyZXR1cm4gRH1nKEYsQyk7Ri5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcztDLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9zdHJva2VEcmF3ZXJzLmZvckVhY2goZnVuY3Rpb24oQil7cmV0dXJuIEIuYXR0YWNoVG8oRC5fcmVuZGVyQXJlYSl9KX07Ri5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihELEIsSSl7Qy5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsRCxCLEkpO0Q9dGhpcy5fcGllQ2VudGVyKCk7dGhpcy5fcmVuZGVyQXJlYS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitELngrIiwiK0QueSsiKSIpO0Q9TWF0aC5taW4oTWF0aC5tYXgodGhpcy53aWR0aCgpLQpELngsRC54KSxNYXRoLm1heCh0aGlzLmhlaWdodCgpLUQueSxELnkpKTtudWxsIT10aGlzLmlubmVyUmFkaXVzKCkuc2NhbGUmJnRoaXMuaW5uZXJSYWRpdXMoKS5zY2FsZS5yYW5nZShbMCxEXSk7bnVsbCE9dGhpcy5vdXRlclJhZGl1cygpLnNjYWxlJiZ0aGlzLm91dGVyUmFkaXVzKCkuc2NhbGUucmFuZ2UoWzAsRF0pO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5hZGREYXRhc2V0PWZ1bmN0aW9uKEQpe0MucHJvdG90eXBlLmFkZERhdGFzZXQuY2FsbCh0aGlzLEQpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5fYWRkRGF0YXNldD1mdW5jdGlvbihEKXtpZigxPT09dGhpcy5kYXRhc2V0cygpLmxlbmd0aClyZXR1cm4gci5XaW5kb3cud2FybigiT25seSBvbmUgZGF0YXNldCBpcyBzdXBwb3J0ZWQgaW4gUGllIHBsb3RzIiksdGhpczt0aGlzLl91cGRhdGVQaWVBbmdsZXMoKTt2YXIgQj1uZXcgdi5BcmNPdXRsaW5lU1ZHRHJhd2VyO3RoaXMuX2lzU2V0dXAmJkIuYXR0YWNoVG8odGhpcy5fcmVuZGVyQXJlYSk7CnRoaXMuX3N0cm9rZURyYXdlcnMuc2V0KEQsQik7Qy5wcm90b3R5cGUuX2FkZERhdGFzZXQuY2FsbCh0aGlzLEQpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKEQpe0MucHJvdG90eXBlLnJlbW92ZURhdGFzZXQuY2FsbCh0aGlzLEQpfTtGLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzPWZ1bmN0aW9uKEQpe0MucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXMuY2FsbCh0aGlzLEQpO3RoaXMuX3N0cm9rZURyYXdlcnMuZ2V0KEQpLnJlbW92ZSgpfTtGLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldD1mdW5jdGlvbihEKXtDLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldC5jYWxsKHRoaXMsRCk7dGhpcy5fc3RhcnRBbmdsZXM9W107dGhpcy5fZW5kQW5nbGVzPVtdO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5zZWxlY3Rpb25zPWZ1bmN0aW9uKEQpe3ZhciBCPXRoaXM7dm9pZCAwPT09RCYmKEQ9dGhpcy5kYXRhc2V0cygpKTt2YXIgST1DLnByb3RvdHlwZS5zZWxlY3Rpb25zLmNhbGwodGhpcywKRCkubm9kZXMoKTtELmZvckVhY2goZnVuY3Rpb24oTyl7Tz1CLl9zdHJva2VEcmF3ZXJzLmdldChPKTtudWxsIT1PJiZJLnB1c2guYXBwbHkoSSxPLmdldFZpc3VhbFByaW1pdGl2ZXMoKSl9KTtyZXR1cm4gbC5zZWxlY3RBbGwoSSl9O0YucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXtDLnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlLmNhbGwodGhpcyk7dGhpcy5fdXBkYXRlUGllQW5nbGVzKCk7dGhpcy5yZW5kZXIoKX07Ri5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbigpe3JldHVybiBuZXcgeS5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgdC5BcmNTVkdEcmF3ZXJ9LGZ1bmN0aW9uKCl7ei53YXJuKCJjYW52YXMgcmVuZGVyZXIgaXMgbm90IHN1cHBvcnRlZCBvbiBQaWUgUGxvdCEiKTtyZXR1cm4gbnVsbH0pfTtGLnByb3RvdHlwZS5lbnRpdGllcz1mdW5jdGlvbihEKXt2YXIgQj10aGlzO3ZvaWQgMD09PUQmJihEPXRoaXMuZGF0YXNldHMoKSk7CnJldHVybiBDLnByb3RvdHlwZS5lbnRpdGllcy5jYWxsKHRoaXMsRCkubWFwKGZ1bmN0aW9uKEkpe0kucG9zaXRpb24ueCs9Qi53aWR0aCgpLzI7SS5wb3NpdGlvbi55Kz1CLmhlaWdodCgpLzI7dmFyIE89bC5zZWxlY3QoQi5fc3Ryb2tlRHJhd2Vycy5nZXQoSS5kYXRhc2V0KS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4KEkuaW5kZXgpKTtJLnN0cm9rZVNlbGVjdGlvbj1PO3JldHVybiBJfSl9O0YucHJvdG90eXBlLnNlY3RvclZhbHVlPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KEYuX1NFQ1RPUl9WQUxVRV9LRVkpO3RoaXMuX2JpbmRQcm9wZXJ0eShGLl9TRUNUT1JfVkFMVUVfS0VZLEQsdm9pZCAwKTt0aGlzLl91cGRhdGVQaWVBbmdsZXMoKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5pbm5lclJhZGl1cz1mdW5jdGlvbihELEIpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KEYuX0lOTkVSX1JBRElVU19LRVkpOwp0aGlzLl9iaW5kUHJvcGVydHkoRi5fSU5ORVJfUkFESVVTX0tFWSxELEIpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0YucHJvdG90eXBlLm91dGVyUmFkaXVzPWZ1bmN0aW9uKEQsQil7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoRi5fT1VURVJfUkFESVVTX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KEYuX09VVEVSX1JBRElVU19LRVksRCxCKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5zdGFydEFuZ2xlPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX3N0YXJ0QW5nbGU7dGhpcy5fc3RhcnRBbmdsZT1EO3RoaXMuX3VwZGF0ZVBpZUFuZ2xlcygpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0YucHJvdG90eXBlLmVuZEFuZ2xlPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2VuZEFuZ2xlO3RoaXMuX2VuZEFuZ2xlPUQ7dGhpcy5fdXBkYXRlUGllQW5nbGVzKCk7dGhpcy5yZW5kZXIoKTsKcmV0dXJuIHRoaXN9O0YucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQ9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fbGFiZWxzRW5hYmxlZDt0aGlzLl9sYWJlbHNFbmFibGVkPUQ7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307Ri5wcm90b3R5cGUubGFiZWxGb3JtYXR0ZXI9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fbGFiZWxGb3JtYXR0ZXI7dGhpcy5fbGFiZWxGb3JtYXR0ZXI9RDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtGLnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEQpe3ZhciBCPXRoaXMud2lkdGgoKS8yLEk9dGhpcy5oZWlnaHQoKS8yO0Q9dGhpcy5fc2xpY2VJbmRleEZvclBvaW50KHt4OkQueC1CLHk6RC55LUl9KTtyZXR1cm4gbnVsbD09RD9bXTpbdGhpcy5lbnRpdGllcygpW0RdXX07Ri5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBEPXRoaXMsQj1DLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyksCkk9eC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLmlubmVyUmFkaXVzKCkpLE89eC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLm91dGVyUmFkaXVzKCkpO0IuZD1mdW5jdGlvbihQLEgsSyl7cmV0dXJuIGwuYXJjKCkuaW5uZXJSYWRpdXMoSShQLEgsSykpLm91dGVyUmFkaXVzKE8oUCxILEspKS5zdGFydEFuZ2xlKEQuX3N0YXJ0QW5nbGVzW0hdKS5lbmRBbmdsZShELl9lbmRBbmdsZXNbSF0pKFAsSCl9O3JldHVybiBCfTtGLnByb3RvdHlwZS5fdXBkYXRlUGllQW5nbGVzPWZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5zZWN0b3JWYWx1ZSgpJiYwIT09dGhpcy5kYXRhc2V0cygpLmxlbmd0aCl7dmFyIEQ9eC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnNlY3RvclZhbHVlKCkpLEI9dGhpcy5kYXRhc2V0cygpWzBdLEk9dGhpcy5fZ2V0RGF0YVRvRHJhdygpLmdldChCKTtJPWwucGllKCkuc29ydChudWxsKS5zdGFydEFuZ2xlKHRoaXMuX3N0YXJ0QW5nbGUpLmVuZEFuZ2xlKHRoaXMuX2VuZEFuZ2xlKS52YWx1ZShmdW5jdGlvbihPLApQKXtyZXR1cm4gRChPLFAsQil9KShJKTt0aGlzLl9zdGFydEFuZ2xlcz1JLm1hcChmdW5jdGlvbihPKXtyZXR1cm4gTy5zdGFydEFuZ2xlfSk7dGhpcy5fZW5kQW5nbGVzPUkubWFwKGZ1bmN0aW9uKE8pe3JldHVybiBPLmVuZEFuZ2xlfSl9fTtGLnByb3RvdHlwZS5fcGllQ2VudGVyPWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcy5fc3RhcnRBbmdsZTx0aGlzLl9lbmRBbmdsZT90aGlzLl9zdGFydEFuZ2xlOnRoaXMuX2VuZEFuZ2xlLEI9dGhpcy5fc3RhcnRBbmdsZTx0aGlzLl9lbmRBbmdsZT90aGlzLl9lbmRBbmdsZTp0aGlzLl9zdGFydEFuZ2xlLEk9TWF0aC5zaW4oRCk7RD1NYXRoLmNvcyhEKTt2YXIgTz1NYXRoLnNpbihCKTtCPU1hdGguY29zKEIpO3ZhciBQO2lmKDA8PUkmJjA8PU8paWYoMDw9RCYmMDw9Qil7dmFyIEg9RDt2YXIgSz1QPTA7dmFyIE09T31lbHNlIDA+RCYmMD5CPyhIPTAsUD0tQixLPTAsTT1JKTowPD1EJiYwPkI/KEg9RCxQPS1CLEs9MCxNPUkpOjA+RCYmMDw9QiYmCihLPVA9SD0xLE09TWF0aC5tYXgoSSxPKSk7ZWxzZSAwPD1JJiYwPk8/MDw9RCYmMDw9Qj8oSD1NYXRoLm1heChELEIpLE09Sz1QPTEpOjA+RCYmMD5CPyhIPTAsUD0xLEs9LU8sTT1JKTowPD1EJiYwPkI/KEg9RCxQPTEsSz0tTyxNPTEpOjA+RCYmMDw9QiYmKEg9QixLPVA9MSxNPUkpOjA+SSYmMDw9Tz8wPD1EJiYwPD1CPyhIPTEsUD0wLEs9LUksTT1PKTowPkQmJjA+Qj8oSD0xLFA9TWF0aC5tYXgoLUQsLUIpLE09Sz0xKTowPD1EJiYwPkI/KEg9MSxQPS1CLEs9LUksTT0xKTowPkQmJjA8PUImJihIPTEsUD0tRCxLPTEsTT1PKTowPkkmJjA+TyYmKDA8PUQmJjA8PUI/KEg9QixQPTAsSz0tSSxNPTApOjA+RCYmMD5CPyhIPTAsUD0tRCxLPS1PLE09MCk6MDw9RCYmMD5CPyhQPUg9MSxLPU1hdGgubWF4KEQsLUIpLE09MSk6MD5EJiYwPD1CJiYoSD1CLFA9LUQsSz0xLE09MCkpO3JldHVybnt4OjA9PUsrTT8wOksvKEsrTSkqdGhpcy53aWR0aCgpLHk6MD09SCtQPzA6SC8oSCtQKSp0aGlzLmhlaWdodCgpfX07CkYucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIEQ9Qy5wcm90b3R5cGUuX2dldERhdGFUb0RyYXcuY2FsbCh0aGlzKTtpZigwPT09dGhpcy5kYXRhc2V0cygpLmxlbmd0aClyZXR1cm4gRDt2YXIgQj14LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2VjdG9yVmFsdWUoKSksST10aGlzLmRhdGFzZXRzKClbMF0sTz1ELmdldChJKS5maWx0ZXIoZnVuY3Rpb24oUCxIKXtyZXR1cm4gRi5faXNWYWxpZERhdGEoQihQLEgsSSkpfSk7RC5zZXQoSSxPKTtyZXR1cm4gRH07Ri5faXNWYWxpZERhdGE9ZnVuY3Rpb24oRCl7cmV0dXJuIHIuTWF0aC5pc1ZhbGlkTnVtYmVyKEQpJiYwPD1EfTtGLnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbihELEIsSSl7dmFyIE89eC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnNlY3RvclZhbHVlKCkpO2lmKCFGLl9pc1ZhbGlkRGF0YShPKEQsQixJKSkpcmV0dXJue3g6TmFOLHk6TmFOfTt2YXIgUD14LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuaW5uZXJSYWRpdXMoKSkoRCwKQixJKTtEPXguUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5vdXRlclJhZGl1cygpKShELEIsSSk7UD0oUCtEKS8yO0Q9bC5waWUoKS5zb3J0KG51bGwpLnZhbHVlKGZ1bmN0aW9uKEgsSyl7SD1PKEgsSyxJKTtyZXR1cm4gRi5faXNWYWxpZERhdGEoSCk/SDowfSkuc3RhcnRBbmdsZSh0aGlzLl9zdGFydEFuZ2xlKS5lbmRBbmdsZSh0aGlzLl9lbmRBbmdsZSkoSS5kYXRhKCkpO0I9KERbQl0uc3RhcnRBbmdsZStEW0JdLmVuZEFuZ2xlKS8yO3JldHVybnt4OlAqTWF0aC5zaW4oQikseTotUCpNYXRoLmNvcyhCKX19O0YucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oRCl7dmFyIEI9dGhpczt0aGlzLl9yZW5kZXJBcmVhLnNlbGVjdCgiLmxhYmVsLWFyZWEiKS5yZW1vdmUoKTt0aGlzLl9sYWJlbHNFbmFibGVkJiZyLldpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIEIuX2RyYXdMYWJlbHMoKX0sRCk7dmFyIEk9dGhpcy5fZ2VuZXJhdGVTdHJva2VEcmF3U3RlcHMoKSwKTz10aGlzLl9nZXREYXRhVG9EcmF3KCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oUCl7dmFyIEg9eC5QbG90LmFwcGx5RHJhd1N0ZXBzKEksUCk7Qi5fc3Ryb2tlRHJhd2Vycy5nZXQoUCkuZHJhdyhPLmdldChQKSxIKX0pfTtGLnByb3RvdHlwZS5fZ2VuZXJhdGVTdHJva2VEcmF3U3RlcHM9ZnVuY3Rpb24oKXtyZXR1cm5be2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjpuZXcgbi5OdWxsfV19O0YucHJvdG90eXBlLl9zbGljZUluZGV4Rm9yUG9pbnQ9ZnVuY3Rpb24oRCl7dmFyIEI9TWF0aC5zcXJ0KE1hdGgucG93KEQueCwyKStNYXRoLnBvdyhELnksMikpLEk9TWF0aC5hY29zKC1ELnkvQik7MD5ELngmJihJPTIqTWF0aC5QSS1JKTtmb3IoRD0wO0Q8dGhpcy5fc3RhcnRBbmdsZXMubGVuZ3RoO0QrKylpZih0aGlzLl9zdGFydEFuZ2xlc1tEXTxJJiZ0aGlzLl9lbmRBbmdsZXNbRF0+SSl7dmFyIE89RDticmVha31pZih2b2lkIDAhPT0KTyl7RD10aGlzLmRhdGFzZXRzKClbMF07dmFyIFA9RC5kYXRhKClbT107ST10aGlzLmlubmVyUmFkaXVzKCkuYWNjZXNzb3IoUCxPLEQpO0Q9dGhpcy5vdXRlclJhZGl1cygpLmFjY2Vzc29yKFAsTyxEKTtpZihCPkkmJkI8RClyZXR1cm4gT31yZXR1cm4gbnVsbH07Ri5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgRD10aGlzLEI9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksST10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgiZyIpLmNsYXNzZWQoImxhYmVsLWFyZWEiLCEwKSxPPW5ldyBrLlN2Z0NvbnRleHQoSS5ub2RlKCkpLFA9bmV3IGsuQ2FjaGVNZWFzdXJlcihPKSxIPW5ldyBrLldyaXRlcihQLE8pLEs9dGhpcy5kYXRhc2V0cygpWzBdO3RoaXMuX2dldERhdGFUb0RyYXcoKS5nZXQoSykuZm9yRWFjaChmdW5jdGlvbihNLEwpe3ZhciBSPUQuc2VjdG9yVmFsdWUoKS5hY2Nlc3NvcihNLEwsSyk7aWYoci5NYXRoLmlzVmFsaWROdW1iZXIoUikpe1I9RC5fbGFiZWxGb3JtYXR0ZXIoUiwKTSxMLEspO3ZhciBVPVAubWVhc3VyZShSKSxZPShELl9lbmRBbmdsZXNbTF0rRC5fc3RhcnRBbmdsZXNbTF0pLzIsYmE9RC5vdXRlclJhZGl1cygpLmFjY2Vzc29yKE0sTCxLKTtELm91dGVyUmFkaXVzKCkuc2NhbGUmJihiYT1ELm91dGVyUmFkaXVzKCkuc2NhbGUuc2NhbGUoYmEpKTt2YXIgbWE9RC5pbm5lclJhZGl1cygpLmFjY2Vzc29yKE0sTCxLKTtELmlubmVyUmFkaXVzKCkuc2NhbGUmJihtYT1ELmlubmVyUmFkaXVzKCkuc2NhbGUuc2NhbGUobWEpKTttYT0oYmErbWEpLzI7YmE9TWF0aC5zaW4oWSkqbWEtVS53aWR0aC8yO21hPS1NYXRoLmNvcyhZKSptYS1VLmhlaWdodC8yO3ZhciBhYT1be3g6YmEseTptYX0se3g6YmEseTptYStVLmhlaWdodH0se3g6YmErVS53aWR0aCx5Om1hfSx7eDpiYStVLndpZHRoLHk6bWErVS5oZWlnaHR9XTsoWT1hYS5ldmVyeShmdW5jdGlvbihjYSl7cmV0dXJuIE1hdGguYWJzKGNhLngpPD1ELndpZHRoKCkvMiYmTWF0aC5hYnMoY2EueSk8PUQuaGVpZ2h0KCkvCjJ9KSkmJihZPWFhLm1hcChmdW5jdGlvbihjYSl7cmV0dXJuIEQuX3NsaWNlSW5kZXhGb3JQb2ludChjYSl9KS5ldmVyeShmdW5jdGlvbihjYSl7cmV0dXJuIGNhPT09TH0pKTtNPUIuZmlsbChNLEwsSyk7TT0xLjYqci5Db2xvci5jb250cmFzdCgid2hpdGUiLE0pPHIuQ29sb3IuY29udHJhc3QoImJsYWNrIixNKTtiYT1JLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2JhKyIsIittYSsiKSIpO2JhLmNsYXNzZWQoTT8iZGFyay1sYWJlbCI6ImxpZ2h0LWxhYmVsIiwhMCk7YmEuc3R5bGUoInZpc2liaWxpdHkiLFk/ImluaGVyaXQiOiJoaWRkZW4iKTtILndyaXRlKFIsVS53aWR0aCxVLmhlaWdodCx7eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIn0sYmEubm9kZSgpKX19KX07cmV0dXJuIEZ9KHguUGxvdCk7Yy5fSU5ORVJfUkFESVVTX0tFWT0iaW5uZXItcmFkaXVzIjtjLl9PVVRFUl9SQURJVVNfS0VZPSJvdXRlci1yYWRpdXMiO2MuX1NFQ1RPUl9WQUxVRV9LRVk9CiJzZWN0b3ItdmFsdWUiO2QuUGllPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oeix4KXtmdW5jdGlvbiBDKCl7dGhpcy5jb25zdHJ1Y3Rvcj16fWZvcih2YXIgRiBpbiB4KXguaGFzT3duUHJvcGVydHkoRikmJih6W0ZdPXhbRl0pO3oucHJvdG90eXBlPW51bGw9PT14P09iamVjdC5jcmVhdGUoeCk6KEMucHJvdG90eXBlPXgucHJvdG90eXBlLG5ldyBDKX0sbD1mKDEpLGs9Zig1KSxuPWYoNykscD1mKDE0KSxxPWYoNikscj1mKDM0KSx0PWYoMyksdj1mKDApLHk9ZigyKTtjPWZ1bmN0aW9uKHope2Z1bmN0aW9uIHgoKXt2YXIgQz16LmNhbGwodGhpcyl8fHRoaXM7Qy5fbGFiZWxzRW5hYmxlZD0hMTtDLl9sYWJlbD1udWxsO0MuYW5pbWF0b3IoInJlY3RhbmdsZXMiLG5ldyBuLk51bGwpO0MuYWRkQ2xhc3MoInJlY3RhbmdsZS1wbG90Iik7Qy5hdHRyKCJmaWxsIiwobmV3IHQuQ29sb3IpLnJhbmdlKClbMF0pO3JldHVybiBDfWcoeCwKeik7eC5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbigpe3JldHVybiBuZXcgcS5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgci5SZWN0YW5nbGVTVkdEcmF3ZXJ9LGZ1bmN0aW9uKEMpe3JldHVybiBuZXcgcC5SZWN0YW5nbGVDYW52YXNEcmF3ZXIoQyl9KX07eC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIEM9dGhpcyxGPXoucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLEQ9eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksQj1GW3guX1gyX0tFWV0sST15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSxPPUZbeC5fWTJfS0VZXSxQPXRoaXMueCgpLnNjYWxlLEg9dGhpcy55KCkuc2NhbGU7bnVsbCE9Qj8oRi53aWR0aD1mdW5jdGlvbihLLE0sTCl7cmV0dXJuIE1hdGguYWJzKEIoSyxNLEwpLUQoSyxNLEwpKX0sRi54PWZ1bmN0aW9uKEssTSxMKXtyZXR1cm4gTWF0aC5taW4oQihLLApNLEwpLEQoSyxNLEwpKX0pOihGLndpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIEMuX3JlY3RhbmdsZVdpZHRoKFApfSxGLng9ZnVuY3Rpb24oSyxNLEwpe3JldHVybiBEKEssTSxMKS0uNSpGLndpZHRoKEssTSxMKX0pO251bGwhPU8/KEYuaGVpZ2h0PWZ1bmN0aW9uKEssTSxMKXtyZXR1cm4gTWF0aC5hYnMoTyhLLE0sTCktSShLLE0sTCkpfSxGLnk9ZnVuY3Rpb24oSyxNLEwpe3JldHVybiBNYXRoLm1heChPKEssTSxMKSxJKEssTSxMKSktRi5oZWlnaHQoSyxNLEwpfSk6KEYuaGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIEMuX3JlY3RhbmdsZVdpZHRoKEgpfSxGLnk9ZnVuY3Rpb24oSyxNLEwpe3JldHVybiBJKEssTSxMKS0uNSpGLmhlaWdodChLLE0sTCl9KTtkZWxldGUgRlt4Ll9YMl9LRVldO2RlbGV0ZSBGW3guX1kyX0tFWV07cmV0dXJuIEZ9O3gucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz1mdW5jdGlvbigpe3JldHVyblt7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLAphbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcigicmVjdGFuZ2xlcyIpfV19O3gucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eT1mdW5jdGlvbihDKXtyZXR1cm4ieDIiPT09Qz96LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLCJ4Iik6InkyIj09PUM/ei5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywieSIpOnoucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsQyl9O3gucHJvdG90eXBlLng9ZnVuY3Rpb24oQyxGLEQpe2lmKG51bGw9PUMpcmV0dXJuIHoucHJvdG90eXBlLnguY2FsbCh0aGlzKTtudWxsPT1GP3oucHJvdG90eXBlLnguY2FsbCh0aGlzLEMpOnoucHJvdG90eXBlLnguY2FsbCh0aGlzLEMsRixEKTtudWxsIT1GJiYoRD0oQz10aGlzLngyKCkpJiZDLmFjY2Vzc29yLG51bGwhPUQmJnRoaXMuX2JpbmRQcm9wZXJ0eSh4Ll9YMl9LRVksRCxGLEMucG9zdFNjYWxlKSk7RiBpbnN0YW5jZW9mIHQuQ2F0ZWdvcnkmJgpGLmlubmVyUGFkZGluZygwKS5vdXRlclBhZGRpbmcoMCk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLngyPWZ1bmN0aW9uKEMpe2lmKG51bGw9PUMpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHguX1gyX0tFWSk7dmFyIEY9dGhpcy54KCk7dGhpcy5fYmluZFByb3BlcnR5KHguX1gyX0tFWSxDLEYmJkYuc2NhbGUsdm9pZCAwKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS55PWZ1bmN0aW9uKEMsRixEKXtpZihudWxsPT1DKXJldHVybiB6LnByb3RvdHlwZS55LmNhbGwodGhpcyk7bnVsbD09Rj96LnByb3RvdHlwZS55LmNhbGwodGhpcyxDKTp6LnByb3RvdHlwZS55LmNhbGwodGhpcyxDLEYsRCk7bnVsbCE9RiYmKEQ9KEM9dGhpcy55MigpKSYmQy5hY2Nlc3NvcixudWxsIT1EJiZ0aGlzLl9iaW5kUHJvcGVydHkoeC5fWTJfS0VZLEQsRixDLnBvc3RTY2FsZSkpO0YgaW5zdGFuY2VvZiB0LkNhdGVnb3J5JiZGLmlubmVyUGFkZGluZygwKS5vdXRlclBhZGRpbmcoMCk7CnJldHVybiB0aGlzfTt4LnByb3RvdHlwZS55Mj1mdW5jdGlvbihDKXtpZihudWxsPT1DKXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh4Ll9ZMl9LRVkpO3ZhciBGPXRoaXMueSgpO3RoaXMuX2JpbmRQcm9wZXJ0eSh4Ll9ZMl9LRVksQyxGJiZGLnNjYWxlLHZvaWQgMCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbihDKXt2YXIgRj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTtyZXR1cm4gdGhpcy5lbnRpdGllcygpLmZpbHRlcihmdW5jdGlvbihEKXt2YXIgQj1ELmRhdHVtLEk9RC5pbmRleCxPPUQuZGF0YXNldDtEPUYueChCLEksTyk7dmFyIFA9Ri55KEIsSSxPKSxIPUYud2lkdGgoQixJLE8pO0I9Ri5oZWlnaHQoQixJLE8pO3JldHVybiBEPD1DLngmJkMueDw9RCtIJiZQPD1DLnkmJkMueTw9UCtCfSl9O3gucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oQyl7cmV0dXJuIHRoaXMuX2VudGl0eUJCb3goQy5kYXR1bSwKQy5pbmRleCxDLmRhdGFzZXQsdGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCkpfTt4LnByb3RvdHlwZS5fZW50aXR5QkJveD1mdW5jdGlvbihDLEYsRCxCKXtyZXR1cm57eDpCLngoQyxGLEQpLHk6Qi55KEMsRixEKSx3aWR0aDpCLndpZHRoKEMsRixEKSxoZWlnaHQ6Qi5oZWlnaHQoQyxGLEQpfX07eC5wcm90b3R5cGUubGFiZWw9ZnVuY3Rpb24oQyl7aWYobnVsbD09QylyZXR1cm4gdGhpcy5fbGFiZWw7dGhpcy5fbGFiZWw9Qzt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5sYWJlbHNFbmFibGVkPWZ1bmN0aW9uKEMpe2lmKG51bGw9PUMpcmV0dXJuIHRoaXMuX2xhYmVsc0VuYWJsZWQ7dGhpcy5fbGFiZWxzRW5hYmxlZD1DO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgQz16LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyk7bnVsbCE9dGhpcy54MigpJiYKKEMueDI9eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngyKCkpKTtudWxsIT10aGlzLnkyKCkmJihDLnkyPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55MigpKSk7cmV0dXJuIEN9O3gucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKEMsRixEKXt2YXIgQj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxJPUIueChDLEYsRCksTz1CLnkoQyxGLEQpLFA9Qi53aWR0aChDLEYsRCk7Qz1CLmhlaWdodChDLEYsRCk7cmV0dXJue3g6SStQLzIseTpPK0MvMn19O3gucHJvdG90eXBlLl9yZWN0YW5nbGVXaWR0aD1mdW5jdGlvbihDKXtpZihDIGluc3RhbmNlb2YgdC5DYXRlZ29yeSlyZXR1cm4gQy5yYW5nZUJhbmQoKTt2YXIgRj1DPT09dGhpcy54KCkuc2NhbGU/dGhpcy54KCkuYWNjZXNzb3I6dGhpcy55KCkuYWNjZXNzb3IsRD1sLnNldCh2LkFycmF5LmZsYXR0ZW4odGhpcy5kYXRhc2V0cygpLm1hcChmdW5jdGlvbihPKXtyZXR1cm4gTy5kYXRhKCkubWFwKGZ1bmN0aW9uKFAsCkgpe3JldHVybiBGKFAsSCxPKS52YWx1ZU9mKCl9KX0pKSkudmFsdWVzKCkubWFwKGZ1bmN0aW9uKE8pe3JldHVybitPfSksQj12Lk1hdGgubWluKEQsMCk7RD12Lk1hdGgubWF4KEQsMCk7dmFyIEk9Qy5zY2FsZShCKTtyZXR1cm4oQy5zY2FsZShEKS1JKS9NYXRoLmFicyhELUIpfTt4LnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBDPW5ldyB2Lk1hcCxGPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEQpe3ZhciBCPUQuZGF0YSgpLm1hcChmdW5jdGlvbihJLE8pe3JldHVybiB2Lk1hdGguaXNWYWxpZE51bWJlcihGLngoSSxPLEQpKSYmdi5NYXRoLmlzVmFsaWROdW1iZXIoRi55KEksTyxEKSkmJnYuTWF0aC5pc1ZhbGlkTnVtYmVyKEYud2lkdGgoSSxPLEQpKSYmdi5NYXRoLmlzVmFsaWROdW1iZXIoRi5oZWlnaHQoSSxPLEQpKT9JOm51bGx9KTtDLnNldChELEIpfSk7cmV0dXJuIEN9O3gucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9CmZ1bmN0aW9uKEMpe3ZhciBGPXRoaXM7dGhpcy5fcmVuZGVyQXJlYS5zZWxlY3RBbGwoIi5sYWJlbC1hcmVhIikucmVtb3ZlKCk7dGhpcy5fbGFiZWxzRW5hYmxlZCYmbnVsbCE9dGhpcy5sYWJlbCgpJiZ2LldpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIEYuX2RyYXdMYWJlbHMoKX0sQyl9O3gucHJvdG90eXBlLl9kcmF3TGFiZWxzPWZ1bmN0aW9uKCl7dmFyIEM9dGhpcyxGPXRoaXMuX2dldERhdGFUb0RyYXcoKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihELEIpe3JldHVybiBDLl9kcmF3TGFiZWwoRixELEIpfSl9O3gucHJvdG90eXBlLl9kcmF3TGFiZWw9ZnVuY3Rpb24oQyxGLEQpe3ZhciBCPXRoaXMsST10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxPPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZCgibGFiZWwtYXJlYSIsITApLFA9bmV3IGsuU3ZnQ29udGV4dChPLm5vZGUoKSksSD1uZXcgay5DYWNoZU1lYXN1cmVyKFApLApLPW5ldyBrLldyaXRlcihILFApO1A9dGhpcy54KCkuc2NhbGUucmFuZ2UoKTt2YXIgTT10aGlzLnkoKS5zY2FsZS5yYW5nZSgpLEw9TWF0aC5taW4uYXBwbHkobnVsbCxQKSxSPU1hdGgubWF4LmFwcGx5KG51bGwsUCksVT1NYXRoLm1pbi5hcHBseShudWxsLE0pLFk9TWF0aC5tYXguYXBwbHkobnVsbCxNKTtDLmdldChGKS5mb3JFYWNoKGZ1bmN0aW9uKGJhLG1hKXtpZihudWxsIT1iYSl7dmFyIGFhPSIiK0IubGFiZWwoKShiYSxtYSxGKSxjYT1ILm1lYXN1cmUoYWEpLGZhPUkueChiYSxtYSxGKSxkYT1JLnkoYmEsbWEsRiksbGE9SS53aWR0aChiYSxtYSxGKSxaPUkuaGVpZ2h0KGJhLG1hLEYpO2NhLmhlaWdodDw9WiYmY2Eud2lkdGg8PWxhJiYoWj0oWi1jYS5oZWlnaHQpLzIsZmErPShsYS1jYS53aWR0aCkvMixkYSs9WixsYT17bWluOmZhLG1heDpmYStjYS53aWR0aH0sWj17bWluOmRhLG1heDpkYStjYS5oZWlnaHR9LGxhLm1pbjxMfHxsYS5tYXg+Unx8Wi5taW48VXx8Wi5tYXg+Cll8fEIuX292ZXJsYXlMYWJlbChsYSxaLG1hLEQsQyl8fChiYT1JLmZpbGwoYmEsbWEsRiksYmE9MS42KnYuQ29sb3IuY29udHJhc3QoIndoaXRlIixiYSk8di5Db2xvci5jb250cmFzdCgiYmxhY2siLGJhKSxmYT1PLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2ZhKyIsIitkYSsiKSIpLGZhLmNsYXNzZWQoYmE/ImRhcmstbGFiZWwiOiJsaWdodC1sYWJlbCIsITApLEsud3JpdGUoYWEsY2Eud2lkdGgsY2EuaGVpZ2h0LHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIifSxmYS5ub2RlKCkpKSl9fSl9O3gucHJvdG90eXBlLl9vdmVybGF5TGFiZWw9ZnVuY3Rpb24oQyxGLEQsQixJKXtmb3IodmFyIE89dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksUD10aGlzLmRhdGFzZXRzKCksSD1CO0g8UC5sZW5ndGg7SCsrKWZvcih2YXIgSz1QW0hdLE09SS5nZXQoSyksTD1IPT09Qj9EKzE6MDtMPE0ubGVuZ3RoO0wrKylpZih2LkRPTS5pbnRlcnNlY3RzQkJveChDLApGLHRoaXMuX2VudGl0eUJCb3goTVtMXSxMLEssTykpKXJldHVybiEwO3JldHVybiExfTtyZXR1cm4geH0oZigxNikuWFlQbG90KTtjLl9YMl9LRVk9IngyIjtjLl9ZMl9LRVk9InkyIjtkLlJlY3RhbmdsZT1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHoseCl7ZnVuY3Rpb24gQygpe3RoaXMuY29uc3RydWN0b3I9en1mb3IodmFyIEYgaW4geCl4Lmhhc093blByb3BlcnR5KEYpJiYoeltGXT14W0ZdKTt6LnByb3RvdHlwZT1udWxsPT09eD9PYmplY3QuY3JlYXRlKHgpOihDLnByb3RvdHlwZT14LnByb3RvdHlwZSxuZXcgQyl9LGw9ZigzMSksaz1mKDYpLG49Zig0OCkscD1mKDcpLHE9ZigxNCkscj1mKDMpLHQ9ZigwKSx2PWYoMTkpLHk9ZigyKTtjPWZ1bmN0aW9uKHope2Z1bmN0aW9uIHgoKXt2YXIgQz16LmNhbGwodGhpcyl8fHRoaXM7Qy5hZGRDbGFzcygic2NhdHRlci1wbG90Iik7dmFyIEY9bmV3IHAuRWFzaW5nO0Yuc3RhcnREZWxheSg1KTsKRi5zdGVwRHVyYXRpb24oMjUwKTtGLm1heFRvdGFsRHVyYXRpb24oeS5QbG90Ll9BTklNQVRJT05fTUFYX0RVUkFUSU9OKTtDLmFuaW1hdG9yKHYuQW5pbWF0b3IuTUFJTixGKTtDLmF0dHIoIm9wYWNpdHkiLC42KTtDLmF0dHIoImZpbGwiLChuZXcgci5Db2xvcikucmFuZ2UoKVswXSk7Qy5zaXplKDYpO3ZhciBEPWwuY2lyY2xlKCk7Qy5zeW1ib2woZnVuY3Rpb24oKXtyZXR1cm4gRH0pO3JldHVybiBDfWcoeCx6KTt4LnByb3RvdHlwZS5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcz1mdW5jdGlvbihDKXt2YXIgRj10aGlzO3JldHVybiB6LnByb3RvdHlwZS5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcy5jYWxsKHRoaXMsQykubWFwKGZ1bmN0aW9uKEQpe3ZhciBCPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRi5zaXplKCkpKEQuZGF0dW0sRC5pbmRleCxELmRhdGFzZXQpO0QuZGlhbWV0ZXI9QjtyZXR1cm4gRH0pfTt4LnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKEMpe3ZhciBGPQp0aGlzO3JldHVybiBuZXcgay5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgbi5TeW1ib2xTVkdEcmF3ZXJ9LGZ1bmN0aW9uKEQpe3JldHVybiBuZXcgcS5DYW52YXNEcmF3ZXIoRCxuLm1ha2VTeW1ib2xDYW52YXNEcmF3U3RlcChDLGZ1bmN0aW9uKCl7cmV0dXJuIHkuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRi5zeW1ib2woKSl9LGZ1bmN0aW9uKCl7cmV0dXJuIHkuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRi5zaXplKCkpfSkpfSl9O3gucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oQyxGKXtpZihudWxsPT1DKXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh4Ll9TSVpFX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KHguX1NJWkVfS0VZLEMsRik7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUuc3ltYm9sPWZ1bmN0aW9uKEMpe2lmKG51bGw9PUMpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHguX1NZTUJPTF9LRVkpO3RoaXMuX3Byb3BlcnR5QmluZGluZ3Muc2V0KHguX1NZTUJPTF9LRVksCnthY2Nlc3NvcjpDfSk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7dmFyIEM9W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgRj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxEPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zeW1ib2woKSk7Ri5kPWZ1bmN0aW9uKEIsSSxPKXtyZXR1cm4gRChCLEksTykoMCkobnVsbCl9O0MucHVzaCh7YXR0clRvUHJvamVjdG9yOkYsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3Iodi5BbmltYXRvci5SRVNFVCl9KX1DLnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih2LkFuaW1hdG9yLk1BSU4pfSk7cmV0dXJuIEN9O3gucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgQz16LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyksCkY9eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksRD15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTtDLng9RjtDLnk9RDtDLnRyYW5zZm9ybT1mdW5jdGlvbihCLEksTyl7cmV0dXJuInRyYW5zbGF0ZSgiK0YoQixJLE8pKyIsIitEKEIsSSxPKSsiKSJ9O0MuZD10aGlzLl9jb25zdHJ1Y3RTeW1ib2xHZW5lcmF0b3IoKTtyZXR1cm4gQ307eC5wcm90b3R5cGUuX2NvbnN0cnVjdFN5bWJvbEdlbmVyYXRvcj1mdW5jdGlvbigpe3ZhciBDPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zeW1ib2woKSksRj15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2l6ZSgpKTtyZXR1cm4gZnVuY3Rpb24oRCxCLEkpe3JldHVybiBDKEQsQixJKShGKEQsQixJKSkobnVsbCl9fTt4LnByb3RvdHlwZS5fZW50aXR5Qm91bmRzPWZ1bmN0aW9uKEMpe3JldHVybnt4OkMucG9zaXRpb24ueC1DLmRpYW1ldGVyLzIseTpDLnBvc2l0aW9uLnktQy5kaWFtZXRlci8yLHdpZHRoOkMuZGlhbWV0ZXIsCmhlaWdodDpDLmRpYW1ldGVyfX07eC5wcm90b3R5cGUuX2VudGl0eVZpc2libGVPblBsb3Q9ZnVuY3Rpb24oQyxGKXt2YXIgRD17bWluOkYudG9wTGVmdC54LG1heDpGLmJvdHRvbVJpZ2h0Lnh9O0Y9e21pbjpGLnRvcExlZnQueSxtYXg6Ri5ib3R0b21SaWdodC55fTtDPXRoaXMuX2VudGl0eUJvdW5kcyhDKTtyZXR1cm4gdC5ET00uaW50ZXJzZWN0c0JCb3goRCxGLEMpfTt4LnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEMpe3ZhciBGPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLEQ9eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSksQj15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2l6ZSgpKTtyZXR1cm4gdGhpcy5lbnRpdGllcygpLmZpbHRlcihmdW5jdGlvbihJKXt2YXIgTz1JLmRhdHVtLFA9SS5pbmRleCxIPUkuZGF0YXNldDtJPUYoTyxQLEgpO3ZhciBLPUQoTyxQLEgpO089QihPLFAsSCk7cmV0dXJuIEktTy8yPD1DLngmJkMueDw9SStPLwoyJiZLLU8vMjw9Qy55JiZDLnk8PUsrTy8yfSl9O3JldHVybiB4fShmKDE2KS5YWVBsb3QpO2MuX1NJWkVfS0VZPSJzaXplIjtjLl9TWU1CT0xfS0VZPSJzeW1ib2wiO2QuU2NhdHRlcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHQsdil7ZnVuY3Rpb24geSgpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIHogaW4gdil2Lmhhc093blByb3BlcnR5KHopJiYodFt6XT12W3pdKTt0LnByb3RvdHlwZT1udWxsPT09dj9PYmplY3QuY3JlYXRlKHYpOih5LnByb3RvdHlwZT12LnByb3RvdHlwZSxuZXcgeSl9LGw9Zig3KSxrPWYoNiksbj1mKDQ3KSxwPWYoMykscT1mKDM1KSxyPWYoMik7Yz1mdW5jdGlvbih0KXtmdW5jdGlvbiB2KCl7dmFyIHk9dC5jYWxsKHRoaXMpfHx0aGlzO3kuYWRkQ2xhc3MoInNlZ21lbnQtcGxvdCIpO3kuYXR0cigic3Ryb2tlIiwobmV3IHAuQ29sb3IpLnJhbmdlKClbMF0pO3kuYXR0cigic3Ryb2tlLXdpZHRoIiwKIjJweCIpO3JldHVybiB5fWcodix0KTt2LnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBrLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuLlNlZ21lbnRTVkdEcmF3ZXJ9LGZ1bmN0aW9uKCl7cS53YXJuKCJjYW52YXMgcmVuZGVyZXIgaXMgbm90IHN1cHBvcnRlZCBvbiBTZWdtZW50IFBsb3QhIik7cmV0dXJuIG51bGx9KX07di5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7cmV0dXJuW3thdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6bmV3IGwuTnVsbH1dfTt2LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24oeSl7cmV0dXJuIngyIj09PXk/dC5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywieCIpOiJ5MiI9PT15P3QucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsInkiKTp0LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLAp5KX07di5wcm90b3R5cGUueD1mdW5jdGlvbih5LHope2lmKG51bGw9PXkpcmV0dXJuIHQucHJvdG90eXBlLnguY2FsbCh0aGlzKTtudWxsPT16P3QucHJvdG90eXBlLnguY2FsbCh0aGlzLHkpOih0LnByb3RvdHlwZS54LmNhbGwodGhpcyx5LHopLHk9KHk9dGhpcy54MigpKSYmeS5hY2Nlc3NvcixudWxsIT15JiZ0aGlzLl9iaW5kUHJvcGVydHkodi5fWDJfS0VZLHkseikpO3JldHVybiB0aGlzfTt2LnByb3RvdHlwZS54Mj1mdW5jdGlvbih5KXtpZihudWxsPT15KXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh2Ll9YMl9LRVkpO3ZhciB6PXRoaXMueCgpO3RoaXMuX2JpbmRQcm9wZXJ0eSh2Ll9YMl9LRVkseSx6JiZ6LnNjYWxlKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt2LnByb3RvdHlwZS55PWZ1bmN0aW9uKHkseil7aWYobnVsbD09eSlyZXR1cm4gdC5wcm90b3R5cGUueS5jYWxsKHRoaXMpO251bGw9PXo/dC5wcm90b3R5cGUueS5jYWxsKHRoaXMseSk6KHQucHJvdG90eXBlLnkuY2FsbCh0aGlzLAp5LHopLHk9KHk9dGhpcy55MigpKSYmeS5hY2Nlc3NvcixudWxsIT15JiZ0aGlzLl9iaW5kUHJvcGVydHkodi5fWTJfS0VZLHkseikpO3JldHVybiB0aGlzfTt2LnByb3RvdHlwZS55Mj1mdW5jdGlvbih5KXtpZihudWxsPT15KXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh2Ll9ZMl9LRVkpO3ZhciB6PXRoaXMueSgpO3RoaXMuX2JpbmRQcm9wZXJ0eSh2Ll9ZMl9LRVkseSx6JiZ6LnNjYWxlKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt2LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIHk9dC5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpO3kueDE9ci5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSk7eS54Mj1udWxsPT10aGlzLngyKCk/ci5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSk6ci5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngyKCkpO3kueTE9ci5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7CnkueTI9bnVsbD09dGhpcy55MigpP3IuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpOnIuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55MigpKTtyZXR1cm4geX07di5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbih5KXt5PXRoaXMuZW50aXR5TmVhcmVzdCh5KTtyZXR1cm4gbnVsbCE9eT9beV06W119O3YucHJvdG90eXBlLmVudGl0aWVzSW49ZnVuY3Rpb24oeSx6KXtpZihudWxsPT16KXt2YXIgeD17bWluOnkudG9wTGVmdC54LG1heDp5LmJvdHRvbVJpZ2h0Lnh9O3k9e21pbjp5LnRvcExlZnQueSxtYXg6eS5ib3R0b21SaWdodC55fX1lbHNlIHg9eSx5PXo7cmV0dXJuIHRoaXMuX2VudGl0aWVzSW50ZXJzZWN0aW5nKHgseSl9O3YucHJvdG90eXBlLl9lbnRpdGllc0ludGVyc2VjdGluZz1mdW5jdGlvbih5LHope3ZhciB4PXRoaXMsQz1bXSxGPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO3RoaXMuZW50aXRpZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEQpe3guX2xpbmVJbnRlcnNlY3RzQm94KEQsCnkseixGKSYmQy5wdXNoKEQpfSk7cmV0dXJuIEN9O3YucHJvdG90eXBlLl9saW5lSW50ZXJzZWN0c0JveD1mdW5jdGlvbih5LHoseCxDKXt2YXIgRj10aGlzLEQ9Qy54MSh5LmRhdHVtLHkuaW5kZXgseS5kYXRhc2V0KSxCPUMueDIoeS5kYXR1bSx5LmluZGV4LHkuZGF0YXNldCksST1DLnkxKHkuZGF0dW0seS5pbmRleCx5LmRhdGFzZXQpO3k9Qy55Mih5LmRhdHVtLHkuaW5kZXgseS5kYXRhc2V0KTtpZih6Lm1pbjw9RCYmRDw9ei5tYXgmJngubWluPD1JJiZJPD14Lm1heHx8ei5taW48PUImJkI8PXoubWF4JiZ4Lm1pbjw9eSYmeTw9eC5tYXgpcmV0dXJuITA7dmFyIE89e3g6RCx5Okl9LFA9e3g6Qix5fSxIPVt7eDp6Lm1pbix5OngubWlufSx7eDp6Lm1pbix5OngubWF4fSx7eDp6Lm1heCx5OngubWF4fSx7eDp6Lm1heCx5OngubWlufV07cmV0dXJuIDA8SC5maWx0ZXIoZnVuY3Rpb24oSyxNKXtyZXR1cm4gMCE9PU0/Ri5fbGluZUludGVyc2VjdHNTZWdtZW50KE8sUCxLLEhbTS0xXSkmJgpGLl9saW5lSW50ZXJzZWN0c1NlZ21lbnQoSyxIW00tMV0sTyxQKTohMX0pLmxlbmd0aH07di5wcm90b3R5cGUuX2xpbmVJbnRlcnNlY3RzU2VnbWVudD1mdW5jdGlvbih5LHoseCxDKXtmdW5jdGlvbiBGKEQsQixJKXtyZXR1cm4oQi54LUQueCkqKEkueS1CLnkpLShCLnktRC55KSooSS54LUIueCl9cmV0dXJuIDA+Rih5LHoseCkqRih5LHosQyl9O3JldHVybiB2fShmKDE2KS5YWVBsb3QpO2MuX1gyX0tFWT0ieDIiO2MuX1kyX0tFWT0ieTIiO2QuU2VnbWVudD1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHIsdCl7ZnVuY3Rpb24gdigpe3RoaXMuY29uc3RydWN0b3I9cn1mb3IodmFyIHkgaW4gdCl0Lmhhc093blByb3BlcnR5KHkpJiYoclt5XT10W3ldKTtyLnByb3RvdHlwZT1udWxsPT09dD9PYmplY3QuY3JlYXRlKHQpOih2LnByb3RvdHlwZT10LnByb3RvdHlwZSxuZXcgdil9LGw9ZigxKSxrPWYoNyksbj1mKDIwKSxwPWYoMCk7CmM9Zig1MCk7dmFyIHE9ZigyKTtmPWZ1bmN0aW9uKHIpe2Z1bmN0aW9uIHQoKXt2YXIgdj1yLmNhbGwodGhpcyl8fHRoaXM7di5fc3RhY2tpbmdSZXN1bHQ9bi5tZW1UaHVuayhmdW5jdGlvbigpe3JldHVybiB2LmRhdGFzZXRzKCl9LGZ1bmN0aW9uKCl7cmV0dXJuIHYueCgpLmFjY2Vzc29yfSxmdW5jdGlvbigpe3JldHVybiB2LnkoKS5hY2Nlc3Nvcn0sZnVuY3Rpb24oKXtyZXR1cm4gdi5fc3RhY2tpbmdPcmRlcn0sZnVuY3Rpb24oeSx6LHgsQyl7cmV0dXJuIHAuU3RhY2tpbmcuc3RhY2soeSx6LHgsQyl9KTt2Ll9zdGFja2VkRXh0ZW50PW4ubWVtVGh1bmsodi5fc3RhY2tpbmdSZXN1bHQsZnVuY3Rpb24oKXtyZXR1cm4gdi54KCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHYuX2ZpbHRlckZvclByb3BlcnR5KCJ5Iil9LGZ1bmN0aW9uKHkseix4KXtyZXR1cm4gcC5TdGFja2luZy5zdGFja2VkRXh0ZW50KHkseix4KX0pO3YuX2Jhc2VsaW5lVmFsdWU9MDt2Ll9zdGFja2luZ09yZGVyPQoiYm90dG9tdXAiO3YuYWRkQ2xhc3MoInN0YWNrZWQtYXJlYS1wbG90Iik7di5hdHRyKCJmaWxsLW9wYWNpdHkiLDEpO3YuX2Jhc2VsaW5lVmFsdWVQcm92aWRlcj1mdW5jdGlvbigpe3JldHVyblt2Ll9iYXNlbGluZVZhbHVlXX07di5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZCghMSk7cmV0dXJuIHZ9Zyh0LHIpO3QucHJvdG90eXBlLmNyb3BwZWRSZW5kZXJpbmdFbmFibGVkPWZ1bmN0aW9uKHYpe3JldHVybiBudWxsPT12P3IucHJvdG90eXBlLmNyb3BwZWRSZW5kZXJpbmdFbmFibGVkLmNhbGwodGhpcyk6dj8ocC5XaW5kb3cud2FybigiV2FybmluZzogU3RhY2tlZCBBcmVhIFBsb3QgZG9lcyBub3Qgc3VwcG9ydCBjcm9wcGVkIHJlbmRlcmluZy4iKSx0aGlzKTpyLnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZC5jYWxsKHRoaXMsdil9O3QucHJvdG90eXBlLl9nZXRBbmltYXRvcj1mdW5jdGlvbigpe3JldHVybiBuZXcgay5OdWxsfTt0LnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtyLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTsKdGhpcy5fYmFzZWxpbmU9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApfTt0LnByb3RvdHlwZS54PWZ1bmN0aW9uKHYseSl7aWYobnVsbD09dilyZXR1cm4gci5wcm90b3R5cGUueC5jYWxsKHRoaXMpO251bGw9PXk/ci5wcm90b3R5cGUueC5jYWxsKHRoaXMsdik6ci5wcm90b3R5cGUueC5jYWxsKHRoaXMsdix5KTt0aGlzLl9jaGVja1NhbWVEb21haW4oKTtyZXR1cm4gdGhpc307dC5wcm90b3R5cGUueT1mdW5jdGlvbih2LHkpe2lmKG51bGw9PXYpcmV0dXJuIHIucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtudWxsPT15P3IucHJvdG90eXBlLnkuY2FsbCh0aGlzLHYpOnIucHJvdG90eXBlLnkuY2FsbCh0aGlzLHYseSk7dGhpcy5fY2hlY2tTYW1lRG9tYWluKCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLnN0YWNraW5nT3JkZXI9ZnVuY3Rpb24odil7aWYobnVsbD09dilyZXR1cm4gdGhpcy5fc3RhY2tpbmdPcmRlcjt0aGlzLl9zdGFja2luZ09yZGVyPQp2O3RoaXMuX29uRGF0YXNldFVwZGF0ZSgpO3JldHVybiB0aGlzfTt0LnByb3RvdHlwZS5kb3duc2FtcGxpbmdFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHIucHJvdG90eXBlLmRvd25zYW1wbGluZ0VuYWJsZWQuY2FsbCh0aGlzKX07dC5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbigpe3ZhciB2PXRoaXMueSgpLnNjYWxlLnNjYWxlKHRoaXMuX2Jhc2VsaW5lVmFsdWUpO3Y9e3gxOjAseTE6dix4Mjp0aGlzLndpZHRoKCkseTI6dn07dGhpcy5fZ2V0QW5pbWF0b3IoImJhc2VsaW5lIikuYW5pbWF0ZSh0aGlzLl9iYXNlbGluZSx2KX07dC5wcm90b3R5cGUuX3VwZGF0ZVlTY2FsZT1mdW5jdGlvbigpe3ZhciB2PXRoaXMueSgpO3Y9diYmdi5zY2FsZTtudWxsIT12JiYodi5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlciksdi5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlcikpfTsKdC5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX2NoZWNrU2FtZURvbWFpbigpO3IucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKTtyZXR1cm4gdGhpc307dC5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5PWZ1bmN0aW9uKHYpe3JldHVybiJ5Ij09PXY/W3RoaXMuX3N0YWNrZWRFeHRlbnQoKV06ci5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5LmNhbGwodGhpcyx2KX07dC5wcm90b3R5cGUuX2NoZWNrU2FtZURvbWFpbj1mdW5jdGlvbigpe2lmKHRoaXMuX3Byb2plY3RvcnNSZWFkeSgpKXt2YXIgdj10aGlzLmRhdGFzZXRzKCkseT10aGlzLngoKS5hY2Nlc3Nvcix6PXYubWFwKGZ1bmN0aW9uKEMpe3JldHVybiBsLnNldChDLmRhdGEoKS5tYXAoZnVuY3Rpb24oRixEKXtyZXR1cm4geShGLEQsQykudG9TdHJpbmcoKX0pKS52YWx1ZXMoKX0pLHg9dC5fZG9tYWluS2V5cyh2LHkpO3ouc29tZShmdW5jdGlvbihDKXtyZXR1cm4gQy5sZW5ndGghPT0KeC5sZW5ndGh9KSYmcC5XaW5kb3cud2FybigidGhlIGRvbWFpbnMgYWNyb3NzIHRoZSBkYXRhc2V0cyBhcmUgbm90IHRoZSBzYW1lLiBQbG90IG1heSBwcm9kdWNlIHVuaW50ZW5kZWQgYmVoYXZpb3IuIil9fTt0Ll9kb21haW5LZXlzPWZ1bmN0aW9uKHYseSl7dmFyIHo9bC5zZXQoKTt2LmZvckVhY2goZnVuY3Rpb24oeCl7eC5kYXRhKCkuZm9yRWFjaChmdW5jdGlvbihDLEYpe3ouYWRkKHkoQyxGLHgpKX0pfSk7cmV0dXJuIHoudmFsdWVzKCl9O3QucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB2KEQsQixJKXtyZXR1cm4gcC5TdGFja2luZy5ub3JtYWxpemVLZXkoQyhELEIsSSkpfXZhciB5PXRoaXMsej1yLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcykseD10aGlzLnkoKS5hY2Nlc3NvcixDPXRoaXMueCgpLmFjY2Vzc29yLEY9dGhpcy5fc3RhY2tpbmdSZXN1bHQoKTt6LmQ9dGhpcy5fY29uc3RydWN0QXJlYVByb2plY3RvcihxLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSwKZnVuY3Rpb24oRCxCLEkpe3JldHVybiB5LnkoKS5zY2FsZS5zY2FsZSgreChELEIsSSkrRi5nZXQoSSkuZ2V0KHYoRCxCLEkpKS5vZmZzZXQpfSxmdW5jdGlvbihELEIsSSl7cmV0dXJuIHkueSgpLnNjYWxlLnNjYWxlKEYuZ2V0KEkpLmdldCh2KEQsQixJKSkub2Zmc2V0KX0pO3JldHVybiB6fTt0LnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbih2LHkseil7dmFyIHg9ci5wcm90b3R5cGUuX3BpeGVsUG9pbnQuY2FsbCh0aGlzLHYseSx6KSxDPXRoaXMueCgpLmFjY2Vzc29yKHYseSx6KTt2PXRoaXMueSgpLmFjY2Vzc29yKHYseSx6KTt6PXRoaXMueSgpLnNjYWxlLnNjYWxlKCt2K3RoaXMuX3N0YWNraW5nUmVzdWx0KCkuZ2V0KHopLmdldChwLlN0YWNraW5nLm5vcm1hbGl6ZUtleShDKSkub2Zmc2V0KTtyZXR1cm57eDp4LngseTp6fX07cmV0dXJuIHR9KGMuQXJlYSk7ZC5TdGFja2VkQXJlYT1mfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fApmdW5jdGlvbih0LHYpe2Z1bmN0aW9uIHkoKXt0aGlzLmNvbnN0cnVjdG9yPXR9Zm9yKHZhciB6IGluIHYpdi5oYXNPd25Qcm9wZXJ0eSh6KSYmKHRbel09dlt6XSk7dC5wcm90b3R5cGU9bnVsbD09PXY/T2JqZWN0LmNyZWF0ZSh2KTooeS5wcm90b3R5cGU9di5wcm90b3R5cGUsbmV3IHkpfSxsPWYoNSksaz1mKDgpLG49ZigyMCkscD1mKDApLHE9ZigyNykscj1mKDIpO2M9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gdih5KXt2b2lkIDA9PT15JiYoeT0idmVydGljYWwiKTt2YXIgej10LmNhbGwodGhpcyx5KXx8dGhpczt6Ll9leHRyZW1hRm9ybWF0dGVyPWsuaWRlbnRpdHkoKTt6Ll9zdGFja2luZ1Jlc3VsdD1uLm1lbVRodW5rKGZ1bmN0aW9uKCl7cmV0dXJuIHouZGF0YXNldHMoKX0sZnVuY3Rpb24oKXtyZXR1cm4gei5wb3NpdGlvbigpLmFjY2Vzc29yfSxmdW5jdGlvbigpe3JldHVybiB6Lmxlbmd0aCgpLmFjY2Vzc29yfSxmdW5jdGlvbigpe3JldHVybiB6Ll9zdGFja2luZ09yZGVyfSwKZnVuY3Rpb24oeCxDLEYsRCl7cmV0dXJuIHAuU3RhY2tpbmcuc3RhY2soeCxDLEYsRCl9KTt6Ll9zdGFja2VkRXh0ZW50PW4ubWVtVGh1bmsoei5fc3RhY2tpbmdSZXN1bHQsZnVuY3Rpb24oKXtyZXR1cm4gei5wb3NpdGlvbigpLmFjY2Vzc29yfSxmdW5jdGlvbigpe3JldHVybiB6Ll9maWx0ZXJGb3JQcm9wZXJ0eSh6Ll9pc1ZlcnRpY2FsPyJ5IjoieCIpfSxmdW5jdGlvbih4LEMsRil7cmV0dXJuIHAuU3RhY2tpbmcuc3RhY2tlZEV4dGVudCh4LEMsRil9KTt6LmFkZENsYXNzKCJzdGFja2VkLWJhci1wbG90Iik7ei5fc3RhY2tpbmdPcmRlcj0iYm90dG9tdXAiO3JldHVybiB6fWcodix0KTt2LnByb3RvdHlwZS5zdGFja2luZ09yZGVyPWZ1bmN0aW9uKHkpe2lmKG51bGw9PXkpcmV0dXJuIHRoaXMuX3N0YWNraW5nT3JkZXI7dGhpcy5fc3RhY2tpbmdPcmRlcj15O3RoaXMuX29uRGF0YXNldFVwZGF0ZSgpO3JldHVybiB0aGlzfTt2LnByb3RvdHlwZS5leHRyZW1hRm9ybWF0dGVyPWZ1bmN0aW9uKHkpe2lmKDA9PT0KYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fZXh0cmVtYUZvcm1hdHRlcjt0aGlzLl9leHRyZW1hRm9ybWF0dGVyPXk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307di5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fbGFiZWxBcmVhPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZChxLkJhci5fTEFCRUxfQVJFQV9DTEFTUywhMCk7dmFyIHk9bmV3IGwuU3ZnQ29udGV4dCh0aGlzLl9sYWJlbEFyZWEubm9kZSgpKTt0aGlzLl9tZWFzdXJlcj1uZXcgbC5DYWNoZU1lYXN1cmVyKHkpO3RoaXMuX3dyaXRlcj1uZXcgbC5Xcml0ZXIodGhpcy5fbWVhc3VyZXIseSl9O3YucHJvdG90eXBlLl9kcmF3TGFiZWxzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24geShQLEgpe3ZhciBLPXguX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yKCksTT14LndpZHRoKCksTD14LmhlaWdodCgpO1AuZm9yRWFjaChmdW5jdGlvbihSKXtpZihSLmV4dGVudCE9PQpDKXt2YXIgVT14LmV4dHJlbWFGb3JtYXR0ZXIoKShSLmV4dGVudCksWT14Ll9tZWFzdXJlci5tZWFzdXJlKFUpLGJhPVIuc3RhY2tlZERhdHVtLG1hPWJhLm9yaWdpbmFsRGF0dW0sYWE9YmEub3JpZ2luYWxJbmRleDtiYT1iYS5vcmlnaW5hbERhdGFzZXQ7eC5faXNEYXR1bU9uU2NyZWVuKEssTSxMLG1hLGFhLGJhKSYmKG1hPXIuUGxvdC5fc2NhbGVkQWNjZXNzb3IoeC5hdHRyKHEuQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSkpKG1hLGFhLGJhKSxhYT1ELnNjYWxlKFIuZXh0ZW50KSxSPXguX2dldFBvc2l0aW9uQXR0cihGLnNjYWxlKFIuYXhpc1ZhbHVlKSxtYSkrbWEvMixSPUgoeC5faXNWZXJ0aWNhbD97eDpSLHk6YWF9Ont4OmFhLHk6Un0sWSxtYSksVT16KFUse3RvcExlZnQ6Uixib3R0b21SaWdodDp7eDpSLngrWS53aWR0aCx5OlIueStZLmhlaWdodH19LG1hKSxPLnB1c2goVSkpfX0pfWZ1bmN0aW9uIHooUCxILEspe3ZhciBNPUgudG9wTGVmdCxMPU0ueCxSPU0ueTtNPUguYm90dG9tUmlnaHQueC0KSC50b3BMZWZ0Lng7SD1ILmJvdHRvbVJpZ2h0LnktSC50b3BMZWZ0Lnk7Sz14Ll9pc1ZlcnRpY2FsP00+SzpIPks7S3x8KEw9eC5fbGFiZWxBcmVhLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0wrIiwgIitSKyIpIiksTC5jbGFzc2VkKCJzdGFja2VkLWJhci1sYWJlbCIsITApLHguX3dyaXRlci53cml0ZShQLE0sSCx7eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIn0sTC5ub2RlKCkpKTtyZXR1cm4gS312YXIgeD10aGlzO3QucHJvdG90eXBlLl9kcmF3TGFiZWxzLmNhbGwodGhpcyk7dGhpcy5fbGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpO3ZhciBDPSt0aGlzLmJhc2VsaW5lVmFsdWUoKSxGPXRoaXMucG9zaXRpb24oKS5zY2FsZSxEPXRoaXMubGVuZ3RoKCkuc2NhbGUsQj1wLlN0YWNraW5nLnN0YWNrZWRFeHRlbnRzKHRoaXMuX3N0YWNraW5nUmVzdWx0KCkpLEk9Qi5taW5pbXVtRXh0ZW50cyxPPVtdO3koQi5tYXhpbXVtRXh0ZW50cywKZnVuY3Rpb24oUCxIKXt2YXIgSz14Ll9pc1ZlcnRpY2FsP0gud2lkdGg6SC5oZWlnaHQ7SD14Ll9pc1ZlcnRpY2FsP0guaGVpZ2h0Okgud2lkdGg7cmV0dXJue3g6eC5faXNWZXJ0aWNhbD9QLngtSy8yOlAueCt2Ll9FWFRSRU1BX0xBQkVMX01BUkdJTl9GUk9NX0JBUix5OnguX2lzVmVydGljYWw/UC55LUg6UC55LUsvMn19KTt5KEksZnVuY3Rpb24oUCxIKXt2YXIgSz14Ll9pc1ZlcnRpY2FsP0gud2lkdGg6SC5oZWlnaHQ7SD14Ll9pc1ZlcnRpY2FsP0guaGVpZ2h0Okgud2lkdGg7cmV0dXJue3g6eC5faXNWZXJ0aWNhbD9QLngtSy8yOlAueC1ILHk6eC5faXNWZXJ0aWNhbD9QLnkrdi5fRVhUUkVNQV9MQUJFTF9NQVJHSU5fRlJPTV9CQVI6UC55LUsvMn19KTtPLnNvbWUoZnVuY3Rpb24oUCl7cmV0dXJuIFB9KSYmdGhpcy5fbGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpfTt2LnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXtmdW5jdGlvbiB5KE0sCkwsUil7cmV0dXJuIDA+K1AoTSxMLFIpP0MoTSxMLFIpOngoTSxMLFIpfWZ1bmN0aW9uIHooTSxMLFIpe3JldHVybiBNYXRoLmFicyh4KE0sTCxSKS1DKE0sTCxSKSl9ZnVuY3Rpb24geChNLEwsUil7cmV0dXJuIE8uc2NhbGUoK1AoTSxMLFIpK0suZ2V0KFIpLmdldChGKE0sTCxSKSkub2Zmc2V0KX1mdW5jdGlvbiBDKE0sTCxSKXtyZXR1cm4gTy5zY2FsZShLLmdldChSKS5nZXQoRihNLEwsUikpLm9mZnNldCl9ZnVuY3Rpb24gRihNLEwsUil7cmV0dXJuIHAuU3RhY2tpbmcubm9ybWFsaXplS2V5KEgoTSxMLFIpKX12YXIgRD10aGlzLEI9dC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyksST10aGlzLl9pc1ZlcnRpY2FsPyJ5IjoieCIsTz10aGlzLmxlbmd0aCgpLnNjYWxlLFA9dGhpcy5sZW5ndGgoKS5hY2Nlc3NvcixIPXRoaXMucG9zaXRpb24oKS5hY2Nlc3NvcixLPXRoaXMuX3N0YWNraW5nUmVzdWx0KCk7Qlt0aGlzLl9pc1ZlcnRpY2FsPyJoZWlnaHQiOgoid2lkdGgiXT16O0JbSV09ZnVuY3Rpb24oTSxMLFIpe3JldHVybiBELl9pc1ZlcnRpY2FsP3koTSxMLFIpOnkoTSxMLFIpLXooTSxMLFIpfTtyZXR1cm4gQn07di5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5PWZ1bmN0aW9uKHkpe3JldHVybiB5PT09KHRoaXMuX2lzVmVydGljYWw/InkiOiJ4Iik/W3RoaXMuX3N0YWNrZWRFeHRlbnQoKV06dC5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5LmNhbGwodGhpcyx5KX07di5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyk7dGhpcy5fbWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHZ9KHEuQmFyKTtjLl9FWFRSRU1BX0xBQkVMX01BUkdJTl9GUk9NX0JBUj01O2QuU3RhY2tlZEJhcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG4scCl7ZnVuY3Rpb24gcSgpe3RoaXMuY29uc3RydWN0b3I9Cm59Zm9yKHZhciByIGluIHApcC5oYXNPd25Qcm9wZXJ0eShyKSYmKG5bcl09cFtyXSk7bi5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToocS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IHEpfSxsPWYoMCk7Yz1mKDI3KTt2YXIgaz1mKDIpO2Y9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcCgpe3ZhciBxPW4uY2FsbCh0aGlzKXx8dGhpcztxLl9jb25uZWN0b3JzRW5hYmxlZD0hMTtxLmFkZENsYXNzKCJ3YXRlcmZhbGwtcGxvdCIpO3JldHVybiBxfWcocCxuKTtwLnByb3RvdHlwZS5jb25uZWN0b3JzRW5hYmxlZD1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl9jb25uZWN0b3JzRW5hYmxlZDt0aGlzLl9jb25uZWN0b3JzRW5hYmxlZD1xO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS50b3RhbD1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChwLl9UT1RBTF9LRVkpO3RoaXMuX2JpbmRQcm9wZXJ0eShwLl9UT1RBTF9LRVksCnEsbnVsbCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24ocSl7dmFyIHI9dGhpczt0aGlzLl9jb25uZWN0b3JBcmVhLnNlbGVjdEFsbCgibGluZSIpLnJlbW92ZSgpO3RoaXMuX2Nvbm5lY3RvcnNFbmFibGVkJiZsLldpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIHIuX2RyYXdDb25uZWN0b3JzKCl9LHEpfTtwLnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0PWZ1bmN0aW9uKHEpe3E9bi5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldC5jYWxsKHRoaXMscSk7dGhpcy5fY29ubmVjdG9yQXJlYT10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgiZyIpLmNsYXNzZWQocC5fQ09OTkVDVE9SX0FSRUFfQ0xBU1MsITApO3JldHVybiBxfTtwLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24ocSl7cmV0dXJuInkiPT09cT9bdGhpcy5fZXh0ZW50XTpuLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLApxKX07cC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIHE9dGhpcyxyPW4ucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLHQ9dGhpcy55KCkuc2NhbGUsdj1rLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMudG90YWwoKSk7bnVsbD09dGhpcy5hdHRyKCJ5IikmJihyLnk9ZnVuY3Rpb24oeSx6LHgpe3ZhciBDPXEueSgpLmFjY2Vzc29yKHkseix4KTtpZih2KHkseix4KSlyZXR1cm4gTWF0aC5taW4odC5zY2FsZShDKSx0LnNjYWxlKDApKTt5PXEuX3N1YnRvdGFsc1t6XTtpZigwPT09eilyZXR1cm4gMD5DP3Quc2NhbGUoeS1DKTp0LnNjYWxlKHkpO3o9cS5fc3VidG90YWxzW3otMV07cmV0dXJuIHk+ej90LnNjYWxlKHkpOnQuc2NhbGUoeil9KTtudWxsPT10aGlzLmF0dHIoImhlaWdodCIpJiYoci5oZWlnaHQ9ZnVuY3Rpb24oeSx6LHgpe3ZhciBDPXYoeSx6LHgpO3k9cS55KCkuYWNjZXNzb3IoeSx6LHgpO2lmKEMpcmV0dXJuIE1hdGguYWJzKHQuc2NhbGUoeSktCnQuc2NhbGUoMCkpO0M9cS5fc3VidG90YWxzW3pdO2lmKDA9PT16KXJldHVybiBNYXRoLmFicyh0LnNjYWxlKEMpLXQuc2NhbGUoQy15KSk7ej1xLl9zdWJ0b3RhbHNbei0xXTtyZXR1cm4gTWF0aC5hYnModC5zY2FsZShDKS10LnNjYWxlKHopKX0pO3JbImNsYXNzIl09ZnVuY3Rpb24oeSx6LHgpe3ZhciBDPSIiO251bGwhPXEuYXR0cigiY2xhc3MiKSYmKEM9cS5hdHRyKCJjbGFzcyIpLmFjY2Vzc29yKHkseix4KSsiICIpO2lmKHYoeSx6LHgpKXJldHVybiBDK3AuX0JBUl9UT1RBTF9DTEFTUzt5PXEueSgpLmFjY2Vzc29yKHkseix4KTtyZXR1cm4gQysoMDx5P3AuX0JBUl9HUk9XVEhfQ0xBU1M6cC5fQkFSX0RFQ0xJTkVfQ0xBU1MpfTtyZXR1cm4gcn07cC5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVN1YnRvdGFscygpO24ucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuX2NhbGN1bGF0ZVN1YnRvdGFsc0FuZEV4dGVudD0KZnVuY3Rpb24ocSl7dmFyIHI9dGhpcyx0PU51bWJlci5NQVhfVkFMVUUsdj1OdW1iZXIuTUlOX1ZBTFVFLHk9MCx6PSExO3EuZGF0YSgpLmZvckVhY2goZnVuY3Rpb24oeCxDKXt2YXIgRj1yLnkoKS5hY2Nlc3Nvcih4LEMscSk7KHg9ci50b3RhbCgpLmFjY2Vzc29yKHgsQyxxKSkmJjAhPT1DfHwoeSs9Rik7ci5fc3VidG90YWxzLnB1c2goeSk7eTx0JiYodD15KTt5PnYmJih2PXkpO3gmJihGPHQmJih0PUYpLEY+diYmKHY9RikpO2lmKCF6JiZ4KXtDPUYteTtmb3IoRj0wO0Y8ci5fc3VidG90YWxzLmxlbmd0aDtGKyspci5fc3VidG90YWxzW0ZdKz1DO3o9ITA7eSs9Qzt0Kz1DO3YrPUN9fSk7dGhpcy5fZXh0ZW50PVt0LHZdfTtwLnByb3RvdHlwZS5fZHJhd0Nvbm5lY3RvcnM9ZnVuY3Rpb24oKXtmb3IodmFyIHE9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCkscj10aGlzLmRhdGFzZXRzKClbMF0sdD0xO3Q8ci5kYXRhKCkubGVuZ3RoO3QrKyl7dmFyIHY9dC0xLHk9ci5kYXRhKClbdF0sCno9ci5kYXRhKClbdl07ej1xLngoeix2LHIpO3ZhciB4PXEueCh5LHQscikrcS53aWR0aCh5LHQsciksQz1xLnkoeSx0LHIpO2lmKDA8dGhpcy5fc3VidG90YWxzW3RdJiZ0aGlzLl9zdWJ0b3RhbHNbdF0+dGhpcy5fc3VidG90YWxzW3ZdfHwwPnRoaXMuX3N1YnRvdGFsc1t0XSYmdGhpcy5fc3VidG90YWxzW3RdPj10aGlzLl9zdWJ0b3RhbHNbdl0pQz1xLnkoeSx0LHIpK3EuaGVpZ2h0KHksdCxyKTt0aGlzLl9jb25uZWN0b3JBcmVhLmFwcGVuZCgibGluZSIpLmNsYXNzZWQocC5fQ09OTkVDVE9SX0NMQVNTLCEwKS5hdHRyKCJ4MSIseikuYXR0cigieDIiLHgpLmF0dHIoInkxIixDKS5hdHRyKCJ5MiIsQyl9fTtwLnByb3RvdHlwZS5fdXBkYXRlU3VidG90YWxzPWZ1bmN0aW9uKCl7dmFyIHE9dGhpcy5kYXRhc2V0cygpOzA8cS5sZW5ndGgmJihxPXFbcS5sZW5ndGgtMV0sdGhpcy5fc3VidG90YWxzPVtdLHRoaXMuX2NhbGN1bGF0ZVN1YnRvdGFsc0FuZEV4dGVudChxKSl9O3JldHVybiBwfShjLkJhcik7CmYuX0JBUl9ERUNMSU5FX0NMQVNTPSJ3YXRlcmZhbGwtZGVjbGluZSI7Zi5fQkFSX0dST1dUSF9DTEFTUz0id2F0ZXJmYWxsLWdyb3d0aCI7Zi5fQkFSX1RPVEFMX0NMQVNTPSJ3YXRlcmZhbGwtdG90YWwiO2YuX0NPTk5FQ1RPUl9DTEFTUz0iY29ubmVjdG9yIjtmLl9DT05ORUNUT1JfQVJFQV9DTEFTUz0iY29ubmVjdG9yLWFyZWEiO2YuX1RPVEFMX0tFWT0idG90YWwiO2QuV2F0ZXJmYWxsPWZ9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixwKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgciBpbiBwKXAuaGFzT3duUHJvcGVydHkocikmJihuW3JdPXBbcl0pO24ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX0sbD1mKDEpLGs9ZigwKTtjPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHAocSl7dmFyIHI9bi5jYWxsKHRoaXMpfHx0aGlzOwpzd2l0Y2gocSl7Y2FzZSBudWxsOmNhc2Ugdm9pZCAwOm51bGw9PXAuX3Bsb3R0YWJsZUNvbG9yQ2FjaGUmJihwLl9wbG90dGFibGVDb2xvckNhY2hlPXAuX2dldFBsb3R0YWJsZUNvbG9ycygpKTtxPWwuc2NhbGVPcmRpbmFsKCkucmFuZ2UocC5fcGxvdHRhYmxlQ29sb3JDYWNoZSk7YnJlYWs7Y2FzZSAiQ2F0ZWdvcnkxMCI6Y2FzZSAiY2F0ZWdvcnkxMCI6Y2FzZSAiMTAiOnE9bC5zY2FsZU9yZGluYWwobC5zY2hlbWVDYXRlZ29yeTEwKTticmVhaztjYXNlICJDYXRlZ29yeTIwIjpjYXNlICJjYXRlZ29yeTIwIjpjYXNlICIyMCI6cT1sLnNjYWxlT3JkaW5hbChsLnNjaGVtZUNhdGVnb3J5MjApO2JyZWFrO2Nhc2UgIkNhdGVnb3J5MjBiIjpjYXNlICJjYXRlZ29yeTIwYiI6Y2FzZSAiMjBiIjpxPWwuc2NhbGVPcmRpbmFsKGwuc2NoZW1lQ2F0ZWdvcnkyMGIpO2JyZWFrO2Nhc2UgIkNhdGVnb3J5MjBjIjpjYXNlICJjYXRlZ29yeTIwYyI6Y2FzZSAiMjBjIjpxPWwuc2NhbGVPcmRpbmFsKGwuc2NoZW1lQ2F0ZWdvcnkyMGMpOwpicmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBDb2xvclNjYWxlIHR5cGUiKTt9ci5fZDNTY2FsZT1xO3JldHVybiByfWcocCxuKTtwLnByb3RvdHlwZS5leHRlbnRPZlZhbHVlcz1mdW5jdGlvbihxKXtyZXR1cm4gay5BcnJheS51bmlxKHEpfTtwLnByb3RvdHlwZS5fZ2V0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIGsuQXJyYXkudW5pcSh0aGlzLl9nZXRBbGxJbmNsdWRlZFZhbHVlcygpKX07cC5pbnZhbGlkYXRlQ29sb3JDYWNoZT1mdW5jdGlvbigpe3AuX3Bsb3R0YWJsZUNvbG9yQ2FjaGU9bnVsbH07cC5fZ2V0UGxvdHRhYmxlQ29sb3JzPWZ1bmN0aW9uKCl7Zm9yKHZhciBxPVtdLHI9bC5zZWxlY3QoImJvZHkiKS5hcHBlbmQoInBsb3R0YWJsZS1jb2xvci10ZXN0ZXIiKSx0PWsuQ29sb3IuY29sb3JUZXN0KHIsIiIpLHY9MCx5PWsuQ29sb3IuY29sb3JUZXN0KHIsInBsb3R0YWJsZS1jb2xvcnMtMCIpO251bGwhPXkmJnY8dGhpcy5fTUFYSU1VTV9DT0xPUlNfRlJPTV9DU1MmJgooeSE9PXR8fHkhPT1xW3EubGVuZ3RoLTFdKTspcS5wdXNoKHkpLHYrKyx5PWsuQ29sb3IuY29sb3JUZXN0KHIsInBsb3R0YWJsZS1jb2xvcnMtIit2KTtyLnJlbW92ZSgpO3JldHVybiBxfTtwLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihxKXt2YXIgcj10aGlzLl9kM1NjYWxlKHEpO3E9dGhpcy5kb21haW4oKS5pbmRleE9mKHEpO3E9TWF0aC5mbG9vcihxL3RoaXMucmFuZ2UoKS5sZW5ndGgpO3JldHVybiBrLkNvbG9yLmxpZ2h0ZW5Db2xvcihyLE1hdGgubG9nKHEqcC5fTE9PUF9MSUdIVEVOX0ZBQ1RPUisxKSl9O3AucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCl9O3AucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24ocSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5fZDNTY2FsZS5kb21haW4oKTt0aGlzLl9kM1NjYWxlLmRvbWFpbihxKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuX2dldFJhbmdlPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnJhbmdlKCl9O3AucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbihxKXt0aGlzLl9kM1NjYWxlLnJhbmdlKHEpfTtyZXR1cm4gcH0oZigxNykuU2NhbGUpO2MuX0xPT1BfTElHSFRFTl9GQUNUT1I9MS42O2MuX01BWElNVU1fQ09MT1JTX0ZST01fQ1NTPTI1NjtkLkNvbG9yPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixwKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgciBpbiBwKXAuaGFzT3duUHJvcGVydHkocikmJihuW3JdPXBbcl0pO24ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX0sbD1mKDEpLGs9ZigwKTtjPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHAocSl7dm9pZCAwPT09cSYmKHE9ImxpbmVhciIpO3ZhciByPW4uY2FsbCh0aGlzKXx8dGhpcztzd2l0Y2gocSl7Y2FzZSAibGluZWFyIjpyLl9jb2xvclNjYWxlPQpsLnNjYWxlTGluZWFyKCk7YnJlYWs7Y2FzZSAibG9nIjpyLl9jb2xvclNjYWxlPWwuc2NhbGVMb2coKTticmVhaztjYXNlICJzcXJ0IjpyLl9jb2xvclNjYWxlPWwuc2NhbGVTcXJ0KCk7YnJlYWs7Y2FzZSAicG93IjpyLl9jb2xvclNjYWxlPWwuc2NhbGVQb3coKX1pZihudWxsPT1yLl9jb2xvclNjYWxlKXRocm93IEVycm9yKCJ1bmtub3duIFF1YW50aXRhdGl2ZVNjYWxlIHNjYWxlIHR5cGUgIitxKTtyLnJhbmdlKHAuUkVEUyk7cmV0dXJuIHJ9ZyhwLG4pO3AucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKHEpe3E9bC5leHRlbnQocSk7cmV0dXJuIG51bGw9PXFbMF18fG51bGw9PXFbMV0/W106cX07cC5wcm90b3R5cGUuX2QzSW50ZXJwb2xhdGVkU2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29sb3JTY2FsZS5yYW5nZShbMCwxXSkuaW50ZXJwb2xhdGUodGhpcy5faW50ZXJwb2xhdGVDb2xvcnMoKSl9O3AucHJvdG90eXBlLl9pbnRlcnBvbGF0ZUNvbG9ycz0KZnVuY3Rpb24oKXt2YXIgcT10aGlzLl9jb2xvclJhbmdlO2lmKDI+cS5sZW5ndGgpdGhyb3cgRXJyb3IoIkNvbG9yIHNjYWxlIGFycmF5cyBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIGVsZW1lbnRzLiIpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihyKXtyPU1hdGgubWF4KDAsTWF0aC5taW4oMSxyKSk7cio9cS5sZW5ndGgtMTt2YXIgdD1NYXRoLmZsb29yKHIpLHY9ci10O3JldHVybiBsLmludGVycG9sYXRlTGFiKHFbdF0scVtNYXRoLmNlaWwocildKSh2KX19fTtwLnByb3RvdHlwZS5fcmVzZXRTY2FsZT1mdW5jdGlvbigpe3RoaXMuX2QzU2NhbGU9dGhpcy5fZDNJbnRlcnBvbGF0ZWRTY2FsZSgpO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfTtwLnByb3RvdHlwZS5hdXRvRG9tYWluPWZ1bmN0aW9uKCl7dmFyIHE9dGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKTswPHEubGVuZ3RoJiZ0aGlzLl9zZXREb21haW4oW2suTWF0aC5taW4ocSwKMCksay5NYXRoLm1heChxLDApXSl9O3AucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHEpe3JldHVybiB0aGlzLl9kM1NjYWxlKHEpfTtwLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfTtwLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4ocSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb2xvclJhbmdlfTtwLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24ocSl7dGhpcy5fY29sb3JSYW5nZT1xO3RoaXMuX3Jlc2V0U2NhbGUoKX07cmV0dXJuIHB9KGYoMTcpLlNjYWxlKTtjLlJFRFM9IiNGRkZGRkYgI0ZGRjZFMSAjRkVGNEMwICNGRUQ5NzYgI0ZFQjI0QyAjRkQ4RDNDICNGQzRFMkEgI0UzMUExQyAjQjEwMDI2Ii5zcGxpdCgiICIpOwpjLkJMVUVTPSIjRkZGRkZGICNDQ0ZGRkYgI0E1RkZGRCAjODVGN0ZCICM2RUQzRUYgIzU1QTdFMCAjNDE3RkQwICMyNTQ1RDMgIzBCMDJFMSIuc3BsaXQoIiAiKTtjLlBPU05FRz0iIzBCMDJFMSAjMjU0NUQzICM0MTdGRDAgIzU1QTdFMCAjNkVEM0VGICM4NUY3RkIgI0E1RkZGRCAjQ0NGRkZGICNGRkZGRkYgI0ZGRjZFMSAjRkVGNEMwICNGRUQ5NzYgI0ZFQjI0QyAjRkQ4RDNDICNGQzRFMkEgI0UzMUExQyAjQjEwMDI2Ii5zcGxpdCgiICIpO2QuSW50ZXJwb2xhdGVkQ29sb3I9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihrLG4pe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPWt9Zm9yKHZhciBxIGluIG4pbi5oYXNPd25Qcm9wZXJ0eShxKSYmKGtbcV09bltxXSk7ay5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKToocC5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IHApfSxsPWYoMSk7Yz1mdW5jdGlvbihrKXtmdW5jdGlvbiBuKCl7dmFyIHA9CmsuY2FsbCh0aGlzKXx8dGhpcztwLl9kM1NjYWxlPWwuc2NhbGVMaW5lYXIoKTtyZXR1cm4gcH1nKG4sayk7bi5wcm90b3R5cGUuX2RlZmF1bHRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm5bMCwxXX07bi5wcm90b3R5cGUuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluPWZ1bmN0aW9uKHApe3JldHVybiBwWzBdPT09cFsxXT9bcFswXS0xLHBbMV0rMV06cH07bi5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24ocCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUocCl9O24ucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24ocCl7cmV0dXJuIHRoaXMuc2NhbGUocCl9O24ucHJvdG90eXBlLmludmVydGVkVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24ocCl7cmV0dXJuIHRoaXMuaW52ZXJ0KHApfTtuLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRVbmJvdW5kZWRFeHRlbnQoITApfTtuLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21haW4oKX07bi5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24ocCl7dGhpcy5kb21haW4ocCl9O24ucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCl9O24ucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24ocCl7aWYobnVsbD09cClyZXR1cm4gdGhpcy5fZDNTY2FsZS5kb21haW4oKTt0aGlzLl9kM1NjYWxlLmRvbWFpbihwKTtyZXR1cm4gdGhpc307bi5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUucmFuZ2UoKX07bi5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHApe3RoaXMuX2QzU2NhbGUucmFuZ2UocCl9O24ucHJvdG90eXBlLmludmVydD1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5pbnZlcnQocCl9O24ucHJvdG90eXBlLmRlZmF1bHRUaWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnRpY2tzKCl9OwpuLnByb3RvdHlwZS5fbmljZURvbWFpbj1mdW5jdGlvbihwLHEpe3JldHVybiB0aGlzLl9kM1NjYWxlLmNvcHkoKS5kb21haW4ocCkubmljZShxKS5kb21haW4oKX07cmV0dXJuIG59KGYoMTEpLlF1YW50aXRhdGl2ZVNjYWxlKTtkLkxpbmVhcj1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAscSl7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHQgaW4gcSlxLmhhc093blByb3BlcnR5KHQpJiYocFt0XT1xW3RdKTtwLnByb3RvdHlwZT1udWxsPT09cT9PYmplY3QuY3JlYXRlKHEpOihyLnByb3RvdHlwZT1xLnByb3RvdHlwZSxuZXcgcil9LGw9ZigxKSxrPWYoMCksbj1mKDMpO2M9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gcShyKXt2b2lkIDA9PT1yJiYocj0xMCk7dmFyIHQ9cC5jYWxsKHRoaXMpfHx0aGlzO3QuX2QzU2NhbGU9bC5zY2FsZUxpbmVhcigpO3QuX2Jhc2U9cjt0Ll9waXZvdD10Ll9iYXNlO3QuX3NldERvbWFpbih0Ll9kZWZhdWx0RXh0ZW50KCkpOwppZigxPj1yKXRocm93IEVycm9yKCJNb2RpZmllZExvZ1NjYWxlOiBUaGUgYmFzZSBtdXN0IGJlIFx4M2UgMSIpO3JldHVybiB0fWcocSxwKTtxLnByb3RvdHlwZS5fYWRqdXN0ZWRMb2c9ZnVuY3Rpb24ocil7dmFyIHQ9MD5yPy0xOjE7cio9dDtyPHRoaXMuX3Bpdm90JiYocis9KHRoaXMuX3Bpdm90LXIpL3RoaXMuX3Bpdm90KTtyPU1hdGgubG9nKHIpL01hdGgubG9nKHRoaXMuX2Jhc2UpO3JldHVybiByKnR9O3EucHJvdG90eXBlLl9pbnZlcnRlZEFkanVzdGVkTG9nPWZ1bmN0aW9uKHIpe3ZhciB0PTA+cj8tMToxO3I9TWF0aC5wb3codGhpcy5fYmFzZSxyKnQpO3I8dGhpcy5fcGl2b3QmJihyPXRoaXMuX3Bpdm90KihyLTEpLyh0aGlzLl9waXZvdC0xKSk7cmV0dXJuIHIqdH07cS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24ocil7cmV0dXJuIHRoaXMuX2QzU2NhbGUodGhpcy5fYWRqdXN0ZWRMb2cocikpfTtxLnByb3RvdHlwZS5pbnZlcnQ9ZnVuY3Rpb24ocil7cmV0dXJuIHRoaXMuX2ludmVydGVkQWRqdXN0ZWRMb2codGhpcy5fZDNTY2FsZS5pbnZlcnQocikpfTsKcS5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbihyKXtyZXR1cm4gdGhpcy5zY2FsZShyKX07cS5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbihyKXtyZXR1cm4gdGhpcy5pbnZlcnQocil9O3EucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCl9O3EucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tYWluKCl9O3EucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKHIpe3RoaXMuZG9tYWluKHIpfTtxLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VudHJhbnNmb3JtZWREb21haW59O3EucHJvdG90eXBlLl9zZXREb21haW49ZnVuY3Rpb24ocil7dGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbj1yO3AucHJvdG90eXBlLl9zZXREb21haW4uY2FsbCh0aGlzLApbdGhpcy5fYWRqdXN0ZWRMb2coclswXSksdGhpcy5fYWRqdXN0ZWRMb2coclsxXSldKX07cS5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbihyKXtpZihudWxsPT1yKXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzU2NhbGUuZG9tYWluKHIpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS50aWNrcz1mdW5jdGlvbigpe2Z1bmN0aW9uIHIoRixELEIpe3JldHVybltGLEQsQl0uc29ydChmdW5jdGlvbihJLE8pe3JldHVybiBJLU99KVsxXX12YXIgdD1rLk1hdGgubWluKHRoaXMuX3VudHJhbnNmb3JtZWREb21haW4sMCksdj1rLk1hdGgubWF4KHRoaXMuX3VudHJhbnNmb3JtZWREb21haW4sMCkseT1yKHQsdiwtdGhpcy5fcGl2b3QpLHo9cih0LHYsdGhpcy5fcGl2b3QpO3k9dGhpcy5fbG9nVGlja3MoLXksLXQpLm1hcChmdW5jdGlvbihGKXtyZXR1cm4tRn0pLnJldmVyc2UoKTt6PXRoaXMuX2xvZ1RpY2tzKHosdik7dmFyIHg9TWF0aC5tYXgodCwKLXRoaXMuX3Bpdm90KSxDPU1hdGgubWluKHYsdGhpcy5fcGl2b3QpO3g9bC5zY2FsZUxpbmVhcigpLmRvbWFpbihbeCxDXSkudGlja3ModGhpcy5faG93TWFueVRpY2tzKHgsQykpO3k9eS5jb25jYXQoeCkuY29uY2F0KHopOzE+PXkubGVuZ3RoJiYoeT1sLnNjYWxlTGluZWFyKCkuZG9tYWluKFt0LHZdKS50aWNrcygpKTtyZXR1cm4geX07cS5wcm90b3R5cGUuX2xvZ1RpY2tzPWZ1bmN0aW9uKHIsdCl7dmFyIHY9dGhpcyx5PXRoaXMuX2hvd01hbnlUaWNrcyhyLHQpO2lmKDA9PT15KXJldHVybltdO3ZhciB6PU1hdGguZmxvb3IoTWF0aC5sb2cocikvTWF0aC5sb2codGhpcy5fYmFzZSkpLHg9TWF0aC5jZWlsKE1hdGgubG9nKHQpL01hdGgubG9nKHRoaXMuX2Jhc2UpKTt5PWwucmFuZ2UoeCx6LC1NYXRoLmNlaWwoKHgteikveSkpO3o9bC5yYW5nZSh0aGlzLl9iYXNlLDEsLSh0aGlzLl9iYXNlLTEpKS5tYXAoTWF0aC5mbG9vcik7dmFyIEM9ay5BcnJheS51bmlxKHopO3k9eS5tYXAoZnVuY3Rpb24oRil7cmV0dXJuIEMubWFwKGZ1bmN0aW9uKEQpe3JldHVybiBNYXRoLnBvdyh2Ll9iYXNlLApGLTEpKkR9KX0pO3JldHVybiBrLkFycmF5LmZsYXR0ZW4oeSkuZmlsdGVyKGZ1bmN0aW9uKEYpe3JldHVybiByPD1GJiZGPD10fSkuc29ydChmdW5jdGlvbihGLEQpe3JldHVybiBGLUR9KX07cS5wcm90b3R5cGUuX2hvd01hbnlUaWNrcz1mdW5jdGlvbihyLHQpe3ZhciB2PXRoaXMuX2FkanVzdGVkTG9nKGsuTWF0aC5taW4odGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbiwwKSkseT10aGlzLl9hZGp1c3RlZExvZyhrLk1hdGgubWF4KHRoaXMuX3VudHJhbnNmb3JtZWREb21haW4sMCkpO3JldHVybiBNYXRoLmNlaWwoKHRoaXMuX2FkanVzdGVkTG9nKHQpLXRoaXMuX2FkanVzdGVkTG9nKHIpKS8oeS12KSpuLk1vZGlmaWVkTG9nLl9ERUZBVUxUX05VTV9USUNLUyl9O3EucHJvdG90eXBlLl9uaWNlRG9tYWluPWZ1bmN0aW9uKHIpe3JldHVybiByfTtxLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3JldHVyblswLHRoaXMuX2Jhc2VdfTtxLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW49CmZ1bmN0aW9uKHIpe3JldHVybiByWzBdPT09clsxXT8ocj1yWzBdLDA8cj9bci90aGlzLl9iYXNlLHIqdGhpcy5fYmFzZV06MD09PXI/Wy10aGlzLl9iYXNlLHRoaXMuX2Jhc2VdOltyKnRoaXMuX2Jhc2Usci90aGlzLl9iYXNlXSk6cn07cS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUucmFuZ2UoKX07cS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHIpe3RoaXMuX2QzU2NhbGUucmFuZ2Uocil9O3EucHJvdG90eXBlLmRlZmF1bHRUaWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnRpY2tzKCl9O3JldHVybiBxfShmKDExKS5RdWFudGl0YXRpdmVTY2FsZSk7ZC5Nb2RpZmllZExvZz1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9ZigwKTtkLmludGVydmFsVGlja0dlbmVyYXRvcj1mdW5jdGlvbihsKXtpZigwPj1sKXRocm93IEVycm9yKCJpbnRlcnZhbCBtdXN0IGJlIHBvc2l0aXZlIG51bWJlciIpO3JldHVybiBmdW5jdGlvbihrKXtrPQprLmRvbWFpbigpO3ZhciBuPU1hdGgubWluKGtbMF0sa1sxXSk7az1NYXRoLm1heChrWzBdLGtbMV0pO3ZhciBwPU1hdGguY2VpbChuL2wpKmw7bj0wPT09biVsP1tdOltuXTt2YXIgcT1nLk1hdGgucmFuZ2UoMCxNYXRoLmZsb29yKChrLXApL2wpKzEpLm1hcChmdW5jdGlvbihyKXtyZXR1cm4gcCtyKmx9KTtyZXR1cm4gbi5jb25jYXQocSkuY29uY2F0KDA9PT1rJWw/W106W2tdKX19O2QuaW50ZWdlclRpY2tHZW5lcmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obCl7dmFyIGs9bC5kZWZhdWx0VGlja3MoKTtyZXR1cm4gay5maWx0ZXIoZnVuY3Rpb24obixwKXtyZXR1cm4gMD09PW4lMXx8MD09PXB8fHA9PT1rLmxlbmd0aC0xfSl9fX0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHApe2Z1bmN0aW9uIHEoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciByIGluIHApcC5oYXNPd25Qcm9wZXJ0eShyKSYmKG5bcl09cFtyXSk7Cm4ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX0sbD1mKDEpLGs9ZigyOCk7Yz1mdW5jdGlvbihuKXtmdW5jdGlvbiBwKCl7dmFyIHE9bi5jYWxsKHRoaXMpfHx0aGlzO3EuX2QzU2NhbGU9bC5zY2FsZVRpbWUoKTtxLmF1dG9Eb21haW4oKTtyZXR1cm4gcX1nKHAsbik7cC5wcm90b3R5cGUudGlja0ludGVydmFsPWZ1bmN0aW9uKHEscil7dm9pZCAwPT09ciYmKHI9MSk7dmFyIHQ9bC5zY2FsZVRpbWUoKTtwLnRpbWVJbnRlcnZhbFRvRDNUaW1lKHEpLmV2ZXJ5KHIpO3QuZG9tYWluKHRoaXMuZG9tYWluKCkpO3QucmFuZ2UodGhpcy5yYW5nZSgpKTtyZXR1cm4gdC50aWNrcygpfTtwLnByb3RvdHlwZS5fc2V0RG9tYWluPWZ1bmN0aW9uKHEpe2lmKHFbMV08cVswXSl0aHJvdyBFcnJvcigiU2NhbGUuVGltZSBkb21haW4gdmFsdWVzIG11c3QgYmUgaW4gY2hyb25vbG9naWNhbCBvcmRlciIpO3JldHVybiBuLnByb3RvdHlwZS5fc2V0RG9tYWluLmNhbGwodGhpcywKcSl9O3AucHJvdG90eXBlLl9kZWZhdWx0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuW25ldyBEYXRlKCIxOTcwLTAxLTAxIiksbmV3IERhdGUoIjE5NzAtMDEtMDIiKV19O3AucHJvdG90eXBlLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbj1mdW5jdGlvbihxKXt2YXIgcj1xWzBdLmdldFRpbWUoKSx0PXFbMV0uZ2V0VGltZSgpO3JldHVybiByPT09dD8ocT1uZXcgRGF0ZShyKSxxLnNldERhdGUocS5nZXREYXRlKCktMSksdD1uZXcgRGF0ZSh0KSx0LnNldERhdGUodC5nZXREYXRlKCkrMSksW3EsdF0pOnF9O3AucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHEpe3JldHVybiB0aGlzLl9kM1NjYWxlKHEpfTtwLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHEpe3JldHVybiB0aGlzLnNjYWxlKG5ldyBEYXRlKHEpKX07cC5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbihxKXtyZXR1cm4gdGhpcy5pbnZlcnQocSkuZ2V0VGltZSgpfTtwLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudD0KZnVuY3Rpb24oKXt2YXIgcT10aGlzLl9nZXRVbmJvdW5kZWRFeHRlbnQoITApO3JldHVybltxWzBdLnZhbHVlT2YoKSxxWzFdLnZhbHVlT2YoKV19O3AucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7dmFyIHE9dGhpcy5kb21haW4oKTtyZXR1cm5bcVswXS52YWx1ZU9mKCkscVsxXS52YWx1ZU9mKCldfTtwLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbihxKXt0aGlzLmRvbWFpbihbbmV3IERhdGUocVswXSksbmV3IERhdGUocVsxXSldKX07cC5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX07cC5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzU2NhbGUuZG9tYWluKHEpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5yYW5nZSgpfTsKcC5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHEpe3RoaXMuX2QzU2NhbGUucmFuZ2UocSl9O3AucHJvdG90eXBlLmludmVydD1mdW5jdGlvbihxKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5pbnZlcnQocSl9O3AucHJvdG90eXBlLmRlZmF1bHRUaWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnRpY2tzKCl9O3AucHJvdG90eXBlLl9uaWNlRG9tYWluPWZ1bmN0aW9uKHEpe3JldHVybiB0aGlzLl9kM1NjYWxlLmNvcHkoKS5kb21haW4ocSkubmljZSgpLmRvbWFpbigpfTtwLnRpbWVJbnRlcnZhbFRvRDNUaW1lPWZ1bmN0aW9uKHEpe3N3aXRjaChxKXtjYXNlIGsuVGltZUludGVydmFsLnNlY29uZDpyZXR1cm4gbC50aW1lU2Vjb25kO2Nhc2Ugay5UaW1lSW50ZXJ2YWwubWludXRlOnJldHVybiBsLnRpbWVNaW51dGU7Y2FzZSBrLlRpbWVJbnRlcnZhbC5ob3VyOnJldHVybiBsLnRpbWVIb3VyO2Nhc2Ugay5UaW1lSW50ZXJ2YWwuZGF5OnJldHVybiBsLnRpbWVEYXk7CmNhc2Ugay5UaW1lSW50ZXJ2YWwud2VlazpyZXR1cm4gbC50aW1lV2VlaztjYXNlIGsuVGltZUludGVydmFsLm1vbnRoOnJldHVybiBsLnRpbWVNb250aDtjYXNlIGsuVGltZUludGVydmFsLnllYXI6cmV0dXJuIGwudGltZVllYXI7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVGltZUludGVydmFsIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdDogIitxKTt9fTtyZXR1cm4gcH0oZigxMSkuUXVhbnRpdGF0aXZlU2NhbGUpO2QuVGltZT1jfSxmdW5jdGlvbihjLGQsZil7dmFyIGc9ZigxKSxsPUFycmF5O2QuYWRkPWZ1bmN0aW9uKGssbil7aWYoay5sZW5ndGghPT1uLmxlbmd0aCl0aHJvdyBFcnJvcigiYXR0ZW1wdGVkIHRvIGFkZCBhcnJheXMgb2YgdW5lcXVhbCBsZW5ndGgiKTtyZXR1cm4gay5tYXAoZnVuY3Rpb24ocCxxKXtyZXR1cm4ga1txXStuW3FdfSl9O2QudW5pcT1mdW5jdGlvbihrKXt2YXIgbj1nLnNldCgpLHA9W107ay5mb3JFYWNoKGZ1bmN0aW9uKHEpe24uaGFzKFN0cmluZyhxKSl8fAoobi5hZGQoU3RyaW5nKHEpKSxwLnB1c2gocSkpfSk7cmV0dXJuIHB9O2QuZmxhdHRlbj1mdW5jdGlvbihrKXtyZXR1cm4gbC5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGspfTtkLmNyZWF0ZUZpbGxlZEFycmF5PWZ1bmN0aW9uKGssbil7Zm9yKHZhciBwPVtdLHE9MDtxPG47cSsrKXBbcV09ImZ1bmN0aW9uIj09PXR5cGVvZiBrP2socSk6aztyZXR1cm4gcH19LGZ1bmN0aW9uKGMsZCl7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGYoZyxsLGspe3RoaXMubWF4SW5kZXg9dGhpcy5taW5JbmRleD10aGlzLmV4aXRJbmRleD10aGlzLmVudHJ5SW5kZXg9Zzt0aGlzLmJ1Y2tldFZhbHVlPWw7dGhpcy5tYXhWYWx1ZT10aGlzLm1pblZhbHVlPWt9Zi5wcm90b3R5cGUuaXNJbkJ1Y2tldD1mdW5jdGlvbihnKXtyZXR1cm4gZz09dGhpcy5idWNrZXRWYWx1ZX07Zi5wcm90b3R5cGUuYWRkVG9CdWNrZXQ9ZnVuY3Rpb24oZyxsKXtnPHRoaXMubWluVmFsdWUmJih0aGlzLm1pblZhbHVlPWcsdGhpcy5taW5JbmRleD0KbCk7Zz50aGlzLm1heFZhbHVlJiYodGhpcy5tYXhWYWx1ZT1nLHRoaXMubWF4SW5kZXg9bCk7dGhpcy5leGl0SW5kZXg9bH07Zi5wcm90b3R5cGUuZ2V0VW5pcXVlSW5kaWNlcz1mdW5jdGlvbigpe3ZhciBnPVt0aGlzLmVudHJ5SW5kZXgsdGhpcy5tYXhJbmRleCx0aGlzLm1pbkluZGV4LHRoaXMuZXhpdEluZGV4XTtyZXR1cm4gZy5maWx0ZXIoZnVuY3Rpb24obCxrKXtyZXR1cm4gMD09a3x8bCE9Z1trLTFdfSl9O3JldHVybiBmfSgpO2QuQnVja2V0PWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxrKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgcCBpbiBrKWsuaGFzT3duUHJvcGVydHkocCkmJihsW3BdPWtbcF0pO2wucHJvdG90eXBlPW51bGw9PT1rP09iamVjdC5jcmVhdGUoayk6KG4ucHJvdG90eXBlPWsucHJvdG90eXBlLG5ldyBuKX07Yz1mdW5jdGlvbihsKXtmdW5jdGlvbiBrKCl7cmV0dXJuIG51bGwhPT0KbCYmbC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9ZyhrLGwpO2sucHJvdG90eXBlLmNhbGxDYWxsYmFja3M9ZnVuY3Rpb24oKXtmb3IodmFyIG49dGhpcyxwPVtdLHE9MDtxPGFyZ3VtZW50cy5sZW5ndGg7cSsrKXBbcV09YXJndW1lbnRzW3FdO3RoaXMuZm9yRWFjaChmdW5jdGlvbihyKXtyLmFwcGx5KG4scCl9KTtyZXR1cm4gdGhpc307cmV0dXJuIGt9KGYoNTgpLlNldCk7ZC5DYWxsYmFja1NldD1jfSxmdW5jdGlvbihjLGQsZil7ZnVuY3Rpb24gZyhuKXtmdW5jdGlvbiBwKHQpe3QvPTI1NTtyZXR1cm4uMDM5Mjg+PXQ/dC8xMi45MjprLnBvdygodCsuMDU1KS8xLjA1NSwyLjQpfXZhciBxPWwucmdiKG4pO249cChxLnIpO3ZhciByPXAocS5nKTtxPXAocS5iKTtyZXR1cm4uMjEyNipuKy43MTUyKnIrLjA3MjIqcX12YXIgbD1mKDEpLGs9TWF0aDtkLmNvbnRyYXN0PWZ1bmN0aW9uKG4scCl7bj1nKG4pKy4wNTtwPWcocCkrLjA1O3JldHVybiBuPnA/bi9wOnAvbn07ZC5saWdodGVuQ29sb3I9CmZ1bmN0aW9uKG4scCl7cmV0dXJuIGwuY29sb3IobikuYnJpZ2h0ZXIocCkucmdiKCkudG9TdHJpbmcoKX07ZC5jb2xvclRlc3Q9ZnVuY3Rpb24obixwKXtuLmNsYXNzZWQocCwhMCk7dmFyIHE9bi5zdHlsZSgiYmFja2dyb3VuZC1jb2xvciIpO2lmKCJ0cmFuc3BhcmVudCI9PT1xKXJldHVybiBudWxsO3E9L1woKC4rKVwpLy5leGVjKHEpO2lmKCFxKXJldHVybiBudWxsO3E9cVsxXS5zcGxpdCgiLCIpLm1hcChmdW5jdGlvbihyKXtyPStyO3ZhciB0PXIudG9TdHJpbmcoMTYpO3JldHVybiAxNj5yPyIwIit0OnR9KTtpZig0PT09cS5sZW5ndGgmJiIwMCI9PT1xWzNdKXJldHVybiBudWxsO3E9IiMiK3Euam9pbigiIik7bi5jbGFzc2VkKHAsITEpO3JldHVybiBxfX0sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoMSksbD1mKDU3KTtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaygpe3RoaXMuX2VudGl0aWVzPVtdO3RoaXMuX3J0cmVlPW5ldyBsLlJUcmVlO3RoaXMuX3RyZWU9Zy5xdWFkdHJlZSgpLngoZnVuY3Rpb24obil7cmV0dXJuIE1hdGguZmxvb3Iobi5wb3NpdGlvbi54KX0pLnkoZnVuY3Rpb24obil7cmV0dXJuIE1hdGguZmxvb3Iobi5wb3NpdGlvbi55KX0pfQprLnByb3RvdHlwZS5hZGRBbGw9ZnVuY3Rpb24obixwLHEpeyh2PXRoaXMuX2VudGl0aWVzKS5wdXNoLmFwcGx5KHYsbik7aWYodm9pZCAwIT09cSlmb3IocT1sLlJUcmVlQm91bmRzLmJvdW5kcyhxKSx2PTA7djxuLmxlbmd0aDt2Kyspe3ZhciByPW5bdl0sdD1sLlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhwKHIpKTtsLlJUcmVlQm91bmRzLmlzQm91bmRzT3ZlcmxhcEJvdW5kcyhxLHQpJiYodGhpcy5fdHJlZS5hZGQociksdGhpcy5fcnRyZWUuaW5zZXJ0KHQscikpfWVsc2UgZm9yKHRoaXMuX3RyZWUuYWRkQWxsKG4pLHY9MDt2PG4ubGVuZ3RoO3YrKylyPW5bdl0sdD1sLlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhwKHIpKSx0aGlzLl9ydHJlZS5pbnNlcnQodCxyKTt2YXIgdn07ay5wcm90b3R5cGUuZW50aXR5TmVhcmVzdD1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5fdHJlZS5maW5kKG4ueCxuLnkpfTtrLnByb3RvdHlwZS5lbnRpdGllc0luQm91bmRzPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9ydHJlZS5pbnRlcnNlY3QobC5SVHJlZUJvdW5kcy5lbnRpdHlCb3VuZHMobikpfTsKay5wcm90b3R5cGUuZW50aXRpZXNJblhCb3VuZHM9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX3J0cmVlLmludGVyc2VjdFgobC5SVHJlZUJvdW5kcy5lbnRpdHlCb3VuZHMobikpfTtrLnByb3RvdHlwZS5lbnRpdGllc0luWUJvdW5kcz1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5fcnRyZWUuaW50ZXJzZWN0WShsLlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhuKSl9O2sucHJvdG90eXBlLmVudGl0aWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VudGl0aWVzfTtyZXR1cm4ga30oKTtkLkVudGl0eVN0b3JlPWN9LGZ1bmN0aW9uKGMsZCxmKXt2YXIgZz1mKDU2KTtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbCgpeyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93Lk1hcD90aGlzLl9lczZNYXA9bmV3IHdpbmRvdy5NYXA6dGhpcy5fa2V5VmFsdWVQYWlycz1bXX1sLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oayxuKXtpZihnLmlzTmFOKGspKXRocm93IEVycm9yKCJOYU4gbWF5IG5vdCBiZSB1c2VkIGFzIGEga2V5IHRvIHRoZSBNYXAiKTsKaWYobnVsbCE9dGhpcy5fZXM2TWFwKXJldHVybiB0aGlzLl9lczZNYXAuc2V0KGssbiksdGhpcztmb3IodmFyIHA9MDtwPHRoaXMuX2tleVZhbHVlUGFpcnMubGVuZ3RoO3ArKylpZih0aGlzLl9rZXlWYWx1ZVBhaXJzW3BdLmtleT09PWspcmV0dXJuIHRoaXMuX2tleVZhbHVlUGFpcnNbcF0udmFsdWU9bix0aGlzO3RoaXMuX2tleVZhbHVlUGFpcnMucHVzaCh7a2V5OmssdmFsdWU6bn0pO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oayl7aWYobnVsbCE9dGhpcy5fZXM2TWFwKXJldHVybiB0aGlzLl9lczZNYXAuZ2V0KGspO2Zvcih2YXIgbj0wO248dGhpcy5fa2V5VmFsdWVQYWlycy5sZW5ndGg7bisrKWlmKHRoaXMuX2tleVZhbHVlUGFpcnNbbl0ua2V5PT09aylyZXR1cm4gdGhpcy5fa2V5VmFsdWVQYWlyc1tuXS52YWx1ZX07bC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGspe2lmKG51bGwhPXRoaXMuX2VzNk1hcClyZXR1cm4gdGhpcy5fZXM2TWFwLmhhcyhrKTsKZm9yKHZhciBuPTA7bjx0aGlzLl9rZXlWYWx1ZVBhaXJzLmxlbmd0aDtuKyspaWYodGhpcy5fa2V5VmFsdWVQYWlyc1tuXS5rZXk9PT1rKXJldHVybiEwO3JldHVybiExfTtsLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGssbil7dmFyIHA9dGhpcztudWxsIT10aGlzLl9lczZNYXA/dGhpcy5fZXM2TWFwLmZvckVhY2goZnVuY3Rpb24ocSxyKXtyZXR1cm4gay5jYWxsKG4scSxyLHApfSxuKTp0aGlzLl9rZXlWYWx1ZVBhaXJzLmZvckVhY2goZnVuY3Rpb24ocSl7ay5jYWxsKG4scS52YWx1ZSxxLmtleSxwKX0pfTtsLnByb3RvdHlwZS5kZWxldGU9ZnVuY3Rpb24oayl7aWYobnVsbCE9dGhpcy5fZXM2TWFwKXJldHVybiB0aGlzLl9lczZNYXAuZGVsZXRlKGspO2Zvcih2YXIgbj0wO248dGhpcy5fa2V5VmFsdWVQYWlycy5sZW5ndGg7bisrKWlmKHRoaXMuX2tleVZhbHVlUGFpcnNbbl0ua2V5PT09aylyZXR1cm4gdGhpcy5fa2V5VmFsdWVQYWlycy5zcGxpY2UobiwxKSwhMDtyZXR1cm4hMX07CnJldHVybiBsfSgpO2QuTWFwPWN9LGZ1bmN0aW9uKGMsZCl7ZC5hc3NpZ249ZnVuY3Rpb24oKXtmb3IodmFyIGY9W10sZz0wO2c8YXJndW1lbnRzLmxlbmd0aDtnKyspZltnXT1hcmd1bWVudHNbZ107Zz17fTtmb3IodmFyIGw9MDtsPGYubGVuZ3RoO2wrKylmb3IodmFyIGs9ZltsXSxuPTAscD1PYmplY3Qua2V5cyhrKTtuPHAubGVuZ3RoO24rKyl7dmFyIHE9cFtuXTtnW3FdPWtbcV19cmV0dXJuIGd9fSxmdW5jdGlvbihjLGQpe2M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBmKCl7fWYucHJvdG90eXBlLnNwbGl0PWZ1bmN0aW9uKGcsbCl7Zm9yKHZhciBrPU1hdGguY2VpbChnLmxlbmd0aC8yKSxuPTA7bjxrO24rKylsWzBdLmluc2VydChnW25dKTtmb3Iobj1rO248Zy5sZW5ndGg7bisrKWxbMV0uaW5zZXJ0KGdbbl0pfTtyZXR1cm4gZn0oKTtkLlNwbGl0U3RyYXRlZ3lUcml2aWFsPWM7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGYoKXt9Zi5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24oZyxsKXtnPQpnLnNsaWNlKCk7Zm9yKHRoaXMuY2hvb3NlRmlyc3RTcGxpdChnLGwpOzA8Zy5sZW5ndGg7KXRoaXMuYWRkTmV4dChnLGwpfTtmLnByb3RvdHlwZS5jaG9vc2VGaXJzdFNwbGl0PWZ1bmN0aW9uKGcsbCl7Zm9yKHZhciBrPTAsbj0wLHA9Zy5sZW5ndGgtMSxxPWcubGVuZ3RoLTEscj0xO3I8Zy5sZW5ndGgtMTtyKyspe3ZhciB0PWdbcl07dC5ib3VuZHMueGw+Z1twXS5ib3VuZHMueGw/cD1yOnQuYm91bmRzLnhoPGdba10uYm91bmRzLnhoJiYoaz1yKTt0LmJvdW5kcy55bD5nW3FdLmJvdW5kcy55bD9xPXI6dC5ib3VuZHMueWg8Z1tuXS5ib3VuZHMueWgmJihuPXIpfW49TWF0aC5hYnMoZ1trXS5ib3VuZHMueGgtZ1twXS5ib3VuZHMueGwpPk1hdGguYWJzKGdbbl0uYm91bmRzLnloLWdbcV0uYm91bmRzLnlsKT9bayxwXTpbbixxXTtrPW5bMF07bj1uWzFdO2s9PT1uJiYoaz0wLG49Zy5sZW5ndGgtMSk7bFswXS5pbnNlcnQoZy5zcGxpY2UoTWF0aC5tYXgoayxuKSwxKVswXSk7bFsxXS5pbnNlcnQoZy5zcGxpY2UoTWF0aC5taW4oaywKbiksMSlbMF0pfTtmLnByb3RvdHlwZS5hZGROZXh0PWZ1bmN0aW9uKGcsbCl7Zm9yKHZhciBrPW51bGwsbj1udWxsLHA9bnVsbCxxPTA7cTxnLmxlbmd0aDtxKyspe3ZhciByPWdbcV0sdD1sWzBdLnVuaW9uQXJlYURpZmZlcmVuY2Uoci5ib3VuZHMpO3I9bFsxXS51bmlvbkFyZWFEaWZmZXJlbmNlKHIuYm91bmRzKTtpZih0PG58fG51bGw9PWspaz1xLG49dCxwPWxbMF07cjxuJiYoaz1xLG49cixwPWxbMV0pfXAuaW5zZXJ0KGcuc3BsaWNlKGssMSlbMF0pfTtyZXR1cm4gZn0oKTtkLlNwbGl0U3RyYXRlZ3lMaW5lYXI9Y30sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcocCl7cmV0dXJuIFN0cmluZyhwKX12YXIgbD1mKDEpLGs9ZigwKTtjPWYoMTApO2QuSVN0YWNraW5nT3JkZXI9Yy5tYWtlRW51bShbInRvcGRvd24iLCJib3R0b211cCJdKTt2YXIgbj1NYXRoO2Quc3RhY2s9ZnVuY3Rpb24ocCxxLHIsdCl7dm9pZCAwPT09dCYmKHQ9ImJvdHRvbXVwIik7dmFyIHY9bC5tYXAoKSx5PQpsLm1hcCgpLHo9bmV3IGsuTWFwOyJ0b3Bkb3duIj09PXQmJihwPXAuc2xpY2UoKSxwLnJldmVyc2UoKSk7cC5mb3JFYWNoKGZ1bmN0aW9uKHgpe3ZhciBDPW5ldyBrLk1hcDt4LmRhdGEoKS5mb3JFYWNoKGZ1bmN0aW9uKEYsRCl7dmFyIEI9ZyhxKEYsRCx4KSksST0rcihGLEQseCksTz0wPD1JP3Y6eTtpZihPLmhhcyhCKSl7dmFyIFA9Ty5nZXQoQik7Ty5zZXQoQixQK0kpfWVsc2UgUD0wLE8uc2V0KEIsSSk7Qy5zZXQoQix7b2Zmc2V0OlAsdmFsdWU6SSxheGlzVmFsdWU6cShGLEQseCksb3JpZ2luYWxEYXR1bTpGLG9yaWdpbmFsRGF0YXNldDp4LG9yaWdpbmFsSW5kZXg6RH0pfSk7ei5zZXQoeCxDKX0pO3JldHVybiB6fTtkLnN0YWNrZWRFeHRlbnRzPWZ1bmN0aW9uKHApe3ZhciBxPW5ldyBrLk1hcCxyPW5ldyBrLk1hcDtwLmZvckVhY2goZnVuY3Rpb24odCl7dC5mb3JFYWNoKGZ1bmN0aW9uKHYseSl7dmFyIHo9ay5NYXRoLm1heChbdi5vZmZzZXQrdi52YWx1ZSx2Lm9mZnNldF0sCnYub2Zmc2V0KSx4PWsuTWF0aC5taW4oW3Yub2Zmc2V0K3YudmFsdWUsdi5vZmZzZXRdLHYub2Zmc2V0KSxDPXYuYXhpc1ZhbHVlO3EuaGFzKHkpP3EuZ2V0KHkpLmV4dGVudDx6JiZxLnNldCh5LHtleHRlbnQ6eixheGlzVmFsdWU6QyxzdGFja2VkRGF0dW06dn0pOnEuc2V0KHkse2V4dGVudDp6LGF4aXNWYWx1ZTpDLHN0YWNrZWREYXR1bTp2fSk7ci5oYXMoeSk/ci5nZXQoeSkuZXh0ZW50PngmJnIuc2V0KHkse2V4dGVudDp4LGF4aXNWYWx1ZTpDLHN0YWNrZWREYXR1bTp2fSk6ci5zZXQoeSx7ZXh0ZW50OngsYXhpc1ZhbHVlOkMsc3RhY2tlZERhdHVtOnZ9KX0pfSk7cmV0dXJue21heGltdW1FeHRlbnRzOnEsbWluaW11bUV4dGVudHM6cn19O2Quc3RhY2tlZEV4dGVudD1mdW5jdGlvbihwLHEscil7dmFyIHQ9W107cC5mb3JFYWNoKGZ1bmN0aW9uKHkseil7ei5kYXRhKCkuZm9yRWFjaChmdW5jdGlvbih4LEMpe2lmKG51bGw9PXJ8fHIoeCxDLHopKXg9eS5nZXQoZyhxKHgsQyx6KSkpLAp0LnB1c2goeC52YWx1ZSt4Lm9mZnNldCl9KX0pO3A9ay5NYXRoLm1heCh0LDApO3ZhciB2PWsuTWF0aC5taW4odCwwKTtyZXR1cm5bbi5taW4odiwwKSxuLm1heCgwLHApXX07ZC5ub3JtYWxpemVLZXk9Z30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoMCk7ZC5nZXRUcmFuc2xhdG9yPWZ1bmN0aW9uKGspe2s9ay5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCk7dmFyIG49ay5fX1Bsb3R0YWJsZV9DbGllbnRUcmFuc2xhdG9yO251bGw9PW4mJihuPW5ldyBsKGspLGsuX19QbG90dGFibGVfQ2xpZW50VHJhbnNsYXRvcj1uKTtyZXR1cm4gbn07dmFyIGw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBrKG4pe3RoaXMuX3Jvb3RFbGVtZW50PW59ay5wcm90b3R5cGUuY29tcHV0ZVBvc2l0aW9uPWZ1bmN0aW9uKG4scCl7bj17eDpuLHk6cH07cD1nLk1hdGguZ2V0Q3VtdWxhdGl2ZVRyYW5zZm9ybSh0aGlzLl9yb290RWxlbWVudCk7cmV0dXJuIG51bGw9PXA/bjpnLk1hdGguYXBwbHlUcmFuc2Zvcm0ocCwKbil9O2suaXNFdmVudEluc2lkZT1mdW5jdGlvbihuLHApe3JldHVybiBnLkRPTS5jb250YWlucyhuLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKSxwLnRhcmdldCl9O3JldHVybiBrfSgpO2QuVHJhbnNsYXRvcj1sfSxmdW5jdGlvbihjLGQsZil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBnPWYoMTI0KTtmLmQoZCwiZWFzZUxpbmVhciIsZnVuY3Rpb24oKXtyZXR1cm4gZy5hfSk7dmFyIGw9ZigxMjYpO2YuZChkLCJlYXNlUXVhZCIsZnVuY3Rpb24oKXtyZXR1cm4gbC5hfSk7Zi5kKGQsImVhc2VRdWFkSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIGwuYn0pO2YuZChkLCJlYXNlUXVhZE91dCIsZnVuY3Rpb24oKXtyZXR1cm4gbC5jfSk7Zi5kKGQsImVhc2VRdWFkSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIGwuYX0pO3ZhciBrPWYoMTIxKTtmLmQoZCwiZWFzZUN1YmljIixmdW5jdGlvbigpe3JldHVybiBrLmF9KTtmLmQoZCwiZWFzZUN1YmljSW4iLApmdW5jdGlvbigpe3JldHVybiBrLmJ9KTtmLmQoZCwiZWFzZUN1YmljT3V0IixmdW5jdGlvbigpe3JldHVybiBrLmN9KTtmLmQoZCwiZWFzZUN1YmljSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIGsuYX0pO3ZhciBuPWYoMTI1KTtmLmQoZCwiZWFzZVBvbHkiLGZ1bmN0aW9uKCl7cmV0dXJuIG4uYX0pO2YuZChkLCJlYXNlUG9seUluIixmdW5jdGlvbigpe3JldHVybiBuLmJ9KTtmLmQoZCwiZWFzZVBvbHlPdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIG4uY30pO2YuZChkLCJlYXNlUG9seUluT3V0IixmdW5jdGlvbigpe3JldHVybiBuLmF9KTt2YXIgcD1mKDEyNyk7Zi5kKGQsImVhc2VTaW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHAuYX0pO2YuZChkLCJlYXNlU2luSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHAuYn0pO2YuZChkLCJlYXNlU2luT3V0IixmdW5jdGlvbigpe3JldHVybiBwLmN9KTtmLmQoZCwiZWFzZVNpbkluT3V0IixmdW5jdGlvbigpe3JldHVybiBwLmF9KTt2YXIgcT1mKDEyMyk7Zi5kKGQsCiJlYXNlRXhwIixmdW5jdGlvbigpe3JldHVybiBxLmF9KTtmLmQoZCwiZWFzZUV4cEluIixmdW5jdGlvbigpe3JldHVybiBxLmJ9KTtmLmQoZCwiZWFzZUV4cE91dCIsZnVuY3Rpb24oKXtyZXR1cm4gcS5jfSk7Zi5kKGQsImVhc2VFeHBJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gcS5hfSk7dmFyIHI9ZigxMjApO2YuZChkLCJlYXNlQ2lyY2xlIixmdW5jdGlvbigpe3JldHVybiByLmF9KTtmLmQoZCwiZWFzZUNpcmNsZUluIixmdW5jdGlvbigpe3JldHVybiByLmJ9KTtmLmQoZCwiZWFzZUNpcmNsZU91dCIsZnVuY3Rpb24oKXtyZXR1cm4gci5jfSk7Zi5kKGQsImVhc2VDaXJjbGVJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gci5hfSk7dmFyIHQ9ZigxMTkpO2YuZChkLCJlYXNlQm91bmNlIixmdW5jdGlvbigpe3JldHVybiB0LmF9KTtmLmQoZCwiZWFzZUJvdW5jZUluIixmdW5jdGlvbigpe3JldHVybiB0LmJ9KTtmLmQoZCwiZWFzZUJvdW5jZU91dCIsZnVuY3Rpb24oKXtyZXR1cm4gdC5hfSk7CmYuZChkLCJlYXNlQm91bmNlSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHQuY30pO3ZhciB2PWYoMTE4KTtmLmQoZCwiZWFzZUJhY2siLGZ1bmN0aW9uKCl7cmV0dXJuIHYuYX0pO2YuZChkLCJlYXNlQmFja0luIixmdW5jdGlvbigpe3JldHVybiB2LmJ9KTtmLmQoZCwiZWFzZUJhY2tPdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHYuY30pO2YuZChkLCJlYXNlQmFja0luT3V0IixmdW5jdGlvbigpe3JldHVybiB2LmF9KTt2YXIgeT1mKDEyMik7Zi5kKGQsImVhc2VFbGFzdGljIixmdW5jdGlvbigpe3JldHVybiB5LmF9KTtmLmQoZCwiZWFzZUVsYXN0aWNJbiIsZnVuY3Rpb24oKXtyZXR1cm4geS5ifSk7Zi5kKGQsImVhc2VFbGFzdGljT3V0IixmdW5jdGlvbigpe3JldHVybiB5LmF9KTtmLmQoZCwiZWFzZUVsYXN0aWNJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4geS5jfSl9LGZ1bmN0aW9uKGMsZCxmKXtmLmQoZCwiYiIsZnVuY3Rpb24oKXtyZXR1cm4gZ30pO2YuZChkLCJjIixmdW5jdGlvbigpe3JldHVybiBsfSk7CmYuZChkLCJhIixmdW5jdGlvbigpe3JldHVybiBrfSk7dmFyIGc9ZnVuY3Rpb24gcShwKXtmdW5jdGlvbiByKHQpe3JldHVybiB0KnQqKChwKzEpKnQtcCl9cD0rcDtyLm92ZXJzaG9vdD1xO3JldHVybiByfSgxLjcwMTU4KSxsPWZ1bmN0aW9uIHIocSl7ZnVuY3Rpb24gdCh2KXtyZXR1cm4tLXYqdiooKHErMSkqditxKSsxfXE9K3E7dC5vdmVyc2hvb3Q9cjtyZXR1cm4gdH0oMS43MDE1OCksaz1mdW5jdGlvbiB0KHIpe2Z1bmN0aW9uIHYoeSl7cmV0dXJuKDE+KHkqPTIpP3kqeSooKHIrMSkqeS1yKTooeS09MikqeSooKHIrMSkqeStyKSsyKS8yfXI9K3I7di5vdmVyc2hvb3Q9dDtyZXR1cm4gdn0oMS43MDE1OCl9LGZ1bmN0aW9uKGMsZCl7ZnVuY3Rpb24gZih6KXtyZXR1cm4oej0reik8Zz95Knoqejp6PGs/eSooei09bCkqeituOno8cT95Kih6LT1wKSp6K3I6eSooei09dCkqeit2fWQuYj1mdW5jdGlvbih6KXtyZXR1cm4gMS1mKDEteil9O2QuYT1mO2QuYz1mdW5jdGlvbih6KXtyZXR1cm4oMT49Cih6Kj0yKT8xLWYoMS16KTpmKHotMSkrMSkvMn07dmFyIGc9NC8xMSxsPTYvMTEsaz04LzExLG49Ljc1LHA9OS8xMSxxPTEwLzExLHI9LjkzNzUsdD0yMS8yMix2PS45ODQzNzUseT0xL2cvZ30sZnVuY3Rpb24oYyxkKXtkLmI9ZnVuY3Rpb24oZil7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtZipmKX07ZC5jPWZ1bmN0aW9uKGYpe3JldHVybiBNYXRoLnNxcnQoMS0gLS1mKmYpfTtkLmE9ZnVuY3Rpb24oZil7cmV0dXJuKDE+PShmKj0yKT8xLU1hdGguc3FydCgxLWYqZik6TWF0aC5zcXJ0KDEtKGYtPTIpKmYpKzEpLzJ9fSxmdW5jdGlvbihjLGQpe2QuYj1mdW5jdGlvbihmKXtyZXR1cm4gZipmKmZ9O2QuYz1mdW5jdGlvbihmKXtyZXR1cm4tLWYqZipmKzF9O2QuYT1mdW5jdGlvbihmKXtyZXR1cm4oMT49KGYqPTIpP2YqZipmOihmLT0yKSpmKmYrMikvMn19LGZ1bmN0aW9uKGMsZCxmKXtmLmQoZCwiYiIsZnVuY3Rpb24oKXtyZXR1cm4gbH0pO2YuZChkLCJhIixmdW5jdGlvbigpe3JldHVybiBrfSk7CmYuZChkLCJjIixmdW5jdGlvbigpe3JldHVybiBufSk7dmFyIGc9MipNYXRoLlBJLGw9ZnVuY3Rpb24gdChxLHIpe2Z1bmN0aW9uIHYoeil7cmV0dXJuIHEqTWF0aC5wb3coMiwxMCotLXopKk1hdGguc2luKCh5LXopL3IpfXZhciB5PU1hdGguYXNpbigxLyhxPU1hdGgubWF4KDEscSkpKSooci89Zyk7di5hbXBsaXR1ZGU9ZnVuY3Rpb24oeil7cmV0dXJuIHQoeixyKmcpfTt2LnBlcmlvZD1mdW5jdGlvbih6KXtyZXR1cm4gdChxLHopfTtyZXR1cm4gdn0oMSwuMyksaz1mdW5jdGlvbiB2KHIsdCl7ZnVuY3Rpb24geSh4KXtyZXR1cm4gMS1yKk1hdGgucG93KDIsLTEwKih4PSt4KSkqTWF0aC5zaW4oKHgreikvdCl9dmFyIHo9TWF0aC5hc2luKDEvKHI9TWF0aC5tYXgoMSxyKSkpKih0Lz1nKTt5LmFtcGxpdHVkZT1mdW5jdGlvbih4KXtyZXR1cm4gdih4LHQqZyl9O3kucGVyaW9kPWZ1bmN0aW9uKHgpe3JldHVybiB2KHIseCl9O3JldHVybiB5fSgxLC4zKSxuPWZ1bmN0aW9uIHkodCx2KXtmdW5jdGlvbiB6KEMpe3JldHVybigwPgooQz0yKkMtMSk/dCpNYXRoLnBvdygyLDEwKkMpKk1hdGguc2luKCh4LUMpL3YpOjItdCpNYXRoLnBvdygyLC0xMCpDKSpNYXRoLnNpbigoeCtDKS92KSkvMn12YXIgeD1NYXRoLmFzaW4oMS8odD1NYXRoLm1heCgxLHQpKSkqKHYvPWcpO3ouYW1wbGl0dWRlPWZ1bmN0aW9uKEMpe3JldHVybiB5KEMsdipnKX07ei5wZXJpb2Q9ZnVuY3Rpb24oQyl7cmV0dXJuIHkodCxDKX07cmV0dXJuIHp9KDEsLjMpfSxmdW5jdGlvbihjLGQpe2QuYj1mdW5jdGlvbihmKXtyZXR1cm4gTWF0aC5wb3coMiwxMCpmLTEwKX07ZC5jPWZ1bmN0aW9uKGYpe3JldHVybiAxLU1hdGgucG93KDIsLTEwKmYpfTtkLmE9ZnVuY3Rpb24oZil7cmV0dXJuKDE+PShmKj0yKT9NYXRoLnBvdygyLDEwKmYtMTApOjItTWF0aC5wb3coMiwxMC0xMCpmKSkvMn19LGZ1bmN0aW9uKGMsZCl7ZC5hPWZ1bmN0aW9uKGYpe3JldHVybitmfX0sZnVuY3Rpb24oYyxkLGYpe2YuZChkLCJiIixmdW5jdGlvbigpe3JldHVybiBnfSk7Zi5kKGQsCiJjIixmdW5jdGlvbigpe3JldHVybiBsfSk7Zi5kKGQsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGt9KTt2YXIgZz1mdW5jdGlvbiBxKHApe2Z1bmN0aW9uIHIodCl7cmV0dXJuIE1hdGgucG93KHQscCl9cD0rcDtyLmV4cG9uZW50PXE7cmV0dXJuIHJ9KDMpLGw9ZnVuY3Rpb24gcihxKXtmdW5jdGlvbiB0KHYpe3JldHVybiAxLU1hdGgucG93KDEtdixxKX1xPStxO3QuZXhwb25lbnQ9cjtyZXR1cm4gdH0oMyksaz1mdW5jdGlvbiB0KHIpe2Z1bmN0aW9uIHYoeSl7cmV0dXJuKDE+PSh5Kj0yKT9NYXRoLnBvdyh5LHIpOjItTWF0aC5wb3coMi15LHIpKS8yfXI9K3I7di5leHBvbmVudD10O3JldHVybiB2fSgzKX0sZnVuY3Rpb24oYyxkKXtkLmI9ZnVuY3Rpb24oZil7cmV0dXJuIGYqZn07ZC5jPWZ1bmN0aW9uKGYpe3JldHVybiBmKigyLWYpfTtkLmE9ZnVuY3Rpb24oZil7cmV0dXJuKDE+PShmKj0yKT9mKmY6LS1mKigyLWYpKzEpLzJ9fSxmdW5jdGlvbihjLGQpe2QuYj1mdW5jdGlvbihsKXtyZXR1cm4gMS0KTWF0aC5jb3MobCpnKX07ZC5jPWZ1bmN0aW9uKGwpe3JldHVybiBNYXRoLnNpbihsKmcpfTtkLmE9ZnVuY3Rpb24obCl7cmV0dXJuKDEtTWF0aC5jb3MoZipsKSkvMn07dmFyIGY9TWF0aC5QSSxnPWYvMn0sZnVuY3Rpb24oYyxkLGYpe2Z1bmN0aW9uIGcoayl7cmV0dXJuITA9PT1sKGspJiYiW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChrKX12YXIgbD1mKDEyOSk7Yy5leHBvcnRzPWZ1bmN0aW9uKGspe2lmKCExPT09ZyhrKSlyZXR1cm4hMTtrPWsuY29uc3RydWN0b3I7aWYoImZ1bmN0aW9uIiE9PXR5cGVvZiBrKXJldHVybiExO2s9ay5wcm90b3R5cGU7cmV0dXJuITE9PT1nKGspfHwhMT09PWsuaGFzT3duUHJvcGVydHkoImlzUHJvdG90eXBlT2YiKT8hMTohMH19LGZ1bmN0aW9uKGMpe2MuZXhwb3J0cz1mdW5jdGlvbihkKXtyZXR1cm4gbnVsbCE9ZCYmIm9iamVjdCI9PT10eXBlb2YgZCYmITE9PT1BcnJheS5pc0FycmF5KGQpfX0sZnVuY3Rpb24oYywKZCl7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGYoZyxsLGspe3ZvaWQgMD09PWwmJihsPTEwKTt2b2lkIDA9PT1rJiYoaz17fSk7dmFyIG49dGhpczt0aGlzLmN0eD1nO3RoaXMubGluZUhlaWdodD1sO3RoaXMuc3R5bGU9azt0aGlzLmNyZWF0ZVJ1bGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHApe24uY3R4LmZvbnQ9bi5zdHlsZS5mb250O3JldHVybnt3aWR0aDpuLmN0eC5tZWFzdXJlVGV4dChwKS53aWR0aCxoZWlnaHQ6bi5saW5lSGVpZ2h0fX19O3RoaXMuY3JlYXRlUGVuPWZ1bmN0aW9uKHAscSxyKXtudWxsPT1yJiYocj1uLmN0eCk7ci5zYXZlKCk7ci50cmFuc2xhdGUocS50cmFuc2xhdGVbMF0scS50cmFuc2xhdGVbMV0pO3Iucm90YXRlKHEucm90YXRlKk1hdGguUEkvMTgwKTtyZXR1cm4gbi5jcmVhdGVDYW52YXNQZW4ocil9O3ZvaWQgMD09PXRoaXMuc3R5bGUuZmlsbCYmKHRoaXMuc3R5bGUuZmlsbD0iIzQ0NCIpfWYucHJvdG90eXBlLmNyZWF0ZUNhbnZhc1Blbj1mdW5jdGlvbihnKXt2YXIgbD0KdGhpcztyZXR1cm57ZGVzdHJveTpmdW5jdGlvbigpe2cucmVzdG9yZSgpfSx3cml0ZTpmdW5jdGlvbihrLG4scCxxKXtnLnRleHRBbGlnbj1uO251bGwhPWwuc3R5bGUuZm9udCYmKGcuZm9udD1sLnN0eWxlLmZvbnQpO251bGwhPWwuc3R5bGUuZmlsbCYmKGcuZmlsbFN0eWxlPWwuc3R5bGUuZmlsbCxnLmZpbGxUZXh0KGsscCxxKSk7bnVsbCE9bC5zdHlsZS5zdHJva2UmJihnLnN0cm9rZVN0eWxlPWwuc3R5bGUuZmlsbCxnLnN0cm9rZVRleHQoayxwLHEpKX19fTtyZXR1cm4gZn0oKTtkLkNhbnZhc0NvbnRleHQ9Y30sZnVuY3Rpb24oYyxkKXt2YXIgZj1mdW5jdGlvbigpe2Z1bmN0aW9uIGcoKXt9Zy5hcHBlbmQ9ZnVuY3Rpb24obCxrKXtmb3IodmFyIG49W10scD0yO3A8YXJndW1lbnRzLmxlbmd0aDtwKyspbltwLTJdPWFyZ3VtZW50c1twXTtuPWcuY3JlYXRlLmFwcGx5KGcsW2tdLmNvbmNhdChuKSk7bC5hcHBlbmRDaGlsZChuKTtyZXR1cm4gbn07Zy5jcmVhdGU9ZnVuY3Rpb24obCl7Zm9yKHZhciBrPQpbXSxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKylrW24tMV09YXJndW1lbnRzW25dO249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGcuU1ZHX05TLGwpO2cuYWRkQ2xhc3Nlcy5hcHBseShnLFtuXS5jb25jYXQoaykpO3JldHVybiBufTtnLmFkZENsYXNzZXM9ZnVuY3Rpb24obCl7Zm9yKHZhciBrPVtdLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWtbbi0xXT1hcmd1bWVudHNbbl07az1rLmZpbHRlcihmdW5jdGlvbihwKXtyZXR1cm4gbnVsbCE9cH0pO251bGwhPWwuY2xhc3NMaXN0P2suZm9yRWFjaChmdW5jdGlvbihwKXtsLmNsYXNzTGlzdC5hZGQocCl9KTpsLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGsuam9pbigiICIpKX07Zy5nZXREaW1lbnNpb25zPWZ1bmN0aW9uKGwpe2lmKGwuZ2V0QkJveCl0cnl7dmFyIGs9bC5nZXRCQm94KCk7cmV0dXJue3dpZHRoOmsud2lkdGgsaGVpZ2h0OmsuaGVpZ2h0fX1jYXRjaChuKXt9cmV0dXJue2hlaWdodDowLHdpZHRoOjB9fTtyZXR1cm4gZ30oKTsKZi5TVkdfTlM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjtkLlN2Z1V0aWxzPWY7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGcobCxrLG4pe3ZvaWQgMD09PW4mJihuPSExKTt2YXIgcD10aGlzO3RoaXMuZWxlbWVudD1sO3RoaXMuY2xhc3NOYW1lPWs7dGhpcy5hZGRUaXRsZUVsZW1lbnQ9bjt0aGlzLmNyZWF0ZVJ1bGVyPWZ1bmN0aW9uKCl7dmFyIHE9cC5nZXRUZXh0RWxlbWVudHMocC5lbGVtZW50KSxyPXEucGFyZW50RWxlbWVudCx0PXEuY29udGFpbmVyRWxlbWVudCx2PXEudGV4dEVsZW1lbnQ7cmV0dXJuIGZ1bmN0aW9uKHkpe3IuYXBwZW5kQ2hpbGQodCk7di50ZXh0Q29udGVudD15O3k9Zi5nZXREaW1lbnNpb25zKHYpO3IucmVtb3ZlQ2hpbGQodCk7cmV0dXJuIHl9fTt0aGlzLmNyZWF0ZVBlbj1mdW5jdGlvbihxLHIsdCl7bnVsbD09dCYmKHQ9cC5lbGVtZW50KTt0PWYuYXBwZW5kKHQsImciLCJ0ZXh0LWNvbnRhaW5lciIscC5jbGFzc05hbWUpO3AuYWRkVGl0bGVFbGVtZW50JiYKKGYuYXBwZW5kKHQsInRpdGxlIikudGV4dENvbnRlbnQ9cSx0LnNldEF0dHJpYnV0ZSgidGl0bGUiLHEpKTtxPWYuYXBwZW5kKHQsImciLCJ0ZXh0LWFyZWEiKTtxLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrci50cmFuc2xhdGVbMF0rIiwiK3IudHJhbnNsYXRlWzFdKyIpcm90YXRlKCIrKHIucm90YXRlKyIpIikpO3JldHVybiBwLmNyZWF0ZVN2Z0xpbmVQZW4ocSl9fWcucHJvdG90eXBlLnNldEFkZFRpdGxlRWxlbWVudD1mdW5jdGlvbihsKXt0aGlzLmFkZFRpdGxlRWxlbWVudD1sfTtnLnByb3RvdHlwZS5jcmVhdGVTdmdMaW5lUGVuPWZ1bmN0aW9uKGwpe3JldHVybnt3cml0ZTpmdW5jdGlvbihrLG4scCxxKXt2YXIgcj1mLmFwcGVuZChsLCJ0ZXh0IiwidGV4dC1saW5lIik7ci50ZXh0Q29udGVudD1rO3Iuc2V0QXR0cmlidXRlKCJ0ZXh0LWFuY2hvciIsbik7ci5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK3ArIiwiK3ErIikiKTtyLnNldEF0dHJpYnV0ZSgieSIsCiItMC4yNWVtIil9fX07Zy5wcm90b3R5cGUuZ2V0VGV4dEVsZW1lbnRzPWZ1bmN0aW9uKGwpe2lmKCJ0ZXh0Ij09PWwudGFnTmFtZSl7dmFyIGs9bC5wYXJlbnRFbGVtZW50O251bGw9PWsmJihrPWwucGFyZW50Tm9kZSk7ay5yZW1vdmVDaGlsZChsKTtyZXR1cm57Y29udGFpbmVyRWxlbWVudDpsLHBhcmVudEVsZW1lbnQ6ayx0ZXh0RWxlbWVudDpsfX12YXIgbj1sLnF1ZXJ5U2VsZWN0b3IoInRleHQiKTtpZihudWxsIT1uKXJldHVybiBrPWwucGFyZW50RWxlbWVudCxudWxsPT1rJiYoaz1sLnBhcmVudE5vZGUpLGsucmVtb3ZlQ2hpbGQobCkse2NvbnRhaW5lckVsZW1lbnQ6bCxwYXJlbnRFbGVtZW50OmssdGV4dEVsZW1lbnQ6bn07az1mLmNyZWF0ZSgidGV4dCIsdGhpcy5jbGFzc05hbWUpO3JldHVybntjb250YWluZXJFbGVtZW50OmsscGFyZW50RWxlbWVudDpsLHRleHRFbGVtZW50Omt9fTtyZXR1cm4gZ30oKTtkLlN2Z0NvbnRleHQ9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPQp0aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixwKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgciBpbiBwKXAuaGFzT3duUHJvcGVydHkocikmJihuW3JdPXBbcl0pO24ucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KHEucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBxKX0sbD1mKDIxKSxrPWYoMzYpO2M9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcChxKXt2YXIgcj1uLmNhbGwodGhpcyxxKXx8dGhpcztyLmRpbUNhY2hlPW5ldyBsLkNhY2hlKGZ1bmN0aW9uKHQpe3JldHVybiByLl9tZWFzdXJlTm90RnJvbUNhY2hlKHQpfSk7cmV0dXJuIHJ9ZyhwLG4pO3AucHJvdG90eXBlLl9tZWFzdXJlTm90RnJvbUNhY2hlPWZ1bmN0aW9uKHEpe3JldHVybiBuLnByb3RvdHlwZS5tZWFzdXJlLmNhbGwodGhpcyxxKX07cC5wcm90b3R5cGUubWVhc3VyZT1mdW5jdGlvbihxKXt2b2lkIDA9PT1xJiYocT1rLkFic3RyYWN0TWVhc3VyZXIuSEVJR0hUX1RFWFQpOwpyZXR1cm4gdGhpcy5kaW1DYWNoZS5nZXQocSl9O3AucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5kaW1DYWNoZS5jbGVhcigpO24ucHJvdG90eXBlLnJlc2V0LmNhbGwodGhpcyl9O3JldHVybiBwfShmKDYwKS5DYWNoZUNoYXJhY3Rlck1lYXN1cmVyKTtkLkNhY2hlTWVhc3VyZXI9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoNTkpLGw9Zig2Miksaz1mKDY0KSxuPWYoNjYpO2M9ZnVuY3Rpb24oKXtmdW5jdGlvbiBwKHEpe3RoaXMuY29udGV4dD1xO3RoaXMubWVhc3VyZXI9bmV3IGwuQ2FjaGVNZWFzdXJlcih0aGlzLmNvbnRleHQpO3RoaXMud3JhcHBlcj1uZXcgay5XcmFwcGVyO3RoaXMud3JpdGVyPW5ldyBuLldyaXRlcih0aGlzLm1lYXN1cmVyLHRoaXMuY29udGV4dCx0aGlzLndyYXBwZXIpfXAuc3ZnPWZ1bmN0aW9uKHEscix0KXtyZXR1cm4gbmV3IHAobmV3IGcuU3ZnQ29udGV4dChxLHIsdCkpfTtwLmNhbnZhcz1mdW5jdGlvbihxLHIsdCl7cmV0dXJuIG5ldyBwKG5ldyBnLkNhbnZhc0NvbnRleHQocSwKcix0KSl9O3AucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHEscix0LHYseSl7dGhpcy53cml0ZXIud3JpdGUocSxyLHQsdix5KX07cC5wcm90b3R5cGUuY2xlYXJNZWFzdXJlckNhY2hlPWZ1bmN0aW9uKCl7dGhpcy5tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gcH0oKTtkLlR5cGVzZXR0ZXI9Y30sZnVuY3Rpb24oYyxkKXtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZihnKXt0aGlzLmNhY2hlPXt9O3RoaXMuY29tcHV0ZT1nfWYucHJvdG90eXBlLmdldD1mdW5jdGlvbihnKXt0aGlzLmNhY2hlLmhhc093blByb3BlcnR5KGcpfHwodGhpcy5jYWNoZVtnXT10aGlzLmNvbXB1dGUoZykpO3JldHVybiB0aGlzLmNhY2hlW2ddfTtmLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuY2FjaGU9e307cmV0dXJuIHRoaXN9O3JldHVybiBmfSgpO2QuQ2FjaGU9Y30sZnVuY3Rpb24oYyxkKXtkLk1ldGhvZHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBmKCl7fWYuYXJyYXlFcT1mdW5jdGlvbihnLGwpe2lmKG51bGw9PQpnfHxudWxsPT1sKXJldHVybiBnPT09bDtpZihnLmxlbmd0aCE9PWwubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgaz0wO2s8Zy5sZW5ndGg7aysrKWlmKGdba10hPT1sW2tdKXJldHVybiExO3JldHVybiEwfTtmLm9iakVxPWZ1bmN0aW9uKGcsbCl7aWYobnVsbD09Z3x8bnVsbD09bClyZXR1cm4gZz09PWw7dmFyIGs9T2JqZWN0LmtleXMoZykuc29ydCgpLG49T2JqZWN0LmtleXMobCkuc29ydCgpLHA9ay5tYXAoZnVuY3Rpb24ocil7cmV0dXJuIGdbcl19KSxxPW4ubWFwKGZ1bmN0aW9uKHIpe3JldHVybiBsW3JdfSk7cmV0dXJuIGYuYXJyYXlFcShrLG4pJiZmLmFycmF5RXEocCxxKX07Zi5zdHJpY3RFcT1mdW5jdGlvbihnLGwpe3JldHVybiBnPT09bH07Zi5kZWZhdWx0cz1mdW5jdGlvbihnKXtmb3IodmFyIGw9W10saz0xO2s8YXJndW1lbnRzLmxlbmd0aDtrKyspbFtrLTFdPWFyZ3VtZW50c1trXTtpZihudWxsPT1nKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCIpOwp2YXIgbj1PYmplY3QoZyk7bC5mb3JFYWNoKGZ1bmN0aW9uKHApe2lmKG51bGwhPXApZm9yKHZhciBxIGluIHApT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHAscSkmJihuW3FdPXBbcV0pfSk7cmV0dXJuIG59O3JldHVybiBmfSgpfSxmdW5jdGlvbihjLGQpe2QuU3RyaW5nTWV0aG9kcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGYoKXt9Zi5jb21iaW5lV2hpdGVzcGFjZT1mdW5jdGlvbihnKXtyZXR1cm4gZy5yZXBsYWNlKC9bIFx0XSsvZywiICIpfTtmLmlzTm90RW1wdHlTdHJpbmc9ZnVuY3Rpb24oZyl7cmV0dXJuIGcmJiIiIT09Zy50cmltKCl9O2YudHJpbVN0YXJ0PWZ1bmN0aW9uKGcsbCl7aWYoIWcpcmV0dXJuIGc7Zz1nLnNwbGl0KCIiKTt2YXIgaz1sP2Z1bmN0aW9uKG4pe3JldHVybiBuLnNwbGl0KGwpLnNvbWUoZi5pc05vdEVtcHR5U3RyaW5nKX06Zi5pc05vdEVtcHR5U3RyaW5nO3JldHVybiBnLnJlZHVjZShmdW5jdGlvbihuLHApe3JldHVybiBrKG4rcCk/Cm4rcDpufSwiIil9O2YudHJpbUVuZD1mdW5jdGlvbihnLGwpe2lmKCFnKXJldHVybiBnO2c9Zy5zcGxpdCgiIik7Zy5yZXZlcnNlKCk7Zz1mLnRyaW1TdGFydChnLmpvaW4oIiIpLGwpLnNwbGl0KCIiKTtnLnJldmVyc2UoKTtyZXR1cm4gZy5qb2luKCIiKX07cmV0dXJuIGZ9KCl9LGZ1bmN0aW9uKGMsZCl7Yz1mdW5jdGlvbigpe2Z1bmN0aW9uIGYoKXt0aGlzLldvcmREaXZpZGVyUmVnRXhwPS9cVy87dGhpcy5XaGl0ZXNwYWNlUmVnRXhwPS9ccy99Zi5wcm90b3R5cGUudG9rZW5pemU9ZnVuY3Rpb24oZyl7dmFyIGw9dGhpcztyZXR1cm4gZy5zcGxpdCgiIikucmVkdWNlKGZ1bmN0aW9uKGssbil7cmV0dXJuIGsuc2xpY2UoMCwtMSkuY29uY2F0KGwuc2hvdWxkQ3JlYXRlTmV3VG9rZW4oa1trLmxlbmd0aC0xXSxuKSl9LFsiIl0pfTtmLnByb3RvdHlwZS5zaG91bGRDcmVhdGVOZXdUb2tlbj1mdW5jdGlvbihnLGwpe2lmKCFnKXJldHVybltsXTt2YXIgaz1nW2cubGVuZ3RoLTFdO3JldHVybiB0aGlzLldoaXRlc3BhY2VSZWdFeHAudGVzdChrKSYmCnRoaXMuV2hpdGVzcGFjZVJlZ0V4cC50ZXN0KGwpP1tnK2xdOnRoaXMuV2hpdGVzcGFjZVJlZ0V4cC50ZXN0KGspfHx0aGlzLldoaXRlc3BhY2VSZWdFeHAudGVzdChsKT9bZyxsXTp0aGlzLldvcmREaXZpZGVyUmVnRXhwLnRlc3Qoayl8fHRoaXMuV29yZERpdmlkZXJSZWdFeHAudGVzdChsKT9rPT09bD9bZytsXTpbZyxsXTpbZytsXX07cmV0dXJuIGZ9KCk7ZC5Ub2tlbml6ZXI9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLGspe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBwIGluIGspay5oYXNPd25Qcm9wZXJ0eShwKSYmKGxbcF09a1twXSk7bC5wcm90b3R5cGU9bnVsbD09PWs/T2JqZWN0LmNyZWF0ZShrKToobi5wcm90b3R5cGU9ay5wcm90b3R5cGUsbmV3IG4pfTtjPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIGsoKXtyZXR1cm4gbC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9ZyhrLGwpO2sucHJvdG90eXBlLndyYXA9CmZ1bmN0aW9uKG4scCxxLHIpe2Z1bmN0aW9uIHQoRCl7cmV0dXJuIGwucHJvdG90eXBlLndyYXAuY2FsbCh2LG4scCxELHIpfXZhciB2PXRoaXM7dm9pZCAwPT09ciYmKHI9SW5maW5pdHkpO2lmKDE8bi5zcGxpdCgiXG4iKS5sZW5ndGgpdGhyb3cgRXJyb3IoIlNpbmdsZUxpbmVXcmFwcGVyIGlzIGRlc2lnbmVkIHRvIHdvcmsgb25seSBvbiBzaW5nbGUgbGluZSIpO3ZhciB5PXQocSk7aWYoMj55Lm5vTGluZXMpcmV0dXJuIHk7Zm9yKHZhciB6PTAseD0wO3g8ay5OT19XUkFQX0lURVJBVElPTlMmJnE+ejsrK3gpe3ZhciBDPShxK3opLzIsRj10KEMpO3RoaXMuYXJlU2FtZVJlc3VsdHMoeSxGKT8ocT1DLHk9Rik6ej1DfXJldHVybiB5fTtrLnByb3RvdHlwZS5hcmVTYW1lUmVzdWx0cz1mdW5jdGlvbihuLHApe3JldHVybiBuLm5vTGluZXM9PT1wLm5vTGluZXMmJm4udHJ1bmNhdGVkVGV4dD09PXAudHJ1bmNhdGVkVGV4dH07cmV0dXJuIGt9KGYoNjUpLldyYXBwZXIpO2MuTk9fV1JBUF9JVEVSQVRJT05TPQo1O2QuU2luZ2xlTGluZVdyYXBwZXI9Y30sZnVuY3Rpb24oYyxkLGYpe3ZhciBnPWYoMjEpLGw9e3RleHRSb3RhdGlvbjowLHRleHRTaGVhcjowLHhBbGlnbjoibGVmdCIseUFsaWduOiJ0b3AifTtjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gayhuLHAscSl7dGhpcy5fbWVhc3VyZXI9bjt0aGlzLl9wZW5GYWN0b3J5PXA7dGhpcy5fd3JhcHBlcj1xfWsucHJvdG90eXBlLm1lYXN1cmVyPWZ1bmN0aW9uKG4pe3RoaXMuX21lYXN1cmVyPW47cmV0dXJuIHRoaXN9O2sucHJvdG90eXBlLndyYXBwZXI9ZnVuY3Rpb24obil7dGhpcy5fd3JhcHBlcj1uO3JldHVybiB0aGlzfTtrLnByb3RvdHlwZS5wZW5GYWN0b3J5PWZ1bmN0aW9uKG4pe3RoaXMuX3BlbkZhY3Rvcnk9bjtyZXR1cm4gdGhpc307ay5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24obixwLHEscix0KXt2b2lkIDA9PT1yJiYocj17fSk7cj1nLk1ldGhvZHMuZGVmYXVsdHMoe30sbCxyKTtpZigtMT09PWsuU3VwcG9ydGVkUm90YXRpb24uaW5kZXhPZihyLnRleHRSb3RhdGlvbikpdGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIHJvdGF0aW9uIC0gIisKci50ZXh0Um90YXRpb24rIi4gU3VwcG9ydGVkIHJvdGF0aW9ucyBhcmUgIitrLlN1cHBvcnRlZFJvdGF0aW9uLmpvaW4oIiwgIikpO2lmKG51bGwhPXIudGV4dFNoZWFyJiYtODA+ci50ZXh0U2hlYXJ8fDgwPHIudGV4dFNoZWFyKXRocm93IEVycm9yKCJ1bnN1cHBvcnRlZCBzaGVhciBhbmdsZSAtICIrci50ZXh0U2hlYXIrIi4gTXVzdCBiZSBiZXR3ZWVuIC04MCBhbmQgODAiKTt2YXIgdj00NTxNYXRoLmFicyhNYXRoLmFicyhyLnRleHRSb3RhdGlvbiktOTApLHk9dj9wOnEsej12P3E6cCx4PXIudGV4dFNoZWFyLEM9eCpNYXRoLlBJLzE4MDt2PXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQ7dmFyIEY9dipNYXRoLnRhbihDKTt5PXkvTWF0aC5jb3MoQyktTWF0aC5hYnMoRik7dmFyIEQ9eipNYXRoLmNvcyhDKTt6PWcuU3RyaW5nTWV0aG9kcy5jb21iaW5lV2hpdGVzcGFjZShuKTt6PSh0aGlzLl93cmFwcGVyP3RoaXMuX3dyYXBwZXIud3JhcCh6LHRoaXMuX21lYXN1cmVyLAp5LEQpLndyYXBwZWRUZXh0OnopLnNwbGl0KCJcbiIpO0M9ay5YT2Zmc2V0RmFjdG9yW3IueEFsaWduXSp5Kk1hdGguc2luKEMpLWsuWU9mZnNldEZhY3RvcltyLnlBbGlnbl0qKEQtei5sZW5ndGgqdik7eD1yLnRleHRSb3RhdGlvbit4O3N3aXRjaChyLnRleHRSb3RhdGlvbil7Y2FzZSA5MDpwPVtwK0MsMF07YnJlYWs7Y2FzZSAtOTA6cD1bLUMscV07YnJlYWs7Y2FzZSAxODA6cD1bcCxxK0NdO2JyZWFrO2RlZmF1bHQ6cD1bMCwtQ119bj10aGlzLl9wZW5GYWN0b3J5LmNyZWF0ZVBlbihuLHt0cmFuc2xhdGU6cCxyb3RhdGU6eH0sdCk7dGhpcy53cml0ZUxpbmVzKHosbix5LHYsRixyLnhBbGlnbik7bnVsbCE9bi5kZXN0cm95JiZuLmRlc3Ryb3koKX07ay5wcm90b3R5cGUud3JpdGVMaW5lcz1mdW5jdGlvbihuLHAscSxyLHQsdil7bi5mb3JFYWNoKGZ1bmN0aW9uKHkseil7cC53cml0ZSh5LGsuQW5jaG9yQ29udmVydGVyW3ZdLCgwPHQ/KHorMSkqdDp6KnQpK3Eqay5YT2Zmc2V0RmFjdG9yW3ZdLAooeisxKSpyKX0pfTtyZXR1cm4ga30oKTtjLlN1cHBvcnRlZFJvdGF0aW9uPVstOTAsMCwxODAsOTBdO2MuQW5jaG9yQ29udmVydGVyPXtjZW50ZXI6Im1pZGRsZSIsbGVmdDoic3RhcnQiLHJpZ2h0OiJlbmQifTtjLlhPZmZzZXRGYWN0b3I9e2NlbnRlcjouNSxsZWZ0OjAscmlnaHQ6MX07Yy5ZT2Zmc2V0RmFjdG9yPXtib3R0b206MSxjZW50ZXI6LjUsdG9wOjB9O2QuV3JpdGVyPWN9LGZ1bmN0aW9uKGMsZCxmKXtmdW5jdGlvbiBnKGwpe2Zvcih2YXIgayBpbiBsKWQuaGFzT3duUHJvcGVydHkoayl8fChkW2tdPWxba10pfWYoNjkpO2M9Zig3KTtkLkFuaW1hdG9ycz1jO2M9Zig2Nyk7ZC5BeGVzPWM7Yz1mKDM3KTtkLkNvbXBvbmVudHM9YztjPWYoMjMpO2QuQ29uZmlncz1jO2M9Zig4KTtkLkZvcm1hdHRlcnM9YztjPWYoMzApO2QuUmVuZGVyQ29udHJvbGxlcj1jO2M9ZigzOSk7ZC5SZW5kZXJQb2xpY2llcz1jO2M9ZigzMSk7ZC5TeW1ib2xGYWN0b3JpZXM9YztjPWYoMTMpO2QuRGlzcGF0Y2hlcnM9CmM7Yz1mKDE0KTtkLkRyYXdlcnM9YztjPWYoMjUpO2QuSW50ZXJhY3Rpb25zPWM7Yz1mKDE5KTtkLlBsb3RzPWM7Yz1mKDMpO2QuU2NhbGVzPWM7Yz1mKDApO2QuVXRpbHM9YztnKGYoMjIpKTtjPWYoMjgpO2QuVGltZUludGVydmFsPWMuVGltZUludGVydmFsO2coZig0KSk7ZyhmKDI5KSk7ZyhmKDM4KSk7Yz1mKDY4KTtkLnZlcnNpb249Yy52ZXJzaW9uO2coZigyNCkpO2coZig2KSk7ZyhmKDE1KSk7ZyhmKDQwKSk7ZyhmKDE2KSk7ZyhmKDIpKTtnKGYoMTEpKTtnKGYoMTcpKX1dKX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWNoYXJ0LWhlbHBlcnMvcGxvdHRhYmxlLWludGVyYWN0aW9ucy5qcwp2YXIgJG87CihmdW5jdGlvbihhKXtmdW5jdGlvbiBjKHApe2NvbnN0IHE9W107Zm9yKDtwJiZwIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7KWlmKHEucHVzaChwKSxwLmFzc2lnbmVkU2xvdClwPXAuYXNzaWduZWRTbG90O2Vsc2UgaWYocC5wYXJlbnRFbGVtZW50KXA9cC5wYXJlbnRFbGVtZW50O2Vsc2V7Y29uc3Qgcj1wLnBhcmVudE5vZGU7cD1yIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudD9yLmhvc3Q6ciE9PXA/cjpudWxsfXJldHVybiBxfWZ1bmN0aW9uIGQocCl7dmFyIHE9YyhwKTtwPWY7bGV0IHI9bnVsbDtmb3IoY29uc3QgdiBvZiBxKXtxPVBsb3R0YWJsZS5VdGlscy5ET00uZ2V0RWxlbWVudFRyYW5zZm9ybSh2KTtpZihudWxsIT1xKXt2YXIgdD12LmNsaWVudFdpZHRoLzI7Y29uc3QgeT12LmNsaWVudEhlaWdodC8yO3A9UGxvdHRhYmxlLlV0aWxzLk1hdGgubXVsdGlwbHlUcmFuc2xhdGUocCxbdCx5XSk7cD1QbG90dGFibGUuVXRpbHMuTWF0aC5tdWx0aXBseU1hdHJpeChwLFBsb3R0YWJsZS5VdGlscy5NYXRoLmludmVydE1hdHJpeChxKSk7CnA9UGxvdHRhYmxlLlV0aWxzLk1hdGgubXVsdGlwbHlUcmFuc2xhdGUocCxbLXQsLXldKX1xPXYuc2Nyb2xsTGVmdDt0PXYuc2Nyb2xsVG9wO2lmKG51bGw9PT1yfHx2PT09cilxLT12Lm9mZnNldExlZnQrdi5jbGllbnRMZWZ0LHQtPXYub2Zmc2V0VG9wK3YuY2xpZW50VG9wLHI9di5vZmZzZXRQYXJlbnQ7cD1QbG90dGFibGUuVXRpbHMuTWF0aC5tdWx0aXBseVRyYW5zbGF0ZShwLFtxLHRdKX1yZXR1cm4gcH1jb25zdCBmPVsxLDAsMCwxLDAsMF07Y2xhc3MgZyBleHRlbmRzIFBsb3R0YWJsZS5VdGlscy5UcmFuc2xhdG9ye2NvbXB1dGVQb3NpdGlvbihwLHEpe3A9e3g6cCx5OnF9O3E9ZCh0aGlzLl9yb290RWxlbWVudCk7cmV0dXJuIG51bGw9PXE/cDpQbG90dGFibGUuVXRpbHMuTWF0aC5hcHBseVRyYW5zZm9ybShxLHApfX1jbGFzcyBsIGV4dGVuZHMgUGxvdHRhYmxlLkRpc3BhdGNoZXJzLk1vdXNle2NvbnN0cnVjdG9yKHApe3N1cGVyKHApO3RoaXMuX2V2ZW50VGFyZ2V0PXAucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpOwp0aGlzLl90cmFuc2xhdG9yPW5ldyBnKHAucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpKX1zdGF0aWMgZ2V0RGlzcGF0Y2hlcihwKXtjb25zdCBxPXAucm9vdCgpLnJvb3RFbGVtZW50KCk7bGV0IHI9cVtsLl9ESVNQQVRDSEVSX0tFWV07cnx8KHI9bmV3IGwocCkscVtsLl9ESVNQQVRDSEVSX0tFWV09cik7cmV0dXJuIHJ9fWNsYXNzIGsgZXh0ZW5kcyBQbG90dGFibGUuRGlzcGF0Y2hlcnMuVG91Y2h7Y29uc3RydWN0b3IocCl7c3VwZXIocCk7dGhpcy5fZXZlbnRUYXJnZXQ9cC5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCk7dGhpcy5fdHJhbnNsYXRvcj1uZXcgZyhwLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKSl9c3RhdGljIGdldERpc3BhdGNoZXIocCl7Y29uc3QgcT1wLnJvb3QoKS5yb290RWxlbWVudCgpO2xldCByPXFbay5fRElTUEFUQ0hFUl9LRVldO3J8fChyPW5ldyBrKHApLHFbay5fRElTUEFUQ0hFUl9LRVldPXIpO3JldHVybiByfX1jbGFzcyBuIGV4dGVuZHMgUGxvdHRhYmxlLkludGVyYWN0aW9ucy5Qb2ludGVye19hbmNob3IoKXt0aGlzLl9pc0FuY2hvcmVkPQohMDt0aGlzLl9tb3VzZURpc3BhdGNoZXI9bC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPWsuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayl9fWEuUG9pbnRlckludGVyYWN0aW9uPW59KSgkb3x8KCRvPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotY2hhcnQtaGVscGVycy92ei1jaGFydC1oZWxwZXJzLmpzCihmdW5jdGlvbihhKXtmdW5jdGlvbiBjKCl7bGV0IGw9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO2wudGlja0dlbmVyYXRvcigpO2xldCBrPW5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKGwsImJvdHRvbSIpO2suZm9ybWF0dGVyKGEuc3RlcEZvcm1hdHRlcik7cmV0dXJue3NjYWxlOmwsYXhpczprLGFjY2Vzc29yOm49Pm4uc3RlcH19ZnVuY3Rpb24gZCgpe2xldCBsPW5ldyBQbG90dGFibGUuU2NhbGVzLlRpbWU7cmV0dXJue3NjYWxlOmwsYXhpczpuZXcgUGxvdHRhYmxlLkF4ZXMuVGltZShsLCJib3R0b20iKSxhY2Nlc3NvcjprPT5rLndhbGxfdGltZX19ZnVuY3Rpb24gZigpe2xldCBsPW5ldyBQbG90dGFibGUuU2NhbGVzLkxpbmVhcjtyZXR1cm57c2NhbGU6bCxheGlzOm5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKGwsImJvdHRvbSIpLGFjY2Vzc29yOmEucmVsYXRpdmVBY2Nlc3Nvcn19YS5TWU1CT0xTX0xJU1Q9W3tjaGFyYWN0ZXI6Ilx1MjVmYyIsbWV0aG9kOlBsb3R0YWJsZS5TeW1ib2xGYWN0b3JpZXMuc3F1YXJlfSwKe2NoYXJhY3RlcjoiXHUyNWM2IixtZXRob2Q6UGxvdHRhYmxlLlN5bWJvbEZhY3Rvcmllcy5kaWFtb25kfSx7Y2hhcmFjdGVyOiJcdTI1YjIiLG1ldGhvZDpQbG90dGFibGUuU3ltYm9sRmFjdG9yaWVzLnRyaWFuZ2xlfSx7Y2hhcmFjdGVyOiJcdTI2MDUiLG1ldGhvZDpQbG90dGFibGUuU3ltYm9sRmFjdG9yaWVzLnN0YXJ9LHtjaGFyYWN0ZXI6Ilx1MjcxYSIsbWV0aG9kOlBsb3R0YWJsZS5TeW1ib2xGYWN0b3JpZXMuY3Jvc3N9XTtsZXQgZzsoZnVuY3Rpb24obCl7bC5TVEVQPSJzdGVwIjtsLlJFTEFUSVZFPSJyZWxhdGl2ZSI7bC5XQUxMX1RJTUU9IndhbGxfdGltZSJ9KShnPWEuWFR5cGV8fChhLlhUeXBlPXt9KSk7YS5ZX1RPT0xUSVBfRk9STUFUVEVSX1BSRUNJU0lPTj00O2EuU1RFUF9GT1JNQVRURVJfUFJFQ0lTSU9OPTQ7YS5ZX0FYSVNfRk9STUFUVEVSX1BSRUNJU0lPTj0zO2EuVE9PTFRJUF9ZX1BJWEVMX09GRlNFVD0yMDthLlRPT0xUSVBfQ0lSQ0xFX1NJWkU9NDthLk5BTl9TWU1CT0xfU0laRT0KNjthLm11bHRpc2NhbGVGb3JtYXR0ZXI9ZnVuY3Rpb24obCl7cmV0dXJuIGs9PntsZXQgbj1NYXRoLmFicyhrKTsxRS0xNT5uJiYobj0wKTtyZXR1cm4oMUU0PD1uP2QzLmZvcm1hdCgiLiIrbCsifmUiKTowPG4mJi4wMT5uP2QzLmZvcm1hdCgiLiIrbCsifmUiKTpkMy5mb3JtYXQoIi4iK2wrIn5nIikpKGspfX07YS5jb21wdXRlRG9tYWluPWZ1bmN0aW9uKGwsayl7bD1sLmZpbHRlcihxPT5pc0Zpbml0ZShxKSk7aWYoMD09PWwubGVuZ3RoKXJldHVyblstLjEsMS4xXTtrPyhsPV8uc29ydEJ5KGwpLGs9ZDMucXVhbnRpbGUobCwuMDUpLGw9ZDMucXVhbnRpbGUobCwuOTUpKTooaz1kMy5taW4obCksbD1kMy5tYXgobCkpO2xldCBuLHA9bC1rO249MD09PXA/MS4xKk1hdGguYWJzKGspKzEuMTouMipwO2s9WzA8PWsmJms8cD8tLjEqbDprLW4sbCtuXTtyZXR1cm4gaz1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihrKS5uaWNlKCkuZG9tYWluKCl9O2EuYWNjZXNzb3JpemU9ZnVuY3Rpb24obCl7cmV0dXJuIGs9PgprW2xdfTthLnN0ZXBGb3JtYXR0ZXI9ZDMuZm9ybWF0KGAuJHthLlNURVBfRk9STUFUVEVSX1BSRUNJU0lPTn1+c2ApO2Euc3RlcFg9YzthLnRpbWVGb3JtYXR0ZXI9UGxvdHRhYmxlLkZvcm1hdHRlcnMudGltZSgiJWEgJWIgJWUsICVIOiVNOiVTIik7YS53YWxsWD1kO2EucmVsYXRpdmVBY2Nlc3Nvcj0obCxrLG4pPT57aWYobnVsbCE9bC5yZWxhdGl2ZSlyZXR1cm4gbC5yZWxhdGl2ZTtrPW4uZGF0YSgpO3JldHVybigrbC53YWxsX3RpbWUtKDA8ay5sZW5ndGg/K2tbMF0ud2FsbF90aW1lOjApKS8zNkU1fTthLnJlbGF0aXZlRm9ybWF0dGVyPWw9PntsZXQgaz0iIixuPU1hdGguZmxvb3IobC8yNCk7bC09MjQqbjtuJiYoays9bisiZCAiKTtsZXQgcD1NYXRoLmZsb29yKGwpO2w9NjAqKGwtcCk7aWYocHx8bilrKz1wKyJoICI7bGV0IHE9TWF0aC5mbG9vcihsKTtsPTYwKihsLXEpO2lmKHF8fHB8fG4pays9cSsibSAiO3JldHVybiBrK01hdGguZmxvb3IobCkrInMifTthLnJlbGF0aXZlWD0KZjthLmdldFhDb21wb25lbnRzPWZ1bmN0aW9uKGwpe3N3aXRjaChsKXtjYXNlIGcuU1RFUDpyZXR1cm4gYygpO2Nhc2UgZy5XQUxMX1RJTUU6cmV0dXJuIGQoKTtjYXNlIGcuUkVMQVRJVkU6cmV0dXJuIGYoKTtkZWZhdWx0OnRocm93IEVycm9yKCJpbnZhbGlkIHhUeXBlOiAiK2wpO319fSkoJG98fCgkbz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWNoYXJ0LWhlbHBlcnMvdnotY2hhcnQtdG9vbHRpcC5qcwp2YXIgYXA7CihmdW5jdGlvbihhKXtsZXQgYzsoZnVuY3Rpb24oZil7Zi5BVVRPPSJhdXRvIjtmLkJPVFRPTT0iYm90dG9tIjtmLlJJR0hUPSJyaWdodCJ9KShjPWEuVG9vbHRpcFBvc2l0aW9ufHwoYS5Ub29sdGlwUG9zaXRpb249e30pKTtjb25zdCBkPXtib3hTaGFkb3c6IjAgMXB4IDRweCByZ2JhKDAsIDAsIDAsIC4zKSIsb3BhY2l0eTowLHBvc2l0aW9uOiJmaXhlZCIsd2lsbENoYW5nZToidHJhbnNmb3JtIix6SW5kZXg6NX07UG9seW1lcih7aXM6InZ6LWNoYXJ0LXRvb2x0aXAiLF90ZW1wbGF0ZTpudWxsLHByb3BlcnRpZXM6e2NvbnRlbnRDb21wb25lbnROYW1lOlN0cmluZyxwb3NpdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6Yy5BVVRPfSxtaW5EaXN0RnJvbUVkZ2U6e3R5cGU6TnVtYmVyLHZhbHVlOjE1fX0scmVhZHkoKXt0aGlzLl90dW5uZWw9dGhpcy5fcmFmPXRoaXMuX3N0eWxlQ2FjaGU9bnVsbH0sYXR0YWNoZWQoKXt0aGlzLl90dW5uZWw9dGhpcy5fY3JlYXRlVHVubmVsKCk7dGhpcy5faGlkZU9uQmx1cj0KKCk9Pntkb2N1bWVudC5oaWRkZW4mJnRoaXMuaGlkZSgpfTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsdGhpcy5faGlkZU9uQmx1cil9LGRldGFjaGVkKCl7dGhpcy5oaWRlKCk7dGhpcy5fcmVtb3ZlVHVubmVsKHRoaXMuX3R1bm5lbCk7dGhpcy5fdHVubmVsPW51bGw7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHRoaXMuX2hpZGVPbkJsdXIpfSxjb250ZW50KCl7cmV0dXJuIHRoaXMuX3R1bm5lbC5zaGFkb3dSb290fSxoaWRlKCl7d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JhZik7dGhpcy5fc3R5bGVDYWNoZT1udWxsO3RoaXMuX3R1bm5lbC5zdHlsZS5vcGFjaXR5PTB9LHVwZGF0ZUFuZFBvc2l0aW9uKGYpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yYWYpO3RoaXMuX3JhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9yZXBvc2l0aW9uSW1wbChmKX0pfSwKX3JlcG9zaXRpb25JbXBsKGYpe2NvbnN0IGc9dGhpcy5fdHVubmVsO2Y9Zi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCBsPWcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksaz13aW5kb3cuaW5uZXJIZWlnaHQsbj1kb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLHA9Zi50b3AscT1wK2YuaGVpZ2h0LHI9bC5oZWlnaHQrJG8uVE9PTFRJUF9ZX1BJWEVMX09GRlNFVDtsZXQgdD1udWxsLHY9TWF0aC5tYXgodGhpcy5taW5EaXN0RnJvbUVkZ2UsZi5sZWZ0KSx5PW51bGwsej1wO3RoaXMucG9zaXRpb249PWMuUklHSFQ/dj1mLnJpZ2h0Oih6PXErJG8uVE9PTFRJUF9ZX1BJWEVMX09GRlNFVCxuPHYrbC53aWR0aCt0aGlzLm1pbkRpc3RGcm9tRWRnZSYmKHY9bnVsbCx5PXRoaXMubWluRGlzdEZyb21FZGdlKSk7dGhpcy5wb3NpdGlvbj09Yy5BVVRPJiYwPGYudG9wLXImJms8Zi50b3ArZi5oZWlnaHQrciYmKHo9bnVsbCx0PWstcCskby5UT09MVElQX1lfUElYRUxfT0ZGU0VUKTtmPXtvcGFjaXR5OjEsCmxlZnQ6dj9gJHt2fXB4YDpudWxsLHJpZ2h0Onk/YCR7eX1weGA6bnVsbCx0b3A6ej9gJHt6fXB4YDpudWxsLGJvdHRvbTp0P2Ake3R9cHhgOm51bGx9O18uaXNFcXVhbCh0aGlzLl9zdHlsZUNhY2hlLGYpfHwoT2JqZWN0LmFzc2lnbihnLnN0eWxlLGYpLHRoaXMuX3N0eWxlQ2FjaGU9Zil9LF9jcmVhdGVUdW5uZWwoKXtpZighdGhpcy5jb250ZW50Q29tcG9uZW50TmFtZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiUmVxdWlyZSBgY29udGVudENvbXBvbmVudE5hbWVgIHRvIGJlIGEgbmFtZSBvZiBhIFBvbHltZXIgY29tcG9uZW50Iik7Y29uc3QgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHRoaXMuY29udGVudENvbXBvbmVudE5hbWUpO09iamVjdC5hc3NpZ24oZi5zdHlsZSxkKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO3JldHVybiBmfSxfcmVtb3ZlVHVubmVsKGYpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9fSl9KShhcHx8KGFwPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydC9kcmFnWm9vbUludGVyYWN0aW9uLmpzCnZhciBicDsKKGZ1bmN0aW9uKGEpe2NsYXNzIGMgZXh0ZW5kcyBQbG90dGFibGUuQ29tcG9uZW50cy5TZWxlY3Rpb25Cb3hMYXllcntjb25zdHJ1Y3RvcihkLGYsZyl7c3VwZXIoKTt0aGlzLmVhc2VGbj1kMy5lYXNlQ3ViaWNJbk91dDt0aGlzLl9hbmltYXRpb25UaW1lPTc1MDt0aGlzLnhTY2FsZShkKTt0aGlzLnlTY2FsZShmKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb249bmV3IFBsb3R0YWJsZS5JbnRlcmFjdGlvbnMuRHJhZzt0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uPW5ldyBQbG90dGFibGUuSW50ZXJhY3Rpb25zLkNsaWNrO3RoaXMuc2V0dXBDYWxsYmFja3MoKTt0aGlzLnVuem9vbU1ldGhvZD1nO3RoaXMub25EZXRhY2goKCk9Pnt0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uLmRldGFjaEZyb20oKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoRnJvbSgpfSk7dGhpcy5vbkFuY2hvcigoKT0+e3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24uYXR0YWNoVG8odGhpcyk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKHRoaXMpfSl9aW50ZXJhY3Rpb25TdGFydChkKXt0aGlzLm9uU3RhcnQ9CmR9aW50ZXJhY3Rpb25FbmQoZCl7dGhpcy5vbkVuZD1kfWRyYWdJbnRlcmFjdGlvbigpe3JldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb259c2V0dXBDYWxsYmFja3MoKXtsZXQgZD0hMTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQoZj0+e3RoaXMuYm91bmRzKHt0b3BMZWZ0OmYsYm90dG9tUmlnaHQ6Zn0pO3RoaXMub25TdGFydCgpfSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZygoZixnKT0+e3RoaXMuYm91bmRzKHt0b3BMZWZ0OmYsYm90dG9tUmlnaHQ6Z30pO3RoaXMuYm94VmlzaWJsZSghMCk7ZD0hMH0pO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdFbmQoKGYsZyk9Pnt0aGlzLmJveFZpc2libGUoITEpO3RoaXMuYm91bmRzKHt0b3BMZWZ0OmYsYm90dG9tUmlnaHQ6Z30pO2lmKGQpdGhpcy56b29tKCk7ZWxzZSB0aGlzLm9uRW5kKCk7ZD0hMX0pO3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24ub25Eb3VibGVDbGljayh0aGlzLnVuem9vbS5iaW5kKHRoaXMpKX1hbmltYXRpb25UaW1lKGQpe2lmKG51bGw9PQpkKXJldHVybiB0aGlzLl9hbmltYXRpb25UaW1lO2lmKDA+ZCl0aHJvdyBFcnJvcigiYW5pbWF0aW9uVGltZSBjYW5ub3QgYmUgbmVnYXRpdmUiKTt0aGlzLl9hbmltYXRpb25UaW1lPWQ7cmV0dXJuIHRoaXN9ZWFzZShkKXtpZigiZnVuY3Rpb24iIT09dHlwZW9mIGQpdGhyb3cgRXJyb3IoImVhc2UgZnVuY3Rpb24gbXVzdCBiZSBhIGZ1bmN0aW9uIik7MD09PWQoMCkmJjE9PT1kKDEpfHxQbG90dGFibGUuVXRpbHMuV2luZG93Lndhcm4oIkVhc2luZyBmdW5jdGlvbiBkb2VzIG5vdCBtYWludGFpbiBpbnZhcmlhbnQgZigwKVx4M2RceDNkMCBceDI2XHgyNiBmKDEpXHgzZFx4M2QxLiBCYWQgYmVoYXZpb3IgbWF5IHJlc3VsdC4iKTt0aGlzLmVhc2VGbj1kO3JldHVybiB0aGlzfXpvb20oKXtsZXQgZD10aGlzLnhFeHRlbnQoKVswXS52YWx1ZU9mKCksZj10aGlzLnhFeHRlbnQoKVsxXS52YWx1ZU9mKCksZz10aGlzLnlFeHRlbnQoKVsxXS52YWx1ZU9mKCksbD10aGlzLnlFeHRlbnQoKVswXS52YWx1ZU9mKCk7CmQhPT1mJiZnIT09bCYmdGhpcy5pbnRlcnBvbGF0ZVpvb20oZCxmLGcsbCl9dW56b29tKCl7dmFyIGQ9dGhpcy54U2NhbGUoKTtkLl9kb21haW5NaW49bnVsbDtkLl9kb21haW5NYXg9bnVsbDtkPWQuX2dldEV4dGVudCgpO3RoaXMueFNjYWxlKCkuZG9tYWluKGQpO3RoaXMudW56b29tTWV0aG9kKCl9aXNab29taW5nKGQpe3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5lbmFibGVkKCFkKTt0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uLmVuYWJsZWQoIWQpfWludGVycG9sYXRlWm9vbShkLGYsZyxsKXtsZXQgaz10aGlzLnhTY2FsZSgpLmRvbWFpbigpWzBdLnZhbHVlT2YoKSxuPXRoaXMueFNjYWxlKCkuZG9tYWluKClbMV0udmFsdWVPZigpLHA9dGhpcy55U2NhbGUoKS5kb21haW4oKVswXS52YWx1ZU9mKCkscT10aGlzLnlTY2FsZSgpLmRvbWFpbigpWzFdLnZhbHVlT2YoKSxyPXRoaXMuZWFzZUZuLHQ9KHoseCxDKT0+ZDMuaW50ZXJwb2xhdGVOdW1iZXIoeix4KShyKEMpKTt0aGlzLmlzWm9vbWluZyghMCk7CmxldCB2PURhdGUubm93KCkseT0oKT0+e3ZhciB6PURhdGUubm93KCktdjt6PTA9PT10aGlzLl9hbmltYXRpb25UaW1lPzE6TWF0aC5taW4oMSx6L3RoaXMuX2FuaW1hdGlvblRpbWUpO2xldCB4PXQoayxkLHopLEM9dChuLGYseiksRj10KHAsZyx6KSxEPXQocSxsLHopO3RoaXMueFNjYWxlKCkuZG9tYWluKFt4LENdKTt0aGlzLnlTY2FsZSgpLmRvbWFpbihbRixEXSk7MT56P1Bsb3R0YWJsZS5VdGlscy5ET00ucmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGwoeSk6KHRoaXMub25FbmQoKSx0aGlzLmlzWm9vbWluZyghMSkpfTt5KCl9fWEuRHJhZ1pvb21MYXllcj1jfSkoYnB8fChicD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL3Bhblpvb21EcmFnTGF5ZXIuanMKdmFyIGNwOwooZnVuY3Rpb24oYSl7bGV0IGM7KGZ1bmN0aW9uKGYpe2ZbZi5OT05FPTBdPSJOT05FIjtmW2YuRFJBR19aT09NSU5HPTFdPSJEUkFHX1pPT01JTkciO2ZbZi5QQU5OSU5HPTJdPSJQQU5OSU5HIn0pKGN8fChjPXt9KSk7Y2xhc3MgZCBleHRlbmRzIFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3Vwe2NvbnN0cnVjdG9yKGYsZyxsKXtzdXBlcigpO3RoaXMuc3RhdGU9Yy5OT05FO3RoaXMucGFuU3RhcnRDYWxsYmFjaz1uZXcgUGxvdHRhYmxlLlV0aWxzLkNhbGxiYWNrU2V0O3RoaXMucGFuRW5kQ2FsbGJhY2s9bmV3IFBsb3R0YWJsZS5VdGlscy5DYWxsYmFja1NldDt0aGlzLnBhblpvb209bmV3IFBsb3R0YWJsZS5JbnRlcmFjdGlvbnMuUGFuWm9vbShmLGcpO3RoaXMucGFuWm9vbS5kcmFnSW50ZXJhY3Rpb24oKS5tb3VzZUZpbHRlcihuPT5kLmlzUGFuS2V5KG4pJiYwPT09bi5idXR0b24pO3RoaXMucGFuWm9vbS53aGVlbEZpbHRlcih0aGlzLmNhblNjcm9sbFpvb20pO3RoaXMuZHJhZ1pvb21MYXllcj1uZXcgYnAuRHJhZ1pvb21MYXllcihmLApnLGwpO3RoaXMuZHJhZ1pvb21MYXllci5kcmFnSW50ZXJhY3Rpb24oKS5tb3VzZUZpbHRlcihuPT4hZC5pc1BhbktleShuKSYmMD09PW4uYnV0dG9uKTt0aGlzLmFwcGVuZCh0aGlzLmRyYWdab29tTGF5ZXIpO2NvbnN0IGs9dGhpcy5vbldoZWVsLmJpbmQodGhpcyk7dGhpcy5vbkFuY2hvcigoKT0+e3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1QbG90dGFibGUuRGlzcGF0Y2hlcnMuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25XaGVlbChrKTt0aGlzLnBhblpvb20uYXR0YWNoVG8odGhpcyl9KTt0aGlzLm9uRGV0YWNoKCgpPT57dGhpcy5wYW5ab29tLmRldGFjaEZyb20oKTt0aGlzLl9tb3VzZURpc3BhdGNoZXImJih0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmV2hlZWwoayksdGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGwpfSk7dGhpcy5wYW5ab29tLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ1N0YXJ0KCgpPT57dGhpcy5zdGF0ZT09Yy5OT05FJiYKdGhpcy5zZXRTdGF0ZShjLlBBTk5JTkcpfSk7dGhpcy5wYW5ab29tLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ0VuZCgoKT0+e3RoaXMuc3RhdGU9PWMuUEFOTklORyYmdGhpcy5zZXRTdGF0ZShjLk5PTkUpfSk7dGhpcy5kcmFnWm9vbUxheWVyLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ1N0YXJ0KCgpPT57dGhpcy5zdGF0ZT09Yy5OT05FJiZ0aGlzLnNldFN0YXRlKGMuRFJBR19aT09NSU5HKX0pO3RoaXMuZHJhZ1pvb21MYXllci5kcmFnSW50ZXJhY3Rpb24oKS5vbkRyYWdFbmQoKCk9Pnt0aGlzLnN0YXRlPT1jLkRSQUdfWk9PTUlORyYmdGhpcy5zZXRTdGF0ZShjLk5PTkUpfSl9b25XaGVlbChmLGcpe2lmKCF0aGlzLmNhblNjcm9sbFpvb20oZykmJihmPXRoaXMuZWxlbWVudCgpLGYuc2VsZWN0KCIuaGVscCIpLmVtcHR5KCkpKXt2YXIgbD1mLmFwcGVuZCgiZGl2IikuY2xhc3NlZCgiaGVscCIsITApO2wuYXBwZW5kKCJzcGFuIikudGV4dCgiQWx0ICsgU2Nyb2xsIHRvIFpvb20iKTsKbC5vbigiYW5pbWF0aW9uZW5kIiwoKT0+dm9pZCBsLnJlbW92ZSgpKX19c3RhdGljIGlzUGFuS2V5KGYpe3JldHVybiEhZi5hbHRLZXl8fCEhZi5zaGlmdEtleX1jYW5TY3JvbGxab29tKGYpe3JldHVybiBmLmFsdEtleX1zZXRTdGF0ZShmKXtpZih0aGlzLnN0YXRlIT1mKXt2YXIgZz10aGlzLnN0YXRlO3RoaXMuc3RhdGU9Zjt0aGlzLnJvb3QoKS5yZW1vdmVDbGFzcyh0aGlzLnN0YXRlQ2xhc3NOYW1lKGcpKTt0aGlzLnJvb3QoKS5hZGRDbGFzcyh0aGlzLnN0YXRlQ2xhc3NOYW1lKGYpKTtnPT1jLlBBTk5JTkcmJnRoaXMucGFuRW5kQ2FsbGJhY2suY2FsbENhbGxiYWNrcygpO2Y9PWMuUEFOTklORyYmdGhpcy5wYW5TdGFydENhbGxiYWNrLmNhbGxDYWxsYmFja3MoKX19c3RhdGVDbGFzc05hbWUoZil7c3dpdGNoKGYpe2Nhc2UgYy5QQU5OSU5HOnJldHVybiJwYW5uaW5nIjtjYXNlIGMuRFJBR19aT09NSU5HOnJldHVybiJkcmFnLXpvb21pbmciO2RlZmF1bHQ6cmV0dXJuIiJ9fW9uUGFuU3RhcnQoZil7dGhpcy5wYW5TdGFydENhbGxiYWNrLmFkZChmKX1vblBhbkVuZChmKXt0aGlzLnBhbkVuZENhbGxiYWNrLmFkZChmKX1vblNjcm9sbFpvb20oZil7dGhpcy5wYW5ab29tLm9uWm9vbUVuZChmKX1vbkRyYWdab29tU3RhcnQoZil7dGhpcy5kcmFnWm9vbUxheWVyLmludGVyYWN0aW9uU3RhcnQoZil9b25EcmFnWm9vbUVuZChmKXt0aGlzLmRyYWdab29tTGF5ZXIuaW50ZXJhY3Rpb25FbmQoZil9fQphLlBhblpvb21EcmFnTGF5ZXI9ZH0pKGNwfHwoY3A9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0Mi90Zi1zY2FsZS5qcwooZnVuY3Rpb24oYSl7Y2xhc3MgYyBleHRlbmRzIFBsb3R0YWJsZS5RdWFudGl0YXRpdmVTY2FsZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7dGhpcy5faWdub3JlT3V0bGllcj0hMX1zZXRWYWx1ZVByb3ZpZGVyRm9yRG9tYWluKGQpe3RoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW49ZH1pZ25vcmVPdXRsaWVyKGQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIGQ/KHRoaXMuX2lnbm9yZU91dGxpZXI9ZCx0aGlzKTp0aGlzLl9pZ25vcmVPdXRsaWVyfV9nZXRBbGxJbmNsdWRlZFZhbHVlcygpe2NvbnN0IGQ9dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbj90aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluKCk6W107cmV0dXJuIHRoaXMuZXh0ZW50T2ZWYWx1ZXMoZCl9fWEuVGZTY2FsZT1jfSkoY3B8fChjcD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL2xpbmVhci1zY2FsZS5qcwooZnVuY3Rpb24oYSl7Y2xhc3MgYyBleHRlbmRzIFBsb3R0YWJsZS5TY2FsZXMuTGluZWFye2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9pZ25vcmVPdXRsaWVyPSExO3RoaXMucGFkUHJvcG9ydGlvbiguMil9c2V0VmFsdWVQcm92aWRlckZvckRvbWFpbihkKXt0aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluPWR9X25pY2VEb21haW4oZCxmKXtjb25zdCBbZyxsXT1kLGs9bC1nO2Q9MD09PWs/MS4xKk1hdGguYWJzKGcpKzEuMTprKnRoaXMucGFkUHJvcG9ydGlvbigpO3JldHVybiBzdXBlci5fbmljZURvbWFpbihbMDw9ZyYmZzxrPy0uMSpsOmctZCxsK2RdLGYpfV9nZXRVbmJvdW5kZWRFeHRlbnQoZCl7ZD10aGlzLl9nZXRBbGxJbmNsdWRlZFZhbHVlcyhkKTtsZXQgZj10aGlzLl9kZWZhdWx0RXh0ZW50KCk7MCE9PWQubGVuZ3RoJiYoZD1bUGxvdHRhYmxlLlV0aWxzLk1hdGgubWluKGQsZlswXSksUGxvdHRhYmxlLlV0aWxzLk1hdGgubWF4KGQsZlsxXSldLGY9dGhpcy5fbmljZURvbWFpbihkKSk7CnJldHVybiBmfV9nZXRBbGxJbmNsdWRlZFZhbHVlcygpe2NvbnN0IGQ9dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbj90aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluKCk6W107cmV0dXJuIHRoaXMuZXh0ZW50T2ZWYWx1ZXMoZCl9ZXh0ZW50T2ZWYWx1ZXMoZCl7dmFyIGY9ZD1kLmZpbHRlcihnPT5QbG90dGFibGUuVXRpbHMuTWF0aC5pc1ZhbGlkTnVtYmVyKGcpKTtpZih0aGlzLmlnbm9yZU91dGxpZXIoKSl7Zj1kLnNvcnQoKGssbik9Pmstbik7Y29uc3QgZz1kMy5xdWFudGlsZShmLC4wNSksbD1kMy5xdWFudGlsZShmLC45NSk7Zj1kLmZpbHRlcihrPT5rPj1nJiZrPD1sKX1kPWQzLmV4dGVudChmKTtyZXR1cm4gbnVsbD09ZFswXXx8bnVsbD09ZFsxXT9bXTpkfWlnbm9yZU91dGxpZXIoZCl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZD8odGhpcy5faWdub3JlT3V0bGllcj1kLHRoaXMpOnRoaXMuX2lnbm9yZU91dGxpZXJ9fWEuTGluZWFyU2NhbGU9Y30pKGNwfHwoY3A9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0Mi9sb2ctc2NhbGUuanMKKGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoZyl7cmV0dXJuIE1hdGgubG9nMTAoZyl9ZnVuY3Rpb24gZChnKXtyZXR1cm4gTWF0aC5wb3coMTAsZyl9YS5NSU5fUE9TSVRJVkVfVkFMVUU9TWF0aC5wb3coMiwtMTA3NCk7Y2xhc3MgZiBleHRlbmRzIGEuVGZTY2FsZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy5fZDNMb2dTY2FsZT1kMy5zY2FsZUxvZygpO3RoaXMucGFkUHJvcG9ydGlvbiguMil9c2NhbGUoZyl7cmV0dXJuIDA+PWc/TmFOOnRoaXMuX2QzTG9nU2NhbGUoZyl9aW52ZXJ0KGcpe3JldHVybiB0aGlzLl9kM0xvZ1NjYWxlLmludmVydChnKX1zY2FsZVRyYW5zZm9ybWF0aW9uKGcpe3JldHVybiB0aGlzLnNjYWxlKGcpfWludmVydGVkVHJhbnNmb3JtYXRpb24oZyl7cmV0dXJuIHRoaXMuaW52ZXJ0KGcpfWdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCl7cmV0dXJuIHRoaXMuZG9tYWluKCl9X2dldERvbWFpbigpe3JldHVybiB0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWlufV9zZXREb21haW4oZyl7dGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbj0KZztjb25zdCBbbCxrXT1nO3N1cGVyLl9zZXREb21haW4oW01hdGgubWF4KGEuTUlOX1BPU0lUSVZFX1ZBTFVFLGwpLGtdKX1fbmljZURvbWFpbihnKXtjb25zdCBbbCxrXT1nO2c9TWF0aC5tYXgoYyhhLk1JTl9QT1NJVElWRV9WQUxVRSksYyhsKSk7Y29uc3Qgbj1jKGspO3ZhciBwPW4tZztwPXA/cCp0aGlzLnBhZFByb3BvcnRpb24oKToxO3JldHVybltkKE1hdGgubWF4KGMoYS5NSU5fUE9TSVRJVkVfVkFMVUUpLGctcCkpLGQobitwKV19X2dldFVuYm91bmRlZEV4dGVudChnKXtnPXRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKGcpO2xldCBsPXRoaXMuX2RlZmF1bHRFeHRlbnQoKTswIT09Zy5sZW5ndGgmJihnPVtQbG90dGFibGUuVXRpbHMuTWF0aC5taW4oZyxsWzBdKSxQbG90dGFibGUuVXRpbHMuTWF0aC5tYXgoZyxsWzFdKV0sbD10aGlzLl9uaWNlRG9tYWluKGcpKTtyZXR1cm4gbH1fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKXtyZXR1cm4gc3VwZXIuX2dldEFsbEluY2x1ZGVkVmFsdWVzKCkubWFwKGc9PgowPGc/ZzphLk1JTl9QT1NJVElWRV9WQUxVRSl9X2RlZmF1bHRFeHRlbnQoKXtyZXR1cm5bMSwxMF19X2JhY2tpbmdTY2FsZURvbWFpbihnKXtpZihudWxsPT1nKXJldHVybiB0aGlzLl9kM0xvZ1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzTG9nU2NhbGUuZG9tYWluKGcpO3JldHVybiB0aGlzfV9nZXRSYW5nZSgpe3JldHVybiB0aGlzLl9kM0xvZ1NjYWxlLnJhbmdlKCl9X3NldFJhbmdlKGcpe3RoaXMuX2QzTG9nU2NhbGUucmFuZ2UoZyl9ZGVmYXVsdFRpY2tzKCl7cmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUudGlja3MoKX10aWNrcygpe3JldHVybiB0aGlzLl9kM0xvZ1NjYWxlLnRpY2tzKCl9ZXh0ZW50T2ZWYWx1ZXMoZyl7bGV0IGw9Zz1nLmZpbHRlcihrPT5QbG90dGFibGUuVXRpbHMuTWF0aC5pc1ZhbGlkTnVtYmVyKGspJiYwPGspO2lmKHRoaXMuaWdub3JlT3V0bGllcigpKXtnPWcubWFwKGMpLnNvcnQoKHAscSk9PnAtcSk7Y29uc3Qgaz1kMy5xdWFudGlsZShnLC4wNSksbj1kMy5xdWFudGlsZShnLAouOTUpO2w9Zy5maWx0ZXIocD0+cD49ayYmcDw9bikubWFwKGQpfWc9ZDMuZXh0ZW50KGwpO3JldHVybiBudWxsPT1nWzBdfHxudWxsPT1nWzFdP1tdOmd9fWEuTG9nU2NhbGU9Zn0pKGNwfHwoY3A9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0Mi9saW5lLWNoYXJ0LmpzCihmdW5jdGlvbihhKXtsZXQgYzsoZnVuY3Rpb24oZyl7Z1tnLlRFWFQ9MF09IlRFWFQiO2dbZy5ET009MV09IkRPTSJ9KShjfHwoYz17fSkpO2xldCBkOyhmdW5jdGlvbihnKXtnLkxPRz0ibG9nIjtnLkxJTkVBUj0ibGluZWFyIn0pKGR8fChkPXt9KSk7Y2xhc3MgZntjb25zdHJ1Y3RvcihnLGwsayxuLHAscSxyLHQsdix5LHope3RoaXMuc2VyaWVzTmFtZXM9W107dGhpcy5uYW1lMmRhdGFzZXRzPXt9O3RoaXMuY29sb3JTY2FsZT1uO3RoaXMudG9vbHRpcD1wO3RoaXMuZGF0YXNldHM9W107dGhpcy5faWdub3JlWU91dGxpZXJzPSExO3RoaXMubGFzdFBvaW50c0RhdGFzZXQ9bmV3IFBsb3R0YWJsZS5EYXRhc2V0O3RoaXMubmFuRGF0YXNldD1uZXcgUGxvdHRhYmxlLkRhdGFzZXQ7dGhpcy55VmFsdWVBY2Nlc3Nvcj1sO3RoaXMuc3ltYm9sRnVuY3Rpb249eTt0aGlzLm9uRGF0YXNldENoYW5nZWQ9dGhpcy5fb25EYXRhc2V0Q2hhbmdlZC5iaW5kKHRoaXMpO3RoaXMuX2RlZmF1bHRYUmFuZ2U9CnQ7dGhpcy5fZGVmYXVsdFlSYW5nZT12O3RoaXMudG9vbHRpcENvbHVtbnM9cTt0aGlzLmJ1aWxkQ2hhcnQoZyxsLGsscix6KX1idWlsZENoYXJ0KGcsbCxrLG4scCl7dGhpcy5kZXN0cm95KCk7Zz1nKCk7dGhpcy54QWNjZXNzb3I9Zy5hY2Nlc3Nvcjt0aGlzLnhTY2FsZT1nLnNjYWxlO3RoaXMueEF4aXM9Zy5heGlzO3RoaXMueEF4aXMubWFyZ2luKDApLnRpY2tMYWJlbFBhZGRpbmcoMyk7cCYmdGhpcy54QXhpcy5mb3JtYXR0ZXIocCk7dGhpcy55U2NhbGU9Zi5nZXRZU2NhbGVGcm9tVHlwZShrKTt0aGlzLnlTY2FsZS5zZXRWYWx1ZVByb3ZpZGVyRm9yRG9tYWluKCgpPT50aGlzLmdldFZhbHVlc0ZvcllBeGlzRG9tYWluQ29tcHV0ZSgpKTt0aGlzLnlBeGlzPW5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKHRoaXMueVNjYWxlLCJsZWZ0Iik7cD0kby5tdWx0aXNjYWxlRm9ybWF0dGVyKCRvLllfQVhJU19GT1JNQVRURVJfUFJFQ0lTSU9OKTt0aGlzLnlBeGlzLm1hcmdpbigwKS50aWNrTGFiZWxQYWRkaW5nKDUpLmZvcm1hdHRlcihwKTsKdGhpcy55QXhpcy51c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbigpO3RoaXMuZmlsbEFyZWE9bjtwPW5ldyBhLlBhblpvb21EcmFnTGF5ZXIodGhpcy54U2NhbGUsdGhpcy55U2NhbGUsKCk9PnRoaXMucmVzZXREb21haW4oKSk7dGhpcy50b29sdGlwSW50ZXJhY3Rpb249dGhpcy5jcmVhdGVUb29sdGlwSW50ZXJhY3Rpb24ocCk7dGhpcy50b29sdGlwUG9pbnRzQ29tcG9uZW50PW5ldyBQbG90dGFibGUuQ29tcG9uZW50O249dGhpcy5idWlsZFBsb3QodGhpcy54U2NhbGUsdGhpcy55U2NhbGUsbik7dGhpcy5ncmlkbGluZXM9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyaWRsaW5lcyh0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSk7Zz1udWxsO2shPT1kLkxPRyYmKGc9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkd1aWRlTGluZUxheWVyKCJob3Jpem9udGFsIiksZy5zY2FsZSh0aGlzLnlTY2FsZSkudmFsdWUoMCkpO2s9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkd1aWRlTGluZUxheWVyKCJ2ZXJ0aWNhbCIpOwprLnNjYWxlKHRoaXMueFNjYWxlKS52YWx1ZSgwKTt0aGlzLmNlbnRlcj1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JvdXAoW3RoaXMuZ3JpZGxpbmVzLGcsayxuLHRoaXMudG9vbHRpcFBvaW50c0NvbXBvbmVudCxwXSk7dGhpcy5jZW50ZXIuYWRkQ2xhc3MoIm1haW4iKTt0aGlzLm91dGVyPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5UYWJsZShbW3RoaXMueUF4aXMsdGhpcy5jZW50ZXJdLFtudWxsLHRoaXMueEF4aXNdXSl9YnVpbGRQbG90KGcsbCxrKXtrJiYodGhpcy5tYXJnaW5BcmVhUGxvdD1uZXcgUGxvdHRhYmxlLlBsb3RzLkFyZWEsdGhpcy5tYXJnaW5BcmVhUGxvdC54KHRoaXMueEFjY2Vzc29yLGcpLHRoaXMubWFyZ2luQXJlYVBsb3QueShrLmhpZ2hlckFjY2Vzc29yLGwpLHRoaXMubWFyZ2luQXJlYVBsb3QueTAoay5sb3dlckFjY2Vzc29yKSx0aGlzLm1hcmdpbkFyZWFQbG90LmF0dHIoImZpbGwiLChyLHQsdik9PnRoaXMuY29sb3JTY2FsZS5zY2FsZSh2Lm1ldGFkYXRhKCkubmFtZSkpLAp0aGlzLm1hcmdpbkFyZWFQbG90LmF0dHIoImZpbGwtb3BhY2l0eSIsLjMpLHRoaXMubWFyZ2luQXJlYVBsb3QuYXR0cigic3Ryb2tlLXdpZHRoIiwwKSk7dGhpcy5zbW9vdGhlZEFjY2Vzc29yPXI9PnIuc21vb3RoZWQ7az1uZXcgUGxvdHRhYmxlLlBsb3RzLkxpbmU7ay54KHRoaXMueEFjY2Vzc29yLGcpO2sueSh0aGlzLnlWYWx1ZUFjY2Vzc29yLGwpO2suYXR0cigic3Ryb2tlIiwocix0LHYpPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUodi5tZXRhZGF0YSgpLm5hbWUpKTt0aGlzLmxpbmVQbG90PWs7dGhpcy5zZXR1cFRvb2x0aXBzKGspO2xldCBuPW5ldyBQbG90dGFibGUuUGxvdHMuTGluZTtuLngodGhpcy54QWNjZXNzb3IsZyk7bi55KHRoaXMuc21vb3RoZWRBY2Nlc3NvcixsKTtuLmF0dHIoInN0cm9rZSIsKHIsdCx2KT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHYubWV0YWRhdGEoKS5uYW1lKSk7dGhpcy5zbW9vdGhMaW5lUGxvdD1uO2lmKHRoaXMuc3ltYm9sRnVuY3Rpb24pe3ZhciBwPQpuZXcgUGxvdHRhYmxlLlBsb3RzLlNjYXR0ZXI7cC54KHRoaXMueEFjY2Vzc29yLGcpO3AueSh0aGlzLnlWYWx1ZUFjY2Vzc29yLGwpO3AuYXR0cigiZmlsbCIsKHIsdCx2KT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHYubWV0YWRhdGEoKS5uYW1lKSk7cC5hdHRyKCJvcGFjaXR5IiwxKTtwLnNpemUoMiokby5UT09MVElQX0NJUkNMRV9TSVpFKTtwLnN5bWJvbCgocix0LHYpPT50aGlzLnN5bWJvbEZ1bmN0aW9uKHYubWV0YWRhdGEoKS5uYW1lKSk7dGhpcy5tYXJrZXJzU2NhdHRlclBsb3Q9cH1wPW5ldyBQbG90dGFibGUuUGxvdHMuU2NhdHRlcjtwLngodGhpcy54QWNjZXNzb3IsZyk7cC55KHRoaXMueVZhbHVlQWNjZXNzb3IsbCk7cC5hdHRyKCJmaWxsIixyPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUoci5uYW1lKSk7cC5hdHRyKCJvcGFjaXR5IiwxKTtwLnNpemUoMiokby5UT09MVElQX0NJUkNMRV9TSVpFKTtwLmRhdGFzZXRzKFt0aGlzLmxhc3RQb2ludHNEYXRhc2V0XSk7dGhpcy5zY2F0dGVyUGxvdD0KcDtsZXQgcT1uZXcgUGxvdHRhYmxlLlBsb3RzLlNjYXR0ZXI7cS54KHRoaXMueEFjY2Vzc29yLGcpO3EueShyPT5yLmRpc3BsYXlZLGwpO3EuYXR0cigiZmlsbCIscj0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHIubmFtZSkpO3EuYXR0cigib3BhY2l0eSIsMSk7cS5zaXplKDIqJG8uTkFOX1NZTUJPTF9TSVpFKTtxLmRhdGFzZXRzKFt0aGlzLm5hbkRhdGFzZXRdKTtxLnN5bWJvbChQbG90dGFibGUuU3ltYm9sRmFjdG9yaWVzLnRyaWFuZ2xlKTt0aGlzLm5hbkRpc3BsYXk9cTtnPVtxLHAsbixrXTt0aGlzLm1hcmdpbkFyZWFQbG90JiZnLnB1c2godGhpcy5tYXJnaW5BcmVhUGxvdCk7dGhpcy5tYXJrZXJzU2NhdHRlclBsb3QmJmcucHVzaCh0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdCk7cmV0dXJuIG5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5Hcm91cChnKX1fb25EYXRhc2V0Q2hhbmdlZChnKXt0aGlzLnNtb290aGluZ0VuYWJsZWQmJnRoaXMucmVzbW9vdGhEYXRhc2V0KGcpO3RoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCl9aWdub3JlWU91dGxpZXJzKGcpe2chPT0KdGhpcy5faWdub3JlWU91dGxpZXJzJiYodGhpcy5faWdub3JlWU91dGxpZXJzPWcsdGhpcy51cGRhdGVTcGVjaWFsRGF0YXNldHMoKSx0aGlzLnlTY2FsZS5pZ25vcmVPdXRsaWVyKGcpLHRoaXMucmVzZXRZRG9tYWluKCkpfWdldFZhbHVlc0ZvcllBeGlzRG9tYWluQ29tcHV0ZSgpe2NvbnN0IGc9dGhpcy5nZXRBY2Nlc3NvcnNGb3JDb21wdXRpbmdZUmFuZ2UoKTtyZXR1cm4gXy5mbGF0dGVuRGVlcCh0aGlzLmRhdGFzZXRzLm1hcChsPT5nLm1hcChrPT5sLmRhdGEoKS5tYXAobj0+ayhuLC0xLGwpKSkpKS5maWx0ZXIoaXNGaW5pdGUpfXVwZGF0ZVNwZWNpYWxEYXRhc2V0cygpe2NvbnN0IGc9dGhpcy5nZXRZQXhpc0FjY2Vzc29yKCk7dmFyIGw9dGhpcy5kYXRhc2V0cy5tYXAoaz0+e2xldCBuPW51bGwscD1rLmRhdGEoKS5maWx0ZXIocT0+IWlzTmFOKGcocSwtMSxrKSkpOzA8cC5sZW5ndGgmJihuPXBbcC5sZW5ndGgtMV0sbi5uYW1lPWsubWV0YWRhdGEoKS5uYW1lLG4ucmVsYXRpdmU9CiRvLnJlbGF0aXZlQWNjZXNzb3IobiwtMSxrKSk7cmV0dXJuIG59KS5maWx0ZXIoaz0+bnVsbCE9ayk7dGhpcy5sYXN0UG9pbnRzRGF0YXNldC5kYXRhKGwpO3RoaXMubWFya2Vyc1NjYXR0ZXJQbG90JiZ0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzLm1hcCh0aGlzLmNyZWF0ZVNhbXBsZWREYXRhc2V0Rm9yTWFya2VycykpO2w9Xy5mbGF0dGVuKHRoaXMuZGF0YXNldHMubWFwKGs9PntsZXQgbj1udWxsLHA9ay5kYXRhKCkscT0wO2Zvcig7cTxwLmxlbmd0aCYmbnVsbD09bjspaXNOYU4oZyhwW3FdLC0xLGspKXx8KG49ZyhwW3FdLC0xLGspKSxxKys7bnVsbD09biYmKG49MCk7bGV0IHI9W107Zm9yKHE9MDtxPHAubGVuZ3RoO3ErKylpc05hTihnKHBbcV0sLTEsaykpPyhwW3FdLm5hbWU9ay5tZXRhZGF0YSgpLm5hbWUscFtxXS5kaXNwbGF5WT1uLHBbcV0ucmVsYXRpdmU9JG8ucmVsYXRpdmVBY2Nlc3NvcihwW3FdLC0xLGspLHIucHVzaChwW3FdKSk6Cm49ZyhwW3FdLC0xLGspO3JldHVybiByfSkpO3RoaXMubmFuRGF0YXNldC5kYXRhKGwpfXJlc2V0RG9tYWluKCl7dGhpcy5yZXNldFhEb21haW4oKTt0aGlzLnJlc2V0WURvbWFpbigpfXJlc2V0WERvbWFpbigpe2lmKG51bGwhPXRoaXMuX2RlZmF1bHRYUmFuZ2UpdmFyIGc9dGhpcy5fZGVmYXVsdFhSYW5nZTtlbHNlIGc9dGhpcy54U2NhbGUsZy5fZG9tYWluTWluPW51bGwsZy5fZG9tYWluTWF4PW51bGwsZz1nLl9nZXRFeHRlbnQoKTt0aGlzLnhTY2FsZS5kb21haW4oZyl9cmVzZXRZRG9tYWluKCl7bnVsbCE9dGhpcy5fZGVmYXVsdFlSYW5nZT90aGlzLnlTY2FsZS5kb21haW4odGhpcy5fZGVmYXVsdFlSYW5nZSk6KHRoaXMueVNjYWxlLmF1dG9Eb21haW4oKSx0aGlzLnlTY2FsZS5kb21haW4odGhpcy55U2NhbGUuZG9tYWluKCkpKX1nZXRBY2Nlc3NvcnNGb3JDb21wdXRpbmdZUmFuZ2UoKXtjb25zdCBnPVt0aGlzLmdldFlBeGlzQWNjZXNzb3IoKV07dGhpcy5maWxsQXJlYSYmZy5wdXNoKHRoaXMuZmlsbEFyZWEubG93ZXJBY2Nlc3NvciwKdGhpcy5maWxsQXJlYS5oaWdoZXJBY2Nlc3Nvcik7cmV0dXJuIGd9Z2V0WUF4aXNBY2Nlc3Nvcigpe3JldHVybiB0aGlzLnNtb290aGluZ0VuYWJsZWQ/dGhpcy5zbW9vdGhlZEFjY2Vzc29yOnRoaXMueVZhbHVlQWNjZXNzb3J9Y3JlYXRlVG9vbHRpcEludGVyYWN0aW9uKGcpe2NvbnN0IGw9bmV3ICRvLlBvaW50ZXJJbnRlcmFjdGlvbixrPSgpPT57bC5lbmFibGVkKCExKTt0aGlzLmhpZGVUb29sdGlwcygpfSxuPSgpPT5sLmVuYWJsZWQoITApO2cub25QYW5TdGFydChrKTtnLm9uRHJhZ1pvb21TdGFydChrKTtnLm9uUGFuRW5kKG4pO2cub25EcmFnWm9vbUVuZChuKTtnLm9uU2Nyb2xsWm9vbSgoKT0+dGhpcy51cGRhdGVUb29sdGlwQ29udGVudCh0aGlzLl9sYXN0TW91c2VQb3NpdGlvbikpO2wub25Qb2ludGVyTW92ZShwPT57dGhpcy5fbGFzdE1vdXNlUG9zaXRpb249cDt0aGlzLnVwZGF0ZVRvb2x0aXBDb250ZW50KHApfSk7bC5vblBvaW50ZXJFeGl0KCgpPT50aGlzLmhpZGVUb29sdGlwcygpKTsKcmV0dXJuIGx9dXBkYXRlVG9vbHRpcENvbnRlbnQoZyl7dGhpcy5saW5lUGxvdCYmKHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl90b29sdGlwVXBkYXRlQW5pbWF0aW9uRnJhbWUpLHRoaXMuX3Rvb2x0aXBVcGRhdGVBbmltYXRpb25GcmFtZT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57bGV0IGw9e3g6Zy54LHk6Zy55LGRhdHVtOm51bGwsZGF0YXNldDpudWxsfSxrPXRoaXMuZ3JpZGxpbmVzLmNvbnRlbnQoKS5ub2RlKCkuZ2V0QkJveCgpO3ZhciBuPXRoaXMubGluZVBsb3QuZGF0YXNldHMoKS5tYXAodD0+dGhpcy5maW5kQ2xvc2VzdFBvaW50KGwsdCkpLmZpbHRlcihCb29sZWFuKTtsZXQgcD1QbG90dGFibGUuVXRpbHMuRE9NLmludGVyc2VjdHNCQm94LHE9bi5maWx0ZXIodD0+cCh0LngsdC55LGspfHxpc05hTih0aGlzLnlWYWx1ZUFjY2Vzc29yKHQuZGF0dW0sMCx0LmRhdGFzZXQpKSkscj1xLmZpbHRlcih0PT4haXNOYU4odGhpcy55VmFsdWVBY2Nlc3Nvcih0LmRhdHVtLAowLHQuZGF0YXNldCkpKTswIT09bi5sZW5ndGg/KHRoaXMuc2NhdHRlclBsb3QuYXR0cigiZGlzcGxheSIsIm5vbmUiKSxuPXRoaXMudG9vbHRpcFBvaW50c0NvbXBvbmVudC5jb250ZW50KCkuc2VsZWN0QWxsKCIucG9pbnQiKS5kYXRhKHIsdD0+dC5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSksbi5lbnRlcigpLmFwcGVuZCgiY2lyY2xlIikuY2xhc3NlZCgicG9pbnQiLCEwKSxuLmF0dHIoInIiLCRvLlRPT0xUSVBfQ0lSQ0xFX1NJWkUpLmF0dHIoImN4Iix0PT50LngpLmF0dHIoImN5Iix0PT50LnkpLnN0eWxlKCJzdHJva2UiLCJub25lIikuYXR0cigiZmlsbCIsdD0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHQuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUpKSxuLmV4aXQoKS5yZW1vdmUoKSx0aGlzLmRyYXdUb29sdGlwcyhxLGwsdGhpcy50b29sdGlwQ29sdW1ucykpOnRoaXMuaGlkZVRvb2x0aXBzKCl9KSl9aGlkZVRvb2x0aXBzKCl7d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3Rvb2x0aXBVcGRhdGVBbmltYXRpb25GcmFtZSk7CnRoaXMudG9vbHRpcC5oaWRlKCk7dGhpcy5zY2F0dGVyUGxvdC5hdHRyKCJkaXNwbGF5IiwiYmxvY2siKTt0aGlzLnRvb2x0aXBQb2ludHNDb21wb25lbnQuY29udGVudCgpLnNlbGVjdEFsbCgiLnBvaW50IikucmVtb3ZlKCl9c2V0dXBUb29sdGlwcyhnKXtnLm9uRGV0YWNoKCgpPT57dGhpcy50b29sdGlwSW50ZXJhY3Rpb24uZGV0YWNoRnJvbSgpO3RoaXMudG9vbHRpcEludGVyYWN0aW9uLmVuYWJsZWQoITEpfSk7Zy5vbkFuY2hvcigoKT0+e3RoaXMudG9vbHRpcEludGVyYWN0aW9uLmF0dGFjaFRvKGcpO3RoaXMudG9vbHRpcEludGVyYWN0aW9uLmVuYWJsZWQoITApfSl9ZHJhd1Rvb2x0aXBzKGcsbCxrKXtpZihnLmxlbmd0aCl7dmFyIHtjb2xvclNjYWxlOm59PXRoaXM7az1be3RpdGxlOiIiLHN0YXRpYzohMSxldmFsVHlwZTpjLkRPTSxldmFsdWF0ZSh6KXtkMy5zZWxlY3QodGhpcykuc2VsZWN0KCJzcGFuIikuc3R5bGUoImJhY2tncm91bmQtY29sb3IiLCgpPT5uLnNjYWxlKHouZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUpKTsKcmV0dXJuIiJ9LGVudGVyKHope2QzLnNlbGVjdCh0aGlzKS5hcHBlbmQoInNwYW4iKS5jbGFzc2VkKCJzd2F0Y2giLCEwKS5zdHlsZSgiYmFja2dyb3VuZC1jb2xvciIsKCk9Pm4uc2NhbGUoei5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSkpfX0sLi4ua107dmFyIHA9ej0+TWF0aC5wb3coei54LWwueCwyKStNYXRoLnBvdyh6LnktbC55LDIpLHE9Xy5taW4oZy5tYXAocCkpLHI9dGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuc21vb3RoZWRBY2Nlc3Nvcjp0aGlzLnlWYWx1ZUFjY2Vzc29yO2c9ImFzY2VuZGluZyI9PT10aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kP18uc29ydEJ5KGcsej0+cih6LmRhdHVtLC0xLHouZGF0YXNldCkpOiJkZXNjZW5kaW5nIj09PXRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2Q/Xy5zb3J0QnkoZyx6PT5yKHouZGF0dW0sLTEsei5kYXRhc2V0KSkucmV2ZXJzZSgpOiJuZWFyZXN0Ij09PXRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2Q/Xy5zb3J0QnkoZyxwKTpnLnNsaWNlKDApLnJldmVyc2UoKTsKdmFyIHQ9dGhpcyx2PWQzLnNlbGVjdCh0aGlzLnRvb2x0aXAuY29udGVudCgpKS5zZWxlY3QoInRhYmxlIikseT12LnNlbGVjdCgidGhlYWQiKS5zZWxlY3RBbGwoInRoIikuZGF0YShrLHo9PnoudGl0bGUpO3kuZW50ZXIoKS5hcHBlbmQoInRoIikudGV4dCh6PT56LnRpdGxlKS5ub2RlcygpO3kuZXhpdCgpLnJlbW92ZSgpO2c9di5zZWxlY3QoInRib2R5Iikuc2VsZWN0QWxsKCJ0ciIpLmRhdGEoZyx6PT56LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKTtnLmNsYXNzZWQoImRpc3RhbnQiLHo9Pnt2YXIgeD16LmRhdGFzZXQuZGF0YSgpWzBdLEM9Xy5sYXN0KHouZGF0YXNldC5kYXRhKCkpO3g9dGhpcy54U2NhbGUuc2NhbGUodGhpcy54QWNjZXNzb3IoeCwwLHouZGF0YXNldCkpO0M9dGhpcy54U2NhbGUuc2NhbGUodGhpcy54QWNjZXNzb3IoQywwLHouZGF0YXNldCkpO3o9dGhpcy5zbW9vdGhpbmdFbmFibGVkP3ouZGF0dW0uc21vb3RoZWQ6dGhpcy55VmFsdWVBY2Nlc3Nvcih6LmRhdHVtLAowLHouZGF0YXNldCk7cmV0dXJuIGwueDx4fHxsLng+Q3x8aXNOYU4oeil9KS5jbGFzc2VkKCJjbG9zZXN0Iix6PT5wKHopPT09cSkuZWFjaChmdW5jdGlvbih6KXt0LmRyYXdUb29sdGlwUm93KHRoaXMsayx6KX0pLm9yZGVyKCk7Zy5leGl0KCkucmVtb3ZlKCk7Zy5lbnRlcigpLmFwcGVuZCgidHIiKS5lYWNoKGZ1bmN0aW9uKHope3QuZHJhd1Rvb2x0aXBSb3codGhpcyxrLHopfSkubm9kZXMoKTt0aGlzLnRvb2x0aXAudXBkYXRlQW5kUG9zaXRpb24odGhpcy50YXJnZXRTVkcubm9kZSgpKX1lbHNlIHRoaXMudG9vbHRpcC5oaWRlKCl9ZHJhd1Rvb2x0aXBSb3coZyxsLGspe2NvbnN0IG49dGhpcztnPWQzLnNlbGVjdChnKS5zZWxlY3RBbGwoInRkIikuZGF0YShsKTtnLmVhY2goZnVuY3Rpb24ocCl7cC5zdGF0aWN8fG4uZHJhd1Rvb2x0aXBDb2x1bW4uY2FsbChuLHRoaXMscCxrKX0pO2cuZW50ZXIoKS5hcHBlbmQoInRkIikuZWFjaChmdW5jdGlvbihwKXtwLmVudGVyJiZwLmVudGVyLmNhbGwodGhpcywKayk7bi5kcmF3VG9vbHRpcENvbHVtbi5jYWxsKG4sdGhpcyxwLGspfSl9ZHJhd1Rvb2x0aXBDb2x1bW4oZyxsLGspe2NvbnN0IHtzbW9vdGhpbmdFbmFibGVkOm59PXRoaXM7bC5ldmFsVHlwZT09Yy5ET00/bC5ldmFsdWF0ZS5jYWxsKGcsayx7c21vb3RoaW5nRW5hYmxlZDpufSk6ZDMuc2VsZWN0KGcpLnRleHQobC5ldmFsdWF0ZS5jYWxsKGcsayx7c21vb3RoaW5nRW5hYmxlZDpufSkpfWZpbmRDbG9zZXN0UG9pbnQoZyxsKXtjb25zdCBrPWwuZGF0YSgpLm1hcCgocSxyKT0+dGhpcy54U2NhbGUuc2NhbGUodGhpcy54QWNjZXNzb3IocSxyLGwpKSk7bGV0IG49Xy5zb3J0ZWRJbmRleChrLGcueCk7aWYoMD09ay5sZW5ndGgpcmV0dXJuIG51bGw7bj09PWsubGVuZ3RoPy0tbjowIT09biYmKG49TWF0aC5hYnMoa1tuLTFdLWcueCk8TWF0aC5hYnMoa1tuXS1nLngpP24tMTpuKTtnPWwuZGF0YSgpW25dO2NvbnN0IHA9dGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuc21vb3RoZWRBY2Nlc3NvcihnLApuLGwpOnRoaXMueVZhbHVlQWNjZXNzb3IoZyxuLGwpO3JldHVybnt4Omtbbl0seTp0aGlzLnlTY2FsZS5zY2FsZShwKSxkYXR1bTpnLGRhdGFzZXQ6bH19cmVzbW9vdGhEYXRhc2V0KGcpe2xldCBsPWcuZGF0YSgpO2NvbnN0IGs9dGhpcy5zbW9vdGhpbmdXZWlnaHQ7bGV0IG49MDxsLmxlbmd0aD8wOk5hTixwPTA7Y29uc3QgcT1sLm1hcCgodCx2KT0+dGhpcy55VmFsdWVBY2Nlc3Nvcih0LHYsZykpLHI9cS5ldmVyeSh0PT50PT1xWzBdKTtsLmZvckVhY2goKHQsdik9Pnt2PXFbdl07cnx8IU51bWJlci5pc0Zpbml0ZSh2KT90LnNtb290aGVkPXY6KG49biprKygxLWspKnYscCsrLHY9MSwxIT09ayYmKHY9MS1NYXRoLnBvdyhrLHApKSx0LnNtb290aGVkPW4vdil9KX1nZXREYXRhc2V0KGcpe3ZvaWQgMD09PXRoaXMubmFtZTJkYXRhc2V0c1tnXSYmKHRoaXMubmFtZTJkYXRhc2V0c1tnXT1uZXcgUGxvdHRhYmxlLkRhdGFzZXQoW10se25hbWU6ZyxtZXRhOm51bGx9KSk7cmV0dXJuIHRoaXMubmFtZTJkYXRhc2V0c1tnXX1zdGF0aWMgZ2V0WVNjYWxlRnJvbVR5cGUoZyl7aWYoZz09PQpkLkxPRylyZXR1cm4gbmV3IGEuTG9nU2NhbGU7aWYoZz09PWQuTElORUFSKXJldHVybiBuZXcgYS5MaW5lYXJTY2FsZTt0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIHlTY2FsZSB0eXBlICIrZyk7fXNldFZpc2libGVTZXJpZXMoZyl7dGhpcy5zZXJpZXNOYW1lcz1nPWcuc29ydCgpO2cucmV2ZXJzZSgpO3RoaXMuZGF0YXNldHMuZm9yRWFjaChsPT5sLm9mZlVwZGF0ZSh0aGlzLm9uRGF0YXNldENoYW5nZWQpKTt0aGlzLmRhdGFzZXRzPWcubWFwKGw9PnRoaXMuZ2V0RGF0YXNldChsKSk7dGhpcy5kYXRhc2V0cy5mb3JFYWNoKGw9Pmwub25VcGRhdGUodGhpcy5vbkRhdGFzZXRDaGFuZ2VkKSk7dGhpcy5saW5lUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKTt0aGlzLnNtb290aGluZ0VuYWJsZWQmJnRoaXMuc21vb3RoTGluZVBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cyk7dGhpcy5tYXJnaW5BcmVhUGxvdCYmdGhpcy5tYXJnaW5BcmVhUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKTsKdGhpcy51cGRhdGVTcGVjaWFsRGF0YXNldHMoKX1jcmVhdGVTYW1wbGVkRGF0YXNldEZvck1hcmtlcnMoZyl7Y29uc3QgbD1nLmRhdGEoKTtpZigyMD49bC5sZW5ndGgpcmV0dXJuIGc7Y29uc3Qgaz1NYXRoLmNlaWwobC5sZW5ndGgvMjApLG49QXJyYXkoTWF0aC5mbG9vcihsLmxlbmd0aC9rKSk7Zm9yKGxldCBwPTAscT0wO3A8bi5sZW5ndGg7cCsrLHErPWspbltwXT1sW3FdO3JldHVybiBuZXcgUGxvdHRhYmxlLkRhdGFzZXQobixnLm1ldGFkYXRhKCkpfXNldFNlcmllc0RhdGEoZyxsKXt0aGlzLmdldERhdGFzZXQoZykuZGF0YShsKTt0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKX1zZXRTZXJpZXNNZXRhZGF0YShnLGwpe2w9T2JqZWN0LmFzc2lnbih7fSx0aGlzLmdldERhdGFzZXQoZykubWV0YWRhdGEoKSx7bWV0YTpsfSk7dGhpcy5nZXREYXRhc2V0KGcpLm1ldGFkYXRhKGwpfXNtb290aGluZ1VwZGF0ZShnKXt0aGlzLnNtb290aGluZ1dlaWdodD0KZzt0aGlzLmRhdGFzZXRzLmZvckVhY2gobD0+dGhpcy5yZXNtb290aERhdGFzZXQobCkpO3RoaXMuc21vb3RoaW5nRW5hYmxlZHx8KHRoaXMubGluZVBsb3QuYWRkQ2xhc3MoImdob3N0IiksdGhpcy5zY2F0dGVyUGxvdC55KHRoaXMuc21vb3RoZWRBY2Nlc3Nvcix0aGlzLnlTY2FsZSksdGhpcy5zbW9vdGhpbmdFbmFibGVkPSEwLHRoaXMuc21vb3RoTGluZVBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cykpO3RoaXMubWFya2Vyc1NjYXR0ZXJQbG90JiZ0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdC55KHRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpLHRoaXMueVNjYWxlKTt0aGlzLnVwZGF0ZVNwZWNpYWxEYXRhc2V0cygpfXNtb290aGluZ0Rpc2FibGUoKXt0aGlzLnNtb290aGluZ0VuYWJsZWQmJih0aGlzLmxpbmVQbG90LnJlbW92ZUNsYXNzKCJnaG9zdCIpLHRoaXMuc2NhdHRlclBsb3QueSh0aGlzLnlWYWx1ZUFjY2Vzc29yLHRoaXMueVNjYWxlKSx0aGlzLnNtb290aExpbmVQbG90LmRhdGFzZXRzKFtdKSwKdGhpcy5zbW9vdGhpbmdFbmFibGVkPSExLHRoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCkpO3RoaXMubWFya2Vyc1NjYXR0ZXJQbG90JiZ0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdC55KHRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpLHRoaXMueVNjYWxlKX1zZXRUb29sdGlwU29ydGluZ01ldGhvZChnKXt0aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kPWd9cmVuZGVyVG8oZyl7dGhpcy50YXJnZXRTVkc9Zzt0aGlzLm91dGVyLnJlbmRlclRvKGcpO251bGwhPXRoaXMuX2RlZmF1bHRYUmFuZ2UmJnRoaXMucmVzZXRYRG9tYWluKCk7bnVsbCE9dGhpcy5fZGVmYXVsdFlSYW5nZSYmdGhpcy5yZXNldFlEb21haW4oKTt0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKX1yZWRyYXcoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVkcmF3UmFmKTt0aGlzLl9yZWRyYXdSYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMubWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXQoKTsKdGhpcy5vdXRlci5yZWRyYXcoKX0pfW1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5faW52YWxpZGF0ZUxheW91dFJhZik7dGhpcy5faW52YWxpZGF0ZUxheW91dFJhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5tZWFzdXJlQkJveEFuZE1heWJlSW52YWxpZGF0ZUxheW91dCgpfSl9bWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXQoKXtpZih0aGlzLl9sYXN0RHJhd0JCb3gpe2NvbnN0IHt3aWR0aDpnfT10aGlzLl9sYXN0RHJhd0JCb3gse3dpZHRoOmx9PXRoaXMudGFyZ2V0U1ZHLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTswPT1nJiZnPGwmJnRoaXMub3V0ZXIuaW52YWxpZGF0ZUNhY2hlKCl9dGhpcy5fbGFzdERyYXdCQm94PXRoaXMudGFyZ2V0U1ZHLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1kZXN0cm95KCl7d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlZHJhd1JhZik7CndpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9pbnZhbGlkYXRlTGF5b3V0UmFmKTt0aGlzLm91dGVyJiZ0aGlzLm91dGVyLmRlc3Ryb3koKX1vbkFuY2hvcihnKXtpZih0aGlzLm91dGVyKXRoaXMub3V0ZXIub25BbmNob3IoZyl9fWEuTGluZUNoYXJ0PWZ9KShjcHx8KGNwPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydDIvdnotbGluZS1jaGFydDIuanMKKGZ1bmN0aW9uKGEpe2NvbnN0IGM9JG8ubXVsdGlzY2FsZUZvcm1hdHRlcigkby5ZX1RPT0xUSVBfRk9STUFUVEVSX1BSRUNJU0lPTiksZD1mPT5pc05hTihmKT8iTmFOIjpjKGYpO2EuREVGQVVMVF9UT09MVElQX0NPTFVNTlM9W3t0aXRsZToiTmFtZSIsZXZhbHVhdGU6Zj0+Zi5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZX0se3RpdGxlOiJTbW9vdGhlZCIsZXZhbHVhdGUoZixnKXsoe3Ntb290aGluZ0VuYWJsZWQ6Z309Zyk7cmV0dXJuIGQoZz9mLmRhdHVtLnNtb290aGVkOmYuZGF0dW0uc2NhbGFyKX19LHt0aXRsZToiVmFsdWUiLGV2YWx1YXRlOmY9PmQoZi5kYXR1bS5zY2FsYXIpfSx7dGl0bGU6IlN0ZXAiLGV2YWx1YXRlOmY9PiRvLnN0ZXBGb3JtYXR0ZXIoZi5kYXR1bS5zdGVwKX0se3RpdGxlOiJUaW1lIixldmFsdWF0ZTpmPT4kby50aW1lRm9ybWF0dGVyKGYuZGF0dW0ud2FsbF90aW1lKX0se3RpdGxlOiJSZWxhdGl2ZSIsZXZhbHVhdGU6Zj0+JG8ucmVsYXRpdmVGb3JtYXR0ZXIoJG8ucmVsYXRpdmVBY2Nlc3NvcihmLmRhdHVtLAotMSxmLmRhdGFzZXQpKX1dO1BvbHltZXIoe2lzOiJ2ei1saW5lLWNoYXJ0MiIscHJvcGVydGllczp7Y29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IFBsb3R0YWJsZS5TY2FsZXMuQ29sb3IpLnJhbmdlKGQzLnNjaGVtZUNhdGVnb3J5MTApfX0sc3ltYm9sRnVuY3Rpb246T2JqZWN0LHNtb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAsdmFsdWU6ITF9LHNtb290aGluZ1dlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6LjZ9LHhUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0seENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZDp7dHlwZTpPYmplY3QsdmFsdWU6IiJ9LHhBeGlzRm9ybWF0dGVyOk9iamVjdCx5VmFsdWVBY2Nlc3Nvcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9PmY9PmYuc2NhbGFyfSx0b29sdGlwQ29sdW1uczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+YS5ERUZBVUxUX1RPT0xUSVBfQ09MVU1OU30sZmlsbEFyZWE6T2JqZWN0LApkZWZhdWx0WFJhbmdlOkFycmF5LGRlZmF1bHRZUmFuZ2U6QXJyYXkseVNjYWxlVHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImxpbmVhciJ9LGlnbm9yZVlPdXRsaWVyczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx0b29sdGlwU29ydGluZ01ldGhvZDp7dHlwZTpTdHJpbmcsdmFsdWU6ImRlZmF1bHQifSx0b29sdGlwUG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOmFwLlRvb2x0aXBQb3NpdGlvbi5CT1RUT019LF9jaGFydDpPYmplY3QsX3Zpc2libGVTZXJpZXNDYWNoZTp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9zZXJpZXNEYXRhQ2FjaGU6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfc2VyaWVzTWV0YWRhdGFDYWNoZTp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ6e3R5cGU6TnVtYmVyLHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6WyJfbWFrZUNoYXJ0KHhDb21wb25lbnRzQ3JlYXRpb25NZXRob2QsIHhUeXBlLCB5VmFsdWVBY2Nlc3NvciwgeVNjYWxlVHlwZSwgdG9vbHRpcENvbHVtbnMsIGNvbG9yU2NhbGUsIGlzQXR0YWNoZWQpIiwKIl9yZWxvYWRGcm9tQ2FjaGUoX2NoYXJ0LCBfdmlzaWJsZVNlcmllc0NhY2hlKSIsIl9zbW9vdGhpbmdDaGFuZ2VkKHNtb290aGluZ0VuYWJsZWQsIHNtb290aGluZ1dlaWdodCwgX2NoYXJ0KSIsIl90b29sdGlwU29ydGluZ01ldGhvZENoYW5nZWQodG9vbHRpcFNvcnRpbmdNZXRob2QsIF9jaGFydCkiLCJfb3V0bGllcnNDaGFuZ2VkKGlnbm9yZVlPdXRsaWVycywgX2NoYXJ0KSJdLHJlYWR5KCl7dGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLmNoYXJ0ZGl2LCEwKX0sYXR0YWNoZWQoKXtjb25zdCBmPXtjYXB0dXJlOiEwLHBhc3NpdmU6ITB9O3RoaXMuX2xpc3Rlbih0aGlzLCJtb3VzZWRvd24iLHRoaXMuX29uTW91c2VEb3duLmJpbmQodGhpcyksZik7dGhpcy5fbGlzdGVuKHRoaXMsIm1vdXNldXAiLHRoaXMuX29uTW91c2VVcC5iaW5kKHRoaXMpLGYpO3RoaXMuX2xpc3Rlbih3aW5kb3csImtleWRvd24iLHRoaXMuX29uS2V5RG93bi5iaW5kKHRoaXMpLGYpO3RoaXMuX2xpc3Rlbih3aW5kb3csCiJrZXl1cCIsdGhpcy5fb25LZXlVcC5iaW5kKHRoaXMpLGYpfSxkZXRhY2hlZCgpe3RoaXMuY2FuY2VsQXN5bmModGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkKTt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuZGVzdHJveSgpO3RoaXMuX2xpc3RlbmVycyYmKHRoaXMuX2xpc3RlbmVycy5mb3JFYWNoKCh7bm9kZTpmLGV2ZW50TmFtZTpnLGZ1bmM6bCxvcHRpb246a30pPT57Zi5yZW1vdmVFdmVudExpc3RlbmVyKGcsbCxrKX0pLHRoaXMuX2xpc3RlbmVycy5jbGVhcigpKX0sX2xpc3RlbihmLGcsbCxrPXt9KXt0aGlzLl9saXN0ZW5lcnN8fCh0aGlzLl9saXN0ZW5lcnM9bmV3IFNldCk7dGhpcy5fbGlzdGVuZXJzLmFkZCh7bm9kZTpmLGV2ZW50TmFtZTpnLGZ1bmM6bCxvcHRpb246a30pO2YuYWRkRXZlbnRMaXN0ZW5lcihnLGwsayl9LF9vbktleURvd24oZil7dGhpcy50b2dnbGVDbGFzcygicGFua2V5IixhLlBhblpvb21EcmFnTGF5ZXIuaXNQYW5LZXkoZikpfSxfb25LZXlVcChmKXt0aGlzLnRvZ2dsZUNsYXNzKCJwYW5rZXkiLAphLlBhblpvb21EcmFnTGF5ZXIuaXNQYW5LZXkoZikpfSxfb25Nb3VzZURvd24oKXt0aGlzLnRvZ2dsZUNsYXNzKCJtb3VzZWRvd24iLCEwKX0sX29uTW91c2VVcCgpe3RoaXMudG9nZ2xlQ2xhc3MoIm1vdXNlZG93biIsITEpfSxzZXRWaXNpYmxlU2VyaWVzOmZ1bmN0aW9uKGYpe18uaXNFcXVhbCh0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUsZil8fCh0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGU9Zil9LHNldFNlcmllc0RhdGE6ZnVuY3Rpb24oZixnKXt0aGlzLl9zZXJpZXNEYXRhQ2FjaGVbZl09Zzt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuc2V0U2VyaWVzRGF0YShmLGcpfSxzZXRTZXJpZXNNZXRhZGF0YShmLGcpe3RoaXMuX3Nlcmllc01ldGFkYXRhQ2FjaGVbZl09Zzt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuc2V0U2VyaWVzTWV0YWRhdGEoZixnKX0scmVzZXREb21haW46ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQucmVzZXREb21haW4oKX0scmVkcmF3OmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJgp0aGlzLl9jaGFydC5yZWRyYXcoKX0sX21ha2VDaGFydDpmdW5jdGlvbihmLGcsbCxrLG4scCl7Z3x8Zj9nJiYoZj0oKT0+JG8uZ2V0WENvbXBvbmVudHMoZykpOmY9JG8uc3RlcFg7bnVsbCE9PXRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZCYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkKSx0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9bnVsbCk7dGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkPXRoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9bnVsbDtpZihmJiZ0aGlzLnlWYWx1ZUFjY2Vzc29yJiZ0aGlzLnRvb2x0aXBDb2x1bW5zKXt2YXIgcT1uZXcgYS5MaW5lQ2hhcnQoZix0aGlzLnlWYWx1ZUFjY2Vzc29yLGsscCx0aGlzLiQudG9vbHRpcCx0aGlzLnRvb2x0aXBDb2x1bW5zLHRoaXMuZmlsbEFyZWEsdGhpcy5kZWZhdWx0WFJhbmdlLHRoaXMuZGVmYXVsdFlSYW5nZSwKdGhpcy5zeW1ib2xGdW5jdGlvbix0aGlzLnhBeGlzRm9ybWF0dGVyKSxyPWQzLnNlbGVjdCh0aGlzLiQuY2hhcnRkaXYpO3EucmVuZGVyVG8ocik7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LmRlc3Ryb3koKTt0aGlzLl9jaGFydD1xO3RoaXMuX2NoYXJ0Lm9uQW5jaG9yKCgpPT50aGlzLmZpcmUoImNoYXJ0LWF0dGFjaGVkIikpfX0sMzUwKX0sX3JlbG9hZEZyb21DYWNoZTpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiYodGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlLmZvckVhY2goZj0+e3RoaXMuX2NoYXJ0LnNldFNlcmllc0RhdGEoZix0aGlzLl9zZXJpZXNEYXRhQ2FjaGVbZl18fFtdKX0pLHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZS5maWx0ZXIoZj0+dGhpcy5fc2VyaWVzTWV0YWRhdGFDYWNoZVtmXSkuZm9yRWFjaChmPT57dGhpcy5fY2hhcnQuc2V0U2VyaWVzTWV0YWRhdGEoZix0aGlzLl9zZXJpZXNNZXRhZGF0YUNhY2hlW2ZdKX0pLHRoaXMuX2NoYXJ0LnNldFZpc2libGVTZXJpZXModGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlKSl9LApfc21vb3RoaW5nQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiYodGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuX2NoYXJ0LnNtb290aGluZ1VwZGF0ZSh0aGlzLnNtb290aGluZ1dlaWdodCk6dGhpcy5fY2hhcnQuc21vb3RoaW5nRGlzYWJsZSgpKX0sX291dGxpZXJzQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5pZ25vcmVZT3V0bGllcnModGhpcy5pZ25vcmVZT3V0bGllcnMpfSxfdG9vbHRpcFNvcnRpbmdNZXRob2RDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnNldFRvb2x0aXBTb3J0aW5nTWV0aG9kKHRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2QpfSxnZXRFeHBvcnRlcigpe3JldHVybiBuZXcgYS5MaW5lQ2hhcnRFeHBvcnRlcih0aGlzLiQuY2hhcnRkaXYpfX0pfSkoY3B8fChjcD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL3Z6LWxpbmUtY2hhcnQyLmh0bWwuanMKUG9seW1lcih7aXM6InZ6LWxpbmUtY2hhcnQtdG9vbHRpcCJ9KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0Mi9saW5lLWNoYXJ0LWV4cG9ydGVyLmpzCihmdW5jdGlvbihhKXtsZXQgYzsoZnVuY3Rpb24oZyl7Zy5HUk9VUD0iRyI7Zy5ESVY9IkRJViI7Zy5TVkc9IlNWRyI7Zy5URVhUPSJURVhUIn0pKGN8fChjPXt9KSk7Y2xhc3MgZHtjb25zdHJ1Y3RvcihnKXt0aGlzLnVuaXF1ZUlkPTA7dGhpcy5yb290PWd9ZXhwb3J0QXNTdHJpbmcoKXtjb25zdCBnPXRoaXMuY29udmVydCh0aGlzLnJvb3QpO2lmKCFnKXJldHVybiIiO2NvbnN0IGw9dGhpcy5jcmVhdGVSb290U3ZnKCk7bC5hcHBlbmRDaGlsZChnKTtyZXR1cm4gbC5vdXRlckhUTUx9Y3JlYXRlVW5pcXVlSWQoKXtyZXR1cm5gJHsiY2xpcCJ9XyR7dGhpcy51bmlxdWVJZCsrfWB9Z2V0U2l6ZSgpe3JldHVybiB0aGlzLnJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y3JlYXRlUm9vdFN2Zygpe2NvbnN0IGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3ZnIiksbD10aGlzLmdldFNpemUoKTtnLnNldEF0dHJpYnV0ZU5TKCJzdmciLCJ2aWV3Qm94IixgMCAwICR7bC53aWR0aH0gJHtsLmhlaWdodH1gKTsKZy5zZXRBdHRyaWJ1dGUoInhtbG5zIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciKTtyZXR1cm4gZ31jb252ZXJ0KGcpe2xldCBsPW51bGw7dmFyIGs9Zy5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO2lmKGcubm9kZVR5cGUhPU5vZGUuRUxFTUVOVF9OT0RFfHxrIT1jLkRJViYmayE9Yy5TVkcpbD1nLmNsb25lTm9kZSgpO2Vsc2V7bD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGMuR1JPVVApO3ZhciBuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGcpLHA9cGFyc2VJbnQobi5sZWZ0LDEwKSxxPXBhcnNlSW50KG4udG9wLDEwKTtpZihwfHxxKWs9dGhpcy5jcmVhdGVVbmlxdWVJZCgpLGwuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLGB0cmFuc2xhdGUoJHtwfSwgJHtxfSlgKSxsLnNldEF0dHJpYnV0ZSgiY2xpcC1wYXRoIixgdXJsKCMke2t9KWApLHE9cGFyc2VJbnQobi5oZWlnaHQsMTApLHA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicmVjdCIpLHAuc2V0QXR0cmlidXRlKCJ3aWR0aCIsClN0cmluZyhwYXJzZUludChuLndpZHRoLDEwKSkpLHAuc2V0QXR0cmlidXRlKCJoZWlnaHQiLFN0cmluZyhxKSksbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoInN2ZyIsImNsaXBQYXRoIiksbi5pZD1rLG4uYXBwZW5kQ2hpbGQocCksbC5hcHBlbmRDaGlsZChuKX1BcnJheS5mcm9tKGcuY2hpbGROb2RlcykubWFwKHI9PnRoaXMuY29udmVydChyKSkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2gocj0+bC5hcHBlbmRDaGlsZChyKSk7cmV0dXJuIGwubm9kZU5hbWUudG9VcHBlckNhc2UoKT09Yy5HUk9VUCYmIWwuaGFzQ2hpbGROb2RlcygpfHx0aGlzLnNob3VsZE9taXROb2RlKGcpP251bGw6dGhpcy5zdHJpcENsYXNzKHRoaXMudHJhbnNmZXJTdHlsZShnLGwpKX1zdHJpcENsYXNzKGcpe2cubm9kZVR5cGU9PU5vZGUuRUxFTUVOVF9OT0RFJiZnLnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKTtyZXR1cm4gZ310cmFuc2ZlclN0eWxlKGcsbCl7aWYobC5ub2RlVHlwZSE9Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIGw7CmNvbnN0IGs9bC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpO2c9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZyk7az09Yy5URVhUJiZPYmplY3QuYXNzaWduKGwuc3R5bGUse2ZvbnRGYW1pbHk6Zy5mb250RmFtaWx5LGZvbnRTaXplOmcuZm9udFNpemUsZm9udFdlaWdodDpnLmZvbnRXZWlnaHR9KTtrIT1jLkdST1VQJiYobC5zZXRBdHRyaWJ1dGUoImZpbGwiLGcuZmlsbCksbC5zZXRBdHRyaWJ1dGUoInN0cm9rZSIsZy5zdHJva2UpLGwuc2V0QXR0cmlidXRlKCJzdHJva2Utd2lkdGgiLGcuc3Ryb2tlV2lkdGgpKTsiMSIhPWcub3BhY2l0eSYmbC5zZXRBdHRyaWJ1dGUoIm9wYWNpdHkiLGcub3BhY2l0eSk7cmV0dXJuIGx9c2hvdWxkT21pdE5vZGUoKXtyZXR1cm4hMX19YS5QbG90dGFibGVFeHBvcnRlcj1kO2NsYXNzIGYgZXh0ZW5kcyBke3Nob3VsZE9taXROb2RlKGcpe3JldHVybiBnLm5vZGVUeXBlPT1Ob2RlLkVMRU1FTlRfTk9ERT9nLmNsYXNzTGlzdC5jb250YWlucygic2NhdHRlci1wbG90Iik6CiExfX1hLkxpbmVDaGFydEV4cG9ydGVyPWZ9KShjcHx8KGNwPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLmh0bWwuanMKKGZ1bmN0aW9uKCl7Y29uc3QgYT1bXSxjPWZ1bmN0aW9uKCl7cmV0dXJuIF8udGhyb3R0bGUoZnVuY3Rpb24gZigpe2lmKDAhPWEubGVuZ3RoKXt2YXIgZz1hLnNoaWZ0KCk7Zy5hY3RpdmUmJihnLnJlZHJhdygpLGcuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlPSExKTt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUoMCk7d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmKX19LDEwMCl9KCk7UG9seW1lcih7aXM6InRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiLHByb3BlcnRpZXM6e2FjdGl2ZTp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfZml4QmFkU3RhdGVXaGVuQWN0aXZlIn0sZGF0YVNlcmllczpBcnJheSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsbG9nU2NhbGVBY3RpdmU6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2xvZ1NjYWxlQ2hhbmdlZCJ9LHhDb21wb25lbnRzQ3JlYXRpb25NZXRob2Q6T2JqZWN0LHhUeXBlOlN0cmluZyx5VmFsdWVBY2Nlc3NvcjpPYmplY3QsZmlsbEFyZWE6T2JqZWN0LApzbW9vdGhpbmdFbmFibGVkOkJvb2xlYW4sc21vb3RoaW5nV2VpZ2h0Ok51bWJlcix0b29sdGlwQ29sdW1uczpBcnJheSx0b29sdGlwU29ydGluZ01ldGhvZDpTdHJpbmcsdG9vbHRpcFBvc2l0aW9uOlN0cmluZyxpZ25vcmVZT3V0bGllcnM6Qm9vbGVhbixkZWZhdWx0WFJhbmdlOkFycmF5LGRlZmF1bHRZUmFuZ2U6QXJyYXksc3ltYm9sRnVuY3Rpb246T2JqZWN0LGNvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe3NjYWxlOlhvLnJ1bnNDb2xvclNjYWxlfSl9LF9yZXNldERvbWFpbk9uTmV4dExvYWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfX0sYmVoYXZpb3JzOltVby5EYXRhTG9hZGVyQmVoYXZpb3JdLG9ic2VydmVyczpbIl9kYXRhU2VyaWVzQ2hhbmdlZChkYXRhU2VyaWVzLiopIiwiX2xvYWRLZXlDaGFuZ2VkKGxvYWRLZXkpIl0sb25Mb2FkRmluaXNoKCl7MDwKdGhpcy5kYXRhVG9Mb2FkLmxlbmd0aCYmdGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkJiYodGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkPSExLHRoaXMuJC5jaGFydC5yZXNldERvbWFpbigpKTt0aGlzLnJlZHJhdygpfSxkZXRhY2hlZCgpe2NhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlZHJhd1JhZil9LGV4cG9ydEFzU3ZnU3RyaW5nKCl7cmV0dXJuIHRoaXMuJC5jaGFydC5nZXRFeHBvcnRlcigpLmV4cG9ydEFzU3RyaW5nKCl9LHJlc2V0RG9tYWluKCl7dGhpcy4kLmNoYXJ0LnJlc2V0RG9tYWluKCl9LHNldFNlcmllc0RhdGEoZCxmKXt0aGlzLiQuY2hhcnQuc2V0U2VyaWVzRGF0YShkLGYpfSxzZXRTZXJpZXNNZXRhZGF0YShkLGYpe3RoaXMuJC5jaGFydC5zZXRTZXJpZXNNZXRhZGF0YShkLGYpfSxyZWRyYXcoKXtjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWRyYXdSYWYpO3RoaXMuX3JlZHJhd1JhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5hY3RpdmU/CnRoaXMuJC5jaGFydC5yZWRyYXcoKTp0aGlzLl9tYXliZVJlbmRlcmVkSW5CYWRTdGF0ZT0hMH0pfSxfbG9hZEtleUNoYW5nZWQoKXt0aGlzLnJlc2V0KCk7dGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkPSEwfSxfZGF0YVNlcmllc0NoYW5nZWQoKXt0aGlzLiQuY2hhcnQuc2V0VmlzaWJsZVNlcmllcyh0aGlzLmRhdGFTZXJpZXMpfSxfbG9nU2NhbGVDaGFuZ2VkKGQpe3RoaXMuJC5jaGFydC55U2NhbGVUeXBlPWQ/ImxvZyI6ImxpbmVhciI7dGhpcy5yZWRyYXcoKX0sX2ZpeEJhZFN0YXRlV2hlbkFjdGl2ZSgpe3RoaXMuYWN0aXZlJiZ0aGlzLl9tYXliZVJlbmRlcmVkSW5CYWRTdGF0ZSYmKGEucHVzaCh0aGlzKSxjKCkpfSxfb25DaGFydEF0dGFjaGVkKCl7dGhpcy5hY3RpdmV8fCh0aGlzLl9tYXliZVJlbmRlcmVkSW5CYWRTdGF0ZT0hMCl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWRpYWxvZy1zY3JvbGxhYmxlL3BhcGVyLWRpYWxvZy1zY3JvbGxhYmxlLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWRpYWxvZy1zY3JvbGxhYmxlIixwcm9wZXJ0aWVzOntkaWFsb2dFbGVtZW50Ont0eXBlOk9iamVjdH19LGdldCBzY3JvbGxUYXJnZXQoKXtyZXR1cm4gdGhpcy4kLnNjcm9sbGFibGV9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fZW5zdXJlVGFyZ2V0KCk7dGhpcy5jbGFzc0xpc3QuYWRkKCJuby1wYWRkaW5nIil9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fZW5zdXJlVGFyZ2V0KCk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMudXBkYXRlU2Nyb2xsU3RhdGUuYmluZCh0aGlzKSl9LHVwZGF0ZVNjcm9sbFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy50b2dnbGVDbGFzcygiaXMtc2Nyb2xsZWQiLDA8dGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsVG9wKTt0aGlzLnRvZ2dsZUNsYXNzKCJjYW4tc2Nyb2xsIix0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRIZWlnaHQ8dGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsSGVpZ2h0KTt0aGlzLnRvZ2dsZUNsYXNzKCJzY3JvbGxlZC10by1ib3R0b20iLAp0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3ArdGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0SGVpZ2h0Pj10aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxIZWlnaHQpfSxfZW5zdXJlVGFyZ2V0OmZ1bmN0aW9uKCl7KHRoaXMuZGlhbG9nRWxlbWVudD10aGlzLmRpYWxvZ0VsZW1lbnR8fHRoaXMucGFyZW50RWxlbWVudCkmJnRoaXMuZGlhbG9nRWxlbWVudC5iZWhhdmlvcnMmJjA8PXRoaXMuZGlhbG9nRWxlbWVudC5iZWhhdmlvcnMuaW5kZXhPZihQb2x5bWVyLlBhcGVyRGlhbG9nQmVoYXZpb3JJbXBsKT8odGhpcy5kaWFsb2dFbGVtZW50LnNpemluZ1RhcmdldD10aGlzLnNjcm9sbFRhcmdldCx0aGlzLnNjcm9sbFRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCJmaXQiKSk6dGhpcy5kaWFsb2dFbGVtZW50JiZ0aGlzLnNjcm9sbFRhcmdldC5jbGFzc0xpc3QuYWRkKCJmaXQiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1tYXJrZG93bi12aWV3L3RmLW1hcmtkb3duLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtbWFya2Rvd24tdmlldyIscHJvcGVydGllczp7aHRtbDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9fSxhdHRhY2hlZCgpe3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pnt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQubWFya2Rvd24sITApfSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY2FyZC1oZWFkaW5nL3V0aWwuanMKdmFyIGRwOyhmdW5jdGlvbihhKXtmdW5jdGlvbiBjKGQpe2lmKCFkKXJldHVybiBudWxsO2xldCBmPWQubWF0Y2goL14jKFswLTlhLWZdezEsMn0pKFswLTlhLWZdezEsMn0pKFswLTlhLWZdezEsMn0pJC8pO2lmKCFmKXJldHVybiBudWxsO2lmKDQ9PWQubGVuZ3RoKWZvcihkPTE7Mz49ZDtkKyspZltkXSs9ZltkXTtyZXR1cm5bcGFyc2VJbnQoZlsxXSwxNikscGFyc2VJbnQoZlsyXSwxNikscGFyc2VJbnQoZlszXSwxNildfWEuZm9ybWF0RGF0ZT1mdW5jdGlvbihkKXtyZXR1cm4gZD9kLnRvU3RyaW5nKCkucmVwbGFjZSgvR01ULVxkKyBcKChbXildKylcKS8sIiQxIik6IiJ9O2EucGlja1RleHRDb2xvcj1mdW5jdGlvbihkKXtyZXR1cm4oZD1jKGQpKT8xMjU8TWF0aC5yb3VuZCgoMjk5KmRbMF0rNTg3KmRbMV0rMTE0KmRbMl0pLzFFMyk/ImluaGVyaXQiOiIjZWVlIjoiaW5oZXJpdCJ9fSkoZHB8fChkcD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNhcmQtaGVhZGluZy90Zi1jYXJkLWhlYWRpbmcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtY2FyZC1oZWFkaW5nIixwcm9wZXJ0aWVzOntkaXNwbGF5TmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sdGFnOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxydW46e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGRlc2NyaXB0aW9uOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxjb2xvcjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3J1bkJhY2tncm91bmQ6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkJhY2tncm91bmQoY29sb3IpIixyZWFkT25seTohMCxvYnNlcnZlcjoiX3VwZGF0ZUhlYWRpbmdTdHlsZSJ9LF9ydW5Db2xvcjp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUnVuQ29sb3IoY29sb3IpIixyZWFkT25seTohMCxvYnNlcnZlcjoiX3VwZGF0ZUhlYWRpbmdTdHlsZSJ9LF9uYW1lTGFiZWw6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZU5hbWVMYWJlbChkaXNwbGF5TmFtZSwgdGFnKSJ9LF90YWdMYWJlbDp7dHlwZTpTdHJpbmcsCmNvbXB1dGVkOiJfY29tcHV0ZVRhZ0xhYmVsKGRpc3BsYXlOYW1lLCB0YWcpIn19LF91cGRhdGVIZWFkaW5nU3R5bGUoKXt0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tdGYtY2FyZC1oZWFkaW5nLWJhY2tncm91bmQtY29sb3IiOnRoaXMuX3J1bkJhY2tncm91bmQsIi0tdGYtY2FyZC1oZWFkaW5nLWNvbG9yIjp0aGlzLl9ydW5Db2xvcn0pfSxfY29tcHV0ZVJ1bkJhY2tncm91bmQoYSl7cmV0dXJuIGF8fCJub25lIn0sX2NvbXB1dGVSdW5Db2xvcihhKXtyZXR1cm4gZHAucGlja1RleHRDb2xvcihhKX0sX2NvbXB1dGVOYW1lTGFiZWwoYSxjKXtyZXR1cm4gYXx8Y3x8IiJ9LF9jb21wdXRlVGFnTGFiZWwoYSxjKXtyZXR1cm4gYyYmYyE9PWE/YzoiIn0sX3RvZ2dsZURlc2NyaXB0aW9uRGlhbG9nKGEpe3RoaXMuJC5kZXNjcmlwdGlvbkRpYWxvZy5wb3NpdGlvblRhcmdldD1hLnRhcmdldDt0aGlzLiQuZGVzY3JpcHRpb25EaWFsb2cudG9nZ2xlKCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1kb3dubG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRvd25sb2FkZXIiLHByb3BlcnRpZXM6e19ydW46e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxydW5zOkFycmF5LHRhZzpTdHJpbmcsdXJsRm46RnVuY3Rpb259LF9jc3ZVcmwoYSxjLGQpe3JldHVybiBjP1FvLmFkZFBhcmFtcyhkKGEsYykse2Zvcm1hdDoiY3N2In0pOiIifSxfanNvblVybChhLGMsZCl7cmV0dXJuIGM/ZChhLGMpOiIifSxfY3N2TmFtZShhLGMpe3JldHVybiBjP2BydW4tJHtjfS10YWctJHthfS5jc3ZgOiIifSxfanNvbk5hbWUoYSxjKXtyZXR1cm4gYz9gcnVuLSR7Y30tdGFnLSR7YX0uanNvbmA6IiJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtc2NhbGFyLWRhc2hib2FyZC90Zi1zY2FsYXItY2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1zY2FsYXItY2FyZCIscHJvcGVydGllczp7dGFnOlN0cmluZyxkYXRhVG9Mb2FkOkFycmF5LHhUeXBlOlN0cmluZyxhY3RpdmU6Qm9vbGVhbixpZ25vcmVZT3V0bGllcnM6Qm9vbGVhbixyZXF1ZXN0TWFuYWdlcjpPYmplY3Qsc2hvd0Rvd25MaW5rczpCb29sZWFuLHNtb290aGluZ0VuYWJsZWQ6Qm9vbGVhbixzbW9vdGhpbmdXZWlnaHQ6TnVtYmVyLHRhZ01ldGFkYXRhOk9iamVjdCxjb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSx0b29sdGlwU29ydGluZ01ldGhvZDpTdHJpbmcsX2xvYWREYXRhQ2FsbGJhY2s6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKGEsYyxkKT0+e2Q9ZC5tYXAoZz0+KHt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKmdbMF0pLHN0ZXA6Z1sxXSxzY2FsYXI6Z1syXX0pKTtjb25zdCBmPXRoaXMuX2dldFNlcmllc05hbWVGcm9tRGF0dW0oYyk7YS5zZXRTZXJpZXNNZXRhZGF0YShmLGMpO2Euc2V0U2VyaWVzRGF0YShmLApkKX19LHJlYWRPbmx5OiEwfSxnZXREYXRhTG9hZFVybDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybih7dGFnOmEscnVuOmN9KT0+UW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInNjYWxhcnMiLCIvc2NhbGFycyIsbmV3IFVSTFNlYXJjaFBhcmFtcyh7dGFnOmEscnVuOmN9KSl9fSxfZG93bmxvYWRVcmxGbjp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybihhLGMpPT50aGlzLmdldERhdGFMb2FkVXJsKHt0YWc6YSxydW46Y30pfX0scmVxdWVzdERhdGE6RnVuY3Rpb24sX2dldERhdGFMb2FkTmFtZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBhPT50aGlzLl9nZXRTZXJpZXNOYW1lRnJvbURhdHVtKGEpfX0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfbG9nU2NhbGVBY3RpdmU6Qm9vbGVhbixfdG9vbHRpcENvbHVtbnM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtjb25zdCBhPQpjcC5ERUZBVUxUX1RPT0xUSVBfQ09MVU1OUy5zbGljZSgpLGM9YS5maW5kSW5kZXgoZD0+Ik5hbWUiPT1kLnRpdGxlKTthLnNwbGljZShjLDEse3RpdGxlOiJOYW1lIixldmFsdWF0ZTpkPT57ZD1kLmRhdGFzZXQubWV0YWRhdGEoKS5tZXRhO3JldHVybiB0aGlzLl9nZXRTZXJpZXNEaXNwbGF5TmFtZUZyb21EYXR1bShkKX19KTtyZXR1cm4gYX19fSxyZWxvYWQoKXt0aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikucmVsb2FkKCl9LHJlZHJhdygpe3RoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5yZWRyYXcoKX0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfSxfdG9nZ2xlTG9nU2NhbGUoKXt0aGlzLnNldCgiX2xvZ1NjYWxlQWN0aXZlIiwhdGhpcy5fbG9nU2NhbGVBY3RpdmUpfSxfcmVzZXREb21haW4oKXtjb25zdCBhPXRoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKTsKYSYmYS5yZXNldERvbWFpbigpfSxfdXBkYXRlRG93bmxvYWRMaW5rKCl7Y29uc3QgYT10aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikuZXhwb3J0QXNTdmdTdHJpbmcoKTt0aGlzLiQkKCIjc3ZnTGluayIpLmhyZWY9YGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJHtidG9hKGEpfWB9LF9ydW5zRnJvbURhdGEoYSl7cmV0dXJuIGEubWFwKGM9PmMucnVuKX0sX2dldERhdGFTZXJpZXMoKXtyZXR1cm4gdGhpcy5kYXRhVG9Mb2FkLm1hcChhPT50aGlzLl9nZXRTZXJpZXNOYW1lRnJvbURhdHVtKGEpKX0sX2dldFNlcmllc05hbWVGcm9tRGF0dW0oe3J1bjphLGV4cGVyaW1lbnQ6Yz17bmFtZToiX2RlZmF1bHQifX0pe3JldHVybiBKU09OLnN0cmluZ2lmeShbYy5uYW1lLGFdKX0sX2dldFNlcmllc0Rpc3BsYXlOYW1lRnJvbURhdHVtKGEpe3JldHVybiBhLnJ1bn0sX2dldENvbG9yU2NhbGUoKXtyZXR1cm4gbnVsbCE9PXRoaXMuY29sb3JTY2FsZT90aGlzLmNvbG9yU2NhbGU6CntzY2FsZTphPT57WyxhXT1KU09OLnBhcnNlKGEpO3JldHVybiBYby5ydW5zQ29sb3JTY2FsZShhKX19fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tcmFuZ2UtYmVoYXZpb3IvaXJvbi1yYW5nZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvblJhbmdlQmVoYXZpb3I9e3Byb3BlcnRpZXM6e3ZhbHVlOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LG1pbjp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LG1heDp7dHlwZTpOdW1iZXIsdmFsdWU6MTAwLG5vdGlmeTohMH0sc3RlcDp7dHlwZTpOdW1iZXIsdmFsdWU6MSxub3RpZnk6ITB9LHJhdGlvOnt0eXBlOk51bWJlcix2YWx1ZTowLHJlYWRPbmx5OiEwLG5vdGlmeTohMH19LG9ic2VydmVyczpbIl91cGRhdGUodmFsdWUsIG1pbiwgbWF4LCBzdGVwKSJdLF9jYWxjUmF0aW86ZnVuY3Rpb24oYSl7cmV0dXJuKHRoaXMuX2NsYW1wVmFsdWUoYSktdGhpcy5taW4pLyh0aGlzLm1heC10aGlzLm1pbil9LF9jbGFtcFZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLm1pbih0aGlzLm1heCxNYXRoLm1heCh0aGlzLm1pbix0aGlzLl9jYWxjU3RlcChhKSkpfSxfY2FsY1N0ZXA6ZnVuY3Rpb24oYSl7YT1wYXJzZUZsb2F0KGEpOwppZighdGhpcy5zdGVwKXJldHVybiBhO2E9TWF0aC5yb3VuZCgoYS10aGlzLm1pbikvdGhpcy5zdGVwKTtyZXR1cm4gMT50aGlzLnN0ZXA/YS8oMS90aGlzLnN0ZXApK3RoaXMubWluOmEqdGhpcy5zdGVwK3RoaXMubWlufSxfdmFsaWRhdGVWYWx1ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2NsYW1wVmFsdWUodGhpcy52YWx1ZSk7dGhpcy52YWx1ZT10aGlzLm9sZFZhbHVlPWlzTmFOKGEpP3RoaXMub2xkVmFsdWU6YTtyZXR1cm4gdGhpcy52YWx1ZSE9PWF9LF91cGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl92YWxpZGF0ZVZhbHVlKCk7dGhpcy5fc2V0UmF0aW8oMTAwKnRoaXMuX2NhbGNSYXRpbyh0aGlzLnZhbHVlKSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1wcm9ncmVzcy9wYXBlci1wcm9ncmVzcy5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1wcm9ncmVzcyIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25SYW5nZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntzZWNvbmRhcnlQcm9ncmVzczp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sc2Vjb25kYXJ5UmF0aW86e3R5cGU6TnVtYmVyLHZhbHVlOjAscmVhZE9ubHk6ITB9LGluZGV0ZXJtaW5hdGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX3RvZ2dsZUluZGV0ZXJtaW5hdGUifSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxvYnNlcnZlcjoiX2Rpc2FibGVkQ2hhbmdlZCJ9fSxvYnNlcnZlcnM6WyJfcHJvZ3Jlc3NDaGFuZ2VkKHNlY29uZGFyeVByb2dyZXNzLCB2YWx1ZSwgbWluLCBtYXgsIGluZGV0ZXJtaW5hdGUpIl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InByb2dyZXNzYmFyIn0sX3RvZ2dsZUluZGV0ZXJtaW5hdGU6ZnVuY3Rpb24oYSl7dGhpcy50b2dnbGVDbGFzcygiaW5kZXRlcm1pbmF0ZSIsCmEsdGhpcy4kLnByaW1hcnlQcm9ncmVzcyl9LF90cmFuc2Zvcm1Qcm9ncmVzczpmdW5jdGlvbihhLGMpe2Euc3R5bGUudHJhbnNmb3JtPWEuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJzY2FsZVgoIitjLzEwMCsiKSJ9LF9tYWluUmF0aW9DaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuX3RyYW5zZm9ybVByb2dyZXNzKHRoaXMuJC5wcmltYXJ5UHJvZ3Jlc3MsYSl9LF9wcm9ncmVzc0NoYW5nZWQ6ZnVuY3Rpb24oYSxjLGQsZixnKXthPXRoaXMuX2NsYW1wVmFsdWUoYSk7Yz10aGlzLl9jbGFtcFZhbHVlKGMpO3ZhciBsPTEwMCp0aGlzLl9jYWxjUmF0aW8oYSksaz0xMDAqdGhpcy5fY2FsY1JhdGlvKGMpO3RoaXMuX3NldFNlY29uZGFyeVJhdGlvKGwpO3RoaXMuX3RyYW5zZm9ybVByb2dyZXNzKHRoaXMuJC5zZWNvbmRhcnlQcm9ncmVzcyxsKTt0aGlzLl90cmFuc2Zvcm1Qcm9ncmVzcyh0aGlzLiQucHJpbWFyeVByb2dyZXNzLGspO3RoaXMuc2Vjb25kYXJ5UHJvZ3Jlc3M9YTtnP3RoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLXZhbHVlbm93Iik6CnRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbm93IixjKTt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW1pbiIsZCk7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVtYXgiLGYpfSxfZGlzYWJsZWRDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWRpc2FibGVkIixhPyJ0cnVlIjoiZmFsc2UiKX0sX2hpZGVTZWNvbmRhcnlQcm9ncmVzczpmdW5jdGlvbihhKXtyZXR1cm4gMD09PWF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItc2xpZGVyL3BhcGVyLXNsaWRlci5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1zbGlkZXIiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcixQb2x5bWVyLklyb25Gb3JtRWxlbWVudEJlaGF2aW9yLFBvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvcixQb2x5bWVyLklyb25SYW5nZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntzbmFwczp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0scGluOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxzZWNvbmRhcnlQcm9ncmVzczp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9zZWNvbmRhcnlQcm9ncmVzc0NoYW5nZWQifSxlZGl0YWJsZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbW1lZGlhdGVWYWx1ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MCxyZWFkT25seTohMCxub3RpZnk6ITB9LG1heE1hcmtlcnM6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSxleHBhbmQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH0sCmlnbm9yZUJhclRvdWNoOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGRyYWdnaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSx0cmFuc2l0aW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVhZE9ubHk6ITB9LG1hcmtlcnM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19fSxvYnNlcnZlcnM6WyJfdXBkYXRlS25vYih2YWx1ZSwgbWluLCBtYXgsIHNuYXBzLCBzdGVwKSIsIl92YWx1ZUNoYW5nZWQodmFsdWUpIiwiX2ltbWVkaWF0ZVZhbHVlQ2hhbmdlZChpbW1lZGlhdGVWYWx1ZSkiLCJfdXBkYXRlTWFya2VycyhtYXhNYXJrZXJzLCBtaW4sIG1heCwgc25hcHMpIl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InNsaWRlciIsdGFiaW5kZXg6MH0sa2V5QmluZGluZ3M6e2xlZnQ6Il9sZWZ0S2V5IixyaWdodDoiX3JpZ2h0S2V5IiwiZG93biBwYWdlZG93biBob21lIjoiX2RlY3JlbWVudEtleSIsInVwIHBhZ2V1cCBlbmQiOiJfaW5jcmVtZW50S2V5In0sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5pZ25vcmVCYXJUb3VjaCYmUG9seW1lci5HZXN0dXJlcy5zZXRUb3VjaEFjdGlvbih0aGlzLiQuc2xpZGVyQmFyLCJhdXRvIil9LGluY3JlbWVudDpmdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnZhbHVlK3RoaXMuc3RlcCl9LGRlY3JlbWVudDpmdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnZhbHVlLXRoaXMuc3RlcCl9LF91cGRhdGVLbm9iOmZ1bmN0aW9uKGEsYyxkKXt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW1pbiIsYyk7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVtYXgiLGQpO3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbm93IixhKTt0aGlzLl9wb3NpdGlvbktub2IoMTAwKnRoaXMuX2NhbGNSYXRpbyhhKSl9LF92YWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoInZhbHVlLWNoYW5nZSIse2NvbXBvc2VkOiEwfSl9LF9pbW1lZGlhdGVWYWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmRyYWdnaW5nPwp0aGlzLmZpcmUoImltbWVkaWF0ZS12YWx1ZS1jaGFuZ2UiLHtjb21wb3NlZDohMH0pOnRoaXMudmFsdWU9dGhpcy5pbW1lZGlhdGVWYWx1ZX0sX3NlY29uZGFyeVByb2dyZXNzQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuc2Vjb25kYXJ5UHJvZ3Jlc3M9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnNlY29uZGFyeVByb2dyZXNzKX0sX2V4cGFuZEtub2I6ZnVuY3Rpb24oKXt0aGlzLl9zZXRFeHBhbmQoITApfSxfcmVzZXRLbm9iOmZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxEZWJvdW5jZXIoImV4cGFuZEtub2IiKTt0aGlzLl9zZXRFeHBhbmQoITEpfSxfcG9zaXRpb25Lbm9iOmZ1bmN0aW9uKGEpe3RoaXMuX3NldEltbWVkaWF0ZVZhbHVlKHRoaXMuX2NhbGNTdGVwKHRoaXMuX2NhbGNLbm9iUG9zaXRpb24oYSkpKTt0aGlzLl9zZXRSYXRpbygxMDAqdGhpcy5fY2FsY1JhdGlvKHRoaXMuaW1tZWRpYXRlVmFsdWUpKTt0aGlzLiQuc2xpZGVyS25vYi5zdHlsZS5sZWZ0PXRoaXMucmF0aW8rIiUiO3RoaXMuZHJhZ2dpbmcmJgoodGhpcy5fa25vYnN0YXJ0eD10aGlzLnJhdGlvKnRoaXMuX3cvMTAwLHRoaXMudHJhbnNsYXRlM2QoMCwwLDAsdGhpcy4kLnNsaWRlcktub2IpKX0sX2NhbGNLbm9iUG9zaXRpb246ZnVuY3Rpb24oYSl7cmV0dXJuKHRoaXMubWF4LXRoaXMubWluKSphLzEwMCt0aGlzLm1pbn0sX29uVHJhY2s6ZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKTtzd2l0Y2goYS5kZXRhaWwuc3RhdGUpe2Nhc2UgInN0YXJ0Ijp0aGlzLl90cmFja1N0YXJ0KGEpO2JyZWFrO2Nhc2UgInRyYWNrIjp0aGlzLl90cmFja1goYSk7YnJlYWs7Y2FzZSAiZW5kIjp0aGlzLl90cmFja0VuZCgpfX0sX3RyYWNrU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9zZXRUcmFuc2l0aW5nKCExKTt0aGlzLl93PXRoaXMuJC5zbGlkZXJCYXIub2Zmc2V0V2lkdGg7dGhpcy5fa25vYnN0YXJ0eD10aGlzLl9zdGFydHg9dGhpcy5feD10aGlzLnJhdGlvKnRoaXMuX3cvMTAwO3RoaXMuX21pbng9LXRoaXMuX3N0YXJ0eDt0aGlzLl9tYXh4PQp0aGlzLl93LXRoaXMuX3N0YXJ0eDt0aGlzLiQuc2xpZGVyS25vYi5jbGFzc0xpc3QuYWRkKCJkcmFnZ2luZyIpO3RoaXMuX3NldERyYWdnaW5nKCEwKX0sX3RyYWNrWDpmdW5jdGlvbihhKXt0aGlzLmRyYWdnaW5nfHx0aGlzLl90cmFja1N0YXJ0KGEpO3RoaXMuX3g9dGhpcy5fc3RhcnR4K01hdGgubWluKHRoaXMuX21heHgsTWF0aC5tYXgodGhpcy5fbWlueCxhLmRldGFpbC5keCoodGhpcy5faXNSVEw/LTE6MSkpKTt0aGlzLl9zZXRJbW1lZGlhdGVWYWx1ZSh0aGlzLl9jYWxjU3RlcCh0aGlzLl9jYWxjS25vYlBvc2l0aW9uKHRoaXMuX3gvdGhpcy5fdyoxMDApKSk7dGhpcy50cmFuc2xhdGUzZCh0aGlzLl9jYWxjUmF0aW8odGhpcy5pbW1lZGlhdGVWYWx1ZSkqdGhpcy5fdy10aGlzLl9rbm9ic3RhcnR4KyJweCIsMCwwLHRoaXMuJC5zbGlkZXJLbm9iKX0sX3RyYWNrRW5kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kLnNsaWRlcktub2Iuc3R5bGU7dGhpcy4kLnNsaWRlcktub2IuY2xhc3NMaXN0LnJlbW92ZSgiZHJhZ2dpbmciKTsKdGhpcy5fc2V0RHJhZ2dpbmcoITEpO3RoaXMuX3Jlc2V0S25vYigpO3RoaXMudmFsdWU9dGhpcy5pbW1lZGlhdGVWYWx1ZTthLnRyYW5zZm9ybT1hLndlYmtpdFRyYW5zZm9ybT0iIjt0aGlzLmZpcmUoImNoYW5nZSIse2NvbXBvc2VkOiEwfSl9LF9rbm9iZG93bjpmdW5jdGlvbihhKXt0aGlzLl9leHBhbmRLbm9iKCk7YS5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuZm9jdXMoKX0sX2JhcnRyYWNrOmZ1bmN0aW9uKGEpe3RoaXMuX2FsbG93QmFyRXZlbnQoYSkmJnRoaXMuX29uVHJhY2soYSl9LF9iYXJjbGljazpmdW5jdGlvbihhKXt0aGlzLl93PXRoaXMuJC5zbGlkZXJCYXIub2Zmc2V0V2lkdGg7dmFyIGM9dGhpcy4kLnNsaWRlckJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjPShhLmRldGFpbC54LWMubGVmdCkvdGhpcy5fdyoxMDA7dGhpcy5faXNSVEwmJihjPTEwMC1jKTt2YXIgZD10aGlzLnJhdGlvO3RoaXMuX3NldFRyYW5zaXRpbmcoITApO3RoaXMuX3Bvc2l0aW9uS25vYihjKTsKZD09PXRoaXMucmF0aW8mJnRoaXMuX3NldFRyYW5zaXRpbmcoITEpO3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmZpcmUoImNoYW5nZSIse2NvbXBvc2VkOiEwfSl9KTthLnByZXZlbnREZWZhdWx0KCk7dGhpcy5mb2N1cygpfSxfYmFyZG93bjpmdW5jdGlvbihhKXt0aGlzLl9hbGxvd0JhckV2ZW50KGEpJiYodGhpcy5kZWJvdW5jZSgiZXhwYW5kS25vYiIsdGhpcy5fZXhwYW5kS25vYiw2MCksdGhpcy5fYmFyY2xpY2soYSkpfSxfa25vYlRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oYSl7YS50YXJnZXQ9PT10aGlzLiQuc2xpZGVyS25vYiYmdGhpcy5fc2V0VHJhbnNpdGluZyghMSl9LF91cGRhdGVNYXJrZXJzOmZ1bmN0aW9uKGEsYyxkLGYpe2Z8fHRoaXMuX3NldE1hcmtlcnMoW10pO2M9TWF0aC5yb3VuZCgoZC1jKS90aGlzLnN0ZXApO2M+YSYmKGM9YSk7aWYoMD5jfHwhaXNGaW5pdGUoYykpYz0wO3RoaXMuX3NldE1hcmtlcnMoQXJyYXkoYykpfSxfbWVyZ2VDbGFzc2VzOmZ1bmN0aW9uKGEpe3JldHVybiBPYmplY3Qua2V5cyhhKS5maWx0ZXIoZnVuY3Rpb24oYyl7cmV0dXJuIGFbY119KS5qb2luKCIgIil9LApfZ2V0Q2xhc3NOYW1lczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tZXJnZUNsYXNzZXMoe2Rpc2FibGVkOnRoaXMuZGlzYWJsZWQscGluOnRoaXMucGluLHNuYXBzOnRoaXMuc25hcHMscmluZzp0aGlzLmltbWVkaWF0ZVZhbHVlPD10aGlzLm1pbixleHBhbmQ6dGhpcy5leHBhbmQsZHJhZ2dpbmc6dGhpcy5kcmFnZ2luZyx0cmFuc2l0aW5nOnRoaXMudHJhbnNpdGluZyxlZGl0YWJsZTp0aGlzLmVkaXRhYmxlfSl9LF9hbGxvd0JhckV2ZW50OmZ1bmN0aW9uKGEpe3JldHVybiF0aGlzLmlnbm9yZUJhclRvdWNofHxhLmRldGFpbC5zb3VyY2VFdmVudCBpbnN0YW5jZW9mIE1vdXNlRXZlbnR9LGdldCBfaXNSVEwoKXt2b2lkIDA9PT10aGlzLl9faXNSVEwmJih0aGlzLl9faXNSVEw9InJ0bCI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKS5kaXJlY3Rpb24pO3JldHVybiB0aGlzLl9faXNSVEx9LF9sZWZ0S2V5OmZ1bmN0aW9uKGEpe3RoaXMuX2lzUlRMP3RoaXMuX2luY3JlbWVudEtleShhKToKdGhpcy5fZGVjcmVtZW50S2V5KGEpfSxfcmlnaHRLZXk6ZnVuY3Rpb24oYSl7dGhpcy5faXNSVEw/dGhpcy5fZGVjcmVtZW50S2V5KGEpOnRoaXMuX2luY3JlbWVudEtleShhKX0sX2luY3JlbWVudEtleTpmdW5jdGlvbihhKXt0aGlzLmRpc2FibGVkfHwoImVuZCI9PT1hLmRldGFpbC5rZXk/dGhpcy52YWx1ZT10aGlzLm1heDp0aGlzLmluY3JlbWVudCgpLHRoaXMuZmlyZSgiY2hhbmdlIiksYS5wcmV2ZW50RGVmYXVsdCgpKX0sX2RlY3JlbWVudEtleTpmdW5jdGlvbihhKXt0aGlzLmRpc2FibGVkfHwoImhvbWUiPT09YS5kZXRhaWwua2V5P3RoaXMudmFsdWU9dGhpcy5taW46dGhpcy5kZWNyZW1lbnQoKSx0aGlzLmZpcmUoImNoYW5nZSIpLGEucHJldmVudERlZmF1bHQoKSl9LF9jaGFuZ2VWYWx1ZTpmdW5jdGlvbihhKXt0aGlzLnZhbHVlPWEudGFyZ2V0LnZhbHVlO3RoaXMuZmlyZSgiY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0sX2lucHV0S2V5RG93bjpmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSwKX2NyZWF0ZVJpcHBsZTpmdW5jdGlvbigpe3RoaXMuX3JpcHBsZUNvbnRhaW5lcj10aGlzLiQuc2xpZGVyS25vYjtyZXR1cm4gUG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9ySW1wbC5fY3JlYXRlUmlwcGxlLmNhbGwodGhpcyl9LF9mb2N1c2VkQ2hhbmdlZDpmdW5jdGlvbihhKXthJiZ0aGlzLmVuc3VyZVJpcHBsZSgpO3RoaXMuaGFzUmlwcGxlKCkmJih0aGlzLl9yaXBwbGUuc3R5bGUuZGlzcGxheT1hPyIiOiJub25lIix0aGlzLl9yaXBwbGUuaG9sZERvd249YSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtc2NhbGFyLWRhc2hib2FyZC90Zi1zbW9vdGhpbmctaW5wdXQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtc21vb3RoaW5nLWlucHV0Iixwcm9wZXJ0aWVzOntzdGVwOk51bWJlcixtYXg6TnVtYmVyLG1pbjpOdW1iZXIsd2VpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTouNixub3RpZnk6ITB9LF9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlcjp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwLG9ic2VydmVyOiJfaW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXJDaGFuZ2VkIn0sX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dDp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLG9ic2VydmVyOiJfaW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0Q2hhbmdlZCJ9fSxfdXBkYXRlV2VpZ2h0Ol8uZGVib3VuY2UoZnVuY3Rpb24oYSl7dGhpcy53ZWlnaHQ9YX0sMjUwKSxfaW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXJDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0PXRoaXMuX2ltbWVkaWF0ZVdlaWdodE51bWJlckZvclBhcGVyU2xpZGVyLnRvU3RyaW5nKCk7CnRoaXMuX3VwZGF0ZVdlaWdodC5jYWxsKHRoaXMsdGhpcy5faW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXIpfSxfaW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0Q2hhbmdlZDpmdW5jdGlvbigpezA+K3RoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dD90aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ9IjAiOjE8K3RoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dCYmKHRoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dD0iMSIpO3ZhciBhPSt0aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ7aXNOYU4oYSl8fHRoaXMuX3VwZGF0ZVdlaWdodC5jYWxsKHRoaXMsYSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtc2NhbGFyLWRhc2hib2FyZC90Zi1zY2FsYXItZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXNjYWxhci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19zaG93RG93bmxvYWRMaW5rczp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTpUby5nZXRCb29sZWFuSW5pdGlhbGl6ZXIoIl9zaG93RG93bmxvYWRMaW5rcyIse2RlZmF1bHRWYWx1ZTohMSx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxvYnNlcnZlcjoiX3Nob3dEb3dubG9hZExpbmtzT2JzZXJ2ZXIifSxfc21vb3RoaW5nV2VpZ2h0Ont0eXBlOk51bWJlcixub3RpZnk6ITAsdmFsdWU6VG8uZ2V0TnVtYmVySW5pdGlhbGl6ZXIoIl9zbW9vdGhpbmdXZWlnaHQiLHtkZWZhdWx0VmFsdWU6LjZ9KSxvYnNlcnZlcjoiX3Ntb290aGluZ1dlaWdodE9ic2VydmVyIn0sX3Ntb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVTbW9vdGhpbmdFbmFibGVkKF9zbW9vdGhpbmdXZWlnaHQpIn0sX2lnbm9yZVlPdXRsaWVyczp7dHlwZTpCb29sZWFuLHZhbHVlOlRvLmdldEJvb2xlYW5Jbml0aWFsaXplcigiX2lnbm9yZVlPdXRsaWVycyIsCntkZWZhdWx0VmFsdWU6ITAsdXNlTG9jYWxTdG9yYWdlOiEwfSksb2JzZXJ2ZXI6Il9pZ25vcmVZT3V0bGllcnNPYnNlcnZlciJ9LF94VHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6JG8uWFR5cGUuU1RFUH0sX3NlbGVjdGVkUnVuczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2NhdGVnb3JpZXNEb21SZWFkeTpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX2dldENhdGVnb3J5SXRlbUtleTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+YT0+YS50YWd9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBRby5SZXF1ZXN0TWFuYWdlcig1MCl9fSxiZWhhdmlvcnM6W1VvLkFycmF5VXBkYXRlSGVscGVyXSxvYnNlcnZlcnM6WyJfdXBkYXRlQ2F0ZWdvcmllcyhfcnVuVG9UYWdJbmZvLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyLCBfY2F0ZWdvcmllc0RvbVJlYWR5KSJdLApfc2hvd0Rvd25sb2FkTGlua3NPYnNlcnZlcjpUby5nZXRCb29sZWFuT2JzZXJ2ZXIoIl9zaG93RG93bmxvYWRMaW5rcyIse2RlZmF1bHRWYWx1ZTohMSx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxfc21vb3RoaW5nV2VpZ2h0T2JzZXJ2ZXI6VG8uZ2V0TnVtYmVyT2JzZXJ2ZXIoIl9zbW9vdGhpbmdXZWlnaHQiLHtkZWZhdWx0VmFsdWU6LjZ9KSxfaWdub3JlWU91dGxpZXJzT2JzZXJ2ZXI6VG8uZ2V0Qm9vbGVhbk9ic2VydmVyKCJfaWdub3JlWU91dGxpZXJzIix7ZGVmYXVsdFZhbHVlOiEwLHVzZUxvY2FsU3RvcmFnZTohMH0pLF9jb21wdXRlU21vb3RoaW5nRW5hYmxlZChhKXtyZXR1cm4gMDxhfSxfZ2V0Q2F0ZWdvcnlLZXkoYSl7cmV0dXJuIGEubWV0YWRhdGEudHlwZT09Um8uQ2F0ZWdvcnlUeXBlLlNFQVJDSF9SRVNVTFRTPyIiOmEubmFtZX0sX3Nob3VsZE9wZW4oYSl7cmV0dXJuIDI+PWF9LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKT0+Cnt0aGlzLl9yZWxvYWRDaGFydHMoKX0pfSxfZmV0Y2hUYWdzKCl7Y29uc3QgYT1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgic2NhbGFycyIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihjPT57aWYoIV8uaXNFcXVhbChjLHRoaXMuX3J1blRvVGFnSW5mbykpe3ZhciBkPV8ubWFwVmFsdWVzKGMsZj0+T2JqZWN0LmtleXMoZikpO2Q9UW8uZ2V0VGFncyhkKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWQubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsYyk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZENoYXJ0cygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1zY2FsYXItY2FyZCIpLmZvckVhY2goYT0+e2EucmVsb2FkKCl9KX0sX3VwZGF0ZUNhdGVnb3JpZXMoYSxjLGQpe2E9Xy5tYXBWYWx1ZXMoYSxmPT5PYmplY3Qua2V5cyhmKSk7CmM9Um8uY2F0ZWdvcml6ZVRhZ3MoYSxjLGQpO2MuZm9yRWFjaChmPT57Zi5pdGVtcz1mLml0ZW1zLm1hcChnPT4oe3RhZzpnLnRhZyxzZXJpZXM6Zy5ydW5zLm1hcChsPT4oe3J1bjpsLHRhZzpnLnRhZ30pKX0pKX0pO3RoaXMudXBkYXRlQXJyYXlQcm9wKCJfY2F0ZWdvcmllcyIsYyx0aGlzLl9nZXRDYXRlZ29yeUtleSl9LF90YWdNZXRhZGF0YShhLGMsZCl7Y29uc3QgZj1kLnRhZyxnPXt9O2Quc2VyaWVzLmZvckVhY2goKHtydW46bn0pPT57Z1tuXT1jW25dW2ZdfSk7ZD1mLnJlcGxhY2UoL1wvc2NhbGFyX3N1bW1hcnkkLywiIik7bGV0IHtkZXNjcmlwdGlvbjpsLGRpc3BsYXlOYW1lOmt9PVpvLmFnZ3JlZ2F0ZVRhZ0luZm8oZyxkKTthLm1ldGFkYXRhLnR5cGU9PVJvLkNhdGVnb3J5VHlwZS5QUkVGSVhfR1JPVVAmJmsuc3RhcnRzV2l0aChhLm5hbWUrIi8iKSYmKGs9ay5zbGljZShhLm5hbWUubGVuZ3RoKzEpKTtyZXR1cm57ZGVzY3JpcHRpb246bCxkaXNwbGF5TmFtZTprfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jdXN0b20tc2NhbGFyLWRhc2hib2FyZC90Zi1jdXN0b20tc2NhbGFyLWhlbHBlcnMuanMKdmFyIGVwOwooZnVuY3Rpb24oYSl7Y2xhc3MgY3tjb25zdHJ1Y3RvcihmLGcsbCxrLG4pe3RoaXMucnVuPWY7dGhpcy50YWc9Zzt0aGlzLm5hbWU9bDt0aGlzLnNjYWxhckRhdGE9azt0aGlzLnN5bWJvbD1ufWdldE5hbWUoKXtyZXR1cm4gdGhpcy5uYW1lfXNldERhdGEoZil7dGhpcy5zY2FsYXJEYXRhPWZ9Z2V0RGF0YSgpe3JldHVybiB0aGlzLnNjYWxhckRhdGF9Z2V0UnVuKCl7cmV0dXJuIHRoaXMucnVufWdldFRhZygpe3JldHVybiB0aGlzLnRhZ31nZXRTeW1ib2woKXtyZXR1cm4gdGhpcy5zeW1ib2x9fWEuRGF0YVNlcmllcz1jO2EuZ2VuZXJhdGVEYXRhU2VyaWVzTmFtZT1mdW5jdGlvbihmLGcpe3JldHVybmAke2d9ICgke2Z9KWB9O2NsYXNzIGR7Y29uc3RydWN0b3IoZil7dGhpcy5ydW5CYXNlZENvbG9yU2NhbGU9Zn1zY2FsZShmKXtyZXR1cm4gdGhpcy5ydW5CYXNlZENvbG9yU2NhbGUuc2NhbGUodGhpcy5wYXJzZVJ1bk5hbWUoZikpfXBhcnNlUnVuTmFtZShmKXtyZXR1cm4oZj1mLm1hdGNoKC9cKCguKilcKSQvKSk/CmZbMV06IiJ9fWEuRGF0YVNlcmllc0NvbG9yU2NhbGU9ZH0pKGVwfHwoZXA9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jdXN0b20tc2NhbGFyLWRhc2hib2FyZC90Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQiLHByb3BlcnRpZXM6e3J1bnM6QXJyYXkseFR5cGU6U3RyaW5nLGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlYWRPbmx5OiEwfSx0aXRsZTpTdHJpbmcsbWFyZ2luQ2hhcnRTZXJpZXM6QXJyYXksaWdub3JlWU91dGxpZXJzOkJvb2xlYW4scmVxdWVzdE1hbmFnZXI6T2JqZWN0LHNob3dEb3dubG9hZExpbmtzOkJvb2xlYW4sdGFnTWV0YWRhdGE6T2JqZWN0LHRvb2x0aXBTb3J0aW5nTWV0aG9kOlN0cmluZyxfY29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6bmV3IGVwLkRhdGFTZXJpZXNDb2xvclNjYWxlKHtzY2FsZTpYby5ydW5zQ29sb3JTY2FsZX0pLHJlYWRPbmx5OiEwfSxfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVUYWdGaWx0ZXIobWFyZ2luQ2hhcnRTZXJpZXMpIn0sX3RhZ0ZpbHRlckludmFsaWQ6Qm9vbGVhbixfbmFtZVRvRGF0YVNlcmllczp7dHlwZTpPYmplY3QsCnZhbHVlOigpPT4oe30pfSxfc2VyaWVzTmFtZXM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZVNlcmllc05hbWVzKF9uYW1lVG9EYXRhU2VyaWVzLCBydW5zKSJ9LF9leHBhbmRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX2xvZ1NjYWxlQWN0aXZlOkJvb2xlYW4sX2RhdGFVcmw6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gYT0+e2NvbnN0IGM9dGhpcy5fdGFnRmlsdGVyO3JldHVybiBRby5hZGRQYXJhbXMoUW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImN1c3RvbV9zY2FsYXJzIiwiL3NjYWxhcnMiKSx7dGFnOmMscnVuOmF9KX19fSxfcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXg6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfbWF0Y2hlc0xpc3RPcGVuZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3RpdGxlRGlzcGxheVN0cmluZzp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlVGl0bGVEaXNwbGF5U3RyaW5nKHRpdGxlKSJ9LApfZmlsbEFyZWE6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLHZhbHVlOntsb3dlckFjY2Vzc29yOmE9PmEubG93ZXIsaGlnaGVyQWNjZXNzb3I6YT0+YS51cHBlcn19LF90b29sdGlwQ29sdW1uczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe2NvbnN0IGE9JG8ubXVsdGlzY2FsZUZvcm1hdHRlcigkby5ZX1RPT0xUSVBfRk9STUFUVEVSX1BSRUNJU0lPTiksYz1kPT5pc05hTihkKT8iTmFOIjphKGQpO3JldHVyblt7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmQ9PmQuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWV9LHt0aXRsZToiVmFsdWUiLGV2YWx1YXRlOmQ9PmMoZC5kYXR1bS5zY2FsYXIpfSx7dGl0bGU6Ikxvd2VyIE1hcmdpbiIsZXZhbHVhdGU6ZD0+YyhkLmRhdHVtLmxvd2VyKX0se3RpdGxlOiJVcHBlciBNYXJnaW4iLGV2YWx1YXRlOmQ9PmMoZC5kYXR1bS51cHBlcil9LHt0aXRsZToiU3RlcCIsZXZhbHVhdGU6ZD0+JG8uc3RlcEZvcm1hdHRlcihkLmRhdHVtLnN0ZXApfSx7dGl0bGU6IlRpbWUiLApldmFsdWF0ZTpkPT4kby50aW1lRm9ybWF0dGVyKGQuZGF0dW0ud2FsbF90aW1lKX0se3RpdGxlOiJSZWxhdGl2ZSIsZXZhbHVhdGU6ZD0+JG8ucmVsYXRpdmVGb3JtYXR0ZXIoJG8ucmVsYXRpdmVBY2Nlc3NvcihkLmRhdHVtLC0xLGQuZGF0YXNldCkpfV19fSxfbWlzc2luZ1RhZ3M6e3R5cGU6QXJyYXksdmFsdWU6W119LF9taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9zdGVwc01pc21hdGNoOk9iamVjdH0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZUNoYXJ0KF9uYW1lVG9EYXRhU2VyaWVzKSIsIl9yZWZyZXNoRGF0YVNlcmllcyhfdGFnRmlsdGVyKSJdLHJlbG9hZCgpe3RoaXMuJC5sb2FkZXIucmVsb2FkKCl9LHJlZHJhdygpe3RoaXMuJC5sb2FkZXIucmVkcmF3KCl9LF90b2dnbGVFeHBhbmRlZCgpe3RoaXMuc2V0KCJfZXhwYW5kZWQiLCF0aGlzLl9leHBhbmRlZCk7dGhpcy5yZWRyYXcoKX0sX3RvZ2dsZUxvZ1NjYWxlKCl7dGhpcy5zZXQoIl9sb2dTY2FsZUFjdGl2ZSIsCiF0aGlzLl9sb2dTY2FsZUFjdGl2ZSl9LF9yZXNldERvbWFpbigpe2NvbnN0IGE9dGhpcy4kLmxvYWRlcjthJiZhLnJlc2V0RG9tYWluKCl9LF9jc3ZVcmwoYSxjKXtpZighYylyZXR1cm4iIjthPXRoaXMuX2Rvd25sb2FkRGF0YVVybChhLGMpO3JldHVybiBRby5hZGRQYXJhbXMoYSx7Zm9ybWF0OiJjc3YifSl9LF9qc29uVXJsKGEsYyl7aWYoIWMpcmV0dXJuIiI7YT10aGlzLl9kb3dubG9hZERhdGFVcmwoYSxjKTtyZXR1cm4gUW8uYWRkUGFyYW1zKGEse2Zvcm1hdDoianNvbiJ9KX0sX2Rvd25sb2FkRGF0YVVybChhLGMpe2E9YVtjXTthPXt0YWc6YS5nZXRUYWcoKSxydW46YS5nZXRSdW4oKX07cmV0dXJuIFFvLmFkZFBhcmFtcyhRby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvZG93bmxvYWRfZGF0YSIpLGEpfSxfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbihhKXtyZXR1cm4oYyxkLGYpPT57aWYoZi5yZWdleF92YWxpZCl7dmFyIGc9Xy5jbG9uZSh0aGlzLl9uYW1lVG9EYXRhU2VyaWVzKSwKbD1bXTtfLmZvckVhY2goYSxrPT57dmFyIG49ITEscD1mLnRhZ190b19ldmVudHNbay52YWx1ZV07Y29uc3QgcT1mLnRhZ190b19ldmVudHNbay5sb3dlcl0scj1mLnRhZ190b19ldmVudHNbay51cHBlcl07Xy5pc1VuZGVmaW5lZChwKSYmKGwucHVzaChrLnZhbHVlKSxuPSEwKTtfLmlzVW5kZWZpbmVkKHEpJiYobC5wdXNoKGsubG93ZXIpLG49ITApO18uaXNVbmRlZmluZWQocikmJihsLnB1c2goay51cHBlciksbj0hMCk7aWYoIW4pe3ZhciB0PXo9PnpbMV07aWYobj10aGlzLl9maW5kU3RlcE1pc21hdGNoKGsscC5tYXAodCkscS5tYXAodCksci5tYXAodCkpKXRoaXMuc2V0KCJfc3RlcHNNaXNtYXRjaCIsbik7ZWxzZXt2YXIgdj16PT56WzJdO249cC5tYXAoKHoseCk9Pih7d2FsbF90aW1lOm5ldyBEYXRlKDFFMyp6WzBdKSxzdGVwOnQoeiksc2NhbGFyOnYoeiksbG93ZXI6dihxW3hdKSx1cHBlcjp2KHJbeF0pfSkpO3A9ZXAuZ2VuZXJhdGVEYXRhU2VyaWVzTmFtZShkLGsudmFsdWUpOwp2YXIgeT1nW3BdO3k/eS5zZXREYXRhKG4pOihrPXRoaXMuX2NyZWF0ZU5ld0RhdGFTZXJpZXMoZCxrLnZhbHVlLHAsbiksZ1twXT1rKX19fSk7dGhpcy5zZXQoIl9uYW1lVG9EYXRhU2VyaWVzIixnKTtjPV8uZmluZEluZGV4KHRoaXMuX21pc3NpbmdUYWdzLGs9PmsucnVuPT09ZCk7aWYobC5sZW5ndGgmJjMhPWwubGVuZ3RoKXtjb25zdCBrPXtydW46ZCx0YWdzOmx9OzA8PWM/dGhpcy5zcGxpY2UoIl9taXNzaW5nVGFncyIsYywxLGspOnRoaXMucHVzaCgiX21pc3NpbmdUYWdzIixrKX1lbHNlIDA8PWMmJnRoaXMuc3BsaWNlKCJfbWlzc2luZ1RhZ3MiLGMsMSl9ZWxzZSB0aGlzLnNldCgiX3RhZ0ZpbHRlckludmFsaWQiLCEwKX19LF9maW5kU3RlcE1pc21hdGNoKGEsYyxkLGYpe3JldHVybiBfLmlzRXF1YWwoZCxjKSYmXy5pc0VxdWFsKGYsYyk/bnVsbDp7c2VyaWVzT2JqZWN0OmEsdmFsdWVTdGVwczpjLGxvd2VyU3RlcHM6ZCx1cHBlclN0ZXBzOmZ9fSxfY3JlYXRlTmV3RGF0YVNlcmllcyhhLApjLGQsZil7dGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbYV18PTA7Yz1uZXcgZXAuRGF0YVNlcmllcyhhLGMsZCxmLCRvLlNZTUJPTFNfTElTVFt0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFthXV0pO3RoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2FdPSh0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFthXSsxKSUkby5TWU1CT0xTX0xJU1QubGVuZ3RoO3JldHVybiBjfSxfdXBkYXRlQ2hhcnQoYSl7Xy5mb3JPd24oYSxjPT57dGhpcy4kLmxvYWRlci5zZXRTZXJpZXNEYXRhKGMuZ2V0TmFtZSgpLGMuZ2V0RGF0YSgpKX0pfSxfY29tcHV0ZVNlcmllc05hbWVzKCl7Y29uc3QgYT1uZXcgU2V0KHRoaXMucnVucyk7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuX25hbWVUb0RhdGFTZXJpZXMpLmZpbHRlcigoWyxjXSk9PmEuaGFzKGMucnVuKSkubWFwKChbY10pPT5jKX0sX2RldGVybWluZUNvbG9yKGEsYyl7cmV0dXJuIGEuc2NhbGUoYyl9LApfcmVmcmVzaERhdGFTZXJpZXMoKXt0aGlzLnNldCgiX25hbWVUb0RhdGFTZXJpZXMiLHt9KX0sX2NyZWF0ZVN5bWJvbEZ1bmN0aW9uKCl7cmV0dXJuIGE9PnRoaXMuX25hbWVUb0RhdGFTZXJpZXNbYV0uZ2V0U3ltYm9sKCkubWV0aG9kKCl9LF9kZXRlcm1pbmVTeW1ib2woYSxjKXtyZXR1cm4gYVtjXS5nZXRTeW1ib2woKS5jaGFyYWN0ZXJ9LF9jb21wdXRlVGFnRmlsdGVyKGEpe3JldHVybiBfLmZsYXR0ZW4oYS5tYXAoYz0+W2MudmFsdWUsYy5sb3dlcixjLnVwcGVyXSkpLm1hcChjPT4iKCIrdGhpcy5fZXNjYXBlUmVnZXhDaGFyYWN0ZXJzKGMpKyIpIikuam9pbigifCIpfSxfZXNjYXBlUmVnZXhDaGFyYWN0ZXJzKGEpe3JldHVybiBhLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCJcXCRceDI2Iil9LF9nZXRUb2dnbGVDb2xsYXBzaWJsZUljb24oYSl7cmV0dXJuIGE/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifSxfdG9nZ2xlTWF0Y2hlc09wZW4oKXt0aGlzLnNldCgiX21hdGNoZXNMaXN0T3BlbmVkIiwKIXRoaXMuX21hdGNoZXNMaXN0T3BlbmVkKX0sX2NvbXB1dGVUaXRsZURpc3BsYXlTdHJpbmcoYSl7cmV0dXJuIGF8fCJ1bnRpdGxlZCJ9LF9zZXBhcmF0ZVdpdGhDb21tYXMoYSl7cmV0dXJuIGEuam9pbigiLCAiKX0sX3RvZ2dsZU1pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuKCl7dGhpcy5zZXQoIl9taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkIiwhdGhpcy5fbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZCl9LF9tYXRjaExpc3RFbnRyeUNvbG9yVXBkYXRlZCgpe2NvbnN0IGE9dGhpcy4kJCgiI21hdGNoLWxpc3QtcmVwZWF0Iik7YSYmdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5tYXRjaC1saXN0LWVudHJ5IikuZm9yRWFjaChjPT57Y29uc3QgZD1hLml0ZW1Gb3JFbGVtZW50KGMpO2Muc3R5bGUuY29sb3I9dGhpcy5fZGV0ZXJtaW5lQ29sb3IodGhpcy5fY29sb3JTY2FsZSxkKX0pfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkL3RmLWN1c3RvbS1zY2FsYXItbXVsdGktbGluZS1jaGFydC1jYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWN1c3RvbS1zY2FsYXItbXVsdGktbGluZS1jaGFydC1jYXJkIixwcm9wZXJ0aWVzOntydW5zOkFycmF5LHhUeXBlOlN0cmluZyxhY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxyZWFkT25seTohMH0sdGl0bGU6U3RyaW5nLHRhZ1JlZ2V4ZXM6QXJyYXksaWdub3JlWU91dGxpZXJzOkJvb2xlYW4scmVxdWVzdE1hbmFnZXI6T2JqZWN0LHNob3dEb3dubG9hZExpbmtzOkJvb2xlYW4sc21vb3RoaW5nRW5hYmxlZDpCb29sZWFuLHNtb290aGluZ1dlaWdodDpOdW1iZXIsdGFnTWV0YWRhdGE6T2JqZWN0LHRvb2x0aXBTb3J0aW5nTWV0aG9kOlN0cmluZyxfY29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6bmV3IGVwLkRhdGFTZXJpZXNDb2xvclNjYWxlKHtzY2FsZTpYby5ydW5zQ29sb3JTY2FsZX0pLHJlYWRPbmx5OiEwfSxfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVUYWdGaWx0ZXIodGFnUmVnZXhlcykifSxfbmFtZVRvRGF0YVNlcmllczp7dHlwZTpPYmplY3QsCnZhbHVlOigpPT4oe30pfSxfc2VyaWVzTmFtZXM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZVNlcmllc05hbWVzKF9uYW1lVG9EYXRhU2VyaWVzLCBydW5zKSJ9LF9leHBhbmRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX2xvZ1NjYWxlQWN0aXZlOkJvb2xlYW4sX2RhdGFVcmw6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gYT0+e2NvbnN0IGM9dGhpcy5fdGFnRmlsdGVyO3JldHVybiBRby5hZGRQYXJhbXMoUW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImN1c3RvbV9zY2FsYXJzIiwiL3NjYWxhcnMiKSx7dGFnOmMscnVuOmF9KX19fSxfcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXg6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfbWF0Y2hlc0xpc3RPcGVuZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3RpdGxlRGlzcGxheVN0cmluZzp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlVGl0bGVEaXNwbGF5U3RyaW5nKHRpdGxlKSJ9fSwKb2JzZXJ2ZXJzOlsiX3VwZGF0ZUNoYXJ0KF9uYW1lVG9EYXRhU2VyaWVzKSIsIl9yZWZyZXNoRGF0YVNlcmllcyhfdGFnRmlsdGVyKSJdLHJlbG9hZCgpe3RoaXMuJC5sb2FkZXIucmVsb2FkKCl9LHJlZHJhdygpe3RoaXMuJC5sb2FkZXIucmVkcmF3KCl9LF90b2dnbGVFeHBhbmRlZCgpe3RoaXMuc2V0KCJfZXhwYW5kZWQiLCF0aGlzLl9leHBhbmRlZCk7dGhpcy5yZWRyYXcoKX0sX3RvZ2dsZUxvZ1NjYWxlKCl7dGhpcy5zZXQoIl9sb2dTY2FsZUFjdGl2ZSIsIXRoaXMuX2xvZ1NjYWxlQWN0aXZlKX0sX3Jlc2V0RG9tYWluKCl7Y29uc3QgYT10aGlzLiQubG9hZGVyO2EmJmEucmVzZXREb21haW4oKX0sX2NzdlVybChhLGMpe2lmKCFjKXJldHVybiIiO2E9dGhpcy5fZG93bmxvYWREYXRhVXJsKGEsYyk7cmV0dXJuIFFvLmFkZFBhcmFtcyhhLHtmb3JtYXQ6ImNzdiJ9KX0sX2pzb25VcmwoYSxjKXtpZighYylyZXR1cm4iIjthPXRoaXMuX2Rvd25sb2FkRGF0YVVybChhLGMpO3JldHVybiBRby5hZGRQYXJhbXMoYSwKe2Zvcm1hdDoianNvbiJ9KX0sX2Rvd25sb2FkRGF0YVVybChhLGMpe2E9YVtjXTthPXt0YWc6YS5nZXRUYWcoKSxydW46YS5nZXRSdW4oKX07cmV0dXJuIFFvLmFkZFBhcmFtcyhRby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvZG93bmxvYWRfZGF0YSIpLGEpfSxfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpe3JldHVybihhLGMsZCk9PntpZihkLnJlZ2V4X3ZhbGlkKXtjb25zdCBmPV8uY2xvbmUodGhpcy5fbmFtZVRvRGF0YVNlcmllcyk7Xy5mb3JPd24oZC50YWdfdG9fZXZlbnRzLChnLGwpPT57Y29uc3Qgaz1nLm1hcChwPT4oe3dhbGxfdGltZTpuZXcgRGF0ZSgxRTMqcFswXSksc3RlcDpwWzFdLHNjYWxhcjpwWzJdfSkpO2c9ZXAuZ2VuZXJhdGVEYXRhU2VyaWVzTmFtZShjLGwpO2NvbnN0IG49ZltnXTtuP24uc2V0RGF0YShrKTooXy5pc1VuZGVmaW5lZCh0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtjXSkmJih0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtjXT0KMCksbD1uZXcgZXAuRGF0YVNlcmllcyhjLGwsZyxrLCRvLlNZTUJPTFNfTElTVFt0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtjXV0pLGZbZ109bCx0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtjXT0odGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbY10rMSklJG8uU1lNQk9MU19MSVNULmxlbmd0aCl9KTt0aGlzLnNldCgiX25hbWVUb0RhdGFTZXJpZXMiLGYpfX19LF91cGRhdGVDaGFydChhKXtPYmplY3QuZW50cmllcyhhKS5mb3JFYWNoKChbYyxkXSk9Pnt0aGlzLiQubG9hZGVyLnNldFNlcmllc0RhdGEoYyxkLmdldERhdGEoKSl9KX0sX2NvbXB1dGVTZWxlY3RlZFJ1bnNTZXQoYSl7Y29uc3QgYz17fTtfLmZvckVhY2goYSxkPT57Y1tkXT0xfSk7cmV0dXJuIGN9LF9jb21wdXRlU2VyaWVzTmFtZXMoKXtjb25zdCBhPW5ldyBTZXQodGhpcy5ydW5zKTtyZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5fbmFtZVRvRGF0YVNlcmllcykuZmlsdGVyKChbLApjXSk9PmEuaGFzKGMucnVuKSkubWFwKChbY10pPT5jKX0sX2RldGVybWluZUNvbG9yKGEsYyl7cmV0dXJuIGEuc2NhbGUoYyl9LF9yZWZyZXNoRGF0YVNlcmllcygpe3RoaXMuc2V0KCJfbmFtZVRvRGF0YVNlcmllcyIse30pfSxfY3JlYXRlU3ltYm9sRnVuY3Rpb24oKXtyZXR1cm4gYT0+dGhpcy5fbmFtZVRvRGF0YVNlcmllc1thXS5nZXRTeW1ib2woKS5tZXRob2QoKX0sX2RldGVybWluZVN5bWJvbChhLGMpe3JldHVybiBhW2NdLmdldFN5bWJvbCgpLmNoYXJhY3Rlcn0sX2NvbXB1dGVUYWdGaWx0ZXIoYSl7cmV0dXJuIDE9PT1hLmxlbmd0aD9hWzBdOmEubWFwKGM9PiIoIitjKyIpIikuam9pbigifCIpfSxfZ2V0VG9nZ2xlTWF0Y2hlc0ljb24oYSl7cmV0dXJuIGE/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifSxfdG9nZ2xlTWF0Y2hlc09wZW4oKXt0aGlzLnNldCgiX21hdGNoZXNMaXN0T3BlbmVkIiwhdGhpcy5fbWF0Y2hlc0xpc3RPcGVuZWQpfSxfY29tcHV0ZVRpdGxlRGlzcGxheVN0cmluZyhhKXtyZXR1cm4gYXx8CiJ1bnRpdGxlZCJ9LF9tYXRjaExpc3RFbnRyeUNvbG9yVXBkYXRlZCgpe2NvbnN0IGE9dGhpcy4kJCgiI21hdGNoLWxpc3QtcmVwZWF0Iik7YSYmdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5tYXRjaC1saXN0LWVudHJ5IikuZm9yRWFjaChjPT57Y29uc3QgZD1hLml0ZW1Gb3JFbGVtZW50KGMpO2Muc3R5bGUuY29sb3I9dGhpcy5fZGV0ZXJtaW5lQ29sb3IodGhpcy5fY29sb3JTY2FsZSxkKX0pfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkL3RmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUW8uUmVxdWVzdE1hbmFnZXIoNTApfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFFvLkNhbmNlbGxlcn0sX3NlbGVjdGVkUnVuczpBcnJheSxfc2hvd0Rvd25sb2FkTGlua3M6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAsdmFsdWU6VG8uZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJfc2hvd0Rvd25sb2FkTGlua3MiLHtkZWZhdWx0VmFsdWU6ITEsdXNlTG9jYWxTdG9yYWdlOiEwfSksb2JzZXJ2ZXI6Il9zaG93RG93bmxvYWRMaW5rc09ic2VydmVyIn0sX3Ntb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVTbW9vdGhpbmdFbmFibGVkKF9zbW9vdGhpbmdXZWlnaHQpIn0sX3Ntb290aGluZ1dlaWdodDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwLHZhbHVlOlRvLmdldE51bWJlckluaXRpYWxpemVyKCJfc21vb3RoaW5nV2VpZ2h0IiwKe2RlZmF1bHRWYWx1ZTouNn0pLG9ic2VydmVyOiJfc21vb3RoaW5nV2VpZ2h0T2JzZXJ2ZXIifSxfaWdub3JlWU91dGxpZXJzOnt0eXBlOkJvb2xlYW4sdmFsdWU6VG8uZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJfaWdub3JlWU91dGxpZXJzIix7ZGVmYXVsdFZhbHVlOiEwLHVzZUxvY2FsU3RvcmFnZTohMH0pLG9ic2VydmVyOiJfaWdub3JlWU91dGxpZXJzT2JzZXJ2ZXIifSxfeFR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGVwIn0sX2xheW91dDpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX2xheW91dCkifSxfb3BlbmVkQ2F0ZWdvcmllczp7dHlwZTpPYmplY3R9LF9hY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxyZWFkT25seTohMH19LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7Y29uc3QgYT1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5zTGlzdGluZygpLGM9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKGQ9Pgp7ZC5jYW5jZWxsZWR8fCh0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsIWQudmFsdWUuY3VzdG9tX3NjYWxhcnMpLHRoaXMuX2RhdGFOb3RGb3VuZHx8dGhpcy5fcmV0cmlldmVMYXlvdXRBbmREYXRhKCkpfSk7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChhKS50aGVuKGMpfSxfcmVsb2FkQ2hhcnRzKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQsIHRmLWN1c3RvbS1zY2FsYXItbXVsdGktbGluZS1jaGFydC1jYXJkIikuZm9yRWFjaChhPT57YS5yZWxvYWQoKX0pfSxfcmV0cmlldmVMYXlvdXRBbmREYXRhKCl7Y29uc3QgYT1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvbGF5b3V0IiksYz10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoZD0+e2QuY2FuY2VsbGVkfHwodGhpcy5zZXQoIl9sYXlvdXQiLGQudmFsdWUpLHRoaXMuX2RhdGFOb3RGb3VuZHx8dGhpcy5fcmVsb2FkQ2hhcnRzKCkpfSk7CnRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihjKX0sX3Nob3dEb3dubG9hZExpbmtzT2JzZXJ2ZXI6VG8uZ2V0Qm9vbGVhbk9ic2VydmVyKCJfc2hvd0Rvd25sb2FkTGlua3MiLHtkZWZhdWx0VmFsdWU6ITEsdXNlTG9jYWxTdG9yYWdlOiEwfSksX3Ntb290aGluZ1dlaWdodE9ic2VydmVyOlRvLmdldE51bWJlck9ic2VydmVyKCJfc21vb3RoaW5nV2VpZ2h0Iix7ZGVmYXVsdFZhbHVlOi42fSksX2lnbm9yZVlPdXRsaWVyc09ic2VydmVyOlRvLmdldEJvb2xlYW5PYnNlcnZlcigiX2lnbm9yZVlPdXRsaWVycyIse2RlZmF1bHRWYWx1ZTohMCx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxfY29tcHV0ZVNtb290aGluZ0VuYWJsZWQoYSl7cmV0dXJuIDA8YX0sX21ha2VDYXRlZ29yaWVzKGEpe2lmKCFhLmNhdGVnb3J5KXJldHVybltdO2xldCBjPSExO3RoaXMuX29wZW5lZENhdGVnb3JpZXN8fChjPSEwLHRoaXMuX29wZW5lZENhdGVnb3JpZXM9e30pO3JldHVybiBhLmNhdGVnb3J5Lm1hcChkPT4Ke2MmJiFkLmNsb3NlZCYmKHRoaXMuX29wZW5lZENhdGVnb3JpZXNbZC50aXRsZV09ITApO3JldHVybntuYW1lOmQudGl0bGUsaXRlbXM6ZC5jaGFydCxtZXRhZGF0YTp7b3BlbmVkOiEhdGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1tkLnRpdGxlXX19fSl9LF9jYXRlZ29yeU9wZW5lZFRvZ2dsZWQoYSl7YT1hLnRhcmdldDthLm9wZW5lZD90aGlzLl9vcGVuZWRDYXRlZ29yaWVzW2EuY2F0ZWdvcnkubmFtZV09ITA6ZGVsZXRlIHRoaXMuX29wZW5lZENhdGVnb3JpZXNbYS5jYXRlZ29yeS5uYW1lXX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1pbWFnZS1kYXNoYm9hcmQvdGYtaW1hZ2UtbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWltYWdlLWxvYWRlciIscHJvcGVydGllczp7cnVuOlN0cmluZyx0YWc6U3RyaW5nLHNhbXBsZTpOdW1iZXIsb2ZTYW1wbGVzOk51bWJlcix0YWdNZXRhZGF0YTpPYmplY3QsX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0sYWN0dWFsU2l6ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sYnJpZ2h0bmVzc0FkanVzdG1lbnQ6e3R5cGU6TnVtYmVyLHZhbHVlOi41fSxjb250cmFzdFBlcmNlbnRhZ2U6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxfbWV0YWRhdGFDYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUW8uQ2FuY2VsbGVyfSxfaW1hZ2VDYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUW8uQ2FuY2VsbGVyfSxfc3RlcHM6e3R5cGU6QXJyYXksdmFsdWU6W10sbm90aWZ5OiEwfSxfc3RlcEluZGV4Ont0eXBlOk51bWJlciwKbm90aWZ5OiEwfSxfY3VycmVudFN0ZXA6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRTdGVwKF9zdGVwcywgX3N0ZXBJbmRleCkifSxfaGFzQXRMZWFzdE9uZVN0ZXA6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNBdExlYXN0T25lU3RlcChfc3RlcHMpIn0sX2hhc011bHRpcGxlU3RlcHM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNNdWx0aXBsZVN0ZXBzKF9zdGVwcykifSxfc3RlcFZhbHVlOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVTdGVwVmFsdWUoX2N1cnJlbnRTdGVwKSJ9LF9jdXJyZW50V2FsbFRpbWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRXYWxsVGltZShfY3VycmVudFN0ZXApIn0sX21heFN0ZXBJbmRleDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4U3RlcEluZGV4KF9zdGVwcykifSxfc2FtcGxlVGV4dDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlU2FtcGxlVGV4dChzYW1wbGUpIn0sCl9oYXNNdWx0aXBsZVNhbXBsZXM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNNdWx0aXBsZVNhbXBsZXMob2ZTYW1wbGVzKSJ9LF9pc0ltYWdlTG9hZGluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sb2JzZXJ2ZXJzOlsicmVsb2FkKHJ1biwgdGFnKSIsIl91cGRhdGVJbWFnZVVybChfY3VycmVudFN0ZXAsIGJyaWdodG5lc3NBZGp1c3RtZW50LCBjb250cmFzdFBlcmNlbnRhZ2UpIl0sX2NvbXB1dGVSdW5Db2xvcihhKXtyZXR1cm4gWG8ucnVuc0NvbG9yU2NhbGUoYSl9LF9jb21wdXRlSGFzQXRMZWFzdE9uZVN0ZXAoYSl7cmV0dXJuISFhJiYwPGEubGVuZ3RofSxfY29tcHV0ZUhhc011bHRpcGxlU3RlcHMoYSl7cmV0dXJuISFhJiYxPGEubGVuZ3RofSxfY29tcHV0ZUN1cnJlbnRTdGVwKGEsYyl7cmV0dXJuIGFbY118fG51bGx9LF9jb21wdXRlU3RlcFZhbHVlKGEpe3JldHVybiBhP2Euc3RlcDowfSxfY29tcHV0ZUN1cnJlbnRXYWxsVGltZShhKXtyZXR1cm4gYT8KZHAuZm9ybWF0RGF0ZShhLndhbGxfdGltZSk6IiJ9LF9jb21wdXRlTWF4U3RlcEluZGV4KGEpe3JldHVybiBhLmxlbmd0aC0xfSxfY29tcHV0ZVNhbXBsZVRleHQoYSl7cmV0dXJuYCR7YSsxfWB9LF9jb21wdXRlSGFzTXVsdGlwbGVTYW1wbGVzKGEpe3JldHVybiAxPGF9LF9nZXRBcmlhRXhwYW5kZWQoKXtyZXR1cm4gdGhpcy5hY3R1YWxTaXplPyJ0cnVlIjoiZmFsc2UifSxhdHRhY2hlZCgpe3RoaXMuX2F0dGFjaGVkPSEwO3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe2lmKHRoaXMuX2F0dGFjaGVkKXt0aGlzLl9tZXRhZGF0YUNhbmNlbGxlci5jYW5jZWxBbGwoKTt2YXIgYT1Rby5hZGRQYXJhbXMoUW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImltYWdlcyIsIi9pbWFnZXMiKSx7dGFnOnRoaXMudGFnLHJ1bjp0aGlzLnJ1bixzYW1wbGU6dGhpcy5zYW1wbGV9KSxjPXRoaXMuX21ldGFkYXRhQ2FuY2VsbGVyLmNhbmNlbGxhYmxlKGQ9PntkLmNhbmNlbGxlZHx8KGQ9ZC52YWx1ZS5tYXAodGhpcy5fY3JlYXRlU3RlcERhdHVtLmJpbmQodGhpcykpLAp0aGlzLnNldCgiX3N0ZXBzIixkKSx0aGlzLnNldCgiX3N0ZXBJbmRleCIsZC5sZW5ndGgtMSkpfSk7dGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGEpLnRoZW4oYyl9fSxfY3JlYXRlU3RlcERhdHVtKGEpe2xldCBjPVFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJpbWFnZXMiLCIvaW5kaXZpZHVhbEltYWdlIik7Yz1Rby5hZGRQYXJhbXMoYyx7dHM6YS53YWxsX3RpbWV9KTtjKz0iXHgyNiIrYS5xdWVyeTtyZXR1cm57d2lkdGg6YS53aWR0aCxoZWlnaHQ6YS5oZWlnaHQsd2FsbF90aW1lOm5ldyBEYXRlKDFFMyphLndhbGxfdGltZSksc3RlcDphLnN0ZXAsdXJsOmN9fSxfdXBkYXRlSW1hZ2VVcmwoYSxjLGQpe2lmKGEpe3ZhciBmPW5ldyBJbWFnZTt0aGlzLl9pbWFnZUNhbmNlbGxlci5jYW5jZWxBbGwoKTtmLm9ubG9hZD1mLm9uZXJyb3I9dGhpcy5faW1hZ2VDYW5jZWxsZXIuY2FuY2VsbGFibGUoZz0+e2cuY2FuY2VsbGVkfHwoZz10aGlzLiQkKCIjbWFpbi1pbWFnZS1jb250YWluZXIiKSwKZy5pbm5lckhUTUw9IiIsUG9seW1lci5kb20oZykuYXBwZW5kQ2hpbGQoZiksdGhpcy5zZXQoIl9pc0ltYWdlTG9hZGluZyIsITEpKX0pLmJpbmQodGhpcyk7Zi5zdHlsZS5maWx0ZXI9YGNvbnRyYXN0KCR7ZH0lKSBgO2Yuc3R5bGUuZmlsdGVyKz1gYnJpZ2h0bmVzcygke2N9KWA7dGhpcy5zZXQoIl9pc0ltYWdlTG9hZGluZyIsITApO2Yuc3JjPWEudXJsfX0sX2hhbmRsZVRhcCgpe3RoaXMuc2V0KCJhY3R1YWxTaXplIiwhdGhpcy5hY3R1YWxTaXplKX0sX3RvTG9jYWxlU3RyaW5nKGEpe3JldHVybiBhLnRvTG9jYWxlU3RyaW5nKCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1hZ2UtZGFzaGJvYXJkL3RmLWltYWdlLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1pbWFnZS1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19zZWxlY3RlZFJ1bnM6QXJyYXksX3J1blRvVGFnSW5mbzpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF9hY3R1YWxTaXplOkJvb2xlYW4sX2RlZmF1bHRCcmlnaHRuZXNzQWRqdXN0bWVudDp7dHlwZTpOdW1iZXIsdmFsdWU6MSxyZWFkT25seTohMH0sX2RlZmF1bHRDb250cmFzdFBlcmNlbnRhZ2U6e3R5cGU6TnVtYmVyLHZhbHVlOjEwMCxyZWFkT25seTohMH0sX2JyaWdodG5lc3NBZGp1c3RtZW50Ont0eXBlOk51bWJlcix2YWx1ZToxfSxfY29udHJhc3RQZXJjZW50YWdlOnt0eXBlOk51bWJlcix2YWx1ZToxMDB9LF90YWdGaWx0ZXI6U3RyaW5nLF9icmlnaHRuZXNzSXNEZWZhdWx0Ont0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQnJpZ2h0bmVzc0lzRGVmYXVsdChfYnJpZ2h0bmVzc0FkanVzdG1lbnQpIn0sX2NvbnRyYXN0SXNEZWZhdWx0Ont0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQ29udHJhc3RJc0RlZmF1bHQoX2NvbnRyYXN0UGVyY2VudGFnZSkifSwKX2NhdGVnb3JpZXNEb21SZWFkeTpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnSW5mbywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlciwgX2NhdGVnb3JpZXNEb21SZWFkeSkifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUW8uUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRJbWFnZXMoKX0pfSxfZmV0Y2hUYWdzKCl7Y29uc3QgYT1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiaW1hZ2VzIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChhKS50aGVuKGM9PntpZighXy5pc0VxdWFsKGMsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGQ9Xy5tYXBWYWx1ZXMoYyxmPT5PYmplY3Qua2V5cyhmKSk7ZD1Rby5nZXRUYWdzKGQpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwKMD09PWQubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsYyk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZEltYWdlcygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1pbWFnZS1sb2FkZXIiKS5mb3JFYWNoKGE9PnthLnJlbG9hZCgpfSl9LF9zaG91bGRPcGVuKGEpe3JldHVybiAyPj1hfSxfcmVzZXRCcmlnaHRuZXNzKCl7dGhpcy5fYnJpZ2h0bmVzc0FkanVzdG1lbnQ9dGhpcy5fZGVmYXVsdEJyaWdodG5lc3NBZGp1c3RtZW50fSxfcmVzZXRDb250cmFzdCgpe3RoaXMuX2NvbnRyYXN0UGVyY2VudGFnZT10aGlzLl9kZWZhdWx0Q29udHJhc3RQZXJjZW50YWdlfSxfY29tcHV0ZUJyaWdodG5lc3NJc0RlZmF1bHQoYSl7cmV0dXJuIGE9PT10aGlzLl9kZWZhdWx0QnJpZ2h0bmVzc0FkanVzdG1lbnR9LF9jb21wdXRlQ29udHJhc3RJc0RlZmF1bHQoYSl7cmV0dXJuIGE9PT10aGlzLl9kZWZhdWx0Q29udHJhc3RQZXJjZW50YWdlfSwKX21ha2VDYXRlZ29yaWVzKGEsYyxkKXtmdW5jdGlvbiBmKGwpe2NvbnN0IGs9YVtsLnJ1bl1bbC50YWddLnNhbXBsZXM7cmV0dXJuIF8ucmFuZ2UoaykubWFwKG49Pk9iamVjdC5hc3NpZ24oe30sbCx7c2FtcGxlOm4sb2ZTYW1wbGVzOmt9KSl9Y29uc3QgZz1fLm1hcFZhbHVlcyhhLGw9Pk9iamVjdC5rZXlzKGwpKTtyZXR1cm4gUm8uY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhnLGMsZCkubWFwKGw9Pk9iamVjdC5hc3NpZ24oe30sbCx7aXRlbXM6W10uY29uY2F0LmFwcGx5KFtdLGwuaXRlbXMubWFwKGYpKX0pKX0sX3RhZ01ldGFkYXRhKGEsYyxkKXtyZXR1cm4gYVtjXVtkXX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1hdWRpby1kYXNoYm9hcmQvdGYtYXVkaW8tbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWF1ZGlvLWxvYWRlciIscHJvcGVydGllczp7cnVuOlN0cmluZyx0YWc6U3RyaW5nLHNhbXBsZTpOdW1iZXIsdG90YWxTYW1wbGVzOk51bWJlcix0YWdNZXRhZGF0YTpPYmplY3QsX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0scmVxdWVzdE1hbmFnZXI6T2JqZWN0LF9tZXRhZGF0YUNhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBRby5DYW5jZWxsZXJ9LF9zdGVwczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9zdGVwSW5kZXg6TnVtYmVyLF9oYXNBdExlYXN0T25lU3RlcDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc0F0TGVhc3RPbmVTdGVwKF9zdGVwcykifSxfaGFzTXVsdGlwbGVTdGVwczp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlU3RlcHMoX3N0ZXBzKSJ9LF9jdXJyZW50RGF0dW06e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnREYXR1bShfc3RlcHMsIF9zdGVwSW5kZXgpIn0sCl9tYXhTdGVwSW5kZXg6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZU1heFN0ZXBJbmRleChfc3RlcHMpIn0sX3NhbXBsZVRleHQ6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVNhbXBsZVRleHQoc2FtcGxlKSJ9LF9oYXNNdWx0aXBsZVNhbXBsZXM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNNdWx0aXBsZVNhbXBsZXModG90YWxTYW1wbGVzKSJ9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVuLCB0YWcpIl0sX2NvbXB1dGVSdW5Db2xvcihhKXtyZXR1cm4gWG8ucnVuc0NvbG9yU2NhbGUoYSl9LF9jb21wdXRlSGFzQXRMZWFzdE9uZVN0ZXAoYSl7cmV0dXJuISFhJiYwPGEubGVuZ3RofSxfY29tcHV0ZUhhc011bHRpcGxlU3RlcHMoYSl7cmV0dXJuISFhJiYxPGEubGVuZ3RofSxfY29tcHV0ZU1heFN0ZXBJbmRleChhKXtyZXR1cm4gYS5sZW5ndGgtMX0sX2NvbXB1dGVDdXJyZW50RGF0dW0oYSxjKXtyZXR1cm4gYVtjXX0sX2NvbXB1dGVTYW1wbGVUZXh0KGEpe3JldHVybmAke2ErCjF9YH0sX2NvbXB1dGVIYXNNdWx0aXBsZVNhbXBsZXMoYSl7cmV0dXJuIDE8YX0sYXR0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMDt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXtpZih0aGlzLl9hdHRhY2hlZCl7dGhpcy5fbWV0YWRhdGFDYW5jZWxsZXIuY2FuY2VsQWxsKCk7dmFyIGE9UW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImF1ZGlvIiwiL2F1ZGlvIixuZXcgVVJMU2VhcmNoUGFyYW1zKHt0YWc6dGhpcy50YWcscnVuOnRoaXMucnVuLHNhbXBsZTp0aGlzLnNhbXBsZX0pKSxjPXRoaXMuX21ldGFkYXRhQ2FuY2VsbGVyLmNhbmNlbGxhYmxlKGQ9PntkLmNhbmNlbGxlZHx8KGQ9ZC52YWx1ZS5tYXAodGhpcy5fY3JlYXRlU3RlcERhdHVtLmJpbmQodGhpcykpLHRoaXMuc2V0KCJfc3RlcHMiLGQpLHRoaXMuc2V0KCJfc3RlcEluZGV4IixkLmxlbmd0aC0xKSl9KTt0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihjKX19LF9jcmVhdGVTdGVwRGF0dW0oYSl7dmFyIGM9Cm5ldyBVUkxTZWFyY2hQYXJhbXMoYS5xdWVyeSk7Yy5hcHBlbmQoInRzIixhLndhbGxfdGltZSk7Yz1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYXVkaW8iLCIvaW5kaXZpZHVhbEF1ZGlvIixjKTtyZXR1cm57d2FsbF90aW1lOmRwLmZvcm1hdERhdGUobmV3IERhdGUoMUUzKmEud2FsbF90aW1lKSksc3RlcDphLnN0ZXAsbGFiZWw6YS5sYWJlbCxjb250ZW50VHlwZTphLmNvbnRlbnRUeXBlLHVybDpjfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1hdWRpby1kYXNoYm9hcmQvdGYtYXVkaW8tZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWF1ZGlvLWRhc2hib2FyZCIscHJvcGVydGllczp7X3NlbGVjdGVkUnVuczpBcnJheSxfcnVuVG9UYWdJbmZvOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnSW5mbywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlcikifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUW8uUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRBdWRpbygpfSl9LF9mZXRjaFRhZ3MoKXtjb25zdCBhPVFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJhdWRpbyIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihjPT57aWYoIV8uaXNFcXVhbChjLAp0aGlzLl9ydW5Ub1RhZ0luZm8pKXt2YXIgZD1fLm1hcFZhbHVlcyhjLGY9Pk9iamVjdC5rZXlzKGYpKTtkPVFvLmdldFRhZ3MoZCk7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1kLmxlbmd0aCk7dGhpcy5zZXQoIl9ydW5Ub1RhZ0luZm8iLGMpfX0pfSxfcmVsb2FkQXVkaW8oKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtYXVkaW8tbG9hZGVyIikuZm9yRWFjaChhPT57YS5yZWxvYWQoKX0pfSxfc2hvdWxkT3BlbihhKXtyZXR1cm4gMj49YX0sX21ha2VDYXRlZ29yaWVzKGEsYyxkKXtmdW5jdGlvbiBmKGwpe2NvbnN0IGs9YVtsLnJ1bl1bbC50YWddLnNhbXBsZXM7cmV0dXJuIF8ucmFuZ2UoaykubWFwKG49Pk9iamVjdC5hc3NpZ24oe30sbCx7c2FtcGxlOm4sdG90YWxTYW1wbGVzOmt9KSl9Y29uc3QgZz1fLm1hcFZhbHVlcyhhLGw9Pk9iamVjdC5rZXlzKGwpKTtyZXR1cm4gUm8uY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhnLGMsZCkubWFwKGw9Pk9iamVjdC5hc3NpZ24oe30sCmwse2l0ZW1zOltdLmNvbmNhdC5hcHBseShbXSxsLml0ZW1zLm1hcChmKSl9KSl9LF90YWdNZXRhZGF0YShhLGMsZCl7cmV0dXJuIGFbY11bZF19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYS9pcm9uLWF1dG9ncm93LXRleHRhcmVhLmh0bWwuanMKUG9seW1lcih7aXM6Imlyb24tYXV0b2dyb3ctdGV4dGFyZWEiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvcixQb2x5bWVyLklyb25Db250cm9sU3RhdGVdLHByb3BlcnRpZXM6e3ZhbHVlOntvYnNlcnZlcjoiX3ZhbHVlQ2hhbmdlZCIsdHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxiaW5kVmFsdWU6e29ic2VydmVyOiJfYmluZFZhbHVlQ2hhbmdlZCIsdHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxyb3dzOnt0eXBlOk51bWJlcix2YWx1ZToxLG9ic2VydmVyOiJfdXBkYXRlQ2FjaGVkIn0sbWF4Um93czp7dHlwZTpOdW1iZXIsdmFsdWU6MCxvYnNlcnZlcjoiX3VwZGF0ZUNhY2hlZCJ9LGF1dG9jb21wbGV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im9mZiJ9LGF1dG9mb2N1czp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbnB1dG1vZGU6e3R5cGU6U3RyaW5nfSxwbGFjZWhvbGRlcjp7dHlwZTpTdHJpbmd9LHJlYWRvbmx5Ont0eXBlOlN0cmluZ30scmVxdWlyZWQ6e3R5cGU6Qm9vbGVhbn0sCm1pbmxlbmd0aDp7dHlwZTpOdW1iZXJ9LG1heGxlbmd0aDp7dHlwZTpOdW1iZXJ9LGxhYmVsOnt0eXBlOlN0cmluZ319LGxpc3RlbmVyczp7aW5wdXQ6Il9vbklucHV0In0sZ2V0IHRleHRhcmVhKCl7cmV0dXJuIHRoaXMuJC50ZXh0YXJlYX0sZ2V0IHNlbGVjdGlvblN0YXJ0KCl7cmV0dXJuIHRoaXMuJC50ZXh0YXJlYS5zZWxlY3Rpb25TdGFydH0sZ2V0IHNlbGVjdGlvbkVuZCgpe3JldHVybiB0aGlzLiQudGV4dGFyZWEuc2VsZWN0aW9uRW5kfSxzZXQgc2VsZWN0aW9uU3RhcnQoYSl7dGhpcy4kLnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0PWF9LHNldCBzZWxlY3Rpb25FbmQoYSl7dGhpcy4kLnRleHRhcmVhLnNlbGVjdGlvbkVuZD1hfSxhdHRhY2hlZDpmdW5jdGlvbigpe25hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQKD86W29hXWR8aG9uZSkvKSYmKHRoaXMuJC50ZXh0YXJlYS5zdHlsZS5tYXJnaW5MZWZ0PSItM3B4Iil9LHZhbGlkYXRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kLnRleHRhcmVhLnZhbGlkaXR5LnZhbGlkOwphJiYodGhpcy5yZXF1aXJlZCYmIiI9PT10aGlzLnZhbHVlP2E9ITE6dGhpcy5oYXNWYWxpZGF0b3IoKSYmKGE9UG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvci52YWxpZGF0ZS5jYWxsKHRoaXMsdGhpcy52YWx1ZSkpKTt0aGlzLmludmFsaWQ9IWE7dGhpcy5maXJlKCJpcm9uLWlucHV0LXZhbGlkYXRlIik7cmV0dXJuIGF9LF9iaW5kVmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMudmFsdWU9YX0sX3ZhbHVlQ2hhbmdlZDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnRleHRhcmVhO2MmJihjLnZhbHVlIT09YSYmKGMudmFsdWU9YXx8MD09PWE/YToiIiksdGhpcy5iaW5kVmFsdWU9YSx0aGlzLiQubWlycm9yLmlubmVySFRNTD10aGlzLl92YWx1ZUZvck1pcnJvcigpLHRoaXMuZmlyZSgiYmluZC12YWx1ZS1jaGFuZ2VkIix7dmFsdWU6dGhpcy5iaW5kVmFsdWV9KSl9LF9vbklucHV0OmZ1bmN0aW9uKGEpe3ZhciBjPVBvbHltZXIuZG9tKGEpLnBhdGg7dGhpcy52YWx1ZT1jP2NbMF0udmFsdWU6CmEudGFyZ2V0LnZhbHVlfSxfY29uc3RyYWluOmZ1bmN0aW9uKGEpe2E9YXx8WyIiXTtmb3IoYT0wPHRoaXMubWF4Um93cyYmYS5sZW5ndGg+dGhpcy5tYXhSb3dzP2Euc2xpY2UoMCx0aGlzLm1heFJvd3MpOmEuc2xpY2UoMCk7MDx0aGlzLnJvd3MmJmEubGVuZ3RoPHRoaXMucm93czspYS5wdXNoKCIiKTtyZXR1cm4gYS5qb2luKCJceDNjYnIvXHgzZSIpKyJceDI2IzE2MDsifSxfdmFsdWVGb3JNaXJyb3I6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnRleHRhcmVhO2lmKGEpcmV0dXJuIHRoaXMudG9rZW5zPWEmJmEudmFsdWU/YS52YWx1ZS5yZXBsYWNlKC8mL2dtLCJceDI2YW1wOyIpLnJlcGxhY2UoLyIvZ20sIlx4MjZxdW90OyIpLnJlcGxhY2UoLycvZ20sIlx4MjYjMzk7IikucmVwbGFjZSgvPC9nbSwiXHgyNmx0OyIpLnJlcGxhY2UoLz4vZ20sIlx4MjZndDsiKS5zcGxpdCgiXG4iKTpbIiJdLHRoaXMuX2NvbnN0cmFpbih0aGlzLnRva2Vucyl9LF91cGRhdGVDYWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLiQubWlycm9yLmlubmVySFRNTD0KdGhpcy5fY29uc3RyYWluKHRoaXMudG9rZW5zKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1pbnB1dC9wYXBlci10ZXh0YXJlYS5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10ZXh0YXJlYSIsYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVySW5wdXRCZWhhdmlvcixQb2x5bWVyLklyb25Gb3JtRWxlbWVudEJlaGF2aW9yXSxwcm9wZXJ0aWVzOntfYXJpYUxhYmVsbGVkQnk6e29ic2VydmVyOiJfYXJpYUxhYmVsbGVkQnlDaGFuZ2VkIix0eXBlOlN0cmluZ30sX2FyaWFEZXNjcmliZWRCeTp7b2JzZXJ2ZXI6Il9hcmlhRGVzY3JpYmVkQnlDaGFuZ2VkIix0eXBlOlN0cmluZ30sdmFsdWU6e3R5cGU6U3RyaW5nfSxyb3dzOnt0eXBlOk51bWJlcix2YWx1ZToxfSxtYXhSb3dzOnt0eXBlOk51bWJlcix2YWx1ZTowfX0sZ2V0IHNlbGVjdGlvblN0YXJ0KCl7cmV0dXJuIHRoaXMuJC5pbnB1dC50ZXh0YXJlYS5zZWxlY3Rpb25TdGFydH0sc2V0IHNlbGVjdGlvblN0YXJ0KGEpe3RoaXMuJC5pbnB1dC50ZXh0YXJlYS5zZWxlY3Rpb25TdGFydD1hfSxnZXQgc2VsZWN0aW9uRW5kKCl7cmV0dXJuIHRoaXMuJC5pbnB1dC50ZXh0YXJlYS5zZWxlY3Rpb25FbmR9LApzZXQgc2VsZWN0aW9uRW5kKGEpe3RoaXMuJC5pbnB1dC50ZXh0YXJlYS5zZWxlY3Rpb25FbmQ9YX0sX2FyaWFMYWJlbGxlZEJ5Q2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLl9mb2N1c2FibGVFbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5IixhKX0sX2FyaWFEZXNjcmliZWRCeUNoYW5nZWQ6ZnVuY3Rpb24oYSl7dGhpcy5fZm9jdXNhYmxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoImFyaWEtZGVzY3JpYmVkYnkiLGEpfSxnZXQgX2ZvY3VzYWJsZUVsZW1lbnQoKXtyZXR1cm4gdGhpcy5pbnB1dEVsZW1lbnQudGV4dGFyZWF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItdG9hc3QvcGFwZXItdG9hc3QuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYT1udWxsO1BvbHltZXIoe2lzOiJwYXBlci10b2FzdCIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JdLHByb3BlcnRpZXM6e2ZpdEludG86e3R5cGU6T2JqZWN0LHZhbHVlOndpbmRvdyxvYnNlcnZlcjoiX29uRml0SW50b0NoYW5nZWQifSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJsZWZ0In0sdmVydGljYWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImJvdHRvbSJ9LGR1cmF0aW9uOnt0eXBlOk51bWJlcix2YWx1ZTozRTN9LHRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxub0NhbmNlbE9uT3V0c2lkZUNsaWNrOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LG5vQXV0b0ZvY3VzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9fSxsaXN0ZW5lcnM6e3RyYW5zaXRpb25lbmQ6Il9fb25UcmFuc2l0aW9uRW5kIn0sZ2V0IHZpc2libGUoKXtQb2x5bWVyLkJhc2UuX3dhcm4oImB2aXNpYmxlYCBpcyBkZXByZWNhdGVkLCB1c2UgYG9wZW5lZGAgaW5zdGVhZCIpOwpyZXR1cm4gdGhpcy5vcGVuZWR9LGdldCBfY2FuQXV0b0Nsb3NlKCl7cmV0dXJuIDA8dGhpcy5kdXJhdGlvbiYmSW5maW5pdHkhPT10aGlzLmR1cmF0aW9ufSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXV0b0Nsb3NlPW51bGw7UG9seW1lci5Jcm9uQTExeUFubm91bmNlci5yZXF1ZXN0QXZhaWxhYmlsaXR5KCl9LHNob3c6ZnVuY3Rpb24oYyl7InN0cmluZyI9PXR5cGVvZiBjJiYoYz17dGV4dDpjfSk7Zm9yKHZhciBkIGluIGMpMD09PWQuaW5kZXhPZigiXyIpP1BvbHltZXIuQmFzZS5fd2FybignVGhlIHByb3BlcnR5ICInK2QrJyIgaXMgcHJpdmF0ZSBhbmQgd2FzIG5vdCBzZXQuJyk6ZCBpbiB0aGlzP3RoaXNbZF09Y1tkXTpQb2x5bWVyLkJhc2UuX3dhcm4oJ1RoZSBwcm9wZXJ0eSAiJytkKyciIGlzIG5vdCB2YWxpZC4nKTt0aGlzLm9wZW4oKX0saGlkZTpmdW5jdGlvbigpe3RoaXMuY2xvc2UoKX0sX19vblRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oYyl7YyYmYy50YXJnZXQ9PT0KdGhpcyYmIm9wYWNpdHkiPT09Yy5wcm9wZXJ0eU5hbWUmJih0aGlzLm9wZW5lZD90aGlzLl9maW5pc2hSZW5kZXJPcGVuZWQoKTp0aGlzLl9maW5pc2hSZW5kZXJDbG9zZWQoKSl9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuX2F1dG9DbG9zZSYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fYXV0b0Nsb3NlKSx0aGlzLl9hdXRvQ2xvc2U9bnVsbCk7dGhpcy5vcGVuZWQ/KGEmJmEhPT10aGlzJiZhLmNsb3NlKCksYT10aGlzLHRoaXMuZmlyZSgiaXJvbi1hbm5vdW5jZSIse3RleHQ6dGhpcy50ZXh0fSksdGhpcy5fY2FuQXV0b0Nsb3NlJiYodGhpcy5fYXV0b0Nsb3NlPXRoaXMuYXN5bmModGhpcy5jbG9zZSx0aGlzLmR1cmF0aW9uKSkpOmE9PT10aGlzJiYoYT1udWxsKTtQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JJbXBsLl9vcGVuZWRDaGFuZ2VkLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sX3JlbmRlck9wZW5lZDpmdW5jdGlvbigpe3RoaXMuY2xhc3NMaXN0LmFkZCgicGFwZXItdG9hc3Qtb3BlbiIpfSwKX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpe3RoaXMuY2xhc3NMaXN0LnJlbW92ZSgicGFwZXItdG9hc3Qtb3BlbiIpfSxfb25GaXRJbnRvQ2hhbmdlZDpmdW5jdGlvbihjKXt0aGlzLnBvc2l0aW9uVGFyZ2V0PWN9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXRvZ2dsZS1idXR0b24vcGFwZXItdG9nZ2xlLWJ1dHRvbi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10b2dnbGUtYnV0dG9uIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9yXSxob3N0QXR0cmlidXRlczp7cm9sZToiYnV0dG9uIiwiYXJpYS1wcmVzc2VkIjoiZmFsc2UiLHRhYmluZGV4OjB9LHByb3BlcnRpZXM6e30sbGlzdGVuZXJzOnt0cmFjazoiX29udHJhY2sifSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLGZ1bmN0aW9uKCl7UG9seW1lci5HZXN0dXJlcy5zZXRUb3VjaEFjdGlvbih0aGlzLCJwYW4teSIpfSl9LF9vbnRyYWNrOmZ1bmN0aW9uKGEpe2E9YS5kZXRhaWw7InN0YXJ0Ij09PWEuc3RhdGU/dGhpcy5fdHJhY2tTdGFydChhKToidHJhY2siPT09YS5zdGF0ZT90aGlzLl90cmFja01vdmUoYSk6ImVuZCI9PT1hLnN0YXRlJiZ0aGlzLl90cmFja0VuZChhKX0sX3RyYWNrU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl93aWR0aD10aGlzLiQudG9nZ2xlQmFyLm9mZnNldFdpZHRoLwoyO3RoaXMuX3RyYWNrQ2hlY2tlZD10aGlzLmNoZWNrZWQ7dGhpcy4kLnRvZ2dsZUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCJkcmFnZ2luZyIpfSxfdHJhY2tNb3ZlOmZ1bmN0aW9uKGEpe2E9YS5keDt0aGlzLl94PU1hdGgubWluKHRoaXMuX3dpZHRoLE1hdGgubWF4KDAsdGhpcy5fdHJhY2tDaGVja2VkP3RoaXMuX3dpZHRoK2E6YSkpO3RoaXMudHJhbnNsYXRlM2QodGhpcy5feCsicHgiLDAsMCx0aGlzLiQudG9nZ2xlQnV0dG9uKTt0aGlzLl91c2VyQWN0aXZhdGUodGhpcy5feD50aGlzLl93aWR0aC8yKX0sX3RyYWNrRW5kOmZ1bmN0aW9uKCl7dGhpcy4kLnRvZ2dsZUJ1dHRvbi5jbGFzc0xpc3QucmVtb3ZlKCJkcmFnZ2luZyIpO3RoaXMudHJhbnNmb3JtKCIiLHRoaXMuJC50b2dnbGVCdXR0b24pfSxfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7dGhpcy5fcmlwcGxlQ29udGFpbmVyPXRoaXMuJC50b2dnbGVCdXR0b247dmFyIGE9UG9seW1lci5QYXBlclJpcHBsZUJlaGF2aW9yLl9jcmVhdGVSaXBwbGUoKTsKYS5pZD0iaW5rIjthLnNldEF0dHJpYnV0ZSgicmVjZW50ZXJzIiwiIik7YS5jbGFzc0xpc3QuYWRkKCJjaXJjbGUiLCJ0b2dnbGUtaW5rIik7cmV0dXJuIGF9fSk7CgooZnVuY3Rpb24oZil7aWYodHlwZW9mIGV4cG9ydHM9PT0ib2JqZWN0IiYmdHlwZW9mIG1vZHVsZSE9PSJ1bmRlZmluZWQiKW1vZHVsZS5leHBvcnRzPWYoKTtlbHNlIGlmKHR5cGVvZiBkZWZpbmU9PT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kKWRlZmluZShbXSxmKTtlbHNle3ZhciBnO2lmKHR5cGVvZiB3aW5kb3chPT0idW5kZWZpbmVkIilnPXdpbmRvdztlbHNlIGlmKHR5cGVvZiBnbG9iYWwhPT0idW5kZWZpbmVkIilnPWdsb2JhbDtlbHNlIGlmKHR5cGVvZiBzZWxmIT09InVuZGVmaW5lZCIpZz1zZWxmO2Vsc2UgZz10aGlzO2cuZ3JhcGhsaWI9ZigpfX0pKGZ1bmN0aW9uKCl7dmFyIGRlZmluZSxtb2R1bGUsZXhwb3J0cztyZXR1cm4gZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PSJmdW5jdGlvbiImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTsKdmFyIGY9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpO3Rocm93IGYuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsZjt9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSh7MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGxpYj1yZXF1aXJlKCIuL2xpYiIpO21vZHVsZS5leHBvcnRzPXtHcmFwaDpsaWIuR3JhcGgsanNvbjpyZXF1aXJlKCIuL2xpYi9qc29uIiksYWxnOnJlcXVpcmUoIi4vbGliL2FsZyIpLHZlcnNpb246bGliLnZlcnNpb259fSx7Ii4vbGliIjoxNywiLi9saWIvYWxnIjo4LCIuL2xpYi9qc29uIjoxOH1dLAoyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1jb21wb25lbnRzO2Z1bmN0aW9uIGNvbXBvbmVudHMoZyl7dmFyIHZpc2l0ZWQ9e30sY21wdHM9W10sY21wdDtmdW5jdGlvbiBkZnModil7aWYoXy5oYXModmlzaXRlZCx2KSlyZXR1cm47dmlzaXRlZFt2XT10cnVlO2NtcHQucHVzaCh2KTtfLmVhY2goZy5zdWNjZXNzb3JzKHYpLGRmcyk7Xy5lYWNoKGcucHJlZGVjZXNzb3JzKHYpLGRmcyl9Xy5lYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtjbXB0PVtdO2Rmcyh2KTtpZihjbXB0Lmxlbmd0aCljbXB0cy5wdXNoKGNtcHQpfSk7cmV0dXJuIGNtcHRzfX0seyIuLi9sb2Rhc2giOjE5fV0sMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9ZGZzO2Z1bmN0aW9uIGRmcyhnLHZzLG9yZGVyKXtpZighXy5pc0FycmF5KHZzKSl2cz0KW3ZzXTt2YXIgbmF2aWdhdGlvbj0oZy5pc0RpcmVjdGVkKCk/Zy5zdWNjZXNzb3JzOmcubmVpZ2hib3JzKS5iaW5kKGcpO3ZhciBhY2M9W10sdmlzaXRlZD17fTtfLmVhY2godnMsZnVuY3Rpb24odil7aWYoIWcuaGFzTm9kZSh2KSl0aHJvdyBuZXcgRXJyb3IoIkdyYXBoIGRvZXMgbm90IGhhdmUgbm9kZTogIit2KTtkb0RmcyhnLHYsb3JkZXI9PT0icG9zdCIsdmlzaXRlZCxuYXZpZ2F0aW9uLGFjYyl9KTtyZXR1cm4gYWNjfWZ1bmN0aW9uIGRvRGZzKGcsdixwb3N0b3JkZXIsdmlzaXRlZCxuYXZpZ2F0aW9uLGFjYyl7aWYoIV8uaGFzKHZpc2l0ZWQsdikpe3Zpc2l0ZWRbdl09dHJ1ZTtpZighcG9zdG9yZGVyKWFjYy5wdXNoKHYpO18uZWFjaChuYXZpZ2F0aW9uKHYpLGZ1bmN0aW9uKHcpe2RvRGZzKGcsdyxwb3N0b3JkZXIsdmlzaXRlZCxuYXZpZ2F0aW9uLGFjYyl9KTtpZihwb3N0b3JkZXIpYWNjLnB1c2godil9fX0seyIuLi9sb2Rhc2giOjE5fV0sNDpbZnVuY3Rpb24ocmVxdWlyZSwKbW9kdWxlLGV4cG9ydHMpe3ZhciBkaWprc3RyYT1yZXF1aXJlKCIuL2RpamtzdHJhIiksXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1kaWprc3RyYUFsbDtmdW5jdGlvbiBkaWprc3RyYUFsbChnLHdlaWdodEZ1bmMsZWRnZUZ1bmMpe3JldHVybiBfLnRyYW5zZm9ybShnLm5vZGVzKCksZnVuY3Rpb24oYWNjLHYpe2FjY1t2XT1kaWprc3RyYShnLHYsd2VpZ2h0RnVuYyxlZGdlRnVuYyl9LHt9KX19LHsiLi4vbG9kYXNoIjoxOSwiLi9kaWprc3RyYSI6NX1dLDU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLFByaW9yaXR5UXVldWU9cmVxdWlyZSgiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZSIpO21vZHVsZS5leHBvcnRzPWRpamtzdHJhO3ZhciBERUZBVUxUX1dFSUdIVF9GVU5DPV8uY29uc3RhbnQoMSk7ZnVuY3Rpb24gZGlqa3N0cmEoZyxzb3VyY2Usd2VpZ2h0Rm4sZWRnZUZuKXtyZXR1cm4gcnVuRGlqa3N0cmEoZywKU3RyaW5nKHNvdXJjZSksd2VpZ2h0Rm58fERFRkFVTFRfV0VJR0hUX0ZVTkMsZWRnZUZufHxmdW5jdGlvbih2KXtyZXR1cm4gZy5vdXRFZGdlcyh2KX0pfWZ1bmN0aW9uIHJ1bkRpamtzdHJhKGcsc291cmNlLHdlaWdodEZuLGVkZ2VGbil7dmFyIHJlc3VsdHM9e30scHE9bmV3IFByaW9yaXR5UXVldWUsdix2RW50cnk7dmFyIHVwZGF0ZU5laWdoYm9ycz1mdW5jdGlvbihlZGdlKXt2YXIgdz1lZGdlLnYhPT12P2VkZ2UudjplZGdlLncsd0VudHJ5PXJlc3VsdHNbd10sd2VpZ2h0PXdlaWdodEZuKGVkZ2UpLGRpc3RhbmNlPXZFbnRyeS5kaXN0YW5jZSt3ZWlnaHQ7aWYod2VpZ2h0PDApdGhyb3cgbmV3IEVycm9yKCJkaWprc3RyYSBkb2VzIG5vdCBhbGxvdyBuZWdhdGl2ZSBlZGdlIHdlaWdodHMuICIrIkJhZCBlZGdlOiAiK2VkZ2UrIiBXZWlnaHQ6ICIrd2VpZ2h0KTtpZihkaXN0YW5jZTx3RW50cnkuZGlzdGFuY2Upe3dFbnRyeS5kaXN0YW5jZT1kaXN0YW5jZTt3RW50cnkucHJlZGVjZXNzb3I9CnY7cHEuZGVjcmVhc2UodyxkaXN0YW5jZSl9fTtnLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbih2KXt2YXIgZGlzdGFuY2U9dj09PXNvdXJjZT8wOk51bWJlci5QT1NJVElWRV9JTkZJTklUWTtyZXN1bHRzW3ZdPXtkaXN0YW5jZTpkaXN0YW5jZX07cHEuYWRkKHYsZGlzdGFuY2UpfSk7d2hpbGUocHEuc2l6ZSgpPjApe3Y9cHEucmVtb3ZlTWluKCk7dkVudHJ5PXJlc3VsdHNbdl07aWYodkVudHJ5LmRpc3RhbmNlPT09TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKWJyZWFrO2VkZ2VGbih2KS5mb3JFYWNoKHVwZGF0ZU5laWdoYm9ycyl9cmV0dXJuIHJlc3VsdHN9fSx7Ii4uL2RhdGEvcHJpb3JpdHktcXVldWUiOjE1LCIuLi9sb2Rhc2giOjE5fV0sNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksdGFyamFuPXJlcXVpcmUoIi4vdGFyamFuIik7bW9kdWxlLmV4cG9ydHM9ZmluZEN5Y2xlcztmdW5jdGlvbiBmaW5kQ3ljbGVzKGcpe3JldHVybiBfLmZpbHRlcih0YXJqYW4oZyksCmZ1bmN0aW9uKGNtcHQpe3JldHVybiBjbXB0Lmxlbmd0aD4xfHxjbXB0Lmxlbmd0aD09PTEmJmcuaGFzRWRnZShjbXB0WzBdLGNtcHRbMF0pfSl9fSx7Ii4uL2xvZGFzaCI6MTksIi4vdGFyamFuIjoxM31dLDc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWZsb3lkV2Fyc2hhbGw7dmFyIERFRkFVTFRfV0VJR0hUX0ZVTkM9Xy5jb25zdGFudCgxKTtmdW5jdGlvbiBmbG95ZFdhcnNoYWxsKGcsd2VpZ2h0Rm4sZWRnZUZuKXtyZXR1cm4gcnVuRmxveWRXYXJzaGFsbChnLHdlaWdodEZufHxERUZBVUxUX1dFSUdIVF9GVU5DLGVkZ2VGbnx8ZnVuY3Rpb24odil7cmV0dXJuIGcub3V0RWRnZXModil9KX1mdW5jdGlvbiBydW5GbG95ZFdhcnNoYWxsKGcsd2VpZ2h0Rm4sZWRnZUZuKXt2YXIgcmVzdWx0cz17fSxub2Rlcz1nLm5vZGVzKCk7bm9kZXMuZm9yRWFjaChmdW5jdGlvbih2KXtyZXN1bHRzW3ZdPQp7fTtyZXN1bHRzW3ZdW3ZdPXtkaXN0YW5jZTowfTtub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHcpe2lmKHYhPT13KXJlc3VsdHNbdl1bd109e2Rpc3RhbmNlOk51bWJlci5QT1NJVElWRV9JTkZJTklUWX19KTtlZGdlRm4odikuZm9yRWFjaChmdW5jdGlvbihlZGdlKXt2YXIgdz1lZGdlLnY9PT12P2VkZ2UudzplZGdlLnYsZD13ZWlnaHRGbihlZGdlKTtyZXN1bHRzW3ZdW3ddPXtkaXN0YW5jZTpkLHByZWRlY2Vzc29yOnZ9fSl9KTtub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGspe3ZhciByb3dLPXJlc3VsdHNba107bm9kZXMuZm9yRWFjaChmdW5jdGlvbihpKXt2YXIgcm93ST1yZXN1bHRzW2ldO25vZGVzLmZvckVhY2goZnVuY3Rpb24oail7dmFyIGlrPXJvd0lba107dmFyIGtqPXJvd0tbal07dmFyIGlqPXJvd0lbal07dmFyIGFsdERpc3RhbmNlPWlrLmRpc3RhbmNlK2tqLmRpc3RhbmNlO2lmKGFsdERpc3RhbmNlPGlqLmRpc3RhbmNlKXtpai5kaXN0YW5jZT1hbHREaXN0YW5jZTtpai5wcmVkZWNlc3Nvcj0Ka2oucHJlZGVjZXNzb3J9fSl9KX0pO3JldHVybiByZXN1bHRzfX0seyIuLi9sb2Rhc2giOjE5fV0sODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9e2NvbXBvbmVudHM6cmVxdWlyZSgiLi9jb21wb25lbnRzIiksZGlqa3N0cmE6cmVxdWlyZSgiLi9kaWprc3RyYSIpLGRpamtzdHJhQWxsOnJlcXVpcmUoIi4vZGlqa3N0cmEtYWxsIiksZmluZEN5Y2xlczpyZXF1aXJlKCIuL2ZpbmQtY3ljbGVzIiksZmxveWRXYXJzaGFsbDpyZXF1aXJlKCIuL2Zsb3lkLXdhcnNoYWxsIiksaXNBY3ljbGljOnJlcXVpcmUoIi4vaXMtYWN5Y2xpYyIpLHBvc3RvcmRlcjpyZXF1aXJlKCIuL3Bvc3RvcmRlciIpLHByZW9yZGVyOnJlcXVpcmUoIi4vcHJlb3JkZXIiKSxwcmltOnJlcXVpcmUoIi4vcHJpbSIpLHRhcmphbjpyZXF1aXJlKCIuL3RhcmphbiIpLHRvcHNvcnQ6cmVxdWlyZSgiLi90b3Bzb3J0Iil9fSx7Ii4vY29tcG9uZW50cyI6MiwiLi9kaWprc3RyYSI6NSwKIi4vZGlqa3N0cmEtYWxsIjo0LCIuL2ZpbmQtY3ljbGVzIjo2LCIuL2Zsb3lkLXdhcnNoYWxsIjo3LCIuL2lzLWFjeWNsaWMiOjksIi4vcG9zdG9yZGVyIjoxMCwiLi9wcmVvcmRlciI6MTEsIi4vcHJpbSI6MTIsIi4vdGFyamFuIjoxMywiLi90b3Bzb3J0IjoxNH1dLDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciB0b3Bzb3J0PXJlcXVpcmUoIi4vdG9wc29ydCIpO21vZHVsZS5leHBvcnRzPWlzQWN5Y2xpYztmdW5jdGlvbiBpc0FjeWNsaWMoZyl7dHJ5e3RvcHNvcnQoZyl9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIHRvcHNvcnQuQ3ljbGVFeGNlcHRpb24pcmV0dXJuIGZhbHNlO3Rocm93IGU7fXJldHVybiB0cnVlfX0seyIuL3RvcHNvcnQiOjE0fV0sMTA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBkZnM9cmVxdWlyZSgiLi9kZnMiKTttb2R1bGUuZXhwb3J0cz1wb3N0b3JkZXI7ZnVuY3Rpb24gcG9zdG9yZGVyKGcsdnMpe3JldHVybiBkZnMoZywKdnMsInBvc3QiKX19LHsiLi9kZnMiOjN9XSwxMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGRmcz1yZXF1aXJlKCIuL2RmcyIpO21vZHVsZS5leHBvcnRzPXByZW9yZGVyO2Z1bmN0aW9uIHByZW9yZGVyKGcsdnMpe3JldHVybiBkZnMoZyx2cywicHJlIil9fSx7Ii4vZGZzIjozfV0sMTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4uL2dyYXBoIiksUHJpb3JpdHlRdWV1ZT1yZXF1aXJlKCIuLi9kYXRhL3ByaW9yaXR5LXF1ZXVlIik7bW9kdWxlLmV4cG9ydHM9cHJpbTtmdW5jdGlvbiBwcmltKGcsd2VpZ2h0RnVuYyl7dmFyIHJlc3VsdD1uZXcgR3JhcGgscGFyZW50cz17fSxwcT1uZXcgUHJpb3JpdHlRdWV1ZSx2O2Z1bmN0aW9uIHVwZGF0ZU5laWdoYm9ycyhlZGdlKXt2YXIgdz1lZGdlLnY9PT12P2VkZ2UudzplZGdlLnYscHJpPXBxLnByaW9yaXR5KHcpO2lmKHByaSE9PQp1bmRlZmluZWQpe3ZhciBlZGdlV2VpZ2h0PXdlaWdodEZ1bmMoZWRnZSk7aWYoZWRnZVdlaWdodDxwcmkpe3BhcmVudHNbd109djtwcS5kZWNyZWFzZSh3LGVkZ2VXZWlnaHQpfX19aWYoZy5ub2RlQ291bnQoKT09PTApcmV0dXJuIHJlc3VsdDtfLmVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3BxLmFkZCh2LE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7cmVzdWx0LnNldE5vZGUodil9KTtwcS5kZWNyZWFzZShnLm5vZGVzKClbMF0sMCk7dmFyIGluaXQ9ZmFsc2U7d2hpbGUocHEuc2l6ZSgpPjApe3Y9cHEucmVtb3ZlTWluKCk7aWYoXy5oYXMocGFyZW50cyx2KSlyZXN1bHQuc2V0RWRnZSh2LHBhcmVudHNbdl0pO2Vsc2UgaWYoaW5pdCl0aHJvdyBuZXcgRXJyb3IoIklucHV0IGdyYXBoIGlzIG5vdCBjb25uZWN0ZWQ6ICIrZyk7ZWxzZSBpbml0PXRydWU7Zy5ub2RlRWRnZXModikuZm9yRWFjaCh1cGRhdGVOZWlnaGJvcnMpfXJldHVybiByZXN1bHR9fSx7Ii4uL2RhdGEvcHJpb3JpdHktcXVldWUiOjE1LAoiLi4vZ3JhcGgiOjE2LCIuLi9sb2Rhc2giOjE5fV0sMTM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPXRhcmphbjtmdW5jdGlvbiB0YXJqYW4oZyl7dmFyIGluZGV4PTAsc3RhY2s9W10sdmlzaXRlZD17fSxyZXN1bHRzPVtdO2Z1bmN0aW9uIGRmcyh2KXt2YXIgZW50cnk9dmlzaXRlZFt2XT17b25TdGFjazp0cnVlLGxvd2xpbms6aW5kZXgsaW5kZXg6aW5kZXgrK307c3RhY2sucHVzaCh2KTtnLnN1Y2Nlc3NvcnModikuZm9yRWFjaChmdW5jdGlvbih3KXtpZighXy5oYXModmlzaXRlZCx3KSl7ZGZzKHcpO2VudHJ5Lmxvd2xpbms9TWF0aC5taW4oZW50cnkubG93bGluayx2aXNpdGVkW3ddLmxvd2xpbmspfWVsc2UgaWYodmlzaXRlZFt3XS5vblN0YWNrKWVudHJ5Lmxvd2xpbms9TWF0aC5taW4oZW50cnkubG93bGluayx2aXNpdGVkW3ddLmluZGV4KX0pO2lmKGVudHJ5Lmxvd2xpbms9PT1lbnRyeS5pbmRleCl7dmFyIGNtcHQ9CltdLHc7ZG97dz1zdGFjay5wb3AoKTt2aXNpdGVkW3ddLm9uU3RhY2s9ZmFsc2U7Y21wdC5wdXNoKHcpfXdoaWxlKHYhPT13KTtyZXN1bHRzLnB1c2goY21wdCl9fWcubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHYpe2lmKCFfLmhhcyh2aXNpdGVkLHYpKWRmcyh2KX0pO3JldHVybiByZXN1bHRzfX0seyIuLi9sb2Rhc2giOjE5fV0sMTQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPXRvcHNvcnQ7dG9wc29ydC5DeWNsZUV4Y2VwdGlvbj1DeWNsZUV4Y2VwdGlvbjtmdW5jdGlvbiB0b3Bzb3J0KGcpe3ZhciB2aXNpdGVkPXt9LHN0YWNrPXt9LHJlc3VsdHM9W107ZnVuY3Rpb24gdmlzaXQobm9kZSl7aWYoXy5oYXMoc3RhY2ssbm9kZSkpdGhyb3cgbmV3IEN5Y2xlRXhjZXB0aW9uO2lmKCFfLmhhcyh2aXNpdGVkLG5vZGUpKXtzdGFja1tub2RlXT10cnVlO3Zpc2l0ZWRbbm9kZV09dHJ1ZTtfLmVhY2goZy5wcmVkZWNlc3NvcnMobm9kZSksCnZpc2l0KTtkZWxldGUgc3RhY2tbbm9kZV07cmVzdWx0cy5wdXNoKG5vZGUpfX1fLmVhY2goZy5zaW5rcygpLHZpc2l0KTtpZihfLnNpemUodmlzaXRlZCkhPT1nLm5vZGVDb3VudCgpKXRocm93IG5ldyBDeWNsZUV4Y2VwdGlvbjtyZXR1cm4gcmVzdWx0c31mdW5jdGlvbiBDeWNsZUV4Y2VwdGlvbigpe319LHsiLi4vbG9kYXNoIjoxOX1dLDE1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1Qcmlvcml0eVF1ZXVlO2Z1bmN0aW9uIFByaW9yaXR5UXVldWUoKXt0aGlzLl9hcnI9W107dGhpcy5fa2V5SW5kaWNlcz17fX1Qcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fyci5sZW5ndGh9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLmtleXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXJyLm1hcChmdW5jdGlvbih4KXtyZXR1cm4geC5rZXl9KX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuaGFzPQpmdW5jdGlvbihrZXkpe3JldHVybiBfLmhhcyh0aGlzLl9rZXlJbmRpY2VzLGtleSl9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLnByaW9yaXR5PWZ1bmN0aW9uKGtleSl7dmFyIGluZGV4PXRoaXMuX2tleUluZGljZXNba2V5XTtpZihpbmRleCE9PXVuZGVmaW5lZClyZXR1cm4gdGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUubWluPWZ1bmN0aW9uKCl7aWYodGhpcy5zaXplKCk9PT0wKXRocm93IG5ldyBFcnJvcigiUXVldWUgdW5kZXJmbG93Iik7cmV0dXJuIHRoaXMuX2FyclswXS5rZXl9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLmFkZD1mdW5jdGlvbihrZXkscHJpb3JpdHkpe3ZhciBrZXlJbmRpY2VzPXRoaXMuX2tleUluZGljZXM7a2V5PVN0cmluZyhrZXkpO2lmKCFfLmhhcyhrZXlJbmRpY2VzLGtleSkpe3ZhciBhcnI9dGhpcy5fYXJyO3ZhciBpbmRleD1hcnIubGVuZ3RoO2tleUluZGljZXNba2V5XT1pbmRleDthcnIucHVzaCh7a2V5OmtleSwKcHJpb3JpdHk6cHJpb3JpdHl9KTt0aGlzLl9kZWNyZWFzZShpbmRleCk7cmV0dXJuIHRydWV9cmV0dXJuIGZhbHNlfTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5yZW1vdmVNaW49ZnVuY3Rpb24oKXt0aGlzLl9zd2FwKDAsdGhpcy5fYXJyLmxlbmd0aC0xKTt2YXIgbWluPXRoaXMuX2Fyci5wb3AoKTtkZWxldGUgdGhpcy5fa2V5SW5kaWNlc1ttaW4ua2V5XTt0aGlzLl9oZWFwaWZ5KDApO3JldHVybiBtaW4ua2V5fTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5kZWNyZWFzZT1mdW5jdGlvbihrZXkscHJpb3JpdHkpe3ZhciBpbmRleD10aGlzLl9rZXlJbmRpY2VzW2tleV07aWYocHJpb3JpdHk+dGhpcy5fYXJyW2luZGV4XS5wcmlvcml0eSl0aHJvdyBuZXcgRXJyb3IoIk5ldyBwcmlvcml0eSBpcyBncmVhdGVyIHRoYW4gY3VycmVudCBwcmlvcml0eS4gIisiS2V5OiAiK2tleSsiIE9sZDogIit0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5KyIgTmV3OiAiK3ByaW9yaXR5KTt0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5PQpwcmlvcml0eTt0aGlzLl9kZWNyZWFzZShpbmRleCl9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLl9oZWFwaWZ5PWZ1bmN0aW9uKGkpe3ZhciBhcnI9dGhpcy5fYXJyO3ZhciBsPTIqaSxyPWwrMSxsYXJnZXN0PWk7aWYobDxhcnIubGVuZ3RoKXtsYXJnZXN0PWFycltsXS5wcmlvcml0eTxhcnJbbGFyZ2VzdF0ucHJpb3JpdHk/bDpsYXJnZXN0O2lmKHI8YXJyLmxlbmd0aClsYXJnZXN0PWFycltyXS5wcmlvcml0eTxhcnJbbGFyZ2VzdF0ucHJpb3JpdHk/cjpsYXJnZXN0O2lmKGxhcmdlc3QhPT1pKXt0aGlzLl9zd2FwKGksbGFyZ2VzdCk7dGhpcy5faGVhcGlmeShsYXJnZXN0KX19fTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5fZGVjcmVhc2U9ZnVuY3Rpb24oaW5kZXgpe3ZhciBhcnI9dGhpcy5fYXJyO3ZhciBwcmlvcml0eT1hcnJbaW5kZXhdLnByaW9yaXR5O3ZhciBwYXJlbnQ7d2hpbGUoaW5kZXghPT0wKXtwYXJlbnQ9aW5kZXg+PjE7aWYoYXJyW3BhcmVudF0ucHJpb3JpdHk8cHJpb3JpdHkpYnJlYWs7CnRoaXMuX3N3YXAoaW5kZXgscGFyZW50KTtpbmRleD1wYXJlbnR9fTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5fc3dhcD1mdW5jdGlvbihpLGope3ZhciBhcnI9dGhpcy5fYXJyO3ZhciBrZXlJbmRpY2VzPXRoaXMuX2tleUluZGljZXM7dmFyIG9yaWdBcnJJPWFycltpXTt2YXIgb3JpZ0Fycko9YXJyW2pdO2FycltpXT1vcmlnQXJySjthcnJbal09b3JpZ0Fyckk7a2V5SW5kaWNlc1tvcmlnQXJySi5rZXldPWk7a2V5SW5kaWNlc1tvcmlnQXJySS5rZXldPWp9fSx7Ii4uL2xvZGFzaCI6MTl9XSwxNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1HcmFwaDt2YXIgREVGQVVMVF9FREdFX05BTUU9Ilx4MDAiLEdSQVBIX05PREU9Ilx4MDAiLEVER0VfS0VZX0RFTElNPSJcdTAwMDEiO2Z1bmN0aW9uIEdyYXBoKG9wdHMpe3RoaXMuX2lzRGlyZWN0ZWQ9Xy5oYXMob3B0cywiZGlyZWN0ZWQiKT9vcHRzLmRpcmVjdGVkOgp0cnVlO3RoaXMuX2lzTXVsdGlncmFwaD1fLmhhcyhvcHRzLCJtdWx0aWdyYXBoIik/b3B0cy5tdWx0aWdyYXBoOmZhbHNlO3RoaXMuX2lzQ29tcG91bmQ9Xy5oYXMob3B0cywiY29tcG91bmQiKT9vcHRzLmNvbXBvdW5kOmZhbHNlO3RoaXMuX2xhYmVsPXVuZGVmaW5lZDt0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm49Xy5jb25zdGFudCh1bmRlZmluZWQpO3RoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbj1fLmNvbnN0YW50KHVuZGVmaW5lZCk7dGhpcy5fbm9kZXM9e307aWYodGhpcy5faXNDb21wb3VuZCl7dGhpcy5fcGFyZW50PXt9O3RoaXMuX2NoaWxkcmVuPXt9O3RoaXMuX2NoaWxkcmVuW0dSQVBIX05PREVdPXt9fXRoaXMuX2luPXt9O3RoaXMuX3ByZWRzPXt9O3RoaXMuX291dD17fTt0aGlzLl9zdWNzPXt9O3RoaXMuX2VkZ2VPYmpzPXt9O3RoaXMuX2VkZ2VMYWJlbHM9e319R3JhcGgucHJvdG90eXBlLl9ub2RlQ291bnQ9MDtHcmFwaC5wcm90b3R5cGUuX2VkZ2VDb3VudD0wO0dyYXBoLnByb3RvdHlwZS5pc0RpcmVjdGVkPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0RpcmVjdGVkfTtHcmFwaC5wcm90b3R5cGUuaXNNdWx0aWdyYXBoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzTXVsdGlncmFwaH07R3JhcGgucHJvdG90eXBlLmlzQ29tcG91bmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNDb21wb3VuZH07R3JhcGgucHJvdG90eXBlLnNldEdyYXBoPWZ1bmN0aW9uKGxhYmVsKXt0aGlzLl9sYWJlbD1sYWJlbDtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLmdyYXBoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhYmVsfTtHcmFwaC5wcm90b3R5cGUuc2V0RGVmYXVsdE5vZGVMYWJlbD1mdW5jdGlvbihuZXdEZWZhdWx0KXtpZighXy5pc0Z1bmN0aW9uKG5ld0RlZmF1bHQpKW5ld0RlZmF1bHQ9Xy5jb25zdGFudChuZXdEZWZhdWx0KTt0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm49bmV3RGVmYXVsdDtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLm5vZGVDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ub2RlQ291bnR9OwpHcmFwaC5wcm90b3R5cGUubm9kZXM9ZnVuY3Rpb24oKXtyZXR1cm4gXy5rZXlzKHRoaXMuX25vZGVzKX07R3JhcGgucHJvdG90eXBlLnNvdXJjZXM9ZnVuY3Rpb24oKXt2YXIgc2VsZj10aGlzO3JldHVybiBfLmZpbHRlcih0aGlzLm5vZGVzKCksZnVuY3Rpb24odil7cmV0dXJuIF8uaXNFbXB0eShzZWxmLl9pblt2XSl9KX07R3JhcGgucHJvdG90eXBlLnNpbmtzPWZ1bmN0aW9uKCl7dmFyIHNlbGY9dGhpcztyZXR1cm4gXy5maWx0ZXIodGhpcy5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldHVybiBfLmlzRW1wdHkoc2VsZi5fb3V0W3ZdKX0pfTtHcmFwaC5wcm90b3R5cGUuc2V0Tm9kZXM9ZnVuY3Rpb24odnMsdmFsdWUpe3ZhciBhcmdzPWFyZ3VtZW50czt2YXIgc2VsZj10aGlzO18uZWFjaCh2cyxmdW5jdGlvbih2KXtpZihhcmdzLmxlbmd0aD4xKXNlbGYuc2V0Tm9kZSh2LHZhbHVlKTtlbHNlIHNlbGYuc2V0Tm9kZSh2KX0pO3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuc2V0Tm9kZT0KZnVuY3Rpb24odix2YWx1ZSl7aWYoXy5oYXModGhpcy5fbm9kZXMsdikpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl0aGlzLl9ub2Rlc1t2XT12YWx1ZTtyZXR1cm4gdGhpc310aGlzLl9ub2Rlc1t2XT1hcmd1bWVudHMubGVuZ3RoPjE/dmFsdWU6dGhpcy5fZGVmYXVsdE5vZGVMYWJlbEZuKHYpO2lmKHRoaXMuX2lzQ29tcG91bmQpe3RoaXMuX3BhcmVudFt2XT1HUkFQSF9OT0RFO3RoaXMuX2NoaWxkcmVuW3ZdPXt9O3RoaXMuX2NoaWxkcmVuW0dSQVBIX05PREVdW3ZdPXRydWV9dGhpcy5faW5bdl09e307dGhpcy5fcHJlZHNbdl09e307dGhpcy5fb3V0W3ZdPXt9O3RoaXMuX3N1Y3Nbdl09e307Kyt0aGlzLl9ub2RlQ291bnQ7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5ub2RlPWZ1bmN0aW9uKHYpe3JldHVybiB0aGlzLl9ub2Rlc1t2XX07R3JhcGgucHJvdG90eXBlLmhhc05vZGU9ZnVuY3Rpb24odil7cmV0dXJuIF8uaGFzKHRoaXMuX25vZGVzLHYpfTtHcmFwaC5wcm90b3R5cGUucmVtb3ZlTm9kZT0KZnVuY3Rpb24odil7dmFyIHNlbGY9dGhpcztpZihfLmhhcyh0aGlzLl9ub2Rlcyx2KSl7dmFyIHJlbW92ZUVkZ2U9ZnVuY3Rpb24oZSl7c2VsZi5yZW1vdmVFZGdlKHNlbGYuX2VkZ2VPYmpzW2VdKX07ZGVsZXRlIHRoaXMuX25vZGVzW3ZdO2lmKHRoaXMuX2lzQ29tcG91bmQpe3RoaXMuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0KHYpO2RlbGV0ZSB0aGlzLl9wYXJlbnRbdl07Xy5lYWNoKHRoaXMuY2hpbGRyZW4odiksZnVuY3Rpb24oY2hpbGQpe3NlbGYuc2V0UGFyZW50KGNoaWxkKX0pO2RlbGV0ZSB0aGlzLl9jaGlsZHJlblt2XX1fLmVhY2goXy5rZXlzKHRoaXMuX2luW3ZdKSxyZW1vdmVFZGdlKTtkZWxldGUgdGhpcy5faW5bdl07ZGVsZXRlIHRoaXMuX3ByZWRzW3ZdO18uZWFjaChfLmtleXModGhpcy5fb3V0W3ZdKSxyZW1vdmVFZGdlKTtkZWxldGUgdGhpcy5fb3V0W3ZdO2RlbGV0ZSB0aGlzLl9zdWNzW3ZdOy0tdGhpcy5fbm9kZUNvdW50fXJldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuc2V0UGFyZW50PQpmdW5jdGlvbih2LHBhcmVudCl7aWYoIXRoaXMuX2lzQ29tcG91bmQpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qgc2V0IHBhcmVudCBpbiBhIG5vbi1jb21wb3VuZCBncmFwaCIpO2lmKF8uaXNVbmRlZmluZWQocGFyZW50KSlwYXJlbnQ9R1JBUEhfTk9ERTtlbHNle3BhcmVudCs9IiI7Zm9yKHZhciBhbmNlc3Rvcj1wYXJlbnQ7IV8uaXNVbmRlZmluZWQoYW5jZXN0b3IpO2FuY2VzdG9yPXRoaXMucGFyZW50KGFuY2VzdG9yKSlpZihhbmNlc3Rvcj09PXYpdGhyb3cgbmV3IEVycm9yKCJTZXR0aW5nICIrcGFyZW50KyIgYXMgcGFyZW50IG9mICIrdisiIHdvdWxkIGNyZWF0ZSBhIGN5Y2xlIik7dGhpcy5zZXROb2RlKHBhcmVudCl9dGhpcy5zZXROb2RlKHYpO3RoaXMuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0KHYpO3RoaXMuX3BhcmVudFt2XT1wYXJlbnQ7dGhpcy5fY2hpbGRyZW5bcGFyZW50XVt2XT10cnVlO3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0PQpmdW5jdGlvbih2KXtkZWxldGUgdGhpcy5fY2hpbGRyZW5bdGhpcy5fcGFyZW50W3ZdXVt2XX07R3JhcGgucHJvdG90eXBlLnBhcmVudD1mdW5jdGlvbih2KXtpZih0aGlzLl9pc0NvbXBvdW5kKXt2YXIgcGFyZW50PXRoaXMuX3BhcmVudFt2XTtpZihwYXJlbnQhPT1HUkFQSF9OT0RFKXJldHVybiBwYXJlbnR9fTtHcmFwaC5wcm90b3R5cGUuY2hpbGRyZW49ZnVuY3Rpb24odil7aWYoXy5pc1VuZGVmaW5lZCh2KSl2PUdSQVBIX05PREU7aWYodGhpcy5faXNDb21wb3VuZCl7dmFyIGNoaWxkcmVuPXRoaXMuX2NoaWxkcmVuW3ZdO2lmKGNoaWxkcmVuKXJldHVybiBfLmtleXMoY2hpbGRyZW4pfWVsc2UgaWYodj09PUdSQVBIX05PREUpcmV0dXJuIHRoaXMubm9kZXMoKTtlbHNlIGlmKHRoaXMuaGFzTm9kZSh2KSlyZXR1cm5bXX07R3JhcGgucHJvdG90eXBlLnByZWRlY2Vzc29ycz1mdW5jdGlvbih2KXt2YXIgcHJlZHNWPXRoaXMuX3ByZWRzW3ZdO2lmKHByZWRzVilyZXR1cm4gXy5rZXlzKHByZWRzVil9OwpHcmFwaC5wcm90b3R5cGUuc3VjY2Vzc29ycz1mdW5jdGlvbih2KXt2YXIgc3Vjc1Y9dGhpcy5fc3Vjc1t2XTtpZihzdWNzVilyZXR1cm4gXy5rZXlzKHN1Y3NWKX07R3JhcGgucHJvdG90eXBlLm5laWdoYm9ycz1mdW5jdGlvbih2KXt2YXIgcHJlZHM9dGhpcy5wcmVkZWNlc3NvcnModik7aWYocHJlZHMpcmV0dXJuIF8udW5pb24ocHJlZHMsdGhpcy5zdWNjZXNzb3JzKHYpKX07R3JhcGgucHJvdG90eXBlLmlzTGVhZj1mdW5jdGlvbih2KXt2YXIgbmVpZ2hib3JzO2lmKHRoaXMuaXNEaXJlY3RlZCgpKW5laWdoYm9ycz10aGlzLnN1Y2Nlc3NvcnModik7ZWxzZSBuZWlnaGJvcnM9dGhpcy5uZWlnaGJvcnModik7cmV0dXJuIG5laWdoYm9ycy5sZW5ndGg9PT0wfTtHcmFwaC5wcm90b3R5cGUuZmlsdGVyTm9kZXM9ZnVuY3Rpb24oZmlsdGVyKXt2YXIgY29weT1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih7ZGlyZWN0ZWQ6dGhpcy5faXNEaXJlY3RlZCxtdWx0aWdyYXBoOnRoaXMuX2lzTXVsdGlncmFwaCwKY29tcG91bmQ6dGhpcy5faXNDb21wb3VuZH0pO2NvcHkuc2V0R3JhcGgodGhpcy5ncmFwaCgpKTt2YXIgc2VsZj10aGlzO18uZWFjaCh0aGlzLl9ub2RlcyxmdW5jdGlvbih2YWx1ZSx2KXtpZihmaWx0ZXIodikpY29weS5zZXROb2RlKHYsdmFsdWUpfSk7Xy5lYWNoKHRoaXMuX2VkZ2VPYmpzLGZ1bmN0aW9uKGUpe2lmKGNvcHkuaGFzTm9kZShlLnYpJiZjb3B5Lmhhc05vZGUoZS53KSljb3B5LnNldEVkZ2UoZSxzZWxmLmVkZ2UoZSkpfSk7dmFyIHBhcmVudHM9e307ZnVuY3Rpb24gZmluZFBhcmVudCh2KXt2YXIgcGFyZW50PXNlbGYucGFyZW50KHYpO2lmKHBhcmVudD09PXVuZGVmaW5lZHx8Y29weS5oYXNOb2RlKHBhcmVudCkpe3BhcmVudHNbdl09cGFyZW50O3JldHVybiBwYXJlbnR9ZWxzZSBpZihwYXJlbnQgaW4gcGFyZW50cylyZXR1cm4gcGFyZW50c1twYXJlbnRdO2Vsc2UgcmV0dXJuIGZpbmRQYXJlbnQocGFyZW50KX1pZih0aGlzLl9pc0NvbXBvdW5kKV8uZWFjaChjb3B5Lm5vZGVzKCksCmZ1bmN0aW9uKHYpe2NvcHkuc2V0UGFyZW50KHYsZmluZFBhcmVudCh2KSl9KTtyZXR1cm4gY29weX07R3JhcGgucHJvdG90eXBlLnNldERlZmF1bHRFZGdlTGFiZWw9ZnVuY3Rpb24obmV3RGVmYXVsdCl7aWYoIV8uaXNGdW5jdGlvbihuZXdEZWZhdWx0KSluZXdEZWZhdWx0PV8uY29uc3RhbnQobmV3RGVmYXVsdCk7dGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuPW5ld0RlZmF1bHQ7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5lZGdlQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWRnZUNvdW50fTtHcmFwaC5wcm90b3R5cGUuZWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gXy52YWx1ZXModGhpcy5fZWRnZU9ianMpfTtHcmFwaC5wcm90b3R5cGUuc2V0UGF0aD1mdW5jdGlvbih2cyx2YWx1ZSl7dmFyIHNlbGY9dGhpcyxhcmdzPWFyZ3VtZW50cztfLnJlZHVjZSh2cyxmdW5jdGlvbih2LHcpe2lmKGFyZ3MubGVuZ3RoPjEpc2VsZi5zZXRFZGdlKHYsdyx2YWx1ZSk7ZWxzZSBzZWxmLnNldEVkZ2UodiwKdyk7cmV0dXJuIHd9KTtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLnNldEVkZ2U9ZnVuY3Rpb24oKXt2YXIgdix3LG5hbWUsdmFsdWUsdmFsdWVTcGVjaWZpZWQ9ZmFsc2UsYXJnMD1hcmd1bWVudHNbMF07aWYodHlwZW9mIGFyZzA9PT0ib2JqZWN0IiYmYXJnMCE9PW51bGwmJiJ2ImluIGFyZzApe3Y9YXJnMC52O3c9YXJnMC53O25hbWU9YXJnMC5uYW1lO2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0yKXt2YWx1ZT1hcmd1bWVudHNbMV07dmFsdWVTcGVjaWZpZWQ9dHJ1ZX19ZWxzZXt2PWFyZzA7dz1hcmd1bWVudHNbMV07bmFtZT1hcmd1bWVudHNbM107aWYoYXJndW1lbnRzLmxlbmd0aD4yKXt2YWx1ZT1hcmd1bWVudHNbMl07dmFsdWVTcGVjaWZpZWQ9dHJ1ZX19dj0iIit2O3c9IiIrdztpZighXy5pc1VuZGVmaW5lZChuYW1lKSluYW1lPSIiK25hbWU7dmFyIGU9ZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsdix3LG5hbWUpO2lmKF8uaGFzKHRoaXMuX2VkZ2VMYWJlbHMsCmUpKXtpZih2YWx1ZVNwZWNpZmllZCl0aGlzLl9lZGdlTGFiZWxzW2VdPXZhbHVlO3JldHVybiB0aGlzfWlmKCFfLmlzVW5kZWZpbmVkKG5hbWUpJiYhdGhpcy5faXNNdWx0aWdyYXBoKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHNldCBhIG5hbWVkIGVkZ2Ugd2hlbiBpc011bHRpZ3JhcGggXHgzZCBmYWxzZSIpO3RoaXMuc2V0Tm9kZSh2KTt0aGlzLnNldE5vZGUodyk7dGhpcy5fZWRnZUxhYmVsc1tlXT12YWx1ZVNwZWNpZmllZD92YWx1ZTp0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm4odix3LG5hbWUpO3ZhciBlZGdlT2JqPWVkZ2VBcmdzVG9PYmoodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSk7dj1lZGdlT2JqLnY7dz1lZGdlT2JqLnc7T2JqZWN0LmZyZWV6ZShlZGdlT2JqKTt0aGlzLl9lZGdlT2Jqc1tlXT1lZGdlT2JqO2luY3JlbWVudE9ySW5pdEVudHJ5KHRoaXMuX3ByZWRzW3ddLHYpO2luY3JlbWVudE9ySW5pdEVudHJ5KHRoaXMuX3N1Y3Nbdl0sdyk7dGhpcy5faW5bd11bZV09CmVkZ2VPYmo7dGhpcy5fb3V0W3ZdW2VdPWVkZ2VPYmo7dGhpcy5fZWRnZUNvdW50Kys7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5lZGdlPWZ1bmN0aW9uKHYsdyxuYW1lKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPT09MT9lZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLGFyZ3VtZW50c1swXSk6ZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsdix3LG5hbWUpO3JldHVybiB0aGlzLl9lZGdlTGFiZWxzW2VdfTtHcmFwaC5wcm90b3R5cGUuaGFzRWRnZT1mdW5jdGlvbih2LHcsbmFtZSl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD09PTE/ZWRnZU9ialRvSWQodGhpcy5faXNEaXJlY3RlZCxhcmd1bWVudHNbMF0pOmVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLHYsdyxuYW1lKTtyZXR1cm4gXy5oYXModGhpcy5fZWRnZUxhYmVscyxlKX07R3JhcGgucHJvdG90eXBlLnJlbW92ZUVkZ2U9ZnVuY3Rpb24odix3LG5hbWUpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg9PT0xPwplZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLGFyZ3VtZW50c1swXSk6ZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsdix3LG5hbWUpLGVkZ2U9dGhpcy5fZWRnZU9ianNbZV07aWYoZWRnZSl7dj1lZGdlLnY7dz1lZGdlLnc7ZGVsZXRlIHRoaXMuX2VkZ2VMYWJlbHNbZV07ZGVsZXRlIHRoaXMuX2VkZ2VPYmpzW2VdO2RlY3JlbWVudE9yUmVtb3ZlRW50cnkodGhpcy5fcHJlZHNbd10sdik7ZGVjcmVtZW50T3JSZW1vdmVFbnRyeSh0aGlzLl9zdWNzW3ZdLHcpO2RlbGV0ZSB0aGlzLl9pblt3XVtlXTtkZWxldGUgdGhpcy5fb3V0W3ZdW2VdO3RoaXMuX2VkZ2VDb3VudC0tfXJldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuaW5FZGdlcz1mdW5jdGlvbih2LHUpe3ZhciBpblY9dGhpcy5faW5bdl07aWYoaW5WKXt2YXIgZWRnZXM9Xy52YWx1ZXMoaW5WKTtpZighdSlyZXR1cm4gZWRnZXM7cmV0dXJuIF8uZmlsdGVyKGVkZ2VzLGZ1bmN0aW9uKGVkZ2Upe3JldHVybiBlZGdlLnY9PT0KdX0pfX07R3JhcGgucHJvdG90eXBlLm91dEVkZ2VzPWZ1bmN0aW9uKHYsdyl7dmFyIG91dFY9dGhpcy5fb3V0W3ZdO2lmKG91dFYpe3ZhciBlZGdlcz1fLnZhbHVlcyhvdXRWKTtpZighdylyZXR1cm4gZWRnZXM7cmV0dXJuIF8uZmlsdGVyKGVkZ2VzLGZ1bmN0aW9uKGVkZ2Upe3JldHVybiBlZGdlLnc9PT13fSl9fTtHcmFwaC5wcm90b3R5cGUubm9kZUVkZ2VzPWZ1bmN0aW9uKHYsdyl7dmFyIGluRWRnZXM9dGhpcy5pbkVkZ2VzKHYsdyk7aWYoaW5FZGdlcylyZXR1cm4gaW5FZGdlcy5jb25jYXQodGhpcy5vdXRFZGdlcyh2LHcpKX07ZnVuY3Rpb24gaW5jcmVtZW50T3JJbml0RW50cnkobWFwLGspe2lmKG1hcFtrXSltYXBba10rKztlbHNlIG1hcFtrXT0xfWZ1bmN0aW9uIGRlY3JlbWVudE9yUmVtb3ZlRW50cnkobWFwLGspe2lmKCEtLW1hcFtrXSlkZWxldGUgbWFwW2tdfWZ1bmN0aW9uIGVkZ2VBcmdzVG9JZChpc0RpcmVjdGVkLHZfLHdfLG5hbWUpe3ZhciB2PSIiK3ZfO3ZhciB3PQoiIit3XztpZighaXNEaXJlY3RlZCYmdj53KXt2YXIgdG1wPXY7dj13O3c9dG1wfXJldHVybiB2K0VER0VfS0VZX0RFTElNK3crRURHRV9LRVlfREVMSU0rKF8uaXNVbmRlZmluZWQobmFtZSk/REVGQVVMVF9FREdFX05BTUU6bmFtZSl9ZnVuY3Rpb24gZWRnZUFyZ3NUb09iaihpc0RpcmVjdGVkLHZfLHdfLG5hbWUpe3ZhciB2PSIiK3ZfO3ZhciB3PSIiK3dfO2lmKCFpc0RpcmVjdGVkJiZ2Pncpe3ZhciB0bXA9djt2PXc7dz10bXB9dmFyIGVkZ2VPYmo9e3Y6dix3Ond9O2lmKG5hbWUpZWRnZU9iai5uYW1lPW5hbWU7cmV0dXJuIGVkZ2VPYmp9ZnVuY3Rpb24gZWRnZU9ialRvSWQoaXNEaXJlY3RlZCxlZGdlT2JqKXtyZXR1cm4gZWRnZUFyZ3NUb0lkKGlzRGlyZWN0ZWQsZWRnZU9iai52LGVkZ2VPYmoudyxlZGdlT2JqLm5hbWUpfX0seyIuL2xvZGFzaCI6MTl9XSwxNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9e0dyYXBoOnJlcXVpcmUoIi4vZ3JhcGgiKSwKdmVyc2lvbjpyZXF1aXJlKCIuL3ZlcnNpb24iKX19LHsiLi9ncmFwaCI6MTYsIi4vdmVyc2lvbiI6MjB9XSwxODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSxHcmFwaD1yZXF1aXJlKCIuL2dyYXBoIik7bW9kdWxlLmV4cG9ydHM9e3dyaXRlOndyaXRlLHJlYWQ6cmVhZH07ZnVuY3Rpb24gd3JpdGUoZyl7dmFyIGpzb249e29wdGlvbnM6e2RpcmVjdGVkOmcuaXNEaXJlY3RlZCgpLG11bHRpZ3JhcGg6Zy5pc011bHRpZ3JhcGgoKSxjb21wb3VuZDpnLmlzQ29tcG91bmQoKX0sbm9kZXM6d3JpdGVOb2RlcyhnKSxlZGdlczp3cml0ZUVkZ2VzKGcpfTtpZighXy5pc1VuZGVmaW5lZChnLmdyYXBoKCkpKWpzb24udmFsdWU9Xy5jbG9uZShnLmdyYXBoKCkpO3JldHVybiBqc29ufWZ1bmN0aW9uIHdyaXRlTm9kZXMoZyl7cmV0dXJuIF8ubWFwKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZVZhbHVlPWcubm9kZSh2KSxwYXJlbnQ9CmcucGFyZW50KHYpLG5vZGU9e3Y6dn07aWYoIV8uaXNVbmRlZmluZWQobm9kZVZhbHVlKSlub2RlLnZhbHVlPW5vZGVWYWx1ZTtpZighXy5pc1VuZGVmaW5lZChwYXJlbnQpKW5vZGUucGFyZW50PXBhcmVudDtyZXR1cm4gbm9kZX0pfWZ1bmN0aW9uIHdyaXRlRWRnZXMoZyl7cmV0dXJuIF8ubWFwKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZVZhbHVlPWcuZWRnZShlKSxlZGdlPXt2OmUudix3OmUud307aWYoIV8uaXNVbmRlZmluZWQoZS5uYW1lKSllZGdlLm5hbWU9ZS5uYW1lO2lmKCFfLmlzVW5kZWZpbmVkKGVkZ2VWYWx1ZSkpZWRnZS52YWx1ZT1lZGdlVmFsdWU7cmV0dXJuIGVkZ2V9KX1mdW5jdGlvbiByZWFkKGpzb24pe3ZhciBnPShuZXcgR3JhcGgoanNvbi5vcHRpb25zKSkuc2V0R3JhcGgoanNvbi52YWx1ZSk7Xy5lYWNoKGpzb24ubm9kZXMsZnVuY3Rpb24oZW50cnkpe2cuc2V0Tm9kZShlbnRyeS52LGVudHJ5LnZhbHVlKTtpZihlbnRyeS5wYXJlbnQpZy5zZXRQYXJlbnQoZW50cnkudiwKZW50cnkucGFyZW50KX0pO18uZWFjaChqc29uLmVkZ2VzLGZ1bmN0aW9uKGVudHJ5KXtnLnNldEVkZ2Uoe3Y6ZW50cnkudix3OmVudHJ5LncsbmFtZTplbnRyeS5uYW1lfSxlbnRyeS52YWx1ZSl9KTtyZXR1cm4gZ319LHsiLi9ncmFwaCI6MTYsIi4vbG9kYXNoIjoxOX1dLDE5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgbG9kYXNoO2lmKHR5cGVvZiByZXF1aXJlPT09ImZ1bmN0aW9uIil0cnl7bG9kYXNoPXJlcXVpcmUoImxvZGFzaCIpfWNhdGNoKGUpe31pZighbG9kYXNoKWxvZGFzaD13aW5kb3cuXzttb2R1bGUuZXhwb3J0cz1sb2Rhc2h9LHsibG9kYXNoIjp1bmRlZmluZWR9XSwyMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9IjIuMS41In0se31dfSx7fSxbMV0pKDEpfSk7CihmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlIT09InVuZGVmaW5lZCIpbW9kdWxlLmV4cG9ydHM9ZigpO2Vsc2UgaWYodHlwZW9mIGRlZmluZT09PSJmdW5jdGlvbiImJmRlZmluZS5hbWQpZGVmaW5lKFtdLGYpO2Vsc2V7dmFyIGc7aWYodHlwZW9mIHdpbmRvdyE9PSJ1bmRlZmluZWQiKWc9d2luZG93O2Vsc2UgaWYodHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiKWc9Z2xvYmFsO2Vsc2UgaWYodHlwZW9mIHNlbGYhPT0idW5kZWZpbmVkIilnPXNlbGY7ZWxzZSBnPXRoaXM7Zy5kYWdyZT1mKCl9fSkoZnVuY3Rpb24oKXt2YXIgZGVmaW5lLG1vZHVsZSxleHBvcnRzO3JldHVybiBmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPQpuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitvKyInIik7dGhyb3cgZi5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixmO312YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KHsxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz17Z3JhcGhsaWI6cmVxdWlyZSgiLi9saWIvZ3JhcGhsaWIiKSxsYXlvdXQ6cmVxdWlyZSgiLi9saWIvbGF5b3V0IiksZGVidWc6cmVxdWlyZSgiLi9saWIvZGVidWciKSx1dGlsOnt0aW1lOnJlcXVpcmUoIi4vbGliL3V0aWwiKS50aW1lLG5vdGltZTpyZXF1aXJlKCIuL2xpYi91dGlsIikubm90aW1lfSwKdmVyc2lvbjpyZXF1aXJlKCIuL2xpYi92ZXJzaW9uIil9fSx7Ii4vbGliL2RlYnVnIjo2LCIuL2xpYi9ncmFwaGxpYiI6NywiLi9saWIvbGF5b3V0Ijo5LCIuL2xpYi91dGlsIjoyOSwiLi9saWIvdmVyc2lvbiI6MzB9XSwyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLGdyZWVkeUZBUz1yZXF1aXJlKCIuL2dyZWVkeS1mYXMiKTttb2R1bGUuZXhwb3J0cz17cnVuOnJ1bix1bmRvOnVuZG99O2Z1bmN0aW9uIHJ1bihnKXt2YXIgZmFzPWcuZ3JhcGgoKS5hY3ljbGljZXI9PT0iZ3JlZWR5Ij9ncmVlZHlGQVMoZyx3ZWlnaHRGbihnKSk6ZGZzRkFTKGcpO18uZm9yRWFjaChmYXMsZnVuY3Rpb24oZSl7dmFyIGxhYmVsPWcuZWRnZShlKTtnLnJlbW92ZUVkZ2UoZSk7bGFiZWwuZm9yd2FyZE5hbWU9ZS5uYW1lO2xhYmVsLnJldmVyc2VkPXRydWU7Zy5zZXRFZGdlKGUudyxlLnYsbGFiZWwsXy51bmlxdWVJZCgicmV2IikpfSk7ZnVuY3Rpb24gd2VpZ2h0Rm4oZyl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBnLmVkZ2UoZSkud2VpZ2h0fX0KfWZ1bmN0aW9uIGRmc0ZBUyhnKXt2YXIgZmFzPVtdLHN0YWNrPXt9LHZpc2l0ZWQ9e307ZnVuY3Rpb24gZGZzKHYpe2lmKF8uaGFzKHZpc2l0ZWQsdikpcmV0dXJuO3Zpc2l0ZWRbdl09dHJ1ZTtzdGFja1t2XT10cnVlO18uZm9yRWFjaChnLm91dEVkZ2VzKHYpLGZ1bmN0aW9uKGUpe2lmKF8uaGFzKHN0YWNrLGUudykpZmFzLnB1c2goZSk7ZWxzZSBkZnMoZS53KX0pO2RlbGV0ZSBzdGFja1t2XX1fLmZvckVhY2goZy5ub2RlcygpLGRmcyk7cmV0dXJuIGZhc31mdW5jdGlvbiB1bmRvKGcpe18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGxhYmVsPWcuZWRnZShlKTtpZihsYWJlbC5yZXZlcnNlZCl7Zy5yZW1vdmVFZGdlKGUpO3ZhciBmb3J3YXJkTmFtZT1sYWJlbC5mb3J3YXJkTmFtZTtkZWxldGUgbGFiZWwucmV2ZXJzZWQ7ZGVsZXRlIGxhYmVsLmZvcndhcmROYW1lO2cuc2V0RWRnZShlLncsZS52LGxhYmVsLGZvcndhcmROYW1lKX19KX19LHsiLi9ncmVlZHktZmFzIjo4LAoiLi9sb2Rhc2giOjEwfV0sMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4vdXRpbCIpO21vZHVsZS5leHBvcnRzPWFkZEJvcmRlclNlZ21lbnRzO2Z1bmN0aW9uIGFkZEJvcmRlclNlZ21lbnRzKGcpe2Z1bmN0aW9uIGRmcyh2KXt2YXIgY2hpbGRyZW49Zy5jaGlsZHJlbih2KSxub2RlPWcubm9kZSh2KTtpZihjaGlsZHJlbi5sZW5ndGgpXy5mb3JFYWNoKGNoaWxkcmVuLGRmcyk7aWYoXy5oYXMobm9kZSwibWluUmFuayIpKXtub2RlLmJvcmRlckxlZnQ9W107bm9kZS5ib3JkZXJSaWdodD1bXTtmb3IodmFyIHJhbms9bm9kZS5taW5SYW5rLG1heFJhbms9bm9kZS5tYXhSYW5rKzE7cmFuazxtYXhSYW5rOysrcmFuayl7YWRkQm9yZGVyTm9kZShnLCJib3JkZXJMZWZ0IiwiX2JsIix2LG5vZGUscmFuayk7YWRkQm9yZGVyTm9kZShnLCJib3JkZXJSaWdodCIsIl9iciIsdixub2RlLHJhbmspfX19Xy5mb3JFYWNoKGcuY2hpbGRyZW4oKSwKZGZzKX1mdW5jdGlvbiBhZGRCb3JkZXJOb2RlKGcscHJvcCxwcmVmaXgsc2csc2dOb2RlLHJhbmspe3ZhciBsYWJlbD17d2lkdGg6MCxoZWlnaHQ6MCxyYW5rOnJhbmssYm9yZGVyVHlwZTpwcm9wfSxwcmV2PXNnTm9kZVtwcm9wXVtyYW5rLTFdLGN1cnI9dXRpbC5hZGREdW1teU5vZGUoZywiYm9yZGVyIixsYWJlbCxwcmVmaXgpO3NnTm9kZVtwcm9wXVtyYW5rXT1jdXJyO2cuc2V0UGFyZW50KGN1cnIsc2cpO2lmKHByZXYpZy5zZXRFZGdlKHByZXYsY3Vycix7d2VpZ2h0OjF9KX19LHsiLi9sb2Rhc2giOjEwLCIuL3V0aWwiOjI5fV0sNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz17YWRqdXN0OmFkanVzdCx1bmRvOnVuZG99O2Z1bmN0aW9uIGFkanVzdChnKXt2YXIgcmFua0Rpcj1nLmdyYXBoKCkucmFua2Rpci50b0xvd2VyQ2FzZSgpO2lmKHJhbmtEaXI9PT0ibHIifHxyYW5rRGlyPT09InJsIilzd2FwV2lkdGhIZWlnaHQoZyl9CmZ1bmN0aW9uIHVuZG8oZyl7dmFyIHJhbmtEaXI9Zy5ncmFwaCgpLnJhbmtkaXIudG9Mb3dlckNhc2UoKTtpZihyYW5rRGlyPT09ImJ0Inx8cmFua0Rpcj09PSJybCIpcmV2ZXJzZVkoZyk7aWYocmFua0Rpcj09PSJsciJ8fHJhbmtEaXI9PT0icmwiKXtzd2FwWFkoZyk7c3dhcFdpZHRoSGVpZ2h0KGcpfX1mdW5jdGlvbiBzd2FwV2lkdGhIZWlnaHQoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtzd2FwV2lkdGhIZWlnaHRPbmUoZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7c3dhcFdpZHRoSGVpZ2h0T25lKGcuZWRnZShlKSl9KX1mdW5jdGlvbiBzd2FwV2lkdGhIZWlnaHRPbmUoYXR0cnMpe3ZhciB3PWF0dHJzLndpZHRoO2F0dHJzLndpZHRoPWF0dHJzLmhlaWdodDthdHRycy5oZWlnaHQ9d31mdW5jdGlvbiByZXZlcnNlWShnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldmVyc2VZT25lKGcubm9kZSh2KSl9KTtfLmZvckVhY2goZy5lZGdlcygpLApmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7Xy5mb3JFYWNoKGVkZ2UucG9pbnRzLHJldmVyc2VZT25lKTtpZihfLmhhcyhlZGdlLCJ5IikpcmV2ZXJzZVlPbmUoZWRnZSl9KX1mdW5jdGlvbiByZXZlcnNlWU9uZShhdHRycyl7YXR0cnMueT0tYXR0cnMueX1mdW5jdGlvbiBzd2FwWFkoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtzd2FwWFlPbmUoZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO18uZm9yRWFjaChlZGdlLnBvaW50cyxzd2FwWFlPbmUpO2lmKF8uaGFzKGVkZ2UsIngiKSlzd2FwWFlPbmUoZWRnZSl9KX1mdW5jdGlvbiBzd2FwWFlPbmUoYXR0cnMpe3ZhciB4PWF0dHJzLng7YXR0cnMueD1hdHRycy55O2F0dHJzLnk9eH19LHsiLi9sb2Rhc2giOjEwfV0sNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9TGlzdDtmdW5jdGlvbiBMaXN0KCl7dmFyIHNlbnRpbmVsPQp7fTtzZW50aW5lbC5fbmV4dD1zZW50aW5lbC5fcHJldj1zZW50aW5lbDt0aGlzLl9zZW50aW5lbD1zZW50aW5lbH1MaXN0LnByb3RvdHlwZS5kZXF1ZXVlPWZ1bmN0aW9uKCl7dmFyIHNlbnRpbmVsPXRoaXMuX3NlbnRpbmVsLGVudHJ5PXNlbnRpbmVsLl9wcmV2O2lmKGVudHJ5IT09c2VudGluZWwpe3VubGluayhlbnRyeSk7cmV0dXJuIGVudHJ5fX07TGlzdC5wcm90b3R5cGUuZW5xdWV1ZT1mdW5jdGlvbihlbnRyeSl7dmFyIHNlbnRpbmVsPXRoaXMuX3NlbnRpbmVsO2lmKGVudHJ5Ll9wcmV2JiZlbnRyeS5fbmV4dCl1bmxpbmsoZW50cnkpO2VudHJ5Ll9uZXh0PXNlbnRpbmVsLl9uZXh0O3NlbnRpbmVsLl9uZXh0Ll9wcmV2PWVudHJ5O3NlbnRpbmVsLl9uZXh0PWVudHJ5O2VudHJ5Ll9wcmV2PXNlbnRpbmVsfTtMaXN0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBzdHJzPVtdLHNlbnRpbmVsPXRoaXMuX3NlbnRpbmVsLGN1cnI9c2VudGluZWwuX3ByZXY7d2hpbGUoY3VyciE9PQpzZW50aW5lbCl7c3Rycy5wdXNoKEpTT04uc3RyaW5naWZ5KGN1cnIsZmlsdGVyT3V0TGlua3MpKTtjdXJyPWN1cnIuX3ByZXZ9cmV0dXJuIlsiK3N0cnMuam9pbigiLCAiKSsiXSJ9O2Z1bmN0aW9uIHVubGluayhlbnRyeSl7ZW50cnkuX3ByZXYuX25leHQ9ZW50cnkuX25leHQ7ZW50cnkuX25leHQuX3ByZXY9ZW50cnkuX3ByZXY7ZGVsZXRlIGVudHJ5Ll9uZXh0O2RlbGV0ZSBlbnRyeS5fcHJldn1mdW5jdGlvbiBmaWx0ZXJPdXRMaW5rcyhrLHYpe2lmKGshPT0iX25leHQiJiZrIT09Il9wcmV2IilyZXR1cm4gdn19LHt9XSw2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLHV0aWw9cmVxdWlyZSgiLi91dGlsIiksR3JhcGg9cmVxdWlyZSgiLi9ncmFwaGxpYiIpLkdyYXBoO21vZHVsZS5leHBvcnRzPXtkZWJ1Z09yZGVyaW5nOmRlYnVnT3JkZXJpbmd9O2Z1bmN0aW9uIGRlYnVnT3JkZXJpbmcoZyl7dmFyIGxheWVyTWF0cml4PQp1dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7dmFyIGg9KG5ldyBHcmFwaCh7Y29tcG91bmQ6dHJ1ZSxtdWx0aWdyYXBoOnRydWV9KSkuc2V0R3JhcGgoe30pO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7aC5zZXROb2RlKHYse2xhYmVsOnZ9KTtoLnNldFBhcmVudCh2LCJsYXllciIrZy5ub2RlKHYpLnJhbmspfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXtoLnNldEVkZ2UoZS52LGUudyx7fSxlLm5hbWUpfSk7Xy5mb3JFYWNoKGxheWVyTWF0cml4LGZ1bmN0aW9uKGxheWVyLGkpe3ZhciBsYXllclY9ImxheWVyIitpO2guc2V0Tm9kZShsYXllclYse3Jhbms6InNhbWUifSk7Xy5yZWR1Y2UobGF5ZXIsZnVuY3Rpb24odSx2KXtoLnNldEVkZ2UodSx2LHtzdHlsZToiaW52aXMifSk7cmV0dXJuIHZ9KX0pO3JldHVybiBofX0seyIuL2dyYXBobGliIjo3LCIuL2xvZGFzaCI6MTAsIi4vdXRpbCI6Mjl9XSw3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgZ3JhcGhsaWI7CmlmKHR5cGVvZiByZXF1aXJlPT09ImZ1bmN0aW9uIil0cnl7Z3JhcGhsaWI9cmVxdWlyZSgiZ3JhcGhsaWIiKX1jYXRjaChlKXt9aWYoIWdyYXBobGliKWdyYXBobGliPXdpbmRvdy5ncmFwaGxpYjttb2R1bGUuZXhwb3J0cz1ncmFwaGxpYn0seyJncmFwaGxpYiI6dW5kZWZpbmVkfV0sODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSxHcmFwaD1yZXF1aXJlKCIuL2dyYXBobGliIikuR3JhcGgsTGlzdD1yZXF1aXJlKCIuL2RhdGEvbGlzdCIpO21vZHVsZS5leHBvcnRzPWdyZWVkeUZBUzt2YXIgREVGQVVMVF9XRUlHSFRfRk49Xy5jb25zdGFudCgxKTtmdW5jdGlvbiBncmVlZHlGQVMoZyx3ZWlnaHRGbil7aWYoZy5ub2RlQ291bnQoKTw9MSlyZXR1cm5bXTt2YXIgc3RhdGU9YnVpbGRTdGF0ZShnLHdlaWdodEZufHxERUZBVUxUX1dFSUdIVF9GTik7dmFyIHJlc3VsdHM9ZG9HcmVlZHlGQVMoc3RhdGUuZ3JhcGgsc3RhdGUuYnVja2V0cywKc3RhdGUuemVyb0lkeCk7cmV0dXJuIF8uZmxhdHRlbihfLm1hcChyZXN1bHRzLGZ1bmN0aW9uKGUpe3JldHVybiBnLm91dEVkZ2VzKGUudixlLncpfSksdHJ1ZSl9ZnVuY3Rpb24gZG9HcmVlZHlGQVMoZyxidWNrZXRzLHplcm9JZHgpe3ZhciByZXN1bHRzPVtdLHNvdXJjZXM9YnVja2V0c1tidWNrZXRzLmxlbmd0aC0xXSxzaW5rcz1idWNrZXRzWzBdO3ZhciBlbnRyeTt3aGlsZShnLm5vZGVDb3VudCgpKXt3aGlsZShlbnRyeT1zaW5rcy5kZXF1ZXVlKCkpcmVtb3ZlTm9kZShnLGJ1Y2tldHMsemVyb0lkeCxlbnRyeSk7d2hpbGUoZW50cnk9c291cmNlcy5kZXF1ZXVlKCkpcmVtb3ZlTm9kZShnLGJ1Y2tldHMsemVyb0lkeCxlbnRyeSk7aWYoZy5ub2RlQ291bnQoKSlmb3IodmFyIGk9YnVja2V0cy5sZW5ndGgtMjtpPjA7LS1pKXtlbnRyeT1idWNrZXRzW2ldLmRlcXVldWUoKTtpZihlbnRyeSl7cmVzdWx0cz1yZXN1bHRzLmNvbmNhdChyZW1vdmVOb2RlKGcsYnVja2V0cyx6ZXJvSWR4LAplbnRyeSx0cnVlKSk7YnJlYWt9fX1yZXR1cm4gcmVzdWx0c31mdW5jdGlvbiByZW1vdmVOb2RlKGcsYnVja2V0cyx6ZXJvSWR4LGVudHJ5LGNvbGxlY3RQcmVkZWNlc3NvcnMpe3ZhciByZXN1bHRzPWNvbGxlY3RQcmVkZWNlc3NvcnM/W106dW5kZWZpbmVkO18uZm9yRWFjaChnLmluRWRnZXMoZW50cnkudiksZnVuY3Rpb24oZWRnZSl7dmFyIHdlaWdodD1nLmVkZ2UoZWRnZSksdUVudHJ5PWcubm9kZShlZGdlLnYpO2lmKGNvbGxlY3RQcmVkZWNlc3NvcnMpcmVzdWx0cy5wdXNoKHt2OmVkZ2Uudix3OmVkZ2Uud30pO3VFbnRyeS5vdXQtPXdlaWdodDthc3NpZ25CdWNrZXQoYnVja2V0cyx6ZXJvSWR4LHVFbnRyeSl9KTtfLmZvckVhY2goZy5vdXRFZGdlcyhlbnRyeS52KSxmdW5jdGlvbihlZGdlKXt2YXIgd2VpZ2h0PWcuZWRnZShlZGdlKSx3PWVkZ2Uudyx3RW50cnk9Zy5ub2RlKHcpO3dFbnRyeVsiaW4iXS09d2VpZ2h0O2Fzc2lnbkJ1Y2tldChidWNrZXRzLHplcm9JZHgsd0VudHJ5KX0pOwpnLnJlbW92ZU5vZGUoZW50cnkudik7cmV0dXJuIHJlc3VsdHN9ZnVuY3Rpb24gYnVpbGRTdGF0ZShnLHdlaWdodEZuKXt2YXIgZmFzR3JhcGg9bmV3IEdyYXBoLG1heEluPTAsbWF4T3V0PTA7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtmYXNHcmFwaC5zZXROb2RlKHYse3Y6diwiaW4iOjAsb3V0OjB9KX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIHByZXZXZWlnaHQ9ZmFzR3JhcGguZWRnZShlLnYsZS53KXx8MCx3ZWlnaHQ9d2VpZ2h0Rm4oZSksZWRnZVdlaWdodD1wcmV2V2VpZ2h0K3dlaWdodDtmYXNHcmFwaC5zZXRFZGdlKGUudixlLncsZWRnZVdlaWdodCk7bWF4T3V0PU1hdGgubWF4KG1heE91dCxmYXNHcmFwaC5ub2RlKGUudikub3V0Kz13ZWlnaHQpO21heEluPU1hdGgubWF4KG1heEluLGZhc0dyYXBoLm5vZGUoZS53KVsiaW4iXSs9d2VpZ2h0KX0pO3ZhciBidWNrZXRzPV8ucmFuZ2UobWF4T3V0K21heEluKzMpLm1hcChmdW5jdGlvbigpe3JldHVybiBuZXcgTGlzdH0pOwp2YXIgemVyb0lkeD1tYXhJbisxO18uZm9yRWFjaChmYXNHcmFwaC5ub2RlcygpLGZ1bmN0aW9uKHYpe2Fzc2lnbkJ1Y2tldChidWNrZXRzLHplcm9JZHgsZmFzR3JhcGgubm9kZSh2KSl9KTtyZXR1cm57Z3JhcGg6ZmFzR3JhcGgsYnVja2V0czpidWNrZXRzLHplcm9JZHg6emVyb0lkeH19ZnVuY3Rpb24gYXNzaWduQnVja2V0KGJ1Y2tldHMsemVyb0lkeCxlbnRyeSl7aWYoIWVudHJ5Lm91dClidWNrZXRzWzBdLmVucXVldWUoZW50cnkpO2Vsc2UgaWYoIWVudHJ5WyJpbiJdKWJ1Y2tldHNbYnVja2V0cy5sZW5ndGgtMV0uZW5xdWV1ZShlbnRyeSk7ZWxzZSBidWNrZXRzW2VudHJ5Lm91dC1lbnRyeVsiaW4iXSt6ZXJvSWR4XS5lbnF1ZXVlKGVudHJ5KX19LHsiLi9kYXRhL2xpc3QiOjUsIi4vZ3JhcGhsaWIiOjcsIi4vbG9kYXNoIjoxMH1dLDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksYWN5Y2xpYz1yZXF1aXJlKCIuL2FjeWNsaWMiKSwKbm9ybWFsaXplPXJlcXVpcmUoIi4vbm9ybWFsaXplIikscmFuaz1yZXF1aXJlKCIuL3JhbmsiKSxub3JtYWxpemVSYW5rcz1yZXF1aXJlKCIuL3V0aWwiKS5ub3JtYWxpemVSYW5rcyxwYXJlbnREdW1teUNoYWlucz1yZXF1aXJlKCIuL3BhcmVudC1kdW1teS1jaGFpbnMiKSxyZW1vdmVFbXB0eVJhbmtzPXJlcXVpcmUoIi4vdXRpbCIpLnJlbW92ZUVtcHR5UmFua3MsbmVzdGluZ0dyYXBoPXJlcXVpcmUoIi4vbmVzdGluZy1ncmFwaCIpLGFkZEJvcmRlclNlZ21lbnRzPXJlcXVpcmUoIi4vYWRkLWJvcmRlci1zZWdtZW50cyIpLGNvb3JkaW5hdGVTeXN0ZW09cmVxdWlyZSgiLi9jb29yZGluYXRlLXN5c3RlbSIpLG9yZGVyPXJlcXVpcmUoIi4vb3JkZXIiKSxwb3NpdGlvbj1yZXF1aXJlKCIuL3Bvc2l0aW9uIiksdXRpbD1yZXF1aXJlKCIuL3V0aWwiKSxHcmFwaD1yZXF1aXJlKCIuL2dyYXBobGliIikuR3JhcGg7bW9kdWxlLmV4cG9ydHM9bGF5b3V0O2Z1bmN0aW9uIGxheW91dChnLG9wdHMpe3ZhciB0aW1lPQpvcHRzJiZvcHRzLmRlYnVnVGltaW5nP3V0aWwudGltZTp1dGlsLm5vdGltZTt0aW1lKCJsYXlvdXQiLGZ1bmN0aW9uKCl7dmFyIGxheW91dEdyYXBoPXRpbWUoIiAgYnVpbGRMYXlvdXRHcmFwaCIsZnVuY3Rpb24oKXtyZXR1cm4gYnVpbGRMYXlvdXRHcmFwaChnKX0pO3RpbWUoIiAgcnVuTGF5b3V0IixmdW5jdGlvbigpe3J1bkxheW91dChsYXlvdXRHcmFwaCx0aW1lKX0pO3RpbWUoIiAgdXBkYXRlSW5wdXRHcmFwaCIsZnVuY3Rpb24oKXt1cGRhdGVJbnB1dEdyYXBoKGcsbGF5b3V0R3JhcGgpfSl9KX1mdW5jdGlvbiBydW5MYXlvdXQoZyx0aW1lKXt0aW1lKCIgICAgbWFrZVNwYWNlRm9yRWRnZUxhYmVscyIsZnVuY3Rpb24oKXttYWtlU3BhY2VGb3JFZGdlTGFiZWxzKGcpfSk7dGltZSgiICAgIHJlbW92ZVNlbGZFZGdlcyIsZnVuY3Rpb24oKXtyZW1vdmVTZWxmRWRnZXMoZyl9KTt0aW1lKCIgICAgYWN5Y2xpYyIsZnVuY3Rpb24oKXthY3ljbGljLnJ1bihnKX0pO3RpbWUoIiAgICBuZXN0aW5nR3JhcGgucnVuIiwKZnVuY3Rpb24oKXtuZXN0aW5nR3JhcGgucnVuKGcpfSk7dGltZSgiICAgIHJhbmsiLGZ1bmN0aW9uKCl7cmFuayh1dGlsLmFzTm9uQ29tcG91bmRHcmFwaChnKSl9KTt0aW1lKCIgICAgaW5qZWN0RWRnZUxhYmVsUHJveGllcyIsZnVuY3Rpb24oKXtpbmplY3RFZGdlTGFiZWxQcm94aWVzKGcpfSk7dGltZSgiICAgIHJlbW92ZUVtcHR5UmFua3MiLGZ1bmN0aW9uKCl7cmVtb3ZlRW1wdHlSYW5rcyhnKX0pO3RpbWUoIiAgICBuZXN0aW5nR3JhcGguY2xlYW51cCIsZnVuY3Rpb24oKXtuZXN0aW5nR3JhcGguY2xlYW51cChnKX0pO3RpbWUoIiAgICBub3JtYWxpemVSYW5rcyIsZnVuY3Rpb24oKXtub3JtYWxpemVSYW5rcyhnKX0pO3RpbWUoIiAgICBhc3NpZ25SYW5rTWluTWF4IixmdW5jdGlvbigpe2Fzc2lnblJhbmtNaW5NYXgoZyl9KTt0aW1lKCIgICAgcmVtb3ZlRWRnZUxhYmVsUHJveGllcyIsZnVuY3Rpb24oKXtyZW1vdmVFZGdlTGFiZWxQcm94aWVzKGcpfSk7dGltZSgiICAgIG5vcm1hbGl6ZS5ydW4iLApmdW5jdGlvbigpe25vcm1hbGl6ZS5ydW4oZyl9KTt0aW1lKCIgICAgcGFyZW50RHVtbXlDaGFpbnMiLGZ1bmN0aW9uKCl7cGFyZW50RHVtbXlDaGFpbnMoZyl9KTt0aW1lKCIgICAgYWRkQm9yZGVyU2VnbWVudHMiLGZ1bmN0aW9uKCl7YWRkQm9yZGVyU2VnbWVudHMoZyl9KTt0aW1lKCIgICAgb3JkZXIiLGZ1bmN0aW9uKCl7b3JkZXIoZyl9KTt0aW1lKCIgICAgaW5zZXJ0U2VsZkVkZ2VzIixmdW5jdGlvbigpe2luc2VydFNlbGZFZGdlcyhnKX0pO3RpbWUoIiAgICBhZGp1c3RDb29yZGluYXRlU3lzdGVtIixmdW5jdGlvbigpe2Nvb3JkaW5hdGVTeXN0ZW0uYWRqdXN0KGcpfSk7dGltZSgiICAgIHBvc2l0aW9uIixmdW5jdGlvbigpe3Bvc2l0aW9uKGcpfSk7dGltZSgiICAgIHBvc2l0aW9uU2VsZkVkZ2VzIixmdW5jdGlvbigpe3Bvc2l0aW9uU2VsZkVkZ2VzKGcpfSk7dGltZSgiICAgIHJlbW92ZUJvcmRlck5vZGVzIixmdW5jdGlvbigpe3JlbW92ZUJvcmRlck5vZGVzKGcpfSk7dGltZSgiICAgIG5vcm1hbGl6ZS51bmRvIiwKZnVuY3Rpb24oKXtub3JtYWxpemUudW5kbyhnKX0pO3RpbWUoIiAgICBmaXh1cEVkZ2VMYWJlbENvb3JkcyIsZnVuY3Rpb24oKXtmaXh1cEVkZ2VMYWJlbENvb3JkcyhnKX0pO3RpbWUoIiAgICB1bmRvQ29vcmRpbmF0ZVN5c3RlbSIsZnVuY3Rpb24oKXtjb29yZGluYXRlU3lzdGVtLnVuZG8oZyl9KTt0aW1lKCIgICAgdHJhbnNsYXRlR3JhcGgiLGZ1bmN0aW9uKCl7dHJhbnNsYXRlR3JhcGgoZyl9KTt0aW1lKCIgICAgYXNzaWduTm9kZUludGVyc2VjdHMiLGZ1bmN0aW9uKCl7YXNzaWduTm9kZUludGVyc2VjdHMoZyl9KTt0aW1lKCIgICAgcmV2ZXJzZVBvaW50cyIsZnVuY3Rpb24oKXtyZXZlcnNlUG9pbnRzRm9yUmV2ZXJzZWRFZGdlcyhnKX0pO3RpbWUoIiAgICBhY3ljbGljLnVuZG8iLGZ1bmN0aW9uKCl7YWN5Y2xpYy51bmRvKGcpfSl9ZnVuY3Rpb24gdXBkYXRlSW5wdXRHcmFwaChpbnB1dEdyYXBoLGxheW91dEdyYXBoKXtfLmZvckVhY2goaW5wdXRHcmFwaC5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBpbnB1dExhYmVsPQppbnB1dEdyYXBoLm5vZGUodiksbGF5b3V0TGFiZWw9bGF5b3V0R3JhcGgubm9kZSh2KTtpZihpbnB1dExhYmVsKXtpbnB1dExhYmVsLng9bGF5b3V0TGFiZWwueDtpbnB1dExhYmVsLnk9bGF5b3V0TGFiZWwueTtpZihsYXlvdXRHcmFwaC5jaGlsZHJlbih2KS5sZW5ndGgpe2lucHV0TGFiZWwud2lkdGg9bGF5b3V0TGFiZWwud2lkdGg7aW5wdXRMYWJlbC5oZWlnaHQ9bGF5b3V0TGFiZWwuaGVpZ2h0fX19KTtfLmZvckVhY2goaW5wdXRHcmFwaC5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBpbnB1dExhYmVsPWlucHV0R3JhcGguZWRnZShlKSxsYXlvdXRMYWJlbD1sYXlvdXRHcmFwaC5lZGdlKGUpO2lucHV0TGFiZWwucG9pbnRzPWxheW91dExhYmVsLnBvaW50cztpZihfLmhhcyhsYXlvdXRMYWJlbCwieCIpKXtpbnB1dExhYmVsLng9bGF5b3V0TGFiZWwueDtpbnB1dExhYmVsLnk9bGF5b3V0TGFiZWwueX19KTtpbnB1dEdyYXBoLmdyYXBoKCkud2lkdGg9bGF5b3V0R3JhcGguZ3JhcGgoKS53aWR0aDsKaW5wdXRHcmFwaC5ncmFwaCgpLmhlaWdodD1sYXlvdXRHcmFwaC5ncmFwaCgpLmhlaWdodH12YXIgZ3JhcGhOdW1BdHRycz1bIm5vZGVzZXAiLCJlZGdlc2VwIiwicmFua3NlcCIsIm1hcmdpbngiLCJtYXJnaW55Il0sZ3JhcGhEZWZhdWx0cz17cmFua3NlcDo1MCxlZGdlc2VwOjIwLG5vZGVzZXA6NTAscmFua2RpcjoidGIifSxncmFwaEF0dHJzPVsiYWN5Y2xpY2VyIiwicmFua2VyIiwicmFua2RpciIsImFsaWduIl0sbm9kZU51bUF0dHJzPVsid2lkdGgiLCJoZWlnaHQiXSxub2RlRGVmYXVsdHM9e3dpZHRoOjAsaGVpZ2h0OjB9LGVkZ2VOdW1BdHRycz1bIm1pbmxlbiIsIndlaWdodCIsIndpZHRoIiwiaGVpZ2h0IiwibGFiZWxvZmZzZXQiXSxlZGdlRGVmYXVsdHM9e21pbmxlbjoxLHdlaWdodDoxLHdpZHRoOjAsaGVpZ2h0OjAsbGFiZWxvZmZzZXQ6MTAsbGFiZWxwb3M6InIifSxlZGdlQXR0cnM9WyJsYWJlbHBvcyJdO2Z1bmN0aW9uIGJ1aWxkTGF5b3V0R3JhcGgoaW5wdXRHcmFwaCl7dmFyIGc9Cm5ldyBHcmFwaCh7bXVsdGlncmFwaDp0cnVlLGNvbXBvdW5kOnRydWV9KSxncmFwaD1jYW5vbmljYWxpemUoaW5wdXRHcmFwaC5ncmFwaCgpKTtnLnNldEdyYXBoKF8ubWVyZ2Uoe30sZ3JhcGhEZWZhdWx0cyxzZWxlY3ROdW1iZXJBdHRycyhncmFwaCxncmFwaE51bUF0dHJzKSxfLnBpY2soZ3JhcGgsZ3JhcGhBdHRycykpKTtfLmZvckVhY2goaW5wdXRHcmFwaC5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLm5vZGUodikpO2cuc2V0Tm9kZSh2LF8uZGVmYXVsdHMoc2VsZWN0TnVtYmVyQXR0cnMobm9kZSxub2RlTnVtQXR0cnMpLG5vZGVEZWZhdWx0cykpO2cuc2V0UGFyZW50KHYsaW5wdXRHcmFwaC5wYXJlbnQodikpfSk7Xy5mb3JFYWNoKGlucHV0R3JhcGguZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1jYW5vbmljYWxpemUoaW5wdXRHcmFwaC5lZGdlKGUpKTtnLnNldEVkZ2UoZSxfLm1lcmdlKHt9LGVkZ2VEZWZhdWx0cyxzZWxlY3ROdW1iZXJBdHRycyhlZGdlLAplZGdlTnVtQXR0cnMpLF8ucGljayhlZGdlLGVkZ2VBdHRycykpKX0pO3JldHVybiBnfWZ1bmN0aW9uIG1ha2VTcGFjZUZvckVkZ2VMYWJlbHMoZyl7dmFyIGdyYXBoPWcuZ3JhcGgoKTtncmFwaC5yYW5rc2VwLz0yO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2VkZ2UubWlubGVuKj0yO2lmKGVkZ2UubGFiZWxwb3MudG9Mb3dlckNhc2UoKSE9PSJjIilpZihncmFwaC5yYW5rZGlyPT09IlRCInx8Z3JhcGgucmFua2Rpcj09PSJCVCIpZWRnZS53aWR0aCs9ZWRnZS5sYWJlbG9mZnNldDtlbHNlIGVkZ2UuaGVpZ2h0Kz1lZGdlLmxhYmVsb2Zmc2V0fSl9ZnVuY3Rpb24gaW5qZWN0RWRnZUxhYmVsUHJveGllcyhnKXtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtpZihlZGdlLndpZHRoJiZlZGdlLmhlaWdodCl7dmFyIHY9Zy5ub2RlKGUudiksdz1nLm5vZGUoZS53KSxsYWJlbD17cmFuazoody5yYW5rLQp2LnJhbmspLzIrdi5yYW5rLGU6ZX07dXRpbC5hZGREdW1teU5vZGUoZywiZWRnZS1wcm94eSIsbGFiZWwsIl9lcCIpfX0pfWZ1bmN0aW9uIGFzc2lnblJhbmtNaW5NYXgoZyl7dmFyIG1heFJhbms9MDtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KTtpZihub2RlLmJvcmRlclRvcCl7bm9kZS5taW5SYW5rPWcubm9kZShub2RlLmJvcmRlclRvcCkucmFuaztub2RlLm1heFJhbms9Zy5ub2RlKG5vZGUuYm9yZGVyQm90dG9tKS5yYW5rO21heFJhbms9Xy5tYXgobWF4UmFuayxub2RlLm1heFJhbmspfX0pO2cuZ3JhcGgoKS5tYXhSYW5rPW1heFJhbmt9ZnVuY3Rpb24gcmVtb3ZlRWRnZUxhYmVsUHJveGllcyhnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KTtpZihub2RlLmR1bW15PT09ImVkZ2UtcHJveHkiKXtnLmVkZ2Uobm9kZS5lKS5sYWJlbFJhbms9bm9kZS5yYW5rO2cucmVtb3ZlTm9kZSh2KX19KX0KZnVuY3Rpb24gdHJhbnNsYXRlR3JhcGgoZyl7dmFyIG1pblg9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLG1heFg9MCxtaW5ZPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxtYXhZPTAsZ3JhcGhMYWJlbD1nLmdyYXBoKCksbWFyZ2luWD1ncmFwaExhYmVsLm1hcmdpbnh8fDAsbWFyZ2luWT1ncmFwaExhYmVsLm1hcmdpbnl8fDA7ZnVuY3Rpb24gZ2V0RXh0cmVtZXMoYXR0cnMpe3ZhciB4PWF0dHJzLngseT1hdHRycy55LHc9YXR0cnMud2lkdGgsaD1hdHRycy5oZWlnaHQ7bWluWD1NYXRoLm1pbihtaW5YLHgtdy8yKTttYXhYPU1hdGgubWF4KG1heFgseCt3LzIpO21pblk9TWF0aC5taW4obWluWSx5LWgvMik7bWF4WT1NYXRoLm1heChtYXhZLHkraC8yKX1fLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2dldEV4dHJlbWVzKGcubm9kZSh2KSl9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtpZihfLmhhcyhlZGdlLCJ4IikpZ2V0RXh0cmVtZXMoZWRnZSl9KTsKbWluWC09bWFyZ2luWDttaW5ZLT1tYXJnaW5ZO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpO25vZGUueC09bWluWDtub2RlLnktPW1pbll9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtfLmZvckVhY2goZWRnZS5wb2ludHMsZnVuY3Rpb24ocCl7cC54LT1taW5YO3AueS09bWluWX0pO2lmKF8uaGFzKGVkZ2UsIngiKSllZGdlLngtPW1pblg7aWYoXy5oYXMoZWRnZSwieSIpKWVkZ2UueS09bWluWX0pO2dyYXBoTGFiZWwud2lkdGg9bWF4WC1taW5YK21hcmdpblg7Z3JhcGhMYWJlbC5oZWlnaHQ9bWF4WS1taW5ZK21hcmdpbll9ZnVuY3Rpb24gYXNzaWduTm9kZUludGVyc2VjdHMoZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSksbm9kZVY9Zy5ub2RlKGUudiksbm9kZVc9Zy5ub2RlKGUudykscDEscDI7aWYoIWVkZ2UucG9pbnRzKXtlZGdlLnBvaW50cz0KW107cDE9bm9kZVc7cDI9bm9kZVZ9ZWxzZXtwMT1lZGdlLnBvaW50c1swXTtwMj1lZGdlLnBvaW50c1tlZGdlLnBvaW50cy5sZW5ndGgtMV19ZWRnZS5wb2ludHMudW5zaGlmdCh1dGlsLmludGVyc2VjdFJlY3Qobm9kZVYscDEpKTtlZGdlLnBvaW50cy5wdXNoKHV0aWwuaW50ZXJzZWN0UmVjdChub2RlVyxwMikpfSl9ZnVuY3Rpb24gZml4dXBFZGdlTGFiZWxDb29yZHMoZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7aWYoXy5oYXMoZWRnZSwieCIpKXtpZihlZGdlLmxhYmVscG9zPT09ImwifHxlZGdlLmxhYmVscG9zPT09InIiKWVkZ2Uud2lkdGgtPWVkZ2UubGFiZWxvZmZzZXQ7c3dpdGNoKGVkZ2UubGFiZWxwb3Mpe2Nhc2UgImwiOmVkZ2UueC09ZWRnZS53aWR0aC8yK2VkZ2UubGFiZWxvZmZzZXQ7YnJlYWs7Y2FzZSAiciI6ZWRnZS54Kz1lZGdlLndpZHRoLzIrZWRnZS5sYWJlbG9mZnNldDticmVha319fSl9ZnVuY3Rpb24gcmV2ZXJzZVBvaW50c0ZvclJldmVyc2VkRWRnZXMoZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSwKZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2lmKGVkZ2UucmV2ZXJzZWQpZWRnZS5wb2ludHMucmV2ZXJzZSgpfSl9ZnVuY3Rpb24gcmVtb3ZlQm9yZGVyTm9kZXMoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtpZihnLmNoaWxkcmVuKHYpLmxlbmd0aCl7dmFyIG5vZGU9Zy5ub2RlKHYpLHQ9Zy5ub2RlKG5vZGUuYm9yZGVyVG9wKSxiPWcubm9kZShub2RlLmJvcmRlckJvdHRvbSksbD1nLm5vZGUoXy5sYXN0KG5vZGUuYm9yZGVyTGVmdCkpLHI9Zy5ub2RlKF8ubGFzdChub2RlLmJvcmRlclJpZ2h0KSk7bm9kZS53aWR0aD1NYXRoLmFicyhyLngtbC54KTtub2RlLmhlaWdodD1NYXRoLmFicyhiLnktdC55KTtub2RlLng9bC54K25vZGUud2lkdGgvMjtub2RlLnk9dC55K25vZGUuaGVpZ2h0LzJ9fSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtpZihnLm5vZGUodikuZHVtbXk9PT0iYm9yZGVyIilnLnJlbW92ZU5vZGUodil9KX1mdW5jdGlvbiByZW1vdmVTZWxmRWRnZXMoZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSwKZnVuY3Rpb24oZSl7aWYoZS52PT09ZS53KXt2YXIgbm9kZT1nLm5vZGUoZS52KTtpZighbm9kZS5zZWxmRWRnZXMpbm9kZS5zZWxmRWRnZXM9W107bm9kZS5zZWxmRWRnZXMucHVzaCh7ZTplLGxhYmVsOmcuZWRnZShlKX0pO2cucmVtb3ZlRWRnZShlKX19KX1mdW5jdGlvbiBpbnNlcnRTZWxmRWRnZXMoZyl7dmFyIGxheWVycz11dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7Xy5mb3JFYWNoKGxheWVycyxmdW5jdGlvbihsYXllcil7dmFyIG9yZGVyU2hpZnQ9MDtfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odixpKXt2YXIgbm9kZT1nLm5vZGUodik7bm9kZS5vcmRlcj1pK29yZGVyU2hpZnQ7Xy5mb3JFYWNoKG5vZGUuc2VsZkVkZ2VzLGZ1bmN0aW9uKHNlbGZFZGdlKXt1dGlsLmFkZER1bW15Tm9kZShnLCJzZWxmZWRnZSIse3dpZHRoOnNlbGZFZGdlLmxhYmVsLndpZHRoLGhlaWdodDpzZWxmRWRnZS5sYWJlbC5oZWlnaHQscmFuazpub2RlLnJhbmssb3JkZXI6aSsgKytvcmRlclNoaWZ0LAplOnNlbGZFZGdlLmUsbGFiZWw6c2VsZkVkZ2UubGFiZWx9LCJfc2UiKX0pO2RlbGV0ZSBub2RlLnNlbGZFZGdlc30pfSl9ZnVuY3Rpb24gcG9zaXRpb25TZWxmRWRnZXMoZyl7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodik7aWYobm9kZS5kdW1teT09PSJzZWxmZWRnZSIpe3ZhciBzZWxmTm9kZT1nLm5vZGUobm9kZS5lLnYpLHg9c2VsZk5vZGUueCtzZWxmTm9kZS53aWR0aC8yLHk9c2VsZk5vZGUueSxkeD1ub2RlLngteCxkeT1zZWxmTm9kZS5oZWlnaHQvMjtnLnNldEVkZ2Uobm9kZS5lLG5vZGUubGFiZWwpO2cucmVtb3ZlTm9kZSh2KTtub2RlLmxhYmVsLnBvaW50cz1be3g6eCsyKmR4LzMseTp5LWR5fSx7eDp4KzUqZHgvNix5OnktZHl9LHt4OngrZHgseTp5fSx7eDp4KzUqZHgvNix5OnkrZHl9LHt4OngrMipkeC8zLHk6eStkeX1dO25vZGUubGFiZWwueD1ub2RlLng7bm9kZS5sYWJlbC55PW5vZGUueX19KX1mdW5jdGlvbiBzZWxlY3ROdW1iZXJBdHRycyhvYmosCmF0dHJzKXtyZXR1cm4gXy5tYXBWYWx1ZXMoXy5waWNrKG9iaixhdHRycyksTnVtYmVyKX1mdW5jdGlvbiBjYW5vbmljYWxpemUoYXR0cnMpe3ZhciBuZXdBdHRycz17fTtfLmZvckVhY2goYXR0cnMsZnVuY3Rpb24odixrKXtuZXdBdHRyc1trLnRvTG93ZXJDYXNlKCldPXZ9KTtyZXR1cm4gbmV3QXR0cnN9fSx7Ii4vYWN5Y2xpYyI6MiwiLi9hZGQtYm9yZGVyLXNlZ21lbnRzIjozLCIuL2Nvb3JkaW5hdGUtc3lzdGVtIjo0LCIuL2dyYXBobGliIjo3LCIuL2xvZGFzaCI6MTAsIi4vbmVzdGluZy1ncmFwaCI6MTEsIi4vbm9ybWFsaXplIjoxMiwiLi9vcmRlciI6MTcsIi4vcGFyZW50LWR1bW15LWNoYWlucyI6MjIsIi4vcG9zaXRpb24iOjI0LCIuL3JhbmsiOjI2LCIuL3V0aWwiOjI5fV0sMTA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBsb2Rhc2g7aWYodHlwZW9mIHJlcXVpcmU9PT0iZnVuY3Rpb24iKXRyeXtsb2Rhc2g9cmVxdWlyZSgibG9kYXNoIil9Y2F0Y2goZSl7fWlmKCFsb2Rhc2gpbG9kYXNoPQp3aW5kb3cuXzttb2R1bGUuZXhwb3J0cz1sb2Rhc2h9LHsibG9kYXNoIjp1bmRlZmluZWR9XSwxMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4vdXRpbCIpO21vZHVsZS5leHBvcnRzPXtydW46cnVuLGNsZWFudXA6Y2xlYW51cH07ZnVuY3Rpb24gcnVuKGcpe3ZhciByb290PXV0aWwuYWRkRHVtbXlOb2RlKGcsInJvb3QiLHt9LCJfcm9vdCIpO3ZhciBkZXB0aHM9dHJlZURlcHRocyhnKTt2YXIgaGVpZ2h0PV8ubWF4KF8udmFsdWVzKGRlcHRocykpLTE7dmFyIG5vZGVTZXA9MipoZWlnaHQrMTtnLmdyYXBoKCkubmVzdGluZ1Jvb3Q9cm9vdDtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe2cuZWRnZShlKS5taW5sZW4qPW5vZGVTZXB9KTt2YXIgd2VpZ2h0PXN1bVdlaWdodHMoZykrMTtfLmZvckVhY2goZy5jaGlsZHJlbigpLGZ1bmN0aW9uKGNoaWxkKXtkZnMoZyxyb290LG5vZGVTZXAsCndlaWdodCxoZWlnaHQsZGVwdGhzLGNoaWxkKX0pO2cuZ3JhcGgoKS5ub2RlUmFua0ZhY3Rvcj1ub2RlU2VwfWZ1bmN0aW9uIGRmcyhnLHJvb3Qsbm9kZVNlcCx3ZWlnaHQsaGVpZ2h0LGRlcHRocyx2KXt2YXIgY2hpbGRyZW49Zy5jaGlsZHJlbih2KTtpZighY2hpbGRyZW4ubGVuZ3RoKXtpZih2IT09cm9vdClnLnNldEVkZ2Uocm9vdCx2LHt3ZWlnaHQ6MCxtaW5sZW46bm9kZVNlcH0pO3JldHVybn12YXIgdG9wPXV0aWwuYWRkQm9yZGVyTm9kZShnLCJfYnQiKSxib3R0b209dXRpbC5hZGRCb3JkZXJOb2RlKGcsIl9iYiIpLGxhYmVsPWcubm9kZSh2KTtnLnNldFBhcmVudCh0b3Asdik7bGFiZWwuYm9yZGVyVG9wPXRvcDtnLnNldFBhcmVudChib3R0b20sdik7bGFiZWwuYm9yZGVyQm90dG9tPWJvdHRvbTtfLmZvckVhY2goY2hpbGRyZW4sZnVuY3Rpb24oY2hpbGQpe2RmcyhnLHJvb3Qsbm9kZVNlcCx3ZWlnaHQsaGVpZ2h0LGRlcHRocyxjaGlsZCk7dmFyIGNoaWxkTm9kZT1nLm5vZGUoY2hpbGQpLApjaGlsZFRvcD1jaGlsZE5vZGUuYm9yZGVyVG9wP2NoaWxkTm9kZS5ib3JkZXJUb3A6Y2hpbGQsY2hpbGRCb3R0b209Y2hpbGROb2RlLmJvcmRlckJvdHRvbT9jaGlsZE5vZGUuYm9yZGVyQm90dG9tOmNoaWxkLHRoaXNXZWlnaHQ9Y2hpbGROb2RlLmJvcmRlclRvcD93ZWlnaHQ6Mip3ZWlnaHQsbWlubGVuPWNoaWxkVG9wIT09Y2hpbGRCb3R0b20/MTpoZWlnaHQtZGVwdGhzW3ZdKzE7Zy5zZXRFZGdlKHRvcCxjaGlsZFRvcCx7d2VpZ2h0OnRoaXNXZWlnaHQsbWlubGVuOm1pbmxlbixuZXN0aW5nRWRnZTp0cnVlfSk7Zy5zZXRFZGdlKGNoaWxkQm90dG9tLGJvdHRvbSx7d2VpZ2h0OnRoaXNXZWlnaHQsbWlubGVuOm1pbmxlbixuZXN0aW5nRWRnZTp0cnVlfSl9KTtpZighZy5wYXJlbnQodikpZy5zZXRFZGdlKHJvb3QsdG9wLHt3ZWlnaHQ6MCxtaW5sZW46aGVpZ2h0K2RlcHRoc1t2XX0pfWZ1bmN0aW9uIHRyZWVEZXB0aHMoZyl7dmFyIGRlcHRocz17fTtmdW5jdGlvbiBkZnModixkZXB0aCl7dmFyIGNoaWxkcmVuPQpnLmNoaWxkcmVuKHYpO2lmKGNoaWxkcmVuJiZjaGlsZHJlbi5sZW5ndGgpXy5mb3JFYWNoKGNoaWxkcmVuLGZ1bmN0aW9uKGNoaWxkKXtkZnMoY2hpbGQsZGVwdGgrMSl9KTtkZXB0aHNbdl09ZGVwdGh9Xy5mb3JFYWNoKGcuY2hpbGRyZW4oKSxmdW5jdGlvbih2KXtkZnModiwxKX0pO3JldHVybiBkZXB0aHN9ZnVuY3Rpb24gc3VtV2VpZ2h0cyhnKXtyZXR1cm4gXy5yZWR1Y2UoZy5lZGdlcygpLGZ1bmN0aW9uKGFjYyxlKXtyZXR1cm4gYWNjK2cuZWRnZShlKS53ZWlnaHR9LDApfWZ1bmN0aW9uIGNsZWFudXAoZyl7dmFyIGdyYXBoTGFiZWw9Zy5ncmFwaCgpO2cucmVtb3ZlTm9kZShncmFwaExhYmVsLm5lc3RpbmdSb290KTtkZWxldGUgZ3JhcGhMYWJlbC5uZXN0aW5nUm9vdDtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtpZihlZGdlLm5lc3RpbmdFZGdlKWcucmVtb3ZlRWRnZShlKX0pfX0seyIuL2xvZGFzaCI6MTAsIi4vdXRpbCI6Mjl9XSwKMTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksdXRpbD1yZXF1aXJlKCIuL3V0aWwiKTttb2R1bGUuZXhwb3J0cz17cnVuOnJ1bix1bmRvOnVuZG99O2Z1bmN0aW9uIHJ1bihnKXtnLmdyYXBoKCkuZHVtbXlDaGFpbnM9W107Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlZGdlKXtub3JtYWxpemVFZGdlKGcsZWRnZSl9KX1mdW5jdGlvbiBub3JtYWxpemVFZGdlKGcsZSl7dmFyIHY9ZS52LHZSYW5rPWcubm9kZSh2KS5yYW5rLHc9ZS53LHdSYW5rPWcubm9kZSh3KS5yYW5rLG5hbWU9ZS5uYW1lLGVkZ2VMYWJlbD1nLmVkZ2UoZSksbGFiZWxSYW5rPWVkZ2VMYWJlbC5sYWJlbFJhbms7aWYod1Jhbms9PT12UmFuaysxKXJldHVybjtnLnJlbW92ZUVkZ2UoZSk7dmFyIGR1bW15LGF0dHJzLGk7Zm9yKGk9MCwrK3ZSYW5rO3ZSYW5rPHdSYW5rOysraSwrK3ZSYW5rKXtlZGdlTGFiZWwucG9pbnRzPVtdO2F0dHJzPXt3aWR0aDowLApoZWlnaHQ6MCxlZGdlTGFiZWw6ZWRnZUxhYmVsLGVkZ2VPYmo6ZSxyYW5rOnZSYW5rfTtkdW1teT11dGlsLmFkZER1bW15Tm9kZShnLCJlZGdlIixhdHRycywiX2QiKTtpZih2UmFuaz09PWxhYmVsUmFuayl7YXR0cnMud2lkdGg9ZWRnZUxhYmVsLndpZHRoO2F0dHJzLmhlaWdodD1lZGdlTGFiZWwuaGVpZ2h0O2F0dHJzLmR1bW15PSJlZGdlLWxhYmVsIjthdHRycy5sYWJlbHBvcz1lZGdlTGFiZWwubGFiZWxwb3N9Zy5zZXRFZGdlKHYsZHVtbXkse3dlaWdodDplZGdlTGFiZWwud2VpZ2h0fSxuYW1lKTtpZihpPT09MClnLmdyYXBoKCkuZHVtbXlDaGFpbnMucHVzaChkdW1teSk7dj1kdW1teX1nLnNldEVkZ2Uodix3LHt3ZWlnaHQ6ZWRnZUxhYmVsLndlaWdodH0sbmFtZSl9ZnVuY3Rpb24gdW5kbyhnKXtfLmZvckVhY2goZy5ncmFwaCgpLmR1bW15Q2hhaW5zLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KSxvcmlnTGFiZWw9bm9kZS5lZGdlTGFiZWwsdztnLnNldEVkZ2Uobm9kZS5lZGdlT2JqLApvcmlnTGFiZWwpO3doaWxlKG5vZGUuZHVtbXkpe3c9Zy5zdWNjZXNzb3JzKHYpWzBdO2cucmVtb3ZlTm9kZSh2KTtvcmlnTGFiZWwucG9pbnRzLnB1c2goe3g6bm9kZS54LHk6bm9kZS55fSk7aWYobm9kZS5kdW1teT09PSJlZGdlLWxhYmVsIil7b3JpZ0xhYmVsLng9bm9kZS54O29yaWdMYWJlbC55PW5vZGUueTtvcmlnTGFiZWwud2lkdGg9bm9kZS53aWR0aDtvcmlnTGFiZWwuaGVpZ2h0PW5vZGUuaGVpZ2h0fXY9dztub2RlPWcubm9kZSh2KX19KX19LHsiLi9sb2Rhc2giOjEwLCIuL3V0aWwiOjI5fV0sMTM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWFkZFN1YmdyYXBoQ29uc3RyYWludHM7ZnVuY3Rpb24gYWRkU3ViZ3JhcGhDb25zdHJhaW50cyhnLGNnLHZzKXt2YXIgcHJldj17fSxyb290UHJldjtfLmZvckVhY2godnMsZnVuY3Rpb24odil7dmFyIGNoaWxkPWcucGFyZW50KHYpLHBhcmVudCwKcHJldkNoaWxkO3doaWxlKGNoaWxkKXtwYXJlbnQ9Zy5wYXJlbnQoY2hpbGQpO2lmKHBhcmVudCl7cHJldkNoaWxkPXByZXZbcGFyZW50XTtwcmV2W3BhcmVudF09Y2hpbGR9ZWxzZXtwcmV2Q2hpbGQ9cm9vdFByZXY7cm9vdFByZXY9Y2hpbGR9aWYocHJldkNoaWxkJiZwcmV2Q2hpbGQhPT1jaGlsZCl7Y2cuc2V0RWRnZShwcmV2Q2hpbGQsY2hpbGQpO3JldHVybn1jaGlsZD1wYXJlbnR9fSl9fSx7Ii4uL2xvZGFzaCI6MTB9XSwxNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9YmFyeWNlbnRlcjtmdW5jdGlvbiBiYXJ5Y2VudGVyKGcsbW92YWJsZSl7cmV0dXJuIF8ubWFwKG1vdmFibGUsZnVuY3Rpb24odil7dmFyIGluVj1nLmluRWRnZXModik7aWYoIWluVi5sZW5ndGgpcmV0dXJue3Y6dn07ZWxzZXt2YXIgcmVzdWx0PV8ucmVkdWNlKGluVixmdW5jdGlvbihhY2MsZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpLApub2RlVT1nLm5vZGUoZS52KTtyZXR1cm57c3VtOmFjYy5zdW0rZWRnZS53ZWlnaHQqbm9kZVUub3JkZXIsd2VpZ2h0OmFjYy53ZWlnaHQrZWRnZS53ZWlnaHR9fSx7c3VtOjAsd2VpZ2h0OjB9KTtyZXR1cm57djp2LGJhcnljZW50ZXI6cmVzdWx0LnN1bS9yZXN1bHQud2VpZ2h0LHdlaWdodDpyZXN1bHQud2VpZ2h0fX19KX19LHsiLi4vbG9kYXNoIjoxMH1dLDE1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxHcmFwaD1yZXF1aXJlKCIuLi9ncmFwaGxpYiIpLkdyYXBoO21vZHVsZS5leHBvcnRzPWJ1aWxkTGF5ZXJHcmFwaDtmdW5jdGlvbiBidWlsZExheWVyR3JhcGgoZyxyYW5rLHJlbGF0aW9uc2hpcCl7dmFyIHJvb3Q9Y3JlYXRlUm9vdE5vZGUoZykscmVzdWx0PShuZXcgR3JhcGgoe2NvbXBvdW5kOnRydWV9KSkuc2V0R3JhcGgoe3Jvb3Q6cm9vdH0pLnNldERlZmF1bHROb2RlTGFiZWwoZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KX0pOwpfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KSxwYXJlbnQ9Zy5wYXJlbnQodik7aWYobm9kZS5yYW5rPT09cmFua3x8bm9kZS5taW5SYW5rPD1yYW5rJiZyYW5rPD1ub2RlLm1heFJhbmspe3Jlc3VsdC5zZXROb2RlKHYpO3Jlc3VsdC5zZXRQYXJlbnQodixwYXJlbnR8fHJvb3QpO18uZm9yRWFjaChnW3JlbGF0aW9uc2hpcF0odiksZnVuY3Rpb24oZSl7dmFyIHU9ZS52PT09dj9lLnc6ZS52LGVkZ2U9cmVzdWx0LmVkZ2UodSx2KSx3ZWlnaHQ9IV8uaXNVbmRlZmluZWQoZWRnZSk/ZWRnZS53ZWlnaHQ6MDtyZXN1bHQuc2V0RWRnZSh1LHYse3dlaWdodDpnLmVkZ2UoZSkud2VpZ2h0K3dlaWdodH0pfSk7aWYoXy5oYXMobm9kZSwibWluUmFuayIpKXJlc3VsdC5zZXROb2RlKHYse2JvcmRlckxlZnQ6bm9kZS5ib3JkZXJMZWZ0W3JhbmtdLGJvcmRlclJpZ2h0Om5vZGUuYm9yZGVyUmlnaHRbcmFua119KX19KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNyZWF0ZVJvb3ROb2RlKGcpe3ZhciB2Owp3aGlsZShnLmhhc05vZGUodj1fLnVuaXF1ZUlkKCJfcm9vdCIpKSk7cmV0dXJuIHZ9fSx7Ii4uL2dyYXBobGliIjo3LCIuLi9sb2Rhc2giOjEwfV0sMTY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWNyb3NzQ291bnQ7ZnVuY3Rpb24gY3Jvc3NDb3VudChnLGxheWVyaW5nKXt2YXIgY2M9MDtmb3IodmFyIGk9MTtpPGxheWVyaW5nLmxlbmd0aDsrK2kpY2MrPXR3b0xheWVyQ3Jvc3NDb3VudChnLGxheWVyaW5nW2ktMV0sbGF5ZXJpbmdbaV0pO3JldHVybiBjY31mdW5jdGlvbiB0d29MYXllckNyb3NzQ291bnQoZyxub3J0aExheWVyLHNvdXRoTGF5ZXIpe3ZhciBzb3V0aFBvcz1fLnppcE9iamVjdChzb3V0aExheWVyLF8ubWFwKHNvdXRoTGF5ZXIsZnVuY3Rpb24odixpKXtyZXR1cm4gaX0pKTt2YXIgc291dGhFbnRyaWVzPV8uZmxhdHRlbihfLm1hcChub3J0aExheWVyLGZ1bmN0aW9uKHYpe3JldHVybiBfLmNoYWluKGcub3V0RWRnZXModikpLm1hcChmdW5jdGlvbihlKXtyZXR1cm57cG9zOnNvdXRoUG9zW2Uud10sCndlaWdodDpnLmVkZ2UoZSkud2VpZ2h0fX0pLnNvcnRCeSgicG9zIikudmFsdWUoKX0pLHRydWUpO3ZhciBmaXJzdEluZGV4PTE7d2hpbGUoZmlyc3RJbmRleDxzb3V0aExheWVyLmxlbmd0aClmaXJzdEluZGV4PDw9MTt2YXIgdHJlZVNpemU9MipmaXJzdEluZGV4LTE7Zmlyc3RJbmRleC09MTt2YXIgdHJlZT1fLm1hcChuZXcgQXJyYXkodHJlZVNpemUpLGZ1bmN0aW9uKCl7cmV0dXJuIDB9KTt2YXIgY2M9MDtfLmZvckVhY2goc291dGhFbnRyaWVzLmZvckVhY2goZnVuY3Rpb24oZW50cnkpe3ZhciBpbmRleD1lbnRyeS5wb3MrZmlyc3RJbmRleDt0cmVlW2luZGV4XSs9ZW50cnkud2VpZ2h0O3ZhciB3ZWlnaHRTdW09MDt3aGlsZShpbmRleD4wKXtpZihpbmRleCUyKXdlaWdodFN1bSs9dHJlZVtpbmRleCsxXTtpbmRleD1pbmRleC0xPj4xO3RyZWVbaW5kZXhdKz1lbnRyeS53ZWlnaHR9Y2MrPWVudHJ5LndlaWdodCp3ZWlnaHRTdW19KSk7cmV0dXJuIGNjfX0seyIuLi9sb2Rhc2giOjEwfV0sCjE3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxpbml0T3JkZXI9cmVxdWlyZSgiLi9pbml0LW9yZGVyIiksY3Jvc3NDb3VudD1yZXF1aXJlKCIuL2Nyb3NzLWNvdW50Iiksc29ydFN1YmdyYXBoPXJlcXVpcmUoIi4vc29ydC1zdWJncmFwaCIpLGJ1aWxkTGF5ZXJHcmFwaD1yZXF1aXJlKCIuL2J1aWxkLWxheWVyLWdyYXBoIiksYWRkU3ViZ3JhcGhDb25zdHJhaW50cz1yZXF1aXJlKCIuL2FkZC1zdWJncmFwaC1jb25zdHJhaW50cyIpLEdyYXBoPXJlcXVpcmUoIi4uL2dyYXBobGliIikuR3JhcGgsdXRpbD1yZXF1aXJlKCIuLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9b3JkZXI7ZnVuY3Rpb24gb3JkZXIoZyl7dmFyIG1heFJhbms9dXRpbC5tYXhSYW5rKGcpLGRvd25MYXllckdyYXBocz1idWlsZExheWVyR3JhcGhzKGcsXy5yYW5nZSgxLG1heFJhbmsrMSksImluRWRnZXMiKSx1cExheWVyR3JhcGhzPWJ1aWxkTGF5ZXJHcmFwaHMoZywKXy5yYW5nZShtYXhSYW5rLTEsLTEsLTEpLCJvdXRFZGdlcyIpO3ZhciBsYXllcmluZz1pbml0T3JkZXIoZyk7YXNzaWduT3JkZXIoZyxsYXllcmluZyk7dmFyIGJlc3RDQz1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksYmVzdDtmb3IodmFyIGk9MCxsYXN0QmVzdD0wO2xhc3RCZXN0PDQ7KytpLCsrbGFzdEJlc3Qpe3N3ZWVwTGF5ZXJHcmFwaHMoaSUyP2Rvd25MYXllckdyYXBoczp1cExheWVyR3JhcGhzLGklND49Mik7bGF5ZXJpbmc9dXRpbC5idWlsZExheWVyTWF0cml4KGcpO3ZhciBjYz1jcm9zc0NvdW50KGcsbGF5ZXJpbmcpO2lmKGNjPGJlc3RDQyl7bGFzdEJlc3Q9MDtiZXN0PV8uY2xvbmVEZWVwKGxheWVyaW5nKTtiZXN0Q0M9Y2N9fWFzc2lnbk9yZGVyKGcsYmVzdCl9ZnVuY3Rpb24gYnVpbGRMYXllckdyYXBocyhnLHJhbmtzLHJlbGF0aW9uc2hpcCl7cmV0dXJuIF8ubWFwKHJhbmtzLGZ1bmN0aW9uKHJhbmspe3JldHVybiBidWlsZExheWVyR3JhcGgoZyxyYW5rLHJlbGF0aW9uc2hpcCl9KX0KZnVuY3Rpb24gc3dlZXBMYXllckdyYXBocyhsYXllckdyYXBocyxiaWFzUmlnaHQpe3ZhciBjZz1uZXcgR3JhcGg7Xy5mb3JFYWNoKGxheWVyR3JhcGhzLGZ1bmN0aW9uKGxnKXt2YXIgcm9vdD1sZy5ncmFwaCgpLnJvb3Q7dmFyIHNvcnRlZD1zb3J0U3ViZ3JhcGgobGcscm9vdCxjZyxiaWFzUmlnaHQpO18uZm9yRWFjaChzb3J0ZWQudnMsZnVuY3Rpb24odixpKXtsZy5ub2RlKHYpLm9yZGVyPWl9KTthZGRTdWJncmFwaENvbnN0cmFpbnRzKGxnLGNnLHNvcnRlZC52cyl9KX1mdW5jdGlvbiBhc3NpZ25PcmRlcihnLGxheWVyaW5nKXtfLmZvckVhY2gobGF5ZXJpbmcsZnVuY3Rpb24obGF5ZXIpe18uZm9yRWFjaChsYXllcixmdW5jdGlvbih2LGkpe2cubm9kZSh2KS5vcmRlcj1pfSl9KX19LHsiLi4vZ3JhcGhsaWIiOjcsIi4uL2xvZGFzaCI6MTAsIi4uL3V0aWwiOjI5LCIuL2FkZC1zdWJncmFwaC1jb25zdHJhaW50cyI6MTMsIi4vYnVpbGQtbGF5ZXItZ3JhcGgiOjE1LCIuL2Nyb3NzLWNvdW50IjoxNiwKIi4vaW5pdC1vcmRlciI6MTgsIi4vc29ydC1zdWJncmFwaCI6MjB9XSwxODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9aW5pdE9yZGVyO2Z1bmN0aW9uIGluaXRPcmRlcihnKXt2YXIgdmlzaXRlZD17fSxzaW1wbGVOb2Rlcz1fLmZpbHRlcihnLm5vZGVzKCksZnVuY3Rpb24odil7cmV0dXJuIWcuY2hpbGRyZW4odikubGVuZ3RofSksbWF4UmFuaz1fLm1heChfLm1hcChzaW1wbGVOb2RlcyxmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpLnJhbmt9KSksbGF5ZXJzPV8ubWFwKF8ucmFuZ2UobWF4UmFuaysxKSxmdW5jdGlvbigpe3JldHVybltdfSk7ZnVuY3Rpb24gZGZzKHYpe2lmKF8uaGFzKHZpc2l0ZWQsdikpcmV0dXJuO3Zpc2l0ZWRbdl09dHJ1ZTt2YXIgbm9kZT1nLm5vZGUodik7bGF5ZXJzW25vZGUucmFua10ucHVzaCh2KTtfLmZvckVhY2goZy5zdWNjZXNzb3JzKHYpLGRmcyl9dmFyIG9yZGVyZWRWcz0KXy5zb3J0Qnkoc2ltcGxlTm9kZXMsZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KS5yYW5rfSk7Xy5mb3JFYWNoKG9yZGVyZWRWcyxkZnMpO3JldHVybiBsYXllcnN9fSx7Ii4uL2xvZGFzaCI6MTB9XSwxOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9cmVzb2x2ZUNvbmZsaWN0cztmdW5jdGlvbiByZXNvbHZlQ29uZmxpY3RzKGVudHJpZXMsY2cpe3ZhciBtYXBwZWRFbnRyaWVzPXt9O18uZm9yRWFjaChlbnRyaWVzLGZ1bmN0aW9uKGVudHJ5LGkpe3ZhciB0bXA9bWFwcGVkRW50cmllc1tlbnRyeS52XT17aW5kZWdyZWU6MCwiaW4iOltdLG91dDpbXSx2czpbZW50cnkudl0saTppfTtpZighXy5pc1VuZGVmaW5lZChlbnRyeS5iYXJ5Y2VudGVyKSl7dG1wLmJhcnljZW50ZXI9ZW50cnkuYmFyeWNlbnRlcjt0bXAud2VpZ2h0PWVudHJ5LndlaWdodH19KTtfLmZvckVhY2goY2cuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZW50cnlWPQptYXBwZWRFbnRyaWVzW2Uudl0sZW50cnlXPW1hcHBlZEVudHJpZXNbZS53XTtpZighXy5pc1VuZGVmaW5lZChlbnRyeVYpJiYhXy5pc1VuZGVmaW5lZChlbnRyeVcpKXtlbnRyeVcuaW5kZWdyZWUrKztlbnRyeVYub3V0LnB1c2gobWFwcGVkRW50cmllc1tlLnddKX19KTt2YXIgc291cmNlU2V0PV8uZmlsdGVyKG1hcHBlZEVudHJpZXMsZnVuY3Rpb24oZW50cnkpe3JldHVybiFlbnRyeS5pbmRlZ3JlZX0pO3JldHVybiBkb1Jlc29sdmVDb25mbGljdHMoc291cmNlU2V0KX1mdW5jdGlvbiBkb1Jlc29sdmVDb25mbGljdHMoc291cmNlU2V0KXt2YXIgZW50cmllcz1bXTtmdW5jdGlvbiBoYW5kbGVJbih2RW50cnkpe3JldHVybiBmdW5jdGlvbih1RW50cnkpe2lmKHVFbnRyeS5tZXJnZWQpcmV0dXJuO2lmKF8uaXNVbmRlZmluZWQodUVudHJ5LmJhcnljZW50ZXIpfHxfLmlzVW5kZWZpbmVkKHZFbnRyeS5iYXJ5Y2VudGVyKXx8dUVudHJ5LmJhcnljZW50ZXI+PXZFbnRyeS5iYXJ5Y2VudGVyKW1lcmdlRW50cmllcyh2RW50cnksCnVFbnRyeSl9fWZ1bmN0aW9uIGhhbmRsZU91dCh2RW50cnkpe3JldHVybiBmdW5jdGlvbih3RW50cnkpe3dFbnRyeVsiaW4iXS5wdXNoKHZFbnRyeSk7aWYoLS13RW50cnkuaW5kZWdyZWU9PT0wKXNvdXJjZVNldC5wdXNoKHdFbnRyeSl9fXdoaWxlKHNvdXJjZVNldC5sZW5ndGgpe3ZhciBlbnRyeT1zb3VyY2VTZXQucG9wKCk7ZW50cmllcy5wdXNoKGVudHJ5KTtfLmZvckVhY2goZW50cnlbImluIl0ucmV2ZXJzZSgpLGhhbmRsZUluKGVudHJ5KSk7Xy5mb3JFYWNoKGVudHJ5Lm91dCxoYW5kbGVPdXQoZW50cnkpKX1yZXR1cm4gXy5jaGFpbihlbnRyaWVzKS5maWx0ZXIoZnVuY3Rpb24oZW50cnkpe3JldHVybiFlbnRyeS5tZXJnZWR9KS5tYXAoZnVuY3Rpb24oZW50cnkpe3JldHVybiBfLnBpY2soZW50cnksWyJ2cyIsImkiLCJiYXJ5Y2VudGVyIiwid2VpZ2h0Il0pfSkudmFsdWUoKX1mdW5jdGlvbiBtZXJnZUVudHJpZXModGFyZ2V0LHNvdXJjZSl7dmFyIHN1bT0wLHdlaWdodD0wOwppZih0YXJnZXQud2VpZ2h0KXtzdW0rPXRhcmdldC5iYXJ5Y2VudGVyKnRhcmdldC53ZWlnaHQ7d2VpZ2h0Kz10YXJnZXQud2VpZ2h0fWlmKHNvdXJjZS53ZWlnaHQpe3N1bSs9c291cmNlLmJhcnljZW50ZXIqc291cmNlLndlaWdodDt3ZWlnaHQrPXNvdXJjZS53ZWlnaHR9dGFyZ2V0LnZzPXNvdXJjZS52cy5jb25jYXQodGFyZ2V0LnZzKTt0YXJnZXQuYmFyeWNlbnRlcj1zdW0vd2VpZ2h0O3RhcmdldC53ZWlnaHQ9d2VpZ2h0O3RhcmdldC5pPU1hdGgubWluKHNvdXJjZS5pLHRhcmdldC5pKTtzb3VyY2UubWVyZ2VkPXRydWV9fSx7Ii4uL2xvZGFzaCI6MTB9XSwyMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksYmFyeWNlbnRlcj1yZXF1aXJlKCIuL2JhcnljZW50ZXIiKSxyZXNvbHZlQ29uZmxpY3RzPXJlcXVpcmUoIi4vcmVzb2x2ZS1jb25mbGljdHMiKSxzb3J0PXJlcXVpcmUoIi4vc29ydCIpO21vZHVsZS5leHBvcnRzPQpzb3J0U3ViZ3JhcGg7ZnVuY3Rpb24gc29ydFN1YmdyYXBoKGcsdixjZyxiaWFzUmlnaHQpe3ZhciBtb3ZhYmxlPWcuY2hpbGRyZW4odiksbm9kZT1nLm5vZGUodiksYmw9bm9kZT9ub2RlLmJvcmRlckxlZnQ6dW5kZWZpbmVkLGJyPW5vZGU/bm9kZS5ib3JkZXJSaWdodDp1bmRlZmluZWQsc3ViZ3JhcGhzPXt9O2lmKGJsKW1vdmFibGU9Xy5maWx0ZXIobW92YWJsZSxmdW5jdGlvbih3KXtyZXR1cm4gdyE9PWJsJiZ3IT09YnJ9KTt2YXIgYmFyeWNlbnRlcnM9YmFyeWNlbnRlcihnLG1vdmFibGUpO18uZm9yRWFjaChiYXJ5Y2VudGVycyxmdW5jdGlvbihlbnRyeSl7aWYoZy5jaGlsZHJlbihlbnRyeS52KS5sZW5ndGgpe3ZhciBzdWJncmFwaFJlc3VsdD1zb3J0U3ViZ3JhcGgoZyxlbnRyeS52LGNnLGJpYXNSaWdodCk7c3ViZ3JhcGhzW2VudHJ5LnZdPXN1YmdyYXBoUmVzdWx0O2lmKF8uaGFzKHN1YmdyYXBoUmVzdWx0LCJiYXJ5Y2VudGVyIikpbWVyZ2VCYXJ5Y2VudGVycyhlbnRyeSwKc3ViZ3JhcGhSZXN1bHQpfX0pO3ZhciBlbnRyaWVzPXJlc29sdmVDb25mbGljdHMoYmFyeWNlbnRlcnMsY2cpO2V4cGFuZFN1YmdyYXBocyhlbnRyaWVzLHN1YmdyYXBocyk7dmFyIHJlc3VsdD1zb3J0KGVudHJpZXMsYmlhc1JpZ2h0KTtpZihibCl7cmVzdWx0LnZzPV8uZmxhdHRlbihbYmwscmVzdWx0LnZzLGJyXSx0cnVlKTtpZihnLnByZWRlY2Vzc29ycyhibCkubGVuZ3RoKXt2YXIgYmxQcmVkPWcubm9kZShnLnByZWRlY2Vzc29ycyhibClbMF0pLGJyUHJlZD1nLm5vZGUoZy5wcmVkZWNlc3NvcnMoYnIpWzBdKTtpZighXy5oYXMocmVzdWx0LCJiYXJ5Y2VudGVyIikpe3Jlc3VsdC5iYXJ5Y2VudGVyPTA7cmVzdWx0LndlaWdodD0wfXJlc3VsdC5iYXJ5Y2VudGVyPShyZXN1bHQuYmFyeWNlbnRlcipyZXN1bHQud2VpZ2h0K2JsUHJlZC5vcmRlciticlByZWQub3JkZXIpLyhyZXN1bHQud2VpZ2h0KzIpO3Jlc3VsdC53ZWlnaHQrPTJ9fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gZXhwYW5kU3ViZ3JhcGhzKGVudHJpZXMsCnN1YmdyYXBocyl7Xy5mb3JFYWNoKGVudHJpZXMsZnVuY3Rpb24oZW50cnkpe2VudHJ5LnZzPV8uZmxhdHRlbihlbnRyeS52cy5tYXAoZnVuY3Rpb24odil7aWYoc3ViZ3JhcGhzW3ZdKXJldHVybiBzdWJncmFwaHNbdl0udnM7cmV0dXJuIHZ9KSx0cnVlKX0pfWZ1bmN0aW9uIG1lcmdlQmFyeWNlbnRlcnModGFyZ2V0LG90aGVyKXtpZighXy5pc1VuZGVmaW5lZCh0YXJnZXQuYmFyeWNlbnRlcikpe3RhcmdldC5iYXJ5Y2VudGVyPSh0YXJnZXQuYmFyeWNlbnRlcip0YXJnZXQud2VpZ2h0K290aGVyLmJhcnljZW50ZXIqb3RoZXIud2VpZ2h0KS8odGFyZ2V0LndlaWdodCtvdGhlci53ZWlnaHQpO3RhcmdldC53ZWlnaHQrPW90aGVyLndlaWdodH1lbHNle3RhcmdldC5iYXJ5Y2VudGVyPW90aGVyLmJhcnljZW50ZXI7dGFyZ2V0LndlaWdodD1vdGhlci53ZWlnaHR9fX0seyIuLi9sb2Rhc2giOjEwLCIuL2JhcnljZW50ZXIiOjE0LCIuL3Jlc29sdmUtY29uZmxpY3RzIjoxOSwiLi9zb3J0IjoyMX1dLAoyMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksdXRpbD1yZXF1aXJlKCIuLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9c29ydDtmdW5jdGlvbiBzb3J0KGVudHJpZXMsYmlhc1JpZ2h0KXt2YXIgcGFydHM9dXRpbC5wYXJ0aXRpb24oZW50cmllcyxmdW5jdGlvbihlbnRyeSl7cmV0dXJuIF8uaGFzKGVudHJ5LCJiYXJ5Y2VudGVyIil9KTt2YXIgc29ydGFibGU9cGFydHMubGhzLHVuc29ydGFibGU9Xy5zb3J0QnkocGFydHMucmhzLGZ1bmN0aW9uKGVudHJ5KXtyZXR1cm4tZW50cnkuaX0pLHZzPVtdLHN1bT0wLHdlaWdodD0wLHZzSW5kZXg9MDtzb3J0YWJsZS5zb3J0KGNvbXBhcmVXaXRoQmlhcyghIWJpYXNSaWdodCkpO3ZzSW5kZXg9Y29uc3VtZVVuc29ydGFibGUodnMsdW5zb3J0YWJsZSx2c0luZGV4KTtfLmZvckVhY2goc29ydGFibGUsZnVuY3Rpb24oZW50cnkpe3ZzSW5kZXgrPWVudHJ5LnZzLmxlbmd0aDt2cy5wdXNoKGVudHJ5LnZzKTsKc3VtKz1lbnRyeS5iYXJ5Y2VudGVyKmVudHJ5LndlaWdodDt3ZWlnaHQrPWVudHJ5LndlaWdodDt2c0luZGV4PWNvbnN1bWVVbnNvcnRhYmxlKHZzLHVuc29ydGFibGUsdnNJbmRleCl9KTt2YXIgcmVzdWx0PXt2czpfLmZsYXR0ZW4odnMsdHJ1ZSl9O2lmKHdlaWdodCl7cmVzdWx0LmJhcnljZW50ZXI9c3VtL3dlaWdodDtyZXN1bHQud2VpZ2h0PXdlaWdodH1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNvbnN1bWVVbnNvcnRhYmxlKHZzLHVuc29ydGFibGUsaW5kZXgpe3ZhciBsYXN0O3doaWxlKHVuc29ydGFibGUubGVuZ3RoJiYobGFzdD1fLmxhc3QodW5zb3J0YWJsZSkpLmk8PWluZGV4KXt1bnNvcnRhYmxlLnBvcCgpO3ZzLnB1c2gobGFzdC52cyk7aW5kZXgrK31yZXR1cm4gaW5kZXh9ZnVuY3Rpb24gY29tcGFyZVdpdGhCaWFzKGJpYXMpe3JldHVybiBmdW5jdGlvbihlbnRyeVYsZW50cnlXKXtpZihlbnRyeVYuYmFyeWNlbnRlcjxlbnRyeVcuYmFyeWNlbnRlcilyZXR1cm4tMTtlbHNlIGlmKGVudHJ5Vi5iYXJ5Y2VudGVyPgplbnRyeVcuYmFyeWNlbnRlcilyZXR1cm4gMTtyZXR1cm4hYmlhcz9lbnRyeVYuaS1lbnRyeVcuaTplbnRyeVcuaS1lbnRyeVYuaX19fSx7Ii4uL2xvZGFzaCI6MTAsIi4uL3V0aWwiOjI5fV0sMjI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9cGFyZW50RHVtbXlDaGFpbnM7ZnVuY3Rpb24gcGFyZW50RHVtbXlDaGFpbnMoZyl7dmFyIHBvc3RvcmRlck51bXM9cG9zdG9yZGVyKGcpO18uZm9yRWFjaChnLmdyYXBoKCkuZHVtbXlDaGFpbnMsZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpLGVkZ2VPYmo9bm9kZS5lZGdlT2JqLHBhdGhEYXRhPWZpbmRQYXRoKGcscG9zdG9yZGVyTnVtcyxlZGdlT2JqLnYsZWRnZU9iai53KSxwYXRoPXBhdGhEYXRhLnBhdGgsbGNhPXBhdGhEYXRhLmxjYSxwYXRoSWR4PTAscGF0aFY9cGF0aFtwYXRoSWR4XSxhc2NlbmRpbmc9dHJ1ZTt3aGlsZSh2IT09ZWRnZU9iai53KXtub2RlPQpnLm5vZGUodik7aWYoYXNjZW5kaW5nKXt3aGlsZSgocGF0aFY9cGF0aFtwYXRoSWR4XSkhPT1sY2EmJmcubm9kZShwYXRoVikubWF4UmFuazxub2RlLnJhbmspcGF0aElkeCsrO2lmKHBhdGhWPT09bGNhKWFzY2VuZGluZz1mYWxzZX1pZighYXNjZW5kaW5nKXt3aGlsZShwYXRoSWR4PHBhdGgubGVuZ3RoLTEmJmcubm9kZShwYXRoVj1wYXRoW3BhdGhJZHgrMV0pLm1pblJhbms8PW5vZGUucmFuaylwYXRoSWR4Kys7cGF0aFY9cGF0aFtwYXRoSWR4XX1nLnNldFBhcmVudCh2LHBhdGhWKTt2PWcuc3VjY2Vzc29ycyh2KVswXX19KX1mdW5jdGlvbiBmaW5kUGF0aChnLHBvc3RvcmRlck51bXMsdix3KXt2YXIgdlBhdGg9W10sd1BhdGg9W10sbG93PU1hdGgubWluKHBvc3RvcmRlck51bXNbdl0ubG93LHBvc3RvcmRlck51bXNbd10ubG93KSxsaW09TWF0aC5tYXgocG9zdG9yZGVyTnVtc1t2XS5saW0scG9zdG9yZGVyTnVtc1t3XS5saW0pLHBhcmVudCxsY2E7cGFyZW50PXY7ZG97cGFyZW50PQpnLnBhcmVudChwYXJlbnQpO3ZQYXRoLnB1c2gocGFyZW50KX13aGlsZShwYXJlbnQmJihwb3N0b3JkZXJOdW1zW3BhcmVudF0ubG93Pmxvd3x8bGltPnBvc3RvcmRlck51bXNbcGFyZW50XS5saW0pKTtsY2E9cGFyZW50O3BhcmVudD13O3doaWxlKChwYXJlbnQ9Zy5wYXJlbnQocGFyZW50KSkhPT1sY2Epd1BhdGgucHVzaChwYXJlbnQpO3JldHVybntwYXRoOnZQYXRoLmNvbmNhdCh3UGF0aC5yZXZlcnNlKCkpLGxjYTpsY2F9fWZ1bmN0aW9uIHBvc3RvcmRlcihnKXt2YXIgcmVzdWx0PXt9LGxpbT0wO2Z1bmN0aW9uIGRmcyh2KXt2YXIgbG93PWxpbTtfLmZvckVhY2goZy5jaGlsZHJlbih2KSxkZnMpO3Jlc3VsdFt2XT17bG93OmxvdyxsaW06bGltKyt9fV8uZm9yRWFjaChnLmNoaWxkcmVuKCksZGZzKTtyZXR1cm4gcmVzdWx0fX0seyIuL2xvZGFzaCI6MTB9XSwyMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksR3JhcGg9CnJlcXVpcmUoIi4uL2dyYXBobGliIikuR3JhcGgsdXRpbD1yZXF1aXJlKCIuLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9e3Bvc2l0aW9uWDpwb3NpdGlvblgsZmluZFR5cGUxQ29uZmxpY3RzOmZpbmRUeXBlMUNvbmZsaWN0cyxmaW5kVHlwZTJDb25mbGljdHM6ZmluZFR5cGUyQ29uZmxpY3RzLGFkZENvbmZsaWN0OmFkZENvbmZsaWN0LGhhc0NvbmZsaWN0Omhhc0NvbmZsaWN0LHZlcnRpY2FsQWxpZ25tZW50OnZlcnRpY2FsQWxpZ25tZW50LGhvcml6b250YWxDb21wYWN0aW9uOmhvcml6b250YWxDb21wYWN0aW9uLGFsaWduQ29vcmRpbmF0ZXM6YWxpZ25Db29yZGluYXRlcyxmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudDpmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudCxiYWxhbmNlOmJhbGFuY2V9O2Z1bmN0aW9uIGZpbmRUeXBlMUNvbmZsaWN0cyhnLGxheWVyaW5nKXt2YXIgY29uZmxpY3RzPXt9O2Z1bmN0aW9uIHZpc2l0TGF5ZXIocHJldkxheWVyLGxheWVyKXt2YXIgazA9MCxzY2FuUG9zPQowLHByZXZMYXllckxlbmd0aD1wcmV2TGF5ZXIubGVuZ3RoLGxhc3ROb2RlPV8ubGFzdChsYXllcik7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYsaSl7dmFyIHc9ZmluZE90aGVySW5uZXJTZWdtZW50Tm9kZShnLHYpLGsxPXc/Zy5ub2RlKHcpLm9yZGVyOnByZXZMYXllckxlbmd0aDtpZih3fHx2PT09bGFzdE5vZGUpe18uZm9yRWFjaChsYXllci5zbGljZShzY2FuUG9zLGkrMSksZnVuY3Rpb24oc2Nhbk5vZGUpe18uZm9yRWFjaChnLnByZWRlY2Vzc29ycyhzY2FuTm9kZSksZnVuY3Rpb24odSl7dmFyIHVMYWJlbD1nLm5vZGUodSksdVBvcz11TGFiZWwub3JkZXI7aWYoKHVQb3M8azB8fGsxPHVQb3MpJiYhKHVMYWJlbC5kdW1teSYmZy5ub2RlKHNjYW5Ob2RlKS5kdW1teSkpYWRkQ29uZmxpY3QoY29uZmxpY3RzLHUsc2Nhbk5vZGUpfSl9KTtzY2FuUG9zPWkrMTtrMD1rMX19KTtyZXR1cm4gbGF5ZXJ9Xy5yZWR1Y2UobGF5ZXJpbmcsdmlzaXRMYXllcik7cmV0dXJuIGNvbmZsaWN0c30KZnVuY3Rpb24gZmluZFR5cGUyQ29uZmxpY3RzKGcsbGF5ZXJpbmcpe3ZhciBjb25mbGljdHM9e307ZnVuY3Rpb24gc2Nhbihzb3V0aCxzb3V0aFBvcyxzb3V0aEVuZCxwcmV2Tm9ydGhCb3JkZXIsbmV4dE5vcnRoQm9yZGVyKXt2YXIgdjtfLmZvckVhY2goXy5yYW5nZShzb3V0aFBvcyxzb3V0aEVuZCksZnVuY3Rpb24oaSl7dj1zb3V0aFtpXTtpZihnLm5vZGUodikuZHVtbXkpXy5mb3JFYWNoKGcucHJlZGVjZXNzb3JzKHYpLGZ1bmN0aW9uKHUpe3ZhciB1Tm9kZT1nLm5vZGUodSk7aWYodU5vZGUuZHVtbXkmJih1Tm9kZS5vcmRlcjxwcmV2Tm9ydGhCb3JkZXJ8fHVOb2RlLm9yZGVyPm5leHROb3J0aEJvcmRlcikpYWRkQ29uZmxpY3QoY29uZmxpY3RzLHUsdil9KX0pfWZ1bmN0aW9uIHZpc2l0TGF5ZXIobm9ydGgsc291dGgpe3ZhciBwcmV2Tm9ydGhQb3M9LTEsbmV4dE5vcnRoUG9zLHNvdXRoUG9zPTA7Xy5mb3JFYWNoKHNvdXRoLGZ1bmN0aW9uKHYsc291dGhMb29rYWhlYWQpe2lmKGcubm9kZSh2KS5kdW1teT09PQoiYm9yZGVyIil7dmFyIHByZWRlY2Vzc29ycz1nLnByZWRlY2Vzc29ycyh2KTtpZihwcmVkZWNlc3NvcnMubGVuZ3RoKXtuZXh0Tm9ydGhQb3M9Zy5ub2RlKHByZWRlY2Vzc29yc1swXSkub3JkZXI7c2Nhbihzb3V0aCxzb3V0aFBvcyxzb3V0aExvb2thaGVhZCxwcmV2Tm9ydGhQb3MsbmV4dE5vcnRoUG9zKTtzb3V0aFBvcz1zb3V0aExvb2thaGVhZDtwcmV2Tm9ydGhQb3M9bmV4dE5vcnRoUG9zfX1zY2FuKHNvdXRoLHNvdXRoUG9zLHNvdXRoLmxlbmd0aCxuZXh0Tm9ydGhQb3Msbm9ydGgubGVuZ3RoKX0pO3JldHVybiBzb3V0aH1fLnJlZHVjZShsYXllcmluZyx2aXNpdExheWVyKTtyZXR1cm4gY29uZmxpY3RzfWZ1bmN0aW9uIGZpbmRPdGhlcklubmVyU2VnbWVudE5vZGUoZyx2KXtpZihnLm5vZGUodikuZHVtbXkpcmV0dXJuIF8uZmluZChnLnByZWRlY2Vzc29ycyh2KSxmdW5jdGlvbih1KXtyZXR1cm4gZy5ub2RlKHUpLmR1bW15fSl9ZnVuY3Rpb24gYWRkQ29uZmxpY3QoY29uZmxpY3RzLAp2LHcpe2lmKHY+dyl7dmFyIHRtcD12O3Y9dzt3PXRtcH12YXIgY29uZmxpY3RzVj1jb25mbGljdHNbdl07aWYoIWNvbmZsaWN0c1YpY29uZmxpY3RzW3ZdPWNvbmZsaWN0c1Y9e307Y29uZmxpY3RzVlt3XT10cnVlfWZ1bmN0aW9uIGhhc0NvbmZsaWN0KGNvbmZsaWN0cyx2LHcpe2lmKHY+dyl7dmFyIHRtcD12O3Y9dzt3PXRtcH1yZXR1cm4gXy5oYXMoY29uZmxpY3RzW3ZdLHcpfWZ1bmN0aW9uIHZlcnRpY2FsQWxpZ25tZW50KGcsbGF5ZXJpbmcsY29uZmxpY3RzLG5laWdoYm9yRm4pe3ZhciByb290PXt9LGFsaWduPXt9LHBvcz17fTtfLmZvckVhY2gobGF5ZXJpbmcsZnVuY3Rpb24obGF5ZXIpe18uZm9yRWFjaChsYXllcixmdW5jdGlvbih2LG9yZGVyKXtyb290W3ZdPXY7YWxpZ25bdl09djtwb3Nbdl09b3JkZXJ9KX0pO18uZm9yRWFjaChsYXllcmluZyxmdW5jdGlvbihsYXllcil7dmFyIHByZXZJZHg9LTE7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYpe3ZhciB3cz1uZWlnaGJvckZuKHYpOwppZih3cy5sZW5ndGgpe3dzPV8uc29ydEJ5KHdzLGZ1bmN0aW9uKHcpe3JldHVybiBwb3Nbd119KTt2YXIgbXA9KHdzLmxlbmd0aC0xKS8yO2Zvcih2YXIgaT1NYXRoLmZsb29yKG1wKSxpbD1NYXRoLmNlaWwobXApO2k8PWlsOysraSl7dmFyIHc9d3NbaV07aWYoYWxpZ25bdl09PT12JiZwcmV2SWR4PHBvc1t3XSYmIWhhc0NvbmZsaWN0KGNvbmZsaWN0cyx2LHcpKXthbGlnblt3XT12O2FsaWduW3ZdPXJvb3Rbdl09cm9vdFt3XTtwcmV2SWR4PXBvc1t3XX19fX0pfSk7cmV0dXJue3Jvb3Q6cm9vdCxhbGlnbjphbGlnbn19ZnVuY3Rpb24gaG9yaXpvbnRhbENvbXBhY3Rpb24oZyxsYXllcmluZyxyb290LGFsaWduLHJldmVyc2VTZXApe3ZhciB4cz17fSxibG9ja0c9YnVpbGRCbG9ja0dyYXBoKGcsbGF5ZXJpbmcscm9vdCxyZXZlcnNlU2VwKSxib3JkZXJUeXBlPXJldmVyc2VTZXA/ImJvcmRlckxlZnQiOiJib3JkZXJSaWdodCI7ZnVuY3Rpb24gaXRlcmF0ZShzZXRYc0Z1bmMsbmV4dE5vZGVzRnVuYyl7dmFyIHN0YWNrPQpibG9ja0cubm9kZXMoKTt2YXIgZWxlbT1zdGFjay5wb3AoKTt2YXIgdmlzaXRlZD17fTt3aGlsZShlbGVtKXtpZih2aXNpdGVkW2VsZW1dKXNldFhzRnVuYyhlbGVtKTtlbHNle3Zpc2l0ZWRbZWxlbV09dHJ1ZTtzdGFjay5wdXNoKGVsZW0pO3N0YWNrPXN0YWNrLmNvbmNhdChuZXh0Tm9kZXNGdW5jKGVsZW0pKX1lbGVtPXN0YWNrLnBvcCgpfX1mdW5jdGlvbiBwYXNzMShlbGVtKXt4c1tlbGVtXT1ibG9ja0cuaW5FZGdlcyhlbGVtKS5yZWR1Y2UoZnVuY3Rpb24oYWNjLGUpe3JldHVybiBNYXRoLm1heChhY2MseHNbZS52XStibG9ja0cuZWRnZShlKSl9LDApfWZ1bmN0aW9uIHBhc3MyKGVsZW0pe3ZhciBtaW49YmxvY2tHLm91dEVkZ2VzKGVsZW0pLnJlZHVjZShmdW5jdGlvbihhY2MsZSl7cmV0dXJuIE1hdGgubWluKGFjYyx4c1tlLnddLWJsb2NrRy5lZGdlKGUpKX0sTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTt2YXIgbm9kZT1nLm5vZGUoZWxlbSk7aWYobWluIT09TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZJiYKbm9kZS5ib3JkZXJUeXBlIT09Ym9yZGVyVHlwZSl4c1tlbGVtXT1NYXRoLm1heCh4c1tlbGVtXSxtaW4pfWl0ZXJhdGUocGFzczEsXy5iaW5kKGJsb2NrRy5wcmVkZWNlc3NvcnMsYmxvY2tHKSk7aXRlcmF0ZShwYXNzMixfLmJpbmQoYmxvY2tHLnN1Y2Nlc3NvcnMsYmxvY2tHKSk7Xy5mb3JFYWNoKGFsaWduLGZ1bmN0aW9uKHYpe3hzW3ZdPXhzW3Jvb3Rbdl1dfSk7cmV0dXJuIHhzfWZ1bmN0aW9uIGJ1aWxkQmxvY2tHcmFwaChnLGxheWVyaW5nLHJvb3QscmV2ZXJzZVNlcCl7dmFyIGJsb2NrR3JhcGg9bmV3IEdyYXBoLGdyYXBoTGFiZWw9Zy5ncmFwaCgpLHNlcEZuPXNlcChncmFwaExhYmVsLm5vZGVzZXAsZ3JhcGhMYWJlbC5lZGdlc2VwLHJldmVyc2VTZXApO18uZm9yRWFjaChsYXllcmluZyxmdW5jdGlvbihsYXllcil7dmFyIHU7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYpe3ZhciB2Um9vdD1yb290W3ZdO2Jsb2NrR3JhcGguc2V0Tm9kZSh2Um9vdCk7aWYodSl7dmFyIHVSb290PQpyb290W3VdLHByZXZNYXg9YmxvY2tHcmFwaC5lZGdlKHVSb290LHZSb290KTtibG9ja0dyYXBoLnNldEVkZ2UodVJvb3QsdlJvb3QsTWF0aC5tYXgoc2VwRm4oZyx2LHUpLHByZXZNYXh8fDApKX11PXZ9KX0pO3JldHVybiBibG9ja0dyYXBofWZ1bmN0aW9uIGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50KGcseHNzKXtyZXR1cm4gXy5taW5CeShfLnZhbHVlcyh4c3MpLGZ1bmN0aW9uKHhzKXt2YXIgbWF4PU51bWJlci5ORUdBVElWRV9JTkZJTklUWTt2YXIgbWluPU51bWJlci5QT1NJVElWRV9JTkZJTklUWTtfLmZvckluKHhzLGZ1bmN0aW9uKHgsdil7dmFyIGhhbGZXaWR0aD13aWR0aChnLHYpLzI7bWF4PU1hdGgubWF4KHgraGFsZldpZHRoLG1heCk7bWluPU1hdGgubWluKHgtaGFsZldpZHRoLG1pbil9KTtyZXR1cm4gbWF4LW1pbn0pfWZ1bmN0aW9uIGFsaWduQ29vcmRpbmF0ZXMoeHNzLGFsaWduVG8pe3ZhciBhbGlnblRvVmFscz1fLnZhbHVlcyhhbGlnblRvKSxhbGlnblRvTWluPQpfLm1pbihhbGlnblRvVmFscyksYWxpZ25Ub01heD1fLm1heChhbGlnblRvVmFscyk7Xy5mb3JFYWNoKFsidSIsImQiXSxmdW5jdGlvbih2ZXJ0KXtfLmZvckVhY2goWyJsIiwiciJdLGZ1bmN0aW9uKGhvcml6KXt2YXIgYWxpZ25tZW50PXZlcnQraG9yaXoseHM9eHNzW2FsaWdubWVudF0sZGVsdGE7aWYoeHM9PT1hbGlnblRvKXJldHVybjt2YXIgeHNWYWxzPV8udmFsdWVzKHhzKTtkZWx0YT1ob3Jpej09PSJsIj9hbGlnblRvTWluLV8ubWluKHhzVmFscyk6YWxpZ25Ub01heC1fLm1heCh4c1ZhbHMpO2lmKGRlbHRhKXhzc1thbGlnbm1lbnRdPV8ubWFwVmFsdWVzKHhzLGZ1bmN0aW9uKHgpe3JldHVybiB4K2RlbHRhfSl9KX0pfWZ1bmN0aW9uIGJhbGFuY2UoeHNzLGFsaWduKXtyZXR1cm4gXy5tYXBWYWx1ZXMoeHNzLnVsLGZ1bmN0aW9uKGlnbm9yZSx2KXtpZihhbGlnbilyZXR1cm4geHNzW2FsaWduLnRvTG93ZXJDYXNlKCldW3ZdO2Vsc2V7dmFyIHhzPV8uc29ydEJ5KF8ubWFwKHhzcywKdikpO3JldHVybih4c1sxXSt4c1syXSkvMn19KX1mdW5jdGlvbiBwb3NpdGlvblgoZyl7dmFyIGxheWVyaW5nPXV0aWwuYnVpbGRMYXllck1hdHJpeChnKSxjb25mbGljdHM9Xy5tZXJnZShmaW5kVHlwZTFDb25mbGljdHMoZyxsYXllcmluZyksZmluZFR5cGUyQ29uZmxpY3RzKGcsbGF5ZXJpbmcpKTt2YXIgeHNzPXt9LGFkanVzdGVkTGF5ZXJpbmc7Xy5mb3JFYWNoKFsidSIsImQiXSxmdW5jdGlvbih2ZXJ0KXthZGp1c3RlZExheWVyaW5nPXZlcnQ9PT0idSI/bGF5ZXJpbmc6Xy52YWx1ZXMobGF5ZXJpbmcpLnJldmVyc2UoKTtfLmZvckVhY2goWyJsIiwiciJdLGZ1bmN0aW9uKGhvcml6KXtpZihob3Jpej09PSJyIilhZGp1c3RlZExheWVyaW5nPV8ubWFwKGFkanVzdGVkTGF5ZXJpbmcsZnVuY3Rpb24oaW5uZXIpe3JldHVybiBfLnZhbHVlcyhpbm5lcikucmV2ZXJzZSgpfSk7dmFyIG5laWdoYm9yRm49Xy5iaW5kKHZlcnQ9PT0idSI/Zy5wcmVkZWNlc3NvcnM6Zy5zdWNjZXNzb3JzLApnKTt2YXIgYWxpZ249dmVydGljYWxBbGlnbm1lbnQoZyxhZGp1c3RlZExheWVyaW5nLGNvbmZsaWN0cyxuZWlnaGJvckZuKTt2YXIgeHM9aG9yaXpvbnRhbENvbXBhY3Rpb24oZyxhZGp1c3RlZExheWVyaW5nLGFsaWduLnJvb3QsYWxpZ24uYWxpZ24saG9yaXo9PT0iciIpO2lmKGhvcml6PT09InIiKXhzPV8ubWFwVmFsdWVzKHhzLGZ1bmN0aW9uKHgpe3JldHVybi14fSk7eHNzW3ZlcnQraG9yaXpdPXhzfSl9KTt2YXIgc21hbGxlc3RXaWR0aD1maW5kU21hbGxlc3RXaWR0aEFsaWdubWVudChnLHhzcyk7YWxpZ25Db29yZGluYXRlcyh4c3Msc21hbGxlc3RXaWR0aCk7cmV0dXJuIGJhbGFuY2UoeHNzLGcuZ3JhcGgoKS5hbGlnbil9ZnVuY3Rpb24gc2VwKG5vZGVTZXAsZWRnZVNlcCxyZXZlcnNlU2VwKXtyZXR1cm4gZnVuY3Rpb24oZyx2LHcpe3ZhciB2TGFiZWw9Zy5ub2RlKHYpLHdMYWJlbD1nLm5vZGUodyksc3VtPTAsZGVsdGE7c3VtKz12TGFiZWwud2lkdGgvMjtpZihfLmhhcyh2TGFiZWwsCiJsYWJlbHBvcyIpKXN3aXRjaCh2TGFiZWwubGFiZWxwb3MudG9Mb3dlckNhc2UoKSl7Y2FzZSAibCI6ZGVsdGE9LXZMYWJlbC53aWR0aC8yO2JyZWFrO2Nhc2UgInIiOmRlbHRhPXZMYWJlbC53aWR0aC8yO2JyZWFrfWlmKGRlbHRhKXN1bSs9cmV2ZXJzZVNlcD9kZWx0YTotZGVsdGE7ZGVsdGE9MDtzdW0rPSh2TGFiZWwuZHVtbXk/ZWRnZVNlcDpub2RlU2VwKS8yO3N1bSs9KHdMYWJlbC5kdW1teT9lZGdlU2VwOm5vZGVTZXApLzI7c3VtKz13TGFiZWwud2lkdGgvMjtpZihfLmhhcyh3TGFiZWwsImxhYmVscG9zIikpc3dpdGNoKHdMYWJlbC5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpKXtjYXNlICJsIjpkZWx0YT13TGFiZWwud2lkdGgvMjticmVhaztjYXNlICJyIjpkZWx0YT0td0xhYmVsLndpZHRoLzI7YnJlYWt9aWYoZGVsdGEpc3VtKz1yZXZlcnNlU2VwP2RlbHRhOi1kZWx0YTtkZWx0YT0wO3JldHVybiBzdW19fWZ1bmN0aW9uIHdpZHRoKGcsdil7cmV0dXJuIGcubm9kZSh2KS53aWR0aH0KfSx7Ii4uL2dyYXBobGliIjo3LCIuLi9sb2Rhc2giOjEwLCIuLi91dGlsIjoyOX1dLDI0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4uL3V0aWwiKSxwb3NpdGlvblg9cmVxdWlyZSgiLi9iayIpLnBvc2l0aW9uWDttb2R1bGUuZXhwb3J0cz1wb3NpdGlvbjtmdW5jdGlvbiBwb3NpdGlvbihnKXtnPXV0aWwuYXNOb25Db21wb3VuZEdyYXBoKGcpO3Bvc2l0aW9uWShnKTtfLmZvckVhY2gocG9zaXRpb25YKGcpLGZ1bmN0aW9uKHgsdil7Zy5ub2RlKHYpLng9eH0pfWZ1bmN0aW9uIHBvc2l0aW9uWShnKXt2YXIgbGF5ZXJpbmc9dXRpbC5idWlsZExheWVyTWF0cml4KGcpLHJhbmtTZXA9Zy5ncmFwaCgpLnJhbmtzZXAscHJldlk9MDtfLmZvckVhY2gobGF5ZXJpbmcsZnVuY3Rpb24obGF5ZXIpe3ZhciBtYXhIZWlnaHQ9Xy5tYXgoXy5tYXAobGF5ZXIsZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KS5oZWlnaHR9KSk7Cl8uZm9yRWFjaChsYXllcixmdW5jdGlvbih2KXtnLm5vZGUodikueT1wcmV2WSttYXhIZWlnaHQvMn0pO3ByZXZZKz1tYXhIZWlnaHQrcmFua1NlcH0pfX0seyIuLi9sb2Rhc2giOjEwLCIuLi91dGlsIjoyOSwiLi9iayI6MjN9XSwyNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksR3JhcGg9cmVxdWlyZSgiLi4vZ3JhcGhsaWIiKS5HcmFwaCxzbGFjaz1yZXF1aXJlKCIuL3V0aWwiKS5zbGFjazttb2R1bGUuZXhwb3J0cz1mZWFzaWJsZVRyZWU7ZnVuY3Rpb24gZmVhc2libGVUcmVlKGcpe3ZhciB0PW5ldyBHcmFwaCh7ZGlyZWN0ZWQ6ZmFsc2V9KTt2YXIgc3RhcnQ9Zy5ub2RlcygpWzBdLHNpemU9Zy5ub2RlQ291bnQoKTt0LnNldE5vZGUoc3RhcnQse30pO3ZhciBlZGdlLGRlbHRhO3doaWxlKHRpZ2h0VHJlZSh0LGcpPHNpemUpe2VkZ2U9ZmluZE1pblNsYWNrRWRnZSh0LGcpO2RlbHRhPXQuaGFzTm9kZShlZGdlLnYpPwpzbGFjayhnLGVkZ2UpOi1zbGFjayhnLGVkZ2UpO3NoaWZ0UmFua3ModCxnLGRlbHRhKX1yZXR1cm4gdH1mdW5jdGlvbiB0aWdodFRyZWUodCxnKXtmdW5jdGlvbiBkZnModil7Xy5mb3JFYWNoKGcubm9kZUVkZ2VzKHYpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlVj1lLnYsdz12PT09ZWRnZVY/ZS53OmVkZ2VWO2lmKCF0Lmhhc05vZGUodykmJiFzbGFjayhnLGUpKXt0LnNldE5vZGUodyx7fSk7dC5zZXRFZGdlKHYsdyx7fSk7ZGZzKHcpfX0pfV8uZm9yRWFjaCh0Lm5vZGVzKCksZGZzKTtyZXR1cm4gdC5ub2RlQ291bnQoKX1mdW5jdGlvbiBmaW5kTWluU2xhY2tFZGdlKHQsZyl7cmV0dXJuIF8ubWluQnkoZy5lZGdlcygpLGZ1bmN0aW9uKGUpe2lmKHQuaGFzTm9kZShlLnYpIT09dC5oYXNOb2RlKGUudykpcmV0dXJuIHNsYWNrKGcsZSl9KX1mdW5jdGlvbiBzaGlmdFJhbmtzKHQsZyxkZWx0YSl7Xy5mb3JFYWNoKHQubm9kZXMoKSxmdW5jdGlvbih2KXtnLm5vZGUodikucmFuays9ZGVsdGF9KX0KfSx7Ii4uL2dyYXBobGliIjo3LCIuLi9sb2Rhc2giOjEwLCIuL3V0aWwiOjI4fV0sMjY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciByYW5rVXRpbD1yZXF1aXJlKCIuL3V0aWwiKSxsb25nZXN0UGF0aD1yYW5rVXRpbC5sb25nZXN0UGF0aCxmZWFzaWJsZVRyZWU9cmVxdWlyZSgiLi9mZWFzaWJsZS10cmVlIiksbmV0d29ya1NpbXBsZXg9cmVxdWlyZSgiLi9uZXR3b3JrLXNpbXBsZXgiKTttb2R1bGUuZXhwb3J0cz1yYW5rO2Z1bmN0aW9uIHJhbmsoZyl7c3dpdGNoKGcuZ3JhcGgoKS5yYW5rZXIpe2Nhc2UgIm5ldHdvcmstc2ltcGxleCI6bmV0d29ya1NpbXBsZXhSYW5rZXIoZyk7YnJlYWs7Y2FzZSAidGlnaHQtdHJlZSI6dGlnaHRUcmVlUmFua2VyKGcpO2JyZWFrO2Nhc2UgImxvbmdlc3QtcGF0aCI6bG9uZ2VzdFBhdGhSYW5rZXIoZyk7YnJlYWs7ZGVmYXVsdDpuZXR3b3JrU2ltcGxleFJhbmtlcihnKX19dmFyIGxvbmdlc3RQYXRoUmFua2VyPWxvbmdlc3RQYXRoOwpmdW5jdGlvbiB0aWdodFRyZWVSYW5rZXIoZyl7bG9uZ2VzdFBhdGgoZyk7ZmVhc2libGVUcmVlKGcpfWZ1bmN0aW9uIG5ldHdvcmtTaW1wbGV4UmFua2VyKGcpe25ldHdvcmtTaW1wbGV4KGcpfX0seyIuL2ZlYXNpYmxlLXRyZWUiOjI1LCIuL25ldHdvcmstc2ltcGxleCI6MjcsIi4vdXRpbCI6Mjh9XSwyNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksZmVhc2libGVUcmVlPXJlcXVpcmUoIi4vZmVhc2libGUtdHJlZSIpLHNsYWNrPXJlcXVpcmUoIi4vdXRpbCIpLnNsYWNrLGluaXRSYW5rPXJlcXVpcmUoIi4vdXRpbCIpLmxvbmdlc3RQYXRoLHByZW9yZGVyPXJlcXVpcmUoIi4uL2dyYXBobGliIikuYWxnLnByZW9yZGVyLHBvc3RvcmRlcj1yZXF1aXJlKCIuLi9ncmFwaGxpYiIpLmFsZy5wb3N0b3JkZXIsc2ltcGxpZnk9cmVxdWlyZSgiLi4vdXRpbCIpLnNpbXBsaWZ5O21vZHVsZS5leHBvcnRzPW5ldHdvcmtTaW1wbGV4OwpuZXR3b3JrU2ltcGxleC5pbml0TG93TGltVmFsdWVzPWluaXRMb3dMaW1WYWx1ZXM7bmV0d29ya1NpbXBsZXguaW5pdEN1dFZhbHVlcz1pbml0Q3V0VmFsdWVzO25ldHdvcmtTaW1wbGV4LmNhbGNDdXRWYWx1ZT1jYWxjQ3V0VmFsdWU7bmV0d29ya1NpbXBsZXgubGVhdmVFZGdlPWxlYXZlRWRnZTtuZXR3b3JrU2ltcGxleC5lbnRlckVkZ2U9ZW50ZXJFZGdlO25ldHdvcmtTaW1wbGV4LmV4Y2hhbmdlRWRnZXM9ZXhjaGFuZ2VFZGdlcztmdW5jdGlvbiBuZXR3b3JrU2ltcGxleChnKXtnPXNpbXBsaWZ5KGcpO2luaXRSYW5rKGcpO3ZhciB0PWZlYXNpYmxlVHJlZShnKTtpbml0TG93TGltVmFsdWVzKHQpO2luaXRDdXRWYWx1ZXModCxnKTt2YXIgZSxmO3doaWxlKGU9bGVhdmVFZGdlKHQpKXtmPWVudGVyRWRnZSh0LGcsZSk7ZXhjaGFuZ2VFZGdlcyh0LGcsZSxmKX19ZnVuY3Rpb24gaW5pdEN1dFZhbHVlcyh0LGcpe3ZhciB2cz1wb3N0b3JkZXIodCx0Lm5vZGVzKCkpO3ZzPXZzLnNsaWNlKDAsCnZzLmxlbmd0aC0xKTtfLmZvckVhY2godnMsZnVuY3Rpb24odil7YXNzaWduQ3V0VmFsdWUodCxnLHYpfSl9ZnVuY3Rpb24gYXNzaWduQ3V0VmFsdWUodCxnLGNoaWxkKXt2YXIgY2hpbGRMYWI9dC5ub2RlKGNoaWxkKSxwYXJlbnQ9Y2hpbGRMYWIucGFyZW50O3QuZWRnZShjaGlsZCxwYXJlbnQpLmN1dHZhbHVlPWNhbGNDdXRWYWx1ZSh0LGcsY2hpbGQpfWZ1bmN0aW9uIGNhbGNDdXRWYWx1ZSh0LGcsY2hpbGQpe3ZhciBjaGlsZExhYj10Lm5vZGUoY2hpbGQpLHBhcmVudD1jaGlsZExhYi5wYXJlbnQsY2hpbGRJc1RhaWw9dHJ1ZSxncmFwaEVkZ2U9Zy5lZGdlKGNoaWxkLHBhcmVudCksY3V0VmFsdWU9MDtpZighZ3JhcGhFZGdlKXtjaGlsZElzVGFpbD1mYWxzZTtncmFwaEVkZ2U9Zy5lZGdlKHBhcmVudCxjaGlsZCl9Y3V0VmFsdWU9Z3JhcGhFZGdlLndlaWdodDtfLmZvckVhY2goZy5ub2RlRWRnZXMoY2hpbGQpLGZ1bmN0aW9uKGUpe3ZhciBpc091dEVkZ2U9ZS52PT09Y2hpbGQsb3RoZXI9CmlzT3V0RWRnZT9lLnc6ZS52O2lmKG90aGVyIT09cGFyZW50KXt2YXIgcG9pbnRzVG9IZWFkPWlzT3V0RWRnZT09PWNoaWxkSXNUYWlsLG90aGVyV2VpZ2h0PWcuZWRnZShlKS53ZWlnaHQ7Y3V0VmFsdWUrPXBvaW50c1RvSGVhZD9vdGhlcldlaWdodDotb3RoZXJXZWlnaHQ7aWYoaXNUcmVlRWRnZSh0LGNoaWxkLG90aGVyKSl7dmFyIG90aGVyQ3V0VmFsdWU9dC5lZGdlKGNoaWxkLG90aGVyKS5jdXR2YWx1ZTtjdXRWYWx1ZSs9cG9pbnRzVG9IZWFkPy1vdGhlckN1dFZhbHVlOm90aGVyQ3V0VmFsdWV9fX0pO3JldHVybiBjdXRWYWx1ZX1mdW5jdGlvbiBpbml0TG93TGltVmFsdWVzKHRyZWUscm9vdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXJvb3Q9dHJlZS5ub2RlcygpWzBdO2Rmc0Fzc2lnbkxvd0xpbSh0cmVlLHt9LDEscm9vdCl9ZnVuY3Rpb24gZGZzQXNzaWduTG93TGltKHRyZWUsdmlzaXRlZCxuZXh0TGltLHYscGFyZW50KXt2YXIgbG93PW5leHRMaW0sbGFiZWw9dHJlZS5ub2RlKHYpOwp2aXNpdGVkW3ZdPXRydWU7Xy5mb3JFYWNoKHRyZWUubmVpZ2hib3JzKHYpLGZ1bmN0aW9uKHcpe2lmKCFfLmhhcyh2aXNpdGVkLHcpKW5leHRMaW09ZGZzQXNzaWduTG93TGltKHRyZWUsdmlzaXRlZCxuZXh0TGltLHcsdil9KTtsYWJlbC5sb3c9bG93O2xhYmVsLmxpbT1uZXh0TGltKys7aWYocGFyZW50KWxhYmVsLnBhcmVudD1wYXJlbnQ7ZWxzZSBkZWxldGUgbGFiZWwucGFyZW50O3JldHVybiBuZXh0TGltfWZ1bmN0aW9uIGxlYXZlRWRnZSh0cmVlKXtyZXR1cm4gXy5maW5kKHRyZWUuZWRnZXMoKSxmdW5jdGlvbihlKXtyZXR1cm4gdHJlZS5lZGdlKGUpLmN1dHZhbHVlPDB9KX1mdW5jdGlvbiBlbnRlckVkZ2UodCxnLGVkZ2Upe3ZhciB2PWVkZ2Uudix3PWVkZ2UudztpZighZy5oYXNFZGdlKHYsdykpe3Y9ZWRnZS53O3c9ZWRnZS52fXZhciB2TGFiZWw9dC5ub2RlKHYpLHdMYWJlbD10Lm5vZGUodyksdGFpbExhYmVsPXZMYWJlbCxmbGlwPWZhbHNlO2lmKHZMYWJlbC5saW0+d0xhYmVsLmxpbSl7dGFpbExhYmVsPQp3TGFiZWw7ZmxpcD10cnVlfXZhciBjYW5kaWRhdGVzPV8uZmlsdGVyKGcuZWRnZXMoKSxmdW5jdGlvbihlZGdlKXtyZXR1cm4gZmxpcD09PWlzRGVzY2VuZGFudCh0LHQubm9kZShlZGdlLnYpLHRhaWxMYWJlbCkmJmZsaXAhPT1pc0Rlc2NlbmRhbnQodCx0Lm5vZGUoZWRnZS53KSx0YWlsTGFiZWwpfSk7cmV0dXJuIF8ubWluQnkoY2FuZGlkYXRlcyxmdW5jdGlvbihlZGdlKXtyZXR1cm4gc2xhY2soZyxlZGdlKX0pfWZ1bmN0aW9uIGV4Y2hhbmdlRWRnZXModCxnLGUsZil7dmFyIHY9ZS52LHc9ZS53O3QucmVtb3ZlRWRnZSh2LHcpO3Quc2V0RWRnZShmLnYsZi53LHt9KTtpbml0TG93TGltVmFsdWVzKHQpO2luaXRDdXRWYWx1ZXModCxnKTt1cGRhdGVSYW5rcyh0LGcpfWZ1bmN0aW9uIHVwZGF0ZVJhbmtzKHQsZyl7dmFyIHJvb3Q9Xy5maW5kKHQubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4hZy5ub2RlKHYpLnBhcmVudH0pLHZzPXByZW9yZGVyKHQscm9vdCk7dnM9dnMuc2xpY2UoMSk7Cl8uZm9yRWFjaCh2cyxmdW5jdGlvbih2KXt2YXIgcGFyZW50PXQubm9kZSh2KS5wYXJlbnQsZWRnZT1nLmVkZ2UodixwYXJlbnQpLGZsaXBwZWQ9ZmFsc2U7aWYoIWVkZ2Upe2VkZ2U9Zy5lZGdlKHBhcmVudCx2KTtmbGlwcGVkPXRydWV9Zy5ub2RlKHYpLnJhbms9Zy5ub2RlKHBhcmVudCkucmFuaysoZmxpcHBlZD9lZGdlLm1pbmxlbjotZWRnZS5taW5sZW4pfSl9ZnVuY3Rpb24gaXNUcmVlRWRnZSh0cmVlLHUsdil7cmV0dXJuIHRyZWUuaGFzRWRnZSh1LHYpfWZ1bmN0aW9uIGlzRGVzY2VuZGFudCh0cmVlLHZMYWJlbCxyb290TGFiZWwpe3JldHVybiByb290TGFiZWwubG93PD12TGFiZWwubGltJiZ2TGFiZWwubGltPD1yb290TGFiZWwubGltfX0seyIuLi9ncmFwaGxpYiI6NywiLi4vbG9kYXNoIjoxMCwiLi4vdXRpbCI6MjksIi4vZmVhc2libGUtdHJlZSI6MjUsIi4vdXRpbCI6Mjh9XSwyODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7Cm1vZHVsZS5leHBvcnRzPXtsb25nZXN0UGF0aDpsb25nZXN0UGF0aCxzbGFjazpzbGFja307ZnVuY3Rpb24gbG9uZ2VzdFBhdGgoZyl7dmFyIHZpc2l0ZWQ9e307ZnVuY3Rpb24gZGZzKHYpe3ZhciBsYWJlbD1nLm5vZGUodik7aWYoXy5oYXModmlzaXRlZCx2KSlyZXR1cm4gbGFiZWwucmFuazt2aXNpdGVkW3ZdPXRydWU7dmFyIHJhbms9Xy5taW5CeShfLm1hcChnLm91dEVkZ2VzKHYpLGZ1bmN0aW9uKGUpe3JldHVybiBkZnMoZS53KS1nLmVkZ2UoZSkubWlubGVufSkpO2lmKHJhbms9PT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFl8fHJhbms9PT11bmRlZmluZWR8fHJhbms9PT1udWxsKXJhbms9MDtyZXR1cm4gbGFiZWwucmFuaz1yYW5rfV8uZm9yRWFjaChnLnNvdXJjZXMoKSxkZnMpfWZ1bmN0aW9uIHNsYWNrKGcsZSl7cmV0dXJuIGcubm9kZShlLncpLnJhbmstZy5ub2RlKGUudikucmFuay1nLmVkZ2UoZSkubWlubGVufX0seyIuLi9sb2Rhc2giOjEwfV0sMjk6W2Z1bmN0aW9uKHJlcXVpcmUsCm1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4vZ3JhcGhsaWIiKS5HcmFwaDttb2R1bGUuZXhwb3J0cz17YWRkRHVtbXlOb2RlOmFkZER1bW15Tm9kZSxzaW1wbGlmeTpzaW1wbGlmeSxhc05vbkNvbXBvdW5kR3JhcGg6YXNOb25Db21wb3VuZEdyYXBoLHN1Y2Nlc3NvcldlaWdodHM6c3VjY2Vzc29yV2VpZ2h0cyxwcmVkZWNlc3NvcldlaWdodHM6cHJlZGVjZXNzb3JXZWlnaHRzLGludGVyc2VjdFJlY3Q6aW50ZXJzZWN0UmVjdCxidWlsZExheWVyTWF0cml4OmJ1aWxkTGF5ZXJNYXRyaXgsbm9ybWFsaXplUmFua3M6bm9ybWFsaXplUmFua3MscmVtb3ZlRW1wdHlSYW5rczpyZW1vdmVFbXB0eVJhbmtzLGFkZEJvcmRlck5vZGU6YWRkQm9yZGVyTm9kZSxtYXhSYW5rOm1heFJhbmsscGFydGl0aW9uOnBhcnRpdGlvbix0aW1lOnRpbWUsbm90aW1lOm5vdGltZX07ZnVuY3Rpb24gYWRkRHVtbXlOb2RlKGcsdHlwZSxhdHRycyxuYW1lKXt2YXIgdjsKZG8gdj1fLnVuaXF1ZUlkKG5hbWUpO3doaWxlKGcuaGFzTm9kZSh2KSk7YXR0cnMuZHVtbXk9dHlwZTtnLnNldE5vZGUodixhdHRycyk7cmV0dXJuIHZ9ZnVuY3Rpb24gc2ltcGxpZnkoZyl7dmFyIHNpbXBsaWZpZWQ9KG5ldyBHcmFwaCkuc2V0R3JhcGgoZy5ncmFwaCgpKTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3NpbXBsaWZpZWQuc2V0Tm9kZSh2LGcubm9kZSh2KSl9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBzaW1wbGVMYWJlbD1zaW1wbGlmaWVkLmVkZ2UoZS52LGUudyl8fHt3ZWlnaHQ6MCxtaW5sZW46MX0sbGFiZWw9Zy5lZGdlKGUpO3NpbXBsaWZpZWQuc2V0RWRnZShlLnYsZS53LHt3ZWlnaHQ6c2ltcGxlTGFiZWwud2VpZ2h0K2xhYmVsLndlaWdodCxtaW5sZW46TWF0aC5tYXgoc2ltcGxlTGFiZWwubWlubGVuLGxhYmVsLm1pbmxlbil9KX0pO3JldHVybiBzaW1wbGlmaWVkfWZ1bmN0aW9uIGFzTm9uQ29tcG91bmRHcmFwaChnKXt2YXIgc2ltcGxpZmllZD0KKG5ldyBHcmFwaCh7bXVsdGlncmFwaDpnLmlzTXVsdGlncmFwaCgpfSkpLnNldEdyYXBoKGcuZ3JhcGgoKSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtpZighZy5jaGlsZHJlbih2KS5sZW5ndGgpc2ltcGxpZmllZC5zZXROb2RlKHYsZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7c2ltcGxpZmllZC5zZXRFZGdlKGUsZy5lZGdlKGUpKX0pO3JldHVybiBzaW1wbGlmaWVkfWZ1bmN0aW9uIHN1Y2Nlc3NvcldlaWdodHMoZyl7dmFyIHdlaWdodE1hcD1fLm1hcChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIHN1Y3M9e307Xy5mb3JFYWNoKGcub3V0RWRnZXModiksZnVuY3Rpb24oZSl7c3Vjc1tlLnddPShzdWNzW2Uud118fDApK2cuZWRnZShlKS53ZWlnaHR9KTtyZXR1cm4gc3Vjc30pO3JldHVybiBfLnppcE9iamVjdChnLm5vZGVzKCksd2VpZ2h0TWFwKX1mdW5jdGlvbiBwcmVkZWNlc3NvcldlaWdodHMoZyl7dmFyIHdlaWdodE1hcD1fLm1hcChnLm5vZGVzKCksCmZ1bmN0aW9uKHYpe3ZhciBwcmVkcz17fTtfLmZvckVhY2goZy5pbkVkZ2VzKHYpLGZ1bmN0aW9uKGUpe3ByZWRzW2Uudl09KHByZWRzW2Uudl18fDApK2cuZWRnZShlKS53ZWlnaHR9KTtyZXR1cm4gcHJlZHN9KTtyZXR1cm4gXy56aXBPYmplY3QoZy5ub2RlcygpLHdlaWdodE1hcCl9ZnVuY3Rpb24gaW50ZXJzZWN0UmVjdChyZWN0LHBvaW50KXt2YXIgeD1yZWN0Lng7dmFyIHk9cmVjdC55O3ZhciBkeD1wb2ludC54LXg7dmFyIGR5PXBvaW50LnkteTt2YXIgdz1yZWN0LndpZHRoLzI7dmFyIGg9cmVjdC5oZWlnaHQvMjtpZighZHgmJiFkeSl0aHJvdyBuZXcgRXJyb3IoIk5vdCBwb3NzaWJsZSB0byBmaW5kIGludGVyc2VjdGlvbiBpbnNpZGUgb2YgdGhlIHJlY3RhbmdsZSIpO3ZhciBzeCxzeTtpZihNYXRoLmFicyhkeSkqdz5NYXRoLmFicyhkeCkqaCl7aWYoZHk8MCloPS1oO3N4PWgqZHgvZHk7c3k9aH1lbHNle2lmKGR4PDApdz0tdztzeD13O3N5PXcqZHkvZHh9cmV0dXJue3g6eCsKc3gseTp5K3N5fX1mdW5jdGlvbiBidWlsZExheWVyTWF0cml4KGcpe3ZhciBsYXllcmluZz1fLm1hcChfLnJhbmdlKG1heFJhbmsoZykrMSksZnVuY3Rpb24oKXtyZXR1cm5bXX0pO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpLHJhbms9bm9kZS5yYW5rO2lmKCFfLmlzVW5kZWZpbmVkKHJhbmspKWxheWVyaW5nW3JhbmtdW25vZGUub3JkZXJdPXZ9KTtyZXR1cm4gbGF5ZXJpbmd9ZnVuY3Rpb24gbm9ybWFsaXplUmFua3MoZyl7dmFyIG1pbj1fLm1pbkJ5KF8ubWFwKGcubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpLnJhbmt9KSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodik7aWYoXy5oYXMobm9kZSwicmFuayIpKW5vZGUucmFuay09bWlufSl9ZnVuY3Rpb24gcmVtb3ZlRW1wdHlSYW5rcyhnKXt2YXIgb2Zmc2V0PV8ubWluQnkoXy5tYXAoZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldHVybiBnLm5vZGUodikucmFua30pKTsKdmFyIGxheWVycz1bXTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciByYW5rPWcubm9kZSh2KS5yYW5rLW9mZnNldDtpZighbGF5ZXJzW3JhbmtdKWxheWVyc1tyYW5rXT1bXTtsYXllcnNbcmFua10ucHVzaCh2KX0pO3ZhciBkZWx0YT0wLG5vZGVSYW5rRmFjdG9yPWcuZ3JhcGgoKS5ub2RlUmFua0ZhY3RvcjtfLmZvckVhY2gobGF5ZXJzLGZ1bmN0aW9uKHZzLGkpe2lmKF8uaXNVbmRlZmluZWQodnMpJiZpJW5vZGVSYW5rRmFjdG9yIT09MCktLWRlbHRhO2Vsc2UgaWYoZGVsdGEpXy5mb3JFYWNoKHZzLGZ1bmN0aW9uKHYpe2cubm9kZSh2KS5yYW5rKz1kZWx0YX0pfSl9ZnVuY3Rpb24gYWRkQm9yZGVyTm9kZShnLHByZWZpeCxyYW5rLG9yZGVyKXt2YXIgbm9kZT17d2lkdGg6MCxoZWlnaHQ6MH07aWYoYXJndW1lbnRzLmxlbmd0aD49NCl7bm9kZS5yYW5rPXJhbms7bm9kZS5vcmRlcj1vcmRlcn1yZXR1cm4gYWRkRHVtbXlOb2RlKGcsImJvcmRlciIsbm9kZSxwcmVmaXgpfQpmdW5jdGlvbiBtYXhSYW5rKGcpe3JldHVybiBfLm1heChfLm1hcChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIHJhbms9Zy5ub2RlKHYpLnJhbms7aWYoIV8uaXNVbmRlZmluZWQocmFuaykpcmV0dXJuIHJhbmt9KSl9ZnVuY3Rpb24gcGFydGl0aW9uKGNvbGxlY3Rpb24sZm4pe3ZhciByZXN1bHQ9e2xoczpbXSxyaHM6W119O18uZm9yRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlKXtpZihmbih2YWx1ZSkpcmVzdWx0Lmxocy5wdXNoKHZhbHVlKTtlbHNlIHJlc3VsdC5yaHMucHVzaCh2YWx1ZSl9KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHRpbWUobmFtZSxmbil7dmFyIHN0YXJ0PV8ubm93KCk7dHJ5e3JldHVybiBmbigpfWZpbmFsbHl7Y29uc29sZS5sb2cobmFtZSsiIHRpbWU6ICIrKF8ubm93KCktc3RhcnQpKyJtcyIpfX1mdW5jdGlvbiBub3RpbWUobmFtZSxmbil7cmV0dXJuIGZuKCl9fSx7Ii4vZ3JhcGhsaWIiOjcsIi4vbG9kYXNoIjoxMH1dLDMwOltmdW5jdGlvbihyZXF1aXJlLAptb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9IjAuOC4yIn0se31dfSx7fSxbMV0pKDEpfSk7Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vYW5ub3RhdGlvbi5qcwp2YXIgdGY7CihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmdW5jdGlvbiBnKHIpe3JldHVybihjLnJlbmRlci5Bbm5vdGF0aW9uVHlwZVtyXXx8IiIpLnRvTG93ZXJDYXNlKCl8fG51bGx9ZnVuY3Rpb24gbChyLHQpe3QuYW5ub3RhdGlvblR5cGU9PT1jLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5TVU1NQVJZP2Quc2VsZWN0T3JDcmVhdGVDaGlsZChyLCJ1c2UiKS5hdHRyKCJjbGFzcyIsInN1bW1hcnkiKS5hdHRyKCJ4bGluazpocmVmIiwiI3N1bW1hcnktaWNvbiIpLmF0dHIoImN1cnNvciIsInBvaW50ZXIiKToocj1kLm5vZGUuYnVpbGRTaGFwZShyLHQsZC5DbGFzcy5Bbm5vdGF0aW9uLk5PREUpLGQuc2VsZWN0T3JDcmVhdGVDaGlsZChyLCJ0aXRsZSIpLnRleHQodC5ub2RlLm5hbWUpKX1mdW5jdGlvbiBrKHIsdCl7bGV0IHY9dC5ub2RlLm5hbWUuc3BsaXQoIi8iKTtyZXR1cm4gbihyLHZbdi5sZW5ndGgtMV0sdCxudWxsKX1mdW5jdGlvbiBuKHIsdCwKdix5KXtsZXQgej1kLkNsYXNzLkFubm90YXRpb24uTEFCRUw7eSYmKHorPSIgIit5KTtyPXIuYXBwZW5kKCJ0ZXh0IikuYXR0cigiY2xhc3MiLHopLmF0dHIoImR5IiwiLjM1ZW0iKS5hdHRyKCJ0ZXh0LWFuY2hvciIsdi5pc0luPyJlbmQiOiJzdGFydCIpLnRleHQodCk7cmV0dXJuIGEuZ3JhcGguc2NlbmUubm9kZS5lbmZvcmNlTGFiZWxXaWR0aChyLC0xKX1mdW5jdGlvbiBwKHIsdCx2LHkpe3Iub24oIm1vdXNlb3ZlciIsej0+e3kuZmlyZSgiYW5ub3RhdGlvbi1oaWdobGlnaHQiLHtuYW1lOnoubm9kZS5uYW1lLGhvc3ROYW1lOnQubm9kZS5uYW1lfSl9KS5vbigibW91c2VvdXQiLHo9Pnt5LmZpcmUoImFubm90YXRpb24tdW5oaWdobGlnaHQiLHtuYW1lOnoubm9kZS5uYW1lLGhvc3ROYW1lOnQubm9kZS5uYW1lfSl9KS5vbigiY2xpY2siLHo9PntkMy5ldmVudC5zdG9wUHJvcGFnYXRpb24oKTt5LmZpcmUoImFubm90YXRpb24tc2VsZWN0Iix7bmFtZTp6Lm5vZGUubmFtZSxob3N0TmFtZTp0Lm5vZGUubmFtZX0pfSk7CmlmKHYuYW5ub3RhdGlvblR5cGUhPT1jLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5TVU1NQVJZJiZ2LmFubm90YXRpb25UeXBlIT09Yy5yZW5kZXIuQW5ub3RhdGlvblR5cGUuQ09OU1RBTlQpci5vbigiY29udGV4dG1lbnUiLGQuY29udGV4dG1lbnUuZ2V0TWVudSh5LGQubm9kZS5nZXRDb250ZXh0TWVudSh2Lm5vZGUseSkpKX1mdW5jdGlvbiBxKHIsdCx2LHkpe2xldCB6PWMubGF5b3V0LmNvbXB1dGVDWFBvc2l0aW9uT2ZOb2RlU2hhcGUodCk7di5yZW5kZXJOb2RlSW5mbyYmdi5hbm5vdGF0aW9uVHlwZSE9PWMucmVuZGVyLkFubm90YXRpb25UeXBlLkVMTElQU0lTJiZkLm5vZGUuc3R5bGl6ZShyLHYucmVuZGVyTm9kZUluZm8seSxkLkNsYXNzLkFubm90YXRpb24uTk9ERSk7di5hbm5vdGF0aW9uVHlwZT09PWMucmVuZGVyLkFubm90YXRpb25UeXBlLlNVTU1BUlkmJih2LndpZHRoKz0xMCk7ci5zZWxlY3QoInRleHQuIitkLkNsYXNzLkFubm90YXRpb24uTEFCRUwpLnRyYW5zaXRpb24oKS5hdHRyKCJ4IiwKeit2LmR4Kyh2LmlzSW4/LTE6MSkqKHYud2lkdGgvMit2LmxhYmVsT2Zmc2V0KSkuYXR0cigieSIsdC55K3YuZHkpO3Iuc2VsZWN0KCJ1c2Uuc3VtbWFyeSIpLnRyYW5zaXRpb24oKS5hdHRyKCJ4Iix6K3YuZHgtMykuYXR0cigieSIsdC55K3YuZHktNik7ZC5wb3NpdGlvbkVsbGlwc2Uoci5zZWxlY3QoIi4iK2QuQ2xhc3MuQW5ub3RhdGlvbi5OT0RFKyIgZWxsaXBzZSIpLHordi5keCx0Lnkrdi5keSx2LndpZHRoLHYuaGVpZ2h0KTtkLnBvc2l0aW9uUmVjdChyLnNlbGVjdCgiLiIrZC5DbGFzcy5Bbm5vdGF0aW9uLk5PREUrIiByZWN0Iikseit2LmR4LHQueSt2LmR5LHYud2lkdGgsdi5oZWlnaHQpO2QucG9zaXRpb25SZWN0KHIuc2VsZWN0KCIuIitkLkNsYXNzLkFubm90YXRpb24uTk9ERSsiIHVzZSIpLHordi5keCx0Lnkrdi5keSx2LndpZHRoLHYuaGVpZ2h0KTtyLnNlbGVjdCgicGF0aC4iK2QuQ2xhc3MuQW5ub3RhdGlvbi5FREdFKS50cmFuc2l0aW9uKCkuYXR0cigiZCIseD0+Cnt4PXgucG9pbnRzLm1hcChDPT4oe3g6Qy5keCt6LHk6Qy5keSt0Lnl9KSk7cmV0dXJuIGQuZWRnZS5pbnRlcnBvbGF0ZSh4KX0pfWYuYnVpbGRHcm91cD1mdW5jdGlvbihyLHQsdix5KXtyPXIuc2VsZWN0QWxsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlc30pLmRhdGEodC5saXN0LHo9Pnoubm9kZS5uYW1lKTtyLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiZGF0YS1uYW1lIix6PT56Lm5vZGUubmFtZSkuZWFjaChmdW5jdGlvbih6KXtsZXQgeD1kMy5zZWxlY3QodGhpcyk7eS5hZGRBbm5vdGF0aW9uR3JvdXAoeix2LHgpO2xldCBDPWQuQ2xhc3MuQW5ub3RhdGlvbi5FREdFLEY9ei5yZW5kZXJNZXRhZWRnZUluZm8mJnoucmVuZGVyTWV0YWVkZ2VJbmZvLm1ldGFlZGdlO0YmJiFGLm51bVJlZ3VsYXJFZGdlcyYmKEMrPSIgIitkLkNsYXNzLkFubm90YXRpb24uQ09OVFJPTF9FREdFKTtGJiZGLm51bVJlZkVkZ2VzJiYoQys9IiAiK2QuQ2xhc3MuRWRnZS5SRUZfTElORSk7CmQuZWRnZS5hcHBlbmRFZGdlKHgseix5LEMpO3ouYW5ub3RhdGlvblR5cGUhPT1jLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5FTExJUFNJUz8oayh4LHopLGwoeCx6KSk6bih4LHoubm9kZS5uYW1lLHosZC5DbGFzcy5Bbm5vdGF0aW9uLkVMTElQU0lTKX0pLm1lcmdlKHIpLmF0dHIoImNsYXNzIix6PT5kLkNsYXNzLkFubm90YXRpb24uR1JPVVArIiAiK2coei5hbm5vdGF0aW9uVHlwZSkrIiAiK2Qubm9kZS5ub2RlQ2xhc3MoeikpLmVhY2goZnVuY3Rpb24oeil7bGV0IHg9ZDMuc2VsZWN0KHRoaXMpO3EoeCx2LHoseSk7ei5hbm5vdGF0aW9uVHlwZSE9PWMucmVuZGVyLkFubm90YXRpb25UeXBlLkVMTElQU0lTJiZwKHgsdix6LHkpfSk7ci5leGl0KCkuZWFjaChmdW5jdGlvbih6KXtsZXQgeD1kMy5zZWxlY3QodGhpcyk7eS5yZW1vdmVBbm5vdGF0aW9uR3JvdXAoeix2LHgpfSkucmVtb3ZlKCk7cmV0dXJuIHJ9fSkoZC5hbm5vdGF0aW9ufHwoZC5hbm5vdGF0aW9uPXt9KSl9KShjLnNjZW5lfHwKKGMuc2NlbmU9e30pKX0pKGEuZ3JhcGh8fChhLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2NvbG9ycy5qcwooZnVuY3Rpb24oYSl7YS5DT0xPUlM9W3tuYW1lOiJHb29nbGUgQmx1ZSIsY29sb3I6IiM0MTg0ZjMiLGFjdGl2ZToiIzNhNTNjNSIsZGlzYWJsZWQ6IiNjYWQ4ZmMifSx7bmFtZToiR29vZ2xlIFJlZCIsY29sb3I6IiNkYjQ0MzciLGFjdGl2ZToiIzhmMmEwYyIsZGlzYWJsZWQ6IiNlOGM2YzEifSx7bmFtZToiR29vZ2xlIFllbGxvdyIsY29sb3I6IiNmNGI0MDAiLGFjdGl2ZToiI2RiOTIwMCIsZGlzYWJsZWQ6IiNmN2U4YjAifSx7bmFtZToiR29vZ2xlIEdyZWVuIixjb2xvcjoiIzBmOWQ1OCIsYWN0aXZlOiIjNDg4MDQ2IixkaXNhYmxlZDoiI2MyZTFjYyJ9LHtuYW1lOiJQdXJwbGUiLGNvbG9yOiIjYWE0NmJiIixhY3RpdmU6IiM1YzEzOTgiLGRpc2FibGVkOiIjZDdiY2U2In0se25hbWU6IlRlYWwiLGNvbG9yOiIjMDBhYmMwIixhY3RpdmU6IiM0NzgyOGUiLGRpc2FibGVkOiIjYzJlYWYyIn0se25hbWU6IkRlZXAgT3JhbmdlIixjb2xvcjoiI2ZmNmY0MiIsYWN0aXZlOiIjY2E0YTA2IiwKZGlzYWJsZWQ6IiNmMmNiYmEifSx7bmFtZToiTGltZSIsY29sb3I6IiM5ZDljMjMiLGFjdGl2ZToiIzdmNzcxZCIsZGlzYWJsZWQ6IiNmMWY0YzIifSx7bmFtZToiSW5kaWdvIixjb2xvcjoiIzViNmFiZiIsYWN0aXZlOiIjM2U0N2E5IixkaXNhYmxlZDoiI2M1YzhlOCJ9LHtuYW1lOiJQaW5rIixjb2xvcjoiI2VmNjE5MSIsYWN0aXZlOiIjY2ExYzYwIixkaXNhYmxlZDoiI2U5YjljZSJ9LHtuYW1lOiJEZWVwIFRlYWwiLGNvbG9yOiIjMDA3ODZhIixhY3RpdmU6IiMyYjRmNDMiLGRpc2FibGVkOiIjYmVkZWRhIn0se25hbWU6IkRlZXAgUGluayIsY29sb3I6IiNjMTE3NWEiLGFjdGl2ZToiIzc1MDg0ZiIsZGlzYWJsZWQ6IiNkZThjYWUifSx7bmFtZToiR3JheSIsY29sb3I6IiM5RTlFOUUiLGFjdGl2ZToiIzQyNDI0MiIsZGlzYWJsZWQ6IkY1RjVGNSJ9XS5yZWR1Y2UoKGMsZCk9PntjW2QubmFtZV09ZDtyZXR1cm4gY30se30pO2EuT1BfR1JPVVBfQ09MT1JTPVt7Y29sb3I6Ikdvb2dsZSBSZWQiLApncm91cHM6Imdlbl9sZWdhY3lfb3BzIGxlZ2FjeV9vcHMgbGVnYWN5X2Zsb2dzX2lucHV0IGxlZ2FjeV9pbWFnZV9pbnB1dCBsZWdhY3lfaW5wdXRfZXhhbXBsZV9pbnB1dCBsZWdhY3lfc2VxdWVuY2VfaW5wdXQgbGVnYWN5X3NldGlfaW5wdXRfaW5wdXQiLnNwbGl0KCIgIil9LHtjb2xvcjoiRGVlcCBPcmFuZ2UiLGdyb3VwczpbImNvbnN0YW50X29wcyJdfSx7Y29sb3I6IkluZGlnbyIsZ3JvdXBzOlsic3RhdGVfb3BzIl19LHtjb2xvcjoiUHVycGxlIixncm91cHM6WyJubl9vcHMiLCJubiJdfSx7Y29sb3I6Ikdvb2dsZSBHcmVlbiIsZ3JvdXBzOlsibWF0aF9vcHMiXX0se2NvbG9yOiJMaW1lIixncm91cHM6WyJhcnJheV9vcHMiXX0se2NvbG9yOiJUZWFsIixncm91cHM6WyJjb250cm9sX2Zsb3dfb3BzIiwiZGF0YV9mbG93X29wcyJdfSx7Y29sb3I6IlBpbmsiLGdyb3VwczpbInN1bW1hcnlfb3BzIl19LHtjb2xvcjoiRGVlcCBQaW5rIixncm91cHM6WyJpb19vcHMiXX1dLnJlZHVjZSgoYywKZCk9PntkLmdyb3Vwcy5mb3JFYWNoKGZ1bmN0aW9uKGYpe2NbZl09ZC5jb2xvcn0pO3JldHVybiBjfSx7fSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2NvbW1vbi5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXtkLk9QX0dSQVBIPSJvcF9ncmFwaCI7ZC5DT05DRVBUVUFMX0dSQVBIPSJjb25jZXB0dWFsX2dyYXBoIjtkLlBST0ZJTEU9InByb2ZpbGUifSkoYy5TZWxlY3Rpb25UeXBlfHwoYy5TZWxlY3Rpb25UeXBlPXt9KSl9KShhLmdyYXBofHwoYS5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9jb250ZXh0bWVudS5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gZyhsKXtsZXQgaz0wLG49MDtmb3IoO2wmJjA8PWwub2Zmc2V0TGVmdCYmMDw9bC5vZmZzZXRUb3A7KWsrPWwub2Zmc2V0TGVmdC1sLnNjcm9sbExlZnQsbis9bC5vZmZzZXRUb3AtbC5zY3JvbGxUb3AsbD1sLm9mZnNldFBhcmVudDtyZXR1cm57bGVmdDprLHRvcDpufX1mLmdldE1lbnU9ZnVuY3Rpb24obCxrKXtjb25zdCBuPWwuZ2V0Q29udGV4dE1lbnUoKSxwPWQzLnNlbGVjdChsLmdldENvbnRleHRNZW51KCkpO3JldHVybiBmdW5jdGlvbihxLHIpe2Z1bmN0aW9uIHQoeil7eiYmei5jb21wb3NlZFBhdGgoKS5pbmNsdWRlcyhuKXx8KHAuc3R5bGUoImRpc3BsYXkiLCJub25lIiksZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHQse2NhcHR1cmU6ITB9KSl9bGV0IHY9ZDMuZXZlbnQ7Y29uc3QgeT1nKGwpO3Auc3R5bGUoImRpc3BsYXkiLCJibG9jayIpLnN0eWxlKCJsZWZ0IiwKdi5jbGllbnRYLXkubGVmdCsxKyJweCIpLnN0eWxlKCJ0b3AiLHYuY2xpZW50WS15LnRvcCsxKyJweCIpO3YucHJldmVudERlZmF1bHQoKTt2LnN0b3BQcm9wYWdhdGlvbigpO2RvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0LHtjYXB0dXJlOiEwfSk7cC5odG1sKCIiKTtwLmFwcGVuZCgidWwiKS5zZWxlY3RBbGwoImxpIikuZGF0YShrKS5lbnRlcigpLmFwcGVuZCgibGkiKS5vbigiY2xpY2siLHo9Pnt6LmFjdGlvbih0aGlzLHEscik7dCgpfSkuaHRtbChmdW5jdGlvbih6KXtyZXR1cm4gei50aXRsZShxKX0pfX19KShkLmNvbnRleHRtZW51fHwoZC5jb250ZXh0bWVudT17fSkpfSkoYy5zY2VuZXx8KGMuc2NlbmU9e30pKX0pKGEuZ3JhcGh8fChhLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2VkZ2UuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGcoeil7cmV0dXJuIHouditjLkVER0VfS0VZX0RFTElNK3oud31mdW5jdGlvbiBsKHoseCl7eD14LmdldE5vZGVCeU5hbWUoei52KTtpZihudWxsPT14Lm91dHB1dFNoYXBlc3x8Xy5pc0VtcHR5KHgub3V0cHV0U2hhcGVzKSlyZXR1cm4gbnVsbDt6PXgub3V0cHV0U2hhcGVzW3oub3V0cHV0VGVuc29yS2V5XTtyZXR1cm4gbnVsbD09ej9udWxsOjA9PT16Lmxlbmd0aD8ic2NhbGFyIjp6Lm1hcChDPT4tMT09PUM/Ij8iOkMpLmpvaW4oIlx1MDBkNyIpfWZ1bmN0aW9uIGsoeix4KXtyZXR1cm4geC5lZGdlTGFiZWxGdW5jdGlvbj94LmVkZ2VMYWJlbEZ1bmN0aW9uKHoseCk6MTx6LmJhc2VFZGdlTGlzdC5sZW5ndGg/ei5iYXNlRWRnZUxpc3QubGVuZ3RoKyIgdGVuc29ycyI6bCh6LmJhc2VFZGdlTGlzdFswXSx4KX1mdW5jdGlvbiBuKHoseCxDKXtjb25zdCBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhhLmdyYXBoLnNjZW5lLlNWR19OQU1FU1BBQ0UsCiJwYXRoIik7Zm9yKGxldCBEPTE7RDx6Lmxlbmd0aDtEKyspaWYoRi5zZXRBdHRyaWJ1dGUoImQiLEMoei5zbGljZSgwLEQpKSksRi5nZXRUb3RhbExlbmd0aCgpPngpcmV0dXJuIEQtMTtyZXR1cm4gei5sZW5ndGgtMX1mdW5jdGlvbiBwKHoseCxDKXt2YXIgRj1kMy5saW5lKCkueChPPT5PLngpLnkoTz0+Ty55KSxEPWQzLnNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwicGF0aCIpKS5hdHRyKCJkIixGKHopKSxCPSt4LmF0dHIoIm1hcmtlcldpZHRoIiksST14LmF0dHIoInZpZXdCb3giKS5zcGxpdCgiICIpLm1hcChOdW1iZXIpO0k9SVsyXS1JWzBdO3g9K3guYXR0cigicmVmWCIpO0Q9RC5ub2RlKCk7aWYoQylyZXR1cm4gQio9MS14L0ksQz1ELmdldFBvaW50QXRMZW5ndGgoQiksRj1uKHosQixGKSx6W0YtMV09e3g6Qy54LHk6Qy55fSx6LnNsaWNlKEYtMSk7Qz0xLXgvSTtCPUQuZ2V0VG90YWxMZW5ndGgoKS1CKkM7Qz0KRC5nZXRQb2ludEF0TGVuZ3RoKEIpO0Y9bih6LEIsRik7eltGXT17eDpDLngseTpDLnl9O3JldHVybiB6LnNsaWNlKDAsRisxKX1mdW5jdGlvbiBxKHoseCxDLEYpe0Y9Rnx8ZC5DbGFzcy5FZGdlLkxJTkU7eC5sYWJlbCYmeC5sYWJlbC5zdHJ1Y3R1cmFsJiYoRis9IiAiK2QuQ2xhc3MuRWRnZS5TVFJVQ1RVUkFMKTt4LmxhYmVsJiZ4LmxhYmVsLm1ldGFlZGdlJiZ4LmxhYmVsLm1ldGFlZGdlLm51bVJlZkVkZ2VzJiYoRis9IiAiK2QuQ2xhc3MuRWRnZS5SRUZFUkVOQ0VfRURHRSk7Qy5oYW5kbGVFZGdlU2VsZWN0ZWQmJihGKz0iICIrZC5DbGFzcy5FZGdlLlNFTEVDVEFCTEUpO2xldCBEPSJwYXRoXyIrZyh4KTtpZihDLnJlbmRlckhpZXJhcmNoeS5lZGdlV2lkdGhGdW5jdGlvbil2YXIgQj1DLnJlbmRlckhpZXJhcmNoeS5lZGdlV2lkdGhGdW5jdGlvbih4LEYpO2Vsc2UgQj0xLG51bGwhPXgubGFiZWwmJm51bGwhPXgubGFiZWwubWV0YWVkZ2UmJihCPXgubGFiZWwubWV0YWVkZ2UudG90YWxTaXplKSwKQj1DLnJlbmRlckhpZXJhcmNoeS5lZGdlV2lkdGhTaXplZEJhc2VkU2NhbGUoQik7Rj16LmFwcGVuZCgicGF0aCIpLmF0dHIoImlkIixEKS5hdHRyKCJjbGFzcyIsRikuc3R5bGUoInN0cm9rZS13aWR0aCIsQisicHgiKTt4LmxhYmVsJiZ4LmxhYmVsLm1ldGFlZGdlJiYoeC5sYWJlbC5tZXRhZWRnZS5udW1SZWZFZGdlcz8oQj1gcmVmZXJlbmNlLWFycm93aGVhZC0ke3koQil9YCxGLnN0eWxlKCJtYXJrZXItc3RhcnQiLGB1cmwoIyR7Qn0pYCkseC5sYWJlbC5zdGFydE1hcmtlcklkPUIpOihCPWBkYXRhZmxvdy1hcnJvd2hlYWQtJHt5KEIpfWAsRi5zdHlsZSgibWFya2VyLWVuZCIsYHVybCgjJHtCfSlgKSx4LmxhYmVsLmVuZE1hcmtlcklkPUIpKTtudWxsIT14LmxhYmVsJiZudWxsIT14LmxhYmVsLm1ldGFlZGdlJiYoeD1rKHgubGFiZWwubWV0YWVkZ2UsQy5yZW5kZXJIaWVyYXJjaHkpLG51bGwhPXgmJnouYXBwZW5kKCJ0ZXh0IikuYXBwZW5kKCJ0ZXh0UGF0aCIpLmF0dHIoInhsaW5rOmhyZWYiLAoiIyIrRCkuYXR0cigic3RhcnRPZmZzZXQiLCI1MCUiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLmF0dHIoImRvbWluYW50LWJhc2VsaW5lIiwiY2VudHJhbCIpLnRleHQoeCkpfWZ1bmN0aW9uIHIoeix4LEMsRixEKXtGPUMubGFiZWw7bGV0IEI9Ri5hZGpvaW5pbmdNZXRhZWRnZSxJPUYucG9pbnRzOyh7c2hhZG93Um9vdDp6fT16KTtDLmxhYmVsLnN0YXJ0TWFya2VySWQmJihJPXAoSSxkMy5zZWxlY3Qoei5xdWVyeVNlbGVjdG9yKCIjIitDLmxhYmVsLnN0YXJ0TWFya2VySWQpKSwhMCkpO0MubGFiZWwuZW5kTWFya2VySWQmJihJPXAoSSxkMy5zZWxlY3Qoei5xdWVyeVNlbGVjdG9yKCIjIitDLmxhYmVsLmVuZE1hcmtlcklkKSksITEpKTtpZighQilyZXR1cm4gZDMuaW50ZXJwb2xhdGUoRCxmLmludGVycG9sYXRlKEkpKTtsZXQgTz1CLmVkZ2VHcm91cC5ub2RlKCkuZmlyc3RDaGlsZCxQPUYubWV0YWVkZ2UuaW5ib3VuZDtyZXR1cm4gZnVuY3Rpb24oKXtsZXQgSD1PLmdldFBvaW50QXRMZW5ndGgoUD8KTy5nZXRUb3RhbExlbmd0aCgpOjApLm1hdHJpeFRyYW5zZm9ybShPLmdldENUTSgpKS5tYXRyaXhUcmFuc2Zvcm0oeC5nZXRDVE0oKS5pbnZlcnNlKCkpLEs9UD8wOkkubGVuZ3RoLTE7SVtLXS54PUgueDtJW0tdLnk9SC55O3JldHVybiBmLmludGVycG9sYXRlKEkpfX1mdW5jdGlvbiB0KHoseCl7ZDMuc2VsZWN0KHgpLnNlbGVjdCgicGF0aC4iK2QuQ2xhc3MuRWRnZS5MSU5FKS50cmFuc2l0aW9uKCkuYXR0clR3ZWVuKCJkIixmdW5jdGlvbihDLEYsRCl7cmV0dXJuIHIoeix0aGlzLEMsRixEKX0pfWZ1bmN0aW9uIHYoeix4KXt6LmNsYXNzZWQoImZhZGVkIix4LmxhYmVsLmlzRmFkZWRPdXQpO3g9eC5sYWJlbC5tZXRhZWRnZTt6LnNlbGVjdCgicGF0aC4iK2QuQ2xhc3MuRWRnZS5MSU5FKS5jbGFzc2VkKCJjb250cm9sLWRlcCIseCYmIXgubnVtUmVndWxhckVkZ2VzKX1mLk1JTl9FREdFX1dJRFRIPS43NTtmLk1BWF9FREdFX1dJRFRIPTEyO2YuRURHRV9XSURUSF9TSVpFX0JBU0VEX1NDQUxFPQpkMy5zY2FsZVBvdygpLmV4cG9uZW50KC4zKS5kb21haW4oWzEsNUU2XSkucmFuZ2UoW2YuTUlOX0VER0VfV0lEVEgsZi5NQVhfRURHRV9XSURUSF0pLmNsYW1wKCEwKTtsZXQgeT1kMy5zY2FsZVF1YW50aXplKCkuZG9tYWluKFtmLk1JTl9FREdFX1dJRFRILGYuTUFYX0VER0VfV0lEVEhdKS5yYW5nZShbInNtYWxsIiwibWVkaXVtIiwibGFyZ2UiLCJ4bGFyZ2UiXSk7Zi5nZXRFZGdlS2V5PWc7Zi5idWlsZEdyb3VwPWZ1bmN0aW9uKHoseCxDKXtsZXQgRj1bXTtGPV8ucmVkdWNlKHguZWRnZXMoKSwoRCxCKT0+e2xldCBJPXguZWRnZShCKTtELnB1c2goe3Y6Qi52LHc6Qi53LGxhYmVsOkl9KTtyZXR1cm4gRH0sRik7ej1kLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoeiwiZyIsZC5DbGFzcy5FZGdlLkNPTlRBSU5FUikuc2VsZWN0QWxsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlc30pLmRhdGEoRixnKTt6LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLGQuQ2xhc3MuRWRnZS5HUk9VUCkuYXR0cigiZGF0YS1lZGdlIiwKZykuZWFjaChmdW5jdGlvbihEKXtsZXQgQj1kMy5zZWxlY3QodGhpcyk7RC5sYWJlbC5lZGdlR3JvdXA9QjtDLl9lZGdlR3JvdXBJbmRleFtnKEQpXT1CO2lmKEMuaGFuZGxlRWRnZVNlbGVjdGVkKUIub24oImNsaWNrIixJPT57ZDMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Qy5maXJlKCJlZGdlLXNlbGVjdCIse2VkZ2VEYXRhOkksZWRnZUdyb3VwOkJ9KX0pO3EoQixELEMpfSkubWVyZ2UoeikuZWFjaChmdW5jdGlvbigpe3QoQyx0aGlzKX0pLmVhY2goZnVuY3Rpb24oRCl7dihkMy5zZWxlY3QodGhpcyksRCxDKX0pO3ouZXhpdCgpLmVhY2goRD0+e2RlbGV0ZSBDLl9lZGdlR3JvdXBJbmRleFtnKEQpXX0pLnJlbW92ZSgpO3JldHVybiB6fTtmLmdldExhYmVsRm9yQmFzZUVkZ2U9bDtmLmdldExhYmVsRm9yRWRnZT1rO2YuYXBwZW5kRWRnZT1xO2YuaW50ZXJwb2xhdGU9ZDMubGluZSgpLmN1cnZlKGQzLmN1cnZlQmFzaXMpLngoej0+ei54KS55KHo9PnoueSl9KShkLmVkZ2V8fChkLmVkZ2U9Cnt9KSl9KShjLnNjZW5lfHwoYy5zY2VuZT17fSkpfSkoYS5ncmFwaHx8KGEuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vZXh0ZXJucy5qcwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9ncmFwaC5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGQoSCxLLE0sTCxSKXtyZXR1cm4oTT9NKyIvIjoiIikrKEgrKCJ1bmRlZmluZWQiIT09dHlwZW9mIEwmJiJ1bmRlZmluZWQiIT09dHlwZW9mIFI/IlsiK0wrIi0iK1IrIl0iOiIjIikrSyl9ZnVuY3Rpb24gZihIKXtpZighSClyZXR1cm4gbnVsbDtmb3IobGV0IEs9MDtLPEgubGVuZ3RoO0srKyl7bGV0IHtrZXk6TSx2YWx1ZTpMfT1IW0tdO2lmKCJfb3V0cHV0X3NoYXBlcyI9PT1NKXtpZighTC5saXN0LnNoYXBlKWJyZWFrO2xldCBSPUwubGlzdC5zaGFwZS5tYXAoVT0+VS51bmtub3duX3Jhbms/bnVsbDpudWxsPT1VLmRpbXx8MT09PVUuZGltLmxlbmd0aCYmbnVsbD09VS5kaW1bMF0uc2l6ZT9bXTpVLmRpbS5tYXAoWT0+WS5zaXplKSk7SC5zcGxpY2UoSywxKTtyZXR1cm4gUn19cmV0dXJuIG51bGx9ZnVuY3Rpb24gZyhIKXtpZighSClyZXR1cm4gbnVsbDtmb3IobGV0IEs9MDtLPEgubGVuZ3RoO0srKylpZigiX1hsYUNsdXN0ZXIiPT09CkhbS10ua2V5KXJldHVybiBIW0tdLnZhbHVlLnN8fG51bGw7cmV0dXJuIG51bGx9ZnVuY3Rpb24gbChIKXtsZXQgSz1bXTtfLmVhY2goSCxNPT57bGV0IEw9Il4iPT09TVswXTtMJiYoTT1NLnN1YnN0cmluZygxKSk7bGV0IFI9TSxVPSIwIixZPU0ubWF0Y2goLyguKik6KFx3KzpcZCspJC8pO2lmKFkpUj1ZWzFdLFU9WVsyXTtlbHNlIGlmKFk9TS5tYXRjaCgvKC4qKTooXGQrKSQvKSlSPVlbMV0sVT1ZWzJdOzAhPT1LLmxlbmd0aCYmUj09PUtbSy5sZW5ndGgtMV0ubmFtZXx8Sy5wdXNoKHtuYW1lOlIsb3V0cHV0VGVuc29yS2V5OlUsaXNDb250cm9sRGVwZW5kZW5jeTpMfSl9KTtyZXR1cm4gS31mdW5jdGlvbiBrKEgsSyxNLEwsUixVKXtLIT09TS5uYW1lJiZILmVkZ2VzLnB1c2goe3Y6Syx3Ok0ubmFtZSxvdXRwdXRUZW5zb3JLZXk6TC5vdXRwdXRUZW5zb3JLZXksaXNDb250cm9sRGVwZW5kZW5jeTpMLmlzQ29udHJvbERlcGVuZGVuY3ksaXNSZWZlcmVuY2VFZGdlOiEwPT09Ui5yZWZFZGdlc1tNLm9wKwoiICIrVV19KX1mdW5jdGlvbiBuKEgsSyxNKXtNPU18fHt9O2xldCBMPW5ldyBncmFwaGxpYi5HcmFwaChNKTtMLnNldEdyYXBoKHtuYW1lOkgscmFua2RpcjpNLnJhbmtkaXJ8fCJCVCIsdHlwZTpLfSk7cmV0dXJuIEx9ZnVuY3Rpb24gcChIKXtyZXR1cm4gZnVuY3Rpb24oSyl7Zm9yKGxldCBNPTA7TTxILmxlbmd0aDtNKyspe2xldCBMPW5ldyBSZWdFeHAoSFtNXSk7aWYoInN0cmluZyI9PT10eXBlb2YgSy5vcCYmSy5vcC5tYXRjaChMKSlyZXR1cm4hMH1yZXR1cm4hMX19ZnVuY3Rpb24gcShIKXtsZXQgSz1ILnNwbGl0KGMuTkFNRVNQQUNFX0RFTElNKTtyZXR1cm4gSCtjLk5BTUVTUEFDRV9ERUxJTSsiKCIrS1tLLmxlbmd0aC0xXSsiKSJ9ZnVuY3Rpb24gcihILEspe2xldCBNPXt9LEw9e307SC5zb3J0KCk7Zm9yKGxldCBSPTA7UjxILmxlbmd0aC0xOysrUil7bGV0IFU9SFtSXTtfLmVhY2godihVKS5zbGljZSgwLC0xKSxZPT57TFtZXT0hMH0pO2ZvcihsZXQgWT1SKzE7WTxILmxlbmd0aDsrK1kpe2xldCBiYT0KSFtZXTtpZihfLnN0YXJ0c1dpdGgoYmEsVSkpe2lmKGJhLmxlbmd0aD5VLmxlbmd0aCYmYmEuY2hhckF0KFUubGVuZ3RoKT09PWMuTkFNRVNQQUNFX0RFTElNKXtNW1VdPXEoVSk7YnJlYWt9fWVsc2UgYnJlYWt9fV8uZWFjaChLLFI9PntSIGluIEwmJihNW1JdPXEoUikpfSk7cmV0dXJuIE19ZnVuY3Rpb24gdChIKXtsZXQgSz1ILm5vZGVzKCkubWFwKGZ1bmN0aW9uKE0pe3JldHVybiBILm5laWdoYm9ycyhNKS5sZW5ndGh9KTtLLnNvcnQoKTtyZXR1cm4gS31mdW5jdGlvbiB2KEgsSyl7bGV0IE09W10sTD1ILmluZGV4T2YoYy5OQU1FU1BBQ0VfREVMSU0pO2Zvcig7MDw9TDspTS5wdXNoKEguc3Vic3RyaW5nKDAsTCkpLEw9SC5pbmRleE9mKGMuTkFNRVNQQUNFX0RFTElNLEwrMSk7SyYmKEs9S1tIXSkmJk0ucHVzaChLKTtNLnB1c2goSCk7cmV0dXJuIE19Yy5OQU1FU1BBQ0VfREVMSU09Ii8iO2MuUk9PVF9OQU1FPSJfX3Jvb3RfXyI7Yy5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYPQoiX19mdW5jdGlvbl9saWJyYXJ5X18iO2MuTEFSR0VfQVRUUlNfS0VZPSJfdG9vX2xhcmdlX2F0dHJzIjtjLkxJTUlUX0FUVFJfU0laRT0xMDI0O2MuRURHRV9LRVlfREVMSU09Ii0tIjtsZXQgeTsoZnVuY3Rpb24oSCl7SFtILkZVTEw9MF09IkZVTEwiO0hbSC5FTUJFRERFRD0xXT0iRU1CRURERUQiO0hbSC5NRVRBPTJdPSJNRVRBIjtIW0guU0VSSUVTPTNdPSJTRVJJRVMiO0hbSC5DT1JFPTRdPSJDT1JFIjtIW0guU0hBRE9XPTVdPSJTSEFET1ciO0hbSC5CUklER0U9Nl09IkJSSURHRSI7SFtILkVER0U9N109IkVER0UifSkoeT1jLkdyYXBoVHlwZXx8KGMuR3JhcGhUeXBlPXt9KSk7bGV0IHo7KGZ1bmN0aW9uKEgpe0hbSC5NRVRBPTBdPSJNRVRBIjtIW0guT1A9MV09Ik9QIjtIW0guU0VSSUVTPTJdPSJTRVJJRVMiO0hbSC5CUklER0U9M109IkJSSURHRSI7SFtILkVMTElQU0lTPTRdPSJFTExJUFNJUyJ9KSh6PWMuTm9kZVR5cGV8fChjLk5vZGVUeXBlPXt9KSk7bGV0IHg7KGZ1bmN0aW9uKEgpe0hbSC5JTkNMVURFPQowXT0iSU5DTFVERSI7SFtILkVYQ0xVREU9MV09IkVYQ0xVREUiO0hbSC5VTlNQRUNJRklFRD0yXT0iVU5TUEVDSUZJRUQifSkoeD1jLkluY2x1c2lvblR5cGV8fChjLkluY2x1c2lvblR5cGU9e30pKTsoZnVuY3Rpb24oSCl7SFtILkdST1VQPTBdPSJHUk9VUCI7SFtILlVOR1JPVVA9MV09IlVOR1JPVVAifSkoYy5TZXJpZXNHcm91cGluZ1R5cGV8fChjLlNlcmllc0dyb3VwaW5nVHlwZT17fSkpO2NsYXNzIEN7Y29uc3RydWN0b3IoKXt0aGlzLm5vZGVzPXt9O3RoaXMuZWRnZXM9W119fWMuU2xpbUdyYXBoPUM7Y2xhc3MgRntjb25zdHJ1Y3RvcihIKXt0aGlzLnR5cGU9ei5FTExJUFNJUzt0aGlzLmlzR3JvdXBOb2RlPSExO3RoaXMuY2FyZGluYWxpdHk9MTt0aGlzLnN0YXRzPXRoaXMucGFyZW50Tm9kZT1udWxsO3RoaXMuc2V0TnVtTW9yZU5vZGVzKEgpO3RoaXMuaW5jbHVkZT14LlVOU1BFQ0lGSUVEfXNldE51bU1vcmVOb2RlcyhIKXt0aGlzLm51bU1vcmVOb2Rlcz1IO3RoaXMubmFtZT0KIi4uLiAiK0grIiBtb3JlIn19Yy5FbGxpcHNpc05vZGVJbXBsPUY7Y2xhc3MgRHtjb25zdHJ1Y3RvcihIKXt0aGlzLm9wPUgub3A7dGhpcy5uYW1lPUgubmFtZTt0aGlzLmRldmljZT1ILmRldmljZTt0aGlzLmF0dHI9SC5hdHRyO3RoaXMuaW5wdXRzPWwoSC5pbnB1dCk7dGhpcy5vdXRwdXRTaGFwZXM9ZihILmF0dHIpO3RoaXMueGxhQ2x1c3Rlcj1nKEguYXR0cik7dGhpcy5jb21wYXRpYmxlPSExO3RoaXMudHlwZT16Lk9QO3RoaXMuaXNHcm91cE5vZGU9ITE7dGhpcy5jYXJkaW5hbGl0eT0xO3RoaXMuaW5FbWJlZGRpbmdzPVtdO3RoaXMub3V0RW1iZWRkaW5ncz1bXTt0aGlzLnBhcmVudE5vZGU9bnVsbDt0aGlzLmluY2x1ZGU9eC5VTlNQRUNJRklFRDt0aGlzLm93bmluZ1Nlcmllcz1udWxsfX1jLk9wTm9kZUltcGw9RDtjLmNyZWF0ZU1ldGFub2RlPWZ1bmN0aW9uKEgsSz17fSl7cmV0dXJuIG5ldyBJKEgsSyl9O2Muam9pblN0YXRzSW5mb1dpdGhHcmFwaD1mdW5jdGlvbihILEssCk0pe18uZWFjaChILm5vZGVzLEw9PntMLnN0YXRzPW51bGx9KTtfLmVhY2goSy5kZXZfc3RhdHMsTD0+e00mJiFNW0wuZGV2aWNlXXx8Xy5lYWNoKEwubm9kZV9zdGF0cyxSPT57bGV0IFU9Ui5ub2RlX25hbWUgaW4gSC5ub2Rlcz9SLm5vZGVfbmFtZTpxKFIubm9kZV9uYW1lKTtpZihVIGluIEgubm9kZXMpe3ZhciBZPTA7Ui5tZW1vcnkmJl8uZWFjaChSLm1lbW9yeSxtYT0+e21hLnRvdGFsX2J5dGVzJiYoMDxtYS50b3RhbF9ieXRlcz9ZKz1OdW1iZXIobWEudG90YWxfYnl0ZXMpOmNvbnNvbGUubG9nKCJpZ25vcmluZyBuZWdhdGl2ZSBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgIitVKSl9KTt2YXIgYmE9bnVsbDtSLm91dHB1dCYmKGJhPV8ubWFwKFIub3V0cHV0LG1hPT5fLm1hcChtYS50ZW5zb3JfZGVzY3JpcHRpb24uc2hhcGUuZGltLGFhPT5OdW1iZXIoYWEuc2l6ZSkpKSk7SC5ub2Rlc1tVXS5kZXZpY2U9TC5kZXZpY2U7bnVsbD09SC5ub2Rlc1tVXS5zdGF0cyYmKEgubm9kZXNbVV0uc3RhdHM9Cm5ldyBCKGJhKSk7SC5ub2Rlc1tVXS5zdGF0cy5hZGRCeXRlc0FsbG9jYXRpb24oWSk7Ui5hbGxfZW5kX3JlbF9taWNyb3MmJigwPFIuYWxsX2VuZF9yZWxfbWljcm9zP0gubm9kZXNbVV0uc3RhdHMuYWRkRXhlY3V0aW9uVGltZShSLmFsbF9zdGFydF9taWNyb3MsUi5hbGxfc3RhcnRfbWljcm9zK1IuYWxsX2VuZF9yZWxfbWljcm9zKTpjb25zb2xlLmxvZygiaWdub3JpbmcgbmVnYXRpdmUgcnVudGltZSBmb3IgIitVKSl9fSl9KX07Y2xhc3MgQntjb25zdHJ1Y3RvcihIKXt0aGlzLnRvdGFsQnl0ZXM9MDt0aGlzLm91dHB1dFNpemU9SH1hZGRFeGVjdXRpb25UaW1lKEgsSyl7dGhpcy5zdGFydFRpbWU9bnVsbCE9dGhpcy5zdGFydFRpbWU/TWF0aC5taW4odGhpcy5zdGFydFRpbWUsSCk6SDt0aGlzLmVuZFRpbWU9bnVsbCE9dGhpcy5lbmRUaW1lP01hdGgubWF4KHRoaXMuZW5kVGltZSxLKTpLfWFkZEJ5dGVzQWxsb2NhdGlvbihIKXt0aGlzLnRvdGFsQnl0ZXM9bnVsbCE9dGhpcy50b3RhbEJ5dGVzPwpNYXRoLm1heCh0aGlzLnRvdGFsQnl0ZXMsSCk6SH1jb21iaW5lKEgpe251bGwhPUgudG90YWxCeXRlcyYmKHRoaXMudG90YWxCeXRlcys9SC50b3RhbEJ5dGVzKTtudWxsIT1ILmdldFRvdGFsTWljcm9zKCkmJnRoaXMuYWRkRXhlY3V0aW9uVGltZShILnN0YXJ0VGltZSxILmVuZFRpbWUpfWdldFRvdGFsTWljcm9zKCl7cmV0dXJuIG51bGw9PXRoaXMuc3RhcnRUaW1lfHxudWxsPT10aGlzLmVuZFRpbWU/bnVsbDp0aGlzLmVuZFRpbWUtdGhpcy5zdGFydFRpbWV9fWMuTm9kZVN0YXRzPUI7Y2xhc3MgSXtjb25zdHJ1Y3RvcihILEs9e30pe3RoaXMubmFtZT1IO3RoaXMudHlwZT16Lk1FVEE7dGhpcy5kZXB0aD0xO3RoaXMuaXNHcm91cE5vZGU9ITA7dGhpcy5jYXJkaW5hbGl0eT0wO3RoaXMubWV0YWdyYXBoPW4oSCx5Lk1FVEEsSyk7dGhpcy5icmlkZ2VncmFwaD1udWxsO3RoaXMub3BIaXN0b2dyYW09e307dGhpcy5kZXZpY2VIaXN0b2dyYW09e307dGhpcy54bGFDbHVzdGVySGlzdG9ncmFtPQp7fTt0aGlzLmNvbXBhdGliaWxpdHlIaXN0b2dyYW09e2NvbXBhdGlibGU6MCxpbmNvbXBhdGlibGU6MH07dGhpcy5wYXJlbnROb2RlPXRoaXMudGVtcGxhdGVJZD1udWxsO3RoaXMuaGFzTm9uQ29udHJvbEVkZ2VzPSExO3RoaXMuaW5jbHVkZT14LlVOU1BFQ0lGSUVEO3RoaXMuYXNzb2NpYXRlZEZ1bmN0aW9uPSIifWdldEZpcnN0Q2hpbGQoKXtyZXR1cm4gdGhpcy5tZXRhZ3JhcGgubm9kZSh0aGlzLm1ldGFncmFwaC5ub2RlcygpWzBdKX1nZXRSb290T3AoKXtsZXQgSD10aGlzLm5hbWUuc3BsaXQoIi8iKTtyZXR1cm4gdGhpcy5tZXRhZ3JhcGgubm9kZSh0aGlzLm5hbWUrIi8oIitIW0gubGVuZ3RoLTFdKyIpIil9bGVhdmVzKCl7bGV0IEg9W10sSz1bdGhpc10sTTtmb3IoO0subGVuZ3RoOyl7bGV0IEw9Sy5zaGlmdCgpO0wuaXNHcm91cE5vZGU/KE09TC5tZXRhZ3JhcGgsXy5lYWNoKE0ubm9kZXMoKSxSPT5LLnB1c2goTS5ub2RlKFIpKSkpOkgucHVzaChMLm5hbWUpfXJldHVybiBIfX0KYy5NZXRhbm9kZUltcGw9STtjLmNyZWF0ZU1ldGFlZGdlPWZ1bmN0aW9uKEgsSyl7cmV0dXJuIG5ldyBPKEgsSyl9O2NsYXNzIE97Y29uc3RydWN0b3IoSCxLKXt0aGlzLnY9SDt0aGlzLnc9Szt0aGlzLmJhc2VFZGdlTGlzdD1bXTt0aGlzLmluYm91bmQ9bnVsbDt0aGlzLnRvdGFsU2l6ZT10aGlzLm51bVJlZkVkZ2VzPXRoaXMubnVtQ29udHJvbEVkZ2VzPXRoaXMubnVtUmVndWxhckVkZ2VzPTB9YWRkQmFzZUVkZ2UoSCxLKXt0aGlzLmJhc2VFZGdlTGlzdC5wdXNoKEgpO0guaXNDb250cm9sRGVwZW5kZW5jeT90aGlzLm51bUNvbnRyb2xFZGdlcys9MTp0aGlzLm51bVJlZ3VsYXJFZGdlcys9MTtILmlzUmVmZXJlbmNlRWRnZSYmKHRoaXMubnVtUmVmRWRnZXMrPTEpO3RoaXMudG90YWxTaXplKz1PLmNvbXB1dGVTaXplT2ZFZGdlKEgsSyk7Sy5tYXhNZXRhRWRnZVNpemU9TWF0aC5tYXgoSy5tYXhNZXRhRWRnZVNpemUsdGhpcy50b3RhbFNpemUpfXN0YXRpYyBjb21wdXRlU2l6ZU9mRWRnZShILApLKXtsZXQgTT1LLm5vZGUoSC52KTtpZighTS5vdXRwdXRTaGFwZXMpcmV0dXJuIDE7Sy5oYXNTaGFwZUluZm89ITA7SD1PYmplY3Qua2V5cyhNLm91dHB1dFNoYXBlcykubWFwKEw9Pk0ub3V0cHV0U2hhcGVzW0xdKS5tYXAoTD0+bnVsbD09TD8xOkwucmVkdWNlKChSLFUpPT57LTE9PT1VJiYoVT0xKTtyZXR1cm4gUipVfSwxKSk7cmV0dXJuIF8uc3VtKEgpfX1jLk1ldGFlZGdlSW1wbD1PO2MuY3JlYXRlU2VyaWVzTm9kZT1mdW5jdGlvbihILEssTSxMLFIsVSl7cmV0dXJuIG5ldyBQKEgsSyxNLEwsUixVKX07Yy5nZXRTZXJpZXNOb2RlTmFtZT1kO2NsYXNzIFB7Y29uc3RydWN0b3IoSCxLLE0sTCxSLFUpe3RoaXMubmFtZT1SfHxkKEgsSyxNKTt0aGlzLnR5cGU9ei5TRVJJRVM7dGhpcy5oYXNMb29wPSExO3RoaXMucHJlZml4PUg7dGhpcy5zdWZmaXg9Szt0aGlzLmNsdXN0ZXJJZD1MO3RoaXMuaWRzPVtdO3RoaXMucGFyZW50PU07dGhpcy5pc0dyb3VwTm9kZT0hMDt0aGlzLmNhcmRpbmFsaXR5PQowO3RoaXMubWV0YWdyYXBoPW4oUix5LlNFUklFUyxVKTt0aGlzLnBhcmVudE5vZGU9dGhpcy5icmlkZ2VncmFwaD1udWxsO3RoaXMuZGV2aWNlSGlzdG9ncmFtPXt9O3RoaXMueGxhQ2x1c3Rlckhpc3RvZ3JhbT17fTt0aGlzLmNvbXBhdGliaWxpdHlIaXN0b2dyYW09e2NvbXBhdGlibGU6MCxpbmNvbXBhdGlibGU6MH07dGhpcy5oYXNOb25Db250cm9sRWRnZXM9ITE7dGhpcy5pbmNsdWRlPXguVU5TUEVDSUZJRUR9fWMuRGVmYXVsdEJ1aWxkUGFyYW1zPXtlbmFibGVFbWJlZGRpbmc6ITAsaW5FbWJlZGRpbmdUeXBlczpbIkNvbnN0Il0sb3V0RW1iZWRkaW5nVHlwZXM6WyJeW2EtekEtWl0rU3VtbWFyeSQiXSxyZWZFZGdlczp7IkFzc2lnbiAwIjohMCwiQXNzaWduQWRkIDAiOiEwLCJBc3NpZ25TdWIgMCI6ITAsImFzc2lnbiAwIjohMCwiYXNzaWduX2FkZCAwIjohMCwiYXNzaWduX3N1YiAwIjohMCwiY291bnRfdXBfdG8gMCI6ITAsIlNjYXR0ZXJBZGQgMCI6ITAsIlNjYXR0ZXJTdWIgMCI6ITAsCiJTY2F0dGVyVXBkYXRlIDAiOiEwLCJzY2F0dGVyX2FkZCAwIjohMCwic2NhdHRlcl9zdWIgMCI6ITAsInNjYXR0ZXJfdXBkYXRlIDAiOiEwfX07Yy5idWlsZD1mdW5jdGlvbihILEssTSl7bGV0IEw9e30sUj17fSxVPXt9LFk9cChLLmluRW1iZWRkaW5nVHlwZXMpLGJhPXAoSy5vdXRFbWJlZGRpbmdUeXBlcyksbWE9W10sYWE9SC5ub2RlLGNhPUFycmF5KGFhLmxlbmd0aCk7cmV0dXJuIGEuZ3JhcGgudXRpbC5ydW5Bc3luY1Rhc2soIk5vcm1hbGl6aW5nIG5hbWVzIiwzMCwoKT0+e2xldCBmYT1BcnJheShhYS5sZW5ndGgpLGRhPTA7Y29uc3QgbGE9RmE9PntsZXQgeGE9bmV3IEQoRmEpO2lmKFkoeGEpKXJldHVybiBtYS5wdXNoKHhhLm5hbWUpLExbeGEubmFtZV09eGE7aWYoYmEoeGEpKXJldHVybiBtYS5wdXNoKHhhLm5hbWUpLFJbeGEubmFtZV09eGEsXy5lYWNoKHhhLmlucHV0cyx5YT0+e3lhPXlhLm5hbWU7VVt5YV09VVt5YV18fFtdO1VbeWFdLnB1c2goeGEpfSkseGE7ZmFbZGFdPQp4YTtjYVtkYV09eGEubmFtZTtkYSsrO3JldHVybiB4YX07Xy5lYWNoKGFhLGxhKTtjb25zdCBaPUZhPT57Y29uc3QgeGE9Yy5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYK0ZhLnNpZ25hdHVyZS5uYW1lO2xhKHtuYW1lOnhhLGlucHV0OltdLGRldmljZToiIixvcDoiIixhdHRyOltdfSk7aWYoRmEuc2lnbmF0dXJlLmlucHV0X2FyZyl7bGV0IHphPTA7dmFyIHlhPVVhPT57bGEoe25hbWU6eGErYy5OQU1FU1BBQ0VfREVMSU0rVWEubmFtZSxpbnB1dDpbXSxkZXZpY2U6IiIsb3A6ImlucHV0X2FyZyIsYXR0cjpbe2tleToiVCIsdmFsdWU6e3R5cGU6VWEudHlwZX19XX0pLmZ1bmN0aW9uSW5wdXRJbmRleD16YTt6YSsrfTtGYS5zaWduYXR1cmUuaW5wdXRfYXJnLm5hbWU/eWEoRmEuc2lnbmF0dXJlLmlucHV0X2FyZyk6Xy5lYWNoKEZhLnNpZ25hdHVyZS5pbnB1dF9hcmcseWEpfWxldCBCYT0wO2NvbnN0IEdhPXt9O0ZhLnNpZ25hdHVyZS5vdXRwdXRfYXJnJiYoeWE9emE9PntHYVt4YSsKYy5OQU1FU1BBQ0VfREVMSU0remEubmFtZV09QmE7QmErK30sRmEuc2lnbmF0dXJlLm91dHB1dF9hcmcubmFtZT95YShGYS5zaWduYXR1cmUub3V0cHV0X2FyZyk6Xy5lYWNoKEZhLnNpZ25hdHVyZS5vdXRwdXRfYXJnLHlhKSk7Xy5lYWNoKEZhLm5vZGVfZGVmLHphPT57emEubmFtZT14YSsiLyIremEubmFtZTsic3RyaW5nIj09PXR5cGVvZiB6YS5pbnB1dCYmKHphLmlucHV0PVt6YS5pbnB1dF0pO2NvbnN0IFVhPWxhKHphKTtfLmlzTnVtYmVyKEdhW3phLm5hbWVdKSYmKFVhLmZ1bmN0aW9uT3V0cHV0SW5kZXg9R2FbemEubmFtZV0pO18uZWFjaChVYS5pbnB1dHMsWmE9PntaYS5uYW1lPXhhK2MuTkFNRVNQQUNFX0RFTElNK1phLm5hbWV9KX0pfTtILmxpYnJhcnkmJkgubGlicmFyeS5mdW5jdGlvbiYmXy5lYWNoKEgubGlicmFyeS5mdW5jdGlvbixaKTtmYS5zcGxpY2UoZGEpO2NhLnNwbGljZShkYSk7cmV0dXJuIGZhfSxNKS50aGVuKGZhPT5hLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJCdWlsZGluZyB0aGUgZGF0YSBzdHJ1Y3R1cmUiLAo3MCwoKT0+e2xldCBkYT1yKGNhLG1hKSxsYT1uZXcgQztfLmVhY2goZmEsWj0+e2xldCBGYT1kYVtaLm5hbWVdfHxaLm5hbWU7bGEubm9kZXNbRmFdPVo7Wi5uYW1lIGluIFUmJihaLm91dEVtYmVkZGluZ3M9VVtaLm5hbWVdLF8uZWFjaChaLm91dEVtYmVkZGluZ3MseGE9Pnt4YS5uYW1lPWRhW3hhLm5hbWVdfHx4YS5uYW1lfSkpO1oubmFtZT1GYX0pO18uZWFjaChmYSxaPT57Xy5lYWNoKFouaW5wdXRzLChGYSx4YSk9PntsZXQgeWE9RmEubmFtZTtpZih5YSBpbiBMKXtGYT1MW3lhXTtaLmluRW1iZWRkaW5ncy5wdXNoKEZhKTtmb3IodmFyIEJhIG9mIEZhLmlucHV0cylrKGxhLGRhW0JhLm5hbWVdfHxCYS5uYW1lLFosQmEsSyx4YSl9ZWxzZSBpZih5YSBpbiBSKXtCYT1SW3lhXTtmb3IobGV0IEdhIG9mIEJhLmlucHV0cylrKGxhLGRhW0dhLm5hbWVdfHxHYS5uYW1lLFosRmEsSyx4YSl9ZWxzZSBrKGxhLGRhW3lhXXx8eWEsWixGYSxLLHhhKX0pfSk7Xy5lYWNoKEwsWj0+e1oubmFtZT0KZGFbWi5uYW1lXXx8Wi5uYW1lfSk7cmV0dXJuIGxhfSxNKSl9O2MuY3JlYXRlR3JhcGg9bjtjLmdldFN0cmljdE5hbWU9cTtjLmhhc1NpbWlsYXJEZWdyZWVTZXF1ZW5jZT1mdW5jdGlvbihILEspe0g9dChIKTtLPXQoSyk7Zm9yKGxldCBNPTA7TTxILmxlbmd0aDtNKyspaWYoSFtNXSE9PUtbTV0pcmV0dXJuITE7cmV0dXJuITB9O2MuZ2V0SGllcmFyY2hpY2FsUGF0aD12O2MuZ2V0SW5jbHVkZU5vZGVCdXR0b25TdHJpbmc9ZnVuY3Rpb24oSCl7cmV0dXJuIEg9PT1hLmdyYXBoLkluY2x1c2lvblR5cGUuRVhDTFVERT8iQWRkIHRvIG1haW4gZ3JhcGgiOiJSZW1vdmUgZnJvbSBtYWluIGdyYXBoIn07Yy5nZXRHcm91cFNlcmllc05vZGVCdXR0b25TdHJpbmc9ZnVuY3Rpb24oSCl7cmV0dXJuIEg9PT1hLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5HUk9VUD8iVW5ncm91cCB0aGlzIHNlcmllcyBvZiBub2RlcyI6Ikdyb3VwIHRoaXMgc2VyaWVzIG9mIG5vZGVzIn07Yy50b2dnbGVOb2RlU2VyaWVzR3JvdXA9CmZ1bmN0aW9uKEgsSyl7SFtLXT1LIGluIEgmJkhbS10hPT1hLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5HUk9VUD9hLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5HUk9VUDphLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5VTkdST1VQfX0pKGEuZ3JhcGh8fChhLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2hpZXJhcmNoeS5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXtmdW5jdGlvbiBmKHYseSx6LHgpe3k9ej92LmluRWRnZXMoeS5uYW1lKTp2Lm91dEVkZ2VzKHkubmFtZSk7Xy5lYWNoKHksQz0+e0M9di5lZGdlKEMpOyhDLm51bVJlZ3VsYXJFZGdlcz94LnJlZ3VsYXI6eC5jb250cm9sKS5wdXNoKEMpfSl9ZnVuY3Rpb24gZyh2LHkpe2NvbnN0IHo9e307Xy5lYWNoKHkubm9kZXMseD0+e2xldCBDPWMuZ2V0SGllcmFyY2hpY2FsUGF0aCh4Lm5hbWUpLEY9di5yb290O0YuZGVwdGg9TWF0aC5tYXgoQy5sZW5ndGgsRi5kZXB0aCk7elt4Lm9wXXx8KHpbeC5vcF09W10pO3pbeC5vcF0ucHVzaCh4KTtmb3IobGV0IEI9MDtCPEMubGVuZ3RoO0IrKyl7Ri5kZXB0aD1NYXRoLm1heChGLmRlcHRoLEMubGVuZ3RoLUIpO0YuY2FyZGluYWxpdHkrPXguY2FyZGluYWxpdHk7Ri5vcEhpc3RvZ3JhbVt4Lm9wXT0oRi5vcEhpc3RvZ3JhbVt4Lm9wXXx8MCkrMTtudWxsIT14LmRldmljZSYmKEYuZGV2aWNlSGlzdG9ncmFtW3guZGV2aWNlXT0KKEYuZGV2aWNlSGlzdG9ncmFtW3guZGV2aWNlXXx8MCkrMSk7bnVsbCE9eC54bGFDbHVzdGVyJiYoRi54bGFDbHVzdGVySGlzdG9ncmFtW3gueGxhQ2x1c3Rlcl09KEYueGxhQ2x1c3Rlckhpc3RvZ3JhbVt4LnhsYUNsdXN0ZXJdfHwwKSsxKTt4LmNvbXBhdGlibGU/Ri5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KEYuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOkYuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9KEYuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGV8fDApKzE7Xy5lYWNoKHguaW5FbWJlZGRpbmdzLE89PntPLmNvbXBhdGlibGU/Ri5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KEYuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOkYuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9KEYuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGV8fAowKSsxfSk7Xy5lYWNoKHgub3V0RW1iZWRkaW5ncyxPPT57Ty5jb21wYXRpYmxlP0YuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShGLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpGLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShGLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxfSk7aWYoQj09PUMubGVuZ3RoLTEpYnJlYWs7dmFyIEQ9Q1tCXTtsZXQgST12Lm5vZGUoRCk7SXx8KEk9Yy5jcmVhdGVNZXRhbm9kZShELHYuZ3JhcGhPcHRpb25zKSxJLnBhcmVudE5vZGU9Rix2LnNldE5vZGUoRCxJKSxGLm1ldGFncmFwaC5zZXROb2RlKEQsSSksMD09PUQuaW5kZXhPZihhLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgpJiZGLm5hbWU9PT1hLmdyYXBoLlJPT1RfTkFNRSYmKEQ9RC5zdWJzdHJpbmcoYS5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYLmxlbmd0aCkseltEXXx8Cih6W0RdPVtdKSx2LmxpYnJhcnlGdW5jdGlvbnNbRF09e25vZGU6SSx1c2FnZXM6eltEXX0sSS5hc3NvY2lhdGVkRnVuY3Rpb249RCkpO0Y9SX12LnNldE5vZGUoeC5uYW1lLHgpO3gucGFyZW50Tm9kZT1GO0YubWV0YWdyYXBoLnNldE5vZGUoeC5uYW1lLHgpO18uZWFjaCh4LmluRW1iZWRkaW5ncyxmdW5jdGlvbihCKXt2LnNldE5vZGUoQi5uYW1lLEIpO0IucGFyZW50Tm9kZT14fSk7Xy5lYWNoKHgub3V0RW1iZWRkaW5ncyxmdW5jdGlvbihCKXt2LnNldE5vZGUoQi5uYW1lLEIpO0IucGFyZW50Tm9kZT14fSl9KX1mdW5jdGlvbiBsKHYseSl7bGV0IHo9di5nZXROb2RlTWFwKCkseD1bXSxDPVtdLEY9KEQsQik9PntsZXQgST0wO2Zvcig7RDspQltJKytdPUQubmFtZSxEPUQucGFyZW50Tm9kZTtyZXR1cm4gSS0xfTtfLmVhY2goeS5lZGdlcyxEPT57dmFyIEI9Rih5Lm5vZGVzW0Qudl0seCksST1GKHkubm9kZXNbRC53XSxDKTtpZigtMSE9PUImJi0xIT09SSl7Zm9yKDt4W0JdPT09Q1tJXTspaWYoQi0tLApJLS0sMD5CfHwwPkkpdGhyb3cgRXJyb3IoIk5vIGRpZmZlcmVuY2UgZm91bmQgYmV0d2VlbiBhbmNlc3RvciBwYXRocy4iKTt2YXIgTz16W3hbQisxXV07Qj14W0JdO0k9Q1tJXTt2YXIgUD1PLm1ldGFncmFwaC5lZGdlKEIsSSk7UHx8KFA9Yy5jcmVhdGVNZXRhZWRnZShCLEkpLE8ubWV0YWdyYXBoLnNldEVkZ2UoQixJLFApKTtPLmhhc05vbkNvbnRyb2xFZGdlc3x8RC5pc0NvbnRyb2xEZXBlbmRlbmN5fHwoTy5oYXNOb25Db250cm9sRWRnZXM9ITApO1AuYWRkQmFzZUVkZ2UoRCx2KX19KX1mdW5jdGlvbiBrKHYseSx6LHgsQyxGKXtsZXQgRD12Lm1ldGFncmFwaDtfLmVhY2goRC5ub2RlcygpLEI9PntCPUQubm9kZShCKTtCLnR5cGU9PT1hLmdyYXBoLk5vZGVUeXBlLk1FVEEmJmsoQix5LHoseCxDLEYpfSk7dj1uKEQpO3Y9KEY/cTpwKSh2LEQseS5ncmFwaE9wdGlvbnMpO18uZWFjaCh2LGZ1bmN0aW9uKEIsSSl7bGV0IE89Qi5tZXRhZ3JhcGgubm9kZXMoKTtfLmVhY2goTyxQPT4Ke1A9RC5ub2RlKFApO1Aub3duaW5nU2VyaWVzfHwoUC5vd25pbmdTZXJpZXM9SSl9KTtPLmxlbmd0aDx4JiYhKEIubmFtZSBpbiBDKSYmKENbQi5uYW1lXT1hLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5VTkdST1VQKTtCLm5hbWUgaW4gQyYmQ1tCLm5hbWVdPT09YS5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuVU5HUk9VUHx8KHkuc2V0Tm9kZShJLEIpLEQuc2V0Tm9kZShJLEIpLF8uZWFjaChPLFA9PntsZXQgSD1ELm5vZGUoUCk7Qi5tZXRhZ3JhcGguc2V0Tm9kZShQLEgpO0IucGFyZW50Tm9kZT1ILnBhcmVudE5vZGU7Qi5jYXJkaW5hbGl0eSsrO251bGwhPUguZGV2aWNlJiYoQi5kZXZpY2VIaXN0b2dyYW1bSC5kZXZpY2VdPShCLmRldmljZUhpc3RvZ3JhbVtILmRldmljZV18fDApKzEpO251bGwhPUgueGxhQ2x1c3RlciYmKEIueGxhQ2x1c3Rlckhpc3RvZ3JhbVtILnhsYUNsdXN0ZXJdPShCLnhsYUNsdXN0ZXJIaXN0b2dyYW1bSC54bGFDbHVzdGVyXXx8MCkrMSk7SC5jb21wYXRpYmxlPwpCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0oQi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6Qi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0oQi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMTtfLmVhY2goSC5pbkVtYmVkZGluZ3MsSz0+e0suY29tcGF0aWJsZT9CLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0oQi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6Qi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0oQi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMX0pO18uZWFjaChILm91dEVtYmVkZGluZ3MsSz0+e0suY29tcGF0aWJsZT9CLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0oQi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6Qi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0KKEIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGV8fDApKzF9KTtILnBhcmVudE5vZGU9Qjt6W1BdPUk7RC5yZW1vdmVOb2RlKFApfSkpfSl9ZnVuY3Rpb24gbih2KXtyZXR1cm4gXy5yZWR1Y2Uodi5ub2RlcygpLCh5LHopPT57ej12Lm5vZGUoeik7aWYoei50eXBlPT09Yy5Ob2RlVHlwZS5NRVRBKXJldHVybiB5O2xldCB4PXoub3A7eCYmKHlbeF09eVt4XXx8W10seVt4XS5wdXNoKHoubmFtZSkpO3JldHVybiB5fSx7fSl9ZnVuY3Rpb24gcCh2LHkseil7bGV0IHg9e307Xy5lYWNoKHYsZnVuY3Rpb24oQyxGKXtpZighKDE+PUMubGVuZ3RoKSl7dmFyIEQ9e307Xy5lYWNoKEMsZnVuY3Rpb24oQil7dmFyIEk9IioiPT09Qi5jaGFyQXQoQi5sZW5ndGgtMSksTz1CLnNwbGl0KCIvIiksUD1PW08ubGVuZ3RoLTFdO089Ty5zbGljZSgwLE8ubGVuZ3RoLTEpLmpvaW4oIi8iKTt2YXIgSD1QLm1hdGNoKC9eKFxEKilfKFxkKykkLyk7bGV0IEs9IiI7SD8oUD1IWzFdLEg9SFsyXSk6CihQPUk/UC5zdWJzdHIoMCxQLmxlbmd0aC0xKTpQLEg9MCxLPUk/IioiOiIiKTtJPWMuZ2V0U2VyaWVzTm9kZU5hbWUoUCxLLE8pO0RbSV09RFtJXXx8W107Qj1jLmNyZWF0ZVNlcmllc05vZGUoUCxLLE8sK0gsQix6KTtEW0ldLnB1c2goQil9KTtfLmVhY2goRCxmdW5jdGlvbihCKXtpZighKDI+Qi5sZW5ndGgpKXtCLnNvcnQoZnVuY3Rpb24oTyxQKXtyZXR1cm4rTy5jbHVzdGVySWQtK1AuY2x1c3RlcklkfSk7dmFyIEk9W0JbMF1dO2ZvcihsZXQgTz0xO088Qi5sZW5ndGg7TysrKXtsZXQgUD1CW09dO1AuY2x1c3RlcklkPT09SVtJLmxlbmd0aC0xXS5jbHVzdGVySWQrMT9JLnB1c2goUCk6KHIoSSx4LCtGLHkseiksST1bUF0pfXIoSSx4LCtGLHkseil9fSl9fSk7cmV0dXJuIHh9ZnVuY3Rpb24gcSh2LHkseil7bGV0IHg9e307Xy5lYWNoKHYsZnVuY3Rpb24oQyxGKXtpZighKDE+PUMubGVuZ3RoKSl7dmFyIEQ9e30sQj17fTtfLmVhY2goQyxmdW5jdGlvbihPKXtsZXQgUD0iKiI9PT0KTy5jaGFyQXQoTy5sZW5ndGgtMSk7dmFyIEg9Ty5zcGxpdCgiLyIpO2xldCBLPUhbSC5sZW5ndGgtMV07SD1ILnNsaWNlKDAsSC5sZW5ndGgtMSkuam9pbigiLyIpO2NvbnN0IE09LyhcZCspL2c7dmFyIEw7bGV0IFIsVSxZLGJhPTA7Zm9yKDtMPU0uZXhlYyhLKTspKytiYSxSPUsuc2xpY2UoMCxMLmluZGV4KSxVPUxbMF0sTD1LLnNsaWNlKEwuaW5kZXgrTFswXS5sZW5ndGgpLFk9Yy5nZXRTZXJpZXNOb2RlTmFtZShSLEwsSCksRFtZXT1EW1ldLERbWV18fChEW1ldPWMuY3JlYXRlU2VyaWVzTm9kZShSLEwsSCwrVSxPLHopKSxEW1ldLmlkcy5wdXNoKFUpLEJbT109QltPXXx8W10sQltPXS5wdXNoKFtZLFVdKTsxPmJhJiYoUj1QP0suc3Vic3RyKDAsSy5sZW5ndGgtMSk6SyxVPTAsTD1QPyIqIjoiIixZPWMuZ2V0U2VyaWVzTm9kZU5hbWUoUixMLEgpLERbWV09RFtZXSxEW1ldfHwoRFtZXT1jLmNyZWF0ZVNlcmllc05vZGUoUixMLEgsK1UsTyx6KSksRFtZXS5pZHMucHVzaChVKSxCW09dPQpCW09dfHxbXSxCW09dLnB1c2goW1ksVV0pKX0pO3ZhciBJPXt9O18uZWFjaChCLGZ1bmN0aW9uKE8sUCl7Ty5zb3J0KGZ1bmN0aW9uKE0sTCl7cmV0dXJuIERbTFswXV0uaWRzLmxlbmd0aC1EW01bMF1dLmlkcy5sZW5ndGh9KTt2YXIgSD1PWzBdWzBdO089T1swXVsxXTtJW0hdPUlbSF18fFtdO2NvbnN0IEs9UC5zcGxpdCgiLyIpO1A9Yy5jcmVhdGVTZXJpZXNOb2RlKERbSF0ucHJlZml4LERbSF0uc3VmZml4LEsuc2xpY2UoMCxLLmxlbmd0aC0xKS5qb2luKCIvIiksK08sUCx6KTtJW0hdLnB1c2goUCl9KTtfLmVhY2goSSxmdW5jdGlvbihPKXtpZighKDI+Ty5sZW5ndGgpKXtPLnNvcnQoZnVuY3Rpb24oSCxLKXtyZXR1cm4rSC5jbHVzdGVySWQtK0suY2x1c3RlcklkfSk7dmFyIFA9W09bMF1dO2ZvcihsZXQgSD0xO0g8Ty5sZW5ndGg7SCsrKXtsZXQgSz1PW0hdO0suY2x1c3RlcklkPT09UFtQLmxlbmd0aC0xXS5jbHVzdGVySWQrMT9QLnB1c2goSyk6KHIoUCx4LCtGLHkseiksUD0KW0tdKX1yKFAseCwrRix5LHopfX0pfX0pO3JldHVybiB4fWZ1bmN0aW9uIHIodix5LHoseCxDKXtpZigxPHYubGVuZ3RoKXtsZXQgRj1jLmdldFNlcmllc05vZGVOYW1lKHZbMF0ucHJlZml4LHZbMF0uc3VmZml4LHZbMF0ucGFyZW50LHZbMF0uY2x1c3RlcklkLHZbdi5sZW5ndGgtMV0uY2x1c3RlcklkKSxEPWMuY3JlYXRlU2VyaWVzTm9kZSh2WzBdLnByZWZpeCx2WzBdLnN1ZmZpeCx2WzBdLnBhcmVudCx6LEYsQyk7Xy5lYWNoKHYsZnVuY3Rpb24oQil7RC5pZHMucHVzaChCLmNsdXN0ZXJJZCk7RC5tZXRhZ3JhcGguc2V0Tm9kZShCLm5hbWUseC5ub2RlKEIubmFtZSkpfSk7eVtGXT1EfX1jbGFzcyB0e2NvbnN0cnVjdG9yKHYpe3RoaXMuaGFzU2hhcGVJbmZvPSExO3RoaXMubWF4TWV0YUVkZ2VTaXplPTE7dGhpcy5ncmFwaE9wdGlvbnM9dnx8e307dGhpcy5ncmFwaE9wdGlvbnMuY29tcG91bmQ9ITA7dGhpcy5yb290PWMuY3JlYXRlTWV0YW5vZGUoYy5ST09UX05BTUUsdGhpcy5ncmFwaE9wdGlvbnMpOwp0aGlzLmxpYnJhcnlGdW5jdGlvbnM9e307dGhpcy54bGFDbHVzdGVycz10aGlzLmRldmljZXM9dGhpcy50ZW1wbGF0ZXM9bnVsbDt0aGlzLmluZGV4PXt9O3RoaXMuaW5kZXhbYy5ST09UX05BTUVdPXRoaXMucm9vdDt0aGlzLm9yZGVyaW5ncz17fX1nZXROb2RlTWFwKCl7cmV0dXJuIHRoaXMuaW5kZXh9bm9kZSh2KXtyZXR1cm4gdGhpcy5pbmRleFt2XX1zZXROb2RlKHYseSl7dGhpcy5pbmRleFt2XT15fWdldEJyaWRnZWdyYXBoKHYpe3ZhciB5PXRoaXMuaW5kZXhbdl07aWYoIXkpdGhyb3cgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIG5vZGUgaW4gaGllcmFyY2h5OiAiK3YpO2lmKCEoIm1ldGFncmFwaCJpbiB5KSlyZXR1cm4gbnVsbDtpZih5LmJyaWRnZWdyYXBoKXJldHVybiB5LmJyaWRnZWdyYXBoO2xldCB6PXkuYnJpZGdlZ3JhcGg9Yy5jcmVhdGVHcmFwaCgiQlJJREdFR1JBUEgiLGMuR3JhcGhUeXBlLkJSSURHRSx0aGlzLmdyYXBoT3B0aW9ucyk7aWYoISh5LnBhcmVudE5vZGUmJgoibWV0YWdyYXBoImluIHkucGFyZW50Tm9kZSkpcmV0dXJuIHo7dmFyIHg9eS5wYXJlbnROb2RlO3k9eC5tZXRhZ3JhcGg7eD10aGlzLmdldEJyaWRnZWdyYXBoKHgubmFtZSk7Xy5lYWNoKFt5LHhdLEM9PntDLmVkZ2VzKCkuZmlsdGVyKEY9PkYudj09PXZ8fEYudz09PXYpLmZvckVhY2goRj0+e2xldCBEPUYudz09PXYsQj1DLmVkZ2UoRik7Xy5lYWNoKEIuYmFzZUVkZ2VMaXN0LEk9PntsZXQgW08sUF09RD9bSS53LEYudl06W0kudixGLnddO3ZhciBIPXRoaXMuZ2V0Q2hpbGROYW1lKHYsTyk7SD17djpEP1A6SCx3OkQ/SDpQfTtsZXQgSz16LmVkZ2UoSCk7S3x8KEs9Yy5jcmVhdGVNZXRhZWRnZShILnYsSC53KSxLLmluYm91bmQ9RCx6LnNldEVkZ2UoSC52LEgudyxLKSk7Sy5hZGRCYXNlRWRnZShJLHRoaXMpfSl9KX0pO3JldHVybiB6fWdldENoaWxkTmFtZSh2LHkpe2xldCB6PXRoaXMuaW5kZXhbeV07Zm9yKDt6Oyl7aWYoei5wYXJlbnROb2RlJiZ6LnBhcmVudE5vZGUubmFtZT09PQp2KXJldHVybiB6Lm5hbWU7ej16LnBhcmVudE5vZGV9dGhyb3cgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIGltbWVkaWF0ZSBjaGlsZCBmb3IgZGVzY2VuZGFudDogIit5KTt9Z2V0UHJlZGVjZXNzb3JzKHYpe2xldCB5PXRoaXMuaW5kZXhbdl07aWYoIXkpdGhyb3cgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIG5vZGUgd2l0aCBuYW1lOiAiK3YpO2xldCB6PXRoaXMuZ2V0T25lV2F5RWRnZXMoeSwhMCk7eS5pc0dyb3VwTm9kZXx8Xy5lYWNoKHkuaW5FbWJlZGRpbmdzLHg9PntfLmVhY2goeS5pbnB1dHMsQz0+e2lmKEMubmFtZT09PXgubmFtZSl7bGV0IEY9bmV3IGMuTWV0YWVkZ2VJbXBsKHgubmFtZSx2KTtGLmFkZEJhc2VFZGdlKHtpc0NvbnRyb2xEZXBlbmRlbmN5OkMuaXNDb250cm9sRGVwZW5kZW5jeSxvdXRwdXRUZW5zb3JLZXk6Qy5vdXRwdXRUZW5zb3JLZXksaXNSZWZlcmVuY2VFZGdlOiExLHY6eC5uYW1lLHc6dn0sdGhpcyk7ei5yZWd1bGFyLnB1c2goRil9fSl9KTtyZXR1cm4gen1nZXRTdWNjZXNzb3JzKHYpe2xldCB5PQp0aGlzLmluZGV4W3ZdO2lmKCF5KXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBub2RlIHdpdGggbmFtZTogIit2KTtsZXQgej10aGlzLmdldE9uZVdheUVkZ2VzKHksITEpO3kuaXNHcm91cE5vZGV8fF8uZWFjaCh5Lm91dEVtYmVkZGluZ3MseD0+e18uZWFjaCh4LmlucHV0cyxDPT57aWYoQy5uYW1lPT09dil7bGV0IEY9bmV3IGMuTWV0YWVkZ2VJbXBsKHYseC5uYW1lKTtGLmFkZEJhc2VFZGdlKHtpc0NvbnRyb2xEZXBlbmRlbmN5OkMuaXNDb250cm9sRGVwZW5kZW5jeSxvdXRwdXRUZW5zb3JLZXk6Qy5vdXRwdXRUZW5zb3JLZXksaXNSZWZlcmVuY2VFZGdlOiExLHYsdzp4Lm5hbWV9LHRoaXMpO3oucmVndWxhci5wdXNoKEYpfX0pfSk7cmV0dXJuIHp9Z2V0T25lV2F5RWRnZXModix5KXtsZXQgej17Y29udHJvbDpbXSxyZWd1bGFyOltdfTtpZighdi5wYXJlbnROb2RlfHwhdi5wYXJlbnROb2RlLmlzR3JvdXBOb2RlKXJldHVybiB6O3ZhciB4PXYucGFyZW50Tm9kZTtsZXQgQz0KeC5tZXRhZ3JhcGg7eD10aGlzLmdldEJyaWRnZWdyYXBoKHgubmFtZSk7ZihDLHYseSx6KTtmKHgsdix5LHopO3JldHVybiB6fWdldFRvcG9sb2dpY2FsT3JkZXJpbmcodil7dmFyIHk9dGhpcy5pbmRleFt2XTtpZigheSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSB3aXRoIG5hbWU6ICIrdik7aWYoIXkuaXNHcm91cE5vZGUpcmV0dXJuIG51bGw7aWYodiBpbiB0aGlzLm9yZGVyaW5ncylyZXR1cm4gdGhpcy5vcmRlcmluZ3Nbdl07bGV0IHo9e30seD17fSxDPXkubWV0YWdyYXBoO18uZWFjaChDLmVkZ2VzKCksRD0+e0MuZWRnZShEKS5udW1SZWd1bGFyRWRnZXMmJihELnYgaW4genx8KHpbRC52XT1bXSkseltELnZdLnB1c2goRC53KSx4W0Qud109ITApfSk7bGV0IEY9Xy5kaWZmZXJlbmNlKF8ua2V5cyh6KSxfLmtleXMoeCkpO3Y9dGhpcy5vcmRlcmluZ3Nbdl09e307Zm9yKHk9MDtGLmxlbmd0aDspe2xldCBEPUYuc2hpZnQoKTt2W0RdPXkrKztfLmVhY2goeltEXSxCPT4KRi5wdXNoKEIpKTtkZWxldGUgeltEXX1yZXR1cm4gdn1nZXRUZW1wbGF0ZUluZGV4KCl7bGV0IHY9ZDMua2V5cyh0aGlzLnRlbXBsYXRlcykseT1kMy5zY2FsZU9yZGluYWwoKS5kb21haW4odikucmFuZ2UoZDMucmFuZ2UoMCx2Lmxlbmd0aCkpO3JldHVybiB6PT55KHopfX1kLkRlZmF1bHRIaWVyYXJjaHlQYXJhbXM9e3ZlcmlmeVRlbXBsYXRlOiEwLHNlcmllc05vZGVNaW5TaXplOjUsc2VyaWVzTWFwOnt9LHJhbmtEaXJlY3Rpb246IkJUIix1c2VHZW5lcmFsaXplZFNlcmllc1BhdHRlcm5zOiExfTtkLmJ1aWxkPWZ1bmN0aW9uKHYseSx6KXtsZXQgeD1uZXcgdCh7cmFua2Rpcjp5LnJhbmtEaXJlY3Rpb259KSxDPXt9O3JldHVybiBhLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJBZGRpbmcgbm9kZXMiLDIwLCgpPT57bGV0IEY9e30sRD17fTtfLmVhY2godi5ub2RlcyxCPT57Qi5kZXZpY2UmJihGW0IuZGV2aWNlXT0hMCk7Qi54bGFDbHVzdGVyJiYoRFtCLnhsYUNsdXN0ZXJdPSEwKX0pOwp4LmRldmljZXM9Xy5rZXlzKEYpO3gueGxhQ2x1c3RlcnM9Xy5rZXlzKEQpO2coeCx2KX0seikudGhlbigoKT0+YS5ncmFwaC51dGlsLnJ1bkFzeW5jVGFzaygiRGV0ZWN0IHNlcmllcyIsMjAsKCk9PnswPHkuc2VyaWVzTm9kZU1pblNpemUmJmsoeC5yb290LHgsQyx5LnNlcmllc05vZGVNaW5TaXplLHkuc2VyaWVzTWFwLHkudXNlR2VuZXJhbGl6ZWRTZXJpZXNQYXR0ZXJucyl9LHopKS50aGVuKCgpPT5hLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJBZGRpbmcgZWRnZXMiLDMwLCgpPT57bCh4LHYsQyl9LHopKS50aGVuKCgpPT5hLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJGaW5kaW5nIHNpbWlsYXIgc3ViZ3JhcGhzIiwzMCwoKT0+e3gudGVtcGxhdGVzPWMudGVtcGxhdGUuZGV0ZWN0KHgseS52ZXJpZnlUZW1wbGF0ZSl9LHopKS50aGVuKCgpPT54KX07ZC5qb2luQW5kQWdncmVnYXRlU3RhdHM9ZnVuY3Rpb24odil7bGV0IHk9e30sej17fTtfLmVhY2godi5yb290LmxlYXZlcygpLAp4PT57eD12Lm5vZGUoeCk7bnVsbCE9eC5kZXZpY2UmJih5W3guZGV2aWNlXT0hMCk7bnVsbCE9eC54bGFDbHVzdGVyJiYoelt4LnhsYUNsdXN0ZXJdPSEwKX0pO3YuZGV2aWNlcz1fLmtleXMoeSk7di54bGFDbHVzdGVycz1fLmtleXMoeik7Xy5lYWNoKHYuZ2V0Tm9kZU1hcCgpLHg9Pnt4LmlzR3JvdXBOb2RlJiYoeC5zdGF0cz1uZXcgYy5Ob2RlU3RhdHMobnVsbCkseC5kZXZpY2VIaXN0b2dyYW09e30pfSk7Xy5lYWNoKHYucm9vdC5sZWF2ZXMoKSx4PT57bGV0IEM9eD12Lm5vZGUoeCk7Zm9yKDtudWxsIT1DLnBhcmVudE5vZGU7KXtpZihudWxsIT14LmRldmljZSl7dmFyIEY9Qy5wYXJlbnROb2RlLmRldmljZUhpc3RvZ3JhbTtGW3guZGV2aWNlXT0oRlt4LmRldmljZV18fDApKzF9bnVsbCE9eC54bGFDbHVzdGVyJiYoRj1DLnBhcmVudE5vZGUueGxhQ2x1c3Rlckhpc3RvZ3JhbSxGW3gueGxhQ2x1c3Rlcl09KEZbeC54bGFDbHVzdGVyXXx8MCkrMSk7bnVsbCE9eC5zdGF0cyYmQy5wYXJlbnROb2RlLnN0YXRzLmNvbWJpbmUoeC5zdGF0cyk7CkM9Qy5wYXJlbnROb2RlfX0pfTtkLmdldEluY29tcGF0aWJsZU9wcz1mdW5jdGlvbih2LHkpe2xldCB6PVtdLHg9e307Xy5lYWNoKHYucm9vdC5sZWF2ZXMoKSxDPT57Qz12Lm5vZGUoQyk7aWYoQy50eXBlPT1jLk5vZGVUeXBlLk9QKXtpZighQy5jb21wYXRpYmxlKWlmKEMub3duaW5nU2VyaWVzKWlmKHkmJnkuc2VyaWVzTWFwW0Mub3duaW5nU2VyaWVzXT09PWEuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLlVOR1JPVVApei5wdXNoKEMpO2Vsc2V7aWYoIXhbQy5vd25pbmdTZXJpZXNdKXtsZXQgRj12Lm5vZGUoQy5vd25pbmdTZXJpZXMpO0YmJih4W0Mub3duaW5nU2VyaWVzXT1GLHoucHVzaChGKSl9fWVsc2Ugei5wdXNoKEMpO18uZWFjaChDLmluRW1iZWRkaW5ncyxGPT57Ri5jb21wYXRpYmxlfHx6LnB1c2goRil9KTtfLmVhY2goQy5vdXRFbWJlZGRpbmdzLEY9PntGLmNvbXBhdGlibGV8fHoucHVzaChGKX0pfX0pO3JldHVybiB6fX0pKGMuaGllcmFyY2h5fHwoYy5oaWVyYXJjaHk9Cnt9KSl9KShhLmdyYXBofHwoYS5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9sYXlvdXQuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7ZnVuY3Rpb24gZih4KXt4Lm5vZGUuaXNHcm91cE5vZGUmJmwoeCk7eC5ub2RlLnR5cGU9PT1jLk5vZGVUeXBlLk1FVEE/bih4KTp4Lm5vZGUudHlwZT09PWMuTm9kZVR5cGUuU0VSSUVTJiZwKHgpfWZ1bmN0aW9uIGcoeCl7eC5pbmJveFdpZHRoPTA8eC5pbkFubm90YXRpb25zLmxpc3QubGVuZ3RoP2QuUEFSQU1TLmFubm90YXRpb25zLmluYm94V2lkdGg6MDt4Lm91dGJveFdpZHRoPTA8eC5vdXRBbm5vdGF0aW9ucy5saXN0Lmxlbmd0aD9kLlBBUkFNUy5hbm5vdGF0aW9ucy5vdXRib3hXaWR0aDowO3guY29yZUJveC53aWR0aD14LndpZHRoO3guY29yZUJveC5oZWlnaHQ9eC5oZWlnaHQ7eC53aWR0aD1NYXRoLm1heCh4LmNvcmVCb3gud2lkdGgreC5pbmJveFdpZHRoK3gub3V0Ym94V2lkdGgsMyp4LmRpc3BsYXlOYW1lLmxlbmd0aCl9ZnVuY3Rpb24gbCh4KXtsZXQgQz14LmNvcmVHcmFwaC5ub2RlcygpLm1hcChGPT4KeC5jb3JlR3JhcGgubm9kZShGKSkuY29uY2F0KHguaXNvbGF0ZWRJbkV4dHJhY3QseC5pc29sYXRlZE91dEV4dHJhY3QseC5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdCk7Xy5lYWNoKEMsRj0+e3N3aXRjaChGLm5vZGUudHlwZSl7Y2FzZSBjLk5vZGVUeXBlLk9QOl8uZXh0ZW5kKEYsZC5QQVJBTVMubm9kZVNpemUub3ApO2JyZWFrO2Nhc2UgYy5Ob2RlVHlwZS5CUklER0U6Xy5leHRlbmQoRixkLlBBUkFNUy5ub2RlU2l6ZS5icmlkZ2UpO2JyZWFrO2Nhc2UgYy5Ob2RlVHlwZS5NRVRBOkYuZXhwYW5kZWQ/ZihGKTooXy5leHRlbmQoRixkLlBBUkFNUy5ub2RlU2l6ZS5tZXRhKSxGLmhlaWdodD1kLlBBUkFNUy5ub2RlU2l6ZS5tZXRhLmhlaWdodChGLm5vZGUuY2FyZGluYWxpdHkpKTticmVhaztjYXNlIGMuTm9kZVR5cGUuU0VSSUVTOkYuZXhwYW5kZWQ/KF8uZXh0ZW5kKEYsZC5QQVJBTVMubm9kZVNpemUuc2VyaWVzLmV4cGFuZGVkKSxmKEYpKTpfLmV4dGVuZChGLEYubm9kZS5oYXNOb25Db250cm9sRWRnZXM/CmQuUEFSQU1TLm5vZGVTaXplLnNlcmllcy52ZXJ0aWNhbDpkLlBBUkFNUy5ub2RlU2l6ZS5zZXJpZXMuaG9yaXpvbnRhbCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIG5vZGUgdHlwZTogIitGLm5vZGUudHlwZSk7fUYuZXhwYW5kZWR8fGcoRik7cShGKX0pfWZ1bmN0aW9uIGsoeCxDKXtfLmV4dGVuZCh4LmdyYXBoKCkse25vZGVzZXA6Qy5ub2RlU2VwLHJhbmtzZXA6Qy5yYW5rU2VwLGVkZ2VzZXA6Qy5lZGdlU2VwfSk7bGV0IEY9W10sRD1bXTtfLmVhY2goeC5ub2RlcygpLEg9Pnt4Lm5vZGUoSCkubm9kZS50eXBlPT09Yy5Ob2RlVHlwZS5CUklER0U/Ri5wdXNoKEgpOkQucHVzaChIKX0pO2lmKCFELmxlbmd0aClyZXR1cm57d2lkdGg6MCxoZWlnaHQ6MH07ZGFncmUubGF5b3V0KHgpO2xldCBCPUluZmluaXR5LEk9SW5maW5pdHksTz0tSW5maW5pdHksUD0tSW5maW5pdHk7Xy5lYWNoKEQsSD0+e0g9eC5ub2RlKEgpO3ZhciBLPS41Kkgud2lkdGgsTT1ILngtCks7Sz1ILngrSztCPU08Qj9NOkI7Tz1LPk8/SzpPO0s9LjUqSC5oZWlnaHQ7TT1ILnktSztIPUgueStLO0k9TTxJP006STtQPUg+UD9IOlB9KTtfLmVhY2goeC5lZGdlcygpLEg9PntIPXguZWRnZShIKTtpZighSC5zdHJ1Y3R1cmFsKXt2YXIgSz14Lm5vZGUoSC5tZXRhZWRnZS52KSxNPXgubm9kZShILm1ldGFlZGdlLncpO2lmKDM9PT1ILnBvaW50cy5sZW5ndGgmJnkoSC5wb2ludHMpKXtpZihudWxsIT1LKXt2YXIgTD1LLmV4cGFuZGVkP0sueDp0KEspO0gucG9pbnRzWzBdLng9TH1udWxsIT1NJiYoTD1NLmV4cGFuZGVkP00ueDp0KE0pLEgucG9pbnRzWzJdLng9TCk7SC5wb2ludHM9W0gucG9pbnRzWzBdLEgucG9pbnRzWzFdXX1MPUgucG9pbnRzW0gucG9pbnRzLmxlbmd0aC0yXTtudWxsIT1NJiYoSC5wb2ludHNbSC5wb2ludHMubGVuZ3RoLTFdPXooTCxNKSk7TT1ILnBvaW50c1sxXTtudWxsIT1LJiYoSC5wb2ludHNbMF09eihNLEspKTtfLmVhY2goSC5wb2ludHMsUj0+e0I9Ui54PApCP1IueDpCO089Ui54Pk8/Ui54Ok87ST1SLnk8ST9SLnk6STtQPVIueT5QP1IueTpQfSl9fSk7Xy5lYWNoKHgubm9kZXMoKSxIPT57SD14Lm5vZGUoSCk7SC54LT1CO0gueS09SX0pO18uZWFjaCh4LmVkZ2VzKCksSD0+e18uZWFjaCh4LmVkZ2UoSCkucG9pbnRzLEs9PntLLngtPUI7Sy55LT1JfSl9KTtyZXR1cm57d2lkdGg6Ty1CLGhlaWdodDpQLUl9fWZ1bmN0aW9uIG4oeCl7bGV0IEM9ZC5QQVJBTVMuc3Vic2NlbmUubWV0YTtfLmV4dGVuZCh4LEMpO18uZXh0ZW5kKHguY29yZUJveCxrKHguY29yZUdyYXBoLGQuUEFSQU1TLmdyYXBoLm1ldGEpKTt2YXIgRj14Lmlzb2xhdGVkSW5FeHRyYWN0Lmxlbmd0aD9fLm1heCh4Lmlzb2xhdGVkSW5FeHRyYWN0LEI9PkIud2lkdGgpLndpZHRoOm51bGw7eC5pbkV4dHJhY3RCb3gud2lkdGg9bnVsbCE9Rj9GOjA7eC5pbkV4dHJhY3RCb3guaGVpZ2h0PV8ucmVkdWNlKHguaXNvbGF0ZWRJbkV4dHJhY3QsKEIsSSxPKT0+e089MDxPP0MuZXh0cmFjdFlPZmZzZXQ6CjA7SS54PTA7SS55PUIrTytJLmhlaWdodC8yO3JldHVybiBCK08rSS5oZWlnaHR9LDApO0Y9eC5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoP18ubWF4KHguaXNvbGF0ZWRPdXRFeHRyYWN0LEI9PkIud2lkdGgpLndpZHRoOm51bGw7eC5vdXRFeHRyYWN0Qm94LndpZHRoPW51bGwhPUY/RjowO3gub3V0RXh0cmFjdEJveC5oZWlnaHQ9Xy5yZWR1Y2UoeC5pc29sYXRlZE91dEV4dHJhY3QsKEIsSSxPKT0+e089MDxPP0MuZXh0cmFjdFlPZmZzZXQ6MDtJLng9MDtJLnk9QitPK0kuaGVpZ2h0LzI7cmV0dXJuIEIrTytJLmhlaWdodH0sMCk7Rj14LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0Lmxlbmd0aD9fLm1heCh4LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LEI9PkIud2lkdGgpLndpZHRoOm51bGw7eC5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoPW51bGwhPUY/RjowO3gubGlicmFyeUZ1bmN0aW9uc0JveC5oZWlnaHQ9Xy5yZWR1Y2UoeC5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdCwoQixJLApPKT0+e089MDxPP0MuZXh0cmFjdFlPZmZzZXQ6MDtJLng9MDtJLnk9QitPK0kuaGVpZ2h0LzI7cmV0dXJuIEIrTytJLmhlaWdodH0sMCk7Rj0wOzA8eC5pc29sYXRlZEluRXh0cmFjdC5sZW5ndGgmJkYrKzswPHguaXNvbGF0ZWRPdXRFeHRyYWN0Lmxlbmd0aCYmRisrOzA8eC5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGgmJkYrKzswPHguY29yZUdyYXBoLm5vZGVDb3VudCgpJiZGKys7bGV0IEQ9ZC5QQVJBTVMuc3Vic2NlbmUubWV0YS5leHRyYWN0WE9mZnNldDtGPTE+PUY/MDpGKkQ7eC5jb3JlQm94LndpZHRoKz1NYXRoLm1heChkLk1JTl9BVVhfV0lEVEgseC5pbkV4dHJhY3RCb3gud2lkdGgreC5vdXRFeHRyYWN0Qm94LndpZHRoKStGK3gubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aCtGO3guY29yZUJveC5oZWlnaHQ9Qy5sYWJlbEhlaWdodCtNYXRoLm1heCh4LmluRXh0cmFjdEJveC5oZWlnaHQseC5jb3JlQm94LmhlaWdodCx4LmxpYnJhcnlGdW5jdGlvbnNCb3guaGVpZ2h0LAp4Lm91dEV4dHJhY3RCb3guaGVpZ2h0KTt4LndpZHRoPXguY29yZUJveC53aWR0aCtDLnBhZGRpbmdMZWZ0K0MucGFkZGluZ1JpZ2h0O3guaGVpZ2h0PXgucGFkZGluZ1RvcCt4LmNvcmVCb3guaGVpZ2h0K3gucGFkZGluZ0JvdHRvbX1mdW5jdGlvbiBwKHgpe2xldCBDPXguY29yZUdyYXBoLEY9ZC5QQVJBTVMuc3Vic2NlbmUuc2VyaWVzO18uZXh0ZW5kKHgsRik7Xy5leHRlbmQoeC5jb3JlQm94LGsoeC5jb3JlR3JhcGgsZC5QQVJBTVMuZ3JhcGguc2VyaWVzKSk7Xy5lYWNoKEMubm9kZXMoKSxEPT57Qy5ub2RlKEQpLmV4Y2x1ZGVkPSExfSk7eC53aWR0aD14LmNvcmVCb3gud2lkdGgrRi5wYWRkaW5nTGVmdCtGLnBhZGRpbmdSaWdodDt4LmhlaWdodD14LmNvcmVCb3guaGVpZ2h0K0YucGFkZGluZ1RvcCtGLnBhZGRpbmdCb3R0b219ZnVuY3Rpb24gcSh4KXtpZigheC5leHBhbmRlZCl7dmFyIEM9eC5pbkFubm90YXRpb25zLmxpc3QsRj14Lm91dEFubm90YXRpb25zLmxpc3Q7Xy5lYWNoKEMsCks9PnIoSykpO18uZWFjaChGLEs9PnIoSykpO3ZhciBEPWQuUEFSQU1TLmFubm90YXRpb25zLEI9Xy5yZWR1Y2UoQywoSyxNLEwpPT57TD0wPEw/RC55T2Zmc2V0OjA7TS5keD0tKHguY29yZUJveC53aWR0aCtNLndpZHRoKS8yLUQueE9mZnNldDtNLmR5PUsrTCtNLmhlaWdodC8yO3JldHVybiBLK0wrTS5oZWlnaHR9LDApO18uZWFjaChDLEs9PntLLmR5LT1CLzI7Sy5sYWJlbE9mZnNldD1ELmxhYmVsT2Zmc2V0fSk7dmFyIEk9Xy5yZWR1Y2UoRiwoSyxNLEwpPT57TD0wPEw/RC55T2Zmc2V0OjA7TS5keD0oeC5jb3JlQm94LndpZHRoK00ud2lkdGgpLzIrRC54T2Zmc2V0O00uZHk9SytMK00uaGVpZ2h0LzI7cmV0dXJuIEsrTCtNLmhlaWdodH0sMCk7Xy5lYWNoKEYsSz0+e0suZHktPUkvMjtLLmxhYmVsT2Zmc2V0PUQubGFiZWxPZmZzZXR9KTt2YXIgTz1NYXRoLm1pbih4LmhlaWdodC8yLXgucmFkaXVzLEIvMik7Tz0wPk8/MDpPO3ZhciBQPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLApDLmxlbmd0aC0xXSkucmFuZ2UoWy1PLE9dKTtfLmVhY2goQywoSyxNKT0+e0sucG9pbnRzPVt7ZHg6Sy5keCtLLndpZHRoLzIsZHk6Sy5keX0se2R4Oi14LmNvcmVCb3gud2lkdGgvMixkeToxPEMubGVuZ3RoP1AoTSk6MH1dfSk7Tz1NYXRoLm1pbih4LmhlaWdodC8yLXgucmFkaXVzLEkvMik7Tz0wPk8/MDpPO3ZhciBIPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLEYubGVuZ3RoLTFdKS5yYW5nZShbLU8sT10pO18uZWFjaChGLChLLE0pPT57Sy5wb2ludHM9W3tkeDp4LmNvcmVCb3gud2lkdGgvMixkeToxPEYubGVuZ3RoP0goTSk6MH0se2R4OksuZHgtSy53aWR0aC8yLGR5OksuZHl9XX0pO3guaGVpZ2h0PU1hdGgubWF4KHguaGVpZ2h0LEIsSSl9fWZ1bmN0aW9uIHIoeCl7c3dpdGNoKHguYW5ub3RhdGlvblR5cGUpe2Nhc2UgYy5yZW5kZXIuQW5ub3RhdGlvblR5cGUuQ09OU1RBTlQ6Xy5leHRlbmQoeCxkLlBBUkFNUy5jb25zdGFudC5zaXplKTticmVhaztjYXNlIGMucmVuZGVyLkFubm90YXRpb25UeXBlLlNIT1JUQ1VUOmlmKHgubm9kZS50eXBlPT09CmMuTm9kZVR5cGUuT1ApXy5leHRlbmQoeCxkLlBBUkFNUy5zaG9ydGN1dFNpemUub3ApO2Vsc2UgaWYoeC5ub2RlLnR5cGU9PT1jLk5vZGVUeXBlLk1FVEEpXy5leHRlbmQoeCxkLlBBUkFNUy5zaG9ydGN1dFNpemUubWV0YSk7ZWxzZSBpZih4Lm5vZGUudHlwZT09PWMuTm9kZVR5cGUuU0VSSUVTKV8uZXh0ZW5kKHgsZC5QQVJBTVMuc2hvcnRjdXRTaXplLnNlcmllcyk7ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBub2RlIHR5cGU6ICIreC5ub2RlLnR5cGUpO2JyZWFrO2Nhc2UgYy5yZW5kZXIuQW5ub3RhdGlvblR5cGUuU1VNTUFSWTpfLmV4dGVuZCh4LGQuUEFSQU1TLmNvbnN0YW50LnNpemUpfX1mdW5jdGlvbiB0KHgpe3JldHVybiB4LmV4cGFuZGVkP3gueDp4LngteC53aWR0aC8yKyh4LmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGg/eC5pbmJveFdpZHRoOjApK3guY29yZUJveC53aWR0aC8yfWZ1bmN0aW9uIHYoeCxDKXtyZXR1cm4gMTgwKk1hdGguYXRhbigoQy55LXgueSkvKEMueC0KeC54KSkvTWF0aC5QSX1mdW5jdGlvbiB5KHgpe2xldCBDPXYoeFswXSx4WzFdKTtmb3IobGV0IEY9MTtGPHgubGVuZ3RoLTE7RisrKXtsZXQgRD12KHhbRl0seFtGKzFdKTtpZigxPE1hdGguYWJzKEQtQykpcmV0dXJuITE7Qz1EfXJldHVybiEwfWZ1bmN0aW9uIHooeCxDKXtsZXQgRj1DLmV4cGFuZGVkP0MueDp0KEMpLEQ9Qy55O3ZhciBCPXgueC1GO3g9eC55LUQ7bGV0IEk9Qy5leHBhbmRlZD9DLndpZHRoOkMuY29yZUJveC53aWR0aCxPPUMuZXhwYW5kZWQ/Qy5oZWlnaHQ6Qy5jb3JlQm94LmhlaWdodDtNYXRoLmFicyh4KSpJLzI+TWF0aC5hYnMoQikqTy8yPygwPngmJihPPS1PKSxDPTA9PT14PzA6Ty8yKkIveCxCPU8vMik6KDA+QiYmKEk9LUkpLEM9SS8yLEI9MD09PUI/MDpJLzIqeC9CKTtyZXR1cm57eDpGK0MseTpEK0J9fWQuUEFSQU1TPXthbmltYXRpb246e2R1cmF0aW9uOjI1MH0sZ3JhcGg6e21ldGE6e25vZGVTZXA6NSxyYW5rU2VwOjI1LGVkZ2VTZXA6NX0sc2VyaWVzOntub2RlU2VwOjUsCnJhbmtTZXA6MjUsZWRnZVNlcDo1fSxwYWRkaW5nOntwYWRkaW5nVG9wOjQwLHBhZGRpbmdMZWZ0OjIwfX0sc3Vic2NlbmU6e21ldGE6e3BhZGRpbmdUb3A6MTAscGFkZGluZ0JvdHRvbToxMCxwYWRkaW5nTGVmdDoxMCxwYWRkaW5nUmlnaHQ6MTAsbGFiZWxIZWlnaHQ6MjAsZXh0cmFjdFhPZmZzZXQ6MTUsZXh0cmFjdFlPZmZzZXQ6MjB9LHNlcmllczp7cGFkZGluZ1RvcDoxMCxwYWRkaW5nQm90dG9tOjEwLHBhZGRpbmdMZWZ0OjEwLHBhZGRpbmdSaWdodDoxMCxsYWJlbEhlaWdodDoxMH19LG5vZGVTaXplOnttZXRhOntyYWRpdXM6NSx3aWR0aDo2MCxtYXhMYWJlbFdpZHRoOjUyLGhlaWdodDpkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMSwyMDBdKS5yYW5nZShbMTUsNjBdKS5jbGFtcCghMCksZXhwYW5kQnV0dG9uUmFkaXVzOjN9LG9wOnt3aWR0aDoxNSxoZWlnaHQ6NixyYWRpdXM6MyxsYWJlbE9mZnNldDotOCxtYXhMYWJlbFdpZHRoOjMwfSxzZXJpZXM6e2V4cGFuZGVkOntyYWRpdXM6MTAsCmxhYmVsT2Zmc2V0OjB9LHZlcnRpY2FsOnt3aWR0aDoxNixoZWlnaHQ6MTMsbGFiZWxPZmZzZXQ6LTEzfSxob3Jpem9udGFsOnt3aWR0aDoyNCxoZWlnaHQ6OCxyYWRpdXM6MTAsbGFiZWxPZmZzZXQ6LTEwfX0sYnJpZGdlOnt3aWR0aDoyMCxoZWlnaHQ6MjAscmFkaXVzOjIsbGFiZWxPZmZzZXQ6MH19LHNob3J0Y3V0U2l6ZTp7b3A6e3dpZHRoOjEwLGhlaWdodDo0fSxtZXRhOnt3aWR0aDoxMixoZWlnaHQ6NCxyYWRpdXM6MX0sc2VyaWVzOnt3aWR0aDoxNCxoZWlnaHQ6NH19LGFubm90YXRpb25zOntpbmJveFdpZHRoOjUwLG91dGJveFdpZHRoOjUwLHhPZmZzZXQ6MTAseU9mZnNldDozLGxhYmVsT2Zmc2V0OjIsbWF4TGFiZWxXaWR0aDoxMjB9LGNvbnN0YW50OntzaXplOnt3aWR0aDo0LGhlaWdodDo0fX0sc2VyaWVzOnttYXhTdGFja0NvdW50OjMscGFyYWxsZWxTdGFja09mZnNldFJhdGlvOi4yLHRvd2VyU3RhY2tPZmZzZXRSYXRpbzouNX0sbWluaW1hcDp7c2l6ZToxNTB9fTtkLk1JTl9BVVhfV0lEVEg9CjE0MDtkLmxheW91dFNjZW5lPWY7ZC5jb21wdXRlQ1hQb3NpdGlvbk9mTm9kZVNoYXBlPXR9KShjLmxheW91dHx8KGMubGF5b3V0PXt9KSl9KShhLmdyYXBofHwoYS5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9sb2FkZXIuanMKdmFyIGZwPXRoaXMmJnRoaXMuX19hd2FpdGVyfHxmdW5jdGlvbihhLGMsZCxmKXtyZXR1cm4gbmV3IChkfHwoZD1Qcm9taXNlKSkoZnVuY3Rpb24oZyxsKXtmdW5jdGlvbiBrKHEpe3RyeXtwKGYubmV4dChxKSl9Y2F0Y2gocil7bChyKX19ZnVuY3Rpb24gbihxKXt0cnl7cChmWyJ0aHJvdyJdKHEpKX1jYXRjaChyKXtsKHIpfX1mdW5jdGlvbiBwKHEpe3EuZG9uZT9nKHEudmFsdWUpOihuZXcgZChmdW5jdGlvbihyKXtyKHEudmFsdWUpfSkpLnRoZW4oayxuKX1wKChmPWYuYXBwbHkoYSxjfHxbXSkpLm5leHQoKSl9KX07CihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKGQpe2QuZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaD1mdW5jdGlvbihmLGcsbCxrPW5ldyBjLm9wLlRwdUNvbXBhdGliaWxpdHlQcm92aWRlcixuPWMuaGllcmFyY2h5LkRlZmF1bHRIaWVyYXJjaHlQYXJhbXMpe2NvbnN0IHA9Yy51dGlsLmdldFN1YnRhc2tUcmFja2VyKGYsMjAsIkdyYXBoIikscT1jLnV0aWwuZ2V0U3VidGFza1RyYWNrZXIoZiw1MCwiTmFtZXNwYWNlIGhpZXJhcmNoeSIpO3JldHVybiBjLnBhcnNlci5mZXRjaEFuZFBhcnNlR3JhcGhEYXRhKGcsbCxjLnV0aWwuZ2V0U3VidGFza1RyYWNrZXIoZiwzMCwiRGF0YSIpKS50aGVuKGZ1bmN0aW9uKHIpe2lmKCFyLm5vZGUpdGhyb3cgRXJyb3IoIlRoZSBncmFwaCBpcyBlbXB0eS4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gVGVuc29yRmxvdyBjb3VsZCBub3QgdHJhY2UgYW55IGdyYXBoLiBQbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvaXNzdWVzLzE5NjEgZm9yIG1vcmUgaW5mb3JtYXRpb24uIik7CnJldHVybiBjLmJ1aWxkKHIsYy5EZWZhdWx0QnVpbGRQYXJhbXMscCl9LCgpPT57dGhyb3cgRXJyb3IoIk1hbGZvcm1lZCBHcmFwaERlZi4gVGhpcyBjYW4gc29tZXRpbWVzIGJlIGNhdXNlZCBieSBhIGJhZCBuZXR3b3JrIGNvbm5lY3Rpb24gb3IgZGlmZmljdWx0eSByZWNvbmNpbGluZyBtdWx0aXBsZSBHcmFwaERlZnM7IGZvciB0aGUgbGF0dGVyIGNhc2UsIHBsZWFzZSByZWZlciB0byBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9pc3N1ZXMvMTkyOS4iKTt9KS50aGVuKHI9PmZwKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXtjLm9wLmNoZWNrT3BzRm9yQ29tcGF0aWJpbGl0eShyLGspO2NvbnN0IHQ9eWllbGQgYy5oaWVyYXJjaHkuYnVpbGQocixuLHEpO3JldHVybntncmFwaDpyLGdyYXBoSGllcmFyY2h5OnR9fSkpLmNhdGNoKHI9PntmLnJlcG9ydEVycm9yKGBHcmFwaCB2aXN1YWxpemF0aW9uIGZhaWxlZC5cblxuJHtyfWAscik7dGhyb3cgcjsKfSl9fSkoYy5sb2FkZXJ8fChjLmxvYWRlcj17fSkpfSkoYS5ncmFwaHx8KGEuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vbm9kZS5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gZyhhYSxjYSxmYSl7aWYoY2Eubm9kZS5pc0dyb3VwTm9kZSl7aWYoY2EuZXhwYW5kZWQpcmV0dXJuIGQuYnVpbGRHcm91cChhYSxjYSxmYSxkLkNsYXNzLlN1YnNjZW5lLkdST1VQKTtkLnNlbGVjdENoaWxkKGFhLCJnIixkLkNsYXNzLlN1YnNjZW5lLkdST1VQKS5yZW1vdmUoKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBsKGFhLGNhKXtsZXQgZmE9Y2EueC1jYS53aWR0aC8yK2NhLnBhZGRpbmdMZWZ0O2NhPWNhLnktY2EuaGVpZ2h0LzIrY2EucGFkZGluZ1RvcDthYT1kLnNlbGVjdENoaWxkKGFhLCJnIixkLkNsYXNzLlN1YnNjZW5lLkdST1VQKTtkLnRyYW5zbGF0ZShhYSxmYSxjYSl9ZnVuY3Rpb24gayhhYSxjYSxmYSl7YWE9ZC5zZWxlY3RPckNyZWF0ZUNoaWxkKGFhLCJnIixkLkNsYXNzLk5vZGUuQlVUVE9OX0NPTlRBSU5FUik7ZC5zZWxlY3RPckNyZWF0ZUNoaWxkKGFhLCJjaXJjbGUiLApkLkNsYXNzLk5vZGUuQlVUVE9OX0NJUkNMRSk7ZC5zZWxlY3RPckNyZWF0ZUNoaWxkKGFhLCJwYXRoIixkLkNsYXNzLk5vZGUuRVhQQU5EX0JVVFRPTikuYXR0cigiZCIsIk0wLC0yLjIgVjIuMiBNLTIuMiwwIEgyLjIiKTtkLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoYWEsInBhdGgiLGQuQ2xhc3MuTm9kZS5DT0xMQVBTRV9CVVRUT04pLmF0dHIoImQiLCJNLTIuMiwwIEgyLjIiKTthYS5vbigiY2xpY2siLGRhPT57ZDMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7ZmEuZmlyZSgibm9kZS10b2dnbGUtZXhwYW5kIix7bmFtZTpkYS5ub2RlLm5hbWV9KX0pO2QucG9zaXRpb25CdXR0b24oYWEsY2EpfWZ1bmN0aW9uIG4oYWEsY2EsZmEsZGEpe2lmKGRhKWFhLmF0dHIoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpO2Vsc2V7dmFyIGxhPWQuY29udGV4dG1lbnUuZ2V0TWVudShmYSxwKGNhLm5vZGUsZmEpKTthYS5vbigiZGJsY2xpY2siLFo9PntmYS5maXJlKCJub2RlLXRvZ2dsZS1leHBhbmQiLHtuYW1lOloubm9kZS5uYW1lfSl9KS5vbigibW91c2VvdmVyIiwKWj0+e2ZhLmlzTm9kZUV4cGFuZGVkKFopfHxmYS5maXJlKCJub2RlLWhpZ2hsaWdodCIse25hbWU6Wi5ub2RlLm5hbWV9KX0pLm9uKCJtb3VzZW91dCIsWj0+e2ZhLmlzTm9kZUV4cGFuZGVkKFopfHxmYS5maXJlKCJub2RlLXVuaGlnaGxpZ2h0Iix7bmFtZTpaLm5vZGUubmFtZX0pfSkub24oImNsaWNrIixaPT57ZDMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7ZmEuZmlyZSgibm9kZS1zZWxlY3QiLHtuYW1lOloubm9kZS5uYW1lfSl9KS5vbigiY29udGV4dG1lbnUiLChaLEZhKT0+e2ZhLmZpcmUoIm5vZGUtc2VsZWN0Iix7bmFtZTpaLm5vZGUubmFtZX0pO2xhLmNhbGwoWixGYSl9KX19ZnVuY3Rpb24gcChhYSxjYSl7bGV0IGZhPVt7dGl0bGU6KCk9PmMuZ2V0SW5jbHVkZU5vZGVCdXR0b25TdHJpbmcoYWEuaW5jbHVkZSksYWN0aW9uOigpPT57Y2EuZmlyZSgibm9kZS10b2dnbGUtZXh0cmFjdCIse25hbWU6YWEubmFtZX0pfX1dO2NhLm5vZGVDb250ZXh0TWVudUl0ZW1zJiYoZmE9CmZhLmNvbmNhdChjYS5ub2RlQ29udGV4dE1lbnVJdGVtcykpO3EoYWEpJiZmYS5wdXNoKHt0aXRsZTooKT0+dihhYSksYWN0aW9uOigpPT57Y2EuZmlyZSgibm9kZS10b2dnbGUtc2VyaWVzZ3JvdXAiLHtuYW1lOnIoYWEpfSl9fSk7cmV0dXJuIGZhfWZ1bmN0aW9uIHEoYWEpe3JldHVybiBudWxsIT09cihhYSl9ZnVuY3Rpb24gcihhYSl7cmV0dXJuIGFhP2FhLnR5cGU9PT1jLk5vZGVUeXBlLlNFUklFUz9hYS5uYW1lOmFhLnR5cGU9PT1jLk5vZGVUeXBlLk9QP2FhLm93bmluZ1NlcmllczpudWxsOm51bGx9ZnVuY3Rpb24gdChhYSl7bGV0IGNhPW51bGw7aWYoIWFhKXJldHVybiBudWxsO2FhLnR5cGU9PT1jLk5vZGVUeXBlLlNFUklFUz9jYT1hYTphYS5wYXJlbnROb2RlJiZhYS5wYXJlbnROb2RlLnR5cGU9PT1jLk5vZGVUeXBlLlNFUklFUyYmKGNhPWFhLnBhcmVudE5vZGUpO3JldHVybiBjYX1mdW5jdGlvbiB2KGFhKXtyZXR1cm4gYS5ncmFwaC5nZXRHcm91cFNlcmllc05vZGVCdXR0b25TdHJpbmcobnVsbCE9PQp0KGFhKT9hLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5HUk9VUDphLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5VTkdST1VQKX1mdW5jdGlvbiB5KGFhLGNhLGZhKXt2YXIgZGE9Y2EuZGlzcGxheU5hbWU7bGV0IGxhPWNhLm5vZGUudHlwZT09PWMuTm9kZVR5cGUuTUVUQSYmIWNhLmV4cGFuZGVkO2FhPWQuc2VsZWN0T3JDcmVhdGVDaGlsZChhYSwidGV4dCIsZC5DbGFzcy5Ob2RlLkxBQkVMKTtsZXQgWj1hYS5ub2RlKCk7Wi5wYXJlbnROb2RlLmFwcGVuZENoaWxkKFopO2FhLmF0dHIoImR5IiwiLjM1ZW0iKS5hdHRyKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpO2xhJiYoZGEubGVuZ3RoPmZhLm1heE1ldGFub2RlTGFiZWxMZW5ndGgmJihkYT1kYS5zdWJzdHIoMCxmYS5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoLTIpKyIuLi4iKSxmYT14KGZhKSxhYS5hdHRyKCJmb250LXNpemUiLGZhKGRhLmxlbmd0aCkrInB4IikpO2RhPWFhLnRleHQoZGEpO3ooZGEsY2Eubm9kZS50eXBlLGNhKTsKcmV0dXJuIGFhfWZ1bmN0aW9uIHooYWEsY2EsZmEpe2xldCBkYT1hYS5ub2RlKCk7dmFyIGxhPWRhLmdldENvbXB1dGVkVGV4dExlbmd0aCgpO2xldCBaPWRhLnRleHRDb250ZW50LEZhPW51bGw7c3dpdGNoKGNhKXtjYXNlIGMuTm9kZVR5cGUuTUVUQTpmYSYmIWZhLmV4cGFuZGVkJiYoRmE9Yy5sYXlvdXQuUEFSQU1TLm5vZGVTaXplLm1ldGEubWF4TGFiZWxXaWR0aCk7YnJlYWs7Y2FzZSBjLk5vZGVUeXBlLk9QOkZhPWMubGF5b3V0LlBBUkFNUy5ub2RlU2l6ZS5vcC5tYXhMYWJlbFdpZHRoO2JyZWFrO2Nhc2UgLTE6RmE9Yy5sYXlvdXQuUEFSQU1TLmFubm90YXRpb25zLm1heExhYmVsV2lkdGh9aWYoIShudWxsPT09RmF8fGxhPD1GYSkpe2ZvcihsYT0xO2RhLmdldFN1YlN0cmluZ0xlbmd0aCgwLGxhKTxGYTspbGErKztjYT1kYS50ZXh0Q29udGVudC5zdWJzdHIoMCxsYSk7ZG8gY2E9Y2Euc3Vic3RyKDAsY2EubGVuZ3RoLTEpLGRhLnRleHRDb250ZW50PWNhKyIuLi4iLGxhPWRhLmdldENvbXB1dGVkVGV4dExlbmd0aCgpOwp3aGlsZShsYT5GYSYmMDxjYS5sZW5ndGgpO3JldHVybiBhYS5hcHBlbmQoInRpdGxlIikudGV4dChaKX19ZnVuY3Rpb24geChhYSl7YmF8fChiYT1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbYWEubWF4TWV0YW5vZGVMYWJlbExlbmd0aExhcmdlRm9udCxhYS5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoXSkucmFuZ2UoW2FhLm1heE1ldGFub2RlTGFiZWxMZW5ndGhGb250U2l6ZSxhYS5taW5NZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemVdKS5jbGFtcCghMCkpO3JldHVybiBiYX1mdW5jdGlvbiBDKGFhLGNhLGZhLGRhKXtkLnNlbGVjdENoaWxkKGFhLCJ0ZXh0IixkLkNsYXNzLk5vZGUuTEFCRUwpLnRyYW5zaXRpb24oKS5hdHRyKCJ4IixjYSkuYXR0cigieSIsZmErZGEpfWZ1bmN0aW9uIEYoYWEsY2EsZmEpe2FhPWQuc2VsZWN0T3JDcmVhdGVDaGlsZChhYSwiZyIsZmEpO3N3aXRjaChjYS5ub2RlLnR5cGUpe2Nhc2UgYy5Ob2RlVHlwZS5PUDpjYT1jYS5ub2RlO2lmKF8uaXNOdW1iZXIoY2EuZnVuY3Rpb25JbnB1dEluZGV4KXx8Cl8uaXNOdW1iZXIoY2EuZnVuY3Rpb25PdXRwdXRJbmRleCkpe2Quc2VsZWN0T3JDcmVhdGVDaGlsZChhYSwicG9seWdvbiIsZC5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVCk7YnJlYWt9ZC5zZWxlY3RPckNyZWF0ZUNoaWxkKGFhLCJlbGxpcHNlIixkLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUKTticmVhaztjYXNlIGMuTm9kZVR5cGUuU0VSSUVTOmZhPSJhbm5vdGF0aW9uIjtjYS5jb3JlR3JhcGgmJihmYT1jYS5ub2RlLmhhc05vbkNvbnRyb2xFZGdlcz8idmVydGljYWwiOiJob3Jpem9udGFsIik7bGV0IGRhPVtkLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUXTtjYS5pc0ZhZGVkT3V0JiZkYS5wdXNoKCJmYWRlZC1lbGxpcHNlIik7ZC5zZWxlY3RPckNyZWF0ZUNoaWxkKGFhLCJ1c2UiLGRhKS5hdHRyKCJ4bGluazpocmVmIiwiI29wLXNlcmllcy0iK2ZhKyItc3RhbXAiKTtkLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoYWEsInJlY3QiLGQuQ2xhc3MuTm9kZS5DT0xPUl9UQVJHRVQpLmF0dHIoInJ4IiwKY2EucmFkaXVzKS5hdHRyKCJyeSIsY2EucmFkaXVzKTticmVhaztjYXNlIGMuTm9kZVR5cGUuQlJJREdFOmQuc2VsZWN0T3JDcmVhdGVDaGlsZChhYSwicmVjdCIsZC5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVCkuYXR0cigicngiLGNhLnJhZGl1cykuYXR0cigicnkiLGNhLnJhZGl1cyk7YnJlYWs7Y2FzZSBjLk5vZGVUeXBlLk1FVEE6ZC5zZWxlY3RPckNyZWF0ZUNoaWxkKGFhLCJyZWN0IixkLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUKS5hdHRyKCJyeCIsY2EucmFkaXVzKS5hdHRyKCJyeSIsY2EucmFkaXVzKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJVbnJlY29nbml6ZWQgbm9kZSB0eXBlOiAiK2NhLm5vZGUudHlwZSk7fXJldHVybiBhYX1mdW5jdGlvbiBEKGFhKXtzd2l0Y2goYWEubm9kZS50eXBlKXtjYXNlIGMuTm9kZVR5cGUuT1A6cmV0dXJuIGQuQ2xhc3MuT1BOT0RFO2Nhc2UgYy5Ob2RlVHlwZS5NRVRBOnJldHVybiBkLkNsYXNzLk1FVEFOT0RFO2Nhc2UgYy5Ob2RlVHlwZS5TRVJJRVM6cmV0dXJuIGQuQ2xhc3MuU0VSSUVTTk9ERTsKY2FzZSBjLk5vZGVUeXBlLkJSSURHRTpyZXR1cm4gZC5DbGFzcy5CUklER0VOT0RFO2Nhc2UgYy5Ob2RlVHlwZS5FTExJUFNJUzpyZXR1cm4gZC5DbGFzcy5FTExJUFNJU05PREV9dGhyb3cgRXJyb3IoIlVucmVjb2duaXplZCBub2RlIHR5cGU6ICIrYWEubm9kZS50eXBlKTt9ZnVuY3Rpb24gQihhYSxjYSl7dmFyIGZhPWQuc2VsZWN0Q2hpbGQoYWEsImciLGQuQ2xhc3MuTm9kZS5TSEFQRSk7bGV0IGRhPWMubGF5b3V0LmNvbXB1dGVDWFBvc2l0aW9uT2ZOb2RlU2hhcGUoY2EpO3N3aXRjaChjYS5ub2RlLnR5cGUpe2Nhc2UgYy5Ob2RlVHlwZS5PUDp7Y29uc3QgbGE9Y2Eubm9kZTtfLmlzTnVtYmVyKGxhLmZ1bmN0aW9uSW5wdXRJbmRleCl8fF8uaXNOdW1iZXIobGEuZnVuY3Rpb25PdXRwdXRJbmRleCk/KGZhPWQuc2VsZWN0Q2hpbGQoZmEsInBvbHlnb24iKSxkLnBvc2l0aW9uVHJpYW5nbGUoZmEsY2EueCxjYS55LGNhLmNvcmVCb3gud2lkdGgsY2EuY29yZUJveC5oZWlnaHQpKTooZmE9CmQuc2VsZWN0Q2hpbGQoZmEsImVsbGlwc2UiKSxkLnBvc2l0aW9uRWxsaXBzZShmYSxkYSxjYS55LGNhLmNvcmVCb3gud2lkdGgsY2EuY29yZUJveC5oZWlnaHQpKTtDKGFhLGRhLGNhLnksY2EubGFiZWxPZmZzZXQpO2JyZWFrfWNhc2UgYy5Ob2RlVHlwZS5NRVRBOmZhPWZhLnNlbGVjdEFsbCgicmVjdCIpO2NhLmV4cGFuZGVkPyhkLnBvc2l0aW9uUmVjdChmYSxjYS54LGNhLnksY2Eud2lkdGgsY2EuaGVpZ2h0KSxsKGFhLGNhKSxDKGFhLGRhLGNhLnksLWNhLmhlaWdodC8yK2NhLmxhYmVsSGVpZ2h0LzIpKTooZC5wb3NpdGlvblJlY3QoZmEsZGEsY2EueSxjYS5jb3JlQm94LndpZHRoLGNhLmNvcmVCb3guaGVpZ2h0KSxDKGFhLGRhLGNhLnksMCkpO2JyZWFrO2Nhc2UgYy5Ob2RlVHlwZS5TRVJJRVM6ZmE9ZC5zZWxlY3RDaGlsZChmYSwidXNlIik7Y2EuZXhwYW5kZWQ/KGQucG9zaXRpb25SZWN0KGZhLGNhLngsY2EueSxjYS53aWR0aCxjYS5oZWlnaHQpLGwoYWEsY2EpLEMoYWEsZGEsCmNhLnksLWNhLmhlaWdodC8yK2NhLmxhYmVsSGVpZ2h0LzIpKTooZC5wb3NpdGlvblJlY3QoZmEsZGEsY2EueSxjYS5jb3JlQm94LndpZHRoLGNhLmNvcmVCb3guaGVpZ2h0KSxDKGFhLGRhLGNhLnksY2EubGFiZWxPZmZzZXQpKTticmVhaztjYXNlIGMuTm9kZVR5cGUuQlJJREdFOmFhPWQuc2VsZWN0Q2hpbGQoZmEsInJlY3QiKTtkLnBvc2l0aW9uUmVjdChhYSxjYS54LGNhLnksY2Eud2lkdGgsY2EuaGVpZ2h0KTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJVbnJlY29nbml6ZWQgbm9kZSB0eXBlOiAiK2NhLm5vZGUudHlwZSk7fX1mdW5jdGlvbiBJKGFhLGNhLGZhKXtsZXQgZGE9YS5ncmFwaC51dGlsLmVzY2FwZVF1ZXJ5U2VsZWN0b3IoYWEpO2lmKCFmYSlyZXR1cm5gdXJsKCMke2RhfSlgO2ZhPWQzLnNlbGVjdChmYSk7bGV0IGxhPWZhLnNlbGVjdCgiZGVmcyNfZ3JhcGgtZ3JhZGllbnRzIik7bGEuZW1wdHkoKSYmKGxhPWZhLmFwcGVuZCgiZGVmcyIpLmF0dHIoImlkIiwiX2dyYXBoLWdyYWRpZW50cyIpKTsKbGV0IFo9bGEuc2VsZWN0KCJsaW5lYXJHcmFkaWVudCMiK2RhKTtpZihaLmVtcHR5KCkpe1o9bGEuYXBwZW5kKCJsaW5lYXJHcmFkaWVudCIpLmF0dHIoImlkIixhYSk7Wi5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTtsZXQgRmE9MDtfLmVhY2goY2EseGE9PntsZXQgeWE9eGEuY29sb3I7Wi5hcHBlbmQoInN0b3AiKS5hdHRyKCJvZmZzZXQiLEZhKS5hdHRyKCJzdG9wLWNvbG9yIix5YSk7Wi5hcHBlbmQoInN0b3AiKS5hdHRyKCJvZmZzZXQiLEZhK3hhLnByb3BvcnRpb24pLmF0dHIoInN0b3AtY29sb3IiLHlhKTtGYSs9eGEucHJvcG9ydGlvbn0pfX1mdW5jdGlvbiBPKGFhLGNhLGZhLGRhLGxhKXtsZXQgWj1jLnJlbmRlci5NZXRhbm9kZUNvbG9ycztzd2l0Y2goY2Epe2Nhc2UgbWEuU1RSVUNUVVJFOnJldHVybiBmYS5ub2RlLnR5cGU9PT1jLk5vZGVUeXBlLk1FVEE/KGNhPWZhLm5vZGUudGVtcGxhdGVJZCxudWxsPT09Y2E/Wi5VTktOT1dOOlouU1RSVUNUVVJFX1BBTEVUVEUoYWEoY2EpLApkYSkpOmZhLm5vZGUudHlwZT09PWMuTm9kZVR5cGUuU0VSSUVTP2RhP1ouRVhQQU5ERURfQ09MT1I6IndoaXRlIjpmYS5ub2RlLnR5cGU9PT1jLk5vZGVUeXBlLkJSSURHRT9mYS5zdHJ1Y3R1cmFsPyIjZjBlIjpmYS5ub2RlLmluYm91bmQ/IiMwZWYiOiIjZmUwIjpfLmlzTnVtYmVyKGZhLm5vZGUuZnVuY3Rpb25JbnB1dEluZGV4KT8iIzc5NTU0OCI6Xy5pc051bWJlcihmYS5ub2RlLmZ1bmN0aW9uT3V0cHV0SW5kZXgpPyIjMDA5Njg4Ijoid2hpdGUiO2Nhc2UgbWEuREVWSUNFOnJldHVybiBudWxsPT1mYS5kZXZpY2VDb2xvcnM/Wi5VTktOT1dOOmRhP1ouRVhQQU5ERURfQ09MT1I6SSgiZGV2aWNlLSIrZmEubm9kZS5uYW1lLGZhLmRldmljZUNvbG9ycyxsYSk7Y2FzZSBtYS5YTEFfQ0xVU1RFUjpyZXR1cm4gbnVsbD09ZmEueGxhQ2x1c3RlckNvbG9ycz9aLlVOS05PV046ZGE/Wi5FWFBBTkRFRF9DT0xPUjpJKCJ4bGEtIitmYS5ub2RlLm5hbWUsZmEueGxhQ2x1c3RlckNvbG9ycywKbGEpO2Nhc2UgbWEuQ09NUFVURV9USU1FOnJldHVybiBkYT9aLkVYUEFOREVEX0NPTE9SOmZhLmNvbXB1dGVUaW1lQ29sb3J8fFouVU5LTk9XTjtjYXNlIG1hLk1FTU9SWTpyZXR1cm4gZGE/Wi5FWFBBTkRFRF9DT0xPUjpmYS5tZW1vcnlDb2xvcnx8Wi5VTktOT1dOO2Nhc2UgbWEuT1BfQ09NUEFUSUJJTElUWTpyZXR1cm4gbnVsbD09ZmEuY29tcGF0aWJpbGl0eUNvbG9ycz9aLlVOS05PV046ZGE/Wi5FWFBBTkRFRF9DT0xPUjpJKCJvcC1jb21wYXQtIitmYS5ub2RlLm5hbWUsZmEuY29tcGF0aWJpbGl0eUNvbG9ycyxsYSk7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5rbm93biBjYXNlIHRvIGNvbG9yIG5vZGVzIGJ5Iik7fX1mdW5jdGlvbiBQKGFhLGNhLGZhLGRhKXtkYT1kYXx8ZC5DbGFzcy5Ob2RlLlNIQVBFO2xldCBsYT1mYS5pc05vZGVTZWxlY3RlZChjYS5ub2RlLm5hbWUpLFo9Y2EuaXNJbkV4dHJhY3R8fGNhLmlzT3V0RXh0cmFjdHx8Y2EuaXNMaWJyYXJ5RnVuY3Rpb24sRmE9CmNhLmV4cGFuZGVkJiZkYSE9PWQuQ2xhc3MuQW5ub3RhdGlvbi5OT0RFLHhhPWNhLmlzRmFkZWRPdXQ7YWEuY2xhc3NlZCgiaGlnaGxpZ2h0ZWQiLGZhLmlzTm9kZUhpZ2hsaWdodGVkKGNhLm5vZGUubmFtZSkpO2FhLmNsYXNzZWQoInNlbGVjdGVkIixsYSk7YWEuY2xhc3NlZCgiZXh0cmFjdCIsWik7YWEuY2xhc3NlZCgiZXhwYW5kZWQiLEZhKTthYS5jbGFzc2VkKCJmYWRlZCIseGEpO2FhPWFhLnNlbGVjdCgiLiIrZGErIiAuIitkLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUKTtjYT1PKGZhLnRlbXBsYXRlSW5kZXgsbWFbZmEuY29sb3JCeS50b1VwcGVyQ2FzZSgpXSxjYSxGYSxmYS5nZXRHcmFwaFN2Z1Jvb3QoKSk7YWEuc3R5bGUoImZpbGwiLGNhKTthYS5zdHlsZSgic3Ryb2tlIixsYT9udWxsOkgoY2EpKX1mdW5jdGlvbiBIKGFhKXtyZXR1cm4idXJsIj09PWFhLnN1YnN0cmluZygwLDMpP2MucmVuZGVyLk1ldGFub2RlQ29sb3JzLkdSQURJRU5UX09VVExJTkU6ZDMucmdiKGFhKS5kYXJrZXIoKS50b1N0cmluZygpfQpmdW5jdGlvbiBLKGFhLGNhKXtsZXQgZmE9W107YWE9Y2EuZ2V0Tm9kZUJ5TmFtZShhYSk7aWYoYWEgaW5zdGFuY2VvZiBhLmdyYXBoLk9wTm9kZUltcGwpcmV0dXJuW2FhXS5jb25jYXQoYWEuaW5FbWJlZGRpbmdzKTthYT1hYS5tZXRhZ3JhcGgubm9kZXMoKTtfLmVhY2goYWEsZnVuY3Rpb24oZGEpe2ZhPWZhLmNvbmNhdChLKGRhLGNhKSl9KTtyZXR1cm4gZmF9ZnVuY3Rpb24gTShhYSxjYSxmYSxkYSl7aWYoZGFbZmEubmFtZV0pcmV0dXJuIGRhO2RhW2ZhLm5hbWVdPSEwO3ZhciBsYT1mYS5pbnB1dHM7bGV0IFo9WShjYSxmYSk7ZDMuc2VsZWN0KGFhKS5zZWxlY3QoYC5ub2RlW2RhdGEtbmFtZT0iJHtaLm5hbWV9Il1gKS5jbGFzc2VkKCJpbnB1dC1oaWdobGlnaHQiLCEwKTtsZXQgRmE9e307Xy5lYWNoKGxhLGZ1bmN0aW9uKEJhKXtCYT1jYS5nZXROb2RlQnlOYW1lKEJhLm5hbWUpO2lmKHZvaWQgMCE9PUJhKXtCYSBpbnN0YW5jZW9mIGMuTWV0YW5vZGVJbXBsJiYoQmE9YS5ncmFwaC5nZXRTdHJpY3ROYW1lKEJhLm5hbWUpLApCYT1jYS5nZXROb2RlQnlOYW1lKEJhKSk7dmFyIEdhPVkoY2EsQmEpLHphPUZhW0dhLm5hbWVdO3phP3phLm9wTm9kZXMucHVzaChCYSk6RmFbR2EubmFtZV09e3Zpc2libGVQYXJlbnQ6R2Esb3BOb2RlczpbQmFdfX19KTtsZXQgeGE9e30seWE9W1pdO3hhW1oubmFtZV09e3RyYWNlZDohMSxpbmRleDowLGNvbm5lY3Rpb25FbmRwb2ludHM6W119O2ZhPVo7Zm9yKGxhPTE7ZmEubmFtZSE9PWEuZ3JhcGguUk9PVF9OQU1FO2xhKyspZmE9ZmEucGFyZW50Tm9kZSx4YVtmYS5uYW1lXT17dHJhY2VkOiExLGluZGV4OmxhLGNvbm5lY3Rpb25FbmRwb2ludHM6W119LHlhW2xhXT1mYTtfLmZvck93bihGYSxmdW5jdGlvbihCYSl7bGV0IEdhPUJhLnZpc2libGVQYXJlbnQ7Xy5lYWNoKEJhLm9wTm9kZXMsZnVuY3Rpb24oemEpe2RhPU0oYWEsY2EsemEsZGEpfSk7R2EubmFtZSE9PVoubmFtZSYmTChhYSxHYSx4YSx5YSl9KTtyZXR1cm4gZGF9ZnVuY3Rpb24gTChhYSxjYSxmYSxkYSl7dmFyIGxhPQpjYSxaPWNhO2ZvcihjYT1bXTshZmFbbGEubmFtZV07KVoubmFtZSE9PWxhLm5hbWUmJmNhLnB1c2goW1osbGFdKSxaPWxhLGxhPWxhLnBhcmVudE5vZGU7ZmE9ZmFbbGEubmFtZV0uaW5kZXg7bGV0IEZhPWRhW01hdGgubWF4KGZhLTEsMCldLm5hbWU7Wj1sYT1aLm5hbWU7Y29uc3QgeGE9ZDMuc2VsZWN0KGFhKTt4YS5zZWxlY3RBbGwoYFtkYXRhLWVkZ2U9IiR7Wn0tLSR7RmF9Il1gKS5jbGFzc2VkKCJpbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApO18uZWFjaChjYSxmdW5jdGlvbih5YSl7eGEuc2VsZWN0QWxsKGBbZGF0YS1lZGdlPSIke3lhWzBdLm5hbWV9LS0ke0ZhfWArYH5+JHt5YVsxXS5uYW1lfX5+T1VUIl1gKS5jbGFzc2VkKCJpbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApfSk7Zm9yKGFhPTE7YWE8ZmE7YWErKyl4YS5zZWxlY3RBbGwoYFtkYXRhLWVkZ2U9IiR7bGF9fn4ke2RhW2FhXS5uYW1lfWArYH5+SU4tLSR7ZGFbYWEtMV0ubmFtZX0iXWApLmNsYXNzZWQoImlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwKITApfWZ1bmN0aW9uIFIoYWEsY2Epe2xldCBmYT17fTtfLmVhY2goY2EsZnVuY3Rpb24oZGEpe2RhPWFhLmdldE5vZGVCeU5hbWUoZGEpO2RhPVkoYWEsZGEpO2ZhW2RhLm5hbWVdPWRhfSk7cmV0dXJuIGZhfWZ1bmN0aW9uIFUoYWEsY2Epe18uZm9yT3duKGNhLGZ1bmN0aW9uKGZhKXtmb3IoO2ZhLm5hbWUhPT1hLmdyYXBoLlJPT1RfTkFNRTspe2NvbnN0IGRhPWQzLnNlbGVjdChhYSkuc2VsZWN0KGAubm9kZVtkYXRhLW5hbWU9IiR7ZmEubmFtZX0iXWApOyFkYS5ub2RlcygpLmxlbmd0aHx8ZGEuY2xhc3NlZCgiaW5wdXQtaGlnaGxpZ2h0Iil8fGRhLmNsYXNzZWQoInNlbGVjdGVkIil8fGRhLmNsYXNzZWQoIm9wIil8fGRhLmNsYXNzZWQoImlucHV0LXBhcmVudCIsITApO2ZhPWZhLnBhcmVudE5vZGV9fSl9ZnVuY3Rpb24gWShhYSxjYSl7bGV0IGZhPSExLGRhPWNhO2Zvcig7IWZhOylpZihjYT1kYSxkYT1jYS5wYXJlbnROb2RlLHZvaWQgMD09PWRhKWZhPSEwO2Vsc2V7bGV0IGxhPQphYS5nZXRSZW5kZXJOb2RlQnlOYW1lKGRhLm5hbWUpO2xhJiYobGEuZXhwYW5kZWR8fGRhIGluc3RhbmNlb2YgYy5PcE5vZGVJbXBsKSYmKGZhPSEwKX1yZXR1cm4gY2F9Zi5idWlsZEdyb3VwPWZ1bmN0aW9uKGFhLGNhLGZhKXthYT1kLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoYWEsImciLGQuQ2xhc3MuTm9kZS5DT05UQUlORVIpLnNlbGVjdEFsbChmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9KS5kYXRhKGNhLGRhPT5kYS5ub2RlLm5hbWUrIjoiK2RhLm5vZGUudHlwZSk7YWEuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJkYXRhLW5hbWUiLGRhPT5kYS5ub2RlLm5hbWUpLmVhY2goZnVuY3Rpb24oZGEpe2xldCBsYT1kMy5zZWxlY3QodGhpcyk7ZmEuYWRkTm9kZUdyb3VwKGRhLm5vZGUubmFtZSxsYSl9KS5tZXJnZShhYSkuYXR0cigiY2xhc3MiLGRhPT5kLkNsYXNzLk5vZGUuR1JPVVArIiAiK0QoZGEpKS5lYWNoKGZ1bmN0aW9uKGRhKXtsZXQgbGE9ZDMuc2VsZWN0KHRoaXMpOwp2YXIgWj1kLnNlbGVjdE9yQ3JlYXRlQ2hpbGQobGEsImciLGQuQ2xhc3MuQW5ub3RhdGlvbi5JTkJPWCk7ZC5hbm5vdGF0aW9uLmJ1aWxkR3JvdXAoWixkYS5pbkFubm90YXRpb25zLGRhLGZhKTtaPWQuc2VsZWN0T3JDcmVhdGVDaGlsZChsYSwiZyIsZC5DbGFzcy5Bbm5vdGF0aW9uLk9VVEJPWCk7ZC5hbm5vdGF0aW9uLmJ1aWxkR3JvdXAoWixkYS5vdXRBbm5vdGF0aW9ucyxkYSxmYSk7Wj1GKGxhLGRhLGQuQ2xhc3MuTm9kZS5TSEFQRSk7ZGEubm9kZS5pc0dyb3VwTm9kZSYmayhaLGRhLGZhKTtuKFosZGEsZmEpO2cobGEsZGEsZmEpO1o9eShsYSxkYSxmYSk7bihaLGRhLGZhLGRhLm5vZGUudHlwZT09PWMuTm9kZVR5cGUuTUVUQSk7UChsYSxkYSxmYSk7QihsYSxkYSl9KTthYS5leGl0KCkuZWFjaChmdW5jdGlvbihkYSl7ZmEucmVtb3ZlTm9kZUdyb3VwKGRhLm5vZGUubmFtZSk7bGV0IGxhPWQzLnNlbGVjdCh0aGlzKTswPGRhLmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGgmJmxhLnNlbGVjdCgiLiIrCmQuQ2xhc3MuQW5ub3RhdGlvbi5JTkJPWCkuc2VsZWN0QWxsKCIuIitkLkNsYXNzLkFubm90YXRpb24uR1JPVVApLmVhY2goWj0+e2ZhLnJlbW92ZUFubm90YXRpb25Hcm91cChaLGRhKX0pOzA8ZGEub3V0QW5ub3RhdGlvbnMubGlzdC5sZW5ndGgmJmxhLnNlbGVjdCgiLiIrZC5DbGFzcy5Bbm5vdGF0aW9uLk9VVEJPWCkuc2VsZWN0QWxsKCIuIitkLkNsYXNzLkFubm90YXRpb24uR1JPVVApLmVhY2goWj0+e2ZhLnJlbW92ZUFubm90YXRpb25Hcm91cChaLGRhKX0pfSkucmVtb3ZlKCk7cmV0dXJuIGFhfTtmLmdldENvbnRleHRNZW51PXA7Zi5jYW5CZUluU2VyaWVzPXE7Zi5nZXRTZXJpZXNOYW1lPXI7Zi5nZXRHcm91cFNldHRpbmdMYWJlbD12O2YuZW5mb3JjZUxhYmVsV2lkdGg9ejtsZXQgYmE9bnVsbDtmLmJ1aWxkU2hhcGU9RjtmLm5vZGVDbGFzcz1EO2xldCBtYTsoZnVuY3Rpb24oYWEpe2FhW2FhLlNUUlVDVFVSRT0wXT0iU1RSVUNUVVJFIjthYVthYS5ERVZJQ0U9MV09IkRFVklDRSI7CmFhW2FhLlhMQV9DTFVTVEVSPTJdPSJYTEFfQ0xVU1RFUiI7YWFbYWEuQ09NUFVURV9USU1FPTNdPSJDT01QVVRFX1RJTUUiO2FhW2FhLk1FTU9SWT00XT0iTUVNT1JZIjthYVthYS5PUF9DT01QQVRJQklMSVRZPTVdPSJPUF9DT01QQVRJQklMSVRZIn0pKG1hPWYuQ29sb3JCeXx8KGYuQ29sb3JCeT17fSkpO2YucmVtb3ZlR3JhZGllbnREZWZpbml0aW9ucz1mdW5jdGlvbihhYSl7ZDMuc2VsZWN0KGFhKS5zZWxlY3QoImRlZnMjX2dyYXBoLWdyYWRpZW50cyIpLnJlbW92ZSgpfTtmLmdldEZpbGxGb3JOb2RlPU87Zi5zdHlsaXplPVA7Zi5nZXRTdHJva2VGb3JGaWxsPUg7Zi51cGRhdGVJbnB1dFRyYWNlPWZ1bmN0aW9uKGFhLGNhLGZhLGRhKXtjb25zdCBsYT1kMy5zZWxlY3QoYWEpO2xhLnNlbGVjdEFsbCgiLmlucHV0LWhpZ2hsaWdodCIpLmNsYXNzZWQoImlucHV0LWhpZ2hsaWdodCIsITEpO2xhLnNlbGVjdEFsbCgiLm5vbi1pbnB1dCIpLmNsYXNzZWQoIm5vbi1pbnB1dCIsITEpOwpsYS5zZWxlY3RBbGwoIi5pbnB1dC1wYXJlbnQiKS5jbGFzc2VkKCJpbnB1dC1wYXJlbnQiLCExKTtsYS5zZWxlY3RBbGwoIi5pbnB1dC1jaGlsZCIpLmNsYXNzZWQoImlucHV0LWNoaWxkIiwhMSk7bGEuc2VsZWN0QWxsKCIuaW5wdXQtZWRnZS1oaWdobGlnaHQiKS5jbGFzc2VkKCJpbnB1dC1lZGdlLWhpZ2hsaWdodCIsITEpO2xhLnNlbGVjdEFsbCgiLm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCIpLmNsYXNzZWQoIm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCIsITEpO2xhLnNlbGVjdEFsbCgiLmlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZCIpLmNsYXNzZWQoImlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZCIsITEpO2lmKGNhJiZkYSYmZmEpe2ZhPUsoZmEsY2EpO3ZhciBaPXt9O18uZWFjaChmYSxmdW5jdGlvbihGYSl7Wj1NKGFhLGNhLEZhLFopfSk7ZmE9T2JqZWN0LmtleXMoWik7ZmE9UihjYSxmYSk7VShhYSxmYSk7bGEuc2VsZWN0QWxsKCJnLm5vZGU6bm90KC5zZWxlY3RlZCk6bm90KC5pbnB1dC1oaWdobGlnaHQpOm5vdCguaW5wdXQtcGFyZW50KTpub3QoLmlucHV0LWNoaWxkcmVuKSIpLmNsYXNzZWQoIm5vbi1pbnB1dCIsCiEwKS5lYWNoKGZ1bmN0aW9uKEZhKXtsYS5zZWxlY3RBbGwoYFtkYXRhLW5hbWU9IiR7RmEubm9kZS5uYW1lfSJdYCkuY2xhc3NlZCgibm9uLWlucHV0IiwhMCl9KTtsYS5zZWxlY3RBbGwoImcuZWRnZTpub3QoLmlucHV0LWVkZ2UtaGlnaGxpZ2h0KSIpLmNsYXNzZWQoIm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApfX07Zi5nZXRWaXNpYmxlUGFyZW50PVl9KShkLm5vZGV8fChkLm5vZGU9e30pKX0pKGMuc2NlbmV8fChjLnNjZW5lPXt9KSl9KShhLmdyYXBofHwoYS5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9vcC5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXtjbGFzcyBme2lzTm90VHB1T3AoZyl7cmV0dXJuLTEhPWcudG9Mb3dlckNhc2UoKS5zZWFyY2goImNwdToiKXx8LTEhPWcudG9Mb3dlckNhc2UoKS5zZWFyY2goImdwdToiKT8hMDotMT09Zy50b0xvd2VyQ2FzZSgpLnNlYXJjaCgidHB1Iil9b3BWYWxpZChnKXtyZXR1cm4gMD09Zy5uYW1lLnNlYXJjaChjLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgpfHwhZy5vcHx8Zy5kZXZpY2UmJnRoaXMuaXNOb3RUcHVPcChnLmRldmljZSl8fGcuZGV2aWNlJiYtMSE9Zy5kZXZpY2Uuc2VhcmNoKCJUUFVfU1lTVEVNIik/ITA6Xy5pbmNsdWRlcyhmLldISVRFTElTVCxnLm9wKX19Zi5XSElURUxJU1Q9IkFicyBBY29zIEFjb3NoIEFkZCBBZGROIEFkanVzdENvbnRyYXN0djIgQWRqdXN0SHVlIEFkanVzdFNhdHVyYXRpb24gQWxsIEFuZ2xlIEFueSBBcHByb3hpbWF0ZUVxdWFsIEFyZ01heCBBcmdNaW4gQXNpbiBBc2luaCBBc3NlcnQgQXNzaWduQWRkVmFyaWFibGVPcCBBc3NpZ25TdWJWYXJpYWJsZU9wIEFzc2lnblZhcmlhYmxlT3AgQXRhbiBBdGFuMiBBdGFuaCBBdmdQb29sIEF2Z1Bvb2wzRCBBdmdQb29sM0RHcmFkIEF2Z1Bvb2xHcmFkIEJhdGNoTWF0TXVsIEJhdGNoVG9TcGFjZSBCYXRjaFRvU3BhY2VORCBCaWFzQWRkIEJpYXNBZGRHcmFkIEJpYXNBZGRWMSBCaXRjYXN0IEJpdHdpc2VBbmQgQml0d2lzZU9yIEJpdHdpc2VYb3IgQnJvYWRjYXN0QXJncyBCcm9hZGNhc3RHcmFkaWVudEFyZ3MgQnVja2V0aXplIENhc3QgQ2VpbCBDaGVja051bWVyaWNzIENob2xlc2t5IENsaXBCeVZhbHVlIENvbXBsZXggQ29tcGxleEFicyBDb25jYXQgQ29uY2F0T2Zmc2V0IENvbmNhdFYyIENvbmogQ29uanVnYXRlVHJhbnNwb3NlIENvbnN0IENvbnRyb2xUcmlnZ2VyIENvbnYyRCBDb252MkRCYWNrcHJvcEZpbHRlciBDb252MkRCYWNrcHJvcElucHV0IENvbnYzRCBDb252M0RCYWNrcHJvcEZpbHRlclYyIENvbnYzREJhY2twcm9wSW5wdXRWMiBDb3MgQ29zaCBDcm9zcyBDcm9zc1JlcGxpY2FTdW0gQ3VtcHJvZCBDdW1zdW0gRGVwdGhUb1NwYWNlIERlcHRod2lzZUNvbnYyZE5hdGl2ZSBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0IERpYWcgRGlhZ1BhcnQgRGlnYW1tYSBEaXYgRHluYW1pY1N0aXRjaCBFbHUgRWx1R3JhZCBFbXB0eSBFcXVhbCBFcmYgRXJmYyBFeHAgRXhwYW5kRGltcyBFeHBtMSBFeHRyYWN0SW1hZ2VQYXRjaGVzIEZGVCBGRlQyRCBGRlQzRCBGYWtlUXVhbnRXaXRoTWluTWF4QXJncyBGYWtlUXVhbnRXaXRoTWluTWF4QXJnc0dyYWRpZW50IEZha2VRdWFudFdpdGhNaW5NYXhWYXJzIEZha2VRdWFudFdpdGhNaW5NYXhWYXJzR3JhZGllbnQgRmlsbCBGbG9vciBGbG9vckRpdiBGbG9vck1vZCBGdXNlZEJhdGNoTm9ybSBGdXNlZEJhdGNoTm9ybUdyYWQgRnVzZWRCYXRjaE5vcm1HcmFkVjIgRnVzZWRCYXRjaE5vcm1WMiBHYXRoZXIgR2F0aGVyTmQgR2F0aGVyVjIgR2V0SXRlbSBHcmVhdGVyIEdyZWF0ZXJFcXVhbCBIU1ZUb1JHQiBJRkZUIElGRlQyRCBJRkZUM0QgSVJGRlQgSVJGRlQyRCBJUkZGVDNEIElkZW50aXR5IElkZW50aXR5TiBJZiBJbWFnIEluZmVlZERlcXVldWUgSW5mZWVkRGVxdWV1ZVR1cGxlIElucGxhY2VBZGQgSW5wbGFjZVVwZGF0ZSBJbnYgSW52ZXJ0IEludmVydFBlcm11dGF0aW9uIElzRmluaXRlIElzSW5mIElzTmFuIEwyTG9zcyBMUk4gTFJOR3JhZCBMZWZ0U2hpZnQgTGVzcyBMZXNzRXF1YWwgTGdhbW1hIExpblNwYWNlIExpc3REaWZmIExvZyBMb2cxcCBMb2dTb2Z0bWF4IExvZ2ljYWxBbmQgTG9naWNhbE5vdCBMb2dpY2FsT3IgTWF0TXVsIE1hdHJpeEJhbmRQYXJ0IE1hdHJpeERpYWcgTWF0cml4RGlhZ1BhcnQgTWF0cml4U2V0RGlhZyBNYXRyaXhUcmlhbmd1bGFyU29sdmUgTWF4IE1heFBvb2wgTWF4UG9vbDNEIE1heFBvb2wzREdyYWQgTWF4UG9vbDNER3JhZEdyYWQgTWF4UG9vbEdyYWQgTWF4UG9vbEdyYWRHcmFkIE1heFBvb2xHcmFkR3JhZFYyIE1heFBvb2xHcmFkVjIgTWF4UG9vbFYyIE1heGltdW0gTWVhbiBNaW4gTWluaW11bSBNaXJyb3JQYWQgTW9kIE11bCBNdWx0aW5vbWlhbCBOZWcgTm9PcCBOb25NYXhTdXBwcmVzc2lvblY0IE5vdEVxdWFsIE9uZUhvdCBPbmVzTGlrZSBPdXRmZWVkRW5xdWV1ZSBPdXRmZWVkRW5xdWV1ZVR1cGxlIFBhY2sgUGFkIFBhZFYyIFBhcmFsbGVsRHluYW1pY1N0aXRjaCBQbGFjZWhvbGRlcldpdGhEZWZhdWx0IFBvdyBQcmV2ZW50R3JhZGllbnQgUHJvZCBRciBRdWFudGl6ZUFuZERlcXVhbnRpemVWMiBRdWFudGl6ZUFuZERlcXVhbnRpemVWMyBSRkZUIFJGRlQyRCBSRkZUM0QgUkdCVG9IU1YgUmFuZG9tU2h1ZmZsZSBSYW5kb21TdGFuZGFyZE5vcm1hbCBSYW5kb21Vbmlmb3JtIFJhbmRvbVVuaWZvcm1JbnQgUmFuZ2UgUmFuayBSZWFkVmFyaWFibGVPcCBSZWFsIFJlYWxEaXYgUmVjaXByb2NhbCBSZWNpcHJvY2FsR3JhZCBSZWN2VFBVRW1iZWRkaW5nQWN0aXZhdGlvbnMgUmVsdSBSZWx1NiBSZWx1NkdyYWQgUmVsdUdyYWQgUmVzaGFwZSBSZXNpemVCaWxpbmVhciBSZXNpemVCaWxpbmVhckdyYWQgUmVzb3VyY2VBcHBseUFkYU1heCBSZXNvdXJjZUFwcGx5QWRhZGVsdGEgUmVzb3VyY2VBcHBseUFkYWdyYWQgUmVzb3VyY2VBcHBseUFkYWdyYWREQSBSZXNvdXJjZUFwcGx5QWRhbSBSZXNvdXJjZUFwcGx5QWRkU2lnbiBSZXNvdXJjZUFwcGx5Q2VudGVyZWRSTVNQcm9wIFJlc291cmNlQXBwbHlGdHJsIFJlc291cmNlQXBwbHlGdHJsVjIgUmVzb3VyY2VBcHBseUdyYWRpZW50RGVzY2VudCBSZXNvdXJjZUFwcGx5TW9tZW50dW0gUmVzb3VyY2VBcHBseVBvd2VyU2lnbiBSZXNvdXJjZUFwcGx5UHJveGltYWxBZGFncmFkIFJlc291cmNlQXBwbHlQcm94aW1hbEdyYWRpZW50RGVzY2VudCBSZXNvdXJjZUFwcGx5Uk1TUHJvcCBSZXNvdXJjZUdhdGhlciBSZXNvdXJjZVNjYXR0ZXJBZGQgUmVzb3VyY2VTY2F0dGVyRGl2IFJlc291cmNlU2NhdHRlck1heCBSZXNvdXJjZVNjYXR0ZXJNaW4gUmVzb3VyY2VTY2F0dGVyTXVsIFJlc291cmNlU2NhdHRlck5kQWRkIFJlc291cmNlU2NhdHRlck5kVXBkYXRlIFJlc291cmNlU2NhdHRlclN1YiBSZXNvdXJjZVNjYXR0ZXJVcGRhdGUgUmVzb3VyY2VTdHJpZGVkU2xpY2VBc3NpZ24gUmV2ZXJzZSBSZXZlcnNlU2VxdWVuY2UgUmV2ZXJzZVYyIFJpZ2h0U2hpZnQgUmludCBSb3VuZCBSc3FydCBSc3FydEdyYWQgU2NhdHRlck5kIFNlbGVjdCBTZWx1IFNlbHVHcmFkIFNlbmRUUFVFbWJlZGRpbmdHcmFkaWVudHMgU2hhcGUgU2hhcGVOIFNpZ21vaWQgU2lnbW9pZEdyYWQgU2lnbiBTaW4gU2luaCBTaXplIFNsaWNlIFNuYXBzaG90IFNvZnRtYXggU29mdG1heENyb3NzRW50cm9weVdpdGhMb2dpdHMgU29mdHBsdXMgU29mdHBsdXNHcmFkIFNvZnRzaWduIFNvZnRzaWduR3JhZCBTcGFjZVRvQmF0Y2ggU3BhY2VUb0JhdGNoTkQgU3BhY2VUb0RlcHRoIFNwYXJzZU1hdE11bCBTcGFyc2VTb2Z0bWF4Q3Jvc3NFbnRyb3B5V2l0aExvZ2l0cyBTcGFyc2VUb0RlbnNlIFNwbGl0IFNwbGl0ViBTcXJ0IFNxcnRHcmFkIFNxdWFyZSBTcXVhcmVkRGlmZmVyZW5jZSBTcXVlZXplIFN0YWNrQ2xvc2VWMiBTdGFja1BvcFYyIFN0YWNrUHVzaFYyIFN0YWNrVjIgU3RhdGVsZXNzSWYgU3RhdGVsZXNzUmFuZG9tTm9ybWFsIFN0YXRlbGVzc1JhbmRvbVVuaWZvcm0gU3RhdGVsZXNzVHJ1bmNhdGVkTm9ybWFsIFN0YXRlbGVzc1doaWxlIFN0b3BHcmFkaWVudCBTdHJpZGVkU2xpY2UgU3RyaWRlZFNsaWNlR3JhZCBTdWIgU3VtIFN5bWJvbGljR3JhZGllbnQgVFBVRW1iZWRkaW5nQWN0aXZhdGlvbnMgVGFuIFRhbmggVGFuaEdyYWQgVGVuc29yQXJyYXlDbG9zZVYzIFRlbnNvckFycmF5Q29uY2F0VjMgVGVuc29yQXJyYXlHYXRoZXJWMyBUZW5zb3JBcnJheUdyYWRWMyBUZW5zb3JBcnJheVJlYWRWMyBUZW5zb3JBcnJheVNjYXR0ZXJWMyBUZW5zb3JBcnJheVNpemVWMyBUZW5zb3JBcnJheVNwbGl0VjMgVGVuc29yQXJyYXlWMyBUZW5zb3JBcnJheVdyaXRlVjMgVGlsZSBUb3BLVjIgVHJhbnNwb3NlIFRydW5jYXRlRGl2IFRydW5jYXRlTW9kIFRydW5jYXRlZE5vcm1hbCBVbnBhY2sgVW5zb3J0ZWRTZWdtZW50TWF4IFVuc29ydGVkU2VnbWVudE1pbiBVbnNvcnRlZFNlZ21lbnRQcm9kIFVuc29ydGVkU2VnbWVudFN1bSBWYXJJc0luaXRpYWxpemVkT3AgVmFyaWFibGVTaGFwZSBXaGlsZSBYbGFEeW5hbWljVXBkYXRlU2xpY2UgWGxhSG9zdENvbXB1dGUgWGxhSWYgWGxhUmVjdiBYbGFSZWR1Y2VXaW5kb3cgWGxhU2VuZCBYbGFTb3J0IFhsYVdoaWxlIFplcm9zTGlrZSBFbnRlciBFeGl0IExvb3BDb25kIE1lcmdlIE5leHRJdGVyYXRpb24gU3dpdGNoIF9BcmcgX1BhcmFsbGVsQ29uY2F0VXBkYXRlIF9SZXR2YWwgX1RQVUNvbXBpbGUgX1RQVUV4ZWN1dGUgVFBVQ29tcGlsYXRpb25SZXN1bHQgVFBVUmVwbGljYXRlZElucHV0IFRQVVJlcGxpY2F0ZWRPdXRwdXQgVFBVUmVwbGljYXRlTWV0YWRhdGEgTWVyZ2VWMkNoZWNrcG9pbnRzIFJlc3RvcmVWMiBTYXZlVjIgQWJvcnQgQXNzZXJ0IEFzc2lnbiBQbGFjZWhvbGRlciBQbGFjZWhvbGRlclYyIFNoYXJkZWRGaWxlbmFtZSBTdHJpbmdKb2luIFZhcmlhYmxlIFZhcmlhYmxlVjIgVmFySGFuZGxlT3AgQXVkaW9TdW1tYXJ5IEF1ZGlvU3VtbWFyeVYyIERlYnVnTnVtZXJpY1N1bW1hcnkgSGlzdG9ncmFtU3VtbWFyeSBJbWFnZVN1bW1hcnkgTWVyZ2VTdW1tYXJ5IFNjYWxhclN1bW1hcnkgU3RhdHNBZ2dyZWdhdG9yU3VtbWFyeSIuc3BsaXQoIiAiKTsKZC5UcHVDb21wYXRpYmlsaXR5UHJvdmlkZXI9ZjtkLmNoZWNrT3BzRm9yQ29tcGF0aWJpbGl0eT1mdW5jdGlvbihnLGwpe2lmKG51bGw9PT1sKXRocm93IEVycm9yKCJDb21wYXRpYmlsaXR5IHByb3ZpZGVyIHJlcXVpcmVkLCBidXQgZ290OiAiK2wpO18uZWFjaChnLm5vZGVzLGs9PntrLmNvbXBhdGlibGU9bC5vcFZhbGlkKGspO18uZWFjaChrLmluRW1iZWRkaW5ncyxuPT57bi5jb21wYXRpYmxlPWwub3BWYWxpZChuKX0pO18uZWFjaChrLm91dEVtYmVkZGluZ3Msbj0+e24uY29tcGF0aWJsZT1sLm9wVmFsaWQobil9KX0pfX0pKGMub3B8fChjLm9wPXt9KSl9KShhLmdyYXBofHwoYS5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9wYXJzZXIuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7ZnVuY3Rpb24gZih0KXtpZigidHJ1ZSI9PT10KXJldHVybiEwO2lmKCJmYWxzZSI9PT10KXJldHVybiExO2lmKCciJz09PXRbMF0pcmV0dXJuIHQuc3Vic3RyaW5nKDEsdC5sZW5ndGgtMSk7bGV0IHY9cGFyc2VGbG9hdCh0KTtyZXR1cm4gaXNOYU4odik/dDp2fWZ1bmN0aW9uIGcodCl7cmV0dXJuIG5ldyBQcm9taXNlKCh2LHkpPT57ZmV0Y2godCkudGhlbih6PT57ei5vaz96LmFycmF5QnVmZmVyKCkudGhlbih2LHkpOnoudGV4dCgpLnRoZW4oeSx5KX0pfSl9ZnVuY3Rpb24gbCh0LHYseT0xRTYsej0iXG4iKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oeCxDKXtmdW5jdGlvbiBGKEQsQixJKXt2YXIgTz1JPj10LmJ5dGVMZW5ndGg7Qj1CLnNwbGl0KHopO0JbMF09RCtCWzBdO2NvbnN0IFA9Tz8iIjpCLnBvcCgpO2ZvcihsZXQgSCBvZiBCKXRyeXt2KEgpfWNhdGNoKEspe0MoSyk7cmV0dXJufU8/eCghMCk6CihEPW5ldyBCbG9iKFt0LnNsaWNlKEksSSt5KV0pLE89bmV3IEZpbGVSZWFkZXIsTy5vbmxvYWQ9ZnVuY3Rpb24oSCl7RihQLEgudGFyZ2V0LnJlc3VsdCxJK3kpfSxPLnJlYWRBc1RleHQoRCkpfUYoIiIsIiIsMCl9KX1mdW5jdGlvbiBrKHQpe3JldHVybiBwKHQscSl9ZnVuY3Rpb24gbih0KXtyZXR1cm4gcCh0LHIpLnRoZW4odj0+di5zdGVwX3N0YXRzKX1mdW5jdGlvbiBwKHQsdil7ZnVuY3Rpb24geShCKXtsZXQgST1CLmluZGV4T2YoIjoiKSxPPUIuc3Vic3RyaW5nKDAsSSkudHJpbSgpO0I9ZihCLnN1YnN0cmluZyhJKzIpLnRyaW0oKSk7cmV0dXJue25hbWU6Tyx2YWx1ZTpCfX1mdW5jdGlvbiB6KEIsSSxPLFApe2xldCBIPUJbSV07bnVsbD09SD9CW0ldPVAuam9pbigiLiIpaW4gdj9bT106TzpBcnJheS5pc0FycmF5KEgpP0gucHVzaChPKTpCW0ldPVtILE9dfWxldCB4PXt9LEM9W10sRj1bXSxEPXg7cmV0dXJuIGwodCxmdW5jdGlvbihCKXtpZihCKXN3aXRjaChCPUIudHJpbSgpLApCW0IubGVuZ3RoLTFdKXtjYXNlICJ7IjpCPUIuc3Vic3RyaW5nKDAsQi5sZW5ndGgtMikudHJpbSgpO2xldCBJPXt9O0MucHVzaChEKTtGLnB1c2goQik7eihELEIsSSxGKTtEPUk7YnJlYWs7Y2FzZSAifSI6RD1DLnBvcCgpO0YucG9wKCk7YnJlYWs7ZGVmYXVsdDpCPXkoQikseihELEIubmFtZSxCLnZhbHVlLEYuY29uY2F0KEIubmFtZSkpfX0pLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4geH0pfWQuZmV0Y2hQYlR4dD1nO2QuZmV0Y2hBbmRQYXJzZU1ldGFkYXRhPWZ1bmN0aW9uKHQsdil7cmV0dXJuIGEuZ3JhcGgudXRpbC5ydW5UYXNrKCJSZWFkaW5nIG1ldGFkYXRhIHBidHh0Iiw0MCwoKT0+bnVsbD09dD9Qcm9taXNlLnJlc29sdmUobnVsbCk6Zyh0KSx2KS50aGVuKHk9PmEuZ3JhcGgudXRpbC5ydW5Bc3luY1Byb21pc2VUYXNrKCJQYXJzaW5nIG1ldGFkYXRhLnBidHh0Iiw2MCwoKT0+bnVsbCE9eT9uKHkpOlByb21pc2UucmVzb2x2ZShudWxsKSx2KSl9O2QuZmV0Y2hBbmRQYXJzZUdyYXBoRGF0YT0KZnVuY3Rpb24odCx2LHkpe3JldHVybiBhLmdyYXBoLnV0aWwucnVuQXN5bmNQcm9taXNlVGFzaygiUmVhZGluZyBncmFwaCBwYnR4dCIsNDAsKCk9PnY/bmV3IFByb21pc2UoZnVuY3Rpb24oeix4KXtsZXQgQz1uZXcgRmlsZVJlYWRlcjtDLm9ubG9hZD0oKT0+eihDLnJlc3VsdCk7Qy5vbmVycm9yPSgpPT54KEMuZXJyb3IpO0MucmVhZEFzQXJyYXlCdWZmZXIodil9KTpnKHQpLHkpLnRoZW4oej0+YS5ncmFwaC51dGlsLnJ1bkFzeW5jUHJvbWlzZVRhc2soIlBhcnNpbmcgZ3JhcGgucGJ0eHQiLDYwLCgpPT5rKHopLHkpKX07ZC5zdHJlYW1QYXJzZT1sO2NvbnN0IHE9eyJsaWJyYXJ5LmZ1bmN0aW9uIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZiI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuaW5wdXQiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5iIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QuZiI6ITAsCiJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5mdW5jIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QuaSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnMiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5zaGFwZSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnNoYXBlLmRpbSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnRlbnNvciI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnR5cGUiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUuc2hhcGUuZGltIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLnRlbnNvci5zdHJpbmdfdmFsIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLnRlbnNvci50ZW5zb3Jfc2hhcGUuZGltIjohMCwKImxpYnJhcnkuZnVuY3Rpb24uc2lnbmF0dXJlLmlucHV0X2FyZyI6ITAsImxpYnJhcnkuZnVuY3Rpb24uc2lnbmF0dXJlLm91dHB1dF9hcmciOiEwLCJsaWJyYXJ5LnZlcnNpb25zIjohMCxub2RlOiEwLCJub2RlLmlucHV0IjohMCwibm9kZS5hdHRyIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QuYiI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LmYiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5mdW5jIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QuaSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnMiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5zaGFwZSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnNoYXBlLmRpbSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnRlbnNvciI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnR5cGUiOiEwLCJub2RlLmF0dHIudmFsdWUuc2hhcGUuZGltIjohMCwibm9kZS5hdHRyLnZhbHVlLnRlbnNvci5zdHJpbmdfdmFsIjohMCwibm9kZS5hdHRyLnZhbHVlLnRlbnNvci50ZW5zb3Jfc2hhcGUuZGltIjohMH0sCnI9eyJzdGVwX3N0YXRzLmRldl9zdGF0cyI6ITAsInN0ZXBfc3RhdHMuZGV2X3N0YXRzLm5vZGVfc3RhdHMiOiEwLCJzdGVwX3N0YXRzLmRldl9zdGF0cy5ub2RlX3N0YXRzLm91dHB1dCI6ITAsInN0ZXBfc3RhdHMuZGV2X3N0YXRzLm5vZGVfc3RhdHMubWVtb3J5IjohMCwic3RlcF9zdGF0cy5kZXZfc3RhdHMubm9kZV9zdGF0cy5vdXRwdXQudGVuc29yX2Rlc2NyaXB0aW9uLnNoYXBlLmRpbSI6ITB9O2QucGFyc2VHcmFwaFBiVHh0PWs7ZC5wYXJzZVN0YXRzUGJUeHQ9bn0pKGMucGFyc2VyfHwoYy5wYXJzZXI9e30pKX0pKGEuZ3JhcGh8fChhLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3Byb3RvLmpzCgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3JlbmRlci5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXtmdW5jdGlvbiBmKEwsUixVLFksYmEpe1I9bmV3IEkoUixVLFksYmEsITApO0wuaW5Bbm5vdGF0aW9ucy5wdXNoKFIpfWZ1bmN0aW9uIGcoTCxSLFUsWSxiYSl7Uj1uZXcgSShSLFUsWSxiYSwhMSk7TC5vdXRBbm5vdGF0aW9ucy5wdXNoKFIpfWZ1bmN0aW9uIGwoTCxSKXtfLmVhY2goTC5ub2RlcygpLFU9PntVPUwubm9kZShVKTtVLmV4cGFuZGVkPTE8UjtpZigwPFIpc3dpdGNoKFUubm9kZS50eXBlKXtjYXNlIGMuTm9kZVR5cGUuTUVUQTpjYXNlIGMuTm9kZVR5cGUuU0VSSUVTOmsoVSxSLTEpfX0pfWZ1bmN0aW9uIGsoTCxSKXtMLmNvcmVHcmFwaCYmbChMLmNvcmVHcmFwaCxSKX1mdW5jdGlvbiBuKEwsUixVKXtsZXQgWT1MLm5vZGUoUiksYmE9TC5ub2RlKFUpLG1hPUwuZWRnZShSLFUpO2lmKFkubm9kZS5pbmNsdWRlIT09Yy5JbmNsdXNpb25UeXBlLklOQ0xVREUmJmJhLm5vZGUuaW5jbHVkZSE9PWMuSW5jbHVzaW9uVHlwZS5JTkNMVURFfHwKWS5ub2RlLmluY2x1ZGU9PT1jLkluY2x1c2lvblR5cGUuRVhDTFVERXx8YmEubm9kZS5pbmNsdWRlPT09Yy5JbmNsdXNpb25UeXBlLkVYQ0xVREUpZyhZLGJhLm5vZGUsYmEsbWEsTy5TSE9SVENVVCksZihiYSxZLm5vZGUsWSxtYSxPLlNIT1JUQ1VUKSxMLnJlbW92ZUVkZ2UoUixVKX1mdW5jdGlvbiBwKEwsUixVKXtsZXQgWT1MLmNvcmVHcmFwaCxiYT1ZLm5vZGUoUik7YmEuaXNPdXRFeHRyYWN0PSEwO18uZWFjaChZLnByZWRlY2Vzc29ycyhSKSxtYT0+e24oWSxtYSxSKX0pOyhGLmRldGFjaEFsbEVkZ2VzRm9ySGlnaERlZ3JlZXx8VSkmJl8uZWFjaChZLnN1Y2Nlc3NvcnMoUiksbWE9PntuKFksUixtYSl9KTswPT09WS5uZWlnaGJvcnMoUikubGVuZ3RoJiYoYmEubm9kZS5pbmNsdWRlPWMuSW5jbHVzaW9uVHlwZS5FWENMVURFLEwuaXNvbGF0ZWRPdXRFeHRyYWN0LnB1c2goYmEpLFkucmVtb3ZlTm9kZShSKSl9ZnVuY3Rpb24gcShMLFIsVSl7bGV0IFk9TC5jb3JlR3JhcGgsYmE9Clkubm9kZShSKTtiYS5pc0luRXh0cmFjdD0hMDtfLmVhY2goWS5zdWNjZXNzb3JzKFIpLG1hPT57bihZLFIsbWEpfSk7KEYuZGV0YWNoQWxsRWRnZXNGb3JIaWdoRGVncmVlfHxVKSYmXy5lYWNoKFkucHJlZGVjZXNzb3JzKFIpLG1hPT57bihZLG1hLFIpfSk7MD09PVkubmVpZ2hib3JzKFIpLmxlbmd0aCYmKGJhLm5vZGUuaW5jbHVkZT1jLkluY2x1c2lvblR5cGUuRVhDTFVERSxMLmlzb2xhdGVkSW5FeHRyYWN0LnB1c2goYmEpLFkucmVtb3ZlTm9kZShSKSl9ZnVuY3Rpb24gcihMLFIpe2lmKEwudHlwZT09PWMuTm9kZVR5cGUuT1ApZm9yKHZhciBVPTA7VTxSLmxlbmd0aDtVKyspe2lmKEwub3A9PT1SW1VdKXJldHVybiEwfWVsc2UgaWYoTC50eXBlPT09Yy5Ob2RlVHlwZS5NRVRBJiYoTD1MLmdldFJvb3RPcCgpKSlmb3IoVT0wO1U8Ui5sZW5ndGg7VSsrKWlmKEwub3A9PT1SW1VdKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIHQoTCl7bGV0IFI9TC5jb3JlR3JhcGg7Xy5lYWNoKFIubm9kZXMoKSwKVT0+e1Iubm9kZShVKS5ub2RlLmluY2x1ZGUhPT1jLkluY2x1c2lvblR5cGUuRVhDTFVERXx8VS5zdGFydHNXaXRoKGEuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCl8fChMLmNvcmVHcmFwaC5vdXRFZGdlcyhVKS5sZW5ndGg+TC5jb3JlR3JhcGguaW5FZGdlcyhVKS5sZW5ndGg/cChMLFUsITApOnEoTCxVLCEwKSl9KX1mdW5jdGlvbiB2KEwpe2xldCBSPUwuY29yZUdyYXBoO18uZWFjaChSLm5vZGVzKCksVT0+e2xldCBZPVIubm9kZShVKTtZLm5vZGUuaW5jbHVkZT09PWMuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCYmcihZLm5vZGUsRi5vdXRFeHRyYWN0VHlwZXMpJiZwKEwsVSl9KX1mdW5jdGlvbiB5KEwpe2xldCBSPUwuY29yZUdyYXBoO18uZWFjaChSLm5vZGVzKCksVT0+e2xldCBZPVIubm9kZShVKTtZLm5vZGUuaW5jbHVkZT09PWMuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCYmcihZLm5vZGUsRi5pbkV4dHJhY3RUeXBlcykmJnEoTCxVKX0pfWZ1bmN0aW9uIHooTCl7bGV0IFI9CkwuY29yZUdyYXBoLFU9e30sWT17fSxiYT0wO18uZWFjaChSLm5vZGVzKCksbGE9PntpZihSLm5vZGUobGEpLm5vZGUuaW5jbHVkZT09PWMuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCl7dmFyIFo9Xy5yZWR1Y2UoUi5wcmVkZWNlc3NvcnMobGEpLCh4YSx5YSk9Pnt5YT1SLmVkZ2UoeWEsbGEpLm1ldGFlZGdlO3JldHVybiB4YSsoeWEubnVtUmVndWxhckVkZ2VzPzE6MCl9LDApOzA9PT1aJiYwPFIucHJlZGVjZXNzb3JzKGxhKS5sZW5ndGgmJihaPVIucHJlZGVjZXNzb3JzKGxhKS5sZW5ndGgpO3ZhciBGYT1fLnJlZHVjZShSLnN1Y2Nlc3NvcnMobGEpLCh4YSx5YSk9Pnt5YT1SLmVkZ2UobGEseWEpLm1ldGFlZGdlO3JldHVybiB4YSsoeWEubnVtUmVndWxhckVkZ2VzPzE6MCl9LDApOzA9PT1GYSYmMDxSLnN1Y2Nlc3NvcnMobGEpLmxlbmd0aCYmKEZhPVIuc3VjY2Vzc29ycyhsYSkubGVuZ3RoKTtVW2xhXT1aO1lbbGFdPUZhO2JhKyt9fSk7aWYoIShiYTxGLm1pbk5vZGVDb3VudEZvckV4dHJhY3Rpb24pKXt2YXIgbWE9CkYubWluRGVncmVlRm9yRXh0cmFjdGlvbi0xLGFhPU1hdGgucm91bmQoLjc1KmJhKSxjYT1NYXRoLnJvdW5kKC4yNSpiYSksZmE9T2JqZWN0LmtleXMoVSkuc29ydCgobGEsWik9PlVbbGFdLVVbWl0pLGRhPVVbZmFbYWFdXTtkYT1kYStkYS1VW2ZhW2NhXV07ZGE9TWF0aC5tYXgoZGEsbWEpO2ZvcihsZXQgbGE9YmEtMTtVW2ZhW2xhXV0+ZGE7bGEtLSlxKEwsZmFbbGFdKTtmYT1PYmplY3Qua2V5cyhZKS5zb3J0KChsYSxaKT0+WVtsYV0tWVtaXSk7YWE9WVtmYVthYV1dO2NhPWFhKzQqKGFhLVlbZmFbY2FdXSk7Y2E9TWF0aC5tYXgoY2EsbWEpO2ZvcihtYT1iYS0xO1lbZmFbbWFdXT5jYTttYS0tKShhYT1SLm5vZGUoZmFbbWFdKSkmJiFhYS5pc0luRXh0cmFjdCYmcChMLGZhW21hXSl9fWZ1bmN0aW9uIHgoTCl7bGV0IFI9TC5jb3JlR3JhcGgsVT17fTtfLmVhY2goUi5lZGdlcygpLFk9PntSLmVkZ2UoWSkubWV0YWVkZ2UubnVtUmVndWxhckVkZ2VzfHwoKFVbWS52XT1VW1kudl18fApbXSkucHVzaChZKSwoVVtZLnddPVVbWS53XXx8W10pLnB1c2goWSkpfSk7Xy5lYWNoKFUsWT0+e1kubGVuZ3RoPkYubWF4Q29udHJvbERlZ3JlZSYmXy5lYWNoKFksYmE9Pm4oUixiYS52LGJhLncpKX0pfWZ1bmN0aW9uIEMoTCl7dChMKTtGLm91dEV4dHJhY3RUeXBlcyYmdihMKTtGLmluRXh0cmFjdFR5cGVzJiZ5KEwpO3ooTCk7Ri5tYXhDb250cm9sRGVncmVlJiZ4KEwpO2xldCBSPUwuY29yZUdyYXBoO18uZWFjaChSLm5vZGVzKCksVT0+e2xldCBZPVIubm9kZShVKTt2YXIgYmE9Ui5uZWlnaGJvcnMoVSkubGVuZ3RoO2lmKFkubm9kZS5pbmNsdWRlPT09Yy5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEJiYwPT09YmEpe2JhPTA8WS5vdXRBbm5vdGF0aW9ucy5saXN0Lmxlbmd0aDtsZXQgbWE9MDxZLmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGg7WS5pc0luRXh0cmFjdD8oTC5pc29sYXRlZEluRXh0cmFjdC5wdXNoKFkpLFkubm9kZS5pbmNsdWRlPWMuSW5jbHVzaW9uVHlwZS5FWENMVURFLApSLnJlbW92ZU5vZGUoVSkpOlkuaXNPdXRFeHRyYWN0PyhMLmlzb2xhdGVkT3V0RXh0cmFjdC5wdXNoKFkpLFkubm9kZS5pbmNsdWRlPWMuSW5jbHVzaW9uVHlwZS5FWENMVURFLFIucmVtb3ZlTm9kZShVKSk6Ri5leHRyYWN0SXNvbGF0ZWROb2Rlc1dpdGhBbm5vdGF0aW9uc09uT25lU2lkZSYmKGJhJiYhbWE/KFkuaXNJbkV4dHJhY3Q9ITAsTC5pc29sYXRlZEluRXh0cmFjdC5wdXNoKFkpLFkubm9kZS5pbmNsdWRlPWMuSW5jbHVzaW9uVHlwZS5FWENMVURFLFIucmVtb3ZlTm9kZShVKSk6bWEmJiFiYSYmKFkuaXNPdXRFeHRyYWN0PSEwLEwuaXNvbGF0ZWRPdXRFeHRyYWN0LnB1c2goWSksWS5ub2RlLmluY2x1ZGU9Yy5JbmNsdXNpb25UeXBlLkVYQ0xVREUsUi5yZW1vdmVOb2RlKFUpKSl9fSl9ZC5PcE5vZGVDb2xvcnM9e0RFRkFVTFRfRklMTDoiI2ZmZmZmZiIsREVGQVVMVF9TVFJPS0U6IiNiMmIyYjIiLENPTVBBVElCTEU6IiMwZjlkNTgiLElOQ09NUEFUSUJMRToiI2RiNDQzNyJ9OwpkLk1ldGFub2RlQ29sb3JzPXtERUZBVUxUX0ZJTEw6IiNkOWQ5ZDkiLERFRkFVTFRfU1RST0tFOiIjYTZhNmE2IixTQVRVUkFUSU9OOi42LExJR0hUTkVTUzouODUsRVhQQU5ERURfQ09MT1I6IiNmMGYwZjAiLEhVRVM6WzIyMCwxMDAsMTgwLDQwLDIwLDM0MCwyNjAsMzAwLDE0MCw2MF0sU1RSVUNUVVJFX1BBTEVUVEUoTCxSKXt2YXIgVT1kLk1ldGFub2RlQ29sb3JzLkhVRVM7TD1VW0wlVS5sZW5ndGhdO1U9TWF0aC5zaW4oTCpNYXRoLlBJLzM2MCk7cmV0dXJuIGQzLmhzbChMLC4wMSooUj8zMDo5MC02MCpVKSwuMDEqKFI/OTU6ODApKS50b1N0cmluZygpfSxERVZJQ0VfUEFMRVRURShMKXtyZXR1cm4gZC5NZXRhbm9kZUNvbG9ycy5TVFJVQ1RVUkVfUEFMRVRURShMKX0sWExBX0NMVVNURVJfUEFMRVRURShMKXtyZXR1cm4gZC5NZXRhbm9kZUNvbG9ycy5TVFJVQ1RVUkVfUEFMRVRURShMKX0sVU5LTk9XTjoiI2VlZSIsR1JBRElFTlRfT1VUTElORToiIzg4OCJ9O2QuU2VyaWVzTm9kZUNvbG9ycz0Ke0RFRkFVTFRfRklMTDoid2hpdGUiLERFRkFVTFRfU1RST0tFOiIjYjJiMmIyIn07Y29uc3QgRj17ZW5hYmxlRXh0cmFjdGlvbjohMCxtaW5Ob2RlQ291bnRGb3JFeHRyYWN0aW9uOjE1LG1pbkRlZ3JlZUZvckV4dHJhY3Rpb246NSxtYXhDb250cm9sRGVncmVlOjQsbWF4QnJpZGdlUGF0aERlZ3JlZTo0LG91dEV4dHJhY3RUeXBlczpbIk5vT3AiXSxpbkV4dHJhY3RUeXBlczpbXSxkZXRhY2hBbGxFZGdlc0ZvckhpZ2hEZWdyZWU6ITAsZXh0cmFjdElzb2xhdGVkTm9kZXNXaXRoQW5ub3RhdGlvbnNPbk9uZVNpZGU6ITAsZW5hYmxlQnJpZGdlZ3JhcGg6ITAsbWluTWF4Q29sb3JzOlsiI2ZmZjVmMCIsIiNmYjZhNGEiXSxtYXhBbm5vdGF0aW9uczo1fSxEPW5ldyBSZWdFeHAoIl4oPzoiK2EuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCsiKT8oXFx3KylfW2EtejAtOV17OH0oPzpfXFxkKyk/JCIpO2NsYXNzIEJ7Y29uc3RydWN0b3IoTCxSKXt0aGlzLmhpZXJhcmNoeT1MOwp0aGlzLmRpc3BsYXlpbmdTdGF0cz1SO3RoaXMuaW5kZXg9e307dGhpcy5yZW5kZXJlZE9wTmFtZXM9W107dGhpcy5jb21wdXRlU2NhbGVzKCk7dGhpcy5oYXNTdWJoaWVyYXJjaHk9e307dGhpcy5yb290PW5ldyBNKEwucm9vdCxMLmdyYXBoT3B0aW9ucyk7dGhpcy5pbmRleFtMLnJvb3QubmFtZV09dGhpcy5yb290O3RoaXMucmVuZGVyZWRPcE5hbWVzLnB1c2goTC5yb290Lm5hbWUpO3RoaXMuYnVpbGRTdWJoaWVyYXJjaHkoTC5yb290Lm5hbWUpO3RoaXMucm9vdC5leHBhbmRlZD0hMDt0aGlzLnRyYWNlSW5wdXRzPSExfWNvbXB1dGVTY2FsZXMoKXt0aGlzLmRldmljZUNvbG9yTWFwPWQzLnNjYWxlT3JkaW5hbCgpLmRvbWFpbih0aGlzLmhpZXJhcmNoeS5kZXZpY2VzKS5yYW5nZShfLm1hcChkMy5yYW5nZSh0aGlzLmhpZXJhcmNoeS5kZXZpY2VzLmxlbmd0aCksZC5NZXRhbm9kZUNvbG9ycy5ERVZJQ0VfUEFMRVRURSkpO3RoaXMueGxhQ2x1c3RlckNvbG9yTWFwPWQzLnNjYWxlT3JkaW5hbCgpLmRvbWFpbih0aGlzLmhpZXJhcmNoeS54bGFDbHVzdGVycykucmFuZ2UoXy5tYXAoZDMucmFuZ2UodGhpcy5oaWVyYXJjaHkueGxhQ2x1c3RlcnMubGVuZ3RoKSwKZC5NZXRhbm9kZUNvbG9ycy5YTEFfQ0xVU1RFUl9QQUxFVFRFKSk7bGV0IEw9dGhpcy5oaWVyYXJjaHkucm9vdC5tZXRhZ3JhcGg7dmFyIFI9ZDMubWF4KEwubm9kZXMoKSxVPT57VT1MLm5vZGUoVSk7aWYobnVsbCE9VS5zdGF0cylyZXR1cm4gVS5zdGF0cy50b3RhbEJ5dGVzfSk7dGhpcy5tZW1vcnlVc2FnZVNjYWxlPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLFJdKS5yYW5nZShGLm1pbk1heENvbG9ycyk7Uj1kMy5tYXgoTC5ub2RlcygpLFU9PntVPUwubm9kZShVKTtpZihudWxsIT1VLnN0YXRzKXJldHVybiBVLnN0YXRzLmdldFRvdGFsTWljcm9zKCl9KTt0aGlzLmNvbXB1dGVUaW1lU2NhbGU9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzAsUl0pLnJhbmdlKEYubWluTWF4Q29sb3JzKTt0aGlzLmVkZ2VXaWR0aFNpemVkQmFzZWRTY2FsZT10aGlzLmhpZXJhcmNoeS5oYXNTaGFwZUluZm8/Yy5zY2VuZS5lZGdlLkVER0VfV0lEVEhfU0laRV9CQVNFRF9TQ0FMRTpkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMSwKdGhpcy5oaWVyYXJjaHkubWF4TWV0YUVkZ2VTaXplXSkucmFuZ2UoW2Muc2NlbmUuZWRnZS5NSU5fRURHRV9XSURUSCxjLnNjZW5lLmVkZ2UuTUFYX0VER0VfV0lEVEhdKX1nZXRSZW5kZXJOb2RlQnlOYW1lKEwpe3JldHVybiB0aGlzLmluZGV4W0xdfWdldE5vZGVCeU5hbWUoTCl7cmV0dXJuIHRoaXMuaGllcmFyY2h5Lm5vZGUoTCl9Y29sb3JIaXN0b2dyYW0oTCxSKXtpZigwPE9iamVjdC5rZXlzKEwpLmxlbmd0aCl7Y29uc3QgVT1fLnN1bShPYmplY3Qua2V5cyhMKS5tYXAoWT0+TFtZXSkpO3JldHVybiBPYmplY3Qua2V5cyhMKS5tYXAoWT0+KHtjb2xvcjpSKFkpLHByb3BvcnRpb246TFtZXS9VfSkpfWNvbnNvbGUuaW5mbygibm8gcGFpcnMgZm91bmQhIik7cmV0dXJuIG51bGx9Z2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKEwpe2lmKCFMKXJldHVybiBudWxsO2lmKEwgaW4gdGhpcy5pbmRleClyZXR1cm4gdGhpcy5pbmRleFtMXTt2YXIgUj10aGlzLmhpZXJhcmNoeS5ub2RlKEwpOwppZighUilyZXR1cm4gbnVsbDtsZXQgVT1SLmlzR3JvdXBOb2RlP25ldyBNKFIsdGhpcy5oaWVyYXJjaHkuZ3JhcGhPcHRpb25zKTpuZXcgSChSKTt0aGlzLmluZGV4W0xdPVU7dGhpcy5yZW5kZXJlZE9wTmFtZXMucHVzaChMKTtSLnN0YXRzJiYoVS5tZW1vcnlDb2xvcj10aGlzLm1lbW9yeVVzYWdlU2NhbGUoUi5zdGF0cy50b3RhbEJ5dGVzKSxVLmNvbXB1dGVUaW1lQ29sb3I9dGhpcy5jb21wdXRlVGltZVNjYWxlKFIuc3RhdHMuZ2V0VG90YWxNaWNyb3MoKSkpO1UuaXNGYWRlZE91dD10aGlzLmRpc3BsYXlpbmdTdGF0cyYmIWEuZ3JhcGgudXRpbC5oYXNEaXNwbGF5YWJsZU5vZGVTdGF0cyhSLnN0YXRzKTt2YXIgWT1udWxsLGJhPW51bGwsbWE9bnVsbDtpZihSLmlzR3JvdXBOb2RlKXtZPVIuZGV2aWNlSGlzdG9ncmFtO2JhPVIueGxhQ2x1c3Rlckhpc3RvZ3JhbTt2YXIgYWE9Ui5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU7Uj1SLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlOwppZigwIT1hYXx8MCE9UiltYT1hYS8oYWErUil9ZWxzZShhYT1VLm5vZGUuZGV2aWNlKSYmKFk9e1thYV06MX0pLChhYT1VLm5vZGUueGxhQ2x1c3RlcikmJihiYT17W2FhXToxfSksVS5ub2RlLnR5cGU9PT1jLk5vZGVUeXBlLk9QJiYobWE9VS5ub2RlLmNvbXBhdGlibGU/MTowKTtZJiYoVS5kZXZpY2VDb2xvcnM9dGhpcy5jb2xvckhpc3RvZ3JhbShZLHRoaXMuZGV2aWNlQ29sb3JNYXApKTtiYSYmKFUueGxhQ2x1c3RlckNvbG9ycz10aGlzLmNvbG9ySGlzdG9ncmFtKGJhLHRoaXMueGxhQ2x1c3RlckNvbG9yTWFwKSk7bnVsbCE9bWEmJihVLmNvbXBhdGliaWxpdHlDb2xvcnM9W3tjb2xvcjphLmdyYXBoLnJlbmRlci5PcE5vZGVDb2xvcnMuQ09NUEFUSUJMRSxwcm9wb3J0aW9uOm1hfSx7Y29sb3I6YS5ncmFwaC5yZW5kZXIuT3BOb2RlQ29sb3JzLklOQ09NUEFUSUJMRSxwcm9wb3J0aW9uOjEtbWF9XSk7cmV0dXJuIHRoaXMuaW5kZXhbTF19Z2V0TmVhcmVzdFZpc2libGVBbmNlc3RvcihMKXt2YXIgUj0KYy5nZXRIaWVyYXJjaGljYWxQYXRoKEwpO2xldCBVPTAsWT1udWxsO2Zvcig7VTxSLmxlbmd0aCYmKEw9UltVXSxZPXRoaXMuZ2V0UmVuZGVyTm9kZUJ5TmFtZShMKSxZLmV4cGFuZGVkKTtVKyspO3JldHVybiBVPT1SLmxlbmd0aC0yJiYoUj1SW1UrMV0sWS5pbkFubm90YXRpb25zLm5vZGVOYW1lc1tSXXx8WS5vdXRBbm5vdGF0aW9ucy5ub2RlTmFtZXNbUl0pP1I6TH1zZXREZXB0aChMKXtrKHRoaXMucm9vdCwrTCl9aXNOb2RlQXV4aWxpYXJ5KEwpe2xldCBSPXRoaXMuZ2V0UmVuZGVyTm9kZUJ5TmFtZShMLm5vZGUucGFyZW50Tm9kZS5uYW1lKSxVPV8uZmluZChSLmlzb2xhdGVkSW5FeHRyYWN0LFk9Plkubm9kZS5uYW1lPT09TC5ub2RlLm5hbWUpO2lmKFUpcmV0dXJuITA7VT1fLmZpbmQoUi5pc29sYXRlZE91dEV4dHJhY3QsWT0+WS5ub2RlLm5hbWU9PT1MLm5vZGUubmFtZSk7cmV0dXJuISFVfWdldE5hbWVzT2ZSZW5kZXJlZE9wcygpe3JldHVybiB0aGlzLnJlbmRlcmVkT3BOYW1lc31jbG9uZUFuZEFkZEZ1bmN0aW9uT3BOb2RlKEwsClIsVSxZKXt2YXIgYmE9VS5uYW1lLnJlcGxhY2UoUixZKTtsZXQgbWE9TC5tZXRhZ3JhcGgubm9kZShiYSk7aWYobWEpcmV0dXJuIG1hO21hPW5ldyBjLk9wTm9kZUltcGwoe25hbWU6YmEsaW5wdXQ6W10sZGV2aWNlOlUuZGV2aWNlLG9wOlUub3AsYXR0cjpfLmNsb25lRGVlcChVLmF0dHIpfSk7bWEuY2FyZGluYWxpdHk9VS5jYXJkaW5hbGl0eTttYS5pbmNsdWRlPVUuaW5jbHVkZTttYS5vdXRwdXRTaGFwZXM9Xy5jbG9uZURlZXAoVS5vdXRwdXRTaGFwZXMpO21hLnhsYUNsdXN0ZXI9VS54bGFDbHVzdGVyO21hLmZ1bmN0aW9uSW5wdXRJbmRleD1VLmZ1bmN0aW9uSW5wdXRJbmRleDttYS5mdW5jdGlvbk91dHB1dEluZGV4PVUuZnVuY3Rpb25PdXRwdXRJbmRleDttYS5pbnB1dHM9VS5pbnB1dHMubWFwKGFhPT57Y29uc3QgY2E9Xy5jbG9uZShhYSk7Y2EubmFtZT1hYS5uYW1lLnJlcGxhY2UoUixZKTtyZXR1cm4gY2F9KTttYS5wYXJlbnROb2RlPUw7TC5tZXRhZ3JhcGguc2V0Tm9kZShtYS5uYW1lLAptYSk7dGhpcy5oaWVyYXJjaHkuc2V0Tm9kZShtYS5uYW1lLG1hKTtiYT1hYT0+dGhpcy5jbG9uZUFuZEFkZEZ1bmN0aW9uT3BOb2RlKEwsUixhYSxZKTttYS5pbkVtYmVkZGluZ3M9VS5pbkVtYmVkZGluZ3MubWFwKGJhKTttYS5vdXRFbWJlZGRpbmdzPVUub3V0RW1iZWRkaW5ncy5tYXAoYmEpO3JldHVybiBtYX1jbG9uZUZ1bmN0aW9uTGlicmFyeU1ldGFub2RlKEwsUixVLFksYmEpe2NvbnN0IG1hPXt9O0w9dGhpcy5jbG9uZUZ1bmN0aW9uTGlicmFyeU1ldGFub2RlSGVscGVyKEwsUixVLFksYmEsbWEpO18uaXNFbXB0eShtYSl8fHRoaXMucGF0Y2hFZGdlc0Zyb21GdW5jdGlvbk91dHB1dHMoUixtYSk7cmV0dXJuIEx9Y2xvbmVGdW5jdGlvbkxpYnJhcnlNZXRhbm9kZUhlbHBlcihMLFIsVSxZLGJhLG1hKXtjb25zdCBhYT1hLmdyYXBoLmNyZWF0ZU1ldGFub2RlKFUubmFtZS5yZXBsYWNlKFksYmEpKTthYS5kZXB0aD1VLmRlcHRoO2FhLmNhcmRpbmFsaXR5PVUuY2FyZGluYWxpdHk7CmFhLnRlbXBsYXRlSWQ9VS50ZW1wbGF0ZUlkO2FhLm9wSGlzdG9ncmFtPV8uY2xvbmUoVS5vcEhpc3RvZ3JhbSk7YWEuZGV2aWNlSGlzdG9ncmFtPV8uY2xvbmUoVS5kZXZpY2VIaXN0b2dyYW0pO2FhLnhsYUNsdXN0ZXJIaXN0b2dyYW09Xy5jbG9uZShVLnhsYUNsdXN0ZXJIaXN0b2dyYW0pO2FhLmhhc05vbkNvbnRyb2xFZGdlcz1VLmhhc05vbkNvbnRyb2xFZGdlczthYS5pbmNsdWRlPVUuaW5jbHVkZTthYS5ub2RlQXR0cmlidXRlcz1fLmNsb25lKFUubm9kZUF0dHJpYnV0ZXMpO2FhLmFzc29jaWF0ZWRGdW5jdGlvbj1VLmFzc29jaWF0ZWRGdW5jdGlvbjtfLmVhY2goVS5tZXRhZ3JhcGgubm9kZXMoKSxjYT0+e2NhPVUubWV0YWdyYXBoLm5vZGUoY2EpO3N3aXRjaChjYS50eXBlKXtjYXNlIGMuTm9kZVR5cGUuTUVUQTpjYT10aGlzLmNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGVIZWxwZXIoTCxSLGNhLFksYmEsbWEpO2NhLnBhcmVudE5vZGU9YWE7YWEubWV0YWdyYXBoLnNldE5vZGUoY2EubmFtZSwKY2EpO3RoaXMuaGllcmFyY2h5LnNldE5vZGUoY2EubmFtZSxjYSk7YnJlYWs7Y2FzZSBjLk5vZGVUeXBlLk9QOmNhPXRoaXMuY2xvbmVBbmRBZGRGdW5jdGlvbk9wTm9kZShhYSxZLGNhLGJhKTtfLmlzTnVtYmVyKGNhLmZ1bmN0aW9uSW5wdXRJbmRleCkmJnRoaXMucGF0Y2hFZGdlc0ludG9GdW5jdGlvbklucHV0cyhSLGNhKTtfLmlzTnVtYmVyKGNhLmZ1bmN0aW9uT3V0cHV0SW5kZXgpJiYobWFbY2EuZnVuY3Rpb25PdXRwdXRJbmRleF09Y2EpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKGNhLm5hbWUrIiBpcyBvZGRseSBuZWl0aGVyIGEgbWV0YW5vZGUgbm9yIGFuIG9wbm9kZS4iKX19KTt0aGlzLmNsb25lTGlicmFyeU1ldGFub2RlRWRnZXMoVSxhYSxZLGJhKTtyZXR1cm4gYWF9Y2xvbmVMaWJyYXJ5TWV0YW5vZGVFZGdlcyhMLFIsVSxZKXtfLmVhY2goTC5tZXRhZ3JhcGguZWRnZXMoKSxiYT0+e2JhPUwubWV0YWdyYXBoLmVkZ2UoYmEpO2NvbnN0IG1hPWJhLnYucmVwbGFjZShVLApZKSxhYT1iYS53LnJlcGxhY2UoVSxZKSxjYT1uZXcgYy5NZXRhZWRnZUltcGwobWEsYWEpO2NhLmluYm91bmQ9YmEuaW5ib3VuZDtjYS5udW1SZWd1bGFyRWRnZXM9YmEubnVtUmVndWxhckVkZ2VzO2NhLm51bUNvbnRyb2xFZGdlcz1iYS5udW1Db250cm9sRWRnZXM7Y2EubnVtUmVmRWRnZXM9YmEubnVtUmVmRWRnZXM7Y2EudG90YWxTaXplPWJhLnRvdGFsU2l6ZTtiYS5iYXNlRWRnZUxpc3QmJihjYS5iYXNlRWRnZUxpc3Q9YmEuYmFzZUVkZ2VMaXN0Lm1hcChmYT0+e2NvbnN0IGRhPV8uY2xvbmUoZmEpO2RhLnY9ZmEudi5yZXBsYWNlKFUsWSk7ZGEudz1mYS53LnJlcGxhY2UoVSxZKTtyZXR1cm4gZGF9KSk7Ui5tZXRhZ3JhcGgubm9kZShhYSk/Ui5tZXRhZ3JhcGguc2V0RWRnZShtYSxhYSxjYSk6Ui5tZXRhZ3JhcGguc2V0RWRnZShhYSxtYSxjYSl9KX1wYXRjaEVkZ2VzSW50b0Z1bmN0aW9uSW5wdXRzKEwsUil7bGV0IFU9TWF0aC5taW4oUi5mdW5jdGlvbklucHV0SW5kZXgsTC5pbnB1dHMubGVuZ3RoLQoxKTtmb3IodmFyIFk9Xy5jbG9uZShMLmlucHV0c1tVXSk7WS5pc0NvbnRyb2xEZXBlbmRlbmN5OylVKyssWT1MLmlucHV0c1tVXTtSLmlucHV0cy5wdXNoKFkpO1k9dGhpcy5oaWVyYXJjaHkuZ2V0UHJlZGVjZXNzb3JzKEwubmFtZSk7bGV0IGJhLG1hPTA7Xy5lYWNoKFkucmVndWxhcixhYT0+e21hKz1hYS5udW1SZWd1bGFyRWRnZXM7aWYobWE+VSlyZXR1cm4gYmE9YWEsITF9KTtfLmVhY2goYmEuYmFzZUVkZ2VMaXN0LGFhPT57YWEudz09PUwubmFtZSYmKGFhLnc9Ui5uYW1lKTthYS52PT09TC5uYW1lJiYoYWEudj1SLm5hbWUpfSl9cGF0Y2hFZGdlc0Zyb21GdW5jdGlvbk91dHB1dHMoTCxSKXtjb25zdCBVPXRoaXMuaGllcmFyY2h5LmdldFN1Y2Nlc3NvcnMoTC5uYW1lKTtfLmVhY2goVS5yZWd1bGFyLFk9PntfLmVhY2goWS5iYXNlRWRnZUxpc3QsYmE9Pntjb25zdCBtYT10aGlzLmhpZXJhcmNoeS5ub2RlKGJhLncpO18uZWFjaChtYS5pbnB1dHMsYWE9PnthYS5uYW1lPT09TC5uYW1lJiYKKGFhLm5hbWU9UlthYS5vdXRwdXRUZW5zb3JLZXldLm5hbWUsYWEub3V0cHV0VGVuc29yS2V5PWJhLm91dHB1dFRlbnNvcktleSl9KX0pO18uZWFjaChZLmJhc2VFZGdlTGlzdCxiYT0+e2JhLnY9UltiYS5vdXRwdXRUZW5zb3JLZXldLm5hbWU7YmEub3V0cHV0VGVuc29yS2V5PSIwIn0pfSl9YnVpbGRTdWJoaWVyYXJjaHkoTCl7aWYoIShMIGluIHRoaXMuaGFzU3ViaGllcmFyY2h5KSl7dGhpcy5oYXNTdWJoaWVyYXJjaHlbTF09ITA7dmFyIFI9dGhpcy5pbmRleFtMXTtpZihSLm5vZGUudHlwZT09PWMuTm9kZVR5cGUuTUVUQXx8Ui5ub2RlLnR5cGU9PT1jLk5vZGVUeXBlLlNFUklFUyl7dmFyIFU9Ui5ub2RlLm1ldGFncmFwaCxZPVIuY29yZUdyYXBoLGJhPVtdLG1hPVtdO18uaXNFbXB0eSh0aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zKXx8KF8uZWFjaChVLm5vZGVzKCkseWE9Pntjb25zdCBCYT1VLm5vZGUoeWEpLEdhPXRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnNbQmEub3BdOwpHYSYmMCE9PXlhLmluZGV4T2YoYS5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKSYmKHlhPXRoaXMuY2xvbmVGdW5jdGlvbkxpYnJhcnlNZXRhbm9kZShVLEJhLEdhLm5vZGUsR2Eubm9kZS5uYW1lLEJhLm5hbWUpLGJhLnB1c2goQmEpLG1hLnB1c2goeWEpKX0pLF8uZWFjaChtYSwoeWEsQmEpPT57QmE9YmFbQmFdO3lhLnBhcmVudE5vZGU9QmEucGFyZW50Tm9kZTtVLnNldE5vZGUoQmEubmFtZSx5YSk7dGhpcy5oaWVyYXJjaHkuc2V0Tm9kZShCYS5uYW1lLHlhKX0pKTtfLmVhY2goVS5ub2RlcygpLHlhPT57bGV0IEJhPXRoaXMuZ2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKHlhKSxHYT1CYS5ub2RlO1kuc2V0Tm9kZSh5YSxCYSk7R2EuaXNHcm91cE5vZGV8fChfLmVhY2goR2EuaW5FbWJlZGRpbmdzLHphPT57bGV0IFVhPW5ldyBLKG51bGwpLFphPW5ldyBIKHphKTtmKEJhLHphLFphLFVhLE8uQ09OU1RBTlQpO3RoaXMuaW5kZXhbemEubmFtZV09WmF9KSxfLmVhY2goR2Eub3V0RW1iZWRkaW5ncywKemE9PntsZXQgVWE9bmV3IEsobnVsbCksWmE9bmV3IEgoemEpO2coQmEsemEsWmEsVWEsTy5TVU1NQVJZKTt0aGlzLmluZGV4W3phLm5hbWVdPVphfSkpfSk7Xy5lYWNoKFUuZWRnZXMoKSx5YT0+e3ZhciBCYT1VLmVkZ2UoeWEpO0JhPW5ldyBLKEJhKTtCYS5pc0ZhZGVkT3V0PXRoaXMuaW5kZXhbeWEudl0uaXNGYWRlZE91dHx8dGhpcy5pbmRleFt5YS53XS5pc0ZhZGVkT3V0O1kuc2V0RWRnZSh5YS52LHlhLncsQmEpfSk7Ri5lbmFibGVFeHRyYWN0aW9uJiZSLm5vZGUudHlwZT09PWMuTm9kZVR5cGUuTUVUQSYmQyhSKTtfLmlzRW1wdHkodGhpcy5oaWVyYXJjaHkubGlicmFyeUZ1bmN0aW9ucyl8fHRoaXMuYnVpbGRTdWJoaWVyYXJjaGllc0Zvck5lZWRlZEZ1bmN0aW9ucyhVKTtMPT09YS5ncmFwaC5ST09UX05BTUUmJl8uZm9yT3duKHRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnMseWE9Pnt5YT15YS5ub2RlO2NvbnN0IEJhPXRoaXMuZ2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKHlhLm5hbWUpOwpSLmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LnB1c2goQmEpO0JhLm5vZGUuaW5jbHVkZT1jLkluY2x1c2lvblR5cGUuRVhDTFVERTtZLnJlbW92ZU5vZGUoeWEubmFtZSl9KTt2YXIgYWE9Ui5ub2RlLnBhcmVudE5vZGU7aWYoYWEpe3ZhciBjYT10aGlzLmluZGV4W2FhLm5hbWVdLGZhPSh5YSwuLi5CYSk9PkJhLmNvbmNhdChbeWE/IklOIjoiT1VUIl0pLmpvaW4oIn5+IiksZGE9dGhpcy5oaWVyYXJjaHkuZ2V0QnJpZGdlZ3JhcGgoTCksbGE9e30sWj17fSxGYT17fTtfLmVhY2goZGEuZWRnZXMoKSx5YT0+e2xldCBCYT0hIVUubm9kZSh5YS53KSxHYT1CYT95YS52OnlhLnc7ZGEuZWRnZSh5YSkubnVtUmVndWxhckVkZ2VzP0JhP1pbR2FdPShaW0dhXXx8MCkrMTpsYVtHYV09KGxhW0dhXXx8MCkrMTpGYVtHYV09KEZhW0dhXXx8MCkrMX0pO3ZhciB4YT10aGlzLmhpZXJhcmNoeS5nZXROb2RlTWFwKCk7Xy5lYWNoKGRhLmVkZ2VzKCkseWE9Pnt2YXIgQmE9ZGEuZWRnZSh5YSk7bGV0IEdhPQohIVUubm9kZSh5YS53KSxbemEsVWFdPUdhP1t5YS53LHlhLnZdOlt5YS52LHlhLnddO3ZhciBaYT10aGlzLmluZGV4W3phXSx6Yj10aGlzLmluZGV4W1VhXSxJYj16Yj96Yi5ub2RlOnhhW1VhXSx1Yj0hQmEubnVtUmVndWxhckVkZ2VzJiZGYVtVYV0+Ri5tYXhDb250cm9sRGVncmVlLFssRmJdPUdhP1tSLmluQW5ub3RhdGlvbnMsWmEuaW5Bbm5vdGF0aW9uc106W1Iub3V0QW5ub3RhdGlvbnMsWmEub3V0QW5ub3RhdGlvbnNdO2xldCBBYj0oR2E/WjpsYSlbVWFdPkYubWF4QnJpZGdlUGF0aERlZ3JlZTt5YT1udWxsO3ZhciBQYj0hMTtGLmVuYWJsZUJyaWRnZWdyYXBoJiYhQWImJiF1YiYmWmEuaXNJbkNvcmUoKSYmKFBiPWJjPT5jYS5jb3JlR3JhcGguZWRnZShHYT97djpiYyx3Okx9Ont2OkwsdzpiY30pLCh5YT1QYihVYSkpfHwoeWE9UGIoZmEoR2EsVWEsYWEubmFtZSkpKSxQYj0hIXlhKTtaYT0hMTtpZih5YSYmIUJhLm51bVJlZ3VsYXJFZGdlcyl7WmE9eWE7Zm9yKHViPWNhLm5vZGU7WmEuYWRqb2luaW5nTWV0YWVkZ2U7KVphPQpaYS5hZGpvaW5pbmdNZXRhZWRnZSx1Yj11Yi5wYXJlbnROb2RlO3ViPXRoaXMuaGllcmFyY2h5LmdldFRvcG9sb2dpY2FsT3JkZXJpbmcodWIubmFtZSk7WmE9WmEubWV0YWVkZ2U7WmE9dWJbWmEudl0+dWJbWmEud119UGImJiFaYT8oSWI9ZmEoR2EsTCksemI9ZmEoR2EsVWEsTCksRmI9WS5ub2RlKHpiKSxGYnx8KFBiPVkubm9kZShJYiksUGJ8fChQYj1uZXcgSCh7bmFtZTpJYix0eXBlOmMuTm9kZVR5cGUuQlJJREdFLGlzR3JvdXBOb2RlOiExLGNhcmRpbmFsaXR5OjAscGFyZW50Tm9kZTpudWxsLHN0YXRzOm51bGwsaW5jbHVkZTpjLkluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUQsaW5ib3VuZDpHYSxub2RlQXR0cmlidXRlczp7fX0pLHRoaXMuaW5kZXhbSWJdPVBiLFkuc2V0Tm9kZShJYixQYikpLEZiPW5ldyBIKHtuYW1lOnpiLHR5cGU6Yy5Ob2RlVHlwZS5CUklER0UsaXNHcm91cE5vZGU6ITEsY2FyZGluYWxpdHk6MSxwYXJlbnROb2RlOm51bGwsc3RhdHM6bnVsbCxpbmNsdWRlOmMuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCwKaW5ib3VuZDpHYSxub2RlQXR0cmlidXRlczp7fX0pLHRoaXMuaW5kZXhbemJdPUZiLFkuc2V0Tm9kZSh6YixGYiksWS5zZXRQYXJlbnQoemIsSWIpLFBiLm5vZGUuY2FyZGluYWxpdHkrKyksQmE9bmV3IEsoQmEpLEJhLmFkam9pbmluZ01ldGFlZGdlPXlhLEdhP1kuc2V0RWRnZSh6Yix6YSxCYSk6WS5zZXRFZGdlKHphLHpiLEJhKSk6RmIucHVzaChuZXcgSShJYix6YixuZXcgSyhCYSksTy5TSE9SVENVVCxHYSkpfSk7Xy5lYWNoKFshMCwhMV0seWE9PntsZXQgQmE9ZmEoeWEsTCksR2E9WS5ub2RlKEJhKTtHYSYmXy5lYWNoKFkubm9kZXMoKSx6YT0+e2lmKFkubm9kZSh6YSkubm9kZS50eXBlIT09Yy5Ob2RlVHlwZS5CUklER0UmJih5YT8hWS5wcmVkZWNlc3NvcnMoemEpLmxlbmd0aDohWS5zdWNjZXNzb3JzKHphKS5sZW5ndGgpKXt2YXIgVWE9ZmEoeWEsTCwiU1RSVUNUVVJBTF9UQVJHRVQiKSxaYT1ZLm5vZGUoVWEpO1phfHwoWmE9bmV3IEgoe25hbWU6VWEsdHlwZTpjLk5vZGVUeXBlLkJSSURHRSwKaXNHcm91cE5vZGU6ITEsY2FyZGluYWxpdHk6MSxwYXJlbnROb2RlOm51bGwsc3RhdHM6bnVsbCxpbmNsdWRlOmMuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCxpbmJvdW5kOnlhLG5vZGVBdHRyaWJ1dGVzOnt9fSksWmEuc3RydWN0dXJhbD0hMCx0aGlzLmluZGV4W1VhXT1aYSxZLnNldE5vZGUoVWEsWmEpLEdhLm5vZGUuY2FyZGluYWxpdHkrKyxZLnNldFBhcmVudChVYSxCYSkpO1phPW5ldyBLKG51bGwpO1phLnN0cnVjdHVyYWw9ITA7WmEud2VpZ2h0LS07eWE/WS5zZXRFZGdlKFVhLHphLFphKTpZLnNldEVkZ2UoemEsVWEsWmEpfX0pfSl9fX19YnVpbGRTdWJoaWVyYXJjaGllc0Zvck5lZWRlZEZ1bmN0aW9ucyhMKXtfLmVhY2goTC5lZGdlcygpLFI9PntSPUwuZWRnZShSKTtSPW5ldyBLKFIpO18uZm9yRWFjaChSLm1ldGFlZGdlLmJhc2VFZGdlTGlzdCxVPT57dmFyIFk9VS52LnNwbGl0KGEuZ3JhcGguTkFNRVNQQUNFX0RFTElNKTtmb3IodmFyIGJhPVkubGVuZ3RoOzA8PWJhO2JhLS0pe1U9Clkuc2xpY2UoMCxiYSk7Y29uc3QgbWE9dGhpcy5oaWVyYXJjaHkubm9kZShVLmpvaW4oYS5ncmFwaC5OQU1FU1BBQ0VfREVMSU0pKTtpZihtYSl7aWYobWEudHlwZT09PWMuTm9kZVR5cGUuT1AmJnRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnNbbWEub3BdKWZvcihZPTE7WTxVLmxlbmd0aDtZKyspKGJhPVUuc2xpY2UoMCxZKS5qb2luKGEuZ3JhcGguTkFNRVNQQUNFX0RFTElNKSkmJnRoaXMuYnVpbGRTdWJoaWVyYXJjaHkoYmEpO2JyZWFrfX19KX0pfX1kLlJlbmRlckdyYXBoSW5mbz1CO2NsYXNzIEl7Y29uc3RydWN0b3IoTCxSLFUsWSxiYSl7dGhpcy5ub2RlPUw7dGhpcy5yZW5kZXJOb2RlSW5mbz1SO3RoaXMucmVuZGVyTWV0YWVkZ2VJbmZvPVU7dGhpcy5hbm5vdGF0aW9uVHlwZT1ZO3RoaXMuaGVpZ2h0PXRoaXMud2lkdGg9dGhpcy5keT10aGlzLmR4PTA7VSYmVS5tZXRhZWRnZSYmKHRoaXMudj1VLm1ldGFlZGdlLnYsdGhpcy53PVUubWV0YWVkZ2Uudyk7dGhpcy5pc0luPQpiYTt0aGlzLnBvaW50cz1bXX19ZC5Bbm5vdGF0aW9uPUk7bGV0IE87KGZ1bmN0aW9uKEwpe0xbTC5TSE9SVENVVD0wXT0iU0hPUlRDVVQiO0xbTC5DT05TVEFOVD0xXT0iQ09OU1RBTlQiO0xbTC5TVU1NQVJZPTJdPSJTVU1NQVJZIjtMW0wuRUxMSVBTSVM9M109IkVMTElQU0lTIn0pKE89ZC5Bbm5vdGF0aW9uVHlwZXx8KGQuQW5ub3RhdGlvblR5cGU9e30pKTtjbGFzcyBQe2NvbnN0cnVjdG9yKCl7dGhpcy5saXN0PVtdO3RoaXMubm9kZU5hbWVzPXt9fXB1c2goTCl7aWYoIShMLm5vZGUubmFtZSBpbiB0aGlzLm5vZGVOYW1lcykpaWYodGhpcy5ub2RlTmFtZXNbTC5ub2RlLm5hbWVdPSEwLHRoaXMubGlzdC5sZW5ndGg8Ri5tYXhBbm5vdGF0aW9ucyl0aGlzLmxpc3QucHVzaChMKTtlbHNle3ZhciBSPXRoaXMubGlzdFt0aGlzLmxpc3QubGVuZ3RoLTFdO1IuYW5ub3RhdGlvblR5cGU9PT1PLkVMTElQU0lTPyhMPVIubm9kZSxMLnNldE51bU1vcmVOb2RlcygrK0wubnVtTW9yZU5vZGVzKSk6CihSPW5ldyBhLmdyYXBoLkVsbGlwc2lzTm9kZUltcGwoMSksdGhpcy5saXN0LnB1c2gobmV3IEkoUixuZXcgSChSKSxudWxsLE8uRUxMSVBTSVMsTC5pc0luKSkpfX19ZC5Bbm5vdGF0aW9uTGlzdD1QO2NsYXNzIEh7Y29uc3RydWN0b3IoTCl7dGhpcy5ub2RlPUw7dGhpcy5leHBhbmRlZD0hMTt0aGlzLmluQW5ub3RhdGlvbnM9bmV3IFA7dGhpcy5vdXRBbm5vdGF0aW9ucz1uZXcgUDt0aGlzLm91dGJveFdpZHRoPXRoaXMuaW5ib3hXaWR0aD10aGlzLmhlaWdodD10aGlzLndpZHRoPXRoaXMueT10aGlzLng9MDt0aGlzLnN0cnVjdHVyYWw9dGhpcy5leGNsdWRlZD0hMTt0aGlzLnBhZGRpbmdCb3R0b209dGhpcy5wYWRkaW5nUmlnaHQ9dGhpcy5wYWRkaW5nTGVmdD10aGlzLnBhZGRpbmdUb3A9dGhpcy5sYWJlbEhlaWdodD10aGlzLnJhZGl1cz10aGlzLmxhYmVsT2Zmc2V0PTA7dGhpcy5pc091dEV4dHJhY3Q9dGhpcy5pc0luRXh0cmFjdD0hMTt0aGlzLmNvcmVCb3g9e3dpZHRoOjAsaGVpZ2h0OjB9Owp0aGlzLmlzRmFkZWRPdXQ9ITE7dGhpcy5kaXNwbGF5TmFtZT1MLm5hbWUuc3Vic3RyaW5nKEwubmFtZS5sYXN0SW5kZXhPZihhLmdyYXBoLk5BTUVTUEFDRV9ERUxJTSkrMSk7TC50eXBlPT09Yy5Ob2RlVHlwZS5NRVRBJiZMLmFzc29jaWF0ZWRGdW5jdGlvbiYmKChMPXRoaXMuZGlzcGxheU5hbWUubWF0Y2goRCkpP3RoaXMuZGlzcGxheU5hbWU9TFsxXTpfLnN0YXJ0c1dpdGgodGhpcy5kaXNwbGF5TmFtZSxhLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgpJiYodGhpcy5kaXNwbGF5TmFtZT10aGlzLmRpc3BsYXlOYW1lLnN1YnN0cmluZyhhLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgubGVuZ3RoKSkpfWlzSW5Db3JlKCl7cmV0dXJuIXRoaXMuaXNJbkV4dHJhY3QmJiF0aGlzLmlzT3V0RXh0cmFjdCYmIXRoaXMuaXNMaWJyYXJ5RnVuY3Rpb259fWQuUmVuZGVyTm9kZUluZm89SDtjbGFzcyBLe2NvbnN0cnVjdG9yKEwpe3RoaXMubWV0YWVkZ2U9TDsKdGhpcy5hZGpvaW5pbmdNZXRhZWRnZT1udWxsO3RoaXMuc3RydWN0dXJhbD0hMTt0aGlzLndlaWdodD0xO3RoaXMuaXNGYWRlZE91dD0hMX19ZC5SZW5kZXJNZXRhZWRnZUluZm89SztjbGFzcyBNIGV4dGVuZHMgSHtjb25zdHJ1Y3RvcihMLFIpe3N1cGVyKEwpO0w9TC5tZXRhZ3JhcGguZ3JhcGgoKTtSLmNvbXBvdW5kPSEwO3RoaXMuY29yZUdyYXBoPWMuY3JlYXRlR3JhcGgoTC5uYW1lLGMuR3JhcGhUeXBlLkNPUkUsUik7dGhpcy5pbkV4dHJhY3RCb3g9e3dpZHRoOjAsaGVpZ2h0OjB9O3RoaXMub3V0RXh0cmFjdEJveD17d2lkdGg6MCxoZWlnaHQ6MH07dGhpcy5saWJyYXJ5RnVuY3Rpb25zQm94PXt3aWR0aDowLGhlaWdodDowfTt0aGlzLmlzb2xhdGVkSW5FeHRyYWN0PVtdO3RoaXMuaXNvbGF0ZWRPdXRFeHRyYWN0PVtdO3RoaXMubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3Q9W119fWQuUmVuZGVyR3JvdXBOb2RlSW5mbz1NO2QubWFrZUluRXh0cmFjdD1xO2QubWFwSW5kZXhUb0h1ZT0KZnVuY3Rpb24oTCl7cmV0dXJuIDErNTc5LjI1NjE2Nzk3MjUqTCUzNTh9O2QuZXhwYW5kVW50aWxOb2RlSXNTaG93bj1mdW5jdGlvbihMLFIpe3ZhciBVPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzY2VuZSIpO1I9Ui5zcGxpdCgiLyIpO3ZhciBZPVJbUi5sZW5ndGgtMV0ubWF0Y2goLyguKik6XHcrLyk7Mj09PVkubGVuZ3RoJiYoUltSLmxlbmd0aC0xXT1ZWzFdKTtZPVJbMF07bGV0IGJhPUwuZ2V0UmVuZGVyTm9kZUJ5TmFtZShZKTtmb3IobGV0IG1hPTE7bWE8Ui5sZW5ndGgmJmJhLm5vZGUudHlwZSE9PWEuZ3JhcGguTm9kZVR5cGUuT1A7bWErKylMLmJ1aWxkU3ViaGllcmFyY2h5KFkpLGJhLmV4cGFuZGVkPSEwLFUuc2V0Tm9kZUV4cGFuZGVkKGJhKSxZKz0iLyIrUlttYV0sYmE9TC5nZXRSZW5kZXJOb2RlQnlOYW1lKFkpO3JldHVybiBiYS5ub2RlLm5hbWV9fSkoYy5yZW5kZXJ8fChjLnJlbmRlcj17fSkpfSkoYS5ncmFwaHx8KGEuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vc2NlbmUuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7ZnVuY3Rpb24gZihyLHQsdix5KXt2YXIgej1nKHIsdCx2KTtpZighei5lbXB0eSgpKXJldHVybiB6O3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdCk7aWYodiBpbnN0YW5jZW9mIEFycmF5KWZvcih6PTA7ejx2Lmxlbmd0aDt6KyspdC5jbGFzc0xpc3QuYWRkKHZbel0pO2Vsc2UgdC5jbGFzc0xpc3QuYWRkKHYpO3k/ci5ub2RlKCkuaW5zZXJ0QmVmb3JlKHQseSk6ci5ub2RlKCkuYXBwZW5kQ2hpbGQodCk7cmV0dXJuIGQzLnNlbGVjdCh0KS5kYXR1bShyLmRhdHVtKCkpfWZ1bmN0aW9uIGcocix0LHYpe3I9ci5ub2RlKCkuY2hpbGROb2Rlcztmb3IobGV0IHk9MDt5PHIubGVuZ3RoO3krKyl7bGV0IHo9clt5XTtpZih6LnRhZ05hbWU9PT10KWlmKHYgaW5zdGFuY2VvZiBBcnJheSl7bGV0IHg9ITA7Zm9yKGxldCBDPTA7Qzx2Lmxlbmd0aDtDKyspeD14JiZ6LmNsYXNzTGlzdC5jb250YWlucyh2W0NdKTsKaWYoeClyZXR1cm4gZDMuc2VsZWN0KHopfWVsc2UgaWYoIXZ8fHouY2xhc3NMaXN0LmNvbnRhaW5zKHYpKXJldHVybiBkMy5zZWxlY3Qoeil9cmV0dXJuIGQzLnNlbGVjdChudWxsKX1mdW5jdGlvbiBsKHIsdCl7bGV0IHY9dC5ub2RlLnR5cGU9PT1jLk5vZGVUeXBlLlNFUklFUz8wOmMubGF5b3V0LlBBUkFNUy5zdWJzY2VuZS5tZXRhLmxhYmVsSGVpZ2h0O2soZyhyLCJnIixkLkNsYXNzLlNjZW5lLkNPUkUpLDAsdik7dmFyIHk9MDx0Lmlzb2xhdGVkSW5FeHRyYWN0Lmxlbmd0aCx6PTA8dC5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoO2xldCB4PTA8dC5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGgsQz1jLmxheW91dC5QQVJBTVMuc3Vic2NlbmUubWV0YS5leHRyYWN0WE9mZnNldCxGPTA7eSYmKEYrPXQub3V0RXh0cmFjdEJveC53aWR0aCk7eiYmKEYrPXQub3V0RXh0cmFjdEJveC53aWR0aCk7eSYmKHk9dC5jb3JlQm94LndpZHRoLHk9RjxjLmxheW91dC5NSU5fQVVYX1dJRFRIPwp5LWMubGF5b3V0Lk1JTl9BVVhfV0lEVEgrdC5pbkV4dHJhY3RCb3gud2lkdGgvMjp5LXQuaW5FeHRyYWN0Qm94LndpZHRoLzItdC5vdXRFeHRyYWN0Qm94LndpZHRoLSh6P0M6MCkseT15LXQubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aC0oeD9DOjApLGsoZyhyLCJnIixkLkNsYXNzLlNjZW5lLklORVhUUkFDVCkseSx2KSk7eiYmKHo9dC5jb3JlQm94LndpZHRoLHo9RjxjLmxheW91dC5NSU5fQVVYX1dJRFRIP3otYy5sYXlvdXQuTUlOX0FVWF9XSURUSCt0Lm91dEV4dHJhY3RCb3gud2lkdGgvMjp6LXQub3V0RXh0cmFjdEJveC53aWR0aC8yLHo9ei10LmxpYnJhcnlGdW5jdGlvbnNCb3gud2lkdGgtKHg/QzowKSxrKGcociwiZyIsZC5DbGFzcy5TY2VuZS5PVVRFWFRSQUNUKSx6LHYpKTt4JiYodD10LmNvcmVCb3gud2lkdGgtdC5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoLzIsayhnKHIsImciLGQuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSksdCx2KSl9ZnVuY3Rpb24gayhyLAp0LHYpe251bGwhPXIuYXR0cigidHJhbnNmb3JtIikmJihyPXIudHJhbnNpdGlvbigicG9zaXRpb24iKSk7ci5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit0KyIsIit2KyIpIil9ZnVuY3Rpb24gbihyLHQpe3JldHVybiB0P3IudG9GaXhlZCgwKToxPD1NYXRoLmFicyhyKT9yLnRvRml4ZWQoMSk6ci50b0V4cG9uZW50aWFsKDEpfWZ1bmN0aW9uIHAocix0LHYseSl7bGV0IHo9IkRldmljZTogIityLmRldmljZV9uYW1lKyJcbiI7eis9ImR0eXBlOiAiK3IuZHR5cGUrIlxuIjtsZXQgeD0iKHNjYWxhcikiOzA8ci5zaGFwZS5sZW5ndGgmJih4PSIoIityLnNoYXBlLmpvaW4oIiwiKSsiKSIpO3o9eisoIlxuc2hhcGU6ICIreCsiXG5cbiMoZWxlbWVudHMpOiAiKSsodCsiXG4iKTtyPVtdO2Zvcih0PTA7dDx2Lmxlbmd0aDt0KyspMDx2W3RdJiZyLnB1c2goIiMoIitkLmhlYWx0aFBpbGxFbnRyaWVzW3RdLmxhYmVsKyIpOiAiK3ZbdF0pO3orPXIuam9pbigiLCAiKSsiXG5cbiI7eS5tYXg+PQp5Lm1pbiYmKHorPSJtaW46ICIreS5taW4rIiwgbWF4OiAiK3kubWF4KyJcbiIseis9Im1lYW46ICIreS5tZWFuKyIsIHN0ZGRldjogIit5LnN0ZGRldik7cmV0dXJuIHp9ZnVuY3Rpb24gcShyLHQsdix5LHo9NjAseD0xMCxDPTAsRil7ZDMuc2VsZWN0KHIucGFyZW50Tm9kZSkuc2VsZWN0QWxsKCIuaGVhbHRoLXBpbGwiKS5yZW1vdmUoKTtpZih0KXt2YXIgRD10LnZhbHVlLEI9RC5zbGljZSgyLDgpLEk9QlswXSxPPUJbMV0sUD1CWzVdLEg9RFsxXSxLPXttaW46RFs4XSxtYXg6RFs5XSxtZWFuOkRbMTBdLHN0ZGRldjpNYXRoLnNxcnQoRFsxMV0pfTtudWxsPT16JiYoej02MCk7bnVsbD09eCYmKHg9MTApO251bGw9PUMmJihDPTApO251bGwhPXYmJnYubm9kZS50eXBlPT09YS5ncmFwaC5Ob2RlVHlwZS5PUCYmKHovPTIseC89Mik7RD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZC5TVkdfTkFNRVNQQUNFLCJnIik7RC5jbGFzc0xpc3QuYWRkKCJoZWFsdGgtcGlsbCIpO3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhkLlNWR19OQU1FU1BBQ0UsCiJkZWZzIik7RC5hcHBlbmRDaGlsZChNKTt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZC5TVkdfTkFNRVNQQUNFLCJsaW5lYXJHcmFkaWVudCIpO3k9ImhlYWx0aC1waWxsLWdyYWRpZW50LSIreTtMLnNldEF0dHJpYnV0ZSgiaWQiLHkpO3ZhciBSPTAsVT0iMCUiO2ZvcihsZXQgYmE9MDtiYTxCLmxlbmd0aDtiYSsrKWlmKEJbYmFdKXtSKz1CW2JhXTt2YXIgWT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZC5TVkdfTkFNRVNQQUNFLCJzdG9wIik7WS5zZXRBdHRyaWJ1dGUoIm9mZnNldCIsVSk7WS5zZXRBdHRyaWJ1dGUoInN0b3AtY29sb3IiLGQuaGVhbHRoUGlsbEVudHJpZXNbYmFdLmJhY2tncm91bmRfY29sb3IpO0wuYXBwZW5kQ2hpbGQoWSk7VT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZC5TVkdfTkFNRVNQQUNFLCJzdG9wIik7WT0xMDAqUi9IKyIlIjtVLnNldEF0dHJpYnV0ZSgib2Zmc2V0IixZKTtVLnNldEF0dHJpYnV0ZSgic3RvcC1jb2xvciIsZC5oZWFsdGhQaWxsRW50cmllc1tiYV0uYmFja2dyb3VuZF9jb2xvcik7CkwuYXBwZW5kQ2hpbGQoVSk7VT1ZfU0uYXBwZW5kQ2hpbGQoTCk7TT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZC5TVkdfTkFNRVNQQUNFLCJyZWN0Iik7TS5zZXRBdHRyaWJ1dGUoImZpbGwiLCJ1cmwoIyIreSsiKSIpO00uc2V0QXR0cmlidXRlKCJ3aWR0aCIsU3RyaW5nKHopKTtNLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixTdHJpbmcoeCkpO00uc2V0QXR0cmlidXRlKCJ5IixTdHJpbmcoQykpO0QuYXBwZW5kQ2hpbGQoTSk7TT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZC5TVkdfTkFNRVNQQUNFLCJ0aXRsZSIpO00udGV4dENvbnRlbnQ9cCh0LEgsQixLKTtELmFwcGVuZENoaWxkKE0pO3Q9ITE7aWYobnVsbCE9diYmKE09di54LXovMix4PXYueS14LXYuaGVpZ2h0LzItMiwwPnYubGFiZWxPZmZzZXQmJih4Kz12LmxhYmVsT2Zmc2V0KSxELnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrTSsiLCAiK3grIikiKSwoQlsyXXx8QlszXXx8Qls0XSkmJih2PXYubm9kZS5hdHRyKSYmCnYubGVuZ3RoKSlmb3IoQj0wO0I8di5sZW5ndGg7QisrKWlmKCJUIj09PXZbQl0ua2V5KXt0PSh2PXZbQl0udmFsdWUudHlwZSkmJi9eRFRfKEJPT0x8SU5UfFVJTlQpLy50ZXN0KHYpO2JyZWFrfXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGQuU1ZHX05BTUVTUEFDRSwidGV4dCIpO2lmKE51bWJlci5pc0Zpbml0ZShLLm1pbikmJk51bWJlci5pc0Zpbml0ZShLLm1heCkpe2lmKEI9bihLLm1pbix0KSxLPW4oSy5tYXgsdCksdi50ZXh0Q29udGVudD0xPEg/QisiIH4gIitLOkIsMDxJfHwwPE98fDA8UCl2LnRleHRDb250ZW50Kz0iICgiLEg9W10sMDxJJiZILnB1c2goYE5hTlx1MDBkNyR7SX1gKSwwPE8mJkgucHVzaChgLVx1MjIxZVx1MDBkNyR7T31gKSwwPFAmJkgucHVzaChgK1x1MjIxZVx1MDBkNyR7UH1gKSx2LnRleHRDb250ZW50Kz1ILmpvaW4oIjsgIikrIikifWVsc2Ugdi50ZXh0Q29udGVudD0iKE5vIGZpbml0ZSBlbGVtZW50cykiO3YuY2xhc3NMaXN0LmFkZCgiaGVhbHRoLXBpbGwtc3RhdHMiKTsKbnVsbD09RiYmKEY9ei8yKTt2LnNldEF0dHJpYnV0ZSgieCIsU3RyaW5nKEYpKTt2LnNldEF0dHJpYnV0ZSgieSIsU3RyaW5nKEMtMikpO0QuYXBwZW5kQ2hpbGQodik7UG9seW1lci5kb20oci5wYXJlbnROb2RlKS5hcHBlbmRDaGlsZChEKX19ZC5TVkdfTkFNRVNQQUNFPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7ZC5DbGFzcz17Tm9kZTp7Q09OVEFJTkVSOiJub2RlcyIsR1JPVVA6Im5vZGUiLFNIQVBFOiJub2Rlc2hhcGUiLENPTE9SX1RBUkdFVDoibm9kZWNvbG9ydGFyZ2V0IixMQUJFTDoibm9kZWxhYmVsIixCVVRUT05fQ09OVEFJTkVSOiJidXR0b25jb250YWluZXIiLEJVVFRPTl9DSVJDTEU6ImJ1dHRvbmNpcmNsZSIsRVhQQU5EX0JVVFRPTjoiZXhwYW5kYnV0dG9uIixDT0xMQVBTRV9CVVRUT046ImNvbGxhcHNlYnV0dG9uIn0sRWRnZTp7Q09OVEFJTkVSOiJlZGdlcyIsR1JPVVA6ImVkZ2UiLExJTkU6ImVkZ2VsaW5lIixSRUZFUkVOQ0VfRURHRToicmVmZXJlbmNlZWRnZSIsClJFRl9MSU5FOiJyZWZsaW5lIixTRUxFQ1RBQkxFOiJzZWxlY3RhYmxlZWRnZSIsU0VMRUNURUQ6InNlbGVjdGVkZWRnZSIsU1RSVUNUVVJBTDoic3RydWN0dXJhbCJ9LEFubm90YXRpb246e09VVEJPWDoib3V0LWFubm90YXRpb25zIixJTkJPWDoiaW4tYW5ub3RhdGlvbnMiLEdST1VQOiJhbm5vdGF0aW9uIixOT0RFOiJhbm5vdGF0aW9uLW5vZGUiLEVER0U6ImFubm90YXRpb24tZWRnZSIsQ09OVFJPTF9FREdFOiJhbm5vdGF0aW9uLWNvbnRyb2wtZWRnZSIsTEFCRUw6ImFubm90YXRpb24tbGFiZWwiLEVMTElQU0lTOiJhbm5vdGF0aW9uLWVsbGlwc2lzIn0sU2NlbmU6e0dST1VQOiJzY2VuZSIsQ09SRToiY29yZSIsRlVOQ1RJT05fTElCUkFSWToiZnVuY3Rpb24tbGlicmFyeSIsSU5FWFRSQUNUOiJpbi1leHRyYWN0IixPVVRFWFRSQUNUOiJvdXQtZXh0cmFjdCJ9LFN1YnNjZW5lOntHUk9VUDoic3Vic2NlbmUifSxPUE5PREU6Im9wIixNRVRBTk9ERToibWV0YSIsU0VSSUVTTk9ERToic2VyaWVzIiwKQlJJREdFTk9ERToiYnJpZGdlIixFTExJUFNJU05PREU6ImVsbGlwc2lzIn07ZC5oZWFsdGhQaWxsRW50cmllcz1be2JhY2tncm91bmRfY29sb3I6IiNDQzJGMkMiLGxhYmVsOiJOYU4ifSx7YmFja2dyb3VuZF9jb2xvcjoiI0ZGOEQwMCIsbGFiZWw6Ii1cdTIyMWUifSx7YmFja2dyb3VuZF9jb2xvcjoiI0VBRUFFQSIsbGFiZWw6Ii0ifSx7YmFja2dyb3VuZF9jb2xvcjoiI0E1QTVBNSIsbGFiZWw6IjAifSx7YmFja2dyb3VuZF9jb2xvcjoiIzI2MjYyNiIsbGFiZWw6IisifSx7YmFja2dyb3VuZF9jb2xvcjoiIzAwM0VENCIsbGFiZWw6IitcdTIyMWUifV07ZC5maXQ9ZnVuY3Rpb24ocix0LHYseSl7dmFyIHo9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtsZXQgeD1udWxsO3RyeXtpZih4PXQuZ2V0QkJveCgpLDA9PT14LndpZHRoKXJldHVybn1jYXRjaChDKXtyZXR1cm59dD1jLmxheW91dC5QQVJBTVMuZ3JhcGg7ej1kMy56b29tSWRlbnRpdHkuc2NhbGUoLjkqTWF0aC5taW4oei53aWR0aC8KeC53aWR0aCx6LmhlaWdodC94LmhlaWdodCwyKSkudHJhbnNsYXRlKHQucGFkZGluZy5wYWRkaW5nTGVmdCx0LnBhZGRpbmcucGFkZGluZ1RvcCk7ZDMuc2VsZWN0KHIpLnRyYW5zaXRpb24oKS5kdXJhdGlvbig1MDApLmNhbGwodi50cmFuc2Zvcm0seikub24oImVuZC5maXR0ZWQiLCgpPT57di5vbigiZW5kLmZpdHRlZCIsbnVsbCk7eSgpfSl9O2QucGFuVG9Ob2RlPWZ1bmN0aW9uKHIsdCx2LHkpe3Y9ZDMuc2VsZWN0KHQpLnNlbGVjdChgW2RhdGEtbmFtZT0iJHtyfSJdYCkubm9kZSgpO2lmKCF2KXJldHVybiBjb25zb2xlLndhcm4oYHBhblRvTm9kZSgpIGZhaWxlZCBmb3Igbm9kZSBuYW1lICIke3J9ImApLCExO3ZhciB6PXYuZ2V0QkJveCgpLHg9di5nZXRTY3JlZW5DVE0oKTtyPXQuY3JlYXRlU1ZHUG9pbnQoKTt2PXQuY3JlYXRlU1ZHUG9pbnQoKTtyLng9ei54O3IueT16Lnk7di54PXoueCt6LndpZHRoO3YueT16Lnkrei5oZWlnaHQ7cj1yLm1hdHJpeFRyYW5zZm9ybSh4KTt2PQp2Lm1hdHJpeFRyYW5zZm9ybSh4KTt4PShGLEQsQixJKT0+IShGPkImJkQ8SSk7ej10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2NvbnN0IEM9ei50b3Arei5oZWlnaHQtMTUwO3JldHVybiB4KHIueCx2Lngsei5sZWZ0LHoubGVmdCt6LndpZHRoLTMyMCl8fHgoci55LHYueSx6LnRvcCxDKT8oeD16LmxlZnQrei53aWR0aC8yLShyLngrdi54KS8yLHI9ei50b3Arei5oZWlnaHQvMi0oci55K3YueSkvMix2PWQzLnpvb21UcmFuc2Zvcm0odCksZDMuc2VsZWN0KHQpLnRyYW5zaXRpb24oKS5kdXJhdGlvbig1MDApLmNhbGwoeS50cmFuc2xhdGVCeSx4L3YuayxyL3YuayksITApOiExfTtkLnNlbGVjdE9yQ3JlYXRlQ2hpbGQ9ZjtkLnNlbGVjdENoaWxkPWc7ZC5idWlsZEdyb3VwPWZ1bmN0aW9uKHIsdCx2LHkpe3k9eXx8ZC5DbGFzcy5TY2VuZS5HUk9VUDtsZXQgej1nKHIsImciLHkpLmVtcHR5KCk7cj1mKHIsImciLHkpO3k9ZihyLCJnIixkLkNsYXNzLlNjZW5lLkNPUkUpO2xldCB4PV8ucmVkdWNlKHQuY29yZUdyYXBoLm5vZGVzKCksCihDLEYpPT57Rj10LmNvcmVHcmFwaC5ub2RlKEYpO0YuZXhjbHVkZWR8fEMucHVzaChGKTtyZXR1cm4gQ30sW10pO3Qubm9kZS50eXBlPT09Yy5Ob2RlVHlwZS5TRVJJRVMmJngucmV2ZXJzZSgpO2QuZWRnZS5idWlsZEdyb3VwKHksdC5jb3JlR3JhcGgsdik7ZC5ub2RlLmJ1aWxkR3JvdXAoeSx4LHYpOzA8dC5pc29sYXRlZEluRXh0cmFjdC5sZW5ndGg/KHk9ZihyLCJnIixkLkNsYXNzLlNjZW5lLklORVhUUkFDVCksZC5ub2RlLmJ1aWxkR3JvdXAoeSx0Lmlzb2xhdGVkSW5FeHRyYWN0LHYpKTpnKHIsImciLGQuQ2xhc3MuU2NlbmUuSU5FWFRSQUNUKS5yZW1vdmUoKTswPHQuaXNvbGF0ZWRPdXRFeHRyYWN0Lmxlbmd0aD8oeT1mKHIsImciLGQuQ2xhc3MuU2NlbmUuT1VURVhUUkFDVCksZC5ub2RlLmJ1aWxkR3JvdXAoeSx0Lmlzb2xhdGVkT3V0RXh0cmFjdCx2KSk6ZyhyLCJnIixkLkNsYXNzLlNjZW5lLk9VVEVYVFJBQ1QpLnJlbW92ZSgpOzA8dC5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGg/Cih5PWYociwiZyIsZC5DbGFzcy5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKSxkLm5vZGUuYnVpbGRHcm91cCh5LHQubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QsdikpOmcociwiZyIsZC5DbGFzcy5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKS5yZW1vdmUoKTtsKHIsdCk7eiYmci5hdHRyKCJvcGFjaXR5IiwwKS50cmFuc2l0aW9uKCkuYXR0cigib3BhY2l0eSIsMSk7cmV0dXJuIHJ9O2QuYWRkR3JhcGhDbGlja0xpc3RlbmVyPWZ1bmN0aW9uKHIsdCl7ZDMuc2VsZWN0KHIpLm9uKCJjbGljayIsKCk9Pnt0LmZpcmUoImdyYXBoLXNlbGVjdCIpfSl9O2QudHJhbnNsYXRlPWs7ZC5wb3NpdGlvblJlY3Q9ZnVuY3Rpb24ocix0LHYseSx6KXtyLnRyYW5zaXRpb24oKS5hdHRyKCJ4Iix0LXkvMikuYXR0cigieSIsdi16LzIpLmF0dHIoIndpZHRoIix5KS5hdHRyKCJoZWlnaHQiLHopfTtkLnBvc2l0aW9uVHJpYW5nbGU9ZnVuY3Rpb24ocix0LHYseSx6KXt6Lz0yO3kvPTI7dD1bW3Qsdi16XSxbdCt5LAp2K3pdLFt0LXksdit6XV07ci50cmFuc2l0aW9uKCkuYXR0cigicG9pbnRzIix0Lm1hcCh4PT54LmpvaW4oIiwiKSkuam9pbigiICIpKX07ZC5wb3NpdGlvbkJ1dHRvbj1mdW5jdGlvbihyLHQpe2xldCB2PWMubGF5b3V0LmNvbXB1dGVDWFBvc2l0aW9uT2ZOb2RlU2hhcGUodCkrKHQuZXhwYW5kZWQ/dC53aWR0aDp0LmNvcmVCb3gud2lkdGgpLzItNix5PXQueS0odC5leHBhbmRlZD90LmhlaWdodDp0LmNvcmVCb3guaGVpZ2h0KS8yKzY7dC5ub2RlLnR5cGUhPT1jLk5vZGVUeXBlLlNFUklFU3x8dC5leHBhbmRlZHx8KHYrPTEwLHktPTIpO3Q9InRyYW5zbGF0ZSgiK3YrIiwiK3krIikiO3Iuc2VsZWN0QWxsKCJwYXRoIikudHJhbnNpdGlvbigpLmF0dHIoInRyYW5zZm9ybSIsdCk7ci5zZWxlY3QoImNpcmNsZSIpLnRyYW5zaXRpb24oKS5hdHRyKHtjeDp2LGN5OnkscjpjLmxheW91dC5QQVJBTVMubm9kZVNpemUubWV0YS5leHBhbmRCdXR0b25SYWRpdXN9KX07ZC5wb3NpdGlvbkVsbGlwc2U9CmZ1bmN0aW9uKHIsdCx2LHkseil7ci50cmFuc2l0aW9uKCkuYXR0cigiY3giLHQpLmF0dHIoImN5Iix2KS5hdHRyKCJyeCIseS8yKS5hdHRyKCJyeSIsei8yKX07ZC5odW1hbml6ZUhlYWx0aFBpbGxTdGF0PW47ZC5hZGRIZWFsdGhQaWxsPXE7ZC5hZGRIZWFsdGhQaWxscz1mdW5jdGlvbihyLHQsdil7aWYodCl7dmFyIHk9MTtkMy5zZWxlY3Qocikuc2VsZWN0QWxsKCJnLm5vZGVzaGFwZSIpLmVhY2goZnVuY3Rpb24oeil7Y29uc3QgeD10W3oubm9kZS5uYW1lXTtxKHRoaXMseD94W3ZdOm51bGwseix5KyspfSl9fX0pKGMuc2NlbmV8fChjLnNjZW5lPXt9KSl9KShhLmdyYXBofHwoYS5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi90ZW1wbGF0ZS5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXtmdW5jdGlvbiBmKHEpe2xldCByPV8ubWFwKHtkZXB0aDpxLmRlcHRoLCJ8VnwiOnEubWV0YWdyYXBoLm5vZGVzKCkubGVuZ3RoLCJ8RXwiOnEubWV0YWdyYXBoLmVkZ2VzKCkubGVuZ3RofSxmdW5jdGlvbih0LHYpe3JldHVybiB2KyJceDNkIit0fSkuam9pbigiICIpO3E9Xy5tYXAocS5vcEhpc3RvZ3JhbSxmdW5jdGlvbih0LHYpe3JldHVybiB2KyJceDNkIit0fSkuam9pbigiLCIpO3JldHVybiByKyIgW29wc10gIitxfWZ1bmN0aW9uIGcocSl7Y29uc3Qgcj1xLmdldE5vZGVNYXAoKTtsZXQgdD1PYmplY3Qua2V5cyhyKS5yZWR1Y2UoKHYseSk9Pntjb25zdCB6PXJbeV07aWYoei50eXBlIT09Yy5Ob2RlVHlwZS5NRVRBKXJldHVybiB2O3k9eS5zcGxpdCgiLyIpLmxlbmd0aC0xO2xldCB4PWYoeiksQz12W3hdfHx7bm9kZXM6W10sbGV2ZWw6eX07dlt4XT1DO0Mubm9kZXMucHVzaCh6KTtDLmxldmVsPnkmJihDLmxldmVsPQp5KTtyZXR1cm4gdn0se30pO3JldHVybiBPYmplY3Qua2V5cyh0KS5tYXAodj0+W3YsdFt2XV0pLmZpbHRlcigoWyx2XSk9Pnsoe25vZGVzOnZ9PXYpO2lmKDE8di5sZW5ndGgpcmV0dXJuITA7dj12WzBdO3JldHVybiB2LnR5cGU9PT1jLk5vZGVUeXBlLk1FVEEmJnYuYXNzb2NpYXRlZEZ1bmN0aW9ufSkuc29ydCgoWyx2XSk9PnYubm9kZXNbMF0uZGVwdGgpfWZ1bmN0aW9uIGwocSxyKXtyZXR1cm4gXy5yZWR1Y2UocSxmdW5jdGlvbih0LHYpe2xldCB5PXZbMF0sej1bXTt2WzFdLm5vZGVzLmZvckVhY2goZnVuY3Rpb24oeCl7Zm9yKGxldCBDPTA7Qzx6Lmxlbmd0aDtDKyspaWYoIXJ8fG4oeltDXS5tZXRhbm9kZS5tZXRhZ3JhcGgseC5tZXRhZ3JhcGgpKXt4LnRlbXBsYXRlSWQ9eltDXS5tZXRhbm9kZS50ZW1wbGF0ZUlkO3pbQ10ubWVtYmVycy5wdXNoKHgubmFtZSk7cmV0dXJufXgudGVtcGxhdGVJZD15KyJbIit6Lmxlbmd0aCsiXSI7ei5wdXNoKHttZXRhbm9kZTp4LG1lbWJlcnM6W3gubmFtZV19KX0pOwp6LmZvckVhY2goZnVuY3Rpb24oeCl7dFt4Lm1ldGFub2RlLnRlbXBsYXRlSWRdPXtsZXZlbDp2WzFdLmxldmVsLG5vZGVzOngubWVtYmVyc319KTtyZXR1cm4gdH0se30pfWZ1bmN0aW9uIGsocSxyLHQpe3JldHVybiBfLnNvcnRCeShxLFt2PT5yLm5vZGUodikub3Asdj0+ci5ub2RlKHYpLnRlbXBsYXRlSWQsdj0+ci5uZWlnaGJvcnModikubGVuZ3RoLHY9PnIucHJlZGVjZXNzb3JzKHYpLmxlbmd0aCx2PT5yLnN1Y2Nlc3NvcnModikubGVuZ3RoLHY9PnYuc3Vic3RyKHQubGVuZ3RoKV0pfWZ1bmN0aW9uIG4ocSxyKXtmdW5jdGlvbiB0KEksTyl7bGV0IFA9SS5zdWJzdHIodi5sZW5ndGgpLEg9Ty5zdWJzdHIoeS5sZW5ndGgpO2lmKHpbUF1eeFtIXSlyZXR1cm4gY29uc29sZS53YXJuKCJkaWZmZXJlbnQgdmlzaXQgcGF0dGVybiIsIlsiK3YrIl0iLFAsIlsiK3krIl0iLEgpLCEwO3pbUF18fCh6W1BdPXhbSF09ITAsQy5wdXNoKHtuMTpJLG4yOk99KSk7cmV0dXJuITF9aWYoIWEuZ3JhcGguaGFzU2ltaWxhckRlZ3JlZVNlcXVlbmNlKHEsCnIpKXJldHVybiExO2xldCB2PXEuZ3JhcGgoKS5uYW1lLHk9ci5ncmFwaCgpLm5hbWUsej17fSx4PXt9LEM9W107dmFyIEY9cS5zb3VyY2VzKCksRD1yLnNvdXJjZXMoKTtpZihGLmxlbmd0aCE9PUQubGVuZ3RoKXJldHVybiBjb25zb2xlLmxvZygiZGlmZmVyZW50IHNvdXJjZSBsZW5ndGgiKSwhMTtGPWsoRixxLHYpO0Q9ayhELHIseSk7Zm9yKHZhciBCPTA7QjxGLmxlbmd0aDtCKyspaWYodChGW0JdLERbQl0pKXJldHVybiExO2Zvcig7MDxDLmxlbmd0aDspe0Q9Qy5wb3AoKTtpZighcChxLm5vZGUoRC5uMSksci5ub2RlKEQubjIpKSlyZXR1cm4hMTtGPXEuc3VjY2Vzc29ycyhELm4xKTtEPXIuc3VjY2Vzc29ycyhELm4yKTtpZihGLmxlbmd0aCE9PUQubGVuZ3RoKXJldHVybiBjb25zb2xlLmxvZygiIyBvZiBzdWNjZXNzb3JzIG1pc21hdGNoIixGLEQpLCExO0Y9ayhGLHEsdik7RD1rKEQscix5KTtmb3IoQj0wO0I8Ri5sZW5ndGg7QisrKWlmKHQoRltCXSxEW0JdKSlyZXR1cm4hMX1yZXR1cm4hMH0KZnVuY3Rpb24gcChxLHIpe2lmKHEudHlwZT09PWMuTm9kZVR5cGUuTUVUQSlyZXR1cm4gcS50ZW1wbGF0ZUlkJiZyLnRlbXBsYXRlSWQmJnEudGVtcGxhdGVJZD09PXIudGVtcGxhdGVJZDtpZihxLnR5cGU9PT1jLk5vZGVUeXBlLk9QJiZyLnR5cGU9PT1jLk5vZGVUeXBlLk9QKXJldHVybiBxLm9wPT09ci5vcDtpZihxLnR5cGU9PT1jLk5vZGVUeXBlLlNFUklFUyYmci50eXBlPT09Yy5Ob2RlVHlwZS5TRVJJRVMpe2xldCB0PXEubWV0YWdyYXBoLm5vZGVDb3VudCgpO3JldHVybiB0PT09ci5tZXRhZ3JhcGgubm9kZUNvdW50KCkmJigwPT09dHx8cS5tZXRhZ3JhcGgubm9kZShxLm1ldGFncmFwaC5ub2RlcygpWzBdKS5vcD09PXIubWV0YWdyYXBoLm5vZGUoci5tZXRhZ3JhcGgubm9kZXMoKVswXSkub3ApfXJldHVybiExfWQuZGV0ZWN0PWZ1bmN0aW9uKHEscil7cT1nKHEpO2xldCB0PWwocSxyKTtyZXR1cm4gT2JqZWN0LmtleXModCkuc29ydCh2PT50W3ZdLmxldmVsKS5yZWR1Y2UoKHYsCnkpPT57dlt5XT10W3ldO3JldHVybiB2fSx7fSl9fSkoYy50ZW1wbGF0ZXx8KGMudGVtcGxhdGU9e30pKX0pKGEuZ3JhcGh8fChhLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3V0aWwuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7ZC50aW1lPWZ1bmN0aW9uKGYsZyl7bGV0IGw9RGF0ZS5ub3coKTtnPWcoKTtjb25zb2xlLmxvZyhmLCI6IixEYXRlLm5vdygpLWwsIm1zIik7cmV0dXJuIGd9O2QuZ2V0VHJhY2tlcj1mdW5jdGlvbihmKXtyZXR1cm57c2V0TWVzc2FnZTpmdW5jdGlvbihnKXtmLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTpmLnByb2dyZXNzLnZhbHVlLG1zZzpnfSl9LHVwZGF0ZVByb2dyZXNzOmZ1bmN0aW9uKGcpe2Yuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOmYucHJvZ3Jlc3MudmFsdWUrZyxtc2c6Zi5wcm9ncmVzcy5tc2d9KX0scmVwb3J0RXJyb3I6ZnVuY3Rpb24oZyxsKXtjb25zb2xlLmVycm9yKGwuc3RhY2spO2Yuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOmYucHJvZ3Jlc3MudmFsdWUsbXNnOmcsZXJyb3I6ITB9KX19fTtkLmdldFN1YnRhc2tUcmFja2VyPWZ1bmN0aW9uKGYsZyxsKXtyZXR1cm57c2V0TWVzc2FnZTpmdW5jdGlvbihrKXtmLnNldE1lc3NhZ2UobCsKIjogIitrKX0sdXBkYXRlUHJvZ3Jlc3M6ZnVuY3Rpb24oayl7Zi51cGRhdGVQcm9ncmVzcyhrKmcvMTAwKX0scmVwb3J0RXJyb3I6ZnVuY3Rpb24oayxuKXtmLnJlcG9ydEVycm9yKGwrIjogIitrLG4pfX19O2QucnVuVGFzaz1mdW5jdGlvbihmLGcsbCxrKXtrLnNldE1lc3NhZ2UoZik7dHJ5e2xldCBuPWEuZ3JhcGgudXRpbC50aW1lKGYsbCk7ay51cGRhdGVQcm9ncmVzcyhnKTtyZXR1cm4gbn1jYXRjaChuKXtrLnJlcG9ydEVycm9yKCJGYWlsZWQgIitmLG4pfX07ZC5ydW5Bc3luY1Rhc2s9ZnVuY3Rpb24oZixnLGwsayl7cmV0dXJuIG5ldyBQcm9taXNlKG49PntrLnNldE1lc3NhZ2UoZik7c2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtsZXQgcD1hLmdyYXBoLnV0aWwudGltZShmLGwpO2sudXBkYXRlUHJvZ3Jlc3MoZyk7bihwKX1jYXRjaChwKXtrLnJlcG9ydEVycm9yKCJGYWlsZWQgIitmLHApfX0sMjApfSl9O2QucnVuQXN5bmNQcm9taXNlVGFzaz1mdW5jdGlvbihmLGcsbCxrKXtyZXR1cm4gbmV3IFByb21pc2UoKG4sCnApPT57ZnVuY3Rpb24gcShyKXtrLnJlcG9ydEVycm9yKCJGYWlsZWQgIitmLHIpO3Aocil9ay5zZXRNZXNzYWdlKGYpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7bGV0IHI9RGF0ZS5ub3coKTtsKCkudGhlbihmdW5jdGlvbih0KXtjb25zb2xlLmxvZyhmLCI6IixEYXRlLm5vdygpLXIsIm1zIik7ay51cGRhdGVQcm9ncmVzcyhnKTtuKHQpfSkuY2F0Y2gocSl9Y2F0Y2gocil7cShyKX19LDIwKX0pfTtkLmVzY2FwZVF1ZXJ5U2VsZWN0b3I9ZnVuY3Rpb24oZil7cmV0dXJuIGYucmVwbGFjZSgvKFs6LlxbXF0sL1xcXChcKV0pL2csIlxcJDEiKX07ZC5NRU1PUllfVU5JVFM9W3tzeW1ib2w6IkIifSx7c3ltYm9sOiJLQiIsbnVtVW5pdHM6MTAyNH0se3N5bWJvbDoiTUIiLG51bVVuaXRzOjEwMjR9LHtzeW1ib2w6IkdCIixudW1Vbml0czoxMDI0fSx7c3ltYm9sOiJUQiIsbnVtVW5pdHM6MTAyNH0se3N5bWJvbDoiUEIiLG51bVVuaXRzOjEwMjR9XTtkLlRJTUVfVU5JVFM9W3tzeW1ib2w6Ilx1MDBiNXMifSwKe3N5bWJvbDoibXMiLG51bVVuaXRzOjFFM30se3N5bWJvbDoicyIsbnVtVW5pdHM6MUUzfSx7c3ltYm9sOiJtaW4iLG51bVVuaXRzOjYwfSx7c3ltYm9sOiJociIsbnVtVW5pdHM6NjB9LHtzeW1ib2w6ImRheXMiLG51bVVuaXRzOjI0fV07ZC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGU9ZnVuY3Rpb24oZixnLGw9MCl7cmV0dXJuIGwrMTxnLmxlbmd0aCYmZj49Z1tsKzFdLm51bVVuaXRzP2EuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUoZi9nW2wrMV0ubnVtVW5pdHMsZyxsKzEpOk51bWJlcihmLnRvUHJlY2lzaW9uKDMpKSsiICIrZ1tsXS5zeW1ib2x9O2QuaGFzRGlzcGxheWFibGVOb2RlU3RhdHM9ZnVuY3Rpb24oZil7cmV0dXJuIGYmJigwPGYudG90YWxCeXRlc3x8MDxmLmdldFRvdGFsTWljcm9zKCl8fGYub3V0cHV0U2l6ZSk/ITA6ITF9O2QucmVtb3ZlQ29tbW9uUHJlZml4PWZ1bmN0aW9uKGYpe2lmKDI+Zi5sZW5ndGgpcmV0dXJuIGY7bGV0IGc9CjAsbD0wLGs9Xy5taW4oXy5tYXAoZixuPT5uLmxlbmd0aCkpO2Zvcig7Oyl7ZysrO2xldCBuPV8ubWFwKGYscD0+cC5zdWJzdHJpbmcoMCxnKSk7aWYobi5ldmVyeSgocCxxKT0+MD09PXE/ITA6cD09PW5bcS0xXSkpe2lmKGc+PWspcmV0dXJuIGY7bD1nfWVsc2UgYnJlYWt9cmV0dXJuIF8ubWFwKGYsbj0+bi5zdWJzdHJpbmcobCkpfTtkLmNvbXB1dGVIdW1hbkZyaWVuZGx5VGltZT1mdW5jdGlvbihmKXtmPStuZXcgRGF0ZS0rbmV3IERhdGUoZi8xRTMpO3JldHVybiAzRTQ+Zj8ianVzdCBub3ciOjZFND5mP01hdGguZmxvb3IoZi8xRTMpKyIgc2Vjb25kcyBhZ28iOjEyRTQ+Zj8iYSBtaW51dGUgYWdvIjozNkU1PmY/TWF0aC5mbG9vcihmLzZFNCkrIiBtaW51dGVzIGFnbyI6MT09TWF0aC5mbG9vcihmLzM2RTUpPyJhbiBob3VyIGFnbyI6ODY0RTU+Zj9NYXRoLmZsb29yKGYvMzZFNSkrIiBob3VycyBhZ28iOjE3MjhFNT5mPyJ5ZXN0ZXJkYXkiOk1hdGguZmxvb3IoZi84NjRFNSkrIiBkYXlzIGFnbyJ9fSkoYy51dGlsfHwKKGMudXRpbD17fSkpfSkoYS5ncmFwaHx8KGEuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vbWluaW1hcC5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpe2NsYXNzIGR7Y29uc3RydWN0b3IoZixnLGwsayxuLHApe3RoaXMuc3ZnPWY7dGhpcy5sYWJlbFBhZGRpbmc9cDt0aGlzLnpvb21HPWc7dGhpcy5tYWluWm9vbT1sO3RoaXMubWF4V2FuZEg9bjtmPWQzLnNlbGVjdChrLnNoYWRvd1Jvb3QpO2xldCBxPWYuc2VsZWN0KCJzdmciKSxyPXEuc2VsZWN0KCJyZWN0Iik7dGhpcy52aWV3cG9pbnRDb29yZD17eDowLHk6MH07Zz1kMy5kcmFnKCkuc3ViamVjdChPYmplY3QpLm9uKCJkcmFnIiwoKT0+e3RoaXMudmlld3BvaW50Q29vcmQueD1kMy5ldmVudC54O3RoaXMudmlld3BvaW50Q29vcmQueT1kMy5ldmVudC55O3RoaXMudXBkYXRlVmlld3BvaW50KCl9KTtyLmRhdHVtKHRoaXMudmlld3BvaW50Q29vcmQpLmNhbGwoZyk7cS5vbigiY2xpY2siLCgpPT57aWYoIWQzLmV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpe3ZhciB0PU51bWJlcihyLmF0dHIoIndpZHRoIikpLHY9TnVtYmVyKHIuYXR0cigiaGVpZ2h0IikpLAp5PWQzLm1vdXNlKHEubm9kZSgpKTt0aGlzLnZpZXdwb2ludENvb3JkLng9eVswXS10LzI7dGhpcy52aWV3cG9pbnRDb29yZC55PXlbMV0tdi8yO3RoaXMudXBkYXRlVmlld3BvaW50KCl9fSk7dGhpcy52aWV3cG9pbnQ9ci5ub2RlKCk7dGhpcy5taW5pbWFwU3ZnPXEubm9kZSgpO3RoaXMubWluaW1hcD1rO3RoaXMuY2FudmFzPWYuc2VsZWN0KCJjYW52YXMuZmlyc3QiKS5ub2RlKCk7dGhpcy5jYW52YXNCdWZmZXI9Zi5zZWxlY3QoImNhbnZhcy5zZWNvbmQiKS5ub2RlKCk7dGhpcy5kb3dubG9hZENhbnZhcz1mLnNlbGVjdCgiY2FudmFzLmRvd25sb2FkIikubm9kZSgpO2QzLnNlbGVjdCh0aGlzLmRvd25sb2FkQ2FudmFzKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKTt0aGlzLnVwZGF0ZSgpfXVwZGF0ZVZpZXdwb2ludCgpe2QzLnNlbGVjdCh0aGlzLnZpZXdwb2ludCkuYXR0cigieCIsdGhpcy52aWV3cG9pbnRDb29yZC54KS5hdHRyKCJ5Iix0aGlzLnZpZXdwb2ludENvb3JkLnkpO2xldCBmPQotdGhpcy52aWV3cG9pbnRDb29yZC54KnRoaXMuc2NhbGVNYWluL3RoaXMuc2NhbGVNaW5pbWFwLGc9LXRoaXMudmlld3BvaW50Q29vcmQueSp0aGlzLnNjYWxlTWFpbi90aGlzLnNjYWxlTWluaW1hcDtkMy5zZWxlY3QodGhpcy5zdmcpLmNhbGwodGhpcy5tYWluWm9vbS50cmFuc2Zvcm0sZDMuem9vbUlkZW50aXR5LnRyYW5zbGF0ZShmLGcpLnNjYWxlKHRoaXMuc2NhbGVNYWluKSl9dXBkYXRlKCl7bGV0IGY9bnVsbDt0cnl7aWYoZj10aGlzLnpvb21HLmdldEJCb3goKSwwPT09Zi53aWR0aClyZXR1cm59Y2F0Y2godCl7cmV0dXJufXZhciBnPWQzLnNlbGVjdCgiI2dyYXBoZG93bmxvYWQiKTt0aGlzLmRvd25sb2FkPWcubm9kZSgpO2cub24oImNsaWNrIiwoKT0+e1VSTC5yZXZva2VPYmplY3RVUkwodGhpcy5kb3dubG9hZC5ocmVmKTt2YXIgdD10aGlzLmRvd25sb2FkQ2FudmFzLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIik7Y29uc3Qgdj10LnNsaWNlKDAsdC5pbmRleE9mKCIsIikpO2lmKHYuZW5kc1dpdGgoIjtiYXNlNjQiKSl7dmFyIHk9CmF0b2IodC5zbGljZSh0LmluZGV4T2YoIiwiKSsxKSk7dD0obmV3IFVpbnQ4QXJyYXkoeS5sZW5ndGgpKS5tYXAoKHoseCk9PnkuY2hhckNvZGVBdCh4KSk7dGhpcy5kb3dubG9hZC5ocmVmPVVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3RdLHt0eXBlOiJpbWFnZS9wbmcifSkpfWVsc2UgY29uc29sZS53YXJuKGBub24tYmFzZTY0IGRhdGEgVVJMICgke3Z9KTsgY2Fubm90IHVzZSBibG9iIGRvd25sb2FkYCksdGhpcy5kb3dubG9hZC5ocmVmPXR9KTtnPWQzLnNlbGVjdCh0aGlzLnN2Zyk7dmFyIGw9IiIsaz10aGlzLnN2ZztrPShrLmdldFJvb3ROb2RlP2suZ2V0Um9vdE5vZGUoKTp0aGlzLnN2Zy5wYXJlbnROb2RlKS5zdHlsZVNoZWV0cztmb3IodmFyIG49MDtuPGsubGVuZ3RoO24rKyl0cnl7dmFyIHA9a1tuXS5jc3NSdWxlc3x8a1tuXS5ydWxlcztpZihudWxsIT1wKWZvcihsZXQgdD0wO3Q8cC5sZW5ndGg7dCsrKWwrPXBbdF0uY3NzVGV4dC5yZXBsYWNlKC8gP3RmLVtcdy1dKyA/L2csCiIiKSsiXG4ifWNhdGNoKHQpe2lmKCJTZWN1cml0eUVycm9yIiE9PXQubmFtZSl0aHJvdyB0O31wPWcuYXBwZW5kKCJzdHlsZSIpO3AudGV4dChsKTtsPWQzLnNlbGVjdCh0aGlzLnpvb21HKTtrPWwuYXR0cigidHJhbnNmb3JtIik7bC5hdHRyKCJ0cmFuc2Zvcm0iLG51bGwpO2YuaGVpZ2h0Kz1mLnk7Zi53aWR0aCs9Zi54O2YuaGVpZ2h0Kz0yKnRoaXMubGFiZWxQYWRkaW5nO2Yud2lkdGgrPTIqdGhpcy5sYWJlbFBhZGRpbmc7Zy5hdHRyKCJ3aWR0aCIsZi53aWR0aCkuYXR0cigiaGVpZ2h0IixmLmhlaWdodCk7dGhpcy5zY2FsZU1pbmltYXA9dGhpcy5tYXhXYW5kSC9NYXRoLm1heChmLndpZHRoLGYuaGVpZ2h0KTt0aGlzLm1pbmltYXBTaXplPXt3aWR0aDpmLndpZHRoKnRoaXMuc2NhbGVNaW5pbWFwLGhlaWdodDpmLmhlaWdodCp0aGlzLnNjYWxlTWluaW1hcH07ZDMuc2VsZWN0KHRoaXMubWluaW1hcFN2ZykuYXR0cih0aGlzLm1pbmltYXBTaXplKTtkMy5zZWxlY3QodGhpcy5jYW52YXNCdWZmZXIpLmF0dHIodGhpcy5taW5pbWFwU2l6ZSk7Cm49ZDMuc2VsZWN0KHRoaXMuZG93bmxvYWRDYW52YXMpO24uc3R5bGUoIndpZHRoIixmLndpZHRoKTtuLnN0eWxlKCJoZWlnaHQiLGYuaGVpZ2h0KTtuLmF0dHIoIndpZHRoIiwzKmYud2lkdGgpO24uYXR0cigiaGVpZ2h0IiwzKmYuaGVpZ2h0KTtudWxsIT10aGlzLnRyYW5zbGF0ZSYmbnVsbCE9dGhpcy56b29tJiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PnRoaXMuem9vbSgpKTtsZXQgcT0obmV3IFhNTFNlcmlhbGl6ZXIpLnNlcmlhbGl6ZVRvU3RyaW5nKHRoaXMuc3ZnKTtwLnJlbW92ZSgpO2cuYXR0cigid2lkdGgiLG51bGwpLmF0dHIoImhlaWdodCIsbnVsbCk7bC5hdHRyKCJ0cmFuc2Zvcm0iLGspO2xldCByPW5ldyBJbWFnZTtyLm9ubG9hZD0oKT0+e3ZhciB0PXRoaXMuY2FudmFzQnVmZmVyLmdldENvbnRleHQoIjJkIik7dC5jbGVhclJlY3QoMCwwLHRoaXMuY2FudmFzQnVmZmVyLndpZHRoLHRoaXMuY2FudmFzQnVmZmVyLmhlaWdodCk7dC5kcmF3SW1hZ2UociwwLDAsdGhpcy5taW5pbWFwU2l6ZS53aWR0aCwKdGhpcy5taW5pbWFwU2l6ZS5oZWlnaHQpO3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e2QzLnNlbGVjdCh0aGlzLmNhbnZhc0J1ZmZlcikuc3R5bGUoImRpc3BsYXkiLG51bGwpO2QzLnNlbGVjdCh0aGlzLmNhbnZhcykuc3R5bGUoImRpc3BsYXkiLCJub25lIik7W3RoaXMuY2FudmFzLHRoaXMuY2FudmFzQnVmZmVyXT1bdGhpcy5jYW52YXNCdWZmZXIsdGhpcy5jYW52YXNdfSk7dD10aGlzLmRvd25sb2FkQ2FudmFzLmdldENvbnRleHQoIjJkIik7dC5jbGVhclJlY3QoMCwwLHRoaXMuZG93bmxvYWRDYW52YXMud2lkdGgsdGhpcy5kb3dubG9hZENhbnZhcy5oZWlnaHQpO3QuZHJhd0ltYWdlKHIsMCwwLHRoaXMuZG93bmxvYWRDYW52YXMud2lkdGgsdGhpcy5kb3dubG9hZENhbnZhcy5oZWlnaHQpfTtyLm9uZXJyb3I9KCk9PntyLnNyYz1VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtxXSx7dHlwZToiaW1hZ2Uvc3ZnK3htbDtjaGFyc2V0XHgzZHV0Zi04In0pKX07ci5zcmM9CiJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldFx4M2R1dGYtOCwiK2VuY29kZVVSSUNvbXBvbmVudChxKX16b29tKGYpe2lmKG51bGwhPXRoaXMuc2NhbGVNaW5pbWFwKXtmJiYodGhpcy50cmFuc2xhdGU9W2YueCxmLnldLHRoaXMuc2NhbGVNYWluPWYuayk7dmFyIGc9dGhpcy5zdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbD1kMy5zZWxlY3QodGhpcy52aWV3cG9pbnQpO3RoaXMudmlld3BvaW50Q29vcmQueD0tdGhpcy50cmFuc2xhdGVbMF0qdGhpcy5zY2FsZU1pbmltYXAvdGhpcy5zY2FsZU1haW47dGhpcy52aWV3cG9pbnRDb29yZC55PS10aGlzLnRyYW5zbGF0ZVsxXSp0aGlzLnNjYWxlTWluaW1hcC90aGlzLnNjYWxlTWFpbjtmPWcud2lkdGgqdGhpcy5zY2FsZU1pbmltYXAvdGhpcy5zY2FsZU1haW47Zz1nLmhlaWdodCp0aGlzLnNjYWxlTWluaW1hcC90aGlzLnNjYWxlTWFpbjtsLmF0dHIoIngiLHRoaXMudmlld3BvaW50Q29vcmQueCkuYXR0cigieSIsdGhpcy52aWV3cG9pbnRDb29yZC55KS5hdHRyKCJ3aWR0aCIsCmYpLmF0dHIoImhlaWdodCIsZyk7bD10aGlzLm1pbmltYXBTaXplLndpZHRoO3ZhciBrPXRoaXMubWluaW1hcFNpemUuaGVpZ2h0LG49dGhpcy52aWV3cG9pbnRDb29yZC54LHA9dGhpcy52aWV3cG9pbnRDb29yZC55Oy44PihNYXRoLm1pbihNYXRoLm1heCgwLG4rZiksbCktTWF0aC5taW4oTWF0aC5tYXgoMCxuKSxsKSkqKE1hdGgubWluKE1hdGgubWF4KDAscCtnKSxrKS1NYXRoLm1pbihNYXRoLm1heCgwLHApLGspKS8obCprKT90aGlzLm1pbmltYXAuY2xhc3NMaXN0LnJlbW92ZSgiaGlkZGVuIik6dGhpcy5taW5pbWFwLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpfX19Yy5NaW5pbWFwPWR9KShhLnNjZW5lfHwoYS5zY2VuZT17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoL3RmLWdyYXBoLW1pbmltYXAuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZ3JhcGgtbWluaW1hcCIsaW5pdDpmdW5jdGlvbihhLGMsZCxmLGcpe3JldHVybiBuZXcgdGYuc2NlbmUuTWluaW1hcChhLGMsZCx0aGlzLGYsZyl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgvdGYtZ3JhcGgtc2NlbmUuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZ3JhcGgtc2NlbmUiLHByb3BlcnRpZXM6e3JlbmRlckhpZXJhcmNoeTpPYmplY3QsbmFtZTpTdHJpbmcsY29sb3JCeTpTdHJpbmcsdHJhY2VJbnB1dHM6Qm9vbGVhbixfaGFzUmVuZGVySGllcmFyY2h5QmVlbkZpdE9uY2U6Qm9vbGVhbixfaXNBdHRhY2hlZDpCb29sZWFuLF96b29tOk9iamVjdCxoaWdobGlnaHRlZE5vZGU6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfaGlnaGxpZ2h0ZWROb2RlQ2hhbmdlZCJ9LHNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9zZWxlY3RlZE5vZGVDaGFuZ2VkIn0saGFuZGxlRWRnZVNlbGVjdGVkOk9iamVjdCxfem9vbWVkOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9vblpvb21DaGFuZ2VkIix2YWx1ZTohMX0sX3pvb21TdGFydENvb3Jkczp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX3pvb21UcmFuc2Zvcm06e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9tYXhab29tRGlzdGFuY2VGb3JDbGljazp7dHlwZTpOdW1iZXIsCnZhbHVlOjIwfSx0ZW1wbGF0ZUluZGV4OkZ1bmN0aW9uLG1pbmltYXA6T2JqZWN0LF9ub2RlR3JvdXBJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LF9hbm5vdGF0aW9uR3JvdXBJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LF9lZGdlR3JvdXBJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LG1heE1ldGFub2RlTGFiZWxMZW5ndGhGb250U2l6ZTp7dHlwZTpOdW1iZXIsdmFsdWU6OX0sbWluTWV0YW5vZGVMYWJlbExlbmd0aEZvbnRTaXplOnt0eXBlOk51bWJlcix2YWx1ZTo2fSxtYXhNZXRhbm9kZUxhYmVsTGVuZ3RoTGFyZ2VGb250Ont0eXBlOk51bWJlcix2YWx1ZToxMX0sbWF4TWV0YW5vZGVMYWJlbExlbmd0aDp7dHlwZTpOdW1iZXIsdmFsdWU6MTh9LHByb2dyZXNzOk9iamVjdCxub2RlQ29udGV4dE1lbnVJdGVtczpBcnJheSxub2RlTmFtZXNUb0hlYWx0aFBpbGxzOk9iamVjdCwKaGVhbHRoUGlsbFN0ZXBJbmRleDpOdW1iZXJ9LG9ic2VydmVyczpbIl9jb2xvckJ5Q2hhbmdlZChjb2xvckJ5KSIsIl9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkKHJlbmRlckhpZXJhcmNoeSkiLCJfYW5pbWF0ZUFuZEZpdChfaXNBdHRhY2hlZCwgcmVuZGVySGllcmFyY2h5KSIsIl91cGRhdGVIZWFsdGhQaWxscyhub2RlTmFtZXNUb0hlYWx0aFBpbGxzLCBoZWFsdGhQaWxsU3RlcEluZGV4KSIsIl91cGRhdGVJbnB1dFRyYWNlKHRyYWNlSW5wdXRzLCBzZWxlY3RlZE5vZGUpIl0sZ2V0Tm9kZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShhKX0saXNOb2RlRXhwYW5kZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZXhwYW5kZWR9LHNldE5vZGVFeHBhbmRlZDpmdW5jdGlvbigpe3RoaXMuX2J1aWxkKHRoaXMucmVuZGVySGllcmFyY2h5KTt0aGlzLl91cGRhdGVMYWJlbHMoIXRoaXMuX3pvb21lZCl9LHBhblRvTm9kZShhKXt0Zi5ncmFwaC5zY2VuZS5wYW5Ub05vZGUoYSwKdGhpcy4kLnN2Zyx0aGlzLiQucm9vdCx0aGlzLl96b29tKSYmKHRoaXMuX3pvb21lZD0hMCl9LGdldEdyYXBoU3ZnUm9vdCgpe3JldHVybiB0aGlzLiQuc3ZnfSxnZXRDb250ZXh0TWVudSgpe3JldHVybiB0aGlzLiQuY29udGV4dE1lbnV9LF9yZXNldFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5fbm9kZUdyb3VwSW5kZXg9e307dGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXg9e307dGhpcy5fZWRnZUdyb3VwSW5kZXg9e307dGhpcy5fdXBkYXRlTGFiZWxzKCExKTtkMy5zZWxlY3QodGhpcy4kLnN2Zykuc2VsZWN0KCIjcm9vdCIpLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpO3RmLmdyYXBoLnNjZW5lLm5vZGUucmVtb3ZlR3JhZGllbnREZWZpbml0aW9ucyh0aGlzLiQuc3ZnKX0sX2J1aWxkOmZ1bmN0aW9uKGEpe3RoaXMudGVtcGxhdGVJbmRleD1hLmhpZXJhcmNoeS5nZXRUZW1wbGF0ZUluZGV4KCk7dGYuZ3JhcGgudXRpbC50aW1lKCJ0Zi1ncmFwaC1zY2VuZSAobGF5b3V0KToiLGZ1bmN0aW9uKCl7dGYuZ3JhcGgubGF5b3V0LmxheW91dFNjZW5lKGEucm9vdCwKdGhpcyl9LmJpbmQodGhpcykpO3RmLmdyYXBoLnV0aWwudGltZSgidGYtZ3JhcGgtc2NlbmUgKGJ1aWxkIHNjZW5lKToiLGZ1bmN0aW9uKCl7dGYuZ3JhcGguc2NlbmUuYnVpbGRHcm91cChkMy5zZWxlY3QodGhpcy4kLnJvb3QpLGEucm9vdCx0aGlzKTt0Zi5ncmFwaC5zY2VuZS5hZGRHcmFwaENsaWNrTGlzdGVuZXIodGhpcy4kLnN2Zyx0aGlzKTt0aGlzLl91cGRhdGVJbnB1dFRyYWNlKCl9LmJpbmQodGhpcykpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVIZWFsdGhQaWxscyh0aGlzLm5vZGVOYW1lc1RvSGVhbHRoUGlsbHMsdGhpcy5oZWFsdGhQaWxsU3RlcEluZGV4KTt0aGlzLm1pbmltYXAudXBkYXRlKCl9LmJpbmQodGhpcyksdGYuZ3JhcGgubGF5b3V0LlBBUkFNUy5hbmltYXRpb24uZHVyYXRpb24pfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX3pvb209ZDMuem9vbSgpLm9uKCJlbmQiLGZ1bmN0aW9uKCl7dGhpcy5fem9vbVN0YXJ0Q29vcmRzJiYoTWF0aC5zcXJ0KE1hdGgucG93KHRoaXMuX3pvb21TdGFydENvb3Jkcy54LQp0aGlzLl96b29tVHJhbnNmb3JtLngsMikrTWF0aC5wb3codGhpcy5fem9vbVN0YXJ0Q29vcmRzLnktdGhpcy5fem9vbVRyYW5zZm9ybS55LDIpKTx0aGlzLl9tYXhab29tRGlzdGFuY2VGb3JDbGljaz90aGlzLl9maXJlRW5hYmxlQ2xpY2soKTpzZXRUaW1lb3V0KHRoaXMuX2ZpcmVFbmFibGVDbGljay5iaW5kKHRoaXMpLDUwKSk7dGhpcy5fem9vbVN0YXJ0Q29vcmRzPW51bGx9LmJpbmQodGhpcykpLm9uKCJ6b29tIixmdW5jdGlvbigpe3RoaXMuX3pvb21UcmFuc2Zvcm09ZDMuZXZlbnQudHJhbnNmb3JtO3RoaXMuX3pvb21TdGFydENvb3Jkc3x8KHRoaXMuX3pvb21TdGFydENvb3Jkcz10aGlzLl96b29tVHJhbnNmb3JtLHRoaXMuZmlyZSgiZGlzYWJsZS1jbGljayIpKTt0aGlzLl96b29tZWQ9ITA7ZDMuc2VsZWN0KHRoaXMuJC5yb290KS5hdHRyKCJ0cmFuc2Zvcm0iLGQzLmV2ZW50LnRyYW5zZm9ybSk7dGhpcy5taW5pbWFwLnpvb20oZDMuZXZlbnQudHJhbnNmb3JtKX0uYmluZCh0aGlzKSk7CmQzLnNlbGVjdCh0aGlzLiQuc3ZnKS5jYWxsKHRoaXMuX3pvb20pLm9uKCJkYmxjbGljay56b29tIixudWxsKTtkMy5zZWxlY3Qod2luZG93KS5vbigicmVzaXplIixmdW5jdGlvbigpe3RoaXMubWluaW1hcC56b29tKCl9LmJpbmQodGhpcykpO3RoaXMubWluaW1hcD10aGlzLiQubWluaW1hcC5pbml0KHRoaXMuJC5zdmcsdGhpcy4kLnJvb3QsdGhpcy5fem9vbSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLm1pbmltYXAuc2l6ZSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLnN1YnNjZW5lLm1ldGEubGFiZWxIZWlnaHQpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITApfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITEpfSxfcmVuZGVySGllcmFyY2h5Q2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLl9oYXNSZW5kZXJIaWVyYXJjaHlCZWVuRml0T25jZT0hMTt0aGlzLl9yZXNldFN0YXRlKCk7dGhpcy5fYnVpbGQoYSl9LF9hbmltYXRlQW5kRml0OmZ1bmN0aW9uKGEpeyF0aGlzLl9oYXNSZW5kZXJIaWVyYXJjaHlCZWVuRml0T25jZSYmCmEmJnNldFRpbWVvdXQodGhpcy5maXQuYmluZCh0aGlzKSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLmFuaW1hdGlvbi5kdXJhdGlvbil9LF91cGRhdGVMYWJlbHM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy4kJCgiLnRpdGxlIiksZD1jLnN0eWxlLGY9dGhpcy4kJCgiLmF1eFRpdGxlIiksZz1mLnN0eWxlLGw9dGhpcy4kJCgiLmZ1bmN0aW9uTGlicmFyeVRpdGxlIikuc3R5bGU7Y29uc3Qgaz1kMy5zZWxlY3QodGhpcy4kLnN2Zyk7dmFyIG49ay5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuQ09SRSkubm9kZSgpO2lmKGEmJm4mJnRoaXMucHJvZ3Jlc3MmJjEwMD09PXRoaXMucHJvZ3Jlc3MudmFsdWUpe2E9ay5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuSU5FWFRSQUNUKS5ub2RlKCl8fGsuc2VsZWN0KCIuIisKdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuR1JPVVArIlx4M2UuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5PVVRFWFRSQUNUKS5ub2RlKCk7dmFyIHA9bi5nZXRDVE0oKS5lO249YT9hLmdldENUTSgpLmU6bnVsbDtkLmRpc3BsYXk9ImlubGluZSI7ZC5sZWZ0PXArInB4IjtudWxsIT09biYmbiE9PXA/KGcuZGlzcGxheT0iaW5saW5lIixuPU1hdGgubWF4KHArYy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCxuKSxnLmxlZnQ9bisicHgiKTpnLmRpc3BsYXk9Im5vbmUiO2M9KGM9ay5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSkubm9kZSgpKT9jLmdldENUTSgpLmU6bnVsbDtudWxsIT09YyYmYyE9PW4/KGwuZGlzcGxheT0iaW5saW5lIixjPU1hdGgubWF4KG4rZi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCxjKSxsLmxlZnQ9YysicHgiKToKbC5kaXNwbGF5PSJub25lIn1lbHNlIGQuZGlzcGxheT0ibm9uZSIsZy5kaXNwbGF5PSJub25lIixsLmRpc3BsYXk9Im5vbmUifSxfY29sb3JCeUNoYW5nZWQ6ZnVuY3Rpb24oKXtudWxsIT10aGlzLnJlbmRlckhpZXJhcmNoeSYmKF8uZWFjaCh0aGlzLl9ub2RlR3JvdXBJbmRleCwoYSxjKT0+e3RoaXMuX3VwZGF0ZU5vZGVTdGF0ZShjKX0pLHRoaXMubWluaW1hcC51cGRhdGUoKSl9LGZpdDpmdW5jdGlvbigpe3RoaXMuX2hhc1JlbmRlckhpZXJhcmNoeUJlZW5GaXRPbmNlPSEwO3RmLmdyYXBoLnNjZW5lLmZpdCh0aGlzLiQuc3ZnLHRoaXMuJC5yb290LHRoaXMuX3pvb20sZnVuY3Rpb24oKXt0aGlzLl96b29tZWQ9ITF9LmJpbmQodGhpcykpfSxpc05vZGVTZWxlY3RlZDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PXRoaXMuc2VsZWN0ZWROb2RlfSxpc05vZGVIaWdobGlnaHRlZDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PXRoaXMuaGlnaGxpZ2h0ZWROb2RlfSxhZGRBbm5vdGF0aW9uR3JvdXA6ZnVuY3Rpb24oYSwKYyxkKXthPWEubm9kZS5uYW1lO3RoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2FdPXRoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2FdfHx7fTt0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleFthXVtjLm5vZGUubmFtZV09ZH0sZ2V0QW5ub3RhdGlvbkdyb3Vwc0luZGV4OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleFthXX0scmVtb3ZlQW5ub3RhdGlvbkdyb3VwOmZ1bmN0aW9uKGEsYyl7ZGVsZXRlIHRoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2Eubm9kZS5uYW1lXVtjLm5vZGUubmFtZV19LGFkZE5vZGVHcm91cDpmdW5jdGlvbihhLGMpe3RoaXMuX25vZGVHcm91cEluZGV4W2FdPWN9LGdldE5vZGVHcm91cDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fbm9kZUdyb3VwSW5kZXhbYV19LHJlbW92ZU5vZGVHcm91cDpmdW5jdGlvbihhKXtkZWxldGUgdGhpcy5fbm9kZUdyb3VwSW5kZXhbYV19LGFkZEVkZ2VHcm91cDpmdW5jdGlvbihhLGMpe3RoaXMuX2VkZ2VHcm91cEluZGV4W2FdPQpjfSxnZXRFZGdlR3JvdXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX2VkZ2VHcm91cEluZGV4W2FdfSxfdXBkYXRlSGVhbHRoUGlsbHM6ZnVuY3Rpb24oYSxjKXt0Zi5ncmFwaC5zY2VuZS5hZGRIZWFsdGhQaWxscyh0aGlzLiQuc3ZnLGEsYyl9LF91cGRhdGVOb2RlU3RhdGU6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5nZXROb2RlKGEpLGQ9dGhpcy5nZXROb2RlR3JvdXAoYSk7ZCYmdGYuZ3JhcGguc2NlbmUubm9kZS5zdHlsaXplKGQsYyx0aGlzKTtjLm5vZGUudHlwZT09PXRmLmdyYXBoLk5vZGVUeXBlLk1FVEEmJmMubm9kZS5hc3NvY2lhdGVkRnVuY3Rpb24mJiFjLmlzTGlicmFyeUZ1bmN0aW9uJiYoZD1kMy5zZWxlY3QoIi4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLkdST1VQKyJceDNlLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSsnIGdbZGF0YS1uYW1lXHgzZCInKyh0Zi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKwpjLm5vZGUuYXNzb2NpYXRlZEZ1bmN0aW9uKSsnIl0nKSx0Zi5ncmFwaC5zY2VuZS5ub2RlLnN0eWxpemUoZCxjLHRoaXMpKTtfLmVhY2godGhpcy5nZXRBbm5vdGF0aW9uR3JvdXBzSW5kZXgoYSksZj0+e3RmLmdyYXBoLnNjZW5lLm5vZGUuc3R5bGl6ZShmLGMsdGhpcyx0Zi5ncmFwaC5zY2VuZS5DbGFzcy5Bbm5vdGF0aW9uLk5PREUpfSl9LF9zZWxlY3RlZE5vZGVDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7aWYoYSE9PWMmJihjJiZ0aGlzLl91cGRhdGVOb2RlU3RhdGUoYyksYSkpe3RoaXMubWluaW1hcC51cGRhdGUoKTtjPXRoaXMucmVuZGVySGllcmFyY2h5LmhpZXJhcmNoeS5ub2RlKGEpO2Zvcih2YXIgZD1bXTtudWxsIT1jLnBhcmVudE5vZGUmJmMucGFyZW50Tm9kZS5uYW1lIT10Zi5ncmFwaC5ST09UX05BTUU7KWM9Yy5wYXJlbnROb2RlLGQucHVzaChjLm5hbWUpO3ZhciBmO18uZm9yRWFjaFJpZ2h0KGQsZz0+e3RoaXMucmVuZGVySGllcmFyY2h5LmJ1aWxkU3ViaGllcmFyY2h5KGcpOwpnPXRoaXMucmVuZGVySGllcmFyY2h5LmdldFJlbmRlck5vZGVCeU5hbWUoZyk7Zy5ub2RlLmlzR3JvdXBOb2RlJiYhZy5leHBhbmRlZCYmKGcuZXhwYW5kZWQ9ITAsZnx8KGY9ZykpfSk7ZiYmKHRoaXMuc2V0Tm9kZUV4cGFuZGVkKGYpLHRoaXMuX3pvb21lZD0hMCk7YSYmdGhpcy5fdXBkYXRlTm9kZVN0YXRlKGEpO3NldFRpbWVvdXQoKCk9Pnt0aGlzLnBhblRvTm9kZShhKX0sdGYuZ3JhcGgubGF5b3V0LlBBUkFNUy5hbmltYXRpb24uZHVyYXRpb24pfX0sX2hpZ2hsaWdodGVkTm9kZUNoYW5nZWQ6ZnVuY3Rpb24oYSxjKXthIT09YyYmKGEmJnRoaXMuX3VwZGF0ZU5vZGVTdGF0ZShhKSxjJiZ0aGlzLl91cGRhdGVOb2RlU3RhdGUoYykpfSxfb25ab29tQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUxhYmVscyghdGhpcy5fem9vbWVkKX0sX2ZpcmVFbmFibGVDbGljazpmdW5jdGlvbigpe3RoaXMuZmlyZSgiZW5hYmxlLWNsaWNrIil9LF91cGRhdGVJbnB1dFRyYWNlOmZ1bmN0aW9uKCl7dGYuZ3JhcGguc2NlbmUubm9kZS51cGRhdGVJbnB1dFRyYWNlKHRoaXMuZ2V0R3JhcGhTdmdSb290KCksCnRoaXMucmVuZGVySGllcmFyY2h5LHRoaXMuc2VsZWN0ZWROb2RlLHRoaXMudHJhY2VJbnB1dHMpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoL3RmLWdyYXBoLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWdyYXBoIixwcm9wZXJ0aWVzOntncmFwaEhpZXJhcmNoeTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLG9ic2VydmVyOiJfZ3JhcGhDaGFuZ2VkIn0sYmFzaWNHcmFwaDpPYmplY3Qsc3RhdHM6T2JqZWN0LGRldmljZXNGb3JTdGF0czpPYmplY3QsaGllcmFyY2h5UGFyYW1zOk9iamVjdCxwcm9ncmVzczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSx0aXRsZTpTdHJpbmcsc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGVjdGVkRWRnZTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxfbGFzdFNlbGVjdGVkRWRnZUdyb3VwOk9iamVjdCxoaWdobGlnaHRlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sY29sb3JCeTpTdHJpbmcsY29sb3JCeVBhcmFtczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSxyZW5kZXJIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sdHJhY2VJbnB1dHM6Qm9vbGVhbiwKbm9kZUNvbnRleHRNZW51SXRlbXM6QXJyYXksX3JlbmRlckRlcHRoOnt0eXBlOk51bWJlcix2YWx1ZToxfSxfYWxsb3dHcmFwaFNlbGVjdDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxub2RlTmFtZXNUb0hlYWx0aFBpbGxzOk9iamVjdCxoZWFsdGhQaWxsU3RlcEluZGV4Ok51bWJlcixlZGdlV2lkdGhGdW5jdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6IiJ9LGhhbmRsZU5vZGVTZWxlY3RlZDp7dHlwZTpPYmplY3QsdmFsdWU6IiJ9LGVkZ2VMYWJlbEZ1bmN0aW9uOnt0eXBlOk9iamVjdCx2YWx1ZToiIn0saGFuZGxlRWRnZVNlbGVjdGVkOnt0eXBlOk9iamVjdCx2YWx1ZToiIn19LG9ic2VydmVyczpbIl9zdGF0c0NoYW5nZWQoc3RhdHMsIGRldmljZXNGb3JTdGF0cykiLCJfYnVpbGROZXdSZW5kZXJIaWVyYXJjaHkoZ3JhcGhIaWVyYXJjaHksIGVkZ2VXaWR0aEZ1bmN0aW9uLCBoYW5kbGVOb2RlU2VsZWN0ZWQsIGVkZ2VMYWJlbEZ1bmN0aW9uLCBoYW5kbGVFZGdlU2VsZWN0ZWQpIiwiX3NlbGVjdGVkTm9kZUNoYW5nZWQoc2VsZWN0ZWROb2RlKSIsCiJfc2VsZWN0ZWRFZGdlQ2hhbmdlZChzZWxlY3RlZEVkZ2UpIl0scGFuVG9Ob2RlKGEpe3RoaXMuJCQoInRmLWdyYXBoLXNjZW5lIikucGFuVG9Ob2RlKGEpfSxfYnVpbGROZXdSZW5kZXJIaWVyYXJjaHkoYSl7YSYmdGhpcy5fYnVpbGRSZW5kZXJIaWVyYXJjaHkoYSl9LF9zdGF0c0NoYW5nZWQ6ZnVuY3Rpb24oYSxjKXt0aGlzLmdyYXBoSGllcmFyY2h5JiYoYSYmYyYmKHRmLmdyYXBoLmpvaW5TdGF0c0luZm9XaXRoR3JhcGgodGhpcy5iYXNpY0dyYXBoLGEsYyksdGYuZ3JhcGguaGllcmFyY2h5LmpvaW5BbmRBZ2dyZWdhdGVTdGF0cyh0aGlzLmdyYXBoSGllcmFyY2h5KSksdGhpcy5fYnVpbGRSZW5kZXJIaWVyYXJjaHkodGhpcy5ncmFwaEhpZXJhcmNoeSkpfSxfYnVpbGRSZW5kZXJIaWVyYXJjaHk6ZnVuY3Rpb24oYSl7dGYuZ3JhcGgudXRpbC50aW1lKCJuZXcgdGYuZ3JhcGgucmVuZGVyLkhpZXJhcmNoeSIsZnVuY3Rpb24oKXtmdW5jdGlvbiBjKGYpe3JldHVybnttaW5WYWx1ZTpmLmRvbWFpbigpWzBdLAptYXhWYWx1ZTpmLmRvbWFpbigpWzFdLHN0YXJ0Q29sb3I6Zi5yYW5nZSgpWzBdLGVuZENvbG9yOmYucmFuZ2UoKVsxXX19aWYoYS5yb290LnR5cGU9PT10Zi5ncmFwaC5Ob2RlVHlwZS5NRVRBKXt2YXIgZD1uZXcgdGYuZ3JhcGgucmVuZGVyLlJlbmRlckdyYXBoSW5mbyhhLCEhdGhpcy5zdGF0cyk7ZC5lZGdlTGFiZWxGdW5jdGlvbj10aGlzLmVkZ2VMYWJlbEZ1bmN0aW9uO2QuZWRnZVdpZHRoRnVuY3Rpb249dGhpcy5lZGdlV2lkdGhGdW5jdGlvbjt0aGlzLl9zZXRDb2xvckJ5UGFyYW1zKHtjb21wdXRlX3RpbWU6YyhkLmNvbXB1dGVUaW1lU2NhbGUpLG1lbW9yeTpjKGQubWVtb3J5VXNhZ2VTY2FsZSksZGV2aWNlOl8ubWFwKGQuZGV2aWNlQ29sb3JNYXAuZG9tYWluKCksZnVuY3Rpb24oZil7cmV0dXJue2RldmljZTpmLGNvbG9yOmQuZGV2aWNlQ29sb3JNYXAoZil9fSkseGxhX2NsdXN0ZXI6Xy5tYXAoZC54bGFDbHVzdGVyQ29sb3JNYXAuZG9tYWluKCksZnVuY3Rpb24oZil7cmV0dXJue3hsYV9jbHVzdGVyOmYsCmNvbG9yOmQueGxhQ2x1c3RlckNvbG9yTWFwKGYpfX0pfSk7dGhpcy5fc2V0UmVuZGVySGllcmFyY2h5KGQpO3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmZpcmUoInJlbmRlcmVkIil9KX19LmJpbmQodGhpcykpfSxfZ2V0VmlzaWJsZTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnJlbmRlckhpZXJhcmNoeS5nZXROZWFyZXN0VmlzaWJsZUFuY2VzdG9yKGEpOmF9LGxpc3RlbmVyczp7ImdyYXBoLXNlbGVjdCI6Il9ncmFwaFNlbGVjdGVkIiwiZGlzYWJsZS1jbGljayI6Il9kaXNhYmxlQ2xpY2siLCJlbmFibGUtY2xpY2siOiJfZW5hYmxlQ2xpY2siLCJub2RlLXRvZ2dsZS1leHBhbmQiOiJfbm9kZVRvZ2dsZUV4cGFuZCIsIm5vZGUtc2VsZWN0IjoiX25vZGVTZWxlY3RlZCIsIm5vZGUtaGlnaGxpZ2h0IjoiX25vZGVIaWdobGlnaHRlZCIsIm5vZGUtdW5oaWdobGlnaHQiOiJfbm9kZVVuaGlnaGxpZ2h0ZWQiLCJub2RlLXRvZ2dsZS1leHRyYWN0IjoiX25vZGVUb2dnbGVFeHRyYWN0IiwKIm5vZGUtdG9nZ2xlLXNlcmllc2dyb3VwIjoiX25vZGVUb2dnbGVTZXJpZXNHcm91cCIsImVkZ2Utc2VsZWN0IjoiX2VkZ2VTZWxlY3RlZCIsImFubm90YXRpb24tc2VsZWN0IjoiX25vZGVTZWxlY3RlZCIsImFubm90YXRpb24taGlnaGxpZ2h0IjoiX25vZGVIaWdobGlnaHRlZCIsImFubm90YXRpb24tdW5oaWdobGlnaHQiOiJfbm9kZVVuaGlnaGxpZ2h0ZWQifSxmaXQ6ZnVuY3Rpb24oKXt0aGlzLiQuc2NlbmUuZml0KCl9LF9ncmFwaENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoImdyYXBoLXNlbGVjdCIpfSxfZ3JhcGhTZWxlY3RlZDpmdW5jdGlvbigpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3QmJih0aGlzLnNldCgic2VsZWN0ZWROb2RlIixudWxsKSx0aGlzLnNldCgic2VsZWN0ZWRFZGdlIixudWxsKSk7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMH0sX2Rpc2FibGVDbGljazpmdW5jdGlvbigpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3Q9ITF9LF9lbmFibGVDbGljazpmdW5jdGlvbigpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3Q9CiEwfSxfc2VsZWN0ZWROb2RlQ2hhbmdlZChhKXt0aGlzLmhhbmRsZU5vZGVTZWxlY3RlZCYmdGhpcy5oYW5kbGVOb2RlU2VsZWN0ZWQoYSl9LF9zZWxlY3RlZEVkZ2VDaGFuZ2VkKGEpe3RoaXMuX2Rlc2VsZWN0UHJldmlvdXNFZGdlKCk7YSYmKHRoaXMuX2xhc3RTZWxlY3RlZEVkZ2VHcm91cC5jbGFzc2VkKHRmLmdyYXBoLnNjZW5lLkNsYXNzLkVkZ2UuU0VMRUNURUQsITApLHRoaXMuX3VwZGF0ZU1hcmtlck9mU2VsZWN0ZWRFZGdlKGEpKTt0aGlzLmhhbmRsZUVkZ2VTZWxlY3RlZCYmdGhpcy5oYW5kbGVFZGdlU2VsZWN0ZWQoYSl9LF9ub2RlU2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdCYmdGhpcy5zZXQoInNlbGVjdGVkTm9kZSIsYS5kZXRhaWwubmFtZSk7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMH0sX2VkZ2VTZWxlY3RlZChhKXt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0JiYodGhpcy5zZXQoIl9sYXN0U2VsZWN0ZWRFZGdlR3JvdXAiLGEuZGV0YWlsLmVkZ2VHcm91cCksCnRoaXMuc2V0KCJzZWxlY3RlZEVkZ2UiLGEuZGV0YWlsLmVkZ2VEYXRhKSk7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMH0sX25vZGVIaWdobGlnaHRlZDpmdW5jdGlvbihhKXt0aGlzLnNldCgiaGlnaGxpZ2h0ZWROb2RlIixhLmRldGFpbC5uYW1lKX0sX25vZGVVbmhpZ2hsaWdodGVkOmZ1bmN0aW9uKCl7dGhpcy5zZXQoImhpZ2hsaWdodGVkTm9kZSIsbnVsbCl9LF9ub2RlVG9nZ2xlRXhwYW5kOmZ1bmN0aW9uKGEpe3RoaXMuX25vZGVTZWxlY3RlZChhKTthPWEuZGV0YWlsLm5hbWU7dmFyIGM9dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShhKTtjLm5vZGUudHlwZSE9PXRmLmdyYXBoLk5vZGVUeXBlLk9QJiYodGhpcy5yZW5kZXJIaWVyYXJjaHkuYnVpbGRTdWJoaWVyYXJjaHkoYSksYy5leHBhbmRlZD0hYy5leHBhbmRlZCx0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy4kLnNjZW5lLnNldE5vZGVFeHBhbmRlZChjKX0sNzUpKX0sX25vZGVUb2dnbGVFeHRyYWN0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZVRvZ2dsZUV4dHJhY3QoYS5kZXRhaWwubmFtZSl9LApub2RlVG9nZ2xlRXh0cmFjdDpmdW5jdGlvbihhKXthPXRoaXMucmVuZGVySGllcmFyY2h5LmdldFJlbmRlck5vZGVCeU5hbWUoYSk7YS5ub2RlLmluY2x1ZGU9YS5ub2RlLmluY2x1ZGU9PXRmLmdyYXBoLkluY2x1c2lvblR5cGUuSU5DTFVERT90Zi5ncmFwaC5JbmNsdXNpb25UeXBlLkVYQ0xVREU6YS5ub2RlLmluY2x1ZGU9PXRmLmdyYXBoLkluY2x1c2lvblR5cGUuRVhDTFVERT90Zi5ncmFwaC5JbmNsdXNpb25UeXBlLklOQ0xVREU6dGhpcy5yZW5kZXJIaWVyYXJjaHkuaXNOb2RlQXV4aWxpYXJ5KGEpP3RmLmdyYXBoLkluY2x1c2lvblR5cGUuSU5DTFVERTp0Zi5ncmFwaC5JbmNsdXNpb25UeXBlLkVYQ0xVREU7dGhpcy5fYnVpbGRSZW5kZXJIaWVyYXJjaHkodGhpcy5ncmFwaEhpZXJhcmNoeSl9LF9ub2RlVG9nZ2xlU2VyaWVzR3JvdXA6ZnVuY3Rpb24oYSl7dGhpcy5ub2RlVG9nZ2xlU2VyaWVzR3JvdXAoYS5kZXRhaWwubmFtZSl9LG5vZGVUb2dnbGVTZXJpZXNHcm91cDpmdW5jdGlvbihhKXt0Zi5ncmFwaC50b2dnbGVOb2RlU2VyaWVzR3JvdXAodGhpcy5oaWVyYXJjaHlQYXJhbXMuc2VyaWVzTWFwLAphKTt0aGlzLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTowLG1zZzoiIn0pO3RmLmdyYXBoLmhpZXJhcmNoeS5idWlsZCh0aGlzLmJhc2ljR3JhcGgsdGhpcy5oaWVyYXJjaHlQYXJhbXMsdGYuZ3JhcGgudXRpbC5nZXRTdWJ0YXNrVHJhY2tlcih0Zi5ncmFwaC51dGlsLmdldFRyYWNrZXIodGhpcyksMTAwLCJOYW1lc3BhY2UgaGllcmFyY2h5IikpLnRoZW4oZnVuY3Rpb24oYyl7dGhpcy5zZXQoImdyYXBoSGllcmFyY2h5IixjKTt0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0aGlzLmdyYXBoSGllcmFyY2h5KX0uYmluZCh0aGlzKSl9LF9kZXNlbGVjdFByZXZpb3VzRWRnZSgpe2QzLnNlbGVjdCgiLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuRWRnZS5TRUxFQ1RFRCkuY2xhc3NlZCh0Zi5ncmFwaC5zY2VuZS5DbGFzcy5FZGdlLlNFTEVDVEVELCExKS5lYWNoKGE9PntpZihhLmxhYmVsKXtjb25zdCBjPWQzLnNlbGVjdCh0aGlzKS5zZWxlY3RBbGwoInBhdGguZWRnZWxpbmUiKTthLmxhYmVsLnN0YXJ0TWFya2VySWQmJgpjLnN0eWxlKCJtYXJrZXItc3RhcnQiLGB1cmwoIyR7YS5sYWJlbC5zdGFydE1hcmtlcklkfSlgKTthLmxhYmVsLmVuZE1hcmtlcklkJiZjLnN0eWxlKCJtYXJrZXItZW5kIixgdXJsKCMke2EubGFiZWwuZW5kTWFya2VySWR9KWApfX0pfSxfdXBkYXRlTWFya2VyT2ZTZWxlY3RlZEVkZ2UoYSl7aWYoYS5sYWJlbCl7dmFyIGM9YS5sYWJlbC5zdGFydE1hcmtlcklkfHxhLmxhYmVsLmVuZE1hcmtlcklkO2lmKGMpe2NvbnN0IGQ9Yy5yZXBsYWNlKCJkYXRhZmxvdy0iLCJzZWxlY3RlZC0iKTtsZXQgZj10aGlzLiQkKCIjIitkKTtmfHwoYz10aGlzLiQuc2NlbmUucXVlcnlTZWxlY3RvcigiIyIrYyksZj1jLmNsb25lTm9kZSghMCksZi5zZXRBdHRyaWJ1dGUoImlkIixkKSxmLmNsYXNzTGlzdC5hZGQoInNlbGVjdGVkLWFycm93aGVhZCIpLGMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChmKSk7YT1hLmxhYmVsLnN0YXJ0TWFya2VySWQ/Im1hcmtlci1zdGFydCI6Im1hcmtlci1lbmQiO3RoaXMuX2xhc3RTZWxlY3RlZEVkZ2VHcm91cC5zZWxlY3RBbGwoInBhdGguZWRnZWxpbmUiKS5zdHlsZShhLApgdXJsKCMke2R9KWApfX19LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4hYX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1sb2FkZXIvdGYtZ3JhcGgtbG9hZGVyLmpzCihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWdyYXBoLWxvYWRlciIsX3RlbXBsYXRlOm51bGwscHJvcGVydGllczp7ZGF0YXNldHM6QXJyYXksc2VsZWN0ZWREYXRhOnt0eXBlOk51bWJlcix2YWx1ZTowfSxzZWxlY3RlZEZpbGU6T2JqZWN0LGNvbXBhdGliaWxpdHlQcm92aWRlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBhLmdyYXBoLm9wLlRwdUNvbXBhdGliaWxpdHlQcm92aWRlcn0sb3ZlcnJpZGluZ0hpZXJhcmNoeVBhcmFtczp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LHByb2dyZXNzOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LG91dEdyYXBoSGllcmFyY2h5Ont0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9LG91dEdyYXBoOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9LG91dEhpZXJhcmNoeVBhcmFtczp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfX0sb2JzZXJ2ZXJzOlsiX2xvYWREYXRhKGRhdGFzZXRzLCBzZWxlY3RlZERhdGEsIG92ZXJyaWRpbmdIaWVyYXJjaHlQYXJhbXMsIGNvbXBhdGliaWxpdHlQcm92aWRlcikiLAoiX2xvYWRGaWxlKHNlbGVjdGVkRmlsZSwgb3ZlcnJpZGluZ0hpZXJhcmNoeVBhcmFtcywgY29tcGF0aWJpbGl0eVByb3ZpZGVyKSJdLF9sb2FkRGF0YSgpe3RoaXMuZGVib3VuY2UoImxvYWQiLCgpPT57Y29uc3QgZD10aGlzLmRhdGFzZXRzW3RoaXMuc2VsZWN0ZWREYXRhXTtkJiZ0aGlzLl9wYXJzZUFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoKGQucGF0aCl9KX0sX3BhcnNlQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoZCxmKXtjb25zdCB7b3ZlcnJpZGluZ0hpZXJhcmNoeVBhcmFtczpnLGNvbXBhdGliaWxpdHlQcm92aWRlcjpsfT10aGlzO3RoaXMucHJvZ3Jlc3M9e3ZhbHVlOjAsbXNnOiIifTtjb25zdCBrPWEuZ3JhcGgudXRpbC5nZXRUcmFja2VyKHRoaXMpLG49T2JqZWN0LmFzc2lnbih7fSxhLmdyYXBoLmhpZXJhcmNoeS5EZWZhdWx0SGllcmFyY2h5UGFyYW1zLGcpO2EuZ3JhcGgubG9hZGVyLmZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoaywKZCxmLGwsbikudGhlbigoe2dyYXBoOnAsZ3JhcGhIaWVyYXJjaHk6cX0pPT57dGhpcy5fc2V0T3V0SGllcmFyY2h5UGFyYW1zKG4pO3RoaXMuX3NldE91dEdyYXBoKHApO3RoaXMuX3NldE91dEdyYXBoSGllcmFyY2h5KHEpfSl9LF9sb2FkRmlsZShkKXtpZihkKXtkPWQudGFyZ2V0O3ZhciBmPWQuZmlsZXNbMF07ZiYmKGQudmFsdWU9IiIsdGhpcy5fcGFyc2VBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChudWxsLGYpKX19fSl9KShjLmxvYWRlcnx8KGMubG9hZGVyPXt9KSl9KShhLmdyYXBofHwoYS5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC9oZWFsdGgtcGlsbHMuanMKdmFyIGdwOwooZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhnLGwpe2lmKG51bGw9PWcpdGhyb3cgRXJyb3IoYE1pc3NpbmcgcmVmVmFsdWUgZm9yIGNvbmRpdGlvbiAoJHtsfSkuYCk7fWZ1bmN0aW9uIGQoZyl7cmV0dXJuIG51bGw9PWd8fDA9PWcubGVuZ3RofHwxIT09Z1swXX1jb25zdCBmPXtJTkZfT1JfTkFOOntkZXNjcmlwdGlvbjoiQ29udGFpbnMgKy8tXHUyMjFlIG9yIE5hTiIscHJlZGljYXRlOmc9PjA8Z1syXXx8MDxnWzNdfHwwPGdbN119LElORjp7ZGVzY3JpcHRpb246IkNvbnRhaW5zICsvLVx1MjIxZSIscHJlZGljYXRlOmc9PjA8Z1szXXx8MDxnWzddfSxOQU46e2Rlc2NyaXB0aW9uOiJDb250YWlucyBOYU4iLHByZWRpY2F0ZTpnPT4wPGdbMl19LE1BWF9HVDp7ZGVzY3JpcHRpb246Ik1heCBceDNlIixwcmVkaWNhdGU6KGcsbCk9PntjKGwsIk1BWF9HVCIpO3JldHVybiBnWzldPmx9fSxNQVhfTFQ6e2Rlc2NyaXB0aW9uOiJNYXggXHgzYyIscHJlZGljYXRlOihnLGwpPT57YyhsLCJNQVhfTFQiKTsKcmV0dXJuIGdbOV08bH19LE1JTl9HVDp7ZGVzY3JpcHRpb246Ik1pbiBceDNlIixwcmVkaWNhdGU6KGcsbCk9PntjKGwsIk1JTl9HVCIpO3JldHVybiBnWzhdPmx9fSxNSU5fTFQ6e2Rlc2NyaXB0aW9uOiJNaW4gXHgzYyIscHJlZGljYXRlOihnLGwpPT57YyhsLCJNSU5fTFQiKTtyZXR1cm4gZ1s4XTxsfX0sTUVBTl9HVDp7ZGVzY3JpcHRpb246Ik1lYW4gXHgzZSIscHJlZGljYXRlOihnLGwpPT57YyhsLCJNRUFOX0dUIik7cmV0dXJuIGdbMTBdPmx9fSxNRUFOX0xUOntkZXNjcmlwdGlvbjoiTWVhbiBceDNjIixwcmVkaWNhdGU6KGcsbCk9PntjKGwsIk1FQU5fTFQiKTtyZXR1cm4gZ1sxMF08bH19LFJBTkdFX0dUOntkZXNjcmlwdGlvbjoiTWF4IC0gTWluIFx4M2UiLHByZWRpY2F0ZTooZyxsKT0+e2MobCwiUkFOR0VfR1QiKTtyZXR1cm4gZ1s5XS1nWzhdPmx9fSxSQU5HRV9MVDp7ZGVzY3JpcHRpb246Ik1heCAtIE1pbiBceDNjIixwcmVkaWNhdGU6KGcsbCk9PntjKGwsIlJBTkdFX0xUIik7CnJldHVybiBnWzldLWdbOF08bH19LFNURERFVl9HVDp7ZGVzY3JpcHRpb246IlN0YW5kYXJkIGRldmlhdGlvbiBceDNlIixwcmVkaWNhdGU6KGcsbCk9PntjKGwsIlNURERFVl9HVCIpO3JldHVybiBNYXRoLnNxcnQoZ1sxMV0pPmx9fSxTVERERVZfTFQ6e2Rlc2NyaXB0aW9uOiJTdGFuZGFyZCBkZXZpYXRpb24gXHgzYyIscHJlZGljYXRlOihnLGwpPT57YyhsLCJTVERERVZfTFQiKTtyZXR1cm4gTWF0aC5zcXJ0KGdbMTFdKTxsfX19O2EudGVuc29yQ29uZGl0aW9uRGVzY3JpcHRpb24yS2V5PWZ1bmN0aW9uKGcpe2Zvcihjb25zdCBsIGluIGYpaWYoZi5oYXNPd25Qcm9wZXJ0eShsKSYmZltsXS5kZXNjcmlwdGlvbj09PWcpcmV0dXJuIGw7cmV0dXJuIG51bGx9O2EuY2hlY2tIZWFsdGhQaWxsQWdhaW5zdFRlbnNvckNvbmRpdGlvbktleT1mdW5jdGlvbihnLGwsayl7aWYoZChsKSlyZXR1cm4hMTtnPWZbZ10ucHJlZGljYXRlO3JldHVybiBnKGwsayl9fSkoZ3B8fChncD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1kZWJ1Z2dlci1jb250aW51ZS1kaWFsb2cuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZGVidWdnZXItY29udGludWUtZGlhbG9nIixwcm9wZXJ0aWVzOntjb250aW51ZU51bTp7dHlwZTpOdW1iZXIsdmFsdWU6NX0sc2Vzc2lvblJ1bkdvOkZ1bmN0aW9uLHRlbnNvckNvbmRpdGlvbkdvOkZ1bmN0aW9uLGZvcmNlQ29udGludWF0aW9uU3RvcDpGdW5jdGlvbixfY29udGludWVCdXR0b25UZXh0Ont0eXBlOlN0cmluZyx2YWx1ZToiQ29udGludWUuLi4ifSxfY29udGludWVCdXR0b25Db250aW51ZVRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJDb250aW51ZS4uLiIscmVhZG9ubHk6ITB9LF9jb250aW51ZUJ1dHRvblN0b3BUZXh0Ont0eXBlOlN0cmluZyx2YWx1ZToiU3RvcCBDb250aW51YXRpb24iLHJlYWRvbmx5OiEwfSxfc2VsZWN0ZWRUZW5zb3JDb25kaXRpb246U3RyaW5nLF90ZW5zb3JDb25kaXRpb25SZWZWYWx1ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LF9pc1JlZlZhbHVlSW5wdXRIaWRkZW46e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCwKbm90aWZ5OiEwfX0sb2JzZXJ2ZXJzOlsiX29uU2VsZWN0ZWRUZW5zb3JDb25kaXRpb25DaGFuZ2VkKF9zZWxlY3RlZFRlbnNvckNvbmRpdGlvbikiXSxub3RpZnlDb250aW51YXRpb25TdG9wKCl7dGhpcy51cGRhdGVDb250aW51ZUJ1dHRvblRleHQoITEpfSxfb3BlbkRpYWxvZygpe3RoaXMuJC5jb250aW51ZURpYWxvZy5vcGVuKCl9LF9jbG9zZURpYWxvZygpe3RoaXMuJC5jb250aW51ZURpYWxvZy5jbG9zZSgpfSxfY29udGludWVCdXR0b25DYWxsYmFjaygpe3RoaXMuX2NvbnRpbnVlQnV0dG9uVGV4dD09PXRoaXMuX2NvbnRpbnVlQnV0dG9uU3RvcFRleHQ/dGhpcy5mb3JjZUNvbnRpbnVhdGlvblN0b3AoKTp0aGlzLl9vcGVuRGlhbG9nKCl9LHVwZGF0ZUNvbnRpbnVlQnV0dG9uVGV4dChhKXt0aGlzLnNldCgiX2NvbnRpbnVlQnV0dG9uVGV4dCIsYT90aGlzLl9jb250aW51ZUJ1dHRvblN0b3BUZXh0OnRoaXMuX2NvbnRpbnVlQnV0dG9uQ29udGludWVUZXh0KX0sX3Nlc3Npb25SdW5Hb0J1dHRvbkNhbGxiYWNrKCl7MDwKdGhpcy5jb250aW51ZU51bT8odGhpcy5zZXNzaW9uUnVuR28odGhpcy5jb250aW51ZU51bSksdGhpcy51cGRhdGVDb250aW51ZUJ1dHRvblRleHQoITApLHRoaXMuX2Nsb3NlRGlhbG9nKCkpOnRoaXMuc2V0KCJjb250aW51ZU51bSIsMSl9LF90ZW5zb3JDb250aW51ZUdvQnV0dG9uQ2FsbGJhY2soKXtpZihudWxsIT10aGlzLl9zZWxlY3RlZFRlbnNvckNvbmRpdGlvbil7dmFyIGE9Z3AudGVuc29yQ29uZGl0aW9uRGVzY3JpcHRpb24yS2V5KHRoaXMuX3NlbGVjdGVkVGVuc29yQ29uZGl0aW9uKTtudWxsPT1hJiZjb25zb2xlLmVycm9yKCJJbnZhbGlkIFRlbnNvciBDb25kaXRpb24gbmFtZToiK3RoaXMuX3NlbGVjdGVkVGVuc29yQ29uZGl0aW9uKTt2YXIgYz1OdW1iZXIodGhpcy5fdGVuc29yQ29uZGl0aW9uUmVmVmFsdWUpO051bWJlci5pc0Zpbml0ZShjKT8odGhpcy50ZW5zb3JDb25kaXRpb25HbyhhLGMpLHRoaXMudXBkYXRlQ29udGludWVCdXR0b25UZXh0KCEwKSx0aGlzLl9jbG9zZURpYWxvZygpKToKdGhpcy5zZXQoIl90ZW5zb3JDb25kaXRpb25SZWZWYWx1ZSIsMCl9fSxfb25TZWxlY3RlZFRlbnNvckNvbmRpdGlvbkNoYW5nZWQoYSl7YT1ncC50ZW5zb3JDb25kaXRpb25EZXNjcmlwdGlvbjJLZXkoYSk7dGhpcy5zZXQoIl9pc1JlZlZhbHVlSW5wdXRIaWRkZW4iLC0xIT09WyJJTkZfT1JfTkFOIiwiSU5GIiwiTkFOIl0uaW5kZXhPZihhKSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLWRlYnVnZ2VyLWluaXRpYWwtZGlhbG9nLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRlYnVnZ2VyLWluaXRpYWwtZGlhbG9nIixwcm9wZXJ0aWVzOntfdGl0bGU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9jdXN0b21NZXNzYWdlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfaGFzQ3VzdG9tTWVzc2FnZTp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc0N1c3RvbU1lc3NhZ2UoX2N1c3RvbU1lc3NhZ2UpIn0sX2hvc3Q6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9wb3J0Ont0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfb3Blbjp7dHlwZTpCb29sZWFufSxfaGlkZGVuOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGlkZGVuKF9vcGVuKSIscmVmbGVjdFRvQXR0cmlidXRlOiEwfX0sb3BlbkRpYWxvZyhhLGMpe3RoaXMuc2V0KCJfdGl0bGUiLCJEZWJ1Z2dlciBpcyB3YWl0aW5nIGZvciBTZXNzaW9uLnJ1bigpIGNvbm5lY3Rpb25zLi4uIik7dGhpcy5zZXQoIl9jdXN0b21NZXNzYWdlIixudWxsKTt0aGlzLiQuZGlhbG9nLm9wZW4oKTsKbnVsbCE9YSYmbnVsbCE9YyYmKHRoaXMuc2V0KCJfaG9zdCIsYSksdGhpcy5zZXQoIl9wb3J0IixjKSl9LGNsb3NlRGlhbG9nKCl7dGhpcy4kLmRpYWxvZy5jbG9zZSgpfSxvcGVuRGlzYWJsZWREaWFsb2coKXt0aGlzLnNldCgiX3RpdGxlIiwiRGVidWdnZXIgaXMgbm90IGVuYWJsZWQgaW4gdGhpcyBUZW5zb3JCb2FyZCBpbnN0YW5jZSIpO3RoaXMuc2V0KCJfY3VzdG9tTWVzc2FnZSIsIlRvIGVuYWJsZSB0aGUgZGVidWdnZXIgaW4gVGVuc29yQm9hcmQsIHVzZSB0aGUgZmxhZzogLS1kZWJ1Z2dlcl9wb3J0IFx4M2Nwb3J0X251bWJlclx4M2UiKTt0aGlzLiQuZGlhbG9nLm9wZW4oKX0sX2NvbXB1dGVIaWRkZW4oYSl7cmV0dXJuIWF9LF9jb21wdXRlSGFzQ3VzdG9tTWVzc2FnZShhKXtyZXR1cm4hXy5pc0VtcHR5KGEpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1kZWJ1Z2dlci1yZXNpemVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRlYnVnZ2VyLXJlc2l6ZXIiLHByb3BlcnRpZXM6e2N1cnJlbnRMZW5ndGg6e3R5cGU6TnVtYmVyLG5vdGlmeTohMH0sbWluTGVuZ3RoOk51bWJlcixtYXhMZW5ndGg6TnVtYmVyLGlzSG9yaXpvbnRhbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX3Jlc2l6ZXJJZGVudGlmaWVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAscmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfaXNWZXJ0aWNhbDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUlzVmVydGljYWwoaXNIb3Jpem9udGFsKSIscmVmbGVjdFRvQXR0cmlidXRlOiEwLHJlYWRPbmx5OiEwfSxfZHJhZ1N0YXJ0UG9zaXRpb246TnVtYmVyLF9kcmFnU3RhcnRMZW5ndGg6TnVtYmVyLF9wcmV2aW91c01vdXNlTW92ZUNhbGxiYWNrOk9iamVjdCxfcHJldmlvdXNNb3VzZVVwQ2FsbGJhY2s6T2JqZWN0fSxsaXN0ZW5lcnM6e21vdXNlZG93bjoiX2hhbmRsZU1vdXNlRG93biJ9LApfaGFuZGxlTW91c2VEb3duKGEpe2EucHJldmVudERlZmF1bHQoKTt0aGlzLl9lbmREcmFnKCk7dGhpcy5fcHJldmlvdXNNb3VzZU1vdmVDYWxsYmFjaz1jPT57Yy5wcmV2ZW50RGVmYXVsdCgpO2M9dGhpcy5fZHJhZ1N0YXJ0TGVuZ3RoKyh0aGlzLl9nZXRQb3NpdGlvblJlbGF0aXZlVG9WaWV3cG9ydChjKS10aGlzLl9kcmFnU3RhcnRQb3NpdGlvbik7Yz1NYXRoLm1heChjLHRoaXMubWluTGVuZ3RoKTtjPU1hdGgubWluKGMsdGhpcy5tYXhMZW5ndGgpO3RoaXMuc2V0KCJjdXJyZW50TGVuZ3RoIixjKX07dGhpcy5fcHJldmlvdXNNb3VzZVVwQ2FsbGJhY2s9Yz0+e2MucHJldmVudERlZmF1bHQoKTt0aGlzLl9lbmREcmFnKCl9O3RoaXMuc2V0KCJfZHJhZ1N0YXJ0UG9zaXRpb24iLHRoaXMuX2dldFBvc2l0aW9uUmVsYXRpdmVUb1ZpZXdwb3J0KGEpKTt0aGlzLnNldCgiX2RyYWdTdGFydExlbmd0aCIsdGhpcy5jdXJyZW50TGVuZ3RoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsCnRoaXMuX3ByZXZpb3VzTW91c2VVcENhbGxiYWNrLCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIix0aGlzLl9wcmV2aW91c01vdXNlTW92ZUNhbGxiYWNrLCExKX0sX2dldFBvc2l0aW9uUmVsYXRpdmVUb1ZpZXdwb3J0KGEpe3JldHVybiB0aGlzLmlzSG9yaXpvbnRhbD9hLmNsaWVudFk6YS5jbGllbnRYfSxfZW5kRHJhZygpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMuX3ByZXZpb3VzTW91c2VNb3ZlQ2FsbGJhY2ssITEpO3RoaXMuX3ByZXZpb3VzTW91c2VNb3ZlQ2FsbGJhY2s9bnVsbDt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsdGhpcy5fcHJldmlvdXNNb3VzZVVwQ2FsbGJhY2ssITEpO3RoaXMuX3ByZXZpb3VzTW91c2VVcENhbGxiYWNrPW51bGx9LF9jb21wdXRlSXNWZXJ0aWNhbChhKXtyZXR1cm4hYX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvc2VsZWN0aW9uLXRyZWUtbm9kZS5qcwooZnVuY3Rpb24oYSl7YS5OT0RFX05BTUVfU0VQQVJBVE9SPSIvIjthLkRFVklDRV9OQU1FX1BBVFRFUk49L15cL2pvYjpbQS1aYS16MC05X10rXC9yZXBsaWNhOlswLTlfXStcL3Rhc2s6WzAtOV0rXC9kZXZpY2U6W0EtWmEtejAtOV9dKzpbMC05XSsvO2xldCBjOyhmdW5jdGlvbihnKXtnW2cuRU1QVFk9MF09IkVNUFRZIjtnW2cuQ0hFQ0tFRD0xXT0iQ0hFQ0tFRCI7Z1tnLlBBUlRJQUw9Ml09IlBBUlRJQUwifSkoYz1hLkNoZWNrYm94U3RhdGV8fChhLkNoZWNrYm94U3RhdGU9e30pKTthLnNwbGl0Tm9kZU5hbWU9ZnVuY3Rpb24oZyl7bGV0IGw9W107Y29uc3Qgaz1nLm1hdGNoKGEuREVWSUNFX05BTUVfUEFUVEVSTik7bnVsbCE9ayYmKGwucHVzaChrWzBdKSwiLyIhPT1nW2tbMF0ubGVuZ3RoXSYmY29uc29sZS5lcnJvcignTm8gc2xhc2ggKCIvIikgYWZ0ZXIgZGV2aWNlIG5hbWUgaW4gbm9kZSBuYW1lOicsZyksZz1nLnNsaWNlKGtbMF0ubGVuZ3RoKzEpKTtyZXR1cm4gbC5jb25jYXQoZy5zcGxpdChhLk5PREVfTkFNRV9TRVBBUkFUT1IpKX07CmEuZ2V0Q2xlYW5Ob2RlTmFtZT1mdW5jdGlvbihnKXtsZXQgbD1nO2NvbnN0IGs9Zy5tYXRjaChhLkRFVklDRV9OQU1FX1BBVFRFUk4pO251bGwhPWs/KGwubGVuZ3RoPmtbMF0ubGVuZ3RoJiYiLyIhPWxba1swXS5sZW5ndGhdJiZjb25zb2xlLmVycm9yKCdObyBzbGFzaCAoIi8iKSBhZnRlciBkZXZpY2UgbmFtZSBpbiBub2RlIG5hbWU6JyxnKSxsPWwuc2xpY2Uoa1swXS5sZW5ndGgrMSkpOiIvIj09PWxbMF0mJihsPWwuc2xpY2UoMSkpO2wuaW5kZXhPZigiKSIpPT09bC5sZW5ndGgtMSYmKGw9bC5zbGljZSgwLGwuaW5kZXhPZigiLygiKSkpO3JldHVybiBsfTthLnNvcnRBbmRCYXNlRXhwYW5kRGVidWdXYXRjaGVzPWZ1bmN0aW9uKGcpe2cuc29ydCgoayxuKT0+ay5ub2RlX25hbWU8bi5ub2RlX25hbWU/LTE6ay5ub2RlX25hbWU+bi5ub2RlX25hbWU/MTprLm91dHB1dF9zbG90LW4ub3V0cHV0X3Nsb3QpO2ZvcihsZXQgaz0wO2s8Zy5sZW5ndGg7KytrKXt2YXIgbD1nW2tdLm5vZGVfbmFtZSsKIi8iO2xldCBuPSExO2ZvcihsZXQgcD1rKzE7cDxnLmxlbmd0aDsrK3ApaWYoMD09PWdbcF0ubm9kZV9uYW1lLmluZGV4T2YobCkpe249ITA7YnJlYWt9biYmKGw9Z1trXS5ub2RlX25hbWUuc3BsaXQoIi8iKSxnW2tdLm5vZGVfbmFtZSs9Ii8oIitsW2wubGVuZ3RoLTFdKyIpIil9fTthLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbj1mdW5jdGlvbihnKXtyZXR1cm4gZy5lbmRzV2l0aCgiKSIpP2cuc2xpY2UoMCxnLmxhc3RJbmRleE9mKCIvKCIpKTpnfTthLmFzc2VtYmxlRGV2aWNlQW5kTm9kZU5hbWVzPWZ1bmN0aW9uKGcpe2NvbnN0IGw9W251bGwsbnVsbF07aWYoZ1swXS5tYXRjaChhLkRFVklDRV9OQU1FX1BBVFRFUk4pKXtsZXQgaz1nWzBdOyIvIj09PWtbay5sZW5ndGgtMV0mJihrPWsuc2xpY2UoMCxrLmxlbmd0aC0xKSk7bFswXT1rO2xbMV09Zy5zbGljZSgxKS5qb2luKCIvIil9ZWxzZSBsWzFdPWcuam9pbigiLyIpO3JldHVybiBsfTtsZXQgZDsoZnVuY3Rpb24oZyl7Z1tnLk5vZGVOYW1lPQowXT0iTm9kZU5hbWUiO2dbZy5PcFR5cGU9MV09Ik9wVHlwZSJ9KShkPWEuRGVidWdXYXRjaEZpbHRlck1vZGV8fChhLkRlYnVnV2F0Y2hGaWx0ZXJNb2RlPXt9KSk7YS5maWx0ZXJEZWJ1Z1dhdGNoZXM9ZnVuY3Rpb24oZyxsLGspe2lmKGw9PT1kLk5vZGVOYW1lKXJldHVybiBnLmZpbHRlcihuPT5uLm5vZGVfbmFtZS5tYXRjaChrKSk7aWYobD09PWQuT3BUeXBlKXJldHVybiBnLmZpbHRlcihuPT5uLm9wX3R5cGUubWF0Y2goaykpfTtjbGFzcyBme2NvbnN0cnVjdG9yKGcsbCxrLG4pe3RoaXMuZGVidWdXYXRjaENoYW5nZT1sO3RoaXMuZGVidWdXYXRjaD1uO3RoaXMubmFtZT1nO3RoaXMuZGVidWdXYXRjaD1uO3RoaXMuY2hlY2tib3hTdGF0ZT1jLkVNUFRZO3RoaXMucGFyZW50PWs7dGhpcy5jaGlsZHJlbj17fTt0aGlzLmNoZWNrYm94PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLWNoZWNrYm94Iik7dGhpcy5jaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCgpPT4Ke3RoaXMuX2hhbmRsZUNoYW5nZSgpfSwhMSl9X2hhbmRsZUNoYW5nZSgpe2lmKHRoaXMuYXZvaWRQcm9wYWdhdGlvbil0aGlzLmRlYnVnV2F0Y2gmJnRoaXMuZGVidWdXYXRjaENoYW5nZSh0aGlzLmRlYnVnV2F0Y2gsdGhpcy5pc0NoZWNrYm94Q2hlY2tlZCgpKTtlbHNlIGlmKHRoaXMuZGVidWdXYXRjaCl0aGlzLnNldENoZWNrYm94U3RhdGUodGhpcy5pc0NoZWNrYm94Q2hlY2tlZCgpP2MuQ0hFQ0tFRDpjLkVNUFRZLCEwKSx0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCk/dGhpcy5zZXROb2Rlc0Fib3ZlVG9DaGVja2VkKCk6dGhpcy5zZXROb2Rlc0Fib3ZlVG9FbXB0eSgpLHRoaXMuZGVidWdXYXRjaENoYW5nZSh0aGlzLmRlYnVnV2F0Y2gsdGhpcy5pc0NoZWNrYm94Q2hlY2tlZCgpKTtlbHNlIGlmKHRoaXMuc2V0Q2hlY2tib3hTdGF0ZSh0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCk/Yy5DSEVDS0VEOmMuRU1QVFksITApLHRoaXMuaXNDaGVja2JveENoZWNrZWQoKSl7Y29uc3QgbD1fLnZhbHVlcyh0aGlzLmNoaWxkcmVuKTsKZm9yKDtsLmxlbmd0aDspe3ZhciBnPWwucG9wKCk7Xy5mb3JFYWNoKGcuY2hpbGRyZW4saz0+bC5wdXNoKGspKTtnLnNldENoZWNrYm94U3RhdGUoYy5DSEVDS0VELCEwKX10aGlzLnNldE5vZGVzQWJvdmVUb0NoZWNrZWQoKX1lbHNle2NvbnN0IGw9Xy52YWx1ZXModGhpcy5jaGlsZHJlbik7Zm9yKDtsLmxlbmd0aDspZz1sLnBvcCgpLF8uZm9yRWFjaChnLmNoaWxkcmVuLGs9PmwucHVzaChrKSksZy5zZXRDaGVja2JveFN0YXRlKGMuRU1QVFksITApO3RoaXMuc2V0Tm9kZXNBYm92ZVRvRW1wdHkoKX19aXNMZWFmKCl7cmV0dXJuISF0aGlzLmRlYnVnV2F0Y2h9c2V0VG9BbGxDaGVja2VkRXh0ZXJuYWxseSgpe3RoaXMuc2V0Q2hlY2tib3hTdGF0ZShjLkNIRUNLRUQpO3RoaXMuX2hhbmRsZUNoYW5nZSgpfXNldENoZWNrYm94U3RhdGUoZyxsKXt0aGlzLmF2b2lkUHJvcGFnYXRpb249bDt0aGlzLmNoZWNrYm94U3RhdGU9Zzt0aGlzLmNoZWNrYm94LmNsYXNzTGlzdC50b2dnbGUoInBhcnRpYWwtY2hlY2tib3giLApnPT09Yy5QQVJUSUFMKTtnPT09Yy5DSEVDS0VEP3RoaXMuY2hlY2tib3guc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpOnRoaXMuY2hlY2tib3gucmVtb3ZlQXR0cmlidXRlKCJjaGVja2VkIik7dGhpcy5hdm9pZFByb3BhZ2F0aW9uPSExfWlzQ2hlY2tib3hDaGVja2VkKCl7cmV0dXJuIHRoaXMuY2hlY2tib3guaGFzQXR0cmlidXRlKCJjaGVja2VkIil9c2V0Tm9kZXNBYm92ZVRvQ2hlY2tlZCgpe2xldCBnPXRoaXMucGFyZW50LGw9ITE7Zm9yKDtnOylsP2cuc2V0Q2hlY2tib3hTdGF0ZShjLlBBUlRJQUwsITApOihsPS0xIT09Xy5maW5kSW5kZXgoXy52YWx1ZXMoZy5jaGlsZHJlbiksaz0+ay5jaGVja2JveFN0YXRlIT09Yy5DSEVDS0VEKSxnLnNldENoZWNrYm94U3RhdGUobD9jLlBBUlRJQUw6Yy5DSEVDS0VELCEwKSksZz1nLnBhcmVudH1zZXROb2Rlc0Fib3ZlVG9FbXB0eSgpe2xldCBnPXRoaXMucGFyZW50LGw9ITE7Zm9yKDtnOylsP2cuc2V0Q2hlY2tib3hTdGF0ZShjLlBBUlRJQUwsCiEwKToobD0tMSE9PV8uZmluZEluZGV4KF8udmFsdWVzKGcuY2hpbGRyZW4pLGs9PmsuY2hlY2tib3hTdGF0ZSE9PWMuRU1QVFkpLGcuc2V0Q2hlY2tib3hTdGF0ZShsP2MuUEFSVElBTDpjLkVNUFRZLCEwKSksZz1nLnBhcmVudH1zZXRMZXZlbERvbShnKXt0aGlzLmxldmVsRG9tPWd9fWEuU2VsZWN0aW9uVHJlZU5vZGU9Zn0pKGdwfHwoZ3A9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtb3Atc2VsZWN0b3IuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtb3Atc2VsZWN0b3IiLHByb3BlcnRpZXM6e2RlYnVnV2F0Y2hlczpBcnJheSxkZWJ1Z1dhdGNoQ2hhbmdlOk9iamVjdCxub2RlQ2xpY2tlZDpGdW5jdGlvbixmb3JjZUV4cGFuZEFuZENoZWNrTm9kZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGZvcmNlRXhwYW5kTm9kZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9zZWxlY3RlZERlYnVnV2F0Y2hNYXBwaW5nOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX2xldmVsTmFtZTJDb250YWluZXI6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9sZXZlbE5hbWUyTm9kZTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX3dhdGNoSGllcmFyY2h5Ont0eXBlOk9iamVjdCxjb21wdXRlZDoiX2NvbXB1dGVXYXRjaEhpZXJhcmNoeShkZWJ1Z1dhdGNoZXMsIGRlYnVnV2F0Y2hDaGFuZ2UsIF9maWx0ZXJNb2RlLCBfZmlsdGVySW5wdXQpIn0sX2ZpbHRlck1vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJOb2RlIE5hbWUiLApub3RpZnk6ITB9LF9maWx0ZXJJbnB1dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsbm90aWZ5OiEwfSxfaXNMb2FkaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9oaWdobGlnaHRlZExldmVsRG9tOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX3JlbmRlckhpZXJhcmNoeVdpdGhUaW1lb3V0KF93YXRjaEhpZXJhcmNoeSwgZGVidWdXYXRjaENoYW5nZSkiLCJfaGFuZGxlRm9yY2VOb2RlRXhwYW5kQW5kQ2hlY2soZm9yY2VFeHBhbmRBbmRDaGVja05vZGVOYW1lKSIsIl9oYW5kbGVGb3JjZU5vZGVFeHBhbmQoZm9yY2VFeHBhbmROb2RlTmFtZSkiXSxfY29tcHV0ZVdhdGNoSGllcmFyY2h5KGEsYyxkLGYpe2Y9Zi50cmltKCk7bGV0IGc9YTtudWxsIT1kJiYwPGYubGVuZ3RoJiYoZz1ncC5maWx0ZXJEZWJ1Z1dhdGNoZXMoYSxncC5EZWJ1Z1dhdGNoRmlsdGVyTW9kZVtkLnJlcGxhY2UoL1xzL2csIiIpXSxuZXcgUmVnRXhwKGYpKSk7Y29uc3QgbD1uZXcgZ3AuU2VsZWN0aW9uVHJlZU5vZGUoIiIsCmMpO2wuaXNSb290PSEwO18uZm9yRWFjaChnLGs9Pntjb25zdCBuPWdwLnNwbGl0Tm9kZU5hbWUoay5kZXZpY2VfbmFtZSsiLyIray5ub2RlX25hbWUpO2xldCBwPWw7Xy5mb3JFYWNoKG4sKHEscik9PntyPT09bi5sZW5ndGgtMT8ocj1uZXcgZ3AuU2VsZWN0aW9uVHJlZU5vZGUocSxjLHAsaykscC5jaGlsZHJlbltxXT1yKToocC5jaGlsZHJlbltxXXx8KHAuY2hpbGRyZW5bcV09bmV3IGdwLlNlbGVjdGlvblRyZWVOb2RlKHEsYyxwKSkscD1wLmNoaWxkcmVuW3FdKX0pfSk7cmV0dXJuIGx9LF9jbGVhclNlbGVjdG9ySGllcmFyY2h5KCl7Y29uc3QgYT10aGlzLiQkKCIjc2VsZWN0b3ItaGllcmFyY2h5Iik7Zm9yKDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKX0sX3JlbmRlckhpZXJhcmNoeVdpdGhUaW1lb3V0KGEsYyxkLGYpe3RoaXMuX2lzTG9hZGluZ3x8KHRoaXMuc2V0KCJfaXNMb2FkaW5nIiwhMCksdGhpcy5fY2xlYXJTZWxlY3RvckhpZXJhcmNoeSgpLApzZXRUaW1lb3V0KCgpPT57dGhpcy5fcmVuZGVySGllcmFyY2h5KGEsYyxkLGYpfSwxMCkpfSxfcmVuZGVySGllcmFyY2h5KGEsYyl7dGhpcy5zZXQoIl9sZXZlbE5hbWUyQ29udGFpbmVyIix7fSk7dGhpcy5zZXQoIl9sZXZlbE5hbWUyTm9kZSIse30pO2E9dGhpcy5fcmVuZGVyTGV2ZWwobnVsbCxudWxsLGEsYyk7UG9seW1lci5kb20odGhpcy4kJCgiI3NlbGVjdG9yLWhpZXJhcmNoeSIpKS5hcHBlbmRDaGlsZChhKTt0aGlzLnNldCgiX2lzTG9hZGluZyIsITEpfSxfcmVuZGVyTGV2ZWwoYSxjLGQsZil7Y29uc3QgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtudWxsIT1hJiZnLnNldEF0dHJpYnV0ZSgibGV2ZWwtbmFtZSIsYSk7bGV0IGw7bD1udWxsPT1jP2E6YysiLyIrYTtQb2x5bWVyLmRvbShnKS5jbGFzc0xpc3QuYWRkKCJsZXZlbC1jb250YWluZXIiKTtjb25zdCBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlyb24tY29sbGFwc2UiKTtpZihhKXt0aGlzLl9sZXZlbE5hbWUyQ29udGFpbmVyW2xdPQprO2sucmVtb3ZlQXR0cmlidXRlKCJvcGVuZWQiKTtQb2x5bWVyLmRvbShnKS5jbGFzc0xpc3QuYWRkKCJpbmRlbnRlZC1sZXZlbC1jb250YWluZXIiKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO1BvbHltZXIuZG9tKGMpLmNsYXNzTGlzdC5hZGQoImxldmVsLXRpdGxlIik7Y29uc3QgcT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwYXBlci1pY29uLWJ1dHRvbiIpO1BvbHltZXIuZG9tKHEpLmNsYXNzTGlzdC5hZGQoIm5vZGUtZXhwYW5kLWJ1dHRvbiIpO2NvbnN0IHI9KCk9PntxLnNldEF0dHJpYnV0ZSgiaWNvbiIsay5oYXNBdHRyaWJ1dGUoIm9wZW5lZCIpPyJleHBhbmQtbGVzcyI6ImV4cGFuZC1tb3JlIil9O3EuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57ay5oYXNBdHRyaWJ1dGUoIm9wZW5lZCIpP2sucmVtb3ZlQXR0cmlidXRlKCJvcGVuZWQiKTprLnNldEF0dHJpYnV0ZSgib3BlbmVkIiwhMCk7cigpfSwhMSk7cigpO1BvbHltZXIuZG9tKGMpLmFwcGVuZENoaWxkKHEpOwpQb2x5bWVyLmRvbShjKS5hcHBlbmRDaGlsZChkLmNoZWNrYm94KTtkLnNldExldmVsRG9tKGMpO2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO1BvbHltZXIuZG9tKHQpLmNsYXNzTGlzdC5hZGQoImxldmVsLXRpdGxlLXRleHQiKTt0LnRleHRDb250ZW50PWE7UG9seW1lci5kb20oYykuYXBwZW5kQ2hpbGQodCk7UG9seW1lci5kb20oZykuYXBwZW5kQ2hpbGQoYyk7KGEubWF0Y2goZ3AuREVWSUNFX05BTUVfUEFUVEVSTil8fDE9PT1PYmplY3Qua2V5cyhkLmNoaWxkcmVuKS5sZW5ndGgpJiZrLnNldEF0dHJpYnV0ZSgib3BlbmVkIiwhMCl9ZWxzZSBrLnNldEF0dHJpYnV0ZSgib3BlbmVkIiwhMCk7Y29uc3Qgbj1bXSxwPVtdO1BvbHltZXIuZG9tKGspLmNsYXNzTGlzdC5hZGQoImNvbnRlbnQtY29udGFpbmVyIik7Xy5mb3JFYWNoKGQuY2hpbGRyZW4sKHEscik9Pntjb25zdCB0PXEuZGVidWdXYXRjaDt2YXIgdj1sO251bGw9PWwmJih2PSIiKTt2Kz0iLyIrcjsKdGhpcy5fbGV2ZWxOYW1lMk5vZGVbdl09cTtudWxsIT10aGlzLl9zZWxlY3RlZERlYnVnV2F0Y2hNYXBwaW5nW3ZdJiYocS5zZXRDaGVja2JveFN0YXRlKGdwLkNoZWNrYm94U3RhdGUuQ0hFQ0tFRCkscS5zZXROb2Rlc0Fib3ZlVG9DaGVja2VkKCkpO2lmKHQpe3Y9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7UG9seW1lci5kb20odikuY2xhc3NMaXN0LmFkZCgib3AtZGVzY3JpcHRpb24iKTtxLmNoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsej0+e3RoaXMuX2hhbmRsZUxlYWZOb2RlU2VsZWN0ZWQoZix0LHoudGFyZ2V0LmNoZWNrZWQpfSwhMSk7UG9seW1lci5kb20odikuYXBwZW5kQ2hpbGQocS5jaGVja2JveCk7cS5zZXRMZXZlbERvbSh2KTt2YXIgeT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7eS50ZXh0Q29udGVudD0iWyIrdC5vcF90eXBlKyJdIjt5LnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJvcC10eXBlIik7UG9seW1lci5kb20odikuYXBwZW5kQ2hpbGQoeSk7Cnk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO3kudGV4dENvbnRlbnQ9cjt5LnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJvcC10aXRsZS1sZWFmIik7eS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9Pntjb25zdCB6PXRoaXMuX2dldERldmljZUFuZE5vZGVOYW1lcyhyLGcpO3RoaXMubm9kZUNsaWNrZWQoelswXSx6WzFdKX0sITEpO1BvbHltZXIuZG9tKHYpLmFwcGVuZENoaWxkKHkpO3AucHVzaCh2KX1lbHNlIHEuY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix6PT57dGhpcy5faGFuZGxlTWV0YU5vZGVDaGFuZ2UocSxmLHoudGFyZ2V0LmNoZWNrZWQpfSksbi5wdXNoKHRoaXMuX3JlbmRlckxldmVsKHIsbCxxLGYpKX0pO2E9cT0+e1BvbHltZXIuZG9tKGspLmFwcGVuZENoaWxkKHEpfTtfLmZvckVhY2gocCxhKTtfLmZvckVhY2gobixhKTtQb2x5bWVyLmRvbShnKS5hcHBlbmRDaGlsZChrKTtyZXR1cm4gZ30sX2dldExlYWZEZWJ1Z1dhdGNoZXMoYSxjKXthLmRlYnVnV2F0Y2g/CmMucHVzaChhLmRlYnVnV2F0Y2gpOl8uZm9yRWFjaChhLmNoaWxkcmVuLGQ9Pnt0aGlzLl9nZXRMZWFmRGVidWdXYXRjaGVzKGQsYyl9KX0sX2dldERldmljZUFuZE5vZGVOYW1lcyhhLGMpe2ZvcihhPVthXTs7KXtjb25zdCBkPWMuZ2V0QXR0cmlidXRlKCJsZXZlbC1uYW1lIik7aWYobnVsbD09ZClicmVhaztlbHNlIGEucHVzaChkKTtjPVBvbHltZXIuZG9tKGMpLnBhcmVudE5vZGUucGFyZW50Tm9kZX1hLnJldmVyc2UoKTtyZXR1cm4gZ3AuYXNzZW1ibGVEZXZpY2VBbmROb2RlTmFtZXMoYSl9LF9oYW5kbGVNZXRhTm9kZUNoYW5nZShhLGMsZCl7bGV0IGY9W107dGhpcy5fZ2V0TGVhZkRlYnVnV2F0Y2hlcyhhLGYpO18uZm9yRWFjaChmLGc9Pnt0aGlzLl9oYW5kbGVMZWFmTm9kZVNlbGVjdGVkKGMsZyxkKX0pfSxfaGFuZGxlTGVhZk5vZGVTZWxlY3RlZChhLGMsZCl7Y29uc3QgZj1jLmRldmljZV9uYW1lKyIvIitjLm5vZGVfbmFtZTtkP3RoaXMuX3NlbGVjdGVkRGVidWdXYXRjaE1hcHBpbmdbZl09CmM6ZGVsZXRlIHRoaXMuX3NlbGVjdGVkRGVidWdXYXRjaE1hcHBpbmdbZl07YShjLGQpfSxfaGFuZGxlRm9yY2VOb2RlKGEsYyl7dGhpcy5zZXQoIl9maWx0ZXJJbnB1dCIsIiIpO3NldFRpbWVvdXQoKCk9PntpZihudWxsIT1hJiZudWxsIT10aGlzLl9sZXZlbE5hbWUyQ29udGFpbmVyKXt2YXIgZD1ncC5zcGxpdE5vZGVOYW1lKGEpO2ZvcihsZXQgZz0xO2c8PWQubGVuZ3RoOysrZyl7dmFyIGY9ZC5zbGljZSgwLGcpLmpvaW4oIi8iKTtjb25zdCBsPXRoaXMuX2xldmVsTmFtZTJOb2RlW2ZdO251bGwhPWwmJm51bGwhPWwubGV2ZWxEb20mJmwubGV2ZWxEb20uc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJjZW50ZXIiLGJlaGF2aW91cjoic21vb3RoIn0pO2c8ZC5sZW5ndGg/bnVsbCE9dGhpcy5fbGV2ZWxOYW1lMkNvbnRhaW5lcltmXSYmdGhpcy5fbGV2ZWxOYW1lMkNvbnRhaW5lcltmXS5zZXRBdHRyaWJ1dGUoIm9wZW5lZCIsITApOihsLmRlYnVnV2F0Y2h8fHRoaXMuX2hhbmRsZU1ldGFOb2RlQ2hhbmdlKGwsCmwuZGVidWdXYXRjaENoYW5nZSwhMCksYyYmKGwuc2V0VG9BbGxDaGVja2VkRXh0ZXJuYWxseSgpLChmPWwuZGVidWdXYXRjaCkmJm51bGw9PXRoaXMuX3NlbGVjdGVkRGVidWdXYXRjaE1hcHBpbmdbZi5ub2RlX25hbWVdJiYodGhpcy5fc2VsZWN0ZWREZWJ1Z1dhdGNoTWFwcGluZ1thXT1mKSksbnVsbCE9dGhpcy5faGlnaGxpZ2h0ZWRMZXZlbERvbSYmdGhpcy5faGlnaGxpZ2h0ZWRMZXZlbERvbS5jbGFzc0xpc3QucmVtb3ZlKCJoaWdobGlnaHRlZCIpLGwubGV2ZWxEb20uY2xhc3NMaXN0LmFkZCgiaGlnaGxpZ2h0ZWQiKSx0aGlzLnNldCgiX2hpZ2hsaWdodGVkTGV2ZWxEb20iLGwubGV2ZWxEb20pKX19fSwyMCl9LF9oYW5kbGVGb3JjZU5vZGVFeHBhbmRBbmRDaGVjayhhKXt0aGlzLl9oYW5kbGVGb3JjZU5vZGUoYSwhMCl9LF9oYW5kbGVGb3JjZU5vZGVFeHBhbmQoYSl7dGhpcy5faGFuZGxlRm9yY2VOb2RlKGEsITEpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1zZXNzaW9uLXJ1bnMtdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1zZXNzaW9uLXJ1bnMtdmlldyIscHJvcGVydGllczp7bGF0ZXN0U2Vzc2lvblJ1bjpPYmplY3Qsc2Vzc2lvblJ1bktleVRvRGV2aWNlTmFtZXM6T2JqZWN0LHNvbGVBY3RpdmU6Qm9vbGVhbixub2RlT3JUZW5zb3JDbGlja2VkOkZ1bmN0aW9uLF9ydW5LZXkyQ291bnQ6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfcnVuS2V5Mk51bURldmljZXM6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfYWN0aXZlUnVuS2V5OlN0cmluZ30sb2JzZXJ2ZXJzOlsicmVuZGVyTGF0ZXN0KGxhdGVzdFNlc3Npb25SdW4pIiwic2V0U29sZUFjdGl2ZVN0YXR1cyhzb2xlQWN0aXZlKSJdLHJlbmRlckxhdGVzdChhKXthPUpTT04uc3RyaW5naWZ5KGEpO3RoaXMuX3J1bktleTJDb3VudFthXT12b2lkIDA9PT10aGlzLl9ydW5LZXkyQ291bnRbYV0/MTp0aGlzLl9ydW5LZXkyQ291bnRbYV0rMTt2b2lkIDA9PT10aGlzLl9ydW5LZXkyTnVtRGV2aWNlc1thXSYmKHRoaXMuX3J1bktleTJOdW1EZXZpY2VzW2FdPQowKTt0aGlzLl9hY3RpdmVSdW5LZXk9YTt0aGlzLl9yZW5kZXJTZXNzaW9uUnVuVGFibGUoKX0sdXBkYXRlTnVtRGV2aWNlcyhhKXtudWxsIT10aGlzLl9hY3RpdmVSdW5LZXkmJih0aGlzLl9ydW5LZXkyTnVtRGV2aWNlc1t0aGlzLl9hY3RpdmVSdW5LZXldPWEsdGhpcy5fcmVuZGVyU2Vzc2lvblJ1blRhYmxlKCkpfSxzZXRTb2xlQWN0aXZlU3RhdHVzKCl7dGhpcy5fcmVuZGVyU2Vzc2lvblJ1blRhYmxlKCl9LF9yZW5kZXJTZXNzaW9uUnVuVGFibGUoKXt0aGlzLl9jbGVhclRhYmxlKCk7dGhpcy5fcmVuZGVySGVhZGVyKCk7bGV0IGE7Zm9yKGNvbnN0IGQgaW4gdGhpcy5fcnVuS2V5MkNvdW50KWlmKHRoaXMuX3J1bktleTJDb3VudC5oYXNPd25Qcm9wZXJ0eShkKSl7dmFyIGM9SlNPTi5wYXJzZShkKTsoYz10aGlzLl9yZW5kZXJSb3coYyx0aGlzLl9ydW5LZXkyTnVtRGV2aWNlc1tkXSx0aGlzLl9ydW5LZXkyQ291bnRbZF0sdGhpcy5fYWN0aXZlUnVuS2V5PT09ZCx0aGlzLnNvbGVBY3RpdmUpKSYmCihhPWMpfWEmJihQb2x5bWVyLmRvbSh0aGlzLiQkKCIjc2Vzc2lvbi1ydW5zLXRhYmxlIikpLnBhcmVudE5vZGUucGFyZW50Tm9kZS5zY3JvbGxUb3A9YS5vZmZzZXRUb3ApfSxfY2xlYXJUYWJsZSgpe2NvbnN0IGE9dGhpcy4kJCgiI3Nlc3Npb24tcnVucy10YWJsZSIpO2Zvcig7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCl9LF9yZW5kZXJIZWFkZXIoKXtjb25zdCBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpO2MudGV4dENvbnRlbnQ9IkZlZWRzIjtjb25zdCBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoIik7ZC50ZXh0Q29udGVudD0iRmV0Y2hlcyI7Y29uc3QgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpO2YudGV4dENvbnRlbnQ9IlRhcmdldHMiO2NvbnN0IGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGgiKTtnLnRleHRDb250ZW50PSIjKERldmljZXMpIjtjb25zdCBsPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpO2wudGV4dENvbnRlbnQ9IkNvdW50IjthLmFwcGVuZENoaWxkKGMpO2EuYXBwZW5kQ2hpbGQoZCk7YS5hcHBlbmRDaGlsZChmKTthLmFwcGVuZENoaWxkKGcpO2EuYXBwZW5kQ2hpbGQobCk7UG9seW1lci5kb20odGhpcy4kJCgiI3Nlc3Npb24tcnVucy10YWJsZSIpKS5hcHBlbmRDaGlsZChhKX0sX3JlbmRlclJvdyhhLGMsZCxmLGcpe2NvbnN0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKSxrPXRoaXMuX3JlbmRlckdyYXBoRWxlbWVudHMoYS5mZWVkcyksbj10aGlzLl9yZW5kZXJHcmFwaEVsZW1lbnRzKGEuZmV0Y2hlcyk7YT10aGlzLl9yZW5kZXJHcmFwaEVsZW1lbnRzKGEudGFyZ2V0cyk7Y29uc3QgcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO3AudGV4dENvbnRlbnQ9YztjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Yy50ZXh0Q29udGVudD1kO2wuYXBwZW5kQ2hpbGQoayk7bC5hcHBlbmRDaGlsZChuKTsKbC5hcHBlbmRDaGlsZChhKTtsLmFwcGVuZENoaWxkKHApO2wuYXBwZW5kQ2hpbGQoYyk7ZiYmKGc/bC5zZXRBdHRyaWJ1dGUoImNsYXNzIiwic29sZS1hY3RpdmUtc2Vzc2lvbi1ydW4iKTpsLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJhY3RpdmUtc2Vzc2lvbi1ydW4iKSk7UG9seW1lci5kb20odGhpcy4kJCgiI3Nlc3Npb24tcnVucy10YWJsZSIpKS5hcHBlbmRDaGlsZChsKTtpZihmKXJldHVybiBsfSxfcmVuZGVyR3JhcGhFbGVtZW50cyhhKXtjb25zdCBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Xy5mb3JFYWNoKGEsZD0+e2NvbnN0IGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi50ZXh0Q29udGVudD1kO2Yuc2V0QXR0cmlidXRlKCJjbGFzcyIsIm5vZGUtb3ItdGVuc29yLWVsZW1lbnQiKTtmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e3RoaXMubm9kZU9yVGVuc29yQ2xpY2tlZChkKX0pO2MuYXBwZW5kQ2hpbGQoZil9KTtyZXR1cm4gY319KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtc291cmNlLWNvZGUtdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1zb3VyY2UtY29kZS12aWV3Iixwcm9wZXJ0aWVzOntyZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sZm9jdXNOb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX29sZEZvY3VzTm9kZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGRlYnVnV2F0Y2hlczp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sbm9kZUNsaWNrZWQ6e3R5cGU6RnVuY3Rpb24sdmFsdWU6bnVsbH0sY29udGludWVUb05vZGU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6bnVsbH0sX2hpZ2hsaWdodGVkRWxlbWVudHM6e3R5cGU6QXJyYXksdmFsdWU6W119LF9maWxlUGF0aFNlbGVjdGVkOk51bWJlcixfZnVsbEZpbGVQYXRoczp7dHlwZTpBcnJheSx2YWx1ZTpudWxsfSxfc2hvcnRGaWxlUGF0aHM6e3R5cGU6QXJyYXksdmFsdWU6bnVsbH0sX2ZpbGVMaW5lczp7dHlwZTpBcnJheSx2YWx1ZTpudWxsfSxfbm9kZU5hbWUyRGV2aWNlTmFtZTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sCl9ub2RlTmFtZTJCYXNlRXhwYW5kZWROb2RlTmFtZTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX25vZGVOYW1lMk5vZGVFbGVtZW50czp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX25vZGVOYW1lMlN0YWNrVG9wTm9kZUVsZW1lbnQ6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9zZXRIaWdodGxpZ2h0T3JpZ2luTm9kZUVsZW1lbnQ6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9mdWxsU3RhY2tTaG93bjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfZnVsbFN0YWNrTm9kZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9yZW5kZXJEZWxheU1pbGxpczp7dHlwZTpOdW1iZXIsdmFsdWU6NTAscmVhZG9ubHk6ITB9fSxvYnNlcnZlcnM6WyJfcmVuZGVyRmlsZShfZmlsZVBhdGhTZWxlY3RlZCkiLCJfZm9jdXNPbk5vZGUoZm9jdXNOb2RlTmFtZSkiXSxyZW5kZXIoYSl7bnVsbCE9YSYmdGhpcy5zZXQoIl9kZWJ1Z1dhdGNoZXMiLGEpO3RoaXMuX3F1ZXJ5U291cmNlQ29kZUVuZFBvaW50KHttb2RlOiJwYXRocyJ9KS50aGVuKGM9Pgp7dGhpcy5zZXQoIl9mdWxsRmlsZVBhdGhzIixjLnBhdGhzKTtjb25zdCBkPWMucGF0aHMubWFwKGY9Pih7aWQ6ZixuYW1lOnRoaXMuX3Nob3J0ZW5QYXRoKGYsYy5wYXRocyl9KSk7dGhpcy5zZXQoIl9zaG9ydEZpbGVQYXRocyIsZCk7MDxkLmxlbmd0aCYmdGhpcy5zZXQoIl9maWxlUGF0aFNlbGVjdGVkIiwwKX0pfSxfc2hvcnRlblBhdGgoYSl7YT1hLnJlcGxhY2UoL1xcL2csIi8iKTthPWEuc3BsaXQoIi8iKTtyZXR1cm4gYVthLmxlbmd0aC0xXX0sX3JlbmRlckZpbGUoYSl7aWYobnVsbCE9YSl7dmFyIGM9dGhpcy5fc2hvcnRGaWxlUGF0aHNbYV0uaWQ7dGhpcy5fcXVlcnlTb3VyY2VDb2RlRW5kUG9pbnQoe21vZGU6ImNvbnRlbnQiLGZpbGVfcGF0aDpjfSkudGhlbihkPT57Y29uc3QgZj1bXSxnPWQuY29udGVudFtjXSxsPWQubGluZW5vX3RvX29wX25hbWVfYW5kX3N0YWNrX3BvcztkPXt9O2Zvcih2YXIgayBpbiBsKWwuaGFzT3duUHJvcGVydHkoaykmJihkW2tdPWxba10ubGVuZ3RoKTsKdGhpcy5fZmlsdGVyRmlsZVRyYWNlYmFja3NCeURlYnVnV2F0Y2hlcyhsKTtmb3Ioaz0wO2s8Zy5sZW5ndGg7KytrKXtjb25zdCBwPWsrMTtmLnB1c2goe2xpbmVubzpwLG51bU5vZGVzOm51bGwhPWxbcF0/U3RyaW5nKGxbcF0ubGVuZ3RoKSsiLyIrU3RyaW5nKGRbcF0pKyIgXHUyNWJjIjoiIix0ZXh0OnRoaXMuX2h0bWxFc2NhcGUoZ1trXSl9KX10aGlzLnNldCgiX2ZpbGVMaW5lcyIsZik7Y29uc3Qgbj10aGlzO3NldFRpbWVvdXQoKCk9Pntjb25zdCBwPXt9LHE9e307Zm9yKGNvbnN0IHQgaW4gbCl7aWYoIWwuaGFzT3duUHJvcGVydHkodCkpY29udGludWU7Zm9yKHZhciByPW4uJCQoIiNzb3VyY2UtbGluZS1ub2Rlcy0iK3QpO3IuZmlyc3RDaGlsZDspci5yZW1vdmVDaGlsZChyLmZpcnN0Q2hpbGQpO2NvbnN0IHY9bFt0XTt2LnNvcnQoZnVuY3Rpb24oeSx6KXtyZXR1cm4geVswXTx6WzBdPy0xOnlbMF0+elswXT8xOjB9KTtmb3IobGV0IHk9MDt5PHYubGVuZ3RoOysreSl7Y29uc3Qgej0Kdlt5XVswXSx4PXZbeV1bMV0sQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtGLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJzb3VyY2UtbGluZS1ub2RlLWVudHRyeSIpO0Yuc2V0QXR0cmlidXRlKCJzb3VyY2VMaW5lbm8iLHQpO0YudGV4dENvbnRlbnQ9ejtGLmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsKCk9Pnt0aGlzLm5vZGVDbGlja2VkKHRoaXMuX25vZGVOYW1lMkRldmljZU5hbWVbel0sdGhpcy5fbm9kZU5hbWUyQmFzZUV4cGFuZGVkTm9kZU5hbWVbel0sITApfSk7Y29uc3QgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwYXBlci1pY29uLWJ1dHRvbiIpO0Quc2V0QXR0cmlidXRlKCJpY29uIiwiZmlsdGVyLWxpc3QiKTtELnNldEF0dHJpYnV0ZSgidGl0bGUiLCJTaG93IHN0YWNrIik7RC5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLCgpPT57dGhpcy5faGlnaGxpZ2h0Tm9kZUVsZW1lbnRzKHopO3RoaXMuc2V0KCJfZnVsbFN0YWNrTm9kZU5hbWUiLAp6KTt0aGlzLnNldCgiX2Z1bGxTdGFja1Nob3duIiwhMCk7dGhpcy5fcG9wdWxhdGVGdWxsU3RhY2soeix0aGlzLl9mdWxsRmlsZVBhdGhzW3RoaXMuX2ZpbGVQYXRoU2VsZWN0ZWRdLE51bWJlcih0KSl9KTtjb25zdCBCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLWljb24tYnV0dG9uIik7Qi5zZXRBdHRyaWJ1dGUoImljb24iLCJmb3J3YXJkIik7Qi5zZXRBdHRyaWJ1dGUoInRpdGxlIiwiQ29udGludWUgdG8iKTtCLmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsKCk9Pnt0aGlzLm5vZGVDbGlja2VkKHRoaXMuX25vZGVOYW1lMkRldmljZU5hbWVbel0sdGhpcy5fbm9kZU5hbWUyQmFzZUV4cGFuZGVkTm9kZU5hbWVbel0sITApO2NvbnN0IEk9dGhpcy5fbm9kZU5hbWUyRGV2aWNlTmFtZVt6XSxPPXRoaXMuX25vZGVOYW1lMkJhc2VFeHBhbmRlZE5vZGVOYW1lW3pdO3RoaXMuc2V0KCJfc2V0SGlnaHRsaWdodE9yaWdpbk5vZGVFbGVtZW50IixGKTt0aGlzLmNvbnRpbnVlVG9Ob2RlKEksCk8pfSk7Qy5hcHBlbmRDaGlsZChEKTtDLmFwcGVuZENoaWxkKEIpO0MuYXBwZW5kQ2hpbGQoRik7ci5hcHBlbmRDaGlsZChDKTtwLmhhc093blByb3BlcnR5KHopfHwocFt6XT1bXSk7cFt6XS5wdXNoKEYpO3EuaGFzT3duUHJvcGVydHkoeil8fChxW3pdPVtGLHhdKTt4PnFbel1bMV0mJihxW3pdPVtGLHhdKX1yLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwhMCk7cj1uLiQkKCIjc291cmNlLWxpbmUtbm9kZS10b2dnbGUtIit0KTtudWxsPT1yLmdldEF0dHJpYnV0ZSgidGFwQ2FsbGJhY2tTZXQiKSYmKHIuYWRkRXZlbnRMaXN0ZW5lcigidGFwIiwoKT0+e24uX3RvZ2dsZUxpbmVOb2RlcyhOdW1iZXIodCkpfSksci5zZXRBdHRyaWJ1dGUoInRhcENhbGxiYWNrU2V0IiwhMCkpfW4uc2V0KCJfbm9kZU5hbWUyTm9kZUVsZW1lbnRzIixwKTtmb3IoY29uc3QgdCBpbiBxKXEuaGFzT3duUHJvcGVydHkodCkmJihxW3RdPXFbdF1bMF0pO24uc2V0KCJfbm9kZU5hbWUyU3RhY2tUb3BOb2RlRWxlbWVudCIsCnEpfSx0aGlzLl9yZW5kZXJEZWxheU1pbGxpcyl9KX19LF90b2dnbGVMaW5lTm9kZXMoYSxjPSExKXthPXRoaXMuJCQoIiNzb3VyY2UtbGluZS1ub2Rlcy0iK2EpO251bGw9PWEuZ2V0QXR0cmlidXRlKCJoaWRkZW4iKSYmITAhPT1jP2Euc2V0QXR0cmlidXRlKCJoaWRkZW4iLCEwKTphLnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIil9LF9maWx0ZXJGaWxlVHJhY2ViYWNrc0J5RGVidWdXYXRjaGVzKGEpe2NvbnN0IGM9dGhpcy5kZWJ1Z1dhdGNoZXMubWFwKGc9PmdwLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihnLm5vZGVfbmFtZSkpLGQ9e30sZj17fTtmb3IoY29uc3QgZyBvZiB0aGlzLmRlYnVnV2F0Y2hlcyl7Y29uc3QgbD1ncC5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oZy5ub2RlX25hbWUpO2RbbF09Zy5kZXZpY2VfbmFtZTtmW2xdPWcubm9kZV9uYW1lfXRoaXMuc2V0KCJfbm9kZU5hbWUyRGV2aWNlTmFtZSIsZCk7dGhpcy5zZXQoIl9ub2RlTmFtZTJCYXNlRXhwYW5kZWROb2RlTmFtZSIsCmYpO2Zvcihjb25zdCBnIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShnKSYmKGFbZ109YVtnXS5maWx0ZXIobD0+Xy5pbmNsdWRlcyhjLGxbMF0pKSl9LF9xdWVyeVNvdXJjZUNvZGVFbmRQb2ludChhKXtjb25zdCBjPVFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9zb3VyY2VfY29kZSIpO2E9UW8uYWRkUGFyYW1zKGMsYSk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChhKX0sX2h0bWxFc2NhcGUoYSl7cmV0dXJuIGEucmVwbGFjZSgvIC9nLCJcdTAwYTAiKX0sX2ZvY3VzT25Ob2RlKGEpe2lmKG51bGwhPWEpe3ZhciBjPXRoaXMuX3Nob3J0RmlsZVBhdGhzW3RoaXMuX2ZpbGVQYXRoU2VsZWN0ZWRdLmlkLGQ9dGhpczt0aGlzLl9xdWVyeVNvdXJjZUNvZGVFbmRQb2ludCh7bW9kZToib3BfdHJhY2ViYWNrIixvcF9uYW1lOmF9KS50aGVuKGY9Pntjb25zdCBnPWYub3BfdHJhY2ViYWNrW2FdO2Y9W107Zm9yKGxldCBrPTA7azxnLmxlbmd0aDsrK2spe2NvbnN0IG49Cmdba11bMV07Z1trXVswXT09PWMmJmYucHVzaChuKX1mb3IodmFyIGwgb2YgZC5faGlnaGxpZ2h0ZWRFbGVtZW50cylsLmNsYXNzTGlzdC5yZW1vdmUoImhpZ2hsaWdodGVkLXNvdXJjZS1saW5lIik7bD1bXTtmb3IoY29uc3QgayBvZiBmKWY9dGhpcy4kJCgiI3NvdXJjZS1saW5lLSIrayksbC5wdXNoKGYpLGYuY2xhc3NMaXN0LmFkZCgiaGlnaGxpZ2h0ZWQtc291cmNlLWxpbmUiKSxkLl90b2dnbGVMaW5lTm9kZXMoaywhMCk7ZC5zZXQoIl9oaWdobGlnaHRlZEVsZW1lbnRzIixsKTt0aGlzLl9oaWdobGlnaHROb2RlRWxlbWVudHMoYSl9KX19LF9oaWdobGlnaHROb2RlRWxlbWVudHMoYSl7aWYobnVsbCE9dGhpcy5fb2xkRm9jdXNOb2RlTmFtZSlmb3IoY29uc3QgYyBvZiB0aGlzLl9ub2RlTmFtZTJOb2RlRWxlbWVudHNbdGhpcy5fb2xkRm9jdXNOb2RlTmFtZV0pYy5zdHlsZVsiZm9udC13ZWlnaHQiXT0ibm9ybWFsIjtmb3IoY29uc3QgYyBvZiB0aGlzLl9ub2RlTmFtZTJOb2RlRWxlbWVudHNbYV0pYy5zdHlsZVsiZm9udC13ZWlnaHQiXT0KImJvbGQiO251bGw9PXRoaXMuX3NldEhpZ2h0bGlnaHRPcmlnaW5Ob2RlRWxlbWVudD90aGlzLl9ub2RlTmFtZTJTdGFja1RvcE5vZGVFbGVtZW50W2FdLnNjcm9sbEludG9WaWV3KHtibG9jazoiY2VudGVyIixiZWhhdmlvdXI6InNtb290aCJ9KTp0aGlzLnNldCgiX3NldEhpZ2h0bGlnaHRPcmlnaW5Ob2RlRWxlbWVudCIsbnVsbCk7dGhpcy5zZXQoIl9vbGRGb2N1c05vZGVOYW1lIixhKX0sX3BvcHVsYXRlRnVsbFN0YWNrKGEsYyxkKXt0aGlzLl9xdWVyeVNvdXJjZUNvZGVFbmRQb2ludCh7bW9kZToib3BfdHJhY2ViYWNrIixvcF9uYW1lOmF9KS50aGVuKGY9Pntjb25zdCBnPXRoaXMuJCQoIiNmdWxsLXN0YWNrLWNvbnRlbnQiKTtmb3IoO2cuZmlyc3RDaGlsZDspZy5yZW1vdmVDaGlsZChnLmZpcnN0Q2hpbGQpO2Zvcihjb25zdCBsIG9mIGYub3BfdHJhY2ViYWNrW2FdKXtjb25zdCBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpIiksbj1sWzBdLHA9TnVtYmVyKGxbMV0pO2sudGV4dENvbnRlbnQ9Cm4rIjogIitTdHJpbmcocCk7Xy5pbmNsdWRlcyh0aGlzLl9mdWxsRmlsZVBhdGhzLG4pPyhrLmNsYXNzTGlzdC5hZGQoInN0YWNrLWZyYW1lLWNsaWNrYWJsZSIpLGsuc3R5bGUuY29sb3I9ImJsdWUiLGsuc3R5bGVbInRleHQtZGVjb3JhdGlvbiJdPSJ1bmRlcmxpbmUiLGsuc3R5bGUuY3Vyc29yPSJwb2ludGVyIixuPT09YyYmcD09PWQmJihrLnN0eWxlWyJmb250LXdlaWdodCJdPSJib2xkIiksay5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLCgpPT57dGhpcy5zZXQoIl9maWxlUGF0aFNlbGVjdGVkIix0aGlzLl9mdWxsRmlsZVBhdGhzLmluZGV4T2YobikpO3NldFRpbWVvdXQoKCk9Pnt0aGlzLl90b2dnbGVMaW5lTm9kZXMocCwhMCk7Zm9yKGNvbnN0IHEgb2YgdGhpcy5fbm9kZU5hbWUyTm9kZUVsZW1lbnRzW2FdKU51bWJlcihxLmdldEF0dHJpYnV0ZSgic291cmNlTGluZW5vIikpPT09TnVtYmVyKHApJiYocS5zY3JvbGxJbnRvVmlldyh7YmxvY2s6ImNlbnRlciIsYmVoYXZpb3VyOiJzbW9vdGgifSksCnRoaXMuc2V0KCJfc2V0SGlnaHRsaWdodE9yaWdpbk5vZGVFbGVtZW50IixrKSx0aGlzLl9oaWdobGlnaHROb2RlRWxlbWVudHMoYSksYz09PW4mJmQ9PT1wfHx0aGlzLl9wb3B1bGF0ZUZ1bGxTdGFjayhhLG4scCkpfSwyKnRoaXMuX3JlbmRlckRlbGF5TWlsbGlzKX0pKTooay5jbGFzc0xpc3QuYWRkKCJzdGFjay1mcmFtZS1ub25jbGlja2FibGUiKSxrLnN0eWxlLmNvbG9yPSIjNTU1Iik7Zy5hcHBlbmRDaGlsZChrKX19KX0sX2Nsb3NlRnVsbFN0YWNrRGlhbG9nKCl7dGhpcy5zZXQoIl9mdWxsU3RhY2tTaG93biIsITEpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRlbnNvci1kYXRhLXN1bW1hcnkiLHByb3BlcnRpZXM6e2xhdGVzdFRlbnNvckRhdGE6T2JqZWN0LGV4cGFuZEhhbmRsZXI6T2JqZWN0LGNvbnRpbnVlVG9DYWxsYmFjazpGdW5jdGlvbixoaWdobGlnaHRlZE5vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSx0ZW5zb3JOYW1lQ2xpY2tlZDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpudWxsfSxnZXRIZWFsdGhQaWxsOkZ1bmN0aW9uLF9oZWFsdGhQaWxsc0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxub3RpZnk6ITB9LF93YXRjaEtleXM6e3R5cGU6QXJyYXksdmFsdWU6W119LF93YXRjaEtleTJEYXRhOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX3dhdGNoS2V5MkNvdW50Ont0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX3dhdGNoS2V5MkV4cGFuZEhhbmRsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfd2F0Y2hLZXkyVmFsdWVTaG9ydDp7dHlwZTpPYmplY3QsdmFsdWU6e319LF93YXRjaEtleTJSb3c6e3R5cGU6T2JqZWN0LAp2YWx1ZTp7fX0sX2FjdGl2ZVdhdGNoS2V5OlN0cmluZyxfaGVhbHRoUGlsbFdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZToyMDAscmVhZG9ubHk6ITB9LF9oZWFsdGhQaWxsSGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTozMixyZWFkb25seTohMH19LG9ic2VydmVyczpbIl9yZW5kZXJMYXRlc3QobGF0ZXN0VGVuc29yRGF0YSwgZXhwYW5kSGFuZGxlcikiLCJfaGlnaGxpZ2h0KGhpZ2hsaWdodGVkTm9kZU5hbWUpIl0sbGlzdGVuZXJzOnsic2hvdy1oZWFsdGgtcGlsbHMuY2hhbmdlIjoiX3Nob3dIZWFsdGhQaWxsc0NoYW5nZWQifSxyZWFkeSgpe3RoaXMuX3JlbmRlckhlYWx0aFBpbGxMZWdlbmQoKX0sZW5hYmxlSGVhbHRoUGlsbHMoKXt0aGlzLnNldCgiX2hlYWx0aFBpbGxzRW5hYmxlZCIsITApO3RoaXMuX3JlbmRlckhlYWx0aFBpbGxMZWdlbmQoKX0sX3Nob3dIZWFsdGhQaWxsc0NoYW5nZWQoKXt0aGlzLl9oZWFsdGhQaWxsc0VuYWJsZWQ/dGhpcy5fcmVuZGVySGVhbHRoUGlsbExlZ2VuZCgpOgp0aGlzLl9jbGVhckhlYWx0aFBpbGxMZWdlbmQoKTt0aGlzLl9yZW5kZXJBbGwoKX0sX3JlbmRlckFsbCgpe3RoaXMuX2NsZWFyVGVuc29yRGF0YVRhYmxlKCk7Zm9yKGNvbnN0IGEgb2YgdGhpcy5fd2F0Y2hLZXlzKXRoaXMuX3JlbmRlckxhdGVzdCh0aGlzLl93YXRjaEtleTJEYXRhW2FdLHRoaXMuX3dhdGNoS2V5MkV4cGFuZEhhbmRsZXJbYV0pfSxfdGVuc29yRGF0YTJXYXRjaEtleShhKXtyZXR1cm4gYS5kZXZpY2VOYW1lKyIvIithLnRlbnNvck5hbWUrIjoiK2EuZGVidWdPcH0sX3JlbmRlckxhdGVzdChhLGMpe2lmKGEpe3ZhciBkPXRoaXMuX3RlbnNvckRhdGEyV2F0Y2hLZXkoYSksZj1udWxsOyJVbmluaXRpYWxpemVkIiE9PWEuZHR5cGUmJiJVbnN1cHBvcnRlZCIhPT1hLmR0eXBlJiYoZj0oKT0+YyhhKSk7dmFyIGc9bnVsbCE9YS52YWx1ZT9KU09OLnN0cmluZ2lmeShhLnZhbHVlLChsLGspPT5rLnRvRml4ZWQ/TnVtYmVyKGsudG9GaXhlZCgzKSk6ayk6IihDbGljayB0byB2aWV3KSI7CnRoaXMuX3dhdGNoS2V5MkRhdGFbZF09YTstMT09PXRoaXMuX3dhdGNoS2V5cy5pbmRleE9mKGQpPyh0aGlzLl93YXRjaEtleXMucHVzaChkKSx0aGlzLl93YXRjaEtleTJDb3VudFtkXT0xKTp0aGlzLl93YXRjaEtleTJDb3VudFtkXSs9MTt0aGlzLl93YXRjaEtleTJFeHBhbmRIYW5kbGVyW2RdPWY7dGhpcy5fd2F0Y2hLZXkyVmFsdWVTaG9ydFtkXT1nO3RoaXMuX2FjdGl2ZVdhdGNoS2V5PWQ7dGhpcy5fcmVtb3ZlQWN0aXZlU3RhdHVzRnJvbUFsbFJvd3MoKTt0aGlzLl9yZW5kZXJSb3coZCl9fSxfY2xlYXJUZW5zb3JEYXRhVGFibGUoKXtmb3IoY29uc3QgYSBpbiB0aGlzLl93YXRjaEtleTJSb3cpdGhpcy5fd2F0Y2hLZXkyUm93Lmhhc093blByb3BlcnR5KGEpJiYodGhpcy5fd2F0Y2hLZXkyUm93W2FdLnJlbW92ZSgpLGRlbGV0ZSB0aGlzLl93YXRjaEtleTJSb3dbYV0pfSxfY2xlYXJUZW5zb3JEYXRhUm93KGEpe2Zvcig7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCl9LApfY2xlYXJIZWFsdGhQaWxsTGVnZW5kKCl7Y29uc3QgYT10aGlzLiQkKCIjaGVhbHRoLXBpbGwtbGVnZW5kIik7Zm9yKDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKX0sX3JlbmRlckhlYWx0aFBpbGxMZWdlbmQoKXt0aGlzLl9jbGVhckhlYWx0aFBpbGxMZWdlbmQoKTtjb25zdCBhPXRoaXMuJCQoIiNoZWFsdGgtcGlsbC1sZWdlbmQiKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLnRleHRDb250ZW50PSJMZWdlbmQ6IjthLmFwcGVuZENoaWxkKGMpO2Muc3R5bGVbIm1hcmdpbi1yaWdodCJdPSIwLjVlbSI7Yy5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siO2ZvcihjPTA7Yzx0Zi5ncmFwaC5zY2VuZS5oZWFsdGhQaWxsRW50cmllcy5sZW5ndGg7KytjKXtjb25zdCBkPXRmLmdyYXBoLnNjZW5lLmhlYWx0aFBpbGxFbnRyaWVzW2NdLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOwpmLnN0eWxlWyJtYXJnaW4tcmlnaHQiXT0iMC4yNWVtIjtjb25zdCBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtnLnRleHRDb250ZW50PSJcdTI1YTAiO2cuc3R5bGUuY29sb3I9ZC5iYWNrZ3JvdW5kX2NvbG9yO2NvbnN0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO2wudGV4dENvbnRlbnQ9ZC5sYWJlbDtsLnN0eWxlLmNvbG9yPWQuYmFja2dyb3VuZF9jb2xvcjtmLmFwcGVuZENoaWxkKGcpO2YuYXBwZW5kQ2hpbGQobCk7YS5hcHBlbmRDaGlsZChmKX19LF9yZW1vdmVBY3RpdmVTdGF0dXNGcm9tQWxsUm93cygpe2Zvcihjb25zdCBhIGluIHRoaXMuX3dhdGNoS2V5MlJvdyl7aWYoIXRoaXMuX3dhdGNoS2V5MlJvdy5oYXNPd25Qcm9wZXJ0eShhKSljb250aW51ZTtjb25zdCBjPXRoaXMuX3dhdGNoS2V5MlJvd1thXTtQb2x5bWVyLmRvbShjKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUtdGVuc29yIik7UG9seW1lci5kb20oYykuY2xhc3NMaXN0LnJlbW92ZSgiaGlnaGxpZ2h0ZWQiKX19LApfcmVuZGVyUm93KGEpe2xldCBjLGQ9ITE7bnVsbCE9dGhpcy5fd2F0Y2hLZXkyUm93W2FdPyhjPXRoaXMuX3dhdGNoS2V5MlJvd1thXSx0aGlzLl9jbGVhclRlbnNvckRhdGFSb3coYyksZD0hMSk6KGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKSxkPSEwKTtjb25zdCBmPXRoaXMuX3dhdGNoS2V5MkRhdGFbYV0uZGV2aWNlTmFtZSxnPXRoaXMuX3dhdGNoS2V5MkRhdGFbYV0ubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSxsPWYrIi8iK2c7dmFyIGs9dGhpcy5fd2F0Y2hLZXkyQ291bnRbYV0sbj10aGlzLl93YXRjaEtleTJEYXRhW2FdLnRlbnNvck5hbWUscD10aGlzLl93YXRjaEtleTJEYXRhW2FdLmRlYnVnT3AscT10aGlzLl93YXRjaEtleTJWYWx1ZVNob3J0W2FdO2NvbnN0IHI9dGhpcy5fd2F0Y2hLZXkyRXhwYW5kSGFuZGxlclthXSx0PWE9PT10aGlzLl9hY3RpdmVXYXRjaEtleSx2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7UG9seW1lci5kb20odikuY2xhc3NMaXN0LmFkZCgidGVuc29yLW5hbWUiKTsKdi5zdHlsZVsidGV4dC1kZWNvcmF0aW9uIl09InVuZGVybGluZSI7di5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO3YudGV4dENvbnRlbnQ9bjt2LmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsKCk9PntudWxsIT10aGlzLnRlbnNvck5hbWVDbGlja2VkJiZ0aGlzLnRlbnNvck5hbWVDbGlja2VkKGYsZyl9KTtjb25zdCB5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7eS50ZXh0Q29udGVudD1rO2NvbnN0IHo9dGhpcy5fd2F0Y2hLZXkyRGF0YVthXS5kdHlwZTtrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Y29uc3QgeD10aGlzLl93YXRjaEtleTJEYXRhW2FdLnNoYXBlO2sudGV4dENvbnRlbnQ9ejtjb25zdCBDPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Qy50ZXh0Q29udGVudD1KU09OLnN0cmluZ2lmeSh4KTtjb25zdCBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7Ri50ZXh0Q29udGVudD1xO1BvbHltZXIuZG9tKEYpLmNsYXNzTGlzdC5hZGQoInZhbHVlLWV4cGFuc2lvbi1saW5rIik7Cm51bGwhPXImJihGLmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsciwhMSksRi5zdHlsZVsidGV4dC1kZWNvcmF0aW9uIl09InVuZGVybGluZSIsRi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtxPW51bGw7cT10aGlzLl9oZWFsdGhQaWxsc0VuYWJsZWQ/dGhpcy5fcmVuZGVySGVhbHRoUGlsbChuKyI6IitwLHtkZXZpY2VfbmFtZTpmLG5vZGVfbmFtZTpnLGR0eXBlOnosc2hhcGU6eCx2YWx1ZTpudWxsfSxyKTpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLWljb24tYnV0dG9uIik7cC5zZXRBdHRyaWJ1dGUoImljb24iLCJmb3J3YXJkIik7cC5zZXRBdHRyaWJ1dGUoInRpdGxlIiwiQ29udGludWUgdG8iKTtwLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e3RoaXMuY29udGludWVUb0NhbGxiYWNrKGYsZyl9KTtuLmFwcGVuZENoaWxkKHApO2MuYXBwZW5kQ2hpbGQodik7CmMuYXBwZW5kQ2hpbGQoeSk7Yy5hcHBlbmRDaGlsZChrKTtjLmFwcGVuZENoaWxkKEMpO2MuYXBwZW5kQ2hpbGQoRik7Yy5hcHBlbmRDaGlsZChxKTtjLmFwcGVuZENoaWxkKG4pO2Muc2V0QXR0cmlidXRlKCJub2RlTmFtZVdpdGhEZXZpY2UiLGwpO3QmJihQb2x5bWVyLmRvbShjKS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUtdGVuc29yIiksUG9seW1lci5kb20oYykuY2xhc3NMaXN0LmFkZCgiaGlnaGxpZ2h0ZWQiKSk7dGhpcy5fd2F0Y2hLZXkyUm93W2FdPWM7ZCYmUG9seW1lci5kb20odGhpcy4kJCgiI3RlbnNvci1kYXRhLXRhYmxlIHRib2R5IikpLmFwcGVuZENoaWxkKGMpO2Muc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJlbmQiLGlubGluZToibmVhcmVzdCIsYmVoYXZpb3VyOiJzbW9vdGgifSl9LF9yZW5kZXJIZWFsdGhQaWxsKGEsYyxkKXtjb25zdCBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7UG9seW1lci5kb20oZikuY2xhc3NMaXN0LmFkZCgiaGVhbHRoLXBpbGwiKTsKbnVsbCE9ZCYmZi5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLGQsITEpO2Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRmLmdyYXBoLnNjZW5lLlNWR19OQU1FU1BBQ0UsInN2ZyIpO2Quc2V0QXR0cmlidXRlKCJ3aWR0aCIsdGhpcy5faGVhbHRoUGlsbFdpZHRoKTtkLnNldEF0dHJpYnV0ZSgiaGVpZ2h0Iix0aGlzLl9oZWFsdGhQaWxsSGVpZ2h0KTtjb25zdCBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0Zi5ncmFwaC5zY2VuZS5TVkdfTkFNRVNQQUNFLCJnIik7ZC5hcHBlbmRDaGlsZChnKTtmLmFwcGVuZENoaWxkKGQpO2NvbnN0IGw9InRkcC8iK2E7dGhpcy5nZXRIZWFsdGhQaWxsKGEsYy5kZXZpY2VfbmFtZSxjLm5vZGVfbmFtZSxrPT57bnVsbD09az8oZi50ZXh0Q29udGVudD0iTi9BIixmLnN0eWxlLmNvbG9yPSJncmF5Iik6KGMudmFsdWU9ayx0Zi5ncmFwaC5zY2VuZS5hZGRIZWFsdGhQaWxsKGcsYyxudWxsLGwsdGhpcy5faGVhbHRoUGlsbFdpZHRoLHRoaXMuX2hlYWx0aFBpbGxIZWlnaHQvCjIsdGhpcy5faGVhbHRoUGlsbEhlaWdodC8yLDApKX0pO3JldHVybiBmfSxfaGlnaGxpZ2h0KGEpe1BvbHltZXIuZG9tKHRoaXMuJCQoIiN0ZW5zb3ItZGF0YS10YWJsZSIpKTtjb25zdCBjPVtdO2Zvcihjb25zdCBkIGluIHRoaXMuX3dhdGNoS2V5MlJvdyl7aWYoIXRoaXMuX3dhdGNoS2V5MlJvdy5oYXNPd25Qcm9wZXJ0eShkKSljb250aW51ZTtjb25zdCBmPXRoaXMuX3dhdGNoS2V5MlJvd1tkXTtudWxsIT1mLmdldEF0dHJpYnV0ZSYmKGYuZ2V0QXR0cmlidXRlKCJub2RlTmFtZVdpdGhEZXZpY2UiKT09PWE/Yy5wdXNoKGYpOlBvbHltZXIuZG9tKGYpLmNsYXNzTGlzdC5yZW1vdmUoImhpZ2hsaWdodGVkIikpfWlmKG51bGwhPWEpZm9yKGE9MDthPGMubGVuZ3RoOysrYSlQb2x5bWVyLmRvbShjW2FdKS5jbGFzc0xpc3QuYWRkKCJoaWdobGlnaHRlZCIpLGNbYV0uc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJlbmQiLGlubGluZToibmVhcmVzdCIsYmVoYXZpb3VyOiJzbW9vdGgifSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGVuc29yLXdpZGdldC90ZW5zb3Jfd2lkZ2V0X2JpbmFyeS5qcwp2YXIgaHA9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShjLGQpe2E9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKGYsZyl7Zi5fX3Byb3RvX189Z318fGZ1bmN0aW9uKGYsZyl7Zm9yKHZhciBsIGluIGcpZy5oYXNPd25Qcm9wZXJ0eShsKSYmKGZbbF09Z1tsXSl9O3JldHVybiBhKGMsZCl9cmV0dXJuIGZ1bmN0aW9uKGMsZCl7ZnVuY3Rpb24gZigpe3RoaXMuY29uc3RydWN0b3I9Y31hKGMsZCk7Yy5wcm90b3R5cGU9bnVsbD09PWQ/T2JqZWN0LmNyZWF0ZShkKTooZi5wcm90b3R5cGU9ZC5wcm90b3R5cGUsbmV3IGYpfX0oKSxpcD10aGlzJiZ0aGlzLl9fZ2VuZXJhdG9yfHxmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGQocSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBmKFtxLHJdKX19ZnVuY3Rpb24gZihxKXtpZihsKXRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy4iKTsKZm9yKDtnOyl0cnl7aWYobD0xLGsmJihuPXFbMF0mMj9rWyJyZXR1cm4iXTpxWzBdP2tbInRocm93Il18fCgobj1rWyJyZXR1cm4iXSkmJm4uY2FsbChrKSwwKTprLm5leHQpJiYhKG49bi5jYWxsKGsscVsxXSkpLmRvbmUpcmV0dXJuIG47aWYoaz0wLG4pcT1bcVswXSYyLG4udmFsdWVdO3N3aXRjaChxWzBdKXtjYXNlIDA6Y2FzZSAxOm49cTticmVhaztjYXNlIDQ6cmV0dXJuIGcubGFiZWwrKyx7dmFsdWU6cVsxXSxkb25lOiExfTtjYXNlIDU6Zy5sYWJlbCsrO2s9cVsxXTtxPVswXTtjb250aW51ZTtjYXNlIDc6cT1nLm9wcy5wb3AoKTtnLnRyeXMucG9wKCk7Y29udGludWU7ZGVmYXVsdDppZighKG49Zy50cnlzLG49MDxuLmxlbmd0aCYmbltuLmxlbmd0aC0xXSkmJig2PT09cVswXXx8Mj09PXFbMF0pKXtnPTA7Y29udGludWV9aWYoMz09PXFbMF0mJighbnx8cVsxXT5uWzBdJiZxWzFdPG5bM10pKWcubGFiZWw9cVsxXTtlbHNlIGlmKDY9PT1xWzBdJiZnLmxhYmVsPG5bMV0pZy5sYWJlbD0KblsxXSxuPXE7ZWxzZSBpZihuJiZnLmxhYmVsPG5bMl0pZy5sYWJlbD1uWzJdLGcub3BzLnB1c2gocSk7ZWxzZXtuWzJdJiZnLm9wcy5wb3AoKTtnLnRyeXMucG9wKCk7Y29udGludWV9fXE9Yy5jYWxsKGEsZyl9Y2F0Y2gocil7cT1bNixyXSxrPTB9ZmluYWxseXtsPW49MH1pZihxWzBdJjUpdGhyb3cgcVsxXTtyZXR1cm57dmFsdWU6cVswXT9xWzFdOnZvaWQgMCxkb25lOiEwfX12YXIgZz17bGFiZWw6MCxzZW50OmZ1bmN0aW9uKCl7aWYoblswXSYxKXRocm93IG5bMV07cmV0dXJuIG5bMV19LHRyeXM6W10sb3BzOltdfSxsLGssbixwO3JldHVybiBwPXtuZXh0OmQoMCksInRocm93IjpkKDEpLCJyZXR1cm4iOmQoMil9LCJmdW5jdGlvbiI9PT10eXBlb2YgU3ltYm9sJiYocFtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxwfSxqcD10aGlzJiZ0aGlzLl9fcmVhZHx8ZnVuY3Rpb24oYSxjKXt2YXIgZD0iZnVuY3Rpb24iPT09dHlwZW9mIFN5bWJvbCYmYVtTeW1ib2wuaXRlcmF0b3JdOwppZighZClyZXR1cm4gYTthPWQuY2FsbChhKTt2YXIgZixnPVtdO3RyeXtmb3IoOyh2b2lkIDA9PT1jfHwwPGMtLSkmJiEoZj1hLm5leHQoKSkuZG9uZTspZy5wdXNoKGYudmFsdWUpfWNhdGNoKGspe3ZhciBsPXtlcnJvcjprfX1maW5hbGx5e3RyeXtmJiYhZi5kb25lJiYoZD1hWyJyZXR1cm4iXSkmJmQuY2FsbChhKX1maW5hbGx5e2lmKGwpdGhyb3cgbC5lcnJvcjt9fXJldHVybiBnfTsKKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShILEssTSxMKXtyZXR1cm4gbmV3IChNfHwoTT1Qcm9taXNlKSkoZnVuY3Rpb24oUixVKXtmdW5jdGlvbiBZKGFhKXt0cnl7bWEoTC5uZXh0KGFhKSl9Y2F0Y2goY2Epe1UoY2EpfX1mdW5jdGlvbiBiYShhYSl7dHJ5e21hKExbInRocm93Il0oYWEpKX1jYXRjaChjYSl7VShjYSl9fWZ1bmN0aW9uIG1hKGFhKXthYS5kb25lP1IoYWEudmFsdWUpOihuZXcgTShmdW5jdGlvbihjYSl7Y2EoYWEudmFsdWUpfSkpLnRoZW4oWSxiYSl9bWEoKEw9TC5hcHBseShILEt8fFtdKSkubmV4dCgpKX0pfWZ1bmN0aW9uIGMoSCl7cmV0dXJuIG51bGwhPT1ILm1hdGNoKC9eaW50WzAtOV0rJC8pfHxudWxsIT09SC5tYXRjaCgvXnVpbnRbMC05XSskLyl9ZnVuY3Rpb24gZChIKXtyZXR1cm4gbnVsbCE9PUgubWF0Y2goL15mbG9hdFswLTldKyQvKXx8bnVsbCE9PUgubWF0Y2goL15iZmxvYXRbMC05XSskLyl9ZnVuY3Rpb24gZihIKXtyZXR1cm4iYm9vbCI9PT1ILnRvTG93ZXJDYXNlKCl8fAoiYm9vbGVhbiI9PT1ILnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gZyhIKXtyZXR1cm4ic3RyIj09PUgudG9Mb3dlckNhc2UoKXx8InN0cmluZyI9PT1ILnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gbChIKXt2YXIgSz0xO0guZm9yRWFjaChmdW5jdGlvbihNKXtLKj1NfSk7cmV0dXJuIEt9ZnVuY3Rpb24gayhIKXtyZXR1cm4gMD09PUgubGVuZ3RoPyJzY2FsYXIiOiJbIitIKyJdIn1mdW5jdGlvbiBuKEgpe3ZhciBLPXtzbGljaW5nRGltc0FuZEluZGljZXM6W10sdmlld2luZ0RpbXM6W10sdmVydGljYWxSYW5nZTpudWxsLGhvcml6b250YWxSYW5nZTpudWxsfSxNPUgubGVuZ3RoO2lmKDE9PT1NKUsudmlld2luZ0RpbXM9WzBdO2Vsc2UgaWYoMTxNKXtpZigyPE0pZm9yKHZhciBMPTA7TDxNLTI7KytMKUsuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLnB1c2goe2RpbTpMLGluZGV4OjA9PT1IW0xdP251bGw6MH0pO2ZvcihMPUgubGVuZ3RoLTI7TDxILmxlbmd0aDsrK0wpSy52aWV3aW5nRGltcy5wdXNoKEwpfXJldHVybiBLfQpmdW5jdGlvbiBwKEgsSyl7aWYoSC52aWV3aW5nRGltc1swXSE9PUsudmlld2luZ0RpbXNbMF18fEgudmlld2luZ0RpbXNbMV0hPT1LLnZpZXdpbmdEaW1zWzFdKXJldHVybiExO0s9SC5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKE0pe3JldHVybiBNLmRpbX0pO0suc29ydCgpO0g9SC5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKE0pe3JldHVybiBNLmRpbX0pO0guc29ydCgpO3JldHVybiBKU09OLnN0cmluZ2lmeShLKT09PUpTT04uc3RyaW5naWZ5KEgpfWZ1bmN0aW9uIHEoSCl7cmV0dXJuIDIwPj1ILmxlbmd0aD9IOkguc2xpY2UoMCwxMCkrIi4uLiIrSC5zbGljZShILmxlbmd0aC03LEgubGVuZ3RoKX1mdW5jdGlvbiByKEgsSyxNLEwpe3ZvaWQgMD09PU0mJihNPTIpO2lmKGlzTmFOKEgpKXJldHVybiJOYU4iO2lmKC1JbmZpbml0eT09PUgpcmV0dXJuIi1cdTIyMWUiO2lmKEluZmluaXR5PT09SClyZXR1cm4iK1x1MjIxZSI7bnVsbD09TCYmKEw9Ck1hdGguYWJzKEgpLEw9MUUzPkwmJi4wMTw9THx8MD09PUw/ImZpeGVkIjoiZXhwb25lbnRpYWwiKTtyZXR1cm4gbnVsbD09THx8ImZpeGVkIj09PUw/Sz8iIitIOkgudG9GaXhlZChNKTpILnRvRXhwb25lbnRpYWwoTSl9ZnVuY3Rpb24gdChILEspe3ZvaWQgMD09PUsmJihLPSEwKTtyZXR1cm4gSD9LPyJUIjoiVHJ1ZSI6Sz8iRiI6IkZhbHNlIn1mdW5jdGlvbiB2KEgsSyl7dm9pZCAwPT09SyYmKEs9NCk7cmV0dXJuIG51bGw9PT1LfHxILmxlbmd0aDw9Sz9IOkguc2xpY2UoMCxLLTEpKyJcdTIwMjYifXZhciB5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSChLKXt0aGlzLmlzU2hvd249ITE7dGhpcy5ibHVySGlkZUZ1bmN0aW9uPW51bGw7dGhpcy5kcm9wZG93bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmRyb3Bkb3duLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duIik7dGhpcy5kcm9wZG93bi5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO3RoaXMuZHJvcGRvd24uc3R5bGUuZGlzcGxheT0KIm5vbmUiO0suYXBwZW5kQ2hpbGQodGhpcy5kcm9wZG93bil9SC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbihLLE0sTCl7dmFyIFI9dGhpcztMLmZvckVhY2goZnVuY3Rpb24oWSl7dmFyIGJhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2JhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbSIpO2JhLnRleHRDb250ZW50PVkuY2FwdGlvbjtSLmRyb3Bkb3duLmFwcGVuZENoaWxkKGJhKTtZLmRpc2FibGVkP2JhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1kaXNhYmxlZCIpOihiYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24obWEpe21hLnN0b3BQcm9wYWdhdGlvbigpO1IuZHJvcGRvd24uY2xpY2soKTtpZihudWxsIT09WS5vbkNsaWNrKVkub25DbGljayhtYSk7Ui5oaWRlKCl9KSxiYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixmdW5jdGlvbihtYSl7aWYobnVsbCE9PQpZLm9uSG92ZXIpWS5vbkhvdmVyKG1hKTtiYS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0tYWN0aXZlIil9KSxiYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe2JhLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUiKTtpZihudWxsIT09WS5vbkhvdmVyKXtmb3IodmFyIG1hPVtdLGFhPTA7YWE8YmEuY2hpbGRyZW4ubGVuZ3RoOysrYWEpe3ZhciBjYT1iYS5jaGlsZHJlblthYV07Y2EuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93biIpJiZtYS5wdXNoKGNhKX1tYS5mb3JFYWNoKGZ1bmN0aW9uKGZhKXtyZXR1cm4gYmEucmVtb3ZlQ2hpbGQoZmEpfSl9fSkpfSk7dGhpcy5kcm9wZG93bi5zdHlsZS5kaXNwbGF5PSJibG9jayI7dGhpcy5kcm9wZG93bi5zdHlsZS50b3A9SysicHgiO3RoaXMuZHJvcGRvd24uc3R5bGUubGVmdD0KTSsicHgiO0w9dGhpcy5kcm9wZG93bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgVT1MLmxlZnQtTTt0aGlzLmRyb3Bkb3duLnN0eWxlLnRvcD0oSy0oTC50b3AtSykpLnRvRml4ZWQoMSkrInB4Ijt0aGlzLmRyb3Bkb3duLnN0eWxlLmxlZnQ9KE0tVSkudG9GaXhlZCgxKSsicHgiO3RoaXMuaXNTaG93bj0hMDt0aGlzLmJsdXJIaWRlRnVuY3Rpb249ZnVuY3Rpb24oKXtSLmhpZGUoKX07c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLFIuYmx1ckhpZGVGdW5jdGlvbil9LDUwKX07SC5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe2Zvcih0aGlzLmRyb3Bkb3duLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZHJvcGRvd24uZmlyc3RDaGlsZDspdGhpcy5kcm9wZG93bi5yZW1vdmVDaGlsZCh0aGlzLmRyb3Bkb3duLmZpcnN0Q2hpbGQpO3RoaXMuaXNTaG93bj0hMTtudWxsIT10aGlzLmJsdXJIaWRlRnVuY3Rpb24mJndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuYmx1ckhpZGVGdW5jdGlvbil9O0gucHJvdG90eXBlLnNob3duPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNTaG93bn07cmV0dXJuIEh9KCksej1mdW5jdGlvbigpe2Z1bmN0aW9uIEgoSyxNKXt2YXIgTD10aGlzO3RoaXMuY29uZmlnPUs7dGhpcy5wYXJlbnRFbGVtZW50PU07dGhpcy5iYXNlRmxhdE1lbnU9bmV3IHkodGhpcy5wYXJlbnRFbGVtZW50KTt0aGlzLmN1cnJlbnRDaG9pY2VTZWxlY3Rpb25zPXt9O3RoaXMuY29uZmlnLml0ZW1zLmZvckVhY2goZnVuY3Rpb24oUixVKXtudWxsIT1SLm9wdGlvbnMmJihMLmN1cnJlbnRDaG9pY2VTZWxlY3Rpb25zW1VdPVIuZGVmYXVsdFNlbGVjdGlvbil9KX1ILnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKEssTSl7dmFyIEw9dGhpcyxSPVtdO3RoaXMuY29uZmlnLml0ZW1zLmZvckVhY2goZnVuY3Rpb24oVSxZKXt2YXIgYmE9e2NhcHRpb246VS5jYXB0aW9uLG9uQ2xpY2s6bnVsbCxvbkhvdmVyOm51bGx9O2lmKG51bGwhPVUub3B0aW9ucyl7dmFyIG1hPQpMLmN1cnJlbnRDaG9pY2VTZWxlY3Rpb25zW1ldO2JhLm9uSG92ZXI9ZnVuY3Rpb24oYWEpe3ZhciBjYT1hYS50YXJnZXQsZmE9W107VS5vcHRpb25zLmZvckVhY2goZnVuY3Rpb24oZGEsbGEpe2ZhLnB1c2goe2NhcHRpb246bGE9PT1tYT9kYSsiIChcdTI3MTMpIjpkYSxvbkNsaWNrOmZ1bmN0aW9uKCl7bWEhPT1sYSYmKEwuY3VycmVudENob2ljZVNlbGVjdGlvbnNbWV09bGEsVS5jYWxsYmFjayhsYSkpfSxvbkhvdmVyOm51bGx9KX0pO2FhPW5ldyB5KGNhKTtjYT1jYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTthYS5zaG93KGNhLnRvcCxjYS5yaWdodCxmYSl9fWVsc2UgYmEub25DbGljaz1VLmNhbGxiYWNrO251bGw9PVUuaXNFbmFibGVkfHxVLmlzRW5hYmxlZCgpfHwoYmEuZGlzYWJsZWQ9ITApO1IucHVzaChiYSl9KTt0aGlzLmJhc2VGbGF0TWVudS5zaG93KEssTSxSKX07SC5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3RoaXMuYmFzZUZsYXRNZW51LmhpZGUoKX07SC5wcm90b3R5cGUuc2hvd249CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYmFzZUZsYXRNZW51LnNob3duKCl9O3JldHVybiBIfSgpLHg7KGZ1bmN0aW9uKEgpe0hbSC5VUD0xXT0iVVAiO0hbSC5ET1dOPTJdPSJET1dOIjtIW0guTEVGVD0zXT0iTEVGVCI7SFtILlJJR0hUPTRdPSJSSUdIVCJ9KSh4fHwoeD17fSkpO3ZhciBDPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSChLLE0sTCxSLFUsWSl7dGhpcy5zaGFwZT1LO3RoaXMuc2xpY2VEaW1zPVtdO3RoaXMuc2xpY2VJbmRpY2VzPVtdO2lmKDA9PT1sKHRoaXMuc2hhcGUpKXRocm93IEVycm9yKCJUZW5zb3JFbGVtZW50U2VsZWN0aW9uIGRvZXNuJ3Qgc3VwcG9ydCB0ZW5zb3Igd2l0aCB6ZXJvIGVsZW1lbnRzLiIpO2ZvcihLPTA7SzxNLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5sZW5ndGg7KytLKXt0aGlzLnNsaWNlRGltcy5wdXNoKE0uc2xpY2luZ0RpbXNBbmRJbmRpY2VzW0tdLmRpbSk7dmFyIGJhPU0uc2xpY2luZ0RpbXNBbmRJbmRpY2VzW0tdLmluZGV4O2lmKG51bGw9PT0KYmEpdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgVGVuc29yRWxlbWVudFNlbGVjdGlvbiBkdWUgdG8gdW5kZXRlcm1pbmVkIHNsaWNpbmcgaW5kZXggYXQgZGltZW5zaW9uICIrSyk7dGhpcy5zbGljZUluZGljZXMucHVzaChiYSl9dGhpcy5yYW5rPXRoaXMuc2hhcGUubGVuZ3RoO2lmKDA8dGhpcy5yYW5rJiZ0aGlzLnNsaWNlRGltcy5sZW5ndGg+PXRoaXMucmFuayl0aHJvdyBFcnJvcigiRXhwZWN0ZWQgc2xpY2VEaW1zIHRvIGhhdmUgYSBsZW5ndGggbGVzcyB0aGFuIHJhbmsgIit0aGlzLnJhbmsrIiwgYnV0IGdvdCBsZW5ndGggIit0aGlzLnNsaWNlRGltcy5sZW5ndGgpO3RoaXMudmlld0RpbXM9W107Zm9yKEs9MDtLPHRoaXMucmFuazsrK0spLTE9PT10aGlzLnNsaWNlRGltcy5pbmRleE9mKEspJiZ0aGlzLnZpZXdEaW1zLnB1c2goSyk7aWYoMjx0aGlzLnZpZXdEaW1zLmxlbmd0aCl0aHJvdyBFcnJvcigiT25seSBzZWxlY3Rpb25zIGluIDFEIGFuZCAyRCBhcmUgc3VwcG9ydGVkLiIpOwp0aGlzLnJvd1N0YXJ0PW51bGw9PUw/MDpMO3RoaXMuY29sU3RhcnQ9bnVsbD09Uj8wOlI7dGhpcy5yb3dDb3VudD1udWxsPT1VPzE6VTt0aGlzLmNvbENvdW50PW51bGw9PVk/MTpZfUgucHJvdG90eXBlLmdldEVsZW1lbnRTdGF0dXM9ZnVuY3Rpb24oSyl7aWYoSy5sZW5ndGghPT10aGlzLnJhbmspdGhyb3cgRXJyb3IoIkV4cGVjdGVkIGluZGljZXMgdG8gaGF2ZSBhIHJhbmsgb2YgIit0aGlzLnJhbmsrIiwgYnV0IGdvdCAiKyhLLmxlbmd0aCsiIChbIitLKyJdKSIpKTtmb3IodmFyIE09MDtNPEsubGVuZ3RoOysrTSlpZigtMSE9PXRoaXMuc2xpY2VEaW1zLmluZGV4T2YoTSkmJktbTV0hPT10aGlzLnNsaWNlSW5kaWNlc1t0aGlzLnNsaWNlRGltcy5pbmRleE9mKE0pXSlyZXR1cm4gbnVsbDtNPW51bGw7dmFyIEw9dGhpcy5yb3dTdGFydCt0aGlzLnJvd0NvdW50LFI9dGhpcy5jb2xTdGFydCt0aGlzLmNvbENvdW50O2lmKDA9PT10aGlzLnZpZXdEaW1zLmxlbmd0aCkwPT09Sy5sZW5ndGgmJgooTT17dG9wRWRnZTohMCxib3R0b21FZGdlOiEwLGxlZnRFZGdlOiEwLHJpZ2h0RWRnZTohMH0pO2Vsc2UgaWYoMT09PXRoaXMudmlld0RpbXMubGVuZ3RoKXt2YXIgVT10aGlzLnZpZXdEaW1zWzBdO0tbVV0+PXRoaXMucm93U3RhcnQmJktbVV08TCYmKE09e3RvcEVkZ2U6S1tVXT09PXRoaXMucm93U3RhcnQsYm90dG9tRWRnZTpLW1VdPT09TC0xLGxlZnRFZGdlOiEwLHJpZ2h0RWRnZTohMH0pfWVsc2UgaWYoMj09PXRoaXMudmlld0RpbXMubGVuZ3RoKXtVPXRoaXMudmlld0RpbXNbMF07dmFyIFk9dGhpcy52aWV3RGltc1sxXTtLW1VdPj10aGlzLnJvd1N0YXJ0JiZLW1VdPEwmJktbWV0+PXRoaXMuY29sU3RhcnQmJktbWV08UiYmKE09e3RvcEVkZ2U6S1tVXT09PXRoaXMucm93U3RhcnQsYm90dG9tRWRnZTpLW1VdPT09TC0xLGxlZnRFZGdlOktbWV09PT10aGlzLmNvbFN0YXJ0LHJpZ2h0RWRnZTpLW1ldPT09Ui0xfSl9ZWxzZSB0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBsZW5ndGggb2Ygdmlld0RpbXM6ICIrCnRoaXMudmlld0RpbXMpO3JldHVybiBNfTtILnByb3RvdHlwZS5tb3ZlPWZ1bmN0aW9uKEssTSl7dmFyIEw9bnVsbDtpZigwPT09dGhpcy5yYW5rfHwxPT09dGhpcy5yYW5rJiYoSz09PXguTEVGVHx8Sz09PXguUklHSFQpKXJldHVybiBudWxsO2lmKG51bGw9PT1NLnZlcnRpY2FsUmFuZ2V8fG51bGw9PT1NLnZlcnRpY2FsUmFuZ2VbMV0pdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBtb3ZlIGR1ZSB0byB1bmRldGVybWluZWQgdmVydGljYWwgcmFuZ2UuIik7Sz09PXguVVA/MDx0aGlzLnJvd1N0YXJ0JiYodGhpcy5yb3dTdGFydC0tLG51bGwhPU0udmVydGljYWxSYW5nZSYmdGhpcy5yb3dTdGFydDxNLnZlcnRpY2FsUmFuZ2VbMF0mJihMPXguVVApKTpLPT09eC5ET1dOP251bGwhPU0udmlld2luZ0RpbXMmJm51bGwhPU0udmlld2luZ0RpbXNbMF0mJnRoaXMucm93U3RhcnQ8dGhpcy5zaGFwZVtNLnZpZXdpbmdEaW1zWzBdXS0xJiYodGhpcy5yb3dTdGFydCsrLG51bGwhPU0udmVydGljYWxSYW5nZSYmCnRoaXMucm93U3RhcnQ+PU0udmVydGljYWxSYW5nZVsxXSYmKEw9eC5ET1dOKSk6Sz09PXguTEVGVD8wPHRoaXMuY29sU3RhcnQmJih0aGlzLmNvbFN0YXJ0LS0sbnVsbCE9TS5ob3Jpem9udGFsUmFuZ2UmJnRoaXMuY29sU3RhcnQ8TS5ob3Jpem9udGFsUmFuZ2VbMF0mJihMPXguTEVGVCkpOks9PT14LlJJR0hUJiZudWxsIT1NLnZpZXdpbmdEaW1zJiZudWxsIT1NLnZpZXdpbmdEaW1zWzFdJiZ0aGlzLmNvbFN0YXJ0PHRoaXMuc2hhcGVbTS52aWV3aW5nRGltc1sxXV0tMSYmKHRoaXMuY29sU3RhcnQrKyxudWxsIT1NLmhvcml6b250YWxSYW5nZSYmdGhpcy5jb2xTdGFydD49TS5ob3Jpem9udGFsUmFuZ2VbMV0mJihMPXguUklHSFQpKTt0aGlzLmNvbENvdW50PXRoaXMucm93Q291bnQ9MTtyZXR1cm4gTH07SC5wcm90b3R5cGUuZ2V0Um93U3RhcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb3dTdGFydH07SC5wcm90b3R5cGUuZ2V0Um93Q291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb3dDb3VudH07CkgucHJvdG90eXBlLmdldENvbFN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29sU3RhcnR9O0gucHJvdG90eXBlLmdldENvbENvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29sQ291bnR9O3JldHVybiBIfSgpLEY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBIKEssTSxMKXt2b2lkIDA9PT1MJiYoTD1mdW5jdGlvbigpe30pO3RoaXMucm9vdERpdj1LO3RoaXMuc2hhcGU9TTt0aGlzLm9uU2xpY2luZ1NwZWNDaGFuZ2U9TDt0aGlzLmRpbUNvbnRyb2xzPVtdO3RoaXMuZGltSW5wdXRzPVtdO3RoaXMuY29tbWFzPVtdO3RoaXMuZHJvcGRvd25zPVtdO3RoaXMuYnJhY2tldERpdnM9W251bGwsbnVsbF07dGhpcy5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWQ9W107dGhpcy5yYW5rPXRoaXMuc2hhcGUubGVuZ3RoO2lmKDM+dGhpcy5yYW5rKXRocm93IEVycm9yKCJEaW1lbnNpb24gY29udHJvbCBpcyBub3QgYXBwbGljYWJsZSB0byB0ZW5zb3Igc2hhcGVzIGxlc3MgdGhhbiAzRDogcmVjZWl2ZWQgIisKKHRoaXMucmFuaysiRCB0ZW5zb3Igc2hhcGU6ICIpKyhKU09OLnN0cmluZ2lmeSh0aGlzLnNoYXBlKSsiLiIpKTt0aGlzLmNyZWF0ZUNvbXBvbmVudHMoKTt0aGlzLnNsaWNpbmdTcGVjPW4oTSl9SC5wcm90b3R5cGUuY3JlYXRlQ29tcG9uZW50cz1mdW5jdGlvbigpe2Zvcih2YXIgSz10aGlzO3RoaXMucm9vdERpdi5maXJzdENoaWxkOyl0aGlzLnJvb3REaXYucmVtb3ZlQ2hpbGQodGhpcy5yb290RGl2LmZpcnN0Q2hpbGQpO3RoaXMuZGltQ29udHJvbHM9W107dGhpcy5kaW1JbnB1dHM9W107dGhpcy5jb21tYXM9W107dGhpcy5kcm9wZG93bnM9W107dGhpcy5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWQ9W107dGhpcy5icmFja2V0RGl2c1swXT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmJyYWNrZXREaXZzWzBdLnRleHRDb250ZW50PSJTbGljaW5nOiBbIjt0aGlzLmJyYWNrZXREaXZzWzBdLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWJyYWNrZXRzIik7CnRoaXMucm9vdERpdi5hcHBlbmRDaGlsZCh0aGlzLmJyYWNrZXREaXZzWzBdKTtmb3IodmFyIE09MDtNPHRoaXMucmFuazsrK00pe3ZhciBMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0wuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0iKTtMLnRpdGxlPSJEaW1lbnNpb24gIitNKyI6IHNpemVceDNkIit0aGlzLnNoYXBlW01dO3RoaXMucm9vdERpdi5hcHBlbmRDaGlsZChMKTt0aGlzLmRpbUNvbnRyb2xzLnB1c2goTCk7dGhpcy5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWQucHVzaCghMSk7TD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO0wuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0iKTtMLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMucm9vdERpdi5hcHBlbmRDaGlsZChMKTt0aGlzLmRpbUlucHV0cy5wdXNoKEwpO008dGhpcy5yYW5rLTEmJihMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLEwuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0tY29tbWEiKSwKTC50ZXh0Q29udGVudD0iLCIsdGhpcy5yb290RGl2LmFwcGVuZENoaWxkKEwpLHRoaXMuY29tbWFzLnB1c2goTCkpO0w9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7TC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93biIpO0wuc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5yb290RGl2LmFwcGVuZENoaWxkKEwpO3RoaXMuZHJvcGRvd25zLnB1c2goTCl9dGhpcy5icmFja2V0RGl2c1sxXT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmJyYWNrZXREaXZzWzFdLnRleHRDb250ZW50PSJdIjt0aGlzLmJyYWNrZXREaXZzWzFdLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWJyYWNrZXRzIik7dGhpcy5yb290RGl2LmFwcGVuZENoaWxkKHRoaXMuYnJhY2tldERpdnNbMV0pO3RoaXMucm9vdERpdi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe0suY2xlYXJBbGxEcm9wZG93bnMoKX0pfTtILnByb3RvdHlwZS5yZW5kZXI9CmZ1bmN0aW9uKEspe2Z1bmN0aW9uIE0oYmEpe3ZhciBtYT1ZLmRpbUNvbnRyb2xzW2JhXSxhYT1ZLmRpbUlucHV0c1tiYV0sY2E9WS5kcm9wZG93bnNbYmFdO2lmKCJub25lIiE9PWFhLnN0eWxlLmRpc3BsYXkpcmV0dXJuImNvbnRpbnVlIjt2YXIgZmE9WS5zaGFwZVtiYV07aWYoLTEhPT1SLmluZGV4T2YoYmEpKXt2YXIgZGE9VVtSLmluZGV4T2YoYmEpXTttYS50ZXh0Q29udGVudD1TdHJpbmcoZGEpO2FhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltIik7YWEudHlwZT0ibnVtYmVyIjthYS5taW49IjAiO2FhLm1heD1TdHJpbmcoZmEtMSk7YWEudmFsdWU9U3RyaW5nKGRhKTtZLmRpbUNvbnRyb2xzTGlzdGVuZXJBdHRhY2hlZFtiYV18fChtYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtMLmNsZWFyQWxsRHJvcGRvd25zKCk7bWEuc3R5bGUuZGlzcGxheT0ibm9uZSI7YWEuc3R5bGUuZGlzcGxheT0iaW5saW5lLWJsb2NrIn0pLGFhLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsCmZ1bmN0aW9uKCl7aWYobnVsbD09PUwuc2xpY2luZ1NwZWMpdGhyb3cgRXJyb3IoIlNsaWNpbmcgY29udHJvbCBjaGFuZ2UgY2FsbGJhY2sgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIHNwZWMuIik7dmFyIGxhPXBhcnNlSW50KGFhLnZhbHVlLDEwKTshaXNGaW5pdGUobGEpfHwwPmxhfHxsYT49ZmF8fE1hdGguZmxvb3IoZmEpIT1mYT9hYS52YWx1ZT1TdHJpbmcoTC5zbGljaW5nU3BlYy5zbGljaW5nRGltc0FuZEluZGljZXNbUi5pbmRleE9mKGJhKV0uaW5kZXgpOihMLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tSLmluZGV4T2YoYmEpXS5pbmRleD1sYSxtYS50ZXh0Q29udGVudD1TdHJpbmcobGEpLEwub25TbGljaW5nU3BlY0NoYW5nZShMLnNsaWNpbmdTcGVjKSl9KSxhYS5hZGRFdmVudExpc3RlbmVyKCJibHVyIixmdW5jdGlvbigpe2FhLnN0eWxlLmRpc3BsYXk9Im5vbmUiO21hLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayJ9KSxZLmRpbUNvbnRyb2xzTGlzdGVuZXJBdHRhY2hlZFtiYV09CiEwKX1lbHNle2lmKFkuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF09PT1iYSl7aWYobnVsbD09PVkuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyB2ZXJ0aWNhbCByYW5nZS4iKTttYS50ZXh0Q29udGVudD0iXHUyMTk1ICIrWS5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdKyI6IitZLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV19ZWxzZXtpZihudWxsPT09WS5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgaG9yaXpvbnRhbCByYW5nZS4iKTttYS50ZXh0Q29udGVudD0iXHUyMTk0ICIrWS5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF0rIjoiK1kuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdfW1hLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltIik7WS5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWRbYmFdfHwobWEuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dmFyIGxhPQptYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtMLnJlbmRlckRyb3Bkb3duTWVudUl0ZW1zKGNhLGxhLmJvdHRvbSxsYS5sZWZ0LGJhKX0pLFkuZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkW2JhXT0hMCl9fXZhciBMPXRoaXM7bnVsbCE9SyYmKHRoaXMuc2xpY2luZ1NwZWM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShLKSkpO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJTbGljaW5nIGNvbnRyb2wgcmVuZGVyaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBzbGljaW5nIHNwZWMuIik7dmFyIFI9dGhpcy5zbGljaW5nU3BlYy5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKGJhKXtyZXR1cm4gYmEuZGltfSksVT10aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZnVuY3Rpb24oYmEpe3JldHVybiBiYS5pbmRleH0pLFk9dGhpcztmb3IoSz0wO0s8dGhpcy5yYW5rOysrSylNKEspfTtILnByb3RvdHlwZS5yZW5kZXJEcm9wZG93bk1lbnVJdGVtcz0KZnVuY3Rpb24oSyxNLEwsUil7ZnVuY3Rpb24gVShmYSl7aWYoLTE9PT1iYS5pbmRleE9mKGZhKXx8Uj09PW1hLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzFdJiZmYTw9bWEuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF18fFI9PW1hLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdJiZmYT49bWEuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV0pcmV0dXJuImNvbnRpbnVlIjt2YXIgZGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZGEuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtIik7ZGEudGV4dENvbnRlbnQ9IlN3YXAgd2l0aCBkaW1lbnNpb24gIitmYTtLLmFwcGVuZENoaWxkKGRhKTtkYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixmdW5jdGlvbigpe2RhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUiKTtZLmRpbUNvbnRyb2xzW2ZhXS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1oaWdobGlnaHRlZCIpfSk7CmRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLGZ1bmN0aW9uKCl7ZGEuY2xhc3NMaXN0LnJlbW92ZSgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSIpO1kuZGltQ29udHJvbHNbZmFdLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtZGltLWhpZ2hsaWdodGVkIil9KTt2YXIgbGE9bWEuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF09PT1SO2RhLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe2lmKG51bGw9PT1ZLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJEaW1lbnNpb24gc3dhcHBpbmcgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIHNsaWNpbmcgc3BlYyIpO3ZhciBaPWJhLmluZGV4T2YoZmEpO1kuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbbGE/MDoxXT1mYTtZLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1taXT17ZGltOlIsaW5kZXg6MH07WS5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlPW51bGw7WS5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2U9Cm51bGw7aWYoWS5vblNsaWNpbmdTcGVjQ2hhbmdlKVkub25TbGljaW5nU3BlY0NoYW5nZShZLnNsaWNpbmdTcGVjKX0pfXZhciBZPXRoaXM7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMpdGhyb3cgRXJyb3IoIlNsaWNpbmcgY29udHJvbCBjYW5ub3QgcmVuZGVyIGRyb3Bkb3duIG1lbnUgaXRlbXMgZHVlIHRvIG1pc3Npbmcgc2xpY2luZyBzcGVjLiIpO3RoaXMuY2xlYXJBbGxEcm9wZG93bnMoKTtmb3IodmFyIGJhPXRoaXMuc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLm1hcChmdW5jdGlvbihmYSl7cmV0dXJuIGZhLmRpbX0pLG1hPXRoaXMsYWE9MDthYTx0aGlzLnJhbms7KythYSlVKGFhKTtLLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLGZ1bmN0aW9uKCl7Sy5zdHlsZS5kaXNwbGF5PSJub25lIn0pO2lmKEsuZmlyc3RDaGlsZCl7Sy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO0suc3R5bGUudG9wPU0rInB4IjtLLnN0eWxlLmxlZnQ9TCsicHgiO0suc3R5bGUuZGlzcGxheT0KImJsb2NrIjthYT1LLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciBjYT1hYS5sZWZ0LUw7Sy5zdHlsZS50b3A9KE0tKGFhLnRvcC1NKSkudG9GaXhlZCgxKSsicHgiO0suc3R5bGUubGVmdD0oTC1jYSkudG9GaXhlZCgxKSsicHgifX07SC5wcm90b3R5cGUuc2V0U2xpY2luZ1NwZWM9ZnVuY3Rpb24oSyl7dGhpcy5zbGljaW5nU3BlYz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEspKTtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYyl0aHJvdyBFcnJvcigiQ2Fubm90IHNldCBzbGljaW5nIHNwZWMgdG8gbnVsbC4iKTt0aGlzLnJlbmRlcih0aGlzLnNsaWNpbmdTcGVjKX07SC5wcm90b3R5cGUuY2xlYXJBbGxEcm9wZG93bnM9ZnVuY3Rpb24oKXt0aGlzLmRyb3Bkb3ducy5mb3JFYWNoKGZ1bmN0aW9uKEspe2lmKG51bGwhPUspe2Zvcig7Sy5maXJzdENoaWxkOylLLnJlbW92ZUNoaWxkKEsuZmlyc3RDaGlsZCk7Sy5zdHlsZS5kaXNwbGF5PSJub25lIn19KX07cmV0dXJuIEh9KCksCkQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBIKEspe3RoaXMuY29uZmlnPUs7aWYoIWlzRmluaXRlKEsubWluKSl0aHJvdyBFcnJvcigibWluIHZhbHVlICgiK0subWluKyIpIGlzIG5vdCBmaW5pdGUiKTtpZighaXNGaW5pdGUoSy5tYXgpKXRocm93IEVycm9yKCJtYXggdmFsdWUgKCIrSy5tYXgrIikgaXMgbm90IGZpbml0ZSIpO2lmKEsubWF4PEsubWluKXRocm93IEVycm9yKCJtYXggKCIrSy5tYXgrIikgaXMgXHgzYyBtaW4gKCIrSy5taW4rIikiKTt9SC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKEssTSl7aWYodGhpcy5jb25maWcubWluIT09dGhpcy5jb25maWcubWF4KXt2YXIgTD1LLmdldENvbnRleHQoIjJkIik7aWYobnVsbCE9TCl7Zm9yKHZhciBSPUsud2lkdGgvMTAwLFU9Sy5oZWlnaHQsWT0uNipVLGJhPTA7MTAwPmJhOysrYmEpe3ZhciBtYT1SKmJhLGFhPS4yKlUsY2E9anAodGhpcy5nZXRSR0IoYmEvMTAwKih0aGlzLmNvbmZpZy5tYXgtdGhpcy5jb25maWcubWluKSt0aGlzLmNvbmZpZy5taW4pLAozKSxmYT1jYVswXSxkYT1jYVsxXTtjYT1jYVsyXTtMLmJlZ2luUGF0aCgpO0wuZmlsbFN0eWxlPSJyZ2JhKCIrZmErIiwgIitkYSsiLCAiK2NhKyIsIDEpIjtMLmZpbGxSZWN0KG1hLGFhLFIsWSk7TC5zdHJva2UoKX1udWxsIT1NJiZNPj10aGlzLmNvbmZpZy5taW4mJk08PXRoaXMuY29uZmlnLm1heCYmKEs9KE0tdGhpcy5jb25maWcubWluKS8odGhpcy5jb25maWcubWF4LXRoaXMuY29uZmlnLm1pbikqSy53aWR0aCxMLmJlZ2luUGF0aCgpLEwuZmlsbFN0eWxlPSJyZ2JhKDAsIDAsIDAsIDEpIixMLm1vdmVUbyhLLC4yKlUpLEwubGluZVRvKEstNCwwKSxMLmxpbmVUbyhLKzQsMCksTC5maWxsKCksTC5iZWdpblBhdGgoKSxMLm1vdmVUbyhLLC44KlUpLEwubGluZVRvKEstNCxVKSxMLmxpbmVUbyhLKzQsVSksTC5maWxsKCkpfX19O3JldHVybiBIfSgpLEI9ZnVuY3Rpb24oSCl7ZnVuY3Rpb24gSygpe3JldHVybiBudWxsIT09SCYmSC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9CmhwKEssSCk7Sy5wcm90b3R5cGUuZ2V0UkdCPWZ1bmN0aW9uKE0pe2lmKGlzTmFOKE0pKXJldHVyblsyNTUsMCwwXTtpZighaXNGaW5pdGUoTSkpcmV0dXJuIDA8TT9bMCwwLDI1NV06WzI1NSwxMjcuNSwwXTtNPXRoaXMuY29uZmlnLm1pbj09PXRoaXMuY29uZmlnLm1heD8uNTooTS10aGlzLmNvbmZpZy5taW4pLyh0aGlzLmNvbmZpZy5tYXgtdGhpcy5jb25maWcubWluKTtNPU1hdGgubWF4KE1hdGgubWluKE0sMSksMCk7cmV0dXJuWzI1NSpNLDI1NSpNLDI1NSpNXX07cmV0dXJuIEt9KEQpO0Q9ZnVuY3Rpb24oSCl7ZnVuY3Rpb24gSygpe3JldHVybiBudWxsIT09SCYmSC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9aHAoSyxIKTtLLnByb3RvdHlwZS5nZXRSR0I9ZnVuY3Rpb24oTSl7aWYoaXNOYU4oTSkpcmV0dXJuWzYzLjc1LDYzLjc1LDYzLjc1XTtpZighaXNGaW5pdGUoTSkpcmV0dXJuIDA+TT9bMTI3LjUsMTI3LjUsMTI3LjVdOlsxOTEuMjUsMTkxLjI1LDE5MS4yNV07dmFyIEw9CjAsUj0wLFU9MDtNPXRoaXMuY29uZmlnLm1pbj09PXRoaXMuY29uZmlnLm1heD8uNTooTS10aGlzLmNvbmZpZy5taW4pLyh0aGlzLmNvbmZpZy5tYXgtdGhpcy5jb25maWcubWluKTtNPU1hdGgubWF4KE1hdGgubWluKE0sMSksMCk7LjM1Pj1NPyhSPU0vLjM1LFU9MSk6LjM1PE0mJi42NT49TT8oTD0oTS0uMzUpLyguNjUtLjM1KSxSPTEsVT0oLjY1LU0pLyguNjUtLjM1KSk6LjY1PE0mJihMPTEsUj0oMS1NKS8uMzUpO3JldHVyblsyNTUqTCwyNTUqUiwyNTUqVV19O3JldHVybiBLfShEKTt2YXIgSTsoZnVuY3Rpb24oSCl7SFtILlRFWFQ9MV09IlRFWFQiO0hbSC5JTUFHRT0yXT0iSU1BR0UifSkoSXx8KEk9e30pKTt2YXIgTz17R3JheXNjYWxlOkIsSmV0OkR9LFA9ZnVuY3Rpb24oKXtmdW5jdGlvbiBIKEssTSxMKXt0aGlzLnJvb3RFbGVtZW50PUs7dGhpcy50ZW5zb3JWaWV3PU07dGhpcy5iYXNlUnVsZXJUaWNrPXRoaXMudG9wUnVsZXI9dGhpcy52YWx1ZVNlY3Rpb249dGhpcy5zbGljaW5nU3BlY1Jvb3Q9CnRoaXMubWVudVRodW1iPXRoaXMuaW5mb1N1YnNlY3Rpb249dGhpcy5oZWFkZXJTZWN0aW9uPW51bGw7dGhpcy50b3BSdWxlclRpY2tzPVtdO3RoaXMubGVmdFJ1bGVyVGlja3M9W107dGhpcy52YWx1ZVJvd3M9W107dGhpcy52YWx1ZURpdnM9W107dGhpcy5zbGljaW5nQ29udHJvbD10aGlzLnZhbHVlVG9vbHRpcD1udWxsO3RoaXMuY29sc0N1dG9mZj10aGlzLnJvd3NDdXRvZmY9ITE7dGhpcy5tZW51PXRoaXMubWVudUNvbmZpZz10aGlzLnNlbGVjdGlvbj1udWxsO3RoaXMuY29sb3JNYXBOYW1lPSJHcmF5c2NhbGUiO3RoaXMuY29sb3JNYXA9bnVsbDt0aGlzLnNob3dJbmRpY2VzT25UaWNrcz0hMTt0aGlzLmltYWdlQ2VsbFNpemU9MTY7dGhpcy5taW5JbWFnZUNlbGxTaXplPTQ7dGhpcy5tYXhJbWFnZUNlbGxTaXplPTQwO3RoaXMuem9vbVN0ZXBSYXRpbz0xLjI7dGhpcy5udW1lcmljU3VtbWFyeT1udWxsO3RoaXMub3B0aW9ucz1MfHx7fTt0aGlzLnNsaWNpbmdTcGVjPW4odGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGUpOwp0aGlzLnJhbms9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGUubGVuZ3RoO3RoaXMudmFsdWVSZW5kZXJNb2RlPUkuVEVYVH1ILnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gYSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gaXAodGhpcyxmdW5jdGlvbihLKXtzd2l0Y2goSy5sYWJlbCl7Y2FzZSAwOnRoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldCIpO3RoaXMucmVuZGVySGVhZGVyKCk7aWYoIShjKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKXx8ZCh0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSl8fGYodGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUpfHxnKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKSkpdGhyb3cgRXJyb3IoIlJlbmRlcmluZyBkdHlwZSAiK3RoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKyIgaXMgbm90IHN1cHBvcnRlZCB5ZXQuIik7cmV0dXJuWzQsdGhpcy5yZW5kZXJWYWx1ZXMoKV07CmNhc2UgMTpyZXR1cm4gSy5zZW50KCksWzJdfX0pfSl9O0gucHJvdG90eXBlLnJlbmRlckhlYWRlcj1mdW5jdGlvbigpe251bGw9PXRoaXMuaGVhZGVyU2VjdGlvbiYmKHRoaXMuaGVhZGVyU2VjdGlvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmhlYWRlclNlY3Rpb24uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1oZWFkZXIiKSx0aGlzLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaGVhZGVyU2VjdGlvbiksdGhpcy5jcmVhdGVNZW51KCkpO3RoaXMucmVuZGVySW5mbygpfTtILnByb3RvdHlwZS5yZW5kZXJJbmZvPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuaGVhZGVyU2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIHRlbnNvciBpbmZvIGZhaWxlZCBkdWUgdG8gbWlzaW5nIGhlYWRlciBzZWN0aW9uIik7bnVsbD09dGhpcy5pbmZvU3Vic2VjdGlvbiYmKHRoaXMuaW5mb1N1YnNlY3Rpb249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksCnRoaXMuaW5mb1N1YnNlY3Rpb24uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1pbmZvIiksdGhpcy5oZWFkZXJTZWN0aW9uLmFwcGVuZENoaWxkKHRoaXMuaW5mb1N1YnNlY3Rpb24pKTtmb3IoO3RoaXMuaW5mb1N1YnNlY3Rpb24uZmlyc3RDaGlsZDspdGhpcy5pbmZvU3Vic2VjdGlvbi5yZW1vdmVDaGlsZCh0aGlzLmluZm9TdWJzZWN0aW9uLmZpcnN0Q2hpbGQpO3RoaXMucmVuZGVyTmFtZSgpO3RoaXMucmVuZGVyRFR5cGUoKTt0aGlzLnJlbmRlclNoYXBlKCl9O0gucHJvdG90eXBlLnJlbmRlck5hbWU9ZnVuY3Rpb24oKXtpZihudWxsPT10aGlzLmluZm9TdWJzZWN0aW9uKXRocm93IEVycm9yKCJSZW5kZXJpbmcgdGVuc29yIG5hbWUgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIGluZm8gc3Vic2VjdGlvbi4iKTtpZihudWxsIT10aGlzLm9wdGlvbnMubmFtZSYmMCE9PXRoaXMub3B0aW9ucy5uYW1lLmxlbmd0aCl7dmFyIEs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Sy5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXRlbnNvci1uYW1lIik7CksudGV4dENvbnRlbnQ9cSh0aGlzLm9wdGlvbnMubmFtZSk7Sy50aXRsZT10aGlzLm9wdGlvbnMubmFtZTt0aGlzLmluZm9TdWJzZWN0aW9uLmFwcGVuZENoaWxkKEspfX07SC5wcm90b3R5cGUucmVuZGVyRFR5cGU9ZnVuY3Rpb24oKXtpZihudWxsPT10aGlzLmluZm9TdWJzZWN0aW9uKXRocm93IEVycm9yKCJSZW5kZXJpbmcgdGVuc29yIGR0eXBlIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBpbmZvIHN1YnNlY3Rpb24uIik7dmFyIEs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Sy5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWR0eXBlIik7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO00uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kdHlwZS1sYWJlbCIpO00udGV4dENvbnRlbnQ9ImR0eXBlOiI7Sy5hcHBlbmRDaGlsZChNKTtNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtNLnRleHRDb250ZW50PXRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlOwpLLmFwcGVuZENoaWxkKE0pO3RoaXMuaW5mb1N1YnNlY3Rpb24uYXBwZW5kQ2hpbGQoSyl9O0gucHJvdG90eXBlLnJlbmRlclNoYXBlPWZ1bmN0aW9uKCl7aWYobnVsbD09dGhpcy5pbmZvU3Vic2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIHRlbnNvciBzaGFwZSBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgaW5mbyBzdWJzZWN0aW9uLiIpO3ZhciBLPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0suY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1zaGFwZSIpO3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO00uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1zaGFwZS1sYWJlbCIpO00udGV4dENvbnRlbnQ9InNoYXBlOiI7Sy5hcHBlbmRDaGlsZChNKTtNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO00uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1zaGFwZS12YWx1ZSIpO00udGV4dENvbnRlbnQ9ayh0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZSk7CksuYXBwZW5kQ2hpbGQoTSk7dGhpcy5pbmZvU3Vic2VjdGlvbi5hcHBlbmRDaGlsZChLKX07SC5wcm90b3R5cGUuY3JlYXRlTWVudT1mdW5jdGlvbigpe3ZhciBLPXRoaXM7dGhpcy5tZW51Q29uZmlnPXtpdGVtczpbXX07aWYoZCh0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSl8fGModGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUpfHxmKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKSl0aGlzLm1lbnVDb25maWcuaXRlbXMucHVzaCh7Y2FwdGlvbjoiU2VsZWN0IGRpc3BsYXkgbW9kZS4uLiIsb3B0aW9uczpbIlRleHQiLCJJbWFnZSJdLGRlZmF1bHRTZWxlY3Rpb246MCxjYWxsYmFjazpmdW5jdGlvbihNKXswPT09TT8oSy52YWx1ZVJlbmRlck1vZGU9SS5URVhULEsucmVuZGVyVmFsdWVzKCkpOihLLnZhbHVlUmVuZGVyTW9kZT1JLklNQUdFLEsudGVuc29yVmlldy5nZXROdW1lcmljU3VtbWFyeSgpLnRoZW4oZnVuY3Rpb24oTCl7Sy5udW1lcmljU3VtbWFyeT1MO0sucmVuZGVyVmFsdWVzKCl9KSl9fSksCnRoaXMubWVudUNvbmZpZy5pdGVtcy5wdXNoKHtjYXB0aW9uOiJTZWxlY3QgY29sb3IgbWFwLi4uIixvcHRpb25zOk9iamVjdC5rZXlzKE8pLGRlZmF1bHRTZWxlY3Rpb246MCxjYWxsYmFjazpmdW5jdGlvbihNKXtLLmNvbG9yTWFwTmFtZT1PYmplY3Qua2V5cyhPKVtNXTtLLnJlbmRlclZhbHVlcygpfSxpc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gSy52YWx1ZVJlbmRlck1vZGU9PT1JLklNQUdFfX0pLHRoaXMubWVudUNvbmZpZy5pdGVtcy5wdXNoKHtjYXB0aW9uOiJab29tIGluIChJbWFnZSBtb2RlKSIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtLLnpvb21Jbk9uZVN0ZXBBbmRSZW5kZXJWYWx1ZXMoKX0saXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIEsudmFsdWVSZW5kZXJNb2RlPT09SS5JTUFHRX19KSx0aGlzLm1lbnVDb25maWcuaXRlbXMucHVzaCh7Y2FwdGlvbjoiWm9vbSBvdXQgKEltYWdlIG1vZGUpIixjYWxsYmFjazpmdW5jdGlvbigpe0suem9vbU91dE9uZVN0ZXBBbmRSZW5kZXJWYWx1ZXMoKX0sCmlzRW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiBLLnZhbHVlUmVuZGVyTW9kZT09PUkuSU1BR0V9fSk7bnVsbCE9PXRoaXMubWVudUNvbmZpZyYmMDx0aGlzLm1lbnVDb25maWcuaXRlbXMubGVuZ3RoJiYodGhpcy5tZW51PW5ldyB6KHRoaXMubWVudUNvbmZpZyx0aGlzLmhlYWRlclNlY3Rpb24pLHRoaXMucmVuZGVyTWVudVRodW1iKCkpfTtILnByb3RvdHlwZS56b29tSW5PbmVTdGVwQW5kUmVuZGVyVmFsdWVzPWZ1bmN0aW9uKCl7dGhpcy5pbWFnZUNlbGxTaXplKnRoaXMuem9vbVN0ZXBSYXRpbzw9dGhpcy5tYXhJbWFnZUNlbGxTaXplJiYodGhpcy5pbWFnZUNlbGxTaXplKj10aGlzLnpvb21TdGVwUmF0aW8sdGhpcy5yZW5kZXJWYWx1ZXMoKSl9O0gucHJvdG90eXBlLnpvb21PdXRPbmVTdGVwQW5kUmVuZGVyVmFsdWVzPWZ1bmN0aW9uKCl7dGhpcy5pbWFnZUNlbGxTaXplL3RoaXMuem9vbVN0ZXBSYXRpbz49dGhpcy5taW5JbWFnZUNlbGxTaXplJiYodGhpcy5pbWFnZUNlbGxTaXplLz0KdGhpcy56b29tU3RlcFJhdGlvLHRoaXMucmVuZGVyVmFsdWVzKCkpfTtILnByb3RvdHlwZS5yZW5kZXJNZW51VGh1bWI9ZnVuY3Rpb24oKXt2YXIgSz10aGlzO2lmKG51bGw9PXRoaXMuaGVhZGVyU2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIG1lbnUgdGh1bWIgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIGhlYWRlciBzZWN0aW9uLiIpO3RoaXMubWVudVRodW1iPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMubWVudVRodW1iLnRleHRDb250ZW50PSJcdTIyZWUiO3RoaXMubWVudVRodW1iLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtbWVudS10aHVtYiIpO3RoaXMuaGVhZGVyU2VjdGlvbi5hcHBlbmRDaGlsZCh0aGlzLm1lbnVUaHVtYik7dGhpcy5tZW51VGh1bWIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7aWYobnVsbCE9PUsubWVudSlpZihLLm1lbnUuc2hvd24oKSlLLm1lbnUuaGlkZSgpO2Vsc2V7dmFyIE09Sy5tZW51VGh1bWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CksubWVudS5zaG93KE0uYm90dG9tLE0ubGVmdCl9fSl9O0gucHJvdG90eXBlLnJlbmRlclZhbHVlcz1mdW5jdGlvbigpe3JldHVybiBhKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBLPXRoaXM7cmV0dXJuIGlwKHRoaXMsZnVuY3Rpb24oTSl7c3dpdGNoKE0ubGFiZWwpe2Nhc2UgMDpyZXR1cm4gMjx0aGlzLnJhbmsmJm51bGw9PT10aGlzLnNsaWNpbmdTcGVjUm9vdCYmKHRoaXMuc2xpY2luZ1NwZWNSb290PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuc2xpY2luZ1NwZWNSb290LmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtc2xpY2luZy1ncm91cCIpLHRoaXMucm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zbGljaW5nU3BlY1Jvb3QpKSxudWxsPT10aGlzLnZhbHVlU2VjdGlvbiYmKHRoaXMudmFsdWVTZWN0aW9uPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMudmFsdWVTZWN0aW9uLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtc2VjdGlvbiIpLAp0aGlzLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudmFsdWVTZWN0aW9uKSx0aGlzLnZhbHVlU2VjdGlvbi5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsZnVuY3Rpb24oTCl7cmV0dXJuIGEoSyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIFI7cmV0dXJuIGlwKHRoaXMsZnVuY3Rpb24oVSl7c3dpdGNoKFUubGFiZWwpe2Nhc2UgMDpSPSExO251bGw9PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXl8fCJjdHJsIj09PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXk/Uj1MLmN0cmxLZXk6ImFsdCI9PT10aGlzLm9wdGlvbnMud2hlZWxab29tS2V5P1I9TC5hbHRLZXk6InNoaWZ0Ij09PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXkmJihSPUwuc2hpZnRLZXkpO2lmKFImJnRoaXMudmFsdWVSZW5kZXJNb2RlPT09SS5JTUFHRSlyZXR1cm4gTC5zdG9wUHJvcGFnYXRpb24oKSxMLnByZXZlbnREZWZhdWx0KCksMDxMLmRlbHRhWT90aGlzLnpvb21PdXRPbmVTdGVwQW5kUmVuZGVyVmFsdWVzKCk6CnRoaXMuem9vbUluT25lU3RlcEFuZFJlbmRlclZhbHVlcygpLFsyXTtpZihudWxsPT10aGlzLnNlbGVjdGlvbilyZXR1cm5bMl07TC5zdG9wUHJvcGFnYXRpb24oKTtMLnByZXZlbnREZWZhdWx0KCk7dGhpcy5oaWRlVmFsdWVUb29sdGlwKCk7cmV0dXJuWzQsdGhpcy5zY3JvbGxVcE9yRG93bigwPEwuZGVsdGFZP3guRE9XTjp4LlVQKV07Y2FzZSAxOnJldHVybiBVLnNlbnQoKSxbMl19fSl9KX0pLHRoaXMudmFsdWVTZWN0aW9uLnRhYkluZGV4PTEwMjQsdGhpcy52YWx1ZVNlY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oTCl7dmFyIFI9WzM4LDQwLDM3LDM5XTtpZihudWxsIT1LLnNlbGVjdGlvbiYmLTEhPT1SLmluZGV4T2YoTC5rZXlDb2RlKSl7TC5zdG9wUHJvcGFnYXRpb24oKTtMLnByZXZlbnREZWZhdWx0KCk7Sy5oaWRlVmFsdWVUb29sdGlwKCk7dmFyIFU9Uj1udWxsOzM4PT09TC5rZXlDb2RlP1U9eC5VUDo0MD09PUwua2V5Q29kZT9VPXguRE9XTjoKMzc9PT1MLmtleUNvZGU/VT14LkxFRlQ6Mzk9PT1MLmtleUNvZGUmJihVPXguUklHSFQpO251bGwhPT1VJiYoUj1LLnNlbGVjdGlvbi5tb3ZlKFUsSy5zbGljaW5nU3BlYykpO251bGw9PT1SP0sucmVuZGVyU2VsZWN0aW9uKCk6Uj09PXguVVB8fFI9PT14LkRPV04/Sy5zY3JvbGxVcE9yRG93bihSKTooUj09PXguTEVGVHx8Uj09PXguUklHSFQpJiZLLnNjcm9sbExlZnRPclJpZ2h0KFIpfX0pKSx0aGlzLmNsZWFyVmFsdWVTZWN0aW9uKCksdGhpcy5jcmVhdGVUb3BSdWxlcigpLHRoaXMuY3JlYXRlTGVmdFJ1bGVyKCksdGhpcy5jcmVhdGVWYWx1ZURpdnMoKSxbNCx0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpXTtjYXNlIDE6cmV0dXJuIE0uc2VudCgpLDI8dGhpcy5yYW5rJiYodGhpcy5zbGljaW5nQ29udHJvbD1uZXcgRih0aGlzLnNsaWNpbmdTcGVjUm9vdCx0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZSxmdW5jdGlvbihMKXtyZXR1cm4gYShLLHZvaWQgMCx2b2lkIDAsCmZ1bmN0aW9uKCl7cmV0dXJuIGlwKHRoaXMsZnVuY3Rpb24oUil7c3dpdGNoKFIubGFiZWwpe2Nhc2UgMDppZihwKHRoaXMuc2xpY2luZ1NwZWMsTCkpcmV0dXJuWzMsMl07dGhpcy5zbGljaW5nU3BlYz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEwpKTtyZXR1cm5bNCx0aGlzLnJlbmRlcigpXTtjYXNlIDE6cmV0dXJuIFIuc2VudCgpLFszLDRdO2Nhc2UgMjpyZXR1cm4gdGhpcy5zbGljaW5nU3BlYz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEwpKSxbNCx0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpXTtjYXNlIDM6Ui5zZW50KCksUi5sYWJlbD00O2Nhc2UgNDpyZXR1cm5bMl19fSl9KX0pLHRoaXMuc2xpY2luZ0NvbnRyb2wucmVuZGVyKHRoaXMuc2xpY2luZ1NwZWMpKSxbMl19fSl9KX07SC5wcm90b3R5cGUuY2xlYXJWYWx1ZVNlY3Rpb249ZnVuY3Rpb24oKXtpZihudWxsIT09dGhpcy52YWx1ZVNlY3Rpb24pe2Zvcig7dGhpcy52YWx1ZVNlY3Rpb24uZmlyc3RDaGlsZDspdGhpcy52YWx1ZVNlY3Rpb24ucmVtb3ZlQ2hpbGQodGhpcy52YWx1ZVNlY3Rpb24uZmlyc3RDaGlsZCk7CnRoaXMudG9wUnVsZXI9bnVsbDt0aGlzLnZhbHVlUm93cz1bXX19O0gucHJvdG90eXBlLmNyZWF0ZVRvcFJ1bGVyPWZ1bmN0aW9uKCl7dmFyIEs9dGhpcztpZihudWxsPT09dGhpcy52YWx1ZVNlY3Rpb24pdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgdG9wIHJ1bGVyIGR1ZSB0byBtaXNzaW5nIHZhbHVlIHNlY3Rpb24uIik7bnVsbD09dGhpcy50b3BSdWxlciYmKHRoaXMudG9wUnVsZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy50b3BSdWxlci5jbGFzc0xpc3QuYWRkKCJ0ZW5lc29yLXdpZGdldC10b3AtcnVsZXIiKSx0aGlzLnRvcFJ1bGVyLnN0eWxlLndoaXRlU3BhY2U9Im5vd3JhcCIsdGhpcy52YWx1ZVNlY3Rpb24uYXBwZW5kQ2hpbGQodGhpcy50b3BSdWxlciksdGhpcy50b3BSdWxlclRpY2tzPVtdLHRoaXMudG9wUnVsZXIuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLGZ1bmN0aW9uKFkpe3JldHVybiBhKEssdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBpcCh0aGlzLApmdW5jdGlvbihiYSl7c3dpdGNoKGJhLmxhYmVsKXtjYXNlIDA6aWYobnVsbD09dGhpcy5zZWxlY3Rpb24pcmV0dXJuWzJdO1kuc3RvcFByb3BhZ2F0aW9uKCk7WS5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuaGlkZVZhbHVlVG9vbHRpcCgpO3JldHVybls0LHRoaXMuc2Nyb2xsTGVmdE9yUmlnaHQoMDxZLmRlbHRhWT94LlJJR0hUOnguTEVGVCldO2Nhc2UgMTpyZXR1cm4gYmEuc2VudCgpLFsyXX19KX0pfSkpO2Zvcig7dGhpcy50b3BSdWxlci5maXJzdENoaWxkOyl0aGlzLnRvcFJ1bGVyLnJlbW92ZUNoaWxkKHRoaXMudG9wUnVsZXIuZmlyc3RDaGlsZCk7dGhpcy5iYXNlUnVsZXJUaWNrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuYmFzZVJ1bGVyVGljay5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXRvcC1ydWxlci10aWNrIik7dGhpcy50b3BSdWxlci5hcHBlbmRDaGlsZCh0aGlzLmJhc2VSdWxlclRpY2spOzI8PXRoaXMucmFuayYmKHRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlPQpbMCxudWxsXSk7dmFyIE09MT49dGhpcy5yYW5rPzE6dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV07dmFyIEw9dGhpcy5yb290RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodDt0aGlzLmNvbHNDdXRvZmY9ITE7Zm9yKHZhciBSPTA7UjxNOysrUil7dmFyIFU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7VS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXRvcC1ydWxlci10aWNrIik7dGhpcy52YWx1ZVJlbmRlck1vZGU9PT1JLklNQUdFJiYoVS5zdHlsZS53aWR0aD10aGlzLmltYWdlQ2VsbFNpemUrInB4Iik7dGhpcy50b3BSdWxlci5hcHBlbmRDaGlsZChVKTt0aGlzLnRvcFJ1bGVyVGlja3MucHVzaChVKTtpZihVLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0Pj1MKXtpZigyPD10aGlzLnJhbmspe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyBob3Jpem9udGFsIHJhbmdlIGZvciAiKwp0aGlzLnJhbmsrIkQgdGVuc29yLiIpO3RoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdPVIrMTt0aGlzLmNvbHNDdXRvZmY9ITB9YnJlYWt9fWlmKCF0aGlzLmNvbHNDdXRvZmYmJjI8PXRoaXMucmFuayl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIGhvcml6b250YWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVsxXT1NfX07SC5wcm90b3R5cGUuY3JlYXRlTGVmdFJ1bGVyPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMudmFsdWVTZWN0aW9uKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGxlZnQgcnVsZXIgZHVlIHRvIG1pc3NpbmcgdmFsdWUgc2VjdGlvbi4iKTt0aGlzLnZhbHVlUm93cz1bXTt0aGlzLmxlZnRSdWxlclRpY2tzPVtdOzE8PXRoaXMucmFuayYmKHRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZT0KWzAsbnVsbF0pO3ZhciBLPTA9PT10aGlzLnJhbms/MTp0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXTt0aGlzLnJvd3NDdXRvZmY9ITE7Zm9yKHZhciBNPXRoaXMucm9vdEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tLEw9MDtMPEs7KytMKXt2YXIgUj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtSLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtcm93Iik7dGhpcy52YWx1ZVJlbmRlck1vZGU9PT1JLklNQUdFJiYoUi5zdHlsZS5oZWlnaHQ9dGhpcy5pbWFnZUNlbGxTaXplKyJweCIsUi5zdHlsZS5saW5lSGVpZ2h0PXRoaXMuaW1hZ2VDZWxsU2l6ZSsicHgiKTt0aGlzLnZhbHVlU2VjdGlvbi5hcHBlbmRDaGlsZChSKTt0aGlzLnZhbHVlUm93cy5wdXNoKFIpO3ZhciBVPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO1UuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC10b3AtcnVsZXItdGljayIpOwp0aGlzLnZhbHVlUmVuZGVyTW9kZT09PUkuSU1BR0UmJihVLnN0eWxlLmhlaWdodD10aGlzLmltYWdlQ2VsbFNpemUrInB4IixVLnN0eWxlLmxpbmVIZWlnaHQ9dGhpcy5pbWFnZUNlbGxTaXplKyJweCIpO1IuYXBwZW5kQ2hpbGQoVSk7dGhpcy5sZWZ0UnVsZXJUaWNrcy5wdXNoKFUpO2lmKFUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tPj1NKXtpZigxPD10aGlzLnJhbmspe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgdmVydGljYWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV09TCsxO3RoaXMucm93c0N1dG9mZj0hMH1icmVha319aWYoIXRoaXMucm93c0N1dG9mZiYmMTw9dGhpcy5yYW5rKXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIHZlcnRpY2FsIHJhbmdlIGZvciAiKwp0aGlzLnJhbmsrIkQgdGVuc29yLiIpO3RoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVsxXT1LfX07SC5wcm90b3R5cGUuY3JlYXRlVmFsdWVEaXZzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSyhiYSl7ZnVuY3Rpb24gbWEoY2Epe3ZhciBmYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtmYS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdiIpO1UudmFsdWVSZW5kZXJNb2RlPT09SS5JTUFHRSYmKGZhLnN0eWxlLndpZHRoPVUuaW1hZ2VDZWxsU2l6ZSsicHgiLGZhLnN0eWxlLmhlaWdodD1VLmltYWdlQ2VsbFNpemUrInB4IixmYS5zdHlsZS5saW5lSGVpZ2h0PVUuaW1hZ2VDZWxsU2l6ZSsicHgiKTtVLnZhbHVlUm93c1tiYV0uYXBwZW5kQ2hpbGQoZmEpO1UudmFsdWVEaXZzW2JhXS5wdXNoKGZhKTtmYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtNLnNlbGVjdGlvbj1uZXcgQyhNLnRlbnNvclZpZXcuc3BlYy5zaGFwZSxNLnNsaWNpbmdTcGVjLApudWxsPT1NLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2V8fG51bGw9PU0uc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXT8wOk0uc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXStiYSxudWxsPT1NLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZXx8bnVsbD09TS5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF0/MDpNLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXStjYSwxLDEpO00ucmVuZGVyU2VsZWN0aW9uKCl9KTtmYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixmdW5jdGlvbigpe3ZhciBkYT1mYS5nZXRBdHRyaWJ1dGUoImRldGFpbGVkLXZhbHVlIik7aWYobnVsbCE9PWRhKXt2YXIgbGE9TS5yb290RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxaPWZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLEZhPVouYm90dG9tLVoudG9wLHhhPVoucmlnaHQtWi5sZWZ0LHlhPU0uY2FsY3VsYXRlSW5kaWNlcyhiYSxjYSk7TS5kcmF3VmFsdWVUb29sdGlwKHlhLApkYSxaLnRvcC1sYS50b3ArLjgqRmEsWi5sZWZ0LWxhLmxlZnQrLjc1KnhhKX19KTtmYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe00uaGlkZVZhbHVlVG9vbHRpcCgpfSl9VS52YWx1ZURpdnNbYmFdPVtdO2Zvcih2YXIgYWE9MDthYTxMOysrYWEpbWEoYWEpfXZhciBNPXRoaXM7aWYobnVsbD09PXRoaXMudmFsdWVSb3dzKXRocm93IEVycm9yKCJWYWx1ZSByb3dzIGFyZSB1bmV4cGVjdGVkbHkgdW5pbml0aWFsaXplZC4iKTt0aGlzLnZhbHVlRGl2cz1bXTtmb3IodmFyIEw9dGhpcy50b3BSdWxlclRpY2tzLmxlbmd0aCxSPXRoaXMudmFsdWVSb3dzLmxlbmd0aCxVPXRoaXMsWT0wO1k8UjsrK1kpSyhZKX07SC5wcm90b3R5cGUucmVuZGVyVG9wUnVsZXI9ZnVuY3Rpb24oKXtpZigyPD10aGlzLnJhbmspZm9yKHZhciBLPXRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV1dLE09MDtNPHRoaXMudG9wUnVsZXJUaWNrcy5sZW5ndGg7KytNKXtpZihudWxsPT09CnRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIGhvcml6b250YWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt2YXIgTD10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXStNO3RoaXMuc2hvd0luZGljZXNPblRpY2tzJiYodGhpcy50b3BSdWxlclRpY2tzW01dLnRleHRDb250ZW50PUw8Sz8iIitMOiIiKX19O0gucHJvdG90eXBlLnJlbmRlckxlZnRSdWxlcj1mdW5jdGlvbigpe2lmKDE8PXRoaXMucmFuaylmb3IodmFyIEs9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXV0sTT0wO008dGhpcy5sZWZ0UnVsZXJUaWNrcy5sZW5ndGg7KytNKXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIHZlcnRjaWFsIHJhbmdlIGZvciAiK3RoaXMucmFuaysiRCB0ZW5zb3IuIik7dmFyIEw9dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdKwpNO3RoaXMuc2hvd0luZGljZXNPblRpY2tzJiYodGhpcy5sZWZ0UnVsZXJUaWNrc1tNXS50ZXh0Q29udGVudD1MPEs/IiIrTDoiIil9fTtILnByb3RvdHlwZS5yZW5kZXJWYWx1ZURpdnM9ZnVuY3Rpb24oKXtyZXR1cm4gYSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgSyxNLEwsUixVLFksYmEsbWEsYWEsY2EsZmEsZGEsbGEsWixGYSx4YSx5YTtyZXR1cm4gaXAodGhpcyxmdW5jdGlvbihCYSl7c3dpdGNoKEJhLmxhYmVsKXtjYXNlIDA6cmV0dXJuIEs9dGhpcy52YWx1ZURpdnMubGVuZ3RoLE09dGhpcy52YWx1ZURpdnNbMF0ubGVuZ3RoLFs0LHRoaXMudGVuc29yVmlldy52aWV3KHRoaXMuc2xpY2luZ1NwZWMpXTtjYXNlIDE6TD1CYS5zZW50KCk7MD09PXRoaXMucmFuaz9MPVtbTF1dOjE9PT10aGlzLnJhbmsmJihMPUwubWFwKGZ1bmN0aW9uKEdhKXtyZXR1cm5bR2FdfSkpO1I9dGhpcy5nZXRWYWx1ZUNsYXNzKCk7VT10aGlzLnZhbHVlUmVuZGVyTW9kZTtpZihVPT09CkkuSU1BR0Upe2lmKG51bGw9PXRoaXMubnVtZXJpY1N1bW1hcnkpdGhyb3cgRXJyb3IoIkZhaWxlZCB0byByZW5kZXIgaW1hZ2UgcmVwcmVzZW50YXRpb24gb2YgdGVuc29yIGR1ZSB0byBtaXNzaW5nIG51bWVyaWMgc3VtbWFyeSIpO1k9dGhpcy5udW1lcmljU3VtbWFyeTtiYT1ZLm1pbmltdW07bWE9WS5tYXhpbXVtO2lmKG51bGw9PWJhfHxudWxsPT1tYSl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIHJlbmRlciBpbWFnZSByZXByZXNlbnRhdGlvbiBvZiB0ZW5zb3IgZHVlIHRvIG1pc3NpbmcgbWluaW11bSBvciBtYXhpbXVtIHZhbHVlcyBpbiBudW1lcmljIHN1bW1hcnkiKTthYT17bWluOmJhLG1heDptYX07dGhpcy5jb2xvck1hcD10aGlzLmNvbG9yTWFwTmFtZSBpbiBPP25ldyBPW3RoaXMuY29sb3JNYXBOYW1lXShhYSk6bmV3IEIoYWEpfWZvcihjYT0wO2NhPEs7KytjYSlmb3IoZmE9MDtmYTxNOysrZmEpZGE9dGhpcy52YWx1ZURpdnNbY2FdW2ZhXSxjYTxMLmxlbmd0aCYmZmE8TFtjYV0ubGVuZ3RoPwoobGE9TFtjYV1bZmFdLFU9PT1JLklNQUdFPyhaPWpwKHRoaXMuY29sb3JNYXAuZ2V0UkdCKGxhKSwzKSxGYT1aWzBdLHhhPVpbMV0seWE9WlsyXSxkYS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9InJnYigiK0ZhKyIsICIreGErIiwgIit5YSsiKSIpOiJudW1lcmljIj09PVI/ZGEudGV4dENvbnRlbnQ9cihsYSxjKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKSk6ImJvb2xlYW4iPT09Uj9kYS50ZXh0Q29udGVudD10KGxhKToic3RyaW5nIj09PVImJihkYS50ZXh0Q29udGVudD12KGxhKSksZGEuc2V0QXR0cmlidXRlKCJkZXRhaWxlZC12YWx1ZSIsdGhpcy5nZXREZXRhaWxlZFZhbHVlVG9vbHRpcFN0cmluZyhsYSkpKTooZGEudGV4dENvbnRlbnQ9IiIsZGEuc2V0QXR0cmlidXRlKCJkZXRhaWxlZC12YWx1ZSIsIiIpKTt0aGlzLnJlbmRlclNlbGVjdGlvbigpO3JldHVyblsyXX19KX0pfTtILnByb3RvdHlwZS5nZXREZXRhaWxlZFZhbHVlVG9vbHRpcFN0cmluZz1mdW5jdGlvbihLKXtyZXR1cm4iYm9vbGVhbiI9PT0KdGhpcy5nZXRWYWx1ZUNsYXNzKCk/dChLLCExKToic3RyaW5nIj09PXRoaXMuZ2V0VmFsdWVDbGFzcygpPyJMZW5ndGgtIitLLmxlbmd0aCsnIHN0cmluZzogIicrdihLLDUwMCkrJyInOlN0cmluZyhLKX07SC5wcm90b3R5cGUucmVuZGVyU2VsZWN0aW9uPWZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5zZWxlY3Rpb24pZm9yKHZhciBLPXRoaXMudmFsdWVEaXZzLmxlbmd0aCxNPXRoaXMudmFsdWVEaXZzWzBdLmxlbmd0aCxMPTA7TDxLOysrTClmb3IodmFyIFI9MDtSPE07KytSKXt2YXIgVT10aGlzLnZhbHVlRGl2c1tMXVtSXTtVLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbiIpO1UuY2xhc3NMaXN0LnJlbW92ZSgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXRvcCIpO1UuY2xhc3NMaXN0LnJlbW92ZSgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWJvdHRvbSIpO1UuY2xhc3NMaXN0LnJlbW92ZSgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWxlZnQiKTsKVS5jbGFzc0xpc3QucmVtb3ZlKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tcmlnaHQiKTt2YXIgWT10aGlzLmNhbGN1bGF0ZUluZGljZXMoTCxSKTtZPXRoaXMuc2VsZWN0aW9uLmdldEVsZW1lbnRTdGF0dXMoWSk7bnVsbCE9PVkmJihVLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbiIpLFkudG9wRWRnZSYmVS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tdG9wIiksWS5ib3R0b21FZGdlJiZVLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1ib3R0b20iKSxZLmxlZnRFZGdlJiZVLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1sZWZ0IiksWS5yaWdodEVkZ2UmJlUuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXJpZ2h0IikpfX07SC5wcm90b3R5cGUuY2FsY3VsYXRlSW5kaWNlcz0KZnVuY3Rpb24oSyxNKXtmb3IodmFyIEw9W10sUj10aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZnVuY3Rpb24obWEpe3JldHVybiBtYS5kaW19KSxVPXRoaXMuc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLm1hcChmdW5jdGlvbihtYSl7cmV0dXJuIG1hLmluZGV4fSksWT0wO1k8dGhpcy5yYW5rOysrWSlpZigtMSE9PVIuaW5kZXhPZihZKSl7dmFyIGJhPVVbUi5pbmRleE9mKFkpXTtpZihudWxsPT09YmEpdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjYWxjdWxhdGUgaW5kaWNlczogVW5kZXRlcm1pbmVkIGluZGV4IGF0IGRpbWVuc2lvbiAiK1kpO0wucHVzaChiYSl9ZWxzZSBpZihZPT09dGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXSl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZXx8bnVsbD09PXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXSl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGNhbGN1bGF0ZSBpbmRpY2VzIGR1ZSB0byB1bmRlcnRlcm1pbmVkIHZlcnRpY2FsIHJhbmdlLiIpOwpMLnB1c2godGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdK0spfWVsc2UgaWYoWT09PXRoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV0pe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZXx8bnVsbD09PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY2FsY3VsYXRlIGluZGljZXMgZHVlIHRvIHVuZGVydGVybWluZWQgdmVydGljYWwgcmFuZ2UuIik7TC5wdXNoKHRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdK00pfXJldHVybiBMfTtILnByb3RvdHlwZS5kcmF3VmFsdWVUb29sdGlwPWZ1bmN0aW9uKEssTSxMLFIpe251bGw9PT10aGlzLnZhbHVlVG9vbHRpcCYmKHRoaXMudmFsdWVUb29sdGlwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMudmFsdWVUb29sdGlwLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcCIpLHRoaXMucm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy52YWx1ZVRvb2x0aXApKTsKZm9yKDt0aGlzLnZhbHVlVG9vbHRpcC5maXJzdENoaWxkOyl0aGlzLnZhbHVlVG9vbHRpcC5yZW1vdmVDaGlsZCh0aGlzLnZhbHVlVG9vbHRpcC5maXJzdENoaWxkKTt2YXIgVT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtVLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC1pbmRpY2VzIik7VS50ZXh0Q29udGVudD0iSW5kaWNlczogIitKU09OLnN0cmluZ2lmeShLKTt0aGlzLnZhbHVlVG9vbHRpcC5hcHBlbmRDaGlsZChVKTtLPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0suY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLXZhbHVlIik7Sy50ZXh0Q29udGVudD1NO3RoaXMudmFsdWVUb29sdGlwLmFwcGVuZENoaWxkKEspO3RoaXMudmFsdWVUb29sdGlwLnN0eWxlLnRvcD1MKyJweCI7dGhpcy52YWx1ZVRvb2x0aXAuc3R5bGUubGVmdD1SKyJweCI7dGhpcy52YWx1ZVRvb2x0aXAuc3R5bGUuZGlzcGxheT0iYmxvY2siOwp0aGlzLnZhbHVlUmVuZGVyTW9kZT09SS5JTUFHRSYmbnVsbCE9dGhpcy5jb2xvck1hcCYmKEw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksTC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLXRvb2x0aXAtY29sb3JiYXIiKSx0aGlzLnZhbHVlVG9vbHRpcC5hcHBlbmRDaGlsZChMKSx0aGlzLmNvbG9yTWFwLnJlbmRlcihMLHBhcnNlRmxvYXQoTSkpKX07SC5wcm90b3R5cGUuaGlkZVZhbHVlVG9vbHRpcD1mdW5jdGlvbigpe251bGwhPXRoaXMudmFsdWVUb29sdGlwJiYodGhpcy52YWx1ZVRvb2x0aXAuc3R5bGUuZGlzcGxheT0ibm9uZSIpfTtILnByb3RvdHlwZS5yZW5kZXJSdWxlcnNBbmRWYWx1ZURpdnM9ZnVuY3Rpb24oKXtyZXR1cm4gYSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gaXAodGhpcyxmdW5jdGlvbihLKXtzd2l0Y2goSy5sYWJlbCl7Y2FzZSAwOnJldHVybiBudWxsIT10aGlzLnNsaWNpbmdDb250cm9sJiZ0aGlzLnNsaWNpbmdDb250cm9sLnNldFNsaWNpbmdTcGVjKHRoaXMuc2xpY2luZ1NwZWMpLAp0aGlzLmNhbGN1bGF0ZVNob3dJbmRpY2VzT25SdWxlclRpY2tzKCksdGhpcy5yZW5kZXJUb3BSdWxlcigpLHRoaXMucmVuZGVyTGVmdFJ1bGVyKCksWzQsdGhpcy5yZW5kZXJWYWx1ZURpdnMoKV07Y2FzZSAxOnJldHVybiBLLnNlbnQoKSxbMl19fSl9KX07SC5wcm90b3R5cGUuY2FsY3VsYXRlU2hvd0luZGljZXNPblJ1bGVyVGlja3M9ZnVuY3Rpb24oKXtpZigyPD10aGlzLnJhbmspe3ZhciBLPXRoaXMudG9wUnVsZXJUaWNrc1swXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLnNob3dJbmRpY2VzT25UaWNrcz1LLnJpZ2h0LUsubGVmdD45Kk1hdGguY2VpbChNYXRoLmxvZyh0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXSkvTWF0aC5MTjEwKX1lbHNlIDE9PT10aGlzLnJhbms/KEs9dGhpcy5sZWZ0UnVsZXJUaWNrc1swXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0aGlzLnNob3dJbmRpY2VzT25UaWNrcz0xNjxLLmJvdHRvbS0KSy50b3ApOnRoaXMuc2hvd0luZGljZXNPblRpY2tzPSExfTtILnByb3RvdHlwZS5zY3JvbGxIb3Jpem9udGFsbHk9ZnVuY3Rpb24oSyl7cmV0dXJuIGEodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIE0sTDtyZXR1cm4gaXAodGhpcyxmdW5jdGlvbihSKXtzd2l0Y2goUi5sYWJlbCl7Y2FzZSAwOmlmKDE+PXRoaXMucmFuaylyZXR1cm5bMl07aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIGhvcml6b250YWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTtNPXRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV1dO2lmKDA+S3x8Sz49TSl0aHJvdyBFcnJvcigiSW5kZXggb3V0IG9mIGJvdW5kOiAiK0srIiBpcyBvdXRzaWRlIFswLCAiK00rIl0pIik7dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF09Szt0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVsxXT0KSyt0aGlzLnRvcFJ1bGVyVGlja3MubGVuZ3RoO0w9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV07dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMV0+TCYmKHRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdPUwpO3JldHVybls0LHRoaXMucmVuZGVyUnVsZXJzQW5kVmFsdWVEaXZzKCldO2Nhc2UgMTpyZXR1cm4gUi5zZW50KCksWzJdfX0pfSl9O0gucHJvdG90eXBlLnNjcm9sbFZlcnRpY2FsbHk9ZnVuY3Rpb24oSyl7cmV0dXJuIGEodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIE0sTDtyZXR1cm4gaXAodGhpcyxmdW5jdGlvbihSKXtzd2l0Y2goUi5sYWJlbCl7Y2FzZSAwOmlmKDA9PT10aGlzLnJhbmspcmV0dXJuWzJdO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgdmVydGljYWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKwoiRCB0ZW5zb3IuIik7aWYobnVsbD09PXRoaXMudmFsdWVSb3dzKXRocm93IEVycm9yKCJWZXJ0aWNhbCBzY3JvbGxpbmcgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIHZhbHVlIHJvd3MuIik7TT10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXTtpZigwPkt8fEs+PU0pdGhyb3cgRXJyb3IoIkluZGV4IG91dCBvZiBib3VuZDogIitLKyIgaXMgb3V0c2lkZSBbMCwgIitNKyJdKSIpO3RoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXT1LO3RoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVsxXT1LK3RoaXMudmFsdWVSb3dzLmxlbmd0aDtMPXRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF1dO3RoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVsxXT5MJiYodGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzFdPUwpO3JldHVybls0LHRoaXMucmVuZGVyUnVsZXJzQW5kVmFsdWVEaXZzKCldOwpjYXNlIDE6cmV0dXJuIFIuc2VudCgpLFsyXX19KX0pfTtILnByb3RvdHlwZS5zY3JvbGxVcE9yRG93bj1mdW5jdGlvbihLKXtyZXR1cm4gYSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgTSxMLFI7cmV0dXJuIGlwKHRoaXMsZnVuY3Rpb24oVSl7c3dpdGNoKFUubGFiZWwpe2Nhc2UgMDppZigwPT09dGhpcy5yYW5rfHwhdGhpcy5yb3dzQ3V0b2ZmKXJldHVyblsyXTtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIHZlcnRpY2FsIHJhbmdlIGZvciAiK3RoaXMucmFuaysiRCB0ZW5zb3IuIik7aWYobnVsbD09PXRoaXMudmFsdWVSb3dzKXRocm93IEVycm9yKCJWZXJ0aWNhbCBzY3JvbGxpbmcgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIHZhbHVlIHJvd3MuIik7TT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF07aWYoSyE9PXguRE9XTilyZXR1cm5bMywzXTtMPXRoaXMudmFsdWVSb3dzLmxlbmd0aC0KMTtSPXRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF1dLUw7cmV0dXJuIE08Uj9bNCx0aGlzLnNjcm9sbFZlcnRpY2FsbHkoTSsxKV06WzMsMl07Y2FzZSAxOlUuc2VudCgpLFUubGFiZWw9MjtjYXNlIDI6cmV0dXJuWzMsNV07Y2FzZSAzOnJldHVybiAwPD1NLTE/WzQsdGhpcy5zY3JvbGxWZXJ0aWNhbGx5KE0tMSldOlszLDVdO2Nhc2UgNDpVLnNlbnQoKSxVLmxhYmVsPTU7Y2FzZSA1OnJldHVyblsyXX19KX0pfTtILnByb3RvdHlwZS5zY3JvbGxMZWZ0T3JSaWdodD1mdW5jdGlvbihLKXtyZXR1cm4gYSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXt2YXIgTSxMLFI7cmV0dXJuIGlwKHRoaXMsZnVuY3Rpb24oVSl7c3dpdGNoKFUubGFiZWwpe2Nhc2UgMDppZigxPj10aGlzLnJhbmt8fCF0aGlzLmNvbHNDdXRvZmYpcmV0dXJuWzJdO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZSl0aHJvdyBFcnJvcigiSG9yaXpvbnRhbCBzY3JvbGxpbmcgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIGhvcml6b250YWwgcmFuZ2UuIik7Ck09dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF07aWYoSyE9PXguUklHSFQpcmV0dXJuWzMsM107TD10aGlzLnRvcFJ1bGVyVGlja3MubGVuZ3RoLTE7Uj10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzFdXS1MO3JldHVybiBNPFI/WzQsdGhpcy5zY3JvbGxIb3Jpem9udGFsbHkoTSsxKV06WzMsMl07Y2FzZSAxOlUuc2VudCgpLFUubGFiZWw9MjtjYXNlIDI6cmV0dXJuWzMsNV07Y2FzZSAzOnJldHVybiAwPD1NLTE/WzQsdGhpcy5zY3JvbGxIb3Jpem9udGFsbHkoTS0xKV06WzMsNV07Y2FzZSA0OlUuc2VudCgpLFUubGFiZWw9NTtjYXNlIDU6cmV0dXJuWzJdfX0pfSl9O0gucHJvdG90eXBlLm5hdmlnYXRlVG9JbmRpY2VzPWZ1bmN0aW9uKCl7cmV0dXJuIGEodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIGlwKHRoaXMsZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigibmF2aWdhdGVUb0luZGljZXMoKSBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LiIpOwp9KX0pfTtILnByb3RvdHlwZS5nZXRWYWx1ZUNsYXNzPWZ1bmN0aW9uKCl7dmFyIEs9dGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGU7cmV0dXJuIGMoSyl8fGQoSyk/Im51bWVyaWMiOmYoSyk/ImJvb2xlYW4iOiJzdHJpbmcifTtyZXR1cm4gSH0oKTtEPU9iamVjdC5mcmVlemUoe3RlbnNvcldpZGdldDpmdW5jdGlvbihILEssTSl7cmV0dXJuIG5ldyBQKEgsSyxNKX0sVkVSU0lPTjoiMC4wLjAifSk7d2luZG93LnRlbnNvcl93aWRnZXQ9RH0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLWRlYnVnZ2VyLWxpbmUtY2hhcnQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZGVidWdnZXItbGluZS1jaGFydCIscHJvcGVydGllczp7ZGF0YTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX2RlZmF1bHRTZXJpZXNOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZToiX19kZWJ1Z2dlcl9kYXRhX18iLHJlYWRvbmx5OiEwfSxfbGluZUNoYXJ0WENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZDp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsdmFsdWU6KCk9PigpPT57Y29uc3QgYT1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXI7cmV0dXJue3NjYWxlOmEsYXhpczpuZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyhhLCJib3R0b20iKSxhY2Nlc3NvcjpjPT5jLnN0ZXB9fX0sX2xpbmVDaGFydFlWYWx1ZUFjY2Vzc29yOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCx2YWx1ZTooKT0+YT0+YS5zY2FsYXJ9LF9saW5lQ2hhcnRUb29sdGlwQ29sdW1uczp7dHlwZTpBcnJheSxyZWFkT25seTohMCx2YWx1ZTooKT0+W3t0aXRsZToiTmFtZSIsZXZhbHVhdGU6YT0+CiJzdGVwXHgzZCIrYS5kYXR1bS5zdGVwKyI7IHNjYWxhclx4M2QgIithLmRhdHVtLnNjYWxhcn1dfSxfbGluZUNoYXJ0U21vb3RoaW5nRW5hYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlYWRPbmx5OiEwfX0sb2JzZXJ2ZXJzOlsicmVuZGVyKGRhdGEpIl0scmVuZGVyKGEpe2lmKG51bGwhPWEpe3ZhciBjPXRoaXMuJCQoInZ6LWxpbmUtY2hhcnQyIik7Yy5zZXRWaXNpYmxlU2VyaWVzKFt0aGlzLl9kZWZhdWx0U2VyaWVzTmFtZV0pO3ZhciBkPVtdLGY9YS54O2E9YS55O2ZvcihsZXQgZz0wO2c8Zi5sZW5ndGg7KytnKWQucHVzaCh7c3RlcDpmW2ddLHNjYWxhcjphW2ddfSk7Yy5zZXRTZXJpZXNEYXRhKHRoaXMuX2RlZmF1bHRTZXJpZXNOYW1lLGQpfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtdGVuc29yLXZhbHVlLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtdGVuc29yLXZhbHVlLXZpZXciLHByb3BlcnRpZXM6e3ZpZXdJZDpTdHJpbmcsdGVuc29yTmFtZTpTdHJpbmcsZGVidWdPcDpTdHJpbmcsZGV2aWNlTmFtZTpTdHJpbmcsbWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZTpTdHJpbmcsc2xpY2luZzpTdHJpbmcsdGltZUluZGljZXM6U3RyaW5nLGR0eXBlOlN0cmluZyxzaGFwZTpBcnJheSxjb250aW51ZVRvQnV0dG9uQ2FsbGJhY2s6T2JqZWN0LGNsb3NlQnV0dG9uQ2FsbGJhY2s6T2JqZWN0LHRlbnNvck5hbWVDYWxsYmFjazpPYmplY3QsdGVuc29yV2lkZ2V0Ok9iamVjdCxnZXRIZWFsdGhQaWxsOkZ1bmN0aW9uLF9pc1RlbnNvclZhbHVlU2NhbGFyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9pc1RlbnNvclZhbHVlTGluZUNoYXJ0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9pc1RlbnNvclZhbHVlSW1hZ2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2RhdGFTY2FsYXI6e3R5cGU6TnVtYmVyLHZhbHVlOm51bGx9LApfbGluZUNoYXJ0RGF0YTp7dHlwZTpBcnJheSx2YWx1ZTpudWxsfSxfZGF0YUltYWdlU3JjOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUW8uUmVxdWVzdE1hbmFnZXIoMTApfX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZVRpbWVJbmRpY2VzVG9nZ2xlKHRpbWVJbmRpY2VzKSJdLHJlbmRlclRlbnNvclZhbHVlKCl7aWYodGhpcy50ZW5zb3JOYW1lKWlmKG51bGw9PXRoaXMuc2xpY2luZyl7dGhpcy5zZXQoIl91c2VUZW5zb3JXaWRnZXQiLCEwKTtjb25zdCBjPXtzcGVjOntkdHlwZTp0aGlzLmR0eXBlLHNoYXBlOnRoaXMuc2hhcGV9LGdldDooKT0+e3Rocm93IEVycm9yKCJ0ZW5zb3JWaWV3LmdldCgpIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuIik7fSx2aWV3OmQ9Pntjb25zdCBmPXRoaXM7cmV0dXJuIEJiKGZ1bmN0aW9uKigpe2NvbnN0IGc9Zi5zaGFwZS5sZW5ndGgsbD1kLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAocD0+CnAuZGltKSxrPWQuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLm1hcChwPT5wLmluZGV4KTtsZXQgbj0iWyI7Zm9yKGxldCBwPTA7cDxnOysrcCktMSE9PWwuaW5kZXhPZihwKT9uKz1gJHtrW2wuaW5kZXhPZihwKV19YDpkLnZpZXdpbmdEaW1zWzBdPT09cD9uKz1gJHtkLnZlcnRpY2FsUmFuZ2VbMF19OiR7ZC52ZXJ0aWNhbFJhbmdlWzFdfWA6ZC52aWV3aW5nRGltc1sxXT09PXAmJihuKz1gJHtkLmhvcml6b250YWxSYW5nZVswXX06JHtkLmhvcml6b250YWxSYW5nZVsxXX1gKSxwPGctMSYmKG4rPSIsIik7bis9Il0iO3JldHVybiBuZXcgUHJvbWlzZSgocCxxKT0+e2NvbnN0IHI9Zi5fZ2V0VGVuc29yRGF0YVVSTCh7d2F0Y2hfa2V5OmYudGVuc29yTmFtZSsiOiIrZi5kZWJ1Z09wLHNsaWNpbmc6bix0aW1lX2luZGljZXM6Zi50aW1lSW5kaWNlcyxtYXBwaW5nOiJub25lIn0pO2YuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QocikudGhlbih0PT57bnVsbD09dC5lcnJvcj9wKHQudGVuc29yX2RhdGFbdC50ZW5zb3JfZGF0YS5sZW5ndGgtCjFdKTpxKHQuZXJyb3IpfSkuY2F0Y2godD0+cSh0KSl9KX0pfSxnZXROdW1lcmljU3VtbWFyeTooKT0+e2NvbnN0IGQ9dGhpcztyZXR1cm4gQmIoZnVuY3Rpb24qKCl7cmV0dXJuIG5ldyBQcm9taXNlKChmLGcpPT57Y29uc3QgbD1kLnRlbnNvck5hbWUrIjoiK2QuZGVidWdPcDtkLmdldEhlYWx0aFBpbGwobCxkLmRldmljZU5hbWUsZC5tYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lLGs9PntudWxsPT1rP2coYEZhaWxlZCB0byBnZXQgaGVhbHRoIHBpbGwgZm9yIHdhdGNoIGtleSAke2x9YCk6Zih7ZWxlbWVudENvdW50OmtbMV0sbWluaW11bTprWzhdLG1heGltdW06a1s5XX0pfSl9KX0pfX07c2V0VGltZW91dCgoKT0+e251bGw9PXRoaXMudGVuc29yV2lkZ2V0JiYodGhpcy50ZW5zb3JXaWRnZXQ9dGVuc29yX3dpZGdldC50ZW5zb3JXaWRnZXQodGhpcy4kJCgiI3RlbnNvci13aWRnZXQiKSxjLHt3aGVlbFpvb21LZXk6ImFsdCJ9KSk7dGhpcy50ZW5zb3JXaWRnZXQucmVuZGVyKCl9LAoxMCl9ZWxzZXt0aGlzLnNldCgiX3VzZVRlbnNvcldpZGdldCIsITEpO3ZhciBhPXRoaXMuX3JhbmtGcm9tU2xpY2luZyh0aGlzLnNsaWNpbmcudHJpbSgpKTtjb25zdCBjPXRoaXMuX2lzVGltZUluZGljZXNTaW5nbGVTdGVwKHRoaXMudGltZUluZGljZXMpO2xldCBkPWE7aWYoIWMpe2lmKDE8YSl7dGhpcy5fc2hvd1RvYXN0KCJIaXN0b3J5IGZvciB0ZW5zb3JzIFx4M2UgMUQgaXMgbm90IHlldCBzdXBwb3J0ZWQuIik7cmV0dXJufWQrPTF9YT10aGlzLl9nZXRUZW5zb3JEYXRhVVJMKHt3YXRjaF9rZXk6dGhpcy50ZW5zb3JOYW1lKyI6Iit0aGlzLmRlYnVnT3Asc2xpY2luZzp0aGlzLnNsaWNpbmcsdGltZV9pbmRpY2VzOnRoaXMudGltZUluZGljZXMsbWFwcGluZzoyPD1kPyJpbWFnZS9wbmciOiJub25lIn0pO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihmPT57dGhpcy4kJCgiI2RlYnVnLW9wIikudGV4dENvbnRlbnQ9dGhpcy5fY2FsY3VsYXRlRGVidWdPcFRvRGlzcGxheSgpOwppZihudWxsIT1mLmVycm9yKXRoaXMuX3Nob3dUb2FzdChmLmVycm9yLnR5cGUrIjogIitmLmVycm9yLm1lc3NhZ2UpO2Vsc2UgaWYoZj1jP2YudGVuc29yX2RhdGFbMF06Zi50ZW5zb3JfZGF0YSwwPT09ZCl0aGlzLl9zZXRWaXN1YWxpemF0aW9uVHlwZSgic2NhbGFyIiksdGhpcy5zZXQoIl9kYXRhU2NhbGFyIixmKTtlbHNlIGlmKDE9PT1kKXt0aGlzLl9zZXRWaXN1YWxpemF0aW9uVHlwZSgibGluZUNoYXJ0Iik7bGV0IGc9e3g6W10seTpmfTtmb3IobGV0IGw9MDtsPGYubGVuZ3RoOysrbClnLngucHVzaChsKzEpO3RoaXMuc2V0KCJfbGluZUNoYXJ0RGF0YSIsZyl9ZWxzZSAyPD1kPyh0aGlzLl9zZXRWaXN1YWxpemF0aW9uVHlwZSgiaW1hZ2UiKSx0aGlzLnNldCgiX2RhdGFJbWFnZVNyYyIsImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwiK2YpKTp0aGlzLl9zaG93VG9hc3QoIlZpc3VhbGl6YXRpb24gb2YgcmFuay0iK2QrIiB0ZW5zb3JzIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIpfSl9fSwKcmVmcmVzaCgpe3RoaXMudGVuc29yTmFtZS50cmltKCkmJnRoaXMucmVuZGVyVGVuc29yVmFsdWUoKX0sX2dldFRlbnNvckRhdGFVUkwoYSl7Y29uc3QgYz1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvdGVuc29yX2RhdGEiKTtyZXR1cm4gUW8uYWRkUGFyYW1zKGMsYSl9LF9yYW5rRnJvbVNsaWNpbmcoYSl7YS5zdGFydHNXaXRoKCJbIikmJihhPWEuc2xpY2UoMSxhLmxlbmd0aC0xKSk7aWYoMD09PWEubGVuZ3RoKXJldHVybiAwO3thPWEuc3BsaXQoIiwiKTtsZXQgYz1hLmxlbmd0aDtmb3IoY29uc3QgZCBvZiBhKWlzTmFOKE51bWJlcihkKSl8fGMtLTtyZXR1cm4gY319LF9zZXRWaXN1YWxpemF0aW9uVHlwZShhKXsic2NhbGFyIj09PWE/KHRoaXMuc2V0KCJfaXNWYWx1ZVNjYWxhciIsITApLHRoaXMuc2V0KCJfaXNWYWx1ZUxpbmVDaGFydCIsITEpLHRoaXMuc2V0KCJfaXNWYWx1ZUltYWdlIiwhMSkpOiJsaW5lQ2hhcnQiPT09YT8odGhpcy5zZXQoIl9pc1ZhbHVlU2NhbGFyIiwKITEpLHRoaXMuc2V0KCJfaXNWYWx1ZUxpbmVDaGFydCIsITApLHRoaXMuc2V0KCJfaXNWYWx1ZUltYWdlIiwhMSkpOiJpbWFnZSI9PT1hPyh0aGlzLnNldCgiX2lzVmFsdWVTY2FsYXIiLCExKSx0aGlzLnNldCgiX2lzVmFsdWVMaW5lQ2hhcnQiLCExKSx0aGlzLnNldCgiX2lzVmFsdWVJbWFnZSIsITApKTpjb25zb2xlLmVycm9yKCJJbnZhbGlkIHZpc3VhbGl6YXRpb25UeXBlOiIsYSl9LF90aW1lSW5kaWNlc1RvZ2dsZUJ1dHRvbkNhbGxiYWNrKCl7ImZ1bGwgaGlzdG9yeSI9PT1Qb2x5bWVyLmRvbSh0aGlzLiQkKCIjdGltZS1pbmRpY2VzLXRvZ2dsZS1idXR0b24iKSkudGV4dENvbnRlbnQudG9Mb3dlckNhc2UoKT90aGlzLnNldCgidGltZUluZGljZXMiLCI6Iik6dGhpcy5zZXQoInRpbWVJbmRpY2VzIiwiLTEiKTt0aGlzLnJlbmRlclRlbnNvclZhbHVlKCl9LF91cGRhdGVUaW1lSW5kaWNlc1RvZ2dsZShhKXt0aGlzLl9pc1RpbWVJbmRpY2VzU2luZ2xlU3RlcChhKT9Qb2x5bWVyLmRvbSh0aGlzLiQkKCIjdGltZS1pbmRpY2VzLXRvZ2dsZS1idXR0b24iKSkudGV4dENvbnRlbnQ9CiJGdWxsIEhpc3RvcnkiOlBvbHltZXIuZG9tKHRoaXMuJCQoIiN0aW1lLWluZGljZXMtdG9nZ2xlLWJ1dHRvbiIpKS50ZXh0Q29udGVudD0iTGF0ZXN0IFRpbWUgUG9pbnQifSxfaXNUaW1lSW5kaWNlc1NpbmdsZVN0ZXAoYSl7YS5zdGFydHNXaXRoKCJbIikmJihhPWEuc2xpY2UoMSxhLmxlbmd0aC0xKSk7cmV0dXJuIWlzTmFOKE51bWJlcihhKSl9LF9jYWxjdWxhdGVEZWJ1Z09wVG9EaXNwbGF5KCl7cmV0dXJuIkRlYnVnSWRlbnRpdHkiPT09dGhpcy5kZWJ1Z09wPyIiOnRoaXMuZGVidWdPcH0sX3Nob3dUb2FzdChhKXt0aGlzLiQudGVuc29yVmFsdWVUb2FzdC5zZXRBdHRyaWJ1dGUoInRleHQiLGEpO3RoaXMuJC50ZW5zb3JWYWx1ZVRvYXN0Lm9wZW4oKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXciLHByb3BlcnRpZXM6e2NvbnRpbnVlVG9DYWxsYmFjazpGdW5jdGlvbix0ZW5zb3JOYW1lQ2xpY2tlZDpGdW5jdGlvbixfdGVuc29yVmlld0NvdW50ZXI6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGdldEhlYWx0aFBpbGw6RnVuY3Rpb259LGFkZFZpZXcoYSl7Y29uc3QgYz10aGlzLiQkKCIjbXVsdGktdGVuc29yLXZpZXctY29udGFpbmVyIiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Zi10ZW5zb3ItdmFsdWUtdmlldyIpO2Quc2V0QXR0cmlidXRlKCJjbGFzcyIsImRlYnVnZ2VyLXRlbnNvci12aWV3Iik7ZC52aWV3SWQ9YS52aWV3SWQ7ZC50ZW5zb3JOYW1lPWEudGVuc29yTmFtZTtkLmRlYnVnT3A9YS5kZWJ1Z09wO2QuZGV2aWNlTmFtZT1hLmRldmljZU5hbWU7ZC5tYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lPWEubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZTtkLmR0eXBlPWEuZHR5cGU7ZC5zaGFwZT1hLnNoYXBlOwpkLnNsaWNpbmc9YS5zbGljaW5nO2QudGltZUluZGljZXM9YS50aW1lSW5kaWNlcztkLmNsb3NlQnV0dG9uQ2FsbGJhY2s9dGhpcy5fY3JlYXRlQ2xvc2VCdXR0b25DYWxsYmFjayhhLnZpZXdJZCk7ZC5jb250aW51ZVRvQnV0dG9uQ2FsbGJhY2s9KCk9Pnt0aGlzLmNvbnRpbnVlVG9DYWxsYmFjayhhLmRldmljZU5hbWUsYS5tYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lKX07ZC50ZW5zb3JOYW1lQ2FsbGJhY2s9KCk9Pnt0aGlzLnRlbnNvck5hbWVDbGlja2VkKGEuZGV2aWNlTmFtZSxhLm1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWUpfTtkLmdldEhlYWx0aFBpbGw9dGhpcy5nZXRIZWFsdGhQaWxsO2MuYXBwZW5kQ2hpbGQoZCk7ZC5yZWZyZXNoKCl9LGdldFZpZXdzKCl7Y29uc3QgYT1bXTtfLmZvckVhY2godGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5kZWJ1Z2dlci10ZW5zb3ItdmlldyIpLGM9PnthLnB1c2goe3ZpZXdJZDpjLnZpZXdJZCx0ZW5zb3JOYW1lOmMudGVuc29yTmFtZSwKZGVidWdPcDpjLmRlYnVnT3Asc2xpY2luZzpjLnNsaWNpbmcsdGltZUluZGljZXM6Yy50aW1lSW5kaWNlc30pfSk7cmV0dXJuIGF9LHJlbmRlclRlbnNvclZhbHVlcygpe18uZm9yRWFjaCh0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmRlYnVnZ2VyLXRlbnNvci12aWV3IiksYT0+e2EucmVuZGVyVGVuc29yVmFsdWUoKX0pfSxfcmVkcmF3Vmlld3MoYSl7Y29uc3QgYz10aGlzLiQkKCIjbXVsdGktdGVuc29yLXZpZXctY29udGFpbmVyIik7Xy5mb3JFYWNoKHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuZGVidWdnZXItdGVuc29yLXZpZXciKSxkPT57Yy5yZW1vdmVDaGlsZChkKX0pO18uZm9yRWFjaChhLGQ9Pnt0aGlzLmFkZFZpZXcoZCl9KX0sX2NyZWF0ZUNsb3NlQnV0dG9uQ2FsbGJhY2soYSl7cmV0dXJuKCk9Pntjb25zdCBjPVtdLGQ9dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5kZWJ1Z2dlci10ZW5zb3ItdmlldyIpO2ZvcihsZXQgZj0wO2Y8ZC5sZW5ndGg7KytmKXtjb25zdCBnPQpkW2ZdO2cudmlld0lkIT09YSYmYy5wdXNoKHt2aWV3SWQ6Zy52aWV3SWQsdGVuc29yTmFtZTpnLnRlbnNvck5hbWUsZGVidWdPcDpnLmRlYnVnT3AsZHR5cGU6Zy5kdHlwZSxzaGFwZTpnLnNoYXBlLHNsaWNpbmc6Zy5zbGljaW5nLHRpbWVJbmRpY2VzOmcudGltZUluZGljZXN9KX10aGlzLl9yZWRyYXdWaWV3cyhjKX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RlbnNvci1zaGFwZS1oZWxwZXIuanMKKGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoZCxmKXtyZXR1cm4gZDw9Zj8iOjoiOiI6OiIrTWF0aC5jZWlsKGQvZil9YS5nZXREZWZhdWx0U2xpY2luZz1mdW5jdGlvbihkKXtyZXR1cm4gMD09PWQubGVuZ3RoPyIiOjE9PT1kLmxlbmd0aD8iWyIrYyhkWzBdLDFFMykrIl0iOjI9PT1kLmxlbmd0aD8iWyIrYyhkWzBdLDI1MCkrIiwgIitjKGRbMV0sMjUwKSsiXSI6bnVsbH07YS5yYW5rRnJvbVNsaWNpbmc9ZnVuY3Rpb24oZCl7ZC5zdGFydHNXaXRoKCJbIikmJihkPWQuc2xpY2UoMSxkLmxlbmd0aC0xKSk7aWYoMD09PWQubGVuZ3RoKXJldHVybiAwO3tkPWQuc3BsaXQoIiwiKTtsZXQgZj1kLmxlbmd0aDtmb3IoY29uc3QgZyBvZiBkKWlzTmFOKE51bWJlcihnKSl8fGYtLTtyZXR1cm4gZn19fSkoZ3B8fChncD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQuaHRtbC5qcwpjb25zdCBrcD0oKT0+d2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0fHxkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCxscD0oKT0+d2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aHx8ZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCxtcD0oa3AoKS03MCkvMjsKUG9seW1lcih7aXM6InRmLWRlYnVnZ2VyLWRhc2hib2FyZCIscHJvcGVydGllczp7X3RvcFJpZ2h0VGFiczp7dHlwZTpBcnJheSx2YWx1ZTpbe2lkOiJ0YWItcnVudGltZS1ncmFwaHMiLG5hbWU6IlJ1bnRpbWUgR3JhcGhzIn0se2lkOiJ0YWItdGVuc29yLXZhbHVlcyIsbmFtZToiVGVuc29yIFZhbHVlcyJ9XSxyZWFkb25seTohMH0sX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF9pc1RvcFJpZ2h0VGVuc29yVmFsdWVzQWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF90b3BSaWdodFNlbGVjdGVkOnt0eXBlOlN0cmluZyx2YWx1ZToiMCIsb2JzZXJ2ZXI6Il90b3BSaWdodFNlbGVjdGVkQ2hhbmdlZCJ9LF9sb25nUG9sbENvdW50Ont0eXBlOk51bWJlcix2YWx1ZTowfSxfc3RlcEJ1dHRvblRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJTdGVwIn0sX2NvbnRpbnVlQnV0dG9uVGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IkNvbnRpbnVlLi4uIn0sCl90ZW5zb3JWaWV3SWRDb3VudGVyOnt0eXBlOk51bWJlcix2YWx1ZTowfSxpc1JlbG9hZERpc2FibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAscmVhZE9ubHk6ITB9LGFscmVhZHlTdGFydGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9jdXJyZW50U2Vzc2lvblJ1bkluZm86e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9zZXNzaW9uUnVuVG90YWxDb3VudGVyOnt0eXBlOk51bWJlcix2YWx1ZTowfSxfc2Vzc2lvblJ1bkNvdW50ZXJzOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXM6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfYWN0aXZlU2Vzc2lvblJ1bktleTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxfYWN0aXZlU2Vzc2lvblJ1bk51bURldmljZXM6e3R5cGU6TnVtYmVyLHZhbHVlOi0xfSxfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZTp7dHlwZTpTdHJpbmcsCnZhbHVlOm51bGwsbm90aWZ5OiEwfSxfaGlnaGxpZ2h0Tm9kZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9jb250aW51ZVRvVHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9jb250aW51ZVRvQ291bnRlcjp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX2NvbnRpbnVlU3RvcDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY29udGludWVUb1RhcmdldDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9jb250aW51ZVRvQ291bnRlclRhcmdldDp7dHlwZTpOdW1iZXIsdmFsdWU6LTF9LF9mb3JjZUV4cGFuZEFuZENoZWNrTm9kZU5hbWU6U3RyaW5nLF9mb3JjZUV4cGFuZE5vZGVOYW1lOlN0cmluZyxfc291cmNlRm9jdXNOb2RlTmFtZTpTdHJpbmcsX3NvdXJjZUNvZGVTaG93bjp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfc2hvd1NvdXJjZUNvZGVDaGFuZ2VkIn0sX2dyYXBoUHJvZ3Jlc3M6e3R5cGU6T2JqZWN0fSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4KbmV3IFFvLlJlcXVlc3RNYW5hZ2VyKDUwKX0sX2J1c3k6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2xlZnRQYW5lV2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOlRvLmdldE51bWJlckluaXRpYWxpemVyKCJfbGVmdFBhbmVXaWR0aCIse2RlZmF1bHRWYWx1ZTo0NTB9KSxvYnNlcnZlcjoiX2xlZnRQYW5lV2lkdGhPYnNlcnZlciJ9LF9taW5sZWZ0UGFuZVdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTo0NTAscmVhZE9ubHk6ITB9LF9tYXhsZWZ0UGFuZVdpZHRoOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVNYXhsZWZ0UGFuZVdpZHRoKF93aW5kb3dXaWR0aCwgX21heE1haW5Db250ZW50V2lkdGgsIF9yZXNpemVyV2lkdGgpIn0sX21heE1haW5Db250ZW50V2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjM1MCxyZWFkT25seTohMH0sX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbHVlOlRvLmdldE51bWJlckluaXRpYWxpemVyKCJfdG9wUmlnaHRRdWFkcmFudEhlaWdodCIsCntkZWZhdWx0VmFsdWU6bXB9KSxvYnNlcnZlcjoiX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHRPYnNlcnZlciJ9LF9taW5Ub3BSaWdodFF1YWRyYW50SGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZToyMDAscmVhZE9ubHk6ITB9LF9tYXhUb3BSaWdodFF1YWRyYW50SGVpZ2h0Ont0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVNYXhUb3BSaWdodFF1YWRyYW50SGVpZ2h0KF93aW5kb3dIZWlnaHQsIF9yZXNpemVyV2lkdGgpIn0sX3Jlc2l6ZXJXaWR0aDp7dHlwZTpOdW1iZXIsdmFsdWU6MzAscmVhZE9ubHk6ITB9LF93aW5kb3dXaWR0aDpOdW1iZXIsX3dpbmRvd0hlaWdodDpOdW1iZXIsX2RlYnVnV2F0Y2hlczpBcnJheSxfbGF0ZXN0U2Vzc2lvblJ1bjpPYmplY3R9LG9ic2VydmVyczpbIl9vbkFjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWVDaGFuZ2UoX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUpIiwiX3NpemVEYXNoYm9hcmRSZWdpb25zKF9sZWZ0UGFuZVdpZHRoLCBfdG9wUmlnaHRRdWFkcmFudEhlaWdodCwgX3dpbmRvd1dpZHRoKSIsCiJfZ3JhcGhQcm9ncmVzc1VwZGF0ZWQoX2dyYXBoUHJvZ3Jlc3MpIl0scmVhZHkoKXt0aGlzLl9oYW5kbGVXaW5kb3dSZXNpemUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIiwoKT0+e3RoaXMuX2hhbmRsZVdpbmRvd1Jlc2l6ZSgpfSwhMSk7dGhpcy5yZWxvYWQoKX0sbG9uZ19wb2xsKCl7Y29uc3QgYT17cG9zOisrdGhpcy5fbG9uZ1BvbGxDb3VudH07bGV0IGM9UW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL2NvbW0iKTtjPVFvLmFkZFBhcmFtcyhjLGEpO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYykudGhlbihkPT57Y29uc3QgZj1kLnR5cGU7ZD1kLmRhdGE7aWYoIm1ldGEiPT09Zil7dmFyIGc9ZC5ydW5fa2V5LGw9Z1swXS5zcGxpdCgiLCIpLGs9Z1sxXS5zcGxpdCgiLCIpO2NvbnN0IHA9Z1syXS5zcGxpdCgiLCIpO3ZhciBuPXRoaXMuX2FjdGl2ZVNlc3Npb25SdW5LZXk7dGhpcy5zZXQoIl9hY3RpdmVTZXNzaW9uUnVuS2V5IiwKZyk7dGhpcy5zZXQoIl9sYXRlc3RTZXNzaW9uUnVuIix7ZmVlZHM6bCxmZXRjaGVzOmssdGFyZ2V0czpwfSk7dGhpcy5zZXQoIl9zZXNzaW9uUnVuU29sZUFjdGl2ZSIsITApO3ZvaWQgMD09PXRoaXMuX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXNbZ10/KHRoaXMuX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXNbZ109W10sdGhpcy5zZXQoIl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcyIsW10pKTp0aGlzLnNldCgiX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzIix0aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2ddKTt0aGlzLl9jdXJyZW50U2Vzc2lvblJ1bkluZm89bD0iRmVlZHM6ICIrbCsiOyBGZXRjaGVzOiAiK2srIjsgVGFyZ2V0czogIitwO3RoaXMuX3Nlc3Npb25SdW5Db3VudGVycy5oYXNPd25Qcm9wZXJ0eShsKT90aGlzLl9zZXNzaW9uUnVuQ291bnRlcnNbbF0rPTE6dGhpcy5fc2Vzc2lvblJ1bkNvdW50ZXJzW2xdPTE7dGhpcy5fc2Vzc2lvblJ1blRvdGFsQ291bnRlcisrOwp0aGlzLiQuaW5pdGlhbERpYWxvZy5jbG9zZURpYWxvZygpO3RoaXMuX2NvbnRpbnVlVG9UeXBlJiZfLmlzRXF1YWwobixnKXx8KHRoaXMuX3Byb2Nlc3NHYXRlZEdycGNEZWJ1Z09wcyhnLCExKSx0aGlzLl9hbm5vdW5jZU5ld1Nlc3Npb25SdW4oKSl9ZWxzZSJ0ZW5zb3IiPT09Zj8oZz1kLmRldmljZV9uYW1lLG49ZC5ub2RlX25hbWUsbD1kLm1heWJlX2Jhc2VfZXhwYW5kZWRfbm9kZV9uYW1lLHRoaXMuX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUhPWc/dGhpcy5zZXQoIl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lIixnKTohdGhpcy5fY29udGludWVUb1R5cGUmJnRoaXMuX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlJiYodGhpcy5fZm9jdXNPbkdyYXBoTm9kZShnLGwpLHRoaXMuc2V0KCJfZm9yY2VFeHBhbmROb2RlTmFtZSIsZysiLyIrbCkpLHRoaXMuc2V0KCJfc2Vzc2lvblJ1blNvbGVBY3RpdmUiLCExKSxrPW4rIjoiK2Qub3V0cHV0X3Nsb3QsdGhpcy5zZXQoIl9sYXRlc3RUZW5zb3JEYXRhIiwKe2RldmljZU5hbWU6Zyx0ZW5zb3JOYW1lOmssbm9kZU5hbWU6bixtYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lOmwsZGVidWdPcDpkLmRlYnVnX29wLGR0eXBlOmQuZHR5cGUsc2hhcGU6ZC5zaGFwZSx2YWx1ZTpkLnZhbHVlc30pLHRoaXMuX21heWJlVXBkYXRlVGVuc29yVmFsdWVWaWV3cyhrLGQuZGVidWdfb3ApLHRoaXMuc2V0KCJfYnVzeSIsITEpKTpjb25zb2xlLmVycm9yKCJJbnZhbGlkIGxvbmctcG9sbGluZyByZXNwb25zZSB0eXBlOiAiLGYpO251bGwhPXRoaXMuX2NvbnRpbnVlVG9UeXBlJiZ0aGlzLl9wcm9jZXNzQ29udGludWVUbyhmLGQpO3RoaXMubG9uZ19wb2xsKCl9KX0sX3Byb2Nlc3NDb250aW51ZVRvKGEsYyl7dGhpcy5fY29udGludWVTdG9wP3RoaXMuX2NsZWFyQ29udGludWVUbygpOiJTZXNzaW9uUnVuIj09PXRoaXMuX2NvbnRpbnVlVG9UeXBlP3RoaXMuX3Byb2Nlc3NDb250aW51ZVRvU2Vzc2lvblJ1bigibWV0YSI9PT1hKToiVGVuc29yQ29uZGl0aW9uIj09PQp0aGlzLl9jb250aW51ZVRvVHlwZT90aGlzLl9zdGVwKCk6Im9wIj09PXRoaXMuX2NvbnRpbnVlVG9UeXBlP3RoaXMuX3Byb2Nlc3NDb250aW51ZVRvT3AoIm1ldGEiPT09YSxjKTpudWxsIT10aGlzLl9jb250aW51ZVRvVHlwZSYmIiIhPT10aGlzLl9jb250aW51ZVRvVHlwZSYmY29uc29sZS5lcnJvcigiSW52YWxpZCBfY29udGludWVUb1R5cGU6Iix0aGlzLl9jb250aW51ZVRvVHlwZSl9LF9wcm9jZXNzQ29udGludWVUb1Nlc3Npb25SdW4oYSl7YSYmdGhpcy5zZXQoIl9jb250aW51ZVRvQ291bnRlciIsdGhpcy5fY29udGludWVUb0NvdW50ZXIrMSk7dGhpcy5fY29udGludWVUb0NvdW50ZXI8dGhpcy5fY29udGludWVUb0NvdW50ZXJUYXJnZXQ/dGhpcy5fc3RlcCgpOnRoaXMuX2NsZWFyQ29udGludWVUbygpfSxfcHJvY2Vzc0NvbnRpbnVlVG9PcChhLGMpe2EmJnRoaXMuX2Fubm91bmNlTmV3U2Vzc2lvblJ1bigpO2E9Yy5kZXZpY2VfbmFtZTtjPWMubWF5YmVfYmFzZV9leHBhbmRlZF9ub2RlX25hbWU7CmNvbnN0IGQ9bnVsbD09Yz9udWxsOmdwLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihjKTthKyIvIitjPT09dGhpcy5fY29udGludWVUb1RhcmdldHx8YSsiLyIrZD09PXRoaXMuX2NvbnRpbnVlVG9UYXJnZXQ/KHRoaXMuX2NsZWFyQ29udGludWVUbygpLHRoaXMuX3NvdXJjZUNvZGVTaG93biYmdGhpcy5zZXQoIl9zb3VyY2VGb2N1c05vZGVOYW1lIixkKSk6dGhpcy5fc3RlcCgpfSxfbWF5YmVVcGRhdGVUZW5zb3JWYWx1ZVZpZXdzKGEsYyl7Y29uc3QgZD10aGlzLiQkKCIjdGVuc29yVmFsdWVNdWx0aVZpZXciKTtpZihudWxsIT1kKXt2YXIgZj0hMTtfLmZvckVhY2goZC5nZXRWaWV3cygpLGc9PntpZihnLnRlbnNvck5hbWU9PT1hJiZnLmRlYnVnT3A9PT1jKXJldHVybiBmPSEwLCExfSk7ZiYmZC5yZW5kZXJUZW5zb3JWYWx1ZXMoKX19LHJlbG9hZCgpe2lmKCF0aGlzLmFscmVhZHlTdGFydGVkKXt0aGlzLnNldCgiYWxyZWFkeVN0YXJ0ZWQiLCEwKTt2YXIgYT1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLAoiL2RlYnVnZ2VyX2dycGNfaG9zdF9wb3J0Iik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChhKS50aGVuKGM9PnswPGMucG9ydD8odGhpcy4kLmluaXRpYWxEaWFsb2cub3BlbkRpYWxvZyhjLmhvc3QsYy5wb3J0KSx0aGlzLmxvbmdfcG9sbCgpKTp0aGlzLiQuaW5pdGlhbERpYWxvZy5vcGVuRGlzYWJsZWREaWFsb2coKX0pfX0sX3Nob3dTb3VyY2VDb2RlQ2hhbmdlZCgpe3RoaXMuX3NvdXJjZUNvZGVTaG93bj8odGhpcy4kJCgiI25vZGUtZW50cmllcyIpLnN0eWxlLmhlaWdodD0iNDAlIix0aGlzLiQuc291cmNlQ29kZVZpZXcucmVuZGVyKCkpOnRoaXMuJCQoIiNub2RlLWVudHJpZXMiKS5zdHlsZS5oZWlnaHQ9IjgwJSJ9LF9zaG93VG9hc3QoYSl7dGhpcy4kLnRvYXN0LnNldEF0dHJpYnV0ZSgidGV4dCIsYSk7dGhpcy4kLnRvYXN0Lm9wZW4oKX0sX2Fubm91bmNlTmV3U2Vzc2lvblJ1bigpe3RoaXMuX3Nob3dUb2FzdCgiU2Vzc2lvbi5ydW4oKSAjIit0aGlzLl9zZXNzaW9uUnVuVG90YWxDb3VudGVyKwoiIGlzIHN0YXJ0aW5nLiIpfSxfZGlzcGxheUdyYXBoKGEsYyl7YT17cnVuX2tleTpKU09OLnN0cmluZ2lmeShhKSxkZXZpY2VfbmFtZTpjfTthPVFvLmFkZFBhcmFtcygiL2RhdGEvcGx1Z2luL2RlYnVnZ2VyL2RlYnVnZ2VyX2dyYXBoIixhKTt0aGlzLiQubG9hZGVyLmRhdGFzZXRzPVt7bmFtZToiL2RlYnVnZ2VyX2dyYXBoIixwYXRoOmF9XTt0aGlzLiQubG9hZGVyLnNldCgic2VsZWN0ZWREYXRhc2V0IiwwKX0sX3Byb2Nlc3NHYXRlZEdycGNEZWJ1Z09wcyhhLGMpe2M/Y29uc29sZS5sb2coIlBvbGxpbmcgZm9yIGZpcnN0IEdyYXBoRGVmIGZvciBydW4ga2V5OiIsYSk6dGhpcy5zZXQoIl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lIixudWxsKTt2YXIgZD17bW9kZToicmV0cmlldmVfYWxsIixydW5fa2V5OkpTT04uc3RyaW5naWZ5KGEpfTtjb25zdCBmPVFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9nYXRlZF9ncnBjIik7ZD1Rby5hZGRQYXJhbXMoZiwKZCk7bGV0IGc9W107dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChkKS50aGVuKGw9PntpZigwPT1sLmRldmljZV9uYW1lcy5sZW5ndGgpY3x8dGhpcy5fc3RlcCgpLHRoaXMuX3Byb2Nlc3NHYXRlZEdycGNEZWJ1Z09wcyhhLCEwKTtlbHNle3ZhciBrPW51bGw7Zm9yKGNvbnN0IG4gaW4gbC5nYXRlZF9ncnBjX3RlbnNvcnMpaWYobC5nYXRlZF9ncnBjX3RlbnNvcnMuaGFzT3duUHJvcGVydHkobikpey0xPT09dGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1thXS5pbmRleE9mKG4pJiYodGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1thXS5wdXNoKG4pLHRoaXMuJC5zZXNzaW9uUnVuc1ZpZXcudXBkYXRlTnVtRGV2aWNlcyh0aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2FdLmxlbmd0aCkpO3RoaXMuc2V0KCJfYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMiLHRoaXMuX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXNbYV0uc2xpY2UoKSk7az10aGlzLl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlc1t0aGlzLl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcy5sZW5ndGgtCjFdO2NvbnN0IHA9bC5nYXRlZF9ncnBjX3RlbnNvcnNbbl07Zm9yKGxldCBxPTA7cTxwLmxlbmd0aDsrK3EpZy5wdXNoKHtkZXZpY2VfbmFtZTpuLG5vZGVfbmFtZTpwW3FdWzBdLG9wX3R5cGU6cFtxXVsxXSxvdXRwdXRfc2xvdDpwW3FdWzJdLGRlYnVnX29wOnBbcV1bM119KX1udWxsIT1rJiYodGhpcy5zZXQoIl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lIixrKSxsPVBvbHltZXIuZG9tKHRoaXMuJCQoIiNhY3RpdmUtcnVudGltZS1ncmFwaC1kZXZpY2UtbmFtZSIpKSxudWxsIT1sJiZsLnNldEF0dHJpYnV0ZSgic2VsZWN0ZWQiLGspKTtncC5zb3J0QW5kQmFzZUV4cGFuZERlYnVnV2F0Y2hlcyhnKTt0aGlzLnNldCgiX2RlYnVnV2F0Y2hlcyIsZyk7dGhpcy4kLnNvdXJjZUNvZGVWaWV3LnJlbmRlcihnKX19KX0sX2NyZWF0ZURlYnVnV2F0Y2hDaGFuZ2VIYW5kbGVyKCl7cmV0dXJuKGEsYyk9PntjPWM/ImJyZWFrIjoiZGlzYWJsZSI7dGhpcy5fcmVxdWVzdEJyZWFrcG9pbnRTdGF0ZUNoYW5nZShncC5nZXRDbGVhbk5vZGVOYW1lKGEuZGV2aWNlX25hbWUrCiIvIithLm5vZGVfbmFtZSksYS5vdXRwdXRfc2xvdCxhLmRlYnVnX29wLGMpfX0sX2ZvY3VzT25HcmFwaE5vZGUoYSxjKXtudWxsIT1hJiZ0aGlzLl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lIT09YSYmdGhpcy5zZXQoIl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lIixhKTt0aGlzLl9zZXRUb3BSaWdodFJ1bnRpbWVHcmFwaHNUb0FjdGl2ZSgpO2NvbnN0IGQ9dGhpcy4kJCgiI2dyYXBoIik7aWYoZC5zZWxlY3RlZE5vZGU9PT1jKWQucGFuVG9Ob2RlKGMpO2Vsc2V7Y29uc3QgZj1kLmdldCgicmVuZGVySGllcmFyY2h5IikuaGllcmFyY2h5LmdldE5vZGVNYXAoKTtudWxsPT1mW2NdJiYoYz1ncC5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oYykpO251bGwhPWZbY10mJmQuc2V0KCJzZWxlY3RlZE5vZGUiLGMpfXRoaXMuc2V0KCJfaGlnaGxpZ2h0Tm9kZU5hbWUiLGErIi8iK2MpfSxfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCl7cmV0dXJuKGEsYyxkKT0+e3RoaXMuX3NvdXJjZUNvZGVTaG93biYmCiEwIT09ZCYmdGhpcy5zZXQoIl9zb3VyY2VGb2N1c05vZGVOYW1lIixncC5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oYykpO3RoaXMuX2ZvY3VzT25HcmFwaE5vZGUoYSxjKTt0aGlzLnNldCgiX2ZvcmNlRXhwYW5kTm9kZU5hbWUiLGErIi8iK2MpfX0sX2NyZWF0ZUZlZWRGZXRjaFRhcmdldENsaWNrZWRIYW5kbGVyKCl7cmV0dXJuIGE9PntsZXQgYz1hOy0xIT09Yy5pbmRleE9mKCI6IikmJihjPWMuc2xpY2UoMCxjLmluZGV4T2YoIjoiKSkpO2E9Xy5maW5kKHRoaXMuX2RlYnVnV2F0Y2hlcyxkPT5kLm5vZGVfbmFtZT09PWN8fDA9PT1kLm5vZGVfbmFtZS5pbmRleE9mKGMpJiYiKCI9PT1kLm5vZGVfbmFtZVtjLmxlbmd0aF0pO251bGw9PWE/dGhpcy5fc2hvd1RvYXN0KCJOb2RlICciK2MrIicgaXMgbm90IGluIHRoZSBydW50aW1lIGdyYXBoIG9mIHRoZSBjdXJyZW50IFNlc3Npb24ucnVuIG9yIGRvZXMgbm90IGhhdmUgYSBkZWJ1ZyBvcCBhdHRhY2hlZC4iKTp0aGlzLl9mb2N1c09uR3JhcGhOb2RlKGEuZGV2aWNlX25hbWUsCmMpfX0sX2NyZWF0ZVRlbnNvckRhdGFFeHBhbmRIYW5kbGVyKCl7cmV0dXJuIGE9Pnt0aGlzLl9zZXRUb3BSaWdodFRlbnNvclZhbHVlc1RvQWN0aXZlKCk7c2V0VGltZW91dCgoKT0+e3RoaXMuJCQoIiN0ZW5zb3JWYWx1ZU11bHRpVmlldyIpLmFkZFZpZXcoe3ZpZXdJZDp0aGlzLl9jcmVhdGVUZW5zb3JWaWV3SWQoKSxkZXZpY2VOYW1lOmEuZGV2aWNlTmFtZSx0ZW5zb3JOYW1lOmEudGVuc29yTmFtZSxub2RlTmFtZTphLm5vZGVOYW1lLG1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWU6YS5tYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lLGRlYnVnT3A6YS5kZWJ1Z09wLGR0eXBlOmEuZHR5cGUsc2hhcGU6YS5zaGFwZSxzbGljaW5nOmdwLmdldERlZmF1bHRTbGljaW5nKGEuc2hhcGUpLHRpbWVJbmRpY2VzOiItMSJ9KX0sMTApfX0sX2NyZWF0ZVRlbnNvclZpZXdJZCgpe2NvbnN0IGE9ImRlYnVnZ2VyLXRlbnNvci12aWV3LSIrdGhpcy5fdGVuc29yVmlld0lkQ291bnRlcjt0aGlzLl90ZW5zb3JWaWV3SWRDb3VudGVyKys7CnJldHVybiBhfSxfY3JlYXRlTm9kZUNvbnRleHRNZW51SXRlbXMoKXtyZXR1cm5be3RpdGxlOigpPT4iRXhwYW5kIGFuZCBoaWdobGlnaHQiLGFjdGlvbjphPT57Y29uc3QgYz1ncC5nZXRDbGVhbk5vZGVOYW1lKGEubm9kZS5uYW1lKTthPXRoaXMuX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWUrIi8iK2Eubm9kZS5uYW1lO3RoaXMuc2V0KCJfZm9yY2VFeHBhbmROb2RlTmFtZSIsYSk7dGhpcy5zZXQoIl9oaWdobGlnaHROb2RlTmFtZSIsYSk7dGhpcy5fc291cmNlQ29kZVNob3duJiZ0aGlzLnNldCgiX3NvdXJjZUZvY3VzTm9kZU5hbWUiLGdwLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihjKSl9fSx7dGl0bGU6KCk9PiJBZGQgYnJlYWtwb2ludCIsYWN0aW9uOmE9Pntjb25zdCBjPWdwLmdldENsZWFuTm9kZU5hbWUoYS5ub2RlLm5hbWUpO3RoaXMuc2V0KCJfZm9yY2VFeHBhbmRBbmRDaGVja05vZGVOYW1lIix0aGlzLl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lKwoiLyIrYS5ub2RlLm5hbWUpO3RoaXMuX3NvdXJjZUNvZGVTaG93biYmdGhpcy5zZXQoIl9zb3VyY2VGb2N1c05vZGVOYW1lIixncC5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oYykpfX0se3RpdGxlOigpPT4iQ29udGludWUgdG8iLGFjdGlvbjphPT57LTEhPT1bIl9BcmciLCJfUmV0dmFsIl0uaW5kZXhPZihhLm5vZGUub3ApP3RoaXMuX3Nob3dUb2FzdCgnQ2Fubm90IGNvbnRpbnVlIHRvIG5vZGUgIicrYS5ub2RlLm5hbWUrJyIsIGR1ZSB0byBvcCB0eXBlICInK2Eubm9kZS5vcCsnIi4nKTp0aGlzLl9jb250aW51ZVRvTm9kZSh0aGlzLl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lLGEubm9kZS5uYW1lKX19XX0sX2NyZWF0ZUdldEhlYWx0aFBpbGwoKXtyZXR1cm4oYSxjLGQsZik9Pnt2YXIgZz17d2F0Y2hfa2V5OmEsdGltZV9pbmRpY2VzOiItMSIsbWFwcGluZzoiaGVhbHRoLXBpbGwifTtjb25zdCBsPVFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsCiIvdGVuc29yX2RhdGEiKTtnPVFvLmFkZFBhcmFtcyhsLGcpO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZykudGhlbihrPT57az1rLnRlbnNvcl9kYXRhWzBdO2Yoayk7dGhpcy5fY29uZGl0aW9uYWxIZWFsdGhQaWxsU3RvcChhLGMsZCxrKX0pfX0sX2NvbmRpdGlvbmFsSGVhbHRoUGlsbFN0b3AoYSxjLGQsZil7aWYoIlRlbnNvckNvbmRpdGlvbiI9PT10aGlzLl9jb250aW51ZVRvVHlwZSYmZ3AuY2hlY2tIZWFsdGhQaWxsQWdhaW5zdFRlbnNvckNvbmRpdGlvbktleSh0aGlzLl9jb250aW51ZVRvVGFyZ2V0LGYsdGhpcy5fY29udGludWVUb0NvdW50ZXJUYXJnZXQpKXt0aGlzLnNldCgiX2NvbnRpbnVlU3RvcCIsITApO2Y9Z3AucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGQpO3RoaXMuX3NvdXJjZUNvZGVTaG93biYmdGhpcy5zZXQoIl9zb3VyY2VGb2N1c05vZGVOYW1lIixmKTt0aGlzLl9mb2N1c09uR3JhcGhOb2RlKGMsZCk7Y29uc3QgZz1jKyIvIitkO3RoaXMuc2V0KCJfZm9yY2VFeHBhbmROb2RlTmFtZSIsCmcpO3NldFRpbWVvdXQoKCk9Pnt0aGlzLnNldCgiX2hpZ2hsaWdodE5vZGVOYW1lIixudWxsKTt0aGlzLnNldCgiX2hpZ2hsaWdodE5vZGVOYW1lIixnKX0sMTAwKTt0aGlzLl9zaG93VG9hc3QoJ1RlbnNvciBjb25kaXRpb24gIicrdGhpcy5fY29udGludWVUb1RhcmdldCsnIiBpcyBtZXQgYnkgd2F0Y2gga2V5OiAiJythKyciLlxuU3RvcHBpbmcgY29udGludWF0aW9uLicpfX0sX2NvbnRpbnVlVG9Ob2RlKGEsYyl7Y29uc3QgZD1ncC5nZXRDbGVhbk5vZGVOYW1lKGMpO2E9YSsiLyIrYzt0aGlzLl9yZXF1ZXN0QnJlYWtwb2ludFN0YXRlQ2hhbmdlKGQsMCwiRGVidWdJZGVudGl0eSIsImJyZWFrIik7dGhpcy5zZXQoIl9mb3JjZUV4cGFuZEFuZENoZWNrTm9kZU5hbWUiLGEpO3RoaXMuX3NvdXJjZUNvZGVTaG93biYmdGhpcy5zZXQoIl9zb3VyY2VGb2N1c05vZGVOYW1lIixncC5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oZCkpO3RoaXMuX3NldENvbnRpbnVlVG8oIm9wIixhKTsKdGhpcy4kLmNvbnRpbnVlRGlhbG9nLnVwZGF0ZUNvbnRpbnVlQnV0dG9uVGV4dCghMCk7dGhpcy5fc3RlcCgpfSxfY3JlYXRlQ29udGludWVUb05vZGVIYW5kbGVyKCl7cmV0dXJuKGEsYyk9Pnt0aGlzLl9jb250aW51ZVRvTm9kZShhLGMpfX0sX29uQWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZUNoYW5nZShhKXtjb25zdCBjPVBvbHltZXIuZG9tKHRoaXMuJCQoIiNydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIikpO2lmKDA8dGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMubGVuZ3RoKXtsZXQgZDtkPWErKCIgKGRldmljZSAiKyh0aGlzLl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcy5pbmRleE9mKGEpKzEpKyIgb2YgIit0aGlzLl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcy5sZW5ndGgrIikiKTt0aGlzLl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSYmbnVsbCE9YyYmKGMudGV4dENvbnRlbnQ9ZCl9ZWxzZSB0aGlzLl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSYmCm51bGwhPWMmJihjLnRleHRDb250ZW50PSJXYWl0aW5nIGZvciBkZXZpY2UuLi4iKTtudWxsIT1hJiZ0aGlzLl9kaXNwbGF5R3JhcGgodGhpcy5fYWN0aXZlU2Vzc2lvblJ1bktleSxhKX0sX3N0ZXAoKXtpZihudWxsIT10aGlzLl9hY3RpdmVTZXNzaW9uUnVuS2V5KXt0aGlzLnNldCgiX2J1c3kiLCEwKTt2YXIgYT17bW9kZToicmV0cmlldmVfZGV2aWNlX25hbWVzIixydW5fa2V5OkpTT04uc3RyaW5naWZ5KHRoaXMuX2FjdGl2ZVNlc3Npb25SdW5LZXkpfSxjPVFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9nYXRlZF9ncnBjIik7YT1Rby5hZGRQYXJhbXMoYyxhKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGEpLnRoZW4oZD0+e2xldCBmPSExO2ZvcihsZXQgZz0wO2c8ZC5kZXZpY2VfbmFtZXMubGVuZ3RoOysrZylpZigtMT09PXRoaXMuX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzLmluZGV4T2YoZC5kZXZpY2VfbmFtZXNbZ10pKXtmPSEwO2JyZWFrfWQ9ClFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9hY2siKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGQpLnRoZW4oKCk9PntmJiZ0aGlzLl9wcm9jZXNzR2F0ZWRHcnBjRGVidWdPcHModGhpcy5fYWN0aXZlU2Vzc2lvblJ1bktleSwhMSl9KX0pfX0sX2NyZWF0ZVNlc3Npb25SdW5Hbygpe3JldHVybiBhPT57dGhpcy5fc2V0Q29udGludWVUbygiU2Vzc2lvblJ1biIsdGhpcy5fY3VycmVudFNlc3Npb25SdW5JbmZvLGEpO3RoaXMuX3N0ZXAoKX19LF9jcmVhdGVUZW5zb3JDb25kaXRpb25Hbygpe3JldHVybihhLGMpPT57dGhpcy5fc2V0Q29udGludWVUbygiVGVuc29yQ29uZGl0aW9uIixhLGMpO3RoaXMuJC50ZW5zb3JEYXRhU3VtbWFyeS5lbmFibGVIZWFsdGhQaWxscygpO3RoaXMuX3N0ZXAoKX19LF9jcmVhdGVGb3JjZUNvbnRpbnVhdGlvblN0b3AoKXtyZXR1cm4oKT0+e3RoaXMuX3Nob3dUb2FzdCgnQ29udGludWF0aW9uIG9mIHR5cGUgIicrdGhpcy5fY29udGludWVUb1R5cGUrCiciIHdhcyBpbnRlcnJ1cHRlZCBieSB1c2VyLicpO3RoaXMuc2V0KCJfY29udGludWVTdG9wIiwhMCl9fSxfc2V0Q29udGludWVUbyhhLGMsZD0tMSl7dGhpcy5fY29udGludWVUb1R5cGU9YTt0aGlzLl9jb250aW51ZVRvVGFyZ2V0PWM7dGhpcy5fY29udGludWVUb0NvdW50ZXJUYXJnZXQ9ZDt0aGlzLl9jb250aW51ZVRvQ291bnRlcj0wO3RoaXMuX2NvbnRpbnVlU3RvcD0hMX0sX2NsZWFyQ29udGludWVUbygpe3RoaXMuJC5jb250aW51ZURpYWxvZy5ub3RpZnlDb250aW51YXRpb25TdG9wKCk7dGhpcy5fY29udGludWVUb1RhcmdldD10aGlzLl9jb250aW51ZVRvVHlwZT0iIjt0aGlzLl9jb250aW51ZVRvQ291bnRlclRhcmdldD0tMTt0aGlzLl9jb250aW51ZVRvQ291bnRlcj0wO3RoaXMuX2NvbnRpbnVlU3RvcD0hMTt0aGlzLnNldCgiX2J1c3kiLCExKX0sX2NyZWF0ZUNvbnRpbnVlVG9DYWxsYmFjaygpe3JldHVybihhLGMpPT57dGhpcy5fc2V0Q29udGludWVUbygib3AiLGErIi8iKwpjKTt0aGlzLl9zdGVwKCk7dGhpcy5faXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUmJnRoaXMuX2ZvY3VzT25HcmFwaE5vZGUoYSxjKTt0aGlzLnNldCgiX2ZvcmNlRXhwYW5kTm9kZU5hbWUiLGErIi8iK2MpfX0sX3RvcFJpZ2h0U2VsZWN0ZWRDaGFuZ2VkKGEpe2E9dGhpcy5fdG9wUmlnaHRUYWJzW2FdLmlkO3RoaXMuc2V0KCJfaXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUiLCJ0YWItcnVudGltZS1ncmFwaHMiPT09YSk7dGhpcy5zZXQoIl9pc1RvcFJpZ2h0VGVuc29yVmFsdWVzQWN0aXZlIiwidGFiLXRlbnNvci12YWx1ZXMiPT09YSl9LF9zZXRUb3BSaWdodFJ1bnRpbWVHcmFwaHNUb0FjdGl2ZSgpe3RoaXMuc2V0KCJfdG9wUmlnaHRTZWxlY3RlZCIsIjAiKTt0aGlzLnNldCgiX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlIiwhMCk7dGhpcy5zZXQoIl9pc1RvcFJpZ2h0VGVuc29yVmFsdWVzQWN0aXZlIiwhMSl9LF9zZXRUb3BSaWdodFRlbnNvclZhbHVlc1RvQWN0aXZlKCl7dGhpcy5zZXQoIl90b3BSaWdodFNlbGVjdGVkIiwKIjEiKTt0aGlzLnNldCgiX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlIiwhMSk7dGhpcy5zZXQoIl9pc1RvcFJpZ2h0VGVuc29yVmFsdWVzQWN0aXZlIiwhMCl9LF9yZXF1ZXN0QnJlYWtwb2ludFN0YXRlQ2hhbmdlKGEsYyxkLGYpe2E9e21vZGU6InNldF9zdGF0ZSIsbm9kZV9uYW1lOmEsb3V0cHV0X3Nsb3Q6YyxkZWJ1Z19vcDpkLHN0YXRlOmZ9O2M9UW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL2dhdGVkX2dycGMiKTthPVFvLmFkZFBhcmFtcyhjLGEpO3RoaXMuc2V0KCJfYnVzeSIsITApO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihnPT57dGhpcy5zZXQoIl9idXN5IiwhMSk7Y29uc29sZS5sb2coIkJyZWFrcG9pbnQgc2V0X3N0YXRlIHJlc3BvbnNlOiAiLGcpfSl9LF9ncmFwaFByb2dyZXNzVXBkYXRlZChhKXtjb25zdCBjPXRoaXMuJCQoIiN0b3AtcmlnaHQtcHJvZ3Jlc3MtYmFyIik7bnVsbD09dGhpcy5fbGF0ZXN0U2Vzc2lvblJ1bj8KKGMuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsMCksdGhpcy5zZXQoIl9idXN5IiwhMSkpOihjLnNldEF0dHJpYnV0ZSgidmFsdWUiLGEudmFsdWUpLHRoaXMuc2V0KCJfYnVzeSIsMTAwPmEudmFsdWUpKX0sX2hhbmRsZVdpbmRvd1Jlc2l6ZSgpe3RoaXMuc2V0KCJfd2luZG93V2lkdGgiLGxwKCkpO3RoaXMuc2V0KCJfd2luZG93SGVpZ2h0IixrcCgpKTt0aGlzLl9zaXplRGFzaGJvYXJkUmVnaW9ucyh0aGlzLl9sZWZ0UGFuZVdpZHRoLHRoaXMuX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHQsdGhpcy5fd2luZG93V2lkdGgpfSxfY29tcHV0ZU1heGxlZnRQYW5lV2lkdGgoYSxjLGQpe3JldHVybiBhLWMtZH0sX2NvbXB1dGVNYXhUb3BSaWdodFF1YWRyYW50SGVpZ2h0KGEsYyl7cmV0dXJuIGEtYy03MH0sX3NpemVEYXNoYm9hcmRSZWdpb25zKGEsYyxkKXt0aGlzLiQkKCIjbGVmdC1wYW5lIikuc3R5bGUud2lkdGg9YSsicHgiO2E9ZC1hLXRoaXMuX3Jlc2l6ZXJXaWR0aC04O3RoaXMuJCQoIiNjZW50ZXItY29udGVudCIpLnN0eWxlLndpZHRoPQphKyJweCI7YT1jLXRoaXMuX3Jlc2l6ZXJXaWR0aDt0aGlzLiQkKCIjdG9wLXJpZ2h0LXF1YWRyYW50Iikuc3R5bGUuaGVpZ2h0PWErInB4Ijt0aGlzLiQkKCIjdGVuc29yLWRhdGEiKS5zdHlsZS50b3A9YysicHgifSxfbGVmdFBhbmVXaWR0aE9ic2VydmVyOlRvLmdldE51bWJlck9ic2VydmVyKCJfbGVmdFBhbmVXaWR0aCIse2RlZmF1bHRWYWx1ZTo0NTB9KSxfdG9wUmlnaHRRdWFkcmFudEhlaWdodE9ic2VydmVyOlRvLmdldE51bWJlck9ic2VydmVyKCJfdG9wUmlnaHRRdWFkcmFudEhlaWdodCIse2RlZmF1bHRWYWx1ZTptcH0pfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItbWF0ZXJpYWwvcGFwZXItbWF0ZXJpYWwuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItbWF0ZXJpYWwiLHByb3BlcnRpZXM6e2VsZXZhdGlvbjp7dHlwZTpOdW1iZXIscmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOjF9LGFuaW1hdGVkOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQvdGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWdyYXBoLWRlYnVnZ2VyLWRhdGEtY2FyZCIscHJvcGVydGllczp7cmVuZGVySGllcmFyY2h5Ok9iamVjdCxkZWJ1Z2dlck51bWVyaWNBbGVydHM6e3R5cGU6QXJyYXksbm90aWZ5OiEwfSxub2RlTmFtZXNUb0hlYWx0aFBpbGxzOk9iamVjdCxoZWFsdGhQaWxsU3RlcEluZGV4Ont0eXBlOk51bWJlcixub3RpZnk6ITB9LHNwZWNpZmljSGVhbHRoUGlsbFN0ZXA6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSxzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0saGlnaGxpZ2h0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGVjdGVkTm9kZUluY2x1ZGU6e3R5cGU6TnVtYmVyLG5vdGlmeTohMH0sYXJlSGVhbHRoUGlsbHNMb2FkaW5nOkJvb2xlYW4saGVhbHRoUGlsbEVudHJpZXM6e3R5cGU6QXJyYXksdmFsdWU6dGYuZ3JhcGguc2NlbmUuaGVhbHRoUGlsbEVudHJpZXMscmVhZE9ubHk6ITB9LGhlYWx0aFBpbGxWYWx1ZXNGb3JTZWxlY3RlZE5vZGU6e3R5cGU6QXJyYXksCmNvbXB1dGVkOiJfY29tcHV0ZUhlYWx0aFBpbGxGb3JOb2RlKG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMsIGhlYWx0aFBpbGxTdGVwSW5kZXgsIHNlbGVjdGVkTm9kZSwgYWxsU3RlcHNNb2RlRW5hYmxlZCwgYXJlSGVhbHRoUGlsbHNMb2FkaW5nKSJ9LGFsbFN0ZXBzTW9kZUVuYWJsZWQ6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITB9LF9iaWdnZXN0U3RlcEV2ZXJTZWVuOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVCaWdnZXN0U3RlcEV2ZXJTZWVuKG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMpIn0sX21heFN0ZXBJbmRleDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4U3RlcEluZGV4KG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMpIn0sX2N1cnJlbnRTdGVwRGlzcGxheVZhbHVlOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVDdXJyZW50U3RlcERpc3BsYXlWYWx1ZShub2RlTmFtZXNUb0hlYWx0aFBpbGxzLCBoZWFsdGhQaWxsU3RlcEluZGV4LCBhbGxTdGVwc01vZGVFbmFibGVkLCBzcGVjaWZpY0hlYWx0aFBpbGxTdGVwLCBhcmVIZWFsdGhQaWxsc0xvYWRpbmcpIn19LApvYnNlcnZlcnM6WyJfdXBkYXRlQWxlcnRzTGlzdChkZWJ1Z2dlck51bWVyaWNBbGVydHMpIl0scmVhZHk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFpbkNvbnRhaW5lciIpLGM9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigidGYtZGFzaGJvYXJkLWxheW91dCAuc2Nyb2xsYmFyIik7YSYmYyYmKGEuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIsYy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIil9LF9oZWFsdGhQaWxsc0F2YWlsYWJsZTpmdW5jdGlvbihhLGMpe3JldHVybiBhJiZjfSxfY29tcHV0ZVRlbnNvckNvdW50U3RyaW5nOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGE/YVtjXS50b0ZpeGVkKDApOiIifSxfY29tcHV0ZUhlYWx0aFBpbGxGb3JOb2RlOmZ1bmN0aW9uKGEsYyxkLGYsZyl7aWYoZ3x8IWQpcmV0dXJuIG51bGw7YT1hW2RdO3JldHVybiBhPyhjPWFbZj8wOmNdKT9jLnZhbHVlLnNsaWNlKDIsOCk6bnVsbDpudWxsfSxfY29tcHV0ZUN1cnJlbnRTdGVwRGlzcGxheVZhbHVlOmZ1bmN0aW9uKGEsCmMsZCxmLGcpe2lmKGQpcmV0dXJuIGYudG9GaXhlZCgwKTtpZihnKXJldHVybiAwO2ZvcihsZXQgbCBpbiBhKXJldHVybiBhW2xdW2NdLnN0ZXAudG9GaXhlZCgwKTtyZXR1cm4gMH0sX2NvbXB1dGVCaWdnZXN0U3RlcEV2ZXJTZWVuOmZ1bmN0aW9uKGEpe2ZvcihsZXQgYyBpbiBhKXJldHVybiBhPWFbY10sTWF0aC5tYXgodGhpcy5fYmlnZ2VzdFN0ZXBFdmVyU2VlbixhW2EubGVuZ3RoLTFdLnN0ZXApO3JldHVybiB0aGlzLl9iaWdnZXN0U3RlcEV2ZXJTZWVufHwwfSxfY29tcHV0ZU1heFN0ZXBJbmRleDpmdW5jdGlvbihhKXtmb3IobGV0IGMgaW4gYSlyZXR1cm4gYVtjXS5sZW5ndGgtMTtyZXR1cm4gMH0sX2hhc0RlYnVnZ2VyTnVtZXJpY0FsZXJ0czpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5sZW5ndGh9LF91cGRhdGVBbGVydHNMaXN0OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuJCQoIiNudW1lcmljLWFsZXJ0cy1ib2R5Iik7aWYoYyl7Yy5pbm5lckhUTUw9IiI7Zm9yKHZhciBkPQowO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgZj1hW2RdLGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKSxsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7bC5pbm5lckhUTUw9dGYuZ3JhcGgudXRpbC5jb21wdXRlSHVtYW5GcmllbmRseVRpbWUoZi5maXJzdF90aW1lc3RhbXApO2wuY2xhc3NMaXN0LmFkZCgiZmlyc3Qtb2ZmZW5zZS10ZCIpO2cuYXBwZW5kQ2hpbGQobCk7bD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO2wuY2xhc3NMaXN0LmFkZCgidGVuc29yLWRldmljZS10ZCIpO3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2suY2xhc3NMaXN0LmFkZCgidGVuc29yLXNlY3Rpb24td2l0aGluLXRhYmxlIik7ay5pbm5lckhUTUw9Zi50ZW5zb3JfbmFtZTt0aGlzLl9hZGRPcEV4cGFuc2lvbkxpc3RlbmVyKGssZi50ZW5zb3JfbmFtZSk7bC5hcHBlbmRDaGlsZChrKTtrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2suY2xhc3NMaXN0LmFkZCgiZGV2aWNlLXNlY3Rpb24td2l0aGluLXRhYmxlIik7CmsuaW5uZXJIVE1MPSIoIitmLmRldmljZV9uYW1lKyIpIjtsLmFwcGVuZENoaWxkKGspO2cuYXBwZW5kQ2hpbGQobCk7bD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLmNsYXNzTGlzdC5hZGQoIm1pbmktaGVhbHRoLXBpbGwiKTtrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7ay5jbGFzc0xpc3QuYWRkKCJtaW5pLWhlYWx0aC1waWxsLXRkIik7ay5hcHBlbmRDaGlsZChsKTtnLmFwcGVuZENoaWxkKGspO2YubmVnX2luZl9ldmVudF9jb3VudCYmKGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iiksay5jbGFzc0xpc3QuYWRkKCJuZWdhdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIiksay5pbm5lckhUTUw9Zi5uZWdfaW5mX2V2ZW50X2NvdW50LGsuc2V0QXR0cmlidXRlKCJ0aXRsZSIsZi5uZWdfaW5mX2V2ZW50X2NvdW50KyIgZXZlbnRzIHdpdGggLVx1MjIxZSIpLGwuYXBwZW5kQ2hpbGQoaykpO2YucG9zX2luZl9ldmVudF9jb3VudCYmKGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksCmsuY2xhc3NMaXN0LmFkZCgicG9zaXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiIpLGsuaW5uZXJIVE1MPWYucG9zX2luZl9ldmVudF9jb3VudCxrLnNldEF0dHJpYnV0ZSgidGl0bGUiLGYucG9zX2luZl9ldmVudF9jb3VudCsiIGV2ZW50cyB3aXRoICtcdTIyMWUiKSxsLmFwcGVuZENoaWxkKGspKTtmLm5hbl9ldmVudF9jb3VudCYmKGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iiksay5jbGFzc0xpc3QuYWRkKCJuYW4tbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIiksay5pbm5lckhUTUw9Zi5uYW5fZXZlbnRfY291bnQsay5zZXRBdHRyaWJ1dGUoInRpdGxlIixmLm5hbl9ldmVudF9jb3VudCsiIGV2ZW50cyB3aXRoIE5hTiIpLGwuYXBwZW5kQ2hpbGQoaykpO1BvbHltZXIuZG9tKGMpLmFwcGVuZENoaWxkKGcpfX19LF9hZGRPcEV4cGFuc2lvbkxpc3RlbmVyOmZ1bmN0aW9uKGEsYyl7YS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9Pnt2YXIgZD10Zi5ncmFwaC5yZW5kZXIuZXhwYW5kVW50aWxOb2RlSXNTaG93bih0aGlzLnJlbmRlckhpZXJhcmNoeSwKYyksZixnPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInRmLWdyYXBoLWluZm8jZ3JhcGgtaW5mbyIpO2cmJihmPWcuc2Nyb2xsSGVpZ2h0LWcuc2Nyb2xsVG9wKTt2YXIgbD10aGlzLnNlbGVjdGVkTm9kZTt0aGlzLnNldCgic2VsZWN0ZWROb2RlIixkKTtkPSgpPT57Zy5zY3JvbGxUb3A9Zy5zY3JvbGxIZWlnaHQtZn07ZyYmKGw/ZCgpOndpbmRvdy5zZXRUaW1lb3V0KGQsMjApKX0pfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLXNjcm9sbC10YXJnZXQtYmVoYXZpb3IvaXJvbi1zY3JvbGwtdGFyZ2V0LWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uU2Nyb2xsVGFyZ2V0QmVoYXZpb3I9e3Byb3BlcnRpZXM6e3Njcm9sbFRhcmdldDp7dHlwZTpIVE1MRWxlbWVudCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZWZhdWx0U2Nyb2xsVGFyZ2V0fX19LG9ic2VydmVyczpbIl9zY3JvbGxUYXJnZXRDaGFuZ2VkKHNjcm9sbFRhcmdldCwgaXNBdHRhY2hlZCkiXSxfc2hvdWxkSGF2ZUxpc3RlbmVyOiEwLF9zY3JvbGxUYXJnZXRDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7dGhpcy5fb2xkU2Nyb2xsVGFyZ2V0JiYodGhpcy5fdG9nZ2xlU2Nyb2xsTGlzdGVuZXIoITEsdGhpcy5fb2xkU2Nyb2xsVGFyZ2V0KSx0aGlzLl9vbGRTY3JvbGxUYXJnZXQ9bnVsbCk7YyYmKCJkb2N1bWVudCI9PT1hP3RoaXMuc2Nyb2xsVGFyZ2V0PXRoaXMuX2RvYzoic3RyaW5nIj09PXR5cGVvZiBhP3RoaXMuc2Nyb2xsVGFyZ2V0PShjPXRoaXMuZG9tSG9zdCkmJmMuJD9jLiRbYV06UG9seW1lci5kb20odGhpcy5vd25lckRvY3VtZW50KS5xdWVyeVNlbGVjdG9yKCIjIisKYSk6dGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpJiYodGhpcy5fb2xkU2Nyb2xsVGFyZ2V0PWEsdGhpcy5fdG9nZ2xlU2Nyb2xsTGlzdGVuZXIodGhpcy5fc2hvdWxkSGF2ZUxpc3RlbmVyLGEpKSl9LF9zY3JvbGxIYW5kbGVyOmZ1bmN0aW9uKCl7fSxnZXQgX2RlZmF1bHRTY3JvbGxUYXJnZXQoKXtyZXR1cm4gdGhpcy5fZG9jfSxnZXQgX2RvYygpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fSxnZXQgX3Njcm9sbFRvcCgpe3JldHVybiB0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCk/dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LnBhZ2VZT2Zmc2V0OnRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcDowfSxnZXQgX3Njcm9sbExlZnQoKXtyZXR1cm4gdGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpP3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5wYWdlWE9mZnNldDp0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxMZWZ0OgowfSxzZXQgX3Njcm9sbFRvcChhKXt0aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cuc2Nyb2xsVG8od2luZG93LnBhZ2VYT2Zmc2V0LGEpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcD1hKX0sc2V0IF9zY3JvbGxMZWZ0KGEpe3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5zY3JvbGxUbyhhLHdpbmRvdy5wYWdlWU9mZnNldCk6dGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpJiYodGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsTGVmdD1hKX0sc2Nyb2xsOmZ1bmN0aW9uKGEsYyl7dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LnNjcm9sbFRvKGEsYyk6dGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpJiYodGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsTGVmdD1hLHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcD1jKX0sZ2V0IF9zY3JvbGxUYXJnZXRXaWR0aCgpe3JldHVybiB0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCk/CnRoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5pbm5lcldpZHRoOnRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldFdpZHRoOjB9LGdldCBfc2Nyb2xsVGFyZ2V0SGVpZ2h0KCl7cmV0dXJuIHRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKT90aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cuaW5uZXJIZWlnaHQ6dGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0SGVpZ2h0OjB9LF9pc1ZhbGlkU2Nyb2xsVGFyZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Nyb2xsVGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnR9LF90b2dnbGVTY3JvbGxMaXN0ZW5lcjpmdW5jdGlvbihhLGMpe2M9Yz09PXRoaXMuX2RvYz93aW5kb3c6YzthP3RoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcnx8KHRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcj10aGlzLl9zY3JvbGxIYW5kbGVyLmJpbmQodGhpcyksYy5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcikpOgp0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXImJihjLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyKSx0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXI9bnVsbCl9LHRvZ2dsZVNjcm9sbExpc3RlbmVyOmZ1bmN0aW9uKGEpe3RoaXMuX3Nob3VsZEhhdmVMaXN0ZW5lcj1hO3RoaXMuX3RvZ2dsZVNjcm9sbExpc3RlbmVyKGEsdGhpcy5zY3JvbGxUYXJnZXQpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1saXN0L2lyb24tbGlzdC5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQKD86aG9uZXxhZDsoPzogVTspPyBDUFUpIE9TIChcZCspLyksYz1hJiY4PD1hWzFdLGQ9bnVsbCE9UG9seW1lci5mbHVzaCxmPWQ/UG9seW1lci5Bc3luYy5hbmltYXRpb25GcmFtZTowLGc9ZD9Qb2x5bWVyLkFzeW5jLmlkbGVQZXJpb2Q6MSxsPWQ/UG9seW1lci5Bc3luYy5taWNyb1Rhc2s6MjtQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvcnx8KFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yPXt9KTtQb2x5bWVyKHtpczoiaXJvbi1saXN0Iixwcm9wZXJ0aWVzOntpdGVtczp7dHlwZTpBcnJheX0sYXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpdGVtIn0saW5kZXhBczp7dHlwZTpTdHJpbmcsdmFsdWU6ImluZGV4In0sc2VsZWN0ZWRBczp7dHlwZTpTdHJpbmcsdmFsdWU6InNlbGVjdGVkIn0sZ3JpZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCwKb2JzZXJ2ZXI6Il9ncmlkQ2hhbmdlZCJ9LHNlbGVjdGlvbkVuYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sc2VsZWN0ZWRJdGVtOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LHNlbGVjdGVkSXRlbXM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sbXVsdGlTZWxlY3Rpb246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sc2Nyb2xsT2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZTowfX0sb2JzZXJ2ZXJzOlsiX2l0ZW1zQ2hhbmdlZChpdGVtcy4qKSIsIl9zZWxlY3Rpb25FbmFibGVkQ2hhbmdlZChzZWxlY3Rpb25FbmFibGVkKSIsIl9tdWx0aVNlbGVjdGlvbkNoYW5nZWQobXVsdGlTZWxlY3Rpb24pIiwiX3NldE92ZXJmbG93KHNjcm9sbFRhcmdldCwgc2Nyb2xsT2Zmc2V0KSJdLGJlaGF2aW9yczpbUG9seW1lci5UZW1wbGF0aXplcixQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcixQb2x5bWVyLklyb25TY3JvbGxUYXJnZXRCZWhhdmlvcixQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvcl0sCl9yYXRpbzouNSxfc2Nyb2xsZXJQYWRkaW5nVG9wOjAsX3Njcm9sbFBvc2l0aW9uOjAsX3BoeXNpY2FsU2l6ZTowLF9waHlzaWNhbEF2ZXJhZ2U6MCxfcGh5c2ljYWxBdmVyYWdlQ291bnQ6MCxfcGh5c2ljYWxUb3A6MCxfdmlydHVhbENvdW50OjAsX2VzdFNjcm9sbEhlaWdodDowLF9zY3JvbGxIZWlnaHQ6MCxfdmlld3BvcnRIZWlnaHQ6MCxfdmlld3BvcnRXaWR0aDowLF9waHlzaWNhbEl0ZW1zOm51bGwsX3BoeXNpY2FsU2l6ZXM6bnVsbCxfZmlyc3RWaXNpYmxlSW5kZXhWYWw6bnVsbCxfY29sbGVjdGlvbjpudWxsLF9sYXN0VmlzaWJsZUluZGV4VmFsOm51bGwsX21heFBhZ2VzOjIsX2ZvY3VzZWRJdGVtOm51bGwsX2ZvY3VzZWRWaXJ0dWFsSW5kZXg6LTEsX2ZvY3VzZWRQaHlzaWNhbEluZGV4Oi0xLF9vZmZzY3JlZW5Gb2N1c2VkSXRlbTpudWxsLF9mb2N1c0JhY2tmaWxsSXRlbTpudWxsLF9pdGVtc1BlclJvdzoxLF9pdGVtV2lkdGg6MCxfcm93SGVpZ2h0OjAsX3RlbXBsYXRlQ29zdDowLApfcGFyZW50TW9kZWw6ITAsZ2V0IF9waHlzaWNhbEJvdHRvbSgpe3JldHVybiB0aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9waHlzaWNhbFNpemV9LGdldCBfc2Nyb2xsQm90dG9tKCl7cmV0dXJuIHRoaXMuX3Njcm9sbFBvc2l0aW9uK3RoaXMuX3ZpZXdwb3J0SGVpZ2h0fSxnZXQgX3ZpcnR1YWxFbmQoKXtyZXR1cm4gdGhpcy5fdmlydHVhbFN0YXJ0K3RoaXMuX3BoeXNpY2FsQ291bnQtMX0sZ2V0IF9oaWRkZW5Db250ZW50U2l6ZSgpe3JldHVybih0aGlzLmdyaWQ/dGhpcy5fcGh5c2ljYWxSb3dzKnRoaXMuX3Jvd0hlaWdodDp0aGlzLl9waHlzaWNhbFNpemUpLXRoaXMuX3ZpZXdwb3J0SGVpZ2h0fSxnZXQgX2l0ZW1zUGFyZW50KCl7cmV0dXJuIFBvbHltZXIuZG9tKFBvbHltZXIuZG9tKHRoaXMuX3VzZXJUZW1wbGF0ZSkucGFyZW50Tm9kZSl9LGdldCBfbWF4U2Nyb2xsVG9wKCl7cmV0dXJuIHRoaXMuX2VzdFNjcm9sbEhlaWdodC10aGlzLl92aWV3cG9ydEhlaWdodCt0aGlzLl9zY3JvbGxPZmZzZXR9LApnZXQgX21heFZpcnR1YWxTdGFydCgpe3ZhciBrPXRoaXMuX2NvbnZlcnRJbmRleFRvQ29tcGxldGVSb3codGhpcy5fdmlydHVhbENvdW50KTtyZXR1cm4gTWF0aC5tYXgoMCxrLXRoaXMuX3BoeXNpY2FsQ291bnQpfSxzZXQgX3ZpcnR1YWxTdGFydChrKXtrPXRoaXMuX2NsYW1wKGssMCx0aGlzLl9tYXhWaXJ0dWFsU3RhcnQpO3RoaXMuZ3JpZCYmKGstPWsldGhpcy5faXRlbXNQZXJSb3cpO3RoaXMuX3ZpcnR1YWxTdGFydFZhbD1rfSxnZXQgX3ZpcnR1YWxTdGFydCgpe3JldHVybiB0aGlzLl92aXJ0dWFsU3RhcnRWYWx8fDB9LHNldCBfcGh5c2ljYWxTdGFydChrKXtrJT10aGlzLl9waHlzaWNhbENvdW50OzA+ayYmKGs9dGhpcy5fcGh5c2ljYWxDb3VudCtrKTt0aGlzLmdyaWQmJihrLT1rJXRoaXMuX2l0ZW1zUGVyUm93KTt0aGlzLl9waHlzaWNhbFN0YXJ0VmFsPWt9LGdldCBfcGh5c2ljYWxTdGFydCgpe3JldHVybiB0aGlzLl9waHlzaWNhbFN0YXJ0VmFsfHwwfSxnZXQgX3BoeXNpY2FsRW5kKCl7cmV0dXJuKHRoaXMuX3BoeXNpY2FsU3RhcnQrCnRoaXMuX3BoeXNpY2FsQ291bnQtMSkldGhpcy5fcGh5c2ljYWxDb3VudH0sc2V0IF9waHlzaWNhbENvdW50KGspe3RoaXMuX3BoeXNpY2FsQ291bnRWYWw9a30sZ2V0IF9waHlzaWNhbENvdW50KCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsQ291bnRWYWx8fDB9LGdldCBfb3B0UGh5c2ljYWxTaXplKCl7cmV0dXJuIDA9PT10aGlzLl92aWV3cG9ydEhlaWdodD9JbmZpbml0eTp0aGlzLl92aWV3cG9ydEhlaWdodCp0aGlzLl9tYXhQYWdlc30sZ2V0IF9pc1Zpc2libGUoKXtyZXR1cm4hKCF0aGlzLm9mZnNldFdpZHRoJiYhdGhpcy5vZmZzZXRIZWlnaHQpfSxnZXQgZmlyc3RWaXNpYmxlSW5kZXgoKXt2YXIgaz10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbDtpZihudWxsPT1rKXt2YXIgbj10aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9zY3JvbGxPZmZzZXQ7dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9az10aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24ocCxxKXtuKz10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQocCk7CmlmKG4+dGhpcy5fc2Nyb2xsUG9zaXRpb24pcmV0dXJuIHRoaXMuZ3JpZD9xLXEldGhpcy5faXRlbXNQZXJSb3c6cTtpZih0aGlzLmdyaWQmJnRoaXMuX3ZpcnR1YWxDb3VudC0xPT09cSlyZXR1cm4gcS1xJXRoaXMuX2l0ZW1zUGVyUm93fSl8fDB9cmV0dXJuIGt9LGdldCBsYXN0VmlzaWJsZUluZGV4KCl7dmFyIGs9dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbDtpZihudWxsPT1rKXtpZih0aGlzLmdyaWQpaz1NYXRoLm1pbih0aGlzLl92aXJ0dWFsQ291bnQsdGhpcy5maXJzdFZpc2libGVJbmRleCt0aGlzLl9lc3RSb3dzSW5WaWV3KnRoaXMuX2l0ZW1zUGVyUm93LTEpO2Vsc2V7dmFyIG49dGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0O3RoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihwLHEpe248dGhpcy5fc2Nyb2xsQm90dG9tJiYoaz1xKTtuKz10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQocCl9KX10aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPWt9cmV0dXJuIGt9LApnZXQgX2RlZmF1bHRTY3JvbGxUYXJnZXQoKXtyZXR1cm4gdGhpc30sZ2V0IF92aXJ0dWFsUm93Q291bnQoKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuX3ZpcnR1YWxDb3VudC90aGlzLl9pdGVtc1BlclJvdyl9LGdldCBfZXN0Um93c0luVmlldygpe3JldHVybiBNYXRoLmNlaWwodGhpcy5fdmlld3BvcnRIZWlnaHQvdGhpcy5fcm93SGVpZ2h0KX0sZ2V0IF9waHlzaWNhbFJvd3MoKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuX3BoeXNpY2FsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpfSxnZXQgX3Njcm9sbE9mZnNldCgpe3JldHVybiB0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3ArdGhpcy5zY3JvbGxPZmZzZXR9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fZGlkRm9jdXMuYmluZCh0aGlzKSwhMCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLHRoaXMuX3JlbmRlcixmKTt0aGlzLmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsCiJfcmVzaXplSGFuZGxlciIpO3RoaXMubGlzdGVuKHRoaXMsImtleWRvd24iLCJfa2V5ZG93bkhhbmRsZXIiKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnVubGlzdGVuKHRoaXMsImlyb24tcmVzaXplIiwiX3Jlc2l6ZUhhbmRsZXIiKTt0aGlzLnVubGlzdGVuKHRoaXMsImtleWRvd24iLCJfa2V5ZG93bkhhbmRsZXIiKX0sX3NldE92ZXJmbG93OmZ1bmN0aW9uKGspe3RoaXMuc3R5bGUud2Via2l0T3ZlcmZsb3dTY3JvbGxpbmc9az09PXRoaXM/InRvdWNoIjoiIjt0aGlzLnN0eWxlLm92ZXJmbG93WT1rPT09dGhpcz8iYXV0byI6IiI7dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1udWxsO3RoaXMuX2RlYm91bmNlKCJfcmVuZGVyIix0aGlzLl9yZW5kZXIsZil9LHVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllczpmdW5jdGlvbigpe3ZhciBrPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpO3RoaXMuX3Njcm9sbGVyUGFkZGluZ1RvcD0KdGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzPzA6cGFyc2VJbnQoa1sicGFkZGluZy10b3AiXSwxMCk7dGhpcy5faXNSVEw9InJ0bCI9PT1rLmRpcmVjdGlvbjt0aGlzLl92aWV3cG9ydFdpZHRoPXRoaXMuJC5pdGVtcy5vZmZzZXRXaWR0aDt0aGlzLl92aWV3cG9ydEhlaWdodD10aGlzLl9zY3JvbGxUYXJnZXRIZWlnaHQ7dGhpcy5ncmlkJiZ0aGlzLl91cGRhdGVHcmlkTWV0cmljcygpfSxfc2Nyb2xsSGFuZGxlcjpmdW5jdGlvbigpe3ZhciBrPU1hdGgubWF4KDAsTWF0aC5taW4odGhpcy5fbWF4U2Nyb2xsVG9wLHRoaXMuX3Njcm9sbFRvcCkpLG49ay10aGlzLl9zY3JvbGxQb3NpdGlvbixwPTA8PW47dGhpcy5fc2Nyb2xsUG9zaXRpb249azt0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPW51bGw7TWF0aC5hYnMobik+dGhpcy5fcGh5c2ljYWxTaXplJiYwPHRoaXMuX3BoeXNpY2FsU2l6ZT8obi09dGhpcy5fc2Nyb2xsT2Zmc2V0LHA9TWF0aC5yb3VuZChuLwp0aGlzLl9waHlzaWNhbEF2ZXJhZ2UpKnRoaXMuX2l0ZW1zUGVyUm93LHRoaXMuX3ZpcnR1YWxTdGFydCs9cCx0aGlzLl9waHlzaWNhbFN0YXJ0Kz1wLHRoaXMuX3BoeXNpY2FsVG9wPU1hdGguZmxvb3IodGhpcy5fdmlydHVhbFN0YXJ0L3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2UsdGhpcy5fdXBkYXRlKCkpOjA8dGhpcy5fcGh5c2ljYWxDb3VudCYmKGs9dGhpcy5fZ2V0UmV1c2FibGVzKHApLHA/KHRoaXMuX3BoeXNpY2FsVG9wPWsucGh5c2ljYWxUb3AsdGhpcy5fdmlydHVhbFN0YXJ0Kz1rLmluZGV4ZXMubGVuZ3RoLHRoaXMuX3BoeXNpY2FsU3RhcnQrPWsuaW5kZXhlcy5sZW5ndGgpOih0aGlzLl92aXJ0dWFsU3RhcnQtPWsuaW5kZXhlcy5sZW5ndGgsdGhpcy5fcGh5c2ljYWxTdGFydC09ay5pbmRleGVzLmxlbmd0aCksdGhpcy5fdXBkYXRlKGsuaW5kZXhlcyxwP251bGw6ay5pbmRleGVzKSx0aGlzLl9kZWJvdW5jZSgiX2luY3JlYXNlUG9vbElmTmVlZGVkIiwKdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQuYmluZCh0aGlzLDApLGwpKX0sX2dldFJldXNhYmxlczpmdW5jdGlvbihrKXt2YXIgbj1bXSxwPXRoaXMuX2hpZGRlbkNvbnRlbnRTaXplKnRoaXMuX3JhdGlvLHE9dGhpcy5fdmlydHVhbFN0YXJ0LHI9dGhpcy5fdmlydHVhbEVuZCx0PXRoaXMuX3BoeXNpY2FsQ291bnQsdj10aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9zY3JvbGxPZmZzZXQ7dmFyIHk9dGhpcy5fcGh5c2ljYWxCb3R0b20rdGhpcy5fc2Nyb2xsT2Zmc2V0O3ZhciB6PXRoaXMuX3Njcm9sbFRvcCx4PXRoaXMuX3Njcm9sbEJvdHRvbTtpZihrKXt2YXIgQz10aGlzLl9waHlzaWNhbFN0YXJ0O3k9ei12fWVsc2UgQz10aGlzLl9waHlzaWNhbEVuZCx5LT14O2Zvcig7Oyl7dmFyIEY9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KEMpO3ktPUY7aWYobi5sZW5ndGg+PXR8fHk8PXApYnJlYWs7aWYoayl7aWYocituLmxlbmd0aCsxPj10aGlzLl92aXJ0dWFsQ291bnQpYnJlYWs7CmlmKHYrRj49ei10aGlzLl9zY3JvbGxPZmZzZXQpYnJlYWs7bi5wdXNoKEMpO3YrPUY7Qz0oQysxKSV0fWVsc2V7aWYoMD49cS1uLmxlbmd0aClicmVhaztpZih2K3RoaXMuX3BoeXNpY2FsU2l6ZS1GPD14KWJyZWFrO24ucHVzaChDKTt2LT1GO0M9MD09PUM/dC0xOkMtMX19cmV0dXJue2luZGV4ZXM6bixwaHlzaWNhbFRvcDp2LXRoaXMuX3Njcm9sbE9mZnNldH19LF91cGRhdGU6ZnVuY3Rpb24oayxuKXtpZighKGsmJjA9PT1rLmxlbmd0aHx8MD09PXRoaXMuX3BoeXNpY2FsQ291bnQpKXt0aGlzLl9tYW5hZ2VGb2N1cygpO3RoaXMuX2Fzc2lnbk1vZGVscyhrKTt0aGlzLl91cGRhdGVNZXRyaWNzKGspO2lmKG4pZm9yKDtuLmxlbmd0aDspaz1uLnBvcCgpLHRoaXMuX3BoeXNpY2FsVG9wLT10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQoayk7dGhpcy5fcG9zaXRpb25JdGVtcygpO3RoaXMuX3VwZGF0ZVNjcm9sbGVyU2l6ZSgpfX0sX2NyZWF0ZVBvb2w6ZnVuY3Rpb24oayl7dGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKTsKdmFyIG4scD1BcnJheShrKTtmb3Iobj0wO248aztuKyspe3ZhciBxPXRoaXMuc3RhbXAobnVsbCk7cFtuXT1xLnJvb3QucXVlcnlTZWxlY3RvcigiKiIpO3RoaXMuX2l0ZW1zUGFyZW50LmFwcGVuZENoaWxkKHEucm9vdCl9cmV0dXJuIHB9LF9pc0NsaWVudEZ1bGw6ZnVuY3Rpb24oKXtyZXR1cm4gMCE9dGhpcy5fc2Nyb2xsQm90dG9tJiZ0aGlzLl9waHlzaWNhbEJvdHRvbS0xPj10aGlzLl9zY3JvbGxCb3R0b20mJnRoaXMuX3BoeXNpY2FsVG9wPD10aGlzLl9zY3JvbGxQb3NpdGlvbn0sX2luY3JlYXNlUG9vbElmTmVlZGVkOmZ1bmN0aW9uKGspe2s9dGhpcy5fY2xhbXAodGhpcy5fcGh5c2ljYWxDb3VudCtrLDMsdGhpcy5fdmlydHVhbENvdW50LXRoaXMuX3ZpcnR1YWxTdGFydCk7az10aGlzLl9jb252ZXJ0SW5kZXhUb0NvbXBsZXRlUm93KGspO2lmKHRoaXMuZ3JpZCl7dmFyIG49ayV0aGlzLl9pdGVtc1BlclJvdztuJiZrLW48PXRoaXMuX3BoeXNpY2FsQ291bnQmJihrKz10aGlzLl9pdGVtc1BlclJvdyk7CmstPW59ay09dGhpcy5fcGh5c2ljYWxDb3VudDtuPU1hdGgucm91bmQoLjUqdGhpcy5fcGh5c2ljYWxDb3VudCk7aWYoISgwPmspKXtpZigwPGspe249d2luZG93LnBlcmZvcm1hbmNlLm5vdygpO1tdLnB1c2guYXBwbHkodGhpcy5fcGh5c2ljYWxJdGVtcyx0aGlzLl9jcmVhdGVQb29sKGspKTtmb3IodmFyIHA9MDtwPGs7cCsrKXRoaXMuX3BoeXNpY2FsU2l6ZXMucHVzaCgwKTt0aGlzLl9waHlzaWNhbENvdW50Kz1rO3RoaXMuX3BoeXNpY2FsU3RhcnQ+dGhpcy5fcGh5c2ljYWxFbmQmJnRoaXMuX2lzSW5kZXhSZW5kZXJlZCh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KSYmdGhpcy5fZ2V0UGh5c2ljYWxJbmRleCh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KTx0aGlzLl9waHlzaWNhbEVuZCYmKHRoaXMuX3BoeXNpY2FsU3RhcnQrPWspO3RoaXMuX3VwZGF0ZSgpO3RoaXMuX3RlbXBsYXRlQ29zdD0od2luZG93LnBlcmZvcm1hbmNlLm5vdygpLW4pL2s7bj1NYXRoLnJvdW5kKC41Kgp0aGlzLl9waHlzaWNhbENvdW50KX10aGlzLl92aXJ0dWFsRW5kPj10aGlzLl92aXJ0dWFsQ291bnQtMXx8MD09PW58fCh0aGlzLl9pc0NsaWVudEZ1bGwoKT90aGlzLl9waHlzaWNhbFNpemU8dGhpcy5fb3B0UGh5c2ljYWxTaXplJiZ0aGlzLl9kZWJvdW5jZSgiX2luY3JlYXNlUG9vbElmTmVlZGVkIix0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZC5iaW5kKHRoaXMsdGhpcy5fY2xhbXAoTWF0aC5yb3VuZCg1MC90aGlzLl90ZW1wbGF0ZUNvc3QpLDEsbikpLGcpOnRoaXMuX2RlYm91bmNlKCJfaW5jcmVhc2VQb29sSWZOZWVkZWQiLHRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkLmJpbmQodGhpcyxuKSxsKSl9fSxfcmVuZGVyOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9pc1Zpc2libGUpaWYoMCE9PXRoaXMuX3BoeXNpY2FsQ291bnQpe3ZhciBrPXRoaXMuX2dldFJldXNhYmxlcyghMCk7dGhpcy5fcGh5c2ljYWxUb3A9ay5waHlzaWNhbFRvcDt0aGlzLl92aXJ0dWFsU3RhcnQrPQprLmluZGV4ZXMubGVuZ3RoO3RoaXMuX3BoeXNpY2FsU3RhcnQrPWsuaW5kZXhlcy5sZW5ndGg7dGhpcy5fdXBkYXRlKGsuaW5kZXhlcyk7dGhpcy5fdXBkYXRlKCk7dGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoMCl9ZWxzZSAwPHRoaXMuX3ZpcnR1YWxDb3VudCYmKHRoaXMudXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzKCksdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoMykpfSxfZW5zdXJlVGVtcGxhdGl6ZWQ6ZnVuY3Rpb24oKXtpZighdGhpcy5jdG9yKXsodGhpcy5fdXNlclRlbXBsYXRlPXRoaXMucXVlcnlFZmZlY3RpdmVDaGlsZHJlbigidGVtcGxhdGUiKSl8fGNvbnNvbGUud2FybigiaXJvbi1saXN0IHJlcXVpcmVzIGEgdGVtcGxhdGUgdG8gYmUgcHJvdmlkZWQgaW4gbGlnaHQtZG9tIik7dmFyIGs9e19fa2V5X186ITB9O2tbdGhpcy5hc109ITA7a1t0aGlzLmluZGV4QXNdPSEwO2tbdGhpcy5zZWxlY3RlZEFzXT0hMDtrLnRhYkluZGV4PSEwO3RoaXMuX2luc3RhbmNlUHJvcHM9Cms7dGhpcy50ZW1wbGF0aXplKHRoaXMuX3VzZXJUZW1wbGF0ZSx0aGlzLm11dGFibGVEYXRhKX19LF9ncmlkQ2hhbmdlZDpmdW5jdGlvbihrLG4peyJ1bmRlZmluZWQiIT09dHlwZW9mIG4mJih0aGlzLm5vdGlmeVJlc2l6ZSgpLFBvbHltZXIuZmx1c2g/UG9seW1lci5mbHVzaCgpOlBvbHltZXIuZG9tLmZsdXNoKCksayYmdGhpcy5fdXBkYXRlR3JpZE1ldHJpY3MoKSl9LF9pdGVtc0NoYW5nZWQ6ZnVuY3Rpb24oayl7aWYoIml0ZW1zIj09PWsucGF0aCl0aGlzLl9waHlzaWNhbFRvcD10aGlzLl92aXJ0dWFsU3RhcnQ9MCx0aGlzLl92aXJ0dWFsQ291bnQ9dGhpcy5pdGVtcz90aGlzLml0ZW1zLmxlbmd0aDowLHRoaXMuX2NvbGxlY3Rpb249dGhpcy5pdGVtcyYmUG9seW1lci5Db2xsZWN0aW9uP1BvbHltZXIuQ29sbGVjdGlvbi5nZXQodGhpcy5pdGVtcyk6bnVsbCx0aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5PXt9LHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9Cm51bGwsdGhpcy5fcGh5c2ljYWxDb3VudD10aGlzLl9waHlzaWNhbENvdW50fHwwLHRoaXMuX3BoeXNpY2FsSXRlbXM9dGhpcy5fcGh5c2ljYWxJdGVtc3x8W10sdGhpcy5fcGh5c2ljYWxTaXplcz10aGlzLl9waHlzaWNhbFNpemVzfHxbXSx0aGlzLl9waHlzaWNhbFN0YXJ0PTAsdGhpcy5fc2Nyb2xsVG9wPnRoaXMuX3Njcm9sbE9mZnNldCYmdGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbigwKSx0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpLHRoaXMuX2RlYm91bmNlKCJfcmVuZGVyIix0aGlzLl9yZW5kZXIsZik7ZWxzZSBpZigiaXRlbXMuc3BsaWNlcyI9PT1rLnBhdGgpe3RoaXMuX2FkanVzdFZpcnR1YWxJbmRleChrLnZhbHVlLmluZGV4U3BsaWNlcyk7dGhpcy5fdmlydHVhbENvdW50PXRoaXMuaXRlbXM/dGhpcy5pdGVtcy5sZW5ndGg6MDtpZihrLnZhbHVlLmluZGV4U3BsaWNlcy5zb21lKGZ1bmN0aW9uKHApe3JldHVybiAwPHAuYWRkZWRDb3VudHx8MDxwLnJlbW92ZWQubGVuZ3RofSkpe3ZhciBuPQp0aGlzLl9nZXRBY3RpdmVFbGVtZW50KCk7dGhpcy5jb250YWlucyhuKSYmbi5ibHVyKCl9az1rLnZhbHVlLmluZGV4U3BsaWNlcy5zb21lKGZ1bmN0aW9uKHApe3JldHVybiBwLmluZGV4K3AuYWRkZWRDb3VudD49dGhpcy5fdmlydHVhbFN0YXJ0JiZwLmluZGV4PD10aGlzLl92aXJ0dWFsRW5kfSx0aGlzKTt0aGlzLl9pc0NsaWVudEZ1bGwoKSYmIWt8fHRoaXMuX2RlYm91bmNlKCJfcmVuZGVyIix0aGlzLl9yZW5kZXIsZil9ZWxzZSJpdGVtcy5sZW5ndGgiIT09ay5wYXRoJiZ0aGlzLl9mb3J3YXJkSXRlbVBhdGgoay5wYXRoLGsudmFsdWUpfSxfZm9yd2FyZEl0ZW1QYXRoOmZ1bmN0aW9uKGssbil7az1rLnNsaWNlKDYpO3ZhciBwPWsuaW5kZXhPZigiLiIpOy0xPT09cCYmKHA9ay5sZW5ndGgpO3ZhciBxLHI9dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pO2lmKGQpe3ZhciB0PXBhcnNlSW50KGsuc3Vic3RyaW5nKDAscCksMTApO2lmKHE9dGhpcy5faXNJbmRleFJlbmRlcmVkKHQpKXt2YXIgdj0KdGhpcy5fZ2V0UGh5c2ljYWxJbmRleCh0KTt2YXIgeT10aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9waHlzaWNhbEl0ZW1zW3ZdKX1lbHNlIHImJih5PXIpO2lmKCF5fHx5W3RoaXMuaW5kZXhBc10hPT10KXJldHVybn1lbHNlIGlmKHQ9ay5zdWJzdHJpbmcoMCxwKSxyJiZyLl9fa2V5X189PT10KXk9cjtlbHNlIGlmKHY9dGhpcy5fcGh5c2ljYWxJbmRleEZvcktleVt0XSx5PXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX3BoeXNpY2FsSXRlbXNbdl0pLCF5fHx5Ll9fa2V5X18hPT10KXJldHVybjtrPWsuc3Vic3RyaW5nKHArMSk7az10aGlzLmFzKyhrPyIuIitrOiIiKTtkP3kuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChrLG4sITEsITApOnkubm90aWZ5UGF0aChrLG4sITApO3kuX2ZsdXNoUHJvcGVydGllcyYmeS5fZmx1c2hQcm9wZXJ0aWVzKCEwKTtxJiYodGhpcy5fdXBkYXRlTWV0cmljcyhbdl0pLHRoaXMuX3Bvc2l0aW9uSXRlbXMoKSx0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoKSl9LApfYWRqdXN0VmlydHVhbEluZGV4OmZ1bmN0aW9uKGspe2suZm9yRWFjaChmdW5jdGlvbihuKXtuLnJlbW92ZWQuZm9yRWFjaCh0aGlzLl9yZW1vdmVJdGVtLHRoaXMpO24uaW5kZXg8dGhpcy5fdmlydHVhbFN0YXJ0JiYobj1NYXRoLm1heChuLmFkZGVkQ291bnQtbi5yZW1vdmVkLmxlbmd0aCxuLmluZGV4LXRoaXMuX3ZpcnR1YWxTdGFydCksdGhpcy5fdmlydHVhbFN0YXJ0Kz1uLDA8PXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgmJih0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4Kz1uKSl9LHRoaXMpfSxfcmVtb3ZlSXRlbTpmdW5jdGlvbihrKXt0aGlzLiQuc2VsZWN0b3IuZGVzZWxlY3Qoayk7dGhpcy5fZm9jdXNlZEl0ZW0mJnRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX2ZvY3VzZWRJdGVtKVt0aGlzLmFzXT09PWsmJnRoaXMuX3JlbW92ZUZvY3VzZWRJdGVtKCl9LF9pdGVyYXRlSXRlbXM6ZnVuY3Rpb24oayxuKXt2YXIgcCxxO2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiZuKWZvcihxPQowO3E8bi5sZW5ndGg7cSsrKXt2YXIgcj1uW3FdO3ZhciB0PXRoaXMuX2NvbXB1dGVWaWR4KHIpO2lmKG51bGwhPShwPWsuY2FsbCh0aGlzLHIsdCkpKXJldHVybiBwfWVsc2V7cj10aGlzLl9waHlzaWNhbFN0YXJ0O2Zvcih0PXRoaXMuX3ZpcnR1YWxTdGFydDtyPHRoaXMuX3BoeXNpY2FsQ291bnQ7cisrLHQrKylpZihudWxsIT0ocD1rLmNhbGwodGhpcyxyLHQpKSlyZXR1cm4gcDtmb3Iocj0wO3I8dGhpcy5fcGh5c2ljYWxTdGFydDtyKyssdCsrKWlmKG51bGwhPShwPWsuY2FsbCh0aGlzLHIsdCkpKXJldHVybiBwfX0sX2NvbXB1dGVWaWR4OmZ1bmN0aW9uKGspe3JldHVybiBrPj10aGlzLl9waHlzaWNhbFN0YXJ0P3RoaXMuX3ZpcnR1YWxTdGFydCsoay10aGlzLl9waHlzaWNhbFN0YXJ0KTp0aGlzLl92aXJ0dWFsU3RhcnQrKHRoaXMuX3BoeXNpY2FsQ291bnQtdGhpcy5fcGh5c2ljYWxTdGFydCkra30sX2Fzc2lnbk1vZGVsczpmdW5jdGlvbihrKXt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24obiwKcCl7dmFyIHE9dGhpcy5fcGh5c2ljYWxJdGVtc1tuXSxyPXRoaXMuaXRlbXMmJnRoaXMuaXRlbXNbcF07aWYobnVsbCE9cil7dmFyIHQ9dGhpcy5tb2RlbEZvckVsZW1lbnQocSk7dC5fX2tleV9fPXRoaXMuX2NvbGxlY3Rpb24/dGhpcy5fY29sbGVjdGlvbi5nZXRLZXkocik6bnVsbDt0aGlzLl9mb3J3YXJkUHJvcGVydHkodCx0aGlzLmFzLHIpO3RoaXMuX2ZvcndhcmRQcm9wZXJ0eSh0LHRoaXMuc2VsZWN0ZWRBcyx0aGlzLiQuc2VsZWN0b3IuaXNTZWxlY3RlZChyKSk7dGhpcy5fZm9yd2FyZFByb3BlcnR5KHQsdGhpcy5pbmRleEFzLHApO3RoaXMuX2ZvcndhcmRQcm9wZXJ0eSh0LCJ0YWJJbmRleCIsdGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleD09PXA/MDotMSk7dGhpcy5fcGh5c2ljYWxJbmRleEZvcktleVt0Ll9fa2V5X19dPW47dC5fZmx1c2hQcm9wZXJ0aWVzJiZ0Ll9mbHVzaFByb3BlcnRpZXMoITApO3EucmVtb3ZlQXR0cmlidXRlKCJoaWRkZW4iKX1lbHNlIHEuc2V0QXR0cmlidXRlKCJoaWRkZW4iLAoiIil9LGspfSxfdXBkYXRlTWV0cmljczpmdW5jdGlvbihrKXtQb2x5bWVyLmZsdXNoP1BvbHltZXIuZmx1c2goKTpQb2x5bWVyLmRvbS5mbHVzaCgpO3ZhciBuPTAscD0wLHE9dGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQscj10aGlzLl9waHlzaWNhbEF2ZXJhZ2U7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKHQpe3ArPXRoaXMuX3BoeXNpY2FsU2l6ZXNbdF07dGhpcy5fcGh5c2ljYWxTaXplc1t0XT10aGlzLl9waHlzaWNhbEl0ZW1zW3RdLm9mZnNldEhlaWdodDtuKz10aGlzLl9waHlzaWNhbFNpemVzW3RdO3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50Kz10aGlzLl9waHlzaWNhbFNpemVzW3RdPzE6MH0sayk7dGhpcy5ncmlkPyh0aGlzLl91cGRhdGVHcmlkTWV0cmljcygpLHRoaXMuX3BoeXNpY2FsU2l6ZT1NYXRoLmNlaWwodGhpcy5fcGh5c2ljYWxDb3VudC90aGlzLl9pdGVtc1BlclJvdykqdGhpcy5fcm93SGVpZ2h0KToocD0xPT09dGhpcy5faXRlbXNQZXJSb3c/cDoKTWF0aC5jZWlsKHRoaXMuX3BoeXNpY2FsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3Jvd0hlaWdodCx0aGlzLl9waHlzaWNhbFNpemU9dGhpcy5fcGh5c2ljYWxTaXplK24tcCx0aGlzLl9pdGVtc1BlclJvdz0xKTt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCE9PXEmJih0aGlzLl9waHlzaWNhbEF2ZXJhZ2U9TWF0aC5yb3VuZCgocipxK24pL3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50KSl9LF91cGRhdGVHcmlkTWV0cmljczpmdW5jdGlvbigpe3RoaXMuX2l0ZW1XaWR0aD0wPHRoaXMuX3BoeXNpY2FsQ291bnQ/dGhpcy5fcGh5c2ljYWxJdGVtc1swXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDoyMDA7dGhpcy5fcm93SGVpZ2h0PTA8dGhpcy5fcGh5c2ljYWxDb3VudD90aGlzLl9waHlzaWNhbEl0ZW1zWzBdLm9mZnNldEhlaWdodDoyMDA7dGhpcy5faXRlbXNQZXJSb3c9dGhpcy5faXRlbVdpZHRoP01hdGguZmxvb3IodGhpcy5fdmlld3BvcnRXaWR0aC90aGlzLl9pdGVtV2lkdGgpOgp0aGlzLl9pdGVtc1BlclJvd30sX3Bvc2l0aW9uSXRlbXM6ZnVuY3Rpb24oKXt0aGlzLl9hZGp1c3RTY3JvbGxQb3NpdGlvbigpO3ZhciBrPXRoaXMuX3BoeXNpY2FsVG9wO2lmKHRoaXMuZ3JpZCl7dmFyIG49KHRoaXMuX3ZpZXdwb3J0V2lkdGgtdGhpcy5faXRlbXNQZXJSb3cqdGhpcy5faXRlbVdpZHRoKS8yO3RoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihwLHEpe3ZhciByPU1hdGguZmxvb3IocSV0aGlzLl9pdGVtc1BlclJvdyp0aGlzLl9pdGVtV2lkdGgrbik7dGhpcy5faXNSVEwmJihyKj0tMSk7dGhpcy50cmFuc2xhdGUzZChyKyJweCIsaysicHgiLDAsdGhpcy5fcGh5c2ljYWxJdGVtc1twXSk7dGhpcy5fc2hvdWxkUmVuZGVyTmV4dFJvdyhxKSYmKGsrPXRoaXMuX3Jvd0hlaWdodCl9KX1lbHNlIHRoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihwKXt0aGlzLnRyYW5zbGF0ZTNkKDAsaysicHgiLDAsdGhpcy5fcGh5c2ljYWxJdGVtc1twXSk7ays9dGhpcy5fcGh5c2ljYWxTaXplc1twXX0pfSwKX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudDpmdW5jdGlvbihrKXtyZXR1cm4gdGhpcy5ncmlkP3RoaXMuX2NvbXB1dGVWaWR4KGspJXRoaXMuX2l0ZW1zUGVyUm93IT09dGhpcy5faXRlbXNQZXJSb3ctMT8wOnRoaXMuX3Jvd0hlaWdodDp0aGlzLl9waHlzaWNhbFNpemVzW2tdfSxfc2hvdWxkUmVuZGVyTmV4dFJvdzpmdW5jdGlvbihrKXtyZXR1cm4gayV0aGlzLl9pdGVtc1BlclJvdz09PXRoaXMuX2l0ZW1zUGVyUm93LTF9LF9hZGp1c3RTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBrPTA9PT10aGlzLl92aXJ0dWFsU3RhcnQ/dGhpcy5fcGh5c2ljYWxUb3A6TWF0aC5taW4odGhpcy5fc2Nyb2xsUG9zaXRpb24rdGhpcy5fcGh5c2ljYWxUb3AsMCk7aWYoMCE9PWspe3RoaXMuX3BoeXNpY2FsVG9wLT1rO3ZhciBuPXRoaXMuX3Njcm9sbFRvcDshYyYmMDxuJiZ0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKG4tayl9fSxfcmVzZXRTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbihrKXt0aGlzLnNjcm9sbFRhcmdldCYmCjA8PWsmJih0aGlzLl9zY3JvbGxQb3NpdGlvbj10aGlzLl9zY3JvbGxUb3A9ayl9LF91cGRhdGVTY3JvbGxlclNpemU6ZnVuY3Rpb24oayl7dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0PXRoaXMuZ3JpZD90aGlzLl92aXJ0dWFsUm93Q291bnQqdGhpcy5fcm93SGVpZ2h0OnRoaXMuX3BoeXNpY2FsQm90dG9tK01hdGgubWF4KHRoaXMuX3ZpcnR1YWxDb3VudC10aGlzLl9waHlzaWNhbENvdW50LXRoaXMuX3ZpcnR1YWxTdGFydCwwKSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2U7aWYoKGs9KGs9KGs9a3x8MD09PXRoaXMuX3Njcm9sbEhlaWdodCl8fHRoaXMuX3Njcm9sbFBvc2l0aW9uPj10aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fcGh5c2ljYWxTaXplKXx8dGhpcy5ncmlkJiZ0aGlzLiQuaXRlbXMuc3R5bGUuaGVpZ2h0PHRoaXMuX2VzdFNjcm9sbEhlaWdodCl8fE1hdGguYWJzKHRoaXMuX2VzdFNjcm9sbEhlaWdodC10aGlzLl9zY3JvbGxIZWlnaHQpPj10aGlzLl92aWV3cG9ydEhlaWdodCl0aGlzLiQuaXRlbXMuc3R5bGUuaGVpZ2h0PQp0aGlzLl9lc3RTY3JvbGxIZWlnaHQrInB4Iix0aGlzLl9zY3JvbGxIZWlnaHQ9dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0fSxzY3JvbGxUb0l0ZW06ZnVuY3Rpb24oayl7cmV0dXJuIHRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLml0ZW1zLmluZGV4T2YoaykpfSxzY3JvbGxUb0luZGV4OmZ1bmN0aW9uKGspe2lmKCEoIm51bWJlciIhPT10eXBlb2Yga3x8MD5rfHxrPnRoaXMuaXRlbXMubGVuZ3RoLTEpJiYoUG9seW1lci5mbHVzaD9Qb2x5bWVyLmZsdXNoKCk6UG9seW1lci5kb20uZmx1c2goKSwwIT09dGhpcy5fcGh5c2ljYWxDb3VudCkpe2s9dGhpcy5fY2xhbXAoaywwLHRoaXMuX3ZpcnR1YWxDb3VudC0xKTtpZighdGhpcy5faXNJbmRleFJlbmRlcmVkKGspfHxrPj10aGlzLl9tYXhWaXJ0dWFsU3RhcnQpdGhpcy5fdmlydHVhbFN0YXJ0PXRoaXMuZ3JpZD9rLTIqdGhpcy5faXRlbXNQZXJSb3c6ay0xO3RoaXMuX21hbmFnZUZvY3VzKCk7dGhpcy5fYXNzaWduTW9kZWxzKCk7dGhpcy5fdXBkYXRlTWV0cmljcygpOwp0aGlzLl9waHlzaWNhbFRvcD1NYXRoLmZsb29yKHRoaXMuX3ZpcnR1YWxTdGFydC90aGlzLl9pdGVtc1BlclJvdykqdGhpcy5fcGh5c2ljYWxBdmVyYWdlO2Zvcih2YXIgbj10aGlzLl9waHlzaWNhbFN0YXJ0LHA9dGhpcy5fdmlydHVhbFN0YXJ0LHE9MCxyPXRoaXMuX2hpZGRlbkNvbnRlbnRTaXplO3A8ayYmcTw9cjspcSs9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KG4pLG49KG4rMSkldGhpcy5fcGh5c2ljYWxDb3VudCxwKys7dGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCEwKTt0aGlzLl9wb3NpdGlvbkl0ZW1zKCk7dGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbih0aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9zY3JvbGxPZmZzZXQrcSk7dGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoMCk7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsfX0sX3Jlc2V0QXZlcmFnZTpmdW5jdGlvbigpe3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50PQp0aGlzLl9waHlzaWNhbEF2ZXJhZ2U9MH0sX3Jlc2l6ZUhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsZnVuY3Rpb24oKXt0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPW51bGw7dGhpcy51cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXMoKTt0aGlzLl9pc1Zpc2libGU/KHRoaXMudG9nZ2xlU2Nyb2xsTGlzdGVuZXIoITApLHRoaXMuX3Jlc2V0QXZlcmFnZSgpLHRoaXMuX3JlbmRlcigpKTp0aGlzLnRvZ2dsZVNjcm9sbExpc3RlbmVyKCExKX0sZil9LHNlbGVjdEl0ZW06ZnVuY3Rpb24oayl7cmV0dXJuIHRoaXMuc2VsZWN0SW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKGspKX0sc2VsZWN0SW5kZXg6ZnVuY3Rpb24oayl7aWYoISgwPmt8fGs+PXRoaXMuX3ZpcnR1YWxDb3VudCkpeyF0aGlzLm11bHRpU2VsZWN0aW9uJiZ0aGlzLnNlbGVjdGVkSXRlbSYmdGhpcy5jbGVhclNlbGVjdGlvbigpO2lmKHRoaXMuX2lzSW5kZXhSZW5kZXJlZChrKSl7dmFyIG49CnRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZ2V0UGh5c2ljYWxJbmRleChrKV0pO24mJihuW3RoaXMuc2VsZWN0ZWRBc109ITApO3RoaXMudXBkYXRlU2l6ZUZvckluZGV4KGspfXRoaXMuJC5zZWxlY3Rvci5zZWxlY3RJbmRleD90aGlzLiQuc2VsZWN0b3Iuc2VsZWN0SW5kZXgoayk6dGhpcy4kLnNlbGVjdG9yLnNlbGVjdCh0aGlzLml0ZW1zW2tdKX19LGRlc2VsZWN0SXRlbTpmdW5jdGlvbihrKXtyZXR1cm4gdGhpcy5kZXNlbGVjdEluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZihrKSl9LGRlc2VsZWN0SW5kZXg6ZnVuY3Rpb24oayl7MD5rfHxrPj10aGlzLl92aXJ0dWFsQ291bnR8fCh0aGlzLl9pc0luZGV4UmVuZGVyZWQoaykmJih0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgoayldKVt0aGlzLnNlbGVjdGVkQXNdPSExLHRoaXMudXBkYXRlU2l6ZUZvckluZGV4KGspKSx0aGlzLiQuc2VsZWN0b3IuZGVzZWxlY3RJbmRleD8KdGhpcy4kLnNlbGVjdG9yLmRlc2VsZWN0SW5kZXgoayk6dGhpcy4kLnNlbGVjdG9yLmRlc2VsZWN0KHRoaXMuaXRlbXNba10pKX0sdG9nZ2xlU2VsZWN0aW9uRm9ySXRlbTpmdW5jdGlvbihrKXtyZXR1cm4gdGhpcy50b2dnbGVTZWxlY3Rpb25Gb3JJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YoaykpfSx0b2dnbGVTZWxlY3Rpb25Gb3JJbmRleDpmdW5jdGlvbihrKXsodGhpcy4kLnNlbGVjdG9yLmlzSW5kZXhTZWxlY3RlZD90aGlzLiQuc2VsZWN0b3IuaXNJbmRleFNlbGVjdGVkKGspOnRoaXMuJC5zZWxlY3Rvci5pc1NlbGVjdGVkKHRoaXMuaXRlbXNba10pKT90aGlzLmRlc2VsZWN0SW5kZXgoayk6dGhpcy5zZWxlY3RJbmRleChrKX0sY2xlYXJTZWxlY3Rpb246ZnVuY3Rpb24oKXt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24oayl7dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1trXSlbdGhpcy5zZWxlY3RlZEFzXT0hMX0pO3RoaXMuJC5zZWxlY3Rvci5jbGVhclNlbGVjdGlvbigpfSwKX3NlbGVjdGlvbkVuYWJsZWRDaGFuZ2VkOmZ1bmN0aW9uKGspeyhrP3RoaXMubGlzdGVuOnRoaXMudW5saXN0ZW4pLmNhbGwodGhpcyx0aGlzLCJ0YXAiLCJfc2VsZWN0aW9uSGFuZGxlciIpfSxfc2VsZWN0aW9uSGFuZGxlcjpmdW5jdGlvbihrKXt2YXIgbj10aGlzLm1vZGVsRm9yRWxlbWVudChrLnRhcmdldCk7aWYobil7dmFyIHA9UG9seW1lci5kb20oaykucGF0aFswXTtrPXRoaXMuX2dldEFjdGl2ZUVsZW1lbnQoKTt2YXIgcT10aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgoblt0aGlzLmluZGV4QXNdKV07aWYoImlucHV0IiE9PXAubG9jYWxOYW1lJiYiYnV0dG9uIiE9PXAubG9jYWxOYW1lJiYic2VsZWN0IiE9PXAubG9jYWxOYW1lKXtwPW4udGFiSW5kZXg7bi50YWJJbmRleD0tMTAwO3ZhciByPWs/ay50YWJJbmRleDotMTtuLnRhYkluZGV4PXA7ayYmcSE9PWsmJnEuY29udGFpbnMoaykmJi0xMDAhPT1yfHx0aGlzLnRvZ2dsZVNlbGVjdGlvbkZvckl0ZW0oblt0aGlzLmFzXSl9fX0sCl9tdWx0aVNlbGVjdGlvbkNoYW5nZWQ6ZnVuY3Rpb24oayl7dGhpcy5jbGVhclNlbGVjdGlvbigpO3RoaXMuJC5zZWxlY3Rvci5tdWx0aT1rfSx1cGRhdGVTaXplRm9ySXRlbTpmdW5jdGlvbihrKXtyZXR1cm4gdGhpcy51cGRhdGVTaXplRm9ySW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKGspKX0sdXBkYXRlU2l6ZUZvckluZGV4OmZ1bmN0aW9uKGspe2lmKCF0aGlzLl9pc0luZGV4UmVuZGVyZWQoaykpcmV0dXJuIG51bGw7dGhpcy5fdXBkYXRlTWV0cmljcyhbdGhpcy5fZ2V0UGh5c2ljYWxJbmRleChrKV0pO3RoaXMuX3Bvc2l0aW9uSXRlbXMoKTtyZXR1cm4gbnVsbH0sX21hbmFnZUZvY3VzOmZ1bmN0aW9uKCl7dmFyIGs9dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleDswPD1rJiZrPHRoaXMuX3ZpcnR1YWxDb3VudD90aGlzLl9pc0luZGV4UmVuZGVyZWQoayk/dGhpcy5fcmVzdG9yZUZvY3VzZWRJdGVtKCk6dGhpcy5fY3JlYXRlRm9jdXNCYWNrZmlsbEl0ZW0oKTowPHRoaXMuX3ZpcnR1YWxDb3VudCYmCjA8dGhpcy5fcGh5c2ljYWxDb3VudCYmKHRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX3BoeXNpY2FsU3RhcnQsdGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleD10aGlzLl92aXJ0dWFsU3RhcnQsdGhpcy5fZm9jdXNlZEl0ZW09dGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9waHlzaWNhbFN0YXJ0XSl9LF9jb252ZXJ0SW5kZXhUb0NvbXBsZXRlUm93OmZ1bmN0aW9uKGspe3RoaXMuX2l0ZW1zUGVyUm93PXRoaXMuX2l0ZW1zUGVyUm93fHwxO3JldHVybiB0aGlzLmdyaWQ/TWF0aC5jZWlsKGsvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX2l0ZW1zUGVyUm93Omt9LF9pc0luZGV4UmVuZGVyZWQ6ZnVuY3Rpb24oayl7cmV0dXJuIGs+PXRoaXMuX3ZpcnR1YWxTdGFydCYmazw9dGhpcy5fdmlydHVhbEVuZH0sX2lzSW5kZXhWaXNpYmxlOmZ1bmN0aW9uKGspe3JldHVybiBrPj10aGlzLmZpcnN0VmlzaWJsZUluZGV4JiZrPD10aGlzLmxhc3RWaXNpYmxlSW5kZXh9LF9nZXRQaHlzaWNhbEluZGV4OmZ1bmN0aW9uKGspe3JldHVybiBkPwoodGhpcy5fcGh5c2ljYWxTdGFydCsoay10aGlzLl92aXJ0dWFsU3RhcnQpKSV0aGlzLl9waHlzaWNhbENvdW50OnRoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbdGhpcy5fY29sbGVjdGlvbi5nZXRLZXkodGhpcy5pdGVtc1trXSldfSxmb2N1c0l0ZW06ZnVuY3Rpb24oayl7dGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0oayl9LF9mb2N1c1BoeXNpY2FsSXRlbTpmdW5jdGlvbihrKXtpZighKDA+a3x8az49dGhpcy5fdmlydHVhbENvdW50KSl7dGhpcy5fcmVzdG9yZUZvY3VzZWRJdGVtKCk7dGhpcy5faXNJbmRleFJlbmRlcmVkKGspfHx0aGlzLnNjcm9sbFRvSW5kZXgoayk7dmFyIG49dGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9nZXRQaHlzaWNhbEluZGV4KGspXSxwPXRoaXMubW9kZWxGb3JFbGVtZW50KG4pLHE7cC50YWJJbmRleD0tMTAwOy0xMDA9PT1uLnRhYkluZGV4JiYocT1uKTtxfHwocT1Qb2x5bWVyLmRvbShuKS5xdWVyeVNlbGVjdG9yKCdbdGFiaW5kZXhceDNkIi0xMDAiXScpKTsKcC50YWJJbmRleD0wO3RoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9aztxJiZxLmZvY3VzKCl9fSxfcmVtb3ZlRm9jdXNlZEl0ZW06ZnVuY3Rpb24oKXt0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSYmdGhpcy5faXRlbXNQYXJlbnQucmVtb3ZlQ2hpbGQodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pO3RoaXMuX2ZvY3VzZWRJdGVtPXRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtPXRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtPW51bGw7dGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXg9dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleD0tMX0sX2NyZWF0ZUZvY3VzQmFja2ZpbGxJdGVtOmZ1bmN0aW9uKCl7dmFyIGs9dGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXg7aWYoISh0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbXx8MD50aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KSl7aWYoIXRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtKXt2YXIgbj10aGlzLnN0YW1wKG51bGwpO3RoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtPQpuLnJvb3QucXVlcnlTZWxlY3RvcigiKiIpO3RoaXMuX2l0ZW1zUGFyZW50LmFwcGVuZENoaWxkKG4ucm9vdCl9dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW09dGhpcy5fcGh5c2ljYWxJdGVtc1trXTt0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSkudGFiSW5kZXg9MDt0aGlzLl9waHlzaWNhbEl0ZW1zW2tdPXRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtO3RoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PWs7dGhpcy50cmFuc2xhdGUzZCgwLCItMTAwMDBweCIsMCx0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSl9fSxfcmVzdG9yZUZvY3VzZWRJdGVtOmZ1bmN0aW9uKCl7aWYodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0mJiEoMD50aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KSl7dGhpcy5fYXNzaWduTW9kZWxzKCk7dmFyIGs9dGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXg9dGhpcy5fZ2V0UGh5c2ljYWxJbmRleCh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KSwKbj10aGlzLl9waHlzaWNhbEl0ZW1zW2tdO2lmKG4pe3ZhciBwPXRoaXMubW9kZWxGb3JFbGVtZW50KG4pLHE9dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pO3BbdGhpcy5hc109PT1xW3RoaXMuYXNdPyh0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT1uLHAudGFiSW5kZXg9LTEsdGhpcy5fcGh5c2ljYWxJdGVtc1trXT10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSx0aGlzLnRyYW5zbGF0ZTNkKDAsIi0xMDAwMHB4IiwwLHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtKSk6KHRoaXMuX3JlbW92ZUZvY3VzZWRJdGVtKCksdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW09bnVsbCk7dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW09bnVsbH19fSxfZGlkRm9jdXM6ZnVuY3Rpb24oayl7az10aGlzLm1vZGVsRm9yRWxlbWVudChrLnRhcmdldCk7dmFyIG49dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fZm9jdXNlZEl0ZW0pLHA9bnVsbCE9PXRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtLApxPXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg7ayYmKG49PT1rP3RoaXMuX2lzSW5kZXhWaXNpYmxlKHEpfHx0aGlzLnNjcm9sbFRvSW5kZXgocSk6KHRoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpLG4mJihuLnRhYkluZGV4PS0xKSxrLnRhYkluZGV4PTAsdGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleD1xPWtbdGhpcy5pbmRleEFzXSx0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleD10aGlzLl9nZXRQaHlzaWNhbEluZGV4KHEpLHRoaXMuX2ZvY3VzZWRJdGVtPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXhdLHAmJiF0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSYmdGhpcy5fdXBkYXRlKCkpKX0sX2tleWRvd25IYW5kbGVyOmZ1bmN0aW9uKGspe3N3aXRjaChrLmtleUNvZGUpe2Nhc2UgNDA6dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleDx0aGlzLl92aXJ0dWFsQ291bnQtMSYmay5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgrCih0aGlzLmdyaWQ/dGhpcy5faXRlbXNQZXJSb3c6MSkpO2JyZWFrO2Nhc2UgMzk6dGhpcy5ncmlkJiZ0aGlzLl9mb2N1c1BoeXNpY2FsSXRlbSh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4Kyh0aGlzLl9pc1JUTD8tMToxKSk7YnJlYWs7Y2FzZSAzODowPHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgmJmsucHJldmVudERlZmF1bHQoKTt0aGlzLl9mb2N1c1BoeXNpY2FsSXRlbSh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4LSh0aGlzLmdyaWQ/dGhpcy5faXRlbXNQZXJSb3c6MSkpO2JyZWFrO2Nhc2UgMzc6dGhpcy5ncmlkJiZ0aGlzLl9mb2N1c1BoeXNpY2FsSXRlbSh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4Kyh0aGlzLl9pc1JUTD8xOi0xKSk7YnJlYWs7Y2FzZSAxMzp0aGlzLl9mb2N1c1BoeXNpY2FsSXRlbSh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KSx0aGlzLnNlbGVjdGlvbkVuYWJsZWQmJnRoaXMuX3NlbGVjdGlvbkhhbmRsZXIoayl9fSxfY2xhbXA6ZnVuY3Rpb24oaywKbixwKXtyZXR1cm4gTWF0aC5taW4ocCxNYXRoLm1heChuLGspKX0sX2RlYm91bmNlOmZ1bmN0aW9uKGssbixwKXtkPyh0aGlzLl9kZWJvdW5jZXJzPXRoaXMuX2RlYm91bmNlcnN8fHt9LHRoaXMuX2RlYm91bmNlcnNba109UG9seW1lci5EZWJvdW5jZXIuZGVib3VuY2UodGhpcy5fZGVib3VuY2Vyc1trXSxwLG4uYmluZCh0aGlzKSksUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyKHRoaXMuX2RlYm91bmNlcnNba10pKTpQb2x5bWVyLmRvbS5hZGREZWJvdW5jZXIodGhpcy5kZWJvdW5jZShrLG4pKX0sX2ZvcndhcmRQcm9wZXJ0eTpmdW5jdGlvbihrLG4scCl7ZD9rLl9zZXRQZW5kaW5nUHJvcGVydHkobixwKTprW25dPXB9LF9mb3J3YXJkSG9zdFByb3BWMjpmdW5jdGlvbihrLG4peyh0aGlzLl9waHlzaWNhbEl0ZW1zfHxbXSkuY29uY2F0KFt0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSx0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbV0pLmZvckVhY2goZnVuY3Rpb24ocCl7cCYmdGhpcy5tb2RlbEZvckVsZW1lbnQocCkuZm9yd2FyZEhvc3RQcm9wKGssCm4pfSx0aGlzKX0sX25vdGlmeUluc3RhbmNlUHJvcFYyOmZ1bmN0aW9uKGssbixwKXtQb2x5bWVyLlBhdGgubWF0Y2hlcyh0aGlzLmFzLG4pJiYoaz1rW3RoaXMuaW5kZXhBc10sbj09dGhpcy5hcyYmKHRoaXMuaXRlbXNba109cCksdGhpcy5ub3RpZnlQYXRoKFBvbHltZXIuUGF0aC50cmFuc2xhdGUodGhpcy5hcywiaXRlbXMuIitrLG4pLHApKX0sX2dldFN0YW1wZWRDaGlsZHJlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9waHlzaWNhbEl0ZW1zfSxfZm9yd2FyZEluc3RhbmNlUGF0aDpmdW5jdGlvbihrLG4scCl7MD09PW4uaW5kZXhPZih0aGlzLmFzKyIuIikmJnRoaXMubm90aWZ5UGF0aCgiaXRlbXMuIitrLl9fa2V5X18rIi4iK24uc2xpY2UodGhpcy5hcy5sZW5ndGgrMSkscCl9LF9mb3J3YXJkUGFyZW50UGF0aDpmdW5jdGlvbihrLG4peyh0aGlzLl9waHlzaWNhbEl0ZW1zfHxbXSkuY29uY2F0KFt0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSx0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbV0pLmZvckVhY2goZnVuY3Rpb24ocCl7cCYmCnRoaXMubW9kZWxGb3JFbGVtZW50KHApLm5vdGlmeVBhdGgoayxuLCEwKX0sdGhpcyl9LF9mb3J3YXJkUGFyZW50UHJvcDpmdW5jdGlvbihrLG4peyh0aGlzLl9waHlzaWNhbEl0ZW1zfHxbXSkuY29uY2F0KFt0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSx0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbV0pLmZvckVhY2goZnVuY3Rpb24ocCl7cCYmKHRoaXMubW9kZWxGb3JFbGVtZW50KHApW2tdPW4pfSx0aGlzKX0sX2dldEFjdGl2ZUVsZW1lbnQ6ZnVuY3Rpb24oKXt2YXIgaz10aGlzLl9pdGVtc1BhcmVudC5ub2RlLmRvbUhvc3Q7cmV0dXJuIFBvbHltZXIuZG9tKGs/ay5yb290OmRvY3VtZW50KS5hY3RpdmVFbGVtZW50fX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1pdGVtL3BhcGVyLWl0ZW0tYm9keS5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1pdGVtLWJvZHkifSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3RmLWdyYXBoLWljb24uanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7bGV0IGY7KGZ1bmN0aW9uKGcpe2cuQ09OU1Q9IkNPTlNUIjtnLk1FVEE9Ik1FVEEiO2cuT1A9Ik9QIjtnLlNFUklFUz0iU0VSSUVTIjtnLlNVTU1BUlk9IlNVTU1BUlkifSkoZj1kLkdyYXBoSWNvblR5cGV8fChkLkdyYXBoSWNvblR5cGU9e30pKTtQb2x5bWVyKHtpczoidGYtZ3JhcGgtaWNvbiIscHJvcGVydGllczp7dHlwZTpTdHJpbmcsdmVydGljYWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZmlsbE92ZXJyaWRlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxzdHJva2VPdmVycmlkZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0saGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZToyMH0sZmFkZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2ZpbGw6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUZpbGwodHlwZSwgZmlsbE92ZXJyaWRlKSJ9LF9zdHJva2U6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVN0cm9rZSh0eXBlLCBzdHJva2VPdmVycmlkZSkifX0sCmdldFN2Z0RlZmluYWJsZUVsZW1lbnQoKXtyZXR1cm4gdGhpcy4kLnN2Z0RlZnN9LF9jb21wdXRlRmlsbChnLGwpe2lmKG51bGwhPWwpcmV0dXJuIGw7c3dpdGNoKGcpe2Nhc2UgZi5NRVRBOnJldHVybiBhLmdyYXBoLnJlbmRlci5NZXRhbm9kZUNvbG9ycy5ERUZBVUxUX0ZJTEw7Y2FzZSBmLlNFUklFUzpyZXR1cm4gYS5ncmFwaC5yZW5kZXIuU2VyaWVzTm9kZUNvbG9ycy5ERUZBVUxUX0ZJTEw7ZGVmYXVsdDpyZXR1cm4gYS5ncmFwaC5yZW5kZXIuT3BOb2RlQ29sb3JzLkRFRkFVTFRfRklMTH19LF9jb21wdXRlU3Ryb2tlKGcsbCl7aWYobnVsbCE9bClyZXR1cm4gbDtzd2l0Y2goZyl7Y2FzZSBmLk1FVEE6cmV0dXJuIGEuZ3JhcGgucmVuZGVyLk1ldGFub2RlQ29sb3JzLkRFRkFVTFRfU1RST0tFO2Nhc2UgZi5TRVJJRVM6cmV0dXJuIGEuZ3JhcGgucmVuZGVyLlNlcmllc05vZGVDb2xvcnMuREVGQVVMVF9TVFJPS0U7ZGVmYXVsdDpyZXR1cm4gYS5ncmFwaC5yZW5kZXIuT3BOb2RlQ29sb3JzLkRFRkFVTFRfU1RST0tFfX0sCl9pc1R5cGUoZyxsKXtyZXR1cm4gZz09PWx9LF9mYWRlZENsYXNzOmZ1bmN0aW9uKGcsbCl7cmV0dXJuIGc/ImZhZGVkLSIrbDoiIn19KX0pKGMuaWNvbnx8KGMuaWNvbj17fSkpfSkoYS5ncmFwaHx8KGEuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vdGYtbm9kZS1pY29uLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLW5vZGUtaWNvbiIscHJvcGVydGllczp7bm9kZTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0scmVuZGVySW5mbzp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sY29sb3JCeTp7dHlwZTpPYmplY3QsdmFsdWU6InN0cnVjdHVyYWwifSx0ZW1wbGF0ZUluZGV4Ont0eXBlOkZ1bmN0aW9uLHZhbHVlOm51bGx9LHR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHZlcnRpY2FsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGNvbnN0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHN1bW1hcnk6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZmlsbDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0saGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZToyMH0sX2ZpbGxPdmVycmlkZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlRmlsbE92ZXJyaWRlKG5vZGUsIHJlbmRlckluZm8sIGNvbG9yQnksIHRlbXBsYXRlSW5kZXgsIGZpbGwpIixvYnNlcnZlcjoiX29uRmlsbE92ZXJyaWRlQ2hhbmdlZCJ9fSwKX2NvbXB1dGVGaWxsT3ZlcnJpZGU6ZnVuY3Rpb24oYSxjLGQsZixnKXtyZXR1cm4gYSYmYyYmZCYmZj8oYT10Zi5ncmFwaC5zY2VuZS5ub2RlLGEuZ2V0RmlsbEZvck5vZGUoZixhLkNvbG9yQnlbZC50b1VwcGVyQ2FzZSgpXSxjLCExKSk6Z30sX2dldFN0cm9rZU92ZXJyaWRlOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RmLmdyYXBoLnNjZW5lLm5vZGUuZ2V0U3Ryb2tlRm9yRmlsbChhKTpudWxsfSxfZ2V0VHlwZTpmdW5jdGlvbihhLGMsZCxmKXtjb25zdCB7R3JhcGhJY29uVHlwZTpnfT10Zi5ncmFwaC5pY29uO2lmKGEpc3dpdGNoKGEudHlwZSl7Y2FzZSB0Zi5ncmFwaC5Ob2RlVHlwZS5PUDpyZXR1cm4gYT1hLm9wLCJzdHJpbmciIT09dHlwZW9mIGE/Zy5PUDoiQ29uc3QiPT09YXx8ZD9nLkNPTlNUOmEuZW5kc1dpdGgoIlN1bW1hcnkiKXx8Yz9nLlNVTU1BUlk6Zy5PUDtjYXNlIHRmLmdyYXBoLk5vZGVUeXBlLk1FVEE6cmV0dXJuIGcuTUVUQTtjYXNlIHRmLmdyYXBoLk5vZGVUeXBlLlNFUklFUzpyZXR1cm4gZy5TRVJJRVN9cmV0dXJuIGZ9LApfaXNWZXJ0aWNhbDpmdW5jdGlvbihhLGMpe3JldHVybiBhP2EuaGFzTm9uQ29udHJvbEVkZ2VzOiEhY30sX2dldEZhZGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmlzRmFkZWRPdXR9LF9vbkZpbGxPdmVycmlkZUNoYW5nZWQoYSxjKXtjb25zdCB7bm9kZTpkLHJlbmRlckluZm86Zixjb2xvckJ5OmcsdGVtcGxhdGVJbmRleDpsfT10aGlzLGs9dGYuZ3JhcGguc2NlbmUubm9kZTthIT09YyYmay5yZW1vdmVHcmFkaWVudERlZmluaXRpb25zKHRoaXMuJC5pY29uLmdldFN2Z0RlZmluYWJsZUVsZW1lbnQoKSk7ZCYmZiYmZyYmbCYmay5nZXRGaWxsRm9yTm9kZShsLGsuQ29sb3JCeVtnLnRvVXBwZXJDYXNlKCldLGYsITEsdGhpcy4kLmljb24uZ2V0U3ZnRGVmaW5hYmxlRWxlbWVudCgpKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtb3AtY29tcGF0LWNhcmQvdGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1vcC1jb21wYXQtbGlzdC1pdGVtIixwcm9wZXJ0aWVzOntjYXJkTm9kZTpPYmplY3QsaXRlbU5vZGU6T2JqZWN0LGVkZ2VMYWJlbDpTdHJpbmcsaXRlbVJlbmRlckluZm86T2JqZWN0LG5hbWU6U3RyaW5nLGl0ZW1UeXBlOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX2l0ZW1UeXBlQ2hhbmdlZCJ9LGNvbG9yQnk6U3RyaW5nLGNvbG9yQnlQYXJhbXM6T2JqZWN0LHRlbXBsYXRlSW5kZXg6RnVuY3Rpb259LF9pdGVtVHlwZUNoYW5nZWQ6ZnVuY3Rpb24oKXsic3Vibm9kZSIhPT10aGlzLml0ZW1UeXBlP3RoaXMuJFsibGlzdC1pdGVtIl0uY2xhc3NMaXN0LmFkZCgiY2xpY2thYmxlIik6dGhpcy4kWyJsaXN0LWl0ZW0iXS5jbGFzc0xpc3QucmVtb3ZlKCJjbGlja2FibGUiKX0sX25vZGVMaXN0ZW5lcjpmdW5jdGlvbihhKXt0aGlzLmZpcmUoIm5vZGUtbGlzdC1pdGVtLSIrYS50eXBlLHtub2RlTmFtZTp0aGlzLm5hbWUsdHlwZTp0aGlzLml0ZW1UeXBlfSl9LApfZmFkZWRDbGFzczpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5pc0ZhZGVkT3V0PyJmYWRlZCI6IiJ9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkL3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIixwcm9wZXJ0aWVzOntncmFwaEhpZXJhcmNoeTpPYmplY3QsaGllcmFyY2h5UGFyYW1zOk9iamVjdCxyZW5kZXJIaWVyYXJjaHk6T2JqZWN0LG5vZGVUaXRsZTpTdHJpbmcsX3RlbXBsYXRlSW5kZXg6e3R5cGU6RnVuY3Rpb24sY29tcHV0ZWQ6Il9nZXRUZW1wbGF0ZUluZGV4KGdyYXBoSGllcmFyY2h5KSJ9LF9pbmNvbXBhdGlibGVPcE5vZGVzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldEluY29tcGF0aWJsZU9wTm9kZXMoZ3JhcGhIaWVyYXJjaHksIGhpZXJhcmNoeVBhcmFtcykifSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX29wQ29tcGF0U2NvcmU6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZU9wQ29tcGF0U2NvcmUoZ3JhcGhIaWVyYXJjaHkpIn0sX29wQ29tcGF0U2NvcmVMYWJlbDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXRPcENvbXBhdFNjb3JlTGFiZWwoX29wQ29tcGF0U2NvcmUpIn0sCl9vcENvbXBhdENvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZTp0Zi5ncmFwaC5yZW5kZXIuT3BOb2RlQ29sb3JzLkNPTVBBVElCTEV9LF9vcEluY29tcGF0Q29sb3I6e3R5cGU6U3RyaW5nLHZhbHVlOnRmLmdyYXBoLnJlbmRlci5PcE5vZGVDb2xvcnMuSU5DT01QQVRJQkxFfSxfdG90YWxJbmNvbXBhdE9wczp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9nZXRUb3RhbEluY29tcGF0aWJsZU9wcyhncmFwaEhpZXJhcmNoeSkifX0sX2dldFRlbXBsYXRlSW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0VGVtcGxhdGVJbmRleCgpfSxfZ2V0Tm9kZTpmdW5jdGlvbihhLGMpe3JldHVybiBjLm5vZGUoYSl9LF9nZXRQcmludGFibGVIVE1MTm9kZU5hbWU6ZnVuY3Rpb24oYSl7cmV0dXJuKGF8fCIiKS5yZXBsYWNlKC9cLy9nLCJceDNjd2JyXHgzZS8iKX0sX2dldFJlbmRlckluZm86ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucmVuZGVySGllcmFyY2h5LmdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZShhKX0sCl90b2dnbGVFeHBhbmRlZDpmdW5jdGlvbigpe3RoaXMuX2V4cGFuZGVkPSF0aGlzLl9leHBhbmRlZH0sX2dldFRvZ2dsZUljb246ZnVuY3Rpb24oYSl7cmV0dXJuIGE/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifSxfcmVzaXplTGlzdDpmdW5jdGlvbihhKXsoYT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGEpKSYmYS5maXJlKCJpcm9uLXJlc2l6ZSIpfSxfZ2V0SW5jb21wYXRpYmxlT3BOb2RlczpmdW5jdGlvbihhLGMpe2lmKGEmJmEucm9vdClyZXR1cm4gdGhpcy5hc3luYyh0aGlzLl9yZXNpemVMaXN0LmJpbmQodGhpcywiI2luY29tcGF0aWJsZU9wc0xpc3QiKSksdGYuZ3JhcGguaGllcmFyY2h5LmdldEluY29tcGF0aWJsZU9wcyhhLGMpfSxfY29tcHV0ZU9wQ29tcGF0U2NvcmU6ZnVuY3Rpb24oYSl7aWYoYSYmYS5yb290KXt2YXIgYz1hLnJvb3Q7YT1jLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZTtjPWMuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU7CnJldHVybiAwPT1hJiYwPT1jPzA6TWF0aC5mbG9vcigxMDAqYS8oYStjKSkvMTAwfXJldHVybiAwfSxfZ2V0T3BDb21wYXRTY29yZUxhYmVsOmZ1bmN0aW9uKGEpe3JldHVybiBkMy5mb3JtYXQoIi4wJSIpKGEpfSxfZ2V0VG90YWxJbmNvbXBhdGlibGVPcHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEucm9vdD9hLnJvb3QuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU6MH19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtaW5mby90Zi1ub2RlLWxpc3QtaXRlbS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ub2RlLWxpc3QtaXRlbSIscHJvcGVydGllczp7Y2FyZE5vZGU6T2JqZWN0LGl0ZW1Ob2RlOk9iamVjdCxlZGdlTGFiZWw6U3RyaW5nLGl0ZW1SZW5kZXJJbmZvOk9iamVjdCxuYW1lOlN0cmluZyxpdGVtVHlwZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9pdGVtVHlwZUNoYW5nZWQifSxjb2xvckJ5OlN0cmluZyxjb2xvckJ5UGFyYW1zOk9iamVjdCx0ZW1wbGF0ZUluZGV4OkZ1bmN0aW9ufSxfaXRlbVR5cGVDaGFuZ2VkOmZ1bmN0aW9uKCl7InN1Ym5vZGUiIT09dGhpcy5pdGVtVHlwZT90aGlzLiRbImxpc3QtaXRlbSJdLmNsYXNzTGlzdC5hZGQoImNsaWNrYWJsZSIpOnRoaXMuJFsibGlzdC1pdGVtIl0uY2xhc3NMaXN0LnJlbW92ZSgiY2xpY2thYmxlIil9LF9ub2RlTGlzdGVuZXI6ZnVuY3Rpb24oYSl7dGhpcy5maXJlKCJub2RlLWxpc3QtaXRlbS0iK2EudHlwZSx7Y2FyZE5vZGU6dGhpcy5jYXJkTm9kZS5uYW1lLG5vZGVOYW1lOnRoaXMubmFtZSwKdHlwZTp0aGlzLml0ZW1UeXBlfSl9LF9mYWRlZENsYXNzOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmlzRmFkZWRPdXQ/ImZhZGVkIjoiIn19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtaW5mby90Zi1ub2RlLWluZm8uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtbm9kZS1pbmZvIixwcm9wZXJ0aWVzOntub2RlTmFtZTpTdHJpbmcsZ3JhcGhIaWVyYXJjaHk6T2JqZWN0LHJlbmRlckhpZXJhcmNoeTpPYmplY3QsY29sb3JCeTpTdHJpbmcsX3RlbXBsYXRlSW5kZXg6e3R5cGU6RnVuY3Rpb24sY29tcHV0ZWQ6Il9nZXRUZW1wbGF0ZUluZGV4KGdyYXBoSGllcmFyY2h5KSJ9LF9ub2RlOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldE5vZGUobm9kZU5hbWUsIGdyYXBoSGllcmFyY2h5KSIsb2JzZXJ2ZXI6Il9yZXNldFN0YXRlIn0sX25vZGVTdGF0czp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9nZXROb2RlU3RhdHMobm9kZU5hbWUsIGdyYXBoSGllcmFyY2h5KSIsb2JzZXJ2ZXI6Il9yZXNldFN0YXRlIn0sX2hhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldEhhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzKF9ub2RlU3RhdHMpIn0sX25vZGVTdGF0c0Zvcm1hdHRlZEJ5dGVzOnt0eXBlOlN0cmluZywKY29tcHV0ZWQ6Il9nZXROb2RlU3RhdHNGb3JtYXR0ZWRCeXRlcyhfbm9kZVN0YXRzKSJ9LF9ub2RlU3RhdHNGb3JtYXR0ZWRDb21wdXRlVGltZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXROb2RlU3RhdHNGb3JtYXR0ZWRDb21wdXRlVGltZShfbm9kZVN0YXRzKSJ9LF9ub2RlU3RhdHNGb3JtYXR0ZWRPdXRwdXRTaXplczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldE5vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzKF9ub2RlU3RhdHMpIn0sbm9kZUluY2x1ZGU6e3R5cGU6TnVtYmVyLG9ic2VydmVyOiJfbm9kZUluY2x1ZGVTdGF0ZUNoYW5nZWQifSxfYXR0cmlidXRlczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEF0dHJpYnV0ZXMoX25vZGUpIn0sX2RldmljZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXREZXZpY2UoX25vZGUpIn0sX3N1Y2Nlc3NvcnM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0U3VjY2Vzc29ycyhfbm9kZSwgZ3JhcGhIaWVyYXJjaHkpIn0sCl9wcmVkZWNlc3NvcnM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0UHJlZGVjZXNzb3JzKF9ub2RlLCBncmFwaEhpZXJhcmNoeSkifSxfZnVuY3Rpb25Vc2FnZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9nZXRGdW5jdGlvblVzYWdlcyhfbm9kZSwgZ3JhcGhIaWVyYXJjaHkpIn0sX3N1Ym5vZGVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfZ2V0U3Vibm9kZXMoX25vZGUpIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF90b3RhbFByZWRlY2Vzc29yczp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9nZXRUb3RhbFByZWQoX3ByZWRlY2Vzc29ycykifSxfdG90YWxTdWNjZXNzb3JzOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2dldFRvdGFsU3VjYyhfc3VjY2Vzc29ycykifSxfb3BlbmVkQ29udHJvbFByZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX29wZW5lZENvbnRyb2xTdWNjOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9hdXhCdXR0b25UZXh0OlN0cmluZyxfZ3JvdXBCdXR0b25UZXh0OlN0cmluZ30sCmV4cGFuZE5vZGU6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoIl9ub2RlLmV4cGFuZCIsdGhpcy5ub2RlKX0sX2dldFRlbXBsYXRlSW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0VGVtcGxhdGVJbmRleCgpfSxfZ2V0Tm9kZTpmdW5jdGlvbihhLGMpe3JldHVybiBjLm5vZGUoYSl9LF9nZXROb2RlU3RhdHM6ZnVuY3Rpb24oYSxjKXtyZXR1cm4oYT10aGlzLl9nZXROb2RlKGEsYykpP2Euc3RhdHM6bnVsbH0sX2dldFRvdGFsTWljcm9zOmZ1bmN0aW9uKGEpe3JldHVybiBhP2EuZ2V0VG90YWxNaWNyb3MoKTowfSxfZ2V0SGFzRGlzcGxheWFibGVOb2RlU3RhdHM6ZnVuY3Rpb24oYSl7cmV0dXJuIHRmLmdyYXBoLnV0aWwuaGFzRGlzcGxheWFibGVOb2RlU3RhdHMoYSl9LF9nZXROb2RlU3RhdHNGb3JtYXR0ZWRCeXRlczpmdW5jdGlvbihhKXtpZihhJiZhLnRvdGFsQnl0ZXMpcmV0dXJuIHRmLmdyYXBoLnV0aWwuY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKGEudG90YWxCeXRlcyx0Zi5ncmFwaC51dGlsLk1FTU9SWV9VTklUUyl9LApfZ2V0Tm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWU6ZnVuY3Rpb24oYSl7aWYoYSYmYS5nZXRUb3RhbE1pY3JvcygpKXJldHVybiB0Zi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZShhLmdldFRvdGFsTWljcm9zKCksdGYuZ3JhcGgudXRpbC5USU1FX1VOSVRTKX0sX2dldE5vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzOmZ1bmN0aW9uKGEpe2lmKGEmJmEub3V0cHV0U2l6ZSYmYS5vdXRwdXRTaXplLmxlbmd0aClyZXR1cm4gXy5tYXAoYS5vdXRwdXRTaXplLGZ1bmN0aW9uKGMpe3JldHVybiAwPT09Yy5sZW5ndGg/InNjYWxhciI6IlsiK2Muam9pbigiLCAiKSsiXSJ9KX0sX2dldFByaW50YWJsZUhUTUxOb2RlTmFtZTpmdW5jdGlvbihhKXtyZXR1cm4oYXx8IiIpLnJlcGxhY2UoL1wvL2csIlx4M2N3YnJceDNlLyIpfSxfZ2V0UmVuZGVySW5mbzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKGEpfSwKX2dldEF0dHJpYnV0ZXM6ZnVuY3Rpb24oYSl7dGhpcy5hc3luYyh0aGlzLl9yZXNpemVMaXN0LmJpbmQodGhpcywiI2F0dHJpYnV0ZXNMaXN0IikpO2lmKCFhfHwhYS5hdHRyKXJldHVybltdO3ZhciBjPVtdO18uZWFjaChhLmF0dHIsZnVuY3Rpb24oZCl7ZC5rZXk9PT10Zi5ncmFwaC5MQVJHRV9BVFRSU19LRVk/Yz1jLmNvbmNhdChkLnZhbHVlLmxpc3Qucy5tYXAoZnVuY3Rpb24oZil7cmV0dXJue2tleTpmLHZhbHVlOiJUb28gbGFyZ2UgdG8gc2hvdy4uLiJ9fSkpOmMucHVzaCh7a2V5OmQua2V5LHZhbHVlOkpTT04uc3RyaW5naWZ5KGQudmFsdWUpfSl9KTtyZXR1cm4gY30sX2dldERldmljZTpmdW5jdGlvbihhKXtyZXR1cm4gYT9hLmRldmljZTpudWxsfSxfZ2V0U3VjY2Vzc29ycyhhLGMpe3RoaXMuX3JlZnJlc2hOb2RlSXRlbUxpc3QoImlucHV0c0xpc3QiKTtyZXR1cm4gYT90aGlzLl9jb252ZXJ0RWRnZUxpc3RUb0VkZ2VJbmZvTGlzdChjLmdldFN1Y2Nlc3NvcnMoYS5uYW1lKSwKITEsYS5pc0dyb3VwTm9kZSk6e3JlZ3VsYXI6W10sY29udHJvbDpbXX19LF9nZXRQcmVkZWNlc3NvcnMoYSxjKXt0aGlzLl9yZWZyZXNoTm9kZUl0ZW1MaXN0KCJvdXRwdXRzTGlzdCIpO3JldHVybiBhP3RoaXMuX2NvbnZlcnRFZGdlTGlzdFRvRWRnZUluZm9MaXN0KGMuZ2V0UHJlZGVjZXNzb3JzKGEubmFtZSksITAsYS5pc0dyb3VwTm9kZSk6e3JlZ3VsYXI6W10sY29udHJvbDpbXX19LF9nZXRGdW5jdGlvblVzYWdlcyhhLGMpe3RoaXMuX3JlZnJlc2hOb2RlSXRlbUxpc3QoImZ1bmN0aW9uVXNhZ2VzTGlzdCIpO3JldHVybiBhJiZhLnR5cGU9PT10Zi5ncmFwaC5Ob2RlVHlwZS5NRVRBPyhhPWMubGlicmFyeUZ1bmN0aW9uc1thLmFzc29jaWF0ZWRGdW5jdGlvbl0pP2EudXNhZ2VzOltdOltdfSxfcmVmcmVzaE5vZGVJdGVtTGlzdChhKXt0aGlzLmFzeW5jKHRoaXMuX3Jlc2l6ZUxpc3QuYmluZCh0aGlzLGAjJHthfWApKX0sX2NvbnZlcnRFZGdlTGlzdFRvRWRnZUluZm9MaXN0OmZ1bmN0aW9uKGEsCmMsZCl7dmFyIGY9bD0+Xy5tYXAobC5iYXNlRWRnZUxpc3Qsaz0+e3ZhciBuPWM/ay52OmsudztyZXR1cm57bmFtZTpuLG5vZGU6dGhpcy5fZ2V0Tm9kZShuLHRoaXMuZ3JhcGhIaWVyYXJjaHkpLGVkZ2VMYWJlbDp0Zi5ncmFwaC5zY2VuZS5lZGdlLmdldExhYmVsRm9yQmFzZUVkZ2Uoayx0aGlzLnJlbmRlckhpZXJhcmNoeSkscmVuZGVySW5mbzp0aGlzLl9nZXRSZW5kZXJJbmZvKG4sdGhpcy5yZW5kZXJIaWVyYXJjaHkpfX0pLGc9ZnVuY3Rpb24obCl7dmFyIGs9W107Xy5lYWNoKGwsbj0+e3ZhciBwPWM/bi52Om4udztkJiYxIT1uLmJhc2VFZGdlTGlzdC5sZW5ndGg/ay5wdXNoKHtuYW1lOnAsbm9kZTp0aGlzLl9nZXROb2RlKHAsdGhpcy5ncmFwaEhpZXJhcmNoeSksZWRnZUxhYmVsOnRmLmdyYXBoLnNjZW5lLmVkZ2UuZ2V0TGFiZWxGb3JFZGdlKG4sdGhpcy5yZW5kZXJIaWVyYXJjaHkpLHJlbmRlckluZm86dGhpcy5fZ2V0UmVuZGVySW5mbyhwLHRoaXMucmVuZGVySGllcmFyY2h5KX0pOgprPWsuY29uY2F0KGYobikpfSk7cmV0dXJuIGt9LmJpbmQodGhpcyk7cmV0dXJue3JlZ3VsYXI6ZyhhLnJlZ3VsYXIpLGNvbnRyb2w6ZyhhLmNvbnRyb2wpfX0sX2dldFN1Ym5vZGVzOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLm1ldGFncmFwaD9hLm1ldGFncmFwaC5ub2RlcygpOm51bGx9LF9nZXRUb3RhbFByZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVndWxhci5sZW5ndGgrYS5jb250cm9sLmxlbmd0aH0sX2dldFRvdGFsU3VjYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZWd1bGFyLmxlbmd0aCthLmNvbnRyb2wubGVuZ3RofSxfdG9nZ2xlQ29udHJvbFByZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vcGVuZWRDb250cm9sUHJlZD0hdGhpcy5fb3BlbmVkQ29udHJvbFByZWR9LF90b2dnbGVDb250cm9sU3VjYzpmdW5jdGlvbigpe3RoaXMuX29wZW5lZENvbnRyb2xTdWNjPSF0aGlzLl9vcGVuZWRDb250cm9sU3VjY30sX3RvZ2dsZUV4cGFuZGVkOmZ1bmN0aW9uKCl7dGhpcy5fZXhwYW5kZWQ9CiF0aGlzLl9leHBhbmRlZH0sX2dldFRvZ2dsZUljb246ZnVuY3Rpb24oYSl7cmV0dXJuIGE/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifSxfcmVzZXRTdGF0ZTpmdW5jdGlvbigpe3RoaXMuX29wZW5lZENvbnRyb2xTdWNjPXRoaXMuX29wZW5lZENvbnRyb2xQcmVkPSExO3RoaXMuc2V0KCJfZ3JvdXBCdXR0b25UZXh0Iix0Zi5ncmFwaC5zY2VuZS5ub2RlLmdldEdyb3VwU2V0dGluZ0xhYmVsKHRoaXMuX25vZGUpKTt0aGlzLl9ub2RlJiYoUG9seW1lci5kb20odGhpcy4kLm5vZGV0aXRsZSkuaW5uZXJIVE1MPXRoaXMuX2dldFByaW50YWJsZUhUTUxOb2RlTmFtZSh0aGlzLl9ub2RlLm5hbWUpKX0sX3Jlc2l6ZUxpc3Q6ZnVuY3Rpb24oYSl7KGE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihhKSkmJmEuZmlyZSgiaXJvbi1yZXNpemUiKX0sX3RvZ2dsZUluY2x1ZGU6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoIm5vZGUtdG9nZ2xlLWluY2x1c2lvbiIse25hbWU6dGhpcy5ub2RlTmFtZX0pfSwKX25vZGVJbmNsdWRlU3RhdGVDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuc2V0KCJfYXV4QnV0dG9uVGV4dCIsdGYuZ3JhcGguZ2V0SW5jbHVkZU5vZGVCdXR0b25TdHJpbmcoYSkpfSxfdG9nZ2xlR3JvdXA6ZnVuY3Rpb24oKXt2YXIgYT10Zi5ncmFwaC5zY2VuZS5ub2RlLmdldFNlcmllc05hbWUodGhpcy5fbm9kZSk7dGhpcy5maXJlKCJub2RlLXRvZ2dsZS1zZXJpZXNncm91cCIse25hbWU6YX0pfSxfaXNMaWJyYXJ5RnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEubmFtZS5zdGFydHNXaXRoKHRmLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgpfSxfaXNJblNlcmllczpmdW5jdGlvbihhKXtyZXR1cm4gdGYuZ3JhcGguc2NlbmUubm9kZS5jYW5CZUluU2VyaWVzKGEpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1pbmZvL3RmLWdyYXBoLWluZm8uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtZ3JhcGgtaW5mbyIscHJvcGVydGllczp7dGl0bGU6U3RyaW5nLGdyYXBoSGllcmFyY2h5Ok9iamVjdCxncmFwaDpPYmplY3QscmVuZGVySGllcmFyY2h5Ok9iamVjdCxub2RlTmFtZXNUb0hlYWx0aFBpbGxzOk9iamVjdCxoZWFsdGhQaWxsU3RlcEluZGV4Ont0eXBlOk51bWJlcixub3RpZnk6ITB9LGNvbG9yQnk6U3RyaW5nLGNvbXBhdE5vZGVUaXRsZTpTdHJpbmcsc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LGhpZ2hsaWdodGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxzZWxlY3RlZE5vZGVJbmNsdWRlOnt0eXBlOk51bWJlcixub3RpZnk6ITB9LGRlYnVnZ2VyRGF0YUVuYWJsZWQ6Qm9vbGVhbn0sbGlzdGVuZXJzOnsibm9kZS1saXN0LWl0ZW0tY2xpY2siOiJfbm9kZUxpc3RJdGVtQ2xpY2tlZCIsIm5vZGUtbGlzdC1pdGVtLW1vdXNlb3ZlciI6Il9ub2RlTGlzdEl0ZW1Nb3VzZW92ZXIiLCJub2RlLWxpc3QtaXRlbS1tb3VzZW91dCI6Il9ub2RlTGlzdEl0ZW1Nb3VzZW91dCJ9LApfbm9kZUxpc3RJdGVtQ2xpY2tlZDpmdW5jdGlvbihhKXt0aGlzLnNlbGVjdGVkTm9kZT1hLmRldGFpbC5ub2RlTmFtZX0sX25vZGVMaXN0SXRlbU1vdXNlb3ZlcjpmdW5jdGlvbihhKXt0aGlzLmhpZ2hsaWdodGVkTm9kZT1hLmRldGFpbC5ub2RlTmFtZX0sX25vZGVMaXN0SXRlbU1vdXNlb3V0OmZ1bmN0aW9uKCl7dGhpcy5oaWdobGlnaHRlZE5vZGU9bnVsbH0sX2hlYWx0aFBpbGxzQXZhaWxhYmxlOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEmJmMmJjA8T2JqZWN0LmtleXMoYykubGVuZ3RofSxfZXF1YWxzOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGE9PT1jfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1ib2FyZC90Zi1ncmFwaC1ib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ncmFwaC1ib2FyZCIscHJvcGVydGllczp7Z3JhcGhIaWVyYXJjaHk6T2JqZWN0LGdyYXBoOk9iamVjdCxzdGF0czpPYmplY3QscHJvZ3Jlc3M6T2JqZWN0LHRyYWNlSW5wdXRzOkJvb2xlYW4sY29sb3JCeTpTdHJpbmcsY29sb3JCeVBhcmFtczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxyZW5kZXJIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sZGVidWdnZXJEYXRhRW5hYmxlZDpCb29sZWFuLGFyZUhlYWx0aFBpbGxzTG9hZGluZzpCb29sZWFuLGRlYnVnZ2VyTnVtZXJpY0FsZXJ0czp7dHlwZTpBcnJheSxub3RpZnk6ITB9LG5vZGVOYW1lc1RvSGVhbHRoUGlsbHM6T2JqZWN0LGFsbFN0ZXBzTW9kZUVuYWJsZWQ6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAsdmFsdWU6ITF9LHNwZWNpZmljSGVhbHRoUGlsbFN0ZXA6e3R5cGU6TnVtYmVyLG5vdGlmeTohMCx2YWx1ZTowfSxoZWFsdGhQaWxsU3RlcEluZGV4Ok51bWJlcixzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLApub3RpZnk6ITB9LGNvbXBhdE5vZGVUaXRsZTp7dHlwZTpTdHJpbmcsdmFsdWU6IlRQVSBDb21wYXRpYmlsaXR5In0sZWRnZVdpZHRoRnVuY3Rpb246T2JqZWN0LF9zZWxlY3RlZE5vZGVJbmNsdWRlOk51bWJlcixfaGlnaGxpZ2h0ZWROb2RlOlN0cmluZyxoYW5kbGVOb2RlU2VsZWN0ZWQ6T2JqZWN0LGVkZ2VMYWJlbEZ1bmN0aW9uOk9iamVjdCxoYW5kbGVFZGdlU2VsZWN0ZWQ6T2JqZWN0fSxvYnNlcnZlcnM6WyJfdXBkYXRlTm9kZUluY2x1ZGUoc2VsZWN0ZWROb2RlLCByZW5kZXJIaWVyYXJjaHkpIl0sZml0OmZ1bmN0aW9uKCl7dGhpcy4kLmdyYXBoLmZpdCgpfSxfaXNOb3RDb21wbGV0ZTpmdW5jdGlvbihhKXtyZXR1cm4gMTAwPmEudmFsdWV9LF9nZXRDb250YWluZXJDbGFzczpmdW5jdGlvbihhKXt2YXIgYz0iY29udGFpbmVyIjthLmVycm9yJiYoYys9IiBlcnJvciIpO3RoaXMuX2lzTm90Q29tcGxldGUoYSkmJihjKz0iIGxvYWRpbmciKTtyZXR1cm4gY30sX29uTm9kZUluY2x1c2lvblRvZ2dsZWQoYSl7dGhpcy4kLmdyYXBoLm5vZGVUb2dnbGVFeHRyYWN0KGEuZGV0YWlsLm5hbWUpfSwKX29uTm9kZVNlcmllc0dyb3VwVG9nZ2xlZChhKXt0aGlzLiQuZ3JhcGgubm9kZVRvZ2dsZVNlcmllc0dyb3VwKGEuZGV0YWlsLm5hbWUpfSxfdXBkYXRlTm9kZUluY2x1ZGUoKXtjb25zdCBhPXRoaXMucmVuZGVySGllcmFyY2h5P3RoaXMucmVuZGVySGllcmFyY2h5LmdldE5vZGVCeU5hbWUodGhpcy5zZWxlY3RlZE5vZGUpOm51bGw7dGhpcy5fc2VsZWN0ZWROb2RlSW5jbHVkZT1hP2EuaW5jbHVkZTp0Zi5ncmFwaC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tbWVudS1iZWhhdmlvci9pcm9uLW1lbnViYXItYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JJbXBsPXtob3N0QXR0cmlidXRlczp7cm9sZToibWVudWJhciJ9LGtleUJpbmRpbmdzOntsZWZ0OiJfb25MZWZ0S2V5IixyaWdodDoiX29uUmlnaHRLZXkifSxfb25VcEtleTpmdW5jdGlvbihhKXt0aGlzLmZvY3VzZWRJdGVtLmNsaWNrKCk7YS5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25Eb3duS2V5OmZ1bmN0aW9uKGEpe3RoaXMuZm9jdXNlZEl0ZW0uY2xpY2soKTthLmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LGdldCBfaXNSVEwoKXtyZXR1cm4icnRsIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLmRpcmVjdGlvbn0sX29uTGVmdEtleTpmdW5jdGlvbihhKXt0aGlzLl9pc1JUTD90aGlzLl9mb2N1c05leHQoKTp0aGlzLl9mb2N1c1ByZXZpb3VzKCk7YS5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25SaWdodEtleTpmdW5jdGlvbihhKXt0aGlzLl9pc1JUTD8KdGhpcy5fZm9jdXNQcmV2aW91cygpOnRoaXMuX2ZvY3VzTmV4dCgpO2EuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sX29uS2V5ZG93bjpmdW5jdGlvbihhKXt0aGlzLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhhLCJ1cCBkb3duIGxlZnQgcmlnaHQgZXNjIil8fHRoaXMuX2ZvY3VzV2l0aEtleWJvYXJkRXZlbnQoYSl9fTtQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3I9W1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvcixQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1yYWRpby1idXR0b24vcGFwZXItcmFkaW8tYnV0dG9uLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXJhZGlvLWJ1dHRvbiIsYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVyQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InJhZGlvIiwiYXJpYS1jaGVja2VkIjohMSx0YWJpbmRleDowfSxwcm9wZXJ0aWVzOnthcmlhQWN0aXZlQXR0cmlidXRlOnt0eXBlOlN0cmluZyx2YWx1ZToiYXJpYS1jaGVja2VkIn19LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fcmlwcGxlQ29udGFpbmVyPXRoaXMuJC5yYWRpb0NvbnRhaW5lcn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLlJlbmRlclN0YXR1cy5hZnRlck5leHRSZW5kZXIodGhpcyxmdW5jdGlvbigpe2lmKCItMXB4Ij09PXRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCItLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplIikudHJpbSgpKXt2YXIgYT1wYXJzZUZsb2F0KHRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCItLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemUiKS50cmltKCkpLApjPU1hdGguZmxvb3IoMyphKTtjJTIhPT1hJTImJmMrKzt0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplIjpjKyJweCJ9KX19KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1yYWRpby1ncm91cC9wYXBlci1yYWRpby1ncm91cC5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1yYWRpby1ncm91cCIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJyYWRpb2dyb3VwIn0scHJvcGVydGllczp7YXR0ckZvclNlbGVjdGVkOnt0eXBlOlN0cmluZyx2YWx1ZToibmFtZSJ9LHNlbGVjdGVkQXR0cmlidXRlOnt0eXBlOlN0cmluZyx2YWx1ZToiY2hlY2tlZCJ9LHNlbGVjdGFibGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJwYXBlci1yYWRpby1idXR0b24ifSxhbGxvd0VtcHR5U2VsZWN0aW9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxzZWxlY3Q6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fdmFsdWVUb0l0ZW0oYSk7aWYoIWN8fCFjLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7aWYodGhpcy5zZWxlY3RlZCl7Yz10aGlzLl92YWx1ZVRvSXRlbSh0aGlzLnNlbGVjdGVkKTtpZih0aGlzLnNlbGVjdGVkPT1hKWlmKHRoaXMuYWxsb3dFbXB0eVNlbGVjdGlvbilhPSIiO2Vsc2V7YyYmCihjLmNoZWNrZWQ9ITApO3JldHVybn1jJiYoYy5jaGVja2VkPSExKX1Qb2x5bWVyLklyb25TZWxlY3RhYmxlQmVoYXZpb3Iuc2VsZWN0LmFwcGx5KHRoaXMsW2FdKTt0aGlzLmZpcmUoInBhcGVyLXJhZGlvLWdyb3VwLWNoYW5nZWQiKX19LF9hY3RpdmF0ZUZvY3VzZWRJdGVtOmZ1bmN0aW9uKCl7dGhpcy5faXRlbUFjdGl2YXRlKHRoaXMuX3ZhbHVlRm9ySXRlbSh0aGlzLmZvY3VzZWRJdGVtKSx0aGlzLmZvY3VzZWRJdGVtKX0sX29uVXBLZXk6ZnVuY3Rpb24oYSl7dGhpcy5fZm9jdXNQcmV2aW91cygpO2EucHJldmVudERlZmF1bHQoKTt0aGlzLl9hY3RpdmF0ZUZvY3VzZWRJdGVtKCl9LF9vbkRvd25LZXk6ZnVuY3Rpb24oYSl7dGhpcy5fZm9jdXNOZXh0KCk7YS5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX0sX29uTGVmdEtleTpmdW5jdGlvbihhKXtQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JJbXBsLl9vbkxlZnRLZXkuYXBwbHkodGhpcyxhcmd1bWVudHMpOwp0aGlzLl9hY3RpdmF0ZUZvY3VzZWRJdGVtKCl9LF9vblJpZ2h0S2V5OmZ1bmN0aW9uKGEpe1BvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvckltcGwuX29uUmlnaHRLZXkuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10b29sdGlwL3BhcGVyLXRvb2x0aXAuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdG9vbHRpcCIsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6InRvb2x0aXAiLHRhYmluZGV4Oi0xfSxwcm9wZXJ0aWVzOntmb3I6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfZmluZFRhcmdldCJ9LG1hbnVhbE1vZGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX21hbnVhbE1vZGVDaGFuZ2VkIn0scG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOiJib3R0b20ifSxmaXRUb1Zpc2libGVCb3VuZHM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sb2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZToxNH0sbWFyZ2luVG9wOnt0eXBlOk51bWJlcix2YWx1ZToxNH0sYW5pbWF0aW9uRGVsYXk6e3R5cGU6TnVtYmVyLHZhbHVlOjUwMCxvYnNlcnZlcjoiX2RlbGF5Q2hhbmdlIn0sYW5pbWF0aW9uRW50cnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxhbmltYXRpb25FeGl0Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sYW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdCwKdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57ZW50cnk6W3tuYW1lOiJmYWRlLWluLWFuaW1hdGlvbiIsbm9kZTp0aGlzLHRpbWluZzp7ZGVsYXk6MH19XSxleGl0Olt7bmFtZToiZmFkZS1vdXQtYW5pbWF0aW9uIixub2RlOnRoaXN9XX19fSxfc2hvd2luZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sbGlzdGVuZXJzOnt3ZWJraXRBbmltYXRpb25FbmQ6Il9vbkFuaW1hdGlvbkVuZCJ9LGdldCB0YXJnZXQoKXt2YXIgYT1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlLGM9UG9seW1lci5kb20odGhpcykuZ2V0T3duZXJSb290KCk7cmV0dXJuIHRoaXMuZm9yP1BvbHltZXIuZG9tKGMpLnF1ZXJ5U2VsZWN0b3IoIiMiK3RoaXMuZm9yKTphLm5vZGVUeXBlPT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU/Yy5ob3N0OmF9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fZmluZFRhcmdldCgpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMubWFudWFsTW9kZXx8dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCl9LApwbGF5QW5pbWF0aW9uOmZ1bmN0aW9uKGEpeyJlbnRyeSI9PT1hP3RoaXMuc2hvdygpOiJleGl0Ij09PWEmJnRoaXMuaGlkZSgpfSxjYW5jZWxBbmltYXRpb246ZnVuY3Rpb24oKXt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QuYWRkKCJjYW5jZWwtYW5pbWF0aW9uIil9LHNob3c6ZnVuY3Rpb24oKXtpZighdGhpcy5fc2hvd2luZyl7aWYoIiI9PT1Qb2x5bWVyLmRvbSh0aGlzKS50ZXh0Q29udGVudC50cmltKCkpe2Zvcih2YXIgYT0hMCxjPVBvbHltZXIuZG9tKHRoaXMpLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKSxkPTA7ZDxjLmxlbmd0aDtkKyspaWYoIiIhPT1jW2RdLnRleHRDb250ZW50LnRyaW0oKSl7YT0hMTticmVha31pZihhKXJldHVybn10aGlzLl9zaG93aW5nPSEwO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlbiIpO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImNhbmNlbC1hbmltYXRpb24iKTt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImV4aXQiKSk7CnRoaXMudXBkYXRlUG9zaXRpb24oKTt0aGlzLl9hbmltYXRpb25QbGF5aW5nPSEwO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZW50cnkiKSl9fSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5fc2hvd2luZyYmKHRoaXMuX2FuaW1hdGlvblBsYXlpbmc/KHRoaXMuX3Nob3dpbmc9ITEsdGhpcy5fY2FuY2VsQW5pbWF0aW9uKCkpOih0aGlzLl9vbkFuaW1hdGlvbkZpbmlzaCgpLHRoaXMuX3Nob3dpbmc9ITEsdGhpcy5fYW5pbWF0aW9uUGxheWluZz0hMCkpfSx1cGRhdGVQb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXMuX3RhcmdldCYmdGhpcy5vZmZzZXRQYXJlbnQpe3ZhciBhPXRoaXMub2Zmc2V0OzE0IT10aGlzLm1hcmdpblRvcCYmMTQ9PXRoaXMub2Zmc2V0JiYoYT10aGlzLm1hcmdpblRvcCk7dmFyIGM9dGhpcy5vZmZzZXRQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD10aGlzLl90YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCmY9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxnPShkLndpZHRoLWYud2lkdGgpLzIsbD0oZC5oZWlnaHQtZi5oZWlnaHQpLzIsaz1kLmxlZnQtYy5sZWZ0LG49ZC50b3AtYy50b3A7c3dpdGNoKHRoaXMucG9zaXRpb24pe2Nhc2UgInRvcCI6dmFyIHA9aytnO3ZhciBxPW4tZi5oZWlnaHQtYTticmVhaztjYXNlICJib3R0b20iOnA9aytnO3E9bitkLmhlaWdodCthO2JyZWFrO2Nhc2UgImxlZnQiOnA9ay1mLndpZHRoLWE7cT1uK2w7YnJlYWs7Y2FzZSAicmlnaHQiOnA9aytkLndpZHRoK2EscT1uK2x9dGhpcy5maXRUb1Zpc2libGVCb3VuZHM/KGMubGVmdCtwK2Yud2lkdGg+d2luZG93LmlubmVyV2lkdGg/KHRoaXMuc3R5bGUucmlnaHQ9IjBweCIsdGhpcy5zdHlsZS5sZWZ0PSJhdXRvIik6KHRoaXMuc3R5bGUubGVmdD1NYXRoLm1heCgwLHApKyJweCIsdGhpcy5zdHlsZS5yaWdodD0iYXV0byIpLGMudG9wK3ErZi5oZWlnaHQ+d2luZG93LmlubmVySGVpZ2h0Pyh0aGlzLnN0eWxlLmJvdHRvbT0KYy5oZWlnaHQrInB4Iix0aGlzLnN0eWxlLnRvcD0iYXV0byIpOih0aGlzLnN0eWxlLnRvcD1NYXRoLm1heCgtYy50b3AscSkrInB4Iix0aGlzLnN0eWxlLmJvdHRvbT0iYXV0byIpKToodGhpcy5zdHlsZS5sZWZ0PXArInB4Iix0aGlzLnN0eWxlLnRvcD1xKyJweCIpfX0sX2FkZExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuX3RhcmdldCYmKHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwibW91c2VlbnRlciIsInNob3ciKSx0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsImZvY3VzIiwic2hvdyIpLHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwibW91c2VsZWF2ZSIsImhpZGUiKSx0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsImJsdXIiLCJoaWRlIiksdGhpcy5saXN0ZW4odGhpcy5fdGFyZ2V0LCJ0YXAiLCJoaWRlIikpO3RoaXMubGlzdGVuKHRoaXMuJC50b29sdGlwLCJhbmltYXRpb25lbmQiLCJfb25BbmltYXRpb25FbmQiKTt0aGlzLmxpc3Rlbih0aGlzLCJtb3VzZWVudGVyIiwiaGlkZSIpfSwKX2ZpbmRUYXJnZXQ6ZnVuY3Rpb24oKXt0aGlzLm1hbnVhbE1vZGV8fHRoaXMuX3JlbW92ZUxpc3RlbmVycygpO3RoaXMuX3RhcmdldD10aGlzLnRhcmdldDt0aGlzLm1hbnVhbE1vZGV8fHRoaXMuX2FkZExpc3RlbmVycygpfSxfZGVsYXlDaGFuZ2U6ZnVuY3Rpb24oYSl7NTAwIT09YSYmdGhpcy51cGRhdGVTdHlsZXMoeyItLXBhcGVyLXRvb2x0aXAtZGVsYXktaW4iOmErIm1zIn0pfSxfbWFudWFsTW9kZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLm1hbnVhbE1vZGU/dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCk6dGhpcy5fYWRkTGlzdGVuZXJzKCl9LF9jYW5jZWxBbmltYXRpb246ZnVuY3Rpb24oKXt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImVudHJ5IikpO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZXhpdCIpKTt0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKCJjYW5jZWwtYW5pbWF0aW9uIik7CnRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpfSxfb25BbmltYXRpb25GaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl9zaG93aW5nJiYodGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJlbnRyeSIpKSx0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKCJjYW5jZWwtYW5pbWF0aW9uIiksdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJleGl0IikpKX0sX29uQW5pbWF0aW9uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fYW5pbWF0aW9uUGxheWluZz0hMTt0aGlzLl9zaG93aW5nfHwodGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJleGl0IikpLHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpKX0sX2dldEFuaW1hdGlvblR5cGU6ZnVuY3Rpb24oYSl7aWYoImVudHJ5Ij09PWEmJiIiIT09dGhpcy5hbmltYXRpb25FbnRyeSlyZXR1cm4gdGhpcy5hbmltYXRpb25FbnRyeTsKaWYoImV4aXQiPT09YSYmIiIhPT10aGlzLmFuaW1hdGlvbkV4aXQpcmV0dXJuIHRoaXMuYW5pbWF0aW9uRXhpdDtpZih0aGlzLmFuaW1hdGlvbkNvbmZpZ1thXSYmInN0cmluZyI9PT10eXBlb2YgdGhpcy5hbmltYXRpb25Db25maWdbYV1bMF0ubmFtZSl7aWYodGhpcy5hbmltYXRpb25Db25maWdbYV1bMF0udGltaW5nJiZ0aGlzLmFuaW1hdGlvbkNvbmZpZ1thXVswXS50aW1pbmcuZGVsYXkmJjAhPT10aGlzLmFuaW1hdGlvbkNvbmZpZ1thXVswXS50aW1pbmcuZGVsYXkpe3ZhciBjPXRoaXMuYW5pbWF0aW9uQ29uZmlnW2FdWzBdLnRpbWluZy5kZWxheTsiZW50cnkiPT09YT90aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItdG9vbHRpcC1kZWxheS1pbiI6YysibXMifSk6ImV4aXQiPT09YSYmdGhpcy51cGRhdGVTdHlsZXMoeyItLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0IjpjKyJtcyJ9KX1yZXR1cm4gdGhpcy5hbmltYXRpb25Db25maWdbYV1bMF0ubmFtZX19LF9yZW1vdmVMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt0aGlzLl90YXJnZXQmJgoodGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsIm1vdXNlZW50ZXIiLCJzaG93IiksdGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsImZvY3VzIiwic2hvdyIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJtb3VzZWxlYXZlIiwiaGlkZSIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJibHVyIiwiaGlkZSIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJ0YXAiLCJoaWRlIikpO3RoaXMudW5saXN0ZW4odGhpcy4kLnRvb2x0aXAsImFuaW1hdGlvbmVuZCIsIl9vbkFuaW1hdGlvbkVuZCIpO3RoaXMudW5saXN0ZW4odGhpcywibW91c2VlbnRlciIsImhpZGUiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1ub2RlLXNlYXJjaC90Zi1ncmFwaC1ub2RlLXNlYXJjaC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ncmFwaC1ub2RlLXNlYXJjaCIscHJvcGVydGllczp7cmVuZGVySGllcmFyY2h5Ok9iamVjdCxzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX3Jhd1JlZ2V4SW5wdXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfcmVnZXhJbnB1dDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUmVnZXhJbnB1dChyZW5kZXJIaWVyYXJjaHksIF9yYXdSZWdleElucHV0KSJ9LF9wcmV2aW91c1JlZ2V4SW5wdXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfc2VhcmNoVGltZW91dERlbGF5Ont0eXBlOk51bWJlcix2YWx1ZToxNTAscmVhZE9ubHk6ITB9LF9zZWFyY2hQZW5kaW5nOkJvb2xlYW4sX21heFJlZ2V4UmVzdWx0czp7dHlwZTpOdW1iZXIsdmFsdWU6NDJ9LF9yZWdleE1hdGNoZXM6QXJyYXl9LG9ic2VydmVyczpbIl9yZWdleElucHV0Q2hhbmdlZChfcmVnZXhJbnB1dCkiXSxfY29tcHV0ZVJlZ2V4SW5wdXQoYSxjKXtyZXR1cm4gYy50cmltKCl9LApfcmVnZXhJbnB1dENoYW5nZWQoKXt0aGlzLl9yZXF1ZXN0U2VhcmNoKCl9LF9jbGVhclNlYXJjaFJlc3VsdHMoKXt0aGlzLnNldCgiX3JlZ2V4TWF0Y2hlcyIsW10pfSxfcmVxdWVzdFNlYXJjaCgpe3RoaXMuX3NlYXJjaFBlbmRpbmd8fCh0aGlzLl9yZWdleElucHV0PT09dGhpcy5fcHJldmlvdXNSZWdleElucHV0P3RoaXMuX3NlYXJjaFBlbmRpbmc9ITE6KHRoaXMuX3NlYXJjaFBlbmRpbmc9ITAsdGhpcy5fZXhlY3V0ZVNlYXJjaCgpLHRoaXMuYXN5bmMoKCk9Pnt0aGlzLl9zZWFyY2hQZW5kaW5nPSExO3RoaXMuX3JlcXVlc3RTZWFyY2goKX0sdGhpcy5fc2VhcmNoVGltZW91dERlbGF5KSkpfSxfZXhlY3V0ZVNlYXJjaCgpe2lmKHRoaXMuX3ByZXZpb3VzUmVnZXhJbnB1dD10aGlzLl9yZWdleElucHV0KXt0cnl7dmFyIGE9bmV3IFJlZ0V4cCh0aGlzLl9yZWdleElucHV0KX1jYXRjaChkKXt0aGlzLl9jbGVhclNlYXJjaFJlc3VsdHMoKTtyZXR1cm59dmFyIGM9W107Xy5lYWNoKHRoaXMucmVuZGVySGllcmFyY2h5LmhpZXJhcmNoeS5nZXROb2RlTWFwKCksCihkLGYpPT57aWYoYy5sZW5ndGg+PXRoaXMuX21heFJlZ2V4UmVzdWx0cylyZXR1cm4hMTthLnRlc3QoZikmJmMucHVzaChmKX0pO3RoaXMuc2V0KCJfcmVnZXhNYXRjaGVzIixjKX1lbHNlIHRoaXMuX2NsZWFyU2VhcmNoUmVzdWx0cygpfSxfbWF0Y2hDbGlja2VkKGEpe3RoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLGEubW9kZWwuaXRlbSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29udHJvbHMvdGYtZ3JhcGgtY29udHJvbHMuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7Y29uc3QgZj0vZGV2aWNlOihbXjpdKzpbMC05XSspJC8sZz1be3JlZ2V4OmZ9XSxsPVtdO2xldCBrOyhmdW5jdGlvbihwKXtwLkNPTVBVVEVfVElNRT0iY29tcHV0ZV90aW1lIjtwLk1FTU9SWT0ibWVtb3J5IjtwLlNUUlVDVFVSRT0ic3RydWN0dXJlIjtwLlhMQV9DTFVTVEVSPSJ4bGFfY2x1c3RlciI7cC5PUF9DT01QQVRJQklMSVRZPSJvcF9jb21wYXRpYmlsaXR5In0pKGs9ZC5Db2xvckJ5fHwoZC5Db2xvckJ5PXt9KSk7Y29uc3Qgbj1uZXcgU2V0KFtrLkNPTVBVVEVfVElNRSxrLk1FTU9SWV0pO1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1jb250cm9scyIscHJvcGVydGllczp7c3RhdHM6e3ZhbHVlOm51bGwsdHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9zdGF0c0NoYW5nZWQifSxkZXZpY2VzRm9yU3RhdHM6e3ZhbHVlOm51bGwsdHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRvbmx5OiEwfSxjb2xvckJ5Ont0eXBlOlN0cmluZywKdmFsdWU6ay5TVFJVQ1RVUkUsbm90aWZ5OiEwfSxjb2xvckJ5UGFyYW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITAscmVhZG9ubHk6ITB9LGRhdGFzZXRzOnt0eXBlOkFycmF5LG9ic2VydmVyOiJfZGF0YXNldHNDaGFuZ2VkIix2YWx1ZTooKT0+W119LHJlbmRlckhpZXJhcmNoeTp7dHlwZTpPYmplY3R9LHNlbGVjdGlvbjp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwLGNvbXB1dGVkOiJfY29tcHV0ZVNlbGVjdGlvbihkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4LCBfc2VsZWN0ZWRHcmFwaFR5cGUpIn0sc2VsZWN0ZWRGaWxlOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LF9zZWxlY3RlZFJ1bkluZGV4Ont0eXBlOk51bWJlcix2YWx1ZTowLG9ic2VydmVyOiJfc2VsZWN0ZWRSdW5JbmRleENoYW5nZWQifSx0cmFjZUlucHV0czp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0sX3NlbGVjdGVkVGFnSW5kZXg6e3R5cGU6TnVtYmVyLAp2YWx1ZTowLG9ic2VydmVyOiJfc2VsZWN0ZWRUYWdJbmRleENoYW5nZWQifSxfc2VsZWN0ZWRHcmFwaFR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOmEuZ3JhcGguU2VsZWN0aW9uVHlwZS5PUF9HUkFQSH0sc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9jdXJyZW50RGV2aWNlczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEN1cnJlbnREZXZpY2VzKGRldmljZXNGb3JTdGF0cykifSxfY3VycmVudERldmljZVBhcmFtczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEN1cnJlbnREZXZpY2VQYXJhbXMoY29sb3JCeVBhcmFtcykifSxfY3VycmVudFhsYUNsdXN0ZXJQYXJhbXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9nZXRDdXJyZW50WGxhQ2x1c3RlclBhcmFtcyhjb2xvckJ5UGFyYW1zKSJ9LF9jdXJyZW50R3JhZGllbnRQYXJhbXM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0Q3VycmVudEdyYWRpZW50UGFyYW1zKGNvbG9yQnlQYXJhbXMsIGNvbG9yQnkpIn0sCnNob3dTZXNzaW9uUnVuc0Ryb3Bkb3duOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LHNob3dVcGxvYWRCdXR0b246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0saGVhbHRoUGlsbHNGZWF0dXJlRW5hYmxlZDpCb29sZWFuLGhlYWx0aFBpbGxzVG9nZ2xlZE9uOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSxfbGVnZW5kT3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9fSxfeGxhQ2x1c3RlcnNQcm92aWRlZDpmdW5jdGlvbihwKXtyZXR1cm4gcCYmcC5oaWVyYXJjaHkmJjA8cC5oaWVyYXJjaHkueGxhQ2x1c3RlcnMubGVuZ3RofSxfc3RhdHNDaGFuZ2VkOmZ1bmN0aW9uKHApe2lmKG51bGwhPXApe3ZhciBxPXt9O18uZWFjaChwLmRldl9zdGF0cyxmdW5jdGlvbihyKXt2YXIgdD1fLnNvbWUoZyxmdW5jdGlvbih5KXtyZXR1cm4geS5yZWdleC50ZXN0KHIuZGV2aWNlKX0pLHY9Xy5zb21lKGwsZnVuY3Rpb24oeSl7cmV0dXJuIHkucmVnZXgudGVzdChyLmRldmljZSl9KTt0JiYhdiYmKHFbci5kZXZpY2VdPQohMCl9KTt0aGlzLnNldCgiZGV2aWNlc0ZvclN0YXRzIixxKX19LF9nZXRDdXJyZW50RGV2aWNlczpmdW5jdGlvbihwKXt2YXIgcT10aGlzLnN0YXRzO3E9KHE/cS5kZXZfc3RhdHM6W10pLm1hcCh0PT50LmRldmljZSkuZmlsdGVyKHQ9Pmcuc29tZSh2PT52LnJlZ2V4LnRlc3QodCkpKTtjb25zdCByPWEuZ3JhcGgudXRpbC5yZW1vdmVDb21tb25QcmVmaXgocSk7aWYoMT09ci5sZW5ndGgpe2NvbnN0IHQ9clswXS5tYXRjaChmKTt0JiYoclswXT10WzFdKX1yZXR1cm4gcS5tYXAoKHQsdik9PntsZXQgeT1udWxsO2wuZm9yRWFjaCh6PT57ei5yZWdleC50ZXN0KHQpJiYoeT16Lm1zZyl9KTtyZXR1cm57ZGV2aWNlOnQsc3VmZml4OnJbdl0sdXNlZDpwW3RdLGlnbm9yZWRNc2c6eX19KX0sX2RldmljZUNoZWNrYm94Q2xpY2tlZDpmdW5jdGlvbihwKXtwPXAudGFyZ2V0O2NvbnN0IHE9T2JqZWN0LmFzc2lnbih7fSx0aGlzLmRldmljZXNGb3JTdGF0cykscj1wLnZhbHVlO3AuY2hlY2tlZD8KcVtyXT0hMDpkZWxldGUgcVtyXTt0aGlzLnNldCgiZGV2aWNlc0ZvclN0YXRzIixxKX0sX251bVRhZ3M6ZnVuY3Rpb24ocCxxKXtyZXR1cm4gdGhpcy5fZ2V0VGFncyhwLHEpLmxlbmd0aH0sX2dldFRhZ3M6ZnVuY3Rpb24ocCxxKXtyZXR1cm4gcCYmcFtxXT9wW3FdLnRhZ3M6W119LF9maXQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoImZpdC10YXAiKX0sX2lzR3JhZGllbnRDb2xvcmluZzpmdW5jdGlvbihwLHEpe3JldHVybiBuLmhhcyhxKSYmbnVsbCE9cH0sX2VxdWFsczpmdW5jdGlvbihwLHEpe3JldHVybiBwPT09cX0sX2dldEN1cnJlbnREZXZpY2VQYXJhbXM6ZnVuY3Rpb24ocCl7cD1wLmRldmljZS5maWx0ZXIodD0+Zy5zb21lKHY9PnYucmVnZXgudGVzdCh0LmRldmljZSkpKTtjb25zdCBxPWEuZ3JhcGgudXRpbC5yZW1vdmVDb21tb25QcmVmaXgocC5tYXAodD0+dC5kZXZpY2UpKTtpZigxPT1xLmxlbmd0aCl7dmFyIHI9cVswXS5tYXRjaChmKTtyJiYocVswXT1yWzFdKX1yZXR1cm4gcC5tYXAoKHQsCnYpPT4oe2RldmljZTpxW3ZdLGNvbG9yOnQuY29sb3J9KSl9LF9nZXRDdXJyZW50WGxhQ2x1c3RlclBhcmFtczpmdW5jdGlvbihwKXtyZXR1cm4gcC54bGFfY2x1c3Rlcn0sX2dldEN1cnJlbnRHcmFkaWVudFBhcmFtczpmdW5jdGlvbihwLHEpe2lmKHRoaXMuX2lzR3JhZGllbnRDb2xvcmluZyh0aGlzLnN0YXRzLHEpKXtwPXBbcV07dmFyIHI9cC5taW5WYWx1ZSx0PXAubWF4VmFsdWU7cT09PWsuTUVNT1JZPyhyPWEuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUocixhLmdyYXBoLnV0aWwuTUVNT1JZX1VOSVRTKSx0PWEuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUodCxhLmdyYXBoLnV0aWwuTUVNT1JZX1VOSVRTKSk6cT09PWsuQ09NUFVURV9USU1FJiYocj1hLmdyYXBoLnV0aWwuY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKHIsYS5ncmFwaC51dGlsLlRJTUVfVU5JVFMpLHQ9YS5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZSh0LAphLmdyYXBoLnV0aWwuVElNRV9VTklUUykpO3JldHVybnttaW5WYWx1ZTpyLG1heFZhbHVlOnQsc3RhcnRDb2xvcjpwLnN0YXJ0Q29sb3IsZW5kQ29sb3I6cC5lbmRDb2xvcn19fSxkb3dubG9hZDpmdW5jdGlvbigpe3RoaXMuJC5ncmFwaGRvd25sb2FkLmNsaWNrKCl9LF91cGRhdGVGaWxlSW5wdXQ6ZnVuY3Rpb24ocCl7dmFyIHE9cC50YXJnZXQuZmlsZXNbMF07aWYocSl7cT1xLm5hbWU7dmFyIHI9cS5sYXN0SW5kZXhPZigiLiIpOzA8PXImJihxPXEuc3Vic3RyaW5nKDAscikpO3I9cS5sYXN0SW5kZXhPZigiLyIpOzA8PXImJihxPXEuc3Vic3RyaW5nKHIrMSkpO3RoaXMuX3NldERvd25sb2FkRmlsZW5hbWUocSk7dGhpcy5zZXQoInNlbGVjdGVkRmlsZSIscCl9fSxfZGF0YXNldHNDaGFuZ2VkOmZ1bmN0aW9uKHAscSl7bnVsbCE9cSYmKHRoaXMuX3NlbGVjdGVkUnVuSW5kZXg9MCl9LF9jb21wdXRlU2VsZWN0aW9uOmZ1bmN0aW9uKHAscSxyLHQpe3JldHVybiBwW3FdJiZwW3FdLnRhZ3Nbcl0/CntydW46cFtxXS5uYW1lLHRhZzpwW3FdLnRhZ3Nbcl0udGFnLHR5cGU6dH06bnVsbH0sX3NlbGVjdGVkUnVuSW5kZXhDaGFuZ2VkOmZ1bmN0aW9uKHApe3RoaXMuZGF0YXNldHMmJih0aGlzLmNvbG9yQnk9ay5TVFJVQ1RVUkUsdGhpcy5fc2VsZWN0ZWRUYWdJbmRleD0wLHRoaXMuX3NlbGVjdGVkR3JhcGhUeXBlPXRoaXMuX2dldERlZmF1bHRTZWxlY3Rpb25UeXBlKCksdGhpcy50cmFjZUlucHV0cz0hMSx0aGlzLl9zZXREb3dubG9hZEZpbGVuYW1lKHRoaXMuZGF0YXNldHNbcF0/dGhpcy5kYXRhc2V0c1twXS5uYW1lOiIiKSl9LF9zZWxlY3RlZFRhZ0luZGV4Q2hhbmdlZCgpe3RoaXMuX3NlbGVjdGVkR3JhcGhUeXBlPXRoaXMuX2dldERlZmF1bHRTZWxlY3Rpb25UeXBlKCl9LF9nZXREZWZhdWx0U2VsZWN0aW9uVHlwZSgpe2NvbnN0IHtkYXRhc2V0czpwLF9zZWxlY3RlZFJ1bkluZGV4OnEsX3NlbGVjdGVkVGFnSW5kZXg6cn09dGhpcztyZXR1cm4gcCYmcFtxXSYmcFtxXS50YWdzW3JdJiYKIXBbcV0udGFnc1tyXS5vcEdyYXBoP3BbcV0udGFnc1tyXS5wcm9maWxlP2EuZ3JhcGguU2VsZWN0aW9uVHlwZS5QUk9GSUxFOnBbcV0udGFnc1tyXS5jb25jZXB0dWFsR3JhcGg/YS5ncmFwaC5TZWxlY3Rpb25UeXBlLkNPTkNFUFRVQUxfR1JBUEg6YS5ncmFwaC5TZWxlY3Rpb25UeXBlLk9QX0dSQVBIOmEuZ3JhcGguU2VsZWN0aW9uVHlwZS5PUF9HUkFQSH0sX2dldEZpbGU6ZnVuY3Rpb24oKXt0aGlzLiQkKCIjZmlsZSIpLmNsaWNrKCl9LF9zZXREb3dubG9hZEZpbGVuYW1lOmZ1bmN0aW9uKHApe3RoaXMuJC5ncmFwaGRvd25sb2FkLnNldEF0dHJpYnV0ZSgiZG93bmxvYWQiLHArIi5wbmciKX0sX3N0YXRzTm90TnVsbDpmdW5jdGlvbihwKXtyZXR1cm4gbnVsbCE9PXB9LF90b2dnbGVMZWdlbmRPcGVuKCl7dGhpcy5zZXQoIl9sZWdlbmRPcGVuZWQiLCF0aGlzLl9sZWdlbmRPcGVuZWQpfSxfZ2V0VG9nZ2xlVGV4dChwKXtyZXR1cm4gcD8iQ2xvc2UgbGVnZW5kLiI6IkV4cGFuZCBsZWdlbmQuIn0sCl9nZXRUb2dnbGVMZWdlbmRJY29uKHApe3JldHVybiBwPyJleHBhbmQtbW9yZSI6ImV4cGFuZC1sZXNzIn0sX2dldFNlbGVjdGlvbk9wR3JhcGhEaXNhYmxlZChwLHEscil7cmV0dXJuIXBbcV18fCFwW3FdLnRhZ3Nbcl18fCFwW3FdLnRhZ3Nbcl0ub3BHcmFwaH0sX2dldFNlbGVjdGlvblByb2ZpbGVEaXNhYmxlZChwLHEscil7cmV0dXJuIXBbcV18fCFwW3FdLnRhZ3Nbcl18fCFwW3FdLnRhZ3Nbcl0ucHJvZmlsZX0sX2dldFNlbGVjdGlvbkNvbmNlcHR1YWxHcmFwaERpc2FibGVkKHAscSxyKXtyZXR1cm4hcFtxXXx8IXBbcV0udGFnc1tyXXx8IXBbcV0udGFnc1tyXS5jb25jZXB0dWFsR3JhcGh9fSl9KShjLmNvbnRyb2xzfHwoYy5jb250cm9scz17fSkpfSkoYS5ncmFwaHx8KGEuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1sb2FkZXIvdGYtZ3JhcGgtZGFzaGJvYXJkLWxvYWRlci5qcwpmcD10aGlzJiZ0aGlzLl9fYXdhaXRlcnx8ZnVuY3Rpb24oYSxjLGQsZil7cmV0dXJuIG5ldyAoZHx8KGQ9UHJvbWlzZSkpKGZ1bmN0aW9uKGcsbCl7ZnVuY3Rpb24gayhxKXt0cnl7cChmLm5leHQocSkpfWNhdGNoKHIpe2wocil9fWZ1bmN0aW9uIG4ocSl7dHJ5e3AoZlsidGhyb3ciXShxKSl9Y2F0Y2gocil7bChyKX19ZnVuY3Rpb24gcChxKXtxLmRvbmU/ZyhxLnZhbHVlKToobmV3IGQoZnVuY3Rpb24ocil7cihxLnZhbHVlKX0pKS50aGVuKGssbil9cCgoZj1mLmFwcGx5KGEsY3x8W10pKS5uZXh0KCkpfSl9OwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1kYXNoYm9hcmQtbG9hZGVyIixfdGVtcGxhdGU6bnVsbCxwcm9wZXJ0aWVzOntkYXRhc2V0czpBcnJheSxwcm9ncmVzczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxzZWxlY3Rpb246T2JqZWN0LHNlbGVjdGVkRmlsZTpPYmplY3QsY29tcGF0aWJpbGl0eVByb3ZpZGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGEuZ3JhcGgub3AuVHB1Q29tcGF0aWJpbGl0eVByb3ZpZGVyfSxoaWVyYXJjaHlQYXJhbXM6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5hLmdyYXBoLmhpZXJhcmNoeS5EZWZhdWx0SGllcmFyY2h5UGFyYW1zfSxvdXRHcmFwaEhpZXJhcmNoeTp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxvdXRHcmFwaDp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxvdXRTdGF0czp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSwKX2dyYXBoUnVuVGFnOk9iamVjdH0sb2JzZXJ2ZXJzOlsiX3NlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uLCBjb21wYXRpYmlsaXR5UHJvdmlkZXIpIiwiX3NlbGVjdGVkRmlsZUNoYW5nZWQoc2VsZWN0ZWRGaWxlLCBjb21wYXRpYmlsaXR5UHJvdmlkZXIpIl0sX3NlbGVjdGlvbkNoYW5nZWQoKXt0aGlzLmRlYm91bmNlKCJzZWxlY3Rpb25jaGFuZ2UiLCgpPT57dGhpcy5fbG9hZCh0aGlzLnNlbGVjdGlvbil9KX0sX2xvYWQ6ZnVuY3Rpb24oZCl7Y29uc3Qge3J1bjpmLHRhZzpnLHR5cGU6bH09ZDtzd2l0Y2gobCl7Y2FzZSBhLmdyYXBoLlNlbGVjdGlvblR5cGUuT1BfR1JBUEg6Y2FzZSBhLmdyYXBoLlNlbGVjdGlvblR5cGUuQ09OQ0VQVFVBTF9HUkFQSDpyZXR1cm4gdGhpcy5fc2V0T3V0U3RhdHMobnVsbCksZD1uZXcgVVJMU2VhcmNoUGFyYW1zLGQuc2V0KCJydW4iLGYpLGQuc2V0KCJjb25jZXB0dWFsIixTdHJpbmcobD09PWEuZ3JhcGguU2VsZWN0aW9uVHlwZS5DT05DRVBUVUFMX0dSQVBIKSksCmcmJmQuc2V0KCJ0YWciLGcpLGQ9UW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImdyYXBocyIsIi9ncmFwaCIsZCksdGhpcy5fZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChkKS50aGVuKCgpPT57dGhpcy5fZ3JhcGhSdW5UYWc9e3J1bjpmLHRhZzpnfX0pO2Nhc2UgYS5ncmFwaC5TZWxlY3Rpb25UeXBlLlBST0ZJTEU6eyh7dGFnczpkfT10aGlzLmRhdGFzZXRzLmZpbmQoKHtuYW1lOnF9KT0+cT09PWYpKTtjb25zdCBrPWQuZmluZChxPT5xLnRhZz09PWcpLm9wR3JhcGg/ZzpudWxsO2NvbnNvbGUuYXNzZXJ0KGQuZmluZChxPT5xLnRhZz09PWspLGBSZXF1aXJlZCB0YWcgKCR7a30pIGlzIG1pc3NpbmcuYCk7ZD10aGlzLl9ncmFwaFJ1blRhZyYmdGhpcy5fZ3JhcGhSdW5UYWcucnVuPT09ZiYmdGhpcy5fZ3JhcGhSdW5UYWcudGFnPT09az9Qcm9taXNlLnJlc29sdmUoKTp0aGlzLl9sb2FkKHtydW46Zix0YWc6ayx0eXBlOmEuZ3JhcGguU2VsZWN0aW9uVHlwZS5PUF9HUkFQSH0pOwpjb25zdCBuPW5ldyBVUkxTZWFyY2hQYXJhbXM7bi5zZXQoInRhZyIsZyk7bi5zZXQoInJ1biIsZik7Y29uc3QgcD1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZ3JhcGhzIiwiL3J1bl9tZXRhZGF0YSIsbik7cmV0dXJuIGQudGhlbigoKT0+dGhpcy5fcmVhZEFuZFBhcnNlTWV0YWRhdGEocCkpfWRlZmF1bHQ6cmV0dXJuIFByb21pc2UucmVqZWN0KEVycm9yKGBVbmtub3duIHNlbGVjdGlvbiB0eXBlOiAke2x9YCkpfX0sX3JlYWRBbmRQYXJzZU1ldGFkYXRhOmZ1bmN0aW9uKGQpe3RoaXMuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOjAsbXNnOiIifSk7YS5ncmFwaC5wYXJzZXIuZmV0Y2hBbmRQYXJzZU1ldGFkYXRhKGQsYS5ncmFwaC51dGlsLmdldFRyYWNrZXIodGhpcykpLnRoZW4oZj0+e3RoaXMuX3NldE91dFN0YXRzKGYpfSl9LF9mZXRjaEFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoOmZ1bmN0aW9uKGQsZil7cmV0dXJuIGZwKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXt0aGlzLnNldCgicHJvZ3Jlc3MiLAp7dmFsdWU6MCxtc2c6IiJ9KTtyZXR1cm4gYS5ncmFwaC5sb2FkZXIuZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChhLmdyYXBoLnV0aWwuZ2V0VHJhY2tlcih0aGlzKSxkLGYsdGhpcy5jb21wYXRpYmlsaXR5UHJvdmlkZXIsdGhpcy5oaWVyYXJjaHlQYXJhbXMpLnRoZW4oKHtncmFwaDpnLGdyYXBoSGllcmFyY2h5Omx9KT0+e3RoaXMuX3NldE91dEdyYXBoKGcpO3RoaXMuX3NldE91dEdyYXBoSGllcmFyY2h5KGwpfSl9KX0sX3NlbGVjdGVkRmlsZUNoYW5nZWQ6ZnVuY3Rpb24oZCl7aWYoZCl7ZD1kLnRhcmdldDt2YXIgZj1kLmZpbGVzWzBdO2YmJihkLnZhbHVlPSIiLHRoaXMuX2ZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgobnVsbCxmKSl9fX0pfSkoYy5sb2FkZXJ8fChjLmxvYWRlcj17fSkpfSkoYS5ncmFwaHx8KGEuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1kYXNoYm9hcmQvdGYtZ3JhcGgtZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWdyYXBoLWRhc2hib2FyZCIscHJvcGVydGllczp7X2RhdGFzZXRzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX2RhdGFzZXRzRmV0Y2hlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfc2VsZWN0ZWREYXRhc2V0Ont0eXBlOk51bWJlcix2YWx1ZTowfSxfcmVuZGVySGllcmFyY2h5Ont0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3JlbmRlckhpZXJhcmNoeUNoYW5nZWQifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUW8uUmVxdWVzdE1hbmFnZXJ9LF9jYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUW8uQ2FuY2VsbGVyfSxfZGVidWdnZXJEYXRhRW5hYmxlZDpCb29sZWFuLGFsbFN0ZXBzTW9kZUVuYWJsZWQ6Qm9vbGVhbixzcGVjaWZpY0hlYWx0aFBpbGxTdGVwOnt0eXBlOk51bWJlcix2YWx1ZTowfSxoZWFsdGhQaWxsc1RvZ2dsZWRPbjp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfaGVhbHRoUGlsbHNUb2dnbGVkT25DaGFuZ2VkIn0sCnNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxfaXNBdHRhY2hlZDpCb29sZWFuLF9pbml0aWFsaXplZDpCb29sZWFuLF9hcmVIZWFsdGhQaWxsc0xvYWRpbmc6Qm9vbGVhbixfZGVidWdnZXJOdW1lcmljQWxlcnRzOnt0eXBlOkFycmF5LHZhbHVlOltdLG5vdGlmeTohMH0sX25vZGVOYW1lc1RvSGVhbHRoUGlsbHM6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfaGVhbHRoUGlsbFN0ZXBJbmRleDpOdW1iZXIsX2hlYWx0aFBpbGxSZXF1ZXN0SWQ6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LF9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkOk51bWJlcixfaGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJEZWxheTp7dHlwZTpOdW1iZXIsdmFsdWU6NTAwLHJlYWRPbmx5OiEwfSxydW5zOkFycmF5LHJ1bjp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLHZhbHVlOlRvLmdldFN0cmluZ0luaXRpYWxpemVyKCJydW4iLHtkZWZhdWx0VmFsdWU6IiIsdXNlTG9jYWxTdG9yYWdlOiExfSksb2JzZXJ2ZXI6Il9ydW5PYnNlcnZlciJ9LApfc2VsZWN0aW9uOnt0eXBlOk9iamVjdH0sX2NvbXBhdGliaWxpdHlQcm92aWRlcjpPYmplY3QsX3RyYWNlSW5wdXRzOkJvb2xlYW59LGxpc3RlbmVyczp7Im5vZGUtdG9nZ2xlLWV4cGFuZCI6Il9oYW5kbGVOb2RlVG9nZ2xlRXhwYW5kIn0sb2JzZXJ2ZXJzOlsiX21heWJlRmV0Y2hIZWFsdGhQaWxscyhfZGVidWdnZXJEYXRhRW5hYmxlZCwgYWxsU3RlcHNNb2RlRW5hYmxlZCwgc3BlY2lmaWNIZWFsdGhQaWxsU3RlcCwgX3NlbGVjdGVkTm9kZSkiLCJfbWF5YmVJbml0aWFsaXplRGFzaGJvYXJkKF9pc0F0dGFjaGVkKSIsIl9kZXRlcm1pbmVTZWxlY3RlZERhdGFzZXQoX2RhdGFzZXRzRmV0Y2hlZCwgX2RhdGFzZXRzLCBydW4pIiwiX3VwZGF0ZVNlbGVjdGVkRGF0YXNldE5hbWUoX2RhdGFzZXRzRmV0Y2hlZCwgX2RhdGFzZXRzLCBfc2VsZWN0ZWREYXRhc2V0KSJdLGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9pc0F0dGFjaGVkIiwhMCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9pc0F0dGFjaGVkIiwKITEpfSxyZWxvYWQ6ZnVuY3Rpb24oKXt0aGlzLl9kZWJ1Z2dlckRhdGFFbmFibGVkfHx0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KFFvLmdldFJvdXRlcigpLnBsdWdpbnNMaXN0aW5nKCkpLnRoZW4odGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKGE9PnthLmNhbmNlbGxlZHx8YS52YWx1ZVsiZGVidWdnZXIiXSYmdGhpcy5zZXQoIl9kZWJ1Z2dlckRhdGFFbmFibGVkIiwhMCl9KSk7dGhpcy5fbWF5YmVGZXRjaEhlYWx0aFBpbGxzKCl9LF9maXQ6ZnVuY3Rpb24oKXt0aGlzLiQkKCIjZ3JhcGhib2FyZCIpLmZpdCgpfSxfcnVuT2JzZXJ2ZXI6VG8uZ2V0U3RyaW5nT2JzZXJ2ZXIoInJ1biIse2RlZmF1bHRWYWx1ZToiIixwb2x5bWVyUHJvcGVydHk6InJ1biIsdXNlTG9jYWxTdG9yYWdlOiExfSksX2ZldGNoRGF0YXNldCgpe3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KFFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJncmFwaHMiLCIvaW5mbyIpKX0sX2ZldGNoSGVhbHRoUGlsbHMoYSwKYyl7YT17bm9kZV9uYW1lczpKU09OLnN0cmluZ2lmeShhKSxydW46Il9fZGVidWdnZXJfZGF0YV9fIn07dm9pZCAwIT09YyYmKGEuc3RlcD1jKTtjPVFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9oZWFsdGhfcGlsbHMiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChjLGEpfSxfZmV0Y2hEZWJ1Z2dlck51bWVyaWNzQWxlcnRzKCl7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoUW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL251bWVyaWNzX2FsZXJ0X3JlcG9ydCIpKX0sX2dyYXBoVXJsKGEsYyxkKXtyZXR1cm4gUW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImdyYXBocyIsIi9ncmFwaCIsbmV3IFVSTFNlYXJjaFBhcmFtcyh7cnVuOmEsbGltaXRfYXR0cl9zaXplOmMsbGFyZ2VfYXR0cnNfa2V5OmR9KSl9LF9zaG91bGRSZXF1ZXN0SGVhbHRoUGlsbHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVidWdnZXJEYXRhRW5hYmxlZCYmCnRoaXMuaGVhbHRoUGlsbHNUb2dnbGVkT24mJnRoaXMuX3JlbmRlckhpZXJhcmNoeSYmdGhpcy5fZGF0YXNldHNTdGF0ZSh0aGlzLl9kYXRhc2V0c0ZldGNoZWQsdGhpcy5fZGF0YXNldHMsIlBSRVNFTlQiKX0sX21heWJlSW5pdGlhbGl6ZURhc2hib2FyZDpmdW5jdGlvbihhKXshdGhpcy5faW5pdGlhbGl6ZWQmJmEmJih0aGlzLnNldCgiX2NvbXBhdGliaWxpdHlQcm92aWRlciIsbmV3IHRmLmdyYXBoLm9wLlRwdUNvbXBhdGliaWxpdHlQcm92aWRlciksdGhpcy5faW5pdGlhbGl6ZWQ9ITAsdGhpcy5fZmV0Y2hEYXRhc2V0KCkudGhlbihjPT57dGhpcy5fZGF0YXNldHM9T2JqZWN0LmtleXMoYykuc29ydChnbi5jb21wYXJlVGFnTmFtZXMpLm1hcChkPT57Y29uc3QgZj1jW2RdO3ZhciBnPU9iamVjdC5rZXlzKGYudGFncykuc29ydChnbi5jb21wYXJlVGFnTmFtZXMpLm1hcChsPT5mLnRhZ3NbbF0pLm1hcCgoe3RhZzpsLGNvbmNlcHR1YWxfZ3JhcGg6ayxvcF9ncmFwaDpuLHByb2ZpbGU6cH0pPT4KKHt0YWc6bCxkaXNwbGF5TmFtZTpsLGNvbmNlcHR1YWxHcmFwaDprLG9wR3JhcGg6bixwcm9maWxlOnB9KSk7Zz1mLnJ1bl9ncmFwaD9be3RhZzpudWxsLGRpc3BsYXlOYW1lOiJEZWZhdWx0Iixjb25jZXB0dWFsR3JhcGg6ITEsb3BHcmFwaDohMCxwcm9maWxlOiExfSwuLi5nXTpnO3JldHVybntuYW1lOmQsdGFnczpnfX0pO3RoaXMuX2RhdGFzZXRzRmV0Y2hlZD0hMH0pKX0sX2RldGVybWluZVNlbGVjdGVkRGF0YXNldChhLGMsZCl7ZD8oYz1jLmZpbmRJbmRleChmPT5mLm5hbWU9PT1kKSwtMT09PWM/YSYmKGE9dGhpcy4kJCgiI2Vycm9yLWRpYWxvZyIpLGEudGV4dENvbnRlbnQ9YE5vIGRhdGFzZXQgbmFtZWQgIiR7ZH0iIGNvdWxkIGJlIGZvdW5kLmAsYS5vcGVuKCkpOnRoaXMuc2V0KCJfc2VsZWN0ZWREYXRhc2V0IixjKSk6dGhpcy5zZXQoIl9zZWxlY3RlZERhdGFzZXQiLDApfSxfdXBkYXRlU2VsZWN0ZWREYXRhc2V0TmFtZShhLGMsZCl7YSYmKGMubGVuZ3RoPD1kfHx0aGlzLnNldCgicnVuIiwKY1tkXS5uYW1lKSl9LF9yZXF1ZXN0SGVhbHRoUGlsbHM6ZnVuY3Rpb24oKXt0aGlzLnNldCgiX2FyZUhlYWx0aFBpbGxzTG9hZGluZyIsITApO3ZhciBhPSsrdGhpcy5faGVhbHRoUGlsbFJlcXVlc3RJZDtudWxsIT09dGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZCksdGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZD1udWxsKTt0aGlzLmFsbFN0ZXBzTW9kZUVuYWJsZWQ/dGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZD1udWxsO3RoaXMuX2luaXRpYXRlTmV0d29ya1JlcXVlc3RGb3JIZWFsdGhQaWxscyhhKX0uYmluZCh0aGlzKSx0aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lckRlbGF5KTp0aGlzLl9pbml0aWF0ZU5ldHdvcmtSZXF1ZXN0Rm9ySGVhbHRoUGlsbHMoYSl9LApfaW5pdGlhdGVOZXR3b3JrUmVxdWVzdEZvckhlYWx0aFBpbGxzOmZ1bmN0aW9uKGEpe2lmKHRoaXMuX2hlYWx0aFBpbGxSZXF1ZXN0SWQ9PT1hKXt2YXIgYz10aGlzLl9mZXRjaEhlYWx0aFBpbGxzKHRoaXMuX3JlbmRlckhpZXJhcmNoeS5nZXROYW1lc09mUmVuZGVyZWRPcHMoKSx0aGlzLmFsbFN0ZXBzTW9kZUVuYWJsZWQ/dGhpcy5zcGVjaWZpY0hlYWx0aFBpbGxTdGVwOnZvaWQgMCksZD10aGlzLl9mZXRjaERlYnVnZ2VyTnVtZXJpY3NBbGVydHMoKTtQcm9taXNlLmFsbChbYyxkXSkudGhlbihmdW5jdGlvbihmKXt2YXIgZz1mWzBdO2Y9ZlsxXTtpZih0aGlzLmhlYWx0aFBpbGxzVG9nZ2xlZE9uJiZhPT09dGhpcy5faGVhbHRoUGlsbFJlcXVlc3RJZCl7Zm9yKHZhciBsIGluIGcpe3RoaXMuc2V0KCJfaGVhbHRoUGlsbFN0ZXBJbmRleCIsZ1tsXS5sZW5ndGgtMSk7YnJlYWt9dGhpcy5zZXQoIl9kZWJ1Z2dlck51bWVyaWNBbGVydHMiLGYpO3RoaXMuc2V0KCJfbm9kZU5hbWVzVG9IZWFsdGhQaWxscyIsCmcpO3RoaXMuc2V0KCJfYXJlSGVhbHRoUGlsbHNMb2FkaW5nIiwhMSk7dGhpcy5zZXQoIl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkIixudWxsKX19LmJpbmQodGhpcykpfX0sX2RhdGFzZXRzU3RhdGU6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiBhP2MmJmMubGVuZ3RoPyJQUkVTRU5UIj09PWQ6IkVNUFRZIj09PWQ6Ik5PVF9MT0FERUQiPT09ZH0sX3JlbmRlckhpZXJhcmNoeUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLnJlbG9hZCgpfSxfaGFuZGxlTm9kZVRvZ2dsZUV4cGFuZDpmdW5jdGlvbigpe3RoaXMuX21heWJlRmV0Y2hIZWFsdGhQaWxscygpfSxfaGVhbHRoUGlsbHNUb2dnbGVkT25DaGFuZ2VkOmZ1bmN0aW9uKGEpe2E/dGhpcy5yZWxvYWQoKTp0aGlzLnNldCgiX25vZGVOYW1lc1RvSGVhbHRoUGlsbHMiLHt9KX0sX21heWJlRmV0Y2hIZWFsdGhQaWxsczpmdW5jdGlvbigpe3RoaXMuX3Nob3VsZFJlcXVlc3RIZWFsdGhQaWxscygpJiZ0aGlzLl9yZXF1ZXN0SGVhbHRoUGlsbHMoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1kaXN0cmlidXRpb24tY2hhcnQvdnotZGlzdHJpYnV0aW9uLWNoYXJ0LmpzCnZhciBucDsKKGZ1bmN0aW9uKGEpe2NsYXNzIGN7Y29uc3RydWN0b3IoZCxmKXt0aGlzLnJ1bjJkYXRhc2V0cz17fTt0aGlzLmNvbG9yU2NhbGU9Zjt0aGlzLmJ1aWxkQ2hhcnQoZCl9Z2V0RGF0YXNldChkKXt2b2lkIDA9PT10aGlzLnJ1bjJkYXRhc2V0c1tkXSYmKHRoaXMucnVuMmRhdGFzZXRzW2RdPW5ldyBQbG90dGFibGUuRGF0YXNldChbXSx7cnVuOmR9KSk7cmV0dXJuIHRoaXMucnVuMmRhdGFzZXRzW2RdfWJ1aWxkQ2hhcnQoZCl7dGhpcy5vdXRlciYmdGhpcy5vdXRlci5kZXN0cm95KCk7ZD0kby5nZXRYQ29tcG9uZW50cyhkKTt0aGlzLnhBY2Nlc3Nvcj1kLmFjY2Vzc29yO3RoaXMueFNjYWxlPWQuc2NhbGU7dGhpcy54QXhpcz1kLmF4aXM7dGhpcy54QXhpcy5tYXJnaW4oMCkudGlja0xhYmVsUGFkZGluZygzKTt0aGlzLnlTY2FsZT1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXI7dGhpcy55QXhpcz1uZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyh0aGlzLnlTY2FsZSwibGVmdCIpO2Q9CiRvLm11bHRpc2NhbGVGb3JtYXR0ZXIoJG8uWV9BWElTX0ZPUk1BVFRFUl9QUkVDSVNJT04pO3RoaXMueUF4aXMubWFyZ2luKDApLnRpY2tMYWJlbFBhZGRpbmcoNSkuZm9ybWF0dGVyKGQpO3RoaXMueUF4aXMudXNlc1RleHRXaWR0aEFwcHJveGltYXRpb24oKTtkPXRoaXMuYnVpbGRQbG90KHRoaXMueEFjY2Vzc29yLHRoaXMueFNjYWxlLHRoaXMueVNjYWxlKTt0aGlzLmdyaWRsaW5lcz1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JpZGxpbmVzKHRoaXMueFNjYWxlLHRoaXMueVNjYWxlKTt0aGlzLmNlbnRlcj1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JvdXAoW3RoaXMuZ3JpZGxpbmVzLGRdKTt0aGlzLm91dGVyPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5UYWJsZShbW3RoaXMueUF4aXMsdGhpcy5jZW50ZXJdLFtudWxsLHRoaXMueEF4aXNdXSl9YnVpbGRQbG90KGQsZixnKXtsZXQgbD1bMCwyMjgsMTU4NywzMDg1LDVFMyw2OTE1LDg0MTMsOTc3MiwxRTRdLGs9Xy5yYW5nZShsLmxlbmd0aC0KMSkubWFwKHQ9PihsW3QrMV0tbFt0XSkvMjUwMCksbj1sLm1hcCgodCx2KT0+eT0+eVt2XVsxXSkscD1uWzRdLHE9Xy5yYW5nZShuLmxlbmd0aC0xKS5tYXAodD0+e2xldCB2PW5ldyBQbG90dGFibGUuUGxvdHMuQXJlYTt2LngoZCxmKTtsZXQgeT00PHQ/blt0XTpuW3QrMV07di55KDQ8dD9uW3QrMV06blt0XSxnKTt2LnkwKHkpO3YuYXR0cigiZmlsbCIsKHoseCxDKT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKEMubWV0YWRhdGEoKS5ydW4pKTt2LmF0dHIoInN0cm9rZSIsKHoseCxDKT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKEMubWV0YWRhdGEoKS5ydW4pKTt2LmF0dHIoInN0cm9rZS13ZWlnaHQiLCgpPT4iMC41cHgiKTt2LmF0dHIoInN0cm9rZS1vcGFjaXR5IiwoKT0+a1t0XSk7di5hdHRyKCJmaWxsLW9wYWNpdHkiLCgpPT5rW3RdKTtyZXR1cm4gdn0pLHI9bmV3IFBsb3R0YWJsZS5QbG90cy5MaW5lO3IueChkLGYpO3IueShwLGcpO3IuYXR0cigic3Ryb2tlIiwodCx2LHkpPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUoeS5ydW4pKTsKdGhpcy5wbG90cz1xO3JldHVybiBuZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JvdXAocSl9c2V0VmlzaWJsZVNlcmllcyhkKXt0aGlzLnJ1bnM9ZDtsZXQgZj1kLm1hcChnPT50aGlzLmdldERhdGFzZXQoZykpO3RoaXMucGxvdHMuZm9yRWFjaChnPT5nLmRhdGFzZXRzKGYpKX1zZXRTZXJpZXNEYXRhKGQsZil7dGhpcy5nZXREYXRhc2V0KGQpLmRhdGEoZil9cmVuZGVyVG8oZCl7dGhpcy50YXJnZXRTVkc9ZDt0aGlzLm91dGVyLnJlbmRlclRvKGQpfXJlZHJhdygpe3RoaXMub3V0ZXIucmVkcmF3KCl9ZGVzdHJveSgpe3RoaXMub3V0ZXIuZGVzdHJveSgpfX1hLkRpc3RyaWJ1dGlvbkNoYXJ0PWM7UG9seW1lcih7aXM6InZ6LWRpc3RyaWJ1dGlvbi1jaGFydCIscHJvcGVydGllczp7Y29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IFBsb3R0YWJsZS5TY2FsZXMuQ29sb3IpLnJhbmdlKGQzLnNjaGVtZUNhdGVnb3J5MTApfX0seFR5cGU6e3R5cGU6U3RyaW5nLAp2YWx1ZToic3RlcCJ9LF9hdHRhY2hlZDpCb29sZWFuLF9jaGFydDpPYmplY3QsX3Zpc2libGVTZXJpZXNDYWNoZTp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX3Nlcmllc0RhdGFDYWNoZTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LF9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ6e3R5cGU6TnVtYmVyLHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6WyJfbWFrZUNoYXJ0KHhUeXBlLCBjb2xvclNjYWxlLCBfYXR0YWNoZWQpIiwiX3JlbG9hZEZyb21DYWNoZShfY2hhcnQpIl0sc2V0VmlzaWJsZVNlcmllczpmdW5jdGlvbihkKXt0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGU9ZDt0aGlzLl9jaGFydCYmKHRoaXMuX2NoYXJ0LnNldFZpc2libGVTZXJpZXMoZCksdGhpcy5yZWRyYXcoKSl9LHNldFNlcmllc0RhdGE6ZnVuY3Rpb24oZCxmKXt0aGlzLl9zZXJpZXNEYXRhQ2FjaGVbZF09Zjt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuc2V0U2VyaWVzRGF0YShkLApmKX0scmVkcmF3OmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQucmVkcmF3KCl9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLmNoYXJ0ZGl2LCEwKX0sX21ha2VDaGFydDpmdW5jdGlvbihkLGYsZyl7bnVsbD09PXRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZCYmdGhpcy5jYW5jZWxBc3luYyh0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQpO3RoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZD10aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkPW51bGw7aWYoZyl7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LmRlc3Ryb3koKTt2YXIgbD1uZXcgYyhkLGYpLGs9ZDMuc2VsZWN0KHRoaXMuJC5jaGFydGRpdik7bC5yZW5kZXJUbyhrKTt0aGlzLl9jaGFydD1sfX0sMzUwKX0sX3JlbG9hZEZyb21DYWNoZTpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiYodGhpcy5fY2hhcnQuc2V0VmlzaWJsZVNlcmllcyh0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUpLAp0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUuZm9yRWFjaChmdW5jdGlvbihkKXt0aGlzLl9jaGFydC5zZXRTZXJpZXNEYXRhKGQsdGhpcy5fc2VyaWVzRGF0YUNhY2hlW2RdfHxbXSl9LmJpbmQodGhpcykpKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hdHRhY2hlZD0hMH0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hdHRhY2hlZD0hMX19KX0pKG5wfHwobnA9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kaXN0cmlidXRpb24tZGFzaGJvYXJkL3RmLWRpc3RyaWJ1dGlvbi1sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZGlzdHJpYnV0aW9uLWxvYWRlciIscHJvcGVydGllczp7cnVuOlN0cmluZyx0YWc6U3RyaW5nLHRhZ01ldGFkYXRhOk9iamVjdCx4VHlwZTpTdHJpbmcsZGF0YVRvTG9hZDp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2NvbXB1dGVEYXRhVG9Mb2FkKHJ1biwgdGFnKSJ9LGdldERhdGFMb2FkTmFtZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+KHtydW46YX0pPT5hfSxnZXREYXRhTG9hZFVybDp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+KHt0YWc6YSxydW46Y30pPT5Rby5hZGRQYXJhbXMoUW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRpc3RyaWJ1dGlvbnMiLCIvZGlzdHJpYnV0aW9ucyIpLHt0YWc6YSxydW46Y30pfSxsb2FkRGF0YUNhbGxiYWNrOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKGEsYyxkKT0+e2E9ZC5tYXAoZj0+e2NvbnN0IFtnLGwsa109ZjtrLndhbGxfdGltZT1uZXcgRGF0ZSgxRTMqZyk7ay5zdGVwPWw7cmV0dXJuIGt9KTsKYz10aGlzLmdldERhdGFMb2FkTmFtZShjKTt0aGlzLiQuY2hhcnQuc2V0U2VyaWVzRGF0YShjLGEpO3RoaXMuJC5jaGFydC5zZXRWaXNpYmxlU2VyaWVzKFtjXSl9fX0sX2NvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe3NjYWxlOlhvLnJ1bnNDb2xvclNjYWxlfSkscmVhZE9ubHk6ITB9LF9ydW5Db2xvcjp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUnVuQ29sb3IocnVuKSJ9LF9leHBhbmRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0scmVxdWVzdE1hbmFnZXI6T2JqZWN0LF9jYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUW8uQ2FuY2VsbGVyfX0sb2JzZXJ2ZXJzOlsicmVsb2FkKHJ1biwgdGFnKSJdLGJlaGF2aW9yczpbVW8uRGF0YUxvYWRlckJlaGF2aW9yXSxfY29tcHV0ZURhdGFUb0xvYWQoYSxjKXtyZXR1cm5be3J1bjphLHRhZzpjfV19LF9jb21wdXRlUnVuQ29sb3IoYSl7cmV0dXJuIHRoaXMuX2NvbG9yU2NhbGUuc2NhbGUoYSl9LApyZWRyYXcoKXt0aGlzLiQuY2hhcnQucmVkcmF3KCl9LF90b2dnbGVFeHBhbmRlZCgpe3RoaXMuc2V0KCJfZXhwYW5kZWQiLCF0aGlzLl9leHBhbmRlZCk7dGhpcy5yZWRyYXcoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kaXN0cmlidXRpb24tZGFzaGJvYXJkL3RmLWRpc3RyaWJ1dGlvbi1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZCIscHJvcGVydGllczp7X3hUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZToic3RlcCJ9LF9zZWxlY3RlZFJ1bnM6QXJyYXksX3J1blRvVGFnOk9iamVjdCxfcnVuVG9UYWdJbmZvOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjpTdHJpbmcsX2NhdGVnb3JpZXNEb21SZWFkeTpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyLCBfY2F0ZWdvcmllc0RvbVJlYWR5KSJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBRby5SZXF1ZXN0TWFuYWdlcn19LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKT0+e3RoaXMuX3JlbG9hZERpc3RyaWJ1dGlvbnMoKX0pfSxfZmV0Y2hUYWdzKCl7Y29uc3QgYT1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGlzdHJpYnV0aW9ucyIsCiIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGEpLnRoZW4oYz0+e2lmKCFfLmlzRXF1YWwoYyx0aGlzLl9ydW5Ub1RhZ0luZm8pKXt2YXIgZD1fLm1hcFZhbHVlcyhjLGc9Pk9iamVjdC5rZXlzKGcpKSxmPVFvLmdldFRhZ3MoZCk7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1mLmxlbmd0aCk7dGhpcy5zZXQoIl9ydW5Ub1RhZyIsZCk7dGhpcy5zZXQoIl9ydW5Ub1RhZ0luZm8iLGMpO3RoaXMuYXN5bmMoKCk9Pnt0aGlzLnNldCgiX2NhdGVnb3JpZXNEb21SZWFkeSIsITApfSl9fSl9LF9yZWxvYWREaXN0cmlidXRpb25zKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWRpc3RyaWJ1dGlvbi1sb2FkZXIiKS5mb3JFYWNoKGE9PnthLnJlbG9hZCgpfSl9LF9zaG91bGRPcGVuKGEpe3JldHVybiAyPj1hfSxfbWFrZUNhdGVnb3JpZXMoYSxjLGQpe3JldHVybiBSby5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGEsYyxkKX0sX3RhZ01ldGFkYXRhKGEsCmMsZCl7cmV0dXJuIGFbY11bZF19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMvdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMuaHRtbC5qcwpQb2x5bWVyKHtpczoidnotaGlzdG9ncmFtLXRpbWVzZXJpZXMiLHByb3BlcnRpZXM6e21vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJvZmZzZXQifSx0aW1lUHJvcGVydHk6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGVwIn0sYmluczp7dHlwZTpTdHJpbmcsdmFsdWU6ImJpbnMifSx4Ont0eXBlOlN0cmluZyx2YWx1ZToieCJ9LGR4Ont0eXBlOlN0cmluZyx2YWx1ZToiZHgifSx5Ont0eXBlOlN0cmluZyx2YWx1ZToieSJ9LGNvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGQzLnNjYWxlT3JkaW5hbChkMy5zY2hlbWVDYXRlZ29yeTEwKX19LG1vZGVUcmFuc2l0aW9uRHVyYXRpb246e3R5cGU6TnVtYmVyLHZhbHVlOjUwMH0sX2F0dGFjaGVkOkJvb2xlYW4sX25hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9kYXRhOnt0eXBlOkFycmF5LHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6WyJyZWRyYXcodGltZVByb3BlcnR5LCBfYXR0YWNoZWQpIiwiX21vZGVSZWRyYXcobW9kZSkiXSwKcmVhZHk6ZnVuY3Rpb24oKXt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuc3ZnLCEwKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hdHRhY2hlZD0hMH0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hdHRhY2hlZD0hMX0sc2V0U2VyaWVzRGF0YTpmdW5jdGlvbihhLGMpe3RoaXMuX25hbWU9YTt0aGlzLl9kYXRhPWM7dGhpcy5yZWRyYXcoKX0scmVkcmF3OmZ1bmN0aW9uKCl7dGhpcy5fZHJhdygwKX0sX21vZGVSZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl9kcmF3KHRoaXMubW9kZVRyYW5zaXRpb25EdXJhdGlvbil9LF9kcmF3OmZ1bmN0aW9uKGEpe2lmKHRoaXMuX2F0dGFjaGVkJiZ0aGlzLl9kYXRhKXtpZih2b2lkIDA9PT1hKXRocm93IEVycm9yKCJ2ei1oaXN0b2dyYW0tdGltZXNlcmllcyBfZHJhdyBuZWVkcyBkdXJhdGlvbiIpO2lmKDA+PXRoaXMuX2RhdGEubGVuZ3RoKXRocm93IEVycm9yKCJOb3QgZW5vdWdoIHN0ZXBzIGluIHRoZSBkYXRhIik7aWYoIXRoaXMuX2RhdGFbMF0uaGFzT3duUHJvcGVydHkodGhpcy5iaW5zKSl0aHJvdyBFcnJvcigiTm8gYmlucyBwcm9wZXJ0eSBvZiAnIisKdGhpcy5iaW5zKyInIGluIGRhdGEiKTtpZigwPj10aGlzLl9kYXRhWzBdW3RoaXMuYmluc10ubGVuZ3RoKXRocm93IEVycm9yKCJNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGJpbiBpbiBiaW5zIGluIGRhdGEiKTtpZighdGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdWzBdLmhhc093blByb3BlcnR5KHRoaXMueCkpdGhyb3cgRXJyb3IoIk5vIHggcHJvcGVydHkgJyIrdGhpcy54KyInIG9uIGJpbnMgZGF0YSIpO2lmKCF0aGlzLl9kYXRhWzBdW3RoaXMuYmluc11bMF0uaGFzT3duUHJvcGVydHkodGhpcy5keCkpdGhyb3cgRXJyb3IoIk5vIGR4IHByb3BlcnR5ICciK3RoaXMuZHgrIicgb24gYmlucyBkYXRhIik7aWYoIXRoaXMuX2RhdGFbMF1bdGhpcy5iaW5zXVswXS5oYXNPd25Qcm9wZXJ0eSh0aGlzLnkpKXRocm93IEVycm9yKCJObyB5IHByb3BlcnR5ICciK3RoaXMueSsiJyBvbiBiaW5zIGRhdGEiKTt2YXIgYz10aGlzLnRpbWVQcm9wZXJ0eSxkPXRoaXMueCxmPXRoaXMuYmlucyxnPXRoaXMuZHgsCmw9dGhpcy55LGs9dGhpcy5fZGF0YSxuPXRoaXMubW9kZSxwPWQzLmhjbCh0aGlzLmNvbG9yU2NhbGUodGhpcy5fbmFtZSkpLHE9ZDMuc2VsZWN0KHRoaXMuJC50b29sdGlwKSxyPWZ1bmN0aW9uKHphKXtyZXR1cm4gemFbZF19LHQ9ZnVuY3Rpb24oemEpe3JldHVybiB6YVtsXX0sdj1mdW5jdGlvbih6YSl7cmV0dXJuIHphW2RdK3phW2ddfSx5PWZ1bmN0aW9uKHphKXtyZXR1cm4gemFbY119OyJyZWxhdGl2ZSI9PT1jJiYoeT1mdW5jdGlvbih6YSl7cmV0dXJuIHphLndhbGxfdGltZS1rWzBdLndhbGxfdGltZX0pO3ZhciB6PXRoaXMuJC5zdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkseD16LndpZHRoLEM9ei5oZWlnaHQsRj01O2lmKCJvZmZzZXQiPT09bil7dmFyIEQ9Qy8yLjU7Rj1EKzV9ZWxzZSBEPUMtRi0yMDt2YXIgQj14LTI0LTYwLEk9Qy1GLTIwO2QzLm1pbihrLHIpO2QzLm1heChrLHYpO3ZhciBPPWQzLmZvcm1hdCgiLjNuIik7ej1kMy5mb3JtYXQoIi4wZiIpOyJ3YWxsX3RpbWUiPT09CmM/ej1kMy50aW1lRm9ybWF0KCIlbS8lZCAlWCIpOiJyZWxhdGl2ZSI9PT1jJiYoej1mdW5jdGlvbih6YSl7cmV0dXJuIGQzLmZvcm1hdCgiLjFyIikoemEvMzZFNSkrImgifSk7dmFyIFA9ay5tYXAoZnVuY3Rpb24oemEpe3JldHVybltkMy5taW4oemFbZl0sciksZDMubWF4KHphW2ZdLHYpXX0pLEg9ay5tYXAoZnVuY3Rpb24oemEpe3JldHVybiBkMy5leHRlbnQoemFbZl0sdCl9KSxLPWQzLmV4dGVudChrLHkpLE09KCJ3YWxsX3RpbWUiPT09Yz9kMy5zY2FsZVRpbWUoKTpkMy5zY2FsZUxpbmVhcigpKS5kb21haW4oSykucmFuZ2UoWzAsIm9mZnNldCI9PT1uP0k6MF0pLEw9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzAsZDMubWF4KGssZnVuY3Rpb24oemEsVWEpe3JldHVybiBIW1VhXVsxXX0pXSkucmFuZ2UoW0QsMF0pLFI9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oTC5kb21haW4oKSkucmFuZ2UoWzUwMCwwXSksVT1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbZDMubWluKGssZnVuY3Rpb24oemEsClVhKXtyZXR1cm4gUFtVYV1bMF19KSxkMy5tYXgoayxmdW5jdGlvbih6YSxVYSl7cmV0dXJuIFBbVWFdWzFdfSldKS5uaWNlKCkucmFuZ2UoWzAsQl0pLFk9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oVS5kb21haW4oKSkucmFuZ2UoWzAsNTAwXSksYmE9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oZDMuZXh0ZW50KGsseSkpLnJhbmdlKFtwLmRhcmtlcigpLHAuYnJpZ2h0ZXIoKV0pLmludGVycG9sYXRlKGQzLmludGVycG9sYXRlSGNsKTtwPWQzLmF4aXNCb3R0b20oVSkudGlja3MoKTt2YXIgbWE9ZDMuYXhpc1JpZ2h0KE0pLnRpY2tzKCkudGlja0Zvcm1hdCh6KSxhYT1kMy5heGlzUmlnaHQoTCkudGlja3MoKS50aWNrU2l6ZShCKzUpLnRpY2tGb3JtYXQoTyksY2E9ZnVuY3Rpb24oemEpe3JldHVybiB6YVtkXSt6YVtnXS8yfSxmYT1kMy5saW5lKCkueChmdW5jdGlvbih6YSl7cmV0dXJuIFkoY2EoemEpKX0pLnkoZnVuY3Rpb24oemEpe3JldHVybiBSKHphW2xdKX0pLGRhPWZ1bmN0aW9uKHphKXtyZXR1cm4iTSIrClkoY2EoemFbMF0pKSsiLCIrUigwKSsiTCIrZmEoemEpLnNsaWNlKDEpKyJMIitZKGNhKHphW3phLmxlbmd0aC0xXSkpKyIsIitSKDApfSxsYT10aGlzLiQuc3ZnO3o9ZDMuc2VsZWN0KGxhKTthPXoudHJhbnNpdGlvbigpLmR1cmF0aW9uKGEpO3o9ei5zZWxlY3QoImciKS5jbGFzc2VkKCJzbWFsbCIsZnVuY3Rpb24oKXtyZXR1cm4gMDxCJiYxNTA+PUJ9KS5jbGFzc2VkKCJtZWRpdW0iLGZ1bmN0aW9uKCl7cmV0dXJuIDE1MDxCJiYzMDA+PUJ9KS5jbGFzc2VkKCJsYXJnZSIsZnVuY3Rpb24oKXtyZXR1cm4gMzAwPEJ9KTthPWEuc2VsZWN0KCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDI0LCIrRisiKSIpO3ZhciBaPWQzLmJpc2VjdG9yKHYpLmxlZnQ7Sz16LnNlbGVjdCgiLnN0YWdlIikub24oIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt4YS5zdHlsZSgib3BhY2l0eSIsMSk7eWEuc3R5bGUoIm9wYWNpdHkiLDEpO0JhLnN0eWxlKCJvcGFjaXR5IiwxKTtHYS5zdHlsZSgib3BhY2l0eSIsCjEpO3Euc3R5bGUoIm9wYWNpdHkiLDEpfSkub24oIm1vdXNlb3V0IixmdW5jdGlvbigpe3hhLnN0eWxlKCJvcGFjaXR5IiwwKTt5YS5zdHlsZSgib3BhY2l0eSIsMCk7QmEuc3R5bGUoIm9wYWNpdHkiLDApO0dhLnN0eWxlKCJvcGFjaXR5IiwwKTt4YS5jbGFzc2VkKCJob3Zlci1jbG9zZXN0IiwhMSk7RmEuY2xhc3NlZCgib3V0bGluZS1ob3ZlciIsITEpO3Euc3R5bGUoIm9wYWNpdHkiLDApfSkub24oIm1vdXNlbW92ZSIsZnVuY3Rpb24oKXtmdW5jdGlvbiB6YShHYil7cmV0dXJuIE1hdGgubWluKEdiW2ZdLmxlbmd0aC0xLFooR2JbZl0sWmEpKX12YXIgVWE9ZDMubW91c2UodGhpcyksWmE9VS5pbnZlcnQoVWFbMF0pO00uaW52ZXJ0KFVhWzFdKTt2YXIgemIsSWI9SW5maW5pdHksdWI7eGEuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihHYil7dmFyIFJiPXphKEdiKTt1Yj1HYjt2YXIgRWM9VShHYltmXVtSYl1bZF0rR2JbZl1bUmJdW2ddLzIpO1JiPUwoR2JbZl1bUmJdW2xdKTt2YXIgeGM9CiJvZmZzZXQiPT09bj9NKHkoR2IpKS0oRC1SYik6UmI7eGM9TWF0aC5hYnMoVWFbMV0teGMpO3hjPEliJiYoSWI9eGMsemI9R2IpO3JldHVybiJ0cmFuc2xhdGUoIitFYysiLCIrUmIrIikifSk7eGEuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbihHYil7dmFyIFJiPXphKEdiKTtyZXR1cm4gR2JbZl1bUmJdW2xdfSk7eGEuY2xhc3NlZCgiaG92ZXItY2xvc2VzdCIsZnVuY3Rpb24oR2Ipe3JldHVybiBHYj09PXpifSk7RmEuY2xhc3NlZCgib3V0bGluZS1ob3ZlciIsZnVuY3Rpb24oR2Ipe3JldHVybiBHYj09PXpifSk7dmFyIEZiPXphKHViKTt5YS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK1UodWJbZl1bRmJdW2RdK3ViW2ZdW0ZiXVtnXS8yKSsiLCAiK0krIikifSkuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbigpe3JldHVybiBPKHViW2ZdW0ZiXVtkXSt1YltmXVtGYl1bZ10vMil9KTt2YXIgQWI9bWEudGlja0Zvcm1hdCgpO0JhLmF0dHIoInRyYW5zZm9ybSIsCmZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK0IrIiwgIisoIm9mZnNldCI9PT1uP00oeSh6YikpOjApKyIpIn0pLnN0eWxlKCJkaXNwbGF5Iiwib2Zmc2V0Ij09PW4/IiI6Im5vbmUiKS5zZWxlY3QoInRleHQiKS50ZXh0KGZ1bmN0aW9uKCl7cmV0dXJuIEFiKHkoemIpKX0pO3ZhciBQYj1hYS50aWNrRm9ybWF0KCk7R2EuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbigpe3JldHVybiJ0cmFuc2xhdGUoIitCKyIsICIrKCJvZmZzZXQiPT09bj8wOkwoemJbZl1bRmJdW2xdKSkrIikifSkuc3R5bGUoImRpc3BsYXkiLCJvZmZzZXQiPT09bj8ibm9uZSI6IiIpLnNlbGVjdCgidGV4dCIpLnRleHQoZnVuY3Rpb24oKXtyZXR1cm4gUGIoemJbZl1bRmJdW2xdKX0pO3ZhciBiYz1kMy5tb3VzZShsYSk7cS5zdHlsZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrKGJjWzBdKzE1KSsicHgsIisoYmNbMV0tMTUpKyJweCkiKS5zZWxlY3QoInNwYW4iKS50ZXh0KCJvZmZzZXQiPT09bj9QYih6YltmXVtGYl1bbF0pOgooInN0ZXAiPT09Yz8ic3RlcCAiOiIiKStBYih5KHpiKSkpfSk7Sy5zZWxlY3QoIi5iYWNrZ3JvdW5kIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKC0yNCwiKy1GKyIpIikuYXR0cigid2lkdGgiLHgpLmF0dHIoImhlaWdodCIsQyk7Qz1LLnNlbGVjdEFsbCgiLmhpc3RvZ3JhbSIpLmRhdGEoayk7Qy5leGl0KCkucmVtb3ZlKCk7eD1DLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJoaXN0b2dyYW0iKTtDPXgubWVyZ2UoQykuc29ydChmdW5jdGlvbih6YSxVYSl7cmV0dXJuIHkoemEpLXkoVWEpfSk7Rj1hLnNlbGVjdEFsbCgiLmhpc3RvZ3JhbSIpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oemEpe3JldHVybiJ0cmFuc2xhdGUoMCwgIisoIm9mZnNldCI9PT1uP00oeSh6YSkpLUQ6MCkrIikifSk7eC5hcHBlbmQoImxpbmUiKS5hdHRyKCJjbGFzcyIsImJhc2VsaW5lIik7Ri5zZWxlY3QoIi5iYXNlbGluZSIpLnN0eWxlKCJzdHJva2Utb3BhY2l0eSIsZnVuY3Rpb24oKXtyZXR1cm4ib2Zmc2V0Ij09PQpuPy4xOjB9KS5hdHRyKCJ5MSIsRCkuYXR0cigieTIiLEQpLmF0dHIoIngyIixCKTt4LmFwcGVuZCgicGF0aCIpLmF0dHIoImNsYXNzIiwib3V0bGluZSIpO3ZhciBGYT1DLnNlbGVjdCgiLm91dGxpbmUiKS5hdHRyKCJ2ZWN0b3ItZWZmZWN0Iiwibm9uLXNjYWxpbmctc3Ryb2tlIikuYXR0cigiZCIsZnVuY3Rpb24oemEpe3JldHVybiBkYSh6YVtmXSl9KS5zdHlsZSgic3Ryb2tlLXdpZHRoIiwxKTtGLnNlbGVjdCgiLm91dGxpbmUiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJzY2FsZSgiK0IvNTAwKyIsICIrRC81MDArIikiKS5zdHlsZSgic3Ryb2tlIixmdW5jdGlvbih6YSl7cmV0dXJuIm9mZnNldCI9PT1uPyJ3aGl0ZSI6YmEoeSh6YSkpfSkuc3R5bGUoImZpbGwtb3BhY2l0eSIsZnVuY3Rpb24oKXtyZXR1cm4ib2Zmc2V0Ij09PW4/MTowfSkuc3R5bGUoImZpbGwiLGZ1bmN0aW9uKHphKXtyZXR1cm4gYmEoeSh6YSkpfSk7eD14LmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwiaG92ZXIiKS5zdHlsZSgiZmlsbCIsCmZ1bmN0aW9uKHphKXtyZXR1cm4gYmEoeSh6YSkpfSk7dmFyIHhhPUMuc2VsZWN0KCIuaG92ZXIiKTt4LmFwcGVuZCgiY2lyY2xlIikuYXR0cigiciIsMik7eC5hcHBlbmQoInRleHQiKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKS5hdHRyKCJkeCIsNCk7eD16LnNlbGVjdCgiLngtYXhpcy1ob3ZlciIpLnNlbGVjdEFsbCgiLmxhYmVsIikuZGF0YShbIngiXSk7Qz14LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsYWJlbCIpO3ZhciB5YT14Lm1lcmdlKEMpO0MuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLTIwKS5hdHRyKCJ5Iiw2KS5hdHRyKCJ3aWR0aCIsNDApLmF0dHIoImhlaWdodCIsMTQpO0MuYXBwZW5kKCJsaW5lIikuYXR0cigieDEiLDApLmF0dHIoIngyIiwwKS5hdHRyKCJ5MSIsMCkuYXR0cigieTIiLDYpO0MuYXBwZW5kKCJ0ZXh0IikuYXR0cigiZHkiLDE4KTt4PXouc2VsZWN0KCIueS1heGlzLWhvdmVyIikuc2VsZWN0QWxsKCIubGFiZWwiKS5kYXRhKFsieSJdKTsKQz14LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsYWJlbCIpO3ZhciBCYT14Lm1lcmdlKEMpO0MuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsOCkuYXR0cigieSIsLTYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCk7Qy5hcHBlbmQoImxpbmUiKS5hdHRyKCJ4MSIsMCkuYXR0cigieDIiLDYpLmF0dHIoInkxIiwwKS5hdHRyKCJ5MiIsMCk7Qy5hcHBlbmQoInRleHQiKS5hdHRyKCJkeCIsOCkuYXR0cigiZHkiLDQpO3o9ei5zZWxlY3QoIi55LXNsaWNlLWF4aXMtaG92ZXIiKS5zZWxlY3RBbGwoIi5sYWJlbCIpLmRhdGEoWyJ5Il0pO3g9ei5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwibGFiZWwiKTt2YXIgR2E9ei5tZXJnZSh4KTt4LmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLDgpLmF0dHIoInkiLC02KS5hdHRyKCJ3aWR0aCIsNDApLmF0dHIoImhlaWdodCIsMTQpO3guYXBwZW5kKCJsaW5lIikuYXR0cigieDEiLDApLmF0dHIoIngyIiw2KS5hdHRyKCJ5MSIsCjApLmF0dHIoInkyIiwwKTt4LmFwcGVuZCgidGV4dCIpLmF0dHIoImR4Iiw4KS5hdHRyKCJkeSIsNCk7YS5zZWxlY3QoIi55LmF4aXMuc2xpY2UiKS5zdHlsZSgib3BhY2l0eSIsIm9mZnNldCI9PT1uPzA6MSkuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDAsICIrKCJvZmZzZXQiPT09bj8tRDowKSsiKSIpLmNhbGwoYWEpO2Euc2VsZWN0KCIueC5heGlzIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDAsICIrSSsiKSIpLmNhbGwocCk7YS5zZWxlY3QoIi55LmF4aXMiKS5zdHlsZSgib3BhY2l0eSIsIm9mZnNldCI9PT1uPzE6MCkuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrQisiLCAiKygib2Zmc2V0Ij09PW4/MDpJKSsiKSIpLmNhbGwobWEpO2Euc2VsZWN0QWxsKCIudGljayB0ZXh0IikuYXR0cigiZmlsbCIsIiNhYWEiKTthLnNlbGVjdEFsbCgiLmF4aXMgcGF0aC5kb21haW4iKS5hdHRyKCJzdHJva2UiLCJub25lIil9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhpc3RvZ3JhbS1kYXNoYm9hcmQvaGlzdG9ncmFtQ29yZS5qcwp2YXIgb3A7CihmdW5jdGlvbihhKXtmdW5jdGlvbiBjKGYpe2NvbnN0IFtnLGwsa109ZjtyZXR1cm57d2FsbF90aW1lOmcsc3RlcDpsLG1pbjpkMy5taW4oay5tYXAoKFtuXSk9Pm4pKSxtYXg6ZDMubWF4KGsubWFwKChbLG5dKT0+bikpLGJ1Y2tldHM6ay5tYXAoKFtuLHAscV0pPT4oe2xlZnQ6bixyaWdodDpwLGNvdW50OnF9KSl9fWZ1bmN0aW9uIGQoZixnLGwsaz0zMCl7bD09PWcmJihsPTEuMSpnKzEsZz1nLzEuMS0xKTtjb25zdCBuPShsLWcpL2s7bGV0IHA9MDtyZXR1cm4gZDMucmFuZ2UoZyxsLG4pLm1hcChxPT57Y29uc3Qgcj1xK247bGV0IHQ9MDtmb3IoO3A8Zi5idWNrZXRzLmxlbmd0aDspe2NvbnN0IHk9TWF0aC5taW4obCxmLmJ1Y2tldHNbcF0ucmlnaHQpO3ZhciB2PU1hdGgubWF4KGcsZi5idWNrZXRzW3BdLmxlZnQpO2NvbnN0IHo9TWF0aC5taW4oeSxyKS1NYXRoLm1heCh2LHEpO3Y9ei8oeS12KSpmLmJ1Y2tldHNbcF0uY291bnQ7dCs9MDx6P3Y6MDtpZih5PnIpYnJlYWs7cCsrfXJldHVybnt4OnEsCmR4Om4seTp0fX0pfWEuYmFja2VuZFRvSW50ZXJtZWRpYXRlPWM7YS5pbnRlcm1lZGlhdGVUb0QzPWQ7YS5iYWNrZW5kVG9Wej1mdW5jdGlvbihmKXtmPWYubWFwKGMpO2NvbnN0IGc9ZDMubWluKGYsaz0+ay5taW4pLGw9ZDMubWF4KGYsaz0+ay5tYXgpO3JldHVybiBmLm1hcChrPT4oe3dhbGxfdGltZTprLndhbGxfdGltZSxzdGVwOmsuc3RlcCxiaW5zOmQoayxnLGwpfSkpfX0pKG9wfHwob3A9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1oaXN0b2dyYW0tZGFzaGJvYXJkL3RmLWhpc3RvZ3JhbS1sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaGlzdG9ncmFtLWxvYWRlciIscHJvcGVydGllczp7cnVuOlN0cmluZyx0YWc6U3RyaW5nLGRhdGFUb0xvYWQ6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlRGF0YVRvTG9hZChydW4sIHRhZykifSxnZXREYXRhTG9hZE5hbWU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pih7cnVuOmF9KT0+YX0sZ2V0RGF0YUxvYWRVcmw6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pih7dGFnOmEscnVuOmN9KT0+UW8uYWRkUGFyYW1zKFFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJoaXN0b2dyYW1zIiwiL2hpc3RvZ3JhbXMiKSx7dGFnOmEscnVuOmN9KX0sbG9hZERhdGFDYWxsYmFjazp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybihhLGMsZCk9PnthPW9wLmJhY2tlbmRUb1Z6KGQpO2M9dGhpcy5nZXREYXRhTG9hZE5hbWUoYyk7dGhpcy4kLmNoYXJ0LnNldFNlcmllc0RhdGEoYyxhKX19fSx0YWdNZXRhZGF0YTpPYmplY3QsdGltZVByb3BlcnR5OlN0cmluZywKaGlzdG9ncmFtTW9kZTpTdHJpbmcsX2NvbG9yU2NhbGVGdW5jdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9PlhvLnJ1bnNDb2xvclNjYWxlfSxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVuLCB0YWcsIHJlcXVlc3RNYW5hZ2VyKSJdLGJlaGF2aW9yczpbVW8uRGF0YUxvYWRlckJlaGF2aW9yXSxfY29tcHV0ZURhdGFUb0xvYWQoYSxjKXtyZXR1cm5be3J1bjphLHRhZzpjfV19LF9jb21wdXRlUnVuQ29sb3IoYSl7cmV0dXJuIHRoaXMuX2NvbG9yU2NhbGVGdW5jdGlvbihhKX0scmVkcmF3KCl7dGhpcy4kLmNoYXJ0LnJlZHJhdygpfSxfdG9nZ2xlRXhwYW5kZWQoKXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaGlzdG9ncmFtLWRhc2hib2FyZC90Zi1oaXN0b2dyYW0tZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhpc3RvZ3JhbS1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19oaXN0b2dyYW1Nb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToib2Zmc2V0In0sX3RpbWVQcm9wZXJ0eTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0ZXAifSxfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZzpPYmplY3QsX3J1blRvVGFnSW5mbzpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6U3RyaW5nLF9yZXN0YW1wOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlciwgX2NhdGVnb3JpZXNEb21SZWFkeSkifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUW8uUmVxdWVzdE1hbmFnZXJ9fSxsaXN0ZW5lcnM6eyJjb250ZW50LXZpc2liaWxpdHktY2hhbmdlZCI6Il9yZWRyYXdDYXRlZ29yeVBhbmUifSwKX3JlZHJhd0NhdGVnb3J5UGFuZShhLGMpe2MmJmEudGFyZ2V0LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWhpc3RvZ3JhbS1sb2FkZXIiKS5mb3JFYWNoKGQ9PmQucmVkcmF3KCkpfSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRIaXN0b2dyYW1zKCl9KX0sX2ZldGNoVGFncygpe2NvbnN0IGE9UW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImhpc3RvZ3JhbXMiLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGEpLnRoZW4oYz0+e2lmKCFfLmlzRXF1YWwoYyx0aGlzLl9ydW5Ub1RhZ0luZm8pKXt2YXIgZD1fLm1hcFZhbHVlcyhjLGc9Pk9iamVjdC5rZXlzKGcpKSxmPVFvLmdldFRhZ3MoZCk7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1mLmxlbmd0aCk7dGhpcy5zZXQoIl9ydW5Ub1RhZyIsZCk7dGhpcy5zZXQoIl9ydW5Ub1RhZ0luZm8iLGMpO3RoaXMuYXN5bmMoKCk9Pgp7dGhpcy5zZXQoIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCEwKX0pfX0pfSxfcmVsb2FkSGlzdG9ncmFtcygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1oaXN0b2dyYW0tbG9hZGVyIikuZm9yRWFjaChhPT57YS5yZWxvYWQoKX0pfSxfc2hvdWxkT3BlbihhKXtyZXR1cm4gMj49YX0sX21ha2VDYXRlZ29yaWVzKGEsYyxkKXtyZXR1cm4gUm8uY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhhLGMsZCl9LF90YWdNZXRhZGF0YShhLGMsZCl7cmV0dXJuIGFbY11bZF19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtdGV4dC1kYXNoYm9hcmQvdGYtdGV4dC1sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtdGV4dC1sb2FkZXIiLHByb3BlcnRpZXM6e3J1bjpTdHJpbmcsdGFnOlN0cmluZyxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxfdGV4dHM6e3R5cGU6QXJyYXksdmFsdWU6W119LHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFFvLkNhbmNlbGxlcn19LF9jb21wdXRlUnVuQ29sb3IoYSl7cmV0dXJuIFhvLnJ1bnNDb2xvclNjYWxlKGEpfSxhdHRhY2hlZCgpe3RoaXMuX2F0dGFjaGVkPSEwO3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe2lmKHRoaXMuX2F0dGFjaGVkKXt0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7dmFyIGE9UW8uYWRkUGFyYW1zKFFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJ0ZXh0IiwiL3RleHQiKSx7dGFnOnRoaXMudGFnLHJ1bjp0aGlzLnJ1bn0pLGM9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKGQ9PntkLmNhbmNlbGxlZHx8CihkPWQudmFsdWUubWFwKGY9Pih7d2FsbF90aW1lOm5ldyBEYXRlKDFFMypmLndhbGxfdGltZSksc3RlcDpmLnN0ZXAsdGV4dDpmLnRleHR9KSksdGhpcy5zZXQoIl90ZXh0cyIsZC5zbGljZSgpLnJldmVyc2UoKSkpfSk7dGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGEpLnRoZW4oYyl9fSxfZm9ybWF0U3RlcChhKXtyZXR1cm4gZDMuZm9ybWF0KCIsIikoYSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtdGV4dC1kYXNoYm9hcmQvdGYtdGV4dC1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtdGV4dC1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19zZWxlY3RlZFJ1bnM6QXJyYXksX3J1blRvVGFnOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjpTdHJpbmcsX2NhdGVnb3JpZXNEb21SZWFkeTpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyLCBfY2F0ZWdvcmllc0RvbVJlYWR5KSJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBRby5SZXF1ZXN0TWFuYWdlcn19LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKT0+e3RoaXMuX3JlbG9hZFRleHRzKCl9KX0sX3Nob3VsZE9wZW4oYSl7cmV0dXJuIDI+PWF9LF9mZXRjaFRhZ3MoKXtjb25zdCBhPVFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJ0ZXh0IiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChhKS50aGVuKGM9Pgp7aWYoIV8uaXNFcXVhbChjLHRoaXMuX3J1blRvVGFnKSl7dmFyIGQ9UW8uZ2V0VGFncyhjKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWQubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnIixjKTt0aGlzLmFzeW5jKCgpPT57dGhpcy5zZXQoIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCEwKX0pfX0pfSxfcmVsb2FkVGV4dHMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtdGV4dC1sb2FkZXIiKS5mb3JFYWNoKGE9PnthLnJlbG9hZCgpfSl9LF9tYWtlQ2F0ZWdvcmllcyhhLGMsZCl7cmV0dXJuIFJvLmNhdGVnb3JpemVSdW5UYWdDb21iaW5hdGlvbnMoYSxjLGQpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXByLWN1cnZlLWRhc2hib2FyZC90Zi1wci1jdXJ2ZS1jYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXByLWN1cnZlLWNhcmQiLHByb3BlcnRpZXM6e3J1bnM6QXJyYXksdGFnOlN0cmluZyx0YWdNZXRhZGF0YTpPYmplY3QscnVuVG9TdGVwQ2FwOk9iamVjdCxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsYWN0aXZlOkJvb2xlYW4sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfcnVuVG9QckN1cnZlRW50cnk6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfcHJldmlvdXNSdW5Ub1ByQ3VydmVFbnRyeTp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9ydW5zV2l0aFN0ZXBBdmFpbGFibGU6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlUnVuc1dpdGhTdGVwQXZhaWxhYmxlKHJ1bnMsIF9ydW5Ub1ByQ3VydmVFbnRyeSkifSxfc2V0T2ZSZWxldmFudFJ1bnM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZVNldE9mUmVsZXZhbnRSdW5zKF9ydW5zV2l0aFN0ZXBBdmFpbGFibGUpIn0sX3J1blRvRGF0YU92ZXJUaW1lOk9iamVjdCwKX2NvbG9yU2NhbGVGdW5jdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7c2NhbGU6WG8ucnVuc0NvbG9yU2NhbGV9KX0sX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBRby5DYW5jZWxsZXJ9LF9hdHRhY2hlZDpCb29sZWFuLF94Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCx2YWx1ZTooKT0+KCk9Pntjb25zdCBhPW5ldyBQbG90dGFibGUuU2NhbGVzLkxpbmVhcjtyZXR1cm57c2NhbGU6YSxheGlzOm5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKGEsImJvdHRvbSIpLGFjY2Vzc29yOmM9PmMucmVjYWxsfX19LF95VmFsdWVBY2Nlc3Nvcjp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsdmFsdWU6KCk9PmE9PmEucHJlY2lzaW9ufSxfdG9vbHRpcENvbHVtbnM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsdmFsdWU6KCk9Pntjb25zdCBhPSRvLm11bHRpc2NhbGVGb3JtYXR0ZXIoJG8uWV9UT09MVElQX0ZPUk1BVFRFUl9QUkVDSVNJT04pLApjPWQ9PmlzTmFOKGQpPyJOYU4iOmEoZCk7cmV0dXJuW3t0aXRsZToiUnVuIixldmFsdWF0ZTpkPT5kLmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfSx7dGl0bGU6IlRocmVzaG9sZCIsZXZhbHVhdGU6ZD0+YyhkLmRhdHVtLnRocmVzaG9sZHMpfSx7dGl0bGU6IlByZWNpc2lvbiIsZXZhbHVhdGU6ZD0+YyhkLmRhdHVtLnByZWNpc2lvbil9LHt0aXRsZToiUmVjYWxsIixldmFsdWF0ZTpkPT5jKGQuZGF0dW0ucmVjYWxsKX0se3RpdGxlOiJUUCIsZXZhbHVhdGU6ZD0+ZC5kYXR1bS50cnVlX3Bvc2l0aXZlc30se3RpdGxlOiJGUCIsZXZhbHVhdGU6ZD0+ZC5kYXR1bS5mYWxzZV9wb3NpdGl2ZXN9LHt0aXRsZToiVE4iLGV2YWx1YXRlOmQ9PmQuZGF0dW0udHJ1ZV9uZWdhdGl2ZXN9LHt0aXRsZToiRk4iLGV2YWx1YXRlOmQ9PmQuZGF0dW0uZmFsc2VfbmVnYXRpdmVzfV19fSxfc2VyaWVzRGF0YUZpZWxkczp7dHlwZTpBcnJheSx2YWx1ZToidGhyZXNob2xkcyBwcmVjaXNpb24gcmVjYWxsIHRydWVfcG9zaXRpdmVzIGZhbHNlX3Bvc2l0aXZlcyB0cnVlX25lZ2F0aXZlcyBmYWxzZV9uZWdhdGl2ZXMiLnNwbGl0KCIgIiksCnJlYWRPbmx5OiEwfSxfZGVmYXVsdFhSYW5nZTp7dHlwZTpBcnJheSx2YWx1ZTpbLS4wNSwxLjA1XSxyZWFkT25seTohMH0sX2RlZmF1bHRZUmFuZ2U6e3R5cGU6QXJyYXksdmFsdWU6Wy0uMDUsMS4wNV0scmVhZE9ubHk6ITB9LF9kYXRhVXJsOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGE9Pntjb25zdCBjPXRoaXMudGFnO3JldHVybiBRby5hZGRQYXJhbXMoUW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInByX2N1cnZlcyIsIi9wcl9jdXJ2ZXMiKSx7dGFnOmMscnVuOmF9KX19fSxfc21vb3RoaW5nRW5hYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlYWRPbmx5OiEwfX0sb2JzZXJ2ZXJzOlsicmVsb2FkKHJ1bnMsIHRhZykiLCJfc2V0Q2hhcnREYXRhKF9ydW5Ub1ByQ3VydmVFbnRyeSwgX3ByZXZpb3VzUnVuVG9QckN1cnZlRW50cnksIF9zZXRPZlJlbGV2YW50UnVucykiLCJfdXBkYXRlUnVuVG9QckN1cnZlRW50cnkoX3J1blRvRGF0YU92ZXJUaW1lLCBydW5Ub1N0ZXBDYXApIl0sCl9jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKCl7cmV0dXJuKGEsYyxkKT0+e3RoaXMuc2V0KCJfcnVuVG9EYXRhT3ZlclRpbWUiLE9iamVjdC5hc3NpZ24oe30sdGhpcy5fcnVuVG9EYXRhT3ZlclRpbWUsZCkpfX0sX2NvbXB1dGVSdW5Db2xvcihhKXtyZXR1cm4gdGhpcy5fY29sb3JTY2FsZUZ1bmN0aW9uLnNjYWxlKGEpfSxhdHRhY2hlZCgpe3RoaXMuX2F0dGFjaGVkPSEwO3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2F0dGFjaGVkJiYoMD09PXRoaXMucnVucy5sZW5ndGg/dGhpcy5zZXQoIl9ydW5Ub0RhdGFPdmVyVGltZSIse30pOnRoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5yZWxvYWQoKSl9LF9zZXRDaGFydERhdGEoYSxjLGQpe18uZm9yT3duKGEsKGYsZyk9Pntjb25zdCBsPWNbZ107bCYmYVtnXS5zdGVwPT09bC5zdGVwfHwoZFtnXT90aGlzLl91cGRhdGVTZXJpZXNEYXRhRm9yUnVuKGcsZik6dGhpcy5fY2xlYXJTZXJpZXNEYXRhKGcpKX0pfSwKX3VwZGF0ZVNlcmllc0RhdGFGb3JSdW4oYSxjKXtjb25zdCBkPV8ucmVkdWNlKHRoaXMuX3Nlcmllc0RhdGFGaWVsZHMsKGcsbCk9PntnW2xdPWNbbF0uc2xpY2UoKS5yZXZlcnNlKCk7cmV0dXJuIGd9LHt9KSxmPUFycmF5KGRbdGhpcy5fc2VyaWVzRGF0YUZpZWxkc1swXV0ubGVuZ3RoKTtmb3IobGV0IGc9MDtnPGYubGVuZ3RoO2crKylmW2ddPV8ubWFwVmFsdWVzKGQsbD0+bFtnXSk7dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpLnNldFNlcmllc0RhdGEoYSxmKX0sX2NsZWFyU2VyaWVzRGF0YShhKXt0aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikuc2V0U2VyaWVzRGF0YShhLFtdKX0sX3VwZGF0ZVJ1blRvUHJDdXJ2ZUVudHJ5KGEsYyl7Y29uc3QgZD17fTtfLmZvck93bihhLChmLGcpPT57ZiYmZi5sZW5ndGgmJihkW2ddPXRoaXMuX2NvbXB1dGVFbnRyeUNsb3Nlc3RPckVxdWFsVG9TdGVwQ2FwKGNbZ10sZikpfSk7dGhpcy5zZXQoIl9wcmV2aW91c1J1blRvUHJDdXJ2ZUVudHJ5IiwKdGhpcy5fcnVuVG9QckN1cnZlRW50cnkpO3RoaXMuc2V0KCJfcnVuVG9QckN1cnZlRW50cnkiLGQpfSxfY29tcHV0ZUVudHJ5Q2xvc2VzdE9yRXF1YWxUb1N0ZXBDYXAoYSxjKXthPU1hdGgubWluKF8uc29ydGVkSW5kZXgoYy5tYXAoZD0+ZC5zdGVwKSxhKSxjLmxlbmd0aC0xKTtyZXR1cm4gY1thXX0sX2NvbXB1dGVSdW5zV2l0aFN0ZXBBdmFpbGFibGUoYSxjKXtyZXR1cm4gXy5maWx0ZXIoYSxkPT5jW2RdKS5zb3J0KCl9LF9jb21wdXRlU2V0T2ZSZWxldmFudFJ1bnMoYSl7Y29uc3QgYz17fTtfLmZvckVhY2goYSxkPT57Y1tkXT0hMH0pO3JldHVybiBjfSxfY29tcHV0ZUN1cnJlbnRTdGVwRm9yUnVuKGEsYyl7cmV0dXJuKGE9YVtjXSk/YS5zdGVwOm51bGx9LF9jb21wdXRlQ3VycmVudFdhbGxUaW1lRm9yUnVuKGEsYyl7cmV0dXJuKGE9YVtjXSk/KG5ldyBEYXRlKDFFMyphLndhbGxfdGltZSkpLnRvU3RyaW5nKCk6bnVsbH0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsCiF0aGlzLl9leHBhbmRlZCk7dGhpcy5yZWRyYXcoKX0sX3Jlc2V0RG9tYWluKCl7dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpLnJlc2V0RG9tYWluKCl9LHJlZHJhdygpe3RoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5yZWRyYXcoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wci1jdXJ2ZS1kYXNoYm9hcmQvdGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3IuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3IiLHByb3BlcnRpZXM6e3J1bnM6QXJyYXkscnVuVG9BdmFpbGFibGVUaW1lRW50cmllczpPYmplY3QscnVuVG9TdGVwOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsY29tcHV0ZWQ6Il9jb21wdXRlUnVuVG9TdGVwKHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMsIF9ydW5Ub1N0ZXBJbmRleCkifSx0aW1lRGlzcGxheVR5cGU6U3RyaW5nLF9ydW5Ub1N0ZXBJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9ydW5zV2l0aFNsaWRlcnM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlUnVuc1dpdGhTbGlkZXJzKHJ1bnMsIHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMpIn19LG9ic2VydmVyczpbIl91cGRhdGVTdGVwc0Zvck5ld1J1bnMocnVuVG9BdmFpbGFibGVUaW1lRW50cmllcykiXSxfY29tcHV0ZUNvbG9yRm9yUnVuKGEpe3JldHVybiBYby5ydW5zQ29sb3JTY2FsZShhKX0sX2NvbXB1dGVUaW1lVGV4dEZvclJ1bihhLApjLGQsZil7Yz1jW2RdO2lmKCFfLmlzTnVtYmVyKGMpKXJldHVybiIiO2E9YVtkXTtpZighYSlyZXR1cm4iIjthPWFbY11bZl07aWYoInN0ZXAiPT09ZilyZXR1cm5gc3RlcCAke2F9YDtpZigicmVsYXRpdmUiPT09ZilyZXR1cm4gMT5hP2AkeygxRTMqYSkudG9GaXhlZCgyKX0gbXNgOmAke2EudG9GaXhlZCgyKX0gc2A7aWYoIndhbGxfdGltZSI9PT1mKXJldHVybihuZXcgRGF0ZSgxRTMqYSkpLnRvU3RyaW5nKCk7dGhyb3cgRXJyb3IoYFRoZSBkaXNwbGF5IHR5cGUgb2YgJHtmfSBpcyBub3QgcmVjb2duaXplZC5gKTt9LF9zbGlkZXJWYWx1ZUNoYW5nZWQoYSl7Y29uc3QgYz1hLnRhcmdldC5kYXRhc2V0LnJ1bixkPWEudGFyZ2V0LmltbWVkaWF0ZVZhbHVlLGY9T2JqZWN0LmFzc2lnbih7fSx0aGlzLl9ydW5Ub1N0ZXBJbmRleCk7aXNOYU4oZCk/ZGVsZXRlIGZbY106ZltjXT1hLnRhcmdldC5pbW1lZGlhdGVWYWx1ZTt0aGlzLl9ydW5Ub1N0ZXBJbmRleD1mfSxfY29tcHV0ZU1heFN0ZXBJbmRleEZvclJ1bihhLApjKXtyZXR1cm4oYT1hW2NdKSYmYS5sZW5ndGg/YS5sZW5ndGgtMTowfSxfdXBkYXRlU3RlcHNGb3JOZXdSdW5zKGEpe2NvbnN0IGM9T2JqZWN0LmFzc2lnbih7fSx0aGlzLl9ydW5Ub1N0ZXBJbmRleCk7Xy5mb3JPd24oYSwoZCxmKT0+e18uaXNOdW1iZXIoY1tmXSl8fChjW2ZdPWQubGVuZ3RoLTEpfSk7dGhpcy5fcnVuVG9TdGVwSW5kZXg9Y30sX2dldFN0ZXAoYSxjKXtyZXR1cm4gdGhpcy5fcnVuVG9TdGVwSW5kZXg/dGhpcy5fcnVuVG9TdGVwSW5kZXhbY106MH0sX2NvbXB1dGVSdW5Ub1N0ZXAoYSxjKXtjb25zdCBkPXt9O18uZm9yT3duKGMsKGYsZyk9Pntjb25zdCBsPWFbZ107bCYmKGRbZ109bFtmXS5zdGVwKX0pO3JldHVybiBkfSxfY29tcHV0ZVJ1bnNXaXRoU2xpZGVycyhhLGMpe3JldHVybiBhLmZpbHRlcihkPT5jW2RdKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wci1jdXJ2ZS1kYXNoYm9hcmQvdGYtcHItY3VydmUtZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXByLWN1cnZlLWRhc2hib2FyZCIscHJvcGVydGllczp7X3RpbWVEaXNwbGF5VHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0ZXAifSxfc2VsZWN0ZWRSdW5zOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX3J1blRvVGFnSW5mbzp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9ydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX3JlbGV2YW50U2VsZWN0ZWRSdW5zOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZVJlbGV2YW50U2VsZWN0ZWRSdW5zKF9zZWxlY3RlZFJ1bnMsIF9ydW5Ub1RhZ0luZm8pIn0sX3J1bnNXaXRoUHJDdXJ2ZURhdGE6QXJyYXksX3J1blRvU3RlcDp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjpTdHJpbmcsX2NhdGVnb3JpZXNEb21SZWFkeTpCb29sZWFuLF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnSW5mbywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlciwgX2NhdGVnb3JpZXNEb21SZWFkeSkifSwKX2dldENhdGVnb3J5SXRlbUtleTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+YT0+YS50YWd9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBRby5SZXF1ZXN0TWFuYWdlcn0sX3N0ZXA6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfX0scmVhZHkoKXt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXtQcm9taXNlLmFsbChbdGhpcy5fZmV0Y2hUYWdzKCksdGhpcy5fZmV0Y2hUaW1lRW50cmllc1BlclJ1bigpXSkudGhlbigoKT0+e3RoaXMuX3JlbG9hZENhcmRzKCl9KX0sX3Nob3VsZE9wZW4oYSl7cmV0dXJuIDI+PWF9LF9mZXRjaFRhZ3MoKXtjb25zdCBhPVFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJwcl9jdXJ2ZXMiLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGEpLnRoZW4oYz0+e2lmKCFfLmlzRXF1YWwoYyx0aGlzLl9ydW5Ub1RhZ0luZm8pKXt2YXIgZD1fLm1hcFZhbHVlcyhjLGY9Pl8ua2V5cyhmKSk7CmQ9UW8uZ2V0VGFncyhkKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWQubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsYyk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX2ZldGNoVGltZUVudHJpZXNQZXJSdW4oKXtjb25zdCBhPVFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJwcl9jdXJ2ZXMiLCIvYXZhaWxhYmxlX3RpbWVfZW50cmllcyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGEpLnRoZW4oYz0+e18uZm9yT3duKGMsZD0+e18uZm9yRWFjaChkLGY9PntmLnJlbGF0aXZlPWYud2FsbF90aW1lLWRbMF0ud2FsbF90aW1lfSl9KTt0aGlzLnNldCgiX3J1blRvQXZhaWxhYmxlVGltZUVudHJpZXMiLGMpO2M9Xy5rZXlzKGMpLnNsaWNlKCkuc29ydCgpO18uaXNFcXVhbChjLHRoaXMuX3J1bnNXaXRoUHJDdXJ2ZURhdGEpfHx0aGlzLnNldCgiX3J1bnNXaXRoUHJDdXJ2ZURhdGEiLApjKX0pfSxfcmVsb2FkQ2FyZHMoKXtfLmZvckVhY2godGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLXByLWN1cnZlLWNhcmQiKSxhPT57YS5yZWxvYWQoKX0pfSxfbWFrZUNhdGVnb3JpZXMoYSxjLGQpe2E9Xy5tYXBWYWx1ZXMoYSxmPT5PYmplY3Qua2V5cyhmKSk7cmV0dXJuIFJvLmNhdGVnb3JpemVUYWdzKGEsYyxkKX0sX2NvbXB1dGVDb2xvckZvclJ1bihhKXtyZXR1cm4gWG8ucnVuc0NvbG9yU2NhbGUoYSl9LF9jb21wdXRlUmVsZXZhbnRTZWxlY3RlZFJ1bnMoYSxjKXtyZXR1cm4gYS5maWx0ZXIoZD0+Y1tkXSl9LF90YWdNZXRhZGF0YShhLGMsZCl7Y29uc3QgZj17fTtjLmZvckVhY2goZz0+e2ZbZ109YVtnXVtkXX0pO2M9ZC5yZXBsYWNlKC9cL3ByX2N1cnZlcyQvLCIiKTtyZXR1cm4gWm8uYWdncmVnYXRlVGFnSW5mbyhmLGMpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXNwaW5uZXIvcGFwZXItc3Bpbm5lci5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1zcGlubmVyIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJTcGlubmVyQmVoYXZpb3JdfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW5wdXQtcGlwZWxpbmUvaW5wdXQtcGlwZWxpbmUtYW5hbHl6ZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoiaW5wdXQtcGlwZWxpbmUtYW5hbHl6ZXIiLHByb3BlcnRpZXM6e19kYXRhOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3VwZGF0ZVZpZXcifSxfc2hvd19kZXZpY2Vfc2lkZV9hbmFseXNpczp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLG5vdGlmeTohMH0sX3Nob3dfaG9zdF9zaWRlX2NoYXJ0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITAsbm90aWZ5OiEwfSxfc2hvd19ob3N0X3NpZGVfdGFibGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LF90b2dnbGVfYnV0dG9uX3RleHQ6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0VG9nZ2xlQnV0dG9uVGV4dChfc2hvd19ob3N0X3NpZGVfdGFibGUpIn0sX2RldmljZUpzb246e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2hvc3RKc29uOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9yZWNvbW1lbmRhdGlvbkpzb246e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCwKb2JzZXJ2ZXI6Il9vbkFjdGl2ZUNoYW5nZWQifSxfc3VtbWFyeV9jb25jbHVzaW9uOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9zdW1tYXJ5X25leHRzdGVwOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9pbmZlZWRfcGVyY2VudF9hdmVyYWdlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LF9pbmZlZWRfcGVyY2VudF9zdGRkZXY6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2luZmVlZF9wZXJjZW50X21pbmltdW06e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2luZmVlZF9wZXJjZW50X21heGltdW06e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX3N0ZXB0aW1lX21zX2F2ZXJhZ2U6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX3N0ZXB0aW1lX21zX3N0ZGRldjp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxfc3RlcHRpbWVfbXNfbWluaW11bTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxfc3RlcHRpbWVfbXNfbWF4aW11bTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfX0sb2JzZXJ2ZXJzOlsiX3Nob3dEZXZpY2VTdGVwQ2hhcnQoX2RldmljZUpzb24pIiwKIl9zaG93RGV2aWNlSW5mZWVkQ2hhcnQoX2RldmljZUpzb24pIiwiX3Nob3dIb3N0Q2hhcnQoX2hvc3RKc29uKSIsIl9zaG93SG9zdFRhYmxlKF9ob3N0SnNvbikiLCJfbWFrZVJlY29tbWVuZGF0aW9ucyhfcmVjb21tZW5kYXRpb25Kc29uKSJdLG9uQ2xpY2s6ZnVuY3Rpb24oKXt0aGlzLnNldCgiX3Nob3dfaG9zdF9zaWRlX3RhYmxlIiwhdGhpcy5fc2hvd19ob3N0X3NpZGVfdGFibGUpfSxfb25BY3RpdmVDaGFuZ2VkOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLl9zaG93X2hvc3Rfc2lkZV90YWJsZT10aGlzLl9zaG93X2hvc3Rfc2lkZV9jaGFydD10aGlzLl9zaG93X2RldmljZV9zaWRlX2FuYWx5c2lzPSExKX0sX2dldFRvZ2dsZUJ1dHRvblRleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuKGE/IkhpZGUiOiJTaG93IikrIiBJbnB1dCBPcCBTdGF0aXN0aWNzIn0sX3VzVG9NczpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5hYnMoTnVtYmVyKGEpKS8xRTN9LF91cGRhdGVWaWV3OmZ1bmN0aW9uKCl7aWYodGhpcy5fZGF0YSYmCnRoaXMuX2FjdGl2ZSl7dmFyIGE9dGhpcy5fZGF0YVswXTt0aGlzLl9kZXZpY2VKc29uPWE7dGhpcy5faG9zdEpzb249dGhpcy5fZGF0YVsyXTt0aGlzLl9yZWNvbW1lbmRhdGlvbkpzb249dGhpcy5fZGF0YVszXTt0aGlzLl9zdW1tYXJ5X2NvbmNsdXNpb249YS5wLnN1bW1hcnlfY29uY2x1c2lvbjt0aGlzLl9zdW1tYXJ5X25leHRzdGVwPWEucC5zdW1tYXJ5X25leHRzdGVwO3RoaXMuX2luZmVlZF9wZXJjZW50X2F2ZXJhZ2U9YS5wLmluZmVlZF9wZXJjZW50X2F2ZXJhZ2U7dGhpcy5faW5mZWVkX3BlcmNlbnRfc3RkZGV2PWEucC5pbmZlZWRfcGVyY2VudF9zdGFuZGFyZF9kZXZpYXRpb247dGhpcy5faW5mZWVkX3BlcmNlbnRfbWluaW11bT1hLnAuaW5mZWVkX3BlcmNlbnRfbWluaW11bTt0aGlzLl9pbmZlZWRfcGVyY2VudF9tYXhpbXVtPWEucC5pbmZlZWRfcGVyY2VudF9tYXhpbXVtO3RoaXMuX3N0ZXB0aW1lX21zX2F2ZXJhZ2U9YS5wLnN0ZXB0aW1lX21zX2F2ZXJhZ2U7dGhpcy5fc3RlcHRpbWVfbXNfc3RkZGV2PQphLnAuc3RlcHRpbWVfbXNfc3RhbmRhcmRfZGV2aWF0aW9uO3RoaXMuX3N0ZXB0aW1lX21zX21pbmltdW09YS5wLnN0ZXB0aW1lX21zX21pbmltdW07dGhpcy5fc3RlcHRpbWVfbXNfbWF4aW11bT1hLnAuc3RlcHRpbWVfbXNfbWF4aW11bTt0aGlzLl9zdW1tYXJ5X2NvbmNsdXNpb24uaW5jbHVkZXMoIkhJR0hMWSIpP3RoaXMuY3VzdG9tU3R5bGVbIi0tc3VtbWFyeS1jb2xvciJdPSJyZWQiOnRoaXMuX3N1bW1hcnlfY29uY2x1c2lvbi5pbmNsdWRlcygiTU9ERVJBVEUiKSYmKHRoaXMuY3VzdG9tU3R5bGVbIi0tc3VtbWFyeS1jb2xvciJdPSJvcmFuZ2UiKTt0aGlzLnVwZGF0ZVN0eWxlcygpfX0sX3Nob3dEZXZpY2VTdGVwQ2hhcnQ6ZnVuY3Rpb24oYSl7aWYoYSYmMCE9YS5yb3dzLmxlbmd0aCYmdGhpcy5fYWN0aXZlKXt0aGlzLl9zaG93X2RldmljZV9zaWRlX2FuYWx5c2lzPSEwO3ZhciBjPVtdLGQ9W10sZj0wLGc9LTE7YS5yb3dzLmZvckVhY2goZnVuY3Rpb24obCl7Zz0wPGc/KytnOgpOdW1iZXIobC5jWzBdLnYpO2MucHVzaCh7c2NhbGFyOmwuY1sxXS52LHN0ZXA6Zyx0cHVfc3RlcDpOdW1iZXIobC5jWzBdLnYpLGxvd193YXRlcm1hcms6MH0pO2QucHVzaCh7c2NhbGFyOmwuY1sxXS52K2wuY1syXS52LHN0ZXA6Zyxsb3dfd2F0ZXJtYXJrOmwuY1sxXS52fSk7Zj1NYXRoLm1heChmLGwuY1sxXS52K2wuY1syXS52KX0pO2lmKGE9dGhpcy4kLmRldmljZV9zdGVwX2NoYXJ0KWEuc2V0VmlzaWJsZVNlcmllcyhbImRldmljZSBzdGVwIHRpbWUiLCJjb21wdXRlIHRpbWUiXSksYS5zZXRTZXJpZXNEYXRhKCJkZXZpY2Ugc3RlcCB0aW1lIixkKSxhLnNldFNlcmllc0RhdGEoImNvbXB1dGUgdGltZSIsYyksYS5kZWZhdWx0WVJhbmdlPVswLDEuMSpmXSxhLnNtb290aGluZ0VuYWJsZWQ9ITEsYS50b29sdGlwQ29sdW1ucz1be3RpdGxlOiJOYW1lIixldmFsdWF0ZTpsPT5sLmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfSx7dGl0bGU6IlRpbWUobXMpIixldmFsdWF0ZTpsPT5sLmRhdHVtLnNjYWxhci50b0ZpeGVkKDIpfSwKe3RpdGxlOiJTdGVwIixldmFsdWF0ZTpsPT5sLmRhdHVtLnN0ZXB9XSxhLmZpbGxBcmVhPXtoaWdoZXJBY2Nlc3NvcjpsPT5sLnNjYWxhcixsb3dlckFjY2Vzc29yOmw9PmwubG93X3dhdGVybWFya30sYS54QXhpc0Zvcm1hdHRlcj1kMy5mb3JtYXQoImQiKX1lbHNlIHRoaXMuX3Nob3dfZGV2aWNlX3NpZGVfYW5hbHlzaXM9ITF9LF9zaG93RGV2aWNlSW5mZWVkQ2hhcnQ6ZnVuY3Rpb24oYSl7aWYoYSYmMCE9YS5yb3dzLmxlbmd0aCl7dmFyIGM9W10sZD0tMTthLnJvd3MuZm9yRWFjaChmdW5jdGlvbihmKXtkPTA8ZD8rK2Q6TnVtYmVyKGYuY1swXS52KTtjLnB1c2goe3N0ZXA6ZCx0cHVfc3RlcDpOdW1iZXIoZi5jWzBdLnYpLHNjYWxhcjpmLmNbNF0udixtaW46Zi5jWzVdLnYsbWF4OmYuY1s2XS52fSl9KTtpZihhPXRoaXMuJC5kZXZpY2VfaW5mZWVkX2NoYXJ0KWEuc2V0VmlzaWJsZVNlcmllcyhbImlucHV0IHRpbWUlIl0pLGEuc2V0U2VyaWVzRGF0YSgiaW5wdXQgdGltZSUiLGMpLAphLnRvb2x0aXBDb2x1bW5zPVt7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmY9PmYuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWV9LHt0aXRsZToiU3RlcCIsZXZhbHVhdGU6Zj0+Zi5kYXR1bS50cHVfc3RlcH0se3RpdGxlOiJBdmVyYWdlKCUpIixldmFsdWF0ZTpmPT5mLmRhdHVtLnNjYWxhci50b0ZpeGVkKDQpKyIlIn0se3RpdGxlOiJNaW4oJSkiLGV2YWx1YXRlOmY9PmYuZGF0dW0ubWluLnRvRml4ZWQoNCkrIiUifSx7dGl0bGU6Ik1heCglKSIsZXZhbHVhdGU6Zj0+Zi5kYXR1bS5tYXgudG9GaXhlZCg0KSsiJSJ9XSxhLmZpbGxBcmVhPXtoaWdoZXJBY2Nlc3NvcjpmPT5mLm1heCxsb3dlckFjY2Vzc29yOmY9PmYubWlufSxhLnhBeGlzRm9ybWF0dGVyPWQzLmZvcm1hdCgiZCIpfWVsc2UgdGhpcy5fc2hvd19kZXZpY2Vfc2lkZV9hbmFseXNpcz0hMX0sX3Nob3dIb3N0Q2hhcnQ6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9dGhpcy5fdXNUb01zKGEucC51bmNsYXNzaWZpZWRfbm9uZXF1ZXVlX3VzKSwKZD10aGlzLl91c1RvTXMoYS5wLmRlbWFuZGVkX2ZpbGVfcmVhZF91cyksZj10aGlzLl91c1RvTXMoYS5wLmFkdmFuY2VkX2ZpbGVfcmVhZF91cyksZz10aGlzLl91c1RvTXMoYS5wLnByZXByb2Nlc3NpbmdfdXMpO2E9dGhpcy5fdXNUb01zKGEucC5lbnF1ZXVlX3VzKTt2YXIgbD1jK2QrZitnK2E7dGhpcy5fc2hvd19ob3N0X3NpZGVfY2hhcnQ9MDxsOzA8bCYmKGY9W3tOYW1lOiJPdGhlciBkYXRhIHJlYWRpbmcgb3IgcHJvY2Vzc2luZyIsVG90YWw6Yy9sKjEwMH0se05hbWU6IlJlYWRpbmcgZGF0YSBmcm9tIGZpbGVzIG9uIGRlbWFuZCIsVG90YWw6ZC9sKjEwMH0se05hbWU6IlJlYWRpbmcgZGF0YSBmcm9tIGZpbGVzIGluIGFkdmFuY2UgW2luY2x1ZGluZyBjYWNoaW5nLCBwcmVmZXRjaGluZywgaW50ZXJsZWF2aW5nXSIsVG90YWw6Zi9sKjEwMH0se05hbWU6IkRhdGEgcHJlcHJvY2Vzc2luZyIsVG90YWw6Zy9sKjEwMH0se05hbWU6IkVucXVldWluZyBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIHRvIGRldmljZSIsClRvdGFsOmEvbCoxMDB9XSxnPW5ldyBQbG90dGFibGUuU2NhbGVzLkNvbG9yLGQ9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkxlZ2VuZChnKSxjPWQzLnNlbGVjdCh0aGlzLiQuaG9zdF9zaWRlX2NoYXJ0KSxmPShuZXcgUGxvdHRhYmxlLlBsb3RzLlBpZSkuYXR0cigiZmlsbCIsZnVuY3Rpb24oayl7cmV0dXJuIGsuTmFtZX0sZykuYWRkRGF0YXNldChuZXcgUGxvdHRhYmxlLkRhdGFzZXQoZikpLnNlY3RvclZhbHVlKGZ1bmN0aW9uKGspe3JldHVybiBrLlRvdGFsfSkubGFiZWxzRW5hYmxlZCghMCkubGFiZWxGb3JtYXR0ZXIoZnVuY3Rpb24oayl7cmV0dXJuIE51bWJlcihrKS50b0ZpeGVkKDIpKyIlIn0pLGQ9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLlRhYmxlKFtbZixkXV0pLGMuc2VsZWN0KCIqIikucmVtb3ZlKCksZC5yZW5kZXJUbyhjKSl9fSxfc2hvd0hvc3RUYWJsZTpmdW5jdGlvbihhKXtpZihhKXt2YXIgYz10aGlzLiQuaG9zdF9zaWRlX3RhYmxlX2NvbnRlbnQ7Yy5pbm5lckhUTUw9CiIiO3RoaXMuX3Nob3dfaG9zdF9zaWRlX3RhYmxlPSExOzAhPWEucm93cy5sZW5ndGgmJmEucm93cy5mb3JFYWNoKGZ1bmN0aW9uKGQpe2xldCBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7UG9seW1lci5kb20oYykuYXBwZW5kQ2hpbGQoZik7bGV0IGc9W107Zy5wdXNoKGQuY1swXS52KTtnLnB1c2goZC5jWzFdLnYpO2cucHVzaChkLmNbMl0udi50b0ZpeGVkKDIpKTtnLnB1c2goKDEwMCpkLmNbM10udikudG9GaXhlZCgyKSsiJSIpO2cucHVzaChkLmNbNF0udi50b0ZpeGVkKDIpKTtnLnB1c2goKDEwMCpkLmNbNV0udikudG9GaXhlZCgyKSsiJSIpO2cucHVzaChkLmNbNl0udik7Zy5mb3JFYWNoKGZ1bmN0aW9uKGwpe2xldCBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7UG9seW1lci5kb20oZikuYXBwZW5kQ2hpbGQoayk7UG9seW1lci5kb20oaykuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobCkpfSl9KX19LF9tYWtlUmVjb21tZW5kYXRpb25zOmZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPQoiIjthLnJvd3MuZm9yRWFjaChmdW5jdGlvbihkKXtjKz0iXHgzY2xpXHgzZSIrZC5jWzBdLnYrIlx4M2MvbGlceDNlIn0pO3RoaXMuJC5yZWNvbW1lbmRhdGlvbl9kZXRhaWxzLmlubmVySFRNTD1jfX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hY3RpdmU9ITA7dGhpcy5fdXBkYXRlVmlldygpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2FjdGl2ZT0hMX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWltYWdlL2lyb24taW1hZ2UuaHRtbC5qcwpQb2x5bWVyKHtpczoiaXJvbi1pbWFnZSIscHJvcGVydGllczp7c3JjOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sYWx0Ont0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxjcm9zc29yaWdpbjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0scHJldmVudExvYWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sc2l6aW5nOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0scG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOiJjZW50ZXIifSxwcmVsb2FkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHBsYWNlaG9sZGVyOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsLG9ic2VydmVyOiJfcGxhY2Vob2xkZXJDaGFuZ2VkIn0sZmFkZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxsb2FkZWQ6e25vdGlmeTohMCxyZWFkT25seTohMCx0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGxvYWRpbmc6e25vdGlmeTohMCxyZWFkT25seTohMCx0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGVycm9yOntub3RpZnk6ITAsCnJlYWRPbmx5OiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMX0sd2lkdGg6e29ic2VydmVyOiJfd2lkdGhDaGFuZ2VkIix0eXBlOk51bWJlcix2YWx1ZTpudWxsfSxoZWlnaHQ6e29ic2VydmVyOiJfaGVpZ2h0Q2hhbmdlZCIsdHlwZTpOdW1iZXIsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl90cmFuc2Zvcm1DaGFuZ2VkKHNpemluZywgcG9zaXRpb24pIiwiX2xvYWRTdGF0ZU9ic2VydmVyKHNyYywgcHJldmVudExvYWQpIl0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX3Jlc29sdmVkU3JjPSIifSxfaW1nT25Mb2FkOmZ1bmN0aW9uKCl7dGhpcy4kLmltZy5zcmM9PT10aGlzLl9yZXNvbHZlU3JjKHRoaXMuc3JjKSYmKHRoaXMuX3NldExvYWRpbmcoITEpLHRoaXMuX3NldExvYWRlZCghMCksdGhpcy5fc2V0RXJyb3IoITEpKX0sX2ltZ09uRXJyb3I6ZnVuY3Rpb24oKXt0aGlzLiQuaW1nLnNyYz09PXRoaXMuX3Jlc29sdmVTcmModGhpcy5zcmMpJiYodGhpcy4kLmltZy5yZW1vdmVBdHRyaWJ1dGUoInNyYyIpLAp0aGlzLiQuc2l6ZWRJbWdEaXYuc3R5bGUuYmFja2dyb3VuZEltYWdlPSIiLHRoaXMuX3NldExvYWRpbmcoITEpLHRoaXMuX3NldExvYWRlZCghMSksdGhpcy5fc2V0RXJyb3IoITApKX0sX2NvbXB1dGVQbGFjZWhvbGRlckhpZGRlbjpmdW5jdGlvbigpe3JldHVybiF0aGlzLnByZWxvYWR8fCF0aGlzLmZhZGUmJiF0aGlzLmxvYWRpbmcmJnRoaXMubG9hZGVkfSxfY29tcHV0ZVBsYWNlaG9sZGVyQ2xhc3NOYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJlbG9hZCYmdGhpcy5mYWRlJiYhdGhpcy5sb2FkaW5nJiZ0aGlzLmxvYWRlZD8iZmFkZWQtb3V0IjoiIn0sX2NvbXB1dGVJbWdEaXZIaWRkZW46ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5zaXppbmd9LF9jb21wdXRlSW1nRGl2QVJJQUhpZGRlbjpmdW5jdGlvbigpe3JldHVybiIiPT09dGhpcy5hbHQ/InRydWUiOnZvaWQgMH0sX2NvbXB1dGVJbWdEaXZBUklBTGFiZWw6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PXRoaXMuYWx0P3RoaXMuYWx0OgoiIj09PXRoaXMuc3JjPyIiOnRoaXMuX3Jlc29sdmVTcmModGhpcy5zcmMpLnJlcGxhY2UoL1s/fCNdLiovZywiIikuc3BsaXQoIi8iKS5wb3AoKX0sX2NvbXB1dGVJbWdIaWRkZW46ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuc2l6aW5nfSxfd2lkdGhDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZS53aWR0aD1pc05hTih0aGlzLndpZHRoKT90aGlzLndpZHRoOnRoaXMud2lkdGgrInB4In0sX2hlaWdodENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLmhlaWdodD1pc05hTih0aGlzLmhlaWdodCk/dGhpcy5oZWlnaHQ6dGhpcy5oZWlnaHQrInB4In0sX2xvYWRTdGF0ZU9ic2VydmVyOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9dGhpcy5fcmVzb2x2ZVNyYyhhKTtkIT09dGhpcy5fcmVzb2x2ZWRTcmMmJih0aGlzLl9yZXNvbHZlZFNyYz0iIix0aGlzLiQuaW1nLnJlbW92ZUF0dHJpYnV0ZSgic3JjIiksdGhpcy4kLnNpemVkSW1nRGl2LnN0eWxlLmJhY2tncm91bmRJbWFnZT0iIiwiIj09PQphfHxjP3RoaXMuX3NldExvYWRpbmcoITEpOih0aGlzLl9yZXNvbHZlZFNyYz1kLHRoaXMuJC5pbWcuc3JjPXRoaXMuX3Jlc29sdmVkU3JjLHRoaXMuJC5zaXplZEltZ0Rpdi5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2U9J3VybCgiJyt0aGlzLl9yZXNvbHZlZFNyYysnIiknLHRoaXMuX3NldExvYWRpbmcoITApKSx0aGlzLl9zZXRMb2FkZWQoITEpLHRoaXMuX3NldEVycm9yKCExKSl9LF9wbGFjZWhvbGRlckNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLiQucGxhY2Vob2xkZXIuc3R5bGUuYmFja2dyb3VuZEltYWdlPXRoaXMucGxhY2Vob2xkZXI/J3VybCgiJyt0aGlzLnBsYWNlaG9sZGVyKyciKSc6IiJ9LF90cmFuc2Zvcm1DaGFuZ2VkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kLnNpemVkSW1nRGl2LnN0eWxlLGM9dGhpcy4kLnBsYWNlaG9sZGVyLnN0eWxlO2EuYmFja2dyb3VuZFNpemU9Yy5iYWNrZ3JvdW5kU2l6ZT10aGlzLnNpemluZzthLmJhY2tncm91bmRQb3NpdGlvbj1jLmJhY2tncm91bmRQb3NpdGlvbj0KdGhpcy5zaXppbmc/dGhpcy5wb3NpdGlvbjoiIjthLmJhY2tncm91bmRSZXBlYXQ9Yy5iYWNrZ3JvdW5kUmVwZWF0PXRoaXMuc2l6aW5nPyJuby1yZXBlYXQiOiIifSxfcmVzb2x2ZVNyYzpmdW5jdGlvbihhKXthPVBvbHltZXIuUmVzb2x2ZVVybC5yZXNvbHZlVXJsKGEsdGhpcy4kLmJhc2VVUklBbmNob3IuaHJlZik7Ii8iPT09YVswXSYmKGE9KGxvY2F0aW9uLm9yaWdpbnx8bG9jYXRpb24ucHJvdG9jb2wrIi8vIitsb2NhdGlvbi5ob3N0KSthKTtyZXR1cm4gYX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1jYXJkL3BhcGVyLWNhcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItY2FyZCIscHJvcGVydGllczp7aGVhZGluZzp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsb2JzZXJ2ZXI6Il9oZWFkaW5nQ2hhbmdlZCJ9LGltYWdlOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sYWx0Ont0eXBlOlN0cmluZ30scHJlbG9hZEltYWdlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZhZGVJbWFnZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxwbGFjZWhvbGRlckltYWdlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxlbGV2YXRpb246e3R5cGU6TnVtYmVyLHZhbHVlOjEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxhbmltYXRlZFNoYWRvdzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbmltYXRlZDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxyZWFkT25seTohMCxjb21wdXRlZDoiX2NvbXB1dGVBbmltYXRlZChhbmltYXRlZFNoYWRvdykifX0sX2lzSGlkZGVuOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJmYWxzZSI6InRydWUifSxfaGVhZGluZ0NoYW5nZWQ6ZnVuY3Rpb24oYSl7dmFyIGM9CnRoaXMuZ2V0QXR0cmlidXRlKCJoZWFkaW5nIiksZD10aGlzLmdldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpOyJzdHJpbmciPT09dHlwZW9mIGQmJmQhPT1jfHx0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsYSl9LF9jb21wdXRlSGVhZGluZ0NsYXNzOmZ1bmN0aW9uKGEpe3JldHVybiBhPyIgb3Zlci1pbWFnZSI6IiJ9LF9jb21wdXRlQW5pbWF0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtb3ZlcnZpZXctcGFnZS9vdmVydmlldy1wYWdlLmh0bWwuanMKUG9seW1lcih7aXM6Im92ZXJ2aWV3LXBhZ2UiLHByb3BlcnRpZXM6e19kYXRhOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3VwZGF0ZVZpZXcifSxfc2hvd190b3Bfb3BzX3RhYmxlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9zaG93X3N0ZXBfdGltZV9ncmFwaDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfc2hvdWxkU2hvd1N0ZXBUaW1lR3JhcGgoX2RhdGEsIF9hY3RpdmUpIn0sX3RvcF9vcHNfYnV0dG9uX3RleHQ6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0VG9wT3BzQnV0dG9uVGV4dChfc2hvd190b3Bfb3BzX3RhYmxlKSJ9LF9nZW5lcmFsQW5hbHlzaXNKc29uOnt0eXBlOlN0cmluZ30sX2lucHV0QW5hbHlzaXNKc29uOnt0eXBlOlN0cmluZ30sX3J1bkVudmlyb25tZW50SnNvbjp7dHlwZTpTdHJpbmd9LF9yZWNvbW1lbmRhdGlvbkpzb246e3R5cGU6U3RyaW5nfSxfYWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9vbkFjdGl2ZUNoYW5nZWQifSxfaG9zdF9pZGxlX3RpbWVfcGVyY2VudDp7dHlwZTpTdHJpbmd9LApfZGV2aWNlX2lkbGVfdGltZV9wZXJjZW50Ont0eXBlOlN0cmluZ30sX214dV91dGlsaXphdGlvbl9wZXJjZW50Ont0eXBlOlN0cmluZ30sX3N0ZXB0aW1lX21zX2F2ZXJhZ2U6e3R5cGU6U3RyaW5nfSxfc3RlcHRpbWVfbXNfc3RkZGV2Ont0eXBlOlN0cmluZ30sX2luZmVlZF9tc19hdmVyYWdlOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2NvbXB1dGVfbXNfYXZlcmFnZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF90b3Bfb3BzX2hlYWRpbmc6e3R5cGU6U3RyaW5nfSxfZXJyb3JfbWVzc2FnZTp7dHlwZTpTdHJpbmd9LF9ob3N0X2NvdW50Ont0eXBlOlN0cmluZ30sX3RwdV90eXBlOnt0eXBlOlN0cmluZ30sX3RwdV9jb3JlX2NvdW50Ont0eXBlOlN0cmluZ30sX2JhdGNoX3NpemU6e3R5cGU6U3RyaW5nfSxfY2hhbmdlX2xpc3Q6e3R5cGU6U3RyaW5nfSxfYnVpbGRfdGltZTp7dHlwZTpTdHJpbmd9LF9idWlsZF90YXJnZXQ6e3R5cGU6U3RyaW5nfSxfc3RhdGVtZW50Ont0eXBlOlN0cmluZ319LApvYnNlcnZlcnM6WyJfc2hvd1N1bW1hcnkoX2lucHV0QW5hbHlzaXNKc29uLCBfZ2VuZXJhbEFuYWx5c2lzSnNvbikiLCJfc2hvd1J1bkVudmlyb25tZW50KF9ydW5FbnZpcm9ubWVudEpzb24pIiwiX3Nob3dEZXZpY2VTdGVwQ2hhcnQoX2lucHV0QW5hbHlzaXNKc29uKSIsIl9zaG93VG9wT3BzVGFibGUoX2dlbmVyYWxBbmFseXNpc0pzb24pIiwiX3Nob3dSZWNvbW1lbmRhdGlvbihfcmVjb21tZW5kYXRpb25Kc29uKSJdLG9uQ2xpY2tUb3BPcHM6ZnVuY3Rpb24oKXt0aGlzLl9zaG93X3RvcF9vcHNfdGFibGU9IXRoaXMuX3Nob3dfdG9wX29wc190YWJsZX0sX2dldFRvcE9wc0J1dHRvblRleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuKGE/IkhpZGUiOiJTaG93IikrIiB0YWJsZSJ9LF91cGRhdGVWaWV3OmZ1bmN0aW9uKCl7aWYodGhpcy5fZGF0YSYmdGhpcy5fYWN0aXZlKXt0aGlzLl9nZW5lcmFsQW5hbHlzaXNKc29uPXRoaXMuX2RhdGFbMF07dGhpcy5faW5wdXRBbmFseXNpc0pzb249dGhpcy5fZGF0YVsxXTsKdGhpcy5fcnVuRW52aXJvbm1lbnRKc29uPXRoaXMuX2RhdGFbMl07dmFyIGE9dGhpcy5fZGF0YVszXTt0aGlzLl9yZWNvbW1lbmRhdGlvbkpzb249YTt0aGlzLl9zdGF0ZW1lbnQ9YS5wLnN0YXRlbWVudDthPSJncmVlbiI7dGhpcy5fc3RhdGVtZW50LmluY2x1ZGVzKCJISUdITFkiKT9hPSJyZWQiOnRoaXMuX3N0YXRlbWVudC5pbmNsdWRlcygiTU9ERVJBVEUiKSYmKGE9Im9yYW5nZSIpO3RoaXMudXBkYXRlU3R5bGVzKHsiLS1zdW1tYXJ5LWNvbG9yIjphfSl9fSxfc2hvd1N1bW1hcnk6ZnVuY3Rpb24oYSxjKXthJiZjJiYodGhpcy5faG9zdF9pZGxlX3RpbWVfcGVyY2VudD1jLnAuaG9zdF9pZGxlX3RpbWVfcGVyY2VudCx0aGlzLl9kZXZpY2VfaWRsZV90aW1lX3BlcmNlbnQ9Yy5wLmRldmljZV9pZGxlX3RpbWVfcGVyY2VudCx0aGlzLl9teHVfdXRpbGl6YXRpb25fcGVyY2VudD1jLnAubXh1X3V0aWxpemF0aW9uX3BlcmNlbnQsdGhpcy5fc3RlcHRpbWVfbXNfYXZlcmFnZT1hLnAuc3RlcHRpbWVfbXNfYXZlcmFnZSwKdGhpcy5fc3RlcHRpbWVfbXNfc3RkZGV2PWEucC5zdGVwdGltZV9tc19zdGFuZGFyZF9kZXZpYXRpb24sdGhpcy5fY29tcHV0ZV9tc19hdmVyYWdlPWEucC5jb21wdXRlX21zX2F2ZXJhZ2UsdGhpcy5faW5mZWVkX21zX2F2ZXJhZ2U9YS5wLmluZmVlZF9tc19hdmVyYWdlKX0sX3Nob3dSdW5FbnZpcm9ubWVudDpmdW5jdGlvbihhKXthJiYodGhpcy5fZXJyb3JfbWVzc2FnZT1hLnAuZXJyb3JfbWVzc2FnZSx0aGlzLl9ob3N0X2NvdW50PWEucC5ob3N0X2NvdW50LHRoaXMuX3RwdV90eXBlPWEucC50cHVfdHlwZSx0aGlzLl90cHVfY29yZV9jb3VudD1hLnAudHB1X2NvcmVfY291bnQsdGhpcy5fYmF0Y2hfc2l6ZT1hLnAuYmF0Y2hfc2l6ZSx0aGlzLl9jaGFuZ2VfbGlzdD1hLnAuY2hhbmdlX2xpc3QsdGhpcy5fYnVpbGRfdGltZT1hLnAuYnVpbGRfdGltZSx0aGlzLl9idWlsZF90YXJnZXQ9YS5wLmJ1aWxkX3RhcmdldCl9LF9zaG93RGV2aWNlU3RlcENoYXJ0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuX3Nob3dfc3RlcF90aW1lX2dyYXBoKXt2YXIgYz0KW10sZD1bXSxmPTAsZz0tMTthLnJvd3MuZm9yRWFjaChmdW5jdGlvbihsKXtnPTA8Zz8rK2c6TnVtYmVyKGwuY1swXS52KTtjLnB1c2goe3NjYWxhcjpsLmNbMV0udixzdGVwOmcsdHB1X3N0ZXA6TnVtYmVyKGwuY1swXS52KSxsb3dfd2F0ZXJtYXJrOjB9KTtkLnB1c2goe3NjYWxhcjpsLmNbMV0uditsLmNbMl0udixzdGVwOmcsbG93X3dhdGVybWFyazpsLmNbMV0udn0pO2Y9TWF0aC5tYXgoZixsLmNbMV0uditsLmNbMl0udil9KTtpZihhPXRoaXMuJCQoIiNkZXZpY2Vfc3RlcF9jaGFydCIpKWEuc2V0VmlzaWJsZVNlcmllcyhbImNvbXB1dGUtdGltZSIsInN0ZXAtdGltZSBceDNkIGlucHV0LXRpbWUgKyBjb21wdXRlLXRpbWUiXSksYS5zZXRTZXJpZXNEYXRhKCJjb21wdXRlLXRpbWUiLGMpLGEuc2V0U2VyaWVzRGF0YSgic3RlcC10aW1lIFx4M2QgaW5wdXQtdGltZSArIGNvbXB1dGUtdGltZSIsZCksYS5kZWZhdWx0WVJhbmdlPVswLDEuMSpmXSxhLnNtb290aGluZ0VuYWJsZWQ9CiExLGEudG9vbHRpcENvbHVtbnM9W3t0aXRsZToiTmFtZSIsZXZhbHVhdGU6bD0+bC5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZX0se3RpdGxlOiJUaW1lKG1zKSIsZXZhbHVhdGU6bD0+bC5kYXR1bS5zY2FsYXIudG9GaXhlZCgyKX0se3RpdGxlOiJTdGVwIixldmFsdWF0ZTpsPT5sLmRhdHVtLnN0ZXB9XSxhLmZpbGxBcmVhPXtoaWdoZXJBY2Nlc3NvcjpsPT5sLnNjYWxhcixsb3dlckFjY2Vzc29yOmw9PmwubG93X3dhdGVybWFya30sYS54QXhpc0Zvcm1hdHRlcj1kMy5mb3JtYXQoImQiKX19LF9zaG93VG9wT3BzVGFibGU6ZnVuY3Rpb24oYSl7aWYoYSYmYS5yb3dzJiZhLnJvd3MubGVuZ3RoJiZ0aGlzLl9hY3RpdmUpe3ZhciBjPTAsZD10aGlzLiQkKCIjdG9wX29wc190YWJsZV9jb250ZW50Iik7ZCYmKGQuaW5uZXJIVE1MPSIiLGEucm93cy5mb3JFYWNoKGZ1bmN0aW9uKGYpe3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7UG9seW1lci5kb20oZCkuYXBwZW5kQ2hpbGQoZyk7CnZhciBsPVtdO2wucHVzaCgoMTAwKmYuY1swXS52KS50b0ZpeGVkKDIpKyIlIik7bC5wdXNoKCgxMDAqZi5jWzFdLnYpLnRvRml4ZWQoMikrIiUiKTtsLnB1c2goZi5jWzJdLnYpO2wucHVzaChmLmNbM10udik7bC5wdXNoKGYuY1s0XS52LnRvRml4ZWQoMikpO2wuZm9yRWFjaChmdW5jdGlvbihrKXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO1BvbHltZXIuZG9tKGcpLmFwcGVuZENoaWxkKG4pO1BvbHltZXIuZG9tKG4pLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGspKX0pO2MrPTF9KSx0aGlzLl90b3Bfb3BzX2hlYWRpbmc9IlRvcCAiK2MrIiBUZW5zb3JGbG93IG9wZXJhdGlvbnMgZXhlY3V0ZWQgb24gVFBVIix0aGlzLl9zaG93X3RvcF9vcHNfdGFibGU9ITEpfX0sX2dlbmVyYXRlUmVjb21tZW5kYXRpb25IdG1sOmZ1bmN0aW9uKGEsYyxkLGYpe3ZhciBnPSJceDNjcFx4M2VceDI2bmJzcDtceDNjL3BceDNlIjtnKz0nXHgzY2RpdiBjbGFzc1x4M2QiJysKYysnIlx4M2UnO2crPSJceDNjYlx4M2UiK2YrIjpceDNjL2JceDNlIjthLnJvd3MuZm9yRWFjaChmdW5jdGlvbihsKXtsLmNbMF0udj09ZCYmKGcrPSJceDNjbGlceDNlIitsLmNbMV0udisiXHgzYy9saVx4M2UiKX0pO3JldHVybiBnKz0iXHgzYy9kaXZceDNlIn0sX3Nob3dSZWNvbW1lbmRhdGlvbjpmdW5jdGlvbihhKXtpZihhJiZ0aGlzLl9hY3RpdmUpe3ZhciBjPWEucC5ib3R0bGVuZWNrLGQ9dGhpcy4kJCgiI2hvc3Rfc2lkZV90aXBzIiksZj10aGlzLiQkKCIjZGV2aWNlX3NpZGVfdGlwcyIpO2QmJmYmJigiZGV2aWNlIj09Yz8oZC5pbm5lckhUTUw9IiIsZi5pbm5lckhUTUw9dGhpcy5fZ2VuZXJhdGVSZWNvbW1lbmRhdGlvbkh0bWwoYSwiYm90dGxlbmVja1RpcHMiLCJkZXZpY2UiLCJOZXh0IHRvb2xzIHRvIHVzZSBmb3IgcmVkdWNpbmcgdGhlIFRQVSB0aW1lIikpOiJob3N0Ij09Yz8oZC5pbm5lckhUTUw9dGhpcy5fZ2VuZXJhdGVSZWNvbW1lbmRhdGlvbkh0bWwoYSwiYm90dGxlbmVja1RpcHMiLAoiaG9zdCIsIk5leHQgdG9vbHMgdG8gdXNlIGZvciByZWR1Y2luZyB0aGUgaW5wdXQgdGltZSIpLGYuaW5uZXJIVE1MPSIiKTooZC5pbm5lckhUTUw9dGhpcy5fZ2VuZXJhdGVSZWNvbW1lbmRhdGlvbkh0bWwoYSwiYm90dGxlbmVja1RpcHMiLCJob3N0IiwiTmV4dCB0b29scyB0byB1c2UgZm9yIHJlZHVjaW5nIHRoZSBpbnB1dCB0aW1lIiksZi5pbm5lckhUTUw9dGhpcy5fZ2VuZXJhdGVSZWNvbW1lbmRhdGlvbkh0bWwoYSwiYm90dGxlbmVja1RpcHMiLCJkZXZpY2UiLCJOZXh0IHRvb2xzIHRvIHVzZSBmb3IgcmVkdWNpbmcgdGhlIFRQVSB0aW1lIikpLGM9dGhpcy4kJCgiI2RvY3VtZW50YXRpb25fdGlwcyIpKSYmKGMuaW5uZXJIVE1MPXRoaXMuX2dlbmVyYXRlUmVjb21tZW5kYXRpb25IdG1sKGEsImRvY3VtZW50YXRpb25UaXBzIiwiZG9jIiwiT3RoZXIgdXNlZnVsIHJlc291cmNlcyIpKX19LF9vbkFjdGl2ZUNoYW5nZWQ6ZnVuY3Rpb24oYSl7YT90aGlzLl91cGRhdGVWaWV3KCk6CnRoaXMuX3Nob3dfdG9wX29wc190YWJsZT10aGlzLl9zaG93X3N0ZXBfdGltZV9ncmFwaD0hMX0sX3Nob3VsZFNob3dTdGVwVGltZUdyYXBoOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGMmJmEmJmFbMV0mJmFbMV0ucm93cyYmYVsxXS5yb3dzLmxlbmd0aH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hY3RpdmU9ITA7dGhpcy5fdXBkYXRlVmlldygpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2FjdGl2ZT0hMX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1vcC1wcm9maWxlL3V0aWxzLmpzCnZhciBwcDsKKGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMobCxrLG4scCl7cmV0dXJuInJnYmEoIitNYXRoLnJvdW5kKDI1NSpsKSsiLCIrTWF0aC5yb3VuZCgyNTUqaykrIiwiK01hdGgucm91bmQoMjU1Km4pKyIsIitwKyIpIn1mdW5jdGlvbiBkKGwsaz0xLG49MSxwPU1hdGguc3FydCl7aWYoaXNOYU4obCkpcmV0dXJuIGMoayxrLGssbik7bD1wKGwpO3JldHVybi41Pmw/YyhrLDIqbCprLDAsbik6YygyKigxLWwpKmssaywwLG4pfWZ1bmN0aW9uIGYobCl7cmV0dXJuIGwmJmwubWV0cmljcyYmbC5tZXRyaWNzLnRpbWU/bC5tZXRyaWNzLmZsb3BzL2wubWV0cmljcy50aW1lOk5hTn1mdW5jdGlvbiBnKGwpe3JldHVybiBsJiZsLm1ldHJpY3MmJmwubWV0cmljcy5tZW1vcnlCYW5kd2lkdGg/bC5tZXRyaWNzLm1lbW9yeUJhbmR3aWR0aDpOYU59YS5mbGFtZUNvbG9yPWQ7YS5mbG9wc0NvbG9yPWZ1bmN0aW9uKGwpe3JldHVybiBkKGwsLjcpfTthLmJ3Q29sb3I9ZnVuY3Rpb24obCl7cmV0dXJuIGQoMS1sLAouNyl9O2EudXRpbGl6YXRpb249ZjthLm1lbW9yeVV0aWxpemF0aW9uPWc7YS5oYXNNZW1vcnlVdGlsaXphdGlvbj1mdW5jdGlvbihsKXtyZXR1cm4gbCYmbC5tZXRyaWNzJiZsLm1ldHJpY3MubWVtb3J5QmFuZHdpZHRofTthLmhhc0Zsb3BzPWZ1bmN0aW9uKGwpe3JldHVybiBsJiZsLm1ldHJpY3MmJmwubWV0cmljcy50aW1lfTthLnBlcmNlbnQ9ZnVuY3Rpb24obCl7cmV0dXJuIGlzTmFOKGwpPyItIjouOTk1PD1sPyIxMDAlIjoxRS01Pmw/IjAuMDAlIjooMTAwKmwpLnRvUHJlY2lzaW9uKDIpKyIlIn07YS50aW1lV2FzdGVkPWZ1bmN0aW9uKGwpe3JldHVybiBsJiZsLm1ldHJpY3M/bC5tZXRyaWNzLnRpbWUqKDEtTWF0aC5tYXgoZihsKSxnKGwpKSk6TmFOfX0pKHBwfHwocHA9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1vcC1wcm9maWxlL3RmLW9wLXRhYmxlLmh0bWwuanMKUG9seW1lcih7aXM6InRmLW9wLXRhYmxlIixwcm9wZXJ0aWVzOntyb290Tm9kZTp7dHlwZTpPYmplY3R9LGFjdGl2ZTp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9hY3RpdmUoX3NlbGVjdGVkLCBfaG92ZXIpIixub3RpZnk6ITB9LHNob3dQOTA6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LGJ5V2FzdGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LGNoaWxkcmVuQ291bnQ6e3R5cGU6TnVtYmVyLHZhbHVlOjEwLG5vdGlmeTohMH0sX3NlbGVjdGVkOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsLG5vdGlmeTohMH0sX2hvdmVyOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsLG5vdGlmeTohMH0sX29uSGVhZGVySG92ZXI6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGE9PnRoaXMuX2hvdmVyPWF9fSxfb25IZWFkZXJDbGljazp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gYT0+e3RoaXMuX3NlbGVjdGVkJiYodGhpcy5fc2VsZWN0ZWQuc2VsZWN0ZWQ9CiExKTt0aGlzLl9zZWxlY3RlZD1hO2Euc2VsZWN0ZWQ9ITB9fX19LF9hY3RpdmU6ZnVuY3Rpb24oYSxjKXtpZihjKXJldHVybiBjLm5vZGU7aWYoYSlyZXR1cm4gYS5ub2RlfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLW9wLXByb2ZpbGUvdGYtb3AtdGFibGUuaHRtbC0yLmpzClBvbHltZXIoe2lzOiJ0Zi1vcC10YWJsZS1lbnRyeSIscHJvcGVydGllczp7bm9kZTp7dHlwZTpPYmplY3R9LGxldmVsOnt0eXBlOk51bWJlcix2YWx1ZTowfSxoZWFkZXJIb3Zlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9PmZ1bmN0aW9uKCl7fSxub3RpZnk6ITB9LGhlYWRlckNsaWNrOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+ZnVuY3Rpb24oKXt9LG5vdGlmeTohMH0sZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LHNlbGVjdGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9zZWxlY3RlZENoYW5nZWQifX0sX2VxOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGE9PWN9LF9uZXh0TGV2ZWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGErMX0sX2hhbmRsZUhlYWRlckNsaWNrOmZ1bmN0aW9uKCl7dGhpcy5leHBhbmRlZF49MTt0aGlzLmhlYWRlckNsaWNrKHRoaXMpfSxfaGFuZGxlSGVhZGVyTW91c2VFbnRlcjpmdW5jdGlvbigpe3RoaXMuaGVhZGVySG92ZXIodGhpcyl9LApfaGFuZGxlSGVhZGVyTW91c2VMZWF2ZTpmdW5jdGlvbigpe3RoaXMuaGVhZGVySG92ZXIobnVsbCl9LF9wZXJjZW50OmZ1bmN0aW9uKGEpe3JldHVybiBhLm1ldHJpY3MmJmEubWV0cmljcy50aW1lP3BwLnBlcmNlbnQoYS5tZXRyaWNzLnRpbWUpOiIifSxfdGltZVdhc3RlZDpmdW5jdGlvbihhKXtyZXR1cm4gcHAucGVyY2VudChwcC50aW1lV2FzdGVkKGEpKX0sX3Byb3ZlbmFuY2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEueGxhJiZhLnhsYS5wcm92ZW5hbmNlP2EueGxhLnByb3ZlbmFuY2UucmVwbGFjZSgvXi4qXC8vLCIiKToiIn0sX3V0aWxpemF0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiBwcC5wZXJjZW50KHBwLnV0aWxpemF0aW9uKGEpKX0sX2hhc0Zsb3BzOnBwLmhhc0Zsb3BzLF9mbGFtZUNvbG9yOmZ1bmN0aW9uKGEpe3JldHVybiBwcC5mbGFtZUNvbG9yKHBwLnV0aWxpemF0aW9uKGEpLDEsLjIpfSxfYmFyV2lkdGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubWV0cmljcyYmYS5tZXRyaWNzLnRpbWU/CnBwLnBlcmNlbnQoYS5tZXRyaWNzLnRpbWUpOjB9LF9zZWxlY3RlZENoYW5nZWQ6ZnVuY3Rpb24oYSl7dGhpcy5jbGFzc0xpc3QudG9nZ2xlKCJzZWxlY3RlZCIsYSl9LF9nZXRLQ2hpbGRyZW46ZnVuY3Rpb24oYSxjLGQsZil7aWYoZCYmMDxhLmNoaWxkcmVuLmxlbmd0aCYmYS5jaGlsZHJlblswXS5tZXRyaWNzKXtmb3IodmFyIGc9ZD0wLGw9LjkqYS5tZXRyaWNzLnRpbWU7ZzxNYXRoLm1pbihjLGEuY2hpbGRyZW4ubGVuZ3RoKSYmIShkPj1sKTtnKyspZCs9YS5jaGlsZHJlbltnXS5tZXRyaWNzLnRpbWU7Yz1nfXJldHVybiBmP2EuY2hpbGRyZW4uc2xpY2UoMCxjKTphLmNoaWxkcmVufSxfaGFzTGVmdG91dDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGQ/YS5udW1DaGlsZHJlbj5NYXRoLm1pbihjLGEuY2hpbGRyZW4ubGVuZ3RoKTohMX0sX251bUxlZnRvdXQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5udW1DaGlsZHJlbi1NYXRoLm1pbihjLGEuY2hpbGRyZW4ubGVuZ3RoKX0sX2dldFBhZGRpbmdMZWZ0OmZ1bmN0aW9uKGEpe3JldHVybiBhKwo1fSxfc29ydDpmdW5jdGlvbihhKXtyZXR1cm4gYT8oYyxkKT0+cHAudGltZVdhc3RlZChkKS1wcC50aW1lV2FzdGVkKGMpOjB9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtb3AtcHJvZmlsZS90Zi1vcC1kZXRhaWxzLmh0bWwuanMKUG9seW1lcih7aXM6InRmLW9wLWJhciIscHJvcGVydGllczp7dmFsdWU6e3R5cGU6TnVtYmVyfSxjb2xvcjp7dHlwZTpTdHJpbmd9fSxvYnNlcnZlcnM6WyJfdXBkYXRlVmFsdWUodmFsdWUsIGNvbG9yKSJdLF9wZXJjZW50OnBwLnBlcmNlbnQsX3VwZGF0ZVZhbHVlOmZ1bmN0aW9uKGEsYyl7YyYmKGE9cHAucGVyY2VudChhKSx0aGlzLnN0eWxlLmJhY2tncm91bmQ9YGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgJHtjfSAke2F9LCAjY2NjICR7YX0pYCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtb3AtcHJvZmlsZS90Zi1vcC1kZXRhaWxzLmh0bWwtMi5qcwpQb2x5bWVyKHtpczoidGYtb3AtZGV0YWlscyIscHJvcGVydGllczp7bm9kZTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLG9ic2VydmVyOiJfdXBkYXRlQ2FyZCJ9fSxfdXRpbGl6YXRpb246cHAudXRpbGl6YXRpb24sX21lbW9yeVV0aWxpemF0aW9uOnBwLm1lbW9yeVV0aWxpemF0aW9uLF9oYXNGbG9wczpwcC5oYXNGbG9wcyxfaGFzTWVtb3J5VXRpbGl6YXRpb246cHAuaGFzTWVtb3J5VXRpbGl6YXRpb24sX3VwZGF0ZUNhcmQ6ZnVuY3Rpb24oYSl7YSYmKGE9cHAuZmxhbWVDb2xvcihwcC51dGlsaXphdGlvbihhKSwuNyksdGhpcy4kLmNhcmQudXBkYXRlU3R5bGVzKHsiLS1wYXBlci1jYXJkLWJhY2tncm91bmQtY29sb3IiOmF9KSl9LF9zdWJoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/YS54bGE/YS54bGEuY2F0ZWdvcnkrIiBvcGVyYXRpb24iOmEuY2F0ZWdvcnk/Ik9wZXJhdGlvbiBjYXRlZ29yeSI6IlVua25vd24iOm51bGx9LF9mdXNlZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCmEueGxhJiYhKGEubWV0cmljcyYmYS5tZXRyaWNzLnRpbWUpfSxfZGltZW5zaW9uQ29sb3I6ZnVuY3Rpb24oYSl7aWYoIWF8fCFhLmFsaWdubWVudClyZXR1cm4gbnVsbDthPWEuc2l6ZS9hLmFsaWdubWVudDtyZXR1cm4gcHAuZmxhbWVDb2xvcihhL01hdGguY2VpbChhKSwxLC4yNSxjPT4xLU1hdGguc3FydCgxLWMpKX0sX2RpbWVuc2lvbkhpbnQ6ZnVuY3Rpb24oYSl7aWYoIWF8fCFhLmFsaWdubWVudClyZXR1cm4gbnVsbDt2YXIgYz1NYXRoLmNlaWwoYS5zaXplL2EuYWxpZ25tZW50KSxkPTE9PWM/IiI6IjogIitjKyIgXHUwMGQ3ICIrYS5hbGlnbm1lbnQ7cmV0dXJuIDA9PWEuc2l6ZSVhLmFsaWdubWVudD8iRXhhY3QgZml0IitkOiJQYWQgdG8gIitjKmEuYWxpZ25tZW50K2R9LF9mbG9wc0NvbG9yOmZ1bmN0aW9uKGEpe3JldHVybiBwcC5mbG9wc0NvbG9yKHBwLnV0aWxpemF0aW9uKGEpKX0sX2J3Q29sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHBwLmJ3Q29sb3IocHAubWVtb3J5VXRpbGl6YXRpb24oYSkpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLW9wLXByb2ZpbGUvdGYtb3AtcHJvZmlsZS5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1vcC1wcm9maWxlIixwcm9wZXJ0aWVzOntfZGF0YTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxfcm9vdDp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxhY3RpdmU6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTpudWxsfSxfaGFzVHdvUHJvZmlsZXM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NoZWNrUHJvZmlsZXMoX2RhdGEpIixub3RpZnk6ITB9LGlzQnlDYXRlZ29yeTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sc2hvd1A5MDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sYnlXYXN0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sY2hpbGRyZW5Db3VudDp7dHlwZTpOdW1iZXIsdmFsdWU6MTAsbm90aWZ5OiEwfX0sb2JzZXJ2ZXJzOlsiX2dldFJvb3QoX2RhdGEsIGlzQnlDYXRlZ29yeSkiXSxfbG9hZDpmdW5jdGlvbihhKXt0aGlzLl9kYXRhPWF9LF9nZXRSb290OmZ1bmN0aW9uKGEsYyl7dGhpcy5fcm9vdD0KdGhpcy5faGFzVHdvUHJvZmlsZXM/Yz9hLmJ5Q2F0ZWdvcnk6YS5ieVByb2dyYW06YS5ieUNhdGVnb3J5fHxhLmJ5UHJvZ3JhbX0sX2NoZWNrUHJvZmlsZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWEuYnlQcm9ncmFtJiZudWxsIT1hLmJ5Q2F0ZWdvcnl9LF91dGlsaXphdGlvblBlcmNlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHBwLnBlcmNlbnQocHAudXRpbGl6YXRpb24oYSkpfSxfbWVtb3J5VXRpbGl6YXRpb25QZXJjZW50OmZ1bmN0aW9uKGEpe3JldHVybiBwcC5wZXJjZW50KHBwLm1lbW9yeVV0aWxpemF0aW9uKGEpKX0sX2hhc0Zsb3BzOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEubWV0cmljcy5mbG9wc30sX2Zsb3BzQ29sb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHBwLmZsb3BzQ29sb3IocHAudXRpbGl6YXRpb24oYSkpfSxfYndDb2xvcjpmdW5jdGlvbihhKXtyZXR1cm4gcHAuYndDb2xvcihwcC5tZW1vcnlVdGlsaXphdGlvbihhKSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcHJvZmlsZS1jb21tb24vdXRpbC5qcwooZnVuY3Rpb24oYSl7KGZ1bmN0aW9uKGMpeyhmdW5jdGlvbihkKXtkLnRpbWU9ZnVuY3Rpb24oZixnKXtsZXQgbD1EYXRlLm5vdygpO2c9ZygpO2NvbnNvbGUubG9nKGYsIjoiLERhdGUubm93KCktbCwibXMiKTtyZXR1cm4gZ307ZC5nZXRUcmFja2VyPWZ1bmN0aW9uKGYpe3JldHVybntzZXRNZXNzYWdlOmZ1bmN0aW9uKGcpe2Yuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOmYucHJvZ3Jlc3MudmFsdWUsbXNnOmd9KX0sdXBkYXRlUHJvZ3Jlc3M6ZnVuY3Rpb24oZyl7Zi5zZXQoInByb2dyZXNzIix7dmFsdWU6Zi5wcm9ncmVzcy52YWx1ZStnLG1zZzpmLnByb2dyZXNzLm1zZ30pfSxyZXBvcnRFcnJvcjpmdW5jdGlvbihnLGwpe2NvbnNvbGUuZXJyb3IobC5zdGFjayk7Zi5zZXQoInByb2dyZXNzIix7dmFsdWU6Zi5wcm9ncmVzcy52YWx1ZSxtc2c6ZyxlcnJvcjohMH0pfX19O2QucnVuVGFzaz1mdW5jdGlvbihmLGcsbCxrKXtrLnNldE1lc3NhZ2UoZik7dHJ5e2xldCBuPWEucHJvZmlsZS51dGlsLnRpbWUoZiwKbCk7ay51cGRhdGVQcm9ncmVzcyhnKTtyZXR1cm4gbn1jYXRjaChuKXtrLnJlcG9ydEVycm9yKCJGYWlsZWQgIitmLG4pfX19KShjLnV0aWx8fChjLnV0aWw9e30pKX0pKGEucHJvZmlsZXx8KGEucHJvZmlsZT17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL21lbW9yeS12aWV3ZXIvdXRpbHMuanMKdmFyIHFwOwooZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhkLGYsZyxsKXtyZXR1cm4icmdiYSgiK01hdGgucm91bmQoMjU1KmQpKyIsIitNYXRoLnJvdW5kKDI1NSpmKSsiLCIrTWF0aC5yb3VuZCgyNTUqZykrIiwiK2wrIikifWEuYnl0ZXNUb01pQj1mdW5jdGlvbihkKXtyZXR1cm4gZC8xMDQ4NTc2fTthLmJ5dGVTaXplT2ZQcmltaXRpdmVUeXBlPWZ1bmN0aW9uKGQpe3N3aXRjaChkKXtjYXNlICJQUkVEIjpyZXR1cm4gMTtjYXNlICJTOCI6cmV0dXJuIDE7Y2FzZSAiUzE2IjpyZXR1cm4gMjtjYXNlICJTMzIiOnJldHVybiA0O2Nhc2UgIlM2NCI6cmV0dXJuIDg7Y2FzZSAiVTgiOnJldHVybiAxO2Nhc2UgIlUxNiI6cmV0dXJuIDI7Y2FzZSAiVTMyIjpyZXR1cm4gNDtjYXNlICJVNjQiOnJldHVybiA4O2Nhc2UgIkJGMTYiOnJldHVybiAyO2Nhc2UgIkYxNiI6cmV0dXJuIDI7Y2FzZSAiRjMyIjpyZXR1cm4gNDtjYXNlICJGNjQiOnJldHVybiA4O2Nhc2UgIkM2NCI6cmV0dXJuIDg7Y2FzZSAiVE9LRU4iOnJldHVybiAwO2RlZmF1bHQ6cmV0dXJuIGNvbnNvbGUuZXJyb3IoIlVuaGFuZGxlZCBwcmltaXRpdmUgdHlwZSAiKwpkKSwwfX07YS5mbGFtZUNvbG9yPWZ1bmN0aW9uKGQsZixnLGwpe3ZvaWQgMD09PWYmJihmPTEpO3ZvaWQgMD09PWcmJihnPTEpO3ZvaWQgMD09PWwmJihsPWs9PjEtTWF0aC5zcXJ0KDEtaykpO2lmKGlzTmFOKGQpKXJldHVybiBjKGYsZixmLGcpO2Q9bChkKTtyZXR1cm4uNT5kP2MoZiwyKmQqZiwwLGcpOmMoMiooMS1kKSpmLGYsMCxnKX07YS5wZXJjZW50PWZ1bmN0aW9uKGQpe3JldHVybiBpc05hTihkKT8iLSI6Ljk5NTw9ZD8iMTAwJSI6MUUtNT5kPyIwLjAwJSI6KDEwMCpkKS50b1ByZWNpc2lvbigyKSsiJSJ9fSkocXB8fChxcD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL21lbW9yeS12aWV3ZXIvc2hhcGUuanMKdmFyIHJwOwooZnVuY3Rpb24oYSl7Y2xhc3MgY3tjb25zdHJ1Y3RvcihkKXt0aGlzLmVsZW1lbnRUeXBlPWQuZWxlbWVudFR5cGUudG9TdHJpbmcoKTt0aGlzLmRpbWVuc2lvbnM9ZC5kaW1lbnNpb25zLm1hcChmPT5wYXJzZUludChmLDEwKSk7ZC50dXBsZVNoYXBlcyYmKHRoaXMudHVwbGVTaGFwZXM9ZC50dXBsZVNoYXBlcy5tYXAoZj0+bmV3IGMoZikpKTt0aGlzLmxheW91dD1kLmxheW91dH1yZXNvbHZlU2hhcGVJbmRleChkKXtyZXR1cm4gZC5yZWR1Y2UoKGYsZyk9PmYudHVwbGVTaGFwZXNbZ10sdGhpcyl9dW5wYWRkZWRIZWFwU2l6ZUJ5dGVzKCl7aWYoIlRPS0VOIj09PXRoaXMuZWxlbWVudFR5cGUpcmV0dXJuIDA7aWYoIlRVUExFIj09PXRoaXMuZWxlbWVudFR5cGUpcmV0dXJuIDgqdGhpcy50dXBsZVNoYXBlcy5sZW5ndGg7bGV0IGQ9MDtpZih0aGlzLmxheW91dCYmIkRFTlNFIiE9dGhpcy5sYXlvdXQuZm9ybWF0KSJTUEFSU0UiPT10aGlzLmxheW91dC5mb3JtYXQmJihmPXBhcnNlSW50KHRoaXMubGF5b3V0Lm1heFNwYXJzZUVsZW1lbnRzLAoxMCksZD1mKnFwLmJ5dGVTaXplT2ZQcmltaXRpdmVUeXBlKHRoaXMuZWxlbWVudFR5cGUpLGQrPWYqdGhpcy5kaW1lbnNpb25zLmxlbmd0aCo4KTtlbHNle3ZhciBmPXRoaXMuZGltZW5zaW9ucy5yZWR1Y2UoKGcsbCk9PmcqbCwxKTtkKz1mKnFwLmJ5dGVTaXplT2ZQcmltaXRpdmVUeXBlKHRoaXMuZWxlbWVudFR5cGUpfXJldHVybiBkfWh1bWFuU3RyaW5nV2l0aExheW91dCgpe2lmKCJUVVBMRSI9PT10aGlzLmVsZW1lbnRUeXBlKXt2YXIgZD0iKCI7bGV0IGY9IiI7Zm9yKGNvbnN0IGcgb2YgdGhpcy50dXBsZVNoYXBlcylkPWQrZitnLmh1bWFuU3RyaW5nV2l0aExheW91dCgpLGY9IiwgIjtyZXR1cm4gZCs9IikifWQ9dGhpcy5lbGVtZW50VHlwZS50b0xvd2VyQ2FzZSgpKyJbIjtkKz10aGlzLmRpbWVuc2lvbnMuam9pbigpKyJdIjsiT1BBUVVFIiE9PXRoaXMuZWxlbWVudFR5cGUmJiJUT0tFTiIhPT10aGlzLmVsZW1lbnRUeXBlJiYwPHRoaXMuZGltZW5zaW9ucy5sZW5ndGgmJnRoaXMubGF5b3V0JiYKKGQrPXRoaXMuaHVtYW5MYXlvdXRTdHJpbmcodGhpcy5sYXlvdXQpKTtyZXR1cm4gZH1odW1hbkxheW91dFN0cmluZyhkKXtyZXR1cm4iU1BBUlNFIj09ZC5mb3JtYXQ/InNwYXJzZXsiK2QubWF4U3BhcnNlRWxlbWVudHMrIn0iOiJERU5TRSI9PWQuZm9ybWF0PyJ7IitkLm1pbm9yVG9NYWpvci5qb2luKCkrIn0iOiIifX1hLlNoYXBlPWN9KShycHx8KHJwPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vbWVtb3J5LXZpZXdlci9sb2dpY2FsLWJ1ZmZlci5qcwp2YXIgc3A7KGZ1bmN0aW9uKGEpe2NsYXNzIGN7Y29uc3RydWN0b3IoZCl7dGhpcy5pbnN0cnVjdGlvbk5hbWU9dGhpcy5jb21wdXRhdGlvbk5hbWU9IiI7dGhpcy5zaGFwZUluZGV4PVtdO3RoaXMuaWQ9cGFyc2VJbnQoZC5pZCwxMCk7dGhpcy5zaXplPXBhcnNlSW50KGQuc2l6ZSwxMCk7dGhpcy5jb2xvcj1wYXJzZUludChkLmNvbG9yLDEwKTt0aGlzLmluaXRCdWZmZXJMb2NhdGlvbl8oZC5kZWZpbmVkQXQpfWluaXRCdWZmZXJMb2NhdGlvbl8oZCl7ZCYmKHRoaXMuY29tcHV0YXRpb25OYW1lPWQuY29tcHV0YXRpb25OYW1lLHRoaXMuaW5zdHJ1Y3Rpb25OYW1lPWQuaW5zdHJ1Y3Rpb25OYW1lLHRoaXMuc2hhcGVJbmRleD1kLnNoYXBlSW5kZXgubWFwKGY9PnBhcnNlSW50KGYsMTApKSl9fWEuTG9naWNhbEJ1ZmZlcj1jfSkoc3B8fChzcD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL21lbW9yeS12aWV3ZXIvYnVmZmVyLWFsbG9jYXRpb24uanMKdmFyIHRwOyhmdW5jdGlvbihhKXtjbGFzcyBje2NvbnN0cnVjdG9yKGQpe3RoaXMuaW5kZXg9cGFyc2VJbnQoZC5pbmRleCwxMCk7dGhpcy5zaXplPXBhcnNlSW50KGQuc2l6ZSwxMCk7dGhpcy5pc1RocmVhZExvY2FsPWQuaXNUaHJlYWRMb2NhbHx8ITE7dGhpcy5hc3NpZ25lZD1kLmFzc2lnbmVkLm1hcChmPT5uZXcgdXAuQnVmZmVyQWxsb2NhdGlvbkFzc2lnbmVkKGYpKTt0aGlzLmdyb3VwTmFtZT10aGlzLmdldEdyb3VwTmFtZShkKX1nZXRHcm91cE5hbWUoZCl7cmV0dXJuIGQuaXNFbnRyeUNvbXB1dGF0aW9uUGFyYW1ldGVyPyJQYXJhbWV0ZXIiOmQubWF5YmVMaXZlT3V0PyJPdXRwdXQiOmQuaXNUaHJlYWRMb2NhbD8iVGhyZWFkLWxvY2FsIjoiVGVtcG9yYXJ5In19YS5CdWZmZXJBbGxvY2F0aW9uPWN9KSh0cHx8KHRwPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vbWVtb3J5LXZpZXdlci9idWZmZXItYWxsb2NhdGlvbi1hc3NpZ25lZC5qcwp2YXIgdXA7KGZ1bmN0aW9uKGEpe2NsYXNzIGN7Y29uc3RydWN0b3IoZCl7dGhpcy5sb2dpY2FsQnVmZmVySWQ9cGFyc2VJbnQoZC5sb2dpY2FsQnVmZmVySWQsMTApO3RoaXMub2Zmc2V0PXBhcnNlSW50KGQub2Zmc2V0LDEwKTt0aGlzLnNpemU9cGFyc2VJbnQoZC5zaXplLDEwKX19YS5CdWZmZXJBbGxvY2F0aW9uQXNzaWduZWQ9Y30pKHVwfHwodXA9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9tZW1vcnktdmlld2VyL2hsby1pbnN0cnVjdGlvbi5qcwp2YXIgdnA7KGZ1bmN0aW9uKGEpe2NsYXNzIGN7Y29uc3RydWN0b3IoZCl7dGhpcy5uYW1lPWQubmFtZT9kLm5hbWU6IiI7dGhpcy5vcGNvZGU9ZC5vcGNvZGU/ZC5vcGNvZGU6IiI7dGhpcy5zaGFwZT1kLnNoYXBlP25ldyBycC5TaGFwZShkLnNoYXBlKTpudWxsO2QubWV0YWRhdGEmJih0aGlzLnRmT3BOYW1lPWQubWV0YWRhdGEub3BOYW1lP2QubWV0YWRhdGEub3BOYW1lOiIiKX19YS5IbG9JbnN0cnVjdGlvbj1jfSkodnB8fCh2cD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL21lbW9yeS12aWV3ZXIvbWVtb3J5LXVzYWdlLmpzCnZhciB3cDsKKGZ1bmN0aW9uKGEpe2NsYXNzIGN7Y29uc3RydWN0b3IoZCl7dGhpcy5idWZmZXJzXz1bXTt0aGlzLmlkVG9CdWZmZXJfPXt9O3RoaXMuaWRUb0J1ZmZlckFsbG9jYXRpb25fPXt9O3RoaXMubmFtZVRvSGxvXz17fTt0aGlzLnVucGFkZGVkUGVha0hlYXBTaXplQnl0ZXM9dGhpcy5wZWFrSGVhcFNpemVCeXRlcz10aGlzLnJlc3RfPXRoaXMubkNvbG9yXz0wO3RoaXMucGVha0xvZ2ljYWxCdWZmZXJzPVtdO3RoaXMuaW5kZWZpbml0ZU1lbW9yeVVzYWdlQnl0ZXM9dGhpcy5wZWFrSGVhcFNpemVQb3NpdGlvbj0wO3RoaXMuaGVhcFNpemVzPVtdO3RoaXMudW5wYWRkZWRIZWFwU2l6ZXM9W107dGhpcy5tYXhIZWFwPVtdO3RoaXMubWF4SGVhcEJ5U2l6ZT1bXTt0aGlzLmJ5U2l6ZVRvTWF4SGVhcD1bXTt0aGlzLm1heEhlYXBUb0J5U2l6ZT1bXTt0aGlzLmxvZ2ljYWxCdWZmZXJTcGFucz17fTt0aGlzLnVuU2VlbkxvZ2ljYWxCdWZmZXJzXz1uZXcgU2V0O3RoaXMuc2VlbkJ1ZmZlckFsbG9jYXRpb25zXz1uZXcgU2V0Owp0aGlzLnNtYWxsQnVmZmVyU2l6ZT0xNjM4NDt0aGlzLmluaXRIbG9JbnN0cnVjdGlvbnNfKGQuaGxvTW9kdWxlKTt0aGlzLmluaXRNZW1vcnlVc2FnZV8oZC5idWZmZXJBc3NpZ25tZW50KTt0aGlzLmluaXRNYXhIZWFwXygpfWluaXRIbG9JbnN0cnVjdGlvbnNfKGQpe2lmKGQpZm9yKGNvbnN0IGYgb2YgZC5jb21wdXRhdGlvbnMpZm9yKGNvbnN0IGcgb2YgZi5pbnN0cnVjdGlvbnMpZy5uYW1lJiYodGhpcy5uYW1lVG9IbG9fW2cubmFtZV09bmV3IHZwLkhsb0luc3RydWN0aW9uKGcpKTtlbHNlIGNvbnNvbGUud2FybigiTWlzc2luZyBobG9Nb2R1bGUsIHNraXBwaW5nIHVucGFkZGVkIGFsbG9jYXRpb24gc2l6ZSBhbmFseXNpcyIpfWluaXRNZW1vcnlVc2FnZV8oZCl7ZD8odGhpcy5pbml0QnVmZmVyc18oZCksdGhpcy5pbml0QWxsb2NhdGlvbnNfKGQpLChkPXRoaXMuZ2V0SGJtSGVhcFRyYWNlXyhkKSk/dGhpcy5maW5kUGVha01lbW9yeVVzYWdlXyhkKTpjb25zb2xlLmVycm9yKCJNaXNzaW5nIGhibSBoZWFwIHNpbXVsYXRvciB0cmFjZS4iKSk6CmNvbnNvbGUuZXJyb3IoIk5vIGJ1ZmZlciBhc3NpZ25tZW50IGluZm8iKX1nZXRIYm1IZWFwVHJhY2VfKGQpe2Zvcihjb25zdCBmIG9mIGQuaGVhcFNpbXVsYXRvclRyYWNlcylmb3IoY29uc3QgZyBvZiBmLmV2ZW50cylpZihnLmJ1ZmZlcklkJiYoZD10aGlzLmlkVG9CdWZmZXJfW2cuYnVmZmVySWRdKSl7aWYoMCE9ZC5jb2xvcilicmVhaztyZXR1cm4gZn1yZXR1cm4gbnVsbH1pbml0QnVmZmVyc18oZCl7Zm9yKGxldCBmIG9mIGQubG9naWNhbEJ1ZmZlcnMpZD1uZXcgc3AuTG9naWNhbEJ1ZmZlcihmKSx0aGlzLmJ1ZmZlcnNfLnB1c2goZCksdGhpcy5pZFRvQnVmZmVyX1tkLmlkXT1kLHRoaXMudW5TZWVuTG9naWNhbEJ1ZmZlcnNfLmFkZChkLmlkKX1pbml0QWxsb2NhdGlvbnNfKGQpe2Zvcihjb25zdCBmIG9mIGQuYnVmZmVyQWxsb2NhdGlvbnMpe2Q9bmV3IHRwLkJ1ZmZlckFsbG9jYXRpb24oZik7Zm9yKGNvbnN0IGcgb2YgZi5hc3NpZ25lZClnLmxvZ2ljYWxCdWZmZXJJZCYmKHRoaXMuaWRUb0J1ZmZlckFsbG9jYXRpb25fW2cubG9naWNhbEJ1ZmZlcklkXT0KZCl9fW5ld0hlYXBPYmplY3RfKGQsZixnLGwsayl7Y29uc3Qgbj1nP3FwLmJ5dGVzVG9NaUIoZy51bnBhZGRlZEhlYXBTaXplQnl0ZXMoKSk6MDtyZXR1cm57aW5zdHJ1Y3Rpb25OYW1lOmYuaW5zdHJ1Y3Rpb25OYW1lLGxvZ2ljYWxCdWZmZXJJZDpmLmlkLHVucGFkZGVkU2l6ZU1pQjpuLHRmT3BOYW1lOmwudGZPcE5hbWUsb3Bjb2RlOmwub3Bjb2RlLHNpemVNaUI6cXAuYnl0ZXNUb01pQihmLnNpemUpLGNvbG9yOmQsc2hhcGU6Zz9nLmh1bWFuU3RyaW5nV2l0aExheW91dCgpOiIiLGdyb3VwTmFtZTprfX1hZGRIZWFwT2JqZWN0XyhkLGYsZyl7aWYoZi5zaXplPD1kLnNtYWxsQnVmZmVyU2l6ZSlkLnJlc3RfKz1mLnNpemU7ZWxzZSBpZihmLmluc3RydWN0aW9uTmFtZSl7dmFyIGw9ZC5uYW1lVG9IbG9fW2YuaW5zdHJ1Y3Rpb25OYW1lXTtpZihsKXt2YXIgaz1sLnNoYXBlLnJlc29sdmVTaGFwZUluZGV4KGYuc2hhcGVJbmRleCk7ZC5tYXhIZWFwLnB1c2goZC5uZXdIZWFwT2JqZWN0XyhkLm5Db2xvcl8rKywKZixrLGwsZykpfX19aW5pdE1heEhlYXBfKCl7Zm9yKHZhciBkIG9mIHRoaXMucGVha0xvZ2ljYWxCdWZmZXJzKXtjb25zdCBmPXRoaXMuaWRUb0J1ZmZlckFsbG9jYXRpb25fW2RdO3RoaXMuYWRkSGVhcE9iamVjdF8odGhpcyx0aGlzLmlkVG9CdWZmZXJfW2RdLGY/Zi5ncm91cE5hbWU6IiIpfTAhPXRoaXMucmVzdF8mJihkPSJzbWFsbCAoXHgzYyIrdGhpcy5zbWFsbEJ1ZmZlclNpemUvMTAyNCsiIEtpQikiLHRoaXMubWF4SGVhcC5wdXNoKHtpbnN0cnVjdGlvbk5hbWU6ZCxzaXplTWlCOnFwLmJ5dGVzVG9NaUIodGhpcy5yZXN0XyksY29sb3I6MCxncm91cE5hbWU6ZH0pKTtkPXRoaXMubWF4SGVhcC5tYXAoZnVuY3Rpb24oZixnKXtyZXR1cm57aW5kOmcsdmFsOmZ9fSk7ZC5zb3J0KChmLGcpPT5nLnZhbC5zaXplTWlCLWYudmFsLnNpemVNaUIpO3RoaXMubWF4SGVhcEJ5U2l6ZT1kLm1hcChmdW5jdGlvbihmKXtyZXR1cm4gZi52YWx9KTt0aGlzLmJ5U2l6ZVRvTWF4SGVhcD1kLm1hcChmdW5jdGlvbihmKXtyZXR1cm4gZi5pbmR9KTsKdGhpcy5tYXhIZWFwVG9CeVNpemUubGVuZ3RoPXRoaXMubWF4SGVhcC5sZW5ndGg7Zm9yKGQ9MDtkPHRoaXMuYnlTaXplVG9NYXhIZWFwLmxlbmd0aDtkKyspdGhpcy5tYXhIZWFwVG9CeVNpemVbdGhpcy5ieVNpemVUb01heEhlYXBbZF1dPWR9ZmluZFBlYWtNZW1vcnlVc2FnZV8oZCl7bGV0IGY9W10sZz1bXTt2YXIgbD1bXTtsZXQgaz1bXSxuPTAscD0wLHE9MCxyPTAsdD0wO2Zvcihjb25zdCB6IG9mIGQuZXZlbnRzKXtmLnB1c2gocXAuYnl0ZXNUb01pQihuKSk7Zy5wdXNoKHFwLmJ5dGVzVG9NaUIocCkpO2NvbnN0IHg9cGFyc2VJbnQoei5idWZmZXJJZCwxMCk7ZD10aGlzLmlkVG9CdWZmZXJfW3hdO3RoaXMudW5TZWVuTG9naWNhbEJ1ZmZlcnNfLmRlbGV0ZSh4KTt2YXIgdj10aGlzLmlkVG9CdWZmZXJBbGxvY2F0aW9uX1t4XTt2JiZ0aGlzLnNlZW5CdWZmZXJBbGxvY2F0aW9uc18uYWRkKHYuaW5kZXgpO3Y9bnVsbDtkLmluc3RydWN0aW9uTmFtZSYmIiIhPWQuaW5zdHJ1Y3Rpb25OYW1lJiYKKHY9dGhpcy5uYW1lVG9IbG9fW2QuaW5zdHJ1Y3Rpb25OYW1lXS5zaGFwZS5yZXNvbHZlU2hhcGVJbmRleChkLnNoYXBlSW5kZXgpKTtzd2l0Y2goei5raW5kLnRvU3RyaW5nKCkpe2Nhc2UgIkFMTE9DIjpjYXNlICJTSEFSRV9XSVRIIjpsLnB1c2goeCk7bis9ZC5zaXplO3YmJihwKz12LnVucGFkZGVkSGVhcFNpemVCeXRlcygpKTt0aGlzLmxvZ2ljYWxCdWZmZXJTcGFuc1t4XT1bZi5sZW5ndGgsLTFdO24+cSYmKHE9bixyPXAsdD1mLmxlbmd0aCxrPWwuc2xpY2UoKSk7YnJlYWs7Y2FzZSAiRlJFRSI6bD1sLmZpbHRlcihDPT5DIT09eCk7bi09ZC5zaXplO3YmJihwLT12LnVucGFkZGVkSGVhcFNpemVCeXRlcygpKTt0aGlzLmxvZ2ljYWxCdWZmZXJTcGFuc1t4XVsxXT1mLmxlbmd0aDswPm4mJmNvbnNvbGUuZXJyb3IoImhlYXBfc2l6ZV9ieXRlcyBceDNjIDAiKTticmVhaztkZWZhdWx0OmNvbnNvbGUubG9nKCJFUlJPUjogdW5rbm93biBoZWFwIGV2ZW50IGtpbmQ6Iix6KX19Zi5wdXNoKHFwLmJ5dGVzVG9NaUIobikpOwpsPXRoaXMuZmluZEluZGVmaW5pdGVNZW1vcnlVc2FnZV8odGhpcy51blNlZW5Mb2dpY2FsQnVmZmVyc18pO3RoaXMucGVha0hlYXBTaXplQnl0ZXM9cStsO3RoaXMudW5wYWRkZWRQZWFrSGVhcFNpemVCeXRlcz1yK2w7dGhpcy5wZWFrTG9naWNhbEJ1ZmZlcnM9azt0aGlzLnBlYWtIZWFwU2l6ZVBvc2l0aW9uPXQ7Y29uc3QgeT1xcC5ieXRlc1RvTWlCKGwpO3RoaXMuaGVhcFNpemVzPWYubWFwKHo9PnoreSk7dGhpcy51bnBhZGRlZEhlYXBTaXplcz1nLm1hcCh6PT56K3kpfWZpbmRJbmRlZmluaXRlTWVtb3J5VXNhZ2VfKGQpe2xldCBmPTA7ZC5mb3JFYWNoKGc9Pntjb25zdCBsPXRoaXMuaWRUb0J1ZmZlckFsbG9jYXRpb25fW2ddO2wuaXNUaHJlYWRMb2NhbHx8dGhpcy5zZWVuQnVmZmVyQWxsb2NhdGlvbnNfLmhhcyhsLmluZGV4KXx8KHRoaXMuc2VlbkJ1ZmZlckFsbG9jYXRpb25zXy5hZGQobC5pbmRleCksZis9bC5zaXplLHRoaXMuYWRkSGVhcE9iamVjdF8odGhpcyx0aGlzLmlkVG9CdWZmZXJfW2ddLApsLmdyb3VwTmFtZSkpfSk7cmV0dXJuIHRoaXMuaW5kZWZpbml0ZU1lbW9yeVVzYWdlQnl0ZXM9Zn19YS5NZW1vcnlVc2FnZT1jfSkod3B8fCh3cD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL21lbW9yeS12aWV3ZXIvbXYtbGluZS1jaGFydC5qcwp2YXIgeHA7CihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJtdi1saW5lLWNoYXJ0Iixwcm9wZXJ0aWVzOntkYXRhOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9kYXRhQ2hhbmdlZCJ9LGFjdGl2ZTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLG9ic2VydmVyOiJfcmVuZGVyU3BhbnMifSxidWZmZXJTaXplczp7dHlwZTpBcnJheSxub3RpZnk6ITB9LHVucGFkZGVkQnVmZmVyU2l6ZXM6e3R5cGU6QXJyYXksbm90aWZ5OiEwfSxtYXhIZWFwOnt0eXBlOkFycmF5LG5vdGlmeTohMH0sbWF4SGVhcEJ5U2l6ZTp7dHlwZTpBcnJheSxub3RpZnk6ITB9LHNwYW5QbG90Ont0eXBlOk9iamVjdCxub3RpZnk6ITB9LGNvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sX3NlbGVjdGVkRW50aXR5SW5TcmNDaGFydDp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLG9ic2VydmVyOiJfc2VsZWN0ZWRFbnRpdHlDaGFuZ2VkIn0sX3NlbGVjdGVkRW50aXR5SW5Ec3RDaGFydDp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLApvYnNlcnZlcjoiX3NlbGVjdGVkRW50aXR5Q2hhbmdlZCJ9LF9zeW1ib2xUb0V2ZW50Q2FsbGJhY2s6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgTWFwfX0sX21ha2VDaGFydERhdGFzZXQoKXtpZih0aGlzLmRhdGEpe3RoaXMuYnVmZmVyU2l6ZXM9dGhpcy5kYXRhLmhlYXBTaXplcy5tYXAoKGQsZik9PltmLGRdKTt0aGlzLnVucGFkZGVkQnVmZmVyU2l6ZXM9dGhpcy5kYXRhLnVucGFkZGVkSGVhcFNpemVzLm1hcCgoZCxmKT0+W2YsZF0pO3ZhciBhPXRoaXMuZGF0YS5tYXhIZWFwO3RoaXMuZGF0YS5tYXhIZWFwLnJlZHVjZShmdW5jdGlvbihkLGYsZyl7YVtnXS5vZmZzZXQ9ZDtyZXR1cm4gZCtmLnNpemVNaUJ9LDApO3RoaXMubWF4SGVhcD1hO3ZhciBjPXRoaXMuZGF0YS5tYXhIZWFwQnlTaXplO3RoaXMuZGF0YS5tYXhIZWFwQnlTaXplLnJlZHVjZShmdW5jdGlvbihkLGYsZyl7Y1tnXS5vZmZzZXRCeVNpemU9ZDtyZXR1cm4gZCtmLnNpemVNaUJ9LDApO3RoaXMubWF4SGVhcEJ5U2l6ZT0KY319LF9kcmF3UHJvZ3JhbU9yZGVyKCl7aWYodGhpcy5kYXRhKXt2YXIgYT1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXIsYz1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXIsZD1uZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyhhLCJib3R0b20iKSxmPW5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKGMsImxlZnQiKSxnPW5ldyBQbG90dGFibGUuUGxvdHMuTGluZTtnLmFkZERhdGFzZXQobmV3IFBsb3R0YWJsZS5EYXRhc2V0KHRoaXMuYnVmZmVyU2l6ZXMpKTtnLngoZnVuY3Rpb24odil7cmV0dXJuIHZbMF19LGEpLnkoZnVuY3Rpb24odil7cmV0dXJuIHZbMV19LGMpLmF0dHIoInN0cm9rZSIsInJlZCIpO3ZhciBsPW5ldyBQbG90dGFibGUuUGxvdHMuTGluZTtsLmFkZERhdGFzZXQobmV3IFBsb3R0YWJsZS5EYXRhc2V0KHRoaXMudW5wYWRkZWRCdWZmZXJTaXplcykpO2wueChmdW5jdGlvbih2KXtyZXR1cm4gdlswXX0sYSkueShmdW5jdGlvbih2KXtyZXR1cm4gdlsxXX0sYykuYXR0cigic3Ryb2tlIiwKImdyZXkiKTt2YXIgaz1uZXcgUGxvdHRhYmxlLlBsb3RzLlJlY3RhbmdsZSxuPXRoaXMuYnVmZmVyU2l6ZXMubGVuZ3RoLzQwO2suYWRkRGF0YXNldChuZXcgUGxvdHRhYmxlLkRhdGFzZXQoW3RoaXMuYnVmZmVyU2l6ZXNbdGhpcy5kYXRhLnBlYWtIZWFwU2l6ZVBvc2l0aW9uXV0pKTtrLngoZnVuY3Rpb24odil7cmV0dXJuIHZbMF0tbi8yfSxhKS55KGZ1bmN0aW9uKCl7cmV0dXJuIDB9LGMpLngyKGZ1bmN0aW9uKHYpe3JldHVybiB2WzBdK24vMn0pLnkyKGZ1bmN0aW9uKHYpe3JldHVybiB2WzFdfSkuYXR0cigiZmlsbCIsInJlZCIpLmF0dHIoIm9wYWNpdHkiLC4zKTt2YXIgcD10aGlzLmNvbG9yU2NhbGUscT1uZXcgUGxvdHRhYmxlLlBsb3RzLlJlY3RhbmdsZSxyPXRoaXMuZGF0YS5sb2dpY2FsQnVmZmVyU3BhbnMsdD10aGlzLm1heEhlYXAubWFwKHY9Pntjb25zdCB5PXJbdi5sb2dpY2FsQnVmZmVySWRdO3JldHVybiB5P3tpZDp2LmxvZ2ljYWxCdWZmZXJJZCxzcGFuOnksc2l6ZTp2LnNpemVNaUIsCmNvbG9yOnYuY29sb3J9Om51bGx9KTt0PXQuZmlsdGVyKHY9Pm51bGwhPT12KTtxLmFkZERhdGFzZXQobmV3IFBsb3R0YWJsZS5EYXRhc2V0KHQpKTtxLngoZnVuY3Rpb24odil7cmV0dXJuIHYuc3BhblswXX0sYSkueShmdW5jdGlvbigpe3JldHVybiAwfSxjKS54MihmdW5jdGlvbih2KXtyZXR1cm4gdi5zcGFuWzFdfSkueTIoZnVuY3Rpb24odil7cmV0dXJuIHYuc2l6ZX0pLmF0dHIoImZpbGwiLGZ1bmN0aW9uKHYpe3JldHVybih2LmNvbG9yJTEwKS50b1N0cmluZygpfSxwKS5hdHRyKCJmaWxsLW9wYWNpdHkiLDApO3RoaXMuc3BhblBsb3Q9cTtwPW5ldyBQbG90dGFibGUuU2NhbGVzLkNvbG9yO3AucmFuZ2UoWyJyZWQiLCJncmV5Il0pO3AuZG9tYWluKFsiU2l6ZXMiLCJVbnBhZGRlZCBTaXplcyJdKTtwPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5MZWdlbmQocCk7cC5tYXhFbnRyaWVzUGVyUm93KDIpO2E9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyaWRsaW5lcyhhLGMpOwpnPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5Hcm91cChbayxnLGwsYSxxXSk7ZD1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuVGFibGUoW1tudWxsLHBdLFtmLGddLFtudWxsLGRdXSk7Zj1kMy5zZWxlY3QodGhpcy4kLmNoYXJ0ZGl2KTtmLnNlbGVjdEFsbCgiLmNvbXBvbmVudCIpLnJlbW92ZSgpO2QucmVuZGVyVG8oZil9fSxfZHJhd01heEhlYXAoKXtsZXQgYT1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXIsYz1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXI7bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWMoYywidG9wIik7bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWMoYSwibGVmdCIpO2xldCBkPXRoaXMuY29sb3JTY2FsZTtkMy5zZWxlY3QodGhpcy4kLm1heGhlYXBjaGFydCkuc2VsZWN0QWxsKCIuY29tcG9uZW50IikucmVtb3ZlKCk7ZDMuc2VsZWN0KHRoaXMuJC5tYXhoZWFwc2l6ZWNoYXJ0KS5zZWxlY3RBbGwoIi5jb21wb25lbnQiKS5yZW1vdmUoKTt0aGlzLl9tYXhIZWFwQ2hhcnRNb3VzZU1vdmVLZXkmJgoodGhpcy5fdW5saXN0ZW4odGhpcy5fbWF4SGVhcENoYXJ0TW91c2VNb3ZlS2V5KSx0aGlzLl9tYXhIZWFwQ2hhcnRNb3VzZU1vdmVLZXk9bnVsbCk7dGhpcy5fbWF4SGVhcFNpemVDaGFydE1vdXNlTW92ZUtleSYmKHRoaXMuX3VubGlzdGVuKHRoaXMuX21heEhlYXBTaXplQ2hhcnRNb3VzZU1vdmVLZXkpLHRoaXMuX21heEhlYXBTaXplQ2hhcnRNb3VzZU1vdmVLZXk9bnVsbCk7bGV0IGY9bmV3IFBsb3R0YWJsZS5QbG90cy5SZWN0YW5nbGU7Zi5hZGREYXRhc2V0KG5ldyBQbG90dGFibGUuRGF0YXNldCh0aGlzLm1heEhlYXApKS54KGZ1bmN0aW9uKGwpe3JldHVybiBsLm9mZnNldH0sYykueShmdW5jdGlvbigpe3JldHVybiAwfSxhKS54MihmdW5jdGlvbihsKXtyZXR1cm4gbC5vZmZzZXQrbC5zaXplTWlCfSkueTIoZnVuY3Rpb24oKXtyZXR1cm4gMTJ9KS5hdHRyKCJmaWxsIixmdW5jdGlvbihsKXtyZXR1cm4obC5jb2xvciUxMCkudG9TdHJpbmcoKX0sZCkuYXR0cigib3BhY2l0eSIsCiIwLjYiKS5yZW5kZXJUbyhkMy5zZWxlY3QodGhpcy4kLm1heGhlYXBjaGFydCkpO2xldCBnPW5ldyBQbG90dGFibGUuUGxvdHMuUmVjdGFuZ2xlO2cuYWRkRGF0YXNldChuZXcgUGxvdHRhYmxlLkRhdGFzZXQodGhpcy5tYXhIZWFwQnlTaXplKSkueChmdW5jdGlvbihsKXtyZXR1cm4gbC5vZmZzZXRCeVNpemV9LGMpLnkoZnVuY3Rpb24oKXtyZXR1cm4gMH0sYSkueDIoZnVuY3Rpb24obCl7cmV0dXJuIGwub2Zmc2V0QnlTaXplK2wuc2l6ZU1pQn0pLnkyKGZ1bmN0aW9uKCl7cmV0dXJuIDEyfSkuYXR0cigiZmlsbCIsZnVuY3Rpb24obCl7cmV0dXJuKGwuY29sb3IlMTApLnRvU3RyaW5nKCl9LGQpLmF0dHIoIm9wYWNpdHkiLCIwLjYiKS5yZW5kZXJUbyhkMy5zZWxlY3QodGhpcy4kLm1heGhlYXBzaXplY2hhcnQpKTt0aGlzLl9tYXhIZWFwQ2hhcnRNb3VzZU1vdmVLZXk9dGhpcy5fbGlzdGVuKHRoaXMuJC5tYXhoZWFwY2hhcnQsIm1vdXNlbW92ZSIsbD0+e3RoaXMuX29uSG92ZXJJbnRlcmFjdGlvbihsLApmLGcsdGhpcy5kYXRhLm1heEhlYXBUb0J5U2l6ZSl9LHtwYXNzaXZlOiEwfSk7dGhpcy5fbWF4SGVhcFNpemVDaGFydE1vdXNlTW92ZUtleT10aGlzLl9saXN0ZW4odGhpcy4kLm1heGhlYXBzaXplY2hhcnQsIm1vdXNlbW92ZSIsbD0+e3RoaXMuX29uSG92ZXJJbnRlcmFjdGlvbihsLGcsZix0aGlzLmRhdGEuYnlTaXplVG9NYXhIZWFwKX0se3Bhc3NpdmU6ITB9KX0sX2xpc3RlbihhLGMsZCxmPW51bGwpe2NvbnN0IGc9U3ltYm9sKCk7YS5hZGRFdmVudExpc3RlbmVyKGMsZCxmKTt0aGlzLl9zeW1ib2xUb0V2ZW50Q2FsbGJhY2suc2V0KGcse2V2ZW50TmFtZTpjLG5vZGU6YSxjYWxsYmFjazpkLG9wdGlvbnM6Zn0pO3JldHVybiBnfSxfdW5saXN0ZW4oYSl7Y29uc29sZS5hc3NlcnQodGhpcy5fc3ltYm9sVG9FdmVudENhbGxiYWNrLmhhcyhhKSwiQ2Fubm90IHVubGlzdGVuIGFuIHVua25vd24gZXZlbnQiKTthPXRoaXMuX3N5bWJvbFRvRXZlbnRDYWxsYmFjay5nZXQoYSk7Y29uc3Qge2NhbGxiYWNrOmMsCmV2ZW50TmFtZTpkLG5vZGU6ZixvcHRpb25zOmd9PWE7Zi5yZW1vdmVFdmVudExpc3RlbmVyKGQsYyxnKX0sX29uSG92ZXJJbnRlcmFjdGlvbihhLGMsZCxmKXt2YXIgZz1jLnJvb3RFbGVtZW50KCkubm9kZSgpOyh7bGVmdDpnfT1nLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtjb25zdCBsPWEuY2xpZW50WC1nOyhhPWMuZW50aXRpZXMoKS5maW5kKGs9Pntjb25zdCB7eDpuLHdpZHRoOnB9PWsuYm91bmRzO3JldHVybiBuPD1sJiZuK3A+PWx9KSk/KHRoaXMuYWN0aXZlPWEuZGF0dW0sdGhpcy5fc2VsZWN0ZWRFbnRpdHlJblNyY0NoYXJ0PWEsdGhpcy5fc2VsZWN0ZWRFbnRpdHlJbkRzdENoYXJ0PWQuZW50aXRpZXMoKVtmW2EuaW5kZXhdXSk6dGhpcy5hY3RpdmU9dGhpcy5fc2VsZWN0ZWRFbnRpdHlJbkRzdENoYXJ0PXRoaXMuX3NlbGVjdGVkRW50aXR5SW5TcmNDaGFydD1udWxsfSxfc2VsZWN0ZWRFbnRpdHlDaGFuZ2VkKGEsYyl7YyYmYy5zZWxlY3Rpb24uYXR0cigib3BhY2l0eSIsCiIwLjYiKTthJiZhLnNlbGVjdGlvbi5hdHRyKCJvcGFjaXR5IiwiMS4wIil9LF9yZW5kZXJTcGFucyhhKXt0aGlzLnNwYW5QbG90JiYodGhpcy5zcGFuUGxvdC5zZWxlY3Rpb25zKCkuYXR0cigiZmlsbC1vcGFjaXR5IiwiMCIpLGEmJnRoaXMuc3BhblBsb3QuZW50aXRpZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2Muc2VsZWN0aW9uLmF0dHIoImZpbGwtb3BhY2l0eSIsYy5kYXR1bS5pZD09PWEubG9naWNhbEJ1ZmZlcklkPzE6MCl9KSl9LF9yZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLmRhdGEmJih0aGlzLmNvbG9yU2NhbGU9bmV3IFBsb3R0YWJsZS5TY2FsZXMuQ29sb3IoIkNhdGVnb3J5MTAiKSx0aGlzLl9tYWtlQ2hhcnREYXRhc2V0KCksdGhpcy5fZHJhd1Byb2dyYW1PcmRlcigpLHRoaXMuX2RyYXdNYXhIZWFwKCkpfSxfZGF0YUNoYW5nZWQoYSl7YSYmdGhpcy5fcmVkcmF3KCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVkcmF3KCl9fSl9KSh4cHx8KHhwPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vbWVtb3J5LXZpZXdlci9idWZmZXItZGV0YWlscy5qcwp2YXIgeXA7CihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1tdi1iYXIiLHByb3BlcnRpZXM6e3ZhbHVlOnt0eXBlOk51bWJlcixub3RpZnk6ITAsb2JzZXJ2ZXI6Il91cGRhdGVWYWx1ZSJ9fSxfdXBkYXRlVmFsdWU6ZnVuY3Rpb24oYSl7Y29uc3QgYz1xcC5mbGFtZUNvbG9yKGEpO2E9cXAucGVyY2VudChhKTt0aGlzLnN0eWxlLmJhY2tncm91bmQ9YGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgJHtjfSAke2F9LCAjY2NjICR7YX0pYH19KTtQb2x5bWVyKHtpczoiYnVmZmVyLWRldGFpbHMiLHByb3BlcnRpZXM6e25vZGU6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxvYnNlcnZlcjoiX3VwZGF0ZUNhcmQifSxzaXplOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHVucGFkZGVkU2l6ZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxwYWRkaW5nOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LGV4cGFuc2lvbjp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSx1dGlsaXphdGlvbjp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfX0sCl91cGRhdGVDYXJkOmZ1bmN0aW9uKGEpe2lmKGEpe3RoaXMuc2l6ZT1hLnNpemVNaUIudG9GaXhlZCgxKTt2YXIgYz0icmdiKDE5MiwxOTIsMTkyKSI7YS51bnBhZGRlZFNpemVNaUImJih0aGlzLnVucGFkZGVkU2l6ZT1hLnVucGFkZGVkU2l6ZU1pQi50b0ZpeGVkKDEpLHRoaXMucGFkZGluZz0oYS5zaXplTWlCLWEudW5wYWRkZWRTaXplTWlCKS50b0ZpeGVkKDEpLHRoaXMudXRpbGl6YXRpb249YS51bnBhZGRlZFNpemVNaUIvYS5zaXplTWlCLHRoaXMuZXhwYW5zaW9uPSgxL3RoaXMudXRpbGl6YXRpb24pLnRvRml4ZWQoMSksYz1xcC5mbGFtZUNvbG9yKHRoaXMudXRpbGl6YXRpb24sLjcpKTt0aGlzLiQuY2FyZC51cGRhdGVTdHlsZXMoeyItLXBhcGVyLWNhcmQtYmFja2dyb3VuZC1jb2xvciI6Y30pO3RoaXMuJC5zdWJoZWFkZXIuc3R5bGUuYmFja2dyb3VuZENvbG9yPWN9fSxfc3ViaGVhZGVyOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLm9wY29kZT9hLm9wY29kZSsiIG9wZXJhdGlvbiI6CiIifX0pfSkoeXB8fCh5cD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL21lbW9yeS12aWV3ZXIvbWVtb3J5LXZpZXdlci1kYXNoYm9hcmQuanMKdmFyIHpwOwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoibWVtb3J5LXZpZXdlci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19kYXRhOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsb2JzZXJ2ZXI6ImRhdGFDaGFuZ2VkXyJ9LGhsb01vZHVsZV86e3R5cGU6T2JqZWN0fSxtb2R1bGVOYW1lXzp7dHlwZTpTdHJpbmd9LHBlYWtIZWFwU2l6ZU1pQl86e3R5cGU6U3RyaW5nfSx1bnBhZGRlZFBlYWtIZWFwU2l6ZU1pQl86e3R5cGU6U3RyaW5nfSx1c2FnZTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxhY3RpdmU6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTpudWxsfX0sZGF0YUNoYW5nZWRfKGEpe2EmJmEuaGxvTW9kdWxlJiZhLmJ1ZmZlckFzc2lnbm1lbnQmJih0aGlzLmhsb01vZHVsZV89YS5obG9Nb2R1bGUsdGhpcy5tb2R1bGVOYW1lXz10aGlzLmhsb01vZHVsZV8ubmFtZT90aGlzLmhsb01vZHVsZV8ubmFtZToiIix0aGlzLnVzYWdlPW5ldyB3cC5NZW1vcnlVc2FnZShhKSx0aGlzLnBlYWtIZWFwU2l6ZU1pQl89cXAuYnl0ZXNUb01pQih0aGlzLnVzYWdlLnBlYWtIZWFwU2l6ZUJ5dGVzKS50b0ZpeGVkKDIpLAp0aGlzLnVucGFkZGVkUGVha0hlYXBTaXplTWlCXz1xcC5ieXRlc1RvTWlCKHRoaXMudXNhZ2UudW5wYWRkZWRQZWFrSGVhcFNpemVCeXRlcykudG9GaXhlZCgyKSl9fSl9KSh6cHx8KHpwPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcG9kLXZpZXdlci9wcm90by5qcwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BvZC12aWV3ZXIvZGV0YWlscy1jYXJkLmpzCnZhciBBcDsKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6ImRldGFpbHMtY2FyZCIscHJvcGVydGllczp7bm9kZXM6e3R5cGU6QXJyYXl9LF9uYW1lOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVOYW1lKG5vZGVzKSJ9LHN0ZXBCcmVha2Rvd25MYXllcnM6e3R5cGU6QXJyYXksdmFsdWU6KCk9Plt7a2V5OiJoaWdoRmxvcHNDb21wdXRlVXMiLGxhYmVsOiJIaWdoIGZsb3BzIGNvbXB1dGUifSx7a2V5OiJsb3dGbG9wc0NvbXB1dGVVcyIsbGFiZWw6IkxvdyBmbG9wcyBjb21wdXRlIn0se2tleToiaG9zdEluZmVlZER1cmF0aW9uVXMiLGxhYmVsOiJJbmZlZWQifSx7a2V5OiJob3N0T3V0ZmVlZER1cmF0aW9uVXMiLGxhYmVsOiJPdXRmZWVkIn0se2tleToiYWxsUmVkdWNlQ29tcHV0ZUR1cmF0aW9uVXMiLGxhYmVsOiJBbGxSZWR1Y2UgY29tcHV0ZSJ9LHtrZXk6ImFsbFJlZHVjZVN5bmNEdXJhdGlvblVzIixsYWJlbDoiQWxsUmVkdWNlIHN5bmMifSx7a2V5OiJzZW5kRHVyYXRpb25VcyIsbGFiZWw6IlNlbmQifSwKe2tleToicmVjdkR1cmF0aW9uVXMiLGxhYmVsOiJSZWN2In1dfX0sX2lzQWxsUmVkdWNlKGEpe3JldHVybiB2b2lkIDAhPWEucmVwbGljYUdyb3Vwc30sX2lzQ2hhbm5lbChhKXtyZXR1cm4gdm9pZCAwIT1hLmNoYW5uZWxJZH0sX2lzU3RlcChhKXtyZXR1cm4gdm9pZCAwIT1hLmhvc3ROYW1lfSxfaGFzUmVwbGljYUdyb3VwcyhhKXtyZXR1cm4gYS5yZXBsaWNhR3JvdXBzJiYwPGEucmVwbGljYUdyb3Vwcy5sZW5ndGh9LF9jb21wdXRlTmFtZTpmdW5jdGlvbihhKXtpZihhJiYwIT1hLmxlbmd0aCl7YT1hWzBdO2lmKHRoaXMuX2lzQ2hhbm5lbChhKSlyZXR1cm4iQ2hhbm5lbCAjICIrYS5jaGFubmVsSWQ7aWYodGhpcy5faXNBbGxSZWR1Y2UoYSkpcmV0dXJuIGEubmFtZTtpZih0aGlzLl9pc1N0ZXAoYSkpcmV0dXJuIlN0ZXAgYnJlYWtkb3duIG9mIGNoaXAgIithLmNoaXBJZCsiLCBjb3JlICIrYS5ub2RlSWR9fSxfYnl0ZXNUb01pQjpmdW5jdGlvbihhKXtyZXR1cm4gYS8xMDQ4NTc2fSwKX3NpemVNaUI6ZnVuY3Rpb24oYSl7aWYoYSlyZXR1cm4gdGhpcy5fZm9ybWF0KHRoaXMuX2J5dGVzVG9NaUIoYSkpfSxfYmFuZHdpZHRoOmZ1bmN0aW9uKGEsYyl7aWYoYSYmYylyZXR1cm4gdGhpcy5fZm9ybWF0KGEvYy8xMDczLjc0KX0sX2NoaXBJZDpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5mbG9vcihhLzIpfSxfbm9kZUlkOmZ1bmN0aW9uKGEpe3JldHVybiBhJjF9LF9mb3JtYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6YS50b0ZpeGVkKDIpfSxfZ2V0U3RlcEJyZWFrZG93blZhbHVlOmZ1bmN0aW9uKGEsYyl7aWYoYyYmYSlyZXR1cm4gdGhpcy5fZm9ybWF0KGFbY10/YVtjXTowKX0sX2dldFN0ZXBCcmVha2Rvd25QY3Q6ZnVuY3Rpb24oYSxjKXtpZihjJiZhJiZhLnRvdGFsRHVyYXRpb25VcyYmYVtjXSlyZXR1cm4oYVtjXS9hLnRvdGFsRHVyYXRpb25VcyoxMDApLnRvRml4ZWQoMikrIiUifX0pfSkoQXB8fChBcD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BvZC12aWV3ZXIvc3RhY2stYmFyLWNoYXJ0LmpzCnZhciBCcDsKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InN0YWNrLWJhci1jaGFydCIscHJvcGVydGllczp7ZGF0YTp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W10sb2JzZXJ2ZXI6Il9kYXRhQ2hhbmdlZCJ9LGFjdGl2ZUJhcjp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSx4RG9tYWluRnVuYzp7dHlwZTpPYmplY3R9LHN0YWNrTGF5ZXJzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXSxvYnNlcnZlcjoiX29uU3RhY2tMYXllcnNDaGFuZ2VkIn19LHN0YWNrQmFyQ2hhcnQ6ZnVuY3Rpb24oYSl7aWYoYS5sZW5ndGgmJnRoaXMuaXNBdHRhY2hlZCYmMCE9dGhpcy5zdGFja0xheWVycy5sZW5ndGgpe3ZhciBjPXRoaXMuc3RhY2tMYXllcnMubWFwKHA9PnAua2V5KSxkPXRoaXMuc3RhY2tMYXllcnMubWFwKHA9PnAubGFiZWwpLGY9NTAqYS5sZW5ndGgsZz1kMy5zY2FsZUJhbmQoKS5yYW5nZShbMCxmXSkucGFkZGluZyguNCksbD1kMy5zY2FsZUxpbmVhcigpLnJhbmdlKFsyNTAsMF0pLGs9ZDMuc2NhbGVPcmRpbmFsKGQzLnNjaGVtZUNhdGVnb3J5MTApLmRvbWFpbihbMCwxOV0pLApuPWQzLnNlbGVjdCh0aGlzLiQuY2hhcnQpLnNlbGVjdCgic3ZnIik7bi5lbXB0eSgpJiYobj1kMy5zZWxlY3QodGhpcy4kLmNoYXJ0KS5hcHBlbmQoInN2ZyIpLmF0dHIoIndpZHRoIixNYXRoLm1heCgxNjAwLGYrMTAwKzIwKSkuYXR0cigiaGVpZ2h0IiwzMDApLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgxMDAsMjApIiksbi5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInggYXhpcyIpLnN0eWxlKCJmb250LXNpemUiLDE0KS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwyNTUpIiksbi5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInkgYXhpcyIpLnN0eWxlKCJmb250LXNpemUiLDE0KS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwwKSIpKTtjPWQzLnN0YWNrKCkua2V5cyhjKS5vcmRlcihkMy5zdGFja09yZGVyTm9uZSkub2Zmc2V0KGQzLnN0YWNrT2Zmc2V0Tm9uZSkoYSk7Zy5kb21haW4oYS5tYXAodGhpcy54RG9tYWluRnVuYykpO2wuZG9tYWluKFswLApkMy5tYXgoY1tjLmxlbmd0aC0xXSxwPT5wWzBdK3BbMV0pXSkubmljZSgpO3RoaXMuZHJhd0xheWVycyhuLGMsZyxsLGspO3RoaXMuZHJhd0F4ZXMobixnLGwsMjUwKTthPWQzLnNlbGVjdCh0aGlzLiQuY2hhcnQpLnNlbGVjdCgiLmxlZ2VuZCIpO2EuZW1wdHkoKSYmKGE9bi5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxlZ2VuZCIpLmF0dHIoImZvbnQtZmFtaWx5Iiwic2Fucy1zZXJpZiIpLmF0dHIoImZvbnQtc2l6ZSIsMTQpLmF0dHIoInRleHQtYW5jaG9yIiwic3RhcnQiKSk7dGhpcy5kcmF3TGVnZW5kKGEsZCxrKX19LGRyYXdMYXllcnM6ZnVuY3Rpb24oYSxjLGQsZixnKXtsZXQgbD10aGlzO2E9YS5zZWxlY3RBbGwoIi5sYXllciIpLmRhdGEoYyk7Yz1hLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsYXllciIpLm1lcmdlKGEpLnN0eWxlKCJmaWxsIiwoayxuKT0+ZyhuKSkuc2VsZWN0QWxsKCJyZWN0IikuZGF0YShrPT5rKTtjLmVudGVyKCkuYXBwZW5kKCJyZWN0IikubWVyZ2UoYykuYXR0cigid2lkdGgiLApkLmJhbmR3aWR0aCgpKS5hdHRyKCJ5IixrPT5mKGtbMV0pKS5hdHRyKCJoZWlnaHQiLGs9PmYoa1swXSktZihrWzFdKSkuYXR0cigieCIsaz0+ZChsLnhEb21haW5GdW5jKGsuZGF0YSkpKS5vbigibW91c2VvdmVyIixmdW5jdGlvbihrKXtkMy5zZWxlY3QodGhpcykuc3R5bGUoIm9wYWNpdHkiLC41KTtsLmFjdGl2ZUJhcj1rLmRhdGF9KS5vbigibW91c2VvdXQiLGZ1bmN0aW9uKCl7ZDMuc2VsZWN0KHRoaXMpLnN0eWxlKCJvcGFjaXR5IiwxKTtsLmFjdGl2ZUJhcj1udWxsfSkudHJhbnNpdGlvbigpLmR1cmF0aW9uKDFFMyk7YS5leGl0KCkucmVtb3ZlKCl9LGRyYXdBeGVzOmZ1bmN0aW9uKGEsYyxkKXthLnNlbGVjdCgiLnguYXhpcyIpLnRyYW5zaXRpb24oKS5kdXJhdGlvbigxRTMpLmNhbGwoZDMuYXhpc0JvdHRvbShjKSk7YS5zZWxlY3QoIi55LmF4aXMiKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oMUUzKS5jYWxsKGQzLmF4aXNMZWZ0KGQpKX0sZHJhd0xlZ2VuZDpmdW5jdGlvbihhLApjLGQpe2E9YS5zZWxlY3RBbGwoImciKS5kYXRhKGMuc2xpY2UoKSk7YS5leGl0KCkucmVtb3ZlKCk7Yz1hLmVudGVyKCkuYXBwZW5kKCJnIik7Yy5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwyMDApLmF0dHIoIndpZHRoIiwxOSkuYXR0cigiaGVpZ2h0IiwxOSk7Yy5hcHBlbmQoInRleHQiKS5hdHRyKCJ4IiwyMjQpLmF0dHIoInkiLDkuNSkuYXR0cigiZHkiLCIwLjMyZW0iKTthPWMubWVyZ2UoYSk7YS5hdHRyKCJ0cmFuc2Zvcm0iLChmLGcpPT5gdHJhbnNsYXRlKCR7MTUwKmctNzUwKk1hdGguZmxvb3IoZy81KX0sICR7MzAqTWF0aC5mbG9vcihnLzUpfSlgKTthLnNlbGVjdCgicmVjdCIpLmF0dHIoImZpbGwiLChmLGcpPT5kKGcpKTthLnNlbGVjdCgidGV4dCIpLnRleHQoZj0+Zil9LHJlZHJhdzpmdW5jdGlvbihhKXthJiYwIT1hLmxlbmd0aCYmdGhpcy5zdGFja0JhckNoYXJ0KGEpfSxfb25TdGFja0xheWVyc0NoYW5nZWQ6ZnVuY3Rpb24oYSl7YSYmMCE9YS5sZW5ndGgmJnRoaXMucmVkcmF3KHRoaXMuZGF0YSl9LApfZGF0YUNoYW5nZWQ6ZnVuY3Rpb24oYSl7YSYmMCE9YS5sZW5ndGgmJnRoaXMucmVkcmF3KGEpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMucmVkcmF3KHRoaXMuZGF0YSl9fSl9KShCcHx8KEJwPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcG9kLXZpZXdlci90b3BvbG9neS1ncmFwaC5qcwp2YXIgQ3A7CihmdW5jdGlvbigpe2NvbnN0IGE9IiNmZmZmZDkgI2VkZjhiMSAjYzdlOWI0ICM3ZmNkYmIgIzQxYjZjNCAjMWQ5MWMwICMyMjVlYTggIzI1MzQ5NCAjMDgxZDU4Ii5zcGxpdCgiICIpLGM9ZDMuc2NhbGVRdWFudGlsZSgpLmRvbWFpbihbMCwxXSkucmFuZ2UoYSk7UG9seW1lcih7aXM6InRvcG9sb2d5LWdyYXBoIixwcm9wZXJ0aWVzOntkYXRhOnt0eXBlOk9iamVjdH0scnVuRW52aXJvbm1lbnQ6e3R5cGU6T2JqZWN0fSxtZXRyaWNzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sYWN0aXZlQmFyOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX2FjdGl2ZUJhckNoYW5nZWQifSxzZWxlY3RlZE1ldHJpY0lkeDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxvYnNlcnZlcjoiX3NlbGVjdGVkTWV0cmljSWR4Q2hhbmdlZCJ9LF90b3BvRGF0YTp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlVG9wb0RhdGEoZGF0YSwgcnVuRW52aXJvbm1lbnQsIG1ldHJpY3MpIn0sX3hEaW1lbnNpb246e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZVhEaW1lbnNpb24ocnVuRW52aXJvbm1lbnQpIn0sCl95RGltZW5zaW9uOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVZRGltZW5zaW9uKHJ1bkVudmlyb25tZW50KSJ9LF90b3RhbENvcmVDb3VudDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlVG90YWxDb3JlQ291bnQoX3hEaW1lbnNpb24sIF95RGltZW5zaW9uKSJ9LF90cHVUeXBlOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVUcHVUeXBlKHJ1bkVudmlyb25tZW50KSJ9LF9ob3N0WFN0cmlkZTp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlSG9zdFhTdHJpZGUoX3RwdVR5cGUpIn0sX2hvc3RHcmlkV2lkdGg6e3R5cGU6TnVtYmVyfSxfaG9zdEdyaWRIZWlnaHQ6e3R5cGU6TnVtYmVyfSxfbm9kZUdyaWRIZWlnaHQ6e3R5cGU6TnVtYmVyfSxfbm9kZUdyaWRXaWR0aDp7dHlwZTpOdW1iZXJ9LF9nU1ZHOnt0eXBlOk9iamVjdH19LG9ic2VydmVyczpbImRyYXdUb3BvbG9neShfdG9wb0RhdGEsIHJ1bkVudmlyb25tZW50KSJdLF9jb21wdXRlVG9wb0RhdGE6ZnVuY3Rpb24oZCwKZixnKXtpZihkJiZmJiZmLnRvcG9sb2d5JiZnKXt2YXIgbD1wYXJzZUludChmLnRvcG9sb2d5LnhEaW1lbnNpb24sMTApO3JldHVybiBPYmplY3Qua2V5cyhkLnBvZFN0YXRzUGVyQ29yZSkubWFwKGs9Pntjb25zdCBuPWQucG9kU3RhdHNQZXJDb3JlW2tdO2xldCBwPWcubWFwKHE9Pm5bcS5rZXldP25bcS5rZXldOjApO3JldHVybnt4ZGltOm4uY2hpcElkJWwseWRpbTpNYXRoLmZsb29yKG4uY2hpcElkL2wpLG5pZDpuLm5vZGVJZCxjaWQ6bi5jaGlwSWQscmlkOmQuY29yZUlkVG9SZXBsaWNhSWRNYXBba10saG9zdDpuLmhvc3ROYW1lLHZhbHVlczpwLHRvdGFsOm4udG90YWxEdXJhdGlvblVzfX0pfX0sX2NvbXB1dGVUcHVUeXBlOmZ1bmN0aW9uKGQpe2lmKGQpcmV0dXJuIGQudHB1VHlwZX0sX2NvbXB1dGVYRGltZW5zaW9uOmZ1bmN0aW9uKGQpe2lmKGQmJmQudG9wb2xvZ3kpcmV0dXJuIHBhcnNlSW50KGQudG9wb2xvZ3kueERpbWVuc2lvbiwxMCl9LF9jb21wdXRlWURpbWVuc2lvbjpmdW5jdGlvbihkKXtpZihkJiYKZC50b3BvbG9neSlyZXR1cm4gcGFyc2VJbnQoZC50b3BvbG9neS55RGltZW5zaW9uLDEwKX0sX2NvbXB1dGVUb3RhbENvcmVDb3VudDpmdW5jdGlvbihkLGYpe3JldHVybiBkKmYqMn0sX2NvbXB1dGVIb3N0WFN0cmlkZTpmdW5jdGlvbihkKXtyZXR1cm4iVFBVIHYzIj09ZD80OjJ9LHRvcG9sb2d5R3JhcGg6ZnVuY3Rpb24oZCl7dGhpcy5faG9zdEdyaWRXaWR0aD10aGlzLmdldEhvc3RHcmlkU2l6ZSh0aGlzLl9ob3N0WFN0cmlkZSk7dGhpcy5faG9zdEdyaWRIZWlnaHQ9dGhpcy5nZXRIb3N0R3JpZFNpemUoMik7dGhpcy5fbm9kZUdyaWRXaWR0aD0xNTt0aGlzLl9ub2RlR3JpZEhlaWdodD0zMDt2YXIgZj10aGlzLl94RGltZW5zaW9uL3RoaXMuX2hvc3RYU3RyaWRlO2NvbnN0IGc9dGhpcy5feURpbWVuc2lvbi8yLGw9QXJyYXkuZnJvbShBcnJheSh0aGlzLl94RGltZW5zaW9uKS5rZXlzKCkpLGs9QXJyYXkuZnJvbShBcnJheSh0aGlzLl95RGltZW5zaW9uKS5rZXlzKCkpO3RoaXMuX2dTVkd8fAoodGhpcy5fZ1NWRz1kMy5zZWxlY3QodGhpcy4kLnRwZ3JhcGgpLmFwcGVuZCgic3ZnIikuYXR0cigid2lkdGgiLDE2MjApLmF0dHIoImhlaWdodCIsZyp0aGlzLl9ob3N0R3JpZEhlaWdodCsxNTApLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgzMCw1MCkiKSx0aGlzLl9nU1ZHLmFwcGVuZCgic3ZnOmciKS5jbGFzc2VkKCJncmFwaCIsITApLHRoaXMuX2dTVkcuYXBwZW5kKCJzdmc6ZyIpLmNsYXNzZWQoImxpbmsiLCEwKSx0aGlzLl9nU1ZHLmFwcGVuZCgic3ZnOmRlZnMiKS5hcHBlbmQoInN2ZzptYXJrZXIiKS5hdHRyKCJpZCIsImFycm93IikuYXR0cigidmlld0JveCIsIjAgLTUgMTAgMTAiKS5hdHRyKCJtYXJrZXJXaWR0aCIsNSkuYXR0cigibWFya2VySGVpZ2h0Iiw1KS5hdHRyKCJvcmllbnQiLCJhdXRvIikuYXBwZW5kKCJzdmc6cGF0aCIpLnN0eWxlKCJzdHJva2UiLCJyZWQiKS5zdHlsZSgiZmlsbCIsInJlZCIpLmF0dHIoImQiLCJNMCwtNUwxMCwwTDAsNSIpKTsKbGV0IG49dGhpcy5fZ1NWRy5zZWxlY3QoIi5ncmFwaCIpO2Y9dGhpcy5jcmVhdGVIb3N0RGF0YShmLGcpO3RoaXMuZHJhd0hvc3RDYXJkcyhuLGYsdGhpcy5faG9zdEdyaWRXaWR0aCx0aGlzLl9ob3N0R3JpZEhlaWdodCk7dGhpcy5kcmF3Tm9kZUNhcmRzKG4sZCxjKTt0aGlzLmRyYXdMYWJlbHMobixsLGspO3RoaXMuZHJhd0xlZ2VuZChuLHRoaXMuX2hvc3RHcmlkSGVpZ2h0Kk1hdGguY2VpbCh0aGlzLl95RGltZW5zaW9uLzIpKzEwLGMpfSxnZXRIb3N0R3JpZFNpemUoZCl7cmV0dXJuIDMwKzEwKihkLTEpKzMwKmQrMTB9LGdldENoaXBYTG9jOmZ1bmN0aW9uKGQsZil7cmV0dXJuIGQqdGhpcy5faG9zdEdyaWRXaWR0aCsxNSs0MCpmfSxnZXRDaGlwWUxvYzpmdW5jdGlvbihkLGYpe3JldHVybiBkKnRoaXMuX2hvc3RHcmlkSGVpZ2h0KzE1KzQwKmZ9LGdldE5vZGVYTG9jOmZ1bmN0aW9uKGQsZixnKXtyZXR1cm4gdGhpcy5nZXRDaGlwWExvYyhkLGYpK2cqdGhpcy5fbm9kZUdyaWRXaWR0aH0sCmNyZWF0ZUhvc3REYXRhOmZ1bmN0aW9uKGQsZil7bGV0IGc9W107Zm9yKGxldCBsPTA7bDxkO2wrKylmb3IobGV0IGs9MDtrPGY7aysrKWcucHVzaCh7eGRpbTpsLHlkaW06a30pO3JldHVybiBnfSxkcmF3TGFiZWxzOmZ1bmN0aW9uKGQsZixnKXtmPWQuc2VsZWN0QWxsKCIueC1sYWJlbCIpLmRhdGEoZik7Zi5lbnRlcigpLmFwcGVuZCgidGV4dCIpLm1lcmdlKGYpLnRleHQobD0+bCkuYXR0cigieCIsKGwsayk9PnRoaXMuZ2V0Q2hpcFhMb2MoTWF0aC5mbG9vcihrL3RoaXMuX2hvc3RYU3RyaWRlKSxrJXRoaXMuX2hvc3RYU3RyaWRlKSkuYXR0cigieSIsMCkuc3R5bGUoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDE1LCAtNikiKS5hdHRyKCJjbGFzcyIsIngtbGFiZWwiKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oMUUzKTtmLmV4aXQoKS5yZW1vdmUoKTtkPWQuc2VsZWN0QWxsKCIueS1sYWJlbCIpLmRhdGEoZyk7ZC5lbnRlcigpLmFwcGVuZCgidGV4dCIpLm1lcmdlKGQpLnRleHQobD0+CmwpLmF0dHIoIngiLDApLmF0dHIoInkiLChsLGspPT50aGlzLmdldENoaXBZTG9jKE1hdGguZmxvb3Ioay8yKSxrJTIpKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoLTEyLDE1KSIpLmF0dHIoImNsYXNzIiwieS1sYWJlbCIpLnRyYW5zaXRpb24oKS5kdXJhdGlvbigxRTMpO2QuZXhpdCgpLnJlbW92ZSgpfSxkcmF3SG9zdENhcmRzOmZ1bmN0aW9uKGQsZixnLGwpe2Q9ZC5zZWxlY3RBbGwoIi5ob3N0IikuZGF0YShmKTtkLmVudGVyKCkuYXBwZW5kKCJyZWN0IikubWVyZ2UoZCkuYXR0cigieCIsaz0+ay54ZGltKmcpLmF0dHIoInkiLGs9PmsueWRpbSpsKS5hdHRyKCJyeCIsNCpnL2wpLmF0dHIoInJ5Iiw0KS5hdHRyKCJjbGFzcyIsImhvc3QgYm9yZGVyZWQiKS5hdHRyKCJ3aWR0aCIsZy0xMCkuYXR0cigiaGVpZ2h0IixsLTEwKS5hdHRyKCJib3JkZXIiLDEpLnN0eWxlKCJmaWxsIiwiRjBGMEYwIikuc3R5bGUoInN0cm9rZSIsCiJibGFjayIpLnN0eWxlKCJzdHJva2Utd2lkdGgiLDEpLnRyYW5zaXRpb24oKS5kdXJhdGlvbigxRTMpO2QuZXhpdCgpLnJlbW92ZSgpfSxkcmF3Tm9kZUNhcmRzOmZ1bmN0aW9uKGQsZixnKXtkPWQuc2VsZWN0QWxsKCIubm9kZSIpLmRhdGEoZik7bGV0IGw9dGhpcyxrPU1hdGgubWF4KHRoaXMuc2VsZWN0ZWRNZXRyaWNJZHgsMCk7ZC5lbnRlcigpLmFwcGVuZCgicmVjdCIpLm1lcmdlKGQpLmF0dHIoImlkIixuPT4icmlkIituLnJpZCkuYXR0cigieCIsbj0+dGhpcy5nZXROb2RlWExvYyhNYXRoLmZsb29yKG4ueGRpbS90aGlzLl9ob3N0WFN0cmlkZSksbi54ZGltJXRoaXMuX2hvc3RYU3RyaWRlLG4ubmlkKSkuYXR0cigieSIsbj0+dGhpcy5nZXRDaGlwWUxvYyhNYXRoLmZsb29yKG4ueWRpbS8yKSxuLnlkaW0lMikpLmF0dHIoInJ4IiwyKS5hdHRyKCJyeSIsNCkuYXR0cigiY2xhc3MiLCJub2RlIGJvcmRlcmVkIikuYXR0cigid2lkdGgiLHRoaXMuX25vZGVHcmlkV2lkdGgpLmF0dHIoImhlaWdodCIsCnRoaXMuX25vZGVHcmlkSGVpZ2h0KS5hdHRyKCJib3JkZXIiLDEpLnN0eWxlKCJzdHJva2UiLCJibGFjayIpLnN0eWxlKCJzdHJva2Utd2lkdGgiLDEpLnN0eWxlKCJmaWxsIixuPT5nKG4udmFsdWVzW2tdL24udG90YWwpKS5vbigibW91c2VvdmVyIixmdW5jdGlvbihuKXtkMy5zZWxlY3QodGhpcykuY2xhc3NlZCgiY2VsbC1ob3ZlciIsITApLnN0eWxlKCJvcGFjaXR5IiwuNSk7dmFyIHA9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCBxPWwuJC5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscj1wLngrcC53aWR0aCs1LXEueDtwPXAueS1xLnk7ZDMuc2VsZWN0KGwuJC50b29sdGlwKS5zdHlsZSgibGVmdCIscisicHgiKS5zdHlsZSgidG9wIixwKyJweCIpLnNlbGVjdCgiI3ZhbHVlIikudGV4dChsLl9nZXRUb29sVGlwVGV4dChuKSk7ZDMuc2VsZWN0KGwuJC50b29sdGlwKS5jbGFzc2VkKCJoaWRkZW4iLCExKX0pLm9uKCJtb3VzZW91dCIsZnVuY3Rpb24oKXtkMy5zZWxlY3QodGhpcykuY2xhc3NlZCgiY2VsbC1ob3ZlciIsCiExKS5zdHlsZSgib3BhY2l0eSIsMSk7ZDMuc2VsZWN0KGwuJC50b29sdGlwKS5jbGFzc2VkKCJoaWRkZW4iLCEwKX0pLnRyYW5zaXRpb24oKS5kdXJhdGlvbigxRTMpO2QuZXhpdCgpLnJlbW92ZSgpfSxkcmF3TGlua3M6ZnVuY3Rpb24oZCxmKXtmJiZmLmxlbmd0aCYmZCYmKGQ9ZC5zZWxlY3QoIi5saW5rIikuc2VsZWN0QWxsKCJwYXRoIikuZGF0YShmKSxkLmVudGVyKCkuYXBwZW5kKCJzdmc6cGF0aCIpLm1lcmdlKGQpLmF0dHIoInN0cm9rZS13aWR0aCIsMikuYXR0cigic3Ryb2tlIiwicmVkIikuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJtYXJrZXItZW5kIiwidXJsKCNhcnJvdykiKS5hdHRyKCJkIixnPT50aGlzLmxpbmtUb1BhdGgoZ1swXSxnWzFdKSksZC5leGl0KCkucmVtb3ZlKCkpfSxjb3JlSWRUb1BvczpmdW5jdGlvbihkKXt2YXIgZj1NYXRoLmZsb29yKGQvMik7Y29uc3QgZz1mJXRoaXMuX3hEaW1lbnNpb247Zj1NYXRoLmZsb29yKGYvdGhpcy5feERpbWVuc2lvbik7CnJldHVybnt4OjcuNSt0aGlzLmdldE5vZGVYTG9jKE1hdGguZmxvb3IoZy90aGlzLl9ob3N0WFN0cmlkZSksZyV0aGlzLl9ob3N0WFN0cmlkZSxkJjEpLHk6dGhpcy5nZXRDaGlwWUxvYyhNYXRoLmZsb29yKGYvMiksZiUyKSsxNX19LGxpbmtUb1BhdGg6ZnVuY3Rpb24oZCxmKXtkPXRoaXMuY29yZUlkVG9Qb3MoZD9kOjApO2Y9dGhpcy5jb3JlSWRUb1BvcyhmP2Y6MCk7cmV0dXJuIk0gIitkLngrIiAiK2QueSsiTCAiK2YueCsiICIrZi55fSxfZ2V0VG9vbFRpcFRleHQ6ZnVuY3Rpb24oZCl7Y29uc3QgZj0wPD10aGlzLnNlbGVjdGVkTWV0cmljSWR4P3RoaXMubWV0cmljc1t0aGlzLnNlbGVjdGVkTWV0cmljSWR4XS5sYWJlbDoiIixnPTA8PXRoaXMuc2VsZWN0ZWRNZXRyaWNJZHg/ZC52YWx1ZXNbdGhpcy5zZWxlY3RlZE1ldHJpY0lkeF06MCxsPW5ldyBJbnRsLk51bWJlckZvcm1hdChuYXZpZ2F0b3IubGFuZ3VhZ2Use3N0eWxlOiJwZXJjZW50IixtaW5pbXVtRnJhY3Rpb25EaWdpdHM6Mn0pOwpyZXR1cm5gcG9zOiAoJHtkLnlkaW19LCAke2QueGRpbX0pLAogICAgICAgIGhvc3Q6ICR7ZC5ob3N0fSwKICAgICAgICBjaGlwIGlkOiAke2QuY2lkfSwKICAgICAgICBjb3JlIGlkOiAke2QubmlkfSwKICAgICAgICByZXBsaWNhIGlkOiAke2QucmlkfQogICAgICAgICR7Zj9gJHtmfSBzcGVuZHMgJHtnLnRvRml4ZWQoMil9XHUwMGI1cyBpbiB0b3RhbCwKICAgICAgICAgICAgdGFraW5nICR7bC5mb3JtYXQoZy9kLnRvdGFsKX0gb2YgYSBzdGVwLmA6IiJ9YH0sZHJhd0xlZ2VuZDpmdW5jdGlvbihkLGYsZyl7ZD1kLnNlbGVjdEFsbCgiLmxlZ2VuZCIpLmRhdGEoWzBdLmNvbmNhdChnLnF1YW50aWxlcygpKSxsPT5sKTtkLmV4aXQoKS5yZW1vdmUoKTtnPWQuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxlZ2VuZCIpO2cuYXBwZW5kKCJyZWN0IikuYXR0cigid2lkdGgiLDYwKS5hdHRyKCJoZWlnaHQiLDMwKS5tZXJnZShkLnNlbGVjdCgicmVjdCIpKS5hdHRyKCJ4IiwobCxrKT0+NjAqaykuYXR0cigieSIsZikuc3R5bGUoImZpbGwiLChsLGspPT5hW2tdKTtnLmFwcGVuZCgidGV4dCIpLm1lcmdlKGQuc2VsZWN0KCJ0ZXh0IikpLnRleHQobD0+Ilx1MjI2NSAwLiIrTWF0aC5yb3VuZCgxMCpsKSkuYXR0cigieCIsKGwsayk9PjYwKmspLmF0dHIoInkiLGYrNjApfSxkcmF3VG9wb2xvZ3k6ZnVuY3Rpb24oZCxmKXtkJiZmJiZ0aGlzLmlzQXR0YWNoZWQmJgp0aGlzLnRvcG9sb2d5R3JhcGgoZCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5kcmF3VG9wb2xvZ3kodGhpcy5fdG9wb0RhdGEsdGhpcy5ydW5FbnZpcm9ubWVudCl9LF9zZWxlY3RlZE1ldHJpY0lkeENoYW5nZWQ6ZnVuY3Rpb24oZCl7MD5kfHxkMy5zZWxlY3QodGhpcy4kLnRwZ3JhcGgpLnNlbGVjdEFsbCgiLm5vZGUiKS5zdHlsZSgiZmlsbCIsZj0+YyhmLnZhbHVlc1tkXS9mLnRvdGFsKSl9LF9hY3RpdmVCYXJDaGFuZ2VkOmZ1bmN0aW9uKGQpe3ZhciBmPWQzLnNjYWxlT3JkaW5hbChkMy5zY2hlbWVDYXRlZ29yeTEwKS5kb21haW4oZDMucmFuZ2UoMCwxOSkpO2lmKGQpaWYoZC5yZXBsaWNhR3JvdXBzJiYwPGQucmVwbGljYUdyb3Vwcy5sZW5ndGgpe2ZvcihsZXQgZz0wO2c8ZC5yZXBsaWNhR3JvdXBzLmxlbmd0aDtnKyspe2NvbnN0IGw9ZC5yZXBsaWNhR3JvdXBzW2ddLnJlcGxpY2FJZHM7Zm9yKGxldCBrPTA7azxsLmxlbmd0aDtrKyspZDMuc2VsZWN0KHRoaXMuJC50cGdyYXBoKS5zZWxlY3RBbGwoIiNyaWQiKwpsW2tdKS5zdHlsZSgiZmlsbCIsZihnJTIwKSl9dGhpcy5zZWxlY3RlZE1ldHJpY0lkeD0tMX1lbHNlIGQuc3JjQ29yZUlkcyYmKGY9ZC5zcmNDb3JlSWRzLm1hcCgoZyxsKT0+W2csZC5kc3RDb3JlSWRzW2xdXSksdGhpcy5kcmF3TGlua3ModGhpcy5fZ1NWRyxmKSl9LF9nZXRTZWxlY3RlZE1ldHJpY0xhYmVsOmZ1bmN0aW9uKGQsZil7cmV0dXJuIDA+Znx8IWR8fGY+ZC5sZW5ndGg/IlBsZWFzZSBzZWxlY3QgYSBtZXRyaWMiOiJDb2xvcjogIitkW2ZdLmxhYmVsfX0pfSkoQ3B8fChDcD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BvZC12aWV3ZXIvcG9kLXZpZXdlci1kYXNoYm9hcmQuanMKdmFyIERwOwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoicG9kLXZpZXdlci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e2RhdGE6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfZGF0YUNoYW5nZWQifSxhY3RpdmVEZXRhaWxzOnt0eXBlOkFycmF5LG5vdGlmeTohMH0sYWN0aXZlQmFyOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9hY3RpdmVCYXJDaGFuZ2VkIn0sY3VyU3RlcElkOnt0eXBlOk51bWJlcix2YWx1ZTowfSxfcG9kU3RhdHNNYXBzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2NvbXB1dGVQb2RTdGF0c01hcHMoZGF0YSkifSxfbWF4U3RlcElkOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVNYXhTdGVwSWQoX3BvZFN0YXRzTWFwcykifSxfZXJyb3JNZXNzYWdlOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVFcnJvck1lc3NhZ2UoX21heFN0ZXBJZCkifSxfcnVuRW52aXJvbm1lbnQ6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkVudmlyb25tZW50KGRhdGEpIn0sX3N0ZXBCcmVha2Rvd25MYXllcnM6e3R5cGU6T2JqZWN0LAp2YWx1ZTooKT0+W3trZXk6ImhpZ2hGbG9wc0NvbXB1dGVVcyIsbGFiZWw6IkhpZ2ggZmxvcHMgY29tcHV0ZSJ9LHtrZXk6Imxvd0Zsb3BzQ29tcHV0ZVVzIixsYWJlbDoiTG93IGZsb3BzIGNvbXB1dGUifSx7a2V5OiJob3N0SW5mZWVkRHVyYXRpb25VcyIsbGFiZWw6IkluZmVlZCJ9LHtrZXk6Imhvc3RPdXRmZWVkRHVyYXRpb25VcyIsbGFiZWw6Ik91dGZlZWQifSx7a2V5OiJhbGxSZWR1Y2VDb21wdXRlRHVyYXRpb25VcyIsbGFiZWw6IkFsbFJlZHVjZSBjb21wdXRlIn0se2tleToiYWxsUmVkdWNlU3luY0R1cmF0aW9uVXMiLGxhYmVsOiJBbGxSZWR1Y2Ugc3luYyJ9LHtrZXk6InNlbmREdXJhdGlvblVzIixsYWJlbDoiU2VuZCJ9LHtrZXk6InJlY3ZEdXJhdGlvblVzIixsYWJlbDoiUmVjdiJ9XX0sX3BvZFN0YXRzTWFwOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2NvbXB1dGVQb2RTdGF0c01hcChfcG9kU3RhdHNNYXBzLCBjdXJTdGVwSWQsIF9zdGVwQnJlYWtkb3duTGF5ZXJzKSJ9LApfc3RlcFN0YXRzOnt0eXBlOkFycmF5LHZhbHVlOm51bGwsY29tcHV0ZWQ6Il9jb21wdXRlU3RlcFN0YXRzKF9wb2RTdGF0c01hcCkifSxfY2hhbm5lbERiOnt0eXBlOkFycmF5LHZhbHVlOm51bGwsY29tcHV0ZWQ6Il9jb21wdXRlQ2hhbm5lbERiKF9wb2RTdGF0c01hcCkifSxfYWxsUmVkdWNlRGI6e3R5cGU6QXJyYXksdmFsdWU6bnVsbCxjb21wdXRlZDoiX2NvbXB1dGVBbGxSZWR1Y2VEYihfcG9kU3RhdHNNYXApIn0sX2NoYW5uZWxMYXllcnM6e3R5cGU6QXJyYXksdmFsdWU6KCk9Plt7a2V5OiJkdXJhdGlvblVzIixsYWJlbDoiRHVyYXRpb24gKHMpIn1dfSxfYWxsUmVkdWNlTGF5ZXJzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5be2tleToiZHVyYXRpb25VcyIsbGFiZWw6IkR1cmF0aW9uIChcdTAwYjVzKSJ9XX0sX3N0ZXBCcmVha2Rvd25GdW5jOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+YT0+YCgke2EuY2hpcElkfSwgJHthLm5vZGVJZH0pYH0sX2NoYW5uZWxGdW5jOnt0eXBlOk9iamVjdCwKdmFsdWU6KCk9PmE9PmEuY2hhbm5lbElkfSxfYWxsUmVkdWNlRnVuYzp7dHlwZTpPYmplY3QsdmFsdWU6KCk9PmZ1bmN0aW9uKGEpe2lmKGEubmFtZSlyZXR1cm4gYT1hLm5hbWUucmVwbGFjZSgvbGwtcmVkdWNlLnx1c2lvbi58bGwtcmVkdWNlfHVzaW9uLywiIiksMTxhLmxlbmd0aD9hOmErIjAifX19LF9jb21wdXRlUG9kU3RhdHNNYXBzKGEpe3JldHVybiBhP2EucG9kU3RhdHNTZXF1ZW5jZS5wb2RTdGF0c01hcDpbXX0sX2NvbXB1dGVSdW5FbnZpcm9ubWVudChhKXtpZihhKXJldHVybiBhLnJ1bkVudmlyb25tZW50fSxfY29tcHV0ZU1heFN0ZXBJZChhKXtyZXR1cm4gYS5sZW5ndGgtMX0sX2NvbXB1dGVFcnJvck1lc3NhZ2UoYSl7cmV0dXJuIDA8PWE/IiI6IldBUk5JTkc6IE5vIHN0ZXAgdGltZSBtZWFzdXJlZC4gVGhpcyBtaWdodCBoYXBwZW4gaWYgeW91ciBwcm9maWxlIGR1cmF0aW9uIGlzIHRvbyBzaG9ydCwgdHJ5IGluY3JlYXNlIHByb2ZpbGUgZHVyYXRpb24gdG8gY292ZXIgYSBmdWxsIHN0ZXAuIElmIHlvdSBoYXZlIGFuIGluZmVyZW5jZSBqb2Igb3Igbm90IHVzZSBUcHVFc3RpbWF0b3IsIHBsZWFzZSBza2lwIHRoaXMgdG9vbC4ifSwKX3BvcHVsYXRlTG93RmxvcHNDb21wdXRlKGEsYyl7aWYoYSYmYyl7dmFyIGQ9YS5wb2RTdGF0c1BlckNvcmU7Zm9yKGxldCBmIGluIGQpe2xldCBnPWRbZl07aWYoZy5oYXNPd25Qcm9wZXJ0eSgibG93RmxvcHNDb21wdXRlVXMiKSlicmVhaztnLmxvd0Zsb3BzQ29tcHV0ZVVzPWcudG90YWxEdXJhdGlvblVzO2ZvcihsZXQgbD0wO2w8Yy5sZW5ndGg7bCsrKTEhPWwmJihnW2NbbF0ua2V5XXx8KGdbY1tsXS5rZXldPTApLGcubG93RmxvcHNDb21wdXRlVXMtPWdbY1tsXS5rZXldKX1yZXR1cm4gYX19LF9jb21wdXRlUG9kU3RhdHNNYXAoYSxjLGQpe2lmKCEoIWF8fDA+Y3x8Yz49YS5sZW5ndGgpJiZkKXJldHVybiB0aGlzLl9wb3B1bGF0ZUxvd0Zsb3BzQ29tcHV0ZShhW2NdLGQpfSxfY29tcHV0ZVN0ZXBTdGF0cyhhKXtpZihhJiZhLnBvZFN0YXRzUGVyQ29yZSl7dmFyIGM9YS5wb2RTdGF0c1BlckNvcmU7cmV0dXJuIE9iamVjdC5rZXlzKGMpLm1hcChkPT5jW2RdKS5zb3J0KChkLGYpPT4KZC5jaGlwSWQtZi5jaGlwSWQpfX0sX2NvbXB1dGVDaGFubmVsRGIoYSl7aWYoYSYmYS5jaGFubmVsRGImJiEoMD49YS5jaGFubmVsRGIubGVuZ3RoKSlyZXR1cm4gYS5jaGFubmVsRGIuc2xpY2UoKS5zb3J0KChjLGQpPT5kLmR1cmF0aW9uVXMtYy5kdXJhdGlvblVzKX0sX2NvbXB1dGVBbGxSZWR1Y2VEYihhKXtpZihhJiZhLmFsbFJlZHVjZU9wRGImJiEoMD49YS5hbGxSZWR1Y2VPcERiLmxlbmd0aCkpcmV0dXJuIGEuYWxsUmVkdWNlT3BEYi5zbGljZSgpLnNvcnQoKGMsZCk9PmQuZHVyYXRpb25Vcy1jLmR1cmF0aW9uVXMpfSxfZGF0YUNoYW5nZWQoYSl7YSYmKHRoaXMuY3VyU3RlcElkPTApfSxfYWN0aXZlQmFyQ2hhbmdlZChhKXthJiYodGhpcy5hY3RpdmVEZXRhaWxzPVthXSl9LF9nZXRTdGVwTnVtKGEpe3JldHVybiBhP2Euc3RlcE51bTowfX0pfSkoRHB8fChEcD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tYWpheC9pcm9uLXJlcXVlc3QuaHRtbC5qcwpQb2x5bWVyKHtpczoiaXJvbi1yZXF1ZXN0Iixob3N0QXR0cmlidXRlczp7aGlkZGVuOiEwfSxwcm9wZXJ0aWVzOnt4aHI6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxyZWFkT25seTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgWE1MSHR0cFJlcXVlc3R9fSxyZXNwb25zZTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9fSxzdGF0dXM6e3R5cGU6TnVtYmVyLG5vdGlmeTohMCxyZWFkT25seTohMCx2YWx1ZTowfSxzdGF0dXNUZXh0Ont0eXBlOlN0cmluZyxub3RpZnk6ITAscmVhZE9ubHk6ITAsdmFsdWU6IiJ9LGNvbXBsZXRlczp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYyl7dGhpcy5yZXNvbHZlQ29tcGxldGVzPWE7dGhpcy5yZWplY3RDb21wbGV0ZXM9Y30uYmluZCh0aGlzKSl9fSxwcm9ncmVzczp7dHlwZTpPYmplY3QsCm5vdGlmeTohMCxyZWFkT25seTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX0sYWJvcnRlZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCxyZWFkT25seTohMCx2YWx1ZTohMX0sZXJyb3JlZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCxyZWFkT25seTohMCx2YWx1ZTohMX0sdGltZWRPdXQ6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAscmVhZE9ubHk6ITAsdmFsdWU6ITF9fSxnZXQgc3VjY2VlZGVkKCl7aWYodGhpcy5lcnJvcmVkfHx0aGlzLmFib3J0ZWR8fHRoaXMudGltZWRPdXQpcmV0dXJuITE7dmFyIGE9dGhpcy54aHIuc3RhdHVzfHwwO3JldHVybiAwPT09YXx8MjAwPD1hJiYzMDA+YX0sc2VuZDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnhocjtpZigwPGMucmVhZHlTdGF0ZSlyZXR1cm4gbnVsbDtjLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixmdW5jdGlvbihuKXt0aGlzLl9zZXRQcm9ncmVzcyh7bGVuZ3RoQ29tcHV0YWJsZTpuLmxlbmd0aENvbXB1dGFibGUsbG9hZGVkOm4ubG9hZGVkLAp0b3RhbDpuLnRvdGFsfSk7dGhpcy5maXJlKCJpcm9uLXJlcXVlc3QtcHJvZ3Jlc3MtY2hhbmdlZCIse3ZhbHVlOnRoaXMucHJvZ3Jlc3N9KX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24obil7dGhpcy5fc2V0RXJyb3JlZCghMCk7dGhpcy5fdXBkYXRlU3RhdHVzKCk7dGhpcy5yZWplY3RDb21wbGV0ZXMoYS5yZWplY3RXaXRoUmVxdWVzdD97ZXJyb3I6bixyZXF1ZXN0OnRoaXN9Om4pfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoInRpbWVvdXQiLGZ1bmN0aW9uKG4pe3RoaXMuX3NldFRpbWVkT3V0KCEwKTt0aGlzLl91cGRhdGVTdGF0dXMoKTt0aGlzLnJlamVjdENvbXBsZXRlcyhhLnJlamVjdFdpdGhSZXF1ZXN0P3tlcnJvcjpuLHJlcXVlc3Q6dGhpc306bil9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLGZ1bmN0aW9uKCl7dGhpcy5fc2V0QWJvcnRlZCghMCk7dGhpcy5fdXBkYXRlU3RhdHVzKCk7dmFyIG49CkVycm9yKCJSZXF1ZXN0IGFib3J0ZWQuIik7dGhpcy5yZWplY3RDb21wbGV0ZXMoYS5yZWplY3RXaXRoUmVxdWVzdD97ZXJyb3I6bixyZXF1ZXN0OnRoaXN9Om4pfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlbmQiLGZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlU3RhdHVzKCk7dGhpcy5fc2V0UmVzcG9uc2UodGhpcy5wYXJzZVJlc3BvbnNlKCkpO2lmKHRoaXMuc3VjY2VlZGVkKXRoaXMucmVzb2x2ZUNvbXBsZXRlcyh0aGlzKTtlbHNle3ZhciBuPUVycm9yKCJUaGUgcmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZTogIit0aGlzLnhoci5zdGF0dXMpO3RoaXMucmVqZWN0Q29tcGxldGVzKGEucmVqZWN0V2l0aFJlcXVlc3Q/e2Vycm9yOm4scmVxdWVzdDp0aGlzfTpuKX19LmJpbmQodGhpcykpO3RoaXMudXJsPWEudXJsO3ZhciBkPSExIT09YS5hc3luYztjLm9wZW4oYS5tZXRob2R8fCJHRVQiLGEudXJsLGQpO3ZhciBmPXtqc29uOiJhcHBsaWNhdGlvbi9qc29uIiwKdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCIsYXJyYXlidWZmZXI6ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSJ9W2EuaGFuZGxlQXNdLGc9YS5oZWFkZXJzfHxPYmplY3QuY3JlYXRlKG51bGwpLGw9T2JqZWN0LmNyZWF0ZShudWxsKSxrO2ZvcihrIGluIGcpbFtrLnRvTG93ZXJDYXNlKCldPWdba107Zz1sO2YmJiFnLmFjY2VwdCYmKGcuYWNjZXB0PWYpO09iamVjdC5rZXlzKGcpLmZvckVhY2goZnVuY3Rpb24obil7L1tBLVpdLy50ZXN0KG4pJiZQb2x5bWVyLkJhc2UuX2Vycm9yKCJIZWFkZXJzIG11c3QgYmUgbG93ZXIgY2FzZSwgZ290IixuKTtjLnNldFJlcXVlc3RIZWFkZXIobixnW25dKX0sdGhpcyk7aWYoZCl7Yy50aW1lb3V0PWEudGltZW91dDtkPWEuaGFuZGxlQXM7aWYoYS5qc29uUHJlZml4fHwhZClkPSJ0ZXh0IjtjLnJlc3BvbnNlVHlwZT1jLl9yZXNwb25zZVR5cGU9ZDthLmpzb25QcmVmaXgmJihjLl9qc29uUHJlZml4PQphLmpzb25QcmVmaXgpfWMud2l0aENyZWRlbnRpYWxzPSEhYS53aXRoQ3JlZGVudGlhbHM7ZD10aGlzLl9lbmNvZGVCb2R5T2JqZWN0KGEuYm9keSxnWyJjb250ZW50LXR5cGUiXSk7Yy5zZW5kKGQpO3JldHVybiB0aGlzLmNvbXBsZXRlc30scGFyc2VSZXNwb25zZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMueGhyLGM9YS5yZXNwb25zZVR5cGV8fGEuX3Jlc3BvbnNlVHlwZSxkPSF0aGlzLnhoci5yZXNwb25zZVR5cGUsZj1hLl9qc29uUHJlZml4JiZhLl9qc29uUHJlZml4Lmxlbmd0aHx8MDt0cnl7c3dpdGNoKGMpe2Nhc2UgImpzb24iOmlmKGR8fHZvaWQgMD09PWEucmVzcG9uc2UpdHJ5e3JldHVybiBKU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtyZXR1cm4gY29uc29sZS53YXJuKCJGYWlsZWQgdG8gcGFyc2UgSlNPTiBzZW50IGZyb20gIithLnJlc3BvbnNlVVJMKSxudWxsfXJldHVybiBhLnJlc3BvbnNlO2Nhc2UgInhtbCI6cmV0dXJuIGEucmVzcG9uc2VYTUw7Y2FzZSAiYmxvYiI6Y2FzZSAiZG9jdW1lbnQiOmNhc2UgImFycmF5YnVmZmVyIjpyZXR1cm4gYS5yZXNwb25zZTsKZGVmYXVsdDppZihmKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dC5zdWJzdHJpbmcoZikpfWNhdGNoKGcpe3JldHVybiBjb25zb2xlLndhcm4oIkZhaWxlZCB0byBwYXJzZSBKU09OIHNlbnQgZnJvbSAiK2EucmVzcG9uc2VVUkwpLG51bGx9cmV0dXJuIGEucmVzcG9uc2VUZXh0fX1jYXRjaChnKXt0aGlzLnJlamVjdENvbXBsZXRlcyhFcnJvcigiQ291bGQgbm90IHBhcnNlIHJlc3BvbnNlLiAiK2cubWVzc2FnZSkpfX0sYWJvcnQ6ZnVuY3Rpb24oKXt0aGlzLl9zZXRBYm9ydGVkKCEwKTt0aGlzLnhoci5hYm9ydCgpfSxfZW5jb2RlQm9keU9iamVjdDpmdW5jdGlvbihhLGMpe2lmKCJzdHJpbmciPT10eXBlb2YgYSlyZXR1cm4gYTtzd2l0Y2goYyl7Y2FzZSAiYXBwbGljYXRpb24vanNvbiI6cmV0dXJuIEpTT04uc3RyaW5naWZ5KGEpO2Nhc2UgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCI6cmV0dXJuIHRoaXMuX3d3d0Zvcm1VcmxFbmNvZGUoYSl9cmV0dXJuIGF9LApfd3d3Rm9ybVVybEVuY29kZTpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4iIjt2YXIgYz1bXTtPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2MucHVzaCh0aGlzLl93d3dGb3JtVXJsRW5jb2RlUGllY2UoZCkrIlx4M2QiK3RoaXMuX3d3d0Zvcm1VcmxFbmNvZGVQaWVjZShhW2RdKSl9LHRoaXMpO3JldHVybiBjLmpvaW4oIlx4MjYiKX0sX3d3d0Zvcm1VcmxFbmNvZGVQaWVjZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9PWEmJnZvaWQgMCE9PWEmJmEudG9TdHJpbmc/ZW5jb2RlVVJJQ29tcG9uZW50KGEudG9TdHJpbmcoKS5yZXBsYWNlKC9ccj9cbi9nLCJcclxuIikpLnJlcGxhY2UoLyUyMC9nLCIrIik6IiJ9LF91cGRhdGVTdGF0dXM6ZnVuY3Rpb24oKXt0aGlzLl9zZXRTdGF0dXModGhpcy54aHIuc3RhdHVzKTt0aGlzLl9zZXRTdGF0dXNUZXh0KHZvaWQgMD09PXRoaXMueGhyLnN0YXR1c1RleHQ/IiI6dGhpcy54aHIuc3RhdHVzVGV4dCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZ29vZ2xlLWNoYXJ0L2dvb2dsZS1jaGFydC1sb2FkZXIuaHRtbC5qcwooZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGspe3JldHVybiBnb29nbGVbMD09PWsuaW5kZXhPZigibWQtIik/Yy5DSEFSVFM6Yy5WSVNdfXZhciBjPXtDSEFSVFM6ImNoYXJ0cyIsVklTOiJ2aXN1YWxpemF0aW9uIn0sZD17YXJlYTp7Y3RvcjoiQXJlYUNoYXJ0In0sYmFyOntjdG9yOiJCYXJDaGFydCJ9LCJtZC1iYXIiOntjdG9yOiJCYXIiLHBrZzoiYmFyIn0sYnViYmxlOntjdG9yOiJCdWJibGVDaGFydCJ9LGNhbGVuZGFyOntjdG9yOiJDYWxlbmRhciIscGtnOiJjYWxlbmRhciJ9LGNhbmRsZXN0aWNrOntjdG9yOiJDYW5kbGVzdGlja0NoYXJ0In0sY29sdW1uOntjdG9yOiJDb2x1bW5DaGFydCJ9LGNvbWJvOntjdG9yOiJDb21ib0NoYXJ0In0sZ2F1Z2U6e2N0b3I6IkdhdWdlIixwa2c6ImdhdWdlIn0sZ2VvOntjdG9yOiJHZW9DaGFydCJ9LGhpc3RvZ3JhbTp7Y3RvcjoiSGlzdG9ncmFtIn0sbGluZTp7Y3RvcjoiTGluZUNoYXJ0In0sIm1kLWxpbmUiOntjdG9yOiJMaW5lIixwa2c6ImxpbmUifSwKb3JnOntjdG9yOiJPcmdDaGFydCIscGtnOiJvcmdjaGFydCJ9LHBpZTp7Y3RvcjoiUGllQ2hhcnQifSxzYW5rZXk6e2N0b3I6IlNhbmtleSIscGtnOiJzYW5rZXkifSxzY2F0dGVyOntjdG9yOiJTY2F0dGVyQ2hhcnQifSwibWQtc2NhdHRlciI6e2N0b3I6IlNjYXR0ZXIiLHBrZzoic2NhdHRlciJ9LCJzdGVwcGVkLWFyZWEiOntjdG9yOiJTdGVwcGVkQXJlYUNoYXJ0In0sdGFibGU6e2N0b3I6IlRhYmxlIixwa2c6InRhYmxlIn0sdGltZWxpbmU6e2N0b3I6IlRpbWVsaW5lIixwa2c6InRpbWVsaW5lIn0sdHJlZW1hcDp7Y3RvcjoiVHJlZU1hcCIscGtnOiJ0cmVlbWFwIn0sd29yZHRyZWU6e2N0b3I6IldvcmRUcmVlIixuYW1lc3BhY2U6Yy5WSVMscGtnOiJ3b3JkdHJlZSJ9fSxmPXt9LGc9e30sbD17fTtQb2x5bWVyKHtpczoiZ29vZ2xlLWNoYXJ0LWxvYWRlciIscHJvcGVydGllczp7cGFja2FnZXM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX0sb2JzZXJ2ZXI6Il9sb2FkUGFja2FnZXMifSwKdHlwZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9sb2FkUGFja2FnZUZvclR5cGUifX0sZ2V0IF9jb3JlUGFja2FnZSgpe3JldHVybiBnLmNvcmVjaGFydD9nLmNvcmVjaGFydDp0aGlzLl9sb2FkUGFja2FnZXMoWyJjb3JlY2hhcnQiXSkudGhlbihmdW5jdGlvbihrKXtyZXR1cm4ga1swXX0pfSxfbG9hZFBhY2thZ2VzRGVib3VuY2U6ZnVuY3Rpb24oKXt0aGlzLmRlYm91bmNlKCJsb2FkUGFja2FnZXMiLGZ1bmN0aW9uKCl7dmFyIGs9T2JqZWN0LmtleXMoZik7ay5sZW5ndGgmJihmPXt9LGdvb2dsZS5jaGFydHMubG9hZCgiY3VycmVudCIse3BhY2thZ2VzOmssbGFuZ3VhZ2U6ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lmxhbmd8fCJlbiJ9KSxnb29nbGUuY2hhcnRzLnNldE9uTG9hZENhbGxiYWNrKGZ1bmN0aW9uKCl7ay5mb3JFYWNoKGZ1bmN0aW9uKG4pe3RoaXMuZmlyZSgibG9hZGVkIixuKTtsW25dKGdvb2dsZS52aXN1YWxpemF0aW9uKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sCjEwMCl9LF9sb2FkUGFja2FnZXM6ZnVuY3Rpb24oayl7dmFyIG49W107ay5mb3JFYWNoKGZ1bmN0aW9uKHApe2dbcF18fChmW3BdPSEwLGdbcF09bmV3IFByb21pc2UoZnVuY3Rpb24ocSl7bFtwXT1xfSksdGhpcy5fbG9hZFBhY2thZ2VzRGVib3VuY2UoKSk7bi5wdXNoKGdbcF0pfS5iaW5kKHRoaXMpKTtyZXR1cm4gUHJvbWlzZS5hbGwobil9LF9sb2FkUGFja2FnZUZvclR5cGU6ZnVuY3Rpb24oayl7dmFyIG49ZFtrXTtyZXR1cm4gbj90aGlzLl9sb2FkUGFja2FnZXMoW24ucGtnfHwiY29yZWNoYXJ0Il0pLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4oZ29vZ2xlW24ubmFtZXNwYWNlXXx8YShrKSlbbi5jdG9yXX0pOlByb21pc2UucmVqZWN0KCJUaGlzIGNoYXJ0IHR5cGUgaXMgbm90IHlldCBzdXBwb3J0ZWQ6ICIrayl9LGNyZWF0ZTpmdW5jdGlvbihrLG4pe3JldHVybiB0aGlzLl9sb2FkUGFja2FnZUZvclR5cGUoaykudGhlbihmdW5jdGlvbihwKXtyZXR1cm4gbmV3IHAobil9KX0sZmlyZU9uQ2hhcnRFdmVudDpmdW5jdGlvbihrLApuLHApe3JldHVybiB0aGlzLl9jb3JlUGFja2FnZS50aGVuKGZ1bmN0aW9uKHEpeyhwP3EuZXZlbnRzLmFkZE9uZVRpbWVMaXN0ZW5lcjpxLmV2ZW50cy5hZGRMaXN0ZW5lcikoayxuLGZ1bmN0aW9uKHIpe3RoaXMuZmlyZSgiZ29vZ2xlLWNoYXJ0LSIrbix7Y2hhcnQ6ayxkYXRhOnJ9KX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfSxkYXRhVGFibGU6ZnVuY3Rpb24oayl7cmV0dXJuIHRoaXMuX2NvcmVQYWNrYWdlLnRoZW4oZnVuY3Rpb24obil7cmV0dXJuIG51bGw9PWs/bmV3IG4uRGF0YVRhYmxlOmsuZ2V0TnVtYmVyT2ZSb3dzP2s6ay5jb2xzP25ldyBuLkRhdGFUYWJsZShrKTowPGsubGVuZ3RoP24uYXJyYXlUb0RhdGFUYWJsZShrKTowPT09ay5sZW5ndGg/UHJvbWlzZS5yZWplY3QoIkRhdGEgd2FzIGVtcHR5LiIpOlByb21pc2UucmVqZWN0KCJEYXRhIGZvcm1hdCB3YXMgbm90IHJlY29nbml6ZWQuIil9KX0sZGF0YVZpZXc6ZnVuY3Rpb24oayl7cmV0dXJuIHRoaXMuX2NvcmVQYWNrYWdlLnRoZW4oZnVuY3Rpb24obil7cmV0dXJuIG5ldyBuLkRhdGFWaWV3KGspfSl9LApxdWVyeTpmdW5jdGlvbihrLG4pe3JldHVybiB0aGlzLl9jb3JlUGFja2FnZS50aGVuKGZ1bmN0aW9uKHApe3JldHVybiBuZXcgcC5RdWVyeShrLG4pfSl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2dvb2dsZS1jaGFydC9nb29nbGUtY2hhcnQuaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoiZ29vZ2xlLWNoYXJ0Iixwcm9wZXJ0aWVzOnt0eXBlOnt0eXBlOlN0cmluZyx2YWx1ZToiY29sdW1uIixvYnNlcnZlcjoiX3R5cGVDaGFuZ2VkIn0sZXZlbnRzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxvcHRpb25zOnt0eXBlOk9iamVjdH0sY29sczp7dHlwZTpBcnJheSxvYnNlcnZlcjoiX3Jvd3NPckNvbHVtbnNDaGFuZ2VkIn0scm93czp7dHlwZTpBcnJheSxvYnNlcnZlcjoiX3Jvd3NPckNvbHVtbnNDaGFuZ2VkIn0sZGF0YTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9kYXRhQ2hhbmdlZCJ9LHZpZXc6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfdmlld0NoYW5nZWQifSxzZWxlY3Rpb246e3R5cGU6QXJyYXksbm90aWZ5OiEwLG9ic2VydmVyOiJfc2V0U2VsZWN0aW9uIn0sZHJhd246e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMCx2YWx1ZTohMX19LG9ic2VydmVyczpbIl9kcmF3KF9jaGFydCwgX2RhdGFWaWV3KSIsCiJfc3ViT3B0aW9uQ2hhbmdlZChvcHRpb25zLiopIl0sbGlzdGVuZXJzOnsiZ29vZ2xlLWNoYXJ0LXNlbGVjdCI6Il91cGRhdGVTZWxlY3Rpb24iLCJnb29nbGUtY2hhcnQtcmVhZHkiOiJfb25DaGFydFJlYWR5In0sX2NoYXJ0Om51bGwsX2RhdGFWaWV3Om51bGwsX3NlbGVjdGlvbjpudWxsLF90eXBlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuJC5sb2FkZXIuY3JlYXRlKHRoaXMudHlwZSx0aGlzLiQuY2hhcnRkaXYpLnRoZW4oZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy4kLmxvYWRlcjtPYmplY3Qua2V5cyh0aGlzLmV2ZW50cy5jb25jYXQoWyJzZWxlY3QiLCJyZWFkeSJdKS5yZWR1Y2UoZnVuY3Rpb24oZCxmKXtkW2ZdPSEwO3JldHVybiBkfSx7fSkpLmZvckVhY2goZnVuY3Rpb24oZCl7Yy5maXJlT25DaGFydEV2ZW50KGEsZCl9KTt0aGlzLl9zZXREcmF3bighMSk7dGhpcy5fY2hhcnQ9YX0uYmluZCh0aGlzKSl9LF9zdWJPcHRpb25DaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMub3B0aW9ucz0KYS5iYXNlO3RoaXMuZGVib3VuY2UoIm9wdGlvbkNoYW5nZVJlZHJhdyIsZnVuY3Rpb24oKXt0aGlzLnJlZHJhdygpfSw1KX0sX3NldFNlbGVjdGlvbjpmdW5jdGlvbigpe3RoaXMuZHJhd24mJnRoaXMuc2VsZWN0aW9uJiZ0aGlzLnNlbGVjdGlvbiE9PXRoaXMuX3NlbGVjdGlvbiYmKHRoaXMuX2NoYXJ0LnNldFNlbGVjdGlvbiYmdGhpcy5fY2hhcnQuc2V0U2VsZWN0aW9uKHRoaXMuc2VsZWN0aW9uKSx0aGlzLl9zZWxlY3Rpb249dGhpcy5zZWxlY3Rpb24pfSxfdXBkYXRlU2VsZWN0aW9uOmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb249dGhpcy5fc2VsZWN0aW9uPXRoaXMuX2NoYXJ0LmdldFNlbGVjdGlvbigpfSxfb25DaGFydFJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fc2V0RHJhd24oITApO3RoaXMuX3NlbGVjdGlvbj1udWxsO3RoaXMuX3NldFNlbGVjdGlvbigpfSxyZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmdGhpcy5fZGF0YVZpZXcmJnRoaXMuX2RyYXcodGhpcy5fY2hhcnQsCnRoaXMuX2RhdGFWaWV3KX0sX2RyYXc6ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1hJiZudWxsIT1jKXRyeXt0aGlzLl9zZXREcmF3bighMSksYS5kcmF3KGMsdGhpcy5vcHRpb25zfHx7fSl9Y2F0Y2goZCl7dGhpcy4kLmNoYXJ0ZGl2LmlubmVySFRNTD1kfX0sZ2V0IGltYWdlVVJJKCl7cmV0dXJuIHRoaXMuX2NoYXJ0P3RoaXMuX2NoYXJ0LmdldEltYWdlVVJJKCk6bnVsbH0sX3ZpZXdDaGFuZ2VkOmZ1bmN0aW9uKGEpe2EmJih0aGlzLl9kYXRhVmlldz1hKX0sX3Jvd3NPckNvbHVtbnNDaGFuZ2VkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5yb3dzLGM9dGhpcy5jb2xzO2EmJmMmJnRoaXMuJC5sb2FkZXIuZGF0YVRhYmxlKCkudGhlbihmdW5jdGlvbihkKXtjLmZvckVhY2goZnVuY3Rpb24oZil7ZC5hZGRDb2x1bW4oZil9KTtkLmFkZFJvd3MoYSk7cmV0dXJuIGR9LmJpbmQodGhpcykpLnRoZW4odGhpcy4kLmxvYWRlci5kYXRhVmlldy5iaW5kKHRoaXMuJC5sb2FkZXIpKS50aGVuKGZ1bmN0aW9uKGQpe3RoaXMuX2RhdGFWaWV3PQpkfS5iaW5kKHRoaXMpKS5jYXRjaChmdW5jdGlvbihkKXt0aGlzLiQuY2hhcnRkaXYuaW5uZXJIVE1MPWR9LmJpbmQodGhpcykpfSxfZGF0YUNoYW5nZWQ6ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9ITE7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChkKXtjPSJzdHJpbmciPT10eXBlb2YgYXx8YSBpbnN0YW5jZW9mIFN0cmluZ31hPWM/ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaXJvbi1yZXF1ZXN0Iikuc2VuZCh7dXJsOmEsaGFuZGxlQXM6Impzb24ifSkudGhlbihmdW5jdGlvbihkKXtyZXR1cm4gZC5yZXNwb25zZX0pOlByb21pc2UucmVzb2x2ZShhKTthLnRoZW4odGhpcy4kLmxvYWRlci5kYXRhVGFibGUuYmluZCh0aGlzLiQubG9hZGVyKSkudGhlbih0aGlzLiQubG9hZGVyLmRhdGFWaWV3LmJpbmQodGhpcy4kLmxvYWRlcikpLnRoZW4oZnVuY3Rpb24oZCl7dGhpcy5fZGF0YVZpZXc9ZH0uYmluZCh0aGlzKSl9fSxhdHRhY2hlZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwphLnNyYz0iaHR0cHM6Ly93d3cuZ3N0YXRpYy5jb20vY2hhcnRzL2xvYWRlci5qcyI7ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChhKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZ29vZ2xlLWNoYXJ0L2dvb2dsZS1jaGFydC1kZW1vLmh0bWwuanMKUG9seW1lcih7aXM6Imdvb2dsZS1jaGFydC1kZW1vIixwcm9wZXJ0aWVzOntfZGF0YTp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il91cGRhdGVWaWV3In19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtdGVuc29yYm9hcmQvcGx1Z2luLWRpYWxvZy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1wbHVnaW4tZGlhbG9nIixwcm9wZXJ0aWVzOntfdGl0bGU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9jdXN0b21NZXNzYWdlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfb3Blbjp7dHlwZTpCb29sZWFufSxfaGlkZGVuOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGlkZGVuKF9vcGVuKSIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfdXNlTmF0aXZlQmFja2Ryb3A6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH19LG9wZW5Ob1RlbnNvckZsb3dEaWFsb2coKXt0aGlzLm9wZW5EaWFsb2coIlRoaXMgcGx1Z2luIGlzIGRpc2FibGVkIHdpdGhvdXQgVGVuc29yRmxvdyIsJ1RvIGVuYWJsZSB0aGlzIHBsdWdpbiBpbiBUZW5zb3JCb2FyZCwgaW5zdGFsbCBUZW5zb3JGbG93IHdpdGggInBpcCBpbnN0YWxsIHRlbnNvcmZsb3ciIG9yIGVxdWl2YWxlbnQuJyl9LG9wZW5PbGRUZW5zb3JGbG93RGlhbG9nKGEpe3RoaXMub3BlbkRpYWxvZygiVGhpcyBwbHVnaW4gaXMgZGlzYWJsZWQgd2l0aG91dCBUZW5zb3JGbG93ICIrCmEsIlRvIGVuYWJsZSB0aGlzIHBsdWdpbiBpbiBUZW5zb3JCb2FyZCwgaW5zdGFsbCBUZW5zb3JGbG93ICIrYSsnIG9yIGdyZWF0ZXIgd2l0aCAicGlwIGluc3RhbGwgdGVuc29yZmxvdyIgb3IgZXF1aXZhbGVudC4nKX0sb3BlbkRpYWxvZyhhLGMpe3RoaXMuc2V0KCJfdGl0bGUiLGEpO3RoaXMuc2V0KCJfY3VzdG9tTWVzc2FnZSIsYyk7dGhpcy4kLmRpYWxvZy5vcGVuKCl9LGNsb3NlRGlhbG9nKCl7dGhpcy4kLmRpYWxvZy5jbG9zZSgpfSxfY29tcHV0ZUhpZGRlbihhKXtyZXR1cm4hYX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wcm9maWxlLWRhc2hib2FyZC90Zi1wcm9maWxlLWRhc2hib2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1wcm9maWxlLWRhc2hib2FyZCIscHJvcGVydGllczp7X3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFFvLlJlcXVlc3RNYW5hZ2VyfSxfaXNBdHRhY2hlZDpCb29sZWFuLF9pc0F2YWlsYWJsZTpCb29sZWFuLF9pbml0aWFsaXplZDpCb29sZWFuLF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfZGF0YXNldHM6e3R5cGU6QXJyYXksbm90aWZ5OiEwLG9ic2VydmVyOiJfZGF0YXNldHNDaGFuZ2VkIn0sX2FjdGl2ZVRvb2xzTGlzdDp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEFjdGl2ZVRvb2xzTGlzdChzZWxlY3RlZERhdGFzZXRJbmRleCwgX2RhdGFzZXRzKSIsb2JzZXJ2ZXI6Il9hY3RpdmVUb29sc0NoYW5nZWQifSxfYWN0aXZlSG9zdHNMaXN0Ont0eXBlOkFycmF5LG9ic2VydmVyOiJfYWN0aXZlSG9zdHNDaGFuZ2VkIn0sX3RvcExldmVsU3RhdGU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVRvcExldmVsU3RhdGUoX2RhdGFOb3RGb3VuZCwgcHJvZ3Jlc3MpIiwKcmVhZE9ubHk6ITB9LHByb2dyZXNzOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LHNlbGVjdGVkRGF0YXNldEluZGV4Ont0eXBlOk51bWJlcixub3RpZnk6ITAsdmFsdWU6MH0sc2VsZWN0ZWRUb29sSW5kZXg6e3R5cGU6TnVtYmVyLG5vdGlmeTohMCx2YWx1ZTowfSxzZWxlY3RlZEhvc3RJbmRleDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwLHZhbHVlOjB9LHRyYWNlVmlld2VyQmFzZVVybDp7dHlwZTpTdHJpbmcsdmFsdWU6InRyYWNlX3ZpZXdlcl9pbmRleC5odG1sIn0sX3Byb2ZpbGVyU2VydmljZUFkZHJlc3M6U3RyaW5nLF9wcm9maWxlclNlcnZpY2VBZGRyZXNzVHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImlwLWFkZHJlc3MifSxfcHJvZmlsZUR1cmF0aW9uOnt0eXBlOlN0cmluZyx2YWx1ZToiMTAwMCJ9LF9wcm9maWxlTnVtUmV0cnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIzIn0sX3Byb2ZpbGVXb3JrZXJMaXN0Ont0eXBlOlN0cmluZ30sX3Byb2ZpbGVJbmNsdWRlRGF0YXNldE9wczp7dHlwZTpCb29sZWFuLAp2YWx1ZTohMH0sX3RyYWNlRGF0YVVybDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9vcFByb2ZpbGVEYXRhOnt0eXBlOk9iamVjdH0sX2lucHV0UGlwZWxpbmVEYXRhOnt0eXBlOk9iamVjdH0sX292ZXJ2aWV3UGFnZURhdGE6e3R5cGU6T2JqZWN0fSxfbWVtb3J5Vmlld2VyRGF0YTp7dHlwZTpPYmplY3R9LF9wb2RWaWV3ZXJEYXRhOnt0eXBlOk9iamVjdH0sX2dvb2dsZUNoYXJ0RGVtb0RhdGE6e3R5cGU6T2JqZWN0fSxfc2VsZWN0ZWREYXRhc2V0TmFtZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLGNvbXB1dGVkOiJfZ2V0U2VsZWN0ZWREYXRhc2V0TmFtZShzZWxlY3RlZERhdGFzZXRJbmRleCwgX2RhdGFzZXRzKSJ9LF9zZWxlY3RlZFRvb2xOYW1lOnt0eXBlOlN0cmluZyxub3RpZnk6ITAsY29tcHV0ZWQ6Il9nZXRTZWxlY3RlZChzZWxlY3RlZFRvb2xJbmRleCwgX2FjdGl2ZVRvb2xzTGlzdCkifSxfc2VsZWN0ZWRIb3N0TmFtZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLGNvbXB1dGVkOiJfZ2V0U2VsZWN0ZWQoc2VsZWN0ZWRIb3N0SW5kZXgsIF9hY3RpdmVIb3N0c0xpc3QpIn0sCl90b29sSW5TY29wZTp7dHlwZTpTdHJpbmd9LF9hY3RpdmVPcERldGFpbHM6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT57fX0sX2FjdGl2ZUJ1ZmZlckRldGFpbHM6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT57fX0sX2FjdGl2ZVBvZERldGFpbHM6e3R5cGU6QXJyYXl9LF9jYXB0dXJpbmdQcm9maWxlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxyZWxvYWQ6ZnVuY3Rpb24oKXt9LHJlYWR5OmZ1bmN0aW9uKCl7fSxvYnNlcnZlcnM6WyJfbWF5YmVJbml0aWFsaXplRGFzaGJvYXJkKF9pc0F0dGFjaGVkLCBfaXNBdmFpbGFibGUpIiwiX21heWJlVXBkYXRlRGF0YShfc2VsZWN0ZWRIb3N0TmFtZSkiLCJfbWF5YmVVcGRhdGVBY3RpdmVIb3N0cyhfc2VsZWN0ZWREYXRhc2V0TmFtZSwgX3NlbGVjdGVkVG9vbE5hbWUpIl0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnNldCgiX2lzQXR0YWNoZWQiLCEwKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KFFvLmdldFJvdXRlcigpLnBsdWdpbnNMaXN0aW5nKCkpLnRoZW4oYT0+CnsicHJvZmlsZSJpbiBhPyh0aGlzLiQuaW5pdGlhbERpYWxvZy5jbG9zZURpYWxvZygpLHRoaXMuc2V0KCJfaXNBdmFpbGFibGUiLCEwKSk6KHRoaXMuJC5pbml0aWFsRGlhbG9nLm9wZW5PbGRUZW5zb3JGbG93RGlhbG9nKCIxLjE0IiksdGhpcy5zZXQoIl9pc0F2YWlsYWJsZSIsITEpKX0pfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITEpfSxfb3BlbkNhcHR1cmVQcm9maWxlRGlhbG9nOmZ1bmN0aW9uKCl7dGhpcy4kLmNhcHR1cmVQcm9maWxlRGlhbG9nLm9wZW4oKX0sX3Nob3VsZERpc2FibGVDYXB0dXJlUHJvZmlsZUJ1dHRvbjpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIWF8fCIiPT09Y3x8IiI9PT1kfSxfc2hvdWxkU2hvd1RwdU9wdGlvbnM6ZnVuY3Rpb24oYSl7cmV0dXJuInRwdS1uYW1lIj09YX0sX2NhcHR1cmVQcm9maWxlOmZ1bmN0aW9uKCl7dGhpcy5fY2FwdHVyaW5nUHJvZmlsZT0hMDtjb25zdCBhPVFvLmFkZFBhcmFtcyhRby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgicHJvZmlsZSIsCiIvY2FwdHVyZV9wcm9maWxlIikse3NlcnZpY2VfYWRkcjp0aGlzLl9wcm9maWxlclNlcnZpY2VBZGRyZXNzLnRyaW0oKSxpc190cHVfbmFtZToidHB1LW5hbWUiPT10aGlzLl9wcm9maWxlclNlcnZpY2VBZGRyZXNzVHlwZSxkdXJhdGlvbjp0aGlzLl9wcm9maWxlRHVyYXRpb24sd29ya2VyX2xpc3Q6dGhpcy5fcHJvZmlsZVdvcmtlckxpc3QsaW5jbHVkZV9kYXRhc2V0X29wczp0aGlzLl9wcm9maWxlSW5jbHVkZURhdGFzZXRPcHMsbnVtX3JldHJ5OnRoaXMuX3Byb2ZpbGVOdW1SZXRyeX0pO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihjPT57dGhpcy5fY2FwdHVyaW5nUHJvZmlsZT0hMTtudWxsIT1jLmVycm9yP3RoaXMuX3Nob3dUb2FzdCgiRmFpbGVkIHRvIGNhcHR1cmUgcHJvZmlsZTogIitjLmVycm9yKTp0aGlzLl9zaG93VG9hc3QoYy5yZXN1bHQpfSkuY2F0Y2goYz0+e3RoaXMuX2NhcHR1cmluZ1Byb2ZpbGU9ITE7dGhpcy5fc2hvd1RvYXN0KCJGYWlsZWQgdG8gY2FwdHVyZSBwcm9maWxlOiAiKwpjKX0pfSxfc2hvd1RvYXN0KGEpe3RoaXMuJC50b2FzdC50ZXh0PWE7dGhpcy4kLnRvYXN0Lm9wZW4oKX0sX21heWJlSW5pdGlhbGl6ZURhc2hib2FyZDpmdW5jdGlvbihhLGMpe2lmKCF0aGlzLl9pbml0aWFsaXplZCYmYSYmYyl7dGhpcy5faW5pdGlhbGl6ZWQ9ITA7dmFyIGQ9UW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoInByb2ZpbGUiLCIvdG9vbHMiKTt0aGlzLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTowLG1zZzoiIn0pO3ZhciBmPXRoaXMsZz10Zi5wcm9maWxlLnV0aWwuZ2V0VHJhY2tlcih0aGlzKTt0Zi5wcm9maWxlLnV0aWwucnVuVGFzaygiTG9hZGluZyBkYXRhc2V0cyIsMjAsKCk9Pntjb25zb2xlLmxvZygic3RhcnQgY291bnRpbmciKTtyZXR1cm4gZi5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChkKX0sZykudGhlbihsPT50Zi5wcm9maWxlLnV0aWwucnVuVGFzaygiUHJvY2Vzc2luZyBkYXRhc2V0cyIsNzAsKCk9Pm5ldyBQcm9taXNlKGZ1bmN0aW9uKGspe2YuX3Byb2Nlc3NSdW5Ub1Rvb2wobCk7CmsobnVsbCl9KSxnKSkudGhlbigoKT0+dGYucHJvZmlsZS51dGlsLnJ1blRhc2soIkRvbmUiLDEwLCgpPT5udWxsLGcpKX19LF9wcm9jZXNzUnVuVG9Ub29sOmZ1bmN0aW9uKGEpe2E9Xy5tYXAoYSwoYyxkKT0+KHtuYW1lOmQsYWN0aXZlVG9vbHM6Y30pKTthLnNvcnQoKGMsZCk9PjAtZ24uY29tcGFyZVRhZ05hbWVzKGMubmFtZSxkLm5hbWUpKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWEubGVuZ3RoKTt0aGlzLnNldCgiX2RhdGFzZXRzIixhKX0sX2dldFNlbGVjdGVkOmZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9YSlyZXR1cm4gYyYmMDw9YSYmYTxjLmxlbmd0aD9jW2FdOm51bGx9LF9nZXRTZWxlY3RlZERhdGFzZXROYW1lOmZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9YSlyZXR1cm4gYyYmMDw9YSYmYTxjLmxlbmd0aD9jW2FdLm5hbWU6IiJ9LF9nZXRBY3RpdmVUb29sc0xpc3Q6ZnVuY3Rpb24oYSxjKXtpZihudWxsIT1hKXJldHVybiBjJiYwPD1hJiZhPGMubGVuZ3RoPyh0aGlzLnNlbGVjdGVkVG9vbEluZGV4PQowLGNbYV0uYWN0aXZlVG9vbHMpOltdfSxfbWF5YmVVcGRhdGVEYXRhOmZ1bmN0aW9uKGEpe2lmKG51bGwhPWEpe3ZhciBjPXRoaXMuX3NlbGVjdGVkRGF0YXNldE5hbWUsZD10aGlzLl9zZWxlY3RlZFRvb2xOYW1lO2lmKG51bGwhPWMmJm51bGwhPWQpaWYodGhpcy5fdG9vbEluU2NvcGU9InVuZGVmaW5lZCIsZC5zdGFydHNXaXRoKCJ0cmFjZV92aWV3ZXIiKSl7dmFyIGY9UW8uYWRkUGFyYW1zKFFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJwcm9maWxlIiwiL2RhdGEiKSx7dGFnOmQscnVuOmMsaG9zdDphfSksZz1kLmVuZHNXaXRoKCJAIik7dGhpcy5fdHJhY2VEYXRhVXJsPXRoaXMudHJhY2VWaWV3ZXJCYXNlVXJsKyI/dHJhY2VfZGF0YV91cmxceDNkIitlbmNvZGVVUklDb21wb25lbnQoZikrIlx4MjZpc19zdHJlYW1pbmdceDNkIitnO3RoaXMuX3Rvb2xJblNjb3BlPSJ0cmFjZV92aWV3ZXIifWVsc2V7dGhpcy5zZXQoInByb2dyZXNzIix7dmFsdWU6MCxtc2c6IiJ9KTtsZXQgbD0KdGhpcyxrPXRmLnByb2ZpbGUudXRpbC5nZXRUcmFja2VyKHRoaXMpO3RmLnByb2ZpbGUudXRpbC5ydW5UYXNrKCJSZWFkaW5nICIrZCsiIHRvb2wgZGF0YSIsMjAsKCk9PmwuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoUW8uYWRkUGFyYW1zKFFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJwcm9maWxlIiwiL2RhdGEiKSx7dGFnOmQsaG9zdDphLHJ1bjpjfSkpLGspLmNhdGNoKCgpPT57fSkudGhlbihuPT50Zi5wcm9maWxlLnV0aWwucnVuVGFzaygiRG9uZSIsODAsKCk9PntsLl91cGRhdGVUb29sRGF0YShkLG4pfSxrKSl9fX0sX3VwZGF0ZVRvb2xEYXRhOmZ1bmN0aW9uKGEsYyl7c3dpdGNoKGEpe2Nhc2UgIm9wX3Byb2ZpbGUiOnRoaXMuX29wUHJvZmlsZURhdGE9Yzt0aGlzLl90b29sSW5TY29wZT0ib3BfcHJvZmlsZSI7YnJlYWs7Y2FzZSAiaW5wdXRfcGlwZWxpbmVfYW5hbHl6ZXIiOnRoaXMuX2lucHV0UGlwZWxpbmVEYXRhPWM7dGhpcy5fdG9vbEluU2NvcGU9ImlucHV0X3BpcGVsaW5lX2FuYWx5emVyIjsKYnJlYWs7Y2FzZSAib3ZlcnZpZXdfcGFnZSI6dGhpcy5fb3ZlcnZpZXdQYWdlRGF0YT1jO3RoaXMuX3Rvb2xJblNjb3BlPSJvdmVydmlld19wYWdlIjticmVhaztjYXNlICJtZW1vcnlfdmlld2VyIjp0aGlzLl9tZW1vcnlWaWV3ZXJEYXRhPWM7dGhpcy5fdG9vbEluU2NvcGU9Im1lbW9yeV92aWV3ZXIiO2JyZWFrO2Nhc2UgInBvZF92aWV3ZXIiOnRoaXMuX3BvZFZpZXdlckRhdGE9Yzt0aGlzLl90b29sSW5TY29wZT0icG9kX3ZpZXdlciI7YnJlYWs7Y2FzZSAiZ29vZ2xlX2NoYXJ0X2RlbW8iOnRoaXMuX2dvb2dsZUNoYXJ0RGVtb0RhdGE9Yyx0aGlzLl90b29sSW5TY29wZT0iZ29vZ2xlX2NoYXJ0X2RlbW8ifX0sX21heWJlVXBkYXRlQWN0aXZlSG9zdHM6ZnVuY3Rpb24oYSxjKXtpZihudWxsPT1hfHxudWxsPT1jKXJldHVybiBudWxsO3RoaXMuX2FjdGl2ZUhvc3RzTGlzdD1bXTthPVFvLmFkZFBhcmFtcyhRby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgicHJvZmlsZSIsIi9ob3N0cyIpLAp7dGFnOmMscnVuOmF9KTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGEpLnRoZW4oZD0+e3RoaXMuc2V0KCJfYWN0aXZlSG9zdHNMaXN0IixkLnNvcnQoKGYsZyk9PmduLmNvbXBhcmVUYWdOYW1lcyhmLGcpKSl9KX0sX2RhdGFzZXRzQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2RhdGFzZXRzJiYodGhpcy5zZWxlY3RlZERhdGFzZXRJbmRleD0wKX0sX2FjdGl2ZVRvb2xzQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2FjdGl2ZVRvb2xzTGlzdCYmdGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuc2V0KCJzZWxlY3RlZFRvb2xJbmRleCIsLTEpO3RoaXMuc2V0KCJzZWxlY3RlZFRvb2xJbmRleCIsMCl9LmJpbmQodGhpcykpfSxfYWN0aXZlSG9zdHNDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fYWN0aXZlSG9zdHNMaXN0JiZ0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5zZXQoInNlbGVjdGVkSG9zdEluZGV4IiwtMSk7dGhpcy5zZXQoInNlbGVjdGVkSG9zdEluZGV4IiwwKX0uYmluZCh0aGlzKSl9LApfaXNDdXJyZW50VG9vbDpmdW5jdGlvbihhLGMpe3JldHVybiBhPT1jfSxfaGFzQWN0aXZlVG9vbHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYWN0aXZlVG9vbHNMaXN0JiYwPHRoaXMuX2FjdGl2ZVRvb2xzTGlzdC5sZW5ndGg/ITA6ITF9LF9nZXRIb3N0RGlzcGxheU5hbWU6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6IiI9PWE/ImRlZmF1bHQiOmEuc2xpY2UoMCwtMSl9LF9jb21wdXRlVG9wTGV2ZWxTdGF0ZTpmdW5jdGlvbihhLGMpe3JldHVybiBhPyJEQVRBX05PVF9GT1VORCI6IWN8fDEwMD5jLnZhbHVlPyJMT0FESU5HIjoiQUNUSVZFIn0sX2lzU3RhdGU6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYT09PWN9fSk7WW8ucmVnaXN0ZXJEYXNoYm9hcmQoe3BsdWdpbjoicHJvZmlsZSIsZWxlbWVudE5hbWU6InRmLXByb2ZpbGUtZGFzaGJvYXJkIixpc1JlbG9hZERpc2FibGVkOiEwfSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJlaG9sZGVyLWRhc2hib2FyZC90Zi1iZWhvbGRlci12aWRlby5odG1sLmpzCihmdW5jdGlvbigpe2NvbnN0IGE9UW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImJlaG9sZGVyIiwiL2JlaG9sZGVyLWZyYW1lIiksYz1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYmVob2xkZXIiLCIvcGluZyIpO1BvbHltZXIoe2lzOiJ0Zi1iZWhvbGRlci12aWRlbyIscHJvcGVydGllczp7ZnBzOnt0eXBlOk51bWJlcix2YWx1ZToxMCxvYnNlcnZlcjoiX2Zwc0NoYW5nZWQifSxwaW5nU2xlZXA6e3R5cGU6TnVtYmVyLHZhbHVlOjFFM30seGhyVGltZW91dDp7dHlwZTpOdW1iZXIsdmFsdWU6MjUwMH0sX2ltYWdlVVJMOnt0eXBlOlN0cmluZyx2YWx1ZToiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBRC9BQ3dBQUFBQUFRQUJBQUFDQURzXHgzZCJ9LF94aHI6T2JqZWN0LF90aW1lcjpOdW1iZXIsX2lzRGVhZDpCb29sZWFufSxhdHRhY2hlZCgpe3RoaXMuc2V0KCJfaW1hZ2VVUkwiLGEpO3RoaXMuX3BpbmcoKX0sZGV0YWNoZWQoKXt0aGlzLl9jbGVhcigpOwp0aGlzLnNldCgiX2ltYWdlVVJMIiwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBRC9BQ3dBQUFBQUFRQUJBQUFDQURzXHgzZCIpfSxfcGluZygpe3RoaXMuX2NsZWFyKCk7dGhpcy5feGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt0aGlzLl94aHIub3BlbigiR0VUIixjLCEwKTt0aGlzLl94aHIudGltZW91dD10aGlzLnhoclRpbWVvdXQ7dGhpcy5feGhyLm9ubG9hZD10aGlzLl9vblBpbmdMb2FkLmJpbmQodGhpcyk7dGhpcy5feGhyLm9uZXJyb3I9dGhpcy5fb25QaW5nLmJpbmQodGhpcywhMSx0aGlzLnBpbmdTbGVlcCk7dGhpcy5feGhyLm9udGltZW91dD10aGlzLl9vblBpbmcuYmluZCh0aGlzLCExLDEpO3RoaXMuX3hoci5zZW5kKG51bGwpfSxfb25QaW5nTG9hZCgpe2lmKDIwMD09dGhpcy5feGhyLnN0YXR1cyl7Y29uc3QgZD1KU09OLnBhcnNlKHRoaXMuX3hoci5yZXNwb25zZVRleHQpO3RoaXMuX29uUGluZygiYWxpdmUiPT1kLnN0YXR1cyx0aGlzLnBpbmdTbGVlcCl9ZWxzZSB0aGlzLl9vblBpbmcoITEsCnRoaXMucGluZ1NsZWVwKX0sX29uUGluZyhkLGYpe2QmJnRoaXMuX2lzRGVhZCYmdGhpcy5zZXQoIl9pbWFnZVVSTCIsYSsiP3RceDNkIisobmV3IERhdGUpLmdldFRpbWUoKSk7dGhpcy5faXNEZWFkPSFkO3RoaXMuX3RpbWVyPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT50aGlzLl9waW5nKCksZil9LF9jbGVhcigpe3RoaXMuX3RpbWVyJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLl90aW1lciksdGhpcy5fdGltZXI9bnVsbCk7dGhpcy5feGhyJiYodGhpcy5feGhyLnJlYWR5U3RhdGU8WE1MSHR0cFJlcXVlc3QuRE9ORSYmdGhpcy5feGhyLmFib3J0KCksdGhpcy5feGhyPW51bGwpfSxfZnBzQ2hhbmdlZChkLGYpezA9PWQ/dGhpcy5fY2xlYXIoKTowPT1mJiZ0aGlzLl9waW5nKCl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJlaG9sZGVyLWRhc2hib2FyZC90Zi1iZWhvbGRlci1pbmZvLmh0bWwuanMKKGZ1bmN0aW9uKCl7Y29uc3QgYT1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYmVob2xkZXIiLCIvc2VjdGlvbi1pbmZvIik7UG9seW1lcih7aXM6InRmLWJlaG9sZGVyLWluZm8iLHByb3BlcnRpZXM6e2Zwczp7dHlwZTpOdW1iZXIsdmFsdWU6MTAsb2JzZXJ2ZXI6Il9mcHNDaGFuZ2VkIn0seGhyVGltZW91dDp7dHlwZTpOdW1iZXIsdmFsdWU6MUU0fSxfaXRlbXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9Plt7bmFtZToiTG9hZGluZy4uLiJ9XX0sX3hocjpPYmplY3QsX3RpbWVyOk51bWJlcn0sYXR0YWNoZWQoKXt0aGlzLl9sb2FkKCl9LGRldGFjaGVkKCl7dGhpcy5fY2xlYXIoKX0sX2xvYWQoKXt0aGlzLl9jbGVhcigpO3RoaXMuX3hocj1uZXcgWE1MSHR0cFJlcXVlc3Q7dGhpcy5feGhyLm9wZW4oIkdFVCIsYSwhMCk7dGhpcy5feGhyLnRpbWVvdXQ9dGhpcy54aHJUaW1lb3V0O3RoaXMuX3hoci5vbmxvYWQ9dGhpcy5fb25Mb2FkLmJpbmQodGhpcyk7dGhpcy5feGhyLm9uZXJyb3I9CnRoaXMuX3JldHJ5LmJpbmQodGhpcyx0aGlzLl9nZXRTbGVlcCgpKTt0aGlzLl94aHIub250aW1lb3V0PXRoaXMuX3JldHJ5LmJpbmQodGhpcywxKTt0aGlzLl94aHIuc2VuZChudWxsKX0sX29uTG9hZCgpe2lmKDIwMD09dGhpcy5feGhyLnN0YXR1cyl7Y29uc3QgYz1KU09OLnBhcnNlKHRoaXMuX3hoci5yZXNwb25zZVRleHQpO2NvbnNvbGUuYXNzZXJ0KEFycmF5LmlzQXJyYXkoYyksIkV4cGVjdGVkIHJlc3BvbnNlIHRvIGJlIGluIGFuIGFycmF5Iik7dGhpcy5faXRlbXM9Y310aGlzLl9yZXRyeSh0aGlzLl9nZXRTbGVlcCgpKX0sX3JldHJ5KGMpe3RoaXMuX3RpbWVyPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuX2xvYWQuYmluZCh0aGlzKSxjKX0sX2dldFNsZWVwKCl7cmV0dXJuIDFFMy8oMD09PXRoaXMuZnBzPzE6dGhpcy5mcHMpfSxfY2xlYXIoKXt0aGlzLl90aW1lciYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fdGltZXIpLHRoaXMuX3RpbWVyPW51bGwpO3RoaXMuX3hociYmCih0aGlzLl94aHIucmVhZHlTdGF0ZTxYTUxIdHRwUmVxdWVzdC5ET05FJiZ0aGlzLl94aHIuYWJvcnQoKSx0aGlzLl94aHI9bnVsbCl9LF9mcHNDaGFuZ2VkKGMsZCl7MD09Yz90aGlzLl9jbGVhcigpOjA9PWQmJnRoaXMuX2xvYWQoKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmVob2xkZXItZGFzaGJvYXJkL3RmLWJlaG9sZGVyLWRhc2hib2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1iZWhvbGRlci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBRby5SZXF1ZXN0TWFuYWdlcigxMCwwKX0sX2lzQXZhaWxhYmxlOkJvb2xlYW4sX3ZhbHVlczp7dHlwZTpTdHJpbmcsdmFsdWU6InRyYWluYWJsZV92YXJpYWJsZXMiLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9tb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToidmFyaWFuY2UiLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9zY2FsaW5nOnt0eXBlOlN0cmluZyx2YWx1ZToibGF5ZXIiLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF93aW5kb3dTaXplOnt0eXBlOk51bWJlcix2YWx1ZToxNSxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifSxfcHJldmlvdXNGUFM6e3R5cGU6TnVtYmVyLHZhbHVlOjMwfSxfRlBTOnt0eXBlOk51bWJlcix2YWx1ZToxMCxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifSwKX3JlY29yZFRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGFydCByZWNvcmRpbmcifSxfaXNSZWNvcmRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifSxfc2hvd0FsbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9jb2xvcm1hcDp7dHlwZTpTdHJpbmcsdmFsdWU6Im1hZ21hIixvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifSxfaXNfYWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX2NvbnRyb2xzX2Rpc2FibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn19LF92YWx1ZXNOb3RGcmFtZShhKXtyZXR1cm4iZnJhbWVzIiE9PWF9LF92YXJpYW5jZVNlbGVjdGVkKGEpe3JldHVybiJ2YXJpYW5jZSI9PT1hfSxfY29uZmlnQ2hhbmdlZCgpe2lmKHRoaXMuX2lzX2FjdGl2ZSYmIXRoaXMuX2NvbnRyb2xzX2Rpc2FibGVkKXt2YXIgYT0KW3RoaXMuX3ZhbHVlcyx0aGlzLl9tb2RlLHRoaXMuX3NjYWxpbmcsdGhpcy5fd2luZG93U2l6ZSx0aGlzLl9GUFMsdGhpcy5faXNSZWNvcmRpbmcsdGhpcy5fc2hvd0FsbCx0aGlzLl9jb2xvcm1hcF0sYztmb3IoYyBvZiBhKWlmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGN8fCIiPT09YylyZXR1cm47YT1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYmVob2xkZXIiLCIvY2hhbmdlLWNvbmZpZyIpO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSx7dmFsdWVzOnRoaXMuX3ZhbHVlcyxtb2RlOnRoaXMuX21vZGUsc2NhbGluZzp0aGlzLl9zY2FsaW5nLHdpbmRvd19zaXplOnRoaXMuX3dpbmRvd1NpemUsRlBTOnRoaXMuX0ZQUyxpc19yZWNvcmRpbmc6dGhpcy5faXNSZWNvcmRpbmcsc2hvd19hbGw6dGhpcy5fc2hvd0FsbCxjb2xvcm1hcDp0aGlzLl9jb2xvcm1hcH0pfX0sX3RvZ2dsZVJlY29yZCgpeyJzdGFydCByZWNvcmRpbmciPT10aGlzLl9yZWNvcmRUZXh0Pyh0aGlzLnNldCgiX3JlY29yZFRleHQiLAoic3RvcCByZWNvcmRpbmciKSx0aGlzLnNldCgiX2lzUmVjb3JkaW5nIiwhMCkpOih0aGlzLnNldCgiX3JlY29yZFRleHQiLCJzdGFydCByZWNvcmRpbmciKSx0aGlzLnNldCgiX2lzUmVjb3JkaW5nIiwhMSkpO3RoaXMuJC5yZWNvcmRfYnV0dG9uLmNsYXNzTGlzdC50b2dnbGUoImlzLXJlY29yZGluZyIpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoUW8uZ2V0Um91dGVyKCkucGx1Z2luc0xpc3RpbmcoKSkudGhlbihhPT57ImJlaG9sZGVyImluIGE/KHRoaXMuJC5pbml0aWFsRGlhbG9nLmNsb3NlRGlhbG9nKCksdGhpcy5zZXQoIl9pc0F2YWlsYWJsZSIsITApKToodGhpcy4kLmluaXRpYWxEaWFsb2cub3Blbk5vVGVuc29yRmxvd0RpYWxvZygpLHRoaXMuc2V0KCJfaXNBdmFpbGFibGUiLCExKSl9KX0scmVhZHkoKXt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXtpZih0aGlzLl9pc0F2YWlsYWJsZSl7Y29uc3QgYT1Rby5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYmVob2xkZXIiLAoiL2lzLWFjdGl2ZSIpO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSkudGhlbihjPT57dGhpcy5zZXQoIl9pc19hY3RpdmUiLGMuaXNfYWN0aXZlKTt0aGlzLnNldCgiX2NvbnRyb2xzX2Rpc2FibGVkIiwhYy5pc19jb25maWdfd3JpdGFibGUpfSl9fX0pO1lvLnJlZ2lzdGVyRGFzaGJvYXJkKHtwbHVnaW46ImJlaG9sZGVyIixlbGVtZW50TmFtZToidGYtYmVob2xkZXItZGFzaGJvYXJkIixzaG91bGRSZW1vdmVEb206ITB9KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1wYWdlcy9pcm9uLXBhZ2VzLmh0bWwuanMKUG9seW1lcih7aXM6Imlyb24tcGFnZXMiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3IsUG9seW1lci5Jcm9uU2VsZWN0YWJsZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOnthY3RpdmF0ZUV2ZW50Ont0eXBlOlN0cmluZyx2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX3NlbGVjdGVkUGFnZUNoYW5nZWQoc2VsZWN0ZWQpIl0sX3NlbGVjdGVkUGFnZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmFzeW5jKHRoaXMubm90aWZ5UmVzaXplKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10YWJzL3BhcGVyLXRhYi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10YWIiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLFBvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvcl0scHJvcGVydGllczp7bGluazp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJ0YWIifSxsaXN0ZW5lcnM6e2Rvd246Il91cGRhdGVOb2luayIsdGFwOiJfb25UYXAifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZU5vaW5rKCl9LGdldCBfcGFyZW50Tm9pbmsoKXt2YXIgYT1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlO3JldHVybiEhYSYmISFhLm5vaW5rfSxfdXBkYXRlTm9pbms6ZnVuY3Rpb24oKXt0aGlzLm5vaW5rPSEhdGhpcy5ub2lua3x8ISF0aGlzLl9wYXJlbnROb2lua30sX29uVGFwOmZ1bmN0aW9uKGEpe2lmKHRoaXMubGluayl7dmFyIGM9dGhpcy5xdWVyeUVmZmVjdGl2ZUNoaWxkcmVuKCJhIik7CmMmJmEudGFyZ2V0IT09YyYmYy5jbGljaygpfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10YWJzL3BhcGVyLXRhYnMuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdGFicyIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcixQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JdLHByb3BlcnRpZXM6e25vaW5rOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9ub2lua0NoYW5nZWQifSxub0Jhcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub1NsaWRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNjcm9sbGFibGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZml0Q29udGFpbmVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGRpc2FibGVEcmFnOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGhpZGVTY3JvbGxCdXR0b25zOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGFsaWduQm90dG9tOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNlbGVjdGFibGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJwYXBlci10YWIifSxhdXRvc2VsZWN0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGF1dG9zZWxlY3REZWxheTp7dHlwZTpOdW1iZXIsCnZhbHVlOjB9LF9zdGVwOnt0eXBlOk51bWJlcix2YWx1ZToxMH0sX2hvbGREZWxheTp7dHlwZTpOdW1iZXIsdmFsdWU6MX0sX2xlZnRIaWRkZW46e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3JpZ2h0SGlkZGVuOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9wcmV2aW91c1RhYjp7dHlwZTpPYmplY3R9fSxob3N0QXR0cmlidXRlczp7cm9sZToidGFibGlzdCJ9LGxpc3RlbmVyczp7Imlyb24tcmVzaXplIjoiX29uVGFiU2l6aW5nQ2hhbmdlZCIsImlyb24taXRlbXMtY2hhbmdlZCI6Il9vblRhYlNpemluZ0NoYW5nZWQiLCJpcm9uLXNlbGVjdCI6Il9vbklyb25TZWxlY3QiLCJpcm9uLWRlc2VsZWN0IjoiX29uSXJvbkRlc2VsZWN0In0sa2V5QmluZGluZ3M6eyJsZWZ0OmtleXVwIHJpZ2h0OmtleXVwIjoiX29uQXJyb3dLZXl1cCJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9ob2xkSm9iPW51bGw7dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT0Kdm9pZCAwO3RoaXMuX2JpbmREZWxheWVkQWN0aXZhdGlvbkhhbmRsZXI9dGhpcy5fZGVsYXllZEFjdGl2YXRpb25IYW5kbGVyLmJpbmQodGhpcyk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9vbkJsdXJDYXB0dXJlLmJpbmQodGhpcyksITApfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2V0U2Nyb2xsRGlyZWN0aW9uKCJ5Iix0aGlzLiQudGFic0NvbnRhaW5lcil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fY2FuY2VsUGVuZGluZ0FjdGl2YXRpb24oKX0sX25vaW5rQ2hhbmdlZDpmdW5jdGlvbihhKXtQb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yQWxsKCJwYXBlci10YWIiKS5mb3JFYWNoKGE/dGhpcy5fc2V0Tm9pbmtBdHRyaWJ1dGU6dGhpcy5fcmVtb3ZlTm9pbmtBdHRyaWJ1dGUpfSxfc2V0Tm9pbmtBdHRyaWJ1dGU6ZnVuY3Rpb24oYSl7YS5zZXRBdHRyaWJ1dGUoIm5vaW5rIiwiIil9LF9yZW1vdmVOb2lua0F0dHJpYnV0ZTpmdW5jdGlvbihhKXthLnJlbW92ZUF0dHJpYnV0ZSgibm9pbmsiKX0sCl9jb21wdXRlU2Nyb2xsQnV0dG9uQ2xhc3M6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiFjfHxkPyJoaWRkZW4iOmE/Im5vdC12aXNpYmxlIjoiIn0sX2NvbXB1dGVUYWJzQ29udGVudENsYXNzOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGE/InNjcm9sbGFibGUiKyhjPyIgZml0LWNvbnRhaW5lciI6IiIpOiIgZml0LWNvbnRhaW5lciJ9LF9jb21wdXRlU2VsZWN0aW9uQmFyQ2xhc3M6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYT8iaGlkZGVuIjpjPyJhbGlnbi1ib3R0b20iOiIifSxfb25UYWJTaXppbmdDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kZWJvdW5jZSgiX29uVGFiU2l6aW5nQ2hhbmdlZCIsZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGwoKTt0aGlzLl90YWJDaGFuZ2VkKHRoaXMuc2VsZWN0ZWRJdGVtKX0sMTApfSxfb25Jcm9uU2VsZWN0OmZ1bmN0aW9uKGEpe3RoaXMuX3RhYkNoYW5nZWQoYS5kZXRhaWwuaXRlbSx0aGlzLl9wcmV2aW91c1RhYik7dGhpcy5fcHJldmlvdXNUYWI9YS5kZXRhaWwuaXRlbTsKdGhpcy5jYW5jZWxEZWJvdW5jZXIoInRhYi1jaGFuZ2VkIil9LF9vbklyb25EZXNlbGVjdDpmdW5jdGlvbigpe3RoaXMuZGVib3VuY2UoInRhYi1jaGFuZ2VkIixmdW5jdGlvbigpe3RoaXMuX3RhYkNoYW5nZWQobnVsbCx0aGlzLl9wcmV2aW91c1RhYik7dGhpcy5fcHJldmlvdXNUYWI9bnVsbH0sMSl9LF9hY3RpdmF0ZUhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpO1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX2FjdGl2YXRlSGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9zY2hlZHVsZUFjdGl2YXRpb246ZnVuY3Rpb24oYSxjKXt0aGlzLl9wZW5kaW5nQWN0aXZhdGlvbkl0ZW09YTt0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQ9dGhpcy5hc3luYyh0aGlzLl9iaW5kRGVsYXllZEFjdGl2YXRpb25IYW5kbGVyLGMpfSxfZGVsYXllZEFjdGl2YXRpb25IYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtOwp0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQ9dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtPXZvaWQgMDthLmZpcmUodGhpcy5hY3RpdmF0ZUV2ZW50LG51bGwse2J1YmJsZXM6ITAsY2FuY2VsYWJsZTohMH0pfSxfY2FuY2VsUGVuZGluZ0FjdGl2YXRpb246ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uVGltZW91dCksdGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT12b2lkIDApfSxfb25BcnJvd0tleXVwOmZ1bmN0aW9uKCl7dGhpcy5hdXRvc2VsZWN0JiZ0aGlzLl9zY2hlZHVsZUFjdGl2YXRpb24odGhpcy5mb2N1c2VkSXRlbSx0aGlzLmF1dG9zZWxlY3REZWxheSl9LF9vbkJsdXJDYXB0dXJlOmZ1bmN0aW9uKGEpe2EudGFyZ2V0PT09dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtJiZ0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpfSwKZ2V0IF90YWJDb250YWluZXJTY3JvbGxTaXplKCl7cmV0dXJuIE1hdGgubWF4KDAsdGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsV2lkdGgtdGhpcy4kLnRhYnNDb250YWluZXIub2Zmc2V0V2lkdGgpfSxfc2Nyb2xsOmZ1bmN0aW9uKGEsYyl7dGhpcy5zY3JvbGxhYmxlJiZ0aGlzLl9hZmZlY3RTY3JvbGwoYyYmLWMuZGR4fHwwKX0sX2Rvd246ZnVuY3Rpb24oKXt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fZGVmYXVsdEZvY3VzQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jKSx0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYz1udWxsKX0sMSl9LF9hZmZlY3RTY3JvbGw6ZnVuY3Rpb24oYSl7dGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdCs9YTthPXRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQ7dGhpcy5fbGVmdEhpZGRlbj0wPT09YTt0aGlzLl9yaWdodEhpZGRlbj1hPT09dGhpcy5fdGFiQ29udGFpbmVyU2Nyb2xsU2l6ZX0sCl9vbkxlZnRTY3JvbGxCdXR0b25Eb3duOmZ1bmN0aW9uKCl7dGhpcy5fc2Nyb2xsVG9MZWZ0KCk7dGhpcy5faG9sZEpvYj1zZXRJbnRlcnZhbCh0aGlzLl9zY3JvbGxUb0xlZnQuYmluZCh0aGlzKSx0aGlzLl9ob2xkRGVsYXkpfSxfb25SaWdodFNjcm9sbEJ1dHRvbkRvd246ZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGxUb1JpZ2h0KCk7dGhpcy5faG9sZEpvYj1zZXRJbnRlcnZhbCh0aGlzLl9zY3JvbGxUb1JpZ2h0LmJpbmQodGhpcyksdGhpcy5faG9sZERlbGF5KX0sX29uU2Nyb2xsQnV0dG9uVXA6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKHRoaXMuX2hvbGRKb2IpO3RoaXMuX2hvbGRKb2I9bnVsbH0sX3Njcm9sbFRvTGVmdDpmdW5jdGlvbigpe3RoaXMuX2FmZmVjdFNjcm9sbCgtdGhpcy5fc3RlcCl9LF9zY3JvbGxUb1JpZ2h0OmZ1bmN0aW9uKCl7dGhpcy5fYWZmZWN0U2Nyb2xsKHRoaXMuX3N0ZXApfSxfdGFiQ2hhbmdlZDpmdW5jdGlvbihhLGMpe2lmKGEpe3ZhciBkPXRoaXMuJC50YWJzQ29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKZj1kLndpZHRoLGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtkPWcubGVmdC1kLmxlZnQ7dGhpcy5fcG9zPXt3aWR0aDp0aGlzLl9jYWxjUGVyY2VudChnLndpZHRoLGYpLGxlZnQ6dGhpcy5fY2FsY1BlcmNlbnQoZCxmKX07aWYodGhpcy5ub1NsaWRlfHxudWxsPT1jKXRoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LnJlbW92ZSgiZXhwYW5kIiksdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCJjb250cmFjdCIpLHRoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX3Bvcy53aWR0aCx0aGlzLl9wb3MubGVmdCk7ZWxzZXt2YXIgbD1jLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2M9dGhpcy5pdGVtcy5pbmRleE9mKGMpO2E9dGhpcy5pdGVtcy5pbmRleE9mKGEpO3RoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LmFkZCgiZXhwYW5kIik7YT1jPGE7dGhpcy5faXNSVEwmJihhPSFhKTthP3RoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX2NhbGNQZXJjZW50KGcubGVmdCtnLndpZHRoLQpsLmxlZnQsZiktNSx0aGlzLl9sZWZ0KTp0aGlzLl9wb3NpdGlvbkJhcih0aGlzLl9jYWxjUGVyY2VudChsLmxlZnQrbC53aWR0aC1nLmxlZnQsZiktNSx0aGlzLl9jYWxjUGVyY2VudChkLGYpKzUpO3RoaXMuc2Nyb2xsYWJsZSYmdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZElmTmVlZGVkKGcud2lkdGgsZCl9fWVsc2UgdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCJleHBhbmQiKSx0aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdC5yZW1vdmUoImNvbnRyYWN0IiksdGhpcy5fcG9zaXRpb25CYXIoMCwwKX0sX3Njcm9sbFRvU2VsZWN0ZWRJZk5lZWRlZDpmdW5jdGlvbihhLGMpe2MtPXRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQ7MD5jP3RoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQrPWM6KGMrPWEtdGhpcy4kLnRhYnNDb250YWluZXIub2Zmc2V0V2lkdGgsMDxjJiYodGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdCs9YykpfSxfY2FsY1BlcmNlbnQ6ZnVuY3Rpb24oYSwKYyl7cmV0dXJuIDEwMCphL2N9LF9wb3NpdGlvbkJhcjpmdW5jdGlvbihhLGMpe2E9YXx8MDtjPWN8fDA7dGhpcy5fd2lkdGg9YTt0aGlzLl9sZWZ0PWM7dGhpcy50cmFuc2Zvcm0oInRyYW5zbGF0ZVgoIitjKyIlKSBzY2FsZVgoIithLzEwMCsiKSIsdGhpcy4kLnNlbGVjdGlvbkJhcil9LF9vbkJhclRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdDthLmNvbnRhaW5zKCJleHBhbmQiKT8oYS5yZW1vdmUoImV4cGFuZCIpLGEuYWRkKCJjb250cmFjdCIpLHRoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX3Bvcy53aWR0aCx0aGlzLl9wb3MubGVmdCkpOmEuY29udGFpbnMoImNvbnRyYWN0IikmJmEucmVtb3ZlKCJjb250cmFjdCIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWludGVyYWN0aXZlLWluZmVyZW5jZS1kYXNoYm9hcmQvdGYtaW5mZXJlbmNlLXBhbmVsLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWluZmVyZW5jZS1wYW5lbCIscHJvcGVydGllczp7ZXhhbXBsZXNQYXRoOnt0eXBlOlN0cmluZyx2YWx1ZTpUby5nZXRTdHJpbmdJbml0aWFsaXplcigiZXhhbXBsZXNQYXRoIix7ZGVmYXVsdFZhbHVlOiIifSksb2JzZXJ2ZXI6ImV4YW1wbGVzUGF0aENoYW5nZWRfIixub3RpZnk6ITB9LGhpZGVNb2RlbFBhbmUyOnt0eXBlOkJvb2xlYW4sdmFsdWU6VG8uZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJoaWRlTW9kZWxQYW5lMiIse2RlZmF1bHRWYWx1ZTohMH0pLG9ic2VydmVyOiJoaWRlTW9kZWxQYW5lMkNoYW5nZWRfIn0sbW9kZWxOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZToiIixub3RpZnk6ITB9LG1vZGVsTmFtZTE6e3R5cGU6U3RyaW5nLHZhbHVlOlRvLmdldFN0cmluZ0luaXRpYWxpemVyKCJtb2RlbE5hbWUxIix7ZGVmYXVsdFZhbHVlOiIifSksb2JzZXJ2ZXI6Im1vZGVsTmFtZTFDaGFuZ2VkXyIsbm90aWZ5OiEwfSxtb2RlbE5hbWUyOnt0eXBlOlN0cmluZywKdmFsdWU6VG8uZ2V0U3RyaW5nSW5pdGlhbGl6ZXIoIm1vZGVsTmFtZTIiLHtkZWZhdWx0VmFsdWU6IiJ9KSxvYnNlcnZlcjoibW9kZWxOYW1lMkNoYW5nZWRfIixub3RpZnk6ITB9LGluZmVyZW5jZUFkZHJlc3M6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0saW5mZXJlbmNlQWRkcmVzczE6e3R5cGU6U3RyaW5nLHZhbHVlOlRvLmdldFN0cmluZ0luaXRpYWxpemVyKCJpbmZlcmVuY2VBZGRyZXNzMSIse2RlZmF1bHRWYWx1ZToiIn0pLG9ic2VydmVyOiJpbmZlcmVuY2VBZGRyZXNzMUNoYW5nZWRfIixub3RpZnk6ITB9LGluZmVyZW5jZUFkZHJlc3MyOnt0eXBlOlN0cmluZyx2YWx1ZTpUby5nZXRTdHJpbmdJbml0aWFsaXplcigiaW5mZXJlbmNlQWRkcmVzczIiLHtkZWZhdWx0VmFsdWU6IiJ9KSxvYnNlcnZlcjoiaW5mZXJlbmNlQWRkcmVzczJDaGFuZ2VkXyIsbm90aWZ5OiEwfSxtb2RlbFR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOlRvLmdldFN0cmluZ0luaXRpYWxpemVyKCJtb2RlbFR5cGUiLAp7ZGVmYXVsdFZhbHVlOiJjbGFzc2lmaWNhdGlvbiJ9KSxvYnNlcnZlcjoibW9kZWxUeXBlQ2hhbmdlZF8iLG5vdGlmeTohMH0sbW9kZWxWZXJzaW9uOnt0eXBlOlN0cmluZyx2YWx1ZToiIixub3RpZnk6ITB9LG1vZGVsVmVyc2lvbjE6e3R5cGU6U3RyaW5nLHZhbHVlOlRvLmdldFN0cmluZ0luaXRpYWxpemVyKCJtb2RlbFZlcnNpb24xIix7ZGVmYXVsdFZhbHVlOiIifSksb2JzZXJ2ZXI6Im1vZGVsVmVyc2lvbjFDaGFuZ2VkXyIsbm90aWZ5OiEwfSxtb2RlbFZlcnNpb24yOnt0eXBlOlN0cmluZyx2YWx1ZTpUby5nZXRTdHJpbmdJbml0aWFsaXplcigibW9kZWxWZXJzaW9uMiIse2RlZmF1bHRWYWx1ZToiIn0pLG9ic2VydmVyOiJtb2RlbFZlcnNpb24yQ2hhbmdlZF8iLG5vdGlmeTohMH0sbW9kZWxTaWduYXR1cmU6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0sbW9kZWxTaWduYXR1cmUxOnt0eXBlOlN0cmluZyx2YWx1ZTpUby5nZXRTdHJpbmdJbml0aWFsaXplcigibW9kZWxTaWduYXR1cmUxIiwKe2RlZmF1bHRWYWx1ZToiIn0pLG9ic2VydmVyOiJtb2RlbFNpZ25hdHVyZTFDaGFuZ2VkXyIsbm90aWZ5OiEwfSxtb2RlbFNpZ25hdHVyZTI6e3R5cGU6U3RyaW5nLHZhbHVlOlRvLmdldFN0cmluZ0luaXRpYWxpemVyKCJtb2RlbFNpZ25hdHVyZTIiLHtkZWZhdWx0VmFsdWU6IiJ9KSxvYnNlcnZlcjoibW9kZWxTaWduYXR1cmUyQ2hhbmdlZF8iLG5vdGlmeTohMH0sbWF4RXhhbXBsZXM6e3R5cGU6TnVtYmVyLHZhbHVlOlRvLmdldFN0cmluZ0luaXRpYWxpemVyKCJtYXhFeGFtcGxlcyIse2RlZmF1bHRWYWx1ZToiMTAwMCJ9KSxvYnNlcnZlcjoibWF4RXhhbXBsZXNDaGFuZ2VkXyIsbm90aWZ5OiEwfSxsYWJlbFZvY2FiUGF0aDp7dHlwZTpTdHJpbmcsdmFsdWU6VG8uZ2V0U3RyaW5nSW5pdGlhbGl6ZXIoImxhYmVsVm9jYWJQYXRoIix7ZGVmYXVsdFZhbHVlOiIifSksb2JzZXJ2ZXI6ImxhYmVsVm9jYWJQYXRoQ2hhbmdlZF8iLG5vdGlmeTohMH0sbXVsdGlDbGFzczp7dHlwZTpCb29sZWFuLApub3RpZnk6ITAsdmFsdWU6VG8uZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJtdWx0aUNsYXNzIix7ZGVmYXVsdFZhbHVlOiExfSksb2JzZXJ2ZXI6Im11bHRpQ2xhc3NDaGFuZ2VkXyJ9LHNlcXVlbmNlRXhhbXBsZXM6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAsdmFsdWU6VG8uZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJzZXF1ZW5jZUV4YW1wbGVzIix7ZGVmYXVsdFZhbHVlOiExfSksb2JzZXJ2ZXI6InNlcXVlbmNlRXhhbXBsZXNDaGFuZ2VkXyJ9LG1heENsYXNzZXNUb0Rpc3BsYXk6e3R5cGU6TnVtYmVyLHZhbHVlOlRvLmdldFN0cmluZ0luaXRpYWxpemVyKCJtYXhDbGFzc2VzVG9EaXNwbGF5Iix7ZGVmYXVsdFZhbHVlOiI1In0pLG9ic2VydmVyOiJtYXhDbGFzc2VzVG9EaXNwbGF5Q2hhbmdlZF8iLG5vdGlmeTohMH0sc2FtcGxpbmdPZGRzOnt0eXBlOk51bWJlcix2YWx1ZTpUby5nZXRTdHJpbmdJbml0aWFsaXplcigic2FtcGxpbmdPZGRzIix7ZGVmYXVsdFZhbHVlOiIxIn0pLG9ic2VydmVyOiJzYW1wbGluZ09kZHNDaGFuZ2VkXyIsCm5vdGlmeTohMH0sdXNlUHJlZGljdEFwaTp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTpUby5nZXRCb29sZWFuSW5pdGlhbGl6ZXIoInVzZVByZWRpY3RBcGkiLHtkZWZhdWx0VmFsdWU6ITF9KSxvYnNlcnZlcjoidXNlUHJlZGljdEFwaUNoYW5nZWRfIn0scHJlZGljdElucHV0VGVuc29yOnt0eXBlOlN0cmluZyx2YWx1ZTpUby5nZXRTdHJpbmdJbml0aWFsaXplcigicHJlZGljdElucHV0VGVuc29yIix7ZGVmYXVsdFZhbHVlOiJleGFtcGxlcyJ9KSxvYnNlcnZlcjoicHJlZGljdElucHV0VGVuc29yQ2hhbmdlZF8iLG5vdGlmeTohMH0scHJlZGljdE91dHB1dFRlbnNvcjp7dHlwZTpTdHJpbmcsdmFsdWU6VG8uZ2V0U3RyaW5nSW5pdGlhbGl6ZXIoInByZWRpY3RPdXRwdXRUZW5zb3IiLHtkZWZhdWx0VmFsdWU6InByb2JhYmlsaXRpZXMifSksb2JzZXJ2ZXI6InByZWRpY3RPdXRwdXRUZW5zb3JDaGFuZ2VkXyIsbm90aWZ5OiEwfX0sb2JzZXJ2ZXJzOlsidXBkYXRlTW9kZWxOYW1lKG1vZGVsTmFtZTEsIG1vZGVsTmFtZTIpIiwKInVwZGF0ZUluZmVyZW5jZUFkZHJlc3MoaW5mZXJlbmNlQWRkcmVzczEsIGluZmVyZW5jZUFkZHJlc3MyKSIsInVwZGF0ZU1vZGVsVmVyc2lvbihtb2RlbFZlcnNpb24xLCBtb2RlbFZlcnNpb24yKSIsInVwZGF0ZU1vZGVsU2lnbmF0dXJlKG1vZGVsU2lnbmF0dXJlMSwgbW9kZWxTaWduYXR1cmUyKSJdLHVwZGF0ZU1vZGVsTmFtZTpmdW5jdGlvbihhLGMpe3RoaXMubW9kZWxOYW1lPWErIiwiK2M7dGhpcy5tb2RlbE5hbWU9dGhpcy5tb2RlbE5hbWUucmVwbGFjZSgvKF4sKXwoLCQpL2csIiIpfSx1cGRhdGVJbmZlcmVuY2VBZGRyZXNzOmZ1bmN0aW9uKGEsYyl7dGhpcy5pbmZlcmVuY2VBZGRyZXNzPWErIiwiK2M7dGhpcy5pbmZlcmVuY2VBZGRyZXNzPXRoaXMuaW5mZXJlbmNlQWRkcmVzcy5yZXBsYWNlKC8oXiwpfCgsJCkvZywiIil9LHVwZGF0ZU1vZGVsVmVyc2lvbjpmdW5jdGlvbihhLGMpe3RoaXMubW9kZWxWZXJzaW9uPWErIiwiK2N9LHVwZGF0ZU1vZGVsU2lnbmF0dXJlOmZ1bmN0aW9uKGEsCmMpe3RoaXMubW9kZWxTaWduYXR1cmU9YSsiLCIrY30sYWRkTW9kZWxDbGlja2VkXzpmdW5jdGlvbigpe3RoaXMuaGlkZU1vZGVsUGFuZTI9IXRoaXMuaGlkZU1vZGVsUGFuZTJ9LGV4YW1wbGVzUGF0aENoYW5nZWRfOlRvLmdldFN0cmluZ09ic2VydmVyKCJleGFtcGxlc1BhdGgiLHtkZWZhdWx0VmFsdWU6IiJ9KSxtb2RlbE5hbWUxQ2hhbmdlZF86VG8uZ2V0U3RyaW5nT2JzZXJ2ZXIoIm1vZGVsTmFtZTEiLHtkZWZhdWx0VmFsdWU6IiJ9KSxtb2RlbE5hbWUyQ2hhbmdlZF86VG8uZ2V0U3RyaW5nT2JzZXJ2ZXIoIm1vZGVsTmFtZTIiLHtkZWZhdWx0VmFsdWU6IiJ9KSxpbmZlcmVuY2VBZGRyZXNzMUNoYW5nZWRfOlRvLmdldFN0cmluZ09ic2VydmVyKCJpbmZlcmVuY2VBZGRyZXNzMSIse2RlZmF1bHRWYWx1ZToiIn0pLGluZmVyZW5jZUFkZHJlc3MyQ2hhbmdlZF86VG8uZ2V0U3RyaW5nT2JzZXJ2ZXIoImluZmVyZW5jZUFkZHJlc3MyIix7ZGVmYXVsdFZhbHVlOiIifSksbW9kZWxUeXBlQ2hhbmdlZF86VG8uZ2V0U3RyaW5nT2JzZXJ2ZXIoIm1vZGVsVHlwZSIsCntkZWZhdWx0VmFsdWU6ImNsYXNzaWZpY2F0aW9uIn0pLG1vZGVsVmVyc2lvbjFDaGFuZ2VkXzpUby5nZXRTdHJpbmdPYnNlcnZlcigibW9kZWxWZXJzaW9uMSIse2RlZmF1bHRWYWx1ZToiIn0pLG1vZGVsVmVyc2lvbjJDaGFuZ2VkXzpUby5nZXRTdHJpbmdPYnNlcnZlcigibW9kZWxWZXJzaW9uMiIse2RlZmF1bHRWYWx1ZToiIn0pLG1vZGVsU2lnbmF0dXJlMUNoYW5nZWRfOlRvLmdldFN0cmluZ09ic2VydmVyKCJtb2RlbFNpZ25hdHVyZTEiLHtkZWZhdWx0VmFsdWU6IiJ9KSxtb2RlbFNpZ25hdHVyZTJDaGFuZ2VkXzpUby5nZXRTdHJpbmdPYnNlcnZlcigibW9kZWxTaWduYXR1cmUyIix7ZGVmYXVsdFZhbHVlOiIifSksbWF4RXhhbXBsZXNDaGFuZ2VkXzpUby5nZXRTdHJpbmdPYnNlcnZlcigibWF4RXhhbXBsZXMiLHtkZWZhdWx0VmFsdWU6IjEwMDAifSksbGFiZWxWb2NhYlBhdGhDaGFuZ2VkXzpUby5nZXRTdHJpbmdPYnNlcnZlcigibGFiZWxWb2NhYlBhdGgiLHtkZWZhdWx0VmFsdWU6IiJ9KSwKbWF4Q2xhc3Nlc1RvRGlzcGxheUNoYW5nZWRfOlRvLmdldFN0cmluZ09ic2VydmVyKCJtYXhDbGFzc2VzVG9EaXNwbGF5Iix7ZGVmYXVsdFZhbHVlOiI1In0pLHNhbXBsaW5nT2Rkc0NoYW5nZWRfOlRvLmdldFN0cmluZ09ic2VydmVyKCJzYW1wbGluZ09kZHMiLHtkZWZhdWx0VmFsdWU6IjEifSksbXVsdGlDbGFzc0NoYW5nZWRfOlRvLmdldEJvb2xlYW5PYnNlcnZlcigibXVsdGlDbGFzcyIse2RlZmF1bHRWYWx1ZTohMX0pLHNlcXVlbmNlRXhhbXBsZXNDaGFuZ2VkXzpUby5nZXRCb29sZWFuT2JzZXJ2ZXIoInNlcXVlbmNlRXhhbXBsZXMiLHtkZWZhdWx0VmFsdWU6ITF9KSxoaWRlTW9kZWxQYW5lMkNoYW5nZWRfOlRvLmdldEJvb2xlYW5PYnNlcnZlcigiaGlkZU1vZGVsUGFuZTIiLHtkZWZhdWx0VmFsdWU6ITB9KSx1c2VQcmVkaWN0QXBpQ2hhbmdlZF86VG8uZ2V0Qm9vbGVhbk9ic2VydmVyKCJ1c2VQcmVkaWN0QXBpIix7ZGVmYXVsdFZhbHVlOiExfSkscHJlZGljdE91dHB1dFRlbnNvckNoYW5nZWRfOlRvLmdldFN0cmluZ09ic2VydmVyKCJwcmVkaWN0T3V0cHV0VGVuc29yIiwKe2RlZmF1bHRWYWx1ZToicHJvYmFiaWxpdGllcyJ9KSxwcmVkaWN0SW5wdXRUZW5zb3JDaGFuZ2VkXzpUby5nZXRTdHJpbmdPYnNlcnZlcigicHJlZGljdElucHV0VGVuc29yIix7ZGVmYXVsdFZhbHVlOiJleGFtcGxlcyJ9KSxzaG91bGREaXNhYmxlQ2xhc3NpZmljYXRpb25Db250cm9sc186ZnVuY3Rpb24oYSl7cmV0dXJuInJlZ3Jlc3Npb24iPT1hfSxzaG91bGREaXNhYmxlTXVsdGlDbGFzc0NvbnRyb2xzXzpmdW5jdGlvbihhKXtyZXR1cm4hYX0sc2hvdWxkRGlzYWJsZVByZWRpY3RUZW5zb3JDb250cm9sc186ZnVuY3Rpb24oYSl7cmV0dXJuIWF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotYmFyLWNoYXJ0L3Z6LWJhci1jaGFydC5qcwp2YXIgRXA7CihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ2ei1iYXItY2hhcnQiLHByb3BlcnRpZXM6e2RhdGE6T2JqZWN0LGxpbmVzOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sY29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IFBsb3R0YWJsZS5TY2FsZXMuQ29sb3IpLnJhbmdlKGQzLnNjaGVtZUNhdGVnb3J5MTApfX0sbGluZXNDb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybihuZXcgUGxvdHRhYmxlLlNjYWxlcy5Db2xvcikucmFuZ2UoZDMuc2NoZW1lQ2F0ZWdvcnkxMCl9fSx0b29sdGlwQ29sdW1uczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVyblt7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmZ1bmN0aW9uKGMpe3JldHVybiBjLmtleX19LHt0aXRsZToiWCIsZXZhbHVhdGU6ZnVuY3Rpb24oYyl7cmV0dXJuIGMudmFsdWUueH19LHt0aXRsZToiWSIsZXZhbHVhdGU6ZnVuY3Rpb24oYyl7cmV0dXJuIGMudmFsdWUueX19XX19LF9hdHRhY2hlZDpCb29sZWFuLApfY2hhcnQ6T2JqZWN0fSxvYnNlcnZlcnM6WyJfbWFrZUNoYXJ0KGRhdGEsIGxpbmVzLCBjb2xvclNjYWxlLCBsaW5lc0NvbG9yU2NhbGUsIHRvb2x0aXBDb2x1bW5zLCBfYXR0YWNoZWQpIl0scmVkcmF3OmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnJlZHJhdygpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2F0dGFjaGVkPSEwfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2F0dGFjaGVkPSExfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC50b29sdGlwLCEwKTt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuY2hhcnRkaXYsITApfSxfbWFrZUNoYXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LmRlc3Ryb3koKTt2YXIgYz1kMy5zZWxlY3QodGhpcy4kLnRvb2x0aXApO2M9bmV3IGEodGhpcy5kYXRhLHRoaXMubGluZXMsdGhpcy5jb2xvclNjYWxlLHRoaXMubGluZXNDb2xvclNjYWxlLGMsdGhpcy50b29sdGlwQ29sdW1ucyk7CnZhciBkPWQzLnNlbGVjdCh0aGlzLiQuY2hhcnRkaXYpO2MucmVuZGVyVG8oZCk7dGhpcy5fY2hhcnQ9Y319KTtjbGFzcyBhe2NvbnN0cnVjdG9yKGMsZCxmLGcsbCxrKXtmLmRvbWFpbihfLnNvcnRCeShfLmtleXMoYykpKTt0aGlzLmRhdGE9Yzt0aGlzLmxpbmVzPWQ7dGhpcy5jb2xvclNjYWxlPWY7dGhpcy5saW5lc0NvbG9yU2NhbGU9Zzt0aGlzLnRvb2x0aXA9bDt0aGlzLm91dGVyPXRoaXMucGxvdD1udWxsO3RoaXMuYnVpbGRDaGFydChjLGQsZixnKTt0aGlzLnNldHVwVG9vbHRpcHMoayl9YnVpbGRDaGFydChjLGQsZil7dGhpcy5vdXRlciYmdGhpcy5vdXRlci5kZXN0cm95KCk7dmFyIGc9bmV3IFBsb3R0YWJsZS5TY2FsZXMuQ2F0ZWdvcnk7Y29uc3QgbD1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXIsaz1uZXcgUGxvdHRhYmxlLkF4ZXMuQ2F0ZWdvcnkoZywiYm90dG9tIiksbj1uZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyhsLCJsZWZ0IikscD1uZXcgUGxvdHRhYmxlLlBsb3RzLkNsdXN0ZXJlZEJhcjsKcC54KGZ1bmN0aW9uKHIpe3JldHVybiByLnh9LGcpO3AueShmdW5jdGlvbihyKXtyZXR1cm4gci55fSxsKTtfLmtleXMoYykuZm9yRWFjaChyPT5wLmFkZERhdGFzZXQoKG5ldyBQbG90dGFibGUuRGF0YXNldChjW3JdKSkubWV0YWRhdGEocikpKTtwLmF0dHIoImZpbGwiLGZ1bmN0aW9uKHIsdCx2KXtyZXR1cm4gZi5zY2FsZSh2Lm1ldGFkYXRhKCkpfSk7dGhpcy5wbG90PXA7Y29uc3QgcT1fLmtleXMoZCk7aWYoMDxxLmxlbmd0aCl7Y29uc3Qgcj1uZXcgUGxvdHRhYmxlLlBsb3RzLkxpbmU7ci54KGZ1bmN0aW9uKHQpe3JldHVybiB0Lnh9LGcpO3IueShmdW5jdGlvbih0KXtyZXR1cm4gdC55fSxsKTtxLmZvckVhY2godD0+ci5hZGREYXRhc2V0KChuZXcgUGxvdHRhYmxlLkRhdGFzZXQoZFt0XSkpLm1ldGFkYXRhKHQpKSk7ci5hdHRyKCJzdHJva2UiLCh0LHYseSk9PnRoaXMubGluZXNDb2xvclNjYWxlLnNjYWxlKHkubWV0YWRhdGEoKSkpO2c9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3VwKFtwLApyXSk7dGhpcy5vdXRlcj1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuVGFibGUoW1tuLGddLFtudWxsLGtdXSl9ZWxzZSB0aGlzLm91dGVyPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5UYWJsZShbW24scF0sW251bGwsa11dKX1zZXR1cFRvb2x0aXBzKGMpe3ZhciBkPXRoaXMudG9vbHRpcC5zZWxlY3QoInRoZWFkIHRyIik7ZC5zZWxlY3RBbGwoInRoIikuZGF0YShjKS5lbnRlcigpLmFwcGVuZCgidGgiKS50ZXh0KGc9PmcudGl0bGUpO2QuaW5zZXJ0KCJ0aCIsIjpmaXJzdC1jaGlsZCIpO2NvbnN0IGY9dGhpcy5wbG90O2Q9bmV3ICRvLlBvaW50ZXJJbnRlcmFjdGlvbjtkLmF0dGFjaFRvKGYpO2Qub25Qb2ludGVyTW92ZShnPT57KGc9Zi5lbnRpdHlOZWFyZXN0KGcpKSYmdGhpcy5kcmF3VG9vbHRpcHMoZyxjKX0pO2Qub25Qb2ludGVyRXhpdCgoKT0+e3RoaXMudG9vbHRpcC5zdHlsZSgib3BhY2l0eSIsMCl9KX1kcmF3VG9vbHRpcHMoYyxkKXtjb25zdCBmPWMuZGF0dW0ueCxnPWMuZGF0YXNldC5tZXRhZGF0YSgpOwp2YXIgbD1fLm1hcFZhbHVlcyh0aGlzLmRhdGEscD0+Xy5maWx0ZXIocCxxPT5xLng9PWYpKTtsPV8ucGlja0J5KGwscD0+MDxwLmxlbmd0aCk7bD1fLm1hcFZhbHVlcyhsLHA9PnBbMF0pO2w9ZDMuZW50cmllcyhsKTtjb25zdCBrPXRoaXMudG9vbHRpcC5zZWxlY3QoInRib2R5IikuaHRtbCgiIikuc2VsZWN0QWxsKCJ0ciIpLmRhdGEobCkuZW50ZXIoKS5hcHBlbmQoInRyIik7ay5zdHlsZSgid2hpdGUtc3BhY2UiLCJub3dyYXAiKTtrLmNsYXNzZWQoImNsb3Nlc3QiLHA9PnAua2V5PT1nKTtjb25zdCBuPXRoaXMuY29sb3JTY2FsZTtrLmFwcGVuZCgidGQiKS5hcHBlbmQoImRpdiIpLmNsYXNzZWQoInN3YXRjaCIsITApLnN0eWxlKCJiYWNrZ3JvdW5kLWNvbG9yIixwPT5uLnNjYWxlKHAua2V5KSk7Xy5lYWNoKGQscD0+e2suYXBwZW5kKCJ0ZCIpLnRleHQocT0+cC5ldmFsdWF0ZShxKSl9KTt0aGlzLnRvb2x0aXAuc3R5bGUoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2MucG9zaXRpb24ueCsKInB4LCIrYy5wb3NpdGlvbi55KyJweCkiKTt0aGlzLnRvb2x0aXAuc3R5bGUoIm9wYWNpdHkiLDEpfXJlbmRlclRvKGMpe3RoaXMudGFyZ2V0U1ZHPWM7dGhpcy5vdXRlci5yZW5kZXJUbyhjKX1yZWRyYXcoKXt0aGlzLm91dGVyLnJlZHJhdygpfWRlc3Ryb3koKXt0aGlzLm91dGVyLmRlc3Ryb3koKX19fSkoRXB8fChFcD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWludGVyYWN0aXZlLWluZmVyZW5jZS1kYXNoYm9hcmQvdGYtY29uZnVzaW9uLW1hdHJpeC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1jb25mdXNpb24tbWF0cml4Iixwcm9wZXJ0aWVzOntjb3VudHM6T2JqZWN0LGFsbEl0ZW1zOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sbGFiZWw6U3RyaW5nLGJhY2tncm91bmQ6e3R5cGU6T2JqZWN0LHZhbHVlOmQzLmNvbG9yKCJncmF5Iil9fSxvYnNlcnZlcnM6WyJkcmF3TWF0cml4KGNvdW50cywgYWxsSXRlbXMpIl0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuaG9sZGVyLCEwKX0sZHJhd01hdHJpeDpmdW5jdGlvbihhLGMpe3RoaXMuJC5ob2xkZXIuaW5uZXJIVE1MPSIiO2lmKGEpe3ZhciBkPWM7aWYobnVsbD09ZHx8MD09ZC5sZW5ndGgpe2M9bmV3IFNldDt2YXIgZj1PYmplY3Qua2V5cyhhKTtmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl7Yy5hZGQoZltnXSk7dmFyIGw9T2JqZWN0LmtleXMoYVtmW2ddXSk7Zm9yKGxldCBxPTA7cTxsLmxlbmd0aDtxKyspYy5hZGQobFtxXSl9ZD1BcnJheS5mcm9tKGMudmFsdWVzKCkpfWQ9CmQuc29ydCgpOzI9PWQubGVuZ3RoJiYiTm8iPT1kWzBdJiYiWWVzIj09ZFsxXSYmKGQ9ZC5yZXZlcnNlKCkpO3ZhciBrPUFycmF5KGQubGVuZ3RoKTtfLmZpbGwoaywwKTt2YXIgbj1bXTtmb3IoYz0wO2M8ZC5sZW5ndGg7YysrKWY9QXJyYXkoZC5sZW5ndGgpLF8uZmlsbChmLDApLG4ucHVzaChmKTtmb3IoYz0wO2M8ZC5sZW5ndGg7YysrKWZvcihmPTA7ZjxkLmxlbmd0aDtmKyspZz1kW2NdLGw9ZFtmXSxnIGluIGEmJmwgaW4gYVtnXSYmKG5bY11bZl09YVtnXVtsXSk7YT1bXTt2YXIgcD0wO2ZvcihjPTA7YzxuLmxlbmd0aDtjKyspZm9yKGY9bltjXS5yZWR1Y2UoKHEscik9PnErciwwKSxhLnB1c2goWzBdLmNvbmNhdChuW2NdKS5jb25jYXQoW2ZdKSksZj0wO2Y8bi5sZW5ndGg7ZisrKWtbZl0rPW5bY11bZl0scCs9bltjXVtmXTtjPXRoaXMuZ2V0SW5kaWNlcyhuLmxlbmd0aCsyKTtsPWQzLnNlbGVjdCh0aGlzLiQuaG9sZGVyKS5hcHBlbmQoInRhYmxlIik7Zj1sLmFwcGVuZCgidGhlYWQiKTsKZz1sLmFwcGVuZCgidGJvZHkiKTtsPWwuYXBwZW5kKCJ0Zm9vdCIpO2YuYXBwZW5kKCJ0ciIpLnNlbGVjdEFsbCgidGgiKS5kYXRhKGMpLmVudGVyKCkuYXBwZW5kKCJ0aCIpLnRleHQocT0+MD09cT90aGlzLmxhYmVsOnE8PW4ubGVuZ3RoPyJQcmVkaWN0ZWQgIitkW3EtMV06IlRvdGFsIikuYXR0cigiY2xhc3MiLHE9PjA9PXE/Im4tbGFiZWwiOnE8PW4ubGVuZ3RoPyJwcmVkLWxhYmVsIjoidG90YWwtbGFiZWwiKTthPWcuc2VsZWN0QWxsKCJ0ciIpLmRhdGEoYSkuZW50ZXIoKS5hcHBlbmQoInRyIikuc2VsZWN0QWxsKCJ0ZCIpLmRhdGEoKHEscik9PnEubWFwKCh0LHYpPT4wPT12P3t2YWx1ZToiQWN0dWFsICIrZFtyXX06e3ZhbHVlOnQscm93OnJ9KSkuZW50ZXIoKS5hcHBlbmQoInRkIikuYXR0cigiY2xhc3MiLChxLHIpPT4wPT1yPyJhY3R1YWwtbGFiZWwiOnI8PW4ubGVuZ3RoPyJ2YWx1ZS1jZWxsIjoidG90YWwtY2VsbCIpLnN0eWxlKCJiYWNrZ3JvdW5kIiwocSxyKT0+e2lmKDA9PQpyfHxyPm4ubGVuZ3RoKXJldHVybiIjRkZGRkZGIjtyPXRoaXMuYmFja2dyb3VuZDtyLm9wYWNpdHk9cS52YWx1ZS9wO3JldHVybiByKyIifSkuYXBwZW5kKCJkaXYiKS5jbGFzc2VkKCJmbGV4IiwhMCk7YS5hcHBlbmQoImRpdiIpLmNsYXNzZWQoInBhcmVudGhldGljYWwiLChxLHIpPT4hIXIpLnRleHQocT0+InJvdyJpbiBxPyIoIitxLnZhbHVlKyIpIjoiIik7YS5hcHBlbmQoImRpdiIpLnRleHQoKHEscik9PjA8cj9kMy5mb3JtYXQoIiwuMSUiKShxLnZhbHVlL3ApOnEudmFsdWUpO2E9bC5hcHBlbmQoInRyIikuc2VsZWN0QWxsKCJ0ZCIpLmRhdGEoYykuZW50ZXIoKS5hcHBlbmQoInRkIik7YS5jbGFzc2VkKCJ0b3RhbC1sYWJlbCIsKHEscik9PjA9PXIpO2EuY2xhc3NlZCgidG90YWwtY2VsbCIsKHEscik9PjAhPXIpO2E9YS5hcHBlbmQoImRpdiIpLmNsYXNzZWQoImZsZXgiLCEwKTthLmFwcGVuZCgiZGl2IikuY2xhc3NlZCgicGFyZW50aGV0aWNhbCIsKHEscik9PiEhcikudGV4dChxPT4KMD09cT8iVG90YWwiOnE8PW4ubGVuZ3RoPyIoIitrW3EtMV0rIikiOiIiKTthLmFwcGVuZCgiZGl2IikudGV4dChxPT4wPT1xPyIiOnE8PW4ubGVuZ3RoP2QzLmZvcm1hdCgiLC4xJSIpKGtbcS0xXS9wKToiIil9fSxnZXRJbmRpY2VzOmZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5hcHBseShudWxsLHtsZW5ndGg6YX0pLm1hcChOdW1iZXIuY2FsbCxOdW1iZXIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWludGVyYWN0aXZlLWluZmVyZW5jZS1kYXNoYm9hcmQvdGYtaW5mZXJlbmNlLXZpZXdlci5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1pbmZlcmVuY2Utdmlld2VyIixwcm9wZXJ0aWVzOntpbmZlcmVuY2VzOkFycmF5LG1vZGVsVHlwZTpTdHJpbmcsbW9kZWxOYW1lczpBcnJheSxtYXhFbnRyaWVzUGVyUnVuOnt0eXBlOk51bWJlcix2YWx1ZTo1fX0sZ2V0TGFiZWw6ZnVuY3Rpb24oYSl7bGV0IGM9YS5sYWJlbDthLnZvY2FiTGFiZWwmJihjKz0iICgiK2Eudm9jYWJMYWJlbCsiKSIpO3JldHVybiBjfSxnZXRMYWJlbENsYXNzOmZ1bmN0aW9uKGEpe3JldHVybiJjbGFzc2lmaWNhdGlvbiI9PWE/InNob3ctbGFiZWwgdGV4dCI6Im5vLWxhYmVsIn0sZ2V0TGFiZWxIZWFkZXJDbGFzczpmdW5jdGlvbihhKXtyZXR1cm4iY2xhc3NpZmljYXRpb24iPT1hPyJzaG93LWxhYmVsIjoibm8tbGFiZWwifSxnZXRNb2RlbENsYXNzOmZ1bmN0aW9uKGEpe3JldHVybiBhJiYxPGFbMF0ubGVuZ3RoPyJtdWx0aS1tb2RlbCB0ZXh0Ijoib25lLW1vZGVsIn0sZ2V0TW9kZWxIZWFkZXJDbGFzczpmdW5jdGlvbihhKXtyZXR1cm4gYSYmCjE8YVswXS5sZW5ndGg/Im11bHRpLW1vZGVsIjoib25lLW1vZGVsIn0sZ2V0U2NvcmVMYWJlbDpmdW5jdGlvbihhKXtyZXR1cm4iY2xhc3NpZmljYXRpb24iPT1hPyJTY29yZSI6IlZhbHVlIn0sZ2V0SWNvbkNsYXNzOmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gdGhpcy5nZXRJY29uRGVjaXNpb24oYSxjLGQsImdyZWVuIiwicmVkIil9LGdldEljb246ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmdldEljb25EZWNpc2lvbihhLGMsZCwiaWNvbnM6YXJyb3ctdXB3YXJkIiwiaWNvbnM6YXJyb3ctZG93bndhcmQiKX0sZ2V0SWNvbkRlY2lzaW9uOmZ1bmN0aW9uKGEsYyxkLGYsZyl7aWYoMD09YSlyZXR1cm4iIjtjb25zdCBsPXRoaXMuaW5mZXJlbmNlc1thXVtkXVtjXS5sYWJlbDtjPXRoaXMuaW5mZXJlbmNlc1thXVtkXVtjXS5zY29yZTthPXRoaXMuaW5mZXJlbmNlc1thLTFdW2RdO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspaWYoYVtkXS5sYWJlbD09bCl7aWYoYVtkXS5zY29yZT5jKXJldHVybiBnOwppZihhW2RdLnNjb3JlPGMpYnJlYWs7cmV0dXJuIiJ9cmV0dXJuIGZ9LGdldFJ1bk51bWJlcjpmdW5jdGlvbihhKXtyZXR1cm4gYSsxfSxnZXRNb2RlbE5hbWU6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYVtjXX0sZ2V0TWFya2VyQ2xhc3M6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiJtYXJrZXIiKyhudWxsIT1jJiZhPT1jLmxlbmd0aC0xPzA9PWQ/IiBtYXJrLW9uZSI6IiBtYXJrLXR3byI6IiIpfSxnZXRSb3dDbGFzczpmdW5jdGlvbihhLGMsZCl7bGV0IGY9InJvdyAiO3JldHVybiBmPW51bGwhPWMmJmE9PWMubGVuZ3RoLTE/ZisoMD09ZD8iZGFyay1yb3ctb25lIjoiZGFyay1yb3ctdHdvIik6Zisid2hpdGUtcm93In0sZ2V0SW5mZXJlbmNlOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxnZXRQcmludGFibGVTY29yZTpmdW5jdGlvbihhKXtyZXR1cm4gYS50b0ZpeGVkKDMpfSxnZXRQcmludGFibGVEZWx0YTpmdW5jdGlvbihhLGMsZCl7aWYoMD09YSlyZXR1cm4iIjtjb25zdCBmPXRoaXMuaW5mZXJlbmNlc1thXVtkXVtjXS5sYWJlbDsKYz10aGlzLmluZmVyZW5jZXNbYV1bZF1bY10uc2NvcmU7YT10aGlzLmluZmVyZW5jZXNbYS0xXVtkXTtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWlmKGFbZF0ubGFiZWw9PWYpcmV0dXJuKGMtYVtkXS5zY29yZSkudG9GaXhlZCg2KTtyZXR1cm4iIn0sZ2V0SW5mZXJlbmNlTGlzdDpmdW5jdGlvbihhLGMpe3JldHVybiBhLnNsaWNlKDAsYyl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLWRpdmUvbGliL2JvdW5kZWQtb2JqZWN0LmpzCi8qCgogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4KCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KdmFyIEZwOyhmdW5jdGlvbihhKXthW2EuQm90dG9tPTBdPSJCb3R0b20iO2FbYS5MZWZ0PTFdPSJMZWZ0IjthW2EuUmlnaHQ9Ml09IlJpZ2h0IjthW2EuVG9wPTNdPSJUb3AifSkoRnB8fChGcD17fSkpOwpjbGFzcyBHcHtzaG91bGRCZVZpc2libGUoYSxjLGQsZil7aWYodm9pZCAwIT09dGhpcy5taW5TY2FsZSlyZXR1cm4gdGhpcy5zY2FsZURvd258fGM+PXRoaXMubWluU2NhbGU7aWYoIXRoaXMuYm91bmRpbmdCb3gpcmV0dXJuITA7Y29uc3QgZz10aGlzLmJvdW5kaW5nQm94O2lmKGcubGVmdD5kLngrZi5yaWdodHx8Zy5yaWdodDxkLngrZi5sZWZ0fHxnLmJvdHRvbT5kLnkrZi50b3B8fGcudG9wPGQueStmLmJvdHRvbSlyZXR1cm4hMTtmPXRoaXMuZWxlbWVudE1hcmdpbnx8e2JvdHRvbTowLGxlZnQ6MCxyaWdodDowLHRvcDowfTtkPXZvaWQgMD09PXRoaXMud2lkdGg/YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCtmLmxlZnQrZi5yaWdodDp0aGlzLndpZHRoO2E9dm9pZCAwPT09dGhpcy5oZWlnaHQ/YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQrZi50b3ArZi5ib3R0b206dGhpcy5oZWlnaHQ7Zj1pc0Zpbml0ZShnLnRvcCkmJmlzRmluaXRlKGcuYm90dG9tKT8KZy50b3AtZy5ib3R0b206SW5maW5pdHk7cmV0dXJuKGlzRmluaXRlKGcubGVmdCkmJmlzRmluaXRlKGcucmlnaHQpP2cucmlnaHQtZy5sZWZ0OkluZmluaXR5KSpjPj1kJiZmKmM+PWF9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9mYWNldHMtZGl2ZS9saWIvc29ydGluZy5qcwpmdW5jdGlvbiBIcChhLGMpe3JldHVybiBudWxsIT09YSYmdm9pZCAwIT09YXx8bnVsbCE9PWMmJnZvaWQgMCE9PWM/bnVsbD09PWF8fHZvaWQgMD09PWE/LTE6bnVsbD09PWN8fHZvaWQgMD09PWM/MToibnVtYmVyIj09PXR5cGVvZiBhJiYibnVtYmVyIj09PXR5cGVvZiBjP2lzTmFOKGEpJiZpc05hTihjKT8wOmlzTmFOKGEpPy0xOmlzTmFOKGMpPzE6YS1jOiJzdHJpbmciIT09dHlwZW9mIGE/LTE6InN0cmluZyIhPT10eXBlb2YgYz8xOmEubG9jYWxlQ29tcGFyZShjKTphPT09Yz8wOnZvaWQgMD09PWE/LTE6MX0KZnVuY3Rpb24gSXAoYSxjKXtyZXR1cm4gbnVsbCE9PWEmJnZvaWQgMCE9PWF8fG51bGwhPT1jJiZ2b2lkIDAhPT1jP251bGw9PT1hfHx2b2lkIDA9PT1hPy0xOm51bGw9PT1jfHx2b2lkIDA9PT1jPzE6Im51bWJlciI9PT10eXBlb2YgYSYmIm51bWJlciI9PT10eXBlb2YgYz9pc05hTihhKSYmaXNOYU4oYyk/MDppc05hTihhKT8tMTppc05hTihjKT8xOmMtYToic3RyaW5nIiE9PXR5cGVvZiBhPy0xOiJzdHJpbmciIT09dHlwZW9mIGM/MTotYS5sb2NhbGVDb21wYXJlKGMpOmE9PT1jPzA6dm9pZCAwPT09YT8tMToxfQpmdW5jdGlvbiBKcChhLGMpe3JldHVybiBudWxsIT09YSYmdm9pZCAwIT09YXx8bnVsbCE9PWMmJnZvaWQgMCE9PWM/bnVsbD09PWF8fHZvaWQgMD09PWE/LTE6bnVsbD09PWN8fHZvaWQgMD09PWM/MToic3RyaW5nIj09PXR5cGVvZiBhJiYic3RyaW5nIj09PXR5cGVvZiBjP2EubG9jYWxlQ29tcGFyZShjKToibnVtYmVyIiE9PXR5cGVvZiBhPy0xOiJudW1iZXIiIT09dHlwZW9mIGM/MTppc05hTihhKSYmaXNOYU4oYyk/MDppc05hTihhKT8tMTppc05hTihjKT8xOmEtYzphPT09Yz8wOnZvaWQgMD09PWE/LTE6MX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLWRpdmUvbGliL2dyaWQuanMKY29uc3QgS3A9KGEsYyxkLGYpPT57YT1NYXRoLmZsb29yKDFFLTYrZC5taW5XaWR0aC9mLml0ZW1Bc3BlY3RSYXRpbyk7cmV0dXJuIDE8YT9jJWEvKGEtMSk6MH0sTHA9KGEsYyxkLGYpPT57YT1NYXRoLmZsb29yKDFFLTYrZC5taW5XaWR0aC9mLml0ZW1Bc3BlY3RSYXRpbyk7ZD1NYXRoLmNlaWwoZC5pdGVtcy5sZW5ndGgvYSk7cmV0dXJuIDE8ZD9NYXRoLmZsb29yKGMvYSkvKGQtMSk6MH0sTXA9KGEsYyk9Pntjb25zdCBkPSJyaWdodCI9PT1jPzE6Im1pZGRsZSI9PT1jPy41OjAsZj0idG9wIj09PWE/MToibWlkZGxlIj09PWE/LjU6MDtyZXR1cm4oZyxsLGssbik9Pntjb25zdCBwPWsuaW5uZXJXaWR0aC1uLml0ZW1Bc3BlY3RSYXRpbyxxPWsuaW5uZXJIZWlnaHQtMTtyZXR1cm57eDpLcChnLGwsayxuKS9wKihrLm1pbldpZHRoLW4uaXRlbUFzcGVjdFJhdGlvKStkKihrLmlubmVyV2lkdGgtay5taW5XaWR0aCkvcCx5OkxwKGcsbCxrLG4pL3EqKGsubWluSGVpZ2h0LTEpK2YqKGsuaW5uZXJIZWlnaHQtCmsubWluSGVpZ2h0KS9xfX19LE5wPU1wKCJib3R0b20iLCJsZWZ0Iik7dmFyIE9wOyhmdW5jdGlvbihhKXthW2EuVGlnaHQ9MF09IlRpZ2h0IjthW2EuVW5pZm9ybT0xXT0iVW5pZm9ybSJ9KShPcHx8KE9wPXt9KSk7CmNsYXNzIFBwe2NvbnN0cnVjdG9yKGEpe3RoaXMuaXRlbXM9YTt0aGlzLmNlbGxNYXJnaW49dGhpcy5pdGVtQXNwZWN0UmF0aW89MTt0aGlzLmNlbGxQYWRkaW5nPXtib3R0b206MCxsZWZ0OjAscmlnaHQ6MCx0b3A6MH07dGhpcy50YXJnZXRHcmlkQXNwZWN0UmF0aW89MTt0aGlzLm1pbkNlbGxBc3BlY3RSYXRpbz0wO3RoaXMubWF4Q2VsbEFzcGVjdFJhdGlvPUluZmluaXR5O3RoaXMudmVydGljYWxGYWNldD0oKT0+bnVsbDt0aGlzLmhvcml6b250YWxGYWNldD0oKT0+bnVsbDt0aGlzLnZlcnRpY2FsS2V5Q29tcGFyZT1JcDt0aGlzLmhvcml6b250YWxLZXlDb21wYXJlPUhwO3RoaXMudmVydGljYWxLZXlzPVtdO3RoaXMudmVydGljYWxLZXlzSGFzaD17fTt0aGlzLmhvcml6b250YWxLZXlzPVtdO3RoaXMuaG9yaXpvbnRhbEtleXNIYXNoPXt9O3RoaXMuY2VsbHM9e307dGhpcy5oZWlnaHQ9dGhpcy53aWR0aD10aGlzLmxvbmdlc3RDZWxsTGVuZ3RoPTA7dGhpcy5pdGVtUG9zaXRpb25TZXR0ZXI9CihjLGQsZik9PntjLng9ZDtjLnk9Zn07dGhpcy5jb21wdXRlSXRlbVBvc2l0aW9uPU5wO3RoaXMuaG9yaXpvbnRhbEdyaWRBbGlnbm1lbnQ9dGhpcy52ZXJ0aWNhbEdyaWRBbGlnbm1lbnQ9T3AuVGlnaHQ7dGhpcy5jZWxsSXRlbUNvbXBhcmF0b3I9bnVsbH1jbGVhcigpe3RoaXMudmVydGljYWxLZXlzPVtdO3RoaXMudmVydGljYWxLZXlzSGFzaD17fTt0aGlzLmhvcml6b250YWxLZXlzPVtdO3RoaXMuaG9yaXpvbnRhbEtleXNIYXNoPXt9O3RoaXMuY2VsbHM9e307dGhpcy5oZWlnaHQ9dGhpcy53aWR0aD10aGlzLmxvbmdlc3RDZWxsTGVuZ3RoPTB9YXJyYW5nZSgpe3RoaXMuZmFjZXRJdGVtc0ludG9DZWxscygpO3ZhciBhPXRoaXMuY29tcHV0ZU9wdGltYWxDZWxsQXNwZWN0UmF0aW8odGhpcy50YXJnZXRHcmlkQXNwZWN0UmF0aW8pLGM9TWF0aC5taW4odGhpcy5tYXhDZWxsQXNwZWN0UmF0aW8sTWF0aC5tYXgodGhpcy5taW5DZWxsQXNwZWN0UmF0aW8sYSkpO2E9W107Y29uc3QgZD0KW107Zm9yKHZhciBmPTA7Zjx0aGlzLnZlcnRpY2FsS2V5cy5sZW5ndGg7ZisrKWZvcih2YXIgZz0wO2c8dGhpcy5ob3Jpem9udGFsS2V5cy5sZW5ndGg7ZysrKXt2YXIgbD10aGlzLmdldE9yQ3JlYXRlQ2VsbCh0aGlzLnZlcnRpY2FsS2V5c1tmXSx0aGlzLmhvcml6b250YWxLZXlzW2ddKTtbbC5taW5XaWR0aCxsLm1pbkhlaWdodF09dGhpcy5jb21wdXRlQ2VsbERpbWVuc2lvbnMoYyxsLml0ZW1zLmxlbmd0aCk7YVtmXT1NYXRoLm1heChhW2ZdfHwwLGwubWluSGVpZ2h0KTtkW2ddPU1hdGgubWF4KGRbZ118fDAsbC5taW5XaWR0aCl9Zm9yKGM9MDtjPHRoaXMudmVydGljYWxLZXlzLmxlbmd0aDtjKyspZm9yKGY9MDtmPHRoaXMuaG9yaXpvbnRhbEtleXMubGVuZ3RoO2YrKylnPXRoaXMuZ2V0Q2VsbCh0aGlzLnZlcnRpY2FsS2V5c1tjXSx0aGlzLmhvcml6b250YWxLZXlzW2ZdKSxjPHRoaXMudmVydGljYWxLZXlzLmxlbmd0aC0xJiYoZy5zaWJsaW5ncy5hYm92ZT10aGlzLmdldENlbGwodGhpcy52ZXJ0aWNhbEtleXNbYysKMV0sdGhpcy5ob3Jpem9udGFsS2V5c1tmXSkpLDA8YyYmKGcuc2libGluZ3MuYmVsb3c9dGhpcy5nZXRDZWxsKHRoaXMudmVydGljYWxLZXlzW2MtMV0sdGhpcy5ob3Jpem9udGFsS2V5c1tmXSkpLDA8ZiYmKGcuc2libGluZ3MubGVmdD10aGlzLmdldENlbGwodGhpcy52ZXJ0aWNhbEtleXNbY10sdGhpcy5ob3Jpem9udGFsS2V5c1tmLTFdKSksZjx0aGlzLmhvcml6b250YWxLZXlzLmxlbmd0aC0xJiYoZy5zaWJsaW5ncy5yaWdodD10aGlzLmdldENlbGwodGhpcy52ZXJ0aWNhbEtleXNbY10sdGhpcy5ob3Jpem9udGFsS2V5c1tmKzFdKSk7aWYodGhpcy52ZXJ0aWNhbEdyaWRBbGlnbm1lbnQ9PT1PcC5Vbmlmb3JtKWZvcihjPU1hdGgubWF4KC4uLmEpLGY9MDtmPGEubGVuZ3RoO2YrKylhW2ZdPWM7aWYodGhpcy5ob3Jpem9udGFsR3JpZEFsaWdubWVudD09PU9wLlVuaWZvcm0pZm9yKGM9TWF0aC5tYXgoLi4uZCksZj0wO2Y8ZC5sZW5ndGg7ZisrKWRbZl09Yztmb3IoYz0wO2M8dGhpcy52ZXJ0aWNhbEtleXMubGVuZ3RoO2MrKylmb3IoZj0KMDtmPHRoaXMuaG9yaXpvbnRhbEtleXMubGVuZ3RoO2YrKylnPXRoaXMuZ2V0Q2VsbCh0aGlzLnZlcnRpY2FsS2V5c1tjXSx0aGlzLmhvcml6b250YWxLZXlzW2ZdKSxnLmhlaWdodD1hW2NdLGcud2lkdGg9ZFtmXSxnLmlubmVySGVpZ2h0PWcuaGVpZ2h0LXRoaXMuY2VsbFBhZGRpbmcudG9wLXRoaXMuY2VsbFBhZGRpbmcuYm90dG9tLGcuaW5uZXJXaWR0aD1nLndpZHRoLXRoaXMuY2VsbFBhZGRpbmcubGVmdC10aGlzLmNlbGxQYWRkaW5nLnJpZ2h0O2M9dGhpcy5jZWxsTWFyZ2luKnRoaXMuaXRlbUFzcGVjdFJhdGlvO2ZvcihmPTA7Zjx0aGlzLnZlcnRpY2FsS2V5cy5sZW5ndGg7ZisrKWZvcihnPTA7Zzx0aGlzLmhvcml6b250YWxLZXlzLmxlbmd0aDtnKyspbD10aGlzLmdldENlbGwodGhpcy52ZXJ0aWNhbEtleXNbZl0sdGhpcy5ob3Jpem9udGFsS2V5c1tnXSksbC55PWY/dGhpcy5nZXRDZWxsKHRoaXMudmVydGljYWxLZXlzW2YtMV0sdGhpcy5ob3Jpem9udGFsS2V5c1tnXSkueSsKYVtmLTFdK2M6MCxsLmNvbnRlbnRZPWwueSt0aGlzLmNlbGxQYWRkaW5nLmJvdHRvbSxsLng9Zz90aGlzLmdldENlbGwodGhpcy52ZXJ0aWNhbEtleXNbZl0sdGhpcy5ob3Jpem9udGFsS2V5c1tnLTFdKS54K2RbZy0xXStjOjAsbC5jb250ZW50WD1sLngrdGhpcy5jZWxsUGFkZGluZy5sZWZ0O3RoaXMuZWFjaENlbGwoaz0+e3RoaXMud2lkdGg9TWF0aC5tYXgodGhpcy53aWR0aCxrLngray53aWR0aCk7dGhpcy5oZWlnaHQ9TWF0aC5tYXgodGhpcy5oZWlnaHQsay55K2suaGVpZ2h0KX0pO3RoaXMucG9zaXRpb25JdGVtcygpfXBvc2l0aW9uSXRlbXMoKXt0aGlzLmVhY2hDZWxsKGE9Pntjb25zdCBjPU1hdGgubWF4KDAsYS5pbm5lcldpZHRoLXRoaXMuaXRlbUFzcGVjdFJhdGlvKSxkPU1hdGgubWF4KDAsYS5pbm5lckhlaWdodC0xKSxmPWEuaXRlbXMuc2xpY2UoMCk7dGhpcy5jZWxsSXRlbUNvbXBhcmF0b3ImJmYuc29ydCh0aGlzLmNlbGxJdGVtQ29tcGFyYXRvcik7Zm9yKGxldCBnPQowO2c8Zi5sZW5ndGg7ZysrKXtjb25zdCBsPXRoaXMuY29tcHV0ZUl0ZW1Qb3NpdGlvbihmW2ddLGcsYSx0aGlzKTt0aGlzLml0ZW1Qb3NpdGlvblNldHRlcihmW2ddLGEuY29udGVudFgrKCFsfHxpc05hTihsLngpPzA6TWF0aC5tYXgoMCxNYXRoLm1pbigxLGwueCkpKSpjLGEuY29udGVudFkrKCFsfHxpc05hTihsLnkpPzA6TWF0aC5tYXgoMCxNYXRoLm1pbigxLGwueSkpKSpkKX19KX1mYWNldEl0ZW1zSW50b0NlbGxzKCl7dGhpcy5jbGVhcigpO3RoaXMuZWFjaEl0ZW0oYT0+e2NvbnN0IGM9dGhpcy5nZXRPckNyZWF0ZUNlbGwodGhpcy52ZXJ0aWNhbEZhY2V0KGEpLHRoaXMuaG9yaXpvbnRhbEZhY2V0KGEpKTtjLml0ZW1zLnB1c2goYSk7dGhpcy5sb25nZXN0Q2VsbExlbmd0aD1NYXRoLm1heCh0aGlzLmxvbmdlc3RDZWxsTGVuZ3RoLGMuaXRlbXMubGVuZ3RoKX0pO2Zvcihjb25zdCBhIGluIHRoaXMudmVydGljYWxLZXlzSGFzaCl0aGlzLnZlcnRpY2FsS2V5cy5wdXNoKHRoaXMudmVydGljYWxLZXlzSGFzaFthXSk7CnRoaXMudmVydGljYWxLZXlzLnNvcnQodGhpcy52ZXJ0aWNhbEtleUNvbXBhcmUpO2Zvcihjb25zdCBhIGluIHRoaXMuaG9yaXpvbnRhbEtleXNIYXNoKXRoaXMuaG9yaXpvbnRhbEtleXMucHVzaCh0aGlzLmhvcml6b250YWxLZXlzSGFzaFthXSk7dGhpcy5ob3Jpem9udGFsS2V5cy5zb3J0KHRoaXMuaG9yaXpvbnRhbEtleUNvbXBhcmUpfWVhY2hJdGVtKGEpe2lmKHRoaXMuaXRlbXMpZm9yKGxldCBjPTA7Yzx0aGlzLml0ZW1zLmxlbmd0aDtjKyspYS5jYWxsKHRoaXMsdGhpcy5pdGVtc1tjXSl9ZWFjaENlbGwoYSl7Zm9yKGNvbnN0IGMgaW4gdGhpcy5jZWxscylhLmNhbGwodGhpcyx0aGlzLmNlbGxzW2NdKX1nZXRDb21wb3VuZEtleShhLGMpe3JldHVybiB0eXBlb2YgYSsiXHUwMDFmIithKyJcdTAwMWUiK3R5cGVvZiBjKyJcdTAwMWYiK2N9Z2V0Q2VsbChhLGMpe2E9dGhpcy5nZXRDb21wb3VuZEtleShhLGMpO3JldHVybiBhIGluIHRoaXMuY2VsbHM/dGhpcy5jZWxsc1thXTpudWxsfWdldENlbGxzKCl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuY2VsbHMpLm1hcChhPT4KdGhpcy5jZWxsc1thXSl9Z2V0T3JDcmVhdGVDZWxsKGEsYyl7bGV0IGQ9dGhpcy5nZXRDZWxsKGEsYyk7aWYoZClyZXR1cm4gZDt0aGlzLmFkZFZlcnRpY2FsS2V5KGEpO3RoaXMuYWRkSG9yaXpvbnRhbEtleShjKTtjb25zdCBmPXRoaXMuZ2V0Q29tcG91bmRLZXkoYSxjKTtkPXt2ZXJ0aWNhbEtleTphLGhvcml6b250YWxLZXk6Yyxjb21wb3VuZEtleTpmLGl0ZW1zOltdLHNpYmxpbmdzOnt9fTtyZXR1cm4gdGhpcy5jZWxsc1tmXT1kfWdldFJvdyhhKXtjb25zdCBjPVtdO2ZvcihsZXQgZD0wO2Q8dGhpcy5ob3Jpem9udGFsS2V5cy5sZW5ndGg7ZCsrKXtjb25zdCBmPXRoaXMuZ2V0Q2VsbChhLHRoaXMuaG9yaXpvbnRhbEtleXNbZF0pO2YmJmMucHVzaChmKX1yZXR1cm4gY31nZXRDb2x1bW4oYSl7Y29uc3QgYz1bXTtmb3IobGV0IGQ9MDtkPHRoaXMudmVydGljYWxLZXlzLmxlbmd0aDtkKyspe2NvbnN0IGY9dGhpcy5nZXRDZWxsKHRoaXMudmVydGljYWxLZXlzW2RdLGEpO2YmJmMucHVzaChmKX1yZXR1cm4gY31hZGRWZXJ0aWNhbEtleShhKXtjb25zdCBjPQp0eXBlb2YgYSsiXHUwMDFmIithO2MgaW4gdGhpcy52ZXJ0aWNhbEtleXNIYXNofHwodGhpcy52ZXJ0aWNhbEtleXNIYXNoW2NdPWEpfWFkZEhvcml6b250YWxLZXkoYSl7Y29uc3QgYz10eXBlb2YgYSsiXHUwMDFmIithO2MgaW4gdGhpcy5ob3Jpem9udGFsS2V5c0hhc2h8fCh0aGlzLmhvcml6b250YWxLZXlzSGFzaFtjXT1hKX1jb21wdXRlT3B0aW1hbENlbGxBc3BlY3RSYXRpbyhhKXt2YXIgYz10aGlzLnZlcnRpY2FsS2V5cy5sZW5ndGgsZD10aGlzLmhvcml6b250YWxLZXlzLmxlbmd0aDtpZighY3x8IWQpcmV0dXJuIDE7bGV0IGY9Yy9kLGc9ZixsPUluZmluaXR5LGs9MCxuPUluZmluaXR5O2M9TWF0aC5taW4oMjAsTWF0aC5tYXgoYyxkLHRoaXMubG9uZ2VzdENlbGxMZW5ndGgpKTtmb3IoZD0wO2Q8Yzspe2QrKztjb25zdCBwPXRoaXMuY29tcHV0ZUdyaWRBc3BlY3RSYXRpbyhmKSxxPU1hdGguYWJzKDEtcC9hKTtxPGwmJihnPWYsbD1xKTtpZiguMDAxPnEpYnJlYWs7cD5hPyhuPQpmLGYtPShuLWspLzIpOihrPWYsZj1pc0Zpbml0ZShuKT9mKyhuLWspLzI6MipmKX1yZXR1cm4gZ31jb21wdXRlR3JpZEFzcGVjdFJhdGlvKGEpe2NvbnN0IGM9dGhpcy52ZXJ0aWNhbEtleXMubGVuZ3RoLGQ9dGhpcy5ob3Jpem9udGFsS2V5cy5sZW5ndGg7bGV0IGY9LUluZmluaXR5LGc9LUluZmluaXR5LGw9LUluZmluaXR5LGs9LUluZmluaXR5O2NvbnN0IG49W107Zm9yKGxldCBwPTA7cDxjO3ArKyl7bltwXT1bXTtmb3IobGV0IHE9MDtxPGQ7cSsrKXtjb25zdCByPW5bcF1bcV09e3dpZHRoOnE/bltwXVtxLTFdLndpZHRoOjAsaGVpZ2h0OnA/bltwLTFdW3FdLmhlaWdodDowfSx0PXRoaXMuZ2V0Q2VsbCh0aGlzLnZlcnRpY2FsS2V5c1twXSx0aGlzLmhvcml6b250YWxLZXlzW3FdKTtpZighdHx8IXQuaXRlbXN8fCF0Lml0ZW1zLmxlbmd0aCljb250aW51ZTtjb25zdCBbdix5XT10aGlzLmNvbXB1dGVDZWxsRGltZW5zaW9ucyhhLHQuaXRlbXMubGVuZ3RoKTtyLndpZHRoKz12O3IuaGVpZ2h0Kz0KeTtmPU1hdGgubWF4KGYsci53aWR0aCk7Zz1NYXRoLm1heChnLHkpO2w9TWF0aC5tYXgobCx2KTtrPU1hdGgubWF4KGssci5oZWlnaHQpfX10aGlzLnZlcnRpY2FsR3JpZEFsaWdubWVudD09PU9wLlVuaWZvcm0mJihrPWcqYyk7dGhpcy5ob3Jpem9udGFsR3JpZEFsaWdubWVudD09PU9wLlVuaWZvcm0mJihmPWwqZCk7YT10aGlzLmNlbGxNYXJnaW4qdGhpcy5pdGVtQXNwZWN0UmF0aW87cmV0dXJuKGYrYSooZC0xKSkvKGsrYSooYy0xKSl9Y29tcHV0ZUNlbGxEaW1lbnNpb25zKGEsYyl7Y29uc3QgZD1bdGhpcy5pdGVtQXNwZWN0UmF0aW8qKHRoaXMuY2VsbFBhZGRpbmcubGVmdCt0aGlzLmNlbGxQYWRkaW5nLnJpZ2h0KSx0aGlzLml0ZW1Bc3BlY3RSYXRpbyoodGhpcy5jZWxsUGFkZGluZy50b3ArdGhpcy5jZWxsUGFkZGluZy5ib3R0b20pXTtpZighYylyZXR1cm4gZDthPU1hdGgubWluKGMsTWF0aC5jZWlsKE1hdGguc3FydChhKmMpL3RoaXMuaXRlbUFzcGVjdFJhdGlvKSk7ZFswXSs9CnRoaXMuaXRlbUFzcGVjdFJhdGlvKmE7ZFsxXSs9TWF0aC5jZWlsKGMvYSk7cmV0dXJuIGR9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9mYWNldHMtZGl2ZS9saWIvYXhpcy5qcwpjbGFzcyBRcCBleHRlbmRzIEdwe2NvbnN0cnVjdG9yKGEsYyl7c3VwZXIoKTt0aGlzLnNpZGU9YTt0aGlzLmNlbGw9Yztzd2l0Y2goYSl7Y2FzZSBGcC5MZWZ0OnRoaXMubWluU2NhbGU9MzAvYy5pbm5lckhlaWdodDtmb3IoYT1jLnNpYmxpbmdzLmxlZnQ7ISghYXx8YS5pdGVtcy5sZW5ndGh8fGEuc2libGluZ3MuYWJvdmUmJmEuc2libGluZ3MuYWJvdmUuaXRlbXMubGVuZ3RoKTspYT1hLnNpYmxpbmdzLmxlZnQ7YSYmKHRoaXMubWluU2NhbGU9TWF0aC5tYXgodGhpcy5taW5TY2FsZSwzOS4yLyhjLmNvbnRlbnRYLShhLmNvbnRlbnRYK2EuaW5uZXJXaWR0aCkpKSk7YnJlYWs7Y2FzZSBGcC5Cb3R0b206dGhpcy5taW5TY2FsZT0zMC9jLmlubmVyV2lkdGg7Zm9yKGE9Yy5zaWJsaW5ncy5iZWxvdzshKCFhfHxhLml0ZW1zLmxlbmd0aHx8YS5zaWJsaW5ncy5yaWdodCYmYS5zaWJsaW5ncy5yaWdodC5pdGVtcy5sZW5ndGgpOylhPWEuc2libGluZ3MuYmVsb3c7YSYmKHRoaXMubWluU2NhbGU9Ck1hdGgubWF4KHRoaXMubWluU2NhbGUsMzkuMi8oYy5jb250ZW50WS0oYS5jb250ZW50WSthLmlubmVySGVpZ2h0KSkpKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJBeGVzIGZvciBzcGVjaWZpZWQgc2lkZSBhcmUgbm90IGltcGxlbWVudGVkLiIpO319c3Ryb2tlV2lkdGgoYSl7cmV0dXJuIDEuMi9hfXBhdGgoYSl7Y29uc3QgYz00L2EsZD02L2E7cmV0dXJuIHRoaXMuc2lkZT09PUZwLkxlZnQ/YE0gJHt0aGlzLmNlbGwuY29udGVudFgtYy1kfSwke3RoaXMuY2VsbC5jb250ZW50WSsuNi9hfSBoICR7ZH0gdiAke3RoaXMuY2VsbC5pbm5lckhlaWdodC0xLjIvYX0gaCAtJHtkfWA6dGhpcy5zaWRlPT09RnAuQm90dG9tP2BNICR7dGhpcy5jZWxsLmNvbnRlbnRYKy42L2F9LCR7dGhpcy5jZWxsLmNvbnRlbnRZLWMtZH0gdiAke2R9IGggJHt0aGlzLmNlbGwuaW5uZXJXaWR0aC0xLjIvYX0gdiAtJHtkfWA6IiJ9a2V5KCl7cmV0dXJuYCR7dGhpcy5jZWxsLmNvbXBvdW5kS2V5fS0ke3RoaXMuc2lkZX1gfX0KOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2ZhY2V0cy1kaXZlL2xpYi9kYXRhLWV4YW1wbGUuanMKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9mYWNldHMtZGl2ZS9saWIvbGFiZWwuanMKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9mYWNldHMtZGl2ZS9saWIvbGF5b3V0LmpzCmNsYXNzIFJwe2NvbnN0cnVjdG9yKCl7dGhpcy5ncmlkPXtib3R0b206MCxsZWZ0OjAscmlnaHQ6MCx0b3A6MH07dGhpcy52aWV3cG9ydD17aGVpZ2h0OjAsd2lkdGg6MH07dGhpcy5wYWRkaW5nPXtib3R0b206MCxsZWZ0OjAscmlnaHQ6MCx0b3A6MH19Y29tcHV0ZVNjYWxlKCl7Y29uc3QgYT10aGlzLnZpZXdwb3J0LndpZHRoLXRoaXMucGFkZGluZy5sZWZ0LXRoaXMucGFkZGluZy5yaWdodCxjPXRoaXMudmlld3BvcnQuaGVpZ2h0LXRoaXMucGFkZGluZy50b3AtdGhpcy5wYWRkaW5nLmJvdHRvbTtpZihpc05hTihhKXx8MD49YXx8aXNOYU4oYyl8fDA+PWMpcmV0dXJuIE5hTjtjb25zdCBkPXRoaXMuZ3JpZC5yaWdodC10aGlzLmdyaWQubGVmdCxmPXRoaXMuZ3JpZC50b3AtdGhpcy5ncmlkLmJvdHRvbTtyZXR1cm4gaXNOYU4oZCl8fDA+PWR8fGlzTmFOKGYpfHwwPj1mP05hTjphL2M+ZC9mP2MvZjphL2R9Y29tcHV0ZUNhbWVyYSgpe2NvbnN0IGE9dGhpcy5jb21wdXRlU2NhbGUoKTsKaWYoaXNOYU4oYSl8fDA+PWEpcmV0dXJue3Bvc2l0aW9uOnt4Ok5hTix5Ok5hTn0sZnJ1c3R1bTp7Ym90dG9tOk5hTixsZWZ0Ok5hTixyaWdodDpOYU4sdG9wOk5hTn19O2NvbnN0IGM9dGhpcy52aWV3cG9ydC53aWR0aC9hLGQ9dGhpcy52aWV3cG9ydC5oZWlnaHQvYTtyZXR1cm57cG9zaXRpb246e3g6dGhpcy5ncmlkLmxlZnQtKGMtKHRoaXMucGFkZGluZy5sZWZ0K3RoaXMucGFkZGluZy5yaWdodCkvYS0odGhpcy5ncmlkLnJpZ2h0LXRoaXMuZ3JpZC5sZWZ0KSkvMi10aGlzLnBhZGRpbmcubGVmdC9hLHk6dGhpcy5ncmlkLnRvcCsoZC0odGhpcy5wYWRkaW5nLnRvcCt0aGlzLnBhZGRpbmcuYm90dG9tKS9hLSh0aGlzLmdyaWQudG9wLXRoaXMuZ3JpZC5ib3R0b20pKS8yK3RoaXMucGFkZGluZy50b3AvYX0sZnJ1c3R1bTp7Ym90dG9tOi1kLGxlZnQ6MCxyaWdodDpjLHRvcDowfX19cmVkdWNlUGFkZGluZ1RvRml0V2lkdGgoYSl7aWYoMjAwPmEpdGhpcy5wYWRkaW5nLmxlZnQ9MCx0aGlzLnBhZGRpbmcucmlnaHQ9CjA7ZWxzZSBpZih0aGlzLnBhZGRpbmcubGVmdCt0aGlzLnBhZGRpbmcucmlnaHQrMjAwPmEpe2NvbnN0IGM9dGhpcy5wYWRkaW5nLmxlZnQrdGhpcy5wYWRkaW5nLnJpZ2h0O2EtPTIwMDt0aGlzLnBhZGRpbmcubGVmdD10aGlzLnBhZGRpbmcubGVmdC9jKmF8fDA7dGhpcy5wYWRkaW5nLnJpZ2h0PXRoaXMucGFkZGluZy5yaWdodC9jKmF8fDB9fXJlZHVjZVBhZGRpbmdUb0ZpdEhlaWdodChhKXtpZigyMDA+YSl0aGlzLnBhZGRpbmcudG9wPTAsdGhpcy5wYWRkaW5nLmJvdHRvbT0wO2Vsc2UgaWYodGhpcy5wYWRkaW5nLnRvcCt0aGlzLnBhZGRpbmcuYm90dG9tKzIwMD5hKXtjb25zdCBjPXRoaXMucGFkZGluZy50b3ArdGhpcy5wYWRkaW5nLmJvdHRvbTthLT0yMDA7dGhpcy5wYWRkaW5nLnRvcD10aGlzLnBhZGRpbmcudG9wL2MqYXx8MDt0aGlzLnBhZGRpbmcuYm90dG9tPXRoaXMucGFkZGluZy5ib3R0b20vYyphfHwwfX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2ZhY2V0cy1kaXZlL2xpYi90ZXh0LmpzCnZhciBTcDsoZnVuY3Rpb24oYSl7YVthLkxlZnQ9MF09IkxlZnQiO2FbYS5SaWdodD0xXT0iUmlnaHQiO2FbYS5DZW50ZXI9Ml09IkNlbnRlciJ9KShTcHx8KFNwPXt9KSk7dmFyIFRwOyhmdW5jdGlvbihhKXthW2EuVG9wPTBdPSJUb3AiO2FbYS5Cb3R0b209MV09IkJvdHRvbSI7YVthLk1pZGRsZT0yXT0iTWlkZGxlIn0pKFRwfHwoVHA9e30pKTtjb25zdCBVcD17eDowLHk6MCxnbHlwaEFzcGVjdFJhdGlvOi42LGxpbmVIZWlnaHQ6MS4xLGhvcml6b250YWxBbGlnbjpTcC5DZW50ZXIsdmVydGljYWxBbGlnbjpUcC5NaWRkbGV9OwpjbGFzcyBWcHtjb25zdHJ1Y3RvcihhKXt0aGlzLnNldHRpbmdzPU9iamVjdC5hc3NpZ24oe30sVXAsYSl9Zml0KGEpe2E9YS50cmltKCk7Y29uc3Qge21heDpjLHNlZ21lbnRzOmR9PXRoaXMuc3BsaXQoYSkse2N1dG9mZjpmLHdpZHRoOmcsaGVpZ2h0Omx9PXRoaXMuY29tcHV0ZUN1dG9mZihkLGEubGVuZ3RoLGMpO2E9Zyp0aGlzLnNldHRpbmdzLmdseXBoQXNwZWN0UmF0aW87YT1hL2w+dGhpcy5zZXR0aW5ncy53aWR0aC90aGlzLnNldHRpbmdzLmhlaWdodD90aGlzLnNldHRpbmdzLndpZHRoL2E6dGhpcy5zZXR0aW5ncy5oZWlnaHQvbDtjb25zdCBrPXRoaXMuc2V0dGluZ3MuaG9yaXpvbnRhbEFsaWduPT09U3AuTGVmdD8wOnRoaXMuc2V0dGluZ3MuaG9yaXpvbnRhbEFsaWduPT09U3AuUmlnaHQ/MTouNSxuPU1hdGgubWF4KDAsdGhpcy5zZXR0aW5ncy5oZWlnaHQtbCphKSoodGhpcy5zZXR0aW5ncy52ZXJ0aWNhbEFsaWduPT09VHAuVG9wPzA6dGhpcy5zZXR0aW5ncy52ZXJ0aWNhbEFsaWduPT09ClRwLkJvdHRvbT8xOi41KSxwPXRoaXMud3JhcExpbmVzKGQsZikscT1bXTtmb3IobGV0IHI9MDtyPHAubGVuZ3RoO3IrKyl7Y29uc3Qge3N0YXJ0UG9zOnQsZW5kUG9zOnZ9PXBbcl07bGV0IHk9IiI7Zm9yKGxldCB6PXQ7ejx2O3orKyl5Kz1kW3pdLnRleHQ7cS5wdXNoKHt0ZXh0OnkseDp0aGlzLnNldHRpbmdzLngraypNYXRoLm1heCgwLHRoaXMuc2V0dGluZ3Mud2lkdGgteS5sZW5ndGgqdGhpcy5zZXR0aW5ncy5nbHlwaEFzcGVjdFJhdGlvKmEpLHk6dGhpcy5zZXR0aW5ncy55K24rcip0aGlzLnNldHRpbmdzLmxpbmVIZWlnaHQqYX0pfXJldHVybntsaW5lczpxLGZvbnRTaXplOmF9fXNwbGl0KGEpe2NvbnN0IGM9W107bGV0IGQ9MSxmPS9ccy8udGVzdChhLmNoYXJBdCgwKSksZz0wLGw9MDtmb3IoO2Q8PWEubGVuZ3RoOyl7Y29uc3Qgaz1hLmNoYXJBdChkKSxuPS9ccy8udGVzdChrKTtrLmxlbmd0aCYmZj09PW58fChsPU1hdGgubWF4KGwsZC1nKSxjLnB1c2goe3RleHQ6YS5zdWJzdHJpbmcoZywKZCksd2hpdGVzcGFjZTpmfSksZz1kKTtmPW47ZCsrfXJldHVybnttYXg6bCxzZWdtZW50czpjfX1jb21wdXRlVGV4dFJlY3QoYSxjKXtsZXQgZD0wLGY9MCxnPTAsbD0xO2ZvcihsZXQgaz0wO2s8YS5sZW5ndGg7aysrKXtjb25zdCB7dGV4dDpuLHdoaXRlc3BhY2U6cH09YVtrXSxxPW4ubGVuZ3RoO2lmKCFwfHxkKXA/ZCtxPD1jP2QrPXE6KGY9ZD0wLGwrPXRoaXMuc2V0dGluZ3MubGluZUhlaWdodCk6ZCtxPD1jP2Y9ZCs9cTooZj9kPWY9cTooZz1NYXRoLm1heChnLHEpLGQ9Zj0wKSxsKz10aGlzLnNldHRpbmdzLmxpbmVIZWlnaHQpLGc9TWF0aC5tYXgoZyxmKX1yZXR1cm57d2lkdGg6ZyxoZWlnaHQ6bH19Y29tcHV0ZUN1dG9mZihhLGMsZCl7Y29uc3QgZj10aGlzLnNldHRpbmdzLndpZHRoL3RoaXMuc2V0dGluZ3MuaGVpZ2h0O2xldCBnPWQrKGMtZCkvMixsPWcsaz1udWxsLG49SW5maW5pdHk7Y29uc3QgcD1NYXRoLm1pbigyMCwoYS5sZW5ndGgrMSkvMik7bGV0IHE9MDtmb3IoO3E8CnA7KXtxKys7Y29uc3Qgcj10aGlzLmNvbXB1dGVUZXh0UmVjdChhLGcpLHQ9ci53aWR0aC9yLmhlaWdodCp0aGlzLnNldHRpbmdzLmdseXBoQXNwZWN0UmF0aW8sdj1NYXRoLmFicygxLXQvZik7djxuJiYobD1nLGs9cixuPXYpO2lmKC4wMT52KWJyZWFrO3Q+Zj9jPWc6ZD1nO2c9ZCsoYy1kKS8yfXJldHVybntjdXRvZmY6bCx3aWR0aDprLndpZHRoLGhlaWdodDprLmhlaWdodH19d3JhcExpbmVzKGEsYyl7Y29uc3QgZD1bXTtsZXQgZj0wLGc9MCxsPTAsaz0wO2ZvcihsZXQgbj0wO248YS5sZW5ndGg7bisrKXtjb25zdCB7dGV4dDpwLHdoaXRlc3BhY2U6cX09YVtuXSxyPXAubGVuZ3RoO3EmJiFsP2Y9Zz1uKzE6cT9sK3I8PWM/bCs9cjooZC5wdXNoKHtzdGFydFBvczpmLGVuZFBvczpnLHRleHRMZW5ndGg6a30pLGw9az0wLGY9Zz1uKzEpOmwrcjw9Yz8oaz1sKz1yLGc9bisxKTprPyhkLnB1c2goe3N0YXJ0UG9zOmYsZW5kUG9zOmcsdGV4dExlbmd0aDprfSksbD1rPXIsZj1uLGc9bisKMSk6KGQucHVzaCh7c3RhcnRQb3M6bixlbmRQb3M6bisxLHRleHRMZW5ndGg6cn0pLGw9az0wLGY9Zz1uKzEpfWc+ZiYmZC5wdXNoKHtzdGFydFBvczpmLGVuZFBvczpnLHRleHRMZW5ndGg6a30pO3JldHVybiBkfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy90aHJlZS5qcwooZnVuY3Rpb24oYSxjKXsib2JqZWN0Ij09PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9PXR5cGVvZiBtb2R1bGU/YyhleHBvcnRzKToiZnVuY3Rpb24iPT09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIl0sYyk6KGE9YXx8c2VsZixjKGEuVEhSRUU9e30pKX0pKHRoaXMsZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYygpe31mdW5jdGlvbiBkKGIsZSl7dGhpcy54PWJ8fDA7dGhpcy55PWV8fDB9ZnVuY3Rpb24gZihiLGUsaCxtKXt0aGlzLl94PWJ8fDA7dGhpcy5feT1lfHwwO3RoaXMuX3o9aHx8MDt0aGlzLl93PXZvaWQgMCE9PW0/bToxfWZ1bmN0aW9uIGcoYixlLGgpe3RoaXMueD1ifHwwO3RoaXMueT1lfHwwO3RoaXMuej1ofHwwfWZ1bmN0aW9uIGwoKXt0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDEsMCwwLDAsMV07MDxhcmd1bWVudHMubGVuZ3RoJiZjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXgzOiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLiIpfQpmdW5jdGlvbiBrKGIsZSxoLG0sdSx3LEEsRSxHLEope09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOkpxKyt9KTt0aGlzLnV1aWQ9bGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy5uYW1lPSIiO3RoaXMuaW1hZ2U9dm9pZCAwIT09Yj9iOmsuREVGQVVMVF9JTUFHRTt0aGlzLm1pcG1hcHM9W107dGhpcy5tYXBwaW5nPXZvaWQgMCE9PWU/ZTprLkRFRkFVTFRfTUFQUElORzt0aGlzLndyYXBTPXZvaWQgMCE9PWg/aDoxMDAxO3RoaXMud3JhcFQ9dm9pZCAwIT09bT9tOjEwMDE7dGhpcy5tYWdGaWx0ZXI9dm9pZCAwIT09dT91OjEwMDY7dGhpcy5taW5GaWx0ZXI9dm9pZCAwIT09dz93OjEwMDg7dGhpcy5hbmlzb3Ryb3B5PXZvaWQgMCE9PUc/RzoxO3RoaXMuZm9ybWF0PXZvaWQgMCE9PUE/QToxMDIzO3RoaXMudHlwZT12b2lkIDAhPT1FP0U6MTAwOTt0aGlzLm9mZnNldD1uZXcgZCgwLDApO3RoaXMucmVwZWF0PW5ldyBkKDEsMSk7dGhpcy5jZW50ZXI9bmV3IGQoMCwwKTsKdGhpcy5yb3RhdGlvbj0wO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0hMDt0aGlzLm1hdHJpeD1uZXcgbDt0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMDt0aGlzLnByZW11bHRpcGx5QWxwaGE9ITE7dGhpcy5mbGlwWT0hMDt0aGlzLnVucGFja0FsaWdubWVudD00O3RoaXMuZW5jb2Rpbmc9dm9pZCAwIT09Sj9KOjNFMzt0aGlzLnZlcnNpb249MDt0aGlzLm9uVXBkYXRlPW51bGx9ZnVuY3Rpb24gbihiLGUsaCxtKXt0aGlzLng9Ynx8MDt0aGlzLnk9ZXx8MDt0aGlzLno9aHx8MDt0aGlzLnc9dm9pZCAwIT09bT9tOjF9ZnVuY3Rpb24gcChiLGUsaCl7dGhpcy53aWR0aD1iO3RoaXMuaGVpZ2h0PWU7dGhpcy5zY2lzc29yPW5ldyBuKDAsMCxiLGUpO3RoaXMuc2Npc3NvclRlc3Q9ITE7dGhpcy52aWV3cG9ydD1uZXcgbigwLDAsYixlKTtoPWh8fHt9O3RoaXMudGV4dHVyZT1uZXcgayh2b2lkIDAsdm9pZCAwLGgud3JhcFMsaC53cmFwVCxoLm1hZ0ZpbHRlcixoLm1pbkZpbHRlcixoLmZvcm1hdCxoLnR5cGUsCmguYW5pc290cm9weSxoLmVuY29kaW5nKTt0aGlzLnRleHR1cmUuaW1hZ2U9e307dGhpcy50ZXh0dXJlLmltYWdlLndpZHRoPWI7dGhpcy50ZXh0dXJlLmltYWdlLmhlaWdodD1lO3RoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9dm9pZCAwIT09aC5nZW5lcmF0ZU1pcG1hcHM/aC5nZW5lcmF0ZU1pcG1hcHM6ITE7dGhpcy50ZXh0dXJlLm1pbkZpbHRlcj12b2lkIDAhPT1oLm1pbkZpbHRlcj9oLm1pbkZpbHRlcjoxMDA2O3RoaXMuZGVwdGhCdWZmZXI9dm9pZCAwIT09aC5kZXB0aEJ1ZmZlcj9oLmRlcHRoQnVmZmVyOiEwO3RoaXMuc3RlbmNpbEJ1ZmZlcj12b2lkIDAhPT1oLnN0ZW5jaWxCdWZmZXI/aC5zdGVuY2lsQnVmZmVyOiEwO3RoaXMuZGVwdGhUZXh0dXJlPXZvaWQgMCE9PWguZGVwdGhUZXh0dXJlP2guZGVwdGhUZXh0dXJlOm51bGx9ZnVuY3Rpb24gcShiLGUsaCl7cC5jYWxsKHRoaXMsYixlLGgpO3RoaXMuc2FtcGxlcz00fWZ1bmN0aW9uIHIoKXt0aGlzLmVsZW1lbnRzPQpbMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV07MDxhcmd1bWVudHMubGVuZ3RoJiZjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLiIpfWZ1bmN0aW9uIHQoYixlLGgsbSl7dGhpcy5feD1ifHwwO3RoaXMuX3k9ZXx8MDt0aGlzLl96PWh8fDA7dGhpcy5fb3JkZXI9bXx8dC5EZWZhdWx0T3JkZXJ9ZnVuY3Rpb24gdigpe3RoaXMubWFzaz0xfWZ1bmN0aW9uIHkoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpLcSsrfSk7dGhpcy51dWlkPWxiLmdlbmVyYXRlVVVJRCgpO3RoaXMubmFtZT0iIjt0aGlzLnR5cGU9Ik9iamVjdDNEIjt0aGlzLnBhcmVudD1udWxsO3RoaXMuY2hpbGRyZW49W107dGhpcy51cD15LkRlZmF1bHRVcC5jbG9uZSgpO3ZhciBiPW5ldyBnLGU9bmV3IHQsaD1uZXcgZixtPW5ldyBnKDEsMSwxKTtlLl9vbkNoYW5nZShmdW5jdGlvbigpe2guc2V0RnJvbUV1bGVyKGUsCiExKX0pO2guX29uQ2hhbmdlKGZ1bmN0aW9uKCl7ZS5zZXRGcm9tUXVhdGVybmlvbihoLHZvaWQgMCwhMSl9KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtwb3NpdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6Yn0scm90YXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmV9LHF1YXRlcm5pb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmh9LHNjYWxlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTptfSxtb2RlbFZpZXdNYXRyaXg6e3ZhbHVlOm5ldyByfSxub3JtYWxNYXRyaXg6e3ZhbHVlOm5ldyBsfX0pO3RoaXMubWF0cml4PW5ldyByO3RoaXMubWF0cml4V29ybGQ9bmV3IHI7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPXkuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGU7dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExO3RoaXMubGF5ZXJzPW5ldyB2O3RoaXMudmlzaWJsZT0hMDsKdGhpcy5yZWNlaXZlU2hhZG93PXRoaXMuY2FzdFNoYWRvdz0hMTt0aGlzLmZydXN0dW1DdWxsZWQ9ITA7dGhpcy5yZW5kZXJPcmRlcj0wO3RoaXMudXNlckRhdGE9e319ZnVuY3Rpb24geigpe3kuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNjZW5lIjt0aGlzLm92ZXJyaWRlTWF0ZXJpYWw9dGhpcy5mb2c9dGhpcy5iYWNrZ3JvdW5kPW51bGw7dGhpcy5hdXRvVXBkYXRlPSEwOyJ1bmRlZmluZWQiIT09dHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyYmX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJvYnNlcnZlIix7ZGV0YWlsOnRoaXN9KSl9ZnVuY3Rpb24geChiLGUpe3RoaXMubWluPXZvaWQgMCE9PWI/YjpuZXcgZyhJbmZpbml0eSxJbmZpbml0eSxJbmZpbml0eSk7dGhpcy5tYXg9dm9pZCAwIT09ZT9lOm5ldyBnKC1JbmZpbml0eSwtSW5maW5pdHksLUluZmluaXR5KX1mdW5jdGlvbiBDKGIsZSxoLG0sdSl7dmFyIHc7dmFyIEE9MDtmb3Iodz1iLmxlbmd0aC0KMztBPD13O0ErPTMpe0llLmZyb21BcnJheShiLEEpO3ZhciBFPWUuZG90KEllKSxHPWguZG90KEllKSxKPW0uZG90KEllKTtpZihNYXRoLm1heCgtTWF0aC5tYXgoRSxHLEopLE1hdGgubWluKEUsRyxKKSk+dS54Kk1hdGguYWJzKEllLngpK3UueSpNYXRoLmFicyhJZS55KSt1LnoqTWF0aC5hYnMoSWUueikpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gRihiLGUpe3RoaXMuY2VudGVyPXZvaWQgMCE9PWI/YjpuZXcgZzt0aGlzLnJhZGl1cz12b2lkIDAhPT1lP2U6MH1mdW5jdGlvbiBEKGIsZSl7dGhpcy5vcmlnaW49dm9pZCAwIT09Yj9iOm5ldyBnO3RoaXMuZGlyZWN0aW9uPXZvaWQgMCE9PWU/ZTpuZXcgZ31mdW5jdGlvbiBCKGIsZSxoKXt0aGlzLmE9dm9pZCAwIT09Yj9iOm5ldyBnO3RoaXMuYj12b2lkIDAhPT1lP2U6bmV3IGc7dGhpcy5jPXZvaWQgMCE9PWg/aDpuZXcgZ31mdW5jdGlvbiBJKGIsZSxoKXtyZXR1cm4gdm9pZCAwPT09ZSYmdm9pZCAwPT09aD90aGlzLnNldChiKToKdGhpcy5zZXRSR0IoYixlLGgpfWZ1bmN0aW9uIE8oYixlLGgpezA+aCYmKGgrPTEpOzE8aCYmLS1oO3JldHVybiBoPDEvNj9iKzYqKGUtYikqaDouNT5oP2U6aDwyLzM/Yis2KihlLWIpKigyLzMtaCk6Yn1mdW5jdGlvbiBQKGIpe3JldHVybi4wNDA0NT5iPy4wNzczOTkzODA4KmI6TWF0aC5wb3coLjk0Nzg2NzI5ODYqYisuMDUyMTMyNzAxNCwyLjQpfWZ1bmN0aW9uIEgoYil7cmV0dXJuLjAwMzEzMDg+Yj8xMi45MipiOjEuMDU1Kk1hdGgucG93KGIsLjQxNjY2KS0uMDU1fWZ1bmN0aW9uIEsoYixlLGgsbSx1LHcpe3RoaXMuYT1iO3RoaXMuYj1lO3RoaXMuYz1oO3RoaXMubm9ybWFsPW0mJm0uaXNWZWN0b3IzP206bmV3IGc7dGhpcy52ZXJ0ZXhOb3JtYWxzPUFycmF5LmlzQXJyYXkobSk/bTpbXTt0aGlzLmNvbG9yPXUmJnUuaXNDb2xvcj91Om5ldyBJO3RoaXMudmVydGV4Q29sb3JzPUFycmF5LmlzQXJyYXkodSk/dTpbXTt0aGlzLm1hdGVyaWFsSW5kZXg9dm9pZCAwIT09dz93OjB9CmZ1bmN0aW9uIE0oKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpMcSsrfSk7dGhpcy51dWlkPWxiLmdlbmVyYXRlVVVJRCgpO3RoaXMubmFtZT0iIjt0aGlzLnR5cGU9Ik1hdGVyaWFsIjt0aGlzLmxpZ2h0cz10aGlzLmZvZz0hMDt0aGlzLmJsZW5kaW5nPTE7dGhpcy5zaWRlPTA7dGhpcy52ZXJ0ZXhUYW5nZW50cz10aGlzLmZsYXRTaGFkaW5nPSExO3RoaXMudmVydGV4Q29sb3JzPTA7dGhpcy5vcGFjaXR5PTE7dGhpcy50cmFuc3BhcmVudD0hMTt0aGlzLmJsZW5kU3JjPTIwNDt0aGlzLmJsZW5kRHN0PTIwNTt0aGlzLmJsZW5kRXF1YXRpb249MTAwO3RoaXMuYmxlbmRFcXVhdGlvbkFscGhhPXRoaXMuYmxlbmREc3RBbHBoYT10aGlzLmJsZW5kU3JjQWxwaGE9bnVsbDt0aGlzLmRlcHRoRnVuYz0zO3RoaXMuZGVwdGhXcml0ZT10aGlzLmRlcHRoVGVzdD0hMDt0aGlzLnN0ZW5jaWxGdW5jPTUxOTt0aGlzLnN0ZW5jaWxSZWY9MDt0aGlzLnN0ZW5jaWxNYXNrPQoyNTU7dGhpcy5zdGVuY2lsWlBhc3M9dGhpcy5zdGVuY2lsWkZhaWw9dGhpcy5zdGVuY2lsRmFpbD03NjgwO3RoaXMuc3RlbmNpbFdyaXRlPSExO3RoaXMuY2xpcHBpbmdQbGFuZXM9bnVsbDt0aGlzLmNsaXBTaGFkb3dzPXRoaXMuY2xpcEludGVyc2VjdGlvbj0hMTt0aGlzLnNoYWRvd1NpZGU9bnVsbDt0aGlzLmNvbG9yV3JpdGU9ITA7dGhpcy5wcmVjaXNpb249bnVsbDt0aGlzLnBvbHlnb25PZmZzZXQ9ITE7dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHM9dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yPTA7dGhpcy5kaXRoZXJpbmc9ITE7dGhpcy5hbHBoYVRlc3Q9MDt0aGlzLnByZW11bHRpcGxpZWRBbHBoYT0hMTt0aGlzLnRvbmVNYXBwZWQ9dGhpcy52aXNpYmxlPSEwO3RoaXMudXNlckRhdGE9e307dGhpcy5uZWVkc1VwZGF0ZT0hMH1mdW5jdGlvbiBMKGIpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hCYXNpY01hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLmxpZ2h0TWFwPQp0aGlzLm1hcD1udWxsO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9MTt0aGlzLmFvTWFwPW51bGw7dGhpcy5hb01hcEludGVuc2l0eT0xO3RoaXMuZW52TWFwPXRoaXMuYWxwaGFNYXA9dGhpcy5zcGVjdWxhck1hcD1udWxsO3RoaXMuY29tYmluZT0wO3RoaXMucmVmbGVjdGl2aXR5PTE7dGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4O3RoaXMud2lyZWZyYW1lPSExO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPTE7dGhpcy53aXJlZnJhbWVMaW5lam9pbj10aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIjt0aGlzLmxpZ2h0cz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPSExO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uIFIoYixlLGgpe2lmKEFycmF5LmlzQXJyYXkoYikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTt0aGlzLm5hbWU9IiI7dGhpcy5hcnJheT1iO3RoaXMuaXRlbVNpemU9CmU7dGhpcy5jb3VudD12b2lkIDAhPT1iP2IubGVuZ3RoL2U6MDt0aGlzLm5vcm1hbGl6ZWQ9ITA9PT1oO3RoaXMuZHluYW1pYz0hMTt0aGlzLnVwZGF0ZVJhbmdlPXtvZmZzZXQ6MCxjb3VudDotMX07dGhpcy52ZXJzaW9uPTB9ZnVuY3Rpb24gVShiLGUsaCl7Ui5jYWxsKHRoaXMsbmV3IEludDhBcnJheShiKSxlLGgpfWZ1bmN0aW9uIFkoYixlLGgpe1IuY2FsbCh0aGlzLG5ldyBVaW50OEFycmF5KGIpLGUsaCl9ZnVuY3Rpb24gYmEoYixlLGgpe1IuY2FsbCh0aGlzLG5ldyBVaW50OENsYW1wZWRBcnJheShiKSxlLGgpfWZ1bmN0aW9uIG1hKGIsZSxoKXtSLmNhbGwodGhpcyxuZXcgSW50MTZBcnJheShiKSxlLGgpfWZ1bmN0aW9uIGFhKGIsZSxoKXtSLmNhbGwodGhpcyxuZXcgVWludDE2QXJyYXkoYiksZSxoKX1mdW5jdGlvbiBjYShiLGUsaCl7Ui5jYWxsKHRoaXMsbmV3IEludDMyQXJyYXkoYiksZSxoKX1mdW5jdGlvbiBmYShiLGUsaCl7Ui5jYWxsKHRoaXMsbmV3IFVpbnQzMkFycmF5KGIpLAplLGgpfWZ1bmN0aW9uIGRhKGIsZSxoKXtSLmNhbGwodGhpcyxuZXcgRmxvYXQzMkFycmF5KGIpLGUsaCl9ZnVuY3Rpb24gbGEoYixlLGgpe1IuY2FsbCh0aGlzLG5ldyBGbG9hdDY0QXJyYXkoYiksZSxoKX1mdW5jdGlvbiBaKCl7dGhpcy52ZXJ0aWNlcz1bXTt0aGlzLm5vcm1hbHM9W107dGhpcy5jb2xvcnM9W107dGhpcy51dnM9W107dGhpcy51dnMyPVtdO3RoaXMuZ3JvdXBzPVtdO3RoaXMubW9ycGhUYXJnZXRzPXt9O3RoaXMuc2tpbldlaWdodHM9W107dGhpcy5za2luSW5kaWNlcz1bXTt0aGlzLmJvdW5kaW5nU3BoZXJlPXRoaXMuYm91bmRpbmdCb3g9bnVsbDt0aGlzLmdyb3Vwc05lZWRVcGRhdGU9dGhpcy51dnNOZWVkVXBkYXRlPXRoaXMuY29sb3JzTmVlZFVwZGF0ZT10aGlzLm5vcm1hbHNOZWVkVXBkYXRlPXRoaXMudmVydGljZXNOZWVkVXBkYXRlPSExfWZ1bmN0aW9uIEZhKGIpe2lmKDA9PT1iLmxlbmd0aClyZXR1cm4tSW5maW5pdHk7Zm9yKHZhciBlPWJbMF0saD0xLG09CmIubGVuZ3RoO2g8bTsrK2gpYltoXT5lJiYoZT1iW2hdKTtyZXR1cm4gZX1mdW5jdGlvbiB4YSgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOk1xKz0yfSk7dGhpcy51dWlkPWxiLmdlbmVyYXRlVVVJRCgpO3RoaXMubmFtZT0iIjt0aGlzLnR5cGU9IkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLmluZGV4PW51bGw7dGhpcy5hdHRyaWJ1dGVzPXt9O3RoaXMubW9ycGhBdHRyaWJ1dGVzPXt9O3RoaXMuZ3JvdXBzPVtdO3RoaXMuYm91bmRpbmdTcGhlcmU9dGhpcy5ib3VuZGluZ0JveD1udWxsO3RoaXMuZHJhd1JhbmdlPXtzdGFydDowLGNvdW50OkluZmluaXR5fTt0aGlzLnVzZXJEYXRhPXt9fWZ1bmN0aW9uIHlhKGIsZSl7eS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTWVzaCI7dGhpcy5nZW9tZXRyeT12b2lkIDAhPT1iP2I6bmV3IHhhO3RoaXMubWF0ZXJpYWw9dm9pZCAwIT09ZT9lOm5ldyBMKHtjb2xvcjoxNjc3NzIxNSpNYXRoLnJhbmRvbSgpfSk7dGhpcy5kcmF3TW9kZT0KMDt0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpfWZ1bmN0aW9uIEJhKGIsZSxoLG0sdSx3LEEsRSl7aWYobnVsbD09PSgxPT09ZS5zaWRlP20uaW50ZXJzZWN0VHJpYW5nbGUoQSx3LHUsITAsRSk6bS5pbnRlcnNlY3RUcmlhbmdsZSh1LHcsQSwyIT09ZS5zaWRlLEUpKSlyZXR1cm4gbnVsbDtwaS5jb3B5KEUpO3BpLmFwcGx5TWF0cml4NChiLm1hdHJpeFdvcmxkKTtlPWgucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKHBpKTtyZXR1cm4gZTxoLm5lYXJ8fGU+aC5mYXI/bnVsbDp7ZGlzdGFuY2U6ZSxwb2ludDpwaS5jbG9uZSgpLG9iamVjdDpifX1mdW5jdGlvbiBHYShiLGUsaCxtLHUsdyxBLEUsRyxKLFEpe0plLmZyb21CdWZmZXJBdHRyaWJ1dGUodSxHKTtLZS5mcm9tQnVmZmVyQXR0cmlidXRlKHUsSik7TGUuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh1LFEpO3U9Yi5tb3JwaFRhcmdldEluZmx1ZW5jZXM7aWYoZS5tb3JwaFRhcmdldHMmJncmJnUpe2xrLnNldCgwLDAsMCk7bWsuc2V0KDAsMCwwKTsKbmsuc2V0KDAsMCwwKTtmb3IodmFyIFM9MCxUPXcubGVuZ3RoO1M8VDtTKyspe3ZhciBXPXVbU10sWD13W1NdOzAhPT1XJiYoaG4uZnJvbUJ1ZmZlckF0dHJpYnV0ZShYLEcpLGpuLmZyb21CdWZmZXJBdHRyaWJ1dGUoWCxKKSxrbi5mcm9tQnVmZmVyQXR0cmlidXRlKFgsUSksbGsuYWRkU2NhbGVkVmVjdG9yKGhuLnN1YihKZSksVyksbWsuYWRkU2NhbGVkVmVjdG9yKGpuLnN1YihLZSksVyksbmsuYWRkU2NhbGVkVmVjdG9yKGtuLnN1YihMZSksVykpfUplLmFkZChsayk7S2UuYWRkKG1rKTtMZS5hZGQobmspfWlmKGI9QmEoYixlLGgsbSxKZSxLZSxMZSxZZykpQSYmKHpmLmZyb21CdWZmZXJBdHRyaWJ1dGUoQSxHKSxBZi5mcm9tQnVmZmVyQXR0cmlidXRlKEEsSiksQmYuZnJvbUJ1ZmZlckF0dHJpYnV0ZShBLFEpLGIudXY9Qi5nZXRVVihZZyxKZSxLZSxMZSx6ZixBZixCZixuZXcgZCkpLEUmJih6Zi5mcm9tQnVmZmVyQXR0cmlidXRlKEUsRyksQWYuZnJvbUJ1ZmZlckF0dHJpYnV0ZShFLApKKSxCZi5mcm9tQnVmZmVyQXR0cmlidXRlKEUsUSksYi51djI9Qi5nZXRVVihZZyxKZSxLZSxMZSx6ZixBZixCZixuZXcgZCkpLEE9bmV3IEsoRyxKLFEpLEIuZ2V0Tm9ybWFsKEplLEtlLExlLEEubm9ybWFsKSxiLmZhY2U9QTtyZXR1cm4gYn1mdW5jdGlvbiB6YSgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOk5xKz0yfSk7dGhpcy51dWlkPWxiLmdlbmVyYXRlVVVJRCgpO3RoaXMubmFtZT0iIjt0aGlzLnR5cGU9Ikdlb21ldHJ5Ijt0aGlzLnZlcnRpY2VzPVtdO3RoaXMuY29sb3JzPVtdO3RoaXMuZmFjZXM9W107dGhpcy5mYWNlVmVydGV4VXZzPVtbXV07dGhpcy5tb3JwaFRhcmdldHM9W107dGhpcy5tb3JwaE5vcm1hbHM9W107dGhpcy5za2luV2VpZ2h0cz1bXTt0aGlzLnNraW5JbmRpY2VzPVtdO3RoaXMubGluZURpc3RhbmNlcz1bXTt0aGlzLmJvdW5kaW5nU3BoZXJlPXRoaXMuYm91bmRpbmdCb3g9bnVsbDt0aGlzLmdyb3Vwc05lZWRVcGRhdGU9dGhpcy5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZT0KdGhpcy5jb2xvcnNOZWVkVXBkYXRlPXRoaXMubm9ybWFsc05lZWRVcGRhdGU9dGhpcy51dnNOZWVkVXBkYXRlPXRoaXMudmVydGljZXNOZWVkVXBkYXRlPXRoaXMuZWxlbWVudHNOZWVkVXBkYXRlPSExfWZ1bmN0aW9uIFVhKGIsZSxoLG0sdSx3KXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQm94R2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17d2lkdGg6YixoZWlnaHQ6ZSxkZXB0aDpoLHdpZHRoU2VnbWVudHM6bSxoZWlnaHRTZWdtZW50czp1LGRlcHRoU2VnbWVudHM6d307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFphKGIsZSxoLG0sdSx3KSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gWmEoYixlLGgsbSx1LHcpe2Z1bmN0aW9uIEEoWCxpYSxoYSxzYSxxYSxyYSx3YSxwYSx2YSxDYSxWYSl7dmFyIFdhPXJhL3ZhLERhPXdhL0NhLElhPXJhLzIsRWE9d2EvMixPYT1wYS8yO3dhPXZhKzE7dmFyIGhiPUNhKzEseWI9cmE9MCxMYSxlYixuYj1uZXcgZztmb3IoZWI9CjA7ZWI8aGI7ZWIrKyl7dmFyIE5iPWViKkRhLUVhO2ZvcihMYT0wO0xhPHdhO0xhKyspbmJbWF09KExhKldhLUlhKSpzYSxuYltpYV09TmIqcWEsbmJbaGFdPU9hLEoucHVzaChuYi54LG5iLnksbmIueiksbmJbWF09MCxuYltpYV09MCxuYltoYV09MDxwYT8xOi0xLFEucHVzaChuYi54LG5iLnksbmIueiksUy5wdXNoKExhL3ZhKSxTLnB1c2goMS1lYi9DYSkscmErPTF9Zm9yKGViPTA7ZWI8Q2E7ZWIrKylmb3IoTGE9MDtMYTx2YTtMYSsrKVg9VCtMYSt3YSooZWIrMSksaWE9VCsoTGErMSkrd2EqKGViKzEpLGhhPVQrKExhKzEpK3dhKmViLEcucHVzaChUK0xhK3dhKmViLFgsaGEpLEcucHVzaChYLGlhLGhhKSx5Yis9NjtFLmFkZEdyb3VwKFcseWIsVmEpO1crPXliO1QrPXJhfXhhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJCb3hCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt3aWR0aDpiLGhlaWdodDplLGRlcHRoOmgsd2lkdGhTZWdtZW50czptLGhlaWdodFNlZ21lbnRzOnUsCmRlcHRoU2VnbWVudHM6d307dmFyIEU9dGhpcztiPWJ8fDE7ZT1lfHwxO2g9aHx8MTttPU1hdGguZmxvb3IobSl8fDE7dT1NYXRoLmZsb29yKHUpfHwxO3c9TWF0aC5mbG9vcih3KXx8MTt2YXIgRz1bXSxKPVtdLFE9W10sUz1bXSxUPTAsVz0wO0EoInoiLCJ5IiwieCIsLTEsLTEsaCxlLGIsdyx1LDApO0EoInoiLCJ5IiwieCIsMSwtMSxoLGUsLWIsdyx1LDEpO0EoIngiLCJ6IiwieSIsMSwxLGIsaCxlLG0sdywyKTtBKCJ4IiwieiIsInkiLDEsLTEsYixoLC1lLG0sdywzKTtBKCJ4IiwieSIsInoiLDEsLTEsYixlLGgsbSx1LDQpO0EoIngiLCJ5IiwieiIsLTEsLTEsYixlLC1oLG0sdSw1KTt0aGlzLnNldEluZGV4KEcpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGRhKEosMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBkYShRLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBkYShTLDIpKX1mdW5jdGlvbiB6YihiKXt2YXIgZT17fSxoO2ZvcihoIGluIGIpe2VbaF09Cnt9O2Zvcih2YXIgbSBpbiBiW2hdKXt2YXIgdT1iW2hdW21dO2VbaF1bbV09dSYmKHUuaXNDb2xvcnx8dS5pc01hdHJpeDN8fHUuaXNNYXRyaXg0fHx1LmlzVmVjdG9yMnx8dS5pc1ZlY3RvcjN8fHUuaXNWZWN0b3I0fHx1LmlzVGV4dHVyZSk/dS5jbG9uZSgpOkFycmF5LmlzQXJyYXkodSk/dS5zbGljZSgpOnV9fXJldHVybiBlfWZ1bmN0aW9uIEliKGIpe2Zvcih2YXIgZT17fSxoPTA7aDxiLmxlbmd0aDtoKyspe3ZhciBtPXpiKGJbaF0pLHU7Zm9yKHUgaW4gbSllW3VdPW1bdV19cmV0dXJuIGV9ZnVuY3Rpb24gdWIoYil7TS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU2hhZGVyTWF0ZXJpYWwiO3RoaXMuZGVmaW5lcz17fTt0aGlzLnVuaWZvcm1zPXt9O3RoaXMudmVydGV4U2hhZGVyPSJ2b2lkIG1haW4oKSB7XG5cdGdsX1Bvc2l0aW9uIFx4M2QgcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcbn0iO3RoaXMuZnJhZ21lbnRTaGFkZXI9CiJ2b2lkIG1haW4oKSB7XG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIDEuMCwgMC4wLCAwLjAsIDEuMCApO1xufSI7dGhpcy5saW5ld2lkdGg9MTt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMubW9ycGhOb3JtYWxzPXRoaXMubW9ycGhUYXJnZXRzPXRoaXMuc2tpbm5pbmc9dGhpcy5jbGlwcGluZz10aGlzLmxpZ2h0cz10aGlzLmZvZz0hMTt0aGlzLmV4dGVuc2lvbnM9e2Rlcml2YXRpdmVzOiExLGZyYWdEZXB0aDohMSxkcmF3QnVmZmVyczohMSxzaGFkZXJUZXh0dXJlTE9EOiExfTt0aGlzLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM9e2NvbG9yOlsxLDEsMV0sdXY6WzAsMF0sdXYyOlswLDBdfTt0aGlzLmluZGV4MEF0dHJpYnV0ZU5hbWU9dm9pZCAwO3RoaXMudW5pZm9ybXNOZWVkVXBkYXRlPSExO3ZvaWQgMCE9PWImJih2b2lkIDAhPT1iLmF0dHJpYnV0ZXMmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLlNoYWRlck1hdGVyaWFsOiBhdHRyaWJ1dGVzIHNob3VsZCBub3cgYmUgZGVmaW5lZCBpbiBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpLAp0aGlzLnNldFZhbHVlcyhiKSl9ZnVuY3Rpb24gRmIoKXt5LmNhbGwodGhpcyk7dGhpcy50eXBlPSJDYW1lcmEiO3RoaXMubWF0cml4V29ybGRJbnZlcnNlPW5ldyByO3RoaXMucHJvamVjdGlvbk1hdHJpeD1uZXcgcjt0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlPW5ldyByfWZ1bmN0aW9uIEFiKGIsZSxoLG0pe0ZiLmNhbGwodGhpcyk7dGhpcy50eXBlPSJQZXJzcGVjdGl2ZUNhbWVyYSI7dGhpcy5mb3Y9dm9pZCAwIT09Yj9iOjUwO3RoaXMuem9vbT0xO3RoaXMubmVhcj12b2lkIDAhPT1oP2g6LjE7dGhpcy5mYXI9dm9pZCAwIT09bT9tOjJFMzt0aGlzLmZvY3VzPTEwO3RoaXMuYXNwZWN0PXZvaWQgMCE9PWU/ZToxO3RoaXMudmlldz1udWxsO3RoaXMuZmlsbUdhdWdlPTM1O3RoaXMuZmlsbU9mZnNldD0wO3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfWZ1bmN0aW9uIFBiKGIsZSxoLG0pe3kuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN1YmVDYW1lcmEiO3ZhciB1PW5ldyBBYig5MCwKMSxiLGUpO3UudXAuc2V0KDAsLTEsMCk7dS5sb29rQXQobmV3IGcoMSwwLDApKTt0aGlzLmFkZCh1KTt2YXIgdz1uZXcgQWIoOTAsMSxiLGUpO3cudXAuc2V0KDAsLTEsMCk7dy5sb29rQXQobmV3IGcoLTEsMCwwKSk7dGhpcy5hZGQodyk7dmFyIEE9bmV3IEFiKDkwLDEsYixlKTtBLnVwLnNldCgwLDAsMSk7QS5sb29rQXQobmV3IGcoMCwxLDApKTt0aGlzLmFkZChBKTt2YXIgRT1uZXcgQWIoOTAsMSxiLGUpO0UudXAuc2V0KDAsMCwtMSk7RS5sb29rQXQobmV3IGcoMCwtMSwwKSk7dGhpcy5hZGQoRSk7dmFyIEc9bmV3IEFiKDkwLDEsYixlKTtHLnVwLnNldCgwLC0xLDApO0cubG9va0F0KG5ldyBnKDAsMCwxKSk7dGhpcy5hZGQoRyk7dmFyIEo9bmV3IEFiKDkwLDEsYixlKTtKLnVwLnNldCgwLC0xLDApO0oubG9va0F0KG5ldyBnKDAsMCwtMSkpO3RoaXMuYWRkKEopO209bXx8e2Zvcm1hdDoxMDIyLG1hZ0ZpbHRlcjoxMDA2LG1pbkZpbHRlcjoxMDA2fTt0aGlzLnJlbmRlclRhcmdldD0KbmV3IGJjKGgsaCxtKTt0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWU9IkN1YmVDYW1lcmEiO3RoaXMudXBkYXRlPWZ1bmN0aW9uKFEsUyl7bnVsbD09PXRoaXMucGFyZW50JiZ0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCk7dmFyIFQ9US5nZXRSZW5kZXJUYXJnZXQoKSxXPXRoaXMucmVuZGVyVGFyZ2V0LFg9Vy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztXLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPSExO1Euc2V0UmVuZGVyVGFyZ2V0KFcsMCk7US5yZW5kZXIoUyx1KTtRLnNldFJlbmRlclRhcmdldChXLDEpO1EucmVuZGVyKFMsdyk7US5zZXRSZW5kZXJUYXJnZXQoVywyKTtRLnJlbmRlcihTLEEpO1Euc2V0UmVuZGVyVGFyZ2V0KFcsMyk7US5yZW5kZXIoUyxFKTtRLnNldFJlbmRlclRhcmdldChXLDQpO1EucmVuZGVyKFMsRyk7Vy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz1YO1Euc2V0UmVuZGVyVGFyZ2V0KFcsNSk7US5yZW5kZXIoUyxKKTtRLnNldFJlbmRlclRhcmdldChUKX07CnRoaXMuY2xlYXI9ZnVuY3Rpb24oUSxTLFQsVyl7Zm9yKHZhciBYPVEuZ2V0UmVuZGVyVGFyZ2V0KCksaWE9dGhpcy5yZW5kZXJUYXJnZXQsaGE9MDs2PmhhO2hhKyspUS5zZXRSZW5kZXJUYXJnZXQoaWEsaGEpLFEuY2xlYXIoUyxULFcpO1Euc2V0UmVuZGVyVGFyZ2V0KFgpfX1mdW5jdGlvbiBiYyhiLGUsaCl7cC5jYWxsKHRoaXMsYixlLGgpfWZ1bmN0aW9uIEdiKGIsZSxoLG0sdSx3LEEsRSxHLEosUSxTKXtrLmNhbGwodGhpcyxudWxsLHcsQSxFLEcsSixtLHUsUSxTKTt0aGlzLmltYWdlPXtkYXRhOmIsd2lkdGg6ZSxoZWlnaHQ6aH07dGhpcy5tYWdGaWx0ZXI9dm9pZCAwIT09Rz9HOjEwMDM7dGhpcy5taW5GaWx0ZXI9dm9pZCAwIT09Sj9KOjEwMDM7dGhpcy5mbGlwWT10aGlzLmdlbmVyYXRlTWlwbWFwcz0hMTt0aGlzLnVucGFja0FsaWdubWVudD0xfWZ1bmN0aW9uIFJiKGIsZSl7dGhpcy5ub3JtYWw9dm9pZCAwIT09Yj9iOm5ldyBnKDEsMCwwKTt0aGlzLmNvbnN0YW50PXZvaWQgMCE9PQplP2U6MH1mdW5jdGlvbiBFYyhiLGUsaCxtLHUsdyl7dGhpcy5wbGFuZXM9W3ZvaWQgMCE9PWI/YjpuZXcgUmIsdm9pZCAwIT09ZT9lOm5ldyBSYix2b2lkIDAhPT1oP2g6bmV3IFJiLHZvaWQgMCE9PW0/bTpuZXcgUmIsdm9pZCAwIT09dT91Om5ldyBSYix2b2lkIDAhPT13P3c6bmV3IFJiXX1mdW5jdGlvbiB4Yygpe2Z1bmN0aW9uIGIodSx3KXshMSE9PWgmJihtKHUsdyksZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYikpfXZhciBlPW51bGwsaD0hMSxtPW51bGw7cmV0dXJue3N0YXJ0OmZ1bmN0aW9uKCl7ITAhPT1oJiZudWxsIT09bSYmKGUucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGIpLGg9ITApfSxzdG9wOmZ1bmN0aW9uKCl7aD0hMX0sc2V0QW5pbWF0aW9uTG9vcDpmdW5jdGlvbih1KXttPXV9LHNldENvbnRleHQ6ZnVuY3Rpb24odSl7ZT11fX19ZnVuY3Rpb24gTWUoYil7ZnVuY3Rpb24gZSh1LHcpe3ZhciBBPXUuYXJyYXksRT11LmR5bmFtaWM/MzUwNDg6MzUwNDQsRz1iLmNyZWF0ZUJ1ZmZlcigpOwpiLmJpbmRCdWZmZXIodyxHKTtiLmJ1ZmZlckRhdGEodyxBLEUpO3Uub25VcGxvYWRDYWxsYmFjaygpO3c9NTEyNjtBIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5P3c9NTEyNjpBIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5P2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xBdHRyaWJ1dGVzOiBVbnN1cHBvcnRlZCBkYXRhIGJ1ZmZlciBmb3JtYXQ6IEZsb2F0NjRBcnJheS4iKTpBIGluc3RhbmNlb2YgVWludDE2QXJyYXk/dz01MTIzOkEgaW5zdGFuY2VvZiBJbnQxNkFycmF5P3c9NTEyMjpBIGluc3RhbmNlb2YgVWludDMyQXJyYXk/dz01MTI1OkEgaW5zdGFuY2VvZiBJbnQzMkFycmF5P3c9NTEyNDpBIGluc3RhbmNlb2YgSW50OEFycmF5P3c9NTEyMDpBIGluc3RhbmNlb2YgVWludDhBcnJheSYmKHc9NTEyMSk7cmV0dXJue2J1ZmZlcjpHLHR5cGU6dyxieXRlc1BlckVsZW1lbnQ6QS5CWVRFU19QRVJfRUxFTUVOVCx2ZXJzaW9uOnUudmVyc2lvbn19ZnVuY3Rpb24gaCh1LHcsQSl7dmFyIEU9CncuYXJyYXksRz13LnVwZGF0ZVJhbmdlO2IuYmluZEJ1ZmZlcihBLHUpOyExPT09dy5keW5hbWljP2IuYnVmZmVyRGF0YShBLEUsMzUwNDQpOi0xPT09Ry5jb3VudD9iLmJ1ZmZlclN1YkRhdGEoQSwwLEUpOjA9PT1HLmNvdW50P2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMT2JqZWN0cy51cGRhdGVCdWZmZXI6IGR5bmFtaWMgVEhSRUUuQnVmZmVyQXR0cmlidXRlIG1hcmtlZCBhcyBuZWVkc1VwZGF0ZSBidXQgdXBkYXRlUmFuZ2UuY291bnQgaXMgMCwgZW5zdXJlIHlvdSBhcmUgdXNpbmcgc2V0IG1ldGhvZHMgb3IgdXBkYXRpbmcgbWFudWFsbHkuIik6KGIuYnVmZmVyU3ViRGF0YShBLEcub2Zmc2V0KkUuQllURVNfUEVSX0VMRU1FTlQsRS5zdWJhcnJheShHLm9mZnNldCxHLm9mZnNldCtHLmNvdW50KSksRy5jb3VudD0tMSl9dmFyIG09bmV3IFdlYWtNYXA7cmV0dXJue2dldDpmdW5jdGlvbih1KXt1LmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJih1PXUuZGF0YSk7cmV0dXJuIG0uZ2V0KHUpfSwKcmVtb3ZlOmZ1bmN0aW9uKHUpe3UuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKHU9dS5kYXRhKTt2YXIgdz1tLmdldCh1KTt3JiYoYi5kZWxldGVCdWZmZXIody5idWZmZXIpLG0uZGVsZXRlKHUpKX0sdXBkYXRlOmZ1bmN0aW9uKHUsdyl7dS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYodT11LmRhdGEpO3ZhciBBPW0uZ2V0KHUpO3ZvaWQgMD09PUE/bS5zZXQodSxlKHUsdykpOkEudmVyc2lvbjx1LnZlcnNpb24mJihoKEEuYnVmZmVyLHUsdyksQS52ZXJzaW9uPXUudmVyc2lvbil9fX1mdW5jdGlvbiBpZShiLGUsaCxtKXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGxhbmVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt3aWR0aDpiLGhlaWdodDplLHdpZHRoU2VnbWVudHM6aCxoZWlnaHRTZWdtZW50czptfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgdGQoYixlLGgsbSkpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIHRkKGIsZSxoLG0pe3hhLmNhbGwodGhpcyk7CnRoaXMudHlwZT0iUGxhbmVCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt3aWR0aDpiLGhlaWdodDplLHdpZHRoU2VnbWVudHM6aCxoZWlnaHRTZWdtZW50czptfTtiPWJ8fDE7ZT1lfHwxO3ZhciB1PWIvMix3PWUvMjtoPU1hdGguZmxvb3IoaCl8fDE7bT1NYXRoLmZsb29yKG0pfHwxO3ZhciBBPWgrMSxFPW0rMSxHPWIvaCxKPWUvbSxRPVtdLFM9W10sVD1bXSxXPVtdO2ZvcihiPTA7YjxFO2IrKyl7dmFyIFg9YipKLXc7Zm9yKGU9MDtlPEE7ZSsrKVMucHVzaChlKkctdSwtWCwwKSxULnB1c2goMCwwLDEpLFcucHVzaChlL2gpLFcucHVzaCgxLWIvbSl9Zm9yKGI9MDtiPG07YisrKWZvcihlPTA7ZTxoO2UrKyl1PWUrQSooYisxKSx3PWUrMStBKihiKzEpLEU9ZSsxK0EqYixRLnB1c2goZStBKmIsdSxFKSxRLnB1c2godSx3LEUpO3RoaXMuc2V0SW5kZXgoUSk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgZGEoUywzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsCm5ldyBkYShULDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBkYShXLDIpKX1mdW5jdGlvbiBqZShiLGUsaCxtKXtmdW5jdGlvbiB1KFMsVCl7ZS5idWZmZXJzLmNvbG9yLnNldENsZWFyKFMucixTLmcsUy5iLFQsbSl9dmFyIHc9bmV3IEkoMCksQT0wLEUsRyxKPW51bGwsUT0wO3JldHVybntnZXRDbGVhckNvbG9yOmZ1bmN0aW9uKCl7cmV0dXJuIHd9LHNldENsZWFyQ29sb3I6ZnVuY3Rpb24oUyxUKXt3LnNldChTKTtBPXZvaWQgMCE9PVQ/VDoxO3UodyxBKX0sZ2V0Q2xlYXJBbHBoYTpmdW5jdGlvbigpe3JldHVybiBBfSxzZXRDbGVhckFscGhhOmZ1bmN0aW9uKFMpe0E9Uzt1KHcsQSl9LHJlbmRlcjpmdW5jdGlvbihTLFQsVyxYKXtUPVQuYmFja2dyb3VuZDtXPWIudnI7KFc9Vy5nZXRTZXNzaW9uJiZXLmdldFNlc3Npb24oKSkmJiJhZGRpdGl2ZSI9PT1XLmVudmlyb25tZW50QmxlbmRNb2RlJiYoVD1udWxsKTtudWxsPT09VD8odSh3LEEpLEo9bnVsbCxRPTApOlQmJlQuaXNDb2xvciYmCih1KFQsMSksWD0hMCxKPW51bGwsUT0wKTsoYi5hdXRvQ2xlYXJ8fFgpJiZiLmNsZWFyKGIuYXV0b0NsZWFyQ29sb3IsYi5hdXRvQ2xlYXJEZXB0aCxiLmF1dG9DbGVhclN0ZW5jaWwpO2lmKFQmJihULmlzQ3ViZVRleHR1cmV8fFQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUpKXt2b2lkIDA9PT1HJiYoRz1uZXcgeWEobmV3IFphKDEsMSwxKSxuZXcgdWIoe3R5cGU6IkJhY2tncm91bmRDdWJlTWF0ZXJpYWwiLHVuaWZvcm1zOnpiKHVkLmN1YmUudW5pZm9ybXMpLHZlcnRleFNoYWRlcjp1ZC5jdWJlLnZlcnRleFNoYWRlcixmcmFnbWVudFNoYWRlcjp1ZC5jdWJlLmZyYWdtZW50U2hhZGVyLHNpZGU6MSxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSxmb2c6ITF9KSksRy5nZW9tZXRyeS5yZW1vdmVBdHRyaWJ1dGUoIm5vcm1hbCIpLEcuZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCJ1diIpLEcub25CZWZvcmVSZW5kZXI9ZnVuY3Rpb24oaWEsaGEsc2Epe3RoaXMubWF0cml4V29ybGQuY29weVBvc2l0aW9uKHNhLm1hdHJpeFdvcmxkKX0sCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShHLm1hdGVyaWFsLCJtYXAiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy50Q3ViZS52YWx1ZX19KSxoLnVwZGF0ZShHKSk7WD1ULmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlP1QudGV4dHVyZTpUO0cubWF0ZXJpYWwudW5pZm9ybXMudEN1YmUudmFsdWU9WDtHLm1hdGVyaWFsLnVuaWZvcm1zLnRGbGlwLnZhbHVlPVQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmU/MTotMTtpZihKIT09VHx8USE9PVgudmVyc2lvbilHLm1hdGVyaWFsLm5lZWRzVXBkYXRlPSEwLEo9VCxRPVgudmVyc2lvbjtTLnVuc2hpZnQoRyxHLmdlb21ldHJ5LEcubWF0ZXJpYWwsMCwwLG51bGwpfWVsc2UgaWYoVCYmVC5pc1RleHR1cmUpe3ZvaWQgMD09PUUmJihFPW5ldyB5YShuZXcgdGQoMiwyKSxuZXcgdWIoe3R5cGU6IkJhY2tncm91bmRNYXRlcmlhbCIsdW5pZm9ybXM6emIodWQuYmFja2dyb3VuZC51bmlmb3JtcyksdmVydGV4U2hhZGVyOnVkLmJhY2tncm91bmQudmVydGV4U2hhZGVyLApmcmFnbWVudFNoYWRlcjp1ZC5iYWNrZ3JvdW5kLmZyYWdtZW50U2hhZGVyLHNpZGU6MCxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSxmb2c6ITF9KSksRS5nZW9tZXRyeS5yZW1vdmVBdHRyaWJ1dGUoIm5vcm1hbCIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShFLm1hdGVyaWFsLCJtYXAiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy50MkQudmFsdWV9fSksaC51cGRhdGUoRSkpO0UubWF0ZXJpYWwudW5pZm9ybXMudDJELnZhbHVlPVQ7ITA9PT1ULm1hdHJpeEF1dG9VcGRhdGUmJlQudXBkYXRlTWF0cml4KCk7RS5tYXRlcmlhbC51bmlmb3Jtcy51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KFQubWF0cml4KTtpZihKIT09VHx8USE9PVQudmVyc2lvbilFLm1hdGVyaWFsLm5lZWRzVXBkYXRlPSEwLEo9VCxRPVQudmVyc2lvbjtTLnVuc2hpZnQoRSxFLmdlb21ldHJ5LEUubWF0ZXJpYWwsMCwwLG51bGwpfX19fWZ1bmN0aW9uIHVhKGIsZSxoLG0pe3ZhciB1O3RoaXMuc2V0TW9kZT0KZnVuY3Rpb24odyl7dT13fTt0aGlzLnJlbmRlcj1mdW5jdGlvbih3LEEpe2IuZHJhd0FycmF5cyh1LHcsQSk7aC51cGRhdGUoQSx1KX07dGhpcy5yZW5kZXJJbnN0YW5jZXM9ZnVuY3Rpb24odyxBLEUpe2lmKG0uaXNXZWJHTDIpe3ZhciBHPWI7dmFyIEo9ImRyYXdBcnJheXNJbnN0YW5jZWQifWVsc2UgaWYoRz1lLmdldCgiQU5HTEVfaW5zdGFuY2VkX2FycmF5cyIpLEo9ImRyYXdBcnJheXNJbnN0YW5jZWRBTkdMRSIsbnVsbD09PUcpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLiIpO3JldHVybn1HW0pdKHUsQSxFLHcubWF4SW5zdGFuY2VkQ291bnQpO2gudXBkYXRlKEUsdSx3Lm1heEluc3RhbmNlZENvdW50KX19ZnVuY3Rpb24gJGIoYixlLGgpe2Z1bmN0aW9uIG0ocmEpe2lmKCJoaWdocCI9PT0KcmEpe2lmKDA8Yi5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoMzU2MzMsMzYzMzgpLnByZWNpc2lvbiYmMDxiLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCgzNTYzMiwzNjMzOCkucHJlY2lzaW9uKXJldHVybiJoaWdocCI7cmE9Im1lZGl1bXAifXJldHVybiJtZWRpdW1wIj09PXJhJiYwPGIuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMzLDM2MzM3KS5wcmVjaXNpb24mJjA8Yi5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoMzU2MzIsMzYzMzcpLnByZWNpc2lvbj8ibWVkaXVtcCI6Imxvd3AifXZhciB1LHc9InVuZGVmaW5lZCIhPT10eXBlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCYmYiBpbnN0YW5jZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQsQT12b2lkIDAhPT1oLnByZWNpc2lvbj9oLnByZWNpc2lvbjoiaGlnaHAiLEU9bShBKTtFIT09QSYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjoiLEEsIm5vdCBzdXBwb3J0ZWQsIHVzaW5nIixFLCJpbnN0ZWFkLiIpLApBPUUpO2g9ITA9PT1oLmxvZ2FyaXRobWljRGVwdGhCdWZmZXI7RT1iLmdldFBhcmFtZXRlcigzNDkzMCk7dmFyIEc9Yi5nZXRQYXJhbWV0ZXIoMzU2NjApLEo9Yi5nZXRQYXJhbWV0ZXIoMzM3OSksUT1iLmdldFBhcmFtZXRlcigzNDA3NiksUz1iLmdldFBhcmFtZXRlcigzNDkyMSksVD1iLmdldFBhcmFtZXRlcigzNjM0NyksVz1iLmdldFBhcmFtZXRlcigzNjM0OCksWD1iLmdldFBhcmFtZXRlcigzNjM0OSksaWE9MDxHLGhhPXd8fCEhZS5nZXQoIk9FU190ZXh0dXJlX2Zsb2F0Iiksc2E9aWEmJmhhLHFhPXc/Yi5nZXRQYXJhbWV0ZXIoMzYxODMpOjA7cmV0dXJue2lzV2ViR0wyOncsZ2V0TWF4QW5pc290cm9weTpmdW5jdGlvbigpe2lmKHZvaWQgMCE9PXUpcmV0dXJuIHU7dmFyIHJhPWUuZ2V0KCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTtyZXR1cm4gdT1udWxsIT09cmE/Yi5nZXRQYXJhbWV0ZXIocmEuTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUKTowfSwKZ2V0TWF4UHJlY2lzaW9uOm0scHJlY2lzaW9uOkEsbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjpoLG1heFRleHR1cmVzOkUsbWF4VmVydGV4VGV4dHVyZXM6RyxtYXhUZXh0dXJlU2l6ZTpKLG1heEN1YmVtYXBTaXplOlEsbWF4QXR0cmlidXRlczpTLG1heFZlcnRleFVuaWZvcm1zOlQsbWF4VmFyeWluZ3M6VyxtYXhGcmFnbWVudFVuaWZvcm1zOlgsdmVydGV4VGV4dHVyZXM6aWEsZmxvYXRGcmFnbWVudFRleHR1cmVzOmhhLGZsb2F0VmVydGV4VGV4dHVyZXM6c2EsbWF4U2FtcGxlczpxYX19ZnVuY3Rpb24gWmMoKXtmdW5jdGlvbiBiKCl7Si52YWx1ZSE9PW0mJihKLnZhbHVlPW0sSi5uZWVkc1VwZGF0ZT0wPHUpO2gubnVtUGxhbmVzPXU7aC5udW1JbnRlcnNlY3Rpb249MH1mdW5jdGlvbiBlKFEsUyxULFcpe3ZhciBYPW51bGwhPT1RP1EubGVuZ3RoOjAsaWE9bnVsbDtpZigwIT09WCl7aWE9Si52YWx1ZTtpZighMCE9PVd8fG51bGw9PT1pYSl7Vz1UKzQqWDtTPVMubWF0cml4V29ybGRJbnZlcnNlOwpHLmdldE5vcm1hbE1hdHJpeChTKTtpZihudWxsPT09aWF8fGlhLmxlbmd0aDxXKWlhPW5ldyBGbG9hdDMyQXJyYXkoVyk7Zm9yKFc9MDtXIT09WDsrK1csVCs9NClFLmNvcHkoUVtXXSkuYXBwbHlNYXRyaXg0KFMsRyksRS5ub3JtYWwudG9BcnJheShpYSxUKSxpYVtUKzNdPUUuY29uc3RhbnR9Si52YWx1ZT1pYTtKLm5lZWRzVXBkYXRlPSEwfWgubnVtUGxhbmVzPVg7cmV0dXJuIGlhfXZhciBoPXRoaXMsbT1udWxsLHU9MCx3PSExLEE9ITEsRT1uZXcgUmIsRz1uZXcgbCxKPXt2YWx1ZTpudWxsLG5lZWRzVXBkYXRlOiExfTt0aGlzLnVuaWZvcm09Sjt0aGlzLm51bUludGVyc2VjdGlvbj10aGlzLm51bVBsYW5lcz0wO3RoaXMuaW5pdD1mdW5jdGlvbihRLFMsVCl7dmFyIFc9MCE9PVEubGVuZ3RofHxTfHwwIT09dXx8dzt3PVM7bT1lKFEsVCwwKTt1PVEubGVuZ3RoO3JldHVybiBXfTt0aGlzLmJlZ2luU2hhZG93cz1mdW5jdGlvbigpe0E9ITA7ZShudWxsKX07dGhpcy5lbmRTaGFkb3dzPQpmdW5jdGlvbigpe0E9ITE7YigpfTt0aGlzLnNldFN0YXRlPWZ1bmN0aW9uKFEsUyxULFcsWCxpYSl7aWYoIXd8fG51bGw9PT1RfHwwPT09US5sZW5ndGh8fEEmJiFUKUE/ZShudWxsKTpiKCk7ZWxzZXtUPUE/MDp1O3ZhciBoYT00KlQsc2E9WC5jbGlwcGluZ1N0YXRlfHxudWxsO0oudmFsdWU9c2E7c2E9ZShRLFcsaGEsaWEpO2ZvcihRPTA7USE9PWhhOysrUSlzYVtRXT1tW1FdO1guY2xpcHBpbmdTdGF0ZT1zYTt0aGlzLm51bUludGVyc2VjdGlvbj1TP3RoaXMubnVtUGxhbmVzOjA7dGhpcy5udW1QbGFuZXMrPVR9fX1mdW5jdGlvbiBMZChiKXt2YXIgZT17fTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGgpe2lmKHZvaWQgMCE9PWVbaF0pcmV0dXJuIGVbaF07c3dpdGNoKGgpe2Nhc2UgIldFQkdMX2RlcHRoX3RleHR1cmUiOnZhciBtPWIuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9kZXB0aF90ZXh0dXJlIil8fGIuZ2V0RXh0ZW5zaW9uKCJNT1pfV0VCR0xfZGVwdGhfdGV4dHVyZSIpfHxiLmdldEV4dGVuc2lvbigiV0VCS0lUX1dFQkdMX2RlcHRoX3RleHR1cmUiKTsKYnJlYWs7Y2FzZSAiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIjptPWIuZ2V0RXh0ZW5zaW9uKCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKXx8Yi5nZXRFeHRlbnNpb24oIk1PWl9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKXx8Yi5nZXRFeHRlbnNpb24oIldFQktJVF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTticmVhaztjYXNlICJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyI6bT1iLmdldEV4dGVuc2lvbigiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKXx8Yi5nZXRFeHRlbnNpb24oIk1PWl9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpfHxiLmdldEV4dGVuc2lvbigiV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIik7YnJlYWs7Y2FzZSAiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIjptPWIuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKXx8CmIuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIik7YnJlYWs7ZGVmYXVsdDptPWIuZ2V0RXh0ZW5zaW9uKGgpfW51bGw9PT1tJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6ICIraCsiIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLiIpO3JldHVybiBlW2hdPW19fX1mdW5jdGlvbiBrZShiLGUsaCl7ZnVuY3Rpb24gbShFKXt2YXIgRz1FLnRhcmdldDtFPXcuZ2V0KEcpO251bGwhPT1FLmluZGV4JiZlLnJlbW92ZShFLmluZGV4KTtmb3IodmFyIEogaW4gRS5hdHRyaWJ1dGVzKWUucmVtb3ZlKEUuYXR0cmlidXRlc1tKXSk7Ry5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixtKTt3LmRlbGV0ZShHKTtpZihKPUEuZ2V0KEUpKWUucmVtb3ZlKEopLEEuZGVsZXRlKEUpO2gubWVtb3J5Lmdlb21ldHJpZXMtLX1mdW5jdGlvbiB1KEUpe3ZhciBHPVtdLEo9RS5pbmRleCxRPUUuYXR0cmlidXRlcy5wb3NpdGlvbjtpZihudWxsIT09Ckope3ZhciBTPUouYXJyYXk7Sj1KLnZlcnNpb247UT0wO2Zvcih2YXIgVD1TLmxlbmd0aDtRPFQ7USs9Myl7dmFyIFc9U1tRKzBdLFg9U1tRKzFdLGlhPVNbUSsyXTtHLnB1c2goVyxYLFgsaWEsaWEsVyl9fWVsc2UgZm9yKFM9US5hcnJheSxKPVEudmVyc2lvbixRPTAsVD1TLmxlbmd0aC8zLTE7UTxUO1ErPTMpVz1RKzAsWD1RKzEsaWE9USsyLEcucHVzaChXLFgsWCxpYSxpYSxXKTtHPW5ldyAoNjU1MzU8RmEoRyk/ZmE6YWEpKEcsMSk7Ry52ZXJzaW9uPUo7ZS51cGRhdGUoRywzNDk2Myk7KFM9QS5nZXQoRSkpJiZlLnJlbW92ZShTKTtBLnNldChFLEcpfXZhciB3PW5ldyBXZWFrTWFwLEE9bmV3IFdlYWtNYXA7cmV0dXJue2dldDpmdW5jdGlvbihFLEcpe3ZhciBKPXcuZ2V0KEcpO2lmKEopcmV0dXJuIEo7Ry5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixtKTtHLmlzQnVmZmVyR2VvbWV0cnk/Sj1HOkcuaXNHZW9tZXRyeSYmKHZvaWQgMD09PUcuX2J1ZmZlckdlb21ldHJ5JiYoRy5fYnVmZmVyR2VvbWV0cnk9CihuZXcgeGEpLnNldEZyb21PYmplY3QoRSkpLEo9Ry5fYnVmZmVyR2VvbWV0cnkpO3cuc2V0KEcsSik7aC5tZW1vcnkuZ2VvbWV0cmllcysrO3JldHVybiBKfSx1cGRhdGU6ZnVuY3Rpb24oRSl7dmFyIEc9RS5pbmRleCxKPUUuYXR0cmlidXRlcztudWxsIT09RyYmZS51cGRhdGUoRywzNDk2Myk7Zm9yKHZhciBRIGluIEopZS51cGRhdGUoSltRXSwzNDk2Mik7RT1FLm1vcnBoQXR0cmlidXRlcztmb3IoUSBpbiBFKXtHPUVbUV07Sj0wO2Zvcih2YXIgUz1HLmxlbmd0aDtKPFM7SisrKWUudXBkYXRlKEdbSl0sMzQ5NjIpfX0sZ2V0V2lyZWZyYW1lQXR0cmlidXRlOmZ1bmN0aW9uKEUpe3ZhciBHPUEuZ2V0KEUpO2lmKEcpe3ZhciBKPUUuaW5kZXg7bnVsbCE9PUomJkcudmVyc2lvbjxKLnZlcnNpb24mJnUoRSl9ZWxzZSB1KEUpO3JldHVybiBBLmdldChFKX19fWZ1bmN0aW9uIHFpKGIsZSxoLG0pe3ZhciB1LHcsQTt0aGlzLnNldE1vZGU9ZnVuY3Rpb24oRSl7dT1FfTt0aGlzLnNldEluZGV4PQpmdW5jdGlvbihFKXt3PUUudHlwZTtBPUUuYnl0ZXNQZXJFbGVtZW50fTt0aGlzLnJlbmRlcj1mdW5jdGlvbihFLEcpe2IuZHJhd0VsZW1lbnRzKHUsRyx3LEUqQSk7aC51cGRhdGUoRyx1KX07dGhpcy5yZW5kZXJJbnN0YW5jZXM9ZnVuY3Rpb24oRSxHLEope2lmKG0uaXNXZWJHTDIpe3ZhciBRPWI7dmFyIFM9ImRyYXdFbGVtZW50c0luc3RhbmNlZCJ9ZWxzZSBpZihRPWUuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIiksUz0iZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUiLG51bGw9PT1RKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7cmV0dXJufVFbU10odSxKLHcsRypBLEUubWF4SW5zdGFuY2VkQ291bnQpO2gudXBkYXRlKEosdSxFLm1heEluc3RhbmNlZENvdW50KX19CmZ1bmN0aW9uIE9xKCl7dmFyIGI9e2ZyYW1lOjAsY2FsbHM6MCx0cmlhbmdsZXM6MCxwb2ludHM6MCxsaW5lczowfTtyZXR1cm57bWVtb3J5OntnZW9tZXRyaWVzOjAsdGV4dHVyZXM6MH0scmVuZGVyOmIscHJvZ3JhbXM6bnVsbCxhdXRvUmVzZXQ6ITAscmVzZXQ6ZnVuY3Rpb24oKXtiLmZyYW1lKys7Yi5jYWxscz0wO2IudHJpYW5nbGVzPTA7Yi5wb2ludHM9MDtiLmxpbmVzPTB9LHVwZGF0ZTpmdW5jdGlvbihlLGgsbSl7bT1tfHwxO2IuY2FsbHMrKztzd2l0Y2goaCl7Y2FzZSA0OmIudHJpYW5nbGVzKz1lLzMqbTticmVhaztjYXNlIDU6Y2FzZSA2OmIudHJpYW5nbGVzKz1tKihlLTIpO2JyZWFrO2Nhc2UgMTpiLmxpbmVzKz1lLzIqbTticmVhaztjYXNlIDM6Yi5saW5lcys9bSooZS0xKTticmVhaztjYXNlIDI6Yi5saW5lcys9bSplO2JyZWFrO2Nhc2UgMDpiLnBvaW50cys9bSplO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xJbmZvOiBVbmtub3duIGRyYXcgbW9kZToiLApoKX19fX1mdW5jdGlvbiBQcShiLGUpe3JldHVybiBNYXRoLmFicyhlWzFdKS1NYXRoLmFicyhiWzFdKX1mdW5jdGlvbiBRcShiKXt2YXIgZT17fSxoPW5ldyBGbG9hdDMyQXJyYXkoOCk7cmV0dXJue3VwZGF0ZTpmdW5jdGlvbihtLHUsdyxBKXt2YXIgRT1tLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyxHPUUubGVuZ3RoO209ZVt1LmlkXTtpZih2b2lkIDA9PT1tKXttPVtdO2Zvcih2YXIgSj0wO0o8RztKKyspbVtKXT1bSiwwXTtlW3UuaWRdPW19dmFyIFE9dy5tb3JwaFRhcmdldHMmJnUubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO3c9dy5tb3JwaE5vcm1hbHMmJnUubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbDtmb3IoSj0wO0o8RztKKyspe3ZhciBTPW1bSl07MCE9PVNbMV0mJihRJiZ1LnJlbW92ZUF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK0opLHcmJnUucmVtb3ZlQXR0cmlidXRlKCJtb3JwaE5vcm1hbCIrSikpfWZvcihKPTA7SjxHO0orKylTPW1bSl0sU1swXT1KLFNbMV09RVtKXTttLnNvcnQoUHEpOwpmb3IoSj0wOzg+SjtKKyspe2lmKFM9bVtKXSlpZihFPVNbMF0sRz1TWzFdKXtRJiZ1LmFkZEF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK0osUVtFXSk7dyYmdS5hZGRBdHRyaWJ1dGUoIm1vcnBoTm9ybWFsIitKLHdbRV0pO2hbSl09Rztjb250aW51ZX1oW0pdPTB9QS5nZXRVbmlmb3JtcygpLnNldFZhbHVlKGIsIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyIsaCl9fX1mdW5jdGlvbiBScShiLGUpe3ZhciBoPXt9O3JldHVybnt1cGRhdGU6ZnVuY3Rpb24obSl7dmFyIHU9ZS5yZW5kZXIuZnJhbWUsdz1tLmdlb21ldHJ5LEE9Yi5nZXQobSx3KTtoW0EuaWRdIT09dSYmKHcuaXNHZW9tZXRyeSYmQS51cGRhdGVGcm9tT2JqZWN0KG0pLGIudXBkYXRlKEEpLGhbQS5pZF09dSk7cmV0dXJuIEF9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtoPXt9fX19ZnVuY3Rpb24gTWQoYixlLGgsbSx1LHcsQSxFLEcsSil7Yj12b2lkIDAhPT1iP2I6W107ay5jYWxsKHRoaXMsYix2b2lkIDAhPT1lP2U6MzAxLGgsbSx1LHcsCnZvaWQgMCE9PUE/QToxMDIyLEUsRyxKKTt0aGlzLmZsaXBZPSExfWZ1bmN0aW9uIENmKGIsZSxoLG0pe2suY2FsbCh0aGlzLG51bGwpO3RoaXMuaW1hZ2U9e2RhdGE6Yix3aWR0aDplLGhlaWdodDpoLGRlcHRoOm19O3RoaXMubWluRmlsdGVyPXRoaXMubWFnRmlsdGVyPTEwMDM7dGhpcy53cmFwUj0xMDAxO3RoaXMuZmxpcFk9dGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITF9ZnVuY3Rpb24gRGYoYixlLGgsbSl7ay5jYWxsKHRoaXMsbnVsbCk7dGhpcy5pbWFnZT17ZGF0YTpiLHdpZHRoOmUsaGVpZ2h0OmgsZGVwdGg6bX07dGhpcy5taW5GaWx0ZXI9dGhpcy5tYWdGaWx0ZXI9MTAwMzt0aGlzLndyYXBSPTEwMDE7dGhpcy5mbGlwWT10aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX1mdW5jdGlvbiBFZihiLGUsaCl7dmFyIG09YlswXTtpZigwPj1tfHwwPG0pcmV0dXJuIGI7dmFyIHU9ZSpoLHc9bG5bdV07dm9pZCAwPT09dyYmKHc9bmV3IEZsb2F0MzJBcnJheSh1KSxsblt1XT13KTtpZigwIT09ZSlmb3IobS50b0FycmF5KHcsCjApLG09MSx1PTA7bSE9PWU7KyttKXUrPWgsYlttXS50b0FycmF5KHcsdSk7cmV0dXJuIHd9ZnVuY3Rpb24gUWMoYixlKXtpZihiLmxlbmd0aCE9PWUubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgaD0wLG09Yi5sZW5ndGg7aDxtO2grKylpZihiW2hdIT09ZVtoXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBJYyhiLGUpe2Zvcih2YXIgaD0wLG09ZS5sZW5ndGg7aDxtO2grKyliW2hdPWVbaF19ZnVuY3Rpb24gbW4oYixlKXt2YXIgaD1ubltlXTt2b2lkIDA9PT1oJiYoaD1uZXcgSW50MzJBcnJheShlKSxubltlXT1oKTtmb3IodmFyIG09MDttIT09ZTsrK20paFttXT1iLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtyZXR1cm4gaH1mdW5jdGlvbiBTcShiLGUpe3ZhciBoPXRoaXMuY2FjaGU7aFswXSE9PWUmJihiLnVuaWZvcm0xZih0aGlzLmFkZHIsZSksaFswXT1lKX1mdW5jdGlvbiBUcShiLGUpe3ZhciBoPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09ZS54KXtpZihoWzBdIT09ZS54fHxoWzFdIT09CmUueSliLnVuaWZvcm0yZih0aGlzLmFkZHIsZS54LGUueSksaFswXT1lLngsaFsxXT1lLnl9ZWxzZSBRYyhoLGUpfHwoYi51bmlmb3JtMmZ2KHRoaXMuYWRkcixlKSxJYyhoLGUpKX1mdW5jdGlvbiBVcShiLGUpe3ZhciBoPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09ZS54KXtpZihoWzBdIT09ZS54fHxoWzFdIT09ZS55fHxoWzJdIT09ZS56KWIudW5pZm9ybTNmKHRoaXMuYWRkcixlLngsZS55LGUueiksaFswXT1lLngsaFsxXT1lLnksaFsyXT1lLnp9ZWxzZSBpZih2b2lkIDAhPT1lLnIpe2lmKGhbMF0hPT1lLnJ8fGhbMV0hPT1lLmd8fGhbMl0hPT1lLmIpYi51bmlmb3JtM2YodGhpcy5hZGRyLGUucixlLmcsZS5iKSxoWzBdPWUucixoWzFdPWUuZyxoWzJdPWUuYn1lbHNlIFFjKGgsZSl8fChiLnVuaWZvcm0zZnYodGhpcy5hZGRyLGUpLEljKGgsZSkpfWZ1bmN0aW9uIFZxKGIsZSl7dmFyIGg9dGhpcy5jYWNoZTtpZih2b2lkIDAhPT1lLngpe2lmKGhbMF0hPT1lLnh8fGhbMV0hPT1lLnl8fApoWzJdIT09ZS56fHxoWzNdIT09ZS53KWIudW5pZm9ybTRmKHRoaXMuYWRkcixlLngsZS55LGUueixlLncpLGhbMF09ZS54LGhbMV09ZS55LGhbMl09ZS56LGhbM109ZS53fWVsc2UgUWMoaCxlKXx8KGIudW5pZm9ybTRmdih0aGlzLmFkZHIsZSksSWMoaCxlKSl9ZnVuY3Rpb24gV3EoYixlKXt2YXIgaD10aGlzLmNhY2hlLG09ZS5lbGVtZW50czt2b2lkIDA9PT1tP1FjKGgsZSl8fChiLnVuaWZvcm1NYXRyaXgyZnYodGhpcy5hZGRyLCExLGUpLEljKGgsZSkpOlFjKGgsbSl8fChvbi5zZXQobSksYi51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxvbiksSWMoaCxtKSl9ZnVuY3Rpb24gWHEoYixlKXt2YXIgaD10aGlzLmNhY2hlLG09ZS5lbGVtZW50czt2b2lkIDA9PT1tP1FjKGgsZSl8fChiLnVuaWZvcm1NYXRyaXgzZnYodGhpcy5hZGRyLCExLGUpLEljKGgsZSkpOlFjKGgsbSl8fChwbi5zZXQobSksYi51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxwbiksSWMoaCxtKSl9CmZ1bmN0aW9uIFlxKGIsZSl7dmFyIGg9dGhpcy5jYWNoZSxtPWUuZWxlbWVudHM7dm9pZCAwPT09bT9RYyhoLGUpfHwoYi51bmlmb3JtTWF0cml4NGZ2KHRoaXMuYWRkciwhMSxlKSxJYyhoLGUpKTpRYyhoLG0pfHwocW4uc2V0KG0pLGIudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsITEscW4pLEljKGgsbSkpfWZ1bmN0aW9uIFpxKGIsZSxoKXt2YXIgbT10aGlzLmNhY2hlLHU9aC5hbGxvY2F0ZVRleHR1cmVVbml0KCk7bVswXSE9PXUmJihiLnVuaWZvcm0xaSh0aGlzLmFkZHIsdSksbVswXT11KTtoLnNhZmVTZXRUZXh0dXJlMkQoZXx8cm4sdSl9ZnVuY3Rpb24gJHEoYixlLGgpe3ZhciBtPXRoaXMuY2FjaGUsdT1oLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTttWzBdIT09dSYmKGIudW5pZm9ybTFpKHRoaXMuYWRkcix1KSxtWzBdPXUpO2guc2V0VGV4dHVyZTJEQXJyYXkoZXx8YXIsdSl9ZnVuY3Rpb24gYnIoYixlLGgpe3ZhciBtPXRoaXMuY2FjaGUsdT1oLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTsKbVswXSE9PXUmJihiLnVuaWZvcm0xaSh0aGlzLmFkZHIsdSksbVswXT11KTtoLnNldFRleHR1cmUzRChlfHxjcix1KX1mdW5jdGlvbiBkcihiLGUsaCl7dmFyIG09dGhpcy5jYWNoZSx1PWguYWxsb2NhdGVUZXh0dXJlVW5pdCgpO21bMF0hPT11JiYoYi51bmlmb3JtMWkodGhpcy5hZGRyLHUpLG1bMF09dSk7aC5zYWZlU2V0VGV4dHVyZUN1YmUoZXx8c24sdSl9ZnVuY3Rpb24gZXIoYixlKXt2YXIgaD10aGlzLmNhY2hlO2hbMF0hPT1lJiYoYi51bmlmb3JtMWkodGhpcy5hZGRyLGUpLGhbMF09ZSl9ZnVuY3Rpb24gZnIoYixlKXt2YXIgaD10aGlzLmNhY2hlO1FjKGgsZSl8fChiLnVuaWZvcm0yaXYodGhpcy5hZGRyLGUpLEljKGgsZSkpfWZ1bmN0aW9uIGdyKGIsZSl7dmFyIGg9dGhpcy5jYWNoZTtRYyhoLGUpfHwoYi51bmlmb3JtM2l2KHRoaXMuYWRkcixlKSxJYyhoLGUpKX1mdW5jdGlvbiBocihiLGUpe3ZhciBoPXRoaXMuY2FjaGU7UWMoaCxlKXx8KGIudW5pZm9ybTRpdih0aGlzLmFkZHIsCmUpLEljKGgsZSkpfWZ1bmN0aW9uIGlyKGIpe3N3aXRjaChiKXtjYXNlIDUxMjY6cmV0dXJuIFNxO2Nhc2UgMzU2NjQ6cmV0dXJuIFRxO2Nhc2UgMzU2NjU6cmV0dXJuIFVxO2Nhc2UgMzU2NjY6cmV0dXJuIFZxO2Nhc2UgMzU2NzQ6cmV0dXJuIFdxO2Nhc2UgMzU2NzU6cmV0dXJuIFhxO2Nhc2UgMzU2NzY6cmV0dXJuIFlxO2Nhc2UgMzU2Nzg6Y2FzZSAzNjE5ODpyZXR1cm4gWnE7Y2FzZSAzNTY3OTpyZXR1cm4gYnI7Y2FzZSAzNTY4MDpyZXR1cm4gZHI7Y2FzZSAzNjI4OTpyZXR1cm4gJHE7Y2FzZSA1MTI0OmNhc2UgMzU2NzA6cmV0dXJuIGVyO2Nhc2UgMzU2Njc6Y2FzZSAzNTY3MTpyZXR1cm4gZnI7Y2FzZSAzNTY2ODpjYXNlIDM1NjcyOnJldHVybiBncjtjYXNlIDM1NjY5OmNhc2UgMzU2NzM6cmV0dXJuIGhyfX1mdW5jdGlvbiBqcihiLGUpe2IudW5pZm9ybTFmdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24ga3IoYixlKXtiLnVuaWZvcm0xaXYodGhpcy5hZGRyLGUpfWZ1bmN0aW9uIGxyKGIsCmUpe2IudW5pZm9ybTJpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gbXIoYixlKXtiLnVuaWZvcm0zaXYodGhpcy5hZGRyLGUpfWZ1bmN0aW9uIG5yKGIsZSl7Yi51bmlmb3JtNGl2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBvcihiLGUpe2U9RWYoZSx0aGlzLnNpemUsMik7Yi51bmlmb3JtMmZ2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBwcihiLGUpe2U9RWYoZSx0aGlzLnNpemUsMyk7Yi51bmlmb3JtM2Z2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBxcihiLGUpe2U9RWYoZSx0aGlzLnNpemUsNCk7Yi51bmlmb3JtNGZ2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBycihiLGUpe2U9RWYoZSx0aGlzLnNpemUsNCk7Yi51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxlKX1mdW5jdGlvbiBzcihiLGUpe2U9RWYoZSx0aGlzLnNpemUsOSk7Yi51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxlKX1mdW5jdGlvbiB0cihiLGUpe2U9RWYoZSx0aGlzLnNpemUsMTYpO2IudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsCiExLGUpfWZ1bmN0aW9uIHVyKGIsZSxoKXt2YXIgbT1lLmxlbmd0aCx1PW1uKGgsbSk7Yi51bmlmb3JtMWl2KHRoaXMuYWRkcix1KTtmb3IoYj0wO2IhPT1tOysrYiloLnNhZmVTZXRUZXh0dXJlMkQoZVtiXXx8cm4sdVtiXSl9ZnVuY3Rpb24gdnIoYixlLGgpe3ZhciBtPWUubGVuZ3RoLHU9bW4oaCxtKTtiLnVuaWZvcm0xaXYodGhpcy5hZGRyLHUpO2ZvcihiPTA7YiE9PW07KytiKWguc2FmZVNldFRleHR1cmVDdWJlKGVbYl18fHNuLHVbYl0pfWZ1bmN0aW9uIHdyKGIpe3N3aXRjaChiKXtjYXNlIDUxMjY6cmV0dXJuIGpyO2Nhc2UgMzU2NjQ6cmV0dXJuIG9yO2Nhc2UgMzU2NjU6cmV0dXJuIHByO2Nhc2UgMzU2NjY6cmV0dXJuIHFyO2Nhc2UgMzU2NzQ6cmV0dXJuIHJyO2Nhc2UgMzU2NzU6cmV0dXJuIHNyO2Nhc2UgMzU2NzY6cmV0dXJuIHRyO2Nhc2UgMzU2Nzg6cmV0dXJuIHVyO2Nhc2UgMzU2ODA6cmV0dXJuIHZyO2Nhc2UgNTEyNDpjYXNlIDM1NjcwOnJldHVybiBrcjtjYXNlIDM1NjY3OmNhc2UgMzU2NzE6cmV0dXJuIGxyOwpjYXNlIDM1NjY4OmNhc2UgMzU2NzI6cmV0dXJuIG1yO2Nhc2UgMzU2Njk6Y2FzZSAzNTY3MzpyZXR1cm4gbnJ9fWZ1bmN0aW9uIHhyKGIsZSxoKXt0aGlzLmlkPWI7dGhpcy5hZGRyPWg7dGhpcy5jYWNoZT1bXTt0aGlzLnNldFZhbHVlPWlyKGUudHlwZSl9ZnVuY3Rpb24gdG4oYixlLGgpe3RoaXMuaWQ9Yjt0aGlzLmFkZHI9aDt0aGlzLmNhY2hlPVtdO3RoaXMuc2l6ZT1lLnNpemU7dGhpcy5zZXRWYWx1ZT13cihlLnR5cGUpfWZ1bmN0aW9uIHVuKGIpe3RoaXMuaWQ9Yjt0aGlzLnNlcT1bXTt0aGlzLm1hcD17fX1mdW5jdGlvbiB2bihiLGUpe2Iuc2VxLnB1c2goZSk7Yi5tYXBbZS5pZF09ZX1mdW5jdGlvbiB5cihiLGUsaCl7dmFyIG09Yi5uYW1lLHU9bS5sZW5ndGg7Zm9yKG9rLmxhc3RJbmRleD0wOzspe3ZhciB3PW9rLmV4ZWMobSksQT1vay5sYXN0SW5kZXgsRT13WzFdLEc9d1szXTsiXSI9PT13WzJdJiYoRXw9MCk7aWYodm9pZCAwPT09R3x8IlsiPT09RyYmQSsyPT09dSl7dm4oaCwKdm9pZCAwPT09Rz9uZXcgeHIoRSxiLGUpOm5ldyB0bihFLGIsZSkpO2JyZWFrfWVsc2Ugdz1oLm1hcFtFXSx2b2lkIDA9PT13JiYodz1uZXcgdW4oRSksdm4oaCx3KSksaD13fX1mdW5jdGlvbiBsZShiLGUpe3RoaXMuc2VxPVtdO3RoaXMubWFwPXt9O2Zvcih2YXIgaD1iLmdldFByb2dyYW1QYXJhbWV0ZXIoZSwzNTcxOCksbT0wO208aDsrK20pe3ZhciB1PWIuZ2V0QWN0aXZlVW5pZm9ybShlLG0pO3lyKHUsYi5nZXRVbmlmb3JtTG9jYXRpb24oZSx1Lm5hbWUpLHRoaXMpfX1mdW5jdGlvbiB3bihiLGUsaCl7ZT1iLmNyZWF0ZVNoYWRlcihlKTtiLnNoYWRlclNvdXJjZShlLGgpO2IuY29tcGlsZVNoYWRlcihlKTtyZXR1cm4gZX1mdW5jdGlvbiB6cihiKXtiPWIuc3BsaXQoIlxuIik7Zm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspYltlXT1lKzErIjogIitiW2VdO3JldHVybiBiLmpvaW4oIlxuIil9ZnVuY3Rpb24geG4oYil7c3dpdGNoKGIpe2Nhc2UgM0UzOnJldHVyblsiTGluZWFyIiwKIiggdmFsdWUgKSJdO2Nhc2UgMzAwMTpyZXR1cm5bInNSR0IiLCIoIHZhbHVlICkiXTtjYXNlIDMwMDI6cmV0dXJuWyJSR0JFIiwiKCB2YWx1ZSApIl07Y2FzZSAzMDA0OnJldHVyblsiUkdCTSIsIiggdmFsdWUsIDcuMCApIl07Y2FzZSAzMDA1OnJldHVyblsiUkdCTSIsIiggdmFsdWUsIDE2LjAgKSJdO2Nhc2UgMzAwNjpyZXR1cm5bIlJHQkQiLCIoIHZhbHVlLCAyNTYuMCApIl07Y2FzZSAzMDA3OnJldHVyblsiR2FtbWEiLCIoIHZhbHVlLCBmbG9hdCggR0FNTUFfRkFDVE9SICkgKSJdO2Nhc2UgMzAwMzpyZXR1cm5bIkxvZ0x1diIsIiggdmFsdWUgKSJdO2RlZmF1bHQ6dGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIGVuY29kaW5nOiAiK2IpO319ZnVuY3Rpb24geW4oYixlLGgpe3ZhciBtPWIuZ2V0U2hhZGVyUGFyYW1ldGVyKGUsMzU3MTMpLHU9Yi5nZXRTaGFkZXJJbmZvTG9nKGUpLnRyaW0oKTtyZXR1cm4gbSYmIiI9PT11PyIiOiJUSFJFRS5XZWJHTFNoYWRlcjogZ2wuZ2V0U2hhZGVySW5mb0xvZygpICIrCmgrIlxuIit1K3pyKGIuZ2V0U2hhZGVyU291cmNlKGUpKX1mdW5jdGlvbiByaShiLGUpe2U9eG4oZSk7cmV0dXJuInZlYzQgIitiKyIoIHZlYzQgdmFsdWUgKSB7IHJldHVybiAiK2VbMF0rIlRvTGluZWFyIitlWzFdKyI7IH0ifWZ1bmN0aW9uIEFyKGIsZSl7ZT14bihlKTtyZXR1cm4idmVjNCAiK2IrIiggdmVjNCB2YWx1ZSApIHsgcmV0dXJuIExpbmVhclRvIitlWzBdK2VbMV0rIjsgfSJ9ZnVuY3Rpb24gQnIoYixlKXtzd2l0Y2goZSl7Y2FzZSAxOmU9IkxpbmVhciI7YnJlYWs7Y2FzZSAyOmU9IlJlaW5oYXJkIjticmVhaztjYXNlIDM6ZT0iVW5jaGFydGVkMiI7YnJlYWs7Y2FzZSA0OmU9Ik9wdGltaXplZENpbmVvbiI7YnJlYWs7Y2FzZSA1OmU9IkFDRVNGaWxtaWMiO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIHRvbmVNYXBwaW5nOiAiK2UpO31yZXR1cm4idmVjMyAiK2IrIiggdmVjMyBjb2xvciApIHsgcmV0dXJuICIrZSsiVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0ifQpmdW5jdGlvbiBDcihiLGUsaCl7Yj1ifHx7fTtyZXR1cm5bYi5kZXJpdmF0aXZlc3x8ZS5lbnZNYXBDdWJlVVZ8fGUuYnVtcE1hcHx8ZS50YW5nZW50U3BhY2VOb3JtYWxNYXB8fGUuY2xlYXJjb2F0Tm9ybWFsTWFwfHxlLmZsYXRTaGFkaW5nPyIjZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IGVuYWJsZSI6IiIsKGIuZnJhZ0RlcHRofHxlLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIpJiZoLmdldCgiRVhUX2ZyYWdfZGVwdGgiKT8iI2V4dGVuc2lvbiBHTF9FWFRfZnJhZ19kZXB0aCA6IGVuYWJsZSI6IiIsYi5kcmF3QnVmZmVycyYmaC5nZXQoIldFQkdMX2RyYXdfYnVmZmVycyIpPyIjZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlIjoiIiwoYi5zaGFkZXJUZXh0dXJlTE9EfHxlLmVudk1hcCkmJmguZ2V0KCJFWFRfc2hhZGVyX3RleHR1cmVfbG9kIik/IiNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IGVuYWJsZSI6IiJdLmZpbHRlcihaZykuam9pbigiXG4iKX0KZnVuY3Rpb24gRHIoYil7dmFyIGU9W10saDtmb3IoaCBpbiBiKXt2YXIgbT1iW2hdOyExIT09bSYmZS5wdXNoKCIjZGVmaW5lICIraCsiICIrbSl9cmV0dXJuIGUuam9pbigiXG4iKX1mdW5jdGlvbiBFcihiLGUpe2Zvcih2YXIgaD17fSxtPWIuZ2V0UHJvZ3JhbVBhcmFtZXRlcihlLDM1NzIxKSx1PTA7dTxtO3UrKyl7dmFyIHc9Yi5nZXRBY3RpdmVBdHRyaWIoZSx1KS5uYW1lO2hbd109Yi5nZXRBdHRyaWJMb2NhdGlvbihlLHcpfXJldHVybiBofWZ1bmN0aW9uIFpnKGIpe3JldHVybiIiIT09Yn1mdW5jdGlvbiB6bihiLGUpe3JldHVybiBiLnJlcGxhY2UoL05VTV9ESVJfTElHSFRTL2csZS5udW1EaXJMaWdodHMpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUUy9nLGUubnVtU3BvdExpZ2h0cykucmVwbGFjZSgvTlVNX1JFQ1RfQVJFQV9MSUdIVFMvZyxlLm51bVJlY3RBcmVhTGlnaHRzKS5yZXBsYWNlKC9OVU1fUE9JTlRfTElHSFRTL2csZS5udW1Qb2ludExpZ2h0cykucmVwbGFjZSgvTlVNX0hFTUlfTElHSFRTL2csCmUubnVtSGVtaUxpZ2h0cykucmVwbGFjZSgvTlVNX0RJUl9MSUdIVF9TSEFET1dTL2csZS5udW1EaXJMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUX1NIQURPV1MvZyxlLm51bVNwb3RMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9QT0lOVF9MSUdIVF9TSEFET1dTL2csZS5udW1Qb2ludExpZ2h0U2hhZG93cyl9ZnVuY3Rpb24gQW4oYixlKXtyZXR1cm4gYi5yZXBsYWNlKC9OVU1fQ0xJUFBJTkdfUExBTkVTL2csZS5udW1DbGlwcGluZ1BsYW5lcykucmVwbGFjZSgvVU5JT05fQ0xJUFBJTkdfUExBTkVTL2csZS5udW1DbGlwcGluZ1BsYW5lcy1lLm51bUNsaXBJbnRlcnNlY3Rpb24pfWZ1bmN0aW9uIHBrKGIpe3JldHVybiBiLnJlcGxhY2UoL15bIFx0XSojaW5jbHVkZSArPChbXHdcZC4vXSspPi9nbSxmdW5jdGlvbihlLGgpe2U9d2JbaF07aWYodm9pZCAwPT09ZSl0aHJvdyBFcnJvcigiQ2FuIG5vdCByZXNvbHZlICNpbmNsdWRlIFx4M2MiK2grIlx4M2UiKTtyZXR1cm4gcGsoZSl9KX0KZnVuY3Rpb24gQm4oYil7cmV0dXJuIGIucmVwbGFjZSgvI3ByYWdtYSB1bnJvbGxfbG9vcFtcc10rP2ZvciBcKCBpbnQgaSA9IChcZCspOyBpIDwgKFxkKyk7IGkgXCtcKyBcKSBceyhbXHNcU10rPykoPz1cfSlcfS9nLGZ1bmN0aW9uKGUsaCxtLHUpe2U9IiI7Zm9yKGg9cGFyc2VJbnQoaCk7aDxwYXJzZUludChtKTtoKyspZSs9dS5yZXBsYWNlKC9cWyBpIFxdL2csIlsgIitoKyIgXSIpLnJlcGxhY2UoL1VOUk9MTEVEX0xPT1BfSU5ERVgvZyxoKTtyZXR1cm4gZX0pfWZ1bmN0aW9uIEZyKGIsZSxoLG0sdSx3LEEpe3ZhciBFPWIuZ2V0Q29udGV4dCgpLEc9bS5kZWZpbmVzLEo9dS52ZXJ0ZXhTaGFkZXIsUT11LmZyYWdtZW50U2hhZGVyLFM9IlNIQURPV01BUF9UWVBFX0JBU0lDIjsxPT09dy5zaGFkb3dNYXBUeXBlP1M9IlNIQURPV01BUF9UWVBFX1BDRiI6Mj09PXcuc2hhZG93TWFwVHlwZT9TPSJTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCI6Mz09PXcuc2hhZG93TWFwVHlwZSYmKFM9CiJTSEFET1dNQVBfVFlQRV9WU00iKTt2YXIgVD0iRU5WTUFQX1RZUEVfQ1VCRSIsVz0iRU5WTUFQX01PREVfUkVGTEVDVElPTiIsWD0iRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZIjtpZih3LmVudk1hcCl7c3dpdGNoKG0uZW52TWFwLm1hcHBpbmcpe2Nhc2UgMzAxOmNhc2UgMzAyOlQ9IkVOVk1BUF9UWVBFX0NVQkUiO2JyZWFrO2Nhc2UgMzA2OmNhc2UgMzA3OlQ9IkVOVk1BUF9UWVBFX0NVQkVfVVYiO2JyZWFrO2Nhc2UgMzAzOmNhc2UgMzA0OlQ9IkVOVk1BUF9UWVBFX0VRVUlSRUMiO2JyZWFrO2Nhc2UgMzA1OlQ9IkVOVk1BUF9UWVBFX1NQSEVSRSJ9c3dpdGNoKG0uZW52TWFwLm1hcHBpbmcpe2Nhc2UgMzAyOmNhc2UgMzA0Olc9IkVOVk1BUF9NT0RFX1JFRlJBQ1RJT04ifXN3aXRjaChtLmNvbWJpbmUpe2Nhc2UgMDpYPSJFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFkiO2JyZWFrO2Nhc2UgMTpYPSJFTlZNQVBfQkxFTkRJTkdfTUlYIjticmVhaztjYXNlIDI6WD0iRU5WTUFQX0JMRU5ESU5HX0FERCJ9fXZhciBpYT0KMDxiLmdhbW1hRmFjdG9yP2IuZ2FtbWFGYWN0b3I6MSxoYT1BLmlzV2ViR0wyPyIiOkNyKG0uZXh0ZW5zaW9ucyx3LGUpLHNhPURyKEcpLHFhPUUuY3JlYXRlUHJvZ3JhbSgpO20uaXNSYXdTaGFkZXJNYXRlcmlhbD8oRz1bc2FdLmZpbHRlcihaZykuam9pbigiXG4iKSwwPEcubGVuZ3RoJiYoRys9IlxuIiksZT1baGEsc2FdLmZpbHRlcihaZykuam9pbigiXG4iKSwwPGUubGVuZ3RoJiYoZSs9IlxuIikpOihHPVsicHJlY2lzaW9uICIrdy5wcmVjaXNpb24rIiBmbG9hdDsiLCJwcmVjaXNpb24gIit3LnByZWNpc2lvbisiIGludDsiLCJoaWdocCI9PT13LnByZWNpc2lvbj8iI2RlZmluZSBISUdIX1BSRUNJU0lPTiI6IiIsIiNkZWZpbmUgU0hBREVSX05BTUUgIit1Lm5hbWUsc2Esdy5zdXBwb3J0c1ZlcnRleFRleHR1cmVzPyIjZGVmaW5lIFZFUlRFWF9URVhUVVJFUyI6IiIsIiNkZWZpbmUgR0FNTUFfRkFDVE9SICIraWEsIiNkZWZpbmUgTUFYX0JPTkVTICIrdy5tYXhCb25lcyx3LnVzZUZvZyYmCncuZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLHcudXNlRm9nJiZ3LmZvZ0V4cDI/IiNkZWZpbmUgRk9HX0VYUDIiOiIiLHcubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLHcuZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLHcuZW52TWFwPyIjZGVmaW5lICIrVzoiIix3LmxpZ2h0TWFwPyIjZGVmaW5lIFVTRV9MSUdIVE1BUCI6IiIsdy5hb01hcD8iI2RlZmluZSBVU0VfQU9NQVAiOiIiLHcuZW1pc3NpdmVNYXA/IiNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQIjoiIix3LmJ1bXBNYXA/IiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLHcubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLHcubm9ybWFsTWFwJiZ3Lm9iamVjdFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCI6IiIsdy5ub3JtYWxNYXAmJncudGFuZ2VudFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAiOiIiLHcuY2xlYXJjb2F0Tm9ybWFsTWFwPwoiI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCI6IiIsdy5kaXNwbGFjZW1lbnRNYXAmJncuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcz8iI2RlZmluZSBVU0VfRElTUExBQ0VNRU5UTUFQIjoiIix3LnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsdy5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6IiIsdy5tZXRhbG5lc3NNYXA/IiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCI6IiIsdy5hbHBoYU1hcD8iI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLHcudmVydGV4VGFuZ2VudHM/IiNkZWZpbmUgVVNFX1RBTkdFTlQiOiIiLHcudmVydGV4Q29sb3JzPyIjZGVmaW5lIFVTRV9DT0xPUiI6IiIsdy52ZXJ0ZXhVdnM/IiNkZWZpbmUgVVNFX1VWIjoiIix3LmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIix3LnNraW5uaW5nPyIjZGVmaW5lIFVTRV9TS0lOTklORyI6IiIsdy51c2VWZXJ0ZXhUZXh0dXJlPyIjZGVmaW5lIEJPTkVfVEVYVFVSRSI6CiIiLHcubW9ycGhUYXJnZXRzPyIjZGVmaW5lIFVTRV9NT1JQSFRBUkdFVFMiOiIiLHcubW9ycGhOb3JtYWxzJiYhMT09PXcuZmxhdFNoYWRpbmc/IiNkZWZpbmUgVVNFX01PUlBITk9STUFMUyI6IiIsdy5kb3VibGVTaWRlZD8iI2RlZmluZSBET1VCTEVfU0lERUQiOiIiLHcuZmxpcFNpZGVkPyIjZGVmaW5lIEZMSVBfU0lERUQiOiIiLHcuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSBVU0VfU0hBRE9XTUFQIjoiIix3LnNoYWRvd01hcEVuYWJsZWQ/IiNkZWZpbmUgIitTOiIiLHcuc2l6ZUF0dGVudWF0aW9uPyIjZGVmaW5lIFVTRV9TSVpFQVRURU5VQVRJT04iOiIiLHcubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcj8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUYiOiIiLHcubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciYmKEEuaXNXZWJHTDJ8fGUuZ2V0KCJFWFRfZnJhZ19kZXB0aCIpKT8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUIjoiIiwidW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OyIsInVuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7IiwKInVuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4OyIsInVuaWZvcm0gbWF0NCB2aWV3TWF0cml4OyIsInVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7IiwidW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOyIsImF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uOyIsImF0dHJpYnV0ZSB2ZWMzIG5vcm1hbDsiLCJhdHRyaWJ1dGUgdmVjMiB1djsiLCIjaWZkZWYgVVNFX1RBTkdFTlQiLCJcdGF0dHJpYnV0ZSB2ZWM0IHRhbmdlbnQ7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9DT0xPUiIsIlx0YXR0cmlidXRlIHZlYzMgY29sb3I7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFMiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MDsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MTsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MjsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MzsiLCJcdCNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTIiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMDsiLAoiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMTsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwyOyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDM7IiwiXHQjZWxzZSIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDQ7IiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NTsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ2OyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDc7IiwiXHQjZW5kaWYiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX1NLSU5OSU5HIiwiXHRhdHRyaWJ1dGUgdmVjNCBza2luSW5kZXg7IiwiXHRhdHRyaWJ1dGUgdmVjNCBza2luV2VpZ2h0OyIsIiNlbmRpZiIsIlxuIl0uZmlsdGVyKFpnKS5qb2luKCJcbiIpLGU9W2hhLCJwcmVjaXNpb24gIit3LnByZWNpc2lvbisiIGZsb2F0OyIsInByZWNpc2lvbiAiK3cucHJlY2lzaW9uKyIgaW50OyIsImhpZ2hwIj09PXcucHJlY2lzaW9uPyIjZGVmaW5lIEhJR0hfUFJFQ0lTSU9OIjoKIiIsIiNkZWZpbmUgU0hBREVSX05BTUUgIit1Lm5hbWUsc2Esdy5hbHBoYVRlc3Q/IiNkZWZpbmUgQUxQSEFURVNUICIrdy5hbHBoYVRlc3QrKHcuYWxwaGFUZXN0JTE/IiI6Ii4wIik6IiIsIiNkZWZpbmUgR0FNTUFfRkFDVE9SICIraWEsdy51c2VGb2cmJncuZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLHcudXNlRm9nJiZ3LmZvZ0V4cDI/IiNkZWZpbmUgRk9HX0VYUDIiOiIiLHcubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLHcubWF0Y2FwPyIjZGVmaW5lIFVTRV9NQVRDQVAiOiIiLHcuZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLHcuZW52TWFwPyIjZGVmaW5lICIrVDoiIix3LmVudk1hcD8iI2RlZmluZSAiK1c6IiIsdy5lbnZNYXA/IiNkZWZpbmUgIitYOiIiLHcubGlnaHRNYXA/IiNkZWZpbmUgVVNFX0xJR0hUTUFQIjoiIix3LmFvTWFwPyIjZGVmaW5lIFVTRV9BT01BUCI6IiIsdy5lbWlzc2l2ZU1hcD8iI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAiOiIiLHcuYnVtcE1hcD8KIiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLHcubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLHcubm9ybWFsTWFwJiZ3Lm9iamVjdFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCI6IiIsdy5ub3JtYWxNYXAmJncudGFuZ2VudFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAiOiIiLHcuY2xlYXJjb2F0Tm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQIjoiIix3LnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsdy5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6IiIsdy5tZXRhbG5lc3NNYXA/IiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCI6IiIsdy5hbHBoYU1hcD8iI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLHcuc2hlZW4/IiNkZWZpbmUgVVNFX1NIRUVOIjoiIix3LnZlcnRleFRhbmdlbnRzPyIjZGVmaW5lIFVTRV9UQU5HRU5UIjoKIiIsdy52ZXJ0ZXhDb2xvcnM/IiNkZWZpbmUgVVNFX0NPTE9SIjoiIix3LnZlcnRleFV2cz8iI2RlZmluZSBVU0VfVVYiOiIiLHcuZ3JhZGllbnRNYXA/IiNkZWZpbmUgVVNFX0dSQURJRU5UTUFQIjoiIix3LmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIix3LmRvdWJsZVNpZGVkPyIjZGVmaW5lIERPVUJMRV9TSURFRCI6IiIsdy5mbGlwU2lkZWQ/IiNkZWZpbmUgRkxJUF9TSURFRCI6IiIsdy5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lIFVTRV9TSEFET1dNQVAiOiIiLHcuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSAiK1M6IiIsdy5wcmVtdWx0aXBsaWVkQWxwaGE/IiNkZWZpbmUgUFJFTVVMVElQTElFRF9BTFBIQSI6IiIsdy5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cz8iI2RlZmluZSBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTIjoiIix3LmxvZ2FyaXRobWljRGVwdGhCdWZmZXI/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGIjoiIix3LmxvZ2FyaXRobWljRGVwdGhCdWZmZXImJgooQS5pc1dlYkdMMnx8ZS5nZXQoIkVYVF9mcmFnX2RlcHRoIikpPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQiOiIiLChtLmV4dGVuc2lvbnMmJm0uZXh0ZW5zaW9ucy5zaGFkZXJUZXh0dXJlTE9EfHx3LmVudk1hcCkmJihBLmlzV2ViR0wyfHxlLmdldCgiRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCIpKT8iI2RlZmluZSBURVhUVVJFX0xPRF9FWFQiOiIiLCJ1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsiLCJ1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247IiwwIT09dy50b25lTWFwcGluZz8iI2RlZmluZSBUT05FX01BUFBJTkciOiIiLDAhPT13LnRvbmVNYXBwaW5nP3diLnRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IiIsMCE9PXcudG9uZU1hcHBpbmc/QnIoInRvbmVNYXBwaW5nIix3LnRvbmVNYXBwaW5nKToiIix3LmRpdGhlcmluZz8iI2RlZmluZSBESVRIRVJJTkciOiIiLHcub3V0cHV0RW5jb2Rpbmd8fHcubWFwRW5jb2Rpbmd8fHcubWF0Y2FwRW5jb2Rpbmd8fHcuZW52TWFwRW5jb2Rpbmd8fAp3LmVtaXNzaXZlTWFwRW5jb2Rpbmc/d2IuZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ6IiIsdy5tYXBFbmNvZGluZz9yaSgibWFwVGV4ZWxUb0xpbmVhciIsdy5tYXBFbmNvZGluZyk6IiIsdy5tYXRjYXBFbmNvZGluZz9yaSgibWF0Y2FwVGV4ZWxUb0xpbmVhciIsdy5tYXRjYXBFbmNvZGluZyk6IiIsdy5lbnZNYXBFbmNvZGluZz9yaSgiZW52TWFwVGV4ZWxUb0xpbmVhciIsdy5lbnZNYXBFbmNvZGluZyk6IiIsdy5lbWlzc2l2ZU1hcEVuY29kaW5nP3JpKCJlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXIiLHcuZW1pc3NpdmVNYXBFbmNvZGluZyk6IiIsdy5vdXRwdXRFbmNvZGluZz9BcigibGluZWFyVG9PdXRwdXRUZXhlbCIsdy5vdXRwdXRFbmNvZGluZyk6IiIsdy5kZXB0aFBhY2tpbmc/IiNkZWZpbmUgREVQVEhfUEFDS0lORyAiK20uZGVwdGhQYWNraW5nOiIiLCJcbiJdLmZpbHRlcihaZykuam9pbigiXG4iKSk7Sj1wayhKKTtKPXpuKEosdyk7Sj1BbihKLHcpO1E9cGsoUSk7UT16bihRLAp3KTtRPUFuKFEsdyk7Sj1CbihKKTtRPUJuKFEpO0EuaXNXZWJHTDImJiFtLmlzUmF3U2hhZGVyTWF0ZXJpYWwmJihBPSExLFM9L15ccyojdmVyc2lvblxzKzMwMFxzK2VzXHMqXG4vLG0uaXNTaGFkZXJNYXRlcmlhbCYmbnVsbCE9PUoubWF0Y2goUykmJm51bGwhPT1RLm1hdGNoKFMpJiYoQT0hMCxKPUoucmVwbGFjZShTLCIiKSxRPVEucmVwbGFjZShTLCIiKSksRz0iI3ZlcnNpb24gMzAwIGVzXG5cbiNkZWZpbmUgYXR0cmlidXRlIGluXG4jZGVmaW5lIHZhcnlpbmcgb3V0XG4jZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlXG4iK0csZT1bIiN2ZXJzaW9uIDMwMCBlc1xuXG4jZGVmaW5lIHZhcnlpbmcgaW4iLEE/IiI6Im91dCBoaWdocCB2ZWM0IHBjX2ZyYWdDb2xvcjsiLEE/IiI6IiNkZWZpbmUgZ2xfRnJhZ0NvbG9yIHBjX2ZyYWdDb2xvciIsIiNkZWZpbmUgZ2xfRnJhZ0RlcHRoRVhUIGdsX0ZyYWdEZXB0aFxuI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZVxuI2RlZmluZSB0ZXh0dXJlQ3ViZSB0ZXh0dXJlXG4jZGVmaW5lIHRleHR1cmUyRFByb2ogdGV4dHVyZVByb2pcbiNkZWZpbmUgdGV4dHVyZTJETG9kRVhUIHRleHR1cmVMb2RcbiNkZWZpbmUgdGV4dHVyZTJEUHJvakxvZEVYVCB0ZXh0dXJlUHJvakxvZFxuI2RlZmluZSB0ZXh0dXJlQ3ViZUxvZEVYVCB0ZXh0dXJlTG9kXG4jZGVmaW5lIHRleHR1cmUyREdyYWRFWFQgdGV4dHVyZUdyYWRcbiNkZWZpbmUgdGV4dHVyZTJEUHJvakdyYWRFWFQgdGV4dHVyZVByb2pHcmFkXG4jZGVmaW5lIHRleHR1cmVDdWJlR3JhZEVYVCB0ZXh0dXJlR3JhZCJdLmpvaW4oIlxuIikrCiJcbiIrZSk7UT1lK1E7Sj13bihFLDM1NjMzLEcrSik7UT13bihFLDM1NjMyLFEpO0UuYXR0YWNoU2hhZGVyKHFhLEopO0UuYXR0YWNoU2hhZGVyKHFhLFEpO3ZvaWQgMCE9PW0uaW5kZXgwQXR0cmlidXRlTmFtZT9FLmJpbmRBdHRyaWJMb2NhdGlvbihxYSwwLG0uaW5kZXgwQXR0cmlidXRlTmFtZSk6ITA9PT13Lm1vcnBoVGFyZ2V0cyYmRS5iaW5kQXR0cmliTG9jYXRpb24ocWEsMCwicG9zaXRpb24iKTtFLmxpbmtQcm9ncmFtKHFhKTtpZihiLmRlYnVnLmNoZWNrU2hhZGVyRXJyb3JzKXtiPUUuZ2V0UHJvZ3JhbUluZm9Mb2cocWEpLnRyaW0oKTt3PUUuZ2V0U2hhZGVySW5mb0xvZyhKKS50cmltKCk7QT1FLmdldFNoYWRlckluZm9Mb2coUSkudHJpbSgpO1Q9Uz0hMDtpZighMT09PUUuZ2V0UHJvZ3JhbVBhcmFtZXRlcihxYSwzNTcxNCkpUz0hMSxXPXluKEUsSiwidmVydGV4IiksWD15bihFLFEsImZyYWdtZW50IiksY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xQcm9ncmFtOiBzaGFkZXIgZXJyb3I6ICIsCkUuZ2V0RXJyb3IoKSwiMzU3MTUiLEUuZ2V0UHJvZ3JhbVBhcmFtZXRlcihxYSwzNTcxNSksImdsLmdldFByb2dyYW1JbmZvTG9nIixiLFcsWCk7ZWxzZSBpZigiIiE9PWIpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW06IGdsLmdldFByb2dyYW1JbmZvTG9nKCkiLGIpO2Vsc2UgaWYoIiI9PT13fHwiIj09PUEpVD0hMTtUJiYodGhpcy5kaWFnbm9zdGljcz17cnVubmFibGU6UyxtYXRlcmlhbDptLHByb2dyYW1Mb2c6Yix2ZXJ0ZXhTaGFkZXI6e2xvZzp3LHByZWZpeDpHfSxmcmFnbWVudFNoYWRlcjp7bG9nOkEscHJlZml4OmV9fSl9RS5kZWxldGVTaGFkZXIoSik7RS5kZWxldGVTaGFkZXIoUSk7dmFyIHJhO3RoaXMuZ2V0VW5pZm9ybXM9ZnVuY3Rpb24oKXt2b2lkIDA9PT1yYSYmKHJhPW5ldyBsZShFLHFhKSk7cmV0dXJuIHJhfTt2YXIgd2E7dGhpcy5nZXRBdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7dm9pZCAwPT09d2EmJih3YT1FcihFLHFhKSk7cmV0dXJuIHdhfTt0aGlzLmRlc3Ryb3k9CmZ1bmN0aW9uKCl7RS5kZWxldGVQcm9ncmFtKHFhKTt0aGlzLnByb2dyYW09dm9pZCAwfTt0aGlzLm5hbWU9dS5uYW1lO3RoaXMuaWQ9R3IrKzt0aGlzLmNvZGU9aDt0aGlzLnVzZWRUaW1lcz0xO3RoaXMucHJvZ3JhbT1xYTt0aGlzLnZlcnRleFNoYWRlcj1KO3RoaXMuZnJhZ21lbnRTaGFkZXI9UTtyZXR1cm4gdGhpc31mdW5jdGlvbiBIcihiLGUsaCl7ZnVuY3Rpb24gbShHKXtHPUcuc2tlbGV0b24uYm9uZXM7aWYoaC5mbG9hdFZlcnRleFRleHR1cmVzKXJldHVybiAxMDI0O3ZhciBKPU1hdGgubWluKE1hdGguZmxvb3IoKGgubWF4VmVydGV4VW5pZm9ybXMtMjApLzQpLEcubGVuZ3RoKTtyZXR1cm4gSjxHLmxlbmd0aD8oY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBTa2VsZXRvbiBoYXMgIitHLmxlbmd0aCsiIGJvbmVzLiBUaGlzIEdQVSBzdXBwb3J0cyAiK0orIi4iKSwwKTpKfWZ1bmN0aW9uIHUoRyxKKXtpZihHKUcuaXNUZXh0dXJlP1E9Ry5lbmNvZGluZzpHLmlzV2ViR0xSZW5kZXJUYXJnZXQmJgooY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW1zLmdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXA6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksUT1HLnRleHR1cmUuZW5jb2RpbmcpO2Vsc2UgdmFyIFE9M0UzOzNFMz09PVEmJkomJihRPTMwMDcpO3JldHVybiBRfXZhciB3PVtdLEE9e01lc2hEZXB0aE1hdGVyaWFsOiJkZXB0aCIsTWVzaERpc3RhbmNlTWF0ZXJpYWw6ImRpc3RhbmNlUkdCQSIsTWVzaE5vcm1hbE1hdGVyaWFsOiJub3JtYWwiLE1lc2hCYXNpY01hdGVyaWFsOiJiYXNpYyIsTWVzaExhbWJlcnRNYXRlcmlhbDoibGFtYmVydCIsTWVzaFBob25nTWF0ZXJpYWw6InBob25nIixNZXNoVG9vbk1hdGVyaWFsOiJwaG9uZyIsTWVzaFN0YW5kYXJkTWF0ZXJpYWw6InBoeXNpY2FsIixNZXNoUGh5c2ljYWxNYXRlcmlhbDoicGh5c2ljYWwiLE1lc2hNYXRjYXBNYXRlcmlhbDoibWF0Y2FwIiwKTGluZUJhc2ljTWF0ZXJpYWw6ImJhc2ljIixMaW5lRGFzaGVkTWF0ZXJpYWw6ImRhc2hlZCIsUG9pbnRzTWF0ZXJpYWw6InBvaW50cyIsU2hhZG93TWF0ZXJpYWw6InNoYWRvdyIsU3ByaXRlTWF0ZXJpYWw6InNwcml0ZSJ9LEU9InByZWNpc2lvbiBzdXBwb3J0c1ZlcnRleFRleHR1cmVzIG1hcCBtYXBFbmNvZGluZyBtYXRjYXAgbWF0Y2FwRW5jb2RpbmcgZW52TWFwIGVudk1hcE1vZGUgZW52TWFwRW5jb2RpbmcgbGlnaHRNYXAgYW9NYXAgZW1pc3NpdmVNYXAgZW1pc3NpdmVNYXBFbmNvZGluZyBidW1wTWFwIG5vcm1hbE1hcCBvYmplY3RTcGFjZU5vcm1hbE1hcCB0YW5nZW50U3BhY2VOb3JtYWxNYXAgY2xlYXJjb2F0Tm9ybWFsTWFwIGRpc3BsYWNlbWVudE1hcCBzcGVjdWxhck1hcCByb3VnaG5lc3NNYXAgbWV0YWxuZXNzTWFwIGdyYWRpZW50TWFwIGFscGhhTWFwIGNvbWJpbmUgdmVydGV4Q29sb3JzIHZlcnRleFRhbmdlbnRzIGZvZyB1c2VGb2cgZm9nRXhwMiBmbGF0U2hhZGluZyBzaXplQXR0ZW51YXRpb24gbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciBza2lubmluZyBtYXhCb25lcyB1c2VWZXJ0ZXhUZXh0dXJlIG1vcnBoVGFyZ2V0cyBtb3JwaE5vcm1hbHMgbWF4TW9ycGhUYXJnZXRzIG1heE1vcnBoTm9ybWFscyBwcmVtdWx0aXBsaWVkQWxwaGEgbnVtRGlyTGlnaHRzIG51bVBvaW50TGlnaHRzIG51bVNwb3RMaWdodHMgbnVtSGVtaUxpZ2h0cyBudW1SZWN0QXJlYUxpZ2h0cyBzaGFkb3dNYXBFbmFibGVkIHNoYWRvd01hcFR5cGUgdG9uZU1hcHBpbmcgcGh5c2ljYWxseUNvcnJlY3RMaWdodHMgYWxwaGFUZXN0IGRvdWJsZVNpZGVkIGZsaXBTaWRlZCBudW1DbGlwcGluZ1BsYW5lcyBudW1DbGlwSW50ZXJzZWN0aW9uIGRlcHRoUGFja2luZyBkaXRoZXJpbmcgc2hlZW4iLnNwbGl0KCIgIik7CnRoaXMuZ2V0UGFyYW1ldGVycz1mdW5jdGlvbihHLEosUSxTLFQsVyxYKXt2YXIgaWE9QVtHLnR5cGVdLGhhPVguaXNTa2lubmVkTWVzaD9tKFgpOjAsc2E9aC5wcmVjaXNpb247bnVsbCE9PUcucHJlY2lzaW9uJiYoc2E9aC5nZXRNYXhQcmVjaXNpb24oRy5wcmVjaXNpb24pLHNhIT09Ry5wcmVjaXNpb24mJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtLmdldFBhcmFtZXRlcnM6IixHLnByZWNpc2lvbiwibm90IHN1cHBvcnRlZCwgdXNpbmciLHNhLCJpbnN0ZWFkLiIpKTt2YXIgcWE9Yi5nZXRSZW5kZXJUYXJnZXQoKTtyZXR1cm57c2hhZGVySUQ6aWEscHJlY2lzaW9uOnNhLHN1cHBvcnRzVmVydGV4VGV4dHVyZXM6aC52ZXJ0ZXhUZXh0dXJlcyxvdXRwdXRFbmNvZGluZzp1KHFhP3FhLnRleHR1cmU6bnVsbCxiLmdhbW1hT3V0cHV0KSxtYXA6ISFHLm1hcCxtYXBFbmNvZGluZzp1KEcubWFwLGIuZ2FtbWFJbnB1dCksbWF0Y2FwOiEhRy5tYXRjYXAsbWF0Y2FwRW5jb2Rpbmc6dShHLm1hdGNhcCwKYi5nYW1tYUlucHV0KSxlbnZNYXA6ISFHLmVudk1hcCxlbnZNYXBNb2RlOkcuZW52TWFwJiZHLmVudk1hcC5tYXBwaW5nLGVudk1hcEVuY29kaW5nOnUoRy5lbnZNYXAsYi5nYW1tYUlucHV0KSxlbnZNYXBDdWJlVVY6ISFHLmVudk1hcCYmKDMwNj09PUcuZW52TWFwLm1hcHBpbmd8fDMwNz09PUcuZW52TWFwLm1hcHBpbmcpLGxpZ2h0TWFwOiEhRy5saWdodE1hcCxhb01hcDohIUcuYW9NYXAsZW1pc3NpdmVNYXA6ISFHLmVtaXNzaXZlTWFwLGVtaXNzaXZlTWFwRW5jb2Rpbmc6dShHLmVtaXNzaXZlTWFwLGIuZ2FtbWFJbnB1dCksYnVtcE1hcDohIUcuYnVtcE1hcCxub3JtYWxNYXA6ISFHLm5vcm1hbE1hcCxvYmplY3RTcGFjZU5vcm1hbE1hcDoxPT09Ry5ub3JtYWxNYXBUeXBlLHRhbmdlbnRTcGFjZU5vcm1hbE1hcDowPT09Ry5ub3JtYWxNYXBUeXBlLGNsZWFyY29hdE5vcm1hbE1hcDohIUcuY2xlYXJjb2F0Tm9ybWFsTWFwLGRpc3BsYWNlbWVudE1hcDohIUcuZGlzcGxhY2VtZW50TWFwLApyb3VnaG5lc3NNYXA6ISFHLnJvdWdobmVzc01hcCxtZXRhbG5lc3NNYXA6ISFHLm1ldGFsbmVzc01hcCxzcGVjdWxhck1hcDohIUcuc3BlY3VsYXJNYXAsYWxwaGFNYXA6ISFHLmFscGhhTWFwLGdyYWRpZW50TWFwOiEhRy5ncmFkaWVudE1hcCxzaGVlbjohIUcuc2hlZW4sY29tYmluZTpHLmNvbWJpbmUsdmVydGV4VGFuZ2VudHM6Ry5ub3JtYWxNYXAmJkcudmVydGV4VGFuZ2VudHMsdmVydGV4Q29sb3JzOkcudmVydGV4Q29sb3JzLHZlcnRleFV2czohIUcubWFwfHwhIUcuYnVtcE1hcHx8ISFHLm5vcm1hbE1hcHx8ISFHLnNwZWN1bGFyTWFwfHwhIUcuYWxwaGFNYXB8fCEhRy5lbWlzc2l2ZU1hcHx8ISFHLnJvdWdobmVzc01hcHx8ISFHLm1ldGFsbmVzc01hcHx8ISFHLmNsZWFyY29hdE5vcm1hbE1hcCxmb2c6ISFTLHVzZUZvZzpHLmZvZyxmb2dFeHAyOlMmJlMuaXNGb2dFeHAyLGZsYXRTaGFkaW5nOkcuZmxhdFNoYWRpbmcsc2l6ZUF0dGVudWF0aW9uOkcuc2l6ZUF0dGVudWF0aW9uLApsb2dhcml0aG1pY0RlcHRoQnVmZmVyOmgubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcixza2lubmluZzpHLnNraW5uaW5nJiYwPGhhLG1heEJvbmVzOmhhLHVzZVZlcnRleFRleHR1cmU6aC5mbG9hdFZlcnRleFRleHR1cmVzLG1vcnBoVGFyZ2V0czpHLm1vcnBoVGFyZ2V0cyxtb3JwaE5vcm1hbHM6Ry5tb3JwaE5vcm1hbHMsbWF4TW9ycGhUYXJnZXRzOmIubWF4TW9ycGhUYXJnZXRzLG1heE1vcnBoTm9ybWFsczpiLm1heE1vcnBoTm9ybWFscyxudW1EaXJMaWdodHM6Si5kaXJlY3Rpb25hbC5sZW5ndGgsbnVtUG9pbnRMaWdodHM6Si5wb2ludC5sZW5ndGgsbnVtU3BvdExpZ2h0czpKLnNwb3QubGVuZ3RoLG51bVJlY3RBcmVhTGlnaHRzOkoucmVjdEFyZWEubGVuZ3RoLG51bUhlbWlMaWdodHM6Si5oZW1pLmxlbmd0aCxudW1EaXJMaWdodFNoYWRvd3M6Si5kaXJlY3Rpb25hbFNoYWRvd01hcC5sZW5ndGgsbnVtUG9pbnRMaWdodFNoYWRvd3M6Si5wb2ludFNoYWRvd01hcC5sZW5ndGgsbnVtU3BvdExpZ2h0U2hhZG93czpKLnNwb3RTaGFkb3dNYXAubGVuZ3RoLApudW1DbGlwcGluZ1BsYW5lczpULG51bUNsaXBJbnRlcnNlY3Rpb246VyxkaXRoZXJpbmc6Ry5kaXRoZXJpbmcsc2hhZG93TWFwRW5hYmxlZDpiLnNoYWRvd01hcC5lbmFibGVkJiZYLnJlY2VpdmVTaGFkb3cmJjA8US5sZW5ndGgsc2hhZG93TWFwVHlwZTpiLnNoYWRvd01hcC50eXBlLHRvbmVNYXBwaW5nOkcudG9uZU1hcHBlZD9iLnRvbmVNYXBwaW5nOjAscGh5c2ljYWxseUNvcnJlY3RMaWdodHM6Yi5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyxwcmVtdWx0aXBsaWVkQWxwaGE6Ry5wcmVtdWx0aXBsaWVkQWxwaGEsYWxwaGFUZXN0OkcuYWxwaGFUZXN0LGRvdWJsZVNpZGVkOjI9PT1HLnNpZGUsZmxpcFNpZGVkOjE9PT1HLnNpZGUsZGVwdGhQYWNraW5nOnZvaWQgMCE9PUcuZGVwdGhQYWNraW5nP0cuZGVwdGhQYWNraW5nOiExfX07dGhpcy5nZXRQcm9ncmFtQ29kZT1mdW5jdGlvbihHLEope3ZhciBRPVtdO0ouc2hhZGVySUQ/US5wdXNoKEouc2hhZGVySUQpOihRLnB1c2goRy5mcmFnbWVudFNoYWRlciksClEucHVzaChHLnZlcnRleFNoYWRlcikpO2lmKHZvaWQgMCE9PUcuZGVmaW5lcylmb3IodmFyIFMgaW4gRy5kZWZpbmVzKVEucHVzaChTKSxRLnB1c2goRy5kZWZpbmVzW1NdKTtmb3IoUz0wO1M8RS5sZW5ndGg7UysrKVEucHVzaChKW0VbU11dKTtRLnB1c2goRy5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKSk7US5wdXNoKGIuZ2FtbWFPdXRwdXQpO1EucHVzaChiLmdhbW1hRmFjdG9yKTtyZXR1cm4gUS5qb2luKCl9O3RoaXMuYWNxdWlyZVByb2dyYW09ZnVuY3Rpb24oRyxKLFEsUyl7Zm9yKHZhciBULFc9MCxYPXcubGVuZ3RoO1c8WDtXKyspe3ZhciBpYT13W1ddO2lmKGlhLmNvZGU9PT1TKXtUPWlhOysrVC51c2VkVGltZXM7YnJlYWt9fXZvaWQgMD09PVQmJihUPW5ldyBGcihiLGUsUyxHLEosUSxoKSx3LnB1c2goVCkpO3JldHVybiBUfTt0aGlzLnJlbGVhc2VQcm9ncmFtPWZ1bmN0aW9uKEcpezA9PT0tLUcudXNlZFRpbWVzJiYod1t3LmluZGV4T2YoRyldPXdbdy5sZW5ndGgtMV0sCncucG9wKCksRy5kZXN0cm95KCkpfTt0aGlzLnByb2dyYW1zPXd9ZnVuY3Rpb24gSXIoKXt2YXIgYj1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUpe3ZhciBoPWIuZ2V0KGUpO3ZvaWQgMD09PWgmJihoPXt9LGIuc2V0KGUsaCkpO3JldHVybiBofSxyZW1vdmU6ZnVuY3Rpb24oZSl7Yi5kZWxldGUoZSl9LHVwZGF0ZTpmdW5jdGlvbihlLGgsbSl7Yi5nZXQoZSlbaF09bX0sZGlzcG9zZTpmdW5jdGlvbigpe2I9bmV3IFdlYWtNYXB9fX1mdW5jdGlvbiBKcihiLGUpe3JldHVybiBiLmdyb3VwT3JkZXIhPT1lLmdyb3VwT3JkZXI/Yi5ncm91cE9yZGVyLWUuZ3JvdXBPcmRlcjpiLnJlbmRlck9yZGVyIT09ZS5yZW5kZXJPcmRlcj9iLnJlbmRlck9yZGVyLWUucmVuZGVyT3JkZXI6Yi5wcm9ncmFtIT09ZS5wcm9ncmFtP2IucHJvZ3JhbS5pZC1lLnByb2dyYW0uaWQ6Yi5tYXRlcmlhbC5pZCE9PWUubWF0ZXJpYWwuaWQ/Yi5tYXRlcmlhbC5pZC1lLm1hdGVyaWFsLmlkOmIueiE9PQplLno/Yi56LWUuejpiLmlkLWUuaWR9ZnVuY3Rpb24gS3IoYixlKXtyZXR1cm4gYi5ncm91cE9yZGVyIT09ZS5ncm91cE9yZGVyP2IuZ3JvdXBPcmRlci1lLmdyb3VwT3JkZXI6Yi5yZW5kZXJPcmRlciE9PWUucmVuZGVyT3JkZXI/Yi5yZW5kZXJPcmRlci1lLnJlbmRlck9yZGVyOmIueiE9PWUuej9lLnotYi56OmIuaWQtZS5pZH1mdW5jdGlvbiBDbigpe2Z1bmN0aW9uIGIoQSxFLEcsSixRLFMpe3ZhciBUPWVbaF07dm9pZCAwPT09VD8oVD17aWQ6QS5pZCxvYmplY3Q6QSxnZW9tZXRyeTpFLG1hdGVyaWFsOkcscHJvZ3JhbTpHLnByb2dyYW18fHcsZ3JvdXBPcmRlcjpKLHJlbmRlck9yZGVyOkEucmVuZGVyT3JkZXIsejpRLGdyb3VwOlN9LGVbaF09VCk6KFQuaWQ9QS5pZCxULm9iamVjdD1BLFQuZ2VvbWV0cnk9RSxULm1hdGVyaWFsPUcsVC5wcm9ncmFtPUcucHJvZ3JhbXx8dyxULmdyb3VwT3JkZXI9SixULnJlbmRlck9yZGVyPUEucmVuZGVyT3JkZXIsVC56PVEsVC5ncm91cD1TKTsKaCsrO3JldHVybiBUfXZhciBlPVtdLGg9MCxtPVtdLHU9W10sdz17aWQ6LTF9O3JldHVybntvcGFxdWU6bSx0cmFuc3BhcmVudDp1LGluaXQ6ZnVuY3Rpb24oKXtoPTA7bS5sZW5ndGg9MDt1Lmxlbmd0aD0wfSxwdXNoOmZ1bmN0aW9uKEEsRSxHLEosUSxTKXtBPWIoQSxFLEcsSixRLFMpOyghMD09PUcudHJhbnNwYXJlbnQ/dTptKS5wdXNoKEEpfSx1bnNoaWZ0OmZ1bmN0aW9uKEEsRSxHLEosUSxTKXtBPWIoQSxFLEcsSixRLFMpOyghMD09PUcudHJhbnNwYXJlbnQ/dTptKS51bnNoaWZ0KEEpfSxzb3J0OmZ1bmN0aW9uKCl7MTxtLmxlbmd0aCYmbS5zb3J0KEpyKTsxPHUubGVuZ3RoJiZ1LnNvcnQoS3IpfX19ZnVuY3Rpb24gTHIoKXtmdW5jdGlvbiBiKGgpe2g9aC50YXJnZXQ7aC5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixiKTtlLmRlbGV0ZShoKX12YXIgZT1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGgsbSl7dmFyIHU9ZS5nZXQoaCk7aWYodm9pZCAwPT09CnUpe3ZhciB3PW5ldyBDbjtlLnNldChoLG5ldyBXZWFrTWFwKTtlLmdldChoKS5zZXQobSx3KTtoLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGIpfWVsc2Ugdz11LmdldChtKSx2b2lkIDA9PT13JiYodz1uZXcgQ24sdS5zZXQobSx3KSk7cmV0dXJuIHd9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtlPW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24gTXIoKXt2YXIgYj17fTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUpe2lmKHZvaWQgMCE9PWJbZS5pZF0pcmV0dXJuIGJbZS5pZF07c3dpdGNoKGUudHlwZSl7Y2FzZSAiRGlyZWN0aW9uYWxMaWdodCI6dmFyIGg9e2RpcmVjdGlvbjpuZXcgZyxjb2xvcjpuZXcgSSxzaGFkb3c6ITEsc2hhZG93QmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IGR9O2JyZWFrO2Nhc2UgIlNwb3RMaWdodCI6aD17cG9zaXRpb246bmV3IGcsZGlyZWN0aW9uOm5ldyBnLGNvbG9yOm5ldyBJLGRpc3RhbmNlOjAsY29uZUNvczowLHBlbnVtYnJhQ29zOjAsZGVjYXk6MCwKc2hhZG93OiExLHNoYWRvd0JpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBkfTticmVhaztjYXNlICJQb2ludExpZ2h0IjpoPXtwb3NpdGlvbjpuZXcgZyxjb2xvcjpuZXcgSSxkaXN0YW5jZTowLGRlY2F5OjAsc2hhZG93OiExLHNoYWRvd0JpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBkLHNoYWRvd0NhbWVyYU5lYXI6MSxzaGFkb3dDYW1lcmFGYXI6MUUzfTticmVhaztjYXNlICJIZW1pc3BoZXJlTGlnaHQiOmg9e2RpcmVjdGlvbjpuZXcgZyxza3lDb2xvcjpuZXcgSSxncm91bmRDb2xvcjpuZXcgSX07YnJlYWs7Y2FzZSAiUmVjdEFyZWFMaWdodCI6aD17Y29sb3I6bmV3IEkscG9zaXRpb246bmV3IGcsaGFsZldpZHRoOm5ldyBnLGhhbGZIZWlnaHQ6bmV3IGd9fXJldHVybiBiW2UuaWRdPWh9fX1mdW5jdGlvbiBOcihiLGUpe3JldHVybihlLmNhc3RTaGFkb3c/MTowKS0oYi5jYXN0U2hhZG93PzE6MCl9ZnVuY3Rpb24gT3IoKXtmb3IodmFyIGI9Cm5ldyBNcixlPXt2ZXJzaW9uOjAsaGFzaDp7ZGlyZWN0aW9uYWxMZW5ndGg6LTEscG9pbnRMZW5ndGg6LTEsc3BvdExlbmd0aDotMSxyZWN0QXJlYUxlbmd0aDotMSxoZW1pTGVuZ3RoOi0xLG51bURpcmVjdGlvbmFsU2hhZG93czotMSxudW1Qb2ludFNoYWRvd3M6LTEsbnVtU3BvdFNoYWRvd3M6LTF9LGFtYmllbnQ6WzAsMCwwXSxwcm9iZTpbXSxkaXJlY3Rpb25hbDpbXSxkaXJlY3Rpb25hbFNoYWRvd01hcDpbXSxkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDpbXSxzcG90OltdLHNwb3RTaGFkb3dNYXA6W10sc3BvdFNoYWRvd01hdHJpeDpbXSxyZWN0QXJlYTpbXSxwb2ludDpbXSxwb2ludFNoYWRvd01hcDpbXSxwb2ludFNoYWRvd01hdHJpeDpbXSxoZW1pOltdLG51bURpcmVjdGlvbmFsU2hhZG93czotMSxudW1Qb2ludFNoYWRvd3M6LTEsbnVtU3BvdFNoYWRvd3M6LTF9LGg9MDs5Pmg7aCsrKWUucHJvYmUucHVzaChuZXcgZyk7dmFyIG09bmV3IGcsdT1uZXcgcix3PW5ldyByO3JldHVybntzZXR1cDpmdW5jdGlvbihBLApFLEcpe2Zvcih2YXIgSj0wLFE9MCxTPTAsVD0wOzk+VDtUKyspZS5wcm9iZVtUXS5zZXQoMCwwLDApO3ZhciBXPUU9MCxYPTAsaWE9MCxoYT0wLHNhPTAscWE9MCxyYT0wO0c9Ry5tYXRyaXhXb3JsZEludmVyc2U7QS5zb3J0KE5yKTtUPTA7Zm9yKHZhciB3YT1BLmxlbmd0aDtUPHdhO1QrKyl7dmFyIHBhPUFbVF0sdmE9cGEuY29sb3IsQ2E9cGEuaW50ZW5zaXR5LFZhPXBhLmRpc3RhbmNlLFdhPXBhLnNoYWRvdyYmcGEuc2hhZG93Lm1hcD9wYS5zaGFkb3cubWFwLnRleHR1cmU6bnVsbDtpZihwYS5pc0FtYmllbnRMaWdodClKKz12YS5yKkNhLFErPXZhLmcqQ2EsUys9dmEuYipDYTtlbHNlIGlmKHBhLmlzTGlnaHRQcm9iZSlmb3IoV2E9MDs5PldhO1dhKyspZS5wcm9iZVtXYV0uYWRkU2NhbGVkVmVjdG9yKHBhLnNoLmNvZWZmaWNpZW50c1tXYV0sQ2EpO2Vsc2UgaWYocGEuaXNEaXJlY3Rpb25hbExpZ2h0KXt2YXIgRGE9Yi5nZXQocGEpO0RhLmNvbG9yLmNvcHkocGEuY29sb3IpLm11bHRpcGx5U2NhbGFyKHBhLmludGVuc2l0eSk7CkRhLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ocGEubWF0cml4V29ybGQpO20uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHBhLnRhcmdldC5tYXRyaXhXb3JsZCk7RGEuZGlyZWN0aW9uLnN1YihtKTtEYS5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKEcpO2lmKERhLnNoYWRvdz1wYS5jYXN0U2hhZG93KUNhPXBhLnNoYWRvdyxEYS5zaGFkb3dCaWFzPUNhLmJpYXMsRGEuc2hhZG93UmFkaXVzPUNhLnJhZGl1cyxEYS5zaGFkb3dNYXBTaXplPUNhLm1hcFNpemUsZS5kaXJlY3Rpb25hbFNoYWRvd01hcFtFXT1XYSxlLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4W0VdPXBhLnNoYWRvdy5tYXRyaXgsc2ErKztlLmRpcmVjdGlvbmFsW0VdPURhO0UrK31lbHNlIGlmKHBhLmlzU3BvdExpZ2h0KXtEYT1iLmdldChwYSk7RGEucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHBhLm1hdHJpeFdvcmxkKTtEYS5wb3NpdGlvbi5hcHBseU1hdHJpeDQoRyk7RGEuY29sb3IuY29weSh2YSkubXVsdGlwbHlTY2FsYXIoQ2EpOwpEYS5kaXN0YW5jZT1WYTtEYS5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHBhLm1hdHJpeFdvcmxkKTttLnNldEZyb21NYXRyaXhQb3NpdGlvbihwYS50YXJnZXQubWF0cml4V29ybGQpO0RhLmRpcmVjdGlvbi5zdWIobSk7RGEuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihHKTtEYS5jb25lQ29zPU1hdGguY29zKHBhLmFuZ2xlKTtEYS5wZW51bWJyYUNvcz1NYXRoLmNvcyhwYS5hbmdsZSooMS1wYS5wZW51bWJyYSkpO0RhLmRlY2F5PXBhLmRlY2F5O2lmKERhLnNoYWRvdz1wYS5jYXN0U2hhZG93KUNhPXBhLnNoYWRvdyxEYS5zaGFkb3dCaWFzPUNhLmJpYXMsRGEuc2hhZG93UmFkaXVzPUNhLnJhZGl1cyxEYS5zaGFkb3dNYXBTaXplPUNhLm1hcFNpemUsZS5zcG90U2hhZG93TWFwW1hdPVdhLGUuc3BvdFNoYWRvd01hdHJpeFtYXT1wYS5zaGFkb3cubWF0cml4LHJhKys7ZS5zcG90W1hdPURhO1grK31lbHNlIGlmKHBhLmlzUmVjdEFyZWFMaWdodClEYT1iLmdldChwYSksCkRhLmNvbG9yLmNvcHkodmEpLm11bHRpcGx5U2NhbGFyKENhKSxEYS5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ocGEubWF0cml4V29ybGQpLERhLnBvc2l0aW9uLmFwcGx5TWF0cml4NChHKSx3LmlkZW50aXR5KCksdS5jb3B5KHBhLm1hdHJpeFdvcmxkKSx1LnByZW11bHRpcGx5KEcpLHcuZXh0cmFjdFJvdGF0aW9uKHUpLERhLmhhbGZXaWR0aC5zZXQoLjUqcGEud2lkdGgsMCwwKSxEYS5oYWxmSGVpZ2h0LnNldCgwLC41KnBhLmhlaWdodCwwKSxEYS5oYWxmV2lkdGguYXBwbHlNYXRyaXg0KHcpLERhLmhhbGZIZWlnaHQuYXBwbHlNYXRyaXg0KHcpLGUucmVjdEFyZWFbaWFdPURhLGlhKys7ZWxzZSBpZihwYS5pc1BvaW50TGlnaHQpe0RhPWIuZ2V0KHBhKTtEYS5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ocGEubWF0cml4V29ybGQpO0RhLnBvc2l0aW9uLmFwcGx5TWF0cml4NChHKTtEYS5jb2xvci5jb3B5KHBhLmNvbG9yKS5tdWx0aXBseVNjYWxhcihwYS5pbnRlbnNpdHkpOwpEYS5kaXN0YW5jZT1wYS5kaXN0YW5jZTtEYS5kZWNheT1wYS5kZWNheTtpZihEYS5zaGFkb3c9cGEuY2FzdFNoYWRvdylDYT1wYS5zaGFkb3csRGEuc2hhZG93Qmlhcz1DYS5iaWFzLERhLnNoYWRvd1JhZGl1cz1DYS5yYWRpdXMsRGEuc2hhZG93TWFwU2l6ZT1DYS5tYXBTaXplLERhLnNoYWRvd0NhbWVyYU5lYXI9Q2EuY2FtZXJhLm5lYXIsRGEuc2hhZG93Q2FtZXJhRmFyPUNhLmNhbWVyYS5mYXIsZS5wb2ludFNoYWRvd01hcFtXXT1XYSxlLnBvaW50U2hhZG93TWF0cml4W1ddPXBhLnNoYWRvdy5tYXRyaXgscWErKztlLnBvaW50W1ddPURhO1crK31lbHNlIHBhLmlzSGVtaXNwaGVyZUxpZ2h0JiYoRGE9Yi5nZXQocGEpLERhLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ocGEubWF0cml4V29ybGQpLERhLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oRyksRGEuZGlyZWN0aW9uLm5vcm1hbGl6ZSgpLERhLnNreUNvbG9yLmNvcHkocGEuY29sb3IpLm11bHRpcGx5U2NhbGFyKENhKSwKRGEuZ3JvdW5kQ29sb3IuY29weShwYS5ncm91bmRDb2xvcikubXVsdGlwbHlTY2FsYXIoQ2EpLGUuaGVtaVtoYV09RGEsaGErKyl9ZS5hbWJpZW50WzBdPUo7ZS5hbWJpZW50WzFdPVE7ZS5hbWJpZW50WzJdPVM7QT1lLmhhc2g7aWYoQS5kaXJlY3Rpb25hbExlbmd0aCE9PUV8fEEucG9pbnRMZW5ndGghPT1XfHxBLnNwb3RMZW5ndGghPT1YfHxBLnJlY3RBcmVhTGVuZ3RoIT09aWF8fEEuaGVtaUxlbmd0aCE9PWhhfHxBLm51bURpcmVjdGlvbmFsU2hhZG93cyE9PXNhfHxBLm51bVBvaW50U2hhZG93cyE9PXFhfHxBLm51bVNwb3RTaGFkb3dzIT09cmEpZS5kaXJlY3Rpb25hbC5sZW5ndGg9RSxlLnNwb3QubGVuZ3RoPVgsZS5yZWN0QXJlYS5sZW5ndGg9aWEsZS5wb2ludC5sZW5ndGg9VyxlLmhlbWkubGVuZ3RoPWhhLGUuZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoPXNhLGUucG9pbnRTaGFkb3dNYXAubGVuZ3RoPXFhLGUuc3BvdFNoYWRvd01hcC5sZW5ndGg9cmEsZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC5sZW5ndGg9CnNhLGUucG9pbnRTaGFkb3dNYXRyaXgubGVuZ3RoPXFhLGUuc3BvdFNoYWRvd01hdHJpeC5sZW5ndGg9cmEsQS5kaXJlY3Rpb25hbExlbmd0aD1FLEEucG9pbnRMZW5ndGg9VyxBLnNwb3RMZW5ndGg9WCxBLnJlY3RBcmVhTGVuZ3RoPWlhLEEuaGVtaUxlbmd0aD1oYSxBLm51bURpcmVjdGlvbmFsU2hhZG93cz1zYSxBLm51bVBvaW50U2hhZG93cz1xYSxBLm51bVNwb3RTaGFkb3dzPXJhLGUudmVyc2lvbj1QcisrfSxzdGF0ZTplfX1mdW5jdGlvbiBEbigpe3ZhciBiPW5ldyBPcixlPVtdLGg9W107cmV0dXJue2luaXQ6ZnVuY3Rpb24oKXtlLmxlbmd0aD0wO2gubGVuZ3RoPTB9LHN0YXRlOntsaWdodHNBcnJheTplLHNoYWRvd3NBcnJheTpoLGxpZ2h0czpifSxzZXR1cExpZ2h0czpmdW5jdGlvbihtKXtiLnNldHVwKGUsaCxtKX0scHVzaExpZ2h0OmZ1bmN0aW9uKG0pe2UucHVzaChtKX0scHVzaFNoYWRvdzpmdW5jdGlvbihtKXtoLnB1c2gobSl9fX1mdW5jdGlvbiBRcigpe2Z1bmN0aW9uIGIoaCl7aD0KaC50YXJnZXQ7aC5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixiKTtlLmRlbGV0ZShoKX12YXIgZT1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGgsbSl7aWYoITE9PT1lLmhhcyhoKSl7dmFyIHU9bmV3IERuO2Uuc2V0KGgsbmV3IFdlYWtNYXApO2UuZ2V0KGgpLnNldChtLHUpO2guYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYil9ZWxzZSExPT09ZS5nZXQoaCkuaGFzKG0pPyh1PW5ldyBEbixlLmdldChoKS5zZXQobSx1KSk6dT1lLmdldChoKS5nZXQobSk7cmV0dXJuIHV9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtlPW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24gbWUoYil7TS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTWVzaERlcHRoTWF0ZXJpYWwiO3RoaXMuZGVwdGhQYWNraW5nPTMyMDA7dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLmRpc3BsYWNlbWVudE1hcD10aGlzLmFscGhhTWFwPXRoaXMubWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0KMTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uIG5lKGIpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hEaXN0YW5jZU1hdGVyaWFsIjt0aGlzLnJlZmVyZW5jZVBvc2l0aW9uPW5ldyBnO3RoaXMubmVhckRpc3RhbmNlPTE7dGhpcy5mYXJEaXN0YW5jZT0xRTM7dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLmRpc3BsYWNlbWVudE1hcD10aGlzLmFscGhhTWFwPXRoaXMubWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz0wO3RoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uIEVuKGIsZSxoKXtmdW5jdGlvbiBtKHZhLENhKXt2YXIgVmE9ZS51cGRhdGUoc2EpO1gudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWU9CnZhLm1hcC50ZXh0dXJlO1gudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZT12YS5tYXBTaXplO1gudW5pZm9ybXMucmFkaXVzLnZhbHVlPXZhLnJhZGl1cztiLnNldFJlbmRlclRhcmdldCh2YS5tYXBQYXNzKTtiLmNsZWFyKCk7Yi5yZW5kZXJCdWZmZXJEaXJlY3QoQ2EsbnVsbCxWYSxYLHNhLG51bGwpO2lhLnVuaWZvcm1zLnNoYWRvd19wYXNzLnZhbHVlPXZhLm1hcFBhc3MudGV4dHVyZTtpYS51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlPXZhLm1hcFNpemU7aWEudW5pZm9ybXMucmFkaXVzLnZhbHVlPXZhLnJhZGl1cztiLnNldFJlbmRlclRhcmdldCh2YS5tYXApO2IuY2xlYXIoKTtiLnJlbmRlckJ1ZmZlckRpcmVjdChDYSxudWxsLFZhLGlhLHNhLG51bGwpfWZ1bmN0aW9uIHUodmEsQ2EsVmEsV2EsRGEsSWEpe3ZhciBFYT12YS5nZW9tZXRyeTt2YXIgT2E9UTt2YXIgaGI9dmEuY3VzdG9tRGVwdGhNYXRlcmlhbDtWYS5pc1BvaW50TGlnaHQmJihPYT1TLGhiPXZhLmN1c3RvbURpc3RhbmNlTWF0ZXJpYWwpOwpoYj9PYT1oYjooaGI9ITEsQ2EubW9ycGhUYXJnZXRzJiYoRWEmJkVhLmlzQnVmZmVyR2VvbWV0cnk/aGI9RWEubW9ycGhBdHRyaWJ1dGVzJiZFYS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24mJjA8RWEubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aDpFYSYmRWEuaXNHZW9tZXRyeSYmKGhiPUVhLm1vcnBoVGFyZ2V0cyYmMDxFYS5tb3JwaFRhcmdldHMubGVuZ3RoKSksdmEuaXNTa2lubmVkTWVzaCYmITE9PT1DYS5za2lubmluZyYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFNoYWRvd01hcDogVEhSRUUuU2tpbm5lZE1lc2ggd2l0aCBtYXRlcmlhbC5za2lubmluZyBzZXQgdG8gZmFsc2U6Iix2YSksdmE9dmEuaXNTa2lubmVkTWVzaCYmQ2Euc2tpbm5pbmcsRWE9MCxoYiYmKEVhfD0xKSx2YSYmKEVhfD0yKSxPYT1PYVtFYV0pO2IubG9jYWxDbGlwcGluZ0VuYWJsZWQmJiEwPT09Q2EuY2xpcFNoYWRvd3MmJjAhPT1DYS5jbGlwcGluZ1BsYW5lcy5sZW5ndGgmJihFYT1PYS51dWlkLApoYj1DYS51dWlkLHZhPVRbRWFdLHZvaWQgMD09PXZhJiYodmE9e30sVFtFYV09dmEpLEVhPXZhW2hiXSx2b2lkIDA9PT1FYSYmKEVhPU9hLmNsb25lKCksdmFbaGJdPUVhKSxPYT1FYSk7T2EudmlzaWJsZT1DYS52aXNpYmxlO09hLndpcmVmcmFtZT1DYS53aXJlZnJhbWU7T2Euc2lkZT0zPT09SWE/bnVsbCE9Q2Euc2hhZG93U2lkZT9DYS5zaGFkb3dTaWRlOkNhLnNpZGU6bnVsbCE9Q2Euc2hhZG93U2lkZT9DYS5zaGFkb3dTaWRlOldbQ2Euc2lkZV07T2EuY2xpcFNoYWRvd3M9Q2EuY2xpcFNoYWRvd3M7T2EuY2xpcHBpbmdQbGFuZXM9Q2EuY2xpcHBpbmdQbGFuZXM7T2EuY2xpcEludGVyc2VjdGlvbj1DYS5jbGlwSW50ZXJzZWN0aW9uO09hLndpcmVmcmFtZUxpbmV3aWR0aD1DYS53aXJlZnJhbWVMaW5ld2lkdGg7T2EubGluZXdpZHRoPUNhLmxpbmV3aWR0aDtWYS5pc1BvaW50TGlnaHQmJk9hLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwmJihPYS5yZWZlcmVuY2VQb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oVmEubWF0cml4V29ybGQpLApPYS5uZWFyRGlzdGFuY2U9V2EsT2EuZmFyRGlzdGFuY2U9RGEpO3JldHVybiBPYX1mdW5jdGlvbiB3KHZhLENhLFZhLFdhLERhKXtpZighMSE9PXZhLnZpc2libGUpe2lmKHZhLmxheWVycy50ZXN0KENhLmxheWVycykmJih2YS5pc01lc2h8fHZhLmlzTGluZXx8dmEuaXNQb2ludHMpJiYodmEuY2FzdFNoYWRvd3x8dmEucmVjZWl2ZVNoYWRvdyYmMz09PURhKSYmKCF2YS5mcnVzdHVtQ3VsbGVkfHxBLmludGVyc2VjdHNPYmplY3QodmEpKSl7dmEubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoVmEubWF0cml4V29ybGRJbnZlcnNlLHZhLm1hdHJpeFdvcmxkKTt2YXIgSWE9ZS51cGRhdGUodmEpLEVhPXZhLm1hdGVyaWFsO2lmKEFycmF5LmlzQXJyYXkoRWEpKWZvcih2YXIgT2E9SWEuZ3JvdXBzLGhiPTAseWI9T2EubGVuZ3RoO2hiPHliO2hiKyspe3ZhciBMYT1PYVtoYl0sZWI9RWFbTGEubWF0ZXJpYWxJbmRleF07ZWImJmViLnZpc2libGUmJihlYj11KHZhLGViLFdhLFZhLm5lYXIsClZhLmZhcixEYSksYi5yZW5kZXJCdWZmZXJEaXJlY3QoVmEsbnVsbCxJYSxlYix2YSxMYSkpfWVsc2UgRWEudmlzaWJsZSYmKGViPXUodmEsRWEsV2EsVmEubmVhcixWYS5mYXIsRGEpLGIucmVuZGVyQnVmZmVyRGlyZWN0KFZhLG51bGwsSWEsZWIsdmEsbnVsbCkpfXZhPXZhLmNoaWxkcmVuO0lhPTA7Zm9yKEVhPXZhLmxlbmd0aDtJYTxFYTtJYSsrKXcodmFbSWFdLENhLFZhLFdhLERhKX19dmFyIEE9bmV3IEVjLEU9bmV3IGQsRz1uZXcgZCxKPW5ldyBuLFE9QXJyYXkoNCksUz1BcnJheSg0KSxUPXt9LFc9ezA6MSwxOjAsMjoyfSxYPW5ldyB1Yih7ZGVmaW5lczp7U0FNUExFX1JBVEU6LjI1LEhBTEZfU0FNUExFX1JBVEU6LjEyNX0sdW5pZm9ybXM6e3NoYWRvd19wYXNzOnt2YWx1ZTpudWxsfSxyZXNvbHV0aW9uOnt2YWx1ZTpuZXcgZH0scmFkaXVzOnt2YWx1ZTo0fX0sdmVydGV4U2hhZGVyOiJ2b2lkIG1haW4oKSB7XG5cdGdsX1Bvc2l0aW9uIFx4M2QgdmVjNCggcG9zaXRpb24sIDEuMCApO1xufSIsCmZyYWdtZW50U2hhZGVyOiJ1bmlmb3JtIHNhbXBsZXIyRCBzaGFkb3dfcGFzcztcbnVuaWZvcm0gdmVjMiByZXNvbHV0aW9uO1xudW5pZm9ybSBmbG9hdCByYWRpdXM7XG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbnZvaWQgbWFpbigpIHtcbiAgZmxvYXQgbWVhbiBceDNkIDAuMDtcbiAgZmxvYXQgc3F1YXJlZF9tZWFuIFx4M2QgMC4wO1xuICBcblx0ZmxvYXQgZGVwdGggXHgzZCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgICkgLyByZXNvbHV0aW9uICkgKTtcbiAgZm9yICggZmxvYXQgaSBceDNkIC0xLjA7IGkgXHgzYyAxLjAgOyBpICtceDNkIFNBTVBMRV9SQVRFKSB7XG4gICAgI2lmZGVmIEhPUklaT05BTF9QQVNTXG4gICAgICB2ZWMyIGRpc3RyaWJ1dGlvbiBceDNkIGRlY29kZUhhbGZSR0JBICggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCBpLCAwLjAgKSAqIHJhZGl1cyApIC8gcmVzb2x1dGlvbiApICk7XG4gICAgICBtZWFuICtceDNkIGRpc3RyaWJ1dGlvbi54O1xuICAgICAgc3F1YXJlZF9tZWFuICtceDNkIGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKyBkaXN0cmlidXRpb24ueCAqIGRpc3RyaWJ1dGlvbi54O1xuICAgICNlbHNlXG4gICAgICBmbG9hdCBkZXB0aCBceDNkIHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIHNoYWRvd19wYXNzLCAoIGdsX0ZyYWdDb29yZC54eSArIHZlYzIoIDAuMCwgIGkgKSAgKiByYWRpdXMgKSAvIHJlc29sdXRpb24gKSApO1xuICAgICAgbWVhbiArXHgzZCBkZXB0aDtcbiAgICAgIHNxdWFyZWRfbWVhbiArXHgzZCBkZXB0aCAqIGRlcHRoO1xuICAgICNlbmRpZlxuICB9XG4gIG1lYW4gXHgzZCBtZWFuICogSEFMRl9TQU1QTEVfUkFURTtcbiAgc3F1YXJlZF9tZWFuIFx4M2Qgc3F1YXJlZF9tZWFuICogSEFMRl9TQU1QTEVfUkFURTtcbiAgZmxvYXQgc3RkX2RldiBceDNkIHBvdyggc3F1YXJlZF9tZWFuIC0gbWVhbiAqIG1lYW4sIDAuNSApO1xuICBnbF9GcmFnQ29sb3IgXHgzZCBlbmNvZGVIYWxmUkdCQSggdmVjMiggbWVhbiwgc3RkX2RldiApICk7XG59In0pLAppYT1YLmNsb25lKCk7aWEuZGVmaW5lcy5IT1JJWk9OQUxfUEFTUz0xO3ZhciBoYT1uZXcgeGE7aGEuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFIobmV3IEZsb2F0MzJBcnJheShbLTEsLTEsLjUsMywtMSwuNSwtMSwzLC41XSksMykpO3ZhciBzYT1uZXcgeWEoaGEsWCk7Zm9yKGhhPTA7NCE9PWhhOysraGEpe3ZhciBxYT0wIT09KGhhJjEpLHJhPTAhPT0oaGEmMiksd2E9bmV3IG1lKHtkZXB0aFBhY2tpbmc6MzIwMSxtb3JwaFRhcmdldHM6cWEsc2tpbm5pbmc6cmF9KTtRW2hhXT13YTtxYT1uZXcgbmUoe21vcnBoVGFyZ2V0czpxYSxza2lubmluZzpyYX0pO1NbaGFdPXFhfXZhciBwYT10aGlzO3RoaXMuZW5hYmxlZD0hMTt0aGlzLmF1dG9VcGRhdGU9ITA7dGhpcy5uZWVkc1VwZGF0ZT0hMTt0aGlzLnR5cGU9MTt0aGlzLnJlbmRlcj1mdW5jdGlvbih2YSxDYSxWYSl7aWYoITEhPT1wYS5lbmFibGVkJiYoITEhPT1wYS5hdXRvVXBkYXRlfHwhMSE9PXBhLm5lZWRzVXBkYXRlKSYmCjAhPT12YS5sZW5ndGgpe3ZhciBXYT1iLmdldFJlbmRlclRhcmdldCgpLERhPWIuZ2V0QWN0aXZlQ3ViZUZhY2UoKSxJYT1iLmdldEFjdGl2ZU1pcG1hcExldmVsKCksRWE9Yi5zdGF0ZTtFYS5zZXRCbGVuZGluZygwKTtFYS5idWZmZXJzLmNvbG9yLnNldENsZWFyKDEsMSwxLDEpO0VhLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCghMCk7RWEuc2V0U2Npc3NvclRlc3QoITEpO2Zvcih2YXIgT2E9MCxoYj12YS5sZW5ndGg7T2E8aGI7T2ErKyl7dmFyIHliPXZhW09hXSxMYT15Yi5zaGFkb3c7aWYodm9pZCAwPT09TGEpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFNoYWRvd01hcDoiLHliLCJoYXMgbm8gc2hhZG93LiIpO2Vsc2V7RS5jb3B5KExhLm1hcFNpemUpO3ZhciBlYj1MYS5nZXRGcmFtZUV4dGVudHMoKTtFLm11bHRpcGx5KGViKTtHLmNvcHkoTGEubWFwU2l6ZSk7aWYoRS54Pmh8fEUueT5oKWNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xTaGFkb3dNYXA6Iix5YiwiaGFzIHNoYWRvdyBleGNlZWRpbmcgbWF4IHRleHR1cmUgc2l6ZSwgcmVkdWNpbmciKSwKRS54PmgmJihHLng9TWF0aC5mbG9vcihoL2ViLngpLEUueD1HLngqZWIueCxMYS5tYXBTaXplLng9Ry54KSxFLnk+aCYmKEcueT1NYXRoLmZsb29yKGgvZWIueSksRS55PUcueSplYi55LExhLm1hcFNpemUueT1HLnkpO251bGwhPT1MYS5tYXB8fExhLmlzUG9pbnRMaWdodFNoYWRvd3x8MyE9PXRoaXMudHlwZXx8KGViPXttaW5GaWx0ZXI6MTAwNixtYWdGaWx0ZXI6MTAwNixmb3JtYXQ6MTAyM30sTGEubWFwPW5ldyBwKEUueCxFLnksZWIpLExhLm1hcC50ZXh0dXJlLm5hbWU9eWIubmFtZSsiLnNoYWRvd01hcCIsTGEubWFwUGFzcz1uZXcgcChFLngsRS55LGViKSxMYS5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpKTtudWxsPT09TGEubWFwJiYoZWI9e21pbkZpbHRlcjoxMDAzLG1hZ0ZpbHRlcjoxMDAzLGZvcm1hdDoxMDIzfSxMYS5tYXA9bmV3IHAoRS54LEUueSxlYiksTGEubWFwLnRleHR1cmUubmFtZT15Yi5uYW1lKyIuc2hhZG93TWFwIixMYS5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpKTsKYi5zZXRSZW5kZXJUYXJnZXQoTGEubWFwKTtiLmNsZWFyKCk7ZWI9TGEuZ2V0Vmlld3BvcnRDb3VudCgpO2Zvcih2YXIgbmI9MDtuYjxlYjtuYisrKXt2YXIgTmI9TGEuZ2V0Vmlld3BvcnQobmIpO0ouc2V0KEcueCpOYi54LEcueSpOYi55LEcueCpOYi56LEcueSpOYi53KTtFYS52aWV3cG9ydChKKTtMYS51cGRhdGVNYXRyaWNlcyh5YixWYSxuYik7QT1MYS5nZXRGcnVzdHVtKCk7dyhDYSxWYSxMYS5jYW1lcmEseWIsdGhpcy50eXBlKX1MYS5pc1BvaW50TGlnaHRTaGFkb3d8fDMhPT10aGlzLnR5cGV8fG0oTGEsVmEpfX1wYS5uZWVkc1VwZGF0ZT0hMTtiLnNldFJlbmRlclRhcmdldChXYSxEYSxJYSl9fX1mdW5jdGlvbiBScihiLGUsaCxtKXtmdW5jdGlvbiB1KGthLEhhLE5hKXt2YXIgcmI9bmV3IFVpbnQ4QXJyYXkoNCksWGE9Yi5jcmVhdGVUZXh0dXJlKCk7Yi5iaW5kVGV4dHVyZShrYSxYYSk7Yi50ZXhQYXJhbWV0ZXJpKGthLDEwMjQxLDk3MjgpO2IudGV4UGFyYW1ldGVyaShrYSwKMTAyNDAsOTcyOCk7Zm9yKGthPTA7a2E8TmE7a2ErKyliLnRleEltYWdlMkQoSGEra2EsMCw2NDA4LDEsMSwwLDY0MDgsNTEyMSxyYik7cmV0dXJuIFhhfWZ1bmN0aW9uIHcoa2EsSGEpe3NhW2thXT0xOzA9PT1xYVtrYV0mJihiLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGthKSxxYVtrYV09MSk7cmFba2FdIT09SGEmJigobS5pc1dlYkdMMj9iOmUuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpW20uaXNXZWJHTDI/InZlcnRleEF0dHJpYkRpdmlzb3IiOiJ2ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUiXShrYSxIYSkscmFba2FdPUhhKX1mdW5jdGlvbiBBKGthKXshMCE9PXdhW2thXSYmKGIuZW5hYmxlKGthKSx3YVtrYV09ITApfWZ1bmN0aW9uIEUoa2EpeyExIT09d2Fba2FdJiYoYi5kaXNhYmxlKGthKSx3YVtrYV09ITEpfWZ1bmN0aW9uIEcoa2EsSGEsTmEscmIsWGEsbWIsb2IsU2Epe2lmKDA9PT1rYSlDYSYmKEUoMzA0MiksQ2E9ITEpO2Vsc2UgaWYoQ2F8fChBKDMwNDIpLApDYT0hMCksNSE9PWthKXtpZihrYSE9PVZhfHxTYSE9PXliKXtpZigxMDAhPT1XYXx8MTAwIT09RWEpYi5ibGVuZEVxdWF0aW9uKDMyNzc0KSxFYT1XYT0xMDA7aWYoU2Epc3dpdGNoKGthKXtjYXNlIDE6Yi5ibGVuZEZ1bmNTZXBhcmF0ZSgxLDc3MSwxLDc3MSk7YnJlYWs7Y2FzZSAyOmIuYmxlbmRGdW5jKDEsMSk7YnJlYWs7Y2FzZSAzOmIuYmxlbmRGdW5jU2VwYXJhdGUoMCwwLDc2OSw3NzEpO2JyZWFrO2Nhc2UgNDpiLmJsZW5kRnVuY1NlcGFyYXRlKDAsNzY4LDAsNzcwKTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICIsa2EpfWVsc2Ugc3dpdGNoKGthKXtjYXNlIDE6Yi5ibGVuZEZ1bmNTZXBhcmF0ZSg3NzAsNzcxLDEsNzcxKTticmVhaztjYXNlIDI6Yi5ibGVuZEZ1bmMoNzcwLDEpO2JyZWFrO2Nhc2UgMzpiLmJsZW5kRnVuYygwLDc2OSk7YnJlYWs7Y2FzZSA0OmIuYmxlbmRGdW5jKDAsNzY4KTticmVhazsKZGVmYXVsdDpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAiLGthKX1oYj1PYT1JYT1EYT1udWxsO1ZhPWthO3liPVNhfX1lbHNle1hhPVhhfHxIYTttYj1tYnx8TmE7b2I9b2J8fHJiO2lmKEhhIT09V2F8fFhhIT09RWEpYi5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoaC5jb252ZXJ0KEhhKSxoLmNvbnZlcnQoWGEpKSxXYT1IYSxFYT1YYTtpZihOYSE9PURhfHxyYiE9PUlhfHxtYiE9PU9hfHxvYiE9PWhiKWIuYmxlbmRGdW5jU2VwYXJhdGUoaC5jb252ZXJ0KE5hKSxoLmNvbnZlcnQocmIpLGguY29udmVydChtYiksaC5jb252ZXJ0KG9iKSksRGE9TmEsSWE9cmIsT2E9bWIsaGI9b2I7VmE9a2E7eWI9bnVsbH19ZnVuY3Rpb24gSihrYSl7TGEhPT1rYSYmKGthP2IuZnJvbnRGYWNlKDIzMDQpOmIuZnJvbnRGYWNlKDIzMDUpLExhPWthKX1mdW5jdGlvbiBRKGthKXswIT09a2E/KEEoMjg4NCksa2EhPT1lYiYmKDE9PT1rYT9iLmN1bGxGYWNlKDEwMjkpOgoyPT09a2E/Yi5jdWxsRmFjZSgxMDI4KTpiLmN1bGxGYWNlKDEwMzIpKSk6RSgyODg0KTtlYj1rYX1mdW5jdGlvbiBTKGthLEhhLE5hKXtpZihrYSl7aWYoQSgzMjgyMyksTmIhPT1IYXx8RGIhPT1OYSliLnBvbHlnb25PZmZzZXQoSGEsTmEpLE5iPUhhLERiPU5hfWVsc2UgRSgzMjgyMyl9ZnVuY3Rpb24gVChrYSl7dm9pZCAwPT09a2EmJihrYT0zMzk4NCtqYS0xKTtBYSE9PWthJiYoYi5hY3RpdmVUZXh0dXJlKGthKSxBYT1rYSl9dmFyIFc9bmV3IGZ1bmN0aW9uKCl7dmFyIGthPSExLEhhPW5ldyBuLE5hPW51bGwscmI9bmV3IG4oMCwwLDAsMCk7cmV0dXJue3NldE1hc2s6ZnVuY3Rpb24oWGEpe05hPT09WGF8fGthfHwoYi5jb2xvck1hc2soWGEsWGEsWGEsWGEpLE5hPVhhKX0sc2V0TG9ja2VkOmZ1bmN0aW9uKFhhKXtrYT1YYX0sc2V0Q2xlYXI6ZnVuY3Rpb24oWGEsbWIsb2IsU2EsamIpeyEwPT09amImJihYYSo9U2EsbWIqPVNhLG9iKj1TYSk7SGEuc2V0KFhhLG1iLG9iLFNhKTsKITE9PT1yYi5lcXVhbHMoSGEpJiYoYi5jbGVhckNvbG9yKFhhLG1iLG9iLFNhKSxyYi5jb3B5KEhhKSl9LHJlc2V0OmZ1bmN0aW9uKCl7a2E9ITE7TmE9bnVsbDtyYi5zZXQoLTEsMCwwLDApfX19LFg9bmV3IGZ1bmN0aW9uKCl7dmFyIGthPSExLEhhPW51bGwsTmE9bnVsbCxyYj1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKFhhKXtYYT9BKDI5MjkpOkUoMjkyOSl9LHNldE1hc2s6ZnVuY3Rpb24oWGEpe0hhPT09WGF8fGthfHwoYi5kZXB0aE1hc2soWGEpLEhhPVhhKX0sc2V0RnVuYzpmdW5jdGlvbihYYSl7aWYoTmEhPT1YYSl7aWYoWGEpc3dpdGNoKFhhKXtjYXNlIDA6Yi5kZXB0aEZ1bmMoNTEyKTticmVhaztjYXNlIDE6Yi5kZXB0aEZ1bmMoNTE5KTticmVhaztjYXNlIDI6Yi5kZXB0aEZ1bmMoNTEzKTticmVhaztjYXNlIDM6Yi5kZXB0aEZ1bmMoNTE1KTticmVhaztjYXNlIDQ6Yi5kZXB0aEZ1bmMoNTE0KTticmVhaztjYXNlIDU6Yi5kZXB0aEZ1bmMoNTE4KTticmVhaztjYXNlIDY6Yi5kZXB0aEZ1bmMoNTE2KTsKYnJlYWs7Y2FzZSA3OmIuZGVwdGhGdW5jKDUxNyk7YnJlYWs7ZGVmYXVsdDpiLmRlcHRoRnVuYyg1MTUpfWVsc2UgYi5kZXB0aEZ1bmMoNTE1KTtOYT1YYX19LHNldExvY2tlZDpmdW5jdGlvbihYYSl7a2E9WGF9LHNldENsZWFyOmZ1bmN0aW9uKFhhKXtyYiE9PVhhJiYoYi5jbGVhckRlcHRoKFhhKSxyYj1YYSl9LHJlc2V0OmZ1bmN0aW9uKCl7a2E9ITE7cmI9TmE9SGE9bnVsbH19fSxpYT1uZXcgZnVuY3Rpb24oKXt2YXIga2E9ITEsSGE9bnVsbCxOYT1udWxsLHJiPW51bGwsWGE9bnVsbCxtYj1udWxsLG9iPW51bGwsU2E9bnVsbCxqYj1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKHFiKXtrYXx8KHFiP0EoMjk2MCk6RSgyOTYwKSl9LHNldE1hc2s6ZnVuY3Rpb24ocWIpe0hhPT09cWJ8fGthfHwoYi5zdGVuY2lsTWFzayhxYiksSGE9cWIpfSxzZXRGdW5jOmZ1bmN0aW9uKHFiLHRiLHhiKXtpZihOYSE9PXFifHxyYiE9PXRifHxYYSE9PXhiKWIuc3RlbmNpbEZ1bmMocWIsdGIsCnhiKSxOYT1xYixyYj10YixYYT14Yn0sc2V0T3A6ZnVuY3Rpb24ocWIsdGIseGIpe2lmKG1iIT09cWJ8fG9iIT09dGJ8fFNhIT09eGIpYi5zdGVuY2lsT3AocWIsdGIseGIpLG1iPXFiLG9iPXRiLFNhPXhifSxzZXRMb2NrZWQ6ZnVuY3Rpb24ocWIpe2thPXFifSxzZXRDbGVhcjpmdW5jdGlvbihxYil7amIhPT1xYiYmKGIuY2xlYXJTdGVuY2lsKHFiKSxqYj1xYil9LHJlc2V0OmZ1bmN0aW9uKCl7a2E9ITE7amI9U2E9b2I9bWI9WGE9cmI9TmE9SGE9bnVsbH19fSxoYT1iLmdldFBhcmFtZXRlcigzNDkyMSksc2E9bmV3IFVpbnQ4QXJyYXkoaGEpLHFhPW5ldyBVaW50OEFycmF5KGhhKSxyYT1uZXcgVWludDhBcnJheShoYSksd2E9e30scGE9bnVsbCx2YT1udWxsLENhPW51bGwsVmE9bnVsbCxXYT1udWxsLERhPW51bGwsSWE9bnVsbCxFYT1udWxsLE9hPW51bGwsaGI9bnVsbCx5Yj0hMSxMYT1udWxsLGViPW51bGwsbmI9bnVsbCxOYj1udWxsLERiPW51bGwsamE9Yi5nZXRQYXJhbWV0ZXIoMzU2NjEpLApvYT0hMTtoYT0wO2hhPWIuZ2V0UGFyYW1ldGVyKDc5MzgpOy0xIT09aGEuaW5kZXhPZigiV2ViR0wiKT8oaGE9cGFyc2VGbG9hdCgvXldlYkdMIChbMC05XSkvLmV4ZWMoaGEpWzFdKSxvYT0xPD1oYSk6LTEhPT1oYS5pbmRleE9mKCJPcGVuR0wgRVMiKSYmKGhhPXBhcnNlRmxvYXQoL15PcGVuR0wgRVMgKFswLTldKS8uZXhlYyhoYSlbMV0pLG9hPTI8PWhhKTt2YXIgQWE9bnVsbCxLYT17fSwkYT1uZXcgbixQYT1uZXcgbixmYj17fTtmYlszNTUzXT11KDM1NTMsMzU1MywxKTtmYlszNDA2N109dSgzNDA2NywzNDA2OSw2KTtXLnNldENsZWFyKDAsMCwwLDEpO1guc2V0Q2xlYXIoMSk7aWEuc2V0Q2xlYXIoMCk7QSgyOTI5KTtYLnNldEZ1bmMoMyk7SighMSk7USgxKTtBKDI4ODQpO0coMCk7cmV0dXJue2J1ZmZlcnM6e2NvbG9yOlcsZGVwdGg6WCxzdGVuY2lsOmlhfSxpbml0QXR0cmlidXRlczpmdW5jdGlvbigpe2Zvcih2YXIga2E9MCxIYT1zYS5sZW5ndGg7a2E8SGE7a2ErKylzYVtrYV09CjB9LGVuYWJsZUF0dHJpYnV0ZTpmdW5jdGlvbihrYSl7dyhrYSwwKX0sZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvcjp3LGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzOmZ1bmN0aW9uKCl7Zm9yKHZhciBrYT0wLEhhPXFhLmxlbmd0aDtrYSE9PUhhOysra2EpcWFba2FdIT09c2Fba2FdJiYoYi5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoa2EpLHFhW2thXT0wKX0sZW5hYmxlOkEsZGlzYWJsZTpFLGdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0czpmdW5jdGlvbigpe2lmKG51bGw9PT1wYSYmKHBhPVtdLGUuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKXx8ZS5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fGUuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMSIpfHxlLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiKSkpZm9yKHZhciBrYT1iLmdldFBhcmFtZXRlcigzNDQ2NyksSGE9MDtIYTxrYS5sZW5ndGg7SGErKylwYS5wdXNoKGthW0hhXSk7CnJldHVybiBwYX0sdXNlUHJvZ3JhbTpmdW5jdGlvbihrYSl7cmV0dXJuIHZhIT09a2E/KGIudXNlUHJvZ3JhbShrYSksdmE9a2EsITApOiExfSxzZXRCbGVuZGluZzpHLHNldE1hdGVyaWFsOmZ1bmN0aW9uKGthLEhhKXsyPT09a2Euc2lkZT9FKDI4ODQpOkEoMjg4NCk7dmFyIE5hPTE9PT1rYS5zaWRlO0hhJiYoTmE9IU5hKTtKKE5hKTsxPT09a2EuYmxlbmRpbmcmJiExPT09a2EudHJhbnNwYXJlbnQ/RygwKTpHKGthLmJsZW5kaW5nLGthLmJsZW5kRXF1YXRpb24sa2EuYmxlbmRTcmMsa2EuYmxlbmREc3Qsa2EuYmxlbmRFcXVhdGlvbkFscGhhLGthLmJsZW5kU3JjQWxwaGEsa2EuYmxlbmREc3RBbHBoYSxrYS5wcmVtdWx0aXBsaWVkQWxwaGEpO1guc2V0RnVuYyhrYS5kZXB0aEZ1bmMpO1guc2V0VGVzdChrYS5kZXB0aFRlc3QpO1guc2V0TWFzayhrYS5kZXB0aFdyaXRlKTtXLnNldE1hc2soa2EuY29sb3JXcml0ZSk7SGE9a2Euc3RlbmNpbFdyaXRlO2lhLnNldFRlc3QoSGEpO0hhJiYKKGlhLnNldEZ1bmMoa2Euc3RlbmNpbEZ1bmMsa2Euc3RlbmNpbFJlZixrYS5zdGVuY2lsTWFzayksaWEuc2V0T3Aoa2Euc3RlbmNpbEZhaWwsa2Euc3RlbmNpbFpGYWlsLGthLnN0ZW5jaWxaUGFzcykpO1Moa2EucG9seWdvbk9mZnNldCxrYS5wb2x5Z29uT2Zmc2V0RmFjdG9yLGthLnBvbHlnb25PZmZzZXRVbml0cyl9LHNldEZsaXBTaWRlZDpKLHNldEN1bGxGYWNlOlEsc2V0TGluZVdpZHRoOmZ1bmN0aW9uKGthKXtrYSE9PW5iJiYob2EmJmIubGluZVdpZHRoKGthKSxuYj1rYSl9LHNldFBvbHlnb25PZmZzZXQ6UyxzZXRTY2lzc29yVGVzdDpmdW5jdGlvbihrYSl7a2E/QSgzMDg5KTpFKDMwODkpfSxhY3RpdmVUZXh0dXJlOlQsYmluZFRleHR1cmU6ZnVuY3Rpb24oa2EsSGEpe251bGw9PT1BYSYmVCgpO3ZhciBOYT1LYVtBYV07dm9pZCAwPT09TmEmJihOYT17dHlwZTp2b2lkIDAsdGV4dHVyZTp2b2lkIDB9LEthW0FhXT1OYSk7aWYoTmEudHlwZSE9PWthfHxOYS50ZXh0dXJlIT09CkhhKWIuYmluZFRleHR1cmUoa2EsSGF8fGZiW2thXSksTmEudHlwZT1rYSxOYS50ZXh0dXJlPUhhfSxjb21wcmVzc2VkVGV4SW1hZ2UyRDpmdW5jdGlvbigpe3RyeXtiLmNvbXByZXNzZWRUZXhJbWFnZTJELmFwcGx5KGIsYXJndW1lbnRzKX1jYXRjaChrYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGthKX19LHRleEltYWdlMkQ6ZnVuY3Rpb24oKXt0cnl7Yi50ZXhJbWFnZTJELmFwcGx5KGIsYXJndW1lbnRzKX1jYXRjaChrYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGthKX19LHRleEltYWdlM0Q6ZnVuY3Rpb24oKXt0cnl7Yi50ZXhJbWFnZTNELmFwcGx5KGIsYXJndW1lbnRzKX1jYXRjaChrYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGthKX19LHNjaXNzb3I6ZnVuY3Rpb24oa2EpeyExPT09JGEuZXF1YWxzKGthKSYmKGIuc2Npc3NvcihrYS54LGthLnksa2EueixrYS53KSwkYS5jb3B5KGthKSl9LHZpZXdwb3J0OmZ1bmN0aW9uKGthKXshMT09PQpQYS5lcXVhbHMoa2EpJiYoYi52aWV3cG9ydChrYS54LGthLnksa2EueixrYS53KSxQYS5jb3B5KGthKSl9LHJlc2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBrYT0wO2thPHFhLmxlbmd0aDtrYSsrKTE9PT1xYVtrYV0mJihiLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShrYSkscWFba2FdPTApO3dhPXt9O0FhPXBhPW51bGw7S2E9e307ZWI9TGE9VmE9dmE9bnVsbDtXLnJlc2V0KCk7WC5yZXNldCgpO2lhLnJlc2V0KCl9fX1mdW5jdGlvbiBTcihiLGUsaCxtLHUsdyxBKXtmdW5jdGlvbiBFKGphLG9hKXtyZXR1cm4gZWI/bmV3IE9mZnNjcmVlbkNhbnZhcyhqYSxvYSk6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiY2FudmFzIil9ZnVuY3Rpb24gRyhqYSxvYSxBYSxLYSl7dmFyICRhPTE7aWYoamEud2lkdGg+S2F8fGphLmhlaWdodD5LYSkkYT1LYS9NYXRoLm1heChqYS53aWR0aCxqYS5oZWlnaHQpO2lmKDE+JGF8fCEwPT09b2Epe2lmKCJ1bmRlZmluZWQiIT09CnR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50JiZqYSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fCJ1bmRlZmluZWQiIT09dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50JiZqYSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHwidW5kZWZpbmVkIiE9PXR5cGVvZiBJbWFnZUJpdG1hcCYmamEgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcClyZXR1cm4gS2E9b2E/bGIuZmxvb3JQb3dlck9mVHdvOk1hdGguZmxvb3Isb2E9S2EoJGEqamEud2lkdGgpLCRhPUthKCRhKmphLmhlaWdodCksdm9pZCAwPT09TGEmJihMYT1FKG9hLCRhKSksQWE9QWE/RShvYSwkYSk6TGEsQWEud2lkdGg9b2EsQWEuaGVpZ2h0PSRhLEFhLmdldENvbnRleHQoIjJkIikuZHJhd0ltYWdlKGphLDAsMCxvYSwkYSksY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGhhcyBiZWVuIHJlc2l6ZWQgZnJvbSAoIitqYS53aWR0aCsieCIramEuaGVpZ2h0KyIpIHRvICgiK29hKyJ4IiskYSsiKS4iKSwKQWE7ImRhdGEiaW4gamEmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogSW1hZ2UgaW4gRGF0YVRleHR1cmUgaXMgdG9vIGJpZyAoIitqYS53aWR0aCsieCIramEuaGVpZ2h0KyIpLiIpfXJldHVybiBqYX1mdW5jdGlvbiBKKGphKXtyZXR1cm4gbGIuaXNQb3dlck9mVHdvKGphLndpZHRoKSYmbGIuaXNQb3dlck9mVHdvKGphLmhlaWdodCl9ZnVuY3Rpb24gUShqYSl7cmV0dXJuIHUuaXNXZWJHTDI/ITE6MTAwMSE9PWphLndyYXBTfHwxMDAxIT09amEud3JhcFR8fDEwMDMhPT1qYS5taW5GaWx0ZXImJjEwMDYhPT1qYS5taW5GaWx0ZXJ9ZnVuY3Rpb24gUyhqYSxvYSl7cmV0dXJuIGphLmdlbmVyYXRlTWlwbWFwcyYmb2EmJjEwMDMhPT1qYS5taW5GaWx0ZXImJjEwMDYhPT1qYS5taW5GaWx0ZXJ9ZnVuY3Rpb24gVChqYSxvYSxBYSxLYSl7Yi5nZW5lcmF0ZU1pcG1hcChqYSk7bS5nZXQob2EpLl9fbWF4TWlwTGV2ZWw9TWF0aC5sb2coTWF0aC5tYXgoQWEsS2EpKSpNYXRoLkxPRzJFfQpmdW5jdGlvbiBXKGphLG9hKXtpZighdS5pc1dlYkdMMilyZXR1cm4gamE7dmFyIEFhPWphOzY0MDM9PT1qYSYmKDUxMjY9PT1vYSYmKEFhPTMzMzI2KSw1MTMxPT09b2EmJihBYT0zMzMyNSksNTEyMT09PW9hJiYoQWE9MzMzMjEpKTs2NDA3PT09amEmJig1MTI2PT09b2EmJihBYT0zNDgzNyksNTEzMT09PW9hJiYoQWE9MzQ4NDMpLDUxMjE9PT1vYSYmKEFhPTMyODQ5KSk7NjQwOD09PWphJiYoNTEyNj09PW9hJiYoQWE9MzQ4MzYpLDUxMzE9PT1vYSYmKEFhPTM0ODQyKSw1MTIxPT09b2EmJihBYT0zMjg1NikpOzMzMzI1PT09QWF8fDMzMzI2PT09QWF8fDM0ODQyPT09QWF8fDM0ODM2PT09QWE/ZS5nZXQoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKTooMzQ4NDM9PT1BYXx8MzQ4Mzc9PT1BYSkmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogRmxvYXRpbmcgcG9pbnQgdGV4dHVyZXMgd2l0aCBSR0IgZm9ybWF0IG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSB1c2UgUkdCQSBpbnN0ZWFkLiIpOwpyZXR1cm4gQWF9ZnVuY3Rpb24gWChqYSl7cmV0dXJuIDEwMDM9PT1qYXx8MTAwND09PWphfHwxMDA1PT09amE/OTcyODo5NzI5fWZ1bmN0aW9uIGlhKGphKXtqYT1qYS50YXJnZXQ7amEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsaWEpO3NhKGphKTtqYS5pc1ZpZGVvVGV4dHVyZSYmeWIuZGVsZXRlKGphKTtBLm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIGhhKGphKXtqYT1qYS50YXJnZXQ7amEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsaGEpO3FhKGphKTtBLm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIHNhKGphKXt2YXIgb2E9bS5nZXQoamEpO3ZvaWQgMCE9PW9hLl9fd2ViZ2xJbml0JiYoYi5kZWxldGVUZXh0dXJlKG9hLl9fd2ViZ2xUZXh0dXJlKSxtLnJlbW92ZShqYSkpfWZ1bmN0aW9uIHFhKGphKXt2YXIgb2E9bS5nZXQoamEpLEFhPW0uZ2V0KGphLnRleHR1cmUpO2lmKGphKXt2b2lkIDAhPT1BYS5fX3dlYmdsVGV4dHVyZSYmYi5kZWxldGVUZXh0dXJlKEFhLl9fd2ViZ2xUZXh0dXJlKTsKamEuZGVwdGhUZXh0dXJlJiZqYS5kZXB0aFRleHR1cmUuZGlzcG9zZSgpO2lmKGphLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKWZvcihBYT0wOzY+QWE7QWErKyliLmRlbGV0ZUZyYW1lYnVmZmVyKG9hLl9fd2ViZ2xGcmFtZWJ1ZmZlcltBYV0pLG9hLl9fd2ViZ2xEZXB0aGJ1ZmZlciYmYi5kZWxldGVSZW5kZXJidWZmZXIob2EuX193ZWJnbERlcHRoYnVmZmVyW0FhXSk7ZWxzZSBiLmRlbGV0ZUZyYW1lYnVmZmVyKG9hLl9fd2ViZ2xGcmFtZWJ1ZmZlciksb2EuX193ZWJnbERlcHRoYnVmZmVyJiZiLmRlbGV0ZVJlbmRlcmJ1ZmZlcihvYS5fX3dlYmdsRGVwdGhidWZmZXIpO20ucmVtb3ZlKGphLnRleHR1cmUpO20ucmVtb3ZlKGphKX19ZnVuY3Rpb24gcmEoamEsb2Epe3ZhciBBYT1tLmdldChqYSk7amEuaXNWaWRlb1RleHR1cmUmJmhiKGphKTtpZigwPGphLnZlcnNpb24mJkFhLl9fdmVyc2lvbiE9PWphLnZlcnNpb24pe3ZhciBLYT1qYS5pbWFnZTtpZih2b2lkIDA9PT1LYSljb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIHVuZGVmaW5lZCIpOwplbHNlIGlmKCExPT09S2EuY29tcGxldGUpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyBpbmNvbXBsZXRlIik7ZWxzZXtWYShBYSxqYSxvYSk7cmV0dXJufX1oLmFjdGl2ZVRleHR1cmUoMzM5ODQrb2EpO2guYmluZFRleHR1cmUoMzU1MyxBYS5fX3dlYmdsVGV4dHVyZSl9ZnVuY3Rpb24gd2EoamEsb2Epe2lmKDY9PT1qYS5pbWFnZS5sZW5ndGgpe3ZhciBBYT1tLmdldChqYSk7aWYoMDxqYS52ZXJzaW9uJiZBYS5fX3ZlcnNpb24hPT1qYS52ZXJzaW9uKXtDYShBYSxqYSk7aC5hY3RpdmVUZXh0dXJlKDMzOTg0K29hKTtoLmJpbmRUZXh0dXJlKDM0MDY3LEFhLl9fd2ViZ2xUZXh0dXJlKTtiLnBpeGVsU3RvcmVpKDM3NDQwLGphLmZsaXBZKTt2YXIgS2E9amEmJmphLmlzQ29tcHJlc3NlZFRleHR1cmU7b2E9amEuaW1hZ2VbMF0mJmphLmltYWdlWzBdLmlzRGF0YVRleHR1cmU7Zm9yKHZhciAkYT1bXSwKUGE9MDs2PlBhO1BhKyspJGFbUGFdPUthfHxvYT9vYT9qYS5pbWFnZVtQYV0uaW1hZ2U6amEuaW1hZ2VbUGFdOkcoamEuaW1hZ2VbUGFdLCExLCEwLHUubWF4Q3ViZW1hcFNpemUpO3ZhciBmYj0kYVswXSxrYT1KKGZiKXx8dS5pc1dlYkdMMixIYT13LmNvbnZlcnQoamEuZm9ybWF0KSxOYT13LmNvbnZlcnQoamEudHlwZSkscmI9VyhIYSxOYSk7dmEoMzQwNjcsamEsa2EpO2lmKEthKXtmb3IoUGE9MDs2PlBhO1BhKyspe3ZhciBYYT0kYVtQYV0ubWlwbWFwcztmb3IoS2E9MDtLYTxYYS5sZW5ndGg7S2ErKyl7dmFyIG1iPVhhW0thXTsxMDIzIT09amEuZm9ybWF0JiYxMDIyIT09amEuZm9ybWF0Py0xPGguZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZihIYSk/aC5jb21wcmVzc2VkVGV4SW1hZ2UyRCgzNDA2OStQYSxLYSxyYixtYi53aWR0aCxtYi5oZWlnaHQsMCxtYi5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC5zZXRUZXh0dXJlQ3ViZSgpIik6CmgudGV4SW1hZ2UyRCgzNDA2OStQYSxLYSxyYixtYi53aWR0aCxtYi5oZWlnaHQsMCxIYSxOYSxtYi5kYXRhKX19QWEuX19tYXhNaXBMZXZlbD1YYS5sZW5ndGgtMX1lbHNle1hhPWphLm1pcG1hcHM7Zm9yKFBhPTA7Nj5QYTtQYSsrKWlmKG9hKWZvcihoLnRleEltYWdlMkQoMzQwNjkrUGEsMCxyYiwkYVtQYV0ud2lkdGgsJGFbUGFdLmhlaWdodCwwLEhhLE5hLCRhW1BhXS5kYXRhKSxLYT0wO0thPFhhLmxlbmd0aDtLYSsrKW1iPVhhW0thXSxtYj1tYi5pbWFnZVtQYV0uaW1hZ2UsaC50ZXhJbWFnZTJEKDM0MDY5K1BhLEthKzEscmIsbWIud2lkdGgsbWIuaGVpZ2h0LDAsSGEsTmEsbWIuZGF0YSk7ZWxzZSBmb3IoaC50ZXhJbWFnZTJEKDM0MDY5K1BhLDAscmIsSGEsTmEsJGFbUGFdKSxLYT0wO0thPFhhLmxlbmd0aDtLYSsrKW1iPVhhW0thXSxoLnRleEltYWdlMkQoMzQwNjkrUGEsS2ErMSxyYixIYSxOYSxtYi5pbWFnZVtQYV0pO0FhLl9fbWF4TWlwTGV2ZWw9WGEubGVuZ3RofVMoamEsCmthKSYmVCgzNDA2NyxqYSxmYi53aWR0aCxmYi5oZWlnaHQpO0FhLl9fdmVyc2lvbj1qYS52ZXJzaW9uO2lmKGphLm9uVXBkYXRlKWphLm9uVXBkYXRlKGphKX1lbHNlIGguYWN0aXZlVGV4dHVyZSgzMzk4NCtvYSksaC5iaW5kVGV4dHVyZSgzNDA2NyxBYS5fX3dlYmdsVGV4dHVyZSl9fWZ1bmN0aW9uIHBhKGphLG9hKXtoLmFjdGl2ZVRleHR1cmUoMzM5ODQrb2EpO2guYmluZFRleHR1cmUoMzQwNjcsbS5nZXQoamEpLl9fd2ViZ2xUZXh0dXJlKX1mdW5jdGlvbiB2YShqYSxvYSxBYSl7QWE/KGIudGV4UGFyYW1ldGVyaShqYSwxMDI0Mix3LmNvbnZlcnQob2Eud3JhcFMpKSxiLnRleFBhcmFtZXRlcmkoamEsMTAyNDMsdy5jb252ZXJ0KG9hLndyYXBUKSksMzI4NzkhPT1qYSYmMzU4NjYhPT1qYXx8Yi50ZXhQYXJhbWV0ZXJpKGphLDMyODgyLHcuY29udmVydChvYS53cmFwUikpLGIudGV4UGFyYW1ldGVyaShqYSwxMDI0MCx3LmNvbnZlcnQob2EubWFnRmlsdGVyKSksYi50ZXhQYXJhbWV0ZXJpKGphLAoxMDI0MSx3LmNvbnZlcnQob2EubWluRmlsdGVyKSkpOihiLnRleFBhcmFtZXRlcmkoamEsMTAyNDIsMzMwNzEpLGIudGV4UGFyYW1ldGVyaShqYSwxMDI0MywzMzA3MSksMzI4NzkhPT1qYSYmMzU4NjYhPT1qYXx8Yi50ZXhQYXJhbWV0ZXJpKGphLDMyODgyLDMzMDcxKSwxMDAxPT09b2Eud3JhcFMmJjEwMDE9PT1vYS53cmFwVHx8Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLiIpLGIudGV4UGFyYW1ldGVyaShqYSwxMDI0MCxYKG9hLm1hZ0ZpbHRlcikpLGIudGV4UGFyYW1ldGVyaShqYSwxMDI0MSxYKG9hLm1pbkZpbHRlcikpLDEwMDMhPT1vYS5taW5GaWx0ZXImJjEwMDYhPT1vYS5taW5GaWx0ZXImJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBpcyBub3QgcG93ZXIgb2YgdHdvLiBUZXh0dXJlLm1pbkZpbHRlciBzaG91bGQgYmUgc2V0IHRvIFRIUkVFLk5lYXJlc3RGaWx0ZXIgb3IgVEhSRUUuTGluZWFyRmlsdGVyLiIpKTsKIShBYT1lLmdldCgiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIikpfHwxMDE1PT09b2EudHlwZSYmbnVsbD09PWUuZ2V0KCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKXx8MTAxNj09PW9hLnR5cGUmJm51bGw9PT0odS5pc1dlYkdMMnx8ZS5nZXQoIk9FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyIikpfHwhKDE8b2EuYW5pc290cm9weXx8bS5nZXQob2EpLl9fY3VycmVudEFuaXNvdHJvcHkpfHwoYi50ZXhQYXJhbWV0ZXJmKGphLEFhLlRFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhULE1hdGgubWluKG9hLmFuaXNvdHJvcHksdS5nZXRNYXhBbmlzb3Ryb3B5KCkpKSxtLmdldChvYSkuX19jdXJyZW50QW5pc290cm9weT1vYS5hbmlzb3Ryb3B5KX1mdW5jdGlvbiBDYShqYSxvYSl7dm9pZCAwPT09amEuX193ZWJnbEluaXQmJihqYS5fX3dlYmdsSW5pdD0hMCxvYS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixpYSksamEuX193ZWJnbFRleHR1cmU9Yi5jcmVhdGVUZXh0dXJlKCksCkEubWVtb3J5LnRleHR1cmVzKyspfWZ1bmN0aW9uIFZhKGphLG9hLEFhKXt2YXIgS2E9MzU1MztvYS5pc0RhdGFUZXh0dXJlMkRBcnJheSYmKEthPTM1ODY2KTtvYS5pc0RhdGFUZXh0dXJlM0QmJihLYT0zMjg3OSk7Q2EoamEsb2EpO2guYWN0aXZlVGV4dHVyZSgzMzk4NCtBYSk7aC5iaW5kVGV4dHVyZShLYSxqYS5fX3dlYmdsVGV4dHVyZSk7Yi5waXhlbFN0b3JlaSgzNzQ0MCxvYS5mbGlwWSk7Yi5waXhlbFN0b3JlaSgzNzQ0MSxvYS5wcmVtdWx0aXBseUFscGhhKTtiLnBpeGVsU3RvcmVpKDMzMTcsb2EudW5wYWNrQWxpZ25tZW50KTtBYT1RKG9hKSYmITE9PT1KKG9hLmltYWdlKTtBYT1HKG9hLmltYWdlLEFhLCExLHUubWF4VGV4dHVyZVNpemUpO3ZhciAkYT1KKEFhKXx8dS5pc1dlYkdMMixQYT13LmNvbnZlcnQob2EuZm9ybWF0KSxmYj13LmNvbnZlcnQob2EudHlwZSksa2E9VyhQYSxmYik7dmEoS2Esb2EsJGEpO3ZhciBIYT1vYS5taXBtYXBzO2lmKG9hLmlzRGVwdGhUZXh0dXJlKXtrYT0KNjQwMjtpZigxMDE1PT09b2EudHlwZSl7aWYoIXUuaXNXZWJHTDIpdGhyb3cgRXJyb3IoIkZsb2F0IERlcHRoIFRleHR1cmUgb25seSBzdXBwb3J0ZWQgaW4gV2ViR0wyLjAiKTtrYT0zNjAxMn1lbHNlIHUuaXNXZWJHTDImJihrYT0zMzE4OSk7MTAyNj09PW9hLmZvcm1hdCYmNjQwMj09PWthJiYxMDEyIT09b2EudHlwZSYmMTAxNCE9PW9hLnR5cGUmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZFNob3J0VHlwZSBvciBVbnNpZ25lZEludFR5cGUgZm9yIERlcHRoRm9ybWF0IERlcHRoVGV4dHVyZS4iKSxvYS50eXBlPTEwMTIsZmI9dy5jb252ZXJ0KG9hLnR5cGUpKTsxMDI3PT09b2EuZm9ybWF0JiYoa2E9MzQwNDEsMTAyMCE9PW9hLnR5cGUmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERlcHRoU3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuIiksb2EudHlwZT0xMDIwLGZiPQp3LmNvbnZlcnQob2EudHlwZSkpKTtoLnRleEltYWdlMkQoMzU1MywwLGthLEFhLndpZHRoLEFhLmhlaWdodCwwLFBhLGZiLG51bGwpfWVsc2UgaWYob2EuaXNEYXRhVGV4dHVyZSlpZigwPEhhLmxlbmd0aCYmJGEpe2Zvcih2YXIgTmE9MCxyYj1IYS5sZW5ndGg7TmE8cmI7TmErKylLYT1IYVtOYV0saC50ZXhJbWFnZTJEKDM1NTMsTmEsa2EsS2Eud2lkdGgsS2EuaGVpZ2h0LDAsUGEsZmIsS2EuZGF0YSk7b2EuZ2VuZXJhdGVNaXBtYXBzPSExO2phLl9fbWF4TWlwTGV2ZWw9SGEubGVuZ3RoLTF9ZWxzZSBoLnRleEltYWdlMkQoMzU1MywwLGthLEFhLndpZHRoLEFhLmhlaWdodCwwLFBhLGZiLEFhLmRhdGEpLGphLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKG9hLmlzQ29tcHJlc3NlZFRleHR1cmUpe05hPTA7Zm9yKHJiPUhhLmxlbmd0aDtOYTxyYjtOYSsrKUthPUhhW05hXSwxMDIzIT09b2EuZm9ybWF0JiYxMDIyIT09b2EuZm9ybWF0Py0xPGguZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZihQYSk/CmguY29tcHJlc3NlZFRleEltYWdlMkQoMzU1MyxOYSxrYSxLYS53aWR0aCxLYS5oZWlnaHQsMCxLYS5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC51cGxvYWRUZXh0dXJlKCkiKTpoLnRleEltYWdlMkQoMzU1MyxOYSxrYSxLYS53aWR0aCxLYS5oZWlnaHQsMCxQYSxmYixLYS5kYXRhKTtqYS5fX21heE1pcExldmVsPUhhLmxlbmd0aC0xfWVsc2UgaWYob2EuaXNEYXRhVGV4dHVyZTJEQXJyYXkpaC50ZXhJbWFnZTNEKDM1ODY2LDAsa2EsQWEud2lkdGgsQWEuaGVpZ2h0LEFhLmRlcHRoLDAsUGEsZmIsQWEuZGF0YSksamEuX19tYXhNaXBMZXZlbD0wO2Vsc2UgaWYob2EuaXNEYXRhVGV4dHVyZTNEKWgudGV4SW1hZ2UzRCgzMjg3OSwwLGthLEFhLndpZHRoLEFhLmhlaWdodCxBYS5kZXB0aCwwLFBhLGZiLEFhLmRhdGEpLGphLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKDA8CkhhLmxlbmd0aCYmJGEpe05hPTA7Zm9yKHJiPUhhLmxlbmd0aDtOYTxyYjtOYSsrKUthPUhhW05hXSxoLnRleEltYWdlMkQoMzU1MyxOYSxrYSxQYSxmYixLYSk7b2EuZ2VuZXJhdGVNaXBtYXBzPSExO2phLl9fbWF4TWlwTGV2ZWw9SGEubGVuZ3RoLTF9ZWxzZSBoLnRleEltYWdlMkQoMzU1MywwLGthLFBhLGZiLEFhKSxqYS5fX21heE1pcExldmVsPTA7UyhvYSwkYSkmJlQoMzU1MyxvYSxBYS53aWR0aCxBYS5oZWlnaHQpO2phLl9fdmVyc2lvbj1vYS52ZXJzaW9uO2lmKG9hLm9uVXBkYXRlKW9hLm9uVXBkYXRlKG9hKX1mdW5jdGlvbiBXYShqYSxvYSxBYSxLYSl7dmFyICRhPXcuY29udmVydChvYS50ZXh0dXJlLmZvcm1hdCksUGE9dy5jb252ZXJ0KG9hLnRleHR1cmUudHlwZSksZmI9VygkYSxQYSk7aC50ZXhJbWFnZTJEKEthLDAsZmIsb2Eud2lkdGgsb2EuaGVpZ2h0LDAsJGEsUGEsbnVsbCk7Yi5iaW5kRnJhbWVidWZmZXIoMzYxNjAsamEpO2IuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsCkFhLEthLG0uZ2V0KG9hLnRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlLDApO2IuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWZ1bmN0aW9uIERhKGphLG9hLEFhKXtiLmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsamEpO2lmKG9hLmRlcHRoQnVmZmVyJiYhb2Euc3RlbmNpbEJ1ZmZlcilBYT8oQWE9T2Eob2EpLGIucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLEFhLDMzMTg5LG9hLndpZHRoLG9hLmhlaWdodCkpOmIucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSwzMzE4OSxvYS53aWR0aCxvYS5oZWlnaHQpLGIuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoMzYxNjAsMzYwOTYsMzYxNjEsamEpO2Vsc2UgaWYob2EuZGVwdGhCdWZmZXImJm9hLnN0ZW5jaWxCdWZmZXIpQWE/KEFhPU9hKG9hKSxiLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSxBYSwzNTA1NixvYS53aWR0aCxvYS5oZWlnaHQpKTpiLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoMzYxNjEsMzQwNDEsCm9hLndpZHRoLG9hLmhlaWdodCksYi5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzMzMwNiwzNjE2MSxqYSk7ZWxzZXtqYT13LmNvbnZlcnQob2EudGV4dHVyZS5mb3JtYXQpO3ZhciBLYT13LmNvbnZlcnQob2EudGV4dHVyZS50eXBlKTtqYT1XKGphLEthKTtBYT8oQWE9T2Eob2EpLGIucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLEFhLGphLG9hLndpZHRoLG9hLmhlaWdodCkpOmIucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSxqYSxvYS53aWR0aCxvYS5oZWlnaHQpfWIuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxudWxsKX1mdW5jdGlvbiBJYShqYSxvYSl7aWYob2EmJm9hLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKXRocm93IEVycm9yKCJEZXB0aCBUZXh0dXJlIHdpdGggY3ViZSByZW5kZXIgdGFyZ2V0cyBpcyBub3Qgc3VwcG9ydGVkIik7Yi5iaW5kRnJhbWVidWZmZXIoMzYxNjAsamEpO2lmKCFvYS5kZXB0aFRleHR1cmV8fCFvYS5kZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUpdGhyb3cgRXJyb3IoInJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBUSFJFRS5EZXB0aFRleHR1cmUiKTsKbS5nZXQob2EuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSYmb2EuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoPT09b2Eud2lkdGgmJm9hLmRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQ9PT1vYS5oZWlnaHR8fChvYS5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGg9b2Eud2lkdGgsb2EuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodD1vYS5oZWlnaHQsb2EuZGVwdGhUZXh0dXJlLm5lZWRzVXBkYXRlPSEwKTtyYShvYS5kZXB0aFRleHR1cmUsMCk7amE9bS5nZXQob2EuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZTtpZigxMDI2PT09b2EuZGVwdGhUZXh0dXJlLmZvcm1hdCliLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDM2MDk2LDM1NTMsamEsMCk7ZWxzZSBpZigxMDI3PT09b2EuZGVwdGhUZXh0dXJlLmZvcm1hdCliLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDMzMzA2LDM1NTMsamEsMCk7ZWxzZSB0aHJvdyBFcnJvcigiVW5rbm93biBkZXB0aFRleHR1cmUgZm9ybWF0Iik7Cn1mdW5jdGlvbiBFYShqYSl7dmFyIG9hPW0uZ2V0KGphKSxBYT0hMD09PWphLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlO2lmKGphLmRlcHRoVGV4dHVyZSl7aWYoQWEpdGhyb3cgRXJyb3IoInRhcmdldC5kZXB0aFRleHR1cmUgbm90IHN1cHBvcnRlZCBpbiBDdWJlIHJlbmRlciB0YXJnZXRzIik7SWEob2EuX193ZWJnbEZyYW1lYnVmZmVyLGphKX1lbHNlIGlmKEFhKWZvcihvYS5fX3dlYmdsRGVwdGhidWZmZXI9W10sQWE9MDs2PkFhO0FhKyspYi5iaW5kRnJhbWVidWZmZXIoMzYxNjAsb2EuX193ZWJnbEZyYW1lYnVmZmVyW0FhXSksb2EuX193ZWJnbERlcHRoYnVmZmVyW0FhXT1iLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLERhKG9hLl9fd2ViZ2xEZXB0aGJ1ZmZlcltBYV0samEpO2Vsc2UgYi5iaW5kRnJhbWVidWZmZXIoMzYxNjAsb2EuX193ZWJnbEZyYW1lYnVmZmVyKSxvYS5fX3dlYmdsRGVwdGhidWZmZXI9Yi5jcmVhdGVSZW5kZXJidWZmZXIoKSxEYShvYS5fX3dlYmdsRGVwdGhidWZmZXIsCmphKTtiLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxudWxsKX1mdW5jdGlvbiBPYShqYSl7cmV0dXJuIHUuaXNXZWJHTDImJmphLmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldD9NYXRoLm1pbih1Lm1heFNhbXBsZXMsamEuc2FtcGxlcyk6MH1mdW5jdGlvbiBoYihqYSl7dmFyIG9hPUEucmVuZGVyLmZyYW1lO3liLmdldChqYSkhPT1vYSYmKHliLnNldChqYSxvYSksamEudXBkYXRlKCkpfXZhciB5Yj1uZXcgV2Vha01hcCxMYSxlYj0idW5kZWZpbmVkIiE9PXR5cGVvZiBPZmZzY3JlZW5DYW52YXMsbmI9MCxOYj0hMSxEYj0hMTt0aGlzLmFsbG9jYXRlVGV4dHVyZVVuaXQ9ZnVuY3Rpb24oKXt2YXIgamE9bmI7amE+PXUubWF4VGV4dHVyZXMmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlczogVHJ5aW5nIHRvIHVzZSAiK2phKyIgdGV4dHVyZSB1bml0cyB3aGlsZSB0aGlzIEdQVSBzdXBwb3J0cyBvbmx5ICIrdS5tYXhUZXh0dXJlcyk7bmIrPTE7cmV0dXJuIGphfTt0aGlzLnJlc2V0VGV4dHVyZVVuaXRzPQpmdW5jdGlvbigpe25iPTB9O3RoaXMuc2V0VGV4dHVyZTJEPXJhO3RoaXMuc2V0VGV4dHVyZTJEQXJyYXk9ZnVuY3Rpb24oamEsb2Epe3ZhciBBYT1tLmdldChqYSk7MDxqYS52ZXJzaW9uJiZBYS5fX3ZlcnNpb24hPT1qYS52ZXJzaW9uP1ZhKEFhLGphLG9hKTooaC5hY3RpdmVUZXh0dXJlKDMzOTg0K29hKSxoLmJpbmRUZXh0dXJlKDM1ODY2LEFhLl9fd2ViZ2xUZXh0dXJlKSl9O3RoaXMuc2V0VGV4dHVyZTNEPWZ1bmN0aW9uKGphLG9hKXt2YXIgQWE9bS5nZXQoamEpOzA8amEudmVyc2lvbiYmQWEuX192ZXJzaW9uIT09amEudmVyc2lvbj9WYShBYSxqYSxvYSk6KGguYWN0aXZlVGV4dHVyZSgzMzk4NCtvYSksaC5iaW5kVGV4dHVyZSgzMjg3OSxBYS5fX3dlYmdsVGV4dHVyZSkpfTt0aGlzLnNldFRleHR1cmVDdWJlPXdhO3RoaXMuc2V0VGV4dHVyZUN1YmVEeW5hbWljPXBhO3RoaXMuc2V0dXBSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24oamEpe3ZhciBvYT1tLmdldChqYSksQWE9bS5nZXQoamEudGV4dHVyZSk7CmphLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGhhKTtBYS5fX3dlYmdsVGV4dHVyZT1iLmNyZWF0ZVRleHR1cmUoKTtBLm1lbW9yeS50ZXh0dXJlcysrO3ZhciBLYT0hMD09PWphLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlLCRhPSEwPT09amEuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0LFBhPUooamEpfHx1LmlzV2ViR0wyO2lmKEthKWZvcihvYS5fX3dlYmdsRnJhbWVidWZmZXI9W10sJGE9MDs2PiRhOyRhKyspb2EuX193ZWJnbEZyYW1lYnVmZmVyWyRhXT1iLmNyZWF0ZUZyYW1lYnVmZmVyKCk7ZWxzZSBpZihvYS5fX3dlYmdsRnJhbWVidWZmZXI9Yi5jcmVhdGVGcmFtZWJ1ZmZlcigpLCRhKWlmKHUuaXNXZWJHTDIpe29hLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcj1iLmNyZWF0ZUZyYW1lYnVmZmVyKCk7b2EuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyPWIuY3JlYXRlUmVuZGVyYnVmZmVyKCk7Yi5iaW5kUmVuZGVyYnVmZmVyKDM2MTYxLG9hLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcik7CiRhPXcuY29udmVydChqYS50ZXh0dXJlLmZvcm1hdCk7dmFyIGZiPXcuY29udmVydChqYS50ZXh0dXJlLnR5cGUpOyRhPVcoJGEsZmIpO2ZiPU9hKGphKTtiLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSxmYiwkYSxqYS53aWR0aCxqYS5oZWlnaHQpO2IuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG9hLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcik7Yi5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzNjA2NCwzNjE2MSxvYS5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIpO2IuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxudWxsKTtqYS5kZXB0aEJ1ZmZlciYmKG9hLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcj1iLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLERhKG9hLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcixqYSwhMCkpO2IuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIik7CmlmKEthKXtoLmJpbmRUZXh0dXJlKDM0MDY3LEFhLl9fd2ViZ2xUZXh0dXJlKTt2YSgzNDA2NyxqYS50ZXh0dXJlLFBhKTtmb3IoJGE9MDs2PiRhOyRhKyspV2Eob2EuX193ZWJnbEZyYW1lYnVmZmVyWyRhXSxqYSwzNjA2NCwzNDA2OSskYSk7UyhqYS50ZXh0dXJlLFBhKSYmVCgzNDA2NyxqYS50ZXh0dXJlLGphLndpZHRoLGphLmhlaWdodCk7aC5iaW5kVGV4dHVyZSgzNDA2NyxudWxsKX1lbHNlIGguYmluZFRleHR1cmUoMzU1MyxBYS5fX3dlYmdsVGV4dHVyZSksdmEoMzU1MyxqYS50ZXh0dXJlLFBhKSxXYShvYS5fX3dlYmdsRnJhbWVidWZmZXIsamEsMzYwNjQsMzU1MyksUyhqYS50ZXh0dXJlLFBhKSYmVCgzNTUzLGphLnRleHR1cmUsamEud2lkdGgsamEuaGVpZ2h0KSxoLmJpbmRUZXh0dXJlKDM1NTMsbnVsbCk7amEuZGVwdGhCdWZmZXImJkVhKGphKX07dGhpcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA9ZnVuY3Rpb24oamEpe3ZhciBvYT1qYS50ZXh0dXJlLEFhPUooamEpfHwKdS5pc1dlYkdMMjtpZihTKG9hLEFhKSl7QWE9amEuaXNXZWJHTFJlbmRlclRhcmdldEN1YmU/MzQwNjc6MzU1Mzt2YXIgS2E9bS5nZXQob2EpLl9fd2ViZ2xUZXh0dXJlO2guYmluZFRleHR1cmUoQWEsS2EpO1QoQWEsb2EsamEud2lkdGgsamEuaGVpZ2h0KTtoLmJpbmRUZXh0dXJlKEFhLG51bGwpfX07dGhpcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldD1mdW5jdGlvbihqYSl7aWYoamEuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KWlmKHUuaXNXZWJHTDIpe3ZhciBvYT1tLmdldChqYSk7Yi5iaW5kRnJhbWVidWZmZXIoMzYwMDgsb2EuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKTtiLmJpbmRGcmFtZWJ1ZmZlcigzNjAwOSxvYS5fX3dlYmdsRnJhbWVidWZmZXIpO29hPWphLndpZHRoO3ZhciBBYT1qYS5oZWlnaHQsS2E9MTYzODQ7amEuZGVwdGhCdWZmZXImJihLYXw9MjU2KTtqYS5zdGVuY2lsQnVmZmVyJiYoS2F8PTEwMjQpO2IuYmxpdEZyYW1lYnVmZmVyKDAsCjAsb2EsQWEsMCwwLG9hLEFhLEthLDk3MjgpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIil9O3RoaXMuc2FmZVNldFRleHR1cmUyRD1mdW5jdGlvbihqYSxvYSl7amEmJmphLmlzV2ViR0xSZW5kZXJUYXJnZXQmJighMT09PU5iJiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFRleHR1cmVzLnNhZmVTZXRUZXh0dXJlMkQ6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksTmI9ITApLGphPWphLnRleHR1cmUpO3JhKGphLG9hKX07dGhpcy5zYWZlU2V0VGV4dHVyZUN1YmU9ZnVuY3Rpb24oamEsb2Epe2phJiZqYS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSYmKCExPT09RGImJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMVGV4dHVyZXMuc2FmZVNldFRleHR1cmVDdWJlOiBkb24ndCB1c2UgY3ViZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksCkRiPSEwKSxqYT1qYS50ZXh0dXJlKTtqYSYmamEuaXNDdWJlVGV4dHVyZXx8QXJyYXkuaXNBcnJheShqYS5pbWFnZSkmJjY9PT1qYS5pbWFnZS5sZW5ndGg/d2EoamEsb2EpOnBhKGphLG9hKX19ZnVuY3Rpb24gRm4oYixlLGgpe3JldHVybntjb252ZXJ0OmZ1bmN0aW9uKG0pe2lmKDFFMz09PW0pcmV0dXJuIDEwNDk3O2lmKDEwMDE9PT1tKXJldHVybiAzMzA3MTtpZigxMDAyPT09bSlyZXR1cm4gMzM2NDg7aWYoMTAwMz09PW0pcmV0dXJuIDk3Mjg7aWYoMTAwND09PW0pcmV0dXJuIDk5ODQ7aWYoMTAwNT09PW0pcmV0dXJuIDk5ODY7aWYoMTAwNj09PW0pcmV0dXJuIDk3Mjk7aWYoMTAwNz09PW0pcmV0dXJuIDk5ODU7aWYoMTAwOD09PW0pcmV0dXJuIDk5ODc7aWYoMTAwOT09PW0pcmV0dXJuIDUxMjE7aWYoMTAxNz09PW0pcmV0dXJuIDMyODE5O2lmKDEwMTg9PT1tKXJldHVybiAzMjgyMDtpZigxMDE5PT09bSlyZXR1cm4gMzM2MzU7aWYoMTAxMD09PW0pcmV0dXJuIDUxMjA7aWYoMTAxMT09PQptKXJldHVybiA1MTIyO2lmKDEwMTI9PT1tKXJldHVybiA1MTIzO2lmKDEwMTM9PT1tKXJldHVybiA1MTI0O2lmKDEwMTQ9PT1tKXJldHVybiA1MTI1O2lmKDEwMTU9PT1tKXJldHVybiA1MTI2O2lmKDEwMTY9PT1tKXtpZihoLmlzV2ViR0wyKXJldHVybiA1MTMxO3ZhciB1PWUuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0Iik7aWYobnVsbCE9PXUpcmV0dXJuIHUuSEFMRl9GTE9BVF9PRVN9aWYoMTAyMT09PW0pcmV0dXJuIDY0MDY7aWYoMTAyMj09PW0pcmV0dXJuIDY0MDc7aWYoMTAyMz09PW0pcmV0dXJuIDY0MDg7aWYoMTAyND09PW0pcmV0dXJuIDY0MDk7aWYoMTAyNT09PW0pcmV0dXJuIDY0MTA7aWYoMTAyNj09PW0pcmV0dXJuIDY0MDI7aWYoMTAyNz09PW0pcmV0dXJuIDM0MDQxO2lmKDEwMjg9PT1tKXJldHVybiA2NDAzO2lmKDEwMD09PW0pcmV0dXJuIDMyNzc0O2lmKDEwMT09PW0pcmV0dXJuIDMyNzc4O2lmKDEwMj09PW0pcmV0dXJuIDMyNzc5O2lmKDIwMD09PW0pcmV0dXJuIDA7CmlmKDIwMT09PW0pcmV0dXJuIDE7aWYoMjAyPT09bSlyZXR1cm4gNzY4O2lmKDIwMz09PW0pcmV0dXJuIDc2OTtpZigyMDQ9PT1tKXJldHVybiA3NzA7aWYoMjA1PT09bSlyZXR1cm4gNzcxO2lmKDIwNj09PW0pcmV0dXJuIDc3MjtpZigyMDc9PT1tKXJldHVybiA3NzM7aWYoMjA4PT09bSlyZXR1cm4gNzc0O2lmKDIwOT09PW0pcmV0dXJuIDc3NTtpZigyMTA9PT1tKXJldHVybiA3NzY7aWYoMzM3NzY9PT1tfHwzMzc3Nz09PW18fDMzNzc4PT09bXx8MzM3Nzk9PT1tKWlmKHU9ZS5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIiksbnVsbCE9PXUpe2lmKDMzNzc2PT09bSlyZXR1cm4gdS5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUO2lmKDMzNzc3PT09bSlyZXR1cm4gdS5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVDtpZigzMzc3OD09PW0pcmV0dXJuIHUuQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ7aWYoMzM3Nzk9PT1tKXJldHVybiB1LkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUfWlmKDM1ODQwPT09Cm18fDM1ODQxPT09bXx8MzU4NDI9PT1tfHwzNTg0Mz09PW0paWYodT1lLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIiksbnVsbCE9PXUpe2lmKDM1ODQwPT09bSlyZXR1cm4gdS5DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HO2lmKDM1ODQxPT09bSlyZXR1cm4gdS5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HO2lmKDM1ODQyPT09bSlyZXR1cm4gdS5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRztpZigzNTg0Mz09PW0pcmV0dXJuIHUuQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUd9aWYoMzYxOTY9PT1tJiYodT1lLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEiKSxudWxsIT09dSkpcmV0dXJuIHUuQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTDtpZigzNzgwOD09PW18fDM3ODA5PT09bXx8Mzc4MTA9PT1tfHwzNzgxMT09PW18fDM3ODEyPT09bXx8Mzc4MTM9PT1tfHwzNzgxND09PW18fDM3ODE1PT09bXx8Mzc4MTY9PT0KbXx8Mzc4MTc9PT1tfHwzNzgxOD09PW18fDM3ODE5PT09bXx8Mzc4MjA9PT1tfHwzNzgyMT09PW0paWYodT1lLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiKSxudWxsIT09dSlyZXR1cm4gbTtpZigxMDM9PT1tfHwxMDQ9PT1tKXtpZihoLmlzV2ViR0wyKXtpZigxMDM9PT1tKXJldHVybiAzMjc3NTtpZigxMDQ9PT1tKXJldHVybiAzMjc3Nn11PWUuZ2V0KCJFWFRfYmxlbmRfbWlubWF4Iik7aWYobnVsbCE9PXUpe2lmKDEwMz09PW0pcmV0dXJuIHUuTUlOX0VYVDtpZigxMDQ9PT1tKXJldHVybiB1Lk1BWF9FWFR9fWlmKDEwMjA9PT1tKXtpZihoLmlzV2ViR0wyKXJldHVybiAzNDA0Mjt1PWUuZ2V0KCJXRUJHTF9kZXB0aF90ZXh0dXJlIik7aWYobnVsbCE9PXUpcmV0dXJuIHUuVU5TSUdORURfSU5UXzI0XzhfV0VCR0x9cmV0dXJuIDB9fX1mdW5jdGlvbiBGZigpe3kuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ikdyb3VwIn1mdW5jdGlvbiAkZyhiKXtBYi5jYWxsKHRoaXMpOwp0aGlzLmNhbWVyYXM9Ynx8W119ZnVuY3Rpb24gR24oYixlLGgpe0huLnNldEZyb21NYXRyaXhQb3NpdGlvbihlLm1hdHJpeFdvcmxkKTtJbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oaC5tYXRyaXhXb3JsZCk7dmFyIG09SG4uZGlzdGFuY2VUbyhJbiksdT1lLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMsdz1oLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMsQT11WzE0XS8odVsxMF0tMSk7aD11WzE0XS8odVsxMF0rMSk7dmFyIEU9KHVbOV0rMSkvdVs1XSxHPSh1WzldLTEpL3VbNV0sSj0odVs4XS0xKS91WzBdLFE9KHdbOF0rMSkvd1swXTt1PUEqSjt3PUEqUTtRPW0vKC1KK1EpO0o9USotSjtlLm1hdHJpeFdvcmxkLmRlY29tcG9zZShiLnBvc2l0aW9uLGIucXVhdGVybmlvbixiLnNjYWxlKTtiLnRyYW5zbGF0ZVgoSik7Yi50cmFuc2xhdGVaKFEpO2IubWF0cml4V29ybGQuY29tcG9zZShiLnBvc2l0aW9uLGIucXVhdGVybmlvbixiLnNjYWxlKTtiLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKGIubWF0cml4V29ybGQpOwplPUErUTtBPWgrUTtiLnByb2plY3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKHUtSix3KyhtLUopLEUqaC9BKmUsRypoL0EqZSxlLEEpfWZ1bmN0aW9uIHFrKGIpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PUomJiEwPT09Si5pc1ByZXNlbnRpbmd9ZnVuY3Rpb24gaCgpe2lmKGUoKSl7dmFyIElhPUouZ2V0RXllUGFyYW1ldGVycygibGVmdCIpO0E9MipJYS5yZW5kZXJXaWR0aCppYTtFPUlhLnJlbmRlckhlaWdodCppYTtWYT1iLmdldFBpeGVsUmF0aW8oKTtiLmdldFNpemUoQ2EpO2Iuc2V0RHJhd2luZ0J1ZmZlclNpemUoQSxFLDEpO3dhLnZpZXdwb3J0LnNldCgwLDAsQS8yLEUpO3BhLnZpZXdwb3J0LnNldChBLzIsMCxBLzIsRSk7RGEuc3RhcnQoKTtHLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25zdGFydCJ9KX1lbHNlIEcuZW5hYmxlZCYmYi5zZXREcmF3aW5nQnVmZmVyU2l6ZShDYS53aWR0aCxDYS5oZWlnaHQsVmEpLERhLnN0b3AoKSxHLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9CmZ1bmN0aW9uIG0oSWEpe2Zvcih2YXIgRWE9bmF2aWdhdG9yLmdldEdhbWVwYWRzJiZuYXZpZ2F0b3IuZ2V0R2FtZXBhZHMoKSxPYT0wLGhiPTAseWI9RWEubGVuZ3RoO09hPHliO09hKyspe3ZhciBMYT1FYVtPYV07aWYoTGEmJigiRGF5ZHJlYW0gQ29udHJvbGxlciI9PT1MYS5pZHx8IkdlYXIgVlIgQ29udHJvbGxlciI9PT1MYS5pZHx8Ik9jdWx1cyBHbyBDb250cm9sbGVyIj09PUxhLmlkfHwiT3BlblZSIEdhbWVwYWQiPT09TGEuaWR8fExhLmlkLnN0YXJ0c1dpdGgoIk9jdWx1cyBUb3VjaCIpfHxMYS5pZC5zdGFydHNXaXRoKCJIVEMgVml2ZSBGb2N1cyIpfHxMYS5pZC5zdGFydHNXaXRoKCJTcGF0aWFsIENvbnRyb2xsZXIiKSkpe2lmKGhiPT09SWEpcmV0dXJuIExhO2hiKyt9fX1mdW5jdGlvbiB1KCl7Zm9yKHZhciBJYT0wO0lhPFQubGVuZ3RoO0lhKyspe3ZhciBFYT1UW0lhXSxPYT1tKElhKTtpZih2b2lkIDAhPT1PYSYmdm9pZCAwIT09T2EucG9zZSl7aWYobnVsbD09PU9hLnBvc2UpYnJlYWs7CnZhciBoYj1PYS5wb3NlOyExPT09aGIuaGFzUG9zaXRpb24mJkVhLnBvc2l0aW9uLnNldCguMiwtLjYsLS4wNSk7bnVsbCE9PWhiLnBvc2l0aW9uJiZFYS5wb3NpdGlvbi5mcm9tQXJyYXkoaGIucG9zaXRpb24pO251bGwhPT1oYi5vcmllbnRhdGlvbiYmRWEucXVhdGVybmlvbi5mcm9tQXJyYXkoaGIub3JpZW50YXRpb24pO0VhLm1hdHJpeC5jb21wb3NlKEVhLnBvc2l0aW9uLEVhLnF1YXRlcm5pb24sRWEuc2NhbGUpO0VhLm1hdHJpeC5wcmVtdWx0aXBseShXKTtFYS5tYXRyaXguZGVjb21wb3NlKEVhLnBvc2l0aW9uLEVhLnF1YXRlcm5pb24sRWEuc2NhbGUpO0VhLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITA7RWEudmlzaWJsZT0hMDtoYj0iRGF5ZHJlYW0gQ29udHJvbGxlciI9PT1PYS5pZD8wOjE7dm9pZCAwPT09V2FbSWFdJiYoV2FbSWFdPSExKTtXYVtJYV0hPT1PYS5idXR0b25zW2hiXS5wcmVzc2VkJiYoV2FbSWFdPU9hLmJ1dHRvbnNbaGJdLnByZXNzZWQsITA9PT1XYVtJYV0/CkVhLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlbGVjdHN0YXJ0In0pOihFYS5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZWxlY3RlbmQifSksRWEuZGlzcGF0Y2hFdmVudCh7dHlwZToic2VsZWN0In0pKSl9ZWxzZSBFYS52aXNpYmxlPSExfX1mdW5jdGlvbiB3KElhLEVhKXtudWxsIT09RWEmJjQ9PT1FYS5sZW5ndGgmJklhLnNldChFYVswXSpBLEVhWzFdKkUsRWFbMl0qQSxFYVszXSpFKX12YXIgQSxFLEc9dGhpcyxKPW51bGwsUT1udWxsLFM9bnVsbCxUPVtdLFc9bmV3IHIsWD1uZXcgcixpYT0xLGhhPSJsb2NhbC1mbG9vciI7InVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93JiYiVlJGcmFtZURhdGEiaW4gd2luZG93JiYoUT1uZXcgd2luZG93LlZSRnJhbWVEYXRhLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ2cmRpc3BsYXlwcmVzZW50Y2hhbmdlIixoLCExKSk7dmFyIHNhPW5ldyByLHFhPW5ldyBmLHJhPW5ldyBnLHdhPW5ldyBBYjt3YS52aWV3cG9ydD1uZXcgbjt3YS5sYXllcnMuZW5hYmxlKDEpOwp2YXIgcGE9bmV3IEFiO3BhLnZpZXdwb3J0PW5ldyBuO3BhLmxheWVycy5lbmFibGUoMik7dmFyIHZhPW5ldyAkZyhbd2EscGFdKTt2YS5sYXllcnMuZW5hYmxlKDEpO3ZhLmxheWVycy5lbmFibGUoMik7dmFyIENhPW5ldyBkLFZhLFdhPVtdO3RoaXMuZW5hYmxlZD0hMTt0aGlzLmdldENvbnRyb2xsZXI9ZnVuY3Rpb24oSWEpe3ZhciBFYT1UW0lhXTt2b2lkIDA9PT1FYSYmKEVhPW5ldyBGZixFYS5tYXRyaXhBdXRvVXBkYXRlPSExLEVhLnZpc2libGU9ITEsVFtJYV09RWEpO3JldHVybiBFYX07dGhpcy5nZXREZXZpY2U9ZnVuY3Rpb24oKXtyZXR1cm4gSn07dGhpcy5zZXREZXZpY2U9ZnVuY3Rpb24oSWEpe3ZvaWQgMCE9PUlhJiYoSj1JYSk7RGEuc2V0Q29udGV4dChJYSl9O3RoaXMuc2V0RnJhbWVidWZmZXJTY2FsZUZhY3Rvcj1mdW5jdGlvbihJYSl7aWE9SWF9O3RoaXMuc2V0UmVmZXJlbmNlU3BhY2VUeXBlPWZ1bmN0aW9uKElhKXtoYT1JYX07dGhpcy5zZXRQb3NlVGFyZ2V0PWZ1bmN0aW9uKElhKXt2b2lkIDAhPT0KSWEmJihTPUlhKX07dGhpcy5nZXRDYW1lcmE9ZnVuY3Rpb24oSWEpe3ZhciBFYT0ibG9jYWwtZmxvb3IiPT09aGE/MS42OjA7aWYoITE9PT1lKCkpcmV0dXJuIElhLnBvc2l0aW9uLnNldCgwLEVhLDApLElhLnJvdGF0aW9uLnNldCgwLDAsMCksSWE7Si5kZXB0aE5lYXI9SWEubmVhcjtKLmRlcHRoRmFyPUlhLmZhcjtKLmdldEZyYW1lRGF0YShRKTtpZigibG9jYWwtZmxvb3IiPT09aGEpe3ZhciBPYT1KLnN0YWdlUGFyYW1ldGVycztPYT9XLmZyb21BcnJheShPYS5zaXR0aW5nVG9TdGFuZGluZ1RyYW5zZm9ybSk6Vy5tYWtlVHJhbnNsYXRpb24oMCxFYSwwKX1FYT1RLnBvc2U7T2E9bnVsbCE9PVM/UzpJYTtPYS5tYXRyaXguY29weShXKTtPYS5tYXRyaXguZGVjb21wb3NlKE9hLnBvc2l0aW9uLE9hLnF1YXRlcm5pb24sT2Euc2NhbGUpO251bGwhPT1FYS5vcmllbnRhdGlvbiYmKHFhLmZyb21BcnJheShFYS5vcmllbnRhdGlvbiksT2EucXVhdGVybmlvbi5tdWx0aXBseShxYSkpO251bGwhPT0KRWEucG9zaXRpb24mJihxYS5zZXRGcm9tUm90YXRpb25NYXRyaXgoVykscmEuZnJvbUFycmF5KEVhLnBvc2l0aW9uKSxyYS5hcHBseVF1YXRlcm5pb24ocWEpLE9hLnBvc2l0aW9uLmFkZChyYSkpO09hLnVwZGF0ZU1hdHJpeFdvcmxkKCk7d2EubmVhcj1JYS5uZWFyO3BhLm5lYXI9SWEubmVhcjt3YS5mYXI9SWEuZmFyO3BhLmZhcj1JYS5mYXI7d2EubWF0cml4V29ybGRJbnZlcnNlLmZyb21BcnJheShRLmxlZnRWaWV3TWF0cml4KTtwYS5tYXRyaXhXb3JsZEludmVyc2UuZnJvbUFycmF5KFEucmlnaHRWaWV3TWF0cml4KTtYLmdldEludmVyc2UoVyk7ImxvY2FsLWZsb29yIj09PWhhJiYod2EubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KFgpLHBhLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseShYKSk7SWE9T2EucGFyZW50O251bGwhPT1JYSYmKHNhLmdldEludmVyc2UoSWEubWF0cml4V29ybGQpLHdhLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseShzYSkscGEubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KHNhKSk7CndhLm1hdHJpeFdvcmxkLmdldEludmVyc2Uod2EubWF0cml4V29ybGRJbnZlcnNlKTtwYS5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKHBhLm1hdHJpeFdvcmxkSW52ZXJzZSk7d2EucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoUS5sZWZ0UHJvamVjdGlvbk1hdHJpeCk7cGEucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoUS5yaWdodFByb2plY3Rpb25NYXRyaXgpO0duKHZhLHdhLHBhKTtJYT1KLmdldExheWVycygpO0lhLmxlbmd0aCYmKElhPUlhWzBdLHcod2Eudmlld3BvcnQsSWEubGVmdEJvdW5kcyksdyhwYS52aWV3cG9ydCxJYS5yaWdodEJvdW5kcykpO3UoKTtyZXR1cm4gdmF9O3RoaXMuZ2V0U3RhbmRpbmdNYXRyaXg9ZnVuY3Rpb24oKXtyZXR1cm4gV307dGhpcy5pc1ByZXNlbnRpbmc9ZTt2YXIgRGE9bmV3IHhjO3RoaXMuc2V0QW5pbWF0aW9uTG9vcD1mdW5jdGlvbihJYSl7RGEuc2V0QW5pbWF0aW9uTG9vcChJYSk7ZSgpJiZEYS5zdGFydCgpfTt0aGlzLnN1Ym1pdEZyYW1lPQpmdW5jdGlvbigpe2UoKSYmSi5zdWJtaXRGcmFtZSgpfTt0aGlzLmRpc3Bvc2U9ZnVuY3Rpb24oKXsidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ2cmRpc3BsYXlwcmVzZW50Y2hhbmdlIixoKX07dGhpcy5zZXRGcmFtZU9mUmVmZXJlbmNlVHlwZT1mdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViVlJNYW5hZ2VyOiBzZXRGcmFtZU9mUmVmZXJlbmNlVHlwZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9fWZ1bmN0aW9uIEpuKGIsZSl7ZnVuY3Rpb24gaCgpe3JldHVybiBudWxsIT09RyYmbnVsbCE9PUp9ZnVuY3Rpb24gbShyYSl7Zm9yKHZhciB3YT0wO3dhPFQubGVuZ3RoO3dhKyspV1t3YV09PT1yYS5pbnB1dFNvdXJjZSYmVFt3YV0uZGlzcGF0Y2hFdmVudCh7dHlwZTpyYS50eXBlfSl9ZnVuY3Rpb24gdSgpe2Iuc2V0RnJhbWVidWZmZXIobnVsbCk7Yi5zZXRSZW5kZXJUYXJnZXQoYi5nZXRSZW5kZXJUYXJnZXQoKSk7CnFhLnN0b3AoKTtFLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9ZnVuY3Rpb24gdyhyYSl7Sj1yYTtxYS5zZXRDb250ZXh0KEcpO3FhLnN0YXJ0KCk7RS5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZXNzaW9uc3RhcnQifSl9ZnVuY3Rpb24gQShyYSx3YSl7bnVsbD09PXdhP3JhLm1hdHJpeFdvcmxkLmNvcHkocmEubWF0cml4KTpyYS5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHdhLm1hdHJpeFdvcmxkLHJhLm1hdHJpeCk7cmEubWF0cml4V29ybGRJbnZlcnNlLmdldEludmVyc2UocmEubWF0cml4V29ybGQpfXZhciBFPXRoaXMsRz1udWxsLEo9bnVsbCxRPSJsb2NhbC1mbG9vciIsUz1udWxsLFQ9W10sVz1bXSxYPW5ldyBBYjtYLmxheWVycy5lbmFibGUoMSk7WC52aWV3cG9ydD1uZXcgbjt2YXIgaWE9bmV3IEFiO2lhLmxheWVycy5lbmFibGUoMik7aWEudmlld3BvcnQ9bmV3IG47dmFyIGhhPW5ldyAkZyhbWCxpYV0pO2hhLmxheWVycy5lbmFibGUoMSk7aGEubGF5ZXJzLmVuYWJsZSgyKTsKdGhpcy5lbmFibGVkPSExO3RoaXMuZ2V0Q29udHJvbGxlcj1mdW5jdGlvbihyYSl7dmFyIHdhPVRbcmFdO3ZvaWQgMD09PXdhJiYod2E9bmV3IEZmLHdhLm1hdHJpeEF1dG9VcGRhdGU9ITEsd2EudmlzaWJsZT0hMSxUW3JhXT13YSk7cmV0dXJuIHdhfTt0aGlzLnNldEZyYW1lYnVmZmVyU2NhbGVGYWN0b3I9ZnVuY3Rpb24oKXt9O3RoaXMuc2V0UmVmZXJlbmNlU3BhY2VUeXBlPWZ1bmN0aW9uKHJhKXtRPXJhfTt0aGlzLmdldFNlc3Npb249ZnVuY3Rpb24oKXtyZXR1cm4gR307dGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKHJhKXtHPXJhO251bGwhPT1HJiYoRy5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3QiLG0pLEcuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0c3RhcnQiLG0pLEcuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0ZW5kIixtKSxHLmFkZEV2ZW50TGlzdGVuZXIoImVuZCIsdSksRy51cGRhdGVSZW5kZXJTdGF0ZSh7YmFzZUxheWVyOm5ldyBYUldlYkdMTGF5ZXIoRyxlKX0pLEcucmVxdWVzdFJlZmVyZW5jZVNwYWNlKFEpLnRoZW4odyksClc9Ry5pbnB1dFNvdXJjZXMsRy5hZGRFdmVudExpc3RlbmVyKCJpbnB1dHNvdXJjZXNjaGFuZ2UiLGZ1bmN0aW9uKCl7Vz1HLmlucHV0U291cmNlcztjb25zb2xlLmxvZyhXKTtmb3IodmFyIHdhPTA7d2E8VC5sZW5ndGg7d2ErKylUW3dhXS51c2VyRGF0YS5pbnB1dFNvdXJjZT1XW3dhXX0pKX07dGhpcy5nZXRDYW1lcmE9ZnVuY3Rpb24ocmEpe2lmKGgoKSl7dmFyIHdhPXJhLnBhcmVudCxwYT1oYS5jYW1lcmFzO0EoaGEsd2EpO2Zvcih2YXIgdmE9MDt2YTxwYS5sZW5ndGg7dmErKylBKHBhW3ZhXSx3YSk7cmEubWF0cml4V29ybGQuY29weShoYS5tYXRyaXhXb3JsZCk7cmE9cmEuY2hpbGRyZW47dmE9MDtmb3Iod2E9cmEubGVuZ3RoO3ZhPHdhO3ZhKyspcmFbdmFdLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTtHbihoYSxYLGlhKTtyZXR1cm4gaGF9cmV0dXJuIHJhfTt0aGlzLmlzUHJlc2VudGluZz1oO3ZhciBzYT1udWxsLHFhPW5ldyB4YztxYS5zZXRBbmltYXRpb25Mb29wKGZ1bmN0aW9uKHJhLAp3YSl7Uz13YS5nZXRWaWV3ZXJQb3NlKEopO2lmKG51bGwhPT1TKXt2YXIgcGE9Uy52aWV3cyx2YT1HLnJlbmRlclN0YXRlLmJhc2VMYXllcjtiLnNldEZyYW1lYnVmZmVyKHZhLmZyYW1lYnVmZmVyKTtmb3IodmFyIENhPTA7Q2E8cGEubGVuZ3RoO0NhKyspe3ZhciBWYT1wYVtDYV0sV2E9dmEuZ2V0Vmlld3BvcnQoVmEpLERhPWhhLmNhbWVyYXNbQ2FdO0RhLm1hdHJpeC5mcm9tQXJyYXkoVmEudHJhbnNmb3JtLmludmVyc2UubWF0cml4KS5nZXRJbnZlcnNlKERhLm1hdHJpeCk7RGEucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoVmEucHJvamVjdGlvbk1hdHJpeCk7RGEudmlld3BvcnQuc2V0KFdhLngsV2EueSxXYS53aWR0aCxXYS5oZWlnaHQpOzA9PT1DYSYmaGEubWF0cml4LmNvcHkoRGEubWF0cml4KX19Zm9yKENhPTA7Q2E8VC5sZW5ndGg7Q2ErKyl7cGE9VFtDYV07aWYodmE9V1tDYV0paWYodmE9d2EuZ2V0UG9zZSh2YS50YXJnZXRSYXlTcGFjZSxKKSxudWxsIT09dmEpe3BhLm1hdHJpeC5mcm9tQXJyYXkodmEudHJhbnNmb3JtLm1hdHJpeCk7CnBhLm1hdHJpeC5kZWNvbXBvc2UocGEucG9zaXRpb24scGEucm90YXRpb24scGEuc2NhbGUpO3BhLnZpc2libGU9ITA7Y29udGludWV9cGEudmlzaWJsZT0hMX1zYSYmc2EocmEpfSk7dGhpcy5zZXRBbmltYXRpb25Mb29wPWZ1bmN0aW9uKHJhKXtzYT1yYX07dGhpcy5kaXNwb3NlPWZ1bmN0aW9uKCl7fTt0aGlzLmdldFN0YW5kaW5nTWF0cml4PWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IGdldFN0YW5kaW5nTWF0cml4KCkgaXMgbm8gbG9uZ2VyIG5lZWRlZC4iKTtyZXR1cm4gbmV3IHJ9O3RoaXMuZ2V0RGV2aWNlPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IGdldERldmljZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9O3RoaXMuc2V0RGV2aWNlPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IHNldERldmljZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9O3RoaXMuc2V0RnJhbWVPZlJlZmVyZW5jZVR5cGU9CmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IHNldEZyYW1lT2ZSZWZlcmVuY2VUeXBlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4iKX07dGhpcy5zdWJtaXRGcmFtZT1mdW5jdGlvbigpe319ZnVuY3Rpb24gcmsoYil7dmFyIGU7ZnVuY3Rpb24gaCgpe3JldHVybiBudWxsPT09bWI/eWM6MX1mdW5jdGlvbiBtKCl7WWI9bmV3IExkKFRhKTt6Yz1uZXcgJGIoVGEsWWIsYik7emMuaXNXZWJHTDJ8fChZYi5nZXQoIldFQkdMX2RlcHRoX3RleHR1cmUiKSxZYi5nZXQoIk9FU190ZXh0dXJlX2Zsb2F0IiksWWIuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IiksWWIuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhciIpLFliLmdldCgiT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIiksWWIuZ2V0KCJPRVNfZWxlbWVudF9pbmRleF91aW50IiksWWIuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpO1liLmdldCgiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIik7CnZkPW5ldyBGbihUYSxZYix6Yyk7RWI9bmV3IFJyKFRhLFliLHZkLHpjKTtFYi5zY2lzc29yKGljLmNvcHkoR2YpLm11bHRpcGx5U2NhbGFyKHljKS5mbG9vcigpKTtFYi52aWV3cG9ydChXYi5jb3B5KEhmKS5tdWx0aXBseVNjYWxhcih5YykuZmxvb3IoKSk7b2U9bmV3IE9xKFRhKTtBYz1uZXcgSXI7d2Q9bmV3IFNyKFRhLFliLEViLEFjLHpjLHZkLG9lKTtzaT1uZXcgTWUoVGEpO3NrPW5ldyBrZShUYSxzaSxvZSk7SWY9bmV3IFJxKHNrLG9lKTtLbj1uZXcgUXEoVGEpO05lPW5ldyBIcihrYSxZYix6Yyk7dGk9bmV3IExyO0pmPW5ldyBRcjtwZT1uZXcgamUoa2EsRWIsSWYsb2EpO0xuPW5ldyB1YShUYSxZYixvZSx6Yyk7TW49bmV3IHFpKFRhLFliLG9lLHpjKTtvZS5wcm9ncmFtcz1OZS5wcm9ncmFtcztrYS5jYXBhYmlsaXRpZXM9emM7a2EuZXh0ZW5zaW9ucz1ZYjtrYS5wcm9wZXJ0aWVzPUFjO2thLnJlbmRlckxpc3RzPXRpO2thLnN0YXRlPUViO2thLmluZm89b2V9ZnVuY3Rpb24gdShWKXtWLnByZXZlbnREZWZhdWx0KCk7CmNvbnNvbGUubG9nKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IExvc3QuIik7SGE9ITB9ZnVuY3Rpb24gdygpe2NvbnNvbGUubG9nKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IFJlc3RvcmVkLiIpO0hhPSExO20oKX1mdW5jdGlvbiBBKFYpe1Y9Vi50YXJnZXQ7Vi5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixBKTtFKFYpfWZ1bmN0aW9uIEUoVil7RyhWKTtBYy5yZW1vdmUoVil9ZnVuY3Rpb24gRyhWKXt2YXIgZWE9QWMuZ2V0KFYpLnByb2dyYW07Vi5wcm9ncmFtPXZvaWQgMDt2b2lkIDAhPT1lYSYmTmUucmVsZWFzZVByb2dyYW0oZWEpfWZ1bmN0aW9uIEooVixlYSl7Vi5yZW5kZXIoZnVuY3Rpb24obmEpe2thLnJlbmRlckJ1ZmZlckltbWVkaWF0ZShuYSxlYSl9KX1mdW5jdGlvbiBRKFYsZWEsbmEpe2lmKG5hJiZuYS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5JiYhemMuaXNXZWJHTDImJm51bGw9PT1ZYi5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSljb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnNldHVwVmVydGV4QXR0cmlidXRlczogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7CmVsc2V7RWIuaW5pdEF0dHJpYnV0ZXMoKTt2YXIgSmE9bmEuYXR0cmlidXRlcztlYT1lYS5nZXRBdHRyaWJ1dGVzKCk7Vj1WLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM7Zm9yKHZhciBRYSBpbiBlYSl7dmFyIGRiPWVhW1FhXTtpZigwPD1kYil7dmFyIFJhPUphW1FhXTtpZih2b2lkIDAhPT1SYSl7dmFyIGtiPVJhLm5vcm1hbGl6ZWQsSmI9UmEuaXRlbVNpemUsc2I9c2kuZ2V0KFJhKTtpZih2b2lkIDAhPT1zYil7dmFyIGJiPXNiLmJ1ZmZlcix4ZD1zYi50eXBlO3NiPXNiLmJ5dGVzUGVyRWxlbWVudDtpZihSYS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXt2YXIgJGM9UmEuZGF0YSxLZj0kYy5zdHJpZGU7UmE9UmEub2Zmc2V0OyRjJiYkYy5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyPyhFYi5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKGRiLCRjLm1lc2hQZXJBdHRyaWJ1dGUpLHZvaWQgMD09PW5hLm1heEluc3RhbmNlZENvdW50JiYobmEubWF4SW5zdGFuY2VkQ291bnQ9CiRjLm1lc2hQZXJBdHRyaWJ1dGUqJGMuY291bnQpKTpFYi5lbmFibGVBdHRyaWJ1dGUoZGIpO1RhLmJpbmRCdWZmZXIoMzQ5NjIsYmIpO1RhLnZlcnRleEF0dHJpYlBvaW50ZXIoZGIsSmIseGQsa2IsS2Yqc2IsUmEqc2IpfWVsc2UgUmEuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU/KEViLmVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoZGIsUmEubWVzaFBlckF0dHJpYnV0ZSksdm9pZCAwPT09bmEubWF4SW5zdGFuY2VkQ291bnQmJihuYS5tYXhJbnN0YW5jZWRDb3VudD1SYS5tZXNoUGVyQXR0cmlidXRlKlJhLmNvdW50KSk6RWIuZW5hYmxlQXR0cmlidXRlKGRiKSxUYS5iaW5kQnVmZmVyKDM0OTYyLGJiKSxUYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGRiLEpiLHhkLGtiLDAsMCl9fWVsc2UgaWYodm9pZCAwIT09ViYmKGtiPVZbUWFdLHZvaWQgMCE9PWtiKSlzd2l0Y2goa2IubGVuZ3RoKXtjYXNlIDI6VGEudmVydGV4QXR0cmliMmZ2KGRiLGtiKTticmVhaztjYXNlIDM6VGEudmVydGV4QXR0cmliM2Z2KGRiLAprYik7YnJlYWs7Y2FzZSA0OlRhLnZlcnRleEF0dHJpYjRmdihkYixrYik7YnJlYWs7ZGVmYXVsdDpUYS52ZXJ0ZXhBdHRyaWIxZnYoZGIsa2IpfX19RWIuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKX19ZnVuY3Rpb24gUyhWLGVhLG5hLEphKXtpZighMSE9PVYudmlzaWJsZSl7aWYoVi5sYXllcnMudGVzdChlYS5sYXllcnMpKWlmKFYuaXNHcm91cCluYT1WLnJlbmRlck9yZGVyO2Vsc2UgaWYoVi5pc0xPRCkhMD09PVYuYXV0b1VwZGF0ZSYmVi51cGRhdGUoZWEpO2Vsc2UgaWYoVi5pc0xpZ2h0KWZiLnB1c2hMaWdodChWKSxWLmNhc3RTaGFkb3cmJmZiLnB1c2hTaGFkb3coVik7ZWxzZSBpZihWLmlzU3ByaXRlKXtpZighVi5mcnVzdHVtQ3VsbGVkfHx0ay5pbnRlcnNlY3RzU3ByaXRlKFYpKXtKYSYmcWUuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKFYubWF0cml4V29ybGQpLmFwcGx5TWF0cml4NChhaCk7dmFyIFFhPUlmLnVwZGF0ZShWKSxkYj1WLm1hdGVyaWFsO2RiLnZpc2libGUmJlBhLnB1c2goViwKUWEsZGIsbmEscWUueixudWxsKX19ZWxzZSBpZihWLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0KUphJiZxZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oVi5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KGFoKSxQYS5wdXNoKFYsbnVsbCxWLm1hdGVyaWFsLG5hLHFlLnosbnVsbCk7ZWxzZSBpZihWLmlzTWVzaHx8Vi5pc0xpbmV8fFYuaXNQb2ludHMpaWYoVi5pc1NraW5uZWRNZXNoJiZWLnNrZWxldG9uLnVwZGF0ZSgpLCFWLmZydXN0dW1DdWxsZWR8fHRrLmludGVyc2VjdHNPYmplY3QoVikpaWYoSmEmJnFlLnNldEZyb21NYXRyaXhQb3NpdGlvbihWLm1hdHJpeFdvcmxkKS5hcHBseU1hdHJpeDQoYWgpLFFhPUlmLnVwZGF0ZShWKSxkYj1WLm1hdGVyaWFsLEFycmF5LmlzQXJyYXkoZGIpKWZvcih2YXIgUmE9UWEuZ3JvdXBzLGtiPTAsSmI9UmEubGVuZ3RoO2tiPEpiO2tiKyspe3ZhciBzYj1SYVtrYl0sYmI9ZGJbc2IubWF0ZXJpYWxJbmRleF07YmImJmJiLnZpc2libGUmJlBhLnB1c2goViwKUWEsYmIsbmEscWUueixzYil9ZWxzZSBkYi52aXNpYmxlJiZQYS5wdXNoKFYsUWEsZGIsbmEscWUueixudWxsKTtWPVYuY2hpbGRyZW47a2I9MDtmb3IoSmI9Vi5sZW5ndGg7a2I8SmI7a2IrKylTKFZba2JdLGVhLG5hLEphKX19ZnVuY3Rpb24gVChWLGVhLG5hLEphKXtmb3IodmFyIFFhPTAsZGI9Vi5sZW5ndGg7UWE8ZGI7UWErKyl7dmFyIFJhPVZbUWFdLGtiPVJhLm9iamVjdCxKYj1SYS5nZW9tZXRyeSxzYj12b2lkIDA9PT1KYT9SYS5tYXRlcmlhbDpKYTtSYT1SYS5ncm91cDtpZihuYS5pc0FycmF5Q2FtZXJhKXt4Yj1uYTtmb3IodmFyIGJiPW5hLmNhbWVyYXMseGQ9MCwkYz1iYi5sZW5ndGg7eGQ8JGM7eGQrKyl7dmFyIEtmPWJiW3hkXTtrYi5sYXllcnMudGVzdChLZi5sYXllcnMpJiYoRWIudmlld3BvcnQoV2IuY29weShLZi52aWV3cG9ydCkpLGZiLnNldHVwTGlnaHRzKEtmKSxXKGtiLGVhLEtmLEpiLHNiLFJhKSl9fWVsc2UgeGI9bnVsbCxXKGtiLGVhLG5hLEpiLHNiLFJhKX19CmZ1bmN0aW9uIFcoVixlYSxuYSxKYSxRYSxkYil7Vi5vbkJlZm9yZVJlbmRlcihrYSxlYSxuYSxKYSxRYSxkYik7ZmI9SmYuZ2V0KGVhLHhifHxuYSk7Vi5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyhuYS5tYXRyaXhXb3JsZEludmVyc2UsVi5tYXRyaXhXb3JsZCk7Vi5ub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KFYubW9kZWxWaWV3TWF0cml4KTtWLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0PyhFYi5zZXRNYXRlcmlhbChRYSksSmE9aWEobmEsZWEuZm9nLFFhLFYpLGpiPWU9bnVsbCxxYj0hMSxKKFYsSmEpKTprYS5yZW5kZXJCdWZmZXJEaXJlY3QobmEsZWEuZm9nLEphLFFhLFYsZGIpO2ZiPUpmLmdldChlYSx4Ynx8bmEpfWZ1bmN0aW9uIFgoVixlYSxuYSl7dmFyIEphPUFjLmdldChWKSxRYT1mYi5zdGF0ZS5saWdodHMsZGI9UWEuc3RhdGUudmVyc2lvbjtuYT1OZS5nZXRQYXJhbWV0ZXJzKFYsUWEuc3RhdGUsZmIuc3RhdGUuc2hhZG93c0FycmF5LGVhLGFkLm51bVBsYW5lcywKYWQubnVtSW50ZXJzZWN0aW9uLG5hKTt2YXIgUmE9TmUuZ2V0UHJvZ3JhbUNvZGUoVixuYSksa2I9SmEucHJvZ3JhbSxKYj0hMDtpZih2b2lkIDA9PT1rYilWLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLEEpO2Vsc2UgaWYoa2IuY29kZSE9PVJhKUcoVik7ZWxzZXtpZihKYS5saWdodHNTdGF0ZVZlcnNpb24hPT1kYilKYS5saWdodHNTdGF0ZVZlcnNpb249ZGI7ZWxzZSBpZih2b2lkIDAhPT1uYS5zaGFkZXJJRClyZXR1cm47SmI9ITF9SmImJihuYS5zaGFkZXJJRD8oUmE9dWRbbmEuc2hhZGVySURdLEphLnNoYWRlcj17bmFtZTpWLnR5cGUsdW5pZm9ybXM6emIoUmEudW5pZm9ybXMpLHZlcnRleFNoYWRlcjpSYS52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6UmEuZnJhZ21lbnRTaGFkZXJ9KTpKYS5zaGFkZXI9e25hbWU6Vi50eXBlLHVuaWZvcm1zOlYudW5pZm9ybXMsdmVydGV4U2hhZGVyOlYudmVydGV4U2hhZGVyLGZyYWdtZW50U2hhZGVyOlYuZnJhZ21lbnRTaGFkZXJ9LApSYT1OZS5nZXRQcm9ncmFtQ29kZShWLG5hKSxrYj1OZS5hY3F1aXJlUHJvZ3JhbShWLEphLnNoYWRlcixuYSxSYSksSmEucHJvZ3JhbT1rYixWLnByb2dyYW09a2IpO25hPWtiLmdldEF0dHJpYnV0ZXMoKTtpZihWLm1vcnBoVGFyZ2V0cylmb3IoUmE9Vi5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHM9MDtSYTxrYS5tYXhNb3JwaFRhcmdldHM7UmErKykwPD1uYVsibW9ycGhUYXJnZXQiK1JhXSYmVi5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHMrKztpZihWLm1vcnBoTm9ybWFscylmb3IoUmE9Vi5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHM9MDtSYTxrYS5tYXhNb3JwaE5vcm1hbHM7UmErKykwPD1uYVsibW9ycGhOb3JtYWwiK1JhXSYmVi5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHMrKztuYT1KYS5zaGFkZXIudW5pZm9ybXM7aWYoIVYuaXNTaGFkZXJNYXRlcmlhbCYmIVYuaXNSYXdTaGFkZXJNYXRlcmlhbHx8ITA9PT1WLmNsaXBwaW5nKUphLm51bUNsaXBwaW5nUGxhbmVzPWFkLm51bVBsYW5lcywKSmEubnVtSW50ZXJzZWN0aW9uPWFkLm51bUludGVyc2VjdGlvbixuYS5jbGlwcGluZ1BsYW5lcz1hZC51bmlmb3JtO0phLmZvZz1lYTtKYS5saWdodHNTdGF0ZVZlcnNpb249ZGI7Vi5saWdodHMmJihuYS5hbWJpZW50TGlnaHRDb2xvci52YWx1ZT1RYS5zdGF0ZS5hbWJpZW50LG5hLmxpZ2h0UHJvYmUudmFsdWU9UWEuc3RhdGUucHJvYmUsbmEuZGlyZWN0aW9uYWxMaWdodHMudmFsdWU9UWEuc3RhdGUuZGlyZWN0aW9uYWwsbmEuc3BvdExpZ2h0cy52YWx1ZT1RYS5zdGF0ZS5zcG90LG5hLnJlY3RBcmVhTGlnaHRzLnZhbHVlPVFhLnN0YXRlLnJlY3RBcmVhLG5hLnBvaW50TGlnaHRzLnZhbHVlPVFhLnN0YXRlLnBvaW50LG5hLmhlbWlzcGhlcmVMaWdodHMudmFsdWU9UWEuc3RhdGUuaGVtaSxuYS5kaXJlY3Rpb25hbFNoYWRvd01hcC52YWx1ZT1RYS5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcCxuYS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC52YWx1ZT1RYS5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeCwKbmEuc3BvdFNoYWRvd01hcC52YWx1ZT1RYS5zdGF0ZS5zcG90U2hhZG93TWFwLG5hLnNwb3RTaGFkb3dNYXRyaXgudmFsdWU9UWEuc3RhdGUuc3BvdFNoYWRvd01hdHJpeCxuYS5wb2ludFNoYWRvd01hcC52YWx1ZT1RYS5zdGF0ZS5wb2ludFNoYWRvd01hcCxuYS5wb2ludFNoYWRvd01hdHJpeC52YWx1ZT1RYS5zdGF0ZS5wb2ludFNoYWRvd01hdHJpeCk7Vj1KYS5wcm9ncmFtLmdldFVuaWZvcm1zKCk7Vj1sZS5zZXFXaXRoVmFsdWUoVi5zZXEsbmEpO0phLnVuaWZvcm1zTGlzdD1WfWZ1bmN0aW9uIGlhKFYsZWEsbmEsSmEpe3dkLnJlc2V0VGV4dHVyZVVuaXRzKCk7dmFyIFFhPUFjLmdldChuYSksZGI9ZmIuc3RhdGUubGlnaHRzO3VpJiYodWt8fFYhPT10YikmJmFkLnNldFN0YXRlKG5hLmNsaXBwaW5nUGxhbmVzLG5hLmNsaXBJbnRlcnNlY3Rpb24sbmEuY2xpcFNoYWRvd3MsVixRYSxWPT09dGImJm5hLmlkPT09U2EpOyExPT09bmEubmVlZHNVcGRhdGUmJih2b2lkIDA9PT1RYS5wcm9ncmFtPwpuYS5uZWVkc1VwZGF0ZT0hMDpuYS5mb2cmJlFhLmZvZyE9PWVhP25hLm5lZWRzVXBkYXRlPSEwOm5hLmxpZ2h0cyYmUWEubGlnaHRzU3RhdGVWZXJzaW9uIT09ZGIuc3RhdGUudmVyc2lvbj9uYS5uZWVkc1VwZGF0ZT0hMDp2b2lkIDA9PT1RYS5udW1DbGlwcGluZ1BsYW5lc3x8UWEubnVtQ2xpcHBpbmdQbGFuZXM9PT1hZC5udW1QbGFuZXMmJlFhLm51bUludGVyc2VjdGlvbj09PWFkLm51bUludGVyc2VjdGlvbnx8KG5hLm5lZWRzVXBkYXRlPSEwKSk7bmEubmVlZHNVcGRhdGUmJihYKG5hLGVhLEphKSxuYS5uZWVkc1VwZGF0ZT0hMSk7dmFyIFJhPSExLGtiPWRiPSExLEpiPVFhLnByb2dyYW0sc2I9SmIuZ2V0VW5pZm9ybXMoKSxiYj1RYS5zaGFkZXIudW5pZm9ybXM7RWIudXNlUHJvZ3JhbShKYi5wcm9ncmFtKSYmKGtiPWRiPVJhPSEwKTtuYS5pZCE9PVNhJiYoU2E9bmEuaWQsZGI9ITApO2lmKFJhfHx0YiE9PVYpe3NiLnNldFZhbHVlKFRhLCJwcm9qZWN0aW9uTWF0cml4IixWLnByb2plY3Rpb25NYXRyaXgpOwp6Yy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyJiZzYi5zZXRWYWx1ZShUYSwibG9nRGVwdGhCdWZGQyIsMi8oTWF0aC5sb2coVi5mYXIrMSkvTWF0aC5MTjIpKTt0YiE9PVYmJih0Yj1WLGtiPWRiPSEwKTtpZihuYS5pc1NoYWRlck1hdGVyaWFsfHxuYS5pc01lc2hQaG9uZ01hdGVyaWFsfHxuYS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsfHxuYS5lbnZNYXApUmE9c2IubWFwLmNhbWVyYVBvc2l0aW9uLHZvaWQgMCE9PVJhJiZSYS5zZXRWYWx1ZShUYSxxZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oVi5tYXRyaXhXb3JsZCkpOyhuYS5pc01lc2hQaG9uZ01hdGVyaWFsfHxuYS5pc01lc2hMYW1iZXJ0TWF0ZXJpYWx8fG5hLmlzTWVzaEJhc2ljTWF0ZXJpYWx8fG5hLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWx8fG5hLmlzU2hhZGVyTWF0ZXJpYWx8fG5hLnNraW5uaW5nKSYmc2Iuc2V0VmFsdWUoVGEsInZpZXdNYXRyaXgiLFYubWF0cml4V29ybGRJbnZlcnNlKX1pZihuYS5za2lubmluZyYmKHNiLnNldE9wdGlvbmFsKFRhLApKYSwiYmluZE1hdHJpeCIpLHNiLnNldE9wdGlvbmFsKFRhLEphLCJiaW5kTWF0cml4SW52ZXJzZSIpLFY9SmEuc2tlbGV0b24pKWlmKFJhPVYuYm9uZXMsemMuZmxvYXRWZXJ0ZXhUZXh0dXJlcyl7aWYodm9pZCAwPT09Vi5ib25lVGV4dHVyZSl7UmE9TWF0aC5zcXJ0KDQqUmEubGVuZ3RoKTtSYT1sYi5jZWlsUG93ZXJPZlR3byhSYSk7UmE9TWF0aC5tYXgoUmEsNCk7dmFyIHhkPW5ldyBGbG9hdDMyQXJyYXkoUmEqUmEqNCk7eGQuc2V0KFYuYm9uZU1hdHJpY2VzKTt2YXIgJGM9bmV3IEdiKHhkLFJhLFJhLDEwMjMsMTAxNSk7JGMubmVlZHNVcGRhdGU9ITA7Vi5ib25lTWF0cmljZXM9eGQ7Vi5ib25lVGV4dHVyZT0kYztWLmJvbmVUZXh0dXJlU2l6ZT1SYX1zYi5zZXRWYWx1ZShUYSwiYm9uZVRleHR1cmUiLFYuYm9uZVRleHR1cmUsd2QpO3NiLnNldFZhbHVlKFRhLCJib25lVGV4dHVyZVNpemUiLFYuYm9uZVRleHR1cmVTaXplKX1lbHNlIHNiLnNldE9wdGlvbmFsKFRhLFYsImJvbmVNYXRyaWNlcyIpOwpkYiYmKHNiLnNldFZhbHVlKFRhLCJ0b25lTWFwcGluZ0V4cG9zdXJlIixrYS50b25lTWFwcGluZ0V4cG9zdXJlKSxzYi5zZXRWYWx1ZShUYSwidG9uZU1hcHBpbmdXaGl0ZVBvaW50IixrYS50b25lTWFwcGluZ1doaXRlUG9pbnQpLG5hLmxpZ2h0cyYmeWIoYmIsa2IpLGVhJiZuYS5mb2cmJnBhKGJiLGVhKSxuYS5pc01lc2hCYXNpY01hdGVyaWFsP2hhKGJiLG5hKTpuYS5pc01lc2hMYW1iZXJ0TWF0ZXJpYWw/KGhhKGJiLG5hKSx2YShiYixuYSkpOm5hLmlzTWVzaFBob25nTWF0ZXJpYWw/KGhhKGJiLG5hKSxuYS5pc01lc2hUb29uTWF0ZXJpYWw/VmEoYmIsbmEpOkNhKGJiLG5hKSk6bmEuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD8oaGEoYmIsbmEpLG5hLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWw/RGEoYmIsbmEpOldhKGJiLG5hKSk6bmEuaXNNZXNoTWF0Y2FwTWF0ZXJpYWw/KGhhKGJiLG5hKSxJYShiYixuYSkpOm5hLmlzTWVzaERlcHRoTWF0ZXJpYWw/KGhhKGJiLG5hKSxFYShiYiwKbmEpKTpuYS5pc01lc2hEaXN0YW5jZU1hdGVyaWFsPyhoYShiYixuYSksT2EoYmIsbmEpKTpuYS5pc01lc2hOb3JtYWxNYXRlcmlhbD8oaGEoYmIsbmEpLGhiKGJiLG5hKSk6bmEuaXNMaW5lQmFzaWNNYXRlcmlhbD8oc2EoYmIsbmEpLG5hLmlzTGluZURhc2hlZE1hdGVyaWFsJiZxYShiYixuYSkpOm5hLmlzUG9pbnRzTWF0ZXJpYWw/cmEoYmIsbmEpOm5hLmlzU3ByaXRlTWF0ZXJpYWw/d2EoYmIsbmEpOm5hLmlzU2hhZG93TWF0ZXJpYWwmJihiYi5jb2xvci52YWx1ZS5jb3B5KG5hLmNvbG9yKSxiYi5vcGFjaXR5LnZhbHVlPW5hLm9wYWNpdHkpLHZvaWQgMCE9PWJiLmx0Y18xJiYoYmIubHRjXzEudmFsdWU9WWEuTFRDXzEpLHZvaWQgMCE9PWJiLmx0Y18yJiYoYmIubHRjXzIudmFsdWU9WWEuTFRDXzIpLGxlLnVwbG9hZChUYSxRYS51bmlmb3Jtc0xpc3QsYmIsd2QpKTtuYS5pc1NoYWRlck1hdGVyaWFsJiYhMD09PW5hLnVuaWZvcm1zTmVlZFVwZGF0ZSYmKGxlLnVwbG9hZChUYSxRYS51bmlmb3Jtc0xpc3QsCmJiLHdkKSxuYS51bmlmb3Jtc05lZWRVcGRhdGU9ITEpO25hLmlzU3ByaXRlTWF0ZXJpYWwmJnNiLnNldFZhbHVlKFRhLCJjZW50ZXIiLEphLmNlbnRlcik7c2Iuc2V0VmFsdWUoVGEsIm1vZGVsVmlld01hdHJpeCIsSmEubW9kZWxWaWV3TWF0cml4KTtzYi5zZXRWYWx1ZShUYSwibm9ybWFsTWF0cml4IixKYS5ub3JtYWxNYXRyaXgpO3NiLnNldFZhbHVlKFRhLCJtb2RlbE1hdHJpeCIsSmEubWF0cml4V29ybGQpO3JldHVybiBKYn1mdW5jdGlvbiBoYShWLGVhKXtWLm9wYWNpdHkudmFsdWU9ZWEub3BhY2l0eTtlYS5jb2xvciYmVi5kaWZmdXNlLnZhbHVlLmNvcHkoZWEuY29sb3IpO2VhLmVtaXNzaXZlJiZWLmVtaXNzaXZlLnZhbHVlLmNvcHkoZWEuZW1pc3NpdmUpLm11bHRpcGx5U2NhbGFyKGVhLmVtaXNzaXZlSW50ZW5zaXR5KTtlYS5tYXAmJihWLm1hcC52YWx1ZT1lYS5tYXApO2VhLmFscGhhTWFwJiYoVi5hbHBoYU1hcC52YWx1ZT1lYS5hbHBoYU1hcCk7ZWEuc3BlY3VsYXJNYXAmJgooVi5zcGVjdWxhck1hcC52YWx1ZT1lYS5zcGVjdWxhck1hcCk7ZWEuZW52TWFwJiYoVi5lbnZNYXAudmFsdWU9ZWEuZW52TWFwLFYuZmxpcEVudk1hcC52YWx1ZT1lYS5lbnZNYXAuaXNDdWJlVGV4dHVyZT8tMToxLFYucmVmbGVjdGl2aXR5LnZhbHVlPWVhLnJlZmxlY3Rpdml0eSxWLnJlZnJhY3Rpb25SYXRpby52YWx1ZT1lYS5yZWZyYWN0aW9uUmF0aW8sVi5tYXhNaXBMZXZlbC52YWx1ZT1BYy5nZXQoZWEuZW52TWFwKS5fX21heE1pcExldmVsKTtlYS5saWdodE1hcCYmKFYubGlnaHRNYXAudmFsdWU9ZWEubGlnaHRNYXAsVi5saWdodE1hcEludGVuc2l0eS52YWx1ZT1lYS5saWdodE1hcEludGVuc2l0eSk7ZWEuYW9NYXAmJihWLmFvTWFwLnZhbHVlPWVhLmFvTWFwLFYuYW9NYXBJbnRlbnNpdHkudmFsdWU9ZWEuYW9NYXBJbnRlbnNpdHkpO2lmKGVhLm1hcCl2YXIgbmE9ZWEubWFwO2Vsc2UgZWEuc3BlY3VsYXJNYXA/bmE9ZWEuc3BlY3VsYXJNYXA6ZWEuZGlzcGxhY2VtZW50TWFwPwpuYT1lYS5kaXNwbGFjZW1lbnRNYXA6ZWEubm9ybWFsTWFwP25hPWVhLm5vcm1hbE1hcDplYS5idW1wTWFwP25hPWVhLmJ1bXBNYXA6ZWEucm91Z2huZXNzTWFwP25hPWVhLnJvdWdobmVzc01hcDplYS5tZXRhbG5lc3NNYXA/bmE9ZWEubWV0YWxuZXNzTWFwOmVhLmFscGhhTWFwP25hPWVhLmFscGhhTWFwOmVhLmVtaXNzaXZlTWFwJiYobmE9ZWEuZW1pc3NpdmVNYXApO3ZvaWQgMCE9PW5hJiYobmEuaXNXZWJHTFJlbmRlclRhcmdldCYmKG5hPW5hLnRleHR1cmUpLCEwPT09bmEubWF0cml4QXV0b1VwZGF0ZSYmbmEudXBkYXRlTWF0cml4KCksVi51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KG5hLm1hdHJpeCkpfWZ1bmN0aW9uIHNhKFYsZWEpe1YuZGlmZnVzZS52YWx1ZS5jb3B5KGVhLmNvbG9yKTtWLm9wYWNpdHkudmFsdWU9ZWEub3BhY2l0eX1mdW5jdGlvbiBxYShWLGVhKXtWLmRhc2hTaXplLnZhbHVlPWVhLmRhc2hTaXplO1YudG90YWxTaXplLnZhbHVlPWVhLmRhc2hTaXplK2VhLmdhcFNpemU7ClYuc2NhbGUudmFsdWU9ZWEuc2NhbGV9ZnVuY3Rpb24gcmEoVixlYSl7Vi5kaWZmdXNlLnZhbHVlLmNvcHkoZWEuY29sb3IpO1Yub3BhY2l0eS52YWx1ZT1lYS5vcGFjaXR5O1Yuc2l6ZS52YWx1ZT1lYS5zaXplKnljO1Yuc2NhbGUudmFsdWU9LjUqYmQ7Vi5tYXAudmFsdWU9ZWEubWFwO251bGwhPT1lYS5tYXAmJighMD09PWVhLm1hcC5tYXRyaXhBdXRvVXBkYXRlJiZlYS5tYXAudXBkYXRlTWF0cml4KCksVi51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KGVhLm1hcC5tYXRyaXgpKX1mdW5jdGlvbiB3YShWLGVhKXtWLmRpZmZ1c2UudmFsdWUuY29weShlYS5jb2xvcik7Vi5vcGFjaXR5LnZhbHVlPWVhLm9wYWNpdHk7Vi5yb3RhdGlvbi52YWx1ZT1lYS5yb3RhdGlvbjtWLm1hcC52YWx1ZT1lYS5tYXA7bnVsbCE9PWVhLm1hcCYmKCEwPT09ZWEubWFwLm1hdHJpeEF1dG9VcGRhdGUmJmVhLm1hcC51cGRhdGVNYXRyaXgoKSxWLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoZWEubWFwLm1hdHJpeCkpfQpmdW5jdGlvbiBwYShWLGVhKXtWLmZvZ0NvbG9yLnZhbHVlLmNvcHkoZWEuY29sb3IpO2VhLmlzRm9nPyhWLmZvZ05lYXIudmFsdWU9ZWEubmVhcixWLmZvZ0Zhci52YWx1ZT1lYS5mYXIpOmVhLmlzRm9nRXhwMiYmKFYuZm9nRGVuc2l0eS52YWx1ZT1lYS5kZW5zaXR5KX1mdW5jdGlvbiB2YShWLGVhKXtlYS5lbWlzc2l2ZU1hcCYmKFYuZW1pc3NpdmVNYXAudmFsdWU9ZWEuZW1pc3NpdmVNYXApfWZ1bmN0aW9uIENhKFYsZWEpe1Yuc3BlY3VsYXIudmFsdWUuY29weShlYS5zcGVjdWxhcik7Vi5zaGluaW5lc3MudmFsdWU9TWF0aC5tYXgoZWEuc2hpbmluZXNzLDFFLTQpO2VhLmVtaXNzaXZlTWFwJiYoVi5lbWlzc2l2ZU1hcC52YWx1ZT1lYS5lbWlzc2l2ZU1hcCk7ZWEuYnVtcE1hcCYmKFYuYnVtcE1hcC52YWx1ZT1lYS5idW1wTWFwLFYuYnVtcFNjYWxlLnZhbHVlPWVhLmJ1bXBTY2FsZSwxPT09ZWEuc2lkZSYmKFYuYnVtcFNjYWxlLnZhbHVlKj0tMSkpO2VhLm5vcm1hbE1hcCYmKFYubm9ybWFsTWFwLnZhbHVlPQplYS5ub3JtYWxNYXAsVi5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KGVhLm5vcm1hbFNjYWxlKSwxPT09ZWEuc2lkZSYmVi5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKSk7ZWEuZGlzcGxhY2VtZW50TWFwJiYoVi5kaXNwbGFjZW1lbnRNYXAudmFsdWU9ZWEuZGlzcGxhY2VtZW50TWFwLFYuZGlzcGxhY2VtZW50U2NhbGUudmFsdWU9ZWEuZGlzcGxhY2VtZW50U2NhbGUsVi5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPWVhLmRpc3BsYWNlbWVudEJpYXMpfWZ1bmN0aW9uIFZhKFYsZWEpe0NhKFYsZWEpO2VhLmdyYWRpZW50TWFwJiYoVi5ncmFkaWVudE1hcC52YWx1ZT1lYS5ncmFkaWVudE1hcCl9ZnVuY3Rpb24gV2EoVixlYSl7Vi5yb3VnaG5lc3MudmFsdWU9ZWEucm91Z2huZXNzO1YubWV0YWxuZXNzLnZhbHVlPWVhLm1ldGFsbmVzcztlYS5yb3VnaG5lc3NNYXAmJihWLnJvdWdobmVzc01hcC52YWx1ZT1lYS5yb3VnaG5lc3NNYXApO2VhLm1ldGFsbmVzc01hcCYmKFYubWV0YWxuZXNzTWFwLnZhbHVlPQplYS5tZXRhbG5lc3NNYXApO2VhLmVtaXNzaXZlTWFwJiYoVi5lbWlzc2l2ZU1hcC52YWx1ZT1lYS5lbWlzc2l2ZU1hcCk7ZWEuYnVtcE1hcCYmKFYuYnVtcE1hcC52YWx1ZT1lYS5idW1wTWFwLFYuYnVtcFNjYWxlLnZhbHVlPWVhLmJ1bXBTY2FsZSwxPT09ZWEuc2lkZSYmKFYuYnVtcFNjYWxlLnZhbHVlKj0tMSkpO2VhLm5vcm1hbE1hcCYmKFYubm9ybWFsTWFwLnZhbHVlPWVhLm5vcm1hbE1hcCxWLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoZWEubm9ybWFsU2NhbGUpLDE9PT1lYS5zaWRlJiZWLm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKTtlYS5kaXNwbGFjZW1lbnRNYXAmJihWLmRpc3BsYWNlbWVudE1hcC52YWx1ZT1lYS5kaXNwbGFjZW1lbnRNYXAsVi5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1lYS5kaXNwbGFjZW1lbnRTY2FsZSxWLmRpc3BsYWNlbWVudEJpYXMudmFsdWU9ZWEuZGlzcGxhY2VtZW50Qmlhcyk7ZWEuZW52TWFwJiYoVi5lbnZNYXBJbnRlbnNpdHkudmFsdWU9CmVhLmVudk1hcEludGVuc2l0eSl9ZnVuY3Rpb24gRGEoVixlYSl7V2EoVixlYSk7Vi5yZWZsZWN0aXZpdHkudmFsdWU9ZWEucmVmbGVjdGl2aXR5O1YuY2xlYXJjb2F0LnZhbHVlPWVhLmNsZWFyY29hdDtWLmNsZWFyY29hdFJvdWdobmVzcy52YWx1ZT1lYS5jbGVhcmNvYXRSb3VnaG5lc3M7ZWEuc2hlZW4mJlYuc2hlZW4udmFsdWUuY29weShlYS5zaGVlbik7ZWEuY2xlYXJjb2F0Tm9ybWFsTWFwJiYoVi5jbGVhcmNvYXROb3JtYWxTY2FsZS52YWx1ZS5jb3B5KGVhLmNsZWFyY29hdE5vcm1hbFNjYWxlKSxWLmNsZWFyY29hdE5vcm1hbE1hcC52YWx1ZT1lYS5jbGVhcmNvYXROb3JtYWxNYXAsMT09PWVhLnNpZGUmJlYuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO1YudHJhbnNwYXJlbmN5LnZhbHVlPWVhLnRyYW5zcGFyZW5jeX1mdW5jdGlvbiBJYShWLGVhKXtlYS5tYXRjYXAmJihWLm1hdGNhcC52YWx1ZT1lYS5tYXRjYXApO2VhLmJ1bXBNYXAmJihWLmJ1bXBNYXAudmFsdWU9CmVhLmJ1bXBNYXAsVi5idW1wU2NhbGUudmFsdWU9ZWEuYnVtcFNjYWxlLDE9PT1lYS5zaWRlJiYoVi5idW1wU2NhbGUudmFsdWUqPS0xKSk7ZWEubm9ybWFsTWFwJiYoVi5ub3JtYWxNYXAudmFsdWU9ZWEubm9ybWFsTWFwLFYubm9ybWFsU2NhbGUudmFsdWUuY29weShlYS5ub3JtYWxTY2FsZSksMT09PWVhLnNpZGUmJlYubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO2VhLmRpc3BsYWNlbWVudE1hcCYmKFYuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWVhLmRpc3BsYWNlbWVudE1hcCxWLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWVhLmRpc3BsYWNlbWVudFNjYWxlLFYuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1lYS5kaXNwbGFjZW1lbnRCaWFzKX1mdW5jdGlvbiBFYShWLGVhKXtlYS5kaXNwbGFjZW1lbnRNYXAmJihWLmRpc3BsYWNlbWVudE1hcC52YWx1ZT1lYS5kaXNwbGFjZW1lbnRNYXAsVi5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1lYS5kaXNwbGFjZW1lbnRTY2FsZSxWLmRpc3BsYWNlbWVudEJpYXMudmFsdWU9CmVhLmRpc3BsYWNlbWVudEJpYXMpfWZ1bmN0aW9uIE9hKFYsZWEpe2VhLmRpc3BsYWNlbWVudE1hcCYmKFYuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWVhLmRpc3BsYWNlbWVudE1hcCxWLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWVhLmRpc3BsYWNlbWVudFNjYWxlLFYuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1lYS5kaXNwbGFjZW1lbnRCaWFzKTtWLnJlZmVyZW5jZVBvc2l0aW9uLnZhbHVlLmNvcHkoZWEucmVmZXJlbmNlUG9zaXRpb24pO1YubmVhckRpc3RhbmNlLnZhbHVlPWVhLm5lYXJEaXN0YW5jZTtWLmZhckRpc3RhbmNlLnZhbHVlPWVhLmZhckRpc3RhbmNlfWZ1bmN0aW9uIGhiKFYsZWEpe2VhLmJ1bXBNYXAmJihWLmJ1bXBNYXAudmFsdWU9ZWEuYnVtcE1hcCxWLmJ1bXBTY2FsZS52YWx1ZT1lYS5idW1wU2NhbGUsMT09PWVhLnNpZGUmJihWLmJ1bXBTY2FsZS52YWx1ZSo9LTEpKTtlYS5ub3JtYWxNYXAmJihWLm5vcm1hbE1hcC52YWx1ZT1lYS5ub3JtYWxNYXAsVi5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KGVhLm5vcm1hbFNjYWxlKSwKMT09PWVhLnNpZGUmJlYubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO2VhLmRpc3BsYWNlbWVudE1hcCYmKFYuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWVhLmRpc3BsYWNlbWVudE1hcCxWLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWVhLmRpc3BsYWNlbWVudFNjYWxlLFYuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1lYS5kaXNwbGFjZW1lbnRCaWFzKX1mdW5jdGlvbiB5YihWLGVhKXtWLmFtYmllbnRMaWdodENvbG9yLm5lZWRzVXBkYXRlPWVhO1YubGlnaHRQcm9iZS5uZWVkc1VwZGF0ZT1lYTtWLmRpcmVjdGlvbmFsTGlnaHRzLm5lZWRzVXBkYXRlPWVhO1YucG9pbnRMaWdodHMubmVlZHNVcGRhdGU9ZWE7Vi5zcG90TGlnaHRzLm5lZWRzVXBkYXRlPWVhO1YucmVjdEFyZWFMaWdodHMubmVlZHNVcGRhdGU9ZWE7Vi5oZW1pc3BoZXJlTGlnaHRzLm5lZWRzVXBkYXRlPWVhfWI9Ynx8e307dmFyIExhPXZvaWQgMCE9PWIuY2FudmFzP2IuY2FudmFzOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsCiJjYW52YXMiKSxlYj12b2lkIDAhPT1iLmNvbnRleHQ/Yi5jb250ZXh0Om51bGwsbmI9dm9pZCAwIT09Yi5hbHBoYT9iLmFscGhhOiExLE5iPXZvaWQgMCE9PWIuZGVwdGg/Yi5kZXB0aDohMCxEYj12b2lkIDAhPT1iLnN0ZW5jaWw/Yi5zdGVuY2lsOiEwLGphPXZvaWQgMCE9PWIuYW50aWFsaWFzP2IuYW50aWFsaWFzOiExLG9hPXZvaWQgMCE9PWIucHJlbXVsdGlwbGllZEFscGhhP2IucHJlbXVsdGlwbGllZEFscGhhOiEwLEFhPXZvaWQgMCE9PWIucHJlc2VydmVEcmF3aW5nQnVmZmVyP2IucHJlc2VydmVEcmF3aW5nQnVmZmVyOiExLEthPXZvaWQgMCE9PWIucG93ZXJQcmVmZXJlbmNlP2IucG93ZXJQcmVmZXJlbmNlOiJkZWZhdWx0IiwkYT12b2lkIDAhPT1iLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ/Yi5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiExLFBhPW51bGwsZmI9bnVsbDt0aGlzLmRvbUVsZW1lbnQ9TGE7dGhpcy5kZWJ1Zz17Y2hlY2tTaGFkZXJFcnJvcnM6ITB9Owp0aGlzLnNvcnRPYmplY3RzPXRoaXMuYXV0b0NsZWFyU3RlbmNpbD10aGlzLmF1dG9DbGVhckRlcHRoPXRoaXMuYXV0b0NsZWFyQ29sb3I9dGhpcy5hdXRvQ2xlYXI9ITA7dGhpcy5jbGlwcGluZ1BsYW5lcz1bXTt0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkPSExO3RoaXMuZ2FtbWFGYWN0b3I9Mjt0aGlzLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzPXRoaXMuZ2FtbWFPdXRwdXQ9dGhpcy5nYW1tYUlucHV0PSExO3RoaXMudG9uZU1hcHBpbmdXaGl0ZVBvaW50PXRoaXMudG9uZU1hcHBpbmdFeHBvc3VyZT10aGlzLnRvbmVNYXBwaW5nPTE7dGhpcy5tYXhNb3JwaFRhcmdldHM9ODt0aGlzLm1heE1vcnBoTm9ybWFscz00O3ZhciBrYT10aGlzLEhhPSExLE5hPW51bGwscmI9MCxYYT0wLG1iPW51bGwsb2I9bnVsbCxTYT0tMTt2YXIgamI9ZT1udWxsO3ZhciBxYj0hMTt2YXIgdGI9bnVsbCx4Yj1udWxsLFdiPW5ldyBuLGljPW5ldyBuLEpjPW51bGwseWQ9TGEud2lkdGgsYmQ9TGEuaGVpZ2h0LAp5Yz0xLEhmPW5ldyBuKDAsMCx5ZCxiZCksR2Y9bmV3IG4oMCwwLHlkLGJkKSx2az0hMSx0az1uZXcgRWMsYWQ9bmV3IFpjLHVpPSExLHVrPSExLGFoPW5ldyByLHFlPW5ldyBnO3RyeXtuYj17YWxwaGE6bmIsZGVwdGg6TmIsc3RlbmNpbDpEYixhbnRpYWxpYXM6amEscHJlbXVsdGlwbGllZEFscGhhOm9hLHByZXNlcnZlRHJhd2luZ0J1ZmZlcjpBYSxwb3dlclByZWZlcmVuY2U6S2EsZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDokYSx4ckNvbXBhdGlibGU6ITB9O0xhLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLHUsITEpO0xhLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIix3LCExKTt2YXIgVGE9ZWJ8fExhLmdldENvbnRleHQoIndlYmdsIixuYil8fExhLmdldENvbnRleHQoImV4cGVyaW1lbnRhbC13ZWJnbCIsbmIpO2lmKG51bGw9PT1UYSl7aWYobnVsbCE9PUxhLmdldENvbnRleHQoIndlYmdsIikpdGhyb3cgRXJyb3IoIkVycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQgd2l0aCB5b3VyIHNlbGVjdGVkIGF0dHJpYnV0ZXMuIik7CnRocm93IEVycm9yKCJFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0LiIpO312b2lkIDA9PT1UYS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQmJihUYS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQ9ZnVuY3Rpb24oKXtyZXR1cm57cmFuZ2VNaW46MSxyYW5nZU1heDoxLHByZWNpc2lvbjoxfX0pfWNhdGNoKFYpe3Rocm93IGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXI6ICIrVi5tZXNzYWdlKSxWO312YXIgWWIsemMsRWIsb2UsQWMsd2Qsc2ksc2ssSWYsTmUsdGksSmYscGUsS24sTG4sTW4sdmQ7bSgpO3ZhciBOZD0idW5kZWZpbmVkIiE9PXR5cGVvZiBuYXZpZ2F0b3ImJiJ4ciJpbiBuYXZpZ2F0b3ImJiJzdXBwb3J0c1Nlc3Npb24iaW4gbmF2aWdhdG9yLnhyP25ldyBKbihrYSxUYSk6bmV3IHFrKGthKTt0aGlzLnZyPU5kO3ZhciBObj1uZXcgRW4oa2EsSWYsemMubWF4VGV4dHVyZVNpemUpO3RoaXMuc2hhZG93TWFwPU5uO3RoaXMuZ2V0Q29udGV4dD1mdW5jdGlvbigpe3JldHVybiBUYX07CnRoaXMuZ2V0Q29udGV4dEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gVGEuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKX07dGhpcy5mb3JjZUNvbnRleHRMb3NzPWZ1bmN0aW9uKCl7dmFyIFY9WWIuZ2V0KCJXRUJHTF9sb3NlX2NvbnRleHQiKTtWJiZWLmxvc2VDb250ZXh0KCl9O3RoaXMuZm9yY2VDb250ZXh0UmVzdG9yZT1mdW5jdGlvbigpe3ZhciBWPVliLmdldCgiV0VCR0xfbG9zZV9jb250ZXh0Iik7ViYmVi5yZXN0b3JlQ29udGV4dCgpfTt0aGlzLmdldFBpeGVsUmF0aW89ZnVuY3Rpb24oKXtyZXR1cm4geWN9O3RoaXMuc2V0UGl4ZWxSYXRpbz1mdW5jdGlvbigpe3ZhciBWPXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO3ZvaWQgMCE9PVYmJih5Yz1WLHRoaXMuc2V0U2l6ZSh5ZCxiZCwhMSkpfTt0aGlzLmdldFNpemU9ZnVuY3Rpb24oVil7dm9pZCAwPT09ViYmKGNvbnNvbGUud2FybigiV2ViR0xSZW5kZXJlcjogLmdldHNpemUoKSBub3cgcmVxdWlyZXMgYSBWZWN0b3IyIGFzIGFuIGFyZ3VtZW50IiksClY9bmV3IGQpO3JldHVybiBWLnNldCh5ZCxiZCl9O3RoaXMuc2V0U2l6ZT1mdW5jdGlvbihWLGVhLG5hKXtOZC5pc1ByZXNlbnRpbmcoKT9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IENhbid0IGNoYW5nZSBzaXplIHdoaWxlIFZSIGRldmljZSBpcyBwcmVzZW50aW5nLiIpOih5ZD1WLGJkPWVhLExhLndpZHRoPU1hdGguZmxvb3IoVip5YyksTGEuaGVpZ2h0PU1hdGguZmxvb3IoZWEqeWMpLCExIT09bmEmJihMYS5zdHlsZS53aWR0aD1WKyJweCIsTGEuc3R5bGUuaGVpZ2h0PWVhKyJweCIpLHRoaXMuc2V0Vmlld3BvcnQoVixlYSkpfTt0aGlzLmdldERyYXdpbmdCdWZmZXJTaXplPWZ1bmN0aW9uKFYpe3ZvaWQgMD09PVYmJihjb25zb2xlLndhcm4oIldlYkdMUmVuZGVyZXI6IC5nZXRkcmF3aW5nQnVmZmVyU2l6ZSgpIG5vdyByZXF1aXJlcyBhIFZlY3RvcjIgYXMgYW4gYXJndW1lbnQiKSxWPW5ldyBkKTtyZXR1cm4gVi5zZXQoeWQqeWMsYmQqeWMpLmZsb29yKCl9Owp0aGlzLnNldERyYXdpbmdCdWZmZXJTaXplPWZ1bmN0aW9uKFYsZWEsbmEpe3lkPVY7YmQ9ZWE7eWM9bmE7TGEud2lkdGg9TWF0aC5mbG9vcihWKm5hKTtMYS5oZWlnaHQ9TWF0aC5mbG9vcihlYSpuYSk7dGhpcy5zZXRWaWV3cG9ydChWLGVhKX07dGhpcy5nZXRDdXJyZW50Vmlld3BvcnQ9ZnVuY3Rpb24oVil7dm9pZCAwPT09ViYmKGNvbnNvbGUud2FybigiV2ViR0xSZW5kZXJlcjogLmdldEN1cnJlbnRWaWV3cG9ydCgpIG5vdyByZXF1aXJlcyBhIFZlY3RvcjQgYXMgYW4gYXJndW1lbnQiKSxWPW5ldyBuKTtyZXR1cm4gVi5jb3B5KFdiKX07dGhpcy5nZXRWaWV3cG9ydD1mdW5jdGlvbihWKXtyZXR1cm4gVi5jb3B5KEhmKX07dGhpcy5zZXRWaWV3cG9ydD1mdW5jdGlvbihWLGVhKXsoMCkuaXNWZWN0b3I0P0hmLnNldCgoMCkueCwoMCkueSwoMCkueiwoMCkudyk6SGYuc2V0KDAsMCxWLGVhKTtFYi52aWV3cG9ydChXYi5jb3B5KEhmKS5tdWx0aXBseVNjYWxhcih5YykuZmxvb3IoKSl9Owp0aGlzLmdldFNjaXNzb3I9ZnVuY3Rpb24oVil7cmV0dXJuIFYuY29weShHZil9O3RoaXMuc2V0U2Npc3Nvcj1mdW5jdGlvbihWLGVhLG5hLEphKXtWLmlzVmVjdG9yND9HZi5zZXQoVi54LFYueSxWLnosVi53KTpHZi5zZXQoVixlYSxuYSxKYSk7RWIuc2Npc3NvcihpYy5jb3B5KEdmKS5tdWx0aXBseVNjYWxhcih5YykuZmxvb3IoKSl9O3RoaXMuZ2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdmt9O3RoaXMuc2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24oVil7RWIuc2V0U2Npc3NvclRlc3Qodms9Vil9O3RoaXMuZ2V0Q2xlYXJDb2xvcj1mdW5jdGlvbigpe3JldHVybiBwZS5nZXRDbGVhckNvbG9yKCl9O3RoaXMuc2V0Q2xlYXJDb2xvcj1mdW5jdGlvbigpe3BlLnNldENsZWFyQ29sb3IuYXBwbHkocGUsYXJndW1lbnRzKX07dGhpcy5nZXRDbGVhckFscGhhPWZ1bmN0aW9uKCl7cmV0dXJuIHBlLmdldENsZWFyQWxwaGEoKX07dGhpcy5zZXRDbGVhckFscGhhPWZ1bmN0aW9uKCl7cGUuc2V0Q2xlYXJBbHBoYS5hcHBseShwZSwKYXJndW1lbnRzKX07dGhpcy5jbGVhcj1mdW5jdGlvbihWLGVhLG5hKXt2YXIgSmE9MDtpZih2b2lkIDA9PT1WfHxWKUphfD0xNjM4NDtpZih2b2lkIDA9PT1lYXx8ZWEpSmF8PTI1NjtpZih2b2lkIDA9PT1uYXx8bmEpSmF8PTEwMjQ7VGEuY2xlYXIoSmEpfTt0aGlzLmNsZWFyQ29sb3I9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCEwLCExLCExKX07dGhpcy5jbGVhckRlcHRoPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMSwhMCwhMSl9O3RoaXMuY2xlYXJTdGVuY2lsPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMSwhMSwhMCl9O3RoaXMuZGlzcG9zZT1mdW5jdGlvbigpe0xhLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLHUsITEpO0xhLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIix3LCExKTt0aS5kaXNwb3NlKCk7SmYuZGlzcG9zZSgpO0FjLmRpc3Bvc2UoKTtJZi5kaXNwb3NlKCk7TmQuZGlzcG9zZSgpO3ZpLnN0b3AoKX07dGhpcy5yZW5kZXJCdWZmZXJJbW1lZGlhdGU9CmZ1bmN0aW9uKFYsZWEpe0ViLmluaXRBdHRyaWJ1dGVzKCk7dmFyIG5hPUFjLmdldChWKTtWLmhhc1Bvc2l0aW9ucyYmIW5hLnBvc2l0aW9uJiYobmEucG9zaXRpb249VGEuY3JlYXRlQnVmZmVyKCkpO1YuaGFzTm9ybWFscyYmIW5hLm5vcm1hbCYmKG5hLm5vcm1hbD1UYS5jcmVhdGVCdWZmZXIoKSk7Vi5oYXNVdnMmJiFuYS51diYmKG5hLnV2PVRhLmNyZWF0ZUJ1ZmZlcigpKTtWLmhhc0NvbG9ycyYmIW5hLmNvbG9yJiYobmEuY29sb3I9VGEuY3JlYXRlQnVmZmVyKCkpO2VhPWVhLmdldEF0dHJpYnV0ZXMoKTtWLmhhc1Bvc2l0aW9ucyYmKFRhLmJpbmRCdWZmZXIoMzQ5NjIsbmEucG9zaXRpb24pLFRhLmJ1ZmZlckRhdGEoMzQ5NjIsVi5wb3NpdGlvbkFycmF5LDM1MDQ4KSxFYi5lbmFibGVBdHRyaWJ1dGUoZWEucG9zaXRpb24pLFRhLnZlcnRleEF0dHJpYlBvaW50ZXIoZWEucG9zaXRpb24sMyw1MTI2LCExLDAsMCkpO1YuaGFzTm9ybWFscyYmKFRhLmJpbmRCdWZmZXIoMzQ5NjIsbmEubm9ybWFsKSwKVGEuYnVmZmVyRGF0YSgzNDk2MixWLm5vcm1hbEFycmF5LDM1MDQ4KSxFYi5lbmFibGVBdHRyaWJ1dGUoZWEubm9ybWFsKSxUYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGVhLm5vcm1hbCwzLDUxMjYsITEsMCwwKSk7Vi5oYXNVdnMmJihUYS5iaW5kQnVmZmVyKDM0OTYyLG5hLnV2KSxUYS5idWZmZXJEYXRhKDM0OTYyLFYudXZBcnJheSwzNTA0OCksRWIuZW5hYmxlQXR0cmlidXRlKGVhLnV2KSxUYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGVhLnV2LDIsNTEyNiwhMSwwLDApKTtWLmhhc0NvbG9ycyYmKFRhLmJpbmRCdWZmZXIoMzQ5NjIsbmEuY29sb3IpLFRhLmJ1ZmZlckRhdGEoMzQ5NjIsVi5jb2xvckFycmF5LDM1MDQ4KSxFYi5lbmFibGVBdHRyaWJ1dGUoZWEuY29sb3IpLFRhLnZlcnRleEF0dHJpYlBvaW50ZXIoZWEuY29sb3IsMyw1MTI2LCExLDAsMCkpO0ViLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7VGEuZHJhd0FycmF5cyg0LDAsVi5jb3VudCk7Vi5jb3VudD0wfTt0aGlzLnJlbmRlckJ1ZmZlckRpcmVjdD0KZnVuY3Rpb24oVixlYSxuYSxKYSxRYSxkYil7RWIuc2V0TWF0ZXJpYWwoSmEsUWEuaXNNZXNoJiYwPlFhLm1hdHJpeFdvcmxkLmRldGVybWluYW50KCkpO3ZhciBSYT1pYShWLGVhLEphLFFhKSxrYj0hMTtpZihlIT09bmEuaWR8fGpiIT09UmEuaWR8fHFiIT09KCEwPT09SmEud2lyZWZyYW1lKSllPW5hLmlkLGpiPVJhLmlkLHFiPSEwPT09SmEud2lyZWZyYW1lLGtiPSEwO1FhLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyYmKEtuLnVwZGF0ZShRYSxuYSxKYSxSYSksa2I9ITApO3ZhciBKYj1uYS5pbmRleCxzYj1uYS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2VhPTE7ITA9PT1KYS53aXJlZnJhbWUmJihKYj1zay5nZXRXaXJlZnJhbWVBdHRyaWJ1dGUobmEpLGVhPTIpO1Y9TG47aWYobnVsbCE9PUpiKXt2YXIgYmI9c2kuZ2V0KEpiKTtWPU1uO1Yuc2V0SW5kZXgoYmIpfWtiJiYoUShKYSxSYSxuYSksbnVsbCE9PUpiJiZUYS5iaW5kQnVmZmVyKDM0OTYzLGJiLmJ1ZmZlcikpO2JiPUluZmluaXR5OwpudWxsIT09SmI/YmI9SmIuY291bnQ6dm9pZCAwIT09c2ImJihiYj1zYi5jb3VudCk7c2I9bmEuZHJhd1JhbmdlLnN0YXJ0KmVhO1JhPW51bGwhPT1kYj9kYi5zdGFydCplYTowO0piPU1hdGgubWF4KHNiLFJhKTtkYj1NYXRoLm1heCgwLE1hdGgubWluKGJiLHNiK25hLmRyYXdSYW5nZS5jb3VudCplYSxSYSsobnVsbCE9PWRiP2RiLmNvdW50KmVhOkluZmluaXR5KSktMS1KYisxKTtpZigwIT09ZGIpe2lmKFFhLmlzTWVzaClpZighMD09PUphLndpcmVmcmFtZSlFYi5zZXRMaW5lV2lkdGgoSmEud2lyZWZyYW1lTGluZXdpZHRoKmgoKSksVi5zZXRNb2RlKDEpO2Vsc2Ugc3dpdGNoKFFhLmRyYXdNb2RlKXtjYXNlIDA6Vi5zZXRNb2RlKDQpO2JyZWFrO2Nhc2UgMTpWLnNldE1vZGUoNSk7YnJlYWs7Y2FzZSAyOlYuc2V0TW9kZSg2KX1lbHNlIFFhLmlzTGluZT8oSmE9SmEubGluZXdpZHRoLHZvaWQgMD09PUphJiYoSmE9MSksRWIuc2V0TGluZVdpZHRoKEphKmgoKSksUWEuaXNMaW5lU2VnbWVudHM/ClYuc2V0TW9kZSgxKTpRYS5pc0xpbmVMb29wP1Yuc2V0TW9kZSgyKTpWLnNldE1vZGUoMykpOlFhLmlzUG9pbnRzP1Yuc2V0TW9kZSgwKTpRYS5pc1Nwcml0ZSYmVi5zZXRNb2RlKDQpO25hJiZuYS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5PzA8bmEubWF4SW5zdGFuY2VkQ291bnQmJlYucmVuZGVySW5zdGFuY2VzKG5hLEpiLGRiKTpWLnJlbmRlcihKYixkYil9fTt0aGlzLmNvbXBpbGU9ZnVuY3Rpb24oVixlYSl7ZmI9SmYuZ2V0KFYsZWEpO2ZiLmluaXQoKTtWLnRyYXZlcnNlKGZ1bmN0aW9uKG5hKXtuYS5pc0xpZ2h0JiYoZmIucHVzaExpZ2h0KG5hKSxuYS5jYXN0U2hhZG93JiZmYi5wdXNoU2hhZG93KG5hKSl9KTtmYi5zZXR1cExpZ2h0cyhlYSk7Vi50cmF2ZXJzZShmdW5jdGlvbihuYSl7aWYobmEubWF0ZXJpYWwpaWYoQXJyYXkuaXNBcnJheShuYS5tYXRlcmlhbCkpZm9yKHZhciBKYT0wO0phPG5hLm1hdGVyaWFsLmxlbmd0aDtKYSsrKVgobmEubWF0ZXJpYWxbSmFdLFYuZm9nLApuYSk7ZWxzZSBYKG5hLm1hdGVyaWFsLFYuZm9nLG5hKX0pfTt2YXIgd2s9bnVsbCx2aT1uZXcgeGM7dmkuc2V0QW5pbWF0aW9uTG9vcChmdW5jdGlvbihWKXtOZC5pc1ByZXNlbnRpbmcoKXx8d2smJndrKFYpfSk7InVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93JiZ2aS5zZXRDb250ZXh0KHdpbmRvdyk7dGhpcy5zZXRBbmltYXRpb25Mb29wPWZ1bmN0aW9uKFYpe3drPVY7TmQuc2V0QW5pbWF0aW9uTG9vcChWKTt2aS5zdGFydCgpfTt0aGlzLnJlbmRlcj1mdW5jdGlvbihWLGVhLG5hLEphKXtpZih2b2lkIDAhPT1uYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlbmRlcigpOiB0aGUgcmVuZGVyVGFyZ2V0IGFyZ3VtZW50IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuc2V0UmVuZGVyVGFyZ2V0KCkgaW5zdGVhZC4iKTt2YXIgUWE9bmF9aWYodm9pZCAwIT09SmEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXIoKTogdGhlIGZvcmNlQ2xlYXIgYXJndW1lbnQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5jbGVhcigpIGluc3RlYWQuIik7CnZhciBkYj1KYX1lYSYmZWEuaXNDYW1lcmE/SGF8fChqYj1lPW51bGwscWI9ITEsU2E9LTEsdGI9bnVsbCwhMD09PVYuYXV0b1VwZGF0ZSYmVi51cGRhdGVNYXRyaXhXb3JsZCgpLG51bGw9PT1lYS5wYXJlbnQmJmVhLnVwZGF0ZU1hdHJpeFdvcmxkKCksTmQuZW5hYmxlZCYmKGVhPU5kLmdldENhbWVyYShlYSkpLGZiPUpmLmdldChWLGVhKSxmYi5pbml0KCksVi5vbkJlZm9yZVJlbmRlcihrYSxWLGVhLFFhfHxtYiksYWgubXVsdGlwbHlNYXRyaWNlcyhlYS5wcm9qZWN0aW9uTWF0cml4LGVhLm1hdHJpeFdvcmxkSW52ZXJzZSksdGsuc2V0RnJvbU1hdHJpeChhaCksdWs9dGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZCx1aT1hZC5pbml0KHRoaXMuY2xpcHBpbmdQbGFuZXMsdWssZWEpLFBhPXRpLmdldChWLGVhKSxQYS5pbml0KCksUyhWLGVhLDAsa2Euc29ydE9iamVjdHMpLCEwPT09a2Euc29ydE9iamVjdHMmJlBhLnNvcnQoKSx1aSYmYWQuYmVnaW5TaGFkb3dzKCksTm4ucmVuZGVyKGZiLnN0YXRlLnNoYWRvd3NBcnJheSwKVixlYSksZmIuc2V0dXBMaWdodHMoZWEpLHVpJiZhZC5lbmRTaGFkb3dzKCksdGhpcy5pbmZvLmF1dG9SZXNldCYmdGhpcy5pbmZvLnJlc2V0KCksdm9pZCAwIT09UWEmJnRoaXMuc2V0UmVuZGVyVGFyZ2V0KFFhKSxwZS5yZW5kZXIoUGEsVixlYSxkYiksbmE9UGEub3BhcXVlLEphPVBhLnRyYW5zcGFyZW50LFYub3ZlcnJpZGVNYXRlcmlhbD8oUWE9Vi5vdmVycmlkZU1hdGVyaWFsLG5hLmxlbmd0aCYmVChuYSxWLGVhLFFhKSxKYS5sZW5ndGgmJlQoSmEsVixlYSxRYSkpOihuYS5sZW5ndGgmJlQobmEsVixlYSksSmEubGVuZ3RoJiZUKEphLFYsZWEpKSxudWxsIT09bWImJih3ZC51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAobWIpLHdkLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KG1iKSksRWIuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCEwKSxFYi5idWZmZXJzLmRlcHRoLnNldE1hc2soITApLEViLmJ1ZmZlcnMuY29sb3Iuc2V0TWFzayghMCksRWIuc2V0UG9seWdvbk9mZnNldCghMSksCk5kLmVuYWJsZWQmJk5kLnN1Ym1pdEZyYW1lKCksZmI9UGE9bnVsbCk6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXI6IGNhbWVyYSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQ2FtZXJhLiIpfTt0aGlzLnNldEZyYW1lYnVmZmVyPWZ1bmN0aW9uKFYpe05hIT09ViYmVGEuYmluZEZyYW1lYnVmZmVyKDM2MTYwLFYpO05hPVZ9O3RoaXMuZ2V0QWN0aXZlQ3ViZUZhY2U9ZnVuY3Rpb24oKXtyZXR1cm4gcmJ9O3RoaXMuZ2V0QWN0aXZlTWlwbWFwTGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gWGF9O3RoaXMuZ2V0UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIG1ifTt0aGlzLnNldFJlbmRlclRhcmdldD1mdW5jdGlvbihWLGVhLG5hKXttYj1WO3JiPWVhO1hhPW5hO1YmJnZvaWQgMD09PUFjLmdldChWKS5fX3dlYmdsRnJhbWVidWZmZXImJndkLnNldHVwUmVuZGVyVGFyZ2V0KFYpO3ZhciBKYT1OYSxRYT0hMTtWPyhKYT1BYy5nZXQoVikuX193ZWJnbEZyYW1lYnVmZmVyLApWLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlPyhKYT1KYVtlYXx8MF0sUWE9ITApOkphPVYuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0P0FjLmdldChWKS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXI6SmEsV2IuY29weShWLnZpZXdwb3J0KSxpYy5jb3B5KFYuc2Npc3NvciksSmM9Vi5zY2lzc29yVGVzdCk6KFdiLmNvcHkoSGYpLm11bHRpcGx5U2NhbGFyKHljKS5mbG9vcigpLGljLmNvcHkoR2YpLm11bHRpcGx5U2NhbGFyKHljKS5mbG9vcigpLEpjPXZrKTtvYiE9PUphJiYoVGEuYmluZEZyYW1lYnVmZmVyKDM2MTYwLEphKSxvYj1KYSk7RWIudmlld3BvcnQoV2IpO0ViLnNjaXNzb3IoaWMpO0ViLnNldFNjaXNzb3JUZXN0KEpjKTtRYSYmKFY9QWMuZ2V0KFYudGV4dHVyZSksVGEuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsMzYwNjQsMzQwNjkrKGVhfHwwKSxWLl9fd2ViZ2xUZXh0dXJlLG5hfHwwKSl9O3RoaXMucmVhZFJlbmRlclRhcmdldFBpeGVscz1mdW5jdGlvbihWLAplYSxuYSxKYSxRYSxkYixSYSl7aWYoViYmVi5pc1dlYkdMUmVuZGVyVGFyZ2V0KXt2YXIga2I9QWMuZ2V0KFYpLl9fd2ViZ2xGcmFtZWJ1ZmZlcjtWLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlJiZ2b2lkIDAhPT1SYSYmKGtiPWtiW1JhXSk7aWYoa2Ipe1JhPSExO2tiIT09b2ImJihUYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsa2IpLFJhPSEwKTt0cnl7dmFyIEpiPVYudGV4dHVyZSxzYj1KYi5mb3JtYXQsYmI9SmIudHlwZTsxMDIzIT09c2ImJnZkLmNvbnZlcnQoc2IpIT09VGEuZ2V0UGFyYW1ldGVyKDM1NzM5KT9jb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZvcm1hdC4iKToxMDA5PT09YmJ8fHZkLmNvbnZlcnQoYmIpPT09VGEuZ2V0UGFyYW1ldGVyKDM1NzM4KXx8MTAxNT09PWJiJiYoemMuaXNXZWJHTDJ8fFliLmdldCgiT0VTX3RleHR1cmVfZmxvYXQiKXx8ClliLmdldCgiV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0IikpfHwxMDE2PT09YmImJih6Yy5pc1dlYkdMMj9ZYi5nZXQoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKTpZYi5nZXQoIkVYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCIpKT8zNjA1Mz09PVRhLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoMzYxNjApPzA8PWVhJiZlYTw9Vi53aWR0aC1KYSYmMDw9bmEmJm5hPD1WLmhlaWdodC1RYSYmVGEucmVhZFBpeGVscyhlYSxuYSxKYSxRYSx2ZC5jb252ZXJ0KHNiKSx2ZC5jb252ZXJ0KGJiKSxkYik6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZWFkUGl4ZWxzIGZyb20gcmVuZGVyVGFyZ2V0IGZhaWxlZC4gRnJhbWVidWZmZXIgbm90IGNvbXBsZXRlLiIpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4iKX1maW5hbGx5e1JhJiYKVGEuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG9iKX19fWVsc2UgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0LiIpfTt0aGlzLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZT1mdW5jdGlvbihWLGVhLG5hKXt2YXIgSmE9ZWEuaW1hZ2Uud2lkdGgsUWE9ZWEuaW1hZ2UuaGVpZ2h0LGRiPXZkLmNvbnZlcnQoZWEuZm9ybWF0KTt3ZC5zZXRUZXh0dXJlMkQoZWEsMCk7VGEuY29weVRleEltYWdlMkQoMzU1MyxuYXx8MCxkYixWLngsVi55LEphLFFhLDApfTt0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlPWZ1bmN0aW9uKFYsZWEsbmEsSmEpe3ZhciBRYT1lYS5pbWFnZS53aWR0aCxkYj1lYS5pbWFnZS5oZWlnaHQsUmE9dmQuY29udmVydChuYS5mb3JtYXQpLGtiPXZkLmNvbnZlcnQobmEudHlwZSk7d2Quc2V0VGV4dHVyZTJEKG5hLDApO2VhLmlzRGF0YVRleHR1cmU/ClRhLnRleFN1YkltYWdlMkQoMzU1MyxKYXx8MCxWLngsVi55LFFhLGRiLFJhLGtiLGVhLmltYWdlLmRhdGEpOlRhLnRleFN1YkltYWdlMkQoMzU1MyxKYXx8MCxWLngsVi55LFJhLGtiLGVhLmltYWdlKX07InVuZGVmaW5lZCIhPT10eXBlb2YgX19USFJFRV9ERVZUT09MU19fJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm9ic2VydmUiLHtkZXRhaWw6dGhpc30pKX1mdW5jdGlvbiB3aShiLGUpe3RoaXMubmFtZT0iIjt0aGlzLmNvbG9yPW5ldyBJKGIpO3RoaXMuZGVuc2l0eT12b2lkIDAhPT1lP2U6Mi41RS00fWZ1bmN0aW9uIHhpKGIsZSxoKXt0aGlzLm5hbWU9IiI7dGhpcy5jb2xvcj1uZXcgSShiKTt0aGlzLm5lYXI9dm9pZCAwIT09ZT9lOjE7dGhpcy5mYXI9dm9pZCAwIT09aD9oOjFFM31mdW5jdGlvbiBPZShiLGUpe3RoaXMuYXJyYXk9Yjt0aGlzLnN0cmlkZT1lO3RoaXMuY291bnQ9dm9pZCAwIT09Yj9iLmxlbmd0aC9lOjA7dGhpcy5keW5hbWljPQohMTt0aGlzLnVwZGF0ZVJhbmdlPXtvZmZzZXQ6MCxjb3VudDotMX07dGhpcy52ZXJzaW9uPTB9ZnVuY3Rpb24gYmgoYixlLGgsbSl7dGhpcy5kYXRhPWI7dGhpcy5pdGVtU2l6ZT1lO3RoaXMub2Zmc2V0PWg7dGhpcy5ub3JtYWxpemVkPSEwPT09bX1mdW5jdGlvbiByZShiKXtNLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcHJpdGVNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSSgxNjc3NzIxNSk7dGhpcy5tYXA9bnVsbDt0aGlzLnJvdGF0aW9uPTA7dGhpcy5zaXplQXR0ZW51YXRpb249ITA7dGhpcy5saWdodHM9ITE7dGhpcy50cmFuc3BhcmVudD0hMDt0aGlzLnNldFZhbHVlcyhiKX1mdW5jdGlvbiBjaChiKXt5LmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcHJpdGUiO2lmKHZvaWQgMD09PUxmKXtMZj1uZXcgeGE7dmFyIGU9bmV3IE9lKG5ldyBGbG9hdDMyQXJyYXkoWy0uNSwtLjUsMCwwLDAsLjUsLS41LDAsMSwwLC41LC41LDAsMSwxLC0uNSwuNSwwLDAsMV0pLDUpO0xmLnNldEluZGV4KFswLAoxLDIsMCwyLDNdKTtMZi5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYmgoZSwzLDAsITEpKTtMZi5hZGRBdHRyaWJ1dGUoInV2IixuZXcgYmgoZSwyLDMsITEpKX10aGlzLmdlb21ldHJ5PUxmO3RoaXMubWF0ZXJpYWw9dm9pZCAwIT09Yj9iOm5ldyByZTt0aGlzLmNlbnRlcj1uZXcgZCguNSwuNSl9ZnVuY3Rpb24geWkoYixlLGgsbSx1LHcpe01mLnN1YlZlY3RvcnMoYixoKS5hZGRTY2FsYXIoLjUpLm11bHRpcGx5KG0pO3ZvaWQgMCE9PXU/KGRoLng9dypNZi54LXUqTWYueSxkaC55PXUqTWYueCt3Kk1mLnkpOmRoLmNvcHkoTWYpO2IuY29weShlKTtiLngrPWRoLng7Yi55Kz1kaC55O2IuYXBwbHlNYXRyaXg0KE9uKX1mdW5jdGlvbiBlaCgpe3kuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxPRCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7bGV2ZWxzOntlbnVtZXJhYmxlOiEwLHZhbHVlOltdfX0pO3RoaXMuYXV0b1VwZGF0ZT0hMH1mdW5jdGlvbiBmaChiLGUpe2ImJmIuaXNHZW9tZXRyeSYmCmNvbnNvbGUuZXJyb3IoIlRIUkVFLlNraW5uZWRNZXNoIG5vIGxvbmdlciBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIik7eWEuY2FsbCh0aGlzLGIsZSk7dGhpcy50eXBlPSJTa2lubmVkTWVzaCI7dGhpcy5iaW5kTW9kZT0iYXR0YWNoZWQiO3RoaXMuYmluZE1hdHJpeD1uZXcgcjt0aGlzLmJpbmRNYXRyaXhJbnZlcnNlPW5ldyByfWZ1bmN0aW9uIHppKGIsZSl7Yj1ifHxbXTt0aGlzLmJvbmVzPWIuc2xpY2UoMCk7dGhpcy5ib25lTWF0cmljZXM9bmV3IEZsb2F0MzJBcnJheSgxNip0aGlzLmJvbmVzLmxlbmd0aCk7aWYodm9pZCAwPT09ZSl0aGlzLmNhbGN1bGF0ZUludmVyc2VzKCk7ZWxzZSBpZih0aGlzLmJvbmVzLmxlbmd0aD09PWUubGVuZ3RoKXRoaXMuYm9uZUludmVyc2VzPWUuc2xpY2UoMCk7ZWxzZSBmb3IoY29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbiBib25lSW52ZXJzZXMgaXMgdGhlIHdyb25nIGxlbmd0aC4iKSwKdGhpcy5ib25lSW52ZXJzZXM9W10sYj0wLGU9dGhpcy5ib25lcy5sZW5ndGg7YjxlO2IrKyl0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKG5ldyByKX1mdW5jdGlvbiB4aygpe3kuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkJvbmUifWZ1bmN0aW9uIE9iKGIpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpbmVCYXNpY01hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLmxpbmV3aWR0aD0xO3RoaXMubGluZWpvaW49dGhpcy5saW5lY2FwPSJyb3VuZCI7dGhpcy5saWdodHM9ITE7dGhpcy5zZXRWYWx1ZXMoYil9ZnVuY3Rpb24gbWMoYixlLGgpezE9PT1oJiZjb25zb2xlLmVycm9yKCJUSFJFRS5MaW5lOiBwYXJhbWV0ZXIgVEhSRUUuTGluZVBpZWNlcyBubyBsb25nZXIgc3VwcG9ydGVkLiBVc2UgVEhSRUUuTGluZVNlZ21lbnRzIGluc3RlYWQuIik7eS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTGluZSI7dGhpcy5nZW9tZXRyeT12b2lkIDAhPT1iP2I6bmV3IHhhO3RoaXMubWF0ZXJpYWw9CnZvaWQgMCE9PWU/ZTpuZXcgT2Ioe2NvbG9yOjE2Nzc3MjE1Kk1hdGgucmFuZG9tKCl9KX1mdW5jdGlvbiBTYihiLGUpe21jLmNhbGwodGhpcyxiLGUpO3RoaXMudHlwZT0iTGluZVNlZ21lbnRzIn1mdW5jdGlvbiBBaShiLGUpe21jLmNhbGwodGhpcyxiLGUpO3RoaXMudHlwZT0iTGluZUxvb3AifWZ1bmN0aW9uIGNkKGIpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBvaW50c01hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLm1hcD1udWxsO3RoaXMuc2l6ZT0xO3RoaXMuc2l6ZUF0dGVudWF0aW9uPSEwO3RoaXMubGlnaHRzPXRoaXMubW9ycGhUYXJnZXRzPSExO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uIE5mKGIsZSl7eS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUG9pbnRzIjt0aGlzLmdlb21ldHJ5PXZvaWQgMCE9PWI/YjpuZXcgeGE7dGhpcy5tYXRlcmlhbD12b2lkIDAhPT1lP2U6bmV3IGNkKHtjb2xvcjoxNjc3NzIxNSpNYXRoLnJhbmRvbSgpfSk7dGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX0KZnVuY3Rpb24geWsoYixlLGgsbSx1LHcsQSl7dmFyIEU9emsuZGlzdGFuY2VTcVRvUG9pbnQoYik7RTxoJiYoaD1uZXcgZyx6ay5jbG9zZXN0UG9pbnRUb1BvaW50KGIsaCksaC5hcHBseU1hdHJpeDQobSksYj11LnJheS5vcmlnaW4uZGlzdGFuY2VUbyhoKSxiPHUubmVhcnx8Yj51LmZhcnx8dy5wdXNoKHtkaXN0YW5jZTpiLGRpc3RhbmNlVG9SYXk6TWF0aC5zcXJ0KEUpLHBvaW50OmgsaW5kZXg6ZSxmYWNlOm51bGwsb2JqZWN0OkF9KSl9ZnVuY3Rpb24gQWsoYixlLGgsbSx1LHcsQSxFLEcpe2suY2FsbCh0aGlzLGIsZSxoLG0sdSx3LEEsRSxHKTt0aGlzLmZvcm1hdD12b2lkIDAhPT1BP0E6MTAyMjt0aGlzLm1pbkZpbHRlcj12b2lkIDAhPT13P3c6MTAwNjt0aGlzLm1hZ0ZpbHRlcj12b2lkIDAhPT11P3U6MTAwNjt0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX1mdW5jdGlvbiBPZihiLGUsaCxtLHUsdyxBLEUsRyxKLFEsUyl7ay5jYWxsKHRoaXMsbnVsbCx3LEEsRSxHLEosbSx1LFEsClMpO3RoaXMuaW1hZ2U9e3dpZHRoOmUsaGVpZ2h0Omh9O3RoaXMubWlwbWFwcz1iO3RoaXMuZ2VuZXJhdGVNaXBtYXBzPXRoaXMuZmxpcFk9ITF9ZnVuY3Rpb24gZ2goYixlLGgsbSx1LHcsQSxFLEcpe2suY2FsbCh0aGlzLGIsZSxoLG0sdSx3LEEsRSxHKTt0aGlzLm5lZWRzVXBkYXRlPSEwfWZ1bmN0aW9uIGhoKGIsZSxoLG0sdSx3LEEsRSxHLEope0o9dm9pZCAwIT09Sj9KOjEwMjY7aWYoMTAyNiE9PUomJjEwMjchPT1KKXRocm93IEVycm9yKCJEZXB0aFRleHR1cmUgZm9ybWF0IG11c3QgYmUgZWl0aGVyIFRIUkVFLkRlcHRoRm9ybWF0IG9yIFRIUkVFLkRlcHRoU3RlbmNpbEZvcm1hdCIpO3ZvaWQgMD09PWgmJjEwMjY9PT1KJiYoaD0xMDEyKTt2b2lkIDA9PT1oJiYxMDI3PT09SiYmKGg9MTAyMCk7ay5jYWxsKHRoaXMsbnVsbCxtLHUsdyxBLEUsSixoLEcpO3RoaXMuaW1hZ2U9e3dpZHRoOmIsaGVpZ2h0OmV9O3RoaXMubWFnRmlsdGVyPXZvaWQgMCE9PUE/QToxMDAzO3RoaXMubWluRmlsdGVyPQp2b2lkIDAhPT1FP0U6MTAwMzt0aGlzLmdlbmVyYXRlTWlwbWFwcz10aGlzLmZsaXBZPSExfWZ1bmN0aW9uIFBmKGIpe3hhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJXaXJlZnJhbWVHZW9tZXRyeSI7dmFyIGU9W10saCxtLHUsdz1bMCwwXSxBPXt9LEU9WyJhIiwiYiIsImMiXTtpZihiJiZiLmlzR2VvbWV0cnkpe3ZhciBHPWIuZmFjZXM7dmFyIEo9MDtmb3IobT1HLmxlbmd0aDtKPG07SisrKXt2YXIgUT1HW0pdO2ZvcihoPTA7Mz5oO2grKyl7dmFyIFM9UVtFW2hdXTt2YXIgVD1RW0VbKGgrMSklM11dO3dbMF09TWF0aC5taW4oUyxUKTt3WzFdPU1hdGgubWF4KFMsVCk7Uz13WzBdKyIsIit3WzFdO3ZvaWQgMD09PUFbU10mJihBW1NdPXtpbmRleDE6d1swXSxpbmRleDI6d1sxXX0pfX1mb3IoUyBpbiBBKUo9QVtTXSxFPWIudmVydGljZXNbSi5pbmRleDFdLGUucHVzaChFLngsRS55LEUueiksRT1iLnZlcnRpY2VzW0ouaW5kZXgyXSxlLnB1c2goRS54LEUueSxFLnopfWVsc2UgaWYoYiYmCmIuaXNCdWZmZXJHZW9tZXRyeSlpZihFPW5ldyBnLG51bGwhPT1iLmluZGV4KXtHPWIuYXR0cmlidXRlcy5wb3NpdGlvbjtRPWIuaW5kZXg7dmFyIFc9Yi5ncm91cHM7MD09PVcubGVuZ3RoJiYoVz1be3N0YXJ0OjAsY291bnQ6US5jb3VudCxtYXRlcmlhbEluZGV4OjB9XSk7Yj0wO2Zvcih1PVcubGVuZ3RoO2I8dTsrK2IpZm9yKEo9V1tiXSxoPUouc3RhcnQsbT1KLmNvdW50LEo9aCxtPWgrbTtKPG07Sis9Mylmb3IoaD0wOzM+aDtoKyspUz1RLmdldFgoSitoKSxUPVEuZ2V0WChKKyhoKzEpJTMpLHdbMF09TWF0aC5taW4oUyxUKSx3WzFdPU1hdGgubWF4KFMsVCksUz13WzBdKyIsIit3WzFdLHZvaWQgMD09PUFbU10mJihBW1NdPXtpbmRleDE6d1swXSxpbmRleDI6d1sxXX0pO2ZvcihTIGluIEEpSj1BW1NdLEUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShHLEouaW5kZXgxKSxlLnB1c2goRS54LEUueSxFLnopLEUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShHLEouaW5kZXgyKSxlLnB1c2goRS54LApFLnksRS56KX1lbHNlIGZvcihHPWIuYXR0cmlidXRlcy5wb3NpdGlvbixKPTAsbT1HLmNvdW50LzM7SjxtO0orKylmb3IoaD0wOzM+aDtoKyspQT0zKkoraCxFLmZyb21CdWZmZXJBdHRyaWJ1dGUoRyxBKSxlLnB1c2goRS54LEUueSxFLnopLEE9MypKKyhoKzEpJTMsRS5mcm9tQnVmZmVyQXR0cmlidXRlKEcsQSksZS5wdXNoKEUueCxFLnksRS56KTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBkYShlLDMpKX1mdW5jdGlvbiBpaChiLGUsaCl7emEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBhcmFtZXRyaWNHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtmdW5jOmIsc2xpY2VzOmUsc3RhY2tzOmh9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBRZihiLGUsaCkpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFFmKGIsZSxoKXt4YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e2Z1bmM6YiwKc2xpY2VzOmUsc3RhY2tzOmh9O3ZhciBtPVtdLHU9W10sdz1bXSxBPVtdLEU9bmV3IGcsRz1uZXcgZyxKPW5ldyBnLFE9bmV3IGcsUz1uZXcgZyxULFc7Mz5iLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVEhSRUUuUGFyYW1ldHJpY0dlb21ldHJ5OiBGdW5jdGlvbiBtdXN0IG5vdyBtb2RpZnkgYSBWZWN0b3IzIGFzIHRoaXJkIHBhcmFtZXRlci4iKTt2YXIgWD1lKzE7Zm9yKFQ9MDtUPD1oO1QrKyl7dmFyIGlhPVQvaDtmb3IoVz0wO1c8PWU7VysrKXt2YXIgaGE9Vy9lO2IoaGEsaWEsRyk7dS5wdXNoKEcueCxHLnksRy56KTswPD1oYS0xRS01PyhiKGhhLTFFLTUsaWEsSiksUS5zdWJWZWN0b3JzKEcsSikpOihiKGhhKzFFLTUsaWEsSiksUS5zdWJWZWN0b3JzKEosRykpOzA8PWlhLTFFLTU/KGIoaGEsaWEtMUUtNSxKKSxTLnN1YlZlY3RvcnMoRyxKKSk6KGIoaGEsaWErMUUtNSxKKSxTLnN1YlZlY3RvcnMoSixHKSk7RS5jcm9zc1ZlY3RvcnMoUSxTKS5ub3JtYWxpemUoKTt3LnB1c2goRS54LApFLnksRS56KTtBLnB1c2goaGEsaWEpfX1mb3IoVD0wO1Q8aDtUKyspZm9yKFc9MDtXPGU7VysrKWI9VCpYK1crMSxFPShUKzEpKlgrVysxLEc9KFQrMSkqWCtXLG0ucHVzaChUKlgrVyxiLEcpLG0ucHVzaChiLEUsRyk7dGhpcy5zZXRJbmRleChtKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBkYSh1LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgZGEodywzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgZGEoQSwyKSl9ZnVuY3Rpb24gamgoYixlLGgsbSl7emEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBvbHloZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt2ZXJ0aWNlczpiLGluZGljZXM6ZSxyYWRpdXM6aCxkZXRhaWw6bX07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IEZjKGIsZSxoLG0pKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBGYyhiLGUsaCxtKXtmdW5jdGlvbiB1KFgsaWEsaGEsc2Epe3NhPU1hdGgucG93KDIsCnNhKTt2YXIgcWE9W10scmEsd2E7Zm9yKHJhPTA7cmE8PXNhO3JhKyspe3FhW3JhXT1bXTt2YXIgcGE9WC5jbG9uZSgpLmxlcnAoaGEscmEvc2EpLHZhPWlhLmNsb25lKCkubGVycChoYSxyYS9zYSksQ2E9c2EtcmE7Zm9yKHdhPTA7d2E8PUNhO3dhKyspcWFbcmFdW3dhXT0wPT09d2EmJnJhPT09c2E/cGE6cGEuY2xvbmUoKS5sZXJwKHZhLHdhL0NhKX1mb3IocmE9MDtyYTxzYTtyYSsrKWZvcih3YT0wO3dhPDIqKHNhLXJhKS0xO3dhKyspWD1NYXRoLmZsb29yKHdhLzIpLDA9PT13YSUyPyhBKHFhW3JhXVtYKzFdKSxBKHFhW3JhKzFdW1hdKSxBKHFhW3JhXVtYXSkpOihBKHFhW3JhXVtYKzFdKSxBKHFhW3JhKzFdW1grMV0pLEEocWFbcmErMV1bWF0pKX1mdW5jdGlvbiB3KCl7Zm9yKHZhciBYPTA7WDxXLmxlbmd0aDtYKz02KXt2YXIgaWE9V1tYKzBdLGhhPVdbWCsyXSxzYT1XW1grNF0scWE9TWF0aC5taW4oaWEsaGEsc2EpOy45PE1hdGgubWF4KGlhLGhhLHNhKSYmLjE+cWEmJiguMj4KaWEmJihXW1grMF0rPTEpLC4yPmhhJiYoV1tYKzJdKz0xKSwuMj5zYSYmKFdbWCs0XSs9MSkpfX1mdW5jdGlvbiBBKFgpe1QucHVzaChYLngsWC55LFgueil9ZnVuY3Rpb24gRShYLGlhKXtYKj0zO2lhLng9YltYKzBdO2lhLnk9YltYKzFdO2lhLno9YltYKzJdfWZ1bmN0aW9uIEcoKXtmb3IodmFyIFg9bmV3IGcsaWE9bmV3IGcsaGE9bmV3IGcsc2E9bmV3IGcscWE9bmV3IGQscmE9bmV3IGQsd2E9bmV3IGQscGE9MCx2YT0wO3BhPFQubGVuZ3RoO3BhKz05LHZhKz02KXtYLnNldChUW3BhKzBdLFRbcGErMV0sVFtwYSsyXSk7aWEuc2V0KFRbcGErM10sVFtwYSs0XSxUW3BhKzVdKTtoYS5zZXQoVFtwYSs2XSxUW3BhKzddLFRbcGErOF0pO3FhLnNldChXW3ZhKzBdLFdbdmErMV0pO3JhLnNldChXW3ZhKzJdLFdbdmErM10pO3dhLnNldChXW3ZhKzRdLFdbdmErNV0pO3NhLmNvcHkoWCkuYWRkKGlhKS5hZGQoaGEpLmRpdmlkZVNjYWxhcigzKTt2YXIgQ2E9UShzYSk7SihxYSx2YSswLFgsCkNhKTtKKHJhLHZhKzIsaWEsQ2EpO0ood2EsdmErNCxoYSxDYSl9fWZ1bmN0aW9uIEooWCxpYSxoYSxzYSl7MD5zYSYmMT09PVgueCYmKFdbaWFdPVgueC0xKTswPT09aGEueCYmMD09PWhhLnomJihXW2lhXT1zYS8yL01hdGguUEkrLjUpfWZ1bmN0aW9uIFEoWCl7cmV0dXJuIE1hdGguYXRhbjIoWC56LC1YLngpfWZ1bmN0aW9uIFMoWCl7cmV0dXJuIE1hdGguYXRhbjIoLVgueSxNYXRoLnNxcnQoWC54KlgueCtYLnoqWC56KSl9eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt2ZXJ0aWNlczpiLGluZGljZXM6ZSxyYWRpdXM6aCxkZXRhaWw6bX07aD1ofHwxO209bXx8MDt2YXIgVD1bXSxXPVtdOyhmdW5jdGlvbihYKXtmb3IodmFyIGlhPW5ldyBnLGhhPW5ldyBnLHNhPW5ldyBnLHFhPTA7cWE8ZS5sZW5ndGg7cWErPTMpRShlW3FhKzBdLGlhKSxFKGVbcWErMV0saGEpLEUoZVtxYSsyXSxzYSksdShpYSxoYSxzYSwKWCl9KShtKTsoZnVuY3Rpb24oWCl7Zm9yKHZhciBpYT1uZXcgZyxoYT0wO2hhPFQubGVuZ3RoO2hhKz0zKWlhLng9VFtoYSswXSxpYS55PVRbaGErMV0saWEuej1UW2hhKzJdLGlhLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKFgpLFRbaGErMF09aWEueCxUW2hhKzFdPWlhLnksVFtoYSsyXT1pYS56fSkoaCk7KGZ1bmN0aW9uKCl7Zm9yKHZhciBYPW5ldyBnLGlhPTA7aWE8VC5sZW5ndGg7aWErPTMpe1gueD1UW2lhKzBdO1gueT1UW2lhKzFdO1guej1UW2lhKzJdO3ZhciBoYT1RKFgpLzIvTWF0aC5QSSsuNSxzYT1TKFgpL01hdGguUEkrLjU7Vy5wdXNoKGhhLDEtc2EpfUcoKTt3KCl9KSgpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGRhKFQsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBkYShULnNsaWNlKCksMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGRhKFcsMikpOzA9PT1tP3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTp0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKX0KZnVuY3Rpb24ga2goYixlKXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVGV0cmFoZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YixkZXRhaWw6ZX07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFJmKGIsZSkpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFJmKGIsZSl7RmMuY2FsbCh0aGlzLFsxLDEsMSwtMSwtMSwxLC0xLDEsLTEsMSwtMSwtMV0sWzIsMSwwLDAsMywyLDEsMywwLDIsMywxXSxiLGUpO3RoaXMudHlwZT0iVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YixkZXRhaWw6ZX19ZnVuY3Rpb24gbGgoYixlKXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iT2N0YWhlZHJvbkdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLGRldGFpbDplfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgUGUoYixlKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gUGUoYixlKXtGYy5jYWxsKHRoaXMsClsxLDAsMCwtMSwwLDAsMCwxLDAsMCwtMSwwLDAsMCwxLDAsMCwtMV0sWzAsMiw0LDAsNCwzLDAsMyw1LDAsNSwyLDEsMiw1LDEsNSwzLDEsMyw0LDEsNCwyXSxiLGUpO3RoaXMudHlwZT0iT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLGRldGFpbDplfX1mdW5jdGlvbiBtaChiLGUpe3phLmNhbGwodGhpcyk7dGhpcy50eXBlPSJJY29zYWhlZHJvbkdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLGRldGFpbDplfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgU2YoYixlKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gU2YoYixlKXt2YXIgaD0oMStNYXRoLnNxcnQoNSkpLzI7RmMuY2FsbCh0aGlzLFstMSxoLDAsMSxoLDAsLTEsLWgsMCwxLC1oLDAsMCwtMSxoLDAsMSxoLDAsLTEsLWgsMCwxLC1oLGgsMCwtMSxoLDAsMSwtaCwwLC0xLC1oLDAsMV0sWzAsMTEsNSwwLDUsMSwwLDEsNywwLDcsMTAsMCwxMCwxMSwKMSw1LDksNSwxMSw0LDExLDEwLDIsMTAsNyw2LDcsMSw4LDMsOSw0LDMsNCwyLDMsMiw2LDMsNiw4LDMsOCw5LDQsOSw1LDIsNCwxMSw2LDIsMTAsOCw2LDcsOSw4LDFdLGIsZSk7dGhpcy50eXBlPSJJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLGRldGFpbDplfX1mdW5jdGlvbiBuaChiLGUpe3phLmNhbGwodGhpcyk7dGhpcy50eXBlPSJEb2RlY2FoZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YixkZXRhaWw6ZX07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFRmKGIsZSkpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFRmKGIsZSl7dmFyIGg9KDErTWF0aC5zcXJ0KDUpKS8yLG09MS9oO0ZjLmNhbGwodGhpcyxbLTEsLTEsLTEsLTEsLTEsMSwtMSwxLC0xLC0xLDEsMSwxLC0xLC0xLDEsLTEsMSwxLDEsLTEsMSwxLDEsMCwtbSwtaCwwLC1tLGgsMCxtLC1oLDAsbSxoLC1tLC1oLDAsLW0saCwwLG0sCi1oLDAsbSxoLDAsLWgsMCwtbSxoLDAsLW0sLWgsMCxtLGgsMCxtXSxbMywxMSw3LDMsNywxNSwzLDE1LDEzLDcsMTksMTcsNywxNyw2LDcsNiwxNSwxNyw0LDgsMTcsOCwxMCwxNywxMCw2LDgsMCwxNiw4LDE2LDIsOCwyLDEwLDAsMTIsMSwwLDEsMTgsMCwxOCwxNiw2LDEwLDIsNiwyLDEzLDYsMTMsMTUsMiwxNiwxOCwyLDE4LDMsMiwzLDEzLDE4LDEsOSwxOCw5LDExLDE4LDExLDMsNCwxNCwxMiw0LDEyLDAsNCwwLDgsMTEsOSw1LDExLDUsMTksMTEsMTksNywxOSw1LDE0LDE5LDE0LDQsMTksNCwxNywxLDEyLDE0LDEsMTQsNSwxLDUsOV0sYixlKTt0aGlzLnR5cGU9IkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLGRldGFpbDplfX1mdW5jdGlvbiBvaChiLGUsaCxtLHUsdyl7emEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlR1YmVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtwYXRoOmIsdHVidWxhclNlZ21lbnRzOmUscmFkaXVzOmgsCnJhZGlhbFNlZ21lbnRzOm0sY2xvc2VkOnV9O3ZvaWQgMCE9PXcmJmNvbnNvbGUud2FybigiVEhSRUUuVHViZUdlb21ldHJ5OiB0YXBlciBoYXMgYmVlbiByZW1vdmVkLiIpO2I9bmV3IFFlKGIsZSxoLG0sdSk7dGhpcy50YW5nZW50cz1iLnRhbmdlbnRzO3RoaXMubm9ybWFscz1iLm5vcm1hbHM7dGhpcy5iaW5vcm1hbHM9Yi5iaW5vcm1hbHM7dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoYik7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gUWUoYixlLGgsbSx1KXtmdW5jdGlvbiB3KHJhKXtUPWIuZ2V0UG9pbnRBdChyYS9lLFQpO3ZhciB3YT1HLm5vcm1hbHNbcmFdO3JhPUcuYmlub3JtYWxzW3JhXTtmb3IoWD0wO1g8PW07WCsrKXt2YXIgcGE9WC9tKk1hdGguUEkqMix2YT1NYXRoLnNpbihwYSk7cGE9LU1hdGguY29zKHBhKTtRLng9cGEqd2EueCt2YSpyYS54O1EueT1wYSp3YS55K3ZhKnJhLnk7US56PXBhKndhLnordmEqcmEuejtRLm5vcm1hbGl6ZSgpO2hhLnB1c2goUS54LApRLnksUS56KTtKLng9VC54K2gqUS54O0oueT1ULnkraCpRLnk7Si56PVQueitoKlEuejtpYS5wdXNoKEoueCxKLnksSi56KX19ZnVuY3Rpb24gQSgpe2ZvcihYPTE7WDw9ZTtYKyspZm9yKFc9MTtXPD1tO1crKyl7dmFyIHJhPShtKzEpKlgrKFctMSksd2E9KG0rMSkqWCtXLHBhPShtKzEpKihYLTEpK1c7cWEucHVzaCgobSsxKSooWC0xKSsoVy0xKSxyYSxwYSk7cWEucHVzaChyYSx3YSxwYSl9fWZ1bmN0aW9uIEUoKXtmb3IoVz0wO1c8PWU7VysrKWZvcihYPTA7WDw9bTtYKyspUy54PVcvZSxTLnk9WC9tLHNhLnB1c2goUy54LFMueSl9eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlR1YmVCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtwYXRoOmIsdHVidWxhclNlZ21lbnRzOmUscmFkaXVzOmgscmFkaWFsU2VnbWVudHM6bSxjbG9zZWQ6dX07ZT1lfHw2NDtoPWh8fDE7bT1tfHw4O3U9dXx8ITE7dmFyIEc9Yi5jb21wdXRlRnJlbmV0RnJhbWVzKGUsdSk7dGhpcy50YW5nZW50cz0KRy50YW5nZW50czt0aGlzLm5vcm1hbHM9Ry5ub3JtYWxzO3RoaXMuYmlub3JtYWxzPUcuYmlub3JtYWxzO3ZhciBKPW5ldyBnLFE9bmV3IGcsUz1uZXcgZCxUPW5ldyBnLFcsWCxpYT1bXSxoYT1bXSxzYT1bXSxxYT1bXTsoZnVuY3Rpb24oKXtmb3IoVz0wO1c8ZTtXKyspdyhXKTt3KCExPT09dT9lOjApO0UoKTtBKCl9KSgpO3RoaXMuc2V0SW5kZXgocWEpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGRhKGlhLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgZGEoaGEsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGRhKHNhLDIpKX1mdW5jdGlvbiBwaChiLGUsaCxtLHUsdyxBKXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVG9ydXNLbm90R2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmIsdHViZTplLHR1YnVsYXJTZWdtZW50czpoLHJhZGlhbFNlZ21lbnRzOm0scDp1LHE6d307dm9pZCAwIT09QSYmY29uc29sZS53YXJuKCJUSFJFRS5Ub3J1c0tub3RHZW9tZXRyeTogaGVpZ2h0U2NhbGUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5zY2FsZSggeCwgeSwgeiApIGluc3RlYWQuIik7CnRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBVZihiLGUsaCxtLHUsdykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFVmKGIsZSxoLG0sdSx3KXtmdW5jdGlvbiBBKHZhLENhLFZhLFdhLERhKXt2YXIgSWE9TWF0aC5zaW4odmEpO0NhPVZhL0NhKnZhO1ZhPU1hdGguY29zKENhKTtEYS54PVdhKigyK1ZhKSouNSpNYXRoLmNvcyh2YSk7RGEueT1XYSooMitWYSkqSWEqLjU7RGEuej1XYSpNYXRoLnNpbihDYSkqLjV9eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLHR1YmU6ZSx0dWJ1bGFyU2VnbWVudHM6aCxyYWRpYWxTZWdtZW50czptLHA6dSxxOnd9O2I9Ynx8MTtlPWV8fC40O2g9TWF0aC5mbG9vcihoKXx8NjQ7bT1NYXRoLmZsb29yKG0pfHw4O3U9dXx8Mjt3PXd8fDM7dmFyIEU9W10sRz1bXSxKPVtdLFE9W10sUyxUPW5ldyBnLFc9bmV3IGcsWD1uZXcgZyxpYT1uZXcgZyxoYT1uZXcgZywKc2E9bmV3IGcscWE9bmV3IGc7Zm9yKFM9MDtTPD1oOysrUyl7dmFyIHJhPVMvaCp1Kk1hdGguUEkqMjtBKHJhLHUsdyxiLFgpO0EocmErLjAxLHUsdyxiLGlhKTtzYS5zdWJWZWN0b3JzKGlhLFgpO3FhLmFkZFZlY3RvcnMoaWEsWCk7aGEuY3Jvc3NWZWN0b3JzKHNhLHFhKTtxYS5jcm9zc1ZlY3RvcnMoaGEsc2EpO2hhLm5vcm1hbGl6ZSgpO3FhLm5vcm1hbGl6ZSgpO2ZvcihyYT0wO3JhPD1tOysrcmEpe3ZhciB3YT1yYS9tKk1hdGguUEkqMixwYT0tZSpNYXRoLmNvcyh3YSk7d2E9ZSpNYXRoLnNpbih3YSk7VC54PVgueCsocGEqcWEueCt3YSpoYS54KTtULnk9WC55KyhwYSpxYS55K3dhKmhhLnkpO1Quej1YLnorKHBhKnFhLnord2EqaGEueik7Ry5wdXNoKFQueCxULnksVC56KTtXLnN1YlZlY3RvcnMoVCxYKS5ub3JtYWxpemUoKTtKLnB1c2goVy54LFcueSxXLnopO1EucHVzaChTL2gpO1EucHVzaChyYS9tKX19Zm9yKHJhPTE7cmE8PWg7cmErKylmb3IoUz0xO1M8PW07UysrKWI9CihtKzEpKnJhKyhTLTEpLGU9KG0rMSkqcmErUyx1PShtKzEpKihyYS0xKStTLEUucHVzaCgobSsxKSoocmEtMSkrKFMtMSksYix1KSxFLnB1c2goYixlLHUpO3RoaXMuc2V0SW5kZXgoRSk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgZGEoRywzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGRhKEosMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGRhKFEsMikpfWZ1bmN0aW9uIHFoKGIsZSxoLG0sdSl7emEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlRvcnVzR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmIsdHViZTplLHJhZGlhbFNlZ21lbnRzOmgsdHVidWxhclNlZ21lbnRzOm0sYXJjOnV9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBWZihiLGUsaCxtLHUpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBWZihiLGUsaCxtLHUpe3hhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJUb3J1c0J1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9CntyYWRpdXM6Yix0dWJlOmUscmFkaWFsU2VnbWVudHM6aCx0dWJ1bGFyU2VnbWVudHM6bSxhcmM6dX07Yj1ifHwxO2U9ZXx8LjQ7aD1NYXRoLmZsb29yKGgpfHw4O209TWF0aC5mbG9vcihtKXx8Njt1PXV8fDIqTWF0aC5QSTt2YXIgdz1bXSxBPVtdLEU9W10sRz1bXSxKPW5ldyBnLFE9bmV3IGcsUz1uZXcgZyxULFc7Zm9yKFQ9MDtUPD1oO1QrKylmb3IoVz0wO1c8PW07VysrKXt2YXIgWD1XL20qdSxpYT1UL2gqTWF0aC5QSSoyO1EueD0oYitlKk1hdGguY29zKGlhKSkqTWF0aC5jb3MoWCk7US55PShiK2UqTWF0aC5jb3MoaWEpKSpNYXRoLnNpbihYKTtRLno9ZSpNYXRoLnNpbihpYSk7QS5wdXNoKFEueCxRLnksUS56KTtKLng9YipNYXRoLmNvcyhYKTtKLnk9YipNYXRoLnNpbihYKTtTLnN1YlZlY3RvcnMoUSxKKS5ub3JtYWxpemUoKTtFLnB1c2goUy54LFMueSxTLnopO0cucHVzaChXL20pO0cucHVzaChUL2gpfWZvcihUPTE7VDw9aDtUKyspZm9yKFc9MTtXPD1tO1crKyliPShtKwoxKSooVC0xKStXLTEsZT0obSsxKSooVC0xKStXLHU9KG0rMSkqVCtXLHcucHVzaCgobSsxKSpUK1ctMSxiLHUpLHcucHVzaChiLGUsdSk7dGhpcy5zZXRJbmRleCh3KTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBkYShBLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgZGEoRSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgZGEoRywyKSl9ZnVuY3Rpb24gUG4oYixlLGgsbSx1KXtpZih1PT09MDxUcihiLGUsaCxtKSlmb3IodT1lO3U8aDt1Kz1tKXZhciB3PVFuKHUsYlt1XSxiW3UrMV0sdyk7ZWxzZSBmb3IodT1oLW07dT49ZTt1LT1tKXc9UW4odSxiW3VdLGJbdSsxXSx3KTt3JiZSZSh3LHcubmV4dCkmJihyaCh3KSx3PXcubmV4dCk7cmV0dXJuIHd9ZnVuY3Rpb24gc2goYixlKXtpZighYilyZXR1cm4gYjtlfHwoZT1iKTtkb3t2YXIgaD0hMTtpZihiLnN0ZWluZXJ8fCFSZShiLGIubmV4dCkmJjAhPT1uYyhiLnByZXYsYixiLm5leHQpKWI9Yi5uZXh0OwplbHNle3JoKGIpO2I9ZT1iLnByZXY7aWYoYj09PWIubmV4dClicmVhaztoPSEwfX13aGlsZShofHxiIT09ZSk7cmV0dXJuIGV9ZnVuY3Rpb24gdGgoYixlLGgsbSx1LHcsQSl7aWYoYil7IUEmJncmJlVyKGIsbSx1LHcpO2Zvcih2YXIgRT1iLEcsSjtiLnByZXYhPT1iLm5leHQ7KWlmKEc9Yi5wcmV2LEo9Yi5uZXh0LHc/VnIoYixtLHUsdyk6V3IoYikpZS5wdXNoKEcuaS9oKSxlLnB1c2goYi5pL2gpLGUucHVzaChKLmkvaCkscmgoYiksRT1iPUoubmV4dDtlbHNlIGlmKGI9SixiPT09RSl7QT8xPT09QT8oYj1YcihiLGUsaCksdGgoYixlLGgsbSx1LHcsMikpOjI9PT1BJiZZcihiLGUsaCxtLHUsdyk6dGgoc2goYiksZSxoLG0sdSx3LDEpO2JyZWFrfX19ZnVuY3Rpb24gV3IoYil7dmFyIGU9Yi5wcmV2LGg9Yi5uZXh0O2lmKDA8PW5jKGUsYixoKSlyZXR1cm4hMTtmb3IodmFyIG09Yi5uZXh0Lm5leHQ7bSE9PWIucHJldjspe2lmKFdmKGUueCxlLnksYi54LGIueSxoLngsaC55LG0ueCwKbS55KSYmMDw9bmMobS5wcmV2LG0sbS5uZXh0KSlyZXR1cm4hMTttPW0ubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiBWcihiLGUsaCxtKXt2YXIgdT1iLnByZXYsdz1iLm5leHQ7aWYoMDw9bmModSxiLHcpKXJldHVybiExO3ZhciBBPXUueD5iLng/dS54PncueD91Lng6dy54OmIueD53Lng/Yi54OncueCxFPXUueT5iLnk/dS55PncueT91Lnk6dy55OmIueT53Lnk/Yi55OncueSxHPUJrKHUueDxiLng/dS54PHcueD91Lng6dy54OmIueDx3Lng/Yi54OncueCx1Lnk8Yi55P3UueTx3Lnk/dS55OncueTpiLnk8dy55P2IueTp3LnksZSxoLG0pO2U9QmsoQSxFLGUsaCxtKTtoPWIucHJldlo7Zm9yKG09Yi5uZXh0WjtoJiZoLno+PUcmJm0mJm0uejw9ZTspe2lmKGghPT1iLnByZXYmJmghPT1iLm5leHQmJldmKHUueCx1LnksYi54LGIueSx3Lngsdy55LGgueCxoLnkpJiYwPD1uYyhoLnByZXYsaCxoLm5leHQpKXJldHVybiExO2g9aC5wcmV2WjtpZihtIT09Yi5wcmV2JiZtIT09Yi5uZXh0JiZXZih1LngsCnUueSxiLngsYi55LHcueCx3LnksbS54LG0ueSkmJjA8PW5jKG0ucHJldixtLG0ubmV4dCkpcmV0dXJuITE7bT1tLm5leHRafWZvcig7aCYmaC56Pj1HOyl7aWYoaCE9PWIucHJldiYmaCE9PWIubmV4dCYmV2YodS54LHUueSxiLngsYi55LHcueCx3LnksaC54LGgueSkmJjA8PW5jKGgucHJldixoLGgubmV4dCkpcmV0dXJuITE7aD1oLnByZXZafWZvcig7bSYmbS56PD1lOyl7aWYobSE9PWIucHJldiYmbSE9PWIubmV4dCYmV2YodS54LHUueSxiLngsYi55LHcueCx3LnksbS54LG0ueSkmJjA8PW5jKG0ucHJldixtLG0ubmV4dCkpcmV0dXJuITE7bT1tLm5leHRafXJldHVybiEwfWZ1bmN0aW9uIFhyKGIsZSxoKXt2YXIgbT1iO2Rve3ZhciB1PW0ucHJldix3PW0ubmV4dC5uZXh0OyFSZSh1LHcpJiZSbih1LG0sbS5uZXh0LHcpJiZ1aCh1LHcpJiZ1aCh3LHUpJiYoZS5wdXNoKHUuaS9oKSxlLnB1c2gobS5pL2gpLGUucHVzaCh3LmkvaCkscmgobSkscmgobS5uZXh0KSxtPWI9dyk7bT1tLm5leHR9d2hpbGUobSE9PQpiKTtyZXR1cm4gbX1mdW5jdGlvbiBZcihiLGUsaCxtLHUsdyl7dmFyIEE9Yjtkb3tmb3IodmFyIEU9QS5uZXh0Lm5leHQ7RSE9PUEucHJldjspe2lmKEEuaSE9PUUuaSYmWnIoQSxFKSl7Yj1TbihBLEUpO0E9c2goQSxBLm5leHQpO2I9c2goYixiLm5leHQpO3RoKEEsZSxoLG0sdSx3KTt0aChiLGUsaCxtLHUsdyk7cmV0dXJufUU9RS5uZXh0fUE9QS5uZXh0fXdoaWxlKEEhPT1iKX1mdW5jdGlvbiAkcihiLGUsaCxtKXt2YXIgdT1bXSx3O3ZhciBBPTA7Zm9yKHc9ZS5sZW5ndGg7QTx3O0ErKyl7dmFyIEU9ZVtBXSptO3ZhciBHPUE8dy0xP2VbQSsxXSptOmIubGVuZ3RoO0U9UG4oYixFLEcsbSwhMSk7RT09PUUubmV4dCYmKEUuc3RlaW5lcj0hMCk7dS5wdXNoKGFzKEUpKX11LnNvcnQoYnMpO2ZvcihBPTA7QTx1Lmxlbmd0aDtBKyspY3ModVtBXSxoKSxoPXNoKGgsaC5uZXh0KTtyZXR1cm4gaH1mdW5jdGlvbiBicyhiLGUpe3JldHVybiBiLngtZS54fWZ1bmN0aW9uIGNzKGIsZSl7aWYoZT0KZHMoYixlKSliPVNuKGUsYiksc2goYixiLm5leHQpfWZ1bmN0aW9uIGRzKGIsZSl7dmFyIGg9ZSxtPWIueCx1PWIueSx3PS1JbmZpbml0eTtkb3tpZih1PD1oLnkmJnU+PWgubmV4dC55JiZoLm5leHQueSE9PWgueSl7dmFyIEE9aC54Kyh1LWgueSkqKGgubmV4dC54LWgueCkvKGgubmV4dC55LWgueSk7aWYoQTw9bSYmQT53KXt3PUE7aWYoQT09PW0pe2lmKHU9PT1oLnkpcmV0dXJuIGg7aWYodT09PWgubmV4dC55KXJldHVybiBoLm5leHR9dmFyIEU9aC54PGgubmV4dC54P2g6aC5uZXh0fX1oPWgubmV4dH13aGlsZShoIT09ZSk7aWYoIUUpcmV0dXJuIG51bGw7aWYobT09PXcpcmV0dXJuIEUucHJldjtlPUU7QT1FLng7dmFyIEc9RS55LEo9SW5maW5pdHk7Zm9yKGg9RS5uZXh0O2ghPT1lOyl7aWYobT49aC54JiZoLng+PUEmJm0hPT1oLngmJldmKHU8Rz9tOncsdSxBLEcsdTxHP3c6bSx1LGgueCxoLnkpKXt2YXIgUT1NYXRoLmFicyh1LWgueSkvKG0taC54KTsoUTxKfHxRPT09SiYmCmgueD5FLngpJiZ1aChoLGIpJiYoRT1oLEo9USl9aD1oLm5leHR9cmV0dXJuIEV9ZnVuY3Rpb24gVXIoYixlLGgsbSl7dmFyIHU9YjtkbyBudWxsPT09dS56JiYodS56PUJrKHUueCx1LnksZSxoLG0pKSx1LnByZXZaPXUucHJldix1PXUubmV4dFo9dS5uZXh0O3doaWxlKHUhPT1iKTt1LnByZXZaLm5leHRaPW51bGw7dS5wcmV2Wj1udWxsO2VzKHUpfWZ1bmN0aW9uIGVzKGIpe3ZhciBlLGgsbSx1LHc9MTtkb3t2YXIgQT1iO3ZhciBFPWI9bnVsbDtmb3IoaD0wO0E7KXtoKys7dmFyIEc9QTtmb3IoZT1tPTA7ZTx3JiYobSsrLEc9Ry5uZXh0WixHKTtlKyspO2Zvcih1PXc7MDxtfHwwPHUmJkc7KTAhPT1tJiYoMD09PXV8fCFHfHxBLno8PUcueik/KGU9QSxBPUEubmV4dFosbS0tKTooZT1HLEc9Ry5uZXh0Wix1LS0pLEU/RS5uZXh0Wj1lOmI9ZSxlLnByZXZaPUUsRT1lO0E9R31FLm5leHRaPW51bGw7dyo9Mn13aGlsZSgxPGgpO3JldHVybiBifWZ1bmN0aW9uIEJrKGIsZSxoLG0sdSl7Yj0KMzI3NjcqKGItaCkqdTtlPTMyNzY3KihlLW0pKnU7Yj0oYnxiPDw4KSYxNjcxMTkzNTtiPShifGI8PDQpJjI1MjY0NTEzNTtiPShifGI8PDIpJjg1ODk5MzQ1OTtlPShlfGU8PDgpJjE2NzExOTM1O2U9KGV8ZTw8NCkmMjUyNjQ1MTM1O2U9KGV8ZTw8MikmODU4OTkzNDU5O3JldHVybihifGI8PDEpJjE0MzE2NTU3NjV8KChlfGU8PDEpJjE0MzE2NTU3NjUpPDwxfWZ1bmN0aW9uIGFzKGIpe3ZhciBlPWIsaD1iO2Rve2lmKGUueDxoLnh8fGUueD09PWgueCYmZS55PGgueSloPWU7ZT1lLm5leHR9d2hpbGUoZSE9PWIpO3JldHVybiBofWZ1bmN0aW9uIFdmKGIsZSxoLG0sdSx3LEEsRSl7cmV0dXJuIDA8PSh1LUEpKihlLUUpLShiLUEpKih3LUUpJiYwPD0oYi1BKSoobS1FKS0oaC1BKSooZS1FKSYmMDw9KGgtQSkqKHctRSktKHUtQSkqKG0tRSl9ZnVuY3Rpb24gWnIoYixlKXtyZXR1cm4gYi5uZXh0LmkhPT1lLmkmJmIucHJldi5pIT09ZS5pJiYhZnMoYixlKSYmdWgoYixlKSYmdWgoZSxiKSYmCmdzKGIsZSl9ZnVuY3Rpb24gbmMoYixlLGgpe3JldHVybihlLnktYi55KSooaC54LWUueCktKGUueC1iLngpKihoLnktZS55KX1mdW5jdGlvbiBSZShiLGUpe3JldHVybiBiLng9PT1lLngmJmIueT09PWUueX1mdW5jdGlvbiBSbihiLGUsaCxtKXtyZXR1cm4gUmUoYixoKSYmUmUoZSxtKXx8UmUoYixtKSYmUmUoaCxlKT8hMDowPG5jKGIsZSxoKSE9PTA8bmMoYixlLG0pJiYwPG5jKGgsbSxiKSE9PTA8bmMoaCxtLGUpfWZ1bmN0aW9uIGZzKGIsZSl7dmFyIGg9Yjtkb3tpZihoLmkhPT1iLmkmJmgubmV4dC5pIT09Yi5pJiZoLmkhPT1lLmkmJmgubmV4dC5pIT09ZS5pJiZSbihoLGgubmV4dCxiLGUpKXJldHVybiEwO2g9aC5uZXh0fXdoaWxlKGghPT1iKTtyZXR1cm4hMX1mdW5jdGlvbiB1aChiLGUpe3JldHVybiAwPm5jKGIucHJldixiLGIubmV4dCk/MDw9bmMoYixlLGIubmV4dCkmJjA8PW5jKGIsYi5wcmV2LGUpOjA+bmMoYixlLGIucHJldil8fDA+bmMoYixiLm5leHQsZSl9ZnVuY3Rpb24gZ3MoYiwKZSl7dmFyIGg9YixtPSExLHU9KGIueCtlLngpLzI7ZT0oYi55K2UueSkvMjtkbyBoLnk+ZSE9PWgubmV4dC55PmUmJmgubmV4dC55IT09aC55JiZ1PChoLm5leHQueC1oLngpKihlLWgueSkvKGgubmV4dC55LWgueSkraC54JiYobT0hbSksaD1oLm5leHQ7d2hpbGUoaCE9PWIpO3JldHVybiBtfWZ1bmN0aW9uIFNuKGIsZSl7dmFyIGg9bmV3IENrKGIuaSxiLngsYi55KSxtPW5ldyBDayhlLmksZS54LGUueSksdT1iLm5leHQsdz1lLnByZXY7Yi5uZXh0PWU7ZS5wcmV2PWI7aC5uZXh0PXU7dS5wcmV2PWg7bS5uZXh0PWg7aC5wcmV2PW07dy5uZXh0PW07bS5wcmV2PXc7cmV0dXJuIG19ZnVuY3Rpb24gUW4oYixlLGgsbSl7Yj1uZXcgQ2soYixlLGgpO20/KGIubmV4dD1tLm5leHQsYi5wcmV2PW0sbS5uZXh0LnByZXY9YixtLm5leHQ9Yik6KGIucHJldj1iLGIubmV4dD1iKTtyZXR1cm4gYn1mdW5jdGlvbiByaChiKXtiLm5leHQucHJldj1iLnByZXY7Yi5wcmV2Lm5leHQ9Yi5uZXh0O2IucHJldlomJgooYi5wcmV2Wi5uZXh0Wj1iLm5leHRaKTtiLm5leHRaJiYoYi5uZXh0Wi5wcmV2Wj1iLnByZXZaKX1mdW5jdGlvbiBDayhiLGUsaCl7dGhpcy5pPWI7dGhpcy54PWU7dGhpcy55PWg7dGhpcy5uZXh0Wj10aGlzLnByZXZaPXRoaXMuej10aGlzLm5leHQ9dGhpcy5wcmV2PW51bGw7dGhpcy5zdGVpbmVyPSExfWZ1bmN0aW9uIFRyKGIsZSxoLG0pe2Zvcih2YXIgdT0wLHc9aC1tO2U8aDtlKz1tKXUrPShiW3ddLWJbZV0pKihiW2UrMV0rYlt3KzFdKSx3PWU7cmV0dXJuIHV9ZnVuY3Rpb24gVG4oYil7dmFyIGU9Yi5sZW5ndGg7MjxlJiZiW2UtMV0uZXF1YWxzKGJbMF0pJiZiLnBvcCgpfWZ1bmN0aW9uIFVuKGIsZSl7Zm9yKHZhciBoPTA7aDxlLmxlbmd0aDtoKyspYi5wdXNoKGVbaF0ueCksYi5wdXNoKGVbaF0ueSl9ZnVuY3Rpb24gU2UoYixlKXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iRXh0cnVkZUdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3NoYXBlczpiLG9wdGlvbnM6ZX07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IHpkKGIsCmUpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiB6ZChiLGUpe2Z1bmN0aW9uIGgoRyl7ZnVuY3Rpb24gSihTYSxqYixxYil7amJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0Iik7cmV0dXJuIGpiLmNsb25lKCkubXVsdGlwbHlTY2FsYXIocWIpLmFkZChTYSl9ZnVuY3Rpb24gUShTYSxqYixxYil7dmFyIHRiPVNhLngtamIueDt2YXIgeGI9U2EueS1qYi55O3ZhciBXYj1xYi54LVNhLng7dmFyIGljPXFiLnktU2EueSxKYz10Yip0Yit4Yip4YjtpZihNYXRoLmFicyh0YippYy14YipXYik+TnVtYmVyLkVQU0lMT04pe3ZhciB5ZD1NYXRoLnNxcnQoSmMpLGJkPU1hdGguc3FydChXYipXYitpYyppYyk7SmM9amIueC14Yi95ZDtqYj1qYi55K3RiL3lkO2ljPSgocWIueC1pYy9iZC1KYykqaWMtKHFiLnkrV2IvYmQtamIpKldiKS8odGIqaWMteGIqV2IpO1diPUpjK3RiKmljLVNhLng7dGI9amIreGIqaWMtU2EueTt4Yj1XYioKV2IrdGIqdGI7aWYoMj49eGIpcmV0dXJuIG5ldyBkKFdiLHRiKTt4Yj1NYXRoLnNxcnQoeGIvMil9ZWxzZSBTYT0hMSx0Yj5OdW1iZXIuRVBTSUxPTj9XYj5OdW1iZXIuRVBTSUxPTiYmKFNhPSEwKTp0YjwtTnVtYmVyLkVQU0lMT04/V2I8LU51bWJlci5FUFNJTE9OJiYoU2E9ITApOk1hdGguc2lnbih4Yik9PT1NYXRoLnNpZ24oaWMpJiYoU2E9ITApLFNhPyhXYj0teGIseGI9TWF0aC5zcXJ0KEpjKSk6KFdiPXRiLHRiPXhiLHhiPU1hdGguc3FydChKYy8yKSk7cmV0dXJuIG5ldyBkKFdiL3hiLHRiL3hiKX1mdW5jdGlvbiBTKFNhLGpiKXtmb3Ioa2E9U2EubGVuZ3RoOzA8PS0ta2E7KXt2YXIgcWI9a2E7dmFyIHRiPWthLTE7MD50YiYmKHRiPVNhLmxlbmd0aC0xKTt2YXIgeGIsV2I9cmErMipXYTtmb3IoeGI9MDt4YjxXYjt4YisrKXt2YXIgaWM9JGEqeGIsSmM9JGEqKHhiKzEpO1goamIrcWIraWMsamIrdGIraWMsamIrdGIrSmMsamIrcWIrSmMpfX19ZnVuY3Rpb24gVChTYSxqYixxYil7c2EucHVzaChTYSk7CnNhLnB1c2goamIpO3NhLnB1c2gocWIpfWZ1bmN0aW9uIFcoU2EsamIscWIpe2lhKFNhKTtpYShqYik7aWEocWIpO1NhPXUubGVuZ3RoLzM7U2E9SWEuZ2VuZXJhdGVUb3BVVihtLHUsU2EtMyxTYS0yLFNhLTEpO2hhKFNhWzBdKTtoYShTYVsxXSk7aGEoU2FbMl0pfWZ1bmN0aW9uIFgoU2EsamIscWIsdGIpe2lhKFNhKTtpYShqYik7aWEodGIpO2lhKGpiKTtpYShxYik7aWEodGIpO1NhPXUubGVuZ3RoLzM7U2E9SWEuZ2VuZXJhdGVTaWRlV2FsbFVWKG0sdSxTYS02LFNhLTMsU2EtMixTYS0xKTtoYShTYVswXSk7aGEoU2FbMV0pO2hhKFNhWzNdKTtoYShTYVsxXSk7aGEoU2FbMl0pO2hhKFNhWzNdKX1mdW5jdGlvbiBpYShTYSl7dS5wdXNoKHNhWzMqU2FdKTt1LnB1c2goc2FbMypTYSsxXSk7dS5wdXNoKHNhWzMqU2ErMl0pfWZ1bmN0aW9uIGhhKFNhKXt3LnB1c2goU2EueCk7dy5wdXNoKFNhLnkpfXZhciBzYT1bXSxxYT12b2lkIDAhPT1lLmN1cnZlU2VnbWVudHM/ZS5jdXJ2ZVNlZ21lbnRzOgoxMixyYT12b2lkIDAhPT1lLnN0ZXBzP2Uuc3RlcHM6MSx3YT12b2lkIDAhPT1lLmRlcHRoP2UuZGVwdGg6MTAwLHBhPXZvaWQgMCE9PWUuYmV2ZWxFbmFibGVkP2UuYmV2ZWxFbmFibGVkOiEwLHZhPXZvaWQgMCE9PWUuYmV2ZWxUaGlja25lc3M/ZS5iZXZlbFRoaWNrbmVzczo2LENhPXZvaWQgMCE9PWUuYmV2ZWxTaXplP2UuYmV2ZWxTaXplOnZhLTIsVmE9dm9pZCAwIT09ZS5iZXZlbE9mZnNldD9lLmJldmVsT2Zmc2V0OjAsV2E9dm9pZCAwIT09ZS5iZXZlbFNlZ21lbnRzP2UuYmV2ZWxTZWdtZW50czozLERhPWUuZXh0cnVkZVBhdGgsSWE9dm9pZCAwIT09ZS5VVkdlbmVyYXRvcj9lLlVWR2VuZXJhdG9yOmhzO3ZvaWQgMCE9PWUuYW1vdW50JiYoY29uc29sZS53YXJuKCJUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IGFtb3VudCBoYXMgYmVlbiByZW5hbWVkIHRvIGRlcHRoLiIpLHdhPWUuYW1vdW50KTt2YXIgRWE9ITE7aWYoRGEpe3ZhciBPYT1EYS5nZXRTcGFjZWRQb2ludHMocmEpOwpFYT0hMDtwYT0hMTt2YXIgaGI9RGEuY29tcHV0ZUZyZW5ldEZyYW1lcyhyYSwhMSk7dmFyIHliPW5ldyBnO3ZhciBMYT1uZXcgZzt2YXIgZWI9bmV3IGd9cGF8fChWYT1DYT12YT1XYT0wKTt2YXIgbmI7cWE9Ry5leHRyYWN0UG9pbnRzKHFhKTtHPXFhLnNoYXBlO3ZhciBOYj1xYS5ob2xlcztpZighT2QuaXNDbG9ja1dpc2UoRykpe0c9Ry5yZXZlcnNlKCk7dmFyIERiPTA7Zm9yKG5iPU5iLmxlbmd0aDtEYjxuYjtEYisrKXt2YXIgamE9TmJbRGJdO09kLmlzQ2xvY2tXaXNlKGphKSYmKE5iW0RiXT1qYS5yZXZlcnNlKCkpfX12YXIgb2E9T2QudHJpYW5ndWxhdGVTaGFwZShHLE5iKSxBYT1HO0RiPTA7Zm9yKG5iPU5iLmxlbmd0aDtEYjxuYjtEYisrKWphPU5iW0RiXSxHPUcuY29uY2F0KGphKTt2YXIgS2EsJGE9Ry5sZW5ndGgsUGEsZmI9b2EubGVuZ3RoO3FhPVtdO3ZhciBrYT0wO3ZhciBIYT1BYS5sZW5ndGg7dmFyIE5hPUhhLTE7Zm9yKEthPWthKzE7a2E8SGE7a2ErKyxOYSsrLEthKyspTmE9PT0KSGEmJihOYT0wKSxLYT09PUhhJiYoS2E9MCkscWFba2FdPVEoQWFba2FdLEFhW05hXSxBYVtLYV0pO0RhPVtdO3ZhciByYj1xYS5jb25jYXQoKTtEYj0wO2ZvcihuYj1OYi5sZW5ndGg7RGI8bmI7RGIrKyl7amE9TmJbRGJdO3ZhciBYYT1bXTtrYT0wO0hhPWphLmxlbmd0aDtOYT1IYS0xO2ZvcihLYT1rYSsxO2thPEhhO2thKyssTmErKyxLYSsrKU5hPT09SGEmJihOYT0wKSxLYT09PUhhJiYoS2E9MCksWGFba2FdPVEoamFba2FdLGphW05hXSxqYVtLYV0pO0RhLnB1c2goWGEpO3JiPXJiLmNvbmNhdChYYSl9Zm9yKE5hPTA7TmE8V2E7TmErKyl7SGE9TmEvV2E7dmFyIG1iPXZhKk1hdGguY29zKEhhKk1hdGguUEkvMik7S2E9Q2EqTWF0aC5zaW4oSGEqTWF0aC5QSS8yKStWYTtrYT0wO2ZvcihIYT1BYS5sZW5ndGg7a2E8SGE7a2ErKyl7dmFyIG9iPUooQWFba2FdLHFhW2thXSxLYSk7VChvYi54LG9iLnksLW1iKX1EYj0wO2ZvcihuYj1OYi5sZW5ndGg7RGI8bmI7RGIrKylmb3IoamE9Ck5iW0RiXSxYYT1EYVtEYl0sa2E9MCxIYT1qYS5sZW5ndGg7a2E8SGE7a2ErKylvYj1KKGphW2thXSxYYVtrYV0sS2EpLFQob2IueCxvYi55LC1tYil9S2E9Q2ErVmE7Zm9yKGthPTA7a2E8JGE7a2ErKylvYj1wYT9KKEdba2FdLHJiW2thXSxLYSk6R1trYV0sRWE/KExhLmNvcHkoaGIubm9ybWFsc1swXSkubXVsdGlwbHlTY2FsYXIob2IueCkseWIuY29weShoYi5iaW5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKG9iLnkpLGViLmNvcHkoT2FbMF0pLmFkZChMYSkuYWRkKHliKSxUKGViLngsZWIueSxlYi56KSk6VChvYi54LG9iLnksMCk7Zm9yKEhhPTE7SGE8PXJhO0hhKyspZm9yKGthPTA7a2E8JGE7a2ErKylvYj1wYT9KKEdba2FdLHJiW2thXSxLYSk6R1trYV0sRWE/KExhLmNvcHkoaGIubm9ybWFsc1tIYV0pLm11bHRpcGx5U2NhbGFyKG9iLngpLHliLmNvcHkoaGIuYmlub3JtYWxzW0hhXSkubXVsdGlwbHlTY2FsYXIob2IueSksZWIuY29weShPYVtIYV0pLmFkZChMYSkuYWRkKHliKSwKVChlYi54LGViLnksZWIueikpOlQob2IueCxvYi55LHdhL3JhKkhhKTtmb3IoTmE9V2EtMTswPD1OYTtOYS0tKXtIYT1OYS9XYTttYj12YSpNYXRoLmNvcyhIYSpNYXRoLlBJLzIpO0thPUNhKk1hdGguc2luKEhhKk1hdGguUEkvMikrVmE7a2E9MDtmb3IoSGE9QWEubGVuZ3RoO2thPEhhO2thKyspb2I9SihBYVtrYV0scWFba2FdLEthKSxUKG9iLngsb2IueSx3YSttYik7RGI9MDtmb3IobmI9TmIubGVuZ3RoO0RiPG5iO0RiKyspZm9yKGphPU5iW0RiXSxYYT1EYVtEYl0sa2E9MCxIYT1qYS5sZW5ndGg7a2E8SGE7a2ErKylvYj1KKGphW2thXSxYYVtrYV0sS2EpLEVhP1Qob2IueCxvYi55K09hW3JhLTFdLnksT2FbcmEtMV0ueCttYik6VChvYi54LG9iLnksd2ErbWIpfShmdW5jdGlvbigpe3ZhciBTYT11Lmxlbmd0aC8zO2lmKHBhKXt2YXIgamI9MCokYTtmb3Ioa2E9MDtrYTxmYjtrYSsrKVBhPW9hW2thXSxXKFBhWzJdK2piLFBhWzFdK2piLFBhWzBdK2piKTtqYj0kYSoocmErMipXYSk7CmZvcihrYT0wO2thPGZiO2thKyspUGE9b2Fba2FdLFcoUGFbMF0ramIsUGFbMV0ramIsUGFbMl0ramIpfWVsc2V7Zm9yKGthPTA7a2E8ZmI7a2ErKylQYT1vYVtrYV0sVyhQYVsyXSxQYVsxXSxQYVswXSk7Zm9yKGthPTA7a2E8ZmI7a2ErKylQYT1vYVtrYV0sVyhQYVswXSskYSpyYSxQYVsxXSskYSpyYSxQYVsyXSskYSpyYSl9bS5hZGRHcm91cChTYSx1Lmxlbmd0aC8zLVNhLDApfSkoKTsoZnVuY3Rpb24oKXt2YXIgU2E9dS5sZW5ndGgvMyxqYj0wO1MoQWEsamIpO2piKz1BYS5sZW5ndGg7RGI9MDtmb3IobmI9TmIubGVuZ3RoO0RiPG5iO0RiKyspamE9TmJbRGJdLFMoamEsamIpLGpiKz1qYS5sZW5ndGg7bS5hZGRHcm91cChTYSx1Lmxlbmd0aC8zLVNhLDEpfSkoKX14YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iRXh0cnVkZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3NoYXBlczpiLG9wdGlvbnM6ZX07Yj1BcnJheS5pc0FycmF5KGIpP2I6W2JdO2Zvcih2YXIgbT10aGlzLAp1PVtdLHc9W10sQT0wLEU9Yi5sZW5ndGg7QTxFO0ErKyloKGJbQV0pO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGRhKHUsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGRhKHcsMikpO3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKX1mdW5jdGlvbiBWbihiLGUsaCl7aC5zaGFwZXM9W107aWYoQXJyYXkuaXNBcnJheShiKSlmb3IodmFyIG09MCx1PWIubGVuZ3RoO208dTttKyspaC5zaGFwZXMucHVzaChiW21dLnV1aWQpO2Vsc2UgaC5zaGFwZXMucHVzaChiLnV1aWQpO3ZvaWQgMCE9PWUuZXh0cnVkZVBhdGgmJihoLm9wdGlvbnMuZXh0cnVkZVBhdGg9ZS5leHRydWRlUGF0aC50b0pTT04oKSk7cmV0dXJuIGh9ZnVuY3Rpb24gdmgoYixlKXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVGV4dEdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3RleHQ6YixwYXJhbWV0ZXJzOmV9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBYZihiLGUpKTt0aGlzLm1lcmdlVmVydGljZXMoKX0KZnVuY3Rpb24gWGYoYixlKXtlPWV8fHt9O3ZhciBoPWUuZm9udDtpZighaHx8IWguaXNGb250KXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5UZXh0R2VvbWV0cnk6IGZvbnQgcGFyYW1ldGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5Gb250LiIpLG5ldyB6YTtiPWguZ2VuZXJhdGVTaGFwZXMoYixlLnNpemUpO2UuZGVwdGg9dm9pZCAwIT09ZS5oZWlnaHQ/ZS5oZWlnaHQ6NTA7dm9pZCAwPT09ZS5iZXZlbFRoaWNrbmVzcyYmKGUuYmV2ZWxUaGlja25lc3M9MTApO3ZvaWQgMD09PWUuYmV2ZWxTaXplJiYoZS5iZXZlbFNpemU9OCk7dm9pZCAwPT09ZS5iZXZlbEVuYWJsZWQmJihlLmJldmVsRW5hYmxlZD0hMSk7emQuY2FsbCh0aGlzLGIsZSk7dGhpcy50eXBlPSJUZXh0QnVmZmVyR2VvbWV0cnkifWZ1bmN0aW9uIHdoKGIsZSxoLG0sdSx3LEEpe3phLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcGhlcmVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6Yix3aWR0aFNlZ21lbnRzOmUsCmhlaWdodFNlZ21lbnRzOmgscGhpU3RhcnQ6bSxwaGlMZW5ndGg6dSx0aGV0YVN0YXJ0OncsdGhldGFMZW5ndGg6QX07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IHNlKGIsZSxoLG0sdSx3LEEpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBzZShiLGUsaCxtLHUsdyxBKXt4YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU3BoZXJlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmIsd2lkdGhTZWdtZW50czplLGhlaWdodFNlZ21lbnRzOmgscGhpU3RhcnQ6bSxwaGlMZW5ndGg6dSx0aGV0YVN0YXJ0OncsdGhldGFMZW5ndGg6QX07Yj1ifHwxO2U9TWF0aC5tYXgoMyxNYXRoLmZsb29yKGUpfHw4KTtoPU1hdGgubWF4KDIsTWF0aC5mbG9vcihoKXx8Nik7bT12b2lkIDAhPT1tP206MDt1PXZvaWQgMCE9PXU/dToyKk1hdGguUEk7dz12b2lkIDAhPT13P3c6MDtBPXZvaWQgMCE9PUE/QTpNYXRoLlBJO3ZhciBFPU1hdGgubWluKHcrQSxNYXRoLlBJKSxHLApKLFE9MCxTPVtdLFQ9bmV3IGcsVz1uZXcgZyxYPVtdLGlhPVtdLGhhPVtdLHNhPVtdO2ZvcihKPTA7Sjw9aDtKKyspe3ZhciBxYT1bXSxyYT1KL2gsd2E9MDswPT1KJiYwPT13P3dhPS41L2U6Sj09aCYmRT09TWF0aC5QSSYmKHdhPS0uNS9lKTtmb3IoRz0wO0c8PWU7RysrKXt2YXIgcGE9Ry9lO1QueD0tYipNYXRoLmNvcyhtK3BhKnUpKk1hdGguc2luKHcrcmEqQSk7VC55PWIqTWF0aC5jb3ModytyYSpBKTtULno9YipNYXRoLnNpbihtK3BhKnUpKk1hdGguc2luKHcrcmEqQSk7aWEucHVzaChULngsVC55LFQueik7Vy5jb3B5KFQpLm5vcm1hbGl6ZSgpO2hhLnB1c2goVy54LFcueSxXLnopO3NhLnB1c2gocGErd2EsMS1yYSk7cWEucHVzaChRKyspfVMucHVzaChxYSl9Zm9yKEo9MDtKPGg7SisrKWZvcihHPTA7RzxlO0crKyliPVNbSl1bRysxXSxtPVNbSl1bR10sdT1TW0orMV1bR10sQT1TW0orMV1bRysxXSwoMCE9PUp8fDA8dykmJlgucHVzaChiLG0sQSksKEohPT1oLTF8fEU8TWF0aC5QSSkmJgpYLnB1c2gobSx1LEEpO3RoaXMuc2V0SW5kZXgoWCk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgZGEoaWEsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBkYShoYSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgZGEoc2EsMikpfWZ1bmN0aW9uIHhoKGIsZSxoLG0sdSx3KXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUmluZ0dlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e2lubmVyUmFkaXVzOmIsb3V0ZXJSYWRpdXM6ZSx0aGV0YVNlZ21lbnRzOmgscGhpU2VnbWVudHM6bSx0aGV0YVN0YXJ0OnUsdGhldGFMZW5ndGg6d307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFlmKGIsZSxoLG0sdSx3KSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gWWYoYixlLGgsbSx1LHcpe3hhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJSaW5nQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17aW5uZXJSYWRpdXM6YixvdXRlclJhZGl1czplLHRoZXRhU2VnbWVudHM6aCwKcGhpU2VnbWVudHM6bSx0aGV0YVN0YXJ0OnUsdGhldGFMZW5ndGg6d307Yj1ifHwuNTtlPWV8fDE7dT12b2lkIDAhPT11P3U6MDt3PXZvaWQgMCE9PXc/dzoyKk1hdGguUEk7aD12b2lkIDAhPT1oP01hdGgubWF4KDMsaCk6ODttPXZvaWQgMCE9PW0/TWF0aC5tYXgoMSxtKToxO3ZhciBBPVtdLEU9W10sRz1bXSxKPVtdLFE9YixTPShlLWIpL20sVD1uZXcgZyxXPW5ldyBkLFgsaWE7Zm9yKFg9MDtYPD1tO1grKyl7Zm9yKGlhPTA7aWE8PWg7aWErKyliPXUraWEvaCp3LFQueD1RKk1hdGguY29zKGIpLFQueT1RKk1hdGguc2luKGIpLEUucHVzaChULngsVC55LFQueiksRy5wdXNoKDAsMCwxKSxXLng9KFQueC9lKzEpLzIsVy55PShULnkvZSsxKS8yLEoucHVzaChXLngsVy55KTtRKz1TfWZvcihYPTA7WDxtO1grKylmb3IoZT1YKihoKzEpLGlhPTA7aWE8aDtpYSsrKWI9aWErZSx1PWIraCsxLHc9YitoKzIsUT1iKzEsQS5wdXNoKGIsdSxRKSxBLnB1c2godSx3LFEpO3RoaXMuc2V0SW5kZXgoQSk7CnRoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGRhKEUsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBkYShHLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBkYShKLDIpKX1mdW5jdGlvbiB5aChiLGUsaCxtKXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTGF0aGVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtwb2ludHM6YixzZWdtZW50czplLHBoaVN0YXJ0OmgscGhpTGVuZ3RoOm19O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBaZihiLGUsaCxtKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gWmYoYixlLGgsbSl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxhdGhlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cG9pbnRzOmIsc2VnbWVudHM6ZSxwaGlTdGFydDpoLHBoaUxlbmd0aDptfTtlPU1hdGguZmxvb3IoZSl8fDEyO2g9aHx8MDttPW18fDIqTWF0aC5QSTttPWxiLmNsYW1wKG0sMCwyKk1hdGguUEkpO3ZhciB1PQpbXSx3PVtdLEE9W10sRT0xL2UsRz1uZXcgZyxKPW5ldyBkLFE7Zm9yKFE9MDtRPD1lO1ErKyl7dmFyIFM9aCtRKkUqbTt2YXIgVD1NYXRoLnNpbihTKSxXPU1hdGguY29zKFMpO2ZvcihTPTA7Uzw9Yi5sZW5ndGgtMTtTKyspRy54PWJbU10ueCpULEcueT1iW1NdLnksRy56PWJbU10ueCpXLHcucHVzaChHLngsRy55LEcueiksSi54PVEvZSxKLnk9Uy8oYi5sZW5ndGgtMSksQS5wdXNoKEoueCxKLnkpfWZvcihRPTA7UTxlO1ErKylmb3IoUz0wO1M8Yi5sZW5ndGgtMTtTKyspaD1TK1EqYi5sZW5ndGgsRT1oK2IubGVuZ3RoLEc9aCtiLmxlbmd0aCsxLEo9aCsxLHUucHVzaChoLEUsSiksdS5wdXNoKEUsRyxKKTt0aGlzLnNldEluZGV4KHUpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGRhKHcsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGRhKEEsMikpO3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtpZihtPT09MipNYXRoLlBJKWZvcihtPXRoaXMuYXR0cmlidXRlcy5ub3JtYWwuYXJyYXksCnU9bmV3IGcsdz1uZXcgZyxBPW5ldyBnLGg9ZSpiLmxlbmd0aCozLFM9UT0wO1E8Yi5sZW5ndGg7USsrLFMrPTMpdS54PW1bUyswXSx1Lnk9bVtTKzFdLHUuej1tW1MrMl0sdy54PW1baCtTKzBdLHcueT1tW2grUysxXSx3Lno9bVtoK1MrMl0sQS5hZGRWZWN0b3JzKHUsdykubm9ybWFsaXplKCksbVtTKzBdPW1baCtTKzBdPUEueCxtW1MrMV09bVtoK1MrMV09QS55LG1bUysyXT1tW2grUysyXT1BLnp9ZnVuY3Rpb24gVGUoYixlKXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU2hhcGVHZW9tZXRyeSI7Im9iamVjdCI9PT10eXBlb2YgZSYmKGNvbnNvbGUud2FybigiVEhSRUUuU2hhcGVHZW9tZXRyeTogT3B0aW9ucyBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVtb3ZlZC4iKSxlPWUuY3VydmVTZWdtZW50cyk7dGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6YixjdXJ2ZVNlZ21lbnRzOmV9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBVZShiLGUpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBVZShiLAplKXtmdW5jdGlvbiBoKFEpe3ZhciBTLFQ9dS5sZW5ndGgvMztRPVEuZXh0cmFjdFBvaW50cyhlKTt2YXIgVz1RLnNoYXBlLFg9US5ob2xlczshMT09PU9kLmlzQ2xvY2tXaXNlKFcpJiYoVz1XLnJldmVyc2UoKSk7UT0wO2ZvcihTPVgubGVuZ3RoO1E8UztRKyspe3ZhciBpYT1YW1FdOyEwPT09T2QuaXNDbG9ja1dpc2UoaWEpJiYoWFtRXT1pYS5yZXZlcnNlKCkpfXZhciBoYT1PZC50cmlhbmd1bGF0ZVNoYXBlKFcsWCk7UT0wO2ZvcihTPVgubGVuZ3RoO1E8UztRKyspaWE9WFtRXSxXPVcuY29uY2F0KGlhKTtRPTA7Zm9yKFM9Vy5sZW5ndGg7UTxTO1ErKylpYT1XW1FdLHUucHVzaChpYS54LGlhLnksMCksdy5wdXNoKDAsMCwxKSxBLnB1c2goaWEueCxpYS55KTtRPTA7Zm9yKFM9aGEubGVuZ3RoO1E8UztRKyspVz1oYVtRXSxtLnB1c2goV1swXStULFdbMV0rVCxXWzJdK1QpLEcrPTN9eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYXBlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz0Ke3NoYXBlczpiLGN1cnZlU2VnbWVudHM6ZX07ZT1lfHwxMjt2YXIgbT1bXSx1PVtdLHc9W10sQT1bXSxFPTAsRz0wO2lmKCExPT09QXJyYXkuaXNBcnJheShiKSloKGIpO2Vsc2UgZm9yKHZhciBKPTA7SjxiLmxlbmd0aDtKKyspaChiW0pdKSx0aGlzLmFkZEdyb3VwKEUsRyxKKSxFKz1HLEc9MDt0aGlzLnNldEluZGV4KG0pO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGRhKHUsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBkYSh3LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBkYShBLDIpKX1mdW5jdGlvbiBXbihiLGUpe2Uuc2hhcGVzPVtdO2lmKEFycmF5LmlzQXJyYXkoYikpZm9yKHZhciBoPTAsbT1iLmxlbmd0aDtoPG07aCsrKWUuc2hhcGVzLnB1c2goYltoXS51dWlkKTtlbHNlIGUuc2hhcGVzLnB1c2goYi51dWlkKTtyZXR1cm4gZX1mdW5jdGlvbiAkZihiLGUpe3hhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJFZGdlc0dlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9Cnt0aHJlc2hvbGRBbmdsZTplfTt2YXIgaD1bXTtlPU1hdGguY29zKGxiLkRFRzJSQUQqKHZvaWQgMCE9PWU/ZToxKSk7dmFyIG09WzAsMF0sdT17fSx3PVsiYSIsImIiLCJjIl07aWYoYi5pc0J1ZmZlckdlb21ldHJ5KXt2YXIgQT1uZXcgemE7QS5mcm9tQnVmZmVyR2VvbWV0cnkoYil9ZWxzZSBBPWIuY2xvbmUoKTtBLm1lcmdlVmVydGljZXMoKTtBLmNvbXB1dGVGYWNlTm9ybWFscygpO2I9QS52ZXJ0aWNlcztBPUEuZmFjZXM7Zm9yKHZhciBFPTAsRz1BLmxlbmd0aDtFPEc7RSsrKWZvcih2YXIgSj1BW0VdLFE9MDszPlE7USsrKXt2YXIgUz1KW3dbUV1dO3ZhciBUPUpbd1soUSsxKSUzXV07bVswXT1NYXRoLm1pbihTLFQpO21bMV09TWF0aC5tYXgoUyxUKTtTPW1bMF0rIiwiK21bMV07dm9pZCAwPT09dVtTXT91W1NdPXtpbmRleDE6bVswXSxpbmRleDI6bVsxXSxmYWNlMTpFLGZhY2UyOnZvaWQgMH06dVtTXS5mYWNlMj1FfWZvcihTIGluIHUpaWYobT11W1NdLHZvaWQgMD09PW0uZmFjZTJ8fApBW20uZmFjZTFdLm5vcm1hbC5kb3QoQVttLmZhY2UyXS5ub3JtYWwpPD1lKXc9YlttLmluZGV4MV0saC5wdXNoKHcueCx3Lnksdy56KSx3PWJbbS5pbmRleDJdLGgucHVzaCh3Lngsdy55LHcueik7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgZGEoaCwzKSl9ZnVuY3Rpb24gVmUoYixlLGgsbSx1LHcsQSxFKXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ3lsaW5kZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXNUb3A6YixyYWRpdXNCb3R0b206ZSxoZWlnaHQ6aCxyYWRpYWxTZWdtZW50czptLGhlaWdodFNlZ21lbnRzOnUsb3BlbkVuZGVkOncsdGhldGFTdGFydDpBLHRoZXRhTGVuZ3RoOkV9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBQZChiLGUsaCxtLHUsdyxBLEUpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBQZChiLGUsaCxtLHUsdyxBLEUpe2Z1bmN0aW9uIEcocWEpe3ZhciByYSx3YT1uZXcgZCxwYT1uZXcgZyx2YT0wLENhPSEwPT09CnFhP2I6ZSxWYT0hMD09PXFhPzE6LTE7dmFyIFdhPVg7Zm9yKHJhPTE7cmE8PW07cmErKylTLnB1c2goMCxoYSpWYSwwKSxULnB1c2goMCxWYSwwKSxXLnB1c2goLjUsLjUpLFgrKzt2YXIgRGE9WDtmb3IocmE9MDtyYTw9bTtyYSsrKXt2YXIgSWE9cmEvbSpFK0EsRWE9TWF0aC5jb3MoSWEpO0lhPU1hdGguc2luKElhKTtwYS54PUNhKklhO3BhLnk9aGEqVmE7cGEuej1DYSpFYTtTLnB1c2gocGEueCxwYS55LHBhLnopO1QucHVzaCgwLFZhLDApO3dhLng9LjUqRWErLjU7d2EueT0uNSpJYSpWYSsuNTtXLnB1c2god2EueCx3YS55KTtYKyt9Zm9yKHJhPTA7cmE8bTtyYSsrKXdhPVdhK3JhLHBhPURhK3JhLCEwPT09cWE/US5wdXNoKHBhLHBhKzEsd2EpOlEucHVzaChwYSsxLHBhLHdhKSx2YSs9MztKLmFkZEdyb3VwKHNhLHZhLCEwPT09cWE/MToyKTtzYSs9dmF9eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN5bGluZGVyQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzVG9wOmIsCnJhZGl1c0JvdHRvbTplLGhlaWdodDpoLHJhZGlhbFNlZ21lbnRzOm0saGVpZ2h0U2VnbWVudHM6dSxvcGVuRW5kZWQ6dyx0aGV0YVN0YXJ0OkEsdGhldGFMZW5ndGg6RX07dmFyIEo9dGhpcztiPXZvaWQgMCE9PWI/YjoxO2U9dm9pZCAwIT09ZT9lOjE7aD1ofHwxO209TWF0aC5mbG9vcihtKXx8ODt1PU1hdGguZmxvb3IodSl8fDE7dz12b2lkIDAhPT13P3c6ITE7QT12b2lkIDAhPT1BP0E6MDtFPXZvaWQgMCE9PUU/RToyKk1hdGguUEk7dmFyIFE9W10sUz1bXSxUPVtdLFc9W10sWD0wLGlhPVtdLGhhPWgvMixzYT0wOyhmdW5jdGlvbigpe3ZhciBxYSxyYSx3YT1uZXcgZyxwYT1uZXcgZyx2YT0wLENhPShlLWIpL2g7Zm9yKHJhPTA7cmE8PXU7cmErKyl7dmFyIFZhPVtdLFdhPXJhL3UsRGE9V2EqKGUtYikrYjtmb3IocWE9MDtxYTw9bTtxYSsrKXt2YXIgSWE9cWEvbSxFYT1JYSpFK0EsT2E9TWF0aC5zaW4oRWEpO0VhPU1hdGguY29zKEVhKTtwYS54PURhKk9hO3BhLnk9LVdhKmgraGE7CnBhLno9RGEqRWE7Uy5wdXNoKHBhLngscGEueSxwYS56KTt3YS5zZXQoT2EsQ2EsRWEpLm5vcm1hbGl6ZSgpO1QucHVzaCh3YS54LHdhLnksd2Eueik7Vy5wdXNoKElhLDEtV2EpO1ZhLnB1c2goWCsrKX1pYS5wdXNoKFZhKX1mb3IocWE9MDtxYTxtO3FhKyspZm9yKHJhPTA7cmE8dTtyYSsrKXdhPWlhW3JhKzFdW3FhXSxwYT1pYVtyYSsxXVtxYSsxXSxDYT1pYVtyYV1bcWErMV0sUS5wdXNoKGlhW3JhXVtxYV0sd2EsQ2EpLFEucHVzaCh3YSxwYSxDYSksdmErPTY7Si5hZGRHcm91cChzYSx2YSwwKTtzYSs9dmF9KSgpOyExPT09dyYmKDA8YiYmRyghMCksMDxlJiZHKCExKSk7dGhpcy5zZXRJbmRleChRKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBkYShTLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgZGEoVCwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgZGEoVywyKSl9ZnVuY3Rpb24gemgoYixlLGgsbSx1LHcsQSl7VmUuY2FsbCh0aGlzLAowLGIsZSxoLG0sdSx3LEEpO3RoaXMudHlwZT0iQ29uZUdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLGhlaWdodDplLHJhZGlhbFNlZ21lbnRzOmgsaGVpZ2h0U2VnbWVudHM6bSxvcGVuRW5kZWQ6dSx0aGV0YVN0YXJ0OncsdGhldGFMZW5ndGg6QX19ZnVuY3Rpb24gQWgoYixlLGgsbSx1LHcsQSl7UGQuY2FsbCh0aGlzLDAsYixlLGgsbSx1LHcsQSk7dGhpcy50eXBlPSJDb25lQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmIsaGVpZ2h0OmUscmFkaWFsU2VnbWVudHM6aCxoZWlnaHRTZWdtZW50czptLG9wZW5FbmRlZDp1LHRoZXRhU3RhcnQ6dyx0aGV0YUxlbmd0aDpBfX1mdW5jdGlvbiBCaChiLGUsaCxtKXt6YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ2lyY2xlR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmIsc2VnbWVudHM6ZSx0aGV0YVN0YXJ0OmgsdGhldGFMZW5ndGg6bX07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IGFnKGIsCmUsaCxtKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gYWcoYixlLGgsbSl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkNpcmNsZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czpiLHNlZ21lbnRzOmUsdGhldGFTdGFydDpoLHRoZXRhTGVuZ3RoOm19O2I9Ynx8MTtlPXZvaWQgMCE9PWU/TWF0aC5tYXgoMyxlKTo4O2g9dm9pZCAwIT09aD9oOjA7bT12b2lkIDAhPT1tP206MipNYXRoLlBJO3ZhciB1PVtdLHc9W10sQT1bXSxFPVtdLEcsSj1uZXcgZyxRPW5ldyBkO3cucHVzaCgwLDAsMCk7QS5wdXNoKDAsMCwxKTtFLnB1c2goLjUsLjUpO3ZhciBTPTA7Zm9yKEc9MztTPD1lO1MrKyxHKz0zKXt2YXIgVD1oK1MvZSptO0oueD1iKk1hdGguY29zKFQpO0oueT1iKk1hdGguc2luKFQpO3cucHVzaChKLngsSi55LEoueik7QS5wdXNoKDAsMCwxKTtRLng9KHdbR10vYisxKS8yO1EueT0od1tHKzFdL2IrMSkvMjtFLnB1c2goUS54LFEueSl9Zm9yKEc9MTtHPD0KZTtHKyspdS5wdXNoKEcsRysxLDApO3RoaXMuc2V0SW5kZXgodSk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgZGEodywzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGRhKEEsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGRhKEUsMikpfWZ1bmN0aW9uIFdlKGIpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYWRvd01hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDApO3RoaXMudHJhbnNwYXJlbnQ9ITA7dGhpcy5zZXRWYWx1ZXMoYil9ZnVuY3Rpb24gYmcoYil7dWIuY2FsbCh0aGlzLGIpO3RoaXMudHlwZT0iUmF3U2hhZGVyTWF0ZXJpYWwifWZ1bmN0aW9uIEFkKGIpe00uY2FsbCh0aGlzKTt0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIifTt0aGlzLnR5cGU9Ik1lc2hTdGFuZGFyZE1hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLm1ldGFsbmVzcz10aGlzLnJvdWdobmVzcz0uNTt0aGlzLmxpZ2h0TWFwPXRoaXMubWFwPQpudWxsO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9MTt0aGlzLmFvTWFwPW51bGw7dGhpcy5hb01hcEludGVuc2l0eT0xO3RoaXMuZW1pc3NpdmU9bmV3IEkoMCk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xO3RoaXMuYnVtcE1hcD10aGlzLmVtaXNzaXZlTWFwPW51bGw7dGhpcy5idW1wU2NhbGU9MTt0aGlzLm5vcm1hbE1hcD1udWxsO3RoaXMubm9ybWFsTWFwVHlwZT0wO3RoaXMubm9ybWFsU2NhbGU9bmV3IGQoMSwxKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLmVudk1hcD10aGlzLmFscGhhTWFwPXRoaXMubWV0YWxuZXNzTWFwPXRoaXMucm91Z2huZXNzTWFwPW51bGw7dGhpcy5lbnZNYXBJbnRlbnNpdHk9MTt0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTg7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWNhcD0KInJvdW5kIjt0aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPSExO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uIFhlKGIpe0FkLmNhbGwodGhpcyk7dGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIixQSFlTSUNBTDoiIn07dGhpcy50eXBlPSJNZXNoUGh5c2ljYWxNYXRlcmlhbCI7dGhpcy5yZWZsZWN0aXZpdHk9LjU7dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3M9dGhpcy5jbGVhcmNvYXQ9MDt0aGlzLnNoZWVuPW51bGw7dGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZT1uZXcgZCgxLDEpO3RoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwPW51bGw7dGhpcy50cmFuc3BhcmVuY3k9MDt0aGlzLnNldFZhbHVlcyhiKX1mdW5jdGlvbiBkZChiKXtNLmNhbGwodGhpcyk7dGhpcy50eXBlPSJNZXNoUGhvbmdNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSSgxNjc3NzIxNSk7dGhpcy5zcGVjdWxhcj1uZXcgSSgxMTE4NDgxKTt0aGlzLnNoaW5pbmVzcz0zMDt0aGlzLmxpZ2h0TWFwPQp0aGlzLm1hcD1udWxsO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9MTt0aGlzLmFvTWFwPW51bGw7dGhpcy5hb01hcEludGVuc2l0eT0xO3RoaXMuZW1pc3NpdmU9bmV3IEkoMCk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xO3RoaXMuYnVtcE1hcD10aGlzLmVtaXNzaXZlTWFwPW51bGw7dGhpcy5idW1wU2NhbGU9MTt0aGlzLm5vcm1hbE1hcD1udWxsO3RoaXMubm9ybWFsTWFwVHlwZT0wO3RoaXMubm9ybWFsU2NhbGU9bmV3IGQoMSwxKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLmVudk1hcD10aGlzLmFscGhhTWFwPXRoaXMuc3BlY3VsYXJNYXA9bnVsbDt0aGlzLmNvbWJpbmU9MDt0aGlzLnJlZmxlY3Rpdml0eT0xO3RoaXMucmVmcmFjdGlvblJhdGlvPS45ODt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMud2lyZWZyYW1lTGluZWpvaW49dGhpcy53aXJlZnJhbWVMaW5lY2FwPQoicm91bmQiO3RoaXMubW9ycGhOb3JtYWxzPXRoaXMubW9ycGhUYXJnZXRzPXRoaXMuc2tpbm5pbmc9ITE7dGhpcy5zZXRWYWx1ZXMoYil9ZnVuY3Rpb24gWWUoYil7ZGQuY2FsbCh0aGlzKTt0aGlzLmRlZmluZXM9e1RPT046IiJ9O3RoaXMudHlwZT0iTWVzaFRvb25NYXRlcmlhbCI7dGhpcy5ncmFkaWVudE1hcD1udWxsO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uIFplKGIpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hOb3JtYWxNYXRlcmlhbCI7dGhpcy5idW1wTWFwPW51bGw7dGhpcy5idW1wU2NhbGU9MTt0aGlzLm5vcm1hbE1hcD1udWxsO3RoaXMubm9ybWFsTWFwVHlwZT0wO3RoaXMubm9ybWFsU2NhbGU9bmV3IGQoMSwxKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMubW9ycGhOb3JtYWxzPXRoaXMubW9ycGhUYXJnZXRzPQp0aGlzLnNraW5uaW5nPXRoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uICRlKGIpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hMYW1iZXJ0TWF0ZXJpYWwiO3RoaXMuY29sb3I9bmV3IEkoMTY3NzcyMTUpO3RoaXMubGlnaHRNYXA9dGhpcy5tYXA9bnVsbDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTE7dGhpcy5hb01hcD1udWxsO3RoaXMuYW9NYXBJbnRlbnNpdHk9MTt0aGlzLmVtaXNzaXZlPW5ldyBJKDApO3RoaXMuZW1pc3NpdmVJbnRlbnNpdHk9MTt0aGlzLmVudk1hcD10aGlzLmFscGhhTWFwPXRoaXMuc3BlY3VsYXJNYXA9dGhpcy5lbWlzc2l2ZU1hcD1udWxsO3RoaXMuY29tYmluZT0wO3RoaXMucmVmbGVjdGl2aXR5PTE7dGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4O3RoaXMud2lyZWZyYW1lPSExO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPTE7dGhpcy53aXJlZnJhbWVMaW5lam9pbj10aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIjsKdGhpcy5tb3JwaE5vcm1hbHM9dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLnNldFZhbHVlcyhiKX1mdW5jdGlvbiBhZihiKXtNLmNhbGwodGhpcyk7dGhpcy5kZWZpbmVzPXtNQVRDQVA6IiJ9O3RoaXMudHlwZT0iTWVzaE1hdGNhcE1hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLmJ1bXBNYXA9dGhpcy5tYXA9dGhpcy5tYXRjYXA9bnVsbDt0aGlzLmJ1bXBTY2FsZT0xO3RoaXMubm9ybWFsTWFwPW51bGw7dGhpcy5ub3JtYWxNYXBUeXBlPTA7dGhpcy5ub3JtYWxTY2FsZT1uZXcgZCgxLDEpO3RoaXMuZGlzcGxhY2VtZW50TWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz0wO3RoaXMuYWxwaGFNYXA9bnVsbDt0aGlzLmxpZ2h0cz10aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPSExO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uIGJmKGIpe09iLmNhbGwodGhpcyk7CnRoaXMudHlwZT0iTGluZURhc2hlZE1hdGVyaWFsIjt0aGlzLnNjYWxlPTE7dGhpcy5kYXNoU2l6ZT0zO3RoaXMuZ2FwU2l6ZT0xO3RoaXMuc2V0VmFsdWVzKGIpfWZ1bmN0aW9uIEtjKGIsZSxoLG0pe3RoaXMucGFyYW1ldGVyUG9zaXRpb25zPWI7dGhpcy5fY2FjaGVkSW5kZXg9MDt0aGlzLnJlc3VsdEJ1ZmZlcj12b2lkIDAhPT1tP206bmV3IGUuY29uc3RydWN0b3IoaCk7dGhpcy5zYW1wbGVWYWx1ZXM9ZTt0aGlzLnZhbHVlU2l6ZT1ofWZ1bmN0aW9uIEJpKGIsZSxoLG0pe0tjLmNhbGwodGhpcyxiLGUsaCxtKTt0aGlzLl9vZmZzZXROZXh0PXRoaXMuX3dlaWdodE5leHQ9dGhpcy5fb2Zmc2V0UHJldj10aGlzLl93ZWlnaHRQcmV2PS0wfWZ1bmN0aW9uIENoKGIsZSxoLG0pe0tjLmNhbGwodGhpcyxiLGUsaCxtKX1mdW5jdGlvbiBDaShiLGUsaCxtKXtLYy5jYWxsKHRoaXMsYixlLGgsbSl9ZnVuY3Rpb24gb2MoYixlLGgsbSl7aWYodm9pZCAwPT09Yil0aHJvdyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgbmFtZSBpcyB1bmRlZmluZWQiKTsKaWYodm9pZCAwPT09ZXx8MD09PWUubGVuZ3RoKXRocm93IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBubyBrZXlmcmFtZXMgaW4gdHJhY2sgbmFtZWQgIitiKTt0aGlzLm5hbWU9Yjt0aGlzLnRpbWVzPWpjLmNvbnZlcnRBcnJheShlLHRoaXMuVGltZUJ1ZmZlclR5cGUpO3RoaXMudmFsdWVzPWpjLmNvbnZlcnRBcnJheShoLHRoaXMuVmFsdWVCdWZmZXJUeXBlKTt0aGlzLnNldEludGVycG9sYXRpb24obXx8dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil9ZnVuY3Rpb24gRGkoYixlLGgpe29jLmNhbGwodGhpcyxiLGUsaCl9ZnVuY3Rpb24gRWkoYixlLGgsbSl7b2MuY2FsbCh0aGlzLGIsZSxoLG0pfWZ1bmN0aW9uIGNnKGIsZSxoLG0pe29jLmNhbGwodGhpcyxiLGUsaCxtKX1mdW5jdGlvbiBGaShiLGUsaCxtKXtLYy5jYWxsKHRoaXMsYixlLGgsbSl9ZnVuY3Rpb24gRGgoYixlLGgsbSl7b2MuY2FsbCh0aGlzLGIsZSxoLG0pfWZ1bmN0aW9uIEdpKGIsZSxoLG0pe29jLmNhbGwodGhpcywKYixlLGgsbSl9ZnVuY3Rpb24gZGcoYixlLGgsbSl7b2MuY2FsbCh0aGlzLGIsZSxoLG0pfWZ1bmN0aW9uIFJjKGIsZSxoKXt0aGlzLm5hbWU9Yjt0aGlzLnRyYWNrcz1oO3RoaXMuZHVyYXRpb249dm9pZCAwIT09ZT9lOi0xO3RoaXMudXVpZD1sYi5nZW5lcmF0ZVVVSUQoKTswPnRoaXMuZHVyYXRpb24mJnRoaXMucmVzZXREdXJhdGlvbigpfWZ1bmN0aW9uIGlzKGIpe3N3aXRjaChiLnRvTG93ZXJDYXNlKCkpe2Nhc2UgInNjYWxhciI6Y2FzZSAiZG91YmxlIjpjYXNlICJmbG9hdCI6Y2FzZSAibnVtYmVyIjpjYXNlICJpbnRlZ2VyIjpyZXR1cm4gY2c7Y2FzZSAidmVjdG9yIjpjYXNlICJ2ZWN0b3IyIjpjYXNlICJ2ZWN0b3IzIjpjYXNlICJ2ZWN0b3I0IjpyZXR1cm4gZGc7Y2FzZSAiY29sb3IiOnJldHVybiBFaTtjYXNlICJxdWF0ZXJuaW9uIjpyZXR1cm4gRGg7Y2FzZSAiYm9vbCI6Y2FzZSAiYm9vbGVhbiI6cmV0dXJuIERpO2Nhc2UgInN0cmluZyI6cmV0dXJuIEdpfXRocm93IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBVbnN1cHBvcnRlZCB0eXBlTmFtZTogIisKYik7fWZ1bmN0aW9uIGpzKGIpe2lmKHZvaWQgMD09PWIudHlwZSl0aHJvdyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgdHlwZSB1bmRlZmluZWQsIGNhbiBub3QgcGFyc2UiKTt2YXIgZT1pcyhiLnR5cGUpO2lmKHZvaWQgMD09PWIudGltZXMpe3ZhciBoPVtdLG09W107amMuZmxhdHRlbkpTT04oYi5rZXlzLGgsbSwidmFsdWUiKTtiLnRpbWVzPWg7Yi52YWx1ZXM9bX1yZXR1cm4gdm9pZCAwIT09ZS5wYXJzZT9lLnBhcnNlKGIpOm5ldyBlKGIubmFtZSxiLnRpbWVzLGIudmFsdWVzLGIuaW50ZXJwb2xhdGlvbil9ZnVuY3Rpb24gRGsoYixlLGgpe3ZhciBtPXRoaXMsdT0hMSx3PTAsQT0wLEU9dm9pZCAwO3RoaXMub25TdGFydD12b2lkIDA7dGhpcy5vbkxvYWQ9Yjt0aGlzLm9uUHJvZ3Jlc3M9ZTt0aGlzLm9uRXJyb3I9aDt0aGlzLml0ZW1TdGFydD1mdW5jdGlvbihHKXtBKys7aWYoITE9PT11JiZ2b2lkIDAhPT1tLm9uU3RhcnQpbS5vblN0YXJ0KEcsdyxBKTt1PSEwfTsKdGhpcy5pdGVtRW5kPWZ1bmN0aW9uKEcpe3crKztpZih2b2lkIDAhPT1tLm9uUHJvZ3Jlc3MpbS5vblByb2dyZXNzKEcsdyxBKTtpZih3PT09QSYmKHU9ITEsdm9pZCAwIT09bS5vbkxvYWQpKW0ub25Mb2FkKCl9O3RoaXMuaXRlbUVycm9yPWZ1bmN0aW9uKEcpe2lmKHZvaWQgMCE9PW0ub25FcnJvciltLm9uRXJyb3IoRyl9O3RoaXMucmVzb2x2ZVVSTD1mdW5jdGlvbihHKXtyZXR1cm4gRT9FKEcpOkd9O3RoaXMuc2V0VVJMTW9kaWZpZXI9ZnVuY3Rpb24oRyl7RT1HO3JldHVybiB0aGlzfX1mdW5jdGlvbiBLYihiKXt0aGlzLm1hbmFnZXI9dm9pZCAwIT09Yj9iOlhuO3RoaXMuY3Jvc3NPcmlnaW49ImFub255bW91cyI7dGhpcy5yZXNvdXJjZVBhdGg9dGhpcy5wYXRoPSIifWZ1bmN0aW9uIFNjKGIpe0tiLmNhbGwodGhpcyxiKX1mdW5jdGlvbiBFayhiKXtLYi5jYWxsKHRoaXMsYil9ZnVuY3Rpb24gRmsoYil7S2IuY2FsbCh0aGlzLGIpO3RoaXMuX3BhcnNlcj1udWxsfWZ1bmN0aW9uIEhpKGIpe0tiLmNhbGwodGhpcywKYik7dGhpcy5fcGFyc2VyPW51bGx9ZnVuY3Rpb24gZWcoYil7S2IuY2FsbCh0aGlzLGIpfWZ1bmN0aW9uIElpKGIpe0tiLmNhbGwodGhpcyxiKX1mdW5jdGlvbiBKaShiKXtLYi5jYWxsKHRoaXMsYil9ZnVuY3Rpb24gYWIoKXt0aGlzLnR5cGU9IkN1cnZlIjt0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz0yMDB9ZnVuY3Rpb24gTGMoYixlLGgsbSx1LHcsQSxFKXthYi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iRWxsaXBzZUN1cnZlIjt0aGlzLmFYPWJ8fDA7dGhpcy5hWT1lfHwwO3RoaXMueFJhZGl1cz1ofHwxO3RoaXMueVJhZGl1cz1tfHwxO3RoaXMuYVN0YXJ0QW5nbGU9dXx8MDt0aGlzLmFFbmRBbmdsZT13fHwyKk1hdGguUEk7dGhpcy5hQ2xvY2t3aXNlPUF8fCExO3RoaXMuYVJvdGF0aW9uPUV8fDB9ZnVuY3Rpb24gZmcoYixlLGgsbSx1LHcpe0xjLmNhbGwodGhpcyxiLGUsaCxoLG0sdSx3KTt0aGlzLnR5cGU9IkFyY0N1cnZlIn1mdW5jdGlvbiBHaygpe2Z1bmN0aW9uIGIodyxBLEUsCkcpe2U9dztoPUU7bT0tMyp3KzMqQS0yKkUtRzt1PTIqdy0yKkErRStHfXZhciBlPTAsaD0wLG09MCx1PTA7cmV0dXJue2luaXRDYXRtdWxsUm9tOmZ1bmN0aW9uKHcsQSxFLEcsSil7YihBLEUsSiooRS13KSxKKihHLUEpKX0saW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tOmZ1bmN0aW9uKHcsQSxFLEcsSixRLFMpe2IoQSxFLCgoQS13KS9KLShFLXcpLyhKK1EpKyhFLUEpL1EpKlEsKChFLUEpL1EtKEctQSkvKFErUykrKEctRSkvUykqUSl9LGNhbGM6ZnVuY3Rpb24odyl7dmFyIEE9dyp3O3JldHVybiBlK2gqdyttKkErdSpBKnd9fX1mdW5jdGlvbiB1YyhiLGUsaCxtKXthYi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ2F0bXVsbFJvbUN1cnZlMyI7dGhpcy5wb2ludHM9Ynx8W107dGhpcy5jbG9zZWQ9ZXx8ITE7dGhpcy5jdXJ2ZVR5cGU9aHx8ImNlbnRyaXBldGFsIjt0aGlzLnRlbnNpb249bXx8LjV9ZnVuY3Rpb24gWW4oYixlLGgsbSx1KXtlPS41KihtLWUpO3U9LjUqKHUtaCk7dmFyIHc9CmIqYjtyZXR1cm4oMipoLTIqbStlK3UpKmIqdysoLTMqaCszKm0tMiplLXUpKncrZSpiK2h9ZnVuY3Rpb24ga3MoYixlKXtiPTEtYjtyZXR1cm4gYipiKmV9ZnVuY3Rpb24gbHMoYixlKXtyZXR1cm4gMiooMS1iKSpiKmV9ZnVuY3Rpb24gbXMoYixlKXtyZXR1cm4gYipiKmV9ZnVuY3Rpb24gRWgoYixlLGgsbSl7cmV0dXJuIGtzKGIsZSkrbHMoYixoKSttcyhiLG0pfWZ1bmN0aW9uIG5zKGIsZSl7Yj0xLWI7cmV0dXJuIGIqYipiKmV9ZnVuY3Rpb24gb3MoYixlKXt2YXIgaD0xLWI7cmV0dXJuIDMqaCpoKmIqZX1mdW5jdGlvbiBwcyhiLGUpe3JldHVybiAzKigxLWIpKmIqYiplfWZ1bmN0aW9uIHFzKGIsZSl7cmV0dXJuIGIqYipiKmV9ZnVuY3Rpb24gRmgoYixlLGgsbSx1KXtyZXR1cm4gbnMoYixlKStvcyhiLGgpK3BzKGIsbSkrcXMoYix1KX1mdW5jdGlvbiBlZChiLGUsaCxtKXthYi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ3ViaWNCZXppZXJDdXJ2ZSI7dGhpcy52MD1ifHxuZXcgZDsKdGhpcy52MT1lfHxuZXcgZDt0aGlzLnYyPWh8fG5ldyBkO3RoaXMudjM9bXx8bmV3IGR9ZnVuY3Rpb24gQmQoYixlLGgsbSl7YWIuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUzIjt0aGlzLnYwPWJ8fG5ldyBnO3RoaXMudjE9ZXx8bmV3IGc7dGhpcy52Mj1ofHxuZXcgZzt0aGlzLnYzPW18fG5ldyBnfWZ1bmN0aW9uIEdjKGIsZSl7YWIuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpbmVDdXJ2ZSI7dGhpcy52MT1ifHxuZXcgZDt0aGlzLnYyPWV8fG5ldyBkfWZ1bmN0aW9uIGZkKGIsZSl7YWIuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpbmVDdXJ2ZTMiO3RoaXMudjE9Ynx8bmV3IGc7dGhpcy52Mj1lfHxuZXcgZ31mdW5jdGlvbiBnZChiLGUsaCl7YWIuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlF1YWRyYXRpY0JlemllckN1cnZlIjt0aGlzLnYwPWJ8fG5ldyBkO3RoaXMudjE9ZXx8bmV3IGQ7dGhpcy52Mj1ofHxuZXcgZH1mdW5jdGlvbiBDZChiLGUsaCl7YWIuY2FsbCh0aGlzKTsKdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiO3RoaXMudjA9Ynx8bmV3IGc7dGhpcy52MT1lfHxuZXcgZzt0aGlzLnYyPWh8fG5ldyBnfWZ1bmN0aW9uIGhkKGIpe2FiLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcGxpbmVDdXJ2ZSI7dGhpcy5wb2ludHM9Ynx8W119ZnVuY3Rpb24gUWQoKXthYi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ3VydmVQYXRoIjt0aGlzLmN1cnZlcz1bXTt0aGlzLmF1dG9DbG9zZT0hMX1mdW5jdGlvbiBpZChiKXtRZC5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGF0aCI7dGhpcy5jdXJyZW50UG9pbnQ9bmV3IGQ7YiYmdGhpcy5zZXRGcm9tUG9pbnRzKGIpfWZ1bmN0aW9uIHRlKGIpe2lkLmNhbGwodGhpcyxiKTt0aGlzLnV1aWQ9bGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy50eXBlPSJTaGFwZSI7dGhpcy5ob2xlcz1bXX1mdW5jdGlvbiBVYihiLGUpe3kuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpZ2h0Ijt0aGlzLmNvbG9yPW5ldyBJKGIpO3RoaXMuaW50ZW5zaXR5PQp2b2lkIDAhPT1lP2U6MTt0aGlzLnJlY2VpdmVTaGFkb3c9dm9pZCAwfWZ1bmN0aW9uIEtpKGIsZSxoKXtVYi5jYWxsKHRoaXMsYixoKTt0aGlzLnR5cGU9IkhlbWlzcGhlcmVMaWdodCI7dGhpcy5jYXN0U2hhZG93PXZvaWQgMDt0aGlzLnBvc2l0aW9uLmNvcHkoeS5EZWZhdWx0VXApO3RoaXMudXBkYXRlTWF0cml4KCk7dGhpcy5ncm91bmRDb2xvcj1uZXcgSShlKX1mdW5jdGlvbiBEZChiKXt0aGlzLmNhbWVyYT1iO3RoaXMuYmlhcz0wO3RoaXMucmFkaXVzPTE7dGhpcy5tYXBTaXplPW5ldyBkKDUxMiw1MTIpO3RoaXMubWFwUGFzcz10aGlzLm1hcD1udWxsO3RoaXMubWF0cml4PW5ldyByO3RoaXMuX2ZydXN0dW09bmV3IEVjO3RoaXMuX2ZyYW1lRXh0ZW50cz1uZXcgZCgxLDEpO3RoaXMuX3ZpZXdwb3J0Q291bnQ9MTt0aGlzLl92aWV3cG9ydHM9W25ldyBuKDAsMCwxLDEpXX1mdW5jdGlvbiBMaSgpe0RkLmNhbGwodGhpcyxuZXcgQWIoNTAsMSwuNSw1MDApKX1mdW5jdGlvbiBNaShiLAplLGgsbSx1LHcpe1ViLmNhbGwodGhpcyxiLGUpO3RoaXMudHlwZT0iU3BvdExpZ2h0Ijt0aGlzLnBvc2l0aW9uLmNvcHkoeS5EZWZhdWx0VXApO3RoaXMudXBkYXRlTWF0cml4KCk7dGhpcy50YXJnZXQ9bmV3IHk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInBvd2VyIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW50ZW5zaXR5Kk1hdGguUEl9LHNldDpmdW5jdGlvbihBKXt0aGlzLmludGVuc2l0eT1BL01hdGguUEl9fSk7dGhpcy5kaXN0YW5jZT12b2lkIDAhPT1oP2g6MDt0aGlzLmFuZ2xlPXZvaWQgMCE9PW0/bTpNYXRoLlBJLzM7dGhpcy5wZW51bWJyYT12b2lkIDAhPT11P3U6MDt0aGlzLmRlY2F5PXZvaWQgMCE9PXc/dzoxO3RoaXMuc2hhZG93PW5ldyBMaX1mdW5jdGlvbiBIaygpe0RkLmNhbGwodGhpcyxuZXcgQWIoOTAsMSwuNSw1MDApKTt0aGlzLl9mcmFtZUV4dGVudHM9bmV3IGQoNCwyKTt0aGlzLl92aWV3cG9ydENvdW50PTY7dGhpcy5fdmlld3BvcnRzPVtuZXcgbigyLAoxLDEsMSksbmV3IG4oMCwxLDEsMSksbmV3IG4oMywxLDEsMSksbmV3IG4oMSwxLDEsMSksbmV3IG4oMywwLDEsMSksbmV3IG4oMSwwLDEsMSldO3RoaXMuX2N1YmVEaXJlY3Rpb25zPVtuZXcgZygxLDAsMCksbmV3IGcoLTEsMCwwKSxuZXcgZygwLDAsMSksbmV3IGcoMCwwLC0xKSxuZXcgZygwLDEsMCksbmV3IGcoMCwtMSwwKV07dGhpcy5fY3ViZVVwcz1bbmV3IGcoMCwxLDApLG5ldyBnKDAsMSwwKSxuZXcgZygwLDEsMCksbmV3IGcoMCwxLDApLG5ldyBnKDAsMCwxKSxuZXcgZygwLDAsLTEpXX1mdW5jdGlvbiBOaShiLGUsaCxtKXtVYi5jYWxsKHRoaXMsYixlKTt0aGlzLnR5cGU9IlBvaW50TGlnaHQiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwb3dlciIse2dldDpmdW5jdGlvbigpe3JldHVybiA0KnRoaXMuaW50ZW5zaXR5Kk1hdGguUEl9LHNldDpmdW5jdGlvbih1KXt0aGlzLmludGVuc2l0eT11Lyg0Kk1hdGguUEkpfX0pO3RoaXMuZGlzdGFuY2U9dm9pZCAwIT09aD8KaDowO3RoaXMuZGVjYXk9dm9pZCAwIT09bT9tOjE7dGhpcy5zaGFkb3c9bmV3IEhrfWZ1bmN0aW9uIEdoKGIsZSxoLG0sdSx3KXtGYi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iT3J0aG9ncmFwaGljQ2FtZXJhIjt0aGlzLnpvb209MTt0aGlzLnZpZXc9bnVsbDt0aGlzLmxlZnQ9dm9pZCAwIT09Yj9iOi0xO3RoaXMucmlnaHQ9dm9pZCAwIT09ZT9lOjE7dGhpcy50b3A9dm9pZCAwIT09aD9oOjE7dGhpcy5ib3R0b209dm9pZCAwIT09bT9tOi0xO3RoaXMubmVhcj12b2lkIDAhPT11P3U6LjE7dGhpcy5mYXI9dm9pZCAwIT09dz93OjJFMzt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1mdW5jdGlvbiBPaSgpe0RkLmNhbGwodGhpcyxuZXcgR2goLTUsNSw1LC01LC41LDUwMCkpfWZ1bmN0aW9uIFBpKGIsZSl7VWIuY2FsbCh0aGlzLGIsZSk7dGhpcy50eXBlPSJEaXJlY3Rpb25hbExpZ2h0Ijt0aGlzLnBvc2l0aW9uLmNvcHkoeS5EZWZhdWx0VXApO3RoaXMudXBkYXRlTWF0cml4KCk7CnRoaXMudGFyZ2V0PW5ldyB5O3RoaXMuc2hhZG93PW5ldyBPaX1mdW5jdGlvbiBRaShiLGUpe1ViLmNhbGwodGhpcyxiLGUpO3RoaXMudHlwZT0iQW1iaWVudExpZ2h0Ijt0aGlzLmNhc3RTaGFkb3c9dm9pZCAwfWZ1bmN0aW9uIFJpKGIsZSxoLG0pe1ViLmNhbGwodGhpcyxiLGUpO3RoaXMudHlwZT0iUmVjdEFyZWFMaWdodCI7dGhpcy53aWR0aD12b2lkIDAhPT1oP2g6MTA7dGhpcy5oZWlnaHQ9dm9pZCAwIT09bT9tOjEwfWZ1bmN0aW9uIFNpKGIpe0tiLmNhbGwodGhpcyxiKTt0aGlzLnRleHR1cmVzPXt9fWZ1bmN0aW9uIFRpKCl7eGEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ikluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5Ijt0aGlzLm1heEluc3RhbmNlZENvdW50PXZvaWQgMH1mdW5jdGlvbiBVaShiLGUsaCxtKXsibnVtYmVyIj09PXR5cGVvZiBoJiYobT1oLGg9ITEsY29uc29sZS5lcnJvcigiVEhSRUUuSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlOiBUaGUgY29uc3RydWN0b3Igbm93IGV4cGVjdHMgbm9ybWFsaXplZCBhcyB0aGUgdGhpcmQgYXJndW1lbnQuIikpOwpSLmNhbGwodGhpcyxiLGUsaCk7dGhpcy5tZXNoUGVyQXR0cmlidXRlPW18fDF9ZnVuY3Rpb24gVmkoYil7S2IuY2FsbCh0aGlzLGIpfWZ1bmN0aW9uIFdpKGIpe0tiLmNhbGwodGhpcyxiKX1mdW5jdGlvbiBJayhiKXsidW5kZWZpbmVkIj09PXR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcCYmY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogY3JlYXRlSW1hZ2VCaXRtYXAoKSBub3Qgc3VwcG9ydGVkLiIpOyJ1bmRlZmluZWQiPT09dHlwZW9mIGZldGNoJiZjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlQml0bWFwTG9hZGVyOiBmZXRjaCgpIG5vdCBzdXBwb3J0ZWQuIik7S2IuY2FsbCh0aGlzLGIpO3RoaXMub3B0aW9ucz12b2lkIDB9ZnVuY3Rpb24gSmsoKXt0aGlzLnR5cGU9IlNoYXBlUGF0aCI7dGhpcy5jb2xvcj1uZXcgSTt0aGlzLnN1YlBhdGhzPVtdO3RoaXMuY3VycmVudFBhdGg9bnVsbH1mdW5jdGlvbiBLayhiKXt0aGlzLnR5cGU9IkZvbnQiO3RoaXMuZGF0YT0KYn1mdW5jdGlvbiBycyhiLGUsaCl7Yj1BcnJheS5mcm9tP0FycmF5LmZyb20oYik6U3RyaW5nKGIpLnNwbGl0KCIiKTtlLz1oLnJlc29sdXRpb247Zm9yKHZhciBtPShoLmJvdW5kaW5nQm94LnlNYXgtaC5ib3VuZGluZ0JveC55TWluK2gudW5kZXJsaW5lVGhpY2tuZXNzKSplLHU9W10sdz0wLEE9MCxFPTA7RTxiLmxlbmd0aDtFKyspe3ZhciBHPWJbRV07IlxuIj09PUc/KHc9MCxBLT1tKTooRz1zcyhHLGUsdyxBLGgpLHcrPUcub2Zmc2V0WCx1LnB1c2goRy5wYXRoKSl9cmV0dXJuIHV9ZnVuY3Rpb24gc3MoYixlLGgsbSx1KXt2YXIgdz11LmdseXBoc1tiXXx8dS5nbHlwaHNbIj8iXTtpZih3KXtiPW5ldyBKaztpZih3Lm8pe3U9dy5fY2FjaGVkT3V0bGluZXx8KHcuX2NhY2hlZE91dGxpbmU9dy5vLnNwbGl0KCIgIikpO2Zvcih2YXIgQT0wLEU9dS5sZW5ndGg7QTxFOylzd2l0Y2godVtBKytdKXtjYXNlICJtIjp2YXIgRz11W0ErK10qZStoO3ZhciBKPXVbQSsrXSplK207Yi5tb3ZlVG8oRywKSik7YnJlYWs7Y2FzZSAibCI6Rz11W0ErK10qZStoO0o9dVtBKytdKmUrbTtiLmxpbmVUbyhHLEopO2JyZWFrO2Nhc2UgInEiOkc9dVtBKytdKmUraDtKPXVbQSsrXSplK207dmFyIFE9dVtBKytdKmUraDt2YXIgUz11W0ErK10qZSttO2IucXVhZHJhdGljQ3VydmVUbyhRLFMsRyxKKTticmVhaztjYXNlICJiIjpHPXVbQSsrXSplK2g7Sj11W0ErK10qZSttO1E9dVtBKytdKmUraDtTPXVbQSsrXSplK207dmFyIFQ9dVtBKytdKmUraDt2YXIgVz11W0ErK10qZSttO2IuYmV6aWVyQ3VydmVUbyhRLFMsVCxXLEcsSil9fXJldHVybntvZmZzZXRYOncuaGEqZSxwYXRoOmJ9fWNvbnNvbGUuZXJyb3IoJ1RIUkVFLkZvbnQ6IGNoYXJhY3RlciAiJytiKyciIGRvZXMgbm90IGV4aXN0cyBpbiBmb250IGZhbWlseSAnK3UuZmFtaWx5TmFtZSsiLiIpfWZ1bmN0aW9uIExrKGIpe0tiLmNhbGwodGhpcyxiKX1mdW5jdGlvbiBYaShiKXtLYi5jYWxsKHRoaXMsYil9ZnVuY3Rpb24gWWkoKXt0aGlzLmNvZWZmaWNpZW50cz0KW107Zm9yKHZhciBiPTA7OT5iO2IrKyl0aGlzLmNvZWZmaWNpZW50cy5wdXNoKG5ldyBnKX1mdW5jdGlvbiBqZChiLGUpe1ViLmNhbGwodGhpcyx2b2lkIDAsZSk7dGhpcy5zaD12b2lkIDAhPT1iP2I6bmV3IFlpfWZ1bmN0aW9uIE1rKGIsZSxoKXtqZC5jYWxsKHRoaXMsdm9pZCAwLGgpO2I9KG5ldyBJKS5zZXQoYik7aD0obmV3IEkpLnNldChlKTtlPW5ldyBnKGIucixiLmcsYi5iKTtiPW5ldyBnKGgucixoLmcsaC5iKTtoPU1hdGguc3FydChNYXRoLlBJKTt2YXIgbT1oKk1hdGguc3FydCguNzUpO3RoaXMuc2guY29lZmZpY2llbnRzWzBdLmNvcHkoZSkuYWRkKGIpLm11bHRpcGx5U2NhbGFyKGgpO3RoaXMuc2guY29lZmZpY2llbnRzWzFdLmNvcHkoZSkuc3ViKGIpLm11bHRpcGx5U2NhbGFyKG0pfWZ1bmN0aW9uIE5rKGIsZSl7amQuY2FsbCh0aGlzLHZvaWQgMCxlKTtiPShuZXcgSSkuc2V0KGIpO3RoaXMuc2guY29lZmZpY2llbnRzWzBdLnNldChiLnIsYi5nLGIuYikubXVsdGlwbHlTY2FsYXIoMioKTWF0aC5zcXJ0KE1hdGguUEkpKX1mdW5jdGlvbiBabigpe3RoaXMudHlwZT0iU3RlcmVvQ2FtZXJhIjt0aGlzLmFzcGVjdD0xO3RoaXMuZXllU2VwPS4wNjQ7dGhpcy5jYW1lcmFMPW5ldyBBYjt0aGlzLmNhbWVyYUwubGF5ZXJzLmVuYWJsZSgxKTt0aGlzLmNhbWVyYUwubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmNhbWVyYVI9bmV3IEFiO3RoaXMuY2FtZXJhUi5sYXllcnMuZW5hYmxlKDIpO3RoaXMuY2FtZXJhUi5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuX2NhY2hlPXtmb2N1czpudWxsLGZvdjpudWxsLGFzcGVjdDpudWxsLG5lYXI6bnVsbCxmYXI6bnVsbCx6b29tOm51bGwsZXllU2VwOm51bGx9fWZ1bmN0aW9uIE9rKGIpe3RoaXMuYXV0b1N0YXJ0PXZvaWQgMCE9PWI/YjohMDt0aGlzLmVsYXBzZWRUaW1lPXRoaXMub2xkVGltZT10aGlzLnN0YXJ0VGltZT0wO3RoaXMucnVubmluZz0hMX1mdW5jdGlvbiBQaygpe3kuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkF1ZGlvTGlzdGVuZXIiOwp0aGlzLmNvbnRleHQ9UWsuZ2V0Q29udGV4dCgpO3RoaXMuZ2Fpbj10aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO3RoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbik7dGhpcy5maWx0ZXI9bnVsbDt0aGlzLnRpbWVEZWx0YT0wO3RoaXMuX2Nsb2NrPW5ldyBPa31mdW5jdGlvbiBnZyhiKXt5LmNhbGwodGhpcyk7dGhpcy50eXBlPSJBdWRpbyI7dGhpcy5saXN0ZW5lcj1iO3RoaXMuY29udGV4dD1iLmNvbnRleHQ7dGhpcy5nYWluPXRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7dGhpcy5nYWluLmNvbm5lY3QoYi5nZXRJbnB1dCgpKTt0aGlzLmF1dG9wbGF5PSExO3RoaXMuYnVmZmVyPW51bGw7dGhpcy5kZXR1bmU9MDt0aGlzLmxvb3A9ITE7dGhpcy5vZmZzZXQ9dGhpcy5zdGFydFRpbWU9MDt0aGlzLmR1cmF0aW9uPXZvaWQgMDt0aGlzLnBsYXliYWNrUmF0ZT0xO3RoaXMuaXNQbGF5aW5nPSExO3RoaXMuaGFzUGxheWJhY2tDb250cm9sPSEwO3RoaXMuc291cmNlVHlwZT0KImVtcHR5Ijt0aGlzLmZpbHRlcnM9W119ZnVuY3Rpb24gUmsoYil7Z2cuY2FsbCh0aGlzLGIpO3RoaXMucGFubmVyPXRoaXMuY29udGV4dC5jcmVhdGVQYW5uZXIoKTt0aGlzLnBhbm5lci5wYW5uaW5nTW9kZWw9IkhSVEYiO3RoaXMucGFubmVyLmNvbm5lY3QodGhpcy5nYWluKX1mdW5jdGlvbiBTayhiLGUpe3RoaXMuYW5hbHlzZXI9Yi5jb250ZXh0LmNyZWF0ZUFuYWx5c2VyKCk7dGhpcy5hbmFseXNlci5mZnRTaXplPXZvaWQgMCE9PWU/ZToyMDQ4O3RoaXMuZGF0YT1uZXcgVWludDhBcnJheSh0aGlzLmFuYWx5c2VyLmZyZXF1ZW5jeUJpbkNvdW50KTtiLmdldE91dHB1dCgpLmNvbm5lY3QodGhpcy5hbmFseXNlcil9ZnVuY3Rpb24gVGsoYixlLGgpe3RoaXMuYmluZGluZz1iO3RoaXMudmFsdWVTaXplPWg7Yj1GbG9hdDY0QXJyYXk7c3dpdGNoKGUpe2Nhc2UgInF1YXRlcm5pb24iOmU9dGhpcy5fc2xlcnA7YnJlYWs7Y2FzZSAic3RyaW5nIjpjYXNlICJib29sIjpiPUFycmF5O2U9CnRoaXMuX3NlbGVjdDticmVhaztkZWZhdWx0OmU9dGhpcy5fbGVycH10aGlzLmJ1ZmZlcj1uZXcgYig0KmgpO3RoaXMuX21peEJ1ZmZlclJlZ2lvbj1lO3RoaXMucmVmZXJlbmNlQ291bnQ9dGhpcy51c2VDb3VudD10aGlzLmN1bXVsYXRpdmVXZWlnaHQ9MH1mdW5jdGlvbiAkbihiLGUsaCl7aD1ofHx2Yy5wYXJzZVRyYWNrTmFtZShlKTt0aGlzLl90YXJnZXRHcm91cD1iO3RoaXMuX2JpbmRpbmdzPWIuc3Vic2NyaWJlXyhlLGgpfWZ1bmN0aW9uIHZjKGIsZSxoKXt0aGlzLnBhdGg9ZTt0aGlzLnBhcnNlZFBhdGg9aHx8dmMucGFyc2VUcmFja05hbWUoZSk7dGhpcy5ub2RlPXZjLmZpbmROb2RlKGIsdGhpcy5wYXJzZWRQYXRoLm5vZGVOYW1lKXx8Yjt0aGlzLnJvb3ROb2RlPWJ9ZnVuY3Rpb24gYW8oKXt0aGlzLnV1aWQ9bGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy5fb2JqZWN0cz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubkNhY2hlZE9iamVjdHNfPTA7dmFyIGI9Cnt9O3RoaXMuX2luZGljZXNCeVVVSUQ9Yjtmb3IodmFyIGU9MCxoPWFyZ3VtZW50cy5sZW5ndGg7ZSE9PWg7KytlKWJbYXJndW1lbnRzW2VdLnV1aWRdPWU7dGhpcy5fcGF0aHM9W107dGhpcy5fcGFyc2VkUGF0aHM9W107dGhpcy5fYmluZGluZ3M9W107dGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoPXt9O3ZhciBtPXRoaXM7dGhpcy5zdGF0cz17b2JqZWN0czp7Z2V0IHRvdGFsKCl7cmV0dXJuIG0uX29iamVjdHMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gdGhpcy50b3RhbC1tLm5DYWNoZWRPYmplY3RzX319LGdldCBiaW5kaW5nc1Blck9iamVjdCgpe3JldHVybiBtLl9iaW5kaW5ncy5sZW5ndGh9fX1mdW5jdGlvbiBibyhiLGUsaCl7dGhpcy5fbWl4ZXI9Yjt0aGlzLl9jbGlwPWU7dGhpcy5fbG9jYWxSb290PWh8fG51bGw7Yj1lLnRyYWNrcztlPWIubGVuZ3RoO2g9QXJyYXkoZSk7Zm9yKHZhciBtPXtlbmRpbmdTdGFydDoyNDAwLGVuZGluZ0VuZDoyNDAwfSx1PTA7dSE9PQplOysrdSl7dmFyIHc9Ylt1XS5jcmVhdGVJbnRlcnBvbGFudChudWxsKTtoW3VdPXc7dy5zZXR0aW5ncz1tfXRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M9bTt0aGlzLl9pbnRlcnBvbGFudHM9aDt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzPUFycmF5KGUpO3RoaXMuX3dlaWdodEludGVycG9sYW50PXRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PXRoaXMuX2J5Q2xpcENhY2hlSW5kZXg9dGhpcy5fY2FjaGVJbmRleD1udWxsO3RoaXMubG9vcD0yMjAxO3RoaXMuX2xvb3BDb3VudD0tMTt0aGlzLl9zdGFydFRpbWU9bnVsbDt0aGlzLnRpbWU9MDt0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9dGhpcy53ZWlnaHQ9dGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlPXRoaXMudGltZVNjYWxlPTE7dGhpcy5yZXBldGl0aW9ucz1JbmZpbml0eTt0aGlzLnBhdXNlZD0hMTt0aGlzLmVuYWJsZWQ9ITA7dGhpcy5jbGFtcFdoZW5GaW5pc2hlZD0hMTt0aGlzLnplcm9TbG9wZUF0RW5kPXRoaXMuemVyb1Nsb3BlQXRTdGFydD0KITB9ZnVuY3Rpb24gVWsoYil7dGhpcy5fcm9vdD1iO3RoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCk7dGhpcy50aW1lPXRoaXMuX2FjY3VJbmRleD0wO3RoaXMudGltZVNjYWxlPTF9ZnVuY3Rpb24gWmkoYixlKXsic3RyaW5nIj09PXR5cGVvZiBiJiYoY29uc29sZS53YXJuKCJUSFJFRS5Vbmlmb3JtOiBUeXBlIHBhcmFtZXRlciBpcyBubyBsb25nZXIgbmVlZGVkLiIpLGI9ZSk7dGhpcy52YWx1ZT1ifWZ1bmN0aW9uIFZrKGIsZSxoKXtPZS5jYWxsKHRoaXMsYixlKTt0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9aHx8MX1mdW5jdGlvbiBjbyhiLGUsaCxtKXt0aGlzLnJheT1uZXcgRChiLGUpO3RoaXMubmVhcj1ofHwwO3RoaXMuZmFyPW18fEluZmluaXR5O3RoaXMuY2FtZXJhPW51bGw7dGhpcy5wYXJhbXM9e01lc2g6e30sTGluZTp7fSxMT0Q6e30sUG9pbnRzOnt0aHJlc2hvbGQ6MX0sU3ByaXRlOnt9fTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLnBhcmFtcyx7UG9pbnRDbG91ZDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5SYXljYXN0ZXI6IHBhcmFtcy5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gcGFyYW1zLlBvaW50cy4iKTsKcmV0dXJuIHRoaXMuUG9pbnRzfX19KX1mdW5jdGlvbiBlbyhiLGUpe3JldHVybiBiLmRpc3RhbmNlLWUuZGlzdGFuY2V9ZnVuY3Rpb24gV2soYixlLGgsbSl7aWYoITEhPT1iLnZpc2libGUmJihiLnJheWNhc3QoZSxoKSwhMD09PW0pKXtiPWIuY2hpbGRyZW47bT0wO2Zvcih2YXIgdT1iLmxlbmd0aDttPHU7bSsrKVdrKGJbbV0sZSxoLCEwKX19ZnVuY3Rpb24gZm8oYixlLGgpe3RoaXMucmFkaXVzPXZvaWQgMCE9PWI/YjoxO3RoaXMucGhpPXZvaWQgMCE9PWU/ZTowO3RoaXMudGhldGE9dm9pZCAwIT09aD9oOjA7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gZ28oYixlLGgpe3RoaXMucmFkaXVzPXZvaWQgMCE9PWI/YjoxO3RoaXMudGhldGE9dm9pZCAwIT09ZT9lOjA7dGhpcy55PXZvaWQgMCE9PWg/aDowO3JldHVybiB0aGlzfWZ1bmN0aW9uIFhrKGIsZSl7dGhpcy5taW49dm9pZCAwIT09Yj9iOm5ldyBkKEluZmluaXR5LEluZmluaXR5KTt0aGlzLm1heD12b2lkIDAhPT1lP2U6bmV3IGQoLUluZmluaXR5LAotSW5maW5pdHkpfWZ1bmN0aW9uIFlrKGIsZSl7dGhpcy5zdGFydD12b2lkIDAhPT1iP2I6bmV3IGc7dGhpcy5lbmQ9dm9pZCAwIT09ZT9lOm5ldyBnfWZ1bmN0aW9uIEhoKGIpe3kuY2FsbCh0aGlzKTt0aGlzLm1hdGVyaWFsPWI7dGhpcy5yZW5kZXI9ZnVuY3Rpb24oKXt9fWZ1bmN0aW9uIEloKGIsZSxoLG0pe3RoaXMub2JqZWN0PWI7dGhpcy5zaXplPXZvaWQgMCE9PWU/ZToxO2I9dm9pZCAwIT09aD9oOjE2NzExNjgwO209dm9pZCAwIT09bT9tOjE7ZT0wOyhoPXRoaXMub2JqZWN0Lmdlb21ldHJ5KSYmaC5pc0dlb21ldHJ5P2U9MypoLmZhY2VzLmxlbmd0aDpoJiZoLmlzQnVmZmVyR2VvbWV0cnkmJihlPWguYXR0cmlidXRlcy5ub3JtYWwuY291bnQpO2g9bmV3IHhhO2U9bmV3IGRhKDYqZSwzKTtoLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLGUpO1NiLmNhbGwodGhpcyxoLG5ldyBPYih7Y29sb3I6YixsaW5ld2lkdGg6bX0pKTt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy51cGRhdGUoKX0KZnVuY3Rpb24gaGcoYixlKXt5LmNhbGwodGhpcyk7dGhpcy5saWdodD1iO3RoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTt0aGlzLm1hdHJpeD1iLm1hdHJpeFdvcmxkO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmNvbG9yPWU7Yj1uZXcgeGE7ZT1bMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsLTEsMCwxLDAsMCwwLDAsMSwxLDAsMCwwLDAsLTEsMV07Zm9yKHZhciBoPTAsbT0xOzMyPmg7aCsrLG0rKyl7dmFyIHU9aC8zMipNYXRoLlBJKjIsdz1tLzMyKk1hdGguUEkqMjtlLnB1c2goTWF0aC5jb3ModSksTWF0aC5zaW4odSksMSxNYXRoLmNvcyh3KSxNYXRoLnNpbih3KSwxKX1iLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBkYShlLDMpKTtlPW5ldyBPYih7Zm9nOiExfSk7dGhpcy5jb25lPW5ldyBTYihiLGUpO3RoaXMuYWRkKHRoaXMuY29uZSk7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBobyhiKXt2YXIgZT1bXTtiJiZiLmlzQm9uZSYmZS5wdXNoKGIpOwpmb3IodmFyIGg9MDtoPGIuY2hpbGRyZW4ubGVuZ3RoO2grKyllLnB1c2guYXBwbHkoZSxobyhiLmNoaWxkcmVuW2hdKSk7cmV0dXJuIGV9ZnVuY3Rpb24gaWcoYil7Zm9yKHZhciBlPWhvKGIpLGg9bmV3IHhhLG09W10sdT1bXSx3PW5ldyBJKDAsMCwxKSxBPW5ldyBJKDAsMSwwKSxFPTA7RTxlLmxlbmd0aDtFKyspe3ZhciBHPWVbRV07Ry5wYXJlbnQmJkcucGFyZW50LmlzQm9uZSYmKG0ucHVzaCgwLDAsMCksbS5wdXNoKDAsMCwwKSx1LnB1c2gody5yLHcuZyx3LmIpLHUucHVzaChBLnIsQS5nLEEuYikpfWguYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGRhKG0sMykpO2guYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IGRhKHUsMykpO209bmV3IE9iKHt2ZXJ0ZXhDb2xvcnM6MixkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSx0cmFuc3BhcmVudDohMH0pO1NiLmNhbGwodGhpcyxoLG0pO3RoaXMucm9vdD1iO3RoaXMuYm9uZXM9ZTt0aGlzLm1hdHJpeD1iLm1hdHJpeFdvcmxkO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0KITF9ZnVuY3Rpb24gamcoYixlLGgpe3RoaXMubGlnaHQ9Yjt0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7dGhpcy5jb2xvcj1oO2I9bmV3IHNlKGUsNCwyKTtlPW5ldyBMKHt3aXJlZnJhbWU6ITAsZm9nOiExfSk7eWEuY2FsbCh0aGlzLGIsZSk7dGhpcy5tYXRyaXg9dGhpcy5saWdodC5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBrZyhiLGUpe3RoaXMudHlwZT0iUmVjdEFyZWFMaWdodEhlbHBlciI7dGhpcy5saWdodD1iO3RoaXMuY29sb3I9ZTtiPW5ldyB4YTtiLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBkYShbMSwxLDAsLTEsMSwwLC0xLC0xLDAsMSwtMSwwLDEsMSwwXSwzKSk7Yi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtlPW5ldyBPYih7Zm9nOiExfSk7bWMuY2FsbCh0aGlzLGIsZSk7Yj1uZXcgeGE7Yi5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgZGEoWzEsMSwwLC0xLDEsMCwtMSwtMSwwLAoxLDEsMCwtMSwtMSwwLDEsLTEsMF0sMykpO2IuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7dGhpcy5hZGQobmV3IHlhKGIsbmV3IEwoe3NpZGU6MSxmb2c6ITF9KSkpO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gbGcoYixlLGgpe3kuY2FsbCh0aGlzKTt0aGlzLmxpZ2h0PWI7dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO3RoaXMubWF0cml4PWIubWF0cml4V29ybGQ7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuY29sb3I9aDtiPW5ldyBQZShlKTtiLnJvdGF0ZVkoLjUqTWF0aC5QSSk7dGhpcy5tYXRlcmlhbD1uZXcgTCh7d2lyZWZyYW1lOiEwLGZvZzohMX0pO3ZvaWQgMD09PXRoaXMuY29sb3ImJih0aGlzLm1hdGVyaWFsLnZlcnRleENvbG9ycz0yKTtlPWIuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2IuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IFIobmV3IEZsb2F0MzJBcnJheSgzKmUuY291bnQpLDMpKTt0aGlzLmFkZChuZXcgeWEoYix0aGlzLm1hdGVyaWFsKSk7CnRoaXMudXBkYXRlKCl9ZnVuY3Rpb24gbWcoYixlKXt0aGlzLmxpZ2h0UHJvYmU9Yjt0aGlzLnNpemU9ZTtiPW5ldyB1Yih7ZGVmaW5lczp7R0FNTUFfT1VUUFVUOiIifSx1bmlmb3Jtczp7c2g6e3ZhbHVlOnRoaXMubGlnaHRQcm9iZS5zaC5jb2VmZmljaWVudHN9LGludGVuc2l0eTp7dmFsdWU6dGhpcy5saWdodFByb2JlLmludGVuc2l0eX19LHZlcnRleFNoYWRlcjoidmFyeWluZyB2ZWMzIHZOb3JtYWw7XG52b2lkIG1haW4oKSB7XG5cdHZOb3JtYWwgXHgzZCBub3JtYWxpemUoIG5vcm1hbE1hdHJpeCAqIG5vcm1hbCApO1xuXHRnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XG59IixmcmFnbWVudFNoYWRlcjoiI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2XG52ZWMzIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgbm9ybWFsLCBpbiBtYXQ0IG1hdHJpeCApIHtcblx0Ly8gbWF0cml4IGlzIGFzc3VtZWQgdG8gYmUgb3J0aG9nb25hbFxuXHRyZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQoIG5vcm1hbCwgMC4wICkgKiBtYXRyaXggKS54eXogKTtcbn1cbnZlYzMgbGluZWFyVG9PdXRwdXQoIGluIHZlYzMgYSApIHtcblx0I2lmZGVmIEdBTU1BX09VVFBVVFxuXHRcdHJldHVybiBwb3coIGEsIHZlYzMoIDEuMCAvIGZsb2F0KCBHQU1NQV9GQUNUT1IgKSApICk7XG5cdCNlbHNlXG5cdFx0cmV0dXJuIGE7XG5cdCNlbmRpZlxufVxuLy8gc291cmNlOiBodHRwczovL2dyYXBoaWNzLnN0YW5mb3JkLmVkdS9wYXBlcnMvZW52bWFwL2Vudm1hcC5wZGZcbnZlYzMgc2hHZXRJcnJhZGlhbmNlQXQoIGluIHZlYzMgbm9ybWFsLCBpbiB2ZWMzIHNoQ29lZmZpY2llbnRzWyA5IF0gKSB7XG5cdC8vIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGhhdmUgdW5pdCBsZW5ndGhcblx0ZmxvYXQgeCBceDNkIG5vcm1hbC54LCB5IFx4M2Qgbm9ybWFsLnksIHogXHgzZCBub3JtYWwuejtcblx0Ly8gYmFuZCAwXG5cdHZlYzMgcmVzdWx0IFx4M2Qgc2hDb2VmZmljaWVudHNbIDAgXSAqIDAuODg2MjI3O1xuXHQvLyBiYW5kIDFcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyAxIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgMiBdICogMi4wICogMC41MTE2NjQgKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDMgXSAqIDIuMCAqIDAuNTExNjY0ICogeDtcblx0Ly8gYmFuZCAyXG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNCBdICogMi4wICogMC40MjkwNDMgKiB4ICogeTtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA1IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHkgKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDYgXSAqICggMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNyBdICogMi4wICogMC40MjkwNDMgKiB4ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA4IF0gKiAwLjQyOTA0MyAqICggeCAqIHggLSB5ICogeSApO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxudW5pZm9ybSB2ZWMzIHNoWyA5IF07IC8vIHNoIGNvZWZmaWNpZW50c1xudW5pZm9ybSBmbG9hdCBpbnRlbnNpdHk7IC8vIGxpZ2h0IHByb2JlIGludGVuc2l0eVxudmFyeWluZyB2ZWMzIHZOb3JtYWw7XG52b2lkIG1haW4oKSB7XG5cdHZlYzMgbm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB2Tm9ybWFsICk7XG5cdHZlYzMgd29ybGROb3JtYWwgXHgzZCBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTtcblx0dmVjMyBpcnJhZGlhbmNlIFx4M2Qgc2hHZXRJcnJhZGlhbmNlQXQoIHdvcmxkTm9ybWFsLCBzaCApO1xuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCBSRUNJUFJPQ0FMX1BJICogaXJyYWRpYW5jZSAqIGludGVuc2l0eTtcblx0b3V0Z29pbmdMaWdodCBceDNkIGxpbmVhclRvT3V0cHV0KCBvdXRnb2luZ0xpZ2h0ICk7XG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIDEuMCApO1xufSJ9KTsKZT1uZXcgc2UoMSwzMiwxNik7eWEuY2FsbCh0aGlzLGUsYik7dGhpcy5vbkJlZm9yZVJlbmRlcigpfWZ1bmN0aW9uICRpKGIsZSxoLG0pe2I9Ynx8MTA7ZT1lfHwxMDtoPW5ldyBJKHZvaWQgMCE9PWg/aDo0NDczOTI0KTttPW5ldyBJKHZvaWQgMCE9PW0/bTo4OTQ3ODQ4KTt2YXIgdT1lLzIsdz1iL2UsQT1iLzI7Yj1bXTtmb3IodmFyIEU9W10sRz0wLEo9MCxRPS1BO0c8PWU7RysrLFErPXcpe2IucHVzaCgtQSwwLFEsQSwwLFEpO2IucHVzaChRLDAsLUEsUSwwLEEpO3ZhciBTPUc9PT11P2g6bTtTLnRvQXJyYXkoRSxKKTtKKz0zO1MudG9BcnJheShFLEopO0orPTM7Uy50b0FycmF5KEUsSik7Sis9MztTLnRvQXJyYXkoRSxKKTtKKz0zfWU9bmV3IHhhO2UuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGRhKGIsMykpO2UuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IGRhKEUsMykpO2g9bmV3IE9iKHt2ZXJ0ZXhDb2xvcnM6Mn0pO1NiLmNhbGwodGhpcyxlLGgpfWZ1bmN0aW9uIGFqKGIsCmUsaCxtLHUsdyl7Yj1ifHwxMDtlPWV8fDE2O2g9aHx8ODttPW18fDY0O3U9bmV3IEkodm9pZCAwIT09dT91OjQ0NzM5MjQpO3c9bmV3IEkodm9pZCAwIT09dz93Ojg5NDc4NDgpO3ZhciBBPVtdLEU9W10sRztmb3IoRz0wO0c8PWU7RysrKXt2YXIgSj1HL2UqMipNYXRoLlBJO3ZhciBRPU1hdGguc2luKEopKmI7Sj1NYXRoLmNvcyhKKSpiO0EucHVzaCgwLDAsMCk7QS5wdXNoKFEsMCxKKTt2YXIgUz1HJjE/dTp3O0UucHVzaChTLnIsUy5nLFMuYik7RS5wdXNoKFMucixTLmcsUy5iKX1mb3IoRz0wO0c8PWg7RysrKXtTPUcmMT91Onc7dmFyIFQ9Yi1iL2gqRztmb3IoZT0wO2U8bTtlKyspSj1lL20qMipNYXRoLlBJLFE9TWF0aC5zaW4oSikqVCxKPU1hdGguY29zKEopKlQsQS5wdXNoKFEsMCxKKSxFLnB1c2goUy5yLFMuZyxTLmIpLEo9KGUrMSkvbSoyKk1hdGguUEksUT1NYXRoLnNpbihKKSpULEo9TWF0aC5jb3MoSikqVCxBLnB1c2goUSwwLEopLEUucHVzaChTLnIsUy5nLFMuYil9Yj0KbmV3IHhhO2IuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGRhKEEsMykpO2IuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IGRhKEUsMykpO0E9bmV3IE9iKHt2ZXJ0ZXhDb2xvcnM6Mn0pO1NiLmNhbGwodGhpcyxiLEEpfWZ1bmN0aW9uIG5nKGIsZSxoLG0pe3RoaXMuYXVkaW89Yjt0aGlzLnJhbmdlPWV8fDE7dGhpcy5kaXZpc2lvbnNJbm5lckFuZ2xlPWh8fDE2O3RoaXMuZGl2aXNpb25zT3V0ZXJBbmdsZT1tfHwyO2I9bmV3IHhhO2IuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFIobmV3IEZsb2F0MzJBcnJheSgzKigzKih0aGlzLmRpdmlzaW9uc0lubmVyQW5nbGUrMip0aGlzLmRpdmlzaW9uc091dGVyQW5nbGUpKzMpKSwzKSk7ZT1uZXcgT2Ioe2NvbG9yOjY1MjgwfSk7aD1uZXcgT2Ioe2NvbG9yOjE2Nzc2OTYwfSk7bWMuY2FsbCh0aGlzLGIsW2gsZV0pO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gSmgoYixlLGgsbSl7dGhpcy5vYmplY3Q9Yjt0aGlzLnNpemU9dm9pZCAwIT09CmU/ZToxO2I9dm9pZCAwIT09aD9oOjE2Nzc2OTYwO209dm9pZCAwIT09bT9tOjE7ZT0wOyhoPXRoaXMub2JqZWN0Lmdlb21ldHJ5KSYmaC5pc0dlb21ldHJ5P2U9aC5mYWNlcy5sZW5ndGg6Y29uc29sZS53YXJuKCJUSFJFRS5GYWNlTm9ybWFsc0hlbHBlcjogb25seSBUSFJFRS5HZW9tZXRyeSBpcyBzdXBwb3J0ZWQuIFVzZSBUSFJFRS5WZXJ0ZXhOb3JtYWxzSGVscGVyLCBpbnN0ZWFkLiIpO2g9bmV3IHhhO2U9bmV3IGRhKDYqZSwzKTtoLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLGUpO1NiLmNhbGwodGhpcyxoLG5ldyBPYih7Y29sb3I6YixsaW5ld2lkdGg6bX0pKTt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBvZyhiLGUsaCl7eS5jYWxsKHRoaXMpO3RoaXMubGlnaHQ9Yjt0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7dGhpcy5tYXRyaXg9Yi5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy5jb2xvcj1oOwp2b2lkIDA9PT1lJiYoZT0xKTtiPW5ldyB4YTtiLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBkYShbLWUsZSwwLGUsZSwwLGUsLWUsMCwtZSwtZSwwLC1lLGUsMF0sMykpO2U9bmV3IE9iKHtmb2c6ITF9KTt0aGlzLmxpZ2h0UGxhbmU9bmV3IG1jKGIsZSk7dGhpcy5hZGQodGhpcy5saWdodFBsYW5lKTtiPW5ldyB4YTtiLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBkYShbMCwwLDAsMCwwLDFdLDMpKTt0aGlzLnRhcmdldExpbmU9bmV3IG1jKGIsZSk7dGhpcy5hZGQodGhpcy50YXJnZXRMaW5lKTt0aGlzLnVwZGF0ZSgpfWZ1bmN0aW9uIEtoKGIpe2Z1bmN0aW9uIGUoVyxYLGlhKXtoKFcsaWEpO2goWCxpYSl9ZnVuY3Rpb24gaChXLFgpe3cucHVzaCgwLDAsMCk7QS5wdXNoKFgucixYLmcsWC5iKTt2b2lkIDA9PT1FW1ddJiYoRVtXXT1bXSk7RVtXXS5wdXNoKHcubGVuZ3RoLzMtMSl9dmFyIG09bmV3IHhhLHU9bmV3IE9iKHtjb2xvcjoxNjc3NzIxNSx2ZXJ0ZXhDb2xvcnM6MX0pLAp3PVtdLEE9W10sRT17fSxHPW5ldyBJKDE2NzU1MjAwKSxKPW5ldyBJKDE2NzExNjgwKSxRPW5ldyBJKDQzNzc1KSxTPW5ldyBJKDE2Nzc3MjE1KSxUPW5ldyBJKDMzNTU0NDMpO2UoIm4xIiwibjIiLEcpO2UoIm4yIiwibjQiLEcpO2UoIm40IiwibjMiLEcpO2UoIm4zIiwibjEiLEcpO2UoImYxIiwiZjIiLEcpO2UoImYyIiwiZjQiLEcpO2UoImY0IiwiZjMiLEcpO2UoImYzIiwiZjEiLEcpO2UoIm4xIiwiZjEiLEcpO2UoIm4yIiwiZjIiLEcpO2UoIm4zIiwiZjMiLEcpO2UoIm40IiwiZjQiLEcpO2UoInAiLCJuMSIsSik7ZSgicCIsIm4yIixKKTtlKCJwIiwibjMiLEopO2UoInAiLCJuNCIsSik7ZSgidTEiLCJ1MiIsUSk7ZSgidTIiLCJ1MyIsUSk7ZSgidTMiLCJ1MSIsUSk7ZSgiYyIsInQiLFMpO2UoInAiLCJjIixUKTtlKCJjbjEiLCJjbjIiLFQpO2UoImNuMyIsImNuNCIsVCk7ZSgiY2YxIiwiY2YyIixUKTtlKCJjZjMiLCJjZjQiLFQpO20uYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsCm5ldyBkYSh3LDMpKTttLmFkZEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBkYShBLDMpKTtTYi5jYWxsKHRoaXMsbSx1KTt0aGlzLmNhbWVyYT1iO3RoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgmJnRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTt0aGlzLm1hdHJpeD1iLm1hdHJpeFdvcmxkO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLnBvaW50TWFwPUU7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBlYyhiLGUsaCxtLHUsdyxBKXtiai5zZXQodSx3LEEpLnVucHJvamVjdChtKTtiPWVbYl07aWYodm9pZCAwIT09Yilmb3IoaD1oLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKSxlPTAsbT1iLmxlbmd0aDtlPG07ZSsrKWguc2V0WFlaKGJbZV0sYmoueCxiai55LGJqLnopfWZ1bmN0aW9uIFJkKGIsZSl7dGhpcy5vYmplY3Q9Yjt2b2lkIDA9PT1lJiYoZT0xNjc3Njk2MCk7Yj1uZXcgVWludDE2QXJyYXkoWzAsMSwxLDIsMiwzLDMsMCw0LDUsNSw2LDYsNyw3LAo0LDAsNCwxLDUsMiw2LDMsN10pO3ZhciBoPW5ldyBGbG9hdDMyQXJyYXkoMjQpLG09bmV3IHhhO20uc2V0SW5kZXgobmV3IFIoYiwxKSk7bS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgUihoLDMpKTtTYi5jYWxsKHRoaXMsbSxuZXcgT2Ioe2NvbG9yOmV9KSk7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gTGgoYixlKXt0aGlzLnR5cGU9IkJveDNIZWxwZXIiO3RoaXMuYm94PWI7ZT1lfHwxNjc3Njk2MDtiPW5ldyBVaW50MTZBcnJheShbMCwxLDEsMiwyLDMsMywwLDQsNSw1LDYsNiw3LDcsNCwwLDQsMSw1LDIsNiwzLDddKTt2YXIgaD1uZXcgeGE7aC5zZXRJbmRleChuZXcgUihiLDEpKTtoLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBkYShbMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwtMSwxLDEsMSwtMSwtMSwxLC0xLC0xLC0xLC0xLDEsLTEsLTFdLDMpKTtTYi5jYWxsKHRoaXMsaCxuZXcgT2Ioe2NvbG9yOmV9KSk7dGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKX0KZnVuY3Rpb24gTWgoYixlLGgpe3RoaXMudHlwZT0iUGxhbmVIZWxwZXIiO3RoaXMucGxhbmU9Yjt0aGlzLnNpemU9dm9pZCAwPT09ZT8xOmU7Yj12b2lkIDAhPT1oP2g6MTY3NzY5NjA7ZT1uZXcgeGE7ZS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgZGEoWzEsLTEsMSwtMSwxLDEsLTEsLTEsMSwxLDEsMSwtMSwxLDEsLTEsLTEsMSwxLC0xLDEsMSwxLDEsMCwwLDEsMCwwLDBdLDMpKTtlLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO21jLmNhbGwodGhpcyxlLG5ldyBPYih7Y29sb3I6Yn0pKTtlPW5ldyB4YTtlLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBkYShbMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwxLDEsLTEsLTEsMSwxLC0xLDFdLDMpKTtlLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3RoaXMuYWRkKG5ldyB5YShlLG5ldyBMKHtjb2xvcjpiLG9wYWNpdHk6LjIsdHJhbnNwYXJlbnQ6ITAsZGVwdGhXcml0ZTohMX0pKSl9ZnVuY3Rpb24gU2QoYixlLGgsbSx1LHcpe3kuY2FsbCh0aGlzKTsKdm9pZCAwPT09YiYmKGI9bmV3IGcoMCwwLDEpKTt2b2lkIDA9PT1lJiYoZT1uZXcgZygwLDAsMCkpO3ZvaWQgMD09PWgmJihoPTEpO3ZvaWQgMD09PW0mJihtPTE2Nzc2OTYwKTt2b2lkIDA9PT11JiYodT0uMipoKTt2b2lkIDA9PT13JiYodz0uMip1KTt2b2lkIDA9PT1jaiYmKGNqPW5ldyB4YSxjai5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgZGEoWzAsMCwwLDAsMSwwXSwzKSksWms9bmV3IFBkKDAsLjUsMSw1LDEpLFprLnRyYW5zbGF0ZSgwLC0uNSwwKSk7dGhpcy5wb3NpdGlvbi5jb3B5KGUpO3RoaXMubGluZT1uZXcgbWMoY2osbmV3IE9iKHtjb2xvcjptfSkpO3RoaXMubGluZS5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuYWRkKHRoaXMubGluZSk7dGhpcy5jb25lPW5ldyB5YShaayxuZXcgTCh7Y29sb3I6bX0pKTt0aGlzLmNvbmUubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmFkZCh0aGlzLmNvbmUpO3RoaXMuc2V0RGlyZWN0aW9uKGIpO3RoaXMuc2V0TGVuZ3RoKGgsCnUsdyl9ZnVuY3Rpb24gTmgoYil7Yj1ifHwxO3ZhciBlPVswLDAsMCxiLDAsMCwwLDAsMCwwLGIsMCwwLDAsMCwwLDAsYl07Yj1uZXcgeGE7Yi5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgZGEoZSwzKSk7Yi5hZGRBdHRyaWJ1dGUoImNvbG9yIixuZXcgZGEoWzEsMCwwLDEsLjYsMCwwLDEsMCwuNiwxLDAsMCwwLDEsMCwuNiwxXSwzKSk7ZT1uZXcgT2Ioe3ZlcnRleENvbG9yczoyfSk7U2IuY2FsbCh0aGlzLGIsZSl9ZnVuY3Rpb24gaW8oYil7Y29uc29sZS53YXJuKCJUSFJFRS5DbG9zZWRTcGxpbmVDdXJ2ZTMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4iKTt1Yy5jYWxsKHRoaXMsYik7dGhpcy50eXBlPSJjYXRtdWxscm9tIjt0aGlzLmNsb3NlZD0hMH1mdW5jdGlvbiBqbyhiKXtjb25zb2xlLndhcm4oIlRIUkVFLlNwbGluZUN1cnZlMyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLiIpOwp1Yy5jYWxsKHRoaXMsYik7dGhpcy50eXBlPSJjYXRtdWxscm9tIn1mdW5jdGlvbiAkayhiKXtjb25zb2xlLndhcm4oIlRIUkVFLlNwbGluZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLiIpO3VjLmNhbGwodGhpcyxiKTt0aGlzLnR5cGU9ImNhdG11bGxyb20ifXZvaWQgMD09PU51bWJlci5FUFNJTE9OJiYoTnVtYmVyLkVQU0lMT049TWF0aC5wb3coMiwtNTIpKTt2b2lkIDA9PT1OdW1iZXIuaXNJbnRlZ2VyJiYoTnVtYmVyLmlzSW50ZWdlcj1mdW5jdGlvbihiKXtyZXR1cm4ibnVtYmVyIj09PXR5cGVvZiBiJiZpc0Zpbml0ZShiKSYmTWF0aC5mbG9vcihiKT09PWJ9KTt2b2lkIDA9PT1NYXRoLnNpZ24mJihNYXRoLnNpZ249ZnVuY3Rpb24oYil7cmV0dXJuIDA+Yj8tMTowPGI/MTorYn0pOyExPT09Im5hbWUiaW4gRnVuY3Rpb24ucHJvdG90eXBlJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCJuYW1lIiwKe2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRvU3RyaW5nKCkubWF0Y2goL15ccypmdW5jdGlvblxzKihbXlwoXHNdKikvKVsxXX19KTt2b2lkIDA9PT1PYmplY3QuYXNzaWduJiYoT2JqZWN0LmFzc2lnbj1mdW5jdGlvbihiKXtpZih2b2lkIDA9PT1ifHxudWxsPT09Yil0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QiKTtmb3IodmFyIGU9T2JqZWN0KGIpLGg9MTtoPGFyZ3VtZW50cy5sZW5ndGg7aCsrKXt2YXIgbT1hcmd1bWVudHNbaF07aWYodm9pZCAwIT09bSYmbnVsbCE9PW0pZm9yKHZhciB1IGluIG0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG0sdSkmJihlW3VdPW1bdV0pfXJldHVybiBlfSk7T2JqZWN0LmFzc2lnbihjLnByb3RvdHlwZSx7YWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PXRoaXMuX2xpc3RlbmVycyYmKHRoaXMuX2xpc3RlbmVycz17fSk7dmFyIGg9CnRoaXMuX2xpc3RlbmVyczt2b2lkIDA9PT1oW2JdJiYoaFtiXT1bXSk7LTE9PT1oW2JdLmluZGV4T2YoZSkmJmhbYl0ucHVzaChlKX0saGFzRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihiLGUpe2lmKHZvaWQgMD09PXRoaXMuX2xpc3RlbmVycylyZXR1cm4hMTt2YXIgaD10aGlzLl9saXN0ZW5lcnM7cmV0dXJuIHZvaWQgMCE9PWhbYl0mJi0xIT09aFtiXS5pbmRleE9mKGUpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGIsZSl7dm9pZCAwIT09dGhpcy5fbGlzdGVuZXJzJiYoYj10aGlzLl9saXN0ZW5lcnNbYl0sdm9pZCAwIT09YiYmKGU9Yi5pbmRleE9mKGUpLC0xIT09ZSYmYi5zcGxpY2UoZSwxKSkpfSxkaXNwYXRjaEV2ZW50OmZ1bmN0aW9uKGIpe2lmKHZvaWQgMCE9PXRoaXMuX2xpc3RlbmVycyl7dmFyIGU9dGhpcy5fbGlzdGVuZXJzW2IudHlwZV07aWYodm9pZCAwIT09ZSl7Yi50YXJnZXQ9dGhpcztlPWUuc2xpY2UoMCk7Zm9yKHZhciBoPTAsbT1lLmxlbmd0aDtoPG07aCsrKWVbaF0uY2FsbCh0aGlzLApiKX19fX0pO2Zvcih2YXIgcGM9W10sT2g9MDsyNTY+T2g7T2grKylwY1tPaF09KDE2Pk9oPyIwIjoiIikrT2gudG9TdHJpbmcoMTYpO3ZhciBsYj17REVHMlJBRDpNYXRoLlBJLzE4MCxSQUQyREVHOjE4MC9NYXRoLlBJLGdlbmVyYXRlVVVJRDpmdW5jdGlvbigpe3ZhciBiPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLGU9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAsaD00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxtPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwO3JldHVybihwY1tiJjI1NV0rcGNbYj4+OCYyNTVdK3BjW2I+PjE2JjI1NV0rcGNbYj4+MjQmMjU1XSsiLSIrcGNbZSYyNTVdK3BjW2U+PjgmMjU1XSsiLSIrcGNbZT4+MTYmMTV8NjRdK3BjW2U+PjI0JjI1NV0rIi0iK3BjW2gmNjN8MTI4XStwY1toPj44JjI1NV0rIi0iK3BjW2g+PjE2JjI1NV0rcGNbaD4+MjQmMjU1XStwY1ttJjI1NV0rcGNbbT4+OCYyNTVdK3BjW20+PjE2JjI1NV0rcGNbbT4+MjQmMjU1XSkudG9VcHBlckNhc2UoKX0sCmNsYW1wOmZ1bmN0aW9uKGIsZSxoKXtyZXR1cm4gTWF0aC5tYXgoZSxNYXRoLm1pbihoLGIpKX0sZXVjbGlkZWFuTW9kdWxvOmZ1bmN0aW9uKGIsZSl7cmV0dXJuKGIlZStlKSVlfSxtYXBMaW5lYXI6ZnVuY3Rpb24oYixlLGgsbSx1KXtyZXR1cm4gbSsoYi1lKSoodS1tKS8oaC1lKX0sbGVycDpmdW5jdGlvbihiLGUsaCl7cmV0dXJuKDEtaCkqYitoKmV9LHNtb290aHN0ZXA6ZnVuY3Rpb24oYixlLGgpe2lmKGI8PWUpcmV0dXJuIDA7aWYoYj49aClyZXR1cm4gMTtiPShiLWUpLyhoLWUpO3JldHVybiBiKmIqKDMtMipiKX0sc21vb3RoZXJzdGVwOmZ1bmN0aW9uKGIsZSxoKXtpZihiPD1lKXJldHVybiAwO2lmKGI+PWgpcmV0dXJuIDE7Yj0oYi1lKS8oaC1lKTtyZXR1cm4gYipiKmIqKGIqKDYqYi0xNSkrMTApfSxyYW5kSW50OmZ1bmN0aW9uKGIsZSl7cmV0dXJuIGIrTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihlLWIrMSkpfSxyYW5kRmxvYXQ6ZnVuY3Rpb24oYixlKXtyZXR1cm4gYisKTWF0aC5yYW5kb20oKSooZS1iKX0scmFuZEZsb2F0U3ByZWFkOmZ1bmN0aW9uKGIpe3JldHVybiBiKiguNS1NYXRoLnJhbmRvbSgpKX0sZGVnVG9SYWQ6ZnVuY3Rpb24oYil7cmV0dXJuIGIqbGIuREVHMlJBRH0scmFkVG9EZWc6ZnVuY3Rpb24oYil7cmV0dXJuIGIqbGIuUkFEMkRFR30saXNQb3dlck9mVHdvOmZ1bmN0aW9uKGIpe3JldHVybiAwPT09KGImYi0xKSYmMCE9PWJ9LGNlaWxQb3dlck9mVHdvOmZ1bmN0aW9uKGIpe3JldHVybiBNYXRoLnBvdygyLE1hdGguY2VpbChNYXRoLmxvZyhiKS9NYXRoLkxOMikpfSxmbG9vclBvd2VyT2ZUd286ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5mbG9vcihNYXRoLmxvZyhiKS9NYXRoLkxOMikpfX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZC5wcm90b3R5cGUse3dpZHRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54fSxzZXQ6ZnVuY3Rpb24oYil7dGhpcy54PWJ9fSxoZWlnaHQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnl9LApzZXQ6ZnVuY3Rpb24oYil7dGhpcy55PWJ9fX0pO09iamVjdC5hc3NpZ24oZC5wcm90b3R5cGUse2lzVmVjdG9yMjohMCxzZXQ6ZnVuY3Rpb24oYixlKXt0aGlzLng9Yjt0aGlzLnk9ZTtyZXR1cm4gdGhpc30sc2V0U2NhbGFyOmZ1bmN0aW9uKGIpe3RoaXMueT10aGlzLng9YjtyZXR1cm4gdGhpc30sc2V0WDpmdW5jdGlvbihiKXt0aGlzLng9YjtyZXR1cm4gdGhpc30sc2V0WTpmdW5jdGlvbihiKXt0aGlzLnk9YjtyZXR1cm4gdGhpc30sc2V0Q29tcG9uZW50OmZ1bmN0aW9uKGIsZSl7c3dpdGNoKGIpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK2IpO31yZXR1cm4gdGhpc30sZ2V0Q29tcG9uZW50OmZ1bmN0aW9uKGIpe3N3aXRjaChiKXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrCmIpO319LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnkpfSxjb3B5OmZ1bmN0aW9uKGIpe3RoaXMueD1iLng7dGhpcy55PWIueTtyZXR1cm4gdGhpc30sYWRkOmZ1bmN0aW9uKGIsZSl7aWYodm9pZCAwIT09ZSlyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5hZGRWZWN0b3JzKGIsZSk7dGhpcy54Kz1iLng7dGhpcy55Kz1iLnk7cmV0dXJuIHRoaXN9LGFkZFNjYWxhcjpmdW5jdGlvbihiKXt0aGlzLngrPWI7dGhpcy55Kz1iO3JldHVybiB0aGlzfSxhZGRWZWN0b3JzOmZ1bmN0aW9uKGIsZSl7dGhpcy54PWIueCtlLng7dGhpcy55PWIueStlLnk7cmV0dXJuIHRoaXN9LGFkZFNjYWxlZFZlY3RvcjpmdW5jdGlvbihiLGUpe3RoaXMueCs9Yi54KmU7dGhpcy55Kz1iLnkqZTtyZXR1cm4gdGhpc30sCnN1YjpmdW5jdGlvbihiLGUpe2lmKHZvaWQgMCE9PWUpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuc3ViVmVjdG9ycyhiLGUpO3RoaXMueC09Yi54O3RoaXMueS09Yi55O3JldHVybiB0aGlzfSxzdWJTY2FsYXI6ZnVuY3Rpb24oYil7dGhpcy54LT1iO3RoaXMueS09YjtyZXR1cm4gdGhpc30sc3ViVmVjdG9yczpmdW5jdGlvbihiLGUpe3RoaXMueD1iLngtZS54O3RoaXMueT1iLnktZS55O3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihiKXt0aGlzLngqPWIueDt0aGlzLnkqPWIueTtyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYil7dGhpcy54Kj1iO3RoaXMueSo9YjtyZXR1cm4gdGhpc30sZGl2aWRlOmZ1bmN0aW9uKGIpe3RoaXMueC89Yi54O3RoaXMueS89Yi55O3JldHVybiB0aGlzfSxkaXZpZGVTY2FsYXI6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS8KYil9LGFwcGx5TWF0cml4MzpmdW5jdGlvbihiKXt2YXIgZT10aGlzLngsaD10aGlzLnk7Yj1iLmVsZW1lbnRzO3RoaXMueD1iWzBdKmUrYlszXSpoK2JbNl07dGhpcy55PWJbMV0qZStiWzRdKmgrYls3XTtyZXR1cm4gdGhpc30sbWluOmZ1bmN0aW9uKGIpe3RoaXMueD1NYXRoLm1pbih0aGlzLngsYi54KTt0aGlzLnk9TWF0aC5taW4odGhpcy55LGIueSk7cmV0dXJuIHRoaXN9LG1heDpmdW5jdGlvbihiKXt0aGlzLng9TWF0aC5tYXgodGhpcy54LGIueCk7dGhpcy55PU1hdGgubWF4KHRoaXMueSxiLnkpO3JldHVybiB0aGlzfSxjbGFtcDpmdW5jdGlvbihiLGUpe3RoaXMueD1NYXRoLm1heChiLngsTWF0aC5taW4oZS54LHRoaXMueCkpO3RoaXMueT1NYXRoLm1heChiLnksTWF0aC5taW4oZS55LHRoaXMueSkpO3JldHVybiB0aGlzfSxjbGFtcFNjYWxhcjpmdW5jdGlvbihiLGUpe3RoaXMueD1NYXRoLm1heChiLE1hdGgubWluKGUsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGIsTWF0aC5taW4oZSwKdGhpcy55KSk7cmV0dXJuIHRoaXN9LGNsYW1wTGVuZ3RoOmZ1bmN0aW9uKGIsZSl7dmFyIGg9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoaHx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgoYixNYXRoLm1pbihlLGgpKSl9LGZsb29yOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpO3JldHVybiB0aGlzfSxjZWlsOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGguY2VpbCh0aGlzLngpO3RoaXMueT1NYXRoLmNlaWwodGhpcy55KTtyZXR1cm4gdGhpc30scm91bmQ6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpO3RoaXMueT1NYXRoLnJvdW5kKHRoaXMueSk7cmV0dXJuIHRoaXN9LHJvdW5kVG9aZXJvOmZ1bmN0aW9uKCl7dGhpcy54PTA+dGhpcy54P01hdGguY2VpbCh0aGlzLngpOk1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9MD50aGlzLnk/TWF0aC5jZWlsKHRoaXMueSk6TWF0aC5mbG9vcih0aGlzLnkpOwpyZXR1cm4gdGhpc30sbmVnYXRlOmZ1bmN0aW9uKCl7dGhpcy54PS10aGlzLng7dGhpcy55PS10aGlzLnk7cmV0dXJuIHRoaXN9LGRvdDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy54KmIueCt0aGlzLnkqYi55fSxjcm9zczpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy54KmIueS10aGlzLnkqYi54fSxsZW5ndGhTcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnl9LGxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55KX0sbWFuaGF0dGFuTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KX0sbm9ybWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfSxhbmdsZTpmdW5jdGlvbigpe3ZhciBiPU1hdGguYXRhbjIodGhpcy55LHRoaXMueCk7MD5iJiYoYis9MipNYXRoLlBJKTtyZXR1cm4gYn0sCmRpc3RhbmNlVG86ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKGIpKX0sZGlzdGFuY2VUb1NxdWFyZWQ6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy54LWIueDtiPXRoaXMueS1iLnk7cmV0dXJuIGUqZStiKmJ9LG1hbmhhdHRhbkRpc3RhbmNlVG86ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGguYWJzKHRoaXMueC1iLngpK01hdGguYWJzKHRoaXMueS1iLnkpfSxzZXRMZW5ndGg6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoYil9LGxlcnA6ZnVuY3Rpb24oYixlKXt0aGlzLngrPShiLngtdGhpcy54KSplO3RoaXMueSs9KGIueS10aGlzLnkpKmU7cmV0dXJuIHRoaXN9LGxlcnBWZWN0b3JzOmZ1bmN0aW9uKGIsZSxoKXtyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKGUsYikubXVsdGlwbHlTY2FsYXIoaCkuYWRkKGIpfSxlcXVhbHM6ZnVuY3Rpb24oYil7cmV0dXJuIGIueD09PXRoaXMueCYmYi55PT09dGhpcy55fSwKZnJvbUFycmF5OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGU9MCk7dGhpcy54PWJbZV07dGhpcy55PWJbZSsxXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWImJihiPVtdKTt2b2lkIDA9PT1lJiYoZT0wKTtiW2VdPXRoaXMueDtiW2UrMV09dGhpcy55O3JldHVybiBifSxmcm9tQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGIsZSxoKXt2b2lkIDAhPT1oJiZjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTt0aGlzLng9Yi5nZXRYKGUpO3RoaXMueT1iLmdldFkoZSk7cmV0dXJuIHRoaXN9LHJvdGF0ZUFyb3VuZDpmdW5jdGlvbihiLGUpe3ZhciBoPU1hdGguY29zKGUpO2U9TWF0aC5zaW4oZSk7dmFyIG09dGhpcy54LWIueCx1PXRoaXMueS1iLnk7dGhpcy54PW0qaC11KmUrYi54O3RoaXMueT1tKmUrdSpoK2IueTtyZXR1cm4gdGhpc319KTtPYmplY3QuYXNzaWduKGYsCntzbGVycDpmdW5jdGlvbihiLGUsaCxtKXtyZXR1cm4gaC5jb3B5KGIpLnNsZXJwKGUsbSl9LHNsZXJwRmxhdDpmdW5jdGlvbihiLGUsaCxtLHUsdyxBKXt2YXIgRT1oW20rMF0sRz1oW20rMV0sSj1oW20rMl07aD1oW20rM107bT11W3crMF07dmFyIFE9dVt3KzFdLFM9dVt3KzJdO3U9dVt3KzNdO2lmKGghPT11fHxFIT09bXx8RyE9PVF8fEohPT1TKXt3PTEtQTt2YXIgVD1FKm0rRypRK0oqUytoKnUsVz0wPD1UPzE6LTEsWD0xLVQqVDtYPk51bWJlci5FUFNJTE9OJiYoWD1NYXRoLnNxcnQoWCksVD1NYXRoLmF0YW4yKFgsVCpXKSx3PU1hdGguc2luKHcqVCkvWCxBPU1hdGguc2luKEEqVCkvWCk7Vyo9QTtFPUUqdyttKlc7Rz1HKncrUSpXO0o9Sip3K1MqVztoPWgqdyt1Klc7dz09PTEtQSYmKEE9MS9NYXRoLnNxcnQoRSpFK0cqRytKKkoraCpoKSxFKj1BLEcqPUEsSio9QSxoKj1BKX1iW2VdPUU7YltlKzFdPUc7YltlKzJdPUo7YltlKzNdPWh9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZi5wcm90b3R5cGUsCnt4OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feH0sc2V0OmZ1bmN0aW9uKGIpe3RoaXMuX3g9Yjt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fSx5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feX0sc2V0OmZ1bmN0aW9uKGIpe3RoaXMuX3k9Yjt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fSx6OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fen0sc2V0OmZ1bmN0aW9uKGIpe3RoaXMuX3o9Yjt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fSx3OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd30sc2V0OmZ1bmN0aW9uKGIpe3RoaXMuX3c9Yjt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fX0pO09iamVjdC5hc3NpZ24oZi5wcm90b3R5cGUse2lzUXVhdGVybmlvbjohMCxzZXQ6ZnVuY3Rpb24oYixlLGgsbSl7dGhpcy5feD1iO3RoaXMuX3k9ZTt0aGlzLl96PWg7dGhpcy5fdz1tO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCwKdGhpcy5feSx0aGlzLl96LHRoaXMuX3cpfSxjb3B5OmZ1bmN0aW9uKGIpe3RoaXMuX3g9Yi54O3RoaXMuX3k9Yi55O3RoaXMuX3o9Yi56O3RoaXMuX3c9Yi53O3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2V0RnJvbUV1bGVyOmZ1bmN0aW9uKGIsZSl7aWYoIWJ8fCFiLmlzRXVsZXIpdGhyb3cgRXJyb3IoIlRIUkVFLlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLiIpO3ZhciBoPWIuX3gsbT1iLl95LHU9Yi5fejtiPWIub3JkZXI7dmFyIHc9TWF0aC5jb3MsQT1NYXRoLnNpbixFPXcoaC8yKSxHPXcobS8yKTt3PXcodS8yKTtoPUEoaC8yKTttPUEobS8yKTt1PUEodS8yKTsiWFlaIj09PWI/KHRoaXMuX3g9aCpHKncrRSptKnUsdGhpcy5feT1FKm0qdy1oKkcqdSx0aGlzLl96PUUqRyp1K2gqbSp3LHRoaXMuX3c9RSpHKnctaCptKnUpOiJZWFoiPT09CmI/KHRoaXMuX3g9aCpHKncrRSptKnUsdGhpcy5feT1FKm0qdy1oKkcqdSx0aGlzLl96PUUqRyp1LWgqbSp3LHRoaXMuX3c9RSpHKncraCptKnUpOiJaWFkiPT09Yj8odGhpcy5feD1oKkcqdy1FKm0qdSx0aGlzLl95PUUqbSp3K2gqRyp1LHRoaXMuX3o9RSpHKnUraCptKncsdGhpcy5fdz1FKkcqdy1oKm0qdSk6IlpZWCI9PT1iPyh0aGlzLl94PWgqRyp3LUUqbSp1LHRoaXMuX3k9RSptKncraCpHKnUsdGhpcy5fej1FKkcqdS1oKm0qdyx0aGlzLl93PUUqRyp3K2gqbSp1KToiWVpYIj09PWI/KHRoaXMuX3g9aCpHKncrRSptKnUsdGhpcy5feT1FKm0qdytoKkcqdSx0aGlzLl96PUUqRyp1LWgqbSp3LHRoaXMuX3c9RSpHKnctaCptKnUpOiJYWlkiPT09YiYmKHRoaXMuX3g9aCpHKnctRSptKnUsdGhpcy5feT1FKm0qdy1oKkcqdSx0aGlzLl96PUUqRyp1K2gqbSp3LHRoaXMuX3c9RSpHKncraCptKnUpOyExIT09ZSYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzZXRGcm9tQXhpc0FuZ2xlOmZ1bmN0aW9uKGIsCmUpe2UvPTI7dmFyIGg9TWF0aC5zaW4oZSk7dGhpcy5feD1iLngqaDt0aGlzLl95PWIueSpoO3RoaXMuX3o9Yi56Kmg7dGhpcy5fdz1NYXRoLmNvcyhlKTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHNldEZyb21Sb3RhdGlvbk1hdHJpeDpmdW5jdGlvbihiKXt2YXIgZT1iLmVsZW1lbnRzLGg9ZVswXTtiPWVbNF07dmFyIG09ZVs4XSx1PWVbMV0sdz1lWzVdLEE9ZVs5XSxFPWVbMl0sRz1lWzZdO2U9ZVsxMF07dmFyIEo9aCt3K2U7MDxKPyhoPS41L01hdGguc3FydChKKzEpLHRoaXMuX3c9LjI1L2gsdGhpcy5feD0oRy1BKSpoLHRoaXMuX3k9KG0tRSkqaCx0aGlzLl96PSh1LWIpKmgpOmg+dyYmaD5lPyhoPTIqTWF0aC5zcXJ0KDEraC13LWUpLHRoaXMuX3c9KEctQSkvaCx0aGlzLl94PS4yNSpoLHRoaXMuX3k9KGIrdSkvaCx0aGlzLl96PShtK0UpL2gpOnc+ZT8oaD0yKk1hdGguc3FydCgxK3ctaC1lKSx0aGlzLl93PShtLUUpL2gsdGhpcy5feD0oYit1KS9oLAp0aGlzLl95PS4yNSpoLHRoaXMuX3o9KEErRykvaCk6KGg9MipNYXRoLnNxcnQoMStlLWgtdyksdGhpcy5fdz0odS1iKS9oLHRoaXMuX3g9KG0rRSkvaCx0aGlzLl95PShBK0cpL2gsdGhpcy5fej0uMjUqaCk7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzZXRGcm9tVW5pdFZlY3RvcnM6ZnVuY3Rpb24oYixlKXt2YXIgaD1iLmRvdChlKSsxOzFFLTY+aD8oaD0wLE1hdGguYWJzKGIueCk+TWF0aC5hYnMoYi56KT8odGhpcy5feD0tYi55LHRoaXMuX3k9Yi54LHRoaXMuX3o9MCk6KHRoaXMuX3g9MCx0aGlzLl95PS1iLnosdGhpcy5fej1iLnkpKToodGhpcy5feD1iLnkqZS56LWIueiplLnksdGhpcy5feT1iLnoqZS54LWIueCplLnosdGhpcy5fej1iLngqZS55LWIueSplLngpO3RoaXMuX3c9aDtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKX0sYW5nbGVUbzpmdW5jdGlvbihiKXtyZXR1cm4gMipNYXRoLmFjb3MoTWF0aC5hYnMobGIuY2xhbXAodGhpcy5kb3QoYiksLTEsCjEpKSl9LHJvdGF0ZVRvd2FyZHM6ZnVuY3Rpb24oYixlKXt2YXIgaD10aGlzLmFuZ2xlVG8oYik7aWYoMD09PWgpcmV0dXJuIHRoaXM7dGhpcy5zbGVycChiLE1hdGgubWluKDEsZS9oKSk7cmV0dXJuIHRoaXN9LGludmVyc2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25qdWdhdGUoKX0sY29uanVnYXRlOmZ1bmN0aW9uKCl7dGhpcy5feCo9LTE7dGhpcy5feSo9LTE7dGhpcy5feio9LTE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxkb3Q6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX3gqYi5feCt0aGlzLl95KmIuX3krdGhpcy5feipiLl96K3RoaXMuX3cqYi5fd30sbGVuZ3RoU3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feCp0aGlzLl94K3RoaXMuX3kqdGhpcy5feSt0aGlzLl96KnRoaXMuX3ordGhpcy5fdyp0aGlzLl93fSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feioKdGhpcy5feit0aGlzLl93KnRoaXMuX3cpfSxub3JtYWxpemU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmxlbmd0aCgpOzA9PT1iPyh0aGlzLl96PXRoaXMuX3k9dGhpcy5feD0wLHRoaXMuX3c9MSk6KGI9MS9iLHRoaXMuX3gqPWIsdGhpcy5feSo9Yix0aGlzLl96Kj1iLHRoaXMuX3cqPWIpO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sbXVsdGlwbHk6ZnVuY3Rpb24oYixlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseVF1YXRlcm5pb25zKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoYixlKSk6dGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsYil9LHByZW11bHRpcGx5OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoYix0aGlzKX0sbXVsdGlwbHlRdWF0ZXJuaW9uczpmdW5jdGlvbihiLAplKXt2YXIgaD1iLl94LG09Yi5feSx1PWIuX3o7Yj1iLl93O3ZhciB3PWUuX3gsQT1lLl95LEU9ZS5fejtlPWUuX3c7dGhpcy5feD1oKmUrYip3K20qRS11KkE7dGhpcy5feT1tKmUrYipBK3Uqdy1oKkU7dGhpcy5fej11KmUrYipFK2gqQS1tKnc7dGhpcy5fdz1iKmUtaCp3LW0qQS11KkU7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzbGVycDpmdW5jdGlvbihiLGUpe2lmKDA9PT1lKXJldHVybiB0aGlzO2lmKDE9PT1lKXJldHVybiB0aGlzLmNvcHkoYik7dmFyIGg9dGhpcy5feCxtPXRoaXMuX3ksdT10aGlzLl96LHc9dGhpcy5fdyxBPXcqYi5fdytoKmIuX3grbSpiLl95K3UqYi5fejswPkE/KHRoaXMuX3c9LWIuX3csdGhpcy5feD0tYi5feCx0aGlzLl95PS1iLl95LHRoaXMuX3o9LWIuX3osQT0tQSk6dGhpcy5jb3B5KGIpO2lmKDE8PUEpcmV0dXJuIHRoaXMuX3c9dyx0aGlzLl94PWgsdGhpcy5feT1tLHRoaXMuX3o9dSx0aGlzO2I9MS1BKkE7aWYoYjw9TnVtYmVyLkVQU0lMT04pcmV0dXJuIEE9CjEtZSx0aGlzLl93PUEqdytlKnRoaXMuX3csdGhpcy5feD1BKmgrZSp0aGlzLl94LHRoaXMuX3k9QSptK2UqdGhpcy5feSx0aGlzLl96PUEqdStlKnRoaXMuX3osdGhpcy5ub3JtYWxpemUoKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpcztiPU1hdGguc3FydChiKTt2YXIgRT1NYXRoLmF0YW4yKGIsQSk7QT1NYXRoLnNpbigoMS1lKSpFKS9iO2U9TWF0aC5zaW4oZSpFKS9iO3RoaXMuX3c9dypBK3RoaXMuX3cqZTt0aGlzLl94PWgqQSt0aGlzLl94KmU7dGhpcy5feT1tKkErdGhpcy5feSplO3RoaXMuX3o9dSpBK3RoaXMuX3oqZTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihiKXtyZXR1cm4gYi5feD09PXRoaXMuX3gmJmIuX3k9PT10aGlzLl95JiZiLl96PT09dGhpcy5feiYmYi5fdz09PXRoaXMuX3d9LGZyb21BcnJheTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihlPTApO3RoaXMuX3g9YltlXTt0aGlzLl95PWJbZSsxXTsKdGhpcy5fej1iW2UrMl07dGhpcy5fdz1iW2UrM107dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09YiYmKGI9W10pO3ZvaWQgMD09PWUmJihlPTApO2JbZV09dGhpcy5feDtiW2UrMV09dGhpcy5feTtiW2UrMl09dGhpcy5fejtiW2UrM109dGhpcy5fdztyZXR1cm4gYn0sX29uQ2hhbmdlOmZ1bmN0aW9uKGIpe3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9YjtyZXR1cm4gdGhpc30sX29uQ2hhbmdlQ2FsbGJhY2s6ZnVuY3Rpb24oKXt9fSk7dmFyIGFsPW5ldyBnLGtvPW5ldyBmO09iamVjdC5hc3NpZ24oZy5wcm90b3R5cGUse2lzVmVjdG9yMzohMCxzZXQ6ZnVuY3Rpb24oYixlLGgpe3RoaXMueD1iO3RoaXMueT1lO3RoaXMuej1oO3JldHVybiB0aGlzfSxzZXRTY2FsYXI6ZnVuY3Rpb24oYil7dGhpcy56PXRoaXMueT10aGlzLng9YjtyZXR1cm4gdGhpc30sc2V0WDpmdW5jdGlvbihiKXt0aGlzLng9YjtyZXR1cm4gdGhpc30sCnNldFk6ZnVuY3Rpb24oYil7dGhpcy55PWI7cmV0dXJuIHRoaXN9LHNldFo6ZnVuY3Rpb24oYil7dGhpcy56PWI7cmV0dXJuIHRoaXN9LHNldENvbXBvbmVudDpmdW5jdGlvbihiLGUpe3N3aXRjaChiKXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrYik7fXJldHVybiB0aGlzfSxnZXRDb21wb25lbnQ6ZnVuY3Rpb24oYil7c3dpdGNoKGIpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2RlZmF1bHQ6dGhyb3cgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIitiKTt9fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55LHRoaXMueil9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy54PWIueDt0aGlzLnk9Yi55Owp0aGlzLno9Yi56O3JldHVybiB0aGlzfSxhZGQ6ZnVuY3Rpb24oYixlKXtpZih2b2lkIDAhPT1lKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmFkZFZlY3RvcnMoYixlKTt0aGlzLngrPWIueDt0aGlzLnkrPWIueTt0aGlzLnorPWIuejtyZXR1cm4gdGhpc30sYWRkU2NhbGFyOmZ1bmN0aW9uKGIpe3RoaXMueCs9Yjt0aGlzLnkrPWI7dGhpcy56Kz1iO3JldHVybiB0aGlzfSxhZGRWZWN0b3JzOmZ1bmN0aW9uKGIsZSl7dGhpcy54PWIueCtlLng7dGhpcy55PWIueStlLnk7dGhpcy56PWIueitlLno7cmV0dXJuIHRoaXN9LGFkZFNjYWxlZFZlY3RvcjpmdW5jdGlvbihiLGUpe3RoaXMueCs9Yi54KmU7dGhpcy55Kz1iLnkqZTt0aGlzLnorPWIueiplO3JldHVybiB0aGlzfSxzdWI6ZnVuY3Rpb24oYixlKXtpZih2b2lkIDAhPT1lKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSwKdGhpcy5zdWJWZWN0b3JzKGIsZSk7dGhpcy54LT1iLng7dGhpcy55LT1iLnk7dGhpcy56LT1iLno7cmV0dXJuIHRoaXN9LHN1YlNjYWxhcjpmdW5jdGlvbihiKXt0aGlzLngtPWI7dGhpcy55LT1iO3RoaXMuei09YjtyZXR1cm4gdGhpc30sc3ViVmVjdG9yczpmdW5jdGlvbihiLGUpe3RoaXMueD1iLngtZS54O3RoaXMueT1iLnktZS55O3RoaXMuej1iLnotZS56O3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihiLGUpe2lmKHZvaWQgMCE9PWUpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5VmVjdG9ycyhiLGUpO3RoaXMueCo9Yi54O3RoaXMueSo9Yi55O3RoaXMueio9Yi56O3JldHVybiB0aGlzfSxtdWx0aXBseVNjYWxhcjpmdW5jdGlvbihiKXt0aGlzLngqPWI7dGhpcy55Kj1iO3RoaXMueio9CmI7cmV0dXJuIHRoaXN9LG11bHRpcGx5VmVjdG9yczpmdW5jdGlvbihiLGUpe3RoaXMueD1iLngqZS54O3RoaXMueT1iLnkqZS55O3RoaXMuej1iLnoqZS56O3JldHVybiB0aGlzfSxhcHBseUV1bGVyOmZ1bmN0aW9uKGIpe2ImJmIuaXNFdWxlcnx8Y29uc29sZS5lcnJvcigiVEhSRUUuVmVjdG9yMzogLmFwcGx5RXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLiIpO3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihrby5zZXRGcm9tRXVsZXIoYikpfSxhcHBseUF4aXNBbmdsZTpmdW5jdGlvbihiLGUpe3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihrby5zZXRGcm9tQXhpc0FuZ2xlKGIsZSkpfSxhcHBseU1hdHJpeDM6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy54LGg9dGhpcy55LG09dGhpcy56O2I9Yi5lbGVtZW50czt0aGlzLng9YlswXSplK2JbM10qaCtiWzZdKm07dGhpcy55PWJbMV0qZStiWzRdKmgrYls3XSoKbTt0aGlzLno9YlsyXSplK2JbNV0qaCtiWzhdKm07cmV0dXJuIHRoaXN9LGFwcGx5TWF0cml4NDpmdW5jdGlvbihiKXt2YXIgZT10aGlzLngsaD10aGlzLnksbT10aGlzLno7Yj1iLmVsZW1lbnRzO3ZhciB1PTEvKGJbM10qZStiWzddKmgrYlsxMV0qbStiWzE1XSk7dGhpcy54PShiWzBdKmUrYls0XSpoK2JbOF0qbStiWzEyXSkqdTt0aGlzLnk9KGJbMV0qZStiWzVdKmgrYls5XSptK2JbMTNdKSp1O3RoaXMuej0oYlsyXSplK2JbNl0qaCtiWzEwXSptK2JbMTRdKSp1O3JldHVybiB0aGlzfSxhcHBseVF1YXRlcm5pb246ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy54LGg9dGhpcy55LG09dGhpcy56LHU9Yi54LHc9Yi55LEE9Yi56O2I9Yi53O3ZhciBFPWIqZSt3Km0tQSpoLEc9YipoK0EqZS11Km0sSj1iKm0rdSpoLXcqZTtlPS11KmUtdypoLUEqbTt0aGlzLng9RSpiK2UqLXUrRyotQS1KKi13O3RoaXMueT1HKmIrZSotdytKKi11LUUqLUE7dGhpcy56PUoqYitlKi1BK0UqLXctRyotdTtyZXR1cm4gdGhpc30sCnByb2plY3Q6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KGIubWF0cml4V29ybGRJbnZlcnNlKS5hcHBseU1hdHJpeDQoYi5wcm9qZWN0aW9uTWF0cml4KX0sdW5wcm9qZWN0OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4NChiLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKS5hcHBseU1hdHJpeDQoYi5tYXRyaXhXb3JsZCl9LHRyYW5zZm9ybURpcmVjdGlvbjpmdW5jdGlvbihiKXt2YXIgZT10aGlzLngsaD10aGlzLnksbT10aGlzLno7Yj1iLmVsZW1lbnRzO3RoaXMueD1iWzBdKmUrYls0XSpoK2JbOF0qbTt0aGlzLnk9YlsxXSplK2JbNV0qaCtiWzldKm07dGhpcy56PWJbMl0qZStiWzZdKmgrYlsxMF0qbTtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKX0sZGl2aWRlOmZ1bmN0aW9uKGIpe3RoaXMueC89Yi54O3RoaXMueS89Yi55O3RoaXMuei89Yi56O3JldHVybiB0aGlzfSxkaXZpZGVTY2FsYXI6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS8KYil9LG1pbjpmdW5jdGlvbihiKXt0aGlzLng9TWF0aC5taW4odGhpcy54LGIueCk7dGhpcy55PU1hdGgubWluKHRoaXMueSxiLnkpO3RoaXMuej1NYXRoLm1pbih0aGlzLnosYi56KTtyZXR1cm4gdGhpc30sbWF4OmZ1bmN0aW9uKGIpe3RoaXMueD1NYXRoLm1heCh0aGlzLngsYi54KTt0aGlzLnk9TWF0aC5tYXgodGhpcy55LGIueSk7dGhpcy56PU1hdGgubWF4KHRoaXMueixiLnopO3JldHVybiB0aGlzfSxjbGFtcDpmdW5jdGlvbihiLGUpe3RoaXMueD1NYXRoLm1heChiLngsTWF0aC5taW4oZS54LHRoaXMueCkpO3RoaXMueT1NYXRoLm1heChiLnksTWF0aC5taW4oZS55LHRoaXMueSkpO3RoaXMuej1NYXRoLm1heChiLnosTWF0aC5taW4oZS56LHRoaXMueikpO3JldHVybiB0aGlzfSxjbGFtcFNjYWxhcjpmdW5jdGlvbihiLGUpe3RoaXMueD1NYXRoLm1heChiLE1hdGgubWluKGUsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGIsTWF0aC5taW4oZSx0aGlzLnkpKTt0aGlzLno9TWF0aC5tYXgoYiwKTWF0aC5taW4oZSx0aGlzLnopKTtyZXR1cm4gdGhpc30sY2xhbXBMZW5ndGg6ZnVuY3Rpb24oYixlKXt2YXIgaD10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihofHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heChiLE1hdGgubWluKGUsaCkpKX0sZmxvb3I6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpO3RoaXMueT1NYXRoLmZsb29yKHRoaXMueSk7dGhpcy56PU1hdGguZmxvb3IodGhpcy56KTtyZXR1cm4gdGhpc30sY2VpbDpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmNlaWwodGhpcy54KTt0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSk7dGhpcy56PU1hdGguY2VpbCh0aGlzLnopO3JldHVybiB0aGlzfSxyb3VuZDpmdW5jdGlvbigpe3RoaXMueD1NYXRoLnJvdW5kKHRoaXMueCk7dGhpcy55PU1hdGgucm91bmQodGhpcy55KTt0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopO3JldHVybiB0aGlzfSxyb3VuZFRvWmVybzpmdW5jdGlvbigpe3RoaXMueD0KMD50aGlzLng/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpO3RoaXMueT0wPnRoaXMueT9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSk7dGhpcy56PTA+dGhpcy56P01hdGguY2VpbCh0aGlzLnopOk1hdGguZmxvb3IodGhpcy56KTtyZXR1cm4gdGhpc30sbmVnYXRlOmZ1bmN0aW9uKCl7dGhpcy54PS10aGlzLng7dGhpcy55PS10aGlzLnk7dGhpcy56PS10aGlzLno7cmV0dXJuIHRoaXN9LGRvdDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy54KmIueCt0aGlzLnkqYi55K3RoaXMueipiLnp9LGxlbmd0aFNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56KX0sbWFuaGF0dGFuTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KSsKTWF0aC5hYnModGhpcy56KX0sbm9ybWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfSxzZXRMZW5ndGg6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoYil9LGxlcnA6ZnVuY3Rpb24oYixlKXt0aGlzLngrPShiLngtdGhpcy54KSplO3RoaXMueSs9KGIueS10aGlzLnkpKmU7dGhpcy56Kz0oYi56LXRoaXMueikqZTtyZXR1cm4gdGhpc30sbGVycFZlY3RvcnM6ZnVuY3Rpb24oYixlLGgpe3JldHVybiB0aGlzLnN1YlZlY3RvcnMoZSxiKS5tdWx0aXBseVNjYWxhcihoKS5hZGQoYil9LGNyb3NzOmZ1bmN0aW9uKGIsZSl7cmV0dXJuIHZvaWQgMCE9PWU/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmNyb3NzKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuY3Jvc3NWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmNyb3NzVmVjdG9ycyhiLGUpKTp0aGlzLmNyb3NzVmVjdG9ycyh0aGlzLApiKX0sY3Jvc3NWZWN0b3JzOmZ1bmN0aW9uKGIsZSl7dmFyIGg9Yi54LG09Yi55O2I9Yi56O3ZhciB1PWUueCx3PWUueTtlPWUuejt0aGlzLng9bSplLWIqdzt0aGlzLnk9Yip1LWgqZTt0aGlzLno9aCp3LW0qdTtyZXR1cm4gdGhpc30scHJvamVjdE9uVmVjdG9yOmZ1bmN0aW9uKGIpe3ZhciBlPWIuZG90KHRoaXMpL2IubGVuZ3RoU3EoKTtyZXR1cm4gdGhpcy5jb3B5KGIpLm11bHRpcGx5U2NhbGFyKGUpfSxwcm9qZWN0T25QbGFuZTpmdW5jdGlvbihiKXthbC5jb3B5KHRoaXMpLnByb2plY3RPblZlY3RvcihiKTtyZXR1cm4gdGhpcy5zdWIoYWwpfSxyZWZsZWN0OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnN1YihhbC5jb3B5KGIpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QoYikpKX0sYW5nbGVUbzpmdW5jdGlvbihiKXtyZXR1cm4gTWF0aC5hY29zKGxiLmNsYW1wKHRoaXMuZG90KGIpL01hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqYi5sZW5ndGhTcSgpKSwtMSwxKSl9LGRpc3RhbmNlVG86ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKGIpKX0sCmRpc3RhbmNlVG9TcXVhcmVkOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMueC1iLngsaD10aGlzLnktYi55O2I9dGhpcy56LWIuejtyZXR1cm4gZSplK2gqaCtiKmJ9LG1hbmhhdHRhbkRpc3RhbmNlVG86ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGguYWJzKHRoaXMueC1iLngpK01hdGguYWJzKHRoaXMueS1iLnkpK01hdGguYWJzKHRoaXMuei1iLnopfSxzZXRGcm9tU3BoZXJpY2FsOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHMoYi5yYWRpdXMsYi5waGksYi50aGV0YSl9LHNldEZyb21TcGhlcmljYWxDb29yZHM6ZnVuY3Rpb24oYixlLGgpe3ZhciBtPU1hdGguc2luKGUpKmI7dGhpcy54PW0qTWF0aC5zaW4oaCk7dGhpcy55PU1hdGguY29zKGUpKmI7dGhpcy56PW0qTWF0aC5jb3MoaCk7cmV0dXJuIHRoaXN9LHNldEZyb21DeWxpbmRyaWNhbDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHMoYi5yYWRpdXMsYi50aGV0YSwKYi55KX0sc2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzOmZ1bmN0aW9uKGIsZSxoKXt0aGlzLng9YipNYXRoLnNpbihlKTt0aGlzLnk9aDt0aGlzLno9YipNYXRoLmNvcyhlKTtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeFBvc2l0aW9uOmZ1bmN0aW9uKGIpe2I9Yi5lbGVtZW50czt0aGlzLng9YlsxMl07dGhpcy55PWJbMTNdO3RoaXMuej1iWzE0XTtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeFNjYWxlOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbihiLDApLmxlbmd0aCgpLGg9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKGIsMSkubGVuZ3RoKCk7Yj10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oYiwyKS5sZW5ndGgoKTt0aGlzLng9ZTt0aGlzLnk9aDt0aGlzLno9YjtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeENvbHVtbjpmdW5jdGlvbihiLGUpe3JldHVybiB0aGlzLmZyb21BcnJheShiLmVsZW1lbnRzLDQqZSl9LGVxdWFsczpmdW5jdGlvbihiKXtyZXR1cm4gYi54PT09CnRoaXMueCYmYi55PT09dGhpcy55JiZiLno9PT10aGlzLnp9LGZyb21BcnJheTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihlPTApO3RoaXMueD1iW2VdO3RoaXMueT1iW2UrMV07dGhpcy56PWJbZSsyXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWImJihiPVtdKTt2b2lkIDA9PT1lJiYoZT0wKTtiW2VdPXRoaXMueDtiW2UrMV09dGhpcy55O2JbZSsyXT10aGlzLno7cmV0dXJuIGJ9LGZyb21CdWZmZXJBdHRyaWJ1dGU6ZnVuY3Rpb24oYixlLGgpe3ZvaWQgMCE9PWgmJmNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpO3RoaXMueD1iLmdldFgoZSk7dGhpcy55PWIuZ2V0WShlKTt0aGlzLno9Yi5nZXRaKGUpO3JldHVybiB0aGlzfX0pO3ZhciBjZj1uZXcgZztPYmplY3QuYXNzaWduKGwucHJvdG90eXBlLHtpc01hdHJpeDM6ITAsc2V0OmZ1bmN0aW9uKGIsCmUsaCxtLHUsdyxBLEUsRyl7dmFyIEo9dGhpcy5lbGVtZW50cztKWzBdPWI7SlsxXT1tO0pbMl09QTtKWzNdPWU7Sls0XT11O0pbNV09RTtKWzZdPWg7Sls3XT13O0pbOF09RztyZXR1cm4gdGhpc30saWRlbnRpdHk6ZnVuY3Rpb24oKXt0aGlzLnNldCgxLDAsMCwwLDEsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9LGNvcHk6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5lbGVtZW50cztiPWIuZWxlbWVudHM7ZVswXT1iWzBdO2VbMV09YlsxXTtlWzJdPWJbMl07ZVszXT1iWzNdO2VbNF09Yls0XTtlWzVdPWJbNV07ZVs2XT1iWzZdO2VbN109Yls3XTtlWzhdPWJbOF07cmV0dXJuIHRoaXN9LHNldEZyb21NYXRyaXg0OmZ1bmN0aW9uKGIpe2I9Yi5lbGVtZW50czt0aGlzLnNldChiWzBdLGJbNF0sYls4XSxiWzFdLGJbNV0sYls5XSxiWzJdLGJbNl0sYlsxMF0pO3JldHVybiB0aGlzfSwKYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZTpmdW5jdGlvbihiKXtmb3IodmFyIGU9MCxoPWIuY291bnQ7ZTxoO2UrKyljZi54PWIuZ2V0WChlKSxjZi55PWIuZ2V0WShlKSxjZi56PWIuZ2V0WihlKSxjZi5hcHBseU1hdHJpeDModGhpcyksYi5zZXRYWVooZSxjZi54LGNmLnksY2Yueik7cmV0dXJuIGJ9LG11bHRpcGx5OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyxiKX0scHJlbXVsdGlwbHk6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyhiLHRoaXMpfSxtdWx0aXBseU1hdHJpY2VzOmZ1bmN0aW9uKGIsZSl7dmFyIGg9Yi5lbGVtZW50cyxtPWUuZWxlbWVudHM7ZT10aGlzLmVsZW1lbnRzO2I9aFswXTt2YXIgdT1oWzNdLHc9aFs2XSxBPWhbMV0sRT1oWzRdLEc9aFs3XSxKPWhbMl0sUT1oWzVdO2g9aFs4XTt2YXIgUz1tWzBdLFQ9bVszXSxXPW1bNl0sWD1tWzFdLGlhPW1bNF0saGE9bVs3XSxzYT1tWzJdLHFhPW1bNV07bT1tWzhdOwplWzBdPWIqUyt1KlgrdypzYTtlWzNdPWIqVCt1KmlhK3cqcWE7ZVs2XT1iKlcrdSpoYSt3Km07ZVsxXT1BKlMrRSpYK0cqc2E7ZVs0XT1BKlQrRSppYStHKnFhO2VbN109QSpXK0UqaGErRyptO2VbMl09SipTK1EqWCtoKnNhO2VbNV09SipUK1EqaWEraCpxYTtlWzhdPUoqVytRKmhhK2gqbTtyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5lbGVtZW50cztlWzBdKj1iO2VbM10qPWI7ZVs2XSo9YjtlWzFdKj1iO2VbNF0qPWI7ZVs3XSo9YjtlWzJdKj1iO2VbNV0qPWI7ZVs4XSo9YjtyZXR1cm4gdGhpc30sZGV0ZXJtaW5hbnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmVsZW1lbnRzLGU9YlswXSxoPWJbMV0sbT1iWzJdLHU9YlszXSx3PWJbNF0sQT1iWzVdLEU9Yls2XSxHPWJbN107Yj1iWzhdO3JldHVybiBlKncqYi1lKkEqRy1oKnUqYitoKkEqRSttKnUqRy1tKncqRX0sZ2V0SW52ZXJzZTpmdW5jdGlvbihiLGUpe2ImJmIuaXNNYXRyaXg0JiYKY29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4MzogLmdldEludmVyc2UoKSBubyBsb25nZXIgdGFrZXMgYSBNYXRyaXg0IGFyZ3VtZW50LiIpO3ZhciBoPWIuZWxlbWVudHM7Yj10aGlzLmVsZW1lbnRzO3ZhciBtPWhbMF0sdT1oWzFdLHc9aFsyXSxBPWhbM10sRT1oWzRdLEc9aFs1XSxKPWhbNl0sUT1oWzddO2g9aFs4XTt2YXIgUz1oKkUtRypRLFQ9RypKLWgqQSxXPVEqQS1FKkosWD1tKlMrdSpUK3cqVztpZigwPT09WCl7aWYoITA9PT1lKXRocm93IEVycm9yKCJUSFJFRS5NYXRyaXgzOiAuZ2V0SW52ZXJzZSgpIGNhbid0IGludmVydCBtYXRyaXgsIGRldGVybWluYW50IGlzIDAiKTtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDM6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMCIpO3JldHVybiB0aGlzLmlkZW50aXR5KCl9ZT0xL1g7YlswXT1TKmU7YlsxXT0odypRLWgqdSkqZTtiWzJdPShHKnUtdypFKSplO2JbM109VCplO2JbNF09CihoKm0tdypKKSplO2JbNV09KHcqQS1HKm0pKmU7Yls2XT1XKmU7Yls3XT0odSpKLVEqbSkqZTtiWzhdPShFKm0tdSpBKSplO3JldHVybiB0aGlzfSx0cmFuc3Bvc2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmVsZW1lbnRzO3ZhciBlPWJbMV07YlsxXT1iWzNdO2JbM109ZTtlPWJbMl07YlsyXT1iWzZdO2JbNl09ZTtlPWJbNV07Yls1XT1iWzddO2JbN109ZTtyZXR1cm4gdGhpc30sZ2V0Tm9ybWFsTWF0cml4OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KGIpLmdldEludmVyc2UodGhpcykudHJhbnNwb3NlKCl9LHRyYW5zcG9zZUludG9BcnJheTpmdW5jdGlvbihiKXt2YXIgZT10aGlzLmVsZW1lbnRzO2JbMF09ZVswXTtiWzFdPWVbM107YlsyXT1lWzZdO2JbM109ZVsxXTtiWzRdPWVbNF07Yls1XT1lWzddO2JbNl09ZVsyXTtiWzddPWVbNV07Yls4XT1lWzhdO3JldHVybiB0aGlzfSxzZXRVdlRyYW5zZm9ybTpmdW5jdGlvbihiLGUsaCxtLHUsdyxBKXt2YXIgRT0KTWF0aC5jb3ModSk7dT1NYXRoLnNpbih1KTt0aGlzLnNldChoKkUsaCp1LC1oKihFKncrdSpBKSt3K2IsLW0qdSxtKkUsLW0qKC11KncrRSpBKStBK2UsMCwwLDEpfSxzY2FsZTpmdW5jdGlvbihiLGUpe3ZhciBoPXRoaXMuZWxlbWVudHM7aFswXSo9YjtoWzNdKj1iO2hbNl0qPWI7aFsxXSo9ZTtoWzRdKj1lO2hbN10qPWU7cmV0dXJuIHRoaXN9LHJvdGF0ZTpmdW5jdGlvbihiKXt2YXIgZT1NYXRoLmNvcyhiKTtiPU1hdGguc2luKGIpO3ZhciBoPXRoaXMuZWxlbWVudHMsbT1oWzBdLHU9aFszXSx3PWhbNl0sQT1oWzFdLEU9aFs0XSxHPWhbN107aFswXT1lKm0rYipBO2hbM109ZSp1K2IqRTtoWzZdPWUqdytiKkc7aFsxXT0tYiptK2UqQTtoWzRdPS1iKnUrZSpFO2hbN109LWIqdytlKkc7cmV0dXJuIHRoaXN9LHRyYW5zbGF0ZTpmdW5jdGlvbihiLGUpe3ZhciBoPXRoaXMuZWxlbWVudHM7aFswXSs9YipoWzJdO2hbM10rPWIqaFs1XTtoWzZdKz1iKmhbOF07aFsxXSs9ZSpoWzJdO2hbNF0rPQplKmhbNV07aFs3XSs9ZSpoWzhdO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5lbGVtZW50cztiPWIuZWxlbWVudHM7Zm9yKHZhciBoPTA7OT5oO2grKylpZihlW2hdIT09YltoXSlyZXR1cm4hMTtyZXR1cm4hMH0sZnJvbUFycmF5OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGU9MCk7Zm9yKHZhciBoPTA7OT5oO2grKyl0aGlzLmVsZW1lbnRzW2hdPWJbaCtlXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWImJihiPVtdKTt2b2lkIDA9PT1lJiYoZT0wKTt2YXIgaD10aGlzLmVsZW1lbnRzO2JbZV09aFswXTtiW2UrMV09aFsxXTtiW2UrMl09aFsyXTtiW2UrM109aFszXTtiW2UrNF09aFs0XTtiW2UrNV09aFs1XTtiW2UrNl09aFs2XTtiW2UrN109aFs3XTtiW2UrOF09aFs4XTtyZXR1cm4gYn19KTt2YXIgcGcsdWU9e2dldERhdGFVUkw6ZnVuY3Rpb24oYil7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudClyZXR1cm4gYi5zcmM7CmlmKCEoYiBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KSl7dm9pZCAwPT09cGcmJihwZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJjYW52YXMiKSk7cGcud2lkdGg9Yi53aWR0aDtwZy5oZWlnaHQ9Yi5oZWlnaHQ7dmFyIGU9cGcuZ2V0Q29udGV4dCgiMmQiKTtiIGluc3RhbmNlb2YgSW1hZ2VEYXRhP2UucHV0SW1hZ2VEYXRhKGIsMCwwKTplLmRyYXdJbWFnZShiLDAsMCxiLndpZHRoLGIuaGVpZ2h0KTtiPXBnfXJldHVybiAyMDQ4PGIud2lkdGh8fDIwNDg8Yi5oZWlnaHQ/Yi50b0RhdGFVUkwoImltYWdlL2pwZWciLC42KTpiLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIil9fSxKcT0wO2suREVGQVVMVF9JTUFHRT12b2lkIDA7ay5ERUZBVUxUX01BUFBJTkc9MzAwO2sucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmssaXNUZXh0dXJlOiEwLHVwZGF0ZU1hdHJpeDpmdW5jdGlvbigpe3RoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKHRoaXMub2Zmc2V0LngsCnRoaXMub2Zmc2V0LnksdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55LHRoaXMucm90YXRpb24sdGhpcy5jZW50ZXIueCx0aGlzLmNlbnRlci55KX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy5uYW1lPWIubmFtZTt0aGlzLmltYWdlPWIuaW1hZ2U7dGhpcy5taXBtYXBzPWIubWlwbWFwcy5zbGljZSgwKTt0aGlzLm1hcHBpbmc9Yi5tYXBwaW5nO3RoaXMud3JhcFM9Yi53cmFwUzt0aGlzLndyYXBUPWIud3JhcFQ7dGhpcy5tYWdGaWx0ZXI9Yi5tYWdGaWx0ZXI7dGhpcy5taW5GaWx0ZXI9Yi5taW5GaWx0ZXI7dGhpcy5hbmlzb3Ryb3B5PWIuYW5pc290cm9weTt0aGlzLmZvcm1hdD1iLmZvcm1hdDt0aGlzLnR5cGU9Yi50eXBlO3RoaXMub2Zmc2V0LmNvcHkoYi5vZmZzZXQpO3RoaXMucmVwZWF0LmNvcHkoYi5yZXBlYXQpO3RoaXMuY2VudGVyLmNvcHkoYi5jZW50ZXIpO3RoaXMucm90YXRpb249CmIucm90YXRpb247dGhpcy5tYXRyaXhBdXRvVXBkYXRlPWIubWF0cml4QXV0b1VwZGF0ZTt0aGlzLm1hdHJpeC5jb3B5KGIubWF0cml4KTt0aGlzLmdlbmVyYXRlTWlwbWFwcz1iLmdlbmVyYXRlTWlwbWFwczt0aGlzLnByZW11bHRpcGx5QWxwaGE9Yi5wcmVtdWx0aXBseUFscGhhO3RoaXMuZmxpcFk9Yi5mbGlwWTt0aGlzLnVucGFja0FsaWdubWVudD1iLnVucGFja0FsaWdubWVudDt0aGlzLmVuY29kaW5nPWIuZW5jb2Rpbmc7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihiKXt2YXIgZT12b2lkIDA9PT1ifHwic3RyaW5nIj09PXR5cGVvZiBiO2lmKCFlJiZ2b2lkIDAhPT1iLnRleHR1cmVzW3RoaXMudXVpZF0pcmV0dXJuIGIudGV4dHVyZXNbdGhpcy51dWlkXTt2YXIgaD17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6IlRleHR1cmUiLGdlbmVyYXRvcjoiVGV4dHVyZS50b0pTT04ifSx1dWlkOnRoaXMudXVpZCxuYW1lOnRoaXMubmFtZSxtYXBwaW5nOnRoaXMubWFwcGluZywKcmVwZWF0Olt0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnldLG9mZnNldDpbdGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55XSxjZW50ZXI6W3RoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueV0scm90YXRpb246dGhpcy5yb3RhdGlvbix3cmFwOlt0aGlzLndyYXBTLHRoaXMud3JhcFRdLGZvcm1hdDp0aGlzLmZvcm1hdCx0eXBlOnRoaXMudHlwZSxlbmNvZGluZzp0aGlzLmVuY29kaW5nLG1pbkZpbHRlcjp0aGlzLm1pbkZpbHRlcixtYWdGaWx0ZXI6dGhpcy5tYWdGaWx0ZXIsYW5pc290cm9weTp0aGlzLmFuaXNvdHJvcHksZmxpcFk6dGhpcy5mbGlwWSxwcmVtdWx0aXBseUFscGhhOnRoaXMucHJlbXVsdGlwbHlBbHBoYSx1bnBhY2tBbGlnbm1lbnQ6dGhpcy51bnBhY2tBbGlnbm1lbnR9O2lmKHZvaWQgMCE9PXRoaXMuaW1hZ2Upe3ZhciBtPXRoaXMuaW1hZ2U7dm9pZCAwPT09bS51dWlkJiYobS51dWlkPWxiLmdlbmVyYXRlVVVJRCgpKTtpZighZSYmdm9pZCAwPT09Yi5pbWFnZXNbbS51dWlkXSl7aWYoQXJyYXkuaXNBcnJheShtKSl7dmFyIHU9CltdO2Zvcih2YXIgdz0wLEE9bS5sZW5ndGg7dzxBO3crKyl1LnB1c2godWUuZ2V0RGF0YVVSTChtW3ddKSl9ZWxzZSB1PXVlLmdldERhdGFVUkwobSk7Yi5pbWFnZXNbbS51dWlkXT17dXVpZDptLnV1aWQsdXJsOnV9fWguaW1hZ2U9bS51dWlkfWV8fChiLnRleHR1cmVzW3RoaXMudXVpZF09aCk7cmV0dXJuIGh9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9LHRyYW5zZm9ybVV2OmZ1bmN0aW9uKGIpe2lmKDMwMCE9PXRoaXMubWFwcGluZylyZXR1cm4gYjtiLmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCk7aWYoMD5iLnh8fDE8Yi54KXN3aXRjaCh0aGlzLndyYXBTKXtjYXNlIDFFMzpiLngtPU1hdGguZmxvb3IoYi54KTticmVhaztjYXNlIDEwMDE6Yi54PTA+Yi54PzA6MTticmVhaztjYXNlIDEwMDI6Yi54PTE9PT1NYXRoLmFicyhNYXRoLmZsb29yKGIueCklMik/TWF0aC5jZWlsKGIueCktYi54OmIueC1NYXRoLmZsb29yKGIueCl9aWYoMD4KYi55fHwxPGIueSlzd2l0Y2godGhpcy53cmFwVCl7Y2FzZSAxRTM6Yi55LT1NYXRoLmZsb29yKGIueSk7YnJlYWs7Y2FzZSAxMDAxOmIueT0wPmIueT8wOjE7YnJlYWs7Y2FzZSAxMDAyOmIueT0xPT09TWF0aC5hYnMoTWF0aC5mbG9vcihiLnkpJTIpP01hdGguY2VpbChiLnkpLWIueTpiLnktTWF0aC5mbG9vcihiLnkpfXRoaXMuZmxpcFkmJihiLnk9MS1iLnkpO3JldHVybiBifX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShrLnByb3RvdHlwZSwibmVlZHNVcGRhdGUiLHtzZXQ6ZnVuY3Rpb24oYil7ITA9PT1iJiZ0aGlzLnZlcnNpb24rK319KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhuLnByb3RvdHlwZSx7d2lkdGg6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnp9LHNldDpmdW5jdGlvbihiKXt0aGlzLno9Yn19LGhlaWdodDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud30sc2V0OmZ1bmN0aW9uKGIpe3RoaXMudz1ifX19KTtPYmplY3QuYXNzaWduKG4ucHJvdG90eXBlLAp7aXNWZWN0b3I0OiEwLHNldDpmdW5jdGlvbihiLGUsaCxtKXt0aGlzLng9Yjt0aGlzLnk9ZTt0aGlzLno9aDt0aGlzLnc9bTtyZXR1cm4gdGhpc30sc2V0U2NhbGFyOmZ1bmN0aW9uKGIpe3RoaXMudz10aGlzLno9dGhpcy55PXRoaXMueD1iO3JldHVybiB0aGlzfSxzZXRYOmZ1bmN0aW9uKGIpe3RoaXMueD1iO3JldHVybiB0aGlzfSxzZXRZOmZ1bmN0aW9uKGIpe3RoaXMueT1iO3JldHVybiB0aGlzfSxzZXRaOmZ1bmN0aW9uKGIpe3RoaXMuej1iO3JldHVybiB0aGlzfSxzZXRXOmZ1bmN0aW9uKGIpe3RoaXMudz1iO3JldHVybiB0aGlzfSxzZXRDb21wb25lbnQ6ZnVuY3Rpb24oYixlKXtzd2l0Y2goYil7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztjYXNlIDI6dGhpcy56PWU7YnJlYWs7Y2FzZSAzOnRoaXMudz1lO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIitiKTt9cmV0dXJuIHRoaXN9LGdldENvbXBvbmVudDpmdW5jdGlvbihiKXtzd2l0Y2goYil7Y2FzZSAwOnJldHVybiB0aGlzLng7CmNhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2Nhc2UgMzpyZXR1cm4gdGhpcy53O2RlZmF1bHQ6dGhyb3cgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIitiKTt9fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55LHRoaXMueix0aGlzLncpfSxjb3B5OmZ1bmN0aW9uKGIpe3RoaXMueD1iLng7dGhpcy55PWIueTt0aGlzLno9Yi56O3RoaXMudz12b2lkIDAhPT1iLnc/Yi53OjE7cmV0dXJuIHRoaXN9LGFkZDpmdW5jdGlvbihiLGUpe2lmKHZvaWQgMCE9PWUpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yNDogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuYWRkVmVjdG9ycyhiLGUpO3RoaXMueCs9Yi54O3RoaXMueSs9Yi55O3RoaXMueis9Yi56O3RoaXMudys9Yi53O3JldHVybiB0aGlzfSwKYWRkU2NhbGFyOmZ1bmN0aW9uKGIpe3RoaXMueCs9Yjt0aGlzLnkrPWI7dGhpcy56Kz1iO3RoaXMudys9YjtyZXR1cm4gdGhpc30sYWRkVmVjdG9yczpmdW5jdGlvbihiLGUpe3RoaXMueD1iLngrZS54O3RoaXMueT1iLnkrZS55O3RoaXMuej1iLnorZS56O3RoaXMudz1iLncrZS53O3JldHVybiB0aGlzfSxhZGRTY2FsZWRWZWN0b3I6ZnVuY3Rpb24oYixlKXt0aGlzLngrPWIueCplO3RoaXMueSs9Yi55KmU7dGhpcy56Kz1iLnoqZTt0aGlzLncrPWIudyplO3JldHVybiB0aGlzfSxzdWI6ZnVuY3Rpb24oYixlKXtpZih2b2lkIDAhPT1lKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLnN1YlZlY3RvcnMoYixlKTt0aGlzLngtPWIueDt0aGlzLnktPWIueTt0aGlzLnotPWIuejt0aGlzLnctPWIudztyZXR1cm4gdGhpc30sc3ViU2NhbGFyOmZ1bmN0aW9uKGIpe3RoaXMueC09CmI7dGhpcy55LT1iO3RoaXMuei09Yjt0aGlzLnctPWI7cmV0dXJuIHRoaXN9LHN1YlZlY3RvcnM6ZnVuY3Rpb24oYixlKXt0aGlzLng9Yi54LWUueDt0aGlzLnk9Yi55LWUueTt0aGlzLno9Yi56LWUuejt0aGlzLnc9Yi53LWUudztyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYil7dGhpcy54Kj1iO3RoaXMueSo9Yjt0aGlzLnoqPWI7dGhpcy53Kj1iO3JldHVybiB0aGlzfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy54LGg9dGhpcy55LG09dGhpcy56LHU9dGhpcy53O2I9Yi5lbGVtZW50czt0aGlzLng9YlswXSplK2JbNF0qaCtiWzhdKm0rYlsxMl0qdTt0aGlzLnk9YlsxXSplK2JbNV0qaCtiWzldKm0rYlsxM10qdTt0aGlzLno9YlsyXSplK2JbNl0qaCtiWzEwXSptK2JbMTRdKnU7dGhpcy53PWJbM10qZStiWzddKmgrYlsxMV0qbStiWzE1XSp1O3JldHVybiB0aGlzfSxkaXZpZGVTY2FsYXI6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS8KYil9LHNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGIpe3RoaXMudz0yKk1hdGguYWNvcyhiLncpO3ZhciBlPU1hdGguc3FydCgxLWIudypiLncpOzFFLTQ+ZT8odGhpcy54PTEsdGhpcy56PXRoaXMueT0wKToodGhpcy54PWIueC9lLHRoaXMueT1iLnkvZSx0aGlzLno9Yi56L2UpO3JldHVybiB0aGlzfSxzZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXg6ZnVuY3Rpb24oYil7Yj1iLmVsZW1lbnRzO3ZhciBlPWJbMF07dmFyIGg9Yls0XTt2YXIgbT1iWzhdLHU9YlsxXSx3PWJbNV0sQT1iWzldO3ZhciBFPWJbMl07dmFyIEc9Yls2XTt2YXIgSj1iWzEwXTtpZiguMDE+TWF0aC5hYnMoaC11KSYmLjAxPk1hdGguYWJzKG0tRSkmJi4wMT5NYXRoLmFicyhBLUcpKXtpZiguMT5NYXRoLmFicyhoK3UpJiYuMT5NYXRoLmFicyhtK0UpJiYuMT5NYXRoLmFicyhBK0cpJiYuMT5NYXRoLmFicyhlK3crSi0zKSlyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCksdGhpcztiPU1hdGguUEk7CmU9KGUrMSkvMjt3PSh3KzEpLzI7Sj0oSisxKS8yO2g9KGgrdSkvNDttPShtK0UpLzQ7QT0oQStHKS80O2U+dyYmZT5KPy4wMT5lPyhHPTAsaD1FPS43MDcxMDY3ODEpOihHPU1hdGguc3FydChlKSxFPWgvRyxoPW0vRyk6dz5KPy4wMT53PyhHPS43MDcxMDY3ODEsRT0wLGg9LjcwNzEwNjc4MSk6KEU9TWF0aC5zcXJ0KHcpLEc9aC9FLGg9QS9FKTouMDE+Sj8oRT1HPS43MDcxMDY3ODEsaD0wKTooaD1NYXRoLnNxcnQoSiksRz1tL2gsRT1BL2gpO3RoaXMuc2V0KEcsRSxoLGIpO3JldHVybiB0aGlzfWI9TWF0aC5zcXJ0KChHLUEpKihHLUEpKyhtLUUpKihtLUUpKyh1LWgpKih1LWgpKTsuMDAxPk1hdGguYWJzKGIpJiYoYj0xKTt0aGlzLng9KEctQSkvYjt0aGlzLnk9KG0tRSkvYjt0aGlzLno9KHUtaCkvYjt0aGlzLnc9TWF0aC5hY29zKChlK3crSi0xKS8yKTtyZXR1cm4gdGhpc30sbWluOmZ1bmN0aW9uKGIpe3RoaXMueD1NYXRoLm1pbih0aGlzLngsYi54KTt0aGlzLnk9TWF0aC5taW4odGhpcy55LApiLnkpO3RoaXMuej1NYXRoLm1pbih0aGlzLnosYi56KTt0aGlzLnc9TWF0aC5taW4odGhpcy53LGIudyk7cmV0dXJuIHRoaXN9LG1heDpmdW5jdGlvbihiKXt0aGlzLng9TWF0aC5tYXgodGhpcy54LGIueCk7dGhpcy55PU1hdGgubWF4KHRoaXMueSxiLnkpO3RoaXMuej1NYXRoLm1heCh0aGlzLnosYi56KTt0aGlzLnc9TWF0aC5tYXgodGhpcy53LGIudyk7cmV0dXJuIHRoaXN9LGNsYW1wOmZ1bmN0aW9uKGIsZSl7dGhpcy54PU1hdGgubWF4KGIueCxNYXRoLm1pbihlLngsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGIueSxNYXRoLm1pbihlLnksdGhpcy55KSk7dGhpcy56PU1hdGgubWF4KGIueixNYXRoLm1pbihlLnosdGhpcy56KSk7dGhpcy53PU1hdGgubWF4KGIudyxNYXRoLm1pbihlLncsdGhpcy53KSk7cmV0dXJuIHRoaXN9LGNsYW1wU2NhbGFyOmZ1bmN0aW9uKGIsZSl7dGhpcy54PU1hdGgubWF4KGIsTWF0aC5taW4oZSx0aGlzLngpKTt0aGlzLnk9TWF0aC5tYXgoYixNYXRoLm1pbihlLAp0aGlzLnkpKTt0aGlzLno9TWF0aC5tYXgoYixNYXRoLm1pbihlLHRoaXMueikpO3RoaXMudz1NYXRoLm1heChiLE1hdGgubWluKGUsdGhpcy53KSk7cmV0dXJuIHRoaXN9LGNsYW1wTGVuZ3RoOmZ1bmN0aW9uKGIsZSl7dmFyIGg9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoaHx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgoYixNYXRoLm1pbihlLGgpKSl9LGZsb29yOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpO3RoaXMuej1NYXRoLmZsb29yKHRoaXMueik7dGhpcy53PU1hdGguZmxvb3IodGhpcy53KTtyZXR1cm4gdGhpc30sY2VpbDpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmNlaWwodGhpcy54KTt0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSk7dGhpcy56PU1hdGguY2VpbCh0aGlzLnopO3RoaXMudz1NYXRoLmNlaWwodGhpcy53KTtyZXR1cm4gdGhpc30scm91bmQ6ZnVuY3Rpb24oKXt0aGlzLng9Ck1hdGgucm91bmQodGhpcy54KTt0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpO3RoaXMuej1NYXRoLnJvdW5kKHRoaXMueik7dGhpcy53PU1hdGgucm91bmQodGhpcy53KTtyZXR1cm4gdGhpc30scm91bmRUb1plcm86ZnVuY3Rpb24oKXt0aGlzLng9MD50aGlzLng/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpO3RoaXMueT0wPnRoaXMueT9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSk7dGhpcy56PTA+dGhpcy56P01hdGguY2VpbCh0aGlzLnopOk1hdGguZmxvb3IodGhpcy56KTt0aGlzLnc9MD50aGlzLnc/TWF0aC5jZWlsKHRoaXMudyk6TWF0aC5mbG9vcih0aGlzLncpO3JldHVybiB0aGlzfSxuZWdhdGU6ZnVuY3Rpb24oKXt0aGlzLng9LXRoaXMueDt0aGlzLnk9LXRoaXMueTt0aGlzLno9LXRoaXMuejt0aGlzLnc9LXRoaXMudztyZXR1cm4gdGhpc30sZG90OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLngqYi54K3RoaXMueSpiLnkrdGhpcy56KgpiLnordGhpcy53KmIud30sbGVuZ3RoU3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMud30sbGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53KX0sbWFuaGF0dGFuTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopK01hdGguYWJzKHRoaXMudyl9LG5vcm1hbGl6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX0sc2V0TGVuZ3RoOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGIpfSxsZXJwOmZ1bmN0aW9uKGIsZSl7dGhpcy54Kz0oYi54LXRoaXMueCkqZTt0aGlzLnkrPShiLnktdGhpcy55KSplO3RoaXMueis9KGIuei0KdGhpcy56KSplO3RoaXMudys9KGIudy10aGlzLncpKmU7cmV0dXJuIHRoaXN9LGxlcnBWZWN0b3JzOmZ1bmN0aW9uKGIsZSxoKXtyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKGUsYikubXVsdGlwbHlTY2FsYXIoaCkuYWRkKGIpfSxlcXVhbHM6ZnVuY3Rpb24oYil7cmV0dXJuIGIueD09PXRoaXMueCYmYi55PT09dGhpcy55JiZiLno9PT10aGlzLnomJmIudz09PXRoaXMud30sZnJvbUFycmF5OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGU9MCk7dGhpcy54PWJbZV07dGhpcy55PWJbZSsxXTt0aGlzLno9YltlKzJdO3RoaXMudz1iW2UrM107cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1iJiYoYj1bXSk7dm9pZCAwPT09ZSYmKGU9MCk7YltlXT10aGlzLng7YltlKzFdPXRoaXMueTtiW2UrMl09dGhpcy56O2JbZSszXT10aGlzLnc7cmV0dXJuIGJ9LGZyb21CdWZmZXJBdHRyaWJ1dGU6ZnVuY3Rpb24oYixlLGgpe3ZvaWQgMCE9PWgmJmNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yNDogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpOwp0aGlzLng9Yi5nZXRYKGUpO3RoaXMueT1iLmdldFkoZSk7dGhpcy56PWIuZ2V0WihlKTt0aGlzLnc9Yi5nZXRXKGUpO3JldHVybiB0aGlzfX0pO3AucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnAsaXNXZWJHTFJlbmRlclRhcmdldDohMCxzZXRTaXplOmZ1bmN0aW9uKGIsZSl7aWYodGhpcy53aWR0aCE9PWJ8fHRoaXMuaGVpZ2h0IT09ZSl0aGlzLndpZHRoPWIsdGhpcy5oZWlnaHQ9ZSx0aGlzLnRleHR1cmUuaW1hZ2Uud2lkdGg9Yix0aGlzLnRleHR1cmUuaW1hZ2UuaGVpZ2h0PWUsdGhpcy5kaXNwb3NlKCk7dGhpcy52aWV3cG9ydC5zZXQoMCwwLGIsZSk7dGhpcy5zY2lzc29yLnNldCgwLDAsYixlKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy53aWR0aD1iLndpZHRoO3RoaXMuaGVpZ2h0PWIuaGVpZ2h0O3RoaXMudmlld3BvcnQuY29weShiLnZpZXdwb3J0KTsKdGhpcy50ZXh0dXJlPWIudGV4dHVyZS5jbG9uZSgpO3RoaXMuZGVwdGhCdWZmZXI9Yi5kZXB0aEJ1ZmZlcjt0aGlzLnN0ZW5jaWxCdWZmZXI9Yi5zdGVuY2lsQnVmZmVyO3RoaXMuZGVwdGhUZXh0dXJlPWIuZGVwdGhUZXh0dXJlO3JldHVybiB0aGlzfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX0pO3EucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShwLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnEsaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0OiEwLGNvcHk6ZnVuY3Rpb24oYil7cC5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5zYW1wbGVzPWIuc2FtcGxlcztyZXR1cm4gdGhpc319KTt2YXIgTWM9bmV3IGcsZmM9bmV3IHIsdHM9bmV3IGcoMCwwLDApLHVzPW5ldyBnKDEsMSwxKSx2ZT1uZXcgZyxkaj1uZXcgZyxCYz1uZXcgZztPYmplY3QuYXNzaWduKHIucHJvdG90eXBlLHtpc01hdHJpeDQ6ITAsCnNldDpmdW5jdGlvbihiLGUsaCxtLHUsdyxBLEUsRyxKLFEsUyxULFcsWCxpYSl7dmFyIGhhPXRoaXMuZWxlbWVudHM7aGFbMF09YjtoYVs0XT1lO2hhWzhdPWg7aGFbMTJdPW07aGFbMV09dTtoYVs1XT13O2hhWzldPUE7aGFbMTNdPUU7aGFbMl09RztoYVs2XT1KO2hhWzEwXT1RO2hhWzE0XT1TO2hhWzNdPVQ7aGFbN109VztoYVsxMV09WDtoYVsxNV09aWE7cmV0dXJuIHRoaXN9LGlkZW50aXR5OmZ1bmN0aW9uKCl7dGhpcy5zZXQoMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyByKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9LGNvcHk6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5lbGVtZW50cztiPWIuZWxlbWVudHM7ZVswXT1iWzBdO2VbMV09YlsxXTtlWzJdPWJbMl07ZVszXT1iWzNdO2VbNF09Yls0XTtlWzVdPWJbNV07ZVs2XT1iWzZdO2VbN109Yls3XTtlWzhdPWJbOF07ZVs5XT1iWzldO2VbMTBdPQpiWzEwXTtlWzExXT1iWzExXTtlWzEyXT1iWzEyXTtlWzEzXT1iWzEzXTtlWzE0XT1iWzE0XTtlWzE1XT1iWzE1XTtyZXR1cm4gdGhpc30sY29weVBvc2l0aW9uOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuZWxlbWVudHM7Yj1iLmVsZW1lbnRzO2VbMTJdPWJbMTJdO2VbMTNdPWJbMTNdO2VbMTRdPWJbMTRdO3JldHVybiB0aGlzfSxleHRyYWN0QmFzaXM6ZnVuY3Rpb24oYixlLGgpe2Iuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDApO2Uuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDEpO2guc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDIpO3JldHVybiB0aGlzfSxtYWtlQmFzaXM6ZnVuY3Rpb24oYixlLGgpe3RoaXMuc2V0KGIueCxlLngsaC54LDAsYi55LGUueSxoLnksMCxiLnosZS56LGgueiwwLDAsMCwwLDEpO3JldHVybiB0aGlzfSxleHRyYWN0Um90YXRpb246ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5lbGVtZW50cyxoPWIuZWxlbWVudHMsbT0xL01jLnNldEZyb21NYXRyaXhDb2x1bW4oYiwKMCkubGVuZ3RoKCksdT0xL01jLnNldEZyb21NYXRyaXhDb2x1bW4oYiwxKS5sZW5ndGgoKTtiPTEvTWMuc2V0RnJvbU1hdHJpeENvbHVtbihiLDIpLmxlbmd0aCgpO2VbMF09aFswXSptO2VbMV09aFsxXSptO2VbMl09aFsyXSptO2VbM109MDtlWzRdPWhbNF0qdTtlWzVdPWhbNV0qdTtlWzZdPWhbNl0qdTtlWzddPTA7ZVs4XT1oWzhdKmI7ZVs5XT1oWzldKmI7ZVsxMF09aFsxMF0qYjtlWzExXT0wO2VbMTJdPTA7ZVsxM109MDtlWzE0XT0wO2VbMTVdPTE7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvbkZyb21FdWxlcjpmdW5jdGlvbihiKXtiJiZiLmlzRXVsZXJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5tYWtlUm90YXRpb25Gcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuIik7dmFyIGU9dGhpcy5lbGVtZW50cyxoPWIueCxtPWIueSx1PWIueix3PU1hdGguY29zKGgpO2g9TWF0aC5zaW4oaCk7CnZhciBBPU1hdGguY29zKG0pO209TWF0aC5zaW4obSk7dmFyIEU9TWF0aC5jb3ModSk7dT1NYXRoLnNpbih1KTtpZigiWFlaIj09PWIub3JkZXIpe2I9dypFO3ZhciBHPXcqdSxKPWgqRSxRPWgqdTtlWzBdPUEqRTtlWzRdPS1BKnU7ZVs4XT1tO2VbMV09RytKKm07ZVs1XT1iLVEqbTtlWzldPS1oKkE7ZVsyXT1RLWIqbTtlWzZdPUorRyptO2VbMTBdPXcqQX1lbHNlIllYWiI9PT1iLm9yZGVyPyhiPUEqRSxHPUEqdSxKPW0qRSxRPW0qdSxlWzBdPWIrUSpoLGVbNF09SipoLUcsZVs4XT13Km0sZVsxXT13KnUsZVs1XT13KkUsZVs5XT0taCxlWzJdPUcqaC1KLGVbNl09UStiKmgsZVsxMF09dypBKToiWlhZIj09PWIub3JkZXI/KGI9QSpFLEc9QSp1LEo9bSpFLFE9bSp1LGVbMF09Yi1RKmgsZVs0XT0tdyp1LGVbOF09SitHKmgsZVsxXT1HK0oqaCxlWzVdPXcqRSxlWzldPVEtYipoLGVbMl09LXcqbSxlWzZdPWgsZVsxMF09dypBKToiWllYIj09PWIub3JkZXI/KGI9dypFLEc9dyp1LEo9aCoKRSxRPWgqdSxlWzBdPUEqRSxlWzRdPUoqbS1HLGVbOF09YiptK1EsZVsxXT1BKnUsZVs1XT1RKm0rYixlWzldPUcqbS1KLGVbMl09LW0sZVs2XT1oKkEsZVsxMF09dypBKToiWVpYIj09PWIub3JkZXI/KGI9dypBLEc9dyptLEo9aCpBLFE9aCptLGVbMF09QSpFLGVbNF09US1iKnUsZVs4XT1KKnUrRyxlWzFdPXUsZVs1XT13KkUsZVs5XT0taCpFLGVbMl09LW0qRSxlWzZdPUcqdStKLGVbMTBdPWItUSp1KToiWFpZIj09PWIub3JkZXImJihiPXcqQSxHPXcqbSxKPWgqQSxRPWgqbSxlWzBdPUEqRSxlWzRdPS11LGVbOF09bSpFLGVbMV09Yip1K1EsZVs1XT13KkUsZVs5XT1HKnUtSixlWzJdPUoqdS1HLGVbNl09aCpFLGVbMTBdPVEqdStiKTtlWzNdPTA7ZVs3XT0wO2VbMTFdPTA7ZVsxMl09MDtlWzEzXT0wO2VbMTRdPTA7ZVsxNV09MTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb246ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuY29tcG9zZSh0cyxiLHVzKX0sbG9va0F0OmZ1bmN0aW9uKGIsCmUsaCl7dmFyIG09dGhpcy5lbGVtZW50cztCYy5zdWJWZWN0b3JzKGIsZSk7MD09PUJjLmxlbmd0aFNxKCkmJihCYy56PTEpO0JjLm5vcm1hbGl6ZSgpO3ZlLmNyb3NzVmVjdG9ycyhoLEJjKTswPT09dmUubGVuZ3RoU3EoKSYmKDE9PT1NYXRoLmFicyhoLnopP0JjLngrPTFFLTQ6QmMueis9MUUtNCxCYy5ub3JtYWxpemUoKSx2ZS5jcm9zc1ZlY3RvcnMoaCxCYykpO3ZlLm5vcm1hbGl6ZSgpO2RqLmNyb3NzVmVjdG9ycyhCYyx2ZSk7bVswXT12ZS54O21bNF09ZGoueDttWzhdPUJjLng7bVsxXT12ZS55O21bNV09ZGoueTttWzldPUJjLnk7bVsyXT12ZS56O21bNl09ZGouejttWzEwXT1CYy56O3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihiLGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5TWF0cmljZXMoIGEsIGIgKSBpbnN0ZWFkLiIpLAp0aGlzLm11bHRpcGx5TWF0cmljZXMoYixlKSk6dGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsYil9LHByZW11bHRpcGx5OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoYix0aGlzKX0sbXVsdGlwbHlNYXRyaWNlczpmdW5jdGlvbihiLGUpe3ZhciBoPWIuZWxlbWVudHMsbT1lLmVsZW1lbnRzO2U9dGhpcy5lbGVtZW50cztiPWhbMF07dmFyIHU9aFs0XSx3PWhbOF0sQT1oWzEyXSxFPWhbMV0sRz1oWzVdLEo9aFs5XSxRPWhbMTNdLFM9aFsyXSxUPWhbNl0sVz1oWzEwXSxYPWhbMTRdLGlhPWhbM10saGE9aFs3XSxzYT1oWzExXTtoPWhbMTVdO3ZhciBxYT1tWzBdLHJhPW1bNF0sd2E9bVs4XSxwYT1tWzEyXSx2YT1tWzFdLENhPW1bNV0sVmE9bVs5XSxXYT1tWzEzXSxEYT1tWzJdLElhPW1bNl0sRWE9bVsxMF0sT2E9bVsxNF0saGI9bVszXSx5Yj1tWzddLExhPW1bMTFdO209bVsxNV07ZVswXT1iKnFhK3UqdmErdypEYStBKmhiO2VbNF09YipyYSt1KkNhK3cqCklhK0EqeWI7ZVs4XT1iKndhK3UqVmErdypFYStBKkxhO2VbMTJdPWIqcGErdSpXYSt3Kk9hK0EqbTtlWzFdPUUqcWErRyp2YStKKkRhK1EqaGI7ZVs1XT1FKnJhK0cqQ2ErSipJYStRKnliO2VbOV09RSp3YStHKlZhK0oqRWErUSpMYTtlWzEzXT1FKnBhK0cqV2ErSipPYStRKm07ZVsyXT1TKnFhK1QqdmErVypEYStYKmhiO2VbNl09UypyYStUKkNhK1cqSWErWCp5YjtlWzEwXT1TKndhK1QqVmErVypFYStYKkxhO2VbMTRdPVMqcGErVCpXYStXKk9hK1gqbTtlWzNdPWlhKnFhK2hhKnZhK3NhKkRhK2gqaGI7ZVs3XT1pYSpyYStoYSpDYStzYSpJYStoKnliO2VbMTFdPWlhKndhK2hhKlZhK3NhKkVhK2gqTGE7ZVsxNV09aWEqcGEraGEqV2Erc2EqT2EraCptO3JldHVybiB0aGlzfSxtdWx0aXBseVNjYWxhcjpmdW5jdGlvbihiKXt2YXIgZT10aGlzLmVsZW1lbnRzO2VbMF0qPWI7ZVs0XSo9YjtlWzhdKj1iO2VbMTJdKj1iO2VbMV0qPWI7ZVs1XSo9YjtlWzldKj1iO2VbMTNdKj1iO2VbMl0qPQpiO2VbNl0qPWI7ZVsxMF0qPWI7ZVsxNF0qPWI7ZVszXSo9YjtlWzddKj1iO2VbMTFdKj1iO2VbMTVdKj1iO3JldHVybiB0aGlzfSxhcHBseVRvQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZT0wLGg9Yi5jb3VudDtlPGg7ZSsrKU1jLng9Yi5nZXRYKGUpLE1jLnk9Yi5nZXRZKGUpLE1jLno9Yi5nZXRaKGUpLE1jLmFwcGx5TWF0cml4NCh0aGlzKSxiLnNldFhZWihlLE1jLngsTWMueSxNYy56KTtyZXR1cm4gYn0sZGV0ZXJtaW5hbnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmVsZW1lbnRzLGU9YlswXSxoPWJbNF0sbT1iWzhdLHU9YlsxMl0sdz1iWzFdLEE9Yls1XSxFPWJbOV0sRz1iWzEzXSxKPWJbMl0sUT1iWzZdLFM9YlsxMF0sVD1iWzE0XTtyZXR1cm4gYlszXSooK3UqRSpRLW0qRypRLXUqQSpTK2gqRypTK20qQSpULWgqRSpUKStiWzddKigrZSpFKlQtZSpHKlMrdSp3KlMtbSp3KlQrbSpHKkotdSpFKkopK2JbMTFdKigrZSpHKlEtZSpBKlQtdSp3KlEraCp3KlQrCnUqQSpKLWgqRypKKStiWzE1XSooLW0qQSpKLWUqRSpRK2UqQSpTK20qdypRLWgqdypTK2gqRSpKKX0sdHJhbnNwb3NlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lbGVtZW50czt2YXIgZT1iWzFdO2JbMV09Yls0XTtiWzRdPWU7ZT1iWzJdO2JbMl09Yls4XTtiWzhdPWU7ZT1iWzZdO2JbNl09Yls5XTtiWzldPWU7ZT1iWzNdO2JbM109YlsxMl07YlsxMl09ZTtlPWJbN107Yls3XT1iWzEzXTtiWzEzXT1lO2U9YlsxMV07YlsxMV09YlsxNF07YlsxNF09ZTtyZXR1cm4gdGhpc30sc2V0UG9zaXRpb246ZnVuY3Rpb24oYixlLGgpe3ZhciBtPXRoaXMuZWxlbWVudHM7Yi5pc1ZlY3RvcjM/KG1bMTJdPWIueCxtWzEzXT1iLnksbVsxNF09Yi56KToobVsxMl09YixtWzEzXT1lLG1bMTRdPWgpO3JldHVybiB0aGlzfSxnZXRJbnZlcnNlOmZ1bmN0aW9uKGIsZSl7dmFyIGg9dGhpcy5lbGVtZW50cyxtPWIuZWxlbWVudHM7Yj1tWzBdO3ZhciB1PW1bMV0sdz1tWzJdLEE9bVszXSxFPW1bNF0sRz1tWzVdLApKPW1bNl0sUT1tWzddLFM9bVs4XSxUPW1bOV0sVz1tWzEwXSxYPW1bMTFdLGlhPW1bMTJdLGhhPW1bMTNdLHNhPW1bMTRdO209bVsxNV07dmFyIHFhPVQqc2EqUS1oYSpXKlEraGEqSipYLUcqc2EqWC1UKkoqbStHKlcqbSxyYT1pYSpXKlEtUypzYSpRLWlhKkoqWCtFKnNhKlgrUypKKm0tRSpXKm0sd2E9UypoYSpRLWlhKlQqUStpYSpHKlgtRSpoYSpYLVMqRyptK0UqVCptLHBhPWlhKlQqSi1TKmhhKkotaWEqRypXK0UqaGEqVytTKkcqc2EtRSpUKnNhLHZhPWIqcWErdSpyYSt3KndhK0EqcGE7aWYoMD09PXZhKXtpZighMD09PWUpdGhyb3cgRXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMCIpO2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmdldEludmVyc2UoKSBjYW4ndCBpbnZlcnQgbWF0cml4LCBkZXRlcm1pbmFudCBpcyAwIik7cmV0dXJuIHRoaXMuaWRlbnRpdHkoKX1lPTEvdmE7aFswXT0KcWEqZTtoWzFdPShoYSpXKkEtVCpzYSpBLWhhKncqWCt1KnNhKlgrVCp3Km0tdSpXKm0pKmU7aFsyXT0oRypzYSpBLWhhKkoqQStoYSp3KlEtdSpzYSpRLUcqdyptK3UqSiptKSplO2hbM109KFQqSipBLUcqVypBLVQqdypRK3UqVypRK0cqdypYLXUqSipYKSplO2hbNF09cmEqZTtoWzVdPShTKnNhKkEtaWEqVypBK2lhKncqWC1iKnNhKlgtUyp3Km0rYipXKm0pKmU7aFs2XT0oaWEqSipBLUUqc2EqQS1pYSp3KlErYipzYSpRK0UqdyptLWIqSiptKSplO2hbN109KEUqVypBLVMqSipBK1MqdypRLWIqVypRLUUqdypYK2IqSipYKSplO2hbOF09d2EqZTtoWzldPShpYSpUKkEtUypoYSpBLWlhKnUqWCtiKmhhKlgrUyp1Km0tYipUKm0pKmU7aFsxMF09KEUqaGEqQS1pYSpHKkEraWEqdSpRLWIqaGEqUS1FKnUqbStiKkcqbSkqZTtoWzExXT0oUypHKkEtRSpUKkEtUyp1KlErYipUKlErRSp1KlgtYipHKlgpKmU7aFsxMl09cGEqZTtoWzEzXT0oUypoYSp3LWlhKlQqdytpYSp1KlctYipoYSpXLQpTKnUqc2ErYipUKnNhKSplO2hbMTRdPShpYSpHKnctRSpoYSp3LWlhKnUqSitiKmhhKkorRSp1KnNhLWIqRypzYSkqZTtoWzE1XT0oRSpUKnctUypHKncrUyp1KkotYipUKkotRSp1KlcrYipHKlcpKmU7cmV0dXJuIHRoaXN9LHNjYWxlOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuZWxlbWVudHMsaD1iLngsbT1iLnk7Yj1iLno7ZVswXSo9aDtlWzRdKj1tO2VbOF0qPWI7ZVsxXSo9aDtlWzVdKj1tO2VbOV0qPWI7ZVsyXSo9aDtlWzZdKj1tO2VbMTBdKj1iO2VbM10qPWg7ZVs3XSo9bTtlWzExXSo9YjtyZXR1cm4gdGhpc30sZ2V0TWF4U2NhbGVPbkF4aXM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmVsZW1lbnRzO3JldHVybiBNYXRoLnNxcnQoTWF0aC5tYXgoYlswXSpiWzBdK2JbMV0qYlsxXStiWzJdKmJbMl0sYls0XSpiWzRdK2JbNV0qYls1XStiWzZdKmJbNl0sYls4XSpiWzhdK2JbOV0qYls5XStiWzEwXSpiWzEwXSkpfSxtYWtlVHJhbnNsYXRpb246ZnVuY3Rpb24oYixlLGgpe3RoaXMuc2V0KDEsCjAsMCxiLDAsMSwwLGUsMCwwLDEsaCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uWDpmdW5jdGlvbihiKXt2YXIgZT1NYXRoLmNvcyhiKTtiPU1hdGguc2luKGIpO3RoaXMuc2V0KDEsMCwwLDAsMCxlLC1iLDAsMCxiLGUsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uWTpmdW5jdGlvbihiKXt2YXIgZT1NYXRoLmNvcyhiKTtiPU1hdGguc2luKGIpO3RoaXMuc2V0KGUsMCxiLDAsMCwxLDAsMCwtYiwwLGUsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uWjpmdW5jdGlvbihiKXt2YXIgZT1NYXRoLmNvcyhiKTtiPU1hdGguc2luKGIpO3RoaXMuc2V0KGUsLWIsMCwwLGIsZSwwLDAsMCwwLDEsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uQXhpczpmdW5jdGlvbihiLGUpe3ZhciBoPU1hdGguY29zKGUpO2U9TWF0aC5zaW4oZSk7dmFyIG09MS1oLHU9Yi54LHc9Yi55O2I9Yi56O3ZhciBBPW0qdSxFPW0qdzt0aGlzLnNldChBKgp1K2gsQSp3LWUqYixBKmIrZSp3LDAsQSp3K2UqYixFKncraCxFKmItZSp1LDAsQSpiLWUqdyxFKmIrZSp1LG0qYipiK2gsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVNjYWxlOmZ1bmN0aW9uKGIsZSxoKXt0aGlzLnNldChiLDAsMCwwLDAsZSwwLDAsMCwwLGgsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVNoZWFyOmZ1bmN0aW9uKGIsZSxoKXt0aGlzLnNldCgxLGUsaCwwLGIsMSxoLDAsYixlLDEsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sY29tcG9zZTpmdW5jdGlvbihiLGUsaCl7dmFyIG09dGhpcy5lbGVtZW50cyx1PWUuX3gsdz1lLl95LEE9ZS5feixFPWUuX3csRz11K3UsSj13K3csUT1BK0E7ZT11Kkc7dmFyIFM9dSpKO3UqPVE7dmFyIFQ9dypKO3cqPVE7QSo9UTtHKj1FO0oqPUU7RSo9UTtRPWgueDt2YXIgVz1oLnk7aD1oLno7bVswXT0oMS0oVCtBKSkqUTttWzFdPShTK0UpKlE7bVsyXT0odS1KKSpRO21bM109MDttWzRdPShTLUUpKlc7bVs1XT0oMS0oZStBKSkqClc7bVs2XT0odytHKSpXO21bN109MDttWzhdPSh1K0opKmg7bVs5XT0ody1HKSpoO21bMTBdPSgxLShlK1QpKSpoO21bMTFdPTA7bVsxMl09Yi54O21bMTNdPWIueTttWzE0XT1iLno7bVsxNV09MTtyZXR1cm4gdGhpc30sZGVjb21wb3NlOmZ1bmN0aW9uKGIsZSxoKXt2YXIgbT10aGlzLmVsZW1lbnRzLHU9TWMuc2V0KG1bMF0sbVsxXSxtWzJdKS5sZW5ndGgoKSx3PU1jLnNldChtWzRdLG1bNV0sbVs2XSkubGVuZ3RoKCksQT1NYy5zZXQobVs4XSxtWzldLG1bMTBdKS5sZW5ndGgoKTswPnRoaXMuZGV0ZXJtaW5hbnQoKSYmKHU9LXUpO2IueD1tWzEyXTtiLnk9bVsxM107Yi56PW1bMTRdO2ZjLmNvcHkodGhpcyk7Yj0xL3U7bT0xL3c7dmFyIEU9MS9BO2ZjLmVsZW1lbnRzWzBdKj1iO2ZjLmVsZW1lbnRzWzFdKj1iO2ZjLmVsZW1lbnRzWzJdKj1iO2ZjLmVsZW1lbnRzWzRdKj1tO2ZjLmVsZW1lbnRzWzVdKj1tO2ZjLmVsZW1lbnRzWzZdKj1tO2ZjLmVsZW1lbnRzWzhdKj1FO2ZjLmVsZW1lbnRzWzldKj0KRTtmYy5lbGVtZW50c1sxMF0qPUU7ZS5zZXRGcm9tUm90YXRpb25NYXRyaXgoZmMpO2gueD11O2gueT13O2guej1BO3JldHVybiB0aGlzfSxtYWtlUGVyc3BlY3RpdmU6ZnVuY3Rpb24oYixlLGgsbSx1LHcpe3ZvaWQgMD09PXcmJmNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm1ha2VQZXJzcGVjdGl2ZSgpIGhhcyBiZWVuIHJlZGVmaW5lZCBhbmQgaGFzIGEgbmV3IHNpZ25hdHVyZS4gUGxlYXNlIGNoZWNrIHRoZSBkb2NzLiIpO3ZhciBBPXRoaXMuZWxlbWVudHM7QVswXT0yKnUvKGUtYik7QVs0XT0wO0FbOF09KGUrYikvKGUtYik7QVsxMl09MDtBWzFdPTA7QVs1XT0yKnUvKGgtbSk7QVs5XT0oaCttKS8oaC1tKTtBWzEzXT0wO0FbMl09MDtBWzZdPTA7QVsxMF09LSh3K3UpLyh3LXUpO0FbMTRdPS0yKncqdS8ody11KTtBWzNdPTA7QVs3XT0wO0FbMTFdPS0xO0FbMTVdPTA7cmV0dXJuIHRoaXN9LG1ha2VPcnRob2dyYXBoaWM6ZnVuY3Rpb24oYixlLGgsbSx1LHcpe3ZhciBBPQp0aGlzLmVsZW1lbnRzLEU9MS8oZS1iKSxHPTEvKGgtbSksSj0xLyh3LXUpO0FbMF09MipFO0FbNF09MDtBWzhdPTA7QVsxMl09LSgoZStiKSpFKTtBWzFdPTA7QVs1XT0yKkc7QVs5XT0wO0FbMTNdPS0oKGgrbSkqRyk7QVsyXT0wO0FbNl09MDtBWzEwXT0tMipKO0FbMTRdPS0oKHcrdSkqSik7QVszXT0wO0FbN109MDtBWzExXT0wO0FbMTVdPTE7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihiKXt2YXIgZT10aGlzLmVsZW1lbnRzO2I9Yi5lbGVtZW50cztmb3IodmFyIGg9MDsxNj5oO2grKylpZihlW2hdIT09YltoXSlyZXR1cm4hMTtyZXR1cm4hMH0sZnJvbUFycmF5OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGU9MCk7Zm9yKHZhciBoPTA7MTY+aDtoKyspdGhpcy5lbGVtZW50c1toXT1iW2grZV07cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1iJiYoYj1bXSk7dm9pZCAwPT09ZSYmKGU9MCk7dmFyIGg9dGhpcy5lbGVtZW50cztiW2VdPWhbMF07CmJbZSsxXT1oWzFdO2JbZSsyXT1oWzJdO2JbZSszXT1oWzNdO2JbZSs0XT1oWzRdO2JbZSs1XT1oWzVdO2JbZSs2XT1oWzZdO2JbZSs3XT1oWzddO2JbZSs4XT1oWzhdO2JbZSs5XT1oWzldO2JbZSsxMF09aFsxMF07YltlKzExXT1oWzExXTtiW2UrMTJdPWhbMTJdO2JbZSsxM109aFsxM107YltlKzE0XT1oWzE0XTtiW2UrMTVdPWhbMTVdO3JldHVybiBifX0pO3ZhciBsbz1uZXcgcixtbz1uZXcgZjt0LlJvdGF0aW9uT3JkZXJzPSJYWVogWVpYIFpYWSBYWlkgWVhaIFpZWCIuc3BsaXQoIiAiKTt0LkRlZmF1bHRPcmRlcj0iWFlaIjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LnByb3RvdHlwZSx7eDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3h9LHNldDpmdW5jdGlvbihiKXt0aGlzLl94PWI7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX0seTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3l9LHNldDpmdW5jdGlvbihiKXt0aGlzLl95PWI7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX0sCno6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl96fSxzZXQ6ZnVuY3Rpb24oYil7dGhpcy5fej1iO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX19LG9yZGVyOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JkZXJ9LHNldDpmdW5jdGlvbihiKXt0aGlzLl9vcmRlcj1iO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX19fSk7T2JqZWN0LmFzc2lnbih0LnByb3RvdHlwZSx7aXNFdWxlcjohMCxzZXQ6ZnVuY3Rpb24oYixlLGgsbSl7dGhpcy5feD1iO3RoaXMuX3k9ZTt0aGlzLl96PWg7dGhpcy5fb3JkZXI9bXx8dGhpcy5fb3JkZXI7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl9vcmRlcil9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy5feD1iLl94O3RoaXMuX3k9Yi5feTt0aGlzLl96PWIuX3o7dGhpcy5fb3JkZXI9Yi5fb3JkZXI7CnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2V0RnJvbVJvdGF0aW9uTWF0cml4OmZ1bmN0aW9uKGIsZSxoKXt2YXIgbT1sYi5jbGFtcCx1PWIuZWxlbWVudHM7Yj11WzBdO3ZhciB3PXVbNF0sQT11WzhdLEU9dVsxXSxHPXVbNV0sSj11WzldLFE9dVsyXSxTPXVbNl07dT11WzEwXTtlPWV8fHRoaXMuX29yZGVyOyJYWVoiPT09ZT8odGhpcy5feT1NYXRoLmFzaW4obShBLC0xLDEpKSwuOTk5OTk5OT5NYXRoLmFicyhBKT8odGhpcy5feD1NYXRoLmF0YW4yKC1KLHUpLHRoaXMuX3o9TWF0aC5hdGFuMigtdyxiKSk6KHRoaXMuX3g9TWF0aC5hdGFuMihTLEcpLHRoaXMuX3o9MCkpOiJZWFoiPT09ZT8odGhpcy5feD1NYXRoLmFzaW4oLW0oSiwtMSwxKSksLjk5OTk5OTk+TWF0aC5hYnMoSik/KHRoaXMuX3k9TWF0aC5hdGFuMihBLHUpLHRoaXMuX3o9TWF0aC5hdGFuMihFLEcpKToodGhpcy5feT1NYXRoLmF0YW4yKC1RLGIpLHRoaXMuX3o9MCkpOiJaWFkiPT09ZT8odGhpcy5feD0KTWF0aC5hc2luKG0oUywtMSwxKSksLjk5OTk5OTk+TWF0aC5hYnMoUyk/KHRoaXMuX3k9TWF0aC5hdGFuMigtUSx1KSx0aGlzLl96PU1hdGguYXRhbjIoLXcsRykpOih0aGlzLl95PTAsdGhpcy5fej1NYXRoLmF0YW4yKEUsYikpKToiWllYIj09PWU/KHRoaXMuX3k9TWF0aC5hc2luKC1tKFEsLTEsMSkpLC45OTk5OTk5Pk1hdGguYWJzKFEpPyh0aGlzLl94PU1hdGguYXRhbjIoUyx1KSx0aGlzLl96PU1hdGguYXRhbjIoRSxiKSk6KHRoaXMuX3g9MCx0aGlzLl96PU1hdGguYXRhbjIoLXcsRykpKToiWVpYIj09PWU/KHRoaXMuX3o9TWF0aC5hc2luKG0oRSwtMSwxKSksLjk5OTk5OTk+TWF0aC5hYnMoRSk/KHRoaXMuX3g9TWF0aC5hdGFuMigtSixHKSx0aGlzLl95PU1hdGguYXRhbjIoLVEsYikpOih0aGlzLl94PTAsdGhpcy5feT1NYXRoLmF0YW4yKEEsdSkpKToiWFpZIj09PWU/KHRoaXMuX3o9TWF0aC5hc2luKC1tKHcsLTEsMSkpLC45OTk5OTk5Pk1hdGguYWJzKHcpPyh0aGlzLl94PQpNYXRoLmF0YW4yKFMsRyksdGhpcy5feT1NYXRoLmF0YW4yKEEsYikpOih0aGlzLl94PU1hdGguYXRhbjIoLUosdSksdGhpcy5feT0wKSk6Y29uc29sZS53YXJuKCJUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGdpdmVuIHVuc3VwcG9ydGVkIG9yZGVyOiAiK2UpO3RoaXMuX29yZGVyPWU7ITEhPT1oJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHNldEZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGIsZSxoKXtsby5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihiKTtyZXR1cm4gdGhpcy5zZXRGcm9tUm90YXRpb25NYXRyaXgobG8sZSxoKX0sc2V0RnJvbVZlY3RvcjM6ZnVuY3Rpb24oYixlKXtyZXR1cm4gdGhpcy5zZXQoYi54LGIueSxiLnosZXx8dGhpcy5fb3JkZXIpfSxyZW9yZGVyOmZ1bmN0aW9uKGIpe21vLnNldEZyb21FdWxlcih0aGlzKTtyZXR1cm4gdGhpcy5zZXRGcm9tUXVhdGVybmlvbihtbyxiKX0sZXF1YWxzOmZ1bmN0aW9uKGIpe3JldHVybiBiLl94PT09CnRoaXMuX3gmJmIuX3k9PT10aGlzLl95JiZiLl96PT09dGhpcy5feiYmYi5fb3JkZXI9PT10aGlzLl9vcmRlcn0sZnJvbUFycmF5OmZ1bmN0aW9uKGIpe3RoaXMuX3g9YlswXTt0aGlzLl95PWJbMV07dGhpcy5fej1iWzJdO3ZvaWQgMCE9PWJbM10mJih0aGlzLl9vcmRlcj1iWzNdKTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1iJiYoYj1bXSk7dm9pZCAwPT09ZSYmKGU9MCk7YltlXT10aGlzLl94O2JbZSsxXT10aGlzLl95O2JbZSsyXT10aGlzLl96O2JbZSszXT10aGlzLl9vcmRlcjtyZXR1cm4gYn0sdG9WZWN0b3IzOmZ1bmN0aW9uKGIpe3JldHVybiBiP2Iuc2V0KHRoaXMuX3gsdGhpcy5feSx0aGlzLl96KTpuZXcgZyh0aGlzLl94LHRoaXMuX3ksdGhpcy5feil9LF9vbkNoYW5nZTpmdW5jdGlvbihiKXt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPWI7cmV0dXJuIHRoaXN9LF9vbkNoYW5nZUNhbGxiYWNrOmZ1bmN0aW9uKCl7fX0pOwpPYmplY3QuYXNzaWduKHYucHJvdG90eXBlLHtzZXQ6ZnVuY3Rpb24oYil7dGhpcy5tYXNrPTE8PGJ8MH0sZW5hYmxlOmZ1bmN0aW9uKGIpe3RoaXMubWFzaz10aGlzLm1hc2t8MTw8YnwwfSxlbmFibGVBbGw6ZnVuY3Rpb24oKXt0aGlzLm1hc2s9LTF9LHRvZ2dsZTpmdW5jdGlvbihiKXt0aGlzLm1hc2tePTE8PGJ8MH0sZGlzYWJsZTpmdW5jdGlvbihiKXt0aGlzLm1hc2smPX4oMTw8YnwwKX0sZGlzYWJsZUFsbDpmdW5jdGlvbigpe3RoaXMubWFzaz0wfSx0ZXN0OmZ1bmN0aW9uKGIpe3JldHVybiAwIT09KHRoaXMubWFzayZiLm1hc2spfX0pO3ZhciBLcT0wLG5vPW5ldyBnLHFnPW5ldyBmLFRkPW5ldyByLGVqPW5ldyBnLFBoPW5ldyBnLHZzPW5ldyBnLHdzPW5ldyBmLG9vPW5ldyBnKDEsMCwwKSxwbz1uZXcgZygwLDEsMCkscW89bmV3IGcoMCwwLDEpLHhzPXt0eXBlOiJhZGRlZCJ9LHlzPXt0eXBlOiJyZW1vdmVkIn07eS5EZWZhdWx0VXA9bmV3IGcoMCwxLDApO3kuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGU9CiEwO3kucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnksaXNPYmplY3QzRDohMCxvbkJlZm9yZVJlbmRlcjpmdW5jdGlvbigpe30sb25BZnRlclJlbmRlcjpmdW5jdGlvbigpe30sYXBwbHlNYXRyaXg6ZnVuY3Rpb24oYil7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpO3RoaXMubWF0cml4LnByZW11bHRpcGx5KGIpO3RoaXMubWF0cml4LmRlY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKX0sYXBwbHlRdWF0ZXJuaW9uOmZ1bmN0aW9uKGIpe3RoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShiKTtyZXR1cm4gdGhpc30sc2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlOmZ1bmN0aW9uKGIsZSl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoYixlKX0sc2V0Um90YXRpb25Gcm9tRXVsZXI6ZnVuY3Rpb24oYil7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21FdWxlcihiLAohMCl9LHNldFJvdGF0aW9uRnJvbU1hdHJpeDpmdW5jdGlvbihiKXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KGIpfSxzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGIpe3RoaXMucXVhdGVybmlvbi5jb3B5KGIpfSxyb3RhdGVPbkF4aXM6ZnVuY3Rpb24oYixlKXtxZy5zZXRGcm9tQXhpc0FuZ2xlKGIsZSk7dGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KHFnKTtyZXR1cm4gdGhpc30scm90YXRlT25Xb3JsZEF4aXM6ZnVuY3Rpb24oYixlKXtxZy5zZXRGcm9tQXhpc0FuZ2xlKGIsZSk7dGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KHFnKTtyZXR1cm4gdGhpc30scm90YXRlWDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMob28sYil9LHJvdGF0ZVk6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKHBvLGIpfSxyb3RhdGVaOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhxbyxiKX0sdHJhbnNsYXRlT25BeGlzOmZ1bmN0aW9uKGIsCmUpe25vLmNvcHkoYikuYXBwbHlRdWF0ZXJuaW9uKHRoaXMucXVhdGVybmlvbik7dGhpcy5wb3NpdGlvbi5hZGQobm8ubXVsdGlwbHlTY2FsYXIoZSkpO3JldHVybiB0aGlzfSx0cmFuc2xhdGVYOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhvbyxiKX0sdHJhbnNsYXRlWTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMocG8sYil9LHRyYW5zbGF0ZVo6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKHFvLGIpfSxsb2NhbFRvV29ybGQ6ZnVuY3Rpb24oYil7cmV0dXJuIGIuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpfSx3b3JsZFRvTG9jYWw6ZnVuY3Rpb24oYil7cmV0dXJuIGIuYXBwbHlNYXRyaXg0KFRkLmdldEludmVyc2UodGhpcy5tYXRyaXhXb3JsZCkpfSxsb29rQXQ6ZnVuY3Rpb24oYixlLGgpe2IuaXNWZWN0b3IzP2VqLmNvcHkoYik6ZWouc2V0KGIsZSxoKTtiPXRoaXMucGFyZW50O3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsCiExKTtQaC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7dGhpcy5pc0NhbWVyYXx8dGhpcy5pc0xpZ2h0P1RkLmxvb2tBdChQaCxlaix0aGlzLnVwKTpUZC5sb29rQXQoZWosUGgsdGhpcy51cCk7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeChUZCk7YiYmKFRkLmV4dHJhY3RSb3RhdGlvbihiLm1hdHJpeFdvcmxkKSxxZy5zZXRGcm9tUm90YXRpb25NYXRyaXgoVGQpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShxZy5pbnZlcnNlKCkpKX0sYWRkOmZ1bmN0aW9uKGIpe2lmKDE8YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0aGlzLmFkZChhcmd1bWVudHNbZV0pO3JldHVybiB0aGlzfWlmKGI9PT10aGlzKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBjYW4ndCBiZSBhZGRlZCBhcyBhIGNoaWxkIG9mIGl0c2VsZi4iLGIpLHRoaXM7YiYmYi5pc09iamVjdDNEPwoobnVsbCE9PWIucGFyZW50JiZiLnBhcmVudC5yZW1vdmUoYiksYi5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkcmVuLnB1c2goYiksYi5kaXNwYXRjaEV2ZW50KHhzKSk6Y29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3Qgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLk9iamVjdDNELiIsYik7cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbihiKXtpZigxPGFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdGhpcy5yZW1vdmUoYXJndW1lbnRzW2VdKTtyZXR1cm4gdGhpc31lPXRoaXMuY2hpbGRyZW4uaW5kZXhPZihiKTstMSE9PWUmJihiLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW4uc3BsaWNlKGUsMSksYi5kaXNwYXRjaEV2ZW50KHlzKSk7cmV0dXJuIHRoaXN9LGF0dGFjaDpmdW5jdGlvbihiKXt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTtUZC5nZXRJbnZlcnNlKHRoaXMubWF0cml4V29ybGQpO251bGwhPT0KYi5wYXJlbnQmJihiLnBhcmVudC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksVGQubXVsdGlwbHkoYi5wYXJlbnQubWF0cml4V29ybGQpKTtiLmFwcGx5TWF0cml4KFRkKTtiLnVwZGF0ZVdvcmxkTWF0cml4KCExLCExKTt0aGlzLmFkZChiKTtyZXR1cm4gdGhpc30sZ2V0T2JqZWN0QnlJZDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJpZCIsYil9LGdldE9iamVjdEJ5TmFtZTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJuYW1lIixiKX0sZ2V0T2JqZWN0QnlQcm9wZXJ0eTpmdW5jdGlvbihiLGUpe2lmKHRoaXNbYl09PT1lKXJldHVybiB0aGlzO2Zvcih2YXIgaD0wLG09dGhpcy5jaGlsZHJlbi5sZW5ndGg7aDxtO2grKyl7dmFyIHU9dGhpcy5jaGlsZHJlbltoXS5nZXRPYmplY3RCeVByb3BlcnR5KGIsZSk7aWYodm9pZCAwIT09dSlyZXR1cm4gdX19LGdldFdvcmxkUG9zaXRpb246ZnVuY3Rpb24oYil7dm9pZCAwPT09CmImJihjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRQb3NpdGlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxiPW5ldyBnKTt0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTtyZXR1cm4gYi5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCl9LGdldFdvcmxkUXVhdGVybmlvbjpmdW5jdGlvbihiKXt2b2lkIDA9PT1iJiYoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUXVhdGVybmlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxiPW5ldyBmKTt0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTt0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShQaCxiLHZzKTtyZXR1cm4gYn0sZ2V0V29ybGRTY2FsZTpmdW5jdGlvbihiKXt2b2lkIDA9PT1iJiYoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkU2NhbGUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYj1uZXcgZyk7dGhpcy51cGRhdGVNYXRyaXhXb3JsZCghMCk7CnRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKFBoLHdzLGIpO3JldHVybiBifSxnZXRXb3JsZERpcmVjdGlvbjpmdW5jdGlvbihiKXt2b2lkIDA9PT1iJiYoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkRGlyZWN0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGI9bmV3IGcpO3RoaXMudXBkYXRlTWF0cml4V29ybGQoITApO3ZhciBlPXRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7cmV0dXJuIGIuc2V0KGVbOF0sZVs5XSxlWzEwXSkubm9ybWFsaXplKCl9LHJheWNhc3Q6ZnVuY3Rpb24oKXt9LHRyYXZlcnNlOmZ1bmN0aW9uKGIpe2IodGhpcyk7Zm9yKHZhciBlPXRoaXMuY2hpbGRyZW4saD0wLG09ZS5sZW5ndGg7aDxtO2grKyllW2hdLnRyYXZlcnNlKGIpfSx0cmF2ZXJzZVZpc2libGU6ZnVuY3Rpb24oYil7aWYoITEhPT10aGlzLnZpc2libGUpe2IodGhpcyk7Zm9yKHZhciBlPXRoaXMuY2hpbGRyZW4saD0wLG09ZS5sZW5ndGg7aDxtO2grKyllW2hdLnRyYXZlcnNlVmlzaWJsZShiKX19LAp0cmF2ZXJzZUFuY2VzdG9yczpmdW5jdGlvbihiKXt2YXIgZT10aGlzLnBhcmVudDtudWxsIT09ZSYmKGIoZSksZS50cmF2ZXJzZUFuY2VzdG9ycyhiKSl9LHVwZGF0ZU1hdHJpeDpmdW5jdGlvbigpe3RoaXMubWF0cml4LmNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSk7dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihiKXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCk7aWYodGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlfHxiKW51bGw9PT10aGlzLnBhcmVudD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCksdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLGI9ITA7Zm9yKHZhciBlPXRoaXMuY2hpbGRyZW4saD0KMCxtPWUubGVuZ3RoO2g8bTtoKyspZVtoXS51cGRhdGVNYXRyaXhXb3JsZChiKX0sdXBkYXRlV29ybGRNYXRyaXg6ZnVuY3Rpb24oYixlKXt2YXIgaD10aGlzLnBhcmVudDshMD09PWImJm51bGwhPT1oJiZoLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCk7bnVsbD09PXRoaXMucGFyZW50P3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KTtpZighMD09PWUpZm9yKGI9dGhpcy5jaGlsZHJlbixlPTAsaD1iLmxlbmd0aDtlPGg7ZSsrKWJbZV0udXBkYXRlV29ybGRNYXRyaXgoITEsITApfSx0b0pTT046ZnVuY3Rpb24oYil7ZnVuY3Rpb24gZShRLFMpe3ZvaWQgMD09PVFbUy51dWlkXSYmKFFbUy51dWlkXT1TLnRvSlNPTihiKSk7cmV0dXJuIFMudXVpZH1mdW5jdGlvbiBoKFEpe3ZhciBTPQpbXSxUO2ZvcihUIGluIFEpe3ZhciBXPVFbVF07ZGVsZXRlIFcubWV0YWRhdGE7Uy5wdXNoKFcpfXJldHVybiBTfXZhciBtPXZvaWQgMD09PWJ8fCJzdHJpbmciPT09dHlwZW9mIGIsdT17fTttJiYoYj17Z2VvbWV0cmllczp7fSxtYXRlcmlhbHM6e30sdGV4dHVyZXM6e30saW1hZ2VzOnt9LHNoYXBlczp7fX0sdS5tZXRhZGF0YT17dmVyc2lvbjo0LjUsdHlwZToiT2JqZWN0IixnZW5lcmF0b3I6Ik9iamVjdDNELnRvSlNPTiJ9KTt2YXIgdz17fTt3LnV1aWQ9dGhpcy51dWlkO3cudHlwZT10aGlzLnR5cGU7IiIhPT10aGlzLm5hbWUmJih3Lm5hbWU9dGhpcy5uYW1lKTshMD09PXRoaXMuY2FzdFNoYWRvdyYmKHcuY2FzdFNoYWRvdz0hMCk7ITA9PT10aGlzLnJlY2VpdmVTaGFkb3cmJih3LnJlY2VpdmVTaGFkb3c9ITApOyExPT09dGhpcy52aXNpYmxlJiYody52aXNpYmxlPSExKTshMT09PXRoaXMuZnJ1c3R1bUN1bGxlZCYmKHcuZnJ1c3R1bUN1bGxlZD0hMSk7MCE9PXRoaXMucmVuZGVyT3JkZXImJgoody5yZW5kZXJPcmRlcj10aGlzLnJlbmRlck9yZGVyKTsie30iIT09SlNPTi5zdHJpbmdpZnkodGhpcy51c2VyRGF0YSkmJih3LnVzZXJEYXRhPXRoaXMudXNlckRhdGEpO3cubGF5ZXJzPXRoaXMubGF5ZXJzLm1hc2s7dy5tYXRyaXg9dGhpcy5tYXRyaXgudG9BcnJheSgpOyExPT09dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiYody5tYXRyaXhBdXRvVXBkYXRlPSExKTt0aGlzLmlzTWVzaCYmMCE9PXRoaXMuZHJhd01vZGUmJih3LmRyYXdNb2RlPXRoaXMuZHJhd01vZGUpO2lmKHRoaXMuaXNNZXNofHx0aGlzLmlzTGluZXx8dGhpcy5pc1BvaW50cyl7dy5nZW9tZXRyeT1lKGIuZ2VvbWV0cmllcyx0aGlzLmdlb21ldHJ5KTt2YXIgQT10aGlzLmdlb21ldHJ5LnBhcmFtZXRlcnM7aWYodm9pZCAwIT09QSYmdm9pZCAwIT09QS5zaGFwZXMpaWYoQT1BLnNoYXBlcyxBcnJheS5pc0FycmF5KEEpKWZvcih2YXIgRT0wLEc9QS5sZW5ndGg7RTxHO0UrKyllKGIuc2hhcGVzLEFbRV0pO2Vsc2UgZShiLnNoYXBlcywKQSl9aWYodm9pZCAwIT09dGhpcy5tYXRlcmlhbClpZihBcnJheS5pc0FycmF5KHRoaXMubWF0ZXJpYWwpKXtBPVtdO0U9MDtmb3IoRz10aGlzLm1hdGVyaWFsLmxlbmd0aDtFPEc7RSsrKUEucHVzaChlKGIubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWxbRV0pKTt3Lm1hdGVyaWFsPUF9ZWxzZSB3Lm1hdGVyaWFsPWUoYi5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbCk7aWYoMDx0aGlzLmNoaWxkcmVuLmxlbmd0aClmb3Iody5jaGlsZHJlbj1bXSxFPTA7RTx0aGlzLmNoaWxkcmVuLmxlbmd0aDtFKyspdy5jaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5bRV0udG9KU09OKGIpLm9iamVjdCk7aWYobSl7bT1oKGIuZ2VvbWV0cmllcyk7RT1oKGIubWF0ZXJpYWxzKTtHPWgoYi50ZXh0dXJlcyk7dmFyIEo9aChiLmltYWdlcyk7QT1oKGIuc2hhcGVzKTswPG0ubGVuZ3RoJiYodS5nZW9tZXRyaWVzPW0pOzA8RS5sZW5ndGgmJih1Lm1hdGVyaWFscz1FKTswPEcubGVuZ3RoJiYodS50ZXh0dXJlcz1HKTsKMDxKLmxlbmd0aCYmKHUuaW1hZ2VzPUopOzA8QS5sZW5ndGgmJih1LnNoYXBlcz1BKX11Lm9iamVjdD13O3JldHVybiB1fSxjbG9uZTpmdW5jdGlvbihiKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyxiKX0sY29weTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihlPSEwKTt0aGlzLm5hbWU9Yi5uYW1lO3RoaXMudXAuY29weShiLnVwKTt0aGlzLnBvc2l0aW9uLmNvcHkoYi5wb3NpdGlvbik7dGhpcy5xdWF0ZXJuaW9uLmNvcHkoYi5xdWF0ZXJuaW9uKTt0aGlzLnNjYWxlLmNvcHkoYi5zY2FsZSk7dGhpcy5tYXRyaXguY29weShiLm1hdHJpeCk7dGhpcy5tYXRyaXhXb3JsZC5jb3B5KGIubWF0cml4V29ybGQpO3RoaXMubWF0cml4QXV0b1VwZGF0ZT1iLm1hdHJpeEF1dG9VcGRhdGU7dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPWIubWF0cml4V29ybGROZWVkc1VwZGF0ZTt0aGlzLmxheWVycy5tYXNrPWIubGF5ZXJzLm1hc2s7dGhpcy52aXNpYmxlPWIudmlzaWJsZTsKdGhpcy5jYXN0U2hhZG93PWIuY2FzdFNoYWRvdzt0aGlzLnJlY2VpdmVTaGFkb3c9Yi5yZWNlaXZlU2hhZG93O3RoaXMuZnJ1c3R1bUN1bGxlZD1iLmZydXN0dW1DdWxsZWQ7dGhpcy5yZW5kZXJPcmRlcj1iLnJlbmRlck9yZGVyO3RoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShiLnVzZXJEYXRhKSk7aWYoITA9PT1lKWZvcihlPTA7ZTxiLmNoaWxkcmVuLmxlbmd0aDtlKyspdGhpcy5hZGQoYi5jaGlsZHJlbltlXS5jbG9uZSgpKTtyZXR1cm4gdGhpc319KTt6LnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoeS5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp6LGlzU2NlbmU6ITAsY29weTpmdW5jdGlvbihiLGUpe3kucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIsZSk7bnVsbCE9PWIuYmFja2dyb3VuZCYmKHRoaXMuYmFja2dyb3VuZD1iLmJhY2tncm91bmQuY2xvbmUoKSk7bnVsbCE9PWIuZm9nJiYodGhpcy5mb2c9Yi5mb2cuY2xvbmUoKSk7Cm51bGwhPT1iLm92ZXJyaWRlTWF0ZXJpYWwmJih0aGlzLm92ZXJyaWRlTWF0ZXJpYWw9Yi5vdmVycmlkZU1hdGVyaWFsLmNsb25lKCkpO3RoaXMuYXV0b1VwZGF0ZT1iLmF1dG9VcGRhdGU7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPWIubWF0cml4QXV0b1VwZGF0ZTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKGIpe3ZhciBlPXkucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsYik7bnVsbCE9PXRoaXMuYmFja2dyb3VuZCYmKGUub2JqZWN0LmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTihiKSk7bnVsbCE9PXRoaXMuZm9nJiYoZS5vYmplY3QuZm9nPXRoaXMuZm9nLnRvSlNPTigpKTtyZXR1cm4gZX0sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19KTt2YXIgVWQ9W25ldyBnLG5ldyBnLG5ldyBnLG5ldyBnLG5ldyBnLG5ldyBnLG5ldyBnLG5ldyBnXSxFZD1uZXcgZyxyZz1uZXcgZyxzZz1uZXcgZyx0Zz1uZXcgZywKd2U9bmV3IGcseGU9bmV3IGcsZGY9bmV3IGcsUWg9bmV3IGcsZmo9bmV3IGcsZ2o9bmV3IGcsSWU9bmV3IGc7T2JqZWN0LmFzc2lnbih4LnByb3RvdHlwZSx7aXNCb3gzOiEwLHNldDpmdW5jdGlvbihiLGUpe3RoaXMubWluLmNvcHkoYik7dGhpcy5tYXguY29weShlKTtyZXR1cm4gdGhpc30sc2V0RnJvbUFycmF5OmZ1bmN0aW9uKGIpe2Zvcih2YXIgZT1JbmZpbml0eSxoPUluZmluaXR5LG09SW5maW5pdHksdT0tSW5maW5pdHksdz0tSW5maW5pdHksQT0tSW5maW5pdHksRT0wLEc9Yi5sZW5ndGg7RTxHO0UrPTMpe3ZhciBKPWJbRV0sUT1iW0UrMV0sUz1iW0UrMl07SjxlJiYoZT1KKTtRPGgmJihoPVEpO1M8bSYmKG09Uyk7Sj51JiYodT1KKTtRPncmJih3PVEpO1M+QSYmKEE9Uyl9dGhpcy5taW4uc2V0KGUsaCxtKTt0aGlzLm1heC5zZXQodSx3LEEpO3JldHVybiB0aGlzfSxzZXRGcm9tQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZT1JbmZpbml0eSxoPUluZmluaXR5LAptPUluZmluaXR5LHU9LUluZmluaXR5LHc9LUluZmluaXR5LEE9LUluZmluaXR5LEU9MCxHPWIuY291bnQ7RTxHO0UrKyl7dmFyIEo9Yi5nZXRYKEUpLFE9Yi5nZXRZKEUpLFM9Yi5nZXRaKEUpO0o8ZSYmKGU9Sik7UTxoJiYoaD1RKTtTPG0mJihtPVMpO0o+dSYmKHU9Sik7UT53JiYodz1RKTtTPkEmJihBPVMpfXRoaXMubWluLnNldChlLGgsbSk7dGhpcy5tYXguc2V0KHUsdyxBKTtyZXR1cm4gdGhpc30sc2V0RnJvbVBvaW50czpmdW5jdGlvbihiKXt0aGlzLm1ha2VFbXB0eSgpO2Zvcih2YXIgZT0wLGg9Yi5sZW5ndGg7ZTxoO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQoYltlXSk7cmV0dXJuIHRoaXN9LHNldEZyb21DZW50ZXJBbmRTaXplOmZ1bmN0aW9uKGIsZSl7ZT1FZC5jb3B5KGUpLm11bHRpcGx5U2NhbGFyKC41KTt0aGlzLm1pbi5jb3B5KGIpLnN1YihlKTt0aGlzLm1heC5jb3B5KGIpLmFkZChlKTtyZXR1cm4gdGhpc30sc2V0RnJvbU9iamVjdDpmdW5jdGlvbihiKXt0aGlzLm1ha2VFbXB0eSgpOwpyZXR1cm4gdGhpcy5leHBhbmRCeU9iamVjdChiKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy5taW4uY29weShiLm1pbik7dGhpcy5tYXguY29weShiLm1heCk7cmV0dXJuIHRoaXN9LG1ha2VFbXB0eTpmdW5jdGlvbigpe3RoaXMubWluLng9dGhpcy5taW4ueT10aGlzLm1pbi56PUluZmluaXR5O3RoaXMubWF4Lng9dGhpcy5tYXgueT10aGlzLm1heC56PS1JbmZpbml0eTtyZXR1cm4gdGhpc30saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueXx8dGhpcy5tYXguejx0aGlzLm1pbi56fSxnZXRDZW50ZXI6ZnVuY3Rpb24oYil7dm9pZCAwPT09YiYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxiPW5ldyBnKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/CmIuc2V0KDAsMCwwKTpiLmFkZFZlY3RvcnModGhpcy5taW4sdGhpcy5tYXgpLm11bHRpcGx5U2NhbGFyKC41KX0sZ2V0U2l6ZTpmdW5jdGlvbihiKXt2b2lkIDA9PT1iJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuZ2V0U2l6ZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxiPW5ldyBnKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/Yi5zZXQoMCwwLDApOmIuc3ViVmVjdG9ycyh0aGlzLm1heCx0aGlzLm1pbil9LGV4cGFuZEJ5UG9pbnQ6ZnVuY3Rpb24oYil7dGhpcy5taW4ubWluKGIpO3RoaXMubWF4Lm1heChiKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlWZWN0b3I6ZnVuY3Rpb24oYil7dGhpcy5taW4uc3ViKGIpO3RoaXMubWF4LmFkZChiKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlTY2FsYXI6ZnVuY3Rpb24oYil7dGhpcy5taW4uYWRkU2NhbGFyKC1iKTt0aGlzLm1heC5hZGRTY2FsYXIoYik7cmV0dXJuIHRoaXN9LGV4cGFuZEJ5T2JqZWN0OmZ1bmN0aW9uKGIpe3ZhciBlO2IudXBkYXRlV29ybGRNYXRyaXgoITEsCiExKTt2YXIgaD1iLmdlb21ldHJ5O2lmKHZvaWQgMCE9PWgpaWYoaC5pc0dlb21ldHJ5KXt2YXIgbT1oLnZlcnRpY2VzO2g9MDtmb3IoZT1tLmxlbmd0aDtoPGU7aCsrKUVkLmNvcHkobVtoXSksRWQuYXBwbHlNYXRyaXg0KGIubWF0cml4V29ybGQpLHRoaXMuZXhwYW5kQnlQb2ludChFZCl9ZWxzZSBpZihoLmlzQnVmZmVyR2VvbWV0cnkmJihtPWguYXR0cmlidXRlcy5wb3NpdGlvbix2b2lkIDAhPT1tKSlmb3IoaD0wLGU9bS5jb3VudDtoPGU7aCsrKUVkLmZyb21CdWZmZXJBdHRyaWJ1dGUobSxoKS5hcHBseU1hdHJpeDQoYi5tYXRyaXhXb3JsZCksdGhpcy5leHBhbmRCeVBvaW50KEVkKTtiPWIuY2hpbGRyZW47aD0wO2ZvcihlPWIubGVuZ3RoO2g8ZTtoKyspdGhpcy5leHBhbmRCeU9iamVjdChiW2hdKTtyZXR1cm4gdGhpc30sY29udGFpbnNQb2ludDpmdW5jdGlvbihiKXtyZXR1cm4gYi54PHRoaXMubWluLnh8fGIueD50aGlzLm1heC54fHxiLnk8dGhpcy5taW4ueXx8Yi55PnRoaXMubWF4Lnl8fApiLno8dGhpcy5taW4uenx8Yi56PnRoaXMubWF4Lno/ITE6ITB9LGNvbnRhaW5zQm94OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLm1pbi54PD1iLm1pbi54JiZiLm1heC54PD10aGlzLm1heC54JiZ0aGlzLm1pbi55PD1iLm1pbi55JiZiLm1heC55PD10aGlzLm1heC55JiZ0aGlzLm1pbi56PD1iLm1pbi56JiZiLm1heC56PD10aGlzLm1heC56fSxnZXRQYXJhbWV0ZXI6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1lJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuZ2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGU9bmV3IGcpO3JldHVybiBlLnNldCgoYi54LXRoaXMubWluLngpLyh0aGlzLm1heC54LXRoaXMubWluLngpLChiLnktdGhpcy5taW4ueSkvKHRoaXMubWF4LnktdGhpcy5taW4ueSksKGIuei10aGlzLm1pbi56KS8odGhpcy5tYXguei10aGlzLm1pbi56KSl9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYil7cmV0dXJuIGIubWF4Lng8dGhpcy5taW4ueHx8CmIubWluLng+dGhpcy5tYXgueHx8Yi5tYXgueTx0aGlzLm1pbi55fHxiLm1pbi55PnRoaXMubWF4Lnl8fGIubWF4Lno8dGhpcy5taW4uenx8Yi5taW4uej50aGlzLm1heC56PyExOiEwfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGIpe3RoaXMuY2xhbXBQb2ludChiLmNlbnRlcixFZCk7cmV0dXJuIEVkLmRpc3RhbmNlVG9TcXVhcmVkKGIuY2VudGVyKTw9Yi5yYWRpdXMqYi5yYWRpdXN9LGludGVyc2VjdHNQbGFuZTpmdW5jdGlvbihiKXtpZigwPGIubm9ybWFsLngpe3ZhciBlPWIubm9ybWFsLngqdGhpcy5taW4ueDt2YXIgaD1iLm5vcm1hbC54KnRoaXMubWF4Lnh9ZWxzZSBlPWIubm9ybWFsLngqdGhpcy5tYXgueCxoPWIubm9ybWFsLngqdGhpcy5taW4ueDswPGIubm9ybWFsLnk/KGUrPWIubm9ybWFsLnkqdGhpcy5taW4ueSxoKz1iLm5vcm1hbC55KnRoaXMubWF4LnkpOihlKz1iLm5vcm1hbC55KnRoaXMubWF4LnksaCs9Yi5ub3JtYWwueSp0aGlzLm1pbi55KTswPGIubm9ybWFsLno/CihlKz1iLm5vcm1hbC56KnRoaXMubWluLnosaCs9Yi5ub3JtYWwueip0aGlzLm1heC56KTooZSs9Yi5ub3JtYWwueip0aGlzLm1heC56LGgrPWIubm9ybWFsLnoqdGhpcy5taW4ueik7cmV0dXJuIGU8PS1iLmNvbnN0YW50JiZoPj0tYi5jb25zdGFudH0saW50ZXJzZWN0c1RyaWFuZ2xlOmZ1bmN0aW9uKGIpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiExO3RoaXMuZ2V0Q2VudGVyKFFoKTtmai5zdWJWZWN0b3JzKHRoaXMubWF4LFFoKTtyZy5zdWJWZWN0b3JzKGIuYSxRaCk7c2cuc3ViVmVjdG9ycyhiLmIsUWgpO3RnLnN1YlZlY3RvcnMoYi5jLFFoKTt3ZS5zdWJWZWN0b3JzKHNnLHJnKTt4ZS5zdWJWZWN0b3JzKHRnLHNnKTtkZi5zdWJWZWN0b3JzKHJnLHRnKTtiPVswLC13ZS56LHdlLnksMCwteGUueix4ZS55LDAsLWRmLnosZGYueSx3ZS56LDAsLXdlLngseGUueiwwLC14ZS54LGRmLnosMCwtZGYueCwtd2UueSx3ZS54LDAsLXhlLnkseGUueCwwLC1kZi55LGRmLngsMF07aWYoIUMoYiwKcmcsc2csdGcsZmopKXJldHVybiExO2I9WzEsMCwwLDAsMSwwLDAsMCwxXTtpZighQyhiLHJnLHNnLHRnLGZqKSlyZXR1cm4hMTtnai5jcm9zc1ZlY3RvcnMod2UseGUpO2I9W2dqLngsZ2oueSxnai56XTtyZXR1cm4gQyhiLHJnLHNnLHRnLGZqKX0sY2xhbXBQb2ludDpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5jbGFtcFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGU9bmV3IGcpO3JldHVybiBlLmNvcHkoYikuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfSxkaXN0YW5jZVRvUG9pbnQ6ZnVuY3Rpb24oYil7cmV0dXJuIEVkLmNvcHkoYikuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpLnN1YihiKS5sZW5ndGgoKX0sZ2V0Qm91bmRpbmdTcGhlcmU6ZnVuY3Rpb24oYil7dm9pZCAwPT09YiYmY29uc29sZS5lcnJvcigiVEhSRUUuQm94MzogLmdldEJvdW5kaW5nU3BoZXJlKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpO3RoaXMuZ2V0Q2VudGVyKGIuY2VudGVyKTsKYi5yYWRpdXM9LjUqdGhpcy5nZXRTaXplKEVkKS5sZW5ndGgoKTtyZXR1cm4gYn0saW50ZXJzZWN0OmZ1bmN0aW9uKGIpe3RoaXMubWluLm1heChiLm1pbik7dGhpcy5tYXgubWluKGIubWF4KTt0aGlzLmlzRW1wdHkoKSYmdGhpcy5tYWtlRW1wdHkoKTtyZXR1cm4gdGhpc30sdW5pb246ZnVuY3Rpb24oYil7dGhpcy5taW4ubWluKGIubWluKTt0aGlzLm1heC5tYXgoYi5tYXgpO3JldHVybiB0aGlzfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oYil7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIHRoaXM7VWRbMF0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQoYik7VWRbMV0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQoYik7VWRbMl0uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQoYik7VWRbM10uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQoYik7ClVkWzRdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KGIpO1VkWzVdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KGIpO1VkWzZdLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KGIpO1VkWzddLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KGIpO3RoaXMuc2V0RnJvbVBvaW50cyhVZCk7cmV0dXJuIHRoaXN9LHRyYW5zbGF0ZTpmdW5jdGlvbihiKXt0aGlzLm1pbi5hZGQoYik7dGhpcy5tYXguYWRkKGIpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYil7cmV0dXJuIGIubWluLmVxdWFscyh0aGlzLm1pbikmJmIubWF4LmVxdWFscyh0aGlzLm1heCl9fSk7dmFyIHpzPW5ldyB4O09iamVjdC5hc3NpZ24oRi5wcm90b3R5cGUse3NldDpmdW5jdGlvbihiLGUpe3RoaXMuY2VudGVyLmNvcHkoYik7dGhpcy5yYWRpdXM9CmU7cmV0dXJuIHRoaXN9LHNldEZyb21Qb2ludHM6ZnVuY3Rpb24oYixlKXt2YXIgaD10aGlzLmNlbnRlcjt2b2lkIDAhPT1lP2guY29weShlKTp6cy5zZXRGcm9tUG9pbnRzKGIpLmdldENlbnRlcihoKTtmb3IodmFyIG09ZT0wLHU9Yi5sZW5ndGg7bTx1O20rKyllPU1hdGgubWF4KGUsaC5kaXN0YW5jZVRvU3F1YXJlZChiW21dKSk7dGhpcy5yYWRpdXM9TWF0aC5zcXJ0KGUpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihiKXt0aGlzLmNlbnRlci5jb3B5KGIuY2VudGVyKTt0aGlzLnJhZGl1cz1iLnJhZGl1cztyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gMD49dGhpcy5yYWRpdXN9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD10aGlzLnJhZGl1cyp0aGlzLnJhZGl1c30sZGlzdGFuY2VUb1BvaW50OmZ1bmN0aW9uKGIpe3JldHVybiBiLmRpc3RhbmNlVG8odGhpcy5jZW50ZXIpLQp0aGlzLnJhZGl1c30saW50ZXJzZWN0c1NwaGVyZTpmdW5jdGlvbihiKXt2YXIgZT10aGlzLnJhZGl1cytiLnJhZGl1cztyZXR1cm4gYi5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD1lKmV9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaW50ZXJzZWN0c1NwaGVyZSh0aGlzKX0saW50ZXJzZWN0c1BsYW5lOmZ1bmN0aW9uKGIpe3JldHVybiBNYXRoLmFicyhiLmRpc3RhbmNlVG9Qb2ludCh0aGlzLmNlbnRlcikpPD10aGlzLnJhZGl1c30sY2xhbXBQb2ludDpmdW5jdGlvbihiLGUpe3ZhciBoPXRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKGIpO3ZvaWQgMD09PWUmJihjb25zb2xlLndhcm4oIlRIUkVFLlNwaGVyZTogLmNsYW1wUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksZT1uZXcgZyk7ZS5jb3B5KGIpO2g+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMmJihlLnN1Yih0aGlzLmNlbnRlcikubm9ybWFsaXplKCksZS5tdWx0aXBseVNjYWxhcih0aGlzLnJhZGl1cykuYWRkKHRoaXMuY2VudGVyKSk7CnJldHVybiBlfSxnZXRCb3VuZGluZ0JveDpmdW5jdGlvbihiKXt2b2lkIDA9PT1iJiYoY29uc29sZS53YXJuKCJUSFJFRS5TcGhlcmU6IC5nZXRCb3VuZGluZ0JveCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxiPW5ldyB4KTtiLnNldCh0aGlzLmNlbnRlcix0aGlzLmNlbnRlcik7Yi5leHBhbmRCeVNjYWxhcih0aGlzLnJhZGl1cyk7cmV0dXJuIGJ9LGFwcGx5TWF0cml4NDpmdW5jdGlvbihiKXt0aGlzLmNlbnRlci5hcHBseU1hdHJpeDQoYik7dGhpcy5yYWRpdXMqPWIuZ2V0TWF4U2NhbGVPbkF4aXMoKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGIpe3RoaXMuY2VudGVyLmFkZChiKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGIpe3JldHVybiBiLmNlbnRlci5lcXVhbHModGhpcy5jZW50ZXIpJiZiLnJhZGl1cz09PXRoaXMucmFkaXVzfX0pO3ZhciBWZD1uZXcgZyxibD1uZXcgZyxoaj1uZXcgZyx5ZT1uZXcgZyxjbD1uZXcgZyxpaj1uZXcgZyxkbD1uZXcgZzsKT2JqZWN0LmFzc2lnbihELnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGIsZSl7dGhpcy5vcmlnaW4uY29weShiKTt0aGlzLmRpcmVjdGlvbi5jb3B5KGUpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihiKXt0aGlzLm9yaWdpbi5jb3B5KGIub3JpZ2luKTt0aGlzLmRpcmVjdGlvbi5jb3B5KGIuZGlyZWN0aW9uKTtyZXR1cm4gdGhpc30sYXQ6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1lJiYoY29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5hdCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxlPW5ldyBnKTtyZXR1cm4gZS5jb3B5KHRoaXMuZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcihiKS5hZGQodGhpcy5vcmlnaW4pfSxsb29rQXQ6ZnVuY3Rpb24oYil7dGhpcy5kaXJlY3Rpb24uY29weShiKS5zdWIodGhpcy5vcmlnaW4pLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzfSxyZWNhc3Q6ZnVuY3Rpb24oYil7dGhpcy5vcmlnaW4uY29weSh0aGlzLmF0KGIsClZkKSk7cmV0dXJuIHRoaXN9LGNsb3Nlc3RQb2ludFRvUG9pbnQ6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1lJiYoY29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGU9bmV3IGcpO2Uuc3ViVmVjdG9ycyhiLHRoaXMub3JpZ2luKTtiPWUuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gMD5iP2UuY29weSh0aGlzLm9yaWdpbik6ZS5jb3B5KHRoaXMuZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcihiKS5hZGQodGhpcy5vcmlnaW4pfSxkaXN0YW5jZVRvUG9pbnQ6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlU3FUb1BvaW50KGIpKX0sZGlzdGFuY2VTcVRvUG9pbnQ6ZnVuY3Rpb24oYil7dmFyIGU9VmQuc3ViVmVjdG9ycyhiLHRoaXMub3JpZ2luKS5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKDA+ZSlyZXR1cm4gdGhpcy5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQoYik7VmQuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoZSkuYWRkKHRoaXMub3JpZ2luKTsKcmV0dXJuIFZkLmRpc3RhbmNlVG9TcXVhcmVkKGIpfSxkaXN0YW5jZVNxVG9TZWdtZW50OmZ1bmN0aW9uKGIsZSxoLG0pe2JsLmNvcHkoYikuYWRkKGUpLm11bHRpcGx5U2NhbGFyKC41KTtoai5jb3B5KGUpLnN1YihiKS5ub3JtYWxpemUoKTt5ZS5jb3B5KHRoaXMub3JpZ2luKS5zdWIoYmwpO3ZhciB1PS41KmIuZGlzdGFuY2VUbyhlKSx3PS10aGlzLmRpcmVjdGlvbi5kb3QoaGopLEE9eWUuZG90KHRoaXMuZGlyZWN0aW9uKSxFPS15ZS5kb3QoaGopLEc9eWUubGVuZ3RoU3EoKSxKPU1hdGguYWJzKDEtdyp3KTtpZigwPEope2I9dypFLUE7ZT13KkEtRTt2YXIgUT11Kko7MDw9Yj9lPj0tUT9lPD1RPyh1PTEvSixiKj11LGUqPXUsdz1iKihiK3cqZSsyKkEpK2UqKHcqYitlKzIqRSkrRyk6KGU9dSxiPU1hdGgubWF4KDAsLSh3KmUrQSkpLHc9LWIqYitlKihlKzIqRSkrRyk6KGU9LXUsYj1NYXRoLm1heCgwLC0odyplK0EpKSx3PS1iKmIrZSooZSsyKkUpK0cpOmU8PS1RPyhiPU1hdGgubWF4KDAsCi0oLXcqdStBKSksZT0wPGI/LXU6TWF0aC5taW4oTWF0aC5tYXgoLXUsLUUpLHUpLHc9LWIqYitlKihlKzIqRSkrRyk6ZTw9UT8oYj0wLGU9TWF0aC5taW4oTWF0aC5tYXgoLXUsLUUpLHUpLHc9ZSooZSsyKkUpK0cpOihiPU1hdGgubWF4KDAsLSh3KnUrQSkpLGU9MDxiP3U6TWF0aC5taW4oTWF0aC5tYXgoLXUsLUUpLHUpLHc9LWIqYitlKihlKzIqRSkrRyl9ZWxzZSBlPTA8dz8tdTp1LGI9TWF0aC5tYXgoMCwtKHcqZStBKSksdz0tYipiK2UqKGUrMipFKStHO2gmJmguY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoYikuYWRkKHRoaXMub3JpZ2luKTttJiZtLmNvcHkoaGopLm11bHRpcGx5U2NhbGFyKGUpLmFkZChibCk7cmV0dXJuIHd9LGludGVyc2VjdFNwaGVyZTpmdW5jdGlvbihiLGUpe1ZkLnN1YlZlY3RvcnMoYi5jZW50ZXIsdGhpcy5vcmlnaW4pO3ZhciBoPVZkLmRvdCh0aGlzLmRpcmVjdGlvbiksbT1WZC5kb3QoVmQpLWgqaDtiPWIucmFkaXVzKmIucmFkaXVzOwppZihtPmIpcmV0dXJuIG51bGw7Yj1NYXRoLnNxcnQoYi1tKTttPWgtYjtoKz1iO3JldHVybiAwPm0mJjA+aD9udWxsOjA+bT90aGlzLmF0KGgsZSk6dGhpcy5hdChtLGUpfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KGIuY2VudGVyKTw9Yi5yYWRpdXMqYi5yYWRpdXN9LGRpc3RhbmNlVG9QbGFuZTpmdW5jdGlvbihiKXt2YXIgZT1iLm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKDA9PT1lKXJldHVybiAwPT09Yi5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pPzA6bnVsbDtiPS0odGhpcy5vcmlnaW4uZG90KGIubm9ybWFsKStiLmNvbnN0YW50KS9lO3JldHVybiAwPD1iP2I6bnVsbH0saW50ZXJzZWN0UGxhbmU6ZnVuY3Rpb24oYixlKXtiPXRoaXMuZGlzdGFuY2VUb1BsYW5lKGIpO3JldHVybiBudWxsPT09Yj9udWxsOnRoaXMuYXQoYixlKX0saW50ZXJzZWN0c1BsYW5lOmZ1bmN0aW9uKGIpe3ZhciBlPWIuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKTsKcmV0dXJuIDA9PT1lfHwwPmIubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbikqZT8hMDohMX0saW50ZXJzZWN0Qm94OmZ1bmN0aW9uKGIsZSl7dmFyIGg9MS90aGlzLmRpcmVjdGlvbi54O3ZhciBtPTEvdGhpcy5kaXJlY3Rpb24ueTt2YXIgdT0xL3RoaXMuZGlyZWN0aW9uLnosdz10aGlzLm9yaWdpbjtpZigwPD1oKXt2YXIgQT0oYi5taW4ueC13LngpKmg7aCo9Yi5tYXgueC13Lnh9ZWxzZSBBPShiLm1heC54LXcueCkqaCxoKj1iLm1pbi54LXcueDtpZigwPD1tKXt2YXIgRT0oYi5taW4ueS13LnkpKm07bSo9Yi5tYXgueS13Lnl9ZWxzZSBFPShiLm1heC55LXcueSkqbSxtKj1iLm1pbi55LXcueTtpZihBPm18fEU+aClyZXR1cm4gbnVsbDtpZihFPkF8fEEhPT1BKUE9RTtpZihtPGh8fGghPT1oKWg9bTswPD11PyhFPShiLm1pbi56LXcueikqdSxiPShiLm1heC56LXcueikqdSk6KEU9KGIubWF4Lnotdy56KSp1LGI9KGIubWluLnotdy56KSp1KTtpZihBPmJ8fEU+aClyZXR1cm4gbnVsbDsKaWYoRT5BfHxBIT09QSlBPUU7aWYoYjxofHxoIT09aCloPWI7cmV0dXJuIDA+aD9udWxsOnRoaXMuYXQoMDw9QT9BOmgsZSl9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYil7cmV0dXJuIG51bGwhPT10aGlzLmludGVyc2VjdEJveChiLFZkKX0saW50ZXJzZWN0VHJpYW5nbGU6ZnVuY3Rpb24oYixlLGgsbSx1KXtjbC5zdWJWZWN0b3JzKGUsYik7aWouc3ViVmVjdG9ycyhoLGIpO2RsLmNyb3NzVmVjdG9ycyhjbCxpaik7ZT10aGlzLmRpcmVjdGlvbi5kb3QoZGwpO2lmKDA8ZSl7aWYobSlyZXR1cm4gbnVsbDttPTF9ZWxzZSBpZigwPmUpbT0tMSxlPS1lO2Vsc2UgcmV0dXJuIG51bGw7eWUuc3ViVmVjdG9ycyh0aGlzLm9yaWdpbixiKTtiPW0qdGhpcy5kaXJlY3Rpb24uZG90KGlqLmNyb3NzVmVjdG9ycyh5ZSxpaikpO2lmKDA+YilyZXR1cm4gbnVsbDtoPW0qdGhpcy5kaXJlY3Rpb24uZG90KGNsLmNyb3NzKHllKSk7aWYoMD5ofHxiK2g+ZSlyZXR1cm4gbnVsbDtiPS1tKnllLmRvdChkbCk7CnJldHVybiAwPmI/bnVsbDp0aGlzLmF0KGIvZSx1KX0sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGIpe3RoaXMub3JpZ2luLmFwcGx5TWF0cml4NChiKTt0aGlzLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oYik7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihiKXtyZXR1cm4gYi5vcmlnaW4uZXF1YWxzKHRoaXMub3JpZ2luKSYmYi5kaXJlY3Rpb24uZXF1YWxzKHRoaXMuZGlyZWN0aW9uKX19KTt2YXIga2Q9bmV3IGcsV2Q9bmV3IGcsZWw9bmV3IGcsWGQ9bmV3IGcsdWc9bmV3IGcsdmc9bmV3IGcscm89bmV3IGcsZmw9bmV3IGcsZ2w9bmV3IGcsaGw9bmV3IGc7T2JqZWN0LmFzc2lnbihCLHtnZXROb3JtYWw6ZnVuY3Rpb24oYixlLGgsbSl7dm9pZCAwPT09bSYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5nZXROb3JtYWwoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksbT1uZXcgZyk7bS5zdWJWZWN0b3JzKGgsZSk7a2Quc3ViVmVjdG9ycyhiLGUpO20uY3Jvc3Moa2QpOwpiPW0ubGVuZ3RoU3EoKTtyZXR1cm4gMDxiP20ubXVsdGlwbHlTY2FsYXIoMS9NYXRoLnNxcnQoYikpOm0uc2V0KDAsMCwwKX0sZ2V0QmFyeWNvb3JkOmZ1bmN0aW9uKGIsZSxoLG0sdSl7a2Quc3ViVmVjdG9ycyhtLGUpO1dkLnN1YlZlY3RvcnMoaCxlKTtlbC5zdWJWZWN0b3JzKGIsZSk7Yj1rZC5kb3Qoa2QpO2U9a2QuZG90KFdkKTtoPWtkLmRvdChlbCk7dmFyIHc9V2QuZG90KFdkKTttPVdkLmRvdChlbCk7dmFyIEE9Yip3LWUqZTt2b2lkIDA9PT11JiYoY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmdldEJhcnljb29yZCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSx1PW5ldyBnKTtpZigwPT09QSlyZXR1cm4gdS5zZXQoLTIsLTEsLTEpO0E9MS9BO3c9KHcqaC1lKm0pKkE7Yj0oYiptLWUqaCkqQTtyZXR1cm4gdS5zZXQoMS13LWIsYix3KX0sY29udGFpbnNQb2ludDpmdW5jdGlvbihiLGUsaCxtKXtCLmdldEJhcnljb29yZChiLGUsaCxtLFhkKTtyZXR1cm4gMDw9WGQueCYmCjA8PVhkLnkmJjE+PVhkLngrWGQueX0sZ2V0VVY6ZnVuY3Rpb24oYixlLGgsbSx1LHcsQSxFKXt0aGlzLmdldEJhcnljb29yZChiLGUsaCxtLFhkKTtFLnNldCgwLDApO0UuYWRkU2NhbGVkVmVjdG9yKHUsWGQueCk7RS5hZGRTY2FsZWRWZWN0b3IodyxYZC55KTtFLmFkZFNjYWxlZFZlY3RvcihBLFhkLnopO3JldHVybiBFfSxpc0Zyb250RmFjaW5nOmZ1bmN0aW9uKGIsZSxoLG0pe2tkLnN1YlZlY3RvcnMoaCxlKTtXZC5zdWJWZWN0b3JzKGIsZSk7cmV0dXJuIDA+a2QuY3Jvc3MoV2QpLmRvdChtKT8hMDohMX19KTtPYmplY3QuYXNzaWduKEIucHJvdG90eXBlLHtzZXQ6ZnVuY3Rpb24oYixlLGgpe3RoaXMuYS5jb3B5KGIpO3RoaXMuYi5jb3B5KGUpO3RoaXMuYy5jb3B5KGgpO3JldHVybiB0aGlzfSxzZXRGcm9tUG9pbnRzQW5kSW5kaWNlczpmdW5jdGlvbihiLGUsaCxtKXt0aGlzLmEuY29weShiW2VdKTt0aGlzLmIuY29weShiW2hdKTt0aGlzLmMuY29weShiW21dKTtyZXR1cm4gdGhpc30sCmNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGIpe3RoaXMuYS5jb3B5KGIuYSk7dGhpcy5iLmNvcHkoYi5iKTt0aGlzLmMuY29weShiLmMpO3JldHVybiB0aGlzfSxnZXRBcmVhOmZ1bmN0aW9uKCl7a2Quc3ViVmVjdG9ycyh0aGlzLmMsdGhpcy5iKTtXZC5zdWJWZWN0b3JzKHRoaXMuYSx0aGlzLmIpO3JldHVybi41KmtkLmNyb3NzKFdkKS5sZW5ndGgoKX0sZ2V0TWlkcG9pbnQ6ZnVuY3Rpb24oYil7dm9pZCAwPT09YiYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5nZXRNaWRwb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxiPW5ldyBnKTtyZXR1cm4gYi5hZGRWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLmFkZCh0aGlzLmMpLm11bHRpcGx5U2NhbGFyKDEvMyl9LGdldE5vcm1hbDpmdW5jdGlvbihiKXtyZXR1cm4gQi5nZXROb3JtYWwodGhpcy5hLHRoaXMuYix0aGlzLmMsYil9LGdldFBsYW5lOmZ1bmN0aW9uKGIpe3ZvaWQgMD09PQpiJiYoY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmdldFBsYW5lKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGI9bmV3IGcpO3JldHVybiBiLnNldEZyb21Db3BsYW5hclBvaW50cyh0aGlzLmEsdGhpcy5iLHRoaXMuYyl9LGdldEJhcnljb29yZDpmdW5jdGlvbihiLGUpe3JldHVybiBCLmdldEJhcnljb29yZChiLHRoaXMuYSx0aGlzLmIsdGhpcy5jLGUpfSxnZXRVVjpmdW5jdGlvbihiLGUsaCxtLHUpe3JldHVybiBCLmdldFVWKGIsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSxoLG0sdSl9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYil7cmV0dXJuIEIuY29udGFpbnNQb2ludChiLHRoaXMuYSx0aGlzLmIsdGhpcy5jKX0saXNGcm9udEZhY2luZzpmdW5jdGlvbihiKXtyZXR1cm4gQi5pc0Zyb250RmFjaW5nKHRoaXMuYSx0aGlzLmIsdGhpcy5jLGIpfSxpbnRlcnNlY3RzQm94OmZ1bmN0aW9uKGIpe3JldHVybiBiLmludGVyc2VjdHNUcmlhbmdsZSh0aGlzKX0sY2xvc2VzdFBvaW50VG9Qb2ludDpmdW5jdGlvbihiLAplKXt2b2lkIDA9PT1lJiYoY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmNsb3Nlc3RQb2ludFRvUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksZT1uZXcgZyk7dmFyIGg9dGhpcy5hLG09dGhpcy5iLHU9dGhpcy5jO3VnLnN1YlZlY3RvcnMobSxoKTt2Zy5zdWJWZWN0b3JzKHUsaCk7Zmwuc3ViVmVjdG9ycyhiLGgpO3ZhciB3PXVnLmRvdChmbCksQT12Zy5kb3QoZmwpO2lmKDA+PXcmJjA+PUEpcmV0dXJuIGUuY29weShoKTtnbC5zdWJWZWN0b3JzKGIsbSk7dmFyIEU9dWcuZG90KGdsKSxHPXZnLmRvdChnbCk7aWYoMDw9RSYmRzw9RSlyZXR1cm4gZS5jb3B5KG0pO3ZhciBKPXcqRy1FKkE7aWYoMD49SiYmMDw9dyYmMD49RSlyZXR1cm4gbT13Lyh3LUUpLGUuY29weShoKS5hZGRTY2FsZWRWZWN0b3IodWcsbSk7aGwuc3ViVmVjdG9ycyhiLHUpO2I9dWcuZG90KGhsKTt2YXIgUT12Zy5kb3QoaGwpO2lmKDA8PVEmJmI8PVEpcmV0dXJuIGUuY29weSh1KTt3PWIqQS0KdypRO2lmKDA+PXcmJjA8PUEmJjA+PVEpcmV0dXJuIEo9QS8oQS1RKSxlLmNvcHkoaCkuYWRkU2NhbGVkVmVjdG9yKHZnLEopO0E9RSpRLWIqRztpZigwPj1BJiYwPD1HLUUmJjA8PWItUSlyZXR1cm4gcm8uc3ViVmVjdG9ycyh1LG0pLEo9KEctRSkvKEctRSsoYi1RKSksZS5jb3B5KG0pLmFkZFNjYWxlZFZlY3RvcihybyxKKTt1PTEvKEErdytKKTttPXcqdTtKKj11O3JldHVybiBlLmNvcHkoaCkuYWRkU2NhbGVkVmVjdG9yKHVnLG0pLmFkZFNjYWxlZFZlY3Rvcih2ZyxKKX0sZXF1YWxzOmZ1bmN0aW9uKGIpe3JldHVybiBiLmEuZXF1YWxzKHRoaXMuYSkmJmIuYi5lcXVhbHModGhpcy5iKSYmYi5jLmVxdWFscyh0aGlzLmMpfX0pO3ZhciBBcz17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSwKYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LApkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsCmxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NywKbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LApyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9LEhjPXtoOjAsCnM6MCxsOjB9LGpqPXtoOjAsczowLGw6MH07T2JqZWN0LmFzc2lnbihJLnByb3RvdHlwZSx7aXNDb2xvcjohMCxyOjEsZzoxLGI6MSxzZXQ6ZnVuY3Rpb24oYil7YiYmYi5pc0NvbG9yP3RoaXMuY29weShiKToibnVtYmVyIj09PXR5cGVvZiBiP3RoaXMuc2V0SGV4KGIpOiJzdHJpbmciPT09dHlwZW9mIGImJnRoaXMuc2V0U3R5bGUoYik7cmV0dXJuIHRoaXN9LHNldFNjYWxhcjpmdW5jdGlvbihiKXt0aGlzLmI9dGhpcy5nPXRoaXMucj1iO3JldHVybiB0aGlzfSxzZXRIZXg6ZnVuY3Rpb24oYil7Yj1NYXRoLmZsb29yKGIpO3RoaXMucj0oYj4+MTYmMjU1KS8yNTU7dGhpcy5nPShiPj44JjI1NSkvMjU1O3RoaXMuYj0oYiYyNTUpLzI1NTtyZXR1cm4gdGhpc30sc2V0UkdCOmZ1bmN0aW9uKGIsZSxoKXt0aGlzLnI9Yjt0aGlzLmc9ZTt0aGlzLmI9aDtyZXR1cm4gdGhpc30sc2V0SFNMOmZ1bmN0aW9uKGIsZSxoKXtiPWxiLmV1Y2xpZGVhbk1vZHVsbyhiLDEpO2U9bGIuY2xhbXAoZSwwLAoxKTtoPWxiLmNsYW1wKGgsMCwxKTswPT09ZT90aGlzLnI9dGhpcy5nPXRoaXMuYj1oOihlPS41Pj1oP2gqKDErZSk6aCtlLWgqZSxoPTIqaC1lLHRoaXMucj1PKGgsZSxiKzEvMyksdGhpcy5nPU8oaCxlLGIpLHRoaXMuYj1PKGgsZSxiLTEvMykpO3JldHVybiB0aGlzfSxzZXRTdHlsZTpmdW5jdGlvbihiKXtmdW5jdGlvbiBlKEEpe3ZvaWQgMCE9PUEmJjE+cGFyc2VGbG9hdChBKSYmY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogQWxwaGEgY29tcG9uZW50IG9mICIrYisiIHdpbGwgYmUgaWdub3JlZC4iKX12YXIgaDtpZihoPS9eKCg/OnJnYnxoc2wpYT8pXChccyooW15cKV0qKVwpLy5leGVjKGIpKXt2YXIgbT1oWzJdO3N3aXRjaChoWzFdKXtjYXNlICJyZ2IiOmNhc2UgInJnYmEiOmlmKGg9L14oXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKigsXHMqKFswLTldKlwuP1swLTldKylccyopPyQvLmV4ZWMobSkpcmV0dXJuIHRoaXMucj1NYXRoLm1pbigyNTUscGFyc2VJbnQoaFsxXSwKMTApKS8yNTUsdGhpcy5nPU1hdGgubWluKDI1NSxwYXJzZUludChoWzJdLDEwKSkvMjU1LHRoaXMuYj1NYXRoLm1pbigyNTUscGFyc2VJbnQoaFszXSwxMCkpLzI1NSxlKGhbNV0pLHRoaXM7aWYoaD0vXihcZCspJVxzKixccyooXGQrKSVccyosXHMqKFxkKyklXHMqKCxccyooWzAtOV0qXC4/WzAtOV0rKVxzKik/JC8uZXhlYyhtKSlyZXR1cm4gdGhpcy5yPU1hdGgubWluKDEwMCxwYXJzZUludChoWzFdLDEwKSkvMTAwLHRoaXMuZz1NYXRoLm1pbigxMDAscGFyc2VJbnQoaFsyXSwxMCkpLzEwMCx0aGlzLmI9TWF0aC5taW4oMTAwLHBhcnNlSW50KGhbM10sMTApKS8xMDAsZShoWzVdKSx0aGlzO2JyZWFrO2Nhc2UgImhzbCI6Y2FzZSAiaHNsYSI6aWYoaD0vXihbMC05XSpcLj9bMC05XSspXHMqLFxzKihcZCspJVxzKixccyooXGQrKSVccyooLFxzKihbMC05XSpcLj9bMC05XSspXHMqKT8kLy5leGVjKG0pKXttPXBhcnNlRmxvYXQoaFsxXSkvMzYwO3ZhciB1PXBhcnNlSW50KGhbMl0sCjEwKS8xMDAsdz1wYXJzZUludChoWzNdLDEwKS8xMDA7ZShoWzVdKTtyZXR1cm4gdGhpcy5zZXRIU0wobSx1LHcpfX19ZWxzZSBpZihoPS9eIyhbQS1GYS1mMC05XSspJC8uZXhlYyhiKSl7aD1oWzFdO209aC5sZW5ndGg7aWYoMz09PW0pcmV0dXJuIHRoaXMucj1wYXJzZUludChoLmNoYXJBdCgwKStoLmNoYXJBdCgwKSwxNikvMjU1LHRoaXMuZz1wYXJzZUludChoLmNoYXJBdCgxKStoLmNoYXJBdCgxKSwxNikvMjU1LHRoaXMuYj1wYXJzZUludChoLmNoYXJBdCgyKStoLmNoYXJBdCgyKSwxNikvMjU1LHRoaXM7aWYoNj09PW0pcmV0dXJuIHRoaXMucj1wYXJzZUludChoLmNoYXJBdCgwKStoLmNoYXJBdCgxKSwxNikvMjU1LHRoaXMuZz1wYXJzZUludChoLmNoYXJBdCgyKStoLmNoYXJBdCgzKSwxNikvMjU1LHRoaXMuYj1wYXJzZUludChoLmNoYXJBdCg0KStoLmNoYXJBdCg1KSwxNikvMjU1LHRoaXN9YiYmMDxiLmxlbmd0aCYmKGg9QXNbYl0sdm9pZCAwIT09aD90aGlzLnNldEhleChoKToKY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAiK2IpKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5yLHRoaXMuZyx0aGlzLmIpfSxjb3B5OmZ1bmN0aW9uKGIpe3RoaXMucj1iLnI7dGhpcy5nPWIuZzt0aGlzLmI9Yi5iO3JldHVybiB0aGlzfSxjb3B5R2FtbWFUb0xpbmVhcjpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihlPTIpO3RoaXMucj1NYXRoLnBvdyhiLnIsZSk7dGhpcy5nPU1hdGgucG93KGIuZyxlKTt0aGlzLmI9TWF0aC5wb3coYi5iLGUpO3JldHVybiB0aGlzfSxjb3B5TGluZWFyVG9HYW1tYTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihlPTIpO2U9MDxlPzEvZToxO3RoaXMucj1NYXRoLnBvdyhiLnIsZSk7dGhpcy5nPU1hdGgucG93KGIuZyxlKTt0aGlzLmI9TWF0aC5wb3coYi5iLGUpO3JldHVybiB0aGlzfSxjb252ZXJ0R2FtbWFUb0xpbmVhcjpmdW5jdGlvbihiKXt0aGlzLmNvcHlHYW1tYVRvTGluZWFyKHRoaXMsCmIpO3JldHVybiB0aGlzfSxjb252ZXJ0TGluZWFyVG9HYW1tYTpmdW5jdGlvbihiKXt0aGlzLmNvcHlMaW5lYXJUb0dhbW1hKHRoaXMsYik7cmV0dXJuIHRoaXN9LGNvcHlTUkdCVG9MaW5lYXI6ZnVuY3Rpb24oYil7dGhpcy5yPVAoYi5yKTt0aGlzLmc9UChiLmcpO3RoaXMuYj1QKGIuYik7cmV0dXJuIHRoaXN9LGNvcHlMaW5lYXJUb1NSR0I6ZnVuY3Rpb24oYil7dGhpcy5yPUgoYi5yKTt0aGlzLmc9SChiLmcpO3RoaXMuYj1IKGIuYik7cmV0dXJuIHRoaXN9LGNvbnZlcnRTUkdCVG9MaW5lYXI6ZnVuY3Rpb24oKXt0aGlzLmNvcHlTUkdCVG9MaW5lYXIodGhpcyk7cmV0dXJuIHRoaXN9LGNvbnZlcnRMaW5lYXJUb1NSR0I6ZnVuY3Rpb24oKXt0aGlzLmNvcHlMaW5lYXJUb1NSR0IodGhpcyk7cmV0dXJuIHRoaXN9LGdldEhleDpmdW5jdGlvbigpe3JldHVybiAyNTUqdGhpcy5yPDwxNl4yNTUqdGhpcy5nPDw4XjI1NSp0aGlzLmI8PDB9LGdldEhleFN0cmluZzpmdW5jdGlvbigpe3JldHVybigiMDAwMDAwIisKdGhpcy5nZXRIZXgoKS50b1N0cmluZygxNikpLnNsaWNlKC02KX0sZ2V0SFNMOmZ1bmN0aW9uKGIpe3ZvaWQgMD09PWImJihjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiAuZ2V0SFNMKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGI9e2g6MCxzOjAsbDowfSk7dmFyIGU9dGhpcy5yLGg9dGhpcy5nLG09dGhpcy5iLHU9TWF0aC5tYXgoZSxoLG0pLHc9TWF0aC5taW4oZSxoLG0pLEEsRT0odyt1KS8yO2lmKHc9PT11KXc9QT0wO2Vsc2V7dmFyIEc9dS13O3c9LjU+PUU/Ry8odSt3KTpHLygyLXUtdyk7c3dpdGNoKHUpe2Nhc2UgZTpBPShoLW0pL0crKGg8bT82OjApO2JyZWFrO2Nhc2UgaDpBPShtLWUpL0crMjticmVhaztjYXNlIG06QT0oZS1oKS9HKzR9QS89Nn1iLmg9QTtiLnM9dztiLmw9RTtyZXR1cm4gYn0sZ2V0U3R5bGU6ZnVuY3Rpb24oKXtyZXR1cm4icmdiKCIrKDI1NSp0aGlzLnJ8MCkrIiwiKygyNTUqdGhpcy5nfDApKyIsIisoMjU1KnRoaXMuYnwwKSsiKSJ9LG9mZnNldEhTTDpmdW5jdGlvbihiLAplLGgpe3RoaXMuZ2V0SFNMKEhjKTtIYy5oKz1iO0hjLnMrPWU7SGMubCs9aDt0aGlzLnNldEhTTChIYy5oLEhjLnMsSGMubCk7cmV0dXJuIHRoaXN9LGFkZDpmdW5jdGlvbihiKXt0aGlzLnIrPWIucjt0aGlzLmcrPWIuZzt0aGlzLmIrPWIuYjtyZXR1cm4gdGhpc30sYWRkQ29sb3JzOmZ1bmN0aW9uKGIsZSl7dGhpcy5yPWIucitlLnI7dGhpcy5nPWIuZytlLmc7dGhpcy5iPWIuYitlLmI7cmV0dXJuIHRoaXN9LGFkZFNjYWxhcjpmdW5jdGlvbihiKXt0aGlzLnIrPWI7dGhpcy5nKz1iO3RoaXMuYis9YjtyZXR1cm4gdGhpc30sc3ViOmZ1bmN0aW9uKGIpe3RoaXMucj1NYXRoLm1heCgwLHRoaXMuci1iLnIpO3RoaXMuZz1NYXRoLm1heCgwLHRoaXMuZy1iLmcpO3RoaXMuYj1NYXRoLm1heCgwLHRoaXMuYi1iLmIpO3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihiKXt0aGlzLnIqPWIucjt0aGlzLmcqPWIuZzt0aGlzLmIqPWIuYjtyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYil7dGhpcy5yKj0KYjt0aGlzLmcqPWI7dGhpcy5iKj1iO3JldHVybiB0aGlzfSxsZXJwOmZ1bmN0aW9uKGIsZSl7dGhpcy5yKz0oYi5yLXRoaXMucikqZTt0aGlzLmcrPShiLmctdGhpcy5nKSplO3RoaXMuYis9KGIuYi10aGlzLmIpKmU7cmV0dXJuIHRoaXN9LGxlcnBIU0w6ZnVuY3Rpb24oYixlKXt0aGlzLmdldEhTTChIYyk7Yi5nZXRIU0woamopO2I9bGIubGVycChIYy5oLGpqLmgsZSk7dmFyIGg9bGIubGVycChIYy5zLGpqLnMsZSk7ZT1sYi5sZXJwKEhjLmwsamoubCxlKTt0aGlzLnNldEhTTChiLGgsZSk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihiKXtyZXR1cm4gYi5yPT09dGhpcy5yJiZiLmc9PT10aGlzLmcmJmIuYj09PXRoaXMuYn0sZnJvbUFycmF5OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGU9MCk7dGhpcy5yPWJbZV07dGhpcy5nPWJbZSsxXTt0aGlzLmI9YltlKzJdO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09YiYmKGI9W10pO3ZvaWQgMD09PQplJiYoZT0wKTtiW2VdPXRoaXMucjtiW2UrMV09dGhpcy5nO2JbZSsyXT10aGlzLmI7cmV0dXJuIGJ9LHRvSlNPTjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEhleCgpfX0pO09iamVjdC5hc3NpZ24oSy5wcm90b3R5cGUse2Nsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGIpe3RoaXMuYT1iLmE7dGhpcy5iPWIuYjt0aGlzLmM9Yi5jO3RoaXMubm9ybWFsLmNvcHkoYi5ub3JtYWwpO3RoaXMuY29sb3IuY29weShiLmNvbG9yKTt0aGlzLm1hdGVyaWFsSW5kZXg9Yi5tYXRlcmlhbEluZGV4O2Zvcih2YXIgZT0wLGg9Yi52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDtlPGg7ZSsrKXRoaXMudmVydGV4Tm9ybWFsc1tlXT1iLnZlcnRleE5vcm1hbHNbZV0uY2xvbmUoKTtlPTA7Zm9yKGg9Yi52ZXJ0ZXhDb2xvcnMubGVuZ3RoO2U8aDtlKyspdGhpcy52ZXJ0ZXhDb2xvcnNbZV09Yi52ZXJ0ZXhDb2xvcnNbZV0uY2xvbmUoKTsKcmV0dXJuIHRoaXN9fSk7dmFyIExxPTA7TS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6TSxpc01hdGVyaWFsOiEwLG9uQmVmb3JlQ29tcGlsZTpmdW5jdGlvbigpe30sc2V0VmFsdWVzOmZ1bmN0aW9uKGIpe2lmKHZvaWQgMCE9PWIpZm9yKHZhciBlIGluIGIpe3ZhciBoPWJbZV07aWYodm9pZCAwPT09aCljb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAnIitlKyInIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuIik7ZWxzZSBpZigic2hhZGluZyI9PT1lKWNvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLiIpLHRoaXMuZmxhdFNoYWRpbmc9MT09PWg/ITA6ITE7ZWxzZXt2YXIgbT10aGlzW2VdO3ZvaWQgMD09PW0/Y29uc29sZS53YXJuKCJUSFJFRS4iK3RoaXMudHlwZSsiOiAnIitlKyInIGlzIG5vdCBhIHByb3BlcnR5IG9mIHRoaXMgbWF0ZXJpYWwuIik6Cm0mJm0uaXNDb2xvcj9tLnNldChoKTptJiZtLmlzVmVjdG9yMyYmaCYmaC5pc1ZlY3RvcjM/bS5jb3B5KGgpOnRoaXNbZV09aH19fSx0b0pTT046ZnVuY3Rpb24oYil7ZnVuY3Rpb24gZSh1KXt2YXIgdz1bXSxBO2ZvcihBIGluIHUpe3ZhciBFPXVbQV07ZGVsZXRlIEUubWV0YWRhdGE7dy5wdXNoKEUpfXJldHVybiB3fXZhciBoPXZvaWQgMD09PWJ8fCJzdHJpbmciPT09dHlwZW9mIGI7aCYmKGI9e3RleHR1cmVzOnt9LGltYWdlczp7fX0pO3ZhciBtPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiTWF0ZXJpYWwiLGdlbmVyYXRvcjoiTWF0ZXJpYWwudG9KU09OIn19O20udXVpZD10aGlzLnV1aWQ7bS50eXBlPXRoaXMudHlwZTsiIiE9PXRoaXMubmFtZSYmKG0ubmFtZT10aGlzLm5hbWUpO3RoaXMuY29sb3ImJnRoaXMuY29sb3IuaXNDb2xvciYmKG0uY29sb3I9dGhpcy5jb2xvci5nZXRIZXgoKSk7dm9pZCAwIT09dGhpcy5yb3VnaG5lc3MmJihtLnJvdWdobmVzcz10aGlzLnJvdWdobmVzcyk7CnZvaWQgMCE9PXRoaXMubWV0YWxuZXNzJiYobS5tZXRhbG5lc3M9dGhpcy5tZXRhbG5lc3MpO3RoaXMuZW1pc3NpdmUmJnRoaXMuZW1pc3NpdmUuaXNDb2xvciYmKG0uZW1pc3NpdmU9dGhpcy5lbWlzc2l2ZS5nZXRIZXgoKSk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eSYmMSE9PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkmJihtLmVtaXNzaXZlSW50ZW5zaXR5PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkpO3RoaXMuc3BlY3VsYXImJnRoaXMuc3BlY3VsYXIuaXNDb2xvciYmKG0uc3BlY3VsYXI9dGhpcy5zcGVjdWxhci5nZXRIZXgoKSk7dm9pZCAwIT09dGhpcy5zaGluaW5lc3MmJihtLnNoaW5pbmVzcz10aGlzLnNoaW5pbmVzcyk7dm9pZCAwIT09dGhpcy5jbGVhcmNvYXQmJihtLmNsZWFyY29hdD10aGlzLmNsZWFyY29hdCk7dm9pZCAwIT09dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MmJihtLmNsZWFyY29hdFJvdWdobmVzcz10aGlzLmNsZWFyY29hdFJvdWdobmVzcyk7dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAmJgp0aGlzLmNsZWFyY29hdE5vcm1hbE1hcC5pc1RleHR1cmUmJihtLmNsZWFyY29hdE5vcm1hbE1hcD10aGlzLmNsZWFyY29hdE5vcm1hbE1hcC50b0pTT04oYikudXVpZCxtLmNsZWFyY29hdE5vcm1hbFNjYWxlPXRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudG9BcnJheSgpKTt0aGlzLm1hcCYmdGhpcy5tYXAuaXNUZXh0dXJlJiYobS5tYXA9dGhpcy5tYXAudG9KU09OKGIpLnV1aWQpO3RoaXMubWF0Y2FwJiZ0aGlzLm1hdGNhcC5pc1RleHR1cmUmJihtLm1hdGNhcD10aGlzLm1hdGNhcC50b0pTT04oYikudXVpZCk7dGhpcy5hbHBoYU1hcCYmdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUmJihtLmFscGhhTWFwPXRoaXMuYWxwaGFNYXAudG9KU09OKGIpLnV1aWQpO3RoaXMubGlnaHRNYXAmJnRoaXMubGlnaHRNYXAuaXNUZXh0dXJlJiYobS5saWdodE1hcD10aGlzLmxpZ2h0TWFwLnRvSlNPTihiKS51dWlkKTt0aGlzLmFvTWFwJiZ0aGlzLmFvTWFwLmlzVGV4dHVyZSYmKG0uYW9NYXA9dGhpcy5hb01hcC50b0pTT04oYikudXVpZCwKbS5hb01hcEludGVuc2l0eT10aGlzLmFvTWFwSW50ZW5zaXR5KTt0aGlzLmJ1bXBNYXAmJnRoaXMuYnVtcE1hcC5pc1RleHR1cmUmJihtLmJ1bXBNYXA9dGhpcy5idW1wTWFwLnRvSlNPTihiKS51dWlkLG0uYnVtcFNjYWxlPXRoaXMuYnVtcFNjYWxlKTt0aGlzLm5vcm1hbE1hcCYmdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlJiYobS5ub3JtYWxNYXA9dGhpcy5ub3JtYWxNYXAudG9KU09OKGIpLnV1aWQsbS5ub3JtYWxNYXBUeXBlPXRoaXMubm9ybWFsTWFwVHlwZSxtLm5vcm1hbFNjYWxlPXRoaXMubm9ybWFsU2NhbGUudG9BcnJheSgpKTt0aGlzLmRpc3BsYWNlbWVudE1hcCYmdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlJiYobS5kaXNwbGFjZW1lbnRNYXA9dGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKGIpLnV1aWQsbS5kaXNwbGFjZW1lbnRTY2FsZT10aGlzLmRpc3BsYWNlbWVudFNjYWxlLG0uZGlzcGxhY2VtZW50Qmlhcz10aGlzLmRpc3BsYWNlbWVudEJpYXMpO3RoaXMucm91Z2huZXNzTWFwJiYKdGhpcy5yb3VnaG5lc3NNYXAuaXNUZXh0dXJlJiYobS5yb3VnaG5lc3NNYXA9dGhpcy5yb3VnaG5lc3NNYXAudG9KU09OKGIpLnV1aWQpO3RoaXMubWV0YWxuZXNzTWFwJiZ0aGlzLm1ldGFsbmVzc01hcC5pc1RleHR1cmUmJihtLm1ldGFsbmVzc01hcD10aGlzLm1ldGFsbmVzc01hcC50b0pTT04oYikudXVpZCk7dGhpcy5lbWlzc2l2ZU1hcCYmdGhpcy5lbWlzc2l2ZU1hcC5pc1RleHR1cmUmJihtLmVtaXNzaXZlTWFwPXRoaXMuZW1pc3NpdmVNYXAudG9KU09OKGIpLnV1aWQpO3RoaXMuc3BlY3VsYXJNYXAmJnRoaXMuc3BlY3VsYXJNYXAuaXNUZXh0dXJlJiYobS5zcGVjdWxhck1hcD10aGlzLnNwZWN1bGFyTWFwLnRvSlNPTihiKS51dWlkKTt0aGlzLmVudk1hcCYmdGhpcy5lbnZNYXAuaXNUZXh0dXJlJiYobS5lbnZNYXA9dGhpcy5lbnZNYXAudG9KU09OKGIpLnV1aWQsbS5yZWZsZWN0aXZpdHk9dGhpcy5yZWZsZWN0aXZpdHksbS5yZWZyYWN0aW9uUmF0aW89dGhpcy5yZWZyYWN0aW9uUmF0aW8sCnZvaWQgMCE9PXRoaXMuY29tYmluZSYmKG0uY29tYmluZT10aGlzLmNvbWJpbmUpLHZvaWQgMCE9PXRoaXMuZW52TWFwSW50ZW5zaXR5JiYobS5lbnZNYXBJbnRlbnNpdHk9dGhpcy5lbnZNYXBJbnRlbnNpdHkpKTt0aGlzLmdyYWRpZW50TWFwJiZ0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSYmKG0uZ3JhZGllbnRNYXA9dGhpcy5ncmFkaWVudE1hcC50b0pTT04oYikudXVpZCk7dm9pZCAwIT09dGhpcy5zaXplJiYobS5zaXplPXRoaXMuc2l6ZSk7dm9pZCAwIT09dGhpcy5zaXplQXR0ZW51YXRpb24mJihtLnNpemVBdHRlbnVhdGlvbj10aGlzLnNpemVBdHRlbnVhdGlvbik7MSE9PXRoaXMuYmxlbmRpbmcmJihtLmJsZW5kaW5nPXRoaXMuYmxlbmRpbmcpOyEwPT09dGhpcy5mbGF0U2hhZGluZyYmKG0uZmxhdFNoYWRpbmc9dGhpcy5mbGF0U2hhZGluZyk7MCE9PXRoaXMuc2lkZSYmKG0uc2lkZT10aGlzLnNpZGUpOzAhPT10aGlzLnZlcnRleENvbG9ycyYmKG0udmVydGV4Q29sb3JzPQp0aGlzLnZlcnRleENvbG9ycyk7MT50aGlzLm9wYWNpdHkmJihtLm9wYWNpdHk9dGhpcy5vcGFjaXR5KTshMD09PXRoaXMudHJhbnNwYXJlbnQmJihtLnRyYW5zcGFyZW50PXRoaXMudHJhbnNwYXJlbnQpO20uZGVwdGhGdW5jPXRoaXMuZGVwdGhGdW5jO20uZGVwdGhUZXN0PXRoaXMuZGVwdGhUZXN0O20uZGVwdGhXcml0ZT10aGlzLmRlcHRoV3JpdGU7bS5zdGVuY2lsV3JpdGU9dGhpcy5zdGVuY2lsV3JpdGU7bS5zdGVuY2lsRnVuYz10aGlzLnN0ZW5jaWxGdW5jO20uc3RlbmNpbFJlZj10aGlzLnN0ZW5jaWxSZWY7bS5zdGVuY2lsTWFzaz10aGlzLnN0ZW5jaWxNYXNrO20uc3RlbmNpbEZhaWw9dGhpcy5zdGVuY2lsRmFpbDttLnN0ZW5jaWxaRmFpbD10aGlzLnN0ZW5jaWxaRmFpbDttLnN0ZW5jaWxaUGFzcz10aGlzLnN0ZW5jaWxaUGFzczt0aGlzLnJvdGF0aW9uJiYwIT09dGhpcy5yb3RhdGlvbiYmKG0ucm90YXRpb249dGhpcy5yb3RhdGlvbik7ITA9PT10aGlzLnBvbHlnb25PZmZzZXQmJgoobS5wb2x5Z29uT2Zmc2V0PSEwKTswIT09dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yJiYobS5wb2x5Z29uT2Zmc2V0RmFjdG9yPXRoaXMucG9seWdvbk9mZnNldEZhY3Rvcik7MCE9PXRoaXMucG9seWdvbk9mZnNldFVuaXRzJiYobS5wb2x5Z29uT2Zmc2V0VW5pdHM9dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMpO3RoaXMubGluZXdpZHRoJiYxIT09dGhpcy5saW5ld2lkdGgmJihtLmxpbmV3aWR0aD10aGlzLmxpbmV3aWR0aCk7dm9pZCAwIT09dGhpcy5kYXNoU2l6ZSYmKG0uZGFzaFNpemU9dGhpcy5kYXNoU2l6ZSk7dm9pZCAwIT09dGhpcy5nYXBTaXplJiYobS5nYXBTaXplPXRoaXMuZ2FwU2l6ZSk7dm9pZCAwIT09dGhpcy5zY2FsZSYmKG0uc2NhbGU9dGhpcy5zY2FsZSk7ITA9PT10aGlzLmRpdGhlcmluZyYmKG0uZGl0aGVyaW5nPSEwKTswPHRoaXMuYWxwaGFUZXN0JiYobS5hbHBoYVRlc3Q9dGhpcy5hbHBoYVRlc3QpOyEwPT09dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEmJihtLnByZW11bHRpcGxpZWRBbHBoYT0KdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEpOyEwPT09dGhpcy53aXJlZnJhbWUmJihtLndpcmVmcmFtZT10aGlzLndpcmVmcmFtZSk7MTx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCYmKG0ud2lyZWZyYW1lTGluZXdpZHRoPXRoaXMud2lyZWZyYW1lTGluZXdpZHRoKTsicm91bmQiIT09dGhpcy53aXJlZnJhbWVMaW5lY2FwJiYobS53aXJlZnJhbWVMaW5lY2FwPXRoaXMud2lyZWZyYW1lTGluZWNhcCk7InJvdW5kIiE9PXRoaXMud2lyZWZyYW1lTGluZWpvaW4mJihtLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWpvaW4pOyEwPT09dGhpcy5tb3JwaFRhcmdldHMmJihtLm1vcnBoVGFyZ2V0cz0hMCk7ITA9PT10aGlzLm1vcnBoTm9ybWFscyYmKG0ubW9ycGhOb3JtYWxzPSEwKTshMD09PXRoaXMuc2tpbm5pbmcmJihtLnNraW5uaW5nPSEwKTshMT09PXRoaXMudmlzaWJsZSYmKG0udmlzaWJsZT0hMSk7ITE9PT10aGlzLnRvbmVNYXBwZWQmJihtLnRvbmVNYXBwZWQ9ITEpOwoie30iIT09SlNPTi5zdHJpbmdpZnkodGhpcy51c2VyRGF0YSkmJihtLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpO2gmJihoPWUoYi50ZXh0dXJlcyksYj1lKGIuaW1hZ2VzKSwwPGgubGVuZ3RoJiYobS50ZXh0dXJlcz1oKSwwPGIubGVuZ3RoJiYobS5pbWFnZXM9YikpO3JldHVybiBtfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihiKXt0aGlzLm5hbWU9Yi5uYW1lO3RoaXMuZm9nPWIuZm9nO3RoaXMubGlnaHRzPWIubGlnaHRzO3RoaXMuYmxlbmRpbmc9Yi5ibGVuZGluZzt0aGlzLnNpZGU9Yi5zaWRlO3RoaXMuZmxhdFNoYWRpbmc9Yi5mbGF0U2hhZGluZzt0aGlzLnZlcnRleENvbG9ycz1iLnZlcnRleENvbG9yczt0aGlzLm9wYWNpdHk9Yi5vcGFjaXR5O3RoaXMudHJhbnNwYXJlbnQ9Yi50cmFuc3BhcmVudDt0aGlzLmJsZW5kU3JjPWIuYmxlbmRTcmM7dGhpcy5ibGVuZERzdD1iLmJsZW5kRHN0O3RoaXMuYmxlbmRFcXVhdGlvbj0KYi5ibGVuZEVxdWF0aW9uO3RoaXMuYmxlbmRTcmNBbHBoYT1iLmJsZW5kU3JjQWxwaGE7dGhpcy5ibGVuZERzdEFscGhhPWIuYmxlbmREc3RBbHBoYTt0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT1iLmJsZW5kRXF1YXRpb25BbHBoYTt0aGlzLmRlcHRoRnVuYz1iLmRlcHRoRnVuYzt0aGlzLmRlcHRoVGVzdD1iLmRlcHRoVGVzdDt0aGlzLmRlcHRoV3JpdGU9Yi5kZXB0aFdyaXRlO3RoaXMuc3RlbmNpbFdyaXRlPWIuc3RlbmNpbFdyaXRlO3RoaXMuc3RlbmNpbEZ1bmM9Yi5zdGVuY2lsRnVuYzt0aGlzLnN0ZW5jaWxSZWY9Yi5zdGVuY2lsUmVmO3RoaXMuc3RlbmNpbE1hc2s9Yi5zdGVuY2lsTWFzazt0aGlzLnN0ZW5jaWxGYWlsPWIuc3RlbmNpbEZhaWw7dGhpcy5zdGVuY2lsWkZhaWw9Yi5zdGVuY2lsWkZhaWw7dGhpcy5zdGVuY2lsWlBhc3M9Yi5zdGVuY2lsWlBhc3M7dGhpcy5jb2xvcldyaXRlPWIuY29sb3JXcml0ZTt0aGlzLnByZWNpc2lvbj1iLnByZWNpc2lvbjt0aGlzLnBvbHlnb25PZmZzZXQ9CmIucG9seWdvbk9mZnNldDt0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9Yi5wb2x5Z29uT2Zmc2V0RmFjdG9yO3RoaXMucG9seWdvbk9mZnNldFVuaXRzPWIucG9seWdvbk9mZnNldFVuaXRzO3RoaXMuZGl0aGVyaW5nPWIuZGl0aGVyaW5nO3RoaXMuYWxwaGFUZXN0PWIuYWxwaGFUZXN0O3RoaXMucHJlbXVsdGlwbGllZEFscGhhPWIucHJlbXVsdGlwbGllZEFscGhhO3RoaXMudmlzaWJsZT1iLnZpc2libGU7dGhpcy50b25lTWFwcGVkPWIudG9uZU1hcHBlZDt0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYi51c2VyRGF0YSkpO3RoaXMuY2xpcFNoYWRvd3M9Yi5jbGlwU2hhZG93czt0aGlzLmNsaXBJbnRlcnNlY3Rpb249Yi5jbGlwSW50ZXJzZWN0aW9uO3ZhciBlPWIuY2xpcHBpbmdQbGFuZXMsaD1udWxsO2lmKG51bGwhPT1lKXt2YXIgbT1lLmxlbmd0aDtoPUFycmF5KG0pO2Zvcih2YXIgdT0wO3UhPT1tOysrdSloW3VdPWVbdV0uY2xvbmUoKX10aGlzLmNsaXBwaW5nUGxhbmVzPQpoO3RoaXMuc2hhZG93U2lkZT1iLnNoYWRvd1NpZGU7cmV0dXJuIHRoaXN9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fSk7TC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7TC5wcm90b3R5cGUuY29uc3RydWN0b3I9TDtMLnByb3RvdHlwZS5pc01lc2hCYXNpY01hdGVyaWFsPSEwO0wucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5jb2xvci5jb3B5KGIuY29sb3IpO3RoaXMubWFwPWIubWFwO3RoaXMubGlnaHRNYXA9Yi5saWdodE1hcDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PWIubGlnaHRNYXBJbnRlbnNpdHk7dGhpcy5hb01hcD1iLmFvTWFwO3RoaXMuYW9NYXBJbnRlbnNpdHk9Yi5hb01hcEludGVuc2l0eTt0aGlzLnNwZWN1bGFyTWFwPWIuc3BlY3VsYXJNYXA7dGhpcy5hbHBoYU1hcD1iLmFscGhhTWFwO3RoaXMuZW52TWFwPWIuZW52TWFwOwp0aGlzLmNvbWJpbmU9Yi5jb21iaW5lO3RoaXMucmVmbGVjdGl2aXR5PWIucmVmbGVjdGl2aXR5O3RoaXMucmVmcmFjdGlvblJhdGlvPWIucmVmcmFjdGlvblJhdGlvO3RoaXMud2lyZWZyYW1lPWIud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWIud2lyZWZyYW1lTGluZXdpZHRoO3RoaXMud2lyZWZyYW1lTGluZWNhcD1iLndpcmVmcmFtZUxpbmVjYXA7dGhpcy53aXJlZnJhbWVMaW5lam9pbj1iLndpcmVmcmFtZUxpbmVqb2luO3RoaXMuc2tpbm5pbmc9Yi5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1iLm1vcnBoVGFyZ2V0cztyZXR1cm4gdGhpc307T2JqZWN0LmRlZmluZVByb3BlcnR5KFIucHJvdG90eXBlLCJuZWVkc1VwZGF0ZSIse3NldDpmdW5jdGlvbihiKXshMD09PWImJnRoaXMudmVyc2lvbisrfX0pO09iamVjdC5hc3NpZ24oUi5wcm90b3R5cGUse2lzQnVmZmVyQXR0cmlidXRlOiEwLG9uVXBsb2FkQ2FsbGJhY2s6ZnVuY3Rpb24oKXt9LHNldEFycmF5OmZ1bmN0aW9uKGIpe2lmKEFycmF5LmlzQXJyYXkoYikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTsKdGhpcy5jb3VudD12b2lkIDAhPT1iP2IubGVuZ3RoL3RoaXMuaXRlbVNpemU6MDt0aGlzLmFycmF5PWI7cmV0dXJuIHRoaXN9LHNldER5bmFtaWM6ZnVuY3Rpb24oYil7dGhpcy5keW5hbWljPWI7cmV0dXJuIHRoaXN9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy5uYW1lPWIubmFtZTt0aGlzLmFycmF5PW5ldyBiLmFycmF5LmNvbnN0cnVjdG9yKGIuYXJyYXkpO3RoaXMuaXRlbVNpemU9Yi5pdGVtU2l6ZTt0aGlzLmNvdW50PWIuY291bnQ7dGhpcy5ub3JtYWxpemVkPWIubm9ybWFsaXplZDt0aGlzLmR5bmFtaWM9Yi5keW5hbWljO3JldHVybiB0aGlzfSxjb3B5QXQ6ZnVuY3Rpb24oYixlLGgpe2IqPXRoaXMuaXRlbVNpemU7aCo9ZS5pdGVtU2l6ZTtmb3IodmFyIG09MCx1PXRoaXMuaXRlbVNpemU7bTx1O20rKyl0aGlzLmFycmF5W2IrbV09ZS5hcnJheVtoK21dO3JldHVybiB0aGlzfSxjb3B5QXJyYXk6ZnVuY3Rpb24oYil7dGhpcy5hcnJheS5zZXQoYik7cmV0dXJuIHRoaXN9LGNvcHlDb2xvcnNBcnJheTpmdW5jdGlvbihiKXtmb3IodmFyIGU9CnRoaXMuYXJyYXksaD0wLG09MCx1PWIubGVuZ3RoO208dTttKyspe3ZhciB3PWJbbV07dm9pZCAwPT09dyYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlDb2xvcnNBcnJheSgpOiBjb2xvciBpcyB1bmRlZmluZWQiLG0pLHc9bmV3IEkpO2VbaCsrXT13LnI7ZVtoKytdPXcuZztlW2grK109dy5ifXJldHVybiB0aGlzfSxjb3B5VmVjdG9yMnNBcnJheTpmdW5jdGlvbihiKXtmb3IodmFyIGU9dGhpcy5hcnJheSxoPTAsbT0wLHU9Yi5sZW5ndGg7bTx1O20rKyl7dmFyIHc9YlttXTt2b2lkIDA9PT13JiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCIsbSksdz1uZXcgZCk7ZVtoKytdPXcueDtlW2grK109dy55fXJldHVybiB0aGlzfSxjb3B5VmVjdG9yM3NBcnJheTpmdW5jdGlvbihiKXtmb3IodmFyIGU9dGhpcy5hcnJheSxoPTAsbT0wLHU9Yi5sZW5ndGg7bTx1O20rKyl7dmFyIHc9CmJbbV07dm9pZCAwPT09dyYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQiLG0pLHc9bmV3IGcpO2VbaCsrXT13Lng7ZVtoKytdPXcueTtlW2grK109dy56fXJldHVybiB0aGlzfSxjb3B5VmVjdG9yNHNBcnJheTpmdW5jdGlvbihiKXtmb3IodmFyIGU9dGhpcy5hcnJheSxoPTAsbT0wLHU9Yi5sZW5ndGg7bTx1O20rKyl7dmFyIHc9YlttXTt2b2lkIDA9PT13JiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjRzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCIsbSksdz1uZXcgbik7ZVtoKytdPXcueDtlW2grK109dy55O2VbaCsrXT13Lno7ZVtoKytdPXcud31yZXR1cm4gdGhpc30sc2V0OmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGU9MCk7dGhpcy5hcnJheS5zZXQoYixlKTtyZXR1cm4gdGhpc30sZ2V0WDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5hcnJheVtiKgp0aGlzLml0ZW1TaXplXX0sc2V0WDpmdW5jdGlvbihiLGUpe3RoaXMuYXJyYXlbYip0aGlzLml0ZW1TaXplXT1lO3JldHVybiB0aGlzfSxnZXRZOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmFycmF5W2IqdGhpcy5pdGVtU2l6ZSsxXX0sc2V0WTpmdW5jdGlvbihiLGUpe3RoaXMuYXJyYXlbYip0aGlzLml0ZW1TaXplKzFdPWU7cmV0dXJuIHRoaXN9LGdldFo6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuYXJyYXlbYip0aGlzLml0ZW1TaXplKzJdfSxzZXRaOmZ1bmN0aW9uKGIsZSl7dGhpcy5hcnJheVtiKnRoaXMuaXRlbVNpemUrMl09ZTtyZXR1cm4gdGhpc30sZ2V0VzpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5hcnJheVtiKnRoaXMuaXRlbVNpemUrM119LHNldFc6ZnVuY3Rpb24oYixlKXt0aGlzLmFycmF5W2IqdGhpcy5pdGVtU2l6ZSszXT1lO3JldHVybiB0aGlzfSxzZXRYWTpmdW5jdGlvbihiLGUsaCl7Yio9dGhpcy5pdGVtU2l6ZTt0aGlzLmFycmF5W2IrMF09ZTt0aGlzLmFycmF5W2IrCjFdPWg7cmV0dXJuIHRoaXN9LHNldFhZWjpmdW5jdGlvbihiLGUsaCxtKXtiKj10aGlzLml0ZW1TaXplO3RoaXMuYXJyYXlbYiswXT1lO3RoaXMuYXJyYXlbYisxXT1oO3RoaXMuYXJyYXlbYisyXT1tO3JldHVybiB0aGlzfSxzZXRYWVpXOmZ1bmN0aW9uKGIsZSxoLG0sdSl7Yio9dGhpcy5pdGVtU2l6ZTt0aGlzLmFycmF5W2IrMF09ZTt0aGlzLmFycmF5W2IrMV09aDt0aGlzLmFycmF5W2IrMl09bTt0aGlzLmFycmF5W2IrM109dTtyZXR1cm4gdGhpc30sb25VcGxvYWQ6ZnVuY3Rpb24oYil7dGhpcy5vblVwbG9hZENhbGxiYWNrPWI7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuYXJyYXksdGhpcy5pdGVtU2l6ZSkpLmNvcHkodGhpcyl9LHRvSlNPTjpmdW5jdGlvbigpe3JldHVybntpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuYXJyYXkpLApub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH19fSk7VS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShSLnByb3RvdHlwZSk7VS5wcm90b3R5cGUuY29uc3RydWN0b3I9VTtZLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFIucHJvdG90eXBlKTtZLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1ZO2JhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFIucHJvdG90eXBlKTtiYS5wcm90b3R5cGUuY29uc3RydWN0b3I9YmE7bWEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUi5wcm90b3R5cGUpO21hLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1tYTthYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShSLnByb3RvdHlwZSk7YWEucHJvdG90eXBlLmNvbnN0cnVjdG9yPWFhO2NhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFIucHJvdG90eXBlKTtjYS5wcm90b3R5cGUuY29uc3RydWN0b3I9Y2E7ZmEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUi5wcm90b3R5cGUpO2ZhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1mYTsKZGEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUi5wcm90b3R5cGUpO2RhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1kYTtsYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShSLnByb3RvdHlwZSk7bGEucHJvdG90eXBlLmNvbnN0cnVjdG9yPWxhO09iamVjdC5hc3NpZ24oWi5wcm90b3R5cGUse2NvbXB1dGVHcm91cHM6ZnVuY3Rpb24oYil7dmFyIGU9W10saD12b2lkIDA7Yj1iLmZhY2VzO2Zvcih2YXIgbT0wO208Yi5sZW5ndGg7bSsrKXt2YXIgdT1iW21dO2lmKHUubWF0ZXJpYWxJbmRleCE9PWgpe2g9dS5tYXRlcmlhbEluZGV4O3ZvaWQgMCE9PXcmJih3LmNvdW50PTMqbS13LnN0YXJ0LGUucHVzaCh3KSk7dmFyIHc9e3N0YXJ0OjMqbSxtYXRlcmlhbEluZGV4Omh9fX12b2lkIDAhPT13JiYody5jb3VudD0zKm0tdy5zdGFydCxlLnB1c2godykpO3RoaXMuZ3JvdXBzPWV9LGZyb21HZW9tZXRyeTpmdW5jdGlvbihiKXt2YXIgZT1iLmZhY2VzLGg9Yi52ZXJ0aWNlcyxtPWIuZmFjZVZlcnRleFV2cywKdT1tWzBdJiYwPG1bMF0ubGVuZ3RoLHc9bVsxXSYmMDxtWzFdLmxlbmd0aCxBPWIubW9ycGhUYXJnZXRzLEU9QS5sZW5ndGg7aWYoMDxFKXt2YXIgRz1bXTtmb3IodmFyIEo9MDtKPEU7SisrKUdbSl09e25hbWU6QVtKXS5uYW1lLGRhdGE6W119O3RoaXMubW9ycGhUYXJnZXRzLnBvc2l0aW9uPUd9dmFyIFE9Yi5tb3JwaE5vcm1hbHMsUz1RLmxlbmd0aDtpZigwPFMpe3ZhciBUPVtdO2ZvcihKPTA7SjxTO0orKylUW0pdPXtuYW1lOlFbSl0ubmFtZSxkYXRhOltdfTt0aGlzLm1vcnBoVGFyZ2V0cy5ub3JtYWw9VH12YXIgVz1iLnNraW5JbmRpY2VzLFg9Yi5za2luV2VpZ2h0cyxpYT1XLmxlbmd0aD09PWgubGVuZ3RoLGhhPVgubGVuZ3RoPT09aC5sZW5ndGg7MDxoLmxlbmd0aCYmMD09PWUubGVuZ3RoJiZjb25zb2xlLmVycm9yKCJUSFJFRS5EaXJlY3RHZW9tZXRyeTogRmFjZWxlc3MgZ2VvbWV0cmllcyBhcmUgbm90IHN1cHBvcnRlZC4iKTtmb3IoSj0wO0o8ZS5sZW5ndGg7SisrKXt2YXIgc2E9CmVbSl07dGhpcy52ZXJ0aWNlcy5wdXNoKGhbc2EuYV0saFtzYS5iXSxoW3NhLmNdKTt2YXIgcWE9c2EudmVydGV4Tm9ybWFsczszPT09cWEubGVuZ3RoP3RoaXMubm9ybWFscy5wdXNoKHFhWzBdLHFhWzFdLHFhWzJdKToocWE9c2Eubm9ybWFsLHRoaXMubm9ybWFscy5wdXNoKHFhLHFhLHFhKSk7cWE9c2EudmVydGV4Q29sb3JzOzM9PT1xYS5sZW5ndGg/dGhpcy5jb2xvcnMucHVzaChxYVswXSxxYVsxXSxxYVsyXSk6KHFhPXNhLmNvbG9yLHRoaXMuY29sb3JzLnB1c2gocWEscWEscWEpKTshMD09PXUmJihxYT1tWzBdW0pdLHZvaWQgMCE9PXFhP3RoaXMudXZzLnB1c2gocWFbMF0scWFbMV0scWFbMl0pOihjb25zb2xlLndhcm4oIlRIUkVFLkRpcmVjdEdlb21ldHJ5LmZyb21HZW9tZXRyeSgpOiBVbmRlZmluZWQgdmVydGV4VXYgIixKKSx0aGlzLnV2cy5wdXNoKG5ldyBkLG5ldyBkLG5ldyBkKSkpOyEwPT09dyYmKHFhPW1bMV1bSl0sdm9pZCAwIT09cWE/dGhpcy51dnMyLnB1c2gocWFbMF0sCnFhWzFdLHFhWzJdKTooY29uc29sZS53YXJuKCJUSFJFRS5EaXJlY3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2MiAiLEopLHRoaXMudXZzMi5wdXNoKG5ldyBkLG5ldyBkLG5ldyBkKSkpO2ZvcihxYT0wO3FhPEU7cWErKyl7dmFyIHJhPUFbcWFdLnZlcnRpY2VzO0dbcWFdLmRhdGEucHVzaChyYVtzYS5hXSxyYVtzYS5iXSxyYVtzYS5jXSl9Zm9yKHFhPTA7cWE8UztxYSsrKXJhPVFbcWFdLnZlcnRleE5vcm1hbHNbSl0sVFtxYV0uZGF0YS5wdXNoKHJhLmEscmEuYixyYS5jKTtpYSYmdGhpcy5za2luSW5kaWNlcy5wdXNoKFdbc2EuYV0sV1tzYS5iXSxXW3NhLmNdKTtoYSYmdGhpcy5za2luV2VpZ2h0cy5wdXNoKFhbc2EuYV0sWFtzYS5iXSxYW3NhLmNdKX10aGlzLmNvbXB1dGVHcm91cHMoYik7dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGU9Yi52ZXJ0aWNlc05lZWRVcGRhdGU7dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZT1iLm5vcm1hbHNOZWVkVXBkYXRlOwp0aGlzLmNvbG9yc05lZWRVcGRhdGU9Yi5jb2xvcnNOZWVkVXBkYXRlO3RoaXMudXZzTmVlZFVwZGF0ZT1iLnV2c05lZWRVcGRhdGU7dGhpcy5ncm91cHNOZWVkVXBkYXRlPWIuZ3JvdXBzTmVlZFVwZGF0ZTtudWxsIT09Yi5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9Yi5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpKTtudWxsIT09Yi5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9Yi5ib3VuZGluZ0JveC5jbG9uZSgpKTtyZXR1cm4gdGhpc319KTt2YXIgTXE9MSxGZD1uZXcgcixpbD1uZXcgeSxraj1uZXcgZyxlZj1uZXcgeCxqbD1uZXcgeCxsZD1uZXcgZzt4YS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6eGEsaXNCdWZmZXJHZW9tZXRyeTohMCxnZXRJbmRleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluZGV4fSxzZXRJbmRleDpmdW5jdGlvbihiKXt0aGlzLmluZGV4PUFycmF5LmlzQXJyYXkoYik/Cm5ldyAoNjU1MzU8RmEoYik/ZmE6YWEpKGIsMSk6Yn0sYWRkQXR0cmlidXRlOmZ1bmN0aW9uKGIsZSxoKXtpZighKGUmJmUuaXNCdWZmZXJBdHRyaWJ1dGV8fGUmJmUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSkpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRBdHRyaWJ1dGUoKSBub3cgZXhwZWN0cyAoIG5hbWUsIGF0dHJpYnV0ZSApLiIpLHRoaXMuYWRkQXR0cmlidXRlKGIsbmV3IFIoZSxoKSk7aWYoImluZGV4Ij09PWIpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnkuYWRkQXR0cmlidXRlOiBVc2UgLnNldEluZGV4KCkgZm9yIGluZGV4IGF0dHJpYnV0ZS4iKSx0aGlzLnNldEluZGV4KGUpLHRoaXM7dGhpcy5hdHRyaWJ1dGVzW2JdPWU7cmV0dXJuIHRoaXN9LGdldEF0dHJpYnV0ZTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW2JdfSxyZW1vdmVBdHRyaWJ1dGU6ZnVuY3Rpb24oYil7ZGVsZXRlIHRoaXMuYXR0cmlidXRlc1tiXTsKcmV0dXJuIHRoaXN9LGFkZEdyb3VwOmZ1bmN0aW9uKGIsZSxoKXt0aGlzLmdyb3Vwcy5wdXNoKHtzdGFydDpiLGNvdW50OmUsbWF0ZXJpYWxJbmRleDp2b2lkIDAhPT1oP2g6MH0pfSxjbGVhckdyb3VwczpmdW5jdGlvbigpe3RoaXMuZ3JvdXBzPVtdfSxzZXREcmF3UmFuZ2U6ZnVuY3Rpb24oYixlKXt0aGlzLmRyYXdSYW5nZS5zdGFydD1iO3RoaXMuZHJhd1JhbmdlLmNvdW50PWV9LGFwcGx5TWF0cml4OmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjt2b2lkIDAhPT1lJiYoYi5hcHBseVRvQnVmZmVyQXR0cmlidXRlKGUpLGUubmVlZHNVcGRhdGU9ITApO3ZhciBoPXRoaXMuYXR0cmlidXRlcy5ub3JtYWw7dm9pZCAwIT09aCYmKGU9KG5ldyBsKS5nZXROb3JtYWxNYXRyaXgoYiksZS5hcHBseVRvQnVmZmVyQXR0cmlidXRlKGgpLGgubmVlZHNVcGRhdGU9ITApO2g9dGhpcy5hdHRyaWJ1dGVzLnRhbmdlbnQ7dm9pZCAwIT09aCYmKGU9KG5ldyBsKS5nZXROb3JtYWxNYXRyaXgoYiksCmUuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZShoKSxoLm5lZWRzVXBkYXRlPSEwKTtudWxsIT09dGhpcy5ib3VuZGluZ0JveCYmdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtudWxsIT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtyZXR1cm4gdGhpc30scm90YXRlWDpmdW5jdGlvbihiKXtGZC5tYWtlUm90YXRpb25YKGIpO3RoaXMuYXBwbHlNYXRyaXgoRmQpO3JldHVybiB0aGlzfSxyb3RhdGVZOmZ1bmN0aW9uKGIpe0ZkLm1ha2VSb3RhdGlvblkoYik7dGhpcy5hcHBseU1hdHJpeChGZCk7cmV0dXJuIHRoaXN9LHJvdGF0ZVo6ZnVuY3Rpb24oYil7RmQubWFrZVJvdGF0aW9uWihiKTt0aGlzLmFwcGx5TWF0cml4KEZkKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGIsZSxoKXtGZC5tYWtlVHJhbnNsYXRpb24oYixlLGgpO3RoaXMuYXBwbHlNYXRyaXgoRmQpO3JldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihiLGUsaCl7RmQubWFrZVNjYWxlKGIsCmUsaCk7dGhpcy5hcHBseU1hdHJpeChGZCk7cmV0dXJuIHRoaXN9LGxvb2tBdDpmdW5jdGlvbihiKXtpbC5sb29rQXQoYik7aWwudXBkYXRlTWF0cml4KCk7dGhpcy5hcHBseU1hdHJpeChpbC5tYXRyaXgpO3JldHVybiB0aGlzfSxjZW50ZXI6ZnVuY3Rpb24oKXt0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO3RoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKGtqKS5uZWdhdGUoKTt0aGlzLnRyYW5zbGF0ZShrai54LGtqLnksa2oueik7cmV0dXJuIHRoaXN9LHNldEZyb21PYmplY3Q6ZnVuY3Rpb24oYil7dmFyIGU9Yi5nZW9tZXRyeTtpZihiLmlzUG9pbnRzfHxiLmlzTGluZSl7Yj1uZXcgZGEoMyplLnZlcnRpY2VzLmxlbmd0aCwzKTt2YXIgaD1uZXcgZGEoMyplLmNvbG9ycy5sZW5ndGgsMyk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixiLmNvcHlWZWN0b3Izc0FycmF5KGUudmVydGljZXMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgiY29sb3IiLGguY29weUNvbG9yc0FycmF5KGUuY29sb3JzKSk7CmUubGluZURpc3RhbmNlcyYmZS5saW5lRGlzdGFuY2VzLmxlbmd0aD09PWUudmVydGljZXMubGVuZ3RoJiYoYj1uZXcgZGEoZS5saW5lRGlzdGFuY2VzLmxlbmd0aCwxKSx0aGlzLmFkZEF0dHJpYnV0ZSgibGluZURpc3RhbmNlIixiLmNvcHlBcnJheShlLmxpbmVEaXN0YW5jZXMpKSk7bnVsbCE9PWUuYm91bmRpbmdTcGhlcmUmJih0aGlzLmJvdW5kaW5nU3BoZXJlPWUuYm91bmRpbmdTcGhlcmUuY2xvbmUoKSk7bnVsbCE9PWUuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PWUuYm91bmRpbmdCb3guY2xvbmUoKSl9ZWxzZSBiLmlzTWVzaCYmZSYmZS5pc0dlb21ldHJ5JiZ0aGlzLmZyb21HZW9tZXRyeShlKTtyZXR1cm4gdGhpc30sc2V0RnJvbVBvaW50czpmdW5jdGlvbihiKXtmb3IodmFyIGU9W10saD0wLG09Yi5sZW5ndGg7aDxtO2grKyl7dmFyIHU9YltoXTtlLnB1c2godS54LHUueSx1Lnp8fDApfXRoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGRhKGUsMykpOwpyZXR1cm4gdGhpc30sdXBkYXRlRnJvbU9iamVjdDpmdW5jdGlvbihiKXt2YXIgZT1iLmdlb21ldHJ5O2lmKGIuaXNNZXNoKXt2YXIgaD1lLl9fZGlyZWN0R2VvbWV0cnk7ITA9PT1lLmVsZW1lbnRzTmVlZFVwZGF0ZSYmKGg9dm9pZCAwLGUuZWxlbWVudHNOZWVkVXBkYXRlPSExKTtpZih2b2lkIDA9PT1oKXJldHVybiB0aGlzLmZyb21HZW9tZXRyeShlKTtoLnZlcnRpY2VzTmVlZFVwZGF0ZT1lLnZlcnRpY2VzTmVlZFVwZGF0ZTtoLm5vcm1hbHNOZWVkVXBkYXRlPWUubm9ybWFsc05lZWRVcGRhdGU7aC5jb2xvcnNOZWVkVXBkYXRlPWUuY29sb3JzTmVlZFVwZGF0ZTtoLnV2c05lZWRVcGRhdGU9ZS51dnNOZWVkVXBkYXRlO2guZ3JvdXBzTmVlZFVwZGF0ZT1lLmdyb3Vwc05lZWRVcGRhdGU7ZS52ZXJ0aWNlc05lZWRVcGRhdGU9ITE7ZS5ub3JtYWxzTmVlZFVwZGF0ZT0hMTtlLmNvbG9yc05lZWRVcGRhdGU9ITE7ZS51dnNOZWVkVXBkYXRlPSExO2UuZ3JvdXBzTmVlZFVwZGF0ZT0hMTsKZT1ofSEwPT09ZS52ZXJ0aWNlc05lZWRVcGRhdGUmJihoPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbix2b2lkIDAhPT1oJiYoaC5jb3B5VmVjdG9yM3NBcnJheShlLnZlcnRpY2VzKSxoLm5lZWRzVXBkYXRlPSEwKSxlLnZlcnRpY2VzTmVlZFVwZGF0ZT0hMSk7ITA9PT1lLm5vcm1hbHNOZWVkVXBkYXRlJiYoaD10aGlzLmF0dHJpYnV0ZXMubm9ybWFsLHZvaWQgMCE9PWgmJihoLmNvcHlWZWN0b3Izc0FycmF5KGUubm9ybWFscyksaC5uZWVkc1VwZGF0ZT0hMCksZS5ub3JtYWxzTmVlZFVwZGF0ZT0hMSk7ITA9PT1lLmNvbG9yc05lZWRVcGRhdGUmJihoPXRoaXMuYXR0cmlidXRlcy5jb2xvcix2b2lkIDAhPT1oJiYoaC5jb3B5Q29sb3JzQXJyYXkoZS5jb2xvcnMpLGgubmVlZHNVcGRhdGU9ITApLGUuY29sb3JzTmVlZFVwZGF0ZT0hMSk7ZS51dnNOZWVkVXBkYXRlJiYoaD10aGlzLmF0dHJpYnV0ZXMudXYsdm9pZCAwIT09aCYmKGguY29weVZlY3RvcjJzQXJyYXkoZS51dnMpLGgubmVlZHNVcGRhdGU9CiEwKSxlLnV2c05lZWRVcGRhdGU9ITEpO2UubGluZURpc3RhbmNlc05lZWRVcGRhdGUmJihoPXRoaXMuYXR0cmlidXRlcy5saW5lRGlzdGFuY2Usdm9pZCAwIT09aCYmKGguY29weUFycmF5KGUubGluZURpc3RhbmNlcyksaC5uZWVkc1VwZGF0ZT0hMCksZS5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZT0hMSk7ZS5ncm91cHNOZWVkVXBkYXRlJiYoZS5jb21wdXRlR3JvdXBzKGIuZ2VvbWV0cnkpLHRoaXMuZ3JvdXBzPWUuZ3JvdXBzLGUuZ3JvdXBzTmVlZFVwZGF0ZT0hMSk7cmV0dXJuIHRoaXN9LGZyb21HZW9tZXRyeTpmdW5jdGlvbihiKXtiLl9fZGlyZWN0R2VvbWV0cnk9KG5ldyBaKS5mcm9tR2VvbWV0cnkoYik7cmV0dXJuIHRoaXMuZnJvbURpcmVjdEdlb21ldHJ5KGIuX19kaXJlY3RHZW9tZXRyeSl9LGZyb21EaXJlY3RHZW9tZXRyeTpmdW5jdGlvbihiKXt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLChuZXcgUihuZXcgRmxvYXQzMkFycmF5KDMqYi52ZXJ0aWNlcy5sZW5ndGgpLAozKSkuY29weVZlY3RvcjNzQXJyYXkoYi52ZXJ0aWNlcykpOzA8Yi5ub3JtYWxzLmxlbmd0aCYmdGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsKG5ldyBSKG5ldyBGbG9hdDMyQXJyYXkoMypiLm5vcm1hbHMubGVuZ3RoKSwzKSkuY29weVZlY3RvcjNzQXJyYXkoYi5ub3JtYWxzKSk7MDxiLmNvbG9ycy5sZW5ndGgmJnRoaXMuYWRkQXR0cmlidXRlKCJjb2xvciIsKG5ldyBSKG5ldyBGbG9hdDMyQXJyYXkoMypiLmNvbG9ycy5sZW5ndGgpLDMpKS5jb3B5Q29sb3JzQXJyYXkoYi5jb2xvcnMpKTswPGIudXZzLmxlbmd0aCYmdGhpcy5hZGRBdHRyaWJ1dGUoInV2IiwobmV3IFIobmV3IEZsb2F0MzJBcnJheSgyKmIudXZzLmxlbmd0aCksMikpLmNvcHlWZWN0b3Iyc0FycmF5KGIudXZzKSk7MDxiLnV2czIubGVuZ3RoJiZ0aGlzLmFkZEF0dHJpYnV0ZSgidXYyIiwobmV3IFIobmV3IEZsb2F0MzJBcnJheSgyKmIudXZzMi5sZW5ndGgpLDIpKS5jb3B5VmVjdG9yMnNBcnJheShiLnV2czIpKTsKdGhpcy5ncm91cHM9Yi5ncm91cHM7Zm9yKHZhciBlIGluIGIubW9ycGhUYXJnZXRzKXtmb3IodmFyIGg9W10sbT1iLm1vcnBoVGFyZ2V0c1tlXSx1PTAsdz1tLmxlbmd0aDt1PHc7dSsrKXt2YXIgQT1tW3VdLEU9bmV3IGRhKDMqQS5kYXRhLmxlbmd0aCwzKTtFLm5hbWU9QS5uYW1lO2gucHVzaChFLmNvcHlWZWN0b3Izc0FycmF5KEEuZGF0YSkpfXRoaXMubW9ycGhBdHRyaWJ1dGVzW2VdPWh9MDxiLnNraW5JbmRpY2VzLmxlbmd0aCYmKGU9bmV3IGRhKDQqYi5za2luSW5kaWNlcy5sZW5ndGgsNCksdGhpcy5hZGRBdHRyaWJ1dGUoInNraW5JbmRleCIsZS5jb3B5VmVjdG9yNHNBcnJheShiLnNraW5JbmRpY2VzKSkpOzA8Yi5za2luV2VpZ2h0cy5sZW5ndGgmJihlPW5ldyBkYSg0KmIuc2tpbldlaWdodHMubGVuZ3RoLDQpLHRoaXMuYWRkQXR0cmlidXRlKCJza2luV2VpZ2h0IixlLmNvcHlWZWN0b3I0c0FycmF5KGIuc2tpbldlaWdodHMpKSk7bnVsbCE9PWIuYm91bmRpbmdTcGhlcmUmJgoodGhpcy5ib3VuZGluZ1NwaGVyZT1iLmJvdW5kaW5nU3BoZXJlLmNsb25lKCkpO251bGwhPT1iLmJvdW5kaW5nQm94JiYodGhpcy5ib3VuZGluZ0JveD1iLmJvdW5kaW5nQm94LmNsb25lKCkpO3JldHVybiB0aGlzfSxjb21wdXRlQm91bmRpbmdCb3g6ZnVuY3Rpb24oKXtudWxsPT09dGhpcy5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IHgpO3ZhciBiPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbixlPXRoaXMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKHZvaWQgMCE9PWIpe2lmKHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShiKSxlKXtiPTA7Zm9yKHZhciBoPWUubGVuZ3RoO2I8aDtiKyspZWYuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShlW2JdKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoZWYubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoZWYubWF4KX19ZWxzZSB0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpOwooaXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueCl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnkpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi56KSkmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveDogQ29tcHV0ZWQgbWluL21heCBoYXZlIE5hTiB2YWx1ZXMuIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsdGhpcyl9LGNvbXB1dGVCb3VuZGluZ1NwaGVyZTpmdW5jdGlvbigpe251bGw9PT10aGlzLmJvdW5kaW5nU3BoZXJlJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1uZXcgRik7dmFyIGI9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYoYil7dmFyIGg9dGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7ZWYuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShiKTtpZihlKWZvcih2YXIgbT0wLHU9ZS5sZW5ndGg7bTx1O20rKyl7dmFyIHc9CmVbbV07amwuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSh3KTtlZi5leHBhbmRCeVBvaW50KGpsLm1pbik7ZWYuZXhwYW5kQnlQb2ludChqbC5tYXgpfWVmLmdldENlbnRlcihoKTt2YXIgQT0wO209MDtmb3IodT1iLmNvdW50O208dTttKyspbGQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShiLG0pLEE9TWF0aC5tYXgoQSxoLmRpc3RhbmNlVG9TcXVhcmVkKGxkKSk7aWYoZSlmb3IobT0wLHU9ZS5sZW5ndGg7bTx1O20rKyl7dz1lW21dO2I9MDtmb3IodmFyIEU9dy5jb3VudDtiPEU7YisrKWxkLmZyb21CdWZmZXJBdHRyaWJ1dGUodyxiKSxBPU1hdGgubWF4KEEsaC5kaXN0YW5jZVRvU3F1YXJlZChsZCkpfXRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzPU1hdGguc3FydChBKTtpc05hTih0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cykmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBDb21wdXRlZCByYWRpdXMgaXMgTmFOLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLAp0aGlzKX19LGNvbXB1dGVGYWNlTm9ybWFsczpmdW5jdGlvbigpe30sY29tcHV0ZVZlcnRleE5vcm1hbHM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmluZGV4LGU9dGhpcy5hdHRyaWJ1dGVzO2lmKGUucG9zaXRpb24pe3ZhciBoPWUucG9zaXRpb24uYXJyYXk7aWYodm9pZCAwPT09ZS5ub3JtYWwpdGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFIobmV3IEZsb2F0MzJBcnJheShoLmxlbmd0aCksMykpO2Vsc2UgZm9yKHZhciBtPWUubm9ybWFsLmFycmF5LHU9MCx3PW0ubGVuZ3RoO3U8dzt1KyspbVt1XT0wO209ZS5ub3JtYWwuYXJyYXk7dmFyIEE9bmV3IGcsRT1uZXcgZyxHPW5ldyBnLEo9bmV3IGcsUT1uZXcgZztpZihiKXt2YXIgUz1iLmFycmF5O3U9MDtmb3Iodz1iLmNvdW50O3U8dzt1Kz0zKXtiPTMqU1t1KzBdO3ZhciBUPTMqU1t1KzFdO3ZhciBXPTMqU1t1KzJdO0EuZnJvbUFycmF5KGgsYik7RS5mcm9tQXJyYXkoaCxUKTtHLmZyb21BcnJheShoLFcpO0ouc3ViVmVjdG9ycyhHLApFKTtRLnN1YlZlY3RvcnMoQSxFKTtKLmNyb3NzKFEpO21bYl0rPUoueDttW2IrMV0rPUoueTttW2IrMl0rPUouejttW1RdKz1KLng7bVtUKzFdKz1KLnk7bVtUKzJdKz1KLno7bVtXXSs9Si54O21bVysxXSs9Si55O21bVysyXSs9Si56fX1lbHNlIGZvcih1PTAsdz1oLmxlbmd0aDt1PHc7dSs9OSlBLmZyb21BcnJheShoLHUpLEUuZnJvbUFycmF5KGgsdSszKSxHLmZyb21BcnJheShoLHUrNiksSi5zdWJWZWN0b3JzKEcsRSksUS5zdWJWZWN0b3JzKEEsRSksSi5jcm9zcyhRKSxtW3VdPUoueCxtW3UrMV09Si55LG1bdSsyXT1KLnosbVt1KzNdPUoueCxtW3UrNF09Si55LG1bdSs1XT1KLnosbVt1KzZdPUoueCxtW3UrN109Si55LG1bdSs4XT1KLno7dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7ZS5ub3JtYWwubmVlZHNVcGRhdGU9ITB9fSxtZXJnZTpmdW5jdGlvbihiLGUpe2lmKGImJmIuaXNCdWZmZXJHZW9tZXRyeSl7dm9pZCAwPT09ZSYmKGU9MCxjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IE92ZXJ3cml0aW5nIG9yaWdpbmFsIGdlb21ldHJ5LCBzdGFydGluZyBhdCBvZmZzZXRceDNkMC4gVXNlIEJ1ZmZlckdlb21ldHJ5VXRpbHMubWVyZ2VCdWZmZXJHZW9tZXRyaWVzKCkgZm9yIGxvc3NsZXNzIG1lcmdlLiIpKTsKdmFyIGg9dGhpcy5hdHRyaWJ1dGVzLG07Zm9yKG0gaW4gaClpZih2b2lkIDAhPT1iLmF0dHJpYnV0ZXNbbV0pe3ZhciB1PWhbbV0uYXJyYXksdz1iLmF0dHJpYnV0ZXNbbV0sQT13LmFycmF5LEU9dy5pdGVtU2l6ZSplO3c9TWF0aC5taW4oQS5sZW5ndGgsdS5sZW5ndGgtRSk7Zm9yKHZhciBHPTA7Rzx3O0crKyxFKyspdVtFXT1BW0ddfXJldHVybiB0aGlzfWNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IGdlb21ldHJ5IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5CdWZmZXJHZW9tZXRyeS4iLGIpfSxub3JtYWxpemVOb3JtYWxzOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuYXR0cmlidXRlcy5ub3JtYWwsZT0wLGg9Yi5jb3VudDtlPGg7ZSsrKWxkLng9Yi5nZXRYKGUpLGxkLnk9Yi5nZXRZKGUpLGxkLno9Yi5nZXRaKGUpLGxkLm5vcm1hbGl6ZSgpLGIuc2V0WFlaKGUsbGQueCxsZC55LGxkLnopfSx0b05vbkluZGV4ZWQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKFEsClMpe3ZhciBUPVEuYXJyYXk7UT1RLml0ZW1TaXplO2Zvcih2YXIgVz1uZXcgVC5jb25zdHJ1Y3RvcihTLmxlbmd0aCpRKSxYLGlhPTAsaGE9MCxzYT1TLmxlbmd0aDtoYTxzYTtoYSsrKXtYPVNbaGFdKlE7Zm9yKHZhciBxYT0wO3FhPFE7cWErKylXW2lhKytdPVRbWCsrXX1yZXR1cm4gbmV3IFIoVyxRKX1pZihudWxsPT09dGhpcy5pbmRleClyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTogR2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4iKSx0aGlzO3ZhciBlPW5ldyB4YSxoPXRoaXMuaW5kZXguYXJyYXksbT10aGlzLmF0dHJpYnV0ZXMsdTtmb3IodSBpbiBtKXt2YXIgdz1tW3VdO3c9Yih3LGgpO2UuYWRkQXR0cmlidXRlKHUsdyl9dmFyIEE9dGhpcy5tb3JwaEF0dHJpYnV0ZXM7Zm9yKHUgaW4gQSl7dmFyIEU9W10sRz1BW3VdO209MDtmb3IodmFyIEo9Ry5sZW5ndGg7bTxKO20rKyl3PUdbbV0sdz1iKHcsaCksRS5wdXNoKHcpOwplLm1vcnBoQXR0cmlidXRlc1t1XT1FfWg9dGhpcy5ncm91cHM7bT0wO2Zvcih1PWgubGVuZ3RoO208dTttKyspdz1oW21dLGUuYWRkR3JvdXAody5zdGFydCx3LmNvdW50LHcubWF0ZXJpYWxJbmRleCk7cmV0dXJuIGV9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBiPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiQnVmZmVyR2VvbWV0cnkiLGdlbmVyYXRvcjoiQnVmZmVyR2VvbWV0cnkudG9KU09OIn19O2IudXVpZD10aGlzLnV1aWQ7Yi50eXBlPXRoaXMudHlwZTsiIiE9PXRoaXMubmFtZSYmKGIubmFtZT10aGlzLm5hbWUpOzA8T2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoJiYoYi51c2VyRGF0YT10aGlzLnVzZXJEYXRhKTtpZih2b2lkIDAhPT10aGlzLnBhcmFtZXRlcnMpe3ZhciBlPXRoaXMucGFyYW1ldGVycztmb3IoSiBpbiBlKXZvaWQgMCE9PWVbSl0mJihiW0pdPWVbSl0pO3JldHVybiBifWIuZGF0YT17YXR0cmlidXRlczp7fX07ZT10aGlzLmluZGV4O251bGwhPT0KZSYmKGIuZGF0YS5pbmRleD17dHlwZTplLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5hcnJheSl9KTt2YXIgaD10aGlzLmF0dHJpYnV0ZXM7Zm9yKEogaW4gaCl7ZT1oW0pdO3ZhciBtPWUudG9KU09OKCk7IiIhPT1lLm5hbWUmJihtLm5hbWU9ZS5uYW1lKTtiLmRhdGEuYXR0cmlidXRlc1tKXT1tfWg9e307dmFyIHU9ITE7Zm9yKEogaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMpe2Zvcih2YXIgdz10aGlzLm1vcnBoQXR0cmlidXRlc1tKXSxBPVtdLEU9MCxHPXcubGVuZ3RoO0U8RztFKyspZT13W0VdLG09ZS50b0pTT04oKSwiIiE9PWUubmFtZSYmKG0ubmFtZT1lLm5hbWUpLEEucHVzaChtKTswPEEubGVuZ3RoJiYoaFtKXT1BLHU9ITApfXUmJihiLmRhdGEubW9ycGhBdHRyaWJ1dGVzPWgpO3ZhciBKPXRoaXMuZ3JvdXBzOzA8Si5sZW5ndGgmJihiLmRhdGEuZ3JvdXBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoSikpKTtKPQp0aGlzLmJvdW5kaW5nU3BoZXJlO251bGwhPT1KJiYoYi5kYXRhLmJvdW5kaW5nU3BoZXJlPXtjZW50ZXI6Si5jZW50ZXIudG9BcnJheSgpLHJhZGl1czpKLnJhZGl1c30pO3JldHVybiBifSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgeGEpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7dmFyIGU7dGhpcy5pbmRleD1udWxsO3RoaXMuYXR0cmlidXRlcz17fTt0aGlzLm1vcnBoQXR0cmlidXRlcz17fTt0aGlzLmdyb3Vwcz1bXTt0aGlzLmJvdW5kaW5nU3BoZXJlPXRoaXMuYm91bmRpbmdCb3g9bnVsbDt0aGlzLm5hbWU9Yi5uYW1lO3ZhciBoPWIuaW5kZXg7bnVsbCE9PWgmJnRoaXMuc2V0SW5kZXgoaC5jbG9uZSgpKTtoPWIuYXR0cmlidXRlcztmb3IoQSBpbiBoKXRoaXMuYWRkQXR0cmlidXRlKEEsaFtBXS5jbG9uZSgpKTt2YXIgbT1iLm1vcnBoQXR0cmlidXRlcztmb3IoQSBpbiBtKXt2YXIgdT1bXSx3PW1bQV07aD0wO2ZvcihlPXcubGVuZ3RoO2g8ZTtoKyspdS5wdXNoKHdbaF0uY2xvbmUoKSk7CnRoaXMubW9ycGhBdHRyaWJ1dGVzW0FdPXV9dmFyIEE9Yi5ncm91cHM7aD0wO2ZvcihlPUEubGVuZ3RoO2g8ZTtoKyspbT1BW2hdLHRoaXMuYWRkR3JvdXAobS5zdGFydCxtLmNvdW50LG0ubWF0ZXJpYWxJbmRleCk7QT1iLmJvdW5kaW5nQm94O251bGwhPT1BJiYodGhpcy5ib3VuZGluZ0JveD1BLmNsb25lKCkpO0E9Yi5ib3VuZGluZ1NwaGVyZTtudWxsIT09QSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9QS5jbG9uZSgpKTt0aGlzLmRyYXdSYW5nZS5zdGFydD1iLmRyYXdSYW5nZS5zdGFydDt0aGlzLmRyYXdSYW5nZS5jb3VudD1iLmRyYXdSYW5nZS5jb3VudDt0aGlzLnVzZXJEYXRhPWIudXNlckRhdGE7cmV0dXJuIHRoaXN9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fSk7dmFyIHNvPW5ldyByLGZmPW5ldyBELGtsPW5ldyBGLEplPW5ldyBnLEtlPW5ldyBnLExlPW5ldyBnLGhuPW5ldyBnLGpuPW5ldyBnLGtuPW5ldyBnLGxrPQpuZXcgZyxtaz1uZXcgZyxuaz1uZXcgZyx6Zj1uZXcgZCxBZj1uZXcgZCxCZj1uZXcgZCxZZz1uZXcgZyxwaT1uZXcgZzt5YS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHkucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6eWEsaXNNZXNoOiEwLHNldERyYXdNb2RlOmZ1bmN0aW9uKGIpe3RoaXMuZHJhd01vZGU9Yn0sY29weTpmdW5jdGlvbihiKXt5LnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLmRyYXdNb2RlPWIuZHJhd01vZGU7dm9pZCAwIT09Yi5tb3JwaFRhcmdldEluZmx1ZW5jZXMmJih0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1iLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5zbGljZSgpKTt2b2lkIDAhPT1iLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSYmKHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PU9iamVjdC5hc3NpZ24oe30sYi5tb3JwaFRhcmdldERpY3Rpb25hcnkpKTtyZXR1cm4gdGhpc30sdXBkYXRlTW9ycGhUYXJnZXRzOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2VvbWV0cnk7aWYoYi5pc0J1ZmZlckdlb21ldHJ5KXtiPWIubW9ycGhBdHRyaWJ1dGVzO3ZhciBlPU9iamVjdC5rZXlzKGIpO2lmKDA8ZS5sZW5ndGgpe3ZhciBoPWJbZVswXV07aWYodm9pZCAwIT09aClmb3IodGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9W10sdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9e30sYj0wLGU9aC5sZW5ndGg7YjxlO2IrKyl7dmFyIG09aFtiXS5uYW1lfHxTdHJpbmcoYik7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCgwKTt0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVttXT1ifX19ZWxzZSBiPWIubW9ycGhUYXJnZXRzLHZvaWQgMCE9PWImJjA8Yi5sZW5ndGgmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1lc2gudXBkYXRlTW9ycGhUYXJnZXRzKCkgbm8gbG9uZ2VyIHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKX0scmF5Y2FzdDpmdW5jdGlvbihiLGUpe3ZhciBoPXRoaXMuZ2VvbWV0cnksCm09dGhpcy5tYXRlcmlhbCx1PXRoaXMubWF0cml4V29ybGQ7aWYodm9pZCAwIT09bSYmKG51bGw9PT1oLmJvdW5kaW5nU3BoZXJlJiZoLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLGtsLmNvcHkoaC5ib3VuZGluZ1NwaGVyZSksa2wuYXBwbHlNYXRyaXg0KHUpLCExIT09Yi5yYXkuaW50ZXJzZWN0c1NwaGVyZShrbCkmJihzby5nZXRJbnZlcnNlKHUpLGZmLmNvcHkoYi5yYXkpLmFwcGx5TWF0cml4NChzbyksbnVsbD09PWguYm91bmRpbmdCb3h8fCExIT09ZmYuaW50ZXJzZWN0c0JveChoLmJvdW5kaW5nQm94KSkpKWlmKGguaXNCdWZmZXJHZW9tZXRyeSl7dmFyIHc9aC5pbmRleDt1PWguYXR0cmlidXRlcy5wb3NpdGlvbjt2YXIgQT1oLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixFPWguYXR0cmlidXRlcy51dixHPWguYXR0cmlidXRlcy51djIsSj1oLmdyb3VwcyxRPWguZHJhd1JhbmdlLFMsVDtpZihudWxsIT09dylpZihBcnJheS5pc0FycmF5KG0pKXt2YXIgVz0wO2ZvcihTPUoubGVuZ3RoO1c8ClM7VysrKXt2YXIgWD1KW1ddO3ZhciBpYT1tW1gubWF0ZXJpYWxJbmRleF07dmFyIGhhPU1hdGgubWF4KFguc3RhcnQsUS5zdGFydCk7Zm9yKFQ9aD1NYXRoLm1pbihYLnN0YXJ0K1guY291bnQsUS5zdGFydCtRLmNvdW50KTtoYTxUO2hhKz0zKXtoPXcuZ2V0WChoYSk7dmFyIHNhPXcuZ2V0WChoYSsxKTt2YXIgcWE9dy5nZXRYKGhhKzIpO2lmKGg9R2EodGhpcyxpYSxiLGZmLHUsQSxFLEcsaCxzYSxxYSkpaC5mYWNlSW5kZXg9TWF0aC5mbG9vcihoYS8zKSxoLmZhY2UubWF0ZXJpYWxJbmRleD1YLm1hdGVyaWFsSW5kZXgsZS5wdXNoKGgpfX19ZWxzZSBmb3IoaGE9TWF0aC5tYXgoMCxRLnN0YXJ0KSxoPU1hdGgubWluKHcuY291bnQsUS5zdGFydCtRLmNvdW50KSxXPWhhLFM9aDtXPFM7Vys9Myl7aWYoaD13LmdldFgoVyksc2E9dy5nZXRYKFcrMSkscWE9dy5nZXRYKFcrMiksaD1HYSh0aGlzLG0sYixmZix1LEEsRSxHLGgsc2EscWEpKWguZmFjZUluZGV4PU1hdGguZmxvb3IoVy8zKSwKZS5wdXNoKGgpfWVsc2UgaWYodm9pZCAwIT09dSlpZihBcnJheS5pc0FycmF5KG0pKWZvcihXPTAsUz1KLmxlbmd0aDtXPFM7VysrKWZvcihYPUpbV10saWE9bVtYLm1hdGVyaWFsSW5kZXhdLGhhPU1hdGgubWF4KFguc3RhcnQsUS5zdGFydCksVD1oPU1hdGgubWluKFguc3RhcnQrWC5jb3VudCxRLnN0YXJ0K1EuY291bnQpO2hhPFQ7aGErPTMpe2lmKGg9aGEsc2E9aGErMSxxYT1oYSsyLGg9R2EodGhpcyxpYSxiLGZmLHUsQSxFLEcsaCxzYSxxYSkpaC5mYWNlSW5kZXg9TWF0aC5mbG9vcihoYS8zKSxoLmZhY2UubWF0ZXJpYWxJbmRleD1YLm1hdGVyaWFsSW5kZXgsZS5wdXNoKGgpfWVsc2UgZm9yKGhhPU1hdGgubWF4KDAsUS5zdGFydCksaD1NYXRoLm1pbih1LmNvdW50LFEuc3RhcnQrUS5jb3VudCksVz1oYSxTPWg7VzxTO1crPTMpaWYoaD1XLHNhPVcrMSxxYT1XKzIsaD1HYSh0aGlzLG0sYixmZix1LEEsRSxHLGgsc2EscWEpKWguZmFjZUluZGV4PU1hdGguZmxvb3IoVy8zKSxlLnB1c2goaCl9ZWxzZSBpZihoLmlzR2VvbWV0cnkpZm9yKHU9CkFycmF5LmlzQXJyYXkobSksQT1oLnZlcnRpY2VzLEU9aC5mYWNlcyxoPWguZmFjZVZlcnRleFV2c1swXSwwPGgubGVuZ3RoJiYodz1oKSxXPTAsUz1FLmxlbmd0aDtXPFM7VysrKWlmKFg9RVtXXSxoPXU/bVtYLm1hdGVyaWFsSW5kZXhdOm0sdm9pZCAwIT09aCYmKEc9QVtYLmFdLEo9QVtYLmJdLFE9QVtYLmNdLGg9QmEodGhpcyxoLGIsZmYsRyxKLFEsWWcpKSl3JiZ3W1ddJiYoaWE9d1tXXSx6Zi5jb3B5KGlhWzBdKSxBZi5jb3B5KGlhWzFdKSxCZi5jb3B5KGlhWzJdKSxoLnV2PUIuZ2V0VVYoWWcsRyxKLFEsemYsQWYsQmYsbmV3IGQpKSxoLmZhY2U9WCxoLmZhY2VJbmRleD1XLGUucHVzaChoKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5nZW9tZXRyeSx0aGlzLm1hdGVyaWFsKSkuY29weSh0aGlzKX19KTt2YXIgTnE9MCxHZD1uZXcgcixsbD1uZXcgeSxsaj1uZXcgZzt6YS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGMucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOnphLGlzR2VvbWV0cnk6ITAsYXBwbHlNYXRyaXg6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPShuZXcgbCkuZ2V0Tm9ybWFsTWF0cml4KGIpLGg9MCxtPXRoaXMudmVydGljZXMubGVuZ3RoO2g8bTtoKyspdGhpcy52ZXJ0aWNlc1toXS5hcHBseU1hdHJpeDQoYik7aD0wO2ZvcihtPXRoaXMuZmFjZXMubGVuZ3RoO2g8bTtoKyspe2I9dGhpcy5mYWNlc1toXTtiLm5vcm1hbC5hcHBseU1hdHJpeDMoZSkubm9ybWFsaXplKCk7Zm9yKHZhciB1PTAsdz1iLnZlcnRleE5vcm1hbHMubGVuZ3RoO3U8dzt1KyspYi52ZXJ0ZXhOb3JtYWxzW3VdLmFwcGx5TWF0cml4MyhlKS5ub3JtYWxpemUoKX1udWxsIT09dGhpcy5ib3VuZGluZ0JveCYmdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtudWxsIT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTt0aGlzLm5vcm1hbHNOZWVkVXBkYXRlPXRoaXMudmVydGljZXNOZWVkVXBkYXRlPSEwO3JldHVybiB0aGlzfSwKcm90YXRlWDpmdW5jdGlvbihiKXtHZC5tYWtlUm90YXRpb25YKGIpO3RoaXMuYXBwbHlNYXRyaXgoR2QpO3JldHVybiB0aGlzfSxyb3RhdGVZOmZ1bmN0aW9uKGIpe0dkLm1ha2VSb3RhdGlvblkoYik7dGhpcy5hcHBseU1hdHJpeChHZCk7cmV0dXJuIHRoaXN9LHJvdGF0ZVo6ZnVuY3Rpb24oYil7R2QubWFrZVJvdGF0aW9uWihiKTt0aGlzLmFwcGx5TWF0cml4KEdkKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGIsZSxoKXtHZC5tYWtlVHJhbnNsYXRpb24oYixlLGgpO3RoaXMuYXBwbHlNYXRyaXgoR2QpO3JldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihiLGUsaCl7R2QubWFrZVNjYWxlKGIsZSxoKTt0aGlzLmFwcGx5TWF0cml4KEdkKTtyZXR1cm4gdGhpc30sbG9va0F0OmZ1bmN0aW9uKGIpe2xsLmxvb2tBdChiKTtsbC51cGRhdGVNYXRyaXgoKTt0aGlzLmFwcGx5TWF0cml4KGxsLm1hdHJpeCk7cmV0dXJuIHRoaXN9LGZyb21CdWZmZXJHZW9tZXRyeTpmdW5jdGlvbihiKXtmdW5jdGlvbiBlKFcsClgsaWEsaGEpe3ZhciBzYT12b2lkIDA9PT1FP1tdOltoLmNvbG9yc1tXXS5jbG9uZSgpLGguY29sb3JzW1hdLmNsb25lKCksaC5jb2xvcnNbaWFdLmNsb25lKCldLHFhPXZvaWQgMD09PUE/W106WyhuZXcgZykuZnJvbUFycmF5KEEsMypXKSwobmV3IGcpLmZyb21BcnJheShBLDMqWCksKG5ldyBnKS5mcm9tQXJyYXkoQSwzKmlhKV07aGE9bmV3IEsoVyxYLGlhLHFhLHNhLGhhKTtoLmZhY2VzLnB1c2goaGEpO3ZvaWQgMCE9PUcmJmguZmFjZVZlcnRleFV2c1swXS5wdXNoKFsobmV3IGQpLmZyb21BcnJheShHLDIqVyksKG5ldyBkKS5mcm9tQXJyYXkoRywyKlgpLChuZXcgZCkuZnJvbUFycmF5KEcsMippYSldKTt2b2lkIDAhPT1KJiZoLmZhY2VWZXJ0ZXhVdnNbMV0ucHVzaChbKG5ldyBkKS5mcm9tQXJyYXkoSiwyKlcpLChuZXcgZCkuZnJvbUFycmF5KEosMipYKSwobmV3IGQpLmZyb21BcnJheShKLDIqaWEpXSl9dmFyIGg9dGhpcyxtPW51bGwhPT1iLmluZGV4P2IuaW5kZXguYXJyYXk6CnZvaWQgMCx1PWIuYXR0cmlidXRlcyx3PXUucG9zaXRpb24uYXJyYXksQT12b2lkIDAhPT11Lm5vcm1hbD91Lm5vcm1hbC5hcnJheTp2b2lkIDAsRT12b2lkIDAhPT11LmNvbG9yP3UuY29sb3IuYXJyYXk6dm9pZCAwLEc9dm9pZCAwIT09dS51dj91LnV2LmFycmF5OnZvaWQgMCxKPXZvaWQgMCE9PXUudXYyP3UudXYyLmFycmF5OnZvaWQgMDt2b2lkIDAhPT1KJiYodGhpcy5mYWNlVmVydGV4VXZzWzFdPVtdKTtmb3IodT0wO3U8dy5sZW5ndGg7dSs9MyloLnZlcnRpY2VzLnB1c2goKG5ldyBnKS5mcm9tQXJyYXkodyx1KSksdm9pZCAwIT09RSYmaC5jb2xvcnMucHVzaCgobmV3IEkpLmZyb21BcnJheShFLHUpKTt2YXIgUT1iLmdyb3VwcztpZigwPFEubGVuZ3RoKWZvcih1PTA7dTxRLmxlbmd0aDt1Kyspe3c9UVt1XTt2YXIgUz13LnN0YXJ0LFQ9Uztmb3IoUys9dy5jb3VudDtUPFM7VCs9Myl2b2lkIDAhPT1tP2UobVtUXSxtW1QrMV0sbVtUKzJdLHcubWF0ZXJpYWxJbmRleCk6ZShULApUKzEsVCsyLHcubWF0ZXJpYWxJbmRleCl9ZWxzZSBpZih2b2lkIDAhPT1tKWZvcih1PTA7dTxtLmxlbmd0aDt1Kz0zKWUobVt1XSxtW3UrMV0sbVt1KzJdKTtlbHNlIGZvcih1PTA7dTx3Lmxlbmd0aC8zO3UrPTMpZSh1LHUrMSx1KzIpO3RoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCk7bnVsbCE9PWIuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PWIuYm91bmRpbmdCb3guY2xvbmUoKSk7bnVsbCE9PWIuYm91bmRpbmdTcGhlcmUmJih0aGlzLmJvdW5kaW5nU3BoZXJlPWIuYm91bmRpbmdTcGhlcmUuY2xvbmUoKSk7cmV0dXJuIHRoaXN9LGNlbnRlcjpmdW5jdGlvbigpe3RoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7dGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIobGopLm5lZ2F0ZSgpO3RoaXMudHJhbnNsYXRlKGxqLngsbGoueSxsai56KTtyZXR1cm4gdGhpc30sbm9ybWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTt2YXIgYj10aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlciwKZT10aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cztlPTA9PT1lPzE6MS9lO3ZhciBoPW5ldyByO2guc2V0KGUsMCwwLC1lKmIueCwwLGUsMCwtZSpiLnksMCwwLGUsLWUqYi56LDAsMCwwLDEpO3RoaXMuYXBwbHlNYXRyaXgoaCk7cmV0dXJuIHRoaXN9LGNvbXB1dGVGYWNlTm9ybWFsczpmdW5jdGlvbigpe2Zvcih2YXIgYj1uZXcgZyxlPW5ldyBnLGg9MCxtPXRoaXMuZmFjZXMubGVuZ3RoO2g8bTtoKyspe3ZhciB1PXRoaXMuZmFjZXNbaF0sdz10aGlzLnZlcnRpY2VzW3UuYV0sQT10aGlzLnZlcnRpY2VzW3UuYl07Yi5zdWJWZWN0b3JzKHRoaXMudmVydGljZXNbdS5jXSxBKTtlLnN1YlZlY3RvcnModyxBKTtiLmNyb3NzKGUpO2Iubm9ybWFsaXplKCk7dS5ub3JtYWwuY29weShiKX19LGNvbXB1dGVWZXJ0ZXhOb3JtYWxzOmZ1bmN0aW9uKGIpe3ZvaWQgMD09PWImJihiPSEwKTt2YXIgZTt2YXIgaD1BcnJheSh0aGlzLnZlcnRpY2VzLmxlbmd0aCk7dmFyIG09MDtmb3IoZT10aGlzLnZlcnRpY2VzLmxlbmd0aDttPAplO20rKyloW21dPW5ldyBnO2lmKGIpe3ZhciB1PW5ldyBnLHc9bmV3IGc7Yj0wO2ZvcihtPXRoaXMuZmFjZXMubGVuZ3RoO2I8bTtiKyspe2U9dGhpcy5mYWNlc1tiXTt2YXIgQT10aGlzLnZlcnRpY2VzW2UuYV07dmFyIEU9dGhpcy52ZXJ0aWNlc1tlLmJdO3ZhciBHPXRoaXMudmVydGljZXNbZS5jXTt1LnN1YlZlY3RvcnMoRyxFKTt3LnN1YlZlY3RvcnMoQSxFKTt1LmNyb3NzKHcpO2hbZS5hXS5hZGQodSk7aFtlLmJdLmFkZCh1KTtoW2UuY10uYWRkKHUpfX1lbHNlIGZvcih0aGlzLmNvbXB1dGVGYWNlTm9ybWFscygpLGI9MCxtPXRoaXMuZmFjZXMubGVuZ3RoO2I8bTtiKyspZT10aGlzLmZhY2VzW2JdLGhbZS5hXS5hZGQoZS5ub3JtYWwpLGhbZS5iXS5hZGQoZS5ub3JtYWwpLGhbZS5jXS5hZGQoZS5ub3JtYWwpO209MDtmb3IoZT10aGlzLnZlcnRpY2VzLmxlbmd0aDttPGU7bSsrKWhbbV0ubm9ybWFsaXplKCk7Yj0wO2ZvcihtPXRoaXMuZmFjZXMubGVuZ3RoO2I8bTtiKyspZT0KdGhpcy5mYWNlc1tiXSxBPWUudmVydGV4Tm9ybWFscywzPT09QS5sZW5ndGg/KEFbMF0uY29weShoW2UuYV0pLEFbMV0uY29weShoW2UuYl0pLEFbMl0uY29weShoW2UuY10pKTooQVswXT1oW2UuYV0uY2xvbmUoKSxBWzFdPWhbZS5iXS5jbG9uZSgpLEFbMl09aFtlLmNdLmNsb25lKCkpOzA8dGhpcy5mYWNlcy5sZW5ndGgmJih0aGlzLm5vcm1hbHNOZWVkVXBkYXRlPSEwKX0sY29tcHV0ZUZsYXRWZXJ0ZXhOb3JtYWxzOmZ1bmN0aW9uKCl7dmFyIGI7dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTt2YXIgZT0wO2ZvcihiPXRoaXMuZmFjZXMubGVuZ3RoO2U8YjtlKyspe3ZhciBoPXRoaXMuZmFjZXNbZV07dmFyIG09aC52ZXJ0ZXhOb3JtYWxzOzM9PT1tLmxlbmd0aD8obVswXS5jb3B5KGgubm9ybWFsKSxtWzFdLmNvcHkoaC5ub3JtYWwpLG1bMl0uY29weShoLm5vcm1hbCkpOihtWzBdPWgubm9ybWFsLmNsb25lKCksbVsxXT1oLm5vcm1hbC5jbG9uZSgpLG1bMl09aC5ub3JtYWwuY2xvbmUoKSl9MDwKdGhpcy5mYWNlcy5sZW5ndGgmJih0aGlzLm5vcm1hbHNOZWVkVXBkYXRlPSEwKX0sY29tcHV0ZU1vcnBoTm9ybWFsczpmdW5jdGlvbigpe3ZhciBiLGU7dmFyIGg9MDtmb3IoZT10aGlzLmZhY2VzLmxlbmd0aDtoPGU7aCsrKXt2YXIgbT10aGlzLmZhY2VzW2hdO20uX19vcmlnaW5hbEZhY2VOb3JtYWw/bS5fX29yaWdpbmFsRmFjZU5vcm1hbC5jb3B5KG0ubm9ybWFsKTptLl9fb3JpZ2luYWxGYWNlTm9ybWFsPW0ubm9ybWFsLmNsb25lKCk7bS5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc3x8KG0uX19vcmlnaW5hbFZlcnRleE5vcm1hbHM9W10pO3ZhciB1PTA7Zm9yKGI9bS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDt1PGI7dSsrKW0uX19vcmlnaW5hbFZlcnRleE5vcm1hbHNbdV0/bS5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1t1XS5jb3B5KG0udmVydGV4Tm9ybWFsc1t1XSk6bS5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1t1XT1tLnZlcnRleE5vcm1hbHNbdV0uY2xvbmUoKX12YXIgdz1uZXcgemE7CncuZmFjZXM9dGhpcy5mYWNlczt1PTA7Zm9yKGI9dGhpcy5tb3JwaFRhcmdldHMubGVuZ3RoO3U8Yjt1Kyspe2lmKCF0aGlzLm1vcnBoTm9ybWFsc1t1XSl7dGhpcy5tb3JwaE5vcm1hbHNbdV09e307dGhpcy5tb3JwaE5vcm1hbHNbdV0uZmFjZU5vcm1hbHM9W107dGhpcy5tb3JwaE5vcm1hbHNbdV0udmVydGV4Tm9ybWFscz1bXTttPXRoaXMubW9ycGhOb3JtYWxzW3VdLmZhY2VOb3JtYWxzO3ZhciBBPXRoaXMubW9ycGhOb3JtYWxzW3VdLnZlcnRleE5vcm1hbHM7aD0wO2ZvcihlPXRoaXMuZmFjZXMubGVuZ3RoO2g8ZTtoKyspe3ZhciBFPW5ldyBnO3ZhciBHPXthOm5ldyBnLGI6bmV3IGcsYzpuZXcgZ307bS5wdXNoKEUpO0EucHVzaChHKX19QT10aGlzLm1vcnBoTm9ybWFsc1t1XTt3LnZlcnRpY2VzPXRoaXMubW9ycGhUYXJnZXRzW3VdLnZlcnRpY2VzO3cuY29tcHV0ZUZhY2VOb3JtYWxzKCk7dy5jb21wdXRlVmVydGV4Tm9ybWFscygpO2g9MDtmb3IoZT10aGlzLmZhY2VzLmxlbmd0aDtoPAplO2grKyltPXRoaXMuZmFjZXNbaF0sRT1BLmZhY2VOb3JtYWxzW2hdLEc9QS52ZXJ0ZXhOb3JtYWxzW2hdLEUuY29weShtLm5vcm1hbCksRy5hLmNvcHkobS52ZXJ0ZXhOb3JtYWxzWzBdKSxHLmIuY29weShtLnZlcnRleE5vcm1hbHNbMV0pLEcuYy5jb3B5KG0udmVydGV4Tm9ybWFsc1syXSl9aD0wO2ZvcihlPXRoaXMuZmFjZXMubGVuZ3RoO2g8ZTtoKyspbT10aGlzLmZhY2VzW2hdLG0ubm9ybWFsPW0uX19vcmlnaW5hbEZhY2VOb3JtYWwsbS52ZXJ0ZXhOb3JtYWxzPW0uX19vcmlnaW5hbFZlcnRleE5vcm1hbHN9LGNvbXB1dGVCb3VuZGluZ0JveDpmdW5jdGlvbigpe251bGw9PT10aGlzLmJvdW5kaW5nQm94JiYodGhpcy5ib3VuZGluZ0JveD1uZXcgeCk7dGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tUG9pbnRzKHRoaXMudmVydGljZXMpfSxjb21wdXRlQm91bmRpbmdTcGhlcmU6ZnVuY3Rpb24oKXtudWxsPT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9Cm5ldyBGKTt0aGlzLmJvdW5kaW5nU3BoZXJlLnNldEZyb21Qb2ludHModGhpcy52ZXJ0aWNlcyl9LG1lcmdlOmZ1bmN0aW9uKGIsZSxoKXtpZihiJiZiLmlzR2VvbWV0cnkpe3ZhciBtLHU9dGhpcy52ZXJ0aWNlcy5sZW5ndGgsdz10aGlzLnZlcnRpY2VzLEE9Yi52ZXJ0aWNlcyxFPXRoaXMuZmFjZXMsRz1iLmZhY2VzLEo9dGhpcy5jb2xvcnMsUT1iLmNvbG9yczt2b2lkIDA9PT1oJiYoaD0wKTt2b2lkIDAhPT1lJiYobT0obmV3IGwpLmdldE5vcm1hbE1hdHJpeChlKSk7Zm9yKHZhciBTPTAsVD1BLmxlbmd0aDtTPFQ7UysrKXt2YXIgVz1BW1NdLmNsb25lKCk7dm9pZCAwIT09ZSYmVy5hcHBseU1hdHJpeDQoZSk7dy5wdXNoKFcpfVM9MDtmb3IoVD1RLmxlbmd0aDtTPFQ7UysrKUoucHVzaChRW1NdLmNsb25lKCkpO1M9MDtmb3IoVD1HLmxlbmd0aDtTPFQ7UysrKXtBPUdbU107dmFyIFg9QS52ZXJ0ZXhOb3JtYWxzO1E9QS52ZXJ0ZXhDb2xvcnM7Sj1uZXcgSyhBLmErdSxBLmIrdSxBLmMrCnUpO0oubm9ybWFsLmNvcHkoQS5ub3JtYWwpO3ZvaWQgMCE9PW0mJkoubm9ybWFsLmFwcGx5TWF0cml4MyhtKS5ub3JtYWxpemUoKTtlPTA7Zm9yKHc9WC5sZW5ndGg7ZTx3O2UrKylXPVhbZV0uY2xvbmUoKSx2b2lkIDAhPT1tJiZXLmFwcGx5TWF0cml4MyhtKS5ub3JtYWxpemUoKSxKLnZlcnRleE5vcm1hbHMucHVzaChXKTtKLmNvbG9yLmNvcHkoQS5jb2xvcik7ZT0wO2Zvcih3PVEubGVuZ3RoO2U8dztlKyspVz1RW2VdLEoudmVydGV4Q29sb3JzLnB1c2goVy5jbG9uZSgpKTtKLm1hdGVyaWFsSW5kZXg9QS5tYXRlcmlhbEluZGV4K2g7RS5wdXNoKEopfVM9MDtmb3IoVD1iLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoO1M8VDtTKyspZm9yKGg9Yi5mYWNlVmVydGV4VXZzW1NdLHZvaWQgMD09PXRoaXMuZmFjZVZlcnRleFV2c1tTXSYmKHRoaXMuZmFjZVZlcnRleFV2c1tTXT1bXSksZT0wLHc9aC5sZW5ndGg7ZTx3O2UrKyl7bT1oW2VdO3U9W107RT0wO2ZvcihHPW0ubGVuZ3RoO0U8RztFKyspdS5wdXNoKG1bRV0uY2xvbmUoKSk7CnRoaXMuZmFjZVZlcnRleFV2c1tTXS5wdXNoKHUpfX1lbHNlIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkdlb21ldHJ5Lm1lcmdlKCk6IGdlb21ldHJ5IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5HZW9tZXRyeS4iLGIpfSxtZXJnZU1lc2g6ZnVuY3Rpb24oYil7YiYmYi5pc01lc2g/KGIubWF0cml4QXV0b1VwZGF0ZSYmYi51cGRhdGVNYXRyaXgoKSx0aGlzLm1lcmdlKGIuZ2VvbWV0cnksYi5tYXRyaXgpKTpjb25zb2xlLmVycm9yKCJUSFJFRS5HZW9tZXRyeS5tZXJnZU1lc2goKTogbWVzaCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuTWVzaC4iLGIpfSxtZXJnZVZlcnRpY2VzOmZ1bmN0aW9uKCl7dmFyIGI9e30sZT1bXSxoPVtdLG09TWF0aC5wb3coMTAsNCksdTt2YXIgdz0wO2Zvcih1PXRoaXMudmVydGljZXMubGVuZ3RoO3c8dTt3Kyspe3ZhciBBPXRoaXMudmVydGljZXNbd107QT1NYXRoLnJvdW5kKEEueCptKSsiXyIrTWF0aC5yb3VuZChBLnkqbSkrIl8iK01hdGgucm91bmQoQS56KgptKTt2b2lkIDA9PT1iW0FdPyhiW0FdPXcsZS5wdXNoKHRoaXMudmVydGljZXNbd10pLGhbd109ZS5sZW5ndGgtMSk6aFt3XT1oW2JbQV1dfWI9W107dz0wO2Zvcih1PXRoaXMuZmFjZXMubGVuZ3RoO3c8dTt3KyspZm9yKG09dGhpcy5mYWNlc1t3XSxtLmE9aFttLmFdLG0uYj1oW20uYl0sbS5jPWhbbS5jXSxtPVttLmEsbS5iLG0uY10sQT0wOzM+QTtBKyspaWYobVtBXT09PW1bKEErMSklM10pe2IucHVzaCh3KTticmVha31mb3Iodz1iLmxlbmd0aC0xOzA8PXc7dy0tKWZvcihtPWJbd10sdGhpcy5mYWNlcy5zcGxpY2UobSwxKSxoPTAsdT10aGlzLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoO2g8dTtoKyspdGhpcy5mYWNlVmVydGV4VXZzW2hdLnNwbGljZShtLDEpO3c9dGhpcy52ZXJ0aWNlcy5sZW5ndGgtZS5sZW5ndGg7dGhpcy52ZXJ0aWNlcz1lO3JldHVybiB3fSxzZXRGcm9tUG9pbnRzOmZ1bmN0aW9uKGIpe3RoaXMudmVydGljZXM9W107Zm9yKHZhciBlPTAsaD1iLmxlbmd0aDtlPGg7ZSsrKXt2YXIgbT0KYltlXTt0aGlzLnZlcnRpY2VzLnB1c2gobmV3IGcobS54LG0ueSxtLnp8fDApKX1yZXR1cm4gdGhpc30sc29ydEZhY2VzQnlNYXRlcmlhbEluZGV4OmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuZmFjZXMsZT1iLmxlbmd0aCxoPTA7aDxlO2grKyliW2hdLl9pZD1oO2Iuc29ydChmdW5jdGlvbihHLEope3JldHVybiBHLm1hdGVyaWFsSW5kZXgtSi5tYXRlcmlhbEluZGV4fSk7dmFyIG09dGhpcy5mYWNlVmVydGV4VXZzWzBdLHU9dGhpcy5mYWNlVmVydGV4VXZzWzFdLHcsQTttJiZtLmxlbmd0aD09PWUmJih3PVtdKTt1JiZ1Lmxlbmd0aD09PWUmJihBPVtdKTtmb3IoaD0wO2g8ZTtoKyspe3ZhciBFPWJbaF0uX2lkO3cmJncucHVzaChtW0VdKTtBJiZBLnB1c2godVtFXSl9dyYmKHRoaXMuZmFjZVZlcnRleFV2c1swXT13KTtBJiYodGhpcy5mYWNlVmVydGV4VXZzWzFdPUEpfSx0b0pTT046ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKHBhLHZhLENhKXtyZXR1cm4gQ2E/cGF8MTw8dmE6cGEmCn4oMTw8dmEpfWZ1bmN0aW9uIGUocGEpe3ZhciB2YT1wYS54LnRvU3RyaW5nKCkrcGEueS50b1N0cmluZygpK3BhLnoudG9TdHJpbmcoKTtpZih2b2lkIDAhPT1KW3ZhXSlyZXR1cm4gSlt2YV07Slt2YV09Ry5sZW5ndGgvMztHLnB1c2gocGEueCxwYS55LHBhLnopO3JldHVybiBKW3ZhXX1mdW5jdGlvbiBoKHBhKXt2YXIgdmE9cGEuci50b1N0cmluZygpK3BhLmcudG9TdHJpbmcoKStwYS5iLnRvU3RyaW5nKCk7aWYodm9pZCAwIT09U1t2YV0pcmV0dXJuIFNbdmFdO1NbdmFdPVEubGVuZ3RoO1EucHVzaChwYS5nZXRIZXgoKSk7cmV0dXJuIFNbdmFdfWZ1bmN0aW9uIG0ocGEpe3ZhciB2YT1wYS54LnRvU3RyaW5nKCkrcGEueS50b1N0cmluZygpO2lmKHZvaWQgMCE9PVdbdmFdKXJldHVybiBXW3ZhXTtXW3ZhXT1ULmxlbmd0aC8yO1QucHVzaChwYS54LHBhLnkpO3JldHVybiBXW3ZhXX12YXIgdT17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6Ikdlb21ldHJ5IixnZW5lcmF0b3I6Ikdlb21ldHJ5LnRvSlNPTiJ9fTsKdS51dWlkPXRoaXMudXVpZDt1LnR5cGU9dGhpcy50eXBlOyIiIT09dGhpcy5uYW1lJiYodS5uYW1lPXRoaXMubmFtZSk7aWYodm9pZCAwIT09dGhpcy5wYXJhbWV0ZXJzKXt2YXIgdz10aGlzLnBhcmFtZXRlcnMsQTtmb3IoQSBpbiB3KXZvaWQgMCE9PXdbQV0mJih1W0FdPXdbQV0pO3JldHVybiB1fXc9W107Zm9yKEE9MDtBPHRoaXMudmVydGljZXMubGVuZ3RoO0ErKyl7dmFyIEU9dGhpcy52ZXJ0aWNlc1tBXTt3LnB1c2goRS54LEUueSxFLnopfUU9W107dmFyIEc9W10sSj17fSxRPVtdLFM9e30sVD1bXSxXPXt9O2ZvcihBPTA7QTx0aGlzLmZhY2VzLmxlbmd0aDtBKyspe3ZhciBYPXRoaXMuZmFjZXNbQV0saWE9dm9pZCAwIT09dGhpcy5mYWNlVmVydGV4VXZzWzBdW0FdLGhhPTA8WC5ub3JtYWwubGVuZ3RoKCksc2E9MDxYLnZlcnRleE5vcm1hbHMubGVuZ3RoLHFhPTEhPT1YLmNvbG9yLnJ8fDEhPT1YLmNvbG9yLmd8fDEhPT1YLmNvbG9yLmIscmE9MDxYLnZlcnRleENvbG9ycy5sZW5ndGgsCndhPTA7d2E9Yih3YSwwLDApO3dhPWIod2EsMSwhMCk7d2E9Yih3YSwyLCExKTt3YT1iKHdhLDMsaWEpO3dhPWIod2EsNCxoYSk7d2E9Yih3YSw1LHNhKTt3YT1iKHdhLDYscWEpO3dhPWIod2EsNyxyYSk7RS5wdXNoKHdhKTtFLnB1c2goWC5hLFguYixYLmMpO0UucHVzaChYLm1hdGVyaWFsSW5kZXgpO2lhJiYoaWE9dGhpcy5mYWNlVmVydGV4VXZzWzBdW0FdLEUucHVzaChtKGlhWzBdKSxtKGlhWzFdKSxtKGlhWzJdKSkpO2hhJiZFLnB1c2goZShYLm5vcm1hbCkpO3NhJiYoaGE9WC52ZXJ0ZXhOb3JtYWxzLEUucHVzaChlKGhhWzBdKSxlKGhhWzFdKSxlKGhhWzJdKSkpO3FhJiZFLnB1c2goaChYLmNvbG9yKSk7cmEmJihYPVgudmVydGV4Q29sb3JzLEUucHVzaChoKFhbMF0pLGgoWFsxXSksaChYWzJdKSkpfXUuZGF0YT17fTt1LmRhdGEudmVydGljZXM9dzt1LmRhdGEubm9ybWFscz1HOzA8US5sZW5ndGgmJih1LmRhdGEuY29sb3JzPVEpOzA8VC5sZW5ndGgmJih1LmRhdGEudXZzPQpbVF0pO3UuZGF0YS5mYWNlcz1FO3JldHVybiB1fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgemEpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7dmFyIGUsaCxtO3RoaXMudmVydGljZXM9W107dGhpcy5jb2xvcnM9W107dGhpcy5mYWNlcz1bXTt0aGlzLmZhY2VWZXJ0ZXhVdnM9W1tdXTt0aGlzLm1vcnBoVGFyZ2V0cz1bXTt0aGlzLm1vcnBoTm9ybWFscz1bXTt0aGlzLnNraW5XZWlnaHRzPVtdO3RoaXMuc2tpbkluZGljZXM9W107dGhpcy5saW5lRGlzdGFuY2VzPVtdO3RoaXMuYm91bmRpbmdTcGhlcmU9dGhpcy5ib3VuZGluZ0JveD1udWxsO3RoaXMubmFtZT1iLm5hbWU7dmFyIHU9Yi52ZXJ0aWNlczt2YXIgdz0wO2ZvcihlPXUubGVuZ3RoO3c8ZTt3KyspdGhpcy52ZXJ0aWNlcy5wdXNoKHVbd10uY2xvbmUoKSk7dT1iLmNvbG9yczt3PTA7Zm9yKGU9dS5sZW5ndGg7dzxlO3crKyl0aGlzLmNvbG9ycy5wdXNoKHVbd10uY2xvbmUoKSk7dT1iLmZhY2VzO3c9MDtmb3IoZT0KdS5sZW5ndGg7dzxlO3crKyl0aGlzLmZhY2VzLnB1c2godVt3XS5jbG9uZSgpKTt3PTA7Zm9yKGU9Yi5mYWNlVmVydGV4VXZzLmxlbmd0aDt3PGU7dysrKXt2YXIgQT1iLmZhY2VWZXJ0ZXhVdnNbd107dm9pZCAwPT09dGhpcy5mYWNlVmVydGV4VXZzW3ddJiYodGhpcy5mYWNlVmVydGV4VXZzW3ddPVtdKTt1PTA7Zm9yKGg9QS5sZW5ndGg7dTxoO3UrKyl7dmFyIEU9QVt1XSxHPVtdO3ZhciBKPTA7Zm9yKG09RS5sZW5ndGg7SjxtO0orKylHLnB1c2goRVtKXS5jbG9uZSgpKTt0aGlzLmZhY2VWZXJ0ZXhVdnNbd10ucHVzaChHKX19Sj1iLm1vcnBoVGFyZ2V0czt3PTA7Zm9yKGU9Si5sZW5ndGg7dzxlO3crKyl7bT17fTttLm5hbWU9Slt3XS5uYW1lO2lmKHZvaWQgMCE9PUpbd10udmVydGljZXMpZm9yKG0udmVydGljZXM9W10sdT0wLGg9Slt3XS52ZXJ0aWNlcy5sZW5ndGg7dTxoO3UrKyltLnZlcnRpY2VzLnB1c2goSlt3XS52ZXJ0aWNlc1t1XS5jbG9uZSgpKTtpZih2b2lkIDAhPT1KW3ddLm5vcm1hbHMpZm9yKG0ubm9ybWFscz0KW10sdT0wLGg9Slt3XS5ub3JtYWxzLmxlbmd0aDt1PGg7dSsrKW0ubm9ybWFscy5wdXNoKEpbd10ubm9ybWFsc1t1XS5jbG9uZSgpKTt0aGlzLm1vcnBoVGFyZ2V0cy5wdXNoKG0pfUo9Yi5tb3JwaE5vcm1hbHM7dz0wO2ZvcihlPUoubGVuZ3RoO3c8ZTt3Kyspe209e307aWYodm9pZCAwIT09Slt3XS52ZXJ0ZXhOb3JtYWxzKWZvcihtLnZlcnRleE5vcm1hbHM9W10sdT0wLGg9Slt3XS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDt1PGg7dSsrKUE9Slt3XS52ZXJ0ZXhOb3JtYWxzW3VdLEU9e30sRS5hPUEuYS5jbG9uZSgpLEUuYj1BLmIuY2xvbmUoKSxFLmM9QS5jLmNsb25lKCksbS52ZXJ0ZXhOb3JtYWxzLnB1c2goRSk7aWYodm9pZCAwIT09Slt3XS5mYWNlTm9ybWFscylmb3IobS5mYWNlTm9ybWFscz1bXSx1PTAsaD1KW3ddLmZhY2VOb3JtYWxzLmxlbmd0aDt1PGg7dSsrKW0uZmFjZU5vcm1hbHMucHVzaChKW3ddLmZhY2VOb3JtYWxzW3VdLmNsb25lKCkpO3RoaXMubW9ycGhOb3JtYWxzLnB1c2gobSl9dT0KYi5za2luV2VpZ2h0czt3PTA7Zm9yKGU9dS5sZW5ndGg7dzxlO3crKyl0aGlzLnNraW5XZWlnaHRzLnB1c2godVt3XS5jbG9uZSgpKTt1PWIuc2tpbkluZGljZXM7dz0wO2ZvcihlPXUubGVuZ3RoO3c8ZTt3KyspdGhpcy5za2luSW5kaWNlcy5wdXNoKHVbd10uY2xvbmUoKSk7dT1iLmxpbmVEaXN0YW5jZXM7dz0wO2ZvcihlPXUubGVuZ3RoO3c8ZTt3KyspdGhpcy5saW5lRGlzdGFuY2VzLnB1c2godVt3XSk7dz1iLmJvdW5kaW5nQm94O251bGwhPT13JiYodGhpcy5ib3VuZGluZ0JveD13LmNsb25lKCkpO3c9Yi5ib3VuZGluZ1NwaGVyZTtudWxsIT09dyYmKHRoaXMuYm91bmRpbmdTcGhlcmU9dy5jbG9uZSgpKTt0aGlzLmVsZW1lbnRzTmVlZFVwZGF0ZT1iLmVsZW1lbnRzTmVlZFVwZGF0ZTt0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZT1iLnZlcnRpY2VzTmVlZFVwZGF0ZTt0aGlzLnV2c05lZWRVcGRhdGU9Yi51dnNOZWVkVXBkYXRlO3RoaXMubm9ybWFsc05lZWRVcGRhdGU9Yi5ub3JtYWxzTmVlZFVwZGF0ZTsKdGhpcy5jb2xvcnNOZWVkVXBkYXRlPWIuY29sb3JzTmVlZFVwZGF0ZTt0aGlzLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlPWIubGluZURpc3RhbmNlc05lZWRVcGRhdGU7dGhpcy5ncm91cHNOZWVkVXBkYXRlPWIuZ3JvdXBzTmVlZFVwZGF0ZTtyZXR1cm4gdGhpc30sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19KTtVYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh6YS5wcm90b3R5cGUpO1VhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1VYTtaYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO1phLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1aYTt2YXIgQnM9e2Nsb25lOnpiLG1lcmdlOklifTt1Yi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7dWIucHJvdG90eXBlLmNvbnN0cnVjdG9yPXViO3ViLnByb3RvdHlwZS5pc1NoYWRlck1hdGVyaWFsPSEwO3ViLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLApiKTt0aGlzLmZyYWdtZW50U2hhZGVyPWIuZnJhZ21lbnRTaGFkZXI7dGhpcy52ZXJ0ZXhTaGFkZXI9Yi52ZXJ0ZXhTaGFkZXI7dGhpcy51bmlmb3Jtcz16YihiLnVuaWZvcm1zKTt0aGlzLmRlZmluZXM9T2JqZWN0LmFzc2lnbih7fSxiLmRlZmluZXMpO3RoaXMud2lyZWZyYW1lPWIud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWIud2lyZWZyYW1lTGluZXdpZHRoO3RoaXMubGlnaHRzPWIubGlnaHRzO3RoaXMuY2xpcHBpbmc9Yi5jbGlwcGluZzt0aGlzLnNraW5uaW5nPWIuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9Yi5tb3JwaFRhcmdldHM7dGhpcy5tb3JwaE5vcm1hbHM9Yi5tb3JwaE5vcm1hbHM7dGhpcy5leHRlbnNpb25zPWIuZXh0ZW5zaW9ucztyZXR1cm4gdGhpc307dWIucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbihiKXt2YXIgZT1NLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGIpO2UudW5pZm9ybXM9e307Zm9yKHZhciBoIGluIHRoaXMudW5pZm9ybXMpe3ZhciBtPQp0aGlzLnVuaWZvcm1zW2hdLnZhbHVlO2UudW5pZm9ybXNbaF09bSYmbS5pc1RleHR1cmU/e3R5cGU6InQiLHZhbHVlOm0udG9KU09OKGIpLnV1aWR9Om0mJm0uaXNDb2xvcj97dHlwZToiYyIsdmFsdWU6bS5nZXRIZXgoKX06bSYmbS5pc1ZlY3RvcjI/e3R5cGU6InYyIix2YWx1ZTptLnRvQXJyYXkoKX06bSYmbS5pc1ZlY3RvcjM/e3R5cGU6InYzIix2YWx1ZTptLnRvQXJyYXkoKX06bSYmbS5pc1ZlY3RvcjQ/e3R5cGU6InY0Iix2YWx1ZTptLnRvQXJyYXkoKX06bSYmbS5pc01hdHJpeDM/e3R5cGU6Im0zIix2YWx1ZTptLnRvQXJyYXkoKX06bSYmbS5pc01hdHJpeDQ/e3R5cGU6Im00Iix2YWx1ZTptLnRvQXJyYXkoKX06e3ZhbHVlOm19fTA8T2JqZWN0LmtleXModGhpcy5kZWZpbmVzKS5sZW5ndGgmJihlLmRlZmluZXM9dGhpcy5kZWZpbmVzKTtlLnZlcnRleFNoYWRlcj10aGlzLnZlcnRleFNoYWRlcjtlLmZyYWdtZW50U2hhZGVyPXRoaXMuZnJhZ21lbnRTaGFkZXI7Yj17fTtmb3IodmFyIHUgaW4gdGhpcy5leHRlbnNpb25zKSEwPT09CnRoaXMuZXh0ZW5zaW9uc1t1XSYmKGJbdV09ITApOzA8T2JqZWN0LmtleXMoYikubGVuZ3RoJiYoZS5leHRlbnNpb25zPWIpO3JldHVybiBlfTtGYi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHkucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6RmIsaXNDYW1lcmE6ITAsY29weTpmdW5jdGlvbihiLGUpe3kucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIsZSk7dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuY29weShiLm1hdHJpeFdvcmxkSW52ZXJzZSk7dGhpcy5wcm9qZWN0aW9uTWF0cml4LmNvcHkoYi5wcm9qZWN0aW9uTWF0cml4KTt0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoYi5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSk7cmV0dXJuIHRoaXN9LGdldFdvcmxkRGlyZWN0aW9uOmZ1bmN0aW9uKGIpe3ZvaWQgMD09PWImJihjb25zb2xlLndhcm4oIlRIUkVFLkNhbWVyYTogLmdldFdvcmxkRGlyZWN0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLApiPW5ldyBnKTt0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTt2YXIgZT10aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO3JldHVybiBiLnNldCgtZVs4XSwtZVs5XSwtZVsxMF0pLm5vcm1hbGl6ZSgpfSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihiKXt5LnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYik7dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSh0aGlzLm1hdHJpeFdvcmxkKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fSk7QWIucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShGYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpBYixpc1BlcnNwZWN0aXZlQ2FtZXJhOiEwLGNvcHk6ZnVuY3Rpb24oYixlKXtGYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYixlKTt0aGlzLmZvdj1iLmZvdjt0aGlzLnpvb209Yi56b29tO3RoaXMubmVhcj1iLm5lYXI7dGhpcy5mYXI9CmIuZmFyO3RoaXMuZm9jdXM9Yi5mb2N1czt0aGlzLmFzcGVjdD1iLmFzcGVjdDt0aGlzLnZpZXc9bnVsbD09PWIudmlldz9udWxsOk9iamVjdC5hc3NpZ24oe30sYi52aWV3KTt0aGlzLmZpbG1HYXVnZT1iLmZpbG1HYXVnZTt0aGlzLmZpbG1PZmZzZXQ9Yi5maWxtT2Zmc2V0O3JldHVybiB0aGlzfSxzZXRGb2NhbExlbmd0aDpmdW5jdGlvbihiKXt0aGlzLmZvdj0yKmxiLlJBRDJERUcqTWF0aC5hdGFuKC41KnRoaXMuZ2V0RmlsbUhlaWdodCgpL2IpO3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSxnZXRGb2NhbExlbmd0aDpmdW5jdGlvbigpe3JldHVybi41KnRoaXMuZ2V0RmlsbUhlaWdodCgpL01hdGgudGFuKC41KmxiLkRFRzJSQUQqdGhpcy5mb3YpfSxnZXRFZmZlY3RpdmVGT1Y6ZnVuY3Rpb24oKXtyZXR1cm4gMipsYi5SQUQyREVHKk1hdGguYXRhbihNYXRoLnRhbiguNSpsYi5ERUcyUkFEKnRoaXMuZm92KS90aGlzLnpvb20pfSxnZXRGaWxtV2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxtR2F1Z2UqCk1hdGgubWluKHRoaXMuYXNwZWN0LDEpfSxnZXRGaWxtSGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbUdhdWdlL01hdGgubWF4KHRoaXMuYXNwZWN0LDEpfSxzZXRWaWV3T2Zmc2V0OmZ1bmN0aW9uKGIsZSxoLG0sdSx3KXt0aGlzLmFzcGVjdD1iL2U7bnVsbD09PXRoaXMudmlldyYmKHRoaXMudmlldz17ZW5hYmxlZDohMCxmdWxsV2lkdGg6MSxmdWxsSGVpZ2h0OjEsb2Zmc2V0WDowLG9mZnNldFk6MCx3aWR0aDoxLGhlaWdodDoxfSk7dGhpcy52aWV3LmVuYWJsZWQ9ITA7dGhpcy52aWV3LmZ1bGxXaWR0aD1iO3RoaXMudmlldy5mdWxsSGVpZ2h0PWU7dGhpcy52aWV3Lm9mZnNldFg9aDt0aGlzLnZpZXcub2Zmc2V0WT1tO3RoaXMudmlldy53aWR0aD11O3RoaXMudmlldy5oZWlnaHQ9dzt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX0sY2xlYXJWaWV3T2Zmc2V0OmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMudmlldyYmKHRoaXMudmlldy5lbmFibGVkPSExKTt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX0sCnVwZGF0ZVByb2plY3Rpb25NYXRyaXg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5lYXIsZT1iKk1hdGgudGFuKC41KmxiLkRFRzJSQUQqdGhpcy5mb3YpL3RoaXMuem9vbSxoPTIqZSxtPXRoaXMuYXNwZWN0KmgsdT0tLjUqbSx3PXRoaXMudmlldztpZihudWxsIT09dGhpcy52aWV3JiZ0aGlzLnZpZXcuZW5hYmxlZCl7dmFyIEE9dy5mdWxsV2lkdGgsRT13LmZ1bGxIZWlnaHQ7dSs9dy5vZmZzZXRYKm0vQTtlLT13Lm9mZnNldFkqaC9FO20qPXcud2lkdGgvQTtoKj13LmhlaWdodC9FfXc9dGhpcy5maWxtT2Zmc2V0OzAhPT13JiYodSs9Yip3L3RoaXMuZ2V0RmlsbVdpZHRoKCkpO3RoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUodSx1K20sZSxlLWgsYix0aGlzLmZhcik7dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKHRoaXMucHJvamVjdGlvbk1hdHJpeCl9LHRvSlNPTjpmdW5jdGlvbihiKXtiPXkucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsCmIpO2Iub2JqZWN0LmZvdj10aGlzLmZvdjtiLm9iamVjdC56b29tPXRoaXMuem9vbTtiLm9iamVjdC5uZWFyPXRoaXMubmVhcjtiLm9iamVjdC5mYXI9dGhpcy5mYXI7Yi5vYmplY3QuZm9jdXM9dGhpcy5mb2N1cztiLm9iamVjdC5hc3BlY3Q9dGhpcy5hc3BlY3Q7bnVsbCE9PXRoaXMudmlldyYmKGIub2JqZWN0LnZpZXc9T2JqZWN0LmFzc2lnbih7fSx0aGlzLnZpZXcpKTtiLm9iamVjdC5maWxtR2F1Z2U9dGhpcy5maWxtR2F1Z2U7Yi5vYmplY3QuZmlsbU9mZnNldD10aGlzLmZpbG1PZmZzZXQ7cmV0dXJuIGJ9fSk7UGIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeS5wcm90b3R5cGUpO1BiLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1QYjtiYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShwLnByb3RvdHlwZSk7YmMucHJvdG90eXBlLmNvbnN0cnVjdG9yPWJjO2JjLnByb3RvdHlwZS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZT0hMDtiYy5wcm90b3R5cGUuZnJvbUVxdWlyZWN0YW5ndWxhclRleHR1cmU9CmZ1bmN0aW9uKGIsZSl7dGhpcy50ZXh0dXJlLnR5cGU9ZS50eXBlO3RoaXMudGV4dHVyZS5mb3JtYXQ9ZS5mb3JtYXQ7dGhpcy50ZXh0dXJlLmVuY29kaW5nPWUuZW5jb2Rpbmc7dmFyIGg9bmV3IHosbT1uZXcgdWIoe3R5cGU6IkN1YmVtYXBGcm9tRXF1aXJlY3QiLHVuaWZvcm1zOnpiKHt0RXF1aXJlY3Q6e3ZhbHVlOm51bGx9fSksdmVydGV4U2hhZGVyOiJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xudmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcblx0cmV0dXJuIG5vcm1hbGl6ZSggKCBtYXRyaXggKiB2ZWM0KCBkaXIsIDAuMCApICkueHl6ICk7XG59XG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZERpcmVjdGlvbiBceDNkIHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcbn0iLApmcmFnbWVudFNoYWRlcjoidW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0O1xudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NjE4XG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkyIDAuMTU5MTU0OTRcbnZvaWQgbWFpbigpIHtcblx0dmVjMyBkaXJlY3Rpb24gXHgzZCBub3JtYWxpemUoIHZXb3JsZERpcmVjdGlvbiApO1xuXHR2ZWMyIHNhbXBsZVVWO1xuXHRzYW1wbGVVVi55IFx4M2QgYXNpbiggY2xhbXAoIGRpcmVjdGlvbi55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdHNhbXBsZVVWLnggXHgzZCBhdGFuKCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTtcbn0iLHNpZGU6MSxibGVuZGluZzowfSk7bS51bmlmb3Jtcy50RXF1aXJlY3QudmFsdWU9ZTsKZT1uZXcgeWEobmV3IFphKDUsNSw1KSxtKTtoLmFkZChlKTttPW5ldyBQYigxLDEwLDEpO20ucmVuZGVyVGFyZ2V0PXRoaXM7bS5yZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lPSJDdWJlQ2FtZXJhVGV4dHVyZSI7bS51cGRhdGUoYixoKTtlLmdlb21ldHJ5LmRpc3Bvc2UoKTtlLm1hdGVyaWFsLmRpc3Bvc2UoKTtyZXR1cm4gdGhpc307R2IucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoay5wcm90b3R5cGUpO0diLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1HYjtHYi5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZT0hMDt2YXIgbWw9bmV3IGcsQ3M9bmV3IGcsRHM9bmV3IGw7T2JqZWN0LmFzc2lnbihSYi5wcm90b3R5cGUse2lzUGxhbmU6ITAsc2V0OmZ1bmN0aW9uKGIsZSl7dGhpcy5ub3JtYWwuY29weShiKTt0aGlzLmNvbnN0YW50PWU7cmV0dXJuIHRoaXN9LHNldENvbXBvbmVudHM6ZnVuY3Rpb24oYixlLGgsbSl7dGhpcy5ub3JtYWwuc2V0KGIsZSxoKTt0aGlzLmNvbnN0YW50PW07cmV0dXJuIHRoaXN9LApzZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludDpmdW5jdGlvbihiLGUpe3RoaXMubm9ybWFsLmNvcHkoYik7dGhpcy5jb25zdGFudD0tZS5kb3QodGhpcy5ub3JtYWwpO3JldHVybiB0aGlzfSxzZXRGcm9tQ29wbGFuYXJQb2ludHM6ZnVuY3Rpb24oYixlLGgpe2U9bWwuc3ViVmVjdG9ycyhoLGUpLmNyb3NzKENzLnN1YlZlY3RvcnMoYixlKSkubm9ybWFsaXplKCk7dGhpcy5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludChlLGIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihiKXt0aGlzLm5vcm1hbC5jb3B5KGIubm9ybWFsKTt0aGlzLmNvbnN0YW50PWIuY29uc3RhbnQ7cmV0dXJuIHRoaXN9LG5vcm1hbGl6ZTpmdW5jdGlvbigpe3ZhciBiPTEvdGhpcy5ub3JtYWwubGVuZ3RoKCk7dGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIoYik7dGhpcy5jb25zdGFudCo9YjtyZXR1cm4gdGhpc30sCm5lZ2F0ZTpmdW5jdGlvbigpe3RoaXMuY29uc3RhbnQqPS0xO3RoaXMubm9ybWFsLm5lZ2F0ZSgpO3JldHVybiB0aGlzfSxkaXN0YW5jZVRvUG9pbnQ6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMubm9ybWFsLmRvdChiKSt0aGlzLmNvbnN0YW50fSxkaXN0YW5jZVRvU3BoZXJlOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmRpc3RhbmNlVG9Qb2ludChiLmNlbnRlciktYi5yYWRpdXN9LHByb2plY3RQb2ludDpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihjb25zb2xlLndhcm4oIlRIUkVFLlBsYW5lOiAucHJvamVjdFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGU9bmV3IGcpO3JldHVybiBlLmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmRpc3RhbmNlVG9Qb2ludChiKSkuYWRkKGIpfSxpbnRlcnNlY3RMaW5lOmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGNvbnNvbGUud2FybigiVEhSRUUuUGxhbmU6IC5pbnRlcnNlY3RMaW5lKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLAplPW5ldyBnKTt2YXIgaD1iLmRlbHRhKG1sKSxtPXRoaXMubm9ybWFsLmRvdChoKTtpZigwPT09bSl7aWYoMD09PXRoaXMuZGlzdGFuY2VUb1BvaW50KGIuc3RhcnQpKXJldHVybiBlLmNvcHkoYi5zdGFydCl9ZWxzZSBpZihtPS0oYi5zdGFydC5kb3QodGhpcy5ub3JtYWwpK3RoaXMuY29uc3RhbnQpL20sISgwPm18fDE8bSkpcmV0dXJuIGUuY29weShoKS5tdWx0aXBseVNjYWxhcihtKS5hZGQoYi5zdGFydCl9LGludGVyc2VjdHNMaW5lOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuZGlzdGFuY2VUb1BvaW50KGIuc3RhcnQpO2I9dGhpcy5kaXN0YW5jZVRvUG9pbnQoYi5lbmQpO3JldHVybiAwPmUmJjA8Ynx8MD5iJiYwPGV9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaW50ZXJzZWN0c1BsYW5lKHRoaXMpfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGIpe3JldHVybiBiLmludGVyc2VjdHNQbGFuZSh0aGlzKX0sY29wbGFuYXJQb2ludDpmdW5jdGlvbihiKXt2b2lkIDA9PT0KYiYmKGNvbnNvbGUud2FybigiVEhSRUUuUGxhbmU6IC5jb3BsYW5hclBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGI9bmV3IGcpO3JldHVybiBiLmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX0sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGIsZSl7ZT1lfHxEcy5nZXROb3JtYWxNYXRyaXgoYik7Yj10aGlzLmNvcGxhbmFyUG9pbnQobWwpLmFwcGx5TWF0cml4NChiKTtlPXRoaXMubm9ybWFsLmFwcGx5TWF0cml4MyhlKS5ub3JtYWxpemUoKTt0aGlzLmNvbnN0YW50PS1iLmRvdChlKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGIpe3RoaXMuY29uc3RhbnQtPWIuZG90KHRoaXMubm9ybWFsKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGIpe3JldHVybiBiLm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpJiZiLmNvbnN0YW50PT09dGhpcy5jb25zdGFudH19KTt2YXIgd2c9bmV3IEYsbWo9bmV3IGc7T2JqZWN0LmFzc2lnbihFYy5wcm90b3R5cGUsCntzZXQ6ZnVuY3Rpb24oYixlLGgsbSx1LHcpe3ZhciBBPXRoaXMucGxhbmVzO0FbMF0uY29weShiKTtBWzFdLmNvcHkoZSk7QVsyXS5jb3B5KGgpO0FbM10uY29weShtKTtBWzRdLmNvcHkodSk7QVs1XS5jb3B5KHcpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihiKXtmb3IodmFyIGU9dGhpcy5wbGFuZXMsaD0wOzY+aDtoKyspZVtoXS5jb3B5KGIucGxhbmVzW2hdKTtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeDpmdW5jdGlvbihiKXt2YXIgZT10aGlzLnBsYW5lcyxoPWIuZWxlbWVudHM7Yj1oWzBdO3ZhciBtPWhbMV0sdT1oWzJdLHc9aFszXSxBPWhbNF0sRT1oWzVdLEc9aFs2XSxKPWhbN10sUT1oWzhdLFM9aFs5XSxUPWhbMTBdLFc9aFsxMV0sWD1oWzEyXSxpYT1oWzEzXSxoYT1oWzE0XTtoPWhbMTVdO2VbMF0uc2V0Q29tcG9uZW50cyh3LWIsSi1BLFctUSxoLVgpLm5vcm1hbGl6ZSgpOwplWzFdLnNldENvbXBvbmVudHModytiLEorQSxXK1EsaCtYKS5ub3JtYWxpemUoKTtlWzJdLnNldENvbXBvbmVudHModyttLEorRSxXK1MsaCtpYSkubm9ybWFsaXplKCk7ZVszXS5zZXRDb21wb25lbnRzKHctbSxKLUUsVy1TLGgtaWEpLm5vcm1hbGl6ZSgpO2VbNF0uc2V0Q29tcG9uZW50cyh3LXUsSi1HLFctVCxoLWhhKS5ub3JtYWxpemUoKTtlWzVdLnNldENvbXBvbmVudHModyt1LEorRyxXK1QsaCtoYSkubm9ybWFsaXplKCk7cmV0dXJuIHRoaXN9LGludGVyc2VjdHNPYmplY3Q6ZnVuY3Rpb24oYil7dmFyIGU9Yi5nZW9tZXRyeTtudWxsPT09ZS5ib3VuZGluZ1NwaGVyZSYmZS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTt3Zy5jb3B5KGUuYm91bmRpbmdTcGhlcmUpLmFwcGx5TWF0cml4NChiLm1hdHJpeFdvcmxkKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKHdnKX0saW50ZXJzZWN0c1Nwcml0ZTpmdW5jdGlvbihiKXt3Zy5jZW50ZXIuc2V0KDAsMCwwKTt3Zy5yYWRpdXM9Ci43MDcxMDY3ODExODY1NDc2O3dnLmFwcGx5TWF0cml4NChiLm1hdHJpeFdvcmxkKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKHdnKX0saW50ZXJzZWN0c1NwaGVyZTpmdW5jdGlvbihiKXt2YXIgZT10aGlzLnBsYW5lcyxoPWIuY2VudGVyO2I9LWIucmFkaXVzO2Zvcih2YXIgbT0wOzY+bTttKyspaWYoZVttXS5kaXN0YW5jZVRvUG9pbnQoaCk8YilyZXR1cm4hMTtyZXR1cm4hMH0saW50ZXJzZWN0c0JveDpmdW5jdGlvbihiKXtmb3IodmFyIGU9dGhpcy5wbGFuZXMsaD0wOzY+aDtoKyspe3ZhciBtPWVbaF07bWoueD0wPG0ubm9ybWFsLng/Yi5tYXgueDpiLm1pbi54O21qLnk9MDxtLm5vcm1hbC55P2IubWF4Lnk6Yi5taW4ueTttai56PTA8bS5ub3JtYWwuej9iLm1heC56OmIubWluLno7aWYoMD5tLmRpc3RhbmNlVG9Qb2ludChtaikpcmV0dXJuITF9cmV0dXJuITB9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPXRoaXMucGxhbmVzLGg9MDs2Pmg7aCsrKWlmKDA+CmVbaF0uZGlzdGFuY2VUb1BvaW50KGIpKXJldHVybiExO3JldHVybiEwfX0pO3ZhciB3Yj17YWxwaGFtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQUxQSEFNQVBcblx0ZGlmZnVzZUNvbG9yLmEgKlx4M2QgdGV4dHVyZTJEKCBhbHBoYU1hcCwgdlV2ICkuZztcbiNlbmRpZiIsYWxwaGFtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9BTFBIQU1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBhbHBoYU1hcDtcbiNlbmRpZiIsYWxwaGF0ZXN0X2ZyYWdtZW50OiIjaWZkZWYgQUxQSEFURVNUXG5cdGlmICggZGlmZnVzZUNvbG9yLmEgXHgzYyBBTFBIQVRFU1QgKSBkaXNjYXJkO1xuI2VuZGlmIixhb21hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9BT01BUFxuXHRmbG9hdCBhbWJpZW50T2NjbHVzaW9uIFx4M2QgKCB0ZXh0dXJlMkQoIGFvTWFwLCB2VXYyICkuciAtIDEuMCApICogYW9NYXBJbnRlbnNpdHkgKyAxLjA7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqXHgzZCBhbWJpZW50T2NjbHVzaW9uO1xuXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIFx4MjZceDI2IGRlZmluZWQoIFNUQU5EQVJEIClcblx0XHRmbG9hdCBkb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciAqXHgzZCBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGRvdE5WLCBhbWJpZW50T2NjbHVzaW9uLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xuXHQjZW5kaWZcbiNlbmRpZiIsCmFvbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQU9NQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgYW9NYXA7XG5cdHVuaWZvcm0gZmxvYXQgYW9NYXBJbnRlbnNpdHk7XG4jZW5kaWYiLGJlZ2luX3ZlcnRleDoidmVjMyB0cmFuc2Zvcm1lZCBceDNkIHZlYzMoIHBvc2l0aW9uICk7IixiZWdpbm5vcm1hbF92ZXJ0ZXg6InZlYzMgb2JqZWN0Tm9ybWFsIFx4M2QgdmVjMyggbm9ybWFsICk7XG4jaWZkZWYgVVNFX1RBTkdFTlRcblx0dmVjMyBvYmplY3RUYW5nZW50IFx4M2QgdmVjMyggdGFuZ2VudC54eXogKTtcbiNlbmRpZiIsYnNkZnM6InZlYzIgaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRjb25zdCB2ZWM0IGMwIFx4M2QgdmVjNCggLSAxLCAtIDAuMDI3NSwgLSAwLjU3MiwgMC4wMjIgKTtcblx0Y29uc3QgdmVjNCBjMSBceDNkIHZlYzQoIDEsIDAuMDQyNSwgMS4wNCwgLSAwLjA0ICk7XG5cdHZlYzQgciBceDNkIHJvdWdobmVzcyAqIGMwICsgYzE7XG5cdGZsb2F0IGEwMDQgXHgzZCBtaW4oIHIueCAqIHIueCwgZXhwMiggLSA5LjI4ICogZG90TlYgKSApICogci54ICsgci55O1xuXHRyZXR1cm4gdmVjMiggLTEuMDQsIDEuMDQgKSAqIGEwMDQgKyByLnp3O1xufVxuZmxvYXQgcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggY29uc3QgaW4gZmxvYXQgbGlnaHREaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgY3V0b2ZmRGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGRlY2F5RXhwb25lbnQgKSB7XG4jaWYgZGVmaW5lZCAoIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFMgKVxuXHRmbG9hdCBkaXN0YW5jZUZhbGxvZmYgXHgzZCAxLjAgLyBtYXgoIHBvdyggbGlnaHREaXN0YW5jZSwgZGVjYXlFeHBvbmVudCApLCAwLjAxICk7XG5cdGlmKCBjdXRvZmZEaXN0YW5jZSBceDNlIDAuMCApIHtcblx0XHRkaXN0YW5jZUZhbGxvZmYgKlx4M2QgcG93Miggc2F0dXJhdGUoIDEuMCAtIHBvdzQoIGxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSApICkgKTtcblx0fVxuXHRyZXR1cm4gZGlzdGFuY2VGYWxsb2ZmO1xuI2Vsc2Vcblx0aWYoIGN1dG9mZkRpc3RhbmNlIFx4M2UgMC4wIFx4MjZceDI2IGRlY2F5RXhwb25lbnQgXHgzZSAwLjAgKSB7XG5cdFx0cmV0dXJuIHBvdyggc2F0dXJhdGUoIC1saWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKyAxLjAgKSwgZGVjYXlFeHBvbmVudCApO1xuXHR9XG5cdHJldHVybiAxLjA7XG4jZW5kaWZcbn1cbnZlYzMgQlJERl9EaWZmdXNlX0xhbWJlcnQoIGNvbnN0IGluIHZlYzMgZGlmZnVzZUNvbG9yICkge1xuXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGRpZmZ1c2VDb2xvcjtcbn1cbnZlYzMgRl9TY2hsaWNrKCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IGRvdExIICkge1xuXHRmbG9hdCBmcmVzbmVsIFx4M2QgZXhwMiggKCAtNS41NTQ3MyAqIGRvdExIIC0gNi45ODMxNiApICogZG90TEggKTtcblx0cmV0dXJuICggMS4wIC0gc3BlY3VsYXJDb2xvciApICogZnJlc25lbCArIHNwZWN1bGFyQ29sb3I7XG59XG52ZWMzIEZfU2NobGlja19Sb3VnaG5lc3NEZXBlbmRlbnQoIGNvbnN0IGluIHZlYzMgRjAsIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGZyZXNuZWwgXHgzZCBleHAyKCAoIC01LjU1NDczICogZG90TlYgLSA2Ljk4MzE2ICkgKiBkb3ROViApO1xuXHR2ZWMzIEZyIFx4M2QgbWF4KCB2ZWMzKCAxLjAgLSByb3VnaG5lc3MgKSwgRjAgKSAtIEYwO1xuXHRyZXR1cm4gRnIgKiBmcmVzbmVsICsgRjA7XG59XG5mbG9hdCBHX0dHWF9TbWl0aCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5MLCBjb25zdCBpbiBmbG9hdCBkb3ROViApIHtcblx0ZmxvYXQgYTIgXHgzZCBwb3cyKCBhbHBoYSApO1xuXHRmbG9hdCBnbCBceDNkIGRvdE5MICsgc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XG5cdGZsb2F0IGd2IFx4M2QgZG90TlYgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcblx0cmV0dXJuIDEuMCAvICggZ2wgKiBndiApO1xufVxuZmxvYXQgR19HR1hfU21pdGhDb3JyZWxhdGVkKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xuXHRmbG9hdCBhMiBceDNkIHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGd2IFx4M2QgZG90TkwgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcblx0ZmxvYXQgZ2wgXHgzZCBkb3ROViAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TkwgKSApO1xuXHRyZXR1cm4gMC41IC8gbWF4KCBndiArIGdsLCBFUFNJTE9OICk7XG59XG5mbG9hdCBEX0dHWCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkge1xuXHRmbG9hdCBhMiBceDNkIHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGRlbm9tIFx4M2QgcG93MiggZG90TkggKSAqICggYTIgLSAxLjAgKSArIDEuMDtcblx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBhMiAvIHBvdzIoIGRlbm9tICk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfR0dYKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGluY2lkZW50TGlnaHQsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRmbG9hdCBhbHBoYSBceDNkIHBvdzIoIHJvdWdobmVzcyApO1xuXHR2ZWMzIGhhbGZEaXIgXHgzZCBub3JtYWxpemUoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICsgdmlld0RpciApO1xuXHRmbG9hdCBkb3ROTCBceDNkIHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKSApO1xuXHRmbG9hdCBkb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7XG5cdGZsb2F0IGRvdE5IIFx4M2Qgc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTtcblx0ZmxvYXQgZG90TEggXHgzZCBzYXR1cmF0ZSggZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRpciApICk7XG5cdHZlYzMgRiBceDNkIEZfU2NobGljayggc3BlY3VsYXJDb2xvciwgZG90TEggKTtcblx0ZmxvYXQgRyBceDNkIEdfR0dYX1NtaXRoQ29ycmVsYXRlZCggYWxwaGEsIGRvdE5MLCBkb3ROViApO1xuXHRmbG9hdCBEIFx4M2QgRF9HR1goIGFscGhhLCBkb3ROSCApO1xuXHRyZXR1cm4gRiAqICggRyAqIEQgKTtcbn1cbnZlYzIgTFRDX1V2KCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRjb25zdCBmbG9hdCBMVVRfU0laRSAgXHgzZCA2NC4wO1xuXHRjb25zdCBmbG9hdCBMVVRfU0NBTEUgXHgzZCAoIExVVF9TSVpFIC0gMS4wICkgLyBMVVRfU0laRTtcblx0Y29uc3QgZmxvYXQgTFVUX0JJQVMgIFx4M2QgMC41IC8gTFVUX1NJWkU7XG5cdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggTiwgViApICk7XG5cdHZlYzIgdXYgXHgzZCB2ZWMyKCByb3VnaG5lc3MsIHNxcnQoIDEuMCAtIGRvdE5WICkgKTtcblx0dXYgXHgzZCB1diAqIExVVF9TQ0FMRSArIExVVF9CSUFTO1xuXHRyZXR1cm4gdXY7XG59XG5mbG9hdCBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgZiApIHtcblx0ZmxvYXQgbCBceDNkIGxlbmd0aCggZiApO1xuXHRyZXR1cm4gbWF4KCAoIGwgKiBsICsgZi56ICkgLyAoIGwgKyAxLjAgKSwgMC4wICk7XG59XG52ZWMzIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyB2MSwgY29uc3QgaW4gdmVjMyB2MiApIHtcblx0ZmxvYXQgeCBceDNkIGRvdCggdjEsIHYyICk7XG5cdGZsb2F0IHkgXHgzZCBhYnMoIHggKTtcblx0ZmxvYXQgYSBceDNkIDAuODU0Mzk4NSArICggMC40OTY1MTU1ICsgMC4wMTQ1MjA2ICogeSApICogeTtcblx0ZmxvYXQgYiBceDNkIDMuNDE3NTk0MCArICggNC4xNjE2NzI0ICsgeSApICogeTtcblx0ZmxvYXQgdiBceDNkIGEgLyBiO1xuXHRmbG9hdCB0aGV0YV9zaW50aGV0YSBceDNkICggeCBceDNlIDAuMCApID8gdiA6IDAuNSAqIGludmVyc2VzcXJ0KCBtYXgoIDEuMCAtIHggKiB4LCAxZS03ICkgKSAtIHY7XG5cdHJldHVybiBjcm9zcyggdjEsIHYyICkgKiB0aGV0YV9zaW50aGV0YTtcbn1cbnZlYzMgTFRDX0V2YWx1YXRlKCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gdmVjMyBQLCBjb25zdCBpbiBtYXQzIG1JbnYsIGNvbnN0IGluIHZlYzMgcmVjdENvb3Jkc1sgNCBdICkge1xuXHR2ZWMzIHYxIFx4M2QgcmVjdENvb3Jkc1sgMSBdIC0gcmVjdENvb3Jkc1sgMCBdO1xuXHR2ZWMzIHYyIFx4M2QgcmVjdENvb3Jkc1sgMyBdIC0gcmVjdENvb3Jkc1sgMCBdO1xuXHR2ZWMzIGxpZ2h0Tm9ybWFsIFx4M2QgY3Jvc3MoIHYxLCB2MiApO1xuXHRpZiggZG90KCBsaWdodE5vcm1hbCwgUCAtIHJlY3RDb29yZHNbIDAgXSApIFx4M2MgMC4wICkgcmV0dXJuIHZlYzMoIDAuMCApO1xuXHR2ZWMzIFQxLCBUMjtcblx0VDEgXHgzZCBub3JtYWxpemUoIFYgLSBOICogZG90KCBWLCBOICkgKTtcblx0VDIgXHgzZCAtIGNyb3NzKCBOLCBUMSApO1xuXHRtYXQzIG1hdCBceDNkIG1JbnYgKiB0cmFuc3Bvc2VNYXQzKCBtYXQzKCBUMSwgVDIsIE4gKSApO1xuXHR2ZWMzIGNvb3Jkc1sgNCBdO1xuXHRjb29yZHNbIDAgXSBceDNkIG1hdCAqICggcmVjdENvb3Jkc1sgMCBdIC0gUCApO1xuXHRjb29yZHNbIDEgXSBceDNkIG1hdCAqICggcmVjdENvb3Jkc1sgMSBdIC0gUCApO1xuXHRjb29yZHNbIDIgXSBceDNkIG1hdCAqICggcmVjdENvb3Jkc1sgMiBdIC0gUCApO1xuXHRjb29yZHNbIDMgXSBceDNkIG1hdCAqICggcmVjdENvb3Jkc1sgMyBdIC0gUCApO1xuXHRjb29yZHNbIDAgXSBceDNkIG5vcm1hbGl6ZSggY29vcmRzWyAwIF0gKTtcblx0Y29vcmRzWyAxIF0gXHgzZCBub3JtYWxpemUoIGNvb3Jkc1sgMSBdICk7XG5cdGNvb3Jkc1sgMiBdIFx4M2Qgbm9ybWFsaXplKCBjb29yZHNbIDIgXSApO1xuXHRjb29yZHNbIDMgXSBceDNkIG5vcm1hbGl6ZSggY29vcmRzWyAzIF0gKTtcblx0dmVjMyB2ZWN0b3JGb3JtRmFjdG9yIFx4M2QgdmVjMyggMC4wICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgK1x4M2QgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDAgXSwgY29vcmRzWyAxIF0gKTtcblx0dmVjdG9yRm9ybUZhY3RvciArXHgzZCBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMSBdLCBjb29yZHNbIDIgXSApO1xuXHR2ZWN0b3JGb3JtRmFjdG9yICtceDNkIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAyIF0sIGNvb3Jkc1sgMyBdICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgK1x4M2QgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDMgXSwgY29vcmRzWyAwIF0gKTtcblx0ZmxvYXQgcmVzdWx0IFx4M2QgTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCB2ZWN0b3JGb3JtRmFjdG9yICk7XG5cdHJldHVybiB2ZWMzKCByZXN1bHQgKTtcbn1cbnZlYzMgQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRmbG9hdCBkb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7XG5cdHZlYzIgYnJkZiBceDNkIGludGVncmF0ZVNwZWN1bGFyQlJERiggZG90TlYsIHJvdWdobmVzcyApO1xuXHRyZXR1cm4gc3BlY3VsYXJDb2xvciAqIGJyZGYueCArIGJyZGYueTtcbn1cbnZvaWQgQlJERl9TcGVjdWxhcl9NdWx0aXNjYXR0ZXJpbmdfRW52aXJvbm1lbnQoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBpbm91dCB2ZWMzIHNpbmdsZVNjYXR0ZXIsIGlub3V0IHZlYzMgbXVsdGlTY2F0dGVyICkge1xuXHRmbG9hdCBkb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdHZlYzMgRiBceDNkIEZfU2NobGlja19Sb3VnaG5lc3NEZXBlbmRlbnQoIHNwZWN1bGFyQ29sb3IsIGRvdE5WLCByb3VnaG5lc3MgKTtcblx0dmVjMiBicmRmIFx4M2QgaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBkb3ROViwgcm91Z2huZXNzICk7XG5cdHZlYzMgRnNzRXNzIFx4M2QgRiAqIGJyZGYueCArIGJyZGYueTtcblx0ZmxvYXQgRXNzIFx4M2QgYnJkZi54ICsgYnJkZi55O1xuXHRmbG9hdCBFbXMgXHgzZCAxLjAgLSBFc3M7XG5cdHZlYzMgRmF2ZyBceDNkIHNwZWN1bGFyQ29sb3IgKyAoIDEuMCAtIHNwZWN1bGFyQ29sb3IgKSAqIDAuMDQ3NjE5O1x0dmVjMyBGbXMgXHgzZCBGc3NFc3MgKiBGYXZnIC8gKCAxLjAgLSBFbXMgKiBGYXZnICk7XG5cdHNpbmdsZVNjYXR0ZXIgK1x4M2QgRnNzRXNzO1xuXHRtdWx0aVNjYXR0ZXIgK1x4M2QgRm1zICogRW1zO1xufVxuZmxvYXQgR19CbGlublBob25nX0ltcGxpY2l0KCApIHtcblx0cmV0dXJuIDAuMjU7XG59XG5mbG9hdCBEX0JsaW5uUGhvbmcoIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7XG5cdHJldHVybiBSRUNJUFJPQ0FMX1BJICogKCBzaGluaW5lc3MgKiAwLjUgKyAxLjAgKSAqIHBvdyggZG90TkgsIHNoaW5pbmVzcyApO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MgKSB7XG5cdHZlYzMgaGFsZkRpciBceDNkIG5vcm1hbGl6ZSggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKyBnZW9tZXRyeS52aWV3RGlyICk7XG5cdGZsb2F0IGRvdE5IIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoYWxmRGlyICkgKTtcblx0ZmxvYXQgZG90TEggXHgzZCBzYXR1cmF0ZSggZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRpciApICk7XG5cdHZlYzMgRiBceDNkIEZfU2NobGljayggc3BlY3VsYXJDb2xvciwgZG90TEggKTtcblx0ZmxvYXQgRyBceDNkIEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKTtcblx0ZmxvYXQgRCBceDNkIERfQmxpbm5QaG9uZyggc2hpbmluZXNzLCBkb3ROSCApO1xuXHRyZXR1cm4gRiAqICggRyAqIEQgKTtcbn1cbmZsb2F0IEdHWFJvdWdobmVzc1RvQmxpbm5FeHBvbmVudCggY29uc3QgaW4gZmxvYXQgZ2d4Um91Z2huZXNzICkge1xuXHRyZXR1cm4gKCAyLjAgLyBwb3cyKCBnZ3hSb3VnaG5lc3MgKyAwLjAwMDEgKSAtIDIuMCApO1xufVxuZmxvYXQgQmxpbm5FeHBvbmVudFRvR0dYUm91Z2huZXNzKCBjb25zdCBpbiBmbG9hdCBibGlubkV4cG9uZW50ICkge1xuXHRyZXR1cm4gc3FydCggMi4wIC8gKCBibGlubkV4cG9uZW50ICsgMi4wICkgKTtcbn1cbiNpZiBkZWZpbmVkKCBVU0VfU0hFRU4gKVxuZmxvYXQgRF9DaGFybGllKGZsb2F0IHJvdWdobmVzcywgZmxvYXQgTm9IKSB7XG5cdGZsb2F0IGludkFscGhhICBceDNkIDEuMCAvIHJvdWdobmVzcztcblx0ZmxvYXQgY29zMmggXHgzZCBOb0ggKiBOb0g7XG5cdGZsb2F0IHNpbjJoIFx4M2QgbWF4KDEuMCAtIGNvczJoLCAwLjAwNzgxMjUpO1x0cmV0dXJuICgyLjAgKyBpbnZBbHBoYSkgKiBwb3coc2luMmgsIGludkFscGhhICogMC41KSAvICgyLjAgKiBQSSk7XG59XG5mbG9hdCBWX05ldWJlbHQoZmxvYXQgTm9WLCBmbG9hdCBOb0wpIHtcblx0cmV0dXJuIHNhdHVyYXRlKDEuMCAvICg0LjAgKiAoTm9MICsgTm9WIC0gTm9MICogTm9WKSkpO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX1NoZWVuKCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIHZlYzMgTCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgdmVjMyBzcGVjdWxhckNvbG9yICkge1xuXHR2ZWMzIE4gXHgzZCBnZW9tZXRyeS5ub3JtYWw7XG5cdHZlYzMgViBceDNkIGdlb21ldHJ5LnZpZXdEaXI7XG5cdHZlYzMgSCBceDNkIG5vcm1hbGl6ZSggViArIEwgKTtcblx0ZmxvYXQgZG90TkggXHgzZCBzYXR1cmF0ZSggZG90KCBOLCBIICkgKTtcblx0cmV0dXJuIHNwZWN1bGFyQ29sb3IgKiBEX0NoYXJsaWUoIHJvdWdobmVzcywgZG90TkggKSAqIFZfTmV1YmVsdCggZG90KE4sIFYpLCBkb3QoTiwgTCkgKTtcbn1cbiNlbmRpZiIsCmJ1bXBtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9CVU1QTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGJ1bXBNYXA7XG5cdHVuaWZvcm0gZmxvYXQgYnVtcFNjYWxlO1xuXHR2ZWMyIGRIZHh5X2Z3ZCgpIHtcblx0XHR2ZWMyIGRTVGR4IFx4M2QgZEZkeCggdlV2ICk7XG5cdFx0dmVjMiBkU1RkeSBceDNkIGRGZHkoIHZVdiApO1xuXHRcdGZsb2F0IEhsbCBceDNkIGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICkueDtcblx0XHRmbG9hdCBkQnggXHgzZCBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR4ICkueCAtIEhsbDtcblx0XHRmbG9hdCBkQnkgXHgzZCBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR5ICkueCAtIEhsbDtcblx0XHRyZXR1cm4gdmVjMiggZEJ4LCBkQnkgKTtcblx0fVxuXHR2ZWMzIHBlcnR1cmJOb3JtYWxBcmIoIHZlYzMgc3VyZl9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIGRIZHh5ICkge1xuXHRcdHZlYzMgdlNpZ21hWCBceDNkIHZlYzMoIGRGZHgoIHN1cmZfcG9zLnggKSwgZEZkeCggc3VyZl9wb3MueSApLCBkRmR4KCBzdXJmX3Bvcy56ICkgKTtcblx0XHR2ZWMzIHZTaWdtYVkgXHgzZCB2ZWMzKCBkRmR5KCBzdXJmX3Bvcy54ICksIGRGZHkoIHN1cmZfcG9zLnkgKSwgZEZkeSggc3VyZl9wb3MueiApICk7XG5cdFx0dmVjMyB2TiBceDNkIHN1cmZfbm9ybTtcblx0XHR2ZWMzIFIxIFx4M2QgY3Jvc3MoIHZTaWdtYVksIHZOICk7XG5cdFx0dmVjMyBSMiBceDNkIGNyb3NzKCB2TiwgdlNpZ21hWCApO1xuXHRcdGZsb2F0IGZEZXQgXHgzZCBkb3QoIHZTaWdtYVgsIFIxICk7XG5cdFx0ZkRldCAqXHgzZCAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdFx0dmVjMyB2R3JhZCBceDNkIHNpZ24oIGZEZXQgKSAqICggZEhkeHkueCAqIFIxICsgZEhkeHkueSAqIFIyICk7XG5cdFx0cmV0dXJuIG5vcm1hbGl6ZSggYWJzKCBmRGV0ICkgKiBzdXJmX25vcm0gLSB2R3JhZCApO1xuXHR9XG4jZW5kaWYiLApjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTIFx4M2UgMFxuXHR2ZWM0IHBsYW5lO1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHtcblx0XHRwbGFuZSBceDNkIGNsaXBwaW5nUGxhbmVzWyBpIF07XG5cdFx0aWYgKCBkb3QoIHZWaWV3UG9zaXRpb24sIHBsYW5lLnh5eiApIFx4M2UgcGxhbmUudyApIGRpc2NhcmQ7XG5cdH1cblx0I2lmIFVOSU9OX0NMSVBQSU5HX1BMQU5FUyBceDNjIE5VTV9DTElQUElOR19QTEFORVNcblx0XHRib29sIGNsaXBwZWQgXHgzZCB0cnVlO1xuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0XHRmb3IgKCBpbnQgaSBceDNkIFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSBceDNjIE5VTV9DTElQUElOR19QTEFORVM7IGkgKysgKSB7XG5cdFx0XHRwbGFuZSBceDNkIGNsaXBwaW5nUGxhbmVzWyBpIF07XG5cdFx0XHRjbGlwcGVkIFx4M2QgKCBkb3QoIHZWaWV3UG9zaXRpb24sIHBsYW5lLnh5eiApIFx4M2UgcGxhbmUudyApIFx4MjZceDI2IGNsaXBwZWQ7XG5cdFx0fVxuXHRcdGlmICggY2xpcHBlZCApIGRpc2NhcmQ7XG5cdCNlbmRpZlxuI2VuZGlmIiwKY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTIFx4M2UgMFxuXHQjaWYgISBkZWZpbmVkKCBTVEFOREFSRCApIFx4MjZceDI2ICEgZGVmaW5lZCggUEhPTkcgKSBceDI2XHgyNiAhIGRlZmluZWQoIE1BVENBUCApXG5cdFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG5cdCNlbmRpZlxuXHR1bmlmb3JtIHZlYzQgY2xpcHBpbmdQbGFuZXNbIE5VTV9DTElQUElOR19QTEFORVMgXTtcbiNlbmRpZiIsY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4OiIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyBceDNlIDAgXHgyNlx4MjYgISBkZWZpbmVkKCBTVEFOREFSRCApIFx4MjZceDI2ICEgZGVmaW5lZCggUEhPTkcgKSBceDI2XHgyNiAhIGRlZmluZWQoIE1BVENBUCApXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmIixjbGlwcGluZ19wbGFuZXNfdmVydGV4OiIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyBceDNlIDAgXHgyNlx4MjYgISBkZWZpbmVkKCBTVEFOREFSRCApIFx4MjZceDI2ICEgZGVmaW5lZCggUEhPTkcgKSBceDI2XHgyNiAhIGRlZmluZWQoIE1BVENBUCApXG5cdHZWaWV3UG9zaXRpb24gXHgzZCAtIG12UG9zaXRpb24ueHl6O1xuI2VuZGlmIiwKY29sb3JfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQ09MT1Jcblx0ZGlmZnVzZUNvbG9yLnJnYiAqXHgzZCB2Q29sb3I7XG4jZW5kaWYiLGNvbG9yX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQ09MT1Jcblx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcbiNlbmRpZiIsY29sb3JfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfQ09MT1Jcblx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcbiNlbmRpZiIsY29sb3JfdmVydGV4OiIjaWZkZWYgVVNFX0NPTE9SXG5cdHZDb2xvci54eXogXHgzZCBjb2xvci54eXo7XG4jZW5kaWYiLGNvbW1vbjoiI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU5XG4jZGVmaW5lIFBJMiA2LjI4MzE4NTMwNzE4XG4jZGVmaW5lIFBJX0hBTEYgMS41NzA3OTYzMjY3OTQ5XG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkgMC4zMTgzMDk4ODYxOFxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJMiAwLjE1OTE1NDk0XG4jZGVmaW5lIExPRzIgMS40NDI2OTVcbiNkZWZpbmUgRVBTSUxPTiAxZS02XG4jZGVmaW5lIHNhdHVyYXRlKGEpIGNsYW1wKCBhLCAwLjAsIDEuMCApXG4jZGVmaW5lIHdoaXRlQ29tcGxlbWVudChhKSAoIDEuMCAtIHNhdHVyYXRlKCBhICkgKVxuZmxvYXQgcG93MiggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeDsgfVxuZmxvYXQgcG93MyggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeCp4OyB9XG5mbG9hdCBwb3c0KCBjb25zdCBpbiBmbG9hdCB4ICkgeyBmbG9hdCB4MiBceDNkIHgqeDsgcmV0dXJuIHgyKngyOyB9XG5mbG9hdCBhdmVyYWdlKCBjb25zdCBpbiB2ZWMzIGNvbG9yICkgeyByZXR1cm4gZG90KCBjb2xvciwgdmVjMyggMC4zMzMzICkgKTsgfVxuaGlnaHAgZmxvYXQgcmFuZCggY29uc3QgaW4gdmVjMiB1diApIHtcblx0Y29uc3QgaGlnaHAgZmxvYXQgYSBceDNkIDEyLjk4OTgsIGIgXHgzZCA3OC4yMzMsIGMgXHgzZCA0Mzc1OC41NDUzO1xuXHRoaWdocCBmbG9hdCBkdCBceDNkIGRvdCggdXYueHksIHZlYzIoIGEsYiApICksIHNuIFx4M2QgbW9kKCBkdCwgUEkgKTtcblx0cmV0dXJuIGZyYWN0KHNpbihzbikgKiBjKTtcbn1cbiNpZmRlZiBISUdIX1BSRUNJU0lPTlxuXHRmbG9hdCBwcmVjaXNpb25TYWZlTGVuZ3RoKCB2ZWMzIHYgKSB7IHJldHVybiBsZW5ndGgoIHYgKTsgfVxuI2Vsc2Vcblx0ZmxvYXQgbWF4MyggdmVjMyB2ICkgeyByZXR1cm4gbWF4KCBtYXgoIHYueCwgdi55ICksIHYueiApOyB9XG5cdGZsb2F0IHByZWNpc2lvblNhZmVMZW5ndGgoIHZlYzMgdiApIHtcblx0XHRmbG9hdCBtYXhDb21wb25lbnQgXHgzZCBtYXgzKCBhYnMoIHYgKSApO1xuXHRcdHJldHVybiBsZW5ndGgoIHYgLyBtYXhDb21wb25lbnQgKSAqIG1heENvbXBvbmVudDtcblx0fVxuI2VuZGlmXG5zdHJ1Y3QgSW5jaWRlbnRMaWdodCB7XG5cdHZlYzMgY29sb3I7XG5cdHZlYzMgZGlyZWN0aW9uO1xuXHRib29sIHZpc2libGU7XG59O1xuc3RydWN0IFJlZmxlY3RlZExpZ2h0IHtcblx0dmVjMyBkaXJlY3REaWZmdXNlO1xuXHR2ZWMzIGRpcmVjdFNwZWN1bGFyO1xuXHR2ZWMzIGluZGlyZWN0RGlmZnVzZTtcblx0dmVjMyBpbmRpcmVjdFNwZWN1bGFyO1xufTtcbnN0cnVjdCBHZW9tZXRyaWNDb250ZXh0IHtcblx0dmVjMyBwb3NpdGlvbjtcblx0dmVjMyBub3JtYWw7XG5cdHZlYzMgdmlld0RpcjtcbiNpZmRlZiBDTEVBUkNPQVRcblx0dmVjMyBjbGVhcmNvYXROb3JtYWw7XG4jZW5kaWZcbn07XG52ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTtcbn1cbnZlYzMgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQoIGRpciwgMC4wICkgKiBtYXRyaXggKS54eXogKTtcbn1cbnZlYzMgcHJvamVjdE9uUGxhbmUoaW4gdmVjMyBwb2ludCwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XG5cdGZsb2F0IGRpc3RhbmNlIFx4M2QgZG90KCBwbGFuZU5vcm1hbCwgcG9pbnQgLSBwb2ludE9uUGxhbmUgKTtcblx0cmV0dXJuIC0gZGlzdGFuY2UgKiBwbGFuZU5vcm1hbCArIHBvaW50O1xufVxuZmxvYXQgc2lkZU9mUGxhbmUoIGluIHZlYzMgcG9pbnQsIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xuXHRyZXR1cm4gc2lnbiggZG90KCBwb2ludCAtIHBvaW50T25QbGFuZSwgcGxhbmVOb3JtYWwgKSApO1xufVxudmVjMyBsaW5lUGxhbmVJbnRlcnNlY3QoIGluIHZlYzMgcG9pbnRPbkxpbmUsIGluIHZlYzMgbGluZURpcmVjdGlvbiwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XG5cdHJldHVybiBsaW5lRGlyZWN0aW9uICogKCBkb3QoIHBsYW5lTm9ybWFsLCBwb2ludE9uUGxhbmUgLSBwb2ludE9uTGluZSApIC8gZG90KCBwbGFuZU5vcm1hbCwgbGluZURpcmVjdGlvbiApICkgKyBwb2ludE9uTGluZTtcbn1cbm1hdDMgdHJhbnNwb3NlTWF0MyggY29uc3QgaW4gbWF0MyBtICkge1xuXHRtYXQzIHRtcDtcblx0dG1wWyAwIF0gXHgzZCB2ZWMzKCBtWyAwIF0ueCwgbVsgMSBdLngsIG1bIDIgXS54ICk7XG5cdHRtcFsgMSBdIFx4M2QgdmVjMyggbVsgMCBdLnksIG1bIDEgXS55LCBtWyAyIF0ueSApO1xuXHR0bXBbIDIgXSBceDNkIHZlYzMoIG1bIDAgXS56LCBtWyAxIF0ueiwgbVsgMiBdLnogKTtcblx0cmV0dXJuIHRtcDtcbn1cbmZsb2F0IGxpbmVhclRvUmVsYXRpdmVMdW1pbmFuY2UoIGNvbnN0IGluIHZlYzMgY29sb3IgKSB7XG5cdHZlYzMgd2VpZ2h0cyBceDNkIHZlYzMoIDAuMjEyNiwgMC43MTUyLCAwLjA3MjIgKTtcblx0cmV0dXJuIGRvdCggd2VpZ2h0cywgY29sb3IucmdiICk7XG59IiwKY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50OiIjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVlxuI2RlZmluZSBjdWJlVVZfdGV4dHVyZVNpemUgKDEwMjQuMClcbmludCBnZXRGYWNlRnJvbURpcmVjdGlvbih2ZWMzIGRpcmVjdGlvbikge1xuXHR2ZWMzIGFic0RpcmVjdGlvbiBceDNkIGFicyhkaXJlY3Rpb24pO1xuXHRpbnQgZmFjZSBceDNkIC0xO1xuXHRpZiggYWJzRGlyZWN0aW9uLnggXHgzZSBhYnNEaXJlY3Rpb24ueiApIHtcblx0XHRpZihhYnNEaXJlY3Rpb24ueCBceDNlIGFic0RpcmVjdGlvbi55IClcblx0XHRcdGZhY2UgXHgzZCBkaXJlY3Rpb24ueCBceDNlIDAuMCA/IDAgOiAzO1xuXHRcdGVsc2Vcblx0XHRcdGZhY2UgXHgzZCBkaXJlY3Rpb24ueSBceDNlIDAuMCA/IDEgOiA0O1xuXHR9XG5cdGVsc2Uge1xuXHRcdGlmKGFic0RpcmVjdGlvbi56IFx4M2UgYWJzRGlyZWN0aW9uLnkgKVxuXHRcdFx0ZmFjZSBceDNkIGRpcmVjdGlvbi56IFx4M2UgMC4wID8gMiA6IDU7XG5cdFx0ZWxzZVxuXHRcdFx0ZmFjZSBceDNkIGRpcmVjdGlvbi55IFx4M2UgMC4wID8gMSA6IDQ7XG5cdH1cblx0cmV0dXJuIGZhY2U7XG59XG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMSAgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMS4wKVxuI2RlZmluZSBjdWJlVVZfcmFuZ2VDbGFtcCAoZXhwMigoNi4wIC0gMS4wKSAqIDIuMCkpXG52ZWMyIE1pcExldmVsSW5mbyggdmVjMyB2ZWMsIGZsb2F0IHJvdWdobmVzc0xldmVsLCBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IHNjYWxlIFx4M2QgZXhwMihjdWJlVVZfbWF4TG9kczEgLSByb3VnaG5lc3NMZXZlbCk7XG5cdGZsb2F0IGR4Um91Z2huZXNzIFx4M2QgZEZkeChyb3VnaG5lc3MpO1xuXHRmbG9hdCBkeVJvdWdobmVzcyBceDNkIGRGZHkocm91Z2huZXNzKTtcblx0dmVjMyBkeCBceDNkIGRGZHgoIHZlYyAqIHNjYWxlICogZHhSb3VnaG5lc3MgKTtcblx0dmVjMyBkeSBceDNkIGRGZHkoIHZlYyAqIHNjYWxlICogZHlSb3VnaG5lc3MgKTtcblx0ZmxvYXQgZCBceDNkIG1heCggZG90KCBkeCwgZHggKSwgZG90KCBkeSwgZHkgKSApO1xuXHRkIFx4M2QgY2xhbXAoZCwgMS4wLCBjdWJlVVZfcmFuZ2VDbGFtcCk7XG5cdGZsb2F0IG1pcExldmVsIFx4M2QgMC41ICogbG9nMihkKTtcblx0cmV0dXJuIHZlYzIoZmxvb3IobWlwTGV2ZWwpLCBmcmFjdChtaXBMZXZlbCkpO1xufVxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczIgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMi4wKVxuI2RlZmluZSBjdWJlVVZfcmNwVGV4dHVyZVNpemUgKDEuMCAvIGN1YmVVVl90ZXh0dXJlU2l6ZSlcbnZlYzIgZ2V0Q3ViZVVWKHZlYzMgZGlyZWN0aW9uLCBmbG9hdCByb3VnaG5lc3NMZXZlbCwgZmxvYXQgbWlwTGV2ZWwpIHtcblx0bWlwTGV2ZWwgXHgzZCByb3VnaG5lc3NMZXZlbCBceDNlIGN1YmVVVl9tYXhMb2RzMiAtIDMuMCA/IDAuMCA6IG1pcExldmVsO1xuXHRmbG9hdCBhIFx4M2QgMTYuMCAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtcblx0dmVjMiBleHAyX3BhY2tlZCBceDNkIGV4cDIoIHZlYzIoIHJvdWdobmVzc0xldmVsLCBtaXBMZXZlbCApICk7XG5cdHZlYzIgcmNwX2V4cDJfcGFja2VkIFx4M2QgdmVjMiggMS4wICkgLyBleHAyX3BhY2tlZDtcblx0ZmxvYXQgcG93U2NhbGUgXHgzZCBleHAyX3BhY2tlZC54ICogZXhwMl9wYWNrZWQueTtcblx0ZmxvYXQgc2NhbGUgXHgzZCByY3BfZXhwMl9wYWNrZWQueCAqIHJjcF9leHAyX3BhY2tlZC55ICogMC4yNTtcblx0ZmxvYXQgbWlwT2Zmc2V0IFx4M2QgMC43NSooMS4wIC0gcmNwX2V4cDJfcGFja2VkLnkpICogcmNwX2V4cDJfcGFja2VkLng7XG5cdGJvb2wgYlJlcyBceDNkIG1pcExldmVsIFx4M2RceDNkIDAuMDtcblx0c2NhbGUgXHgzZCAgYlJlcyBceDI2XHgyNiAoc2NhbGUgXHgzYyBhKSA/IGEgOiBzY2FsZTtcblx0dmVjMyByO1xuXHR2ZWMyIG9mZnNldDtcblx0aW50IGZhY2UgXHgzZCBnZXRGYWNlRnJvbURpcmVjdGlvbihkaXJlY3Rpb24pO1xuXHRmbG9hdCByY3BQb3dTY2FsZSBceDNkIDEuMCAvIHBvd1NjYWxlO1xuXHRpZiggZmFjZSBceDNkXHgzZCAwKSB7XG5cdFx0ciBceDNkIHZlYzMoZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCBceDNkIHZlYzIoMC4wK21pcE9mZnNldCwwLjc1ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55IFx4M2QgYlJlcyBceDI2XHgyNiAob2Zmc2V0LnkgXHgzYyAyLjAqYSkgPyBhIDogb2Zmc2V0Lnk7XG5cdH1cblx0ZWxzZSBpZiggZmFjZSBceDNkXHgzZCAxKSB7XG5cdFx0ciBceDNkIHZlYzMoZGlyZWN0aW9uLnksIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueik7XG5cdFx0b2Zmc2V0IFx4M2QgdmVjMihzY2FsZSttaXBPZmZzZXQsIDAuNzUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IGEgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlIFx4M2RceDNkIDIpIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLngsIGRpcmVjdGlvbi55KTtcblx0XHRvZmZzZXQgXHgzZCB2ZWMyKDIuMCpzY2FsZSttaXBPZmZzZXQsIDAuNzUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IGEgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlIFx4M2RceDNkIDMpIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55KTtcblx0XHRvZmZzZXQgXHgzZCB2ZWMyKDAuMCttaXBPZmZzZXQsMC41ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55IFx4M2QgYlJlcyBceDI2XHgyNiAob2Zmc2V0LnkgXHgzYyAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlIFx4M2RceDNkIDQpIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueSwgZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueik7XG5cdFx0b2Zmc2V0IFx4M2QgdmVjMihzY2FsZSttaXBPZmZzZXQsIDAuNSAqIHJjcFBvd1NjYWxlKTtcblx0XHRvZmZzZXQueSBceDNkIGJSZXMgXHgyNlx4MjYgKG9mZnNldC55IFx4M2MgMi4wKmEpID8gMC4wIDogb2Zmc2V0Lnk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0ciBceDNkIHZlYzMoZGlyZWN0aW9uLnosIC1kaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCBceDNkIHZlYzIoMi4wKnNjYWxlK21pcE9mZnNldCwgMC41ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55IFx4M2QgYlJlcyBceDI2XHgyNiAob2Zmc2V0LnkgXHgzYyAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcblx0fVxuXHRyIFx4M2Qgbm9ybWFsaXplKHIpO1xuXHRmbG9hdCB0ZXhlbE9mZnNldCBceDNkIDAuNSAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtcblx0dmVjMiBzIFx4M2QgKCByLnl6IC8gYWJzKCByLnggKSArIHZlYzIoIDEuMCApICkgKiAwLjU7XG5cdHZlYzIgYmFzZSBceDNkIG9mZnNldCArIHZlYzIoIHRleGVsT2Zmc2V0ICk7XG5cdHJldHVybiBiYXNlICsgcyAqICggc2NhbGUgLSAyLjAgKiB0ZXhlbE9mZnNldCApO1xufVxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczMgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMy4wKVxudmVjNCB0ZXh0dXJlQ3ViZVVWKCBzYW1wbGVyMkQgZW52TWFwLCB2ZWMzIHJlZmxlY3RlZERpcmVjdGlvbiwgZmxvYXQgcm91Z2huZXNzICkge1xuXHRmbG9hdCByb3VnaG5lc3NWYWwgXHgzZCByb3VnaG5lc3MqIGN1YmVVVl9tYXhMb2RzMztcblx0ZmxvYXQgcjEgXHgzZCBmbG9vcihyb3VnaG5lc3NWYWwpO1xuXHRmbG9hdCByMiBceDNkIHIxICsgMS4wO1xuXHRmbG9hdCB0IFx4M2QgZnJhY3Qocm91Z2huZXNzVmFsKTtcblx0dmVjMiBtaXBJbmZvIFx4M2QgTWlwTGV2ZWxJbmZvKHJlZmxlY3RlZERpcmVjdGlvbiwgcjEsIHJvdWdobmVzcyk7XG5cdGZsb2F0IHMgXHgzZCBtaXBJbmZvLnk7XG5cdGZsb2F0IGxldmVsMCBceDNkIG1pcEluZm8ueDtcblx0ZmxvYXQgbGV2ZWwxIFx4M2QgbGV2ZWwwICsgMS4wO1xuXHRsZXZlbDEgXHgzZCBsZXZlbDEgXHgzZSA1LjAgPyA1LjAgOiBsZXZlbDE7XG5cdGxldmVsMCArXHgzZCBtaW4oIGZsb29yKCBzICsgMC41ICksIDUuMCApO1xuXHR2ZWMyIHV2XzEwIFx4M2QgZ2V0Q3ViZVVWKHJlZmxlY3RlZERpcmVjdGlvbiwgcjEsIGxldmVsMCk7XG5cdHZlYzQgY29sb3IxMCBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXZfMTApKTtcblx0dmVjMiB1dl8yMCBceDNkIGdldEN1YmVVVihyZWZsZWN0ZWREaXJlY3Rpb24sIHIyLCBsZXZlbDApO1xuXHR2ZWM0IGNvbG9yMjAgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKHRleHR1cmUyRChlbnZNYXAsIHV2XzIwKSk7XG5cdHZlYzQgcmVzdWx0IFx4M2QgbWl4KGNvbG9yMTAsIGNvbG9yMjAsIHQpO1xuXHRyZXR1cm4gdmVjNChyZXN1bHQucmdiLCAxLjApO1xufVxuI2VuZGlmIiwKZGVmYXVsdG5vcm1hbF92ZXJ0ZXg6InZlYzMgdHJhbnNmb3JtZWROb3JtYWwgXHgzZCBub3JtYWxNYXRyaXggKiBvYmplY3ROb3JtYWw7XG4jaWZkZWYgRkxJUF9TSURFRFxuXHR0cmFuc2Zvcm1lZE5vcm1hbCBceDNkIC0gdHJhbnNmb3JtZWROb3JtYWw7XG4jZW5kaWZcbiNpZmRlZiBVU0VfVEFOR0VOVFxuXHR2ZWMzIHRyYW5zZm9ybWVkVGFuZ2VudCBceDNkIG5vcm1hbE1hdHJpeCAqIG9iamVjdFRhbmdlbnQ7XG5cdCNpZmRlZiBGTElQX1NJREVEXG5cdFx0dHJhbnNmb3JtZWRUYW5nZW50IFx4M2QgLSB0cmFuc2Zvcm1lZFRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmIixkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGRpc3BsYWNlbWVudE1hcDtcblx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRTY2FsZTtcblx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRCaWFzO1xuI2VuZGlmIixkaXNwbGFjZW1lbnRtYXBfdmVydGV4OiIjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHR0cmFuc2Zvcm1lZCArXHgzZCBub3JtYWxpemUoIG9iamVjdE5vcm1hbCApICogKCB0ZXh0dXJlMkQoIGRpc3BsYWNlbWVudE1hcCwgdXYgKS54ICogZGlzcGxhY2VtZW50U2NhbGUgKyBkaXNwbGFjZW1lbnRCaWFzICk7XG4jZW5kaWYiLAplbWlzc2l2ZW1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxuXHR2ZWM0IGVtaXNzaXZlQ29sb3IgXHgzZCB0ZXh0dXJlMkQoIGVtaXNzaXZlTWFwLCB2VXYgKTtcblx0ZW1pc3NpdmVDb2xvci5yZ2IgXHgzZCBlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXIoIGVtaXNzaXZlQ29sb3IgKS5yZ2I7XG5cdHRvdGFsRW1pc3NpdmVSYWRpYW5jZSAqXHgzZCBlbWlzc2l2ZUNvbG9yLnJnYjtcbiNlbmRpZiIsZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBlbWlzc2l2ZU1hcDtcbiNlbmRpZiIsZW5jb2RpbmdzX2ZyYWdtZW50OiJnbF9GcmFnQ29sb3IgXHgzZCBsaW5lYXJUb091dHB1dFRleGVsKCBnbF9GcmFnQ29sb3IgKTsiLGVuY29kaW5nc19wYXJzX2ZyYWdtZW50OiJcbnZlYzQgTGluZWFyVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2YWx1ZTtcbn1cbnZlYzQgR2FtbWFUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XG5cdHJldHVybiB2ZWM0KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggZ2FtbWFGYWN0b3IgKSApLCB2YWx1ZS5hICk7XG59XG52ZWM0IExpbmVhclRvR2FtbWEoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IGdhbW1hRmFjdG9yICkge1xuXHRyZXR1cm4gdmVjNCggcG93KCB2YWx1ZS5yZ2IsIHZlYzMoIDEuMCAvIGdhbW1hRmFjdG9yICkgKSwgdmFsdWUuYSApO1xufVxudmVjNCBzUkdCVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiICogMC45NDc4NjcyOTg2ICsgdmVjMyggMC4wNTIxMzI3MDE0ICksIHZlYzMoIDIuNCApICksIHZhbHVlLnJnYiAqIDAuMDc3Mzk5MzgwOCwgdmVjMyggbGVzc1RoYW5FcXVhbCggdmFsdWUucmdiLCB2ZWMzKCAwLjA0MDQ1ICkgKSApICksIHZhbHVlLmEgKTtcbn1cbnZlYzQgTGluZWFyVG9zUkdCKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMC40MTY2NiApICkgKiAxLjA1NSAtIHZlYzMoIDAuMDU1ICksIHZhbHVlLnJnYiAqIDEyLjkyLCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDAzMTMwOCApICkgKSApLCB2YWx1ZS5hICk7XG59XG52ZWM0IFJHQkVUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqIGV4cDIoIHZhbHVlLmEgKiAyNTUuMCAtIDEyOC4wICksIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQkUoIGluIHZlYzQgdmFsdWUgKSB7XG5cdGZsb2F0IG1heENvbXBvbmVudCBceDNkIG1heCggbWF4KCB2YWx1ZS5yLCB2YWx1ZS5nICksIHZhbHVlLmIgKTtcblx0ZmxvYXQgZkV4cCBceDNkIGNsYW1wKCBjZWlsKCBsb2cyKCBtYXhDb21wb25lbnQgKSApLCAtMTI4LjAsIDEyNy4wICk7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgLyBleHAyKCBmRXhwICksICggZkV4cCArIDEyOC4wICkgLyAyNTUuMCApO1xufVxudmVjNCBSR0JNVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogdmFsdWUuYSAqIG1heFJhbmdlLCAxLjAgKTtcbn1cbnZlYzQgTGluZWFyVG9SR0JNKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcblx0ZmxvYXQgbWF4UkdCIFx4M2QgbWF4KCB2YWx1ZS5yLCBtYXgoIHZhbHVlLmcsIHZhbHVlLmIgKSApO1xuXHRmbG9hdCBNIFx4M2QgY2xhbXAoIG1heFJHQiAvIG1heFJhbmdlLCAwLjAsIDEuMCApO1xuXHRNIFx4M2QgY2VpbCggTSAqIDI1NS4wICkgLyAyNTUuMDtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvICggTSAqIG1heFJhbmdlICksIE0gKTtcbn1cbnZlYzQgUkdCRFRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICggKCBtYXhSYW5nZSAvIDI1NS4wICkgLyB2YWx1ZS5hICksIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQkQoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRmbG9hdCBtYXhSR0IgXHgzZCBtYXgoIHZhbHVlLnIsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XG5cdGZsb2F0IEQgXHgzZCBtYXgoIG1heFJhbmdlIC8gbWF4UkdCLCAxLjAgKTtcblx0RCBceDNkIG1pbiggZmxvb3IoIEQgKSAvIDI1NS4wLCAxLjAgKTtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICggRCAqICggMjU1LjAgLyBtYXhSYW5nZSApICksIEQgKTtcbn1cbmNvbnN0IG1hdDMgY0xvZ0x1dk0gXHgzZCBtYXQzKCAwLjIyMDksIDAuMzM5MCwgMC40MTg0LCAwLjExMzgsIDAuNjc4MCwgMC43MzE5LCAwLjAxMDIsIDAuMTEzMCwgMC4yOTY5ICk7XG52ZWM0IExpbmVhclRvTG9nTHV2KCBpbiB2ZWM0IHZhbHVlICkgIHtcblx0dmVjMyBYcF9ZX1hZWnAgXHgzZCBjTG9nTHV2TSAqIHZhbHVlLnJnYjtcblx0WHBfWV9YWVpwIFx4M2QgbWF4KCBYcF9ZX1hZWnAsIHZlYzMoIDFlLTYsIDFlLTYsIDFlLTYgKSApO1xuXHR2ZWM0IHZSZXN1bHQ7XG5cdHZSZXN1bHQueHkgXHgzZCBYcF9ZX1hZWnAueHkgLyBYcF9ZX1hZWnAuejtcblx0ZmxvYXQgTGUgXHgzZCAyLjAgKiBsb2cyKFhwX1lfWFlacC55KSArIDEyNy4wO1xuXHR2UmVzdWx0LncgXHgzZCBmcmFjdCggTGUgKTtcblx0dlJlc3VsdC56IFx4M2QgKCBMZSAtICggZmxvb3IoIHZSZXN1bHQudyAqIDI1NS4wICkgKSAvIDI1NS4wICkgLyAyNTUuMDtcblx0cmV0dXJuIHZSZXN1bHQ7XG59XG5jb25zdCBtYXQzIGNMb2dMdXZJbnZlcnNlTSBceDNkIG1hdDMoIDYuMDAxNCwgLTIuNzAwOCwgLTEuNzk5NiwgLTEuMzMyMCwgMy4xMDI5LCAtNS43NzIxLCAwLjMwMDgsIC0xLjA4ODIsIDUuNjI2OCApO1xudmVjNCBMb2dMdXZUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0ZmxvYXQgTGUgXHgzZCB2YWx1ZS56ICogMjU1LjAgKyB2YWx1ZS53O1xuXHR2ZWMzIFhwX1lfWFlacDtcblx0WHBfWV9YWVpwLnkgXHgzZCBleHAyKCAoIExlIC0gMTI3LjAgKSAvIDIuMCApO1xuXHRYcF9ZX1hZWnAueiBceDNkIFhwX1lfWFlacC55IC8gdmFsdWUueTtcblx0WHBfWV9YWVpwLnggXHgzZCB2YWx1ZS54ICogWHBfWV9YWVpwLno7XG5cdHZlYzMgdlJHQiBceDNkIGNMb2dMdXZJbnZlcnNlTSAqIFhwX1lfWFlacC5yZ2I7XG5cdHJldHVybiB2ZWM0KCBtYXgoIHZSR0IsIDAuMCApLCAxLjAgKTtcbn0iLAplbnZtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpZmRlZiBFTlZfV09STERQT1Ncblx0XHR2ZWMzIGNhbWVyYVRvVmVydGV4IFx4M2Qgbm9ybWFsaXplKCB2V29ybGRQb3NpdGlvbiAtIGNhbWVyYVBvc2l0aW9uICk7XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0XHR2ZWMzIHJlZmxlY3RWZWMgXHgzZCByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTtcblx0XHQjZWxzZVxuXHRcdFx0dmVjMyByZWZsZWN0VmVjIFx4M2QgcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZcblx0I2Vsc2Vcblx0XHR2ZWMzIHJlZmxlY3RWZWMgXHgzZCB2UmVmbGVjdDtcblx0I2VuZGlmXG5cdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0dmVjNCBlbnZDb2xvciBceDNkIHRleHR1cmVDdWJlKCBlbnZNYXAsIHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKSApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9FUVVJUkVDIClcblx0XHR2ZWMyIHNhbXBsZVVWO1xuXHRcdHJlZmxlY3RWZWMgXHgzZCBub3JtYWxpemUoIHJlZmxlY3RWZWMgKTtcblx0XHRzYW1wbGVVVi55IFx4M2QgYXNpbiggY2xhbXAoIHJlZmxlY3RWZWMueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xuXHRcdHNhbXBsZVVWLnggXHgzZCBhdGFuKCByZWZsZWN0VmVjLnosIHJlZmxlY3RWZWMueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XG5cdFx0dmVjNCBlbnZDb2xvciBceDNkIHRleHR1cmUyRCggZW52TWFwLCBzYW1wbGVVViApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9TUEhFUkUgKVxuXHRcdHJlZmxlY3RWZWMgXHgzZCBub3JtYWxpemUoIHJlZmxlY3RWZWMgKTtcblx0XHR2ZWMzIHJlZmxlY3RWaWV3IFx4M2Qgbm9ybWFsaXplKCAoIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZsZWN0VmVjLCAwLjAgKSApLnh5eiArIHZlYzMoIDAuMCwgMC4wLCAxLjAgKSApO1xuXHRcdHZlYzQgZW52Q29sb3IgXHgzZCB0ZXh0dXJlMkQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUgKTtcblx0I2Vsc2Vcblx0XHR2ZWM0IGVudkNvbG9yIFx4M2QgdmVjNCggMC4wICk7XG5cdCNlbmRpZlxuXHRlbnZDb2xvciBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIoIGVudkNvbG9yICk7XG5cdCNpZmRlZiBFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFlcblx0XHRvdXRnb2luZ0xpZ2h0IFx4M2QgbWl4KCBvdXRnb2luZ0xpZ2h0LCBvdXRnb2luZ0xpZ2h0ICogZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19NSVggKVxuXHRcdG91dGdvaW5nTGlnaHQgXHgzZCBtaXgoIG91dGdvaW5nTGlnaHQsIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfQkxFTkRJTkdfQUREIClcblx0XHRvdXRnb2luZ0xpZ2h0ICtceDNkIGVudkNvbG9yLnh5eiAqIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHk7XG5cdCNlbmRpZlxuI2VuZGlmIiwKZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VOVk1BUFxuXHR1bmlmb3JtIGZsb2F0IGVudk1hcEludGVuc2l0eTtcblx0dW5pZm9ybSBmbG9hdCBmbGlwRW52TWFwO1xuXHR1bmlmb3JtIGludCBtYXhNaXBMZXZlbDtcblx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHR1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcblx0I2Vsc2Vcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7XG5cdCNlbmRpZlxuXHRcbiNlbmRpZiIsZW52bWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdHVuaWZvcm0gZmxvYXQgcmVmbGVjdGl2aXR5O1xuXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKVxuXHRcdCNkZWZpbmUgRU5WX1dPUkxEUE9TXG5cdCNlbmRpZlxuXHQjaWZkZWYgRU5WX1dPUkxEUE9TXG5cdFx0dmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuXHRcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xuXHQjZWxzZVxuXHRcdHZhcnlpbmcgdmVjMyB2UmVmbGVjdDtcblx0I2VuZGlmXG4jZW5kaWYiLAplbnZtYXBfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fGRlZmluZWQoIFBIT05HIClcblx0XHQjZGVmaW5lIEVOVl9XT1JMRFBPU1xuXHQjZW5kaWZcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdFxuXHRcdHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcblx0I2Vsc2Vcblx0XHR2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7XG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbmRpZlxuI2VuZGlmIixlbnZtYXBfcGh5c2ljYWxfcGFyc19mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKVxuXHQjaWZkZWYgRU5WTUFQX01PREVfUkVGUkFDVElPTlxuXHRcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xuXHQjZW5kaWZcblx0dmVjMyBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGdlb21ldHJ5Lm5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0XHR2ZWMzIHF1ZXJ5VmVjIFx4M2QgdmVjMyggZmxpcEVudk1hcCAqIHdvcmxkTm9ybWFsLngsIHdvcmxkTm9ybWFsLnl6ICk7XG5cdFx0XHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlQ3ViZUxvZEVYVCggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcblx0XHRcdCNlbHNlXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlQ3ViZSggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcblx0XHRcdCNlbmRpZlxuXHRcdFx0ZW52TWFwQ29sb3IucmdiIFx4M2QgZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XG5cdFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXG5cdFx0XHR2ZWMzIHF1ZXJ5VmVjIFx4M2QgdmVjMyggZmxpcEVudk1hcCAqIHdvcmxkTm9ybWFsLngsIHdvcmxkTm9ybWFsLnl6ICk7XG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZUN1YmVVViggZW52TWFwLCBxdWVyeVZlYywgMS4wICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB2ZWM0KCAwLjAgKTtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gUEkgKiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7XG5cdH1cblx0ZmxvYXQgZ2V0U3BlY3VsYXJNSVBMZXZlbCggY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiBpbnQgbWF4TUlQTGV2ZWwgKSB7XG5cdFx0ZmxvYXQgbWF4TUlQTGV2ZWxTY2FsYXIgXHgzZCBmbG9hdCggbWF4TUlQTGV2ZWwgKTtcblx0XHRmbG9hdCBzaWdtYSBceDNkIFBJICogcm91Z2huZXNzICogcm91Z2huZXNzIC8gKCAxLjAgKyByb3VnaG5lc3MgKTtcblx0XHRmbG9hdCBkZXNpcmVkTUlQTGV2ZWwgXHgzZCBtYXhNSVBMZXZlbFNjYWxhciArIGxvZzIoIHNpZ21hICk7XG5cdFx0cmV0dXJuIGNsYW1wKCBkZXNpcmVkTUlQTGV2ZWwsIDAuMCwgbWF4TUlQTGV2ZWxTY2FsYXIgKTtcblx0fVxuXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcblx0XHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxuXHRcdCAgdmVjMyByZWZsZWN0VmVjIFx4M2QgcmVmbGVjdCggLXZpZXdEaXIsIG5vcm1hbCApO1xuXHRcdCAgcmVmbGVjdFZlYyBceDNkIG5vcm1hbGl6ZSggbWl4KCByZWZsZWN0VmVjLCBub3JtYWwsIHJvdWdobmVzcyAqIHJvdWdobmVzcykgKTtcblx0XHQjZWxzZVxuXHRcdCAgdmVjMyByZWZsZWN0VmVjIFx4M2QgcmVmcmFjdCggLXZpZXdEaXIsIG5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XG5cdFx0I2VuZGlmXG5cdFx0cmVmbGVjdFZlYyBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHJlZmxlY3RWZWMsIHZpZXdNYXRyaXggKTtcblx0XHRmbG9hdCBzcGVjdWxhck1JUExldmVsIFx4M2QgZ2V0U3BlY3VsYXJNSVBMZXZlbCggcm91Z2huZXNzLCBtYXhNSVBMZXZlbCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0XHR2ZWMzIHF1ZXJ5UmVmbGVjdFZlYyBceDNkIHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlTG9kRVhUKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRcdHZlYzMgcXVlcnlSZWZsZWN0VmVjIFx4M2QgdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApO1xuXHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlVVYoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCByb3VnaG5lc3MgKTtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9FUVVJUkVDIClcblx0XHRcdHZlYzIgc2FtcGxlVVY7XG5cdFx0XHRzYW1wbGVVVi55IFx4M2QgYXNpbiggY2xhbXAoIHJlZmxlY3RWZWMueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xuXHRcdFx0c2FtcGxlVVYueCBceDNkIGF0YW4oIHJlZmxlY3RWZWMueiwgcmVmbGVjdFZlYy54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmUyRExvZEVYVCggZW52TWFwLCBzYW1wbGVVViwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmUyRCggZW52TWFwLCBzYW1wbGVVViwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9TUEhFUkUgKVxuXHRcdFx0dmVjMyByZWZsZWN0VmlldyBceDNkIG5vcm1hbGl6ZSggKCB2aWV3TWF0cml4ICogdmVjNCggcmVmbGVjdFZlYywgMC4wICkgKS54eXogKyB2ZWMzKCAwLjAsMC4wLDEuMCApICk7XG5cdFx0XHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlMkRMb2RFWFQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcblx0XHRcdCNlbHNlXG5cdFx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlMkQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcblx0XHRcdCNlbmRpZlxuXHRcdFx0ZW52TWFwQ29sb3IucmdiIFx4M2QgZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XG5cdFx0I2VuZGlmXG5cdFx0cmV0dXJuIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcblx0fVxuI2VuZGlmIiwKZW52bWFwX3ZlcnRleDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdHZXb3JsZFBvc2l0aW9uIFx4M2Qgd29ybGRQb3NpdGlvbi54eXo7XG5cdCNlbHNlXG5cdFx0dmVjMyBjYW1lcmFUb1ZlcnRleCBceDNkIG5vcm1hbGl6ZSggd29ybGRQb3NpdGlvbi54eXogLSBjYW1lcmFQb3NpdGlvbiApO1xuXHRcdHZlYzMgd29ybGROb3JtYWwgXHgzZCBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCB0cmFuc2Zvcm1lZE5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0XHR2UmVmbGVjdCBceDNkIHJlZmxlY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCApO1xuXHRcdCNlbHNlXG5cdFx0XHR2UmVmbGVjdCBceDNkIHJlZnJhY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XG5cdFx0I2VuZGlmXG5cdCNlbmRpZlxuI2VuZGlmIixmb2dfdmVydGV4OiIjaWZkZWYgVVNFX0ZPR1xuXHRmb2dEZXB0aCBceDNkIC1tdlBvc2l0aW9uLno7XG4jZW5kaWYiLApmb2dfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfRk9HXG5cdHZhcnlpbmcgZmxvYXQgZm9nRGVwdGg7XG4jZW5kaWYiLGZvZ19mcmFnbWVudDoiI2lmZGVmIFVTRV9GT0dcblx0I2lmZGVmIEZPR19FWFAyXG5cdFx0ZmxvYXQgZm9nRmFjdG9yIFx4M2QgMS4wIC0gZXhwKCAtIGZvZ0RlbnNpdHkgKiBmb2dEZW5zaXR5ICogZm9nRGVwdGggKiBmb2dEZXB0aCApO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGZvZ0ZhY3RvciBceDNkIHNtb290aHN0ZXAoIGZvZ05lYXIsIGZvZ0ZhciwgZm9nRGVwdGggKTtcblx0I2VuZGlmXG5cdGdsX0ZyYWdDb2xvci5yZ2IgXHgzZCBtaXgoIGdsX0ZyYWdDb2xvci5yZ2IsIGZvZ0NvbG9yLCBmb2dGYWN0b3IgKTtcbiNlbmRpZiIsZm9nX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRk9HXG5cdHVuaWZvcm0gdmVjMyBmb2dDb2xvcjtcblx0dmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcblx0I2lmZGVmIEZPR19FWFAyXG5cdFx0dW5pZm9ybSBmbG9hdCBmb2dEZW5zaXR5O1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gZmxvYXQgZm9nTmVhcjtcblx0XHR1bmlmb3JtIGZsb2F0IGZvZ0Zhcjtcblx0I2VuZGlmXG4jZW5kaWYiLApncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVE9PTlxuXHR1bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudE1hcDtcblx0dmVjMyBnZXRHcmFkaWVudElycmFkaWFuY2UoIHZlYzMgbm9ybWFsLCB2ZWMzIGxpZ2h0RGlyZWN0aW9uICkge1xuXHRcdGZsb2F0IGRvdE5MIFx4M2QgZG90KCBub3JtYWwsIGxpZ2h0RGlyZWN0aW9uICk7XG5cdFx0dmVjMiBjb29yZCBceDNkIHZlYzIoIGRvdE5MICogMC41ICsgMC41LCAwLjAgKTtcblx0XHQjaWZkZWYgVVNFX0dSQURJRU5UTUFQXG5cdFx0XHRyZXR1cm4gdGV4dHVyZTJEKCBncmFkaWVudE1hcCwgY29vcmQgKS5yZ2I7XG5cdFx0I2Vsc2Vcblx0XHRcdHJldHVybiAoIGNvb3JkLnggXHgzYyAwLjcgKSA/IHZlYzMoIDAuNyApIDogdmVjMyggMS4wICk7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZiIsbGlnaHRtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTElHSFRNQVBcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIFBJICogdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApLnh5eiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xuI2VuZGlmIiwKbGlnaHRtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9MSUdIVE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBsaWdodE1hcDtcblx0dW5pZm9ybSBmbG9hdCBsaWdodE1hcEludGVuc2l0eTtcbiNlbmRpZiIsbGlnaHRzX2xhbWJlcnRfdmVydGV4OiJ2ZWMzIGRpZmZ1c2UgXHgzZCB2ZWMzKCAxLjAgKTtcbkdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnk7XG5nZW9tZXRyeS5wb3NpdGlvbiBceDNkIG12UG9zaXRpb24ueHl6O1xuZ2VvbWV0cnkubm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuZ2VvbWV0cnkudmlld0RpciBceDNkIG5vcm1hbGl6ZSggLW12UG9zaXRpb24ueHl6ICk7XG5HZW9tZXRyaWNDb250ZXh0IGJhY2tHZW9tZXRyeTtcbmJhY2tHZW9tZXRyeS5wb3NpdGlvbiBceDNkIGdlb21ldHJ5LnBvc2l0aW9uO1xuYmFja0dlb21ldHJ5Lm5vcm1hbCBceDNkIC1nZW9tZXRyeS5ub3JtYWw7XG5iYWNrR2VvbWV0cnkudmlld0RpciBceDNkIGdlb21ldHJ5LnZpZXdEaXI7XG52TGlnaHRGcm9udCBceDNkIHZlYzMoIDAuMCApO1xudkluZGlyZWN0RnJvbnQgXHgzZCB2ZWMzKCAwLjAgKTtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dkxpZ2h0QmFjayBceDNkIHZlYzMoIDAuMCApO1xuXHR2SW5kaXJlY3RCYWNrIFx4M2QgdmVjMyggMC4wICk7XG4jZW5kaWZcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XG5mbG9hdCBkb3ROTDtcbnZlYzMgZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuI2lmIE5VTV9QT0lOVF9MSUdIVFMgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggcG9pbnRMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0ZG90TkwgXHgzZCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlIFx4M2QgUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHR2TGlnaHRGcm9udCArXHgzZCBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2TGlnaHRCYWNrICtceDNkIHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1NQT1RfTElHSFRTIFx4M2UgMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdGRvdE5MIFx4M2QgZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSBceDNkIFBJICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0dkxpZ2h0RnJvbnQgK1x4M2Qgc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdFx0dkxpZ2h0QmFjayArXHgzZCBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9ESVJfTElHSFRTIFx4M2UgMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xuXHRcdGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHRkb3ROTCBceDNkIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgXHgzZCBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdHZMaWdodEZyb250ICtceDNkIHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZMaWdodEJhY2sgK1x4M2Qgc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWZcbiNpZiBOVU1fSEVNSV9MSUdIVFMgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xuXHRcdHZJbmRpcmVjdEZyb250ICtceDNkIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkgKTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2SW5kaXJlY3RCYWNrICtceDNkIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgYmFja0dlb21ldHJ5ICk7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZiIsCmxpZ2h0c19wYXJzX2JlZ2luOiJ1bmlmb3JtIHZlYzMgYW1iaWVudExpZ2h0Q29sb3I7XG51bmlmb3JtIHZlYzMgbGlnaHRQcm9iZVsgOSBdO1xudmVjMyBzaEdldElycmFkaWFuY2VBdCggaW4gdmVjMyBub3JtYWwsIGluIHZlYzMgc2hDb2VmZmljaWVudHNbIDkgXSApIHtcblx0ZmxvYXQgeCBceDNkIG5vcm1hbC54LCB5IFx4M2Qgbm9ybWFsLnksIHogXHgzZCBub3JtYWwuejtcblx0dmVjMyByZXN1bHQgXHgzZCBzaENvZWZmaWNpZW50c1sgMCBdICogMC44ODYyMjc7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgMSBdICogMi4wICogMC41MTE2NjQgKiB5O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDIgXSAqIDIuMCAqIDAuNTExNjY0ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyAzIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHg7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNCBdICogMi4wICogMC40MjkwNDMgKiB4ICogeTtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA1IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHkgKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDYgXSAqICggMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNyBdICogMi4wICogMC40MjkwNDMgKiB4ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA4IF0gKiAwLjQyOTA0MyAqICggeCAqIHggLSB5ICogeSApO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxudmVjMyBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBsaWdodFByb2JlWyA5IF0sIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnkgKSB7XG5cdHZlYzMgd29ybGROb3JtYWwgXHgzZCBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBnZW9tZXRyeS5ub3JtYWwsIHZpZXdNYXRyaXggKTtcblx0dmVjMyBpcnJhZGlhbmNlIFx4M2Qgc2hHZXRJcnJhZGlhbmNlQXQoIHdvcmxkTm9ybWFsLCBsaWdodFByb2JlICk7XG5cdHJldHVybiBpcnJhZGlhbmNlO1xufVxudmVjMyBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGFtYmllbnRMaWdodENvbG9yICkge1xuXHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBhbWJpZW50TGlnaHRDb2xvcjtcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0aXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0I2VuZGlmXG5cdHJldHVybiBpcnJhZGlhbmNlO1xufVxuI2lmIE5VTV9ESVJfTElHSFRTIFx4M2UgMFxuXHRzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodCB7XG5cdFx0dmVjMyBkaXJlY3Rpb247XG5cdFx0dmVjMyBjb2xvcjtcblx0XHRpbnQgc2hhZG93O1xuXHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0fTtcblx0dW5pZm9ybSBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHRzWyBOVU1fRElSX0xJR0hUUyBdO1xuXHR2b2lkIGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICkge1xuXHRcdGRpcmVjdExpZ2h0LmNvbG9yIFx4M2QgZGlyZWN0aW9uYWxMaWdodC5jb2xvcjtcblx0XHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gXHgzZCBkaXJlY3Rpb25hbExpZ2h0LmRpcmVjdGlvbjtcblx0XHRkaXJlY3RMaWdodC52aXNpYmxlIFx4M2QgdHJ1ZTtcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1BPSU5UX0xJR0hUUyBceDNlIDBcblx0c3RydWN0IFBvaW50TGlnaHQge1xuXHRcdHZlYzMgcG9zaXRpb247XG5cdFx0dmVjMyBjb2xvcjtcblx0XHRmbG9hdCBkaXN0YW5jZTtcblx0XHRmbG9hdCBkZWNheTtcblx0XHRpbnQgc2hhZG93O1xuXHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0XHRmbG9hdCBzaGFkb3dDYW1lcmFOZWFyO1xuXHRcdGZsb2F0IHNoYWRvd0NhbWVyYUZhcjtcblx0fTtcblx0dW5pZm9ybSBQb2ludExpZ2h0IHBvaW50TGlnaHRzWyBOVU1fUE9JTlRfTElHSFRTIF07XG5cdHZvaWQgZ2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIFBvaW50TGlnaHQgcG9pbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgKSB7XG5cdFx0dmVjMyBsVmVjdG9yIFx4M2QgcG9pbnRMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiBceDNkIG5vcm1hbGl6ZSggbFZlY3RvciApO1xuXHRcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgXHgzZCBsZW5ndGgoIGxWZWN0b3IgKTtcblx0XHRkaXJlY3RMaWdodC5jb2xvciBceDNkIHBvaW50TGlnaHQuY29sb3I7XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKlx4M2QgcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggbGlnaHREaXN0YW5jZSwgcG9pbnRMaWdodC5kaXN0YW5jZSwgcG9pbnRMaWdodC5kZWNheSApO1xuXHRcdGRpcmVjdExpZ2h0LnZpc2libGUgXHgzZCAoIGRpcmVjdExpZ2h0LmNvbG9yICFceDNkIHZlYzMoIDAuMCApICk7XG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9TUE9UX0xJR0hUUyBceDNlIDBcblx0c3RydWN0IFNwb3RMaWdodCB7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGRpcmVjdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGZsb2F0IGRpc3RhbmNlO1xuXHRcdGZsb2F0IGRlY2F5O1xuXHRcdGZsb2F0IGNvbmVDb3M7XG5cdFx0ZmxvYXQgcGVudW1icmFDb3M7XG5cdFx0aW50IHNoYWRvdztcblx0XHRmbG9hdCBzaGFkb3dCaWFzO1xuXHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcblx0XHR2ZWMyIHNoYWRvd01hcFNpemU7XG5cdH07XG5cdHVuaWZvcm0gU3BvdExpZ2h0IHNwb3RMaWdodHNbIE5VTV9TUE9UX0xJR0hUUyBdO1xuXHR2b2lkIGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIFNwb3RMaWdodCBzcG90TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICApIHtcblx0XHR2ZWMzIGxWZWN0b3IgXHgzZCBzcG90TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeS5wb3NpdGlvbjtcblx0XHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gXHgzZCBub3JtYWxpemUoIGxWZWN0b3IgKTtcblx0XHRmbG9hdCBsaWdodERpc3RhbmNlIFx4M2QgbGVuZ3RoKCBsVmVjdG9yICk7XG5cdFx0ZmxvYXQgYW5nbGVDb3MgXHgzZCBkb3QoIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgc3BvdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGlmICggYW5nbGVDb3MgXHgzZSBzcG90TGlnaHQuY29uZUNvcyApIHtcblx0XHRcdGZsb2F0IHNwb3RFZmZlY3QgXHgzZCBzbW9vdGhzdGVwKCBzcG90TGlnaHQuY29uZUNvcywgc3BvdExpZ2h0LnBlbnVtYnJhQ29zLCBhbmdsZUNvcyApO1xuXHRcdFx0ZGlyZWN0TGlnaHQuY29sb3IgXHgzZCBzcG90TGlnaHQuY29sb3I7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciAqXHgzZCBzcG90RWZmZWN0ICogcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggbGlnaHREaXN0YW5jZSwgc3BvdExpZ2h0LmRpc3RhbmNlLCBzcG90TGlnaHQuZGVjYXkgKTtcblx0XHRcdGRpcmVjdExpZ2h0LnZpc2libGUgXHgzZCB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciBceDNkIHZlYzMoIDAuMCApO1xuXHRcdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSBceDNkIGZhbHNlO1xuXHRcdH1cblx0fVxuI2VuZGlmXG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXHgzZSAwXG5cdHN0cnVjdCBSZWN0QXJlYUxpZ2h0IHtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdHZlYzMgcG9zaXRpb247XG5cdFx0dmVjMyBoYWxmV2lkdGg7XG5cdFx0dmVjMyBoYWxmSGVpZ2h0O1xuXHR9O1xuXHR1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMTtcdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18yO1xuXHR1bmlmb3JtIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodHNbIE5VTV9SRUNUX0FSRUFfTElHSFRTIF07XG4jZW5kaWZcbiNpZiBOVU1fSEVNSV9MSUdIVFMgXHgzZSAwXG5cdHN0cnVjdCBIZW1pc3BoZXJlTGlnaHQge1xuXHRcdHZlYzMgZGlyZWN0aW9uO1xuXHRcdHZlYzMgc2t5Q29sb3I7XG5cdFx0dmVjMyBncm91bmRDb2xvcjtcblx0fTtcblx0dW5pZm9ybSBIZW1pc3BoZXJlTGlnaHQgaGVtaXNwaGVyZUxpZ2h0c1sgTlVNX0hFTUlfTElHSFRTIF07XG5cdHZlYzMgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gSGVtaXNwaGVyZUxpZ2h0IGhlbWlMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSApIHtcblx0XHRmbG9hdCBkb3ROTCBceDNkIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoZW1pTGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZmxvYXQgaGVtaURpZmZ1c2VXZWlnaHQgXHgzZCAwLjUgKiBkb3ROTCArIDAuNTtcblx0XHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBtaXgoIGhlbWlMaWdodC5ncm91bmRDb2xvciwgaGVtaUxpZ2h0LnNreUNvbG9yLCBoZW1pRGlmZnVzZVdlaWdodCApO1xuXHRcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdFx0aXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gaXJyYWRpYW5jZTtcblx0fVxuI2VuZGlmIiwKbGlnaHRzX3Bob25nX2ZyYWdtZW50OiJCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWw7XG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgXHgzZCBkaWZmdXNlQ29sb3IucmdiO1xubWF0ZXJpYWwuc3BlY3VsYXJDb2xvciBceDNkIHNwZWN1bGFyO1xubWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgXHgzZCBzaGluaW5lc3M7XG5tYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoIFx4M2Qgc3BlY3VsYXJTdHJlbmd0aDsiLGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50OiJ2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbnN0cnVjdCBCbGlublBob25nTWF0ZXJpYWwge1xuXHR2ZWMzXHRkaWZmdXNlQ29sb3I7XG5cdHZlYzNcdHNwZWN1bGFyQ29sb3I7XG5cdGZsb2F0XHRzcGVjdWxhclNoaW5pbmVzcztcblx0ZmxvYXRcdHNwZWN1bGFyU3RyZW5ndGg7XG59O1xudm9pZCBSRV9EaXJlY3RfQmxpbm5QaG9uZyggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0I2lmZGVmIFRPT05cblx0XHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBnZXRHcmFkaWVudElycmFkaWFuY2UoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0I2Vsc2Vcblx0XHRmbG9hdCBkb3ROTCBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0XHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHQjZW5kaWZcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0aXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0I2VuZGlmXG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgK1x4M2QgaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgK1x4M2QgaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyApICogbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aDtcbn1cbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmcoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG59XG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X0JsaW5uUGhvbmdcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nXG4jZGVmaW5lIE1hdGVyaWFsX0xpZ2h0UHJvYmVMT0QoIG1hdGVyaWFsIClcdCgwKSIsCmxpZ2h0c19waHlzaWNhbF9mcmFnbWVudDoiUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbDtcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciBceDNkIGRpZmZ1c2VDb2xvci5yZ2IgKiAoIDEuMCAtIG1ldGFsbmVzc0ZhY3RvciApO1xubWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgXHgzZCBjbGFtcCggcm91Z2huZXNzRmFjdG9yLCAwLjA0LCAxLjAgKTtcbiNpZmRlZiBSRUZMRUNUSVZJVFlcblx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciBceDNkIG1peCggdmVjMyggTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAqIHBvdzIoIHJlZmxlY3Rpdml0eSApICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xuI2Vsc2Vcblx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciBceDNkIG1peCggdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcbiNlbmRpZlxuI2lmZGVmIENMRUFSQ09BVFxuXHRtYXRlcmlhbC5jbGVhcmNvYXQgXHgzZCBzYXR1cmF0ZSggY2xlYXJjb2F0ICk7XHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgXHgzZCBjbGFtcCggY2xlYXJjb2F0Um91Z2huZXNzLCAwLjA0LCAxLjAgKTtcbiNlbmRpZlxuI2lmZGVmIFVTRV9TSEVFTlxuXHRtYXRlcmlhbC5zaGVlbkNvbG9yIFx4M2Qgc2hlZW47XG4jZW5kaWYiLApsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudDoic3RydWN0IFBoeXNpY2FsTWF0ZXJpYWwge1xuXHR2ZWMzXHRkaWZmdXNlQ29sb3I7XG5cdGZsb2F0XHRzcGVjdWxhclJvdWdobmVzcztcblx0dmVjM1x0c3BlY3VsYXJDb2xvcjtcbiNpZmRlZiBDTEVBUkNPQVRcblx0ZmxvYXQgY2xlYXJjb2F0O1xuXHRmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7XG4jZW5kaWZcbiNpZmRlZiBVU0VfU0hFRU5cblx0dmVjMyBzaGVlbkNvbG9yO1xuI2VuZGlmXG59O1xuI2RlZmluZSBNQVhJTVVNX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMTZcbiNkZWZpbmUgREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCAwLjA0XG5mbG9hdCBjbGVhcmNvYXRESFJBcHByb3goIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkwgKSB7XG5cdHJldHVybiBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICsgKCAxLjAgLSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICkgKiAoIHBvdyggMS4wIC0gZG90TkwsIDUuMCApICogcG93KCAxLjAgLSByb3VnaG5lc3MsIDIuMCApICk7XG59XG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXHgzZSAwXG5cdHZvaWQgUkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsKCBjb25zdCBpbiBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRcdHZlYzMgbm9ybWFsIFx4M2QgZ2VvbWV0cnkubm9ybWFsO1xuXHRcdHZlYzMgdmlld0RpciBceDNkIGdlb21ldHJ5LnZpZXdEaXI7XG5cdFx0dmVjMyBwb3NpdGlvbiBceDNkIGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdHZlYzMgbGlnaHRQb3MgXHgzZCByZWN0QXJlYUxpZ2h0LnBvc2l0aW9uO1xuXHRcdHZlYzMgaGFsZldpZHRoIFx4M2QgcmVjdEFyZWFMaWdodC5oYWxmV2lkdGg7XG5cdFx0dmVjMyBoYWxmSGVpZ2h0IFx4M2QgcmVjdEFyZWFMaWdodC5oYWxmSGVpZ2h0O1xuXHRcdHZlYzMgbGlnaHRDb2xvciBceDNkIHJlY3RBcmVhTGlnaHQuY29sb3I7XG5cdFx0ZmxvYXQgcm91Z2huZXNzIFx4M2QgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3M7XG5cdFx0dmVjMyByZWN0Q29vcmRzWyA0IF07XG5cdFx0cmVjdENvb3Jkc1sgMCBdIFx4M2QgbGlnaHRQb3MgKyBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1x0XHRyZWN0Q29vcmRzWyAxIF0gXHgzZCBsaWdodFBvcyAtIGhhbGZXaWR0aCAtIGhhbGZIZWlnaHQ7XG5cdFx0cmVjdENvb3Jkc1sgMiBdIFx4M2QgbGlnaHRQb3MgLSBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xuXHRcdHJlY3RDb29yZHNbIDMgXSBceDNkIGxpZ2h0UG9zICsgaGFsZldpZHRoICsgaGFsZkhlaWdodDtcblx0XHR2ZWMyIHV2IFx4M2QgTFRDX1V2KCBub3JtYWwsIHZpZXdEaXIsIHJvdWdobmVzcyApO1xuXHRcdHZlYzQgdDEgXHgzZCB0ZXh0dXJlMkQoIGx0Y18xLCB1diApO1xuXHRcdHZlYzQgdDIgXHgzZCB0ZXh0dXJlMkQoIGx0Y18yLCB1diApO1xuXHRcdG1hdDMgbUludiBceDNkIG1hdDMoXG5cdFx0XHR2ZWMzKCB0MS54LCAwLCB0MS55ICksXG5cdFx0XHR2ZWMzKCAgICAwLCAxLCAgICAwICksXG5cdFx0XHR2ZWMzKCB0MS56LCAwLCB0MS53IClcblx0XHQpO1xuXHRcdHZlYzMgZnJlc25lbCBceDNkICggbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciAqIHQyLnggKyAoIHZlYzMoIDEuMCApIC0gbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciApICogdDIueSApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICtceDNkIGxpZ2h0Q29sb3IgKiBmcmVzbmVsICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtSW52LCByZWN0Q29vcmRzICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArXHgzZCBsaWdodENvbG9yICogbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtYXQzKCAxLjAgKSwgcmVjdENvb3JkcyApO1xuXHR9XG4jZW5kaWZcbnZvaWQgUkVfRGlyZWN0X1BoeXNpY2FsKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0ZmxvYXQgZG90TkwgXHgzZCBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdHZlYzMgaXJyYWRpYW5jZSBceDNkIGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdGlycmFkaWFuY2UgKlx4M2QgUEk7XG5cdCNlbmRpZlxuXHQjaWZkZWYgQ0xFQVJDT0FUXG5cdFx0ZmxvYXQgY2NEb3ROTCBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0XHR2ZWMzIGNjSXJyYWRpYW5jZSBceDNkIGNjRG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRcdGNjSXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0XHQjZW5kaWZcblx0XHRmbG9hdCBjbGVhcmNvYXRESFIgXHgzZCBtYXRlcmlhbC5jbGVhcmNvYXQgKiBjbGVhcmNvYXRESFJBcHByb3goIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgY2NEb3ROTCApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICtceDNkIGNjSXJyYWRpYW5jZSAqIG1hdGVyaWFsLmNsZWFyY29hdCAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyApO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGNsZWFyY29hdERIUiBceDNkIDAuMDtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfU0hFRU5cblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArXHgzZCAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfU2hlZW4oXG5cdFx0XHRtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyxcblx0XHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbixcblx0XHRcdGdlb21ldHJ5LFxuXHRcdFx0bWF0ZXJpYWwuc2hlZW5Db2xvclxuXHRcdCk7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgK1x4M2QgKCAxLjAgLSBjbGVhcmNvYXRESFIgKSAqIGlycmFkaWFuY2UgKiBCUkRGX1NwZWN1bGFyX0dHWCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5Lm5vcm1hbCwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MpO1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArXHgzZCAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbnZvaWQgUkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyByYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGNsZWFyY29hdFJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCkge1xuXHQjaWZkZWYgQ0xFQVJDT0FUXG5cdFx0ZmxvYXQgY2NEb3ROViBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArXHgzZCBjbGVhcmNvYXRSYWRpYW5jZSAqIG1hdGVyaWFsLmNsZWFyY29hdCAqIEJSREZfU3BlY3VsYXJfR0dYX0Vudmlyb25tZW50KCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7XG5cdFx0ZmxvYXQgY2NEb3ROTCBceDNkIGNjRG90TlY7XG5cdFx0ZmxvYXQgY2xlYXJjb2F0REhSIFx4M2QgbWF0ZXJpYWwuY2xlYXJjb2F0ICogY2xlYXJjb2F0REhSQXBwcm94KCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIGNjRG90TkwgKTtcblx0I2Vsc2Vcblx0XHRmbG9hdCBjbGVhcmNvYXRESFIgXHgzZCAwLjA7XG5cdCNlbmRpZlxuXHRmbG9hdCBjbGVhcmNvYXRJbnYgXHgzZCAxLjAgLSBjbGVhcmNvYXRESFI7XG5cdHZlYzMgc2luZ2xlU2NhdHRlcmluZyBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWMzIG11bHRpU2NhdHRlcmluZyBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWMzIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZSBceDNkIGlycmFkaWFuY2UgKiBSRUNJUFJPQ0FMX1BJO1xuXHRCUkRGX1NwZWN1bGFyX011bHRpc2NhdHRlcmluZ19FbnZpcm9ubWVudCggZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLCBzaW5nbGVTY2F0dGVyaW5nLCBtdWx0aVNjYXR0ZXJpbmcgKTtcblx0dmVjMyBkaWZmdXNlIFx4M2QgbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogKCAxLjAgLSAoIHNpbmdsZVNjYXR0ZXJpbmcgKyBtdWx0aVNjYXR0ZXJpbmcgKSApO1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICtceDNkIGNsZWFyY29hdEludiAqIHJhZGlhbmNlICogc2luZ2xlU2NhdHRlcmluZztcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIG11bHRpU2NhdHRlcmluZyAqIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZTtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIGRpZmZ1c2UgKiBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2U7XG59XG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X1BoeXNpY2FsXG4jZGVmaW5lIFJFX0RpcmVjdF9SZWN0QXJlYVx0XHRSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWxcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbFxuI2RlZmluZSBSRV9JbmRpcmVjdFNwZWN1bGFyXHRcdFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWxcbmZsb2F0IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IGFtYmllbnRPY2NsdXNpb24sIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0cmV0dXJuIHNhdHVyYXRlKCBwb3coIGRvdE5WICsgYW1iaWVudE9jY2x1c2lvbiwgZXhwMiggLSAxNi4wICogcm91Z2huZXNzIC0gMS4wICkgKSAtIDEuMCArIGFtYmllbnRPY2NsdXNpb24gKTtcbn0iLApsaWdodHNfZnJhZ21lbnRfYmVnaW46IlxuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeTtcbmdlb21ldHJ5LnBvc2l0aW9uIFx4M2QgLSB2Vmlld1Bvc2l0aW9uO1xuZ2VvbWV0cnkubm9ybWFsIFx4M2Qgbm9ybWFsO1xuZ2VvbWV0cnkudmlld0RpciBceDNkIG5vcm1hbGl6ZSggdlZpZXdQb3NpdGlvbiApO1xuI2lmZGVmIENMRUFSQ09BVFxuXHRnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwgXHgzZCBjbGVhcmNvYXROb3JtYWw7XG4jZW5kaWZcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XG4jaWYgKCBOVU1fUE9JTlRfTElHSFRTIFx4M2UgMCApIFx4MjZceDI2IGRlZmluZWQoIFJFX0RpcmVjdCApXG5cdFBvaW50TGlnaHQgcG9pbnRMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xuXHRcdHBvaW50TGlnaHQgXHgzZCBwb2ludExpZ2h0c1sgaSBdO1xuXHRcdGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBwb2ludExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApIFx4MjZceDI2ICggVU5ST0xMRURfTE9PUF9JTkRFWCBceDNjIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIClcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqXHgzZCBhbGwoIGJ2ZWMyKCBwb2ludExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7XG5cdFx0I2VuZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiAoIE5VTV9TUE9UX0xJR0hUUyBceDNlIDAgKSBceDI2XHgyNiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxuXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHRzcG90TGlnaHQgXHgzZCBzcG90TGlnaHRzWyBpIF07XG5cdFx0Z2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggc3BvdExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApIFx4MjZceDI2ICggVU5ST0xMRURfTE9PUF9JTkRFWCBceDNjIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKVxuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICpceDNkIGFsbCggYnZlYzIoIHNwb3RMaWdodC5zaGFkb3csIGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdFx0I2VuZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiAoIE5VTV9ESVJfTElHSFRTIFx4M2UgMCApIFx4MjZceDI2IGRlZmluZWQoIFJFX0RpcmVjdCApXG5cdERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcblx0XHRkaXJlY3Rpb25hbExpZ2h0IFx4M2QgZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcblx0XHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSBceDI2XHgyNiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggXHgzYyBOVU1fRElSX0xJR0hUX1NIQURPV1MgKVxuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICpceDNkIGFsbCggYnZlYzIoIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93LCBkaXJlY3RMaWdodC52aXNpYmxlICkgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdFx0I2VuZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiAoIE5VTV9SRUNUX0FSRUFfTElHSFRTIFx4M2UgMCApIFx4MjZceDI2IGRlZmluZWQoIFJFX0RpcmVjdF9SZWN0QXJlYSApXG5cdFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fUkVDVF9BUkVBX0xJR0hUUzsgaSArKyApIHtcblx0XHRyZWN0QXJlYUxpZ2h0IFx4M2QgcmVjdEFyZWFMaWdodHNbIGkgXTtcblx0XHRSRV9EaXJlY3RfUmVjdEFyZWEoIHJlY3RBcmVhTGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcblx0fVxuI2VuZGlmXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcblx0dmVjMyBpYmxJcnJhZGlhbmNlIFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzMgaXJyYWRpYW5jZSBceDNkIGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7XG5cdGlycmFkaWFuY2UgK1x4M2QgZ2V0TGlnaHRQcm9iZUlycmFkaWFuY2UoIGxpZ2h0UHJvYmUsIGdlb21ldHJ5ICk7XG5cdCNpZiAoIE5VTV9IRU1JX0xJR0hUUyBceDNlIDAgKVxuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0XHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fSEVNSV9MSUdIVFM7IGkgKysgKSB7XG5cdFx0XHRpcnJhZGlhbmNlICtceDNkIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkgKTtcblx0XHR9XG5cdCNlbmRpZlxuI2VuZGlmXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXG5cdHZlYzMgcmFkaWFuY2UgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjMyBjbGVhcmNvYXRSYWRpYW5jZSBceDNkIHZlYzMoIDAuMCApO1xuI2VuZGlmIiwKbGlnaHRzX2ZyYWdtZW50X21hcHM6IiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHQjaWZkZWYgVVNFX0xJR0hUTUFQXG5cdFx0dmVjMyBsaWdodE1hcElycmFkaWFuY2UgXHgzZCB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XG5cdFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0XHRsaWdodE1hcElycmFkaWFuY2UgKlx4M2QgUEk7XG5cdFx0I2VuZGlmXG5cdFx0aXJyYWRpYW5jZSArXHgzZCBsaWdodE1hcElycmFkaWFuY2U7XG5cdCNlbmRpZlxuXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIFx4MjZceDI2IGRlZmluZWQoIFNUQU5EQVJEICkgXHgyNlx4MjYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXG5cdFx0aWJsSXJyYWRpYW5jZSArXHgzZCBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBnZW9tZXRyeSwgbWF4TWlwTGV2ZWwgKTtcblx0I2VuZGlmXG4jZW5kaWZcbiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgXHgyNlx4MjYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXG5cdHJhZGlhbmNlICtceDNkIGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5ub3JtYWwsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLCBtYXhNaXBMZXZlbCApO1xuXHQjaWZkZWYgQ0xFQVJDT0FUXG5cdFx0Y2xlYXJjb2F0UmFkaWFuY2UgK1x4M2QgZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCBtYXhNaXBMZXZlbCApO1xuXHQjZW5kaWZcbiNlbmRpZiIsCmxpZ2h0c19mcmFnbWVudF9lbmQ6IiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHRSRV9JbmRpcmVjdERpZmZ1c2UoIGlycmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxuXHRSRV9JbmRpcmVjdFNwZWN1bGFyKCByYWRpYW5jZSwgaWJsSXJyYWRpYW5jZSwgY2xlYXJjb2F0UmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcbiNlbmRpZiIsbG9nZGVwdGhidWZfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUYgKSBceDI2XHgyNiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUZfRVhUIClcblx0Z2xfRnJhZ0RlcHRoRVhUIFx4M2QgbG9nMiggdkZyYWdEZXB0aCApICogbG9nRGVwdGhCdWZGQyAqIDAuNTtcbiNlbmRpZiIsbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApIFx4MjZceDI2IGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKVxuXHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XG5cdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDtcbiNlbmRpZiIsCmxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXG5cdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXG5cdFx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcblx0I2VuZGlmXG4jZW5kaWYiLGxvZ2RlcHRoYnVmX3ZlcnRleDoiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxuXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxuXHRcdHZGcmFnRGVwdGggXHgzZCAxLjAgKyBnbF9Qb3NpdGlvbi53O1xuXHQjZWxzZVxuXHRcdGdsX1Bvc2l0aW9uLnogXHgzZCBsb2cyKCBtYXgoIEVQU0lMT04sIGdsX1Bvc2l0aW9uLncgKyAxLjAgKSApICogbG9nRGVwdGhCdWZGQyAtIDEuMDtcblx0XHRnbF9Qb3NpdGlvbi56ICpceDNkIGdsX1Bvc2l0aW9uLnc7XG5cdCNlbmRpZlxuI2VuZGlmIixtYXBfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTUFQXG5cdHZlYzQgdGV4ZWxDb2xvciBceDNkIHRleHR1cmUyRCggbWFwLCB2VXYgKTtcblx0dGV4ZWxDb2xvciBceDNkIG1hcFRleGVsVG9MaW5lYXIoIHRleGVsQ29sb3IgKTtcblx0ZGlmZnVzZUNvbG9yICpceDNkIHRleGVsQ29sb3I7XG4jZW5kaWYiLAptYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xuI2VuZGlmIixtYXBfcGFydGljbGVfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTUFQXG5cdHZlYzIgdXYgXHgzZCAoIHV2VHJhbnNmb3JtICogdmVjMyggZ2xfUG9pbnRDb29yZC54LCAxLjAgLSBnbF9Qb2ludENvb3JkLnksIDEgKSApLnh5O1xuXHR2ZWM0IG1hcFRleGVsIFx4M2QgdGV4dHVyZTJEKCBtYXAsIHV2ICk7XG5cdGRpZmZ1c2VDb2xvciAqXHgzZCBtYXBUZXhlbFRvTGluZWFyKCBtYXBUZXhlbCApO1xuI2VuZGlmIixtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xuXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XG4jZW5kaWYiLG1ldGFsbmVzc21hcF9mcmFnbWVudDoiZmxvYXQgbWV0YWxuZXNzRmFjdG9yIFx4M2QgbWV0YWxuZXNzO1xuI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcblx0dmVjNCB0ZXhlbE1ldGFsbmVzcyBceDNkIHRleHR1cmUyRCggbWV0YWxuZXNzTWFwLCB2VXYgKTtcblx0bWV0YWxuZXNzRmFjdG9yICpceDNkIHRleGVsTWV0YWxuZXNzLmI7XG4jZW5kaWYiLAptZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwO1xuI2VuZGlmIixtb3JwaG5vcm1hbF92ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTXG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMCAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07XG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMSAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAxIF07XG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMiAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XG5cdG9iamVjdE5vcm1hbCArXHgzZCAoIG1vcnBoTm9ybWFsMyAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07XG4jZW5kaWYiLG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX01PUlBIVEFSR0VUU1xuXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDggXTtcblx0I2Vsc2Vcblx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcblx0I2VuZGlmXG4jZW5kaWYiLAptb3JwaHRhcmdldF92ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQwIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0MSAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDIgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQzIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMyBdO1xuXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDQgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA0IF07XG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQ1IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNSBdO1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0NiAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDYgXTtcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDcgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA3IF07XG5cdCNlbmRpZlxuI2VuZGlmIiwKbm9ybWFsX2ZyYWdtZW50X2JlZ2luOiIjaWZkZWYgRkxBVF9TSEFERURcblx0dmVjMyBmZHggXHgzZCB2ZWMzKCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeCggdlZpZXdQb3NpdGlvbi55ICksIGRGZHgoIHZWaWV3UG9zaXRpb24ueiApICk7XG5cdHZlYzMgZmR5IFx4M2QgdmVjMyggZEZkeSggdlZpZXdQb3NpdGlvbi54ICksIGRGZHkoIHZWaWV3UG9zaXRpb24ueSApLCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnogKSApO1xuXHR2ZWMzIG5vcm1hbCBceDNkIG5vcm1hbGl6ZSggY3Jvc3MoIGZkeCwgZmR5ICkgKTtcbiNlbHNlXG5cdHZlYzMgbm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB2Tm9ybWFsICk7XG5cdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRub3JtYWwgXHgzZCBub3JtYWwgKiAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdCNlbmRpZlxuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2ZWMzIHRhbmdlbnQgXHgzZCBub3JtYWxpemUoIHZUYW5nZW50ICk7XG5cdFx0dmVjMyBiaXRhbmdlbnQgXHgzZCBub3JtYWxpemUoIHZCaXRhbmdlbnQgKTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR0YW5nZW50IFx4M2QgdGFuZ2VudCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHRcdGJpdGFuZ2VudCBceDNkIGJpdGFuZ2VudCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHQjZW5kaWZcblx0I2VuZGlmXG4jZW5kaWZcbnZlYzMgZ2VvbWV0cnlOb3JtYWwgXHgzZCBub3JtYWw7IiwKbm9ybWFsX2ZyYWdtZW50X21hcHM6IiNpZmRlZiBPQkpFQ1RTUEFDRV9OT1JNQUxNQVBcblx0bm9ybWFsIFx4M2QgdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcblx0I2lmZGVmIEZMSVBfU0lERURcblx0XHRub3JtYWwgXHgzZCAtIG5vcm1hbDtcblx0I2VuZGlmXG5cdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRub3JtYWwgXHgzZCBub3JtYWwgKiAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdCNlbmRpZlxuXHRub3JtYWwgXHgzZCBub3JtYWxpemUoIG5vcm1hbE1hdHJpeCAqIG5vcm1hbCApO1xuI2VsaWYgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdG1hdDMgdlRCTiBceDNkIG1hdDMoIHRhbmdlbnQsIGJpdGFuZ2VudCwgbm9ybWFsICk7XG5cdFx0dmVjMyBtYXBOIFx4M2QgdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcblx0XHRtYXBOLnh5IFx4M2Qgbm9ybWFsU2NhbGUgKiBtYXBOLnh5O1xuXHRcdG5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdlRCTiAqIG1hcE4gKTtcblx0I2Vsc2Vcblx0XHRub3JtYWwgXHgzZCBwZXJ0dXJiTm9ybWFsMkFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCwgbm9ybWFsU2NhbGUsIG5vcm1hbE1hcCApO1xuXHQjZW5kaWZcbiNlbGlmIGRlZmluZWQoIFVTRV9CVU1QTUFQIClcblx0bm9ybWFsIFx4M2QgcGVydHVyYk5vcm1hbEFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCwgZEhkeHlfZndkKCkgKTtcbiNlbmRpZiIsCm5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX05PUk1BTE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBub3JtYWxNYXA7XG5cdHVuaWZvcm0gdmVjMiBub3JtYWxTY2FsZTtcbiNlbmRpZlxuI2lmZGVmIE9CSkVDVFNQQUNFX05PUk1BTE1BUFxuXHR1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4O1xuI2VuZGlmXG4jaWYgISBkZWZpbmVkICggVVNFX1RBTkdFTlQgKSBceDI2XHgyNiAoIGRlZmluZWQgKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCAoIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQICkgKVxuXHR2ZWMzIHBlcnR1cmJOb3JtYWwyQXJiKCB2ZWMzIGV5ZV9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIG5vcm1hbFNjYWxlLCBpbiBzYW1wbGVyMkQgbm9ybWFsTWFwICkge1xuXHRcdHZlYzMgcTAgXHgzZCB2ZWMzKCBkRmR4KCBleWVfcG9zLnggKSwgZEZkeCggZXllX3Bvcy55ICksIGRGZHgoIGV5ZV9wb3MueiApICk7XG5cdFx0dmVjMyBxMSBceDNkIHZlYzMoIGRGZHkoIGV5ZV9wb3MueCApLCBkRmR5KCBleWVfcG9zLnkgKSwgZEZkeSggZXllX3Bvcy56ICkgKTtcblx0XHR2ZWMyIHN0MCBceDNkIGRGZHgoIHZVdi5zdCApO1xuXHRcdHZlYzIgc3QxIFx4M2QgZEZkeSggdlV2LnN0ICk7XG5cdFx0ZmxvYXQgc2NhbGUgXHgzZCBzaWduKCBzdDEudCAqIHN0MC5zIC0gc3QwLnQgKiBzdDEucyApO1xuXHRcdHZlYzMgUyBceDNkIG5vcm1hbGl6ZSggKCBxMCAqIHN0MS50IC0gcTEgKiBzdDAudCApICogc2NhbGUgKTtcblx0XHR2ZWMzIFQgXHgzZCBub3JtYWxpemUoICggLSBxMCAqIHN0MS5zICsgcTEgKiBzdDAucyApICogc2NhbGUgKTtcblx0XHR2ZWMzIE4gXHgzZCBub3JtYWxpemUoIHN1cmZfbm9ybSApO1xuXHRcdHZlYzMgbWFwTiBceDNkIHRleHR1cmUyRCggbm9ybWFsTWFwLCB2VXYgKS54eXogKiAyLjAgLSAxLjA7XG5cdFx0bWFwTi54eSAqXHgzZCBub3JtYWxTY2FsZTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2ZWMzIE5mcm9tU1QgXHgzZCBjcm9zcyggUywgVCApO1xuXHRcdFx0aWYoIGRvdCggTmZyb21TVCwgTiApIFx4M2UgMC4wICkge1xuXHRcdFx0XHRTICpceDNkIC0xLjA7XG5cdFx0XHRcdFQgKlx4M2QgLTEuMDtcblx0XHRcdH1cblx0XHQjZWxzZVxuXHRcdFx0bWFwTi54eSAqXHgzZCAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdFx0I2VuZGlmXG5cdFx0bWF0MyB0c24gXHgzZCBtYXQzKCBTLCBULCBOICk7XG5cdFx0cmV0dXJuIG5vcm1hbGl6ZSggdHNuICogbWFwTiApO1xuXHR9XG4jZW5kaWYiLApjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luOiIjaWZkZWYgQ0xFQVJDT0FUXG5cdHZlYzMgY2xlYXJjb2F0Tm9ybWFsIFx4M2QgZ2VvbWV0cnlOb3JtYWw7XG4jZW5kaWYiLGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwczoiI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdG1hdDMgdlRCTiBceDNkIG1hdDMoIHRhbmdlbnQsIGJpdGFuZ2VudCwgY2xlYXJjb2F0Tm9ybWFsICk7XG5cdFx0dmVjMyBtYXBOIFx4M2QgdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcblx0XHRtYXBOLnh5IFx4M2QgY2xlYXJjb2F0Tm9ybWFsU2NhbGUgKiBtYXBOLnh5O1xuXHRcdGNsZWFyY29hdE5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdlRCTiAqIG1hcE4gKTtcblx0I2Vsc2Vcblx0XHRjbGVhcmNvYXROb3JtYWwgXHgzZCBwZXJ0dXJiTm9ybWFsMkFyYiggLSB2Vmlld1Bvc2l0aW9uLCBjbGVhcmNvYXROb3JtYWwsIGNsZWFyY29hdE5vcm1hbFNjYWxlLCBjbGVhcmNvYXROb3JtYWxNYXAgKTtcblx0I2VuZGlmXG4jZW5kaWYiLApjbGVhcmNvYXRfbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXROb3JtYWxNYXA7XG5cdHVuaWZvcm0gdmVjMiBjbGVhcmNvYXROb3JtYWxTY2FsZTtcbiNlbmRpZiIscGFja2luZzoidmVjMyBwYWNrTm9ybWFsVG9SR0IoIGNvbnN0IGluIHZlYzMgbm9ybWFsICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCBub3JtYWwgKSAqIDAuNSArIDAuNTtcbn1cbnZlYzMgdW5wYWNrUkdCVG9Ob3JtYWwoIGNvbnN0IGluIHZlYzMgcmdiICkge1xuXHRyZXR1cm4gMi4wICogcmdiLnh5eiAtIDEuMDtcbn1cbmNvbnN0IGZsb2F0IFBhY2tVcHNjYWxlIFx4M2QgMjU2LiAvIDI1NS47Y29uc3QgZmxvYXQgVW5wYWNrRG93bnNjYWxlIFx4M2QgMjU1LiAvIDI1Ni47XG5jb25zdCB2ZWMzIFBhY2tGYWN0b3JzIFx4M2QgdmVjMyggMjU2LiAqIDI1Ni4gKiAyNTYuLCAyNTYuICogMjU2LiwgIDI1Ni4gKTtcbmNvbnN0IHZlYzQgVW5wYWNrRmFjdG9ycyBceDNkIFVucGFja0Rvd25zY2FsZSAvIHZlYzQoIFBhY2tGYWN0b3JzLCAxLiApO1xuY29uc3QgZmxvYXQgU2hpZnRSaWdodDggXHgzZCAxLiAvIDI1Ni47XG52ZWM0IHBhY2tEZXB0aFRvUkdCQSggY29uc3QgaW4gZmxvYXQgdiApIHtcblx0dmVjNCByIFx4M2QgdmVjNCggZnJhY3QoIHYgKiBQYWNrRmFjdG9ycyApLCB2ICk7XG5cdHIueXp3IC1ceDNkIHIueHl6ICogU2hpZnRSaWdodDg7XHRyZXR1cm4gciAqIFBhY2tVcHNjYWxlO1xufVxuZmxvYXQgdW5wYWNrUkdCQVRvRGVwdGgoIGNvbnN0IGluIHZlYzQgdiApIHtcblx0cmV0dXJuIGRvdCggdiwgVW5wYWNrRmFjdG9ycyApO1xufVxudmVjNCBlbmNvZGVIYWxmUkdCQSAoIHZlYzIgdiApIHtcblx0dmVjNCBlbmNvZGVkIFx4M2QgdmVjNCggMC4wICk7XG5cdGNvbnN0IHZlYzIgb2Zmc2V0IFx4M2QgdmVjMiggMS4wIC8gMjU1LjAsIDAuMCApO1xuXHRlbmNvZGVkLnh5IFx4M2QgdmVjMiggdi54LCBmcmFjdCggdi54ICogMjU1LjAgKSApO1xuXHRlbmNvZGVkLnh5IFx4M2QgZW5jb2RlZC54eSAtICggZW5jb2RlZC55eSAqIG9mZnNldCApO1xuXHRlbmNvZGVkLnp3IFx4M2QgdmVjMiggdi55LCBmcmFjdCggdi55ICogMjU1LjAgKSApO1xuXHRlbmNvZGVkLnp3IFx4M2QgZW5jb2RlZC56dyAtICggZW5jb2RlZC53dyAqIG9mZnNldCApO1xuXHRyZXR1cm4gZW5jb2RlZDtcbn1cbnZlYzIgZGVjb2RlSGFsZlJHQkEoIHZlYzQgdiApIHtcblx0cmV0dXJuIHZlYzIoIHYueCArICggdi55IC8gMjU1LjAgKSwgdi56ICsgKCB2LncgLyAyNTUuMCApICk7XG59XG5mbG9hdCB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiAoIHZpZXdaICsgbmVhciApIC8gKCBuZWFyIC0gZmFyICk7XG59XG5mbG9hdCBvcnRob2dyYXBoaWNEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGxpbmVhckNsaXBaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiBsaW5lYXJDbGlwWiAqICggbmVhciAtIGZhciApIC0gbmVhcjtcbn1cbmZsb2F0IHZpZXdaVG9QZXJzcGVjdGl2ZURlcHRoKCBjb25zdCBpbiBmbG9hdCB2aWV3WiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xuXHRyZXR1cm4gKCggbmVhciArIHZpZXdaICkgKiBmYXIgKSAvICgoIGZhciAtIG5lYXIgKSAqIHZpZXdaICk7XG59XG5mbG9hdCBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgaW52Q2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuICggbmVhciAqIGZhciApIC8gKCAoIGZhciAtIG5lYXIgKSAqIGludkNsaXBaIC0gZmFyICk7XG59IiwKcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudDoiI2lmZGVmIFBSRU1VTFRJUExJRURfQUxQSEFcblx0Z2xfRnJhZ0NvbG9yLnJnYiAqXHgzZCBnbF9GcmFnQ29sb3IuYTtcbiNlbmRpZiIscHJvamVjdF92ZXJ0ZXg6InZlYzQgbXZQb3NpdGlvbiBceDNkIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcbmdsX1Bvc2l0aW9uIFx4M2QgcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247IixkaXRoZXJpbmdfZnJhZ21lbnQ6IiNpZmRlZiBESVRIRVJJTkdcblx0Z2xfRnJhZ0NvbG9yLnJnYiBceDNkIGRpdGhlcmluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xuI2VuZGlmIixkaXRoZXJpbmdfcGFyc19mcmFnbWVudDoiI2lmZGVmIERJVEhFUklOR1xuXHR2ZWMzIGRpdGhlcmluZyggdmVjMyBjb2xvciApIHtcblx0XHRmbG9hdCBncmlkX3Bvc2l0aW9uIFx4M2QgcmFuZCggZ2xfRnJhZ0Nvb3JkLnh5ICk7XG5cdFx0dmVjMyBkaXRoZXJfc2hpZnRfUkdCIFx4M2QgdmVjMyggMC4yNSAvIDI1NS4wLCAtMC4yNSAvIDI1NS4wLCAwLjI1IC8gMjU1LjAgKTtcblx0XHRkaXRoZXJfc2hpZnRfUkdCIFx4M2QgbWl4KCAyLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCAtMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgZ3JpZF9wb3NpdGlvbiApO1xuXHRcdHJldHVybiBjb2xvciArIGRpdGhlcl9zaGlmdF9SR0I7XG5cdH1cbiNlbmRpZiIsCnJvdWdobmVzc21hcF9mcmFnbWVudDoiZmxvYXQgcm91Z2huZXNzRmFjdG9yIFx4M2Qgcm91Z2huZXNzO1xuI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcblx0dmVjNCB0ZXhlbFJvdWdobmVzcyBceDNkIHRleHR1cmUyRCggcm91Z2huZXNzTWFwLCB2VXYgKTtcblx0cm91Z2huZXNzRmFjdG9yICpceDNkIHRleGVsUm91Z2huZXNzLmc7XG4jZW5kaWYiLHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1JPVUdITkVTU01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCByb3VnaG5lc3NNYXA7XG4jZW5kaWYiLHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgc3BvdFNoYWRvd01hcFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2U3BvdFNoYWRvd0Nvb3JkWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgcG9pbnRTaGFkb3dNYXBbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0ZmxvYXQgdGV4dHVyZTJEQ29tcGFyZSggc2FtcGxlcjJEIGRlcHRocywgdmVjMiB1diwgZmxvYXQgY29tcGFyZSApIHtcblx0XHRyZXR1cm4gc3RlcCggY29tcGFyZSwgdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggZGVwdGhzLCB1diApICkgKTtcblx0fVxuXHR2ZWMyIHRleHR1cmUyRERpc3RyaWJ1dGlvbiggc2FtcGxlcjJEIHNoYWRvdywgdmVjMiB1diApIHtcblx0XHRyZXR1cm4gZGVjb2RlSGFsZlJHQkEoIHRleHR1cmUyRCggc2hhZG93LCB1diApICk7XG5cdH1cblx0ZmxvYXQgVlNNU2hhZG93IChzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICl7XG5cdFx0ZmxvYXQgb2NjbHVzaW9uIFx4M2QgMS4wO1xuXHRcdHZlYzIgZGlzdHJpYnV0aW9uIFx4M2QgdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzaGFkb3csIHV2ICk7XG5cdFx0ZmxvYXQgaGFyZF9zaGFkb3cgXHgzZCBzdGVwKCBjb21wYXJlICwgZGlzdHJpYnV0aW9uLnggKTtcblx0XHRpZiAoaGFyZF9zaGFkb3cgIVx4M2QgMS4wICkge1xuXHRcdFx0ZmxvYXQgZGlzdGFuY2UgXHgzZCBjb21wYXJlIC0gZGlzdHJpYnV0aW9uLnggO1xuXHRcdFx0ZmxvYXQgdmFyaWFuY2UgXHgzZCBtYXgoIDAuMDAwMDAsIGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKTtcblx0XHRcdGZsb2F0IHNvZnRuZXNzX3Byb2JhYmlsaXR5IFx4M2QgdmFyaWFuY2UgLyAodmFyaWFuY2UgKyBkaXN0YW5jZSAqIGRpc3RhbmNlICk7XHRcdFx0c29mdG5lc3NfcHJvYmFiaWxpdHkgXHgzZCBjbGFtcCggKCBzb2Z0bmVzc19wcm9iYWJpbGl0eSAtIDAuMyApIC8gKCAwLjk1IC0gMC4zICksIDAuMCwgMS4wICk7XHRcdFx0b2NjbHVzaW9uIFx4M2QgY2xhbXAoIG1heCggaGFyZF9zaGFkb3csIHNvZnRuZXNzX3Byb2JhYmlsaXR5ICksIDAuMCwgMS4wICk7XG5cdFx0fVxuXHRcdHJldHVybiBvY2NsdXNpb247XG5cdH1cblx0ZmxvYXQgdGV4dHVyZTJEU2hhZG93TGVycCggc2FtcGxlcjJEIGRlcHRocywgdmVjMiBzaXplLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkge1xuXHRcdGNvbnN0IHZlYzIgb2Zmc2V0IFx4M2QgdmVjMiggMC4wLCAxLjAgKTtcblx0XHR2ZWMyIHRleGVsU2l6ZSBceDNkIHZlYzIoIDEuMCApIC8gc2l6ZTtcblx0XHR2ZWMyIGNlbnRyb2lkVVYgXHgzZCAoIGZsb29yKCB1diAqIHNpemUgLSAwLjUgKSArIDAuNSApICogdGV4ZWxTaXplO1xuXHRcdGZsb2F0IGxiIFx4M2QgdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnh4LCBjb21wYXJlICk7XG5cdFx0ZmxvYXQgbHQgXHgzZCB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueHksIGNvbXBhcmUgKTtcblx0XHRmbG9hdCByYiBceDNkIHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC55eCwgY29tcGFyZSApO1xuXHRcdGZsb2F0IHJ0IFx4M2QgdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnl5LCBjb21wYXJlICk7XG5cdFx0dmVjMiBmIFx4M2QgZnJhY3QoIHV2ICogc2l6ZSArIDAuNSApO1xuXHRcdGZsb2F0IGEgXHgzZCBtaXgoIGxiLCBsdCwgZi55ICk7XG5cdFx0ZmxvYXQgYiBceDNkIG1peCggcmIsIHJ0LCBmLnkgKTtcblx0XHRmbG9hdCBjIFx4M2QgbWl4KCBhLCBiLCBmLnggKTtcblx0XHRyZXR1cm4gYztcblx0fVxuXHRmbG9hdCBnZXRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkICkge1xuXHRcdGZsb2F0IHNoYWRvdyBceDNkIDEuMDtcblx0XHRzaGFkb3dDb29yZC54eXogL1x4M2Qgc2hhZG93Q29vcmQudztcblx0XHRzaGFkb3dDb29yZC56ICtceDNkIHNoYWRvd0JpYXM7XG5cdFx0YnZlYzQgaW5GcnVzdHVtVmVjIFx4M2QgYnZlYzQgKCBzaGFkb3dDb29yZC54IFx4M2VceDNkIDAuMCwgc2hhZG93Q29vcmQueCBceDNjXHgzZCAxLjAsIHNoYWRvd0Nvb3JkLnkgXHgzZVx4M2QgMC4wLCBzaGFkb3dDb29yZC55IFx4M2NceDNkIDEuMCApO1xuXHRcdGJvb2wgaW5GcnVzdHVtIFx4M2QgYWxsKCBpbkZydXN0dW1WZWMgKTtcblx0XHRidmVjMiBmcnVzdHVtVGVzdFZlYyBceDNkIGJ2ZWMyKCBpbkZydXN0dW0sIHNoYWRvd0Nvb3JkLnogXHgzY1x4M2QgMS4wICk7XG5cdFx0Ym9vbCBmcnVzdHVtVGVzdCBceDNkIGFsbCggZnJ1c3R1bVRlc3RWZWMgKTtcblx0XHRpZiAoIGZydXN0dW1UZXN0ICkge1xuXHRcdCNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKVxuXHRcdFx0dmVjMiB0ZXhlbFNpemUgXHgzZCB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XG5cdFx0XHRmbG9hdCBkeDAgXHgzZCAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHkwIFx4M2QgLSB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR4MSBceDNkICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTEgXHgzZCArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHgyIFx4M2QgZHgwIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHkyIFx4M2QgZHkwIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHgzIFx4M2QgZHgxIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHkzIFx4M2QgZHkxIC8gMi4wO1xuXHRcdFx0c2hhZG93IFx4M2QgKFxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgzLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApXG5cdFx0XHQpICogKCAxLjAgLyAxNy4wICk7XG5cdFx0I2VsaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKVxuXHRcdFx0dmVjMiB0ZXhlbFNpemUgXHgzZCB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XG5cdFx0XHRmbG9hdCBkeDAgXHgzZCAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHkwIFx4M2QgLSB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR4MSBceDNkICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTEgXHgzZCArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0c2hhZG93IFx4M2QgKFxuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkxICksIHNoYWRvd0Nvb3JkLnogKVxuXHRcdFx0KSAqICggMS4wIC8gOS4wICk7XG5cdFx0I2VsaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfVlNNIClcblx0XHRcdHNoYWRvdyBceDNkIFZTTVNoYWRvdyggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApO1xuXHRcdCNlbHNlXG5cdFx0XHRzaGFkb3cgXHgzZCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XG5cdFx0I2VuZGlmXG5cdFx0fVxuXHRcdHJldHVybiBzaGFkb3c7XG5cdH1cblx0dmVjMiBjdWJlVG9VViggdmVjMyB2LCBmbG9hdCB0ZXhlbFNpemVZICkge1xuXHRcdHZlYzMgYWJzViBceDNkIGFicyggdiApO1xuXHRcdGZsb2F0IHNjYWxlVG9DdWJlIFx4M2QgMS4wIC8gbWF4KCBhYnNWLngsIG1heCggYWJzVi55LCBhYnNWLnogKSApO1xuXHRcdGFic1YgKlx4M2Qgc2NhbGVUb0N1YmU7XG5cdFx0diAqXHgzZCBzY2FsZVRvQ3ViZSAqICggMS4wIC0gMi4wICogdGV4ZWxTaXplWSApO1xuXHRcdHZlYzIgcGxhbmFyIFx4M2Qgdi54eTtcblx0XHRmbG9hdCBhbG1vc3RBVGV4ZWwgXHgzZCAxLjUgKiB0ZXhlbFNpemVZO1xuXHRcdGZsb2F0IGFsbW9zdE9uZSBceDNkIDEuMCAtIGFsbW9zdEFUZXhlbDtcblx0XHRpZiAoIGFic1YueiBceDNlXHgzZCBhbG1vc3RPbmUgKSB7XG5cdFx0XHRpZiAoIHYueiBceDNlIDAuMCApXG5cdFx0XHRcdHBsYW5hci54IFx4M2QgNC4wIC0gdi54O1xuXHRcdH0gZWxzZSBpZiAoIGFic1YueCBceDNlXHgzZCBhbG1vc3RPbmUgKSB7XG5cdFx0XHRmbG9hdCBzaWduWCBceDNkIHNpZ24oIHYueCApO1xuXHRcdFx0cGxhbmFyLnggXHgzZCB2LnogKiBzaWduWCArIDIuMCAqIHNpZ25YO1xuXHRcdH0gZWxzZSBpZiAoIGFic1YueSBceDNlXHgzZCBhbG1vc3RPbmUgKSB7XG5cdFx0XHRmbG9hdCBzaWduWSBceDNkIHNpZ24oIHYueSApO1xuXHRcdFx0cGxhbmFyLnggXHgzZCB2LnggKyAyLjAgKiBzaWduWSArIDIuMDtcblx0XHRcdHBsYW5hci55IFx4M2Qgdi56ICogc2lnblkgLSAyLjA7XG5cdFx0fVxuXHRcdHJldHVybiB2ZWMyKCAwLjEyNSwgMC4yNSApICogcGxhbmFyICsgdmVjMiggMC4zNzUsIDAuNzUgKTtcblx0fVxuXHRmbG9hdCBnZXRQb2ludFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQsIGZsb2F0IHNoYWRvd0NhbWVyYU5lYXIsIGZsb2F0IHNoYWRvd0NhbWVyYUZhciApIHtcblx0XHR2ZWMyIHRleGVsU2l6ZSBceDNkIHZlYzIoIDEuMCApIC8gKCBzaGFkb3dNYXBTaXplICogdmVjMiggNC4wLCAyLjAgKSApO1xuXHRcdHZlYzMgbGlnaHRUb1Bvc2l0aW9uIFx4M2Qgc2hhZG93Q29vcmQueHl6O1xuXHRcdGZsb2F0IGRwIFx4M2QgKCBsZW5ndGgoIGxpZ2h0VG9Qb3NpdGlvbiApIC0gc2hhZG93Q2FtZXJhTmVhciApIC8gKCBzaGFkb3dDYW1lcmFGYXIgLSBzaGFkb3dDYW1lcmFOZWFyICk7XHRcdGRwICtceDNkIHNoYWRvd0JpYXM7XG5cdFx0dmVjMyBiZDNEIFx4M2Qgbm9ybWFsaXplKCBsaWdodFRvUG9zaXRpb24gKTtcblx0XHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9WU00gKVxuXHRcdFx0dmVjMiBvZmZzZXQgXHgzZCB2ZWMyKCAtIDEsIDEgKSAqIHNoYWRvd1JhZGl1cyAqIHRleGVsU2l6ZS55O1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh4LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHgsIHRleGVsU2l6ZS55ICksIGRwIClcblx0XHRcdCkgKiAoIDEuMCAvIDkuMCApO1xuXHRcdCNlbHNlXG5cdFx0XHRyZXR1cm4gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSwgZHAgKTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmIiwKc2hhZG93bWFwX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRcdHVuaWZvcm0gbWF0NCBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRcdHVuaWZvcm0gbWF0NCBzcG90U2hhZG93TWF0cml4WyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZTcG90U2hhZG93Q29vcmRbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0XHR1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcbiNlbmRpZiIsCnNoYWRvd21hcF92ZXJ0ZXg6IiNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX0RJUl9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gXHgzZCBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgaSBdICogd29ybGRQb3NpdGlvbjtcblx0fVxuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1NQT1RfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHR2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gXHgzZCBzcG90U2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0dlBvaW50U2hhZG93Q29vcmRbIGkgXSBceDNkIHBvaW50U2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNlbmRpZlxuI2VuZGlmIiwKc2hhZG93bWFza19wYXJzX2ZyYWdtZW50OiJmbG9hdCBnZXRTaGFkb3dNYXNrKCkge1xuXHRmbG9hdCBzaGFkb3cgXHgzZCAxLjA7XG5cdCNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fRElSX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0ZGlyZWN0aW9uYWxMaWdodCBceDNkIGRpcmVjdGlvbmFsTGlnaHRzWyBpIF07XG5cdFx0c2hhZG93ICpceDNkIGJvb2woIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93ICkgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xuXHR9XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0U3BvdExpZ2h0IHNwb3RMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHNwb3RMaWdodCBceDNkIHNwb3RMaWdodHNbIGkgXTtcblx0XHRzaGFkb3cgKlx4M2QgYm9vbCggc3BvdExpZ2h0LnNoYWRvdyApID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdH1cblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHBvaW50TGlnaHQgXHgzZCBwb2ludExpZ2h0c1sgaSBdO1xuXHRcdHNoYWRvdyAqXHgzZCBib29sKCBwb2ludExpZ2h0LnNoYWRvdyApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xuXHR9XG5cdCNlbmRpZlxuXHQjZW5kaWZcblx0cmV0dXJuIHNoYWRvdztcbn0iLApza2luYmFzZV92ZXJ0ZXg6IiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0bWF0NCBib25lTWF0WCBceDNkIGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC54ICk7XG5cdG1hdDQgYm9uZU1hdFkgXHgzZCBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueSApO1xuXHRtYXQ0IGJvbmVNYXRaIFx4M2QgZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnogKTtcblx0bWF0NCBib25lTWF0VyBceDNkIGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC53ICk7XG4jZW5kaWYiLHNraW5uaW5nX3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdHVuaWZvcm0gbWF0NCBiaW5kTWF0cml4O1xuXHR1bmlmb3JtIG1hdDQgYmluZE1hdHJpeEludmVyc2U7XG5cdCNpZmRlZiBCT05FX1RFWFRVUkVcblx0XHR1bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCBib25lVGV4dHVyZTtcblx0XHR1bmlmb3JtIGludCBib25lVGV4dHVyZVNpemU7XG5cdFx0bWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xuXHRcdFx0ZmxvYXQgaiBceDNkIGkgKiA0LjA7XG5cdFx0XHRmbG9hdCB4IFx4M2QgbW9kKCBqLCBmbG9hdCggYm9uZVRleHR1cmVTaXplICkgKTtcblx0XHRcdGZsb2F0IHkgXHgzZCBmbG9vciggaiAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKSApO1xuXHRcdFx0ZmxvYXQgZHggXHgzZCAxLjAgLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICk7XG5cdFx0XHRmbG9hdCBkeSBceDNkIDEuMCAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKTtcblx0XHRcdHkgXHgzZCBkeSAqICggeSArIDAuNSApO1xuXHRcdFx0dmVjNCB2MSBceDNkIHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMC41ICksIHkgKSApO1xuXHRcdFx0dmVjNCB2MiBceDNkIHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMS41ICksIHkgKSApO1xuXHRcdFx0dmVjNCB2MyBceDNkIHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMi41ICksIHkgKSApO1xuXHRcdFx0dmVjNCB2NCBceDNkIHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMy41ICksIHkgKSApO1xuXHRcdFx0bWF0NCBib25lIFx4M2QgbWF0NCggdjEsIHYyLCB2MywgdjQgKTtcblx0XHRcdHJldHVybiBib25lO1xuXHRcdH1cblx0I2Vsc2Vcblx0XHR1bmlmb3JtIG1hdDQgYm9uZU1hdHJpY2VzWyBNQVhfQk9ORVMgXTtcblx0XHRtYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7XG5cdFx0XHRtYXQ0IGJvbmUgXHgzZCBib25lTWF0cmljZXNbIGludChpKSBdO1xuXHRcdFx0cmV0dXJuIGJvbmU7XG5cdFx0fVxuXHQjZW5kaWZcbiNlbmRpZiIsCnNraW5uaW5nX3ZlcnRleDoiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHR2ZWM0IHNraW5WZXJ0ZXggXHgzZCBiaW5kTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuXHR2ZWM0IHNraW5uZWQgXHgzZCB2ZWM0KCAwLjAgKTtcblx0c2tpbm5lZCArXHgzZCBib25lTWF0WCAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lng7XG5cdHNraW5uZWQgK1x4M2QgYm9uZU1hdFkgKiBza2luVmVydGV4ICogc2tpbldlaWdodC55O1xuXHRza2lubmVkICtceDNkIGJvbmVNYXRaICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQuejtcblx0c2tpbm5lZCArXHgzZCBib25lTWF0VyAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnc7XG5cdHRyYW5zZm9ybWVkIFx4M2QgKCBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5uZWQgKS54eXo7XG4jZW5kaWYiLHNraW5ub3JtYWxfdmVydGV4OiIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdG1hdDQgc2tpbk1hdHJpeCBceDNkIG1hdDQoIDAuMCApO1xuXHRza2luTWF0cml4ICtceDNkIHNraW5XZWlnaHQueCAqIGJvbmVNYXRYO1xuXHRza2luTWF0cml4ICtceDNkIHNraW5XZWlnaHQueSAqIGJvbmVNYXRZO1xuXHRza2luTWF0cml4ICtceDNkIHNraW5XZWlnaHQueiAqIGJvbmVNYXRaO1xuXHRza2luTWF0cml4ICtceDNkIHNraW5XZWlnaHQudyAqIGJvbmVNYXRXO1xuXHRza2luTWF0cml4ICBceDNkIGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbk1hdHJpeCAqIGJpbmRNYXRyaXg7XG5cdG9iamVjdE5vcm1hbCBceDNkIHZlYzQoIHNraW5NYXRyaXggKiB2ZWM0KCBvYmplY3ROb3JtYWwsIDAuMCApICkueHl6O1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHRvYmplY3RUYW5nZW50IFx4M2QgdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdFRhbmdlbnQsIDAuMCApICkueHl6O1xuXHQjZW5kaWZcbiNlbmRpZiIsCnNwZWN1bGFybWFwX2ZyYWdtZW50OiJmbG9hdCBzcGVjdWxhclN0cmVuZ3RoO1xuI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxuXHR2ZWM0IHRleGVsU3BlY3VsYXIgXHgzZCB0ZXh0dXJlMkQoIHNwZWN1bGFyTWFwLCB2VXYgKTtcblx0c3BlY3VsYXJTdHJlbmd0aCBceDNkIHRleGVsU3BlY3VsYXIucjtcbiNlbHNlXG5cdHNwZWN1bGFyU3RyZW5ndGggXHgzZCAxLjA7XG4jZW5kaWYiLHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgc3BlY3VsYXJNYXA7XG4jZW5kaWYiLHRvbmVtYXBwaW5nX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVE9ORV9NQVBQSU5HIClcblx0Z2xfRnJhZ0NvbG9yLnJnYiBceDNkIHRvbmVNYXBwaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7XG4jZW5kaWYiLHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IiNpZm5kZWYgc2F0dXJhdGVcblx0I2RlZmluZSBzYXR1cmF0ZShhKSBjbGFtcCggYSwgMC4wLCAxLjAgKVxuI2VuZGlmXG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nV2hpdGVQb2ludDtcbnZlYzMgTGluZWFyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdHJldHVybiB0b25lTWFwcGluZ0V4cG9zdXJlICogY29sb3I7XG59XG52ZWMzIFJlaW5oYXJkVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICpceDNkIHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggY29sb3IgLyAoIHZlYzMoIDEuMCApICsgY29sb3IgKSApO1xufVxuI2RlZmluZSBVbmNoYXJ0ZWQySGVscGVyKCB4ICkgbWF4KCAoICggeCAqICggMC4xNSAqIHggKyAwLjEwICogMC41MCApICsgMC4yMCAqIDAuMDIgKSAvICggeCAqICggMC4xNSAqIHggKyAwLjUwICkgKyAwLjIwICogMC4zMCApICkgLSAwLjAyIC8gMC4zMCwgdmVjMyggMC4wICkgKVxudmVjMyBVbmNoYXJ0ZWQyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICpceDNkIHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggVW5jaGFydGVkMkhlbHBlciggY29sb3IgKSAvIFVuY2hhcnRlZDJIZWxwZXIoIHZlYzMoIHRvbmVNYXBwaW5nV2hpdGVQb2ludCApICkgKTtcbn1cbnZlYzMgT3B0aW1pemVkQ2luZW9uVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICpceDNkIHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdGNvbG9yIFx4M2QgbWF4KCB2ZWMzKCAwLjAgKSwgY29sb3IgLSAwLjAwNCApO1xuXHRyZXR1cm4gcG93KCAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDAuNSApICkgLyAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDEuNyApICsgMC4wNiApLCB2ZWMzKCAyLjIgKSApO1xufVxudmVjMyBBQ0VTRmlsbWljVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICpceDNkIHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggKCBjb2xvciAqICggMi41MSAqIGNvbG9yICsgMC4wMyApICkgLyAoIGNvbG9yICogKCAyLjQzICogY29sb3IgKyAwLjU5ICkgKyAwLjE0ICkgKTtcbn0iLAp1dl9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1VWXG5cdHZhcnlpbmcgdmVjMiB2VXY7XG4jZW5kaWYiLHV2X3BhcnNfdmVydGV4OiIjaWZkZWYgVVNFX1VWXG5cdHZhcnlpbmcgdmVjMiB2VXY7XG5cdHVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcbiNlbmRpZiIsdXZfdmVydGV4OiIjaWZkZWYgVVNFX1VWXG5cdHZVdiBceDNkICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XG4jZW5kaWYiLHV2Ml9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcblx0dmFyeWluZyB2ZWMyIHZVdjI7XG4jZW5kaWYiLHV2Ml9wYXJzX3ZlcnRleDoiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXG5cdGF0dHJpYnV0ZSB2ZWMyIHV2Mjtcblx0dmFyeWluZyB2ZWMyIHZVdjI7XG4jZW5kaWYiLHV2Ml92ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxuXHR2VXYyIFx4M2QgdXYyO1xuI2VuZGlmIiwKd29ybGRwb3NfdmVydGV4OiIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQoIERJU1RBTkNFICkgfHwgZGVmaW5lZCAoIFVTRV9TSEFET1dNQVAgKVxuXHR2ZWM0IHdvcmxkUG9zaXRpb24gXHgzZCBtb2RlbE1hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcbiNlbmRpZiIsYmFja2dyb3VuZF9mcmFnOiJ1bmlmb3JtIHNhbXBsZXIyRCB0MkQ7XG52YXJ5aW5nIHZlYzIgdlV2O1xudm9pZCBtYWluKCkge1xuXHR2ZWM0IHRleENvbG9yIFx4M2QgdGV4dHVyZTJEKCB0MkQsIHZVdiApO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCBtYXBUZXhlbFRvTGluZWFyKCB0ZXhDb2xvciApO1xuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG59IixiYWNrZ3JvdW5kX3ZlcnQ6InZhcnlpbmcgdmVjMiB2VXY7XG51bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XG52b2lkIG1haW4oKSB7XG5cdHZVdiBceDNkICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XG5cdGdsX1Bvc2l0aW9uIFx4M2QgdmVjNCggcG9zaXRpb24ueHksIDEuMCwgMS4wICk7XG59IiwKY3ViZV9mcmFnOiJ1bmlmb3JtIHNhbXBsZXJDdWJlIHRDdWJlO1xudW5pZm9ybSBmbG9hdCB0RmxpcDtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG52b2lkIG1haW4oKSB7XG5cdHZlYzQgdGV4Q29sb3IgXHgzZCB0ZXh0dXJlQ3ViZSggdEN1YmUsIHZlYzMoIHRGbGlwICogdldvcmxkRGlyZWN0aW9uLngsIHZXb3JsZERpcmVjdGlvbi55eiApICk7XG5cdGdsX0ZyYWdDb2xvciBceDNkIG1hcFRleGVsVG9MaW5lYXIoIHRleENvbG9yICk7XG5cdGdsX0ZyYWdDb2xvci5hICpceDNkIG9wYWNpdHk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcbn0iLGN1YmVfdmVydDoidmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZERpcmVjdGlvbiBceDNkIHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0Z2xfUG9zaXRpb24ueiBceDNkIGdsX1Bvc2l0aW9uLnc7XG59IiwKZGVwdGhfZnJhZzoiI2lmIERFUFRIX1BBQ0tJTkcgXHgzZFx4M2QgMzIwMFxuXHR1bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCAxLjAgKTtcblx0I2lmIERFUFRIX1BBQ0tJTkcgXHgzZFx4M2QgMzIwMFxuXHRcdGRpZmZ1c2VDb2xvci5hIFx4M2Qgb3BhY2l0eTtcblx0I2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaWYgREVQVEhfUEFDS0lORyBceDNkXHgzZCAzMjAwXG5cdFx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggdmVjMyggMS4wIC0gZ2xfRnJhZ0Nvb3JkLnogKSwgb3BhY2l0eSApO1xuXHQjZWxpZiBERVBUSF9QQUNLSU5HIFx4M2RceDNkIDMyMDFcblx0XHRnbF9GcmFnQ29sb3IgXHgzZCBwYWNrRGVwdGhUb1JHQkEoIGdsX0ZyYWdDb29yZC56ICk7XG5cdCNlbmRpZlxufSIsCmRlcHRoX3ZlcnQ6IiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0XHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHRcdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdFx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG59IiwKZGlzdGFuY2VSR0JBX2ZyYWc6IiNkZWZpbmUgRElTVEFOQ0VcbnVuaWZvcm0gdmVjMyByZWZlcmVuY2VQb3NpdGlvbjtcbnVuaWZvcm0gZmxvYXQgbmVhckRpc3RhbmNlO1xudW5pZm9ybSBmbG9hdCBmYXJEaXN0YW5jZTtcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4gKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIDEuMCApO1xuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdGZsb2F0IGRpc3QgXHgzZCBsZW5ndGgoIHZXb3JsZFBvc2l0aW9uIC0gcmVmZXJlbmNlUG9zaXRpb24gKTtcblx0ZGlzdCBceDNkICggZGlzdCAtIG5lYXJEaXN0YW5jZSApIC8gKCBmYXJEaXN0YW5jZSAtIG5lYXJEaXN0YW5jZSApO1xuXHRkaXN0IFx4M2Qgc2F0dXJhdGUoIGRpc3QgKTtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgcGFja0RlcHRoVG9SR0JBKCBkaXN0ICk7XG59IiwKZGlzdGFuY2VSR0JBX3ZlcnQ6IiNkZWZpbmUgRElTVEFOQ0VcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0XHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHRcdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdFx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdHZXb3JsZFBvc2l0aW9uIFx4M2Qgd29ybGRQb3NpdGlvbi54eXo7XG59IiwKZXF1aXJlY3RfZnJhZzoidW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0O1xudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG52b2lkIG1haW4oKSB7XG5cdHZlYzMgZGlyZWN0aW9uIFx4M2Qgbm9ybWFsaXplKCB2V29ybGREaXJlY3Rpb24gKTtcblx0dmVjMiBzYW1wbGVVVjtcblx0c2FtcGxlVVYueSBceDNkIGFzaW4oIGNsYW1wKCBkaXJlY3Rpb24ueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xuXHRzYW1wbGVVVi54IFx4M2QgYXRhbiggZGlyZWN0aW9uLnosIGRpcmVjdGlvbi54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcblx0dmVjNCB0ZXhDb2xvciBceDNkIHRleHR1cmUyRCggdEVxdWlyZWN0LCBzYW1wbGVVViApO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCBtYXBUZXhlbFRvTGluZWFyKCB0ZXhDb2xvciApO1xuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG59IiwKZXF1aXJlY3RfdmVydDoidmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZERpcmVjdGlvbiBceDNkIHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcbn0iLGxpbmVkYXNoZWRfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG51bmlmb3JtIGZsb2F0IGRhc2hTaXplO1xudW5pZm9ybSBmbG9hdCB0b3RhbFNpemU7XG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0aWYgKCBtb2QoIHZMaW5lRGlzdGFuY2UsIHRvdGFsU2l6ZSApIFx4M2UgZGFzaFNpemUgKSB7XG5cdFx0ZGlzY2FyZDtcblx0fVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHRvdXRnb2luZ0xpZ2h0IFx4M2QgZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLApsaW5lZGFzaGVkX3ZlcnQ6InVuaWZvcm0gZmxvYXQgc2NhbGU7XG5hdHRyaWJ1dGUgZmxvYXQgbGluZURpc3RhbmNlO1xudmFyeWluZyBmbG9hdCB2TGluZURpc3RhbmNlO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHR2TGluZURpc3RhbmNlIFx4M2Qgc2NhbGUgKiBsaW5lRGlzdGFuY2U7XG5cdHZlYzQgbXZQb3NpdGlvbiBceDNkIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcblx0Z2xfUG9zaXRpb24gXHgzZCBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCm1lc2hiYXNpY19mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYW9tYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NsaWdodG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9jb21tb25fcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Njb2xvcl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjc3BlY3VsYXJtYXBfZnJhZ21lbnRceDNlXG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0IFx4M2QgUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdCNpZmRlZiBVU0VfTElHSFRNQVBcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApLnh5eiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xuXHQjZWxzZVxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArXHgzZCB2ZWMzKCAxLjAgKTtcblx0I2VuZGlmXG5cdCNpbmNsdWRlIFx4M2Nhb21hcF9mcmFnbWVudFx4M2Vcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICpceDNkIGRpZmZ1c2VDb2xvci5yZ2I7XG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZTtcblx0I2luY2x1ZGUgXHgzY2Vudm1hcF9mcmFnbWVudFx4M2Vcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNoYmFzaWNfdmVydDoiI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2N1djJfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N1djJfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaWZkZWYgVVNFX0VOVk1BUFxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2Vcblx0I2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcbn0iLAptZXNobGFtYmVydF9mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnZhcnlpbmcgdmVjMyB2TGlnaHRGcm9udDtcbnZhcnlpbmcgdmVjMyB2SW5kaXJlY3RGcm9udDtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dmFyeWluZyB2ZWMzIHZMaWdodEJhY2s7XG5cdHZhcnlpbmcgdmVjMyB2SW5kaXJlY3RCYWNrO1xuI2VuZGlmXG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3BhY2tpbmdceDNlXG4jaW5jbHVkZSBceDNjZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYW9tYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NsaWdodG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2VtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2JzZGZzXHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0c19wYXJzX2JlZ2luXHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hc2tfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCBceDNkIFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSBceDNkIGVtaXNzaXZlO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Njb2xvcl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjc3BlY3VsYXJtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbWlzc2l2ZW1hcF9mcmFnbWVudFx4M2Vcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlIFx4M2QgZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArXHgzZCAoIGdsX0Zyb250RmFjaW5nICkgPyB2SW5kaXJlY3RGcm9udCA6IHZJbmRpcmVjdEJhY2s7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIHZJbmRpcmVjdEZyb250O1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2xpZ2h0bWFwX2ZyYWdtZW50XHgzZVxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKlx4M2QgQlJERl9EaWZmdXNlX0xhbWJlcnQoIGRpZmZ1c2VDb2xvci5yZ2IgKTtcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgXHgzZCAoIGdsX0Zyb250RmFjaW5nICkgPyB2TGlnaHRGcm9udCA6IHZMaWdodEJhY2s7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSBceDNkIHZMaWdodEZyb250O1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSAqXHgzZCBCUkRGX0RpZmZ1c2VfTGFtYmVydCggZGlmZnVzZUNvbG9yLnJnYiApICogZ2V0U2hhZG93TWFzaygpO1xuXHQjaW5jbHVkZSBceDNjYW9tYXBfZnJhZ21lbnRceDNlXG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfZnJhZ21lbnRceDNlXG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfZnJhZ21lbnRceDNlXG59IiwKbWVzaGxhbWJlcnRfdmVydDoiI2RlZmluZSBMQU1CRVJUXG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XG52YXJ5aW5nIHZlYzMgdkluZGlyZWN0RnJvbnQ7XG4jaWZkZWYgRE9VQkxFX1NJREVEXG5cdHZhcnlpbmcgdmVjMyB2TGlnaHRCYWNrO1xuXHR2YXJ5aW5nIHZlYzMgdkluZGlyZWN0QmFjaztcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2N1djJfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2JzZGZzXHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0c19wYXJzX2JlZ2luXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjdXYyX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGVmYXVsdG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2xhbWJlcnRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2hhZG93bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKbWVzaG1hdGNhcF9mcmFnOiIjZGVmaW5lIE1BVENBUFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG51bmlmb3JtIHNhbXBsZXIyRCBtYXRjYXA7XG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NhbHBoYW1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2J1bXBtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nub3JtYWxtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfbWFwc1x4M2Vcblx0dmVjMyB2aWV3RGlyIFx4M2Qgbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XG5cdHZlYzMgeCBceDNkIG5vcm1hbGl6ZSggdmVjMyggdmlld0Rpci56LCAwLjAsIC0gdmlld0Rpci54ICkgKTtcblx0dmVjMyB5IFx4M2QgY3Jvc3MoIHZpZXdEaXIsIHggKTtcblx0dmVjMiB1diBceDNkIHZlYzIoIGRvdCggeCwgbm9ybWFsICksIGRvdCggeSwgbm9ybWFsICkgKSAqIDAuNDk1ICsgMC41O1xuXHQjaWZkZWYgVVNFX01BVENBUFxuXHRcdHZlYzQgbWF0Y2FwQ29sb3IgXHgzZCB0ZXh0dXJlMkQoIG1hdGNhcCwgdXYgKTtcblx0XHRtYXRjYXBDb2xvciBceDNkIG1hdGNhcFRleGVsVG9MaW5lYXIoIG1hdGNhcENvbG9yICk7XG5cdCNlbHNlXG5cdFx0dmVjNCBtYXRjYXBDb2xvciBceDNkIHZlYzQoIDEuMCApO1xuXHQjZW5kaWZcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgZGlmZnVzZUNvbG9yLnJnYiAqIG1hdGNhcENvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNobWF0Y2FwX3ZlcnQ6IiNkZWZpbmUgTUFUQ0FQXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2luYmFzZV92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RlZmF1bHRub3JtYWxfdmVydGV4XHgzZVxuXHQjaWZuZGVmIEZMQVRfU0hBREVEXG5cdFx0dk5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcblx0I2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJvamVjdF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG59IiwKbWVzaHBob25nX2ZyYWc6IiNkZWZpbmUgUEhPTkdcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xudW5pZm9ybSB2ZWMzIHNwZWN1bGFyO1xudW5pZm9ybSBmbG9hdCBzaGluaW5lc3M7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3BhY2tpbmdceDNlXG4jaW5jbHVkZSBceDNjZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYW9tYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NsaWdodG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2VtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2dyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnNkZnNceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnVtcG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY25vcm1hbG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0IFx4M2QgUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlIFx4M2QgZW1pc3NpdmU7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9tYXBzXHgzZVxuXHQjaW5jbHVkZSBceDNjZW1pc3NpdmVtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfcGhvbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfZnJhZ21lbnRfbWFwc1x4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9lbmRceDNlXG5cdCNpbmNsdWRlIFx4M2Nhb21hcF9mcmFnbWVudFx4M2Vcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcblx0I2luY2x1ZGUgXHgzY2Vudm1hcF9mcmFnbWVudFx4M2Vcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RpdGhlcmluZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNocGhvbmdfdmVydDoiI2RlZmluZSBQSE9OR1xudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuI2VuZGlmXG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjdXYyX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGVmYXVsdG5vcm1hbF92ZXJ0ZXhceDNlXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZOb3JtYWwgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG4jZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdHZWaWV3UG9zaXRpb24gXHgzZCAtIG12UG9zaXRpb24ueHl6O1xuXHQjaW5jbHVkZSBceDNjd29ybGRwb3NfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZW52bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NoYWRvd21hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCm1lc2hwaHlzaWNhbF9mcmFnOiIjZGVmaW5lIFNUQU5EQVJEXG4jaWZkZWYgUEhZU0lDQUxcblx0I2RlZmluZSBSRUZMRUNUSVZJVFlcblx0I2RlZmluZSBDTEVBUkNPQVRcblx0I2RlZmluZSBUUkFOU1BBUkVOQ1lcbiNlbmRpZlxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XG51bmlmb3JtIGZsb2F0IHJvdWdobmVzcztcbnVuaWZvcm0gZmxvYXQgbWV0YWxuZXNzO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2lmZGVmIFRSQU5TUEFSRU5DWVxuXHR1bmlmb3JtIGZsb2F0IHRyYW5zcGFyZW5jeTtcbiNlbmRpZlxuI2lmZGVmIFJFRkxFQ1RJVklUWVxuXHR1bmlmb3JtIGZsb2F0IHJlZmxlY3Rpdml0eTtcbiNlbmRpZlxuI2lmZGVmIENMRUFSQ09BVFxuXHR1bmlmb3JtIGZsb2F0IGNsZWFyY29hdDtcblx0dW5pZm9ybSBmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7XG4jZW5kaWZcbiNpZmRlZiBVU0VfU0hFRU5cblx0dW5pZm9ybSB2ZWMzIHNoZWVuO1xuI2VuZGlmXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nhb21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nic2Rmc1x4M2VcbiNpbmNsdWRlIFx4M2NjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0c19wYXJzX2JlZ2luXHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2J1bXBtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nub3JtYWxtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGVhcmNvYXRfbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjcm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0IFx4M2QgUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlIFx4M2QgZW1pc3NpdmU7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nyb3VnaG5lc3NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtZXRhbG5lc3NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfbWFwc1x4M2Vcblx0I2luY2x1ZGUgXHgzY2NsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2NjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X21hcHNceDNlXG5cdCNpbmNsdWRlIFx4M2NlbWlzc2l2ZW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19waHlzaWNhbF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9tYXBzXHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2ZyYWdtZW50X2VuZFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FvbWFwX2ZyYWdtZW50XHgzZVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xuXHQjaWZkZWYgVFJBTlNQQVJFTkNZXG5cdFx0ZGlmZnVzZUNvbG9yLmEgKlx4M2Qgc2F0dXJhdGUoIDEuIC0gdHJhbnNwYXJlbmN5ICsgbGluZWFyVG9SZWxhdGl2ZUx1bWluYW5jZSggcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICkgKTtcblx0I2VuZGlmXG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfZnJhZ21lbnRceDNlXG59IiwKbWVzaHBoeXNpY2FsX3ZlcnQ6IiNkZWZpbmUgU1RBTkRBUkRcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2N1djJfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjdXYyX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGVmYXVsdG5vcm1hbF92ZXJ0ZXhceDNlXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZOb3JtYWwgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZUYW5nZW50IFx4M2Qgbm9ybWFsaXplKCB0cmFuc2Zvcm1lZFRhbmdlbnQgKTtcblx0XHR2Qml0YW5nZW50IFx4M2Qgbm9ybWFsaXplKCBjcm9zcyggdk5vcm1hbCwgdlRhbmdlbnQgKSAqIHRhbmdlbnQudyApO1xuXHQjZW5kaWZcbiNlbmRpZlxuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5pbmdfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcbn0iLApub3JtYWxfZnJhZzoiI2RlZmluZSBOT1JNQUxcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2J1bXBtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nub3JtYWxtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfYmVnaW5ceDNlXG5cdCNpbmNsdWRlIFx4M2Nub3JtYWxfZnJhZ21lbnRfbWFwc1x4M2Vcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggcGFja05vcm1hbFRvUkdCKCBub3JtYWwgKSwgb3BhY2l0eSApO1xufSIsCm5vcm1hbF92ZXJ0OiIjZGVmaW5lIE5PUk1BTFxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jZW5kaWZcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2tpbm5pbmdfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2VcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dlRhbmdlbnQgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkVGFuZ2VudCApO1xuXHRcdHZCaXRhbmdlbnQgXHgzZCBub3JtYWxpemUoIGNyb3NzKCB2Tm9ybWFsLCB2VGFuZ2VudCApICogdGFuZ2VudC53ICk7XG5cdCNlbmRpZlxuI2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJvamVjdF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfdmVydGV4XHgzZVxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG4jZW5kaWZcbn0iLApwb2ludHNfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfcGFydGljbGVfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Njb2xvcl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0b3V0Z29pbmdMaWdodCBceDNkIGRpZmZ1c2VDb2xvci5yZ2I7XG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIFx4M2NwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfZnJhZ21lbnRceDNlXG59IiwKcG9pbnRzX3ZlcnQ6InVuaWZvcm0gZmxvYXQgc2l6ZTtcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2Njb2xvcl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0Z2xfUG9pbnRTaXplIFx4M2Qgc2l6ZTtcblx0I2lmZGVmIFVTRV9TSVpFQVRURU5VQVRJT05cblx0XHRib29sIGlzUGVyc3BlY3RpdmUgXHgzZCAoIHByb2plY3Rpb25NYXRyaXhbIDIgXVsgMyBdIFx4M2RceDNkIC0gMS4wICk7XG5cdFx0aWYgKCBpc1BlcnNwZWN0aXZlICkgZ2xfUG9pbnRTaXplICpceDNkICggc2NhbGUgLyAtIG12UG9zaXRpb24ueiApO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCnNoYWRvd19mcmFnOiJ1bmlmb3JtIHZlYzMgY29sb3I7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3BhY2tpbmdceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnNkZnNceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFza19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBjb2xvciwgb3BhY2l0eSAqICggMS4wIC0gZ2V0U2hhZG93TWFzaygpICkgKTtcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLHNoYWRvd192ZXJ0OiIjaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjd29ybGRwb3NfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2hhZG93bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKc3ByaXRlX2ZyYWc6InVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHRvdXRnb2luZ0xpZ2h0IFx4M2QgZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsCnNwcml0ZV92ZXJ0OiJ1bmlmb3JtIGZsb2F0IHJvdGF0aW9uO1xudW5pZm9ybSB2ZWMyIGNlbnRlcjtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0dmVjNCBtdlBvc2l0aW9uIFx4M2QgbW9kZWxWaWV3TWF0cml4ICogdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7XG5cdHZlYzIgc2NhbGU7XG5cdHNjYWxlLnggXHgzZCBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAwIF0ueCwgbW9kZWxNYXRyaXhbIDAgXS55LCBtb2RlbE1hdHJpeFsgMCBdLnogKSApO1xuXHRzY2FsZS55IFx4M2QgbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMSBdLngsIG1vZGVsTWF0cml4WyAxIF0ueSwgbW9kZWxNYXRyaXhbIDEgXS56ICkgKTtcblx0I2lmbmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OXG5cdFx0Ym9vbCBpc1BlcnNwZWN0aXZlIFx4M2QgKCBwcm9qZWN0aW9uTWF0cml4WyAyIF1bIDMgXSBceDNkXHgzZCAtIDEuMCApO1xuXHRcdGlmICggaXNQZXJzcGVjdGl2ZSApIHNjYWxlICpceDNkIC0gbXZQb3NpdGlvbi56O1xuXHQjZW5kaWZcblx0dmVjMiBhbGlnbmVkUG9zaXRpb24gXHgzZCAoIHBvc2l0aW9uLnh5IC0gKCBjZW50ZXIgLSB2ZWMyKCAwLjUgKSApICkgKiBzY2FsZTtcblx0dmVjMiByb3RhdGVkUG9zaXRpb247XG5cdHJvdGF0ZWRQb3NpdGlvbi54IFx4M2QgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggLSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTtcblx0cm90YXRlZFBvc2l0aW9uLnkgXHgzZCBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCArIGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55O1xuXHRtdlBvc2l0aW9uLnh5ICtceDNkIHJvdGF0ZWRQb3NpdGlvbjtcblx0Z2xfUG9zaXRpb24gXHgzZCBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSJ9LApZYT17Y29tbW9uOntkaWZmdXNlOnt2YWx1ZTpuZXcgSSgxNTY1ODczNCl9LG9wYWNpdHk6e3ZhbHVlOjF9LG1hcDp7dmFsdWU6bnVsbH0sdXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyBsfSxhbHBoYU1hcDp7dmFsdWU6bnVsbH19LHNwZWN1bGFybWFwOntzcGVjdWxhck1hcDp7dmFsdWU6bnVsbH19LGVudm1hcDp7ZW52TWFwOnt2YWx1ZTpudWxsfSxmbGlwRW52TWFwOnt2YWx1ZTotMX0scmVmbGVjdGl2aXR5Ont2YWx1ZToxfSxyZWZyYWN0aW9uUmF0aW86e3ZhbHVlOi45OH0sbWF4TWlwTGV2ZWw6e3ZhbHVlOjB9fSxhb21hcDp7YW9NYXA6e3ZhbHVlOm51bGx9LGFvTWFwSW50ZW5zaXR5Ont2YWx1ZToxfX0sbGlnaHRtYXA6e2xpZ2h0TWFwOnt2YWx1ZTpudWxsfSxsaWdodE1hcEludGVuc2l0eTp7dmFsdWU6MX19LGVtaXNzaXZlbWFwOntlbWlzc2l2ZU1hcDp7dmFsdWU6bnVsbH19LGJ1bXBtYXA6e2J1bXBNYXA6e3ZhbHVlOm51bGx9LGJ1bXBTY2FsZTp7dmFsdWU6MX19LG5vcm1hbG1hcDp7bm9ybWFsTWFwOnt2YWx1ZTpudWxsfSwKbm9ybWFsU2NhbGU6e3ZhbHVlOm5ldyBkKDEsMSl9fSxkaXNwbGFjZW1lbnRtYXA6e2Rpc3BsYWNlbWVudE1hcDp7dmFsdWU6bnVsbH0sZGlzcGxhY2VtZW50U2NhbGU6e3ZhbHVlOjF9LGRpc3BsYWNlbWVudEJpYXM6e3ZhbHVlOjB9fSxyb3VnaG5lc3NtYXA6e3JvdWdobmVzc01hcDp7dmFsdWU6bnVsbH19LG1ldGFsbmVzc21hcDp7bWV0YWxuZXNzTWFwOnt2YWx1ZTpudWxsfX0sZ3JhZGllbnRtYXA6e2dyYWRpZW50TWFwOnt2YWx1ZTpudWxsfX0sZm9nOntmb2dEZW5zaXR5Ont2YWx1ZToyLjVFLTR9LGZvZ05lYXI6e3ZhbHVlOjF9LGZvZ0Zhcjp7dmFsdWU6MkUzfSxmb2dDb2xvcjp7dmFsdWU6bmV3IEkoMTY3NzcyMTUpfX0sbGlnaHRzOnthbWJpZW50TGlnaHRDb2xvcjp7dmFsdWU6W119LGxpZ2h0UHJvYmU6e3ZhbHVlOltdfSxkaXJlY3Rpb25hbExpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7ZGlyZWN0aW9uOnt9LGNvbG9yOnt9LHNoYWRvdzp7fSxzaGFkb3dCaWFzOnt9LApzaGFkb3dSYWRpdXM6e30sc2hhZG93TWFwU2l6ZTp7fX19LGRpcmVjdGlvbmFsU2hhZG93TWFwOnt2YWx1ZTpbXX0sZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6e3ZhbHVlOltdfSxzcG90TGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSxwb3NpdGlvbjp7fSxkaXJlY3Rpb246e30sZGlzdGFuY2U6e30sY29uZUNvczp7fSxwZW51bWJyYUNvczp7fSxkZWNheTp7fSxzaGFkb3c6e30sc2hhZG93Qmlhczp7fSxzaGFkb3dSYWRpdXM6e30sc2hhZG93TWFwU2l6ZTp7fX19LHNwb3RTaGFkb3dNYXA6e3ZhbHVlOltdfSxzcG90U2hhZG93TWF0cml4Ont2YWx1ZTpbXX0scG9pbnRMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2NvbG9yOnt9LHBvc2l0aW9uOnt9LGRlY2F5Ont9LGRpc3RhbmNlOnt9LHNoYWRvdzp7fSxzaGFkb3dCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9LHNoYWRvd0NhbWVyYU5lYXI6e30sc2hhZG93Q2FtZXJhRmFyOnt9fX0sCnBvaW50U2hhZG93TWFwOnt2YWx1ZTpbXX0scG9pbnRTaGFkb3dNYXRyaXg6e3ZhbHVlOltdfSxoZW1pc3BoZXJlTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntkaXJlY3Rpb246e30sc2t5Q29sb3I6e30sZ3JvdW5kQ29sb3I6e319fSxyZWN0QXJlYUxpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7Y29sb3I6e30scG9zaXRpb246e30sd2lkdGg6e30saGVpZ2h0Ont9fX19LHBvaW50czp7ZGlmZnVzZTp7dmFsdWU6bmV3IEkoMTU2NTg3MzQpfSxvcGFjaXR5Ont2YWx1ZToxfSxzaXplOnt2YWx1ZToxfSxzY2FsZTp7dmFsdWU6MX0sbWFwOnt2YWx1ZTpudWxsfSx1dlRyYW5zZm9ybTp7dmFsdWU6bmV3IGx9fSxzcHJpdGU6e2RpZmZ1c2U6e3ZhbHVlOm5ldyBJKDE1NjU4NzM0KX0sb3BhY2l0eTp7dmFsdWU6MX0sY2VudGVyOnt2YWx1ZTpuZXcgZCguNSwuNSl9LHJvdGF0aW9uOnt2YWx1ZTowfSxtYXA6e3ZhbHVlOm51bGx9LHV2VHJhbnNmb3JtOnt2YWx1ZTpuZXcgbH19fSx1ZD0Ke2Jhc2ljOnt1bmlmb3JtczpJYihbWWEuY29tbW9uLFlhLnNwZWN1bGFybWFwLFlhLmVudm1hcCxZYS5hb21hcCxZYS5saWdodG1hcCxZYS5mb2ddKSx2ZXJ0ZXhTaGFkZXI6d2IubWVzaGJhc2ljX3ZlcnQsZnJhZ21lbnRTaGFkZXI6d2IubWVzaGJhc2ljX2ZyYWd9LGxhbWJlcnQ6e3VuaWZvcm1zOkliKFtZYS5jb21tb24sWWEuc3BlY3VsYXJtYXAsWWEuZW52bWFwLFlhLmFvbWFwLFlhLmxpZ2h0bWFwLFlhLmVtaXNzaXZlbWFwLFlhLmZvZyxZYS5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgSSgwKX19XSksdmVydGV4U2hhZGVyOndiLm1lc2hsYW1iZXJ0X3ZlcnQsZnJhZ21lbnRTaGFkZXI6d2IubWVzaGxhbWJlcnRfZnJhZ30scGhvbmc6e3VuaWZvcm1zOkliKFtZYS5jb21tb24sWWEuc3BlY3VsYXJtYXAsWWEuZW52bWFwLFlhLmFvbWFwLFlhLmxpZ2h0bWFwLFlhLmVtaXNzaXZlbWFwLFlhLmJ1bXBtYXAsWWEubm9ybWFsbWFwLFlhLmRpc3BsYWNlbWVudG1hcCxZYS5ncmFkaWVudG1hcCwKWWEuZm9nLFlhLmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyBJKDApfSxzcGVjdWxhcjp7dmFsdWU6bmV3IEkoMTExODQ4MSl9LHNoaW5pbmVzczp7dmFsdWU6MzB9fV0pLHZlcnRleFNoYWRlcjp3Yi5tZXNocGhvbmdfdmVydCxmcmFnbWVudFNoYWRlcjp3Yi5tZXNocGhvbmdfZnJhZ30sc3RhbmRhcmQ6e3VuaWZvcm1zOkliKFtZYS5jb21tb24sWWEuZW52bWFwLFlhLmFvbWFwLFlhLmxpZ2h0bWFwLFlhLmVtaXNzaXZlbWFwLFlhLmJ1bXBtYXAsWWEubm9ybWFsbWFwLFlhLmRpc3BsYWNlbWVudG1hcCxZYS5yb3VnaG5lc3NtYXAsWWEubWV0YWxuZXNzbWFwLFlhLmZvZyxZYS5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgSSgwKX0scm91Z2huZXNzOnt2YWx1ZTouNX0sbWV0YWxuZXNzOnt2YWx1ZTouNX0sZW52TWFwSW50ZW5zaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6d2IubWVzaHBoeXNpY2FsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6d2IubWVzaHBoeXNpY2FsX2ZyYWd9LAptYXRjYXA6e3VuaWZvcm1zOkliKFtZYS5jb21tb24sWWEuYnVtcG1hcCxZYS5ub3JtYWxtYXAsWWEuZGlzcGxhY2VtZW50bWFwLFlhLmZvZyx7bWF0Y2FwOnt2YWx1ZTpudWxsfX1dKSx2ZXJ0ZXhTaGFkZXI6d2IubWVzaG1hdGNhcF92ZXJ0LGZyYWdtZW50U2hhZGVyOndiLm1lc2htYXRjYXBfZnJhZ30scG9pbnRzOnt1bmlmb3JtczpJYihbWWEucG9pbnRzLFlhLmZvZ10pLHZlcnRleFNoYWRlcjp3Yi5wb2ludHNfdmVydCxmcmFnbWVudFNoYWRlcjp3Yi5wb2ludHNfZnJhZ30sZGFzaGVkOnt1bmlmb3JtczpJYihbWWEuY29tbW9uLFlhLmZvZyx7c2NhbGU6e3ZhbHVlOjF9LGRhc2hTaXplOnt2YWx1ZToxfSx0b3RhbFNpemU6e3ZhbHVlOjJ9fV0pLHZlcnRleFNoYWRlcjp3Yi5saW5lZGFzaGVkX3ZlcnQsZnJhZ21lbnRTaGFkZXI6d2IubGluZWRhc2hlZF9mcmFnfSxkZXB0aDp7dW5pZm9ybXM6SWIoW1lhLmNvbW1vbixZYS5kaXNwbGFjZW1lbnRtYXBdKSx2ZXJ0ZXhTaGFkZXI6d2IuZGVwdGhfdmVydCwKZnJhZ21lbnRTaGFkZXI6d2IuZGVwdGhfZnJhZ30sbm9ybWFsOnt1bmlmb3JtczpJYihbWWEuY29tbW9uLFlhLmJ1bXBtYXAsWWEubm9ybWFsbWFwLFlhLmRpc3BsYWNlbWVudG1hcCx7b3BhY2l0eTp7dmFsdWU6MX19XSksdmVydGV4U2hhZGVyOndiLm5vcm1hbF92ZXJ0LGZyYWdtZW50U2hhZGVyOndiLm5vcm1hbF9mcmFnfSxzcHJpdGU6e3VuaWZvcm1zOkliKFtZYS5zcHJpdGUsWWEuZm9nXSksdmVydGV4U2hhZGVyOndiLnNwcml0ZV92ZXJ0LGZyYWdtZW50U2hhZGVyOndiLnNwcml0ZV9mcmFnfSxiYWNrZ3JvdW5kOnt1bmlmb3Jtczp7dXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyBsfSx0MkQ6e3ZhbHVlOm51bGx9fSx2ZXJ0ZXhTaGFkZXI6d2IuYmFja2dyb3VuZF92ZXJ0LGZyYWdtZW50U2hhZGVyOndiLmJhY2tncm91bmRfZnJhZ30sY3ViZTp7dW5pZm9ybXM6e3RDdWJlOnt2YWx1ZTpudWxsfSx0RmxpcDp7dmFsdWU6LTF9LG9wYWNpdHk6e3ZhbHVlOjF9fSx2ZXJ0ZXhTaGFkZXI6d2IuY3ViZV92ZXJ0LApmcmFnbWVudFNoYWRlcjp3Yi5jdWJlX2ZyYWd9LGVxdWlyZWN0Ont1bmlmb3Jtczp7dEVxdWlyZWN0Ont2YWx1ZTpudWxsfX0sdmVydGV4U2hhZGVyOndiLmVxdWlyZWN0X3ZlcnQsZnJhZ21lbnRTaGFkZXI6d2IuZXF1aXJlY3RfZnJhZ30sZGlzdGFuY2VSR0JBOnt1bmlmb3JtczpJYihbWWEuY29tbW9uLFlhLmRpc3BsYWNlbWVudG1hcCx7cmVmZXJlbmNlUG9zaXRpb246e3ZhbHVlOm5ldyBnfSxuZWFyRGlzdGFuY2U6e3ZhbHVlOjF9LGZhckRpc3RhbmNlOnt2YWx1ZToxRTN9fV0pLHZlcnRleFNoYWRlcjp3Yi5kaXN0YW5jZVJHQkFfdmVydCxmcmFnbWVudFNoYWRlcjp3Yi5kaXN0YW5jZVJHQkFfZnJhZ30sc2hhZG93Ont1bmlmb3JtczpJYihbWWEubGlnaHRzLFlhLmZvZyx7Y29sb3I6e3ZhbHVlOm5ldyBJKDApfSxvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6d2Iuc2hhZG93X3ZlcnQsZnJhZ21lbnRTaGFkZXI6d2Iuc2hhZG93X2ZyYWd9fTt1ZC5waHlzaWNhbD0Ke3VuaWZvcm1zOkliKFt1ZC5zdGFuZGFyZC51bmlmb3Jtcyx7dHJhbnNwYXJlbmN5Ont2YWx1ZTowfSxjbGVhcmNvYXQ6e3ZhbHVlOjB9LGNsZWFyY29hdFJvdWdobmVzczp7dmFsdWU6MH0sc2hlZW46e3ZhbHVlOm5ldyBJKDApfSxjbGVhcmNvYXROb3JtYWxTY2FsZTp7dmFsdWU6bmV3IGQoMSwxKX0sY2xlYXJjb2F0Tm9ybWFsTWFwOnt2YWx1ZTpudWxsfX1dKSx2ZXJ0ZXhTaGFkZXI6d2IubWVzaHBoeXNpY2FsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6d2IubWVzaHBoeXNpY2FsX2ZyYWd9O2llLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHphLnByb3RvdHlwZSk7aWUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWllO3RkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7dGQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXRkO01kLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGsucHJvdG90eXBlKTtNZC5wcm90b3R5cGUuY29uc3RydWN0b3I9TWQ7TWQucHJvdG90eXBlLmlzQ3ViZVRleHR1cmU9CiEwO09iamVjdC5kZWZpbmVQcm9wZXJ0eShNZC5wcm90b3R5cGUsImltYWdlcyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmltYWdlfSxzZXQ6ZnVuY3Rpb24oYil7dGhpcy5pbWFnZT1ifX0pO0NmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGsucHJvdG90eXBlKTtDZi5wcm90b3R5cGUuY29uc3RydWN0b3I9Q2Y7Q2YucHJvdG90eXBlLmlzRGF0YVRleHR1cmUyREFycmF5PSEwO0RmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGsucHJvdG90eXBlKTtEZi5wcm90b3R5cGUuY29uc3RydWN0b3I9RGY7RGYucHJvdG90eXBlLmlzRGF0YVRleHR1cmUzRD0hMDt2YXIgcm49bmV3IGssYXI9bmV3IENmLGNyPW5ldyBEZixzbj1uZXcgTWQsbG49W10sbm49W10scW49bmV3IEZsb2F0MzJBcnJheSgxNikscG49bmV3IEZsb2F0MzJBcnJheSg5KSxvbj1uZXcgRmxvYXQzMkFycmF5KDQpO3RuLnByb3RvdHlwZS51cGRhdGVDYWNoZT1mdW5jdGlvbihiKXt2YXIgZT10aGlzLmNhY2hlO2IgaW5zdGFuY2VvZgpGbG9hdDMyQXJyYXkmJmUubGVuZ3RoIT09Yi5sZW5ndGgmJih0aGlzLmNhY2hlPW5ldyBGbG9hdDMyQXJyYXkoYi5sZW5ndGgpKTtJYyhlLGIpfTt1bi5wcm90b3R5cGUuc2V0VmFsdWU9ZnVuY3Rpb24oYixlLGgpe2Zvcih2YXIgbT10aGlzLnNlcSx1PTAsdz1tLmxlbmd0aDt1IT09dzsrK3Upe3ZhciBBPW1bdV07QS5zZXRWYWx1ZShiLGVbQS5pZF0saCl9fTt2YXIgb2s9LyhbXHdcZF9dKykoXF0pPyhcW3xcLik/L2c7bGUucHJvdG90eXBlLnNldFZhbHVlPWZ1bmN0aW9uKGIsZSxoLG0pe2U9dGhpcy5tYXBbZV07dm9pZCAwIT09ZSYmZS5zZXRWYWx1ZShiLGgsbSl9O2xlLnByb3RvdHlwZS5zZXRPcHRpb25hbD1mdW5jdGlvbihiLGUsaCl7ZT1lW2hdO3ZvaWQgMCE9PWUmJnRoaXMuc2V0VmFsdWUoYixoLGUpfTtsZS51cGxvYWQ9ZnVuY3Rpb24oYixlLGgsbSl7Zm9yKHZhciB1PTAsdz1lLmxlbmd0aDt1IT09dzsrK3Upe3ZhciBBPWVbdV0sRT1oW0EuaWRdOyExIT09RS5uZWVkc1VwZGF0ZSYmCkEuc2V0VmFsdWUoYixFLnZhbHVlLG0pfX07bGUuc2VxV2l0aFZhbHVlPWZ1bmN0aW9uKGIsZSl7Zm9yKHZhciBoPVtdLG09MCx1PWIubGVuZ3RoO20hPT11OysrbSl7dmFyIHc9YlttXTt3LmlkIGluIGUmJmgucHVzaCh3KX1yZXR1cm4gaH07dmFyIEdyPTAsUHI9MDttZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7bWUucHJvdG90eXBlLmNvbnN0cnVjdG9yPW1lO21lLnByb3RvdHlwZS5pc01lc2hEZXB0aE1hdGVyaWFsPSEwO21lLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMuZGVwdGhQYWNraW5nPWIuZGVwdGhQYWNraW5nO3RoaXMuc2tpbm5pbmc9Yi5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1iLm1vcnBoVGFyZ2V0czt0aGlzLm1hcD1iLm1hcDt0aGlzLmFscGhhTWFwPWIuYWxwaGFNYXA7dGhpcy5kaXNwbGFjZW1lbnRNYXA9Yi5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0KYi5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9Yi5kaXNwbGFjZW1lbnRCaWFzO3RoaXMud2lyZWZyYW1lPWIud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWIud2lyZWZyYW1lTGluZXdpZHRoO3JldHVybiB0aGlzfTtuZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7bmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPW5lO25lLnByb3RvdHlwZS5pc01lc2hEaXN0YW5jZU1hdGVyaWFsPSEwO25lLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMucmVmZXJlbmNlUG9zaXRpb24uY29weShiLnJlZmVyZW5jZVBvc2l0aW9uKTt0aGlzLm5lYXJEaXN0YW5jZT1iLm5lYXJEaXN0YW5jZTt0aGlzLmZhckRpc3RhbmNlPWIuZmFyRGlzdGFuY2U7dGhpcy5za2lubmluZz1iLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWIubW9ycGhUYXJnZXRzO3RoaXMubWFwPWIubWFwO3RoaXMuYWxwaGFNYXA9CmIuYWxwaGFNYXA7dGhpcy5kaXNwbGFjZW1lbnRNYXA9Yi5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1iLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1iLmRpc3BsYWNlbWVudEJpYXM7cmV0dXJuIHRoaXN9O0ZmLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoeS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpGZixpc0dyb3VwOiEwfSk7JGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjokZyxpc0FycmF5Q2FtZXJhOiEwfSk7dmFyIEhuPW5ldyBnLEluPW5ldyBnO09iamVjdC5hc3NpZ24ocWsucHJvdG90eXBlLGMucHJvdG90eXBlKTtPYmplY3QuYXNzaWduKEpuLnByb3RvdHlwZSxjLnByb3RvdHlwZSk7T2JqZWN0LmFzc2lnbih3aS5wcm90b3R5cGUse2lzRm9nRXhwMjohMCxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgd2kodGhpcy5jb2xvciwKdGhpcy5kZW5zaXR5KX0sdG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkZvZ0V4cDIiLGNvbG9yOnRoaXMuY29sb3IuZ2V0SGV4KCksZGVuc2l0eTp0aGlzLmRlbnNpdHl9fX0pO09iamVjdC5hc3NpZ24oeGkucHJvdG90eXBlLHtpc0ZvZzohMCxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgeGkodGhpcy5jb2xvcix0aGlzLm5lYXIsdGhpcy5mYXIpfSx0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiRm9nIixjb2xvcjp0aGlzLmNvbG9yLmdldEhleCgpLG5lYXI6dGhpcy5uZWFyLGZhcjp0aGlzLmZhcn19fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KE9lLnByb3RvdHlwZSwibmVlZHNVcGRhdGUiLHtzZXQ6ZnVuY3Rpb24oYil7ITA9PT1iJiZ0aGlzLnZlcnNpb24rK319KTtPYmplY3QuYXNzaWduKE9lLnByb3RvdHlwZSx7aXNJbnRlcmxlYXZlZEJ1ZmZlcjohMCxvblVwbG9hZENhbGxiYWNrOmZ1bmN0aW9uKCl7fSxzZXRBcnJheTpmdW5jdGlvbihiKXtpZihBcnJheS5pc0FycmF5KGIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuIik7CnRoaXMuY291bnQ9dm9pZCAwIT09Yj9iLmxlbmd0aC90aGlzLnN0cmlkZTowO3RoaXMuYXJyYXk9YjtyZXR1cm4gdGhpc30sc2V0RHluYW1pYzpmdW5jdGlvbihiKXt0aGlzLmR5bmFtaWM9YjtyZXR1cm4gdGhpc30sY29weTpmdW5jdGlvbihiKXt0aGlzLmFycmF5PW5ldyBiLmFycmF5LmNvbnN0cnVjdG9yKGIuYXJyYXkpO3RoaXMuY291bnQ9Yi5jb3VudDt0aGlzLnN0cmlkZT1iLnN0cmlkZTt0aGlzLmR5bmFtaWM9Yi5keW5hbWljO3JldHVybiB0aGlzfSxjb3B5QXQ6ZnVuY3Rpb24oYixlLGgpe2IqPXRoaXMuc3RyaWRlO2gqPWUuc3RyaWRlO2Zvcih2YXIgbT0wLHU9dGhpcy5zdHJpZGU7bTx1O20rKyl0aGlzLmFycmF5W2IrbV09ZS5hcnJheVtoK21dO3JldHVybiB0aGlzfSxzZXQ6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1lJiYoZT0wKTt0aGlzLmFycmF5LnNldChiLGUpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sCm9uVXBsb2FkOmZ1bmN0aW9uKGIpe3RoaXMub25VcGxvYWRDYWxsYmFjaz1iO3JldHVybiB0aGlzfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGJoLnByb3RvdHlwZSx7Y291bnQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRhdGEuY291bnR9fSxhcnJheTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheX19fSk7T2JqZWN0LmFzc2lnbihiaC5wcm90b3R5cGUse2lzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6ITAsc2V0WDpmdW5jdGlvbihiLGUpe3RoaXMuZGF0YS5hcnJheVtiKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXRdPWU7cmV0dXJuIHRoaXN9LHNldFk6ZnVuY3Rpb24oYixlKXt0aGlzLmRhdGEuYXJyYXlbYip0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzFdPWU7cmV0dXJuIHRoaXN9LHNldFo6ZnVuY3Rpb24oYixlKXt0aGlzLmRhdGEuYXJyYXlbYip0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzJdPWU7cmV0dXJuIHRoaXN9LApzZXRXOmZ1bmN0aW9uKGIsZSl7dGhpcy5kYXRhLmFycmF5W2IqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCszXT1lO3JldHVybiB0aGlzfSxnZXRYOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbYip0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0XX0sZ2V0WTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W2IqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCsxXX0sZ2V0WjpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W2IqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCsyXX0sZ2V0VzpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5W2IqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCszXX0sc2V0WFk6ZnVuY3Rpb24oYixlLGgpe2I9Yip0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0O3RoaXMuZGF0YS5hcnJheVtiKzBdPWU7dGhpcy5kYXRhLmFycmF5W2IrMV09aDtyZXR1cm4gdGhpc30sc2V0WFlaOmZ1bmN0aW9uKGIsCmUsaCxtKXtiPWIqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldDt0aGlzLmRhdGEuYXJyYXlbYiswXT1lO3RoaXMuZGF0YS5hcnJheVtiKzFdPWg7dGhpcy5kYXRhLmFycmF5W2IrMl09bTtyZXR1cm4gdGhpc30sc2V0WFlaVzpmdW5jdGlvbihiLGUsaCxtLHUpe2I9Yip0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0O3RoaXMuZGF0YS5hcnJheVtiKzBdPWU7dGhpcy5kYXRhLmFycmF5W2IrMV09aDt0aGlzLmRhdGEuYXJyYXlbYisyXT1tO3RoaXMuZGF0YS5hcnJheVtiKzNdPXU7cmV0dXJuIHRoaXN9fSk7cmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO3JlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1yZTtyZS5wcm90b3R5cGUuaXNTcHJpdGVNYXRlcmlhbD0hMDtyZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbihiKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLmNvbG9yLmNvcHkoYi5jb2xvcik7dGhpcy5tYXA9Yi5tYXA7dGhpcy5yb3RhdGlvbj0KYi5yb3RhdGlvbjt0aGlzLnNpemVBdHRlbnVhdGlvbj1iLnNpemVBdHRlbnVhdGlvbjtyZXR1cm4gdGhpc307dmFyIExmLFJoPW5ldyBnLHhnPW5ldyBnLHlnPW5ldyBnLE1mPW5ldyBkLGRoPW5ldyBkLE9uPW5ldyByLG5qPW5ldyBnLFNoPW5ldyBnLG9qPW5ldyBnLHRvPW5ldyBkLG5sPW5ldyBkLHVvPW5ldyBkO2NoLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoeS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpjaCxpc1Nwcml0ZTohMCxyYXljYXN0OmZ1bmN0aW9uKGIsZSl7bnVsbD09PWIuY2FtZXJhJiZjb25zb2xlLmVycm9yKCdUSFJFRS5TcHJpdGU6ICJSYXljYXN0ZXIuY2FtZXJhIiBuZWVkcyB0byBiZSBzZXQgaW4gb3JkZXIgdG8gcmF5Y2FzdCBhZ2FpbnN0IHNwcml0ZXMuJyk7eGcuc2V0RnJvbU1hdHJpeFNjYWxlKHRoaXMubWF0cml4V29ybGQpO09uLmNvcHkoYi5jYW1lcmEubWF0cml4V29ybGQpO3RoaXMubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoYi5jYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLAp0aGlzLm1hdHJpeFdvcmxkKTt5Zy5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tb2RlbFZpZXdNYXRyaXgpO2IuY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEmJiExPT09dGhpcy5tYXRlcmlhbC5zaXplQXR0ZW51YXRpb24mJnhnLm11bHRpcGx5U2NhbGFyKC15Zy56KTt2YXIgaD10aGlzLm1hdGVyaWFsLnJvdGF0aW9uO2lmKDAhPT1oKXt2YXIgbT1NYXRoLmNvcyhoKTt2YXIgdT1NYXRoLnNpbihoKX1oPXRoaXMuY2VudGVyO3lpKG5qLnNldCgtLjUsLS41LDApLHlnLGgseGcsdSxtKTt5aShTaC5zZXQoLjUsLS41LDApLHlnLGgseGcsdSxtKTt5aShvai5zZXQoLjUsLjUsMCkseWcsaCx4Zyx1LG0pO3RvLnNldCgwLDApO25sLnNldCgxLDApO3VvLnNldCgxLDEpO3ZhciB3PWIucmF5LmludGVyc2VjdFRyaWFuZ2xlKG5qLFNoLG9qLCExLFJoKTtpZihudWxsPT09dyYmKHlpKFNoLnNldCgtLjUsLjUsMCkseWcsaCx4Zyx1LG0pLG5sLnNldCgwLDEpLHc9Yi5yYXkuaW50ZXJzZWN0VHJpYW5nbGUobmosCm9qLFNoLCExLFJoKSxudWxsPT09dykpcmV0dXJuO3U9Yi5yYXkub3JpZ2luLmRpc3RhbmNlVG8oUmgpO3U8Yi5uZWFyfHx1PmIuZmFyfHxlLnB1c2goe2Rpc3RhbmNlOnUscG9pbnQ6UmguY2xvbmUoKSx1djpCLmdldFVWKFJoLG5qLFNoLG9qLHRvLG5sLHVvLG5ldyBkKSxmYWNlOm51bGwsb2JqZWN0OnRoaXN9KX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5tYXRlcmlhbCkpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7eS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dm9pZCAwIT09Yi5jZW50ZXImJnRoaXMuY2VudGVyLmNvcHkoYi5jZW50ZXIpO3JldHVybiB0aGlzfX0pO3ZhciBwaj1uZXcgZyx2bz1uZXcgZztlaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHkucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6ZWgsaXNMT0Q6ITAsY29weTpmdW5jdGlvbihiKXt5LnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYiwhMSk7Yj1iLmxldmVscztmb3IodmFyIGU9MCxoPWIubGVuZ3RoO2U8aDtlKyspe3ZhciBtPWJbZV07dGhpcy5hZGRMZXZlbChtLm9iamVjdC5jbG9uZSgpLG0uZGlzdGFuY2UpfXJldHVybiB0aGlzfSxhZGRMZXZlbDpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihlPTApO2U9TWF0aC5hYnMoZSk7Zm9yKHZhciBoPXRoaXMubGV2ZWxzLG09MDttPGgubGVuZ3RoJiYhKGU8aFttXS5kaXN0YW5jZSk7bSsrKTtoLnNwbGljZShtLDAse2Rpc3RhbmNlOmUsb2JqZWN0OmJ9KTt0aGlzLmFkZChiKTtyZXR1cm4gdGhpc30sZ2V0T2JqZWN0Rm9yRGlzdGFuY2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPXRoaXMubGV2ZWxzLGg9MSxtPWUubGVuZ3RoO2g8bSYmIShiPGVbaF0uZGlzdGFuY2UpO2grKyk7cmV0dXJuIGVbaC0xXS5vYmplY3R9LHJheWNhc3Q6ZnVuY3Rpb24oYixlKXtwai5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7dGhpcy5nZXRPYmplY3RGb3JEaXN0YW5jZShiLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhwaikpLnJheWNhc3QoYiwKZSl9LHVwZGF0ZTpmdW5jdGlvbihiKXt2YXIgZT10aGlzLmxldmVscztpZigxPGUubGVuZ3RoKXtwai5zZXRGcm9tTWF0cml4UG9zaXRpb24oYi5tYXRyaXhXb3JsZCk7dm8uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpO2I9cGouZGlzdGFuY2VUbyh2byk7ZVswXS5vYmplY3QudmlzaWJsZT0hMDtmb3IodmFyIGg9MSxtPWUubGVuZ3RoO2g8bTtoKyspaWYoYj49ZVtoXS5kaXN0YW5jZSllW2gtMV0ub2JqZWN0LnZpc2libGU9ITEsZVtoXS5vYmplY3QudmlzaWJsZT0hMDtlbHNlIGJyZWFrO2Zvcig7aDxtO2grKyllW2hdLm9iamVjdC52aXNpYmxlPSExfX0sdG9KU09OOmZ1bmN0aW9uKGIpe2I9eS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxiKTtiLm9iamVjdC5sZXZlbHM9W107Zm9yKHZhciBlPXRoaXMubGV2ZWxzLGg9MCxtPWUubGVuZ3RoO2g8bTtoKyspe3ZhciB1PWVbaF07Yi5vYmplY3QubGV2ZWxzLnB1c2goe29iamVjdDp1Lm9iamVjdC51dWlkLApkaXN0YW5jZTp1LmRpc3RhbmNlfSl9cmV0dXJuIGJ9fSk7ZmgucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpmaCxpc1NraW5uZWRNZXNoOiEwLGJpbmQ6ZnVuY3Rpb24oYixlKXt0aGlzLnNrZWxldG9uPWI7dm9pZCAwPT09ZSYmKHRoaXMudXBkYXRlTWF0cml4V29ybGQoITApLHRoaXMuc2tlbGV0b24uY2FsY3VsYXRlSW52ZXJzZXMoKSxlPXRoaXMubWF0cml4V29ybGQpO3RoaXMuYmluZE1hdHJpeC5jb3B5KGUpO3RoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZShlKX0scG9zZTpmdW5jdGlvbigpe3RoaXMuc2tlbGV0b24ucG9zZSgpfSxub3JtYWxpemVTa2luV2VpZ2h0czpmdW5jdGlvbigpe2Zvcih2YXIgYj1uZXcgbixlPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0LGg9MCxtPWUuY291bnQ7aDxtO2grKyl7Yi54PWUuZ2V0WChoKTtiLnk9ZS5nZXRZKGgpO2Iuej1lLmdldFooaCk7CmIudz1lLmdldFcoaCk7dmFyIHU9MS9iLm1hbmhhdHRhbkxlbmd0aCgpO0luZmluaXR5IT09dT9iLm11bHRpcGx5U2NhbGFyKHUpOmIuc2V0KDEsMCwwLDApO2Uuc2V0WFlaVyhoLGIueCxiLnksYi56LGIudyl9fSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihiKXt5YS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCh0aGlzLGIpOyJhdHRhY2hlZCI9PT10aGlzLmJpbmRNb2RlP3RoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSh0aGlzLm1hdHJpeFdvcmxkKToiZGV0YWNoZWQiPT09dGhpcy5iaW5kTW9kZT90aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmdldEludmVyc2UodGhpcy5iaW5kTWF0cml4KTpjb25zb2xlLndhcm4oIlRIUkVFLlNraW5uZWRNZXNoOiBVbnJlY29nbml6ZWQgYmluZE1vZGU6ICIrdGhpcy5iaW5kTW9kZSl9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuZ2VvbWV0cnksdGhpcy5tYXRlcmlhbCkpLmNvcHkodGhpcyl9fSk7CnZhciB3bz1uZXcgcixFcz1uZXcgcjtPYmplY3QuYXNzaWduKHppLnByb3RvdHlwZSx7Y2FsY3VsYXRlSW52ZXJzZXM6ZnVuY3Rpb24oKXt0aGlzLmJvbmVJbnZlcnNlcz1bXTtmb3IodmFyIGI9MCxlPXRoaXMuYm9uZXMubGVuZ3RoO2I8ZTtiKyspe3ZhciBoPW5ldyByO3RoaXMuYm9uZXNbYl0mJmguZ2V0SW52ZXJzZSh0aGlzLmJvbmVzW2JdLm1hdHJpeFdvcmxkKTt0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKGgpfX0scG9zZTpmdW5jdGlvbigpe3ZhciBiLGU7dmFyIGg9MDtmb3IoZT10aGlzLmJvbmVzLmxlbmd0aDtoPGU7aCsrKShiPXRoaXMuYm9uZXNbaF0pJiZiLm1hdHJpeFdvcmxkLmdldEludmVyc2UodGhpcy5ib25lSW52ZXJzZXNbaF0pO2g9MDtmb3IoZT10aGlzLmJvbmVzLmxlbmd0aDtoPGU7aCsrKWlmKGI9dGhpcy5ib25lc1toXSliLnBhcmVudCYmYi5wYXJlbnQuaXNCb25lPyhiLm1hdHJpeC5nZXRJbnZlcnNlKGIucGFyZW50Lm1hdHJpeFdvcmxkKSxiLm1hdHJpeC5tdWx0aXBseShiLm1hdHJpeFdvcmxkKSk6CmIubWF0cml4LmNvcHkoYi5tYXRyaXhXb3JsZCksYi5tYXRyaXguZGVjb21wb3NlKGIucG9zaXRpb24sYi5xdWF0ZXJuaW9uLGIuc2NhbGUpfSx1cGRhdGU6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5ib25lcyxlPXRoaXMuYm9uZUludmVyc2VzLGg9dGhpcy5ib25lTWF0cmljZXMsbT10aGlzLmJvbmVUZXh0dXJlLHU9MCx3PWIubGVuZ3RoO3U8dzt1Kyspd28ubXVsdGlwbHlNYXRyaWNlcyhiW3VdP2JbdV0ubWF0cml4V29ybGQ6RXMsZVt1XSksd28udG9BcnJheShoLDE2KnUpO3ZvaWQgMCE9PW0mJihtLm5lZWRzVXBkYXRlPSEwKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHppKHRoaXMuYm9uZXMsdGhpcy5ib25lSW52ZXJzZXMpfSxnZXRCb25lQnlOYW1lOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZT0wLGg9dGhpcy5ib25lcy5sZW5ndGg7ZTxoO2UrKyl7dmFyIG09dGhpcy5ib25lc1tlXTtpZihtLm5hbWU9PT1iKXJldHVybiBtfX19KTt4ay5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHkucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOnhrLGlzQm9uZTohMH0pO09iLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtPYi5wcm90b3R5cGUuY29uc3RydWN0b3I9T2I7T2IucHJvdG90eXBlLmlzTGluZUJhc2ljTWF0ZXJpYWw9ITA7T2IucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5jb2xvci5jb3B5KGIuY29sb3IpO3RoaXMubGluZXdpZHRoPWIubGluZXdpZHRoO3RoaXMubGluZWNhcD1iLmxpbmVjYXA7dGhpcy5saW5lam9pbj1iLmxpbmVqb2luO3JldHVybiB0aGlzfTt2YXIgeG89bmV3IGcseW89bmV3IGcsem89bmV3IHIscWo9bmV3IEQsVGg9bmV3IEY7bWMucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh5LnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOm1jLGlzTGluZTohMCxjb21wdXRlTGluZURpc3RhbmNlczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2VvbWV0cnk7aWYoYi5pc0J1ZmZlckdlb21ldHJ5KWlmKG51bGw9PT0KYi5pbmRleCl7Zm9yKHZhciBlPWIuYXR0cmlidXRlcy5wb3NpdGlvbixoPVswXSxtPTEsdT1lLmNvdW50O208dTttKyspeG8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLG0tMSkseW8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLG0pLGhbbV09aFttLTFdLGhbbV0rPXhvLmRpc3RhbmNlVG8oeW8pO2IuYWRkQXR0cmlidXRlKCJsaW5lRGlzdGFuY2UiLG5ldyBkYShoLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuIik7ZWxzZSBpZihiLmlzR2VvbWV0cnkpZm9yKGU9Yi52ZXJ0aWNlcyxoPWIubGluZURpc3RhbmNlcyxoWzBdPTAsbT0xLHU9ZS5sZW5ndGg7bTx1O20rKyloW21dPWhbbS0xXSxoW21dKz1lW20tMV0uZGlzdGFuY2VUbyhlW21dKTtyZXR1cm4gdGhpc30scmF5Y2FzdDpmdW5jdGlvbihiLGUpe3ZhciBoPWIubGluZVByZWNpc2lvbiwKbT10aGlzLmdlb21ldHJ5LHU9dGhpcy5tYXRyaXhXb3JsZDtudWxsPT09bS5ib3VuZGluZ1NwaGVyZSYmbS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtUaC5jb3B5KG0uYm91bmRpbmdTcGhlcmUpO1RoLmFwcGx5TWF0cml4NCh1KTtUaC5yYWRpdXMrPWg7aWYoITEhPT1iLnJheS5pbnRlcnNlY3RzU3BoZXJlKFRoKSl7em8uZ2V0SW52ZXJzZSh1KTtxai5jb3B5KGIucmF5KS5hcHBseU1hdHJpeDQoem8pO2gvPSh0aGlzLnNjYWxlLngrdGhpcy5zY2FsZS55K3RoaXMuc2NhbGUueikvMztoKj1oO3ZhciB3PW5ldyBnLEE9bmV3IGc7dT1uZXcgZzt2YXIgRT1uZXcgZyxHPXRoaXMmJnRoaXMuaXNMaW5lU2VnbWVudHM/MjoxO2lmKG0uaXNCdWZmZXJHZW9tZXRyeSl7dmFyIEo9bS5pbmRleCxRPW0uYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtpZihudWxsIT09Sil7Sj1KLmFycmF5O209MDtmb3IodmFyIFM9Si5sZW5ndGgtMTttPFM7bSs9Ryl7dmFyIFQ9SlttKzFdO3cuZnJvbUFycmF5KFEsCjMqSlttXSk7QS5mcm9tQXJyYXkoUSwzKlQpO1Q9cWouZGlzdGFuY2VTcVRvU2VnbWVudCh3LEEsRSx1KTtUPmh8fChFLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxUPWIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKEUpLFQ8Yi5uZWFyfHxUPmIuZmFyfHxlLnB1c2goe2Rpc3RhbmNlOlQscG9pbnQ6dS5jbG9uZSgpLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxpbmRleDptLGZhY2U6bnVsbCxmYWNlSW5kZXg6bnVsbCxvYmplY3Q6dGhpc30pKX19ZWxzZSBmb3IobT0wLFM9US5sZW5ndGgvMy0xO208UzttKz1HKXcuZnJvbUFycmF5KFEsMyptKSxBLmZyb21BcnJheShRLDMqbSszKSxUPXFqLmRpc3RhbmNlU3FUb1NlZ21lbnQodyxBLEUsdSksVD5ofHwoRS5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCksVD1iLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhFKSxUPGIubmVhcnx8VD5iLmZhcnx8ZS5wdXNoKHtkaXN0YW5jZTpULHBvaW50OnUuY2xvbmUoKS5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCksCmluZGV4Om0sZmFjZTpudWxsLGZhY2VJbmRleDpudWxsLG9iamVjdDp0aGlzfSkpfWVsc2UgaWYobS5pc0dlb21ldHJ5KWZvcih3PW0udmVydGljZXMsQT13Lmxlbmd0aCxtPTA7bTxBLTE7bSs9RylUPXFqLmRpc3RhbmNlU3FUb1NlZ21lbnQod1ttXSx3W20rMV0sRSx1KSxUPmh8fChFLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxUPWIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKEUpLFQ8Yi5uZWFyfHxUPmIuZmFyfHxlLnB1c2goe2Rpc3RhbmNlOlQscG9pbnQ6dS5jbG9uZSgpLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxpbmRleDptLGZhY2U6bnVsbCxmYWNlSW5kZXg6bnVsbCxvYmplY3Q6dGhpc30pKX19LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuZ2VvbWV0cnksdGhpcy5tYXRlcmlhbCkpLmNvcHkodGhpcyl9fSk7dmFyIHJqPW5ldyBnLHNqPW5ldyBnO1NiLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobWMucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOlNiLGlzTGluZVNlZ21lbnRzOiEwLGNvbXB1dGVMaW5lRGlzdGFuY2VzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZW9tZXRyeTtpZihiLmlzQnVmZmVyR2VvbWV0cnkpaWYobnVsbD09PWIuaW5kZXgpe2Zvcih2YXIgZT1iLmF0dHJpYnV0ZXMucG9zaXRpb24saD1bXSxtPTAsdT1lLmNvdW50O208dTttKz0yKXJqLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxtKSxzai5mcm9tQnVmZmVyQXR0cmlidXRlKGUsbSsxKSxoW21dPTA9PT1tPzA6aFttLTFdLGhbbSsxXT1oW21dK3JqLmRpc3RhbmNlVG8oc2opO2IuYWRkQXR0cmlidXRlKCJsaW5lRGlzdGFuY2UiLG5ldyBkYShoLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZVNlZ21lbnRzLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4iKTtlbHNlIGlmKGIuaXNHZW9tZXRyeSlmb3IoZT1iLnZlcnRpY2VzLGg9CmIubGluZURpc3RhbmNlcyxtPTAsdT1lLmxlbmd0aDttPHU7bSs9Milyai5jb3B5KGVbbV0pLHNqLmNvcHkoZVttKzFdKSxoW21dPTA9PT1tPzA6aFttLTFdLGhbbSsxXT1oW21dK3JqLmRpc3RhbmNlVG8oc2opO3JldHVybiB0aGlzfX0pO0FpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobWMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6QWksaXNMaW5lTG9vcDohMH0pO2NkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtjZC5wcm90b3R5cGUuY29uc3RydWN0b3I9Y2Q7Y2QucHJvdG90eXBlLmlzUG9pbnRzTWF0ZXJpYWw9ITA7Y2QucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5jb2xvci5jb3B5KGIuY29sb3IpO3RoaXMubWFwPWIubWFwO3RoaXMuc2l6ZT1iLnNpemU7dGhpcy5zaXplQXR0ZW51YXRpb249Yi5zaXplQXR0ZW51YXRpb247dGhpcy5tb3JwaFRhcmdldHM9Yi5tb3JwaFRhcmdldHM7CnJldHVybiB0aGlzfTt2YXIgQW89bmV3IHIsems9bmV3IEQsVWg9bmV3IEYsdGo9bmV3IGc7TmYucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh5LnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOk5mLGlzUG9pbnRzOiEwLHJheWNhc3Q6ZnVuY3Rpb24oYixlKXt2YXIgaD10aGlzLmdlb21ldHJ5LG09dGhpcy5tYXRyaXhXb3JsZCx1PWIucGFyYW1zLlBvaW50cy50aHJlc2hvbGQ7bnVsbD09PWguYm91bmRpbmdTcGhlcmUmJmguY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7VWguY29weShoLmJvdW5kaW5nU3BoZXJlKTtVaC5hcHBseU1hdHJpeDQobSk7VWgucmFkaXVzKz11O2lmKCExIT09Yi5yYXkuaW50ZXJzZWN0c1NwaGVyZShVaCkpaWYoQW8uZ2V0SW52ZXJzZShtKSx6ay5jb3B5KGIucmF5KS5hcHBseU1hdHJpeDQoQW8pLHUvPSh0aGlzLnNjYWxlLngrdGhpcy5zY2FsZS55K3RoaXMuc2NhbGUueikvMyx1Kj11LGguaXNCdWZmZXJHZW9tZXRyeSl7dmFyIHc9aC5pbmRleDsKaD1oLmF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7aWYobnVsbCE9PXcpe3ZhciBBPXcuYXJyYXk7dz0wO2Zvcih2YXIgRT1BLmxlbmd0aDt3PEU7dysrKXt2YXIgRz1BW3ddO3RqLmZyb21BcnJheShoLDMqRyk7eWsodGosRyx1LG0sYixlLHRoaXMpfX1lbHNlIGZvcih3PTAsQT1oLmxlbmd0aC8zO3c8QTt3KyspdGouZnJvbUFycmF5KGgsMyp3KSx5ayh0aix3LHUsbSxiLGUsdGhpcyl9ZWxzZSBmb3IoaD1oLnZlcnRpY2VzLHc9MCxBPWgubGVuZ3RoO3c8QTt3KyspeWsoaFt3XSx3LHUsbSxiLGUsdGhpcyl9LHVwZGF0ZU1vcnBoVGFyZ2V0czpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2VvbWV0cnk7aWYoYi5pc0J1ZmZlckdlb21ldHJ5KXtiPWIubW9ycGhBdHRyaWJ1dGVzO3ZhciBlPU9iamVjdC5rZXlzKGIpO2lmKDA8ZS5sZW5ndGgpe3ZhciBoPWJbZVswXV07aWYodm9pZCAwIT09aClmb3IodGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9W10sdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9Cnt9LGI9MCxlPWgubGVuZ3RoO2I8ZTtiKyspe3ZhciBtPWhbYl0ubmFtZXx8U3RyaW5nKGIpO3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goMCk7dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbbV09Yn19fWVsc2UgYj1iLm1vcnBoVGFyZ2V0cyx2b2lkIDAhPT1iJiYwPGIubGVuZ3RoJiZjb25zb2xlLmVycm9yKCJUSFJFRS5Qb2ludHMudXBkYXRlTW9ycGhUYXJnZXRzKCkgZG9lcyBub3Qgc3VwcG9ydCBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIil9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuZ2VvbWV0cnksdGhpcy5tYXRlcmlhbCkpLmNvcHkodGhpcyl9fSk7QWsucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShrLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkFrLGlzVmlkZW9UZXh0dXJlOiEwLHVwZGF0ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuaW1hZ2U7Yi5yZWFkeVN0YXRlPj0KYi5IQVZFX0NVUlJFTlRfREFUQSYmKHRoaXMubmVlZHNVcGRhdGU9ITApfX0pO09mLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGsucHJvdG90eXBlKTtPZi5wcm90b3R5cGUuY29uc3RydWN0b3I9T2Y7T2YucHJvdG90eXBlLmlzQ29tcHJlc3NlZFRleHR1cmU9ITA7Z2gucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoay5wcm90b3R5cGUpO2doLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1naDtnaC5wcm90b3R5cGUuaXNDYW52YXNUZXh0dXJlPSEwO2hoLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGsucHJvdG90eXBlKTtoaC5wcm90b3R5cGUuY29uc3RydWN0b3I9aGg7aGgucHJvdG90eXBlLmlzRGVwdGhUZXh0dXJlPSEwO1BmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7UGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPVBmO2loLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHphLnByb3RvdHlwZSk7aWgucHJvdG90eXBlLmNvbnN0cnVjdG9yPWloO1FmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7ClFmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1RZjtqaC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh6YS5wcm90b3R5cGUpO2poLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1qaDtGYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO0ZjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1GYztraC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh6YS5wcm90b3R5cGUpO2toLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1raDtSZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShGYy5wcm90b3R5cGUpO1JmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1SZjtsaC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh6YS5wcm90b3R5cGUpO2xoLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1saDtQZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShGYy5wcm90b3R5cGUpO1BlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1QZTttaC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh6YS5wcm90b3R5cGUpO21oLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj0KbWg7U2YucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRmMucHJvdG90eXBlKTtTZi5wcm90b3R5cGUuY29uc3RydWN0b3I9U2Y7bmgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoemEucHJvdG90eXBlKTtuaC5wcm90b3R5cGUuY29uc3RydWN0b3I9bmg7VGYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRmMucHJvdG90eXBlKTtUZi5wcm90b3R5cGUuY29uc3RydWN0b3I9VGY7b2gucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoemEucHJvdG90eXBlKTtvaC5wcm90b3R5cGUuY29uc3RydWN0b3I9b2g7UWUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTtRZS5wcm90b3R5cGUuY29uc3RydWN0b3I9UWU7UWUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBiPXhhLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLnBhdGg9dGhpcy5wYXJhbWV0ZXJzLnBhdGgudG9KU09OKCk7cmV0dXJuIGJ9O3BoLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHphLnByb3RvdHlwZSk7CnBoLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1waDtVZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO1VmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1VZjtxaC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh6YS5wcm90b3R5cGUpO3FoLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1xaDtWZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO1ZmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1WZjt2YXIgRnM9e3RyaWFuZ3VsYXRlOmZ1bmN0aW9uKGIsZSxoKXtoPWh8fDI7dmFyIG09ZSYmZS5sZW5ndGgsdT1tP2VbMF0qaDpiLmxlbmd0aCx3PVBuKGIsMCx1LGgsITApLEE9W107aWYoIXd8fHcubmV4dD09PXcucHJldilyZXR1cm4gQTttJiYodz0kcihiLGUsdyxoKSk7aWYoYi5sZW5ndGg+ODAqaCl7dmFyIEU9ZT1iWzBdO3ZhciBHPW09YlsxXTtmb3IodmFyIEo9aDtKPHU7Sis9aCl7dmFyIFE9YltKXTt2YXIgUz1iW0orMV07UTxFJiYoRT1RKTtTPEcmJihHPVMpOwpRPmUmJihlPVEpO1M+bSYmKG09Uyl9UT1NYXRoLm1heChlLUUsbS1HKTtRPTAhPT1RPzEvUTowfXRoKHcsQSxoLEUsRyxRKTtyZXR1cm4gQX19LE9kPXthcmVhOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZT1iLmxlbmd0aCxoPTAsbT1lLTEsdT0wO3U8ZTttPXUrKyloKz1iW21dLngqYlt1XS55LWJbdV0ueCpiW21dLnk7cmV0dXJuLjUqaH0saXNDbG9ja1dpc2U6ZnVuY3Rpb24oYil7cmV0dXJuIDA+T2QuYXJlYShiKX0sdHJpYW5ndWxhdGVTaGFwZTpmdW5jdGlvbihiLGUpe3ZhciBoPVtdLG09W10sdT1bXTtUbihiKTtVbihoLGIpO3ZhciB3PWIubGVuZ3RoO2UuZm9yRWFjaChUbik7Zm9yKGI9MDtiPGUubGVuZ3RoO2IrKyltLnB1c2godyksdys9ZVtiXS5sZW5ndGgsVW4oaCxlW2JdKTtlPUZzLnRyaWFuZ3VsYXRlKGgsbSk7Zm9yKGI9MDtiPGUubGVuZ3RoO2IrPTMpdS5wdXNoKGUuc2xpY2UoYixiKzMpKTtyZXR1cm4gdX19O1NlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHphLnByb3RvdHlwZSk7ClNlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1TZTtTZS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGI9emEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO3JldHVybiBWbih0aGlzLnBhcmFtZXRlcnMuc2hhcGVzLHRoaXMucGFyYW1ldGVycy5vcHRpb25zLGIpfTt6ZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO3pkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj16ZDt6ZC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGI9eGEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO3JldHVybiBWbih0aGlzLnBhcmFtZXRlcnMuc2hhcGVzLHRoaXMucGFyYW1ldGVycy5vcHRpb25zLGIpfTt2YXIgaHM9e2dlbmVyYXRlVG9wVVY6ZnVuY3Rpb24oYixlLGgsbSx1KXtiPWVbMyptXTttPWVbMyptKzFdO3ZhciB3PWVbMyp1XTt1PWVbMyp1KzFdO3JldHVybltuZXcgZChlWzMqaF0sZVszKmgrMV0pLG5ldyBkKGIsbSksbmV3IGQodyx1KV19LGdlbmVyYXRlU2lkZVdhbGxVVjpmdW5jdGlvbihiLAplLGgsbSx1LHcpe2I9ZVszKmhdO3ZhciBBPWVbMypoKzFdO2g9ZVszKmgrMl07dmFyIEU9ZVszKm1dLEc9ZVszKm0rMV07bT1lWzMqbSsyXTt2YXIgSj1lWzMqdV0sUT1lWzMqdSsxXTt1PWVbMyp1KzJdO3ZhciBTPWVbMyp3XSxUPWVbMyp3KzFdO2U9ZVszKncrMl07cmV0dXJuLjAxPk1hdGguYWJzKEEtRyk/W25ldyBkKGIsMS1oKSxuZXcgZChFLDEtbSksbmV3IGQoSiwxLXUpLG5ldyBkKFMsMS1lKV06W25ldyBkKEEsMS1oKSxuZXcgZChHLDEtbSksbmV3IGQoUSwxLXUpLG5ldyBkKFQsMS1lKV19fTt2aC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh6YS5wcm90b3R5cGUpO3ZoLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj12aDtYZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh6ZC5wcm90b3R5cGUpO1hmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1YZjt3aC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh6YS5wcm90b3R5cGUpO3doLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj13aDtzZS5wcm90b3R5cGU9Ck9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTtzZS5wcm90b3R5cGUuY29uc3RydWN0b3I9c2U7eGgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoemEucHJvdG90eXBlKTt4aC5wcm90b3R5cGUuY29uc3RydWN0b3I9eGg7WWYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTtZZi5wcm90b3R5cGUuY29uc3RydWN0b3I9WWY7eWgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoemEucHJvdG90eXBlKTt5aC5wcm90b3R5cGUuY29uc3RydWN0b3I9eWg7WmYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeGEucHJvdG90eXBlKTtaZi5wcm90b3R5cGUuY29uc3RydWN0b3I9WmY7VGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoemEucHJvdG90eXBlKTtUZS5wcm90b3R5cGUuY29uc3RydWN0b3I9VGU7VGUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBiPXphLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtyZXR1cm4gV24odGhpcy5wYXJhbWV0ZXJzLnNoYXBlcywKYil9O1VlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7VWUucHJvdG90eXBlLmNvbnN0cnVjdG9yPVVlO1VlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYj14YS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7cmV0dXJuIFduKHRoaXMucGFyYW1ldGVycy5zaGFwZXMsYil9OyRmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7JGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPSRmO1ZlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHphLnByb3RvdHlwZSk7VmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPVZlO1BkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7UGQucHJvdG90eXBlLmNvbnN0cnVjdG9yPVBkO3poLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFZlLnByb3RvdHlwZSk7emgucHJvdG90eXBlLmNvbnN0cnVjdG9yPXpoO0FoLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFBkLnByb3RvdHlwZSk7QWgucHJvdG90eXBlLmNvbnN0cnVjdG9yPQpBaDtCaC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh6YS5wcm90b3R5cGUpO0JoLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1CaDthZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpO2FnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hZzt2YXIgQ2M9T2JqZWN0LmZyZWV6ZSh7V2lyZWZyYW1lR2VvbWV0cnk6UGYsUGFyYW1ldHJpY0dlb21ldHJ5OmloLFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeTpRZixUZXRyYWhlZHJvbkdlb21ldHJ5OmtoLFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk6UmYsT2N0YWhlZHJvbkdlb21ldHJ5OmxoLE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeTpQZSxJY29zYWhlZHJvbkdlb21ldHJ5Om1oLEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnk6U2YsRG9kZWNhaGVkcm9uR2VvbWV0cnk6bmgsRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnk6VGYsUG9seWhlZHJvbkdlb21ldHJ5OmpoLFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeTpGYyxUdWJlR2VvbWV0cnk6b2gsClR1YmVCdWZmZXJHZW9tZXRyeTpRZSxUb3J1c0tub3RHZW9tZXRyeTpwaCxUb3J1c0tub3RCdWZmZXJHZW9tZXRyeTpVZixUb3J1c0dlb21ldHJ5OnFoLFRvcnVzQnVmZmVyR2VvbWV0cnk6VmYsVGV4dEdlb21ldHJ5OnZoLFRleHRCdWZmZXJHZW9tZXRyeTpYZixTcGhlcmVHZW9tZXRyeTp3aCxTcGhlcmVCdWZmZXJHZW9tZXRyeTpzZSxSaW5nR2VvbWV0cnk6eGgsUmluZ0J1ZmZlckdlb21ldHJ5OllmLFBsYW5lR2VvbWV0cnk6aWUsUGxhbmVCdWZmZXJHZW9tZXRyeTp0ZCxMYXRoZUdlb21ldHJ5OnloLExhdGhlQnVmZmVyR2VvbWV0cnk6WmYsU2hhcGVHZW9tZXRyeTpUZSxTaGFwZUJ1ZmZlckdlb21ldHJ5OlVlLEV4dHJ1ZGVHZW9tZXRyeTpTZSxFeHRydWRlQnVmZmVyR2VvbWV0cnk6emQsRWRnZXNHZW9tZXRyeTokZixDb25lR2VvbWV0cnk6emgsQ29uZUJ1ZmZlckdlb21ldHJ5OkFoLEN5bGluZGVyR2VvbWV0cnk6VmUsQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeTpQZCxDaXJjbGVHZW9tZXRyeTpCaCwKQ2lyY2xlQnVmZmVyR2VvbWV0cnk6YWcsQm94R2VvbWV0cnk6VWEsQm94QnVmZmVyR2VvbWV0cnk6WmF9KTtXZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7V2UucHJvdG90eXBlLmNvbnN0cnVjdG9yPVdlO1dlLnByb3RvdHlwZS5pc1NoYWRvd01hdGVyaWFsPSEwO1dlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMuY29sb3IuY29weShiLmNvbG9yKTtyZXR1cm4gdGhpc307YmcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodWIucHJvdG90eXBlKTtiZy5wcm90b3R5cGUuY29uc3RydWN0b3I9Ymc7YmcucHJvdG90eXBlLmlzUmF3U2hhZGVyTWF0ZXJpYWw9ITA7QWQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO0FkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1BZDtBZC5wcm90b3R5cGUuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD0hMDtBZC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihiKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYik7dGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIn07dGhpcy5jb2xvci5jb3B5KGIuY29sb3IpO3RoaXMucm91Z2huZXNzPWIucm91Z2huZXNzO3RoaXMubWV0YWxuZXNzPWIubWV0YWxuZXNzO3RoaXMubWFwPWIubWFwO3RoaXMubGlnaHRNYXA9Yi5saWdodE1hcDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PWIubGlnaHRNYXBJbnRlbnNpdHk7dGhpcy5hb01hcD1iLmFvTWFwO3RoaXMuYW9NYXBJbnRlbnNpdHk9Yi5hb01hcEludGVuc2l0eTt0aGlzLmVtaXNzaXZlLmNvcHkoYi5lbWlzc2l2ZSk7dGhpcy5lbWlzc2l2ZU1hcD1iLmVtaXNzaXZlTWFwO3RoaXMuZW1pc3NpdmVJbnRlbnNpdHk9Yi5lbWlzc2l2ZUludGVuc2l0eTt0aGlzLmJ1bXBNYXA9Yi5idW1wTWFwO3RoaXMuYnVtcFNjYWxlPWIuYnVtcFNjYWxlO3RoaXMubm9ybWFsTWFwPWIubm9ybWFsTWFwO3RoaXMubm9ybWFsTWFwVHlwZT1iLm5vcm1hbE1hcFR5cGU7dGhpcy5ub3JtYWxTY2FsZS5jb3B5KGIubm9ybWFsU2NhbGUpOwp0aGlzLmRpc3BsYWNlbWVudE1hcD1iLmRpc3BsYWNlbWVudE1hcDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPWIuZGlzcGxhY2VtZW50U2NhbGU7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPWIuZGlzcGxhY2VtZW50Qmlhczt0aGlzLnJvdWdobmVzc01hcD1iLnJvdWdobmVzc01hcDt0aGlzLm1ldGFsbmVzc01hcD1iLm1ldGFsbmVzc01hcDt0aGlzLmFscGhhTWFwPWIuYWxwaGFNYXA7dGhpcy5lbnZNYXA9Yi5lbnZNYXA7dGhpcy5lbnZNYXBJbnRlbnNpdHk9Yi5lbnZNYXBJbnRlbnNpdHk7dGhpcy5yZWZyYWN0aW9uUmF0aW89Yi5yZWZyYWN0aW9uUmF0aW87dGhpcy53aXJlZnJhbWU9Yi53aXJlZnJhbWU7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9Yi53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy53aXJlZnJhbWVMaW5lY2FwPWIud2lyZWZyYW1lTGluZWNhcDt0aGlzLndpcmVmcmFtZUxpbmVqb2luPWIud2lyZWZyYW1lTGluZWpvaW47dGhpcy5za2lubmluZz1iLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPQpiLm1vcnBoVGFyZ2V0czt0aGlzLm1vcnBoTm9ybWFscz1iLm1vcnBoTm9ybWFscztyZXR1cm4gdGhpc307WGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoQWQucHJvdG90eXBlKTtYZS5wcm90b3R5cGUuY29uc3RydWN0b3I9WGU7WGUucHJvdG90eXBlLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWw9ITA7WGUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7QWQucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMuZGVmaW5lcz17U1RBTkRBUkQ6IiIsUEhZU0lDQUw6IiJ9O3RoaXMucmVmbGVjdGl2aXR5PWIucmVmbGVjdGl2aXR5O3RoaXMuY2xlYXJjb2F0PWIuY2xlYXJjb2F0O3RoaXMuY2xlYXJjb2F0Um91Z2huZXNzPWIuY2xlYXJjb2F0Um91Z2huZXNzO3RoaXMuc2hlZW49Yi5zaGVlbj8odGhpcy5zaGVlbnx8bmV3IEkpLmNvcHkoYi5zaGVlbik6bnVsbDt0aGlzLmNsZWFyY29hdE5vcm1hbE1hcD1iLmNsZWFyY29hdE5vcm1hbE1hcDt0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLmNvcHkoYi5jbGVhcmNvYXROb3JtYWxTY2FsZSk7CnRoaXMudHJhbnNwYXJlbmN5PWIudHJhbnNwYXJlbmN5O3JldHVybiB0aGlzfTtkZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7ZGQucHJvdG90eXBlLmNvbnN0cnVjdG9yPWRkO2RkLnByb3RvdHlwZS5pc01lc2hQaG9uZ01hdGVyaWFsPSEwO2RkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMuY29sb3IuY29weShiLmNvbG9yKTt0aGlzLnNwZWN1bGFyLmNvcHkoYi5zcGVjdWxhcik7dGhpcy5zaGluaW5lc3M9Yi5zaGluaW5lc3M7dGhpcy5tYXA9Yi5tYXA7dGhpcy5saWdodE1hcD1iLmxpZ2h0TWFwO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9Yi5saWdodE1hcEludGVuc2l0eTt0aGlzLmFvTWFwPWIuYW9NYXA7dGhpcy5hb01hcEludGVuc2l0eT1iLmFvTWFwSW50ZW5zaXR5O3RoaXMuZW1pc3NpdmUuY29weShiLmVtaXNzaXZlKTt0aGlzLmVtaXNzaXZlTWFwPWIuZW1pc3NpdmVNYXA7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT0KYi5lbWlzc2l2ZUludGVuc2l0eTt0aGlzLmJ1bXBNYXA9Yi5idW1wTWFwO3RoaXMuYnVtcFNjYWxlPWIuYnVtcFNjYWxlO3RoaXMubm9ybWFsTWFwPWIubm9ybWFsTWFwO3RoaXMubm9ybWFsTWFwVHlwZT1iLm5vcm1hbE1hcFR5cGU7dGhpcy5ub3JtYWxTY2FsZS5jb3B5KGIubm9ybWFsU2NhbGUpO3RoaXMuZGlzcGxhY2VtZW50TWFwPWIuZGlzcGxhY2VtZW50TWFwO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9Yi5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9Yi5kaXNwbGFjZW1lbnRCaWFzO3RoaXMuc3BlY3VsYXJNYXA9Yi5zcGVjdWxhck1hcDt0aGlzLmFscGhhTWFwPWIuYWxwaGFNYXA7dGhpcy5lbnZNYXA9Yi5lbnZNYXA7dGhpcy5jb21iaW5lPWIuY29tYmluZTt0aGlzLnJlZmxlY3Rpdml0eT1iLnJlZmxlY3Rpdml0eTt0aGlzLnJlZnJhY3Rpb25SYXRpbz1iLnJlZnJhY3Rpb25SYXRpbzt0aGlzLndpcmVmcmFtZT1iLndpcmVmcmFtZTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0KYi53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy53aXJlZnJhbWVMaW5lY2FwPWIud2lyZWZyYW1lTGluZWNhcDt0aGlzLndpcmVmcmFtZUxpbmVqb2luPWIud2lyZWZyYW1lTGluZWpvaW47dGhpcy5za2lubmluZz1iLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWIubW9ycGhUYXJnZXRzO3RoaXMubW9ycGhOb3JtYWxzPWIubW9ycGhOb3JtYWxzO3JldHVybiB0aGlzfTtZZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShkZC5wcm90b3R5cGUpO1llLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1ZZTtZZS5wcm90b3R5cGUuaXNNZXNoVG9vbk1hdGVyaWFsPSEwO1llLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe2RkLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLmdyYWRpZW50TWFwPWIuZ3JhZGllbnRNYXA7cmV0dXJuIHRoaXN9O1plLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtaZS5wcm90b3R5cGUuY29uc3RydWN0b3I9WmU7WmUucHJvdG90eXBlLmlzTWVzaE5vcm1hbE1hdGVyaWFsPQohMDtaZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbihiKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLmJ1bXBNYXA9Yi5idW1wTWFwO3RoaXMuYnVtcFNjYWxlPWIuYnVtcFNjYWxlO3RoaXMubm9ybWFsTWFwPWIubm9ybWFsTWFwO3RoaXMubm9ybWFsTWFwVHlwZT1iLm5vcm1hbE1hcFR5cGU7dGhpcy5ub3JtYWxTY2FsZS5jb3B5KGIubm9ybWFsU2NhbGUpO3RoaXMuZGlzcGxhY2VtZW50TWFwPWIuZGlzcGxhY2VtZW50TWFwO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9Yi5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9Yi5kaXNwbGFjZW1lbnRCaWFzO3RoaXMud2lyZWZyYW1lPWIud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWIud2lyZWZyYW1lTGluZXdpZHRoO3RoaXMuc2tpbm5pbmc9Yi5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1iLm1vcnBoVGFyZ2V0czt0aGlzLm1vcnBoTm9ybWFscz1iLm1vcnBoTm9ybWFscztyZXR1cm4gdGhpc307CiRlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTskZS5wcm90b3R5cGUuY29uc3RydWN0b3I9JGU7JGUucHJvdG90eXBlLmlzTWVzaExhbWJlcnRNYXRlcmlhbD0hMDskZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbihiKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLmNvbG9yLmNvcHkoYi5jb2xvcik7dGhpcy5tYXA9Yi5tYXA7dGhpcy5saWdodE1hcD1iLmxpZ2h0TWFwO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9Yi5saWdodE1hcEludGVuc2l0eTt0aGlzLmFvTWFwPWIuYW9NYXA7dGhpcy5hb01hcEludGVuc2l0eT1iLmFvTWFwSW50ZW5zaXR5O3RoaXMuZW1pc3NpdmUuY29weShiLmVtaXNzaXZlKTt0aGlzLmVtaXNzaXZlTWFwPWIuZW1pc3NpdmVNYXA7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT1iLmVtaXNzaXZlSW50ZW5zaXR5O3RoaXMuc3BlY3VsYXJNYXA9Yi5zcGVjdWxhck1hcDt0aGlzLmFscGhhTWFwPWIuYWxwaGFNYXA7dGhpcy5lbnZNYXA9CmIuZW52TWFwO3RoaXMuY29tYmluZT1iLmNvbWJpbmU7dGhpcy5yZWZsZWN0aXZpdHk9Yi5yZWZsZWN0aXZpdHk7dGhpcy5yZWZyYWN0aW9uUmF0aW89Yi5yZWZyYWN0aW9uUmF0aW87dGhpcy53aXJlZnJhbWU9Yi53aXJlZnJhbWU7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9Yi53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy53aXJlZnJhbWVMaW5lY2FwPWIud2lyZWZyYW1lTGluZWNhcDt0aGlzLndpcmVmcmFtZUxpbmVqb2luPWIud2lyZWZyYW1lTGluZWpvaW47dGhpcy5za2lubmluZz1iLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWIubW9ycGhUYXJnZXRzO3RoaXMubW9ycGhOb3JtYWxzPWIubW9ycGhOb3JtYWxzO3JldHVybiB0aGlzfTthZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7YWYucHJvdG90eXBlLmNvbnN0cnVjdG9yPWFmO2FmLnByb3RvdHlwZS5pc01lc2hNYXRjYXBNYXRlcmlhbD0hMDthZi5wcm90b3R5cGUuY29weT1mdW5jdGlvbihiKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYik7dGhpcy5kZWZpbmVzPXtNQVRDQVA6IiJ9O3RoaXMuY29sb3IuY29weShiLmNvbG9yKTt0aGlzLm1hdGNhcD1iLm1hdGNhcDt0aGlzLm1hcD1iLm1hcDt0aGlzLmJ1bXBNYXA9Yi5idW1wTWFwO3RoaXMuYnVtcFNjYWxlPWIuYnVtcFNjYWxlO3RoaXMubm9ybWFsTWFwPWIubm9ybWFsTWFwO3RoaXMubm9ybWFsTWFwVHlwZT1iLm5vcm1hbE1hcFR5cGU7dGhpcy5ub3JtYWxTY2FsZS5jb3B5KGIubm9ybWFsU2NhbGUpO3RoaXMuZGlzcGxhY2VtZW50TWFwPWIuZGlzcGxhY2VtZW50TWFwO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9Yi5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9Yi5kaXNwbGFjZW1lbnRCaWFzO3RoaXMuYWxwaGFNYXA9Yi5hbHBoYU1hcDt0aGlzLnNraW5uaW5nPWIuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9Yi5tb3JwaFRhcmdldHM7dGhpcy5tb3JwaE5vcm1hbHM9Yi5tb3JwaE5vcm1hbHM7cmV0dXJuIHRoaXN9O2JmLnByb3RvdHlwZT0KT2JqZWN0LmNyZWF0ZShPYi5wcm90b3R5cGUpO2JmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iZjtiZi5wcm90b3R5cGUuaXNMaW5lRGFzaGVkTWF0ZXJpYWw9ITA7YmYucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7T2IucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMuc2NhbGU9Yi5zY2FsZTt0aGlzLmRhc2hTaXplPWIuZGFzaFNpemU7dGhpcy5nYXBTaXplPWIuZ2FwU2l6ZTtyZXR1cm4gdGhpc307dmFyIEdzPU9iamVjdC5mcmVlemUoe1NoYWRvd01hdGVyaWFsOldlLFNwcml0ZU1hdGVyaWFsOnJlLFJhd1NoYWRlck1hdGVyaWFsOmJnLFNoYWRlck1hdGVyaWFsOnViLFBvaW50c01hdGVyaWFsOmNkLE1lc2hQaHlzaWNhbE1hdGVyaWFsOlhlLE1lc2hTdGFuZGFyZE1hdGVyaWFsOkFkLE1lc2hQaG9uZ01hdGVyaWFsOmRkLE1lc2hUb29uTWF0ZXJpYWw6WWUsTWVzaE5vcm1hbE1hdGVyaWFsOlplLE1lc2hMYW1iZXJ0TWF0ZXJpYWw6JGUsTWVzaERlcHRoTWF0ZXJpYWw6bWUsCk1lc2hEaXN0YW5jZU1hdGVyaWFsOm5lLE1lc2hCYXNpY01hdGVyaWFsOkwsTWVzaE1hdGNhcE1hdGVyaWFsOmFmLExpbmVEYXNoZWRNYXRlcmlhbDpiZixMaW5lQmFzaWNNYXRlcmlhbDpPYixNYXRlcmlhbDpNfSksamM9e2FycmF5U2xpY2U6ZnVuY3Rpb24oYixlLGgpe3JldHVybiBqYy5pc1R5cGVkQXJyYXkoYik/bmV3IGIuY29uc3RydWN0b3IoYi5zdWJhcnJheShlLHZvaWQgMCE9PWg/aDpiLmxlbmd0aCkpOmIuc2xpY2UoZSxoKX0sY29udmVydEFycmF5OmZ1bmN0aW9uKGIsZSxoKXtyZXR1cm4hYnx8IWgmJmIuY29uc3RydWN0b3I9PT1lP2I6Im51bWJlciI9PT10eXBlb2YgZS5CWVRFU19QRVJfRUxFTUVOVD9uZXcgZShiKTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChiKX0saXNUeXBlZEFycmF5OmZ1bmN0aW9uKGIpe3JldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoYikmJiEoYiBpbnN0YW5jZW9mIERhdGFWaWV3KX0sZ2V0S2V5ZnJhbWVPcmRlcjpmdW5jdGlvbihiKXtmb3IodmFyIGU9CmIubGVuZ3RoLGg9QXJyYXkoZSksbT0wO20hPT1lOysrbSloW21dPW07aC5zb3J0KGZ1bmN0aW9uKHUsdyl7cmV0dXJuIGJbdV0tYlt3XX0pO3JldHVybiBofSxzb3J0ZWRBcnJheTpmdW5jdGlvbihiLGUsaCl7Zm9yKHZhciBtPWIubGVuZ3RoLHU9bmV3IGIuY29uc3RydWN0b3IobSksdz0wLEE9MDtBIT09bTsrK3cpZm9yKHZhciBFPWhbd10qZSxHPTA7RyE9PWU7KytHKXVbQSsrXT1iW0UrR107cmV0dXJuIHV9LGZsYXR0ZW5KU09OOmZ1bmN0aW9uKGIsZSxoLG0pe2Zvcih2YXIgdT0xLHc9YlswXTt2b2lkIDAhPT13JiZ2b2lkIDA9PT13W21dOyl3PWJbdSsrXTtpZih2b2lkIDAhPT13KXt2YXIgQT13W21dO2lmKHZvaWQgMCE9PUEpaWYoQXJyYXkuaXNBcnJheShBKSl7ZG8gQT13W21dLHZvaWQgMCE9PUEmJihlLnB1c2gody50aW1lKSxoLnB1c2guYXBwbHkoaCxBKSksdz1iW3UrK107d2hpbGUodm9pZCAwIT09dyl9ZWxzZSBpZih2b2lkIDAhPT1BLnRvQXJyYXkpe2RvIEE9d1ttXSwKdm9pZCAwIT09QSYmKGUucHVzaCh3LnRpbWUpLEEudG9BcnJheShoLGgubGVuZ3RoKSksdz1iW3UrK107d2hpbGUodm9pZCAwIT09dyl9ZWxzZXtkbyBBPXdbbV0sdm9pZCAwIT09QSYmKGUucHVzaCh3LnRpbWUpLGgucHVzaChBKSksdz1iW3UrK107d2hpbGUodm9pZCAwIT09dyl9fX19O09iamVjdC5hc3NpZ24oS2MucHJvdG90eXBlLHtldmFsdWF0ZTpmdW5jdGlvbihiKXt2YXIgZT10aGlzLnBhcmFtZXRlclBvc2l0aW9ucyxoPXRoaXMuX2NhY2hlZEluZGV4LG09ZVtoXSx1PWVbaC0xXTthOntiOntjOntkOmlmKCEoYjxtKSl7Zm9yKHZhciB3PWgrMjs7KXtpZih2b2lkIDA9PT1tKXtpZihiPHUpYnJlYWsgZDt0aGlzLl9jYWNoZWRJbmRleD1oPWUubGVuZ3RoO3JldHVybiB0aGlzLmFmdGVyRW5kXyhoLTEsYix1KX1pZihoPT09dylicmVhazt1PW07bT1lWysraF07aWYoYjxtKWJyZWFrIGJ9bT1lLmxlbmd0aDticmVhayBjfWlmKGI+PXUpYnJlYWsgYTtlbHNle3c9ZVsxXTtiPHcmJgooaD0yLHU9dyk7Zm9yKHc9aC0yOzspe2lmKHZvaWQgMD09PXUpcmV0dXJuIHRoaXMuX2NhY2hlZEluZGV4PTAsdGhpcy5iZWZvcmVTdGFydF8oMCxiLG0pO2lmKGg9PT13KWJyZWFrO209dTt1PWVbLS1oLTFdO2lmKGI+PXUpYnJlYWsgYn1tPWg7aD0wfX1mb3IoO2g8bTspdT1oK20+Pj4xLGI8ZVt1XT9tPXU6aD11KzE7bT1lW2hdO3U9ZVtoLTFdO2lmKHZvaWQgMD09PXUpcmV0dXJuIHRoaXMuX2NhY2hlZEluZGV4PTAsdGhpcy5iZWZvcmVTdGFydF8oMCxiLG0pO2lmKHZvaWQgMD09PW0pcmV0dXJuIHRoaXMuX2NhY2hlZEluZGV4PWg9ZS5sZW5ndGgsdGhpcy5hZnRlckVuZF8oaC0xLHUsYil9dGhpcy5fY2FjaGVkSW5kZXg9aDt0aGlzLmludGVydmFsQ2hhbmdlZF8oaCx1LG0pfXJldHVybiB0aGlzLmludGVycG9sYXRlXyhoLHUsYixtKX0sc2V0dGluZ3M6bnVsbCxEZWZhdWx0U2V0dGluZ3NfOnt9LGdldFNldHRpbmdzXzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNldHRpbmdzfHwKdGhpcy5EZWZhdWx0U2V0dGluZ3NffSxjb3B5U2FtcGxlVmFsdWVfOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMucmVzdWx0QnVmZmVyLGg9dGhpcy5zYW1wbGVWYWx1ZXMsbT10aGlzLnZhbHVlU2l6ZTtiKj1tO2Zvcih2YXIgdT0wO3UhPT1tOysrdSllW3VdPWhbYit1XTtyZXR1cm4gZX0saW50ZXJwb2xhdGVfOmZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoImNhbGwgdG8gYWJzdHJhY3QgbWV0aG9kIik7fSxpbnRlcnZhbENoYW5nZWRfOmZ1bmN0aW9uKCl7fX0pO09iamVjdC5hc3NpZ24oS2MucHJvdG90eXBlLHtiZWZvcmVTdGFydF86S2MucHJvdG90eXBlLmNvcHlTYW1wbGVWYWx1ZV8sYWZ0ZXJFbmRfOktjLnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVffSk7QmkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShLYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpCaSxEZWZhdWx0U2V0dGluZ3NfOntlbmRpbmdTdGFydDoyNDAwLGVuZGluZ0VuZDoyNDAwfSxpbnRlcnZhbENoYW5nZWRfOmZ1bmN0aW9uKGIsCmUsaCl7dmFyIG09dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMsdT1iLTIsdz1iKzEsQT1tW3VdLEU9bVt3XTtpZih2b2lkIDA9PT1BKXN3aXRjaCh0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ1N0YXJ0KXtjYXNlIDI0MDE6dT1iO0E9MiplLWg7YnJlYWs7Y2FzZSAyNDAyOnU9bS5sZW5ndGgtMjtBPWUrbVt1XS1tW3UrMV07YnJlYWs7ZGVmYXVsdDp1PWIsQT1ofWlmKHZvaWQgMD09PUUpc3dpdGNoKHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nRW5kKXtjYXNlIDI0MDE6dz1iO0U9MipoLWU7YnJlYWs7Y2FzZSAyNDAyOnc9MTtFPWgrbVsxXS1tWzBdO2JyZWFrO2RlZmF1bHQ6dz1iLTEsRT1lfWI9LjUqKGgtZSk7bT10aGlzLnZhbHVlU2l6ZTt0aGlzLl93ZWlnaHRQcmV2PWIvKGUtQSk7dGhpcy5fd2VpZ2h0TmV4dD1iLyhFLWgpO3RoaXMuX29mZnNldFByZXY9dSptO3RoaXMuX29mZnNldE5leHQ9dyptfSxpbnRlcnBvbGF0ZV86ZnVuY3Rpb24oYixlLGgsbSl7dmFyIHU9dGhpcy5yZXN1bHRCdWZmZXIsCnc9dGhpcy5zYW1wbGVWYWx1ZXMsQT10aGlzLnZhbHVlU2l6ZTtiKj1BO3ZhciBFPWItQSxHPXRoaXMuX29mZnNldFByZXYsSj10aGlzLl9vZmZzZXROZXh0LFE9dGhpcy5fd2VpZ2h0UHJldixTPXRoaXMuX3dlaWdodE5leHQsVD0oaC1lKS8obS1lKTtoPVQqVDttPWgqVDtlPS1RKm0rMipRKmgtUSpUO1E9KDErUSkqbSsoLTEuNS0yKlEpKmgrKC0uNStRKSpUKzE7VD0oLTEtUykqbSsoMS41K1MpKmgrLjUqVDtTPVMqbS1TKmg7Zm9yKGg9MDtoIT09QTsrK2gpdVtoXT1lKndbRytoXStRKndbRStoXStUKndbYitoXStTKndbSitoXTtyZXR1cm4gdX19KTtDaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEtjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkNoLGludGVycG9sYXRlXzpmdW5jdGlvbihiLGUsaCxtKXt2YXIgdT10aGlzLnJlc3VsdEJ1ZmZlcix3PXRoaXMuc2FtcGxlVmFsdWVzLEE9dGhpcy52YWx1ZVNpemU7Yio9QTt2YXIgRT1iLUE7ZT0oaC1lKS8obS0KZSk7aD0xLWU7Zm9yKG09MDttIT09QTsrK20pdVttXT13W0UrbV0qaCt3W2IrbV0qZTtyZXR1cm4gdX19KTtDaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEtjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkNpLGludGVycG9sYXRlXzpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5jb3B5U2FtcGxlVmFsdWVfKGItMSl9fSk7T2JqZWN0LmFzc2lnbihvYyx7dG9KU09OOmZ1bmN0aW9uKGIpe3ZhciBlPWIuY29uc3RydWN0b3I7aWYodm9pZCAwIT09ZS50b0pTT04pZT1lLnRvSlNPTihiKTtlbHNle2U9e25hbWU6Yi5uYW1lLHRpbWVzOmpjLmNvbnZlcnRBcnJheShiLnRpbWVzLEFycmF5KSx2YWx1ZXM6amMuY29udmVydEFycmF5KGIudmFsdWVzLEFycmF5KX07dmFyIGg9Yi5nZXRJbnRlcnBvbGF0aW9uKCk7aCE9PWIuRGVmYXVsdEludGVycG9sYXRpb24mJihlLmludGVycG9sYXRpb249aCl9ZS50eXBlPWIuVmFsdWVUeXBlTmFtZTtyZXR1cm4gZX19KTtPYmplY3QuYXNzaWduKG9jLnByb3RvdHlwZSwKe2NvbnN0cnVjdG9yOm9jLFRpbWVCdWZmZXJUeXBlOkZsb2F0MzJBcnJheSxWYWx1ZUJ1ZmZlclR5cGU6RmxvYXQzMkFycmF5LERlZmF1bHRJbnRlcnBvbGF0aW9uOjIzMDEsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU6ZnVuY3Rpb24oYil7cmV0dXJuIG5ldyBDaSh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksYil9LEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjpmdW5jdGlvbihiKXtyZXR1cm4gbmV3IENoKHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSxiKX0sSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOmZ1bmN0aW9uKGIpe3JldHVybiBuZXcgQmkodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLGIpfSxzZXRJbnRlcnBvbGF0aW9uOmZ1bmN0aW9uKGIpe3N3aXRjaChiKXtjYXNlIDIzMDA6dmFyIGU9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTsKYnJlYWs7Y2FzZSAyMzAxOmU9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI7YnJlYWs7Y2FzZSAyMzAyOmU9dGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGh9aWYodm9pZCAwPT09ZSl7ZT0idW5zdXBwb3J0ZWQgaW50ZXJwb2xhdGlvbiBmb3IgIit0aGlzLlZhbHVlVHlwZU5hbWUrIiBrZXlmcmFtZSB0cmFjayBuYW1lZCAiK3RoaXMubmFtZTtpZih2b2lkIDA9PT10aGlzLmNyZWF0ZUludGVycG9sYW50KWlmKGIhPT10aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uKXRoaXMuc2V0SW50ZXJwb2xhdGlvbih0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uKTtlbHNlIHRocm93IEVycm9yKGUpO2NvbnNvbGUud2FybigiVEhSRUUuS2V5ZnJhbWVUcmFjazoiLGUpO3JldHVybiB0aGlzfXRoaXMuY3JlYXRlSW50ZXJwb2xhbnQ9ZTtyZXR1cm4gdGhpc30sZ2V0SW50ZXJwb2xhdGlvbjpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLmNyZWF0ZUludGVycG9sYW50KXtjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU6cmV0dXJuIDIzMDA7CmNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6cmV0dXJuIDIzMDE7Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDpyZXR1cm4gMjMwMn19LGdldFZhbHVlU2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlcy5sZW5ndGgvdGhpcy50aW1lcy5sZW5ndGh9LHNoaWZ0OmZ1bmN0aW9uKGIpe2lmKDAhPT1iKWZvcih2YXIgZT10aGlzLnRpbWVzLGg9MCxtPWUubGVuZ3RoO2ghPT1tOysraCllW2hdKz1iO3JldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihiKXtpZigxIT09Yilmb3IodmFyIGU9dGhpcy50aW1lcyxoPTAsbT1lLmxlbmd0aDtoIT09bTsrK2gpZVtoXSo9YjtyZXR1cm4gdGhpc30sdHJpbTpmdW5jdGlvbihiLGUpe2Zvcih2YXIgaD10aGlzLnRpbWVzLG09aC5sZW5ndGgsdT0wLHc9bS0xO3UhPT1tJiZoW3VdPGI7KSsrdTtmb3IoOy0xIT09dyYmaFt3XT5lOyktLXc7Kyt3O2lmKDAhPT11fHx3IT09bSl1Pj13JiYodz1NYXRoLm1heCh3LAoxKSx1PXctMSksYj10aGlzLmdldFZhbHVlU2l6ZSgpLHRoaXMudGltZXM9amMuYXJyYXlTbGljZShoLHUsdyksdGhpcy52YWx1ZXM9amMuYXJyYXlTbGljZSh0aGlzLnZhbHVlcyx1KmIsdypiKTtyZXR1cm4gdGhpc30sdmFsaWRhdGU6ZnVuY3Rpb24oKXt2YXIgYj0hMCxlPXRoaXMuZ2V0VmFsdWVTaXplKCk7MCE9PWUtTWF0aC5mbG9vcihlKSYmKGNvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IEludmFsaWQgdmFsdWUgc2l6ZSBpbiB0cmFjay4iLHRoaXMpLGI9ITEpO3ZhciBoPXRoaXMudGltZXM7ZT10aGlzLnZhbHVlczt2YXIgbT1oLmxlbmd0aDswPT09bSYmKGNvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFRyYWNrIGlzIGVtcHR5LiIsdGhpcyksYj0hMSk7Zm9yKHZhciB1PW51bGwsdz0wO3chPT1tO3crKyl7dmFyIEE9aFt3XTtpZigibnVtYmVyIj09PXR5cGVvZiBBJiZpc05hTihBKSl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVGltZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuIiwKdGhpcyx3LEEpO2I9ITE7YnJlYWt9aWYobnVsbCE9PXUmJnU+QSl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogT3V0IG9mIG9yZGVyIGtleXMuIix0aGlzLHcsQSx1KTtiPSExO2JyZWFrfXU9QX1pZih2b2lkIDAhPT1lJiZqYy5pc1R5cGVkQXJyYXkoZSkpZm9yKHc9MCxoPWUubGVuZ3RoO3chPT1oOysrdylpZihtPWVbd10saXNOYU4obSkpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlci4iLHRoaXMsdyxtKTtiPSExO2JyZWFrfXJldHVybiBifSxvcHRpbWl6ZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnRpbWVzLGU9dGhpcy52YWx1ZXMsaD10aGlzLmdldFZhbHVlU2l6ZSgpLG09MjMwMj09PXRoaXMuZ2V0SW50ZXJwb2xhdGlvbigpLHU9MSx3PWIubGVuZ3RoLTEsQT0xO0E8dzsrK0Epe3ZhciBFPSExLEc9YltBXTtpZihHIT09YltBKzFdJiYoMSE9PUF8fEchPT1HWzBdKSlpZihtKUU9ITA7CmVsc2V7dmFyIEo9QSpoLFE9Si1oLFM9SitoO2ZvcihHPTA7RyE9PWg7KytHKXt2YXIgVD1lW0orR107aWYoVCE9PWVbUStHXXx8VCE9PWVbUytHXSl7RT0hMDticmVha319fWlmKEUpe2lmKEEhPT11KWZvcihiW3VdPWJbQV0sRT1BKmgsSj11KmgsRz0wO0chPT1oOysrRyllW0orR109ZVtFK0ddOysrdX19aWYoMDx3KXtiW3VdPWJbd107RT13Kmg7Sj11Kmg7Zm9yKEc9MDtHIT09aDsrK0cpZVtKK0ddPWVbRStHXTsrK3V9dSE9PWIubGVuZ3RoJiYodGhpcy50aW1lcz1qYy5hcnJheVNsaWNlKGIsMCx1KSx0aGlzLnZhbHVlcz1qYy5hcnJheVNsaWNlKGUsMCx1KmgpKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXt2YXIgYj1qYy5hcnJheVNsaWNlKHRoaXMudGltZXMsMCksZT1qYy5hcnJheVNsaWNlKHRoaXMudmFsdWVzLDApO2I9bmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5uYW1lLGIsZSk7Yi5jcmVhdGVJbnRlcnBvbGFudD10aGlzLmNyZWF0ZUludGVycG9sYW50O3JldHVybiBifX0pOwpEaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG9jLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkRpLFZhbHVlVHlwZU5hbWU6ImJvb2wiLFZhbHVlQnVmZmVyVHlwZTpBcnJheSxEZWZhdWx0SW50ZXJwb2xhdGlvbjoyMzAwLEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjp2b2lkIDAsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOnZvaWQgMH0pO0VpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUob2MucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6RWksVmFsdWVUeXBlTmFtZToiY29sb3IifSk7Y2cucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShvYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpjZyxWYWx1ZVR5cGVOYW1lOiJudW1iZXIifSk7RmkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShLYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpGaSxpbnRlcnBvbGF0ZV86ZnVuY3Rpb24oYiwKZSxoLG0pe3ZhciB1PXRoaXMucmVzdWx0QnVmZmVyLHc9dGhpcy5zYW1wbGVWYWx1ZXMsQT10aGlzLnZhbHVlU2l6ZTtiKj1BO2U9KGgtZSkvKG0tZSk7Zm9yKGg9YitBO2IhPT1oO2IrPTQpZi5zbGVycEZsYXQodSwwLHcsYi1BLHcsYixlKTtyZXR1cm4gdX19KTtEaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG9jLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkRoLFZhbHVlVHlwZU5hbWU6InF1YXRlcm5pb24iLERlZmF1bHRJbnRlcnBvbGF0aW9uOjIzMDEsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOmZ1bmN0aW9uKGIpe3JldHVybiBuZXcgRmkodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLGIpfSxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6dm9pZCAwfSk7R2kucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShvYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpHaSxWYWx1ZVR5cGVOYW1lOiJzdHJpbmciLApWYWx1ZUJ1ZmZlclR5cGU6QXJyYXksRGVmYXVsdEludGVycG9sYXRpb246MjMwMCxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6dm9pZCAwLEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDp2b2lkIDB9KTtkZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG9jLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmRnLFZhbHVlVHlwZU5hbWU6InZlY3RvciJ9KTtPYmplY3QuYXNzaWduKFJjLHtwYXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGU9W10saD1iLnRyYWNrcyxtPTEvKGIuZnBzfHwxKSx1PTAsdz1oLmxlbmd0aDt1IT09dzsrK3UpZS5wdXNoKGpzKGhbdV0pLnNjYWxlKG0pKTtyZXR1cm4gbmV3IFJjKGIubmFtZSxiLmR1cmF0aW9uLGUpfSx0b0pTT046ZnVuY3Rpb24oYil7dmFyIGU9W10saD1iLnRyYWNrcztiPXtuYW1lOmIubmFtZSxkdXJhdGlvbjpiLmR1cmF0aW9uLHRyYWNrczplLHV1aWQ6Yi51dWlkfTtmb3IodmFyIG09MCx1PWgubGVuZ3RoO20hPT0KdTsrK20pZS5wdXNoKG9jLnRvSlNPTihoW21dKSk7cmV0dXJuIGJ9LENyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlOmZ1bmN0aW9uKGIsZSxoLG0pe2Zvcih2YXIgdT1lLmxlbmd0aCx3PVtdLEE9MDtBPHU7QSsrKXt2YXIgRT1bXSxHPVtdO0UucHVzaCgoQSt1LTEpJXUsQSwoQSsxKSV1KTtHLnB1c2goMCwxLDApO3ZhciBKPWpjLmdldEtleWZyYW1lT3JkZXIoRSk7RT1qYy5zb3J0ZWRBcnJheShFLDEsSik7Rz1qYy5zb3J0ZWRBcnJheShHLDEsSik7bXx8MCE9PUVbMF18fChFLnB1c2godSksRy5wdXNoKEdbMF0pKTt3LnB1c2goKG5ldyBjZygiLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1siK2VbQV0ubmFtZSsiXSIsRSxHKSkuc2NhbGUoMS9oKSl9cmV0dXJuIG5ldyBSYyhiLC0xLHcpfSxmaW5kQnlOYW1lOmZ1bmN0aW9uKGIsZSl7dmFyIGg9YjtBcnJheS5pc0FycmF5KGIpfHwoaD1iLmdlb21ldHJ5JiZiLmdlb21ldHJ5LmFuaW1hdGlvbnN8fGIuYW5pbWF0aW9ucyk7Zm9yKGI9CjA7YjxoLmxlbmd0aDtiKyspaWYoaFtiXS5uYW1lPT09ZSlyZXR1cm4gaFtiXTtyZXR1cm4gbnVsbH0sQ3JlYXRlQ2xpcHNGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZXM6ZnVuY3Rpb24oYixlLGgpe2Zvcih2YXIgbT17fSx1PS9eKFtcdy1dKj8pKFtcZF0rKSQvLHc9MCxBPWIubGVuZ3RoO3c8QTt3Kyspe3ZhciBFPWJbd10sRz1FLm5hbWUubWF0Y2godSk7aWYoRyYmMTxHLmxlbmd0aCl7dmFyIEo9R1sxXTsoRz1tW0pdKXx8KG1bSl09Rz1bXSk7Ry5wdXNoKEUpfX1iPVtdO2ZvcihKIGluIG0pYi5wdXNoKFJjLkNyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlKEosbVtKXSxlLGgpKTtyZXR1cm4gYn0scGFyc2VBbmltYXRpb246ZnVuY3Rpb24oYixlKXtmdW5jdGlvbiBoKGlhLGhhLHNhLHFhLHJhKXtpZigwIT09c2EubGVuZ3RoKXt2YXIgd2E9W10scGE9W107amMuZmxhdHRlbkpTT04oc2Esd2EscGEscWEpOzAhPT13YS5sZW5ndGgmJnJhLnB1c2gobmV3IGlhKGhhLHdhLHBhKSl9fQppZighYilyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQW5pbWF0aW9uQ2xpcDogTm8gYW5pbWF0aW9uIGluIEpTT05Mb2FkZXIgZGF0YS4iKSxudWxsO3ZhciBtPVtdLHU9Yi5uYW1lfHwiZGVmYXVsdCIsdz1iLmxlbmd0aHx8LTEsQT1iLmZwc3x8MzA7Yj1iLmhpZXJhcmNoeXx8W107Zm9yKHZhciBFPTA7RTxiLmxlbmd0aDtFKyspe3ZhciBHPWJbRV0ua2V5cztpZihHJiYwIT09Ry5sZW5ndGgpaWYoR1swXS5tb3JwaFRhcmdldHMpe3c9e307Zm9yKHZhciBKPTA7SjxHLmxlbmd0aDtKKyspaWYoR1tKXS5tb3JwaFRhcmdldHMpZm9yKHZhciBRPTA7UTxHW0pdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7USsrKXdbR1tKXS5tb3JwaFRhcmdldHNbUV1dPS0xO2Zvcih2YXIgUyBpbiB3KXt2YXIgVD1bXSxXPVtdO2ZvcihRPTA7USE9PUdbSl0ubW9ycGhUYXJnZXRzLmxlbmd0aDsrK1Epe3ZhciBYPUdbSl07VC5wdXNoKFgudGltZSk7Vy5wdXNoKFgubW9ycGhUYXJnZXQ9PT1TPzE6MCl9bS5wdXNoKG5ldyBjZygiLm1vcnBoVGFyZ2V0SW5mbHVlbmNlWyIrClMrIl0iLFQsVykpfXc9dy5sZW5ndGgqKEF8fDEpfWVsc2UgSj0iLmJvbmVzWyIrZVtFXS5uYW1lKyJdIixoKGRnLEorIi5wb3NpdGlvbiIsRywicG9zIixtKSxoKERoLEorIi5xdWF0ZXJuaW9uIixHLCJyb3QiLG0pLGgoZGcsSisiLnNjYWxlIixHLCJzY2wiLG0pfXJldHVybiAwPT09bS5sZW5ndGg/bnVsbDpuZXcgUmModSx3LG0pfX0pO09iamVjdC5hc3NpZ24oUmMucHJvdG90eXBlLHtyZXNldER1cmF0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPTAsZT0wLGg9dGhpcy50cmFja3MubGVuZ3RoO2UhPT1oOysrZSl7dmFyIG09dGhpcy50cmFja3NbZV07Yj1NYXRoLm1heChiLG0udGltZXNbbS50aW1lcy5sZW5ndGgtMV0pfXRoaXMuZHVyYXRpb249YjtyZXR1cm4gdGhpc30sdHJpbTpmdW5jdGlvbigpe2Zvcih2YXIgYj0wO2I8dGhpcy50cmFja3MubGVuZ3RoO2IrKyl0aGlzLnRyYWNrc1tiXS50cmltKDAsdGhpcy5kdXJhdGlvbik7cmV0dXJuIHRoaXN9LHZhbGlkYXRlOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQohMCxlPTA7ZTx0aGlzLnRyYWNrcy5sZW5ndGg7ZSsrKWI9YiYmdGhpcy50cmFja3NbZV0udmFsaWRhdGUoKTtyZXR1cm4gYn0sb3B0aW1pemU6ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDtiPHRoaXMudHJhY2tzLmxlbmd0aDtiKyspdGhpcy50cmFja3NbYl0ub3B0aW1pemUoKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtmb3IodmFyIGI9W10sZT0wO2U8dGhpcy50cmFja3MubGVuZ3RoO2UrKyliLnB1c2godGhpcy50cmFja3NbZV0uY2xvbmUoKSk7cmV0dXJuIG5ldyBSYyh0aGlzLm5hbWUsdGhpcy5kdXJhdGlvbixiKX19KTt2YXIgZ2Y9e2VuYWJsZWQ6ITEsZmlsZXM6e30sYWRkOmZ1bmN0aW9uKGIsZSl7ITEhPT10aGlzLmVuYWJsZWQmJih0aGlzLmZpbGVzW2JdPWUpfSxnZXQ6ZnVuY3Rpb24oYil7aWYoITEhPT10aGlzLmVuYWJsZWQpcmV0dXJuIHRoaXMuZmlsZXNbYl19LHJlbW92ZTpmdW5jdGlvbihiKXtkZWxldGUgdGhpcy5maWxlc1tiXX0sY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLmZpbGVzPQp7fX19LFhuPW5ldyBEaztPYmplY3QuYXNzaWduKEtiLnByb3RvdHlwZSx7bG9hZDpmdW5jdGlvbigpe30scGFyc2U6ZnVuY3Rpb24oKXt9LHNldENyb3NzT3JpZ2luOmZ1bmN0aW9uKGIpe3RoaXMuY3Jvc3NPcmlnaW49YjtyZXR1cm4gdGhpc30sc2V0UGF0aDpmdW5jdGlvbihiKXt0aGlzLnBhdGg9YjtyZXR1cm4gdGhpc30sc2V0UmVzb3VyY2VQYXRoOmZ1bmN0aW9uKGIpe3RoaXMucmVzb3VyY2VQYXRoPWI7cmV0dXJuIHRoaXN9fSk7S2IuSGFuZGxlcnM9e2hhbmRsZXJzOltdLGFkZDpmdW5jdGlvbihiLGUpe3RoaXMuaGFuZGxlcnMucHVzaChiLGUpfSxnZXQ6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPXRoaXMuaGFuZGxlcnMsaD0wLG09ZS5sZW5ndGg7aDxtO2grPTIpe3ZhciB1PWVbaCsxXTtpZihlW2hdLnRlc3QoYikpcmV0dXJuIHV9cmV0dXJuIG51bGx9fTt2YXIgbWQ9e307U2MucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShLYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpTYywKbG9hZDpmdW5jdGlvbihiLGUsaCxtKXt2b2lkIDA9PT1iJiYoYj0iIik7dm9pZCAwIT09dGhpcy5wYXRoJiYoYj10aGlzLnBhdGgrYik7Yj10aGlzLm1hbmFnZXIucmVzb2x2ZVVSTChiKTt2YXIgdT10aGlzLHc9Z2YuZ2V0KGIpO2lmKHZvaWQgMCE9PXcpcmV0dXJuIHUubWFuYWdlci5pdGVtU3RhcnQoYiksc2V0VGltZW91dChmdW5jdGlvbigpe2UmJmUodyk7dS5tYW5hZ2VyLml0ZW1FbmQoYil9LDApLHc7aWYodm9pZCAwIT09bWRbYl0pbWRbYl0ucHVzaCh7b25Mb2FkOmUsb25Qcm9ncmVzczpoLG9uRXJyb3I6bX0pO2Vsc2V7dmFyIEE9Yi5tYXRjaCgvXmRhdGE6KC4qPykoO2Jhc2U2NCk/LCguKikkLyk7aWYoQSl7aD1BWzFdO3ZhciBFPSEhQVsyXTtBPUFbM107QT1kZWNvZGVVUklDb21wb25lbnQoQSk7RSYmKEE9YXRvYihBKSk7dHJ5e3ZhciBHPSh0aGlzLnJlc3BvbnNlVHlwZXx8IiIpLnRvTG93ZXJDYXNlKCk7c3dpdGNoKEcpe2Nhc2UgImFycmF5YnVmZmVyIjpjYXNlICJibG9iIjp2YXIgSj0KbmV3IFVpbnQ4QXJyYXkoQS5sZW5ndGgpO2ZvcihFPTA7RTxBLmxlbmd0aDtFKyspSltFXT1BLmNoYXJDb2RlQXQoRSk7dmFyIFE9ImJsb2IiPT09Rz9uZXcgQmxvYihbSi5idWZmZXJdLHt0eXBlOmh9KTpKLmJ1ZmZlcjticmVhaztjYXNlICJkb2N1bWVudCI6UT0obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKEEsaCk7YnJlYWs7Y2FzZSAianNvbiI6UT1KU09OLnBhcnNlKEEpO2JyZWFrO2RlZmF1bHQ6UT1BfXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlJiZlKFEpO3UubWFuYWdlci5pdGVtRW5kKGIpfSwwKX1jYXRjaChUKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bSYmbShUKTt1Lm1hbmFnZXIuaXRlbUVycm9yKGIpO3UubWFuYWdlci5pdGVtRW5kKGIpfSwwKX19ZWxzZXttZFtiXT1bXTttZFtiXS5wdXNoKHtvbkxvYWQ6ZSxvblByb2dyZXNzOmgsb25FcnJvcjptfSk7dmFyIFM9bmV3IFhNTEh0dHBSZXF1ZXN0O1Mub3BlbigiR0VUIixiLCEwKTtTLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLApmdW5jdGlvbihUKXt2YXIgVz10aGlzLnJlc3BvbnNlO2dmLmFkZChiLFcpO3ZhciBYPW1kW2JdO2RlbGV0ZSBtZFtiXTtpZigyMDA9PT10aGlzLnN0YXR1c3x8MD09PXRoaXMuc3RhdHVzKXswPT09dGhpcy5zdGF0dXMmJmNvbnNvbGUud2FybigiVEhSRUUuRmlsZUxvYWRlcjogSFRUUCBTdGF0dXMgMCByZWNlaXZlZC4iKTtmb3IodmFyIGlhPTAsaGE9WC5sZW5ndGg7aWE8aGE7aWErKyl7dmFyIHNhPVhbaWFdO2lmKHNhLm9uTG9hZClzYS5vbkxvYWQoVyl9fWVsc2V7aWE9MDtmb3IoaGE9WC5sZW5ndGg7aWE8aGE7aWErKylpZihzYT1YW2lhXSxzYS5vbkVycm9yKXNhLm9uRXJyb3IoVCk7dS5tYW5hZ2VyLml0ZW1FcnJvcihiKX11Lm1hbmFnZXIuaXRlbUVuZChiKX0sITEpO1MuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGZ1bmN0aW9uKFQpe2Zvcih2YXIgVz1tZFtiXSxYPTAsaWE9Vy5sZW5ndGg7WDxpYTtYKyspe3ZhciBoYT1XW1hdO2lmKGhhLm9uUHJvZ3Jlc3MpaGEub25Qcm9ncmVzcyhUKX19LAohMSk7Uy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oVCl7dmFyIFc9bWRbYl07ZGVsZXRlIG1kW2JdO2Zvcih2YXIgWD0wLGlhPVcubGVuZ3RoO1g8aWE7WCsrKXt2YXIgaGE9V1tYXTtpZihoYS5vbkVycm9yKWhhLm9uRXJyb3IoVCl9dS5tYW5hZ2VyLml0ZW1FcnJvcihiKTt1Lm1hbmFnZXIuaXRlbUVuZChiKX0sITEpO1MuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLGZ1bmN0aW9uKFQpe3ZhciBXPW1kW2JdO2RlbGV0ZSBtZFtiXTtmb3IodmFyIFg9MCxpYT1XLmxlbmd0aDtYPGlhO1grKyl7dmFyIGhhPVdbWF07aWYoaGEub25FcnJvciloYS5vbkVycm9yKFQpfXUubWFuYWdlci5pdGVtRXJyb3IoYik7dS5tYW5hZ2VyLml0ZW1FbmQoYil9LCExKTt2b2lkIDAhPT10aGlzLnJlc3BvbnNlVHlwZSYmKFMucmVzcG9uc2VUeXBlPXRoaXMucmVzcG9uc2VUeXBlKTt2b2lkIDAhPT10aGlzLndpdGhDcmVkZW50aWFscyYmKFMud2l0aENyZWRlbnRpYWxzPXRoaXMud2l0aENyZWRlbnRpYWxzKTsKUy5vdmVycmlkZU1pbWVUeXBlJiZTLm92ZXJyaWRlTWltZVR5cGUodm9pZCAwIT09dGhpcy5taW1lVHlwZT90aGlzLm1pbWVUeXBlOiJ0ZXh0L3BsYWluIik7Zm9yKEUgaW4gdGhpcy5yZXF1ZXN0SGVhZGVyKVMuc2V0UmVxdWVzdEhlYWRlcihFLHRoaXMucmVxdWVzdEhlYWRlcltFXSk7Uy5zZW5kKG51bGwpfXUubWFuYWdlci5pdGVtU3RhcnQoYik7cmV0dXJuIFN9fSxzZXRSZXNwb25zZVR5cGU6ZnVuY3Rpb24oYil7dGhpcy5yZXNwb25zZVR5cGU9YjtyZXR1cm4gdGhpc30sc2V0V2l0aENyZWRlbnRpYWxzOmZ1bmN0aW9uKGIpe3RoaXMud2l0aENyZWRlbnRpYWxzPWI7cmV0dXJuIHRoaXN9LHNldE1pbWVUeXBlOmZ1bmN0aW9uKGIpe3RoaXMubWltZVR5cGU9YjtyZXR1cm4gdGhpc30sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihiKXt0aGlzLnJlcXVlc3RIZWFkZXI9YjtyZXR1cm4gdGhpc319KTtFay5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEtiLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpFayxsb2FkOmZ1bmN0aW9uKGIsZSxoLG0pe3ZhciB1PXRoaXMsdz1uZXcgU2ModS5tYW5hZ2VyKTt3LnNldFBhdGgodS5wYXRoKTt3LmxvYWQoYixmdW5jdGlvbihBKXtlKHUucGFyc2UoSlNPTi5wYXJzZShBKSkpfSxoLG0pfSxwYXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGU9W10saD0wO2g8Yi5sZW5ndGg7aCsrKXt2YXIgbT1SYy5wYXJzZShiW2hdKTtlLnB1c2gobSl9cmV0dXJuIGV9fSk7RmsucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShLYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpGayxsb2FkOmZ1bmN0aW9uKGIsZSxoLG0pe2Z1bmN0aW9uIHUoVCl7Ry5sb2FkKGJbVF0sZnVuY3Rpb24oVyl7Vz13Ll9wYXJzZXIoVywhMCk7QVtUXT17d2lkdGg6Vy53aWR0aCxoZWlnaHQ6Vy5oZWlnaHQsZm9ybWF0OlcuZm9ybWF0LG1pcG1hcHM6Vy5taXBtYXBzfTtKKz0xOzY9PT1KJiYoMT09PVcubWlwbWFwQ291bnQmJihFLm1pbkZpbHRlcj0KMTAwNiksRS5mb3JtYXQ9Vy5mb3JtYXQsRS5uZWVkc1VwZGF0ZT0hMCxlJiZlKEUpKX0saCxtKX12YXIgdz10aGlzLEE9W10sRT1uZXcgT2Y7RS5pbWFnZT1BO3ZhciBHPW5ldyBTYyh0aGlzLm1hbmFnZXIpO0cuc2V0UGF0aCh0aGlzLnBhdGgpO0cuc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpO2lmKEFycmF5LmlzQXJyYXkoYikpZm9yKHZhciBKPTAsUT0wLFM9Yi5sZW5ndGg7UTxTOysrUSl1KFEpO2Vsc2UgRy5sb2FkKGIsZnVuY3Rpb24oVCl7VD13Ll9wYXJzZXIoVCwhMCk7aWYoVC5pc0N1YmVtYXApZm9yKHZhciBXPVQubWlwbWFwcy5sZW5ndGgvVC5taXBtYXBDb3VudCxYPTA7WDxXO1grKyl7QVtYXT17bWlwbWFwczpbXX07Zm9yKHZhciBpYT0wO2lhPFQubWlwbWFwQ291bnQ7aWErKylBW1hdLm1pcG1hcHMucHVzaChULm1pcG1hcHNbWCpULm1pcG1hcENvdW50K2lhXSksQVtYXS5mb3JtYXQ9VC5mb3JtYXQsQVtYXS53aWR0aD1ULndpZHRoLEFbWF0uaGVpZ2h0PVQuaGVpZ2h0fWVsc2UgRS5pbWFnZS53aWR0aD0KVC53aWR0aCxFLmltYWdlLmhlaWdodD1ULmhlaWdodCxFLm1pcG1hcHM9VC5taXBtYXBzOzE9PT1ULm1pcG1hcENvdW50JiYoRS5taW5GaWx0ZXI9MTAwNik7RS5mb3JtYXQ9VC5mb3JtYXQ7RS5uZWVkc1VwZGF0ZT0hMDtlJiZlKEUpfSxoLG0pO3JldHVybiBFfX0pO0hpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoS2IucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6SGksbG9hZDpmdW5jdGlvbihiLGUsaCxtKXt2YXIgdT10aGlzLHc9bmV3IEdiLEE9bmV3IFNjKHRoaXMubWFuYWdlcik7QS5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIik7QS5zZXRQYXRoKHRoaXMucGF0aCk7QS5sb2FkKGIsZnVuY3Rpb24oRSl7aWYoRT11Ll9wYXJzZXIoRSkpdm9pZCAwIT09RS5pbWFnZT93LmltYWdlPUUuaW1hZ2U6dm9pZCAwIT09RS5kYXRhJiYody5pbWFnZS53aWR0aD1FLndpZHRoLHcuaW1hZ2UuaGVpZ2h0PUUuaGVpZ2h0LHcuaW1hZ2UuZGF0YT1FLmRhdGEpLHcud3JhcFM9CnZvaWQgMCE9PUUud3JhcFM/RS53cmFwUzoxMDAxLHcud3JhcFQ9dm9pZCAwIT09RS53cmFwVD9FLndyYXBUOjEwMDEsdy5tYWdGaWx0ZXI9dm9pZCAwIT09RS5tYWdGaWx0ZXI/RS5tYWdGaWx0ZXI6MTAwNix3Lm1pbkZpbHRlcj12b2lkIDAhPT1FLm1pbkZpbHRlcj9FLm1pbkZpbHRlcjoxMDA4LHcuYW5pc290cm9weT12b2lkIDAhPT1FLmFuaXNvdHJvcHk/RS5hbmlzb3Ryb3B5OjEsdm9pZCAwIT09RS5mb3JtYXQmJih3LmZvcm1hdD1FLmZvcm1hdCksdm9pZCAwIT09RS50eXBlJiYody50eXBlPUUudHlwZSksdm9pZCAwIT09RS5taXBtYXBzJiYody5taXBtYXBzPUUubWlwbWFwcyksMT09PUUubWlwbWFwQ291bnQmJih3Lm1pbkZpbHRlcj0xMDA2KSx3Lm5lZWRzVXBkYXRlPSEwLGUmJmUodyxFKX0saCxtKTtyZXR1cm4gd319KTtlZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEtiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmVnLGxvYWQ6ZnVuY3Rpb24oYiwKZSxoLG0pe2Z1bmN0aW9uIHUoKXtHLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLHUsITEpO0cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHcsITEpO2dmLmFkZChiLHRoaXMpO2UmJmUodGhpcyk7QS5tYW5hZ2VyLml0ZW1FbmQoYil9ZnVuY3Rpb24gdyhKKXtHLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLHUsITEpO0cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHcsITEpO20mJm0oSik7QS5tYW5hZ2VyLml0ZW1FcnJvcihiKTtBLm1hbmFnZXIuaXRlbUVuZChiKX12b2lkIDAhPT10aGlzLnBhdGgmJihiPXRoaXMucGF0aCtiKTtiPXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKGIpO3ZhciBBPXRoaXMsRT1nZi5nZXQoYik7aWYodm9pZCAwIT09RSlyZXR1cm4gQS5tYW5hZ2VyLml0ZW1TdGFydChiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZSYmZShFKTtBLm1hbmFnZXIuaXRlbUVuZChiKX0sMCksRTt2YXIgRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLAoiaW1nIik7Ry5hZGRFdmVudExpc3RlbmVyKCJsb2FkIix1LCExKTtHLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix3LCExKTsiZGF0YToiIT09Yi5zdWJzdHIoMCw1KSYmdm9pZCAwIT09dGhpcy5jcm9zc09yaWdpbiYmKEcuY3Jvc3NPcmlnaW49dGhpcy5jcm9zc09yaWdpbik7QS5tYW5hZ2VyLml0ZW1TdGFydChiKTtHLnNyYz1iO3JldHVybiBHfX0pO0lpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoS2IucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6SWksbG9hZDpmdW5jdGlvbihiLGUsaCxtKXtmdW5jdGlvbiB1KEcpe0EubG9hZChiW0ddLGZ1bmN0aW9uKEope3cuaW1hZ2VzW0ddPUo7RSsrOzY9PT1FJiYody5uZWVkc1VwZGF0ZT0hMCxlJiZlKHcpKX0sdm9pZCAwLG0pfXZhciB3PW5ldyBNZCxBPW5ldyBlZyh0aGlzLm1hbmFnZXIpO0Euc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7QS5zZXRQYXRoKHRoaXMucGF0aCk7dmFyIEU9MDtmb3IoaD0KMDtoPGIubGVuZ3RoOysraCl1KGgpO3JldHVybiB3fX0pO0ppLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoS2IucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6SmksbG9hZDpmdW5jdGlvbihiLGUsaCxtKXt2YXIgdT1uZXcgayx3PW5ldyBlZyh0aGlzLm1hbmFnZXIpO3cuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7dy5zZXRQYXRoKHRoaXMucGF0aCk7dy5sb2FkKGIsZnVuY3Rpb24oQSl7dS5pbWFnZT1BO0E9MDxiLnNlYXJjaCgvXC5qcGU/ZygkfFw/KS9pKXx8MD09PWIuc2VhcmNoKC9eZGF0YTppbWFnZVwvanBlZy8pO3UuZm9ybWF0PUE/MTAyMjoxMDIzO3UubmVlZHNVcGRhdGU9ITA7dm9pZCAwIT09ZSYmZSh1KX0saCxtKTtyZXR1cm4gdX19KTtPYmplY3QuYXNzaWduKGFiLnByb3RvdHlwZSx7Z2V0UG9pbnQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlOiAuZ2V0UG9pbnQoKSBub3QgaW1wbGVtZW50ZWQuIik7cmV0dXJuIG51bGx9LApnZXRQb2ludEF0OmZ1bmN0aW9uKGIsZSl7Yj10aGlzLmdldFV0b1RtYXBwaW5nKGIpO3JldHVybiB0aGlzLmdldFBvaW50KGIsZSl9LGdldFBvaW50czpmdW5jdGlvbihiKXt2b2lkIDA9PT1iJiYoYj01KTtmb3IodmFyIGU9W10saD0wO2g8PWI7aCsrKWUucHVzaCh0aGlzLmdldFBvaW50KGgvYikpO3JldHVybiBlfSxnZXRTcGFjZWRQb2ludHM6ZnVuY3Rpb24oYil7dm9pZCAwPT09YiYmKGI9NSk7Zm9yKHZhciBlPVtdLGg9MDtoPD1iO2grKyllLnB1c2godGhpcy5nZXRQb2ludEF0KGgvYikpO3JldHVybiBlfSxnZXRMZW5ndGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldExlbmd0aHMoKTtyZXR1cm4gYltiLmxlbmd0aC0xXX0sZ2V0TGVuZ3RoczpmdW5jdGlvbihiKXt2b2lkIDA9PT1iJiYoYj10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyk7aWYodGhpcy5jYWNoZUFyY0xlbmd0aHMmJnRoaXMuY2FjaGVBcmNMZW5ndGhzLmxlbmd0aD09PWIrMSYmIXRoaXMubmVlZHNVcGRhdGUpcmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzOwp0aGlzLm5lZWRzVXBkYXRlPSExO3ZhciBlPVtdLGg9dGhpcy5nZXRQb2ludCgwKSxtLHU9MDtlLnB1c2goMCk7Zm9yKG09MTttPD1iO20rKyl7dmFyIHc9dGhpcy5nZXRQb2ludChtL2IpO3UrPXcuZGlzdGFuY2VUbyhoKTtlLnB1c2godSk7aD13fXJldHVybiB0aGlzLmNhY2hlQXJjTGVuZ3Rocz1lfSx1cGRhdGVBcmNMZW5ndGhzOmZ1bmN0aW9uKCl7dGhpcy5uZWVkc1VwZGF0ZT0hMDt0aGlzLmdldExlbmd0aHMoKX0sZ2V0VXRvVG1hcHBpbmc6ZnVuY3Rpb24oYixlKXt2YXIgaD10aGlzLmdldExlbmd0aHMoKSxtPWgubGVuZ3RoO2U9ZT9lOmIqaFttLTFdO2Zvcih2YXIgdT0wLHc9bS0xLEE7dTw9dzspaWYoYj1NYXRoLmZsb29yKHUrKHctdSkvMiksQT1oW2JdLWUsMD5BKXU9YisxO2Vsc2UgaWYoMDxBKXc9Yi0xO2Vsc2V7dz1iO2JyZWFrfWI9dztpZihoW2JdPT09ZSlyZXR1cm4gYi8obS0xKTt1PWhbYl07cmV0dXJuKGIrKGUtdSkvKGhbYisxXS11KSkvKG0tMSl9LGdldFRhbmdlbnQ6ZnVuY3Rpb24oYil7dmFyIGU9CmItMUUtNDtiKz0xRS00OzA+ZSYmKGU9MCk7MTxiJiYoYj0xKTtlPXRoaXMuZ2V0UG9pbnQoZSk7cmV0dXJuIHRoaXMuZ2V0UG9pbnQoYikuY2xvbmUoKS5zdWIoZSkubm9ybWFsaXplKCl9LGdldFRhbmdlbnRBdDpmdW5jdGlvbihiKXtiPXRoaXMuZ2V0VXRvVG1hcHBpbmcoYik7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudChiKX0sY29tcHV0ZUZyZW5ldEZyYW1lczpmdW5jdGlvbihiLGUpe3ZhciBoPW5ldyBnLG09W10sdT1bXSx3PVtdLEE9bmV3IGcsRT1uZXcgcixHO2ZvcihHPTA7Rzw9YjtHKyspe3ZhciBKPUcvYjttW0ddPXRoaXMuZ2V0VGFuZ2VudEF0KEopO21bR10ubm9ybWFsaXplKCl9dVswXT1uZXcgZzt3WzBdPW5ldyBnO0c9TnVtYmVyLk1BWF9WQUxVRTtKPU1hdGguYWJzKG1bMF0ueCk7dmFyIFE9TWF0aC5hYnMobVswXS55KSxTPU1hdGguYWJzKG1bMF0ueik7Sjw9RyYmKEc9SixoLnNldCgxLDAsMCkpO1E8PUcmJihHPVEsaC5zZXQoMCwxLDApKTtTPD1HJiZoLnNldCgwLAowLDEpO0EuY3Jvc3NWZWN0b3JzKG1bMF0saCkubm9ybWFsaXplKCk7dVswXS5jcm9zc1ZlY3RvcnMobVswXSxBKTt3WzBdLmNyb3NzVmVjdG9ycyhtWzBdLHVbMF0pO2ZvcihHPTE7Rzw9YjtHKyspdVtHXT11W0ctMV0uY2xvbmUoKSx3W0ddPXdbRy0xXS5jbG9uZSgpLEEuY3Jvc3NWZWN0b3JzKG1bRy0xXSxtW0ddKSxBLmxlbmd0aCgpPk51bWJlci5FUFNJTE9OJiYoQS5ub3JtYWxpemUoKSxoPU1hdGguYWNvcyhsYi5jbGFtcChtW0ctMV0uZG90KG1bR10pLC0xLDEpKSx1W0ddLmFwcGx5TWF0cml4NChFLm1ha2VSb3RhdGlvbkF4aXMoQSxoKSkpLHdbR10uY3Jvc3NWZWN0b3JzKG1bR10sdVtHXSk7aWYoITA9PT1lKWZvcihoPU1hdGguYWNvcyhsYi5jbGFtcCh1WzBdLmRvdCh1W2JdKSwtMSwxKSksaC89YiwwPG1bMF0uZG90KEEuY3Jvc3NWZWN0b3JzKHVbMF0sdVtiXSkpJiYoaD0taCksRz0xO0c8PWI7RysrKXVbR10uYXBwbHlNYXRyaXg0KEUubWFrZVJvdGF0aW9uQXhpcyhtW0ddLApoKkcpKSx3W0ddLmNyb3NzVmVjdG9ycyhtW0ddLHVbR10pO3JldHVybnt0YW5nZW50czptLG5vcm1hbHM6dSxiaW5vcm1hbHM6d319LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGIpe3RoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPWIuYXJjTGVuZ3RoRGl2aXNpb25zO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYj17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6IkN1cnZlIixnZW5lcmF0b3I6IkN1cnZlLnRvSlNPTiJ9fTtiLmFyY0xlbmd0aERpdmlzaW9ucz10aGlzLmFyY0xlbmd0aERpdmlzaW9ucztiLnR5cGU9dGhpcy50eXBlO3JldHVybiBifSxmcm9tSlNPTjpmdW5jdGlvbihiKXt0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz1iLmFyY0xlbmd0aERpdmlzaW9ucztyZXR1cm4gdGhpc319KTtMYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShhYi5wcm90b3R5cGUpO0xjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj0KTGM7TGMucHJvdG90eXBlLmlzRWxsaXBzZUN1cnZlPSEwO0xjLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihiLGUpe2U9ZXx8bmV3IGQ7Zm9yKHZhciBoPTIqTWF0aC5QSSxtPXRoaXMuYUVuZEFuZ2xlLXRoaXMuYVN0YXJ0QW5nbGUsdT1NYXRoLmFicyhtKTxOdW1iZXIuRVBTSUxPTjswPm07KW0rPWg7Zm9yKDttPmg7KW0tPWg7bTxOdW1iZXIuRVBTSUxPTiYmKG09dT8wOmgpOyEwIT09dGhpcy5hQ2xvY2t3aXNlfHx1fHwobT1tPT09aD8taDptLWgpO2g9dGhpcy5hU3RhcnRBbmdsZStiKm07Yj10aGlzLmFYK3RoaXMueFJhZGl1cypNYXRoLmNvcyhoKTt2YXIgdz10aGlzLmFZK3RoaXMueVJhZGl1cypNYXRoLnNpbihoKTswIT09dGhpcy5hUm90YXRpb24mJihoPU1hdGguY29zKHRoaXMuYVJvdGF0aW9uKSxtPU1hdGguc2luKHRoaXMuYVJvdGF0aW9uKSx1PWItdGhpcy5hWCx3LT10aGlzLmFZLGI9dSpoLXcqbSt0aGlzLmFYLHc9dSptK3cqaCt0aGlzLmFZKTtyZXR1cm4gZS5zZXQoYiwKdyl9O0xjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe2FiLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLmFYPWIuYVg7dGhpcy5hWT1iLmFZO3RoaXMueFJhZGl1cz1iLnhSYWRpdXM7dGhpcy55UmFkaXVzPWIueVJhZGl1czt0aGlzLmFTdGFydEFuZ2xlPWIuYVN0YXJ0QW5nbGU7dGhpcy5hRW5kQW5nbGU9Yi5hRW5kQW5nbGU7dGhpcy5hQ2xvY2t3aXNlPWIuYUNsb2Nrd2lzZTt0aGlzLmFSb3RhdGlvbj1iLmFSb3RhdGlvbjtyZXR1cm4gdGhpc307TGMucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBiPWFiLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLmFYPXRoaXMuYVg7Yi5hWT10aGlzLmFZO2IueFJhZGl1cz10aGlzLnhSYWRpdXM7Yi55UmFkaXVzPXRoaXMueVJhZGl1cztiLmFTdGFydEFuZ2xlPXRoaXMuYVN0YXJ0QW5nbGU7Yi5hRW5kQW5nbGU9dGhpcy5hRW5kQW5nbGU7Yi5hQ2xvY2t3aXNlPXRoaXMuYUNsb2Nrd2lzZTtiLmFSb3RhdGlvbj0KdGhpcy5hUm90YXRpb247cmV0dXJuIGJ9O0xjLnByb3RvdHlwZS5mcm9tSlNPTj1mdW5jdGlvbihiKXthYi5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCh0aGlzLGIpO3RoaXMuYVg9Yi5hWDt0aGlzLmFZPWIuYVk7dGhpcy54UmFkaXVzPWIueFJhZGl1czt0aGlzLnlSYWRpdXM9Yi55UmFkaXVzO3RoaXMuYVN0YXJ0QW5nbGU9Yi5hU3RhcnRBbmdsZTt0aGlzLmFFbmRBbmdsZT1iLmFFbmRBbmdsZTt0aGlzLmFDbG9ja3dpc2U9Yi5hQ2xvY2t3aXNlO3RoaXMuYVJvdGF0aW9uPWIuYVJvdGF0aW9uO3JldHVybiB0aGlzfTtmZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShMYy5wcm90b3R5cGUpO2ZnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1mZztmZy5wcm90b3R5cGUuaXNBcmNDdXJ2ZT0hMDt2YXIgdWo9bmV3IGcsb2w9bmV3IEdrLHBsPW5ldyBHayxxbD1uZXcgR2s7dWMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYWIucHJvdG90eXBlKTt1Yy5wcm90b3R5cGUuY29uc3RydWN0b3I9dWM7CnVjLnByb3RvdHlwZS5pc0NhdG11bGxSb21DdXJ2ZTM9ITA7dWMucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGIsZSl7ZT1lfHxuZXcgZzt2YXIgaD10aGlzLnBvaW50cyxtPWgubGVuZ3RoO2IqPW0tKHRoaXMuY2xvc2VkPzA6MSk7dmFyIHU9TWF0aC5mbG9vcihiKTtiLT11O3RoaXMuY2xvc2VkP3UrPTA8dT8wOihNYXRoLmZsb29yKE1hdGguYWJzKHUpL20pKzEpKm06MD09PWImJnU9PT1tLTEmJih1PW0tMixiPTEpO2lmKHRoaXMuY2xvc2VkfHwwPHUpdmFyIHc9aFsodS0xKSVtXTtlbHNlIHVqLnN1YlZlY3RvcnMoaFswXSxoWzFdKS5hZGQoaFswXSksdz11ajt2YXIgQT1oW3UlbV07dmFyIEU9aFsodSsxKSVtXTt0aGlzLmNsb3NlZHx8dSsyPG0/aD1oWyh1KzIpJW1dOih1ai5zdWJWZWN0b3JzKGhbbS0xXSxoW20tMl0pLmFkZChoW20tMV0pLGg9dWopO2lmKCJjZW50cmlwZXRhbCI9PT10aGlzLmN1cnZlVHlwZXx8ImNob3JkYWwiPT09dGhpcy5jdXJ2ZVR5cGUpe3ZhciBHPQoiY2hvcmRhbCI9PT10aGlzLmN1cnZlVHlwZT8uNTouMjU7bT1NYXRoLnBvdyh3LmRpc3RhbmNlVG9TcXVhcmVkKEEpLEcpO3U9TWF0aC5wb3coQS5kaXN0YW5jZVRvU3F1YXJlZChFKSxHKTtHPU1hdGgucG93KEUuZGlzdGFuY2VUb1NxdWFyZWQoaCksRyk7MUUtND51JiYodT0xKTsxRS00Pm0mJihtPXUpOzFFLTQ+RyYmKEc9dSk7b2wuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKHcueCxBLngsRS54LGgueCxtLHUsRyk7cGwuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKHcueSxBLnksRS55LGgueSxtLHUsRyk7cWwuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKHcueixBLnosRS56LGgueixtLHUsRyl9ZWxzZSJjYXRtdWxscm9tIj09PXRoaXMuY3VydmVUeXBlJiYob2wuaW5pdENhdG11bGxSb20ody54LEEueCxFLngsaC54LHRoaXMudGVuc2lvbikscGwuaW5pdENhdG11bGxSb20ody55LEEueSxFLnksaC55LHRoaXMudGVuc2lvbikscWwuaW5pdENhdG11bGxSb20ody56LEEueixFLnosCmgueix0aGlzLnRlbnNpb24pKTtlLnNldChvbC5jYWxjKGIpLHBsLmNhbGMoYikscWwuY2FsYyhiKSk7cmV0dXJuIGV9O3VjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe2FiLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLnBvaW50cz1bXTtmb3IodmFyIGU9MCxoPWIucG9pbnRzLmxlbmd0aDtlPGg7ZSsrKXRoaXMucG9pbnRzLnB1c2goYi5wb2ludHNbZV0uY2xvbmUoKSk7dGhpcy5jbG9zZWQ9Yi5jbG9zZWQ7dGhpcy5jdXJ2ZVR5cGU9Yi5jdXJ2ZVR5cGU7dGhpcy50ZW5zaW9uPWIudGVuc2lvbjtyZXR1cm4gdGhpc307dWMucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBiPWFiLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLnBvaW50cz1bXTtmb3IodmFyIGU9MCxoPXRoaXMucG9pbnRzLmxlbmd0aDtlPGg7ZSsrKWIucG9pbnRzLnB1c2godGhpcy5wb2ludHNbZV0udG9BcnJheSgpKTtiLmNsb3NlZD10aGlzLmNsb3NlZDtiLmN1cnZlVHlwZT10aGlzLmN1cnZlVHlwZTsKYi50ZW5zaW9uPXRoaXMudGVuc2lvbjtyZXR1cm4gYn07dWMucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGIpe2FiLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYik7dGhpcy5wb2ludHM9W107Zm9yKHZhciBlPTAsaD1iLnBvaW50cy5sZW5ndGg7ZTxoO2UrKyl7dmFyIG09Yi5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaCgobmV3IGcpLmZyb21BcnJheShtKSl9dGhpcy5jbG9zZWQ9Yi5jbG9zZWQ7dGhpcy5jdXJ2ZVR5cGU9Yi5jdXJ2ZVR5cGU7dGhpcy50ZW5zaW9uPWIudGVuc2lvbjtyZXR1cm4gdGhpc307ZWQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYWIucHJvdG90eXBlKTtlZC5wcm90b3R5cGUuY29uc3RydWN0b3I9ZWQ7ZWQucHJvdG90eXBlLmlzQ3ViaWNCZXppZXJDdXJ2ZT0hMDtlZC5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYixlKXtlPWV8fG5ldyBkO3ZhciBoPXRoaXMudjAsbT10aGlzLnYxLHU9dGhpcy52Mix3PXRoaXMudjM7ZS5zZXQoRmgoYiwKaC54LG0ueCx1Lngsdy54KSxGaChiLGgueSxtLnksdS55LHcueSkpO3JldHVybiBlfTtlZC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihiKXthYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy52MC5jb3B5KGIudjApO3RoaXMudjEuY29weShiLnYxKTt0aGlzLnYyLmNvcHkoYi52Mik7dGhpcy52My5jb3B5KGIudjMpO3JldHVybiB0aGlzfTtlZC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGI9YWIucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2IudjA9dGhpcy52MC50b0FycmF5KCk7Yi52MT10aGlzLnYxLnRvQXJyYXkoKTtiLnYyPXRoaXMudjIudG9BcnJheSgpO2IudjM9dGhpcy52My50b0FycmF5KCk7cmV0dXJuIGJ9O2VkLnByb3RvdHlwZS5mcm9tSlNPTj1mdW5jdGlvbihiKXthYi5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCh0aGlzLGIpO3RoaXMudjAuZnJvbUFycmF5KGIudjApO3RoaXMudjEuZnJvbUFycmF5KGIudjEpO3RoaXMudjIuZnJvbUFycmF5KGIudjIpOwp0aGlzLnYzLmZyb21BcnJheShiLnYzKTtyZXR1cm4gdGhpc307QmQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYWIucHJvdG90eXBlKTtCZC5wcm90b3R5cGUuY29uc3RydWN0b3I9QmQ7QmQucHJvdG90eXBlLmlzQ3ViaWNCZXppZXJDdXJ2ZTM9ITA7QmQucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGIsZSl7ZT1lfHxuZXcgZzt2YXIgaD10aGlzLnYwLG09dGhpcy52MSx1PXRoaXMudjIsdz10aGlzLnYzO2Uuc2V0KEZoKGIsaC54LG0ueCx1Lngsdy54KSxGaChiLGgueSxtLnksdS55LHcueSksRmgoYixoLnosbS56LHUueix3LnopKTtyZXR1cm4gZX07QmQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYil7YWIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMudjAuY29weShiLnYwKTt0aGlzLnYxLmNvcHkoYi52MSk7dGhpcy52Mi5jb3B5KGIudjIpO3RoaXMudjMuY29weShiLnYzKTtyZXR1cm4gdGhpc307QmQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBiPQphYi5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7Yi52MD10aGlzLnYwLnRvQXJyYXkoKTtiLnYxPXRoaXMudjEudG9BcnJheSgpO2IudjI9dGhpcy52Mi50b0FycmF5KCk7Yi52Mz10aGlzLnYzLnRvQXJyYXkoKTtyZXR1cm4gYn07QmQucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGIpe2FiLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYik7dGhpcy52MC5mcm9tQXJyYXkoYi52MCk7dGhpcy52MS5mcm9tQXJyYXkoYi52MSk7dGhpcy52Mi5mcm9tQXJyYXkoYi52Mik7dGhpcy52My5mcm9tQXJyYXkoYi52Myk7cmV0dXJuIHRoaXN9O0djLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGFiLnByb3RvdHlwZSk7R2MucHJvdG90eXBlLmNvbnN0cnVjdG9yPUdjO0djLnByb3RvdHlwZS5pc0xpbmVDdXJ2ZT0hMDtHYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYixlKXtlPWV8fG5ldyBkOzE9PT1iP2UuY29weSh0aGlzLnYyKTooZS5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSwKZS5tdWx0aXBseVNjYWxhcihiKS5hZGQodGhpcy52MSkpO3JldHVybiBlfTtHYy5wcm90b3R5cGUuZ2V0UG9pbnRBdD1mdW5jdGlvbihiLGUpe3JldHVybiB0aGlzLmdldFBvaW50KGIsZSl9O0djLnByb3RvdHlwZS5nZXRUYW5nZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudjIuY2xvbmUoKS5zdWIodGhpcy52MSkubm9ybWFsaXplKCl9O0djLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe2FiLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLnYxLmNvcHkoYi52MSk7dGhpcy52Mi5jb3B5KGIudjIpO3JldHVybiB0aGlzfTtHYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGI9YWIucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2IudjE9dGhpcy52MS50b0FycmF5KCk7Yi52Mj10aGlzLnYyLnRvQXJyYXkoKTtyZXR1cm4gYn07R2MucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGIpe2FiLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYik7dGhpcy52MS5mcm9tQXJyYXkoYi52MSk7CnRoaXMudjIuZnJvbUFycmF5KGIudjIpO3JldHVybiB0aGlzfTtmZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShhYi5wcm90b3R5cGUpO2ZkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1mZDtmZC5wcm90b3R5cGUuaXNMaW5lQ3VydmUzPSEwO2ZkLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihiLGUpe2U9ZXx8bmV3IGc7MT09PWI/ZS5jb3B5KHRoaXMudjIpOihlLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLGUubXVsdGlwbHlTY2FsYXIoYikuYWRkKHRoaXMudjEpKTtyZXR1cm4gZX07ZmQucHJvdG90eXBlLmdldFBvaW50QXQ9ZnVuY3Rpb24oYixlKXtyZXR1cm4gdGhpcy5nZXRQb2ludChiLGUpfTtmZC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihiKXthYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy52MS5jb3B5KGIudjEpO3RoaXMudjIuY29weShiLnYyKTtyZXR1cm4gdGhpc307ZmQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBiPWFiLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTsKYi52MT10aGlzLnYxLnRvQXJyYXkoKTtiLnYyPXRoaXMudjIudG9BcnJheSgpO3JldHVybiBifTtmZC5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYil7YWIucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxiKTt0aGlzLnYxLmZyb21BcnJheShiLnYxKTt0aGlzLnYyLmZyb21BcnJheShiLnYyKTtyZXR1cm4gdGhpc307Z2QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYWIucHJvdG90eXBlKTtnZC5wcm90b3R5cGUuY29uc3RydWN0b3I9Z2Q7Z2QucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmU9ITA7Z2QucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGIsZSl7ZT1lfHxuZXcgZDt2YXIgaD10aGlzLnYwLG09dGhpcy52MSx1PXRoaXMudjI7ZS5zZXQoRWgoYixoLngsbS54LHUueCksRWgoYixoLnksbS55LHUueSkpO3JldHVybiBlfTtnZC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihiKXthYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy52MC5jb3B5KGIudjApOwp0aGlzLnYxLmNvcHkoYi52MSk7dGhpcy52Mi5jb3B5KGIudjIpO3JldHVybiB0aGlzfTtnZC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGI9YWIucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2IudjA9dGhpcy52MC50b0FycmF5KCk7Yi52MT10aGlzLnYxLnRvQXJyYXkoKTtiLnYyPXRoaXMudjIudG9BcnJheSgpO3JldHVybiBifTtnZC5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYil7YWIucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxiKTt0aGlzLnYwLmZyb21BcnJheShiLnYwKTt0aGlzLnYxLmZyb21BcnJheShiLnYxKTt0aGlzLnYyLmZyb21BcnJheShiLnYyKTtyZXR1cm4gdGhpc307Q2QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYWIucHJvdG90eXBlKTtDZC5wcm90b3R5cGUuY29uc3RydWN0b3I9Q2Q7Q2QucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUzPSEwO0NkLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihiLGUpe2U9ZXx8Cm5ldyBnO3ZhciBoPXRoaXMudjAsbT10aGlzLnYxLHU9dGhpcy52MjtlLnNldChFaChiLGgueCxtLngsdS54KSxFaChiLGgueSxtLnksdS55KSxFaChiLGgueixtLnosdS56KSk7cmV0dXJuIGV9O0NkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe2FiLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLnYwLmNvcHkoYi52MCk7dGhpcy52MS5jb3B5KGIudjEpO3RoaXMudjIuY29weShiLnYyKTtyZXR1cm4gdGhpc307Q2QucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBiPWFiLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLnYwPXRoaXMudjAudG9BcnJheSgpO2IudjE9dGhpcy52MS50b0FycmF5KCk7Yi52Mj10aGlzLnYyLnRvQXJyYXkoKTtyZXR1cm4gYn07Q2QucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGIpe2FiLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYik7dGhpcy52MC5mcm9tQXJyYXkoYi52MCk7dGhpcy52MS5mcm9tQXJyYXkoYi52MSk7CnRoaXMudjIuZnJvbUFycmF5KGIudjIpO3JldHVybiB0aGlzfTtoZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShhYi5wcm90b3R5cGUpO2hkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1oZDtoZC5wcm90b3R5cGUuaXNTcGxpbmVDdXJ2ZT0hMDtoZC5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYixlKXtlPWV8fG5ldyBkO3ZhciBoPXRoaXMucG9pbnRzLG09KGgubGVuZ3RoLTEpKmI7Yj1NYXRoLmZsb29yKG0pO20tPWI7dmFyIHU9aFswPT09Yj9iOmItMV0sdz1oW2JdLEE9aFtiPmgubGVuZ3RoLTI/aC5sZW5ndGgtMTpiKzFdO2g9aFtiPmgubGVuZ3RoLTM/aC5sZW5ndGgtMTpiKzJdO2Uuc2V0KFluKG0sdS54LHcueCxBLngsaC54KSxZbihtLHUueSx3LnksQS55LGgueSkpO3JldHVybiBlfTtoZC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihiKXthYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5wb2ludHM9W107Zm9yKHZhciBlPTAsaD1iLnBvaW50cy5sZW5ndGg7ZTwKaDtlKyspdGhpcy5wb2ludHMucHVzaChiLnBvaW50c1tlXS5jbG9uZSgpKTtyZXR1cm4gdGhpc307aGQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBiPWFiLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLnBvaW50cz1bXTtmb3IodmFyIGU9MCxoPXRoaXMucG9pbnRzLmxlbmd0aDtlPGg7ZSsrKWIucG9pbnRzLnB1c2godGhpcy5wb2ludHNbZV0udG9BcnJheSgpKTtyZXR1cm4gYn07aGQucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGIpe2FiLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYik7dGhpcy5wb2ludHM9W107Zm9yKHZhciBlPTAsaD1iLnBvaW50cy5sZW5ndGg7ZTxoO2UrKyl7dmFyIG09Yi5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaCgobmV3IGQpLmZyb21BcnJheShtKSl9cmV0dXJuIHRoaXN9O3ZhciBybD1PYmplY3QuZnJlZXplKHtBcmNDdXJ2ZTpmZyxDYXRtdWxsUm9tQ3VydmUzOnVjLEN1YmljQmV6aWVyQ3VydmU6ZWQsQ3ViaWNCZXppZXJDdXJ2ZTM6QmQsCkVsbGlwc2VDdXJ2ZTpMYyxMaW5lQ3VydmU6R2MsTGluZUN1cnZlMzpmZCxRdWFkcmF0aWNCZXppZXJDdXJ2ZTpnZCxRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6Q2QsU3BsaW5lQ3VydmU6aGR9KTtRZC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGFiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlFkLGFkZDpmdW5jdGlvbihiKXt0aGlzLmN1cnZlcy5wdXNoKGIpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmN1cnZlc1swXS5nZXRQb2ludCgwKSxlPXRoaXMuY3VydmVzW3RoaXMuY3VydmVzLmxlbmd0aC0xXS5nZXRQb2ludCgxKTtiLmVxdWFscyhlKXx8dGhpcy5jdXJ2ZXMucHVzaChuZXcgR2MoZSxiKSl9LGdldFBvaW50OmZ1bmN0aW9uKGIpe3ZhciBlPWIqdGhpcy5nZXRMZW5ndGgoKSxoPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7Zm9yKGI9MDtiPGgubGVuZ3RoOyl7aWYoaFtiXT49ZSlyZXR1cm4gZT1oW2JdLWUsYj10aGlzLmN1cnZlc1tiXSxoPQpiLmdldExlbmd0aCgpLGIuZ2V0UG9pbnRBdCgwPT09aD8wOjEtZS9oKTtiKyt9cmV0dXJuIG51bGx9LGdldExlbmd0aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7cmV0dXJuIGJbYi5sZW5ndGgtMV19LHVwZGF0ZUFyY0xlbmd0aHM6ZnVuY3Rpb24oKXt0aGlzLm5lZWRzVXBkYXRlPSEwO3RoaXMuY2FjaGVMZW5ndGhzPW51bGw7dGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKX0sZ2V0Q3VydmVMZW5ndGhzOmZ1bmN0aW9uKCl7aWYodGhpcy5jYWNoZUxlbmd0aHMmJnRoaXMuY2FjaGVMZW5ndGhzLmxlbmd0aD09PXRoaXMuY3VydmVzLmxlbmd0aClyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM7Zm9yKHZhciBiPVtdLGU9MCxoPTAsbT10aGlzLmN1cnZlcy5sZW5ndGg7aDxtO2grKyllKz10aGlzLmN1cnZlc1toXS5nZXRMZW5ndGgoKSxiLnB1c2goZSk7cmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzPWJ9LGdldFNwYWNlZFBvaW50czpmdW5jdGlvbihiKXt2b2lkIDA9PT0KYiYmKGI9NDApO2Zvcih2YXIgZT1bXSxoPTA7aDw9YjtoKyspZS5wdXNoKHRoaXMuZ2V0UG9pbnQoaC9iKSk7dGhpcy5hdXRvQ2xvc2UmJmUucHVzaChlWzBdKTtyZXR1cm4gZX0sZ2V0UG9pbnRzOmZ1bmN0aW9uKGIpe2I9Ynx8MTI7Zm9yKHZhciBlPVtdLGgsbT0wLHU9dGhpcy5jdXJ2ZXM7bTx1Lmxlbmd0aDttKyspe3ZhciB3PXVbbV07dz13LmdldFBvaW50cyh3JiZ3LmlzRWxsaXBzZUN1cnZlPzIqYjp3JiYody5pc0xpbmVDdXJ2ZXx8dy5pc0xpbmVDdXJ2ZTMpPzE6dyYmdy5pc1NwbGluZUN1cnZlP2Iqdy5wb2ludHMubGVuZ3RoOmIpO2Zvcih2YXIgQT0wO0E8dy5sZW5ndGg7QSsrKXt2YXIgRT13W0FdO2gmJmguZXF1YWxzKEUpfHwoZS5wdXNoKEUpLGg9RSl9fXRoaXMuYXV0b0Nsb3NlJiYxPGUubGVuZ3RoJiYhZVtlLmxlbmd0aC0xXS5lcXVhbHMoZVswXSkmJmUucHVzaChlWzBdKTtyZXR1cm4gZX0sY29weTpmdW5jdGlvbihiKXthYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsCmIpO3RoaXMuY3VydmVzPVtdO2Zvcih2YXIgZT0wLGg9Yi5jdXJ2ZXMubGVuZ3RoO2U8aDtlKyspdGhpcy5jdXJ2ZXMucHVzaChiLmN1cnZlc1tlXS5jbG9uZSgpKTt0aGlzLmF1dG9DbG9zZT1iLmF1dG9DbG9zZTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKCl7dmFyIGI9YWIucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2IuYXV0b0Nsb3NlPXRoaXMuYXV0b0Nsb3NlO2IuY3VydmVzPVtdO2Zvcih2YXIgZT0wLGg9dGhpcy5jdXJ2ZXMubGVuZ3RoO2U8aDtlKyspYi5jdXJ2ZXMucHVzaCh0aGlzLmN1cnZlc1tlXS50b0pTT04oKSk7cmV0dXJuIGJ9LGZyb21KU09OOmZ1bmN0aW9uKGIpe2FiLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYik7dGhpcy5hdXRvQ2xvc2U9Yi5hdXRvQ2xvc2U7dGhpcy5jdXJ2ZXM9W107Zm9yKHZhciBlPTAsaD1iLmN1cnZlcy5sZW5ndGg7ZTxoO2UrKyl7dmFyIG09Yi5jdXJ2ZXNbZV07dGhpcy5jdXJ2ZXMucHVzaCgobmV3IHJsW20udHlwZV0pLmZyb21KU09OKG0pKX1yZXR1cm4gdGhpc319KTsKaWQucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShRZC5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjppZCxzZXRGcm9tUG9pbnRzOmZ1bmN0aW9uKGIpe3RoaXMubW92ZVRvKGJbMF0ueCxiWzBdLnkpO2Zvcih2YXIgZT0xLGg9Yi5sZW5ndGg7ZTxoO2UrKyl0aGlzLmxpbmVUbyhiW2VdLngsYltlXS55KX0sbW92ZVRvOmZ1bmN0aW9uKGIsZSl7dGhpcy5jdXJyZW50UG9pbnQuc2V0KGIsZSl9LGxpbmVUbzpmdW5jdGlvbihiLGUpe3ZhciBoPW5ldyBHYyh0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBkKGIsZSkpO3RoaXMuY3VydmVzLnB1c2goaCk7dGhpcy5jdXJyZW50UG9pbnQuc2V0KGIsZSl9LHF1YWRyYXRpY0N1cnZlVG86ZnVuY3Rpb24oYixlLGgsbSl7Yj1uZXcgZ2QodGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgZChiLGUpLG5ldyBkKGgsbSkpO3RoaXMuY3VydmVzLnB1c2goYik7dGhpcy5jdXJyZW50UG9pbnQuc2V0KGgsbSl9LGJlemllckN1cnZlVG86ZnVuY3Rpb24oYiwKZSxoLG0sdSx3KXtiPW5ldyBlZCh0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBkKGIsZSksbmV3IGQoaCxtKSxuZXcgZCh1LHcpKTt0aGlzLmN1cnZlcy5wdXNoKGIpO3RoaXMuY3VycmVudFBvaW50LnNldCh1LHcpfSxzcGxpbmVUaHJ1OmZ1bmN0aW9uKGIpe3ZhciBlPVt0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpXS5jb25jYXQoYik7ZT1uZXcgaGQoZSk7dGhpcy5jdXJ2ZXMucHVzaChlKTt0aGlzLmN1cnJlbnRQb2ludC5jb3B5KGJbYi5sZW5ndGgtMV0pfSxhcmM6ZnVuY3Rpb24oYixlLGgsbSx1LHcpe3RoaXMuYWJzYXJjKGIrdGhpcy5jdXJyZW50UG9pbnQueCxlK3RoaXMuY3VycmVudFBvaW50LnksaCxtLHUsdyl9LGFic2FyYzpmdW5jdGlvbihiLGUsaCxtLHUsdyl7dGhpcy5hYnNlbGxpcHNlKGIsZSxoLGgsbSx1LHcpfSxlbGxpcHNlOmZ1bmN0aW9uKGIsZSxoLG0sdSx3LEEsRSl7dGhpcy5hYnNlbGxpcHNlKGIrdGhpcy5jdXJyZW50UG9pbnQueCxlK3RoaXMuY3VycmVudFBvaW50LnksCmgsbSx1LHcsQSxFKX0sYWJzZWxsaXBzZTpmdW5jdGlvbihiLGUsaCxtLHUsdyxBLEUpe2I9bmV3IExjKGIsZSxoLG0sdSx3LEEsRSk7MDx0aGlzLmN1cnZlcy5sZW5ndGgmJihlPWIuZ2V0UG9pbnQoMCksZS5lcXVhbHModGhpcy5jdXJyZW50UG9pbnQpfHx0aGlzLmxpbmVUbyhlLngsZS55KSk7dGhpcy5jdXJ2ZXMucHVzaChiKTtiPWIuZ2V0UG9pbnQoMSk7dGhpcy5jdXJyZW50UG9pbnQuY29weShiKX0sY29weTpmdW5jdGlvbihiKXtRZC5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5jdXJyZW50UG9pbnQuY29weShiLmN1cnJlbnRQb2ludCk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBiPVFkLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLmN1cnJlbnRQb2ludD10aGlzLmN1cnJlbnRQb2ludC50b0FycmF5KCk7cmV0dXJuIGJ9LGZyb21KU09OOmZ1bmN0aW9uKGIpe1FkLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYik7dGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KGIuY3VycmVudFBvaW50KTsKcmV0dXJuIHRoaXN9fSk7dGUucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShpZC5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp0ZSxnZXRQb2ludHNIb2xlczpmdW5jdGlvbihiKXtmb3IodmFyIGU9W10saD0wLG09dGhpcy5ob2xlcy5sZW5ndGg7aDxtO2grKyllW2hdPXRoaXMuaG9sZXNbaF0uZ2V0UG9pbnRzKGIpO3JldHVybiBlfSxleHRyYWN0UG9pbnRzOmZ1bmN0aW9uKGIpe3JldHVybntzaGFwZTp0aGlzLmdldFBvaW50cyhiKSxob2xlczp0aGlzLmdldFBvaW50c0hvbGVzKGIpfX0sY29weTpmdW5jdGlvbihiKXtpZC5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5ob2xlcz1bXTtmb3IodmFyIGU9MCxoPWIuaG9sZXMubGVuZ3RoO2U8aDtlKyspdGhpcy5ob2xlcy5wdXNoKGIuaG9sZXNbZV0uY2xvbmUoKSk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBiPWlkLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLnV1aWQ9dGhpcy51dWlkOwpiLmhvbGVzPVtdO2Zvcih2YXIgZT0wLGg9dGhpcy5ob2xlcy5sZW5ndGg7ZTxoO2UrKyliLmhvbGVzLnB1c2godGhpcy5ob2xlc1tlXS50b0pTT04oKSk7cmV0dXJuIGJ9LGZyb21KU09OOmZ1bmN0aW9uKGIpe2lkLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYik7dGhpcy51dWlkPWIudXVpZDt0aGlzLmhvbGVzPVtdO2Zvcih2YXIgZT0wLGg9Yi5ob2xlcy5sZW5ndGg7ZTxoO2UrKyl7dmFyIG09Yi5ob2xlc1tlXTt0aGlzLmhvbGVzLnB1c2goKG5ldyBpZCkuZnJvbUpTT04obSkpfXJldHVybiB0aGlzfX0pO1ViLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoeS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpVYixpc0xpZ2h0OiEwLGNvcHk6ZnVuY3Rpb24oYil7eS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5jb2xvci5jb3B5KGIuY29sb3IpO3RoaXMuaW50ZW5zaXR5PWIuaW50ZW5zaXR5O3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYil7Yj0KeS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxiKTtiLm9iamVjdC5jb2xvcj10aGlzLmNvbG9yLmdldEhleCgpO2Iub2JqZWN0LmludGVuc2l0eT10aGlzLmludGVuc2l0eTt2b2lkIDAhPT10aGlzLmdyb3VuZENvbG9yJiYoYi5vYmplY3QuZ3JvdW5kQ29sb3I9dGhpcy5ncm91bmRDb2xvci5nZXRIZXgoKSk7dm9pZCAwIT09dGhpcy5kaXN0YW5jZSYmKGIub2JqZWN0LmRpc3RhbmNlPXRoaXMuZGlzdGFuY2UpO3ZvaWQgMCE9PXRoaXMuYW5nbGUmJihiLm9iamVjdC5hbmdsZT10aGlzLmFuZ2xlKTt2b2lkIDAhPT10aGlzLmRlY2F5JiYoYi5vYmplY3QuZGVjYXk9dGhpcy5kZWNheSk7dm9pZCAwIT09dGhpcy5wZW51bWJyYSYmKGIub2JqZWN0LnBlbnVtYnJhPXRoaXMucGVudW1icmEpO3ZvaWQgMCE9PXRoaXMuc2hhZG93JiYoYi5vYmplY3Quc2hhZG93PXRoaXMuc2hhZG93LnRvSlNPTigpKTtyZXR1cm4gYn19KTtLaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFViLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpLaSxpc0hlbWlzcGhlcmVMaWdodDohMCxjb3B5OmZ1bmN0aW9uKGIpe1ViLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLmdyb3VuZENvbG9yLmNvcHkoYi5ncm91bmRDb2xvcik7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmFzc2lnbihEZC5wcm90b3R5cGUse19wcm9qU2NyZWVuTWF0cml4Om5ldyByLF9saWdodFBvc2l0aW9uV29ybGQ6bmV3IGcsX2xvb2tUYXJnZXQ6bmV3IGcsZ2V0Vmlld3BvcnRDb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl92aWV3cG9ydENvdW50fSxnZXRGcnVzdHVtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZydXN0dW19LHVwZGF0ZU1hdHJpY2VzOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuY2FtZXJhLGg9dGhpcy5tYXRyaXgsbT10aGlzLl9wcm9qU2NyZWVuTWF0cml4LHU9dGhpcy5fbG9va1RhcmdldCx3PXRoaXMuX2xpZ2h0UG9zaXRpb25Xb3JsZDt3LnNldEZyb21NYXRyaXhQb3NpdGlvbihiLm1hdHJpeFdvcmxkKTsKZS5wb3NpdGlvbi5jb3B5KHcpO3Uuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGIudGFyZ2V0Lm1hdHJpeFdvcmxkKTtlLmxvb2tBdCh1KTtlLnVwZGF0ZU1hdHJpeFdvcmxkKCk7bS5tdWx0aXBseU1hdHJpY2VzKGUucHJvamVjdGlvbk1hdHJpeCxlLm1hdHJpeFdvcmxkSW52ZXJzZSk7dGhpcy5fZnJ1c3R1bS5zZXRGcm9tTWF0cml4KG0pO2guc2V0KC41LDAsMCwuNSwwLC41LDAsLjUsMCwwLC41LC41LDAsMCwwLDEpO2gubXVsdGlwbHkoZS5wcm9qZWN0aW9uTWF0cml4KTtoLm11bHRpcGx5KGUubWF0cml4V29ybGRJbnZlcnNlKX0sZ2V0Vmlld3BvcnQ6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0c1tiXX0sZ2V0RnJhbWVFeHRlbnRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZyYW1lRXh0ZW50c30sY29weTpmdW5jdGlvbihiKXt0aGlzLmNhbWVyYT1iLmNhbWVyYS5jbG9uZSgpO3RoaXMuYmlhcz1iLmJpYXM7dGhpcy5yYWRpdXM9Yi5yYWRpdXM7dGhpcy5tYXBTaXplLmNvcHkoYi5tYXBTaXplKTsKcmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYj17fTswIT09dGhpcy5iaWFzJiYoYi5iaWFzPXRoaXMuYmlhcyk7MSE9PXRoaXMucmFkaXVzJiYoYi5yYWRpdXM9dGhpcy5yYWRpdXMpO2lmKDUxMiE9PXRoaXMubWFwU2l6ZS54fHw1MTIhPT10aGlzLm1hcFNpemUueSliLm1hcFNpemU9dGhpcy5tYXBTaXplLnRvQXJyYXkoKTtiLmNhbWVyYT10aGlzLmNhbWVyYS50b0pTT04oITEpLm9iamVjdDtkZWxldGUgYi5jYW1lcmEubWF0cml4O3JldHVybiBifX0pO0xpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGQucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6TGksaXNTcG90TGlnaHRTaGFkb3c6ITAsdXBkYXRlTWF0cmljZXM6ZnVuY3Rpb24oYixlLGgpe3ZhciBtPXRoaXMuY2FtZXJhLHU9MipsYi5SQUQyREVHKmIuYW5nbGUsdz10aGlzLm1hcFNpemUud2lkdGgvCnRoaXMubWFwU2l6ZS5oZWlnaHQsQT1iLmRpc3RhbmNlfHxtLmZhcjtpZih1IT09bS5mb3Z8fHchPT1tLmFzcGVjdHx8QSE9PW0uZmFyKW0uZm92PXUsbS5hc3BlY3Q9dyxtLmZhcj1BLG0udXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO0RkLnByb3RvdHlwZS51cGRhdGVNYXRyaWNlcy5jYWxsKHRoaXMsYixlLGgpfX0pO01pLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoVWIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6TWksaXNTcG90TGlnaHQ6ITAsY29weTpmdW5jdGlvbihiKXtVYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy5kaXN0YW5jZT1iLmRpc3RhbmNlO3RoaXMuYW5nbGU9Yi5hbmdsZTt0aGlzLnBlbnVtYnJhPWIucGVudW1icmE7dGhpcy5kZWNheT1iLmRlY2F5O3RoaXMudGFyZ2V0PWIudGFyZ2V0LmNsb25lKCk7dGhpcy5zaGFkb3c9Yi5zaGFkb3cuY2xvbmUoKTtyZXR1cm4gdGhpc319KTtIay5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERkLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpIayxpc1BvaW50TGlnaHRTaGFkb3c6ITAsdXBkYXRlTWF0cmljZXM6ZnVuY3Rpb24oYixlLGgpe2U9dGhpcy5jYW1lcmE7dmFyIG09dGhpcy5tYXRyaXgsdT10aGlzLl9saWdodFBvc2l0aW9uV29ybGQsdz10aGlzLl9sb29rVGFyZ2V0LEE9dGhpcy5fcHJvalNjcmVlbk1hdHJpeDt1LnNldEZyb21NYXRyaXhQb3NpdGlvbihiLm1hdHJpeFdvcmxkKTtlLnBvc2l0aW9uLmNvcHkodSk7dy5jb3B5KGUucG9zaXRpb24pO3cuYWRkKHRoaXMuX2N1YmVEaXJlY3Rpb25zW2hdKTtlLnVwLmNvcHkodGhpcy5fY3ViZVVwc1toXSk7ZS5sb29rQXQodyk7ZS51cGRhdGVNYXRyaXhXb3JsZCgpO20ubWFrZVRyYW5zbGF0aW9uKC11LngsLXUueSwtdS56KTtBLm11bHRpcGx5TWF0cmljZXMoZS5wcm9qZWN0aW9uTWF0cml4LGUubWF0cml4V29ybGRJbnZlcnNlKTt0aGlzLl9mcnVzdHVtLnNldEZyb21NYXRyaXgoQSl9fSk7TmkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShVYi5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6TmksaXNQb2ludExpZ2h0OiEwLGNvcHk6ZnVuY3Rpb24oYil7VWIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMuZGlzdGFuY2U9Yi5kaXN0YW5jZTt0aGlzLmRlY2F5PWIuZGVjYXk7dGhpcy5zaGFkb3c9Yi5zaGFkb3cuY2xvbmUoKTtyZXR1cm4gdGhpc319KTtHaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEZiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkdoLGlzT3J0aG9ncmFwaGljQ2FtZXJhOiEwLGNvcHk6ZnVuY3Rpb24oYixlKXtGYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYixlKTt0aGlzLmxlZnQ9Yi5sZWZ0O3RoaXMucmlnaHQ9Yi5yaWdodDt0aGlzLnRvcD1iLnRvcDt0aGlzLmJvdHRvbT1iLmJvdHRvbTt0aGlzLm5lYXI9Yi5uZWFyO3RoaXMuZmFyPWIuZmFyO3RoaXMuem9vbT1iLnpvb207dGhpcy52aWV3PW51bGw9PT1iLnZpZXc/bnVsbDpPYmplY3QuYXNzaWduKHt9LGIudmlldyk7cmV0dXJuIHRoaXN9LApzZXRWaWV3T2Zmc2V0OmZ1bmN0aW9uKGIsZSxoLG0sdSx3KXtudWxsPT09dGhpcy52aWV3JiYodGhpcy52aWV3PXtlbmFibGVkOiEwLGZ1bGxXaWR0aDoxLGZ1bGxIZWlnaHQ6MSxvZmZzZXRYOjAsb2Zmc2V0WTowLHdpZHRoOjEsaGVpZ2h0OjF9KTt0aGlzLnZpZXcuZW5hYmxlZD0hMDt0aGlzLnZpZXcuZnVsbFdpZHRoPWI7dGhpcy52aWV3LmZ1bGxIZWlnaHQ9ZTt0aGlzLnZpZXcub2Zmc2V0WD1oO3RoaXMudmlldy5vZmZzZXRZPW07dGhpcy52aWV3LndpZHRoPXU7dGhpcy52aWV3LmhlaWdodD13O3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSxjbGVhclZpZXdPZmZzZXQ6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy52aWV3JiYodGhpcy52aWV3LmVuYWJsZWQ9ITEpO3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSx1cGRhdGVQcm9qZWN0aW9uTWF0cml4OmZ1bmN0aW9uKCl7dmFyIGI9KHRoaXMucmlnaHQtdGhpcy5sZWZ0KS8oMip0aGlzLnpvb20pLGU9KHRoaXMudG9wLQp0aGlzLmJvdHRvbSkvKDIqdGhpcy56b29tKSxoPSh0aGlzLnJpZ2h0K3RoaXMubGVmdCkvMixtPSh0aGlzLnRvcCt0aGlzLmJvdHRvbSkvMix1PWgtYjtoKz1iO2I9bStlO2U9bS1lO2lmKG51bGwhPT10aGlzLnZpZXcmJnRoaXMudmlldy5lbmFibGVkKXtoPXRoaXMuem9vbS8odGhpcy52aWV3LndpZHRoL3RoaXMudmlldy5mdWxsV2lkdGgpO2U9dGhpcy56b29tLyh0aGlzLnZpZXcuaGVpZ2h0L3RoaXMudmlldy5mdWxsSGVpZ2h0KTt2YXIgdz0odGhpcy5yaWdodC10aGlzLmxlZnQpL3RoaXMudmlldy53aWR0aDttPSh0aGlzLnRvcC10aGlzLmJvdHRvbSkvdGhpcy52aWV3LmhlaWdodDt1Kz10aGlzLnZpZXcub2Zmc2V0WC9oKnc7aD11K3RoaXMudmlldy53aWR0aC9oKnc7Yi09dGhpcy52aWV3Lm9mZnNldFkvZSptO2U9Yi10aGlzLnZpZXcuaGVpZ2h0L2UqbX10aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZU9ydGhvZ3JhcGhpYyh1LGgsYixlLHRoaXMubmVhcix0aGlzLmZhcik7dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKHRoaXMucHJvamVjdGlvbk1hdHJpeCl9LAp0b0pTT046ZnVuY3Rpb24oYil7Yj15LnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGIpO2Iub2JqZWN0Lnpvb209dGhpcy56b29tO2Iub2JqZWN0LmxlZnQ9dGhpcy5sZWZ0O2Iub2JqZWN0LnJpZ2h0PXRoaXMucmlnaHQ7Yi5vYmplY3QudG9wPXRoaXMudG9wO2Iub2JqZWN0LmJvdHRvbT10aGlzLmJvdHRvbTtiLm9iamVjdC5uZWFyPXRoaXMubmVhcjtiLm9iamVjdC5mYXI9dGhpcy5mYXI7bnVsbCE9PXRoaXMudmlldyYmKGIub2JqZWN0LnZpZXc9T2JqZWN0LmFzc2lnbih7fSx0aGlzLnZpZXcpKTtyZXR1cm4gYn19KTtPaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOk9pLGlzRGlyZWN0aW9uYWxMaWdodFNoYWRvdzohMCx1cGRhdGVNYXRyaWNlczpmdW5jdGlvbihiLGUsaCl7RGQucHJvdG90eXBlLnVwZGF0ZU1hdHJpY2VzLmNhbGwodGhpcyxiLGUsaCl9fSk7UGkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShVYi5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6UGksaXNEaXJlY3Rpb25hbExpZ2h0OiEwLGNvcHk6ZnVuY3Rpb24oYil7VWIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMudGFyZ2V0PWIudGFyZ2V0LmNsb25lKCk7dGhpcy5zaGFkb3c9Yi5zaGFkb3cuY2xvbmUoKTtyZXR1cm4gdGhpc319KTtRaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFViLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlFpLGlzQW1iaWVudExpZ2h0OiEwfSk7UmkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShVYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpSaSxpc1JlY3RBcmVhTGlnaHQ6ITAsY29weTpmdW5jdGlvbihiKXtVYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7dGhpcy53aWR0aD1iLndpZHRoO3RoaXMuaGVpZ2h0PWIuaGVpZ2h0O3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYil7Yj1VYi5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxiKTtiLm9iamVjdC53aWR0aD0KdGhpcy53aWR0aDtiLm9iamVjdC5oZWlnaHQ9dGhpcy5oZWlnaHQ7cmV0dXJuIGJ9fSk7U2kucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShLYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpTaSxsb2FkOmZ1bmN0aW9uKGIsZSxoLG0pe3ZhciB1PXRoaXMsdz1uZXcgU2ModS5tYW5hZ2VyKTt3LnNldFBhdGgodS5wYXRoKTt3LmxvYWQoYixmdW5jdGlvbihBKXtlKHUucGFyc2UoSlNPTi5wYXJzZShBKSkpfSxoLG0pfSxwYXJzZTpmdW5jdGlvbihiKXtmdW5jdGlvbiBlKEUpe3ZvaWQgMD09PWhbRV0mJmNvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWxMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlIixFKTtyZXR1cm4gaFtFXX12YXIgaD10aGlzLnRleHR1cmVzLG09bmV3IEdzW2IudHlwZV07dm9pZCAwIT09Yi51dWlkJiYobS51dWlkPWIudXVpZCk7dm9pZCAwIT09Yi5uYW1lJiYobS5uYW1lPWIubmFtZSk7dm9pZCAwIT09Yi5jb2xvciYmbS5jb2xvci5zZXRIZXgoYi5jb2xvcik7CnZvaWQgMCE9PWIucm91Z2huZXNzJiYobS5yb3VnaG5lc3M9Yi5yb3VnaG5lc3MpO3ZvaWQgMCE9PWIubWV0YWxuZXNzJiYobS5tZXRhbG5lc3M9Yi5tZXRhbG5lc3MpO3ZvaWQgMCE9PWIuZW1pc3NpdmUmJm0uZW1pc3NpdmUuc2V0SGV4KGIuZW1pc3NpdmUpO3ZvaWQgMCE9PWIuc3BlY3VsYXImJm0uc3BlY3VsYXIuc2V0SGV4KGIuc3BlY3VsYXIpO3ZvaWQgMCE9PWIuc2hpbmluZXNzJiYobS5zaGluaW5lc3M9Yi5zaGluaW5lc3MpO3ZvaWQgMCE9PWIuY2xlYXJjb2F0JiYobS5jbGVhcmNvYXQ9Yi5jbGVhcmNvYXQpO3ZvaWQgMCE9PWIuY2xlYXJjb2F0Um91Z2huZXNzJiYobS5jbGVhcmNvYXRSb3VnaG5lc3M9Yi5jbGVhcmNvYXRSb3VnaG5lc3MpO3ZvaWQgMCE9PWIudmVydGV4Q29sb3JzJiYobS52ZXJ0ZXhDb2xvcnM9Yi52ZXJ0ZXhDb2xvcnMpO3ZvaWQgMCE9PWIuZm9nJiYobS5mb2c9Yi5mb2cpO3ZvaWQgMCE9PWIuZmxhdFNoYWRpbmcmJihtLmZsYXRTaGFkaW5nPWIuZmxhdFNoYWRpbmcpOwp2b2lkIDAhPT1iLmJsZW5kaW5nJiYobS5ibGVuZGluZz1iLmJsZW5kaW5nKTt2b2lkIDAhPT1iLmNvbWJpbmUmJihtLmNvbWJpbmU9Yi5jb21iaW5lKTt2b2lkIDAhPT1iLnNpZGUmJihtLnNpZGU9Yi5zaWRlKTt2b2lkIDAhPT1iLm9wYWNpdHkmJihtLm9wYWNpdHk9Yi5vcGFjaXR5KTt2b2lkIDAhPT1iLnRyYW5zcGFyZW50JiYobS50cmFuc3BhcmVudD1iLnRyYW5zcGFyZW50KTt2b2lkIDAhPT1iLmFscGhhVGVzdCYmKG0uYWxwaGFUZXN0PWIuYWxwaGFUZXN0KTt2b2lkIDAhPT1iLmRlcHRoVGVzdCYmKG0uZGVwdGhUZXN0PWIuZGVwdGhUZXN0KTt2b2lkIDAhPT1iLmRlcHRoV3JpdGUmJihtLmRlcHRoV3JpdGU9Yi5kZXB0aFdyaXRlKTt2b2lkIDAhPT1iLmNvbG9yV3JpdGUmJihtLmNvbG9yV3JpdGU9Yi5jb2xvcldyaXRlKTt2b2lkIDAhPT1iLndpcmVmcmFtZSYmKG0ud2lyZWZyYW1lPWIud2lyZWZyYW1lKTt2b2lkIDAhPT1iLndpcmVmcmFtZUxpbmV3aWR0aCYmKG0ud2lyZWZyYW1lTGluZXdpZHRoPQpiLndpcmVmcmFtZUxpbmV3aWR0aCk7dm9pZCAwIT09Yi53aXJlZnJhbWVMaW5lY2FwJiYobS53aXJlZnJhbWVMaW5lY2FwPWIud2lyZWZyYW1lTGluZWNhcCk7dm9pZCAwIT09Yi53aXJlZnJhbWVMaW5lam9pbiYmKG0ud2lyZWZyYW1lTGluZWpvaW49Yi53aXJlZnJhbWVMaW5lam9pbik7dm9pZCAwIT09Yi5yb3RhdGlvbiYmKG0ucm90YXRpb249Yi5yb3RhdGlvbik7MSE9PWIubGluZXdpZHRoJiYobS5saW5ld2lkdGg9Yi5saW5ld2lkdGgpO3ZvaWQgMCE9PWIuZGFzaFNpemUmJihtLmRhc2hTaXplPWIuZGFzaFNpemUpO3ZvaWQgMCE9PWIuZ2FwU2l6ZSYmKG0uZ2FwU2l6ZT1iLmdhcFNpemUpO3ZvaWQgMCE9PWIuc2NhbGUmJihtLnNjYWxlPWIuc2NhbGUpO3ZvaWQgMCE9PWIucG9seWdvbk9mZnNldCYmKG0ucG9seWdvbk9mZnNldD1iLnBvbHlnb25PZmZzZXQpO3ZvaWQgMCE9PWIucG9seWdvbk9mZnNldEZhY3RvciYmKG0ucG9seWdvbk9mZnNldEZhY3Rvcj1iLnBvbHlnb25PZmZzZXRGYWN0b3IpOwp2b2lkIDAhPT1iLnBvbHlnb25PZmZzZXRVbml0cyYmKG0ucG9seWdvbk9mZnNldFVuaXRzPWIucG9seWdvbk9mZnNldFVuaXRzKTt2b2lkIDAhPT1iLnNraW5uaW5nJiYobS5za2lubmluZz1iLnNraW5uaW5nKTt2b2lkIDAhPT1iLm1vcnBoVGFyZ2V0cyYmKG0ubW9ycGhUYXJnZXRzPWIubW9ycGhUYXJnZXRzKTt2b2lkIDAhPT1iLm1vcnBoTm9ybWFscyYmKG0ubW9ycGhOb3JtYWxzPWIubW9ycGhOb3JtYWxzKTt2b2lkIDAhPT1iLmRpdGhlcmluZyYmKG0uZGl0aGVyaW5nPWIuZGl0aGVyaW5nKTt2b2lkIDAhPT1iLnZpc2libGUmJihtLnZpc2libGU9Yi52aXNpYmxlKTt2b2lkIDAhPT1iLnRvbmVNYXBwZWQmJihtLnRvbmVNYXBwZWQ9Yi50b25lTWFwcGVkKTt2b2lkIDAhPT1iLnVzZXJEYXRhJiYobS51c2VyRGF0YT1iLnVzZXJEYXRhKTtpZih2b2lkIDAhPT1iLnVuaWZvcm1zKWZvcih2YXIgdSBpbiBiLnVuaWZvcm1zKXt2YXIgdz1iLnVuaWZvcm1zW3VdO20udW5pZm9ybXNbdV09Cnt9O3N3aXRjaCh3LnR5cGUpe2Nhc2UgInQiOm0udW5pZm9ybXNbdV0udmFsdWU9ZSh3LnZhbHVlKTticmVhaztjYXNlICJjIjptLnVuaWZvcm1zW3VdLnZhbHVlPShuZXcgSSkuc2V0SGV4KHcudmFsdWUpO2JyZWFrO2Nhc2UgInYyIjptLnVuaWZvcm1zW3VdLnZhbHVlPShuZXcgZCkuZnJvbUFycmF5KHcudmFsdWUpO2JyZWFrO2Nhc2UgInYzIjptLnVuaWZvcm1zW3VdLnZhbHVlPShuZXcgZykuZnJvbUFycmF5KHcudmFsdWUpO2JyZWFrO2Nhc2UgInY0IjptLnVuaWZvcm1zW3VdLnZhbHVlPShuZXcgbikuZnJvbUFycmF5KHcudmFsdWUpO2JyZWFrO2Nhc2UgIm0zIjptLnVuaWZvcm1zW3VdLnZhbHVlPShuZXcgbCkuZnJvbUFycmF5KHcudmFsdWUpO2Nhc2UgIm00IjptLnVuaWZvcm1zW3VdLnZhbHVlPShuZXcgcikuZnJvbUFycmF5KHcudmFsdWUpO2JyZWFrO2RlZmF1bHQ6bS51bmlmb3Jtc1t1XS52YWx1ZT13LnZhbHVlfX12b2lkIDAhPT1iLmRlZmluZXMmJihtLmRlZmluZXM9Yi5kZWZpbmVzKTsKdm9pZCAwIT09Yi52ZXJ0ZXhTaGFkZXImJihtLnZlcnRleFNoYWRlcj1iLnZlcnRleFNoYWRlcik7dm9pZCAwIT09Yi5mcmFnbWVudFNoYWRlciYmKG0uZnJhZ21lbnRTaGFkZXI9Yi5mcmFnbWVudFNoYWRlcik7aWYodm9pZCAwIT09Yi5leHRlbnNpb25zKWZvcih2YXIgQSBpbiBiLmV4dGVuc2lvbnMpbS5leHRlbnNpb25zW0FdPWIuZXh0ZW5zaW9uc1tBXTt2b2lkIDAhPT1iLnNoYWRpbmcmJihtLmZsYXRTaGFkaW5nPTE9PT1iLnNoYWRpbmcpO3ZvaWQgMCE9PWIuc2l6ZSYmKG0uc2l6ZT1iLnNpemUpO3ZvaWQgMCE9PWIuc2l6ZUF0dGVudWF0aW9uJiYobS5zaXplQXR0ZW51YXRpb249Yi5zaXplQXR0ZW51YXRpb24pO3ZvaWQgMCE9PWIubWFwJiYobS5tYXA9ZShiLm1hcCkpO3ZvaWQgMCE9PWIubWF0Y2FwJiYobS5tYXRjYXA9ZShiLm1hdGNhcCkpO3ZvaWQgMCE9PWIuYWxwaGFNYXAmJihtLmFscGhhTWFwPWUoYi5hbHBoYU1hcCksbS50cmFuc3BhcmVudD0hMCk7dm9pZCAwIT09CmIuYnVtcE1hcCYmKG0uYnVtcE1hcD1lKGIuYnVtcE1hcCkpO3ZvaWQgMCE9PWIuYnVtcFNjYWxlJiYobS5idW1wU2NhbGU9Yi5idW1wU2NhbGUpO3ZvaWQgMCE9PWIubm9ybWFsTWFwJiYobS5ub3JtYWxNYXA9ZShiLm5vcm1hbE1hcCkpO3ZvaWQgMCE9PWIubm9ybWFsTWFwVHlwZSYmKG0ubm9ybWFsTWFwVHlwZT1iLm5vcm1hbE1hcFR5cGUpO3ZvaWQgMCE9PWIubm9ybWFsU2NhbGUmJih1PWIubm9ybWFsU2NhbGUsITE9PT1BcnJheS5pc0FycmF5KHUpJiYodT1bdSx1XSksbS5ub3JtYWxTY2FsZT0obmV3IGQpLmZyb21BcnJheSh1KSk7dm9pZCAwIT09Yi5kaXNwbGFjZW1lbnRNYXAmJihtLmRpc3BsYWNlbWVudE1hcD1lKGIuZGlzcGxhY2VtZW50TWFwKSk7dm9pZCAwIT09Yi5kaXNwbGFjZW1lbnRTY2FsZSYmKG0uZGlzcGxhY2VtZW50U2NhbGU9Yi5kaXNwbGFjZW1lbnRTY2FsZSk7dm9pZCAwIT09Yi5kaXNwbGFjZW1lbnRCaWFzJiYobS5kaXNwbGFjZW1lbnRCaWFzPWIuZGlzcGxhY2VtZW50Qmlhcyk7CnZvaWQgMCE9PWIucm91Z2huZXNzTWFwJiYobS5yb3VnaG5lc3NNYXA9ZShiLnJvdWdobmVzc01hcCkpO3ZvaWQgMCE9PWIubWV0YWxuZXNzTWFwJiYobS5tZXRhbG5lc3NNYXA9ZShiLm1ldGFsbmVzc01hcCkpO3ZvaWQgMCE9PWIuZW1pc3NpdmVNYXAmJihtLmVtaXNzaXZlTWFwPWUoYi5lbWlzc2l2ZU1hcCkpO3ZvaWQgMCE9PWIuZW1pc3NpdmVJbnRlbnNpdHkmJihtLmVtaXNzaXZlSW50ZW5zaXR5PWIuZW1pc3NpdmVJbnRlbnNpdHkpO3ZvaWQgMCE9PWIuc3BlY3VsYXJNYXAmJihtLnNwZWN1bGFyTWFwPWUoYi5zcGVjdWxhck1hcCkpO3ZvaWQgMCE9PWIuZW52TWFwJiYobS5lbnZNYXA9ZShiLmVudk1hcCkpO3ZvaWQgMCE9PWIuZW52TWFwSW50ZW5zaXR5JiYobS5lbnZNYXBJbnRlbnNpdHk9Yi5lbnZNYXBJbnRlbnNpdHkpO3ZvaWQgMCE9PWIucmVmbGVjdGl2aXR5JiYobS5yZWZsZWN0aXZpdHk9Yi5yZWZsZWN0aXZpdHkpO3ZvaWQgMCE9PWIucmVmcmFjdGlvblJhdGlvJiYobS5yZWZyYWN0aW9uUmF0aW89CmIucmVmcmFjdGlvblJhdGlvKTt2b2lkIDAhPT1iLmxpZ2h0TWFwJiYobS5saWdodE1hcD1lKGIubGlnaHRNYXApKTt2b2lkIDAhPT1iLmxpZ2h0TWFwSW50ZW5zaXR5JiYobS5saWdodE1hcEludGVuc2l0eT1iLmxpZ2h0TWFwSW50ZW5zaXR5KTt2b2lkIDAhPT1iLmFvTWFwJiYobS5hb01hcD1lKGIuYW9NYXApKTt2b2lkIDAhPT1iLmFvTWFwSW50ZW5zaXR5JiYobS5hb01hcEludGVuc2l0eT1iLmFvTWFwSW50ZW5zaXR5KTt2b2lkIDAhPT1iLmdyYWRpZW50TWFwJiYobS5ncmFkaWVudE1hcD1lKGIuZ3JhZGllbnRNYXApKTt2b2lkIDAhPT1iLmNsZWFyY29hdE5vcm1hbE1hcCYmKG0uY2xlYXJjb2F0Tm9ybWFsTWFwPWUoYi5jbGVhcmNvYXROb3JtYWxNYXApKTt2b2lkIDAhPT1iLmNsZWFyY29hdE5vcm1hbFNjYWxlJiYobS5jbGVhcmNvYXROb3JtYWxTY2FsZT0obmV3IGQpLmZyb21BcnJheShiLmNsZWFyY29hdE5vcm1hbFNjYWxlKSk7cmV0dXJuIG19LHNldFRleHR1cmVzOmZ1bmN0aW9uKGIpe3RoaXMudGV4dHVyZXM9CmI7cmV0dXJuIHRoaXN9fSk7dmFyIHNsPXtkZWNvZGVUZXh0OmZ1bmN0aW9uKGIpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIFRleHREZWNvZGVyKXJldHVybihuZXcgVGV4dERlY29kZXIpLmRlY29kZShiKTtmb3IodmFyIGU9IiIsaD0wLG09Yi5sZW5ndGg7aDxtO2grKyllKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGJbaF0pO3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShlKSl9Y2F0Y2godSl7cmV0dXJuIGV9fSxleHRyYWN0VXJsQmFzZTpmdW5jdGlvbihiKXt2YXIgZT1iLmxhc3RJbmRleE9mKCIvIik7cmV0dXJuLTE9PT1lPyIuLyI6Yi5zdWJzdHIoMCxlKzEpfX07VGkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh4YS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpUaSxpc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5OiEwLGNvcHk6ZnVuY3Rpb24oYil7eGEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3RoaXMubWF4SW5zdGFuY2VkQ291bnQ9CmIubWF4SW5zdGFuY2VkQ291bnQ7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYj14YS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7Yi5tYXhJbnN0YW5jZWRDb3VudD10aGlzLm1heEluc3RhbmNlZENvdW50O2IuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT0hMDtyZXR1cm4gYn19KTtVaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VWksaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6ITAsY29weTpmdW5jdGlvbihiKXtSLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9Yi5tZXNoUGVyQXR0cmlidXRlO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYj1SLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtiLm1lc2hQZXJBdHRyaWJ1dGU9CnRoaXMubWVzaFBlckF0dHJpYnV0ZTtiLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlPSEwO3JldHVybiBifX0pO1ZpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoS2IucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VmksbG9hZDpmdW5jdGlvbihiLGUsaCxtKXt2YXIgdT10aGlzLHc9bmV3IFNjKHUubWFuYWdlcik7dy5zZXRQYXRoKHUucGF0aCk7dy5sb2FkKGIsZnVuY3Rpb24oQSl7ZSh1LnBhcnNlKEpTT04ucGFyc2UoQSkpKX0saCxtKX0scGFyc2U6ZnVuY3Rpb24oYil7dmFyIGU9Yi5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5P25ldyBUaTpuZXcgeGEsaD1iLmRhdGEuaW5kZXg7aWYodm9pZCAwIT09aCl7dmFyIG09bmV3IHRsW2gudHlwZV0oaC5hcnJheSk7ZS5zZXRJbmRleChuZXcgUihtLDEpKX1oPWIuZGF0YS5hdHRyaWJ1dGVzO2Zvcih2YXIgdSBpbiBoKXt2YXIgdz1oW3VdO209bmV3IHRsW3cudHlwZV0ody5hcnJheSk7bT1uZXcgKHcuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU/ClVpOlIpKG0sdy5pdGVtU2l6ZSx3Lm5vcm1hbGl6ZWQpO3ZvaWQgMCE9PXcubmFtZSYmKG0ubmFtZT13Lm5hbWUpO2UuYWRkQXR0cmlidXRlKHUsbSl9dmFyIEE9Yi5kYXRhLm1vcnBoQXR0cmlidXRlcztpZihBKWZvcih1IGluIEEpe3ZhciBFPUFbdV0sRz1bXTtoPTA7Zm9yKHZhciBKPUUubGVuZ3RoO2g8SjtoKyspdz1FW2hdLG09bmV3IHRsW3cudHlwZV0ody5hcnJheSksbT1uZXcgUihtLHcuaXRlbVNpemUsdy5ub3JtYWxpemVkKSx2b2lkIDAhPT13Lm5hbWUmJihtLm5hbWU9dy5uYW1lKSxHLnB1c2gobSk7ZS5tb3JwaEF0dHJpYnV0ZXNbdV09R311PWIuZGF0YS5ncm91cHN8fGIuZGF0YS5kcmF3Y2FsbHN8fGIuZGF0YS5vZmZzZXRzO2lmKHZvaWQgMCE9PXUpZm9yKGg9MCx3PXUubGVuZ3RoO2ghPT13OysraCltPXVbaF0sZS5hZGRHcm91cChtLnN0YXJ0LG0uY291bnQsbS5tYXRlcmlhbEluZGV4KTtoPWIuZGF0YS5ib3VuZGluZ1NwaGVyZTt2b2lkIDAhPT1oJiYodT1uZXcgZywKdm9pZCAwIT09aC5jZW50ZXImJnUuZnJvbUFycmF5KGguY2VudGVyKSxlLmJvdW5kaW5nU3BoZXJlPW5ldyBGKHUsaC5yYWRpdXMpKTtiLm5hbWUmJihlLm5hbWU9Yi5uYW1lKTtiLnVzZXJEYXRhJiYoZS51c2VyRGF0YT1iLnVzZXJEYXRhKTtyZXR1cm4gZX19KTt2YXIgdGw9e0ludDhBcnJheSxVaW50OEFycmF5LFVpbnQ4Q2xhbXBlZEFycmF5OiJ1bmRlZmluZWQiIT09dHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5P1VpbnQ4Q2xhbXBlZEFycmF5OlVpbnQ4QXJyYXksSW50MTZBcnJheSxVaW50MTZBcnJheSxJbnQzMkFycmF5LFVpbnQzMkFycmF5LEZsb2F0MzJBcnJheSxGbG9hdDY0QXJyYXl9O1dpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoS2IucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6V2ksbG9hZDpmdW5jdGlvbihiLGUsaCxtKXt2YXIgdT10aGlzLHc9IiI9PT10aGlzLnBhdGg/c2wuZXh0cmFjdFVybEJhc2UoYik6dGhpcy5wYXRoO3RoaXMucmVzb3VyY2VQYXRoPQp0aGlzLnJlc291cmNlUGF0aHx8dzt3PW5ldyBTYyh1Lm1hbmFnZXIpO3cuc2V0UGF0aCh0aGlzLnBhdGgpO3cubG9hZChiLGZ1bmN0aW9uKEEpe3ZhciBFPW51bGw7dHJ5e0U9SlNPTi5wYXJzZShBKX1jYXRjaChHKXt2b2lkIDAhPT1tJiZtKEcpO2NvbnNvbGUuZXJyb3IoIlRIUkVFOk9iamVjdExvYWRlcjogQ2FuJ3QgcGFyc2UgIitiKyIuIixHLm1lc3NhZ2UpO3JldHVybn1BPUUubWV0YWRhdGE7dm9pZCAwPT09QXx8dm9pZCAwPT09QS50eXBlfHwiZ2VvbWV0cnkiPT09QS50eXBlLnRvTG93ZXJDYXNlKCk/Y29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0TG9hZGVyOiBDYW4ndCBsb2FkICIrYik6dS5wYXJzZShFLGUpfSxoLG0pfSxwYXJzZTpmdW5jdGlvbihiLGUpe3ZhciBoPXRoaXMucGFyc2VTaGFwZShiLnNoYXBlcyk7aD10aGlzLnBhcnNlR2VvbWV0cmllcyhiLmdlb21ldHJpZXMsaCk7dmFyIG09dGhpcy5wYXJzZUltYWdlcyhiLmltYWdlcyxmdW5jdGlvbigpe3ZvaWQgMCE9PQplJiZlKHUpfSk7bT10aGlzLnBhcnNlVGV4dHVyZXMoYi50ZXh0dXJlcyxtKTttPXRoaXMucGFyc2VNYXRlcmlhbHMoYi5tYXRlcmlhbHMsbSk7dmFyIHU9dGhpcy5wYXJzZU9iamVjdChiLm9iamVjdCxoLG0pO2IuYW5pbWF0aW9ucyYmKHUuYW5pbWF0aW9ucz10aGlzLnBhcnNlQW5pbWF0aW9ucyhiLmFuaW1hdGlvbnMpKTt2b2lkIDAhPT1iLmltYWdlcyYmMCE9PWIuaW1hZ2VzLmxlbmd0aHx8dm9pZCAwPT09ZXx8ZSh1KTtyZXR1cm4gdX0scGFyc2VTaGFwZTpmdW5jdGlvbihiKXt2YXIgZT17fTtpZih2b2lkIDAhPT1iKWZvcih2YXIgaD0wLG09Yi5sZW5ndGg7aDxtO2grKyl7dmFyIHU9KG5ldyB0ZSkuZnJvbUpTT04oYltoXSk7ZVt1LnV1aWRdPXV9cmV0dXJuIGV9LHBhcnNlR2VvbWV0cmllczpmdW5jdGlvbihiLGUpe3ZhciBoPXt9O2lmKHZvaWQgMCE9PWIpZm9yKHZhciBtPW5ldyBWaSx1PTAsdz1iLmxlbmd0aDt1PHc7dSsrKXt2YXIgQT1iW3VdO3N3aXRjaChBLnR5cGUpe2Nhc2UgIlBsYW5lR2VvbWV0cnkiOmNhc2UgIlBsYW5lQnVmZmVyR2VvbWV0cnkiOnZhciBFPQpuZXcgQ2NbQS50eXBlXShBLndpZHRoLEEuaGVpZ2h0LEEud2lkdGhTZWdtZW50cyxBLmhlaWdodFNlZ21lbnRzKTticmVhaztjYXNlICJCb3hHZW9tZXRyeSI6Y2FzZSAiQm94QnVmZmVyR2VvbWV0cnkiOmNhc2UgIkN1YmVHZW9tZXRyeSI6RT1uZXcgQ2NbQS50eXBlXShBLndpZHRoLEEuaGVpZ2h0LEEuZGVwdGgsQS53aWR0aFNlZ21lbnRzLEEuaGVpZ2h0U2VnbWVudHMsQS5kZXB0aFNlZ21lbnRzKTticmVhaztjYXNlICJDaXJjbGVHZW9tZXRyeSI6Y2FzZSAiQ2lyY2xlQnVmZmVyR2VvbWV0cnkiOkU9bmV3IENjW0EudHlwZV0oQS5yYWRpdXMsQS5zZWdtZW50cyxBLnRoZXRhU3RhcnQsQS50aGV0YUxlbmd0aCk7YnJlYWs7Y2FzZSAiQ3lsaW5kZXJHZW9tZXRyeSI6Y2FzZSAiQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSI6RT1uZXcgQ2NbQS50eXBlXShBLnJhZGl1c1RvcCxBLnJhZGl1c0JvdHRvbSxBLmhlaWdodCxBLnJhZGlhbFNlZ21lbnRzLEEuaGVpZ2h0U2VnbWVudHMsQS5vcGVuRW5kZWQsCkEudGhldGFTdGFydCxBLnRoZXRhTGVuZ3RoKTticmVhaztjYXNlICJDb25lR2VvbWV0cnkiOmNhc2UgIkNvbmVCdWZmZXJHZW9tZXRyeSI6RT1uZXcgQ2NbQS50eXBlXShBLnJhZGl1cyxBLmhlaWdodCxBLnJhZGlhbFNlZ21lbnRzLEEuaGVpZ2h0U2VnbWVudHMsQS5vcGVuRW5kZWQsQS50aGV0YVN0YXJ0LEEudGhldGFMZW5ndGgpO2JyZWFrO2Nhc2UgIlNwaGVyZUdlb21ldHJ5IjpjYXNlICJTcGhlcmVCdWZmZXJHZW9tZXRyeSI6RT1uZXcgQ2NbQS50eXBlXShBLnJhZGl1cyxBLndpZHRoU2VnbWVudHMsQS5oZWlnaHRTZWdtZW50cyxBLnBoaVN0YXJ0LEEucGhpTGVuZ3RoLEEudGhldGFTdGFydCxBLnRoZXRhTGVuZ3RoKTticmVhaztjYXNlICJEb2RlY2FoZWRyb25HZW9tZXRyeSI6Y2FzZSAiRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkiOmNhc2UgIkljb3NhaGVkcm9uR2VvbWV0cnkiOmNhc2UgIkljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkiOmNhc2UgIk9jdGFoZWRyb25HZW9tZXRyeSI6Y2FzZSAiT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5IjpjYXNlICJUZXRyYWhlZHJvbkdlb21ldHJ5IjpjYXNlICJUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IjpFPQpuZXcgQ2NbQS50eXBlXShBLnJhZGl1cyxBLmRldGFpbCk7YnJlYWs7Y2FzZSAiUmluZ0dlb21ldHJ5IjpjYXNlICJSaW5nQnVmZmVyR2VvbWV0cnkiOkU9bmV3IENjW0EudHlwZV0oQS5pbm5lclJhZGl1cyxBLm91dGVyUmFkaXVzLEEudGhldGFTZWdtZW50cyxBLnBoaVNlZ21lbnRzLEEudGhldGFTdGFydCxBLnRoZXRhTGVuZ3RoKTticmVhaztjYXNlICJUb3J1c0dlb21ldHJ5IjpjYXNlICJUb3J1c0J1ZmZlckdlb21ldHJ5IjpFPW5ldyBDY1tBLnR5cGVdKEEucmFkaXVzLEEudHViZSxBLnJhZGlhbFNlZ21lbnRzLEEudHVidWxhclNlZ21lbnRzLEEuYXJjKTticmVhaztjYXNlICJUb3J1c0tub3RHZW9tZXRyeSI6Y2FzZSAiVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkiOkU9bmV3IENjW0EudHlwZV0oQS5yYWRpdXMsQS50dWJlLEEudHVidWxhclNlZ21lbnRzLEEucmFkaWFsU2VnbWVudHMsQS5wLEEucSk7YnJlYWs7Y2FzZSAiVHViZUdlb21ldHJ5IjpjYXNlICJUdWJlQnVmZmVyR2VvbWV0cnkiOkU9Cm5ldyBDY1tBLnR5cGVdKChuZXcgcmxbQS5wYXRoLnR5cGVdKS5mcm9tSlNPTihBLnBhdGgpLEEudHVidWxhclNlZ21lbnRzLEEucmFkaXVzLEEucmFkaWFsU2VnbWVudHMsQS5jbG9zZWQpO2JyZWFrO2Nhc2UgIkxhdGhlR2VvbWV0cnkiOmNhc2UgIkxhdGhlQnVmZmVyR2VvbWV0cnkiOkU9bmV3IENjW0EudHlwZV0oQS5wb2ludHMsQS5zZWdtZW50cyxBLnBoaVN0YXJ0LEEucGhpTGVuZ3RoKTticmVhaztjYXNlICJQb2x5aGVkcm9uR2VvbWV0cnkiOmNhc2UgIlBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSI6RT1uZXcgQ2NbQS50eXBlXShBLnZlcnRpY2VzLEEuaW5kaWNlcyxBLnJhZGl1cyxBLmRldGFpbHMpO2JyZWFrO2Nhc2UgIlNoYXBlR2VvbWV0cnkiOmNhc2UgIlNoYXBlQnVmZmVyR2VvbWV0cnkiOkU9W107Zm9yKHZhciBHPTAsSj1BLnNoYXBlcy5sZW5ndGg7RzxKO0crKyl7dmFyIFE9ZVtBLnNoYXBlc1tHXV07RS5wdXNoKFEpfUU9bmV3IENjW0EudHlwZV0oRSxBLmN1cnZlU2VnbWVudHMpOwpicmVhaztjYXNlICJFeHRydWRlR2VvbWV0cnkiOmNhc2UgIkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSI6RT1bXTtHPTA7Zm9yKEo9QS5zaGFwZXMubGVuZ3RoO0c8SjtHKyspUT1lW0Euc2hhcGVzW0ddXSxFLnB1c2goUSk7Rz1BLm9wdGlvbnMuZXh0cnVkZVBhdGg7dm9pZCAwIT09RyYmKEEub3B0aW9ucy5leHRydWRlUGF0aD0obmV3IHJsW0cudHlwZV0pLmZyb21KU09OKEcpKTtFPW5ldyBDY1tBLnR5cGVdKEUsQS5vcHRpb25zKTticmVhaztjYXNlICJCdWZmZXJHZW9tZXRyeSI6Y2FzZSAiSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkiOkU9bS5wYXJzZShBKTticmVhaztjYXNlICJHZW9tZXRyeSI6IlRIUkVFImluIHdpbmRvdyYmIkxlZ2FjeUpTT05Mb2FkZXIiaW4gVEhSRUU/RT0obmV3IFRIUkVFLkxlZ2FjeUpTT05Mb2FkZXIpLnBhcnNlKEEsdGhpcy5yZXNvdXJjZVBhdGgpLmdlb21ldHJ5OmNvbnNvbGUuZXJyb3IoJ1RIUkVFLk9iamVjdExvYWRlcjogWW91IGhhdmUgdG8gaW1wb3J0IExlZ2FjeUpTT05Mb2FkZXIgaW4gb3JkZXIgbG9hZCBnZW9tZXRyeSBkYXRhIG9mIHR5cGUgIkdlb21ldHJ5Ii4nKTsKYnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oJ1RIUkVFLk9iamVjdExvYWRlcjogVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZSAiJytBLnR5cGUrJyInKTtjb250aW51ZX1FLnV1aWQ9QS51dWlkO3ZvaWQgMCE9PUEubmFtZSYmKEUubmFtZT1BLm5hbWUpOyEwPT09RS5pc0J1ZmZlckdlb21ldHJ5JiZ2b2lkIDAhPT1BLnVzZXJEYXRhJiYoRS51c2VyRGF0YT1BLnVzZXJEYXRhKTtoW0EudXVpZF09RX1yZXR1cm4gaH0scGFyc2VNYXRlcmlhbHM6ZnVuY3Rpb24oYixlKXt2YXIgaD17fSxtPXt9O2lmKHZvaWQgMCE9PWIpe3ZhciB1PW5ldyBTaTt1LnNldFRleHR1cmVzKGUpO2U9MDtmb3IodmFyIHc9Yi5sZW5ndGg7ZTx3O2UrKyl7dmFyIEE9YltlXTtpZigiTXVsdGlNYXRlcmlhbCI9PT1BLnR5cGUpe2Zvcih2YXIgRT1bXSxHPTA7RzxBLm1hdGVyaWFscy5sZW5ndGg7RysrKXt2YXIgSj1BLm1hdGVyaWFsc1tHXTt2b2lkIDA9PT1oW0oudXVpZF0mJihoW0oudXVpZF09dS5wYXJzZShKKSk7CkUucHVzaChoW0oudXVpZF0pfW1bQS51dWlkXT1FfWVsc2Ugdm9pZCAwPT09aFtBLnV1aWRdJiYoaFtBLnV1aWRdPXUucGFyc2UoQSkpLG1bQS51dWlkXT1oW0EudXVpZF19fXJldHVybiBtfSxwYXJzZUFuaW1hdGlvbnM6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPVtdLGg9MDtoPGIubGVuZ3RoO2grKyl7dmFyIG09YltoXSx1PVJjLnBhcnNlKG0pO3ZvaWQgMCE9PW0udXVpZCYmKHUudXVpZD1tLnV1aWQpO2UucHVzaCh1KX1yZXR1cm4gZX0scGFyc2VJbWFnZXM6ZnVuY3Rpb24oYixlKXtmdW5jdGlvbiBoKFQpe20ubWFuYWdlci5pdGVtU3RhcnQoVCk7cmV0dXJuIHcubG9hZChULGZ1bmN0aW9uKCl7bS5tYW5hZ2VyLml0ZW1FbmQoVCl9LHZvaWQgMCxmdW5jdGlvbigpe20ubWFuYWdlci5pdGVtRXJyb3IoVCk7bS5tYW5hZ2VyLml0ZW1FbmQoVCl9KX12YXIgbT10aGlzLHU9e307aWYodm9pZCAwIT09YiYmMDxiLmxlbmd0aCl7ZT1uZXcgRGsoZSk7dmFyIHc9bmV3IGVnKGUpO3cuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7CmU9MDtmb3IodmFyIEE9Yi5sZW5ndGg7ZTxBO2UrKyl7dmFyIEU9YltlXSxHPUUudXJsO2lmKEFycmF5LmlzQXJyYXkoRykpe3VbRS51dWlkXT1bXTtmb3IodmFyIEo9MCxRPUcubGVuZ3RoO0o8UTtKKyspe3ZhciBTPUdbSl07Uz0vXihcL1wvKXwoW2Etel0rOihcL1wvKT8pL2kudGVzdChTKT9TOm0ucmVzb3VyY2VQYXRoK1M7dVtFLnV1aWRdLnB1c2goaChTKSl9fWVsc2UgUz0vXihcL1wvKXwoW2Etel0rOihcL1wvKT8pL2kudGVzdChFLnVybCk/RS51cmw6bS5yZXNvdXJjZVBhdGgrRS51cmwsdVtFLnV1aWRdPWgoUyl9fXJldHVybiB1fSxwYXJzZVRleHR1cmVzOmZ1bmN0aW9uKGIsZSl7ZnVuY3Rpb24gaChHLEope2lmKCJudW1iZXIiPT09dHlwZW9mIEcpcmV0dXJuIEc7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VUZXh0dXJlOiBDb25zdGFudCBzaG91bGQgYmUgaW4gbnVtZXJpYyBmb3JtLiIsRyk7cmV0dXJuIEpbR119dmFyIG09e307aWYodm9pZCAwIT09CmIpZm9yKHZhciB1PTAsdz1iLmxlbmd0aDt1PHc7dSsrKXt2YXIgQT1iW3VdO3ZvaWQgMD09PUEuaW1hZ2UmJmNvbnNvbGUud2FybignVEhSRUUuT2JqZWN0TG9hZGVyOiBObyAiaW1hZ2UiIHNwZWNpZmllZCBmb3InLEEudXVpZCk7dm9pZCAwPT09ZVtBLmltYWdlXSYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBpbWFnZSIsQS5pbWFnZSk7dmFyIEU9QXJyYXkuaXNBcnJheShlW0EuaW1hZ2VdKT9uZXcgTWQoZVtBLmltYWdlXSk6bmV3IGsoZVtBLmltYWdlXSk7RS5uZWVkc1VwZGF0ZT0hMDtFLnV1aWQ9QS51dWlkO3ZvaWQgMCE9PUEubmFtZSYmKEUubmFtZT1BLm5hbWUpO3ZvaWQgMCE9PUEubWFwcGluZyYmKEUubWFwcGluZz1oKEEubWFwcGluZyxIcykpO3ZvaWQgMCE9PUEub2Zmc2V0JiZFLm9mZnNldC5mcm9tQXJyYXkoQS5vZmZzZXQpO3ZvaWQgMCE9PUEucmVwZWF0JiZFLnJlcGVhdC5mcm9tQXJyYXkoQS5yZXBlYXQpO3ZvaWQgMCE9PUEuY2VudGVyJiYKRS5jZW50ZXIuZnJvbUFycmF5KEEuY2VudGVyKTt2b2lkIDAhPT1BLnJvdGF0aW9uJiYoRS5yb3RhdGlvbj1BLnJvdGF0aW9uKTt2b2lkIDAhPT1BLndyYXAmJihFLndyYXBTPWgoQS53cmFwWzBdLEJvKSxFLndyYXBUPWgoQS53cmFwWzFdLEJvKSk7dm9pZCAwIT09QS5mb3JtYXQmJihFLmZvcm1hdD1BLmZvcm1hdCk7dm9pZCAwIT09QS50eXBlJiYoRS50eXBlPUEudHlwZSk7dm9pZCAwIT09QS5lbmNvZGluZyYmKEUuZW5jb2Rpbmc9QS5lbmNvZGluZyk7dm9pZCAwIT09QS5taW5GaWx0ZXImJihFLm1pbkZpbHRlcj1oKEEubWluRmlsdGVyLENvKSk7dm9pZCAwIT09QS5tYWdGaWx0ZXImJihFLm1hZ0ZpbHRlcj1oKEEubWFnRmlsdGVyLENvKSk7dm9pZCAwIT09QS5hbmlzb3Ryb3B5JiYoRS5hbmlzb3Ryb3B5PUEuYW5pc290cm9weSk7dm9pZCAwIT09QS5mbGlwWSYmKEUuZmxpcFk9QS5mbGlwWSk7dm9pZCAwIT09QS5wcmVtdWx0aXBseUFscGhhJiYoRS5wcmVtdWx0aXBseUFscGhhPQpBLnByZW11bHRpcGx5QWxwaGEpO3ZvaWQgMCE9PUEudW5wYWNrQWxpZ25tZW50JiYoRS51bnBhY2tBbGlnbm1lbnQ9QS51bnBhY2tBbGlnbm1lbnQpO21bQS51dWlkXT1FfXJldHVybiBtfSxwYXJzZU9iamVjdDpmdW5jdGlvbihiLGUsaCl7ZnVuY3Rpb24gbShKKXt2b2lkIDA9PT1lW0pdJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGdlb21ldHJ5IixKKTtyZXR1cm4gZVtKXX1mdW5jdGlvbiB1KEope2lmKHZvaWQgMCE9PUope2lmKEFycmF5LmlzQXJyYXkoSikpe2Zvcih2YXIgUT1bXSxTPTAsVD1KLmxlbmd0aDtTPFQ7UysrKXt2YXIgVz1KW1NdO3ZvaWQgMD09PWhbV10mJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwiLFcpO1EucHVzaChoW1ddKX1yZXR1cm4gUX12b2lkIDA9PT1oW0pdJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsIixKKTtyZXR1cm4gaFtKXX19CnN3aXRjaChiLnR5cGUpe2Nhc2UgIlNjZW5lIjp2YXIgdz1uZXcgejt2b2lkIDAhPT1iLmJhY2tncm91bmQmJk51bWJlci5pc0ludGVnZXIoYi5iYWNrZ3JvdW5kKSYmKHcuYmFja2dyb3VuZD1uZXcgSShiLmJhY2tncm91bmQpKTt2b2lkIDAhPT1iLmZvZyYmKCJGb2ciPT09Yi5mb2cudHlwZT93LmZvZz1uZXcgeGkoYi5mb2cuY29sb3IsYi5mb2cubmVhcixiLmZvZy5mYXIpOiJGb2dFeHAyIj09PWIuZm9nLnR5cGUmJih3LmZvZz1uZXcgd2koYi5mb2cuY29sb3IsYi5mb2cuZGVuc2l0eSkpKTticmVhaztjYXNlICJQZXJzcGVjdGl2ZUNhbWVyYSI6dz1uZXcgQWIoYi5mb3YsYi5hc3BlY3QsYi5uZWFyLGIuZmFyKTt2b2lkIDAhPT1iLmZvY3VzJiYody5mb2N1cz1iLmZvY3VzKTt2b2lkIDAhPT1iLnpvb20mJih3Lnpvb209Yi56b29tKTt2b2lkIDAhPT1iLmZpbG1HYXVnZSYmKHcuZmlsbUdhdWdlPWIuZmlsbUdhdWdlKTt2b2lkIDAhPT1iLmZpbG1PZmZzZXQmJih3LmZpbG1PZmZzZXQ9CmIuZmlsbU9mZnNldCk7dm9pZCAwIT09Yi52aWV3JiYody52aWV3PU9iamVjdC5hc3NpZ24oe30sYi52aWV3KSk7YnJlYWs7Y2FzZSAiT3J0aG9ncmFwaGljQ2FtZXJhIjp3PW5ldyBHaChiLmxlZnQsYi5yaWdodCxiLnRvcCxiLmJvdHRvbSxiLm5lYXIsYi5mYXIpO3ZvaWQgMCE9PWIuem9vbSYmKHcuem9vbT1iLnpvb20pO3ZvaWQgMCE9PWIudmlldyYmKHcudmlldz1PYmplY3QuYXNzaWduKHt9LGIudmlldykpO2JyZWFrO2Nhc2UgIkFtYmllbnRMaWdodCI6dz1uZXcgUWkoYi5jb2xvcixiLmludGVuc2l0eSk7YnJlYWs7Y2FzZSAiRGlyZWN0aW9uYWxMaWdodCI6dz1uZXcgUGkoYi5jb2xvcixiLmludGVuc2l0eSk7YnJlYWs7Y2FzZSAiUG9pbnRMaWdodCI6dz1uZXcgTmkoYi5jb2xvcixiLmludGVuc2l0eSxiLmRpc3RhbmNlLGIuZGVjYXkpO2JyZWFrO2Nhc2UgIlJlY3RBcmVhTGlnaHQiOnc9bmV3IFJpKGIuY29sb3IsYi5pbnRlbnNpdHksYi53aWR0aCxiLmhlaWdodCk7YnJlYWs7CmNhc2UgIlNwb3RMaWdodCI6dz1uZXcgTWkoYi5jb2xvcixiLmludGVuc2l0eSxiLmRpc3RhbmNlLGIuYW5nbGUsYi5wZW51bWJyYSxiLmRlY2F5KTticmVhaztjYXNlICJIZW1pc3BoZXJlTGlnaHQiOnc9bmV3IEtpKGIuY29sb3IsYi5ncm91bmRDb2xvcixiLmludGVuc2l0eSk7YnJlYWs7Y2FzZSAiU2tpbm5lZE1lc2giOmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyLnBhcnNlT2JqZWN0KCkgZG9lcyBub3Qgc3VwcG9ydCBTa2lubmVkTWVzaCB5ZXQuIik7Y2FzZSAiTWVzaCI6dz1tKGIuZ2VvbWV0cnkpO3ZhciBBPXUoYi5tYXRlcmlhbCk7dz13LmJvbmVzJiYwPHcuYm9uZXMubGVuZ3RoP25ldyBmaCh3LEEpOm5ldyB5YSh3LEEpO3ZvaWQgMCE9PWIuZHJhd01vZGUmJncuc2V0RHJhd01vZGUoYi5kcmF3TW9kZSk7YnJlYWs7Y2FzZSAiTE9EIjp3PW5ldyBlaDticmVhaztjYXNlICJMaW5lIjp3PW5ldyBtYyhtKGIuZ2VvbWV0cnkpLHUoYi5tYXRlcmlhbCksYi5tb2RlKTsKYnJlYWs7Y2FzZSAiTGluZUxvb3AiOnc9bmV3IEFpKG0oYi5nZW9tZXRyeSksdShiLm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSAiTGluZVNlZ21lbnRzIjp3PW5ldyBTYihtKGIuZ2VvbWV0cnkpLHUoYi5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UgIlBvaW50Q2xvdWQiOmNhc2UgIlBvaW50cyI6dz1uZXcgTmYobShiLmdlb21ldHJ5KSx1KGIubWF0ZXJpYWwpKTticmVhaztjYXNlICJTcHJpdGUiOnc9bmV3IGNoKHUoYi5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UgIkdyb3VwIjp3PW5ldyBGZjticmVhaztkZWZhdWx0Onc9bmV3IHl9dy51dWlkPWIudXVpZDt2b2lkIDAhPT1iLm5hbWUmJih3Lm5hbWU9Yi5uYW1lKTt2b2lkIDAhPT1iLm1hdHJpeD8ody5tYXRyaXguZnJvbUFycmF5KGIubWF0cml4KSx2b2lkIDAhPT1iLm1hdHJpeEF1dG9VcGRhdGUmJih3Lm1hdHJpeEF1dG9VcGRhdGU9Yi5tYXRyaXhBdXRvVXBkYXRlKSx3Lm1hdHJpeEF1dG9VcGRhdGUmJncubWF0cml4LmRlY29tcG9zZSh3LnBvc2l0aW9uLAp3LnF1YXRlcm5pb24sdy5zY2FsZSkpOih2b2lkIDAhPT1iLnBvc2l0aW9uJiZ3LnBvc2l0aW9uLmZyb21BcnJheShiLnBvc2l0aW9uKSx2b2lkIDAhPT1iLnJvdGF0aW9uJiZ3LnJvdGF0aW9uLmZyb21BcnJheShiLnJvdGF0aW9uKSx2b2lkIDAhPT1iLnF1YXRlcm5pb24mJncucXVhdGVybmlvbi5mcm9tQXJyYXkoYi5xdWF0ZXJuaW9uKSx2b2lkIDAhPT1iLnNjYWxlJiZ3LnNjYWxlLmZyb21BcnJheShiLnNjYWxlKSk7dm9pZCAwIT09Yi5jYXN0U2hhZG93JiYody5jYXN0U2hhZG93PWIuY2FzdFNoYWRvdyk7dm9pZCAwIT09Yi5yZWNlaXZlU2hhZG93JiYody5yZWNlaXZlU2hhZG93PWIucmVjZWl2ZVNoYWRvdyk7Yi5zaGFkb3cmJih2b2lkIDAhPT1iLnNoYWRvdy5iaWFzJiYody5zaGFkb3cuYmlhcz1iLnNoYWRvdy5iaWFzKSx2b2lkIDAhPT1iLnNoYWRvdy5yYWRpdXMmJih3LnNoYWRvdy5yYWRpdXM9Yi5zaGFkb3cucmFkaXVzKSx2b2lkIDAhPT1iLnNoYWRvdy5tYXBTaXplJiYKdy5zaGFkb3cubWFwU2l6ZS5mcm9tQXJyYXkoYi5zaGFkb3cubWFwU2l6ZSksdm9pZCAwIT09Yi5zaGFkb3cuY2FtZXJhJiYody5zaGFkb3cuY2FtZXJhPXRoaXMucGFyc2VPYmplY3QoYi5zaGFkb3cuY2FtZXJhKSkpO3ZvaWQgMCE9PWIudmlzaWJsZSYmKHcudmlzaWJsZT1iLnZpc2libGUpO3ZvaWQgMCE9PWIuZnJ1c3R1bUN1bGxlZCYmKHcuZnJ1c3R1bUN1bGxlZD1iLmZydXN0dW1DdWxsZWQpO3ZvaWQgMCE9PWIucmVuZGVyT3JkZXImJih3LnJlbmRlck9yZGVyPWIucmVuZGVyT3JkZXIpO3ZvaWQgMCE9PWIudXNlckRhdGEmJih3LnVzZXJEYXRhPWIudXNlckRhdGEpO3ZvaWQgMCE9PWIubGF5ZXJzJiYody5sYXllcnMubWFzaz1iLmxheWVycyk7aWYodm9pZCAwIT09Yi5jaGlsZHJlbil7QT1iLmNoaWxkcmVuO2Zvcih2YXIgRT0wO0U8QS5sZW5ndGg7RSsrKXcuYWRkKHRoaXMucGFyc2VPYmplY3QoQVtFXSxlLGgpKX1pZigiTE9EIj09PWIudHlwZSlmb3IoYj1iLmxldmVscyxBPQowO0E8Yi5sZW5ndGg7QSsrKXtFPWJbQV07dmFyIEc9dy5nZXRPYmplY3RCeVByb3BlcnR5KCJ1dWlkIixFLm9iamVjdCk7dm9pZCAwIT09RyYmdy5hZGRMZXZlbChHLEUuZGlzdGFuY2UpfXJldHVybiB3fX0pO3ZhciBIcz17VVZNYXBwaW5nOjMwMCxDdWJlUmVmbGVjdGlvbk1hcHBpbmc6MzAxLEN1YmVSZWZyYWN0aW9uTWFwcGluZzozMDIsRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc6MzAzLEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOjMwNCxTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZzozMDUsQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc6MzA2LEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOjMwN30sQm89e1JlcGVhdFdyYXBwaW5nOjFFMyxDbGFtcFRvRWRnZVdyYXBwaW5nOjEwMDEsTWlycm9yZWRSZXBlYXRXcmFwcGluZzoxMDAyfSxDbz17TmVhcmVzdEZpbHRlcjoxMDAzLE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyOjEwMDQsTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcjoxMDA1LApMaW5lYXJGaWx0ZXI6MTAwNixMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyOjEwMDcsTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyOjEwMDh9O0lrLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoS2IucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6SWssc2V0T3B0aW9uczpmdW5jdGlvbihiKXt0aGlzLm9wdGlvbnM9YjtyZXR1cm4gdGhpc30sbG9hZDpmdW5jdGlvbihiLGUsaCxtKXt2b2lkIDA9PT1iJiYoYj0iIik7dm9pZCAwIT09dGhpcy5wYXRoJiYoYj10aGlzLnBhdGgrYik7Yj10aGlzLm1hbmFnZXIucmVzb2x2ZVVSTChiKTt2YXIgdT10aGlzLHc9Z2YuZ2V0KGIpO2lmKHZvaWQgMCE9PXcpcmV0dXJuIHUubWFuYWdlci5pdGVtU3RhcnQoYiksc2V0VGltZW91dChmdW5jdGlvbigpe2UmJmUodyk7dS5tYW5hZ2VyLml0ZW1FbmQoYil9LDApLHc7ZmV0Y2goYikudGhlbihmdW5jdGlvbihBKXtyZXR1cm4gQS5ibG9iKCl9KS50aGVuKGZ1bmN0aW9uKEEpe3JldHVybiB2b2lkIDA9PT0KdS5vcHRpb25zP2NyZWF0ZUltYWdlQml0bWFwKEEpOmNyZWF0ZUltYWdlQml0bWFwKEEsdS5vcHRpb25zKX0pLnRoZW4oZnVuY3Rpb24oQSl7Z2YuYWRkKGIsQSk7ZSYmZShBKTt1Lm1hbmFnZXIuaXRlbUVuZChiKX0pLmNhdGNoKGZ1bmN0aW9uKEEpe20mJm0oQSk7dS5tYW5hZ2VyLml0ZW1FcnJvcihiKTt1Lm1hbmFnZXIuaXRlbUVuZChiKX0pO3UubWFuYWdlci5pdGVtU3RhcnQoYil9fSk7T2JqZWN0LmFzc2lnbihKay5wcm90b3R5cGUse21vdmVUbzpmdW5jdGlvbihiLGUpe3RoaXMuY3VycmVudFBhdGg9bmV3IGlkO3RoaXMuc3ViUGF0aHMucHVzaCh0aGlzLmN1cnJlbnRQYXRoKTt0aGlzLmN1cnJlbnRQYXRoLm1vdmVUbyhiLGUpfSxsaW5lVG86ZnVuY3Rpb24oYixlKXt0aGlzLmN1cnJlbnRQYXRoLmxpbmVUbyhiLGUpfSxxdWFkcmF0aWNDdXJ2ZVRvOmZ1bmN0aW9uKGIsZSxoLG0pe3RoaXMuY3VycmVudFBhdGgucXVhZHJhdGljQ3VydmVUbyhiLGUsaCxtKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbihiLAplLGgsbSx1LHcpe3RoaXMuY3VycmVudFBhdGguYmV6aWVyQ3VydmVUbyhiLGUsaCxtLHUsdyl9LHNwbGluZVRocnU6ZnVuY3Rpb24oYil7dGhpcy5jdXJyZW50UGF0aC5zcGxpbmVUaHJ1KGIpfSx0b1NoYXBlczpmdW5jdGlvbihiLGUpe2Z1bmN0aW9uIGgoaGEpe2Zvcih2YXIgc2E9W10scWE9MCxyYT1oYS5sZW5ndGg7cWE8cmE7cWErKyl7dmFyIHdhPWhhW3FhXSxwYT1uZXcgdGU7cGEuY3VydmVzPXdhLmN1cnZlcztzYS5wdXNoKHBhKX1yZXR1cm4gc2F9ZnVuY3Rpb24gbShoYSxzYSl7Zm9yKHZhciBxYT1zYS5sZW5ndGgscmE9ITEsd2E9cWEtMSxwYT0wO3BhPHFhO3dhPXBhKyspe3ZhciB2YT1zYVt3YV0sQ2E9c2FbcGFdLFZhPUNhLngtdmEueCxXYT1DYS55LXZhLnk7aWYoTWF0aC5hYnMoV2EpPk51bWJlci5FUFNJTE9OKXtpZigwPldhJiYodmE9c2FbcGFdLFZhPS1WYSxDYT1zYVt3YV0sV2E9LVdhKSwhKGhhLnk8dmEueXx8aGEueT5DYS55KSlpZihoYS55PT09dmEueSl7aWYoaGEueD09PQp2YS54KXJldHVybiEwfWVsc2V7d2E9V2EqKGhhLngtdmEueCktVmEqKGhhLnktdmEueSk7aWYoMD09PXdhKXJldHVybiEwOzA+d2F8fChyYT0hcmEpfX1lbHNlIGlmKGhhLnk9PT12YS55JiYoQ2EueDw9aGEueCYmaGEueDw9dmEueHx8dmEueDw9aGEueCYmaGEueDw9Q2EueCkpcmV0dXJuITB9cmV0dXJuIHJhfXZhciB1PU9kLmlzQ2xvY2tXaXNlLHc9dGhpcy5zdWJQYXRocztpZigwPT09dy5sZW5ndGgpcmV0dXJuW107aWYoITA9PT1lKXJldHVybiBoKHcpO2U9W107aWYoMT09PXcubGVuZ3RoKXt2YXIgQT13WzBdO3ZhciBFPW5ldyB0ZTtFLmN1cnZlcz1BLmN1cnZlcztlLnB1c2goRSk7cmV0dXJuIGV9dmFyIEc9IXUod1swXS5nZXRQb2ludHMoKSk7Rz1iPyFHOkc7RT1bXTt2YXIgSj1bXSxRPVtdLFM9MDtKW1NdPXZvaWQgMDtRW1NdPVtdO2Zvcih2YXIgVD0wLFc9dy5sZW5ndGg7VDxXO1QrKyl7QT13W1RdO3ZhciBYPUEuZ2V0UG9pbnRzKCk7dmFyIGlhPXUoWCk7KGlhPWI/IWlhOgppYSk/KCFHJiZKW1NdJiZTKyssSltTXT17czpuZXcgdGUscDpYfSxKW1NdLnMuY3VydmVzPUEuY3VydmVzLEcmJlMrKyxRW1NdPVtdKTpRW1NdLnB1c2goe2g6QSxwOlhbMF19KX1pZighSlswXSlyZXR1cm4gaCh3KTtpZigxPEoubGVuZ3RoKXtUPSExO2I9W107dT0wO2Zvcih3PUoubGVuZ3RoO3U8dzt1KyspRVt1XT1bXTt1PTA7Zm9yKHc9Si5sZW5ndGg7dTx3O3UrKylmb3IoQT1RW3VdLGlhPTA7aWE8QS5sZW5ndGg7aWErKyl7Rz1BW2lhXTtTPSEwO2ZvcihYPTA7WDxKLmxlbmd0aDtYKyspbShHLnAsSltYXS5wKSYmKHUhPT1YJiZiLnB1c2goe2Zyb21zOnUsdG9zOlgsaG9sZTppYX0pLFM/KFM9ITEsRVtYXS5wdXNoKEcpKTpUPSEwKTtTJiZFW3VdLnB1c2goRyl9MDxiLmxlbmd0aCYmKFR8fChRPUUpKX1UPTA7Zm9yKHU9Si5sZW5ndGg7VDx1O1QrKylmb3IoRT1KW1RdLnMsZS5wdXNoKEUpLGI9UVtUXSx3PTAsQT1iLmxlbmd0aDt3PEE7dysrKUUuaG9sZXMucHVzaChiW3ddLmgpOwpyZXR1cm4gZX19KTtPYmplY3QuYXNzaWduKEtrLnByb3RvdHlwZSx7aXNGb250OiEwLGdlbmVyYXRlU2hhcGVzOmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGU9MTAwKTt2YXIgaD1bXTtiPXJzKGIsZSx0aGlzLmRhdGEpO2U9MDtmb3IodmFyIG09Yi5sZW5ndGg7ZTxtO2UrKylBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShoLGJbZV0udG9TaGFwZXMoKSk7cmV0dXJuIGh9fSk7TGsucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShLYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpMayxsb2FkOmZ1bmN0aW9uKGIsZSxoLG0pe3ZhciB1PXRoaXMsdz1uZXcgU2ModGhpcy5tYW5hZ2VyKTt3LnNldFBhdGgodGhpcy5wYXRoKTt3LmxvYWQoYixmdW5jdGlvbihBKXt0cnl7dmFyIEU9SlNPTi5wYXJzZShBKX1jYXRjaChHKXtjb25zb2xlLndhcm4oIlRIUkVFLkZvbnRMb2FkZXI6IHR5cGVmYWNlLmpzIHN1cHBvcnQgaXMgYmVpbmcgZGVwcmVjYXRlZC4gVXNlIHR5cGVmYWNlLmpzb24gaW5zdGVhZC4iKSwKRT1KU09OLnBhcnNlKEEuc3Vic3RyaW5nKDY1LEEubGVuZ3RoLTIpKX1BPXUucGFyc2UoRSk7ZSYmZShBKX0saCxtKX0scGFyc2U6ZnVuY3Rpb24oYil7cmV0dXJuIG5ldyBLayhiKX19KTt2YXIgdmosUWs9e2dldENvbnRleHQ6ZnVuY3Rpb24oKXt2b2lkIDA9PT12aiYmKHZqPW5ldyAod2luZG93LkF1ZGlvQ29udGV4dHx8d2luZG93LndlYmtpdEF1ZGlvQ29udGV4dCkpO3JldHVybiB2an0sc2V0Q29udGV4dDpmdW5jdGlvbihiKXt2aj1ifX07WGkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShLYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpYaSxsb2FkOmZ1bmN0aW9uKGIsZSxoLG0pe3ZhciB1PW5ldyBTYyh0aGlzLm1hbmFnZXIpO3Uuc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpO3Uuc2V0UGF0aCh0aGlzLnBhdGgpO3UubG9hZChiLGZ1bmN0aW9uKHcpe3c9dy5zbGljZSgwKTtRay5nZXRDb250ZXh0KCkuZGVjb2RlQXVkaW9EYXRhKHcsZnVuY3Rpb24oQSl7ZShBKX0pfSwKaCxtKX19KTtPYmplY3QuYXNzaWduKFlpLnByb3RvdHlwZSx7aXNTcGhlcmljYWxIYXJtb25pY3MzOiEwLHNldDpmdW5jdGlvbihiKXtmb3IodmFyIGU9MDs5PmU7ZSsrKXRoaXMuY29lZmZpY2llbnRzW2VdLmNvcHkoYltlXSk7cmV0dXJuIHRoaXN9LHplcm86ZnVuY3Rpb24oKXtmb3IodmFyIGI9MDs5PmI7YisrKXRoaXMuY29lZmZpY2llbnRzW2JdLnNldCgwLDAsMCk7cmV0dXJuIHRoaXN9LGdldEF0OmZ1bmN0aW9uKGIsZSl7dmFyIGg9Yi54LG09Yi55O2I9Yi56O3ZhciB1PXRoaXMuY29lZmZpY2llbnRzO2UuY29weSh1WzBdKS5tdWx0aXBseVNjYWxhciguMjgyMDk1KTtlLmFkZFNjYWxlKHVbMV0sLjQ4ODYwMyptKTtlLmFkZFNjYWxlKHVbMl0sLjQ4ODYwMypiKTtlLmFkZFNjYWxlKHVbM10sLjQ4ODYwMypoKTtlLmFkZFNjYWxlKHVbNF0sMS4wOTI1NDgqaCptKTtlLmFkZFNjYWxlKHVbNV0sMS4wOTI1NDgqbSpiKTtlLmFkZFNjYWxlKHVbNl0sLjMxNTM5MiooMypiKmItMSkpOwplLmFkZFNjYWxlKHVbN10sMS4wOTI1NDgqaCpiKTtlLmFkZFNjYWxlKHVbOF0sLjU0NjI3NCooaCpoLW0qbSkpO3JldHVybiBlfSxnZXRJcnJhZGlhbmNlQXQ6ZnVuY3Rpb24oYixlKXt2YXIgaD1iLngsbT1iLnk7Yj1iLno7dmFyIHU9dGhpcy5jb2VmZmljaWVudHM7ZS5jb3B5KHVbMF0pLm11bHRpcGx5U2NhbGFyKC44ODYyMjcpO2UuYWRkU2NhbGUodVsxXSwxLjAyMzMyOCptKTtlLmFkZFNjYWxlKHVbMl0sMS4wMjMzMjgqYik7ZS5hZGRTY2FsZSh1WzNdLDEuMDIzMzI4KmgpO2UuYWRkU2NhbGUodVs0XSwuODU4MDg2KmgqbSk7ZS5hZGRTY2FsZSh1WzVdLC44NTgwODYqbSpiKTtlLmFkZFNjYWxlKHVbNl0sLjc0MzEyNSpiKmItLjI0NzcwOCk7ZS5hZGRTY2FsZSh1WzddLC44NTgwODYqaCpiKTtlLmFkZFNjYWxlKHVbOF0sLjQyOTA0MyooaCpoLW0qbSkpO3JldHVybiBlfSxhZGQ6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPTA7OT5lO2UrKyl0aGlzLmNvZWZmaWNpZW50c1tlXS5hZGQoYi5jb2VmZmljaWVudHNbZV0pOwpyZXR1cm4gdGhpc30sc2NhbGU6ZnVuY3Rpb24oYil7Zm9yKHZhciBlPTA7OT5lO2UrKyl0aGlzLmNvZWZmaWNpZW50c1tlXS5tdWx0aXBseVNjYWxhcihiKTtyZXR1cm4gdGhpc30sbGVycDpmdW5jdGlvbihiLGUpe2Zvcih2YXIgaD0wOzk+aDtoKyspdGhpcy5jb2VmZmljaWVudHNbaF0ubGVycChiLmNvZWZmaWNpZW50c1toXSxlKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZT0wOzk+ZTtlKyspaWYoIXRoaXMuY29lZmZpY2llbnRzW2VdLmVxdWFscyhiLmNvZWZmaWNpZW50c1tlXSkpcmV0dXJuITE7cmV0dXJuITB9LGNvcHk6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuc2V0KGIuY29lZmZpY2llbnRzKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGZyb21BcnJheTpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihlPTApO2Zvcih2YXIgaD10aGlzLmNvZWZmaWNpZW50cyxtPTA7OT5tO20rKyloW21dLmZyb21BcnJheShiLAplKzMqbSk7cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1iJiYoYj1bXSk7dm9pZCAwPT09ZSYmKGU9MCk7Zm9yKHZhciBoPXRoaXMuY29lZmZpY2llbnRzLG09MDs5Pm07bSsrKWhbbV0udG9BcnJheShiLGUrMyptKTtyZXR1cm4gYn19KTtPYmplY3QuYXNzaWduKFlpLHtnZXRCYXNpc0F0OmZ1bmN0aW9uKGIsZSl7dmFyIGg9Yi54LG09Yi55O2I9Yi56O2VbMF09LjI4MjA5NTtlWzFdPS40ODg2MDMqbTtlWzJdPS40ODg2MDMqYjtlWzNdPS40ODg2MDMqaDtlWzRdPTEuMDkyNTQ4KmgqbTtlWzVdPTEuMDkyNTQ4Km0qYjtlWzZdPS4zMTUzOTIqKDMqYipiLTEpO2VbN109MS4wOTI1NDgqaCpiO2VbOF09LjU0NjI3NCooaCpoLW0qbSl9fSk7amQucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShVYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpqZCxpc0xpZ2h0UHJvYmU6ITAsY29weTpmdW5jdGlvbihiKXtVYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsCmIpO3RoaXMuc2guY29weShiLnNoKTt0aGlzLmludGVuc2l0eT1iLmludGVuc2l0eTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKGIpe3JldHVybiBVYi5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxiKX19KTtNay5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGpkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOk1rLGlzSGVtaXNwaGVyZUxpZ2h0UHJvYmU6ITAsY29weTpmdW5jdGlvbihiKXtqZC5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYik7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihiKXtyZXR1cm4gamQucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsYil9fSk7TmsucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShqZC5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpOayxpc0FtYmllbnRMaWdodFByb2JlOiEwLGNvcHk6ZnVuY3Rpb24oYil7amQucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIpO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYil7cmV0dXJuIGpkLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLApiKX19KTt2YXIgRG89bmV3IHIsRW89bmV3IHI7T2JqZWN0LmFzc2lnbihabi5wcm90b3R5cGUse3VwZGF0ZTpmdW5jdGlvbihiKXt2YXIgZT10aGlzLl9jYWNoZTtpZihlLmZvY3VzIT09Yi5mb2N1c3x8ZS5mb3YhPT1iLmZvdnx8ZS5hc3BlY3QhPT1iLmFzcGVjdCp0aGlzLmFzcGVjdHx8ZS5uZWFyIT09Yi5uZWFyfHxlLmZhciE9PWIuZmFyfHxlLnpvb20hPT1iLnpvb218fGUuZXllU2VwIT09dGhpcy5leWVTZXApe2UuZm9jdXM9Yi5mb2N1cztlLmZvdj1iLmZvdjtlLmFzcGVjdD1iLmFzcGVjdCp0aGlzLmFzcGVjdDtlLm5lYXI9Yi5uZWFyO2UuZmFyPWIuZmFyO2Uuem9vbT1iLnpvb207ZS5leWVTZXA9dGhpcy5leWVTZXA7dmFyIGg9Yi5wcm9qZWN0aW9uTWF0cml4LmNsb25lKCksbT1lLmV5ZVNlcC8yLHU9bSplLm5lYXIvZS5mb2N1cyx3PWUubmVhcipNYXRoLnRhbihsYi5ERUcyUkFEKmUuZm92Ki41KS9lLnpvb207RW8uZWxlbWVudHNbMTJdPS1tO0RvLmVsZW1lbnRzWzEyXT0KbTttPS13KmUuYXNwZWN0K3U7dmFyIEE9dyplLmFzcGVjdCt1O2guZWxlbWVudHNbMF09MiplLm5lYXIvKEEtbSk7aC5lbGVtZW50c1s4XT0oQSttKS8oQS1tKTt0aGlzLmNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5jb3B5KGgpO209LXcqZS5hc3BlY3QtdTtBPXcqZS5hc3BlY3QtdTtoLmVsZW1lbnRzWzBdPTIqZS5uZWFyLyhBLW0pO2guZWxlbWVudHNbOF09KEErbSkvKEEtbSk7dGhpcy5jYW1lcmFSLnByb2plY3Rpb25NYXRyaXguY29weShoKX10aGlzLmNhbWVyYUwubWF0cml4V29ybGQuY29weShiLm1hdHJpeFdvcmxkKS5tdWx0aXBseShFbyk7dGhpcy5jYW1lcmFSLm1hdHJpeFdvcmxkLmNvcHkoYi5tYXRyaXhXb3JsZCkubXVsdGlwbHkoRG8pfX0pO09iamVjdC5hc3NpZ24oT2sucHJvdG90eXBlLHtzdGFydDpmdW5jdGlvbigpe3RoaXMub2xkVGltZT10aGlzLnN0YXJ0VGltZT0oInVuZGVmaW5lZCI9PT10eXBlb2YgcGVyZm9ybWFuY2U/RGF0ZTpwZXJmb3JtYW5jZSkubm93KCk7CnRoaXMuZWxhcHNlZFRpbWU9MDt0aGlzLnJ1bm5pbmc9ITB9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLmdldEVsYXBzZWRUaW1lKCk7dGhpcy5hdXRvU3RhcnQ9dGhpcy5ydW5uaW5nPSExfSxnZXRFbGFwc2VkVGltZTpmdW5jdGlvbigpe3RoaXMuZ2V0RGVsdGEoKTtyZXR1cm4gdGhpcy5lbGFwc2VkVGltZX0sZ2V0RGVsdGE6ZnVuY3Rpb24oKXt2YXIgYj0wO2lmKHRoaXMuYXV0b1N0YXJ0JiYhdGhpcy5ydW5uaW5nKXJldHVybiB0aGlzLnN0YXJ0KCksMDtpZih0aGlzLnJ1bm5pbmcpe3ZhciBlPSgidW5kZWZpbmVkIj09PXR5cGVvZiBwZXJmb3JtYW5jZT9EYXRlOnBlcmZvcm1hbmNlKS5ub3coKTtiPShlLXRoaXMub2xkVGltZSkvMUUzO3RoaXMub2xkVGltZT1lO3RoaXMuZWxhcHNlZFRpbWUrPWJ9cmV0dXJuIGJ9fSk7dmFyIGhmPW5ldyBnLEZvPW5ldyBmLElzPW5ldyBnLGpmPW5ldyBnO1BrLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoeS5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6UGssZ2V0SW5wdXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYWlufSxyZW1vdmVGaWx0ZXI6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5maWx0ZXImJih0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmZpbHRlciksdGhpcy5maWx0ZXIuZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiksdGhpcy5maWx0ZXI9bnVsbCk7cmV0dXJuIHRoaXN9LGdldEZpbHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbHRlcn0sc2V0RmlsdGVyOmZ1bmN0aW9uKGIpe251bGwhPT10aGlzLmZpbHRlcj8odGhpcy5nYWluLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXIpLHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSk6dGhpcy5nYWluLmRpc2Nvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKTt0aGlzLmZpbHRlcj1iO3RoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuZmlsdGVyKTsKdGhpcy5maWx0ZXIuY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pO3JldHVybiB0aGlzfSxnZXRNYXN0ZXJWb2x1bWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWV9LHNldE1hc3RlclZvbHVtZTpmdW5jdGlvbihiKXt0aGlzLmdhaW4uZ2Fpbi5zZXRUYXJnZXRBdFRpbWUoYix0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKTtyZXR1cm4gdGhpc30sdXBkYXRlTWF0cml4V29ybGQ6ZnVuY3Rpb24oYil7eS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCh0aGlzLGIpO2I9dGhpcy5jb250ZXh0Lmxpc3RlbmVyO3ZhciBlPXRoaXMudXA7dGhpcy50aW1lRGVsdGE9dGhpcy5fY2xvY2suZ2V0RGVsdGEoKTt0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShoZixGbyxJcyk7amYuc2V0KDAsMCwtMSkuYXBwbHlRdWF0ZXJuaW9uKEZvKTtpZihiLnBvc2l0aW9uWCl7dmFyIGg9dGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lK3RoaXMudGltZURlbHRhOwpiLnBvc2l0aW9uWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShoZi54LGgpO2IucG9zaXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGhmLnksaCk7Yi5wb3NpdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoaGYueixoKTtiLmZvcndhcmRYLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGpmLngsaCk7Yi5mb3J3YXJkWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShqZi55LGgpO2IuZm9yd2FyZFoubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoamYueixoKTtiLnVwWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShlLngsaCk7Yi51cFkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoZS55LGgpO2IudXBaLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGUueixoKX1lbHNlIGIuc2V0UG9zaXRpb24oaGYueCxoZi55LGhmLnopLGIuc2V0T3JpZW50YXRpb24oamYueCxqZi55LGpmLnosZS54LGUueSxlLnopfX0pO2dnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoeS5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6Z2csZ2V0T3V0cHV0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2Fpbn0sc2V0Tm9kZVNvdXJjZTpmdW5jdGlvbihiKXt0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMTt0aGlzLnNvdXJjZVR5cGU9ImF1ZGlvTm9kZSI7dGhpcy5zb3VyY2U9Yjt0aGlzLmNvbm5lY3QoKTtyZXR1cm4gdGhpc30sc2V0TWVkaWFFbGVtZW50U291cmNlOmZ1bmN0aW9uKGIpe3RoaXMuaGFzUGxheWJhY2tDb250cm9sPSExO3RoaXMuc291cmNlVHlwZT0ibWVkaWFOb2RlIjt0aGlzLnNvdXJjZT10aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFFbGVtZW50U291cmNlKGIpO3RoaXMuY29ubmVjdCgpO3JldHVybiB0aGlzfSxzZXRCdWZmZXI6ZnVuY3Rpb24oYil7dGhpcy5idWZmZXI9Yjt0aGlzLnNvdXJjZVR5cGU9ImJ1ZmZlciI7dGhpcy5hdXRvcGxheSYmdGhpcy5wbGF5KCk7cmV0dXJuIHRoaXN9LHBsYXk6ZnVuY3Rpb24oKXtpZighMD09PXRoaXMuaXNQbGF5aW5nKWNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IEF1ZGlvIGlzIGFscmVhZHkgcGxheWluZy4iKTsKZWxzZSBpZighMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKWNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7ZWxzZXt2YXIgYj10aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7Yi5idWZmZXI9dGhpcy5idWZmZXI7Yi5sb29wPXRoaXMubG9vcDtiLm9uZW5kZWQ9dGhpcy5vbkVuZGVkLmJpbmQodGhpcyk7dGhpcy5zdGFydFRpbWU9dGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lO2Iuc3RhcnQodGhpcy5zdGFydFRpbWUsdGhpcy5vZmZzZXQsdGhpcy5kdXJhdGlvbik7dGhpcy5pc1BsYXlpbmc9ITA7dGhpcy5zb3VyY2U9Yjt0aGlzLnNldERldHVuZSh0aGlzLmRldHVuZSk7dGhpcy5zZXRQbGF5YmFja1JhdGUodGhpcy5wbGF5YmFja1JhdGUpO3JldHVybiB0aGlzLmNvbm5lY3QoKX19LHBhdXNlOmZ1bmN0aW9uKCl7aWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpOwplbHNlIHJldHVybiEwPT09dGhpcy5pc1BsYXlpbmcmJih0aGlzLnNvdXJjZS5zdG9wKCksdGhpcy5zb3VyY2Uub25lbmRlZD1udWxsLHRoaXMub2Zmc2V0Kz0odGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLXRoaXMuc3RhcnRUaW1lKSp0aGlzLnBsYXliYWNrUmF0ZSx0aGlzLmlzUGxheWluZz0hMSksdGhpc30sc3RvcDpmdW5jdGlvbigpe2lmKCExPT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wpY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTtlbHNlIHJldHVybiB0aGlzLnNvdXJjZS5zdG9wKCksdGhpcy5zb3VyY2Uub25lbmRlZD1udWxsLHRoaXMub2Zmc2V0PTAsdGhpcy5pc1BsYXlpbmc9ITEsdGhpc30sY29ubmVjdDpmdW5jdGlvbigpe2lmKDA8dGhpcy5maWx0ZXJzLmxlbmd0aCl7dGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pO2Zvcih2YXIgYj0xLGU9dGhpcy5maWx0ZXJzLmxlbmd0aDtiPGU7YisrKXRoaXMuZmlsdGVyc1tiLQoxXS5jb25uZWN0KHRoaXMuZmlsdGVyc1tiXSk7dGhpcy5maWx0ZXJzW3RoaXMuZmlsdGVycy5sZW5ndGgtMV0uY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKX1lbHNlIHRoaXMuc291cmNlLmNvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSk7cmV0dXJuIHRoaXN9LGRpc2Nvbm5lY3Q6ZnVuY3Rpb24oKXtpZigwPHRoaXMuZmlsdGVycy5sZW5ndGgpe3RoaXMuc291cmNlLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXJzWzBdKTtmb3IodmFyIGI9MSxlPXRoaXMuZmlsdGVycy5sZW5ndGg7YjxlO2IrKyl0aGlzLmZpbHRlcnNbYi0xXS5kaXNjb25uZWN0KHRoaXMuZmlsdGVyc1tiXSk7dGhpcy5maWx0ZXJzW3RoaXMuZmlsdGVycy5sZW5ndGgtMV0uZGlzY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKX1lbHNlIHRoaXMuc291cmNlLmRpc2Nvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSk7cmV0dXJuIHRoaXN9LGdldEZpbHRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWx0ZXJzfSxzZXRGaWx0ZXJzOmZ1bmN0aW9uKGIpe2J8fAooYj1bXSk7ITA9PT10aGlzLmlzUGxheWluZz8odGhpcy5kaXNjb25uZWN0KCksdGhpcy5maWx0ZXJzPWIsdGhpcy5jb25uZWN0KCkpOnRoaXMuZmlsdGVycz1iO3JldHVybiB0aGlzfSxzZXREZXR1bmU6ZnVuY3Rpb24oYil7dGhpcy5kZXR1bmU9YjtpZih2b2lkIDAhPT10aGlzLnNvdXJjZS5kZXR1bmUpcmV0dXJuITA9PT10aGlzLmlzUGxheWluZyYmdGhpcy5zb3VyY2UuZGV0dW5lLnNldFRhcmdldEF0VGltZSh0aGlzLmRldHVuZSx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKSx0aGlzfSxnZXREZXR1bmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kZXR1bmV9LGdldEZpbHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEZpbHRlcnMoKVswXX0sc2V0RmlsdGVyOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnNldEZpbHRlcnMoYj9bYl06W10pfSxzZXRQbGF5YmFja1JhdGU6ZnVuY3Rpb24oYil7aWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpOwplbHNlIHJldHVybiB0aGlzLnBsYXliYWNrUmF0ZT1iLCEwPT09dGhpcy5pc1BsYXlpbmcmJnRoaXMuc291cmNlLnBsYXliYWNrUmF0ZS5zZXRUYXJnZXRBdFRpbWUodGhpcy5wbGF5YmFja1JhdGUsdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLC4wMSksdGhpc30sZ2V0UGxheWJhY2tSYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWJhY2tSYXRlfSxvbkVuZGVkOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITF9LGdldExvb3A6ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sPyhjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpLCExKTp0aGlzLmxvb3B9LHNldExvb3A6ZnVuY3Rpb24oYil7aWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO2Vsc2UgcmV0dXJuIHRoaXMubG9vcD0KYiwhMD09PXRoaXMuaXNQbGF5aW5nJiYodGhpcy5zb3VyY2UubG9vcD10aGlzLmxvb3ApLHRoaXN9LGdldFZvbHVtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZX0sc2V0Vm9sdW1lOmZ1bmN0aW9uKGIpe3RoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZShiLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpO3JldHVybiB0aGlzfX0pO3ZhciBrZj1uZXcgZyxHbz1uZXcgZixKcz1uZXcgZyxsZj1uZXcgZztSay5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGdnLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlJrLGdldE91dHB1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhbm5lcn0sZ2V0UmVmRGlzdGFuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYW5uZXIucmVmRGlzdGFuY2V9LHNldFJlZkRpc3RhbmNlOmZ1bmN0aW9uKGIpe3RoaXMucGFubmVyLnJlZkRpc3RhbmNlPWI7cmV0dXJuIHRoaXN9LGdldFJvbGxvZmZGYWN0b3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYW5uZXIucm9sbG9mZkZhY3Rvcn0sCnNldFJvbGxvZmZGYWN0b3I6ZnVuY3Rpb24oYil7dGhpcy5wYW5uZXIucm9sbG9mZkZhY3Rvcj1iO3JldHVybiB0aGlzfSxnZXREaXN0YW5jZU1vZGVsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFubmVyLmRpc3RhbmNlTW9kZWx9LHNldERpc3RhbmNlTW9kZWw6ZnVuY3Rpb24oYil7dGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbD1iO3JldHVybiB0aGlzfSxnZXRNYXhEaXN0YW5jZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhbm5lci5tYXhEaXN0YW5jZX0sc2V0TWF4RGlzdGFuY2U6ZnVuY3Rpb24oYil7dGhpcy5wYW5uZXIubWF4RGlzdGFuY2U9YjtyZXR1cm4gdGhpc30sc2V0RGlyZWN0aW9uYWxDb25lOmZ1bmN0aW9uKGIsZSxoKXt0aGlzLnBhbm5lci5jb25lSW5uZXJBbmdsZT1iO3RoaXMucGFubmVyLmNvbmVPdXRlckFuZ2xlPWU7dGhpcy5wYW5uZXIuY29uZU91dGVyR2Fpbj1oO3JldHVybiB0aGlzfSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihiKXt5LnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsCmIpO2lmKCEwIT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2x8fCExIT09dGhpcy5pc1BsYXlpbmcpaWYodGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2Uoa2YsR28sSnMpLGxmLnNldCgwLDAsMSkuYXBwbHlRdWF0ZXJuaW9uKEdvKSxiPXRoaXMucGFubmVyLGIucG9zaXRpb25YKXt2YXIgZT10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdGhpcy5saXN0ZW5lci50aW1lRGVsdGE7Yi5wb3NpdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoa2YueCxlKTtiLnBvc2l0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShrZi55LGUpO2IucG9zaXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGtmLnosZSk7Yi5vcmllbnRhdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobGYueCxlKTtiLm9yaWVudGF0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShsZi55LGUpO2Iub3JpZW50YXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGxmLnosZSl9ZWxzZSBiLnNldFBvc2l0aW9uKGtmLngsCmtmLnksa2YueiksYi5zZXRPcmllbnRhdGlvbihsZi54LGxmLnksbGYueil9fSk7T2JqZWN0LmFzc2lnbihTay5wcm90b3R5cGUse2dldEZyZXF1ZW5jeURhdGE6ZnVuY3Rpb24oKXt0aGlzLmFuYWx5c2VyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKHRoaXMuZGF0YSk7cmV0dXJuIHRoaXMuZGF0YX0sZ2V0QXZlcmFnZUZyZXF1ZW5jeTpmdW5jdGlvbigpe2Zvcih2YXIgYj0wLGU9dGhpcy5nZXRGcmVxdWVuY3lEYXRhKCksaD0wO2g8ZS5sZW5ndGg7aCsrKWIrPWVbaF07cmV0dXJuIGIvZS5sZW5ndGh9fSk7T2JqZWN0LmFzc2lnbihUay5wcm90b3R5cGUse2FjY3VtdWxhdGU6ZnVuY3Rpb24oYixlKXt2YXIgaD10aGlzLmJ1ZmZlcixtPXRoaXMudmFsdWVTaXplO2I9YiptK207dmFyIHU9dGhpcy5jdW11bGF0aXZlV2VpZ2h0O2lmKDA9PT11KXtmb3IodT0wO3UhPT1tOysrdSloW2IrdV09aFt1XTt1PWV9ZWxzZSB1Kz1lLHRoaXMuX21peEJ1ZmZlclJlZ2lvbihoLGIsMCxlL3UsbSk7dGhpcy5jdW11bGF0aXZlV2VpZ2h0PQp1fSxhcHBseTpmdW5jdGlvbihiKXt2YXIgZT10aGlzLnZhbHVlU2l6ZSxoPXRoaXMuYnVmZmVyO2I9YiplK2U7dmFyIG09dGhpcy5jdW11bGF0aXZlV2VpZ2h0LHU9dGhpcy5iaW5kaW5nO3RoaXMuY3VtdWxhdGl2ZVdlaWdodD0wOzE+bSYmdGhpcy5fbWl4QnVmZmVyUmVnaW9uKGgsYiwzKmUsMS1tLGUpO209ZTtmb3IodmFyIHc9ZStlO20hPT13OysrbSlpZihoW21dIT09aFttK2VdKXt1LnNldFZhbHVlKGgsYik7YnJlYWt9fSxzYXZlT3JpZ2luYWxTdGF0ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuYnVmZmVyLGU9dGhpcy52YWx1ZVNpemUsaD0zKmU7dGhpcy5iaW5kaW5nLmdldFZhbHVlKGIsaCk7Zm9yKHZhciBtPWU7bSE9PWg7KyttKWJbbV09YltoK20lZV07dGhpcy5jdW11bGF0aXZlV2VpZ2h0PTB9LHJlc3RvcmVPcmlnaW5hbFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5iaW5kaW5nLnNldFZhbHVlKHRoaXMuYnVmZmVyLDMqdGhpcy52YWx1ZVNpemUpfSxfc2VsZWN0OmZ1bmN0aW9uKGIsCmUsaCxtLHUpe2lmKC41PD1tKWZvcihtPTA7bSE9PXU7KyttKWJbZSttXT1iW2grbV19LF9zbGVycDpmdW5jdGlvbihiLGUsaCxtKXtmLnNsZXJwRmxhdChiLGUsYixlLGIsaCxtKX0sX2xlcnA6ZnVuY3Rpb24oYixlLGgsbSx1KXtmb3IodmFyIHc9MS1tLEE9MDtBIT09dTsrK0Epe3ZhciBFPWUrQTtiW0VdPWJbRV0qdytiW2grQV0qbX19fSk7dmFyIEtzPS9bXFtcXVwuOlwvXS9nLExzPSJbXiIrIlxcW1xcXVxcLjpcXC8iLnJlcGxhY2UoIlxcLiIsIiIpKyJdIixNcz0vKCg/OldDK1tcLzpdKSopLy5zb3VyY2UucmVwbGFjZSgiV0MiLCJbXlxcW1xcXVxcLjpcXC9dIiksTnM9LyhXQ09EKyk/Ly5zb3VyY2UucmVwbGFjZSgiV0NPRCIsTHMpLE9zPS8oPzpcLihXQyspKD86XFsoLispXF0pPyk/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLCJbXlxcW1xcXVxcLjpcXC9dIiksUHM9L1wuKFdDKykoPzpcWyguKylcXSk/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLCJbXlxcW1xcXVxcLjpcXC9dIiksUXM9Cm5ldyBSZWdFeHAoIl4iK01zK05zK09zK1BzKyIkIiksUnM9WyJtYXRlcmlhbCIsIm1hdGVyaWFscyIsImJvbmVzIl07T2JqZWN0LmFzc2lnbigkbi5wcm90b3R5cGUse2dldFZhbHVlOmZ1bmN0aW9uKGIsZSl7dGhpcy5iaW5kKCk7dmFyIGg9dGhpcy5fYmluZGluZ3NbdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfXTt2b2lkIDAhPT1oJiZoLmdldFZhbHVlKGIsZSl9LHNldFZhbHVlOmZ1bmN0aW9uKGIsZSl7Zm9yKHZhciBoPXRoaXMuX2JpbmRpbmdzLG09dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLHU9aC5sZW5ndGg7bSE9PXU7KyttKWhbbV0uc2V0VmFsdWUoYixlKX0sYmluZDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLl9iaW5kaW5ncyxlPXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxoPWIubGVuZ3RoO2UhPT1oOysrZSliW2VdLmJpbmQoKX0sdW5iaW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuX2JpbmRpbmdzLGU9dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLApoPWIubGVuZ3RoO2UhPT1oOysrZSliW2VdLnVuYmluZCgpfX0pO09iamVjdC5hc3NpZ24odmMse0NvbXBvc2l0ZTokbixjcmVhdGU6ZnVuY3Rpb24oYixlLGgpe3JldHVybiBiJiZiLmlzQW5pbWF0aW9uT2JqZWN0R3JvdXA/bmV3IHZjLkNvbXBvc2l0ZShiLGUsaCk6bmV3IHZjKGIsZSxoKX0sc2FuaXRpemVOb2RlTmFtZTpmdW5jdGlvbihiKXtyZXR1cm4gYi5yZXBsYWNlKC9ccy9nLCJfIikucmVwbGFjZShLcywiIil9LHBhcnNlVHJhY2tOYW1lOmZ1bmN0aW9uKGIpe3ZhciBlPVFzLmV4ZWMoYik7aWYoIWUpdGhyb3cgRXJyb3IoIlByb3BlcnR5QmluZGluZzogQ2Fubm90IHBhcnNlIHRyYWNrTmFtZTogIitiKTtlPXtub2RlTmFtZTplWzJdLG9iamVjdE5hbWU6ZVszXSxvYmplY3RJbmRleDplWzRdLHByb3BlcnR5TmFtZTplWzVdLHByb3BlcnR5SW5kZXg6ZVs2XX07dmFyIGg9ZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS5sYXN0SW5kZXhPZigiLiIpO2lmKHZvaWQgMCE9PWgmJi0xIT09Cmgpe3ZhciBtPWUubm9kZU5hbWUuc3Vic3RyaW5nKGgrMSk7LTEhPT1Scy5pbmRleE9mKG0pJiYoZS5ub2RlTmFtZT1lLm5vZGVOYW1lLnN1YnN0cmluZygwLGgpLGUub2JqZWN0TmFtZT1tKX1pZihudWxsPT09ZS5wcm9wZXJ0eU5hbWV8fDA9PT1lLnByb3BlcnR5TmFtZS5sZW5ndGgpdGhyb3cgRXJyb3IoIlByb3BlcnR5QmluZGluZzogY2FuIG5vdCBwYXJzZSBwcm9wZXJ0eU5hbWUgZnJvbSB0cmFja05hbWU6ICIrYik7cmV0dXJuIGV9LGZpbmROb2RlOmZ1bmN0aW9uKGIsZSl7aWYoIWV8fCIiPT09ZXx8InJvb3QiPT09ZXx8Ii4iPT09ZXx8LTE9PT1lfHxlPT09Yi5uYW1lfHxlPT09Yi51dWlkKXJldHVybiBiO2lmKGIuc2tlbGV0b24pe3ZhciBoPWIuc2tlbGV0b24uZ2V0Qm9uZUJ5TmFtZShlKTtpZih2b2lkIDAhPT1oKXJldHVybiBofWlmKGIuY2hpbGRyZW4pe3ZhciBtPWZ1bmN0aW9uKHUpe2Zvcih2YXIgdz0wO3c8dS5sZW5ndGg7dysrKXt2YXIgQT11W3ddO2lmKEEubmFtZT09PQplfHxBLnV1aWQ9PT1lKXJldHVybiBBO2lmKEE9bShBLmNoaWxkcmVuKSlyZXR1cm4gQX1yZXR1cm4gbnVsbH07aWYoYj1tKGIuY2hpbGRyZW4pKXJldHVybiBifXJldHVybiBudWxsfX0pO09iamVjdC5hc3NpZ24odmMucHJvdG90eXBlLHtfZ2V0VmFsdWVfdW5hdmFpbGFibGU6ZnVuY3Rpb24oKXt9LF9zZXRWYWx1ZV91bmF2YWlsYWJsZTpmdW5jdGlvbigpe30sQmluZGluZ1R5cGU6e0RpcmVjdDowLEVudGlyZUFycmF5OjEsQXJyYXlFbGVtZW50OjIsSGFzRnJvbVRvQXJyYXk6M30sVmVyc2lvbmluZzp7Tm9uZTowLE5lZWRzVXBkYXRlOjEsTWF0cml4V29ybGROZWVkc1VwZGF0ZToyfSxHZXR0ZXJCeUJpbmRpbmdUeXBlOltmdW5jdGlvbihiLGUpe2JbZV09dGhpcy5ub2RlW3RoaXMucHJvcGVydHlOYW1lXX0sZnVuY3Rpb24oYixlKXtmb3IodmFyIGg9dGhpcy5yZXNvbHZlZFByb3BlcnR5LG09MCx1PWgubGVuZ3RoO20hPT11OysrbSliW2UrK109aFttXX0sZnVuY3Rpb24oYixlKXtiW2VdPQp0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XX0sZnVuY3Rpb24oYixlKXt0aGlzLnJlc29sdmVkUHJvcGVydHkudG9BcnJheShiLGUpfV0sU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmc6W1tmdW5jdGlvbihiLGUpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT1iW2VdfSxmdW5jdGlvbihiLGUpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT1iW2VdO3RoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfSxmdW5jdGlvbihiLGUpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT1iW2VdO3RoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9XSxbZnVuY3Rpb24oYixlKXtmb3IodmFyIGg9dGhpcy5yZXNvbHZlZFByb3BlcnR5LG09MCx1PWgubGVuZ3RoO20hPT11OysrbSloW21dPWJbZSsrXX0sZnVuY3Rpb24oYixlKXtmb3IodmFyIGg9dGhpcy5yZXNvbHZlZFByb3BlcnR5LAptPTAsdT1oLmxlbmd0aDttIT09dTsrK20paFttXT1iW2UrK107dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9LGZ1bmN0aW9uKGIsZSl7Zm9yKHZhciBoPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eSxtPTAsdT1oLmxlbmd0aDttIT09dTsrK20paFttXT1iW2UrK107dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1dLFtmdW5jdGlvbihiLGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdPWJbZV19LGZ1bmN0aW9uKGIsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5W3RoaXMucHJvcGVydHlJbmRleF09YltlXTt0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH0sZnVuY3Rpb24oYixlKXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT1iW2VdO3RoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9XSxbZnVuY3Rpb24oYixlKXt0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KGIsCmUpfSxmdW5jdGlvbihiLGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoYixlKTt0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH0sZnVuY3Rpb24oYixlKXt0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KGIsZSk7dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1dXSxnZXRWYWx1ZTpmdW5jdGlvbihiLGUpe3RoaXMuYmluZCgpO3RoaXMuZ2V0VmFsdWUoYixlKX0sc2V0VmFsdWU6ZnVuY3Rpb24oYixlKXt0aGlzLmJpbmQoKTt0aGlzLnNldFZhbHVlKGIsZSl9LGJpbmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5vZGUsZT10aGlzLnBhcnNlZFBhdGgsaD1lLm9iamVjdE5hbWUsbT1lLnByb3BlcnR5TmFtZSx1PWUucHJvcGVydHlJbmRleDtifHwodGhpcy5ub2RlPWI9dmMuZmluZE5vZGUodGhpcy5yb290Tm9kZSxlLm5vZGVOYW1lKXx8dGhpcy5yb290Tm9kZSk7dGhpcy5nZXRWYWx1ZT10aGlzLl9nZXRWYWx1ZV91bmF2YWlsYWJsZTsKdGhpcy5zZXRWYWx1ZT10aGlzLl9zZXRWYWx1ZV91bmF2YWlsYWJsZTtpZihiKXtpZihoKXt2YXIgdz1lLm9iamVjdEluZGV4O3N3aXRjaChoKXtjYXNlICJtYXRlcmlhbHMiOmlmKCFiLm1hdGVyaWFsKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbCBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbC4iLHRoaXMpO3JldHVybn1pZighYi5tYXRlcmlhbC5tYXRlcmlhbHMpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsLm1hdGVyaWFscyBhcyBub2RlLm1hdGVyaWFsIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbHMgYXJyYXkuIix0aGlzKTtyZXR1cm59Yj1iLm1hdGVyaWFsLm1hdGVyaWFsczticmVhaztjYXNlICJib25lcyI6aWYoIWIuc2tlbGV0b24pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIGJvbmVzIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIHNrZWxldG9uLiIsCnRoaXMpO3JldHVybn1iPWIuc2tlbGV0b24uYm9uZXM7Zm9yKGg9MDtoPGIubGVuZ3RoO2grKylpZihiW2hdLm5hbWU9PT13KXt3PWg7YnJlYWt9YnJlYWs7ZGVmYXVsdDppZih2b2lkIDA9PT1iW2hdKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBvYmplY3ROYW1lIG9mIG5vZGUgdW5kZWZpbmVkLiIsdGhpcyk7cmV0dXJufWI9YltoXX1pZih2b2lkIDAhPT13KXtpZih2b2lkIDA9PT1iW3ddKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byBiaW5kIHRvIG9iamVjdEluZGV4IG9mIG9iamVjdE5hbWUsIGJ1dCBpcyB1bmRlZmluZWQuIix0aGlzLGIpO3JldHVybn1iPWJbd119fXc9YlttXTtpZih2b2lkIDA9PT13KWNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIHVwZGF0ZSBwcm9wZXJ0eSBmb3IgdHJhY2s6ICIrZS5ub2RlTmFtZSsiLiIrbSsiIGJ1dCBpdCB3YXNuJ3QgZm91bmQuIiwKYik7ZWxzZXtlPXRoaXMuVmVyc2lvbmluZy5Ob25lO3RoaXMudGFyZ2V0T2JqZWN0PWI7dm9pZCAwIT09Yi5uZWVkc1VwZGF0ZT9lPXRoaXMuVmVyc2lvbmluZy5OZWVkc1VwZGF0ZTp2b2lkIDAhPT1iLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUmJihlPXRoaXMuVmVyc2lvbmluZy5NYXRyaXhXb3JsZE5lZWRzVXBkYXRlKTtoPXRoaXMuQmluZGluZ1R5cGUuRGlyZWN0O2lmKHZvaWQgMCE9PXUpe2lmKCJtb3JwaFRhcmdldEluZmx1ZW5jZXMiPT09bSl7aWYoIWIuZ2VvbWV0cnkpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5LiIsdGhpcyk7cmV0dXJufWlmKGIuZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSl7aWYoIWIuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuIiwKdGhpcyk7cmV0dXJufWZvcihoPTA7aDx0aGlzLm5vZGUuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aDtoKyspaWYoYi5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb25baF0ubmFtZT09PXUpe3U9aDticmVha319ZWxzZXtpZighYi5nZW9tZXRyeS5tb3JwaFRhcmdldHMpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy4iLHRoaXMpO3JldHVybn1mb3IoaD0wO2g8dGhpcy5ub2RlLmdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGg7aCsrKWlmKGIuZ2VvbWV0cnkubW9ycGhUYXJnZXRzW2hdLm5hbWU9PT11KXt1PWg7YnJlYWt9fX1oPXRoaXMuQmluZGluZ1R5cGUuQXJyYXlFbGVtZW50O3RoaXMucmVzb2x2ZWRQcm9wZXJ0eT13O3RoaXMucHJvcGVydHlJbmRleD11fWVsc2Ugdm9pZCAwIT09CncuZnJvbUFycmF5JiZ2b2lkIDAhPT13LnRvQXJyYXk/KGg9dGhpcy5CaW5kaW5nVHlwZS5IYXNGcm9tVG9BcnJheSx0aGlzLnJlc29sdmVkUHJvcGVydHk9dyk6QXJyYXkuaXNBcnJheSh3KT8oaD10aGlzLkJpbmRpbmdUeXBlLkVudGlyZUFycmF5LHRoaXMucmVzb2x2ZWRQcm9wZXJ0eT13KTp0aGlzLnByb3BlcnR5TmFtZT1tO3RoaXMuZ2V0VmFsdWU9dGhpcy5HZXR0ZXJCeUJpbmRpbmdUeXBlW2hdO3RoaXMuc2V0VmFsdWU9dGhpcy5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZ1toXVtlXX19ZWxzZSBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byB1cGRhdGUgbm9kZSBmb3IgdHJhY2s6ICIrdGhpcy5wYXRoKyIgYnV0IGl0IHdhc24ndCBmb3VuZC4iKX0sdW5iaW5kOmZ1bmN0aW9uKCl7dGhpcy5ub2RlPW51bGw7dGhpcy5nZXRWYWx1ZT10aGlzLl9nZXRWYWx1ZV91bmJvdW5kO3RoaXMuc2V0VmFsdWU9dGhpcy5fc2V0VmFsdWVfdW5ib3VuZH19KTsKT2JqZWN0LmFzc2lnbih2Yy5wcm90b3R5cGUse19nZXRWYWx1ZV91bmJvdW5kOnZjLnByb3RvdHlwZS5nZXRWYWx1ZSxfc2V0VmFsdWVfdW5ib3VuZDp2Yy5wcm90b3R5cGUuc2V0VmFsdWV9KTtPYmplY3QuYXNzaWduKGFvLnByb3RvdHlwZSx7aXNBbmltYXRpb25PYmplY3RHcm91cDohMCxhZGQ6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5fb2JqZWN0cyxlPWIubGVuZ3RoLGg9dGhpcy5uQ2FjaGVkT2JqZWN0c18sbT10aGlzLl9pbmRpY2VzQnlVVUlELHU9dGhpcy5fcGF0aHMsdz10aGlzLl9wYXJzZWRQYXRocyxBPXRoaXMuX2JpbmRpbmdzLEU9QS5sZW5ndGgsRz12b2lkIDAsSj0wLFE9YXJndW1lbnRzLmxlbmd0aDtKIT09UTsrK0ope3ZhciBTPWFyZ3VtZW50c1tKXSxUPVMudXVpZCxXPW1bVF07aWYodm9pZCAwPT09Vyl7Vz1lKys7bVtUXT1XO2IucHVzaChTKTtUPTA7Zm9yKHZhciBYPUU7VCE9PVg7KytUKUFbVF0ucHVzaChuZXcgdmMoUyx1W1RdLHdbVF0pKX1lbHNlIGlmKFc8Cmgpe0c9YltXXTt2YXIgaWE9LS1oO1g9YltpYV07bVtYLnV1aWRdPVc7YltXXT1YO21bVF09aWE7YltpYV09UztUPTA7Zm9yKFg9RTtUIT09WDsrK1Qpe3ZhciBoYT1BW1RdLHNhPWhhW1ddO2hhW1ddPWhhW2lhXTt2b2lkIDA9PT1zYSYmKHNhPW5ldyB2YyhTLHVbVF0sd1tUXSkpO2hhW2lhXT1zYX19ZWxzZSBiW1ddIT09RyYmY29uc29sZS5lcnJvcigiVEhSRUUuQW5pbWF0aW9uT2JqZWN0R3JvdXA6IERpZmZlcmVudCBvYmplY3RzIHdpdGggdGhlIHNhbWUgVVVJRCBkZXRlY3RlZC4gQ2xlYW4gdGhlIGNhY2hlcyBvciByZWNyZWF0ZSB5b3VyIGluZnJhc3RydWN0dXJlIHdoZW4gcmVsb2FkaW5nIHNjZW5lcy4iKX10aGlzLm5DYWNoZWRPYmplY3RzXz1ofSxyZW1vdmU6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5fb2JqZWN0cyxlPXRoaXMubkNhY2hlZE9iamVjdHNfLGg9dGhpcy5faW5kaWNlc0J5VVVJRCxtPXRoaXMuX2JpbmRpbmdzLHU9bS5sZW5ndGgsdz0wLEE9YXJndW1lbnRzLmxlbmd0aDt3IT09CkE7Kyt3KXt2YXIgRT1hcmd1bWVudHNbd10sRz1FLnV1aWQsSj1oW0ddO2lmKHZvaWQgMCE9PUomJko+PWUpe3ZhciBRPWUrKyxTPWJbUV07aFtTLnV1aWRdPUo7YltKXT1TO2hbR109UTtiW1FdPUU7RT0wO2ZvcihHPXU7RSE9PUc7KytFKXtTPW1bRV07dmFyIFQ9U1tKXTtTW0pdPVNbUV07U1tRXT1UfX19dGhpcy5uQ2FjaGVkT2JqZWN0c189ZX0sdW5jYWNoZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLl9vYmplY3RzLGU9Yi5sZW5ndGgsaD10aGlzLm5DYWNoZWRPYmplY3RzXyxtPXRoaXMuX2luZGljZXNCeVVVSUQsdT10aGlzLl9iaW5kaW5ncyx3PXUubGVuZ3RoLEE9MCxFPWFyZ3VtZW50cy5sZW5ndGg7QSE9PUU7KytBKXt2YXIgRz1hcmd1bWVudHNbQV0udXVpZCxKPW1bR107aWYodm9pZCAwIT09SilpZihkZWxldGUgbVtHXSxKPGgpe0c9LS1oO3ZhciBRPWJbR10sUz0tLWUsVD1iW1NdO21bUS51dWlkXT1KO2JbSl09UTttW1QudXVpZF09RztiW0ddPVQ7Yi5wb3AoKTtRPQowO2ZvcihUPXc7USE9PVQ7KytRKXt2YXIgVz11W1FdLFg9V1tTXTtXW0pdPVdbR107V1tHXT1YO1cucG9wKCl9fWVsc2UgZm9yKFM9LS1lLFQ9YltTXSxtW1QudXVpZF09SixiW0pdPVQsYi5wb3AoKSxRPTAsVD13O1EhPT1UOysrUSlXPXVbUV0sV1tKXT1XW1NdLFcucG9wKCl9dGhpcy5uQ2FjaGVkT2JqZWN0c189aH0sc3Vic2NyaWJlXzpmdW5jdGlvbihiLGUpe3ZhciBoPXRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCxtPWhbYl0sdT10aGlzLl9iaW5kaW5ncztpZih2b2lkIDAhPT1tKXJldHVybiB1W21dO3ZhciB3PXRoaXMuX3BhdGhzLEE9dGhpcy5fcGFyc2VkUGF0aHMsRT10aGlzLl9vYmplY3RzLEc9dGhpcy5uQ2FjaGVkT2JqZWN0c18sSj1BcnJheShFLmxlbmd0aCk7bT11Lmxlbmd0aDtoW2JdPW07dy5wdXNoKGIpO0EucHVzaChlKTt1LnB1c2goSik7aD1HO2ZvcihtPUUubGVuZ3RoO2ghPT1tOysraClKW2hdPW5ldyB2YyhFW2hdLGIsZSk7cmV0dXJuIEp9LHVuc3Vic2NyaWJlXzpmdW5jdGlvbihiKXt2YXIgZT0KdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLGg9ZVtiXTtpZih2b2lkIDAhPT1oKXt2YXIgbT10aGlzLl9wYXRocyx1PXRoaXMuX3BhcnNlZFBhdGhzLHc9dGhpcy5fYmluZGluZ3MsQT13Lmxlbmd0aC0xLEU9d1tBXTtlW2JbQV1dPWg7d1toXT1FO3cucG9wKCk7dVtoXT11W0FdO3UucG9wKCk7bVtoXT1tW0FdO20ucG9wKCl9fX0pO09iamVjdC5hc3NpZ24oYm8ucHJvdG90eXBlLHtwbGF5OmZ1bmN0aW9uKCl7dGhpcy5fbWl4ZXIuX2FjdGl2YXRlQWN0aW9uKHRoaXMpO3JldHVybiB0aGlzfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5fbWl4ZXIuX2RlYWN0aXZhdGVBY3Rpb24odGhpcyk7cmV0dXJuIHRoaXMucmVzZXQoKX0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlZD0hMTt0aGlzLmVuYWJsZWQ9ITA7dGhpcy50aW1lPTA7dGhpcy5fbG9vcENvdW50PS0xO3RoaXMuX3N0YXJ0VGltZT1udWxsO3JldHVybiB0aGlzLnN0b3BGYWRpbmcoKS5zdG9wV2FycGluZygpfSxpc1J1bm5pbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmFibGVkJiYKIXRoaXMucGF1c2VkJiYwIT09dGhpcy50aW1lU2NhbGUmJm51bGw9PT10aGlzLl9zdGFydFRpbWUmJnRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbih0aGlzKX0saXNTY2hlZHVsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKHRoaXMpfSxzdGFydEF0OmZ1bmN0aW9uKGIpe3RoaXMuX3N0YXJ0VGltZT1iO3JldHVybiB0aGlzfSxzZXRMb29wOmZ1bmN0aW9uKGIsZSl7dGhpcy5sb29wPWI7dGhpcy5yZXBldGl0aW9ucz1lO3JldHVybiB0aGlzfSxzZXRFZmZlY3RpdmVXZWlnaHQ6ZnVuY3Rpb24oYil7dGhpcy53ZWlnaHQ9Yjt0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9dGhpcy5lbmFibGVkP2I6MDtyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCl9LGdldEVmZmVjdGl2ZVdlaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZmZlY3RpdmVXZWlnaHR9LGZhZGVJbjpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcoYiwwLDEpfSxmYWRlT3V0OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyhiLAoxLDApfSxjcm9zc0ZhZGVGcm9tOmZ1bmN0aW9uKGIsZSxoKXtiLmZhZGVPdXQoZSk7dGhpcy5mYWRlSW4oZSk7aWYoaCl7aD10aGlzLl9jbGlwLmR1cmF0aW9uO3ZhciBtPWIuX2NsaXAuZHVyYXRpb24sdT1oL207Yi53YXJwKDEsbS9oLGUpO3RoaXMud2FycCh1LDEsZSl9cmV0dXJuIHRoaXN9LGNyb3NzRmFkZVRvOmZ1bmN0aW9uKGIsZSxoKXtyZXR1cm4gYi5jcm9zc0ZhZGVGcm9tKHRoaXMsZSxoKX0sc3RvcEZhZGluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX3dlaWdodEludGVycG9sYW50O251bGwhPT1iJiYodGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9bnVsbCx0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoYikpO3JldHVybiB0aGlzfSxzZXRFZmZlY3RpdmVUaW1lU2NhbGU6ZnVuY3Rpb24oYil7dGhpcy50aW1lU2NhbGU9Yjt0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU9dGhpcy5wYXVzZWQ/MDpiO3JldHVybiB0aGlzLnN0b3BXYXJwaW5nKCl9LGdldEVmZmVjdGl2ZVRpbWVTY2FsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGV9LApzZXREdXJhdGlvbjpmdW5jdGlvbihiKXt0aGlzLnRpbWVTY2FsZT10aGlzLl9jbGlwLmR1cmF0aW9uL2I7cmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKX0sc3luY1dpdGg6ZnVuY3Rpb24oYil7dGhpcy50aW1lPWIudGltZTt0aGlzLnRpbWVTY2FsZT1iLnRpbWVTY2FsZTtyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpfSxoYWx0OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLndhcnAodGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlLDAsYil9LHdhcnA6ZnVuY3Rpb24oYixlLGgpe3ZhciBtPXRoaXMuX21peGVyLHU9bS50aW1lLHc9dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQsQT10aGlzLnRpbWVTY2FsZTtudWxsPT09dyYmKHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PXc9bS5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpKTttPXcucGFyYW1ldGVyUG9zaXRpb25zO3c9dy5zYW1wbGVWYWx1ZXM7bVswXT11O21bMV09dStoO3dbMF09Yi9BO3dbMV09ZS9BO3JldHVybiB0aGlzfSxzdG9wV2FycGluZzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtudWxsIT09YiYmKHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PW51bGwsdGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KGIpKTtyZXR1cm4gdGhpc30sZ2V0TWl4ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWl4ZXJ9LGdldENsaXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2xpcH0sZ2V0Um9vdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb2NhbFJvb3R8fHRoaXMuX21peGVyLl9yb290fSxfdXBkYXRlOmZ1bmN0aW9uKGIsZSxoLG0pe2lmKHRoaXMuZW5hYmxlZCl7dmFyIHU9dGhpcy5fc3RhcnRUaW1lO2lmKG51bGwhPT11KXtlPShiLXUpKmg7aWYoMD5lfHwwPT09aClyZXR1cm47dGhpcy5fc3RhcnRUaW1lPW51bGw7ZSo9aH1lKj10aGlzLl91cGRhdGVUaW1lU2NhbGUoYik7aD10aGlzLl91cGRhdGVUaW1lKGUpO2I9dGhpcy5fdXBkYXRlV2VpZ2h0KGIpO2lmKDA8Yil7ZT10aGlzLl9pbnRlcnBvbGFudHM7CnU9dGhpcy5fcHJvcGVydHlCaW5kaW5ncztmb3IodmFyIHc9MCxBPWUubGVuZ3RoO3chPT1BOysrdyllW3ddLmV2YWx1YXRlKGgpLHVbd10uYWNjdW11bGF0ZShtLGIpfX1lbHNlIHRoaXMuX3VwZGF0ZVdlaWdodChiKX0sX3VwZGF0ZVdlaWdodDpmdW5jdGlvbihiKXt2YXIgZT0wO2lmKHRoaXMuZW5hYmxlZCl7ZT10aGlzLndlaWdodDt2YXIgaD10aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtpZihudWxsIT09aCl7dmFyIG09aC5ldmFsdWF0ZShiKVswXTtlKj1tO2I+aC5wYXJhbWV0ZXJQb3NpdGlvbnNbMV0mJih0aGlzLnN0b3BGYWRpbmcoKSwwPT09bSYmKHRoaXMuZW5hYmxlZD0hMSkpfX1yZXR1cm4gdGhpcy5fZWZmZWN0aXZlV2VpZ2h0PWV9LF91cGRhdGVUaW1lU2NhbGU6ZnVuY3Rpb24oYil7dmFyIGU9MDtpZighdGhpcy5wYXVzZWQpe2U9dGhpcy50aW1lU2NhbGU7dmFyIGg9dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7aWYobnVsbCE9PWgpe3ZhciBtPWguZXZhbHVhdGUoYilbMF07CmUqPW07Yj5oLnBhcmFtZXRlclBvc2l0aW9uc1sxXSYmKHRoaXMuc3RvcFdhcnBpbmcoKSwwPT09ZT90aGlzLnBhdXNlZD0hMDp0aGlzLnRpbWVTY2FsZT1lKX19cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT1lfSxfdXBkYXRlVGltZTpmdW5jdGlvbihiKXt2YXIgZT10aGlzLnRpbWUrYixoPXRoaXMuX2NsaXAuZHVyYXRpb24sbT10aGlzLmxvb3AsdT10aGlzLl9sb29wQ291bnQsdz0yMjAyPT09bTtpZigwPT09YilyZXR1cm4tMT09PXU/ZTp3JiYxPT09KHUmMSk/aC1lOmU7aWYoMjIwMD09PW0pYTp7aWYoLTE9PT11JiYodGhpcy5fbG9vcENvdW50PTAsdGhpcy5fc2V0RW5kaW5ncyghMCwhMCwhMSkpLGU+PWgpZT1oO2Vsc2UgaWYoMD5lKWU9MDtlbHNle3RoaXMudGltZT1lO2JyZWFrIGF9dGhpcy5jbGFtcFdoZW5GaW5pc2hlZD90aGlzLnBhdXNlZD0hMDp0aGlzLmVuYWJsZWQ9ITE7dGhpcy50aW1lPWU7dGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7dHlwZToiZmluaXNoZWQiLAphY3Rpb246dGhpcyxkaXJlY3Rpb246MD5iPy0xOjF9KX1lbHNley0xPT09dSYmKDA8PWI/KHU9MCx0aGlzLl9zZXRFbmRpbmdzKCEwLDA9PT10aGlzLnJlcGV0aXRpb25zLHcpKTp0aGlzLl9zZXRFbmRpbmdzKDA9PT10aGlzLnJlcGV0aXRpb25zLCEwLHcpKTtpZihlPj1ofHwwPmUpe209TWF0aC5mbG9vcihlL2gpO2UtPWgqbTt1Kz1NYXRoLmFicyhtKTt2YXIgQT10aGlzLnJlcGV0aXRpb25zLXU7MD49QT8odGhpcy5jbGFtcFdoZW5GaW5pc2hlZD90aGlzLnBhdXNlZD0hMDp0aGlzLmVuYWJsZWQ9ITEsdGhpcy50aW1lPWU9MDxiP2g6MCx0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KHt0eXBlOiJmaW5pc2hlZCIsYWN0aW9uOnRoaXMsZGlyZWN0aW9uOjA8Yj8xOi0xfSkpOigxPT09QT8oYj0wPmIsdGhpcy5fc2V0RW5kaW5ncyhiLCFiLHcpKTp0aGlzLl9zZXRFbmRpbmdzKCExLCExLHcpLHRoaXMuX2xvb3BDb3VudD11LHRoaXMudGltZT1lLHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6Imxvb3AiLAphY3Rpb246dGhpcyxsb29wRGVsdGE6bX0pKX1lbHNlIHRoaXMudGltZT1lO2lmKHcmJjE9PT0odSYxKSlyZXR1cm4gaC1lfXJldHVybiBlfSxfc2V0RW5kaW5nczpmdW5jdGlvbihiLGUsaCl7dmFyIG09dGhpcy5faW50ZXJwb2xhbnRTZXR0aW5ncztoPyhtLmVuZGluZ1N0YXJ0PTI0MDEsbS5lbmRpbmdFbmQ9MjQwMSk6KG0uZW5kaW5nU3RhcnQ9Yj90aGlzLnplcm9TbG9wZUF0U3RhcnQ/MjQwMToyNDAwOjI0MDIsbS5lbmRpbmdFbmQ9ZT90aGlzLnplcm9TbG9wZUF0RW5kPzI0MDE6MjQwMDoyNDAyKX0sX3NjaGVkdWxlRmFkaW5nOmZ1bmN0aW9uKGIsZSxoKXt2YXIgbT10aGlzLl9taXhlcix1PW0udGltZSx3PXRoaXMuX3dlaWdodEludGVycG9sYW50O251bGw9PT13JiYodGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9dz1tLl9sZW5kQ29udHJvbEludGVycG9sYW50KCkpO209dy5wYXJhbWV0ZXJQb3NpdGlvbnM7dz13LnNhbXBsZVZhbHVlczttWzBdPXU7d1swXT1lO21bMV09dStiO3dbMV09Cmg7cmV0dXJuIHRoaXN9fSk7VWsucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlVrLF9iaW5kQWN0aW9uOmZ1bmN0aW9uKGIsZSl7dmFyIGg9Yi5fbG9jYWxSb290fHx0aGlzLl9yb290LG09Yi5fY2xpcC50cmFja3MsdT1tLmxlbmd0aCx3PWIuX3Byb3BlcnR5QmluZGluZ3M7Yj1iLl9pbnRlcnBvbGFudHM7dmFyIEE9aC51dWlkLEU9dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLEc9RVtBXTt2b2lkIDA9PT1HJiYoRz17fSxFW0FdPUcpO2ZvcihFPTA7RSE9PXU7KytFKXt2YXIgSj1tW0VdLFE9Si5uYW1lLFM9R1tRXTtpZih2b2lkIDA9PT1TKXtTPXdbRV07aWYodm9pZCAwIT09Uyl7bnVsbD09PVMuX2NhY2hlSW5kZXgmJigrK1MucmVmZXJlbmNlQ291bnQsdGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKFMsQSxRKSk7Y29udGludWV9Uz1uZXcgVGsodmMuY3JlYXRlKGgsUSxlJiZlLl9wcm9wZXJ0eUJpbmRpbmdzW0VdLmJpbmRpbmcucGFyc2VkUGF0aCksCkouVmFsdWVUeXBlTmFtZSxKLmdldFZhbHVlU2l6ZSgpKTsrK1MucmVmZXJlbmNlQ291bnQ7dGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKFMsQSxRKX13W0VdPVM7YltFXS5yZXN1bHRCdWZmZXI9Uy5idWZmZXJ9fSxfYWN0aXZhdGVBY3Rpb246ZnVuY3Rpb24oYil7aWYoIXRoaXMuX2lzQWN0aXZlQWN0aW9uKGIpKXtpZihudWxsPT09Yi5fY2FjaGVJbmRleCl7dmFyIGU9KGIuX2xvY2FsUm9vdHx8dGhpcy5fcm9vdCkudXVpZCxoPWIuX2NsaXAudXVpZCxtPXRoaXMuX2FjdGlvbnNCeUNsaXBbaF07dGhpcy5fYmluZEFjdGlvbihiLG0mJm0ua25vd25BY3Rpb25zWzBdKTt0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbihiLGgsZSl9ZT1iLl9wcm9wZXJ0eUJpbmRpbmdzO2g9MDtmb3IobT1lLmxlbmd0aDtoIT09bTsrK2gpe3ZhciB1PWVbaF07MD09PXUudXNlQ291bnQrKyYmKHRoaXMuX2xlbmRCaW5kaW5nKHUpLHUuc2F2ZU9yaWdpbmFsU3RhdGUoKSl9dGhpcy5fbGVuZEFjdGlvbihiKX19LApfZGVhY3RpdmF0ZUFjdGlvbjpmdW5jdGlvbihiKXtpZih0aGlzLl9pc0FjdGl2ZUFjdGlvbihiKSl7Zm9yKHZhciBlPWIuX3Byb3BlcnR5QmluZGluZ3MsaD0wLG09ZS5sZW5ndGg7aCE9PW07KytoKXt2YXIgdT1lW2hdOzA9PT0tLXUudXNlQ291bnQmJih1LnJlc3RvcmVPcmlnaW5hbFN0YXRlKCksdGhpcy5fdGFrZUJhY2tCaW5kaW5nKHUpKX10aGlzLl90YWtlQmFja0FjdGlvbihiKX19LF9pbml0TWVtb3J5TWFuYWdlcjpmdW5jdGlvbigpe3RoaXMuX2FjdGlvbnM9W107dGhpcy5fbkFjdGl2ZUFjdGlvbnM9MDt0aGlzLl9hY3Rpb25zQnlDbGlwPXt9O3RoaXMuX2JpbmRpbmdzPVtdO3RoaXMuX25BY3RpdmVCaW5kaW5ncz0wO3RoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZT17fTt0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzPVtdO3RoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzPTA7dmFyIGI9dGhpczt0aGlzLnN0YXRzPXthY3Rpb25zOntnZXQgdG90YWwoKXtyZXR1cm4gYi5fYWN0aW9ucy5sZW5ndGh9LApnZXQgaW5Vc2UoKXtyZXR1cm4gYi5fbkFjdGl2ZUFjdGlvbnN9fSxiaW5kaW5nczp7Z2V0IHRvdGFsKCl7cmV0dXJuIGIuX2JpbmRpbmdzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIGIuX25BY3RpdmVCaW5kaW5nc319LGNvbnRyb2xJbnRlcnBvbGFudHM6e2dldCB0b3RhbCgpe3JldHVybiBiLl9jb250cm9sSW50ZXJwb2xhbnRzLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIGIuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzfX19fSxfaXNBY3RpdmVBY3Rpb246ZnVuY3Rpb24oYil7Yj1iLl9jYWNoZUluZGV4O3JldHVybiBudWxsIT09YiYmYjx0aGlzLl9uQWN0aXZlQWN0aW9uc30sX2FkZEluYWN0aXZlQWN0aW9uOmZ1bmN0aW9uKGIsZSxoKXt2YXIgbT10aGlzLl9hY3Rpb25zLHU9dGhpcy5fYWN0aW9uc0J5Q2xpcCx3PXVbZV07dm9pZCAwPT09dz8odz17a25vd25BY3Rpb25zOltiXSxhY3Rpb25CeVJvb3Q6e319LGIuX2J5Q2xpcENhY2hlSW5kZXg9MCx1W2VdPXcpOihlPQp3Lmtub3duQWN0aW9ucyxiLl9ieUNsaXBDYWNoZUluZGV4PWUubGVuZ3RoLGUucHVzaChiKSk7Yi5fY2FjaGVJbmRleD1tLmxlbmd0aDttLnB1c2goYik7dy5hY3Rpb25CeVJvb3RbaF09Yn0sX3JlbW92ZUluYWN0aXZlQWN0aW9uOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuX2FjdGlvbnMsaD1lW2UubGVuZ3RoLTFdLG09Yi5fY2FjaGVJbmRleDtoLl9jYWNoZUluZGV4PW07ZVttXT1oO2UucG9wKCk7Yi5fY2FjaGVJbmRleD1udWxsO2U9Yi5fY2xpcC51dWlkO2g9dGhpcy5fYWN0aW9uc0J5Q2xpcDttPWhbZV07dmFyIHU9bS5rbm93bkFjdGlvbnMsdz11W3UubGVuZ3RoLTFdLEE9Yi5fYnlDbGlwQ2FjaGVJbmRleDt3Ll9ieUNsaXBDYWNoZUluZGV4PUE7dVtBXT13O3UucG9wKCk7Yi5fYnlDbGlwQ2FjaGVJbmRleD1udWxsO2RlbGV0ZSBtLmFjdGlvbkJ5Um9vdFsoYi5fbG9jYWxSb290fHx0aGlzLl9yb290KS51dWlkXTswPT09dS5sZW5ndGgmJmRlbGV0ZSBoW2VdO3RoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24oYil9LApfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbjpmdW5jdGlvbihiKXtiPWIuX3Byb3BlcnR5QmluZGluZ3M7Zm9yKHZhciBlPTAsaD1iLmxlbmd0aDtlIT09aDsrK2Upe3ZhciBtPWJbZV07MD09PS0tbS5yZWZlcmVuY2VDb3VudCYmdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKG0pfX0sX2xlbmRBY3Rpb246ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5fYWN0aW9ucyxoPWIuX2NhY2hlSW5kZXgsbT10aGlzLl9uQWN0aXZlQWN0aW9ucysrLHU9ZVttXTtiLl9jYWNoZUluZGV4PW07ZVttXT1iO3UuX2NhY2hlSW5kZXg9aDtlW2hdPXV9LF90YWtlQmFja0FjdGlvbjpmdW5jdGlvbihiKXt2YXIgZT10aGlzLl9hY3Rpb25zLGg9Yi5fY2FjaGVJbmRleCxtPS0tdGhpcy5fbkFjdGl2ZUFjdGlvbnMsdT1lW21dO2IuX2NhY2hlSW5kZXg9bTtlW21dPWI7dS5fY2FjaGVJbmRleD1oO2VbaF09dX0sX2FkZEluYWN0aXZlQmluZGluZzpmdW5jdGlvbihiLGUsaCl7dmFyIG09dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLAp1PW1bZV0sdz10aGlzLl9iaW5kaW5nczt2b2lkIDA9PT11JiYodT17fSxtW2VdPXUpO3VbaF09YjtiLl9jYWNoZUluZGV4PXcubGVuZ3RoO3cucHVzaChiKX0sX3JlbW92ZUluYWN0aXZlQmluZGluZzpmdW5jdGlvbihiKXt2YXIgZT10aGlzLl9iaW5kaW5ncyxoPWIuYmluZGluZyxtPWgucm9vdE5vZGUudXVpZDtoPWgucGF0aDt2YXIgdT10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsdz11W21dLEE9ZVtlLmxlbmd0aC0xXTtiPWIuX2NhY2hlSW5kZXg7QS5fY2FjaGVJbmRleD1iO2VbYl09QTtlLnBvcCgpO2RlbGV0ZSB3W2hdOzA9PT1PYmplY3Qua2V5cyh3KS5sZW5ndGgmJmRlbGV0ZSB1W21dfSxfbGVuZEJpbmRpbmc6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5fYmluZGluZ3MsaD1iLl9jYWNoZUluZGV4LG09dGhpcy5fbkFjdGl2ZUJpbmRpbmdzKyssdT1lW21dO2IuX2NhY2hlSW5kZXg9bTtlW21dPWI7dS5fY2FjaGVJbmRleD1oO2VbaF09dX0sX3Rha2VCYWNrQmluZGluZzpmdW5jdGlvbihiKXt2YXIgZT0KdGhpcy5fYmluZGluZ3MsaD1iLl9jYWNoZUluZGV4LG09LS10aGlzLl9uQWN0aXZlQmluZGluZ3MsdT1lW21dO2IuX2NhY2hlSW5kZXg9bTtlW21dPWI7dS5fY2FjaGVJbmRleD1oO2VbaF09dX0sX2xlbmRDb250cm9sSW50ZXJwb2xhbnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLGU9dGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMrKyxoPWJbZV07dm9pZCAwPT09aCYmKGg9bmV3IENoKG5ldyBGbG9hdDMyQXJyYXkoMiksbmV3IEZsb2F0MzJBcnJheSgyKSwxLHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXIpLGguX19jYWNoZUluZGV4PWUsYltlXT1oKTtyZXR1cm4gaH0sX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50OmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsaD1iLl9fY2FjaGVJbmRleCxtPS0tdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMsdT1lW21dO2IuX19jYWNoZUluZGV4PQptO2VbbV09Yjt1Ll9fY2FjaGVJbmRleD1oO2VbaF09dX0sX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXI6bmV3IEZsb2F0MzJBcnJheSgxKSxjbGlwQWN0aW9uOmZ1bmN0aW9uKGIsZSl7dmFyIGg9ZXx8dGhpcy5fcm9vdCxtPWgudXVpZDtoPSJzdHJpbmciPT09dHlwZW9mIGI/UmMuZmluZEJ5TmFtZShoLGIpOmI7Yj1udWxsIT09aD9oLnV1aWQ6Yjt2YXIgdT10aGlzLl9hY3Rpb25zQnlDbGlwW2JdLHc9bnVsbDtpZih2b2lkIDAhPT11KXt3PXUuYWN0aW9uQnlSb290W21dO2lmKHZvaWQgMCE9PXcpcmV0dXJuIHc7dz11Lmtub3duQWN0aW9uc1swXTtudWxsPT09aCYmKGg9dy5fY2xpcCl9aWYobnVsbD09PWgpcmV0dXJuIG51bGw7ZT1uZXcgYm8odGhpcyxoLGUpO3RoaXMuX2JpbmRBY3Rpb24oZSx3KTt0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbihlLGIsbSk7cmV0dXJuIGV9LGV4aXN0aW5nQWN0aW9uOmZ1bmN0aW9uKGIsZSl7dmFyIGg9ZXx8dGhpcy5fcm9vdDtlPWgudXVpZDsKaD0ic3RyaW5nIj09PXR5cGVvZiBiP1JjLmZpbmRCeU5hbWUoaCxiKTpiO2I9dGhpcy5fYWN0aW9uc0J5Q2xpcFtoP2gudXVpZDpiXTtyZXR1cm4gdm9pZCAwIT09Yj9iLmFjdGlvbkJ5Um9vdFtlXXx8bnVsbDpudWxsfSxzdG9wQWxsQWN0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuX2FjdGlvbnMsZT10aGlzLl9uQWN0aXZlQWN0aW9ucyxoPXRoaXMuX2JpbmRpbmdzLG09dGhpcy5fbkFjdGl2ZUJpbmRpbmdzLHU9dGhpcy5fbkFjdGl2ZUJpbmRpbmdzPXRoaXMuX25BY3RpdmVBY3Rpb25zPTA7dSE9PWU7Kyt1KWJbdV0ucmVzZXQoKTtmb3IodT0wO3UhPT1tOysrdSloW3VdLnVzZUNvdW50PTA7cmV0dXJuIHRoaXN9LHVwZGF0ZTpmdW5jdGlvbihiKXtiKj10aGlzLnRpbWVTY2FsZTtmb3IodmFyIGU9dGhpcy5fYWN0aW9ucyxoPXRoaXMuX25BY3RpdmVBY3Rpb25zLG09dGhpcy50aW1lKz1iLHU9TWF0aC5zaWduKGIpLHc9dGhpcy5fYWNjdUluZGV4Xj0xLEE9MDtBIT09aDsrK0EpZVtBXS5fdXBkYXRlKG0sCmIsdSx3KTtiPXRoaXMuX2JpbmRpbmdzO2U9dGhpcy5fbkFjdGl2ZUJpbmRpbmdzO2ZvcihBPTA7QSE9PWU7KytBKWJbQV0uYXBwbHkodyk7cmV0dXJuIHRoaXN9LGdldFJvb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm9vdH0sdW5jYWNoZUNsaXA6ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5fYWN0aW9ucztiPWIudXVpZDt2YXIgaD10aGlzLl9hY3Rpb25zQnlDbGlwLG09aFtiXTtpZih2b2lkIDAhPT1tKXttPW0ua25vd25BY3Rpb25zO2Zvcih2YXIgdT0wLHc9bS5sZW5ndGg7dSE9PXc7Kyt1KXt2YXIgQT1tW3VdO3RoaXMuX2RlYWN0aXZhdGVBY3Rpb24oQSk7dmFyIEU9QS5fY2FjaGVJbmRleCxHPWVbZS5sZW5ndGgtMV07QS5fY2FjaGVJbmRleD1udWxsO0EuX2J5Q2xpcENhY2hlSW5kZXg9bnVsbDtHLl9jYWNoZUluZGV4PUU7ZVtFXT1HO2UucG9wKCk7dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbihBKX1kZWxldGUgaFtiXX19LHVuY2FjaGVSb290OmZ1bmN0aW9uKGIpe2I9CmIudXVpZDt2YXIgZT10aGlzLl9hY3Rpb25zQnlDbGlwO2ZvcihtIGluIGUpe3ZhciBoPWVbbV0uYWN0aW9uQnlSb290W2JdO3ZvaWQgMCE9PWgmJih0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKGgpLHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKGgpKX12YXIgbT10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWVbYl07aWYodm9pZCAwIT09bSlmb3IodmFyIHUgaW4gbSliPW1bdV0sYi5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpLHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyhiKX0sdW5jYWNoZUFjdGlvbjpmdW5jdGlvbihiLGUpe2I9dGhpcy5leGlzdGluZ0FjdGlvbihiLGUpO251bGwhPT1iJiYodGhpcy5fZGVhY3RpdmF0ZUFjdGlvbihiKSx0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbihiKSl9fSk7WmkucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBaaSh2b2lkIDA9PT10aGlzLnZhbHVlLmNsb25lP3RoaXMudmFsdWU6dGhpcy52YWx1ZS5jbG9uZSgpKX07VmsucHJvdG90eXBlPQpPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoT2UucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VmssaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcjohMCxjb3B5OmZ1bmN0aW9uKGIpe09lLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9Yi5tZXNoUGVyQXR0cmlidXRlO3JldHVybiB0aGlzfX0pO09iamVjdC5hc3NpZ24oY28ucHJvdG90eXBlLHtsaW5lUHJlY2lzaW9uOjEsc2V0OmZ1bmN0aW9uKGIsZSl7dGhpcy5yYXkuc2V0KGIsZSl9LHNldEZyb21DYW1lcmE6ZnVuY3Rpb24oYixlKXtlJiZlLmlzUGVyc3BlY3RpdmVDYW1lcmE/KHRoaXMucmF5Lm9yaWdpbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oZS5tYXRyaXhXb3JsZCksdGhpcy5yYXkuZGlyZWN0aW9uLnNldChiLngsYi55LC41KS51bnByb2plY3QoZSkuc3ViKHRoaXMucmF5Lm9yaWdpbikubm9ybWFsaXplKCksdGhpcy5jYW1lcmE9ZSk6ZSYmZS5pc09ydGhvZ3JhcGhpY0NhbWVyYT8KKHRoaXMucmF5Lm9yaWdpbi5zZXQoYi54LGIueSwoZS5uZWFyK2UuZmFyKS8oZS5uZWFyLWUuZmFyKSkudW5wcm9qZWN0KGUpLHRoaXMucmF5LmRpcmVjdGlvbi5zZXQoMCwwLC0xKS50cmFuc2Zvcm1EaXJlY3Rpb24oZS5tYXRyaXhXb3JsZCksdGhpcy5jYW1lcmE9ZSk6Y29uc29sZS5lcnJvcigiVEhSRUUuUmF5Y2FzdGVyOiBVbnN1cHBvcnRlZCBjYW1lcmEgdHlwZS4iKX0saW50ZXJzZWN0T2JqZWN0OmZ1bmN0aW9uKGIsZSxoKXtoPWh8fFtdO1drKGIsdGhpcyxoLGUpO2guc29ydChlbyk7cmV0dXJuIGh9LGludGVyc2VjdE9iamVjdHM6ZnVuY3Rpb24oYixlLGgpe2g9aHx8W107aWYoITE9PT1BcnJheS5pc0FycmF5KGIpKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzOiBvYmplY3RzIGlzIG5vdCBhbiBBcnJheS4iKSxoO2Zvcih2YXIgbT0wLHU9Yi5sZW5ndGg7bTx1O20rKylXayhiW21dLHRoaXMsaCxlKTtoLnNvcnQoZW8pO3JldHVybiBofX0pOwpPYmplY3QuYXNzaWduKGZvLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGIsZSxoKXt0aGlzLnJhZGl1cz1iO3RoaXMucGhpPWU7dGhpcy50aGV0YT1oO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihiKXt0aGlzLnJhZGl1cz1iLnJhZGl1czt0aGlzLnBoaT1iLnBoaTt0aGlzLnRoZXRhPWIudGhldGE7cmV0dXJuIHRoaXN9LG1ha2VTYWZlOmZ1bmN0aW9uKCl7dGhpcy5waGk9TWF0aC5tYXgoMUUtNixNYXRoLm1pbihNYXRoLlBJLTFFLTYsdGhpcy5waGkpKTtyZXR1cm4gdGhpc30sc2V0RnJvbVZlY3RvcjM6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuc2V0RnJvbUNhcnRlc2lhbkNvb3JkcyhiLngsYi55LGIueil9LHNldEZyb21DYXJ0ZXNpYW5Db29yZHM6ZnVuY3Rpb24oYixlLGgpe3RoaXMucmFkaXVzPU1hdGguc3FydChiKmIrZSplK2gqaCk7MD09PXRoaXMucmFkaXVzP3RoaXMucGhpPQp0aGlzLnRoZXRhPTA6KHRoaXMudGhldGE9TWF0aC5hdGFuMihiLGgpLHRoaXMucGhpPU1hdGguYWNvcyhsYi5jbGFtcChlL3RoaXMucmFkaXVzLC0xLDEpKSk7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmFzc2lnbihnby5wcm90b3R5cGUse3NldDpmdW5jdGlvbihiLGUsaCl7dGhpcy5yYWRpdXM9Yjt0aGlzLnRoZXRhPWU7dGhpcy55PWg7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGIpe3RoaXMucmFkaXVzPWIucmFkaXVzO3RoaXMudGhldGE9Yi50aGV0YTt0aGlzLnk9Yi55O3JldHVybiB0aGlzfSxzZXRGcm9tVmVjdG9yMzpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKGIueCxiLnksYi56KX0sc2V0RnJvbUNhcnRlc2lhbkNvb3JkczpmdW5jdGlvbihiLGUsaCl7dGhpcy5yYWRpdXM9TWF0aC5zcXJ0KGIqYitoKmgpO3RoaXMudGhldGE9TWF0aC5hdGFuMihiLApoKTt0aGlzLnk9ZTtyZXR1cm4gdGhpc319KTt2YXIgSG89bmV3IGQ7T2JqZWN0LmFzc2lnbihYay5wcm90b3R5cGUse3NldDpmdW5jdGlvbihiLGUpe3RoaXMubWluLmNvcHkoYik7dGhpcy5tYXguY29weShlKTtyZXR1cm4gdGhpc30sc2V0RnJvbVBvaW50czpmdW5jdGlvbihiKXt0aGlzLm1ha2VFbXB0eSgpO2Zvcih2YXIgZT0wLGg9Yi5sZW5ndGg7ZTxoO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQoYltlXSk7cmV0dXJuIHRoaXN9LHNldEZyb21DZW50ZXJBbmRTaXplOmZ1bmN0aW9uKGIsZSl7ZT1Iby5jb3B5KGUpLm11bHRpcGx5U2NhbGFyKC41KTt0aGlzLm1pbi5jb3B5KGIpLnN1YihlKTt0aGlzLm1heC5jb3B5KGIpLmFkZChlKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYil7dGhpcy5taW4uY29weShiLm1pbik7dGhpcy5tYXguY29weShiLm1heCk7cmV0dXJuIHRoaXN9LAptYWtlRW1wdHk6ZnVuY3Rpb24oKXt0aGlzLm1pbi54PXRoaXMubWluLnk9SW5maW5pdHk7dGhpcy5tYXgueD10aGlzLm1heC55PS1JbmZpbml0eTtyZXR1cm4gdGhpc30saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueX0sZ2V0Q2VudGVyOmZ1bmN0aW9uKGIpe3ZvaWQgMD09PWImJihjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYj1uZXcgZCk7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP2Iuc2V0KDAsMCk6Yi5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9LGdldFNpemU6ZnVuY3Rpb24oYil7dm9pZCAwPT09YiYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmdldFNpemUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYj1uZXcgZCk7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP2Iuc2V0KDAsMCk6Yi5zdWJWZWN0b3JzKHRoaXMubWF4LAp0aGlzLm1pbil9LGV4cGFuZEJ5UG9pbnQ6ZnVuY3Rpb24oYil7dGhpcy5taW4ubWluKGIpO3RoaXMubWF4Lm1heChiKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlWZWN0b3I6ZnVuY3Rpb24oYil7dGhpcy5taW4uc3ViKGIpO3RoaXMubWF4LmFkZChiKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlTY2FsYXI6ZnVuY3Rpb24oYil7dGhpcy5taW4uYWRkU2NhbGFyKC1iKTt0aGlzLm1heC5hZGRTY2FsYXIoYik7cmV0dXJuIHRoaXN9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYil7cmV0dXJuIGIueDx0aGlzLm1pbi54fHxiLng+dGhpcy5tYXgueHx8Yi55PHRoaXMubWluLnl8fGIueT50aGlzLm1heC55PyExOiEwfSxjb250YWluc0JveDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5taW4ueDw9Yi5taW4ueCYmYi5tYXgueDw9dGhpcy5tYXgueCYmdGhpcy5taW4ueTw9Yi5taW4ueSYmYi5tYXgueTw9dGhpcy5tYXgueX0sZ2V0UGFyYW1ldGVyOmZ1bmN0aW9uKGIsZSl7dm9pZCAwPT09ZSYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmdldFBhcmFtZXRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSwKZT1uZXcgZCk7cmV0dXJuIGUuc2V0KChiLngtdGhpcy5taW4ueCkvKHRoaXMubWF4LngtdGhpcy5taW4ueCksKGIueS10aGlzLm1pbi55KS8odGhpcy5tYXgueS10aGlzLm1pbi55KSl9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYil7cmV0dXJuIGIubWF4Lng8dGhpcy5taW4ueHx8Yi5taW4ueD50aGlzLm1heC54fHxiLm1heC55PHRoaXMubWluLnl8fGIubWluLnk+dGhpcy5tYXgueT8hMTohMH0sY2xhbXBQb2ludDpmdW5jdGlvbihiLGUpe3ZvaWQgMD09PWUmJihjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5jbGFtcFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGU9bmV3IGQpO3JldHVybiBlLmNvcHkoYikuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfSxkaXN0YW5jZVRvUG9pbnQ6ZnVuY3Rpb24oYil7cmV0dXJuIEhvLmNvcHkoYikuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpLnN1YihiKS5sZW5ndGgoKX0saW50ZXJzZWN0OmZ1bmN0aW9uKGIpe3RoaXMubWluLm1heChiLm1pbik7CnRoaXMubWF4Lm1pbihiLm1heCk7cmV0dXJuIHRoaXN9LHVuaW9uOmZ1bmN0aW9uKGIpe3RoaXMubWluLm1pbihiLm1pbik7dGhpcy5tYXgubWF4KGIubWF4KTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGIpe3RoaXMubWluLmFkZChiKTt0aGlzLm1heC5hZGQoYik7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihiKXtyZXR1cm4gYi5taW4uZXF1YWxzKHRoaXMubWluKSYmYi5tYXguZXF1YWxzKHRoaXMubWF4KX19KTt2YXIgSW89bmV3IGcsd2o9bmV3IGc7T2JqZWN0LmFzc2lnbihZay5wcm90b3R5cGUse3NldDpmdW5jdGlvbihiLGUpe3RoaXMuc3RhcnQuY29weShiKTt0aGlzLmVuZC5jb3B5KGUpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihiKXt0aGlzLnN0YXJ0LmNvcHkoYi5zdGFydCk7dGhpcy5lbmQuY29weShiLmVuZCk7cmV0dXJuIHRoaXN9LGdldENlbnRlcjpmdW5jdGlvbihiKXt2b2lkIDA9PT0KYiYmKGNvbnNvbGUud2FybigiVEhSRUUuTGluZTM6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYj1uZXcgZyk7cmV0dXJuIGIuYWRkVmVjdG9ycyh0aGlzLnN0YXJ0LHRoaXMuZW5kKS5tdWx0aXBseVNjYWxhciguNSl9LGRlbHRhOmZ1bmN0aW9uKGIpe3ZvaWQgMD09PWImJihjb25zb2xlLndhcm4oIlRIUkVFLkxpbmUzOiAuZGVsdGEoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYj1uZXcgZyk7cmV0dXJuIGIuc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KX0sZGlzdGFuY2VTcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuZW5kKX0sZGlzdGFuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvKHRoaXMuZW5kKX0sYXQ6ZnVuY3Rpb24oYixlKXt2b2lkIDA9PT1lJiYoY29uc29sZS53YXJuKCJUSFJFRS5MaW5lMzogLmF0KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGU9Cm5ldyBnKTtyZXR1cm4gdGhpcy5kZWx0YShlKS5tdWx0aXBseVNjYWxhcihiKS5hZGQodGhpcy5zdGFydCl9LGNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXI6ZnVuY3Rpb24oYixlKXtJby5zdWJWZWN0b3JzKGIsdGhpcy5zdGFydCk7d2ouc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KTtiPXdqLmRvdChJbykvd2ouZG90KHdqKTtlJiYoYj1sYi5jbGFtcChiLDAsMSkpO3JldHVybiBifSxjbG9zZXN0UG9pbnRUb1BvaW50OmZ1bmN0aW9uKGIsZSxoKXtiPXRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcihiLGUpO3ZvaWQgMD09PWgmJihjb25zb2xlLndhcm4oIlRIUkVFLkxpbmUzOiAuY2xvc2VzdFBvaW50VG9Qb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxoPW5ldyBnKTtyZXR1cm4gdGhpcy5kZWx0YShoKS5tdWx0aXBseVNjYWxhcihiKS5hZGQodGhpcy5zdGFydCl9LGFwcGx5TWF0cml4NDpmdW5jdGlvbihiKXt0aGlzLnN0YXJ0LmFwcGx5TWF0cml4NChiKTsKdGhpcy5lbmQuYXBwbHlNYXRyaXg0KGIpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuc3RhcnQuZXF1YWxzKHRoaXMuc3RhcnQpJiZiLmVuZC5lcXVhbHModGhpcy5lbmQpfX0pO0hoLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHkucHJvdG90eXBlKTtIaC5wcm90b3R5cGUuY29uc3RydWN0b3I9SGg7SGgucHJvdG90eXBlLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0PSEwO3ZhciBIZD1uZXcgZyxZZD1uZXcgZyx1bD1uZXcgbCxTcz1bImEiLCJiIiwiYyJdO0loLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFNiLnByb3RvdHlwZSk7SWgucHJvdG90eXBlLmNvbnN0cnVjdG9yPUloO0loLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLm9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCghMCk7dWwuZ2V0Tm9ybWFsTWF0cml4KHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkKTt2YXIgYj10aGlzLm9iamVjdC5tYXRyaXhXb3JsZCxlPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbiwKaD10aGlzLm9iamVjdC5nZW9tZXRyeTtpZihoJiZoLmlzR2VvbWV0cnkpZm9yKHZhciBtPWgudmVydGljZXMsdT1oLmZhY2VzLHc9aD0wLEE9dS5sZW5ndGg7dzxBO3crKylmb3IodmFyIEU9dVt3XSxHPTAsSj1FLnZlcnRleE5vcm1hbHMubGVuZ3RoO0c8SjtHKyspe3ZhciBRPUUudmVydGV4Tm9ybWFsc1tHXTtIZC5jb3B5KG1bRVtTc1tHXV1dKS5hcHBseU1hdHJpeDQoYik7WWQuY29weShRKS5hcHBseU1hdHJpeDModWwpLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHRoaXMuc2l6ZSkuYWRkKEhkKTtlLnNldFhZWihoLEhkLngsSGQueSxIZC56KTtoKz0xO2Uuc2V0WFlaKGgsWWQueCxZZC55LFlkLnopO2grPTF9ZWxzZSBpZihoJiZoLmlzQnVmZmVyR2VvbWV0cnkpZm9yKG09aC5hdHRyaWJ1dGVzLnBvc2l0aW9uLHU9aC5hdHRyaWJ1dGVzLm5vcm1hbCxHPWg9MCxKPW0uY291bnQ7RzxKO0crKylIZC5zZXQobS5nZXRYKEcpLG0uZ2V0WShHKSxtLmdldFooRykpLmFwcGx5TWF0cml4NChiKSwKWWQuc2V0KHUuZ2V0WChHKSx1LmdldFkoRyksdS5nZXRaKEcpKSxZZC5hcHBseU1hdHJpeDModWwpLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHRoaXMuc2l6ZSkuYWRkKEhkKSxlLnNldFhZWihoLEhkLngsSGQueSxIZC56KSxoKz0xLGUuc2V0WFlaKGgsWWQueCxZZC55LFlkLnopLGgrPTE7ZS5uZWVkc1VwZGF0ZT0hMH07dmFyIEpvPW5ldyBnO2hnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHkucHJvdG90eXBlKTtoZy5wcm90b3R5cGUuY29uc3RydWN0b3I9aGc7aGcucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmNvbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMuY29uZS5tYXRlcmlhbC5kaXNwb3NlKCl9O2hnLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7dmFyIGI9dGhpcy5saWdodC5kaXN0YW5jZT90aGlzLmxpZ2h0LmRpc3RhbmNlOjFFMyxlPWIqTWF0aC50YW4odGhpcy5saWdodC5hbmdsZSk7CnRoaXMuY29uZS5zY2FsZS5zZXQoZSxlLGIpO0pvLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCk7dGhpcy5jb25lLmxvb2tBdChKbyk7dm9pZCAwIT09dGhpcy5jb2xvcj90aGlzLmNvbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpOnRoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpfTt2YXIgemU9bmV3IGcseGo9bmV3IHIsdmw9bmV3IHI7aWcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoU2IucHJvdG90eXBlKTtpZy5wcm90b3R5cGUuY29uc3RydWN0b3I9aWc7aWcucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkPWZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMuYm9uZXMsaD10aGlzLmdlb21ldHJ5LG09aC5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7dmwuZ2V0SW52ZXJzZSh0aGlzLnJvb3QubWF0cml4V29ybGQpO2Zvcih2YXIgdT0wLHc9MDt1PGUubGVuZ3RoO3UrKyl7dmFyIEE9ZVt1XTtBLnBhcmVudCYmCkEucGFyZW50LmlzQm9uZSYmKHhqLm11bHRpcGx5TWF0cmljZXModmwsQS5tYXRyaXhXb3JsZCksemUuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHhqKSxtLnNldFhZWih3LHplLngsemUueSx6ZS56KSx4ai5tdWx0aXBseU1hdHJpY2VzKHZsLEEucGFyZW50Lm1hdHJpeFdvcmxkKSx6ZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oeGopLG0uc2V0WFlaKHcrMSx6ZS54LHplLnksemUueiksdys9Mil9aC5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikubmVlZHNVcGRhdGU9ITA7eS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCh0aGlzLGIpfTtqZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO2pnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1qZztqZy5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfTtqZy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5jb2xvcj8KdGhpcy5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik6dGhpcy5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpfTtrZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShtYy5wcm90b3R5cGUpO2tnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1rZztrZy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5zY2FsZS5zZXQoLjUqdGhpcy5saWdodC53aWR0aCwuNSp0aGlzLmxpZ2h0LmhlaWdodCwxKTtpZih2b2lkIDAhPT10aGlzLmNvbG9yKXRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpLHRoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpO2Vsc2V7dGhpcy5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpLm11bHRpcGx5U2NhbGFyKHRoaXMubGlnaHQuaW50ZW5zaXR5KTt2YXIgYj10aGlzLm1hdGVyaWFsLmNvbG9yLGU9TWF0aC5tYXgoYi5yLGIuZyxiLmIpOzE8ZSYmYi5tdWx0aXBseVNjYWxhcigxLwplKTt0aGlzLmNoaWxkcmVuWzBdLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5tYXRlcmlhbC5jb2xvcil9fTtrZy5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO3RoaXMuY2hpbGRyZW5bMF0uZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuZGlzcG9zZSgpfTt2YXIgVHM9bmV3IGcsS289bmV3IEksTG89bmV3IEk7bGcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeS5wcm90b3R5cGUpO2xnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1sZztsZy5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuY2hpbGRyZW5bMF0uZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuZGlzcG9zZSgpfTtsZy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jaGlsZHJlblswXTtpZih2b2lkIDAhPT10aGlzLmNvbG9yKXRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpOwplbHNle3ZhciBlPWIuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJjb2xvciIpO0tvLmNvcHkodGhpcy5saWdodC5jb2xvcik7TG8uY29weSh0aGlzLmxpZ2h0Lmdyb3VuZENvbG9yKTtmb3IodmFyIGg9MCxtPWUuY291bnQ7aDxtO2grKyl7dmFyIHU9aDxtLzI/S286TG87ZS5zZXRYWVooaCx1LnIsdS5nLHUuYil9ZS5uZWVkc1VwZGF0ZT0hMH1iLmxvb2tBdChUcy5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC5tYXRyaXhXb3JsZCkubmVnYXRlKCkpfTttZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO21nLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1tZzttZy5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfTttZy5wcm90b3R5cGUub25CZWZvcmVSZW5kZXI9ZnVuY3Rpb24oKXt0aGlzLnBvc2l0aW9uLmNvcHkodGhpcy5saWdodFByb2JlLnBvc2l0aW9uKTt0aGlzLnNjYWxlLnNldCgxLAoxLDEpLm11bHRpcGx5U2NhbGFyKHRoaXMuc2l6ZSk7dGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5pbnRlbnNpdHkudmFsdWU9dGhpcy5saWdodFByb2JlLmludGVuc2l0eX07JGkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShTYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjokaSxjb3B5OmZ1bmN0aW9uKGIpe1NiLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLmdlb21ldHJ5LmNvcHkoYi5nZW9tZXRyeSk7dGhpcy5tYXRlcmlhbC5jb3B5KGIubWF0ZXJpYWwpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19KTthai5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTYi5wcm90b3R5cGUpO2FqLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hajtuZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShtYy5wcm90b3R5cGUpO25nLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1uZztuZy5wcm90b3R5cGUudXBkYXRlPQpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoWCxpYSxoYSxzYSl7aGE9KGlhLVgpL2hhO1cuc2V0WFlaKEcsMCwwLDApO0orKztmb3IoUT1YO1E8aWE7USs9aGEpUz1HK0osVy5zZXRYWVooUyxNYXRoLnNpbihRKSpoLDAsTWF0aC5jb3MoUSkqaCksVy5zZXRYWVooUysxLE1hdGguc2luKE1hdGgubWluKFEraGEsaWEpKSpoLDAsTWF0aC5jb3MoTWF0aC5taW4oUStoYSxpYSkpKmgpLFcuc2V0WFlaKFMrMiwwLDAsMCksSis9MztULmFkZEdyb3VwKEcsSixzYSk7Rys9SjtKPTB9dmFyIGU9dGhpcy5hdWRpbyxoPXRoaXMucmFuZ2UsbT10aGlzLmRpdmlzaW9uc0lubmVyQW5nbGUsdT10aGlzLmRpdmlzaW9uc091dGVyQW5nbGUsdz1sYi5kZWdUb1JhZChlLnBhbm5lci5jb25lSW5uZXJBbmdsZSk7ZT1sYi5kZWdUb1JhZChlLnBhbm5lci5jb25lT3V0ZXJBbmdsZSk7dmFyIEE9dy8yLEU9ZS8yLEc9MCxKPTAsUSxTLFQ9dGhpcy5nZW9tZXRyeSxXPVQuYXR0cmlidXRlcy5wb3NpdGlvbjtULmNsZWFyR3JvdXBzKCk7CmIoLUUsLUEsdSwwKTtiKC1BLEEsbSwxKTtiKEEsRSx1LDApO1cubmVlZHNVcGRhdGU9ITA7dz09PWUmJih0aGlzLm1hdGVyaWFsWzBdLnZpc2libGU9ITEpfTtuZy5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWxbMF0uZGlzcG9zZSgpO3RoaXMubWF0ZXJpYWxbMV0uZGlzcG9zZSgpfTt2YXIgVmg9bmV3IGcseWo9bmV3IGcsTW89bmV3IGw7SmgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoU2IucHJvdG90eXBlKTtKaC5wcm90b3R5cGUuY29uc3RydWN0b3I9Smg7SmgucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMub2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTtNby5nZXROb3JtYWxNYXRyaXgodGhpcy5vYmplY3QubWF0cml4V29ybGQpO3ZhciBiPXRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkLGU9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGg9dGhpcy5vYmplY3QuZ2VvbWV0cnksbT0KaC52ZXJ0aWNlcztoPWguZmFjZXM7Zm9yKHZhciB1PTAsdz0wLEE9aC5sZW5ndGg7dzxBO3crKyl7dmFyIEU9aFt3XSxHPUUubm9ybWFsO1ZoLmNvcHkobVtFLmFdKS5hZGQobVtFLmJdKS5hZGQobVtFLmNdKS5kaXZpZGVTY2FsYXIoMykuYXBwbHlNYXRyaXg0KGIpO3lqLmNvcHkoRykuYXBwbHlNYXRyaXgzKE1vKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0aGlzLnNpemUpLmFkZChWaCk7ZS5zZXRYWVoodSxWaC54LFZoLnksVmgueik7dSs9MTtlLnNldFhZWih1LHlqLngseWoueSx5ai56KTt1Kz0xfWUubmVlZHNVcGRhdGU9ITB9O3ZhciBObz1uZXcgZyx6aj1uZXcgZyxPbz1uZXcgZztvZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5LnByb3RvdHlwZSk7b2cucHJvdG90eXBlLmNvbnN0cnVjdG9yPW9nO29nLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5saWdodFBsYW5lLmdlb21ldHJ5LmRpc3Bvc2UoKTt0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuZGlzcG9zZSgpOwp0aGlzLnRhcmdldExpbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5kaXNwb3NlKCl9O29nLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXtOby5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC5tYXRyaXhXb3JsZCk7emouc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkKTtPby5zdWJWZWN0b3JzKHpqLE5vKTt0aGlzLmxpZ2h0UGxhbmUubG9va0F0KHpqKTt2b2lkIDAhPT10aGlzLmNvbG9yPyh0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpLHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcikpOih0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSx0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSk7dGhpcy50YXJnZXRMaW5lLmxvb2tBdCh6aik7CnRoaXMudGFyZ2V0TGluZS5zY2FsZS56PU9vLmxlbmd0aCgpfTt2YXIgYmo9bmV3IGcsY2M9bmV3IEZiO0toLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFNiLnByb3RvdHlwZSk7S2gucHJvdG90eXBlLmNvbnN0cnVjdG9yPUtoO0toLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdlb21ldHJ5LGU9dGhpcy5wb2ludE1hcDtjYy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMuY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKTtlYygiYyIsZSxiLGNjLDAsMCwtMSk7ZWMoInQiLGUsYixjYywwLDAsMSk7ZWMoIm4xIixlLGIsY2MsLTEsLTEsLTEpO2VjKCJuMiIsZSxiLGNjLDEsLTEsLTEpO2VjKCJuMyIsZSxiLGNjLC0xLDEsLTEpO2VjKCJuNCIsZSxiLGNjLDEsMSwtMSk7ZWMoImYxIixlLGIsY2MsLTEsLTEsMSk7ZWMoImYyIixlLGIsY2MsMSwtMSwxKTtlYygiZjMiLGUsYixjYywtMSwxLDEpO2VjKCJmNCIsZSxiLGNjLDEsMSwxKTtlYygidTEiLAplLGIsY2MsLjcsMS4xLC0xKTtlYygidTIiLGUsYixjYywtLjcsMS4xLC0xKTtlYygidTMiLGUsYixjYywwLDIsLTEpO2VjKCJjZjEiLGUsYixjYywtMSwwLDEpO2VjKCJjZjIiLGUsYixjYywxLDAsMSk7ZWMoImNmMyIsZSxiLGNjLDAsLTEsMSk7ZWMoImNmNCIsZSxiLGNjLDAsMSwxKTtlYygiY24xIixlLGIsY2MsLTEsMCwtMSk7ZWMoImNuMiIsZSxiLGNjLDEsMCwtMSk7ZWMoImNuMyIsZSxiLGNjLDAsLTEsLTEpO2VjKCJjbjQiLGUsYixjYywwLDEsLTEpO2IuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLm5lZWRzVXBkYXRlPSEwfTt2YXIgQWo9bmV3IHg7UmQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoU2IucHJvdG90eXBlKTtSZC5wcm90b3R5cGUuY29uc3RydWN0b3I9UmQ7UmQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihiKXt2b2lkIDAhPT1iJiZjb25zb2xlLndhcm4oIlRIUkVFLkJveEhlbHBlcjogLnVwZGF0ZSgpIGhhcyBubyBsb25nZXIgYXJndW1lbnRzLiIpO3ZvaWQgMCE9PQp0aGlzLm9iamVjdCYmQWouc2V0RnJvbU9iamVjdCh0aGlzLm9iamVjdCk7aWYoIUFqLmlzRW1wdHkoKSl7Yj1Bai5taW47dmFyIGU9QWoubWF4LGg9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLG09aC5hcnJheTttWzBdPWUueDttWzFdPWUueTttWzJdPWUuejttWzNdPWIueDttWzRdPWUueTttWzVdPWUuejttWzZdPWIueDttWzddPWIueTttWzhdPWUuejttWzldPWUueDttWzEwXT1iLnk7bVsxMV09ZS56O21bMTJdPWUueDttWzEzXT1lLnk7bVsxNF09Yi56O21bMTVdPWIueDttWzE2XT1lLnk7bVsxN109Yi56O21bMThdPWIueDttWzE5XT1iLnk7bVsyMF09Yi56O21bMjFdPWUueDttWzIyXT1iLnk7bVsyM109Yi56O2gubmVlZHNVcGRhdGU9ITA7dGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKX19O1JkLnByb3RvdHlwZS5zZXRGcm9tT2JqZWN0PWZ1bmN0aW9uKGIpe3RoaXMub2JqZWN0PWI7dGhpcy51cGRhdGUoKTtyZXR1cm4gdGhpc307UmQucHJvdG90eXBlLmNvcHk9CmZ1bmN0aW9uKGIpe1NiLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxiKTt0aGlzLm9iamVjdD1iLm9iamVjdDtyZXR1cm4gdGhpc307UmQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfTtMaC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTYi5wcm90b3R5cGUpO0xoLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1MaDtMaC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQ9ZnVuY3Rpb24oYil7dmFyIGU9dGhpcy5ib3g7ZS5pc0VtcHR5KCl8fChlLmdldENlbnRlcih0aGlzLnBvc2l0aW9uKSxlLmdldFNpemUodGhpcy5zY2FsZSksdGhpcy5zY2FsZS5tdWx0aXBseVNjYWxhciguNSkseS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCh0aGlzLGIpKX07TWgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobWMucHJvdG90eXBlKTtNaC5wcm90b3R5cGUuY29uc3RydWN0b3I9TWg7TWgucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkPQpmdW5jdGlvbihiKXt2YXIgZT0tdGhpcy5wbGFuZS5jb25zdGFudDsxRS04Pk1hdGguYWJzKGUpJiYoZT0xRS04KTt0aGlzLnNjYWxlLnNldCguNSp0aGlzLnNpemUsLjUqdGhpcy5zaXplLGUpO3RoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuc2lkZT0wPmU/MTowO3RoaXMubG9va0F0KHRoaXMucGxhbmUubm9ybWFsKTt5LnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYil9O3ZhciBQbz1uZXcgZyxjaixaaztTZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5LnByb3RvdHlwZSk7U2QucHJvdG90eXBlLmNvbnN0cnVjdG9yPVNkO1NkLnByb3RvdHlwZS5zZXREaXJlY3Rpb249ZnVuY3Rpb24oYil7Ljk5OTk5PGIueT90aGlzLnF1YXRlcm5pb24uc2V0KDAsMCwwLDEpOi0uOTk5OTk+Yi55P3RoaXMucXVhdGVybmlvbi5zZXQoMSwwLDAsMCk6KFBvLnNldChiLnosMCwtYi54KS5ub3JtYWxpemUoKSx0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZShQbyxNYXRoLmFjb3MoYi55KSkpfTsKU2QucHJvdG90eXBlLnNldExlbmd0aD1mdW5jdGlvbihiLGUsaCl7dm9pZCAwPT09ZSYmKGU9LjIqYik7dm9pZCAwPT09aCYmKGg9LjIqZSk7dGhpcy5saW5lLnNjYWxlLnNldCgxLE1hdGgubWF4KDAsYi1lKSwxKTt0aGlzLmxpbmUudXBkYXRlTWF0cml4KCk7dGhpcy5jb25lLnNjYWxlLnNldChoLGUsaCk7dGhpcy5jb25lLnBvc2l0aW9uLnk9Yjt0aGlzLmNvbmUudXBkYXRlTWF0cml4KCl9O1NkLnByb3RvdHlwZS5zZXRDb2xvcj1mdW5jdGlvbihiKXt0aGlzLmxpbmUubWF0ZXJpYWwuY29sb3Iuc2V0KGIpO3RoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5zZXQoYil9O1NkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGIpe3kucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGIsITEpO3RoaXMubGluZS5jb3B5KGIubGluZSk7dGhpcy5jb25lLmNvcHkoYi5jb25lKTtyZXR1cm4gdGhpc307U2QucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfTsKTmgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoU2IucHJvdG90eXBlKTtOaC5wcm90b3R5cGUuY29uc3RydWN0b3I9Tmg7YWIuY3JlYXRlPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS5sb2coIlRIUkVFLkN1cnZlLmNyZWF0ZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQiKTtiLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGFiLnByb3RvdHlwZSk7Yi5wcm90b3R5cGUuY29uc3RydWN0b3I9YjtiLnByb3RvdHlwZS5nZXRQb2ludD1lO3JldHVybiBifTtPYmplY3QuYXNzaWduKFFkLnByb3RvdHlwZSx7Y3JlYXRlUG9pbnRzR2VvbWV0cnk6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVQb2ludHNHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLiIpO2I9dGhpcy5nZXRQb2ludHMoYik7cmV0dXJuIHRoaXMuY3JlYXRlR2VvbWV0cnkoYil9LGNyZWF0ZVNwYWNlZFBvaW50c0dlb21ldHJ5OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuQ3VydmVQYXRoOiAuY3JlYXRlU3BhY2VkUG9pbnRzR2VvbWV0cnkoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyggcG9pbnRzICkgaW5zdGVhZC4iKTsKYj10aGlzLmdldFNwYWNlZFBvaW50cyhiKTtyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeShiKX0sY3JlYXRlR2VvbWV0cnk6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLiIpO2Zvcih2YXIgZT1uZXcgemEsaD0wLG09Yi5sZW5ndGg7aDxtO2grKyl7dmFyIHU9YltoXTtlLnZlcnRpY2VzLnB1c2gobmV3IGcodS54LHUueSx1Lnp8fDApKX1yZXR1cm4gZX19KTtPYmplY3QuYXNzaWduKGlkLnByb3RvdHlwZSx7ZnJvbVBvaW50czpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLlBhdGg6IC5mcm9tUG9pbnRzKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbVBvaW50cygpLiIpO3RoaXMuc2V0RnJvbVBvaW50cyhiKX19KTtpby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh1Yy5wcm90b3R5cGUpOwpqby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh1Yy5wcm90b3R5cGUpOyRrLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHVjLnByb3RvdHlwZSk7T2JqZWN0LmFzc2lnbigkay5wcm90b3R5cGUse2luaXRGcm9tQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TcGxpbmU6IC5pbml0RnJvbUFycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sZ2V0Q29udHJvbFBvaW50c0FycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU3BsaW5lOiAuZ2V0Q29udHJvbFBvaW50c0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0scmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU3BsaW5lOiAucmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTskaS5wcm90b3R5cGUuc2V0Q29sb3JzPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuR3JpZEhlbHBlcjogc2V0Q29sb3JzKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCwgcGFzcyB0aGVtIGluIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkLiIpfTsKaWcucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNrZWxldG9uSGVscGVyOiB1cGRhdGUoKSBubyBsb25nZXIgbmVlZHMgdG8gYmUgY2FsbGVkLiIpfTtPYmplY3QuYXNzaWduKEtiLnByb3RvdHlwZSx7ZXh0cmFjdFVybEJhc2U6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5Mb2FkZXI6IC5leHRyYWN0VXJsQmFzZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5Mb2FkZXJVdGlscy5leHRyYWN0VXJsQmFzZSgpIGluc3RlYWQuIik7cmV0dXJuIHNsLmV4dHJhY3RVcmxCYXNlKGIpfX0pO09iamVjdC5hc3NpZ24oV2kucHJvdG90eXBlLHtzZXRUZXh0dXJlUGF0aDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogLnNldFRleHR1cmVQYXRoKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0UmVzb3VyY2VQYXRoKCkuIik7cmV0dXJuIHRoaXMuc2V0UmVzb3VyY2VQYXRoKGIpfX0pO09iamVjdC5hc3NpZ24oWGsucHJvdG90eXBlLAp7Y2VudGVyOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLiIpO3JldHVybiB0aGlzLmdldENlbnRlcihiKX0sZW1wdHk6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5lbXB0eSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmlzRW1wdHkoKS4iKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCl9LGlzSW50ZXJzZWN0aW9uQm94OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLiIpO3JldHVybiB0aGlzLmludGVyc2VjdHNCb3goYil9LHNpemU6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUoKS4iKTtyZXR1cm4gdGhpcy5nZXRTaXplKGIpfX0pO09iamVjdC5hc3NpZ24oeC5wcm90b3R5cGUsCntjZW50ZXI6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuIik7cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKGIpfSxlbXB0eTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLiIpO3JldHVybiB0aGlzLmlzRW1wdHkoKX0saXNJbnRlcnNlY3Rpb25Cb3g6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuIik7cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveChiKX0saXNJbnRlcnNlY3Rpb25TcGhlcmU6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuaXNJbnRlcnNlY3Rpb25TcGhlcmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzU3BoZXJlKCkuIik7cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZShiKX0sCnNpemU6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUoKS4iKTtyZXR1cm4gdGhpcy5nZXRTaXplKGIpfX0pO1lrLnByb3RvdHlwZS5jZW50ZXI9ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5MaW5lMzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLiIpO3JldHVybiB0aGlzLmdldENlbnRlcihiKX07T2JqZWN0LmFzc2lnbihsYix7cmFuZG9tMTY6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGg6IC5yYW5kb20xNigpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBNYXRoLnJhbmRvbSgpIGluc3RlYWQuIik7cmV0dXJuIE1hdGgucmFuZG9tKCl9LG5lYXJlc3RQb3dlck9mVHdvOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0aDogLm5lYXJlc3RQb3dlck9mVHdvKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZmxvb3JQb3dlck9mVHdvKCkuIik7CnJldHVybiBsYi5mbG9vclBvd2VyT2ZUd28oYil9LG5leHRQb3dlck9mVHdvOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0aDogLm5leHRQb3dlck9mVHdvKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY2VpbFBvd2VyT2ZUd28oKS4iKTtyZXR1cm4gbGIuY2VpbFBvd2VyT2ZUd28oYil9fSk7T2JqZWN0LmFzc2lnbihsLnByb3RvdHlwZSx7ZmxhdHRlblRvQXJyYXlPZmZzZXQ6ZnVuY3Rpb24oYixlKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDM6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuIik7cmV0dXJuIHRoaXMudG9BcnJheShiLGUpfSxtdWx0aXBseVZlY3RvcjM6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDMoIG1hdHJpeCApIGluc3RlYWQuIik7cmV0dXJuIGIuYXBwbHlNYXRyaXgzKHRoaXMpfSwKbXVsdGlwbHlWZWN0b3IzQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhcHBseVRvQnVmZmVyOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4MzogLmFwcGx5VG9CdWZmZXIoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZShiKX0sYXBwbHlUb1ZlY3RvcjNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDM6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtPYmplY3QuYXNzaWduKHIucHJvdG90eXBlLHtleHRyYWN0UG9zaXRpb246ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuZXh0cmFjdFBvc2l0aW9uKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY29weVBvc2l0aW9uKCkuIik7CnJldHVybiB0aGlzLmNvcHlQb3NpdGlvbihiKX0sZmxhdHRlblRvQXJyYXlPZmZzZXQ6ZnVuY3Rpb24oYixlKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuIik7cmV0dXJuIHRoaXMudG9BcnJheShiLGUpfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmdldFBvc2l0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLiIpO3JldHVybihuZXcgZykuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDMpfSxzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLnNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbigpLiIpOwpyZXR1cm4gdGhpcy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihiKX0sbXVsdGlwbHlUb0FycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlUb0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sbXVsdGlwbHlWZWN0b3IzOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLiIpO3JldHVybiBiLmFwcGx5TWF0cml4NCh0aGlzKX0sbXVsdGlwbHlWZWN0b3I0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yNCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLiIpO3JldHVybiBiLmFwcGx5TWF0cml4NCh0aGlzKX0sbXVsdGlwbHlWZWN0b3IzQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSwKcm90YXRlQXhpczpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMudHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLiIpO2IudHJhbnNmb3JtRGlyZWN0aW9uKHRoaXMpfSxjcm9zc1ZlY3RvcjpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5jcm9zc1ZlY3RvcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLiIpO3JldHVybiBiLmFwcGx5TWF0cml4NCh0aGlzKX0sdHJhbnNsYXRlOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLnRyYW5zbGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHJvdGF0ZVg6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlWCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHJvdGF0ZVk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlWSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LApyb3RhdGVaOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLnJvdGF0ZVooKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyb3RhdGVCeUF4aXM6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlQnlBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYXBwbHlUb0J1ZmZlcjpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5hcHBseVRvQnVmZmVyKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoYil9LGFwcGx5VG9WZWN0b3IzQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAuYXBwbHlUb1ZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LG1ha2VGcnVzdHVtOmZ1bmN0aW9uKGIsZSxoLG0sdSx3KXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tYWtlRnJ1c3R1bSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAubWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIGluc3RlYWQuIik7CnJldHVybiB0aGlzLm1ha2VQZXJzcGVjdGl2ZShiLGUsbSxoLHUsdyl9fSk7UmIucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uTGluZT1mdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLlBsYW5lOiAuaXNJbnRlcnNlY3Rpb25MaW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0xpbmUoKS4iKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzTGluZShiKX07Zi5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzPWZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBpcyBub3cgdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApIGluc3RlYWQuIik7cmV0dXJuIGIuYXBwbHlRdWF0ZXJuaW9uKHRoaXMpfTtPYmplY3QuYXNzaWduKEQucHJvdG90eXBlLHtpc0ludGVyc2VjdGlvbkJveDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLiIpOwpyZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KGIpfSxpc0ludGVyc2VjdGlvblBsYW5lOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25QbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNQbGFuZSgpLiIpO3JldHVybiB0aGlzLmludGVyc2VjdHNQbGFuZShiKX0saXNJbnRlcnNlY3Rpb25TcGhlcmU6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4iKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKGIpfX0pO09iamVjdC5hc3NpZ24oQi5wcm90b3R5cGUse2FyZWE6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAuYXJlYSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEFyZWEoKS4iKTtyZXR1cm4gdGhpcy5nZXRBcmVhKCl9LGJhcnljb29yZEZyb21Qb2ludDpmdW5jdGlvbihiLAplKXtjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAuYmFyeWNvb3JkRnJvbVBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QmFyeWNvb3JkKCkuIik7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKGIsZSl9LG1pZHBvaW50OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5taWRwb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE1pZHBvaW50KCkuIik7cmV0dXJuIHRoaXMuZ2V0TWlkcG9pbnQoYil9LG5vcm1hbDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAubm9ybWFsKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Tm9ybWFsKCkuIik7cmV0dXJuIHRoaXMuZ2V0Tm9ybWFsKGIpfSxwbGFuZTpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlOiAucGxhbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRQbGFuZSgpLiIpO3JldHVybiB0aGlzLmdldFBsYW5lKGIpfX0pO09iamVjdC5hc3NpZ24oQiwKe2Jhcnljb29yZEZyb21Qb2ludDpmdW5jdGlvbihiLGUsaCxtLHUpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5iYXJ5Y29vcmRGcm9tUG9pbnQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRCYXJ5Y29vcmQoKS4iKTtyZXR1cm4gQi5nZXRCYXJ5Y29vcmQoYixlLGgsbSx1KX0sbm9ybWFsOmZ1bmN0aW9uKGIsZSxoLG0pe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5ub3JtYWwoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXROb3JtYWwoKS4iKTtyZXR1cm4gQi5nZXROb3JtYWwoYixlLGgsbSl9fSk7T2JqZWN0LmFzc2lnbih0ZS5wcm90b3R5cGUse2V4dHJhY3RBbGxQb2ludHM6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5TaGFwZTogLmV4dHJhY3RBbGxQb2ludHMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmV4dHJhY3RQb2ludHMoKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLmV4dHJhY3RQb2ludHMoYil9LGV4dHJ1ZGU6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5TaGFwZTogLmV4dHJ1ZGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXh0cnVkZUdlb21ldHJ5KCkgaW5zdGVhZC4iKTsKcmV0dXJuIG5ldyBTZSh0aGlzLGIpfSxtYWtlR2VvbWV0cnk6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5TaGFwZTogLm1ha2VHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBTaGFwZUdlb21ldHJ5KCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IFRlKHRoaXMsYil9fSk7T2JqZWN0LmFzc2lnbihkLnByb3RvdHlwZSx7ZnJvbUF0dHJpYnV0ZTpmdW5jdGlvbihiLGUsaCl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTtyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKGIsZSxoKX0sZGlzdGFuY2VUb01hbmhhdHRhbjpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5kaXN0YW5jZVRvTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuRGlzdGFuY2VUbygpLiIpO3JldHVybiB0aGlzLm1hbmhhdHRhbkRpc3RhbmNlVG8oYil9LApsZW5ndGhNYW5oYXR0YW46ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4iKTtyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKX19KTtPYmplY3QuYXNzaWduKGcucHJvdG90eXBlLHtzZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlZlY3RvcjM6IC5zZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBpbnN0ZWFkLiIpfSxzZXRFdWxlckZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuVmVjdG9yMzogLnNldEV1bGVyRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXVsZXIuc2V0RnJvbVF1YXRlcm5pb24oKSBpbnN0ZWFkLiIpfSxnZXRQb3NpdGlvbkZyb21NYXRyaXg6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZ2V0UG9zaXRpb25Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCkuIik7CnJldHVybiB0aGlzLnNldEZyb21NYXRyaXhQb3NpdGlvbihiKX0sZ2V0U2NhbGVGcm9tTWF0cml4OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmdldFNjYWxlRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhTY2FsZSgpLiIpO3JldHVybiB0aGlzLnNldEZyb21NYXRyaXhTY2FsZShiKX0sZ2V0Q29sdW1uRnJvbU1hdHJpeDpmdW5jdGlvbihiLGUpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmdldENvbHVtbkZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4Q29sdW1uKCkuIik7cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbihlLGIpfSxhcHBseVByb2plY3Rpb246ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuYXBwbHlQcm9qZWN0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5hcHBseU1hdHJpeDQoIG0gKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLmFwcGx5TWF0cml4NChiKX0sCmZyb21BdHRyaWJ1dGU6ZnVuY3Rpb24oYixlLGgpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuIik7cmV0dXJuIHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShiLGUsaCl9LGRpc3RhbmNlVG9NYW5oYXR0YW46ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZGlzdGFuY2VUb01hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkRpc3RhbmNlVG8oKS4iKTtyZXR1cm4gdGhpcy5tYW5oYXR0YW5EaXN0YW5jZVRvKGIpfSxsZW5ndGhNYW5oYXR0YW46ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4iKTtyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKX19KTtPYmplY3QuYXNzaWduKG4ucHJvdG90eXBlLAp7ZnJvbUF0dHJpYnV0ZTpmdW5jdGlvbihiLGUsaCl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3I0OiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTtyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKGIsZSxoKX0sbGVuZ3RoTWFuaGF0dGFuOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3I0OiAubGVuZ3RoTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuTGVuZ3RoKCkuIik7cmV0dXJuIHRoaXMubWFuaGF0dGFuTGVuZ3RoKCl9fSk7T2JqZWN0LmFzc2lnbih6YS5wcm90b3R5cGUse2NvbXB1dGVUYW5nZW50czpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sY29tcHV0ZUxpbmVEaXN0YW5jZXM6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5HZW9tZXRyeTogLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBpbnN0ZWFkLiIpfX0pOwpPYmplY3QuYXNzaWduKHkucHJvdG90eXBlLHtnZXRDaGlsZEJ5TmFtZTpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuZ2V0Q2hpbGRCeU5hbWUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRPYmplY3RCeU5hbWUoKS4iKTtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeU5hbWUoYil9LHJlbmRlckRlcHRoOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnJlbmRlckRlcHRoIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAucmVuZGVyT3JkZXIsIGluc3RlYWQuIil9LHRyYW5zbGF0ZTpmdW5jdGlvbihiLGUpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKSBpbnN0ZWFkLiIpO3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhlLGIpfSxnZXRXb3JsZFJvdGF0aW9uOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFJvdGF0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk9iamVjdDNELmdldFdvcmxkUXVhdGVybmlvbiggdGFyZ2V0ICkgaW5zdGVhZC4iKX19KTsKT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeS5wcm90b3R5cGUse2V1bGVyT3JkZXI6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuIik7cmV0dXJuIHRoaXMucm90YXRpb24ub3JkZXJ9LHNldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuZXVsZXJPcmRlciBpcyBub3cgLnJvdGF0aW9uLm9yZGVyLiIpO3RoaXMucm90YXRpb24ub3JkZXI9Yn19LHVzZVF1YXRlcm5pb246e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuIil9fX0pOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlaC5wcm90b3R5cGUse29iamVjdHM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTE9EOiAub2JqZWN0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5sZXZlbHMuIik7cmV0dXJuIHRoaXMubGV2ZWxzfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoemkucHJvdG90eXBlLCJ1c2VWZXJ0ZXhUZXh0dXJlIix7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbjogdXNlVmVydGV4VGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlNrZWxldG9uOiB1c2VWZXJ0ZXhUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIil9fSk7ZmgucHJvdG90eXBlLmluaXRCb25lcz1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNraW5uZWRNZXNoOiBpbml0Qm9uZXMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYWIucHJvdG90eXBlLAoiX19hcmNMZW5ndGhEaXZpc2lvbnMiLHtnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlOiAuX19hcmNMZW5ndGhEaXZpc2lvbnMgaXMgbm93IC5hcmNMZW5ndGhEaXZpc2lvbnMuIik7cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zfSxzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZTogLl9fYXJjTGVuZ3RoRGl2aXNpb25zIGlzIG5vdyAuYXJjTGVuZ3RoRGl2aXNpb25zLiIpO3RoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPWJ9fSk7QWIucHJvdG90eXBlLnNldExlbnM9ZnVuY3Rpb24oYixlKXtjb25zb2xlLndhcm4oIlRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhLnNldExlbnMgaXMgZGVwcmVjYXRlZC4gVXNlIC5zZXRGb2NhbExlbmd0aCBhbmQgLmZpbG1HYXVnZSBmb3IgYSBwaG90b2dyYXBoaWMgc2V0dXAuIik7dm9pZCAwIT09ZSYmKHRoaXMuZmlsbUdhdWdlPWUpO3RoaXMuc2V0Rm9jYWxMZW5ndGgoYil9O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFViLnByb3RvdHlwZSwKe29ubHlTaGFkb3c6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5vbmx5U2hhZG93IGhhcyBiZWVuIHJlbW92ZWQuIil9fSxzaGFkb3dDYW1lcmFGb3Y6e3NldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhRm92IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5mb3YuIik7dGhpcy5zaGFkb3cuY2FtZXJhLmZvdj1ifX0sc2hhZG93Q2FtZXJhTGVmdDp7c2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFMZWZ0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5sZWZ0LiIpO3RoaXMuc2hhZG93LmNhbWVyYS5sZWZ0PWJ9fSxzaGFkb3dDYW1lcmFSaWdodDp7c2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFSaWdodCBpcyBub3cgLnNoYWRvdy5jYW1lcmEucmlnaHQuIik7dGhpcy5zaGFkb3cuY2FtZXJhLnJpZ2h0PWJ9fSxzaGFkb3dDYW1lcmFUb3A6e3NldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVG9wIGlzIG5vdyAuc2hhZG93LmNhbWVyYS50b3AuIik7CnRoaXMuc2hhZG93LmNhbWVyYS50b3A9Yn19LHNoYWRvd0NhbWVyYUJvdHRvbTp7c2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFCb3R0b20gaXMgbm93IC5zaGFkb3cuY2FtZXJhLmJvdHRvbS4iKTt0aGlzLnNoYWRvdy5jYW1lcmEuYm90dG9tPWJ9fSxzaGFkb3dDYW1lcmFOZWFyOntzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYU5lYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLm5lYXIuIik7dGhpcy5zaGFkb3cuY2FtZXJhLm5lYXI9Yn19LHNoYWRvd0NhbWVyYUZhcjp7c2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZhci4iKTt0aGlzLnNoYWRvdy5jYW1lcmEuZmFyPWJ9fSxzaGFkb3dDYW1lcmFWaXNpYmxlOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVmlzaWJsZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkNhbWVyYUhlbHBlciggbGlnaHQuc2hhZG93LmNhbWVyYSApIGluc3RlYWQuIil9fSwKc2hhZG93Qmlhczp7c2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dCaWFzIGlzIG5vdyAuc2hhZG93LmJpYXMuIik7dGhpcy5zaGFkb3cuYmlhcz1ifX0sc2hhZG93RGFya25lc3M6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dEYXJrbmVzcyBoYXMgYmVlbiByZW1vdmVkLiIpfX0sc2hhZG93TWFwV2lkdGg6e3NldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93TWFwV2lkdGggaXMgbm93IC5zaGFkb3cubWFwU2l6ZS53aWR0aC4iKTt0aGlzLnNoYWRvdy5tYXBTaXplLndpZHRoPWJ9fSxzaGFkb3dNYXBIZWlnaHQ6e3NldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93TWFwSGVpZ2h0IGlzIG5vdyAuc2hhZG93Lm1hcFNpemUuaGVpZ2h0LiIpO3RoaXMuc2hhZG93Lm1hcFNpemUuaGVpZ2h0PWJ9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFIucHJvdG90eXBlLAp7bGVuZ3RoOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmxlbmd0aCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmNvdW50IGluc3RlYWQuIik7cmV0dXJuIHRoaXMuYXJyYXkubGVuZ3RofX0sY29weUluZGljZXNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmNvcHlJbmRpY2VzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfX0pO09iamVjdC5hc3NpZ24oeGEucHJvdG90eXBlLHthZGRJbmRleDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkSW5kZXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRJbmRleCgpLiIpO3RoaXMuc2V0SW5kZXgoYil9LGFkZERyYXdDYWxsOmZ1bmN0aW9uKGIsZSxoKXt2b2lkIDAhPT1oJiZjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkRHJhd0NhbGwoKSBubyBsb25nZXIgc3VwcG9ydHMgaW5kZXhPZmZzZXQuIik7CmNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGREcmF3Q2FsbCgpIGlzIG5vdyAuYWRkR3JvdXAoKS4iKTt0aGlzLmFkZEdyb3VwKGIsZSl9LGNsZWFyRHJhd0NhbGxzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNsZWFyRHJhd0NhbGxzKCkgaXMgbm93IC5jbGVhckdyb3VwcygpLiIpO3RoaXMuY2xlYXJHcm91cHMoKX0sY29tcHV0ZVRhbmdlbnRzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGNvbXB1dGVPZmZzZXRzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVPZmZzZXRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh4YS5wcm90b3R5cGUse2RyYXdjYWxsczp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5kcmF3Y2FsbHMgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ3JvdXBzLiIpOwpyZXR1cm4gdGhpcy5ncm91cHN9fSxvZmZzZXRzOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAub2Zmc2V0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuIik7cmV0dXJuIHRoaXMuZ3JvdXBzfX19KTtPYmplY3QuYXNzaWduKHpkLnByb3RvdHlwZSx7Z2V0QXJyYXlzOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiAuZ2V0QXJyYXlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYWRkU2hhcGVMaXN0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiAuYWRkU2hhcGVMaXN0KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYWRkU2hhcGU6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IC5hZGRTaGFwZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoWmkucHJvdG90eXBlLAp7ZHluYW1pYzp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5Vbmlmb3JtOiAuZHluYW1pYyBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4iKX19LG9uVXBkYXRlOnt2YWx1ZTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuVW5pZm9ybTogLm9uVXBkYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG9iamVjdC5vbkJlZm9yZVJlbmRlcigpIGluc3RlYWQuIik7cmV0dXJuIHRoaXN9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE0ucHJvdG90eXBlLHt3cmFwQXJvdW5kOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLiIpfX0sb3ZlcmRyYXc6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6IC5vdmVyZHJhdyBoYXMgYmVlbiByZW1vdmVkLiIpfSwKc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbDogLm92ZXJkcmF3IGhhcyBiZWVuIHJlbW92ZWQuIil9fSx3cmFwUkdCOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAud3JhcFJHQiBoYXMgYmVlbiByZW1vdmVkLiIpO3JldHVybiBuZXcgSX19LHNoYWRpbmc6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLiIrdGhpcy50eXBlKyI6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLiIpO3RoaXMuZmxhdFNoYWRpbmc9MT09PWJ9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGRkLnByb3RvdHlwZSx7bWV0YWw6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw6IC5tZXRhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgaW5zdGVhZC4iKTsKcmV0dXJuITF9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw6IC5tZXRhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgaW5zdGVhZCIpfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh1Yi5wcm90b3R5cGUse2Rlcml2YXRpdmVzOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlc30sc2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuIFNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuIik7dGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzPWJ9fX0pO09iamVjdC5hc3NpZ24ocmsucHJvdG90eXBlLAp7Y2xlYXJUYXJnZXQ6ZnVuY3Rpb24oYixlLGgsbSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuY2xlYXJUYXJnZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnNldFJlbmRlclRhcmdldCgpIGFuZCAuY2xlYXIoKSBpbnN0ZWFkLiIpO3RoaXMuc2V0UmVuZGVyVGFyZ2V0KGIpO3RoaXMuY2xlYXIoZSxoLG0pfSxhbmltYXRlOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFuaW1hdGUoKSBpcyBub3cgLnNldEFuaW1hdGlvbkxvb3AoKS4iKTt0aGlzLnNldEFuaW1hdGlvbkxvb3AoYil9LGdldEN1cnJlbnRSZW5kZXJUYXJnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRDdXJyZW50UmVuZGVyVGFyZ2V0KCkgaXMgbm93IC5nZXRSZW5kZXJUYXJnZXQoKS4iKTtyZXR1cm4gdGhpcy5nZXRSZW5kZXJUYXJnZXQoKX0sZ2V0TWF4QW5pc290cm9weTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldE1heEFuaXNvdHJvcHkoKSBpcyBub3cgLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCkuIik7CnJldHVybiB0aGlzLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCl9LGdldFByZWNpc2lvbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldFByZWNpc2lvbigpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLnByZWNpc2lvbi4iKTtyZXR1cm4gdGhpcy5jYXBhYmlsaXRpZXMucHJlY2lzaW9ufSxyZXNldEdMU3RhdGU6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5yZXNldEdMU3RhdGUoKSBpcyBub3cgLnN0YXRlLnJlc2V0KCkuIik7cmV0dXJuIHRoaXMuc3RhdGUucmVzZXQoKX0sc3VwcG9ydHNGbG9hdFRleHR1cmVzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJPRVNfdGV4dHVyZV9mbG9hdCIpfSwKc3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlczpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSGFsZkZsb2F0VGV4dHVyZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKS4iKTtyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCgiT0VTX3RleHR1cmVfaGFsZl9mbG9hdCIpfSxzdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMiKX0sc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVMzVEM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKS4iKTsKcmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil9LHN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQzpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICkuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpfSxzdXBwb3J0c0JsZW5kTWluTWF4OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNCbGVuZE1pbk1heCgpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdFWFRfYmxlbmRfbWlubWF4JyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJFWFRfYmxlbmRfbWlubWF4Iil9LHN1cHBvcnRzVmVydGV4VGV4dHVyZXM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1ZlcnRleFRleHR1cmVzKCkgaXMgbm93IC5jYXBhYmlsaXRpZXMudmVydGV4VGV4dHVyZXMuIik7CnJldHVybiB0aGlzLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlc30sc3VwcG9ydHNJbnN0YW5jZWRBcnJheXM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0luc3RhbmNlZEFycmF5cygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIil9LGVuYWJsZVNjaXNzb3JUZXN0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmVuYWJsZVNjaXNzb3JUZXN0KCkgaXMgbm93IC5zZXRTY2lzc29yVGVzdCgpLiIpO3RoaXMuc2V0U2Npc3NvclRlc3QoYil9LGluaXRNYXRlcmlhbDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmluaXRNYXRlcmlhbCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGFkZFByZVBsdWdpbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFkZFByZVBsdWdpbigpIGhhcyBiZWVuIHJlbW92ZWQuIil9LAphZGRQb3N0UGx1Z2luOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWRkUG9zdFBsdWdpbigpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHVwZGF0ZVNoYWRvd01hcDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnVwZGF0ZVNoYWRvd01hcCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldEZhY2VDdWxsaW5nOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0RmFjZUN1bGxpbmcoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhbGxvY1RleHR1cmVVbml0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWxsb2NUZXh0dXJlVW5pdCgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldFRleHR1cmU6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRUZXh0dXJlKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sc2V0VGV4dHVyZTJEOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZTJEKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sCnNldFRleHR1cmVDdWJlOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZUN1YmUoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxnZXRBY3RpdmVNaXBNYXBMZXZlbDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldEFjdGl2ZU1pcE1hcExldmVsKCkgaXMgbm93IC5nZXRBY3RpdmVNaXBtYXBMZXZlbCgpLiIpO3JldHVybiB0aGlzLmdldEFjdGl2ZU1pcG1hcExldmVsKCl9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMocmsucHJvdG90eXBlLHtzaGFkb3dNYXBFbmFibGVkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaGFkb3dNYXAuZW5hYmxlZH0sc2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEVuYWJsZWQgaXMgbm93IC5zaGFkb3dNYXAuZW5hYmxlZC4iKTt0aGlzLnNoYWRvd01hcC5lbmFibGVkPWJ9fSxzaGFkb3dNYXBUeXBlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaGFkb3dNYXAudHlwZX0sCnNldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBUeXBlIGlzIG5vdyAuc2hhZG93TWFwLnR5cGUuIik7dGhpcy5zaGFkb3dNYXAudHlwZT1ifX0sc2hhZG93TWFwQ3VsbEZhY2U6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9fSxjb250ZXh0OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5jb250ZXh0IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuZ2V0Q29udGV4dCgpIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuZ2V0Q29udGV4dCgpfX19KTsKT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRW4ucHJvdG90eXBlLHtjdWxsRmFjZTp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5jdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX0scmVuZGVyUmV2ZXJzZVNpZGVkOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyUmV2ZXJzZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX19LApyZW5kZXJTaW5nbGVTaWRlZDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclNpbmdsZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJTaW5nbGVTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhiYy5wcm90b3R5cGUse2FjdGl2ZUN1YmVGYWNlOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0Q3ViZTogLmFjdGl2ZUN1YmVGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIEl0IGlzIG5vdyB0aGUgc2Vjb25kIHBhcmFtZXRlciBvZiBXZWJHTFJlbmRlcmVyLnNldFJlbmRlclRhcmdldCgpLiIpfX0sCmFjdGl2ZU1pcE1hcExldmVsOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0Q3ViZTogLmFjdGl2ZU1pcE1hcExldmVsIGhhcyBiZWVuIHJlbW92ZWQuIEl0IGlzIG5vdyB0aGUgdGhpcmQgcGFyYW1ldGVyIG9mIFdlYkdMUmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCkuIil9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHAucHJvdG90eXBlLHt3cmFwUzp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBTfSxzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4iKTt0aGlzLnRleHR1cmUud3JhcFM9Yn19LHdyYXBUOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULiIpOwpyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBUfSxzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBUIGlzIG5vdyAudGV4dHVyZS53cmFwVC4iKTt0aGlzLnRleHR1cmUud3JhcFQ9Yn19LG1hZ0ZpbHRlcjp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLiIpO3JldHVybiB0aGlzLnRleHR1cmUubWFnRmlsdGVyfSxzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLiIpO3RoaXMudGV4dHVyZS5tYWdGaWx0ZXI9Yn19LG1pbkZpbHRlcjp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1pbkZpbHRlciBpcyBub3cgLnRleHR1cmUubWluRmlsdGVyLiIpO3JldHVybiB0aGlzLnRleHR1cmUubWluRmlsdGVyfSwKc2V0OmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4iKTt0aGlzLnRleHR1cmUubWluRmlsdGVyPWJ9fSxhbmlzb3Ryb3B5OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLmFuaXNvdHJvcHl9LHNldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4iKTt0aGlzLnRleHR1cmUuYW5pc290cm9weT1ifX0sb2Zmc2V0OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5vZmZzZXR9LApzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm9mZnNldCBpcyBub3cgLnRleHR1cmUub2Zmc2V0LiIpO3RoaXMudGV4dHVyZS5vZmZzZXQ9Yn19LHJlcGVhdDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnJlcGVhdCBpcyBub3cgLnRleHR1cmUucmVwZWF0LiIpO3JldHVybiB0aGlzLnRleHR1cmUucmVwZWF0fSxzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnJlcGVhdCBpcyBub3cgLnRleHR1cmUucmVwZWF0LiIpO3RoaXMudGV4dHVyZS5yZXBlYXQ9Yn19LGZvcm1hdDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LiIpO3JldHVybiB0aGlzLnRleHR1cmUuZm9ybWF0fSxzZXQ6ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LiIpOwp0aGlzLnRleHR1cmUuZm9ybWF0PWJ9fSx0eXBlOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLnR5cGV9LHNldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4iKTt0aGlzLnRleHR1cmUudHlwZT1ifX0sZ2VuZXJhdGVNaXBtYXBzOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZ2VuZXJhdGVNaXBtYXBzIGlzIG5vdyAudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHN9LHNldDpmdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZ2VuZXJhdGVNaXBtYXBzIGlzIG5vdyAudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMuIik7CnRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9Yn19fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMocWsucHJvdG90eXBlLHtzdGFuZGluZzp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJWUk1hbmFnZXI6IC5zdGFuZGluZyBoYXMgYmVlbiByZW1vdmVkLiIpfX0sdXNlckhlaWdodDp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJWUk1hbmFnZXI6IC51c2VySGVpZ2h0IGhhcyBiZWVuIHJlbW92ZWQuIil9fX0pO2dnLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IC5sb2FkIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5BdWRpb0xvYWRlciBpbnN0ZWFkLiIpO3ZhciBlPXRoaXM7KG5ldyBYaSkubG9hZChiLGZ1bmN0aW9uKGgpe2Uuc2V0QnVmZmVyKGgpfSk7cmV0dXJuIHRoaXN9O1NrLnByb3RvdHlwZS5nZXREYXRhPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpb0FuYWx5c2VyOiAuZ2V0RGF0YSgpIGlzIG5vdyAuZ2V0RnJlcXVlbmN5RGF0YSgpLiIpOwpyZXR1cm4gdGhpcy5nZXRGcmVxdWVuY3lEYXRhKCl9O1BiLnByb3RvdHlwZS51cGRhdGVDdWJlTWFwPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5DdWJlQ2FtZXJhOiAudXBkYXRlQ3ViZU1hcCgpIGlzIG5vdyAudXBkYXRlKCkuIik7cmV0dXJuIHRoaXMudXBkYXRlKGIsZSl9O3VlLmNyb3NzT3JpZ2luPXZvaWQgMDt1ZS5sb2FkVGV4dHVyZT1mdW5jdGlvbihiLGUsaCxtKXtjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlVXRpbHMubG9hZFRleHR1cmUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLlRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLiIpO3ZhciB1PW5ldyBKaTt1LnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pO2I9dS5sb2FkKGIsaCx2b2lkIDAsbSk7ZSYmKGIubWFwcGluZz1lKTtyZXR1cm4gYn07dWUubG9hZFRleHR1cmVDdWJlPWZ1bmN0aW9uKGIsZSxoLG0pe2NvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZUN1YmUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkN1YmVUZXh0dXJlTG9hZGVyKCkgaW5zdGVhZC4iKTsKdmFyIHU9bmV3IElpO3Uuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7Yj11LmxvYWQoYixoLHZvaWQgMCxtKTtlJiYoYi5tYXBwaW5nPWUpO3JldHVybiBifTt1ZS5sb2FkQ29tcHJlc3NlZFRleHR1cmU9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRERTTG9hZGVyIGluc3RlYWQuIil9O3VlLmxvYWRDb21wcmVzc2VkVGV4dHVyZUN1YmU9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZUN1YmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkREU0xvYWRlciBpbnN0ZWFkLiIpfTthLkFDRVNGaWxtaWNUb25lTWFwcGluZz01O2EuQWRkRXF1YXRpb249MTAwO2EuQWRkT3BlcmF0aW9uPTI7YS5BZGRpdGl2ZUJsZW5kaW5nPTI7YS5BbHBoYUZvcm1hdD0xMDIxO2EuQWx3YXlzRGVwdGg9CjE7YS5BbHdheXNTdGVuY2lsRnVuYz01MTk7YS5BbWJpZW50TGlnaHQ9UWk7YS5BbWJpZW50TGlnaHRQcm9iZT1OazthLkFuaW1hdGlvbkNsaXA9UmM7YS5BbmltYXRpb25Mb2FkZXI9RWs7YS5BbmltYXRpb25NaXhlcj1VazthLkFuaW1hdGlvbk9iamVjdEdyb3VwPWFvO2EuQW5pbWF0aW9uVXRpbHM9amM7YS5BcmNDdXJ2ZT1mZzthLkFycmF5Q2FtZXJhPSRnO2EuQXJyb3dIZWxwZXI9U2Q7YS5BdWRpbz1nZzthLkF1ZGlvQW5hbHlzZXI9U2s7YS5BdWRpb0NvbnRleHQ9UWs7YS5BdWRpb0xpc3RlbmVyPVBrO2EuQXVkaW9Mb2FkZXI9WGk7YS5BeGVzSGVscGVyPU5oO2EuQXhpc0hlbHBlcj1mdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLkF4aXNIZWxwZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5BeGVzSGVscGVyLiIpO3JldHVybiBuZXcgTmgoYil9O2EuQmFja1NpZGU9MTthLkJhc2ljRGVwdGhQYWNraW5nPTMyMDA7YS5CYXNpY1NoYWRvd01hcD0wO2EuQmluYXJ5VGV4dHVyZUxvYWRlcj0KZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5CaW5hcnlUZXh0dXJlTG9hZGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuRGF0YVRleHR1cmVMb2FkZXIuIik7cmV0dXJuIG5ldyBIaShiKX07YS5Cb25lPXhrO2EuQm9vbGVhbktleWZyYW1lVHJhY2s9RGk7YS5Cb3VuZGluZ0JveEhlbHBlcj1mdW5jdGlvbihiLGUpe2NvbnNvbGUud2FybigiVEhSRUUuQm91bmRpbmdCb3hIZWxwZXIgaGFzIGJlZW4gZGVwcmVjYXRlZC4gQ3JlYXRpbmcgYSBUSFJFRS5Cb3hIZWxwZXIgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IFJkKGIsZSl9O2EuQm94Mj1YazthLkJveDM9eDthLkJveDNIZWxwZXI9TGg7YS5Cb3hCdWZmZXJHZW9tZXRyeT1aYTthLkJveEdlb21ldHJ5PVVhO2EuQm94SGVscGVyPVJkO2EuQnVmZmVyQXR0cmlidXRlPVI7YS5CdWZmZXJHZW9tZXRyeT14YTthLkJ1ZmZlckdlb21ldHJ5TG9hZGVyPVZpO2EuQnl0ZVR5cGU9MTAxMDthLkNhY2hlPWdmO2EuQ2FtZXJhPUZiO2EuQ2FtZXJhSGVscGVyPQpLaDthLkNhbnZhc1JlbmRlcmVyPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQ2FudmFzUmVuZGVyZXIgaGFzIGJlZW4gcmVtb3ZlZCIpfTthLkNhbnZhc1RleHR1cmU9Z2g7YS5DYXRtdWxsUm9tQ3VydmUzPXVjO2EuQ2luZW9uVG9uZU1hcHBpbmc9NDthLkNpcmNsZUJ1ZmZlckdlb21ldHJ5PWFnO2EuQ2lyY2xlR2VvbWV0cnk9Qmg7YS5DbGFtcFRvRWRnZVdyYXBwaW5nPTEwMDE7YS5DbG9jaz1PazthLkNsb3NlZFNwbGluZUN1cnZlMz1pbzthLkNvbG9yPUk7YS5Db2xvcktleWZyYW1lVHJhY2s9RWk7YS5Db21wcmVzc2VkVGV4dHVyZT1PZjthLkNvbXByZXNzZWRUZXh0dXJlTG9hZGVyPUZrO2EuQ29uZUJ1ZmZlckdlb21ldHJ5PUFoO2EuQ29uZUdlb21ldHJ5PXpoO2EuQ3ViZUNhbWVyYT1QYjthLkN1YmVHZW9tZXRyeT1VYTthLkN1YmVSZWZsZWN0aW9uTWFwcGluZz0zMDE7YS5DdWJlUmVmcmFjdGlvbk1hcHBpbmc9MzAyO2EuQ3ViZVRleHR1cmU9TWQ7YS5DdWJlVGV4dHVyZUxvYWRlcj0KSWk7YS5DdWJlVVZSZWZsZWN0aW9uTWFwcGluZz0zMDY7YS5DdWJlVVZSZWZyYWN0aW9uTWFwcGluZz0zMDc7YS5DdWJpY0JlemllckN1cnZlPWVkO2EuQ3ViaWNCZXppZXJDdXJ2ZTM9QmQ7YS5DdWJpY0ludGVycG9sYW50PUJpO2EuQ3VsbEZhY2VCYWNrPTE7YS5DdWxsRmFjZUZyb250PTI7YS5DdWxsRmFjZUZyb250QmFjaz0zO2EuQ3VsbEZhY2VOb25lPTA7YS5DdXJ2ZT1hYjthLkN1cnZlUGF0aD1RZDthLkN1c3RvbUJsZW5kaW5nPTU7YS5DeWxpbmRlckJ1ZmZlckdlb21ldHJ5PVBkO2EuQ3lsaW5kZXJHZW9tZXRyeT1WZTthLkN5bGluZHJpY2FsPWdvO2EuRGF0YVRleHR1cmU9R2I7YS5EYXRhVGV4dHVyZTJEQXJyYXk9Q2Y7YS5EYXRhVGV4dHVyZTNEPURmO2EuRGF0YVRleHR1cmVMb2FkZXI9SGk7YS5EZWNyZW1lbnRTdGVuY2lsT3A9NzY4MzthLkRlY3JlbWVudFdyYXBTdGVuY2lsT3A9MzQwNTY7YS5EZWZhdWx0TG9hZGluZ01hbmFnZXI9WG47YS5EZXB0aEZvcm1hdD0xMDI2OwphLkRlcHRoU3RlbmNpbEZvcm1hdD0xMDI3O2EuRGVwdGhUZXh0dXJlPWhoO2EuRGlyZWN0aW9uYWxMaWdodD1QaTthLkRpcmVjdGlvbmFsTGlnaHRIZWxwZXI9b2c7YS5EaXJlY3Rpb25hbExpZ2h0U2hhZG93PU9pO2EuRGlzY3JldGVJbnRlcnBvbGFudD1DaTthLkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5PVRmO2EuRG9kZWNhaGVkcm9uR2VvbWV0cnk9bmg7YS5Eb3VibGVTaWRlPTI7YS5Ec3RBbHBoYUZhY3Rvcj0yMDY7YS5Ec3RDb2xvckZhY3Rvcj0yMDg7YS5EeW5hbWljQnVmZmVyQXR0cmlidXRlPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5EeW5hbWljQnVmZmVyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKCkuc2V0RHluYW1pYyggdHJ1ZSApIGluc3RlYWQuIik7cmV0dXJuKG5ldyBSKGIsZSkpLnNldER5bmFtaWMoITApfTthLkVkZ2VzR2VvbWV0cnk9JGY7YS5FZGdlc0hlbHBlcj1mdW5jdGlvbihiLAplKXtjb25zb2xlLndhcm4oIlRIUkVFLkVkZ2VzSGVscGVyIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5FZGdlc0dlb21ldHJ5IGluc3RlYWQuIik7cmV0dXJuIG5ldyBTYihuZXcgJGYoYi5nZW9tZXRyeSksbmV3IE9iKHtjb2xvcjp2b2lkIDAhPT1lP2U6MTY3NzcyMTV9KSl9O2EuRWxsaXBzZUN1cnZlPUxjO2EuRXF1YWxEZXB0aD00O2EuRXF1YWxTdGVuY2lsRnVuYz01MTQ7YS5FcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZz0zMDM7YS5FcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZz0zMDQ7YS5FdWxlcj10O2EuRXZlbnREaXNwYXRjaGVyPWM7YS5FeHRydWRlQnVmZmVyR2VvbWV0cnk9emQ7YS5FeHRydWRlR2VvbWV0cnk9U2U7YS5GYWNlMz1LO2EuRmFjZTQ9ZnVuY3Rpb24oYixlLGgsbSx1LHcsQSl7Y29uc29sZS53YXJuKCJUSFJFRS5GYWNlNCBoYXMgYmVlbiByZW1vdmVkLiBBIFRIUkVFLkZhY2UzIHdpbGwgYmUgY3JlYXRlZCBpbnN0ZWFkLiIpO3JldHVybiBuZXcgSyhiLAplLGgsdSx3LEEpfTthLkZhY2VDb2xvcnM9MTthLkZhY2VOb3JtYWxzSGVscGVyPUpoO2EuRmlsZUxvYWRlcj1TYzthLkZsYXRTaGFkaW5nPTE7YS5GbG9hdDMyQXR0cmlidXRlPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5GbG9hdDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBkYShiLGUpfTthLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGU9ZGE7YS5GbG9hdDY0QXR0cmlidXRlPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5GbG9hdDY0QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBsYShiLGUpfTthLkZsb2F0NjRCdWZmZXJBdHRyaWJ1dGU9bGE7YS5GbG9hdFR5cGU9MTAxNTthLkZvZz14aTthLkZvZ0V4cDI9d2k7YS5Gb250PUtrOwphLkZvbnRMb2FkZXI9TGs7YS5Gcm9udEZhY2VEaXJlY3Rpb25DQ1c9MTthLkZyb250RmFjZURpcmVjdGlvbkNXPTA7YS5Gcm9udFNpZGU9MDthLkZydXN0dW09RWM7YS5HYW1tYUVuY29kaW5nPTMwMDc7YS5HZW9tZXRyeT16YTthLkdlb21ldHJ5VXRpbHM9e21lcmdlOmZ1bmN0aW9uKGIsZSxoKXtjb25zb2xlLndhcm4oIlRIUkVFLkdlb21ldHJ5VXRpbHM6IC5tZXJnZSgpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkubWVyZ2UoIGdlb21ldHJ5MiwgbWF0cml4LCBtYXRlcmlhbEluZGV4T2Zmc2V0ICkgaW5zdGVhZC4iKTtpZihlLmlzTWVzaCl7ZS5tYXRyaXhBdXRvVXBkYXRlJiZlLnVwZGF0ZU1hdHJpeCgpO3ZhciBtPWUubWF0cml4O2U9ZS5nZW9tZXRyeX1iLm1lcmdlKGUsbSxoKX0sY2VudGVyOmZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuR2VvbWV0cnlVdGlsczogLmNlbnRlcigpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkuY2VudGVyKCkgaW5zdGVhZC4iKTsKcmV0dXJuIGIuY2VudGVyKCl9fTthLkdyZWF0ZXJEZXB0aD02O2EuR3JlYXRlckVxdWFsRGVwdGg9NTthLkdyZWF0ZXJFcXVhbFN0ZW5jaWxGdW5jPTUxODthLkdyZWF0ZXJTdGVuY2lsRnVuYz01MTY7YS5HcmlkSGVscGVyPSRpO2EuR3JvdXA9RmY7YS5IYWxmRmxvYXRUeXBlPTEwMTY7YS5IZW1pc3BoZXJlTGlnaHQ9S2k7YS5IZW1pc3BoZXJlTGlnaHRIZWxwZXI9bGc7YS5IZW1pc3BoZXJlTGlnaHRQcm9iZT1NazthLkljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnk9U2Y7YS5JY29zYWhlZHJvbkdlb21ldHJ5PW1oO2EuSW1hZ2VCaXRtYXBMb2FkZXI9SWs7YS5JbWFnZUxvYWRlcj1lZzthLkltYWdlVXRpbHM9dWU7YS5JbW1lZGlhdGVSZW5kZXJPYmplY3Q9SGg7YS5JbmNyZW1lbnRTdGVuY2lsT3A9NzY4MjthLkluY3JlbWVudFdyYXBTdGVuY2lsT3A9MzQwNTU7YS5JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU9VWk7YS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT1UaTthLkluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyPQpWazthLkludDE2QXR0cmlidXRlPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5JbnQxNkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkludDE2QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IG1hKGIsZSl9O2EuSW50MTZCdWZmZXJBdHRyaWJ1dGU9bWE7YS5JbnQzMkF0dHJpYnV0ZT1mdW5jdGlvbihiLGUpe2NvbnNvbGUud2FybigiVEhSRUUuSW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBjYShiLGUpfTthLkludDMyQnVmZmVyQXR0cmlidXRlPWNhO2EuSW50OEF0dHJpYnV0ZT1mdW5jdGlvbihiLGUpe2NvbnNvbGUud2FybigiVEhSRUUuSW50OEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkludDhCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgVShiLAplKX07YS5JbnQ4QnVmZmVyQXR0cmlidXRlPVU7YS5JbnRUeXBlPTEwMTM7YS5JbnRlcmxlYXZlZEJ1ZmZlcj1PZTthLkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlPWJoO2EuSW50ZXJwb2xhbnQ9S2M7YS5JbnRlcnBvbGF0ZURpc2NyZXRlPTIzMDA7YS5JbnRlcnBvbGF0ZUxpbmVhcj0yMzAxO2EuSW50ZXJwb2xhdGVTbW9vdGg9MjMwMjthLkludmVydFN0ZW5jaWxPcD01Mzg2O2EuSlNPTkxvYWRlcj1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkpTT05Mb2FkZXIgaGFzIGJlZW4gcmVtb3ZlZC4iKX07YS5LZWVwU3RlbmNpbE9wPTc2ODA7YS5LZXlmcmFtZVRyYWNrPW9jO2EuTE9EPWVoO2EuTGF0aGVCdWZmZXJHZW9tZXRyeT1aZjthLkxhdGhlR2VvbWV0cnk9eWg7YS5MYXllcnM9djthLkxlbnNGbGFyZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkxlbnNGbGFyZSBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvb2JqZWN0cy9MZW5zZmxhcmUuanMiKX07CmEuTGVzc0RlcHRoPTI7YS5MZXNzRXF1YWxEZXB0aD0zO2EuTGVzc0VxdWFsU3RlbmNpbEZ1bmM9NTE1O2EuTGVzc1N0ZW5jaWxGdW5jPTUxMzthLkxpZ2h0PVViO2EuTGlnaHRQcm9iZT1qZDthLkxpZ2h0UHJvYmVIZWxwZXI9bWc7YS5MaWdodFNoYWRvdz1EZDthLkxpbmU9bWM7YS5MaW5lMz1ZazthLkxpbmVCYXNpY01hdGVyaWFsPU9iO2EuTGluZUN1cnZlPUdjO2EuTGluZUN1cnZlMz1mZDthLkxpbmVEYXNoZWRNYXRlcmlhbD1iZjthLkxpbmVMb29wPUFpO2EuTGluZVBpZWNlcz0xO2EuTGluZVNlZ21lbnRzPVNiO2EuTGluZVN0cmlwPTA7YS5MaW5lYXJFbmNvZGluZz0zRTM7YS5MaW5lYXJGaWx0ZXI9MTAwNjthLkxpbmVhckludGVycG9sYW50PUNoO2EuTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyPTEwMDg7YS5MaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyPTEwMDc7YS5MaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXI9MTAwODthLkxpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXI9MTAwNzsKYS5MaW5lYXJUb25lTWFwcGluZz0xO2EuTG9hZGVyPUtiO2EuTG9hZGVyVXRpbHM9c2w7YS5Mb2FkaW5nTWFuYWdlcj1EazthLkxvZ0x1dkVuY29kaW5nPTMwMDM7YS5Mb29wT25jZT0yMjAwO2EuTG9vcFBpbmdQb25nPTIyMDI7YS5Mb29wUmVwZWF0PTIyMDE7YS5MdW1pbmFuY2VBbHBoYUZvcm1hdD0xMDI1O2EuTHVtaW5hbmNlRm9ybWF0PTEwMjQ7YS5NT1VTRT17TEVGVDowLE1JRERMRToxLFJJR0hUOjIsUk9UQVRFOjAsRE9MTFk6MSxQQU46Mn07YS5NYXRlcmlhbD1NO2EuTWF0ZXJpYWxMb2FkZXI9U2k7YS5NYXRoPWxiO2EuTWF0cml4Mz1sO2EuTWF0cml4ND1yO2EuTWF4RXF1YXRpb249MTA0O2EuTWVzaD15YTthLk1lc2hCYXNpY01hdGVyaWFsPUw7YS5NZXNoRGVwdGhNYXRlcmlhbD1tZTthLk1lc2hEaXN0YW5jZU1hdGVyaWFsPW5lO2EuTWVzaEZhY2VNYXRlcmlhbD1mdW5jdGlvbihiKXtjb25zb2xlLndhcm4oIlRIUkVFLk1lc2hGYWNlTWF0ZXJpYWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGFuIEFycmF5IGluc3RlYWQuIik7CnJldHVybiBifTthLk1lc2hMYW1iZXJ0TWF0ZXJpYWw9JGU7YS5NZXNoTWF0Y2FwTWF0ZXJpYWw9YWY7YS5NZXNoTm9ybWFsTWF0ZXJpYWw9WmU7YS5NZXNoUGhvbmdNYXRlcmlhbD1kZDthLk1lc2hQaHlzaWNhbE1hdGVyaWFsPVhlO2EuTWVzaFN0YW5kYXJkTWF0ZXJpYWw9QWQ7YS5NZXNoVG9vbk1hdGVyaWFsPVllO2EuTWluRXF1YXRpb249MTAzO2EuTWlycm9yZWRSZXBlYXRXcmFwcGluZz0xMDAyO2EuTWl4T3BlcmF0aW9uPTE7YS5NdWx0aU1hdGVyaWFsPWZ1bmN0aW9uKGIpe3ZvaWQgMD09PWImJihiPVtdKTtjb25zb2xlLndhcm4oIlRIUkVFLk11bHRpTWF0ZXJpYWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGFuIEFycmF5IGluc3RlYWQuIik7Yi5pc011bHRpTWF0ZXJpYWw9ITA7Yi5tYXRlcmlhbHM9YjtiLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIGIuc2xpY2UoKX07cmV0dXJuIGJ9O2EuTXVsdGlwbHlCbGVuZGluZz00O2EuTXVsdGlwbHlPcGVyYXRpb249MDthLk5lYXJlc3RGaWx0ZXI9CjEwMDM7YS5OZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyPTEwMDU7YS5OZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlcj0xMDA0O2EuTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcj0xMDA1O2EuTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXI9MTAwNDthLk5ldmVyRGVwdGg9MDthLk5ldmVyU3RlbmNpbEZ1bmM9NTEyO2EuTm9CbGVuZGluZz0wO2EuTm9Db2xvcnM9MDthLk5vVG9uZU1hcHBpbmc9MDthLk5vcm1hbEJsZW5kaW5nPTE7YS5Ob3RFcXVhbERlcHRoPTc7YS5Ob3RFcXVhbFN0ZW5jaWxGdW5jPTUxNzthLk51bWJlcktleWZyYW1lVHJhY2s9Y2c7YS5PYmplY3QzRD15O2EuT2JqZWN0TG9hZGVyPVdpO2EuT2JqZWN0U3BhY2VOb3JtYWxNYXA9MTthLk9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeT1QZTthLk9jdGFoZWRyb25HZW9tZXRyeT1saDthLk9uZUZhY3Rvcj0yMDE7YS5PbmVNaW51c0RzdEFscGhhRmFjdG9yPTIwNzthLk9uZU1pbnVzRHN0Q29sb3JGYWN0b3I9MjA5O2EuT25lTWludXNTcmNBbHBoYUZhY3Rvcj0KMjA1O2EuT25lTWludXNTcmNDb2xvckZhY3Rvcj0yMDM7YS5PcnRob2dyYXBoaWNDYW1lcmE9R2g7YS5QQ0ZTaGFkb3dNYXA9MTthLlBDRlNvZnRTaGFkb3dNYXA9MjthLlBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeT1RZjthLlBhcmFtZXRyaWNHZW9tZXRyeT1paDthLlBhcnRpY2xlPWZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuUGFydGljbGUgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5TcHJpdGUuIik7cmV0dXJuIG5ldyBjaChiKX07YS5QYXJ0aWNsZUJhc2ljTWF0ZXJpYWw9ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZUJhc2ljTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4iKTtyZXR1cm4gbmV3IGNkKGIpfTthLlBhcnRpY2xlU3lzdGVtPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZVN5c3RlbSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50cy4iKTtyZXR1cm4gbmV3IE5mKGIsCmUpfTthLlBhcnRpY2xlU3lzdGVtTWF0ZXJpYWw9ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZVN5c3RlbU1hdGVyaWFsIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzTWF0ZXJpYWwuIik7cmV0dXJuIG5ldyBjZChiKX07YS5QYXRoPWlkO2EuUGVyc3BlY3RpdmVDYW1lcmE9QWI7YS5QbGFuZT1SYjthLlBsYW5lQnVmZmVyR2VvbWV0cnk9dGQ7YS5QbGFuZUdlb21ldHJ5PWllO2EuUGxhbmVIZWxwZXI9TWg7YS5Qb2ludENsb3VkPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzLiIpO3JldHVybiBuZXcgTmYoYixlKX07YS5Qb2ludENsb3VkTWF0ZXJpYWw9ZnVuY3Rpb24oYil7Y29uc29sZS53YXJuKCJUSFJFRS5Qb2ludENsb3VkTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4iKTtyZXR1cm4gbmV3IGNkKGIpfTthLlBvaW50TGlnaHQ9Ck5pO2EuUG9pbnRMaWdodEhlbHBlcj1qZzthLlBvaW50cz1OZjthLlBvaW50c01hdGVyaWFsPWNkO2EuUG9sYXJHcmlkSGVscGVyPWFqO2EuUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5PUZjO2EuUG9seWhlZHJvbkdlb21ldHJ5PWpoO2EuUG9zaXRpb25hbEF1ZGlvPVJrO2EuUG9zaXRpb25hbEF1ZGlvSGVscGVyPW5nO2EuUHJvcGVydHlCaW5kaW5nPXZjO2EuUHJvcGVydHlNaXhlcj1UazthLlF1YWRyYXRpY0JlemllckN1cnZlPWdkO2EuUXVhZHJhdGljQmV6aWVyQ3VydmUzPUNkO2EuUXVhdGVybmlvbj1mO2EuUXVhdGVybmlvbktleWZyYW1lVHJhY2s9RGg7YS5RdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQ9Rmk7YS5SRVZJU0lPTj0iMTA4IjthLlJHQkFEZXB0aFBhY2tpbmc9MzIwMTthLlJHQkFGb3JtYXQ9MTAyMzthLlJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQ9Mzc4MTk7YS5SR0JBX0FTVENfMTB4NV9Gb3JtYXQ9Mzc4MTY7YS5SR0JBX0FTVENfMTB4Nl9Gb3JtYXQ9Mzc4MTc7YS5SR0JBX0FTVENfMTB4OF9Gb3JtYXQ9CjM3ODE4O2EuUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdD0zNzgyMDthLlJHQkFfQVNUQ18xMngxMl9Gb3JtYXQ9Mzc4MjE7YS5SR0JBX0FTVENfNHg0X0Zvcm1hdD0zNzgwODthLlJHQkFfQVNUQ181eDRfRm9ybWF0PTM3ODA5O2EuUkdCQV9BU1RDXzV4NV9Gb3JtYXQ9Mzc4MTA7YS5SR0JBX0FTVENfNng1X0Zvcm1hdD0zNzgxMTthLlJHQkFfQVNUQ182eDZfRm9ybWF0PTM3ODEyO2EuUkdCQV9BU1RDXzh4NV9Gb3JtYXQ9Mzc4MTM7YS5SR0JBX0FTVENfOHg2X0Zvcm1hdD0zNzgxNDthLlJHQkFfQVNUQ184eDhfRm9ybWF0PTM3ODE1O2EuUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0PTM1ODQzO2EuUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0PTM1ODQyO2EuUkdCQV9TM1RDX0RYVDFfRm9ybWF0PTMzNzc3O2EuUkdCQV9TM1RDX0RYVDNfRm9ybWF0PTMzNzc4O2EuUkdCQV9TM1RDX0RYVDVfRm9ybWF0PTMzNzc5O2EuUkdCREVuY29kaW5nPTMwMDY7YS5SR0JFRW5jb2Rpbmc9MzAwMjthLlJHQkVGb3JtYXQ9CjEwMjM7YS5SR0JGb3JtYXQ9MTAyMjthLlJHQk0xNkVuY29kaW5nPTMwMDU7YS5SR0JNN0VuY29kaW5nPTMwMDQ7YS5SR0JfRVRDMV9Gb3JtYXQ9MzYxOTY7YS5SR0JfUFZSVENfMkJQUFYxX0Zvcm1hdD0zNTg0MTthLlJHQl9QVlJUQ180QlBQVjFfRm9ybWF0PTM1ODQwO2EuUkdCX1MzVENfRFhUMV9Gb3JtYXQ9MzM3NzY7YS5SYXdTaGFkZXJNYXRlcmlhbD1iZzthLlJheT1EO2EuUmF5Y2FzdGVyPWNvO2EuUmVjdEFyZWFMaWdodD1SaTthLlJlY3RBcmVhTGlnaHRIZWxwZXI9a2c7YS5SZWRGb3JtYXQ9MTAyODthLlJlaW5oYXJkVG9uZU1hcHBpbmc9MjthLlJlcGVhdFdyYXBwaW5nPTFFMzthLlJlcGxhY2VTdGVuY2lsT3A9NzY4MTthLlJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uPTEwMjthLlJpbmdCdWZmZXJHZW9tZXRyeT1ZZjthLlJpbmdHZW9tZXRyeT14aDthLlNjZW5lPXo7YS5TY2VuZVV0aWxzPXtjcmVhdGVNdWx0aU1hdGVyaWFsT2JqZWN0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2NlbmVVdGlscyBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvdXRpbHMvU2NlbmVVdGlscy5qcyIpfSwKZGV0YWNoOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2NlbmVVdGlscyBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvdXRpbHMvU2NlbmVVdGlscy5qcyIpfSxhdHRhY2g6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TY2VuZVV0aWxzIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy91dGlscy9TY2VuZVV0aWxzLmpzIil9fTthLlNoYWRlckNodW5rPXdiO2EuU2hhZGVyTGliPXVkO2EuU2hhZGVyTWF0ZXJpYWw9dWI7YS5TaGFkb3dNYXRlcmlhbD1XZTthLlNoYXBlPXRlO2EuU2hhcGVCdWZmZXJHZW9tZXRyeT1VZTthLlNoYXBlR2VvbWV0cnk9VGU7YS5TaGFwZVBhdGg9Sms7YS5TaGFwZVV0aWxzPU9kO2EuU2hvcnRUeXBlPTEwMTE7YS5Ta2VsZXRvbj16aTthLlNrZWxldG9uSGVscGVyPWlnO2EuU2tpbm5lZE1lc2g9Zmg7YS5TbW9vdGhTaGFkaW5nPTI7YS5TcGhlcmU9RjthLlNwaGVyZUJ1ZmZlckdlb21ldHJ5PXNlO2EuU3BoZXJlR2VvbWV0cnk9CndoO2EuU3BoZXJpY2FsPWZvO2EuU3BoZXJpY2FsSGFybW9uaWNzMz1ZaTthLlNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nPTMwNTthLlNwbGluZT0kazthLlNwbGluZUN1cnZlPWhkO2EuU3BsaW5lQ3VydmUzPWpvO2EuU3BvdExpZ2h0PU1pO2EuU3BvdExpZ2h0SGVscGVyPWhnO2EuU3BvdExpZ2h0U2hhZG93PUxpO2EuU3ByaXRlPWNoO2EuU3ByaXRlTWF0ZXJpYWw9cmU7YS5TcmNBbHBoYUZhY3Rvcj0yMDQ7YS5TcmNBbHBoYVNhdHVyYXRlRmFjdG9yPTIxMDthLlNyY0NvbG9yRmFjdG9yPTIwMjthLlN0ZXJlb0NhbWVyYT1abjthLlN0cmluZ0tleWZyYW1lVHJhY2s9R2k7YS5TdWJ0cmFjdEVxdWF0aW9uPTEwMTthLlN1YnRyYWN0aXZlQmxlbmRpbmc9MzthLlRPVUNIPXtST1RBVEU6MCxQQU46MSxET0xMWV9QQU46MixET0xMWV9ST1RBVEU6M307YS5UYW5nZW50U3BhY2VOb3JtYWxNYXA9MDthLlRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk9UmY7YS5UZXRyYWhlZHJvbkdlb21ldHJ5PQpraDthLlRleHRCdWZmZXJHZW9tZXRyeT1YZjthLlRleHRHZW9tZXRyeT12aDthLlRleHR1cmU9azthLlRleHR1cmVMb2FkZXI9Smk7YS5Ub3J1c0J1ZmZlckdlb21ldHJ5PVZmO2EuVG9ydXNHZW9tZXRyeT1xaDthLlRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5PVVmO2EuVG9ydXNLbm90R2VvbWV0cnk9cGg7YS5UcmlhbmdsZT1CO2EuVHJpYW5nbGVGYW5EcmF3TW9kZT0yO2EuVHJpYW5nbGVTdHJpcERyYXdNb2RlPTE7YS5UcmlhbmdsZXNEcmF3TW9kZT0wO2EuVHViZUJ1ZmZlckdlb21ldHJ5PVFlO2EuVHViZUdlb21ldHJ5PW9oO2EuVVZNYXBwaW5nPTMwMDthLlVpbnQxNkF0dHJpYnV0ZT1mdW5jdGlvbihiLGUpe2NvbnNvbGUud2FybigiVEhSRUUuVWludDE2QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDE2QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGFhKGIsZSl9O2EuVWludDE2QnVmZmVyQXR0cmlidXRlPWFhO2EuVWludDMyQXR0cmlidXRlPQpmdW5jdGlvbihiLGUpe2NvbnNvbGUud2FybigiVEhSRUUuVWludDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGZhKGIsZSl9O2EuVWludDMyQnVmZmVyQXR0cmlidXRlPWZhO2EuVWludDhBdHRyaWJ1dGU9ZnVuY3Rpb24oYixlKXtjb25zb2xlLndhcm4oIlRIUkVFLlVpbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDhCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgWShiLGUpfTthLlVpbnQ4QnVmZmVyQXR0cmlidXRlPVk7YS5VaW50OENsYW1wZWRBdHRyaWJ1dGU9ZnVuY3Rpb24oYixlKXtjb25zb2xlLndhcm4oIlRIUkVFLlVpbnQ4Q2xhbXBlZEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBiYShiLAplKX07YS5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU9YmE7YS5VbmNoYXJ0ZWQyVG9uZU1hcHBpbmc9MzthLlVuaWZvcm09Wmk7YS5Vbmlmb3Jtc0xpYj1ZYTthLlVuaWZvcm1zVXRpbHM9QnM7YS5VbnNpZ25lZEJ5dGVUeXBlPTEwMDk7YS5VbnNpZ25lZEludDI0OFR5cGU9MTAyMDthLlVuc2lnbmVkSW50VHlwZT0xMDE0O2EuVW5zaWduZWRTaG9ydDQ0NDRUeXBlPTEwMTc7YS5VbnNpZ25lZFNob3J0NTU1MVR5cGU9MTAxODthLlVuc2lnbmVkU2hvcnQ1NjVUeXBlPTEwMTk7YS5VbnNpZ25lZFNob3J0VHlwZT0xMDEyO2EuVlNNU2hhZG93TWFwPTM7YS5WZWN0b3IyPWQ7YS5WZWN0b3IzPWc7YS5WZWN0b3I0PW47YS5WZWN0b3JLZXlmcmFtZVRyYWNrPWRnO2EuVmVydGV4PWZ1bmN0aW9uKGIsZSxoKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlcnRleCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuVmVjdG9yMyBpbnN0ZWFkLiIpO3JldHVybiBuZXcgZyhiLGUsaCl9O2EuVmVydGV4Q29sb3JzPQoyO2EuVmVydGV4Tm9ybWFsc0hlbHBlcj1JaDthLlZpZGVvVGV4dHVyZT1BazthLldlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQ9cTthLldlYkdMUmVuZGVyVGFyZ2V0PXA7YS5XZWJHTFJlbmRlclRhcmdldEN1YmU9YmM7YS5XZWJHTFJlbmRlcmVyPXJrO2EuV2ViR0xVdGlscz1GbjthLldpcmVmcmFtZUdlb21ldHJ5PVBmO2EuV2lyZWZyYW1lSGVscGVyPWZ1bmN0aW9uKGIsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5XaXJlZnJhbWVIZWxwZXIgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLldpcmVmcmFtZUdlb21ldHJ5IGluc3RlYWQuIik7cmV0dXJuIG5ldyBTYihuZXcgUGYoYi5nZW9tZXRyeSksbmV3IE9iKHtjb2xvcjp2b2lkIDAhPT1lP2U6MTY3NzcyMTV9KSl9O2EuV3JhcEFyb3VuZEVuZGluZz0yNDAyO2EuWEhSTG9hZGVyPWZ1bmN0aW9uKGIpe2NvbnNvbGUud2FybigiVEhSRUUuWEhSTG9hZGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuRmlsZUxvYWRlci4iKTsKcmV0dXJuIG5ldyBTYyhiKX07YS5aZXJvQ3VydmF0dXJlRW5kaW5nPTI0MDA7YS5aZXJvRmFjdG9yPTIwMDthLlplcm9TbG9wZUVuZGluZz0yNDAxO2EuWmVyb1N0ZW5jaWxPcD0wO2Euc1JHQkVuY29kaW5nPTMwMDE7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy9PcmJpdENvbnRyb2xzLmpzClRIUkVFLk9yYml0Q29udHJvbHM9ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKCl7cmV0dXJuIDIqTWF0aC5QSS82MC82MCpaLmF1dG9Sb3RhdGVTcGVlZH1mdW5jdGlvbiBmKCl7cmV0dXJuIE1hdGgucG93KC45NSxaLnpvb21TcGVlZCl9ZnVuY3Rpb24gZyh1YSl7WmEudGhldGEtPXVhfWZ1bmN0aW9uIGwodWEpe1phLnBoaS09dWF9ZnVuY3Rpb24gayh1YSl7Wi5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYT96Yi89dWE6Wi5vYmplY3QuaXNPcnRob2dyYXBoaWNDYW1lcmE/KFoub2JqZWN0Lnpvb209TWF0aC5tYXgoWi5taW5ab29tLE1hdGgubWluKFoubWF4Wm9vbSxaLm9iamVjdC56b29tKnVhKSksWi5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpLHViPSEwKTooY29uc29sZS53YXJuKCJXQVJOSU5HOiBPcmJpdENvbnRyb2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBkb2xseS96b29tIGRpc2FibGVkLiIpLFouZW5hYmxlWm9vbT0hMSl9ZnVuY3Rpb24gbih1YSl7Wi5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYT8KemIqPXVhOloub2JqZWN0LmlzT3J0aG9ncmFwaGljQ2FtZXJhPyhaLm9iamVjdC56b29tPU1hdGgubWF4KFoubWluWm9vbSxNYXRoLm1pbihaLm1heFpvb20sWi5vYmplY3Quem9vbS91YSkpLFoub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSx1Yj0hMCk6KGNvbnNvbGUud2FybigiV0FSTklORzogT3JiaXRDb250cm9scy5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gZG9sbHkvem9vbSBkaXNhYmxlZC4iKSxaLmVuYWJsZVpvb209ITEpfWZ1bmN0aW9uIHAodWEpe0ZiLnNldCh1YS5jbGllbnRYLHVhLmNsaWVudFkpfWZ1bmN0aW9uIHEodWEpe0VjLnNldCh1YS5jbGllbnRYLHVhLmNsaWVudFkpfWZ1bmN0aW9uIHIodWEpe2JjLnNldCh1YS5jbGllbnRYLHVhLmNsaWVudFkpfWZ1bmN0aW9uIHQodWEpe0FiLnNldCh1YS5jbGllbnRYLHVhLmNsaWVudFkpO1BiLnN1YlZlY3RvcnMoQWIsRmIpLm11bHRpcGx5U2NhbGFyKFoucm90YXRlU3BlZWQpO3VhPQpaLmRvbUVsZW1lbnQ9PT1kb2N1bWVudD9aLmRvbUVsZW1lbnQuYm9keTpaLmRvbUVsZW1lbnQ7ZygyKk1hdGguUEkqUGIueC91YS5jbGllbnRIZWlnaHQpO2woMipNYXRoLlBJKlBiLnkvdWEuY2xpZW50SGVpZ2h0KTtGYi5jb3B5KEFiKTtaLnVwZGF0ZSgpfWZ1bmN0aW9uIHYodWEpe3hjLnNldCh1YS5jbGllbnRYLHVhLmNsaWVudFkpO01lLnN1YlZlY3RvcnMoeGMsRWMpOzA8TWUueT9rKGYoKSk6MD5NZS55JiZuKGYoKSk7RWMuY29weSh4Yyk7Wi51cGRhdGUoKX1mdW5jdGlvbiB5KHVhKXtHYi5zZXQodWEuY2xpZW50WCx1YS5jbGllbnRZKTtSYi5zdWJWZWN0b3JzKEdiLGJjKS5tdWx0aXBseVNjYWxhcihaLnBhblNwZWVkKTtqZShSYi54LFJiLnkpO2JjLmNvcHkoR2IpO1oudXBkYXRlKCl9ZnVuY3Rpb24geigpe31mdW5jdGlvbiB4KHVhKXswPnVhLmRlbHRhWT9uKGYoKSk6MDx1YS5kZWx0YVkmJmsoZigpKTtaLnVwZGF0ZSgpfWZ1bmN0aW9uIEModWEpe3ZhciAkYj0hMTtzd2l0Y2godWEua2V5Q29kZSl7Y2FzZSBaLmtleXMuVVA6amUoMCwKWi5rZXlQYW5TcGVlZCk7JGI9ITA7YnJlYWs7Y2FzZSBaLmtleXMuQk9UVE9NOmplKDAsLVoua2V5UGFuU3BlZWQpOyRiPSEwO2JyZWFrO2Nhc2UgWi5rZXlzLkxFRlQ6amUoWi5rZXlQYW5TcGVlZCwwKTskYj0hMDticmVhaztjYXNlIFoua2V5cy5SSUdIVDpqZSgtWi5rZXlQYW5TcGVlZCwwKSwkYj0hMH0kYiYmKHVhLnByZXZlbnREZWZhdWx0KCksWi51cGRhdGUoKSl9ZnVuY3Rpb24gRih1YSl7MT09dWEudG91Y2hlcy5sZW5ndGg/RmIuc2V0KHVhLnRvdWNoZXNbMF0ucGFnZVgsdWEudG91Y2hlc1swXS5wYWdlWSk6RmIuc2V0KC41Kih1YS50b3VjaGVzWzBdLnBhZ2VYK3VhLnRvdWNoZXNbMV0ucGFnZVgpLC41Kih1YS50b3VjaGVzWzBdLnBhZ2VZK3VhLnRvdWNoZXNbMV0ucGFnZVkpKX1mdW5jdGlvbiBEKHVhKXsxPT11YS50b3VjaGVzLmxlbmd0aD9iYy5zZXQodWEudG91Y2hlc1swXS5wYWdlWCx1YS50b3VjaGVzWzBdLnBhZ2VZKTpiYy5zZXQoLjUqKHVhLnRvdWNoZXNbMF0ucGFnZVgrCnVhLnRvdWNoZXNbMV0ucGFnZVgpLC41Kih1YS50b3VjaGVzWzBdLnBhZ2VZK3VhLnRvdWNoZXNbMV0ucGFnZVkpKX1mdW5jdGlvbiBCKHVhKXt2YXIgJGI9dWEudG91Y2hlc1swXS5wYWdlWC11YS50b3VjaGVzWzFdLnBhZ2VYO3VhPXVhLnRvdWNoZXNbMF0ucGFnZVktdWEudG91Y2hlc1sxXS5wYWdlWTtFYy5zZXQoMCxNYXRoLnNxcnQoJGIqJGIrdWEqdWEpKX1mdW5jdGlvbiBJKHVhKXtaLmVuYWJsZVpvb20mJkIodWEpO1ouZW5hYmxlUGFuJiZEKHVhKX1mdW5jdGlvbiBPKHVhKXtaLmVuYWJsZVpvb20mJkIodWEpO1ouZW5hYmxlUm90YXRlJiZGKHVhKX1mdW5jdGlvbiBQKHVhKXsxPT11YS50b3VjaGVzLmxlbmd0aD9BYi5zZXQodWEudG91Y2hlc1swXS5wYWdlWCx1YS50b3VjaGVzWzBdLnBhZ2VZKTpBYi5zZXQoLjUqKHVhLnRvdWNoZXNbMF0ucGFnZVgrdWEudG91Y2hlc1sxXS5wYWdlWCksLjUqKHVhLnRvdWNoZXNbMF0ucGFnZVkrdWEudG91Y2hlc1sxXS5wYWdlWSkpO1BiLnN1YlZlY3RvcnMoQWIsCkZiKS5tdWx0aXBseVNjYWxhcihaLnJvdGF0ZVNwZWVkKTt1YT1aLmRvbUVsZW1lbnQ9PT1kb2N1bWVudD9aLmRvbUVsZW1lbnQuYm9keTpaLmRvbUVsZW1lbnQ7ZygyKk1hdGguUEkqUGIueC91YS5jbGllbnRIZWlnaHQpO2woMipNYXRoLlBJKlBiLnkvdWEuY2xpZW50SGVpZ2h0KTtGYi5jb3B5KEFiKX1mdW5jdGlvbiBIKHVhKXsxPT11YS50b3VjaGVzLmxlbmd0aD9HYi5zZXQodWEudG91Y2hlc1swXS5wYWdlWCx1YS50b3VjaGVzWzBdLnBhZ2VZKTpHYi5zZXQoLjUqKHVhLnRvdWNoZXNbMF0ucGFnZVgrdWEudG91Y2hlc1sxXS5wYWdlWCksLjUqKHVhLnRvdWNoZXNbMF0ucGFnZVkrdWEudG91Y2hlc1sxXS5wYWdlWSkpO1JiLnN1YlZlY3RvcnMoR2IsYmMpLm11bHRpcGx5U2NhbGFyKFoucGFuU3BlZWQpO2plKFJiLngsUmIueSk7YmMuY29weShHYil9ZnVuY3Rpb24gSyh1YSl7dmFyICRiPXVhLnRvdWNoZXNbMF0ucGFnZVgtdWEudG91Y2hlc1sxXS5wYWdlWDt1YT11YS50b3VjaGVzWzBdLnBhZ2VZLQp1YS50b3VjaGVzWzFdLnBhZ2VZO3hjLnNldCgwLE1hdGguc3FydCgkYiokYit1YSp1YSkpO01lLnNldCgwLE1hdGgucG93KHhjLnkvRWMueSxaLnpvb21TcGVlZCkpO2soTWUueSk7RWMuY29weSh4Yyl9ZnVuY3Rpb24gTSh1YSl7Wi5lbmFibGVab29tJiZLKHVhKTtaLmVuYWJsZVBhbiYmSCh1YSl9ZnVuY3Rpb24gTCh1YSl7Wi5lbmFibGVab29tJiZLKHVhKTtaLmVuYWJsZVJvdGF0ZSYmUCh1YSl9ZnVuY3Rpb24gUigpe31mdW5jdGlvbiBVKHVhKXtpZighMSE9PVouZW5hYmxlZCl7dWEucHJldmVudERlZmF1bHQoKTtaLmRvbUVsZW1lbnQuZm9jdXM/Wi5kb21FbGVtZW50LmZvY3VzKCk6d2luZG93LmZvY3VzKCk7c3dpdGNoKHVhLmJ1dHRvbil7Y2FzZSAwOnN3aXRjaChaLm1vdXNlQnV0dG9ucy5MRUZUKXtjYXNlIFRIUkVFLk1PVVNFLlJPVEFURTppZih1YS5jdHJsS2V5fHx1YS5tZXRhS2V5fHx1YS5zaGlmdEtleSl7aWYoITE9PT1aLmVuYWJsZVBhbilyZXR1cm47cih1YSk7R2E9CkJhLlBBTn1lbHNle2lmKCExPT09Wi5lbmFibGVSb3RhdGUpcmV0dXJuO3AodWEpO0dhPUJhLlJPVEFURX1icmVhaztjYXNlIFRIUkVFLk1PVVNFLlBBTjppZih1YS5jdHJsS2V5fHx1YS5tZXRhS2V5fHx1YS5zaGlmdEtleSl7aWYoITE9PT1aLmVuYWJsZVJvdGF0ZSlyZXR1cm47cCh1YSk7R2E9QmEuUk9UQVRFfWVsc2V7aWYoITE9PT1aLmVuYWJsZVBhbilyZXR1cm47cih1YSk7R2E9QmEuUEFOfWJyZWFrO2RlZmF1bHQ6R2E9QmEuTk9ORX1icmVhaztjYXNlIDE6c3dpdGNoKFoubW91c2VCdXR0b25zLk1JRERMRSl7Y2FzZSBUSFJFRS5NT1VTRS5ET0xMWTppZighMT09PVouZW5hYmxlWm9vbSlyZXR1cm47cSh1YSk7R2E9QmEuRE9MTFk7YnJlYWs7ZGVmYXVsdDpHYT1CYS5OT05FfWJyZWFrO2Nhc2UgMjpzd2l0Y2goWi5tb3VzZUJ1dHRvbnMuUklHSFQpe2Nhc2UgVEhSRUUuTU9VU0UuUk9UQVRFOmlmKCExPT09Wi5lbmFibGVSb3RhdGUpcmV0dXJuO3AodWEpO0dhPUJhLlJPVEFURTsKYnJlYWs7Y2FzZSBUSFJFRS5NT1VTRS5QQU46aWYoITE9PT1aLmVuYWJsZVBhbilyZXR1cm47cih1YSk7R2E9QmEuUEFOO2JyZWFrO2RlZmF1bHQ6R2E9QmEuTk9ORX19R2EhPT1CYS5OT05FJiYoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixZLCExKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIixiYSwhMSksWi5kaXNwYXRjaEV2ZW50KHhhKSl9fWZ1bmN0aW9uIFkodWEpe2lmKCExIT09Wi5lbmFibGVkKXN3aXRjaCh1YS5wcmV2ZW50RGVmYXVsdCgpLEdhKXtjYXNlIEJhLlJPVEFURTppZighMT09PVouZW5hYmxlUm90YXRlKWJyZWFrO3QodWEpO2JyZWFrO2Nhc2UgQmEuRE9MTFk6aWYoITE9PT1aLmVuYWJsZVpvb20pYnJlYWs7dih1YSk7YnJlYWs7Y2FzZSBCYS5QQU46ITEhPT1aLmVuYWJsZVBhbiYmeSh1YSl9fWZ1bmN0aW9uIGJhKHVhKXshMSE9PVouZW5hYmxlZCYmKHoodWEpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsClksITEpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGJhLCExKSxaLmRpc3BhdGNoRXZlbnQoeWEpLEdhPUJhLk5PTkUpfWZ1bmN0aW9uIG1hKHVhKXshMT09PVouZW5hYmxlZHx8ITE9PT1aLmVuYWJsZVpvb218fEdhIT09QmEuTk9ORSYmR2EhPT1CYS5ST1RBVEV8fCh1YS5wcmV2ZW50RGVmYXVsdCgpLHVhLnN0b3BQcm9wYWdhdGlvbigpLFouZGlzcGF0Y2hFdmVudCh4YSkseCh1YSksWi5kaXNwYXRjaEV2ZW50KHlhKSl9ZnVuY3Rpb24gYWEodWEpeyExIT09Wi5lbmFibGVkJiYhMSE9PVouZW5hYmxlS2V5cyYmITEhPT1aLmVuYWJsZVBhbiYmQyh1YSl9ZnVuY3Rpb24gY2EodWEpe2lmKCExIT09Wi5lbmFibGVkKXt1YS5wcmV2ZW50RGVmYXVsdCgpO3N3aXRjaCh1YS50b3VjaGVzLmxlbmd0aCl7Y2FzZSAxOnN3aXRjaChaLnRvdWNoZXMuT05FKXtjYXNlIFRIUkVFLlRPVUNILlJPVEFURTppZighMT09PVouZW5hYmxlUm90YXRlKXJldHVybjtGKHVhKTtHYT0KQmEuVE9VQ0hfUk9UQVRFO2JyZWFrO2Nhc2UgVEhSRUUuVE9VQ0guUEFOOmlmKCExPT09Wi5lbmFibGVQYW4pcmV0dXJuO0QodWEpO0dhPUJhLlRPVUNIX1BBTjticmVhaztkZWZhdWx0OkdhPUJhLk5PTkV9YnJlYWs7Y2FzZSAyOnN3aXRjaChaLnRvdWNoZXMuVFdPKXtjYXNlIFRIUkVFLlRPVUNILkRPTExZX1BBTjppZighMT09PVouZW5hYmxlWm9vbSYmITE9PT1aLmVuYWJsZVBhbilyZXR1cm47SSh1YSk7R2E9QmEuVE9VQ0hfRE9MTFlfUEFOO2JyZWFrO2Nhc2UgVEhSRUUuVE9VQ0guRE9MTFlfUk9UQVRFOmlmKCExPT09Wi5lbmFibGVab29tJiYhMT09PVouZW5hYmxlUm90YXRlKXJldHVybjtPKHVhKTtHYT1CYS5UT1VDSF9ET0xMWV9ST1RBVEU7YnJlYWs7ZGVmYXVsdDpHYT1CYS5OT05FfWJyZWFrO2RlZmF1bHQ6R2E9QmEuTk9ORX1HYSE9PUJhLk5PTkUmJlouZGlzcGF0Y2hFdmVudCh4YSl9fWZ1bmN0aW9uIGZhKHVhKXtpZighMSE9PVouZW5hYmxlZClzd2l0Y2godWEucHJldmVudERlZmF1bHQoKSwKdWEuc3RvcFByb3BhZ2F0aW9uKCksR2Epe2Nhc2UgQmEuVE9VQ0hfUk9UQVRFOmlmKCExPT09Wi5lbmFibGVSb3RhdGUpYnJlYWs7UCh1YSk7Wi51cGRhdGUoKTticmVhaztjYXNlIEJhLlRPVUNIX1BBTjppZighMT09PVouZW5hYmxlUGFuKWJyZWFrO0godWEpO1oudXBkYXRlKCk7YnJlYWs7Y2FzZSBCYS5UT1VDSF9ET0xMWV9QQU46aWYoITE9PT1aLmVuYWJsZVpvb20mJiExPT09Wi5lbmFibGVQYW4pYnJlYWs7TSh1YSk7Wi51cGRhdGUoKTticmVhaztjYXNlIEJhLlRPVUNIX0RPTExZX1JPVEFURTppZighMT09PVouZW5hYmxlWm9vbSYmITE9PT1aLmVuYWJsZVJvdGF0ZSlicmVhaztMKHVhKTtaLnVwZGF0ZSgpO2JyZWFrO2RlZmF1bHQ6R2E9QmEuTk9ORX19ZnVuY3Rpb24gZGEodWEpeyExIT09Wi5lbmFibGVkJiYoUih1YSksWi5kaXNwYXRjaEV2ZW50KHlhKSxHYT1CYS5OT05FKX1mdW5jdGlvbiBsYSh1YSl7ITEhPT1aLmVuYWJsZWQmJnVhLnByZXZlbnREZWZhdWx0KCl9dGhpcy5vYmplY3Q9CmE7dGhpcy5kb21FbGVtZW50PXZvaWQgMCE9PWM/Yzpkb2N1bWVudDt0aGlzLmVuYWJsZWQ9ITA7dGhpcy50YXJnZXQ9bmV3IFRIUkVFLlZlY3RvcjM7dGhpcy5taW5EaXN0YW5jZT0wO3RoaXMubWF4RGlzdGFuY2U9SW5maW5pdHk7dGhpcy5taW5ab29tPTA7dGhpcy5tYXhab29tPUluZmluaXR5O3RoaXMubWluUG9sYXJBbmdsZT0wO3RoaXMubWF4UG9sYXJBbmdsZT1NYXRoLlBJO3RoaXMubWluQXppbXV0aEFuZ2xlPS1JbmZpbml0eTt0aGlzLm1heEF6aW11dGhBbmdsZT1JbmZpbml0eTt0aGlzLmVuYWJsZURhbXBpbmc9ITE7dGhpcy5kYW1waW5nRmFjdG9yPS4wNTt0aGlzLmVuYWJsZVpvb209ITA7dGhpcy56b29tU3BlZWQ9MTt0aGlzLmVuYWJsZVJvdGF0ZT0hMDt0aGlzLnJvdGF0ZVNwZWVkPTE7dGhpcy5lbmFibGVQYW49ITA7dGhpcy5wYW5TcGVlZD0xO3RoaXMuc2NyZWVuU3BhY2VQYW5uaW5nPSExO3RoaXMua2V5UGFuU3BlZWQ9Nzt0aGlzLmF1dG9Sb3RhdGU9ITE7dGhpcy5hdXRvUm90YXRlU3BlZWQ9CjI7dGhpcy5lbmFibGVLZXlzPSEwO3RoaXMua2V5cz17TEVGVDozNyxVUDozOCxSSUdIVDozOSxCT1RUT006NDB9O3RoaXMubW91c2VCdXR0b25zPXtMRUZUOlRIUkVFLk1PVVNFLlJPVEFURSxNSURETEU6VEhSRUUuTU9VU0UuRE9MTFksUklHSFQ6VEhSRUUuTU9VU0UuUEFOfTt0aGlzLnRvdWNoZXM9e09ORTpUSFJFRS5UT1VDSC5ST1RBVEUsVFdPOlRIUkVFLlRPVUNILkRPTExZX1BBTn07dGhpcy50YXJnZXQwPXRoaXMudGFyZ2V0LmNsb25lKCk7dGhpcy5wb3NpdGlvbjA9dGhpcy5vYmplY3QucG9zaXRpb24uY2xvbmUoKTt0aGlzLnpvb20wPXRoaXMub2JqZWN0Lnpvb207dGhpcy5nZXRQb2xhckFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIFVhLnBoaX07dGhpcy5nZXRBemltdXRoYWxBbmdsZT1mdW5jdGlvbigpe3JldHVybiBVYS50aGV0YX07dGhpcy5zYXZlU3RhdGU9ZnVuY3Rpb24oKXtaLnRhcmdldDAuY29weShaLnRhcmdldCk7Wi5wb3NpdGlvbjAuY29weShaLm9iamVjdC5wb3NpdGlvbik7Clouem9vbTA9Wi5vYmplY3Quem9vbX07dGhpcy5yZXNldD1mdW5jdGlvbigpe1oudGFyZ2V0LmNvcHkoWi50YXJnZXQwKTtaLm9iamVjdC5wb3NpdGlvbi5jb3B5KFoucG9zaXRpb24wKTtaLm9iamVjdC56b29tPVouem9vbTA7Wi5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1ouZGlzcGF0Y2hFdmVudChGYSk7Wi51cGRhdGUoKTtHYT1CYS5OT05FfTt0aGlzLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciB1YT1uZXcgVEhSRUUuVmVjdG9yMywkYj0obmV3IFRIUkVFLlF1YXRlcm5pb24pLnNldEZyb21Vbml0VmVjdG9ycyhhLnVwLG5ldyBUSFJFRS5WZWN0b3IzKDAsMSwwKSksWmM9JGIuY2xvbmUoKS5pbnZlcnNlKCksTGQ9bmV3IFRIUkVFLlZlY3RvcjMsa2U9bmV3IFRIUkVFLlF1YXRlcm5pb247cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHFpPVoub2JqZWN0LnBvc2l0aW9uO3VhLmNvcHkocWkpLnN1YihaLnRhcmdldCk7dWEuYXBwbHlRdWF0ZXJuaW9uKCRiKTtVYS5zZXRGcm9tVmVjdG9yMyh1YSk7ClouYXV0b1JvdGF0ZSYmR2E9PT1CYS5OT05FJiZnKGQoKSk7Wi5lbmFibGVEYW1waW5nPyhVYS50aGV0YSs9WmEudGhldGEqWi5kYW1waW5nRmFjdG9yLFVhLnBoaSs9WmEucGhpKlouZGFtcGluZ0ZhY3Rvcik6KFVhLnRoZXRhKz1aYS50aGV0YSxVYS5waGkrPVphLnBoaSk7VWEudGhldGE9TWF0aC5tYXgoWi5taW5BemltdXRoQW5nbGUsTWF0aC5taW4oWi5tYXhBemltdXRoQW5nbGUsVWEudGhldGEpKTtVYS5waGk9TWF0aC5tYXgoWi5taW5Qb2xhckFuZ2xlLE1hdGgubWluKFoubWF4UG9sYXJBbmdsZSxVYS5waGkpKTtVYS5tYWtlU2FmZSgpO1VhLnJhZGl1cyo9emI7VWEucmFkaXVzPU1hdGgubWF4KFoubWluRGlzdGFuY2UsTWF0aC5taW4oWi5tYXhEaXN0YW5jZSxVYS5yYWRpdXMpKTshMD09PVouZW5hYmxlRGFtcGluZz9aLnRhcmdldC5hZGRTY2FsZWRWZWN0b3IoSWIsWi5kYW1waW5nRmFjdG9yKTpaLnRhcmdldC5hZGQoSWIpO3VhLnNldEZyb21TcGhlcmljYWwoVWEpO3VhLmFwcGx5UXVhdGVybmlvbihaYyk7CnFpLmNvcHkoWi50YXJnZXQpLmFkZCh1YSk7Wi5vYmplY3QubG9va0F0KFoudGFyZ2V0KTshMD09PVouZW5hYmxlRGFtcGluZz8oWmEudGhldGEqPTEtWi5kYW1waW5nRmFjdG9yLFphLnBoaSo9MS1aLmRhbXBpbmdGYWN0b3IsSWIubXVsdGlwbHlTY2FsYXIoMS1aLmRhbXBpbmdGYWN0b3IpKTooWmEuc2V0KDAsMCwwKSxJYi5zZXQoMCwwLDApKTt6Yj0xO3JldHVybiB1Ynx8TGQuZGlzdGFuY2VUb1NxdWFyZWQoWi5vYmplY3QucG9zaXRpb24pPnphfHw4KigxLWtlLmRvdChaLm9iamVjdC5xdWF0ZXJuaW9uKSk+emE/KFouZGlzcGF0Y2hFdmVudChGYSksTGQuY29weShaLm9iamVjdC5wb3NpdGlvbiksa2UuY29weShaLm9iamVjdC5xdWF0ZXJuaW9uKSx1Yj0hMSwhMCk6ITF9fSgpO3RoaXMuZGlzcG9zZT1mdW5jdGlvbigpe1ouZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsbGEsITEpO1ouZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLApVLCExKTtaLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2hlZWwiLG1hLCExKTtaLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsY2EsITEpO1ouZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsZGEsITEpO1ouZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLGZhLCExKTtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLFksITEpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGJhLCExKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsYWEsITEpfTt2YXIgWj10aGlzLEZhPXt0eXBlOiJjaGFuZ2UifSx4YT17dHlwZToic3RhcnQifSx5YT17dHlwZToiZW5kIn0sQmE9e05PTkU6LTEsUk9UQVRFOjAsRE9MTFk6MSxQQU46MixUT1VDSF9ST1RBVEU6MyxUT1VDSF9QQU46NCxUT1VDSF9ET0xMWV9QQU46NSxUT1VDSF9ET0xMWV9ST1RBVEU6Nn0sCkdhPUJhLk5PTkUsemE9MUUtNixVYT1uZXcgVEhSRUUuU3BoZXJpY2FsLFphPW5ldyBUSFJFRS5TcGhlcmljYWwsemI9MSxJYj1uZXcgVEhSRUUuVmVjdG9yMyx1Yj0hMSxGYj1uZXcgVEhSRUUuVmVjdG9yMixBYj1uZXcgVEhSRUUuVmVjdG9yMixQYj1uZXcgVEhSRUUuVmVjdG9yMixiYz1uZXcgVEhSRUUuVmVjdG9yMixHYj1uZXcgVEhSRUUuVmVjdG9yMixSYj1uZXcgVEhSRUUuVmVjdG9yMixFYz1uZXcgVEhSRUUuVmVjdG9yMix4Yz1uZXcgVEhSRUUuVmVjdG9yMixNZT1uZXcgVEhSRUUuVmVjdG9yMixpZT1mdW5jdGlvbigpe3ZhciB1YT1uZXcgVEhSRUUuVmVjdG9yMztyZXR1cm4gZnVuY3Rpb24oJGIsWmMpe3VhLnNldEZyb21NYXRyaXhDb2x1bW4oWmMsMCk7dWEubXVsdGlwbHlTY2FsYXIoLSRiKTtJYi5hZGQodWEpfX0oKSx0ZD1mdW5jdGlvbigpe3ZhciB1YT1uZXcgVEhSRUUuVmVjdG9yMztyZXR1cm4gZnVuY3Rpb24oJGIsWmMpeyEwPT09Wi5zY3JlZW5TcGFjZVBhbm5pbmc/CnVhLnNldEZyb21NYXRyaXhDb2x1bW4oWmMsMSk6KHVhLnNldEZyb21NYXRyaXhDb2x1bW4oWmMsMCksdWEuY3Jvc3NWZWN0b3JzKFoub2JqZWN0LnVwLHVhKSk7dWEubXVsdGlwbHlTY2FsYXIoJGIpO0liLmFkZCh1YSl9fSgpLGplPWZ1bmN0aW9uKCl7dmFyIHVhPW5ldyBUSFJFRS5WZWN0b3IzO3JldHVybiBmdW5jdGlvbigkYixaYyl7dmFyIExkPVouZG9tRWxlbWVudD09PWRvY3VtZW50P1ouZG9tRWxlbWVudC5ib2R5OlouZG9tRWxlbWVudDtpZihaLm9iamVjdC5pc1BlcnNwZWN0aXZlQ2FtZXJhKXt1YS5jb3B5KFoub2JqZWN0LnBvc2l0aW9uKS5zdWIoWi50YXJnZXQpO3ZhciBrZT11YS5sZW5ndGgoKTtrZSo9TWF0aC50YW4oWi5vYmplY3QuZm92LzIqTWF0aC5QSS8xODApO2llKDIqJGIqa2UvTGQuY2xpZW50SGVpZ2h0LFoub2JqZWN0Lm1hdHJpeCk7dGQoMipaYyprZS9MZC5jbGllbnRIZWlnaHQsWi5vYmplY3QubWF0cml4KX1lbHNlIFoub2JqZWN0LmlzT3J0aG9ncmFwaGljQ2FtZXJhPwooaWUoJGIqKFoub2JqZWN0LnJpZ2h0LVoub2JqZWN0LmxlZnQpL1oub2JqZWN0Lnpvb20vTGQuY2xpZW50V2lkdGgsWi5vYmplY3QubWF0cml4KSx0ZChaYyooWi5vYmplY3QudG9wLVoub2JqZWN0LmJvdHRvbSkvWi5vYmplY3Quem9vbS9MZC5jbGllbnRIZWlnaHQsWi5vYmplY3QubWF0cml4KSk6KGNvbnNvbGUud2FybigiV0FSTklORzogT3JiaXRDb250cm9scy5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gcGFuIGRpc2FibGVkLiIpLFouZW5hYmxlUGFuPSExKX19KCk7Wi5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IixsYSwhMSk7Wi5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsVSwhMSk7Wi5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndoZWVsIixtYSwhMSk7Wi5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLGNhLCExKTtaLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLApkYSwhMSk7Wi5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsZmEsITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixhYSwhMSk7dGhpcy51cGRhdGUoKX07VEhSRUUuT3JiaXRDb250cm9scy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShUSFJFRS5FdmVudERpc3BhdGNoZXIucHJvdG90eXBlKTtUSFJFRS5PcmJpdENvbnRyb2xzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1USFJFRS5PcmJpdENvbnRyb2xzO1RIUkVFLk1hcENvbnRyb2xzPWZ1bmN0aW9uKGEsYyl7VEhSRUUuT3JiaXRDb250cm9scy5jYWxsKHRoaXMsYSxjKTt0aGlzLm1vdXNlQnV0dG9ucy5MRUZUPVRIUkVFLk1PVVNFLlBBTjt0aGlzLm1vdXNlQnV0dG9ucy5SSUdIVD1USFJFRS5NT1VTRS5ST1RBVEU7dGhpcy50b3VjaGVzLk9ORT1USFJFRS5UT1VDSC5QQU47dGhpcy50b3VjaGVzLlRXTz1USFJFRS5UT1VDSC5ET0xMWV9ST1RBVEV9OwpUSFJFRS5NYXBDb250cm9scy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShUSFJFRS5FdmVudERpc3BhdGNoZXIucHJvdG90eXBlKTtUSFJFRS5NYXBDb250cm9scy5wcm90b3R5cGUuY29uc3RydWN0b3I9VEhSRUUuTWFwQ29udHJvbHM7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLWRpdmUvbGliL3Nwcml0ZS1hdGxhcy5qcwpjbGFzcyBXcCBleHRlbmRzIFRIUkVFLlRleHR1cmV7Y29uc3RydWN0b3IoYSxjLGQpe2NvbnN0IGY9TWF0aC5jZWlsKE1hdGguc3FydChhKSksZz1NYXRoLmNlaWwoYS9mKSxsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpO2wud2lkdGg9YypmO2wuaGVpZ2h0PWQqZztjb25zdCBrPWwuZ2V0Q29udGV4dCgiMmQiKTtzdXBlcihsKTt0aGlzLmNhcGFjaXR5PWE7dGhpcy5pbWFnZVdpZHRoPWM7dGhpcy5pbWFnZUhlaWdodD1kO3RoaXMuc3ByaXRlQ29sdW1ucz1mO3RoaXMuc3ByaXRlUm93cz1nO3RoaXMuY2FudmFzPWw7dGhpcy5jb250ZXh0PWs7dGhpcy5tYWdGaWx0ZXI9dGhpcy5taW5GaWx0ZXI9VEhSRUUuTGluZWFyRmlsdGVyO3RoaXMuZHJhd1RpbWVvdXQ9NTA7dGhpcy53YWl0VGltZW91dD0xO3RoaXMuZHJhd1F1ZXVlPVtdO3RoaXMuaXNEcmF3UXVldWVkPSExO3RoaXMubGFzdENsZWFyVGltZXN0YW1wPTA7dGhpcy5jYWxsYmFja1F1ZXVlPVtdO3RoaXMucGVuZGluZ0ltYWdlQ291bnQ9CjA7dGhpcy5maXR0ZXI9bmV3IFZwKHt4Oi4xMjUqYyx5Oi4xMjUqZCx3aWR0aDouNzUqYyxoZWlnaHQ6Ljc1KmR9KX1jbGVhclF1ZXVlcygpe3RoaXMuZHJhd1F1ZXVlPVtdO3RoaXMuY2FsbGJhY2tRdWV1ZT1bXTt0aGlzLnBlbmRpbmdJbWFnZUNvdW50PTA7cmV0dXJuIHRoaXMubGFzdENsZWFyVGltZXN0YW1wPURhdGUubm93KCl9c2V0U3ByaXRlSW1hZ2VEYXRhKGEsYyxkKXt0aGlzLmRyYXdRdWV1ZS5wdXNoKHtzcHJpdGVJbmRleDphLHRpbWVzdGFtcDpEYXRlLm5vdygpLGltYWdlRGF0YTpjLGNhbGxiYWNrOmR9KTt0aGlzLnF1ZXVlRHJhdygpfXNldEF0bGFzVXJsKGEsYyxkKXtjb25zdCBmPXRoaXMuY2xlYXJRdWV1ZXMoKSxnPW5ldyBJbWFnZTt2b2lkIDAhPT1jJiYoZy5jcm9zc09yaWdpbj1jKTt0aGlzLnBlbmRpbmdJbWFnZUNvdW50Kys7Zy5vbmVycm9yPSgpPT57dGhpcy5sYXN0Q2xlYXJUaW1lc3RhbXA+Znx8dGhpcy5wZW5kaW5nSW1hZ2VDb3VudC0tfTtnLm9ubG9hZD0KKCk9PntpZighKHRoaXMubGFzdENsZWFyVGltZXN0YW1wPmYpJiYodGhpcy5wZW5kaW5nSW1hZ2VDb3VudC0tLHRoaXMudXBkYXRlUHJvcGVydGllc1RvTWF0Y2hJbWFnZURpbWVuc2lvbnMoZy53aWR0aCxnLmhlaWdodCksdGhpcy5jb250ZXh0LmRyYXdJbWFnZShnLDAsMCx0aGlzLmNhbnZhcy53aWR0aCx0aGlzLmNhbnZhcy5oZWlnaHQpLHRoaXMubmVlZHNVcGRhdGU9ITAsZCYmdGhpcy5jYWxsYmFja1F1ZXVlLnB1c2goe2NhbGxiYWNrOmQsYXJnczpbZ119KSx0aGlzLm9uRHJhd0ZpbmlzaGVkKSl0aGlzLm9uRHJhd0ZpbmlzaGVkKCl9O2cuc3JjPWF9dXBkYXRlUHJvcGVydGllc1RvTWF0Y2hJbWFnZURpbWVuc2lvbnMoYSxjKXtpZihhIT09dGhpcy5pbWFnZVdpZHRoKnRoaXMuc3ByaXRlQ29sdW1uc3x8YyE9PXRoaXMuaW1hZ2VIZWlnaHQqdGhpcy5zcHJpdGVSb3dzKXt2YXIgZD1hL3RoaXMuaW1hZ2VXaWR0aCxmPWMvdGhpcy5pbWFnZUhlaWdodDtpZihkKmY8dGhpcy5jYXBhY2l0eSl0aHJvdyBFcnJvcigiQXRsYXMgaW1hZ2UgdG9vIHNtYWxsIHRvIGFjY29tbW9kYXRlIGF0bGFzIGNhcGFjaXR5LiIpOwppZihkIT09TWF0aC5yb3VuZChkKXx8ZiE9PU1hdGgucm91bmQoZikpdGhyb3cgRXJyb3IoIkF0bGFzIGltYWdlIGRpbWVuc2lvbnMgZG8gbm90IGZpdCBzcHJpdGUgaW1hZ2UgZGltZW5zaW9ucy4iKTt0aGlzLnNwcml0ZUNvbHVtbnM9ZDt0aGlzLnNwcml0ZVJvd3M9Zjt0aGlzLmNhbnZhcy53aWR0aD1hO3RoaXMuY2FudmFzLmhlaWdodD1jfX1wb3N0UmVuZGVyKCl7aWYoISh0aGlzLmRyYXdRdWV1ZS5sZW5ndGh8fDA8dGhpcy5wZW5kaW5nSW1hZ2VDb3VudCkpZm9yKDt0aGlzLmNhbGxiYWNrUXVldWUubGVuZ3RoOyl7Y29uc3Qge2NhbGxiYWNrOmEsYXJnczpjfT10aGlzLmNhbGxiYWNrUXVldWUuc2hpZnQoKTthLmFwcGx5KG51bGwsYyl9fXF1ZXVlRHJhdygpe3RoaXMuaXNEcmF3UXVldWVkfHwodGhpcy5pc0RyYXdRdWV1ZWQ9ITAsc2V0VGltZW91dCgoKT0+e3RoaXMuaXNEcmF3UXVldWVkJiZ0aGlzLndvcmtPbkRyYXdKb2JzKCl9LHRoaXMud2FpdFRpbWVvdXQpKX13b3JrT25EcmF3Sm9icygpe3RoaXMuaXNEcmF3UXVldWVkPQohMTtjb25zdCBhPURhdGUubm93KCksYz1hKyh0aGlzLmRyYXdUaW1lb3V0fHxJbmZpbml0eSk7Zm9yKDt0aGlzLmRyYXdRdWV1ZS5sZW5ndGgmJkRhdGUubm93KCk8Yzspe2NvbnN0IHtzcHJpdGVJbmRleDpwLHRpbWVzdGFtcDpxLGltYWdlRGF0YTpyLGltYWdlOnQsY2FsbGJhY2s6dn09dGhpcy5kcmF3UXVldWUuc2hpZnQoKTtpZih0KXt2YXIgZD10aGlzLmltYWdlV2lkdGgsZj10aGlzLmltYWdlSGVpZ2h0LGc9cCV0aGlzLnNwcml0ZUNvbHVtbnMqZCxsPWYqTWF0aC5mbG9vcihwL3RoaXMuc3ByaXRlQ29sdW1ucyk7dGhpcy5jb250ZXh0LmNsZWFyUmVjdChnLGwsZCxmKTt0aGlzLmNvbnRleHQuZHJhd0ltYWdlKHQsZyxsLGQsZik7ImZ1bmN0aW9uIj09PXR5cGVvZiB2JiZ0aGlzLmNhbGxiYWNrUXVldWUucHVzaCh7Y2FsbGJhY2s6dixhcmdzOltwXX0pfWVsc2UgaWYociYmInRleHQiPT09ci50eXBlKXtkPXAldGhpcy5zcHJpdGVDb2x1bW5zKnRoaXMuaW1hZ2VXaWR0aDtmPXRoaXMuaW1hZ2VIZWlnaHQqCk1hdGguZmxvb3IocC90aGlzLnNwcml0ZUNvbHVtbnMpO3ZhciBrPWQrdGhpcy5pbWFnZVdpZHRoLzIsbj1mK3RoaXMuaW1hZ2VIZWlnaHQvMjtnPXRoaXMuZml0dGVyLmZpdChyLmRhdGErIiIpO2w9dGhpcy5jb250ZXh0O2wuY2xlYXJSZWN0KGQsZix0aGlzLmltYWdlV2lkdGgsdGhpcy5pbWFnZUhlaWdodCk7bC5zYXZlKCk7bC50cmFuc2xhdGUoayxuKTtsLnNjYWxlKHRoaXMuaW1hZ2VXaWR0aCx0aGlzLmltYWdlSGVpZ2h0KTtsLmJlZ2luUGF0aCgpO2wuYXJjKDAsMCwuNSwwLDIqTWF0aC5QSSk7bC5yZXN0b3JlKCk7bC5maWxsU3R5bGU9IiM1NTU1NTUiO2wuZmlsbCgpO2wuZmlsbFN0eWxlPSJ3aGl0ZSI7bC50ZXh0QmFzZWxpbmU9ImhhbmdpbmciO2wuZm9udD1gJHtyLnNwZWNpYWw/Iml0YWxpYyI6ImJvbGQifSAke2cuZm9udFNpemV9cHggJHsiJ1JvYm90byBNb25vJywgJ0NvbnNvbGFzJywgJ01lbmxvJywgbW9ub3NwYWNlIn1gO2s9Zy5saW5lcztmb3Iobj0wO248ay5sZW5ndGg7bisrKXtjb25zdCB5PQprW25dO2wuZmlsbFRleHQoeS50ZXh0LGQreS54LGYreS55LHkudGV4dC5sZW5ndGgqdGhpcy5maXR0ZXIuc2V0dGluZ3MuZ2x5cGhBc3BlY3RSYXRpbypnLmZvbnRTaXplKX0iZnVuY3Rpb24iPT09dHlwZW9mIHYmJnRoaXMuY2FsbGJhY2tRdWV1ZS5wdXNoKHtjYWxsYmFjazp2LGFyZ3M6W3BdfSl9ZWxzZSBpZihyKXtjb25zdCB5PW5ldyBJbWFnZTt0aGlzLnBlbmRpbmdJbWFnZUNvdW50Kys7eS5vbmxvYWQ9KCk9PnthPHRoaXMubGFzdENsZWFyVGltZXN0YW1wfHwodGhpcy5wZW5kaW5nSW1hZ2VDb3VudC0tLHRoaXMuZHJhd1F1ZXVlLnVuc2hpZnQoe3Nwcml0ZUluZGV4OnAsdGltZXN0YW1wOnEsaW1hZ2U6eSxjYWxsYmFjazp2fSksdGhpcy5xdWV1ZURyYXcoKSl9O3kub25lcnJvcj0oKT0+e2E8dGhpcy5sYXN0Q2xlYXJUaW1lc3RhbXB8fCh0aGlzLnBlbmRpbmdJbWFnZUNvdW50LS0sdGhpcy5kcmF3UXVldWUucHVzaCh7c3ByaXRlSW5kZXg6cCx0aW1lc3RhbXA6cSxpbWFnZURhdGE6ciwKY2FsbGJhY2s6dn0pLHRoaXMucXVldWVEcmF3KCkpfTt5LnNyYz0ic3ZnIj09PXIudHlwZT9VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtyLmRhdGFdLHt0eXBlOiJpbWFnZS9zdmcreG1sO2NoYXJzZXRceDNkdXRmLTgifSkpOmBkYXRhOiR7ci50eXBlfTtiYXNlNjQsJHtyLmRhdGF9YH19aWYodGhpcy5kcmF3UXVldWUubGVuZ3RofHwwPHRoaXMucGVuZGluZ0ltYWdlQ291bnQpdGhpcy5xdWV1ZURyYXcoKTtlbHNlIGlmKHRoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5vbkRyYXdGaW5pc2hlZCl0aGlzLm9uRHJhd0ZpbmlzaGVkKCl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9mYWNldHMtZGl2ZS9saWIvc3ByaXRlLW1hdGVyaWFsLmpzCmNsYXNzIFhwIGV4dGVuZHMgVEhSRUUuUmF3U2hhZGVyTWF0ZXJpYWx7Y29uc3RydWN0b3IoYSxjKXtzdXBlcih7dmVydGV4U2hhZGVyOiJcblxuICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4gIHByZWNpc2lvbiBoaWdocCBpbnQ7XG5cbiAgI2RlZmluZSBTSEFERVJfTkFNRSBTcHJpdGVNYXRlcmlhbFxuXG4gIC8vIFN0YW5kYXJkIHVuaWZvcm1zIHByb3ZpZGVkIGJ5IFRIUkVFLmpzIGZvciBwcm9qZWN0aW5nIHRocm91Z2ggdGhlIGNhbWVyYS5cbiAgdW5pZm9ybSBtYXQ0IG1vZGVsVmlld01hdHJpeDtcbiAgdW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7XG5cbiAgdW5pZm9ybSBmbG9hdCB0aW1lO1xuXG4gIHVuaWZvcm0gZmxvYXQgc3ByaXRlQ29sdW1ucztcbiAgdW5pZm9ybSBmbG9hdCBzcHJpdGVSb3dzO1xuXG4gIGF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uO1xuICBhdHRyaWJ1dGUgdmVjMyBiYXNlUG9zaXRpb247XG5cbiAgYXR0cmlidXRlIHZlYzQgY29sb3I7XG4gIGF0dHJpYnV0ZSB2ZWM0IGJhc2VDb2xvcjtcblxuICBhdHRyaWJ1dGUgZmxvYXQgb3BhY2l0eTtcbiAgYXR0cmlidXRlIGZsb2F0IGJhc2VPcGFjaXR5O1xuXG4gIGF0dHJpYnV0ZSBmbG9hdCB0aW1lc3RhbXA7XG4gIGF0dHJpYnV0ZSBmbG9hdCBiYXNlVGltZXN0YW1wO1xuXG4gIGF0dHJpYnV0ZSBmbG9hdCB2ZXJ0ZXhJbmRleDtcblxuICBhdHRyaWJ1dGUgZmxvYXQgdGV4dHVyZUluZGV4O1xuICBhdHRyaWJ1dGUgZmxvYXQgYmFzZVRleHR1cmVJbmRleDtcblxuICBhdHRyaWJ1dGUgZmxvYXQgdGV4dHVyZVRpbWVzdGFtcDtcbiAgYXR0cmlidXRlIGZsb2F0IGJhc2VUZXh0dXJlVGltZXN0YW1wO1xuXG4gIC8vIENvbXB1dGVkIFVWIGNvb3JkaW5hdGVzIGludG8gdGhlIGRlZmF1bHRUZXh0dXJlIGJhc2VkIG9uIHRoZSB2ZXJ0ZXhJbmRleC5cbiAgdmFyeWluZyB2ZWMyIHZEZWZhdWx0VXY7XG5cbiAgLy8gQ29tcHV0ZWQgVVYgY29vcmRpbmF0ZXMgaW50byB0aGUgc3ByaXRlIHRleHR1cmUgYXRsYXMuXG4gIHZhcnlpbmcgdmVjMiB2U3ByaXRlVXY7XG5cbiAgLy8gSW50ZXJwb2xhdGVkIGNvbG9yIHVzZWQgYnkgdGhlIGZyYWdtZW50IHNoYWRlci5cbiAgdmFyeWluZyB2ZWM0IHZDb2xvcjtcblxuICAvLyBJbnRlcnBvbGF0ZWQgb3BhY2l0eSB1c2VkIGJ5IHRoZSBmcmFnbWVudCBzaGFkZXIuXG4gIHZhcnlpbmcgZmxvYXQgdk9wYWNpdHk7XG5cbiAgLy8gRGVncmVlIG9mIG1peGluZyBiZXR3ZWVuIGJhc2UgYW5kIGN1cnJlbnQgdGV4dHVyZS5cbiAgdmFyeWluZyBmbG9hdCB2VGV4dHVyZU1peDtcblxuICBmbG9hdCBhcHBseUVhc2luZyhmbG9hdCB0KSB7XG4gICAgcmV0dXJuIHQgXHgzYyAwLjUgPyA0LjAgKiB0ICogdCAqIHQgOlxuICAgICAgNC4wICogKHQgLSAxLjApICogKHQgLSAxLjApICogKHQgLSAxLjApICsgMS4wO1xuICB9XG5cbiAgdm9pZCBtYWluKCkge1xuXG4gICAgLy8gQ29tcHV0ZSBkZWZhdWx0IFVWcy4gQSBceDNkXHgzZSAoMCwwKSwgQiBceDNkXHgzZSAoMSwwKSwgZXRjLlxuICAgIHZEZWZhdWx0VXYueCBceDNkIG1vZChmbG9vcigodmVydGV4SW5kZXggKyAxLjApIC8gMi4wKSwgMi4wKTtcbiAgICB2RGVmYXVsdFV2LnkgXHgzZCBtb2QoZmxvb3IodmVydGV4SW5kZXggLyAyLjApLCAyLjApO1xuXG4gICAgLy8gRGV0ZXJtaW5lIHRoZSByb3cgYW5kIGNvbHVtbiBpbmRpY2VzIGZvciB0aGlzIHNwcml0ZS5cbiAgICBmbG9hdCBzcHJpdGVJbmRleCBceDNkIGZsb29yKHZlcnRleEluZGV4IC8gNC4wKSArIDAuNTtcbiAgICBmbG9hdCBjb2x1bW5JbmRleCBceDNkIGZsb29yKG1vZChzcHJpdGVJbmRleCwgc3ByaXRlQ29sdW1ucykpO1xuICAgIGZsb2F0IHJvd0luZGV4IFx4M2Qgc3ByaXRlUm93cyAtIDEuMCAtIGZsb29yKHNwcml0ZUluZGV4IC8gc3ByaXRlQ29sdW1ucyk7XG5cbiAgICAvLyBDb21wdXRlIHNwcml0ZSBVVnMgZnJvbSByb3cgYW5kIGNvbHVtbiBpbmRpY2VzLlxuICAgIHZTcHJpdGVVdi54IFx4M2QgKGNvbHVtbkluZGV4ICsgdkRlZmF1bHRVdi54KSAvIHNwcml0ZUNvbHVtbnM7XG4gICAgdlNwcml0ZVV2LnkgXHgzZCAocm93SW5kZXggKyB2RGVmYXVsdFV2LnkpIC8gc3ByaXRlUm93cztcblxuICAgIGZsb2F0IGJsZW5kIFx4M2QgYXBwbHlFYXNpbmcoc21vb3Roc3RlcChiYXNlVGltZXN0YW1wLCB0aW1lc3RhbXAsIHRpbWUpKTtcblxuICAgIHZUZXh0dXJlTWl4IFx4M2QgbWl4KGJhc2VUZXh0dXJlSW5kZXgsIHRleHR1cmVJbmRleCxcbiAgICAgICAgc21vb3Roc3RlcChiYXNlVGV4dHVyZVRpbWVzdGFtcCwgdGV4dHVyZVRpbWVzdGFtcCwgdGltZSkpO1xuXG4gICAgdkNvbG9yIFx4M2QgbWl4KGJhc2VDb2xvciwgY29sb3IsIGJsZW5kKTtcblxuICAgIHZPcGFjaXR5IFx4M2QgbWl4KGJhc2VPcGFjaXR5LCBvcGFjaXR5LCBibGVuZCk7XG5cbiAgICBnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKlxuICAgICAgICB2ZWM0KG1peChiYXNlUG9zaXRpb24sIHBvc2l0aW9uLCB2ZWMzKGJsZW5kKSksIDEuMCk7XG5cbiAgfVxuXG4iLApmcmFnbWVudFNoYWRlcjoiXG5cbiAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuICBwcmVjaXNpb24gaGlnaHAgaW50O1xuXG4gICNkZWZpbmUgU0hBREVSX05BTUUgU3ByaXRlTWF0ZXJpYWxcblxuICAvLyBMaWdodG5lc3MgdGhhdCBzaG91bGQgaWRlYWxseSBleGFjdGx5IG1hdGNoIHRoZSB2Q29sb3IuXG4gICNkZWZpbmUgVEFSR0VUX0xJR0hUTkVTUyAwLjZcblxuICB1bmlmb3JtIGZsb2F0IHRpbWU7XG5cbiAgdW5pZm9ybSBzYW1wbGVyMkQgZGVmYXVsdFRleHR1cmU7XG4gIHVuaWZvcm0gc2FtcGxlcjJEIHNwcml0ZUF0bGFzO1xuXG4gIHZhcnlpbmcgdmVjMiB2RGVmYXVsdFV2O1xuICB2YXJ5aW5nIHZlYzIgdlNwcml0ZVV2O1xuICB2YXJ5aW5nIHZlYzQgdkNvbG9yO1xuICB2YXJ5aW5nIGZsb2F0IHZPcGFjaXR5O1xuICB2YXJ5aW5nIGZsb2F0IHZUZXh0dXJlTWl4O1xuXG4gIC8vIENvbXB1dGUgcmVsYXRpdmUgbHVtaW5hbmNlIGZyb20gUkdCLlxuICBmbG9hdCByZ2JUb0wodmVjMyByZ2IpIHtcbiAgICByZXR1cm4gZG90KHJnYiwgdmVjMygwLjMsIDAuNTksIDAuMTEpKTtcbiAgfVxuXG4gIC8vIEFwcGx5IGx1bWluYW5jZSBlYXNpbmcuXG4gIGZsb2F0IGVhc2VMKGZsb2F0IGwpIHtcbiAgICByZXR1cm4gMS4wIC0gKDEuMCAtIGwpICogKDEuMCAtIGwpICogKDEuMCAtIGwpO1xuICB9XG5cbiAgdm9pZCBtYWluKCkge1xuICAgIGlmICh2T3BhY2l0eSBceDNjXHgzZCAwLjA1KSB7XG4gICAgICBkaXNjYXJkO1xuICAgIH1cblxuICAgIC8vIEludGVycG9sYXRlIGJldHdlZW4gZGVmYXVsdCB0ZXh0dXJlIGFuZCBzcHJpdGUgdGV4dHVyZS5cbiAgICB2ZWM0IGRlZmF1bHRDb2xvciBceDNkXG4gICAgICB2VGV4dHVyZU1peCBceDNjIDEuMCA/IHRleHR1cmUyRChkZWZhdWx0VGV4dHVyZSwgdkRlZmF1bHRVdikgOiB2ZWM0KDAuMCk7XG4gICAgdmVjNCBzcHJpdGVDb2xvciBceDNkXG4gICAgICB2VGV4dHVyZU1peCBceDNlIDAuMCA/IHRleHR1cmUyRChzcHJpdGVBdGxhcywgdlNwcml0ZVV2KSA6IHZlYzQoMC4wKTtcbiAgICB2ZWM0IG1peGVkQ29sb3IgXHgzZCBtaXgoZGVmYXVsdENvbG9yLCBzcHJpdGVDb2xvciwgdlRleHR1cmVNaXgpO1xuXG4gICAgLy8gTGlnaHRuZXNzIG9mIHRoZSBtaXhlZCBwaXhlbC5cbiAgICBmbG9hdCBtaXhlZEwgXHgzZCByZ2JUb0wobWl4ZWRDb2xvci5yZ2IpO1xuXG4gICAgLy8gVXNpbmcgdGhlIG1peGVkIGFuZCB0YXJnZXQgbGlnaHRuZXNzLCBkZXRlcm1pbmUgdGhlIGNvbG9yIHRoYXQncyBiZXR3ZWVuXG4gICAgLy8gYmxhY2ssIHZDb2xvciBhbmQgd2hpdGUuXG4gICAgdmVjMyBjb2xvciBceDNkIG1peGVkTCBceDNjIFRBUkdFVF9MSUdIVE5FU1MgP1xuICAgICAgICBtaXgodmVjMygwLjApLCB2Q29sb3IucmdiLCBlYXNlTChtaXhlZEwgLyBUQVJHRVRfTElHSFRORVNTKSkgOlxuICAgICAgICBtaXgodmVjMygxLjApLCB2Q29sb3IucmdiLFxuICAgICAgICAgICAgZWFzZUwoKDEuMCAtIG1peGVkTCkgLyAoMS4wIC0gVEFSR0VUX0xJR0hUTkVTUykpKTtcblxuICAgIHZlYzMgZmluYWxDb2xvciBceDNkIG1peChtaXhlZENvbG9yLnJnYiwgY29sb3IsIHZDb2xvci5hKTtcblxuICAgIC8vIEFwcGx5IG9wYWNpdHkuXG4gICAgZ2xfRnJhZ0NvbG9yIFx4M2QgdmVjNChmaW5hbENvbG9yLCBtaXhlZENvbG9yLmEgKiB2T3BhY2l0eSk7XG4gIH1cbiIsCnVuaWZvcm1zOnt0aW1lOnt0eXBlOiJmIix2YWx1ZTowfSxkZWZhdWx0VGV4dHVyZTp7dHlwZToidCIsdmFsdWU6YX0sc3ByaXRlQXRsYXM6e3R5cGU6InQiLHZhbHVlOmN9LHNwcml0ZUNvbHVtbnM6e3R5cGU6ImYiLHZhbHVlOmM/Yy5zcHJpdGVDb2x1bW5zOjF9LHNwcml0ZVJvd3M6e3R5cGU6ImYiLHZhbHVlOmM/Yy5zcHJpdGVSb3dzOjF9fSx0cmFuc3BhcmVudDohMH0pfWdldCB0aW1lKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMudGltZS52YWx1ZX1zZXQgdGltZShhKXt0aGlzLnVuaWZvcm1zLnRpbWUudmFsdWU9YX1nZXQgZGVmYXVsdFRleHR1cmUoKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy5kZWZhdWx0VGV4dHVyZS52YWx1ZX1zZXQgZGVmYXVsdFRleHR1cmUoYSl7dGhpcy51bmlmb3Jtcy5kZWZhdWx0VGV4dHVyZS52YWx1ZT1hfWdldCBzcHJpdGVBdGxhcygpe3JldHVybiB0aGlzLnVuaWZvcm1zLnNwcml0ZUF0bGFzLnZhbHVlfXNldCBzcHJpdGVBdGxhcyhhKXt0aGlzLnVuaWZvcm1zLnNwcml0ZUF0bGFzLnZhbHVlPQphfXVwZGF0ZUF0bGFzVW5pZm9ybXMoKXt0aGlzLnVuaWZvcm1zLnNwcml0ZUNvbHVtbnMudmFsdWU9dGhpcy5zcHJpdGVBdGxhcy5zcHJpdGVDb2x1bW5zO3RoaXMudW5pZm9ybXMuc3ByaXRlUm93cy52YWx1ZT10aGlzLnNwcml0ZUF0bGFzLnNwcml0ZVJvd3N9YXBwbHlFYXNpbmcoYSl7cmV0dXJuLjU+YT80KmEqYSphOjQqKGEtMSkqKGEtMSkqKGEtMSkrMX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2ZhY2V0cy1kaXZlL2xpYi9zcHJpdGUtbWVzaC5qcwpjbGFzcyBZcHtjb25zdHJ1Y3RvcihhLGMpe3RoaXMuX3Nwcml0ZU1lc2g9YTt0aGlzLl9zcHJpdGVJbmRleD1jfWdldCBzcHJpdGVNZXNoKCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2h9Z2V0IHNwcml0ZUluZGV4KCl7cmV0dXJuIHRoaXMuX3Nwcml0ZUluZGV4fWdldCB4KCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0WCh0aGlzLl9zcHJpdGVJbmRleCl9c2V0IHgoYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRYKHRoaXMuX3Nwcml0ZUluZGV4LGEpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0WSh0aGlzLl9zcHJpdGVJbmRleCl9c2V0IHkoYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRZKHRoaXMuX3Nwcml0ZUluZGV4LGEpfWdldCB6KCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0Wih0aGlzLl9zcHJpdGVJbmRleCl9c2V0IHooYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRaKHRoaXMuX3Nwcml0ZUluZGV4LGEpfWdldCByKCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0Uih0aGlzLl9zcHJpdGVJbmRleCl9c2V0IHIoYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRSKHRoaXMuX3Nwcml0ZUluZGV4LAphKX1nZXQgZygpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldEcodGhpcy5fc3ByaXRlSW5kZXgpfXNldCBnKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0Ryh0aGlzLl9zcHJpdGVJbmRleCxhKX1nZXQgYigpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldEIodGhpcy5fc3ByaXRlSW5kZXgpfXNldCBiKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0Qih0aGlzLl9zcHJpdGVJbmRleCxhKX1nZXQgYSgpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldEEodGhpcy5fc3ByaXRlSW5kZXgpfXNldCBhKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0QSh0aGlzLl9zcHJpdGVJbmRleCxhKX1nZXQgb3BhY2l0eSgpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldE9wYWNpdHkodGhpcy5fc3ByaXRlSW5kZXgpfXNldCBvcGFjaXR5KGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0T3BhY2l0eSh0aGlzLl9zcHJpdGVJbmRleCxhKX1nZXQgdGltZXN0YW1wKCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0VGltZXN0YW1wKHRoaXMuX3Nwcml0ZUluZGV4KX1zZXQgdGltZXN0YW1wKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0VGltZXN0YW1wKHRoaXMuX3Nwcml0ZUluZGV4LAphKX1nZXQgYmFzZVgoKXtyZXR1cm4gdGhpcy5fc3ByaXRlTWVzaC5nZXRCYXNlWCh0aGlzLl9zcHJpdGVJbmRleCl9c2V0IGJhc2VYKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0QmFzZVgodGhpcy5fc3ByaXRlSW5kZXgsYSl9Z2V0IGJhc2VZKCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0QmFzZVkodGhpcy5fc3ByaXRlSW5kZXgpfXNldCBiYXNlWShhKXt0aGlzLl9zcHJpdGVNZXNoLnNldEJhc2VZKHRoaXMuX3Nwcml0ZUluZGV4LGEpfWdldCBiYXNlWigpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldEJhc2VaKHRoaXMuX3Nwcml0ZUluZGV4KX1zZXQgYmFzZVooYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRCYXNlWih0aGlzLl9zcHJpdGVJbmRleCxhKX1nZXQgYmFzZVIoKXtyZXR1cm4gdGhpcy5fc3ByaXRlTWVzaC5nZXRCYXNlUih0aGlzLl9zcHJpdGVJbmRleCl9c2V0IGJhc2VSKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0QmFzZVIodGhpcy5fc3ByaXRlSW5kZXgsYSl9Z2V0IGJhc2VHKCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0QmFzZUcodGhpcy5fc3ByaXRlSW5kZXgpfXNldCBiYXNlRyhhKXt0aGlzLl9zcHJpdGVNZXNoLnNldEJhc2VHKHRoaXMuX3Nwcml0ZUluZGV4LAphKX1nZXQgYmFzZUIoKXtyZXR1cm4gdGhpcy5fc3ByaXRlTWVzaC5nZXRCYXNlQih0aGlzLl9zcHJpdGVJbmRleCl9c2V0IGJhc2VCKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0QmFzZUIodGhpcy5fc3ByaXRlSW5kZXgsYSl9Z2V0IGJhc2VBKCl7cmV0dXJuIHRoaXMuX3Nwcml0ZU1lc2guZ2V0QmFzZUEodGhpcy5fc3ByaXRlSW5kZXgpfXNldCBiYXNlQShhKXt0aGlzLl9zcHJpdGVNZXNoLnNldEJhc2VBKHRoaXMuX3Nwcml0ZUluZGV4LGEpfWdldCBiYXNlT3BhY2l0eSgpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldEJhc2VPcGFjaXR5KHRoaXMuX3Nwcml0ZUluZGV4KX1zZXQgYmFzZU9wYWNpdHkoYSl7dGhpcy5fc3ByaXRlTWVzaC5zZXRCYXNlT3BhY2l0eSh0aGlzLl9zcHJpdGVJbmRleCxhKX1nZXQgYmFzZVRpbWVzdGFtcCgpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldEJhc2VUaW1lc3RhbXAodGhpcy5fc3ByaXRlSW5kZXgpfXNldCBiYXNlVGltZXN0YW1wKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0QmFzZVRpbWVzdGFtcCh0aGlzLl9zcHJpdGVJbmRleCwKYSl9Z2V0IHRleHR1cmVJbmRleCgpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldFRleHR1cmVJbmRleCh0aGlzLl9zcHJpdGVJbmRleCl9c2V0IHRleHR1cmVJbmRleChhKXt0aGlzLl9zcHJpdGVNZXNoLnNldFRleHR1cmVJbmRleCh0aGlzLl9zcHJpdGVJbmRleCxhKX1nZXQgYmFzZVRleHR1cmVJbmRleCgpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldEJhc2VUZXh0dXJlSW5kZXgodGhpcy5fc3ByaXRlSW5kZXgpfXNldCBiYXNlVGV4dHVyZUluZGV4KGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0QmFzZVRleHR1cmVJbmRleCh0aGlzLl9zcHJpdGVJbmRleCxhKX1nZXQgdGV4dHVyZVRpbWVzdGFtcCgpe3JldHVybiB0aGlzLl9zcHJpdGVNZXNoLmdldFRleHR1cmVUaW1lc3RhbXAodGhpcy5fc3ByaXRlSW5kZXgpfXNldCB0ZXh0dXJlVGltZXN0YW1wKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0VGV4dHVyZVRpbWVzdGFtcCh0aGlzLl9zcHJpdGVJbmRleCxhKX1nZXQgYmFzZVRleHR1cmVUaW1lc3RhbXAoKXtyZXR1cm4gdGhpcy5fc3ByaXRlTWVzaC5nZXRCYXNlVGV4dHVyZVRpbWVzdGFtcCh0aGlzLl9zcHJpdGVJbmRleCl9c2V0IGJhc2VUZXh0dXJlVGltZXN0YW1wKGEpe3RoaXMuX3Nwcml0ZU1lc2guc2V0QmFzZVRleHR1cmVUaW1lc3RhbXAodGhpcy5fc3ByaXRlSW5kZXgsCmEpfXJlYmFzZShhKXt0aGlzLl9zcHJpdGVNZXNoLnJlYmFzZSh0aGlzLl9zcHJpdGVJbmRleCxhKX1zZXRTcHJpdGVJbWFnZURhdGEoYSxjKXt0aGlzLl9zcHJpdGVNZXNoLnNldFNwcml0ZUltYWdlRGF0YSh0aGlzLl9zcHJpdGVJbmRleCxhLGMpfXN3aXRjaFRleHR1cmVzKGEsYyl7dGhpcy5fc3ByaXRlTWVzaC5zd2l0Y2hUZXh0dXJlcyh0aGlzLl9zcHJpdGVJbmRleCxhLGMpfX0KY2xhc3MgWnAgZXh0ZW5kcyBUSFJFRS5NZXNoe2NvbnN0cnVjdG9yKGEsYz0zMixkPTMyKXtzdXBlcigpO3RoaXMuY2FwYWNpdHk9YTt0aGlzLmltYWdlV2lkdGg9Yzt0aGlzLmltYWdlSGVpZ2h0PWQ7dGhpcy5uZXh0SW5kZXg9MDt0aGlzLnNwcml0ZVdpZHRoPXRoaXMuaW1hZ2VXaWR0aC90aGlzLmltYWdlSGVpZ2h0O3RoaXMuc3ByaXRlSGVpZ2h0PTE7dGhpcy5nZW9tZXRyeT1uZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnk7dGhpcy5wb3NpdGlvbkRhdGE9bmV3IEZsb2F0MzJBcnJheSgxMiphKTt0aGlzLnBvc2l0aW9uQXR0cmlidXRlPW5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUodGhpcy5wb3NpdGlvbkRhdGEsMyk7dGhpcy5wb3NpdGlvbkF0dHJpYnV0ZS5zZXREeW5hbWljKCEwKTt0aGlzLmdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLHRoaXMucG9zaXRpb25BdHRyaWJ1dGUpO3RoaXMuYmFzZVBvc2l0aW9uRGF0YT1uZXcgRmxvYXQzMkFycmF5KDEyKmEpO3RoaXMuYmFzZVBvc2l0aW9uQXR0cmlidXRlPQpuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKHRoaXMuYmFzZVBvc2l0aW9uRGF0YSwzKTt0aGlzLmJhc2VQb3NpdGlvbkF0dHJpYnV0ZS5zZXREeW5hbWljKCEwKTt0aGlzLmdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgiYmFzZVBvc2l0aW9uIix0aGlzLmJhc2VQb3NpdGlvbkF0dHJpYnV0ZSk7dGhpcy5jb2xvckRhdGE9bmV3IFVpbnQ4QXJyYXkoMTYqYSk7dGhpcy5jb2xvckF0dHJpYnV0ZT1uZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKHRoaXMuY29sb3JEYXRhLDQpO3RoaXMuY29sb3JBdHRyaWJ1dGUubm9ybWFsaXplZD0hMDt0aGlzLmNvbG9yQXR0cmlidXRlLnNldER5bmFtaWMoITApO3RoaXMuZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCJjb2xvciIsdGhpcy5jb2xvckF0dHJpYnV0ZSk7dGhpcy5iYXNlQ29sb3JEYXRhPW5ldyBVaW50OEFycmF5KDE2KmEpO3RoaXMuYmFzZUNvbG9yQXR0cmlidXRlPW5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUodGhpcy5iYXNlQ29sb3JEYXRhLDQpO3RoaXMuYmFzZUNvbG9yQXR0cmlidXRlLm5vcm1hbGl6ZWQ9CiEwO3RoaXMuYmFzZUNvbG9yQXR0cmlidXRlLnNldER5bmFtaWMoITApO3RoaXMuZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCJiYXNlQ29sb3IiLHRoaXMuYmFzZUNvbG9yQXR0cmlidXRlKTt0aGlzLm9wYWNpdHlEYXRhPW5ldyBGbG9hdDMyQXJyYXkoNCphKTt0aGlzLm9wYWNpdHlBdHRyaWJ1dGU9bmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSh0aGlzLm9wYWNpdHlEYXRhLDEpO3RoaXMub3BhY2l0eUF0dHJpYnV0ZS5zZXREeW5hbWljKCEwKTt0aGlzLmdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgib3BhY2l0eSIsdGhpcy5vcGFjaXR5QXR0cmlidXRlKTt0aGlzLmJhc2VPcGFjaXR5RGF0YT1uZXcgRmxvYXQzMkFycmF5KDQqYSk7dGhpcy5iYXNlT3BhY2l0eUF0dHJpYnV0ZT1uZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKHRoaXMuYmFzZU9wYWNpdHlEYXRhLDEpO3RoaXMuYmFzZU9wYWNpdHlBdHRyaWJ1dGUuc2V0RHluYW1pYyghMCk7dGhpcy5nZW9tZXRyeS5hZGRBdHRyaWJ1dGUoImJhc2VPcGFjaXR5IiwKdGhpcy5iYXNlT3BhY2l0eUF0dHJpYnV0ZSk7dGhpcy50aW1lc3RhbXBEYXRhPW5ldyBGbG9hdDMyQXJyYXkoNCphKTt0aGlzLnRpbWVzdGFtcEF0dHJpYnV0ZT1uZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKHRoaXMudGltZXN0YW1wRGF0YSwxKTt0aGlzLnRpbWVzdGFtcEF0dHJpYnV0ZS5zZXREeW5hbWljKCEwKTt0aGlzLmdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgidGltZXN0YW1wIix0aGlzLnRpbWVzdGFtcEF0dHJpYnV0ZSk7dGhpcy5iYXNlVGltZXN0YW1wRGF0YT1uZXcgRmxvYXQzMkFycmF5KDQqYSk7dGhpcy5iYXNlVGltZXN0YW1wQXR0cmlidXRlPW5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUodGhpcy5iYXNlVGltZXN0YW1wRGF0YSwxKTt0aGlzLmJhc2VUaW1lc3RhbXBBdHRyaWJ1dGUuc2V0RHluYW1pYyghMCk7dGhpcy5nZW9tZXRyeS5hZGRBdHRyaWJ1dGUoImJhc2VUaW1lc3RhbXAiLHRoaXMuYmFzZVRpbWVzdGFtcEF0dHJpYnV0ZSk7dGhpcy5mYWNlSW5kZXhEYXRhPQpuZXcgVWludDMyQXJyYXkoNiphKTtmb3IodmFyIGY9MDtmPGE7ZisrKXt2YXIgZz02KmY7Y29uc3QgbD00KmY7dGhpcy5mYWNlSW5kZXhEYXRhW2crMF09bCswO3RoaXMuZmFjZUluZGV4RGF0YVtnKzFdPWwrMTt0aGlzLmZhY2VJbmRleERhdGFbZysyXT1sKzI7dGhpcy5mYWNlSW5kZXhEYXRhW2crM109bCswO3RoaXMuZmFjZUluZGV4RGF0YVtnKzRdPWwrMjt0aGlzLmZhY2VJbmRleERhdGFbZys1XT1sKzN9dGhpcy5mYWNlSW5kZXhBdHRyaWJ1dGU9bmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSh0aGlzLmZhY2VJbmRleERhdGEsMSk7dGhpcy5nZW9tZXRyeS5zZXRJbmRleCh0aGlzLmZhY2VJbmRleEF0dHJpYnV0ZSk7dGhpcy50ZXh0dXJlSW5kZXhEYXRhPW5ldyBGbG9hdDMyQXJyYXkoNCphKTt0aGlzLnRleHR1cmVJbmRleEF0dHJpYnV0ZT1uZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKHRoaXMudGV4dHVyZUluZGV4RGF0YSwxKTt0aGlzLnRleHR1cmVJbmRleEF0dHJpYnV0ZS5zZXREeW5hbWljKCEwKTsKdGhpcy5nZW9tZXRyeS5hZGRBdHRyaWJ1dGUoInRleHR1cmVJbmRleCIsdGhpcy50ZXh0dXJlSW5kZXhBdHRyaWJ1dGUpO3RoaXMuYmFzZVRleHR1cmVJbmRleERhdGE9bmV3IEZsb2F0MzJBcnJheSg0KmEpO3RoaXMuYmFzZVRleHR1cmVJbmRleEF0dHJpYnV0ZT1uZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKHRoaXMuYmFzZVRleHR1cmVJbmRleERhdGEsMSk7dGhpcy5iYXNlVGV4dHVyZUluZGV4QXR0cmlidXRlLnNldER5bmFtaWMoITApO3RoaXMuZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCJiYXNlVGV4dHVyZUluZGV4Iix0aGlzLmJhc2VUZXh0dXJlSW5kZXhBdHRyaWJ1dGUpO3RoaXMudGV4dHVyZVRpbWVzdGFtcERhdGE9bmV3IEZsb2F0MzJBcnJheSg0KmEpO3RoaXMudGV4dHVyZVRpbWVzdGFtcEF0dHJpYnV0ZT1uZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKHRoaXMudGV4dHVyZVRpbWVzdGFtcERhdGEsMSk7dGhpcy50ZXh0dXJlVGltZXN0YW1wQXR0cmlidXRlLnNldER5bmFtaWMoITApOwp0aGlzLmdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgidGV4dHVyZVRpbWVzdGFtcCIsdGhpcy50ZXh0dXJlVGltZXN0YW1wQXR0cmlidXRlKTt0aGlzLmJhc2VUZXh0dXJlVGltZXN0YW1wRGF0YT1uZXcgRmxvYXQzMkFycmF5KDQqYSk7dGhpcy5iYXNlVGV4dHVyZVRpbWVzdGFtcEF0dHJpYnV0ZT1uZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKHRoaXMuYmFzZVRleHR1cmVUaW1lc3RhbXBEYXRhLDEpO3RoaXMuYmFzZVRleHR1cmVUaW1lc3RhbXBBdHRyaWJ1dGUuc2V0RHluYW1pYyghMCk7dGhpcy5nZW9tZXRyeS5hZGRBdHRyaWJ1dGUoImJhc2VUZXh0dXJlVGltZXN0YW1wIix0aGlzLmJhc2VUZXh0dXJlVGltZXN0YW1wQXR0cmlidXRlKTtmPTQqYTt0aGlzLnZlcnRleEluZGV4RGF0YT1uZXcgRmxvYXQzMkFycmF5KGYpO2ZvcihnPTA7ZzxmO2crKyl0aGlzLnZlcnRleEluZGV4RGF0YVtnXT1nO3RoaXMudmVydGV4SW5kZXhBdHRyaWJ1dGU9bmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSh0aGlzLnZlcnRleEluZGV4RGF0YSwKMSk7dGhpcy5nZW9tZXRyeS5hZGRBdHRyaWJ1dGUoInZlcnRleEluZGV4Iix0aGlzLnZlcnRleEluZGV4QXR0cmlidXRlKTt0aGlzLmRlZmF1bHRUZXh0dXJlQ2FudmFzPXRoaXMuY3JlYXRlRGVmYXVsdFRleHR1cmVDYW52YXMoKTt0aGlzLmRlZmF1bHRUZXh0dXJlPW5ldyBUSFJFRS5UZXh0dXJlKHRoaXMuZGVmYXVsdFRleHR1cmVDYW52YXMpO3RoaXMuZGVmYXVsdFRleHR1cmUubWluRmlsdGVyPVRIUkVFLkxpbmVhckZpbHRlcjt0aGlzLmRlZmF1bHRUZXh0dXJlLm1hZ0ZpbHRlcj1USFJFRS5OZWFyZXN0RmlsdGVyO3RoaXMuZGVmYXVsdFRleHR1cmUubmVlZHNVcGRhdGU9ITA7dGhpcy5zcHJpdGVBdGxhcz1uZXcgV3AoYSxjLGQpO3RoaXMubWF0ZXJpYWw9bmV3IFhwKHRoaXMuZGVmYXVsdFRleHR1cmUsdGhpcy5zcHJpdGVBdGxhcyk7dGhpcy5vbkJlZm9yZVJlbmRlcj0oKT0+e3RoaXMubWF0ZXJpYWwudXBkYXRlQXRsYXNVbmlmb3JtcygpfTt0aGlzLnRpbWU9dGhpcy5jb25zdHJ1Y3Rpb25UaW1lc3RhbXA9CkRhdGUubm93KCk7dGhpcy5mcnVzdHVtQ3VsbGVkPSExfWNyZWF0ZVNwcml0ZSgpe3JldHVybiBuZXcgWXAodGhpcyx0aGlzLm5leHRJbmRleCsrKX1nZXQgdGltZSgpe3JldHVybiB0aGlzLm1hdGVyaWFsLnRpbWUrdGhpcy5jb25zdHJ1Y3Rpb25UaW1lc3RhbXB9c2V0IHRpbWUoYSl7dGhpcy5tYXRlcmlhbC50aW1lPWEtdGhpcy5jb25zdHJ1Y3Rpb25UaW1lc3RhbXB9Y3JlYXRlRGVmYXVsdFRleHR1cmVDYW52YXMoKXtjb25zdCBhPXRoaXMuZGVmYXVsdFRleHR1cmVDYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksYz1hLndpZHRoPXRoaXMuaW1hZ2VXaWR0aCxkPWEuaGVpZ2h0PXRoaXMuaW1hZ2VIZWlnaHQsZj1hLmdldENvbnRleHQoIjJkIiksZz1uZXcgSW1hZ2U7Zy5vbmxvYWQ9KCk9PntmLmRyYXdJbWFnZShnLDAsMCxjLGQpO3RoaXMuZGVmYXVsdFRleHR1cmUubmVlZHNVcGRhdGU9ITB9O2cuc3JjPVVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoWydcblx4M2NzdmcgdmVyc2lvblx4M2QiMS4xIlxuICAgICBiYXNlUHJvZmlsZVx4M2QiZnVsbCJcbiAgICAgd2lkdGhceDNkIjEyOCIgaGVpZ2h0XHgzZCIxMjgiXG4gICAgIHhtbG5zXHgzZCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyJcbiAgICAgeG1sbnM6eGxpbmtceDNkImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiXHgzZVxuICBceDNjZGVmc1x4M2VcbiAgICBceDNjbGluZWFyR3JhZGllbnQgaWRceDNkImxpbmVhckdyYWRpZW50Mzc3NCJceDNlXG4gICAgICBceDNjc3RvcFxuICAgICAgICAgc3R5bGVceDNkInN0b3AtY29sb3I6IzgwODA4MDtzdG9wLW9wYWNpdHk6MTsiXG4gICAgICAgICBvZmZzZXRceDNkIjAiIC9ceDNlXG4gICAgICBceDNjc3RvcFxuICAgICAgICAgc3R5bGVceDNkInN0b3AtY29sb3I6IzU1NTU1NTtzdG9wLW9wYWNpdHk6MTsiXG4gICAgICAgICBvZmZzZXRceDNkIjEiIC9ceDNlXG4gICAgXHgzYy9saW5lYXJHcmFkaWVudFx4M2VcbiAgICBceDNjcmFkaWFsR3JhZGllbnRcbiAgICAgICB4bGluazpocmVmXHgzZCIjbGluZWFyR3JhZGllbnQzNzc0IlxuICAgICAgIGlkXHgzZCJyYWRpYWxHcmFkaWVudDM3ODAiXG4gICAgICAgY3hceDNkIjgwIlxuICAgICAgIGN5XHgzZCI0MCJcbiAgICAgICBmeFx4M2QiODAiXG4gICAgICAgZnlceDNkIjQwIlxuICAgICAgIHJceDNkIjgwIlxuICAgICAgIGdyYWRpZW50VW5pdHNceDNkInVzZXJTcGFjZU9uVXNlIlxuICAgICAgIHNwcmVhZE1ldGhvZFx4M2QicGFkIiAvXHgzZVxuICBceDNjL2RlZnNceDNlXG4gIFx4M2NjaXJjbGUgY3hceDNkIjUwJSIgY3lceDNkIjUwJSIgclx4M2QiNTAlIiBmaWxsXHgzZCJ1cmwoI3JhZGlhbEdyYWRpZW50Mzc4MCkiIC9ceDNlXG5ceDNjL3N2Z1x4M2VcbiddLAp7dHlwZToiaW1hZ2Uvc3ZnK3htbDtjaGFyc2V0XHgzZHV0Zi04In0pKTtyZXR1cm4gYX1nZXRYKGEpe3JldHVybiB0aGlzLnBvc2l0aW9uRGF0YVsxMiphXX1zZXRYKGEsYyl7YSo9MTI7dGhpcy5wb3NpdGlvbkRhdGFbYSswXT1jO3RoaXMucG9zaXRpb25EYXRhW2ErM109Yyt0aGlzLnNwcml0ZVdpZHRoO3RoaXMucG9zaXRpb25EYXRhW2ErNl09Yyt0aGlzLnNwcml0ZVdpZHRoO3RoaXMucG9zaXRpb25EYXRhW2ErOV09Yzt0aGlzLnBvc2l0aW9uQXR0cmlidXRlLm5lZWRzVXBkYXRlPSEwfWdldFkoYSl7cmV0dXJuIHRoaXMucG9zaXRpb25EYXRhWzEyKmErMV19c2V0WShhLGMpe2EqPTEyO3RoaXMucG9zaXRpb25EYXRhW2ErMV09Yzt0aGlzLnBvc2l0aW9uRGF0YVthKzRdPWM7dGhpcy5wb3NpdGlvbkRhdGFbYSs3XT1jK3RoaXMuc3ByaXRlSGVpZ2h0O3RoaXMucG9zaXRpb25EYXRhW2ErMTBdPWMrdGhpcy5zcHJpdGVIZWlnaHQ7dGhpcy5wb3NpdGlvbkF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0KITB9Z2V0WihhKXtyZXR1cm4gdGhpcy5wb3NpdGlvbkRhdGFbMTIqYSsyXX1zZXRaKGEsYyl7YSo9MTI7dGhpcy5wb3NpdGlvbkRhdGFbYSsyXT1jO3RoaXMucG9zaXRpb25EYXRhW2ErNV09Yzt0aGlzLnBvc2l0aW9uRGF0YVthKzhdPWM7dGhpcy5wb3NpdGlvbkRhdGFbYSsxMV09Yzt0aGlzLnBvc2l0aW9uQXR0cmlidXRlLm5lZWRzVXBkYXRlPSEwfWdldFIoYSl7cmV0dXJuIHRoaXMuY29sb3JEYXRhWzE2KmFdfXNldFIoYSxjKXthKj0xNjt0aGlzLmNvbG9yRGF0YVthKzBdPWM7dGhpcy5jb2xvckRhdGFbYSs0XT1jO3RoaXMuY29sb3JEYXRhW2ErOF09Yzt0aGlzLmNvbG9yRGF0YVthKzEyXT1jO3RoaXMuY29sb3JBdHRyaWJ1dGUubmVlZHNVcGRhdGU9ITB9Z2V0RyhhKXtyZXR1cm4gdGhpcy5jb2xvckRhdGFbMTYqYSsxXX1zZXRHKGEsYyl7YSo9MTY7dGhpcy5jb2xvckRhdGFbYSsxXT1jO3RoaXMuY29sb3JEYXRhW2ErNV09Yzt0aGlzLmNvbG9yRGF0YVthKzldPWM7dGhpcy5jb2xvckRhdGFbYSsKMTNdPWM7dGhpcy5jb2xvckF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0hMH1nZXRCKGEpe3JldHVybiB0aGlzLmNvbG9yRGF0YVsxNiphKzJdfXNldEIoYSxjKXthKj0xNjt0aGlzLmNvbG9yRGF0YVthKzJdPWM7dGhpcy5jb2xvckRhdGFbYSs2XT1jO3RoaXMuY29sb3JEYXRhW2ErMTBdPWM7dGhpcy5jb2xvckRhdGFbYSsxNF09Yzt0aGlzLmNvbG9yQXR0cmlidXRlLm5lZWRzVXBkYXRlPSEwfWdldEEoYSl7cmV0dXJuIHRoaXMuY29sb3JEYXRhWzE2KmErM119c2V0QShhLGMpe2EqPTE2O3RoaXMuY29sb3JEYXRhW2ErM109Yzt0aGlzLmNvbG9yRGF0YVthKzddPWM7dGhpcy5jb2xvckRhdGFbYSsxMV09Yzt0aGlzLmNvbG9yRGF0YVthKzE1XT1jO3RoaXMuY29sb3JBdHRyaWJ1dGUubmVlZHNVcGRhdGU9ITB9Z2V0QmFzZVgoYSl7cmV0dXJuIHRoaXMuYmFzZVBvc2l0aW9uRGF0YVsxMiphXX1zZXRCYXNlWChhLGMpe2EqPTEyO3RoaXMuYmFzZVBvc2l0aW9uRGF0YVthKzBdPWM7dGhpcy5iYXNlUG9zaXRpb25EYXRhW2ErCjNdPWMrdGhpcy5zcHJpdGVXaWR0aDt0aGlzLmJhc2VQb3NpdGlvbkRhdGFbYSs2XT1jK3RoaXMuc3ByaXRlV2lkdGg7dGhpcy5iYXNlUG9zaXRpb25EYXRhW2ErOV09Yzt0aGlzLmJhc2VQb3NpdGlvbkF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0hMH1nZXRCYXNlWShhKXtyZXR1cm4gdGhpcy5iYXNlUG9zaXRpb25EYXRhWzEyKmErMV19c2V0QmFzZVkoYSxjKXthKj0xMjt0aGlzLmJhc2VQb3NpdGlvbkRhdGFbYSsxXT1jO3RoaXMuYmFzZVBvc2l0aW9uRGF0YVthKzRdPWM7dGhpcy5iYXNlUG9zaXRpb25EYXRhW2ErN109Yyt0aGlzLnNwcml0ZUhlaWdodDt0aGlzLmJhc2VQb3NpdGlvbkRhdGFbYSsxMF09Yyt0aGlzLnNwcml0ZUhlaWdodDt0aGlzLmJhc2VQb3NpdGlvbkF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0hMH1nZXRCYXNlWihhKXtyZXR1cm4gdGhpcy5iYXNlUG9zaXRpb25EYXRhWzEyKmErMl19c2V0QmFzZVooYSxjKXthKj0xMjt0aGlzLmJhc2VQb3NpdGlvbkRhdGFbYSsyXT1jOwp0aGlzLmJhc2VQb3NpdGlvbkRhdGFbYSs1XT1jO3RoaXMuYmFzZVBvc2l0aW9uRGF0YVthKzhdPWM7dGhpcy5iYXNlUG9zaXRpb25EYXRhW2ErMTFdPWM7dGhpcy5iYXNlUG9zaXRpb25BdHRyaWJ1dGUubmVlZHNVcGRhdGU9ITB9Z2V0QmFzZVIoYSl7cmV0dXJuIHRoaXMuYmFzZUNvbG9yRGF0YVsxNiphXX1zZXRCYXNlUihhLGMpe2EqPTE2O3RoaXMuYmFzZUNvbG9yRGF0YVthKzBdPWM7dGhpcy5iYXNlQ29sb3JEYXRhW2ErNF09Yzt0aGlzLmJhc2VDb2xvckRhdGFbYSs4XT1jO3RoaXMuYmFzZUNvbG9yRGF0YVthKzEyXT1jO3RoaXMuYmFzZUNvbG9yQXR0cmlidXRlLm5lZWRzVXBkYXRlPSEwfWdldEJhc2VHKGEpe3JldHVybiB0aGlzLmJhc2VDb2xvckRhdGFbMTYqYSsxXX1zZXRCYXNlRyhhLGMpe2EqPTE2O3RoaXMuYmFzZUNvbG9yRGF0YVthKzFdPWM7dGhpcy5iYXNlQ29sb3JEYXRhW2ErNV09Yzt0aGlzLmJhc2VDb2xvckRhdGFbYSs5XT1jO3RoaXMuYmFzZUNvbG9yRGF0YVthKwoxM109Yzt0aGlzLmJhc2VDb2xvckF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0hMH1nZXRCYXNlQihhKXtyZXR1cm4gdGhpcy5iYXNlQ29sb3JEYXRhWzE2KmErMl19c2V0QmFzZUIoYSxjKXthKj0xNjt0aGlzLmJhc2VDb2xvckRhdGFbYSsyXT1jO3RoaXMuYmFzZUNvbG9yRGF0YVthKzZdPWM7dGhpcy5iYXNlQ29sb3JEYXRhW2ErMTBdPWM7dGhpcy5iYXNlQ29sb3JEYXRhW2ErMTRdPWM7dGhpcy5iYXNlQ29sb3JBdHRyaWJ1dGUubmVlZHNVcGRhdGU9ITB9Z2V0QmFzZUEoYSl7cmV0dXJuIHRoaXMuYmFzZUNvbG9yRGF0YVsxNiphKzNdfXNldEJhc2VBKGEsYyl7YSo9MTY7dGhpcy5iYXNlQ29sb3JEYXRhW2ErM109Yzt0aGlzLmJhc2VDb2xvckRhdGFbYSs3XT1jO3RoaXMuYmFzZUNvbG9yRGF0YVthKzExXT1jO3RoaXMuYmFzZUNvbG9yRGF0YVthKzE1XT1jO3RoaXMuYmFzZUNvbG9yQXR0cmlidXRlLm5lZWRzVXBkYXRlPSEwfWdldE9wYWNpdHkoYSl7cmV0dXJuIHRoaXMub3BhY2l0eURhdGFbNCoKYV19c2V0T3BhY2l0eShhLGMpe2EqPTQ7dGhpcy5vcGFjaXR5RGF0YVthKzBdPWM7dGhpcy5vcGFjaXR5RGF0YVthKzFdPWM7dGhpcy5vcGFjaXR5RGF0YVthKzJdPWM7dGhpcy5vcGFjaXR5RGF0YVthKzNdPWM7dGhpcy5vcGFjaXR5QXR0cmlidXRlLm5lZWRzVXBkYXRlPSEwfWdldEJhc2VPcGFjaXR5KGEpe3JldHVybiB0aGlzLmJhc2VPcGFjaXR5RGF0YVs0KmFdfXNldEJhc2VPcGFjaXR5KGEsYyl7YSo9NDt0aGlzLmJhc2VPcGFjaXR5RGF0YVthKzBdPWM7dGhpcy5iYXNlT3BhY2l0eURhdGFbYSsxXT1jO3RoaXMuYmFzZU9wYWNpdHlEYXRhW2ErMl09Yzt0aGlzLmJhc2VPcGFjaXR5RGF0YVthKzNdPWM7dGhpcy5iYXNlT3BhY2l0eUF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0hMH1nZXRUaW1lc3RhbXAoYSl7cmV0dXJuIHRoaXMudGltZXN0YW1wRGF0YVs0KmFdK3RoaXMuY29uc3RydWN0aW9uVGltZXN0YW1wfXNldFRpbWVzdGFtcChhLGMpe2EqPTQ7Yy09dGhpcy5jb25zdHJ1Y3Rpb25UaW1lc3RhbXA7CnRoaXMudGltZXN0YW1wRGF0YVthKzBdPWM7dGhpcy50aW1lc3RhbXBEYXRhW2ErMV09Yzt0aGlzLnRpbWVzdGFtcERhdGFbYSsyXT1jO3RoaXMudGltZXN0YW1wRGF0YVthKzNdPWM7dGhpcy50aW1lc3RhbXBBdHRyaWJ1dGUubmVlZHNVcGRhdGU9ITB9Z2V0QmFzZVRpbWVzdGFtcChhKXtyZXR1cm4gdGhpcy5iYXNlVGltZXN0YW1wRGF0YVs0KmFdK3RoaXMuY29uc3RydWN0aW9uVGltZXN0YW1wfXNldEJhc2VUaW1lc3RhbXAoYSxjKXthKj00O2MtPXRoaXMuY29uc3RydWN0aW9uVGltZXN0YW1wO3RoaXMuYmFzZVRpbWVzdGFtcERhdGFbYSswXT1jO3RoaXMuYmFzZVRpbWVzdGFtcERhdGFbYSsxXT1jO3RoaXMuYmFzZVRpbWVzdGFtcERhdGFbYSsyXT1jO3RoaXMuYmFzZVRpbWVzdGFtcERhdGFbYSszXT1jO3RoaXMuYmFzZVRpbWVzdGFtcEF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0hMH1nZXRUZXh0dXJlSW5kZXgoYSl7cmV0dXJuIHRoaXMudGV4dHVyZUluZGV4RGF0YVs0KmFdfXNldFRleHR1cmVJbmRleChhLApjKXthKj00O3RoaXMudGV4dHVyZUluZGV4RGF0YVthKzBdPWM7dGhpcy50ZXh0dXJlSW5kZXhEYXRhW2ErMV09Yzt0aGlzLnRleHR1cmVJbmRleERhdGFbYSsyXT1jO3RoaXMudGV4dHVyZUluZGV4RGF0YVthKzNdPWM7dGhpcy50ZXh0dXJlSW5kZXhBdHRyaWJ1dGUubmVlZHNVcGRhdGU9ITB9Z2V0QmFzZVRleHR1cmVJbmRleChhKXtyZXR1cm4gdGhpcy5iYXNlVGV4dHVyZUluZGV4RGF0YVs0KmFdfXNldEJhc2VUZXh0dXJlSW5kZXgoYSxjKXthKj00O3RoaXMuYmFzZVRleHR1cmVJbmRleERhdGFbYSswXT1jO3RoaXMuYmFzZVRleHR1cmVJbmRleERhdGFbYSsxXT1jO3RoaXMuYmFzZVRleHR1cmVJbmRleERhdGFbYSsyXT1jO3RoaXMuYmFzZVRleHR1cmVJbmRleERhdGFbYSszXT1jO3RoaXMuYmFzZVRleHR1cmVJbmRleEF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0hMH1nZXRUZXh0dXJlVGltZXN0YW1wKGEpe3JldHVybiB0aGlzLnRleHR1cmVUaW1lc3RhbXBEYXRhWzQqYV0rdGhpcy5jb25zdHJ1Y3Rpb25UaW1lc3RhbXB9c2V0VGV4dHVyZVRpbWVzdGFtcChhLApjKXthKj00O2MtPXRoaXMuY29uc3RydWN0aW9uVGltZXN0YW1wO3RoaXMudGV4dHVyZVRpbWVzdGFtcERhdGFbYSswXT1jO3RoaXMudGV4dHVyZVRpbWVzdGFtcERhdGFbYSsxXT1jO3RoaXMudGV4dHVyZVRpbWVzdGFtcERhdGFbYSsyXT1jO3RoaXMudGV4dHVyZVRpbWVzdGFtcERhdGFbYSszXT1jO3RoaXMudGV4dHVyZVRpbWVzdGFtcEF0dHJpYnV0ZS5uZWVkc1VwZGF0ZT0hMH1nZXRCYXNlVGV4dHVyZVRpbWVzdGFtcChhKXtyZXR1cm4gdGhpcy5iYXNlVGV4dHVyZVRpbWVzdGFtcERhdGFbNCphXSt0aGlzLmNvbnN0cnVjdGlvblRpbWVzdGFtcH1zZXRCYXNlVGV4dHVyZVRpbWVzdGFtcChhLGMpe2EqPTQ7Yy09dGhpcy5jb25zdHJ1Y3Rpb25UaW1lc3RhbXA7dGhpcy5iYXNlVGV4dHVyZVRpbWVzdGFtcERhdGFbYSswXT1jO3RoaXMuYmFzZVRleHR1cmVUaW1lc3RhbXBEYXRhW2ErMV09Yzt0aGlzLmJhc2VUZXh0dXJlVGltZXN0YW1wRGF0YVthKzJdPWM7dGhpcy5iYXNlVGV4dHVyZVRpbWVzdGFtcERhdGFbYSsKM109Yzt0aGlzLmJhc2VUZXh0dXJlVGltZXN0YW1wQXR0cmlidXRlLm5lZWRzVXBkYXRlPSEwfXJlYmFzZShhLGMpe2M9dm9pZCAwPT09Yz90aGlzLnRpbWU6Yztjb25zdCBkPXRoaXMuZ2V0QmFzZVRpbWVzdGFtcChhKSxmPXRoaXMuZ2V0VGltZXN0YW1wKGEpLGc9Yz49Zj8xOmM8PWQ/MDp0aGlzLm1hdGVyaWFsLmFwcGx5RWFzaW5nKChjLWQpLyhmLWQpKSxsPShrLG4pPT5rKmcrbiooMS1nKTt0aGlzLnNldEJhc2VYKGEsbCh0aGlzLmdldFgoYSksdGhpcy5nZXRCYXNlWChhKSkpO3RoaXMuc2V0QmFzZVkoYSxsKHRoaXMuZ2V0WShhKSx0aGlzLmdldEJhc2VZKGEpKSk7dGhpcy5zZXRCYXNlWihhLGwodGhpcy5nZXRaKGEpLHRoaXMuZ2V0QmFzZVooYSkpKTt0aGlzLnNldEJhc2VSKGEsbCh0aGlzLmdldFIoYSksdGhpcy5nZXRCYXNlUihhKSkpO3RoaXMuc2V0QmFzZUcoYSxsKHRoaXMuZ2V0RyhhKSx0aGlzLmdldEJhc2VHKGEpKSk7dGhpcy5zZXRCYXNlQihhLGwodGhpcy5nZXRCKGEpLAp0aGlzLmdldEJhc2VCKGEpKSk7dGhpcy5zZXRCYXNlQShhLGwodGhpcy5nZXRBKGEpLHRoaXMuZ2V0QmFzZUEoYSkpKTt0aGlzLnNldEJhc2VPcGFjaXR5KGEsbCh0aGlzLmdldE9wYWNpdHkoYSksdGhpcy5nZXRCYXNlT3BhY2l0eShhKSkpO2M9Yz49Zj9jOmwoZixkKTt0aGlzLnNldEJhc2VUaW1lc3RhbXAoYSxjKX1zZXRTcHJpdGVJbWFnZURhdGEoYSxjLGQpe3RoaXMuc3ByaXRlQXRsYXMuc2V0U3ByaXRlSW1hZ2VEYXRhKGEsYyxkKX1zd2l0Y2hUZXh0dXJlcyhhLGMsZCl7Y29uc3QgZj10aGlzLmdldFRleHR1cmVJbmRleChhKTt0aGlzLnNldEJhc2VUZXh0dXJlSW5kZXgoYSxmKTt0aGlzLnNldFRleHR1cmVJbmRleChhLDA9PT1mPzE6MCk7dGhpcy5zZXRCYXNlVGV4dHVyZVRpbWVzdGFtcChhLGMpO3RoaXMuc2V0VGV4dHVyZVRpbWVzdGFtcChhLGQpfWZpbmRTcHJpdGVzKGEsYyl7Y29uc3QgZD1bXTtmb3IobGV0IGY9MDtmPHRoaXMuY2FwYWNpdHk7ZisrKXtjb25zdCBnPTEyKgpmO2E+PXRoaXMucG9zaXRpb25EYXRhW2crMF0mJmE8PXRoaXMucG9zaXRpb25EYXRhW2crNl0mJmM+PXRoaXMucG9zaXRpb25EYXRhW2crMV0mJmM8PXRoaXMucG9zaXRpb25EYXRhW2crN10mJmQucHVzaChmKX1yZXR1cm4gZH19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2ZhY2V0cy1kaXZlL2xpYi93b3JkdHJlZS5qcwpjb25zdCAkcD0vXGJbLSdcd10rXGIvZztmdW5jdGlvbiBhcShhKXtyZXR1cm5gJHt0eXBlb2YgYX1cdTAwMUYke2F9YH1mdW5jdGlvbiBicShhKXtyZXR1cm4gYS50b0xvd2VyQ2FzZSgpLm1hdGNoKCRwKXx8W119CmZ1bmN0aW9uIGNxKGEpe2lmKDI+YS52YWx1ZUNvdW50KXJldHVybiBudWxsO2Zvcih2YXIgYz0oZyxsKT0+e2ZvcihsZXQgaz0wO2s8Zy5sZW5ndGg7aysrKWxbZ1trXV09ITB9LGQ9e30sZj1hO2Y7KWMoZi5jb21tb25Xb3JkcyxkKSxmPWYucGFyZW50O2ZvcihmPTA7ZjxhLmNoaWxkcmVuLmxlbmd0aDtmKyspYyhhLmNoaWxkcmVuW2ZdLmNvbW1vbldvcmRzLGQpO2M9e307Zm9yKGNvbnN0IGcgaW4gYS52YWx1ZUhhc2gpe2NvbnN0IHtjb3VudDpsLHdvcmRzOmt9PWEudmFsdWVIYXNoW2ddO2Zvcihjb25zdCBuIGluIGspbiBpbiBkfHwoY1tuXT0oY1tuXXx8MCkrbCxjW25dPT09YS50b3RhbENvdW50JiYoYS5jb21tb25Xb3Jkcy5wdXNoKG4pLGRbbl09ITAsZGVsZXRlIGNbbl0pKX1hPW51bGw7ZD0wO2Zvcihjb25zdCBnIGluIGMpY1tnXT5kJiYoYT1nLGQ9Y1tnXSk7cmV0dXJuIGF9CmZ1bmN0aW9uIGRxKGEpe3ZhciBjPXtwYXJlbnQ6bnVsbCxjb21tb25Xb3JkczpbXSxsZXZlbDoxLG9yZGVyOjAsdG90YWxDb3VudDowLHZhbHVlSGFzaDp7fSx2YWx1ZUNvdW50OjAsbm9uVmFsdWVDb3VudDowLGNoaWxkcmVuOltdfTtjb25zdCBkPXtyb290OmMsbm9kZUhhc2g6e30saGlnaGVzdExldmVsOjEsbGV2ZWxIYXNoOnsxOmN9fTtmb3IodmFyIGYgaW4gYSl7aWYoIWEuaGFzT3duUHJvcGVydHkoZikpY29udGludWU7Y29uc3Qge3ZhbHVlOnEsY291bnQ6cix3b3Jkczp0fT1hW2ZdOyJzdHJpbmciPT09dHlwZW9mIHE/KGMudmFsdWVIYXNoW2ZdPXt2YWx1ZTpxLGNvdW50OnIsd29yZHM6dH0sYy52YWx1ZUNvdW50Kz1yKTpjLm5vblZhbHVlQ291bnQrPXI7Yy50b3RhbENvdW50Kz1yO2Qubm9kZUhhc2hbZl09Y31hPWMubGV2ZWw7aWYoYy5ub25WYWx1ZUNvdW50KXthKys7Zj17cGFyZW50OmMsY29tbW9uV29yZHM6W10sbGV2ZWw6YSxvcmRlcjowLHRvdGFsQ291bnQ6Yy5ub25WYWx1ZUNvdW50LAp2YWx1ZUhhc2g6e30sdmFsdWVDb3VudDowLG5vblZhbHVlQ291bnQ6Yy5ub25WYWx1ZUNvdW50LGNoaWxkcmVuOltdfTtjLm5vblZhbHVlQ291bnQ9MDtjLmNoaWxkcmVuLnB1c2goZik7ZC5oaWdoZXN0TGV2ZWw9YTtkLmxldmVsSGFzaFthXT1mO2Zvcih2YXIgZyBpbiBkLm5vZGVIYXNoKWcgaW4gYy52YWx1ZUhhc2h8fChkLm5vZGVIYXNoW2ddPWYpfWM9W2NdO2ZvcihnPXE9PnEudmFsdWVDb3VudCtxLm5vblZhbHVlQ291bnQ7MTAwPmEmJmMubGVuZ3RoOyl7Zj0wO3ZhciBsPWcoY1tmXSk7Zm9yKHZhciBrPTE7azxjLmxlbmd0aDtrKyspe2NvbnN0IHE9ZyhjW2tdKTtxPmwmJihmPWssbD1xKX1sPWNbZl07aWYoaz1jcShsKSl7YSsrO2Y9e3BhcmVudDpsLGNvbW1vbldvcmRzOltrXSxsZXZlbDphLG9yZGVyOjAsdG90YWxDb3VudDowLHZhbHVlSGFzaDp7fSx2YWx1ZUNvdW50OjAsbm9uVmFsdWVDb3VudDowLGNoaWxkcmVuOltdfTtsLmNoaWxkcmVuLnB1c2goZik7Yy5wdXNoKGYpOwpmb3IoY29uc3QgcSBpbiBsLnZhbHVlSGFzaCl7aWYoIWwudmFsdWVIYXNoLmhhc093blByb3BlcnR5KHEpKWNvbnRpbnVlO2NvbnN0IHt2YWx1ZTpyLGNvdW50OnQsd29yZHM6dn09bC52YWx1ZUhhc2hbcV07diYmayBpbiB2JiYoZi52YWx1ZUhhc2hbcV09e3ZhbHVlOnIsY291bnQ6dCx3b3Jkczp2fSxmLnZhbHVlQ291bnQrPXQsZi50b3RhbENvdW50Kz10LGRlbGV0ZSBsLnZhbHVlSGFzaFtxXSxsLnZhbHVlQ291bnQtPXQsZC5ub2RlSGFzaFtxXT1mLGQuaGlnaGVzdExldmVsPWEsZC5sZXZlbEhhc2hbYV09Zil9fWVsc2UgYy5zcGxpY2UoZiwxKX1sZXQgbj0wO2NvbnN0IHA9cT0+e3Eub3JkZXI9KytuO2ZvcihsZXQgcj0wO3I8cS5jaGlsZHJlbi5sZW5ndGg7cisrKXAocS5jaGlsZHJlbltyXSl9O3AoZC5yb290KTtyZXR1cm4gZH07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLWRpdmUvbGliL3N0YXRzLmpzCmZ1bmN0aW9uIGVxKGEpe2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuW107Y29uc3QgYz17fTtmb3IobGV0IGQ9MDtkPGEubGVuZ3RoO2QrKylpZihhW2RdKXtjb25zdCBmPU9iamVjdC5rZXlzKGFbZF0pO2ZvcihsZXQgZz0wO2c8Zi5sZW5ndGg7ZysrKWNbZltnXV09ITB9cmV0dXJuIE9iamVjdC5rZXlzKGMpfWNvbnN0IGZxPWE9PiJudW1iZXIiPT09dHlwZW9mIGEmJmE+PjA9PT1hOwpjbGFzcyBncXtjb25zdHJ1Y3Rvcigpe3RoaXMudW5pcXVlQ291bnQ9dGhpcy50b3RhbENvdW50PTA7dGhpcy52YWx1ZUhhc2g9e307dGhpcy5vdGhlckNvdW50PXRoaXMuc3RyaW5nQ291bnQ9dGhpcy5pbnRlZ2VyQ291bnQ9dGhpcy5udW1iZXJDb3VudD0wO3RoaXMuc3RyaW5nTGVuZ3Roc0NvdW50PXRoaXMuc3RyaW5nTWVhbkxlbmd0aD10aGlzLnN0cmluZ01heExlbmd0aD10aGlzLnN0cmluZ01pbkxlbmd0aD10aGlzLm51bWJlck1heD10aGlzLm51bWJlck1pbj1udWxsO3RoaXMuc3RyaW5nTGVuZ3Roc0hhc2g9e307dGhpcy50b3RhbFdvcmRDb3VudD10aGlzLm11bHRpd29yZENvdW50PTA7dGhpcy53b3JkQ291bnRzPXt9O3RoaXMudW5pcXVlV29yZENvdW50PTA7dGhpcy53b3JkVHJlZT1udWxsfWlzTnVtZXJpYygpe3JldHVybiAwPHRoaXMubnVtYmVyQ291bnQmJm51bGwhPT10aGlzLm51bWJlck1pbiYmbnVsbCE9PXRoaXMubnVtYmVyTWF4JiZ0aGlzLm51bWJlck1heD50aGlzLm51bWJlck1pbn1pc0ludGVnZXIoKXtyZXR1cm4gMDwKdGhpcy5udW1iZXJDb3VudCYmdGhpcy5pbnRlZ2VyQ291bnQ9PT10aGlzLm51bWJlckNvdW50fWFkZFZhbHVlKGEpe3RoaXMudG90YWxDb3VudCsrO2NvbnN0IGM9YXEoYSk7YyBpbiB0aGlzLnZhbHVlSGFzaHx8KHRoaXMudmFsdWVIYXNoW2NdPXt2YWx1ZTphLGNvdW50OjB9LHRoaXMudW5pcXVlQ291bnQrKyk7dGhpcy52YWx1ZUhhc2hbY10uY291bnQrKztzd2l0Y2godHlwZW9mIGEpe2Nhc2UgIm51bWJlciI6dGhpcy5pbmNvcnBvcmF0ZU51bWJlclZhbHVlKGEpO2JyZWFrO2Nhc2UgInN0cmluZyI6dGhpcy5pbmNvcnBvcmF0ZVN0cmluZ1ZhbHVlKGMsYSk7YnJlYWs7ZGVmYXVsdDp0aGlzLm90aGVyQ291bnQrK319aW5jb3Jwb3JhdGVOdW1iZXJWYWx1ZShhKXt0aGlzLm51bWJlckNvdW50Kys7ZnEoYSkmJnRoaXMuaW50ZWdlckNvdW50Kys7aXNOYU4oYSl8fCh0aGlzLm51bWJlck1pbj1udWxsPT09dGhpcy5udW1iZXJNaW4/YTpNYXRoLm1pbih0aGlzLm51bWJlck1pbixhKSx0aGlzLm51bWJlck1heD0KbnVsbD09PXRoaXMubnVtYmVyTWF4P2E6TWF0aC5tYXgodGhpcy5udW1iZXJNYXgsYSkpfWluY29ycG9yYXRlU3RyaW5nVmFsdWUoYSxjKXt0aGlzLnN0cmluZ0NvdW50Kys7dmFyIGQ9Yy5sZW5ndGg7ZCBpbiB0aGlzLnN0cmluZ0xlbmd0aHNIYXNofHwodGhpcy5zdHJpbmdMZW5ndGhzQ291bnQ9KHRoaXMuc3RyaW5nTGVuZ3Roc0NvdW50fHwwKSsxKTt0aGlzLnN0cmluZ0xlbmd0aHNIYXNoW2RdPSh0aGlzLnN0cmluZ0xlbmd0aHNIYXNoW2RdfHwwKSsxO3RoaXMuc3RyaW5nTWluTGVuZ3RoPW51bGw9PT10aGlzLnN0cmluZ01pbkxlbmd0aD9kOk1hdGgubWluKHRoaXMuc3RyaW5nTWluTGVuZ3RoLGQpO3RoaXMuc3RyaW5nTWF4TGVuZ3RoPW51bGw9PT10aGlzLnN0cmluZ01heExlbmd0aD9kOk1hdGgubWF4KHRoaXMuc3RyaW5nTWF4TGVuZ3RoLGQpO3RoaXMuc3RyaW5nTWVhbkxlbmd0aD0odGhpcy5zdHJpbmdNZWFuTGVuZ3RofHwwKSoodGhpcy5zdHJpbmdDb3VudC0xKS90aGlzLnN0cmluZ0NvdW50KwpkL3RoaXMuc3RyaW5nQ291bnQ7aWYoIXRoaXMudmFsdWVIYXNoW2FdLndvcmRzKXtjPWJxKGMudG9Mb3dlckNhc2UoKSk7MTxjLmxlbmd0aCYmKHRoaXMubXVsdGl3b3JkQ291bnQrKyx0aGlzLnRvdGFsV29yZENvdW50Kz1jLmxlbmd0aCk7ZD10aGlzLnZhbHVlSGFzaFthXS53b3Jkcz17fTtmb3IobGV0IGY9MDtmPGMubGVuZ3RoO2YrKyl7Y29uc3QgZz1jW2ZdO2RbZ109KGRbZ118fDApKzE7ZyBpbiB0aGlzLndvcmRDb3VudHN8fCh0aGlzLndvcmRDb3VudHNbZ109MCx0aGlzLnVuaXF1ZVdvcmRDb3VudCsrKX19YT10aGlzLnZhbHVlSGFzaFthXS53b3Jkcztmb3IoY29uc3QgZiBpbiBhKXRoaXMud29yZENvdW50c1tmXT0odGhpcy53b3JkQ291bnRzW2ZdfHwwKSsxfX0KZnVuY3Rpb24gaHEoYSl7aWYoIWF8fCFhLmxlbmd0aClyZXR1cm57fTtjb25zdCBjPXt9O2ZvcihsZXQgZD0wO2Q8YS5sZW5ndGg7ZCsrKXtjb25zdCBmPWFbZF07aWYobnVsbD09Ziljb250aW51ZTtjb25zdCBnPU9iamVjdC5rZXlzKGYpO2ZvcihsZXQgbD0wO2w8Zy5sZW5ndGg7bCsrKXtjb25zdCBrPWdbbF0sbj1mW2tdO2sgaW4gY3x8KGNba109bmV3IGdxKTtjW2tdLmFkZFZhbHVlKG4pfX1mb3IoY29uc3QgZCBpbiBjKWE9Y1tkXSxhLm11bHRpd29yZENvdW50JiYoYS53b3JkVHJlZT1kcShhLnZhbHVlSGFzaCkpO3JldHVybiBjfTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9mYWNldHMtZGl2ZS9saWIvc3RyaW5nLWZvcm1hdC5qcwpmdW5jdGlvbiBpcShhKXtyZXR1cm4gYS5yZXBsYWNlKC8oW1xXX10pL2csIiQxXHUyMDBiIil9ZnVuY3Rpb24ganEoYSl7cmV0dXJuIDY1PmEubGVuZ3RoP2E6YS5zdWJzdHIoMCwzMCkrIi4uLiIrYS5zdWJzdHIoLTMwKX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLWRpdmUvY29tcG9uZW50cy9mYWNldHMtZGl2ZS12aXMvZmFjZXRzLWRpdmUtdmlzLmpzCi8qCgogQ29weXJpZ2h0IDIwMTggR29vZ2xlIEluYy4KCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KY29uc3Qga3E9e2JvdHRvbTo2LGxlZnQ6NixyaWdodDo2LHRvcDo2fSxscT17Ilx1ZmZmY09USEVSXHVmZmZjIjoib3RoZXIiLCJcdWZmZmNOT19XT1JEU1x1ZmZmYyI6Im5vbi13b3JkcyIsIlx1ZmZmY0FMTF9XT1JEU1x1ZmZmYyI6Im90aGVyIn0sbXE9YT0+bnVsbCE9PWEmJmEgaW4gbHE/e2xhYmVsOmxxW2FdLHNwZWNpYWw6ITB9OiJudW1iZXIiIT09dHlwZW9mIGEmJiJzdHJpbmciIT09dHlwZW9mIGE/e2xhYmVsOiIiK2Esc3BlY2lhbDohMH06e2xhYmVsOmpxKCIiK2EpLHNwZWNpYWw6ITF9LG5xPSIjNDI4NUY0ICNEQjQ0MzcgI0Y0QjQwMCAjMEY5RDU4ICNBQjQ3QkMgIzAwQUNDMSAjRkY3MDQzICM5RTlEMjQgIzVDNkJDMCAjRjA2MjkyICMwMDc5NkIgI0MyMTg1QiIuc3BsaXQoIiAiKSxvcT0iIzQyODVGNCAjMEY5RDU4ICMwMEFDQzEgIzlFOUQyNCAjNUM2QkMwICMwMDc5NkIgIzYwN0Q4QiIuc3BsaXQoIiAiKSxwcT0iI0RCNDQzNyAjRjRCNDAwICNBQjQ3QkMgI0YwNjI5MiAjQUI0N0JDICM3OTU1NDggI0ZGNzA0MyAjQzIxODVCIi5zcGxpdCgiICIpLApxcT0iIzQyODVGNCAjQzUzOTI5ICNGN0NCNEQgIzBCODA0MyAjNUUzNUIxICM4MERFRUEgI0ZGNzA0MyAjQzBDQTMzIi5zcGxpdCgiICIpLHJxPXsiYWxpZ25tZW50LWJhc2VsaW5lIjoibWlkZGxlIixmaWxsOiIjNDQ0NDQ0IiwiZm9udC1zaXplIjoxOCwiZm9udC1zdHlsZSI6Im5vcm1hbCIsInRleHQtYW5jaG9yIjoibWlkZGxlIix4OjAseTowfTtjbGFzcyBzcSBleHRlbmRzIEdwe30KY2xhc3MgdHF7Y29uc3RydWN0b3IoYSl7dGhpcy5lbGVtPWE7dGhpcy5lbmRUaW1lc3RhbXA9MDt0aGlzLnJlbmRlclF1ZXVlZD0hMTt0aGlzLmxhYmVscz1bXTt0aGlzLmF1dG9Db2xvckJ5PSExO3RoaXMuaG9yaXpvbnRhbEZhY2V0SW5mbz10aGlzLnZlcnRpY2FsRmFjZXRJbmZvPW51bGx9cmVhZHkoKXt0aGlzLmxheW91dD1uZXcgUnA7dGhpcy5ob2xkZXI9dGhpcy5lbGVtLiQuaG9sZGVyO3RoaXMuZWxlbS5zY29wZVN1YnRyZWUodGhpcy5ob2xkZXIsITApO3RoaXMuY2VsbEJhY2tncm91bmRTVkc9ZDMuc2VsZWN0KHRoaXMuaG9sZGVyKS5hcHBlbmQoInN2ZyIpLnN0eWxlKCJsZWZ0IiwwKS5zdHlsZSgicG9zaXRpb24iLCJhYnNvbHV0ZSIpLnN0eWxlKCJ0b3AiLDApO3RoaXMuY2VsbEJhY2tncm91bmRTVkdSb290PXRoaXMuY2VsbEJhY2tncm91bmRTVkcuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJyb290Iik7dGhpcy5jZWxsQmFja2dyb3VuZExheWVyPXRoaXMuY2VsbEJhY2tncm91bmRTVkdSb290LmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwKImxhYmVscyIpO3RoaXMuc2NlbmU9bmV3IFRIUkVFLlNjZW5lO3RoaXMuY2FtZXJhPW5ldyBUSFJFRS5PcnRob2dyYXBoaWNDYW1lcmEoMCwxMDAsMCwxMDAsLjEsMUUzKTt0cnl7dGhpcy5yZW5kZXJlcj1uZXcgVEhSRUUuV2ViR0xSZW5kZXJlcih7YWxwaGE6ITB9KSx0aGlzLnJlbmRlcmVyLnNldFBpeGVsUmF0aW8oKSxkMy5zZWxlY3QodGhpcy5yZW5kZXJlci5kb21FbGVtZW50KS5zdHlsZSgibGVmdCIsMCkuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpLnN0eWxlKCJwb3NpdGlvbiIsImFic29sdXRlIikuc3R5bGUoInRvcCIsMCksdGhpcy5ob2xkZXIuYXBwZW5kQ2hpbGQodGhpcy5yZW5kZXJlci5kb21FbGVtZW50KX1jYXRjaChhKXt9dGhpcy56b29tPWQzLnpvb20oKS5zY2FsZUV4dGVudChbMSw1MDBdKS5vbigiem9vbSIsdGhpcy56b29tZWQuYmluZCh0aGlzKSk7ZDMuc2VsZWN0KHRoaXMuZWxlbSkuY2FsbCh0aGlzLnpvb20pO3RoaXMubGFiZWxzQW5kQXhlc1NWRz0KZDMuc2VsZWN0KHRoaXMuaG9sZGVyKS5hcHBlbmQoInN2ZyIpLnN0eWxlKCJsZWZ0IiwwKS5zdHlsZSgicG9zaXRpb24iLCJhYnNvbHV0ZSIpLnN0eWxlKCJ0b3AiLDApO3RoaXMubGFiZWxzQW5kQXhlc1NWR1Jvb3Q9dGhpcy5sYWJlbHNBbmRBeGVzU1ZHLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwicm9vdCIpO3RoaXMubGFiZWxzTGF5ZXI9dGhpcy5sYWJlbHNBbmRBeGVzU1ZHUm9vdC5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxhYmVscyIpO3RoaXMuYXhlc0xheWVyPXRoaXMubGFiZWxzQW5kQXhlc1NWR1Jvb3QuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJheGVzIik7dGhpcy5jb21wYXJlZExheWVyPXRoaXMubGFiZWxzQW5kQXhlc1NWR1Jvb3QuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJjb21wYXJlZGJveGVzIik7dGhpcy5zZWxlY3RlZExheWVyPXRoaXMubGFiZWxzQW5kQXhlc1NWR1Jvb3QuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJzZWxlY3RlZGJveGVzIik7CnRoaXMubGFiZWxzQW5kQXhlc1NWRy5vbigiY2xpY2siLHRoaXMuY2xpY2tlZC5iaW5kKHRoaXMpKTt0aGlzLnJlbmRlcmVyfHwodGhpcy5sYWJlbHNBbmRBeGVzU1ZHLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLHRoaXMuY2VsbEJhY2tncm91bmRTVkcuc3R5bGUoImRpc3BsYXkiLCJub25lIiksZDMuc2VsZWN0KHRoaXMuaG9sZGVyKS5hcHBlbmQoInAiKS5hdHRyKCJjbGFzcyIsImVycm9yIikuc3R5bGUoImNvbG9yIiwiZGFya3JlZCIpLmh0bWwoJ1xuICAgICAgICAgICAgXHgzY3N0cm9uZ1x4M2VFUlJPUlx4M2Mvc3Ryb25nXHgzZTogRmFjZXRzIERpdmUgcmVxdWlyZXMgV2ViR0wsIGFuZCBpdCBpcyBub3RcbiAgICAgICAgICAgIGVuYWJsZWQgaW4geW91ciBicm93c2VyLiBTZWVcbiAgICAgICAgICAgIFx4M2NhIHJlbFx4M2Qibm9yZWZlcnJlciIgaHJlZlx4M2QiaHR0cDovL3dlYmdscmVwb3J0LmNvbS8iXHgzZVxuICAgICAgICAgICAgV2ViR0wgUmVwb3J0XHgzYy9hXHgzZSBmb3IgZGV0YWlscy5cbiAgICAgICAgICAnKSl9em9vbWVkKCl7Y29uc3Qge3g6YSwKeTpjLGs6ZH09ZDMuZXZlbnQudHJhbnNmb3JtLGY9dGhpcy5zY2FsZS9kO3RoaXMuY2FtZXJhLnRvcCo9Zjt0aGlzLmNhbWVyYS5sZWZ0Kj1mO3RoaXMuY2FtZXJhLnJpZ2h0Kj1mO3RoaXMuY2FtZXJhLmJvdHRvbSo9Zjt0aGlzLmNhbWVyYS5wb3NpdGlvbi5zZXQoLWEvZCxjL2QsdGhpcy5jYW1lcmEucG9zaXRpb24ueik7dGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO3RoaXMuc2NhbGU9ZDt0aGlzLnRyYW5zZm9ybVNWRygpO3RoaXMudXBkYXRlT2JqZWN0VmlzaWJpbGl0eSgpO3RoaXMucXVldWVSZW5kZXJTY2VuZSgpfWNsaWNrZWQoKXt2YXIgYT10aGlzLmVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz1kMy5ldmVudDthPXRoaXMuc3ByaXRlTWVzaC5maW5kU3ByaXRlcyh0aGlzLmNhbWVyYS5wb3NpdGlvbi54KyhjLmNsaWVudFgtYS5sZWZ0KS90aGlzLnNjYWxlLHRoaXMuY2FtZXJhLnBvc2l0aW9uLnktKGMuY2xpZW50WS1hLnRvcCkvdGhpcy5zY2FsZSk7CnZhciBkPXt9O2lmKGMuY3RybEtleSlmb3IoYz0wO2M8dGhpcy5lbGVtLnNlbGVjdGVkSW5kaWNlcy5sZW5ndGg7YysrKWRbdGhpcy5lbGVtLnNlbGVjdGVkSW5kaWNlc1tjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dPSEwO3RoaXMuZWxlbS5zZXQoInNlbGVjdGVkSW5kaWNlcyIsQXJyYXkuZnJvbShPYmplY3Qua2V5cyhkKS5tYXAoZj0+K2YpKSk7YT1bXTtmb3IoZD0wO2Q8dGhpcy5lbGVtLnNlbGVjdGVkSW5kaWNlcy5sZW5ndGg7ZCsrKWEucHVzaCh0aGlzLmVsZW0uZGF0YVt0aGlzLmVsZW0uc2VsZWN0ZWRJbmRpY2VzW2RdXSk7dGhpcy5lbGVtLnNldCgic2VsZWN0ZWREYXRhIixhKX1zZWxlY3RlZEluZGljZXNVcGRhdGVkKCl7dGhpcy5zcHJpdGVNZXNoJiZ0aGlzLnVwZGF0ZVNlbGVjdGVkQm94ZXMoKX1jb21wYXJlZEluZGljZXNVcGRhdGVkKCl7aWYodGhpcy5zcHJpdGVNZXNoKXt2YXIgYT1bXTtmb3IobGV0IGM9MDtjPHRoaXMuZWxlbS5jb21wYXJlZEluZGljZXMubGVuZ3RoO2MrKylhLnB1c2godGhpcy5lbGVtLmRhdGFbdGhpcy5lbGVtLmNvbXBhcmVkSW5kaWNlc1tjXV0pOwp0aGlzLmVsZW0uc2V0KCJjb21wYXJlZERhdGEiLGEpO3RoaXMudXBkYXRlQ29tcGFyZWRCb3hlcygpfX11cGRhdGVTZWxlY3RlZEJveGVzKCl7dmFyIGE9dGhpcy5lbGVtLnNlbGVjdGVkSW5kaWNlcy5tYXAoZD0+KHt4OnRoaXMuc3ByaXRlTWVzaC5nZXRYKGQpLHk6dGhpcy5zcHJpdGVNZXNoLmdldFkoZCl9KSk7YT10aGlzLnNlbGVjdGVkTGF5ZXIuc2VsZWN0QWxsKCIuc2VsZWN0ZWQiKS5kYXRhKGEpO3ZhciBjPWEuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJzZWxlY3RlZCIsITApLmF0dHIoInRyYW5zZm9ybSIsZD0+YHRyYW5zbGF0ZSgkey41KyhkLnh8fDApfSwkey41KyhkLnl8fDApfSkgc2NhbGUoJHszfSlgKS5zdHlsZSgib3BhY2l0eSIsMCk7Yy5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtLjUpLmF0dHIoInkiLC0uNSkuYXR0cigid2lkdGgiLDEpLmF0dHIoImhlaWdodCIsMSkuYXR0cigic3Ryb2tlIiwiIzQ4M2QwNiIpLmF0dHIoInN0cm9rZS1saW5lY2FwIiwKInJvdW5kIikuYXR0cigic3Ryb2tlLWxpbmVqb2luIiwicm91bmQiKS5hdHRyKCJzdHJva2Utb3BhY2l0eSIsMCkuYXR0cigic3Ryb2tlLXdpZHRoIiwuMykuYXR0cigiZmlsbC1vcGFjaXR5IiwwKTtjLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC0uNSkuYXR0cigieSIsLS41KS5hdHRyKCJ3aWR0aCIsMSkuYXR0cigiaGVpZ2h0IiwxKS5hdHRyKCJzdHJva2UiLCIjZmFkNDExIikuYXR0cigic3Ryb2tlLWxpbmVjYXAiLCJyb3VuZCIpLmF0dHIoInN0cm9rZS1saW5lam9pbiIsInJvdW5kIikuYXR0cigic3Ryb2tlLW9wYWNpdHkiLDApLmF0dHIoInN0cm9rZS13aWR0aCIsLjE1KS5hdHRyKCJmaWxsLW9wYWNpdHkiLDApO2M9Yy5tZXJnZShhKTtjLnRyYW5zaXRpb24oKS5hdHRyKCJ0cmFuc2Zvcm0iLGQ9PmB0cmFuc2xhdGUoJHsuNSsoZC54fHwwKX0sJHsuNSsoZC55fHwwKX0pIHNjYWxlKCR7Ljh9KWApLnN0eWxlKCJvcGFjaXR5IiwxKTtjLnNlbGVjdEFsbCgicmVjdCIpLmNsYXNzZWQoInJvdGF0ZSIsCiEwKS5hdHRyKCJzdHJva2Utb3BhY2l0eSIsMSk7YS5leGl0KCkudHJhbnNpdGlvbigpLnN0eWxlKCJvcGFjaXR5IiwwKS5yZW1vdmUoKX11cGRhdGVDb21wYXJlZEJveGVzKCl7dmFyIGE9dGhpcy5lbGVtLmNvbXBhcmVkSW5kaWNlcy5tYXAoZD0+KHt4OnRoaXMuc3ByaXRlTWVzaC5nZXRYKGQpLHk6dGhpcy5zcHJpdGVNZXNoLmdldFkoZCl9KSk7YT10aGlzLmNvbXBhcmVkTGF5ZXIuc2VsZWN0QWxsKCIuY29tcGFyZWQiKS5kYXRhKGEpO3ZhciBjPWEuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJjb21wYXJlZCIsITApLmF0dHIoInRyYW5zZm9ybSIsZD0+YHRyYW5zbGF0ZSgkey41KyhkLnh8fDApfSwkey41KyhkLnl8fDApfSkgc2NhbGUoJHszfSlgKS5zdHlsZSgib3BhY2l0eSIsMCk7Yy5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtLjUpLmF0dHIoInkiLC0uNSkuYXR0cigid2lkdGgiLDEpLmF0dHIoImhlaWdodCIsMSkuYXR0cigic3Ryb2tlIiwiIzQ0ZmY0NCIpLmF0dHIoInN0cm9rZS1saW5lY2FwIiwKInJvdW5kIikuYXR0cigic3Ryb2tlLWxpbmVqb2luIiwicm91bmQiKS5hdHRyKCJzdHJva2Utb3BhY2l0eSIsMCkuYXR0cigic3Ryb2tlLXdpZHRoIiwuMykuYXR0cigiZmlsbC1vcGFjaXR5IiwwKTtjLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC0uNSkuYXR0cigieSIsLS41KS5hdHRyKCJ3aWR0aCIsMSkuYXR0cigiaGVpZ2h0IiwxKS5hdHRyKCJzdHJva2UiLCIjMWQ2YjFkIikuYXR0cigic3Ryb2tlLWxpbmVjYXAiLCJyb3VuZCIpLmF0dHIoInN0cm9rZS1saW5lam9pbiIsInJvdW5kIikuYXR0cigic3Ryb2tlLW9wYWNpdHkiLDApLmF0dHIoInN0cm9rZS13aWR0aCIsLjE1KS5hdHRyKCJmaWxsLW9wYWNpdHkiLDApO2M9Yy5tZXJnZShhKTtjLnRyYW5zaXRpb24oKS5hdHRyKCJ0cmFuc2Zvcm0iLGQ9PmB0cmFuc2xhdGUoJHsuNSsoZC54fHwwKX0sJHsuNSsoZC55fHwwKX0pIHNjYWxlKCR7Ljh9KWApLnN0eWxlKCJvcGFjaXR5IiwxKTtjLnNlbGVjdEFsbCgicmVjdCIpLmNsYXNzZWQoInJvdGF0ZSIsCiEwKS5hdHRyKCJzdHJva2Utb3BhY2l0eSIsMSk7YS5leGl0KCkudHJhbnNpdGlvbigpLnN0eWxlKCJvcGFjaXR5IiwwKS5yZW1vdmUoKX1maXRUb1ZpZXdwb3J0KCl7Y29uc3QgYT10aGlzLmVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoYS53aWR0aCYmYS5oZWlnaHQpe3RoaXMubGF5b3V0LnZpZXdwb3J0LndpZHRoPWEud2lkdGg7dGhpcy5sYXlvdXQudmlld3BvcnQuaGVpZ2h0PWEuaGVpZ2h0O3RoaXMubGF5b3V0LnBhZGRpbmcuYm90dG9tPXRoaXMuZWxlbS5zY2VuZVBhZGRpbmc7dGhpcy5sYXlvdXQucGFkZGluZy5sZWZ0PXRoaXMuZWxlbS5zY2VuZVBhZGRpbmc7dGhpcy5sYXlvdXQucGFkZGluZy5yaWdodD10aGlzLmVsZW0uc2NlbmVQYWRkaW5nO3RoaXMubGF5b3V0LnBhZGRpbmcudG9wPXRoaXMuZWxlbS5zY2VuZVBhZGRpbmc7dGhpcy5sYXlvdXQuZ3JpZD17Ym90dG9tOjAsbGVmdDowLHJpZ2h0OnRoaXMuZ3JpZC53aWR0aCx0b3A6dGhpcy5ncmlkLmhlaWdodH07CmlmKHRoaXMubGFiZWxzLmxlbmd0aCl7dmFyIGM9MCxkPTAsZj0wLGc9MDt0aGlzLmxhYmVsc0xheWVyLnNlbGVjdEFsbCgiLmxhYmVsIikuZWFjaChmdW5jdGlvbihuKXt2YXIgcD1kMy5zZWxlY3QodGhpcykuc2VsZWN0KCIuY3VycmVudCIpLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjb25zdCBxPW4uZWxlbWVudE1hcmdpbnx8e2JvdHRvbTowLGxlZnQ6MCxyaWdodDowLHRvcDowfSxyPXAuaGVpZ2h0K3EudG9wK3EuYm90dG9tO3A9cC53aWR0aCtxLmxlZnQrcS5yaWdodDtzd2l0Y2gobi5zaWRlKXtjYXNlIEZwLkJvdHRvbTpjPU1hdGgubWF4KGMscik7YnJlYWs7Y2FzZSBGcC5Ub3A6Zz1NYXRoLm1heChnLHIpO2JyZWFrO2Nhc2UgRnAuTGVmdDpkPU1hdGgubWF4KGQscCk7YnJlYWs7Y2FzZSBGcC5SaWdodDpmPU1hdGgubWF4KGYscCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIFNpZGUuIik7fX0pO3RoaXMubGF5b3V0LnBhZGRpbmcuYm90dG9tKz0KYzt0aGlzLmxheW91dC5wYWRkaW5nLmxlZnQrPWQ7dGhpcy5sYXlvdXQucGFkZGluZy5yaWdodCs9Zjt0aGlzLmxheW91dC5wYWRkaW5nLnRvcCs9Z310aGlzLmxheW91dC5yZWR1Y2VQYWRkaW5nVG9GaXRXaWR0aChhLndpZHRoKTt0aGlzLmxheW91dC5yZWR1Y2VQYWRkaW5nVG9GaXRIZWlnaHQoYS5oZWlnaHQpO3RoaXMuc2NhbGU9dGhpcy5sYXlvdXQuY29tcHV0ZVNjYWxlKCk7dmFyIHtwb3NpdGlvbjpsLGZydXN0dW06a309dGhpcy5sYXlvdXQuY29tcHV0ZUNhbWVyYSgpO3RoaXMuY2FtZXJhLmxlZnQ9ay5sZWZ0O3RoaXMuY2FtZXJhLnJpZ2h0PWsucmlnaHQ7dGhpcy5jYW1lcmEudG9wPWsudG9wO3RoaXMuY2FtZXJhLmJvdHRvbT1rLmJvdHRvbTt0aGlzLmNhbWVyYS5wb3NpdGlvbi5zZXQobC54LGwueSwxMDApO3RoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtkMy5zZWxlY3QodGhpcy5lbGVtKS5jYWxsKHRoaXMuem9vbS50cmFuc2Zvcm0sZDMuem9vbUlkZW50aXR5LnNjYWxlKHRoaXMuc2NhbGUpLnRyYW5zbGF0ZSgtdGhpcy5jYW1lcmEucG9zaXRpb24ueCwKdGhpcy5jYW1lcmEucG9zaXRpb24ueSkpO3RoaXMudHJhbnNmb3JtU1ZHKCk7dGhpcy51cGRhdGVPYmplY3RWaXNpYmlsaXR5KCk7dGhpcy5xdWV1ZVJlbmRlclNjZW5lKCl9ZWxzZSBzZXRUaW1lb3V0KCgpPT50aGlzLmZpdFRvVmlld3BvcnQoKSwxMDApfXpvb21Jbigpe3RoaXMuem9vbS5zY2FsZUJ5KGQzLnNlbGVjdCh0aGlzLmVsZW0pLDEuMSl9em9vbU91dCgpe3RoaXMuem9vbS5zY2FsZUJ5KGQzLnNlbGVjdCh0aGlzLmVsZW0pLDEvMS4xKX10cmFuc2Zvcm1TVkcoKXtjb25zdCBhPS10aGlzLmNhbWVyYS5wb3NpdGlvbi54KnRoaXMuc2NhbGUsYz10aGlzLmNhbWVyYS5wb3NpdGlvbi55KnRoaXMuc2NhbGU7dGhpcy5jZWxsQmFja2dyb3VuZFNWR1Jvb3QuYXR0cigidHJhbnNmb3JtIixgdHJhbnNsYXRlKCR7YX0sJHtjfSkgc2NhbGUoJHt0aGlzLnNjYWxlfSwkey10aGlzLnNjYWxlfSlgKTt0aGlzLmxhYmVsc0FuZEF4ZXNTVkdSb290LmF0dHIoInRyYW5zZm9ybSIsYHRyYW5zbGF0ZSgke2F9LCR7Y30pIHNjYWxlKCR7dGhpcy5zY2FsZX0sJHstdGhpcy5zY2FsZX0pYCk7CnRoaXMubGFiZWxzQW5kQXhlc1NWR1Jvb3Quc2VsZWN0QWxsKCIudW5zY2FsZSIpLmF0dHIoInRyYW5zZm9ybSIsYHNjYWxlKCR7MS90aGlzLnNjYWxlfSlgKTt0aGlzLmF4ZXNMYXllci5zZWxlY3RBbGwoIi5heGlzIikuc2VsZWN0KCJwYXRoIikuYXR0cigiZCIsZD0+ZC5wYXRoKHRoaXMuc2NhbGUpKS5hdHRyKCJzdHJva2Utd2lkdGgiLGQ9PmQuc3Ryb2tlV2lkdGgodGhpcy5zY2FsZSkpfWlzVmlzaWJsZShhLGMpe3JldHVybiBhLnNob3VsZEJlVmlzaWJsZShjLHRoaXMuc2NhbGUsdGhpcy5jYW1lcmEucG9zaXRpb24sdGhpcy5jYW1lcmEpfXVwZGF0ZU9iamVjdFZpc2liaWxpdHkoKXtjb25zdCBhPXRoaXM7dmFyIGM9dGhpcy5sYWJlbHNMYXllci5zZWxlY3RBbGwoIi5sYWJlbCIpO2NvbnN0IGQ9Yy5maWx0ZXIoZnVuY3Rpb24oZyl7cmV0dXJuKHZvaWQgMD09PWcudmlzaWJsZXx8IWcudmlzaWJsZSkmJmEuaXNWaXNpYmxlKGcsdGhpcyl9KS5lYWNoKGc9PmcudmlzaWJsZT0hMCksCmY9Yy5maWx0ZXIoZnVuY3Rpb24oZyl7cmV0dXJuKHZvaWQgMD09PWcudmlzaWJsZXx8Zy52aXNpYmxlKSYmIWEuaXNWaXNpYmxlKGcsdGhpcyl9KS5lYWNoKGc9PmcudmlzaWJsZT0hMSk7ZC5zZWxlY3RBbGwoIi5vcGFjaXR5IikudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRoaXMuZWxlbS50d2VlbkR1cmF0aW9uKS5hdHRyKCJvcGFjaXR5IiwxKTtmLnNlbGVjdEFsbCgiLm9wYWNpdHkiKS50cmFuc2l0aW9uKCkuZHVyYXRpb24odGhpcy5lbGVtLnR3ZWVuRHVyYXRpb24pLmF0dHIoIm9wYWNpdHkiLDApO2MuZmlsdGVyKGc9PiEhZy5zY2FsZURvd24pLnNlbGVjdEFsbCgiLnNjYWxlIikuYXR0cigidHJhbnNmb3JtIixnPT5gc2NhbGUoJHt0aGlzLnNjYWxlPGcubWluU2NhbGU/dGhpcy5zY2FsZS9nLm1pblNjYWxlOjF9KWApO2M9dGhpcy5heGVzTGF5ZXIuc2VsZWN0QWxsKCIuYXhpcyIpLmVhY2goZnVuY3Rpb24oZyl7Zy52aXNpYmxlPWEuaXNWaXNpYmxlKGcsdGhpcyl9KTtjLmZpbHRlcihnPT4KISFnLnZpc2libGUpLnNlbGVjdCgicGF0aCIpLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLmVsZW0udHdlZW5EdXJhdGlvbikuYXR0cigic3Ryb2tlLW9wYWNpdHkiLDEpO2MuZmlsdGVyKGc9PiFnLnZpc2libGUpLnNlbGVjdCgicGF0aCIpLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLmVsZW0udHdlZW5EdXJhdGlvbikuYXR0cigic3Ryb2tlLW9wYWNpdHkiLDApfWFkZFZlcnRpY2FsRmFjZXRMYWJlbHMoYSl7dGhpcy5lbGVtLnZlcnRpY2FsRmFjZXQgaW4gdGhpcy5zdGF0cyYmdGhpcy5ncmlkLmdldENvbHVtbih0aGlzLmdyaWQuaG9yaXpvbnRhbEtleXNbdGhpcy5ncmlkLmhvcml6b250YWxLZXlzLmxlbmd0aC0xXSkuZm9yRWFjaChjPT57Y29uc3QgZD10aGlzLnZlcnRpY2FsRmFjZXRJbmZvLmxhYmVsaW5nRnVuY3Rpb24oYy52ZXJ0aWNhbEtleSksZj1uZXcgc3E7Zi50ZXh0PWQubGFiZWw7Zi54PWMueCtjLndpZHRoO2YueT1jLmNvbnRlbnRZK2MuaW5uZXJIZWlnaHQvCjI7Zi5zaWRlPUZwLlJpZ2h0O2YuY2VsbD1jO2YuYXR0cmlidXRlcz17ImFsaWdubWVudC1iYXNlbGluZSI6Im1pZGRsZSIsZmlsbDoiIzY2NjY2NiIsImZvbnQtc2l6ZSI6cnFbImZvbnQtc2l6ZSJdLCJ0ZXh0LWFuY2hvciI6InN0YXJ0IiwiZm9udC1zdHlsZSI6ZC5zcGVjaWFsPyJpdGFsaWMiOiJub3JtYWwifTtmLm9mZnNldFBvc2l0aW9uPXt4Ojh9O2YubWluU2NhbGU9cnFbImZvbnQtc2l6ZSJdLyhjLmhlaWdodCt0aGlzLmdyaWQuY2VsbE1hcmdpbik7Zi5zY2FsZURvd249ITA7YS5wdXNoKGYpfSl9YWRkSG9yaXpvbnRhbEZhY2V0TGFiZWxzKGEpe3RoaXMuZWxlbS5ob3Jpem9udGFsRmFjZXQgaW4gdGhpcy5zdGF0cyYmdGhpcy5ncmlkLmdldFJvdyh0aGlzLmdyaWQudmVydGljYWxLZXlzW3RoaXMuZ3JpZC52ZXJ0aWNhbEtleXMubGVuZ3RoLTFdKS5mb3JFYWNoKGM9Pntjb25zdCBkPXRoaXMuaG9yaXpvbnRhbEZhY2V0SW5mby5sYWJlbGluZ0Z1bmN0aW9uKGMuaG9yaXpvbnRhbEtleSksCmY9bmV3IHNxO2YudGV4dD1kLmxhYmVsO2YueD1jLmNvbnRlbnRYK2MuaW5uZXJXaWR0aC8yO2YueT1jLnkrYy5oZWlnaHQ7Zi5zaWRlPUZwLlRvcDtmLmNlbGw9YztmLnJvdGF0ZT0tNDU7Zi5hdHRyaWJ1dGVzPXsiYWxpZ25tZW50LWJhc2VsaW5lIjoiaWRlb2dyYXBoaWMiLGZpbGw6IiNkZDY2MjIiLCJmb250LXNpemUiOnJxWyJmb250LXNpemUiXSwidGV4dC1hbmNob3IiOiJzdGFydCIsImZvbnQtc3R5bGUiOmQuc3BlY2lhbD8iaXRhbGljIjoibm9ybWFsIn07Zi5vZmZzZXRQb3NpdGlvbj17eDo4LHk6LTh9O2YubWluU2NhbGU9cnFbImZvbnQtc2l6ZSJdLyhjLndpZHRoK3RoaXMuZ3JpZC5jZWxsTWFyZ2luLzIpO2Yuc2NhbGVEb3duPSEwO2EucHVzaChmKX0pfWFkZFZlcnRpY2FsUG9zaXRpb25pbmdMYWJlbHMoYSl7aWYoInNjYXR0ZXIiPT09dGhpcy5lbGVtLnBvc2l0aW9uTW9kZSYmdGhpcy5lbGVtLnZlcnRpY2FsUG9zaXRpb24gaW4gdGhpcy5zdGF0cyl7dmFyIGM9dGhpcy5zdGF0c1t0aGlzLmVsZW0udmVydGljYWxQb3NpdGlvbl0sCmQ9dGhpcy5mb3JtYXROdW1iZXIoYy5udW1iZXJNaW4pLGY9dGhpcy5mb3JtYXROdW1iZXIoYy5udW1iZXJNYXgpLGc9KGQubGVuZ3RoKzMpLyhkLmxlbmd0aCtmLmxlbmd0aCs2KTt0aGlzLmdyaWQuZWFjaENlbGwobD0+e2lmKGwuaXRlbXMubGVuZ3RoKXtmb3IodmFyIGs9bC5zaWJsaW5ncy5sZWZ0OyEoIWt8fGsuaXRlbXMubGVuZ3RofHxrLnNpYmxpbmdzLmFib3ZlJiZrLnNpYmxpbmdzLmFib3ZlLml0ZW1zLmxlbmd0aCk7KWs9ay5zaWJsaW5ncy5sZWZ0O2s9az9rLmNvbnRlbnRYK2suaW5uZXJXaWR0aDotSW5maW5pdHk7dmFyIG49bC54KzgscD1sLmNvbnRlbnRZLHE9bC5jb250ZW50WStsLmlubmVySGVpZ2h0LHI9bmV3IHNxO3IuaWQ9YCR7bC5jb21wb3VuZEtleX0tbGVmdC1zdGFydGA7ci50ZXh0PWQ7ci54PWwueCs4O3IueT1sLnkrKHRoaXMuZWxlbS5ob3Jpem9udGFsUG9zaXRpb24/ODowKTtyLnNpZGU9RnAuTGVmdDtyLmNlbGw9bDtyLnJvdGF0ZT0tOTA7ci5hdHRyaWJ1dGVzPQp7ImFsaWdubWVudC1iYXNlbGluZSI6ImlkZW9ncmFwaGljIixmaWxsOiIjMjI1NWFhIiwiZm9udC1zaXplIjoxNiwidGV4dC1hbmNob3IiOiJzdGFydCJ9O3Iub2Zmc2V0UG9zaXRpb249e3g6a3EuYm90dG9tLHk6LWtxLnJpZ2h0fTtyLmJvdW5kaW5nQm94PXtib3R0b206cCxsZWZ0OmsscmlnaHQ6bix0b3A6cCtsLmlubmVySGVpZ2h0KihNYXRoLm1heChnLC4xKS0uMDUpfTtyLmVsZW1lbnRNYXJnaW49a3E7YS5wdXNoKHIpO3I9bmV3IHNxO3IuaWQ9YCR7bC5jb21wb3VuZEtleX0tbGVmdC1lbmRgO3IudGV4dD1mO3IueD1sLngrODtyLnk9bC55K2wuaGVpZ2h0O3Iuc2lkZT1GcC5MZWZ0O3IuY2VsbD1sO3Iucm90YXRlPS05MDtyLmF0dHJpYnV0ZXM9eyJhbGlnbm1lbnQtYmFzZWxpbmUiOiJpZGVvZ3JhcGhpYyIsZmlsbDoiIzIyNTVhYSIsImZvbnQtc2l6ZSI6MTYsInRleHQtYW5jaG9yIjoiZW5kIn07ci5vZmZzZXRQb3NpdGlvbj17eDota3EudG9wLHk6LWtxLnJpZ2h0fTtyLmJvdW5kaW5nQm94PQp7Ym90dG9tOnArbC5pbm5lckhlaWdodCooTWF0aC5taW4oZywuOSkrLjA1KSxsZWZ0OmsscmlnaHQ6bix0b3A6cX07ci5lbGVtZW50TWFyZ2luPWtxO2EucHVzaChyKX19KX19YWRkSG9yaXpvbnRhbFBvc2l0aW9uaW5nTGFiZWxzKGEpe2lmKCJzY2F0dGVyIj09PXRoaXMuZWxlbS5wb3NpdGlvbk1vZGUmJnRoaXMuZWxlbS5ob3Jpem9udGFsUG9zaXRpb24gaW4gdGhpcy5zdGF0cyl7dmFyIGM9dGhpcy5zdGF0c1t0aGlzLmVsZW0uaG9yaXpvbnRhbFBvc2l0aW9uXSxkPXRoaXMuZm9ybWF0TnVtYmVyKGMubnVtYmVyTWluKSxmPXRoaXMuZm9ybWF0TnVtYmVyKGMubnVtYmVyTWF4KSxnPShkLmxlbmd0aCszKS8oZC5sZW5ndGgrZi5sZW5ndGgrNik7dGhpcy5ncmlkLmVhY2hDZWxsKGw9PntpZihsLml0ZW1zLmxlbmd0aCl7Zm9yKHZhciBrPWwuc2libGluZ3MuYmVsb3c7ISgha3x8ay5pdGVtcy5sZW5ndGh8fGsuc2libGluZ3MucmlnaHQmJmsuc2libGluZ3MucmlnaHQuaXRlbXMubGVuZ3RoKTspaz0Kay5zaWJsaW5ncy5iZWxvdztrPWs/ay5jb250ZW50WStrLmlubmVySGVpZ2h0Oi1JbmZpbml0eTt2YXIgbj1sLmNvbnRlbnRZLHA9bC5jb250ZW50WCxxPXArbC5pbm5lcldpZHRoLHI9bmV3IHNxO3IuaWQ9YCR7bC5jb21wb3VuZEtleX0tYm90dG9tLXN0YXJ0YDtyLnRleHQ9ZDtyLng9bC54Kyh0aGlzLmVsZW0udmVydGljYWxQb3NpdGlvbj84OjApO3IueT1sLnkrODtyLnNpZGU9RnAuQm90dG9tO3IuY2VsbD1sO3IuYXR0cmlidXRlcz17ImFsaWdubWVudC1iYXNlbGluZSI6ImhhbmdpbmciLGZpbGw6IiMxMTg4NDQiLCJmb250LXNpemUiOjE2LCJ0ZXh0LWFuY2hvciI6InN0YXJ0In07ci5vZmZzZXRQb3NpdGlvbj17eDprcS5sZWZ0LHk6a3EudG9wfTtyLmJvdW5kaW5nQm94PXtib3R0b206ayxsZWZ0OnAscmlnaHQ6cCtsLmlubmVyV2lkdGgqKE1hdGgubWF4KGcsLjEpLS4wNSksdG9wOm59O3IuZWxlbWVudE1hcmdpbj1rcTthLnB1c2gocik7cj1uZXcgc3E7ci5pZD1gJHtsLmNvbXBvdW5kS2V5fS1ib3R0b20tZW5kYDsKci50ZXh0PWY7ci54PWwueCtsLndpZHRoO3IueT1sLnkrODtyLnNpZGU9RnAuQm90dG9tO3IuY2VsbD1sO3IuYXR0cmlidXRlcz17ImFsaWdubWVudC1iYXNlbGluZSI6ImhhbmdpbmciLGZpbGw6IiMxMTg4NDQiLCJmb250LXNpemUiOjE2LCJ0ZXh0LWFuY2hvciI6ImVuZCJ9O3Iub2Zmc2V0UG9zaXRpb249e3g6LWtxLnJpZ2h0LHk6a3EudG9wfTtyLmJvdW5kaW5nQm94PXtib3R0b206ayxsZWZ0OnArbC5pbm5lcldpZHRoKihNYXRoLm1pbihnLC45KSsuMDUpLHJpZ2h0OnEsdG9wOm59O3IuZWxlbWVudE1hcmdpbj1rcTthLnB1c2gocil9fSl9fWRldGVybWluZUxhYmVscygpe2NvbnN0IGE9W107dGhpcy5hZGRWZXJ0aWNhbEZhY2V0TGFiZWxzKGEpO3RoaXMuYWRkSG9yaXpvbnRhbEZhY2V0TGFiZWxzKGEpO3RoaXMuYWRkVmVydGljYWxQb3NpdGlvbmluZ0xhYmVscyhhKTt0aGlzLmFkZEhvcml6b250YWxQb3NpdGlvbmluZ0xhYmVscyhhKTtyZXR1cm4gYX11cGRhdGVDZWxsQmFja2dyb3VuZHMoKXt2YXIgYT0KdGhpcy5ncmlkLmdldENlbGxzKCkuZmlsdGVyKGM9PmMuaXRlbXMubGVuZ3RoKTthPXRoaXMuY2VsbEJhY2tncm91bmRMYXllci5zZWxlY3RBbGwoIi5jZWxsIikuZGF0YShhLGM9PmMuY29tcG91bmRLZXkpO2EuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsImNlbGwiKS5hdHRyKCJ4IixjPT5jLmNvbnRlbnRYfHwwKS5hdHRyKCJ5IixjPT5jLmNvbnRlbnRZfHwwKS5hdHRyKCJ3aWR0aCIsYz0+Yy5pbm5lcldpZHRofHwwKS5hdHRyKCJoZWlnaHQiLGM9PmMuaW5uZXJIZWlnaHR8fDApLmF0dHIoImZpbGwiLCIjZjhmOGY5IikuYXR0cigiZmlsbC1vcGFjaXR5IiwwKS5tZXJnZShhKS50cmFuc2l0aW9uKCkuZHVyYXRpb24odGhpcy5lbGVtLnR3ZWVuRHVyYXRpb24pLmF0dHIoIngiLGM9PmMuY29udGVudFh8fDApLmF0dHIoInkiLGM9PmMuY29udGVudFl8fDApLmF0dHIoIndpZHRoIixjPT5jLmlubmVyV2lkdGh8fDApLmF0dHIoImhlaWdodCIsYz0+Yy5pbm5lckhlaWdodHx8CjApLmF0dHIoImZpbGwtb3BhY2l0eSIsMSk7YS5leGl0KCkudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRoaXMuZWxlbS50d2VlbkR1cmF0aW9uKS5yZW1vdmUoKS5hdHRyKCJmaWxsLW9wYWNpdHkiLDApfXVwZGF0ZUF4ZXMoKXtjb25zdCBhPVtdOyJzdGFja2VkIiE9PXRoaXMuZWxlbS5wb3NpdGlvbk1vZGUmJnRoaXMuZ3JpZC5lYWNoQ2VsbChmPT57aWYoZi5pdGVtcy5sZW5ndGgpe2lmKHRoaXMuZWxlbS52ZXJ0aWNhbFBvc2l0aW9uKXtjb25zdCBnPW5ldyBRcChGcC5MZWZ0LGYpO2EucHVzaChnKX10aGlzLmVsZW0uaG9yaXpvbnRhbFBvc2l0aW9uJiYoZj1uZXcgUXAoRnAuQm90dG9tLGYpLGEucHVzaChmKSl9fSk7Y29uc3QgYz10aGlzLmF4ZXNMYXllci5zZWxlY3RBbGwoIi5heGlzIikuZGF0YShhLGY9PmYua2V5KCkpLGQ9Yy5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwiYXhpcyIpLmF0dHIoIm9wYWNpdHkiLDApO2QuYXBwZW5kKCJwYXRoIikuYXR0cigiZCIsZj0+CmYucGF0aCh0aGlzLnNjYWxlKSkuYXR0cigic3Ryb2tlIixmPT5mLnNpZGU9PT1GcC5MZWZ0PyIjMjI1NWFhIjoiIzExODg0NCIpLmF0dHIoInN0cm9rZS13aWR0aCIsZj0+Zi5zdHJva2VXaWR0aCh0aGlzLnNjYWxlKSkuYXR0cigic3Ryb2tlLW9wYWNpdHkiLDApLmF0dHIoImZpbGwiLCJub25lIik7ZC5tZXJnZShjKS50cmFuc2l0aW9uKCkuZHVyYXRpb24odGhpcy5lbGVtLnR3ZWVuRHVyYXRpb24pLmF0dHIoIm9wYWNpdHkiLDEpO2QubWVyZ2UoYykuc2VsZWN0KCJwYXRoIikudHJhbnNpdGlvbigpLmR1cmF0aW9uKHRoaXMuZWxlbS50d2VlbkR1cmF0aW9uKS5hdHRyKCJkIixmPT5mLnBhdGgodGhpcy5zY2FsZSkpO2MuZXhpdCgpLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLmVsZW0udHdlZW5EdXJhdGlvbikucmVtb3ZlKCkuYXR0cigib3BhY2l0eSIsMCl9dXBkYXRlTGFiZWxzKCl7aWYodGhpcy5zY2FsZSl7dGhpcy5sYWJlbHM9dGhpcy5kZXRlcm1pbmVMYWJlbHMoKTt2YXIgYT0KdGhpcy5sYWJlbHNMYXllci5zZWxlY3RBbGwoIi5sYWJlbCIpLmRhdGEodGhpcy5sYWJlbHMsbD0+bC5pZHx8YCR7bC5zaWRlfS0ke2wudGV4dH1gKTthLmVhY2goZnVuY3Rpb24obCl7Y29uc3Qgaz1kMy5zZWxlY3QodGhpcyksbj1rLnNlbGVjdCgiLmN1cnJlbnQiKTtsLnRleHQhPT1uLnRleHQoKSYmKG4uYXR0cigiZmlsbC1vcGFjaXR5IiwwKSxrLnNlbGVjdCgiLm9sZCIpLmF0dHIoImZpbGwtb3BhY2l0eSIsMSkudGV4dChuLnRleHQoKSkpfSkuc2VsZWN0KCIuY3VycmVudCIpLnRleHQobD0+bC50ZXh0KTt2YXIgYz1sPT5rPT52b2lkIDA9PT1rLmF0dHJpYnV0ZXN8fHZvaWQgMD09PWsuYXR0cmlidXRlc1tsXT9ycVtsXTprLmF0dHJpYnV0ZXNbbF0sZD1hLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsYWJlbCIpLmF0dHIoInRyYW5zZm9ybSIsbD0+YHRyYW5zbGF0ZSgke2wueH0sJHtsLnl9KWApLGY9ZC5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImZsaXAiKS5hdHRyKCJ0cmFuc2Zvcm0iLAoic2NhbGUoMSwtMSkiKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInJvdGF0ZSIpLmF0dHIoInRyYW5zZm9ybSIsbD0+InJvdGF0ZSgiKygicm90YXRlImluIGw/bC5yb3RhdGU6MCkrIikiKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInVuc2NhbGUiKS5hdHRyKCJ0cmFuc2Zvcm0iLGBzY2FsZSgkezEvdGhpcy5zY2FsZX0pYCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJwb3NpdGlvbiIpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwib3BhY2l0eSBzY2FsZSIpLGc9Zi5hcHBlbmQoInRleHQiKS5hdHRyKCJjbGFzcyIsIm9sZCIpLmF0dHIoImZpbGwtb3BhY2l0eSIsMCk7Zj1mLmFwcGVuZCgidGV4dCIpLmF0dHIoImNsYXNzIiwiY3VycmVudCIpLmF0dHIoImZpbGwtb3BhY2l0eSIsMCkudGV4dChsPT5sLnRleHQpO2Zvcihjb25zdCBsIGluIHJxKXJxLmhhc093blByb3BlcnR5KGwpJiYoZy5hdHRyKGwsYyhsKSksZi5hdHRyKGwsYyhsKSkpO2c9ZC5tZXJnZShhKS50cmFuc2l0aW9uKCkuZHVyYXRpb24odGhpcy5lbGVtLnR3ZWVuRHVyYXRpb24pLmF0dHIoInRyYW5zZm9ybSIsCmw9PmB0cmFuc2xhdGUoJHtsLnh9LCR7bC55fSlgKTtnLnNlbGVjdCgiLnJvdGF0ZSIpLmF0dHIoInRyYW5zZm9ybSIsbD0+InJvdGF0ZSgiKygicm90YXRlImluIGw/bC5yb3RhdGU6MCkrIikiKTtnLmZpbHRlcihsPT4hIWwub2Zmc2V0UG9zaXRpb24pLnNlbGVjdCgiLnBvc2l0aW9uIikuYXR0cigidHJhbnNmb3JtIixsPT5gdHJhbnNsYXRlKCR7bC5vZmZzZXRQb3NpdGlvbi54fHwwfSwke2wub2Zmc2V0UG9zaXRpb24ueXx8MH0pYCk7ZD1nLnNlbGVjdCgiLm9sZCIpLmF0dHIoImZpbGwtb3BhY2l0eSIsMCk7Zz1nLnNlbGVjdCgiLmN1cnJlbnQiKS5hdHRyKCJmaWxsLW9wYWNpdHkiLDEpO2Zvcihjb25zdCBsIGluIHJxKXJxLmhhc093blByb3BlcnR5KGwpJiYoZC5hdHRyKGwsYyhsKSksZy5hdHRyKGwsYyhsKSkpO2EuZXhpdCgpLnRyYW5zaXRpb24oKS5kdXJhdGlvbih0aGlzLmVsZW0udHdlZW5EdXJhdGlvbikucmVtb3ZlKCkuc2VsZWN0KCIuY3VycmVudCIpLmF0dHIoImZpbGwtb3BhY2l0eSIsCjApfX1kYXRhQ2hhbmdlKCl7Y29uc3QgYT10aGlzLmVsZW0uZGF0YTtpZihhJiZhLmxlbmd0aCl7dGhpcy5yZXNpemVIYW5kbGVyKCk7dGhpcy5zdGF0cz1ocShhKTtpZih0aGlzLml0ZW1zKWlmKHRoaXMuaXRlbXMubGVuZ3RoIT09YS5sZW5ndGgpdGhpcy5pbml0aWFsaXplU3ByaXRlTWVzaCgpLHRoaXMudXBkYXRlSW1hZ2VGaWVsZE5hbWUoKTtlbHNlIGZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKXRoaXMuaXRlbXNbY10uZGF0YT1hW2NdO2Vsc2UgdGhpcy5pbml0aWFsaXplU3ByaXRlTWVzaCgpLHRoaXMucGlja0NvbG9yQnlGaWVsZCgpLHRoaXMucGlja1RleHREcmF3aW5nRmllbGQoKTt0aGlzLnVwZGF0ZUdyaWRGYWNldGluZygpO3RoaXMudXBkYXRlR3JpZEl0ZW1Qb3NpdGlvbnMoKTt0aGlzLnVwZGF0ZUNvbG9ycygpfX1pbml0aWFsaXplU3ByaXRlTWVzaCgpe3RoaXMuc3ByaXRlTWVzaCYmKHRoaXMuc2NlbmUucmVtb3ZlKHRoaXMuc3ByaXRlTWVzaCksdGhpcy5zcHJpdGVNZXNoLnNwcml0ZUF0bGFzLmNsZWFyUXVldWVzKCksCmRlbGV0ZSB0aGlzLnNwcml0ZU1lc2gpO2NvbnN0IGE9dGhpcy5lbGVtLmRhdGEsYz1hLmxlbmd0aDt2YXIgZD10aGlzLmVsZW0uc3ByaXRlSW1hZ2VXaWR0aCxmPXRoaXMuZWxlbS5zcHJpdGVJbWFnZUhlaWdodDtjb25zdCBnPWQvZjt0aGlzLnNwcml0ZU1lc2g9bmV3IFpwKGMsZCxmKTt0aGlzLnNjZW5lLmFkZCh0aGlzLnNwcml0ZU1lc2gpO3RoaXMuc3ByaXRlTWVzaC5zcHJpdGVBdGxhcy5vbkRyYXdGaW5pc2hlZD0oKT0+dGhpcy5xdWV1ZVJlbmRlclNjZW5lKCk7dGhpcy5pdGVtcz1bXTtkPU1hdGguY2VpbChNYXRoLnNxcnQoYykpO2Y9TWF0aC5jZWlsKGMvZCk7Zm9yKGxldCBsPTA7bDxjO2wrKyl7Y29uc3Qgaz10aGlzLnNwcml0ZU1lc2guY3JlYXRlU3ByaXRlKCk7ay54PWQvMjtrLnk9Zi8yO2sub3BhY2l0eT0wO2sudGltZXN0YW1wPURhdGUubm93KCk7ay5yZWJhc2Uoay50aW1lc3RhbXApO3RoaXMuaXRlbXMucHVzaCh7c3ByaXRlOmssZGF0YTphW2xdfSl9dGhpcy5ncmlkPQpuZXcgUHAodGhpcy5pdGVtcyk7dGhpcy5ncmlkLmNlbGxNYXJnaW49MTt0aGlzLmdyaWQuaXRlbUFzcGVjdFJhdGlvPWc7dGhpcy5ncmlkLml0ZW1Qb3NpdGlvblNldHRlcj0obCxrLG4pPT57Y29uc3QgcD1EYXRlLm5vdygpO2wuc3ByaXRlLnJlYmFzZShwKTtsLnNwcml0ZS54PWs7bC5zcHJpdGUueT1uO2wuc3ByaXRlLm9wYWNpdHk9MTtsLnNwcml0ZS50aW1lc3RhbXA9cCt0aGlzLmVsZW0udHdlZW5EdXJhdGlvbjt0aGlzLnJlbmRlclVudGlsKGwuc3ByaXRlLnRpbWVzdGFtcCl9fWZpbHRlcmVkRGF0YUluZGljZXNDaGFuZ2UoKXtjb25zdCBhPXRoaXMuZWxlbS5maWx0ZXJlZERhdGFJbmRpY2VzLGM9W107aWYoYSlmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGY9YVtkXTtmPHRoaXMuaXRlbXMubGVuZ3RoJiYoY1tmXT0hMCl9ZD1bXTtmPVtdO2NvbnN0IGc9RGF0ZS5ub3coKSxsPWcrdGhpcy5lbGVtLnR3ZWVuRHVyYXRpb247Zm9yKGxldCBrPTA7azx0aGlzLml0ZW1zLmxlbmd0aDtrKyspe2NvbnN0IG49CnRoaXMuaXRlbXNba107IWF8fGNba10/KGQucHVzaChuLmRhdGEpLGYucHVzaChuKSxuLnNwcml0ZS5vcGFjaXR5fHwobi5zcHJpdGUucmViYXNlKGcpLG4uc3ByaXRlLnRpbWVzdGFtcD1sLG4uc3ByaXRlLm9wYWNpdHk9MSkpOjA8bi5zcHJpdGUub3BhY2l0eSYmKG4uc3ByaXRlLnJlYmFzZShnKSxuLnNwcml0ZS50aW1lc3RhbXA9bCxuLnNwcml0ZS5vcGFjaXR5PTApfXRoaXMucmVuZGVyVW50aWwobCk7dGhpcy5zdGF0cz1ocShkKTt0aGlzLmdyaWQuaXRlbXM9Zjt0aGlzLnVwZGF0ZUdyaWRGYWNldGluZygpO3RoaXMudXBkYXRlR3JpZEl0ZW1Qb3NpdGlvbnMoKX1waWNrQ29sb3JCeUZpZWxkKCl7bGV0IGE9bnVsbCxjPUluZmluaXR5O2Zvcihjb25zdCBkIGluIHRoaXMuc3RhdHMpaWYodGhpcy5zdGF0cy5oYXNPd25Qcm9wZXJ0eShkKSl7Y29uc3QgZj10aGlzLnN0YXRzW2RdLGc9TWF0aC5hYnMoZi51bmlxdWVDb3VudC1ucS5sZW5ndGgpOzE8Zi51bmlxdWVDb3VudCYmZzxjJiYKKGE9ZCxjPWcpfWlzRmluaXRlKGMpJiZhIGluIHRoaXMuc3RhdHMmJih0aGlzLmF1dG9Db2xvckJ5PSEwLHRoaXMuZWxlbS5zZXQoImNvbG9yQnkiLGEpKX1waWNrVGV4dERyYXdpbmdGaWVsZCgpe2xldCBhPSIiLGM9LUluZmluaXR5O2Zvcihjb25zdCBmIGluIHRoaXMuc3RhdHMpaWYodGhpcy5zdGF0cy5oYXNPd25Qcm9wZXJ0eShmKSl7dmFyIGQ9dGhpcy5zdGF0c1tmXTtkPWQuc3RyaW5nQ291bnQrZC5zdHJpbmdMZW5ndGhzQ291bnQtZC50b3RhbENvdW50O2Q+YyYmKGE9ZixjPWQpfWlzRmluaXRlKGMpJiZhIGluIHRoaXMuc3RhdHMmJnRoaXMuZWxlbS5zZXQoImltYWdlRmllbGROYW1lIixhKX1xdWV1ZUF0bGFzVXJsQ2hhbmdlKCl7dGhpcy5hdGxhc1VybENoYW5nZVRpbWVyJiZjbGVhclRpbWVvdXQodGhpcy5hdGxhc1VybENoYW5nZVRpbWVyKTt0aGlzLmF0bGFzVXJsQ2hhbmdlVGltZXI9c2V0VGltZW91dCgoKT0+e3RoaXMuYXRsYXNVcmxDaGFuZ2VUaW1lciYmdGhpcy5hdGxhc1VybENoYW5nZSgpfSwKMTAwKX1hdGxhc1VybENoYW5nZSgpe2NsZWFyVGltZW91dCh0aGlzLmF0bGFzVXJsQ2hhbmdlVGltZXIpO2RlbGV0ZSB0aGlzLmF0bGFzVXJsQ2hhbmdlVGltZXI7aWYodGhpcy5zcHJpdGVNZXNoKXt2YXIgYT10aGlzLmVsZW0uYXRsYXNVcmw7YSYmYS5sZW5ndGgmJmEhPT10aGlzLmxhc3RBdGxhc1VybCYmKHRoaXMubGFzdEF0bGFzVXJsPWEsdGhpcy5yZXNldFNwcml0ZXNUb0RlZmF1bHRUZXh0dXJlKCksdGhpcy5zcHJpdGVNZXNoLnNwcml0ZUF0bGFzLnNldEF0bGFzVXJsKGEsdGhpcy5lbGVtLmNyb3NzT3JpZ2luLCgpPT57Y29uc3QgYz10aGlzLmVsZW0uZGF0YSxkPURhdGUubm93KCksZj1kK3RoaXMuZWxlbS5mYWRlRHVyYXRpb247Zm9yKGxldCBnPTA7YyYmZzxjLmxlbmd0aDtnKyspdGhpcy5zcHJpdGVNZXNoLnN3aXRjaFRleHR1cmVzKGcsZCxmKTt0aGlzLnJlbmRlclVudGlsKGYpO3RoaXMuaWdub3JlQ2hhbmdlPSEwO3RoaXMuZWxlbS5zZXQoImltYWdlRmllbGROYW1lIiwKIiIpO2RlbGV0ZSB0aGlzLmlnbm9yZUNoYW5nZTt0aGlzLmF1dG9Db2xvckJ5JiYodGhpcy5hdXRvQ29sb3JCeT0hMSx0aGlzLmVsZW0uc2V0KCJjb2xvckJ5IiwiIikpfSkpfWVsc2UgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuYXRsYXNVcmxDaGFuZ2UuYmluZCh0aGlzKSl9c3ByaXRlVXJsQ2hhbmdlKCl7Y29uc3QgYT10aGlzLmVsZW0uc3ByaXRlVXJsO2lmKGEpaWYodGhpcy5zcHJpdGVNZXNoKXtjb25zdCBjPW5ldyBJbWFnZTt2b2lkIDAhPT10aGlzLmVsZW0uY3Jvc3NPcmlnaW4mJihjLmNyb3NzT3JpZ2luPXRoaXMuZWxlbS5jcm9zc09yaWdpbik7Yy5vbmxvYWQ9KCk9Pntjb25zdCBkPXRoaXMuc3ByaXRlTWVzaC5kZWZhdWx0VGV4dHVyZUNhbnZhcyxmPWQuZ2V0Q29udGV4dCgiMmQiKTtmLmNsZWFyUmVjdCgwLDAsZC53aWR0aCxkLmhlaWdodCk7Zi5kcmF3SW1hZ2UoYywwLDAsZC53aWR0aCxkLmhlaWdodCk7dGhpcy5zcHJpdGVNZXNoLmRlZmF1bHRUZXh0dXJlLm5lZWRzVXBkYXRlPQohMDt0aGlzLnF1ZXVlUmVuZGVyU2NlbmUoKX07Yy5zcmM9YX1lbHNlIHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnNwcml0ZVVybENoYW5nZS5iaW5kKHRoaXMpKX11cGRhdGVHcmlkU3RhY2tpbmcoKXsic3RhY2tlZCI9PT10aGlzLmVsZW0ucG9zaXRpb25Nb2RlJiYodGhpcy5ncmlkLmNvbXB1dGVJdGVtUG9zaXRpb249TXAodGhpcy5lbGVtLnZlcnRpY2FsRmFjZXQ/Im1pZGRsZSI6ImJvdHRvbSIsdGhpcy5lbGVtLmhvcml6b250YWxGYWNldD8ibWlkZGxlIjoicmlnaHQiKSl9dXBkYXRlR3JpZEZhY2V0aW5nKCl7aWYodGhpcy5ncmlkKXt0aGlzLnVwZGF0ZUdyaWRTdGFja2luZygpO3ZhciBhPXRoaXMudmVydGljYWxGYWNldEluZm89dGhpcy5nZW5lcmF0ZUZhY2V0aW5nSW5mbyh0aGlzLmVsZW0udmVydGljYWxGYWNldCx0aGlzLmVsZW0udmVydGljYWxCdWNrZXRzLHRoaXMuZWxlbS52ZXJ0aWNhbEJhZ09mV29yZHMsITApO3RoaXMuZ3JpZC52ZXJ0aWNhbEZhY2V0PWEuZmFjZXRpbmdGdW5jdGlvbjsKdGhpcy5ncmlkLnZlcnRpY2FsS2V5Q29tcGFyZT1hLmtleUNvbXBhcmVGdW5jdGlvbjthPXRoaXMuaG9yaXpvbnRhbEZhY2V0SW5mbz10aGlzLmdlbmVyYXRlRmFjZXRpbmdJbmZvKHRoaXMuZWxlbS5ob3Jpem9udGFsRmFjZXQsdGhpcy5lbGVtLmhvcml6b250YWxCdWNrZXRzLHRoaXMuZWxlbS5ob3Jpem9udGFsQmFnT2ZXb3JkcywhMSk7dGhpcy5ncmlkLmhvcml6b250YWxGYWNldD1hLmZhY2V0aW5nRnVuY3Rpb247dGhpcy5ncmlkLmhvcml6b250YWxLZXlDb21wYXJlPWEua2V5Q29tcGFyZUZ1bmN0aW9uO3RoaXMuZWxlbS5maXRHcmlkQXNwZWN0UmF0aW9Ub1ZpZXdwb3J0PyhhPXRoaXMuZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0aGlzLmdyaWQudGFyZ2V0R3JpZEFzcGVjdFJhdGlvPWEmJmEud2lkdGgmJmEuaGVpZ2h0P2Eud2lkdGgvYS5oZWlnaHR8fDE6MSk6dGhpcy5ncmlkLnRhcmdldEdyaWRBc3BlY3RSYXRpbz0xO3RoaXMuZ3JpZC5hcnJhbmdlKCk7dGhpcy51cGRhdGVDZWxsQmFja2dyb3VuZHMoKTsKdGhpcy51cGRhdGVBeGVzKCk7dGhpcy51cGRhdGVMYWJlbHMoKTt0aGlzLnVwZGF0ZVNlbGVjdGVkQm94ZXMoKTt0aGlzLnVwZGF0ZUNvbXBhcmVkQm94ZXMoKTt0aGlzLmZpdFRvVmlld3BvcnQoKX19dXBkYXRlR3JpZEl0ZW1Qb3NpdGlvbnMoKXtpZih0aGlzLmdyaWQpe3RoaXMudXBkYXRlR3JpZFN0YWNraW5nKCk7dmFyIGE9dGhpcy5ncmlkLmNlbGxQYWRkaW5nLGM9T3AuVGlnaHQsZD1PcC5Vbmlmb3JtLGY9ITE7aWYoInN0YWNrZWQiPT09dGhpcy5lbGVtLnBvc2l0aW9uTW9kZSlmPXRoaXMuZ3JpZC52ZXJ0aWNhbEdyaWRBbGlnbm1lbnQhPT1jfHx0aGlzLmdyaWQuaG9yaXpvbnRhbEdyaWRBbGlnbm1lbnQhPT1jLHRoaXMuZ3JpZC52ZXJ0aWNhbEdyaWRBbGlnbm1lbnQ9Yyx0aGlzLmdyaWQuaG9yaXpvbnRhbEdyaWRBbGlnbm1lbnQ9Yyx0aGlzLmdyaWQuY2VsbFBhZGRpbmcudG9wPTAsdGhpcy5ncmlkLmNlbGxQYWRkaW5nLmxlZnQ9MCx0aGlzLmdyaWQuY2VsbFBhZGRpbmcucmlnaHQ9CjAsdGhpcy5ncmlkLmNlbGxQYWRkaW5nLmJvdHRvbT0wLHRoaXMuZ3JpZC5taW5DZWxsQXNwZWN0UmF0aW89MCx0aGlzLmdyaWQubWF4Q2VsbEFzcGVjdFJhdGlvPUluZmluaXR5O2Vsc2V7dGhpcy5lbGVtLnZlcnRpY2FsUG9zaXRpb24/KGY9dGhpcy5ncmlkLnZlcnRpY2FsR3JpZEFsaWdubWVudCE9PWQsdGhpcy5ncmlkLnZlcnRpY2FsR3JpZEFsaWdubWVudD1kKTooZj10aGlzLmdyaWQudmVydGljYWxHcmlkQWxpZ25tZW50IT09Yyx0aGlzLmdyaWQudmVydGljYWxHcmlkQWxpZ25tZW50PWMpO3RoaXMuZWxlbS5ob3Jpem9udGFsUG9zaXRpb24/KGY9Znx8dGhpcy5ncmlkLmhvcml6b250YWxHcmlkQWxpZ25tZW50IT09ZCx0aGlzLmdyaWQuaG9yaXpvbnRhbEdyaWRBbGlnbm1lbnQ9ZCk6KGY9Znx8dGhpcy5ncmlkLmhvcml6b250YWxHcmlkQWxpZ25tZW50IT09Yyx0aGlzLmdyaWQuaG9yaXpvbnRhbEdyaWRBbGlnbm1lbnQ9Yyk7Y29uc3QgZz10aGlzLmdlbmVyYXRlUG9zaXRpb25GdW5jdGlvbih0aGlzLmVsZW0uaG9yaXpvbnRhbFBvc2l0aW9uKXx8CktwLGw9dGhpcy5nZW5lcmF0ZVBvc2l0aW9uRnVuY3Rpb24odGhpcy5lbGVtLnZlcnRpY2FsUG9zaXRpb24pfHxMcDt0aGlzLmdyaWQuY29tcHV0ZUl0ZW1Qb3NpdGlvbj0oayxuLHAscSk9Pih7eDpnKGssbixwLHEpLHk6bChrLG4scCxxKX0pO2M9dGhpcy5lbGVtLnZlcnRpY2FsUG9zaXRpb24/ODowO2Q9dGhpcy5lbGVtLmhvcml6b250YWxQb3NpdGlvbj84OjA7Zj1mfHwwIT09YS50b3B8fGMhPT1hLmxlZnR8fDAhPT1hLnJpZ2h0fHxkIT09YS5ib3R0b207dGhpcy5ncmlkLmNlbGxQYWRkaW5nLnRvcD0wO3RoaXMuZ3JpZC5jZWxsUGFkZGluZy5yaWdodD0wO3RoaXMuZ3JpZC5jZWxsUGFkZGluZy5sZWZ0PWM7dGhpcy5ncmlkLmNlbGxQYWRkaW5nLmJvdHRvbT1kO3RoaXMuZ3JpZC5taW5DZWxsQXNwZWN0UmF0aW89MTt0aGlzLmdyaWQubWF4Q2VsbEFzcGVjdFJhdGlvPTJ9Zj8odGhpcy5ncmlkLmFycmFuZ2UoKSx0aGlzLnVwZGF0ZUNlbGxCYWNrZ3JvdW5kcygpKTp0aGlzLmdyaWQucG9zaXRpb25JdGVtcygpOwp0aGlzLnVwZGF0ZUF4ZXMoKTt0aGlzLnVwZGF0ZUxhYmVscygpO3RoaXMudXBkYXRlU2VsZWN0ZWRCb3hlcygpO3RoaXMudXBkYXRlQ29tcGFyZWRCb3hlcygpO3RoaXMuZml0VG9WaWV3cG9ydCgpfX1nZXRQYWxldHRlU291cmNlKCl7c3dpdGNoKHRoaXMuZWxlbS5wYWxldHRlQ2hvaWNlKXtjYXNlICJ3YXJtIjpyZXR1cm4gcHE7Y2FzZSAiY29vbCI6cmV0dXJuIG9xO2Nhc2UgImFzc2lzdCI6cmV0dXJuIHFxO2RlZmF1bHQ6cmV0dXJuIG5xfX11cGRhdGVTY2FsYXJQYWxldHRlKCl7Y29uc3QgYT10aGlzLmVsZW0uY29sb3JCeSxjPXRoaXMuc3RhdHNbYV07dmFyIGQ9dGhpcy5ncmlkLml0ZW1zLGY9ZDMucmdiKCIjQTUyNzE0IiksZz1kMy5zY2FsZUxpbmVhcigpO2cuZG9tYWluKFtjLm51bWJlck1pbixjLm51bWJlck1heF0pLnJhbmdlKFsid2hpdGUiLCIjMUMzQUE5Il0pO2NvbnN0IGw9W107Zm9yKHZhciBrPTA7azxkLmxlbmd0aDtrKyspe3ZhciBuPWRba107bj1hIGluIG4uZGF0YT8Kbi5kYXRhW2FdOk5hTjtuPSJudW1iZXIiIT09dHlwZW9mIG58fGlzTmFOKG4pP2Y6ZDMucmdiKGcobikpO2wucHVzaChuKX1kPXRoaXMuZ2VuZXJhdGVGYWNldGluZ0luZm8oYSw1LCExLCExKS5sYWJlbGluZ0Z1bmN0aW9uO2Y9ZDMuc2NhbGVMaW5lYXIoKTtmLmRvbWFpbihbMCw0XSkucmFuZ2UoWyJ3aGl0ZSIsIiMxQzNBQTkiXSk7Zz1bXTtmb3Ioaz00OzA8PWs7ay0tKW49ZChrKSxnLnB1c2goe2tleTprLGNvbG9yOmYoayksY29udGVudDpufSk7KGMub3RoZXJDb3VudHx8Yy5zdHJpbmdDb3VudHx8Yy50b3RhbENvdW50PHRoaXMuZ3JpZC5pdGVtcy5sZW5ndGgpJiZnLnB1c2goe2tleTpOYU4sY29sb3I6IiNBNTI3MTQiLGNvbnRlbnQ6e2xhYmVsOiJtaXNzaW5nIixzcGVjaWFsOiEwfX0pO3RoaXMuZWxlbS5zZXQoInBhbGV0dGUiLGcpO3RoaXMuZ3JpZC5jZWxsSXRlbUNvbXBhcmF0b3I9KHAscSk9PntpZighKGEgaW4gcC5kYXRhfHxhIGluIHEuZGF0YSkpcmV0dXJuIDA7aWYoIShhIGluCnAuZGF0YSkpcmV0dXJuLTE7aWYoIShhIGluIHEuZGF0YSkpcmV0dXJuIDE7cD1wLmRhdGFbYV07cT1xLmRhdGFbYV07aWYocD09PXEpcmV0dXJuIDA7Y29uc3Qgcj0ibnVtYmVyIiE9PXR5cGVvZiBwfHxpc05hTihwKSx0PSJudW1iZXIiIT09dHlwZW9mIHF8fGlzTmFOKHEpO3JldHVybiByJiZ0PzA6cj8tMTp0PzE6cC1xfTtyZXR1cm4gbH11cGRhdGVDYXRlZ29yaWNhbFBhbGV0dGUoYSl7Y29uc3QgYz10aGlzLmVsZW0uY29sb3JCeSxkPXRoaXMuc3RhdHNbY10sZj10aGlzLmdyaWQuaXRlbXMsZz1PYmplY3Qua2V5cyhkLnZhbHVlSGFzaCk7dGhpcy5lbGVtLnN0YWJsZUNvbG9ycz9nLnNvcnQoKTpnLnNvcnQoKHQsdik9PmQudmFsdWVIYXNoW3ZdLmNvdW50LWQudmFsdWVIYXNoW3RdLmNvdW50KTtjb25zdCBsPU1hdGgubWluKGEubGVuZ3RoLGcubGVuZ3RoKSxrPWcuc2xpY2UoMCxsKS5yZWR1Y2UoKHQsdix5KT0+e3Rbdl09eTtyZXR1cm4gdH0se30pLG49ZDMucmdiKCIjRjBGMEYwIiksCnA9YS5tYXAodD0+ZDMucmdiKHQpKTtsZXQgcT0hMTtjb25zdCByPVtdO2ZvcihsZXQgdD0wO3Q8Zi5sZW5ndGg7dCsrKXtjb25zdCB2PWFxKGZbdF0uZGF0YVtjXSk7cT1xfHwhKHYgaW4gayk7ci5wdXNoKHBba1t2XV18fG4pfWE9YS5zbGljZSgwLGwpLm1hcCgodCx2KT0+e3Y9ZC52YWx1ZUhhc2hbZ1t2XV0udmFsdWU7cmV0dXJue2tleTp2LGNvbG9yOnQsY29udGVudDp7bGFiZWw6disiIixzcGVjaWFsOiJudW1iZXIiIT09dHlwZW9mIHYmJiJzdHJpbmciIT09dHlwZW9mIHZ8fHYgaW4gbHF9fX0pO3EmJmEucHVzaCh7a2V5Om51bGwsY29sb3I6IiNGMEYwRjAiLGNvbnRlbnQ6e2xhYmVsOiJvdGhlciIsc3BlY2lhbDohMH19KTt0aGlzLmVsZW0uc2V0KCJwYWxldHRlIixhKTt0aGlzLmdyaWQuY2VsbEl0ZW1Db21wYXJhdG9yPSh0LHYpPT57aWYoIShjIGluIHQuZGF0YXx8YyBpbiB2LmRhdGEpKXJldHVybiAwO2lmKCEoYyBpbiB0LmRhdGEpKXJldHVybiAxO2lmKCEoYyBpbiB2LmRhdGEpKXJldHVybi0xOwp0PXQuZGF0YVtjXTt2PXYuZGF0YVtjXTtpZih0PT09dilyZXR1cm4gMDt0PWFxKHQpO3Y9YXEodik7cmV0dXJuIHQgaW4ga3x8diBpbiBrP3QgaW4gaz92IGluIGs/a1t0XS1rW3ZdOi0xOjE6MH07cmV0dXJuIHJ9dXBkYXRlQ29sb3JzKCl7aWYodGhpcy5ncmlkKXt2YXIgYT10aGlzLmVsZW0uY29sb3JCeTtpZihhIGluIHRoaXMuc3RhdHMpe2E9dGhpcy5zdGF0c1thXTt2YXIgYz10aGlzLmdldFBhbGV0dGVTb3VyY2UoKTthPWEudW5pcXVlQ291bnQ+Yy5sZW5ndGgmJmEuaXNOdW1lcmljKCk/dGhpcy51cGRhdGVTY2FsYXJQYWxldHRlKCk6dGhpcy51cGRhdGVDYXRlZ29yaWNhbFBhbGV0dGUoYyk7Yz10aGlzLmdyaWQuaXRlbXM7dmFyIGQ9RGF0ZS5ub3coKSxmPWQrdGhpcy5lbGVtLnR3ZWVuRHVyYXRpb247Zm9yKGxldCBnPTA7ZzxjLmxlbmd0aDtnKyspe2NvbnN0IGw9Y1tnXSxrPWFbZ107bC5zcHJpdGUucmViYXNlKGQpO2wuc3ByaXRlLnI9ay5yO2wuc3ByaXRlLmc9ay5nO2wuc3ByaXRlLmI9CmsuYjtsLnNwcml0ZS5hPTE4MDtsLnNwcml0ZS50aW1lc3RhbXA9Zn10aGlzLnJlbmRlclVudGlsKGYpO3RoaXMudXBkYXRlR3JpZEl0ZW1Qb3NpdGlvbnNBZnRlckNvbG9yQ2hhbmdlKCl9ZWxzZSB0aGlzLmNsZWFyQ29sb3JzKCl9fXVwZGF0ZUdyaWRJdGVtUG9zaXRpb25zQWZ0ZXJDb2xvckNoYW5nZSgpeyJzdGFja2VkIiE9PXRoaXMuZWxlbS5wb3NpdGlvbk1vZGUmJnRoaXMuZWxlbS52ZXJ0aWNhbFBvc2l0aW9uJiZ0aGlzLmVsZW0uaG9yaXpvbnRhbFBvc2l0aW9ufHx0aGlzLnVwZGF0ZUdyaWRJdGVtUG9zaXRpb25zKCl9Y2xlYXJDb2xvcnMoKXtjb25zdCBhPXRoaXMuZ3JpZC5pdGVtcyxjPURhdGUubm93KCksZD1jK3RoaXMuZWxlbS50d2VlbkR1cmF0aW9uO2ZvcihsZXQgZj0wO2Y8YS5sZW5ndGg7ZisrKXtjb25zdCBnPWFbZl07Zy5zcHJpdGUucmViYXNlKGMpO2cuc3ByaXRlLnI9MDtnLnNwcml0ZS5nPTA7Zy5zcHJpdGUuYj0wO2cuc3ByaXRlLmE9MDtnLnNwcml0ZS50aW1lc3RhbXA9CmR9dGhpcy5yZW5kZXJVbnRpbChkKTt0aGlzLmVsZW0uc2V0KCJwYWxldHRlIixbXSk7dGhpcy5ncmlkLmNlbGxJdGVtQ29tcGFyYXRvciYmKHRoaXMuZ3JpZC5jZWxsSXRlbUNvbXBhcmF0b3I9bnVsbCx0aGlzLnVwZGF0ZUdyaWRJdGVtUG9zaXRpb25zQWZ0ZXJDb2xvckNoYW5nZSgpKX1yZXNldFNwcml0ZXNUb0RlZmF1bHRUZXh0dXJlKCl7Y29uc3QgYT10aGlzLmdyaWQuaXRlbXM7dGhpcy5zcHJpdGVNZXNoLnNwcml0ZUF0bGFzLmNsZWFyUXVldWVzKCk7Y29uc3QgYz1EYXRlLm5vdygpLGQ9Yyt0aGlzLmVsZW0uZmFkZUR1cmF0aW9uO2ZvcihsZXQgZj0wO2Y8YS5sZW5ndGg7ZisrKXtjb25zdCBnPWFbZl07MDxnLnNwcml0ZS50ZXh0dXJlSW5kZXgmJmcuc3ByaXRlLnN3aXRjaFRleHR1cmVzKGMsZCl9dGhpcy5yZW5kZXJVbnRpbChkKX11cGRhdGVJbWFnZUZpZWxkTmFtZSgpe2lmKCF0aGlzLmlnbm9yZUNoYW5nZSYmdGhpcy5ncmlkKXt0aGlzLnJlc2V0U3ByaXRlc1RvRGVmYXVsdFRleHR1cmUoKTsKdmFyIGE9dGhpcy5lbGVtLmltYWdlRmllbGROYW1lO2lmKGEgaW4gdGhpcy5zdGF0cyl7dmFyIGM9dGhpcy5ncmlkLml0ZW1zO2ZvcihsZXQgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXtjb25zdCB7c3ByaXRlOmYsZGF0YTpnfT1jW2RdO2Yuc2V0U3ByaXRlSW1hZ2VEYXRhKHt0eXBlOiJ0ZXh0IixkYXRhOm1xKGdbYV0pLmxhYmVsfSwoKT0+e2NvbnN0IGw9RGF0ZS5ub3coKTtmLmJhc2VUZXh0dXJlVGltZXN0YW1wPWw7Zi5iYXNlVGV4dHVyZUluZGV4PTA7Zi50ZXh0dXJlVGltZXN0YW1wPWwrdGhpcy5lbGVtLnR3ZWVuRHVyYXRpb247Zi50ZXh0dXJlSW5kZXg9MTt0aGlzLnJlbmRlclVudGlsKGYudGV4dHVyZVRpbWVzdGFtcCl9KX19ZWxzZSBkZWxldGUgdGhpcy5sYXN0QXRsYXNVcmwsdGhpcy5xdWV1ZUF0bGFzVXJsQ2hhbmdlKCl9fWdlbmVyYXRlUG9zaXRpb25GdW5jdGlvbihhKXtjb25zdCBjPXRoaXMuc3RhdHNbYV07aWYoIWN8fCFjLmlzTnVtZXJpYygpKXJldHVybiBudWxsO2NvbnN0IGQ9CmMubnVtYmVyTWF4LWMubnVtYmVyTWluO3JldHVybiBmPT4oZi5kYXRhW2FdLWMubnVtYmVyTWluKS9kfWdlbmVyYXRlRmFjZXRpbmdJbmZvKGEsYyxkLGYpe2lmKCEoYSBpbiB0aGlzLnN0YXRzKSlyZXR1cm57ZmFjZXRpbmdGdW5jdGlvbjooKT0+bnVsbCxrZXlDb21wYXJlRnVuY3Rpb246KCk9PjAsbGFiZWxpbmdGdW5jdGlvbjptcX07Y29uc3QgZz10aGlzLnN0YXRzW2FdO2lmKGcud29yZFRyZWUmJjE8Zy53b3JkVHJlZS5oaWdoZXN0TGV2ZWwmJmQpcmV0dXJuIHRoaXMuZ2VuZXJhdGVCYWdPZldvcmRzRmFjZXRpbmdJbmZvKGEsYyxmKTtpZihnLnVuaXF1ZUNvdW50PD1jKXJldHVybntmYWNldGluZ0Z1bmN0aW9uOms9PmEgaW4gay5kYXRhP2suZGF0YVthXTpudWxsLGtleUNvbXBhcmVGdW5jdGlvbjpnLmlzTnVtZXJpYygpP0pwOmY/SXA6SHAsbGFiZWxpbmdGdW5jdGlvbjptcX07aWYoZy5pc051bWVyaWMoKSYmZy5udW1iZXJNYXghPT1nLm51bWJlck1pbilyZXR1cm4gdGhpcy5nZW5lcmF0ZU51bWVyaWNGYWNldGluZ0luZm8oYSwKYyk7ZD1PYmplY3Qua2V5cyhnLnZhbHVlSGFzaCk7ZC5zb3J0KChrLG4pPT5nLnZhbHVlSGFzaFtuXS5jb3VudC1nLnZhbHVlSGFzaFtrXS5jb3VudCk7Y29uc3QgbD1kLnNsaWNlKDAsYykucmVkdWNlKChrLG4pPT57a1tuXT0hMDtyZXR1cm4ga30se30pO3JldHVybntmYWNldGluZ0Z1bmN0aW9uOms9PntpZighKGEgaW4gay5kYXRhKSlyZXR1cm4gbnVsbDtrPWsuZGF0YVthXTtyZXR1cm4gYXEoaylpbiBsP2s6Ilx1ZmZmY09USEVSXHVmZmZjIn0sa2V5Q29tcGFyZUZ1bmN0aW9uOmY/SXA6SHAsbGFiZWxpbmdGdW5jdGlvbjptcX19Z2VuZXJhdGVCYWdPZldvcmRzRmFjZXRpbmdJbmZvKGEsYyxkKXtjb25zdCBmPXRoaXMuc3RhdHNbYV0ud29yZFRyZWUsZz1mLmxldmVsSGFzaDtyZXR1cm57ZmFjZXRpbmdGdW5jdGlvbjpsPT57aWYoIShhIGluIGwuZGF0YSkpcmV0dXJuIG51bGw7Zm9yKGw9Zi5ub2RlSGFzaFthcShsLmRhdGFbYV0pXTtsLnBhcmVudCYmbC5sZXZlbD5jOylsPWwucGFyZW50OwpyZXR1cm4gbC5sZXZlbH0sa2V5Q29tcGFyZUZ1bmN0aW9uOihsLGspPT57bD1nW2xdO2s9Z1trXTtpZih2b2lkIDA9PT1sJiZ2b2lkIDA9PT1rKXJldHVybiAwO2lmKHZvaWQgMD09PWwpcmV0dXJuLTE7aWYodm9pZCAwPT09aylyZXR1cm4gMTtpZihsLm5vblZhbHVlQ291bnQmJmsubm9uVmFsdWVDb3VudClyZXR1cm4gMDtpZihsLm5vblZhbHVlQ291bnQpcmV0dXJuLTE7aWYoay5ub25WYWx1ZUNvdW50KXJldHVybiAxO2s9ay5vcmRlci1sLm9yZGVyO3JldHVybiBkP2s6LWt9LGxhYmVsaW5nRnVuY3Rpb246bD0+e2w9Z1srbF07aWYoIWwucGFyZW50JiYhbC5jb21tb25Xb3Jkcy5sZW5ndGgpcmV0dXJue2xhYmVsOiJvdGhlciIsc3BlY2lhbDohMH07aWYobC5ub25WYWx1ZUNvdW50KXJldHVybntsYWJlbDoibm9uLXdvcmRzIixzcGVjaWFsOiEwfTtsZXQgaz1gICR7Ilx1MjAyMiJ9ICR7bC5jb21tb25Xb3Jkcy5qb2luKCIgIil9YDtmb3IobGV0IG49MDtuPGwuY2hpbGRyZW4ubGVuZ3RoO24rKylpZihsLmNoaWxkcmVuW25dLmxldmVsPgpjKXtrKz0iIFx1MjAyNiI7YnJlYWt9Zm9yKDtsLnBhcmVudDspbD1sLnBhcmVudCxsLmNvbW1vbldvcmRzLmxlbmd0aCYmKGs9YCAkeyJcdTIwMjIifSAke2wuY29tbW9uV29yZHMuam9pbigiICIpfSBgK2spO3JldHVybntsYWJlbDprfX19fWdlbmVyYXRlTnVtZXJpY0ZhY2V0aW5nSW5mbyhhLGMpe2NvbnN0IGQ9dGhpcy5zdGF0c1thXSxmPWQubnVtYmVyTWF4LWQubnVtYmVyTWluO3JldHVybntmYWNldGluZ0Z1bmN0aW9uOmc9PntpZighKGEgaW4gZy5kYXRhKSlyZXR1cm4gbnVsbDtnPWcuZGF0YVthXTtyZXR1cm4ibnVtYmVyIiE9PXR5cGVvZiBnP2c6aXNOYU4oZyk/ZzpNYXRoLm1pbihNYXRoLmZsb29yKGMqKGctZC5udW1iZXJNaW4pL2YpLGMtMSl9LGtleUNvbXBhcmVGdW5jdGlvbjpKcCxsYWJlbGluZ0Z1bmN0aW9uOmc9PntpZigibnVtYmVyIiE9PXR5cGVvZiBnfHxpc05hTigrZykpcmV0dXJuIG1xKGcpO2NvbnN0IGw9ZC5udW1iZXJNYXgtZC5udW1iZXJNaW4saz1nL2MqCmwrZC5udW1iZXJNaW47Zz0oMStnKS9jKmwrZC5udW1iZXJNaW47cmV0dXJuIGQuaXNJbnRlZ2VyKCk/e2xhYmVsOnRoaXMuZm9ybWF0UmFuZ2UoTWF0aC5jZWlsKGspLE1hdGguZmxvb3IoZykpfTp7bGFiZWw6dGhpcy5mb3JtYXRSYW5nZShrLGcpfX19fWZvcm1hdE51bWJlcihhKXtpZihudWxsPT09YSlyZXR1cm4ibnVsbCI7YT1wYXJzZUZsb2F0KGEudG9QcmVjaXNpb24oMykpO3JldHVybiAxRTM8PU1hdGguYWJzKGEpP2QzLmZvcm1hdCgicyIpKGEpOiIiK2F9Zm9ybWF0UmFuZ2UoYSxjKXtyZXR1cm5gJHt0aGlzLmZvcm1hdE51bWJlcihhKX0gXHUyMDE0ICR7dGhpcy5mb3JtYXROdW1iZXIoYyl9YH1nZXRLZXlzKCl7cmV0dXJuIGVxKHRoaXMuZWxlbS5kYXRhKS5zb3J0KCl9cmVuZGVyVW50aWwoYSl7dGhpcy5lbmRUaW1lc3RhbXA9TWF0aC5tYXgodGhpcy5lbmRUaW1lc3RhbXAsYSk7dGhpcy5xdWV1ZVJlbmRlclNjZW5lKCl9cmVzaXplSGFuZGxlcigpe2NvbnN0IGE9dGhpcy5lbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwphLndpZHRoJiZhLmhlaWdodD8odGhpcy5sYWJlbHNBbmRBeGVzU1ZHLmF0dHIoIndpZHRoIixhLndpZHRoKS5hdHRyKCJoZWlnaHQiLGEuaGVpZ2h0KSx0aGlzLmNlbGxCYWNrZ3JvdW5kU1ZHLmF0dHIoIndpZHRoIixhLndpZHRoKS5hdHRyKCJoZWlnaHQiLGEuaGVpZ2h0KSx0aGlzLnJlbmRlcmVyJiZ0aGlzLnJlbmRlcmVyLnNldFNpemUoYS53aWR0aCxhLmhlaWdodCksdGhpcy5jYW1lcmEucmlnaHQ9YS53aWR0aC90aGlzLnNjYWxlLHRoaXMuY2FtZXJhLmJvdHRvbT0tYS5oZWlnaHQvdGhpcy5zY2FsZSx0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCksdGhpcy5xdWV1ZVJlbmRlclNjZW5lKCkpOnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+dGhpcy5yZXNpemVIYW5kbGVyKCkpfXF1ZXVlUmVuZGVyU2NlbmUoKXt0aGlzLnJlbmRlclF1ZXVlZHx8KHRoaXMucmVuZGVyUXVldWVkPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMucmVuZGVyUXVldWVkJiYKdGhpcy5yZW5kZXJTY2VuZSgpfSkpfXJlbmRlclNjZW5lKCl7dGhpcy5yZW5kZXJRdWV1ZWQ9ITE7Y29uc3QgYT1EYXRlLm5vdygpO3RoaXMuZW5kVGltZXN0YW1wPmEmJnRoaXMucXVldWVSZW5kZXJTY2VuZSgpO2lmKHRoaXMuc3ByaXRlTWVzaCYmKHRoaXMuc3ByaXRlTWVzaC50aW1lPWEsODE+K1RIUkVFLlJFVklTSU9OJiZ0aGlzLnNwcml0ZU1lc2gub25CZWZvcmVSZW5kZXIpKXRoaXMuc3ByaXRlTWVzaC5vbkJlZm9yZVJlbmRlcigpO3RoaXMucmVuZGVyZXImJnRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsdGhpcy5jYW1lcmEpO3RoaXMuc3ByaXRlTWVzaCYmdGhpcy5zcHJpdGVNZXNoLnNwcml0ZUF0bGFzJiZ0aGlzLnNwcml0ZU1lc2guc3ByaXRlQXRsYXMucG9zdFJlbmRlcigpfX0KUG9seW1lcih7aXM6ImZhY2V0cy1kaXZlLXZpcyIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcl0scHJvcGVydGllczp7ZGF0YTp7dHlwZTpBcnJheSx2YWx1ZTpudWxsLG9ic2VydmVyOiJfZGF0YUNoYW5nZSJ9LGZpbHRlcmVkRGF0YUluZGljZXM6e3R5cGU6QXJyYXksdmFsdWU6bnVsbCxvYnNlcnZlcjoiX2ZpbHRlcmVkRGF0YUluZGljZXNDaGFuZ2UifSxhdGxhc1VybDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbCxvYnNlcnZlcjoiX3F1ZXVlQXRsYXNVcmxDaGFuZ2UifSxzcHJpdGVVcmw6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGwsb2JzZXJ2ZXI6Il9zcHJpdGVVcmxDaGFuZ2UifSxjcm9zc09yaWdpbjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sa2V5czp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITAscmVhZE9ubHk6ITB9LHN0YXRzOnt0eXBlOk9iamVjdCx2YWx1ZTp7fSxub3RpZnk6ITAscmVhZE9ubHk6ITB9LHNjZW5lUGFkZGluZzp7dHlwZTpOdW1iZXIsCnZhbHVlOjh9LHR3ZWVuRHVyYXRpb246e3R5cGU6TnVtYmVyLHZhbHVlOjYwMH0sZmFkZUR1cmF0aW9uOnt0eXBlOk51bWJlcix2YWx1ZToyMDB9LHNwcml0ZUltYWdlV2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjY0fSxzcHJpdGVJbWFnZUhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6NjR9LGdyaWRGYWNldGluZ1ZlcnRpY2FsTGFiZWxDb2xvcjp7dHlwZTpTdHJpbmcsdmFsdWU6IiM2NjY2NjYifSxncmlkRmFjZXRpbmdIb3Jpem9udGFsTGFiZWxDb2xvcjp7dHlwZTpTdHJpbmcsdmFsdWU6IiNkZDY2MjIifSxpdGVtUG9zaXRpb25pbmdWZXJ0aWNhbExhYmVsQ29sb3I6e3R5cGU6U3RyaW5nLHZhbHVlOiIjMjI1NWFhIn0saXRlbVBvc2l0aW9uaW5nSG9yaXpvbnRhbExhYmVsQ29sb3I6e3R5cGU6U3RyaW5nLHZhbHVlOiIjMTE4ODQ0In0sZml0R3JpZEFzcGVjdFJhdGlvVG9WaWV3cG9ydDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx2ZXJ0aWNhbEZhY2V0Ont0eXBlOlN0cmluZyx2YWx1ZToiIiwKb2JzZXJ2ZXI6Il91cGRhdGVHcmlkRmFjZXRpbmcifSx2ZXJ0aWNhbEJ1Y2tldHM6e3R5cGU6TnVtYmVyLHZhbHVlOjEwLG9ic2VydmVyOiJfdXBkYXRlR3JpZEZhY2V0aW5nIn0sdmVydGljYWxCYWdPZldvcmRzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il91cGRhdGVHcmlkRmFjZXRpbmcifSxob3Jpem9udGFsRmFjZXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG9ic2VydmVyOiJfdXBkYXRlR3JpZEZhY2V0aW5nIn0saG9yaXpvbnRhbEJ1Y2tldHM6e3R5cGU6TnVtYmVyLHZhbHVlOjEwLG9ic2VydmVyOiJfdXBkYXRlR3JpZEZhY2V0aW5nIn0saG9yaXpvbnRhbEJhZ09mV29yZHM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX3VwZGF0ZUdyaWRGYWNldGluZyJ9LHBvc2l0aW9uTW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsb2JzZXJ2ZXI6Il91cGRhdGVHcmlkSXRlbVBvc2l0aW9ucyJ9LHZlcnRpY2FsUG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOiIiLApvYnNlcnZlcjoiX3VwZGF0ZUdyaWRJdGVtUG9zaXRpb25zIn0saG9yaXpvbnRhbFBvc2l0aW9uOnt0eXBlOlN0cmluZyx2YWx1ZToiIixvYnNlcnZlcjoiX3VwZGF0ZUdyaWRJdGVtUG9zaXRpb25zIn0sY29sb3JCeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsb2JzZXJ2ZXI6Il91cGRhdGVDb2xvcnMiLG5vdGlmeTohMH0saW1hZ2VGaWVsZE5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG9ic2VydmVyOiJfdXBkYXRlSW1hZ2VGaWVsZE5hbWUiLG5vdGlmeTohMH0scGFsZXR0ZTp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITB9LHBhbGV0dGVDaG9pY2U6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGFuZGFyZCIsb2JzZXJ2ZXI6Il91cGRhdGVDb2xvcnMifSxzZWxlY3RlZERhdGE6e3R5cGU6QXJyYXksdmFsdWU6W10sbm90aWZ5OiEwfSxzZWxlY3RlZEluZGljZXM6e3R5cGU6QXJyYXksdmFsdWU6W10sbm90aWZ5OiEwLG9ic2VydmVyOiJfc2VsZWN0ZWRJbmRpY2VzVXBkYXRlZCJ9LGNvbXBhcmVkRGF0YTp7dHlwZTpBcnJheSwKdmFsdWU6W10sbm90aWZ5OiEwfSxjb21wYXJlZEluZGljZXM6e3R5cGU6QXJyYXksdmFsdWU6W10sbm90aWZ5OiEwLG9ic2VydmVyOiJfY29tcGFyZWRJbmRpY2VzVXBkYXRlZCJ9LHN0YWJsZUNvbG9yczp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfdXBkYXRlQ29sb3JzIn19LGxpc3RlbmVyczp7Imlyb24tcmVzaXplIjoiX29uSXJvblJlc2l6ZSJ9LGNyZWF0ZWQoKXt0aGlzLl9iYWNraW5nPW5ldyB0cSh0aGlzKX0scmVhZHkoKXt0aGlzLl9iYWNraW5nLnJlYWR5KCl9LF9kYXRhQ2hhbmdlKGEpe3RoaXMuX2JhY2tpbmcuc2NlbmU/KHRoaXMuX2JhY2tpbmcuZGF0YUNoYW5nZSgpLHRoaXMuX3NldEtleXModGhpcy5fYmFja2luZy5nZXRLZXlzKCkpLHRoaXMuX3NldFN0YXRzKHRoaXMuX2JhY2tpbmcuc3RhdHMpKTpyZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5fZGF0YUNoYW5nZS5iaW5kKHRoaXMsYSkpfSxfZmlsdGVyZWREYXRhSW5kaWNlc0NoYW5nZShhKXt0aGlzLl9iYWNraW5nLnNjZW5lJiYKdGhpcy5fYmFja2luZy5pdGVtcz8odGhpcy5fYmFja2luZy5maWx0ZXJlZERhdGFJbmRpY2VzQ2hhbmdlKCksdGhpcy5fc2V0S2V5cyh0aGlzLl9iYWNraW5nLmdldEtleXMoKSksdGhpcy5fc2V0U3RhdHModGhpcy5fYmFja2luZy5zdGF0cykpOnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9maWx0ZXJlZERhdGFJbmRpY2VzQ2hhbmdlLmJpbmQodGhpcyxhKSl9LF9xdWV1ZUF0bGFzVXJsQ2hhbmdlKCl7dGhpcy5fYmFja2luZy5xdWV1ZUF0bGFzVXJsQ2hhbmdlKCl9LF9zcHJpdGVVcmxDaGFuZ2UoKXt0aGlzLl9iYWNraW5nLnNwcml0ZVVybENoYW5nZSgpfSxfdXBkYXRlR3JpZEZhY2V0aW5nKCl7dGhpcy5fYmFja2luZy51cGRhdGVHcmlkRmFjZXRpbmcoKX0sX3VwZGF0ZUdyaWRJdGVtUG9zaXRpb25zKCl7dGhpcy5fYmFja2luZy51cGRhdGVHcmlkSXRlbVBvc2l0aW9ucygpfSxfdXBkYXRlQ29sb3JzKCl7dGhpcy5fYmFja2luZy51cGRhdGVDb2xvcnMoKX0sX3VwZGF0ZUltYWdlRmllbGROYW1lKCl7dGhpcy5fYmFja2luZy51cGRhdGVJbWFnZUZpZWxkTmFtZSgpfSwKX29uSXJvblJlc2l6ZSgpe3RoaXMuX2JhY2tpbmcucmVzaXplSGFuZGxlcigpfSxfc2VsZWN0ZWRJbmRpY2VzVXBkYXRlZCgpe3RoaXMuX2JhY2tpbmcuc2VsZWN0ZWRJbmRpY2VzVXBkYXRlZCgpfSxfY29tcGFyZWRJbmRpY2VzVXBkYXRlZCgpe3RoaXMuX2JhY2tpbmcuY29tcGFyZWRJbmRpY2VzVXBkYXRlZCgpfSxmaXRUb1ZpZXdwb3J0KCl7dGhpcy5fYmFja2luZy5maXRUb1ZpZXdwb3J0KCl9LHpvb21Jbigpe3RoaXMuX2JhY2tpbmcuem9vbUluKCl9LHpvb21PdXQoKXt0aGlzLl9iYWNraW5nLnpvb21PdXQoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9mYWNldHMtZGl2ZS9jb21wb25lbnRzL2ZhY2V0cy1kaXZlLWNvbnRyb2xzL2ZhY2V0cy1kaXZlLWNvbnRyb2xzLmpzClBvbHltZXIoe2lzOiJmYWNldHMtZGl2ZS1jb250cm9scyIscHJvcGVydGllczp7YXRsYXNVcmw6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxrZXlzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxzdGF0czp7dHlwZTpPYmplY3QsdmFsdWU6e319LHZlcnRpY2FsRmFjZXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0sdmVydGljYWxCdWNrZXRzOnt0eXBlOk51bWJlcix2YWx1ZToxMCxub3RpZnk6ITB9LHZlcnRpY2FsQmFnT2ZXb3Jkczp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0saG9yaXpvbnRhbEZhY2V0Ont0eXBlOlN0cmluZyx2YWx1ZToiIixub3RpZnk6ITB9LGhvcml6b250YWxCdWNrZXRzOnt0eXBlOk51bWJlcix2YWx1ZToxMCxub3RpZnk6ITB9LGhvcml6b250YWxCYWdPZldvcmRzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxwb3NpdGlvbk1vZGU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0UG9zaXRpb25Nb2RlKHZlcnRpY2FsUG9zaXRpb24sIGhvcml6b250YWxQb3NpdGlvbikiLApub3RpZnk6ITB9LHZlcnRpY2FsUG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0saG9yaXpvbnRhbFBvc2l0aW9uOnt0eXBlOlN0cmluZyx2YWx1ZToiIixub3RpZnk6ITB9LGNvbG9yQnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0saW1hZ2VGaWVsZE5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0scGFsZXR0ZTp7dHlwZTpBcnJheSx2YWx1ZTpbXX0scGFsZXR0ZUNob2ljZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0YW5kYXJkIixub3RpZnk6ITB9LGdyaWRGYWNldGluZ1ZlcnRpY2FsTGFiZWxDb2xvcjp7dHlwZTpTdHJpbmcsdmFsdWU6IiM2NjY2NjYiLG9ic2VydmVyOiJfdXBkYXRlQ1NTVmFycyJ9LGdyaWRGYWNldGluZ0hvcml6b250YWxMYWJlbENvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZToiI2RkNjYyMiIsb2JzZXJ2ZXI6Il91cGRhdGVDU1NWYXJzIn0saXRlbVBvc2l0aW9uaW5nVmVydGljYWxMYWJlbENvbG9yOnt0eXBlOlN0cmluZywKdmFsdWU6IiMyMjU1YWEiLG9ic2VydmVyOiJfdXBkYXRlQ1NTVmFycyJ9LGl0ZW1Qb3NpdGlvbmluZ0hvcml6b250YWxMYWJlbENvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZToiIzExODg0NCIsb2JzZXJ2ZXI6Il91cGRhdGVDU1NWYXJzIn19LF9nZXRJbWFnZUZpZWxkTmFtZURlZmF1bHRMYWJlbChhKXtyZXR1cm4gYT8iKGltYWdlKSI6IihkZWZhdWx0KSJ9LF9pc01vZGVTY2F0dGVyKGEpe3JldHVybiJzY2F0dGVyIj09PWF9LF9pc0tleU51bWVyaWMoYSl7cmV0dXJuIHRoaXMuc3RhdHMmJmEgaW4gdGhpcy5zdGF0cyYmdGhpcy5zdGF0c1thXS5pc051bWVyaWMoKX0sX2lzS2V5Q2F0ZWdvcmljYWwoYSl7cmV0dXJuIHRoaXMuc3RhdHMmJmEgaW4gdGhpcy5zdGF0cyYmIXRoaXMuc3RhdHNbYV0uaXNOdW1lcmljKCl9LF91cGRhdGVDU1NWYXJzKCl7dGhpcy51cGRhdGVTdHlsZXMoeyItLWdyaWQtZmFjZXRpbmctdmVydGljYWwtbGFiZWwtY29sb3IiOnRoaXMuZ3JpZEZhY2V0aW5nVmVydGljYWxMYWJlbENvbG9yLAoiLS1ncmlkLWZhY2V0aW5nLWhvcml6b250YWwtbGFiZWwtY29sb3IiOnRoaXMuZ3JpZEZhY2V0aW5nSG9yaXpvbnRhbExhYmVsQ29sb3IsIi0taXRlbS1wb3NpdGlvbmluZy12ZXJ0aWNhbC1sYWJlbC1jb2xvciI6dGhpcy5pdGVtUG9zaXRpb25pbmdWZXJ0aWNhbExhYmVsQ29sb3IsIi0taXRlbS1wb3NpdGlvbmluZy1ob3Jpem9udGFsLWxhYmVsLWNvbG9yIjp0aGlzLml0ZW1Qb3NpdGlvbmluZ0hvcml6b250YWxMYWJlbENvbG9yfSl9LF9icmVha1VwQW5kVHJ1bmNhdGUoYSl7cmV0dXJuIGlxKGpxKCIiK2EpKX0sX21heEJ1Y2tldHMoYSxjKXtjb25zdCBkPXRoaXMuc3RhdHM/dGhpcy5zdGF0c1thXTpudWxsO3JldHVybiBkP2MmJnRoaXMuX2hhc1dvcmRUcmVlKGEpP01hdGgubWluKDEwMCxkLndvcmRUcmVlLmhpZ2hlc3RMZXZlbCk6TWF0aC5taW4oMTAwLGQudW5pcXVlQ291bnQrMSk6MTAwfSxfaGFzV29yZFRyZWUoYSl7YT10aGlzLnN0YXRzP3RoaXMuc3RhdHNbYV06bnVsbDsKcmV0dXJuISFhJiYhIWEud29yZFRyZWUmJjE8YS53b3JkVHJlZS5oaWdoZXN0TGV2ZWx9LF9nZXRQb3NpdGlvbk1vZGUoYSxjKXtyZXR1cm4iIj09YSYmIiI9PWM/InN0YWNrZWQiOiJzY2F0dGVyIn0sX29wZW5PdmVyZmxvdygpe3RoaXMuJC5vdmVyZmxvd21lbnUucG9zaXRpb25FbGVtZW50PXRoaXMuJC5vdmVyZmxvd2J0bjt0aGlzLiQub3ZlcmZsb3dtZW51Lm9wZW4oKX0sX3Nob3VsZFNob3dPdmVyZmxvd01lbnUoYSxjLGQpe3JldHVybiB0aGlzLl9pc0tleUNhdGVnb3JpY2FsKGEpfHx0aGlzLl9oYXNXb3JkVHJlZShjKXx8dGhpcy5faGFzV29yZFRyZWUoZCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLWRpdmUvbGliL2luZm8tcmVuZGVyZXJzLmpzCmNvbnN0IHVxPShhLGMpPT57Y29uc3QgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkbCIpO2Zvcihjb25zdCBnIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShnKSl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZHQiKTtmLnRleHRDb250ZW50PWc7ZC5hcHBlbmRDaGlsZChmKTtmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRkIik7Zi50ZXh0Q29udGVudD1hW2ddO2QuYXBwZW5kQ2hpbGQoZil9Yy5hcHBlbmRDaGlsZChkKX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLWRpdmUvY29tcG9uZW50cy9mYWNldHMtZGl2ZS1pbmZvLWNhcmQvZmFjZXRzLWRpdmUtaW5mby1jYXJkLmpzClBvbHltZXIoe2lzOiJmYWNldHMtZGl2ZS1pbmZvLWNhcmQiLHByb3BlcnRpZXM6e2luZm9SZW5kZXJlcjp7dHlwZTpPYmplY3R9LHNlbGVjdGVkRGF0YTp7dHlwZTpBcnJheSx2YWx1ZTpbXSxvYnNlcnZlcjoiX3VwZGF0ZVNlbGVjdGVkIn19LHJlYWR5KCl7dGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLmhvbGRlciwhMCl9LF91cGRhdGVTZWxlY3RlZChhKXt0aGlzLiQuaG9sZGVyLmlubmVySFRNTD0iIjtpZihhKXt2YXIgYz10aGlzLmluZm9SZW5kZXJlcnx8dXE7Zm9yKGxldCBkPTA7ZDxhLmxlbmd0aDtkKyspe2NvbnN0IGY9YVtkXSxnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9IjEwMCUiO3RoaXMuJC5ob2xkZXIuYXBwZW5kQ2hpbGQoZyk7YyhmLGcpfX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLWRpdmUvY29tcG9uZW50cy9mYWNldHMtZGl2ZS1sZWdlbmQvZmFjZXRzLWRpdmUtbGVnZW5kLmpzClBvbHltZXIoe2lzOiJmYWNldHMtZGl2ZS1sZWdlbmQiLHByb3BlcnRpZXM6e2NvbG9yQnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG9ic2VydmVyOiJfb3BlbiJ9LHBhbGV0dGU6e3R5cGU6QXJyYXksdmFsdWU6W119LF9vcGVuZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LF9icmVha1VwQW5kVHJ1bmNhdGUoYSl7cmV0dXJuIGlxKGpxKCIiK2EpKX0sX2FueUNvbG9yKCl7cmV0dXJuISEodGhpcy5jb2xvckJ5JiZ0aGlzLnBhbGV0dGUmJnRoaXMucGFsZXR0ZS5sZW5ndGgpfSxfc3BlY2lhbENsYXNzKGEpe3JldHVybiBhPyJzcGVjaWFsIjoiIn0sX29wZW4oKXt0aGlzLl9vcGVuZWQ9ITB9LF90b2dnbGVPcGVuZWQoKXt0aGlzLl9vcGVuZWQ9IXRoaXMuX29wZW5lZH0sX2dldEljb24oYSl7cmV0dXJuIGE/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2ZhY2V0cy1kaXZlL2NvbXBvbmVudHMvZmFjZXRzLWRpdmUvZmFjZXRzLWRpdmUuanMKUG9seW1lcih7aXM6ImZhY2V0cy1kaXZlIixwcm9wZXJ0aWVzOntkYXRhOnt0eXBlOkFycmF5LHZhbHVlOm51bGwsbm90aWZ5OiEwfSxmaWx0ZXJlZERhdGFJbmRpY2VzOnt0eXBlOkFycmF5LHZhbHVlOm51bGx9LF9rZXlzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxzdGF0czp7dHlwZTpPYmplY3QsdmFsdWU6e30sbm90aWZ5OiEwfSxhdGxhc1VybDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbCxub3RpZnk6ITB9LHNwcml0ZVVybDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbCxub3RpZnk6ITB9LGNyb3NzT3JpZ2luOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsLG5vdGlmeTohMH0sc3ByaXRlSW1hZ2VXaWR0aDp7dHlwZTpOdW1iZXIsdmFsdWU6NjR9LHNwcml0ZUltYWdlSGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTo2NH0sZ3JpZEZhY2V0aW5nVmVydGljYWxMYWJlbENvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZToiIzY2NjY2NiJ9LGdyaWRGYWNldGluZ0hvcml6b250YWxMYWJlbENvbG9yOnt0eXBlOlN0cmluZywKdmFsdWU6IiNkZDY2MjIifSxpdGVtUG9zaXRpb25pbmdWZXJ0aWNhbExhYmVsQ29sb3I6e3R5cGU6U3RyaW5nLHZhbHVlOiIjMjI1NWFhIn0saXRlbVBvc2l0aW9uaW5nSG9yaXpvbnRhbExhYmVsQ29sb3I6e3R5cGU6U3RyaW5nLHZhbHVlOiIjMTE4ODQ0In0sZml0R3JpZEFzcGVjdFJhdGlvVG9WaWV3cG9ydDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx2ZXJ0aWNhbEZhY2V0Ont0eXBlOlN0cmluZyx2YWx1ZToiIixub3RpZnk6ITB9LHZlcnRpY2FsQnVja2V0czp7dHlwZTpOdW1iZXIsdmFsdWU6MTAsbm90aWZ5OiEwfSx2ZXJ0aWNhbEJhZ09mV29yZHM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LGhvcml6b250YWxGYWNldDp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsbm90aWZ5OiEwfSxob3Jpem9udGFsQnVja2V0czp7dHlwZTpOdW1iZXIsdmFsdWU6MTAsbm90aWZ5OiEwfSxob3Jpem9udGFsQmFnT2ZXb3Jkczp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sCnBvc2l0aW9uTW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0YWNrZWQiLG5vdGlmeTohMH0sdmVydGljYWxQb3NpdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsbm90aWZ5OiEwfSxob3Jpem9udGFsUG9zaXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0sY29sb3JCeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsbm90aWZ5OiEwfSxpbWFnZUZpZWxkTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiIsbm90aWZ5OiEwfSxfcGFsZXR0ZTp7dHlwZTpBcnJheSx2YWx1ZTpbXX0scGFsZXR0ZUNob2ljZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0YW5kYXJkIixub3RpZnk6ITB9LHNlbGVjdGVkRGF0YTp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITB9LHNlbGVjdGVkSW5kaWNlczp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITB9LGNvbXBhcmVkRGF0YTp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITB9LGNvbXBhcmVkSW5kaWNlczp7dHlwZTpBcnJheSx2YWx1ZTpbXSwKbm90aWZ5OiEwfSxoZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbHVlOm51bGwsb2JzZXJ2ZXI6Il91cGRhdGVIZWlnaHQifSxpbmZvUmVuZGVyZXI6e3R5cGU6T2JqZWN0fSxoaWRlSW5mb0NhcmQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sc3RhYmxlQ29sb3JzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxyZWFkeSgpe2NvbnN0IGE9dGhpcy4kO2EuZml0QnV0dG9uLm9uY2xpY2s9KCk9PmEudmlzLmZpdFRvVmlld3BvcnQoKTthLnpvb21JbkJ1dHRvbi5vbmNsaWNrPSgpPT5hLnZpcy56b29tSW4oKTthLnpvb21PdXRCdXR0b24ub25jbGljaz0oKT0+YS52aXMuem9vbU91dCgpO3RoaXMuaGlkZUluZm9DYXJkJiYoYS52aXMuc3R5bGUucmlnaHQ9IjAiKTt0aGlzLl91cGRhdGVIZWlnaHQoKX0sX3VwZGF0ZUhlaWdodCgpe251bGwhPT10aGlzLmhlaWdodCYmKHRoaXMuc3R5bGUuaGVpZ2h0PSJudW1iZXIiPT09dHlwZW9mIHRoaXMuaGVpZ2h0P3RoaXMuaGVpZ2h0KyJweCI6dGhpcy5oZWlnaHQpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2ZhY2V0cy1vdmVydmlldy9jb21tb24vZmVhdHVyZV9zdGF0aXN0aWNzX2dlbmVyYXRvci5qcwpjbGFzcyB2cXtjb25zdHJ1Y3Rvcigpe3RoaXMudmFscz1bXTt0aGlzLmNvdW50cz1bXX19ZnVuY3Rpb24gd3EoYSl7Y29uc3QgYz1uZXcgQmw7YS5mb3JFYWNoKGQ9Pntjb25zdCBmPXhxKGQuZGF0YSk7Zi5zZXROYW1lKGQubmFtZSk7Yy5nZXREYXRhc2V0c0xpc3QoKS5wdXNoKGYpfSk7cmV0dXJuIGN9CmZ1bmN0aW9uIHhxKGEpe2NvbnN0IGM9e307aWYobnVsbD09YSlyZXR1cm4gbmV3IEZsO2EuZm9yRWFjaCgoZCxmKT0+e2lmKG51bGwhPWQpe3ZhciBnPU9iamVjdC5rZXlzKGQpLGw9e307Zm9yKGxldCBrPTA7azxnLmxlbmd0aDtrKyspe2NvbnN0IG49Z1trXSxwPWRbbl07bFtuXT0hMDtuIGluIGN8fChjW25dPW5ldyB2cSxjW25dLm1pc3Npbmc9ZixjW25dLmNvdW50cz1bXSk7Im51bWJlciI9PT10eXBlb2YgcHx8InN0cmluZyI9PT10eXBlb2YgcD8oY1tuXS52YWxzLnB1c2gocCksY1tuXS5jb3VudHMucHVzaCgxKSk6cCBpbnN0YW5jZW9mIEFycmF5JiYoY1tuXS5jb3VudHMucHVzaChwLmxlbmd0aCksY1tuXS52YWxzLnB1c2goLi4ucCkpfU9iamVjdC5rZXlzKGMpLmZvckVhY2goaz0+e2sgaW4gbHx8KGNba10ubWlzc2luZys9MSl9KX19KTtPYmplY3Qua2V5cyhjKS5mb3JFYWNoKGQ9PntsZXQgZj0wLGc9MCxsPSExO2NbZF0udmFscy5mb3JFYWNoKGs9Pnsic3RyaW5nIj09PQp0eXBlb2Ygaz9mKz0xOihnKz0xLGw9bHx8IXlxKGspKX0pO2NbZF0udHlwZT1nPmY/bD8xOjA6Mn0pO3JldHVybiB6cShjLGEubGVuZ3RoKX1mdW5jdGlvbiB5cShhKXtyZXR1cm4gYT09PSthJiZhPT09KGF8MCl9ZnVuY3Rpb24genEoYSxjKXtjb25zdCBkPW5ldyBGbDtkLnNldE51bUV4YW1wbGVzKGMpO2Zvcihjb25zdCBmIGluIGEpe2lmKCFhLmhhc093blByb3BlcnR5KGYpKWNvbnRpbnVlO2NvbnN0IGc9bmV3IEhsO2QuZ2V0RmVhdHVyZXNMaXN0KCkucHVzaChnKTtjb25zdCBsPWFbZl07Zy5zZXROYW1lKGYpO2cuc2V0VHlwZShsLnR5cGUpOzE9PT1sLnR5cGV8fDA9PT1sLnR5cGU/Zy5zZXROdW1TdGF0cyhBcShsLnZhbHMsbC5jb3VudHMsYyxsLm1pc3NpbmcpKToyPT09bC50eXBlJiZnLnNldFN0cmluZ1N0YXRzKEJxKGwudmFscyxsLmNvdW50cyxjLGwubWlzc2luZykpfXJldHVybiBkfQpmdW5jdGlvbiBBcShhLGMsZCxmKXtjb25zdCBnPW5ldyBObDtnLnNldENvbW1vblN0YXRzKENxKGMsZCxmKSk7bGV0IGw9MCxrPTAsbj0wO2M9YS5maWx0ZXIodD0+Im51bWJlciI9PT10eXBlb2YgdCYmIWlzTmFOKHQpKS5tYXAodD0+K3QpLnNvcnQoKHQsdik9PnQtdik7MDxjLmxlbmd0aCYmKGcuc2V0TWluKGNbMF0pLGcuc2V0TWF4KGNbYy5sZW5ndGgtMV0pLGQ9TWF0aC5mbG9vcihjLmxlbmd0aC8yKSxnLnNldE1lZGlhbigwIT09Yy5sZW5ndGglMj9jW2RdOihjW2RdK2NbZC0xXSkvMikpO2MuZm9yRWFjaCh0PT57MD09PXQmJihuKz0xKTtsKz10O2srPXQqdH0pOzE8Yy5sZW5ndGgmJmcuc2V0U3RkRGV2KE1hdGguc3FydCgoay1sKmwvYy5sZW5ndGgpLyhjLmxlbmd0aC0xKSkpO2cuc2V0TWVhbihsL2EubGVuZ3RoKTtnLnNldE51bVplcm9zKG4pO2E9Yy5maWx0ZXIodD0+SW5maW5pdHkhPT10JiYtSW5maW5pdHkhPT10KTtkPWMuZmlsdGVyKHQ9PkluZmluaXR5PT09dCkubGVuZ3RoOwpmPWMuZmlsdGVyKHQ9Pi1JbmZpbml0eT09PXQpLmxlbmd0aDt2YXIgcD1hWzBdO2NvbnN0IHE9YVthLmxlbmd0aC0xXTtwPWQzLnJhbmdlKHAscSwocS1wKS8xMCk7cD1kMy5oaXN0b2dyYW0oKS50aHJlc2hvbGRzKHApKGEpO2xldCByPWcuYWRkSGlzdG9ncmFtcygpO3Iuc2V0VHlwZSgwKTtwLmZvckVhY2godD0+e2NvbnN0IHY9ci5hZGRCdWNrZXRzKCk7di5zZXRTYW1wbGVDb3VudCh0Lmxlbmd0aCk7di5zZXRMb3dWYWx1ZSh0LngwKTt2LnNldEhpZ2hWYWx1ZSh0LngxKX0pO3A9ci5nZXRCdWNrZXRzTGlzdCgpO2MubGVuZ3RoJiYtSW5maW5pdHk9PT1jWzBdJiYocFswXS5zZXRMb3dWYWx1ZSgtSW5maW5pdHkpLHBbMF0uc2V0U2FtcGxlQ291bnQocFswXS5nZXRTYW1wbGVDb3VudCgpK2YpKTtjLmxlbmd0aCYmSW5maW5pdHk9PT1jW2MubGVuZ3RoLTFdJiYocFtwLmxlbmd0aC0xXS5zZXRIaWdoVmFsdWUoSW5maW5pdHkpLHBbcC5sZW5ndGgtMV0uc2V0U2FtcGxlQ291bnQocFtwLmxlbmd0aC0KMV0uZ2V0U2FtcGxlQ291bnQoKStkKSk7cj1nLmFkZEhpc3RvZ3JhbXMoKTtEcShyLGEpO3JldHVybiBnfWZ1bmN0aW9uIERxKGEsYyl7dmFyIGQ9WzAsMTAsMjAsMzAsNDAsNTAsNjAsNzAsODAsOTAsMTAwXTtjb25zdCBmPWQubGVuZ3RoLTE7ZD1kLm1hcChsPT5FcShjLGwpKTthLnNldFR5cGUoMSk7Y29uc3QgZz1jLmxlbmd0aC9mO2ZvcihsZXQgbD0wO2w8ZjtsKyspe2NvbnN0IGs9YS5hZGRCdWNrZXRzKCk7ay5zZXRTYW1wbGVDb3VudChnKTtrLnNldExvd1ZhbHVlKGRbbF0pO2suc2V0SGlnaFZhbHVlKGRbbCsxXSl9fWZ1bmN0aW9uIEVxKGEsYyl7aWYoMD09PWEubGVuZ3RoKXJldHVybiBOYU47Yz1jLzEwMCooYS5sZW5ndGgtMSk7Y29uc3QgZD1NYXRoLmZsb29yKGMpO3JldHVybiBkPT09Yz9hW2NdOmFbZF0rKGFbZCsxXS1hW2RdKSooYy1kKX0KZnVuY3Rpb24gQnEoYSxjLGQsZil7Y29uc3QgZz1uZXcgUGw7Zy5zZXRDb21tb25TdGF0cyhDcShjLGQsZikpO2xldCBsPTA7Y29uc3Qgaz17fTthLmZvckVhY2gocT0+e3E9U3RyaW5nKHEpO2tbcV09KGtbcV18fDApKzE7bCs9cS5sZW5ndGh9KTswPGEubGVuZ3RoJiZnLnNldEF2Z0xlbmd0aChsL2EubGVuZ3RoKTthPVtdO2Zvcih2YXIgbiBpbiBrKWsuaGFzT3duUHJvcGVydHkobikmJmEucHVzaCh7c3RyOm4sY291bnQ6a1tuXX0pO2cuc2V0VW5pcXVlKGEubGVuZ3RoKTthPWEuc29ydCgocSxyKT0+ci5jb3VudC1xLmNvdW50KTtjb25zdCBwPW5ldyBibTtnLnNldFJhbmtIaXN0b2dyYW0ocCk7YS5sZW5ndGgmJihuPWcuYWRkVG9wVmFsdWVzKCksbi5zZXRWYWx1ZShhWzBdLnN0ciksbi5zZXRGcmVxdWVuY3koYVswXS5jb3VudCkpO2EuZm9yRWFjaCgocSxyKT0+e2NvbnN0IHQ9cC5hZGRCdWNrZXRzKCk7dC5zZXRTYW1wbGVDb3VudChxLmNvdW50KTt0LnNldExvd1Jhbmsocik7CnQuc2V0SGlnaFJhbmsocik7dC5zZXRMYWJlbChxLnN0cil9KTtyZXR1cm4gZ31mdW5jdGlvbiBDcShhLGMsZCl7Y29uc3QgZj1uZXcgWWw7bGV0IGc9SW5maW5pdHksbD0wLGs9MDthLmZvckVhY2gobj0+e248ZyYmKGc9bik7bj5sJiYobD1uKTtrKz1ufSk7Zi5zZXROdW1Ob25NaXNzaW5nKGMtZCk7Zi5zZXROdW1NaXNzaW5nKGQpO2Yuc2V0TWluTnVtVmFsdWVzKGcpO2Yuc2V0TWF4TnVtVmFsdWVzKGwpOzA8YS5sZW5ndGgmJmYuc2V0QXZnTnVtVmFsdWVzKGsvYS5sZW5ndGgpO2M9bmV3IFpsO2Yuc2V0TnVtVmFsdWVzSGlzdG9ncmFtKGMpO0RxKGMsYSk7cmV0dXJuIGZ9OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2ZhY2V0cy1vdmVydmlldy9jb21tb24vdXRpbHMuanMKY2xhc3MgRnF7fWNsYXNzIEdxe2NvbnN0cnVjdG9yKGEsYyxkLGYsZyxsLGssbil7dGhpcy5oaXN0TWFwPXt9O3RoaXMubmFtZT1hO2MmJih0aGlzLmhpc3RNYXBbSHEoITEsIlN0YW5kYXJkIildPWMpO2QmJih0aGlzLmhpc3RNYXBbSHEoITAsIlN0YW5kYXJkIildPWQpO2YmJih0aGlzLmhpc3RNYXBbSHEoITEsIlF1YW50aWxlcyIpXT1mKTtnJiYodGhpcy5oaXN0TWFwW0hxKCEwLCJRdWFudGlsZXMiKV09Zyk7bCYmKHRoaXMuaGlzdE1hcFtIcSghMSwiVmFsdWUgbGlzdCBsZW5ndGgiKV09bCk7ayYmKHRoaXMuaGlzdE1hcFtIcSghMSwiRmVhdHVyZSBsaXN0IGxlbmd0aCIpXT1rKTtuJiZPYmplY3Qua2V5cyhuKS5mb3JFYWNoKHA9PnRoaXMuaGlzdE1hcFtwXT1uW3BdKX19CmNsYXNzIElxe2NvbnN0cnVjdG9yKGEsYyxkLGYpe3RoaXMubmFtZT1hO3RoaXMuc3RyaW5nVmFsdWU9Yzt0aGlzLmxvd051bVZhbHVlPWQ7dGhpcy5oaWdoTnVtVmFsdWU9Zn1jbGVhcigpe3RoaXMuaGlnaE51bVZhbHVlPXRoaXMubG93TnVtVmFsdWU9dGhpcy5zdHJpbmdWYWx1ZT10aGlzLm5hbWU9dm9pZCAwfWVxdWFscyhhKXtyZXR1cm4gYT90aGlzLm5hbWU9PT1hLm5hbWUmJnRoaXMuc3RyaW5nVmFsdWU9PT1hLnN0cmluZ1ZhbHVlJiZ0aGlzLmxvd051bVZhbHVlPT09YS5sb3dOdW1WYWx1ZSYmdGhpcy5oaWdoTnVtVmFsdWU9PT1hLmhpZ2hOdW1WYWx1ZTohMX19CmZ1bmN0aW9uIFVzKGEpe2NvbnN0IGM9VnMoYSk7aWYoMD09PWMpcmV0dXJuIDA7Y29uc3QgZD1hLnJlZHVjZSgoZixnKT0+e2c9K2cuZ2V0U2FtcGxlQ291bnQoKXx8MDtpZigwPT09ZylyZXR1cm4gZjtnLz1jO3JldHVybiBmLWcqTWF0aC5sb2coZyl9LDApO3JldHVybiAwPT09ZD8wOmQvTWF0aC5sb2coYS5sZW5ndGgpfWZ1bmN0aW9uIFdzKGEsYyl7cmV0dXJuIGlzRmluaXRlKGEpJiYtMT09PWEudG9TdHJpbmcoKS5pbmRleE9mKCJlIik/KyhNYXRoLnJvdW5kKE51bWJlcihhKyJlKyIrYykpKyJlLSIrYyk6YX1mdW5jdGlvbiBYcyhhLGMsZCl7cmV0dXJuKGE9YS5oaXN0TWFwW0hxKGMsZCldKT9hLmdldEJ1Y2tldHNMaXN0KCk6W119ZnVuY3Rpb24gSHEoYSxjKXtjPW51bGw9PWM/IlN0YW5kYXJkIjpjO2EmJihjPSJ3ZWlnaHRlZCIrYyk7cmV0dXJuIGN9CmZ1bmN0aW9uIFZzKGEpe3JldHVybiBhLm1hcChjPT5jLmdldFNhbXBsZUNvdW50KCkpLnJlZHVjZSgoYyxkKT0+KCtkfHwwKStjLDApfWZ1bmN0aW9uIFlzKGEpe3JldHVybiBhLm1hcChjPT5WcyhYcyhjLCExKSkpfWZ1bmN0aW9uIFpzKGEpe2NvbnN0IGM9W107YS5mb3JFYWNoKGQ9PntkLmZvckVhY2goZj0+e2Y9JHMoZi5nZXRMYWJlbCgpKTstMT09PWMuaW5kZXhPZihmKSYmYy5wdXNoKGYpfSl9KTtyZXR1cm4gY31mdW5jdGlvbiAkcyhhKXtyZXR1cm4gbnVsbD09YXx8IiI9PT1hPyJcdTAwYTAiOmF9ZnVuY3Rpb24gYXQoYSl7cmV0dXJuIDA9PT1hLmxlbmd0aHx8aXNOYU4oK2EpP2E6JyInK2ErJyInfWZ1bmN0aW9uIGJ0KGEpe3JldHVybiBudWxsPT1hPzA6ImluZiI9PT1hP0luZmluaXR5OiItaW5mIj09PWE/LUluZmluaXR5OithfQpmdW5jdGlvbiBjdChhKXtsZXQgYz0wO3ZhciBkPTA7Y29uc3QgZj1kdChhKTthJiZhLmdldE51bVN0YXRzKCkmJihhPWEuZ2V0TnVtU3RhdHMoKSxjKz1idChhLmdldE51bVplcm9zKCkpKTtmJiYoZD1idChmLmdldE51bU1pc3NpbmcoKSksYys9ZCxkPWJ0KGYuZ2V0TnVtTm9uTWlzc2luZygpKStkKTtyZXR1cm4gMD09PWQ/MTpjL2R9CmZ1bmN0aW9uIGV0KGEpe2NvbnN0IGM9YS5tYXAoeT0+WHMoeSwhMSkpO3ZhciBkPW51bGw7Zm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspaWYoMDxjW2ZdLmxlbmd0aCl7ZD1jW2ZdWzBdO2JyZWFrfWlmKCFkKXJldHVybiAwO2Y9WXMoYSk7Zm9yKHZhciBnPTA7ZzxmLmxlbmd0aDtnKyspaWYoMD09PWZbZ10pcmV0dXJuIEluZmluaXR5O2c9MDtpZihkIGluc3RhbmNlb2YgZG0pe2Q9WnMoYyk7Zm9yKHZhciBsPTE7bDxhLmxlbmd0aDtsKyspe3ZhciBrPWNbMF0sbj1jW2xdLHA9MDtmb3IodmFyIHE9MDtxPGQubGVuZ3RoO3ErKyl7dmFyIHI9ZFtxXSx0PTA7bGV0IHk9MDtmb3IodmFyIHY9MDt2PGsubGVuZ3RoO3YrKylpZihrW3ZdLmdldExhYmVsKCk9PT1yKXt0PWtbdl0uZ2V0U2FtcGxlQ291bnQoKT9rW3ZdLmdldFNhbXBsZUNvdW50KCk6MDticmVha31mb3Iodj0wO3Y8bi5sZW5ndGg7disrKWlmKG5bdl0uZ2V0TGFiZWwoKT09PXIpe3k9blt2XS5nZXRTYW1wbGVDb3VudCgpPwpuW3ZdLmdldFNhbXBsZUNvdW50KCk6MDticmVha31wPWZ0KHAsdCxmWzBdLHksZltsXSl9Zz1NYXRoLm1heChnLHApfX1lbHNlIGZvcihkPTE7ZDxhLmxlbmd0aDtkKyspe2w9Y1swXTtrPWNbZF07bj0wO3A9TWF0aC5tYXgobC5sZW5ndGgsay5sZW5ndGgpO2ZvcihxPTA7cTxwO3ErKylyPXE8bC5sZW5ndGgmJmxbcV0uZ2V0U2FtcGxlQ291bnQoKT9sW3FdLmdldFNhbXBsZUNvdW50KCk6MCx0PXE8ay5sZW5ndGgmJmtbcV0uZ2V0U2FtcGxlQ291bnQoKT9rW3FdLmdldFNhbXBsZUNvdW50KCk6MCxuPWZ0KG4scixmWzBdLHQsZltkXSk7Zz1NYXRoLm1heChnLG4pfXJldHVybiBnfWZ1bmN0aW9uIGZ0KGEsYyxkLGYsZyl7Y29uc3QgbD1jL2QtZi9nO2M9Yy8oZCpkKStmLyhnKmcpO3JldHVybiBhKyhjP2wqbC9jOjApfWZ1bmN0aW9uIGd0KGEsYyl7cmV0dXJuIGM9PT1hP2MudG9Mb2NhbGVTdHJpbmcoKTphLnRvTG9jYWxlU3RyaW5nKCkrIi8iK2MudG9Mb2NhbGVTdHJpbmcoKX0KZnVuY3Rpb24gaHQoYSl7cmV0dXJuIG51bGwhPWEuZ2V0TnVtU3RhdHMoKX0KZnVuY3Rpb24gaXQoYSl7YS5nZXREYXRhc2V0c0xpc3QoKS5mb3JFYWNoKGM9PntjLmdldEZlYXR1cmVzTGlzdCgpLmZvckVhY2goZD0+e3ZhciBmPWQuZ2V0UGF0aCgpO251bGwhPWYmJihmPWYuZ2V0U3RlcExpc3QoKSxudWxsIT1mJiZkLnNldE5hbWUoZi5qb2luKCIvIikpKTtmPVtdO2lmKGQuZ2V0U3RyaW5nU3RhdHMoKSl7Y29uc3QgZz1kLmdldFN0cmluZ1N0YXRzKCkuZ2V0UmFua0hpc3RvZ3JhbSgpO2cmJmYucHVzaChnKTsoZD1kLmdldFN0cmluZ1N0YXRzKCkuZ2V0VG9wVmFsdWVzTGlzdCgpKSYmZC5mb3JFYWNoKGw9Pntjb25zdCBrPWwuZ2V0RGVwcmVjYXRlZEZyZXEoKTtrJiYhbC5nZXRGcmVxdWVuY3koKSYmbC5zZXRGcmVxdWVuY3koayl9KX1lbHNlIGQuZ2V0TnVtU3RhdHMoKSYmKGQ9ZC5nZXROdW1TdGF0cygpLmdldEhpc3RvZ3JhbXNMaXN0KCkpJiYoZj1mLmNvbmNhdChkKSk7Zi5mb3JFYWNoKGc9PnsoZz1nLmdldEJ1Y2tldHNMaXN0KCkpJiZnLmZvckVhY2gobD0+Cntjb25zdCBrPWwuZ2V0RGVwcmVjYXRlZENvdW50KCk7ayYmIWwuZ2V0U2FtcGxlQ291bnQoKSYmbC5zZXRTYW1wbGVDb3VudChrKX0pfSl9KX0pO3JldHVybiBhfQpmdW5jdGlvbiBqdChhKXtsZXQgYz0hMDthLmdldERhdGFzZXRzTGlzdCgpLmZvckVhY2goZD0+e2QuZ2V0RmVhdHVyZXNMaXN0KCkuZm9yRWFjaChmPT57bGV0IGc9W107aWYoZi5nZXRTdHJpbmdTdGF0cygpKXtjb25zdCBsPWYuZ2V0U3RyaW5nU3RhdHMoKS5nZXRSYW5rSGlzdG9ncmFtKCk7bCYmZy5wdXNoKGwpOyhmPWYuZ2V0U3RyaW5nU3RhdHMoKS5nZXRUb3BWYWx1ZXNMaXN0KCkpJiZmLmZvckVhY2goaz0+e2suZ2V0RGVwcmVjYXRlZEZyZXEoKSYmIWsuZ2V0RnJlcXVlbmN5KCkmJihjPSExKX0pfWVsc2UgZi5nZXROdW1TdGF0cygpJiYoZj1mLmdldE51bVN0YXRzKCkuZ2V0SGlzdG9ncmFtc0xpc3QoKSkmJihnPWcuY29uY2F0KGYpKTtnLmZvckVhY2gobD0+eyhsPWwuZ2V0QnVja2V0c0xpc3QoKSkmJmwuZm9yRWFjaChrPT57ay5nZXREZXByZWNhdGVkQ291bnQoKSYmIWsuZ2V0U2FtcGxlQ291bnQoKSYmKGM9ITEpfSl9KX0pfSk7cmV0dXJuIGN9CmZ1bmN0aW9uIGt0KGEpe2ZvcihsZXQgYz0wO2M8YS5nZXREYXRhc2V0c0xpc3QoKS5sZW5ndGg7YysrKXtjb25zdCBkPWEuZ2V0RGF0YXNldHNMaXN0KClbY107Zm9yKGxldCBmPTA7ZjxkLmdldEZlYXR1cmVzTGlzdCgpLmxlbmd0aDtmKyspe2NvbnN0IGc9ZC5nZXRGZWF0dXJlc0xpc3QoKVtmXTtpZihnLmdldFN0cmluZ1N0YXRzKCkpe2lmKGcuZ2V0U3RyaW5nU3RhdHMoKS5nZXRXZWlnaHRlZFN0cmluZ1N0YXRzKCkpcmV0dXJuITB9ZWxzZSBpZihnLmdldE51bVN0YXRzKCkmJmcuZ2V0TnVtU3RhdHMoKS5nZXRXZWlnaHRlZE51bWVyaWNTdGF0cygpKXJldHVybiEwfX1yZXR1cm4hMX0KZnVuY3Rpb24gbHQoYSl7Zm9yKGxldCBjPTA7YzxhLmdldERhdGFzZXRzTGlzdCgpLmxlbmd0aDtjKyspe2NvbnN0IGQ9YS5nZXREYXRhc2V0c0xpc3QoKVtjXTtmb3IobGV0IGY9MDtmPGQuZ2V0RmVhdHVyZXNMaXN0KCkubGVuZ3RoO2YrKyl7Y29uc3QgZz1kLmdldEZlYXR1cmVzTGlzdCgpW2ZdLmdldEN1c3RvbVN0YXRzTGlzdCgpO2lmKG51bGwhPWcmJjA8Zy5sZW5ndGgpcmV0dXJuITB9fXJldHVybiExfWZ1bmN0aW9uIG10KGEpe2ZvcihsZXQgZD0wO2Q8YS5nZXREYXRhc2V0c0xpc3QoKS5sZW5ndGg7ZCsrKXtjb25zdCBmPWEuZ2V0RGF0YXNldHNMaXN0KClbZF07Zm9yKGxldCBnPTA7ZzxmLmdldEZlYXR1cmVzTGlzdCgpLmxlbmd0aDtnKyspe3ZhciBjPWYuZ2V0RmVhdHVyZXNMaXN0KClbZ107aWYoKGM9ZHQoYykpJiZjLmdldEZlYXR1cmVMaXN0TGVuZ3RoSGlzdG9ncmFtKCkpcmV0dXJuITB9fXJldHVybiExfQpmdW5jdGlvbiBudChhKXtpZighYSlyZXR1cm4hMTtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKylpZihhW2NdLmhpc3RNYXBbSHEoITAsIlN0YW5kYXJkIildKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIG90KGEpe2lmKCFhKXJldHVybiExO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKWlmKGFbY10uaGlzdE1hcC5RdWFudGlsZXMpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gcHQoYSl7aWYoIWEpcmV0dXJuITE7Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspaWYoYVtjXS5oaXN0TWFwWyJWYWx1ZSBsaXN0IGxlbmd0aCJdKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIHF0KGEpe3JldHVybiBhP2EuZ2V0TnVtTm9uTWlzc2luZygpKmEuZ2V0QXZnTnVtVmFsdWVzKCk6MH0KZnVuY3Rpb24gcnQoYSl7c3dpdGNoKGEpe2Nhc2UgMDpyZXR1cm4iaW50IjtjYXNlIDE6cmV0dXJuImZpeGVkLWxlbmd0aCBpbnRzIjtjYXNlIDI6cmV0dXJuInZhcmlhYmxlLWxlbmd0aCBpbnRzIjtjYXNlIDM6cmV0dXJuImZsb2F0IjtjYXNlIDQ6cmV0dXJuImZpeGVkLWxlbmd0aCBmbG9hdHMiO2Nhc2UgNTpyZXR1cm4idmFyaWFibGUtbGVuZ3RoIGZsb2F0cyI7Y2FzZSA2OnJldHVybiJzdHJpbmciO2Nhc2UgNzpyZXR1cm4iZml4ZWQtbGVuZ3RoIHN0cmluZ3MiO2Nhc2UgODpyZXR1cm4idmFyaWFibGUtbGVuZ3RoIHN0cmluZ3MiO2Nhc2UgOTpyZXR1cm4iYnl0ZXMiO2Nhc2UgMTA6cmV0dXJuImZpeGVkLWxlbmd0aCBieXRlcyI7Y2FzZSAxMTpyZXR1cm4idmFyaWFibGUtbGVuZ3RoIGJ5dGVzIjtjYXNlIDEyOnJldHVybiJzdHJ1Y3QiO2Nhc2UgMTM6cmV0dXJuImZpeGVkLWxlbmd0aCBzdHJ1Y3QiO2Nhc2UgMTQ6cmV0dXJuInZhcmlhYmxlLWxlbmd0aCBzdHJ1Y3QiO2RlZmF1bHQ6cmV0dXJuInVua25vd24ifX0KZnVuY3Rpb24gc3QoYSxjKXtyZXR1cm4gMTU9PT1hP2M6MTY8PWF8fDE1PT09Yz9hOjM8PWEmJjU+PWEmJjM8PWMmJjU+PWN8fDA8PWEmJjI+PWEmJjA8PWMmJjI+PWN8fDY8PWEmJjg+PWEmJjY8PWMmJjg+PWN8fDk8PWEmJjExPj1hJiY5PD1jJiYxMT49Y3x8MTI8PWEmJjE0Pj1hJiYxMjw9YyYmMTQ+PWM/TWF0aC5tYXgoYSxjKToxNn1mdW5jdGlvbiB0dChhLGMpe3ZhciBkPTE1O2lmKG51bGwhPWMmJjAhPT1jLmdldE51bU5vbk1pc3NpbmcoKSl7bGV0IGY9ZD0hMTtjLmdldE1pbk51bVZhbHVlcygpPT09Yy5nZXRNYXhOdW1WYWx1ZXMoKSYmKDE9PT1jLmdldE1pbk51bVZhbHVlcygpP2Q9ITA6Zj0hMCk7ZD0xPT09YT9kPzM6Zj80OjU6MD09PWE/ZD8wOmY/MToyOjI9PT1hP2Q/NjpmPzc6ODozPT09YT9kPzk6Zj8xMDoxMTpkPzEyOmY/MTM6MTR9cmV0dXJuIGR9Y2xhc3MgdXR7fWNsYXNzIHZ0e31jbGFzcyB3dHt9CmZ1bmN0aW9uIHh0KGEpe2xldCBjPTAsZD0wO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWFbZl0ucmF3QnVja2V0cy5sZW5ndGg+YyYmKGM9YVtmXS5yYXdCdWNrZXRzLmxlbmd0aCxkPWYpO2Y9W107Zm9yKGxldCBnPTA7ZzxjO2crKyl7Y29uc3QgbD1uZXcgd3Q7bC52YWx1ZT1hW2RdLnJhd0J1Y2tldHNbZ10uZ2V0TGFiZWwoKTtsLmNvdW50cz1bXTtmb3IobGV0IGs9MDtrPGEubGVuZ3RoO2srKylhW2tdLnJhd0J1Y2tldHMubGVuZ3RoPD1nP2wuY291bnRzLnB1c2goMCk6bC5jb3VudHMucHVzaChhW2tdLnJhd0J1Y2tldHNbZ10uZ2V0U2FtcGxlQ291bnQoKSk7Zi5wdXNoKGwpfXJldHVybiBmfQpmdW5jdGlvbiB5dChhLGMpe2NvbnN0IGQ9W107Zm9yKGxldCBmPTA7ZjxjLmxlbmd0aDtmKyspe2NvbnN0IGc9bmV3IHd0LGw9Y1tmXTtnLnZhbHVlPWw7Zy5jb3VudHM9W107Zm9yKGxldCBrPTA7azxhLmxlbmd0aDtrKyspe2NvbnN0IG49YVtrXS5yYXdCdWNrZXRzO2xldCBwPS0xO2ZvcihsZXQgcT0wO3E8bi5sZW5ndGg7cSsrKWlmKG5bcV0uZ2V0TGFiZWwoKT09PWwpe3A9cTticmVha30tMT09PXA/Zy5jb3VudHMucHVzaCgwKTpnLmNvdW50cy5wdXNoKG5bcF0uZ2V0U2FtcGxlQ291bnQoKSl9ZC5wdXNoKGcpfXJldHVybiBkfXZhciB6dDsoZnVuY3Rpb24oYSl7YVthLkhJU1RPR1JBTT0wXT0iSElTVE9HUkFNIjthW2EuQkFSX0NIQVJUPTFdPSJCQVJfQ0hBUlQiO2FbYS5DVU1ESVNUX0NIQVJUPTJdPSJDVU1ESVNUX0NIQVJUIn0pKHp0fHwoenQ9e30pKTsKZnVuY3Rpb24gQXQoYSl7cmV0dXJuIlF1YW50aWxlcyI9PT1hfHwiVmFsdWUgbGlzdCBsZW5ndGgiPT09YXx8IkZlYXR1cmUgbGlzdCBsZW5ndGgiPT09YX1mdW5jdGlvbiBCdChhLGMsZCl7bGV0IGY9ITAsZz0wO2EuZm9yRWFjaChsPT57bC5oaXN0TWFwW2NdJiYobD1sLmhpc3RNYXBbY10uZ2V0QnVja2V0c0xpc3QoKSxnPU1hdGgubWF4KGcsbC5sZW5ndGgpLGwuZm9yRWFjaChrPT57ay5nZXRMb3dWYWx1ZXx8KGY9ITEpfSkpfSk7cmV0dXJuIGY/enQuSElTVE9HUkFNOmc+ZD96dC5DVU1ESVNUX0NIQVJUOnp0LkJBUl9DSEFSVH0KY2xhc3MgQ3R7Y29uc3RydWN0b3IoYSxjLGQpe3RoaXMuc3RyPWE7dGhpcy5jc3NDbGFzcz1jO3RoaXMuZnVsbFN0cj1kO3RoaXMuZnVsbFN0cnx8KHRoaXMuZnVsbFN0cj1hKX1hcHBlbmQoYSxjKXtjJiYodGhpcy5zdHIrPWMsdGhpcy5mdWxsU3RyKz1jKTt0aGlzLnN0cis9YS5zdHI7dGhpcy5mdWxsU3RyKz1hLmZ1bGxTdHI7dGhpcy5jc3NDbGFzcys9YS5jc3NDbGFzc319ZnVuY3Rpb24gRHQoYSl7Y29uc3QgYz1NYXRoLmFicyhhKTtyZXR1cm4oLjAxPmMmJjA8Y3x8MUU0PGMpJiZpc0Zpbml0ZShhKT9kMy5mb3JtYXQoIi4zcyIpKGEpLnJlcGxhY2UoL0ckLywiQiIpOmEudG9Mb2NhbGVTdHJpbmcoKX1mdW5jdGlvbiBFdChhLGMpe2NvbnN0IGQ9RHQoV3MoYnQoYSksMUU2PE1hdGguYWJzKGEpPzA6MikpO2M9RnQoYSxjLHZvaWQgMCk7cmV0dXJuIG5ldyBDdChkLGMsYS50b0xvY2FsZVN0cmluZyhbXSx7bWF4aW11bUZyYWN0aW9uRGlnaXRzOjl9KSl9CmZ1bmN0aW9uIEd0KGEsYyxkKXthPWJ0KGEpO2E9bnVsbCE9YSYmYz9hL2M6MDtjPS45OTk5OTk8YSYmMT5hPyJ+MTAwJSI6MUUtNj5hJiYwPGE/In4wJSI6V3MoMTAwKmEsMikrIiUiO2Q9RnQoYSwhMSxkKTtyZXR1cm4gbmV3IEN0KGMsZCwxMDAqYSsiJSIpfWZ1bmN0aW9uIEh0KGEsYyxkKXtjb25zdCBmPUR0KGEpO2M9RnQoYSxjLGQpO3JldHVybiBuZXcgQ3QoZixjLGEudG9Mb2NhbGVTdHJpbmcoKSl9ZnVuY3Rpb24gSXQoYSxjKXthPWF0KCRzKGEpKTtjPUZ0KGEsYyx2b2lkIDApO3JldHVybiBuZXcgQ3QoYSxjKX1mdW5jdGlvbiBGdChhLGMsZCl7Yz1jPyJkYXRhLXdlaWdodGVkICI6IiI7aWYoZCYmZChhKXx8Im51bWJlciI9PT10eXBlb2YgYSYmIWlzRmluaXRlKGEpKWMrPSJkYXRhLWVycm9yICI7cmV0dXJuIGN9CmZ1bmN0aW9uIEp0KGEsYyxkKXtjb25zdCBmPVtdO2YucHVzaChJdCgiY291bnQiKSk7Zi5wdXNoKEl0KCJtaXNzaW5nIikpO2E/KGYucHVzaChJdCgibWVhbiIsYykpLGYucHVzaChJdCgic3RkIGRldiIsYykpLGYucHVzaChJdCgiemVyb3MiKSksZi5wdXNoKEl0KCJtaW4iKSksZi5wdXNoKEl0KCJtZWRpYW4iLGMpKSxmLnB1c2goSXQoIm1heCIpKSk6KGYucHVzaChJdCgidW5pcXVlIikpLGYucHVzaChJdCgidG9wIixjKSksZi5wdXNoKEl0KCJmcmVxIHRvcCIsYykpLGYucHVzaChJdCgiYXZnIHN0ciBsZW4iKSkpO2QmJmYucHVzaChuZXcgQ3QoImN1c3RvbSIsImRhdGEtY3VzdG9tICIpKTtyZXR1cm4gZn0KZnVuY3Rpb24gZHQoYSl7cmV0dXJuIGE/YS5nZXROdW1TdGF0cygpP2EuZ2V0TnVtU3RhdHMoKS5nZXRDb21tb25TdGF0cygpOmEuZ2V0U3RyaW5nU3RhdHMoKT9hLmdldFN0cmluZ1N0YXRzKCkuZ2V0Q29tbW9uU3RhdHMoKTphLmdldEJ5dGVzU3RhdHMoKT9hLmdldEJ5dGVzU3RhdHMoKS5nZXRDb21tb25TdGF0cygpOmEuZ2V0U3RydWN0U3RhdHMoKT9hLmdldFN0cnVjdFN0YXRzKCkuZ2V0Q29tbW9uU3RhdHMoKTpudWxsOm51bGx9ZnVuY3Rpb24gS3QoYSl7Y29uc3QgYz1bXTthPyhjLnB1c2goSHQoYS5nZXROdW1Ob25NaXNzaW5nKCksITEsZD0+MD49ZCkpLGMucHVzaChHdChhLmdldE51bU1pc3NpbmcoKSxidChhLmdldE51bU5vbk1pc3NpbmcoKSkrYnQoYS5nZXROdW1NaXNzaW5nKCkpLGQ9Pi4wMjxkKSkpOihjLnB1c2goSHQoMCwhMSxkPT4wPj1kKSksYy5wdXNoKEd0KDEsMSxkPT4uMDI8ZCkpKTtyZXR1cm4gY30KZnVuY3Rpb24gTHQoYSxjLGQpe2NvbnN0IGY9W107aWYoYSkoZD1kP2EuZ2V0V2VpZ2h0ZWROdW1lcmljU3RhdHMoKTpudWxsKT8oZi5wdXNoKEV0KGQuZ2V0TWVhbigpLCEwKSksZi5wdXNoKEV0KGQuZ2V0U3RkRGV2KCksITApKSk6KGYucHVzaChFdChhLmdldE1lYW4oKSkpLGYucHVzaChFdChhLmdldFN0ZERldigpKSkpLGYucHVzaChHdChhLmdldE51bVplcm9zKCkscXQoYyksZz0+LjE8ZykpLGM9TXQoYSksZi5wdXNoKEV0KGM/TmFOOmEuZ2V0TWluKCkpKSxkP2YucHVzaChFdChkLmdldE1lZGlhbigpLCEwKSk6Zi5wdXNoKEV0KGEuZ2V0TWVkaWFuKCkpKSxmLnB1c2goRXQoYz9OYU46YS5nZXRNYXgoKSkpO2Vsc2UgZm9yKGE9MDs2PmE7YSsrKWYucHVzaChJdCgiLSIpKTtyZXR1cm4gZn0KZnVuY3Rpb24gTXQoYSl7aWYoIWEpcmV0dXJuITE7YT1hLmdldEhpc3RvZ3JhbXNMaXN0KCk7Zm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspaWYoMDxhW2NdLmdldE51bU5hbigpKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIE50KGEsYyl7Y29uc3QgZD1bXTtpZihhKXtjPWM/YS5nZXRXZWlnaHRlZFN0cmluZ1N0YXRzKCk6bnVsbDtkLnB1c2goSHQoYS5nZXRVbmlxdWUoKSkpO2NvbnN0IGY9Yz9jLmdldFRvcFZhbHVlc0xpc3QoKTphLmdldFRvcFZhbHVlc0xpc3QoKTtmJiYwPGYubGVuZ3RoPyhkLnB1c2goSXQoZlswXS5nZXRWYWx1ZSgpLCEhYykpLGQucHVzaChFdChmWzBdLmdldEZyZXF1ZW5jeSgpLCEhYykpKTooZC5wdXNoKEl0KCItIikpLGQucHVzaChJdCgiLSIpKSk7ZC5wdXNoKEV0KGEuZ2V0QXZnTGVuZ3RoKCkpKX1lbHNlIGZvcihhPTA7ND5hO2ErKylkLnB1c2goSXQoIi0iKSk7cmV0dXJuIGR9CmZ1bmN0aW9uIE90KGEpe2NvbnN0IGM9W107aWYoYSljLnB1c2goSHQoYS5nZXRVbmlxdWUoKSkpLGMucHVzaChJdCgiLSIpKSxjLnB1c2goSXQoIi0iKSksYy5wdXNoKEV0KGEuZ2V0QXZnTnVtQnl0ZXMoKSkpO2Vsc2UgZm9yKGE9MDs0PmE7YSsrKWMucHVzaChJdCgiLSIpKTtyZXR1cm4gY31mdW5jdGlvbiBQdChhKXtjb25zdCBjPVtdO2lmKGEmJjA8YS5sZW5ndGgpe2NvbnN0IGQ9bmV3IEN0KCIiLCJkYXRhLWN1c3RvbSAiKTthLmZvckVhY2goZj0+e2lmKCFmLmdldEhpc3RvZ3JhbSgpJiYhZi5nZXRSYW5rSGlzdG9ncmFtKCkpe3ZhciBnPWYuZ2V0TmFtZSgpOyIiIT09ZC5zdHImJihnPSJcbiIrZyk7ZC5hcHBlbmQoSXQoZykpO2YuZ2V0U3RyKCk/ZC5hcHBlbmQoSXQoZi5nZXRTdHIoKSksIjogIik6ZC5hcHBlbmQoRXQoZi5nZXROdW0oKSksIjogIil9fSk7Yy5wdXNoKGQpfWVsc2UgYy5wdXNoKG5ldyBDdCgiLSIsImRhdGEtY3VzdG9tICIpKTtyZXR1cm4gY30KZnVuY3Rpb24gUXQoYSxjLGQpe2lmKCFhKXJldHVybltdO2NvbnN0IGY9ZHQoYSk7bGV0IGc9S3QoZik7Zz1hLmdldE51bVN0YXRzKCk/Zy5jb25jYXQoTHQoYS5nZXROdW1TdGF0cygpLGYsYykpOmEuZ2V0U3RyaW5nU3RhdHMoKT9nLmNvbmNhdChOdChhLmdldFN0cmluZ1N0YXRzKCksYykpOmcuY29uY2F0KE90KGEuZ2V0Qnl0ZXNTdGF0cygpKSk7ZCYmKGc9Zy5jb25jYXQoUHQoYS5nZXRDdXN0b21TdGF0c0xpc3QoKSkpKTtyZXR1cm4gZ30KZnVuY3Rpb24gUnQoYSl7Y29uc3QgYz1hLm1hcCgoKT0+MCk7YS5mb3JFYWNoKChkLGYpPT57ZC5mb3JFYWNoKGc9PntjW2ZdKz1idChnLmdldFNhbXBsZUNvdW50KCkpfSl9KTtyZXR1cm4gYS5tYXAoKGQsZik9PmQubWFwKGc9PntpZihnIGluc3RhbmNlb2YgYW0pe3ZhciBsPW5ldyBhbTtsLnNldFNhbXBsZUNvdW50KGcuZ2V0U2FtcGxlQ291bnQoKS9jW2ZdKTtsLnNldExvd1ZhbHVlKGcuZ2V0TG93VmFsdWUoKSk7bC5zZXRIaWdoVmFsdWUoZy5nZXRIaWdoVmFsdWUoKSk7cmV0dXJuIGx9bD1uZXcgZG07bC5zZXRTYW1wbGVDb3VudChnLmdldFNhbXBsZUNvdW50KCkvY1tmXSk7bC5zZXRMb3dSYW5rKGcuZ2V0TG93UmFuaygpKTtsLnNldEhpZ2hSYW5rKGcuZ2V0SGlnaFJhbmsoKSk7bC5zZXRMYWJlbChnLmdldExhYmVsKCkpO3JldHVybiBsfSkpfTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9mYWNldHMtb3ZlcnZpZXcvY29tbW9uL292ZXJ2aWV3X2RhdGFfbW9kZWwuanMKY2xhc3MgU3R7Y29uc3RydWN0b3IoYSl7dGhpcy5kYXRhPWE7dGhpcy5jb2xvclNjYWxlPW5ldyBQbG90dGFibGUuU2NhbGVzLkNvbG9yO3RoaXMuY29sb3JTY2FsZS5kb21haW4oYS5nZXREYXRhc2V0c0xpc3QoKS5tYXAoYz0+Yy5nZXROYW1lKCkpKTt0aGlzLmNvbG9yU2NhbGUucmFuZ2UoIiM0Mjg1RjQgI0YwOTMwMCAjMEY5RDU4ICM5QzI3QjAgIzYwN0Q4QiAjMEI4MDQzICM3NTc1NzUiLnNwbGl0KCIgIikpO2lmKCFqdChhKSl0aHJvdyBFcnJvcigiaW5wdXQgcHJvdG8gaGFzIG5vdCBiZWVuIGNsZWFuZWQiKTt0aGlzLmZlYXR1cmVzQnlTcGVjPXRoaXMubWFrZUZlYXR1cmVCeVNwZWNMaXN0KCl9bWFrZUZlYXR1cmVCeVNwZWNMaXN0KCl7Y29uc3QgYT1bXTtmb3IobGV0IGM9MDsxNj5jO2MrKylhW2NdPVtdO3RoaXMuZ2V0VW5pcXVlRmVhdHVyZXMoKS5mb3JFYWNoKGM9Pntjb25zdCBkPXRoaXMuZ2V0RmVhdHVyZVNwZWNGb3JGZWF0dXJlKGMuZ2V0TmFtZSgpKTthW2RdLnB1c2goYy5nZXROYW1lKCkpfSk7CnJldHVybiBhfWdldE5vbkVtcHR5RmVhdHVyZVNwZWNMaXN0cygpe2NvbnN0IGE9W107Zm9yKGxldCBjPTA7MTY+YztjKyspaWYoMCE9PXRoaXMuZmVhdHVyZXNCeVNwZWNbY10ubGVuZ3RoKXtjb25zdCBkPW5ldyB1dDtkLmZlYXR1cmVzPXRoaXMuZmVhdHVyZXNCeVNwZWNbY107ZC5zcGVjPWM7YS5wdXNoKGQpfXJldHVybiBhfWdldEZlYXR1cmVTcGVjRm9yRmVhdHVyZShhKXtjb25zdCBjPXRoaXMuZ2V0RGF0YXNldE5hbWVzKCk7bGV0IGQ9MTU7Zm9yKGxldCBnPTA7ZzxjLmxlbmd0aDtnKyspe3ZhciBmPXRoaXMuZ2V0RmVhdHVyZShhLGNbZ10pO2Y9bnVsbD09Zj8xNTp0dChmLmdldFR5cGUoKSx0aGlzLmdldEZlYXR1cmVDb21tb25TdGF0cyhhLGNbZ10pKTtkPXN0KGQsZil9MTY9PT1kJiYoZD0xNSk7cmV0dXJuIGR9Z2V0RGF0YXNldEZlYXR1cmVTdGF0aXN0aWNzKCl7cmV0dXJuIHRoaXMuZGF0YX1nZXRDb2xvclNjYWxlKCl7cmV0dXJuIHRoaXMuY29sb3JTY2FsZX1nZXREYXRhc2V0TmFtZXMoKXtyZXR1cm4gdGhpcy5kYXRhPwp0aGlzLmRhdGEuZ2V0RGF0YXNldHNMaXN0KCkubWFwKGE9PmEuZ2V0TmFtZSgpKTpbXX1nZXREYXRhc2V0KGEpe2lmKCF0aGlzLmRhdGEpcmV0dXJuIG51bGw7Zm9yKGNvbnN0IGMgb2YgdGhpcy5kYXRhLmdldERhdGFzZXRzTGlzdCgpKWlmKGMuZ2V0TmFtZSgpPT09YSlyZXR1cm4gYztyZXR1cm4gbnVsbH1nZXRGZWF0dXJlKGEsYyl7aWYoIWF8fCF0aGlzLmRhdGEpcmV0dXJuIG51bGw7Yz10aGlzLmdldERhdGFzZXQoYyk7aWYoIWMpcmV0dXJuIG51bGw7Zm9yKGNvbnN0IGQgb2YgYy5nZXRGZWF0dXJlc0xpc3QoKSlpZihkLmdldE5hbWUoKT09PWEpcmV0dXJuIGQ7cmV0dXJuIG51bGx9Z2V0RXh0cmFIaXN0b2dyYW1OYW1lcyhhKXtpZighdGhpcy5kYXRhKXJldHVybltdO2E9YS5tYXAoZD0+ZC5nZXROYW1lKCkpO2NvbnN0IGM9e307Zm9yKGNvbnN0IGQgb2YgdGhpcy5kYXRhLmdldERhdGFzZXRzTGlzdCgpKWZvcihjb25zdCBmIG9mIGQuZ2V0RmVhdHVyZXNMaXN0KCkpaWYoLTEhPT0KYS5pbmRleE9mKGYuZ2V0TmFtZSgpKSYmKGYuZ2V0Q3VzdG9tU3RhdHNMaXN0KCkmJmYuZ2V0Q3VzdG9tU3RhdHNMaXN0KCkuZm9yRWFjaChnPT57aWYoZy5nZXRIaXN0b2dyYW0oKXx8Zy5nZXRSYW5rSGlzdG9ncmFtKCkpY1tnLmdldE5hbWUoKV09ITB9KSxmLmdldE51bVN0YXRzKCkpKXtjb25zdCBnPWYuZ2V0TnVtU3RhdHMoKS5nZXRIaXN0b2dyYW1zTGlzdCgpO2lmKGcpZm9yKGxldCBsPTA7bDxnLmxlbmd0aDtsKyspe2NvbnN0IGs9Z1tsXTtrLmdldE5hbWUoKSYmKGNbay5nZXROYW1lKCldPSEwKX19cmV0dXJuIE9iamVjdC5rZXlzKGMpfWdldEZlYXR1cmVDb21tb25TdGF0cyhhLGMpe2E9dGhpcy5nZXRGZWF0dXJlKGEsYyk7cmV0dXJuIG51bGw9PWE/bnVsbDpkdChhKX1nZXRGZWF0dXJlTmFtZXMoYSl7cmV0dXJuIGEmJnRoaXMuZGF0YT8oYT10aGlzLmdldERhdGFzZXQoYSkpP2EuZ2V0RmVhdHVyZXNMaXN0KCkubWFwKGM9PmMuZ2V0TmFtZSgpKTpbXTpudWxsfWdldEZlYXR1cmVJbmRleChhLApjKXtpZighdGhpcy5kYXRhKXJldHVybiBudWxsO2E9dGhpcy5nZXREYXRhc2V0KGEpO2lmKCFhKXJldHVybiBudWxsO2xldCBkPTA7Zm9yKGNvbnN0IGYgb2YgYS5nZXRGZWF0dXJlc0xpc3QoKSl7aWYoZi5nZXROYW1lKCk9PT1jKXJldHVybiBkOysrZH1yZXR1cm4gbnVsbH1nZXRVbmlxdWVGZWF0dXJlcygpe2lmKCF0aGlzLmRhdGEpcmV0dXJuW107Y29uc3QgYT17fTtmb3IoY29uc3QgYyBvZiB0aGlzLmRhdGEuZ2V0RGF0YXNldHNMaXN0KCkpZm9yKGNvbnN0IGQgb2YgYy5nZXRGZWF0dXJlc0xpc3QoKSlhW2QuZ2V0TmFtZSgpXT1kO3JldHVybiBPYmplY3Qua2V5cyhhKS5tYXAoYz0+YVtjXSl9Z2V0TnVtVW5pcXVlRmVhdHVyZXNCeVR5cGUoYSl7cmV0dXJuIHRoaXMuZ2V0VW5pcXVlRmVhdHVyZXMoKS5maWx0ZXIoYz0+aHQoYyk9PT1hKS5sZW5ndGh9ZmVhdHVyZUhhc1NpbmdsZVZhbHVlKGEpe2lmKCFhKXJldHVybiExO2lmKGEuZ2V0U3RyaW5nU3RhdHMoKSl7dmFyIGM9YS5nZXRTdHJpbmdTdGF0cygpLmdldFVuaXF1ZSgpOwpyZXR1cm4gMT09PWJ0KGMpfXJldHVybiBhLmdldEJ5dGVzU3RhdHMoKT8oYz1hLmdldEJ5dGVzU3RhdHMoKS5nZXRVbmlxdWUoKSwxPT09YnQoYykpOmEuZ2V0TnVtU3RhdHMoKT8oYz1hLmdldE51bVN0YXRzKCkuZ2V0TWluKCksYT1hLmdldE51bVN0YXRzKCkuZ2V0TWF4KCksbnVsbD09YyYmbnVsbD09YT8hMTpidChjKT09PWJ0KGEpKTohMX1mZWF0dXJlQWNyb3NzQWxsRGF0YXNldHNIYXNTaW5nbGVWYWx1ZShhKXtpZighYXx8IXRoaXMuZGF0YSlyZXR1cm4hMTtmb3IoY29uc3QgYyBvZiB0aGlzLmRhdGEuZ2V0RGF0YXNldHNMaXN0KCkpZm9yKGNvbnN0IGQgb2YgYy5nZXRGZWF0dXJlc0xpc3QoKSlpZihhPT09ZC5nZXROYW1lKCkmJiF0aGlzLmZlYXR1cmVIYXNTaW5nbGVWYWx1ZShkKSlyZXR1cm4hMTtyZXR1cm4hMH1nZXRGZWF0dXJlU2luZ2xlVmFsdWUoYSl7aWYobnVsbD09YSlyZXR1cm4iXHgzY251bGxceDNlIjtpZihhLmdldFN0cmluZ1N0YXRzKCkpcmV0dXJuIGE9YS5nZXRTdHJpbmdTdGF0cygpLmdldFRvcFZhbHVlc0xpc3QoKSwKbnVsbD09YXx8MD09PWEubGVuZ3RoPyJceDNjbnVsbFx4M2UiOmFbMF0uZ2V0VmFsdWUoKTtpZihhLmdldEJ5dGVzU3RhdHMoKSlyZXR1cm4gMD09PWEuZ2V0Qnl0ZXNTdGF0cygpLmdldFVuaXF1ZSgpPyJceDNjbnVsbFx4M2UiOiJceDNjYmluYXJ5IGRhdGFceDNlIjtpZihhLmdldE51bVN0YXRzKCkpe2NvbnN0IGM9YS5nZXROdW1TdGF0cygpLmdldE1pbigpO2lmKGMpcmV0dXJuIGJ0KGMpLnRvU3RyaW5nKCk7aWYoYT1hLmdldE51bVN0YXRzKCkuZ2V0TWF4KCkpcmV0dXJuIGJ0KGEpLnRvU3RyaW5nKCl9cmV0dXJuIlx4M2N1bmtub3duIHR5cGVceDNlIn1nZXREYXRhc2V0SGlzdG9ncmFtc0ZvckZlYXR1cmUoYSl7Y29uc3QgYz1bXTtpZih0aGlzLmRhdGEpZm9yKGNvbnN0IGwgb2YgdGhpcy5kYXRhLmdldERhdGFzZXRzTGlzdCgpKXtjb25zdCBrPWwuZ2V0TmFtZSgpO2xldCBuPW51bGwscD1udWxsLHE9bnVsbCxyPW51bGwsdD1udWxsLHY9bnVsbDtjb25zdCB5PXt9O2Zvcihjb25zdCB6IG9mIGwuZ2V0RmVhdHVyZXNMaXN0KCkpaWYoei5nZXROYW1lKCk9PT0KYSl7dmFyIGQ9dGhpcy5nZXRGZWF0dXJlQ29tbW9uU3RhdHMoYSxrKTtkJiYodD1kLmdldE51bVZhbHVlc0hpc3RvZ3JhbSgpLHY9ZC5nZXRGZWF0dXJlTGlzdExlbmd0aEhpc3RvZ3JhbSgpKTt6LmdldEN1c3RvbVN0YXRzTGlzdCgpJiZ6LmdldEN1c3RvbVN0YXRzTGlzdCgpLmZvckVhY2goeD0+e3guZ2V0SGlzdG9ncmFtKCk/eVt4LmdldE5hbWUoKV09eC5nZXRIaXN0b2dyYW0oKTp4LmdldFJhbmtIaXN0b2dyYW0oKSYmKHlbeC5nZXROYW1lKCldPXguZ2V0UmFua0hpc3RvZ3JhbSgpKX0pO2lmKHouZ2V0TnVtU3RhdHMoKSl7aWYoZD16LmdldE51bVN0YXRzKCkuZ2V0SGlzdG9ncmFtc0xpc3QoKSlmb3IodmFyIGY9MDtmPGQubGVuZ3RoO2YrKyl7dmFyIGc9ZFtmXTtnLmdldE5hbWUoKT95W2cuZ2V0TmFtZSgpXT1nOjA9PT1nLmdldFR5cGUoKT9uPWc6cT1nfWlmKHouZ2V0TnVtU3RhdHMoKS5nZXRXZWlnaHRlZE51bWVyaWNTdGF0cygpJiYoZD16LmdldE51bVN0YXRzKCkuZ2V0V2VpZ2h0ZWROdW1lcmljU3RhdHMoKS5nZXRIaXN0b2dyYW1zTGlzdCgpKSlmb3IoZj0KMDtmPGQubGVuZ3RoO2YrKylnPWRbZl0sMD09PWcuZ2V0VHlwZSgpP3A9ZzpyPWd9ZWxzZSB6LmdldFN0cmluZ1N0YXRzKCkmJihuPXouZ2V0U3RyaW5nU3RhdHMoKS5nZXRSYW5rSGlzdG9ncmFtKCksei5nZXRTdHJpbmdTdGF0cygpLmdldFdlaWdodGVkU3RyaW5nU3RhdHMoKSYmKHA9ei5nZXRTdHJpbmdTdGF0cygpLmdldFdlaWdodGVkU3RyaW5nU3RhdHMoKS5nZXRSYW5rSGlzdG9ncmFtKCkpKTticmVha31jLnB1c2gobmV3IEdxKGssbixwLHEscix0LHYseSkpfXJldHVybiBjfWRvZXNDb250YWluV2VpZ2h0ZWRTdGF0cygpe251bGw9PXRoaXMuY29udGFpbnNXZWlnaHRlZFN0YXRzJiYodGhpcy5jb250YWluc1dlaWdodGVkU3RhdHM9a3QodGhpcy5kYXRhKSk7cmV0dXJuIHRoaXMuY29udGFpbnNXZWlnaHRlZFN0YXRzfWRvZXNDb250YWluQ3VzdG9tU3RhdHMoKXtudWxsPT10aGlzLmNvbnRhaW5zQ3VzdG9tU3RhdHMmJih0aGlzLmNvbnRhaW5zQ3VzdG9tU3RhdHM9bHQodGhpcy5kYXRhKSk7CnJldHVybiB0aGlzLmNvbnRhaW5zQ3VzdG9tU3RhdHN9ZG9lc0NvbnRhaW5GZWF0dXJlTGlzdExlbmd0aERhdGEoKXtudWxsPT10aGlzLmNvbnRhaW5zRmVhdHVyZUxpc3RMZW5ndGhEYXRhJiYodGhpcy5jb250YWluc0ZlYXR1cmVMaXN0TGVuZ3RoRGF0YT1tdCh0aGlzLmRhdGEpKTtyZXR1cm4gdGhpcy5jb250YWluc0ZlYXR1cmVMaXN0TGVuZ3RoRGF0YX1nZXRDaGFydEFscGhhKCl7cmV0dXJuIDI8PXRoaXMuZ2V0RGF0YXNldE5hbWVzKCkubGVuZ3RoPy40OjF9Z2V0Q2hhcnRDb2xvclN0cmluZyhhKXthPXRoaXMuZ2V0Q29sb3JTY2FsZSgpLnNjYWxlKHRoaXMuZ2V0RGF0YXNldE5hbWVzKClbYV0pO2NvbnN0IGM9dGhpcy5nZXRDaGFydEFscGhhKCk7cmV0dXJuIGEucmVwbGFjZSgicmdiIiwicmdiYSIpLnJlcGxhY2UoIikiLCIsICIrYysiKSIpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLW92ZXJ2aWV3L2NvbW1vbi9wbG90dGFibGVfaGVscGVycy5qcwooZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhwKXtjb25zdCBxPVtdO2Zvcig7cCYmcCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50OylpZihxLnB1c2gocCkscC5hc3NpZ25lZFNsb3QpcD1wLmFzc2lnbmVkU2xvdDtlbHNlIGlmKHAucGFyZW50RWxlbWVudClwPXAucGFyZW50RWxlbWVudDtlbHNle2NvbnN0IHI9cC5wYXJlbnROb2RlO3A9ciBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQ/ci5ob3N0OnIhPT1wP3I6bnVsbH1yZXR1cm4gcX1mdW5jdGlvbiBkKHApe3ZhciBxPWMocCk7cD1mO2xldCByPW51bGw7Zm9yKGNvbnN0IHYgb2YgcSl7cT1QbG90dGFibGUuVXRpbHMuRE9NLmdldEVsZW1lbnRUcmFuc2Zvcm0odik7aWYobnVsbCE9cSl7dmFyIHQ9di5jbGllbnRXaWR0aC8yO2NvbnN0IHk9di5jbGllbnRIZWlnaHQvMjtwPVBsb3R0YWJsZS5VdGlscy5NYXRoLm11bHRpcGx5VHJhbnNsYXRlKHAsW3QseV0pO3A9UGxvdHRhYmxlLlV0aWxzLk1hdGgubXVsdGlwbHlNYXRyaXgocCxQbG90dGFibGUuVXRpbHMuTWF0aC5pbnZlcnRNYXRyaXgocSkpOwpwPVBsb3R0YWJsZS5VdGlscy5NYXRoLm11bHRpcGx5VHJhbnNsYXRlKHAsWy10LC15XSl9cT12LnNjcm9sbExlZnQ7dD12LnNjcm9sbFRvcDtpZihudWxsPT09cnx8dj09PXIpcS09di5vZmZzZXRMZWZ0K3YuY2xpZW50TGVmdCx0LT12Lm9mZnNldFRvcCt2LmNsaWVudFRvcCxyPXYub2Zmc2V0UGFyZW50O3A9UGxvdHRhYmxlLlV0aWxzLk1hdGgubXVsdGlwbHlUcmFuc2xhdGUocCxbcSx0XSl9cmV0dXJuIHB9Y29uc3QgZj1bMSwwLDAsMSwwLDBdO2NsYXNzIGcgZXh0ZW5kcyBQbG90dGFibGUuVXRpbHMuVHJhbnNsYXRvcntjb21wdXRlUG9zaXRpb24ocCxxKXtwPXt4OnAseTpxfTtxPWQodGhpcy5fcm9vdEVsZW1lbnQpO3JldHVybiBudWxsPT1xP3A6UGxvdHRhYmxlLlV0aWxzLk1hdGguYXBwbHlUcmFuc2Zvcm0ocSxwKX19Y2xhc3MgbCBleHRlbmRzIFBsb3R0YWJsZS5EaXNwYXRjaGVycy5Nb3VzZXtjb25zdHJ1Y3RvcihwKXtzdXBlcihwKTt0aGlzLl9ldmVudFRhcmdldD1wLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKTsKdGhpcy5fdHJhbnNsYXRvcj1uZXcgZyhwLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKSl9c3RhdGljIGdldERpc3BhdGNoZXIocCl7Y29uc3QgcT1wLnJvb3QoKS5yb290RWxlbWVudCgpO2xldCByPXFbbC5fRElTUEFUQ0hFUl9LRVldO3J8fChyPW5ldyBsKHApLHFbbC5fRElTUEFUQ0hFUl9LRVldPXIpO3JldHVybiByfX1jbGFzcyBrIGV4dGVuZHMgUGxvdHRhYmxlLkRpc3BhdGNoZXJzLlRvdWNoe2NvbnN0cnVjdG9yKHApe3N1cGVyKHApO3RoaXMuX2V2ZW50VGFyZ2V0PXAucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpO3RoaXMuX3RyYW5zbGF0b3I9bmV3IGcocC5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCkpfXN0YXRpYyBnZXREaXNwYXRjaGVyKHApe2NvbnN0IHE9cC5yb290KCkucm9vdEVsZW1lbnQoKTtsZXQgcj1xW2suX0RJU1BBVENIRVJfS0VZXTtyfHwocj1uZXcgayhwKSxxW2suX0RJU1BBVENIRVJfS0VZXT1yKTtyZXR1cm4gcn19Y2xhc3MgbiBleHRlbmRzIFBsb3R0YWJsZS5JbnRlcmFjdGlvbnMuUG9pbnRlcntfYW5jaG9yKCl7dGhpcy5faXNBbmNob3JlZD0KITA7dGhpcy5fbW91c2VEaXNwYXRjaGVyPWwuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj1rLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spfX1hLlBvaW50ZXJJbnRlcmFjdGlvbj1ufSkod2luZG93LnBsb3R0YWJsZV9oZWxwZXJzfHwod2luZG93LnBsb3R0YWJsZV9oZWxwZXJzPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLW92ZXJ2aWV3L2NvbXBvbmVudHMvZmFjZXRzLW92ZXJ2aWV3LXJvdy1zdGF0cy9mYWNldHMtb3ZlcnZpZXctcm93LXN0YXRzLmpzClBvbHltZXIoe2lzOiJmYWNldHMtb3ZlcnZpZXctcm93LXN0YXRzIixwcm9wZXJ0aWVzOntzdGF0czpPYmplY3Qsc2hvd1dlaWdodGVkOkJvb2xlYW4saGFzQ3VzdG9tOkJvb2xlYW4sZGF0YU1vZGVsOk9iamVjdCxkYXRhc2V0SW5kZXg6TnVtYmVyLGNvbXBhcmVNb2RlOkJvb2xlYW4sX2VudHJpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9nZXRFbnRyaWVzKHN0YXRzLCBzaG93V2VpZ2h0ZWQsIGhhc0N1c3RvbSkifX0sb2JzZXJ2ZXJzOlsiX2NvbG9yTGVnZW5kQm94KGRhdGFNb2RlbCwgZGF0YXNldEluZGV4LCBjb21wYXJlTW9kZSkiXSxfZ2V0RW50cmllczpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIFF0KGEsYyxkKX0sX2NvbG9yTGVnZW5kQm94OmZ1bmN0aW9uKGEsYyxkKXtjb25zdCBmPWQzLnNlbGVjdCh0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiI2xlZ2VuZC1ib3giKSk7Mj5hLmdldERhdGFzZXROYW1lcygpLmxlbmd0aCYmIWQ/Zi5zdHlsZSgidmlzaWJpbGl0eSIsCiJoaWRkZW4iKTooZi5zdHlsZSgidmlzaWJpbGl0eSIsbnVsbCksZi5zdHlsZSgiYmFja2dyb3VuZC1jb2xvciIsYS5nZXRDaGFydENvbG9yU3RyaW5nKGMpKSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLW92ZXJ2aWV3L2NvbXBvbmVudHMvZmFjZXRzLW92ZXJ2aWV3LXJvdy1sZWdlbmQvZmFjZXRzLW92ZXJ2aWV3LXJvdy1sZWdlbmQuanMKUG9seW1lcih7aXM6ImZhY2V0cy1vdmVydmlldy1yb3ctbGVnZW5kIixwcm9wZXJ0aWVzOntudW1lcmljOkJvb2xlYW4sc2hvd1dlaWdodGVkOkJvb2xlYW4saGFzQ3VzdG9tOkJvb2xlYW4sZGF0YU1vZGVsOk9iamVjdCxfZW50cmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEVudHJpZXMobnVtZXJpYywgc2hvd1dlaWdodGVkLCBoYXNDdXN0b20pIn19LF9nZXRFbnRyaWVzOmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gSnQoYSxjLGQpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2ZhY2V0cy1vdmVydmlldy9jb21wb25lbnRzL2ZhY2V0cy1vdmVydmlldy1jaGFydC9mYWNldHMtb3ZlcnZpZXctY2hhcnQuanMKUG9seW1lcih7aXM6ImZhY2V0cy1vdmVydmlldy1jaGFydCIscHJvcGVydGllczp7ZGF0YTp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il91cGRhdGVEYXRhIn0sZGF0YU1vZGVsOk9iamVjdCxmZWF0dXJlOlN0cmluZyxfbWF4QnVja2V0c0ZvckJhckNoYXJ0Ont0eXBlOk51bWJlcix2YWx1ZToxMCxyZWFkT25seTohMH0sX2NoYXJ0QWxwaGE6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LGxvZ1NjYWxlOkJvb2xlYW4sc2hvd1dlaWdodGVkOkJvb2xlYW4sc2hvd1BlcmNlbnRhZ2U6Qm9vbGVhbixjaGFydFNlbGVjdGlvbjp7dHlwZTpOdW1iZXIsb2JzZXJ2ZXI6Il91cGRhdGVDaGFydFNlbGVjdGlvbiJ9LHNlbGVjdGlvbjp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il91cGRhdGVTZWxlY3Rpb25WaXNpYmlsaXR5Iixub3RpZnk6ITB9LGV4cGFuZENoYXJ0OkJvb2xlYW4sX3NlbGVjdGlvbkVsZW06T2JqZWN0LF9taW5CYXJIZWlnaHRSYXRpbzp7dHlwZTpOdW1iZXIsdmFsdWU6LjAxLHJlYWRPbmx5OiEwfSwKX29uQ2xpY2s6T2JqZWN0LF9vbkNsaWNrRnVuY3Rpb246T2JqZWN0LF9vblBvaW50ZXI6T2JqZWN0LF9vblBvaW50ZXJFbnRlckZ1bmN0aW9uOk9iamVjdCxfb25Qb2ludGVyRXhpdEZ1bmN0aW9uOk9iamVjdCxfdGFibGVEYXRhOkFycmF5LF9zaG93VGFibGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NoYXJ0VHlwZTpPYmplY3QsX2NoYXJ0Q2xhc3M6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0Q2hhcnRDbGFzcyhfc2hvd1RhYmxlKSJ9LF9jaGFydFN2Z0NsYXNzOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2dldENoYXJ0U3ZnQ2xhc3MoZXhwYW5kQ2hhcnQpIn0sX3hBeGlzU3ZnQ2xhc3M6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0WEF4aXNTdmdDbGFzcyhleHBhbmRDaGFydCkifSxfdGFibGVEYXRhQ2xhc3M6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0VGFibGVEYXRhQ2xhc3MoZXhwYW5kQ2hhcnQpIn19LG9ic2VydmVyczpbIl9yZW5kZXIoZGF0YSwgbG9nU2NhbGUsIHNob3dXZWlnaHRlZCwgY2hhcnRTZWxlY3Rpb24sIF9zaG93VGFibGUsIGV4cGFuZENoYXJ0LCBzaG93UGVyY2VudGFnZSwgZGF0YU1vZGVsKSJdLApfdXBkYXRlRGF0YSgpe3RoaXMuX3Nob3dUYWJsZT0hMX0sX3VwZGF0ZUNoYXJ0U2VsZWN0aW9uKCl7dGhpcy5fc2hvd1RhYmxlPSExfSxfaGFzV2VpZ2h0ZWRIaXN0b2dyYW0oYSl7cmV0dXJuIG50KGEpfSxfaGFzUXVhbnRpbGVzKGEpe3JldHVybiBvdChhKX0sX2lzU3RyaW5nQ2hhcnQoYSxjKXtyZXR1cm4oYT09PXp0LkNVTURJU1RfQ0hBUlR8fGE9PT16dC5CQVJfQ0hBUlQpJiYiVmFsdWUgbGlzdCBsZW5ndGgiIT09YyYmIkZlYXR1cmUgbGlzdCBsZW5ndGgiIT09Y30sX2Rpc2FibGVMb2dDaGVja2JveChhLGMpe3JldHVybiBhfHwiU3RhbmRhcmQiIT09Y30sX3JlbmRlcihhLGMsZCxmLGcsbCxrLG4pe3RoaXMuX29uUG9pbnRlciYmKHRoaXMuX29uUG9pbnRlci5vZmZQb2ludGVyTW92ZSh0aGlzLl9vblBvaW50ZXJFbnRlckZ1bmN0aW9uKSx0aGlzLl9vblBvaW50ZXIub2ZmUG9pbnRlck1vdmUodGhpcy5fb25Qb2ludGVyRXhpdEZ1bmN0aW9uKSk7dGhpcy5fb25DbGljayYmdGhpcy5fb25DbGljay5vZmZDbGljayh0aGlzLl9vbkNsaWNrRnVuY3Rpb24pOwphJiYodGhpcy5fY2hhcnRBbHBoYT1uLmdldENoYXJ0QWxwaGEoKSxnPWEubWFwKHA9PnRoaXMuX2dldEJ1Y2tldHMocCxkLGYpKSx0aGlzLl9jaGFydFR5cGU9QnQoYSxmLHRoaXMuX21heEJ1Y2tldHNGb3JCYXJDaGFydCksYT1hLm1hcChwPT5wLm5hbWUpLCJWYWx1ZSBsaXN0IGxlbmd0aCI9PT1mfHwiRmVhdHVyZSBsaXN0IGxlbmd0aCI9PT1mfHwiUXVhbnRpbGVzIj09PWY/dGhpcy5fcmVuZGVyUXVhbnRpbGVDaGFydChnLGEsYyk6dGhpcy5fY2hhcnRUeXBlPT09enQuSElTVE9HUkFNP3RoaXMuX3JlbmRlckhpc3RvZ3JhbUNoYXJ0KGcsYSxjLGspOnRoaXMuX2NoYXJ0VHlwZT09PXp0LkNVTURJU1RfQ0hBUlQ/dGhpcy5fcmVuZGVyQ2RmQ2hhcnQoZyxhLGMpOnRoaXMuX3JlbmRlckJhckNoYXJ0KGcsYSxjLGspKX0sX3JlbmRlckhpc3RvZ3JhbUNoYXJ0KGEsYyxkLGYpe2NvbnN0IGc9W10sbD1uZXcgUGxvdHRhYmxlLlBsb3RzLlJlY3RhbmdsZTtsZXQgaz1JbmZpbml0eSxuPS1JbmZpbml0eSwKcD0wO2YmJihhPVJ0KGEpKTthLmZvckVhY2goKHYseSk9Pnt2LmZvckVhY2goej0+e2NvbnN0IHg9YnQoei5nZXRMb3dWYWx1ZSgpKSxDPWJ0KHouZ2V0SGlnaFZhbHVlKCkpO3o9YnQoei5nZXRTYW1wbGVDb3VudCgpKTt4PGsmJihrPXgpO0M+biYmKG49Qyk7ej5wJiYocD16KTtpc0Zpbml0ZSh4KSYmaXNGaW5pdGUoQykmJmcucHVzaChDLXgpfSk7bC5hZGREYXRhc2V0KG5ldyBQbG90dGFibGUuRGF0YXNldCh2LHtuYW1lOmNbeV19KSl9KTtsZXQgcT0wPGcubGVuZ3RoP2cucmVkdWNlKGZ1bmN0aW9uKHYseSl7cmV0dXJuIHYreX0pL2cubGVuZ3RoOjA7MD09PXEmJihxPTEpO2Y9W107aXNGaW5pdGUoaykmJihmLnB1c2goayksaXNGaW5pdGUobikmJmYucHVzaChuKSk7YT1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXI7MDxmLmxlbmd0aCYmYS5kb21haW4oZik7Zj10aGlzLl9nZXRTY2FsZShkKS5kb21haW4oWzBdKTtjb25zdCByPW5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKGEsCiJib3R0b20iKSx0PW5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKGYsImxlZnQiKTt0LmZvcm1hdHRlcih0aGlzLl9jaGFydEF4aXNTY2FsZUZvcm1hdHRlcigpKTtyLmZvcm1hdHRlcih0aGlzLl9jaGFydEF4aXNTY2FsZUZvcm1hdHRlcigpKTtsLngodj0+e2xldCB5PWJ0KHYuZ2V0TG93VmFsdWUoKSk7aWYoLUluZmluaXR5PT09eXx8eT09PXYuZ2V0SGlnaFZhbHVlKCkpdj1idCh2LmdldEhpZ2hWYWx1ZSgpKSxpc0Zpbml0ZSh2KT95PXYtcTooeT0wLC1JbmZpbml0eT09PXYmJih5LT1xKSk7cmV0dXJuIHl9LGEpLngyKHY9PntsZXQgeT1idCh2LmdldEhpZ2hWYWx1ZSgpKTtpZihJbmZpbml0eT09PXl8fHk9PT12LmdldExvd1ZhbHVlKCkpdj1idCh2LmdldExvd1ZhbHVlKCkpLGlzRmluaXRlKHYpP3k9ditxOih5PTAsSW5maW5pdHk9PT12JiYoeSs9cSkpO3JldHVybiB5fSkueSgoKT0+MCxmKS55Mih2PT50aGlzLl9nZXRDb3VudFdpdGhGbG9vcih2LHAsZCkpO2wuYXR0cigiZmlsbCIsCih2LHkseik9PnoubWV0YWRhdGEoKS5uYW1lLHRoaXMuZGF0YU1vZGVsLmdldENvbG9yU2NhbGUoKSkuYXR0cigib3BhY2l0eSIsdGhpcy5fY2hhcnRBbHBoYSk7dGhpcy5fcmVuZGVyQ2hhcnQobCxyLHQsbnVsbCxudWxsLHY9PmwuZW50aXRpZXNBdCh2KSx2PT5XcyhidCh2LmdldExvd1ZhbHVlKCkpLDIpLnRvTG9jYWxlU3RyaW5nKCkrIi0iK1dzKGJ0KHYuZ2V0SGlnaFZhbHVlKCkpLDIpLnRvTG9jYWxlU3RyaW5nKCkrIjogIitidCh2LmdldFNhbXBsZUNvdW50KCkpLnRvTG9jYWxlU3RyaW5nKCksdj0+bmV3IElxKHRoaXMuZmVhdHVyZSx2b2lkIDAsYnQodi5nZXRMb3dWYWx1ZSgpKSxidCh2LmdldEhpZ2hWYWx1ZSgpKSksdj0+di5hcHBlbmQoInJlY3QiKS5hdHRyKCJzdHJva2UiLCJibGFjayIpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigic3Ryb2tlLXdpZHRoIiwiMXB4IiksKHYseSk9PnYuYXR0cigieCIseS5wb3NpdGlvbi54LXkuc2VsZWN0aW9uLl9ncm91cHNbMF1bMF0ud2lkdGguYmFzZVZhbC52YWx1ZS8KMikuYXR0cigieSIseS5wb3NpdGlvbi55LXkuc2VsZWN0aW9uLl9ncm91cHNbMF1bMF0uaGVpZ2h0LmJhc2VWYWwudmFsdWUvMikuYXR0cigid2lkdGgiLHkuc2VsZWN0aW9uLl9ncm91cHNbMF1bMF0ud2lkdGguYmFzZVZhbC52YWx1ZSkuYXR0cigiaGVpZ2h0Iix5LnNlbGVjdGlvbi5fZ3JvdXBzWzBdWzBdLmhlaWdodC5iYXNlVmFsLnZhbHVlKSl9LF9yZW5kZXJRdWFudGlsZUNoYXJ0KGEsYyxkKXtjb25zdCBmPW5ldyBQbG90dGFibGUuUGxvdHMuTGluZSxnPW5ldyBQbG90dGFibGUuUGxvdHMuU2NhdHRlcjtsZXQgbD1JbmZpbml0eSxrPS1JbmZpbml0eTthLmZvckVhY2goKHEscik9Pntjb25zdCB0PVtdLHY9cS5sZW5ndGg7cS5mb3JFYWNoKCh5LHopPT57dmFyIHg9YnQoeS5nZXRMb3dWYWx1ZSgpKTtjb25zdCBDPWJ0KHkuZ2V0SGlnaFZhbHVlKCkpO3g8bCYmKGw9eCk7Qz5rJiYoaz1DKTt4PW5ldyBGcTt4LmJ1Y2tldD15O3guZGF0YXNldEluZGV4PXI7eC5xdWFudGlsZT0xMDAqCnovdjt0LnB1c2goeCl9KTtpZigwPHEubGVuZ3RoKXtjb25zdCB5PW5ldyBhbTt5LnNldExvd1ZhbHVlKHFbcS5sZW5ndGgtMV0uZ2V0SGlnaFZhbHVlKCkpO3kuc2V0SGlnaFZhbHVlKHFbcS5sZW5ndGgtMV0uZ2V0SGlnaFZhbHVlKCkpO3kuc2V0U2FtcGxlQ291bnQocVtxLmxlbmd0aC0xXS5nZXRTYW1wbGVDb3VudCgpKTtxPW5ldyBGcTtxLmJ1Y2tldD15O3EuZGF0YXNldEluZGV4PXI7cS5xdWFudGlsZT0xMDA7dC5wdXNoKHEpfWYuYWRkRGF0YXNldChuZXcgUGxvdHRhYmxlLkRhdGFzZXQodCx7bmFtZTpjW3JdfSkpO2cuYWRkRGF0YXNldChuZXcgUGxvdHRhYmxlLkRhdGFzZXQodCx7bmFtZTpjW3JdfSkpfSk7Y29uc3Qgbj1pc0Zpbml0ZShsKSYmaXNGaW5pdGUoayk/az09PWw/MTooay1sKS8xMDowO3ZhciBwPVtdO2lzRmluaXRlKGwpJiYocC5wdXNoKGwtbiksaXNGaW5pdGUoaykmJnAucHVzaChrK24pKTtkPXRoaXMuX2dldFNjYWxlKGQpOzA8cC5sZW5ndGgmJmQuZG9tYWluKHApOwpwPXRoaXMuX2dldFNjYWxlKCExKS5kb21haW4oWy1hLmxlbmd0aCsuNSwxXSk7YT1uZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyhkLCJib3R0b20iKTthLmZvcm1hdHRlcih0aGlzLl9jaGFydEF4aXNTY2FsZUZvcm1hdHRlcigpKTtmLngocT0+YnQocS5idWNrZXQuZ2V0TG93VmFsdWUoKSksZCkueShxPT4tMSpxLmRhdGFzZXRJbmRleCxwKTtnLngocT0+YnQocS5idWNrZXQuZ2V0TG93VmFsdWUoKSksZCkueShxPT4tcS5kYXRhc2V0SW5kZXgscCkuc2l6ZShxPT41MD09PXEucXVhbnRpbGU/MTU6OCkuc3ltYm9sKCgpPT5QbG90dGFibGUuU3ltYm9sRmFjdG9yaWVzLmNyb3NzKCkpO2YuYXR0cigic3Ryb2tlIiwiZ3JheSIpLmF0dHIoIm9wYWNpdHkiLHRoaXMuX2NoYXJ0QWxwaGEpO2cuYXR0cigiZmlsbCIsKHEscix0KT0+dC5tZXRhZGF0YSgpLm5hbWUsdGhpcy5kYXRhTW9kZWwuZ2V0Q29sb3JTY2FsZSgpKS5hdHRyKCJvcGFjaXR5Iix0aGlzLl9jaGFydEFscGhhKTtwPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5Hcm91cChbZiwKZ10pO3RoaXMuX3JlbmRlckNoYXJ0KHAsYSxudWxsLG51bGwsbnVsbCxxPT5nLmVudGl0aWVzQXQocSkscT0+cS5xdWFudGlsZSsiJTogIitXcyhidChxLmJ1Y2tldC5nZXRMb3dWYWx1ZSgpKSwyKS50b0xvY2FsZVN0cmluZygpLHE9Pm5ldyBJcSh0aGlzLmZlYXR1cmUsdm9pZCAwLGJ0KHEuYnVja2V0LmdldExvd1ZhbHVlKCkpLGJ0KHEuYnVja2V0LmdldEhpZ2hWYWx1ZSgpKSkscT0+cS5hcHBlbmQoImNpcmNsZSIpLmF0dHIoInIiLDMpLmF0dHIoInN0cm9rZSIsImJsYWNrIikuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJzdHJva2Utd2lkdGgiLCIxcHgiKSwocSxyKT0+cS5hdHRyKCJjeCIsci5wb3NpdGlvbi54KS5hdHRyKCJjeSIsci5wb3NpdGlvbi55KSl9LF9yZW5kZXJCYXJDaGFydChhLGMsZCxmKXtjb25zdCBnPVpzKGEpLGw9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO3ZhciBrPW5ldyBQbG90dGFibGUuU2NhbGVzLkNhdGVnb3J5O2NvbnN0IG49dGhpcy5fZ2V0U2NhbGUoZCk7CmsuZG9tYWluKGcpO2s9bmV3IFBsb3R0YWJsZS5BeGVzLkNhdGVnb3J5KGssImJvdHRvbSIpO2NvbnN0IHA9bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWMobiwibGVmdCIpO3AuZm9ybWF0dGVyKHRoaXMuX2NoYXJ0QXhpc1NjYWxlRm9ybWF0dGVyKCkpO2YmJihhPVJ0KGEpKTtsZXQgcT0wO2Y9YS5tYXAoKHQsdik9Pnt0LmZvckVhY2goej0+e3o9YnQoei5nZXRTYW1wbGVDb3VudCgpKTt6PnEmJihxPXopfSk7Y29uc3QgeT1uZXcgdnQ7eS5uYW1lPWNbdl07eS5yYXdCdWNrZXRzPXQ7cmV0dXJuIHl9KTt0aGlzLl90YWJsZURhdGE9eXQoZixnKTtjb25zdCByPW5ldyBQbG90dGFibGUuUGxvdHMuQmFyO2EuZm9yRWFjaCgodCx2KT0+ci5hZGREYXRhc2V0KG5ldyBQbG90dGFibGUuRGF0YXNldCh0LHtuYW1lOmNbdl19KSkpO3IueCh0PT5nLmluZGV4T2YoJHModC5nZXRMYWJlbCgpKSksbCkueSh0PT50aGlzLl9nZXRDb3VudFdpdGhGbG9vcih0LHEsZCksbik7ci5hdHRyKCJmaWxsIiwKKHQsdix5KT0+eS5tZXRhZGF0YSgpLm5hbWUsdGhpcy5kYXRhTW9kZWwuZ2V0Q29sb3JTY2FsZSgpKS5hdHRyKCJvcGFjaXR5Iix0aGlzLl9jaGFydEFscGhhKTt0aGlzLl9yZW5kZXJDaGFydChyLGsscCxudWxsLG51bGwsdD0+ci5lbnRpdGllc0F0KHQpLHQ9PiRzKHQuZ2V0TGFiZWwoKSkrIjogIitidCh0LmdldFNhbXBsZUNvdW50KCkpLnRvTG9jYWxlU3RyaW5nKCksdD0+bmV3IElxKHRoaXMuZmVhdHVyZSx0LmdldExhYmVsKCkpLHQ9PnQuYXBwZW5kKCJyZWN0IikuYXR0cigic3Ryb2tlIiwiYmxhY2siKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoInN0cm9rZS13aWR0aCIsIjFweCIpLCh0LHYpPT50LmF0dHIoIngiLHYucG9zaXRpb24ueC12LnNlbGVjdGlvbi5fZ3JvdXBzWzBdWzBdLndpZHRoLmJhc2VWYWwudmFsdWUvMikuYXR0cigieSIsdi5wb3NpdGlvbi55KS5hdHRyKCJ3aWR0aCIsdi5zZWxlY3Rpb24uX2dyb3Vwc1swXVswXS53aWR0aC5iYXNlVmFsLnZhbHVlKS5hdHRyKCJoZWlnaHQiLAp2LnNlbGVjdGlvbi5fZ3JvdXBzWzBdWzBdLmhlaWdodC5iYXNlVmFsLnZhbHVlKSl9LF9yZW5kZXJDZGZDaGFydChhLGMsZCl7Y29uc3QgZj1jLm1hcChyPT57cj10aGlzLmRhdGFNb2RlbC5nZXRGZWF0dXJlQ29tbW9uU3RhdHModGhpcy5mZWF0dXJlLHIpO3JldHVybiBudWxsIT1yP3IuZ2V0TnVtTm9uTWlzc2luZygpKnIuZ2V0QXZnTnVtVmFsdWVzKCk6MH0pLGc9WnMoYSksbD17fTtnLmZvckVhY2goKHIsdCk9PntsW3JdPXR9KTtjb25zdCBrPShuZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXIpLmRvbWFpbihbMF0pO2Q9dGhpcy5fZ2V0U2NhbGUoZCkuZG9tYWluKFswXSk7Y29uc3Qgbj1uZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyhrLCJib3R0b20iKSxwPW5ldyBQbG90dGFibGUuQXhlcy5OdW1lcmljKGQsImxlZnQiKSxxPW5ldyBQbG90dGFibGUuUGxvdHMuTGluZTthPWEubWFwKChyLHQpPT57Y29uc3Qgdj1bXSx5PVtdLHo9W107bGV0IHg9LTE7ci5mb3JFYWNoKEM9PntDPQpDLmNsb25lTWVzc2FnZSgpO3oucHVzaChDKX0pOzA8dCYmei5zb3J0KChDLEYpPT5sWyRzKEMuZ2V0TGFiZWwoKSldLWxbJHMoRi5nZXRMYWJlbCgpKV0pO3ouZm9yRWFjaCgoQyxGKT0+e2NvbnN0IEQ9bFskcyhDLmdldExhYmVsKCkpXTtmb3IodmFyIEI9eCsxO0I8RDtCKyspe3ZhciBJPW5ldyBkbTtJLnNldExhYmVsKGdbQl0pO0kuc2V0TG93UmFuayhCKTtJLnNldEhpZ2hSYW5rKEIpOzA9PT12Lmxlbmd0aD9JLnNldFNhbXBsZUNvdW50KDApOkkuc2V0U2FtcGxlQ291bnQodlt2Lmxlbmd0aC0xXS5nZXRTYW1wbGVDb3VudCgpKTt2LnB1c2goSSk7ST1uZXcgZG07SS5zZXRMYWJlbChnW0JdKTtJLnNldExvd1JhbmsoQik7SS5zZXRIaWdoUmFuayhCKTtJLnNldFNhbXBsZUNvdW50KDApO3kucHVzaChJKX14PUQ7Qj1DLmNsb25lKCk7eS5wdXNoKEIpOzA9PT1GP0Muc2V0U2FtcGxlQ291bnQoYnQoQy5nZXRTYW1wbGVDb3VudCgpKS9mW3RdKTooRj0wPEQ/RC0xOkYtMSxDLnNldFNhbXBsZUNvdW50KGJ0KEMuZ2V0U2FtcGxlQ291bnQoKSkvCmZbdF0rYnQodltGXS5nZXRTYW1wbGVDb3VudCgpKSkpO0Muc2V0TG93UmFuayhEKTtDLnNldEhpZ2hSYW5rKEQpO3YucHVzaChDKX0pO3I9bmV3IHZ0O3IubmFtZT1jW3RdO3IucGVyY0J1Y2tldHM9djtyLnJhd0J1Y2tldHM9eTtyZXR1cm4gcn0pO3RoaXMuX3RhYmxlRGF0YT14dChhKTtmb3IoY29uc3QgciBvZiBhKXEuYWRkRGF0YXNldChuZXcgUGxvdHRhYmxlLkRhdGFzZXQoci5wZXJjQnVja2V0cyx7bmFtZTpyLm5hbWV9KSk7cS54KHI9PmJ0KHIuZ2V0TG93UmFuaygpKSxrKS55KHI9PmJ0KHIuZ2V0U2FtcGxlQ291bnQoKSksZCk7cS5hdHRyKCJzdHJva2UiLChyLHQsdik9PnYubWV0YWRhdGEoKS5uYW1lLHRoaXMuZGF0YU1vZGVsLmdldENvbG9yU2NhbGUoKSkuYXR0cigib3BhY2l0eSIsdGhpcy5fY2hhcnRBbHBoYSk7dGhpcy5fcmVuZGVyQ2hhcnQocSxuLHAsbnVsbCxudWxsLHI9PnEuZW50aXRpZXNBdChyKSxyPT4kcyhyLmdldExhYmVsKCkpKyI6ICIrV3MoYnQoci5nZXRTYW1wbGVDb3VudCgpKSwKNCkudG9Mb2NhbGVTdHJpbmcoKSxyPT5uZXcgSXEodGhpcy5mZWF0dXJlLHIuZ2V0TGFiZWwoKSkscj0+ci5hcHBlbmQoImNpcmNsZSIpLmF0dHIoInIiLDMpLmF0dHIoInN0cm9rZSIsImJsYWNrIikuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJzdHJva2Utd2lkdGgiLCIxcHgiKSwocix0KT0+ci5hdHRyKCJjeCIsdC5wb3NpdGlvbi54KS5hdHRyKCJjeSIsdC5wb3NpdGlvbi55KSl9LF9yZW5kZXJDaGFydChhLGMsZCxmLGcsbCxrLG4scCxxKXtpZighdGhpcy5fc2hvd1RhYmxlKXt2YXIgcj1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuVGFibGUoW1tnLGQsYV0sW251bGwsbnVsbCxudWxsXV0pLHQ9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLlRhYmxlKFtbbnVsbCxudWxsXSxbbnVsbCxjXV0pO1Bsb3R0YWJsZS5SZW5kZXJDb250cm9sbGVyLnJlbmRlclBvbGljeSgpO3ZhciB2PWQzLnNlbGVjdCh0aGlzLiQuY2hhcnQpLHk9ZDMuc2VsZWN0KHRoaXMuJC54YXhpcyksej1kMy5zZWxlY3QodGhpcy4kLnRvb2x0aXApOwp0aGlzLmFzeW5jKCgpPT57di5zZWxlY3RBbGwoIi5jb21wb25lbnQiKS5yZW1vdmUoKTt5LnNlbGVjdEFsbCgiLmNvbXBvbmVudCIpLnJlbW92ZSgpO3IucmVuZGVyVG8odGhpcy4kLmNoYXJ0KTt0aGlzLl9zZWxlY3Rpb25FbGVtPXAoYS5mb3JlZ3JvdW5kKCkpO3RoaXMuX3VwZGF0ZVNlbGVjdGlvblZpc2liaWxpdHkodGhpcy5zZWxlY3Rpb24pO3Yub24oIm1vdXNlZW50ZXIiLCgpPT57dGhpcy5fb25Qb2ludGVyPW5ldyBwbG90dGFibGVfaGVscGVycy5Qb2ludGVySW50ZXJhY3Rpb247dGhpcy5fb25Qb2ludGVyRW50ZXJGdW5jdGlvbj14PT57eD1sKHgpOzA8eC5sZW5ndGgmJih4PXgubWFwKEM9Pm51bGw9PUMuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWV8fDE9PT10aGlzLmRhdGFNb2RlbC5nZXREYXRhc2V0TmFtZXMoKS5sZW5ndGg/ayhDLmRhdHVtKTpDLmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKyI6ICIrayhDLmRhdHVtKSkuam9pbigiXG4iKSx6LnRleHQoeCksei5zdHlsZSgib3BhY2l0eSIsCiIxIikpfTt0aGlzLl9vblBvaW50ZXIub25Qb2ludGVyTW92ZSh0aGlzLl9vblBvaW50ZXJFbnRlckZ1bmN0aW9uKTt0aGlzLl9vblBvaW50ZXJFeGl0RnVuY3Rpb249ZnVuY3Rpb24oKXt6LnN0eWxlKCJvcGFjaXR5IiwiMCIpfTt0aGlzLl9vblBvaW50ZXIub25Qb2ludGVyRXhpdCh0aGlzLl9vblBvaW50ZXJFeGl0RnVuY3Rpb24pO3RoaXMuX29uUG9pbnRlci5hdHRhY2hUbyhhKTtpZigiVmFsdWUgbGlzdCBsZW5ndGgiIT09dGhpcy5jaGFydFNlbGVjdGlvbil7dGhpcy5fb25DbGljaz1uZXcgUGxvdHRhYmxlLkludGVyYWN0aW9ucy5DbGljaztjb25zdCB4PXRoaXM7dGhpcy5fb25DbGlja0Z1bmN0aW9uPUM9PntDPWwoQyk7MDxDLmxlbmd0aCYmKHEoeC5fc2VsZWN0aW9uRWxlbSxDWzBdKSxDPW4oQ1swXS5kYXR1bSkseC5fc2V0U2VsZWN0aW9uKEMpKX07dGhpcy5fb25DbGljay5vbkNsaWNrKHRoaXMuX29uQ2xpY2tGdW5jdGlvbik7dGhpcy5fb25DbGljay5hdHRhY2hUbyhhKX19KS5vbigibW91c2VsZWF2ZSIsCigpPT57dGhpcy5fb25Qb2ludGVyLmRldGFjaEZyb20oKTt0aGlzLl9vbkNsaWNrLmRldGFjaEZyb20oKX0pO251bGwhPWQmJnQuY29sdW1uUGFkZGluZyhyLmNvbXBvbmVudEF0KDEpLndpZHRoKCkrKHIuY29tcG9uZW50QXQoMCk/ci5jb21wb25lbnRBdCgwKS53aWR0aCgpOjApKTt0LnJlbmRlclRvKHRoaXMuJC54YXhpcyl9KX19LF9zZXRTZWxlY3Rpb24oYSl7YS5lcXVhbHModGhpcy5zZWxlY3Rpb24pJiZhLmNsZWFyKCk7dGhpcy5zZWxlY3Rpb249YTt0aGlzLmZpcmUoImZlYXR1cmUtc2VsZWN0Iix7c2VsZWN0aW9uOmF9KX0sX2dldEJ1Y2tldHMoYSxjLGQpe3JldHVybiBYcyhhLGMsZCl9LF9nZXRTY2FsZShhKXtyZXR1cm4gYT9uZXcgUGxvdHRhYmxlLlNjYWxlcy5Nb2RpZmllZExvZzpuZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXJ9LF9jaGFydEF4aXNTY2FsZUZvcm1hdHRlcigpe2NvbnN0IGE9UGxvdHRhYmxlLkZvcm1hdHRlcnMuc2hvcnRTY2FsZSgpO3JldHVybiBjPT4KMUUzPk1hdGguYWJzKGMpP1N0cmluZyhjKTphKGMpfSxfZ2V0Q291bnRXaXRoRmxvb3IoYSxjLGQpe2E9YnQoYS5nZXRTYW1wbGVDb3VudCgpKTshZCYmMDxhJiZhL2M8dGhpcy5fbWluQmFySGVpZ2h0UmF0aW8mJihhPWMqdGhpcy5fbWluQmFySGVpZ2h0UmF0aW8pO3JldHVybiBhfSxfdXBkYXRlU2VsZWN0aW9uVmlzaWJpbGl0eShhKXt0aGlzLl9zZWxlY3Rpb25FbGVtJiZ0aGlzLl9zZWxlY3Rpb25FbGVtLnN0eWxlKCJkaXNwbGF5IixudWxsPT1hfHxhLm5hbWUhPT10aGlzLmZlYXR1cmU/Im5vbmUiOiJpbmxpbmUiKX0sX3RvZ2dsZVNob3dUYWJsZSgpe3RoaXMuX3Nob3dUYWJsZT0hdGhpcy5fc2hvd1RhYmxlfSxfZ2V0Q2hhcnRDbGFzcyhhKXtyZXR1cm4gYT8iaGlkZWNoYXJ0Ijoic2hvd2NoYXJ0In0sX2dldFNob3dUYWJsZUJ1dHRvblRleHQoYSl7cmV0dXJuIGE/InNob3cgY2hhcnQiOiJzaG93IHJhdyBkYXRhIn0sX2dldENoYXJ0U3ZnQ2xhc3MoYSl7cmV0dXJuIGE/ImNoYXJ0LWJpZyI6CiJjaGFydC1zbWFsbCJ9LF9nZXRYQXhpc1N2Z0NsYXNzKGEpe3JldHVybiBhPyJ4YXhpcy1iaWciOiJ4YXhpcy1zbWFsbCJ9LF9nZXRUYWJsZURhdGFDbGFzcyhhKXtyZXR1cm4gYT8iZGF0YS1saXN0LWJpZyI6ImRhdGEtbGlzdC1zbWFsbCJ9LF9yb3dDbGljayhhKXt0aGlzLl9zZXRTZWxlY3Rpb24obmV3IElxKHRoaXMuZmVhdHVyZSxhLmN1cnJlbnRUYXJnZXQuZGF0YVZhbHVlKSl9LF9nZXRFbnRyeVJvd1ZhbHVlKGEpe3JldHVybiBhLnZhbHVlfSxfZ2V0RW50cnlSb3dDbGFzcyhhLGMpe2xldCBkPSJkaWFsb2ctcm93IjtudWxsIT1jJiZjLm5hbWU9PT10aGlzLmZlYXR1cmUmJmMuc3RyaW5nVmFsdWU9PT1hLnZhbHVlJiYoZCs9IiBzZWxlY3RlZCIpO3JldHVybiBkfSxfZ2V0Q291bnRDZWxsQ2xhc3MoYSl7cmV0dXJuImRhaWxvZy1yb3ctZW50cnkgY291bnQtY2VsbCIrKGE/IiB3ZWlnaHRlZC1jZWxsIjoiIil9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLW92ZXJ2aWV3L2NvbXBvbmVudHMvZmFjZXRzLW92ZXJ2aWV3LXRhYmxlL2ZhY2V0cy1vdmVydmlldy10YWJsZS5qcwpQb2x5bWVyKHtpczoiZmFjZXRzLW92ZXJ2aWV3LXRhYmxlIixwcm9wZXJ0aWVzOntkYXRhTW9kZWw6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfaGFuZGxlUmVzaXplIn0sZmVhdHVyZXM6e3R5cGU6QXJyYXksb2JzZXJ2ZXI6Il9oYW5kbGVSZXNpemUifSxmZWF0dXJlU2xpY2VTZWxlY3Rpb246e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sbnVtZXJpYzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxjb21wYXJlTW9kZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfbG9nU2NhbGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2V4cGFuZENoYXJ0czp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfaGFuZGxlUmVzaXplIn0sX3Nob3dXZWlnaHRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfc2hvd1BlcmNlbnRhZ2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NoYXJ0U2VsZWN0aW9uOnt0eXBlOlN0cmluZyx2YWx1ZToiU3RhbmRhcmQifSxfZW5hYmxlTG9nU2NhbGU6e3R5cGU6Qm9vbGVhbiwKdmFsdWU6ITB9LF9jaGFydFNlbGVjdGlvblR5cGVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZUNoYXJ0U2VsZWN0aW9uVHlwZXMobnVtZXJpYywgZGF0YU1vZGVsLCBmZWF0dXJlcykifSxfbWF4SGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTo4MDAscmVhZE9ubHk6ITB9LF9leHBhbmRlZFJvd0hlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MzMwLHJlYWRPbmx5OiEwfSxfcm93SGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZToxMDAscmVhZE9ubHk6ITB9fSxfaGFuZGxlUmVzaXplKCl7Y29uc3QgYT10aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiaXJvbi1saXN0Iik7YSYmdGhpcy5fZXhwYW5kZWRSb3dIZWlnaHQmJnRoaXMuX3Jvd0hlaWdodCYmdGhpcy5fbWF4SGVpZ2h0JiZ0aGlzLmZlYXR1cmVzJiYoYS5zdHlsZS5oZWlnaHQ9TWF0aC5taW4oKHRoaXMuZmVhdHVyZXM/dGhpcy5mZWF0dXJlcy5sZW5ndGg6MCkqKHRoaXMuX2V4cGFuZENoYXJ0cz90aGlzLl9leHBhbmRlZFJvd0hlaWdodDoKdGhpcy5fcm93SGVpZ2h0KSx0aGlzLl9tYXhIZWlnaHQpKyJweCIsYS5maXJlKCJpcm9uLXJlc2l6ZSIpKX0sX2NvbXB1dGVDaGFydFNlbGVjdGlvblR5cGVzKGEsYyxkKXtjb25zdCBmPVsiU3RhbmRhcmQiXTthJiZmLnB1c2goIlF1YW50aWxlcyIpOzAhPT1kLmxlbmd0aCYmcHQodGhpcy5fZ2V0Q2hhcnREYXRhKGMsZFswXSkpJiZmLnB1c2goIlZhbHVlIGxpc3QgbGVuZ3RoIik7Yy5kb2VzQ29udGFpbkZlYXR1cmVMaXN0TGVuZ3RoRGF0YSgpJiZmLnB1c2goIkZlYXR1cmUgbGlzdCBsZW5ndGgiKTtyZXR1cm4gZi5jb25jYXQoYy5nZXRFeHRyYUhpc3RvZ3JhbU5hbWVzKGQpKX0sYXR0YWNoZWQoKXtzZXRUaW1lb3V0KCgpPT57dGhpcy5faGFuZGxlUmVzaXplKCl9LDFFMyl9LF9jaGFydFNlbGVjdGlvbkhhc1F1YW50aWxlcyhhKXtyZXR1cm4gQXQoYSl9LF9nZXRUaXRsZShhKXtyZXR1cm4gYT8iTnVtZXJpYyI6IkNhdGVnb3JpY2FsIn0sX2dldEZlYXR1cmVOYW1lKGEpe3JldHVybiBhLmdldE5hbWUoKX0sCl9oYXNDdXN0b21TdGF0cyhhKXtyZXR1cm4gbnVsbD09YT8hMTphLmRvZXNDb250YWluQ3VzdG9tU3RhdHMoKX0sX2hhc011bHRpcGxlRGF0YXNldHMoYSl7cmV0dXJuIG51bGw9PWE/ITE6MTxhLmdldERhdGFzZXROYW1lcygpLmxlbmd0aH0sX2dldEFsbEN1c3RvbVN0YXRzKGEsYyl7Y29uc3QgZD1bXSxmPXt9O2EuZ2V0RGF0YXNldEZlYXR1cmVTdGF0aXN0aWNzKCkuZ2V0RGF0YXNldHNMaXN0KCkuZm9yRWFjaChnPT57Y29uc3QgbD1hLmdldEZlYXR1cmVJbmRleChnLmdldE5hbWUoKSxjLmdldE5hbWUoKSk7bnVsbCE9bCYmKGc9Zy5nZXRGZWF0dXJlc0xpc3QoKVtsXS5nZXRDdXN0b21TdGF0c0xpc3QoKSkmJmcuZm9yRWFjaChrPT57ZltrLmdldE5hbWUoKV18fChmW2suZ2V0TmFtZSgpXT0hMCxkLnB1c2goaykpfSl9KTtyZXR1cm4gZH0sX2dldERhdGFzZXRzKGEpe3JldHVybiBhP2EuZ2V0RGF0YXNldEZlYXR1cmVTdGF0aXN0aWNzKCkuZ2V0RGF0YXNldHNMaXN0KCk6bnVsbH0sCl9nZXRTdGF0cyhhLGMsZCl7cmV0dXJuIGEmJmMmJmQ/YS5nZXRGZWF0dXJlKGQuZ2V0TmFtZSgpLGMuZ2V0TmFtZSgpKTpudWxsfSxfZ2V0Q2hhcnREYXRhKGEsYyl7cmV0dXJuIGEmJmM/YS5nZXREYXRhc2V0SGlzdG9ncmFtc0ZvckZlYXR1cmUoYy5nZXROYW1lKCkpOltdfSxfZ2V0RmVhdHVyZUNvdW50VGV4dChhLGMsZCl7YT1hP2EuZ2V0TnVtVW5pcXVlRmVhdHVyZXNCeVR5cGUoYyk6MDtyZXR1cm4gZ3QoZC5sZW5ndGgsYSl9LF9oYXNXZWlnaHRlZEhpc3RvZ3JhbShhKXtyZXR1cm4gMD09PWEubGVuZ3RoPyExOm50KHRoaXMuX2dldENoYXJ0RGF0YSh0aGlzLmRhdGFNb2RlbCxhWzBdKSl9LF9nZXRDaGFydENsYXNzKGEpe2xldCBjPSJjaGFydC1jb2x1bW4gIjthfHwoYys9InRhYmxlLWNlbGwgIik7cmV0dXJuIGN9LF9nZXRUYWJsZVdyYXBwZXJDbGFzcyhhKXtyZXR1cm4gYSYmMCE9PWEubGVuZ3RoPyIiOiJoaWRkZW4ifSxfZ2V0VGFibGVSb3dDbGFzcyhhKXtyZXR1cm4gYT8KIm51bWVyaWMtcm93IjoiY2F0ZWdvcmljYWwtcm93In19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLXZhbGlkYXRvci1iZWhhdmlvci9pcm9uLXZhbGlkYXRvci1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvblZhbGlkYXRvckJlaGF2aW9yPXtyZWFkeTpmdW5jdGlvbigpe25ldyBQb2x5bWVyLklyb25NZXRhKHt0eXBlOiJ2YWxpZGF0b3IiLGtleTp0aGlzLmlzfHx0aGlzLmNvbnN0cnVjdG9yLmlzLHZhbHVlOnRoaXN9KX0sdmFsaWRhdGU6ZnVuY3Rpb24oKXt9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9mYWNldHMtb3ZlcnZpZXcvY29tcG9uZW50cy9mYWNldHMtb3ZlcnZpZXcvZmFjZXRzLW92ZXJ2aWV3LWZpbHRlci12YWxpZGF0b3IuaHRtbC5qcwpQb2x5bWVyKHtpczoiZmFjZXRzLW92ZXJ2aWV3LWZpbHRlci12YWxpZGF0b3IiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uVmFsaWRhdG9yQmVoYXZpb3JdLHZhbGlkYXRlOmZ1bmN0aW9uKGEpe3RyeXtyZXR1cm4gbmV3IFJlZ0V4cChhKSwhMH1jYXRjaChjKXtyZXR1cm4hMX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vZmFjZXRzLW92ZXJ2aWV3L2NvbXBvbmVudHMvZmFjZXRzLW92ZXJ2aWV3L2ZhY2V0cy1vdmVydmlldy5qcwpQb2x5bWVyKHtpczoiZmFjZXRzLW92ZXJ2aWV3Iixwcm9wZXJ0aWVzOntzZWFyY2hTdHJpbmc6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX3NvcnRPcHRpb25zOkFycmF5LF9yZXZlcnNlT3JkZXI6Qm9vbGVhbixfc29ydE9yZGVyOnt0eXBlOk51bWJlcix2YWx1ZTowfSxwcm90b0lucHV0Ont0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3VwZGF0ZSJ9LGZlYXR1cmVTbGljZVNlbGVjdGlvbjp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxjb21wYXJlTW9kZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfZGF0YU1vZGVsOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfZmVhdHVyZVNwZWNBcnJheTp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEZlYXR1cmVTcGVjQXJyYXkoX2RhdGFNb2RlbCkifSxfZmVhdHVyZVNwZWNDaGVja2JveGVzOkFycmF5fSxfZ2V0RmVhdHVyZVNwZWNBcnJheShhKXtpZighYSlyZXR1cm5bXTtjb25zdCBjPVtdO2ZvcihsZXQgZD0wOzE2PmQ7ZCsrKWMucHVzaCghMCk7CnRoaXMuX2ZlYXR1cmVTcGVjQ2hlY2tib3hlcz1jO3JldHVybiBhLmdldE5vbkVtcHR5RmVhdHVyZVNwZWNMaXN0cygpfSxfZ2V0U3BlY0NoZWNrYm94VGV4dChhKXtyZXR1cm4gcnQoYS5zcGVjKSsiKCIrYS5mZWF0dXJlcy5sZW5ndGgrIikifSxfZ2V0U3BlY0NoZWNrYm94SWQoYSl7cmV0dXJuIFN0cmluZyhhLnNwZWMpfSxfZmVhdHVyZVNwZWNDaGVjayhhKXtpZihhKXtjb25zdCBjPVtdLGQ9K2EudGFyZ2V0LmlkO2ZvcihsZXQgZj0wOzE2PmY7ZisrKWQ9PT1mP2MucHVzaChhLnRhcmdldC5jaGVja2VkKTpjLnB1c2godGhpcy5fZmVhdHVyZVNwZWNDaGVja2JveGVzW2ZdKTt0aGlzLl9mZWF0dXJlU3BlY0NoZWNrYm94ZXM9Y319LF9jb252ZXJ0SW5wdXRUb1Byb3RvKGEpe2lmKCFhfHxhLmNvbnN0cnVjdG9yPT09T2JqZWN0JiYwPT09T2JqZWN0LmtleXMoYSkubGVuZ3RoKXJldHVybiBudWxsO2lmKGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KXJldHVybiBnbShhKTtpZigic3RyaW5nIj09PQp0eXBlb2YgYXx8YSBpbnN0YW5jZW9mIFN0cmluZyl7YT1hdG9iKGEpO2NvbnN0IGM9bmV3IFVpbnQ4QXJyYXkoYS5sZW5ndGgpO2ZvcihsZXQgZD0wO2Q8YS5sZW5ndGg7ZCsrKWNbZF09YS5jaGFyQ29kZUF0KGQpO3JldHVybiBnbShjKX1yZXR1cm4gYS5jb25zdHJ1Y3Rvcj09PU9iamVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBCbC5mcm9tT2JqZWN0P0JsLmZyb21PYmplY3QoYSk6YX0sX3VwZGF0ZSgpe3RoaXMuZmVhdHVyZVNsaWNlU2VsZWN0aW9uPW51bGw7bGV0IGE7e2NvbnN0IGY9dGhpcy5fY29udmVydElucHV0VG9Qcm90byh0aGlzLnByb3RvSW5wdXQpO2lmKCFmKXt0aGlzLl9kYXRhTW9kZWw9bnVsbDtyZXR1cm59YT1uZXcgU3QoaXQoZikpfXRoaXMuc2V0KCJfc29ydE9wdGlvbnMiLFt7bmFtZToiRmVhdHVyZSBvcmRlciIsbWFwOnt9fSx7bmFtZToiTm9uLXVuaWZvcm1pdHkiLG1hcDp7fX0se25hbWU6IkFscGhhYmV0aWNhbCIsbWFwOnt9fSx7bmFtZToiQW1vdW50IG1pc3NpbmcvemVybyIsCm1hcDp7fX1dKTtjb25zdCBjPWEuZ2V0RGF0YXNldEZlYXR1cmVTdGF0aXN0aWNzKCkuZ2V0RGF0YXNldHNMaXN0KCksZD0xPGMubGVuZ3RoO2QmJnRoaXMucHVzaCgiX3NvcnRPcHRpb25zIix7bmFtZToiRGlzdHJpYnV0aW9uIGRpc3RhbmNlIixtYXA6e319KTthLmdldFVuaXF1ZUZlYXR1cmVzKCkuZm9yRWFjaCgoZixnKT0+e3RoaXMuX3NvcnRPcHRpb25zWzBdLm1hcFtmLmdldE5hbWUoKV09ZztnPWEuZ2V0RGF0YXNldEhpc3RvZ3JhbXNGb3JGZWF0dXJlKGYuZ2V0TmFtZSgpKTt0aGlzLl9zb3J0T3B0aW9uc1sxXS5tYXBbZi5nZXROYW1lKCldPWcucmVkdWNlKChsLGspPT57az1rLmhpc3RNYXAuU3RhbmRhcmQ/VXMoay5oaXN0TWFwLlN0YW5kYXJkLmdldEJ1Y2tldHNMaXN0KCkpOjE7cmV0dXJuIE1hdGgubWluKGwsayl9LDEpO3RoaXMuX3NvcnRPcHRpb25zWzJdLm1hcFtmLmdldE5hbWUoKV09Zi5nZXROYW1lKCk7dGhpcy5fc29ydE9wdGlvbnNbM10ubWFwW2YuZ2V0TmFtZSgpXT0KYy5yZWR1Y2UoKGwsayk9PntrPXRoaXMuX2dldFN0YXRzKGEsayxmKTtrPS0xKmN0KGspO3JldHVybiBNYXRoLm1pbihsLGspfSwwKTtkJiYodGhpcy5fc29ydE9wdGlvbnNbNF0ubWFwW2YuZ2V0TmFtZSgpXT0tMSpldChnKSl9LHRoaXMpO3RoaXMuX2RhdGFNb2RlbD1hfSxfZ2V0U3RhdHMoYSxjLGQpe3JldHVybiBhJiZjJiZkP2EuZ2V0RmVhdHVyZShkLmdldE5hbWUoKSxjLmdldE5hbWUoKSk6bnVsbH0sX2dldFNvcnRGdW5jdGlvbihhLGMpe2NvbnN0IGQ9dGhpcy5fc29ydE9wdGlvbnNbYV0ubWFwLGY9Yz8tMToxO3JldHVybihnLGwpPT57Zz1kW2cuZ2V0TmFtZSgpXTtsPWRbbC5nZXROYW1lKCldO3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgZ3x8InVuZGVmaW5lZCI9PXR5cGVvZiBsPzA6ZiooZzxsPy0xOjEpfX0sX2dldEZpbHRlcihhKXtpZihhKXRyeXtjb25zdCBjPW5ldyBSZWdFeHAoYSwiaSIpO3JldHVybiBkPT5jLnRlc3QoZC5nZXROYW1lKCkpfWNhdGNoKGMpe3JldHVybiBudWxsfWVsc2UgcmV0dXJuIG51bGx9LApfZ2V0TnVtZXJpY0ZlYXR1cmVMaXN0SXRlbXMoYSxjLGQsZixnKXtyZXR1cm4gdGhpcy5fZ2V0RmVhdHVyZUxpc3RJdGVtcyhhLGMsZCxmLGcsITApfSxfZ2V0Tm9uTnVtZXJpY0ZlYXR1cmVMaXN0SXRlbXMoYSxjLGQsZixnKXtyZXR1cm4gdGhpcy5fZ2V0RmVhdHVyZUxpc3RJdGVtcyhhLGMsZCxmLGcsITEpfSxfZ2V0RmVhdHVyZUxpc3RJdGVtcyhhLGMsZCxmLGcsbCl7aWYoIWEpcmV0dXJuW107Y29uc3Qgaz10aGlzLl9nZXRGaWx0ZXIoYyk7Yz1hLmdldFVuaXF1ZUZlYXR1cmVzKCk7Yz1rP2MuZmlsdGVyKG49PmsobikmJmdbYS5nZXRGZWF0dXJlU3BlY0ZvckZlYXR1cmUobi5nZXROYW1lKCkpXSk6Yy5maWx0ZXIobj0+Z1thLmdldEZlYXR1cmVTcGVjRm9yRmVhdHVyZShuLmdldE5hbWUoKSldKTtjPWMuZmlsdGVyKG49Pmw/aHQobik6IWh0KG4pKTtyZXR1cm4gYy5zbGljZSgpLnNvcnQodGhpcy5fZ2V0U29ydEZ1bmN0aW9uKGQsZikpfSxfZ2V0Q29udHJvbHNXcmFwcGVyQ2xhc3MoYSl7cmV0dXJuIWF8fAoxPj1hLmdldFVuaXF1ZUZlYXR1cmVzKCkubGVuZ3RoPyJoaWRkZW4iOiIifSxfZ2V0RGF0YXNldE5hbWUoYSxjKXtyZXR1cm4gYS5nZXREYXRhc2V0TmFtZXMoKVtjXX0sX2dldExlZ2VuZEJveFN0eWxlKGEsYyl7cmV0dXJuImJhY2tncm91bmQtY29sb3I6IithLmdldENoYXJ0Q29sb3JTdHJpbmcoYyl9LF9nZXREYXRhc2V0cyhhKXtyZXR1cm4gYT9hLmdldERhdGFzZXRGZWF0dXJlU3RhdGlzdGljcygpLmdldERhdGFzZXRzTGlzdCgpOm51bGx9LF9oYXNNdWx0aXBsZURhdGFzZXRzKGEpe3JldHVybiBudWxsPT1hPyExOjE8YS5nZXREYXRhc2V0TmFtZXMoKS5sZW5ndGh9LGdldFN0YXRzUHJvdG8oYSl7cmV0dXJuIHdxKGEpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWV4YW1wbGUtdmlld2VyL3Z6LWV4YW1wbGUtdmlld2VyLmpzCnZhciBUdDsKKGZ1bmN0aW9uKCl7Y29uc3QgYT0vXmltYWdlXC8oW15cL10rXC8pKmVuY29kZWQkLyxjPVsxLDIwXTtQb2x5bWVyKHtpczoidnotZXhhbXBsZS12aWV3ZXIiLHByb3BlcnRpZXM6e2V4YW1wbGU6e3R5cGU6T2JqZWN0fSxzZXJpYWxpemVkRXhhbXBsZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6InVwZGF0ZUV4YW1wbGUifSxzZXJpYWxpemVkU2VxRXhhbXBsZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6InVwZGF0ZVNlcUV4YW1wbGUifSxqc29uOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiY3JlYXRlRXhhbXBsZXNGcm9tSnNvbiJ9LHNhbGllbmN5Ont0eXBlOk9iamVjdCx2YWx1ZTp7fX0sc2FsaWVuY3lKc29uU3RyaW5nOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiaGF2ZVNhbGllbmN5SnNvbiJ9LHJlYWRvbmx5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNlcU51bWJlcjp7dHlwZTpOdW1iZXIsdmFsdWU6MCxvYnNlcnZlcjoibmV3U2VxTnVtIn0saXNTZXF1ZW5jZTpCb29sZWFuLGNoYW5nZUNhbGxiYWNrVGltZXI6TnVtYmVyLAppZ25vcmVDaGFuZ2U6Qm9vbGVhbixtaW5TYWw6TnVtYmVyLG1heFNhbDpOdW1iZXIsc2hvd1NhbGllbmN5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LGltYWdlSW5mbzp7dHlwZTpPYmplY3QsdmFsdWU6e319LHdpbmRvd1dpZHRoOnt0eXBlOk51bWJlcix2YWx1ZToyNTZ9LHdpbmRvd0NlbnRlcjp7dHlwZTpOdW1iZXIsdmFsdWU6MTI4fSxzYWxpZW5jeUN1dG9mZjp7dHlwZTpOdW1iZXIsdmFsdWU6MH0saGFzSW1hZ2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sYWxsb3dJbWFnZUNvbnRyb2xzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGltYWdlU2NhbGVQZXJjZW50YWdlOnt0eXBlOk51bWJlcix2YWx1ZToxMDB9LGZlYXR1cmVzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiZ2V0RmVhdHVyZXMoZXhhbXBsZSkifSxmZWF0dXJlc0xpc3Q6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJnZXRGZWF0dXJlc0xpc3QoZmVhdHVyZXMsIGNvbXBhcmVGZWF0dXJlcykifSxzZXFGZWF0dXJlczp7dHlwZTpPYmplY3QsCmNvbXB1dGVkOiJnZXRTZXFGZWF0dXJlcyhleGFtcGxlKSJ9LHNlcUZlYXR1cmVzTGlzdDp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6ImdldEZlYXR1cmVzTGlzdChzZXFGZWF0dXJlcywgY29tcGFyZVNlcUZlYXR1cmVzKSJ9LG1heFNlcU51bWJlcjp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6ImdldE1heFNlcU51bWJlcihzZXFGZWF0dXJlc0xpc3QpIn0sY29sb3JzOk9iamVjdCxoaWdobGlnaHREaWZmZXJlbmNlczp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxkaXNwbGF5TW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImdyaWQifSxmZWF0dXJlU2VhcmNoVmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG5vdGlmeTohMH0sZmlsdGVyZWRGZWF0dXJlc0xpc3Q6e3R5cGU6T2JqZWN0fSxmaWx0ZXJlZFNlcUZlYXR1cmVzTGlzdDp7dHlwZTpPYmplY3R9LGZvY3VzZWRGZWF0dXJlTmFtZTpTdHJpbmcsZm9jdXNlZEZlYXR1cmVWYWx1ZUluZGV4Ok51bWJlcixmb2N1c2VkU2VxTnVtYmVyOk51bWJlciwKc2hvd0RlbGV0ZVZhbHVlQnV0dG9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGV4cGFuZGVkRmVhdHVyZXM6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxleHBhbmRBbGxGZWF0dXJlczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx6ZXJvSW5kZXg6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGNvbXBhcmVKc29uOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiY3JlYXRlQ29tcGFyZUV4YW1wbGVzRnJvbUpzb24ifSxjb21wYXJlRXhhbXBsZTp7dHlwZTpPYmplY3R9LGNvbXBhcmVGZWF0dXJlczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6ImdldEZlYXR1cmVzKGNvbXBhcmVFeGFtcGxlKSIsb2JzZXJ2ZXI6InVwZGF0ZUNvbXBhcmVNb2RlIn0sY29tcGFyZVNlcUZlYXR1cmVzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiZ2V0U2VxRmVhdHVyZXMoY29tcGFyZUV4YW1wbGUpIixvYnNlcnZlcjoidXBkYXRlQ29tcGFyZU1vZGUifSxzb3J0T3JkZXI6e3R5cGU6U3RyaW5nLHZhbHVlOiJhdHRyaWJ1dGlvbiJ9LApjb21wYXJlTW9kZTpCb29sZWFuLGNvbXBhcmVJbWFnZUluZm86e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxjb21wYXJlVGl0bGU6U3RyaW5nfSxvYnNlcnZlcnM6WyJkaXNwbGF5U2FsaWVuY3koc2FsaWVuY3ksIGV4YW1wbGUpIiwiaGF2ZVNhbGllbmN5KGZpbHRlcmVkRmVhdHVyZXNMaXN0LCBzYWxpZW5jeSwgY29sb3JzLCBzaG93U2FsaWVuY3ksIHNhbGllbmN5Q3V0b2ZmKSIsInNlcVNhbGllbmN5KHNlcU51bWJlciwgc2VxRmVhdHVyZXNMaXN0LCBzYWxpZW5jeSwgY29sb3JzLCBzaG93U2FsaWVuY3ksIHNhbGllbmN5Q3V0b2ZmKSIsInNldEZpbHRlcmVkRmVhdHVyZXNMaXN0KGZlYXR1cmVzTGlzdCwgZmVhdHVyZVNlYXJjaFZhbHVlLCBzYWxpZW5jeSwgc29ydE9yZGVyKSIsInNldEZpbHRlcmVkU2VxRmVhdHVyZXNMaXN0KHNlcUZlYXR1cmVzTGlzdCwgZmVhdHVyZVNlYXJjaFZhbHVlLCBzYWxpZW5jeSwgc29ydE9yZGVyKSJdLGlzRXhwYW5kZWQ6ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMuZXhwYW5kQWxsRmVhdHVyZXN8fAp0aGlzLnNhbml0aXplRmVhdHVyZShkKWluIHRoaXMuZXhwYW5kZWRGZWF0dXJlc30sdXBkYXRlRXhhbXBsZTpmdW5jdGlvbigpe3RoaXMuZGVzZXJpYWxpemVFeGFtcGxlKHRoaXMuc2VyaWFsaXplZEV4YW1wbGUsamspfSx1cGRhdGVTZXFFeGFtcGxlOmZ1bmN0aW9uKCl7dGhpcy5kZXNlcmlhbGl6ZUV4YW1wbGUodGhpcy5zZXJpYWxpemVkU2VxRXhhbXBsZSx5bCl9LHN0cmluZ1RvVWludDhBcnJheTpmdW5jdGlvbihkKXtyZXR1cm4obmV3IHdpbmRvdy5UZXh0RW5jb2RlcikuZW5jb2RlKGQpfSxkZXNlcmlhbGl6ZUV4YW1wbGU6ZnVuY3Rpb24oZCxmKXt0aGlzLmlnbm9yZUNoYW5nZXx8KGQ9dGhpcy5kZWNvZGVkU3RyaW5nVG9DaGFyQ29kZXMoYXRvYihkKSksdGhpcy5leGFtcGxlPWYoZCkpfSxnZXRGZWF0dXJlczpmdW5jdGlvbihkKXt0aGlzLmltYWdlSW5mbz17fTt0aGlzLmhhc0ltYWdlPSExO2lmKG51bGw9PWQpcmV0dXJuIG5ldyBNYXAoW10pO2lmKGQgaW5zdGFuY2VvZiBnaylyZXR1cm4gdGhpcy5pc1NlcXVlbmNlPQohMSxkLmhhc0ZlYXR1cmVzKCl8fGQuc2V0RmVhdHVyZXMobmV3IEhqKSxkLmdldEZlYXR1cmVzKCkuZ2V0RmVhdHVyZU1hcCgpO3RoaXMuaXNTZXF1ZW5jZT0hMDtkLmhhc0NvbnRleHQoKXx8ZC5zZXRDb250ZXh0KG5ldyBIaik7cmV0dXJuIGQuZ2V0Q29udGV4dCgpLmdldEZlYXR1cmVNYXAoKX0sZ2V0RmVhdHVyZXNMaXN0OmZ1bmN0aW9uKGQsZil7aWYobnVsbD09ZClyZXR1cm5bXTtjb25zdCBnPVtdLGw9e307bGV0IGs9ZC5rZXlzKCk7aWYoayl7bGV0IG49ay5uZXh0KCk7Zm9yKDshbi5kb25lOylnLnB1c2goe25hbWU6bi52YWx1ZSxmZWF0dXJlOmQuZ2V0KG4udmFsdWUpfSksbFtuLnZhbHVlXT0hMCxuPWsubmV4dCgpfWlmKG51bGw9PWYpcmV0dXJuIGc7aWYoaz1mLmtleXMoKSlmb3IoZD1rLm5leHQoKTshZC5kb25lOylkLnZhbHVlIGluIGx8fChnLnB1c2goe25hbWU6ZC52YWx1ZSxmZWF0dXJlOmYuZ2V0KGQudmFsdWUpfSksbFtkLnZhbHVlXT0hMCksZD1rLm5leHQoKTsKcmV0dXJuIGd9LGdldFNlcUZlYXR1cmVzOmZ1bmN0aW9uKGQpe3JldHVybiBudWxsPT1kfHxkIGluc3RhbmNlb2YgZ2s/bmV3IE1hcChbXSk6dGhpcy5leGFtcGxlLmdldEZlYXR1cmVMaXN0cygpLmdldEZlYXR1cmVMaXN0TWFwKCl9LHNldEZpbHRlcmVkRmVhdHVyZXNMaXN0OmZ1bmN0aW9uKGQsZixnLGwpe3RoaXMuZmlsdGVyZWRGZWF0dXJlc0xpc3Q9W107dGhpcy5maWx0ZXJlZEZlYXR1cmVzTGlzdD10aGlzLmdldEZpbHRlcmVkRmVhdHVyZXNMaXN0KGQsZixnLGwpfSxzZXRGaWx0ZXJlZFNlcUZlYXR1cmVzTGlzdDpmdW5jdGlvbihkLGYsZyxsKXt0aGlzLmZpbHRlcmVkU2VxRmVhdHVyZXNMaXN0PVtdO3RoaXMuZmlsdGVyZWRTZXFGZWF0dXJlc0xpc3Q9dGhpcy5nZXRGaWx0ZXJlZEZlYXR1cmVzTGlzdChkLGYsZyxsKX0sZ2V0RmlsdGVyZWRGZWF0dXJlc0xpc3Q6ZnVuY3Rpb24oZCxmLGcsbCl7aWYobnVsbCE9ZCl7dmFyIGs9ZCxuPWcmJjA8T2JqZWN0LmtleXMoZykubGVuZ3RoJiYKImFscGhhYmV0aWNhbCIhPWwscD1uP09iamVjdC5hc3NpZ24oe30sLi4uT2JqZWN0LmtleXMoZykubWFwKHE9Pih7W3FdOiJudW1iZXIiPT10eXBlb2YgZ1txXT9nW3FdOmdbcV0ucmVkdWNlKChyLHQpPT5yK3QsMCl9KSkpOnt9O2lmKCIiIT1mKXtjb25zdCBxPW5ldyBSZWdFeHAoZiwiaSIpO2s9ZC5maWx0ZXIocj0+cS50ZXN0KHIubmFtZSkpfXJldHVybiBrLnNvcnQoKHEscik9PntpZih0aGlzLmlzSW1hZ2UocS5uYW1lKSYmIXRoaXMuaXNJbWFnZShyLm5hbWUpKXJldHVybi0xO2lmKHRoaXMuaXNJbWFnZShyLm5hbWUpJiYhdGhpcy5pc0ltYWdlKHEubmFtZSkpcmV0dXJuIDE7aWYobil7aWYocS5uYW1lIGluIGcmJiEoci5uYW1lIGluIGcpKXJldHVybi0xO2lmKHIubmFtZSBpbiBnJiYhKHEubmFtZSBpbiBnKSlyZXR1cm4gMTt7Y29uc3QgdD0iYXR0cmlidXRpb24iPT1sP3Bbci5uYW1lXS1wW3EubmFtZV06InJldmVyc2UtYXR0cmlidXRpb24iPT1sP3BbcS5uYW1lXS1wW3IubmFtZV06Ck1hdGguYWJzKHBbci5uYW1lXSktTWF0aC5hYnMocFtxLm5hbWVdKTtpZigwIT10KXJldHVybiB0fX1yZXR1cm4gcS5uYW1lLmxvY2FsZUNvbXBhcmUoci5uYW1lKX0pfX0sZ2V0TWF4U2VxTnVtYmVyOmZ1bmN0aW9uKCl7bGV0IGQ9LTE7Zm9yKGNvbnN0IGYgb2YgdGhpcy5zZXFGZWF0dXJlc0xpc3Qpe2NvbnN0IGc9Zi5mZWF0dXJlO2cmJmcuZ2V0RmVhdHVyZUxpc3QoKS5sZW5ndGgtMT5kJiYoZD1nLmdldEZlYXR1cmVMaXN0KCkubGVuZ3RoLTEpfXJldHVybiBkfSxoYXZlU2FsaWVuY3lKc29uOmZ1bmN0aW9uKCl7dGhpcy5zYWxpZW5jeT1KU09OLnBhcnNlKHRoaXMuc2FsaWVuY3lKc29uU3RyaW5nKX0sc2VsZWN0QWxsOmZ1bmN0aW9uKGQpe3JldHVybiBkMy5zZWxlY3RBbGwoUG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKGQpKX0sZGlzcGxheVNhbGllbmN5OmZ1bmN0aW9uKGQpe2NvbnN0IGY9T2JqZWN0LmtleXMoZCksZz17fTtmb3IobGV0IGw9MDtsPApmLmxlbmd0aDtsKyspe2NvbnN0IGs9ZltsXTtsZXQgbj1kW2tdO0FycmF5LmlzQXJyYXkobil8fChuPVtuXSk7Z1trXT17ZmxvYXRMaXN0Ont2YWx1ZTpuLm1hcChwPT5kMy5mb3JtYXQoIi40ZiIpKHApKX19fXRoaXMuY29tcGFyZUpzb249dGhpcy5zYWxpZW5jeUpzb249e2ZlYXR1cmVzOntmZWF0dXJlOmd9fX0saGF2ZVNhbGllbmN5OmZ1bmN0aW9uKCl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLl9oYXZlU2FsaWVuY3lJbXBsKCkpfSxfdXNlTGlnaHRDb2xvcihkKXtkPShkLXRoaXMubWluU2FsKS8odGhpcy5tYXhTYWwtdGhpcy5taW5TYWwpO3JldHVybiAwPnRoaXMubWluU2FsJiYwPHRoaXMubWF4U2FsPy4zPmR8fC43PGQ6MD50aGlzLm1pblNhbD8uNj5kOi40PGR9LF9oYXZlU2FsaWVuY3lJbXBsOmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RBbGwoIi52YWx1ZS1waWxsIikuc3R5bGUoImJhY2tncm91bmQiLCIjZmZmIikuYXR0cigidGl0bGUiLCIiKS5zdHlsZSgiY29sb3IiLAoiIzNjNDA0MyIpO2lmKHRoaXMuZmlsdGVyZWRGZWF0dXJlc0xpc3QmJnRoaXMuc2FsaWVuY3kmJjAhPT1PYmplY3Qua2V5cyh0aGlzLnNhbGllbmN5KS5sZW5ndGgmJnRoaXMuY29sb3JzKWZvcihjb25zdCBmIG9mIHRoaXMuZmlsdGVyZWRGZWF0dXJlc0xpc3Qpe2NvbnN0IGc9dGhpcy5zYWxpZW5jeVtmLm5hbWVdO2lmKG51bGwhPWcpe3ZhciBkPUFycmF5LmlzQXJyYXkoZyk/KGwsayk9PnRoaXMuZ2V0Q29sb3JGb3JTYWxpZW5jeShnW2tdKTooKT0+dGhpcy5nZXRDb2xvckZvclNhbGllbmN5KGcpO3RoaXMuc2VsZWN0QWxsKGAuJHt0aGlzLnNhbml0aXplRmVhdHVyZShmLm5hbWUpfS52YWx1ZS1waWxsYCkuc3R5bGUoImJhY2tncm91bmQiLHRoaXMuc2hvd1NhbGllbmN5P2Q6KCk9PiIjZmZmIikuYXR0cigidGl0bGUiLChsLGspPT4iQXR0cmlidXRpb246ICIrZDMuZm9ybWF0KCIuNGYiKShBcnJheS5pc0FycmF5KGcpP2dba106ZykpLnN0eWxlKCJjb2xvciIsKGwsayk9PnRoaXMuX3VzZUxpZ2h0Q29sb3IoQXJyYXkuaXNBcnJheShnKT8KZ1trXTpnKT8iI2ZmZiI6IiMzYzQwNDMiKTtpZihBcnJheS5pc0FycmF5KGcpKXtkPWc7Y29uc3QgbD10aGlzLnNlbGVjdEFsbChgcGFwZXItYnV0dG9uLiR7dGhpcy5zYW5pdGl6ZUZlYXR1cmUoZi5uYW1lKX0udmFsdWUtcGlsbGApO2xldCBrPTA7Zm9yKGxldCBuPTE7bjxkLmxlbmd0aDtuKyspTWF0aC5hYnMoZFtuXSk+TWF0aC5hYnMoaykmJihrPWRbbl0pO2wuc3R5bGUoImJhY2tncm91bmQiLHRoaXMuc2hvd1NhbGllbmN5PygpPT50aGlzLmdldENvbG9yRm9yU2FsaWVuY3koayk6KCk9PiIjZmZmIil9fX19LG5ld1NlcU51bTpmdW5jdGlvbigpe3RoaXMuc2VxU2FsaWVuY3koKX0sc2VxU2FsaWVuY3k6ZnVuY3Rpb24oKXtpZih0aGlzLnNlcUZlYXR1cmVzTGlzdCYmdGhpcy5zYWxpZW5jeSYmMCE9PU9iamVjdC5rZXlzKHRoaXMuc2FsaWVuY3kpLmxlbmd0aCYmdGhpcy5jb2xvcnMpaWYodGhpcy5zZWxlY3RBbGwoIi52YWx1ZSBpbnB1dCIpLnNpemUoKTx0aGlzLnNlcUZlYXR1cmVzTGlzdC5sZW5ndGgpcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT4KdGhpcy5zZXFTYWxpZW5jeSgpKTtlbHNlIGZvcihjb25zdCBmIG9mIHRoaXMuc2VxRmVhdHVyZXNMaXN0KXt2YXIgZD10aGlzLnNhbGllbmN5W2YubmFtZV07aWYoIWQpY29udGludWU7Y29uc3QgZz1kW3RoaXMuc2VxTnVtYmVyXTtkPUFycmF5LmlzQXJyYXkoZyk/KGwsayk9PnRoaXMuZ2V0Q29sb3JGb3JTYWxpZW5jeShnW2tdKTooKT0+dGhpcy5nZXRDb2xvckZvclNhbGllbmN5KGcpO3RoaXMuc2VsZWN0QWxsKGAuJHt0aGlzLnNhbml0aXplRmVhdHVyZShmLm5hbWUpfSBpbnB1dGApLnN0eWxlKCJjb2xvciIsdGhpcy5zaG93U2FsaWVuY3k/ZDooKT0+ImJsYWNrIil9fSxnZXRGZWF0dXJlVmFsdWVzOmZ1bmN0aW9uKGQsZixnLGwpe3JldHVybihkPWw/dGhpcy5jb21wYXJlRmVhdHVyZXMuZ2V0KGQpOnRoaXMuZmVhdHVyZXMuZ2V0KGQpKT9kLmdldEJ5dGVzTGlzdCgpP2Y/ZC5nZXRCeXRlc0xpc3QoKS5nZXRWYWx1ZUxpc3QoKS5zbGljZSgpOmQuZ2V0Qnl0ZXNMaXN0KCkuZ2V0VmFsdWVMaXN0X2FzVTgoKS5tYXAoaz0+CnRoaXMuZGVjb2RlQnl0ZXNMaXN0U3RyaW5nKGssZykpOmQuZ2V0SW50NjRMaXN0KCk/ZC5nZXRJbnQ2NExpc3QoKS5nZXRWYWx1ZUxpc3QoKS5zbGljZSgpOmQuZ2V0RmxvYXRMaXN0KCk/ZC5nZXRGbG9hdExpc3QoKS5nZXRWYWx1ZUxpc3QoKS5zbGljZSgpOltdOltdfSxnZXRDb21wYXJlRmVhdHVyZVZhbHVlczpmdW5jdGlvbihkLGYsZyl7cmV0dXJuIHRoaXMuZ2V0RmVhdHVyZVZhbHVlcyhkLGYsZywhMCl9LGdldEZpcnN0RmVhdHVyZVZhbHVlOmZ1bmN0aW9uKGQpe3JldHVybiB0aGlzLmdldEZlYXR1cmVWYWx1ZXMoZClbMF19LGdldEZpcnN0Q29tcGFyZUZlYXR1cmVWYWx1ZTpmdW5jdGlvbihkKXtyZXR1cm4gdGhpcy5nZXRDb21wYXJlRmVhdHVyZVZhbHVlcyhkKVswXX0sZmVhdHVyZUhhc011bHRpcGxlVmFsdWVzOmZ1bmN0aW9uKGQpe3JldHVybiAxPHRoaXMuZ2V0RmVhdHVyZVZhbHVlcyhkKS5sZW5ndGh9LGNvbXBhcmVGZWF0dXJlSGFzTXVsdGlwbGVWYWx1ZXM6ZnVuY3Rpb24oZCl7cmV0dXJuIDE8CnRoaXMuZ2V0Q29tcGFyZUZlYXR1cmVWYWx1ZXMoZCkubGVuZ3RofSxnZXRTZXFGZWF0dXJlVmFsdWVzOmZ1bmN0aW9uKGQsZixnLGwsayl7ZD1rP3RoaXMuY29tcGFyZVNlcUZlYXR1cmVzLmdldChkKTp0aGlzLnNlcUZlYXR1cmVzLmdldChkKTtpZighZClyZXR1cm5bXTtkPWQuZ2V0RmVhdHVyZUxpc3QoKTtyZXR1cm4hZHx8ZC5sZW5ndGg8PWY/W106KGY9ZFtmXSk/Zi5nZXRCeXRlc0xpc3QoKT9nP2YuZ2V0Qnl0ZXNMaXN0KCkuZ2V0VmFsdWVMaXN0KCk6Zi5nZXRCeXRlc0xpc3QoKS5nZXRWYWx1ZUxpc3RfYXNVOCgpLm1hcChuPT50aGlzLmRlY29kZUJ5dGVzTGlzdFN0cmluZyhuLGwpKTpmLmdldEludDY0TGlzdCgpP2YuZ2V0SW50NjRMaXN0KCkuZ2V0VmFsdWVMaXN0KCk6Zi5nZXRGbG9hdExpc3QoKT9mLmdldEZsb2F0TGlzdCgpLmdldFZhbHVlTGlzdCgpOltdOltdfSxnZXRDb21wYXJlU2VxRmVhdHVyZVZhbHVlczpmdW5jdGlvbihkLGYsZyxsKXtyZXR1cm4gdGhpcy5nZXRTZXFGZWF0dXJlVmFsdWVzKGQsCmYsZyxsLCEwKX0sZ2V0Rmlyc3RTZXFGZWF0dXJlVmFsdWU6ZnVuY3Rpb24oZCxmKXtyZXR1cm4gdGhpcy5nZXRTZXFGZWF0dXJlVmFsdWVzKGQsZilbMF19LGdldEZpcnN0U2VxQ29tcGFyZUZlYXR1cmVWYWx1ZTpmdW5jdGlvbihkLGYpe3JldHVybiB0aGlzLmdldENvbXBhcmVTZXFGZWF0dXJlVmFsdWVzKGQsZilbMF19LHNlcUZlYXR1cmVIYXNNdWx0aXBsZVZhbHVlczpmdW5jdGlvbihkLGYpe3JldHVybiAxPHRoaXMuZ2V0U2VxRmVhdHVyZVZhbHVlcyhkLGYpLmxlbmd0aH0sY29tcGFyZVNlcUZlYXR1cmVIYXNNdWx0aXBsZVZhbHVlczpmdW5jdGlvbihkLGYpe3JldHVybiAxPHRoaXMuZ2V0Q29tcGFyZVNlcUZlYXR1cmVWYWx1ZXMoZCxmKS5sZW5ndGh9LGRlY29kZUJ5dGVzTGlzdFN0cmluZzpmdW5jdGlvbihkLGYpe3JldHVybiAzMjc2OEUzPGQubGVuZ3RoPyJTdHJpbmcgdG9vIGxhcmdlIHRvIGRpc3BsYXkiOmY/dGhpcy5kZWNvZGVCeXRlc0xpc3RUb1N0cmluZyhkKToobmV3IHdpbmRvdy5UZXh0RGVjb2RlcikuZGVjb2RlKGQpfSwKaXNCeXRlc0ZlYXR1cmU6ZnVuY3Rpb24oZCl7Y29uc3QgZj10aGlzLmZlYXR1cmVzLmdldChkKTtyZXR1cm4gZiYmZi5oYXNCeXRlc0xpc3QoKT8hMDooZD10aGlzLnNlcUZlYXR1cmVzLmdldChkKSkmJmQuZ2V0RmVhdHVyZUxpc3QoKVswXS5oYXNCeXRlc0xpc3QoKT8hMDohMX0sZ2V0SnNvbkZlYXR1cmU6ZnVuY3Rpb24oZCl7aWYoIXRoaXMuanNvbilyZXR1cm4gbnVsbDtpZih0aGlzLmpzb24uZmVhdHVyZXMmJnRoaXMuanNvbi5mZWF0dXJlcy5mZWF0dXJlKXt2YXIgZj10aGlzLmpzb24uZmVhdHVyZXMuZmVhdHVyZVtkXTtpZihmKXJldHVybiBmfXJldHVybiB0aGlzLmpzb24uY29udGV4dCYmdGhpcy5qc29uLmNvbnRleHQuZmVhdHVyZSYmKGY9dGhpcy5qc29uLmNvbnRleHQuZmVhdHVyZVtkXSk/Zjp0aGlzLmpzb24uZmVhdHVyZUxpc3RzJiZ0aGlzLmpzb24uZmVhdHVyZUxpc3RzLmZlYXR1cmVMaXN0P3RoaXMuanNvbi5mZWF0dXJlTGlzdHMuZmVhdHVyZUxpc3RbZF06bnVsbH0sCmdldEpzb25WYWx1ZUxpc3Q6ZnVuY3Rpb24oZCxmKXtkPXRoaXMuZ2V0SnNvbkZlYXR1cmUoZCk7aWYoIWQpcmV0dXJuIG51bGw7aXNOYU4oZil8fChkPWQuZmVhdHVyZVtmXSk7cmV0dXJuKGY9ZC5ieXRlc0xpc3R8fGQuaW50NjRMaXN0fHxkLmZsb2F0TGlzdCk/Zi52YWx1ZTpudWxsfSxnZXREYXRhRnJvbUVsZW06ZnVuY3Rpb24oZCl7Zm9yKDtudWxsPT1kLmRhdGFGZWF0dXJlOyl7aWYoIWQucGFyZW50RWxlbWVudCl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgYW5jZXN0b3IgY29udHJvbCBlbGVtZW50Iik7ZD1kLnBhcmVudEVsZW1lbnR9cmV0dXJue2ZlYXR1cmU6ZC5kYXRhRmVhdHVyZSx2YWx1ZUluZGV4OmQuZGF0YUluZGV4LHNlcU51bTpkLmRhdGFTZXFOdW19fSxnZXREYXRhRnJvbUV2ZW50OmZ1bmN0aW9uKGQpe3JldHVybiB0aGlzLmdldERhdGFGcm9tRWxlbShkLnRhcmdldCl9LGdldEZlYXR1cmVGcm9tRGF0YTpmdW5jdGlvbihkKXtpZihpc05hTihkLnNlcU51bSkpcmV0dXJuIHRoaXMuZmVhdHVyZXMuZ2V0KGQuZmVhdHVyZSk7CnZhciBmPXRoaXMuc2VxRmVhdHVyZXMuZ2V0KGQuZmVhdHVyZSk7aWYoZilyZXR1cm4oZj1mLmdldEZlYXR1cmVMaXN0KCkpP2ZbZC5zZXFOdW1dOnZvaWQgMH0sZ2V0VmFsdWVMaXN0RnJvbURhdGE6ZnVuY3Rpb24oZCl7cmV0dXJuIGlzTmFOKGQuc2VxTnVtKT90aGlzLmdldEZlYXR1cmVWYWx1ZXMoZC5mZWF0dXJlLCEwKTp0aGlzLmdldFNlcUZlYXR1cmVWYWx1ZXMoZC5mZWF0dXJlLGQuc2VxTnVtLCEwKX0sc2V0RmVhdHVyZVZhbHVlczpmdW5jdGlvbihkLGYpe2NvbnN0IGc9ZC5nZXRCeXRlc0xpc3QoKSxsPWQuZ2V0SW50NjRMaXN0KCk7ZD1kLmdldEZsb2F0TGlzdCgpO2c/Zy5zZXRWYWx1ZUxpc3QoZik6bD9sLnNldFZhbHVlTGlzdChmKTpkJiZkLnNldFZhbHVlTGlzdChmKX0sb25WYWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oZCl7Y29uc3QgZj1kLnRhcmdldDtkPXRoaXMuZ2V0RGF0YUZyb21FdmVudChkKTtjb25zdCBnPXRoaXMuZ2V0RmVhdHVyZUZyb21EYXRhKGQpLGw9dGhpcy5nZXRWYWx1ZUxpc3RGcm9tRGF0YShkKTsKaWYoZyl7aWYodGhpcy5pc0J5dGVzRmVhdHVyZShkLmZlYXR1cmUpKXt2YXIgaz10aGlzLnN0cmluZ1RvVWludDhBcnJheShmLnZhbHVlKTtsW2QudmFsdWVJbmRleF09azsoaz10aGlzLmdldEpzb25WYWx1ZUxpc3QoZC5mZWF0dXJlLGQuc2VxTnVtKSkmJihrW2QudmFsdWVJbmRleF09YnRvYShmLnZhbHVlKSl9ZWxzZSBsW2QudmFsdWVJbmRleF09K2YudmFsdWUsKGs9dGhpcy5nZXRKc29uVmFsdWVMaXN0KGQuZmVhdHVyZSxkLnNlcU51bSkpJiYoa1tkLnZhbHVlSW5kZXhdPStmLnZhbHVlKTt0aGlzLnNldEZlYXR1cmVWYWx1ZXMoZyxsKTt0aGlzLmV4YW1wbGVDaGFuZ2VkKCl9fSxvbklucHV0Rm9jdXM6ZnVuY3Rpb24oZCl7Y29uc3QgZj1kLnRhcmdldDtkPXRoaXMuZ2V0RGF0YUZyb21FdmVudChkKTt0aGlzLmZvY3VzZWRGZWF0dXJlTmFtZT1kLmZlYXR1cmU7dGhpcy5mb2N1c2VkRmVhdHVyZVZhbHVlSW5kZXg9ZC52YWx1ZUluZGV4O3RoaXMuZm9jdXNlZFNlcU51bWJlcj1kLnNlcU51bTsKdGhpcy4kLmRlbGV0ZXZhbHVlLnN0eWxlLnRvcD1mLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcC10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcC0yNSsicHgiO3RoaXMuJC5kZWxldGV2YWx1ZS5zdHlsZS5yaWdodD10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0LWYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQrMzArInB4Ijt0aGlzLnNob3dEZWxldGVWYWx1ZUJ1dHRvbj0hMH0sb25JbnB1dEJsdXI6ZnVuY3Rpb24oKXt0aGlzLnNob3dEZWxldGVWYWx1ZUJ1dHRvbj0hMX0sZGVsZXRlRmVhdHVyZTpmdW5jdGlvbihkKXtkPXRoaXMuZ2V0RGF0YUZyb21FdmVudChkKTt0aGlzLmZlYXR1cmVzLmRlbCYmdGhpcy5mZWF0dXJlcy5kZWwoZC5mZWF0dXJlKTt0aGlzLnNlcUZlYXR1cmVzLmRlbCYmdGhpcy5zZXFGZWF0dXJlcy5kZWwoZC5mZWF0dXJlKTt0aGlzLmRlbGV0ZUpzb25GZWF0dXJlKGQuZmVhdHVyZSk7dGhpcy5leGFtcGxlQ2hhbmdlZCgpOwp0aGlzLnJlZnJlc2hFeGFtcGxlVmlld2VyKCl9LGRlbGV0ZUpzb25GZWF0dXJlOmZ1bmN0aW9uKGQpe3RoaXMuanNvbiYmKHRoaXMuanNvbi5mZWF0dXJlcyYmdGhpcy5qc29uLmZlYXR1cmVzLmZlYXR1cmUmJmRlbGV0ZSB0aGlzLmpzb24uZmVhdHVyZXMuZmVhdHVyZVtkXSx0aGlzLmpzb24uY29udGV4dCYmdGhpcy5qc29uLmNvbnRleHQuZmVhdHVyZSYmZGVsZXRlIHRoaXMuanNvbi5jb250ZXh0LmZlYXR1cmVbZF0sdGhpcy5qc29uLmZlYXR1cmVMaXN0cyYmdGhpcy5qc29uLmZlYXR1cmVMaXN0cy5mZWF0dXJlTGlzdCYmZGVsZXRlIHRoaXMuanNvbi5mZWF0dXJlTGlzdHMuZmVhdHVyZUxpc3RbZF0pfSxkZWxldGVWYWx1ZTpmdW5jdGlvbihkKXtkPXRoaXMuZ2V0RGF0YUZyb21FdmVudChkKTtjb25zdCBmPXRoaXMuZ2V0RmVhdHVyZUZyb21EYXRhKGQpLGc9dGhpcy5nZXRWYWx1ZUxpc3RGcm9tRGF0YShkKTtpZihmKXtpZih0aGlzLmlzQnl0ZXNGZWF0dXJlKGQuZmVhdHVyZSkpe2NvbnN0IGw9CnRoaXMuZ2V0SnNvblZhbHVlTGlzdChkLmZlYXR1cmUsZC5zZXFOdW0pO2wmJmwuc3BsaWNlKGQudmFsdWVJbmRleCwxKX1nLnNwbGljZShkLnZhbHVlSW5kZXgsMSk7dGhpcy5zZXRGZWF0dXJlVmFsdWVzKGYsZyk7dGhpcy5leGFtcGxlQ2hhbmdlZCgpO3RoaXMucmVmcmVzaEV4YW1wbGVWaWV3ZXIoKX19LG9wZW5BZGRGZWF0dXJlRGlhbG9nOmZ1bmN0aW9uKCl7dGhpcy4kLmFkZEZlYXR1cmVEaWFsb2cub3BlbigpfSxhZGRGZWF0dXJlOmZ1bmN0aW9uKCl7aWYodGhpcy5qc29uKXt2YXIgZD1uZXcgRmo7aWYoImludCI9PT10aGlzLm5ld0ZlYXR1cmVUeXBlKXt2YXIgZj1bXTt2YXIgZz1uZXcgRGo7Zy5zZXRWYWx1ZUxpc3QoZik7ZC5zZXRJbnQ2NExpc3QoZyk7Zj17aW50NjRMaXN0Ont2YWx1ZTpmfX19ZWxzZSJmbG9hdCI9PT10aGlzLm5ld0ZlYXR1cmVUeXBlPyhmPVtdLGc9bmV3IEJqLGcuc2V0VmFsdWVMaXN0KGYpLGQuc2V0RmxvYXRMaXN0KGcpLGY9e2Zsb2F0TGlzdDp7dmFsdWU6Zn19KToKKGY9W10sZz1uZXcgbmksZy5zZXRWYWx1ZUxpc3QoZiksZC5zZXRCeXRlc0xpc3QoZyksZj17Ynl0ZXNMaXN0Ont2YWx1ZTpmfX0pO3RoaXMuZmVhdHVyZXMuc2V0KHRoaXMubmV3RmVhdHVyZU5hbWUsZCk7dGhpcy5hZGRKc29uRmVhdHVyZSh0aGlzLm5ld0ZlYXR1cmVOYW1lLGYpO3RoaXMubmV3RmVhdHVyZU5hbWU9IiI7dGhpcy5leGFtcGxlQ2hhbmdlZCgpO3RoaXMucmVmcmVzaEV4YW1wbGVWaWV3ZXIoKX19LGFkZEpzb25GZWF0dXJlOmZ1bmN0aW9uKGQsZil7dGhpcy5qc29uJiZ0aGlzLmpzb24uZmVhdHVyZXMmJnRoaXMuanNvbi5mZWF0dXJlcy5mZWF0dXJlP3RoaXMuanNvbi5mZWF0dXJlcy5mZWF0dXJlW2RdPWY6dGhpcy5qc29uJiZ0aGlzLmpzb24uY29udGV4dCYmdGhpcy5qc29uLmNvbnRleHQuZmVhdHVyZSYmKHRoaXMuanNvbi5jb250ZXh0LmZlYXR1cmVbZF09Zil9LGFkZFZhbHVlOmZ1bmN0aW9uKGQpe2Q9dGhpcy5nZXREYXRhRnJvbUV2ZW50KGQpO2NvbnN0IGY9CnRoaXMuZ2V0RmVhdHVyZUZyb21EYXRhKGQpLGc9dGhpcy5nZXRWYWx1ZUxpc3RGcm9tRGF0YShkKTtmJiYodGhpcy5pc0J5dGVzRmVhdHVyZShkLmZlYXR1cmUpP2cucHVzaCgiIik6Zy5wdXNoKDApLHRoaXMuc2V0RmVhdHVyZVZhbHVlcyhmLGcpLHRoaXMuZXhhbXBsZUNoYW5nZWQoKSx0aGlzLnJlZnJlc2hFeGFtcGxlVmlld2VyKCkpfSxyZWZyZXNoRXhhbXBsZVZpZXdlcjpmdW5jdGlvbigpe2NvbnN0IGQ9dGhpcy5leGFtcGxlO3RoaXMuaWdub3JlQ2hhbmdlPSEwO3RoaXMuZXhhbXBsZT1uZXcgZ2s7dGhpcy5pZ25vcmVDaGFuZ2U9ITE7c2V0VGltZW91dCgoKT0+e3RoaXMuZXhhbXBsZT1kO3RoaXMuaGF2ZVNhbGllbmN5KCl9LDApfSxleGFtcGxlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZmlyZSgiZXhhbXBsZS1jaGFuZ2UiLHtleGFtcGxlOnRoaXMuZXhhbXBsZX0pO2NsZWFyVGltZW91dCh0aGlzLmNoYW5nZUNhbGxiYWNrVGltZXIpO3RoaXMuY2hhbmdlQ2FsbGJhY2tUaW1lcj0Kc2V0VGltZW91dCh0aGlzLmNoYW5nZUNhbGxiYWNrLmJpbmQodGhpcyksMUUzKX0sY2hhbmdlQ2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLmlnbm9yZUNoYW5nZT0hMDt0aGlzLmlzU2VxdWVuY2UmJnRoaXMuc2VyaWFsaXplZFNlcUV4YW1wbGU/dGhpcy5zZXJpYWxpemVkU2VxRXhhbXBsZT1idG9hKHRoaXMuZGVjb2RlQnl0ZXNMaXN0U3RyaW5nKHRoaXMuZXhhbXBsZS5zZXJpYWxpemVCaW5hcnkoKSwhMCkpOnRoaXMuc2VyaWFsaXplZEV4YW1wbGUmJih0aGlzLnNlcmlhbGl6ZWRFeGFtcGxlPWJ0b2EodGhpcy5kZWNvZGVCeXRlc0xpc3RTdHJpbmcodGhpcy5leGFtcGxlLnNlcmlhbGl6ZUJpbmFyeSgpLCEwKSkpO3RoaXMuaWdub3JlQ2hhbmdlPSExfSxnZXRJbnB1dFBpbGxDbGFzczpmdW5jdGlvbihkLGYpe3JldHVybiB0aGlzLnNhbml0aXplRmVhdHVyZShkKSsiIHZhbHVlLXBpbGwiKygiZ3JpZCI9PWY/IiB2YWx1ZS1waWxsLWdyaWQiOiIgdmFsdWUtcGlsbC1zdGFja2VkIil9LApnZXRDb21wYXJlSW5wdXRDbGFzczpmdW5jdGlvbihkLGYsZyl7Zj0idmFsdWUtY29tcGFyZSIrKCJncmlkIj09Zj8iIHZhbHVlLXBpbGwtZ3JpZCI6IiB2YWx1ZS1waWxsLXN0YWNrZWQiKTtpZihudWxsIT1nKXtjb25zdCBsPXRoaXMuZ2V0RmVhdHVyZVZhbHVlcyhkLCEwKTtkPXRoaXMuZ2V0Q29tcGFyZUZlYXR1cmVWYWx1ZXMoZCwhMCk7Zj10aGlzLmhpZ2hsaWdodERpZmZlcmVuY2VzJiYoZz49bC5sZW5ndGh8fGc+PWQubGVuZ3RofHxsW2ddIT1kW2ddKT9mKyIgdmFsdWUtZGlmZmVyZW50IjpmKyIgdmFsdWUtc2FtZSJ9cmV0dXJuIGZ9LGdldFNlcUNvbXBhcmVJbnB1dENsYXNzOmZ1bmN0aW9uKGQsZixnLGwpe2Y9InZhbHVlLWNvbXBhcmUiKygiZ3JpZCI9PWY/IiB2YWx1ZS1waWxsLWdyaWQiOiIgdmFsdWUtcGlsbC1zdGFja2VkIik7aWYobnVsbCE9bCl7Y29uc3Qgaz10aGlzLmdldFNlcUZlYXR1cmVWYWx1ZXMoZCxnLCEwKTtkPXRoaXMuZ2V0Q29tcGFyZVNlcUZlYXR1cmVWYWx1ZXMoZCwKZywhMCk7Zj1sPj1rLmxlbmd0aHx8bD49ZC5sZW5ndGh8fGtbbF0hPWRbbF0/ZisiIHZhbHVlLWRpZmZlcmVudCI6ZisiIHZhbHVlLXNhbWUifXJldHVybiBmfSxzYW5pdGl6ZUZlYXR1cmU6ZnVuY3Rpb24oZCl7ZD1kLnRyaW0oKTtkLm1hdGNoKC9eW0EtWmEtel0uKiQvKXx8KGQ9Il8iK2QpO3JldHVybiBkLnJlcGxhY2UoL1tcL1wuI1xzXS9nLCJfIil9LGlzU2VxRXhhbXBsZTpmdW5jdGlvbihkKXtyZXR1cm4gMDw9ZH0saXNJbWFnZTpmdW5jdGlvbihkKXtyZXR1cm4gYS50ZXN0KGQpfSxnZXRJbWFnZVNyYzpmdW5jdGlvbihkKXt0aGlzLnNldHVwT25sb2FkQ2FsbGJhY2soZCk7cmV0dXJuIHRoaXMuZ2V0SW1hZ2VTcmNGb3JEYXRhKGQsdGhpcy5nZXRGZWF0dXJlVmFsdWVzKGQsITEsITApWzBdKX0sZ2V0Q29tcGFyZUltYWdlU3JjOmZ1bmN0aW9uKGQpe3RoaXMuc2V0dXBPbmxvYWRDYWxsYmFjayhkLCEwKTtyZXR1cm4gdGhpcy5nZXRJbWFnZVNyY0ZvckRhdGEoZCx0aGlzLmdldENvbXBhcmVGZWF0dXJlVmFsdWVzKGQsCiExLCEwKVswXSwhMCl9LGdldFNlcUltYWdlU3JjOmZ1bmN0aW9uKGQsZil7dGhpcy5zZXR1cE9ubG9hZENhbGxiYWNrKGQpO3JldHVybiB0aGlzLmdldEltYWdlU3JjRm9yRGF0YShkLHRoaXMuZ2V0U2VxRmVhdHVyZVZhbHVlcyhkLGYsITEsITApWzBdKX0sZ2V0Q29tcGFyZVNlcUltYWdlU3JjOmZ1bmN0aW9uKGQsZil7dGhpcy5zZXR1cE9ubG9hZENhbGxiYWNrKGQsITApO3JldHVybiB0aGlzLmdldEltYWdlU3JjRm9yRGF0YShkLHRoaXMuZ2V0Q29tcGFyZVNlcUZlYXR1cmVWYWx1ZXMoZCxmLCExLCEwKVswXSwhMCl9LHNldHVwT25sb2FkQ2FsbGJhY2s6ZnVuY3Rpb24oZCxmKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pntjb25zdCBnPXRoaXMuJCQoIiMiK3RoaXMuZ2V0SW1hZ2VJZChkLGYpKTtnLm9ubG9hZD10aGlzLmdldE9uTG9hZEZvckltYWdlKGQsZyxmKX0pfSxnZXRJbWFnZVNyY0ZvckRhdGE6ZnVuY3Rpb24oZCxmLGcpe2Q9YS5leGVjKGQpO2lmKG51bGw9PWQpcmV0dXJuIG51bGw7CmQ9ZFsxXXx8IiI7Zz1nP3RoaXMuZ2V0Q29tcGFyZUZlYXR1cmVWYWx1ZXMoImltYWdlIitkKyIvZm9ybWF0IiwhMSk6dGhpcy5nZXRGZWF0dXJlVmFsdWVzKCJpbWFnZSIrZCsiL2Zvcm1hdCIsITEpO2Q9ImpwZWciOzA8Zy5sZW5ndGgmJihkPWdbMF0udG9Mb3dlckNhc2UoKSk7cmV0dXJuImRhdGE6aW1hZ2UvIitkKyI7YmFzZTY0LCIrYnRvYShkZWNvZGVVUklDb21wb25lbnQoZW5jb2RlVVJJQ29tcG9uZW50KGYpKSl9LGdldEl0ZXJMZW5ndGg6ZnVuY3Rpb24oZCl7bGV0IGY9MDtpZihkKXtsZXQgZz1kLm5leHQoKTtmb3IoOyFnLmRvbmU7KWYrKyxnPWQubmV4dCgpfXJldHVybiBmfSx1cGRhdGVDb21wYXJlTW9kZTpmdW5jdGlvbigpe2xldCBkPSExO2lmKHRoaXMuY29tcGFyZUZlYXR1cmVzJiYwPHRoaXMuZ2V0SXRlckxlbmd0aCh0aGlzLmNvbXBhcmVGZWF0dXJlcy5rZXlzKCkpfHx0aGlzLmNvbXBhcmVTZXFGZWF0dXJlcyYmMDx0aGlzLmdldEl0ZXJMZW5ndGgodGhpcy5jb21wYXJlU2VxRmVhdHVyZXMua2V5cygpKSlkPQohMDt0aGlzLmNvbXBhcmVNb2RlPWR9LGNyZWF0ZUV4YW1wbGVzRnJvbUpzb246ZnVuY3Rpb24oZCl7dGhpcy5leGFtcGxlPXRoaXMuY3JlYXRlRXhhbXBsZXNGcm9tSnNvbkhlbHBlcihkKTt0aGlzLmNvbXBhcmVKc29uPXt9fSxjcmVhdGVDb21wYXJlRXhhbXBsZXNGcm9tSnNvbjpmdW5jdGlvbihkKXtpZighZHx8IU9iamVjdC5rZXlzKGQpLmxlbmd0aClpZih0aGlzLnNhbGllbmN5SnNvbilkPXRoaXMuc2FsaWVuY3lKc29uO2Vsc2V7dGhpcy5jb21wYXJlRXhhbXBsZT1udWxsO3JldHVybn10aGlzLmNvbXBhcmVFeGFtcGxlPXRoaXMuY3JlYXRlRXhhbXBsZXNGcm9tSnNvbkhlbHBlcihkKX0sY3JlYXRlRXhhbXBsZXNGcm9tSnNvbkhlbHBlcjpmdW5jdGlvbihkKXtpZighZClyZXR1cm4gbnVsbDsic3RyaW5nIj09PXR5cGVvZiB0aGlzLmpzb24mJihkPUpTT04ucGFyc2UodGhpcy5qc29uKSk7aWYoZC5mZWF0dXJlcyl7dmFyIGY9bmV3IGdrO2Yuc2V0RmVhdHVyZXModGhpcy5wYXJzZUZlYXR1cmVzKGQuZmVhdHVyZXMpKTsKcmV0dXJuIGZ9cmV0dXJuIGQuY29udGV4dHx8ZC5mZWF0dXJlTGlzdHM/KGY9bmV3IGhrLGQuY29udGV4dCYmZi5zZXRDb250ZXh0KHRoaXMucGFyc2VGZWF0dXJlcyhkLmNvbnRleHQpKSxkLmZlYXR1cmVMaXN0cyYmZi5zZXRGZWF0dXJlTGlzdHModGhpcy5wYXJzZUZlYXR1cmVMaXN0cyhkLmZlYXR1cmVMaXN0cykpLGYpOm5ldyBna30scGFyc2VGZWF0dXJlczpmdW5jdGlvbihkKXtjb25zdCBmPW5ldyBIajtmb3IoY29uc3QgZyBpbiBkLmZlYXR1cmUpaWYoZC5mZWF0dXJlLmhhc093blByb3BlcnR5KGcpKXtjb25zdCBsPWQuZmVhdHVyZVtnXTtmLmdldEZlYXR1cmVNYXAoKS5zZXQoZyx0aGlzLnBhcnNlRmVhdHVyZShsLHRoaXMuaXNJbWFnZShnKSkpfXJldHVybiBmfSxwYXJzZUZlYXR1cmVMaXN0czpmdW5jdGlvbihkKXtjb25zdCBmPW5ldyBLajtmb3IoY29uc3QgZyBpbiBkLmZlYXR1cmVMaXN0KWlmKGQuZmVhdHVyZUxpc3QuaGFzT3duUHJvcGVydHkoZykpe2NvbnN0IGw9CmQuZmVhdHVyZUxpc3RbZ10saz1uZXcgSWosbj1bXTtmb3IoY29uc3QgcCBpbiBsLmZlYXR1cmUpbC5mZWF0dXJlLmhhc093blByb3BlcnR5KHApJiZuLnB1c2godGhpcy5wYXJzZUZlYXR1cmUobC5mZWF0dXJlW3BdLHRoaXMuaXNJbWFnZShnKSkpO2suc2V0RmVhdHVyZUxpc3Qobik7Zi5nZXRGZWF0dXJlTGlzdE1hcCgpLnNldChnLGspfXJldHVybiBmfSxwYXJzZUZlYXR1cmU6ZnVuY3Rpb24oZCl7Y29uc3QgZj1uZXcgRmo7aWYoZC5mbG9hdExpc3Qpe3ZhciBnPW5ldyBCajtnLnNldFZhbHVlTGlzdChkLmZsb2F0TGlzdC52YWx1ZSk7Zi5zZXRGbG9hdExpc3QoZyl9ZWxzZSBkLmJ5dGVzTGlzdD8oZz1uZXcgbmksZC5ieXRlc0xpc3QudmFsdWUmJmcuc2V0VmFsdWVMaXN0KGQuYnl0ZXNMaXN0LnZhbHVlKSxmLnNldEJ5dGVzTGlzdChnKSk6ZC5pbnQ2NExpc3QmJihnPW5ldyBEaixnLnNldFZhbHVlTGlzdChkLmludDY0TGlzdC52YWx1ZSksZi5zZXRJbnQ2NExpc3QoZykpO3JldHVybiBmfSwKZ2V0SW1hZ2VJZDpmdW5jdGlvbihkLGYpe3JldHVybiBmP3RoaXMuZ2V0Q29tcGFyZUltYWdlSWQoZCk6dGhpcy5zYW5pdGl6ZUZlYXR1cmUoZCkrIl9pbWFnZSJ9LGdldENhbnZhc0lkOmZ1bmN0aW9uKGQsZil7cmV0dXJuIGY/dGhpcy5nZXRDb21wYXJlQ2FudmFzSWQoZCk6dGhpcy5zYW5pdGl6ZUZlYXR1cmUoZCkrIl9jYW52YXMifSxnZXRJbWFnZUNhcmRJZDpmdW5jdGlvbihkLGYpe3JldHVybiBmP3RoaXMuZ2V0Q29tcGFyZUltYWdlQ2FyZElkKGQpOnRoaXMuc2FuaXRpemVGZWF0dXJlKGQpKyJfY2FyZCJ9LGdldENvbXBhcmVJbWFnZUlkOmZ1bmN0aW9uKGQpe3JldHVybiB0aGlzLnNhbml0aXplRmVhdHVyZShkKSsiX2ltYWdlX2NvbXBhcmUifSxnZXRDb21wYXJlQ2FudmFzSWQ6ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMuc2FuaXRpemVGZWF0dXJlKGQpKyJfY2FudmFzX2NvbXBhcmUifSxnZXRDb21wYXJlSW1hZ2VDYXJkSWQ6ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMuc2FuaXRpemVGZWF0dXJlKGQpKwoiX2NhcmRfY29tcGFyZSJ9LGdldEZlYXR1cmVEaWFsb2dJZDpmdW5jdGlvbihkKXtyZXR1cm4gdGhpcy5zYW5pdGl6ZUZlYXR1cmUoZCkrIl9kaWFsb2cifSxmZWF0dXJlTW9yZUNsaWNrZWQ6ZnVuY3Rpb24oZCl7ZD1kLnNyY0VsZW1lbnQ7Y29uc3QgZj10aGlzLiQkKCIjIit0aGlzLnNhbml0aXplRmVhdHVyZShkLmRhdGFGZWF0dXJlKSsiX2RpYWxvZyIpO2YucG9zaXRpb25UYXJnZXQ9ZDtmLm9wZW4oKX0sZXhwYW5kRmVhdHVyZTpmdW5jdGlvbihkKXt0aGlzLnNldCgiZXhwYW5kZWRGZWF0dXJlcy4iK3RoaXMuc2FuaXRpemVGZWF0dXJlKGQuc3JjRWxlbWVudC5kYXRhRmVhdHVyZSksITApO3RoaXMucmVmcmVzaEV4YW1wbGVWaWV3ZXIoKX0sZGVjb2RlZFN0cmluZ1RvQ2hhckNvZGVzOmZ1bmN0aW9uKGQpe2NvbnN0IGY9bmV3IFVpbnQ4QXJyYXkoZC5sZW5ndGgpO2ZvcihsZXQgZz0wO2c8ZC5sZW5ndGg7KytnKWZbZ109ZC5jaGFyQ29kZUF0KGcpO3JldHVybiBmfSxoYW5kbGVJbWFnZVVwbG9hZDpmdW5jdGlvbihkKXt0aGlzLmhhbmRsZUZpbGVTZWxlY3QoZCwKdGhpcyl9LHVwbG9hZEltYWdlQ2xpY2tlZDpmdW5jdGlvbihkKXtkPXRoaXMuZ2V0RGF0YUZyb21FdmVudChkKTtjb25zdCBmPVBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvckFsbCgicGFwZXItaW5wdXQiKTtsZXQgZz1udWxsO2ZvcihsZXQgbD0wO2w8Zi5sZW5ndGg7bCsrKWlmKGZbbF0uZGF0YUZlYXR1cmU9PWQuZmVhdHVyZSl7Zz1mW2xdO2JyZWFrfWcmJmcuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCJpbnB1dCIpLmNsaWNrKCl9LGhhbmRsZUZpbGVTZWxlY3Q6ZnVuY3Rpb24oZCxmKXtkLnN0b3BQcm9wYWdhdGlvbigpO2QucHJldmVudERlZmF1bHQoKTtjb25zdCBnPWQudGFyZ2V0LGw9bmV3IEZpbGVSZWFkZXI7ZD1kLmRhdGFUcmFuc2Zlcj9kLmRhdGFUcmFuc2Zlci5maWxlczpkLnRhcmdldC5pbnB1dEVsZW1lbnQuaW5wdXRFbGVtZW50LmZpbGVzOzAhPT1kLmxlbmd0aCYmKGwuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKCk9Pntjb25zdCBrPWwucmVzdWx0LnN1YnN0cmluZygrbC5yZXN1bHQuaW5kZXhPZigiYmFzZTY0LCIpKwo3KTt2YXIgbj1mLmRlY29kZWRTdHJpbmdUb0NoYXJDb2RlcyhhdG9iKGspKTtjb25zdCBwPWYuZ2V0RGF0YUZyb21FbGVtKGcpLHE9Zi5nZXRGZWF0dXJlRnJvbURhdGEocCkscj1mLmdldFZhbHVlTGlzdEZyb21EYXRhKHApO2lmKHEpe3JbMF09bjtxLmdldEJ5dGVzTGlzdCgpLnNldFZhbHVlTGlzdChyKTsobj1mLmdldEpzb25WYWx1ZUxpc3QocC5mZWF0dXJlLHAuc2VxTnVtKSkmJihuWzBdPWspO2NvbnN0IHQ9bmV3IEltYWdlO2YuYWRkSW1hZ2VFbGVtZW50KHAuZmVhdHVyZSx0KTt0LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCgpPT57Zi5nZXRPbkxvYWRGb3JJbWFnZShwLmZlYXR1cmUsdCk7dmFyIHY9YS5leGVjKHAuZmVhdHVyZSlbMV18fCIiO2NvbnN0IHk9ImltYWdlIit2KyIvd2lkdGgiO3Y9ImltYWdlIit2KyIvaGVpZ2h0Ijtjb25zdCB6PWYuZ2V0RmVhdHVyZVZhbHVlcyh5LCExKSx4PWYuZ2V0RmVhdHVyZVZhbHVlcyh2LCExKTswPHoubGVuZ3RoJiYoelswXT0rdC53aWR0aCwKZi5mZWF0dXJlcy5nZXQoeSkuZ2V0SW50NjRMaXN0KCkuc2V0VmFsdWVMaXN0KHopKTswPHgubGVuZ3RoJiYoeFswXT0rdC5oZWlnaHQsZi5mZWF0dXJlcy5nZXQodikuZ2V0SW50NjRMaXN0KCkuc2V0VmFsdWVMaXN0KHgpKTtmLmV4YW1wbGVDaGFuZ2VkKCl9KTt0LnNyYz1sLnJlc3VsdH19LCExKSxsLnJlYWRBc0RhdGFVUkwoZFswXSkpfSxhZGREcmFnRHJvcEJlaGF2aW9yVG9DYW52YXM6ZnVuY3Rpb24oZCl7ZnVuY3Rpb24gZihrKXtrLnN0b3BQcm9wYWdhdGlvbigpO2sucHJldmVudERlZmF1bHQoKTtrLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0PSJjb3B5In1mdW5jdGlvbiBnKGspe2wuaGFuZGxlRmlsZVNlbGVjdChrLGwpfWNvbnN0IGw9dGhpczshdGhpcy5yZWFkb25seSYmZCYmKGQuYWRkRXZlbnRMaXN0ZW5lcigiZHJhZ292ZXIiLGYsITEpLGQuYWRkRXZlbnRMaXN0ZW5lcigiZHJvcCIsZywhMSkpfSxnZXRPbkxvYWRGb3JJbWFnZTpmdW5jdGlvbihkLGYsZyl7Y29uc3QgbD0KKGssbixwKT0+e2NvbnN0IHE9dGhpcy4kJCgiIyIrdGhpcy5nZXRDYW52YXNJZChrLHApKTtwfHx0aGlzLmFkZERyYWdEcm9wQmVoYXZpb3JUb0NhbnZhcyhxKTtpZihuJiZxKXtjb25zdCByPXEuZ2V0Q29udGV4dCgiMmQiKTtsZXQgdD10aGlzLmltYWdlU2NhbGVQZXJjZW50YWdlLzEwMDtpZighdGhpcy5hbGxvd0ltYWdlQ29udHJvbHMpe2xldCB6PXRoaXMuJCQoIiMiK3RoaXMuZ2V0SW1hZ2VDYXJkSWQoayxwKSkucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aC8yOzE2PHomJih6LT0xNik7ejxuLndpZHRoJiYodD16L24ud2lkdGgpfXEud2lkdGg9bi53aWR0aCp0O3EuaGVpZ2h0PW4uaGVpZ2h0KnQ7Y29uc3Qgdj16PT57ci5zYXZlKCk7ci5jbGVhclJlY3QoMCwwLHEud2lkdGgscS5oZWlnaHQpO3IudHJhbnNsYXRlKHoueCx6LnkpO3Iuc2NhbGUoei5rLHouayk7dGhpcy5yZW5kZXJJbWFnZU9uQ2FudmFzKHIscS53aWR0aCxxLmhlaWdodCxrLHApOwpyLnJlc3RvcmUoKX0seT1kMy56b29tKCkuc2NhbGVFeHRlbnQoYykub24oInpvb20iLCgpPT57dGhpcy5hZGRJbWFnZVRyYW5zZm9ybShrLGQzLmV2ZW50LnRyYW5zZm9ybSxwKTt2KGQzLmV2ZW50LnRyYW5zZm9ybSl9KTtkMy5zZWxlY3QocSkuY2FsbCh5KS5vbigiZGJsY2xpY2suem9vbSIsKCk9PmQzLnNlbGVjdChxKS5jYWxsKHkudHJhbnNmb3JtLGQzLnpvb21JZGVudGl0eSkpO3Iuc2F2ZSgpO3Iuc2NhbGUodCx0KTtyLmRyYXdJbWFnZShuLDAsMCk7ci5yZXN0b3JlKCk7dGhpcy5zZXRJbWFnZURhdHVtKHIscS53aWR0aCxxLmhlaWdodCxrLHApO3RoaXMucmVuZGVySW1hZ2VPbkNhbnZhcyhyLHEud2lkdGgscS5oZWlnaHQsayxwKTtwP3RoaXMuY29tcGFyZUltYWdlSW5mb1trXS50cmFuc2Zvcm0mJnYodGhpcy5jb21wYXJlSW1hZ2VJbmZvW2tdLnRyYW5zZm9ybSk6dGhpcy5pbWFnZUluZm9ba10udHJhbnNmb3JtJiZ2KHRoaXMuaW1hZ2VJbmZvW2tdLnRyYW5zZm9ybSl9ZWxzZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PgpsKGssbixwKSl9O3RoaXMuYWRkSW1hZ2VFbGVtZW50KGQsZixnKTt0aGlzLmFkZEltYWdlT25Mb2FkKGQsbCxnKTtyZXR1cm4gbC5hcHBseSh0aGlzLFtkLGYsZ10pfSxhZGRJbWFnZU9uTG9hZDpmdW5jdGlvbihkLGYsZyl7dGhpcy5oYXNJbWFnZT0hMDtnPyh0aGlzLmNvbXBhcmVJbWFnZUluZm9bZF18fCh0aGlzLmNvbXBhcmVJbWFnZUluZm9bZF09e30pLHRoaXMuY29tcGFyZUltYWdlSW5mb1tkXS5vbmxvYWQ9Zik6KHRoaXMuaW1hZ2VJbmZvW2RdfHwodGhpcy5pbWFnZUluZm9bZF09e30pLHRoaXMuaW1hZ2VJbmZvW2RdLm9ubG9hZD1mKX0sYWRkSW1hZ2VEYXRhOmZ1bmN0aW9uKGQsZixnKXtnPyh0aGlzLmNvbXBhcmVJbWFnZUluZm9bZF18fCh0aGlzLmNvbXBhcmVJbWFnZUluZm9bZF09e30pLHRoaXMuY29tcGFyZUltYWdlSW5mb1tkXS5pbWFnZURhdGE9Zik6KHRoaXMuaW1hZ2VJbmZvW2RdfHwodGhpcy5pbWFnZUluZm9bZF09e30pLHRoaXMuaW1hZ2VJbmZvW2RdLmltYWdlRGF0YT0KZil9LGFkZEltYWdlRWxlbWVudDpmdW5jdGlvbihkLGYsZyl7Zz8odGhpcy5jb21wYXJlSW1hZ2VJbmZvW2RdfHwodGhpcy5jb21wYXJlSW1hZ2VJbmZvW2RdPXt9KSx0aGlzLmNvbXBhcmVJbWFnZUluZm9bZF0uaW1hZ2VFbGVtZW50PWYpOih0aGlzLmltYWdlSW5mb1tkXXx8KHRoaXMuaW1hZ2VJbmZvW2RdPXt9KSx0aGlzLmltYWdlSW5mb1tkXS5pbWFnZUVsZW1lbnQ9Zil9LGFkZEltYWdlR3JheXNjYWxlRGF0YTpmdW5jdGlvbihkLGYpe3RoaXMuaW1hZ2VJbmZvW2RdfHwodGhpcy5pbWFnZUluZm9bZF09e30pO3RoaXMuaW1hZ2VJbmZvW2RdLmltYWdlR3JheXNjYWxlRGF0YT1mfSxhZGRJbWFnZVRyYW5zZm9ybTpmdW5jdGlvbihkLGYsZyl7Zz8odGhpcy5jb21wYXJlSW1hZ2VJbmZvW2RdfHwodGhpcy5jb21wYXJlSW1hZ2VJbmZvW2RdPXt9KSx0aGlzLmNvbXBhcmVJbWFnZUluZm9bZF0udHJhbnNmb3JtPWYpOih0aGlzLmltYWdlSW5mb1tkXXx8KHRoaXMuaW1hZ2VJbmZvW2RdPQp7fSksdGhpcy5pbWFnZUluZm9bZF0udHJhbnNmb3JtPWYpfSxzZXRJbWFnZURhdHVtOmZ1bmN0aW9uKGQsZixnLGwsayl7aWYoZiYmZyYmKGQ9ZC5nZXRJbWFnZURhdGEoMCwwLGYsZyksZD1VaW50OENsYW1wZWRBcnJheS5mcm9tKGQuZGF0YSksdGhpcy5hZGRJbWFnZURhdGEobCxkLGspLHRoaXMuc2FsaWVuY3kmJnRoaXMuc2hvd1NhbGllbmN5JiZ0aGlzLnNhbGllbmN5W2xdJiYhaykpe2s9VWludDhDbGFtcGVkQXJyYXkuZnJvbShkKTtmb3IoZj0wO2Y8ZC5sZW5ndGg7Zis9NClnPShkW2ZdK2RbZisxXStkW2YrMl0pLzMsa1tmXT1nLGtbZisxXT1nLGtbZisyXT1nO3RoaXMuYWRkSW1hZ2VHcmF5c2NhbGVEYXRhKGwsayl9fSxjb250cmFzdEltYWdlOmZ1bmN0aW9uKGQsZixnKXtmPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFtnLS41LWYvMixnLS41KyhmLTEpLzJdKS5jbGFtcCghMCkucmFuZ2UoWzAsMjU1XSk7Zm9yKGc9MDtnPGQubGVuZ3RoO2crKykzIT09ZyU0JiYoZFtnXT0KZihkW2ddKSl9LHNob3dTYWxpZW5jeUZvclZhbHVlOmZ1bmN0aW9uKGQpe3JldHVybiBNYXRoLmFicyhkKT49TWF0aC5hYnMoMDw9ZD90aGlzLm1heFNhbDp0aGlzLm1pblNhbCkqdGhpcy5zYWxpZW5jeUN1dG9mZi8xMDB9LGdldENvbG9yRm9yU2FsaWVuY3k6ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMuc2hvd1NhbGllbmN5Rm9yVmFsdWUoZCk/dGhpcy5jb2xvcnMoZCk6IiNmZmYifSxhZGRTYWxpZW5jeVRvSW1hZ2U6ZnVuY3Rpb24oZCxmKXtBcnJheS5pc0FycmF5KGYpJiYwPGYubGVuZ3RoJiZBcnJheS5pc0FycmF5KGZbMF0pJiYoZj1mW3RoaXMuc2VxTnVtYmVyXSk7Y29uc3QgZz0xL01hdGgucG93KHRoaXMuaW1hZ2VTY2FsZVBlcmNlbnRhZ2UvMTAwLDIpO2ZvcihsZXQgaz0wO2s8ZC5sZW5ndGg7ays9NCl7dmFyIGw9TWF0aC5mbG9vcihrLzQqZyk7bD1BcnJheS5pc0FycmF5KGYpP2YubGVuZ3RoPmw/ZltsXTowOmY7Y29uc3Qgbj0uNSoodGhpcy5zaG93U2FsaWVuY3lGb3JWYWx1ZShsKT8KMDw9bD8wPT09dGhpcy5tYXhTYWw/MDpsL3RoaXMubWF4U2FsOmwvdGhpcy5taW5TYWw6MCkse3I6cCxnOnEsYjpyfT1kMy5yZ2IoMDxsP3RoaXMuY29sb3JzKHRoaXMubWF4U2FsKTp0aGlzLmNvbG9ycyh0aGlzLm1pblNhbCkpO2Rba109ZFtrXSooMS1uKStwKm47ZFtrKzFdPWRbaysxXSooMS1uKStxKm47ZFtrKzJdPWRbaysyXSooMS1uKStyKm59fSxyZW5kZXJJbWFnZU9uQ2FudmFzOmZ1bmN0aW9uKGQsZixnLGwsayl7aWYoZiYmZyl7dmFyIG49ZC5nZXRJbWFnZURhdGEoMCwwLGYsZyk7az9uLmRhdGEuc2V0KHRoaXMuY29tcGFyZUltYWdlSW5mb1tsXS5pbWFnZURhdGEpOm4uZGF0YS5zZXQodGhpcy5zYWxpZW5jeSYmdGhpcy5zaG93U2FsaWVuY3kmJnRoaXMuc2FsaWVuY3lbbF0/dGhpcy5pbWFnZUluZm9bbF0uaW1hZ2VHcmF5c2NhbGVEYXRhOnRoaXMuaW1hZ2VJbmZvW2xdLmltYWdlRGF0YSk7MjU2PT09dGhpcy53aW5kb3dXaWR0aCYmMTI4PT09dGhpcy53aW5kb3dDZW50ZXJ8fAp0aGlzLmNvbnRyYXN0SW1hZ2Uobi5kYXRhLHRoaXMud2luZG93V2lkdGgsdGhpcy53aW5kb3dDZW50ZXIpOyFrJiZ0aGlzLnNhbGllbmN5JiZ0aGlzLnNob3dTYWxpZW5jeSYmdGhpcy5zYWxpZW5jeVtsXSYmdGhpcy5hZGRTYWxpZW5jeVRvSW1hZ2Uobi5kYXRhLHRoaXMuc2FsaWVuY3lbbF0pO2w9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7bC53aWR0aD1mO2wuaGVpZ2h0PWc7bC5nZXRDb250ZXh0KCIyZCIpLnB1dEltYWdlRGF0YShuLDAsMCk7ZC5jbGVhclJlY3QoMCwwLGYsZyk7ZC5kcmF3SW1hZ2UobCwwLDApfX0sc2hvd1NhbENoZWNrYm94Q2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy5zaG93U2FsaWVuY3k9dGhpcy4kLnNhbENoZWNrYm94LmNoZWNrZWR9LHVwZGF0ZUltYWdlczpmdW5jdGlvbigpe2Zvcihjb25zdCBkIGluIHRoaXMuaW1hZ2VJbmZvKWlmKHRoaXMuaW1hZ2VJbmZvLmhhc093blByb3BlcnR5KGQpKXRoaXMuaW1hZ2VJbmZvW2RdLm9ubG9hZChkLHRoaXMuaW1hZ2VJbmZvW2RdLmltYWdlRWxlbWVudCl9LApzaG91bGRTaG93SW1hZ2VDb250cm9sczpmdW5jdGlvbihkLGYpe3JldHVybiBkJiZmfSxzaG91bGRFbmFibGVBZGRGZWF0dXJlOmZ1bmN0aW9uKGQpe3JldHVybiAwPGQubGVuZ3RofSxnZXREZWxldGVWYWx1ZUJ1dHRvbkNsYXNzOmZ1bmN0aW9uKGQsZil7cmV0dXJuIGR8fCFmPyJkZWxldGUtdmFsdWUtYnV0dG9uIGRlbGV0ZS12YWx1ZS1idXR0b24taGlkZGVuIjoiZGVsZXRlLXZhbHVlLWJ1dHRvbiJ9LGdldERlbGV0ZUZlYXR1cmVCdXR0b25DbGFzczpmdW5jdGlvbihkKXtyZXR1cm4gZD8iaGlkZS1jb250cm9scyI6ImRlbGV0ZS1mZWF0dXJlLWJ1dHRvbiJ9LGdldEFkZFZhbHVlQnV0dG9uQ2xhc3M6ZnVuY3Rpb24oZCl7cmV0dXJuIGQ/ImhpZGUtY29udHJvbHMiOiJhZGQtdmFsdWUtYnV0dG9uIn0sZ2V0QWRkRmVhdHVyZUJ1dHRvbkNsYXNzOmZ1bmN0aW9uKGQpe3JldHVybiBkPyJoaWRlLWNvbnRyb2xzIjoiYWRkLWZlYXR1cmUtYnV0dG9uIn0sZ2V0VXBsb2FkSW1hZ2VDbGFzczpmdW5jdGlvbihkKXtyZXR1cm4gZD8KImhpZGUtY29udHJvbHMiOiJ1cGxvYWQtaW1hZ2UtYnV0dG9uIn0sZ2V0Q29tcGFyZUhlYWRlckNsYXNzOmZ1bmN0aW9uKGQpe3JldHVybiBkPyJjb21wYXJlLXZhbHVlLXRleHQiOiJuby1jb21wYXJlLXZhbHVlLXRleHQifSxkZWNvZGVCeXRlc0xpc3RUb1N0cmluZzpmdW5jdGlvbihkKXtsZXQgZj0iIixnO2ZvcihnPTA7ZzxkLmxlbmd0aC8xNjM4NDtnKyspZis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGQuc2xpY2UoMTYzODQqZywxNjM4NCooZysxKSkpO3JldHVybiBmKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsZC5zbGljZSgxNjM4NCpnKSl9fSl9KShUdHx8KFR0PXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW50ZXJhY3RpdmUtaW5mZXJlbmNlLWRhc2hib2FyZC90Zi1pbnRlcmFjdGl2ZS1pbmZlcmVuY2UtZGFzaGJvYXJkLmh0bWwuanMKY29uc3QgVXQ9ZDMuaW50ZXJwb2xhdGVSZ2I7ZnVuY3Rpb24gVnQoYSl7YSYmYS5wYXJlbnRFbGVtZW50JiZhLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYSl9ZnVuY3Rpb24gV3QoYSl7cmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYSkpfQooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtaW50ZXJhY3RpdmUtaW5mZXJlbmNlLWRhc2hib2FyZCIscHJvcGVydGllczp7X3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFFvLlJlcXVlc3RNYW5hZ2VyfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFFvLkNhbmNlbGxlcn0sZXhhbXBsZXNQYXRoOnt0eXBlOlN0cmluZ30sbW9kZWxOYW1lOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoibW9kZWxOYW1lQ2hhbmdlZF8ifSxwYXJzZWRNb2RlbE5hbWVzOnt0eXBlOlN0cmluZ30saW5mZXJlbmNlQWRkcmVzczp7dHlwZTpTdHJpbmd9LG1vZGVsVHlwZTp7dHlwZTpTdHJpbmd9LG1vZGVsU2lnbmF0dXJlOnt0eXBlOlN0cmluZ30sbW9kZWxWZXJzaW9uOnt0eXBlOlN0cmluZ30sbWF4RXhhbXBsZXM6e3R5cGU6TnVtYmVyfSxsYWJlbFZvY2FiUGF0aDp7dHlwZTpTdHJpbmd9LG1heEluZmVyZW5jZUVudHJpZXNQZXJSdW46TnVtYmVyLG51bVByaW1hcnlCdWNrZXRzOnt0eXBlOk51bWJlciwKdmFsdWU6MixvYnNlcnZlcjoiYnJlYWtkb3duRmVhdHVyZVNlbGVjdGVkXyJ9LG51bVNlY29uZGFyeUJ1Y2tldHM6e3R5cGU6TnVtYmVyLHZhbHVlOjIsb2JzZXJ2ZXI6ImJyZWFrZG93bkZlYXR1cmVTZWxlY3RlZF8ifSxpbmZlcmVuY2VzOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoibmV3SW5mZXJlbmNlc18iLHZhbHVlOigpPT4oe30pfSxleHRyYU91dHB1dHM6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJuZXdFeHRyYU91dHB1dHNfIn0sYXR0cmlidXRpb25zOnt0eXBlOk9iamVjdCx2YWx1ZTp7aW5kaWNlczpbXSxhdHRyaWJ1dGlvbnM6W119LG9ic2VydmVyOiJuZXdBdHRyaWJ1dGlvbnNfIn0sbWluQXR0cmlidXRpb246e3R5cGU6TnVtYmVyLHZhbHVlOjB9LG1heEF0dHJpYnV0aW9uOnt0eXBlOk51bWJlcix2YWx1ZTowfSxhdHRyaWJ1dGlvbkNvbG9yU2NhbGU6T2JqZWN0LGV4YW1wbGVzQW5kSW5mZXJlbmNlczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W10sb2JzZXJ2ZXI6ImNvbXB1dGVTZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2UifSwKc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlOnt0eXBlOk9iamVjdH0sY291bnRlcmZhY3R1YWxFeGFtcGxlQW5kSW5mZXJlbmNlOnt0eXBlOk9iamVjdH0sdmlzZGF0YTp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LHNlbGVjdGVkOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXSxvYnNlcnZlcjoiY29tcHV0ZVNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZSJ9LGNvbXBhcmVkSW5kaWNlczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LGxhYmVsVm9jYWI6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSx1cGRhdGVkRXhhbXBsZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbWFnZUZlYXR1cmVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZToiaW1hZ2UvZW5jb2RlZCIscmVhZG9ubHk6ITB9LHN0YXRzOk9iamVjdCxzZWxlY3RlZEJyZWFrZG93bkZlYXR1cmU6e3R5cGU6U3RyaW5nLHZhbHVlOiIiLG9ic2VydmVyOiJicmVha2Rvd25GZWF0dXJlU2VsZWN0ZWRfIn0sc2VsZWN0ZWRTZWNvbmRCcmVha2Rvd25GZWF0dXJlOnt0eXBlOlN0cmluZywKdmFsdWU6IiIsb2JzZXJ2ZXI6ImJyZWFrZG93bkZlYXR1cmVTZWxlY3RlZF8ifSxjdXN0b21EaXN0YW5jZUZ1bmN0aW9uU2V0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6ImN1c3RvbURpc3RhbmNlRnVuY3Rpb25TZXRDaGFuZ2VkXyJ9LHNlbGVjdGVkTGFiZWxGZWF0dXJlOnt0eXBlOlN0cmluZyx2YWx1ZToiIixvYnNlcnZlcjoibGFiZWxGZWF0dXJlU2VsZWN0ZWRfIn0sbmVhcmVzdENvdW50ZXJmYWN0dWFsTW9kZWxJbmRleDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sYXR0cmlidXRpb25Nb2RlbEluZGV4Ont0eXBlOk51bWJlcix2YWx1ZTowLG9ic2VydmVyOiJzZXRBdHRyaWJ1dGlvbnMifSxpbmZlcmVuY2VTdGF0c186e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxmZWF0dXJlVmFsdWVUaHJlc2hvbGRzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXSxvYnNlcnZlcjoiZmVhdHVyZVZhbHVlVGhyZXNob2xkc0NoYW5nZWRfIn0sZmVhdHVyZVZhbHVlVGhyZXNob2xkc0luZGV4TWFwOk9iamVjdCwKZGVmYXVsdEluZmVyZW5jZUxhYmVsOnt0eXBlOk51bWJlcix2YWx1ZTowLG9ic2VydmVyOiJyZWZyZXNoSW5mZXJlbmNlc18ifSxvdmVyYWxsVGhyZXNob2xkczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LHNpZGVUYWJTZWxlY3RlZDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxvYnNlcnZlcjoic2lkZVRhYlNlbGVjdGVkQ2hhbmdlZF8ifSxsb2NhbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJsb2NhbENoYW5nZWRfIn0sbG9jYWxBdGxhc1VybDpTdHJpbmcscGFydGlhbERlcFBsb3RFbGlnaWJsZUZlYXR1cmVzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXSxvYnNlcnZlcjoicGFydGlhbERlcFBsb3RFbGlnaWJsZUZlYXR1cmVzU2V0In0scGFydGlhbERlcFBsb3RQZW5kaW5nRmVhdHVyZXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxleGFtcGxlRGlzcGxheU1vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGFja2VkIn0sZmVhdHVyZVNlYXJjaFZhbHVlOlN0cmluZyxpbmNvcnJlY3RQcmVkQ29zdFJhdGlvOnt0eXBlOk51bWJlciwKdmFsdWU6MSxvYnNlcnZlcjoiY29zdFJhdGlvQ2hhbmdlZF8ifSxtdWx0aUNsYXNzOnt0eXBlOkJvb2xlYW59LHNlcXVlbmNlRXhhbXBsZXM6e3R5cGU6Qm9vbGVhbn0sc2FtcGxpbmdPZGRzOnt0eXBlOk51bWJlcn0sdXNlUHJlZGljdEFwaTp7dHlwZTpCb29sZWFufSxwcmVkaWN0T3V0cHV0VGVuc29yOnt0eXBlOlN0cmluZ30scHJlZGljdElucHV0VGVuc29yOnt0eXBlOlN0cmluZ30sYXhpc1ByZWNpc2lvbjp7dHlwZTpOdW1iZXIsdmFsdWU6Mn0sZGlzdGFuY2VTdGF0c186e3R5cGU6T2JqZWN0fSxmYWNldERpc3RTd2l0Y2g6e3R5cGU6U3RyaW5nLHZhbHVlOiJMMSJ9LGZhY2V0RGlzdEZlYXR1cmVOYW1lOnt0eXBlOlN0cmluZ30sZmFjZXREaXN0RmVhdHVyZU5hbWVzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sZmFjZXREaXN0U2V0dGluZzp7dHlwZTpTdHJpbmcsdmFsdWU6ImNvbG9yQnkifSxleGFtcGxlU3RhdHVzU3RyOnt0eXBlOlN0cmluZyx2YWx1ZToiTm8gZGF0YXBvaW50cyBsb2FkZWQgeWV0In0sCnNlbGVjdGVkRXhhbXBsZU51bTp7dHlwZTpOdW1iZXIsdmFsdWU6IiIsb2JzZXJ2ZXI6InNlbGVjdGVkRXhhbXBsZUlucHV0Q2hhbmdlZF8ifSxzZWxlY3RlZEV4YW1wbGVNYXg6TnVtYmVyLG9wZW5lZENvbnRleHRUb29sczp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxvcGVuZWRQZXJmb3JtYW5jZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxvcGVuZWRUcnVlTGFiZWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sb3BlbmVkRXhwbG9yZXI6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sb3BlbmVkSW5mZXJlbmNlUmVzdWx0czp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxyZWdyZXNzaW9uRW50cmllc186e3R5cGU6QXJyYXl9LG5lYXJlc3RDb3VudGVyZmFjdHVhbERpc3Q6e3R5cGU6U3RyaW5nLHZhbHVlOiJMMSJ9LG1pbkNvdW50ZXJmYWN0dWFsVmFsdWVEaXN0Ok51bWJlcixtYXhDb3VudGVyZmFjdHVhbFZhbHVlRGlzdDpOdW1iZXIsdmlzTW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImRpdmUiLApvYnNlcnZlcjoidmlzTW9kZUNoYW5nZWRfIn0sb3B0aW1pemF0aW9uU2VsZWN0ZWQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJjdXN0b20iLG9ic2VydmVyOiJvcHRpbWl6YXRpb25TZWxlY3RlZENoYW5nZWRfIn0sY29tcGFyZVRpdGxlOnt0eXBlOlN0cmluZyx2YWx1ZToiQXR0cmlidXRpb24gdmFsdWUocykifSxhdHRyaWJ1dGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LGdsb2JhbFBkUGxvdHM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sbnVtTW9kZWxzOnt0eXBlOk51bWJlcixyZWFkT25seTohMH0sc2hvd05lYXJlc3RDb3VudGVyZmFjdHVhbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxzZWxlY3RlZEZlYXR1cmVTb3J0Ont0eXBlOlN0cmluZyx2YWx1ZToiQ291bnQiLG9ic2VydmVyOiJzZWxlY3RlZEZlYXR1cmVTb3J0Q2hhbmdlZF8ifSxwZFBsb3RDb2xvcnM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltkMy5jb2xvcigicmdiKDMxLCAxMTksIDE4MCkiKSxkMy5jb2xvcigicmdiKDI1NSwgMTI3LCAxNCkiKSwKZDMuY29sb3IoInJnYig0NCwgMTYwLCA0NCkiKSxkMy5jb2xvcigicmdiKDIxNCwgMzksIDQwKSIpLGQzLmNvbG9yKCJyZ2IoMTQ4LCAxMDMsIDE4OSkiKSxkMy5jb2xvcigicmdiKDE0MCwgODYsIDc1KSIpLGQzLmNvbG9yKCJyZ2IoMjI3LCAxMTksIDE5NCkiKSxkMy5jb2xvcigicmdiKDEyNywgMTI3LCAxMjcpIiksZDMuY29sb3IoInJnYigxODgsIDE4OSwgMzQpIiksZDMuY29sb3IoInJnYigyMywgMTkwLCAyMDcpIildfSxwZFBsb3RUcmFuc3BhcmVudENvbG9yczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W2QzLmNvbG9yKCJyZ2JhKDMxLCAxMTksIDE4MCwgMC4zKSIpLGQzLmNvbG9yKCJyZ2JhKDI1NSwgMTI3LCAxNCwgMC4zKSIpLGQzLmNvbG9yKCJyZ2JhKDQ0LCAxNjAsIDQ0LCAwLjMpIiksZDMuY29sb3IoInJnYmEoMjE0LCAzOSwgNDAsIDAuMykiKSxkMy5jb2xvcigicmdiYSgxNDgsIDEwMywgMTg5LCAwLjMpIiksZDMuY29sb3IoInJnYmEoMTQwLCA4NiwgNzUsIDAuMykiKSwKZDMuY29sb3IoInJnYmEoMjI3LCAxMTksIDE5NCwgMC4zKSIpLGQzLmNvbG9yKCJyZ2JhKDEyNywgMTI3LCAxMjcsIDAuMykiKSxkMy5jb2xvcigicmdiYSgxODgsIDE4OSwgMzQsIDAuMykiKSxkMy5jb2xvcigicmdiYSgyMywgMTkwLCAyMDcsIDAuMykiKV19LHJvY0N1cnZlQ29sb3JzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bZDMuY29sb3IoInJnYigxOCwgMTgxLCAyMDYpIiksZDMuY29sb3IoInJnYigyNTAsIDEyMCwgMjMpIildfSxyb2NDdXJ2ZUxpbmVDb2xvcnM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltkMy5jb2xvcigicmdiYSgxOCwgMTgxLCAyMDYsIDAuNikiKSxkMy5jb2xvcigicmdiYSgyNTAsIDEyMCwgMjMsIDAuNikiKV19LGNvbmZNYXRyaXhDb2xvcnM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltkMy5jb2xvcigicmdiKDE4LCAxODEsIDIwNikiKSxkMy5jb2xvcigicmdiKDI1MCwgMTIwLCAyMykiKV19LGFsbENvbmZNYXRyaXhMYWJlbHM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PgpbXX0sbG9hZGluZ0JhckhpZGRlbl86e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0saXNTb3J0aW5nRWxpZ2libGVGZWF0dXJlczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxleGFtcGxlRmVhdHVyZVNvcnRPcmRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6ImF0dHJpYnV0aW9uIn0sZmVhdHVyZUJ1Y2tldEVkZ2VzXzp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9fSxvYnNlcnZlcnM6WyJzZXRGYWNldERpc3RGZWF0dXJlTmFtZShmYWNldERpc3RTd2l0Y2gsIHNlbGVjdGVkKSIsIm5lYXJlc3RDb3VudGVyZmFjdHVhbFN0YXR1c0NoYW5nZWRfKHNob3dOZWFyZXN0Q291bnRlcmZhY3R1YWwsIG5lYXJlc3RDb3VudGVyZmFjdHVhbE1vZGVsSW5kZXgsIG5lYXJlc3RDb3VudGVyZmFjdHVhbERpc3QsIG1pbkNvdW50ZXJmYWN0dWFsVmFsdWVEaXN0KSJdLHJlbG9hZDpmdW5jdGlvbigpe30sb3BlbkRpYWxvZzpmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpO2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3RvcigicGFwZXItZGlhbG9nIikub3BlbigpfSwKcmVhZHk6ZnVuY3Rpb24oKXtjb25zdCBhPWQzLnNlbGVjdCh0aGlzLiQuc2lkZSksYz1kMy5zZWxlY3QodGhpcy4kLmNlbnRlciksZD10aGlzLiQucmVzaXplcixmPXRoaXMsZz1kMy5kcmFnKCkub24oImRyYWciLCgpPT57bGV0IGw9ZDMubW91c2UoZC5wYXJlbnROb2RlLnBhcmVudE5vZGUpWzBdL2QucGFyZW50Tm9kZS5wYXJlbnROb2RlLm9mZnNldFdpZHRoKjEwMDtsPU1hdGgubWF4KGwsMjApO2Muc3R5bGUoIndpZHRoIiwxMDAtbCsiJSIpO2Euc3R5bGUoIndpZHRoIixsKyIlIik7Zi4kLmRpdmUuJC52aXMuX3VwZGF0ZUdyaWRGYWNldGluZygpO2YuJC5kaXZlLiQudmlzLl9vbklyb25SZXNpemUoKX0pO2QzLnNlbGVjdChkKS5jYWxsKGcpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoUW8uZ2V0Um91dGVyKCkucGx1Z2luc0xpc3RpbmcoKSkudGhlbihhPT57IndoYXRpZiJpbiBhP3RoaXMuJC5pbml0aWFsRGlhbG9nLmNsb3NlRGlhbG9nKCk6Cih0aGlzLiQuaW5mZXJlbmNlc2V0dGluZ3MuY2xvc2UoKSx0aGlzLiQuaW5pdGlhbERpYWxvZy5vcGVuTm9UZW5zb3JGbG93RGlhbG9nKCkpfSl9LHNldHRpbmdzQ2xpY2tlZF86ZnVuY3Rpb24oKXt0aGlzLiQuaW5mZXJlbmNlc2V0dGluZ3MudG9nZ2xlKCl9LGxvY2FsQ2hhbmdlZF86ZnVuY3Rpb24oKXt0aGlzLmxvY2FsJiZ0aGlzLmNsb3NlU2V0dGluZ3NfKCl9LG1vZGVsTmFtZUNoYW5nZWRfOmZ1bmN0aW9uKCl7dGhpcy5wYXJzZWRNb2RlbE5hbWVzPXRoaXMubW9kZWxOYW1lLnNwbGl0KCIsIikubWFwKGE9PmEudHJpbSgpKTtmb3IobGV0IGE9MDthPHRoaXMucGFyc2VkTW9kZWxOYW1lcy5sZW5ndGg7YSsrKXtjb25zdCBjPXRoaXMucGFyc2VkTW9kZWxOYW1lc1thXTtmb3IobGV0IGQ9YSsxO2Q8dGhpcy5wYXJzZWRNb2RlbE5hbWVzLmxlbmd0aDtkKyspdGhpcy5wYXJzZWRNb2RlbE5hbWVzW2RdPT1jJiYodGhpcy5wYXJzZWRNb2RlbE5hbWVzW2FdPWMrIiAiKyhhKzEpLHRoaXMucGFyc2VkTW9kZWxOYW1lc1tkXT0KYysiICIrKGQrMSkpfX0sY2xvc2VTZXR0aW5nc186ZnVuY3Rpb24oKXt0aGlzLiQuaW5mZXJlbmNlc2V0dGluZ3MuY2xvc2UoKX0sc2hvd0Rpc3RhbmNlQ2xpY2tlZF86ZnVuY3Rpb24oKXt0aGlzLiQuZGlzdGFuY2VkaWFsb2cudG9nZ2xlKCl9LGN1c3RvbURpc3RhbmNlRnVuY3Rpb25TZXRDaGFuZ2VkXzpmdW5jdGlvbigpe3RoaXMuZmFjZXREaXN0U3dpdGNoPXRoaXMuY3VzdG9tRGlzdGFuY2VGdW5jdGlvblNldD90aGlzLm5lYXJlc3RDb3VudGVyZmFjdHVhbERpc3Q9IkN1c3RvbSI6dGhpcy5uZWFyZXN0Q291bnRlcmZhY3R1YWxEaXN0PSJMMSJ9LHJlcXVlc3RBZGREaXN0YW5jZU1ldHJpYzpmdW5jdGlvbigpe2NvbnN0IGE9dGhpcy5zZWxlY3RlZFswXSxjPXtjYWxsYmFja1BhcmFtczp7ZmVhdHVyZU5hbWU6dGhpcy5mYWNldERpc3RGZWF0dXJlTmFtZX0sZGlzdGFuY2VQYXJhbXM6e319O2lmKHRoaXMubG9jYWwmJnRoaXMuY3VzdG9tRGlzdGFuY2VGdW5jdGlvblNldCl0aGlzLnJlcXVlc3REaXN0YW5jZVdpdGhDYWxsYmFjayhhLAoxLGMpO2Vsc2V7Y29uc3QgZD1bXSxmPSJMMiI9PXRoaXMuZmFjZXREaXN0U3dpdGNoO2ZvcihsZXQgZz0wO2c8dGhpcy52aXNkYXRhLmxlbmd0aDtnKyspZC5wdXNoKHRoaXMuZ2V0RGlzdCh0aGlzLnZpc2RhdGFbYV0sdGhpcy52aXNkYXRhW2ddLGYpKTt0aGlzLmZpbmFsaXplQWRkRGlzdGFuY2VNZXRyaWMoYSxkLGMuY2FsbGJhY2tQYXJhbXMpfX0saW52b2tlQ3VzdG9tRGlzdGFuY2VDYWxsYmFjazpmdW5jdGlvbihhKXtzd2l0Y2goYS5mdW5JZCl7Y2FzZSAwOnRoaXMuZmluYWxpemVDbG9zZXN0Q291bnRlcmZhY3R1YWwoYS5leEluZCxhLmRpc3RhbmNlcyxhLnBhcmFtcyk7YnJlYWs7Y2FzZSAxOnRoaXMuZmluYWxpemVBZGREaXN0YW5jZU1ldHJpYyhhLmV4SW5kLGEuZGlzdGFuY2VzLGEucGFyYW1zKX19LGZpbmFsaXplQWRkRGlzdGFuY2VNZXRyaWM6ZnVuY3Rpb24oYSxjLGQpe2E9ZC5mZWF0dXJlTmFtZTt0aGlzLmZhY2V0RGlzdEZlYXR1cmVOYW1lcy5wdXNoKGEpO2ZvcihkPQowO2Q8dGhpcy52aXNkYXRhLmxlbmd0aDtkKyspdGhpcy52aXNkYXRhW2RdW2FdPWNbZF07dGhpcy5yZWZyZXNoRGl2ZV8oKTsiY29sb3JCeSI9PXRoaXMuZmFjZXREaXN0U2V0dGluZz90aGlzLiQuZGl2ZS5jb2xvckJ5PWE6InZlcnRpY2FsRmFjZXQiPT10aGlzLmZhY2V0RGlzdFNldHRpbmc/dGhpcy4kLmRpdmUudmVydGljYWxGYWNldD1hOiJob3Jpem9udGFsRmFjZXQiPT10aGlzLmZhY2V0RGlzdFNldHRpbmc/dGhpcy4kLmRpdmUuaG9yaXpvbnRhbEZhY2V0PWE6InZlcnRpY2FsUG9zaXRpb24iPT10aGlzLmZhY2V0RGlzdFNldHRpbmc/dGhpcy4kLmRpdmUudmVydGljYWxQb3NpdGlvbj1hOiJob3Jpem9udGFsUG9zaXRpb24iPT10aGlzLmZhY2V0RGlzdFNldHRpbmcmJih0aGlzLiQuZGl2ZS5ob3Jpem9udGFsUG9zaXRpb249YSl9LHNldEZhY2V0RGlzdEZlYXR1cmVOYW1lOmZ1bmN0aW9uKGEsYyl7dGhpcy5mYWNldERpc3RGZWF0dXJlTmFtZT0iICIrYSsiIGRpc3RhbmNlIHRvIGRhdGFwb2ludCAiKwpjWzBdfSxuZWFyZXN0Q291bnRlcmZhY3R1YWxTdGF0dXNDaGFuZ2VkXzpmdW5jdGlvbihhKXthPyh0aGlzLmZpbmRDbG9zZXN0Q291bnRlcmZhY3R1YWxfKCksdGhpcy5jb21wYXJlVGl0bGU9IkNvdW50ZXJmYWN0dWFsIHZhbHVlKHMpIik6KHRoaXMuY29tcGFyZVRpdGxlPSJBdHRyaWJ1dGlvbiB2YWx1ZShzKSIsdGhpcy5jb21wYXJlZEluZGljZXM9W10sdGhpcy5jb3VudGVyZmFjdHVhbEV4YW1wbGVBbmRJbmZlcmVuY2U9bnVsbCx0aGlzLnJlZnJlc2hTZWxlY3RlZERhdGFwb2ludF8oKSl9LHJlZnJlc2hTZWxlY3RlZERhdGFwb2ludF86ZnVuY3Rpb24oKXtjb25zdCBhPXRoaXMuc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlO3RoaXMuc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlPW51bGw7dGhpcy5zZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2U9YX0saXNTYW1lSW5mZXJlbmNlQ2xhc3NfOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuaXNSZWdyZXNzaW9uXyh0aGlzLm1vZGVsVHlwZSk/Ck1hdGguYWJzKGEtYyk8dGhpcy5taW5Db3VudGVyZmFjdHVhbFZhbHVlRGlzdDphPT09Y30sYWRqdXN0TWF4Q291bnRlcmZhY3R1YWxWYWx1ZURpc3RfOmZ1bmN0aW9uKGEsYyl7dGhpcy5tYXhDb3VudGVyZmFjdHVhbFZhbHVlRGlzdD1NYXRoLm1heCh0aGlzLnN0YXRzW2NdLm51bWJlck1heC10aGlzLnZpc2RhdGFbYV1bY10sdGhpcy52aXNkYXRhW2FdW2NdLXRoaXMuc3RhdHNbY10ubnVtYmVyTWluKX0sYWRqdXN0TWluQ291bnRlcmZhY3R1YWxWYWx1ZURpc3RfOmZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLmRpc3RhbmNlU3RhdHNfW3RoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2UgdmFsdWUiLHRoaXMubmVhcmVzdENvdW50ZXJmYWN0dWFsTW9kZWxJbmRleCldO3RoaXMubWluQ291bnRlcmZhY3R1YWxWYWx1ZURpc3Q9YT9hLnN0ZERldjowfSxmaW5hbGl6ZUNsb3Nlc3RDb3VudGVyZmFjdHVhbDpmdW5jdGlvbihhLGMpe2NvbnN0IGQ9dGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiIEluZmVyZW5jZSB2YWx1ZSIsCnRoaXMubmVhcmVzdENvdW50ZXJmYWN0dWFsTW9kZWxJbmRleCk7dGhpcy5pc1JlZ3Jlc3Npb25fKHRoaXMubW9kZWxUeXBlKSYmdGhpcy5hZGp1c3RNYXhDb3VudGVyZmFjdHVhbFZhbHVlRGlzdF8oYSxkKTtsZXQgZj1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksZz0tMTtmb3IobGV0IGw9MDtsPHRoaXMudmlzZGF0YS5sZW5ndGg7bCsrKXtpZihsPT09YXx8dGhpcy5pc1NhbWVJbmZlcmVuY2VDbGFzc18odGhpcy52aXNkYXRhW2FdW2RdLHRoaXMudmlzZGF0YVtsXVtkXSkpY29udGludWU7bGV0IGs9Y1tsXTtrPGYmJihmPWssZz1sKX0tMSE9ZyYmKHRoaXMuY29tcGFyZWRJbmRpY2VzPVtnXSx0aGlzLmNvdW50ZXJmYWN0dWFsRXhhbXBsZUFuZEluZmVyZW5jZT10aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1tnXSl9LGZpbmRDbG9zZXN0Q291bnRlcmZhY3R1YWxfOmZ1bmN0aW9uKCl7Y29uc3QgYT10aGlzLnNlbGVjdGVkWzBdO2lmKHRoaXMubG9jYWwmJnRoaXMuY3VzdG9tRGlzdGFuY2VGdW5jdGlvblNldCl0aGlzLnJlcXVlc3REaXN0YW5jZVdpdGhDYWxsYmFjayhhLAowLHtjYWxsYmFja1BhcmFtczp7fSxkaXN0YW5jZVBhcmFtczp7fX0pO2Vsc2V7dmFyIGM9dGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiIEluZmVyZW5jZSB2YWx1ZSIsdGhpcy5uZWFyZXN0Q291bnRlcmZhY3R1YWxNb2RlbEluZGV4KTt0aGlzLmlzUmVncmVzc2lvbl8odGhpcy5tb2RlbFR5cGUpJiZ0aGlzLmFkanVzdE1heENvdW50ZXJmYWN0dWFsVmFsdWVEaXN0XyhhLGMpO3ZhciBkPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxmPS0xO2ZvcihsZXQgZz0wO2c8dGhpcy52aXNkYXRhLmxlbmd0aDtnKyspe2lmKGc9PT1hfHx0aGlzLmlzU2FtZUluZmVyZW5jZUNsYXNzXyh0aGlzLnZpc2RhdGFbYV1bY10sdGhpcy52aXNkYXRhW2ddW2NdKSljb250aW51ZTtsZXQgbD10aGlzLmdldERpc3QodGhpcy52aXNkYXRhW2FdLHRoaXMudmlzZGF0YVtnXSwiTDIiPT10aGlzLm5lYXJlc3RDb3VudGVyZmFjdHVhbERpc3QpO2w8ZCYmKGQ9bCxmPWcpfS0xIT1mJiYodGhpcy5jb21wYXJlZEluZGljZXM9CltmXSx0aGlzLmNvdW50ZXJmYWN0dWFsRXhhbXBsZUFuZEluZmVyZW5jZT10aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1tmXSx0aGlzLmNvbXBhcmVUaXRsZT0iQ291bnRlcmZhY3R1YWwgdmFsdWUocykiKX19LHJlcXVlc3REaXN0YW5jZVdpdGhDYWxsYmFjazpmdW5jdGlvbihhLGMsZCl7dGhpcy5maXJlKCJjb21wdXRlLWN1c3RvbS1kaXN0YW5jZSIse2luZGV4OmEsY2FsbGJhY2s6YyxwYXJhbXM6ZH0pfSxnZXREaXN0OmZ1bmN0aW9uKGEsYyxkKXtsZXQgZj0wO2NvbnN0IGc9Wy4uLm5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGEpLC4uLk9iamVjdC5rZXlzKGMpXSldO2ZvcihsZXQgaz0wO2s8Zy5sZW5ndGg7aysrKXt2YXIgbD1nW2tdO2lmKHRoaXMuaXNDb21wdXRlZEtleVN0cl8obCl8fGw9PXRoaXMuc2VsZWN0ZWRMYWJlbEZlYXR1cmV8fHRoaXMuc3RhdHNbbF0udW5pcXVlQ291bnQ9PXRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzLmxlbmd0aHx8dGhpcy5pc0F0dHJpYnV0aW9uS2V5U3RyXyhsKSljb250aW51ZTsKbGV0IG49YVtsXSxwPWNbbF07QXJyYXkuaXNBcnJheShuKXx8KG49W25dKTtBcnJheS5pc0FycmF5KHApfHwocD1bcF0pO2NvbnN0IHE9TWF0aC5tYXgobi5sZW5ndGgscC5sZW5ndGgpO2xldCByPTA7Zm9yKGxldCB0PTA7dDxxO3QrKylyPXRoaXMuZGlzdGFuY2VTdGF0c19bbF0uaXNOdW1lcmljP3IrdGhpcy5nZXROdW1lcmljRGlzdChuW3RdLHBbdF0sdGhpcy5kaXN0YW5jZVN0YXRzX1tsXSk6cit0aGlzLmdldENhdGVnb3JpY2FsRGlzdChuW3RdLHBbdF0sdGhpcy5kaXN0YW5jZVN0YXRzX1tsXSk7bD1yL3E7ZCYmKGwqPWwpO2YrPWx9cmV0dXJuIGZ9LGdldE51bWVyaWNEaXN0OmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gbnVsbD09YXx8bnVsbD09Yz8xOmQuc3RkRGV2P01hdGguYWJzKChhLWMpL2Quc3RkRGV2KTowfSxnZXRDYXRlZ29yaWNhbERpc3Q6ZnVuY3Rpb24oYSxjLGQpe3JldHVybiBudWxsPT1hfHxudWxsPT1jPzE6YT09Yz8wOmQucHJvYlNhbWVWYWx1ZX0sdmlzTW9kZUNoYW5nZWRfOmZ1bmN0aW9uKGEpeyJkaXZlIj09CmE/dGhpcy5oaWRlUGFydGlhbERlcGVuZGVuY2VQbG90c18oKTp0aGlzLnNob3dQYXJ0aWFsRGVwZW5kZW5jZVBsb3RzXygpfSxoaWRlUGFydGlhbERlcGVuZGVuY2VQbG90c186ZnVuY3Rpb24oKXt0aGlzLiQucGFydGlhbHBsb3Rob2xkZXIuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHNob3dQYXJ0aWFsRGVwZW5kZW5jZVBsb3RzXzpmdW5jdGlvbigpe3RoaXMuJC5wYXJ0aWFscGxvdGhvbGRlci5zdHlsZS5kaXNwbGF5PSJmbGV4IjtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PnRoaXMucG9wdWxhdGVQZFRhYnMoKSl9LGFyZVRoZXJlUGRQbG90RmVhdHVyZXNfOmZ1bmN0aW9uKGEpe3JldHVybiBhJiYwPGEubGVuZ3RofSxzZWxlY3RlZEluZGljZXNDaGFuZ2VkXzpmdW5jdGlvbihhKXt0aGlzLnNlbGVjdGVkPWEuZGV0YWlsLnZhbHVlO3RoaXMuc2V0QXR0cmlidXRpb25zKCk7dGhpcy5zZWxlY3RlZERhdGFVcGRhdGVkXygpO3RoaXMuc2hvd05lYXJlc3RDb3VudGVyZmFjdHVhbCYmMCE9CnRoaXMuc2VsZWN0ZWQubGVuZ3RoP3RoaXMuZmluZENsb3Nlc3RDb3VudGVyZmFjdHVhbF8oKTp0aGlzLmNvbXBhcmVkSW5kaWNlcz1bXX0sc2VsZWN0TmV4dERhdGFwb2ludF86ZnVuY3Rpb24oKXt0aGlzLiQuZGl2ZS5zZWxlY3RlZEluZGljZXM9Wyh0aGlzLnNlbGVjdGVkWzBdKzEpJXRoaXMudmlzZGF0YS5sZW5ndGhdfSxzZWxlY3RQcmV2RGF0YXBvaW50XzpmdW5jdGlvbigpe3RoaXMuJC5kaXZlLnNlbGVjdGVkSW5kaWNlcz1bKCh0aGlzLnNlbGVjdGVkWzBdLTEpJXRoaXMudmlzZGF0YS5sZW5ndGgrdGhpcy52aXNkYXRhLmxlbmd0aCkldGhpcy52aXNkYXRhLmxlbmd0aF19LHNlbGVjdGVkRXhhbXBsZUlucHV0Q2hhbmdlZF86ZnVuY3Rpb24oYSl7bnVsbCE9YSYmIiIhPWEmJihhPSthLGlzTmFOKGEpfHwwPmF8fGE+PXRoaXMudmlzZGF0YS5sZW5ndGh8fCh0aGlzLiQuZGl2ZS5zZWxlY3RlZEluZGljZXM9W2FdKSl9LHNldEV4YW1wbGVDb2xsYXBzZWRfOmZ1bmN0aW9uKCl7dGhpcy5leGFtcGxlRGlzcGxheU1vZGU9CiJncmlkIjt0aGlzLiQkKCIjdmlld2VyIikuZXhwYW5kZWRGZWF0dXJlcz17fTt0aGlzLiQkKCIjdmlld2VyIikuZXhwYW5kQWxsRmVhdHVyZXM9ITE7dGhpcy4kJCgiI3ZpZXdlciIpLnJlZnJlc2hFeGFtcGxlVmlld2VyKCl9LHNldEV4YW1wbGVTaG93XzpmdW5jdGlvbigpe3RoaXMuZXhhbXBsZURpc3BsYXlNb2RlPSJncmlkIjt0aGlzLiQkKCIjdmlld2VyIikuZXhwYW5kQWxsRmVhdHVyZXM9ITB9LHNldEV4YW1wbGVFeHBhbmRlZF86ZnVuY3Rpb24oKXt0aGlzLmV4YW1wbGVEaXNwbGF5TW9kZT0ic3RhY2tlZCI7dGhpcy4kJCgiI3ZpZXdlciIpLmV4cGFuZEFsbEZlYXR1cmVzPSEwfSxzdGF0c0NoYW5nZWRfOmZ1bmN0aW9uKGEpe3RoaXMuc3RhdHM9YS5kZXRhaWwudmFsdWV9LGlzQmluYXJ5Q2xhc3NpZmljYXRpb25fOmZ1bmN0aW9uKGEsYyl7cmV0dXJuImNsYXNzaWZpY2F0aW9uIj09YSYmIWN9LGlzTXVsdGlDbGFzc186ZnVuY3Rpb24oYSxjKXtyZXR1cm4iY2xhc3NpZmljYXRpb24iPT0KYSYmY30saXNSZWdyZXNzaW9uXzpmdW5jdGlvbihhKXtyZXR1cm4icmVncmVzc2lvbiI9PWF9LHNob3VsZFNob3dGZWF0dXJlRHJvcGRvd25fOmZ1bmN0aW9uKGEpe3JldHVybiBhJiYwPE9iamVjdC5rZXlzKGEpLmxlbmd0aH0sc2hvdWxkU2hvd1NlY29uZEZlYXR1cmVEcm9wZG93bl86ZnVuY3Rpb24oYSl7cmV0dXJuIiIhPWF9LHNob3VsZFNob3dMYWJlbERyb3Bkb3duXzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmMDxPYmplY3Qua2V5cyhhKS5sZW5ndGh9LHNob3VsZEhpZGVNb2RlbFNlbGVjdG9yXzpmdW5jdGlvbihhKXtyZXR1cm4hKGEmJjE8YS5sZW5ndGgpfSxzaG91bGRTaG93T3ZlcmFsbFBlcmZDaGFydHNfOmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4iIiE9YSYmIiI9PWMmJm51bGwhPWR9LHNob3VsZFNob3dGZWF0dXJlUGVyZkNoYXJ0c186ZnVuY3Rpb24oYSxjLGQpe3JldHVybiIiIT1hJiYiIiE9YyYmbnVsbCE9ZH0sc2hvdWxkU2hvd0Nvc3RSYXRpb186ZnVuY3Rpb24oYSxjLApkKXtyZXR1cm4iIiE9YSYmdGhpcy5pc0JpbmFyeUNsYXNzaWZpY2F0aW9uXyhjLGQpfSxhcmVQYXJ0aWFsRGVwZW5kZW5jZVBsb3RzRW5hYmxlZF86ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmhhc1NlbGVjdGVkKGEpJiZ0aGlzLmFyZUV4YW1wbGVzRWRpdGFibGVfKGMsZCl9LGhhc1NlbGVjdGVkOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hfSxnZXRGZWF0dXJlTGlzdF86ZnVuY3Rpb24oYSl7YT1PYmplY3Qua2V5cyhhKS5maWx0ZXIoYz0+IXRoaXMuaXNDb21wdXRlZEtleVN0cl8oYykpLnNvcnQoKTthLnB1c2goIiIpO3JldHVybiBhfSxzdHJTdGFydHNXaXRoXzpmdW5jdGlvbihhLGMpe3JldHVybiAwPT1hLmxhc3RJbmRleE9mKGMsMCl9LGdldE1vZGVsTmFtZV86ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucGFyc2VkTW9kZWxOYW1lc1thXX0sc3RyV2l0aE1vZGVsTmFtZV86ZnVuY3Rpb24oYSxjKXtyZXR1cm4gMTx0aGlzLm51bU1vZGVscz9hKyIgIit0aGlzLmdldE1vZGVsTmFtZV8oYyk6CmF9LGF0dHJpYnV0aW9uU3RyV2l0aE1vZGVsTmFtZV86ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5oYXNNdWx0aXBsZU1vZGVsQXR0cmlidXRpb25zXyh0aGlzLmF0dHJpYnV0aW9ucyk/YSsiICIrdGhpcy5nZXRNb2RlbE5hbWVfKGMpOmF9LHVwZGF0ZU51bWJlck9mTW9kZWxzOmZ1bmN0aW9uKCl7dGhpcy5fc2V0TnVtTW9kZWxzKHRoaXMubW9kZWxOYW1lLnNwbGl0KCIsIikubGVuZ3RoKTt0aGlzLnNlbGVjdGVkU2Vjb25kQnJlYWtkb3duRmVhdHVyZT10aGlzLnNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZT10aGlzLnNlbGVjdGVkTGFiZWxGZWF0dXJlPSIiO2NvbnN0IGE9W107Zm9yKGxldCBjPTA7Yzx0aGlzLm51bU1vZGVscztjKyspYS5wdXNoKHt0aHJlc2hvbGQ6LjV9KTt0aGlzLnNldCgib3ZlcmFsbFRocmVzaG9sZHMiLGEpO3RoaXMuc2hvdWxkRGlzYWJsZUluZmVyQnV0dG9uXyh0aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlcyx0aGlzLm1vZGVsTmFtZSx0aGlzLmluZmVyZW5jZUFkZHJlc3MsCnRoaXMudXBkYXRlZEV4YW1wbGUpfHx0aGlzLmluZmVyQ2xpY2tlZF8oKX0saXNDb21wdXRlZEtleVN0cl86ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc3RyU3RhcnRzV2l0aF8oYSwiIEluZmVyZW5jZSB2YWx1ZSIpfHx0aGlzLnN0clN0YXJ0c1dpdGhfKGEsIiBJbmZlcmVuY2UgbGFiZWwiKXx8dGhpcy5zdHJTdGFydHNXaXRoXyhhLCIgSW5mZXJlbmNlIGNvcnJlY3QiKXx8dGhpcy5zdHJTdGFydHNXaXRoXyhhLCIgSW5mZXJlbmNlIGVycm9yIil8fHRoaXMuc3RyU3RhcnRzV2l0aF8oYSwiIEluZmVyZW5jZSBzY29yZSIpfHx0aGlzLnN0clN0YXJ0c1dpdGhfKGEsIiBJbmZlcmVuY2UgYWJzb2x1dGUgZXJyb3IiKXx8dGhpcy5zdHJTdGFydHNXaXRoXyhhLCIgSW5mZXJlbmNlIHNxdWFyZWQgZXJyb3IiKXx8IiBEYXRhcG9pbnQgSUQiPT1hfHwtMSE9dGhpcy5mYWNldERpc3RGZWF0dXJlTmFtZXMuaW5kZXhPZihhKX0saXNBdHRyaWJ1dGlvbktleVN0cl86ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc3RyU3RhcnRzV2l0aF8oYSwKImF0dHJpYnV0aW9uc19fIil9LGdldFNsaWNlS2V5XzpmdW5jdGlvbihhLGMsZCl7ZnVuY3Rpb24gZihsKXtpZihsJiZ2b2lkIDA9PT1hW2xdKXJldHVybiI/Ijtjb25zdCBrPWdbbF07aWYoaylmb3IobGV0IG49MTtuPGsubGVuZ3RoO24rKylpZihhW2xdPGtbbl18fGFbbF09PT1rW25dJiZuPT09ay5sZW5ndGgtMSlyZXR1cm4iWyIra1tuLTFdKyIsICIra1tuXSsobjxrLmxlbmd0aC0xPyIpIjoiXSIpO3JldHVybiBhW2xdfWNvbnN0IGc9dGhpcy5mZWF0dXJlQnVja2V0RWRnZXNfO3JldHVybiB0aGlzLmNyZWF0ZUNvbWJpbmVkVmFsdWVTdHJpbmdfKGYoYyksZihkKSl9LGJyZWFrZG93bkZlYXR1cmVTZWxlY3RlZF86ZnVuY3Rpb24oKXt0aGlzLnJlc2V0T3B0aW1pemF0aW9uU2VsZWN0ZWRfKCk7IiI9PXRoaXMuc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlJiYodGhpcy5zZWxlY3RlZFNlY29uZEJyZWFrZG93bkZlYXR1cmU9IiIpO3RoaXMuY2FsY3VsYXRlQnVja2V0RWRnZXNfKHRoaXMuc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlLAp0aGlzLm51bVByaW1hcnlCdWNrZXRzKTt0aGlzLmNhbGN1bGF0ZUJ1Y2tldEVkZ2VzXyh0aGlzLnNlbGVjdGVkU2Vjb25kQnJlYWtkb3duRmVhdHVyZSx0aGlzLm51bVNlY29uZGFyeUJ1Y2tldHMpO2NvbnN0IGE9W10sYz17fTt0aGlzLnZpc2RhdGEuZm9yRWFjaChkPT57Y29uc3QgZj10aGlzLmdldFNsaWNlS2V5XyhkLHRoaXMuc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlKTtkPXRoaXMuZ2V0U2xpY2VLZXlfKGQsdGhpcy5zZWxlY3RlZFNlY29uZEJyZWFrZG93bkZlYXR1cmUpO2NvbnN0IGc9dGhpcy5jcmVhdGVDb21iaW5lZFZhbHVlU3RyaW5nXyhmLGQpO2cgaW4gY3x8KGEucHVzaCh7dmFsdWU6Zix2YWx1ZTI6ZCx0aHJlc2hvbGQ6V3QodGhpcy5vdmVyYWxsVGhyZXNob2xkcyksb3BlbmVkOiExfSksY1tnXT1hLmxlbmd0aC0xKX0pO3RoaXMuc2V0KCJmZWF0dXJlVmFsdWVUaHJlc2hvbGRzIixhKTt0aGlzLnJlZnJlc2hJbmZlcmVuY2VzXyghMSl9LGZlYXR1cmVWYWx1ZVRocmVzaG9sZHNDaGFuZ2VkXzpmdW5jdGlvbihhKXtjb25zdCBjPQp7fTtmb3IobGV0IGQ9MDtkPGEubGVuZ3RoO2QrKyljW3RoaXMuY3JlYXRlQ29tYmluZWRWYWx1ZVN0cmluZ18oYVtkXS52YWx1ZSxhW2RdLnZhbHVlMildPWQ7dGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzSW5kZXhNYXA9Y30sbGFiZWxGZWF0dXJlU2VsZWN0ZWRfOmZ1bmN0aW9uKCl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy51cGRhdGVJbmZlcmVuY2VTdGF0c18oITApO3RoaXMucmVmcmVzaERpdmVfKCl9KX0sc2lkZVRhYlNlbGVjdGVkQ2hhbmdlZF86ZnVuY3Rpb24oYSl7aWYoMT09YSlyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pnt0aGlzLnVwZGF0ZUluZmVyZW5jZVN0YXRzXyghMCl9KTtlbHNlIGlmKDI9PWEpe2E9dGhpcy4kLm92ZXJ2aWV3LnF1ZXJ5U2VsZWN0b3JBbGwoImZhY2V0cy1vdmVydmlldy10YWJsZSIpO2ZvcihsZXQgYz0wO2M8YS5sZW5ndGg7YysrKWFbY10uX2hhbmRsZVJlc2l6ZSgpfX0sdXBkYXRlSW5mZXJlbmNlU3RhdHNfOmZ1bmN0aW9uKGEpe2lmKHRoaXMuaW5mZXJlbmNlU3RhdHNfJiYKdGhpcy52aXNkYXRhJiYiIiE9dGhpcy5zZWxlY3RlZExhYmVsRmVhdHVyZSYmMCE9dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXMubGVuZ3RoJiZudWxsIT10aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1swXS5pbmZlcmVuY2VzJiZ0aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1swXS5pbmZlcmVuY2VzWzBdLmxlbmd0aD09dGhpcy5udW1Nb2RlbHMmJih0aGlzLmluZmVyZW5jZVN0YXRzXy5sZW5ndGg9PXRoaXMubnVtTW9kZWxzfHxhKSl7aWYoYSl7dmFyIGM9W10sZD1bXTtmb3IodmFyIGY9MDtmPHRoaXMubnVtTW9kZWxzO2YrKyl7dmFyIGc9e307aWYodGhpcy5pc0JpbmFyeUNsYXNzaWZpY2F0aW9uXyh0aGlzLm1vZGVsVHlwZSx0aGlzLm11bHRpQ2xhc3MpKXtnLnRocmVzaG9sZHM9W107Zm9yKHZhciBsPTA7MTAxPmw7bCsrKWcudGhyZXNob2xkcy5wdXNoKHtUUDowLEZQOjAsRk46MCxUTjowfSk7Zy5mYWNldGVkPXt9O2ZvcihsPTA7bDx0aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlcy5sZW5ndGg7bCsrKXt2YXIgaz0KdGhpcy52aXNkYXRhW2xdLG49bnVsbDtpZigiIiE9dGhpcy5zZWxlY3RlZEJyZWFrZG93bkZlYXR1cmUpe3ZhciBwPXRoaXMuZ2V0U2xpY2VLZXlfKGssdGhpcy5zZWxlY3RlZEJyZWFrZG93bkZlYXR1cmUsdGhpcy5zZWxlY3RlZFNlY29uZEJyZWFrZG93bkZlYXR1cmUpO249Zy5mYWNldGVkW3BdO2lmKCFuKXtnLmZhY2V0ZWRbcF09W107Zm9yKG49MDsxMDE+bjtuKyspZy5mYWNldGVkW3BdLnB1c2goe1RQOjAsRlA6MCxGTjowLFROOjB9KTtuPWcuZmFjZXRlZFtwXX19cD10aGlzLmdldENsYXNzaWZpY2F0aW9uQmVzdE5vblplcm8obCxmKTtmb3IodmFyIHE9MDsxMDA+PXEmJiEocT4xMDAqcC5zY29yZSk7cSsrKStrW3RoaXMuc2VsZWN0ZWRMYWJlbEZlYXR1cmVdPT0rcC5sYWJlbD8oZy50aHJlc2hvbGRzW3FdLlRQKz0xLG4mJihuW3FdLlRQKz0xKSk6KGcudGhyZXNob2xkc1txXS5GUCs9MSxuJiYobltxXS5GUCs9MSkpO2Zvcig7MTAwPj1xO3ErKyludWxsPT1rW3RoaXMuc2VsZWN0ZWRMYWJlbEZlYXR1cmVdfHwKMD09K2tbdGhpcy5zZWxlY3RlZExhYmVsRmVhdHVyZV0/KGcudGhyZXNob2xkc1txXS5UTis9MSxuJiYobltxXS5UTis9MSkpOihnLnRocmVzaG9sZHNbcV0uRk4rPTEsbiYmKG5bcV0uRk4rPTEpKX10aGlzLmFsbENvbmZNYXRyaXhMYWJlbHM9W107dGhpcy5jYWxjVGhyZXNob2xkU3RhdHMoZy50aHJlc2hvbGRzKTtmb3IodmFyIHIgaW4gZy5mYWNldGVkKWcuZmFjZXRlZC5oYXNPd25Qcm9wZXJ0eShyKSYmdGhpcy5jYWxjVGhyZXNob2xkU3RhdHMoZy5mYWNldGVkW3JdKX1lbHNlIGlmKHRoaXMuaXNNdWx0aUNsYXNzXyh0aGlzLm1vZGVsVHlwZSx0aGlzLm11bHRpQ2xhc3MpKXtnLnJlc3VsdHM9e307Zy5mYWNldGVkPXt9O2w9bmV3IFNldDtmb3Ioaz0wO2s8dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXMubGVuZ3RoO2srKyl7bj10aGlzLnZpc2RhdGFba107cD1udWxsOyIiIT10aGlzLnNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSYmKHE9dGhpcy5nZXRTbGljZUtleV8obix0aGlzLnNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSwKdGhpcy5zZWxlY3RlZFNlY29uZEJyZWFrZG93bkZlYXR1cmUpLHA9Zy5mYWNldGVkW3FdLHB8fChnLmZhY2V0ZWRbcV09e30scD1nLmZhY2V0ZWRbcV0pKTt2YXIgdD1nLnJlc3VsdHNbblt0aGlzLnNlbGVjdGVkTGFiZWxGZWF0dXJlXV07dHx8KGcucmVzdWx0c1tuW3RoaXMuc2VsZWN0ZWRMYWJlbEZlYXR1cmVdXT17fSx0PWcucmVzdWx0c1tuW3RoaXMuc2VsZWN0ZWRMYWJlbEZlYXR1cmVdXSk7cT10aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHZhbHVlIixmKTt2YXIgdj10W25bcV1dO2wuYWRkKFN0cmluZyhuW3FdKSk7bC5hZGQoU3RyaW5nKG5bdGhpcy5zZWxlY3RlZExhYmVsRmVhdHVyZV0pKTt0W25bcV1dPW51bGw9PXY/MTp0W25bcV1dKzE7cCYmKHQ9cFtuW3RoaXMuc2VsZWN0ZWRMYWJlbEZlYXR1cmVdXSx0fHwocFtuW3RoaXMuc2VsZWN0ZWRMYWJlbEZlYXR1cmVdXT17fSx0PXBbblt0aGlzLnNlbGVjdGVkTGFiZWxGZWF0dXJlXV0pLHRbbltxXV09bnVsbD09CnRbbltxXV0/MTp0W25bcV1dKzEpfXRoaXMuYWxsQ29uZk1hdHJpeExhYmVscz1BcnJheS5mcm9tKGwudmFsdWVzKCkpO2w9e307Zm9yKGs9MDtrPHRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzLmxlbmd0aDtrKyspZm9yKHA9dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXNba10sbj10aGlzLnZpc2RhdGFba11bdGhpcy5zZWxlY3RlZExhYmVsRmVhdHVyZV0udG9TdHJpbmcoKSxwPXAuaW5mZXJlbmNlc1twLmluZmVyZW5jZXMubGVuZ3RoLTFdW2ZdLHE9IiIhPXRoaXMuc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlP3RoaXMuZ2V0U2xpY2VLZXlfKHRoaXMudmlzZGF0YVtrXSx0aGlzLnNlbGVjdGVkQnJlYWtkb3duRmVhdHVyZSx0aGlzLnNlbGVjdGVkU2Vjb25kQnJlYWtkb3duRmVhdHVyZSk6IiIsKHEgaW4gbCl8fChsW3FdPXt9KSx0PTA7dDxwLmxlbmd0aDt0Kyspe3Y9cFt0XS5sYWJlbDtpZighKHYgaW4gbFtxXSkpe2xbcV1bdl09W107Zm9yKHZhciB5PTA7MTAwPj15O3krKylsW3FdW3ZdLnB1c2goe1RQOjAsCkZQOjAsRk46MCxUTjowfSl9eT0xMDAqcFt0XS5zY29yZTtsZXQgeD0iIjtmb3IobGV0IEM9MDsxMDA+PUM7QysrKXg9dj09PW4/eT5DPyJUUCI6IkZOIjp5PkM/IkZQIjoiVE4iLGxbcV1bdl1bQ11beF0rPTF9T2JqZWN0LnZhbHVlcyhsKS5mb3JFYWNoKHg9Pk9iamVjdC52YWx1ZXMoeCkuZm9yRWFjaCh0aGlzLmNhbGNUaHJlc2hvbGRTdGF0cykpO2cuYWxsVGhyZXNob2xkcz1sfWVsc2V7Zy5yZXN1bHRzPXtlcnJvcnM6W119O2cuZmFjZXRlZD17fTtmb3IobD0wO2w8dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXMubGVuZ3RoO2wrKyluPXRoaXMudmlzZGF0YVtsXSxrPW51bGwsIiIhPXRoaXMuc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlJiYocD10aGlzLmdldFNsaWNlS2V5XyhuLHRoaXMuc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlLHRoaXMuc2VsZWN0ZWRTZWNvbmRCcmVha2Rvd25GZWF0dXJlKSxrPWcuZmFjZXRlZFtwXSxrfHwoZy5mYWNldGVkW3BdPXtlcnJvcnM6W119LGs9Zy5mYWNldGVkW3BdKSksCm49blt0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHZhbHVlIixmKV0tblt0aGlzLnNlbGVjdGVkTGFiZWxGZWF0dXJlXSxnLnJlc3VsdHMuZXJyb3JzLnB1c2gobiksayYmay5lcnJvcnMucHVzaChuKTtkLnB1c2godGhpcy5maWxsSW5SZWdyZXNzaW9uU3RhdHMoZy5yZXN1bHRzLHRoaXMuZm9ybWF0Q2hhcnRLZXkoIkFsbCBkYXRhcG9pbnRzIixmLHRoaXMubnVtTW9kZWxzKSkpO2Zvcih2YXIgeiBpbiBnLmZhY2V0ZWQpZC5wdXNoKHRoaXMuZmlsbEluUmVncmVzc2lvblN0YXRzKGcuZmFjZXRlZFt6XSx0aGlzLmZvcm1hdENoYXJ0S2V5KHosZix0aGlzLm51bU1vZGVscykpKX1jLnB1c2goZyl9ZD10aGlzLnNvcnRSZWdyZXNzaW9uRW50cmllcyhkKTt0aGlzLnJlZ3Jlc3Npb25FbnRyaWVzXz1bXTt0aGlzLnJlZ3Jlc3Npb25FbnRyaWVzXz1kO3RoaXMuaW5mZXJlbmNlU3RhdHNfPWN9Yz10aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHM7dGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzPQpbXTt0aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHM9dGhpcy5zb3J0RmVhdHVyZVZhbHVlcyhjKTtpZih0aGlzLmlzQmluYXJ5Q2xhc3NpZmljYXRpb25fKHRoaXMubW9kZWxUeXBlLHRoaXMubXVsdGlDbGFzcykpe2ZvcihjPTA7Yzx0aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHMubGVuZ3RoO2MrKyl7ZD1bXTtmPVtdO2c9dGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzW2NdLnRocmVzaG9sZDtmb3Iocj0wO3I8Zy5sZW5ndGg7cisrKWQucHVzaCh0aGlzLmluZmVyZW5jZVN0YXRzX1tyXS5mYWNldGVkW3RoaXMuY3JlYXRlQ29tYmluZWRWYWx1ZVN0cmluZ18odGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzW2NdLnZhbHVlLHRoaXMuZmVhdHVyZVZhbHVlVGhyZXNob2xkc1tjXS52YWx1ZTIpXSksZi5wdXNoKGdbcl0udGhyZXNob2xkKTt0aGlzLnBsb3RDaGFydCh0aGlzLiQkKCIjIit0aGlzLmdldFJvY0NoYXJ0SWQoYykpLGQsZixhLCEwKTt0aGlzLnBsb3RDaGFydCh0aGlzLiQkKCIjIisKdGhpcy5nZXRQckNoYXJ0SWQoYykpLGQsZixhLCExKX1jPVtdO2Q9W107Zm9yKGY9MDtmPHRoaXMuaW5mZXJlbmNlU3RhdHNfLmxlbmd0aDtmKyspYy5wdXNoKHRoaXMuaW5mZXJlbmNlU3RhdHNfW2ZdLnRocmVzaG9sZHMpLGQucHVzaCh0aGlzLm92ZXJhbGxUaHJlc2hvbGRzW2ZdLnRocmVzaG9sZCk7dGhpcy5wbG90Q2hhcnQodGhpcy4kJCgiI3JvY2NoYXJ0IiksYyxkLGEsITApO3RoaXMucGxvdENoYXJ0KHRoaXMuJCQoIiNwcmNoYXJ0IiksYyxkLGEsITEpfWVsc2UgaWYodGhpcy5pc011bHRpQ2xhc3NfKHRoaXMubW9kZWxUeXBlLHRoaXMubXVsdGlDbGFzcykpZm9yKGQ9KGM9MDx0aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHMubGVuZ3RoKT90aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHMubWFwKHg9PnRoaXMuY3JlYXRlQ29tYmluZWRWYWx1ZVN0cmluZ18oeC52YWx1ZSx4LnZhbHVlMikpOlsiIl0sZj0wO2Y8ZC5sZW5ndGg7ZisrKWZvcihnPWRbZl0scj0wO3I8dGhpcy5hbGxDb25mTWF0cml4TGFiZWxzLmxlbmd0aDtyKyspe3o9CnRoaXMuYWxsQ29uZk1hdHJpeExhYmVsc1tyXTtsPVtdO2s9W107bj1jP3RoaXMuZmVhdHVyZVZhbHVlVGhyZXNob2xkc1tmXS50aHJlc2hvbGQ6dGhpcy5vdmVyYWxsVGhyZXNob2xkcztmb3IocD0wO3A8dGhpcy5pbmZlcmVuY2VTdGF0c18ubGVuZ3RoO3ArKylsLnB1c2godGhpcy5pbmZlcmVuY2VTdGF0c19bcF0uYWxsVGhyZXNob2xkc1tnXVt6XSksay5wdXNoKG5bcF0udGhyZXNob2xkKTt0aGlzLnBsb3RDaGFydCh0aGlzLiQkKCIjIit0aGlzLmdldFJvY0NoYXJ0TGFiZWxJZChyLGM/ZjoiIikpLGwsayxhLCEwKTt0aGlzLnBsb3RDaGFydCh0aGlzLiQkKCIjIit0aGlzLmdldFByQ2hhcnRMYWJlbElkKHIsYz9mOiIiKSksbCxrLGEsITEpfXRoaXMudXBkYXRlQ29ycmVjdG5lc3NfKCl9fSxzb3J0RmVhdHVyZVZhbHVlczpmdW5jdGlvbihhKXtjb25zdCBjPXRoaXMuaW5mZXJlbmNlU3RhdHNfWzBdO2E9YS5maWx0ZXIoZD0+dGhpcy5pc1JlZ3Jlc3Npb25fKHRoaXMubW9kZWxUeXBlKT8KMDx0aGlzLmdldFJlZ3Jlc3Npb25Db3VudChjLGQpOnRoaXMuaXNCaW5hcnlDbGFzc2lmaWNhdGlvbl8odGhpcy5tb2RlbFR5cGUsdGhpcy5tdWx0aUNsYXNzKT8wPHRoaXMuZ2V0QmluYXJ5Q2xhc3NpZmljYXRpb25Db3VudChjLGQpOjA8dGhpcy5nZXRNdWx0aWNsYXNzQ2xhc3NpZmljYXRpb25Db3VudChjLGQpKTtyZXR1cm4gYS5zb3J0KChkLGYpPT57aWYoIkNvdW50Ij09dGhpcy5zZWxlY3RlZEZlYXR1cmVTb3J0KXJldHVybiB0aGlzLmlzUmVncmVzc2lvbl8odGhpcy5tb2RlbFR5cGUpP3RoaXMuZ2V0UmVncmVzc2lvbkNvdW50KGMsZiktdGhpcy5nZXRSZWdyZXNzaW9uQ291bnQoYyxkKTp0aGlzLmlzQmluYXJ5Q2xhc3NpZmljYXRpb25fKHRoaXMubW9kZWxUeXBlLHRoaXMubXVsdGlDbGFzcyk/dGhpcy5nZXRCaW5hcnlDbGFzc2lmaWNhdGlvbkNvdW50KGMsZiktdGhpcy5nZXRCaW5hcnlDbGFzc2lmaWNhdGlvbkNvdW50KGMsZCk6dGhpcy5nZXRNdWx0aWNsYXNzQ2xhc3NpZmljYXRpb25Db3VudChjLApmKS10aGlzLmdldE11bHRpY2xhc3NDbGFzc2lmaWNhdGlvbkNvdW50KGMsZCk7aWYoIkFscGhhYmV0aWNhbCI9PXRoaXMuc2VsZWN0ZWRGZWF0dXJlU29ydClyZXR1cm4gZD10aGlzLmdldFByaW50YWJsZVZhbHVlXyhkKSxmPXRoaXMuZ2V0UHJpbnRhYmxlVmFsdWVfKGYpLCJbIj09PWRbMF0mJiJbIj09PWZbMF0/TnVtYmVyLnBhcnNlRmxvYXQoZC5zdWJzdHJpbmcoMSkpLU51bWJlci5wYXJzZUZsb2F0KGYuc3Vic3RyaW5nKDEpKTpkLmxvY2FsZUNvbXBhcmUoZik7aWYoIkFjY3VyYWN5Ij09dGhpcy5zZWxlY3RlZEZlYXR1cmVTb3J0KXJldHVybiB0aGlzLmlzQmluYXJ5Q2xhc3NpZmljYXRpb25fKHRoaXMubW9kZWxUeXBlLHRoaXMubXVsdGlDbGFzcyk/K3RoaXMuZ2V0QWNjdXJhY3lNb2RlbEluZGV4KHRoaXMuaW5mZXJlbmNlU3RhdHNfLGYudGhyZXNob2xkLDAsZiktK3RoaXMuZ2V0QWNjdXJhY3lNb2RlbEluZGV4KHRoaXMuaW5mZXJlbmNlU3RhdHNfLGQudGhyZXNob2xkLDAsCmQpOit0aGlzLmdldE11bHRpQ2xhc3NBY2N1cmFjeU1vZGVsSW5kZXgodGhpcy5pbmZlcmVuY2VTdGF0c18sMCxmKS0rdGhpcy5nZXRNdWx0aUNsYXNzQWNjdXJhY3lNb2RlbEluZGV4KHRoaXMuaW5mZXJlbmNlU3RhdHNfLDAsZCk7aWYoIkZhbHNlIHBvc2l0aXZlcyI9PXRoaXMuc2VsZWN0ZWRGZWF0dXJlU29ydClyZXR1cm4rdGhpcy5nZXRGUE1vZGVsSW5kZXgodGhpcy5pbmZlcmVuY2VTdGF0c18sZi50aHJlc2hvbGQsMCxmKS0rdGhpcy5nZXRGUE1vZGVsSW5kZXgodGhpcy5pbmZlcmVuY2VTdGF0c18sZC50aHJlc2hvbGQsMCxkKTtpZigiRmFsc2UgbmVnYXRpdmVzIj09dGhpcy5zZWxlY3RlZEZlYXR1cmVTb3J0KXJldHVybiB0aGlzLmdldEZOTW9kZWxJbmRleCgrdGhpcy5pbmZlcmVuY2VTdGF0c18sZi50aHJlc2hvbGQsMCxmKS0rdGhpcy5nZXRGTk1vZGVsSW5kZXgodGhpcy5pbmZlcmVuY2VTdGF0c18sZC50aHJlc2hvbGQsMCxkKX0pfSxzb3J0UmVncmVzc2lvbkVudHJpZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc29ydCgoYywKZCk9PntpZigiQ291bnQiPT10aGlzLnNlbGVjdGVkRmVhdHVyZVNvcnQpcmV0dXJuIGQuY291bnQtYy5jb3VudDtpZigiQWxwaGFiZXRpY2FsIj09dGhpcy5zZWxlY3RlZEZlYXR1cmVTb3J0KXJldHVybiJbIj09PWMubmFtZVswXSYmIlsiPT09ZC5uYW1lWzBdP051bWJlci5wYXJzZUZsb2F0KGMubmFtZS5zdWJzdHJpbmcoMSkpLU51bWJlci5wYXJzZUZsb2F0KGQubmFtZS5zdWJzdHJpbmcoMSkpOmMubmFtZS5sb2NhbGVDb21wYXJlKGQubmFtZSk7aWYoIk1lYW4gZXJyb3IiPT10aGlzLnNlbGVjdGVkRmVhdHVyZVNvcnQpcmV0dXJuIGQubWVhbkVycm9yLWMubWVhbkVycm9yO2lmKCJNZWFuIGFic29sdXRlIGVycm9yIj09dGhpcy5zZWxlY3RlZEZlYXR1cmVTb3J0KXJldHVybiBkLm1lYW5BYnNFcnJvci1jLm1lYW5BYnNFcnJvcjtpZigiTWVhbiBzcXVhcmVkIGVycm9yIj09dGhpcy5zZWxlY3RlZEZlYXR1cmVTb3J0KXJldHVybiBkLm1lYW5TcXVhcmVkRXJyb3ItYy5tZWFuU3F1YXJlZEVycm9yOwppZigiTWVkaWFuIGVycm9yIj09dGhpcy5zZWxlY3RlZEZlYXR1cmVTb3J0KXJldHVybiBkLm1lZGlhbkVycm9yLWMubWVkaWFuRXJyb3I7aWYoIk1lZGlhbiBhYnNvbHV0ZSBlcnJvciI9PXRoaXMuc2VsZWN0ZWRGZWF0dXJlU29ydClyZXR1cm4gZC5tZWRpYW5BYnNFcnJvci1jLm1lZGlhbkFic0Vycm9yO2lmKCJNZWRpYW4gc3F1YXJlZCBlcnJvciI9PXRoaXMuc2VsZWN0ZWRGZWF0dXJlU29ydClyZXR1cm4gZC5tZWRpYW5TcXVhcmVkRXJyb3ItYy5tZWRpYW5TcXVhcmVkRXJyb3J9KX0sZmlsbEluUmVncmVzc2lvblN0YXRzOmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZChrKXtyZXR1cm4gay5yZWR1Y2UoKG4scCk9Pm4rcCwwKS9rLmxlbmd0aH1mdW5jdGlvbiBmKGspe2lmKDA9PWsubGVuZ3RoKXJldHVybiBOYU47az1rLnNvcnQoKHAscSk9PnAtcSk7Y29uc3Qgbj1rLmxlbmd0aC8yO3JldHVybiAxPT1rLmxlbmd0aD9rWzBdOjA9PWsubGVuZ3RoJTI/a1tuXTooa1tNYXRoLmZsb29yKG4pXSsKa1tNYXRoLmNlaWwobildKS8yfWNvbnN0IGc9YS5lcnJvcnMubWFwKGs9Pk1hdGguYWJzKGspKSxsPWEuZXJyb3JzLm1hcChrPT5rKmspO3JldHVybntuYW1lOmMsbWVhbkVycm9yOmQoYS5lcnJvcnMpLG1lYW5BYnNFcnJvcjpkKGcpLG1lYW5TcXVhcmVkRXJyb3I6ZChsKSxtZWRpYW5FcnJvcjpmKGEuZXJyb3JzKSxtZWRpYW5BYnNFcnJvcjpmKGcpLG1lZGlhblNxdWFyZWRFcnJvcjpmKGwpLGNvdW50OmEuZXJyb3JzLmxlbmd0aH19LHBsb3RDaGFydDpmdW5jdGlvbihhLGMsZCxmLGcpe2lmKGMmJmNbMF0mJmEpe3ZhciBsPVtdLGs9W10sbj1nPyJGUFIiOiJUUFIiLHA9Zz8iVFBSIjoiUFBWIixxPWc/IkZQUiI6IlJlY2FsbCIscj1nPyJUUFIiOiJQcmVjaXNpb24iO2ZvcihsZXQgdD0wO3Q8Yy5sZW5ndGg7dCsrKXtsZXQgdj1udWxsO2NvbnN0IHk9Y1t0XS5tYXAoKHoseCk9PnsuNT54LTEwMCpkW3RdJiYodj17c3RlcDp6W25dLHNjYWxhcjp6W3BdLHRocmVzaG9sZDp4LzEwMH0pOwpyZXR1cm57c3RlcDp6W25dLHNjYWxhcjp6W3BdLHRocmVzaG9sZDp4LzEwMH19KS5yZXZlcnNlKCk7YS5zZXRTZXJpZXNEYXRhKHRoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIlRocmVzaG9sZCBzZXQiLHQpLFt2XSk7ZiYmKGEuc2V0U2VyaWVzRGF0YSh0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCJST0MiLHQpLHkpLGwucHVzaCh0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCJST0MiLHQpKSxsLnB1c2godGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiVGhyZXNob2xkIHNldCIsdCkpLGsucHVzaCh0aGlzLnJvY0N1cnZlTGluZUNvbG9yc1t0XSksay5wdXNoKHRoaXMucm9jQ3VydmVDb2xvcnNbdF0pKX1pZihmKXtjb25zdCB0PWQzLmZvcm1hdCgiLjJmIik7YS54QXhpc0Zvcm1hdHRlcj1kMy5mb3JtYXQoIi4yZiIpO2NvbnN0IHY9ZDMuZm9ybWF0KCIsLjEiKTtmPVt7dGl0bGU6IlRocmVzaG9sZCIsZXZhbHVhdGU6ZnVuY3Rpb24oeSl7cmV0dXJuIHQoeS5kYXR1bS50aHJlc2hvbGQpfX0se3RpdGxlOnIsCmV2YWx1YXRlOmZ1bmN0aW9uKHkpe3JldHVybiBnP3YoeS5kYXR1bS5zY2FsYXIpOnQoeS5kYXR1bS5zY2FsYXIpfX0se3RpdGxlOnEsZXZhbHVhdGU6ZnVuY3Rpb24oeSl7cmV0dXJuIGc/dih5LmRhdHVtLnN0ZXApOnQoeS5kYXR1bS5zdGVwKX19XTsxPGMubGVuZ3RoJiZmLnB1c2goe3RpdGxlOiJNb2RlbCIsZXZhbHVhdGU6ZnVuY3Rpb24oeSl7eT15LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lLnNwbGl0KCIgIik7cmV0dXJuIHlbeS5sZW5ndGgtMV19fSk7YS50b29sdGlwQ29sdW1ucz1mO2EuY29sb3JTY2FsZT0obmV3IFBsb3R0YWJsZS5TY2FsZXMuQ29sb3IpLnJhbmdlKGspO2EuY29sb3JTY2FsZS5kb21haW4obCk7YS5zZXRWaXNpYmxlU2VyaWVzKGwpfX19LGNhbGNUaHJlc2hvbGRTdGF0czpmdW5jdGlvbihhKXtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKylhW2NdLlRQUj0wPGFbY10uVFArYVtjXS5GTj9hW2NdLlRQLyhhW2NdLlRQK2FbY10uRk4pOjAsYVtjXS5GUFI9MDwKYVtjXS5GUCthW2NdLlROP2FbY10uRlAvKGFbY10uRlArYVtjXS5UTik6MCxhW2NdLlBQVj0wPGFbY10uVFArYVtjXS5GUD9hW2NdLlRQLyhhW2NdLlRQK2FbY10uRlApOjB9LG9wdGltaXphdGlvblNlbGVjdGVkQ2hhbmdlZF86ZnVuY3Rpb24oYSl7ImN1c3RvbSIhPWEmJigidW5hd2FyZSI9PWE/dGhpcy5vcHRpbWl6ZVRocmVzaG9sZENsaWNrZWRfKCk6Imdyb3VwIj09YT90aGlzLm9wdGltaXplRmFjZXRlZFRocmVzaG9sZHNDbGlja2VkXygpOiJkZW1vcGFyaXR5Ij09YT90aGlzLmRlbW9QYXJpdHlDbGlja2VkXygpOiJlcXVhbGFjYyI9PWE/dGhpcy5lcXVhbEFjY0NsaWNrZWRfKCk6ImVxdWFsb3BwIj09YSYmdGhpcy5lcXVhbE9wcG9DbGlja2VkXygpLHRoaXMudXBkYXRlSW5mZXJlbmNlU3RhdHNfKCEwKSl9LGNvc3RSYXRpb0NoYW5nZWRfOmZ1bmN0aW9uKCl7dGhpcy5yZXNldE9wdGltaXphdGlvblNlbGVjdGVkXygpfSxyZXNldE9wdGltaXphdGlvblNlbGVjdGVkXzpmdW5jdGlvbigpe2NvbnN0IGE9CnRoaXMuJCQoIiNjdXN0b210aHJlc2giKTtudWxsIT1hJiZhLmNsaWNrKCl9LG9wdGltaXplVGhyZXNob2xkQ2xpY2tlZF86ZnVuY3Rpb24oKXtmb3IobGV0IGE9MDthPHRoaXMuaW5mZXJlbmNlU3RhdHNfLmxlbmd0aDthKyspe2NvbnN0IGM9dGhpcy5maW5kT3B0aW1hbFRocmVzaG9sZF8odGhpcy5pbmZlcmVuY2VTdGF0c19bYV0udGhyZXNob2xkcyk7dGhpcy5zZXQoIm92ZXJhbGxUaHJlc2hvbGRzLiIrYSsiLnRocmVzaG9sZCIsYyk7aWYodGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzKWZvcihsZXQgZD0wO2Q8dGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzLmxlbmd0aDtkKyspdGhpcy5zZXQoImZlYXR1cmVWYWx1ZVRocmVzaG9sZHMuIitkKyIudGhyZXNob2xkLiIrYSsiLnRocmVzaG9sZCIsYyl9fSxvcHRpbWl6ZUZhY2V0ZWRUaHJlc2hvbGRzQ2xpY2tlZF86ZnVuY3Rpb24oKXtmb3IobGV0IGE9MDthPHRoaXMuaW5mZXJlbmNlU3RhdHNfLmxlbmd0aDthKyspe2NvbnN0IGM9Ck9iamVjdC5rZXlzKHRoaXMuaW5mZXJlbmNlU3RhdHNfW2FdLmZhY2V0ZWQpO2ZvcihsZXQgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMuc2V0KCJmZWF0dXJlVmFsdWVUaHJlc2hvbGRzLiIrZCsiLnRocmVzaG9sZC4iK2ErIi50aHJlc2hvbGQiLHRoaXMuZmluZE9wdGltYWxUaHJlc2hvbGRfKHRoaXMuaW5mZXJlbmNlU3RhdHNfW2FdLmZhY2V0ZWRbY1tkXV0pKX19LGZpbmRPcHRpbWFsVGhyZXNob2xkXzpmdW5jdGlvbihhKXtsZXQgYz1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksZD0wO2ZvcihsZXQgZj0wO2Y8YS5sZW5ndGg7ZisrKXtjb25zdCBnPXRoaXMuZ2V0Q29zdChhW2ZdKTtnPD1jJiYoYz1nLGQ9Zil9cmV0dXJuIGQvMTAwfSxlcXVhbE9wcG9DbGlja2VkXzpmdW5jdGlvbigpe3RoaXMuZ2V0QmVzdFRocmVzaG9sZHNCeUZhaXJuZXNzTWVhc3VyZV8oYT0+YS5UUC8oYS5UUCthLkZOKSl9LGVxdWFsQWNjQ2xpY2tlZF86ZnVuY3Rpb24oKXt0aGlzLmdldEJlc3RUaHJlc2hvbGRzQnlGYWlybmVzc01lYXN1cmVfKGE9PgooYS5UUCthLlROKS8oYS5UUCthLkZQK2EuVE4rYS5GTikpfSxkZW1vUGFyaXR5Q2xpY2tlZF86ZnVuY3Rpb24oKXt0aGlzLmdldEJlc3RUaHJlc2hvbGRzQnlGYWlybmVzc01lYXN1cmVfKGE9PihhLlRQK2EuRlApLyhhLlRQK2EuRlArYS5UTithLkZOKSl9LGdldEJlc3RUaHJlc2hvbGRzQnlGYWlybmVzc01lYXN1cmVfOmZ1bmN0aW9uKGEpe2ZvcihsZXQgZD0wO2Q8dGhpcy5pbmZlcmVuY2VTdGF0c18ubGVuZ3RoO2QrKyl7dmFyIGM9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO2xldCBmPW51bGw7Y29uc3QgZz10aGlzLmluZmVyZW5jZVN0YXRzX1tkXSxsPU9iamVjdC5rZXlzKGcuZmFjZXRlZCksaz1nLmZhY2V0ZWRbbFswXV07Zm9yKGxldCBuPTA7bjxrLmxlbmd0aDtuKyspe2NvbnN0IHA9YShrW25dKSxxPVtuXTtsZXQgcj10aGlzLmdldENvc3Qoa1tuXSk7Zm9yKGxldCB0PTE7dDxsLmxlbmd0aDt0Kyspe2NvbnN0IHY9Zy5mYWNldGVkW2xbdF1dLHk9dGhpcy50aHJlc2hvbGRDbG9zZXN0VG9NZWFzdXJlKHYsCnAsYSk7cS5wdXNoKHkpO3IrPXRoaXMuZ2V0Q29zdCh2W3ldKX1yPD1jJiYoYz1yLGY9cSl9Zm9yKGM9MDtjPGwubGVuZ3RoO2MrKyl0aGlzLnNldCgiZmVhdHVyZVZhbHVlVGhyZXNob2xkcy4iK3RoaXMuZmVhdHVyZVZhbHVlVGhyZXNob2xkc0luZGV4TWFwW2xbY11dKyIudGhyZXNob2xkLiIrZCsiLnRocmVzaG9sZCIsZltjXS8xMDApfX0sZ2V0Q29zdDpmdW5jdGlvbihhKXtyZXR1cm4gYS5GUCp0aGlzLmluY29ycmVjdFByZWRDb3N0UmF0aW8rYS5GTn0sdGhyZXNob2xkQ2xvc2VzdFRvTWVhc3VyZTpmdW5jdGlvbihhLGMsZCl7bGV0IGY9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGc9MDtmb3IobGV0IGs9MDtrPGEubGVuZ3RoO2srKyl7dmFyIGw9ZChhW2tdKTtsPU1hdGguYWJzKGwtYyk7bDw9ZiYmKGc9ayxmPWwpfXJldHVybiBnfSxnZXRDbGFzc2lmaWNhdGlvbkJlc3ROb25aZXJvOmZ1bmN0aW9uKGEsYyl7bGV0IGQ9MDtjb25zdCBmPXRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzW2FdLmluZmVyZW5jZXMubGVuZ3RoLQoxO2ZvcihsZXQgZz0wO2c8dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXNbYV0uaW5mZXJlbmNlc1tmXVtjXS5sZW5ndGg7ZysrKWlmKDAhPT0rdGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXNbYV0uaW5mZXJlbmNlc1tmXVtjXVtnXS5sYWJlbCl7ZD1nO2JyZWFrfXJldHVybiB0aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1thXS5pbmZlcmVuY2VzW2ZdW2NdW2RdfSxnZXRDb25mdXNpb25Db3VudHNNb2RlbEluZGV4OmZ1bmN0aW9uKGEsYyxkLGYpe3JldHVybiB0aGlzLm92ZXJhbGxUaHJlc2hvbGRzLmxlbmd0aCE9dGhpcy5udW1Nb2RlbHN8fHRoaXMuaW5mZXJlbmNlU3RhdHNfLmxlbmd0aCE9dGhpcy5udW1Nb2RlbHM/e306dGhpcy5nZXRDb25mdXNpb25Db3VudHModGhpcy5pbmZlcmVuY2VTdGF0c19bZF0sY1tkXS50aHJlc2hvbGQsZil9LGdldFRvdGFsRW50cmllc0luQ29uZkNvdW50czpmdW5jdGlvbihhKXtpZihudWxsPT1hKXJldHVybiAwO2xldCBjPTA7Y29uc3QgZD1PYmplY3Qua2V5cyhhKTsKZm9yKGxldCBmPTA7ZjxkLmxlbmd0aDtmKyspe2NvbnN0IGc9YVtkW2ZdXSxsPU9iamVjdC5rZXlzKGcpO2ZvcihsZXQgaz0wO2s8bC5sZW5ndGg7aysrKWMrPWdbbFtrXV19cmV0dXJuIGN9LGdldEZQTW9kZWxJbmRleDpmdW5jdGlvbihhLGMsZCxmKXthPXRoaXMuZ2V0Q29uZnVzaW9uQ291bnRzTW9kZWxJbmRleChhLGMsZCxmKTtpZigwPT1PYmplY3Qua2V5cyhhKS5sZW5ndGgpcmV0dXJuIG51bGw7Yz1hLk5vLlllcztyZXR1cm4gZDMuZm9ybWF0KCIsLjFmIikoYy90aGlzLmdldFRvdGFsRW50cmllc0luQ29uZkNvdW50cyhhKSoxMDApfSxnZXRGTk1vZGVsSW5kZXg6ZnVuY3Rpb24oYSxjLGQsZil7YT10aGlzLmdldENvbmZ1c2lvbkNvdW50c01vZGVsSW5kZXgoYSxjLGQsZik7aWYoMD09T2JqZWN0LmtleXMoYSkubGVuZ3RoKXJldHVybiAwO2M9YS5ZZXMuTm87cmV0dXJuIGQzLmZvcm1hdCgiLC4xZiIpKGMvdGhpcy5nZXRUb3RhbEVudHJpZXNJbkNvbmZDb3VudHMoYSkqMTAwKX0sCmdldEFjY3VyYWN5TW9kZWxJbmRleDpmdW5jdGlvbihhLGMsZCxmKXthPXRoaXMuZ2V0Q29uZnVzaW9uQ291bnRzTW9kZWxJbmRleChhLGMsZCxmKTtpZigwPT1PYmplY3Qua2V5cyhhKS5sZW5ndGgpcmV0dXJuIDA7Yz1hLlllcy5ZZXMrYS5Oby5ObztyZXR1cm4gZDMuZm9ybWF0KCIsLjFmIikoYy90aGlzLmdldFRvdGFsRW50cmllc0luQ29uZkNvdW50cyhhKSoxMDApfSxnZXRGMU1vZGVsSW5kZXg6ZnVuY3Rpb24oYSxjLGQsZil7Y29uc3QgZz1kMy5mb3JtYXQoIiwuMmYiKTtkPXRoaXMuZ2V0Q29uZnVzaW9uQ291bnRzTW9kZWxJbmRleChhLGMsZCxmKTtpZigwPT1PYmplY3Qua2V5cyhkKS5sZW5ndGgpcmV0dXJuIDA7YT1kLlllcy5ZZXM7Yz1kLk5vLlllcztkPWQuWWVzLk5vO2lmKDA9PWEpcmV0dXJuIDAhPWN8fDAhPWQ/ZygwKTpnKDEpO2M9YS8oYStjKTthLz1hK2Q7cmV0dXJuIGcoMipjKmEvKGMrYSkpfSxnZXRGZWF0dXJlVmFsdWVDb3VudDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuZ2V0VG90YWxFbnRyaWVzSW5Db25mQ291bnRzKHRoaXMuZ2V0Q29uZnVzaW9uQ291bnRzTW9kZWxJbmRleChhLApjLDAsZCkpfSxnZXRDb25mdXNpb25NYXRyaXhMYWJlbDpmdW5jdGlvbihhLGMpe3JldHVybiAyPmM/IiI6dGhpcy5nZXRNb2RlbE5hbWVfKGEpfSxnZXRDb25mdXNpb25NYXRyaXhDb2xvcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5jb25mTWF0cml4Q29sb3JzW2FdfSxnZXRDb25mdXNpb25Db3VudHMoYSxjLGQpe2xldCBmPW51bGwsZz1udWxsO251bGwhPWQmJihmPWQudmFsdWUsZz1kLnZhbHVlMik7cmV0dXJue05vOntObzp0aGlzLmdldENvbmZNYXRyaXhWYWx1ZShhLGMsIlROIixmLGcpLFllczp0aGlzLmdldENvbmZNYXRyaXhWYWx1ZShhLGMsIkZQIixmLGcpfSxZZXM6e05vOnRoaXMuZ2V0Q29uZk1hdHJpeFZhbHVlKGEsYywiRk4iLGYsZyksWWVzOnRoaXMuZ2V0Q29uZk1hdHJpeFZhbHVlKGEsYywiVFAiLGYsZyl9fX0sZ2V0Q29uZk1hdHJpeFZhbHVlOmZ1bmN0aW9uKGEsYyxkLGYsZyl7Yz1NYXRoLmZsb29yKDEwMCpjKTtpZighYS50aHJlc2hvbGRzKXJldHVybiAwO2lmKG51bGw9PT0KZilyZXR1cm4gYS50aHJlc2hvbGRzW2NdW2RdO2Y9dGhpcy5jcmVhdGVDb21iaW5lZFZhbHVlU3RyaW5nXyhmLGcpO3JldHVybiBudWxsPT1hLmZhY2V0ZWRbZl0/MDphLmZhY2V0ZWRbZl1bY11bZF19LGdldE11bHRpQ2xhc3NDb25mTWF0cml4OmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gMD09YS5sZW5ndGg/e306bnVsbD09ZD9hW2NdLnJlc3VsdHM6YVtjXS5mYWNldGVkW3RoaXMuZ2V0UHJpbnRhYmxlVmFsdWVfKGQpXX0sZ2V0TXVsdGlDbGFzc0ZlYXR1cmVWYWx1ZUNvdW50OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuZ2V0VG90YWxFbnRyaWVzSW5Db25mQ291bnRzKHRoaXMuZ2V0TXVsdGlDbGFzc0NvbmZNYXRyaXgoYSwwLGMpKX0sZ2V0TXVsdGlDbGFzc0FjY3VyYWN5TW9kZWxJbmRleDpmdW5jdGlvbihhLGMsZCl7YT10aGlzLmdldE11bHRpQ2xhc3NDb25mTWF0cml4KGEsYyxkKTtpZihudWxsPT1hKXJldHVybiBudWxsO2M9MDtkPU9iamVjdC5rZXlzKGEpO2ZvcihsZXQgZj0KMDtmPGQubGVuZ3RoO2YrKyl7Y29uc3QgZz1hW2RbZl1dLGw9T2JqZWN0LmtleXMoZyk7Zm9yKGxldCBrPTA7azxsLmxlbmd0aDtrKyspZFtmXT09bFtrXSYmKGMrPWdbbFtrXV0pfXJldHVybiBkMy5mb3JtYXQoIiwuMWYiKShjL3RoaXMuZ2V0VG90YWxFbnRyaWVzSW5Db25mQ291bnRzKGEpKjEwMCl9LGdldEluZmVyZW5jZVN0YXQ6ZnVuY3Rpb24oYSxjLGQsZil7YT1jP2EuZmFjZXRlZFt0aGlzLmdldFByaW50YWJsZVZhbHVlXyhjKV06YS5yZXN1bHRzO2lmKCFhKXJldHVybiBudWxsO2Q9ZChhKTtyZXR1cm4gZj9mKGQpOmR9LGdldFJlZ3Jlc3Npb25NZWFuOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuZ2V0SW5mZXJlbmNlU3RhdChhLGMsZD0+ZC5tZWFuLGQzLmZvcm1hdCgiLjNmIikpfSxnZXRSZWdyZXNzaW9uQWJzTWVhbjpmdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLmdldEluZmVyZW5jZVN0YXQoYSxjLGQ9PmQuYWJzTWVhbixkMy5mb3JtYXQoIi4zZiIpKX0sZ2V0UmVncmVzc2lvblNxdWFyZWRNZWFuOmZ1bmN0aW9uKGEsCmMpe3JldHVybiB0aGlzLmdldEluZmVyZW5jZVN0YXQoYSxjLGQ9PmQuc3F1YXJlZE1lYW4sZDMuZm9ybWF0KCIuM2YiKSl9LGdldFJlZ3Jlc3Npb25Db3VudDpmdW5jdGlvbihhLGMpe2E9dGhpcy5nZXRJbmZlcmVuY2VTdGF0KGEsYyxkPT5kLmVycm9ycy5sZW5ndGgsbnVsbCk7cmV0dXJuIG51bGw9PWE/MDphfSxnZXRCaW5hcnlDbGFzc2lmaWNhdGlvbkNvdW50OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuZ2V0SW5mZXJlbmNlU3RhdChhLGMsZD0+T2JqZWN0LnZhbHVlcyhkWzBdKS5yZWR1Y2UoKGYsZyk9PmYrZyksbnVsbCl9LGdldE11bHRpY2xhc3NDbGFzc2lmaWNhdGlvbkNvdW50OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuZ2V0SW5mZXJlbmNlU3RhdChhLGMsZD0+T2JqZWN0LnZhbHVlcyhkKS5yZWR1Y2UoKGYsZyk9PntsZXQgbD0wO2NvbnN0IGs9T2JqZWN0LmtleXMoZyk7Zm9yKGxldCBuPTA7bjxrLmxlbmd0aDtuKyspbCs9Z1trW25dXTtyZXR1cm4gZitsfSwwKSwKbnVsbCl9LGdldFJvY0NoYXJ0SWQ6ZnVuY3Rpb24oYSl7cmV0dXJuInJvY2NoYXJ0IithfSxnZXRSb2NDaGFydExhYmVsSWQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5nZXRSb2NDaGFydElkKGMpKyItIithfSxnZXRMYWJlbDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5sYWJlbFZvY2FiW2FdfHxhfSxnZXRQckNoYXJ0SWQ6ZnVuY3Rpb24oYSl7cmV0dXJuInByY2hhcnQiK2F9LGdldFByQ2hhcnRMYWJlbElkOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuZ2V0UHJDaGFydElkKGMpKyItIithfSxnZXRQcmludGFibGVWYWx1ZV86ZnVuY3Rpb24oYSl7bGV0IGM7Yz1hLnZhbHVlfHwwPT09YS52YWx1ZT9TdHJpbmcoYS52YWx1ZSk6Ilx4M2NmZWF0dXJlIHZhbHVlIG1pc3NpbmdceDNlIjtpZigiIj09dGhpcy5zZWxlY3RlZFNlY29uZEJyZWFrZG93bkZlYXR1cmUpcmV0dXJuIGM7Yys9Ii8iO3JldHVybiBjPWEudmFsdWUyfHwwPT09YS52YWx1ZTI/YythLnZhbHVlMjpjKyJceDNjZmVhdHVyZSB2YWx1ZSBtaXNzaW5nXHgzZSJ9LApnZXRGZWF0dXJlTmFtZV86ZnVuY3Rpb24oYSl7cmV0dXJuIDA9PT1hLmxlbmd0aD8iXHgzY25vbmVceDNlIjphfSxnZXRMYWJlbGVkTW9kZWxOYW1lXzpmdW5jdGlvbihhKXtyZXR1cm4iTW9kZWw6ICIrYX0sZ2V0Q2xhc3NOYW1lXzpmdW5jdGlvbihhKXtyZXR1cm4gMD09PWEubGVuZ3RoPyJceDNjbm9uZVx4M2UiOmF9LHNob3VsZFNob3dPdmVyYWxsVGhyZXNob2xkZXJfOmZ1bmN0aW9uKGEpe3JldHVybiAwPT09YS5sZW5ndGh9LGNvbXB1dGVTZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2U6ZnVuY3Rpb24oKXt0aGlzLmNvdW50ZXJmYWN0dWFsRXhhbXBsZUFuZEluZmVyZW5jZT1udWxsO3RoaXMuc2VsZWN0ZWQmJnRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzPyh0aGlzLnNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZT0wPHRoaXMuc2VsZWN0ZWQubGVuZ3RoP3RoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzW3RoaXMuc2VsZWN0ZWRbMF1dOm51bGwsbnVsbD09dGhpcy5zZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2U/CnRoaXMuZ2xvYmFsUGRQbG90cz0hMDoodGhpcy5nbG9iYWxQZFBsb3RzPSExLCJkaXZlIiE9dGhpcy52aXNNb2RlJiZ0aGlzLnNob3dQYXJ0aWFsRGVwZW5kZW5jZVBsb3RzXygpKSk6dGhpcy5zZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2U9bnVsbH0sc2V0QXR0cmlidXRpb25zOmZ1bmN0aW9uKCl7aWYodGhpcy5zZWxlY3RlZCYmMCE9dGhpcy5zZWxlY3RlZC5sZW5ndGgpe3ZhciBhPXt9LGM9dGhpcy52aXNkYXRhW3RoaXMuc2VsZWN0ZWRbMF1dLGQ9dGhpcy5hdHRyaWJ1dGlvblN0cldpdGhNb2RlbE5hbWVfKCIiLHRoaXMuYXR0cmlidXRpb25Nb2RlbEluZGV4KSxmPW5ldyBSZWdFeHAoImF0dHJpYnV0aW9uc19fKC4qKSIrZCk7ZD1uZXcgUmVnRXhwKCJhdHRyaWJ1dGlvbnNfXyguKilfa2V5cyIrZCk7Zm9yKGxldCBsIGluIGMpe3ZhciBnPWYuZXhlYyhsKTtpZihnKXtnPW5ldyBSZWdFeHAoIl4oZmVhdHVyZXNfXyk/IitnWzFdKyIkIik7Zm9yKGxldCBrIGluIGMpaWYoZy50ZXN0KGspKXthW2tdPQpjW2xdO2JyZWFrfX1pZihnPWQuZXhlYyhsKSl7Zz1uZXcgUmVnRXhwKCJeKGZlYXR1cmVzX18pPyIrZ1sxXSsiJCIpO2ZvcihsZXQgayBpbiBjKWlmKGcudGVzdChrKSl7Zz1jW2xdO2NvbnN0IG49Y1tsLnJlcGxhY2UoIl9rZXlzIiwiX3ZhbHVlcyIpXSxwPUFycmF5LmFwcGx5KG51bGwsQXJyYXkoQXJyYXkuaXNBcnJheShjW2tdKT9jW2tdLmxlbmd0aDoxKSkubWFwKE51bWJlci5wcm90b3R5cGUudmFsdWVPZiwwKTtmb3IobGV0IHE9MDtxPGcubGVuZ3RoO3ErKyl7bGV0IHI9Y1trXS5pbmRleE9mKGdbcV0pOy0xIT1yJiYocFtyXT1uW3FdKX1hW2tdPXA7YnJlYWt9fX10aGlzLmF0dHJpYnV0aW9uPWF9fSxzaG91bGREaXNhYmxlR2V0RXhhbXBsZXNCdXR0b25fOmZ1bmN0aW9uKGEpe3JldHVybiAwPT1hLmxlbmd0aH0sc2hvdWxkRGlzYWJsZUluZmVyQnV0dG9uXzpmdW5jdGlvbihhLGMsZCxmKXtyZXR1cm4gMD09YS5sZW5ndGh8fDA9PWMubGVuZ3RofHwwPT1kLmxlbmd0aHx8IWZ9LAphcmVFeGFtcGxlc0VkaXRhYmxlXzpmdW5jdGlvbihhLGMpe3JldHVybiAwIT1hLmxlbmd0aCYmMCE9Yy5sZW5ndGh9LG5ld0luZmVyZW5jZXNfOmZ1bmN0aW9uKCl7dGhpcy5sb2FkaW5nQmFySGlkZGVuXz0hMDt0aGlzLnVwZGF0ZUluZmVyZW5jZXNfKCEwKTtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PnRoaXMudXBkYXRlSW5mZXJlbmNlU3RhdHNfKCEwKSl9LHJlZnJlc2hJbmZlcmVuY2VzTm9SZWdlbl86ZnVuY3Rpb24oKXt0aGlzLnJlZnJlc2hJbmZlcmVuY2VzXyghMCk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLnVwZGF0ZUluZmVyZW5jZVN0YXRzXyghMCkpfSxyZWZyZXNoSW5mZXJlbmNlc186ZnVuY3Rpb24oYSl7dGhpcy51cGRhdGVJbmZlcmVuY2VzXyghMSk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLnVwZGF0ZUluZmVyZW5jZVN0YXRzXyghYSkpfSx1cGRhdGVJbmZlcmVuY2VzXzpmdW5jdGlvbihhKXtpZih0aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlcyYmCnRoaXMuaW5mZXJlbmNlcy5pbmRpY2VzJiYwIT10aGlzLmluZmVyZW5jZXMuaW5kaWNlcy5sZW5ndGgmJnRoaXMuaW5mZXJlbmNlcy5yZXN1bHRzLmxlbmd0aD09dGhpcy5udW1Nb2RlbHMpe3ZhciBjPXt9LGQ9ISF0aGlzLmluZmVyZW5jZXMucmVzdWx0c1swXS5jbGFzc2lmaWNhdGlvblJlc3VsdDtmb3IobGV0IGs9MDtrPHRoaXMuaW5mZXJlbmNlcy5pbmRpY2VzLmxlbmd0aDtrKyspaWYoZCl7Y1t0aGlzLmluZmVyZW5jZXMuaW5kaWNlc1trXV09W107Zm9yKHZhciBmPTA7Zjx0aGlzLmluZmVyZW5jZXMucmVzdWx0cy5sZW5ndGg7ZisrKXtjb25zdCBuPXRoaXMuaW5mZXJlbmNlcy5yZXN1bHRzW2ZdLmNsYXNzaWZpY2F0aW9uUmVzdWx0O2ZvcihsZXQgcD0wO3A8bi5jbGFzc2lmaWNhdGlvbnNba10uY2xhc3Nlcy5sZW5ndGg7cCsrKSIiPT1uLmNsYXNzaWZpY2F0aW9uc1trXS5jbGFzc2VzW3BdLmxhYmVsJiYobi5jbGFzc2lmaWNhdGlvbnNba10uY2xhc3Nlc1twXS5sYWJlbD1wLnRvU3RyaW5nKCkpOwpjW3RoaXMuaW5mZXJlbmNlcy5pbmRpY2VzW2tdXVtmXT1uLmNsYXNzaWZpY2F0aW9uc1trXS5jbGFzc2VzLnNvcnQoKHAscSk9PnEuc2NvcmUtcC5zY29yZSl9fWVsc2UgZm9yKGNbdGhpcy5pbmZlcmVuY2VzLmluZGljZXNba11dPVtdLGY9MDtmPHRoaXMuaW5mZXJlbmNlcy5yZXN1bHRzLmxlbmd0aDtmKyspY1t0aGlzLmluZmVyZW5jZXMuaW5kaWNlc1trXV1bZl09W3tsYWJlbDoiIixzY29yZTp0aGlzLmluZmVyZW5jZXMucmVzdWx0c1tmXS5yZWdyZXNzaW9uUmVzdWx0LnJlZ3Jlc3Npb25zW2tdLnZhbHVlfV07dGhpcy5zZXQoImV4YW1wbGVzQW5kSW5mZXJlbmNlcyIsdGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXMubWFwKGZ1bmN0aW9uKGssbil7bGV0IHA9ay5pbmZlcmVuY2VzP2suaW5mZXJlbmNlczpbXTtjW25dJiZhJiYocD1wLmNvbmNhdChbY1tuXV0pKTtyZXR1cm57ZXhhbXBsZTprLmV4YW1wbGUsaW5mZXJlbmNlczpwLGNoYW5nZWQ6ay5jaGFuZ2VkLG9yaWc6ay5vcmlnfX0pKTsKdmFyIGc9dGhpcyxsPSExO3RoaXMudmlzZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKGssbil7aWYoZClnLnNldEl0ZW1JbmZlcmVuY2VWYWx1ZShrLG4sZy5zZWxlY3RlZEJyZWFrZG93bkZlYXR1cmUsZy5zZWxlY3RlZFNlY29uZEJyZWFrZG93bkZlYXR1cmUpO2Vsc2UgZm9yKHZhciBwPTA7cDxnLm51bU1vZGVscztwKyspa1tnLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHZhbHVlIixwKV09Zy5leGFtcGxlc0FuZEluZmVyZW5jZXNbbl0uaW5mZXJlbmNlc1tnLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1tuXS5pbmZlcmVuY2VzLmxlbmd0aC0xXVtwXVswXS5zY29yZTtpZihkJiYwPGcubGFiZWxWb2NhYi5sZW5ndGgpe2ZvcihwPTA7cDxnLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1tuXS5pbmZlcmVuY2VzLmxlbmd0aDtwKyspZm9yKGxldCBxPTA7cTxnLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1tuXS5pbmZlcmVuY2VzW3BdLmxlbmd0aDtxKyspZm9yKGxldCByPTA7cjxnLmV4YW1wbGVzQW5kSW5mZXJlbmNlc1tuXS5pbmZlcmVuY2VzW3BdW3FdLmxlbmd0aDtyKyspZy5leGFtcGxlc0FuZEluZmVyZW5jZXNbbl0uaW5mZXJlbmNlc1twXVtxXVtyXS52b2NhYkxhYmVsPQpnLmxhYmVsVm9jYWJbZy5leGFtcGxlc0FuZEluZmVyZW5jZXNbbl0uaW5mZXJlbmNlc1twXVtxXVtyXS5sYWJlbF07Zm9yKG49MDtuPGcubnVtTW9kZWxzO24rKylrW2cuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2UgbGFiZWwiLG4pXT1nLmxhYmVsVm9jYWJba1tnLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHZhbHVlIixuKV1dO2w9ITB9fSk7dGhpcy51cGRhdGVDb3JyZWN0bmVzc18oKTt0aGlzLnJlZnJlc2hEaXZlXygpO3RoaXMuaW5mZXJlbmNlcy5pbmRpY2VzLmxlbmd0aD09dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXMubGVuZ3RoJiYodGhpcy4kLmRpdmUuY29sb3JCeT1sP3RoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2UgbGFiZWwiLDApOnRoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2UgdmFsdWUiLDApLHRoaXMuaXNSZWdyZXNzaW9uXyh0aGlzLm1vZGVsVHlwZSk/KHRoaXMuJC5kaXZlLmhvcml6b250YWxQb3NpdGlvbj10aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHZhbHVlIiwKMCksMTx0aGlzLm51bU1vZGVscyYmKHRoaXMuJC5kaXZlLnZlcnRpY2FsUG9zaXRpb249dGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiIEluZmVyZW5jZSB2YWx1ZSIsMSkpKTp0aGlzLmlzQmluYXJ5Q2xhc3NpZmljYXRpb25fKHRoaXMubW9kZWxUeXBlLHRoaXMubXVsdGlDbGFzcykmJigxPT10aGlzLm51bU1vZGVscz90aGlzLiQuZGl2ZS52ZXJ0aWNhbFBvc2l0aW9uPXRoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2Ugc2NvcmUiLDApOih0aGlzLiQuZGl2ZS5ob3Jpem9udGFsUG9zaXRpb249dGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiIEluZmVyZW5jZSBzY29yZSIsMCksdGhpcy4kLmRpdmUudmVydGljYWxQb3NpdGlvbj10aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHNjb3JlIiwxKSkpKTt0aGlzLnVwZGF0ZWRFeGFtcGxlPSExfX0saGFzQXR0cmlidXRpb25zXzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmMCE9T2JqZWN0LmtleXMoYS5hdHRyaWJ1dGlvbnMpLmxlbmd0aCYmCm51bGwhPWEuYXR0cmlidXRpb25zWzBdfSxoYXNNdWx0aXBsZU1vZGVsQXR0cmlidXRpb25zXzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmMTxPYmplY3Qua2V5cyhhLmF0dHJpYnV0aW9ucykubGVuZ3RoJiZudWxsIT1hLmF0dHJpYnV0aW9uc1swXSYmbnVsbCE9YS5hdHRyaWJ1dGlvbnNbMV19LG5ld0V4dHJhT3V0cHV0c186ZnVuY3Rpb24oYSl7dmFyIGM9W107Zm9yKHZhciBkPTA7ZDxhLmV4dHJhLmxlbmd0aDtkKyspbnVsbCE9YS5leHRyYVtkXSYmImF0dHJpYnV0aW9ucyJpbiBhLmV4dHJhW2RdJiZjLnB1c2goYS5leHRyYVtkXS5hdHRyaWJ1dGlvbnMpOzA8Yy5sZW5ndGgmJih0aGlzLmF0dHJpYnV0aW9ucz17aW5kaWNlczphLmluZGljZXMsYXR0cmlidXRpb25zOmN9KTtmb3IoYz0wO2M8YS5pbmRpY2VzLmxlbmd0aDtjKyspe2Q9YS5pbmRpY2VzW2NdO2NvbnN0IGw9T2JqZWN0LmFzc2lnbih7fSx0aGlzLnZpc2RhdGFbZF0pO2ZvcihsZXQgaz0wO2s8YS5leHRyYS5sZW5ndGg7aysrKXtpZihudWxsPT0KYS5leHRyYVtrXSljb250aW51ZTtjb25zdCBuPU9iamVjdC5rZXlzKGEuZXh0cmFba10pO2ZvcihsZXQgcD0wO3A8bi5sZW5ndGg7cCsrKXt2YXIgZj1uW3BdO2lmKCJhdHRyaWJ1dGlvbnMiPT1mKWNvbnRpbnVlO2xldCBxPWEuZXh0cmFba11bZl1bY107Zj10aGlzLnN0cldpdGhNb2RlbE5hbWVfKGYsayk7bFtmXT1xO0FycmF5LmlzQXJyYXkocSl8fChxPVtxXSk7Y29uc3Qgcj0wPHEubGVuZ3RoJiYoInN0cmluZyI9PXR5cGVvZiBxWzBdfHxxWzBdaW5zdGFuY2VvZiBTdHJpbmcpO3ZhciBnPUpTT04uc3RyaW5naWZ5KHRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzW2RdLmV4YW1wbGUpO2c9SlNPTi5wYXJzZShnKTtnLmZlYXR1cmVzLmZlYXR1cmVbZl09cj97Ynl0ZXNMaXN0Ont2YWx1ZTpxfX06e2Zsb2F0TGlzdDp7dmFsdWU6cX19O3RoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzW2RdLmV4YW1wbGU9Z319dGhpcy5zZXQoYHZpc2RhdGEuJHtkfWAsbCl9dGhpcy5yZWZyZXNoRGl2ZV8oKTsKdGhpcy5jb21wdXRlU2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlKCk7dGhpcy5yZWZyZXNoU2VsZWN0ZWREYXRhcG9pbnRfKCl9LG5ld0F0dHJpYnV0aW9uc186ZnVuY3Rpb24oYSl7aWYodGhpcy5oYXNBdHRyaWJ1dGlvbnNfKGEpKXtmb3IobGV0IGQ9MDtkPGEuaW5kaWNlcy5sZW5ndGg7ZCsrKXtjb25zdCBmPWEuaW5kaWNlc1tkXSxnPU9iamVjdC5hc3NpZ24oe30sdGhpcy52aXNkYXRhW2ZdKTtmb3IobGV0IGw9MDtsPGEuYXR0cmlidXRpb25zLmxlbmd0aDtsKyspe2NvbnN0IGs9bnVsbD09YS5hdHRyaWJ1dGlvbnNbbF0/e306YS5hdHRyaWJ1dGlvbnNbbF1bZF0sbj1PYmplY3Qua2V5cyhrKTtmb3IobGV0IHA9MDtwPG4ubGVuZ3RoO3ArKyl7dmFyIGM9dGhpcy5hdHRyaWJ1dGlvblN0cldpdGhNb2RlbE5hbWVfKCJhdHRyaWJ1dGlvbnNfXyIrbltwXSxsKTtBcnJheS5pc0FycmF5KGtbbltwXV0pJiYyPT1rW25bcF1dLmxlbmd0aCYmQXJyYXkuaXNBcnJheShrW25bcF1dWzBdKT8KKGdbImF0dHJpYnV0aW9uc19fIituW3BdKyJfa2V5cyJdPWtbbltwXV1bMF0sYz10aGlzLmF0dHJpYnV0aW9uU3RyV2l0aE1vZGVsTmFtZV8oImF0dHJpYnV0aW9uc19fIituW3BdKyJfdmFsdWVzIixsKSxnW2NdPWtbbltwXV1bMV0pOmdbY109a1tuW3BdXTtjPUFycmF5LmlzQXJyYXkoZ1tjXSk/Z1tjXTpbZ1tjXV07Zm9yKGxldCBxPTA7cTxjLmxlbmd0aDtxKyspY1txXT50aGlzLm1heEF0dHJpYnV0aW9uJiYodGhpcy5tYXhBdHRyaWJ1dGlvbj1jW3FdKSxjW3FdPHRoaXMubWluQXR0cmlidXRpb24mJih0aGlzLm1pbkF0dHJpYnV0aW9uPWNbcV0pfX10aGlzLnNldChgdmlzZGF0YS4ke2Z9YCxnKX0wPnRoaXMubWluQXR0cmlidXRpb24mJnRoaXMubWF4QXR0cmlidXRpb24+TWF0aC5hYnModGhpcy5taW5BdHRyaWJ1dGlvbik/dGhpcy5taW5BdHRyaWJ1dGlvbj0tMSp0aGlzLm1heEF0dHJpYnV0aW9uOjA8dGhpcy5tYXhBdHRyaWJ1dGlvbiYmTWF0aC5hYnModGhpcy5taW5BdHRyaWJ1dGlvbik+CnRoaXMubWF4QXR0cmlidXRpb24mJih0aGlzLm1heEF0dHJpYnV0aW9uPS0xKnRoaXMubWluQXR0cmlidXRpb24pO3RoaXMuc2V0QXR0cmlidXRpb25zKCk7dGhpcy5jcmVhdGVBdHRyaWJ1dGlvbkxlZ2VuZCgpO3RoaXMucmVmcmVzaERpdmVfKCl9fSxjcmVhdGVBdHRyaWJ1dGlvbkxlZ2VuZDpmdW5jdGlvbigpe3ZhciBhPVtdLGM9W107MD50aGlzLm1pbkF0dHJpYnV0aW9uJiYoYS5wdXNoKHRoaXMubWluQXR0cmlidXRpb24pLGMucHVzaCgiIzk0M0E0MyIpLGEucHVzaCh0aGlzLm1pbkF0dHJpYnV0aW9uLzUpLGMucHVzaCgiI0M3Njk2RSIpKTthLnB1c2goMCk7Yy5wdXNoKCIjRkZEOEMzIik7MDx0aGlzLm1heEF0dHJpYnV0aW9uJiYoYS5wdXNoKHRoaXMubWF4QXR0cmlidXRpb24vNSksYy5wdXNoKCIjNkE5RUE3IiksYS5wdXNoKHRoaXMubWF4QXR0cmlidXRpb24pLGMucHVzaCgiIzNENzA3OCIpKTt0aGlzLmF0dHJpYnV0aW9uQ29sb3JTY2FsZT1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihhKS5pbnRlcnBvbGF0ZShVdCkuY2xhbXAoITApLnJhbmdlKGMpOwp2YXIgZD1Qb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3IoIiNhdHRyaWJ1dGlvbkxlZ2VuZCIpO2QzLnNlbGVjdChkKS5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTtkPWQzLnNlbGVjdChkKS5hcHBlbmQoImciKTtjb25zdCBmPWQuYXBwZW5kKCJkZWZzIikuYXBwZW5kKCJsaW5lYXJHcmFkaWVudCIpLmF0dHIoImlkIiwidnpleGFtcGxldmlld2VyZ3JhZGllbnQiKS5hdHRyKCJ4MSIsIjAlIikuYXR0cigieTEiLCIwJSIpLmF0dHIoIngyIiwiMTAwJSIpLmF0dHIoInkyIiwiMCUiKS5hdHRyKCJzcHJlYWRNZXRob2QiLCJwYWQiKSxnPVtdOzU9PWMubGVuZ3RoPyhnLnB1c2godGhpcy5taW5BdHRyaWJ1dGlvbi8yKSxnLnB1c2goMCksZy5wdXNoKHRoaXMubWF4QXR0cmlidXRpb24vMikpOjA+dGhpcy5taW5BdHRyaWJ1dGlvbj8oZy5wdXNoKHRoaXMubWluQXR0cmlidXRpb24vNCozKSxnLnB1c2godGhpcy5taW5BdHRyaWJ1dGlvbi8yKSxnLnB1c2godGhpcy5taW5BdHRyaWJ1dGlvbi8KNCkpOihnLnB1c2godGhpcy5tYXhBdHRyaWJ1dGlvbi80KSxnLnB1c2godGhpcy5tYXhBdHRyaWJ1dGlvbi8yKSxnLnB1c2godGhpcy5tYXhBdHRyaWJ1dGlvbi80KjMpKTtjb25zdCBsPWFbMF0saz1hW2EubGVuZ3RoLTFdLWw7YT1hLm1hcChuPT5NYXRoLnJvdW5kKChuLWwpL2sqMTAwKSsiJSIpO2QzLnppcChhLGMpLmZvckVhY2gobj0+e2YuYXBwZW5kKCJzdG9wIikuYXR0cigib2Zmc2V0IixuWzBdKS5hdHRyKCJzdG9wLWNvbG9yIixuWzFdKS5hdHRyKCJzdG9wLW9wYWNpdHkiLDEpfSk7ZC5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4MSIsMCkuYXR0cigieTEiLDApLmF0dHIoIndpZHRoIiwxNjApLmF0dHIoImhlaWdodCIsOCkuc3R5bGUoImZpbGwiLCJ1cmwoI3Z6ZXhhbXBsZXZpZXdlcmdyYWRpZW50KSIpO2M9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oW3RoaXMubWluQXR0cmlidXRpb24sdGhpcy5tYXhBdHRyaWJ1dGlvbl0pLnJhbmdlKFswLDE2MF0pO2M9ZDMuYXhpc0JvdHRvbShjKS50aWNrVmFsdWVzKGcpLnRpY2tTaXplKDQpLnRpY2tGb3JtYXQoZDMuZm9ybWF0KCIuMWYiKSk7CmQuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsZWdlbmQgYXhpcyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLDgpIikuc3R5bGUoImZvbnQiLCI5cHgiKS5jYWxsKGMpfSxzZXRJdGVtSW5mZXJlbmNlVmFsdWU6ZnVuY3Rpb24oYSxjLGQpe3ZhciBmPXRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzW2NdLmluZmVyZW5jZXMubGVuZ3RoLTE7aWYodGhpcy5tdWx0aUNsYXNzKWZvcihkPTA7ZDx0aGlzLm51bU1vZGVscztkKyspYVt0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHZhbHVlIixkKV09dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXNbY10uaW5mZXJlbmNlc1tmXVtkXVswXS5sYWJlbDtlbHNlIGZvcihmPXRoaXMub3ZlcmFsbFRocmVzaG9sZHMsMCE9PWQubGVuZ3RoJiYoZj10aGlzLmdldFNsaWNlS2V5XyhhLHRoaXMuc2VsZWN0ZWRCcmVha2Rvd25GZWF0dXJlLHRoaXMuc2VsZWN0ZWRTZWNvbmRCcmVha2Rvd25GZWF0dXJlKSxmPXRoaXMuZmVhdHVyZVZhbHVlVGhyZXNob2xkc1t0aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHNJbmRleE1hcFtmXV0udGhyZXNob2xkKSwKZD0wO2Q8dGhpcy5udW1Nb2RlbHM7ZCsrKXtjb25zdCBnPXRoaXMuZ2V0Q2xhc3NpZmljYXRpb25CZXN0Tm9uWmVybyhjLGQpO2FbdGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiIEluZmVyZW5jZSBzY29yZSIsZCldPWcuc2NvcmU7YVt0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHZhbHVlIixkKV09Zy5zY29yZT49ZltkXS50aHJlc2hvbGQ/Zy5sYWJlbDp0aGlzLmRlZmF1bHRJbmZlcmVuY2VMYWJlbC50b1N0cmluZygpfX0sY3JlYXRlQ29tYmluZWRWYWx1ZVN0cmluZ186ZnVuY3Rpb24oYSxjKXthPXZvaWQgMD09PWF8fG51bGw9PT1hPyIiOmE7cmV0dXJuIHZvaWQgMD09PWN8fG51bGw9PT1jfHwiIj09PWM/YTphKyIvIitjfSx1cGRhdGVDb3JyZWN0bmVzc186ZnVuY3Rpb24oKXtpZih0aGlzLnNlbGVjdGVkTGFiZWxGZWF0dXJlJiZ0aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlcylmb3IobGV0IGE9MDthPHRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzLmxlbmd0aDthKyspe2NvbnN0IGM9CnRoaXMudmlzZGF0YVthXTtmb3IobGV0IGQ9MDtkPHRoaXMubnVtTW9kZWxzO2QrKykiY2xhc3NpZmljYXRpb24iPT10aGlzLm1vZGVsVHlwZT9jW3RoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2UgY29ycmVjdCIsZCldPWNbdGhpcy5zZWxlY3RlZExhYmVsRmVhdHVyZV09PWNbdGhpcy5zdHJXaXRoTW9kZWxOYW1lXygiIEluZmVyZW5jZSB2YWx1ZSIsZCldPyJjb3JyZWN0IjoiaW5jb3JyZWN0IjooY1t0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIGVycm9yIixkKV09Y1t0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHZhbHVlIixkKV0tY1t0aGlzLnNlbGVjdGVkTGFiZWxGZWF0dXJlXSxjW3RoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2UgYWJzb2x1dGUgZXJyb3IiLGQpXT1NYXRoLmFicyhjW3RoaXMuc3RyV2l0aE1vZGVsTmFtZV8oIiBJbmZlcmVuY2UgZXJyb3IiLGQpXSksY1t0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIHNxdWFyZWQgZXJyb3IiLApkKV09Y1t0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIGVycm9yIixkKV0qY1t0aGlzLnN0cldpdGhNb2RlbE5hbWVfKCIgSW5mZXJlbmNlIGVycm9yIixkKV0pfX0saW5mZXJDbGlja2VkXzpmdW5jdGlvbigpe2NvbnN0IGE9e2luZmVyZW5jZV9hZGRyZXNzOnRoaXMuaW5mZXJlbmNlQWRkcmVzcyxtb2RlbF9uYW1lOnRoaXMubW9kZWxOYW1lLG1vZGVsX3R5cGU6dGhpcy5tb2RlbFR5cGUsbW9kZWxfdmVyc2lvbjp0aGlzLm1vZGVsVmVyc2lvbixtb2RlbF9zaWduYXR1cmU6dGhpcy5tb2RlbFNpZ25hdHVyZSxsYWJlbF92b2NhYl9wYXRoOnRoaXMubGFiZWxWb2NhYlBhdGgsdXNlX3ByZWRpY3Q6dGhpcy51c2VQcmVkaWN0QXBpLHByZWRpY3Rfb3V0cHV0X3RlbnNvcjp0aGlzLnByZWRpY3RPdXRwdXRUZW5zb3IscHJlZGljdF9pbnB1dF90ZW5zb3I6dGhpcy5wcmVkaWN0SW5wdXRUZW5zb3J9O3RoaXMubG9hZGluZ0JhckhpZGRlbl89ITE7aWYoIXRoaXMubG9jYWwpe2NvbnN0IGM9CnRoaXMubWFrZVVybF8oIi9kYXRhL3BsdWdpbi93aGF0aWYvaW5mZXIiLGEpO3RoaXMubWFrZUFzeW5jUmVxdWVzdF8oYyxkPT57dGhpcy5sb2FkaW5nQmFySGlkZGVuXz0hMDt0aGlzLmxhYmVsVm9jYWI9SlNPTi5wYXJzZShkLnZhbHVlLnZvY2FiKTt0aGlzLmluZmVyZW5jZXM9SlNPTi5wYXJzZShkLnZhbHVlLmluZmVyZW5jZXMpfSxudWxsLCJtb2RlbCBpbmZlcmVuY2UiKX10aGlzLmZpcmUoImluZmVyLWV4YW1wbGVzIixhKX0sZXhhbXBsZUNoYW5nZV86ZnVuY3Rpb24oYSl7dmFyIGM9MD09dGhpcy5zZWxlY3RlZC5sZW5ndGg/MDp0aGlzLnNlbGVjdGVkWzBdO3RoaXMuc2V0KCJzZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2UuY2hhbmdlZCIsITApO3RoaXMudXBkYXRlRXhhbXBsZV8oSlNPTi5zdHJpbmdpZnkoYS50YXJnZXQuanNvbiksYyk7dGhpcy4kJCgiIyIrdGhpcy5nZXRJbmZlcmVuY2VIb2xkZXJJZF8oKSkuaW5mZXJlbmNlPW51bGw7dGhpcy52aXNkYXRhW2NdPXRoaXMuZXhhbXBsZVRvRGF0YVBvaW50XyhhLnRhcmdldC5qc29uLApjKTt0aGlzLnNob3dOZWFyZXN0Q291bnRlcmZhY3R1YWw9ITE7dGhpcy5yZWZyZXNoRGl2ZV8oKTt0aGlzLnVwZGF0ZWRFeGFtcGxlPSEwO3RoaXMuc2VsZWN0ZWREYXRhVXBkYXRlZF8oKX0scmVmcmVzaERpdmVJbXBsXzpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlzZGF0YTt0aGlzLnZpc2RhdGE9W107dGhpcy52aXNkYXRhPWE7dGhpcy5zZWxlY3RlZEV4YW1wbGVNYXg9dGhpcy52aXNkYXRhLmxlbmd0aC0xO3RoaXMuJC5vdmVydmlldy5wcm90b0lucHV0PXRoaXMuJC5vdmVydmlldy5nZXRTdGF0c1Byb3RvKFt7bmFtZToiIixkYXRhOmF9XSk7dGhpcy5jYWxjdWxhdGVEaXN0YW5jZVN0YXRzXyh0aGlzLiQub3ZlcnZpZXcucHJvdG9JbnB1dC50b09iamVjdCgpKTt0aGlzLmlzUmVncmVzc2lvbl8odGhpcy5tb2RlbFR5cGUpJiZ0aGlzLmFkanVzdE1pbkNvdW50ZXJmYWN0dWFsVmFsdWVEaXN0XygpO2E9dGhpcy4kLmRpdmUuc2VsZWN0ZWREYXRhO3RoaXMuJC5kaXZlLnNlbGVjdGVkRGF0YT0KW107dGhpcy4kLmRpdmUuc2VsZWN0ZWREYXRhPWE7dGhpcy51cGRhdGVTcHJpdGUoKX0scmVmcmVzaERpdmVfOmZ1bmN0aW9uKCl7dGhpcy5kZWJvdW5jZSgicmVmcmVzaERpdmVEZWJvdW5jZSIsKCk9PnRoaXMucmVmcmVzaERpdmVJbXBsXygpLDUwMCl9LGNhbGN1bGF0ZURpc3RhbmNlU3RhdHNfOmZ1bmN0aW9uKGEpe3RoaXMuZGlzdGFuY2VTdGF0c189e307Zm9yKGxldCBjPTA7YzxhLmRhdGFzZXRzTGlzdFswXS5mZWF0dXJlc0xpc3QubGVuZ3RoO2MrKyl7Y29uc3QgZD1hLmRhdGFzZXRzTGlzdFswXS5mZWF0dXJlc0xpc3RbY10sZj1kLm5hbWU7dGhpcy5kaXN0YW5jZVN0YXRzX1tmXT17aXNOdW1lcmljOm51bGwhPWQubnVtU3RhdHN9O2lmKHRoaXMuZGlzdGFuY2VTdGF0c19bZl0uaXNOdW1lcmljKXRoaXMuZGlzdGFuY2VTdGF0c19bZl0uc3RkRGV2PWQubnVtU3RhdHMuc3RkRGV2O2Vsc2V7bGV0IGc9MDtjb25zdCBsPWQuc3RyaW5nU3RhdHMucmFua0hpc3RvZ3JhbS5idWNrZXRzTGlzdDsKZm9yKGxldCBrPTA7azxsLmxlbmd0aDtrKyspe2NvbnN0IG49bFtrXS5zYW1wbGVDb3VudC9kLnN0cmluZ1N0YXRzLmNvbW1vblN0YXRzLm51bU5vbk1pc3Npbmc7Zys9bipufXRoaXMuZGlzdGFuY2VTdGF0c19bZl0ucHJvYlNhbWVWYWx1ZT1nfX19LGlzTnVtZXJpY0ZlYXR1cmVfOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZ0aGlzLmRpc3RhbmNlU3RhdHNfJiZ0aGlzLmRpc3RhbmNlU3RhdHNfW2FdJiZ0aGlzLmRpc3RhbmNlU3RhdHNfW2FdLmlzTnVtZXJpY30sY2FsY3VsYXRlQnVja2V0RWRnZXNfOmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZChwKXtjb25zdCBxPS1NYXRoLmZsb29yKE1hdGgubG9nMTAoaykpKzE7cmV0dXJuIE1hdGgucm91bmQocCpNYXRoLnBvdygxMCxxKSkvTWF0aC5wb3coMTAscSl9aWYoIXRoaXMuaXNOdW1lcmljRmVhdHVyZV8oYSl8fHRoaXMuc3RhdHNbYV0udW5pcXVlQ291bnQ8PWN8fHRoaXMuZmVhdHVyZUJ1Y2tldEVkZ2VzX1thXSYmdGhpcy5mZWF0dXJlQnVja2V0RWRnZXNfW2FdLmxlbmd0aD09CmMrMSlkZWxldGUgdGhpcy5mZWF0dXJlQnVja2V0RWRnZXNfW2FdO2Vsc2V7dmFyIGY9dGhpcy5zdGF0c1thXS5udW1iZXJNaW4sZz10aGlzLnN0YXRzW2FdLm51bWJlck1heCxsPShnLWYpL2Msaz10aGlzLmRpc3RhbmNlU3RhdHNfW2FdLnN0ZERldixuPVtdO24ucHVzaChmKTtmb3IobGV0IHA9MTtwPGM7cCsrKW4ucHVzaChkKGYrcCpsKSk7bi5wdXNoKGcpO3RoaXMuZmVhdHVyZUJ1Y2tldEVkZ2VzX1thXT1ufX0sdXBkYXRlRXhhbXBsZV86ZnVuY3Rpb24oYSxjKXt0aGlzLmZpcmUoInVwZGF0ZS1leGFtcGxlIix7ZXhhbXBsZTphLGluZGV4OmN9KTtpZighdGhpcy5sb2NhbCl7dmFyIGQ9dGhpcy5tYWtlVXJsXygiL2RhdGEvcGx1Z2luL3doYXRpZi91cGRhdGVfZXhhbXBsZSIsbnVsbCk7dGhpcy5tYWtlQXN5bmNSZXF1ZXN0XyhkLG51bGwse2V4YW1wbGU6YSxpbmRleDpjfSwiZGF0YXBvaW50IHVwZGF0ZSIpfX0sZ2V0SW5mZXJlbmNlSG9sZGVySWRfOmZ1bmN0aW9uKCl7cmV0dXJuImluZmVyZW5jZV8ifSwKbWFrZVVybF86ZnVuY3Rpb24oYSxjKXtjJiYoYSs9Ij8iK09iamVjdC5rZXlzKGMpLm1hcChkPT5kKyJceDNkIitlbmNvZGVVUklDb21wb25lbnQoY1tkXSkpLmpvaW4oIlx4MjYiKSk7cmV0dXJuIGF9LHNob3dUb2FzdF86ZnVuY3Rpb24oYSl7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItdG9hc3QiKTtjLmR1cmF0aW9uPTFFNDtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGMpO2MudGV4dD1hO2Muc2hvdygpO2NvbnNvbGUuZXJyb3IoYSl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe3RoaXMuc2hvd1RvYXN0XyhhKTt0aGlzLmV4YW1wbGVTdGF0dXNTdHI9YTt0aGlzLmxvYWRpbmdCYXJIaWRkZW5fPSEwO3RoaXMuaXNTb3J0aW5nRWxpZ2libGVGZWF0dXJlcz0hMX0sbWFrZUFzeW5jUmVxdWVzdF86ZnVuY3Rpb24oYSxjLGQsZixnKXtnPXZvaWQgMD09PWc/KCk9Pnt9Omc7Y29uc3QgbD10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoaz0+e2suY2FuY2VsbGVkfHwKKGsudmFsdWUmJmsudmFsdWUuZXJyb3I/KHRoaXMuaGFuZGxlRXJyb3Ioay52YWx1ZS5lcnJvciksbnVsbCE9ZyYmZygpKTpjJiZjKGspKX0pO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYSxkKS50aGVuKGwpLmNhdGNoKGs9Pnt0aGlzLmhhbmRsZUVycm9yKGBSZXF1ZXN0IGZvciAke2Z9IGZhaWxlZDogJHtrfWApO251bGwhPWcmJmcoKX0pfSxkYXRhUG9pbnRWYWx1ZUZyb21GZWF0dXJlXzpmdW5jdGlvbihhLGMpe2xldCBkPW51bGw7YS5pbnQ2NExpc3Q/ZD1hLmludDY0TGlzdC52YWx1ZTphLmZsb2F0TGlzdD9kPWEuZmxvYXRMaXN0LnZhbHVlOmEuYnl0ZXNMaXN0JiZhLmJ5dGVzTGlzdC52YWx1ZSYmKGQ9YS5ieXRlc0xpc3QudmFsdWUubWFwKGY9PntpZigxRTU8Zi5sZW5ndGgpcmV0dXJuIkVSUk9SOiBzdHJpbmcgbm90IGRlY29kZWQgZHVlIHRvIGxlbmd0aCI7dHJ5e3JldHVybiBhdG9iKGYpfWNhdGNoKGcpe3JldHVybiBjb25zb2xlLmVycm9yKCJFcnJvciBkZWNvZGluZyBzdHJpbmc6ICIrCmcpLCJFUlJPUjogZXJyb3IgZGVjb2Rpbmcgc3RyaW5nIn19KSk7cmV0dXJuIGMmJmQmJjE9PWQubGVuZ3RoPyhhPWRbMF0saXNOYU4oYSk/YTpOdW1iZXIoYSkpOmR9LGV4YW1wbGVUb0RhdGFQb2ludF86ZnVuY3Rpb24oYSxjKXtjb25zdCBkPXt9O3ZhciBmPWEuZmVhdHVyZXN8fGEuY29udGV4dCxnPWYmJiJmZWF0dXJlImluIGY/T2JqZWN0LmtleXMoZi5mZWF0dXJlKTpbXTtmb3IodmFyIGwgaW4gZyl7dmFyIGs9Z1srbF07aWYoayE9dGhpcy5pbWFnZUZlYXR1cmVOYW1lKXt2YXIgbj10aGlzLmRhdGFQb2ludFZhbHVlRnJvbUZlYXR1cmVfKGYuZmVhdHVyZVtrXSwhMCk7bnVsbCE9biYmKGRba109bil9fWY9ImZlYXR1cmVMaXN0cyJpbiBhP09iamVjdC5rZXlzKGEuZmVhdHVyZUxpc3RzLmZlYXR1cmVMaXN0KTpbXTtmb3IoY29uc3QgcCBpbiBmKXtnPWZbK3BdO2w9YS5mZWF0dXJlTGlzdHMuZmVhdHVyZUxpc3RbZ10uZmVhdHVyZTtrPVtdO2ZvcihuPTA7bjxsLmxlbmd0aDtuKyspe2NvbnN0IHE9CnRoaXMuZGF0YVBvaW50VmFsdWVGcm9tRmVhdHVyZV8obFtuXSwhMSk7cSYmKGs9ay5jb25jYXQocSkpfWRbZ109a31kWyIgRGF0YXBvaW50IElEIl09YztyZXR1cm4gZH0sZ2V0RXhhbXBsZXNBbmRDbG9zZVNldHRpbmdzXzpmdW5jdGlvbigpe3RoaXMuc2V0dGluZ3NDbGlja2VkXygpO3RoaXMudXBkYXRlTnVtYmVyT2ZNb2RlbHMoKTt0aGlzLmdldEV4YW1wbGVzXygpfSxzaG93TW9kZWxOdW1iZXJzXzpmdW5jdGlvbigpe3JldHVybiAxPj10aGlzLm51bU1vZGVsc30sdXBkYXRlRXhhbXBsZUNvbnRlbnRzOmZ1bmN0aW9uKGEsYyl7dGhpcy5leGFtcGxlU3RhdHVzU3RyPWEubGVuZ3RoKyIgZGF0YXBvaW50cyBsb2FkZWQiO3RoaXMuJC5ub2V4YW1wbGVzLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMubG9hZGluZ0JhckhpZGRlbl89ITA7dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXM9YS5tYXAoZnVuY3Rpb24oZil7cmV0dXJue2V4YW1wbGU6SlNPTi5wYXJzZShmKSxjaGFuZ2VkOiExLApvcmlnOkpTT04ucGFyc2UoZil9fSk7dGhpcy51cGRhdGVkRXhhbXBsZT0hMDtjb25zdCBkPXRoaXM7dGhpcy52aXNkYXRhPXRoaXMuZXhhbXBsZXNBbmRJbmZlcmVuY2VzLm1hcChmdW5jdGlvbihmLGcpe3JldHVybiBkLmV4YW1wbGVUb0RhdGFQb2ludF8oZi5leGFtcGxlLGcpfSk7dGhpcy4kLmRpdmUuYXRsYXNVcmw9IiI7dGhpcy4kLmRpdmUuaW1hZ2VGaWVsZE5hbWU9IiI7dGhpcy5oYXNTcHJpdGU9Yzt0aGlzLnJlZnJlc2hEaXZlXygpO3RoaXMuc2hvdWxkRGlzYWJsZUluZmVyQnV0dG9uXyh0aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlcyx0aGlzLm1vZGVsTmFtZSx0aGlzLmluZmVyZW5jZUFkZHJlc3MsdGhpcy51cGRhdGVkRXhhbXBsZSl8fHRoaXMuaW5mZXJDbGlja2VkXygpO3RoaXMuc2V0SW5mZXJlbmNlRnJvbUV4YW1wbGVEYXRhKCl9LHNldEluZmVyZW5jZUZyb21FeGFtcGxlRGF0YTpmdW5jdGlvbigpe2lmKDA8dGhpcy52aXNkYXRhLmxlbmd0aClpZihudWxsIT10aGlzLnZpc2RhdGFbMF0ucHJlZGljdGlvbnNfX3Byb2JhYmlsaXRpZXMpe3ZhciBhPQp7fSxjPUFycmF5LmFwcGx5KG51bGwse2xlbmd0aDp0aGlzLnZpc2RhdGEubGVuZ3RofSkubWFwKE51bWJlci5jYWxsLE51bWJlcik7YS5pbmRpY2VzPWM7YS5yZXN1bHRzPVt7Y2xhc3NpZmljYXRpb25SZXN1bHQ6e2NsYXNzaWZpY2F0aW9uczpbXX19XTtmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKylhLnJlc3VsdHNbMF0uY2xhc3NpZmljYXRpb25SZXN1bHQuY2xhc3NpZmljYXRpb25zW2RdPXtjbGFzc2VzOlt7bGFiZWw6IjAiLHNjb3JlOnRoaXMudmlzZGF0YVtkXS5wcmVkaWN0aW9uc19fcHJvYmFiaWxpdGllc1swXX0se2xhYmVsOiIxIixzY29yZTp0aGlzLnZpc2RhdGFbZF0ucHJlZGljdGlvbnNfX3Byb2JhYmlsaXRpZXNbMV19XX07dGhpcy5pbmZlcmVuY2VzPWF9ZWxzZSBpZihudWxsIT10aGlzLnZpc2RhdGFbMF0ucHJlZGljdGlvbnMpe2E9e307Yz1BcnJheS5hcHBseShudWxsLHtsZW5ndGg6dGhpcy52aXNkYXRhLmxlbmd0aH0pLm1hcChOdW1iZXIuY2FsbCxOdW1iZXIpOwphLmluZGljZXM9YzthLnJlc3VsdHM9W3tyZWdyZXNzaW9uUmVzdWx0OntyZWdyZXNzaW9uczpbXX19XTtmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCsrKWEucmVzdWx0c1swXS5yZWdyZXNzaW9uUmVzdWx0LnJlZ3Jlc3Npb25zW2RdPXt2YWx1ZTp0aGlzLnZpc2RhdGFbZF0ucHJlZGljdGlvbnN9O3RoaXMuaW5mZXJlbmNlcz1hfX0sZ2V0RXhhbXBsZXNfOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5tYWtlVXJsXygiL2RhdGEvcGx1Z2luL3doYXRpZi9leGFtcGxlc19mcm9tX3BhdGgiLHtleGFtcGxlc19wYXRoOnRoaXMuZXhhbXBsZXNQYXRoLG1heF9leGFtcGxlczp0aGlzLm1heEV4YW1wbGVzLHNhbXBsaW5nX29kZHM6dGhpcy5zYW1wbGluZ09kZHMsc2VxdWVuY2VfZXhhbXBsZXM6dGhpcy5zZXF1ZW5jZUV4YW1wbGVzfSk7dGhpcy5leGFtcGxlU3RhdHVzU3RyPSJMb2FkaW5nIGRhdGFwb2ludHMuLi4iO3RoaXMubWFrZUFzeW5jUmVxdWVzdF8oYSxjPT57dGhpcy51cGRhdGVFeGFtcGxlQ29udGVudHMoYy52YWx1ZS5leGFtcGxlcywKYy52YWx1ZS5zcHJpdGUpfSxudWxsLCJkYXRhcG9pbnQgbG9hZCIpO3RoaXMubG9hZGluZ0JhckhpZGRlbl89ITF9LHVwZGF0ZVNwcml0ZTpmdW5jdGlvbigpe3RoaXMuaGFzU3ByaXRlJiYodGhpcy4kLmRpdmUuYXRsYXNVcmw9bnVsbCx0aGlzLiQuZGl2ZS5hdGxhc1VybD10aGlzLmxvY2FsP3RoaXMubG9jYWxBdGxhc1VybDp0aGlzLm1ha2VVcmxfKCIvZGF0YS9wbHVnaW4vd2hhdGlmL3Nwcml0ZSIse30pKX0sc2VsZWN0ZWREYXRhVXBkYXRlZF86ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkRXhhbXBsZU51bT0wPHRoaXMuc2VsZWN0ZWQubGVuZ3RoP3RoaXMuc2VsZWN0ZWRbMF06IiI7dGhpcy52aXNkYXRhJiYwPHRoaXMudmlzZGF0YS5sZW5ndGgmJih0aGlzLnBhcnRpYWxEZXBQbG90UGVuZGluZ0ZlYXR1cmVzPVtdKX0sY29weURhdGFwb2ludF86ZnVuY3Rpb24oKXt2YXIgYT1KU09OLnN0cmluZ2lmeSh0aGlzLnNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZS5leGFtcGxlKTthPQp7ZXhhbXBsZTpKU09OLnBhcnNlKGEpLGNoYW5nZWQ6ITEsb3JpZzpKU09OLnBhcnNlKGEpfTt0aGlzLmV4YW1wbGVzQW5kSW5mZXJlbmNlcy5wdXNoKGEpO3RoaXMuc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlPWE7dGhpcy52aXNkYXRhLnB1c2godGhpcy5leGFtcGxlVG9EYXRhUG9pbnRfKGEuZXhhbXBsZSx0aGlzLnZpc2RhdGEubGVuZ3RoKSk7YT10aGlzLnNlbGVjdGVkWzBdO3RoaXMuc2hvd05lYXJlc3RDb3VudGVyZmFjdHVhbD0hMTt0aGlzLnNlbGVjdGVkWzBdPXRoaXMudmlzZGF0YS5sZW5ndGgtMTt0aGlzLnNlbGVjdGVkRGF0YVVwZGF0ZWRfKCk7dGhpcy51cGRhdGVkRXhhbXBsZT0hMDt0aGlzLmZpcmUoImR1cGxpY2F0ZS1leGFtcGxlIix7aW5kZXg6YX0pO3RoaXMubG9jYWw/dGhpcy5yZWZyZXNoRGl2ZV8oKTooYT10aGlzLm1ha2VVcmxfKCIvZGF0YS9wbHVnaW4vd2hhdGlmL2R1cGxpY2F0ZV9leGFtcGxlIix7aW5kZXg6YX0pLHRoaXMubWFrZUFzeW5jUmVxdWVzdF8oYSwKKCk9Pnt0aGlzLnJlZnJlc2hEaXZlXygpfSxudWxsLCJkYXRhcG9pbnQgZHVwbGljYXRpb24iKSl9LGRlbGV0ZURhdGFwb2ludERpYWxvZ186ZnVuY3Rpb24oKXt0aGlzLiQuZGVsZXRlZGlhbG9nLm9wZW4oKX0sZGVsZXRlRGF0YXBvaW50XzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuc2VsZWN0ZWRbMF07dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXMuc3BsaWNlKGEsMSk7dGhpcy52aXNkYXRhLnNwbGljZShhLDEpO2ZvcihsZXQgYz1hO2M8dGhpcy52aXNkYXRhLmxlbmd0aDtjKyspdGhpcy52aXNkYXRhW2NdWyIgRGF0YXBvaW50IElEIl09Yzt0aGlzLmNvbXBhcmVkSW5kaWNlcz1bXTt0aGlzLnNlbGVjdGVkPVtdO3RoaXMuc2VsZWN0ZWREYXRhVXBkYXRlZF8oKTt0aGlzLmZpcmUoImRlbGV0ZS1leGFtcGxlIix7aW5kZXg6YX0pO3RoaXMuJC5kaXZlLnNlbGVjdGVkSW5kaWNlcz1bXTt0aGlzLmxvY2FsP3RoaXMucmVmcmVzaERpdmVfKCk6KGE9dGhpcy5tYWtlVXJsXygiL2RhdGEvcGx1Z2luL3doYXRpZi9kZWxldGVfZXhhbXBsZSIsCntpbmRleDphfSksdGhpcy5tYWtlQXN5bmNSZXF1ZXN0XyhhLCgpPT57dGhpcy5yZWZyZXNoRGl2ZV8oKX0sbnVsbCwiZGF0YXBvaW50IGRlbGV0ZSIpKX0sc2hvdWxkRGlzYWJsZVJlc2V0XzpmdW5jdGlvbihhKXtyZXR1cm4hYX0scmVzZXREYXRhcG9pbnRfOmZ1bmN0aW9uKCl7dGhpcy5zZXQoInNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZS5leGFtcGxlIix7fSk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5zZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2UuY2hhbmdlZD0hMTtjb25zdCBhPUpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlLm9yaWcpO3RoaXMuc2V0KCJzZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2UuZXhhbXBsZSIsSlNPTi5wYXJzZShhKSk7dGhpcy52aXNkYXRhW3RoaXMuc2VsZWN0ZWRbMF1dPXRoaXMuZXhhbXBsZVRvRGF0YVBvaW50Xyh0aGlzLnNlbGVjdGVkRXhhbXBsZUFuZEluZmVyZW5jZS5leGFtcGxlLAp0aGlzLnNlbGVjdGVkWzBdKTt0aGlzLnVwZGF0ZWRFeGFtcGxlPSEwO3RoaXMudXBkYXRlRXhhbXBsZV8oYSx0aGlzLnNlbGVjdGVkWzBdKTt0aGlzLnJlZnJlc2hEaXZlXygpfSl9LGFkZENoYXJ0OmZ1bmN0aW9uKGEsYyxkKXtsZXQgZixnPWQ7aWYodGhpcy5pc011bHRpQ2xhc3NfKHRoaXMubW9kZWxUeXBlLHRoaXMubXVsdGlDbGFzcykpe2c9W107Zm9yKGxldCBrPTA7azxkLmxlbmd0aDtrKyspe2xldCBuPXt9O2lmKE9iamVjdC5rZXlzKGRba10pLmxlbmd0aD5OdW1iZXIodGhpcy5tYXhJbmZlcmVuY2VFbnRyaWVzUGVyUnVuKSl7dmFyIGw9dGhpcy5leGFtcGxlc0FuZEluZmVyZW5jZXNbdGhpcy5zZWxlY3RlZCYmMDx0aGlzLnNlbGVjdGVkLmxlbmd0aD90aGlzLnNlbGVjdGVkWzBdOjBdO2w9bC5pbmZlcmVuY2VzW2wuaW5mZXJlbmNlcy5sZW5ndGgtMV1ba10uc2xpY2UoMCx0aGlzLm1heEluZmVyZW5jZUVudHJpZXNQZXJSdW4pO2ZvcihsZXQgcD0wO3A8bC5sZW5ndGg7cCsrKXtjb25zdCBxPQpsW3BdLmxhYmVsO25bcV09ZFtrXVtxXX19ZWxzZSBuPWRba107Zy5wdXNoKG4pfX0ibnVtZXJpYyI9PWE/Zj10aGlzLm1ha2VMaW5lQ2hhcnQoYyxnKToiY2F0ZWdvcmljYWwiPT1hP2Y9dGhpcy5tYWtlQmFyQ2hhcnQoYyxnKTpjb25zb2xlLmVycm9yKCJVbmtub3duIGNoYXJ0VHlwZTogIithKTthPXRoaXMuZmVhdHVyZUNvbnRhaW5lckJ5TmFtZShjKS5xdWVyeVNlbGVjdG9yKCIudGYtY2F0ZWdvcnktcGFuZS1jb250ZW50Iik7UG9seW1lci5kb20oYSkuYXBwZW5kQ2hpbGQoZik7Yz10aGlzLnBhcnRpYWxEZXBQbG90UGVuZGluZ0ZlYXR1cmVzLmluZGV4T2YoYyk7LTE8YyYmdGhpcy5wYXJ0aWFsRGVwUGxvdFBlbmRpbmdGZWF0dXJlcy5zcGxpY2UoYywxKX0sZ2V0U2ltcGxlQXhpc0Zvcm1hdHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gUGxvdHRhYmxlLkZvcm1hdHRlcnMuZ2VuZXJhbChhKX0sbWFrZUJhckNoYXJ0OmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZChyLHQpe3JldHVybnt4OnIuc3RlcD09CnQ/ci5zdGVwKyIgLSBvcmlnaW5hbCB2YWx1ZSI6ci5zdGVwLHk6ci5zY2FsYXJ9fWZ1bmN0aW9uIGYocix0LHYpe3JldHVybnt4OnIuc3RlcD09dD9yLnN0ZXArIiAtIG9yaWdpbmFsIHZhbHVlIjpyLnN0ZXAsc2NhbGFyOnIuc2NhbGFyLHk6dn19bGV0IGc9IiI7dmFyIGw9Y1swXTshdGhpcy5nbG9iYWxQZFBsb3RzJiYoYT10aGlzLmNyZWF0ZVBkRW50cnlGb3JDdXJyZW50VmFsdWUoYSxsLDApKSYmKGc9YS5zdGVwKTtjb25zdCBrPXt9LG49e307Xy5mb3JFYWNoKGMsKHIsdCk9PntfLmZvckVhY2gociwodix5KT0+e25bdGhpcy5mb3JtYXRDaGFydEtleSh5LHQsYy5sZW5ndGgpXT1fLm1hcCh2LHo9PmQoeixnKSkuc29ydCgoeix4KT0+eC55LXoueSk7dGhpcy5pc0JpbmFyeUNsYXNzaWZpY2F0aW9uXyh0aGlzLm1vZGVsVHlwZSx0aGlzLm11bHRpQ2xhc3MpJiYoa1t0aGlzLmZvcm1hdENoYXJ0S2V5KHksdCxjLmxlbmd0aCldPV8ubWFwKHYsej0+Zih6LGcsdGhpcy5vdmVyYWxsVGhyZXNob2xkc1t0XS50aHJlc2hvbGQpKS5zb3J0KCh6LAp4KT0+eC5zY2FsYXItei5zY2FsYXIpKX0pfSk7Y29uc3QgcD0kby5tdWx0aXNjYWxlRm9ybWF0dGVyKCRvLllfVE9PTFRJUF9GT1JNQVRURVJfUFJFQ0lTSU9OKTtsPVt7dGl0bGU6IkluZmVyZW5jZSB2YWx1ZSIsZXZhbHVhdGU6cj0+e3I9dGhpcy5zcGxpdENoYXJ0S2V5KHIua2V5LGMubGVuZ3RoKS5sYWJlbDtpZighaXNOYU4ocikmJjA8ci5sZW5ndGgmJnRoaXMubGFiZWxWb2NhYil7Y29uc3QgdD0rcjt0PHRoaXMubGFiZWxWb2NhYi5sZW5ndGgmJjA8PXQmJihyKz0iICgiK3RoaXMubGFiZWxWb2NhYlt0XSsiKSIpfXJldHVybiByfX0se3RpdGxlOiJGZWF0dXJlIHZhbHVlIixldmFsdWF0ZTpyPT5yLnZhbHVlLnh9LHt0aXRsZToiU2NvcmUiLGV2YWx1YXRlOnI9PnAoci52YWx1ZS55KX1dOzI8PWMubGVuZ3RoJiZsLnB1c2goe3RpdGxlOiJNb2RlbCIsZXZhbHVhdGU6cj0+dGhpcy5zcGxpdENoYXJ0S2V5KHIua2V5LGMubGVuZ3RoKS5tb2RlbH0pO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CmEuY2xhc3NMaXN0LmFkZCgicGQtaG9sZGVyIik7Y29uc3QgcT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2ei1iYXItY2hhcnQiKTtxLmNvbG9yU2NhbGU9KG5ldyBQbG90dGFibGUuU2NhbGVzLkNvbG9yKS5yYW5nZSh0aGlzLnBkUGxvdENvbG9ycyk7cS5saW5lc0NvbG9yU2NhbGU9KG5ldyBQbG90dGFibGUuU2NhbGVzLkNvbG9yKS5yYW5nZSh0aGlzLnBkUGxvdFRyYW5zcGFyZW50Q29sb3JzKTtxLmRhdGE9bjtxLmxpbmVzPWs7cS50b29sdGlwQ29sdW1ucz1sO2EuYXBwZW5kQ2hpbGQocSk7bD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLmNsYXNzTGlzdC5hZGQoInBkLXktbGFiZWwiKTtsLmlubmVyVGV4dD10aGlzLmlzUmVncmVzc2lvbl8odGhpcy5tb2RlbFR5cGUpPyJJbmZlcmVuY2UgdmFsdWUiOiJJbmZlcmVuY2Ugc2NvcmUiO2EuYXBwZW5kQ2hpbGQobCk7cmV0dXJuIGF9LHNwbGl0Q2hhcnRLZXk6ZnVuY3Rpb24oYSxjKXtsZXQgZD1hLGY9IiI7Mjw9YyYmKGM9CmEuaW5kZXhPZigiKG1vZGVsIiksZD1hLnN1YnN0cmluZygwLGMpLGY9YS5zdWJzdHJpbmcoYys3LGEubGFzdEluZGV4T2YoIikiKSkpO3JldHVybntsYWJlbDpkLG1vZGVsOmZ9fSxmb3JtYXRDaGFydEtleTpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIDE9PWQ/YTphKyIgKG1vZGVsICIrdGhpcy5nZXRNb2RlbE5hbWVfKGMpKyIpIn0sbWFrZUxpbmVDaGFydDpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGQodil7cmV0dXJuIE51bWJlci5pc05hTih2KT8iTmFOIjpuKHYpfWNvbnN0IGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJwZC1ob2xkZXIiKTtjb25zdCBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZ6LWxpbmUtY2hhcnQyIiksbD1bXTt2YXIgaz1bXTtjb25zdCBuPSRvLm11bHRpc2NhbGVGb3JtYXR0ZXIoJG8uWV9UT09MVElQX0ZPUk1BVFRFUl9QUkVDSVNJT04pOyJjbGFzc2lmaWNhdGlvbiI9PXRoaXMubW9kZWxUeXBlJiYoZy5kZWZhdWx0WVJhbmdlPQpbMCwxXSk7dmFyIHA9W3t0aXRsZToiSW5mZXJlbmNlIHZhbHVlIixldmFsdWF0ZTp2PT57dj10aGlzLnNwbGl0Q2hhcnRLZXkodi5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSxjLmxlbmd0aCkubGFiZWw7aWYoIWlzTmFOKHYpJiYwPHYubGVuZ3RoJiZ0aGlzLmxhYmVsVm9jYWIpe2NvbnN0IHk9K3Y7eTx0aGlzLmxhYmVsVm9jYWIubGVuZ3RoJiYwPD15JiYodis9IiAoIit0aGlzLmxhYmVsVm9jYWJbeV0rIikiKX1yZXR1cm4gdn19LHt0aXRsZToiRmVhdHVyZSB2YWx1ZSIsZXZhbHVhdGU6dj0+ZCh2LmRhdHVtLnN0ZXApfSx7dGl0bGU6IlNjb3JlIixldmFsdWF0ZTp2PT5kKHYuZGF0dW0uc2NhbGFyKX1dOzI8PWMubGVuZ3RoJiZwLnB1c2goe3RpdGxlOiJNb2RlbCIsZXZhbHVhdGU6dj0+dGhpcy5zcGxpdENoYXJ0S2V5KHYuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUsYy5sZW5ndGgpLm1vZGVsfSk7Zy50b29sdGlwQ29sdW1ucz1wO2NvbnN0IHE9W107bGV0IHI9MDtmb3IobGV0IHY9CjA7djxjLmxlbmd0aDt2Kyspe2NvbnN0IHk9Y1t2XTtwPV8ua2V5cyh5KTtyPXYqcC5sZW5ndGg7cC5mb3JFYWNoKHo9PntsLnB1c2godGhpcy5wZFBsb3RDb2xvcnNbcisrXSk7Y29uc3QgeD10aGlzLmZvcm1hdENoYXJ0S2V5KHosdixjLmxlbmd0aCk7Zy5zZXRTZXJpZXNEYXRhKHgseVt6XSk7cS5wdXNoKHgpfSk7cj12KnAubGVuZ3RoO2lmKCF0aGlzLmdsb2JhbFBkUGxvdHMmJihwPXRoaXMuY3JlYXRlUGRFbnRyeUZvckN1cnJlbnRWYWx1ZShhLHksdikpKXt2YXIgdD10aGlzLmZvcm1hdENoYXJ0S2V5KF8ua2V5cyh5KVswXSsiIC0gb3JpZ2luYWwgdmFsdWUgIix2LGMubGVuZ3RoKTtnLnNldFNlcmllc0RhdGEodCxbcF0pO3EucHVzaCh0KTtsLnB1c2godGhpcy5wZFBsb3RDb2xvcnNbcl0uYnJpZ2h0ZXIoKSl9dGhpcy5pc0JpbmFyeUNsYXNzaWZpY2F0aW9uXyh0aGlzLm1vZGVsVHlwZSx0aGlzLm11bHRpQ2xhc3MpJiYocD10aGlzLmZvcm1hdENoYXJ0S2V5KCJjbGFzc2lmaWNhdGlvbiB0aHJlc2hvbGQiLAp2LGMubGVuZ3RoKSx0PWNbMF1bXy5rZXlzKGNbMF0pXS5tYXAoej0+KHtzdGVwOnouc3RlcCxzY2FsYXI6dGhpcy5vdmVyYWxsVGhyZXNob2xkc1t2XS50aHJlc2hvbGR9KSksbC5wdXNoKHRoaXMucGRQbG90VHJhbnNwYXJlbnRDb2xvcnNbcl0pLGcuc2V0U2VyaWVzRGF0YShwLHQpLGsucHVzaChwKSxxLnB1c2gocCkpfWcuY29sb3JTY2FsZT0obmV3IFBsb3R0YWJsZS5TY2FsZXMuQ29sb3IpLnJhbmdlKGwpO2cueEF4aXNGb3JtYXR0ZXI9dGhpcy5nZXRTaW1wbGVBeGlzRm9ybWF0dGVyKHRoaXMuYXhpc1ByZWNpc2lvbik7Zy55QXhpc0Zvcm1hdHRlcj10aGlzLmdldFNpbXBsZUF4aXNGb3JtYXR0ZXIodGhpcy5heGlzUHJlY2lzaW9uKTtnLnNlcmllc1dpdGhvdXRUb29sdGlwcz1rO2cuY29sb3JTY2FsZS5kb21haW4ocSk7Zy5zZXRWaXNpYmxlU2VyaWVzKHEpO2YuYXBwZW5kQ2hpbGQoZyk7az1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtrLmNsYXNzTGlzdC5hZGQoInBkLXktbGFiZWwiKTsKay5pbm5lclRleHQ9dGhpcy5pc1JlZ3Jlc3Npb25fKHRoaXMubW9kZWxUeXBlKT8iSW5mZXJlbmNlIHZhbHVlIjoiSW5mZXJlbmNlIHNjb3JlIjtmLmFwcGVuZENoaWxkKGspO2s9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ay5jbGFzc0xpc3QuYWRkKCJwZC14LWxhYmVsIik7ay5pbm5lclRleHQ9YTtmLmFwcGVuZENoaWxkKGspO3JldHVybiBmfSxjcmVhdGVQZEVudHJ5Rm9yQ3VycmVudFZhbHVlOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZj1fLmtleXMoYylbMF07Y29uc3QgZz1mLmluZGV4T2YoImluZGV4Iik7Yz0rZjt2YXIgbD0wOy0xPGcmJihjPStmLnN1YnN0cmluZygwLGYuaW5kZXhPZigiICIpKSxsPStmLnN1YnN0cmluZyhnKzYsZi5pbmRleE9mKCIpIikpKTthPXRoaXMudmlzZGF0YVt0aGlzLnNlbGVjdGVkWzBdXVthXTtBcnJheS5pc0FycmF5KGEpJiYoYT1hW2xdKTtkPXRoaXMuc2VsZWN0ZWRFeGFtcGxlQW5kSW5mZXJlbmNlLmluZmVyZW5jZXNbdGhpcy5zZWxlY3RlZEV4YW1wbGVBbmRJbmZlcmVuY2UuaW5mZXJlbmNlcy5sZW5ndGgtCjFdW2RdO2w9LTE7Zm9yKGY9MDtmPGQubGVuZ3RoO2YrKylpZihkW2ZdLmxhYmVsPT1jLnRvU3RyaW5nKCl8fCIiPT1kW2ZdLmxhYmVsKXtsPWRbZl0uc2NvcmU7YnJlYWt9cmV0dXJuLTE9PWw/bnVsbDp7c3RlcDphLHNjYWxhcjpsfX0sZGVsZXRlUGRQbG90UHJvZ3Jlc3M6ZnVuY3Rpb24oYSl7YT10aGlzLmZlYXR1cmVDb250YWluZXJCeU5hbWUoYSkucXVlcnlTZWxlY3RvckFsbCgicGFwZXItcHJvZ3Jlc3MiKTtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKylWdChhW2NdKX0sbWFrZUNoYXJ0Rm9yRmVhdHVyZTpmdW5jdGlvbihhLGMsZCl7dGhpcy5kZWxldGVQZFBsb3RQcm9ncmVzcyhjKTtkLmZvckVhY2goZj0+dGhpcy5hZGRDaGFydChhLGMsZikpfSxnZXRJbmZlcmVuY2VWaXN1YWxpemF0aW9uOmZ1bmN0aW9uKGEsYyl7Yz17ZmVhdHVyZV9uYW1lOmEsaW5mZXJlbmNlX2FkZHJlc3M6dGhpcy5pbmZlcmVuY2VBZGRyZXNzLG1vZGVsX25hbWU6dGhpcy5tb2RlbE5hbWUsbW9kZWxfdHlwZTp0aGlzLm1vZGVsVHlwZSwKbW9kZWxfdmVyc2lvbjp0aGlzLm1vZGVsVmVyc2lvbixtb2RlbF9zaWduYXR1cmU6dGhpcy5tb2RlbFNpZ25hdHVyZSx4X21pbjp0aGlzLmdldFVuaXF1ZUJ5RXZlbnQoYywiLngtbWluIikudmFsdWUseF9tYXg6dGhpcy5nZXRVbmlxdWVCeUV2ZW50KGMsIi54LW1heCIpLnZhbHVlLGZlYXR1cmVfaW5kZXhfcGF0dGVybjp0aGlzLmdldFVuaXF1ZUJ5RXZlbnQoYywiLmZlYXR1cmUtaW5kZXgtcGF0dGVybiIpLnZhbHVlLGV4YW1wbGVfaW5kZXg6dGhpcy5nbG9iYWxQZFBsb3RzPy0xOnRoaXMuc2VsZWN0ZWRbMF0sdXNlX3ByZWRpY3Q6dGhpcy51c2VQcmVkaWN0QXBpLHByZWRpY3Rfb3V0cHV0X3RlbnNvcjp0aGlzLnByZWRpY3RPdXRwdXRUZW5zb3IscHJlZGljdF9pbnB1dF90ZW5zb3I6dGhpcy5wcmVkaWN0SW5wdXRUZW5zb3J9O3RoaXMubG9jYWw/dGhpcy5maXJlKCJpbmZlci1tdXRhbnRzIixjKTooYz1Rby5hZGRQYXJhbXMoIi9kYXRhL3BsdWdpbi93aGF0aWYvaW5mZXJfbXV0YW50cyIsCmMpLHRoaXMubWFrZUFzeW5jUmVxdWVzdF8oYywoZj0+dGhpcy5tYWtlQ2hhcnRGb3JGZWF0dXJlKGYudmFsdWUuY2hhcnRUeXBlLGEsZi52YWx1ZS5kYXRhKSkuYmluZCh0aGlzKSxudWxsLCJwbG90IGNyZWF0aW9uIiwoKCk9PnRoaXMuaGFuZGxlQ2hhcnRFcnJvckZvckZlYXR1cmUoYSkpLmJpbmQodGhpcykpKTtjPXRoaXMuZmVhdHVyZUNvbnRhaW5lckJ5TmFtZShhKS5xdWVyeVNlbGVjdG9yKCIudGYtY2F0ZWdvcnktcGFuZS1jb250ZW50Iik7Y29uc3QgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwYXBlci1wcm9ncmVzcyIpO2Quc2V0QXR0cmlidXRlKCJpbmRldGVybWluYXRlIiwhMCk7ZC5zZXRBdHRyaWJ1dGUoImNsYXNzIiwicGRwbG90LXByb2dyZXNzIik7UG9seW1lci5kb20oYykuYXBwZW5kQ2hpbGQoZCl9LGhhbmRsZUNoYXJ0RXJyb3JGb3JGZWF0dXJlOmZ1bmN0aW9uKGEpe2NvbnN0IGM9dGhpcy5wYXJ0aWFsRGVwUGxvdFBlbmRpbmdGZWF0dXJlcy5pbmRleE9mKGEpOwotMTxjJiZ0aGlzLnBhcnRpYWxEZXBQbG90UGVuZGluZ0ZlYXR1cmVzLnNwbGljZShjLDEpO3RoaXMuZGVsZXRlUGRQbG90UHJvZ3Jlc3MoYSl9LHNob3VsZEhpZGVGZWF0dXJlSW5kaWNlc1NlbGVjdG9yOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIWN8fDA9PWMubGVuZ3RofHwhdGhpcy52aXNkYXRhfHx0aGlzLnZpc2RhdGEubGVuZ3RoPD1jWzBdPyEwOiFBcnJheS5pc0FycmF5KHRoaXMudmlzZGF0YVtjWzBdXVthXSl9LHNob3VsZEhpZGVQZElucHV0Q29udGFpbmVyOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuc2hvdWxkSGlkZUZlYXR1cmVJbmRpY2VzU2VsZWN0b3IoYS5uYW1lLGMpJiZhLnNhbXBsZXM/ITA6ITF9LGZlYXR1cmVDb250YWluZXJCeU5hbWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuJCQoJ1tkYXRhLWZlYXR1cmUtbmFtZVx4M2QiJythKyciXScpfSxmZWF0dXJlQ29udGFpbmVyQnlFdmVudDpmdW5jdGlvbihhKXtmb3IoYT1hLnRhcmdldDshYS5jbGFzc0xpc3QuY29udGFpbnMoImZlYXR1cmUtY29udGFpbmVyIik7KWE9CmEucGFyZW50Tm9kZTtyZXR1cm4gYX0sZ2V0VW5pcXVlQnlFdmVudChhLGMpe3JldHVybiB0aGlzLmZlYXR1cmVDb250YWluZXJCeUV2ZW50KGEpLnF1ZXJ5U2VsZWN0b3IoYyl9LHBhcnRpYWxEZXBQbG90RWxpZ2libGVGZWF0dXJlc1NldDpmdW5jdGlvbihhKXt0aGlzLmlzU29ydGluZ0VsaWdpYmxlRmVhdHVyZXM9ITE7YSYmMCE9YS5sZW5ndGgmJnNldFRpbWVvdXQoKCk9Pnt0aGlzLiQkKCIucGQtZW50cnktY29udGFpbmVyIikuaGlkZGVuJiZ0aGlzLiQkKCIudGYtY2F0ZWdvcnktcGFuZSIpLmNsaWNrKCl9LDEwMCl9LGNhdGVnb3J5UGFuZUNsaWNrZWQ6ZnVuY3Rpb24oYSl7Y29uc3QgYz10aGlzLmZlYXR1cmVDb250YWluZXJCeUV2ZW50KGEpO2MucXVlcnlTZWxlY3RvcigiLnBkLWVudHJ5LWNvbnRhaW5lciIpLmhhc0F0dHJpYnV0ZSgiaGlkZGVuIik/KHRoaXMuZHJhd1BkQ2hhcnRzXyhhKSx0aGlzLnNob3dQZEVsZW1lbnRfKGMpKTp0aGlzLmhpZGVQZEVsZW1lbnRfKGMpfSwKZHJhd1BkQ2hhcnRzXzpmdW5jdGlvbihhKXtjb25zdCBjPWEubW9kZWwuZ2V0KCJpdGVtIikubmFtZTstMTx0aGlzLnBhcnRpYWxEZXBQbG90UGVuZGluZ0ZlYXR1cmVzLmluZGV4T2YoYyl8fCh0aGlzLnBhcnRpYWxEZXBQbG90UGVuZGluZ0ZlYXR1cmVzLnB1c2goYyksdGhpcy5nZXRJbmZlcmVuY2VWaXN1YWxpemF0aW9uKGMsYSkpfSxjbGVhclBkRWxlbWVudENoYXJ0c186ZnVuY3Rpb24oYSl7YS5xdWVyeVNlbGVjdG9yQWxsKCIucGQtaG9sZGVyIikuZm9yRWFjaChmdW5jdGlvbihjKXtWdChjKX0pfSxoaWRlUGRFbGVtZW50XzpmdW5jdGlvbihhKXt2YXIgYz1hLnF1ZXJ5U2VsZWN0b3IoIi5wZC1lbnRyeS1jb250YWluZXIiKTt0aGlzLmNsZWFyUGRFbGVtZW50Q2hhcnRzXyhjKTtjLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwhMCk7Yz1hLnF1ZXJ5U2VsZWN0b3IoIi5wZC1yb3ctYXJyb3ciKTtjLmNsYXNzTGlzdC5yZW1vdmUoIm5vcm1hbC1pY29uIik7Yy5jbGFzc0xpc3QuYWRkKCJyb3RhdGVkLWljb24iKTsKYT1hLnF1ZXJ5U2VsZWN0b3IoIi5wZXJmLXRhYmxlLWVudHJ5Iik7YS5jbGFzc0xpc3QuYWRkKCJwZXJmLXRhYmxlLXJvdyIpO2EuY2xhc3NMaXN0LnJlbW92ZSgicGVyZi10YWJsZS1yb3ctZXhwYW5kZWQiKX0sc2hvd1BkRWxlbWVudF86ZnVuY3Rpb24oYSl7YS5xdWVyeVNlbGVjdG9yKCIucGQtZW50cnktY29udGFpbmVyIikucmVtb3ZlQXR0cmlidXRlKCJoaWRkZW4iKTtjb25zdCBjPWEucXVlcnlTZWxlY3RvcigiLnBkLXJvdy1hcnJvdyIpO2MuY2xhc3NMaXN0LmFkZCgibm9ybWFsLWljb24iKTtjLmNsYXNzTGlzdC5yZW1vdmUoInJvdGF0ZWQtaWNvbiIpO2E9YS5xdWVyeVNlbGVjdG9yKCIucGVyZi10YWJsZS1lbnRyeSIpO2EuY2xhc3NMaXN0LnJlbW92ZSgicGVyZi10YWJsZS1yb3ciKTthLmNsYXNzTGlzdC5hZGQoInBlcmYtdGFibGUtcm93LWV4cGFuZGVkIil9LGhpZGVBbGxQZEVsZW1lbnRzXzpmdW5jdGlvbigpe2NvbnN0IGE9UG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCIuZmVhdHVyZS1jb250YWluZXIiKTsKZm9yKGxldCBjPTA7YzxhLmxlbmd0aDtjKyspdGhpcy5oaWRlUGRFbGVtZW50XyhhW2NdKX0scGRJbnB1dENoYW5nZWQ6ZnVuY3Rpb24oYSl7Y29uc3QgYz17dGFyZ2V0OmEudGFyZ2V0LG1vZGVsOmEubW9kZWx9O3RoaXMuZGVib3VuY2UoInBkSW5wdXRDaGFuZ2VkRGVib3VuY2UiLCgpPT50aGlzLnBkSW5wdXRDaGFuZ2VkSW1wbChjKSw1MDApfSxwZElucHV0Q2hhbmdlZEltcGw6ZnVuY3Rpb24oYSl7dGhpcy5jbGVhclBkRWxlbWVudENoYXJ0c18odGhpcy5nZXRVbmlxdWVCeUV2ZW50KGEsIi50Zi1jYXRlZ29yeS1wYW5lLWNvbnRlbnQiKSk7dGhpcy5kcmF3UGRDaGFydHNfKGEpfSxwb3B1bGF0ZVBkVGFiczpmdW5jdGlvbigpe3RoaXMuaGlkZUFsbFBkRWxlbWVudHNfKCk7aWYodGhpcy5sb2NhbCl0aGlzLmZpcmUoImdldC1lbGlnaWJsZS1mZWF0dXJlcyIpO2Vsc2V7Y29uc3QgYT1Rby5hZGRQYXJhbXMoIi9kYXRhL3BsdWdpbi93aGF0aWYvZWxpZ2libGVfZmVhdHVyZXMiLHt9KTsKdGhpcy5tYWtlQXN5bmNSZXF1ZXN0XyhhLGM9Pnt0aGlzLnNldCgicGFydGlhbERlcFBsb3RFbGlnaWJsZUZlYXR1cmVzIixjLnZhbHVlKX0sbnVsbCwicGxvdCBzZXR1cCIpfX0sc29ydFBkRmVhdHVyZXNfOmZ1bmN0aW9uKCl7dGhpcy5oaWRlQWxsUGRFbGVtZW50c18oKTt2YXIgYT17ZXhhbXBsZV9pbmRleDp0aGlzLmdsb2JhbFBkUGxvdHM/LTE6dGhpcy5zZWxlY3RlZFswXSxpbmZlcmVuY2VfYWRkcmVzczp0aGlzLmluZmVyZW5jZUFkZHJlc3MsbW9kZWxfbmFtZTp0aGlzLm1vZGVsTmFtZSxtb2RlbF90eXBlOnRoaXMubW9kZWxUeXBlLG1vZGVsX3ZlcnNpb246dGhpcy5tb2RlbFZlcnNpb24sbW9kZWxfc2lnbmF0dXJlOnRoaXMubW9kZWxTaWduYXR1cmUsdXNlX3ByZWRpY3Q6dGhpcy51c2VQcmVkaWN0QXBpLHByZWRpY3Rfb3V0cHV0X3RlbnNvcjp0aGlzLnByZWRpY3RPdXRwdXRUZW5zb3IscHJlZGljdF9pbnB1dF90ZW5zb3I6dGhpcy5wcmVkaWN0SW5wdXRUZW5zb3J9O3RoaXMuaXNTb3J0aW5nRWxpZ2libGVGZWF0dXJlcz0KITA7dGhpcy5sb2NhbD8oYS5mZWF0dXJlcz10aGlzLnBhcnRpYWxEZXBQbG90RWxpZ2libGVGZWF0dXJlcyx0aGlzLmZpcmUoInNvcnQtZWxpZ2libGUtZmVhdHVyZXMiLGEpKTooYT1Rby5hZGRQYXJhbXMoIi9kYXRhL3BsdWdpbi93aGF0aWYvc29ydF9lbGlnaWJsZV9mZWF0dXJlcyIsYSksdGhpcy5tYWtlQXN5bmNSZXF1ZXN0XyhhLGM9Pnt0aGlzLnNldCgicGFydGlhbERlcFBsb3RFbGlnaWJsZUZlYXR1cmVzIixjLnZhbHVlKX0sbnVsbCwicGxvdCBvcmRlcmluZyIsKCgpPT57dGhpcy5pc1NvcnRpbmdFbGlnaWJsZUZlYXR1cmVzPSExfSkuYmluZCh0aGlzKSkpfSxzaG91bGREaXNhYmxlU29ydEZlYXR1cmVzQnV0dG9uOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGN8fG51bGw9PWF8fDA9PWEubGVuZ3RofSx0b2dnbGVUcnVlTGFiZWxTZXR1cDpmdW5jdGlvbigpe3RoaXMuJC5jb2xsYXBzZXRydWVsYWJlbC50b2dnbGUoKX0sdG9nZ2xlRXhwbG9yZXJTZXR1cDpmdW5jdGlvbigpe3RoaXMuJCQoIiNjb2xsYXBzZWV4cGxvcmVyIikudG9nZ2xlKCl9LAp0b2dnbGVDb250ZXh0VG9vbHM6ZnVuY3Rpb24oKXt0aGlzLiQuY29sbGFwc2Vjb250ZXh0dG9vbHMudG9nZ2xlKCl9LHRvZ2dsZVBlcmZvcm1hbmNlOmZ1bmN0aW9uKCl7dGhpcy4kLmNvbGxhcHNlcGVyZm9ybWFuY2UudG9nZ2xlKCl9LHRvZ2dsZUluZmVyZW5jZVJlc3VsdHM6ZnVuY3Rpb24oKXt0aGlzLiQkKCIjY29sbGFwc2VpbmZlcmVuY2UiKS50b2dnbGUoKX0sZ2V0RXhwYW5kQ29sbGFwc2VJY29uOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJleHBhbmQtbGVzcyI6ImV4cGFuZC1tb3JlIn0sZ2V0RXhwYW5kQ29sbGFwc2VQZXJmSWNvbkNsYXNzOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJub3JtYWwtaWNvbiI6InJvdGF0ZWQtaWNvbiJ9LGdldFBlcmZUYWJsZVJvd0NsYXNzOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJwZXJmLXRhYmxlLXJvdy1leHBhbmRlZCI6InBlcmYtdGFibGUtcm93In0sZ2V0UGVyZlRhYmxlTW9kZWxDbGFzczpmdW5jdGlvbihhKXtyZXR1cm4gMj5hPyJwZXJmLXRhYmxlLW1vZGVsLXNpbmdsZSI6CiJwZXJmLXRhYmxlLW1vZGVsIn0sZ2V0RGF0YXBvaW50RWRpdG9yVGl0bGU6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5nZXRTZWN0aW9uVGl0bGUoIkVkaXQiLGEsYyl9LGdldEluZmVyVGl0bGU6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5nZXRTZWN0aW9uVGl0bGUoIkluZmVyIixhLGMpfSxnZXRTZWN0aW9uVGl0bGU6ZnVuY3Rpb24oYSxjLGQpe251bGwhPWMmJiIiIT09YyYmKGE9bnVsbCE9ZCYmMDxkLmxlbmd0aD9hKygiIC0gRGF0YXBvaW50cyAiK2MrIiBhbmQgIitkWzBdKTphKygiIC0gRGF0YXBvaW50ICIrYykpO3JldHVybiBhfSx0b2dnbGVQZXJmUm93OmZ1bmN0aW9uKGEpe2ZvcihhPWEudGFyZ2V0O251bGwhPWEmJiFhLmRhdGFzZXQuaW5kZXg7KWE9YS5wYXJlbnROb2RlO251bGwhPWEmJihhPWEuZGF0YXNldC5pbmRleCx0aGlzLnNldCgiZmVhdHVyZVZhbHVlVGhyZXNob2xkcy4iK2ErIi5vcGVuZWQiLCF0aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHNbYV0ub3BlbmVkKSwKdGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzW2FdLm9wZW5lZCYmcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLnVwZGF0ZUluZmVyZW5jZVN0YXRzXyghMCkpKX0sZ2V0UGVyZm9ybWFuY2VUYWJUaXRsZTpmdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLmlzQmluYXJ5Q2xhc3NpZmljYXRpb25fKGEsYyk/IlBlcmZvcm1hbmNlIFx4MjYgRmFpcm5lc3MiOiJQZXJmb3JtYW5jZSJ9LGdldFBlcmZUYWJsZVRpdGxlOmZ1bmN0aW9uKGEsYyxkLGYpe2xldCBnPXRoaXMuZ2V0UHJpbnRhYmxlT3B0aW1pemF0aW9uTmFtZShkKTtpZihudWxsPT1hfHwwPT1hLmxlbmd0aClyZXR1cm4iY3VzdG9tIj09ZD8iRXhwbG9yZSBvdmVyYWxsIHBlcmZvcm1hbmNlIjpnO251bGwhPWMmJjAhPWMubGVuZ3RoJiYoYSs9Ii8iK2MpO3JldHVybiBnKyIgZm9yICIrZi5sZW5ndGgrIiB2YWx1ZXMgb2YgIithfSxnZXROb1RocmVzaG9sZFBlcmZUYWJsZVRpdGxlOmZ1bmN0aW9uKGEsYyxkKXtpZihudWxsPT0KYXx8MD09YS5sZW5ndGgpcmV0dXJuIkV4cGxvcmUgb3ZlcmFsbCBwZXJmb3JtYW5jZSI7bnVsbCE9YyYmMCE9Yy5sZW5ndGgmJihhKz0iLyIrYyk7cmV0dXJuIGErIiAoIitkLmxlbmd0aCsiIHZhbHVlcykifSxnZXRQcmludGFibGVPcHRpbWl6YXRpb25OYW1lOmZ1bmN0aW9uKGEpe3JldHVybiJjdXN0b20iPT1hPyJDdXN0b20gdGhyZXNob2xkcyI6InVuYXdhcmUiPT1hPyJPcHRpbWFsIHNpbmdsZSB0aHJlc2hvbGQiOiJkZW1vcGFyaXR5Ij09YT8iRGVtb2dyYXBoaWMgcGFyaXR5IHRocmVzaG9sZHMiOiJlcXVhbG9wcCI9PWE/IkVxdWFsIG9wcG9ydHVuaXR5IHRocmVzaG9sZHMiOiJlcXVhbGFjYyI9PWE/IkVxdWFsIGFjY3VyYWN5IHRocmVzaG9sZHMiOiJPcHRpbWFsIGdyb3VwIHRocmVzaG9sZHMifSxnZXRGZWF0dXJlU29ydEJ5OmZ1bmN0aW9uKGEsYyl7bGV0IGQ9WyJDb3VudCIsIkFscGhhYmV0aWNhbCJdO3JldHVybiBkPXRoaXMuaXNCaW5hcnlDbGFzc2lmaWNhdGlvbl8oYSwKYyk/ZC5jb25jYXQoWyJBY2N1cmFjeSIsIkZhbHNlIHBvc2l0aXZlcyIsIkZhbHNlIG5lZ2F0aXZlcyJdKTp0aGlzLmlzTXVsdGlDbGFzc18oYSxjKT9kLmNvbmNhdChbIkFjY3VyYWN5Il0pOmQuY29uY2F0KCJNZWFuIGVycm9yO01lZGlhbiBlcnJvcjtNZWFuIGFic29sdXRlIGVycm9yO01lZGlhbiBhYnNvbHV0ZSBlcnJvcjtNZWFuIHNxdWFyZWQgZXJyb3I7TWVkaWFuIHNxdWFyZWQgZXJyb3IiLnNwbGl0KCI7IikpfSxzZWxlY3RlZEZlYXR1cmVTb3J0Q2hhbmdlZF86ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHM7dGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzPVtdO3RoaXMuZmVhdHVyZVZhbHVlVGhyZXNob2xkcz10aGlzLnNvcnRGZWF0dXJlVmFsdWVzKGEpO251bGwhPXRoaXMucmVncmVzc2lvbkVudHJpZXNfJiYoYT10aGlzLnJlZ3Jlc3Npb25FbnRyaWVzXyx0aGlzLnJlZ3Jlc3Npb25FbnRyaWVzXz1bXSx0aGlzLnJlZ3Jlc3Npb25FbnRyaWVzXz0KdGhpcy5zb3J0UmVncmVzc2lvbkVudHJpZXMoYSkpfSxnZXRTbGlkZXJDbGFzczpmdW5jdGlvbihhKXtyZXR1cm4ic2xpZGVyICIrKDA9PWE/InNsaWRlci1tb2RlbC1vbmUiOiJzbGlkZXItbW9kZWwtdHdvIil9LGZvcm1hdEVycm9yOmZ1bmN0aW9uKGEpe3JldHVybiBkMy5mb3JtYXQoIi4zZiIpKGEpfSxleHBhbmRBbGxQZXJmb3JtYW5jZTpmdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuZmVhdHVyZVZhbHVlVGhyZXNob2xkcyl7Zm9yKGxldCBhPTA7YTx0aGlzLmZlYXR1cmVWYWx1ZVRocmVzaG9sZHMubGVuZ3RoO2ErKyl0aGlzLnNldCgiZmVhdHVyZVZhbHVlVGhyZXNob2xkcy4iK2ErIi5vcGVuZWQiLCEwKTtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PnRoaXMudXBkYXRlSW5mZXJlbmNlU3RhdHNfKCEwKSl9fSxjb2xsYXBzZUFsbFBlcmZvcm1hbmNlOmZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzKWZvcihsZXQgYT0wO2E8dGhpcy5mZWF0dXJlVmFsdWVUaHJlc2hvbGRzLmxlbmd0aDthKyspdGhpcy5zZXQoImZlYXR1cmVWYWx1ZVRocmVzaG9sZHMuIisKYSsiLm9wZW5lZCIsITEpfSxnZXRQZXJmVGFibGVFbnRyeUNsYXNzOmZ1bmN0aW9uKGEpe2xldCBjPSJwZXJmLXRhYmxlLWVudHJ5IHBlcmYtdGFibGUtcm93ICI7ImludGVyZXN0aW5nbmVzcyJpbiBhJiYwPT1hLmludGVyZXN0aW5nbmVzcyYmKGMrPSJwZXJmLXRhYmxlLWVudHJ5LXRyaXZpYWwiKTtyZXR1cm4gY319KTtZby5yZWdpc3RlckRhc2hib2FyZCh7cGx1Z2luOiJ3aGF0aWYiLGVsZW1lbnROYW1lOiJ0Zi1pbnRlcmFjdGl2ZS1pbmZlcmVuY2UtZGFzaGJvYXJkIix0YWJOYW1lOiJXaGF0LUlmIFRvb2wifSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtdXRpbHMvdGYtaHBhcmFtcy11dGlscy5odG1sLmpzCihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGYoQil7cmV0dXJuIiIhPT1CLmRpc3BsYXlOYW1lJiZ2b2lkIDAhPT1CLmRpc3BsYXlOYW1lP0IuZGlzcGxheU5hbWU6Qi5uYW1lfWZ1bmN0aW9uIGcoQil7aWYoIiIhPT1CLmRpc3BsYXlOYW1lJiZ2b2lkIDAhPT1CLmRpc3BsYXlOYW1lKXJldHVybiBCLmRpc3BsYXlOYW1lO2xldCBJPUIubmFtZS5ncm91cDtCPUIubmFtZS50YWc7dm9pZCAwPT09SSYmKEk9IiIpO3ZvaWQgMD09PUImJihCPSIiKTtyZXR1cm4iIj09PUk/QjpJKyIuIitCfWZ1bmN0aW9uIGwoQil7cmV0dXJuIEIuaHBhcmFtQ29sdW1ucy5sZW5ndGh9ZnVuY3Rpb24gayhCKXtyZXR1cm4gQi5tZXRyaWNDb2x1bW5zLmxlbmd0aH1mdW5jdGlvbiBuKEIsSSl7cmV0dXJuIEJbSV19ZnVuY3Rpb24gcChCLEkpe3JldHVybiBCLmZpbmQoTz0+Xy5pc0VxdWFsKE8ubmFtZSxJKSl9ZnVuY3Rpb24gcShCLEksTyl7cmV0dXJuIEkuaHBhcmFtc1tCLmhwYXJhbUNvbHVtbnNbT10uaHBhcmFtSW5mby5uYW1lXX0KZnVuY3Rpb24gcihCLEksTyl7Qj1wKEkubWV0cmljVmFsdWVzLEIubWV0cmljQ29sdW1uc1tPXS5tZXRyaWNJbmZvLm5hbWUpO3JldHVybiB2b2lkIDA9PT1CP3ZvaWQgMDpCLnZhbHVlfWZ1bmN0aW9uIHQoQixJLE8pe3JldHVybiBPPEIuaHBhcmFtQ29sdW1ucy5sZW5ndGg/cShCLEksTyk6cihCLEksTy1CLmhwYXJhbUNvbHVtbnMubGVuZ3RoKX1mdW5jdGlvbiB2KEIpe3JldHVybiBCLmhwYXJhbUluZm9zLmxlbmd0aH1mdW5jdGlvbiB5KEIpe3JldHVybiBCLm1ldHJpY0luZm9zLmxlbmd0aH1mdW5jdGlvbiB6KEIsSSxPKXtyZXR1cm4gSS5ocGFyYW1zW0IuaHBhcmFtSW5mb3NbT10ubmFtZV19ZnVuY3Rpb24geChCLEksTyl7Qj1wKEkubWV0cmljVmFsdWVzLEIubWV0cmljSW5mb3NbT10ubmFtZSk7cmV0dXJuIHZvaWQgMD09PUI/dm9pZCAwOkIudmFsdWV9ZnVuY3Rpb24gQyhCLEksTyl7cmV0dXJuIE88Qi5ocGFyYW1JbmZvcy5sZW5ndGg/eihCLEksTyk6eChCLEksTy1CLmhwYXJhbUluZm9zLmxlbmd0aCl9CmZ1bmN0aW9uIEYoQil7cmV0dXJuIF8uaXNOdW1iZXIoQik/Qi50b1ByZWNpc2lvbig1KTp2b2lkIDA9PT1CPyIiOkIudG9TdHJpbmcoKX1mdW5jdGlvbiBEKEIsSSl7cmV0dXJuIEIqQitJKkl9ZC5ocGFyYW1OYW1lPWY7ZC5tZXRyaWNOYW1lPWc7ZC5zY2hlbWFDb2x1bW5OYW1lPWZ1bmN0aW9uKEIsSSl7cmV0dXJuIEk8Qi5ocGFyYW1Db2x1bW5zLmxlbmd0aD9mKEIuaHBhcmFtQ29sdW1uc1tJXS5ocGFyYW1JbmZvKTpnKEIubWV0cmljQ29sdW1uc1tJLUIuaHBhcmFtQ29sdW1ucy5sZW5ndGhdLm1ldHJpY0luZm8pfTtkLm51bUhQYXJhbXM9bDtkLm51bU1ldHJpY3M9aztkLm51bUNvbHVtbnM9ZnVuY3Rpb24oQil7cmV0dXJuIGwoQikrayhCKX07ZC5ocGFyYW1WYWx1ZUJ5TmFtZT1uO2QubWV0cmljVmFsdWVCeU5hbWU9cDtkLmhwYXJhbVZhbHVlQnlJbmRleD1xO2QubWV0cmljVmFsdWVCeUluZGV4PXI7ZC5jb2x1bW5WYWx1ZUJ5SW5kZXg9dDtkLm51bWVyaWNDb2x1bW5FeHRlbnQ9CmZ1bmN0aW9uKEIsSSxPKXtyZXR1cm4gZDMuZXh0ZW50KEksUD0+dChCLFAsTykpfTtkLmdldEFic29sdXRlQ29sdW1uSW5kZXg9ZnVuY3Rpb24oQixJLE8pe2lmKE88SS5ocGFyYW1JbmZvcy5sZW5ndGgpQj1CLmhwYXJhbUNvbHVtbnMuZmluZEluZGV4KFA9PlAuaHBhcmFtSW5mby5uYW1lPT09SS5ocGFyYW1JbmZvc1tPXS5uYW1lKTtlbHNle2NvbnN0IFA9SS5tZXRyaWNJbmZvc1tPLUkuaHBhcmFtSW5mb3MubGVuZ3RoXS5uYW1lO0I9Qi5ocGFyYW1Db2x1bW5zLmxlbmd0aCtCLm1ldHJpY0NvbHVtbnMuZmluZEluZGV4KEg9PkgubWV0cmljSW5mby5uYW1lPT09UCl9Y29uc29sZS5hc3NlcnQoLTEhPT1CKTtyZXR1cm4gQn07ZC5zY2hlbWFWaXNpYmxlQ29sdW1uTmFtZT1mdW5jdGlvbihCLEkpe3JldHVybiBJPEIuaHBhcmFtSW5mb3MubGVuZ3RoP2YoQi5ocGFyYW1JbmZvc1tJXSk6ZyhCLm1ldHJpY0luZm9zW0ktQi5ocGFyYW1JbmZvcy5sZW5ndGhdKX07ZC5udW1WaXNpYmxlSFBhcmFtcz0KdjtkLm51bVZpc2libGVNZXRyaWNzPXk7ZC5udW1WaXNpYmxlQ29sdW1ucz1mdW5jdGlvbihCKXtyZXR1cm4gdihCKSt5KEIpfTtkLnZpc2libGVOdW1lcmljQ29sdW1uRXh0ZW50PWZ1bmN0aW9uKEIsSSxPKXtyZXR1cm4gZDMuZXh0ZW50KEksUD0+QyhCLFAsTykpfTtkLnByZXR0eVByaW50SFBhcmFtVmFsdWVCeU5hbWU9ZnVuY3Rpb24oQixJKXtyZXR1cm4gRihuKEIsSSkpfTtkLnByZXR0eVByaW50TWV0cmljVmFsdWVCeU5hbWU9ZnVuY3Rpb24oQixJKXtyZXR1cm4gRihwKEIsSSkpfTtkLnNlc3Npb25Hcm91cFdpdGhOYW1lPWZ1bmN0aW9uKEIsSSl7cmV0dXJuIEIuZmluZChPPT5PLm5hbWU9PT1JKX07ZC5ocGFyYW1WYWx1ZUJ5VmlzaWJsZUluZGV4PXo7ZC5tZXRyaWNWYWx1ZUJ5VmlzaWJsZUluZGV4PXg7ZC5jb2x1bW5WYWx1ZUJ5VmlzaWJsZUluZGV4PUM7ZC5wcmV0dHlQcmludD1GO2QubDJOb3JtU3F1YXJlZD1EO2QuZXVjbGlkZWFuRGlzdD1mdW5jdGlvbihCLEksTyxQKXtyZXR1cm4gTWF0aC5zcXJ0KEQoQi0KTyxJLVApKX07ZC5wb2ludFRvUmVjdGFuZ2xlRGlzdD1mdW5jdGlvbihCLEksTyxQLEgsSyl7aWYoQjxPJiZJPFApcmV0dXJuIGQuZXVjbGlkZWFuRGlzdChCLEksTyxQKTtpZihPPD1CJiZCPEgmJkk8UClyZXR1cm4gUC1JO2lmKEg8PUImJkk8UClyZXR1cm4gZC5ldWNsaWRlYW5EaXN0KEIsSSxILFApO2lmKEI8TyYmUDw9SSYmSTxLKXJldHVybiBPLUI7aWYoTzw9QiYmQjxIJiZQPD1JJiZJPEspcmV0dXJuIDA7aWYoSDw9QiYmUDw9SSYmSTxLKXJldHVybiBCLUg7aWYoQjxPJiZLPD1JKXJldHVybiBkLmV1Y2xpZGVhbkRpc3QoQixJLE8sSyk7aWYoTzw9QiYmQjxIJiZLPD1JKXJldHVybiBJLUs7aWYoSDw9QiYmSzw9SSlyZXR1cm4gZC5ldWNsaWRlYW5EaXN0KEIsSSxILEspO3Rocm93IlBvaW50ICh4LHkpIG11c3QgYmUgaW4gb25lIG9mIHRoZSByZWdpb25zIGRlZmluZWQgYWJvdmUuIjt9O2QudHJhbnNsYXRlU3RyPWZ1bmN0aW9uKEIsSSl7cmV0dXJuIHZvaWQgMD09PUk/InRyYW5zbGF0ZSgiKwpCKyIpIjoidHJhbnNsYXRlKCIrQisiLCIrSSsiKSJ9O2Qucm90YXRlU3RyPWZ1bmN0aW9uKEIsSSl7bGV0IE89InJvdGF0ZSg5MCI7dm9pZCAwIT09QiYmdm9pZCAwIT09SSYmKE89TysiLCIrQisiLCIrSSk7cmV0dXJuIE8rIikifTtkLmlzTnVsbE9yVW5kZWZpbmVkPWZ1bmN0aW9uKEIpe3JldHVybiBudWxsPT09Qnx8dm9pZCAwPT09Qn07ZC5xdWFkVHJlZVZpc2l0UG9pbnRzSW5SZWN0PWZ1bmN0aW9uKEIsSSxPLFAsSCxLKXtCLnZpc2l0KChNLEwsUixVLFkpPT57aWYodm9pZCAwPT09TS5sZW5ndGgpe2RvIEw9Qi54KCkoTS5kYXRhKSxSPUIueSgpKE0uZGF0YSksSTw9TCYmTDxQJiZPPD1SJiZSPEgmJksoTS5kYXRhKTt3aGlsZShNPU0ubmV4dCk7cmV0dXJuITB9cmV0dXJuIEw+PVB8fFU8PUl8fFI+PUh8fFk8PU99KX07ZC5xdWFkVHJlZVZpc2l0UG9pbnRzSW5EaXNrPWZ1bmN0aW9uKEIsSSxPLFAsSCl7Qi52aXNpdCgoSyxNLEwsUixVKT0+e2lmKHZvaWQgMD09PUsubGVuZ3RoKXtkbyBNPQpCLngoKShLLmRhdGEpLEw9Qi55KCkoSy5kYXRhKSxNPWQuZXVjbGlkZWFuRGlzdChJLE8sTSxMKSxNPD1QJiZIKEsuZGF0YSxNKTt3aGlsZShLPUsubmV4dCk7cmV0dXJuITB9cmV0dXJuIGQucG9pbnRUb1JlY3RhbmdsZURpc3QoSSxPLE0sTCxSLFUpPlB9KX07ZC5maWx0ZXJTZXQ9ZnVuY3Rpb24oQixJKXtjb25zdCBPPW5ldyBTZXQ7Qi5mb3JFYWNoKFA9PntJKFApJiZPLmFkZChQKX0pO3JldHVybiBPfTtkLnNldEFycmF5T2JzZXJ2YWJseT1mdW5jdGlvbihCLEkpe2NvbnN0IE89Qi5nZXQoInNlc3Npb25Hcm91cHMiLEIpO0FycmF5LmlzQXJyYXkoTyk/Qi5zcGxpY2UuYXBwbHkoQixbInNlc3Npb25Hcm91cHMiLDAsTy5sZW5ndGhdLmNvbmNhdChJKSk6Qi5zZXQoInNlc3Npb25Hcm91cHMiLEkpfTtkLmhhc2hPZlN0cmluZz1mdW5jdGlvbihCKXtsZXQgST0wO2ZvcihsZXQgTz0wO088Qi5sZW5ndGg7KytPKUk9MzEqSStCLmNoYXJDb2RlQXQoTykmNDI5NDk2NzI5NTtyZXR1cm4gSSsKTWF0aC5wb3coMiwzMSl9fSkoYy51dGlsc3x8KGMudXRpbHM9e30pKX0pKGEuaHBhcmFtc3x8KGEuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1zcGxpdC1sYXlvdXQvdmFhZGluLXNwbGl0LWxheW91dC5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tc3BsaXQtbGF5b3V0IixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOnt2ZXJ0aWNhbDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMX0sX3ByZXZpb3VzUHJpbWFyeVBvaW50ZXJFdmVudHM6U3RyaW5nLF9wcmV2aW91c1NlY29uZGFyeVBvaW50ZXJFdmVudHM6U3RyaW5nfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPVBvbHltZXIuZG9tKHRoaXMpLm9ic2VydmVOb2Rlcyh0aGlzLl9wcm9jZXNzQ2hpbGRyZW4pfSxkZXRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuZG9tKHRoaXMpLnVub2JzZXJ2ZU5vZGVzKHRoaXMuX29ic2VydmVyKX0sX3Byb2Nlc3NDaGlsZHJlbjpmdW5jdGlvbigpe3RoaXMuZ2V0RWZmZWN0aXZlQ2hpbGRyZW4oKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2xhc3NMaXN0LmNvbnRhaW5zKCJzcGxpdHRlci1oYW5kbGUiKT8KKFBvbHltZXIuZG9tKGEpLnNldEF0dHJpYnV0ZSgic2xvdCIsImhhbmRsZSIpLCExKTohMH0pLmZvckVhY2goZnVuY3Rpb24oYSxjKXswPT09Yz8odGhpcy5fcHJpbWFyeUNoaWxkPWEsUG9seW1lci5kb20oYSkuc2V0QXR0cmlidXRlKCJzbG90IiwicHJpbWFyeSIpKToxPT1jPyh0aGlzLl9zZWNvbmRhcnlDaGlsZD1hLFBvbHltZXIuZG9tKGEpLnNldEF0dHJpYnV0ZSgic2xvdCIsInNlY29uZGFyeSIpKTpQb2x5bWVyLmRvbShhKS5yZW1vdmVBdHRyaWJ1dGUoInNsb3QiKX0uYmluZCh0aGlzKSl9LF9zZXRGbGV4QmFzaXM6ZnVuY3Rpb24oYSxjLGQpe2M9TWF0aC5tYXgoMCxNYXRoLm1pbihjLGQpKTswPT09YyYmKGM9MUUtNik7YS5zdHlsZS5mbGV4PSIxIDEgIitjKyJweCJ9LF9vbkhhbmRsZVRyYWNrOmZ1bmN0aW9uKGEpe2lmKHRoaXMuX3ByaW1hcnlDaGlsZCYmdGhpcy5fc2Vjb25kYXJ5Q2hpbGQpe3ZhciBjPXRoaXMudmVydGljYWw/ImhlaWdodCI6IndpZHRoIjsic3RhcnQiPT09CmEuZGV0YWlsLnN0YXRlPyh0aGlzLl9zdGFydFNpemU9e2NvbnRhaW5lcjp0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2NdLXRoaXMuJC5zcGxpdHRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtjXSxwcmltYXJ5OnRoaXMuX3ByaW1hcnlDaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtjXSxzZWNvbmRhcnk6dGhpcy5fc2Vjb25kYXJ5Q2hpbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbY119LHRoaXMuX3ByZXZpb3VzUHJpbWFyeVBvaW50ZXJFdmVudHM9dGhpcy5fcHJpbWFyeUNoaWxkLnN0eWxlLnBvaW50ZXJFdmVudHMsdGhpcy5fcHJldmlvdXNTZWNvbmRhcnlQb2ludGVyRXZlbnRzPXRoaXMuX3NlY29uZGFyeUNoaWxkLnN0eWxlLnBvaW50ZXJFdmVudHMsdGhpcy5fcHJpbWFyeUNoaWxkLnN0eWxlLnBvaW50ZXJFdmVudHM9Im5vbmUiLHRoaXMuX3NlY29uZGFyeUNoaWxkLnN0eWxlLnBvaW50ZXJFdmVudHM9Im5vbmUiKTooYz10aGlzLnZlcnRpY2FsP2EuZGV0YWlsLmR5OgphLmRldGFpbC5keCx0aGlzLl9zZXRGbGV4QmFzaXModGhpcy5fcHJpbWFyeUNoaWxkLHRoaXMuX3N0YXJ0U2l6ZS5wcmltYXJ5K2MsdGhpcy5fc3RhcnRTaXplLmNvbnRhaW5lciksdGhpcy5fc2V0RmxleEJhc2lzKHRoaXMuX3NlY29uZGFyeUNoaWxkLHRoaXMuX3N0YXJ0U2l6ZS5zZWNvbmRhcnktYyx0aGlzLl9zdGFydFNpemUuY29udGFpbmVyKSx0aGlzLm5vdGlmeVJlc2l6ZSgpLCJlbmQiPT09YS5kZXRhaWwuc3RhdGUmJihkZWxldGUgdGhpcy5fc3RhcnRTaXplLHRoaXMuX3ByaW1hcnlDaGlsZC5zdHlsZS5wb2ludGVyRXZlbnRzPXRoaXMuX3ByZXZpb3VzUHJpbWFyeVBvaW50ZXJFdmVudHMsdGhpcy5fc2Vjb25kYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cz10aGlzLl9wcmV2aW91c1NlY29uZGFyeVBvaW50ZXJFdmVudHMpKX19LF9wcmV2ZW50RGVmYXVsdDpmdW5jdGlvbihhKXthLnByZXZlbnREZWZhdWx0KCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1xdWVyeS1wYW5lL3RmLWhwYXJhbXMtcXVlcnktcGFuZS5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXF1ZXJ5LXBhbmUiLHByb3BlcnRpZXM6e2JhY2tlbmQ6T2JqZWN0LGV4cGVyaW1lbnROYW1lOlN0cmluZyxjb25maWd1cmF0aW9uOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHtzY2hlbWE6e2hwYXJhbUNvbHVtbnM6W10sbWV0cmljQ29sdW1uczpbXX0sY29sdW1uc1Zpc2liaWxpdHk6W10sdmlzaWJsZVNjaGVtYTp7aHBhcmFtSW5mb3M6W10sbWV0cmljSW5mb3M6W119fSkscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxzZXNzaW9uR3JvdXBzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXSxyZWFkT25seTohMCxub3RpZnk6ITB9LF9leHBlcmltZW50Ok9iamVjdCxfaHBhcmFtczpBcnJheSxfbWV0cmljczpBcnJheSxfc3RhdHVzZXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9Plt7dmFsdWU6IlNUQVRVU19VTktOT1dOIixkaXNwbGF5TmFtZToiVW5rbm93biIsYWxsb3dlZDohMH0se3ZhbHVlOiJTVEFUVVNfU1VDQ0VTUyIsZGlzcGxheU5hbWU6IlN1Y2Nlc3MiLAphbGxvd2VkOiEwfSx7dmFsdWU6IlNUQVRVU19GQUlMVVJFIixkaXNwbGF5TmFtZToiRmFpbHVyZSIsYWxsb3dlZDohMH0se3ZhbHVlOiJTVEFUVVNfUlVOTklORyIsZGlzcGxheU5hbWU6IlJ1bm5pbmciLGFsbG93ZWQ6ITB9XX0sX2dldEV4cGVyaW1lbnRSZXNvbHZlZDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFByb21pc2UoYT0+e3RoaXMuX3Jlc29sdmVHZXRFeHBlcmltZW50PWF9KX19LF9yZXNvbHZlR2V0RXhwZXJpbWVudDpGdW5jdGlvbixfbGlzdFNlc3Npb25Hcm91cHNDYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgUW8uQ2FuY2VsbGVyfSxfc29ydEJ5SW5kZXg6TnVtYmVyLF9zb3J0RGlyZWN0aW9uOk51bWJlcixfcGFnZVNpemVJbnB1dDp7dHlwZTpPYmplY3QsdmFsdWU6e3ZhbHVlOiIxMDAiLGludmFsaWQ6ITF9fSxfcGFnZU51bWJlcklucHV0Ont0eXBlOk9iamVjdCx2YWx1ZTp7dmFsdWU6IjEiLGludmFsaWQ6ITF9fSwKX3BhZ2VDb3VudFN0cjp7dHlwZTpTdHJpbmcsdmFsdWU6Ij8ifSxfdG90YWxTZXNzaW9uR3JvdXBzQ291bnRTdHI6U3RyaW5nfSxvYnNlcnZlcnM6WyJfY29tcHV0ZUV4cGVyaW1lbnRBbmRSZWxhdGVkUHJvcHMoYmFja2VuZCwgZXhwZXJpbWVudE5hbWUpIiwiX3VwZGF0ZUNvbmZpZ3VyYXRpb24oX2hwYXJhbXMuKiwgX21ldHJpY3MuKikiXSxyZWxvYWQoKXt0aGlzLl9xdWVyeVNlcnZlcigpfSxfY29tcHV0ZUV4cGVyaW1lbnRBbmRSZWxhdGVkUHJvcHMoKXtjb25zdCBhPXRmLmhwYXJhbXMudXRpbHM7YS5pc051bGxPclVuZGVmaW5lZCh0aGlzLmJhY2tlbmQpfHxhLmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuZXhwZXJpbWVudE5hbWUpfHx0aGlzLmJhY2tlbmQuZ2V0RXhwZXJpbWVudCh7ZXhwZXJpbWVudE5hbWU6dGhpcy5leHBlcmltZW50TmFtZX0pLnRoZW4oYz0+e18uaXNFcXVhbChjLHRoaXMuX2V4cGVyaW1lbnQpfHwodGhpcy5zZXQoIl9leHBlcmltZW50IixjKSx0aGlzLl9jb21wdXRlSFBhcmFtcygpLAp0aGlzLl9jb21wdXRlTWV0cmljcygpLHRoaXMuX3F1ZXJ5U2VydmVyKCksdGhpcy5fcmVzb2x2ZUdldEV4cGVyaW1lbnQoKSl9KX0sX2NvbXB1dGVIUGFyYW1zKCl7Y29uc3QgYT1bXTt0aGlzLl9leHBlcmltZW50LmhwYXJhbUluZm9zLmZvckVhY2goKGMsZCk9Pntjb25zdCBmPXtpbmZvOmMsZGlzcGxheWVkOjU+ZCxmaWx0ZXI6e319O2YuaW5mby5oYXNPd25Qcm9wZXJ0eSgiZG9tYWluRGlzY3JldGUiKT8oZi5maWx0ZXIuZG9tYWluRGlzY3JldGU9W10sZi5pbmZvLmRvbWFpbkRpc2NyZXRlLmZvckVhY2goZz0+e2YuZmlsdGVyLmRvbWFpbkRpc2NyZXRlLnB1c2goe3ZhbHVlOmcsY2hlY2tlZDohMH0pfSkpOiJEQVRBX1RZUEVfQk9PTCI9PT1mLmluZm8udHlwZT9mLmZpbHRlci5kb21haW5EaXNjcmV0ZT1be3ZhbHVlOiExLGNoZWNrZWQ6ITB9LHt2YWx1ZTohMCxjaGVja2VkOiEwfV06IkRBVEFfVFlQRV9GTE9BVDY0Ij09PWYuaW5mby50eXBlP2YuZmlsdGVyLmludGVydmFsPXttaW46e3ZhbHVlOiIiLAppbnZhbGlkOiExfSxtYXg6e3ZhbHVlOiIiLGludmFsaWQ6ITF9fToiREFUQV9UWVBFX1NUUklORyI9PT1mLmluZm8udHlwZT9mLmZpbHRlci5yZWdleHA9IiI6Y29uc29sZS53YXJuKCJ1bmtub3duIGhwYXJhbS5pbmZvLnR5cGU6ICVzIixmLmluZm8udHlwZSk7YS5wdXNoKGYpfSk7dGhpcy5zZXQoIl9ocGFyYW1zIixhKX0sX2NvbXB1dGVNZXRyaWNzKCl7Y29uc3QgYT1bXTt0aGlzLl9leHBlcmltZW50Lm1ldHJpY0luZm9zLmZvckVhY2goKGMsZCk9PnthLnB1c2goe2luZm86YyxmaWx0ZXI6e2ludGVydmFsOnttaW46e3ZhbHVlOiIiLGludmFsaWQ6ITF9LG1heDp7dmFsdWU6IiIsaW52YWxpZDohMX19fSxkaXNwbGF5ZWQ6NT5kfSl9KTt0aGlzLnNldCgiX21ldHJpY3MiLGEpfSxfY29tcHV0ZVNjaGVtYSgpe3JldHVybiB0aGlzLl9ocGFyYW1zJiZ0aGlzLl9tZXRyaWNzP3tocGFyYW1Db2x1bW5zOnRoaXMuX2hwYXJhbXMubWFwKGE9Pih7aHBhcmFtSW5mbzphLmluZm99KSksbWV0cmljQ29sdW1uczp0aGlzLl9tZXRyaWNzLm1hcChhPT4KKHttZXRyaWNJbmZvOmEuaW5mb30pKX06e2hwYXJhbUNvbHVtbnM6W10sbWV0cmljQ29sdW1uczpbXX19LF91cGRhdGVDb25maWd1cmF0aW9uKCl7dGhpcy5kZWJvdW5jZSgiX3VwZGF0ZUNvbmZpZ3VyYXRpb24iLCgpPT57dGhpcy5fc2V0Q29uZmlndXJhdGlvbih7c2NoZW1hOnRoaXMuX2NvbXB1dGVTY2hlbWEoKSxjb2x1bW5zVmlzaWJpbGl0eTp0aGlzLl9jb21wdXRlQ29sdW1uc1Zpc2liaWxpdHkoKSx2aXNpYmxlU2NoZW1hOnRoaXMuX2NvbXB1dGVWaXNpYmxlU2NoZW1hKCl9KX0pfSxfY29tcHV0ZUNvbHVtbnNWaXNpYmlsaXR5KCl7cmV0dXJuIHRoaXMuX2hwYXJhbXMmJnRoaXMuX21ldHJpY3M/dGhpcy5faHBhcmFtcy5tYXAoYT0+YS5kaXNwbGF5ZWQpLmNvbmNhdCh0aGlzLl9tZXRyaWNzLm1hcChhPT5hLmRpc3BsYXllZCkpOltdfSxfY29tcHV0ZVZpc2libGVTY2hlbWEoKXtpZighdGhpcy5faHBhcmFtc3x8IXRoaXMuX21ldHJpY3MpcmV0dXJue2hwYXJhbUluZm9zOltdLAptZXRyaWNJbmZvczpbXX07Y29uc3QgYT10aGlzLl9ocGFyYW1zLmZpbHRlcihkPT5kLmRpc3BsYXllZCkubWFwKGQ9PmQuaW5mbyksYz10aGlzLl9tZXRyaWNzLmZpbHRlcihkPT5kLmRpc3BsYXllZCkubWFwKGQ9PmQuaW5mbyk7cmV0dXJue2hwYXJhbUluZm9zOmEsbWV0cmljSW5mb3M6Y319LF9xdWVyeVNlcnZlcigpe3RoaXMuZGVib3VuY2UoInF1ZXJ5U2VydmVyIiwoKT0+dGhpcy5fcXVlcnlTZXJ2ZXJOb0RlYm91bmNlKCksMTAwKX0sX3F1ZXJ5U2VydmVyTm9EZWJvdW5jZSgpe3JldHVybiB0aGlzLl9zZW5kTGlzdFNlc3Npb25Hcm91cHNSZXF1ZXN0KCkudGhlbih0aGlzLl9saXN0U2Vzc2lvbkdyb3Vwc0NhbmNlbGxlci5jYW5jZWxsYWJsZSgoe3ZhbHVlOmEsY2FuY2VsbGVkOmN9KT0+e2N8fCgwPD1hLnRvdGFsU2l6ZT8odGhpcy5zZXQoIl9wYWdlQ291bnRTdHIiLFN0cmluZyhNYXRoLmNlaWwoYS50b3RhbFNpemUvK3RoaXMuX3BhZ2VTaXplSW5wdXQudmFsdWUpKSksdGhpcy5zZXQoIl90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0ciIsCmEudG90YWxTaXplKSk6KHRoaXMuc2V0KCJfcGFnZUNvdW50U3RyIiwiPyIpLHRoaXMuc2V0KCJfdG90YWxTZXNzaW9uR3JvdXBzQ291bnRTdHIiLCJVbmtub3duIikpLHRmLmhwYXJhbXMudXRpbHMuc2V0QXJyYXlPYnNlcnZhYmx5KHRoaXMsYS5zZXNzaW9uR3JvdXBzKSl9KSl9LF9zZW5kTGlzdFNlc3Npb25Hcm91cHNSZXF1ZXN0KCl7Y29uc3QgYT10aGlzLl9idWlsZExpc3RTZXNzaW9uR3JvdXBzUmVxdWVzdCgpO2lmKG51bGwhPT1hKXJldHVybiB0aGlzLl9saXN0U2Vzc2lvbkdyb3Vwc0NhbmNlbGxlci5jYW5jZWxBbGwoKSx0aGlzLmJhY2tlbmQubGlzdFNlc3Npb25Hcm91cHMoYSl9LF9idWlsZExpc3RTZXNzaW9uR3JvdXBzUmVxdWVzdCgpe2Z1bmN0aW9uIGEocCl7dmFyIHE9ZC5nZXQocCsiLm1pbi52YWx1ZSIpO2NvbnNvbGUuYXNzZXJ0KHZvaWQgMCE9PXEpO3E9IiI9PT1xPyItSW5maW5pdHkiOitxO2Quc2V0KHArIi5taW4uaW52YWxpZCIsaXNOYU4ocSkpO2Y9ZiYmIWlzTmFOKHEpOwp2YXIgcj1kLmdldChwKyIubWF4LnZhbHVlIik7Y29uc29sZS5hc3NlcnQodm9pZCAwIT09cik7cj0iIj09PXI/IkluZmluaXR5IjorcjtkLnNldChwKyIubWF4LmludmFsaWQiLGlzTmFOKHIpKTtmPWYmJiFpc05hTihyKTtyZXR1cm4gaXNOYU4ocSl8fGlzTmFOKHIpP251bGw6e21pblZhbHVlOnEsbWF4VmFsdWU6cn19ZnVuY3Rpb24gYyhwKXt2YXIgcT1kLmdldChwKyIudmFsdWUiKTtjb25zb2xlLmFzc2VydCh2b2lkIDAhPT1xKTtxPStxO2NvbnN0IHI9TnVtYmVyLmlzSW50ZWdlcihxKSYmMDxxO2Quc2V0KHArIi5pbnZhbGlkIiwhcik7Zj1mJiZyO3JldHVybiByP3E6bnVsbH1jb25zdCBkPXRoaXM7bGV0IGY9ITA7Y29uc3QgZz10aGlzLl9zdGF0dXNlcy5maWx0ZXIocD0+cC5hbGxvd2VkKS5tYXAocD0+cC52YWx1ZSk7bGV0IGw9W107dGhpcy5faHBhcmFtcy5mb3JFYWNoKChwLHEpPT57bGV0IHI9e2hwYXJhbTpwLmluZm8ubmFtZX07aWYocC5maWx0ZXIuZG9tYWluRGlzY3JldGUpci5maWx0ZXJEaXNjcmV0ZT0KW10scC5maWx0ZXIuZG9tYWluRGlzY3JldGUuZm9yRWFjaCh0PT57dC5jaGVja2VkJiZyLmZpbHRlckRpc2NyZXRlLnB1c2godC52YWx1ZSl9KTtlbHNlIGlmKHAuZmlsdGVyLmludGVydmFsKXIuZmlsdGVySW50ZXJ2YWw9YSgiX2hwYXJhbXMuIitxKyIuZmlsdGVyLmludGVydmFsIik7ZWxzZSBpZihwLmZpbHRlci5yZWdleHApci5maWx0ZXJSZWdleHA9cC5maWx0ZXIucmVnZXhwO2Vsc2UgcmV0dXJuIGNvbnNvbGUuZXJyb3IoImhwYXJhbS5maWx0ZXIgd2l0aCBubyBkb21haW5EaXNjcmV0ZSwgaW50ZXJ2YWwgb3IgcmVnZXhwIHByb3BlcnRpZXMgc2V0OiAlcyIscCksbnVsbDtsLnB1c2gocil9KTt0aGlzLl9tZXRyaWNzLmZvckVhY2goKHAscSk9PntwPXttZXRyaWM6cC5pbmZvLm5hbWUsZmlsdGVySW50ZXJ2YWw6YSgiX21ldHJpY3MuIitxKyIuZmlsdGVyLmludGVydmFsIil9O2wucHVzaChwKX0pO2lmKHZvaWQgMCE9PXRoaXMuX3NvcnRCeUluZGV4JiZ2b2lkIDAhPT10aGlzLl9zb3J0RGlyZWN0aW9uKXtpZighKHRoaXMuX3NvcnRCeUluZGV4IGluCmwpKXJldHVybiBjb25zb2xlLmVycm9yKCJObyBjb2x1bW4gaW4gY29sUGFyYW1zIHdpdGggaW5kZXggc29ydEJ5SW5kZXg6ICVzIix0aGlzLl9zb3J0QnlJbmRleCksbnVsbDtsW3RoaXMuX3NvcnRCeUluZGV4XS5vcmRlcj0wPT09dGhpcy5fc29ydERpcmVjdGlvbj8iT1JERVJfQVNDIjoiT1JERVJfREVTQyJ9Y29uc3Qgaz1jKCJfcGFnZU51bWJlcklucHV0Iiksbj1jKCJfcGFnZVNpemVJbnB1dCIpO3JldHVybiBmP3tleHBlcmltZW50TmFtZTp0aGlzLmV4cGVyaW1lbnROYW1lLGFsbG93ZWRTdGF0dXNlczpnLGNvbFBhcmFtczpsLHN0YXJ0SW5kZXg6biooay0xKSxzbGljZVNpemU6bn06bnVsbH0sX21ldHJpY1NvcnRCeUluZGV4KGEpe3JldHVybiBhK3RoaXMuX2hwYXJhbXMubGVuZ3RofSxfaHBhcmFtTmFtZTp0Zi5ocGFyYW1zLnV0aWxzLmhwYXJhbU5hbWUsX21ldHJpY05hbWU6dGYuaHBhcmFtcy51dGlscy5tZXRyaWNOYW1lLF9wcmV0dHlQcmludDp0Zi5ocGFyYW1zLnV0aWxzLnByZXR0eVByaW50fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaGVhZGVyLXBhbmVsL3BhcGVyLWhlYWRlci1wYW5lbC5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBhPXtzY3JvbGw6ITB9LGM9e3N0YW5kYXJkOjIsd2F0ZXJmYWxsOjEsIndhdGVyZmFsbC10YWxsIjoxfSxkPXsid2F0ZXJmYWxsLXRhbGwiOiEwfTtQb2x5bWVyKHtpczoicGFwZXItaGVhZGVyLXBhbmVsIixwcm9wZXJ0aWVzOnttb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToic3RhbmRhcmQiLG9ic2VydmVyOiJfbW9kZUNoYW5nZWQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sc2hhZG93Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHRhbGxDbGFzczp7dHlwZTpTdHJpbmcsdmFsdWU6InRhbGwifSxhdFRvcDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLG5vdGlmeTohMCxyZWFkT25seTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxvYnNlcnZlcnM6WyJfY29tcHV0ZURyb3BTaGFkb3dIaWRkZW4oYXRUb3AsIG1vZGUsIHNoYWRvdykiXSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2FkZExpc3RlbmVyKCk7dGhpcy5fa2VlcFNjcm9sbGluZ1N0YXRlKCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVtb3ZlTGlzdGVuZXIoKX0sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxIYW5kbGVyPXRoaXMuX3Njcm9sbC5iaW5kKHRoaXMpO2NvbnNvbGUud2Fybih0aGlzLmlzLCJpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGFwcC1sYXlvdXQgaW5zdGVhZCEiKX0sZ2V0IGhlYWRlcigpe3JldHVybiBQb2x5bWVyLmRvbSh0aGlzLiQuaGVhZGVyU2xvdCkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpWzBdfSxnZXQgc2Nyb2xsZXIoKXtyZXR1cm4gdGhpcy5fZ2V0U2Nyb2xsZXJGb3JNb2RlKHRoaXMubW9kZSl9LGdldCB2aXNpYmxlU2hhZG93KCl7cmV0dXJuIHRoaXMuJC5kcm9wU2hhZG93LmNsYXNzTGlzdC5jb250YWlucygiaGFzLXNoYWRvdyIpfSxfY29tcHV0ZURyb3BTaGFkb3dIaWRkZW46ZnVuY3Rpb24oZixnKXtnPWNbZ107dGhpcy5zaGFkb3c/dGhpcy50b2dnbGVDbGFzcygiaGFzLXNoYWRvdyIsITAsdGhpcy4kLmRyb3BTaGFkb3cpOjI9PT1nP3RoaXMudG9nZ2xlQ2xhc3MoImhhcy1zaGFkb3ciLCEwLHRoaXMuJC5kcm9wU2hhZG93KToKMSE9PWd8fGY/dGhpcy50b2dnbGVDbGFzcygiaGFzLXNoYWRvdyIsITEsdGhpcy4kLmRyb3BTaGFkb3cpOnRoaXMudG9nZ2xlQ2xhc3MoImhhcy1zaGFkb3ciLCEwLHRoaXMuJC5kcm9wU2hhZG93KX0sX2NvbXB1dGVNYWluQ29udGFpbmVyQ2xhc3M6ZnVuY3Rpb24oZil7dmFyIGc9e307Zy5mbGV4PSJjb3ZlciIhPT1mO3JldHVybiBPYmplY3Qua2V5cyhnKS5maWx0ZXIoZnVuY3Rpb24obCl7cmV0dXJuIGdbbF19KS5qb2luKCIgIil9LF9hZGRMaXN0ZW5lcjpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLnNjcm9sbEhhbmRsZXIpfSxfcmVtb3ZlTGlzdGVuZXI6ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdGhpcy5zY3JvbGxIYW5kbGVyKX0sX21vZGVDaGFuZ2VkOmZ1bmN0aW9uKGYsZyl7dmFyIGw9dGhpcy5oZWFkZXI7bCYmKGRbZ10mJiFkW2ZdPyhsLmNsYXNzTGlzdC5yZW1vdmUodGhpcy50YWxsQ2xhc3MpLAp0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7bC5jbGFzc0xpc3QucmVtb3ZlKCJhbmltYXRlIil9LDIwMCkpOnRoaXMudG9nZ2xlQ2xhc3MoImFuaW1hdGUiLGRbZl0sbCkpO3RoaXMuX2tlZXBTY3JvbGxpbmdTdGF0ZSgpfSxfa2VlcFNjcm9sbGluZ1N0YXRlOmZ1bmN0aW9uKCl7dmFyIGY9dGhpcy5zY3JvbGxlcixnPXRoaXMuaGVhZGVyO3RoaXMuX3NldEF0VG9wKDA9PT1mLnNjcm9sbFRvcCk7ZyYmdGhpcy50YWxsQ2xhc3MmJmRbdGhpcy5tb2RlXSYmdGhpcy50b2dnbGVDbGFzcyh0aGlzLnRhbGxDbGFzcyx0aGlzLmF0VG9wfHxnLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLnRhbGxDbGFzcykmJmYuc2Nyb2xsSGVpZ2h0PHRoaXMub2Zmc2V0SGVpZ2h0LGcpfSxfc2Nyb2xsOmZ1bmN0aW9uKCl7dGhpcy5fa2VlcFNjcm9sbGluZ1N0YXRlKCk7dGhpcy5maXJlKCJjb250ZW50LXNjcm9sbCIse3RhcmdldDp0aGlzLnNjcm9sbGVyfSx7YnViYmxlczohMX0pfSxfZ2V0U2Nyb2xsZXJGb3JNb2RlOmZ1bmN0aW9uKGYpe3JldHVybiBhW2ZdPwp0aGlzOnRoaXMuJC5tYWluQ29udGFpbmVyfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10b29sYmFyL3BhcGVyLXRvb2xiYXIuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdG9vbGJhciIsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6InRvb2xiYXIifSxwcm9wZXJ0aWVzOntib3R0b21KdXN0aWZ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sanVzdGlmeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LG1pZGRsZUp1c3RpZnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0scmVhZHk6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4odGhpcy5pcywiaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBhcHAtbGF5b3V0IGluc3RlYWQhIil9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXI9dGhpcy5fb2JzZXJ2ZSh0aGlzKTt0aGlzLl91cGRhdGVBcmlhTGFiZWxsZWRCeSgpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiZ0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCl9LF9vYnNlcnZlOmZ1bmN0aW9uKGEpe3ZhciBjPW5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQXJpYUxhYmVsbGVkQnkoKX0uYmluZCh0aGlzKSk7CmMub2JzZXJ2ZShhLHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pO3JldHVybiBjfSxfdXBkYXRlQXJpYUxhYmVsbGVkQnk6ZnVuY3Rpb24oKXtQb2x5bWVyLmRvbS5mbHVzaCgpO2Zvcih2YXIgYT1bXSxjPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKFBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvckFsbCgic2xvdCIpKS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoUG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJjb250ZW50IikpKSxkLGY9MDtkPWNbZl07ZisrKXtkPVBvbHltZXIuZG9tKGQpLmdldERpc3RyaWJ1dGVkTm9kZXMoKTtmb3IodmFyIGcsbD0wO2c9ZFtsXTtsKyspaWYoZy5jbGFzc0xpc3QmJmcuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0aXRsZSIpKWlmKGcuaWQpYS5wdXNoKGcuaWQpO2Vsc2V7dmFyIGs9InBhcGVyLXRvb2xiYXItbGFiZWwtIitNYXRoLmZsb29yKDFFNCpNYXRoLnJhbmRvbSgpKTtnLmlkPWs7YS5wdXNoKGspfX0wPAphLmxlbmd0aCYmdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsYS5qb2luKCIgIikpfSxfY29tcHV0ZUJhckV4dHJhQ2xhc3NlczpmdW5jdGlvbihhKXtyZXR1cm4gYT9hKygianVzdGlmaWVkIj09PWE/IiI6Ii1qdXN0aWZpZWQiKToiIn19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scy90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scyIscHJvcGVydGllczp7Y29uZmlndXJhdGlvbjpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheSxvcHRpb25zOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9jb25maWd1cmF0aW9uQ2hhbmdlZChjb25maWd1cmF0aW9uLiopIiwiX3Vuc2VsZWN0RGlzYWJsZWRMb2dTY2FsZXMoc2Vzc2lvbkdyb3Vwcy4qKSJdLF9jb25maWd1cmF0aW9uQ2hhbmdlZCgpe2NvbnN0IGE9dGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEsYz10aGlzLmNvbmZpZ3VyYXRpb24uc2NoZW1hLGQ9e2NvbHVtbnM6YS5ocGFyYW1JbmZvcy5tYXAoKGYsZyk9Pih7bmFtZTp0Zi5ocGFyYW1zLnV0aWxzLmhwYXJhbU5hbWUoZiksaW5kZXg6ZyxhYnNvbHV0ZUluZGV4OnRmLmhwYXJhbXMudXRpbHMuZ2V0QWJzb2x1dGVDb2x1bW5JbmRleChjLGEsZyksc2NhbGU6dGhpcy5faXNOdW1lcmljQ29sdW1uKGcpPwoiTElORUFSIjoiTk9OX05VTUVSSUMifSkpLmNvbmNhdChhLm1ldHJpY0luZm9zLm1hcCgoZixnKT0+e2crPWEuaHBhcmFtSW5mb3MubGVuZ3RoO3JldHVybntzY2FsZToiTElORUFSIixuYW1lOnRmLmhwYXJhbXMudXRpbHMubWV0cmljTmFtZShmKSxpbmRleDpnLGFic29sdXRlSW5kZXg6dGYuaHBhcmFtcy51dGlscy5nZXRBYnNvbHV0ZUNvbHVtbkluZGV4KGMsYSxnKX19KSksbWluQ29sb3I6IiMwMDAwRkYiLG1heENvbG9yOiIjRkYwMDAwIixjb25maWd1cmF0aW9uOnRoaXMuY29uZmlndXJhdGlvbn07dGhpcy5zZXQoIm9wdGlvbnMiLGQpO1BvbHltZXIuZG9tLmZsdXNoKCk7dGhpcy5zZXQoIm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4Iix0aGlzLl9kZWZhdWx0Q29sb3JCeUNvbHVtbkluZGV4KCkpfSxfdW5zZWxlY3REaXNhYmxlZExvZ1NjYWxlcygpe251bGwhPT10aGlzLm9wdGlvbnMmJnRoaXMub3B0aW9ucy5jb2x1bW5zLmZvckVhY2goYT0+e2NvbnN0IGM9Im9wdGlvbnMuY29sdW1ucy4iKwphLmluZGV4O3RoaXMuX2FsbG93TG9nU2NhbGUoYSl8fCJMT0ciIT09YS5zY2FsZXx8dGhpcy5zZXQoYysiLnNjYWxlIiwiTElORUFSIil9KX0sX2FsbG93TG9nU2NhbGUoYSl7aWYoIXRoaXMuX2lzTnVtZXJpY0NvbHVtbihhLmluZGV4KXx8IXRoaXMuc2Vzc2lvbkdyb3VwcylyZXR1cm4hMTtjb25zdCBbYyxkXT10Zi5ocGFyYW1zLnV0aWxzLnZpc2libGVOdW1lcmljQ29sdW1uRXh0ZW50KHRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLHRoaXMuc2Vzc2lvbkdyb3VwcyxhLmluZGV4KTtyZXR1cm4gMDxjfHwwPmR9LF9pc051bWVyaWNDb2x1bW4oYSl7cmV0dXJuIGE+PXRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zLmxlbmd0aHx8IkRBVEFfVFlQRV9GTE9BVDY0Ij09PXRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zW2FdLnR5cGV9LF9kZWZhdWx0Q29sb3JCeUNvbHVtbkluZGV4KCl7aWYoMDx0aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvcy5sZW5ndGgpcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zLmxlbmd0aDsKY29uc3QgYT10aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvcy5maW5kSW5kZXgoYz0+IkRBVEFfVFlQRV9GTE9BVDY0Ij09PWMudHlwZSk7aWYoLTEhPT1hKXJldHVybiBhfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWFjdGl2ZS1pdGVtLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkFjdGl2ZUl0ZW1CZWhhdmlvcj17cHJvcGVydGllczp7YWN0aXZlSXRlbTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHZhbHVlOm51bGx9fSxsaXN0ZW5lcnM6eyJjZWxsLWFjdGl2YXRlIjoiX2FjdGl2YXRlSXRlbSJ9LG9ic2VydmVyczpbIl9hY3RpdmVJdGVtQ2hhbmdlZChhY3RpdmVJdGVtKSJdLF9hY3RpdmF0ZUl0ZW06ZnVuY3Rpb24oYSl7dmFyIGM9YS5kZXRhaWwubW9kZWwuaXRlbTt0aGlzLmFjdGl2ZUl0ZW09dGhpcy5hY3RpdmVJdGVtIT09Yz9jOm51bGw7YS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX0sX2FjdGl2ZUl0ZW1DaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEl0ZW1zJiZ0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMuZm9yRWFjaChmdW5jdGlvbihhKXt0aGlzLl91cGRhdGVJdGVtKGEsYS5pdGVtKX0uYmluZCh0aGlzKSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC10YWJsZS1zY3JvbGwtYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVTY3JvbGxCZWhhdmlvckltcGw9e3Byb3BlcnRpZXM6e192aWR4T2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZTowfSxpb3M6e3R5cGU6Qm9vbGVhbix2YWx1ZTpuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OmhvbmV8YWQ7KD86IFU7KT8gQ1BVKSBPUyAoXGQrKS8pLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sZml4ZWRTZWN0aW9uczp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxjb21wdXRlZDoiX2hhc0ZpeGVkU2VjdGlvbnMoc2Nyb2xsYmFyV2lkdGgpIn0sX2Zyb3plbkNlbGxzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxzY3JvbGxpbmc6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsVGFyZ2V0PXRoaXMuJC50YWJsZX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLmxpc3Rlbih0aGlzLnNjcm9sbFRhcmdldCwid2hlZWwiLAoiX29uV2hlZWwiKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnVubGlzdGVuKHRoaXMuc2Nyb2xsVGFyZ2V0LCJ3aGVlbCIsIl9vbldoZWVsIil9LHNjcm9sbFRvU2NhbGVkSW5kZXg6ZnVuY3Rpb24oYSl7dGhpcy5fcGVuZGluZ1Njcm9sbFRvU2NhbGVkSW5kZXg9bnVsbDt0aGlzLiQuaXRlbXMuc3R5bGUuYm9yZGVyVG9wV2lkdGh8fCh0aGlzLl9wZW5kaW5nU2Nyb2xsVG9TY2FsZWRJbmRleD1hKTthPU1hdGgubWluKE1hdGgubWF4KGEsMCksdGhpcy5zaXplLTEpO3RoaXMuJC50YWJsZS5zY3JvbGxUb3A9YS90aGlzLnNpemUqdGhpcy4kLnRhYmxlLnNjcm9sbEhlaWdodDt0aGlzLl9zY3JvbGxIYW5kbGVyKCk7dGhpcy5zY3JvbGxUb0luZGV4KGEtdGhpcy5fdmlkeE9mZnNldCk7dGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbih0aGlzLl9zY3JvbGxQb3NpdGlvbik7dGhpcy5fc2Nyb2xsSGFuZGxlcigpO3RoaXMuX3ZpZHhPZmZzZXQrdGhpcy5sYXN0VmlzaWJsZUluZGV4PT09dGhpcy5zaXplLQoxJiYodGhpcy4kLnRhYmxlLnNjcm9sbFRvcD10aGlzLiQudGFibGUuc2Nyb2xsSGVpZ2h0LXRoaXMuJC50YWJsZS5vZmZzZXRIZWlnaHQsdGhpcy5fc2Nyb2xsSGFuZGxlcigpKX0sX2hhc0ZpeGVkU2VjdGlvbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0VkZ2UvKSYmMD09PWF9LF9vbldoZWVsOmZ1bmN0aW9uKGEpe2lmKCFhLmN0cmxLZXkmJiF0aGlzLl9oYXNTY3JvbGxlZEFuY2VzdG9yKGEudGFyZ2V0LGEuZGVsdGFYLGEuZGVsdGFZKSl7dmFyIGM9dGhpcy4kLnRhYmxlLGQ9YS5kZWx0YVk7MT09PWEuZGVsdGFNb2RlJiYoZCo9Z3JpZC4kLnNjcm9sbGVyLl9waHlzaWNhbEF2ZXJhZ2UpO3ZhciBmPU1hdGguYWJzKGEuZGVsdGFYKStNYXRoLmFicyhkKTt0aGlzLl9jYW5TY3JvbGwoYyxhLmRlbHRhWCxkKT8oYS5wcmV2ZW50RGVmYXVsdCgpLGMuc2Nyb2xsVG9wKz1kLGMuc2Nyb2xsTGVmdCs9YS5kZWx0YVgsdGhpcy5fc2Nyb2xsSGFuZGxlcigpLAp0aGlzLl9oYXNSZXNpZHVhbE1vbWVudHVtPSEwLHRoaXMuX2lnbm9yZU5ld1doZWVsPXRoaXMuZGVib3VuY2UoImlnbm9yZS1uZXctd2hlZWwiLGZ1bmN0aW9uKCl7dGhpcy5faWdub3JlTmV3V2hlZWw9bnVsbH0sNTAwKSk6dGhpcy5faGFzUmVzaWR1YWxNb21lbnR1bSYmZjw9dGhpcy5fcHJldmlvdXNNb21lbnR1bXx8dGhpcy5faWdub3JlTmV3V2hlZWw/YS5wcmV2ZW50RGVmYXVsdCgpOmY+dGhpcy5fcHJldmlvdXNNb21lbnR1bSYmKHRoaXMuX2hhc1Jlc2lkdWFsTW9tZW50dW09ITEpO3RoaXMuX3ByZXZpb3VzTW9tZW50dW09Zn19LF9oYXNTY3JvbGxlZEFuY2VzdG9yOmZ1bmN0aW9uKGEsYyxkKXtpZih0aGlzLl9jYW5TY3JvbGwoYSxjLGQpKXJldHVybiEwO2lmKCJ2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQiIT09YS5sb2NhbE5hbWUmJmEhPT10aGlzJiZhLnBhcmVudEVsZW1lbnQpcmV0dXJuIHRoaXMuX2hhc1Njcm9sbGVkQW5jZXN0b3IoYS5wYXJlbnRFbGVtZW50LGMsZCl9LApfY2FuU2Nyb2xsOmZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gMDxkJiZhLnNjcm9sbFRvcDxhLnNjcm9sbEhlaWdodC1hLm9mZnNldEhlaWdodHx8MD5kJiYwPGEuc2Nyb2xsVG9wfHwwPGMmJmEuc2Nyb2xsTGVmdDxhLnNjcm9sbFdpZHRoLWEub2Zmc2V0V2lkdGh8fDA+YyYmMDxhLnNjcm9sbExlZnR9LF9zY3JvbGxIYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIGE9TWF0aC5tYXgoMCxNYXRoLm1pbih0aGlzLl9tYXhTY3JvbGxUb3AsdGhpcy5fc2Nyb2xsVG9wKSksYz1hLXRoaXMuX3Njcm9sbFBvc2l0aW9uLGQ9dGhpcy5fcmF0aW8sZj0wLGc9dGhpcy5faGlkZGVuQ29udGVudFNpemUsbD1kLGs9W107dGhpcy5fc2Nyb2xsUG9zaXRpb249YTt0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPW51bGw7dmFyIG49dGhpcy5fc2Nyb2xsQm90dG9tO3ZhciBwPXRoaXMuX3BoeXNpY2FsQm90dG9tO2lmKE1hdGguYWJzKGMpPnRoaXMuX3BoeXNpY2FsU2l6ZSl0aGlzLl9waHlzaWNhbFRvcCs9CmMsZj1NYXRoLnJvdW5kKGMvdGhpcy5fcGh5c2ljYWxBdmVyYWdlKTtlbHNlIGlmKDA+Yyl7dmFyIHE9YS10aGlzLl9waHlzaWNhbFRvcDtrPXRoaXMuX3ZpcnR1YWxTdGFydDt2YXIgcj1bXTt2YXIgdD10aGlzLl9waHlzaWNhbEVuZDtmb3IobD1xL2c7bDxkJiZmPHRoaXMuX3BoeXNpY2FsQ291bnQmJjA8ay1mJiZwLXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudCh0KT5uOylxPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudCh0KSxsKz1xL2cscC09cSxyLnB1c2godCksZisrLHQ9MD09PXQ/dGhpcy5fcGh5c2ljYWxDb3VudC0xOnQtMTtrPXI7Zj0tZn1lbHNlIGlmKDA8Yyl7dmFyIHY9dGhpcy5fdmlydHVhbEVuZCx5PXRoaXMuX3ZpcnR1YWxDb3VudC0xO3I9W107dD10aGlzLl9waHlzaWNhbFN0YXJ0O2ZvcihsPShwLW4pL2c7bDxkJiZmPHRoaXMuX3BoeXNpY2FsQ291bnQmJnYrZjx5JiZ0aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQodCk8CmE7KXE9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KHQpLGwrPXEvZyx0aGlzLl9waHlzaWNhbFRvcCs9cSxyLnB1c2godCksZisrLHQ9KHQrMSkldGhpcy5fcGh5c2ljYWxDb3VudH10aGlzLl92aXJ0dWFsQ291bnQ8dGhpcy5zaXplJiZ0aGlzLl9hZGp1c3RWaXJ0dWFsSW5kZXhPZmZzZXQoYyk7MD09PWY/KHA8bnx8dGhpcy5fcGh5c2ljYWxUb3A+YSkmJnRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKCk6KHRoaXMuX3ZpcnR1YWxTdGFydCs9Zix0aGlzLl9waHlzaWNhbFN0YXJ0Kz1mLHRoaXMuX3VwZGF0ZShyLGspKTt0aGlzLl90cmFuc2xhdGVTdGF0aW9uYXJ5RWxlbWVudHMoKTt0aGlzLmhhc0F0dHJpYnV0ZSgicmVvcmRlcmluZyIpfHwodGhpcy5zY3JvbGxpbmc9ITApO3RoaXMuZGVib3VuY2UoInZhYWRpbi1ncmlkLXNjcm9sbGluZyIsZnVuY3Rpb24oKXt0aGlzLnNjcm9sbGluZz0hMTt0aGlzLl9yZW9yZGVyUm93cygpfSwxMDApfSxfYWRqdXN0VmlydHVhbEluZGV4T2Zmc2V0OmZ1bmN0aW9uKGEpe2lmKDFFNDwKTWF0aC5hYnMoYSkpdGhpcy5fbm9TY2FsZT90aGlzLl9ub1NjYWxlPSExOihhPU1hdGgucm91bmQodGhpcy5fc2Nyb2xsUG9zaXRpb24vdGhpcy5fc2Nyb2xsSGVpZ2h0KjFFMykvMUUzLHRoaXMuX3ZpZHhPZmZzZXQ9TWF0aC5yb3VuZChhKnRoaXMuc2l6ZS1hKnRoaXMuX3ZpcnR1YWxDb3VudCksMD09PXRoaXMuX3Njcm9sbFRvcCYmdGhpcy5zY3JvbGxUb0luZGV4KDApKTtlbHNle2E9dGhpcy5fdmlkeE9mZnNldHx8MDswPT09dGhpcy5fc2Nyb2xsVG9wPyh0aGlzLl92aWR4T2Zmc2V0PTAsYSE9PXRoaXMuX3ZpZHhPZmZzZXQmJnRoaXMuc2Nyb2xsVG9JbmRleCgwKSk6MUUzPnRoaXMuZmlyc3RWaXNpYmxlSW5kZXgmJjA8dGhpcy5fdmlkeE9mZnNldCYmKHRoaXMuX3ZpZHhPZmZzZXQtPU1hdGgubWluKHRoaXMuX3ZpZHhPZmZzZXQsMTAwKSx0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5maXJzdFZpc2libGVJbmRleCsoYS10aGlzLl92aWR4T2Zmc2V0KSsxKSx0aGlzLl9ub1NjYWxlPQohMCk7dmFyIGM9dGhpcy5zaXplLXRoaXMuX3ZpcnR1YWxDb3VudDt0aGlzLl9zY3JvbGxUb3A+PXRoaXMuX21heFNjcm9sbFRvcD8odGhpcy5fdmlkeE9mZnNldD1jLGEhPT10aGlzLl92aWR4T2Zmc2V0JiZ0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5fdmlydHVhbENvdW50KSk6dGhpcy5maXJzdFZpc2libGVJbmRleD50aGlzLl92aXJ0dWFsQ291bnQtMUUzJiZ0aGlzLl92aWR4T2Zmc2V0PGMmJih0aGlzLl92aWR4T2Zmc2V0Kz1NYXRoLm1pbihjLXRoaXMuX3ZpZHhPZmZzZXQsMTAwKSx0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5maXJzdFZpc2libGVJbmRleC0odGhpcy5fdmlkeE9mZnNldC1hKSksdGhpcy5fbm9TY2FsZT0hMCl9fSxfcmVvcmRlclJvd3M6ZnVuY3Rpb24oKXt2YXIgYT1Qb2x5bWVyLmRvbSh0aGlzLiQuaXRlbXMpLGM9YS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtcm93IiksZD1jLmxlbmd0aC0oY1swXS5pbmRleC0odGhpcy5fdmlydHVhbFN0YXJ0K3RoaXMuX3ZpZHhPZmZzZXQpKTsKaWYoZDxjLmxlbmd0aC8yKWZvcih2YXIgZj0wO2Y8ZDtmKyspYS5hcHBlbmRDaGlsZChjW2ZdKTtlbHNlIGZvcig7ZDxjLmxlbmd0aDtkKyspYS5pbnNlcnRCZWZvcmUoY1tkXSxjWzBdKX0sX2Zyb3plbkNlbGxzQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZGVib3VuY2UoImNhY2hlLWVsZW1lbnRzIixmdW5jdGlvbigpe1BvbHltZXIuZG9tKHRoaXMuZG9tSG9zdC5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtY2VsbCIpLmZvckVhY2goZnVuY3Rpb24oYSl7YS5zdHlsZS50cmFuc2Zvcm09IiJ9KTt0aGlzLl9mcm96ZW5DZWxscz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChQb2x5bWVyLmRvbSh0aGlzLmRvbUhvc3Qucm9vdCkucXVlcnlTZWxlY3RvckFsbCgiW2Zyb3plbl0iKSk7dGhpcy5fdHJhbnNsYXRlU3RhdGlvbmFyeUVsZW1lbnRzKCl9KTt0aGlzLl91cGRhdGVMYXN0RnJvemVuKCl9LF91cGRhdGVMYXN0RnJvemVuOmZ1bmN0aW9uKCl7aWYodGhpcy5jb2x1bW5UcmVlKXt2YXIgYT0KdGhpcy5jb2x1bW5UcmVlW3RoaXMuY29sdW1uVHJlZS5sZW5ndGgtMV0uc2xpY2UoMCk7YS5zb3J0KGZ1bmN0aW9uKGQsZil7cmV0dXJuIGQuX29yZGVyLWYuX29yZGVyfSk7dmFyIGM9YS5yZWR1Y2UoZnVuY3Rpb24oZCxmLGcpe2YuX2xhc3RGcm96ZW49ITE7cmV0dXJuIGYuZnJvemVuJiYhZi5oaWRkZW4/ZzpkfSx2b2lkIDApO3ZvaWQgMCE9PWMmJihhW2NdLl9sYXN0RnJvemVuPSEwKX19LF90cmFuc2xhdGVTdGF0aW9uYXJ5RWxlbWVudHM6ZnVuY3Rpb24oKXt0aGlzLmZpeGVkU2VjdGlvbnM/KHRoaXMuJC5pdGVtcy5zdHlsZS50cmFuc2Zvcm09dGhpcy5fZ2V0VHJhbnNsYXRlKC10aGlzLl9zY3JvbGxMZWZ0fHwwLC10aGlzLl9zY3JvbGxUb3B8fDApLHRoaXMuJC5mb290ZXIuc3R5bGUudHJhbnNmb3JtPXRoaXMuJC5oZWFkZXIuc3R5bGUudHJhbnNmb3JtPXRoaXMuX2dldFRyYW5zbGF0ZSgtdGhpcy5fc2Nyb2xsTGVmdHx8MCwwKSk6dGhpcy4kLmZvb3Rlci5zdHlsZS50cmFuc2Zvcm09CnRoaXMuJC5oZWFkZXIuc3R5bGUudHJhbnNmb3JtPXRoaXMuX2dldFRyYW5zbGF0ZSgwLHRoaXMuX3Njcm9sbFRvcCk7Zm9yKHZhciBhPXRoaXMuX2dldFRyYW5zbGF0ZSh0aGlzLl9zY3JvbGxMZWZ0LDApLGM9MDtjPHRoaXMuX2Zyb3plbkNlbGxzLmxlbmd0aDtjKyspdGhpcy5fZnJvemVuQ2VsbHNbY10uc3R5bGUudHJhbnNmb3JtPWF9LF9nZXRUcmFuc2xhdGU6ZnVuY3Rpb24oYSxjKXtyZXR1cm4idHJhbnNsYXRlKCIrYSsicHgsIitjKyJweCkifX07dmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVTY3JvbGxCZWhhdmlvcj1bUG9seW1lci5Jcm9uU2Nyb2xsVGFyZ2V0QmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVTY3JvbGxCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWNlbGwtY2xpY2stYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuQ2VsbENsaWNrQmVoYXZpb3I9e2xpc3RlbmVyczp7Y2xpY2s6Il9vbkNsaWNrIn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9jZWxsQ29udGVudEZvY3VzSGFuZGxlcj1mdW5jdGlvbihhKXthLnRhcmdldCE9PXRoaXMuX2NlbGxDb250ZW50JiZ0aGlzLmZpcmUoImNlbGwtY29udGVudC1mb2N1cyIse2NlbGw6dGhpc30pfS5iaW5kKHRoaXMpO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2NlbGxDb250ZW50Rm9jdXNIYW5kbGVyLCEwKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9jZWxsQ29udGVudEZvY3VzSGFuZGxlciwhMCl9LF9vbkNsaWNrOmZ1bmN0aW9uKGEpeyJ2YWFkaW4tZ3JpZC1zb3J0ZXIiIT09dGhpcy5sb2NhbE5hbWUmJnRoaXMuZmlyZSgiY2VsbC1mb2N1cyIse2NlbGw6dGhpc30pO2lmKHRoaXMuX2NlbGxDbGljayl7dmFyIGM9UG9seW1lci5kb20oYSkubG9jYWxUYXJnZXQ7CmMuZ2V0RGlzdHJpYnV0ZWROb2RlcyYmKGM9UG9seW1lci5kb20oYykuZ2V0RGlzdHJpYnV0ZWROb2RlcygpWzBdKTt2YXIgZD1Qb2x5bWVyLmRvbShhKS5wYXRoO2Q9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZCwwLGQuaW5kZXhPZihjKSsxKTtjLmNvbnRhaW5zKHRoaXMudGFyZ2V0JiZ0aGlzLnRhcmdldC5yb290LmFjdGl2ZUVsZW1lbnR8fGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpfHxkLnNvbWUodGhpcy5faXNGb2N1c2FibGUpfHx0aGlzLl9jZWxsQ2xpY2soYSl9fSxfaXNGb2N1c2FibGU6ZnVuY3Rpb24oYSl7dmFyIGM9UG9seW1lci5kb20oYSkucGFyZW50Tm9kZTtjPS0xIT09QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChQb2x5bWVyLmRvbShjKS5xdWVyeVNlbGVjdG9yQWxsKCJbdGFiaW5kZXhdLCBidXR0b24sIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBvYmplY3QsIGlmcmFtZSwgbGFiZWwsIGFbaHJlZl0sIGFyZWFbaHJlZl0iKSxhKTtyZXR1cm4hYS5kaXNhYmxlZCYmCmN9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC10YWJsZS1jZWxsLmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGE9e3Byb3BlcnRpZXM6e2NvbHVtbjpPYmplY3QsZXhwYW5kZWQ6Qm9vbGVhbixmbGV4R3JvdzpOdW1iZXIsY29sU3BhbjpOdW1iZXIsZm9jdXNlZDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sZnJvemVuOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSxsYXN0RnJvemVuOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSxoaWRkZW46e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGluc3RhbmNlOk9iamVjdCxpbmRleDpOdW1iZXIsaXRlbTpPYmplY3Qsc2VsZWN0ZWQ6Qm9vbGVhbix0ZW1wbGF0ZTpPYmplY3QsdGFyZ2V0Ok9iamVjdCx3aWR0aDpTdHJpbmcsb3JkZXI6TnVtYmVyLHJlb3JkZXJTdGF0dXM6e3R5cGU6U3RyaW5nLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX2NoaWxkQ29sdW1uczpBcnJheSxfY2VsbENvbnRlbnQ6T2JqZWN0LF9pbnNlcnRpb25Qb2ludDpPYmplY3QsCl90ZW1wbGF0aXplcjpPYmplY3R9LG9ic2VydmVyczoiX2NvbHVtbkNoYW5nZWQoY29sdW1uKTtfY2VsbEF0dGFjaGVkKGNvbHVtbiwgaXNBdHRhY2hlZCk7X2V4cGFuZGVkQ2hhbmdlZChleHBhbmRlZCwgaW5zdGFuY2UpO19mbGV4R3Jvd0NoYW5nZWQoZmxleEdyb3cpO19pbmRleENoYW5nZWQoaW5kZXgsIGluc3RhbmNlKTtfaXRlbUNoYW5nZWQoaXRlbSwgaW5zdGFuY2UpO19pbnN0YW5jZUNoYW5nZWQoaW5zdGFuY2UsIHRhcmdldCk7X3NlbGVjdGVkQ2hhbmdlZChzZWxlY3RlZCwgaW5zdGFuY2UpO190b2dnbGVDb250ZW50KGlzQXR0YWNoZWQsIF9jZWxsQ29udGVudCwgX2luc2VydGlvblBvaW50KTtfdG9nZ2xlSW5zdGFuY2UoaXNBdHRhY2hlZCwgX3RlbXBsYXRpemVyLCBpbnN0YW5jZSk7X3dpZHRoQ2hhbmdlZCh3aWR0aCk7X29yZGVyQ2hhbmdlZChvcmRlcik7X3Zpc2libGVDaGlsZENvbHVtbnNDaGFuZ2VkKF92aXNpYmxlQ2hpbGRDb2x1bW5zKTtfY2hpbGRDb2x1bW5zQ2hhbmdlZChfY2hpbGRDb2x1bW5zKSIuc3BsaXQoIjsiKSwKcmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmNsYXNzTGlzdC5hZGQoInZhYWRpbi1ncmlkLWNlbGwiKTshMT09PVBvbHltZXIuU2V0dGluZ3MudXNlU2hhZG93JiYodGhpcy5jbGFzc0xpc3QuYWRkKCJzdHlsZS1zY29wZSIpLHRoaXMuY2xhc3NMaXN0LmFkZCgidmFhZGluLWdyaWQiKSl9LF9jb2x1bW5DaGFuZ2VkOmZ1bmN0aW9uKGMpe3RoaXMuZmxleEdyb3c9Yy5mbGV4R3Jvdzt0aGlzLmZyb3plbj1jLmZyb3plbjt0aGlzLmxhc3RGcm96ZW49Yy5fbGFzdEZyb3plbjt0aGlzLmhlYWRlclRlbXBsYXRlPWMuaGVhZGVyVGVtcGxhdGU7dGhpcy5mb290ZXJUZW1wbGF0ZT1jLmZvb3RlclRlbXBsYXRlO3RoaXMudGVtcGxhdGU9Yy50ZW1wbGF0ZTt0aGlzLndpZHRoPWMud2lkdGg7dGhpcy5oaWRkZW49Yy5oaWRkZW47dGhpcy5yZXNpemFibGU9Yy5yZXNpemFibGU7dGhpcy5fY2hpbGRDb2x1bW5zPWMuX2NoaWxkQ29sdW1uczt0aGlzLm9yZGVyPWMuX29yZGVyO2MuY29sU3BhbiYmKHRoaXMuY29sU3Bhbj0KYy5jb2xTcGFuKTt0aGlzLmxpc3RlbihjLCJwcm9wZXJ0eS1jaGFuZ2VkIiwiX2NvbHVtblByb3BDaGFuZ2VkIil9LF9jZWxsQXR0YWNoZWQ6ZnVuY3Rpb24oYyxkKXt2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kJiYoZD90aGlzLmxpc3RlbihjLCJwcm9wZXJ0eS1jaGFuZ2VkIiwiX2NvbHVtblByb3BDaGFuZ2VkIik6dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuaXNBdHRhY2hlZHx8dGhpcy51bmxpc3RlbihjLCJwcm9wZXJ0eS1jaGFuZ2VkIiwiX2NvbHVtblByb3BDaGFuZ2VkIil9KSl9LF9jb2x1bW5Qcm9wQ2hhbmdlZDpmdW5jdGlvbihjKXtjLnRhcmdldD09dGhpcy5jb2x1bW4mJih0aGlzW2MuZGV0YWlsLnBhdGhdPWMuZGV0YWlsLnZhbHVlKX0sX2V4cGFuZGVkQ2hhbmdlZDpmdW5jdGlvbihjLGQpe3ZvaWQgMCE9PWMmJnZvaWQgMCE9PWQmJihkLl9fZXhwYW5kZWRfXz1jLGQuZXhwYW5kZWQ9Yyl9LF9mbGV4R3Jvd0NoYW5nZWQ6ZnVuY3Rpb24oYyl7dGhpcy5zdHlsZS5mbGV4R3Jvdz0KY30sX2luZGV4Q2hhbmdlZDpmdW5jdGlvbihjLGQpe3ZvaWQgMCE9PWMmJnZvaWQgMCE9PWQmJihkLmluZGV4PWMpfSxfaXRlbUNoYW5nZWQ6ZnVuY3Rpb24oYyxkKXt2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kJiYoZC5pdGVtPWMpfSxfc2VsZWN0ZWRDaGFuZ2VkOmZ1bmN0aW9uKGMsZCl7dm9pZCAwIT09YyYmdm9pZCAwIT09ZCYmKGQuX19zZWxlY3RlZF9fPWMsZC5zZWxlY3RlZD1jKX0sX2NoaWxkQ29sdW1uc0NoYW5nZWQ6ZnVuY3Rpb24oYyl7dGhpcy5jb2xTcGFuPWMubGVuZ3RofSxfdG9nZ2xlQ29udGVudDpmdW5jdGlvbihjLGQsZil7dm9pZCAwIT09YyYmdm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKGM/KFBvbHltZXIuZG9tKGQpLnBhcmVudE5vZGUhPT10aGlzLnRhcmdldCYmUG9seW1lci5kb20odGhpcy50YXJnZXQpLmFwcGVuZENoaWxkKGQpLFBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGYpKTp0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5pc0F0dGFjaGVkfHxQb2x5bWVyLmRvbShkKS5wYXJlbnROb2RlIT09CnRoaXMudGFyZ2V0fHxQb2x5bWVyLmRvbSh0aGlzLnRhcmdldCkucmVtb3ZlQ2hpbGQoZCl9KSl9LF90b2dnbGVJbnN0YW5jZTpmdW5jdGlvbihjLGQsZil7dm9pZCAwIT09YyYmdm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKGM/ZC5hZGRJbnN0YW5jZShmKTpkLnJlbW92ZUluc3RhbmNlKGYpKX0sX3dpZHRoQ2hhbmdlZDpmdW5jdGlvbihjKXt0aGlzLnN0eWxlLndpZHRoPWN9LF9vcmRlckNoYW5nZWQ6ZnVuY3Rpb24oYyl7dGhpcy5zdHlsZS5vcmRlcj1jfSxfdGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGMpe3RoaXMuaW5zdGFuY2U9Yy50ZW1wbGF0aXplci5jcmVhdGVJbnN0YW5jZSgpO3RoaXMuX3RlbXBsYXRpemVyPWMudGVtcGxhdGl6ZXJ9LF9pbnN0YW5jZUNoYW5nZWQ6ZnVuY3Rpb24oYyxkKXt2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kJiYodGhpcy5zdHlsZS5oZWlnaHQ9IiIsdGhpcy5fY2VsbENvbnRlbnQ9dGhpcy5fY2VsbENvbnRlbnR8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLWNlbGwtY29udGVudCIpLApjPSJ2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQtIisodmFhZGluLmVsZW1lbnRzLmdyaWQuX2NvbnRlbnRJbmRleD12YWFkaW4uZWxlbWVudHMuZ3JpZC5fY29udGVudEluZGV4KzF8fDApLHRoaXMuX2NlbGxDb250ZW50LmlubmVySFRNTD0iIixQb2x5bWVyLmRvbSh0aGlzLl9jZWxsQ29udGVudCkuYXBwZW5kQ2hpbGQodGhpcy5pbnN0YW5jZS5yb290KSx0aGlzLl9jZWxsQ29udGVudC5zZXRBdHRyaWJ1dGUoImlkIixjKSxQb2x5bWVyLkVsZW1lbnQ/KHRoaXMuX2NlbGxDb250ZW50LnNldEF0dHJpYnV0ZSgic2xvdCIsYyksdGhpcy5faW5zZXJ0aW9uUG9pbnQ9dGhpcy5faW5zZXJ0aW9uUG9pbnR8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNsb3QiKSx0aGlzLl9pbnNlcnRpb25Qb2ludC5zZXRBdHRyaWJ1dGUoIm5hbWUiLGMpKToodGhpcy5faW5zZXJ0aW9uUG9pbnQ9dGhpcy5faW5zZXJ0aW9uUG9pbnR8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNvbnRlbnQiKSx0aGlzLl9pbnNlcnRpb25Qb2ludC5zZXRBdHRyaWJ1dGUoInNlbGVjdCIsCiIjIitjKSkpfX07UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLWNlbGwiLGJlaGF2aW9yczpbYSx2YWFkaW4uZWxlbWVudHMuZ3JpZC5DZWxsQ2xpY2tCZWhhdmlvcl0sb2JzZXJ2ZXJzOlsiX3RlbXBsYXRlQ2hhbmdlZCh0ZW1wbGF0ZSkiXSxfY2VsbENsaWNrOmZ1bmN0aW9uKGMpe2MuZGVmYXVsdFByZXZlbnRlZHx8dGhpcy5maXJlKCJjZWxsLWFjdGl2YXRlIix7bW9kZWw6dGhpcy5pbnN0YW5jZX0pfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXItY2VsbCIscHJvcGVydGllczp7aGVhZGVyVGVtcGxhdGU6T2JqZWN0LHJlc2l6YWJsZTpCb29sZWFuLGNvbHVtblJlc2l6aW5nOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfX0sYmVoYXZpb3JzOlthLHZhYWRpbi5lbGVtZW50cy5ncmlkLkNlbGxDbGlja0JlaGF2aW9yXSxvYnNlcnZlcnM6WyJfaGVhZGVyVGVtcGxhdGVDaGFuZ2VkKGhlYWRlclRlbXBsYXRlKSIsIl9pc0VtcHR5Q2hhbmdlZChfaXNFbXB0eSwgaXNBdHRhY2hlZCkiLAoiX3Jlc2l6YWJsZUNoYW5nZWQocmVzaXphYmxlKSJdLGxpc3RlbmVyczp7bW91c2Vkb3duOiJfY2FuY2VsTW91c2VEb3duT25SZXNpemUiLG1vdXNlbW92ZToiX2VuYWJsZURyYWciLG1vdXNlb3V0OiJfZGlzYWJsZURyYWciLHRvdWNoc3RhcnQ6Il9vblRvdWNoU3RhcnQiLHRvdWNobW92ZToiX29uVG91Y2hNb3ZlIix0b3VjaGVuZDoiX29uVG91Y2hFbmQiLGNvbnRleHRtZW51OiJfb25Db250ZXh0TWVudSJ9LF9vbkNvbnRleHRNZW51OmZ1bmN0aW9uKGMpe3RoaXMuX3Jlb3JkZXJHaG9zdCYmYy5wcmV2ZW50RGVmYXVsdCgpfSxfb25Ub3VjaFN0YXJ0OmZ1bmN0aW9uKGMpe2MudGFyZ2V0IT09dGhpcy5fcmVzaXplSGFuZGxlJiZ0aGlzLnRhcmdldC5jb2x1bW5SZW9yZGVyaW5nQWxsb3dlZCYmKHRoaXMuX3N0YXJ0UmVvcmRlclRpbWVvdXQ9c2V0VGltZW91dCh0aGlzLl9zdGFydFJlb3JkZXIuYmluZCh0aGlzLGMpLDEwMCkpfSxfc3RhcnRSZW9yZGVyOmZ1bmN0aW9uKGMpe3RoaXMuX3Jlb3JkZXJHaG9zdD0KdGhpcy5fZ2V0R2hvc3QoKTt0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUudmlzaWJpbGl0eT0idmlzaWJsZSI7dmFyIGQ9bmV3IEN1c3RvbUV2ZW50KCJkcmFnc3RhcnQiLHtidWJibGVzOiEwfSk7dGhpcy5fY2VsbENvbnRlbnQuZGlzcGF0Y2hFdmVudChkKTt0aGlzLl9yZW9yZGVyWFk9e3g6Yy50b3VjaGVzWzBdLmNsaWVudFgtdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LHk6Yy50b3VjaGVzWzBdLmNsaWVudFktdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3B9O3RoaXMuX3VwZGF0ZUdob3N0UG9zaXRpb24oYy50b3VjaGVzWzBdLmNsaWVudFgsYy50b3VjaGVzWzBdLmNsaWVudFkpfSxfb25Ub3VjaE1vdmU6ZnVuY3Rpb24oYyl7aWYodGhpcy5fcmVvcmRlckdob3N0KXtjLnByZXZlbnREZWZhdWx0KCk7dmFyIGQ9bmV3IEN1c3RvbUV2ZW50KCJkcmFnb3ZlciIse2J1YmJsZXM6ITB9KTtkLmNsaWVudFg9Yy50b3VjaGVzWzBdLmNsaWVudFg7ZC5jbGllbnRZPQpjLnRvdWNoZXNbMF0uY2xpZW50WTt2YXIgZj10aGlzLl9jb250ZW50RnJvbVBvaW50KGQuY2xpZW50WCxkLmNsaWVudFkpO2YmJmYuZGlzcGF0Y2hFdmVudChkKTt0aGlzLl91cGRhdGVHaG9zdFBvc2l0aW9uKGMudG91Y2hlc1swXS5jbGllbnRYLGMudG91Y2hlc1swXS5jbGllbnRZKX1lbHNlIGNsZWFyVGltZW91dCh0aGlzLl9zdGFydFJlb3JkZXJUaW1lb3V0KX0sX3VwZGF0ZUdob3N0UG9zaXRpb246ZnVuY3Rpb24oYyxkKXtjLT10aGlzLl9yZW9yZGVyWFkueDtkPWQtdGhpcy5fcmVvcmRlclhZLnktNTA7dmFyIGY9cGFyc2VJbnQodGhpcy5fcmVvcmRlckdob3N0LnN0eWxlLmxlZnR8fDApLGc9cGFyc2VJbnQodGhpcy5fcmVvcmRlckdob3N0LnN0eWxlLnRvcHx8MCksbD10aGlzLl9yZW9yZGVyR2hvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dGhpcy5fcmVvcmRlckdob3N0LnN0eWxlLmxlZnQ9Zi0obC5sZWZ0LWMpKyJweCI7dGhpcy5fcmVvcmRlckdob3N0LnN0eWxlLnRvcD0KZy0obC50b3AtZCkrInB4In0sX29uVG91Y2hFbmQ6ZnVuY3Rpb24oYyl7Y2xlYXJUaW1lb3V0KHRoaXMuX3N0YXJ0UmVvcmRlclRpbWVvdXQpO3RoaXMuX3Jlb3JkZXJHaG9zdCYmKGMucHJldmVudERlZmF1bHQoKSxjPW5ldyBDdXN0b21FdmVudCgiZHJhZ2VuZCIse2J1YmJsZXM6ITB9KSx0aGlzLmRpc3BhdGNoRXZlbnQoYyksdGhpcy5fcmVvcmRlckdob3N0LnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIsdGhpcy5fcmVvcmRlckdob3N0PW51bGwpfSxfY29udGVudEZyb21Qb2ludDpmdW5jdGlvbihjLGQpe2lmKFBvbHltZXIuU2V0dGluZ3MudXNlU2hhZG93KXt2YXIgZj10aGlzLnRhcmdldC4kLnNjcm9sbGVyO2YudG9nZ2xlQXR0cmlidXRlKCJuby1jb250ZW50LXBvaW50ZXItZXZlbnRzIiwhMCk7Yz10aGlzLmRvbUhvc3Qucm9vdC5lbGVtZW50RnJvbVBvaW50KGMsZCk7Zi50b2dnbGVBdHRyaWJ1dGUoIm5vLWNvbnRlbnQtcG9pbnRlci1ldmVudHMiLCExKTtpZihjJiZjLmdldENvbnRlbnRDaGlsZHJlbilyZXR1cm4gYy5nZXRDb250ZW50Q2hpbGRyZW4oUG9seW1lci5FbGVtZW50Pwoic2xvdCI6ImNvbnRlbnQiKVswXX1lbHNlIHJldHVybiBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGMsZCl9LF9nZXRHaG9zdDpmdW5jdGlvbigpe3ZhciBjPXRoaXMudGFyZ2V0LiQuc2Nyb2xsZXIuJC5yZW9yZGVyZ2hvc3Q7Yy5pbm5lclRleHQ9dGhpcy5fY2VsbENvbnRlbnQuaW5uZXJUZXh0O3ZhciBkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuX2NlbGxDb250ZW50KTsiYm94U2l6aW5nIGRpc3BsYXkgd2lkdGggaGVpZ2h0IGJhY2tncm91bmQgYWxpZ25JdGVtcyBwYWRkaW5nIGJvcmRlciBmbGV4LWRpcmVjdGlvbiBvdmVyZmxvdyIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGYpe2Muc3R5bGVbZl09ZFtmXX0sdGhpcyk7cmV0dXJuIGN9LF9lbmFibGVEcmFnOmZ1bmN0aW9uKCl7dGhpcy5fY2VsbENvbnRlbnQuZHJhZ2dhYmxlPXRoaXMudGFyZ2V0LmNvbHVtblJlb3JkZXJpbmdBbGxvd2VkJiYhd2luZG93LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCl9LF9kaXNhYmxlRHJhZzpmdW5jdGlvbigpe3RoaXMuX2NlbGxDb250ZW50LmRyYWdnYWJsZT0KITF9LF9jYW5jZWxNb3VzZURvd25PblJlc2l6ZTpmdW5jdGlvbihjKXtjLnRhcmdldD09PXRoaXMuX3Jlc2l6ZUhhbmRsZSYmYy5wcmV2ZW50RGVmYXVsdCgpfSxfcmVzaXphYmxlQ2hhbmdlZDpmdW5jdGlvbihjKXtjPyh0aGlzLl9yZXNpemVIYW5kbGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5fcmVzaXplSGFuZGxlLmNsYXNzTGlzdC5hZGQoInZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlIiksdGhpcy5saXN0ZW4odGhpcy5fcmVzaXplSGFuZGxlLCJ0cmFjayIsIl9vblRyYWNrIiksUG9seW1lci5kb20odGhpcykuYXBwZW5kQ2hpbGQodGhpcy5fcmVzaXplSGFuZGxlKSk6dGhpcy5fcmVzaXplSGFuZGxlJiYodGhpcy51bmxpc3Rlbih0aGlzLl9yZXNpemVIYW5kbGUsInRyYWNrIiwiX29uVHJhY2siKSxQb2x5bWVyLmRvbSh0aGlzKS5yZW1vdmVDaGlsZCh0aGlzLl9yZXNpemVIYW5kbGUpKX0sX29uVHJhY2s6ZnVuY3Rpb24oYyl7dGhpcy5jb2x1bW5SZXNpemluZz0KITA7dmFyIGQ9dGhpcy5jb2x1bW47InZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCI9PT1kLmxvY2FsTmFtZSYmKGQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZC5fY2hpbGRDb2x1bW5zLDApLnNvcnQoZnVuY3Rpb24obCxrKXtyZXR1cm4gbC5fb3JkZXItay5fb3JkZXJ9KS5maWx0ZXIoZnVuY3Rpb24obCl7cmV0dXJuIWwuaGlkZGVufSkucG9wKCkpO3ZhciBmPXRoaXMuX2dldEhlYWRlckNlbGxCeUNvbHVtbihkKTtpZihmLm9mZnNldFdpZHRoKXt2YXIgZz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShmLl9jZWxsQ29udGVudCk7ZC53aWR0aD1NYXRoLm1heCgxMCtwYXJzZUludChnLnBhZGRpbmdMZWZ0KStwYXJzZUludChnLnBhZGRpbmdSaWdodCksZi5vZmZzZXRXaWR0aCtjLmRldGFpbC54LWYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQpKyJweCI7ZC5mbGV4R3Jvdz0wfUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKFBvbHltZXIuZG9tKHRoaXMucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50KS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtcm93Omxhc3QtY2hpbGQgLnZhYWRpbi1ncmlkLWNlbGwiKSkuc29ydChmdW5jdGlvbihsLAprKXtyZXR1cm4gbC5jb2x1bW4uX29yZGVyLWsuY29sdW1uLl9vcmRlcn0pLmZvckVhY2goZnVuY3Rpb24obCxrLG4pe2s8bi5pbmRleE9mKGYpJiYobC5jb2x1bW4ud2lkdGg9bC5vZmZzZXRXaWR0aCsicHgiLGwuY29sdW1uLmZsZXhHcm93PTApfSk7dGhpcy5jb2x1bW5SZXNpemluZyYmImVuZCI9PT1jLmRldGFpbC5zdGF0ZSYmKHRoaXMuY29sdW1uUmVzaXppbmc9ITEpO3RoaXMuZmlyZSgiY29sdW1uLXJlc2l6aW5nIil9LF9nZXRIZWFkZXJDZWxsQnlDb2x1bW46ZnVuY3Rpb24oYyl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChQb2x5bWVyLmRvbSh0aGlzLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCkucXVlcnlTZWxlY3RvckFsbCgiLnZhYWRpbi1ncmlkLXJvdzpsYXN0LWNoaWxkIC52YWFkaW4tZ3JpZC1jZWxsIiksZnVuY3Rpb24oZCl7cmV0dXJuIGQuY29sdW1uPT09Y30pWzBdfSxfaGVhZGVyVGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGMpe3ZvaWQgMCE9PQpjJiYobnVsbD09PWN8fCF0aGlzLl9pc0NvbHVtblJvdyYmInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCIhPT10aGlzLmNvbHVtbi5sb2NhbE5hbWU/KHRoaXMuaW5zdGFuY2U9e3Jvb3Q6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iil9LHRoaXMuX2lzRW1wdHk9ITApOih0aGlzLmluc3RhbmNlPWMudGVtcGxhdGl6ZXIuY3JlYXRlSW5zdGFuY2UoKSx0aGlzLl90ZW1wbGF0aXplcj1jLnRlbXBsYXRpemVyLHRoaXMuX2lzRW1wdHk9ITEpKX0sX2lzRW1wdHlDaGFuZ2VkOmZ1bmN0aW9uKGMsZCl7ZCYmdGhpcy5maXJlKCJjZWxsLWVtcHR5LWNoYW5nZWQiKX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtZm9vdGVyLWNlbGwiLHByb3BlcnRpZXM6e2Zvb3RlclRlbXBsYXRlOk9iamVjdH0sYmVoYXZpb3JzOlthLHZhYWRpbi5lbGVtZW50cy5ncmlkLkNlbGxDbGlja0JlaGF2aW9yXSxvYnNlcnZlcnM6WyJfZm9vdGVyVGVtcGxhdGVDaGFuZ2VkKGZvb3RlclRlbXBsYXRlKSIsCiJfaXNFbXB0eUNoYW5nZWQoX2lzRW1wdHksIGlzQXR0YWNoZWQpIl0sX2Zvb3RlclRlbXBsYXRlQ2hhbmdlZDpmdW5jdGlvbihjKXt2b2lkIDAhPT1jJiYobnVsbD09PWN8fCF0aGlzLl9pc0NvbHVtblJvdyYmInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCIhPT10aGlzLmNvbHVtbi5sb2NhbE5hbWU/KHRoaXMuaW5zdGFuY2U9e3Jvb3Q6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iil9LHRoaXMuX2lzRW1wdHk9ITApOih0aGlzLmluc3RhbmNlPWMudGVtcGxhdGl6ZXIuY3JlYXRlSW5zdGFuY2UoKSx0aGlzLl90ZW1wbGF0aXplcj1jLnRlbXBsYXRpemVyLHRoaXMuX2lzRW1wdHk9ITEpKX0sX2lzRW1wdHlDaGFuZ2VkOmZ1bmN0aW9uKGMsZCl7ZCYmdGhpcy5maXJlKCJjZWxsLWVtcHR5LWNoYW5nZWQiKX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtc2l6ZXItY2VsbCIsYmVoYXZpb3JzOlthXX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1zaXplci5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC1zaXplciIscHJvcGVydGllczp7Y29sdW1uVHJlZTpBcnJheSx0b3A6TnVtYmVyLF9jb2x1bW5zOkFycmF5fSxvYnNlcnZlcnM6WyJfY29sdW1uVHJlZUNoYW5nZWQoY29sdW1uVHJlZSkiLCJfdG9wQ2hhbmdlZCh0b3ApIl0sX2NvbHVtblRyZWVDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuX2NvbHVtbnM9YVthLmxlbmd0aC0xXX0sX3RvcENoYW5nZWQ6ZnVuY3Rpb24oYSl7dGhpcy5zdHlsZS50b3A9YSsicHgifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLW91dGVyLXNjcm9sbGVyLmh0bWwuanMKUG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLW91dGVyLXNjcm9sbGVyIixwcm9wZXJ0aWVzOntzY3JvbGxUYXJnZXQ6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfc2Nyb2xsVGFyZ2V0Q2hhbmdlZCJ9LHBhc3N0aHJvdWdoOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiEwfX0sbGlzdGVuZXJzOntzY3JvbGw6Il9zeW5jU2Nyb2xsVGFyZ2V0In0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLmxpc3Rlbih0aGlzLmRvbUhvc3QsIm1vdXNlbW92ZSIsIl9vbk1vdXNlTW92ZSIpO3RoaXMuc3R5bGUud2Via2l0T3ZlcmZsb3dTY3JvbGxpbmc9InRvdWNoIn0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnVubGlzdGVuKHRoaXMuZG9tSG9zdCwibW91c2Vtb3ZlIiwiX29uTW91c2VNb3ZlIil9LF9zY3JvbGxUYXJnZXRDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7YyYmdGhpcy51bmxpc3RlbihjLCJzY3JvbGwiLCJfc3luY091dGVyU2Nyb2xsZXIiKTt0aGlzLmxpc3RlbihhLAoic2Nyb2xsIiwiX3N5bmNPdXRlclNjcm9sbGVyIil9LF9vbk1vdXNlTW92ZTpmdW5jdGlvbihhKXt0aGlzLnBhc3N0aHJvdWdoPWEub2Zmc2V0WTw9dGhpcy5jbGllbnRIZWlnaHQmJmEub2Zmc2V0WDw9dGhpcy5jbGllbnRXaWR0aH0sX3N5bmNPdXRlclNjcm9sbGVyOmZ1bmN0aW9uKCl7dGhpcy5fc3luY2luZ1Njcm9sbFRhcmdldHx8KHRoaXMuX3N5bmNpbmdPdXRlclNjcm9sbGVyPSEwLHRoaXMuc2Nyb2xsVG9wPXRoaXMuZG9tSG9zdC5fc2Nyb2xsVG9wLHRoaXMuc2Nyb2xsTGVmdD10aGlzLmRvbUhvc3QuX3Njcm9sbExlZnQpO3RoaXMuX3N5bmNpbmdTY3JvbGxUYXJnZXQ9ITF9LF9zeW5jU2Nyb2xsVGFyZ2V0OmZ1bmN0aW9uKCl7dGhpcy5fc3luY2luZ091dGVyU2Nyb2xsZXJ8fCh0aGlzLl9zeW5jaW5nU2Nyb2xsVGFyZ2V0PSEwLHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcD10aGlzLnNjcm9sbFRvcCx0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxMZWZ0PXRoaXMuc2Nyb2xsTGVmdCwKdGhpcy5kb21Ib3N0Ll9zY3JvbGxIYW5kbGVyKCkpO3RoaXMuX3N5bmNpbmdPdXRlclNjcm9sbGVyPSExfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWZvY3VzYWJsZS1jZWxsLWNvbnRhaW5lci1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5Gb2N1c2FibGVDZWxsQ29udGFpbmVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2ZvY3VzZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9mb2N1c2VkUm93Ok9iamVjdCxfZm9jdXNlZFJvd0luZGV4Ok51bWJlcixfZm9jdXNlZENlbGw6T2JqZWN0LF9mb2N1c2VkQ2VsbEluZGV4Ok51bWJlcixfbGFzdEZvY3VzZWRDZWxsOk9iamVjdH0sb2JzZXJ2ZXJzOlsiX2Fubm91bmNlRm9jdXNlZENlbGwoX2ZvY3VzZWRDZWxsLCBmb2N1c2VkKSIsIl9kaXNwYXRjaEV2ZW50cyhfZm9jdXNlZENlbGwsIGZvY3VzZWQpIiwiX2ZvY3VzZWRDZWxsQ2hhbmdlZChfZm9jdXNlZFJvd0luZGV4LCBfZm9jdXNlZENlbGxJbmRleCkiXSxfYW5ub3VuY2VGb2N1c2VkQ2VsbDpmdW5jdGlvbihhLGMpe3ZvaWQgMCE9PWEmJnZvaWQgMCE9PWMmJnRoaXMuZG9tSG9zdC5uYXZpZ2F0aW5nJiZjJiYoYz1Qb2x5bWVyLkVsZW1lbnQ/YS5fY2VsbENvbnRlbnQuZ2V0QXR0cmlidXRlKCJzbG90Iik6CmEuX2NlbGxDb250ZW50LmlkLCJ2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IiE9PXRoaXMuaXN8fGEuaGFzQXR0cmlidXRlKCJkZXRhaWxzY2VsbCIpfHwoYT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKFBvbHltZXIuZG9tKGEucGFyZW50RWxlbWVudCkucXVlcnlTZWxlY3RvckFsbCgiLnZhYWRpbi1ncmlkLWNlbGwiKSxhKSxjPXRoaXMuZG9tSG9zdC4kLmhlYWRlci5sYXN0RWxlbWVudENoaWxkLmNoaWxkcmVuW2FdLl9jZWxsQ29udGVudC5pZCsiICIrYyksdGhpcy5kb21Ib3N0LiQuZm9vdGVyRm9jdXNUcmFwLmFjdGl2ZVRhcmdldD1jKX0sX2Rpc3BhdGNoRXZlbnRzOmZ1bmN0aW9uKGEsYyl7dm9pZCAwIT09YSYmdm9pZCAwIT09YyYmKHRoaXMuX2xhc3RGb2N1c2VkQ2VsbCYmKHRoaXMuX2xhc3RGb2N1c2VkQ2VsbC5fY2VsbENvbnRlbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImNlbGwtZm9jdXNvdXQiKSksdGhpcy5fbGFzdEZvY3VzZWRDZWxsPXZvaWQgMCksCmMmJihhLl9jZWxsQ29udGVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY2VsbC1mb2N1c2luIikpLHRoaXMuX2xhc3RGb2N1c2VkQ2VsbD1hKSl9LF9mb2N1c2VkQ2VsbENoYW5nZWQ6ZnVuY3Rpb24oYSxjKXt2b2lkIDAhPT1hJiZ2b2lkIDAhPT1jJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKFBvbHltZXIuZG9tKHRoaXMpLmNoaWxkcmVuLGZ1bmN0aW9uKGQsZil7ZC5mb2N1c2VkPWY9PT1hO2QuZm9jdXNlZCYmKHRoaXMuX2ZvY3VzZWRSb3c9ZCx0aGlzLl9mb2N1c2VkQ2VsbEluZGV4PU1hdGgubWluKGMsZC5jaGlsZHJlbi5sZW5ndGgtMSksdGhpcy5fZm9jdXNlZENlbGw9ZC5jaGlsZHJlblt0aGlzLl9mb2N1c2VkQ2VsbEluZGV4XSk7ZC5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGcsbCl7Zy5mb2N1c2VkPWw9PT10aGlzLl9mb2N1c2VkQ2VsbEluZGV4fS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9LGZvY3VzTGVmdDpmdW5jdGlvbigpe2lmKCF0aGlzLl9mb2N1c2VkQ2VsbC5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIikpe3ZhciBhPQp0aGlzLl92aXNpYmxlQ2VsbEluZGV4ZXMoKTswPGEubGVuZ3RoJiYodGhpcy5fZm9jdXNlZENlbGxJbmRleD1hW01hdGgubWF4KDAsYS5pbmRleE9mKHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXgpLTEpXSl9fSxmb2N1c0Rvd246ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5taW4odGhpcy5fZm9jdXNlZFJvd0luZGV4KzEsdGhpcy5jaGlsZHJlbi5sZW5ndGgtMSl9LF92aXNpYmxlQ2VsbEluZGV4ZXM6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLl9mb2N1c2VkUm93JiZ0aGlzLl9mb2N1c2VkUm93LmNoaWxkcmVuKXtmb3IodmFyIGM9dGhpcy5fZm9jdXNlZFJvdy5jaGlsZHJlbixkPTA7ZDxjLmxlbmd0aDtkKyspY1tkXS5oaWRkZW58fGNbZF09PT10aGlzLl9mb2N1c2VkUm93Ll9yb3dEZXRhaWxzQ2VsbHx8YS5wdXNoKGQpO2Euc29ydChmdW5jdGlvbihmLGcpe3JldHVybiBjW2ZdLmNvbHVtbi5fb3JkZXI8Y1tnXS5jb2x1bW4uX29yZGVyPy0xOjF9KX1yZXR1cm4gYX0sCmZvY3VzUGFnZURvd246ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5taW4odGhpcy5fZm9jdXNlZFJvd0luZGV4KzEwLHRoaXMuY2hpbGRyZW4ubGVuZ3RoLTEpfSxmb2N1c1BhZ2VVcDpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD1NYXRoLm1heCgwLHRoaXMuX2ZvY3VzZWRSb3dJbmRleC0xMCl9LGZvY3VzUmlnaHQ6ZnVuY3Rpb24oKXtpZighdGhpcy5fZm9jdXNlZENlbGwuaGFzQXR0cmlidXRlKCJkZXRhaWxzY2VsbCIpKXt2YXIgYT10aGlzLl92aXNpYmxlQ2VsbEluZGV4ZXMoKTswPGEubGVuZ3RoJiYodGhpcy5fZm9jdXNlZENlbGxJbmRleD1hW01hdGgubWluKGEuaW5kZXhPZih0aGlzLl9mb2N1c2VkQ2VsbEluZGV4KSsxLGEubGVuZ3RoLTEpXSl9fSxmb2N1c1VwOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PU1hdGgubWF4KDAsdGhpcy5fZm9jdXNlZFJvd0luZGV4LTEpfSxmb2N1c0hvbWU6ZnVuY3Rpb24oKXtpZighdGhpcy5fZm9jdXNlZENlbGwuaGFzQXR0cmlidXRlKCJkZXRhaWxzY2VsbCIpKXt2YXIgYT0KdGhpcy5fdmlzaWJsZUNlbGxJbmRleGVzKCk7MDxhLmxlbmd0aCYmKHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXg9YVswXSl9fSxmb2N1c0VuZDpmdW5jdGlvbigpe2lmKCF0aGlzLl9mb2N1c2VkQ2VsbC5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIikpe3ZhciBhPXRoaXMuX3Zpc2libGVDZWxsSW5kZXhlcygpOzA8YS5sZW5ndGgmJih0aGlzLl9mb2N1c2VkQ2VsbEluZGV4PWFbYS5sZW5ndGgtMV0pfX0sZm9jdXNGaXJzdDpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD0wO3RoaXMuZm9jdXNIb21lKCl9LGZvY3VzTGFzdDpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD10aGlzLmNoaWxkcmVuLmxlbmd0aC0xO3RoaXMuZm9jdXNFbmQoKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlci1mb290ZXIuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYT17cHJvcGVydGllczp7Y29sdW1uVHJlZTpBcnJheSx0YXJnZXQ6T2JqZWN0LF9yb3dzOkFycmF5fSxvYnNlcnZlcnM6WyJfY29sdW1uVHJlZUNoYW5nZWQoY29sdW1uVHJlZSwgdGFyZ2V0KSIsIl9yb3dzQ2hhbmdlZChfcm93cykiXSxfY29sdW1uVHJlZUNoYW5nZWQ6ZnVuY3Rpb24oYyxkKXtpZih2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kKXt0aGlzLl9yb3dzJiZ0aGlzLl9yb3dzLmZvckVhY2goZnVuY3Rpb24oayl7UG9seW1lci5kb20oaykuaW5uZXJIVE1MPSIifSk7Zm9yKHZhciBmPVtdLGc9MDtnPGMubGVuZ3RoO2crKyl7dmFyIGw9dGhpcy5fY3JlYXRlUm93KCk7bC50YXJnZXQ9ZDtsLl9pc0NvbHVtblJvdz1nPT1jLmxlbmd0aC0xO2wuY29sdW1ucz1jW2ddO2YucHVzaChsKX10aGlzLl9yb3dzPSJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXIiPT09dGhpcy5sb2NhbE5hbWU/ZjpmLnJldmVyc2UoKX19LF9yb3dzQ2hhbmdlZDpmdW5jdGlvbihjKXtQb2x5bWVyLmRvbSh0aGlzKS5pbm5lckhUTUw9CiIiO2MuZm9yRWFjaChmdW5jdGlvbihkKXtQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZChkKX0uYmluZCh0aGlzKSl9fTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIixiZWhhdmlvcnM6W2EsdmFhZGluLmVsZW1lbnRzLmdyaWQuRm9jdXNhYmxlQ2VsbENvbnRhaW5lckJlaGF2aW9yXSxfY3JlYXRlUm93OmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlci1yb3ciKX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtYm9keSIsYmVoYXZpb3JzOlt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Gb2N1c2FibGVDZWxsQ29udGFpbmVyQmVoYXZpb3JdLG9ic2VydmVyczpbIl9hbm5vdW5jZUZvY3VzZWRSb3coX2ZvY3VzZWRSb3cpIl0sX2Fubm91bmNlRm9jdXNlZFJvdzpmdW5jdGlvbihjKXt0aGlzLmZpcmUoImlyb24tYW5ub3VuY2UiLHt0ZXh0OiJSb3cgIisoYy5pbmRleCsxKSsiIG9mICIrCnRoaXMuZG9tSG9zdC5zaXplfSl9LF9tb3ZlRm9jdXNUb0RldGFpbHNDZWxsOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZENlbGwuZm9jdXNlZD0hMTt0aGlzLl9mb2N1c2VkUm93Ll9yb3dEZXRhaWxzQ2VsbC5mb2N1c2VkPSEwO3RoaXMuX2ZvY3VzZWRDZWxsPXRoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsfSxfZm9jdXNlZFJvd0hhc0RldGFpbHNDZWxsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZvY3VzZWRSb3cmJnRoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsJiZ0aGlzLl9mb2N1c2VkQ2VsbCE9PXRoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsfSxmb2N1c0Rvd246ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SGFzRGV0YWlsc0NlbGwoKT90aGlzLl9tb3ZlRm9jdXNUb0RldGFpbHNDZWxsKCk6dGhpcy5fZm9jdXNlZFJvd0luZGV4PU1hdGgubWluKHRoaXMuX2ZvY3VzZWRSb3dJbmRleCsxLHRoaXMuZG9tSG9zdC5zaXplLTEpfSxmb2N1c1VwOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvdyYmCnRoaXMuX2ZvY3VzZWRDZWxsPT09dGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGw/dGhpcy5fZm9jdXNlZENlbGxDaGFuZ2VkKHRoaXMuX2ZvY3VzZWRSb3dJbmRleCx0aGlzLl9mb2N1c2VkQ2VsbEluZGV4KToodGhpcy5fZm9jdXNlZFJvd0luZGV4PU1hdGgubWF4KDAsdGhpcy5fZm9jdXNlZFJvd0luZGV4LTEpLHRoaXMuX2ZvY3VzZWRSb3dIYXNEZXRhaWxzQ2VsbCgpJiZ0aGlzLl9tb3ZlRm9jdXNUb0RldGFpbHNDZWxsKCkpfSxmb2N1c0xhc3Q6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SW5kZXg9dGhpcy5kb21Ib3N0LnNpemUtMTt0aGlzLmZvY3VzRW5kKCl9LF9mb2N1c2VkQ2VsbENoYW5nZWQ6ZnVuY3Rpb24oYyxkKXt2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKFBvbHltZXIuZG9tKHRoaXMpLmNoaWxkcmVuLGZ1bmN0aW9uKGYpe2YuZm9jdXNlZD1mLmluZGV4PT09YztmLmluZGV4PT09YyYmKHRoaXMuX2ZvY3VzZWRSb3c9CmYsdGhpcy5fZm9jdXNlZENlbGw9Zi5jaGlsZHJlbltkXSk7Zi5pdGVyYXRlQ2VsbHMoZnVuY3Rpb24oZyxsKXtnLmZvY3VzZWQ9bD09PWR9KX0uYmluZCh0aGlzKSl9fSk7UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciIsYmVoYXZpb3JzOlthLHZhYWRpbi5lbGVtZW50cy5ncmlkLkZvY3VzYWJsZUNlbGxDb250YWluZXJCZWhhdmlvcl0sX2NyZWF0ZVJvdzpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXItcm93Iil9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLWZvY3VzLXRyYXAuaHRtbC5qcwpQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtZm9jdXMtdHJhcCIsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImdyaWRjZWxsIn0scHJvcGVydGllczp7YWN0aXZlVGFyZ2V0Ont0eXBlOlN0cmluZyxvYnNlcnZlcjoiX2FjdGl2ZVRhcmdldENoYW5nZWQifX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9wcmltYXJ5PVBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvcigiLnByaW1hcnkiKTt0aGlzLl9zZWNvbmRhcnk9UG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yKCIuc2Vjb25kYXJ5Iik7aWYoUG9seW1lci5TZXR0aW5ncy51c2VOYXRpdmVTaGFkb3d8fFBvbHltZXIuU2V0dGluZ3MudXNlU2hhZG93KVBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKHRoaXMuX3NlY29uZGFyeSksUG9seW1lci5kb20odGhpcykuYXBwZW5kQ2hpbGQodGhpcy5fcHJpbWFyeSl9LGZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZCE9PXRoaXMuX3ByaW1hcnk/dGhpcy5fcHJpbWFyeS5mb2N1cygpOgp0aGlzLl9zZWNvbmRhcnkuZm9jdXMoKX0sX29uQmFpdEZvY3VzOmZ1bmN0aW9uKGEpe3RoaXMuX2ZvY3VzZWQ9YS50YXJnZXQ7dGhpcy5fbW92aW5nRm9jdXNJbnRlcm5hbGx5fHwodGhpcy5maXJlKCJmb2N1cy1nYWluZWQiKSx0aGlzLl9wcmltYXJ5LnRhYkluZGV4PS0xKX0sX29uQmFpdEJsdXI6ZnVuY3Rpb24oKXt0aGlzLl9tb3ZpbmdGb2N1c0ludGVybmFsbHl8fCh0aGlzLmZpcmUoImZvY3VzLWxvc3QiKSx0aGlzLl9wcmltYXJ5LnRhYkluZGV4PTApfSxfYWN0aXZlVGFyZ2V0Q2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLl9tb3ZpbmdGb2N1c0ludGVybmFsbHk9ITA7dGhpcy5fZm9jdXNlZD09PXRoaXMuX3ByaW1hcnk/KHRoaXMuX3NlY29uZGFyeS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsYSksdGhpcy5fc2Vjb25kYXJ5LmZvY3VzKCkpOih0aGlzLl9wcmltYXJ5LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5IixhKSx0aGlzLl9wcmltYXJ5LmZvY3VzKCkpOwp0aGlzLl9tb3ZpbmdGb2N1c0ludGVybmFsbHk9ITF9LF9yZWFubm91bmNlOmZ1bmN0aW9uKCl7dGhpcy5fbW92aW5nRm9jdXNJbnRlcm5hbGx5PSEwO3RoaXMuX2ZvY3VzZWQ9PT10aGlzLl9wcmltYXJ5Pyh0aGlzLl9zZWNvbmRhcnkuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsbGVkYnkiLHRoaXMuYWN0aXZlVGFyZ2V0KSx0aGlzLl9zZWNvbmRhcnkuZm9jdXMoKSk6KHRoaXMuX3ByaW1hcnkuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsbGVkYnkiLHRoaXMuYWN0aXZlVGFyZ2V0KSx0aGlzLl9wcmltYXJ5LmZvY3VzKCkpO3RoaXMuX21vdmluZ0ZvY3VzSW50ZXJuYWxseT0hMX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC10YWJsZS1yb3cuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYT17cHJvcGVydGllczp7YWN0aXZlOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExfSxjb2x1bW5zOkFycmF5LGluZGV4Ok51bWJlcixjZWxsczp7dmFsdWU6W119LHRhcmdldDpPYmplY3QsZXhwYW5kZWQ6e3ZhbHVlOiExfSxmb2N1c2VkOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSxpdGVtOk9iamVjdCxzZWxlY3RlZDp7cmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfcm93RGV0YWlsc0NlbGw6T2JqZWN0LHJvd0RldGFpbHNUZW1wbGF0ZTpPYmplY3R9LG9ic2VydmVyczoiX2NvbHVtbnNDaGFuZ2VkKGNvbHVtbnMsIHRhcmdldCk7X2luZGV4Q2hhbmdlZChpbmRleCwgY2VsbHMpO19pdGVtQ2hhbmdlZChpdGVtLCBjZWxscyk7X2l0ZW1DaGFuZ2VkRm9yRGV0YWlscyhpdGVtLCBfcm93RGV0YWlsc0NlbGwpO19yb3dEZXRhaWxzQ2hhbmdlZChleHBhbmRlZCwgcm93RGV0YWlsc1RlbXBsYXRlLCB0YXJnZXQpO19yb3dEZXRhaWxzQ2VsbEluZGV4Q2hhbmdlZChfcm93RGV0YWlsc0NlbGwsIGluZGV4KTtfcm93RGV0YWlsc0NlbGxDaGFuZ2VkKF9yb3dEZXRhaWxzQ2VsbCwgdGFyZ2V0KTtfc2VsZWN0ZWRDaGFuZ2VkKHNlbGVjdGVkLCBjZWxscyk7X3NlbGVjdGVkQ2hhbmdlZEZvckRldGFpbHMoc2VsZWN0ZWQsIF9yb3dEZXRhaWxzQ2VsbCkiLnNwbGl0KCI7IiksCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5jbGFzc0xpc3QuYWRkKCJ2YWFkaW4tZ3JpZC1yb3ciKTshMT09PVBvbHltZXIuU2V0dGluZ3MudXNlU2hhZG93JiYodGhpcy5jbGFzc0xpc3QuYWRkKCJzdHlsZS1zY29wZSIpLHRoaXMuY2xhc3NMaXN0LmFkZCgidmFhZGluLWdyaWQiKSl9LGl0ZXJhdGVDZWxsczpmdW5jdGlvbihjKXt0aGlzLmNlbGxzLmZvckVhY2goYyk7dGhpcy5fcm93RGV0YWlsc0NlbGwmJmModGhpcy5fcm93RGV0YWlsc0NlbGwpfSxfcm93RGV0YWlsc0NoYW5nZWQ6ZnVuY3Rpb24oYyxkLGYpe2lmKHZvaWQgMCE9PWMmJnZvaWQgMCE9PWQmJnZvaWQgMCE9PWYpe2lmKGMpe3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLXRhYmxlLWNlbGwiKTtnLnNldEF0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiLCEwKTtnLmZyb3plbj0hMDtnLnRhcmdldD1mO2cudGVtcGxhdGU9ZDtnLnRvZ2dsZUF0dHJpYnV0ZSgibGFzdGNvbHVtbiIsITApO1BvbHltZXIuZG9tKHRoaXMucm9vdCkuYXBwZW5kQ2hpbGQoZyk7ClBvbHltZXIuZG9tLmZsdXNoKCk7dGhpcy5fcm93RGV0YWlsc0NlbGw9Z31lbHNlIHRoaXMuX3Jvd0RldGFpbHNDZWxsJiYoUG9seW1lci5kb20odGhpcy5yb290KS5yZW1vdmVDaGlsZCh0aGlzLl9yb3dEZXRhaWxzQ2VsbCksdGhpcy5fcm93RGV0YWlsc0NlbGw9bnVsbCk7dGhpcy5pdGVyYXRlQ2VsbHMoZnVuY3Rpb24obCl7bC5leHBhbmRlZD1jfSk7dGhpcy50YXJnZXQuJC5zY3JvbGxlci5fZnJvemVuQ2VsbHNDaGFuZ2VkKCl9fSxfdXBkYXRlUm93VmlzaWJpbGl0eTpmdW5jdGlvbigpe3RoaXMuaGlkZGVuPXRoaXMuY2VsbHMuZXZlcnkoZnVuY3Rpb24oYyl7cmV0dXJuIGMuX2lzRW1wdHl9KX0sX3Jvd0RldGFpbHNDZWxsQ2hhbmdlZDpmdW5jdGlvbihjLGQpe3ZvaWQgMCE9PWMmJnZvaWQgMCE9PWQmJmQuJC5zY3JvbGxlci5fdXBkYXRlKCl9LF9yb3dEZXRhaWxzQ2VsbEluZGV4Q2hhbmdlZDpmdW5jdGlvbihjLGQpe3ZvaWQgMCE9PWMmJnZvaWQgMCE9PWQmJihjPyhjLmluZGV4PQpkLFBvbHltZXIuZG9tLmZsdXNoKCksdGhpcy51cGRhdGVSb3dEZXRhaWxzQ2VsbE1ldHJpY3MoKSk6dGhpcy5zdHlsZS5wYWRkaW5nQm90dG9tPSIiKX0sdXBkYXRlUm93RGV0YWlsc0NlbGxNZXRyaWNzOmZ1bmN0aW9uKCl7dGhpcy5fcm93RGV0YWlsc0NlbGwmJih0aGlzLnRhcmdldCYmdGhpcy50YXJnZXQuX29ic2VydmVyJiZ0aGlzLnRhcmdldC5fb2JzZXJ2ZXIuZmx1c2gmJnRoaXMudGFyZ2V0Ll9vYnNlcnZlci5mbHVzaCgpLHRoaXMuX3Jvd0RldGFpbHNDZWxsLnN0eWxlLmhlaWdodD0iIix0aGlzLnN0eWxlLnBhZGRpbmdCb3R0b209dGhpcy5fcm93RGV0YWlsc0NlbGwuc3R5bGUuaGVpZ2h0PXRoaXMuX3Jvd0RldGFpbHNDZWxsLmNsaWVudEhlaWdodCsicHgiKX0sX2NvbHVtbnNDaGFuZ2VkOmZ1bmN0aW9uKGMsZCl7aWYodm9pZCAwIT09YyYmdm9pZCAwIT09ZCl7UG9seW1lci5kb20odGhpcykuaW5uZXJIVE1MPSIiO3ZhciBmPVtdO2MuZm9yRWFjaChmdW5jdGlvbihnKXt2YXIgbD0KIl8iK3RoaXMuaXMucmVwbGFjZSgvLS9nLCJfIikrIl9jZWxscyI7bD1nW2xdPWdbbF18fFtdO3ZhciBrPWwuZmlsdGVyKGZ1bmN0aW9uKHApe3JldHVybiFQb2x5bWVyLmRvbShwKS5wYXJlbnROb2RlfSlbMF07aWYoIWspe2s9dGhpcy5fY3JlYXRlQ2VsbCgpO3ZhciBuPUFycmF5LnByb3RvdHlwZS5zb21lLmNhbGwodGhpcy50YXJnZXQucXVlcnlTZWxlY3RvckFsbCgiZG9tLXJlcGVhdCIpLGZ1bmN0aW9uKHApe3JldHVybiFwLnJlc3RhbXB9KTsobj1ufHwidmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLXJvdyI9PT10aGlzLmlzfHwidmFhZGluLWdyaWQtdGFibGUtZm9vdGVyLXJvdyI9PT10aGlzLmlzKXx8bC5wdXNoKGspfWsuaW5kZXg9dGhpcy5pbmRleDtrLnRhcmdldD10aGlzLnRhcmdldDtrLl9pc0NvbHVtblJvdz10aGlzLl9pc0NvbHVtblJvdztrLmNvbHVtbj1nO2suZXhwYW5kZWQ9dGhpcy5leHBhbmRlZDtQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZChrKTtmLnB1c2goayl9LmJpbmQodGhpcykpOwp0aGlzLmNlbGxzPWZ9fSxfaW5kZXhDaGFuZ2VkOmZ1bmN0aW9uKGMsZCl7dm9pZCAwIT09YyYmdm9pZCAwIT09ZCYmZC5mb3JFYWNoKGZ1bmN0aW9uKGYpe2YuaW5kZXg9Y30pfSxfaXRlbUNoYW5nZWQ6ZnVuY3Rpb24oYyxkKXt2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kJiZkLmZvckVhY2goZnVuY3Rpb24oZil7Zi5pdGVtPWN9KX0sX2l0ZW1DaGFuZ2VkRm9yRGV0YWlsczpmdW5jdGlvbihjLGQpe3ZvaWQgMCE9PWMmJnZvaWQgMCE9PWQmJmQmJihkLml0ZW09Yyl9LF9zZWxlY3RlZENoYW5nZWQ6ZnVuY3Rpb24oYyxkKXt2b2lkIDAhPT1jJiZ2b2lkIDAhPT1kJiZkLmZvckVhY2goZnVuY3Rpb24oZil7Zi5zZWxlY3RlZD1jfSl9LF9zZWxlY3RlZENoYW5nZWRGb3JEZXRhaWxzOmZ1bmN0aW9uKGMsZCl7dm9pZCAwIT09YyYmdm9pZCAwIT09ZCYmZCYmKGQuc2VsZWN0ZWQ9Yyl9LHVwZGF0ZUxhc3RDb2x1bW46ZnVuY3Rpb24oKXt0aGlzLmNlbGxzLnNsaWNlKDApLnNvcnQoZnVuY3Rpb24oYywKZCl7cmV0dXJuIGMuY29sdW1uLl9vcmRlci1kLmNvbHVtbi5fb3JkZXJ9KS5mb3JFYWNoKGZ1bmN0aW9uKGMsZCxmKXtjLnRvZ2dsZUF0dHJpYnV0ZSgibGFzdGNvbHVtbiIsZD09PWYubGVuZ3RoLTEpfSl9fTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtcm93IixiZWhhdmlvcnM6W2FdLF9jcmVhdGVDZWxsOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLXRhYmxlLWNlbGwiKX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLXJvdyIsYmVoYXZpb3JzOlthXSxvYnNlcnZlcnM6WyJfdXBkYXRlUm93VmlzaWJpbGl0eShjb2x1bW5zKSJdLGxpc3RlbmVyczp7ImNlbGwtZW1wdHktY2hhbmdlZCI6Il91cGRhdGVSb3dWaXNpYmlsaXR5In0sX2NyZWF0ZUNlbGw6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLWNlbGwiKX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtZm9vdGVyLXJvdyIsCmJlaGF2aW9yczpbYV0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZVJvd1Zpc2liaWxpdHkoY29sdW1ucykiXSxsaXN0ZW5lcnM6eyJjZWxsLWVtcHR5LWNoYW5nZWQiOiJfdXBkYXRlUm93VmlzaWJpbGl0eSJ9LF9jcmVhdGVDZWxsOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1jZWxsIil9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRlbXBsYXRpemVyLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307dmFhZGluLmVsZW1lbnRzLmdyaWQuVGVtcGxhdGl6ZXI9ZnVuY3Rpb24oKXt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5UZW1wbGF0aXplcj1Qb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGVtcGxhdGl6ZXIiLGJlaGF2aW9yczpbUG9seW1lci5UZW1wbGF0aXplcl0scHJvcGVydGllczp7ZGF0YUhvc3Q6T2JqZWN0LHRlbXBsYXRlOk9iamVjdCxfdGVtcGxhdGVJbnN0YW5jZXM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LF9wYXJlbnRQYXRoVmFsdWVzOnt2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX19LG9ic2VydmVyczpbIl90ZW1wbGF0ZUluc3RhbmNlc0NoYW5nZWQoX3RlbXBsYXRlSW5zdGFuY2VzLiosIF9wYXJlbnRQYXRoVmFsdWVzLiopIl0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX3BhcmVudE1vZGVsPSEwO3RoaXMuX2luc3RhbmNlUHJvcHM9e2V4cGFuZGVkOiEwLGluZGV4OiEwLGl0ZW06ITAsc2VsZWN0ZWQ6ITB9fSxjcmVhdGVJbnN0YW5jZTpmdW5jdGlvbigpe3RoaXMuX2Vuc3VyZVRlbXBsYXRpemVkKCk7dmFyIGE9dGhpcy5zdGFtcCh7fSk7CnRoaXMuYWRkSW5zdGFuY2UoYSk7cmV0dXJuIGF9LGFkZEluc3RhbmNlOmZ1bmN0aW9uKGEpey0xPT09dGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMuaW5kZXhPZihhKSYmdGhpcy5wdXNoKCJfdGVtcGxhdGVJbnN0YW5jZXMiLGEpfSxyZW1vdmVJbnN0YW5jZTpmdW5jdGlvbihhKXt0aGlzLnNwbGljZSgiX3RlbXBsYXRlSW5zdGFuY2VzIix0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5pbmRleE9mKGEpLDEpfSxfZW5zdXJlVGVtcGxhdGl6ZWQ6ZnVuY3Rpb24oKXt0aGlzLnRlbXBsYXRlLl90ZW1wbGF0aXplZHx8KHRoaXMudGVtcGxhdGUuX3RlbXBsYXRpemVkPSEwLHRoaXMudGVtcGxhdGl6ZSh0aGlzLnRlbXBsYXRlKSx0aGlzLl9wYXJlbnRQcm9wcz10aGlzLl9wYXJlbnRQcm9wc3x8e30sUG9seW1lci5FbGVtZW50fHxPYmplY3Qua2V5cyh0aGlzLl9wYXJlbnRQcm9wcykuZm9yRWFjaChmdW5jdGlvbigpe30sdGhpcykpfSxfZm9yd2FyZEluc3RhbmNlUHJvcDpmdW5jdGlvbihhLGMsZCl7dm9pZCAwIT09CmFbIl9fIitjKyJfXyJdJiZhWyJfXyIrYysiX18iXSE9PWQmJnRoaXMuZmlyZSgidGVtcGxhdGUtaW5zdGFuY2UtY2hhbmdlZCIse3Byb3A6Yyx2YWx1ZTpkLGluc3Q6YX0pfSxfZm9yd2FyZEluc3RhbmNlUGF0aDpmdW5jdGlvbihhLGMsZCl7MCE9PWMuaW5kZXhPZigiaXRlbS4iKXx8dGhpcy5fc3VwcHJlc3NJdGVtQ2hhbmdlRXZlbnR8fHRoaXMuZmlyZSgiaXRlbS1jaGFuZ2VkIix7aXRlbTphLml0ZW0scGF0aDpjLnN1YnN0cmluZyg1KSx2YWx1ZTpkfSl9LF9ub3RpZnlJbnN0YW5jZVByb3BWMjpmdW5jdGlvbihhLGMsZCl7dGhpcy5fZm9yd2FyZEluc3RhbmNlUHJvcChhLGMsZCk7dGhpcy5fZm9yd2FyZEluc3RhbmNlUGF0aChhLGMsZCl9LF9mb3J3YXJkUGFyZW50UHJvcDpmdW5jdGlvbihhLGMpe3RoaXMuX3BhcmVudFBhdGhWYWx1ZXNbYV09Yzt0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5mb3JFYWNoKGZ1bmN0aW9uKGQpe2Quc2V0KGEsYyl9LHRoaXMpfSxfZm9yd2FyZFBhcmVudFBhdGg6ZnVuY3Rpb24oYSwKYyl7dGhpcy5zZXQoWyJfcGFyZW50UGF0aFZhbHVlcyIsYV0sYyk7dGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbihkKXtkLm5vdGlmeVBhdGgoYSxjKX0sdGhpcyl9LF9mb3J3YXJkSG9zdFByb3BWMjpmdW5jdGlvbihhLGMpe3RoaXMuX2ZvcndhcmRQYXJlbnRQcm9wKGEsYyk7dGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMmJnRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmZvckVhY2goZnVuY3Rpb24oZCl7ZC5ub3RpZnlQYXRoKGEsYyl9LHRoaXMpfSxfdGVtcGxhdGVJbnN0YW5jZXNDaGFuZ2VkOmZ1bmN0aW9uKGEpe2lmKCJfdGVtcGxhdGVJbnN0YW5jZXMiPT09YS5wYXRoKXt2YXIgYz0wO3ZhciBkPXRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmxlbmd0aH1lbHNlIGlmKCJfdGVtcGxhdGVJbnN0YW5jZXMuc3BsaWNlcyI9PT1hLnBhdGgpYz1hLnZhbHVlLmluZGV4LGQ9YS52YWx1ZS5hZGRlZENvdW50O2Vsc2UgcmV0dXJuO09iamVjdC5rZXlzKHRoaXMuX3BhcmVudFBhdGhWYWx1ZXN8fAp7fSkuZm9yRWFjaChmdW5jdGlvbihmKXtmb3IodmFyIGc9YztnPGMrZDtnKyspdGhpcy5fdGVtcGxhdGVJbnN0YW5jZXNbZ10uc2V0KGYsdGhpcy5fcGFyZW50UGF0aFZhbHVlc1tmXSl9LHRoaXMpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXJvdy1kZXRhaWxzLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLlJvd0RldGFpbHNCZWhhdmlvcj17cHJvcGVydGllczp7ZXhwYW5kZWRJdGVtczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LGxpc3RlbmVyczp7InRlbXBsYXRlLWluc3RhbmNlLWNoYW5nZWQiOiJfdGVtcGxhdGVJbnN0YW5jZUNoYW5nZWRFeHBhbmRlZCJ9LG9ic2VydmVyczpbIl9leHBhbmRlZEl0ZW1zQ2hhbmdlZChleHBhbmRlZEl0ZW1zLiosIGRhdGFQcm92aWRlcikiLCJfcm93RGV0YWlsc1RlbXBsYXRlQ2hhbmdlZChfcm93RGV0YWlsc1RlbXBsYXRlKSJdLF9leHBhbmRlZEl0ZW1zQ2hhbmdlZDpmdW5jdGlvbihhLGMpe3ZvaWQgMCE9PWEmJnZvaWQgMCE9PWMmJih0aGlzLl9mbHVzaEl0ZW1zRGVib3VuY2VyKCksdGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEl0ZW1zJiZ0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMuZm9yRWFjaChmdW5jdGlvbihkKXtkLmV4cGFuZGVkPXRoaXMuX2lzRXhwYW5kZWQoZC5pdGVtKX0uYmluZCh0aGlzKSkpfSwKX3Jvd0RldGFpbHNUZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYSl7dmFyIGM9bmV3IHZhYWRpbi5lbGVtZW50cy5ncmlkLlRlbXBsYXRpemVyO2MuZGF0YUhvc3Q9dGhpcy5kYXRhSG9zdDtjLl9pbnN0YW5jZVByb3BzPXtleHBhbmRlZDohMCxpbmRleDohMCxpdGVtOiEwLHNlbGVjdGVkOiEwfTtQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLmFwcGVuZENoaWxkKGMpO2MudGVtcGxhdGU9YTthLnRlbXBsYXRpemVyPWN9LF9pc0V4cGFuZGVkOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmV4cGFuZGVkSXRlbXMmJi0xIT09dGhpcy5leHBhbmRlZEl0ZW1zLmluZGV4T2YoYSl9LGV4cGFuZEl0ZW06ZnVuY3Rpb24oYSl7dGhpcy5faXNFeHBhbmRlZChhKXx8dGhpcy5wdXNoKCJleHBhbmRlZEl0ZW1zIixhKX0sY29sbGFwc2VJdGVtOmZ1bmN0aW9uKGEpe3RoaXMuX2lzRXhwYW5kZWQoYSkmJnRoaXMuc3BsaWNlKCJleHBhbmRlZEl0ZW1zIix0aGlzLmV4cGFuZGVkSXRlbXMuaW5kZXhPZihhKSwxKX0sCl90ZW1wbGF0ZUluc3RhbmNlQ2hhbmdlZEV4cGFuZGVkOmZ1bmN0aW9uKGEpeyJleHBhbmRlZCI9PT1hLmRldGFpbC5wcm9wJiYoYS5kZXRhaWwudmFsdWU/dGhpcy5leHBhbmRJdGVtKGEuZGV0YWlsLmluc3QuaXRlbSk6dGhpcy5jb2xsYXBzZUl0ZW0oYS5kZXRhaWwuaW5zdC5pdGVtKSxhLnN0b3BQcm9wYWdhdGlvbigpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWRhdGEtcHJvdmlkZXItYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuRGF0YVByb3ZpZGVyQmVoYXZpb3I9e2xpc3RlbmVyczp7Iml0ZW0tY2hhbmdlZCI6Il90ZW1wbGF0ZUl0ZW1DaGFuZ2VkIn0scHJvcGVydGllczp7cGFnZVNpemU6e3R5cGU6TnVtYmVyLHZhbHVlOjUwLG9ic2VydmVyOiJfcGFnZVNpemVDaGFuZ2VkIn0sZGF0YVByb3ZpZGVyOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9kYXRhUHJvdmlkZXJDaGFuZ2VkIn0sX2xvYWRpbmc6Qm9vbGVhbixfY2FjaGU6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fSxfcGVuZGluZ1JlcXVlc3RzOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX19LF90ZW1wbGF0ZUl0ZW1DaGFuZ2VkOmZ1bmN0aW9uKGEpe3ZhciBjPWEuZGV0YWlsLml0ZW07QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChQb2x5bWVyLmRvbSh0aGlzLiQuaXRlbXMpLmNoaWxkcmVuLGZ1bmN0aW9uKGQpe2QuaXRlbT09PWMmJmQuaXRlcmF0ZUNlbGxzKGZ1bmN0aW9uKGYpe2YuX3RlbXBsYXRpemVyLl9zdXBwcmVzc0l0ZW1DaGFuZ2VFdmVudD0KITA7Zi5pbnN0YW5jZS5ub3RpZnlQYXRoKCJpdGVtLiIrYS5kZXRhaWwucGF0aCxhLmRldGFpbC52YWx1ZSk7Zi5fdGVtcGxhdGl6ZXIuX3N1cHByZXNzSXRlbUNoYW5nZUV2ZW50PSExfSl9KX0sX2dldENhY2hlZEl0ZW06ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fZ2V0UGFnZUZvckluZGV4KGEpLGQ9dGhpcy5fY2FjaGUmJnRoaXMuX2NhY2hlW2NdO3JldHVybiBkP2RbYS1jKnRoaXMucGFnZVNpemVdOm51bGx9LF9nZXRJdGVtOmZ1bmN0aW9uKGEsYyl7dGhpcy5fdXBkYXRlSXRlbShjLHRoaXMuX2dldENhY2hlZEl0ZW0oYSkpO3RoaXMuX2VhZ2VybHlMb2FkUGFnZXMoKTt2YXIgZD10aGlzLl91bmNhY2hlZFBhZ2VzRm9yUGh5c2ljYWxJdGVtcygpOzA8ZC5sZW5ndGgmJih0aGlzLl9sb2FkaW5nPSEwLHRoaXMuZGVib3VuY2UoImxvYWQiLGZ1bmN0aW9uKCl7ZC5mb3JFYWNoKGZ1bmN0aW9uKGYpe3RoaXMuX2xvYWRQYWdlKGYpfS5iaW5kKHRoaXMpKX0sMTAwKSl9LF9jYWNoZWRQYWdlc0ZvclBoeXNpY2FsSXRlbXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFnZXNGb3JQaHlzaWNhbEl0ZW1zKCkuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiB2b2lkIDAhPT0KdGhpcy5fY2FjaGUmJnZvaWQgMCE9PXRoaXMuX2NhY2hlW2FdfS5iaW5kKHRoaXMpKX0sX3VuY2FjaGVkUGFnZXNGb3JQaHlzaWNhbEl0ZW1zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhZ2VzRm9yUGh5c2ljYWxJdGVtcygpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fY2FjaGUmJnZvaWQgMD09PXRoaXMuX2NhY2hlW2FdfS5iaW5kKHRoaXMpKX0sX2VhZ2VybHlMb2FkUGFnZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9jYWNoZWRQYWdlc0ZvclBoeXNpY2FsSXRlbXMoKS5zbGljZSgwKTtpZigwPGEubGVuZ3RoKXthLnNvcnQoZnVuY3Rpb24oZCxmKXtyZXR1cm4gZD5mfSk7dmFyIGM9TWF0aC5taW4oYVthLmxlbmd0aC0xXSsxLE1hdGgubWF4KDAsTWF0aC5mbG9vcih0aGlzLnNpemUvdGhpcy5wYWdlU2l6ZSktMSkpO3RoaXMuX2xvYWRQYWdlKE1hdGgubWF4KDAsYVswXS0xKSk7dGhpcy5fbG9hZFBhZ2UoYyl9fSxfcGFnZXNGb3JQaHlzaWNhbEl0ZW1zOmZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMuX2dldFBhZ2VGb3JJbmRleCh0aGlzLiQuc2Nyb2xsZXIuZmlyc3RWaXNpYmxlSW5kZXgrCnRoaXMuJC5zY3JvbGxlci5fdmlkeE9mZnNldCldLmNvbmNhdCh0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLmluZGV4fSkubWFwKGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9nZXRQYWdlRm9ySW5kZXgoYS5pbmRleCl9LmJpbmQodGhpcykpKS5yZWR1Y2UoZnVuY3Rpb24oYSxjKXstMT09PWEuaW5kZXhPZihjKSYmYS5wdXNoKGMpO3JldHVybiBhfSxbXSl9LF91cGRhdGVJdGVtczpmdW5jdGlvbihhLGMpe2Zvcih2YXIgZD0wO2Q8dGhpcy5wYWdlU2l6ZTtkKyspe3ZhciBmPXRoaXMuJC5zY3JvbGxlci5fdmlydHVhbEluZGV4VG9JdGVtW2EqdGhpcy5wYWdlU2l6ZStkXTtmJiYodGhpcy5fdXBkYXRlSXRlbShmLGNbZF0pLHRoaXMuZGVib3VuY2UoInVwZGF0ZS1oZWlnaHRzIixmdW5jdGlvbigpe3RoaXMuJC5zY3JvbGxlci5fdXBkYXRlTWV0cmljcygpO3RoaXMuJC5zY3JvbGxlci5fcG9zaXRpb25JdGVtcygpO3RoaXMuJC5zY3JvbGxlci5fdXBkYXRlU2Nyb2xsZXJTaXplKCl9LAoxKSl9fSxfbG9hZFBhZ2U6ZnVuY3Rpb24oYSxjKXtjPWN8fHRoaXMuX3VwZGF0ZUl0ZW1zLmJpbmQodGhpcyk7aWYoIXRoaXMuX2NhY2hlW2FdJiYhdGhpcy5fcGVuZGluZ1JlcXVlc3RzW2FdJiZ0aGlzLmRhdGFQcm92aWRlcil7dGhpcy5fcGVuZGluZ1JlcXVlc3RzW2FdPSEwO3ZhciBkPXtwYWdlOmEscGFnZVNpemU6dGhpcy5wYWdlU2l6ZSxzb3J0T3JkZXJzOnRoaXMuX21hcFNvcnRlcnMoKSxmaWx0ZXJzOnRoaXMuX21hcEZpbHRlcnMoKX07dGhpcy5kYXRhUHJvdmlkZXIoZCxmdW5jdGlvbihmKXt0aGlzLl9jYWNoZVthXT1mO2RlbGV0ZSB0aGlzLl9wZW5kaW5nUmVxdWVzdHNbYV07YyhhLGYpO3RoaXMuX2xvYWRpbmc9MDx0aGlzLl9wZW5kaW5nUmVxdWVzdHMubGVuZ3RoO3RoaXMuZGVib3VuY2UoImNoZWNrLXNpemUiLHRoaXMuX2NoZWNrU2l6ZSwyRTMpfS5iaW5kKHRoaXMpKX19LF9nZXRQYWdlRm9ySW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguZmxvb3IoYS90aGlzLnBhZ2VTaXplKX0sCmNsZWFyQ2FjaGU6ZnVuY3Rpb24oKXt0aGlzLl9jYWNoZT17fTt0aGlzLl9wZW5kaW5nUmVxdWVzdHM9e307dGhpcy4kLnNjcm9sbGVyLmhhc0RhdGEmJnRoaXMuJC5zY3JvbGxlci5fdXBkYXRlKCk7dGhpcy5fZmx1c2hJdGVtc0RlYm91bmNlcigpfSxfZmx1c2hJdGVtc0RlYm91bmNlcjpmdW5jdGlvbigpe3RoaXMuZmx1c2hEZWJvdW5jZXIoImxvYWQiKX0sX3BhZ2VTaXplQ2hhbmdlZDpmdW5jdGlvbihhLGMpe3ZvaWQgMCE9PWMmJmEhPT1jJiZ0aGlzLmNsZWFyQ2FjaGUoKX0sX2NoZWNrU2l6ZTpmdW5jdGlvbigpe3ZvaWQgMD09PXRoaXMuc2l6ZSYmY29uc29sZS53YXJuKCdUaGUgXHgzY3ZhYWRpbi1ncmlkXHgzZSBuZWVkcyBhIHZhbHVlIGZvciAic2l6ZSIgcHJvcGVydHkgaW4gb3JkZXIgdG8gZGlzcGxheSByb3dzLicpfSxfZGF0YVByb3ZpZGVyQ2hhbmdlZDpmdW5jdGlvbihhLGMpe3ZvaWQgMCE9PWMmJnRoaXMuY2xlYXJDYWNoZSgpO3RoaXMuJC5zY3JvbGxlci5oYXNEYXRhfHwKKHRoaXMuX2xvYWRpbmc9ITAsdGhpcy5fbG9hZFBhZ2UoMCxmdW5jdGlvbigpe3RoaXMuJC5zY3JvbGxlci5oYXNEYXRhPSEwfS5iaW5kKHRoaXMpKSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1zZWxlY3Rpb24tYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuU2VsZWN0aW9uQmVoYXZpb3I9e3Byb3BlcnRpZXM6e3NlbGVjdGVkSXRlbXM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LG9ic2VydmVyczpbIl9zZWxlY3RlZEl0ZW1zQ2hhbmdlZChzZWxlY3RlZEl0ZW1zLiopIl0sbGlzdGVuZXJzOnsidGVtcGxhdGUtaW5zdGFuY2UtY2hhbmdlZCI6Il90ZW1wbGF0ZUluc3RhbmNlQ2hhbmdlZFNlbGVjdGlvbiJ9LF90ZW1wbGF0ZUluc3RhbmNlQ2hhbmdlZFNlbGVjdGlvbjpmdW5jdGlvbihhKXtpZigic2VsZWN0ZWQiPT09YS5kZXRhaWwucHJvcCl7dmFyIGM9YS5kZXRhaWwuaW5zdC5pdGVtOyh0aGlzLl9pc1NlbGVjdGVkKGMpP3RoaXMuZGVzZWxlY3RJdGVtOnRoaXMuc2VsZWN0SXRlbSkuYmluZCh0aGlzKShjKTt0aGlzLmZpcmUoImlyb24tYW5ub3VuY2UiLHt0ZXh0Oih0aGlzLl9pc1NlbGVjdGVkKGMpPyJTZWxlY3RlZCI6IkRlc2VsZWN0ZWQiKSsiIFJvdyAiKwooYS5kZXRhaWwuaW5zdC5pbmRleCsxKSsiIG9mICIrdGhpcy5zaXplfSk7YS5zdG9wUHJvcGFnYXRpb24oKX19LF9pc1NlbGVjdGVkOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNlbGVjdGVkSXRlbXMmJi0xPHRoaXMuc2VsZWN0ZWRJdGVtcy5pbmRleE9mKGEpfSxzZWxlY3RJdGVtOmZ1bmN0aW9uKGEpe2E9dGhpcy5fdGFrZUl0ZW0oYSk7dGhpcy5faXNTZWxlY3RlZChhKXx8dGhpcy5wdXNoKCJzZWxlY3RlZEl0ZW1zIixhKX0sZGVzZWxlY3RJdGVtOmZ1bmN0aW9uKGEpe2E9dGhpcy5fdGFrZUl0ZW0oYSk7YT10aGlzLnNlbGVjdGVkSXRlbXMuaW5kZXhPZihhKTstMTxhJiZ0aGlzLnNwbGljZSgic2VsZWN0ZWRJdGVtcyIsYSwxKX0sX3RvZ2dsZUl0ZW06ZnVuY3Rpb24oYSl7YT10aGlzLl90YWtlSXRlbShhKTstMT09PXRoaXMuc2VsZWN0ZWRJdGVtcy5pbmRleE9mKGEpP3RoaXMuc2VsZWN0SXRlbShhKTp0aGlzLmRlc2VsZWN0SXRlbShhKX0sX3Rha2VJdGVtOmZ1bmN0aW9uKGEpe3JldHVybiJudW1iZXIiPT09CnR5cGVvZiBhJiYwPD1hJiZ0aGlzLml0ZW1zJiZ0aGlzLml0ZW1zLmxlbmd0aD5hP3RoaXMuaXRlbXNbYV06YX0sX3NlbGVjdGVkSXRlbXNDaGFuZ2VkOmZ1bmN0aW9uKGEpeyF0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXN8fCJzZWxlY3RlZEl0ZW1zIiE9PWEucGF0aCYmInNlbGVjdGVkSXRlbXMuc3BsaWNlcyIhPT1hLnBhdGh8fHRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGMpe2Muc2VsZWN0ZWQ9dGhpcy5faXNTZWxlY3RlZChjLml0ZW0pfS5iaW5kKHRoaXMpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWtleWJvYXJkLW5hdmlnYXRpb24tYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVLZXlib2FyZEJlaGF2aW9ySW1wbD17aG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImFwcGxpY2F0aW9uIix0YWJpbmRleDowfSxrZXlCaW5kaW5nczp7ImN0cmwraG9tZSI6Il9vbkN0cmxIb21lIiwiY3RybCtlbmQiOiJfb25DdHJsRW5kIixkb3duOiJfb25BcnJvd0Rvd24iLGVuZDoiX29uRW5kIixlbnRlcjoiX29uRW50ZXIiLGVzYzoiX29uRXNjYXBlIixmMjoiX29uRjIiLGhvbWU6Il9vbkhvbWUiLGxlZnQ6Il9vbkFycm93TGVmdCIscGFnZWRvd246Il9vblBhZ2VEb3duIixwYWdldXA6Il9vblBhZ2VVcCIscmlnaHQ6Il9vbkFycm93UmlnaHQiLHNwYWNlOiJfb25TcGFjZSIsdGFiOiJfb25UYWIiLHVwOiJfb25BcnJvd1VwIn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLnJlcXVlc3RBdmFpbGFiaWxpdHkoKX0scHJvcGVydGllczp7X3ZpcnR1YWxGb2N1czp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il92aXJ0dWFsRm9jdXNDaGFuZ2VkIn0sCmludGVyYWN0aW5nOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExfSxuYXZpZ2F0aW5nOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExfX0sbGlzdGVuZXJzOntmb2N1czoiX29uRm9jdXMiLCJjZWxsLWZvY3VzIjoiX29uQ2VsbEZvY3VzIiwiY2VsbC1jb250ZW50LWZvY3VzIjoiX29uQ2VsbENvbnRlbnRGb2N1cyJ9LHJlYWR5OmZ1bmN0aW9uKCl7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oYSl7OT09PWEua2V5Q29kZSYmKHRoaXMuX3RhYmJlZD0hMCk7OT09PWEua2V5Q29kZSYmYS5zaGlmdEtleSYmKHRoaXMuX3NoaWZ0VGFiYmVkPSEwKX0uYmluZCh0aGlzKSwhMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLGZ1bmN0aW9uKGEpezk9PT1hLmtleUNvZGUmJih0aGlzLl90YWJiZWQ9ITEpOzk9PT1hLmtleUNvZGUmJmEuc2hpZnRLZXkmJih0aGlzLl9zaGlmdFRhYmJlZD0KITEpfS5iaW5kKHRoaXMpLCEwKX0sX2lzRm9vdGVyVmlzaWJsZTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuJC5mb290ZXIuX3Jvd3MuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiFhLmhpZGRlbn0pLmxlbmd0aH0sX29uRm9jdXM6ZnVuY3Rpb24oKXt0aGlzLl90YWJiZWQmJiF0aGlzLl9zaGlmdFRhYmJlZCYmdGhpcy5fYWN0aXZhdGVOYXZpZ2F0aW9uKCl9LF9hY3RpdmF0ZU5hdmlnYXRpb246ZnVuY3Rpb24oKXt0aGlzLiQuZm9vdGVyRm9jdXNUcmFwLmZvY3VzKCl9LF9vbkZvY3Vzb3V0OmZ1bmN0aW9uKCl7dGhpcy5pbnRlcmFjdGluZz10aGlzLm5hdmlnYXRpbmc9ITF9LF9vbkZvb3RlckZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5uYXZpZ2F0aW5nPSEwO3RoaXMuaW50ZXJhY3Rpbmc9ITE7dGhpcy5fdmlydHVhbEZvY3VzPXRoaXMuX3ZpcnR1YWxGb2N1c3x8KHRoaXMuX3NoaWZ0VGFiYmVkP3RoaXMuX2lzRm9vdGVyVmlzaWJsZSgpP3RoaXMuJC5mb290ZXI6dGhpcy4kLml0ZW1zOgp0aGlzLiQuaGVhZGVyKX0sX3ZpcnR1YWxGb2N1c0NoYW5nZWQ6ZnVuY3Rpb24oYSxjKXtjJiYoYy5mb2N1c2VkPSExKTthJiYoYS5fZm9jdXNlZENlbGxJbmRleD1hLl9mb2N1c2VkQ2VsbEluZGV4fHwwLGEuX2ZvY3VzZWRSb3dJbmRleD1hLl9mb2N1c2VkUm93SW5kZXh8fDAsYS5mb2N1c2VkPSEwLGE9PT10aGlzLiQuaXRlbXMmJnRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSl9LF9vblRhYjpmdW5jdGlvbihhKXtpZighdGhpcy5pbnRlcmFjdGluZyYmdGhpcy5fdmlydHVhbEZvY3VzKWlmKHRoaXMubmF2aWdhdGluZylpZihhLmRldGFpbC5rZXlib2FyZEV2ZW50LnNoaWZ0S2V5KXN3aXRjaCh0aGlzLl92aXJ0dWFsRm9jdXMpe2Nhc2UgdGhpcy4kLmZvb3Rlcjp0aGlzLl92aXJ0dWFsRm9jdXM9dGhpcy4kLml0ZW1zO2EucHJldmVudERlZmF1bHQoKTticmVhaztjYXNlIHRoaXMuJC5pdGVtczp0aGlzLl92aXJ0dWFsRm9jdXM9dGhpcy4kLmhlYWRlcjthLnByZXZlbnREZWZhdWx0KCk7CmJyZWFrO2Nhc2UgdGhpcy4kLmhlYWRlcjp0aGlzLmZvY3VzKCksdGhpcy5fdmlydHVhbEZvY3VzPW51bGx9ZWxzZSBzd2l0Y2godGhpcy5fdmlydHVhbEZvY3VzKXtjYXNlIHRoaXMuJC5oZWFkZXI6dGhpcy5fdmlydHVhbEZvY3VzPXRoaXMuJC5pdGVtczthLnByZXZlbnREZWZhdWx0KCk7YnJlYWs7Y2FzZSB0aGlzLiQuaXRlbXM6dGhpcy5faXNGb290ZXJWaXNpYmxlKCk/KHRoaXMuX3ZpcnR1YWxGb2N1cz10aGlzLiQuZm9vdGVyLGEucHJldmVudERlZmF1bHQoKSk6dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuX3ZpcnR1YWxGb2N1cz1udWxsfSwxKTticmVhaztjYXNlIHRoaXMuJC5mb290ZXI6dGhpcy5fdmlydHVhbEZvY3VzPW51bGx9ZWxzZSB0aGlzLl9hY3RpdmF0ZU5hdmlnYXRpb24oKSxhLnByZXZlbnREZWZhdWx0KCl9LF9pc0Fib3ZlVmlld3BvcnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZmlyc3RWaXNpYmxlSW5kZXg+YX0sX29uQXJyb3dEb3duOmZ1bmN0aW9uKGEpe3RoaXMuaW50ZXJhY3Rpbmd8fAooYS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNEb3duKCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX3Njcm9sbFBhZ2VEb3duOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kLmhlYWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPXRoaXMuJC5mb290ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsVG9wKz1jLnRvcC1hLmJvdHRvbTt0aGlzLiQuc2Nyb2xsZXIuX3Njcm9sbEhhbmRsZXIoKX0sX29uUGFnZURvd246ZnVuY3Rpb24oYSl7dGhpcy5pbnRlcmFjdGluZ3x8KGEucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzPT09dGhpcy4kLml0ZW1zPyhhPXRoaXMuJC5zY3JvbGxlci5sYXN0VmlzaWJsZUluZGV4LHRoaXMuX3Njcm9sbFBhZ2VEb3duKCksdGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkUm93SW5kZXgrPQp0aGlzLiQuc2Nyb2xsZXIubGFzdFZpc2libGVJbmRleC1hfHx0aGlzLiQuc2Nyb2xsZXIubGFzdFZpc2libGVJbmRleC10aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3dJbmRleCx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpOnRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c1BhZ2VEb3duKCkpfSxfc2Nyb2xsUGFnZVVwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kLmhlYWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPXRoaXMuJC5mb290ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsVG9wLT1jLnRvcC1hLmJvdHRvbTt0aGlzLiQuc2Nyb2xsZXIuX3Njcm9sbEhhbmRsZXIoKX0sX29uUGFnZVVwOmZ1bmN0aW9uKGEpe3RoaXMuaW50ZXJhY3Rpbmd8fChhLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cz09PXRoaXMuJC5pdGVtcz8oYT10aGlzLiQuc2Nyb2xsZXIubGFzdFZpc2libGVJbmRleCwKdGhpcy5fc2Nyb2xsUGFnZVVwKCksdGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkUm93SW5kZXgtPWEtdGhpcy4kLnNjcm9sbGVyLmxhc3RWaXNpYmxlSW5kZXh8fHRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZFJvd0luZGV4LHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSk6dGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzUGFnZVVwKCkpfSxfb25BcnJvd1VwOmZ1bmN0aW9uKGEpe3RoaXMuaW50ZXJhY3Rpbmd8fChhLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c1VwKCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uQXJyb3dSaWdodDpmdW5jdGlvbihhKXt0aGlzLmludGVyYWN0aW5nfHwoYS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNSaWdodCgpLHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSl9LApfb25BcnJvd0xlZnQ6ZnVuY3Rpb24oYSl7dGhpcy5pbnRlcmFjdGluZ3x8KGEucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzTGVmdCgpLHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSl9LF9vbkhvbWU6ZnVuY3Rpb24oYSl7dGhpcy5pbnRlcmFjdGluZ3x8KGEucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzSG9tZSgpLHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSl9LF9vbkVuZDpmdW5jdGlvbihhKXt0aGlzLmludGVyYWN0aW5nfHwoYS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNFbmQoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfbW92ZUZvY3VzVG9Gb2N1c1RhcmdldDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZENlbGwuX2NlbGxDb250ZW50OwooYT1hLnF1ZXJ5U2VsZWN0b3IoIltmb2N1cy10YXJnZXRdIil8fGEuZmlyc3RFbGVtZW50Q2hpbGQpJiZhLmZvY3VzKCl9LF9vbkVudGVyOmZ1bmN0aW9uKGEpe3RoaXMuaW50ZXJhY3Rpbmc/ImlucHV0Ij09PWEuZGV0YWlsLmtleWJvYXJkRXZlbnQudGFyZ2V0LmxvY2FsTmFtZSYmInRleHQiPT09YS5kZXRhaWwua2V5Ym9hcmRFdmVudC50YXJnZXQudHlwZSYmdGhpcy4kLmZvb3RlckZvY3VzVHJhcC5mb2N1cygpOihhLnByZXZlbnREZWZhdWx0KCksdGhpcy5fbW92ZUZvY3VzVG9Gb2N1c1RhcmdldCgpKX0sX29uRXNjYXBlOmZ1bmN0aW9uKCl7dGhpcy5pbnRlcmFjdGluZz90aGlzLiQuZm9vdGVyRm9jdXNUcmFwLmZvY3VzKCk6dGhpcy5uYXZpZ2F0aW5nJiYodGhpcy5uYXZpZ2F0aW5nPSExKX0sX29uRjI6ZnVuY3Rpb24oYSl7YS5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuaW50ZXJhY3Rpbmc/dGhpcy4kLmZvb3RlckZvY3VzVHJhcC5mb2N1cygpOnRoaXMuX21vdmVGb2N1c1RvRm9jdXNUYXJnZXQoKX0sCl9vbkN0cmxIb21lOmZ1bmN0aW9uKGEpe3RoaXMuaW50ZXJhY3Rpbmd8fChhLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0ZpcnN0KCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uQ3RybEVuZDpmdW5jdGlvbihhKXt0aGlzLmludGVyYWN0aW5nfHwoYS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNMYXN0KCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uU3BhY2U6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuaW50ZXJhY3Rpbmcpe2EucHJldmVudERlZmF1bHQoKTthPXRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZENlbGw7dmFyIGM9YS5nZXRDb250ZW50Q2hpbGRyZW4oUG9seW1lci5FbGVtZW50PyJzbG90IjoiY29udGVudCIpWzBdLmZpcnN0RWxlbWVudENoaWxkO2M/Yy5jbGljaygpOnRoaXMubmF2aWdhdGluZyYmCnRoaXMuZmlyZSgiY2VsbC1hY3RpdmF0ZSIse21vZGVsOmEuaW5zdGFuY2V9KX19LF9vbkNlbGxDb250ZW50Rm9jdXM6ZnVuY3Rpb24oYSl7dGhpcy5pbnRlcmFjdGluZz0hMDt0aGlzLl9vbkNlbGxGb2N1cyhhKX0sX29uQ2VsbEZvY3VzOmZ1bmN0aW9uKGEpe2E9YS5kZXRhaWwuY2VsbDt2YXIgYz1hLnBhcmVudEVsZW1lbnQsZD1jLnBhcmVudEVsZW1lbnQsZj1BcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKFBvbHltZXIuZG9tKGQpLmNoaWxkcmVuLGMpO2Q9PT10aGlzLiQuaXRlbXMmJihmPWMuaW5kZXgpO2QuX2ZvY3VzZWRSb3dJbmRleD1mO2QuX2ZvY3VzZWRDZWxsSW5kZXg9QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChQb2x5bWVyLmRvbShjKS5jaGlsZHJlbixhKTt0aGlzLl92aXJ0dWFsRm9jdXM9ZDthLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSYmKGQuX2ZvY3VzZWRDZWxsSW5kZXg9MCxkLl9tb3ZlRm9jdXNUb0RldGFpbHNDZWxsKCkpfSxfZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydDpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLiQuc2Nyb2xsZXIuX3ZpZHhPZmZzZXQrdGhpcy4kLnNjcm9sbGVyLl92aXJ0dWFsU3RhcnQsYz10aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3dJbmRleDt0aGlzLl92aXJ0dWFsRm9jdXM9PT10aGlzLiQuaXRlbXMmJihjPGF8fGM+YSt0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsQ291bnQpJiYodGhpcy4kLnNjcm9sbGVyLnNjcm9sbFRvU2NhbGVkSW5kZXgoYyksdGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkQ2VsbENoYW5nZWQoYyx0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRDZWxsSW5kZXgpKTt0aGlzLl9lbnN1cmVFbGVtZW50SW5WaWV3cG9ydCh0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRDZWxsKX0sX2Vuc3VyZUVsZW1lbnRJblZpZXdwb3J0OmZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYodGhpcy5fdmlydHVhbEZvY3VzPT09dGhpcy4kLml0ZW1zKXt2YXIgZD10aGlzLiQuZm9vdGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCwKZj10aGlzLiQuaGVhZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTtjLmJvdHRvbT5kP3RoaXMuJC5zY3JvbGxlci4kLnRhYmxlLnNjcm9sbFRvcCs9Yy5ib3R0b20tZDpjLnRvcDxmJiYodGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsVG9wKz1jLnRvcC1mKX1pZighYS5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIikpe2E9dGhpcy4kLnNjcm9sbGVyLiQudGFibGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQ7ZD10aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O2lmKGY9dGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkUm93LnF1ZXJ5U2VsZWN0b3IoIltsYXN0LWZyb3plbl0iKSlkPWYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQ7Yy5yaWdodD5hP3RoaXMuJC5zY3JvbGxlci4kLnRhYmxlLnNjcm9sbExlZnQrPWMucmlnaHQtYTpjLmxlZnQ8ZCYmKHRoaXMuJC5zY3JvbGxlci4kLnRhYmxlLnNjcm9sbExlZnQrPQpjLmxlZnQtZCl9fX07dmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVLZXlib2FyZEJlaGF2aW9yPVt2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUtleWJvYXJkQmVoYXZpb3JJbXBsLFBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3JdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWNvbHVtbi1yZW9yZGVyaW5nLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307dmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uUmVvcmRlcmluZ0JlaGF2aW9yPXtwcm9wZXJ0aWVzOntjb2x1bW5SZW9yZGVyaW5nQWxsb3dlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX19Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUNvbHVtblJlb3JkZXJpbmdCZWhhdmlvcj17cHJvcGVydGllczp7X29yZGVyQmFzZVNjb3BlOnt0eXBlOk51bWJlcix2YWx1ZToxRTd9fSxsaXN0ZW5lcnM6e2RyYWdzdGFydDoiX29uRHJhZ1N0YXJ0IixkcmFnb3ZlcjoiX29uRHJhZ092ZXIiLGRyYWdlbmQ6Il9vbkRyYWdFbmQifSxvYnNlcnZlcnM6WyJfdXBkYXRlT3JkZXJzKGNvbHVtblRyZWUsIGNvbHVtblRyZWUuKikiXSxfdXBkYXRlT3JkZXJzOmZ1bmN0aW9uKGEsYyl7dm9pZCAwIT09YSYmdm9pZCAwIT09YyYmYVswXS5mb3JFYWNoKGZ1bmN0aW9uKGQsZil7ZC5fb3JkZXI9KGYrMSkqdGhpcy5fb3JkZXJCYXNlU2NvcGV9LHRoaXMpfSxfb25EcmFnU3RhcnQ6ZnVuY3Rpb24oYSl7aWYoInZhYWRpbi1ncmlkLWNlbGwtY29udGVudCI9PT1hLnRhcmdldC5sb2NhbE5hbWUpe3ZhciBjPXRoaXMuX2dldENlbGxCeUNlbGxDb250ZW50KGEudGFyZ2V0KTtjJiYodGhpcy50b2dnbGVBdHRyaWJ1dGUoInJlb3JkZXJpbmciLAohMCksdGhpcy5fZHJhZ2dlZENvbHVtbj1jLmNvbHVtbix0aGlzLl9zZXRTaWJsaW5nc1Jlb3JkZXJTdGF0dXModGhpcy5fZHJhZ2dlZENvbHVtbiwiYWxsb3dlZCIpLHRoaXMuX2RyYWdnZWRDb2x1bW4uX3Jlb3JkZXJTdGF0dXM9ImRyYWdnaW5nIixhLmRhdGFUcmFuc2ZlciYmKGEuZGF0YVRyYW5zZmVyLnNldERhdGEoInRleHQiLCIiKSxhLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkPSJtb3ZlIiksdGhpcy5fYXV0b1Njcm9sbGVyKCkpfX0sX3NldFNpYmxpbmdzUmVvcmRlclN0YXR1czpmdW5jdGlvbihhLGMpe0FycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChQb2x5bWVyLmRvbShQb2x5bWVyLmRvbShhKS5wYXJlbnROb2RlKS5jaGlsZHJlbixmdW5jdGlvbihkKXtyZXR1cm4vY29sdW1uLy50ZXN0KGQubG9jYWxOYW1lKSYmdGhpcy5faXNTd2FwQWxsb3dlZChkLGEpfSx0aGlzKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2QuX3Jlb3JkZXJTdGF0dXM9Y30pfSxfb25EcmFnT3ZlcjpmdW5jdGlvbihhKXtpZih0aGlzLl9kcmFnZ2VkQ29sdW1uKXt2YXIgYz0KKFBvbHltZXIuRWxlbWVudD9hLmNvbXBvc2VkUGF0aCgpOlBvbHltZXIuZG9tKGEpLnBhdGgpLmZpbHRlcihmdW5jdGlvbihkKXtyZXR1cm4idmFhZGluLWdyaWQtY2VsbC1jb250ZW50Ij09PWQubG9jYWxOYW1lfSlbMF07YyYmKGEucHJldmVudERlZmF1bHQoKSxjPXRoaXMuX2dldENlbGxCeUNlbGxDb250ZW50KGMpLChjPXRoaXMuX2dldFRhcmdldENvbHVtbihjLHRoaXMuX2RyYWdnZWRDb2x1bW4pKSYmdGhpcy5faXNTd2FwQWxsb3dlZCh0aGlzLl9kcmFnZ2VkQ29sdW1uLGMpJiZ0aGlzLl9pc1N3YXBwYWJsZUJ5UG9zaXRpb24oYyxhLmNsaWVudFgpJiZ0aGlzLl9zd2FwQ29sdW1uT3JkZXJzKHRoaXMuX2RyYWdnZWRDb2x1bW4sYyksdGhpcy5fbGFzdERyYWdDbGllbnRYPWEuY2xpZW50WCl9fSxfYXV0b1Njcm9sbGVyOmZ1bmN0aW9uKCl7aWYodGhpcy5fbGFzdERyYWdDbGllbnRYKXt2YXIgYT10aGlzLl9sYXN0RHJhZ0NsaWVudFgtdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCsKNTAsYz10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtdGhpcy5fbGFzdERyYWdDbGllbnRYKzUwOzA8YT90aGlzLiQudGFibGUuc2Nyb2xsTGVmdCs9YS8xMDowPGMmJih0aGlzLiQudGFibGUuc2Nyb2xsTGVmdC09Yy8xMCk7dGhpcy5fc2Nyb2xsSGFuZGxlcigpfXRoaXMuX2RyYWdnZWRDb2x1bW4mJnRoaXMuYXN5bmModGhpcy5fYXV0b1Njcm9sbGVyLDEwKX0sX29uRHJhZ0VuZDpmdW5jdGlvbigpe3RoaXMuX2RyYWdnZWRDb2x1bW4mJih0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgicmVvcmRlcmluZyIsITEpLHRoaXMuX2RyYWdnZWRDb2x1bW4uX3Jlb3JkZXJTdGF0dXM9IiIsdGhpcy5fc2V0U2libGluZ3NSZW9yZGVyU3RhdHVzKHRoaXMuX2RyYWdnZWRDb2x1bW4sIiIpLHRoaXMuX2xhc3REcmFnQ2xpZW50WD10aGlzLl9kcmFnZ2VkQ29sdW1uPW51bGwpfSxfaXNTd2FwQWxsb3dlZDpmdW5jdGlvbihhLGMpe2lmKGEmJmMpe3ZhciBkPWEucGFyZW50RWxlbWVudD09PWMucGFyZW50RWxlbWVudCwKZj1hLmZyb3plbj09PWMuZnJvemVuO3JldHVybiBhIT09YyYmZCYmZn19LF9pc1N3YXBwYWJsZUJ5UG9zaXRpb246ZnVuY3Rpb24oYSxjKXt2YXIgZD1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoUG9seW1lci5kb20odGhpcy4kLmhlYWRlcikucXVlcnlTZWxlY3RvckFsbCgiLnZhYWRpbi1ncmlkLWNlbGwiKSxmdW5jdGlvbihnKXtyZXR1cm4gZy5jb2x1bW49PT1hfSlbMF0sZj10aGlzLiQuaGVhZGVyLnF1ZXJ5U2VsZWN0b3IoIltyZW9yZGVyLXN0YXR1c1x4M2RkcmFnZ2luZ10iKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4gZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0PmYubGVmdD9jPmQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQtZi53aWR0aDpjPGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCtmLndpZHRofSxfZ2V0Q2VsbEJ5Q2VsbENvbnRlbnQ6ZnVuY3Rpb24oYSl7aWYoUG9seW1lci5FbGVtZW50KXJldHVybiBhLmFzc2lnbmVkU2xvdC5wYXJlbnROb2RlOwphPVBvbHltZXIuZG9tKGEpLmdldERlc3RpbmF0aW9uSW5zZXJ0aW9uUG9pbnRzKClbMF07cmV0dXJuIFBvbHltZXIuZG9tKGEpLnBhcmVudE5vZGV9LF9zd2FwQ29sdW1uT3JkZXJzOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9YS5fb3JkZXI7YS5fb3JkZXI9Yy5fb3JkZXI7Yy5fb3JkZXI9ZDt0aGlzLl91cGRhdGVMYXN0RnJvemVuKCk7dGhpcy5fdXBkYXRlTGFzdENvbHVtbigpfSxfZ2V0VGFyZ2V0Q29sdW1uOmZ1bmN0aW9uKGEsYyl7aWYoYSYmYyl7Zm9yKHZhciBkPWEuY29sdW1uO2QucGFyZW50RWxlbWVudCE9PWMucGFyZW50RWxlbWVudCYmZCE9PXRoaXMudGFyZ2V0OylkPWQucGFyZW50RWxlbWVudDtyZXR1cm4gZC5wYXJlbnRFbGVtZW50PT09Yy5wYXJlbnRFbGVtZW50P2Q6YS5jb2x1bW59fX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvaXJvbi1saXN0LWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLklyb25MaXN0QmVoYXZpb3JJbXBsPWZ1bmN0aW9uKCl7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpob25lfGFkOyg/OiBVOyk/IENQVSkgT1MgKFxkKykvKSxjPWEmJjg8PWFbMV07cmV0dXJue2lzOiJpcm9uLWxpc3QiLHByb3BlcnRpZXM6e21heFBoeXNpY2FsQ291bnQ6e3R5cGU6TnVtYmVyLHZhbHVlOjUwMH0sYXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpdGVtIn0saW5kZXhBczp7dHlwZTpTdHJpbmcsdmFsdWU6ImluZGV4In19LF9yYXRpbzouNSxfc2Nyb2xsZXJQYWRkaW5nVG9wOjAsX3Njcm9sbFBvc2l0aW9uOjAsX3BoeXNpY2FsU2l6ZTowLF9waHlzaWNhbEF2ZXJhZ2U6MCxfcGh5c2ljYWxBdmVyYWdlQ291bnQ6MCxfcGh5c2ljYWxUb3A6MCxfdmlydHVhbENvdW50OjAsX3BoeXNpY2FsSW5kZXhGb3JLZXk6bnVsbCxfZXN0U2Nyb2xsSGVpZ2h0OjAsX3Njcm9sbEhlaWdodDowLF92aWV3cG9ydEhlaWdodDowLF92aWV3cG9ydFdpZHRoOjAsCl9waHlzaWNhbEl0ZW1zOm51bGwsX3BoeXNpY2FsU2l6ZXM6bnVsbCxfZmlyc3RWaXNpYmxlSW5kZXhWYWw6bnVsbCxfbGFzdFZpc2libGVJbmRleFZhbDpudWxsLF9jb2xsZWN0aW9uOm51bGwsX2l0ZW1zUmVuZGVyZWQ6ITEsX2xhc3RQYWdlOm51bGwsX21heFBhZ2VzOjMsX2l0ZW1zUGVyUm93OjEsX2l0ZW1XaWR0aDowLF9yb3dIZWlnaHQ6MCxnZXQgX3BoeXNpY2FsQm90dG9tKCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3BoeXNpY2FsU2l6ZX0sZ2V0IF9zY3JvbGxCb3R0b20oKXtyZXR1cm4gdGhpcy5fc2Nyb2xsUG9zaXRpb24rdGhpcy5fdmlld3BvcnRIZWlnaHR9LGdldCBfdmlydHVhbEVuZCgpe3JldHVybiB0aGlzLl92aXJ0dWFsU3RhcnQrdGhpcy5fcGh5c2ljYWxDb3VudC0xfSxnZXQgX2hpZGRlbkNvbnRlbnRTaXplKCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsU2l6ZS10aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF9tYXhTY3JvbGxUb3AoKXtyZXR1cm4gdGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LQp0aGlzLl92aWV3cG9ydEhlaWdodCt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3B9LF9taW5WaXJ0dWFsU3RhcnQ6MCxnZXQgX21heFZpcnR1YWxTdGFydCgpe3JldHVybiBNYXRoLm1heCgwLHRoaXMuX3ZpcnR1YWxDb3VudC10aGlzLl9waHlzaWNhbENvdW50KX0sX3ZpcnR1YWxTdGFydFZhbDowLHNldCBfdmlydHVhbFN0YXJ0KGQpe3RoaXMuX3ZpcnR1YWxTdGFydFZhbD1NYXRoLm1pbih0aGlzLl9tYXhWaXJ0dWFsU3RhcnQsTWF0aC5tYXgodGhpcy5fbWluVmlydHVhbFN0YXJ0LGQpKX0sZ2V0IF92aXJ0dWFsU3RhcnQoKXtyZXR1cm4gdGhpcy5fdmlydHVhbFN0YXJ0VmFsfHwwfSxfcGh5c2ljYWxTdGFydFZhbDowLHNldCBfcGh5c2ljYWxTdGFydChkKXt0aGlzLl9waHlzaWNhbFN0YXJ0VmFsPWQldGhpcy5fcGh5c2ljYWxDb3VudDswPnRoaXMuX3BoeXNpY2FsU3RhcnRWYWwmJih0aGlzLl9waHlzaWNhbFN0YXJ0VmFsPXRoaXMuX3BoeXNpY2FsQ291bnQrdGhpcy5fcGh5c2ljYWxTdGFydFZhbCk7CnRoaXMuX3BoeXNpY2FsRW5kPSh0aGlzLl9waHlzaWNhbFN0YXJ0K3RoaXMuX3BoeXNpY2FsQ291bnQtMSkldGhpcy5fcGh5c2ljYWxDb3VudH0sZ2V0IF9waHlzaWNhbFN0YXJ0KCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsU3RhcnRWYWx8fDB9LF9waHlzaWNhbENvdW50VmFsOjAsc2V0IF9waHlzaWNhbENvdW50KGQpe3RoaXMuX3BoeXNpY2FsQ291bnRWYWw9ZDt0aGlzLl9waHlzaWNhbEVuZD0odGhpcy5fcGh5c2ljYWxTdGFydCt0aGlzLl9waHlzaWNhbENvdW50LTEpJXRoaXMuX3BoeXNpY2FsQ291bnR9LGdldCBfcGh5c2ljYWxDb3VudCgpe3JldHVybiB0aGlzLl9waHlzaWNhbENvdW50VmFsfSxfcGh5c2ljYWxFbmQ6MCxnZXQgX29wdFBoeXNpY2FsU2l6ZSgpe3JldHVybiB0aGlzLl92aWV3cG9ydEhlaWdodCp0aGlzLl9tYXhQYWdlc30sZ2V0IF9vcHRQaHlzaWNhbENvdW50KCl7cmV0dXJuIHRoaXMuX2VzdFJvd3NJblZpZXcqdGhpcy5faXRlbXNQZXJSb3cqdGhpcy5fbWF4UGFnZXN9LApnZXQgX2lzVmlzaWJsZSgpe3JldHVybiB0aGlzLnNjcm9sbFRhcmdldCYmISghdGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0V2lkdGgmJiF0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRIZWlnaHQpfSxnZXQgZmlyc3RWaXNpYmxlSW5kZXgoKXtpZihudWxsPT09dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWwpe3ZhciBkPU1hdGguZmxvb3IodGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wKTt0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD10aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24oZixnKXtkKz10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQoZik7aWYoZD50aGlzLl9zY3JvbGxQb3NpdGlvbilyZXR1cm4gZ30pfHwwfXJldHVybiB0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbH0sZ2V0IGxhc3RWaXNpYmxlSW5kZXgoKXtpZihudWxsPT09dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbCl7dmFyIGQ9dGhpcy5fcGh5c2ljYWxUb3A7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKGYsCmcpe2lmKGQ8dGhpcy5fc2Nyb2xsQm90dG9tKXRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9ZztlbHNlIHJldHVybiEwO2QrPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChmKX0pfXJldHVybiB0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsfSxnZXQgX2RlZmF1bHRTY3JvbGxUYXJnZXQoKXtyZXR1cm4gdGhpc30sZ2V0IF92aXJ0dWFsUm93Q291bnQoKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuX3ZpcnR1YWxDb3VudC90aGlzLl9pdGVtc1BlclJvdyl9LGdldCBfZXN0Um93c0luVmlldygpe3JldHVybiBNYXRoLmNlaWwodGhpcy5fdmlld3BvcnRIZWlnaHQvdGhpcy5fcm93SGVpZ2h0KX0sZ2V0IF9waHlzaWNhbFJvd3MoKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuX3BoeXNpY2FsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMudXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzKCk7dGhpcy5fcmVuZGVyKCk7dGhpcy5saXN0ZW4odGhpcywiaXJvbi1yZXNpemUiLAoiX3Jlc2l6ZUhhbmRsZXIiKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9pdGVtc1JlbmRlcmVkPSExO3RoaXMudW5saXN0ZW4odGhpcywiaXJvbi1yZXNpemUiLCJfcmVzaXplSGFuZGxlciIpfSx1cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXM6ZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3A9dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzPzA6cGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcylbInBhZGRpbmctdG9wIl18fDAsMTApO3RoaXMuX3ZpZXdwb3J0SGVpZ2h0PXRoaXMuX3Njcm9sbFRhcmdldEhlaWdodH0sX3VwZGF0ZTpmdW5jdGlvbihkLGYpe3RoaXMuX2Fzc2lnbk1vZGVscyhkKTt0aGlzLl91cGRhdGVNZXRyaWNzKGQpO2lmKGYpZm9yKDtmLmxlbmd0aDspZD1mLnBvcCgpLHRoaXMuX3BoeXNpY2FsVG9wLT10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQoZCk7dGhpcy5fcG9zaXRpb25JdGVtcygpO3RoaXMuX3VwZGF0ZVNjcm9sbGVyU2l6ZSgpOwp0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgpfSxfaW5jcmVhc2VQb29sSWZOZWVkZWQ6ZnVuY3Rpb24oKXtpZigwPT09dGhpcy5fdmlld3BvcnRIZWlnaHQpcmV0dXJuITE7dmFyIGQ9dGhpcy5fcGh5c2ljYWxTaXplcy5yZWR1Y2UoZnVuY3Rpb24oZyxsKXtyZXR1cm4gZysobHx8MTAwKX0sMCksZj1kPnRoaXMuX3ZpZXdwb3J0SGVpZ2h0O2lmKGQ+PXRoaXMuX29wdFBoeXNpY2FsU2l6ZSYmZilyZXR1cm4hMTtkPU1hdGguZmxvb3IodGhpcy5fcGh5c2ljYWxTaXplL3RoaXMuX3ZpZXdwb3J0SGVpZ2h0KTswPT09ZD90aGlzLl9kZWJvdW5jZVRlbXBsYXRlKHRoaXMuX2luY3JlYXNlUG9vbC5iaW5kKHRoaXMsTWF0aC5yb3VuZCguNSp0aGlzLl9waHlzaWNhbENvdW50KSkpOnRoaXMuX2xhc3RQYWdlIT09ZCYmZj9Qb2x5bWVyLmRvbS5hZGREZWJvdW5jZXIodGhpcy5kZWJvdW5jZSgiX2RlYm91bmNlVGVtcGxhdGUiLHRoaXMuX2luY3JlYXNlUG9vbC5iaW5kKHRoaXMsdGhpcy5faXRlbXNQZXJSb3cpLAoxNikpOnRoaXMuX2RlYm91bmNlVGVtcGxhdGUodGhpcy5faW5jcmVhc2VQb29sLmJpbmQodGhpcyxNYXRoLmNlaWwodGhpcy5fdmlld3BvcnRIZWlnaHQvKHRoaXMuX3BoeXNpY2FsU2l6ZS90aGlzLl9waHlzaWNhbENvdW50KSp0aGlzLl9tYXhQYWdlcy10aGlzLl9waHlzaWNhbENvdW50KXx8MSkpO3RoaXMuX2xhc3RQYWdlPWQ7cmV0dXJuITB9LF9kZWJvdW5jZVRlbXBsYXRlOmZ1bmN0aW9uKGQpe1BvbHltZXIuZG9tLmFkZERlYm91bmNlcih0aGlzLmRlYm91bmNlKCJfZGVib3VuY2VUZW1wbGF0ZSIsZCkpfSxfaW5jcmVhc2VQb29sOmZ1bmN0aW9uKGQpe3ZhciBmPXRoaXMuX3BoeXNpY2FsQ291bnQ7ZD1NYXRoLm1pbih0aGlzLl9waHlzaWNhbENvdW50K2QsdGhpcy5fdmlydHVhbENvdW50LXRoaXMuX3ZpcnR1YWxTdGFydCxNYXRoLm1heCh0aGlzLm1heFBoeXNpY2FsQ291bnQsMjUpKS1mOzA+PWR8fChbXS5wdXNoLmFwcGx5KHRoaXMuX3BoeXNpY2FsSXRlbXMsdGhpcy5fY3JlYXRlUG9vbChkKSksCltdLnB1c2guYXBwbHkodGhpcy5fcGh5c2ljYWxTaXplcyxBcnJheShkKSksdGhpcy5fcGh5c2ljYWxDb3VudD1mK2QsdGhpcy5fdXBkYXRlKCkpfSxfcmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGQ9MDx0aGlzLl92aXJ0dWFsQ291bnR8fDA8dGhpcy5fcGh5c2ljYWxDb3VudDt0aGlzLmlzQXR0YWNoZWQmJiF0aGlzLl9pdGVtc1JlbmRlcmVkJiZ0aGlzLl9pc1Zpc2libGUmJmQmJih0aGlzLl9sYXN0UGFnZT0wLHRoaXMuX3VwZGF0ZSgpLHRoaXMuX2l0ZW1zUmVuZGVyZWQ9ITApfSxfaXRlcmF0ZUl0ZW1zOmZ1bmN0aW9uKGQsZil7dmFyIGcsbDtpZigyPT09YXJndW1lbnRzLmxlbmd0aCYmZilmb3IobD0wO2w8Zi5sZW5ndGg7bCsrKXt2YXIgaz1mW2xdO3ZhciBuPXRoaXMuX2NvbXB1dGVWaWR4KGspO2lmKG51bGwhPShnPWQuY2FsbCh0aGlzLGssbikpKXJldHVybiBnfWVsc2V7az10aGlzLl9waHlzaWNhbFN0YXJ0O2ZvcihuPXRoaXMuX3ZpcnR1YWxTdGFydDtrPHRoaXMuX3BoeXNpY2FsQ291bnQ7aysrLApuKyspaWYobnVsbCE9KGc9ZC5jYWxsKHRoaXMsayxuKSkpcmV0dXJuIGc7Zm9yKGs9MDtrPHRoaXMuX3BoeXNpY2FsU3RhcnQ7aysrLG4rKylpZihudWxsIT0oZz1kLmNhbGwodGhpcyxrLG4pKSlyZXR1cm4gZ319LF9jb21wdXRlVmlkeDpmdW5jdGlvbihkKXtyZXR1cm4gZD49dGhpcy5fcGh5c2ljYWxTdGFydD90aGlzLl92aXJ0dWFsU3RhcnQrKGQtdGhpcy5fcGh5c2ljYWxTdGFydCk6dGhpcy5fdmlydHVhbFN0YXJ0Kyh0aGlzLl9waHlzaWNhbENvdW50LXRoaXMuX3BoeXNpY2FsU3RhcnQpK2R9LF91cGRhdGVNZXRyaWNzOmZ1bmN0aW9uKGQpe3RoaXMuc2Nyb2xsaW5nJiZQb2x5bWVyLmRvbS5mbHVzaCgpO3ZhciBmPTAsZz0wLGw9dGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQsaz10aGlzLl9waHlzaWNhbEF2ZXJhZ2U7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKG4pe2crPXRoaXMuX3BoeXNpY2FsU2l6ZXNbbl18fDA7dGhpcy5fcGh5c2ljYWxTaXplc1tuXT10aGlzLl9waHlzaWNhbEl0ZW1zW25dLm9mZnNldEhlaWdodDsKZis9dGhpcy5fcGh5c2ljYWxTaXplc1tuXTt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCs9dGhpcy5fcGh5c2ljYWxTaXplc1tuXT8xOjB9LGQpO3RoaXMuX3ZpZXdwb3J0SGVpZ2h0PXRoaXMuX3Njcm9sbFRhcmdldEhlaWdodDt0aGlzLl9waHlzaWNhbFNpemU9dGhpcy5fcGh5c2ljYWxTaXplK2YtZzt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCE9PWwmJih0aGlzLl9waHlzaWNhbEF2ZXJhZ2U9TWF0aC5yb3VuZCgoaypsK2YpL3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50KSl9LF9wb3NpdGlvbkl0ZW1zOmZ1bmN0aW9uKCl7dGhpcy5fYWRqdXN0U2Nyb2xsUG9zaXRpb24oKTt2YXIgZD10aGlzLl9waHlzaWNhbFRvcDt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24oZil7dGhpcy5fcGh5c2ljYWxJdGVtc1tmXS5zdHlsZS50cmFuc2Zvcm09dGhpcy5fZ2V0VHJhbnNsYXRlKDAsZCk7ZCs9dGhpcy5fcGh5c2ljYWxTaXplc1tmXX0pfSxfZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50OmZ1bmN0aW9uKGQpe3JldHVybiB0aGlzLl9waHlzaWNhbFNpemVzW2RdfSwKX3Nob3VsZFJlbmRlck5leHRSb3c6ZnVuY3Rpb24oZCl7cmV0dXJuIGQldGhpcy5faXRlbXNQZXJSb3c9PT10aGlzLl9pdGVtc1BlclJvdy0xfSxfYWRqdXN0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgZD0wPT09dGhpcy5fdmlydHVhbFN0YXJ0P3RoaXMuX3BoeXNpY2FsVG9wOk1hdGgubWluKHRoaXMuX3Njcm9sbFBvc2l0aW9uK3RoaXMuX3BoeXNpY2FsVG9wLDApO2QmJih0aGlzLl9waHlzaWNhbFRvcC09ZCxjfHwwPT09dGhpcy5fcGh5c2ljYWxUb3B8fHRoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24odGhpcy5fc2Nyb2xsVG9wLWQpKX0sX3Jlc2V0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oZCl7dGhpcy5zY3JvbGxUYXJnZXQmJih0aGlzLl9zY3JvbGxQb3NpdGlvbj10aGlzLl9zY3JvbGxUb3A9ZCl9LF91cGRhdGVTY3JvbGxlclNpemU6ZnVuY3Rpb24oZCl7dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0PXRoaXMuX3BoeXNpY2FsQm90dG9tK01hdGgubWF4KHRoaXMuX3ZpcnR1YWxDb3VudC0KdGhpcy5fcGh5c2ljYWxDb3VudC10aGlzLl92aXJ0dWFsU3RhcnQsMCkqdGhpcy5fcGh5c2ljYWxBdmVyYWdlO2lmKChkPShkPWR8fDA9PT10aGlzLl9zY3JvbGxIZWlnaHQpfHx0aGlzLl9zY3JvbGxQb3NpdGlvbj49dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3BoeXNpY2FsU2l6ZSl8fE1hdGguYWJzKHRoaXMuX2VzdFNjcm9sbEhlaWdodC10aGlzLl9zY3JvbGxIZWlnaHQpPj10aGlzLl9vcHRQaHlzaWNhbFNpemUpdGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodD10aGlzLl9lc3RTY3JvbGxIZWlnaHQrInB4Iix0aGlzLl9zY3JvbGxIZWlnaHQ9dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0fSxzY3JvbGxUb0luZGV4OmZ1bmN0aW9uKGQpe1BvbHltZXIuZG9tLmZsdXNoKCk7ZD1NYXRoLm1pbihNYXRoLm1heChkLDApLHRoaXMuX3ZpcnR1YWxDb3VudC0xKTtpZighdGhpcy5faXNJbmRleFJlbmRlcmVkKGQpfHxkPj10aGlzLl9tYXhWaXJ0dWFsU3RhcnQpdGhpcy5fdmlydHVhbFN0YXJ0PQpkLTE7dGhpcy5fYXNzaWduTW9kZWxzKCk7dGhpcy5fdXBkYXRlTWV0cmljcygpO3RoaXMuX3BoeXNpY2FsVG9wPU1hdGguZmxvb3IodGhpcy5fdmlydHVhbFN0YXJ0L3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2U7Zm9yKHZhciBmPXRoaXMuX3BoeXNpY2FsU3RhcnQsZz10aGlzLl92aXJ0dWFsU3RhcnQsbD0wLGs9dGhpcy5faGlkZGVuQ29udGVudFNpemU7ZzxkJiZsPD1rOylsKz10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQoZiksZj0oZisxKSV0aGlzLl9waHlzaWNhbENvdW50LGcrKzt0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoITApO3RoaXMuX3Bvc2l0aW9uSXRlbXMoKTt0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKHRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbGVyUGFkZGluZ1RvcCtsKTt0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgpO3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9Cm51bGx9LF9yZXNldEF2ZXJhZ2U6ZnVuY3Rpb24oKXt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudD10aGlzLl9waHlzaWNhbEF2ZXJhZ2U9MH0sX3Jlc2l6ZUhhbmRsZXI6ZnVuY3Rpb24oKXtQb2x5bWVyLmRvbS5hZGREZWJvdW5jZXIodGhpcy5kZWJvdW5jZSgiX2RlYm91bmNlVGVtcGxhdGUiLGZ1bmN0aW9uKCl7dGhpcy51cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXMoKTt0aGlzLl9yZW5kZXIoKTt0aGlzLl9pdGVtc1JlbmRlcmVkJiZ0aGlzLl9waHlzaWNhbEl0ZW1zJiZ0aGlzLl9pc1Zpc2libGUmJih0aGlzLl9yZXNldEF2ZXJhZ2UoKSx0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5maXJzdFZpc2libGVJbmRleCkpfS5iaW5kKHRoaXMpLDEpKX0sdXBkYXRlU2l6ZUZvckl0ZW06ZnVuY3Rpb24oZCl7ZD10aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5W2RdO251bGwhPWQmJih0aGlzLl91cGRhdGVNZXRyaWNzKFtkXSksdGhpcy5fcG9zaXRpb25JdGVtcygpKX0sX2lzSW5kZXhSZW5kZXJlZDpmdW5jdGlvbihkKXtyZXR1cm4gZD49CnRoaXMuX3ZpcnR1YWxTdGFydCYmZDw9dGhpcy5fdmlydHVhbEVuZH0sX2lzSW5kZXhWaXNpYmxlOmZ1bmN0aW9uKGQpe3JldHVybiBkPj10aGlzLmZpcnN0VmlzaWJsZUluZGV4JiZkPD10aGlzLmxhc3RWaXNpYmxlSW5kZXh9fX0oKTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Jcm9uTGlzdEJlaGF2aW9yPVtQb2x5bWVyLlRlbXBsYXRpemVyLFBvbHltZXIuSXJvblNjcm9sbFRhcmdldEJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLklyb25MaXN0QmVoYXZpb3JJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC10YWJsZS5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZSIsYmVoYXZpb3JzOlt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Jcm9uTGlzdEJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlU2Nyb2xsQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVDb2x1bW5SZW9yZGVyaW5nQmVoYXZpb3IsUG9seW1lci5UZW1wbGF0aXplcl0scHJvcGVydGllczp7c2l6ZTpOdW1iZXIsY29sdW1uVHJlZTpBcnJheSxiaW5kRGF0YTpGdW5jdGlvbixyb3dEZXRhaWxzVGVtcGxhdGU6T2JqZWN0LGNvbHVtblJlb3JkZXJpbmdBbGxvd2VkOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSxzYWZhcmk6e3R5cGU6Qm9vbGVhbix2YWx1ZTovXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfSxzY3JvbGxiYXJXaWR0aDp7dHlwZTpOdW1iZXIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKYS5zdHlsZS53aWR0aD0iMTAwcHgiO2Euc3R5bGUuaGVpZ2h0PSIxMDBweCI7YS5zdHlsZS5vdmVyZmxvdz0ic2Nyb2xsIjthLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7YS5zdHlsZS50b3A9Ii05OTk5cHgiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGM9YS5vZmZzZXRXaWR0aC1hLmNsaWVudFdpZHRoO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7cmV0dXJuIGN9fSx0YXJnZXQ6T2JqZWN0LGhhc0RhdGE6Qm9vbGVhbn0sb2JzZXJ2ZXJzOlsiX2NvbHVtblRyZWVDaGFuZ2VkKGNvbHVtblRyZWUsIF9waHlzaWNhbEl0ZW1zLCBfcGh5c2ljYWxDb3VudFZhbCkiLCJfc2l6ZUNoYW5nZWQoc2l6ZSwgYmluZERhdGEsIGhhc0RhdGEpIiwiX3Jvd0RldGFpbHNUZW1wbGF0ZUNoYW5nZWQocm93RGV0YWlsc1RlbXBsYXRlLCBfcGh5c2ljYWxJdGVtcywgX3BoeXNpY2FsQ291bnRWYWwpIl0sbGlzdGVuZXJzOnsicHJvcGVydHktY2hhbmdlZCI6Il9jb2x1bW5Qcm9wQ2hhbmdlZCIsCmFuaW1hdGlvbmVuZDoiX29uQW5pbWF0aW9uRW5kIiwiY29sdW1uLXJlc2l6aW5nIjoiX29uQ29sdW1uUmVzaXplIn0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLiQ9dGhpcy4kfHx7fTt0aGlzLiQuaGVhZGVyPXRoaXMuZG9tSG9zdC4kLmhlYWRlcjt0aGlzLiQuaXRlbXM9dGhpcy5kb21Ib3N0LiQuaXRlbXM7dGhpcy4kLmZvb3Rlcj10aGlzLmRvbUhvc3QuJC5mb290ZXJ9LF9vbkNvbHVtblJlc2l6ZTpmdW5jdGlvbigpe3RoaXMudG9nZ2xlQXR0cmlidXRlKCJjb2x1bW4tcmVzaXppbmciLHRoaXMuJC5oZWFkZXIucXVlcnlTZWxlY3RvcigiW2NvbHVtbi1yZXNpemluZ10iKSk7dGhpcy5fZ3JpZFJlc2l6ZUhhbmRsZXIoKX0sX29uQW5pbWF0aW9uRW5kOmZ1bmN0aW9uKGEpey9hcHBlYXIvLnRlc3QoYS5hbmltYXRpb25OYW1lKSYmKHRoaXMuX3JlbmRlcigpLHRoaXMuX3VwZGF0ZUhlYWRlckZvb3Rlck1ldHJpY3MoKSxhLnN0b3BQcm9wYWdhdGlvbigpKX0sX2NvbHVtblByb3BDaGFuZ2VkOmZ1bmN0aW9uKGEpeyJoZWFkZXJUZW1wbGF0ZSI9PT0KYS5kZXRhaWwucGF0aCYmdGhpcy50b2dnbGVBdHRyaWJ1dGUoImhhcy10ZW1wbGF0ZXMiLCEwLHRoaXMuJC5oZWFkZXIpOyJmb290ZXJUZW1wbGF0ZSI9PT1hLmRldGFpbC5wYXRoJiZ0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgiaGFzLXRlbXBsYXRlcyIsITAsdGhpcy4kLmZvb3Rlcik7L2Zyb3plbnxoaWRkZW4vLnRlc3QoYS5kZXRhaWwucGF0aCkmJnRoaXMuX2Zyb3plbkNlbGxzQ2hhbmdlZCgpOyJoaWRkZW4iPT09YS5kZXRhaWwucGF0aCYmdGhpcy5fZ3JpZFJlc2l6ZUhhbmRsZXIoKX0sX2hpZGVPdXRlclNjcm9sbGVyOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIDA9PT1hJiYhY30sX2hpZGVUYWJsZU92ZXJmbG93OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIDA9PT1hJiZjfSxfcm93RGV0YWlsc1RlbXBsYXRlQ2hhbmdlZDpmdW5jdGlvbihhLGMsZCl7dm9pZCAwIT09YSYmYyYmdm9pZCAwIT09ZCYmQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChjLGZ1bmN0aW9uKGYpe2Yucm93RGV0YWlsc1RlbXBsYXRlPQphfSl9LF9jb2x1bW5UcmVlQ2hhbmdlZDpmdW5jdGlvbihhLGMsZCl7dm9pZCAwIT09YSYmYyYmdm9pZCAwIT09ZCYmKFBvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLHRoaXMuX3VwZGF0ZSksdGhpcy5fZnJvemVuQ2VsbHNDaGFuZ2VkKCksdGhpcy5faGFzVGVtcGxhdGVzQ2hhbmdlZChhKSxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGMsZnVuY3Rpb24oZil7Zi5jb2x1bW5zPWFbYS5sZW5ndGgtMV19KSx0aGlzLl9ncmlkUmVzaXplSGFuZGxlcigpLFBvbHltZXIuZG9tLmZsdXNoKHRoaXMpLHRoaXMuX3VwZGF0ZUxhc3RDb2x1bW4oKSl9LF91cGRhdGVMYXN0Q29sdW1uOmZ1bmN0aW9uKCl7QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChQb2x5bWVyLmRvbSh0aGlzLmRvbUhvc3Qucm9vdCkucXVlcnlTZWxlY3RvckFsbCgiLnZhYWRpbi1ncmlkLXJvdyIpLGZ1bmN0aW9uKGEpe2EudXBkYXRlTGFzdENvbHVtbigpfSl9LF91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzOmZ1bmN0aW9uKCl7dGhpcy5fcGh5c2ljYWxTaXplcyYmClBvbHltZXIuZG9tLmZsdXNoKCk7dGhpcy5fdXBkYXRlSGVhZGVyRm9vdGVyTWV0cmljc1N5bmMoKTtQb2x5bWVyLlJlbmRlclN0YXR1cy5hZnRlck5leHRSZW5kZXIodGhpcy4kLmhlYWRlcixmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUhlYWRlckZvb3Rlck1ldHJpY3NTeW5jKCk7dGhpcy5fcGVuZGluZ1Njcm9sbFRvU2NhbGVkSW5kZXgmJnRoaXMuc2Nyb2xsVG9TY2FsZWRJbmRleCh0aGlzLl9wZW5kaW5nU2Nyb2xsVG9TY2FsZWRJbmRleCl9LmJpbmQodGhpcykpfSxfdXBkYXRlSGVhZGVyRm9vdGVyTWV0cmljc1N5bmM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiQuaGVhZGVyLmNsaWVudEhlaWdodCsicHgiLGM9dGhpcy4kLmZvb3Rlci5jbGllbnRIZWlnaHQrInB4IjtbdGhpcy4kLm91dGVyc2l6ZXIsdGhpcy4kLmZpeGVkc2l6ZXIsdGhpcy4kLml0ZW1zXS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2Quc3R5bGUuYm9yZGVyVG9wV2lkdGg9YTtkLnN0eWxlLmJvcmRlckJvdHRvbVdpZHRoPQpjfSl9LF9oYXNUZW1wbGF0ZXNDaGFuZ2VkOmZ1bmN0aW9uKGEpe3ZhciBjPSExLGQ9ITE7YS5mb3JFYWNoKGZ1bmN0aW9uKGYpe3JldHVybiBmLmZvckVhY2goZnVuY3Rpb24oZyl7Yz1jfHxnLmhlYWRlclRlbXBsYXRlO2Q9ZHx8Zy5mb290ZXJUZW1wbGF0ZX0pfSk7dGhpcy50b2dnbGVBdHRyaWJ1dGUoImhhcy10ZW1wbGF0ZXMiLGMsdGhpcy4kLmhlYWRlcik7dGhpcy50b2dnbGVBdHRyaWJ1dGUoImhhcy10ZW1wbGF0ZXMiLGQsdGhpcy4kLmZvb3Rlcil9LF9jcmVhdGVQb29sOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1BcnJheShhKSxkPTA7ZDxhO2QrKyl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtcm93Iik7Zi50YXJnZXQ9dGhpcy5kb21Ib3N0O2NbZF09ZjtmLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwiIik7UG9seW1lci5kb20odGhpcy4kLml0ZW1zKS5hcHBlbmRDaGlsZChmKX1yZXR1cm4gY30sX3NpemVDaGFuZ2VkOmZ1bmN0aW9uKGEsCmMsZCl7aWYodm9pZCAwIT09YSYmdm9pZCAwIT09YyYmdm9pZCAwIT09ZCl7dmFyIGY9dGhpcy5fc2Nyb2xsVG9wLGc9dGhpcy5maXJzdFZpc2libGVJbmRleCt0aGlzLl92aWR4T2Zmc2V0O3RoaXMuX3ZpcnR1YWxDb3VudD1NYXRoLm1pbihhLDFFNSk7dGhpcy5fcGh5c2ljYWxJbmRleEZvcktleT17fTt0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPW51bGw7dGhpcy5fdmlkeE9mZnNldD0wO3RoaXMuX3BoeXNpY2FsSXRlbXN8fCh0aGlzLl9waHlzaWNhbENvdW50PU1hdGgubWF4KDEsTWF0aC5taW4oMjUsdGhpcy5fdmlydHVhbENvdW50KSksdGhpcy5fcGh5c2ljYWxJdGVtcz10aGlzLl9jcmVhdGVQb29sKHRoaXMuX3BoeXNpY2FsQ291bnQpLHRoaXMuX3BoeXNpY2FsU2l6ZXM9QXJyYXkodGhpcy5fcGh5c2ljYWxDb3VudCkpO3RoaXMuX2l0ZW1zUmVuZGVyZWQ9ITE7dGhpcy5fZGVib3VuY2VUZW1wbGF0ZShmdW5jdGlvbigpe3RoaXMuX3JlbmRlcigpOwp0aGlzLl92aWV3cG9ydEhlaWdodCYmKHRoaXMuc2Nyb2xsVG9TY2FsZWRJbmRleChNYXRoLm1pbihnLHRoaXMuc2l6ZSkpLHRoaXMuX3Njcm9sbFRvcD1mLHRoaXMuX3Njcm9sbEhhbmRsZXIoKSx0aGlzLmZsdXNoRGVib3VuY2VyKCJ2YWFkaW4tZ3JpZC1zY3JvbGxpbmciKSl9KX19LF9hc3NpZ25Nb2RlbHM6ZnVuY3Rpb24oYSl7dGhpcy5fdmlydHVhbEluZGV4VG9JdGVtPXRoaXMuX3ZpcnR1YWxJbmRleFRvSXRlbXx8e307dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKGMsZCl7Yz10aGlzLl9waHlzaWNhbEl0ZW1zW2NdO2MuaW5kZXgmJmRlbGV0ZSB0aGlzLl92aXJ0dWFsSW5kZXhUb0l0ZW1bYy5pbmRleF07Yy5pbmRleD1kK3RoaXMuX3ZpZHhPZmZzZXQ7dGhpcy5fdmlydHVhbEluZGV4VG9JdGVtW2MuaW5kZXhdPWM7Yy50b2dnbGVBdHRyaWJ1dGUoIm9kZCIsYy5pbmRleCUyKTtjLnRvZ2dsZUF0dHJpYnV0ZSgibGFzdHJvdyIsYy5pbmRleD09PXRoaXMuc2l6ZS0xKTtjLnRvZ2dsZUF0dHJpYnV0ZSgiaGlkZGVuIiwKYy5pbmRleD49dGhpcy5zaXplKTt0aGlzLmJpbmREYXRhKGMuaW5kZXgsYyl9LGEpfSxfZ3JpZFJlc2l6ZUhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzKCk7dGhpcy5fcGh5c2ljYWxTaXplcyYmKHRoaXMuX3BoeXNpY2FsSXRlbXMuZm9yRWFjaChmdW5jdGlvbihhKXthLnVwZGF0ZVJvd0RldGFpbHNDZWxsTWV0cmljcygpfSksdGhpcy5kZWJvdW5jZSgidmFhZGluLWdyaWQtcmVzaXppbmciLGZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlKCl9LmJpbmQodGhpcyksMSkpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWNvbHVtbi5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5CYXNlQmVoYXZpb3I9e3Byb3BlcnRpZXM6e3Jlc2l6YWJsZTp7dHlwZTpCb29sZWFuLHZhbHVlOmZ1bmN0aW9uKCl7aWYoInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCIhPT10aGlzLmxvY2FsTmFtZSl7dmFyIGE9UG9seW1lci5kb20odGhpcykucGFyZW50Tm9kZTtyZXR1cm4gYSYmInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCI9PT1hLmxvY2FsTmFtZT9hLnJlc2l6YWJsZXx8ITE6ITF9fX0saGVhZGVyVGVtcGxhdGU6e3R5cGU6T2JqZWN0fSxmb290ZXJUZW1wbGF0ZTp7dHlwZTpPYmplY3R9LGZyb3plbjp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0saGlkZGVuOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSxfbGFzdEZyb3plbjp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0sX29yZGVyOk51bWJlcixfcmVvcmRlclN0YXR1czpCb29sZWFufSxvYnNlcnZlcnM6WyJfZm9vdGVyVGVtcGxhdGVDaGFuZ2VkKGZvb3RlclRlbXBsYXRlKSIsCiJfaGVhZGVyVGVtcGxhdGVDaGFuZ2VkKGhlYWRlclRlbXBsYXRlKSIsIl9sYXN0RnJvemVuQ2hhbmdlZChfbGFzdEZyb3plbikiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShjKXswPD1jLmFkZGVkTm9kZXMubGVuZ3RoJiYodGhpcy5oZWFkZXJUZW1wbGF0ZT10aGlzLl9wcmVwYXJlSGVhZGVyVGVtcGxhdGUoKSx0aGlzLmZvb3RlclRlbXBsYXRlPXRoaXMuX3ByZXBhcmVGb290ZXJUZW1wbGF0ZSgpLHRoaXMudGVtcGxhdGU9dGhpcy5fcHJlcGFyZUJvZHlUZW1wbGF0ZSgpKX10aGlzLl90ZW1wbGF0ZU9ic2VydmVyPVBvbHltZXIuRWxlbWVudD9uZXcgUG9seW1lci5GbGF0dGVuZWROb2Rlc09ic2VydmVyKHRoaXMsYSk6UG9seW1lci5kb20odGhpcykub2JzZXJ2ZU5vZGVzKGEpfSxfcHJlcGFyZUhlYWRlclRlbXBsYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ByZXBhcmVUZW1wbGF0aXplcih0aGlzLl9maW5kVGVtcGxhdGUoInRlbXBsYXRlLmhlYWRlciIpfHxudWxsLAp7fSl9LF9wcmVwYXJlRm9vdGVyVGVtcGxhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJlcGFyZVRlbXBsYXRpemVyKHRoaXMuX2ZpbmRUZW1wbGF0ZSgidGVtcGxhdGUuZm9vdGVyIil8fG51bGwse30pfSxfcHJlcGFyZUJvZHlUZW1wbGF0ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcmVwYXJlVGVtcGxhdGl6ZXIodGhpcy5fZmluZFRlbXBsYXRlKCJ0ZW1wbGF0ZTpub3QoLmhlYWRlcik6bm90KC5mb290ZXIpIix7fSkpfSxfcHJlcGFyZVRlbXBsYXRpemVyOmZ1bmN0aW9uKGEsYyl7aWYoYSYmIWEudGVtcGxhdGl6ZXIpe3ZhciBkPW5ldyB2YWFkaW4uZWxlbWVudHMuZ3JpZC5UZW1wbGF0aXplcjtkLmRhdGFIb3N0PXRoaXMuZGF0YUhvc3Q7ZC5faW5zdGFuY2VQcm9wcz1jfHxkLl9pbnN0YW5jZVByb3BzO2QudGVtcGxhdGU9YTthLnRlbXBsYXRpemVyPWR9cmV0dXJuIGF9LF9zZWxlY3RGaXJzdFRlbXBsYXRlOmZ1bmN0aW9uKGEpe3JldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoUG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3RvckFsbChhKSwKZnVuY3Rpb24oYyl7cmV0dXJuIFBvbHltZXIuZG9tKGMpLnBhcmVudE5vZGU9PT10aGlzfS5iaW5kKHRoaXMpKVswXX0sX2ZpbmRUZW1wbGF0ZTpmdW5jdGlvbihhKXsoYT10aGlzLl9zZWxlY3RGaXJzdFRlbXBsYXRlKGEpKSYmdGhpcy5kYXRhSG9zdCYmKGEuX3Jvb3REYXRhSG9zdD10aGlzLmRhdGFIb3N0Ll9yb290RGF0YUhvc3R8fHRoaXMuZGF0YUhvc3QpO3JldHVybiBhfSxfaGVhZGVyVGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6ImhlYWRlclRlbXBsYXRlIix2YWx1ZTphfSl9LF9mb290ZXJUZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYSl7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoiZm9vdGVyVGVtcGxhdGUiLHZhbHVlOmF9KX0sX2ZsZXhHcm93Q2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJmbGV4R3JvdyIsdmFsdWU6YX0pfSxfd2lkdGhDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIsCntwYXRoOiJ3aWR0aCIsdmFsdWU6YX0pfSxfbGFzdEZyb3plbkNoYW5nZWQ6ZnVuY3Rpb24oYSl7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoibGFzdEZyb3plbiIsdmFsdWU6YX0pfX07CnZhYWRpbi5lbGVtZW50cy5ncmlkLkNvbHVtbkJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7d2lkdGg6e3R5cGU6U3RyaW5nLHZhbHVlOiIxMDBweCJ9LGZsZXhHcm93Ont0eXBlOk51bWJlcix2YWx1ZToxfSx0ZW1wbGF0ZTp7dHlwZTpPYmplY3R9fSxvYnNlcnZlcnM6Il9mbGV4R3Jvd0NoYW5nZWQoZmxleEdyb3cpO193aWR0aENoYW5nZWQod2lkdGgpO190ZW1wbGF0ZUNoYW5nZWQodGVtcGxhdGUpO19mcm96ZW5DaGFuZ2VkKGZyb3plbiwgaXNBdHRhY2hlZCk7X2hpZGRlbkNoYW5nZWQoaGlkZGVuKTtfb3JkZXJDaGFuZ2VkKF9vcmRlcik7X3Jlb3JkZXJTdGF0dXNDaGFuZ2VkKF9yZW9yZGVyU3RhdHVzKTtfcmVzaXphYmxlQ2hhbmdlZChyZXNpemFibGUpIi5zcGxpdCgiOyIpLF9mcm96ZW5DaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7dm9pZCAwIT09YSYmdm9pZCAwIT09YyYmKHZvaWQgMD09PXRoaXMuX29sZEZyb3plbiYmITE9PT1hfHx0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLAp7cGF0aDoiZnJvemVuIix2YWx1ZTphfSksdGhpcy5fb2xkRnJvemVuPWEpfSxfdGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGEpe2EmJmEudGVtcGxhdGl6ZXImJlBvbHltZXIuZG9tKHRoaXMucm9vdCkuYXBwZW5kQ2hpbGQoYS50ZW1wbGF0aXplcik7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoidGVtcGxhdGUiLHZhbHVlOmF9LHtidWJibGVzOiExfSl9LF9oaWRkZW5DaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6ImhpZGRlbiIsdmFsdWU6YX0pfSxfb3JkZXJDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6Im9yZGVyIix2YWx1ZTphfSl9LF9yZW9yZGVyU3RhdHVzQ2hhbmdlZDpmdW5jdGlvbihhKXt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJyZW9yZGVyU3RhdHVzIix2YWx1ZTphfSl9LF9yZXNpemFibGVDaGFuZ2VkOmZ1bmN0aW9uKGEpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIsCntwYXRoOiJyZXNpemFibGUiLHZhbHVlOmF9KX19O3ZhYWRpbi5lbGVtZW50cy5ncmlkLkNvbHVtbkJlaGF2aW9yPVt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5CYXNlQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uQmVoYXZpb3JJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1jb2x1bW4uaHRtbC0yLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC1jb2x1bW4iLGJlaGF2aW9yczpbdmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uQmVoYXZpb3JdfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtYXJyYXktZGF0YS1wcm92aWRlci1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5BcnJheURhdGFQcm92aWRlckJlaGF2aW9yPXtwcm9wZXJ0aWVzOntpdGVtczpBcnJheX0sb2JzZXJ2ZXJzOlsiX2l0ZW1zQ2hhbmdlZChpdGVtcywgaXRlbXMuKikiXSxfaXRlbXNDaGFuZ2VkOmZ1bmN0aW9uKGEsYyl7dm9pZCAwIT09YSYmdm9pZCAwIT09YyYmKHRoaXMuc2l6ZT0oYXx8W10pLmxlbmd0aCx0aGlzLmRhdGFQcm92aWRlcj10aGlzLmRhdGFQcm92aWRlcnx8dGhpcy5fYXJyYXlEYXRhUHJvdmlkZXIsdGhpcy5jbGVhckNhY2hlKCkpfSxfYXJyYXlEYXRhUHJvdmlkZXI6ZnVuY3Rpb24oYSxjKXt2YXIgZD0odGhpcy5pdGVtc3x8W10pLnNsaWNlKDApO3RoaXMuX2NoZWNrUGF0aHModGhpcy5fZmlsdGVycywiZmlsdGVyaW5nIixkKSYmKGQ9dGhpcy5fZmlsdGVyKGQpKTt0aGlzLnNpemU9ZC5sZW5ndGg7YS5zb3J0T3JkZXJzLmxlbmd0aCYmdGhpcy5fY2hlY2tQYXRocyh0aGlzLl9zb3J0ZXJzLCJzb3J0aW5nIixkKSYmKGQ9ZC5zb3J0KHRoaXMuX211bHRpU29ydC5iaW5kKHRoaXMpKSk7CnZhciBmPWEucGFnZSphLnBhZ2VTaXplO2MoZC5zbGljZShmLGYrYS5wYWdlU2l6ZSksZC5sZW5ndGgpfSxfY2hlY2tQYXRoczpmdW5jdGlvbihhLGMsZCl7aWYoIWQubGVuZ3RoKXJldHVybiExO3ZhciBmPSEwLGc7Zm9yKGcgaW4gYSl7dmFyIGw9YVtnXS5wYXRoO2lmKGwmJi0xIT09bC5pbmRleE9mKCIuIikpe3ZhciBrPWwucmVwbGFjZSgvXC5bXlwuXSokLywiIik7dm9pZCAwPT09UG9seW1lci5CYXNlLmdldChrLGRbMF0pJiYoY29uc29sZS53YXJuKCdQYXRoICInK2wrJyIgdXNlZCBmb3IgJytjKyIgZG9lcyBub3QgZXhpc3QgaW4gYWxsIG9mIHRoZSBpdGVtcywgIitjKyIgaXMgZGlzYWJsZWQuIiksZj0hMSl9fXJldHVybiBmfSxfbXVsdGlTb3J0OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuX3NvcnRlcnMubWFwKGZ1bmN0aW9uKGQpe3JldHVybiJhc2MiPT09ZC5kaXJlY3Rpb24/dGhpcy5fY29tcGFyZShQb2x5bWVyLkJhc2UuZ2V0KGQucGF0aCxhKSxQb2x5bWVyLkJhc2UuZ2V0KGQucGF0aCwKYykpOiJkZXNjIj09PWQuZGlyZWN0aW9uP3RoaXMuX2NvbXBhcmUoUG9seW1lci5CYXNlLmdldChkLnBhdGgsYyksUG9seW1lci5CYXNlLmdldChkLnBhdGgsYSkpOjB9LHRoaXMpLnJlZHVjZShmdW5jdGlvbihkLGYpe3JldHVybiBkP2Q6Zn0sMCl9LF9ub3JtYWxpemVFbXB0eVZhbHVlOmZ1bmN0aW9uKGEpe3JldHVybiAwPD1bdm9pZCAwLG51bGxdLmluZGV4T2YoYSk/IiI6aXNOYU4oYSk/YS50b1N0cmluZygpOmF9LF9jb21wYXJlOmZ1bmN0aW9uKGEsYyl7YT10aGlzLl9ub3JtYWxpemVFbXB0eVZhbHVlKGEpO2M9dGhpcy5fbm9ybWFsaXplRW1wdHlWYWx1ZShjKTtyZXR1cm4gYTxjPy0xOmE+Yz8xOjB9LF9maWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGMpe3JldHVybiAwPT09dGhpcy5fZmlsdGVycy5maWx0ZXIoZnVuY3Rpb24oZCl7cmV0dXJuLTE9PT10aGlzLl9ub3JtYWxpemVFbXB0eVZhbHVlKFBvbHltZXIuQmFzZS5nZXQoZC5wYXRoLGMpKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihkLnZhbHVlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSl9LmJpbmQodGhpcykpLmxlbmd0aH0sCnRoaXMpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtZHluYW1pYy1jb2x1bW5zLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkR5bmFtaWNDb2x1bW5zQmVoYXZpb3I9e3JlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fYWRkTm9kZU9ic2VydmVyKCl9LF9oYXNDb2x1bW5Hcm91cHM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspaWYoInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCI9PT1hW2NdLmxvY2FsTmFtZSlyZXR1cm4hMDtyZXR1cm4hMX0sX2dldENoaWxkQ29sdW1uczpmdW5jdGlvbihhKXtyZXR1cm4gUG9seW1lci5kb20oYSkucXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKCJ2YWFkaW4tZ3JpZC1jb2x1bW4sIHZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCwgdmFhZGluLWdyaWQtc2VsZWN0aW9uLWNvbHVtbiIpfSxfZmxhdHRlbkNvbHVtbkdyb3VwczpmdW5jdGlvbihhKXtyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYyl7cmV0dXJuInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCI9PT1jLmxvY2FsTmFtZT90aGlzLl9nZXRDaGlsZENvbHVtbnMoYyk6W2NdfSx0aGlzKS5yZWR1Y2UoZnVuY3Rpb24oYywKZCl7cmV0dXJuIGMuY29uY2F0KGQpfSxbXSl9LF9nZXRDb2x1bW5UcmVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGM9dGhpcy5xdWVyeUFsbEVmZmVjdGl2ZUNoaWxkcmVuKCJ2YWFkaW4tZ3JpZC1jb2x1bW4sIHZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCwgdmFhZGluLWdyaWQtc2VsZWN0aW9uLWNvbHVtbiIpOzspe2EucHVzaChjKTtpZighdGhpcy5faGFzQ29sdW1uR3JvdXBzKGMpKWJyZWFrO2M9dGhpcy5fZmxhdHRlbkNvbHVtbkdyb3VwcyhjKX1yZXR1cm4gYX0sX3VwZGF0ZUNvbHVtblRyZWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9nZXRDb2x1bW5UcmVlKCk7dGhpcy5fYXJyYXlFcXVhbHMoYSx0aGlzLl9jb2x1bW5UcmVlKXx8KHRoaXMuX2NvbHVtblRyZWU9YSl9LF9hZGROb2RlT2JzZXJ2ZXI6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlcj1Qb2x5bWVyLmRvbSh0aGlzKS5vYnNlcnZlTm9kZXMoZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhkKXtyZXR1cm4gZC5ub2RlVHlwZT09PQpOb2RlLkVMRU1FTlRfTk9ERSYmL152YWFkaW4tZ3JpZC0oY29sdW1ufHNlbGVjdGlvbikvaS50ZXN0KGQubG9jYWxOYW1lKX0oMDxhLmFkZGVkTm9kZXMuZmlsdGVyKGMpLmxlbmd0aHx8MDxhLnJlbW92ZWROb2Rlcy5maWx0ZXIoYykubGVuZ3RoKSYmdGhpcy5fdXBkYXRlQ29sdW1uVHJlZSgpOyhQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZVNoYWRvd3x8UG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cpJiZQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZCh0aGlzLiQuZm9vdGVyRm9jdXNUcmFwKTt0aGlzLmRlYm91bmNlKCJjaGVjay1pbXBvcnRzIix0aGlzLl9jaGVja0ltcG9ydHMsMkUzKX0uYmluZCh0aGlzKSl9LF9hcnJheUVxdWFsczpmdW5jdGlvbihhLGMpe2lmKCFhfHwhY3x8YS5sZW5ndGghPWMubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgZD0wLGY9YS5sZW5ndGg7ZDxmO2QrKylpZihhW2RdaW5zdGFuY2VvZiBBcnJheSYmY1tkXWluc3RhbmNlb2YgQXJyYXkpe2lmKCF0aGlzLl9hcnJheUVxdWFscyhhW2RdLApjW2RdKSlyZXR1cm4hMX1lbHNlIGlmKGFbZF0hPWNbZF0pcmV0dXJuITE7cmV0dXJuITB9LF9jaGVja0ltcG9ydHM6ZnVuY3Rpb24oKXtbInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCIsInZhYWRpbi1ncmlkLXNvcnRlciIsInZhYWRpbi1ncmlkLWZpbHRlciIsInZhYWRpbi1ncmlkLXNlbGVjdGlvbi1jb2x1bW4iXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBjPVBvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3IoYSk7IWN8fChQb2x5bWVyLmlzSW5zdGFuY2U/UG9seW1lci5pc0luc3RhbmNlKGMpOmMgaW5zdGFuY2VvZiBQb2x5bWVyLkVsZW1lbnQpfHxjb25zb2xlLndhcm4oIk1ha2Ugc3VyZSB5b3UgaGF2ZSBpbXBvcnRlZCB0aGUgcmVxdWlyZWQgbW9kdWxlIGZvciBceDNjIithKyJceDNlIGVsZW1lbnQuIil9LHRoaXMpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtc29ydC1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5Tb3J0QmVoYXZpb3I9e3Byb3BlcnRpZXM6e211bHRpU29ydDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfc29ydGVyczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX3ByZXZpb3VzU29ydGVyczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LGxpc3RlbmVyczp7InNvcnRlci1jaGFuZ2VkIjoiX29uU29ydGVyQ2hhbmdlZCJ9LHJlYWR5OmZ1bmN0aW9uKCl7UG9seW1lci5FbGVtZW50JiYhUG9seW1lci5TZXR0aW5ncy51c2VOYXRpdmVTaGFkb3cmJnRoaXMuYXN5bmMoZnVuY3Rpb24oKXt2YXIgYT1Qb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yQWxsKCJ2YWFkaW4tZ3JpZC1zb3J0ZXIiKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGEsZnVuY3Rpb24oYyl7Yy5maXJlJiZjLmZpcmUoInNvcnRlci1jaGFuZ2VkIil9KX0pfSxfb25Tb3J0ZXJDaGFuZ2VkOmZ1bmN0aW9uKGEpe3ZhciBjPQphLnRhcmdldDt0aGlzLl9yZW1vdmVBcnJheUl0ZW0odGhpcy5fc29ydGVycyxjKTtjLl9vcmRlcj1udWxsO3RoaXMubXVsdGlTb3J0PyhjLmRpcmVjdGlvbiYmdGhpcy5fc29ydGVycy51bnNoaWZ0KGMpLHRoaXMuX3NvcnRlcnMuZm9yRWFjaChmdW5jdGlvbihkLGYpe2QuX29yZGVyPTE8dGhpcy5fc29ydGVycy5sZW5ndGg/ZjpudWxsfSx0aGlzKSk6KHRoaXMuX3NvcnRlcnMuZm9yRWFjaChmdW5jdGlvbihkKXtkLl9vcmRlcj1udWxsO2QuZGlyZWN0aW9uPW51bGx9KSxjLmRpcmVjdGlvbiYmKHRoaXMuX3NvcnRlcnM9W2NdKSk7YS5zdG9wUHJvcGFnYXRpb24oKTt0aGlzLmRhdGFQcm92aWRlciYmSlNPTi5zdHJpbmdpZnkodGhpcy5fcHJldmlvdXNTb3J0ZXJzKSE9PUpTT04uc3RyaW5naWZ5KHRoaXMuX21hcFNvcnRlcnMoKSkmJnRoaXMuY2xlYXJDYWNoZSgpO3RoaXMuX3ByZXZpb3VzU29ydGVycz10aGlzLl9tYXBTb3J0ZXJzKCl9LF9tYXBTb3J0ZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NvcnRlcnMubWFwKGZ1bmN0aW9uKGEpe3JldHVybntwYXRoOmEucGF0aCwKZGlyZWN0aW9uOmEuZGlyZWN0aW9ufX0pfSxfcmVtb3ZlQXJyYXlJdGVtOmZ1bmN0aW9uKGEsYyl7Yz1hLmluZGV4T2YoYyk7LTE8YyYmYS5zcGxpY2UoYywxKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWZpbHRlci1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkLkZpbHRlckJlaGF2aW9yPXtwcm9wZXJ0aWVzOntfZmlsdGVyczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LGxpc3RlbmVyczp7ImZpbHRlci1jaGFuZ2VkIjoiX2ZpbHRlckNoYW5nZWQifSxfZmlsdGVyQ2hhbmdlZDpmdW5jdGlvbihhKXstMT09PXRoaXMuX2ZpbHRlcnMuaW5kZXhPZihhLnRhcmdldCkmJnRoaXMuX2ZpbHRlcnMucHVzaChhLnRhcmdldCk7YS5zdG9wUHJvcGFnYXRpb24oKTt0aGlzLmRhdGFQcm92aWRlciYmdGhpcy5jbGVhckNhY2hlKCl9LF9tYXBGaWx0ZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZpbHRlcnMubWFwKGZ1bmN0aW9uKGEpe3JldHVybntwYXRoOmEucGF0aCx2YWx1ZTphLnZhbHVlfX0pfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQuaHRtbC5qcwpQb2x5bWVyKHtpczoidmFhZGluLWdyaWQiLHByb3BlcnRpZXM6e19jb2x1bW5UcmVlOnt0eXBlOkFycmF5LG5vdGlmeTohMH0sc2l6ZTpOdW1iZXIsX3Jvd0RldGFpbHNUZW1wbGF0ZTpPYmplY3QsX2JpbmREYXRhOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRJdGVtLmJpbmQodGhpcyl9fX0sYmVoYXZpb3JzOltQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLFBvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLkFjdGl2ZUl0ZW1CZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5Sb3dEZXRhaWxzQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuRGF0YVByb3ZpZGVyQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuRHluYW1pY0NvbHVtbnNCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5BcnJheURhdGFQcm92aWRlckJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLlNlbGVjdGlvbkJlaGF2aW9yLAp2YWFkaW4uZWxlbWVudHMuZ3JpZC5Tb3J0QmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuRmlsdGVyQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uUmVvcmRlcmluZ0JlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlS2V5Ym9hcmRCZWhhdmlvcl0sbGlzdGVuZXJzOnsicHJvcGVydHktY2hhbmdlZCI6Il9jb2x1bW5Qcm9wQ2hhbmdlZCIsImlyb24tcmVzaXplIjoiX2dyaWRSZXNpemVIYW5kbGVyIn0sX3VwZGF0ZUl0ZW06ZnVuY3Rpb24oYSxjKXthLnN0eWxlLm1pbkhlaWdodD1jPyIiOnRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxBdmVyYWdlKyJweCI7YS5pdGVtPWM7YS5zZWxlY3RlZD10aGlzLl9pc1NlbGVjdGVkKGMpO2EuZXhwYW5kZWQ9dGhpcy5faXNFeHBhbmRlZChjKTthLmFjdGl2ZT1udWxsIT09YyYmYz09dGhpcy5hY3RpdmVJdGVtO2EuZm9jdXNlZD1hLmluZGV4PT09dGhpcy4kLml0ZW1zLl9mb2N1c2VkUm93SW5kZXh9LF9nZXRDb250ZW50VGFyZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LApyZWFkeTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUNvbHVtblRyZWUoKTt0aGlzLl9yb3dEZXRhaWxzVGVtcGxhdGU9UG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3RvcigidGVtcGxhdGUucm93LWRldGFpbHMiKXx8dm9pZCAwO3RoaXMuJC5zY3JvbGxlci50YXJnZXQ9dGhpcztudWxsPT09ZG9jdW1lbnQuZG9jdHlwZSYmY29uc29sZS53YXJuKCdceDNjdmFhZGluLWdyaWRceDNlIHJlcXVpcmVzIHRoZSAic3RhbmRhcmRzIG1vZGUiIGRlY2xhcmF0aW9uLiBQbGVhc2UgYWRkIFx4M2MhRE9DVFlQRSBodG1sXHgzZSB0byB0aGUgSFRNTCBkb2N1bWVudC4nKX0sX2NvbHVtblByb3BDaGFuZ2VkOmZ1bmN0aW9uKGEpeyJfY2hpbGRDb2x1bW5zIj09PWEuZGV0YWlsLnBhdGgmJnRoaXMuX3VwZGF0ZUNvbHVtblRyZWUoKTthLnN0b3BQcm9wYWdhdGlvbigpfSxfZ3JpZFJlc2l6ZUhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLiQuc2Nyb2xsZXIuX2dyaWRSZXNpemVIYW5kbGVyKCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHMvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHMuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHMiLHByb3BlcnRpZXM6e2JhY2tlbmQ6T2JqZWN0LGV4cGVyaW1lbnROYW1lOlN0cmluZyx2aXNpYmxlU2NoZW1hOk9iamVjdCxzZXNzaW9uR3JvdXA6T2JqZWN0LF94VHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6JG8uWFR5cGUuU1RFUH0sX25vTXVsdGlFeHBlcmltZW50czp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaW5kZXhPZlNlc3Npb246T2JqZWN0LF9zZXNzaW9uR3JvdXBOYW1lSGFzaDpOdW1iZXIsX3JlcXVlc3REYXRhOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKHt0YWc6YSxydW46Y30pPT50aGlzLmJhY2tlbmQubGlzdE1ldHJpY0V2YWxzKHtleHBlcmltZW50TmFtZTp0aGlzLmV4cGVyaW1lbnROYW1lLHNlc3Npb25OYW1lOmMsbWV0cmljTmFtZTphfSl9fSxfY29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57c2NhbGU6YT0+e2E9SlNPTi5wYXJzZShhKVsxXTsKYT10aGlzLl9pbmRleE9mU2Vzc2lvbi5nZXQoYSk7Y29uc3QgYz1Yby5zdGFuZGFyZDtyZXR1cm4gY1sodGhpcy5fc2Vzc2lvbkdyb3VwTmFtZUhhc2grYSklYy5sZW5ndGhdfX19fX0sYmVoYXZpb3JzOltQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcl0sbGlzdGVuZXJzOnsiaXJvbi1yZXNpemUiOiJyZWRyYXcifSxvYnNlcnZlcnM6WyJfc2Vzc2lvbkdyb3VwQ2hhbmdlZChzZXNzaW9uR3JvdXAuKikiXSxyZWRyYXcoKXtQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3JBbGwoInRmLXNjYWxhci1jYXJkIikuZm9yRWFjaChhPT5hLnJlZHJhdygpKX0sX3Nlc3Npb25Hcm91cENoYW5nZWQoKXt0aGlzLnNlc3Npb25Hcm91cD8odGhpcy5faW5kZXhPZlNlc3Npb249bmV3IE1hcCh0aGlzLnNlc3Npb25Hcm91cC5zZXNzaW9ucy5tYXAoKGEsYyk9PlthLm5hbWUsY10pKSx0aGlzLl9zZXNzaW9uR3JvdXBOYW1lSGFzaD10Zi5ocGFyYW1zLnV0aWxzLmhhc2hPZlN0cmluZyh0aGlzLnNlc3Npb25Hcm91cC5uYW1lKSk6Cih0aGlzLl9pbmRleE9mU2Vzc2lvbj1uZXcgTWFwLHRoaXMuX3Nlc3Npb25Hcm91cE5hbWVIYXNoPTApO1BvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvckFsbCgidGYtc2NhbGFyLWNhcmQiKS5mb3JFYWNoKGE9Pntjb25zdCBjPWEuZ2V0KCJ0YWciKTthLnNldCgidGFnIiwiIik7YS5zZXQoInRhZyIsYyl9KX0sX2hhdmVNZXRyaWNzKCl7cmV0dXJuIHRoaXMudmlzaWJsZVNjaGVtYSYmQXJyYXkuaXNBcnJheSh0aGlzLnZpc2libGVTY2hlbWEubWV0cmljSW5mb3MpJiYwPHRoaXMudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvcy5sZW5ndGh9LF9oYXZlTWV0cmljc0FuZFNlc3Npb25Hcm91cCgpe3JldHVybiB0aGlzLnNlc3Npb25Hcm91cCYmdGhpcy5faGF2ZU1ldHJpY3MoKX0sX2NvbXB1dGVTZXJpZXNGb3JTZXNzaW9uR3JvdXBNZXRyaWMoYSxjKXtyZXR1cm4gbnVsbD09PWF8fG51bGw9PT1jP1tdOmEuc2Vzc2lvbnMuZmlsdGVyKGQ9PnZvaWQgMCE9PXRmLmhwYXJhbXMudXRpbHMubWV0cmljVmFsdWVCeU5hbWUoZC5tZXRyaWNWYWx1ZXMsCmMubmFtZSkpLm1hcChkPT4oe3RhZzpjLm5hbWUscnVuOmQubmFtZX0pKX0sX2NvbXB1dGVUYWdNZXRhZGF0YShhKXtyZXR1cm57ZGlzcGxheU5hbWU6dGYuaHBhcmFtcy51dGlscy5tZXRyaWNOYW1lKGEpLGRlc2NyaXB0aW9uOmEuZGVzY3JpcHRpb258fCIifX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXRhYmxlLXZpZXcvdGYtaHBhcmFtcy10YWJsZS12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtdGFibGUtdmlldyIscHJvcGVydGllczp7dmlzaWJsZVNjaGVtYTpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheSxlbmFibGVTaG93TWV0cmljczpCb29sZWFuLGJhY2tlbmQ6T2JqZWN0LGV4cGVyaW1lbnROYW1lOlN0cmluZ30sb2JzZXJ2ZXJzOlsiX3Zpc2libGVTY2hlbWFPclNlc3Npb25Hcm91cHNDaGFuZ2VkKHZpc2libGVTY2hlbWEuKiwgc2Vzc2lvbkdyb3Vwcy4qKSJdLF92aXNpYmxlU2NoZW1hT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZCgpe2NvbnN0IGE9dGhpcy4kLnNlc3Npb25Hcm91cHNUYWJsZS5nZXQoImV4cGFuZGVkSXRlbXMiKTt0aGlzLiQuc2Vzc2lvbkdyb3Vwc1RhYmxlLnNldCgiZXhwYW5kZWRJdGVtcyIsW10pO1BvbHltZXIuZG9tLmZsdXNoKCk7Y29uc3QgYz1uZXcgTWFwO3RoaXMuc2Vzc2lvbkdyb3Vwcy5mb3JFYWNoKGQ9PntjLnNldChkLm5hbWUsZCl9KTt0aGlzLiQuc2Vzc2lvbkdyb3Vwc1RhYmxlLnNldCgiZXhwYW5kZWRJdGVtcyIsCmEubWFwKGQ9PmMuZ2V0KGQubmFtZSkpLmZpbHRlcihCb29sZWFuKSl9LF9ocGFyYW1OYW1lOnRmLmhwYXJhbXMudXRpbHMuaHBhcmFtTmFtZSxfbWV0cmljTmFtZTp0Zi5ocGFyYW1zLnV0aWxzLm1ldHJpY05hbWUsX3Nlc3Npb25Hcm91cEhQYXJhbShhLGMpe3JldHVybiBudWxsIT1hJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYS5ocGFyYW1zLGMpP3RmLmhwYXJhbXMudXRpbHMucHJldHR5UHJpbnQoYS5ocGFyYW1zW2NdKToiIn0sX3Nlc3Npb25Hcm91cE1ldHJpYyhhLGMpe2lmKG51bGw9PWEpcmV0dXJuIG51bGw7Zm9yKGxldCBkPTA7ZDxhLm1ldHJpY1ZhbHVlcy5sZW5ndGg7KytkKXtsZXQgZj1hLm1ldHJpY1ZhbHVlc1tkXTtpZihmLm5hbWUuZ3JvdXA9PT1jLmdyb3VwJiZmLm5hbWUudGFnPT1jLnRhZylyZXR1cm4gdGYuaHBhcmFtcy51dGlscy5wcmV0dHlQcmludChmLnZhbHVlKX1yZXR1cm4iIn0sX3Jvd051bWJlcihhKXtyZXR1cm4gYSsxfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtdmFsdWVzIixwcm9wZXJ0aWVzOntzZXNzaW9uR3JvdXA6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LHZpc2libGVTY2hlbWE6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9fSxfcHJvcGVydGllc0FyZVBvcHVsYXRlZDpmdW5jdGlvbihhLGMpe3JldHVybiB2b2lkIDAhPT1hJiZudWxsIT09YSYmdm9pZCAwIT09YyYmbnVsbCE9PWN9LF9zaW5nbGV0b25TZXNzaW9uR3JvdXBzOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT09YXx8dm9pZCAwPT09YT9bXTpbYV19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtcGxvdC91dGlscy5odG1sLmpzCihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGYoZyxsLGspe2Z1bmN0aW9uIG4oKXtpZigwPT09Zy5sZW5ndGgpcmV0dXJuWzEsMl07Y29uc3QgW3AscV09ZDMuZXh0ZW50KGcpO3JldHVybiBwIT09cT9bcCxxXTowPHA/Wy41KnAsMS41KnBdOjA+cD9bMS41KnAsLjUqcF06Wy0xLDFdfWlmKCJMSU5FQVIiPT09aylyZXR1cm4gZDMuc2NhbGVMaW5lYXIoKS5kb21haW4obigpKS5yYW5nZShbbCwwXSk7aWYoIkxPRyI9PT1rKXJldHVybiBrPW4oKSwwPj1rWzBdJiYwPD1rWzFdP2YoZyxsLCJMSU5FQVIiKTpkMy5zY2FsZUxvZygpLmRvbWFpbihrKS5yYW5nZShbbCwwXSk7aWYoIlFVQU5USUxFIj09PWspcmV0dXJuIGs9ZDMucmFuZ2UoMjApLm1hcChwPT5sLXAqbC8xOSksMD09PWcubGVuZ3RoJiYoZz1bMV0pLGQzLnNjYWxlUXVhbnRpbGUoKS5kb21haW4oXy51bmlxKGcpKS5yYW5nZShrKTtpZigiTk9OX05VTUVSSUMiPT09aylyZXR1cm4gZDMuc2NhbGVQb2ludCgpLmRvbWFpbihfLnVuaXEoZy5zb3J0KCkpKS5yYW5nZShbbCwKMF0pLnBhZGRpbmcoLjEpO3Rocm93IFJhbmdlRXJyb3IoIlVua25vd24gc2NhbGU6ICIrayk7fWQuZmluZENsb3Nlc3RQYXRoPWZ1bmN0aW9uKGcsbCxrKXtmdW5jdGlvbiBuKHoseCxDLEYpe2NvbnN0IEQ9ei1DLEI9eC1GO0M9cC1DO0Y9cS1GO2NvbnN0IEk9KEQqQytCKkYpLyhEKkQrQipCKTtyZXR1cm4gMD49ST9hLmhwYXJhbXMudXRpbHMubDJOb3JtU3F1YXJlZChDLEYpOjE8PUk/YS5ocGFyYW1zLnV0aWxzLmwyTm9ybVNxdWFyZWQoei1wLHgtcSk6YS5ocGFyYW1zLnV0aWxzLmwyTm9ybVNxdWFyZWQoQy1JKkQsRi1JKkIpfWlmKDI+bC5sZW5ndGgpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIkxlc3MgdGhhbiB0d28gYXhlcyBpbiBwYXJhbGxlbCBjb29yZGluYXRlcyBwbG90LiIpLG51bGw7Y29uc3QgcD1rWzBdLHE9a1sxXTtpZihwPD1sWzBdfHxwPj1sW2wubGVuZ3RoLTFdKXJldHVybiBudWxsO2NvbnN0IHI9Xy5zb3J0ZWRJbmRleChsLHApO2NvbnNvbGUuYXNzZXJ0KDA8cik7CmNvbnNvbGUuYXNzZXJ0KHI8bC5sZW5ndGgpO2NvbnN0IHQ9ci0xO2xldCB2PW51bGwseT1udWxsO2cuZm9yRWFjaCh6PT57Y29uc3QgeD1uKHouY29udHJvbFBvaW50c1t0XVswXSx6LmNvbnRyb2xQb2ludHNbdF1bMV0sei5jb250cm9sUG9pbnRzW3JdWzBdLHouY29udHJvbFBvaW50c1tyXVsxXSk7MTAwPHh8fCEobnVsbD09PXZ8fHg8dil8fCh2PXgseT16KX0pO3JldHVybiB5fTtkLnBvaW50U2NhbGVJbnZlcnNlSW1hZ2U9ZnVuY3Rpb24oZyxsLGspe3JldHVybiBnLmRvbWFpbigpLmZpbHRlcihuPT57bj1nKG4pO3JldHVybiBsPD1uJiZuPD1rfSl9O2QucXVhbnRpbGVTY2FsZUludmVyc2VJbWFnZT1mdW5jdGlvbihnLGwsayl7Y29uc3Qgbj1nLnJhbmdlKCkscD1uLmZpbHRlcihxPT5sPD1xJiZxPD1rKS5tYXAocT0+e2NvbnN0IHI9Zy5pbnZlcnRFeHRlbnQocSk7cmV0dXJuIHE9PT1uW24ubGVuZ3RoLTFdP1tyWzBdLHJbMV0rMV06cn0pO3JldHVybiAwPT1wLmxlbmd0aD9bMCwKMF06ZDMuZXh0ZW50KGQzLm1lcmdlKHApKX07ZC5jb250aW51b3VzU2NhbGVJbnZlcnNlSW1hZ2U9ZnVuY3Rpb24oZyxsLGspe3JldHVybltnLmludmVydChsKSxnLmludmVydChrKV0uc29ydCgobixwKT0+bi1wKX07ZC5jcmVhdGVBeGlzU2NhbGU9Zn0pKGMucGFyYWxsZWxfY29vcmRzX3Bsb3R8fChjLnBhcmFsbGVsX2Nvb3Jkc19wbG90PXt9KSl9KShhLmhwYXJhbXN8fChhLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L2F4ZXMuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7ZnVuY3Rpb24gZihyKXtyZXR1cm4gbnVsbCE9PXIuc291cmNlRXZlbnR9bGV0IGc7KGZ1bmN0aW9uKHIpe3IuTElORUFSPSJMSU5FQVIiO3IuTE9HPSJMT0ciO3IuUVVBTlRJTEU9IlFVQU5USUxFIjtyLk5PTl9OVU1FUklDPSJOT05fTlVNRVJJQyJ9KShnPWQuU2NhbGVUeXBlfHwoZC5TY2FsZVR5cGU9e30pKTtjbGFzcyBse2lzUGFzc2luZygpe3JldHVybiEwfX1jbGFzcyBre2NvbnN0cnVjdG9yKHIsdCx2LHkpe3RoaXMuX2xvd2VyPXI7dGhpcy5fdXBwZXI9dDt0aGlzLl9sb3dlck9wZW49djt0aGlzLl91cHBlck9wZW49eX1pc1Bhc3Npbmcocil7cmV0dXJuIHRoaXMuX2JlZm9yZSh0aGlzLl9sb3dlcixyLCF0aGlzLl9sb3dlck9wZW4pJiZ0aGlzLl9iZWZvcmUocix0aGlzLl91cHBlciwhdGhpcy5fdXBwZXJPcGVuKX1fYmVmb3JlKHIsdCx2KXtyZXR1cm4gdj9yPD10OnI8dH19Y2xhc3Mgbntjb25zdHJ1Y3RvcihyKXt0aGlzLl9kb21haW5TZXQ9CnJ9aXNQYXNzaW5nKHIpe3JldHVybi0xIT09dGhpcy5fZG9tYWluU2V0LmZpbmRJbmRleCh0PT50PT09cil9fWNsYXNzIHB7Y29uc3RydWN0b3Iocix0LHYseSl7dGhpcy5fc3ZnUHJvcHM9cjt0aGlzLl9zY2hlbWE9dDt0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXI9djt0aGlzLl9jb2xJbmRleD15O3RoaXMuX2lzRGlzcGxheWVkPSExO3RoaXMuX3NjYWxlVHlwZT10aGlzLl95U2NhbGU9bnVsbDt0aGlzLnNldEJydXNoU2VsZWN0aW9uKG51bGwpfWNvbEluZGV4KCl7cmV0dXJuIHRoaXMuX2NvbEluZGV4fXlTY2FsZSgpe3JldHVybiB0aGlzLl95U2NhbGV9c2NhbGVUeXBlKCl7cmV0dXJuIHRoaXMuX3NjYWxlVHlwZX1icnVzaFNlbGVjdGlvbigpe3JldHVybiB0aGlzLl9icnVzaFNlbGVjdGlvbn1pc0Rpc3BsYXllZCgpe3JldHVybiB0aGlzLl9pc0Rpc3BsYXllZH1zZXRCcnVzaFNlbGVjdGlvbihyKXt0aGlzLl9icnVzaFNlbGVjdGlvbj1yO3RoaXMuX2JydXNoRmlsdGVyPXRoaXMuX2J1aWxkQnJ1c2hGaWx0ZXIodGhpcy5icnVzaFNlbGVjdGlvbigpLAp0aGlzLnNjYWxlVHlwZSgpLHRoaXMueVNjYWxlKCkpfXNldERvbWFpbkFuZFNjYWxlKHIsdCl7dGhpcy5fc2NhbGVUeXBlPXQ7dGhpcy5feVNjYWxlPWEuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5jcmVhdGVBeGlzU2NhbGUoci5zbGljZSgpLHRoaXMuX3N2Z1Byb3BzLmhlaWdodCx0aGlzLnNjYWxlVHlwZSgpKTt0aGlzLl9icnVzaEZpbHRlcj10aGlzLl9idWlsZEJydXNoRmlsdGVyKHRoaXMuYnJ1c2hTZWxlY3Rpb24oKSx0aGlzLnNjYWxlVHlwZSgpLHRoaXMueVNjYWxlKCkpfWJydXNoRmlsdGVyKCl7cmV0dXJuIHRoaXMuX2JydXNoRmlsdGVyfXVwZGF0ZURPTShyKXt2YXIgdD1kMy5heGlzTGVmdCh0aGlzLnlTY2FsZSgpKTt0aGlzLnNjYWxlVHlwZSgpPT09Zy5RVUFOVElMRSYmKHQ9dC50aWNrVmFsdWVzKHRoaXMueVNjYWxlKCkucXVhbnRpbGVzKCkpLnRpY2tGb3JtYXQoZDMuZm9ybWF0KCItLjZnIikpKTt2YXIgdj1kMy5zZWxlY3Qocik7di5zZWxlY3RBbGwoImciKS5yZW1vdmUoKTsKdi5hcHBlbmQoImciKS5jbGFzc2VkKCJheGlzIiwhMCkuY2FsbCh0KS5hcHBlbmQoInRleHQiKS5jbGFzc2VkKCJheGlzLXRpdGxlIiwhMCkuc3R5bGUoImN1cnNvciIsIm1vdmUiKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5hdHRyKCJ5IiwtOSkudGV4dCh5PT5hLmhwYXJhbXMudXRpbHMuc2NoZW1hQ29sdW1uTmFtZSh0aGlzLl9zY2hlbWEseSkpO3YuY2FsbChkMy5kcmFnKCkub24oInN0YXJ0IiwoKT0+e3Iuc2V0QXR0cmlidXRlKCJpcy1kcmFnZ2luZyIsIiIpO3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkRyYWdTdGFydCh0aGlzLmNvbEluZGV4KCkpfSkub24oImRyYWciLCgpPT50aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25EcmFnKGQzLmV2ZW50LngpKS5vbigiZW5kIiwoKT0+e3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkRyYWdFbmQoKTtyLnJlbW92ZUF0dHJpYnV0ZSgiaXMtZHJhZ2dpbmciKX0pKTt0PWQzLmJydXNoWSgpLmV4dGVudChbWy04LDBdLApbOCx0aGlzLl9zdmdQcm9wcy5oZWlnaHQrMV1dKS5vbigic3RhcnQiLCgpPT57ZihkMy5ldmVudCkmJihyLnNldEF0dHJpYnV0ZSgiaXMtYnJ1c2hpbmciLCIiKSx0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25CcnVzaENoYW5nZWQodGhpcy5jb2xJbmRleCgpKSl9KS5vbigiYnJ1c2giLCgpPT57aWYoZihkMy5ldmVudCkpdGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uQnJ1c2hDaGFuZ2VkKHRoaXMuY29sSW5kZXgoKSl9KS5vbigiZW5kIiwoKT0+e2YoZDMuZXZlbnQpJiYodGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uQnJ1c2hDaGFuZ2VkKHRoaXMuY29sSW5kZXgoKSksci5yZW1vdmVBdHRyaWJ1dGUoImlzLWJydXNoaW5nIikpfSk7dj1kMy5zZWxlY3QocikuYXBwZW5kKCJnIikuY2xhc3NlZCgiYnJ1c2giLCEwKTt2LmNhbGwodCk7dC5tb3ZlKHYsdGhpcy5icnVzaFNlbGVjdGlvbigpKX1zZXREaXNwbGF5ZWQocil7dGhpcy5faXNEaXNwbGF5ZWQ9cn1fYnVpbGRCcnVzaEZpbHRlcihyLAp0LHYpe2lmKG51bGw9PT1yKXJldHVybiBuZXcgbDtpZihudWxsPT09dClyZXR1cm4gY29uc29sZS5lcnJvcigiU2NhbGUgdHlwZSBpcyBudWxsLCBidXQgYnJ1c2hTZWxlY3Rpb24gaXNuJ3Q6ICIsciksbmV3IGw7c3dpdGNoKHQpe2Nhc2UgZy5MSU5FQVI6Y2FzZSBnLkxPRzp7Y29uc3QgW3ksel09YS5ocGFyYW1zLnBhcmFsbGVsX2Nvb3Jkc19wbG90LmNvbnRpbnVvdXNTY2FsZUludmVyc2VJbWFnZSh2LHJbMF0sclsxXSk7cmV0dXJuIG5ldyBrKHkseiwhMSwhMSl9Y2FzZSBnLlFVQU5USUxFOntjb25zdCBbeSx6XT1hLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QucXVhbnRpbGVTY2FsZUludmVyc2VJbWFnZSh2LHJbMF0sclsxXSk7cmV0dXJuIG5ldyBrKHkseiwhMSwhMCl9Y2FzZSBnLk5PTl9OVU1FUklDOnJldHVybiBuZXcgbihhLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QucG9pbnRTY2FsZUludmVyc2VJbWFnZSh2LHJbMF0sclsxXSkpfWNvbnNvbGUuZXJyb3IoIlVua25vd24gc2NhbGUgdHlwZTogIiwKdCk7cmV0dXJuIG5ldyBsfX1kLkF4aXM9cDtjbGFzcyBxe2NvbnN0cnVjdG9yKHIsdCx2KXt0aGlzLl9zdmdQcm9wcz1yO3RoaXMuX3NjaGVtYT10O3RoaXMuX2F4ZXM9dGhpcy5fY3JlYXRlQXhlcyh2KTt0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucz1kMy5zY2FsZVBvaW50KCkucmFuZ2UoWzEsdGhpcy5fc3ZnUHJvcHMud2lkdGgtMV0pLnBhZGRpbmcoLjUpO3RoaXMuX2RyYWdnZWRBeGlzPW51bGw7dGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoImcuYXhpcy1wYXJlbnQiKS5yZW1vdmUoKTt0aGlzLl9wYXJlbnRzU2VsPXRoaXMuX3N2Z1Byb3BzLnN2Z0cuc2VsZWN0QWxsKCIuYXhpcy1wYXJlbnQiKX11cGRhdGVBeGVzKHIsdCl7Y29uc29sZS5hc3NlcnQoIXRoaXMuaXNBeGlzRHJhZ2dpbmcoKSk7Y29uc3Qgdj1uZXcgU2V0O3IuY29sdW1ucy5mb3JFYWNoKHo9Pntjb25zdCB4PXouYWJzb2x1dGVJbmRleDtsZXQgQz10aGlzLl9heGVzW3hdO0Muc2V0RGlzcGxheWVkKCEwKTsKY29uc3QgRj10Lm1hcChEPT5hLmhwYXJhbXMudXRpbHMuY29sdW1uVmFsdWVCeUluZGV4KHRoaXMuX3NjaGVtYSxELHgpKTtDLnNldERvbWFpbkFuZFNjYWxlKEYsei5zY2FsZSk7di5hZGQoeCl9KTt0aGlzLl9heGVzLmZvckVhY2goej0+e3YuaGFzKHouY29sSW5kZXgoKSl8fHouc2V0RGlzcGxheWVkKCExKX0pO3RoaXMuX3VwZGF0ZVN0YXRpb25hcnlBeGVzUG9zaXRpb25zKHYpO3RoaXMuX3BhcmVudHNTZWw9dGhpcy5fcGFyZW50c1NlbC5kYXRhKEFycmF5LmZyb20odiksej0+eik7dGhpcy5fcGFyZW50c1NlbC5leGl0KCkucmVtb3ZlKCk7dGhpcy5fcGFyZW50c1NlbD10aGlzLl9wYXJlbnRzU2VsLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgiYXhpcy1wYXJlbnQiLCEwKS5tZXJnZSh0aGlzLl9wYXJlbnRzU2VsKTtjb25zdCB5PXRoaXM7dGhpcy5fcGFyZW50c1NlbC5jYWxsKHo9PnRoaXMuX3VwZGF0ZUF4ZXNQb3NpdGlvbnNJbkRPTSh6KSkuZWFjaChmdW5jdGlvbih6KXt5Ll9heGVzW3pdLnVwZGF0ZURPTSh0aGlzKX0pfW1hcFZpc2libGVBeGVzKHIpe3JldHVybiB0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4oKS5tYXAodD0+CnIodGhpcy5nZXRBeGlzUG9zaXRpb24odCksdGhpcy5fYXhlc1t0XSkpfWFsbFZpc2libGVBeGVzU2F0aXNmeShyKXtyZXR1cm4gdGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKCkuZXZlcnkodD0+cih0aGlzLmdldEF4aXNQb3NpdGlvbih0KSx0aGlzLl9heGVzW3RdKSl9Z2V0QXhpc0ZvckNvbEluZGV4KHIpe3JldHVybiB0aGlzLl9heGVzW3JdfWRyYWdTdGFydChyKXtjb25zb2xlLmFzc2VydCghdGhpcy5pc0F4aXNEcmFnZ2luZygpKTtjb25zb2xlLmFzc2VydCh0aGlzLl9heGVzW3JdLmlzRGlzcGxheWVkKCkpO3RoaXMuX2RyYWdnZWRBeGlzPXRoaXMuX2F4ZXNbcl07dGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbj10aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucyhyKX1kcmFnKHIpe3RoaXMuX2RyYWdnZWRBeGlzUG9zaXRpb249cj1NYXRoLm1pbihNYXRoLm1heChyLDApLHRoaXMuX3N2Z1Byb3BzLndpZHRoKTtyPXRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbigpOwpyLnNvcnQoKHQsdik9PnRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHQpLXRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHYpKTt0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4ocik7dGhpcy5fdXBkYXRlQXhlc1Bvc2l0aW9uc0luRE9NKHRoaXMuX3BhcmVudHNTZWwpfWRyYWdFbmQoKXtjb25zb2xlLmFzc2VydCh0aGlzLmlzQXhpc0RyYWdnaW5nKCkpO3RoaXMuX2RyYWdnZWRBeGlzPXRoaXMuX2RyYWdnZWRBeGlzUG9zaXRpb249bnVsbDt0aGlzLl91cGRhdGVBeGVzUG9zaXRpb25zSW5ET00odGhpcy5fcGFyZW50c1NlbC50cmFuc2l0aW9uKCkuZHVyYXRpb24oNTAwKSl9aXNBeGlzRHJhZ2dpbmcoKXtyZXR1cm4gbnVsbCE9PXRoaXMuX2RyYWdnZWRBeGlzfWdldEF4aXNQb3NpdGlvbihyKXtyZXR1cm4gbnVsbCE9PXRoaXMuX2RyYWdnZWRBeGlzJiZ0aGlzLl9kcmFnZ2VkQXhpcy5jb2xJbmRleCgpPT09cj90aGlzLl9kcmFnZ2VkQXhpc1Bvc2l0aW9uOnRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zKHIpfV91cGRhdGVTdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucyhyKXt2YXIgdD0KdGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKCkuZmlsdGVyKHY9PnIuaGFzKHYpKTt0PUFycmF5LmZyb20obmV3IFNldChbLi4udCwuLi5BcnJheS5mcm9tKHIpXSkpO3RoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbih0KX1fdXBkYXRlQXhlc1Bvc2l0aW9uc0luRE9NKHIpe3IuYXR0cigidHJhbnNmb3JtIix0PT5hLmhwYXJhbXMudXRpbHMudHJhbnNsYXRlU3RyKHRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHQpKSl9X2NyZWF0ZUF4ZXMocil7cmV0dXJuIGQzLnJhbmdlKGEuaHBhcmFtcy51dGlscy5udW1Db2x1bW5zKHRoaXMuX3NjaGVtYSkpLm1hcCh0PT5uZXcgcCh0aGlzLl9zdmdQcm9wcyx0aGlzLl9zY2hlbWEscix0KSl9fWQuQXhlc0NvbGxlY3Rpb249cX0pKGMucGFyYWxsZWxfY29vcmRzX3Bsb3R8fChjLnBhcmFsbGVsX2Nvb3Jkc19wbG90PXt9KSl9KShhLmhwYXJhbXN8fChhLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L2xpbmVzLmpzCihmdW5jdGlvbihhKXsoZnVuY3Rpb24oYyl7KGZ1bmN0aW9uKGQpe2xldCBmOyhmdW5jdGlvbihrKXtrW2suRk9SRUdST1VORD0wXT0iRk9SRUdST1VORCI7a1trLkJBQ0tHUk9VTkQ9MV09IkJBQ0tHUk9VTkQifSkoZj1kLkxpbmVUeXBlfHwoZC5MaW5lVHlwZT17fSkpO2NsYXNzIGd7Y29uc3RydWN0b3Ioayl7dm9pZCAwPT09ayYmKGs9ZDMuc2VsZWN0QWxsKG51bGwpKTtjb25zb2xlLmFzc2VydCgxPj1rLnNpemUoKSk7dGhpcy5fc2Vzc2lvbkdyb3VwU2VsPWt9c2Vzc2lvbkdyb3VwKCl7cmV0dXJuIDE9PT10aGlzLl9zZXNzaW9uR3JvdXBTZWwuc2l6ZSgpP3RoaXMuX3Nlc3Npb25Hcm91cFNlbC5kYXR1bSgpOm51bGx9aXNOdWxsKCl7cmV0dXJuIG51bGw9PT10aGlzLnNlc3Npb25Hcm91cCgpfXNlbGVjdGlvbigpe3JldHVybiB0aGlzLl9zZXNzaW9uR3JvdXBTZWx9ZXF1YWxzVG8oayl7cmV0dXJuIHRoaXMuaXNOdWxsKCk/ay5pc051bGwoKTprLmlzTnVsbCgpPyExOmsuc2Vzc2lvbkdyb3VwKCkubmFtZT09CnRoaXMuc2Vzc2lvbkdyb3VwKCkubmFtZX19ZC5TZXNzaW9uR3JvdXBIYW5kbGU9ZztjbGFzcyBse2NvbnN0cnVjdG9yKGssbixwKXt0aGlzLl9zdmdQcm9wcz1rO3RoaXMuX3NjaGVtYT1uO3RoaXMuX2F4ZXNDb2xsZWN0aW9uPXA7dGhpcy5fc2Vzc2lvbkdyb3Vwcz1bXTt0aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgiZy5iYWNrZ3JvdW5kIikucmVtb3ZlKCk7dGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoImcuZm9yZWdyb3VuZCIpLnJlbW92ZSgpO3RoaXMuX2JnUGF0aHNTZWw9dGhpcy5fc3ZnUHJvcHMuc3ZnRy5hcHBlbmQoImciKS5jbGFzc2VkKCJiYWNrZ3JvdW5kIiwhMCkuc2VsZWN0QWxsKCJwYXRoIik7dGhpcy5fZmdQYXRoc1NlbD10aGlzLl9zdmdQcm9wcy5zdmdHLmFwcGVuZCgiZyIpLmNsYXNzZWQoImZvcmVncm91bmQiLCEwKS5zZWxlY3RBbGwoInBhdGgiKTt0aGlzLl91cGRhdGVWaXNpYmxlRmdQYXRoc1NlbCgpO3RoaXMuX3BlYWtlZFNlc3Npb25Hcm91cEhhbmRsZT0KbmV3IGc7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGU9bmV3IGc7dGhpcy5fZDNsaW5lPWQzLmxpbmUoKS5jdXJ2ZShkMy5jdXJ2ZUxpbmVhcil9Z2V0U2Vzc2lvbkdyb3VwSGFuZGxlKGspe3JldHVybiBudWxsPT09a3x8dm9pZCAwPT09az9uZXcgZzpuZXcgZyh0aGlzLl9mZ1BhdGhzU2VsLmZpbHRlcihuPT5uLm5hbWU9PT1rLm5hbWUpKX1oaWRlQmFja2dyb3VuZExpbmVzKCl7dGhpcy5fYmdQYXRoc1NlbC5hdHRyKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9c2hvd0JhY2tncm91bmRMaW5lcygpe3RoaXMuX2JnUGF0aHNTZWwuYXR0cigidmlzaWJpbGl0eSIsbnVsbCl9cGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCl7cmV0dXJuIHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cEhhbmRsZX1zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpe3JldHVybiB0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZX1yZWNvbXB1dGVDb250cm9sUG9pbnRzKGssbj0wKXsoaz09PWYuRk9SRUdST1VORD8KdGhpcy5fZmdQYXRoc1NlbDp0aGlzLl9iZ1BhdGhzU2VsKS50cmFuc2l0aW9uKCkuZHVyYXRpb24obikuYXR0cigiZCIscD0+dGhpcy5fcGF0aERBdHRyaWJ1dGUocCkpO2s9PT1mLkZPUkVHUk9VTkQmJndpbmRvdy5zZXRUaW1lb3V0KCgpPT57Y29uc3QgcD10aGlzO3RoaXMuX2ZnUGF0aHNTZWwuZWFjaChmdW5jdGlvbihxKXtwLl9zZXRDb250cm9sUG9pbnRzUHJvcGVydHkodGhpcyxxKX0pfSl9cmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpe3RoaXMuX2ZnUGF0aHNTZWwuY2xhc3NlZCgiaW52aXNpYmxlLXBhdGgiLGs9PiF0aGlzLl9heGVzQ29sbGVjdGlvbi5hbGxWaXNpYmxlQXhlc1NhdGlzZnkoKG4scCk9PnAuYnJ1c2hGaWx0ZXIoKS5pc1Bhc3NpbmcoYS5ocGFyYW1zLnV0aWxzLmNvbHVtblZhbHVlQnlJbmRleCh0aGlzLl9zY2hlbWEsayxwLmNvbEluZGV4KCkpKSkpO3RoaXMuX3VwZGF0ZVZpc2libGVGZ1BhdGhzU2VsKCl9c2V0Rm9yZWdyb3VuZExpbmVzQ29sb3IoaywKbixwKXtrPXRoaXMuX2NyZWF0ZUxpbmVDb2xvckZ1bmN0aW9uKGssbixwKTt0aGlzLl9mZ1BhdGhzU2VsLmF0dHIoInN0cm9rZSIsayl9cmVkcmF3KGssbixwLHEpe2NvbnN0IHI9dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlc3Npb25Hcm91cCgpLHQ9dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2Vzc2lvbkdyb3VwKCk7dGhpcy5fc2Vzc2lvbkdyb3Vwcz1rO3RoaXMuX2ZnUGF0aHNTZWw9dGhpcy5fcmVjb21wdXRlUGF0aFNlbGVjdGlvbih0aGlzLl9mZ1BhdGhzU2VsKTt0aGlzLl9iZ1BhdGhzU2VsPXRoaXMuX3JlY29tcHV0ZVBhdGhTZWxlY3Rpb24odGhpcy5fYmdQYXRoc1NlbCk7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlPXRoaXMuZ2V0U2Vzc2lvbkdyb3VwSGFuZGxlKHIpO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlPXRoaXMuZ2V0U2Vzc2lvbkdyb3VwSGFuZGxlKHQpO3RoaXMucmVjb21wdXRlQ29udHJvbFBvaW50cyhmLkZPUkVHUk9VTkQpOwp0aGlzLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoZi5CQUNLR1JPVU5EKTt0aGlzLnJlY29tcHV0ZUZvcmVncm91bmRMaW5lc1Zpc2liaWxpdHkoKTt0aGlzLnNldEZvcmVncm91bmRMaW5lc0NvbG9yKG4scCxxKX11cGRhdGVQZWFrZWRTZXNzaW9uR3JvdXAoayl7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInBlYWtlZC1wYXRoIiwhMSk7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlPWs7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInBlYWtlZC1wYXRoIiwhMCl9Y2xlYXJQZWFrZWRTZXNzaW9uR3JvdXAoKXt0aGlzLnVwZGF0ZVBlYWtlZFNlc3Npb25Hcm91cChuZXcgZyl9dXBkYXRlU2VsZWN0ZWRTZXNzaW9uR3JvdXAoayl7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgic2VsZWN0ZWQtcGF0aCIsITEpO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlPQprO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInNlbGVjdGVkLXBhdGgiLCEwKX1maW5kQ2xvc2VzdFNlc3Npb25Hcm91cChrLG4pe2NvbnN0IHA9dGhpcy5fYXhlc0NvbGxlY3Rpb24ubWFwVmlzaWJsZUF4ZXMocT0+cSk7az1hLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QuZmluZENsb3Nlc3RQYXRoKHRoaXMuX3Zpc2libGVGZ1BhdGhzU2VsLm5vZGVzKCkscCxbayxuXSk7cmV0dXJuIG51bGw9PT1rP25ldyBnOm5ldyBnKGQzLnNlbGVjdChrKSl9X2NyZWF0ZUxpbmVDb2xvckZ1bmN0aW9uKGssbixwKXtpZihudWxsPT09aylyZXR1cm4oKT0+InJlZCI7Y29uc3QgcT1kMy5zY2FsZUxpbmVhcigpLmRvbWFpbihhLmhwYXJhbXMudXRpbHMubnVtZXJpY0NvbHVtbkV4dGVudCh0aGlzLl9zY2hlbWEsdGhpcy5fc2Vzc2lvbkdyb3VwcyxrKSkucmFuZ2UoW24scF0pLmludGVycG9sYXRlKGQzLmludGVycG9sYXRlTGFiKTtyZXR1cm4gcj0+CnEoYS5ocGFyYW1zLnV0aWxzLmNvbHVtblZhbHVlQnlJbmRleCh0aGlzLl9zY2hlbWEscixrKSl9X3JlY29tcHV0ZVBhdGhTZWxlY3Rpb24oayl7az1rLmRhdGEodGhpcy5fc2Vzc2lvbkdyb3VwcyxuPT5uLm5hbWUpO2suZXhpdCgpLnJlbW92ZSgpO3JldHVybiBrLmVudGVyKCkuYXBwZW5kKCJwYXRoIikubWVyZ2Uoayl9X3NldENvbnRyb2xQb2ludHNQcm9wZXJ0eShrLG4pe2suY29udHJvbFBvaW50cz10aGlzLl9jb21wdXRlQ29udHJvbFBvaW50cyhuKX1fY29tcHV0ZUNvbnRyb2xQb2ludHMoayl7cmV0dXJuIHRoaXMuX2F4ZXNDb2xsZWN0aW9uLm1hcFZpc2libGVBeGVzKChuLHApPT5bbixwLnlTY2FsZSgpKGEuaHBhcmFtcy51dGlscy5jb2x1bW5WYWx1ZUJ5SW5kZXgodGhpcy5fc2NoZW1hLGsscC5jb2xJbmRleCgpKSldKX1fcGF0aERBdHRyaWJ1dGUoayl7cmV0dXJuIHRoaXMuX2QzbGluZSh0aGlzLl9jb21wdXRlQ29udHJvbFBvaW50cyhrKSl9X3VwZGF0ZVZpc2libGVGZ1BhdGhzU2VsKCl7dGhpcy5fdmlzaWJsZUZnUGF0aHNTZWw9CnRoaXMuX2ZnUGF0aHNTZWwuZmlsdGVyKCI6bm90KC5pbnZpc2libGUtcGF0aCkiKX19ZC5MaW5lc0NvbGxlY3Rpb249bH0pKGMucGFyYWxsZWxfY29vcmRzX3Bsb3R8fChjLnBhcmFsbGVsX2Nvb3Jkc19wbG90PXt9KSl9KShhLmhwYXJhbXN8fChhLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L2ludGVyYWN0aW9uX21hbmFnZXIuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7Y2xhc3MgZntjb25zdHJ1Y3RvcihsLGspe3RoaXMuc3ZnPWQzLnNlbGVjdChsKTtsPTEwMCprKzIwO3RoaXMuc3ZnLmF0dHIoInZpZXdCb3giLGAwIDAgJHtsfSAkezI0MH1gKTt0aGlzLnN2Zy5hdHRyKCJwcmVzZXJ2ZUFzcGVjdFJhdGlvIiwieE1pZFlNaWQiKTt0aGlzLnN2Zy5zdHlsZSgibWluLXdpZHRoIixsKyJweCIpO3RoaXMuc3ZnLnN0eWxlKCJtaW4taGVpZ2h0IiwiMjQwcHgiKTt0aGlzLndpZHRoPWwtMTAtMTA7dGhpcy5oZWlnaHQ9MjAwO3RoaXMuc3ZnRz10aGlzLnN2Zy5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLGEuaHBhcmFtcy51dGlscy50cmFuc2xhdGVTdHIoMTAsMzApKX19ZC5TVkdQcm9wZXJ0aWVzPWY7Y2xhc3MgZ3tjb25zdHJ1Y3RvcihsLGssbixwKXt0aGlzLl9zdmdQcm9wcz1sO3RoaXMuX3NjaGVtYT1rO3RoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQj1uO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCPQpwO3RoaXMuX2F4ZXNDb2xsZWN0aW9uPW5ldyBkLkF4ZXNDb2xsZWN0aW9uKGwsayx0aGlzKTt0aGlzLl9saW5lc0NvbGxlY3Rpb249bmV3IGQuTGluZXNDb2xsZWN0aW9uKGwsayx0aGlzLl9heGVzQ29sbGVjdGlvbik7dGhpcy5fc3ZnUHJvcHMuc3ZnLm9uKCJjbGljayIsKCk9PnRoaXMub25DbGljaygpKS5vbigibW91c2Vtb3ZlIG1vdXNlZW50ZXIiLCgpPT57Y29uc3QgW3Escl09ZDMubW91c2UodGhpcy5fc3ZnUHJvcHMuc3ZnRy5ub2RlKCkpO3RoaXMub25Nb3VzZU1vdmVkKHEscil9KS5vbigibW91c2VsZWF2ZSIsKCk9PnRoaXMub25Nb3VzZUxlYXZlKCkpfW9uRHJhZ1N0YXJ0KGwpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmRyYWdTdGFydChsKTt0aGlzLl9saW5lc0NvbGxlY3Rpb24uaGlkZUJhY2tncm91bmRMaW5lcygpfW9uRHJhZyhsKXt0aGlzLl9heGVzQ29sbGVjdGlvbi5kcmFnKGwpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGQuTGluZVR5cGUuRk9SRUdST1VORCl9b25EcmFnRW5kKCl7dGhpcy5fYXhlc0NvbGxlY3Rpb24uZHJhZ0VuZCgpOwp0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVjb21wdXRlQ29udHJvbFBvaW50cyhkLkxpbmVUeXBlLkZPUkVHUk9VTkQsNTAwKTt3aW5kb3cuc2V0VGltZW91dCgoKT0+e3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGQuTGluZVR5cGUuQkFDS0dST1VORCk7dGhpcy5fbGluZXNDb2xsZWN0aW9uLnNob3dCYWNrZ3JvdW5kTGluZXMoKX0sNTAwKX1vbkJydXNoQ2hhbmdlZChsKXt0aGlzLl9heGVzQ29sbGVjdGlvbi5nZXRBeGlzRm9yQ29sSW5kZXgobCkuc2V0QnJ1c2hTZWxlY3Rpb24oZDMuZXZlbnQuc2VsZWN0aW9uKTt0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpfW9uTW91c2VNb3ZlZChsLGspe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi51cGRhdGVQZWFrZWRTZXNzaW9uR3JvdXAodGhpcy5fbGluZXNDb2xsZWN0aW9uLmZpbmRDbG9zZXN0U2Vzc2lvbkdyb3VwKGwsaykpO3RoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCkpfW9uTW91c2VMZWF2ZSgpe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5pc051bGwoKXx8Cih0aGlzLl9saW5lc0NvbGxlY3Rpb24uY2xlYXJQZWFrZWRTZXNzaW9uR3JvdXAoKSx0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ0IobnVsbCkpfW9uQ2xpY2soKXt0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCk9PT10aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKT90aGlzLl9saW5lc0NvbGxlY3Rpb24udXBkYXRlU2VsZWN0ZWRTZXNzaW9uR3JvdXAobmV3IGQuU2Vzc2lvbkdyb3VwSGFuZGxlKTp0aGlzLl9saW5lc0NvbGxlY3Rpb24udXBkYXRlU2VsZWN0ZWRTZXNzaW9uR3JvdXAodGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpKTt0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSl9b25PcHRpb25zT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZChsLAprKXt0aGlzLl9heGVzQ29sbGVjdGlvbi51cGRhdGVBeGVzKGwsayk7Y29uc3Qgbj10aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkscD10aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKTt0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVkcmF3KGssdm9pZCAwIT09bC5jb2xvckJ5Q29sdW1uSW5kZXg/bC5jb2x1bW5zW2wuY29sb3JCeUNvbHVtbkluZGV4XS5hYnNvbHV0ZUluZGV4Om51bGwsbC5taW5Db2xvcixsLm1heENvbG9yKTtuLmVxdWFsc1RvKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSl8fHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCkpO3AuZXF1YWxzVG8odGhpcy5fbGluZXNDb2xsZWN0aW9uLnNlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlKCkpfHwKdGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ0IodGhpcy5fbGluZXNDb2xsZWN0aW9uLnNlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCkpfXNjaGVtYSgpe3JldHVybiB0aGlzLl9zY2hlbWF9fWQuSW50ZXJhY3Rpb25NYW5hZ2VyPWd9KShjLnBhcmFsbGVsX2Nvb3Jkc19wbG90fHwoYy5wYXJhbGxlbF9jb29yZHNfcGxvdD17fSkpfSkoYS5ocGFyYW1zfHwoYS5ocGFyYW1zPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtcGxvdC90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QiLHByb3BlcnRpZXM6e3Nlc3Npb25Hcm91cHM6QXJyYXksb3B0aW9uczpPYmplY3Qsc2VsZWN0ZWRTZXNzaW9uR3JvdXA6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGwscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxjbG9zZXN0U2Vzc2lvbkdyb3VwOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0scmVkcmF3Q291bnQ6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF92YWxpZFNlc3Npb25Hcm91cHM6QXJyYXksX2ludGVyYWN0aW9uTWFuYWdlcjpPYmplY3R9LG9ic2VydmVyczpbIl9vcHRpb25zT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZChvcHRpb25zLiosIHNlc3Npb25Hcm91cHMuKikiXSxfb3B0aW9uc09yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQoKXtpZihudWxsIT09dGhpcy5vcHRpb25zKXt2YXIgYT10aGlzLm9wdGlvbnMuY29uZmlndXJhdGlvbjtpZih2b2lkIDA9PT10aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXJ8fAohXy5pc0VxdWFsKHRoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5zY2hlbWEoKSxhLnNjaGVtYSkpe2QzLnNlbGVjdCh0aGlzLiQuc3ZnKS5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTtjb25zdCBjPW5ldyB0Zi5ocGFyYW1zLnBhcmFsbGVsX2Nvb3Jkc19wbG90LlNWR1Byb3BlcnRpZXModGhpcy4kLnN2Zyx0Zi5ocGFyYW1zLnV0aWxzLm51bUNvbHVtbnMoYS5zY2hlbWEpKTt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuc3ZnLCEwKTt0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXI9bmV3IHRmLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QuSW50ZXJhY3Rpb25NYW5hZ2VyKGMsYS5zY2hlbWEsZD0+dGhpcy5jbG9zZXN0U2Vzc2lvbkdyb3VwQ2hhbmdlZChkKSxkPT50aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZChkKSl9dGhpcy5fY29tcHV0ZVZhbGlkU2Vzc2lvbkdyb3VwcygpO3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbk9wdGlvbnNPclNlc3Npb25Hcm91cHNDaGFuZ2VkKHRoaXMub3B0aW9ucywKdGhpcy5fdmFsaWRTZXNzaW9uR3JvdXBzKTt0aGlzLnJlZHJhd0NvdW50Kyt9fSxjbG9zZXN0U2Vzc2lvbkdyb3VwQ2hhbmdlZChhKXt0aGlzLl9zZXRDbG9zZXN0U2Vzc2lvbkdyb3VwKGEpfSxzZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWQoYSl7dGhpcy5fc2V0U2VsZWN0ZWRTZXNzaW9uR3JvdXAoYSl9LF9jb21wdXRlVmFsaWRTZXNzaW9uR3JvdXBzKCl7Y29uc3QgYT10Zi5ocGFyYW1zLnV0aWxzO2lmKHZvaWQgMD09PXRoaXMuc2Vzc2lvbkdyb3Vwcyl0aGlzLl92YWxpZFNlc3Npb25Hcm91cHM9dm9pZCAwO2Vsc2V7dmFyIGM9dGhpcy5vcHRpb25zLmNvbmZpZ3VyYXRpb24uc2NoZW1hO3RoaXMuX3ZhbGlkU2Vzc2lvbkdyb3Vwcz10aGlzLnNlc3Npb25Hcm91cHMuZmlsdGVyKGQ9Pntmb3IobGV0IGY9MDtmPGEubnVtQ29sdW1ucyhjKTsrK2YpaWYodGhpcy5vcHRpb25zLmNvbmZpZ3VyYXRpb24uY29sdW1uc1Zpc2liaWxpdHlbZl0mJnZvaWQgMD09PWEuY29sdW1uVmFsdWVCeUluZGV4KGMsCmQsZikpcmV0dXJuITE7cmV0dXJuITB9KX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldy90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXciLHByb3BlcnRpZXM6e2JhY2tlbmQ6T2JqZWN0LGV4cGVyaW1lbnROYW1lOlN0cmluZyxjb25maWd1cmF0aW9uOk9iamVjdCxzZXNzaW9uR3JvdXBzOkFycmF5fSxfY2xvc2VzdE9yU2VsZWN0ZWQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gbnVsbCE9PWE/YTpjfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90L3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90Iixwcm9wZXJ0aWVzOnt2aXNpYmxlU2NoZW1hOk9iamVjdCxzZXNzaW9uR3JvdXBzOkFycmF5LG9wdGlvbnM6T2JqZWN0LHNlbGVjdGVkU2Vzc2lvbkdyb3VwOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sY2xvc2VzdFNlc3Npb25Hcm91cDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbCxyZWFkT25seTohMCxub3RpZnk6ITB9LF9jb250YWluZXI6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9zdmc6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LHdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTowfSxoZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF9icnVzaGVkQ2VsbEluZGV4Ont0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfYnJ1c2hTZWxlY3Rpb246e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6WyJfc2Vzc2lvbkdyb3Vwc0NoYW5nZWQoc2Vzc2lvbkdyb3Vwcy4qKSIsCiJfdmlzaWJsZVNjaGVtYUNoYW5nZWQodmlzaWJsZVNjaGVtYS4qKSIsIl9yZWRyYXcob3B0aW9ucy4qKSJdLHJlYWR5KCl7dGhpcy5fY29udGFpbmVyPXRoaXMuJC5jb250YWluZXI7dGhpcy5fc3ZnPWQzLnNlbGVjdCh0aGlzLiQuc3ZnKTt0aGlzLl9yZWRyYXcoKX0sX3Nlc3Npb25Hcm91cHNDaGFuZ2VkKCl7bnVsbCE9PXRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXAmJnRoaXMuX3NldFNlbGVjdGVkU2Vzc2lvbkdyb3VwKHRmLmhwYXJhbXMudXRpbHMuc2Vzc2lvbkdyb3VwV2l0aE5hbWUodGhpcy5zZXNzaW9uR3JvdXBzLHRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXAubmFtZSl8fG51bGwpO3RoaXMuX3JlZHJhdygpfSxfdmlzaWJsZVNjaGVtYUNoYW5nZWQoKXt0aGlzLl9icnVzaFNlbGVjdGlvbj10aGlzLl9icnVzaGVkQ2VsbEluZGV4PW51bGw7dGhpcy5fcmVkcmF3KCl9LF9yZWRyYXcoKXt0aGlzLmRlYm91bmNlKCJfcmVkcmF3IiwoKT0+e2NvbnN0IGE9dGYuaHBhcmFtcy51dGlsczsKdGhpcy53aWR0aD1NYXRoLm1heCgxNTAqYS5udW1WaXNpYmxlQ29sdW1ucyh0aGlzLnZpc2libGVTY2hlbWEpLDEyMDApO3RoaXMuaGVpZ2h0PU1hdGgubWF4KDExMi41KmEubnVtVmlzaWJsZU1ldHJpY3ModGhpcy52aXNpYmxlU2NoZW1hKSw0ODApO3RoaXMuX2NvbnRhaW5lci5zdHlsZS53aWR0aD10aGlzLndpZHRoKyJweCI7dGhpcy5fY29udGFpbmVyLnN0eWxlLmhlaWdodD10aGlzLmhlaWdodCsicHgiO3RoaXMuX3N2Zy5hdHRyKCJ3aWR0aCIsdGhpcy53aWR0aCkuYXR0cigiaGVpZ2h0Iix0aGlzLmhlaWdodCk7dGhpcy5fc3ZnLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpO3RoaXMuX2RyYXcoKX0sMTAwKX0sX2RyYXcoKXtmdW5jdGlvbiBhKGxhKXtyZXR1cm4ieC1heGlzLWNsaXAtcGF0aC0iK2xhfWZ1bmN0aW9uIGMobGEpe3JldHVybiJ4LWxhYmVsLWNsaXAtcGF0aC0iK2xhfWZ1bmN0aW9uIGQobGEpe3JldHVybiJ5LWF4aXMtY2xpcC1wYXRoLSIrbGF9ZnVuY3Rpb24gZihsYSl7cmV0dXJuInktbGFiZWwtY2xpcC1wYXRoLSIrCmxhfWZ1bmN0aW9uIGcobGEsWixGYSx4YSx5YSl7RmE9TWF0aC5mbG9vcihGYS94YSk7eGE9Wi5zY2FsZSgpO2lmKCJRVUFOVElMRSI9PT15YSl7bGV0IEJhPXhhLnF1YW50aWxlcygpO0JhPWQzLnJhbmdlKDAsQmEubGVuZ3RoLE1hdGguY2VpbChCYS5sZW5ndGgvRmEpKS5tYXAoR2E9PkJhW0dhXSk7Wi50aWNrVmFsdWVzKEJhKS50aWNrRm9ybWF0KGQzLmZvcm1hdCgiLS4yZyIpKX0iTElORUFSIiE9PXlhJiYiTE9HIiE9PXlhfHxaLnRpY2tzKEZhKTtsYS5jYWxsKFopO2xhLnNlbGVjdEFsbCgiLmRvbWFpbiIpLnJlbW92ZSgpO2xhLnNlbGVjdEFsbCgiLnRpY2sgbGluZSIpLmF0dHIoInN0cm9rZSIsIiNkZGQiKX1mdW5jdGlvbiBsKGxhLFope3JldHVybiBQW1pdKHguX2NvbFZhbHVlKGxhLFopKX1mdW5jdGlvbiBrKGxhLFope3JldHVybiBIW1pdKHguX21ldHJpY1ZhbHVlKGxhLFopKX1mdW5jdGlvbiBuKGxhLFope2NvbnN0IEZhPVtdO1VbbGFdW1pdLmVhY2goZnVuY3Rpb24oKXtGYS5wdXNoKHRoaXMpfSk7CnJldHVybiBkMy5xdWFkdHJlZSgpLngoeGE9PmQzLnNlbGVjdCh4YSkuZGF0dW0oKS54KS55KHhhPT5kMy5zZWxlY3QoeGEpLmRhdHVtKCkueSkuYWRkQWxsKEZhKX1mdW5jdGlvbiBwKCl7bGV0IGxhPW5ldyBTZXQoUi5ub2RlcygpKTt2KCl8fChsYT1xKHguX2JydXNoZWRDZWxsSW5kZXgseC5fYnJ1c2hTZWxlY3Rpb24pKTtkMy5zZWxlY3RBbGwoQXJyYXkuZnJvbSh6LmZpbHRlclNldChsYSxaPT4hYWEuaGFzKFopKSkpLmF0dHIoImZpbGwiLEwpO2QzLnNlbGVjdEFsbChBcnJheS5mcm9tKHouZmlsdGVyU2V0KGFhLFo9PiFsYS5oYXMoWikpKSkuYXR0cigiZmlsbCIsIiNkZGQiKTthYT1sYX1mdW5jdGlvbiBxKGxhLFope2NvbnNvbGUuYXNzZXJ0KG51bGwhPT1sYSk7Y29uc29sZS5hc3NlcnQobnVsbCE9PVopO2NvbnN0IFtGYSx4YV09bGEseWE9bmV3IFNldDt6LnF1YWRUcmVlVmlzaXRQb2ludHNJblJlY3QoYmFbRmFdW3hhXSxaWzBdWzBdLFpbMF1bMV0sWlsxXVswXSxaWzFdWzFdLApCYT0+e2QzLnNlbGVjdChCYSkuZGF0dW0oKS5zZXNzaW9uR3JvdXBNYXJrZXJzLmZvckVhY2goR2E9Pnt5YS5hZGQoR2EpfSl9KTtyZXR1cm4geWF9ZnVuY3Rpb24gcihsYSl7Y29uc3QgWj1kMy5icnVzaFNlbGVjdGlvbihsYSk7IXQoKSYmbnVsbD09PVp8fHQoKSYmbGE9PT1tYS5ub2RlKCkmJl8uaXNFcXVhbChaLHguX2JydXNoU2VsZWN0aW9uKXx8KHguX2JydXNoU2VsZWN0aW9uPVosbnVsbCE9PVo/KG1hPWQzLnNlbGVjdChsYSkseC5fYnJ1c2hlZENlbGxJbmRleD1tYS5kYXR1bSgpKToobWE9bnVsbCx4Ll9icnVzaGVkQ2VsbEluZGV4PW51bGwpLHAoKSl9ZnVuY3Rpb24gdCgpe3JldHVybiBudWxsIT09eC5fYnJ1c2hlZENlbGxJbmRleCYmbnVsbCE9PXguX2JydXNoU2VsZWN0aW9ufWZ1bmN0aW9uIHYoKXtyZXR1cm4hdCgpfHx4Ll9icnVzaFNlbGVjdGlvblswXVswXT09PXguX2JydXNoU2VsZWN0aW9uWzFdWzBdfHx4Ll9icnVzaFNlbGVjdGlvblswXVsxXT09PXguX2JydXNoU2VsZWN0aW9uWzFdWzFdfQpmdW5jdGlvbiB5KGxhLFosRmEseGEseWEpe2xldCBCYT1JbmZpbml0eSxHYT1udWxsO3oucXVhZFRyZWVWaXNpdFBvaW50c0luRGlzayhiYVtsYV1bWl0sRmEseGEseWEsKHphLFVhKT0+e2FhLmhhcyh6YSkmJlVhPEJhJiYoemE9ZDMuc2VsZWN0KHphKS5kYXR1bSgpLEJhPVVhLEdhPXphLnNlc3Npb25Hcm91cCl9KTtyZXR1cm4gbnVsbD09PUdhP251bGw6ZDMuc2VsZWN0QWxsKFkuZ2V0KEdhKSl9Y29uc3Qgej10Zi5ocGFyYW1zLnV0aWxzLHg9dGhpcztpZih0aGlzLnNlc3Npb25Hcm91cHMmJjAhPXRoaXMuc2Vzc2lvbkdyb3Vwcy5sZW5ndGgmJnRoaXMudmlzaWJsZVNjaGVtYSYmMCE9dGhpcy52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zLmxlbmd0aCl7dmFyIEM9ZDMucmFuZ2Uoei5udW1WaXNpYmxlQ29sdW1ucyh4LnZpc2libGVTY2hlbWEpKSxGPWQzLnJhbmdlKHoubnVtVmlzaWJsZU1ldHJpY3MoeC52aXNpYmxlU2NoZW1hKSksRD1kMy5zY2FsZUJhbmQoKS5kb21haW4oQykucmFuZ2UoWzg1LAp0aGlzLndpZHRoLTEtNV0pLnBhZGRpbmdJbm5lciguMSksQj1kMy5zY2FsZUJhbmQoKS5kb21haW4oRikucmFuZ2UoW3RoaXMuaGVpZ2h0LTEtNS01MCw1XSkucGFkZGluZ0lubmVyKC4xKSxJPUQuYmFuZHdpZHRoKCksTz1CLmJhbmR3aWR0aCgpLFA9Qy5tYXAobGE9PnguX2NlbGxTY2FsZShsYSxbMCxJLTFdKSksSD1GLm1hcChsYT0+eC5fY2VsbFNjYWxlKGxhK3oubnVtVmlzaWJsZUhQYXJhbXMoeC52aXNpYmxlU2NoZW1hKSxbTy0xLDBdKSksSz10aGlzLl9zdmcuc2VsZWN0QWxsKCIueC1heGlzIikuZGF0YShDKS5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoIngtYXhpcyIsITApLmF0dHIoInRyYW5zZm9ybSIsbGE9PnoudHJhbnNsYXRlU3RyKEQobGEpLDApKTtLLmFwcGVuZCgiY2xpcFBhdGgiKS5hdHRyKCJpZCIsYSkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLTUpLmF0dHIoInkiLDApLmF0dHIoIndpZHRoIixJKzEwKS5hdHRyKCJoZWlnaHQiLHguaGVpZ2h0LTI1KTsKSy5hcHBlbmQoImNsaXBQYXRoIikuYXR0cigiaWQiLGMpLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLDApLmF0dHIoInkiLHguaGVpZ2h0LTI1KS5hdHRyKCJ3aWR0aCIsSSkuYXR0cigiaGVpZ2h0IiwyNSk7Sy5hcHBlbmQoImciKS5hdHRyKCJjbGlwLXBhdGgiLGxhPT4idXJsKCMiK2EobGEpKyIpIikuZWFjaChmdW5jdGlvbihsYSl7ZDMuc2VsZWN0KHRoaXMpLmNhbGwoZyxkMy5heGlzQm90dG9tKFBbbGFdKS50aWNrU2l6ZSh4LmhlaWdodC01MCksSSw0MCx4Lm9wdGlvbnMuY29sdW1uc1tsYV0uc2NhbGUpfSk7Sy5hcHBlbmQoImciKS5jbGFzc2VkKCJ4LWF4aXMtbGFiZWwiLCEwKS5hdHRyKCJjbGlwLXBhdGgiLGxhPT4idXJsKCMiK2MobGEpKyIpIikuYXBwZW5kKCJ0ZXh0IikuYXR0cigidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5hdHRyKCJ4IixJLzIpLmF0dHIoInkiLHguaGVpZ2h0LTEtMTIuNSkudGV4dChsYT0+ei5zY2hlbWFWaXNpYmxlQ29sdW1uTmFtZSh4LnZpc2libGVTY2hlbWEsCmxhKSkuYXBwZW5kKCJ0aXRsZSIpLnRleHQobGE9Pnouc2NoZW1hVmlzaWJsZUNvbHVtbk5hbWUoeC52aXNpYmxlU2NoZW1hLGxhKSk7Sz10aGlzLl9zdmcuc2VsZWN0QWxsKCIueS1heGlzIikuZGF0YShGKS5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoInktYXhpcyIsITApLmF0dHIoInRyYW5zZm9ybSIsbGE9PnoudHJhbnNsYXRlU3RyKHgud2lkdGgtMSxCKGxhKSkpO0suYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImlkIixkKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtKHgud2lkdGgtNDAtMSkpLmF0dHIoInkiLC01KS5hdHRyKCJ3aWR0aCIseC53aWR0aC00MCkuYXR0cigiaGVpZ2h0IixPKzEwKTtLLmFwcGVuZCgiY2xpcFBhdGgiKS5hdHRyKCJpZCIsZikuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLSh4LndpZHRoLTEpKS5hdHRyKCJ5IiwwKS5hdHRyKCJ3aWR0aCIsNDApLmF0dHIoImhlaWdodCIsTyk7Sy5hcHBlbmQoImciKS5hdHRyKCJjbGlwLXBhdGgiLGxhPT4idXJsKCMiKwpkKGxhKSsiKSIpLmVhY2goZnVuY3Rpb24obGEpe2QzLnNlbGVjdCh0aGlzKS5jYWxsKGcsZDMuYXhpc0xlZnQoSFtsYV0pLnRpY2tTaXplKHgud2lkdGgtODApLE8sMjAseC5vcHRpb25zLmNvbHVtbnNbbGErei5udW1WaXNpYmxlSFBhcmFtcyh4LnZpc2libGVTY2hlbWEpXS5zY2FsZSl9KTtLLmFwcGVuZCgiZyIpLmNsYXNzZWQoInktYXhpcy1sYWJlbCIsITApLmF0dHIoImNsaXAtcGF0aCIsbGE9PiJ1cmwoIyIrZihsYSkrIikiKS5hcHBlbmQoInRleHQiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLmF0dHIoIngiLC0oeC53aWR0aC0yMC0xKSkuYXR0cigieSIsTy8yKS5hdHRyKCJ0cmFuc2Zvcm0iLHoucm90YXRlU3RyKC0oeC53aWR0aC0yMC0xKSxPLzIpKS50ZXh0KGxhPT56Lm1ldHJpY05hbWUoeC52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zW2xhXSkpLmFwcGVuZCgidGl0bGUiKS50ZXh0KGxhPT56Lm1ldHJpY05hbWUoeC52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zW2xhXSkpOwpLPXRoaXMuX3N2Zy5zZWxlY3RBbGwoIi5jZWxsIikuZGF0YShkMy5jcm9zcyhDLEYpKS5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoImNlbGwiLCEwKS5hdHRyKCJ0cmFuc2Zvcm0iLChbbGEsWl0pPT56LnRyYW5zbGF0ZVN0cihEKGxhKSxCKFopKSk7Sy5hcHBlbmQoImciKS5jbGFzc2VkKCJmcmFtZSIsITApLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC01KS5hdHRyKCJ5IiwtNSkuYXR0cigid2lkdGgiLEkrMTApLmF0dHIoImhlaWdodCIsTysxMCkuYXR0cigic3Ryb2tlIiwiIzAwMCIpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigic2hhcGUtcmVuZGVyaW5nIiwiY3Jpc3BFZGdlcyIpO3ZhciBNPW51bGw7dm9pZCAwIT09eC5vcHRpb25zLmNvbG9yQnlDb2x1bW5JbmRleCYmKE09ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4odGhpcy5fY29sRXh0ZW50KHRoaXMub3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgpKS5yYW5nZShbdGhpcy5vcHRpb25zLm1pbkNvbG9yLHRoaXMub3B0aW9ucy5tYXhDb2xvcl0pLmludGVycG9sYXRlKGQzLmludGVycG9sYXRlTGFiKSk7CnZhciBMPXZvaWQgMD09PXgub3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXg/KCk9PiJyZWQiOih7c2Vzc2lvbkdyb3VwOmxhfSk9Pk0odGhpcy5fY29sVmFsdWUobGEseC5vcHRpb25zLmNvbG9yQnlDb2x1bW5JbmRleCkpLFtSLFUsWV09ZnVuY3Rpb24obGEsWil7Y29uc3QgRmE9bGEuc2VsZWN0QWxsKCIuZGF0YS1tYXJrZXIiKS5kYXRhKChbeWEsQmFdKT0+eC5zZXNzaW9uR3JvdXBzLmZpbHRlcihHYT0+dm9pZCAwIT09eC5fY29sVmFsdWUoR2EseWEpJiZ2b2lkIDAhPT14Ll9tZXRyaWNWYWx1ZShHYSxCYSkpLm1hcChHYT0+KHtjb2w6eWEsbWV0cmljOkJhLHNlc3Npb25Hcm91cDpHYSx4OmwoR2EseWEpLHk6ayhHYSxCYSksc2Vzc2lvbkdyb3VwTWFya2VyczpudWxsfSkpKS5lbnRlcigpLmFwcGVuZCgiY2lyY2xlIikuY2xhc3NlZCgiZGF0YS1tYXJrZXIiLCEwKS5hdHRyKCJjeCIsKHt4OnlhfSk9PnlhKS5hdHRyKCJjeSIsKHt5OnlhfSk9PnlhKS5hdHRyKCJyIiwyKS5hdHRyKCJmaWxsIiwKWikseGE9bmV3IE1hcDt4LnNlc3Npb25Hcm91cHMuZm9yRWFjaCh5YT0+e3hhLnNldCh5YSxbXSl9KTtGYS5lYWNoKGZ1bmN0aW9uKHlhKXt4YS5nZXQoeWEuc2Vzc2lvbkdyb3VwKS5wdXNoKHRoaXMpfSk7RmEuZWFjaCh5YT0+e2NvbnN0IEJhPXhhLmdldCh5YS5zZXNzaW9uR3JvdXApO3lhLnNlc3Npb25Hcm91cE1hcmtlcnM9bmV3IFNldChCYSl9KTtsYT1DLm1hcCh5YT0+Ri5tYXAoQmE9PkZhLmZpbHRlcihHYT0+R2EuY29sPT15YSYmR2EubWV0cmljPT1CYSkpKTtyZXR1cm5bRmEsbGEseGFdfShLLmFwcGVuZCgiZyIpLEwpLGJhPUMubWFwKGxhPT5GLm1hcChaPT5uKGxhLFopKSksbWE9bnVsbDt0KCkmJihtYT1LLmZpbHRlcihsYT0+Xy5pc0VxdWFsKGxhLHguX2JydXNoZWRDZWxsSW5kZXgpKSxjb25zb2xlLmFzc2VydCgxPT1tYS5zaXplKCksbWEpKTt2YXIgYWE9bmV3IFNldChSLm5vZGVzKCkpO3AoKTt2YXIgY2E9ZDMuYnJ1c2goKS5leHRlbnQoW1stNCwtNF0sW0ktMSs1LQoxLE8tMSs1LTFdXSkub24oInN0YXJ0IixmdW5jdGlvbigpe3QoKSYmbWEubm9kZSgpIT10aGlzJiZjYS5tb3ZlKG1hLG51bGwpO3IodGhpcyl9KS5vbigiYnJ1c2giLGZ1bmN0aW9uKCl7cih0aGlzKX0pLm9uKCJlbmQiLGZ1bmN0aW9uKCl7cih0aGlzKX0pO0suY2FsbChjYSk7dCgpJiZjYS5tb3ZlKG1hLHguX2JydXNoU2VsZWN0aW9uKTt2YXIgZmE9bnVsbCxkYT1udWxsO251bGwhPT10aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwJiYoZGE9ZDMuc2VsZWN0QWxsKFkuZ2V0KHRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXApKS5jbGFzc2VkKCJzZWxlY3RlZC1tYXJrZXIiLCEwKSk7Sy5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dmFyIGxhPWZhPT09ZGE/bnVsbDpmYTtsYSE9PWRhJiYobnVsbCE9PWRhJiZkYS5jbGFzc2VkKCJzZWxlY3RlZC1tYXJrZXIiLCExKSxkYT1sYSxudWxsIT09ZGEmJmRhLmNsYXNzZWQoInNlbGVjdGVkLW1hcmtlciIsITApLGxhPW51bGw9PT1kYT9udWxsOmRhLmRhdHVtKCkuc2Vzc2lvbkdyb3VwLAp4Ll9zZXRTZWxlY3RlZFNlc3Npb25Hcm91cChsYSkpfSkub24oIm1vdXNlbW92ZSBtb3VzZWVudGVyIixmdW5jdGlvbihbbGEsWl0pe2NvbnN0IFtGYSx4YV09ZDMubW91c2UodGhpcyk7bGE9eShsYSxaLEZhLHhhLDIwKTtmYSE9PWxhJiYobnVsbCE9PWZhJiZmYS5jbGFzc2VkKCJjbG9zZXN0LW1hcmtlciIsITEpLGZhPWxhLG51bGwhPT1mYT8oZmEuY2xhc3NlZCgiY2xvc2VzdC1tYXJrZXIiLCEwKSx4Ll9zZXRDbG9zZXN0U2Vzc2lvbkdyb3VwKGZhLmRhdHVtKCkuc2Vzc2lvbkdyb3VwKSk6eC5fc2V0Q2xvc2VzdFNlc3Npb25Hcm91cChudWxsKSl9KS5vbigibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXtudWxsIT09ZmEmJihmYS5jbGFzc2VkKCJjbG9zZXN0LW1hcmtlciIsITEpLGZhPW51bGwseC5fc2V0Q2xvc2VzdFNlc3Npb25Hcm91cChudWxsKSl9KTt0aGlzLl9zdmcuc2VsZWN0QWxsKCIqIikuY2xhc3NlZCgidGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QiLCEwKX19LApfY2VsbFNjYWxlKGEsYyl7dmFyIGQ9dGhpcy5fY29sRXh0ZW50KGEpO2NvbnN0IGY9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oZCkucmFuZ2UoYyk7aWYoIkxJTkVBUiI9PT10aGlzLm9wdGlvbnMuY29sdW1uc1thXS5zY2FsZSlyZXR1cm4gZjtpZigiTE9HIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW2FdLnNjYWxlKXJldHVybiAwPj1kWzBdJiYwPD1kWzFdP2Y6ZDMuc2NhbGVMb2coKS5kb21haW4oZCkucmFuZ2UoYyk7aWYoIlFVQU5USUxFIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW2FdLnNjYWxlKXtjb25zdCBnPShjWzFdLWNbMF0pLzE5O2Q9ZDMucmFuZ2UoMjApLm1hcChsPT5jWzBdK2cqbCk7cmV0dXJuIGQzLnNjYWxlUXVhbnRpbGUoKS5kb21haW4oXy51bmlxKHRoaXMuc2Vzc2lvbkdyb3Vwcy5tYXAobD0+dGhpcy5fY29sVmFsdWUobCxhKSkpKS5yYW5nZShkKX1pZigiTk9OX05VTUVSSUMiPT09dGhpcy5vcHRpb25zLmNvbHVtbnNbYV0uc2NhbGUpcmV0dXJuIGQzLnNjYWxlUG9pbnQoKS5kb21haW4oXy51bmlxKHRoaXMuc2Vzc2lvbkdyb3Vwcy5tYXAoZz0+CnRoaXMuX2NvbFZhbHVlKGcsYSkpLnNvcnQoKSkpLnJhbmdlKGMpLnBhZGRpbmcoLjEpO3Rocm93IlVua25vd24gc2NhbGUgZm9yIGNvbHVtbjogIithKyIuIG9wdGlvbnM6ICIrdGhpcy5vcHRpb25zO30sX2NvbFZhbHVlKGEsYyl7cmV0dXJuIHRmLmhwYXJhbXMudXRpbHMuY29sdW1uVmFsdWVCeVZpc2libGVJbmRleCh0aGlzLnZpc2libGVTY2hlbWEsYSxjKX0sX21ldHJpY1ZhbHVlKGEsYyl7cmV0dXJuIHRmLmhwYXJhbXMudXRpbHMubWV0cmljVmFsdWVCeVZpc2libGVJbmRleCh0aGlzLnZpc2libGVTY2hlbWEsYSxjKX0sX2NvbEV4dGVudChhKXtyZXR1cm4gdGYuaHBhcmFtcy51dGlscy52aXNpYmxlTnVtZXJpY0NvbHVtbkV4dGVudCh0aGlzLnZpc2libGVTY2hlbWEsdGhpcy5zZXNzaW9uR3JvdXBzLGEpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3L3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Iixwcm9wZXJ0aWVzOntiYWNrZW5kOk9iamVjdCxleHBlcmltZW50TmFtZTpTdHJpbmcsY29uZmlndXJhdGlvbjpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheX0sX2Nsb3Nlc3RPclNlbGVjdGVkOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIG51bGwhPT1hP2E6Y319KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXNlc3Npb25zLXBhbmUvdGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2Vzc2lvbnMtcGFuZSIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsaGVscFVybDpTdHJpbmcsYnVnUmVwb3J0VXJsOlN0cmluZyxleHBlcmltZW50TmFtZTpTdHJpbmcsY29uZmlndXJhdGlvbjpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheSxfc2VsZWN0ZWRUYWI6e3R5cGU6TnVtYmVyLHZhbHVlOjB9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtZ29vZ2xlLWFuYWx5dGljcy10cmFja2VyL3RmLWhwYXJhbXMtZ29vZ2xlLWFuYWx5dGljcy10cmFja2VyLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWhwYXJhbXMtZ29vZ2xlLWFuYWx5dGljcy10cmFja2VyIixoYW5kbGVFdmVudDpmdW5jdGlvbigpe319KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1tYWluL3RmLWhwYXJhbXMtbWFpbi5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLW1haW4iLHByb3BlcnRpZXM6e2JhY2tlbmQ6T2JqZWN0LGV4cGVyaW1lbnROYW1lOlN0cmluZyx0cmFja2luZ0lkOlN0cmluZyxoZWxwVXJsOlN0cmluZyxidWdSZXBvcnRVcmw6U3RyaW5nLF9jb25maWd1cmF0aW9uOk9iamVjdCxfc2Vzc2lvbkdyb3VwczpBcnJheSxfdGhyb3R0bGVkU2VuZEV2ZW50VG9HQTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+Xy50aHJvdHRsZShmdW5jdGlvbigpe3RoaXMuX2hhbmRsZUdBRXZlbnQoe2RldGFpbDp7aGl0VHlwZToiZXZlbnQiLGV2ZW50Q2F0ZWdvcnk6IlVzZXJJbnRlcmFjdGlvbiIsZXZlbnRMYWJlbDoiRXhwZXJpbWVudDogIit0aGlzLmV4cGVyaW1lbnROYW1lfX0pfSw2RTQse2xlYWRpbmc6ITB9KX19LGxpc3RlbmVyczp7bW91c2Vtb3ZlOiJfc2VuZEV2ZW50VG9HQSIsdGFwOiJfc2VuZEV2ZW50VG9HQSIsImdvb2dsZS1hbmFseXRpY3MtdHJhY2tpbmciOiJfaGFuZGxlR0FFdmVudCJ9LGF0dGFjaGVkKCl7dGhpcy5faGFuZGxlR0FFdmVudCh7ZGV0YWlsOntoaXRUeXBlOiJwYWdldmlldyJ9fSl9LApyZWxvYWQoKXt0aGlzLiRbInF1ZXJ5LXBhbmUiXS5yZWxvYWQoKX0sX3NlbmRFdmVudFRvR0EoKXt0aGlzLl90aHJvdHRsZWRTZW5kRXZlbnRUb0dBKHRoaXMpfSxfaGFuZGxlR0FFdmVudChhKXt0aGlzLiQudHJhY2tlci5oYW5kbGVFdmVudChhKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLWJhY2tlbmQvdGYtaHBhcmFtcy1iYWNrZW5kLmh0bWwuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXtjbGFzcyBke2NvbnN0cnVjdG9yKGYsZyxsPSEwKXt0aGlzLl9hcGlVcmw9Zjt0aGlzLl9yZXF1ZXN0TWFuYWdlcj1nO3RoaXMuX3VzZUh0dHBHZXQ9bH1nZXRFeHBlcmltZW50KGYpe3JldHVybiB0aGlzLl9zZW5kUmVxdWVzdCgiZXhwZXJpbWVudCIsZil9bGlzdFNlc3Npb25Hcm91cHMoZil7cmV0dXJuIHRoaXMuX3NlbmRSZXF1ZXN0KCJzZXNzaW9uX2dyb3VwcyIsZil9bGlzdE1ldHJpY0V2YWxzKGYpe3JldHVybiB0aGlzLl9zZW5kUmVxdWVzdCgibWV0cmljX2V2YWxzIixmKX1fc2VuZFJlcXVlc3QoZixnKXtpZih0aGlzLl91c2VIdHRwR2V0KXJldHVybiBnPWVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShnKSksdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0aGlzLl9hcGlVcmwrIi8iK2YrIj9yZXF1ZXN0XHgzZCIrZyk7Y29uc3QgbD1uZXcgUW8uUmVxdWVzdE9wdGlvbnM7bC53aXRoQ3JlZGVudGlhbHM9ITA7CmwubWV0aG9kVHlwZT0iUE9TVCI7bC5jb250ZW50VHlwZT0idGV4dC9wbGFpbiI7bC5ib2R5PUpTT04uc3RyaW5naWZ5KGcpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0V2l0aE9wdGlvbnModGhpcy5fYXBpVXJsKyIvIitmLGwpfX1jLkJhY2tlbmQ9ZH0pKGEuaHBhcmFtc3x8KGEuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtZGFzaGJvYXJkL3RmLWhwYXJhbXMtZGFzaGJvYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWhwYXJhbXMtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfYmFja2VuZDp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB0Zi5ocGFyYW1zLkJhY2tlbmQoUW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImhwYXJhbXMiLCIiKSxuZXcgUW8uUmVxdWVzdE1hbmFnZXIsISEod2luZG93LlRFTlNPUkJPQVJEX0VOVnx8e30pLklOX0NPTEFCKX19LHJlbG9hZCgpe3RoaXMuJFsiaHBhcmFtcy1tYWluIl0ucmVsb2FkKCl9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltcG9ydHMvYXJyYXktYnVmZmVyLWRhdGEtcHJvdmlkZXIuanMKdmFyIFh0OwooZnVuY3Rpb24oYSl7YS5FcnJvckNvZGVzPXtDQU5DRUxMRUQ6MX07Y29uc3QgYz17VkVSVEVYOjEsRkFDRToyLENPTE9SOjN9LGQ9e1ZFUlRFWDoiZmxvYXQzMiIsRkFDRToiaW50MzIiLENPTE9SOiJ1aW50OCJ9O2NsYXNzIGZ7Y29uc3RydWN0b3IoZyl7dGhpcy5fcmVxdWVzdE1hbmFnZXI9Zzt0aGlzLl9jYW5jZWxsZXI9bmV3IFFvLkNhbmNlbGxlcn1yZWxvYWQoZyxsLGspe3RoaXMuX2NhbmNlbGxlci5jYW5jZWxBbGwoKTtyZXR1cm4gdGhpcy5fZmV0Y2hNZXRhZGF0YShnLGwsayl9X2ZldGNoRGF0YUJ5U3RlcChnLGwsayxuLHAscSl7ZnVuY3Rpb24gcih0KXtsZXQgdj1bXTtmb3IobGV0IHk9MDt5PHQubGVuZ3RoLzM7eSsrKXtsZXQgej1bXTtmb3IobGV0IHg9MDszPng7eCsrKXoucHVzaCh0WzMqeSt4XSk7di5wdXNoKHopfXJldHVybiB2fWc9UW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoIm1lc2giLCIvZGF0YSIsbmV3IFVSTFNlYXJjaFBhcmFtcyh7dGFnOmwscnVuOmcsCmNvbnRlbnRfdHlwZTprLHNhbXBsZTpuLHN0ZXA6cH0pKTtsPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZSh0PT57aWYodC5jYW5jZWxsZWQpcmV0dXJuIFByb21pc2UucmVqZWN0KHtjb2RlOmEuRXJyb3JDb2Rlcy5DQU5DRUxMRUQsbWVzc2FnZToiUmVzcG9uc2Ugd2FzIGludmFsaWRhdGVkLiJ9KTt0PXQudmFsdWU7c3dpdGNoKGspe2Nhc2UgIlZFUlRFWCI6cS52ZXJ0aWNlcz1yKG5ldyBGbG9hdDMyQXJyYXkodCkpO2JyZWFrO2Nhc2UgIkZBQ0UiOnEuZmFjZXM9cihuZXcgSW50MzJBcnJheSh0KSk7YnJlYWs7Y2FzZSAiQ09MT1IiOnEuY29sb3JzPXIobmV3IFVpbnQ4QXJyYXkodCkpfXJldHVybiBxfSk7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLmZldGNoKGcsbnVsbCwiYXJyYXlidWZmZXIiLGRba10pLnRoZW4odD0+dC5hcnJheUJ1ZmZlcigpKS50aGVuKGwpfWZldGNoRGF0YShnLGwsayxuKXtsZXQgcD1bXSxxPW5ldyBNYXA7T2JqZWN0LmtleXMoYykuZm9yRWFjaChyPT4Ke2cuY29tcG9uZW50cyYxPDxjW3JdJiZwLnB1c2godGhpcy5fZmV0Y2hEYXRhQnlTdGVwKGwsayxyLG4sZy5zdGVwLHEpKX0pO3JldHVybiBQcm9taXNlLmFsbChwKX1fZmV0Y2hNZXRhZGF0YShnLGwsayl7dGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO2c9UW8uZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoIm1lc2giLCIvbWVzaGVzIixuZXcgVVJMU2VhcmNoUGFyYW1zKHt0YWc6bCxydW46ZyxzYW1wbGU6a30pKTtsPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShuPT5uLmNhbmNlbGxlZD9Qcm9taXNlLnJlamVjdCh7Y29kZTphLkVycm9yQ29kZXMuQ0FOQ0VMTEVELG1lc3NhZ2U6IlJlc3BvbnNlIHdhcyBpbnZhbGlkYXRlZC4ifSk6bi52YWx1ZSk7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLmZldGNoKGcpLnRoZW4obj0+bi5qc29uKCkpLnRoZW4obCkudGhlbih0aGlzLl9wcm9jZXNzTWV0YWRhdGEuYmluZCh0aGlzKSl9X3Byb2Nlc3NNZXRhZGF0YShnKXtpZihnKXt2YXIgbD0KbmV3IE1hcDtmb3IobGV0IG49MDtuPGcubGVuZ3RoO24rKyl7bGV0IHA9Z1tuXTtsLmhhcyhwLnN0ZXApfHxsLnNldChwLnN0ZXAsW10pO2wuZ2V0KHAuc3RlcCkucHVzaChwKX12YXIgaz1bXTtsLmZvckVhY2gobj0+e249dGhpcy5fY3JlYXRlU3RlcERhdHVtKG5bMF0pO2sucHVzaChuKX0pO3JldHVybiBrfX1fY3JlYXRlU3RlcERhdHVtKGcpe3JldHVybnt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKmcud2FsbF90aW1lKSxzdGVwOmcuc3RlcCxjb25maWc6Zy5jb25maWcsY29udGVudF90eXBlOmcuY29udGVudF90eXBlLGNvbXBvbmVudHM6Zy5jb21wb25lbnRzfX19YS5BcnJheUJ1ZmZlckRhdGFQcm92aWRlcj1mfSkoWHR8fChYdD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltcG9ydHMvbWVzaC12aWV3ZXIuanMKKGZ1bmN0aW9uKGEpe2NsYXNzIGMgZXh0ZW5kcyBUSFJFRS5FdmVudERpc3BhdGNoZXJ7Y29uc3RydWN0b3IoZCl7c3VwZXIoKTt0aGlzLl9sYXN0TWVzaD1udWxsO3RoaXMuX2Nsb2NrPW5ldyBUSFJFRS5DbG9jazt0aGlzLl9jYW52YXNTaXplPW51bGw7dGhpcy5fcnVuQ29sb3I9ZH1faXNPYmplY3QoZCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBkJiZudWxsIT1kJiYhQXJyYXkuaXNBcnJheShkKX1fYXBwbHlEZWZhdWx0cyhkLGYpe2xldCBnPXt9O2Q9W2QsZl07Zm9yKGY9MDtmPGQubGVuZ3RoO2YrKyl7Y29uc3QgbD1kW2ZdO2ZvcihsZXQgayBpbiBsKXtjb25zdCBuPWsgaW4gZzt0aGlzLl9pc09iamVjdChsW2tdKT9nW2tdPXRoaXMuX2FwcGx5RGVmYXVsdHMoZ1trXXx8e30sbFtrXSk6bnx8KGdba109bFtrXSl9fXJldHVybiBnfV9jcmVhdGVXb3JsZChkLGYpe3RoaXMuaXNSZWFkeSgpfHwodGhpcy5fc2NlbmU9bmV3IFRIUkVFLlNjZW5lLHRoaXMuX2NhbWVyYT1kPW5ldyBUSFJFRVtkLmNhbWVyYS5jbHNdKGQuY2FtZXJhLmZvdiwKdGhpcy5fY2FudmFzU2l6ZS53aWR0aC90aGlzLl9jYW52YXNTaXplLmhlaWdodCxkLmNhbWVyYS5uZWFyLGQuY2FtZXJhLmZhciksZj1uZXcgVEhSRUUuT3JiaXRDb250cm9scyhkLGYpLGYubG9va1NwZWVkPS40LGYubW92ZW1lbnRTcGVlZD0yMCxmLm5vRmx5PSEwLGYubG9va1ZlcnRpY2FsPSEwLGYuY29uc3RyYWluVmVydGljYWw9ITAsZi52ZXJ0aWNhbE1pbj0xLGYudmVydGljYWxNYXg9MixmLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsdGhpcy5fb25DYW1lcmFQb3NpdGlvbkNoYW5nZS5iaW5kKHRoaXMpKSx0aGlzLl9jYW1lcmFDb250cm9scz1mLHRoaXMuX3JlbmRlcmVyPW5ldyBUSFJFRS5XZWJHTFJlbmRlcmVyKHthbnRpYWxpYXM6ITB9KSx0aGlzLl9yZW5kZXJlci5zZXRQaXhlbFJhdGlvKCksdGhpcy5fcmVuZGVyZXIuc2V0U2l6ZSh0aGlzLl9jYW52YXNTaXplLndpZHRoLHRoaXMuX2NhbnZhc1NpemUuaGVpZ2h0KSx0aGlzLl9yZW5kZXJlci5zZXRDbGVhckNvbG9yKDE2Nzc3MjE1LAoxKSl9X2NsZWFyU2NlbmUoKXtmb3IoOzA8dGhpcy5fc2NlbmUuY2hpbGRyZW4ubGVuZ3RoOyl0aGlzLl9zY2VuZS5yZW1vdmUodGhpcy5fc2NlbmUuY2hpbGRyZW5bMF0pfWdldFJlbmRlcmVyKCl7cmV0dXJuIHRoaXMuX3JlbmRlcmVyfWdldENhbWVyYUNvbnRyb2xzKCl7cmV0dXJuIHRoaXMuX2NhbWVyYUNvbnRyb2xzfWlzUmVhZHkoKXtyZXR1cm4hIXRoaXMuX2NhbWVyYSYmISF0aGlzLl9jYW1lcmFDb250cm9sc31nZXRDYW1lcmFQb3NpdGlvbigpe3JldHVybntmYXI6dGhpcy5fY2FtZXJhLmZhcixwb3NpdGlvbjp0aGlzLl9jYW1lcmEucG9zaXRpb24uY2xvbmUoKSx0YXJnZXQ6dGhpcy5fY2FtZXJhQ29udHJvbHMudGFyZ2V0LmNsb25lKCl9fXNldENhbnZhc1NpemUoZCl7dGhpcy5fY2FudmFzU2l6ZT1kfWRyYXcoKXt0aGlzLl9hbmltYXRpb25GcmFtZUluZGV4JiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9hbmltYXRpb25GcmFtZUluZGV4KTt0aGlzLl9jYW1lcmEuYXNwZWN0PQp0aGlzLl9jYW52YXNTaXplLndpZHRoL3RoaXMuX2NhbnZhc1NpemUuaGVpZ2h0O3RoaXMuX2NhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7dGhpcy5fcmVuZGVyZXIuc2V0U2l6ZSh0aGlzLl9jYW52YXNTaXplLndpZHRoLHRoaXMuX2NhbnZhc1NpemUuaGVpZ2h0KTtjb25zdCBkPWZ1bmN0aW9uKCl7dmFyIGY9dGhpcy5fY2xvY2suZ2V0RGVsdGEoKTt0aGlzLl9jYW1lcmFDb250cm9scy51cGRhdGUoZik7dGhpcy5fYW5pbWF0aW9uRnJhbWVJbmRleD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZCk7dGhpcy5fcmVuZGVyZXIucmVuZGVyKHRoaXMuX3NjZW5lLHRoaXMuX2NhbWVyYSl9LmJpbmQodGhpcyk7ZCgpfXVwZGF0ZVNjZW5lKGQsZil7bGV0IGc9e307ImNvbmZpZyJpbiBkJiZkLmNvbmZpZyYmKGc9SlNPTi5wYXJzZShkLmNvbmZpZykpO3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiYmVmb3JlVXBkYXRlU2NlbmUifSk7Zz10aGlzLl9hcHBseURlZmF1bHRzKGcse2NhbWVyYTp7Y2xzOiJQZXJzcGVjdGl2ZUNhbWVyYSIsCmZvdjo3NSxuZWFyOi4xLGZhcjoxRTN9LGxpZ2h0czpbe2NsczoiQW1iaWVudExpZ2h0Iixjb2xvcjoiI2ZmZmZmZiIsaW50ZW5zaXR5Oi43NX0se2NsczoiRGlyZWN0aW9uYWxMaWdodCIsY29sb3I6IiNmZmZmZmYiLGludGVuc2l0eTouNzUscG9zaXRpb246WzAsLTEsMl19XX0pO3RoaXMuX2NyZWF0ZVdvcmxkKGcsZik7dGhpcy5fY2xlYXJTY2VuZSgpO3RoaXMuX2NyZWF0ZUxpZ2h0cyh0aGlzLl9zY2VuZSxnKTt0aGlzLl9jcmVhdGVHZW9tZXRyeShkLGcpO3RoaXMuZHJhdygpfXJlc2V0Vmlldygpe2lmKHRoaXMuaXNSZWFkeSgpKXt0aGlzLl9jYW1lcmFDb250cm9scy5yZXNldCgpO2lmKCFkJiZ0aGlzLl9sYXN0TWVzaCl2YXIgZD10aGlzLl9sYXN0TWVzaDtkJiYodGhpcy5fZml0T2JqZWN0VG9WaWV3cG9ydChkKSx0aGlzLl9sYXN0TWVzaD1kKTt0aGlzLl9jYW1lcmFDb250cm9scy51cGRhdGUoKX19X2NyZWF0ZUdlb21ldHJ5KGQsZil7ZD1kLm1lc2g7ZC52ZXJ0aWNlcyYmZC5mYWNlcyYmCmQuZmFjZXMubGVuZ3RoP3RoaXMuX2NyZWF0ZU1lc2goZCxmKTp0aGlzLl9jcmVhdGVQb2ludENsb3VkKGQsZil9X2NyZWF0ZVBvaW50Q2xvdWQoZCxmKXt2YXIgZz1kLnZlcnRpY2VzO2Q9ZC5jb2xvcnM7bGV0IGw9e21hdGVyaWFsOntjbHM6IlBvaW50c01hdGVyaWFsIixzaXplOi4wMDV9fTtkJiZkLmxlbmd0aD09Zy5sZW5ndGg/bC5tYXRlcmlhbC52ZXJ0ZXhDb2xvcnM9VEhSRUUuVmVydGV4Q29sb3JzOmwubWF0ZXJpYWwuY29sb3I9dGhpcy5fcnVuQ29sb3I7Zj10aGlzLl9hcHBseURlZmF1bHRzKGYsbCk7dmFyIGs9bmV3IFRIUkVFLkdlb21ldHJ5O2cuZm9yRWFjaChmdW5jdGlvbihuKXt2YXIgcD1uZXcgVEhSRUUuVmVjdG9yMyhuWzBdLG5bMV0sblsyXSk7cC54PTEqblswXTtwLnk9MSpuWzFdO3Auej0xKm5bMl07ay52ZXJ0aWNlcy5wdXNoKHApfSk7ZCYmZC5sZW5ndGg9PWcubGVuZ3RoJiZkLmZvckVhY2goZnVuY3Rpb24obil7bj1uZXcgVEhSRUUuQ29sb3IoblswXS8yNTUsCm5bMV0vMjU1LG5bMl0vMjU1KTtrLmNvbG9ycy5wdXNoKG4pfSk7Zz1uZXcgVEhSRUVbZi5tYXRlcmlhbC5jbHNdKGYubWF0ZXJpYWwpO2c9bmV3IFRIUkVFLlBvaW50cyhrLGcpO3RoaXMuX3NjZW5lLmFkZChnKTt0aGlzLl9sYXN0TWVzaD1nfXNldENhbWVyYVZpZXdwb2ludChkLGYsZyl7dGhpcy5fc2lsZW50PSEwO3RoaXMuX2NhbWVyYS5mYXI9Zjt0aGlzLl9jYW1lcmEucG9zaXRpb24uc2V0KGQueCxkLnksZC56KTt0aGlzLl9jYW1lcmEubG9va0F0KGcuY2xvbmUoKSk7dGhpcy5fY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTt0aGlzLl9jYW1lcmFDb250cm9scy50YXJnZXQ9Zy5jbG9uZSgpO3RoaXMuX2NhbWVyYUNvbnRyb2xzLnVwZGF0ZSgpO3RoaXMuX3NpbGVudD0hMX1fb25DYW1lcmFQb3NpdGlvbkNoYW5nZShkKXt0aGlzLl9zaWxlbnR8fHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiY2FtZXJhUG9zaXRpb25DaGFuZ2UiLGV2ZW50OmR9KX1fZml0T2JqZWN0VG9WaWV3cG9ydChkKXt2YXIgZj0KbmV3IFRIUkVFLkJveDM7Zi5zZXRGcm9tT2JqZWN0KGQpO2Q9Zi5jZW50ZXIoKTt2YXIgZz1mLnNpemUoKTtnPTEuMjUqTWF0aC5hYnMoTWF0aC5tYXgoZy54LGcueSxnLnopLygyKk1hdGgudGFuKE1hdGguUEkvMTgwKnRoaXMuX2NhbWVyYS5mb3YvMikpKTtmPWYubWluLno7dGhpcy5zZXRDYW1lcmFWaWV3cG9pbnQoe3g6ZC54LHk6ZC55LHo6Z30sMyooMD5mPy1mK2c6Zy1mKSxkKX1fY3JlYXRlTWVzaChkLGYpe3ZhciBnPWQudmVydGljZXM7Y29uc3QgbD1kLmZhY2VzLGs9ZC5jb2xvcnM7ZD10aGlzLl9hcHBseURlZmF1bHRzKGYse21hdGVyaWFsOntjbHM6Ik1lc2hTdGFuZGFyZE1hdGVyaWFsIixjb2xvcjoiI2EwYTBhMCIscm91Z2huZXNzOjEsbWV0YWxuZXNzOjB9fSk7bGV0IG49bmV3IFRIUkVFLkdlb21ldHJ5O2cuZm9yRWFjaChmdW5jdGlvbihwKXtsZXQgcT1uZXcgVEhSRUUuVmVjdG9yMyhwWzBdLHBbMV0scFsyXSk7cS54PTEqcFswXTtxLnk9MSpwWzFdO3Euej0xKnBbMl07Cm4udmVydGljZXMucHVzaChxKX0pO2wuZm9yRWFjaChmdW5jdGlvbihwKXtsZXQgcT1uZXcgVEhSRUUuRmFjZTMocFswXSxwWzFdLHBbMl0pO2lmKGsmJmsubGVuZ3RoKXtwPVtrW3BbMF1dLGtbcFsxXV0sa1twWzJdXV07Zm9yKGxldCB0PTA7dDxwLmxlbmd0aDt0Kyspe3ZhciByPXBbdF07cj1uZXcgVEhSRUUuQ29sb3IoclswXS8yNTUsclsxXS8yNTUsclsyXS8yNTUpO3EudmVydGV4Q29sb3JzLnB1c2gocil9fW4uZmFjZXMucHVzaChxKX0pO2smJmsubGVuZ3RoJiYoZC5tYXRlcmlhbD1kLm1hdGVyaWFsfHx7fSxkLm1hdGVyaWFsLnZlcnRleENvbG9ycz1USFJFRS5WZXJ0ZXhDb2xvcnMpO24uY2VudGVyKCk7bi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtuLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7Zz1uZXcgVEhSRUVbZC5tYXRlcmlhbC5jbHNdKGQubWF0ZXJpYWwpO2c9bmV3IFRIUkVFLk1lc2gobixnKTtnLmNhc3RTaGFkb3c9ITA7Zy5yZWNlaXZlU2hhZG93PSEwO3RoaXMuX3NjZW5lLmFkZChnKTsKdGhpcy5fbGFzdE1lc2g9Z31fY3JlYXRlTGlnaHRzKGQsZil7Zm9yKGxldCBnPTA7ZzxmLmxpZ2h0cy5sZW5ndGg7ZysrKXtjb25zdCBsPWYubGlnaHRzW2ddO2xldCBrPW5ldyBUSFJFRVtsLmNsc10obC5jb2xvcixsLmludGVuc2l0eSk7bC5wb3NpdGlvbiYmay5wb3NpdGlvbi5zZXQobC5wb3NpdGlvblswXSxsLnBvc2l0aW9uWzFdLGwucG9zaXRpb25bMl0pO2QuYWRkKGspfX19YS5NZXNoVmlld2VyPWN9KShYdHx8KFh0PXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtbWVzaC1kYXNoYm9hcmQvbWVzaC1sb2FkZXIuanMKKGZ1bmN0aW9uKGEpe1BvbHltZXIoe2lzOiJ0Zi1tZXNoLWxvYWRlciIscHJvcGVydGllczp7cnVuOlN0cmluZyx0YWc6U3RyaW5nLHNhbXBsZTpOdW1iZXIsb2ZTYW1wbGVzOk51bWJlcixzZWxlY3RlZFZpZXc6e3R5cGU6U3RyaW5nLHZhbHVlOiJhbGwifSxhY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0scmVxdWVzdE1hbmFnZXI6T2JqZWN0LF9tZXNoVmlld2VyOnt0eXBlOk9iamVjdH0sX2RhdGFQcm92aWRlcjp7dHlwZTpPYmplY3R9LF9jb2xvclNjYWxlRnVuY3Rpb246e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5Yby5ydW5zQ29sb3JTY2FsZX0sX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0sX3N0ZXBzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXSxub3RpZnk6ITB9LF9zdGVwSW5kZXg6e3R5cGU6TnVtYmVyLG5vdGlmeTohMH0sX2N1cnJlbnRTdGVwOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2NvbXB1dGVDdXJyZW50U3RlcChfc3RlcHMsIF9zdGVwSW5kZXgpIn0sCl9tZXNoVmlld2VyQXR0YWNoZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NhbWVyYVBvc2l0aW9uSW5pdGlhbGl6ZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3N0ZXBWYWx1ZTp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlU3RlcFZhbHVlKF9jdXJyZW50U3RlcCkifSxfY3VycmVudFdhbGxUaW1lOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVDdXJyZW50V2FsbFRpbWUoX2N1cnJlbnRTdGVwKSJ9LF9pc01lc2hMb2FkaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVuLCB0YWcsIGFjdGl2ZSwgX2RhdGFQcm92aWRlciwgX21lc2hWaWV3ZXIpIiwiX3VwZGF0ZVNjZW5lKF9jdXJyZW50U3RlcC4qLCBfbWVzaFZpZXdlcikiLCJfZGVib3VuY2VkRmV0Y2hNZXNoKF9jdXJyZW50U3RlcCkiLCJfdXBkYXRlVmlldyhzZWxlY3RlZFZpZXcpIl0sX2NvbXB1dGVSdW5Db2xvcjpmdW5jdGlvbihjKXtyZXR1cm4gdGhpcy5fY29sb3JTY2FsZUZ1bmN0aW9uKGMpfSwKYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9kYXRhUHJvdmlkZXI9bmV3IGEuQXJyYXlCdWZmZXJEYXRhUHJvdmlkZXIodGhpcy5yZXF1ZXN0TWFuYWdlcik7Y29uc3QgYz1uZXcgYS5NZXNoVmlld2VyKHRoaXMuX3J1bkNvbG9yKTtjLmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZVVwZGF0ZVNjZW5lIix0aGlzLl91cGRhdGVDYW52YXNTaXplLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2FtZXJhUG9zaXRpb25DaGFuZ2UiLHRoaXMuX29uQ2FtZXJhUG9zaXRpb25DaGFuZ2UuYmluZCh0aGlzKSk7dGhpcy5fbWVzaFZpZXdlcj1jfSxyZWxvYWQ6ZnVuY3Rpb24oKXt0aGlzLmFjdGl2ZSYmdGhpcy5fZGF0YVByb3ZpZGVyJiYodGhpcy5zZXQoIl9pc01lc2hMb2FkaW5nIiwhMCksdGhpcy5fZGF0YVByb3ZpZGVyLnJlbG9hZCh0aGlzLnJ1bix0aGlzLnRhZyx0aGlzLnNhbXBsZSkudGhlbihjPT57YyYmKHRoaXMuc2V0KCJfc3RlcHMiLGMpLHRoaXMuc2V0KCJfc3RlcEluZGV4IiwKYy5sZW5ndGgtMSkpfSkuY2F0Y2goYz0+e2lmKCFjfHwhYy5jb2RlfHxjLmNvZGUhPWEuRXJyb3JDb2Rlcy5DQU5DRUxMRUQpdGhyb3cgRXJyb3IoY3x8IlJlc3BvbnNlIHByb2Nlc3NpbmcgZmFpbGVkLiIpO30pKX0sX3VwZGF0ZVNjZW5lOmZ1bmN0aW9uKCl7Y29uc3QgYz10aGlzLl9jdXJyZW50U3RlcDtjJiZjLm1lc2gmJih0aGlzLl9tZXNoVmlld2VyLnVwZGF0ZVNjZW5lKGMsdGhpcyksdGhpcy5fY2FtZXJhUG9zaXRpb25Jbml0aWFsaXplZHx8KHRoaXMuX21lc2hWaWV3ZXIucmVzZXRWaWV3KCksdGhpcy5fY2FtZXJhUG9zaXRpb25Jbml0aWFsaXplZD0hMCksdGhpcy5fbWVzaFZpZXdlckF0dGFjaGVkfHwodGhpcy5yb290LmFwcGVuZENoaWxkKHRoaXMuX21lc2hWaWV3ZXIuZ2V0UmVuZGVyZXIoKS5kb21FbGVtZW50KSx0aGlzLl9tZXNoVmlld2VyQXR0YWNoZWQ9ITApKX0sX2RlYm91bmNlZEZldGNoTWVzaCgpe3RoaXMuZGVib3VuY2UoImZldGNoTWVzaCIsKCk9PnRoaXMuX21heWJlRmV0Y2hNZXNoKCksCjEwMCl9LF9tYXliZUZldGNoTWVzaCgpe2NvbnN0IGM9dGhpcztyZXR1cm4gQmIoZnVuY3Rpb24qKCl7Y29uc3QgZD1jLl9jdXJyZW50U3RlcDtpZihkJiYhZC5tZXNoJiYhZC5tZXNoRmV0Y2hpbmcpe2QubWVzaEZldGNoaW5nPSEwO2MuX2lzTWVzaExvYWRpbmc9ITA7dHJ5e2NvbnN0IGY9eWllbGQgYy5fZGF0YVByb3ZpZGVyLmZldGNoRGF0YShkLGMucnVuLGMudGFnLGMuc2FtcGxlKTtkLm1lc2g9ZlswXTtjLm5vdGlmeVBhdGgoIl9jdXJyZW50U3RlcC5tZXNoIil9Y2F0Y2goZil7aWYoIWZ8fCFmLmNvZGV8fGYuY29kZSE9YS5FcnJvckNvZGVzLkNBTkNFTExFRCl0aHJvdyBmPWZ8fCJSZXNwb25zZSBwcm9jZXNzaW5nIGZhaWxlZC4iLEVycm9yKGYpO31maW5hbGx5e2MuX2lzTWVzaExvYWRpbmc9ITEsZC5tZXNoRmV0Y2hpbmc9ITF9fX0pfSxfb25DYW1lcmFQb3NpdGlvbkNoYW5nZTpmdW5jdGlvbigpe2lmKHRoaXMuX21lc2hWaWV3ZXIuaXNSZWFkeSgpKXt2YXIgYz1uZXcgQ3VzdG9tRXZlbnQoImNhbWVyYS1wb3NpdGlvbi1jaGFuZ2UiLAp7ZGV0YWlsOnRoaXMuX21lc2hWaWV3ZXIuZ2V0Q2FtZXJhUG9zaXRpb24oKX0pO3RoaXMuZGlzcGF0Y2hFdmVudChjKX19LHNldENhbWVyYVZpZXdwb2ludDpmdW5jdGlvbihjLGQsZil7dGhpcy5fbWVzaFZpZXdlci5zZXRDYW1lcmFWaWV3cG9pbnQoYyxkLGYpfSxfdXBkYXRlQ2FudmFzU2l6ZTpmdW5jdGlvbigpe2NvbnN0IGM9dGhpcy5vZmZzZXRXaWR0aCxkPXRoaXMuJCQoIi50Zi1tZXNoLWxvYWRlci1oZWFkZXIiKS5vZmZzZXRIZWlnaHQ7dGhpcy5fbWVzaFZpZXdlci5zZXRDYW52YXNTaXplKHt3aWR0aDpjLGhlaWdodDpjLWR9KX0scmVkcmF3OmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQ2FudmFzU2l6ZSgpO3RoaXMuaXNDb25uZWN0ZWQmJnRoaXMuX21lc2hWaWV3ZXIuZHJhdygpfSxfaGFzQXRMZWFzdE9uZVN0ZXA6ZnVuY3Rpb24oYyl7cmV0dXJuISFjJiYwPGMubGVuZ3RofSxfaGFzTXVsdGlwbGVTdGVwczpmdW5jdGlvbihjKXtyZXR1cm4hIWMmJjE8Yy5sZW5ndGh9LF9jb21wdXRlQ3VycmVudFN0ZXA6ZnVuY3Rpb24oYywKZCl7cmV0dXJuIGNbZF18fG51bGx9LF9jb21wdXRlU3RlcFZhbHVlOmZ1bmN0aW9uKGMpe3JldHVybiBjP2Muc3RlcDowfSxfY29tcHV0ZUN1cnJlbnRXYWxsVGltZTpmdW5jdGlvbihjKXtyZXR1cm4gYz9kcC5mb3JtYXREYXRlKGMud2FsbF90aW1lKToiIn0sX2dldE1heFN0ZXBJbmRleDpmdW5jdGlvbihjKXtyZXR1cm4gYy5sZW5ndGgtMX0sX2dldFNhbXBsZVRleHQ6ZnVuY3Rpb24oYyl7cmV0dXJuIFN0cmluZyhjKzEpfSxfaGFzTXVsdGlwbGVTYW1wbGVzOmZ1bmN0aW9uKGMpe3JldHVybiAxPGN9LF91cGRhdGVWaWV3OmZ1bmN0aW9uKGMpe3RoaXMuX21lc2hWaWV3ZXImJiJhbGwiPT1jJiZ0aGlzLl9tZXNoVmlld2VyLnJlc2V0VmlldygpfSx0b0xvY2FsZVN0cmluZ186ZnVuY3Rpb24oYyl7cmV0dXJuIGMudG9Mb2NhbGVTdHJpbmcoKX19KX0pKFh0fHwoWHQ9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1tZXNoLWRhc2hib2FyZC90Zi1tZXNoLWRhc2hib2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJtZXNoLWRhc2hib2FyZCIscHJvcGVydGllczp7X3NlbGVjdGVkUnVuczpBcnJheSxfcnVuVG9UYWdJbmZvOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX3RhZ0ZpbHRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6Ii4qIn0sX3NlbGVjdGVkVmlldzp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLHZhbHVlOiJhbGwifSxfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZ0luZm8sIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIpIn0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IFFvLlJlcXVlc3RNYW5hZ2VyfX0scmVhZHkoKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIiwoKT0+e3RoaXMuX2hhbmRsZVdpbmRvd1Jlc2l6ZSgpfSwhMSk7dGhpcy5yZWxvYWQoKX0sX2dldEFsbENoaWxkcmVuKCl7cmV0dXJuIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1tZXNoLWxvYWRlciIpfSwKX29uQ2FtZXJhUG9zaXRpb25DaGFuZ2VkKGEpeyJzaGFyZSI9PXRoaXMuX3NlbGVjdGVkVmlldyYmdGhpcy5fZ2V0QWxsQ2hpbGRyZW4oKS5mb3JFYWNoKGM9PnthLnRhcmdldCE9YyYmYy5zZXRDYW1lcmFWaWV3cG9pbnQoYS5kZXRhaWwucG9zaXRpb24sYS5kZXRhaWwuZmFyLGEuZGV0YWlsLnRhcmdldCl9KX0sX3Nob3VsZE9wZW4oYSl7cmV0dXJuIDI+PWF9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4odGhpcy5fcmVsb2FkTWVzaGVzLmJpbmQodGhpcykpfSxfaGFuZGxlV2luZG93UmVzaXplKCl7dGhpcy5fZ2V0QWxsQ2hpbGRyZW4oKS5mb3JFYWNoKGE9PnthLnJlZHJhdygpfSl9LF9mZXRjaFRhZ3MoKXtjb25zdCBhPVFvLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJtZXNoIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChhKS50aGVuKGM9PntpZighXy5pc0VxdWFsKGMsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGQ9Xy5tYXBWYWx1ZXMoYywKZj0+T2JqZWN0LmtleXMoZikpO2Q9UW8uZ2V0VGFncyhkKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWQubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsYyl9fSl9LF9yZWxvYWRNZXNoZXMoKXt0aGlzLl9nZXRBbGxDaGlsZHJlbigpLmZvckVhY2goYT0+e2EucmVsb2FkKCl9KX0sX21ha2VDYXRlZ29yaWVzKGEsYyxkKXtmdW5jdGlvbiBmKGwpe2NvbnN0IGs9YVtsLnJ1bl1bbC50YWddLnNhbXBsZXM7cmV0dXJuIF8ucmFuZ2UoaykubWFwKG49Pk9iamVjdC5hc3NpZ24oe30sbCx7c2FtcGxlOm4sb2ZTYW1wbGVzOmt9KSl9Y29uc3QgZz1fLm1hcFZhbHVlcyhhLGw9Pk9iamVjdC5rZXlzKGwpKTtyZXR1cm4gUm8uY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhnLGMsZCkubWFwKGw9Pk9iamVjdC5hc3NpZ24oe30sbCx7aXRlbXM6W10uY29uY2F0LmFwcGx5KFtdLGwuaXRlbXMubWFwKGYpKX0pKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcGx1Z2luLXV0aWwvbWVzc2FnZS5qcwpmcD10aGlzJiZ0aGlzLl9fYXdhaXRlcnx8ZnVuY3Rpb24oYSxjLGQsZil7cmV0dXJuIG5ldyAoZHx8KGQ9UHJvbWlzZSkpKGZ1bmN0aW9uKGcsbCl7ZnVuY3Rpb24gayhxKXt0cnl7cChmLm5leHQocSkpfWNhdGNoKHIpe2wocil9fWZ1bmN0aW9uIG4ocSl7dHJ5e3AoZlsidGhyb3ciXShxKSl9Y2F0Y2gocil7bChyKX19ZnVuY3Rpb24gcChxKXtxLmRvbmU/ZyhxLnZhbHVlKToobmV3IGQoZnVuY3Rpb24ocil7cihxLnZhbHVlKX0pKS50aGVuKGssbil9cCgoZj1mLmFwcGx5KGEsY3x8W10pKS5uZXh0KCkpfSl9O3ZhciBZdDsKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXsoZnVuY3Rpb24oZCl7Y2xhc3MgZntjb25zdHJ1Y3RvcihnKXt0aGlzLnBvcnQ9Zzt0aGlzLmlkPTA7dGhpcy5yZXNwb25zZVdhaXRzPW5ldyBNYXA7dGhpcy5saXN0ZW5lcnM9bmV3IE1hcDt0aGlzLnBvcnQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbD0+dGhpcy5vbk1lc3NhZ2UobCkpfWxpc3RlbihnLGwpe3RoaXMubGlzdGVuZXJzLnNldChnLGwpfXVubGlzdGVuKGcpe3RoaXMubGlzdGVuZXJzLmRlbGV0ZShnKX1vbk1lc3NhZ2UoZyl7cmV0dXJuIGZwKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXt2YXIgbD1KU09OLnBhcnNlKGcuZGF0YSk7Y29uc3Qgaz1sLnR5cGUsbj1sLmlkLHA9bC5wYXlsb2FkO3ZhciBxPWwuZXJyb3I7aWYobC5pc1JlcGx5KXtpZih0aGlzLnJlc3BvbnNlV2FpdHMuaGFzKG4pKXt2YXIge3Jlc29sdmU6cixyZWplY3Q6dH09dGhpcy5yZXNwb25zZVdhaXRzLmdldChuKTt0aGlzLnJlc3BvbnNlV2FpdHMuZGVsZXRlKG4pOwpxP3QoRXJyb3IocSkpOnIocCl9fWVsc2V7cT1sPW51bGw7aWYodGhpcy5saXN0ZW5lcnMuaGFzKGspKXtjb25zdCB2PXRoaXMubGlzdGVuZXJzLmdldChrKTt0cnl7bD15aWVsZCB2KHApfWNhdGNoKHkpe3E9eX19dGhpcy5wb3N0TWVzc2FnZSh7WyJ0eXBlIl06ayxbImlkIl06bixbInBheWxvYWQiXTpsLFsiZXJyb3IiXTpxLFsiaXNSZXBseSJdOiEwfSl9fSl9cG9zdE1lc3NhZ2UoZyl7dGhpcy5wb3J0LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGcpKX1zZW5kTWVzc2FnZShnKXtjb25zdCBsPXRoaXMuaWQrKzt0aGlzLnBvc3RNZXNzYWdlKHt0eXBlOiJleHBlcmltZW50YWwuUnVuc0NoYW5nZWQiLGlkOmwscGF5bG9hZDpnLGVycm9yOm51bGwsaXNSZXBseTohMX0pO3JldHVybiBuZXcgUHJvbWlzZSgoayxuKT0+e3RoaXMucmVzcG9uc2VXYWl0cy5zZXQobCx7cmVzb2x2ZTprLHJlamVjdDpufSl9KX19ZC5JUEM9Zn0pKGMuRE9fTk9UX1VTRV9JTlRFUk5BTHx8KGMuRE9fTk9UX1VTRV9JTlRFUk5BTD0Ke30pKX0pKGEubGlifHwoYS5saWI9e30pKX0pKFl0fHwoWXQ9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wbHVnaW4tdXRpbC9wbHVnaW4taG9zdC1pcGMuanMKKGZ1bmN0aW9uKGEpeyhmdW5jdGlvbihjKXtmdW5jdGlvbiBkKGssbil7Y29uc3QgcD1uZXcgYS5saWIuRE9fTk9UX1VTRV9JTlRFUk5BTC5JUEMoayk7Zi5hZGQocCk7bC5zZXQocCxuKTtrLnN0YXJ0KCk7Zm9yKGNvbnN0IFtxLHJdb2YgZylwLmxpc3RlbihxLHIpfWNvbnN0IGY9bmV3IFNldCxnPW5ldyBNYXAsbD1uZXcgTWFwO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixrPT57aWYoImV4cGVyaW1lbnRhbC5ib290c3RyYXAiPT09ay5kYXRhKXt2YXIgbj1rLnBvcnRzWzBdO24mJihrPWsuc291cmNlP2suc291cmNlLmZyYW1lRWxlbWVudDpudWxsKSYmZChuLGspfX0pO2MuYnJvYWRjYXN0PWZ1bmN0aW9uKCl7dmFyIGs9UW8ucnVuc1N0b3JlLmdldFJ1bnMoKTtmb3IodmFyIG4gb2YgZilsLmdldChuKS5pc0Nvbm5lY3RlZHx8KGYuZGVsZXRlKG4pLGwuZGVsZXRlKG4pKTtuPVsuLi5mXS5tYXAocD0+cC5zZW5kTWVzc2FnZShrKSk7cmV0dXJuIFByb21pc2UuYWxsKG4pfTsKYy5saXN0ZW49ZnVuY3Rpb24oayxuKXtnLnNldChrLG4pO2Zvcihjb25zdCBwIG9mIGYpcC5saXN0ZW4oayxuKX07Yy51bmxpc3Rlbj1mdW5jdGlvbihrKXtnLmRlbGV0ZShrKTtmb3IoY29uc3QgbiBvZiBmKW4udW5saXN0ZW4oayl9fSkoYS5ob3N0fHwoYS5ob3N0PXt9KSl9KShZdHx8KFl0PXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcGx1Z2luLXV0aWwvcnVucy1ob3N0LWltcGwuanMKWXQuaG9zdC5saXN0ZW4oImV4cGVyaW1lbnRhbC5HZXRSdW5zIiwoKT0+UW8ucnVuc1N0b3JlLmdldFJ1bnMoKSk7UW8ucnVuc1N0b3JlLmFkZExpc3RlbmVyKCgpPT5ZdC5ob3N0LmJyb2FkY2FzdCgpKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi10ZW5zb3Jib2FyZC9hdXRvUmVsb2FkQmVoYXZpb3IuanMKKGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoKXtyZXR1cm4obmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKSkuaGFzKCJfRGlzYWJsZUF1dG9SZWxvYWQiKX1hLkFVVE9SRUxPQURfTE9DQUxTVE9SQUdFX0tFWT0iVEYuVGVuc29yQm9hcmQuYXV0b1JlbG9hZEVuYWJsZWQiO2EuQXV0b1JlbG9hZEJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthdXRvUmVsb2FkRW5hYmxlZDp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfYXV0b1JlbG9hZE9ic2VydmVyIix2YWx1ZTooKT0+e3ZhciBkPXdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShhLkFVVE9SRUxPQURfTE9DQUxTVE9SQUdFX0tFWSk7cmV0dXJuInRydWUiPT09ZHx8bnVsbD09ZH19LF9hdXRvUmVsb2FkSWQ6e3R5cGU6TnVtYmVyfSxhdXRvUmVsb2FkSW50ZXJ2YWxTZWNzOnt0eXBlOk51bWJlcix2YWx1ZTozMH19LGRldGFjaGVkOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLl9hdXRvUmVsb2FkSWQpfSwKX2F1dG9SZWxvYWRPYnNlcnZlcjpmdW5jdGlvbihkKXt3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oYS5BVVRPUkVMT0FEX0xPQ0FMU1RPUkFHRV9LRVksZCk7ZCYmIWMoKT90aGlzLl9hdXRvUmVsb2FkSWQ9d2luZG93LnNldFRpbWVvdXQoKCk9PnRoaXMuX2RvQXV0b1JlbG9hZCgpLDFFMyp0aGlzLmF1dG9SZWxvYWRJbnRlcnZhbFNlY3MpOndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fYXV0b1JlbG9hZElkKX0sX2RvQXV0b1JlbG9hZDpmdW5jdGlvbigpe2lmKG51bGw9PXRoaXMucmVsb2FkKXRocm93IEVycm9yKCJBdXRvUmVsb2FkQmVoYXZpb3IgcmVxdWlyZXMgYSByZWxvYWQgbWV0aG9kIik7dGhpcy5yZWxvYWQoKTt0aGlzLl9hdXRvUmVsb2FkSWQ9d2luZG93LnNldFRpbWVvdXQoKCk9PnRoaXMuX2RvQXV0b1JlbG9hZCgpLDFFMyp0aGlzLmF1dG9SZWxvYWRJbnRlcnZhbFNlY3MpfX19KShZb3x8KFlvPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtdGVuc29yYm9hcmQvdGYtdGVuc29yYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtdGVuc29yYm9hcmQiLGJlaGF2aW9yczpbWW8uQXV0b1JlbG9hZEJlaGF2aW9yXSxwcm9wZXJ0aWVzOnticmFuZDp7dHlwZTpTdHJpbmcsdmFsdWU6IlRlbnNvckJvYXJkLVgifSx0aXRsZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il91cGRhdGVUaXRsZSJ9LHJvdXRlcjp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il91cGRhdGVSb3V0ZXIifSxkZW1vRGlyOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSx1c2VIYXNoOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGRpc2FibGVkRGFzaGJvYXJkczp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9kYXNoYm9hcmREYXRhOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZURhc2hib2FyZERhdGEoX2Rhc2hib2FyZFJlZ2lzdHJ5KSJ9LF9kYXNoYm9hcmRSZWdpc3RyeTp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlRGFzaGJvYXJkUmVnaXN0cnkoX3BsdWdpbnNMaXN0aW5nKSJ9LF9wbHVnaW5zTGlzdGluZzp7dHlwZTpPYmplY3QsCnZhbHVlOigpPT4oe30pfSxfYWN0aXZlRGFzaGJvYXJkczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2NvbXB1dGVBY3RpdmVEYXNoYm9hcmQoX2Rhc2hib2FyZERhdGEsIF9wbHVnaW5zTGlzdGluZykifSxfYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6WW8uQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZS5OT1RfTE9BREVEfSxfYWN0aXZlRGFzaGJvYXJkc05vdExvYWRlZDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNOb3RMb2FkZWQoX2FjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUpIn0sX2FjdGl2ZURhc2hib2FyZHNMb2FkZWQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVBY3RpdmVEYXNoYm9hcmRzTG9hZGVkKF9hY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlKSJ9LF9hY3RpdmVEYXNoYm9hcmRzRmFpbGVkVG9Mb2FkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc0ZhaWxlZFRvTG9hZChfYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZSkifSwKX3Nob3dOb0Rhc2hib2FyZHNNZXNzYWdlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlU2hvd05vRGFzaGJvYXJkc01lc3NhZ2UoX2FjdGl2ZURhc2hib2FyZHNMb2FkZWQsIF9hY3RpdmVEYXNoYm9hcmRzLCBfc2VsZWN0ZWREYXNoYm9hcmQpIn0sX3Nob3dOb1N1Y2hEYXNoYm9hcmRNZXNzYWdlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlU2hvd05vU3VjaERhc2hib2FyZE1lc3NhZ2UoX2FjdGl2ZURhc2hib2FyZHNMb2FkZWQsIF9kYXNoYm9hcmRSZWdpc3RyeSwgX3NlbGVjdGVkRGFzaGJvYXJkKSJ9LF9zZWxlY3RlZERhc2hib2FyZDp7dHlwZTpTdHJpbmcsdmFsdWU6VG8uZ2V0U3RyaW5nKFRvLlRBQil8fG51bGwsb2JzZXJ2ZXI6Il9zZWxlY3RlZERhc2hib2FyZENoYW5nZWQifSxfZGFzaGJvYXJkVG9NYXliZVJlbW92ZTpTdHJpbmcsX2Rhc2hib2FyZENvbnRhaW5lcnNTdGFtcGVkOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX2lzUmVsb2FkRGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbiwKdmFsdWU6ITF9LF9sYXN0UmVsb2FkVGltZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im5vdCB5ZXQgbG9hZGVkIn0sX2xhc3RSZWxvYWRUaW1lU2hvcnQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJOb3QgeWV0IGxvYWRlZCJ9LF9kYXRhTG9jYXRpb246e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBRby5SZXF1ZXN0TWFuYWdlcn0sX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBRby5DYW5jZWxsZXJ9LF9yZWZyZXNoaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJfdXBkYXRlU2VsZWN0ZWREYXNoYm9hcmRGcm9tQWN0aXZlKF9zZWxlY3RlZERhc2hib2FyZCwgX2FjdGl2ZURhc2hib2FyZHMpIiwiX2Vuc3VyZVNlbGVjdGVkRGFzaGJvYXJkU3RhbXBlZChfZGFzaGJvYXJkUmVnaXN0cnksIF9kYXNoYm9hcmRDb250YWluZXJzU3RhbXBlZCwgX2FjdGl2ZURhc2hib2FyZHMsIF9zZWxlY3RlZERhc2hib2FyZCkiXSwKX2FjdGl2ZURhc2hib2FyZHNVcGRhdGVkKCl7fSxfaXNEYXNoYm9hcmRBY3RpdmUoYSxjLGQpe3JldHVybiAwPD0oYXx8IiIpLnNwbGl0KCIsIikuaW5kZXhPZihkLnBsdWdpbil8fCEoY3x8W10pLmluY2x1ZGVzKGQucGx1Z2luKT8hMTohMH0sX2lzRGFzaGJvYXJkSW5hY3RpdmUoYSxjLGQpe3JldHVybiAwPD0oYXx8IiIpLnNwbGl0KCIsIikuaW5kZXhPZihkLnBsdWdpbik/ITE6KGN8fFtdKS5pbmNsdWRlcyhkLnBsdWdpbik/ITE6ITB9LF9pbmFjdGl2ZURhc2hib2FyZHNFeGlzdChhLGMsZCl7aWYoIWQpcmV0dXJuITE7Y29uc3QgZj1uZXcgU2V0O2EuZm9yRWFjaChnPT57Zi5hZGQoZy5wbHVnaW4pfSk7KGN8fCIiKS5zcGxpdCgiLCIpLmZvckVhY2goZz0+e2YuZGVsZXRlKGcucGx1Z2luKX0pO2QuZm9yRWFjaChnPT57Zi5kZWxldGUoZyl9KTtyZXR1cm4gMDxmLnNpemV9LF9nZXREYXNoYm9hcmRGcm9tSW5kZXgoYSxjKXtyZXR1cm4gYVtjXX0sX3NlbGVjdGVkU3RhdHVzKGEsCmMpe3JldHVybiBhPT09Y30sX3NlbGVjdGVkRGFzaGJvYXJkQ2hhbmdlZChhKXthPWF8fCIiO1RvLnNldFN0cmluZyhUby5UQUIsYSk7bGV0IGM9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO2MrPWMuZW5kc1dpdGgoIi8iKT9hOiIvIithO2dhKCJzZXQiLCJwYWdlIixjKTtnYSgic2VuZCIsInBhZ2V2aWV3Iil9LF91cGRhdGVTZWxlY3RlZERhc2hib2FyZEZyb21BY3RpdmUoYSxjKXtjJiZudWxsPT1hJiYoYT1jWzBdfHxudWxsLG51bGwhPWEmJihUby5zZXRTdHJpbmcoVG8uVEFCLGEse3VzZUxvY2F0aW9uUmVwbGFjZTohMH0pLHRoaXMuX3NlbGVjdGVkRGFzaGJvYXJkPWEpKX0sX3VwZGF0ZVNlbGVjdGVkRGFzaGJvYXJkRnJvbUhhc2goKXtjb25zdCBhPVRvLmdldFN0cmluZyhUby5UQUIpO3RoaXMuc2V0KCJfc2VsZWN0ZWREYXNoYm9hcmQiLGF8fG51bGwpfSxfZW5zdXJlU2VsZWN0ZWREYXNoYm9hcmRTdGFtcGVkKGEsYyxkLGYpe2lmKGQmJmYmJmNbZl0mJihjPXRoaXMuX2Rhc2hib2FyZFRvTWF5YmVSZW1vdmUsCnRoaXMuX2Rhc2hib2FyZFRvTWF5YmVSZW1vdmU9ZixjJiZjIT1mJiZhW2NdLnJlbW92ZURvbSYmKGM9dGhpcy4kJChgLmRhc2hib2FyZC1jb250YWluZXJbZGF0YS1kYXNoYm9hcmQ9JHtjfV1gKSxjLmZpcnN0Q2hpbGQmJmMuZmlyc3RDaGlsZC5yZW1vdmUoKSksYz10aGlzLiQkKGAuZGFzaGJvYXJkLWNvbnRhaW5lcltkYXRhLWRhc2hib2FyZD0ke2Z9XWApKSl7YT1hW2ZdO2lmKDA9PT1jLmNoaWxkcmVuLmxlbmd0aClzd2l0Y2goZD1hLmxvYWRpbmdNZWNoYW5pc20sZC50eXBlKXtjYXNlICJDVVNUT01fRUxFTUVOVCI6Zj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGQuZWxlbWVudE5hbWUpO2YuaWQ9ImRhc2hib2FyZCI7Yy5hcHBlbmRDaGlsZChmKTticmVhaztjYXNlICJJRlJBTUUiOnRoaXMuX3JlbmRlclBsdWdpbklmcmFtZShjLGYsZCk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIkludmFyaWFudCB2aW9sYXRpb246IixkKX10aGlzLnNldCgiX2lzUmVsb2FkRGlzYWJsZWQiLAphLmRpc2FibGVSZWxvYWQpfX0sX3JlbmRlclBsdWdpbklmcmFtZShhLGMpe2NvbnN0IGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7ZC5pZD0iZGFzaGJvYXJkIjtjb25zdCBmPW5ldyBVUkwoImRhdGEvcGx1Z2luX2VudHJ5Lmh0bWwiLHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtmLnNlYXJjaFBhcmFtcy5zZXQoIm5hbWUiLGMpO2Quc2V0QXR0cmlidXRlKCJzcmMiLGYudG9TdHJpbmcoKSk7YS5hcHBlbmRDaGlsZChkKX0sX3NlbGVjdGVkRGFzaGJvYXJkQ29tcG9uZW50KCl7cmV0dXJuIHRoaXMuJCQoYC5kYXNoYm9hcmQtY29udGFpbmVyW2RhdGEtZGFzaGJvYXJkPSR7dGhpcy5fc2VsZWN0ZWREYXNoYm9hcmR9XSAjZGFzaGJvYXJkYCl9LHJlYWR5KCl7U28uc2V0VXNlSGFzaCh0aGlzLnVzZUhhc2gpO3RoaXMuX3VwZGF0ZVNlbGVjdGVkRGFzaGJvYXJkRnJvbUhhc2goKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGFzaGNoYW5nZSIsKCk9Pnt0aGlzLl91cGRhdGVTZWxlY3RlZERhc2hib2FyZEZyb21IYXNoKCl9LAohMSk7UW8uZW52aXJvbm1lbnRTdG9yZS5hZGRMaXN0ZW5lcigoKT0+e3RoaXMuX2RhdGFMb2NhdGlvbj1Rby5lbnZpcm9ubWVudFN0b3JlLmdldERhdGFMb2NhdGlvbigpO2NvbnN0IGE9UW8uZW52aXJvbm1lbnRTdG9yZS5nZXRXaW5kb3dUaXRsZSgpO2EmJih3aW5kb3cuZG9jdW1lbnQudGl0bGU9YSl9KTt0aGlzLl9yZWxvYWREYXRhKCk7dGhpcy5fbGFzdFJlbG9hZFRpbWU9KG5ldyBEYXRlKS50b1N0cmluZygpfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZCgpe3JldHVybiB0aGlzLl9kYXNoYm9hcmREYXRhP3RoaXMuX2Rhc2hib2FyZERhdGEubWFwKGE9PmEucGx1Z2luKS5maWx0ZXIoYT0+e2E9dGhpcy5fcGx1Z2luc0xpc3RpbmdbYV07cmV0dXJuImJvb2xlYW4iPT09dHlwZW9mIGE/YTphJiZhLmVuYWJsZWR9KTpbXX0sX29uVGVtcGxhdGVDaGFuZ2VkKCl7Y29uc3QgYT17fTtmb3IoY29uc3QgYyBvZiB0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmRhc2hib2FyZC1jb250YWluZXIiKSlhW2MuZGF0YXNldC5kYXNoYm9hcmRdPQohMDt0aGlzLl9kYXNoYm9hcmRDb250YWluZXJzU3RhbXBlZD1hfSxfY29tcHV0ZURhc2hib2FyZFJlZ2lzdHJ5KGEpe2NvbnN0IGM9e307Zm9yKGNvbnN0IFtmLGddb2YgT2JqZWN0LmVudHJpZXMoWW8uZGFzaGJvYXJkUmVnaXN0cnkpKWNbZl09e3BsdWdpbjpnLnBsdWdpbixsb2FkaW5nTWVjaGFuaXNtOnt0eXBlOiJDVVNUT01fRUxFTUVOVCIsZWxlbWVudE5hbWU6Zy5lbGVtZW50TmFtZX0sdGFiTmFtZTpnLnRhYk5hbWUudG9VcHBlckNhc2UoKSxkaXNhYmxlUmVsb2FkOmcuaXNSZWxvYWREaXNhYmxlZHx8ITEscmVtb3ZlRG9tOmcucmVtb3ZlRG9tfHwhMX07aWYobnVsbCE9YSlmb3IoY29uc3QgW2YsZ11vZiBPYmplY3QuZW50cmllcyhhKSlpZigiYm9vbGVhbiIhPT10eXBlb2YgZyl7c3dpdGNoKGcubG9hZGluZ19tZWNoYW5pc20udHlwZSl7Y2FzZSAiTk9ORSI6bnVsbD09Y1tmXSYmY29uc29sZS53YXJuKCJQbHVnaW4gaGFzIG5vIGxvYWRpbmcgbWVjaGFuaXNtIGFuZCBubyBiYWtlZC1pbiByZWdpc3RyeSBlbnRyeTogJXMiLApmKTtjb250aW51ZTtjYXNlICJDVVNUT01fRUxFTUVOVCI6dmFyIGQ9e3R5cGU6IkNVU1RPTV9FTEVNRU5UIixlbGVtZW50TmFtZTpnLmxvYWRpbmdfbWVjaGFuaXNtLmVsZW1lbnRfbmFtZX07YnJlYWs7Y2FzZSAiSUZSQU1FIjpkPXt0eXBlOiJJRlJBTUUiLG1vZHVsZVBhdGg6Zy5sb2FkaW5nX21lY2hhbmlzbS5tb2R1bGVfcGF0aH07YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlVua25vd24gbG9hZGluZyBtZWNoYW5pc20gZm9yIHBsdWdpbiAlczogJXMiLGYsZy5sb2FkaW5nX21lY2hhbmlzbSk7Y29udGludWV9bnVsbD09ZCYmY29uc29sZS5lcnJvcigiSW52YXJpYW50IHZpb2xhdGlvbjogbG9hZGluZ01lY2hhbmlzbSBpcyAlcyBmb3IgJXMiLGQsZik7Y1tmXT17cGx1Z2luOmYsbG9hZGluZ01lY2hhbmlzbTpkLHRhYk5hbWU6Zy50YWJfbmFtZS50b1VwcGVyQ2FzZSgpLGRpc2FibGVSZWxvYWQ6Zy5kaXNhYmxlX3JlbG9hZCxyZW1vdmVEb206Zy5yZW1vdmVfZG9tfX1kPXt9Owpmb3IoY29uc3QgZiBvZiBPYmplY3Qua2V5cyhhKSljW2ZdJiYoZFtmXT1jW2ZdKTtPYmplY3QuYXNzaWduKGQsYyk7cmV0dXJuIGR9LF9jb21wdXRlRGFzaGJvYXJkRGF0YShhKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyhhKX0sX2ZldGNoUGx1Z2luc0xpc3RpbmcoKXt0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7Y29uc3QgYT10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoYz0+e2MuY2FuY2VsbGVkfHwodGhpcy5fcGx1Z2luc0xpc3Rpbmc9Yy52YWx1ZSx0aGlzLl9hY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlPVlvLkFjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUuTE9BREVEKX0pO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KFFvLmdldFJvdXRlcigpLnBsdWdpbnNMaXN0aW5nKCkpLnRoZW4oYSwoKT0+e3RoaXMuX2FjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGU9PT1Zby5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLk5PVF9MT0FERUQ/dGhpcy5fYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZT0KWW8uQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZS5GQUlMRUQ6Y29uc29sZS53YXJuKCJGYWlsZWQgdG8gcmVsb2FkIHRoZSBzZXQgb2YgYWN0aXZlIHBsdWdpbnM7IHVzaW5nIG9sZCB2YWx1ZS4iKX0pfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNOb3RMb2FkZWQoYSl7cmV0dXJuIGE9PT1Zby5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLk5PVF9MT0FERUR9LF9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc0xvYWRlZChhKXtyZXR1cm4gYT09PVlvLkFjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUuTE9BREVEfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNGYWlsZWRUb0xvYWQoYSl7cmV0dXJuIGE9PT1Zby5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLkZBSUxFRH0sX2NvbXB1dGVTaG93Tm9EYXNoYm9hcmRzTWVzc2FnZShhLGMsZCl7cmV0dXJuIGEmJjA9PT1jLmxlbmd0aCYmbnVsbD09ZH0sX2NvbXB1dGVTaG93Tm9TdWNoRGFzaGJvYXJkTWVzc2FnZShhLGMsZCl7cmV0dXJuIGEmJiEhZCYmCm51bGw9PWNbZF19LF91cGRhdGVSb3V0ZXIoYSl7UW8uc2V0Um91dGVyKGEpfSxfdXBkYXRlVGl0bGUoYSl7YSYmdGhpcy5zZXQoImJyYW5kIixhKX0scmVsb2FkKCl7dGhpcy5faXNSZWxvYWREaXNhYmxlZHx8KHRoaXMuX3JlbG9hZERhdGEoKS50aGVuKCgpPT57Y29uc3QgYT10aGlzLl9zZWxlY3RlZERhc2hib2FyZENvbXBvbmVudCgpO2EmJmEucmVsb2FkJiZhLnJlbG9hZCgpfSksdGhpcy5fbGFzdFJlbG9hZFRpbWU9KG5ldyBEYXRlKS50b1N0cmluZygpKX0sX3JlbG9hZERhdGEoKXt0aGlzLl9yZWZyZXNoaW5nPSEwO3JldHVybiBQcm9taXNlLmFsbChbdGhpcy5fZmV0Y2hQbHVnaW5zTGlzdGluZygpLFFvLmVudmlyb25tZW50U3RvcmUucmVmcmVzaCgpLFFvLnJ1bnNTdG9yZS5yZWZyZXNoKCksUW8uZXhwZXJpbWVudHNTdG9yZS5yZWZyZXNoKCldKS50aGVuKCgpPT57dGhpcy5fbGFzdFJlbG9hZFRpbWVTaG9ydD0obmV3IERhdGUpLnRvTG9jYWxlRGF0ZVN0cmluZyh2b2lkIDAsCnttb250aDoibG9uZyIsZGF5OiJudW1lcmljIixob3VyOiJudW1lcmljIixtaW51dGU6Im51bWVyaWMiLHNlY29uZDoibnVtZXJpYyJ9KX0pLmZpbmFsbHkoKCk9Pnt0aGlzLl9yZWZyZXNoaW5nPSExfSl9LF9nZXREYXRhUmVmcmVzaGluZ0NsYXNzKCl7cmV0dXJuIHRoaXMuX3JlZnJlc2hpbmc/InJlZnJlc2hpbmciOiIifSxvcGVuU2V0dGluZ3MoKXt0aGlzLiQuc2V0dGluZ3Mub3BlbigpO3RoaXMuJC5wYWdpbmF0aW9uTGltaXRJbnB1dC52YWx1ZT1Xby5nZXRMaW1pdCgpfSxfcGFnaW5hdGlvbkxpbWl0VmFsaWRhdGUoYSl7YS50YXJnZXQudmFsaWRhdGUoKX0sX3BhZ2luYXRpb25MaW1pdENoYW5nZWQoYSl7YT1OdW1iZXIucGFyc2VJbnQoYS50YXJnZXQudmFsdWUsMTApO2E9PT0rYSYmMDxhJiZXby5zZXRMaW1pdChhKX19KTsK", + "ok": true, + "headers": [ + [ + "content-type", + "application/javascript; charset=utf-8" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6007/font-roboto/RxZJdnzeo3R5zSexge8UUZBw1xU1rKptJj_0jans920.woff2": { + "data": "d09GMgABAAAAACokAA4AAAAAUkQAACnNAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGmQbmXocg0oGYACGTBEMCu1A1wwLg14AATYCJAOHNgQgBYMAByAbO0QF3Bhn2DiAgX12b1EEGwcBhTGLomxQFmT/lwnmGE77wayn0NBAJAPXITeLlQAVKYYKjM1mpr7CgS0HNgpkY1bqRLvLsXy3dA8XPXqvM/yN+w2v2FOlAb85QmOf5P7Az633/wJaSkUwMImTqgk4GDAic6S4MSrGqFakDCocigoYRBqEHnCIYBIGGExRT1Qeqv3690x3z90AwCasSP6ngswqFUVYHrB8VBQAKcYder52r1wzByMHJRZ//0+nNV9g+H/GsveOK0AqSpwZGZI47CReYMFvJOfQ2hTNUVES1lvdXXeyFKh29/XX4ACRY/9vTgMuqbMdO2B5UFAD4VG4vRkzpRE/HAS4Jss5uTZKgIn5b///mp923r+ZD/x22f0pcYRbsj0ne84XpsZN7mQyee9lwgszWcwvZJLFD4WkECjkFyHriuAA87NMWVUCV9VTC6S6tsdX+ApZK4nU+gqn6ipcefja71ffCTv/vpktBbH4Q8OmUzIhiS6SSKLxDYn4I3iKlCraxSKRmLCxMhnQLaUZLPeL70z9PLvdGe4aJpgghNJhdNDfIYfbP4Zrr4IRvQYW1AHHsRm/MoBA8QMAALCA4nacDoQBD4hYsRCpUiHSpUMwMSGyZUPkyoe4rB6qxyYEAgXAC0AAAgCBiIUA4KZAB3a3PfY7jNipySXnETvz4unnEjtv7bILiMECgG+hS5x7+iUX4AR8gRVUUNx1liijpQ3akVwcN9akGiFf5sfC53+NGKbR5WqKVWK9kAti+AS1eOOOyCvDaIwf8afMcFGbPJk65ZRuuRKVi5n34MXC5+eY8DF3ego/YaXaA/kGJCdNqR9aLDwevIQdJ0mKNBnyFChToUqNBoJTtOk4zZgJM5as2bDlwIkLV+48lSpzznk9evW57Y677uk3YNCQYfc98NAjk55Y9MySZa+9sWLVmnUbNiE0xggsAhGnnKBtjyf2QAgPTgoEFh8Jtbt2fBCTGwppEGEglZ5H9iEjajJmypb9zQ7WcvY+F29zpybfh8pFRalEVy+iPrfdcde9rn89b9acef9Z6HrqQ4ueWbLsjRWr1qx3vfW+d9770LXhbZuHCFeD868+CuUUv9RhOBpeRLDSKRtpW+4JClYxVTYdM1P8F5yw4yEH/bl6XJhQCcKlImFqL9vlsPiIpJtgDl7nnTDswuvDCv+DO1fDk/MxTTZl2ozHg0XCE4hnXuaoUGRvMwJjpuxnZEv+3pQmUBk753x56pZFeGbJ8s2IMhXxINvIiBgzZS/fU4ueWbJ8N5ZJIjmllGuC4g0HW6/PDdHeZGVFrFqzPhRHACMh5SpUzmRow4YNGzamMFQ4soqMGDNtbEWyl05HornGI/8uT9miZ5Ysd70RacWqNeumCoS86xhHXc3Jp1y9CINvDOn62prjoEx81Jz3IVIDWX7co1E3yT++FWYmuuNgIacdlV09TGcJJhPrX4ppsGwDXfCvkmLgAFmk6LCYxAftHyxYL1O0P9FCx9PR3lipv92N96FztJm7THzvXYCZF1CGmPHV7zjxlE+yUMyjYlkzeXrN1+XDXy7mZ4SaH3nFQ7Ww4uDmIe7T/PFaC3qFyJcS82v/iTr6GwvR3ze+XD27dfVbnYZQeRFxzohzSVz399nlr3kVWPXOwUJ5dHBrvN8bC/o9RRmDNlxKMCFjXvucAiWWoH0uC9Id0GRlZgrJ2SxOo/NX1BHQbaQBUf96uxZTd36ybZDQD2eu0GhiDfZmfDlc0VzFOlV8wKy9uuc9zoT+etNtsqFheWuKpVn11wnNyFUttlZgbJzVYnwrmDBpqX3O62J0xc3aVeaABaXbnkaGt5Tna0TncyyvCyiVfDTfNg2Tskx1qffMM0NtN69smvOiem3QnIGRMuk1rbqfMN9WYlYX54kVN9Zr843PpJvb6ivMNl+RmEB/BdWcgMMDITBSlFAjGMdJwzpJBRcNOoQYINvHmOh+Zu4HWLNzkAM9wsX9KDcejslxl1SqgpTK+nJ6LJP32jr7AVDWFUr1sbAX9oI4EVeZok7QfSSpICmKkKY4cpSbPOWhQPdQpggVKkKD8tGk3AhUzCkqSosK0Ka8dOguBhTPkHIg8915deAkWMcGli0ohh3l4ECFuVAublSIO+XiQfnlCI7BobVXOYT4INHaqwJUXCUV1+OO6HUPqn/XBA0YhnPfJMSUx7g9IXde/1qA99R9t0XLOL0eivXGOox6LVwgCIKWCEHQPYSoiOMCDwv1DyhKju6lTFGqFKXO+RXrwA1csBuEYRfwgABq5RhDmLJAVAIMYC0Me1CEI+XlzHGKeeAEnBafdFBUHkXlD0UUK7FHQxAEERAEEUvELYg9ALxA1QMUuICHcCSXIboBRsXRb32AMzlHPf3L87pFpik149XgSKLrYiABJiQbu7XX0EZ3qpa5pRm10HWgNpbmvXY2psKEBVBRiYumxxD0yfF+4RFhcOKf8uTBydDgQG9QA2iNNAqnhUWBFCuRLAAGylcAEIhW6rsQekPBdeKnxE2kSncIhFMQTwLtqlUHw4S5y9CmoHva/VBPrVxRoSAQJgJKgoic9kRheIYBERIBcwcACx1JTRqgQScM5u6itHBr0qhBsxat2rTrgDEjYrt2VZyzqFi6XHNdtxtQ2CIOaKHU/e2ri+Ee7MoA2fSUxbwhIBp/6EsBkrpI3jbygQfuiQiOrDHBHxAwqwyQgDwGALBLnUWCBAxYjpb9+Roy/wk3QM6CbfsB0CABSxQAnySXXv93+42ZtuaTv23HZhtjsRhL87XmG8w3mW8+33q+NN/tvsvue+KI0PgLi4TLN3UaMG7Gus+UbHrWnK8332j4spfb2B4r9owh3GMQ/P1r9sv3jkH4J/6/8X/35zeIF4eOyoczmc/Yz+9yx8tGBoAK8xg3HB/3Xk/VY2LM+/9p0k2ZNuOxJxgy/GvWnHn/WcCUORZ+dZZsb73z3gcbcmziBQDI4H0igCRkjW8HQ0ISbLrkpsva+aYOt3TqF2HAqN40JtW4af1pRo/H5k34z4I0Ty2b8twLDC+t+jetYVr3ydP0WaYvtr323Q9ZfvrtbfojJ/2tNjOyY0BujRxSHRqQl9GXAgoy+mFAYUY/DiiqJdZsXwtAMZBYr30DAKVAYqNqk4BzWWLzgAtZYuuAylpiWbUUUJUldguoyRKXBdRmiScCLuYjazwIlyBQnNDxd6jn4zYgH2sRfLeGyBuBeX8dvQgt3Aq6mTwCBwO5ip6gBxjoGBZbM34NE52ChI4XgbqSgsMohHqFmIhSL8HR1+qELePMETQQxH8ATAWSCRJ80KkVSFyshn4rVqc4xO4K9/sBbZUfGmjTrPCOlAJr8aYOsysMEbR4GDZjo5nqxAmguf2d+5ll4+q6dZTUZq1hMoksN66UXJTBBGyt+DrbhMcLq9Bk+7CpxVTXjuuYlC46w3z6kfH9bpWmwC9ElhFLbSMmAlXH7IyhWaYUCy19n4kkfj+MNwH1CXMxzHzrLGoTEVEJIpwww/SO24xCz4blyGgkPPISNVwJHMS8s9eaLgV7MO1MMFVxzgWKDObEffRpbR65hHZghKBm46hPHQIbxBUaIedU2SrMOQQSCxSYE85BZDigzEa1QKgIKEMqmHOWKIr7/orgvAATAUj2mnDy/ahrDOXUW7VsRjmHFUELlLgbeqsOaSaMtOVts1bo7cfGG5ZmMnzyvz7a9D8A49yfhKY0fT2zRlfuOMrMoba1d2Hf2SfChT0yvB6uDam/YVYHeti3rIR00JWgXBrYWqccXULUgWBDLc56ozkbZOKZwbkbwr43STuwCuPa2d9GGGB7Fc7RbV2Y1ryEAPZ+fo+bAVMVWitQuWZzibW7iEwCHXQ7lilW/mPjcU90+t1SKzITRy0tdDnD32eBJegGqTt8gwv7C7U0By0yLHifOEbuQI/HKbSqiN2A7cIrLxEuI4jzhl62d8SsW0WgmoflnBB4zekZkQIL7kLPmy8SnYVExDCJn/vsvX46iwidi74aH8QGlQbnqrSnHdb+O9sslbarcTLIeXWoS3vjlXrP/Atapqv5ib+Vp+qjuFwuDUd/fyHu9CVTIq+qFWJV1Ca09xxlk3lq/Sq37HDeHFvIRQz0Bit3uYQ2MH0kRGaKWNr6gj0uyh0nEF3uif0c7nh4lCgrKdH9hQwYPB6dSzZHuxICRr/dIPICn1SQxKhh5hC5lEbayfHCibqcyA3ZtYkTVgm64xjTZc9SxrTlX5q0if+LMeMTHtRHRueOGGKjMO15oLHaiPWlWmRl/IO10evXz7Uh09LcSPILgN4V8uqJuvCbsexNLzoP3QgU4zJftrAt4TZuhNhSaFJDq30QNy+xijFVzLR5y1ZKXp6namdX7u3I6Z6K8vco9tBP1UZPnALuwG2CMSEhWTElyCqRQIzcxyntYtKFHuO26n2pAIJzuhqKmVWMk0lxlhMvhrOMcQYnpoV7MSCclFSNxvg5F/MSasrgQr4o9P/8ce7LjPQpQTUxFy4xpt29wJlYCQSLskVnUbXUlJD+kq+gImoiUOysTerfknkgSGBDUDKkls/jNmRXBzLzuE4Pph76s3u6BjIpbNN2/uUtpLEO4NfUee3hd2ICHNJIbu7KwOJmXM0OKEjTZcEy+gJZO1A8QqI9juOkuT8zAuZZP3b47Ea8GRr/Yqom6GrAfgurEO3uc8eXUoGKktCRgBAsVnVIoJf9NmMuK5NrsY9ALjf2gU9eNkQ3qYUTAKnCxlt0ZamUlmPRKIzah/3WyZgfmmfwywWHYariaOMQdaAnLtycQZ5AEUKtcuPbwWIRiIXc0guTOqWrEHyCxSaVinmQAkGenh5YyHy4OjCmRFbrOukQ0opaxEEb9LTnu4pMNA5oajIR6FNAvzNYBLI5H1jCNkosMq20DStOahu6Tl25xsb5RqciLQK1kSpeRs15JKSgo+2DBNpTgyY1mugTZwLBQyFZ2LYikcEqfUfXzD5bqRfbmJc7cYYTstDGs2DiLeG4oBCqhtfubuK8OpzZGwftSZqHgjNcMqO0bGJkQTvYWwXWjfQkKZ/6Gt0O9Ma9RrPA7FkHm4ogchaY4T0BfhuQpl0SlqxIwD6dfNlAQepRTVGp5sm+1YGJbv55UKec+VpxVrICAWlg8rr/IVfIahPZWyD4cFFDlIMc+CTZ15JKxmYxJL5x33PQTi4/jNDXsEHs6OL1DQlR6YioBK1LayaotNggHdb6wZHpOYgdxN2h7EuKiQ2Cu82lamU02Q63JmZzS29vUgECR0IeX+G5RNlpnEnO7QNnchXLXsAOlQQHHeTBg7EsUtguvOiQEKbkgjf0n6GjHfqwIC4SWja8GiY+QtaysAIH+Xtc/S34rotjyJiIgZU5ikRm+iLHHqKCu1qwRWEv3fudKN0MuGkIb7vVjGeHHxCp9OWJ6ErT2plncvoXMmdytfNnJjFy1gw9xNMkd0saBFfI4o1358aFbq/Y7HG+0KmQY85AZYiQxA0RN7R7GoFWI0woIEO6jdfg5/lv1W9L8MdgGrzibDAjUzPbmi3IYPDcUi4SpawuXitn7HSA2yOtc0ts4mgYWjYsiSiVXBuGBQjXZXxxpS2Jq6yBdvXRk6hLpa/aV6B4YBjv08cEdkBW/TjBgnZNauhzxqZs3IZtaqmJYIwCdm2CuAwGScMv6WjknojNJSYEDVznSdIe4CUSKBCkndAmwd2jkRJS/wOiqKUozXfWEQvrk2GMFeh/k3cHmd+e5nwHpxKCSAEShab0a9gp/nOaf2S/o/xG9ll8TwiBm+JxaYSCbbEJObCxpFX4W0prjI5tAu+5849d5//w4G4tCb/Zm21f/T+Nbt3FsPz5tFFX9NlIbH+MUDEgQNPWNDZJoT5NdbIxox4IqtKPpOXydp7MulwVpi68NL3QjJdbr8VparAvCppfbCLx6mT+zMWP3/nLtb88S5po6i/tPz5fgrJign1I+C8ng+NvE7413p9rF168tNQhevfryFZSZJG3V0igtyMl6O9ysaVvgGqGS8vU4x6h4YtDo7tnP42xk5KyqVHRYYBXqWC0NOfkNTdnG6U3N+VkdtbnteAMzOxO65jaGRsbmNknmTiQDx9VYHY0ZGa1N+ST0xqbRVsbs1uw+hYOOkQjG1NTQ3NbbR0zW5Pf7ATySWpUAhnss/zDmi+ftaPolRu2TY+xLj7oy3F1rQgy9SGLmmrRS//lS2yb2xGz9qqistCVV0fiKdba0at0F5p/aiJS2moXkBRu+nbeQdPeSo9s6wkCN9L3MS9ieyHZcj2+9pNhhq58fh6l8yaHGNjLty5eiJdnZuh+NoqrBqvTz2Orv9swifLM8rOdS0p795yfyM/+IJ+ZrP3pVDKTYxpEhh8pOKo1y1L5Ha/zu0tFqbapOo5zFQVfP9S1p9gfZN4cTnie0LXRlfQ8qXwDaslp5pouMkwwuPsMOiE4aBZsOflG+ED4727GZgRNYxN9XVNjqrEZDCT0H52X7Qe9I/6E9zqfNz6qoQo7hPeaXz69V0QVtoQnI+7F0SO60X6TR2fG42gRPegI/N26X+yk+swhIP7btCIQRHWqtgyiJvtGpxYmsjNiZl/SSme/zt4Ji/uYe943oR5EfcllEZB2JjQoNCrSJzHSlR0ZfWs2gLH4Y3HYJ6Hd5x+6VMLVuBHe9WdPeF70sb1S6GFnUulRZzPjmYVAUOK4MXxDn61Pw5dKkhZ+SWJaEr0OQcdji2X+J/qSrn6ayTNrXK+e/51eTOBfc/d+4AuOj/SLTLiYk5FdGavnesQG1Hbfun/wIcp+umecGndz8Pmu/55jhWYX+XVxtsnULo8PN60YzgdNTK5k3ltIvMyZ3AAkf+lj/tJ/txSbX4a/APGYQkhYo4f8GZW4W9QBzMuFp9hX/bT43ghFd/nQxpC+T08fTX56yqdsHZrCmE1KDwtJSF6Kiz+44xkW1xdC9fcLpfWF0kDxtXdsSt3AG95nRWffzaXmLyFkYf0c3xov9MD9o/Po6sQzfuNk2yPGnpfTh58ktDOyE5tANdr8BVvFmjaoYk1lgw6b1+OBR5THfQ94Fx/8+pMaQh1UQ6ifwL0tQ7dm6M75BLKHm4+LQ5CXLRthbUwO33/58Fbd+Zq4GF0TpJCtdsrY6DQxgiXDv0ihT/A8P5cl7t3QuqBkyjQ1KTn3SXBi15Uk3FBBuF2KtIOuspLQaEZA2iKuQyBSJ5M4IjfcFcW5wfM5x+3gjWm7m5JfjmeNTykE/wmZd3no/oT7OI/gcnfKl+2fAYtdlacfU3kzjfOs1Tw9Dtic3BCSj8idAS1FWxWaDccRf9abIzQWp+/BxieuUAY4Fvs7MjriF3Ix8B/aoRRWwiT+2bfdReP76Bm04DfrWNneH9EMik9onGfaNlh0Le5++w/2ZydnfaE8OpE1Vawp0HL9y3Hc3o87gtUlOQUNrM/I29SN5u915eUZwlWyP5KdgzJtdaceGU/Xayq0jHL7rYg1jM/+QN5ab07+HAGdqByHgdsPegDH6nrUXeIA2teCTYJ/A45V8+hSlwlYwl2LgL3B127ta6hQQSejTE5FibMPfNr/6oc0nqOV9RXdiNwYw3YNWTseODkgBdYpsPNZbubQi/z2yPXYgYs7lzpH5DLsHv9+jP02v/J9dXKHGkUNC4hh0kGVWt851nI32nLbW34r7WccHf7nJBTdL39QUjEWHBhliem7iam4kUWM/VI0VWzF54bYrLdoykuh+WAdCb8fK+PiuvyukOrm4/sF1q+vzZfqCbVf7xJpP3caZmzmzhkItfsJtZYTYXYHu3UTaa7vAeS93ec+XGNz99/tivYf+A04luzXg78fz4tu/j75QCEzPykmujAvEVEH65Jr02lyNKefQ3Wlql8fGbLOE13d/MS/sdu3fjfXnfSd/UYPV1NLqlVBTPHgBw12eq/mS/JGElUMPfh2af/CphSmRNIYyekID2g8pnsxAz2DA4ljCfdZB9+sVmxGZE4l7UQVpGQkZAV7WpVSbP0mUzwbI2/umf9Uy0ktmcz+nVCXeYHBoIApdmVs5dfK0KN0MJ1jTb6V4v/+/3HuzUc7UyWlF4qOqYxBmdbeY2f3SIyyvkk0sHaD1eUgfqzRr9041pagnaRgtyT7OrL5i/+YoaCf4SxIlV5R5Dt26/HgsqTGbs3dJ4aWex4fg/DfFl2iB9MrRP+IHiyt2Aep97kfaNXLixA3Hh26BIdHZxoA79hwtwI4nlQAYsD6fAIv+xngqaASOJ5U3m0CvGMTiNs1dj2akplvk56fBM2U/vL+cpAoe/yAT243YP7wGJyNaa6b7M3ugJ5P5WQ7dz8v22AbItuZVvnAMfHeq3to+9sSKQdBtNMoyeD/R+mZme4Ohm42QDoitPNSevRecBYPdQnwwH4mKP7a2KvjnFt4VvzV6NrT2feIeRej4luQNtDocKUHY8xXMX60zvv+tDdcxzH7vnNIrQxuvcTdXMW4RdPdopNboUOSldQOFsf+X5cbbg+my7ABD0s8EaHpN++9V9z60pDUQyvXZ0zppZZHJ/eBk/D6wSNbB68k/HmVn7v8eR/qM8ydUV1FbwpipiUQvRYo3KSLfnG5AgnTQhyxZxLgCbOhu8G3e3y4m0gWxN2lq3Ze91rqXmKC9bGdjZMjvcEp3KHP9s1xfntFf+1DsIwqjmDUx+amJRsHUa/e+yz75Vsdoy+61DBxST+uNIZxF/YMj0Rn33TB5gyz+yK93DxKyKk4NuCBLZLZBDYiqmG4XvkGaaiTjRiGRrC3nlDZWN95kTQz4KQQi6bXidRmn02HhHsPXftVUw8Zq2PFQ3ei90GytP9z2iNCwEeeYYw9tWygNcxf7xxFBsbZA4HOnkG2QU4iZFhlT2Dv3SvRihZgE2D3CgGfQC8atsGlPWTfDXTy8S8lM1A2ASxOXEz88yar7JnAPu63nJfifq1kn1sVUvizxdmUfWc7q7+3Pq8/lp57B0io0K83MgPXKFSEDbjFl1xhlNSesZcn8F9wV1LuxpQT417qJp6jpvWBxfE/69JjN4KT+CgLgFtk7wRHtA69k9v61ph2h1pkELdhQCugMnrhH2W378pNmskrbMJbXIxjXrXKAVg8rkshfVe2kbzh2JT34fbNoY/9F9iGgW4OVn7GOhru2gd0rjhYxDqWfOkeyZj2PNvkvYG1p7v5evkagdicLkd/d7+bDv60TMsdmz3moqr+17qvcYDCAIWSOMrqnhy+y+6bauvSTuJiE1bh54v8tvhfe6mEf/fWE3aApGjZ9n5TiEqYWF97szYhxCBsdr5efn0LACd9+U1E7I/x/ndm/gy//TFjEV7YHj1bxoitPPcR2FT9cueJm5uemMURt70jqnhIHiQOhV88Ni8+YlkJXoFePnjPuVeD1wZfz6LXu5evKsrntqvjfi68andpd30zh/vZrg52fE2Av9cEYotXNTB/ZtZv2N+wfz+N+XNVQz73hlLXSu/Eq6FrQ69Gb19b6VYC82Eh1t3nBSYJ6hey9CROkMwC7QbbbiyWmTAIRel6hyVJthF20FL+GGGgiABNXYNsoqtHNtFQJ5vo6ZJNwKLDmR6Is1zBZI48KhZ/P/H+5uGHB5f2zz08dPPwq4mXNeI9/2GqVvCeNKrr2i51ILOS2mHH4K9mnrbrgfv7HtgEyYS74nsuj1dxfHnw89259ac93zyDgjycA1KDOL+ojwNpJqQ26eGDmsSU9LxCZpZv1ehEaH1hSV5hflFl1MBQJbWoNL+o9Byl9sGgd1VOXn6RRlp8TNjkXerSXVro5MfQh3eoz+9SQx/CEWFLnBef3f33FfI58uflZXdkVc6r5KhU/HC4LwiZfOKr4hOr26tgNDje0+rE9O3t4Bt9v31oYfoLhFfRs2LzPCzNM1z61G4r3Q1zuxDW0+xMVCRl+rUKPVz7zPPyEZtSlBwTn+NhY0d3SAscjHSuUAqzEjEVD5FMsPaxL5O7pvIiSo5mnekFuDkHJT1SNInkRyJF65EmFD78Ow0Gr+0qOi8T78x2n+m8N1tb115fXu3lauPkFpAZTYsOzHB1drbyaWA0lu8XbK27KFBXdciu8pBAI1Go5fwha4GmB33OJmMpxmN9zmV9zuSJoUGj8dvO4DkgQDKzTohOiwsOb4rpCFBOpuoaKSm08wV1pmRlXyhiaHnvs/JMlbI92pxNMQX7U4pOoHU4egIb30YCh4WrNVsLPJzAEY9FF+vzNvsutDETaXQd4n7l8Do86ZxA1eAlM10985qMQgM3bTVDQ4Ib5INKA+/V2qsgShuhXKhZOl8ZGlZZuVRdQ8lU1TdUVdE3pZBNg4zIID2c7jjuyFhg+I/7xy4IH/tlPWINXZV+ifuxkQEkGTsVgq6uWh+1uSKzsCr5bEiwv7dDbuRZEBgJs2Z4H7XTUSCeONrnWx+fVnglJpjOVCqTKqCwEgszW5PO9J3QV9E6PSbjnwFuIKwGu0XkhkFUn5CA5DmlUpoJMUJswgu8vSulNNZMbWgLcIvA4LRa4/w9P8f1Z+0w4FiQf59gbM40MSecMjcm6poagzbaUC5WEtxGq8Jn6RnKycgaHrHEHsoBpLKXMCFfEh4tDBxU70v3htT6BxuNLt4eqqm9O1zXifVxC7OycAkBLytvtzBLC7fQAKCVIfEqRUYWAcHOXhQPbzdnp2Df1e/efpwemno10dNQecXVzZzMFSWyraZhaMKISRWvjAnQIiGN33b7lu0RFVXWy1GmwPljo/uF75+3VgyMFcsEs5BTumOytJzw4Do1jEgggs2RjdXr2V2fbuJS3lK0OTQUSJorJwl3Xhst8HMoaCrZqh4ArVMDptOGyYd8CQ52mRutevc4Gv85c7D0mLlq8Lbo96oojSX65avg5sS44Ef21kk24Fhbi2vbiUWpz3PTYxGI27KeX9mcuj3f16Ij5q0fuZsoeZJo21VqlWXattAzZtV6wklh6GHSMTVvZ3uSooFLR6ZVppVT4oS5tauXVQ9mGyy8RH7nXiKazdkyWeNXq2s32971k109Apxco5z0vgiV7PSMvghnpDHHkdlN9EP2Lc6c8zXMbIrmoFGDgfrMabWUHkIm4cHjkUCE7mGo62ahdG3dNyl7V9LIwTOhsaByfO9vzmKbxkT8SnFezqvExFdZ5ZFrkwmMkkgXhebE2IdM89C2M4nWl6VNhjYVWczrdPPQgjXkb6pukZTTVJ6U1xQekTXeAaQow6+zX7e79I1No4xN9EmzWqZNsXU3CYaR3KUETWNjGzamzLVRHA8bFhT7Tw9XEMtm2t35ALnkU3NqsnxLtfq0t4zXqma7V5yNZZpukk6XlOOz+oEUJfT9tdxQEf3iHJfY0sHRrNHXx/Fb2Ma03mh2iGlsAhuiZsC3UTi2ibOklBdpIbQXCXKXN8c3Crv9Mvg7PeEwcNtIYb9vIK/GGT7Xy51TcFttsGsGXE784Jd7+TODRbS96R4K85voRlYrd05RDc25QNpQ0aLGUOcRMeZ7bkdGx/YbvpPoF87WjN5YekbPQCPzbgwts1dHoM+eniUcc2NfRGQsqKh84BkuryqrGuTjFy6E3QEy7slxrQl0L+8EemtSnMC0vC5RTp54WkFOR89HRw9Uae/Ck4q9JFOCTrWJnTCSK+MITyr31LzkrHLCSR4EG8XizVwYaGHFXA54BswA91eIN3NOQ4tr53ICg2agXTrO3C4JLS1dzAA3/2lgaSeZ22Wh1fcX+yBE7YyC73dikrljPqb84eJNX/8l4EzHeMbE+AXSY3yOe0RHB/rGRCFucEp0u6DpUIbwoYwm2HW95UX9rtguhJbQ/1cOQu3KLj9cx5W2inAPCfGH9P0pcPwQB9Ke354yH1IH759/xH5TGAfFH/kf9j9/uY2zzjffL8UPdLbCchm/u208JBNICr4x6JplVXLYYt+xiWz5qAhfL2/9ue45ZqDncpXLT/vzmYz0uG4oObvzx+8NN+eHRuJI8oBbZa8+R1MFHn98IlP+bIbNpDKnhJbvVeKqEqcWh9wmuIa+YTTXfRvYon2xpqWopLaltqKmpqO46GJ7bR9PCy0Kre1poUdgLgDPY5z+j4KHpud5z7rbdQGcMaE/7lIX+7bmwDtJuXzjnJ1w6SI5PTcjLuZKRV5qezri04u1jqIlauiR9EhkOHr0yIXiLA9eb0P9EBozP47eVMEsbW2sUnzyaf15ebOs7tG1Y8XJqiQDNSp0tNm0jdgkdZ+LgXNEaqRaulYK5VJsQV5dTEhKulakGjW4kpaaVkkTP6S65UKUp/wdbp1rdRhxkJT32gVrqroaLknM7MSYljpG7uUG5Nyp/54tvADh0sIYa582i6MGRrpEFWWiuab6KRJcy7vdejvud/wYOrmrQ3UPZzdAdj4bsl16trMHJwj9C8BBaPxKa5K4nayl8ATWSLdXfZuqajai9urlaXVLWl1S43gaFezUNHGc2viWGFVqfMapNI6ZqJrQkGIdrVlpSR2gMlMI5Rq69DmzV4hdMrcHAWfs9BAoTZU2Z769bOXxZc3VFkp4xWibBOFYwgTorrQA9CHSRO6XW+RWuU1ulzugk+IJJrd2XG6lfjva1JwnrQ15Fhg+vshoU78zxce0UticGgUkldh2f/wL0iv1vW3a8KS1TM8CWeMproOsp/4470mj6lkw1MdTho+p9Irw0VTODQiyMjyVlWFRVoYll3JHw5maAiAoawJL1qzs8owCRFg7UwQYHKuvA6APmyGAR8X+5eSiA+FGlKvISqHXVEyywqAtG9PLQDYOESOUrdi5bKecB7mT9W/92UnbzKds/CivQ1ggaPNaTYebto+Dm7It2LtszSNuSJ/mqPEUqaYzG67KzmDhcq440LVTrjHdCbAH3C3KLoZujDGxdgHfzSH/3ziKTf8HIG18azVlTW7R07J2d0c5mZEt3MkFd2eAu7W3sVJe7p0CX/6/fltthFVFKkqjtj7zaoWWRHyaxBAL0BcngJzxrUs1ANWoinudxTTyo7X3vEkF7WDJOkHMB/f2PmpRAYPiGEZh1PFXRQ6uOCwmCQHcLjO1QlaXT8roV1cmYLFRH/qIMoDdb6ZdyDqrc40JgDyupesAej3axsPANaHW0d+K3v6VKQO4dWcnBYyNfnCmBlndj15UYmvdLQVZXYXCAbDvSi53l78mgAvp6tvmI7ycB8vFRn4rC7Z0d8UzgaupqRsZLwDkzv5TIUDPRtu4pZzR/x9ttS/uo2IB5q++zRLVtCeAC/F3TemP0Fvzeym4EC8U3sW+Oa/B+37nEQDoFmu8ZrzdTlxV63fOfcsBAMDIT4LbAYC5ZvPd/8f+n1vebbmzALigAAAQwHHeYgTAdW6gdaFbBSKcajPz+Ekgi2VtdCuFUcG/XvOq0KvaX/LtBzg0FzbxQEo8IZXZxItGvw3ZH5eQQ0tmykBTWTCTZmJNLIkKSSU0YkCCXm33OCStrZMrQacrTnHJSMkVWjMprt2WUOdV1jUFdIKyYhLzf/dFofSrNUJPXZ0h23k0yS4yQ7itdzJmqjhwsrzqj+7MMqlnKY2qS+yyhGbcFLoA6XqJo95gFYoY6USEG+HNc6lmNUzcTbHsuFSqhFJgWYx5103ZxjzZymZTZ8QGj8RAxo2ShcMjb9pOU86KrQLkSLnRmOFGDjONFpx1CXp+s6dvOVx4h3IVL7nbxFUagep8f8S7NVocxKxEfnWDR6/hXkQ87T9Z9YNLZnCf9Dlmsfx8zbHCJMebeqYquSWXCc/YpjXvmnpUiazbSnKTQegpCAFh2s9hSjah52vufYbz9A+ryVFgrtCbZYzt0mfeGYLrgbJalzUNMqomgVWMVFks67y0EFM46+Y3I3DNNWVxTUwuiOvSaiYFqW2Ab7tDuU1RShGhKY6YnJTioazeKCeihEYwu6wmG9tUK49HpautZqJ1h+zsKPQcWAqIKVEnqsSSmJtqnhheK9M0WhgtmepO47uVyu7QWpqtDIeIjQmvctt4GOq3VGnMpi5Rs9OaD+OCoIJ9ijAlxEZ3q8K2cSvUZp3SmC0KHW3jbeojAD4qtIcFXFQPgB+g0B3g59viFAADqeUBeIDyWIQYj2NR/GIqMalKLI7FOYHJ8JDbG+VnZwxJhEixogQLFIRKghIFiqMigSxCBQ3lf2Jj4XzJMV2HhIZtGOJsxPx3x1+U6Iz5JTk2Ivg0hJqUYJ7IBqMJo7HA0wrlnUoclChnBYvwhxO5lcrUnXqV0epC08uiW50qEoH8CHRHjrfInPkG3P3JiRAlkIUK83VE+Guys6hlxhiJAQu2q5B9cEhhYPBIf8/JTwAA", + "ok": true, + "headers": [ + [ + "content-type", + "application/octet-stream" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6007/data/plugins_listing": { + "data": "eyJzY2FsYXJzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IHRydWUsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJzY2FsYXJzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1zY2FsYXItZGFzaGJvYXJkIn19LCAiY3VzdG9tX3NjYWxhcnMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJDdXN0b20gU2NhbGFycyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQifX0sICJpbWFnZXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJpbWFnZXMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWltYWdlLWRhc2hib2FyZCJ9fSwgImF1ZGlvIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiYXVkaW8iLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWF1ZGlvLWRhc2hib2FyZCJ9fSwgImRlYnVnZ2VyIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiZGVidWdnZXIiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWRlYnVnZ2VyLWRhc2hib2FyZCJ9fSwgImdyYXBocyI6IHsiZGlzYWJsZV9yZWxvYWQiOiB0cnVlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiZ3JhcGhzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1ncmFwaC1kYXNoYm9hcmQifX0sICJkaXN0cmlidXRpb25zIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiZGlzdHJpYnV0aW9ucyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZCJ9fSwgImhpc3RvZ3JhbXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJoaXN0b2dyYW1zIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1oaXN0b2dyYW0tZGFzaGJvYXJkIn19LCAidGV4dCI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogInRleHQiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLXRleHQtZGFzaGJvYXJkIn19LCAicHJfY3VydmVzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiUFIgQ3VydmVzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1wci1jdXJ2ZS1kYXNoYm9hcmQifX0sICJwcm9maWxlIjogeyJkaXNhYmxlX3JlbG9hZCI6IHRydWUsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJwcm9maWxlIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1wcm9maWxlLWRhc2hib2FyZCJ9fSwgImJlaG9sZGVyIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IHRydWUsICJ0YWJfbmFtZSI6ICJiZWhvbGRlciIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtYmVob2xkZXItZGFzaGJvYXJkIn19LCAid2hhdGlmIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiV2hhdC1JZiBUb29sIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1pbnRlcmFjdGl2ZS1pbmZlcmVuY2UtZGFzaGJvYXJkIn19LCAiaHBhcmFtcyI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogImhwYXJhbXMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWhwYXJhbXMtZGFzaGJvYXJkIn19LCAibWVzaCI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogIm1lc2giLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogIm1lc2gtZGFzaGJvYXJkIn19LCAicHJvamVjdG9yIjogeyJkaXNhYmxlX3JlbG9hZCI6IHRydWUsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJwcm9qZWN0b3IiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiSUZSQU1FIiwgIm1vZHVsZV9wYXRoIjogIi9kYXRhL3BsdWdpbi9wcm9qZWN0b3IvaW5kZXguanMifX19", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6007/font-roboto/oMMgfZMQthOryQo9n22dcuvvDin1pK8aKteLpeZ5c0A.woff2": { + "data": "d09GMgABAAAAACn8AA4AAAAAUjgAACmjAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGmQbmUAcg0oGYACGTBEMCu1810YLg14AATYCJAOHNgQgBYJ0ByAbL0RFB2LYOGCA7DduwB2DjQOQz3hJ9n+ZwI0hWB/YxYSYMBRSFENBsWqrAkWbJBHpUKamYBECLd7YUy2OVYvlKX1dMf05+T/7LtU4wMKUW3v6cz1MLF0FGyHJLEG01r/VMHufgpZJIoGKBHQMKsYkFpgU4tsDmtv9xsaIGoiNiIJRtJKSElLSIdGjQuiRIypl0JtBlKISJSqZZnH/Oq0ZWaYZyYoPCFpukb7+N+xuwk6iBRZMI8WdlLQH1F3R7l157zoCyXjA9AD36nWBrP07PZhwgBLSeMnLEQ4VqJsqlv8siGuabsED3LeKFnxrugO3hMah9NJJ/ipRkvNo0bWSH6xvN8TX2qedvrqte1s1/yDEW6dCUB4tkIxQEeoDTSYMiiaAuBEGJLK/dSEgoaIi0Ua4CGXj/7vX2aa3YewLW7L1Fw6EC+fgxB/7NWWpMKZaUyFMhaxEyArLmA7J/62Zdje5MjlgYyvcOTf7ZycwswkX9oD2CklKoSNIzN4VWFXVET5/gKgKaO9USZgKCaxcreurQxDS1KS6SqUxAJqz+B+OtbQOoul9mcsgjITAKKN32318dn4Bhdn5t38EFHq8pCEUmUMECIAIFw4RKRIiRgxEnDiIBEkQpSqgdDmAQKCAVcCaECAgAiDACvyk0ex3gJounDg3gOACJy4k2DnDicusvN3gBBrAILTCpecT3AAH9C0NYpDo+7rNUJuyf/BUQ/cM42KIV0v11FyNhkyiUDj0XDKjjuX1lEnr9K7FjMnEPpZVifqZhCWKr4SbqzTQwLYaKjSBrueqpWpPjRbN9WixjymuFFH/CwqFBhYDRux4XXDRJZfdwE+IMBGibhEnQYq021SoUqPpHm069BkyZsKMhXQZsmTrQkH1yGNPPNWtR68+/Z4b8cJLr0x66515C1atWbdh05Z9BxC3mkNDHAcJeFI4TeKEYI8bP9Y44ePEm77r41+ewEGxRUrtUWZUuIsOetH6bTJql3HbzKjlpPZkximHvICSPiqPeMwTngZTLZpmhlleMxe8ac9b3jHPAmuss8EmW8F2u3bYZS/Yb9vBNIRJvask5+7FELPwimHcaoZ46yTaJ9WCSTY0DsjmwGD82Y7DoWmOfu1MGuY6fi64i8JTF1OyuErRYMJBFtuDaaussAMsMLJnmS0vuQHreu+JDYwyxjgTDXPAYsWQxpkTT6ltykCFu+glcU3S4tKxymCyyA7etO0t75hnoWEGSu1TRoW76JHEG97yjnkWzo2mioUhQSbYYOmYZg2ss8EmWw1jsBYFTyY55CV9Yp999tlnP46GGajhpolWtE5hDEphgsHaYdbBBptsWWTntaOdq59hH5i0BI2pTbJ9tW44FNXel24XIjwwjRl9q3SNYW6MMqPqdvrNMVySVP2Trj0U3CvhlYipV1w9cpuCyIgMoYoJ6uAoNADzvug45Zj7yoBXfrjWup4FNpUP90w83Gjmo+puO/m8JAbcN3D4dUpCw6N96EFl/RgLIB76ETisxR/w6aPfR7D+NjfOfbeHOYYeHrwM6cPqaG0C4EDa+qeN8E9UN/umlSM27Cex9S8bW/9cmENaN4plychcK2z/rnfLbrbSThvtiLBzSrZHuO7Wmpvu9U1ldbZfCTb4hlrtIxcAHO5g65ppXrrnhMPC1kvnK5fWHKkuAKxYS2ygcV0rlvjEtGOxglUm6USA2od7bZ7ZA0zgcMNXu6Vq96DjVnaFuUnt8GvYm+2/bLjrmx9odH8OHtYJcBgN/b8kxzn07RsPkp7oNsv+PxY7vLXhbI0B2O6kbBr78YIaGQ9mNpD/ZDn01If3Bh8OOu7XP4HYqD7kLYGVOfcyTk47aKYl0X7mMjiMDjPg7M42er6j3/abnabFTbZeexnmm/4ZPQMO37lXsuKw1GmniQNWEawkgpUo+P+g8bqExlXC6NwiDU+RkuNUiKeoeU+7RxcXffIw9p5jytx58d4L0uW4KO/t67osuGHVFr1lzLkJFBG7OIqjOKlO+kwUPh53gWwuEnGJGNdJ7wYZ8JOTEBHC5HCLTMRIT5wnSPAYSbKSIiNpslAk1h3SUiqP+NULp2hOtdHQAdF0S1ofe7ErOh/EMyMdczKLF9olnjsqE3JyqeeOygFPyuNJXV4ExVMo3X9j06MfxnOvIEZNoDdJXkZT5mC98R7x1gKc1fs01mxBk9dJBzawOQ5sKDkp7MUhWOFQrjBRrvMoIaKIEOVmyUxYL3rQ4QjYwQIGsIZUnapA3GVBSAIaNA5ND0QYkJFRiSHMgAOcYxIJoiQSJek+IlUaTgrBBg6wgcNx6IRwArCCIg8o0IFB0e4sQGgD2sfstj0Yi/vtsrpEq52XqxUx7wXavU9R5AbVfbV1p6EDtGWnJA/XVOMRsvo8RlPdHad9NxBpoVtpYHLL0QrVHnveFe6uwPf/7jyBq5c52luBaALJx8pX+LgSQAvlHBSU/jQISHSdPDXyK0T8EDNBpjzkeaygcCLzJqgiKV9QtldXCkW9eOkpVFBLmWjZoyokvMYGYuM3q7LDGjTAj7sPXGsYBaVQYdkTHmY1/zyKJHrVqlSqUatOvQaNHgpOvOwmgbx4I2vWolWbdigIDqeB6phIgQHjoSEEYoO3GfWG+xmO9H2b14EtgH09CwceqakEMmDjtbHwH1ywyEvghjwO6F0GGbeagAYru65f6TdFf8NxEZpQA3bCjcYxgDMmoUrc/1DdhozZ9MEhMsFlbnKRv254PFwOt8PD8DLMhvlhdVifRh0CAEy4lSj1fMkew8Zt+fiWtyg/Gs6H67an546+N+CsD3294PDnwOcHM058+/z/7Vt/15TJ8MUb+x/6/XXxtmRzAC4jjHlHw5q/XvcP1+XZL9e/HyHSqDHjJkyKEm3KtBmzXpsTI/YX7U0Txdm2Y9eeffEOMAIAZPHeNcAFkH5MT6DhJhQar4QOSmnAxmukk4d0404Pg1C8IcIZ7jem0m8c6GKCWZ7xmjkieMMCoyyyRBTLbDDlbRLDFh94430klk98Z5Uf/ITIL/6x7f0n3jtUBxqZCCT4yEItBRI1aiOQrFEfAiSN+hJI8bmP1LFAqs99ri4F0n3ua3UrkKW5HwRyNfeLQJ7PPVUzgXzNPRco1NwrgSLNvRYo1jyHQ6BkqJuBg+pwqVfwfijyRYUwvQnHv6TWp0PyKigaNh96H4GBhmyOegPVB40f59xGEvqhc+sAD9WxCKjVXrZAVDdIs68AhHKCotyajCaMMM33GHhE96JFqxBPQEEEoqpC8iJOGGL05OS/t6P7dswwoetDgYYOgzlyg98MT+zFf0ajcoEikxZ3w24atFBdBAG0lP/g72LZuroeHO2D0lGazKLkzmMauyiDCdhr2a5txrOVjSChgd2ova0t77MhhbcusVxATqdNzYG/FtlUbXRQPRO4OeZ3jE2LIpfa374QSXm/jXcJ1RlLGxZ+dBY1t4Brn0S4YIb5A885pd4Nm4nTxHTsncPU/uJFsrvfCo55+xh0RpRwlNVFmRZ5JT0a8vqz7YKjXITu0NETuTeLgWx0wlG1ZKwnE8zEIEPVAl29KW8grf5KvdJSAaHPwFwMFyKZcNGCzUM5o39uRYwWpCG2syOpPpQYJcOaFn+YiakAyoJBWW1PdQ3gky5Lyrv1Qu08YS8gSdFMp6Xw8V//1cwtjV/OeuogqHw10Ysw1TOlp8shZnahTTWfy4ZZH3Bv01/rq0FPiwuORTUH3Rr39SnJaRmeqQkMhbRqn4TlQFNuBzh2XJgnuDqHspyu0HjUXsMzfPUKBo4oQFl/59ra8oQdbCz13uBAOQ+7IIF6czUJA1lU66Bw5NYfWV31oNN7ypngGeWsuTqsEsrhFQEqG1WQZkIcz5vH8rsZjFklUsoKdqUiEv68IaVRHWA1ltQdWoR4IBbvBaMNWXDw7xohT2WjEINN7BucggQF7qiNneY8xhDhaJpbjN+TprJdqRJ68eUpZ5QTOoqiy71R/rGSuGKW/zv5f6bK+V+XqNf9bxu3tMVwufyHCz+PSnKjrh9+fWXoqLsUjumye4LFDWIi7dtumjw+brjklOBI+ScdTjXMTJQ4+jRhyjVAOkeCkt30cx/S2Z8qaXHhEDOrpWN7sCJd6FjeIVEmfARcWahxPLsI1sVRRvQyvF1z0BOqq/mw7dXZ5YiDWzSTRl1gQmV52yFfjGnz20KQxu571VcjSo6/lSSUtDza2mZJtR3ssJefgx5bpVWyM8HDYK/wkP5JPnL6UqVarauNUmfRkTOho3FTlGoP6PIFDRtZeBq6BcMRkGuIiNY4MYmDV0ujHNQz+aSb3NheHTbPCEeU8Mg3wvEIObtW60VLwLt7tL9LwT6HZUmRTfWEN7twFXImIwjFDI64QVhZ3NhBFt8eBbxHMZ8CaIe7H1C8xvXMdyxLPb6VIsSjjQ5Tu6SCqgAr05exOiWSIOmZeqYl2yAKsJ4IfFNStZo5LrDOMVUi2QHIrmqZ8dR/Sd8CWKfN1Wr8Mskb5eGEuUnILSj6pq4YSmagxspkGt6pTX8GqCojM8mUjwKb6kdQiWqQsEttHrQP39bBMb/jp+WMbYfEKRvFj3/DjHhrj/gV5E+5wKkhbQbvSCZBg9oF+S042qt+KCNAGgjS24pSDB1vg0HdlcYmpwORmpccTd0pV+zgEtazSNPfQ0pIHnElz5rKRywGsg04LtCsfnVCrglVCXW2UwSoJrdok1FMXuGCi+3BkEsTB73xIylxRo9pfLYQYxLuUC1A6WAXzk0miNkeiw1OG6sUC1JVAcxx+9QSh5gpb4ljMlXlQ8qQQ3dgkoicYMp93+rZewvB1cgE6qFuCI/w2OaxiJkb+/Jx6REGfgqeugr5MzGoCXlAhbvvgpRRatUGSqa0aT40UTVEIniStK2KkQNSWnadTS44MC0ZcShqn/tNbjSpzhJPWqmVtdIahqMy4JIurfISwFqdDknlN/ZkJWaJOfPmu0hCIViLEiCXeDo1fx31S8zs39RXB2funyM/h/4qJvzk1FE1AlLSBoRckNzDUC2Vie0A3dVydpP2+nlQlXWLmsM6kpxf2qNAnzxXE9I8zbaSdNBbUmBp9qN4v7SdxKEPSQw7OPKYqmGDHU1G25UrXOzQT8UESQ8gg7ZI7KplJNU1l8Ei8eqUd9TGu/Hq7MDh3qFLtVYpmTYB1RVu8jGGn+HIKixbp7pl08klbTB60qEpikY9sjLo9EaglvU96Bz3EvfEcLRjtkf+1rba2RopIJY4orU7uObY3Y9SlGnOR8UZRdWYYRWrEpkS6FgkfdvN4lxqew4RQe5mP6W+wnEkhvXYbXxIZd2qOGV+DxkBE9TT6D3p7Zq2VzJUAseOmluQLiocOOkAKDVWaXR015dYYhhgYrCcD6ml8QGDF/GOWXf4pN3DFIOvh2olo92vyup7stXa0MvaZcUB90LXMpfiqT0HdGwvKlR7KYetkJMa2zJ/eArTc+pPLwuQVoRD7jxII8nWDhElbFkfTa6MUhEyZ1g5yvyhBBlM5pzxUDZLT/37WD/EMrpTwTbt4IhlG7ZotGO0+OI4aZ8Go5MwWJcz21FJpnoSIFY/ccFOPVCPGOEsSkbF/PQIj5jGOrVbVnfwRTqNq6nNasQEQSYH7oLXLiW31UgXpk8J44vqKc0GKe+BUadt3wUGAkJHB7zFtQeGQxccdSieReslSPWf21E+PxPTi3gAyczhLgUOemFaBT28Nb0szb2eFfH0QV74/FTUWTUSxGVUnmvtGSxEF+eUJztVfeYpr5KlNEbYbqQ/w8UBwJAH0HamgKFli1D0/cDgt1aKRsyIiBkajPOqYfpIH2OmzjUXl2DjQBcnYNPzP23nDgeJTLHZjvA3F6eZS+qL+hBHp2CFSjh9r5hEHI5LWf8yYeu+fiXuj2dEpxTy4BSscCAS7mcaFpIjOC3TN15a8XSiiv1d5nw1J3XvVVdSdCXBLyTQ7X6UP791na9WoVPtyKsOfHdGN4V1cnOIkpCaGROZGQLYjJzIqtrI6Io6olJUVVV4RG1VQhxWw8BWVUnfSk9FQ88uQ89O+1zrjciqGmx1dYKSoDTFEzCaH0DKetZ6qpr6NipKhta6Pz/vyl71JjjIgm2Mo3dThbeljyxJqar/UU1W/8NoQ8MMt3tOGvIR8uHF1YdJ9djPRUuCiuyQgv0MsjKrmh7gbl1DWxUY4ZuThDq3YelD8tGWvyGgLy1vY6imbeEGLDOpHO7hsJgJURqr/sUfdMIUeQNS3akvcKdANyLxpG6ttwWvR5SKf+OeDogqLHnnfDSKVObzyPWhfkSuc08aOBScttLk84hUfq/nmw8c5a+vGV3LuuaOM8ilM73oei1b0HiQOciMcqb1WLAxXFpjymrKekl9Wf4AqqVC9FkHJbMIdHx1e6qd9XNg5NrO3gaSJT+J0MR/vZGQBOTgYj7stSKQKXNVXJDY31kSRgv+kF24ebC3cBUl1sW4FzlLSg6fQRYu7hOXE+KiplBr8IY64U2sYRs6DULU6B833EN1i/QIcale8TkFiZTnqB9vXuxNN79muxhd9Q6O2QgmRCCZ0QQ4jJKJnpTGv+v9oztv+iwCmx2v+PFGND0YOBw/gIUOqldmXGhMUkLkg/zYNCQBblntjGSPaFO1s10v9n8avPBleHDEAF69UZnZrVe/kugkTRzewS6vfEa97f0yw/q4iTWYFOobntaUn1ZEjgpQEKYF4W/NhTyv0Yd/jpcJkcNPVxmmV74yjU6gZf4ppenXaNNMkCyKPbn0FNpK3wWEJHdmZqV0gZyeMm+7ch9v5jGOnDmQHhB2JdRa3fDkj3rk9+T/0vjk3+XHvmFPPPktb7jXunTtve7t2X9N52URmJf7Oyv7Z1pSZER6MpvtCdeYGG/3KOJiemfEJYDQapiYQomOZSg1yG6ZmOa28yKIOPdT7qhorWaMNs35ggvr6G+bbL/MCjzP6ah2FK4FBKZTczOTe4A20vPvgNDZoDTV5MABkCq/LlcqJyNXIgcCLfEZqKciVoFpdFmDesA2F/EViFPTiYjRMXd1dPV1vB/kbEJBSleHOp5MjjQ3lda6OCtr5fRIdt1PHpfS7wyfXh9tfyRcLaIbr62anLqFf8lc4Y96mu5478FlTWmhS/jNdM+EJUwrPupOtsbzm0OtfvTfGH6QXPh6JozbrrScJ8y+FHD8bb/cUsVwggG/0BH0/sMvm6XGSpkVD6YkrWxDSTe7c+a4a9+DZXxyDkByItiaGDTEM0iu4ZkhD7Yc//CjBmoBQ54/eN/fc9+rwOayDzexK2zg39L2rRpGqZi8+EBartu5PKFZIS7+CS6kU6AePnpik+v3e5Sop2jiixQhuoqm7aMozvXeY41V+Vld4yx/kg4Gj7aU1KWcbDU7WvOfnqsuEoFnZqNFInyV/QiTCN5nZPE7+yH+3MbPICCNKvWjWSgsBAw5vWhq2g8k+yJtInsAQ44pGvpsA+o93SqOOAdyC3tVlhAy8kBF0JFz/cg210yPCDdP7xAzQPhtibvbpfSGstK9AlbQCoPe0sXS0v49hEVCL/h99hL428m9tBO/9ybefFp41hNCTIjwS8uEGDhR0dy1v7/a8ZixbckIvvJrm+BY0FLoZabrhRNHyKcHKnr6S5R8k83m9Hp++unpHLzlzRK4Kve1aWvrXsVreu2rvX03aKXVzpKkaavJDXQ1abeQV46TqbL0dQ1N9DUkmZmnCHqM41HHOAfqm/OfSS4K9QUz6i84iIkjPTGOf2D+8nwat/5Dv8AorzwlLqI8PxllC1r42qlofn899IsIf8EvSmxaRteT6WtFppluQF5yPm0H5ff4GW+Z9FRNX92p9/Tqd9zSLDHteYSAniPjaOrOBVJNenBsCSkb+ECP+P3O8mhOA355PmvXK+xFQG9UdVZuclGwu1FWoJPdy0Drcvdm9umtLDQhcfhBb1RfTnlOadBspjeo+OCnAYPvBgx+qug+qFaSF+EVYN6xnP1wEkFWlp++LWp8WFre0Fj0DuL/n6Bpnjw7SK47206egNWRk90XG/Don2Vs6T8vNHH1M59b7+U8Qm7CD/ByunG6sXvzNnHWWfcvykeYXlt9MTG7sG530/7m2uuFlxMrYDsd9PbtGZvUMz1npmGdh1sFsoXnUwTWI9iKfiQBd/t2N2CJ3TkBQNsVAKhoMpkPe40M8E5YoCEH5vQGfmL1womKR09WGi7PPrg0Ww9iYdkZ2RlwuuJtMcK7BBcPd0eHRbeWvGxLqAXqTpuelRfB0ybaRol6j5A1YOD7aIqKLv+cyWvA+jXRIN+IR2kxVXfYwMsK5FBsP9eu9rxyT8EF1wEWKFLu8fHLl9BdNE9SX8V1atZO69a2Rae/AqkIm3Q/WqMmGlOf6gEbtwUaPjhT5PVtLjaj4+Mb2sYmWofkGMekvJGec49yn4M576+9691P3cKFKYCFOpyXW+zQ432hn13YruyxGLJW4SftnAZi9gSosc+zc3/mKQ38O58cPrVzBK2+gC5uGYi3jtUUlPUwiB3He414ZJexpXEx0ybG5sFWfT2p3v0h5UmdzDJd5raIsZWDNWGLtFUPFrz/di73Drkl4PxquSd/fvrZZ8lGXN/CzTetITYrO97M7UHP010ByufOzPHYpntF73Xz6mKzJ4BDpzMwa9AAFfGC8hK8HdzdjWMteNXRFMACBfQo4pRhrmuuLiHGQS7OwNEm3nnrpJRAxg9haRk5nUd4rqtuIqKZvwlQvnr5B2uUXmrtq2WzUtE/4/MG9JI3MrBXiNP4+SaMrN1rFFFvsPC1xfjPUEa8HQkh9rGB9Paj1MH9rQ65PE6KOLC3iWNig/KfOSOIf67GfMXB/xbjSAusAv+Zivx/LyekzbMK/KXg2qreJCZVzg+31MwnxlW/AdlVth8r13oHPYLpKIB5W4vz80h43r/Ki+1Cd+ZPEWt0MjDa6fXRBZNgznu4PjDY4xZG61IHmLcUGnc/6sA2/98uWmrBVHSlfireILkspnAaLnllZAl0yOQBRbwNFWycUi36BPjPnrnroX1MokJHw0srermzqWv9SQZVLczV2s7TQEneUZ5Dql5P298gdeshJWLYxKPCkkJjGu9CcAzVhWM+MtgR0kixrIiMLHdQljK7YnBIZnzxIGkQC4Jhzs6hE41tz2Cgh/Lo+7NpxUJ2ijgZPv5e6b/95JiCeNKxKPEnoFBy6JYEhb1NPIvVS5gVLZzFXiHexaRzmaX/ciZ8f/ghfs6K04Vn9lfGr4zXLjxWnLNwwMzSf2XopPCKLdM8jwJjFru5w92zthddj52/PgJiWQHZJkReneNqucKR4OdKFmhZfzz8ZTp1+vM40vFwuUWQlzAud2JkrcqwymhjFIV/JQvyTJmAfZoJ+N8jMli6+a02nbZ7Oy9OjMvxEsgCzcvQNflhOnX6y8jjtpWHAqDxha6IOhen/EC4Jl3l3GUNHSfzEqSk81WCWsLtppJfvWrmXhZQW18D0xx9jJlqUfd4qETYpvvTGjZhQgafkY7vUHZbzg6fnD83/fwUmXuVspTJ2T2FyWx/XN5I63GlfZcnZbwABbhCdX+BCMQCRztfWViCQw9/PXj2dGGquds5NMjdMTw3BIe+XQgKHz2KIifGisKjY8Nj4hPt80dG3cvSssJj0zIL/foHivwzsiOJWbmuZS8G7IqSSZGx4qigIMJUf8Bqf6DHZNCww4C/h2e/370LcLb1uFDWjNsYJkShUiFYQa5XTjpYulI6hJZG+RykMR2lHn1G/U4FpdSmJxRdBX6lWNsa9NC6x7ObirfiPV5RkIjWrAJipbelUZLDuFT7jW430zx3aruBLP+dWNsq+uHFbfTKK0pIdV5CcgnBWvGmZowMl2aNkoelWBhXndFR1ROaeFVbxTsimlGyJ++R1dl1bBUN410Aq2cyj4Fgrmu8HNb/FBQ/6+U2lBQVPp7scCM/ncwvqS/PTLMx1zUxd44L8vR3jjM3NdWx+x/ZUHweXynDVll8vqGu8Cy+qrSEvaLoHKF2hGqkOhSmMkQ1GhlsNVAdHxpUHW03AMeeZr27emF+4UH27lV+DS7CscGKGiJCJQz29eFx0bnJMZJWx7VMAq8YXKAme2iDobSQOUis+FFx0aW3wWgO0UEYcqC8klL2moKzDfUF3Ozpp1v3V+2kexy5NREhQQ9kAgQgV0ofw5o6ReFmsSCgmx4UKCEGsqIq6pK28SC4wVlCKgHc+R6HjHwnh7Q8R6e0TAfHzMz/R0RV7oiJq6iK3lTVcFFVgYvp+i7ZLkXVReHZ4YXVHBxf5HPkoS7PwOXKcRc7RYG/knfv3BUrJFSl43JD3RycnHQ0mlJIwJpxX1dVSZL/2s4dMVXBS4XWZYHBcfn+DjcVjWWPZVwkOdUGE6MqQ5yLrmlIyN9RlhDyzEcMgX0Ilhl4M+GIsHgAlN3P9x6WyuamilfjCKYxdelayjMUwLyFGJzuJu7f7Azd/00mwJAhbe73yGi98ZCQDKdbc06kWRV7kLBOmvpCN67+ssKdiYb3eYVGr2+FWXvjgbbCpuhRX17+o54q1WJqr/CT3soyjK2lp66OOcFOw8bSU+eehStiCXerwfFiqIVPZw+9NYerF8HVNtjDhIKULL/oHJh51tpY/NDFQ1Y9rUcyfuzXrqbD6OMBXsyWwi8tV29iyJ05reyzGtnKR/C9emz+z7jmwVBZRVNJwzdQWUN5mq+koaJpVdXq8iy6yqyPuGeZl0zafNLtoDNDavVsevD9iqSi/0QqwislY/PVKvGcPNHOrWoRVqaAFlPHzQgeHU/j2wGzsc9NTgyZ92j6Owff3tA+2s01vBgVMGTKY54jycVZ/kHFWbEAz1AMxkd3qW0DLcUhD0YUhVTNH5H0YtWKR5o77rVdMbmcxxJzRcTZw0xbWMXicZp+3D2j+FFdc3snw7e8oLHMgYltldFbMUuqftSQXbjauLCk5+wa6OCY4HqvE0/61PbIq0lbQFtao1HfcXILdrzmsE2NTzMz/O++vx1b6H/bI0u5UOXIwbo3kuCqo+5oKoIW9sqoY40/cSYqOg2EFI/8pM01K/L++5oUE/suzH8pJt19ezQ8vNzf80ZfYuKbdGXr7ohI4w7+W0XvRR7GPw5TtsFGMh1ljFc2TS19Wp1Y1R8WkrPSBXKThptdmxZiMZHcSEhC/WAVfhwwcr7SgX+X40luZpeU04PtXvblyhQF/Vsipjjo8ahkBNuMvMzoEu2zdNNvX1KOr35j19ah76bT5CCXUPWWAnKE0fTiaUsooh6RfbKHelRxKnikgFYzB6HsX2YCM9SJNMSz/ssqC65lv/Nj4Uuu0I9mQUnmpKcdU7ILs0tj7zoyKjbVtwuWfCX+/94Sk+OeeUvayNj1EzzGdv7teY9ia8sHYh77OauEECO/xb50l7aRsh7yiJmnvfG/C9dZ/Dohrnh2tKNkLj62dEZufNYms+xIHPOJEGIm8Nu+p8/NrM2ozWX8xuIBPD5hBkHeJqaBPg2BAV2BAap6N+TkBfjlZa3lFAQEZRVBaGPeJTDa9FKrpVTDqUtFAkFYZ/8Es3NeFmJnz1y5JX8NWDfZHZVMQ1FpxC7v+5bDQJfB6aBkGo4ipXRGgI3lECSecFA2DkWl+lJs7ayfQ+JVByVjIiqHQqlwsZ6cv50bQmqFs+U44MppDNzcTU08Xcx4DVxdzc3c3AzhNC+SmMQXyc4XlQTMXu2zkGVMRpKQZChztf9XC2d/bUXwp8PQfa0Tld52Z9mL/U77/zx1HsPQEtwS1xLSQoc5xfXFKYaLvdSFx62CPIJ59CAkLC4MpFsS5LPlYWTu2FLT9tHnTzzqJLnygwU8/RycnM0XSAv1Ko2WUQhjE8Su9mzSeT5JKQc+HL7Q0N3ZbHdZEjBzlLlngRRjHMHL0cV8kbT46iml1KdRxEuEMJrPJpQ6HKgfYi0ferUX0wUKZdmNSQn59VCcXJ7XmJCUXY8UFGB74qPRra19CVHoNsCNDMfvAs3LzhHOtYW1fhg7f0xp0M7SWQZwjxBIXYwyO7JVVStzSjUsmRgQXJwSE1AVgrF9mM76elklVQVpdTVVlTrguZFrzMYI54dKhxF8Y1L8vItyoxKqKrOFflz46uUOuVPolSssPMdp696WUtcIvnMXKp40pVaZpg1GBBC/j6+vaLz42KnYn7Uv2klOxfL31Tv42mf5hISqKoiDwupi0rdVxYRF7oqF4k2b8OHmOv/1LY/vTvvDtz33k7HzTYwLDSgrDo/Lr0Cl7/5RIvvag6xIq8BC80t3JHU0NCUl7urIy6qow/BDX2R/8eCH/sKLD/7dvqB0/Tw9bdbyF/8BbA7/B8ACfv5RXi4s/FISFuuq3TPy/xld+aEw/7/MKFgNXAXhBB65quZ3mSNchXEMzjWjNmffEVy77YdFatbn0cri6o3s6doSBL/VEMh8d5R8AGqv7OXj7Ca4f4GMTaYvg+n0kAfMWAUnGXGbq5WubLETFC6/WIYgF1AL8uFFVasHdK2u0/W6QTfiIbHA5gvygmuF4A/RnOkT3Way54spBkO81cmv3dOk0ApZXJgOiMn5By5dK/gTcmD6RLyZLGPEyQCumQpztelDxEyeZUacZg8r6CL+WCHfqB23tFDzijCT7c2n2ArJAFtxcrcVQzi4EqKJ6RNUM9nAiJOvVkoJxLqiODYDRAJrtvBsknxFNpJyCU2M1VykPk3yDYNVohi3tQoHgVZp6OZCZDnjOkFDskq4nijcegh9PuvE5JKvQ50g+jd1bdeqZ1sdixjTOjCv6diLvkJ1nJdYR4410sawNoJ+zUjOShINpFgzFZyEmXM6HtqB8mpjAeduDMj/r/PZkuf+D7hl/haureDS0u+otzR8X3bZVuu5csq/2umBcedopEW8gHvF349HyjOhk4pHKvnj+bNyaIF8NLGTbM6MmQDumb/1qAmimZ+PBplWJmXh6LqSU9bIxFQDfVc/Ooi7qETTFD9xKpmamfyj8OaZZEJ1OAXGegvRs0KesdMf8OOk8lvar+fGgFrQByzkYE7awz8Q118VeWAeDX/e4QBmRp+xoE2+m7GMlofvvD/oaG9B4fka2H8Se6HrFqJLTH+wgH5KKNfdqN0JIDb2+w0mUSZMl/ar/dZgRnxZN8SfnmUeAnHhOHQfyB3h9xrb8lTF+40BiaA+G/tMsBstPAFki2qMQUS/5tcNCQScSy8XOQVfxRiEALnJ2ldCUowtWCR/bx1fBoCnf+puD8A7of3bP+v8X7X5l3kBy6EAAiwuW1oFsPzgUpZe2gHEfVPfVyJbQ+Pfi3eaa0BJkhD7gF+HchvzHPsXu7Bjn49F5zN8RXCq42hEmtMpgjdPSik1+KfGC9Rhhjki5BGFOh7P2jY+iolml5qNctvK6etiatjdxQ1O45ZT/UftEOE3bqvtRDIu1wZeAkdbRF7T2U5EBo1LadSY/qpN8LQwvoPx7dm69oGa7qbVQwQGv8Rx1KnFcVKDBsR6FEuP0M8z0krZRXo2dGVIpgrQZACxNubaIRKbn2lHsmgpZjlM0jyXZTtIjE+SYmfuBjMu9EnBAg0J7SSxU5jouEQW2Q64r7UQXTsi1rKzExqu1A+X6jlOatkw28nEF02OfXiKPKIS2pJjVzEZbbh3ISyxJ723GZchu0mFSaVLr173282DSdX1rOok5z8RfYdVfiCXH0hnhKAmyqsd8skpPf7wplGBVT7cT4/7Y57eJEJrEuNezyksAufPrcCIunfeVFXdJ2HqpdFkoZ1KqYlMukBm/Ja/KOWwUGBVA2qzUUANCRoyyqbbUiKXJc7FH9nO5zSHfEcye4+oFvHDWEbe54KHMapyEvmBaIey6DQ17eZMJ5Ccps8yPphAoIU0opigjziaqITS2h0IHAZOJg0ztFwK+wTcwrzSCwDrvIzxyBPmHfMMp0JDJH6JwCfgTFgBHAL+5BPz43dD42VNaMz8iDuhIZIjIvBGKEtHgB+QcNKFyZXG6iChNoVd1bfMfWhI0wE4A1wvQzAyX4bCzEmN3qWmgWUYfPyXYZ1S1F1muqjkufMQgMCRPQfeuAniJ9At5KbEXeAZLuxWVeHGxnWjrMG7WLQ1mFfOaLe47BD4atnWdUN2Z13y3lDgbc+HC6sgr7+IwIsjc7PHX98u5CYJ6wVv6hZ2bQUWvb15EHej0/q5rrPikXjbcGDnOhsJmr8hO7LRvBu4V/sNalTIU6RBh6Jrts38i4GTzfts3QMAAAA=", + "ok": true, + "headers": [ + [ + "content-type", + "application/octet-stream" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6007/data/runs": { + "data": "WyIyMDIwMDMzMS0wNjQ3MTkvdGVzdCIsICIyMDIwMDMzMS0wNjQ3MTkvdHJhaW4iXQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6007/data/experiments": { + "data": "W10=", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6007/data/environment": { + "data": "eyJkYXRhX2xvY2F0aW9uIjogImxvZ3MvZ3JhZGllbnRfdGFwZSIsICJ3aW5kb3dfdGl0bGUiOiAiIn0=", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6007/data/plugin/scalars/tags": { + "data": "eyIyMDIwMDMzMS0wNjQ3MTkvdGVzdCI6IHsibG9zcyI6IHsiZGlzcGxheU5hbWUiOiAiIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAiYWNjdXJhY3kiOiB7ImRpc3BsYXlOYW1lIjogIiIsICJkZXNjcmlwdGlvbiI6ICIifX0sICIyMDIwMDMzMS0wNjQ3MTkvdHJhaW4iOiB7Imxvc3MiOiB7ImRpc3BsYXlOYW1lIjogIiIsICJkZXNjcmlwdGlvbiI6ICIifSwgImFjY3VyYWN5IjogeyJkaXNwbGF5TmFtZSI6ICIiLCAiZGVzY3JpcHRpb24iOiAiIn19fQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6007/data/plugin/scalars/scalars?tag=accuracy&run=20200331-064719%2Ftest": { + "data": "W1sxNTg1NjM3MjUyLjQ0NTExNiwgMCwgMC45Njc3MDAwMDQ1Nzc2MzY3XSwgWzE1ODU2MzcyNjQuNjIxMDYyLCAxLCAwLjk3MTg5OTk4NjI2NzA4OThdLCBbMTU4NTYzNzI3Ni43MzA4MjYsIDIsIDAuOTc0OTAwMDA3MjQ3OTI0OF0sIFsxNTg1NjM3Mjg4LjczMDk3NCwgMywgMC45Nzg2MDAwMjUxNzcwMDJdLCBbMTU4NTYzNzMwMC41OTI0NjMsIDQsIDAuOTgwMDAwMDE5MDczNDg2M11d", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6007/data/plugin/scalars/scalars?tag=accuracy&run=20200331-064719%2Ftrain": { + "data": "W1sxNTg1NjM3MjUxLjU2NjQ0MSwgMCwgMC45Mjg1ODMzMjM5NTU1MzU5XSwgWzE1ODU2MzcyNjMuNzcwMjkxLCAxLCAwLjk2OTIwMDAxNTA2ODA1NDJdLCBbMTU4NTYzNzI3NS44NTkzMSwgMiwgMC45Nzc5MTY2NTc5MjQ2NTIxXSwgWzE1ODU2MzcyODcuODQ0Mjg0LCAzLCAwLjk4MjczMzMwOTI2ODk1MTRdLCBbMTU4NTYzNzI5OS43MzY0MjUsIDQsIDAuOTg2MzMzMzEwNjA0MDk1NV1d", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6007/data/plugin/scalars/scalars?tag=loss&run=20200331-064719%2Ftrain": { + "data": "W1sxNTg1NjM3MjUxLjU2NTkxOSwgMCwgMC4yNDY3OTA4MTE0MTk0ODddLCBbMTU4NTYzNzI2My43Njk4MjUsIDEsIDAuMTAzNTkzNzE0NTM1MjM2MzZdLCBbMTU4NTYzNzI3NS44NTg4MSwgMiwgMC4wNzE5OTA4OTk3NDE2NDk2M10sIFsxNTg1NjM3Mjg3Ljg0MzgwMiwgMywgMC4wNTQ4MDI3ODY1NTg4NjY1XSwgWzE1ODU2MzcyOTkuNzM1OTQsIDQsIDAuMDQzMDI4OTg0MjE4ODM1ODNdXQ==", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + }, + "https://localhost:6007/data/plugin/scalars/scalars?tag=loss&run=20200331-064719%2Ftest": { + "data": "W1sxNTg1NjM3MjUyLjQ0NDU3MywgMCwgMC4xMDk0OTk2MzMzMTIyMjUzNF0sIFsxNTg1NjM3MjY0LjYyMDU0MiwgMSwgMC4wODYzNjIyMDU0NDU3NjY0NV0sIFsxNTg1NjM3Mjc2LjczMDMyMiwgMiwgMC4wODA0MTg4NDAwNTA2OTczM10sIFsxNTg1NjM3Mjg4LjczMDQ0NSwgMywgMC4wNjY1MzU2MzY3ODI2NDYxOF0sIFsxNTg1NjM3MzAwLjU5MTk2NywgNCwgMC4wNjY0NTM1NTM3MzYyMDk4N11d", + "ok": true, + "headers": [ + [ + "content-type", + "application/json" + ] + ], + "status": 200, + "status_text": "" + } + }, + "base_uri": "https://localhost:8080/", + "height": 821 + }, + "outputId": "3dbb4d86-3438-4ac1-800b-0119cb47be5d" }, - "cell_type": "code", "source": [ "%tensorboard --logdir logs/gradient_tape" ], - "execution_count": 0, - "outputs": [] + "execution_count": 15, + "outputs": [ + { + "output_type": "display_data", + "data": { + "application/javascript": [ + "\n", + " (async () => {\n", + " const url = await google.colab.kernel.proxyPort(6007, {\"cache\": true});\n", + " const iframe = document.createElement('iframe');\n", + " iframe.src = url;\n", + " iframe.setAttribute('width', '100%');\n", + " iframe.setAttribute('height', '800');\n", + " iframe.setAttribute('frameborder', 0);\n", + " document.body.appendChild(iframe);\n", + " })();\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + } + ] }, { + "cell_type": "markdown", "metadata": { "id": "NVpnilhEgQXk", "colab_type": "text" }, - "cell_type": "markdown", "source": [ "" ] }, { + "cell_type": "markdown", "metadata": { "id": "ozbwXgPIkCKV", "colab_type": "text" }, - "cell_type": "markdown", "source": [ "That's it! You have now seen how to use TensorBoard both through the Keras callback and through `tf.summary` for more custom scenarios. " ] } ] -} +} \ No newline at end of file